From 5d95618c2123657ec2623618f44198e123728792 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 23 Dec 2017 10:40:46 -0500 Subject: Decompile unref_sub_8095A48 and fail to decompile sub_8095904 --- src/unk_text_8095904.c | 266 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 src/unk_text_8095904.c (limited to 'src') diff --git a/src/unk_text_8095904.c b/src/unk_text_8095904.c new file mode 100644 index 000000000..bd6e78945 --- /dev/null +++ b/src/unk_text_8095904.c @@ -0,0 +1,266 @@ +#include "global.h" +#include "text.h" +#include "string_util.h" + +// static types + +// static declarations + +// rodata + +extern const u8 gFont3LatinGlyphs[]; + +// text + +#ifdef NONMATCHING +void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer) +{ + u16 strlen = StringLength(src); + if (bgOverride == 0) + { + u16 i; + for (i = 0; i < strlen; i++) + { + const u8 *glyphs = gFont3LatinGlyphs + ((src[i] & 0xfff0) << 6) + ((src[i] & 0xf) << 5); + CpuCopy16(glyphs, dest, 32); + CpuCopy16(glyphs + 0x200, dest + width, 32); + dest += 32; + } + } + else + { + u16 i; // sp18 + u16 r9 = 0; + u8 bgHi = bg << 4; + u16 size = strlen * 32; + for (i = 0; i < 2; i++) + { + u16 j; + for (j = 0; j < strlen; j++) // r5 + { + const u8 *glyphs = gFont3LatinGlyphs + (i * 0x200) + ((src[j] & 0xfff0) << 6) + ((src[j] & 0xf) << 5); + + u16 k; // r6 + for (k = 0; k < 32; k++) + { + u8 r3 = *glyphs & 0xf0; + u8 r2 = *glyphs & 0x0f; + if (r3 == 0) + { + r3 = bgHi; + } + if (r2 == 0) + { + r2 = bg; + } + buffer[r9++] = r3 | r2; + glyphs++; + } + } + CpuCopy16(buffer, dest, size); + dest += width; + r9 = 0; + } + } +} +#else +__attribute__((naked)) void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x1C\n" + "\tstr r0, [sp]\n" + "\tadds r7, r1, 0\n" + "\tadds r4, r2, 0\n" + "\tldr r0, [sp, 0x3C]\n" + "\tlsls r4, 24\n" + "\tlsrs r4, 24\n" + "\tlsls r3, 16\n" + "\tlsrs r3, 16\n" + "\tstr r3, [sp, 0x4]\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tstr r0, [sp, 0x8]\n" + "\tldr r0, [sp]\n" + "\tbl StringLength\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r8, r0\n" + "\tcmp r4, 0\n" + "\tbne _08095988\n" + "\tmovs r5, 0\n" + "\tcmp r5, r8\n" + "\tbcs _08095A2E\n" + "_0809593E:\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, r5\n" + "\tldrb r2, [r0]\n" + "\tldr r0, _08095980 @ =0x0000fff0\n" + "\tands r0, r2\n" + "\tlsls r0, 6\n" + "\tmovs r1, 0xF\n" + "\tands r2, r1\n" + "\tlsls r2, 5\n" + "\tadds r0, r2\n" + "\tldr r1, _08095984 @ =gFont3LatinGlyphs\n" + "\tadds r4, r0, r1\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r7, 0\n" + "\tmovs r2, 0x10\n" + "\tbl CpuSet\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 2\n" + "\tadds r0, r4, r2\n" + "\tldr r3, [sp, 0x4]\n" + "\tadds r1, r7, r3\n" + "\tmovs r2, 0x10\n" + "\tbl CpuSet\n" + "\tadds r7, 0x20\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, r8\n" + "\tbcc _0809593E\n" + "\tb _08095A2E\n" + "\t.align 2, 0\n" + "_08095980: .4byte 0x0000fff0\n" + "_08095984: .4byte gFont3LatinGlyphs\n" + "_08095988:\n" + "\tmovs r0, 0\n" + "\tmov r9, r0\n" + "\tldr r1, [sp, 0x8]\n" + "\tlsls r0, r1, 28\n" + "\tlsrs r0, 24\n" + "\tstr r0, [sp, 0xC]\n" + "\tmov r2, r8\n" + "\tlsls r0, r2, 21\n" + "\tmovs r1, 0\n" + "\tlsrs r0, 1\n" + "\tstr r0, [sp, 0x10]\n" + "_0809599E:\n" + "\tmovs r5, 0\n" + "\tldr r3, [sp, 0x4]\n" + "\tadds r3, r7, r3\n" + "\tstr r3, [sp, 0x14]\n" + "\tadds r0, r1, 0x1\n" + "\tstr r0, [sp, 0x18]\n" + "\tcmp r5, r8\n" + "\tbcs _08095A12\n" + "\tmovs r2, 0xF\n" + "\tmov r12, r2\n" + "\tlsls r1, 9\n" + "\tldr r0, _08095A40 @ =gFont3LatinGlyphs\n" + "\tadds r1, r0\n" + "\tmov r10, r1\n" + "_080959BA:\n" + "\tldr r3, [sp]\n" + "\tadds r0, r3, r5\n" + "\tldrb r1, [r0]\n" + "\tldr r0, _08095A44 @ =0x0000fff0\n" + "\tands r0, r1\n" + "\tlsls r0, 6\n" + "\tmov r2, r12\n" + "\tands r1, r2\n" + "\tlsls r1, 5\n" + "\tadds r0, r1\n" + "\tmov r3, r10\n" + "\tadds r4, r0, r3\n" + "\tmovs r6, 0\n" + "\tadds r5, 0x1\n" + "_080959D6:\n" + "\tldrb r0, [r4]\n" + "\tmovs r3, 0xF0\n" + "\tands r3, r0\n" + "\tmov r2, r12\n" + "\tands r2, r0\n" + "\tcmp r3, 0\n" + "\tbne _080959E6\n" + "\tldr r3, [sp, 0xC]\n" + "_080959E6:\n" + "\tcmp r2, 0\n" + "\tbne _080959EC\n" + "\tldr r2, [sp, 0x8]\n" + "_080959EC:\n" + "\tmov r0, r9\n" + "\tadds r1, r0, 0x1\n" + "\tlsls r1, 16\n" + "\tlsrs r1, 16\n" + "\tmov r9, r1\n" + "\tldr r1, [sp, 0x40]\n" + "\tadds r0, r1, r0\n" + "\torrs r3, r2\n" + "\tstrb r3, [r0]\n" + "\tadds r4, 0x1\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x1F\n" + "\tbls _080959D6\n" + "\tlsls r0, r5, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, r8\n" + "\tbcc _080959BA\n" + "_08095A12:\n" + "\tldr r0, [sp, 0x40]\n" + "\tadds r1, r7, 0\n" + "\tldr r3, [sp, 0x10]\n" + "\tlsrs r2, r3, 16\n" + "\tbl CpuSet\n" + "\tldr r7, [sp, 0x14]\n" + "\tmovs r0, 0\n" + "\tmov r9, r0\n" + "\tldr r1, [sp, 0x18]\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0x1\n" + "\tbls _0809599E\n" + "_08095A2E:\n" + "\tadd sp, 0x1C\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08095A40: .4byte gFont3LatinGlyphs\n" + "_08095A44: .4byte 0x0000fff0"); +} +#endif + +void unref_sub_8095A48(const u8 *src, u8 *dest, u8 bgOverride, u8 width, u8 *buffer) +{ + u8 tmpBuffer[5]; + bool8 r6 = FALSE; + while (!r6) + { + u16 i; + for (i = 0; i < 4; i++) + { + if (*src == EOS) + { + if (i == 0) + { + return; + } + r6 = TRUE; + break; + } + else + { + tmpBuffer[i] = *src++; + } + } + while (i < 4) + { + tmpBuffer[i++] = 0; + } + tmpBuffer[i] = EOS; + sub_8095904(tmpBuffer, dest, bgOverride, 0x80, width, buffer); + dest += 0x100; + } +} -- cgit v1.2.3 From 26fcc566a4da9287ab4d3795aaadde2a9f4a2947 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 23 Dec 2017 12:14:39 -0500 Subject: This might actually be a u32 based on how similar objects are referenced, but I'm not entirely convinced --- src/unk_text_8095904.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/unk_text_8095904.c b/src/unk_text_8095904.c index bd6e78945..4b190bdaa 100644 --- a/src/unk_text_8095904.c +++ b/src/unk_text_8095904.c @@ -8,7 +8,7 @@ // rodata -extern const u8 gFont3LatinGlyphs[]; +extern const u32 gFont3LatinGlyphs[]; // text @@ -21,7 +21,7 @@ void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *b u16 i; for (i = 0; i < strlen; i++) { - const u8 *glyphs = gFont3LatinGlyphs + ((src[i] & 0xfff0) << 6) + ((src[i] & 0xf) << 5); + const u8 *glyphs = (const u8 *)(gFont3LatinGlyphs + ((src[i] & 0xfff0) * 16) + ((src[i] & 0xf) * 8)); CpuCopy16(glyphs, dest, 32); CpuCopy16(glyphs + 0x200, dest + width, 32); dest += 32; @@ -38,7 +38,7 @@ void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *b u16 j; for (j = 0; j < strlen; j++) // r5 { - const u8 *glyphs = gFont3LatinGlyphs + (i * 0x200) + ((src[j] & 0xfff0) << 6) + ((src[j] & 0xf) << 5); + const u32 *glyphs = (const u8 *)(gFont3LatinGlyphs + (i * 0x80) + ((src[j] & 0xfff0) * 16) + ((src[j] & 0xf) * 8)); u16 k; // r6 for (k = 0; k < 32; k++) -- cgit v1.2.3 From e4a84faabf3f4e2f005e55a88babce7e8ae49c58 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 6 Jan 2018 10:49:52 -0500 Subject: through unref_sub_8095C60 --- src/field/choose_party.c | 3 +- src/field/field_effect.c | 1 + src/pokemon/pokemon_storage_system.c | 88 ++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/field/choose_party.c b/src/field/choose_party.c index d278eda4a..52763b911 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -1,5 +1,5 @@ #include "global.h" -#include "decoration.h" +#include "event_data.h" #include "field_fadetransition.h" #include "main.h" #include "menu.h" @@ -7,6 +7,7 @@ #include "palette.h" #include "party_menu.h" #include "pokemon_menu.h" +#include "field_weather.h" #include "pokemon.h" #include "pokemon_summary_screen.h" #include "overworld.h" diff --git a/src/field/field_effect.c b/src/field/field_effect.c index 1e2aaa4ed..1fe238901 100644 --- a/src/field/field_effect.c +++ b/src/field/field_effect.c @@ -25,6 +25,7 @@ #include "field_map_obj.h" #include "util.h" #include "field_effect_helpers.h" +#include "pokemon_storage_system.h" #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 4a68b846a..2ea7161cf 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -2,6 +2,7 @@ #include "pokemon_storage_system.h" #include "menu.h" #include "string_util.h" +#include "event_data.h" #include "ewram.h" struct StorageAction { @@ -13,6 +14,93 @@ extern const struct StorageAction gUnknown_083B6DF4[]; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; +u8 sub_8095ADC(u8 boxId) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < 30; i++) + { + if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) != 0) + count++; + } + return count; +} + +s16 sub_8095B24(u8 boxId) +{ + u16 i; + + for (i = 0; i < 30; i++) + { + if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) == 0) + return i; + } + return -1; +} + +u8 GetNumValidDaycarePartyMons(void) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + struct Pokemon *pokemon = gPlayerParty + i; + if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG)) + count++; + } + return count; +} + +u8 CountAlivePartyMonsExceptOne(u8 toSkip) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (i != toSkip) + { + struct Pokemon *pokemon = gPlayerParty + i; + if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG) && GetMonData(pokemon, MON_DATA_HP) != 0) + count++; + } + } + return count; +} + +u8 CountAlivePartyMonsExceptSelectedOne(void) +{ + return CountAlivePartyMonsExceptOne(gSpecialVar_0x8004); +} + +u8 StorageSystemGetPartySize(void) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != 0) + count++; + } + return count; +} + +u8 *unref_sub_8095C60(u8 *dest, const u8 *src, u16 pad) +{ + u8 *_dest = StringCopy(dest, src); + while (_dest < dest + pad) + { + *_dest++ = CHAR_SPACE; + } + *_dest = EOS; + return _dest; +} + +asm(".section .text.8098898"); + void sub_8098898(u8 index) { u8 *ptr; -- cgit v1.2.3 From 6ce6e18fd50951ec784f5534f0bcb929aadd24d6 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 6 Jan 2018 11:05:39 -0500 Subject: sub_8095C8C --- src/pokemon/pokemon_storage_system.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 2ea7161cf..3c029b0aa 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -99,6 +99,21 @@ u8 *unref_sub_8095C60(u8 *dest, const u8 *src, u16 pad) return _dest; } +void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) +{ + u16 i; + + dest_width *= 2; + dest += dest_top * 0x20 + dest_left; + src += src_top * src_width + src_left; + for (i = 0; i < dest_height; i++) + { + CpuCopy16(src, dest, dest_width); + dest += 0x20; + src += src_width; + } +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From 4db981200c1d011c370a45d123c31b397b7d62cc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 6 Jan 2018 11:54:46 -0500 Subject: nonmatching unref_sub_8095D08 --- src/pokemon/pokemon_storage_system.c | 138 ++++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 3c029b0aa..5cb61f365 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -99,7 +99,7 @@ u8 *unref_sub_8095C60(u8 *dest, const u8 *src, u16 pad) return _dest; } -void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) +void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) { u16 i; @@ -114,6 +114,142 @@ void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, u16 *src, u16 src_left, } } +#ifdef NONMATCHING +void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) +{ + u16 i; + + dest += dest_top * 0x20 + dest_left; + width *= 2; + for (i = 0; i < height; dest += 0x20, i++) + { + void *_dest = dest; + size_t _size = width; + if (_size <= 0x1000) + { + DmaFill16(3, 0, _dest, _size); + } + else + { + while (1) + { + DmaFill16(3, 0, _dest, 0x1000); + _dest += 0x1000; + _size -= 0x1000; + if (_size <= 0x1000) + { + DmaFill16(3, 0, _dest, _size); + break; + } + } + } + } +} +#else +__attribute__((naked)) void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x8\n" + "\tadds r4, r0, 0\n" + "\tldr r0, [sp, 0x28]\n" + "\tlsls r1, 16\n" + "\tlsrs r1, 16\n" + "\tlsls r2, 16\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r10, r0\n" + "\tlsrs r2, 11\n" + "\tadds r2, r1\n" + "\tlsls r2, 1\n" + "\tadds r4, r2\n" + "\tlsls r3, 17\n" + "\tlsrs r0, r3, 16\n" + "\tstr r0, [sp, 0x4]\n" + "\tmovs r0, 0\n" + "\tcmp r0, r10\n" + "\tbcs _08095DB2\n" + "\tmovs r6, 0x80\n" + "\tlsls r6, 5\n" + "\tmov r5, sp\n" + "\tldr r7, _08095D74 @ =0x040000d4\n" + "\tlsrs r3, 17\n" + "\tmov r9, r3\n" + "\tmov r1, r9\n" + "\tmovs r2, 0x81\n" + "\tlsls r2, 24\n" + "\torrs r1, r2\n" + "\tmov r9, r1\n" + "_08095D4E:\n" + "\tadds r3, r4, 0\n" + "\tldr r2, [sp, 0x4]\n" + "\tmovs r1, 0x40\n" + "\tadds r1, r4\n" + "\tmov r8, r1\n" + "\tadds r0, 0x1\n" + "\tmov r12, r0\n" + "\tcmp r2, r6\n" + "\tbhi _08095D78\n" + "\tmovs r0, 0\n" + "\tstrh r0, [r5]\n" + "\tmov r2, sp\n" + "\tstr r2, [r7]\n" + "\tstr r4, [r7, 0x4]\n" + "\tmov r0, r9\n" + "\tstr r0, [r7, 0x8]\n" + "\tldr r0, [r7, 0x8]\n" + "\tb _08095DA6\n" + "\t.align 2, 0\n" + "_08095D74: .4byte 0x040000d4\n" + "_08095D78:\n" + "\tmovs r4, 0\n" + "\tstrh r4, [r5]\n" + "\tldr r1, _08095DC4 @ =0x040000d4\n" + "\tmov r0, sp\n" + "\tstr r0, [r1]\n" + "\tstr r3, [r1, 0x4]\n" + "\tldr r0, _08095DC8 @ =0x81000800\n" + "\tstr r0, [r1, 0x8]\n" + "\tldr r0, [r1, 0x8]\n" + "\tadds r3, r6\n" + "\tsubs r2, r6\n" + "\tcmp r2, r6\n" + "\tbhi _08095D78\n" + "\tstrh r4, [r5]\n" + "\tmov r0, sp\n" + "\tstr r0, [r1]\n" + "\tstr r3, [r1, 0x4]\n" + "\tlsrs r0, r2, 1\n" + "\tmovs r2, 0x81\n" + "\tlsls r2, 24\n" + "\torrs r0, r2\n" + "\tstr r0, [r1, 0x8]\n" + "\tldr r0, [r1, 0x8]\n" + "_08095DA6:\n" + "\tmov r4, r8\n" + "\tmov r1, r12\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, r10\n" + "\tbcc _08095D4E\n" + "_08095DB2:\n" + "\tadd sp, 0x8\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08095DC4: .4byte 0x040000d4\n" + "_08095DC8: .4byte 0x81000800"); +} +#endif + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From a7e900e31b472385fda5fab48fc3c76212a0e0c2 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 6 Jan 2018 12:47:00 -0500 Subject: StorageSystemGetNextMonIndex --- src/pokemon/pokemon_storage_system.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 5cb61f365..745a27bf6 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -250,6 +250,37 @@ __attribute__((naked)) void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest } #endif +s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) +{ + s16 i; + s16 direction; + if (mode == 0 || mode == 2) + { + direction = 1; + } + else + { + direction = -1; + } + if (mode == 2 || mode == 3) + { + for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction) + { + if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0) + return i; + } + } + else + { + for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction) + { + if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0 && !GetBoxMonData(box + i, MON_DATA_IS_EGG)) + return i; + } + } + return -1; +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From d19de32aba198ac2e5691cab088b3d84cd390b39 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 6 Jan 2018 15:16:51 -0500 Subject: through Task_PokemonStorageSystem --- src/pokemon/pokemon_storage_system.c | 124 ++++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 745a27bf6..a5a3bdcd8 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -1,17 +1,32 @@ #include "global.h" -#include "pokemon_storage_system.h" +#include "palette.h" +#include "field_weather.h" #include "menu.h" +#include "main.h" +#include "strings.h" #include "string_util.h" #include "event_data.h" #include "ewram.h" +#include "script.h" +#include "pokemon_storage_system.h" struct StorageAction { u8 *text; u8 format; }; +struct ReverseMenuAction { + u32 unk0; + u8 *text; +}; + +void StorageSystemCreatePrimaryMenu(u8 whichMenu); +void task_intro_29(u8 whichMenu); + extern const struct StorageAction gUnknown_083B6DF4[]; +extern const struct ReverseMenuAction gUnknown_083B600C[]; + EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; u8 sub_8095ADC(u8 boxId) @@ -281,6 +296,113 @@ s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx return -1; } +void StorageSystemClearMessageWindow(void) +{ + MenuFillWindowRectWithBlankTile(2, 15, 27, 18); +} + +void Task_PokemonStorageSystem(u8 taskId) +{ + struct Task *task = gTasks + taskId; + switch (task->data[0]) + { + case 0: + StorageSystemCreatePrimaryMenu(task->data[1]); + MenuDisplayMessageBox(); + MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + task->data[0]++; + break; + case 1: + if (sub_807D770()) + { + task->data[0]++; + } + break; + case 2: + task->data[2] = ProcessMenuInput(); + switch(task->data[2]) + { + case -2: + task->data[3] = task->data[1]; + if (gMain.newKeys & DPAD_UP && --task->data[3] < 0) + task->data[3] = 3; + + if (gMain.newKeys & DPAD_DOWN && ++task->data[3] > 3) + task->data[3] = 0; + if (task->data[1] != task->data[3]) + { + task->data[1] = task->data[3]; + StorageSystemClearMessageWindow(); + MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + } + break; + case -1: + case 3: + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 13, 9); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + default: + if (task->data[2] == 0 && StorageSystemGetPartySize() == PARTY_SIZE) + { + StorageSystemClearMessageWindow(); + MenuPrint(gPCText_PartyFull2, 2, 15); + task->data[0] = 3; + } + else if (task->data[2] == 1 && StorageSystemGetPartySize() == 1) + { + StorageSystemClearMessageWindow(); + MenuPrint(gPCText_OnlyOne, 2, 15); + task->data[0] = 3; + } + else + { + fade_screen(1, 0); + task->data[0] = 4; + } + break; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + StorageSystemClearMessageWindow(); + MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + task->data[0] = 2; + } + else if (gMain.newKeys & DPAD_UP) + { + if (--task->data[1] < 0) + task->data[1] = 3; + MoveMenuCursor(-1); + task->data[1] = GetMenuCursorPos(); + StorageSystemClearMessageWindow(); + MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + task->data[0] = 2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (++task->data[1] > 3) + task->data[1] = 0; + MoveMenuCursor(1); + task->data[1] = GetMenuCursorPos(); + StorageSystemClearMessageWindow(); + MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + task->data[0] = 2; + } + break; + case 4: + if (!gPaletteFade.active) + { + task_intro_29(task->data[2]); + DestroyTask(taskId); + } + break; + } +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From 666654ff6dcec5916a7eac8425a5ddaae3be1a0e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 6 Jan 2018 16:04:53 -0500 Subject: through ResetPokemonStorageSystem --- src/pokemon/pokemon_storage_system.c | 65 +++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index a5a3bdcd8..8f0753a2d 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -1,6 +1,8 @@ #include "global.h" #include "palette.h" #include "field_weather.h" +#include "overworld.h" +#include "field_fadetransition.h" #include "menu.h" #include "main.h" #include "strings.h" @@ -20,14 +22,21 @@ struct ReverseMenuAction { u8 *text; }; +struct PokemonStorageSystemData { + u8 filler_0000[5]; + u8 unk_0005; +}; + +const struct PokemonStorageSystemData *gUnknown_083B6DB4; + void StorageSystemCreatePrimaryMenu(u8 whichMenu); void task_intro_29(u8 whichMenu); extern const struct StorageAction gUnknown_083B6DF4[]; - extern const struct ReverseMenuAction gUnknown_083B600C[]; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; +EWRAM_DATA u8 gUnknown_02038474; u8 sub_8095ADC(u8 boxId) { @@ -403,6 +412,60 @@ void Task_PokemonStorageSystem(u8 taskId) } } +void ShowPokemonStorageSystem(void) +{ + u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + ScriptContext2_Enable(); +} + +void sub_8096130(void) +{ + u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = gUnknown_02038474; + pal_fill_black(); +} + +void StorageSystemCreatePrimaryMenu(u8 a0) +{ + MenuDrawTextWindow(0, 0, 13, 9); + PrintMenuItems(1, 1, 4, (const struct MenuAction *)gUnknown_083B600C); + InitMenu(0, 1, 1, 4, a0, 12); +} + +void sub_80961A8(void) +{ + gUnknown_02038474 = gUnknown_083B6DB4->unk_0005; + gFieldCallback = sub_8096130; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +void ResetPokemonStorageSystem(void) +{ + u16 boxId; + u16 boxMon; + + gPokemonStorage.currentBox = 0; + for (boxId = 0; boxId < 14; boxId++) + { + for (boxMon = 0; boxMon < 30; boxMon++) + { + ZeroBoxMonData(gPokemonStorage.boxes[boxId] + boxMon); + } + } + for (boxId = 0; boxId < 14; boxId++) + { + u8 *dest = StringCopy(gPokemonStorage.boxNames[boxId], gPCText_BOX); + ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2); + } + for (boxId = 0; boxId < 14; boxId++) + { + gPokemonStorage.wallpaper[boxId] = boxId & 0x03; + } +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From 92577647185e885298bfe3e4159f702730bdf310 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 6 Jan 2018 16:40:49 -0500 Subject: sub_8096264 --- src/pokemon/pokemon_storage_system.c | 97 +++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 8f0753a2d..bc43616a9 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -17,9 +17,9 @@ struct StorageAction { u8 format; }; -struct ReverseMenuAction { - u32 unk0; - u8 *text; +struct PSS_MenuStringPtrs { + const u8 *text; + const u8 *desc; }; struct PokemonStorageSystemData { @@ -27,16 +27,71 @@ struct PokemonStorageSystemData { u8 unk_0005; }; -const struct PokemonStorageSystemData *gUnknown_083B6DB4; +struct UnkPSSStruct_2002370 { + u8 filler_0000[0x23e]; + u8 unk_023e; + u16 unk_0240; + u16 unk_0242; +}; void StorageSystemCreatePrimaryMenu(u8 whichMenu); void task_intro_29(u8 whichMenu); +const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { + {PCText_WithdrawPoke, PCText_MovePokeToParty}, + {PCText_DepositPoke, PCText_StorePokeInBox}, + {PCText_MovePoke, PCText_OrganizeBoxesParty}, + {PCText_SeeYa, PCText_ReturnToPrevMenu} +}; + +const union AnimCmd gSpriteAnim_83B602C[] = { + ANIMCMD_FRAME( 0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6034[] = { + ANIMCMD_FRAME( 4, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B603C[] = { + ANIMCMD_FRAME( 6, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6044[] = { + ANIMCMD_FRAME(10, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83B604C[] = { + gSpriteAnim_83B602C, + gSpriteAnim_83B6034, + gSpriteAnim_83B603C, + gSpriteAnim_83B6044 +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B605C[] = { + AFFINEANIMCMD_FRAME(0xe0, 0xe0, 0, 0), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B606C[] = { + gSpriteAffineAnim_83B605C +}; + +const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal"); + +const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); + +const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); + extern const struct StorageAction gUnknown_083B6DF4[]; -extern const struct ReverseMenuAction gUnknown_083B600C[]; +extern const struct PokemonStorageSystemData *gUnknown_083B6DB4; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; EWRAM_DATA u8 gUnknown_02038474; +EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478; u8 sub_8095ADC(u8 boxId) { @@ -318,7 +373,7 @@ void Task_PokemonStorageSystem(u8 taskId) case 0: StorageSystemCreatePrimaryMenu(task->data[1]); MenuDisplayMessageBox(); - MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + MenuPrint(gUnknown_083B600C[task->data[1]].desc, 2, 15); task->data[0]++; break; case 1: @@ -342,7 +397,7 @@ void Task_PokemonStorageSystem(u8 taskId) { task->data[1] = task->data[3]; StorageSystemClearMessageWindow(); - MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + MenuPrint(gUnknown_083B600C[task->data[1]].desc, 2, 15); } break; case -1: @@ -378,7 +433,7 @@ void Task_PokemonStorageSystem(u8 taskId) if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { StorageSystemClearMessageWindow(); - MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + MenuPrint(gUnknown_083B600C[task->data[1]].desc, 2, 15); task->data[0] = 2; } else if (gMain.newKeys & DPAD_UP) @@ -388,7 +443,7 @@ void Task_PokemonStorageSystem(u8 taskId) MoveMenuCursor(-1); task->data[1] = GetMenuCursorPos(); StorageSystemClearMessageWindow(); - MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + MenuPrint(gUnknown_083B600C[task->data[1]].desc, 2, 15); task->data[0] = 2; } else if (gMain.newKeys & DPAD_DOWN) @@ -398,7 +453,7 @@ void Task_PokemonStorageSystem(u8 taskId) MoveMenuCursor(1); task->data[1] = GetMenuCursorPos(); StorageSystemClearMessageWindow(); - MenuPrint(gUnknown_083B600C[task->data[1]].text, 2, 15); + MenuPrint(gUnknown_083B600C[task->data[1]].desc, 2, 15); task->data[0] = 2; } break; @@ -428,11 +483,11 @@ void sub_8096130(void) pal_fill_black(); } -void StorageSystemCreatePrimaryMenu(u8 a0) +void StorageSystemCreatePrimaryMenu(u8 whichMenu) { MenuDrawTextWindow(0, 0, 13, 9); PrintMenuItems(1, 1, 4, (const struct MenuAction *)gUnknown_083B600C); - InitMenu(0, 1, 1, 4, a0, 12); + InitMenu(0, 1, 1, 4, whichMenu, 12); } void sub_80961A8(void) @@ -466,6 +521,24 @@ void ResetPokemonStorageSystem(void) } } +void sub_8096264(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3) +{ + struct SpritePalette palette = { + gBoxSelectionPopupPalette, palTag + }; + struct SpriteSheet sheets[] = { + {gBoxSelectionPopupCenterTiles, 0x800, tileTag}, + {gBoxSelectionPopupSidesTiles, 0x180, tileTag + 1}, + {} + }; + LoadSpritePalette(&palette); + LoadSpriteSheets(sheets); + gUnknown_02038478 = a0; + a0->unk_0240 = tileTag; + a0->unk_0242 = palTag; + a0->unk_023e = a3; +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From aa023a5cb52c7b7a4cb2e23aadcd7db4bf0b3483 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 6 Jan 2018 22:21:05 -0500 Subject: through sub_80963D0 --- src/pokemon/pokemon_storage_system.c | 113 ++++++++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index bc43616a9..37414f32b 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -1,5 +1,7 @@ #include "global.h" #include "palette.h" +#include "constants/songs.h" +#include "sound.h" #include "field_weather.h" #include "overworld.h" #include "field_fadetransition.h" @@ -28,7 +30,13 @@ struct PokemonStorageSystemData { }; struct UnkPSSStruct_2002370 { - u8 filler_0000[0x23e]; + struct Sprite *unk_0000; + struct Sprite *unk_0004[4]; + u32 unk_0014[3]; + struct Sprite *unk_0020[2]; + u8 filler_0028[0x214]; + u8 unk_023c; + u8 unk_023d; u8 unk_023e; u16 unk_0240; u16 unk_0242; @@ -36,6 +44,13 @@ struct UnkPSSStruct_2002370 { void StorageSystemCreatePrimaryMenu(u8 whichMenu); void task_intro_29(u8 whichMenu); +void sub_80963D0(u8 a0); +void sub_809658C(void); +void sub_80965F8(void); +void sub_809662C(void); +void sub_809665C(void); +void sub_8096784(struct Sprite *sprite); +struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { {PCText_WithdrawPoke, PCText_MovePokeToParty}, @@ -539,6 +554,102 @@ void sub_8096264(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3 a0->unk_023e = a3; } +void sub_8096310(void) +{ + FreeSpritePaletteByTag(gUnknown_02038478->unk_0242); + FreeSpriteTilesByTag(gUnknown_02038478->unk_0240); + FreeSpriteTilesByTag(gUnknown_02038478->unk_0240 + 1); +} + +void sub_809634C(u8 a0) +{ + sub_80963D0(a0); +} + +void sub_809635C(void) +{ + sub_809658C(); +} + +u8 sub_8096368(void) +{ + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + return 201; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return gUnknown_02038478->unk_023c; + } + if (gMain.newKeys & DPAD_LEFT) + { + PlaySE(SE_SELECT); + sub_809662C(); + } + else if (gMain.newKeys & DPAD_RIGHT) + { + PlaySE(SE_SELECT); + sub_80965F8(); + } + return 200; +} + +void sub_80963D0(u8 a0) +{ + u16 i; + u8 spriteId; + struct SpriteTemplate template; + struct OamData oamData = {}; + oamData.size = 3; + oamData.paletteNum = 1; + template = (struct SpriteTemplate){ + 0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy + }; + + gUnknown_02038478->unk_023c = a0; + template.tileTag = gUnknown_02038478->unk_0240; + template.paletteTag = gUnknown_02038478->unk_0242; + + spriteId = CreateSprite(&template, 0xa0, 0x60, 0); + gUnknown_02038478->unk_0000 = gSprites + spriteId; + + oamData.shape = ST_OAM_V_RECTANGLE; + oamData.size = 1; + template.tileTag = gUnknown_02038478->unk_0240 + 1; + template.anims = gSpriteAnimTable_83B604C; + for (i = 0; i < 4; i++) + { + u16 r5; + spriteId = CreateSprite(&template, 0x7c, 0x50, gUnknown_02038478->unk_023e); + gUnknown_02038478->unk_0004[i] = gSprites + spriteId; + r5 = 0; + if (i & 2) + { + gUnknown_02038478->unk_0004[i]->pos1.x = 0xc4; + r5 = 2; + } + if (i & 1) + { + gUnknown_02038478->unk_0004[i]->pos1.y = 0x70; + gUnknown_02038478->unk_0004[i]->oam.size = 0; + r5++; + } + StartSpriteAnim(gUnknown_02038478->unk_0004[i], r5); + } + for (i = 0; i < 2; i++) + { + gUnknown_02038478->unk_0020[i] = sub_809A9A0(72 * i + 0x7c, 0x58, i, 0, gUnknown_02038478->unk_023e); + if (gUnknown_02038478->unk_0020[i]) + { + gUnknown_02038478->unk_0020[i]->data[0] = (i == 0 ? -1 : 1); + gUnknown_02038478->unk_0020[i]->callback = sub_8096784; + } + } + sub_809665C(); +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From 92fa7570b99d216f75becbd362a124a12cc1dcde Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 7 Jan 2018 18:44:14 -0500 Subject: through task_intro_29 --- src/pokemon/pokemon_storage_system.c | 125 ++++++++++++++++++++++++++++++++--- 1 file changed, 114 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 37414f32b..30c0f2b67 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -35,7 +35,7 @@ struct UnkPSSStruct_2002370 { u32 unk_0014[3]; struct Sprite *unk_0020[2]; u8 filler_0028[0x214]; - u8 unk_023c; + u8 curBox; u8 unk_023d; u8 unk_023e; u16 unk_0240; @@ -43,13 +43,15 @@ struct UnkPSSStruct_2002370 { }; void StorageSystemCreatePrimaryMenu(u8 whichMenu); -void task_intro_29(u8 whichMenu); -void sub_80963D0(u8 a0); +void sub_80963D0(u8 curBox); void sub_809658C(void); void sub_80965F8(void); void sub_809662C(void); void sub_809665C(void); +void sub_80966F4(const u8 *sourceString, u16 x, u16 y); void sub_8096784(struct Sprite *sprite); +void task_intro_29(u8 whichMenu); +void sub_8096884(void); struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { @@ -103,12 +105,15 @@ const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/bo extern const struct StorageAction gUnknown_083B6DF4[]; extern const struct PokemonStorageSystemData *gUnknown_083B6DB4; +extern u8 *const gUnknown_083B6DB8; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; EWRAM_DATA u8 gUnknown_02038474; EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478; +EWRAM_DATA u8 gUnknown_0203847C; +EWRAM_DATA u8 gUnknown_0203847D; -u8 sub_8095ADC(u8 boxId) +static u8 CountPokemonInBoxN(u8 boxId) { u16 i; u16 count; @@ -121,7 +126,7 @@ u8 sub_8095ADC(u8 boxId) return count; } -s16 sub_8095B24(u8 boxId) +s16 GetIndexOfFirstEmptySpaceInBoxN(u8 boxId) { u16 i; @@ -561,9 +566,9 @@ void sub_8096310(void) FreeSpriteTilesByTag(gUnknown_02038478->unk_0240 + 1); } -void sub_809634C(u8 a0) +void sub_809634C(u8 curBox) { - sub_80963D0(a0); + sub_80963D0(curBox); } void sub_809635C(void) @@ -581,7 +586,7 @@ u8 sub_8096368(void) if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_02038478->unk_023c; + return gUnknown_02038478->curBox; } if (gMain.newKeys & DPAD_LEFT) { @@ -596,7 +601,7 @@ u8 sub_8096368(void) return 200; } -void sub_80963D0(u8 a0) +void sub_80963D0(u8 curBox) { u16 i; u8 spriteId; @@ -608,11 +613,11 @@ void sub_80963D0(u8 a0) 0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; - gUnknown_02038478->unk_023c = a0; + gUnknown_02038478->curBox = curBox; template.tileTag = gUnknown_02038478->unk_0240; template.paletteTag = gUnknown_02038478->unk_0242; - spriteId = CreateSprite(&template, 0xa0, 0x60, 0); + spriteId = CreateSprite(&template, 0xA0, 0x60, 0); gUnknown_02038478->unk_0000 = gSprites + spriteId; oamData.shape = ST_OAM_V_RECTANGLE; @@ -650,6 +655,104 @@ void sub_80963D0(u8 a0) sub_809665C(); } +void sub_809658C(void) +{ + u16 i; + if (gUnknown_02038478->unk_0000) + { + DestroySprite(gUnknown_02038478->unk_0000); + gUnknown_02038478->unk_0000 = NULL; + } + for (i = 0; i < 4; i++) + { + if (gUnknown_02038478->unk_0004[i]) + { + DestroySprite(gUnknown_02038478->unk_0004[i]); + gUnknown_02038478->unk_0004[i] = NULL; + } + } + for (i = 0; i < 2; i++) + { + if (gUnknown_02038478->unk_0020[i]) + DestroySprite(gUnknown_02038478->unk_0020[i]); + } +} + +void sub_80965F8(void) +{ + if (++gUnknown_02038478->curBox > 13) + gUnknown_02038478->curBox = 0; + sub_809665C(); +} + +void sub_809662C(void) +{ + gUnknown_02038478->curBox = (gUnknown_02038478->curBox == 0 ? 13 : gUnknown_02038478->curBox - 1); + sub_809665C(); +} + +void sub_809665C(void) +{ + u8 nPokemonInBox = CountPokemonInBoxN(gUnknown_02038478->curBox); + u8 *stringVar = gStringVar1; + + stringVar[0] = EXT_CTRL_CODE_BEGIN; + stringVar[1] = 0x04; // EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW + stringVar[2] = 0x0F; // TEXT_COLOR_WHITE2 + stringVar[3] = 0x01; // TEXT_COLOR_DARK_GREY + stringVar[4] = 0x0E; // TEXT_COLOR_LIGHT_BLUE + stringVar += 5; + + stringVar = StringCopy(stringVar, gPokemonStorage.boxNames[gUnknown_02038478->curBox]); + + stringVar[0] = CHAR_NEWLINE; + stringVar[1] = EXT_CTRL_CODE_BEGIN; + stringVar[2] = 0x11; // EXT_CTRL_CODE_CLEAR + if (nPokemonInBox < 10) + stringVar[3] = 0x28; + else + stringVar[3] = 0x22; + stringVar += 4; + + stringVar = ConvertIntToDecimalString(stringVar, nPokemonInBox); + + stringVar[0] = CHAR_SLASH; + stringVar[1] = CHAR_0 + 3; + stringVar[2] = CHAR_0 + 0; + stringVar[3] = EOS; + sub_80966F4(gStringVar1, 0, 1); +} + +void sub_80966F4(const u8 *sourceString, u16 x, u16 y) +{ + u16 *vdest = (u16 *)(BG_CHAR_ADDR(4) + (GetSpriteTileStartByTag(gUnknown_02038478->unk_0240) * 32) + y * 256 + x * 32); + u8 *tileBuff = gUnknown_083B6DB8; + DmaFill16(3, 0x1111, tileBuff, 0x400); + sub_8004E3C(&gWindowConfig_81E6D38, tileBuff, sourceString); + DmaCopy16(3, tileBuff, vdest, 0x400); +} + +void sub_8096784(struct Sprite *sprite) +{ + if (++sprite->data[1] > 3) + { + sprite->data[1] = 0; + sprite->pos2.x += sprite->data[0]; + if (++sprite->data[2] > 5) + { + sprite->data[2] = 0; + sprite->pos2.x = 0; + } + } +} + +void task_intro_29(u8 whichMenu) +{ + gUnknown_0203847D = whichMenu; + ePokemonStorageSystem.unk_0005 = whichMenu; + SetMainCallback2(sub_8096884); +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From b9ad9b3ad547b200e66b293169acbbfe4f50f76d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 7 Jan 2018 19:20:15 -0500 Subject: through sub_8096874 --- src/engine/naming_screen.c | 2 -- src/field/use_pokeblock.c | 1 - src/pokemon/pokemon_storage_system.c | 47 ++++++++++++++++++++++++++++++++++++ src/pokenav_before.c | 5 +--- 4 files changed, 48 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c index 440504d5a..6f34fd678 100644 --- a/src/engine/naming_screen.c +++ b/src/engine/naming_screen.c @@ -26,8 +26,6 @@ #define COLUMN_COUNT 10 #endif -extern u16 gKeyRepeatStartDelay; - extern u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality); const u8 gSpriteImage_83CE094[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp"); diff --git a/src/field/use_pokeblock.c b/src/field/use_pokeblock.c index 7253ac901..354193c14 100644 --- a/src/field/use_pokeblock.c +++ b/src/field/use_pokeblock.c @@ -104,7 +104,6 @@ static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL; EWRAM_DATA u8 gPokeblockMonID = 0; EWRAM_DATA s16 gPokeblockGain = 0; -extern u16 gKeyRepeatStartDelay; extern u16 gSpecialVar_ItemId; // FIXME: remove after merge of #349 Pokeblock static void launch_c3_walk_stairs_and_run_once(void (*const)(void)); diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 30c0f2b67..9e559354b 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -24,9 +24,17 @@ struct PSS_MenuStringPtrs { const u8 *desc; }; +struct UnkStruct_2000020 { + struct UnkStruct_2000020 *unk_00; + u8 unk_04; + u8 unk_05; +}; + struct PokemonStorageSystemData { u8 filler_0000[5]; u8 unk_0005; + u8 filler_0006[26]; + struct UnkStruct_2000020 unk_0020[100]; // refine size later }; struct UnkPSSStruct_2002370 { @@ -53,6 +61,8 @@ void sub_8096784(struct Sprite *sprite); void task_intro_29(u8 whichMenu); void sub_8096884(void); struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); +void sub_809B0D4(void); +void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 * a1, u8 a2); const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { {PCText_WithdrawPoke, PCText_MovePokeToParty}, @@ -112,6 +122,7 @@ EWRAM_DATA u8 gUnknown_02038474; EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478; EWRAM_DATA u8 gUnknown_0203847C; EWRAM_DATA u8 gUnknown_0203847D; +EWRAM_DATA u8 gUnknown_0203847E; static u8 CountPokemonInBoxN(u8 boxId) { @@ -753,6 +764,42 @@ void task_intro_29(u8 whichMenu) SetMainCallback2(sub_8096884); } +void sub_80967DC(void) +{ + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; +} + +void sub_8096804(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeSpriteTileRanges(); + FreeAllSpritePalettes(); + ResetTasks(); + gReservedSpriteTileCount = 0x280; + sub_809CFDC(ePokemonStorageSystem.unk_0020, ePokemonStorageSystem.unk_0020 + 1, 8); + gKeyRepeatStartDelay = 20; +} + +void sub_8096848(void) +{ + sub_809B0D4(); + gUnknown_0203847C = (ePokemonStorageSystem.unk_0005 == 1 ? 1 : 0); + gUnknown_0203847E = 0; +} + +void sub_8096874(void) +{ + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { diff --git a/src/pokenav_before.c b/src/pokenav_before.c index 7693cba7d..53f17b211 100644 --- a/src/pokenav_before.c +++ b/src/pokenav_before.c @@ -294,9 +294,6 @@ extern void sub_80F5BF0(); extern void sub_80F6F64(); extern void sub_80F19FC(); -extern u16 gKeyRepeatStartDelay; - - void sub_80EBA5C() { switch (gMain.state) { default: @@ -378,7 +375,7 @@ void sub_80EBC10() { u16 i; u16 *var1; - gKeyRepeatStartDelay = 0x14; + gKeyRepeatStartDelay = 20; ewram0_10.playerPartyCount = CalculatePlayerPartyCount(); ewram0_10.var6ddc = 0; ewram0_10.var9344 = 0; -- cgit v1.2.3 From bfeaa80fcd9409645325c2f7ae94850f970fbb58 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 7 Jan 2018 19:47:59 -0500 Subject: through sub_8096884 --- src/pokemon/mon_markings.c | 20 +--------- src/pokemon/pokemon_storage_system.c | 74 +++++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/pokemon/mon_markings.c b/src/pokemon/mon_markings.c index b4144ea34..d27719c4a 100644 --- a/src/pokemon/mon_markings.c +++ b/src/pokemon/mon_markings.c @@ -5,6 +5,7 @@ #include "constants/songs.h" #include "sound.h" #include "sprite.h" +#include "mon_markings.h" #ifdef GERMAN #define MENU_TEXT_SPRITE_X_OFFSET 24 @@ -12,25 +13,6 @@ #define MENU_TEXT_SPRITE_X_OFFSET 32 #endif -struct PokemonMarkMenu -{ - /*0x0000*/ u16 baseTileTag; - /*0x0002*/ u16 basePaletteTag; - /*0x0004*/ u8 markings; // bit flags - /*0x0005*/ s8 cursorPos; - /*0x0006*/ bool8 markingsArray[4]; - /*0x000A*/ u8 cursorBaseY; - /*0x000B*/ bool8 spriteSheetLoadRequired; - /*0x000C*/ struct Sprite *menuWindowSprites[2]; // upper and lower halves of menu window - /*0x0014*/ struct Sprite *menuMarkingSprites[4]; - /*0x0024*/ struct Sprite *menuTextSprite; - /*0x0028*/ const u8 *frameTiles; - /*0x002C*/ const u16 *framePalette; - /*0x0030*/ u8 menuWindowSpriteTiles[0x1000]; - /*0x1030*/ u8 filler1030[0x80]; - /*0x10B0*/ u8 tileLoadState; -}; - extern u8 gPokenavConditionMenuMisc_Gfx[]; extern u16 gUnknown_08E966B8[]; diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 9e559354b..91d56a4b9 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -3,6 +3,7 @@ #include "constants/songs.h" #include "sound.h" #include "field_weather.h" +#include "mon_markings.h" #include "overworld.h" #include "field_fadetransition.h" #include "menu.h" @@ -34,7 +35,9 @@ struct PokemonStorageSystemData { u8 filler_0000[5]; u8 unk_0005; u8 filler_0006[26]; - struct UnkStruct_2000020 unk_0020[100]; // refine size later + struct UnkStruct_2000020 unk_0020[595]; // refine size later + u8 filler_12b8[4]; + struct PokemonMarkMenu unk_12bc; }; struct UnkPSSStruct_2002370 { @@ -60,6 +63,16 @@ void sub_80966F4(const u8 *sourceString, u16 x, u16 y); void sub_8096784(struct Sprite *sprite); void task_intro_29(u8 whichMenu); void sub_8096884(void); +void sub_8096AFC(void); +void sub_8096B38(void); +void sub_8096BE0(void (*func)(void)); +void sub_8096BF0(void); +void sub_8097DE0(void); +void sub_8097E70(void); +void sub_8098400(void); +void sub_8099BF8(u8 a0); +void sub_8098B48(void); +void sub_809AA24(void); struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); void sub_809B0D4(void); void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 * a1, u8 a2); @@ -800,6 +813,65 @@ void sub_8096874(void) REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; } +void sub_8096884(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + sub_8096804(); + gMain.state++; + break; + case 1: + SetUpWindowConfig(&gWindowConfig_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowConfig_81E6D00); + MenuZeroFillScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + sub_8096848(); + gMain.state++; + break; + case 4: + sub_8098B48(); + sub_809AA24(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + ePokemonStorageSystem.unk_12bc.baseTileTag = 0x000a; + ePokemonStorageSystem.unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&ePokemonStorageSystem.unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + sub_8096874(); + sub_8096BE0(sub_8096BF0); + SetMainCallback2(sub_8096B38); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + } +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From 0947fdf167bff7fe67e1344fea8b287fc59a6cd2 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 7 Jan 2018 21:27:40 -0500 Subject: sub_80969A0 --- src/pokemon/pokemon_storage_system.c | 97 +++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 91d56a4b9..2b36f5d71 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -67,15 +67,19 @@ void sub_8096AFC(void); void sub_8096B38(void); void sub_8096BE0(void (*func)(void)); void sub_8096BF0(void); +void sub_8096C68(void); void sub_8097DE0(void); void sub_8097E70(void); void sub_8098400(void); void sub_8099BF8(u8 a0); void sub_8098B48(void); -void sub_809AA24(void); struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); +void sub_809AA24(void); +void sub_809AA98(void); void sub_809B0D4(void); -void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 * a1, u8 a2); +void sub_809BBC0(void); +void sub_809BD14(void); +void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 *a1, u8 a2); const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { {PCText_WithdrawPoke, PCText_MovePokeToParty}, @@ -131,11 +135,23 @@ extern const struct PokemonStorageSystemData *gUnknown_083B6DB4; extern u8 *const gUnknown_083B6DB8; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; -EWRAM_DATA u8 gUnknown_02038474; -EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478; -EWRAM_DATA u8 gUnknown_0203847C; -EWRAM_DATA u8 gUnknown_0203847D; -EWRAM_DATA u8 gUnknown_0203847E; +EWRAM_DATA u8 gUnknown_02038470[3] = {}; +EWRAM_DATA u8 gUnknown_02038473 = 0; +EWRAM_DATA u8 gUnknown_02038474 = 0; +EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478 = NULL; +EWRAM_DATA u8 gUnknown_0203847C = 0; +EWRAM_DATA u8 gUnknown_0203847D = 0; +EWRAM_DATA u8 gUnknown_0203847E = 0; +EWRAM_DATA u8 gUnknown_0203847F = 0; +EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; +EWRAM_DATA u8 gUnknown_020384E4 = 0; +EWRAM_DATA u8 gUnknown_020384E5 = 0; +EWRAM_DATA u8 gUnknown_020384E6 = 0; +EWRAM_DATA u8 gUnknown_020384E7 = 0; +EWRAM_DATA u8 gUnknown_020384E8 = 0; +EWRAM_DATA u8 gUnknown_020384E9 = 0; +EWRAM_DATA u16 gUnknown_020384EA = 0; +EWRAM_DATA u32 gUnknown_020384EC = 0; static u8 CountPokemonInBoxN(u8 boxId) { @@ -872,6 +888,73 @@ void sub_8096884(void) } } +void sub_80969A0(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0x0000; + ePokemonStorageSystem.unk_0005 = gUnknown_0203847D; + sub_8096804(); + if (gUnknown_0203847F == 1) + sub_809BBC0(); + if (gUnknown_0203847F == 0) + sub_809BD14(); + gMain.state++; + break; + case 1: + SetUpWindowConfig(&gWindowConfig_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowConfig_81E6D00); + MenuZeroFillScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + gMain.state++; + break; + case 4: + sub_8098B48(); + sub_809AA98(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + ePokemonStorageSystem.unk_12bc.baseTileTag = 0x000a; + ePokemonStorageSystem.unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&ePokemonStorageSystem.unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + case 10: + sub_8096874(); + sub_8096BE0(sub_8096C68); + SetMainCallback2(sub_8096B38); + gMain.state++; + break; + } +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From ceebbe19918520c65ed9bdcd79d4ae5fbb669d88 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 7 Jan 2018 22:03:21 -0500 Subject: through sub_8096BE0 --- src/pokemon/pokemon_storage_system.c | 74 +++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 2b36f5d71..f09d9b302 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -13,6 +13,8 @@ #include "event_data.h" #include "ewram.h" #include "script.h" +#include "pokemon_summary_screen.h" +#include "naming_screen.h" #include "pokemon_storage_system.h" struct StorageAction { @@ -31,15 +33,6 @@ struct UnkStruct_2000020 { u8 unk_05; }; -struct PokemonStorageSystemData { - u8 filler_0000[5]; - u8 unk_0005; - u8 filler_0006[26]; - struct UnkStruct_2000020 unk_0020[595]; // refine size later - u8 filler_12b8[4]; - struct PokemonMarkMenu unk_12bc; -}; - struct UnkPSSStruct_2002370 { struct Sprite *unk_0000; struct Sprite *unk_0004[4]; @@ -51,6 +44,27 @@ struct UnkPSSStruct_2002370 { u8 unk_023e; u16 unk_0240; u16 unk_0242; +}; // 0244 + +struct PokemonStorageSystemData { + void (*unk_0000)(void); + u8 unk_0004; + u8 unk_0005; + u8 unk_0006; + u16 unk_0008; + u16 unk_000a; + u8 filler_000c[20]; + struct UnkStruct_2000020 unk_0020[274]; // refine size later + u8 filler_08b0[4]; + u16 unk_08b4; + u8 filler_08b6[0xa06]; + struct PokemonMarkMenu unk_12bc; + struct UnkPSSStruct_2002370 unk_2370; + u8 filler_25b4[0xd8]; + u8 unk_268c; + u8 unk_268d; + u8 unk_268e; + struct Pokemon *unk_2690; }; void StorageSystemCreatePrimaryMenu(u8 whichMenu); @@ -69,8 +83,10 @@ void sub_8096BE0(void (*func)(void)); void sub_8096BF0(void); void sub_8096C68(void); void sub_8097DE0(void); +void sub_8097E44(void); void sub_8097E70(void); void sub_8098400(void); +void sub_8098734(void); void sub_8099BF8(u8 a0); void sub_8098B48(void); struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); @@ -80,6 +96,7 @@ void sub_809B0D4(void); void sub_809BBC0(void); void sub_809BD14(void); void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 *a1, u8 a2); +void sub_809CFF0(void); const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { {PCText_WithdrawPoke, PCText_MovePokeToParty}, @@ -955,6 +972,45 @@ void sub_80969A0(void) } } +void sub_8096AFC(void) +{ + REG_BG2HOFS = ePokemonStorageSystem.unk_08b4; + REG_BG3HOFS = ePokemonStorageSystem.unk_000a; + REG_BG3VOFS = ePokemonStorageSystem.unk_0008; + LoadOam(); + ProcessSpriteCopyRequests(); + sub_809CFF0(); + TransferPlttBuffer(); +} + +void sub_8096B38(void) +{ + ePokemonStorageSystem.unk_0000(); + sub_8097E44(); + sub_8098734(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_8096B5C(void) +{ + switch (ePokemonStorageSystem.unk_0006) + { + case 0: + ShowPokemonSummaryScreen(ePokemonStorageSystem.unk_2690, ePokemonStorageSystem.unk_268d, ePokemonStorageSystem.unk_268c, sub_80969A0, ePokemonStorageSystem.unk_268e); + break; + case 1: + DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); + break; + } +} + +void sub_8096BE0(void (*func)(void)) +{ + ePokemonStorageSystem.unk_0000 = func; + ePokemonStorageSystem.unk_0004 = 0; +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From 02fea36a2e43523c9e9401897ac2fdbeb37ed3d4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 7 Jan 2018 22:25:16 -0500 Subject: through sub_8096C68 --- src/field/pc_screen_effect.c | 17 +++-------------- src/pokemon/pokemon_storage_system.c | 35 ++++++++++++++++++++++++++++++++++- src/scene/hall_of_fame.c | 4 ++-- 3 files changed, 39 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/field/pc_screen_effect.c b/src/field/pc_screen_effect.c index 364fca0aa..dda569ea4 100644 --- a/src/field/pc_screen_effect.c +++ b/src/field/pc_screen_effect.c @@ -2,18 +2,7 @@ #include "main.h" #include "palette.h" #include "sprite.h" - -struct UnkStruct -{ - /*0x00*/ u16 tileTag; - /*0x02*/ u16 paletteTag; - /*0x04*/ u16 unk04; - /*0x06*/ u16 unk06; - /*0x08*/ u16 unk08; - /*0x0A*/ u16 unk0A; - /*0x0C*/ s16 unk0C; - /*0x10*/ u32 selectedPalettes; -}; +#include "pc_screen_effect.h" void sub_80C603C(void); void sub_80C6078(void); @@ -30,7 +19,7 @@ extern const u16 gUnknownPal_083D18EC[16]; extern const u8 gUnknownGfx_083D190C[128]; -extern struct UnkStruct *gUnknown_020387EC; +extern struct PCScreenEffectStruct *gUnknown_020387EC; const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 }; @@ -58,7 +47,7 @@ const struct SpriteTemplate gSpriteTemplate_83D18C0 = sub_80C6130, }; -void sub_80C5CD4(struct UnkStruct *unkStruct) +void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct) { u16 i; diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index f09d9b302..d6119476c 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -14,6 +14,7 @@ #include "ewram.h" #include "script.h" #include "pokemon_summary_screen.h" +#include "pc_screen_effect.h" #include "naming_screen.h" #include "pokemon_storage_system.h" @@ -53,7 +54,7 @@ struct PokemonStorageSystemData { u8 unk_0006; u16 unk_0008; u16 unk_000a; - u8 filler_000c[20]; + struct PCScreenEffectStruct unk_000c; struct UnkStruct_2000020 unk_0020[274]; // refine size later u8 filler_08b0[4]; u16 unk_08b4; @@ -82,6 +83,7 @@ void sub_8096B38(void); void sub_8096BE0(void (*func)(void)); void sub_8096BF0(void); void sub_8096C68(void); +void sub_8096C84(void); void sub_8097DE0(void); void sub_8097E44(void); void sub_8097E70(void); @@ -1011,6 +1013,37 @@ void sub_8096BE0(void (*func)(void)) ePokemonStorageSystem.unk_0004 = 0; } +void sub_8096BF0(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + BlendPalettes(0xffffffff, 16, 0); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + PlaySE(SE_PC_LOGON); + ePokemonStorageSystem.unk_000c.tileTag = 14; + ePokemonStorageSystem.unk_000c.paletteTag = 0xdad0; + ePokemonStorageSystem.unk_000c.unk04 = 0; + ePokemonStorageSystem.unk_000c.unk06 = 0; + sub_80C5CD4(&ePokemonStorageSystem.unk_000c); + BlendPalettes(0xffffffff, 0, 0); + ePokemonStorageSystem.unk_0004++; + break; + case 2: + if (sub_80C5DCC()) + sub_8096BE0(sub_8096C84); + break; + } +} + +void sub_8096C68(void) +{ + if (!UpdatePaletteFade()) + sub_8096BE0(sub_8096C84); +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { diff --git a/src/scene/hall_of_fame.c b/src/scene/hall_of_fame.c index 1751ee99c..812c28137 100644 --- a/src/scene/hall_of_fame.c +++ b/src/scene/hall_of_fame.c @@ -17,6 +17,7 @@ #include "decompress.h" #include "random.h" #include "trig.h" +#include "pc_screen_effect.h" #include "ewram.h" static EWRAM_DATA u32 sUnknown_0203931C = 0; @@ -89,7 +90,6 @@ static bool8 sub_81438C4(void); // functions from different files void sub_81439D0(void); -void sub_80C5CD4(void*); // ? void sub_80C5E38(void*); // ? bool8 sub_80C5DCC(void); bool8 sub_80C5F98(void); @@ -811,7 +811,7 @@ void sub_81428CC(void) fameMons = eHallOfFameMons1; fameMons->mons[0] = sDummyFameMon; - sub_80C5CD4(fameMons); + sub_80C5CD4((struct PCScreenEffectStruct *)fameMons); gMain.state++; } break; -- cgit v1.2.3 From fd42bcc78ce229d13afc26af4c6d2dd0187b871d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 7 Jan 2018 23:46:05 -0500 Subject: sub_8096C84 --- src/pokemon/pokemon_storage_system.c | 220 +++++++++++++++++++++++++++++++++-- 1 file changed, 209 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index d6119476c..b0a317cd9 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -5,6 +5,7 @@ #include "field_weather.h" #include "mon_markings.h" #include "overworld.h" +#include "mail_data.h" #include "field_fadetransition.h" #include "menu.h" #include "main.h" @@ -56,9 +57,14 @@ struct PokemonStorageSystemData { u16 unk_000a; struct PCScreenEffectStruct unk_000c; struct UnkStruct_2000020 unk_0020[274]; // refine size later - u8 filler_08b0[4]; + u8 filler_08b0[2]; + s16 unk_08b2; u16 unk_08b4; - u8 filler_08b6[0xa06]; + u8 filler_08b6[0x93c]; + u16 unk_11f2; + u8 filler_11f4[2]; + u8 unk_11f6; + u8 filler_11f7[0xc5]; struct PokemonMarkMenu unk_12bc; struct UnkPSSStruct_2002370 unk_2370; u8 filler_25b4[0xd8]; @@ -80,23 +86,48 @@ void task_intro_29(u8 whichMenu); void sub_8096884(void); void sub_8096AFC(void); void sub_8096B38(void); -void sub_8096BE0(void (*func)(void)); +void SetPSSCallback(void (*func)(void)); void sub_8096BF0(void); void sub_8096C68(void); void sub_8096C84(void); +void sub_8097004(void); +void sub_8097078(void); +void sub_80972A8(void); +void sub_80972FC(void); +void c3_0808DC50(void); +void sub_8097390(void); +void sub_809746C(void); +void sub_809789C(void); +void sub_8097BA0(void); +void sub_8097CC0(void); +void BoxSetMosaic(void); +void sub_80986E8(void); +void sub_8098710(void); +void sub_8098A5C(void); +void sub_809B440(void); +void sub_8096FC8(void); void sub_8097DE0(void); void sub_8097E44(void); void sub_8097E70(void); void sub_8098400(void); void sub_8098734(void); -void sub_8099BF8(u8 a0); +void sub_8098898(u8 index); void sub_8098B48(void); +void sub_8099BF8(u8 a0); +void sub_8099C70(u8 whichBox); +bool8 sub_8099D34(void); struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); void sub_809AA24(void); void sub_809AA98(void); +bool8 sub_809AC00(void); void sub_809B0D4(void); void sub_809BBC0(void); void sub_809BD14(void); +bool8 sub_809BE80(void); +bool8 sub_809BEBC(void); +bool8 sub_809BF20(void); +bool8 sub_809BF48(void); +u8 sub_809CA40(void); void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 *a1, u8 a2); void sub_809CFF0(void); @@ -150,7 +181,7 @@ const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/b const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); extern const struct StorageAction gUnknown_083B6DF4[]; -extern const struct PokemonStorageSystemData *gUnknown_083B6DB4; +extern const struct PokemonStorageSystemData *gPokemonStorageSystemPtr; extern u8 *const gUnknown_083B6DB8; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; @@ -571,7 +602,7 @@ void StorageSystemCreatePrimaryMenu(u8 whichMenu) void sub_80961A8(void) { - gUnknown_02038474 = gUnknown_083B6DB4->unk_0005; + gUnknown_02038474 = gPokemonStorageSystemPtr->unk_0005; gFieldCallback = sub_8096130; SetMainCallback2(c2_exit_to_overworld_2_switch); } @@ -899,7 +930,7 @@ void sub_8096884(void) break; case 9: sub_8096874(); - sub_8096BE0(sub_8096BF0); + SetPSSCallback(sub_8096BF0); SetMainCallback2(sub_8096B38); SetVBlankCallback(sub_8096AFC); gMain.state++; @@ -967,7 +998,7 @@ void sub_80969A0(void) break; case 10: sub_8096874(); - sub_8096BE0(sub_8096C68); + SetPSSCallback(sub_8096C68); SetMainCallback2(sub_8096B38); gMain.state++; break; @@ -1007,7 +1038,7 @@ void sub_8096B5C(void) } } -void sub_8096BE0(void (*func)(void)) +void SetPSSCallback(void (*func)(void)) { ePokemonStorageSystem.unk_0000 = func; ePokemonStorageSystem.unk_0004 = 0; @@ -1033,7 +1064,7 @@ void sub_8096BF0(void) break; case 2: if (sub_80C5DCC()) - sub_8096BE0(sub_8096C84); + SetPSSCallback(sub_8096C84); break; } } @@ -1041,7 +1072,174 @@ void sub_8096BF0(void) void sub_8096C68(void) { if (!UpdatePaletteFade()) - sub_8096BE0(sub_8096C84); + SetPSSCallback(sub_8096C84); +} + +void sub_8096C84(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + switch (sub_809CA40()) + { + case 1: + PlaySE(SE_SELECT); + ePokemonStorageSystem.unk_0004 = 1; + break; + case 5: + if (ePokemonStorageSystem.unk_0005 != 2) + { + sub_8098898(16); + ePokemonStorageSystem.unk_0004 = 3; + } + else + { + sub_809B0D4(); + SetPSSCallback(sub_8096FC8); + } + break; + case 6: + if (ePokemonStorageSystem.unk_0005 == 2) + { + if (sub_809BF20() && ItemIsMail(ePokemonStorageSystem.unk_11f2)) + { + ePokemonStorageSystem.unk_0004 = 5; + } + else + { + SetPSSCallback(sub_8097004); + } + } + break; + case 4: + SetPSSCallback(sub_8097BA0); + break; + case 16: + SetPSSCallback(sub_8097CC0); + break; + case 7: + PlaySE(SE_SELECT); + SetPSSCallback(sub_809789C); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097078); + break; + case 9: + PlaySE(SE_SELECT); + ePokemonStorageSystem.unk_08b2 = gPokemonStorage.currentBox + 1; + if (ePokemonStorageSystem.unk_08b2 > 13) + ePokemonStorageSystem.unk_08b2 = 0; + sub_8099C70(ePokemonStorageSystem.unk_08b2); + ePokemonStorageSystem.unk_0004 = 2; + break; + case 10: + PlaySE(SE_SELECT); + ePokemonStorageSystem.unk_08b2 = gPokemonStorage.currentBox - 1; + if (ePokemonStorageSystem.unk_08b2 < 0) + ePokemonStorageSystem.unk_08b2 = 13; + sub_8099C70(ePokemonStorageSystem.unk_08b2); + ePokemonStorageSystem.unk_0004 = 2; + break; + case 11: + if (!sub_809BE80()) + { + if (ItemIsMail(ePokemonStorageSystem.unk_11f2)) + { + ePokemonStorageSystem.unk_0004 = 5; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_809746C); + } + } + else + { + ePokemonStorageSystem.unk_0004 = 4; + } + break; + case 13: + if (sub_809BE80()) + { + ePokemonStorageSystem.unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972A8); + } + break; + case 14: + if (!sub_809BEBC()) + { + ePokemonStorageSystem.unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(c3_0808DC50); + } + break; + case 12: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097390); + break; + case 15: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972FC); + break; + } + break; + case 1: + if (!sub_809AC00()) + { + if (sub_809BF48()) + sub_80986E8(); + else + sub_8098710(); + if (ePokemonStorageSystem.unk_11f6) + BoxSetMosaic(); + ePokemonStorageSystem.unk_0004 = 0; + } + break; + case 2: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = ePokemonStorageSystem.unk_08b2; + if (!gUnknown_0203847C && !sub_809BF20()) + { + sub_809B440(); + BoxSetMosaic(); + } + ePokemonStorageSystem.unk_0004 = 0; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + ePokemonStorageSystem.unk_0004 = 0; + } + break; + case 4: + PlaySE(SE_HAZURE); + sub_8098898(13); + ePokemonStorageSystem.unk_0004 = 6; + break; + case 5: + PlaySE(SE_HAZURE); + sub_8098898(22); + ePokemonStorageSystem.unk_0004 = 6; + break; + case 6: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } } asm(".section .text.8098898"); -- cgit v1.2.3 From 56c2c7ef00396c53a8bc859141b46fa488bb42fa Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 8 Jan 2018 13:39:22 -0700 Subject: through sub_8097078 --- src/pokemon/pokemon_storage_system.c | 190 +++++++++++++++++++++++++++++++++-- 1 file changed, 183 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index b0a317cd9..feed68e50 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -64,7 +64,9 @@ struct PokemonStorageSystemData { u16 unk_11f2; u8 filler_11f4[2]; u8 unk_11f6; - u8 filler_11f7[0xc5]; + u8 filler_11f7[2]; + u8 unk_11f9; + u8 filler_11fa[0xc2]; struct PokemonMarkMenu unk_12bc; struct UnkPSSStruct_2002370 unk_2370; u8 filler_25b4[0xd8]; @@ -90,6 +92,7 @@ void SetPSSCallback(void (*func)(void)); void sub_8096BF0(void); void sub_8096C68(void); void sub_8096C84(void); +void sub_8096FC8(void); void sub_8097004(void); void sub_8097078(void); void sub_80972A8(void); @@ -97,21 +100,26 @@ void sub_80972FC(void); void c3_0808DC50(void); void sub_8097390(void); void sub_809746C(void); +void sub_8097594(void); +void sub_8097788(void); +void sub_80977E4(void); void sub_809789C(void); void sub_8097BA0(void); void sub_8097CC0(void); -void BoxSetMosaic(void); -void sub_80986E8(void); -void sub_8098710(void); -void sub_8098A5C(void); -void sub_809B440(void); -void sub_8096FC8(void); void sub_8097DE0(void); void sub_8097E44(void); void sub_8097E70(void); +void BoxSetMosaic(void); void sub_8098400(void); +void add_to_c3_somehow(void); +bool8 sub_80985CC(void); +void sub_80986E8(void); +void sub_8098710(void); void sub_8098734(void); +void sub_809880C(void); +bool8 sub_8098830(void); void sub_8098898(u8 index); +void sub_8098A5C(void); void sub_8098B48(void); void sub_8099BF8(u8 a0); void sub_8099C70(u8 whichBox); @@ -120,7 +128,10 @@ struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); void sub_809AA24(void); void sub_809AA98(void); bool8 sub_809AC00(void); +void sub_809B0C0(u8 a0); void sub_809B0D4(void); +u8 sub_809B0F4(void); +void sub_809B440(void); void sub_809BBC0(void); void sub_809BD14(void); bool8 sub_809BE80(void); @@ -128,6 +139,8 @@ bool8 sub_809BEBC(void); bool8 sub_809BF20(void); bool8 sub_809BF48(void); u8 sub_809CA40(void); +void sub_809CE84(void); +s16 sub_809CF30(void); void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 *a1, u8 a2); void sub_809CFF0(void); @@ -1242,6 +1255,169 @@ void sub_8096C84(void) } } +void sub_8096FC8(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + sub_809880C(); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!sub_8098830()) + SetPSSCallback(sub_8096C84); + break; + } +} + +void sub_8097004(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + PlaySE(SE_SELECT); + add_to_c3_somehow(); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!sub_80985CC()) + { + sub_809B0C0(sub_809B0F4()); + ePokemonStorageSystem.unk_0004++; + } + break; + case 2: + if (!sub_809AC00()) + { + if (ePokemonStorageSystem.unk_11f6) + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097078(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + sub_8098898(4); + sub_809CE84(); + ePokemonStorageSystem.unk_0004 = 1; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 3: + if (sub_809BE80()) + { + ePokemonStorageSystem.unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972A8); + } + break; + case 5: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972FC); + break; + case 4: + if (!sub_809BEBC()) + { + ePokemonStorageSystem.unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(c3_0808DC50); + } + break; + case 2: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097390); + break; + case 1: + if (sub_809BE80()) + { + ePokemonStorageSystem.unk_0004 = 2; + } + else if (ItemIsMail(ePokemonStorageSystem.unk_11f2)) + { + ePokemonStorageSystem.unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_809746C); + } + break; + case 7: + if (sub_809BE80()) + { + ePokemonStorageSystem.unk_0004 = 2; + } + else if (ePokemonStorageSystem.unk_11f9) + { + ePokemonStorageSystem.unk_0004 = 4; + } + else if (ItemIsMail(ePokemonStorageSystem.unk_11f2)) + { + ePokemonStorageSystem.unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097594); + } + break; + case 6: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097788); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80977E4); + break; + } + break; + case 2: + PlaySE(SE_HAZURE); + sub_8098898(13); + ePokemonStorageSystem.unk_0004 = 5; + break; + case 4: + PlaySE(SE_HAZURE); + sub_8098898(17); + ePokemonStorageSystem.unk_0004 = 5; + break; + case 3: + PlaySE(SE_HAZURE); + sub_8098898(22); + ePokemonStorageSystem.unk_0004 = 5; + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From 673d64c35b21ebb8f3c6fc8b547c7f736fa4f593 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 8 Jan 2018 13:53:24 -0700 Subject: through sub_8097390 --- src/pokemon/pokemon_storage_system.c | 114 +++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index feed68e50..6f51b823e 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -103,6 +103,7 @@ void sub_809746C(void); void sub_8097594(void); void sub_8097788(void); void sub_80977E4(void); +void sub_8097858(void); void sub_809789C(void); void sub_8097BA0(void); void sub_8097CC0(void); @@ -116,10 +117,13 @@ bool8 sub_80985CC(void); void sub_80986E8(void); void sub_8098710(void); void sub_8098734(void); +void sub_80987DC(void); void sub_809880C(void); bool8 sub_8098830(void); void sub_8098898(u8 index); void sub_8098A5C(void); +void sub_809B100(u8 a0); +bool8 sub_809B130(void); void sub_8098B48(void); void sub_8099BF8(u8 a0); void sub_8099C70(u8 whichBox); @@ -130,6 +134,7 @@ void sub_809AA98(void); bool8 sub_809AC00(void); void sub_809B0C0(u8 a0); void sub_809B0D4(void); +void sub_809B0E0(void); u8 sub_809B0F4(void); void sub_809B440(void); void sub_809BBC0(void); @@ -1418,6 +1423,115 @@ void sub_8097078(void) } } +void sub_80972A8(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + sub_809B100(0); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_80972FC(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + sub_809B100(1); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void c3_0808DC50(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + sub_809B100(2); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097390(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + if (CalculatePlayerPartyCount() == 6) + { + sub_8098898(14); + ePokemonStorageSystem.unk_0004 = 1; + } + else + { + sub_809B0E0(); + sub_809B100(0); + ePokemonStorageSystem.unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + if (!sub_809B130()) + { + sub_809880C(); + ePokemonStorageSystem.unk_0004++; + } + break; + case 3: + if (!sub_8098830()) + { + sub_809B100(1); + ePokemonStorageSystem.unk_0004++; + } + break; + case 4: + if (!sub_809B130()) + { + sub_80987DC(); + ePokemonStorageSystem.unk_0004++; + } + break; + case 5: + SetPSSCallback(sub_8097004); + break; + } +} + asm(".section .text.8098898"); void sub_8098898(u8 index) { -- cgit v1.2.3 From 78df16e7989be5142ed0d1fd01c4ece6483f0571 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 8 Jan 2018 14:57:26 -0700 Subject: Through sub_809746C; enums for PC storage actions --- src/pokemon/pokemon_storage_system.c | 182 +++++++++++++++++++++++++++-------- 1 file changed, 144 insertions(+), 38 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 6f51b823e..916dc411a 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -19,6 +19,42 @@ #include "naming_screen.h" #include "pokemon_storage_system.h" +enum { + PC_TEXT_EXIT_BOX, + PC_TEXT_WHAT_YOU_DO, + PC_TEXT_PICK_A_THEME, + PC_TEXT_PICK_A_WALLPAPER, + PC_TEXT_IS_SELECTED, + PC_TEXT_JUMP_TO_WHICH_BOX, + PC_TEXT_DEPOSIT_IN_WHICH_BOX, + PC_TEXT_WAS_DEPOSITED, + PC_TEXT_BOX_IS_FULL, + PC_TEXT_RELEASE_POKE, + PC_TEXT_WAS_RELEASED, + PC_TEXT_BYE_BYE, + PC_TEXT_MARK_POKE, + PC_TEXT_LAST_POKE, + PC_TEXT_PARTY_FULL, + PC_TEXT_HOLDING_POKE, + PC_TEXT_WHICH_ONE_WILL_TAKE, + PC_TEXT_CANT_RELEASE_EGG, + PC_TEXT_CONTINUE_BOX, + PC_TEXT_CAME_BACK, + PC_TEXT_WORRIED, + PC_TEXT_SURPRISE, + PC_TEXT_PLEASE_REMOVE_MAIL +}; + +enum { + PC_TEXT_FMT_NORMAL, + PC_TEXT_FMT_MON_NAME, + PC_TEXT_FMT_UNK_02, + PC_TEXT_FMT_UNK_03, + PC_TEXT_FMT_MON_NAME_2, + PC_TEXT_FMT_UNK_05, + PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK +}; + struct StorageAction { u8 *text; u8 format; @@ -66,7 +102,7 @@ struct PokemonStorageSystemData { u8 unk_11f6; u8 filler_11f7[2]; u8 unk_11f9; - u8 filler_11fa[0xc2]; + u8 unk_11fa[0xc2]; struct PokemonMarkMenu unk_12bc; struct UnkPSSStruct_2002370 unk_2370; u8 filler_25b4[0xd8]; @@ -74,6 +110,9 @@ struct PokemonStorageSystemData { u8 unk_268d; u8 unk_268e; struct Pokemon *unk_2690; + u8 unk_2694[18]; + u8 unk_26a6[62]; + u8 unk_26e4[80]; }; void StorageSystemCreatePrimaryMenu(u8 whichMenu); @@ -120,11 +159,13 @@ void sub_8098734(void); void sub_80987DC(void); void sub_809880C(void); bool8 sub_8098830(void); -void sub_8098898(u8 index); +void PrintStorageActionText(u8 index); void sub_8098A5C(void); void sub_809B100(u8 a0); bool8 sub_809B130(void); void sub_8098B48(void); +void sub_8099310(void); +bool8 sub_8099374(void); void sub_8099BF8(u8 a0); void sub_8099C70(u8 whichBox); bool8 sub_8099D34(void); @@ -137,6 +178,8 @@ void sub_809B0D4(void); void sub_809B0E0(void); u8 sub_809B0F4(void); void sub_809B440(void); +bool8 sub_809B62C(u8); +void sub_809B6BC(void); void sub_809BBC0(void); void sub_809BD14(void); bool8 sub_809BE80(void); @@ -198,7 +241,7 @@ const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/b const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); -extern const struct StorageAction gUnknown_083B6DF4[]; +extern const struct StorageAction gPCStorageActionTexts[]; extern const struct PokemonStorageSystemData *gPokemonStorageSystemPtr; extern u8 *const gUnknown_083B6DB8; @@ -1107,7 +1150,7 @@ void sub_8096C84(void) case 5: if (ePokemonStorageSystem.unk_0005 != 2) { - sub_8098898(16); + PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); ePokemonStorageSystem.unk_0004 = 3; } else @@ -1242,12 +1285,12 @@ void sub_8096C84(void) break; case 4: PlaySE(SE_HAZURE); - sub_8098898(13); + PrintStorageActionText(PC_TEXT_LAST_POKE); ePokemonStorageSystem.unk_0004 = 6; break; case 5: PlaySE(SE_HAZURE); - sub_8098898(22); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); ePokemonStorageSystem.unk_0004 = 6; break; case 6: @@ -1307,7 +1350,7 @@ void sub_8097078(void) switch (ePokemonStorageSystem.unk_0004) { case 0: - sub_8098898(4); + PrintStorageActionText(PC_TEXT_IS_SELECTED); sub_809CE84(); ePokemonStorageSystem.unk_0004 = 1; break; @@ -1400,17 +1443,17 @@ void sub_8097078(void) break; case 2: PlaySE(SE_HAZURE); - sub_8098898(13); + PrintStorageActionText(PC_TEXT_LAST_POKE); ePokemonStorageSystem.unk_0004 = 5; break; case 4: PlaySE(SE_HAZURE); - sub_8098898(17); + PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); ePokemonStorageSystem.unk_0004 = 5; break; case 3: PlaySE(SE_HAZURE); - sub_8098898(22); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); ePokemonStorageSystem.unk_0004 = 5; break; case 5: @@ -1488,7 +1531,7 @@ void sub_8097390(void) case 0: if (CalculatePlayerPartyCount() == 6) { - sub_8098898(14); + PrintStorageActionText(PC_TEXT_PARTY_FULL); ePokemonStorageSystem.unk_0004 = 1; } else @@ -1532,83 +1575,146 @@ void sub_8097390(void) } } +void sub_809746C(void) +{ + u8 r4; + + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + sub_8096264(&ePokemonStorageSystem.unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gUnknown_0203847E); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + r4 = sub_8096368(); + if (r4 == 200); + else if (r4 == 201) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + SetPSSCallback(sub_8096C84); + } + else + { + if (sub_809B62C(r4)) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + ePokemonStorageSystem.unk_0004 = 2; + } + else + { + PrintStorageActionText(PC_TEXT_BOX_IS_FULL); + ePokemonStorageSystem.unk_0004 = 4; + } + gUnknown_0203847E = r4; + } + break; + case 2: + party_compaction(); + sub_8099310(); + ePokemonStorageSystem.unk_0004++; + break; + case 3: + if (!sub_8099374()) + { + sub_809B6BC(); + BoxSetMosaic(); + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + ePokemonStorageSystem.unk_0004 = 1; + } + break; + } +} + asm(".section .text.8098898"); -void sub_8098898(u8 index) { +void PrintStorageActionText(u8 index) { u8 *ptr; MenuDrawTextWindow(10, 16, 29, 19); - switch (gUnknown_083B6DF4[index].format) + switch (gPCStorageActionTexts[index].format) { - case 2: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20011fa); + case PC_TEXT_FMT_UNK_02: + ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, ePokemonStorageSystem.unk_11fa); break; - case 5: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20026e4); + case PC_TEXT_FMT_UNK_05: + ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, ePokemonStorageSystem.unk_26e4); break; - case 1: + case PC_TEXT_FMT_MON_NAME: // {var} + " is selected." - ptr = StringCopy(gUnk2002694, gUnk20011fa); - ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); + ptr = StringCopy(ePokemonStorageSystem.unk_2694, ePokemonStorageSystem.unk_11fa); + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); break; - case 4: + case PC_TEXT_FMT_MON_NAME_2: // {var} + " was released." - ptr = StringCopy(gUnk2002694, gUnk20026e4); + ptr = StringCopy(ePokemonStorageSystem.unk_2694, ePokemonStorageSystem.unk_26e4); #if ENGLISH - ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); #elif GERMAN - ptr = de_sub_8073174(gUnk2002694, gUnknown_083B6DF4[index].text); + ptr = de_sub_8073174(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); #endif break; - case 3: + case PC_TEXT_FMT_UNK_03: { u8 *stringLength; u8 *text; - text = gUnknown_083B6DF4[index].text; + text = gPCStorageActionTexts[index].text; stringLength = &text[StringLength(text)] + 1; - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr, gUnk20011fa); + ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, ePokemonStorageSystem.unk_11fa); ptr = StringCopy(ptr, stringLength); } break; - case 6: + case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK: // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1) { u8 *stringLength; u8 *text; - text = gUnknown_083B6DF4[index].text; + text = gPCStorageActionTexts[index].text; stringLength = &text[StringLength(text)] - 1; - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); - ptr = StringCopy(ptr - 1, gUnk20026e4); + ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr - 1, ePokemonStorageSystem.unk_26e4); ptr = StringCopy(ptr, stringLength); } break; - case 0: + case PC_TEXT_FMT_NORMAL: default: - ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text); + ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); break; } - while (ptr < gUnk20026A6) + while (ptr < ePokemonStorageSystem.unk_26a6) { ptr[0] = CHAR_SPACE; ptr++; } ptr[0] = EOS; - MenuPrint(gUnk2002694, 11, 17); + MenuPrint(ePokemonStorageSystem.unk_2694, 11, 17); } -- cgit v1.2.3 From 882bf5c3cf945927b3049eb8675bf1964d8706e8 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 8 Jan 2018 15:22:37 -0700 Subject: sub_8097594 --- src/pokemon/pokemon_storage_system.c | 144 ++++++++++++++++++++++++++++++++++- 1 file changed, 142 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 916dc411a..9e18dadb5 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -158,14 +158,16 @@ void sub_8098710(void); void sub_8098734(void); void sub_80987DC(void); void sub_809880C(void); +void sub_809801C(void); bool8 sub_8098830(void); void PrintStorageActionText(u8 index); +void sub_8098A38(u8); void sub_8098A5C(void); -void sub_809B100(u8 a0); -bool8 sub_809B130(void); void sub_8098B48(void); void sub_8099310(void); bool8 sub_8099374(void); +void sub_8099958(void); +bool8 sub_8099990(void); void sub_8099BF8(u8 a0); void sub_8099C70(u8 whichBox); bool8 sub_8099D34(void); @@ -177,9 +179,17 @@ void sub_809B0C0(u8 a0); void sub_809B0D4(void); void sub_809B0E0(void); u8 sub_809B0F4(void); +void sub_809B100(u8 a0); +bool8 sub_809B130(void); void sub_809B440(void); bool8 sub_809B62C(u8); void sub_809B6BC(void); +void sub_809B6DC(void); +bool8 sub_809B734(void); +void sub_809B760(void); +void sub_809B7AC(void); +void sub_809B7D4(void); +s8 sub_809B960(void); void sub_809BBC0(void); void sub_809BD14(void); bool8 sub_809BE80(void); @@ -1638,6 +1648,136 @@ void sub_809746C(void) } } +void sub_8097594(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_RELEASE_POKE); + sub_8098A38(1); + ePokemonStorageSystem.unk_0004++; + // fallthrough + case 1: + switch (ProcessMenuInputNoWrap()) + { + case -1: + case 1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + sub_8098A5C(); + sub_809B7D4(); + sub_809B6DC(); + ePokemonStorageSystem.unk_0004++; + break; + } + break; + case 2: + sub_809B960(); + if (!sub_809B734()) + { + while (1) + { + s8 r0 = sub_809B960(); + if (r0 == 1) + { + ePokemonStorageSystem.unk_0004++; + break; + } + if (r0 == 0) + { + ePokemonStorageSystem.unk_0004 = 8; + break; + } + } + } + break; + case 3: + sub_809B760(); + sub_809801C(); + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + ePokemonStorageSystem.unk_0004++; + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_BYE_BYE); + ePokemonStorageSystem.unk_0004++; + } + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + if (gUnknown_0203847C) + { + party_compaction(); + sub_8099310(); + ePokemonStorageSystem.unk_0004++; + } + else + { + ePokemonStorageSystem.unk_0004 = 7; + } + } + break; + case 6: + if (!sub_8099374()) + { + sub_809B440(); + BoxSetMosaic(); + sub_80987DC(); + ePokemonStorageSystem.unk_0004++; + } + break; + case 7: + SetPSSCallback(sub_8096C84); + break; + case 8: + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + ePokemonStorageSystem.unk_0004++; + break; + case 9: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_SURPRISE); + ePokemonStorageSystem.unk_0004++; + } + break; + case 10: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + sub_8099958(); + ePokemonStorageSystem.unk_0004++; + } + break; + case 11: + if (!sub_8099990()) + { + sub_809B7AC(); + PrintStorageActionText(PC_TEXT_CAME_BACK); + ePokemonStorageSystem.unk_0004++; + } + break; + case 12: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_WORRIED); + ePokemonStorageSystem.unk_0004++; + } + break; + case 13: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + asm(".section .text.8098898"); void PrintStorageActionText(u8 index) { -- cgit v1.2.3 From 660fa0c0f38a684eda6c117958447deacac88820 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 8 Jan 2018 15:37:05 -0700 Subject: through sub_8097858 --- src/pokemon/pokemon_storage_system.c | 67 +++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 9e18dadb5..8b0893c73 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -100,7 +100,8 @@ struct PokemonStorageSystemData { u16 unk_11f2; u8 filler_11f4[2]; u8 unk_11f6; - u8 filler_11f7[2]; + u8 unk_11f7; + u8 unk_11f8; u8 unk_11f9; u8 unk_11fa[0xc2]; struct PokemonMarkMenu unk_12bc; @@ -191,7 +192,9 @@ void sub_809B7AC(void); void sub_809B7D4(void); s8 sub_809B960(void); void sub_809BBC0(void); +void sub_809BC18(void); void sub_809BD14(void); +void sub_809BDD8(u8 markings); bool8 sub_809BE80(void); bool8 sub_809BEBC(void); bool8 sub_809BF20(void); @@ -1778,6 +1781,68 @@ void sub_8097594(void) } } +void sub_8097788(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + sub_809BC18(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 0; + ePokemonStorageSystem.unk_0006 = 0; + SetMainCallback2(sub_8096B5C); + } + break; + } +} + +void sub_80977E4(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_MARK_POKE); + ePokemonStorageSystem.unk_12bc.markings = ePokemonStorageSystem.unk_11f7; + sub_80F7418(ePokemonStorageSystem.unk_11f7, 0xb0, 0x10); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!sub_80F7500()) + { + sub_80F7470(); + sub_8098A5C(); + sub_809BDD8(ePokemonStorageSystem.unk_12bc.markings); + sub_809801C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097858(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + party_compaction(); + sub_8099310(); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!sub_8099374()) + { + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + asm(".section .text.8098898"); void PrintStorageActionText(u8 index) { -- cgit v1.2.3 From 2fe1da46d9dda22fbe2184a53f71d5e2b8f03aba Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 8 Jan 2018 21:33:51 -0500 Subject: through sub_8097974 --- src/pokemon/pokemon_storage_system.c | 108 ++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 8b0893c73..0f2350df2 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -96,7 +96,10 @@ struct PokemonStorageSystemData { u8 filler_08b0[2]; s16 unk_08b2; u16 unk_08b4; - u8 filler_08b6[0x93c]; + u8 filler_08b6[0x4a8]; + s16 unk_0d5e; + s16 unk_0d60; + u8 filler_0d62[0x490]; u16 unk_11f2; u8 filler_11f4[2]; u8 unk_11f6; @@ -145,12 +148,16 @@ void sub_8097788(void); void sub_80977E4(void); void sub_8097858(void); void sub_809789C(void); +void sub_8097974(void); +void sub_8097A64(void); +void sub_8097B44(void); void sub_8097BA0(void); void sub_8097CC0(void); void sub_8097DE0(void); void sub_8097E44(void); void sub_8097E70(void); void BoxSetMosaic(void); +void sub_809801C(void); void sub_8098400(void); void add_to_c3_somehow(void); bool8 sub_80985CC(void); @@ -159,11 +166,12 @@ void sub_8098710(void); void sub_8098734(void); void sub_80987DC(void); void sub_809880C(void); -void sub_809801C(void); bool8 sub_8098830(void); void PrintStorageActionText(u8 index); void sub_8098A38(u8); void sub_8098A5C(void); +void sub_8098A80(void); +void sub_8098AA8(u8 a0); void sub_8098B48(void); void sub_8099310(void); bool8 sub_8099374(void); @@ -172,6 +180,9 @@ bool8 sub_8099990(void); void sub_8099BF8(u8 a0); void sub_8099C70(u8 whichBox); bool8 sub_8099D34(void); +void sub_8099DCC(u8 a0); +bool8 sub_8099E08(void); +void sub_809A860(u8 a0); struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); void sub_809AA24(void); void sub_809AA98(void); @@ -1843,6 +1854,99 @@ void sub_8097858(void) } } +void sub_809789C(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); + sub_809CE84(); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_809A860(1); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 11: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097B44); + break; + case 10: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097974); + break; + case 9: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097A64); + break; + } + break; + } +} + +void sub_8097974(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + sub_8098A80(); + PrintStorageActionText(PC_TEXT_PICK_A_THEME); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + ePokemonStorageSystem.unk_0d5e = sub_809CF30(); + switch (ePokemonStorageSystem.unk_0d5e) + { + case -1: + sub_809A860(1); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 12 ... 15: + PlaySE(SE_SELECT); + ePokemonStorageSystem.unk_0d5e -= 12; + sub_8098AA8(ePokemonStorageSystem.unk_0d5e); + PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); + ePokemonStorageSystem.unk_0004++; + break; + } + break; + case 2: + ePokemonStorageSystem.unk_0d60 = sub_809CF30(); + switch (ePokemonStorageSystem.unk_0d60) + { + case -1: + sub_8098A5C(); + ePokemonStorageSystem.unk_0004 = 0; + break; + case -2: + break; + default: + PlaySE(SE_SELECT); + sub_8098A5C(); + ePokemonStorageSystem.unk_0d60 -= 16; + sub_8099DCC(ePokemonStorageSystem.unk_0d60); + ePokemonStorageSystem.unk_0004++; + break; + } + break; + case 3: + if (!sub_8099E08()) + { + sub_809A860(1); + SetPSSCallback(sub_8096C84); + } + break; + } +} + asm(".section .text.8098898"); void PrintStorageActionText(u8 index) { -- cgit v1.2.3 From e2ff8b73c7e17777be8c4065a93e8727768bb914 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 8 Jan 2018 22:05:43 -0500 Subject: through sub_8097BA0; fix calls to pc_screen_effect from scene/hall_of_fame --- src/pokemon/pokemon_storage_system.c | 130 ++++++++++++++++++++++++++++++++++- src/scene/hall_of_fame.c | 35 ++++------ 2 files changed, 140 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 0f2350df2..daae82df6 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -177,6 +177,7 @@ void sub_8099310(void); bool8 sub_8099374(void); void sub_8099958(void); bool8 sub_8099990(void); +void sub_809BB90(void); void sub_8099BF8(u8 a0); void sub_8099C70(u8 whichBox); bool8 sub_8099D34(void); @@ -670,7 +671,7 @@ void ShowPokemonStorageSystem(void) ScriptContext2_Enable(); } -void sub_8096130(void) +void FieldCB_ReturnToOverworld(void) { u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); gTasks[taskId].data[0] = 0; @@ -688,7 +689,7 @@ void StorageSystemCreatePrimaryMenu(u8 whichMenu) void sub_80961A8(void) { gUnknown_02038474 = gPokemonStorageSystemPtr->unk_0005; - gFieldCallback = sub_8096130; + gFieldCallback = FieldCB_ReturnToOverworld; SetMainCallback2(c2_exit_to_overworld_2_switch); } @@ -1947,6 +1948,131 @@ void sub_8097974(void) } } +void sub_8097A64(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); + sub_8096264(&ePokemonStorageSystem.unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gPokemonStorage.currentBox); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + ePokemonStorageSystem.unk_08b2 = sub_8096368(); + switch (ePokemonStorageSystem.unk_08b2) + { + case 200: + break; + default: + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + if (ePokemonStorageSystem.unk_08b2 == 201 || ePokemonStorageSystem.unk_08b2 == gPokemonStorage.currentBox) + { + sub_809A860(1); + SetPSSCallback(sub_8096C84); + } + else + { + ePokemonStorageSystem.unk_0004++; + } + break; + } + break; + case 2: + sub_8099C70(ePokemonStorageSystem.unk_08b2); + ePokemonStorageSystem.unk_0004++; + break; + case 3: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = ePokemonStorageSystem.unk_08b2; + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097B44(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + sub_809BB90(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + ePokemonStorageSystem.unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 1; + ePokemonStorageSystem.unk_0006 = 1; + SetMainCallback2(sub_8096B5C); + } + break; + } +} + +void sub_8097BA0(void) +{ + switch (ePokemonStorageSystem.unk_0004) + { + case 0: + if (sub_809BF20()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + ePokemonStorageSystem.unk_0004 = 1; + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_EXIT_BOX); + sub_8098A38(0); + ePokemonStorageSystem.unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (ProcessMenuInputNoWrap()) + { + case 1: + case -1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + PlaySE(SE_PC_OFF); + sub_8098A5C(); + ePokemonStorageSystem.unk_0004++; + break; + } + break; + case 3: + ePokemonStorageSystem.unk_000c.tileTag = 0x000e; + ePokemonStorageSystem.unk_000c.paletteTag = 0xdad0; + ePokemonStorageSystem.unk_000c.unk04 = 20; + ePokemonStorageSystem.unk_000c.unk06 = 0; + sub_80C5E38(&ePokemonStorageSystem.unk_000c); + ePokemonStorageSystem.unk_0004++; + break; + case 4: + if (sub_80C5F98()) + { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; + } +} + asm(".section .text.8098898"); void PrintStorageActionText(u8 index) { diff --git a/src/scene/hall_of_fame.c b/src/scene/hall_of_fame.c index 812c28137..ef5e6f873 100644 --- a/src/scene/hall_of_fame.c +++ b/src/scene/hall_of_fame.c @@ -90,11 +90,7 @@ static bool8 sub_81438C4(void); // functions from different files void sub_81439D0(void); -void sub_80C5E38(void*); // ? -bool8 sub_80C5DCC(void); -bool8 sub_80C5F98(void); void ReturnFromHallOfFamePC(void); -u16 SpeciesToPokedexNum(u16 species); void remove_some_task(void); // data and gfx @@ -130,9 +126,10 @@ static const s16 sHallOfFame_MonsHalfTeamPositions[3][4] = {-41, 214, 184, 64} }; -static const struct HallofFameMon sDummyFameMon = +static const struct PCScreenEffectStruct sDummyFameMon = { - 0x3EA03EA, 0, 0, 0, {0} + .tileTag = 0x3ea, + .paletteTag = 0x3ea }; static const u8 sUnused2[6] = {2, 1, 3, 6, 4, 5}; @@ -800,20 +797,15 @@ void sub_81428CC(void) } break; case 3: - { - struct HallofFameMons* fameMons; - - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - sub_81435B8(); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + sub_81435B8(); - fameMons = eHallOfFameMons1; - fameMons->mons[0] = sDummyFameMon; + eHOFPCScreenEffect = sDummyFameMon; - sub_80C5CD4((struct PCScreenEffectStruct *)fameMons); - gMain.state++; - } + sub_80C5CD4(&eHOFPCScreenEffect); + gMain.state++; break; case 4: AnimateSprites(); @@ -1022,12 +1014,9 @@ static void sub_8142DF4(u8 taskID) static void sub_8142F78(u8 taskID) { - struct HallofFameMons* fameMons; - CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200); - fameMons = eHallOfFameMons1; - fameMons->mons[0] = sDummyFameMon; - sub_80C5E38(fameMons); + eHOFPCScreenEffect = sDummyFameMon; + sub_80C5E38(&eHOFPCScreenEffect); gTasks[taskID].func = sub_8142FCC; } -- cgit v1.2.3 From ca2fbbad15daa12858d01eb87ab17a8d41eeffa5 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 8 Jan 2018 22:25:48 -0500 Subject: sDummyPCScreenEffect --> sPCScreenEffectTemplate --- src/scene/hall_of_fame.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/scene/hall_of_fame.c b/src/scene/hall_of_fame.c index ef5e6f873..4740c086d 100644 --- a/src/scene/hall_of_fame.c +++ b/src/scene/hall_of_fame.c @@ -126,8 +126,7 @@ static const s16 sHallOfFame_MonsHalfTeamPositions[3][4] = {-41, 214, 184, 64} }; -static const struct PCScreenEffectStruct sDummyFameMon = -{ +static const struct PCScreenEffectStruct sPCScreenEffectTemplate = { .tileTag = 0x3ea, .paletteTag = 0x3ea }; @@ -802,7 +801,7 @@ void sub_81428CC(void) REG_BLDY = 0; sub_81435B8(); - eHOFPCScreenEffect = sDummyFameMon; + eHOFPCScreenEffect = sPCScreenEffectTemplate; sub_80C5CD4(&eHOFPCScreenEffect); gMain.state++; @@ -1015,7 +1014,7 @@ static void sub_8142DF4(u8 taskID) static void sub_8142F78(u8 taskID) { CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200); - eHOFPCScreenEffect = sDummyFameMon; + eHOFPCScreenEffect = sPCScreenEffectTemplate; sub_80C5E38(&eHOFPCScreenEffect); gTasks[taskID].func = sub_8142FCC; } -- cgit v1.2.3 From 7b7f11119ac386e51910b957f855eade7e40381b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 00:15:28 -0500 Subject: through sub_8097DE0 --- src/pokemon/pokemon_storage_system.c | 109 +++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index daae82df6..5fd43cfb8 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -89,6 +89,7 @@ struct PokemonStorageSystemData { u8 unk_0004; u8 unk_0005; u8 unk_0006; + u8 unk_0007; u16 unk_0008; u16 unk_000a; struct PCScreenEffectStruct unk_000c; @@ -266,6 +267,51 @@ const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/b const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); +const u16 gPokemonStorageScrollingBGPalette[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal"); + +const u16 gPokemonStorageScrollingBGTile[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.4bpp"); + +const u8 gPokemonStorageScrollingBGTilemap[] = INCBIN_U8("graphics/pokemon_storage/scrolling_bg_map.bin.lz"); + +const u16 sUnknownTilemap[] = { + 0x1281, + 0x1282, + 0x1283, + 0x1284, + 0x1285, + 0x1286, + 0x1287, + 0x1288, + 0x128C, + 0x128D, + 0x128E, + 0x128F, + 0x1290, + 0x1291, + 0x1292, + 0x1293, + 0x0281, + 0x0282, + 0x0283, + 0x0284, + 0x0285, + 0x0286, + 0x0287, + 0x0288, + 0x028C, + 0x028D, + 0x028E, + 0x028F, + 0x0290, + 0x0291, + 0x0292, + 0x0293, + 0x12AD, + 0x12AE, + 0x12A8, + 0x12A8 +}; + extern const struct StorageAction gPCStorageActionTexts[]; extern const struct PokemonStorageSystemData *gPokemonStorageSystemPtr; extern u8 *const gUnknown_083B6DB8; @@ -2073,6 +2119,69 @@ void sub_8097BA0(void) } } +void sub_8097CC0(void) { + switch (ePokemonStorageSystem.unk_0004) { + case 0: + if (sub_809BF20()) { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + ePokemonStorageSystem.unk_0004 = 1; + } + else { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_CONTINUE_BOX); + sub_8098A38(0); + ePokemonStorageSystem.unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (ProcessMenuInputNoWrap()) { + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case -1: + case 1: + PlaySE(SE_PC_OFF); + sub_8098A5C(); + ePokemonStorageSystem.unk_0004++; + break; + } + break; + case 3: + ePokemonStorageSystem.unk_000c.tileTag = 0x000e; + ePokemonStorageSystem.unk_000c.paletteTag = 0xdad0; + ePokemonStorageSystem.unk_000c.unk04 = 20; + ePokemonStorageSystem.unk_000c.unk06 = 0; + sub_80C5E38(&ePokemonStorageSystem.unk_000c); + ePokemonStorageSystem.unk_0004++; + break; + case 4: + if (sub_80C5F98()) { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; + } +} + +void sub_8097DE0(void) +{ + ePokemonStorageSystem.unk_0007 = 0; + ePokemonStorageSystem.unk_0008 = 0; + ePokemonStorageSystem.unk_000a = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(30); + DmaCopy16Defvars(3, gPokemonStorageScrollingBGTile, BG_SCREEN_ADDR(28), sizeof gPokemonStorageScrollingBGTile); + LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, BG_SCREEN_ADDR(30)); + LoadPalette(gPokemonStorageScrollingBGPalette, 0xd0, 0x10); +} + asm(".section .text.8098898"); void PrintStorageActionText(u8 index) { -- cgit v1.2.3 From 6503d0fee3d9423640f563745692af35f7298c8b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 10:09:55 -0500 Subject: through sub_8097E70; split PSS in 3 --- src/pokemon/pokemon_storage_system.c | 1553 ------------------------------- src/pokemon/pokemon_storage_system_2.c | 1566 ++++++++++++++++++++++++++++++++ src/pokemon/pokemon_storage_system_3.c | 16 + src/pokemon/pokemon_summary_screen.c | 29 +- src/pokenav_before.c | 1 - 5 files changed, 1596 insertions(+), 1569 deletions(-) create mode 100644 src/pokemon/pokemon_storage_system_2.c create mode 100644 src/pokemon/pokemon_storage_system_3.c (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 5fd43cfb8..c91e45d7a 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -3,123 +3,16 @@ #include "constants/songs.h" #include "sound.h" #include "field_weather.h" -#include "mon_markings.h" #include "overworld.h" -#include "mail_data.h" #include "field_fadetransition.h" #include "menu.h" #include "main.h" #include "strings.h" #include "string_util.h" #include "event_data.h" -#include "ewram.h" #include "script.h" -#include "pokemon_summary_screen.h" -#include "pc_screen_effect.h" -#include "naming_screen.h" #include "pokemon_storage_system.h" -enum { - PC_TEXT_EXIT_BOX, - PC_TEXT_WHAT_YOU_DO, - PC_TEXT_PICK_A_THEME, - PC_TEXT_PICK_A_WALLPAPER, - PC_TEXT_IS_SELECTED, - PC_TEXT_JUMP_TO_WHICH_BOX, - PC_TEXT_DEPOSIT_IN_WHICH_BOX, - PC_TEXT_WAS_DEPOSITED, - PC_TEXT_BOX_IS_FULL, - PC_TEXT_RELEASE_POKE, - PC_TEXT_WAS_RELEASED, - PC_TEXT_BYE_BYE, - PC_TEXT_MARK_POKE, - PC_TEXT_LAST_POKE, - PC_TEXT_PARTY_FULL, - PC_TEXT_HOLDING_POKE, - PC_TEXT_WHICH_ONE_WILL_TAKE, - PC_TEXT_CANT_RELEASE_EGG, - PC_TEXT_CONTINUE_BOX, - PC_TEXT_CAME_BACK, - PC_TEXT_WORRIED, - PC_TEXT_SURPRISE, - PC_TEXT_PLEASE_REMOVE_MAIL -}; - -enum { - PC_TEXT_FMT_NORMAL, - PC_TEXT_FMT_MON_NAME, - PC_TEXT_FMT_UNK_02, - PC_TEXT_FMT_UNK_03, - PC_TEXT_FMT_MON_NAME_2, - PC_TEXT_FMT_UNK_05, - PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK -}; - -struct StorageAction { - u8 *text; - u8 format; -}; - -struct PSS_MenuStringPtrs { - const u8 *text; - const u8 *desc; -}; - -struct UnkStruct_2000020 { - struct UnkStruct_2000020 *unk_00; - u8 unk_04; - u8 unk_05; -}; - -struct UnkPSSStruct_2002370 { - struct Sprite *unk_0000; - struct Sprite *unk_0004[4]; - u32 unk_0014[3]; - struct Sprite *unk_0020[2]; - u8 filler_0028[0x214]; - u8 curBox; - u8 unk_023d; - u8 unk_023e; - u16 unk_0240; - u16 unk_0242; -}; // 0244 - -struct PokemonStorageSystemData { - void (*unk_0000)(void); - u8 unk_0004; - u8 unk_0005; - u8 unk_0006; - u8 unk_0007; - u16 unk_0008; - u16 unk_000a; - struct PCScreenEffectStruct unk_000c; - struct UnkStruct_2000020 unk_0020[274]; // refine size later - u8 filler_08b0[2]; - s16 unk_08b2; - u16 unk_08b4; - u8 filler_08b6[0x4a8]; - s16 unk_0d5e; - s16 unk_0d60; - u8 filler_0d62[0x490]; - u16 unk_11f2; - u8 filler_11f4[2]; - u8 unk_11f6; - u8 unk_11f7; - u8 unk_11f8; - u8 unk_11f9; - u8 unk_11fa[0xc2]; - struct PokemonMarkMenu unk_12bc; - struct UnkPSSStruct_2002370 unk_2370; - u8 filler_25b4[0xd8]; - u8 unk_268c; - u8 unk_268d; - u8 unk_268e; - struct Pokemon *unk_2690; - u8 unk_2694[18]; - u8 unk_26a6[62]; - u8 unk_26e4[80]; -}; - void StorageSystemCreatePrimaryMenu(u8 whichMenu); void sub_80963D0(u8 curBox); void sub_809658C(void); @@ -128,95 +21,6 @@ void sub_809662C(void); void sub_809665C(void); void sub_80966F4(const u8 *sourceString, u16 x, u16 y); void sub_8096784(struct Sprite *sprite); -void task_intro_29(u8 whichMenu); -void sub_8096884(void); -void sub_8096AFC(void); -void sub_8096B38(void); -void SetPSSCallback(void (*func)(void)); -void sub_8096BF0(void); -void sub_8096C68(void); -void sub_8096C84(void); -void sub_8096FC8(void); -void sub_8097004(void); -void sub_8097078(void); -void sub_80972A8(void); -void sub_80972FC(void); -void c3_0808DC50(void); -void sub_8097390(void); -void sub_809746C(void); -void sub_8097594(void); -void sub_8097788(void); -void sub_80977E4(void); -void sub_8097858(void); -void sub_809789C(void); -void sub_8097974(void); -void sub_8097A64(void); -void sub_8097B44(void); -void sub_8097BA0(void); -void sub_8097CC0(void); -void sub_8097DE0(void); -void sub_8097E44(void); -void sub_8097E70(void); -void BoxSetMosaic(void); -void sub_809801C(void); -void sub_8098400(void); -void add_to_c3_somehow(void); -bool8 sub_80985CC(void); -void sub_80986E8(void); -void sub_8098710(void); -void sub_8098734(void); -void sub_80987DC(void); -void sub_809880C(void); -bool8 sub_8098830(void); -void PrintStorageActionText(u8 index); -void sub_8098A38(u8); -void sub_8098A5C(void); -void sub_8098A80(void); -void sub_8098AA8(u8 a0); -void sub_8098B48(void); -void sub_8099310(void); -bool8 sub_8099374(void); -void sub_8099958(void); -bool8 sub_8099990(void); -void sub_809BB90(void); -void sub_8099BF8(u8 a0); -void sub_8099C70(u8 whichBox); -bool8 sub_8099D34(void); -void sub_8099DCC(u8 a0); -bool8 sub_8099E08(void); -void sub_809A860(u8 a0); -struct Sprite *sub_809A9A0(u16 a0, u16 a1, u8 a2, u8 a3, u8 a4); -void sub_809AA24(void); -void sub_809AA98(void); -bool8 sub_809AC00(void); -void sub_809B0C0(u8 a0); -void sub_809B0D4(void); -void sub_809B0E0(void); -u8 sub_809B0F4(void); -void sub_809B100(u8 a0); -bool8 sub_809B130(void); -void sub_809B440(void); -bool8 sub_809B62C(u8); -void sub_809B6BC(void); -void sub_809B6DC(void); -bool8 sub_809B734(void); -void sub_809B760(void); -void sub_809B7AC(void); -void sub_809B7D4(void); -s8 sub_809B960(void); -void sub_809BBC0(void); -void sub_809BC18(void); -void sub_809BD14(void); -void sub_809BDD8(u8 markings); -bool8 sub_809BE80(void); -bool8 sub_809BEBC(void); -bool8 sub_809BF20(void); -bool8 sub_809BF48(void); -u8 sub_809CA40(void); -void sub_809CE84(void); -s16 sub_809CF30(void); -void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 *a1, u8 a2); -void sub_809CFF0(void); const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { {PCText_WithdrawPoke, PCText_MovePokeToParty}, @@ -267,73 +71,11 @@ const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/b const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); -const u16 gPokemonStorageScrollingBGPalette[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal"); - -const u16 gPokemonStorageScrollingBGTile[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.4bpp"); - -const u8 gPokemonStorageScrollingBGTilemap[] = INCBIN_U8("graphics/pokemon_storage/scrolling_bg_map.bin.lz"); - -const u16 sUnknownTilemap[] = { - 0x1281, - 0x1282, - 0x1283, - 0x1284, - 0x1285, - 0x1286, - 0x1287, - 0x1288, - 0x128C, - 0x128D, - 0x128E, - 0x128F, - 0x1290, - 0x1291, - 0x1292, - 0x1293, - 0x0281, - 0x0282, - 0x0283, - 0x0284, - 0x0285, - 0x0286, - 0x0287, - 0x0288, - 0x028C, - 0x028D, - 0x028E, - 0x028F, - 0x0290, - 0x0291, - 0x0292, - 0x0293, - 0x12AD, - 0x12AE, - 0x12A8, - 0x12A8 -}; - -extern const struct StorageAction gPCStorageActionTexts[]; -extern const struct PokemonStorageSystemData *gPokemonStorageSystemPtr; -extern u8 *const gUnknown_083B6DB8; - EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; EWRAM_DATA u8 gUnknown_02038470[3] = {}; EWRAM_DATA u8 gUnknown_02038473 = 0; EWRAM_DATA u8 gUnknown_02038474 = 0; EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478 = NULL; -EWRAM_DATA u8 gUnknown_0203847C = 0; -EWRAM_DATA u8 gUnknown_0203847D = 0; -EWRAM_DATA u8 gUnknown_0203847E = 0; -EWRAM_DATA u8 gUnknown_0203847F = 0; -EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; -EWRAM_DATA u8 gUnknown_020384E4 = 0; -EWRAM_DATA u8 gUnknown_020384E5 = 0; -EWRAM_DATA u8 gUnknown_020384E6 = 0; -EWRAM_DATA u8 gUnknown_020384E7 = 0; -EWRAM_DATA u8 gUnknown_020384E8 = 0; -EWRAM_DATA u8 gUnknown_020384E9 = 0; -EWRAM_DATA u16 gUnknown_020384EA = 0; -EWRAM_DATA u32 gUnknown_020384EC = 0; static u8 CountPokemonInBoxN(u8 boxId) { @@ -967,1298 +709,3 @@ void sub_8096784(struct Sprite *sprite) } } } - -void task_intro_29(u8 whichMenu) -{ - gUnknown_0203847D = whichMenu; - ePokemonStorageSystem.unk_0005 = whichMenu; - SetMainCallback2(sub_8096884); -} - -void sub_80967DC(void) -{ - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2VOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; -} - -void sub_8096804(void) -{ - ResetPaletteFade(); - ResetSpriteData(); - FreeSpriteTileRanges(); - FreeAllSpritePalettes(); - ResetTasks(); - gReservedSpriteTileCount = 0x280; - sub_809CFDC(ePokemonStorageSystem.unk_0020, ePokemonStorageSystem.unk_0020 + 1, 8); - gKeyRepeatStartDelay = 20; -} - -void sub_8096848(void) -{ - sub_809B0D4(); - gUnknown_0203847C = (ePokemonStorageSystem.unk_0005 == 1 ? 1 : 0); - gUnknown_0203847E = 0; -} - -void sub_8096874(void) -{ - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; -} - -void sub_8096884(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - sub_8096804(); - gMain.state++; - break; - case 1: - SetUpWindowConfig(&gWindowConfig_81E6D00); - gMain.state++; - break; - case 2: - InitMenuWindow(&gWindowConfig_81E6D00); - MenuZeroFillScreen(); - gMain.state++; - break; - case 3: - sub_80967DC(); - sub_8096848(); - gMain.state++; - break; - case 4: - sub_8098B48(); - sub_809AA24(); - gMain.state++; - break; - case 5: - sub_8097DE0(); - gMain.state++; - break; - case 6: - sub_8097E70(); - gMain.state++; - break; - case 7: - sub_8098400(); - gMain.state++; - break; - case 8: - sub_8099BF8(gPokemonStorage.currentBox); - ePokemonStorageSystem.unk_12bc.baseTileTag = 0x000a; - ePokemonStorageSystem.unk_12bc.basePaletteTag = 0xdacb; - sub_80F727C(&ePokemonStorageSystem.unk_12bc); - sub_80F7404(); - gMain.state++; - break; - case 9: - sub_8096874(); - SetPSSCallback(sub_8096BF0); - SetMainCallback2(sub_8096B38); - SetVBlankCallback(sub_8096AFC); - gMain.state++; - break; - } -} - -void sub_80969A0(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0x0000; - ePokemonStorageSystem.unk_0005 = gUnknown_0203847D; - sub_8096804(); - if (gUnknown_0203847F == 1) - sub_809BBC0(); - if (gUnknown_0203847F == 0) - sub_809BD14(); - gMain.state++; - break; - case 1: - SetUpWindowConfig(&gWindowConfig_81E6D00); - gMain.state++; - break; - case 2: - InitMenuWindow(&gWindowConfig_81E6D00); - MenuZeroFillScreen(); - gMain.state++; - break; - case 3: - sub_80967DC(); - gMain.state++; - break; - case 4: - sub_8098B48(); - sub_809AA98(); - gMain.state++; - break; - case 5: - sub_8097DE0(); - gMain.state++; - break; - case 6: - sub_8097E70(); - gMain.state++; - break; - case 7: - sub_8098400(); - gMain.state++; - break; - case 8: - sub_8099BF8(gPokemonStorage.currentBox); - ePokemonStorageSystem.unk_12bc.baseTileTag = 0x000a; - ePokemonStorageSystem.unk_12bc.basePaletteTag = 0xdacb; - sub_80F727C(&ePokemonStorageSystem.unk_12bc); - sub_80F7404(); - gMain.state++; - break; - case 9: - BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); - SetVBlankCallback(sub_8096AFC); - gMain.state++; - break; - case 10: - sub_8096874(); - SetPSSCallback(sub_8096C68); - SetMainCallback2(sub_8096B38); - gMain.state++; - break; - } -} - -void sub_8096AFC(void) -{ - REG_BG2HOFS = ePokemonStorageSystem.unk_08b4; - REG_BG3HOFS = ePokemonStorageSystem.unk_000a; - REG_BG3VOFS = ePokemonStorageSystem.unk_0008; - LoadOam(); - ProcessSpriteCopyRequests(); - sub_809CFF0(); - TransferPlttBuffer(); -} - -void sub_8096B38(void) -{ - ePokemonStorageSystem.unk_0000(); - sub_8097E44(); - sub_8098734(); - AnimateSprites(); - BuildOamBuffer(); -} - -void sub_8096B5C(void) -{ - switch (ePokemonStorageSystem.unk_0006) - { - case 0: - ShowPokemonSummaryScreen(ePokemonStorageSystem.unk_2690, ePokemonStorageSystem.unk_268d, ePokemonStorageSystem.unk_268c, sub_80969A0, ePokemonStorageSystem.unk_268e); - break; - case 1: - DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); - break; - } -} - -void SetPSSCallback(void (*func)(void)) -{ - ePokemonStorageSystem.unk_0000 = func; - ePokemonStorageSystem.unk_0004 = 0; -} - -void sub_8096BF0(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - BlendPalettes(0xffffffff, 16, 0); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - PlaySE(SE_PC_LOGON); - ePokemonStorageSystem.unk_000c.tileTag = 14; - ePokemonStorageSystem.unk_000c.paletteTag = 0xdad0; - ePokemonStorageSystem.unk_000c.unk04 = 0; - ePokemonStorageSystem.unk_000c.unk06 = 0; - sub_80C5CD4(&ePokemonStorageSystem.unk_000c); - BlendPalettes(0xffffffff, 0, 0); - ePokemonStorageSystem.unk_0004++; - break; - case 2: - if (sub_80C5DCC()) - SetPSSCallback(sub_8096C84); - break; - } -} - -void sub_8096C68(void) -{ - if (!UpdatePaletteFade()) - SetPSSCallback(sub_8096C84); -} - -void sub_8096C84(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - switch (sub_809CA40()) - { - case 1: - PlaySE(SE_SELECT); - ePokemonStorageSystem.unk_0004 = 1; - break; - case 5: - if (ePokemonStorageSystem.unk_0005 != 2) - { - PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); - ePokemonStorageSystem.unk_0004 = 3; - } - else - { - sub_809B0D4(); - SetPSSCallback(sub_8096FC8); - } - break; - case 6: - if (ePokemonStorageSystem.unk_0005 == 2) - { - if (sub_809BF20() && ItemIsMail(ePokemonStorageSystem.unk_11f2)) - { - ePokemonStorageSystem.unk_0004 = 5; - } - else - { - SetPSSCallback(sub_8097004); - } - } - break; - case 4: - SetPSSCallback(sub_8097BA0); - break; - case 16: - SetPSSCallback(sub_8097CC0); - break; - case 7: - PlaySE(SE_SELECT); - SetPSSCallback(sub_809789C); - break; - case 8: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097078); - break; - case 9: - PlaySE(SE_SELECT); - ePokemonStorageSystem.unk_08b2 = gPokemonStorage.currentBox + 1; - if (ePokemonStorageSystem.unk_08b2 > 13) - ePokemonStorageSystem.unk_08b2 = 0; - sub_8099C70(ePokemonStorageSystem.unk_08b2); - ePokemonStorageSystem.unk_0004 = 2; - break; - case 10: - PlaySE(SE_SELECT); - ePokemonStorageSystem.unk_08b2 = gPokemonStorage.currentBox - 1; - if (ePokemonStorageSystem.unk_08b2 < 0) - ePokemonStorageSystem.unk_08b2 = 13; - sub_8099C70(ePokemonStorageSystem.unk_08b2); - ePokemonStorageSystem.unk_0004 = 2; - break; - case 11: - if (!sub_809BE80()) - { - if (ItemIsMail(ePokemonStorageSystem.unk_11f2)) - { - ePokemonStorageSystem.unk_0004 = 5; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_809746C); - } - } - else - { - ePokemonStorageSystem.unk_0004 = 4; - } - break; - case 13: - if (sub_809BE80()) - { - ePokemonStorageSystem.unk_0004 = 4; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_80972A8); - } - break; - case 14: - if (!sub_809BEBC()) - { - ePokemonStorageSystem.unk_0004 = 4; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(c3_0808DC50); - } - break; - case 12: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097390); - break; - case 15: - PlaySE(SE_SELECT); - SetPSSCallback(sub_80972FC); - break; - } - break; - case 1: - if (!sub_809AC00()) - { - if (sub_809BF48()) - sub_80986E8(); - else - sub_8098710(); - if (ePokemonStorageSystem.unk_11f6) - BoxSetMosaic(); - ePokemonStorageSystem.unk_0004 = 0; - } - break; - case 2: - if (!sub_8099D34()) - { - gPokemonStorage.currentBox = ePokemonStorageSystem.unk_08b2; - if (!gUnknown_0203847C && !sub_809BF20()) - { - sub_809B440(); - BoxSetMosaic(); - } - ePokemonStorageSystem.unk_0004 = 0; - } - break; - case 3: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - ePokemonStorageSystem.unk_0004 = 0; - } - break; - case 4: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_LAST_POKE); - ePokemonStorageSystem.unk_0004 = 6; - break; - case 5: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); - ePokemonStorageSystem.unk_0004 = 6; - break; - case 6: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8096FC8(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - sub_809880C(); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!sub_8098830()) - SetPSSCallback(sub_8096C84); - break; - } -} - -void sub_8097004(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - PlaySE(SE_SELECT); - add_to_c3_somehow(); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!sub_80985CC()) - { - sub_809B0C0(sub_809B0F4()); - ePokemonStorageSystem.unk_0004++; - } - break; - case 2: - if (!sub_809AC00()) - { - if (ePokemonStorageSystem.unk_11f6) - BoxSetMosaic(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097078(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_IS_SELECTED); - sub_809CE84(); - ePokemonStorageSystem.unk_0004 = 1; - break; - case 1: - switch (sub_809CF30()) - { - case -1: - case 0: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 3: - if (sub_809BE80()) - { - ePokemonStorageSystem.unk_0004 = 2; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_80972A8); - } - break; - case 5: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_80972FC); - break; - case 4: - if (!sub_809BEBC()) - { - ePokemonStorageSystem.unk_0004 = 2; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(c3_0808DC50); - } - break; - case 2: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097390); - break; - case 1: - if (sub_809BE80()) - { - ePokemonStorageSystem.unk_0004 = 2; - } - else if (ItemIsMail(ePokemonStorageSystem.unk_11f2)) - { - ePokemonStorageSystem.unk_0004 = 3; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_809746C); - } - break; - case 7: - if (sub_809BE80()) - { - ePokemonStorageSystem.unk_0004 = 2; - } - else if (ePokemonStorageSystem.unk_11f9) - { - ePokemonStorageSystem.unk_0004 = 4; - } - else if (ItemIsMail(ePokemonStorageSystem.unk_11f2)) - { - ePokemonStorageSystem.unk_0004 = 3; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097594); - } - break; - case 6: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097788); - break; - case 8: - PlaySE(SE_SELECT); - SetPSSCallback(sub_80977E4); - break; - } - break; - case 2: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_LAST_POKE); - ePokemonStorageSystem.unk_0004 = 5; - break; - case 4: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); - ePokemonStorageSystem.unk_0004 = 5; - break; - case 3: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); - ePokemonStorageSystem.unk_0004 = 5; - break; - case 5: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_80972A8(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - sub_809B100(0); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - if (gUnknown_0203847C) - SetPSSCallback(sub_8097858); - else - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_80972FC(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - sub_809B100(1); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - if (gUnknown_0203847C) - SetPSSCallback(sub_8097858); - else - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void c3_0808DC50(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - sub_809B100(2); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - BoxSetMosaic(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097390(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - if (CalculatePlayerPartyCount() == 6) - { - PrintStorageActionText(PC_TEXT_PARTY_FULL); - ePokemonStorageSystem.unk_0004 = 1; - } - else - { - sub_809B0E0(); - sub_809B100(0); - ePokemonStorageSystem.unk_0004 = 2; - } - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - if (!sub_809B130()) - { - sub_809880C(); - ePokemonStorageSystem.unk_0004++; - } - break; - case 3: - if (!sub_8098830()) - { - sub_809B100(1); - ePokemonStorageSystem.unk_0004++; - } - break; - case 4: - if (!sub_809B130()) - { - sub_80987DC(); - ePokemonStorageSystem.unk_0004++; - } - break; - case 5: - SetPSSCallback(sub_8097004); - break; - } -} - -void sub_809746C(void) -{ - u8 r4; - - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); - sub_8096264(&ePokemonStorageSystem.unk_2370, 0x0007, 0xdaca, 3); - sub_809634C(gUnknown_0203847E); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - r4 = sub_8096368(); - if (r4 == 200); - else if (r4 == 201) - { - sub_8098A5C(); - sub_809635C(); - sub_8096310(); - SetPSSCallback(sub_8096C84); - } - else - { - if (sub_809B62C(r4)) - { - sub_8098A5C(); - sub_809635C(); - sub_8096310(); - ePokemonStorageSystem.unk_0004 = 2; - } - else - { - PrintStorageActionText(PC_TEXT_BOX_IS_FULL); - ePokemonStorageSystem.unk_0004 = 4; - } - gUnknown_0203847E = r4; - } - break; - case 2: - party_compaction(); - sub_8099310(); - ePokemonStorageSystem.unk_0004++; - break; - case 3: - if (!sub_8099374()) - { - sub_809B6BC(); - BoxSetMosaic(); - sub_80987DC(); - SetPSSCallback(sub_8096C84); - } - break; - case 4: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); - ePokemonStorageSystem.unk_0004 = 1; - } - break; - } -} - -void sub_8097594(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_RELEASE_POKE); - sub_8098A38(1); - ePokemonStorageSystem.unk_0004++; - // fallthrough - case 1: - switch (ProcessMenuInputNoWrap()) - { - case -1: - case 1: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 0: - sub_8098A5C(); - sub_809B7D4(); - sub_809B6DC(); - ePokemonStorageSystem.unk_0004++; - break; - } - break; - case 2: - sub_809B960(); - if (!sub_809B734()) - { - while (1) - { - s8 r0 = sub_809B960(); - if (r0 == 1) - { - ePokemonStorageSystem.unk_0004++; - break; - } - if (r0 == 0) - { - ePokemonStorageSystem.unk_0004 = 8; - break; - } - } - } - break; - case 3: - sub_809B760(); - sub_809801C(); - PrintStorageActionText(PC_TEXT_WAS_RELEASED); - ePokemonStorageSystem.unk_0004++; - break; - case 4: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_BYE_BYE); - ePokemonStorageSystem.unk_0004++; - } - break; - case 5: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8098A5C(); - if (gUnknown_0203847C) - { - party_compaction(); - sub_8099310(); - ePokemonStorageSystem.unk_0004++; - } - else - { - ePokemonStorageSystem.unk_0004 = 7; - } - } - break; - case 6: - if (!sub_8099374()) - { - sub_809B440(); - BoxSetMosaic(); - sub_80987DC(); - ePokemonStorageSystem.unk_0004++; - } - break; - case 7: - SetPSSCallback(sub_8096C84); - break; - case 8: - PrintStorageActionText(PC_TEXT_WAS_RELEASED); - ePokemonStorageSystem.unk_0004++; - break; - case 9: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_SURPRISE); - ePokemonStorageSystem.unk_0004++; - } - break; - case 10: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8098A5C(); - sub_8099958(); - ePokemonStorageSystem.unk_0004++; - } - break; - case 11: - if (!sub_8099990()) - { - sub_809B7AC(); - PrintStorageActionText(PC_TEXT_CAME_BACK); - ePokemonStorageSystem.unk_0004++; - } - break; - case 12: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_WORRIED); - ePokemonStorageSystem.unk_0004++; - } - break; - case 13: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097788(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - sub_809BC18(); - BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!UpdatePaletteFade()) - { - gUnknown_0203847F = 0; - ePokemonStorageSystem.unk_0006 = 0; - SetMainCallback2(sub_8096B5C); - } - break; - } -} - -void sub_80977E4(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_MARK_POKE); - ePokemonStorageSystem.unk_12bc.markings = ePokemonStorageSystem.unk_11f7; - sub_80F7418(ePokemonStorageSystem.unk_11f7, 0xb0, 0x10); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!sub_80F7500()) - { - sub_80F7470(); - sub_8098A5C(); - sub_809BDD8(ePokemonStorageSystem.unk_12bc.markings); - sub_809801C(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097858(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - party_compaction(); - sub_8099310(); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!sub_8099374()) - { - sub_80987DC(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_809789C(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); - sub_809CE84(); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - switch (sub_809CF30()) - { - case -1: - case 0: - sub_809A860(1); - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 11: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097B44); - break; - case 10: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097974); - break; - case 9: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097A64); - break; - } - break; - } -} - -void sub_8097974(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - sub_8098A80(); - PrintStorageActionText(PC_TEXT_PICK_A_THEME); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - ePokemonStorageSystem.unk_0d5e = sub_809CF30(); - switch (ePokemonStorageSystem.unk_0d5e) - { - case -1: - sub_809A860(1); - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 12 ... 15: - PlaySE(SE_SELECT); - ePokemonStorageSystem.unk_0d5e -= 12; - sub_8098AA8(ePokemonStorageSystem.unk_0d5e); - PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); - ePokemonStorageSystem.unk_0004++; - break; - } - break; - case 2: - ePokemonStorageSystem.unk_0d60 = sub_809CF30(); - switch (ePokemonStorageSystem.unk_0d60) - { - case -1: - sub_8098A5C(); - ePokemonStorageSystem.unk_0004 = 0; - break; - case -2: - break; - default: - PlaySE(SE_SELECT); - sub_8098A5C(); - ePokemonStorageSystem.unk_0d60 -= 16; - sub_8099DCC(ePokemonStorageSystem.unk_0d60); - ePokemonStorageSystem.unk_0004++; - break; - } - break; - case 3: - if (!sub_8099E08()) - { - sub_809A860(1); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097A64(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); - sub_8096264(&ePokemonStorageSystem.unk_2370, 0x0007, 0xdaca, 3); - sub_809634C(gPokemonStorage.currentBox); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - ePokemonStorageSystem.unk_08b2 = sub_8096368(); - switch (ePokemonStorageSystem.unk_08b2) - { - case 200: - break; - default: - sub_8098A5C(); - sub_809635C(); - sub_8096310(); - if (ePokemonStorageSystem.unk_08b2 == 201 || ePokemonStorageSystem.unk_08b2 == gPokemonStorage.currentBox) - { - sub_809A860(1); - SetPSSCallback(sub_8096C84); - } - else - { - ePokemonStorageSystem.unk_0004++; - } - break; - } - break; - case 2: - sub_8099C70(ePokemonStorageSystem.unk_08b2); - ePokemonStorageSystem.unk_0004++; - break; - case 3: - if (!sub_8099D34()) - { - gPokemonStorage.currentBox = ePokemonStorageSystem.unk_08b2; - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097B44(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - sub_809BB90(); - BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); - ePokemonStorageSystem.unk_0004++; - break; - case 1: - if (!UpdatePaletteFade()) - { - gUnknown_0203847F = 1; - ePokemonStorageSystem.unk_0006 = 1; - SetMainCallback2(sub_8096B5C); - } - break; - } -} - -void sub_8097BA0(void) -{ - switch (ePokemonStorageSystem.unk_0004) - { - case 0: - if (sub_809BF20()) - { - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_HOLDING_POKE); - ePokemonStorageSystem.unk_0004 = 1; - } - else - { - PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_EXIT_BOX); - sub_8098A38(0); - ePokemonStorageSystem.unk_0004 = 2; - } - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - switch (ProcessMenuInputNoWrap()) - { - case 1: - case -1: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 0: - PlaySE(SE_PC_OFF); - sub_8098A5C(); - ePokemonStorageSystem.unk_0004++; - break; - } - break; - case 3: - ePokemonStorageSystem.unk_000c.tileTag = 0x000e; - ePokemonStorageSystem.unk_000c.paletteTag = 0xdad0; - ePokemonStorageSystem.unk_000c.unk04 = 20; - ePokemonStorageSystem.unk_000c.unk06 = 0; - sub_80C5E38(&ePokemonStorageSystem.unk_000c); - ePokemonStorageSystem.unk_0004++; - break; - case 4: - if (sub_80C5F98()) - { - gPlayerPartyCount = CalculatePlayerPartyCount(); - SetMainCallback2(sub_80961A8); - } - break; - } -} - -void sub_8097CC0(void) { - switch (ePokemonStorageSystem.unk_0004) { - case 0: - if (sub_809BF20()) { - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_HOLDING_POKE); - ePokemonStorageSystem.unk_0004 = 1; - } - else { - PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_CONTINUE_BOX); - sub_8098A38(0); - ePokemonStorageSystem.unk_0004 = 2; - } - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - switch (ProcessMenuInputNoWrap()) { - case 0: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case -1: - case 1: - PlaySE(SE_PC_OFF); - sub_8098A5C(); - ePokemonStorageSystem.unk_0004++; - break; - } - break; - case 3: - ePokemonStorageSystem.unk_000c.tileTag = 0x000e; - ePokemonStorageSystem.unk_000c.paletteTag = 0xdad0; - ePokemonStorageSystem.unk_000c.unk04 = 20; - ePokemonStorageSystem.unk_000c.unk06 = 0; - sub_80C5E38(&ePokemonStorageSystem.unk_000c); - ePokemonStorageSystem.unk_0004++; - break; - case 4: - if (sub_80C5F98()) { - gPlayerPartyCount = CalculatePlayerPartyCount(); - SetMainCallback2(sub_80961A8); - } - break; - } -} - -void sub_8097DE0(void) -{ - ePokemonStorageSystem.unk_0007 = 0; - ePokemonStorageSystem.unk_0008 = 0; - ePokemonStorageSystem.unk_000a = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(30); - DmaCopy16Defvars(3, gPokemonStorageScrollingBGTile, BG_SCREEN_ADDR(28), sizeof gPokemonStorageScrollingBGTile); - LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, BG_SCREEN_ADDR(30)); - LoadPalette(gPokemonStorageScrollingBGPalette, 0xd0, 0x10); -} - -asm(".section .text.8098898"); - -void PrintStorageActionText(u8 index) { - u8 *ptr; - - MenuDrawTextWindow(10, 16, 29, 19); - - switch (gPCStorageActionTexts[index].format) - { - - case PC_TEXT_FMT_UNK_02: - ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr, ePokemonStorageSystem.unk_11fa); - break; - - case PC_TEXT_FMT_UNK_05: - ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr, ePokemonStorageSystem.unk_26e4); - break; - - case PC_TEXT_FMT_MON_NAME: - // {var} + " is selected." - ptr = StringCopy(ePokemonStorageSystem.unk_2694, ePokemonStorageSystem.unk_11fa); - ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); - break; - - case PC_TEXT_FMT_MON_NAME_2: - // {var} + " was released." - ptr = StringCopy(ePokemonStorageSystem.unk_2694, ePokemonStorageSystem.unk_26e4); -#if ENGLISH - ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); -#elif GERMAN - ptr = de_sub_8073174(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); -#endif - break; - - case PC_TEXT_FMT_UNK_03: - { - u8 *stringLength; - u8 *text; - - text = gPCStorageActionTexts[index].text; - stringLength = &text[StringLength(text)] + 1; - - ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr, ePokemonStorageSystem.unk_11fa); - ptr = StringCopy(ptr, stringLength); - } - break; - - case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK: - // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1) - { - u8 *stringLength; - u8 *text; - - text = gPCStorageActionTexts[index].text; - stringLength = &text[StringLength(text)] - 1; - - ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr - 1, ePokemonStorageSystem.unk_26e4); - ptr = StringCopy(ptr, stringLength); - } - break; - - case PC_TEXT_FMT_NORMAL: - default: - ptr = StringCopy(ePokemonStorageSystem.unk_2694, gPCStorageActionTexts[index].text); - break; - } - - while (ptr < ePokemonStorageSystem.unk_26a6) - { - ptr[0] = CHAR_SPACE; - ptr++; - } - - ptr[0] = EOS; - MenuPrint(ePokemonStorageSystem.unk_2694, 11, 17); -} diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c new file mode 100644 index 000000000..5c72d02e9 --- /dev/null +++ b/src/pokemon/pokemon_storage_system_2.c @@ -0,0 +1,1566 @@ + +// Includes +#include "global.h" +#include "constants/songs.h" +#include "sound.h" +#include "ewram.h" +#include "task.h" +#include "main.h" +#include "palette.h" +#include "menu.h" +#include "graphics.h" +#include "strings.h" +#include "string_util.h" +#include "pokemon_summary_screen.h" +#include "mail_data.h" +#include "naming_screen.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u8 gUnknown_0203847C = 0; +EWRAM_DATA u8 gUnknown_0203847D = 0; +EWRAM_DATA u8 gUnknown_0203847E = 0; +EWRAM_DATA u8 gUnknown_0203847F = 0; +EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; +EWRAM_DATA u8 gUnknown_020384E4 = 0; +EWRAM_DATA u8 gUnknown_020384E5 = 0; +EWRAM_DATA u8 gUnknown_020384E6 = 0; +EWRAM_DATA u8 gUnknown_020384E7 = 0; +EWRAM_DATA u8 gUnknown_020384E8 = 0; +EWRAM_DATA u8 gUnknown_020384E9 = 0; +EWRAM_DATA u16 gUnknown_020384EA = 0; +EWRAM_DATA u32 gUnknown_020384EC = 0; + +// Static ROM declarations + +void sub_8096884(void); +void sub_8096AFC(void); +void sub_8096B38(void); +void SetPSSCallback(void (*func)(void)); +void sub_8096BF0(void); +void sub_8096C68(void); +void sub_8096C84(void); +void sub_8096FC8(void); +void sub_8097004(void); +void sub_8097078(void); +void sub_80972A8(void); +void sub_80972FC(void); +void c3_0808DC50(void); +void sub_8097390(void); +void sub_809746C(void); +void sub_8097594(void); +void sub_8097788(void); +void sub_80977E4(void); +void sub_8097858(void); +void sub_809789C(void); +void sub_8097974(void); +void sub_8097A64(void); +void sub_8097B44(void); +void sub_8097BA0(void); +void sub_8097CC0(void); +void sub_8097DE0(void); +void sub_8097E44(void); +void sub_8097E70(void); +void sub_8097F58(void); +void sub_8097FB8(void); +void BoxSetMosaic(void); +void sub_809801C(void); +void sub_80980D4(void); +void sub_8098400(void); +void add_to_c3_somehow(void); +bool8 sub_80985CC(void); +void sub_80986E8(void); +void sub_8098710(void); +void sub_8098734(void); +void sub_80987DC(void); +void sub_809880C(void); +bool8 sub_8098830(void); +void PrintStorageActionText(u8 index); +void sub_8098A38(u8); +void sub_8098A5C(void); +void sub_8098A80(void); +void sub_8098AA8(u8 a0); +void sub_8098B48(void); +void sub_8099310(void); +bool8 sub_8099374(void); +void sub_8099958(void); +bool8 sub_8099990(void); +void sub_809BB90(void); +void sub_8099BF8(u8 a0); +void sub_8099C70(u8 whichBox); +bool8 sub_8099D34(void); +void sub_8099DCC(u8 a0); +bool8 sub_8099E08(void); +void sub_809A860(u8 a0); +void sub_809AA24(void); +void sub_809AA98(void); +bool8 sub_809AC00(void); +void sub_809B0C0(u8 a0); +void sub_809B0D4(void); +void sub_809B0E0(void); +u8 sub_809B0F4(void); +void sub_809B100(u8 a0); +bool8 sub_809B130(void); +void sub_809B440(void); +bool8 sub_809B62C(u8); +void sub_809B6BC(void); +void sub_809B6DC(void); +bool8 sub_809B734(void); +void sub_809B760(void); +void sub_809B7AC(void); +void sub_809B7D4(void); +s8 sub_809B960(void); +void sub_809BBC0(void); +void sub_809BC18(void); +void sub_809BD14(void); +void sub_809BDD8(u8 markings); +bool8 sub_809BE80(void); +bool8 sub_809BEBC(void); +bool8 sub_809BF20(void); +bool8 sub_809BF48(void); +u8 sub_809CA40(void); +void sub_809CE84(void); +s16 sub_809CF30(void); +void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 *a1, u8 a2); +void sub_809CFF0(void); +void sub_809D034(void *dest, u16 dLeft, u16 dTop, const void *src, u16 sLeft, u16 sTop, u16 width, u16 height); + +// .rodata + +const u16 gPokemonStorageScrollingBGPalette[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal"); + +const u16 gPokemonStorageScrollingBGTile[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.4bpp"); + +const u8 gPokemonStorageScrollingBGTilemap[] = INCBIN_U8("graphics/pokemon_storage/scrolling_bg_map.bin.lz"); + +const u16 sUnknownTilemap[] = { + 0x1281, + 0x1282, + 0x1283, + 0x1284, + 0x1285, + 0x1286, + 0x1287, + 0x1288, + 0x128C, + 0x128D, + 0x128E, + 0x128F, + 0x1290, + 0x1291, + 0x1292, + 0x1293, + 0x0281, + 0x0282, + 0x0283, + 0x0284, + 0x0285, + 0x0286, + 0x0287, + 0x0288, + 0x028C, + 0x028D, + 0x028E, + 0x028F, + 0x0290, + 0x0291, + 0x0292, + 0x0293, + 0x12AD, + 0x12AE, + 0x12A8, + 0x12A8 +}; + +const u16 WaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal"); + +const u8 WaveformTiles[] = INCBIN_U8("graphics/pokemon_storage/waveform.4bpp"); + +const u16 gUnknown_083B6D74[] = INCBIN_U16("graphics/pokemon_storage/83B6D74.gbapal"); + +const u16 gUnknown_083B6D94[] = INCBIN_U16("graphics/pokemon_storage/83B6D94.gbapal"); + +struct PokemonStorageSystemData *const gPokemonStorageSystemPtr = &ePokemonStorageSystem; + +u8 *const gUnknown_083B6DB8 = gTileBuffer; + +const struct SpritePalette gWaveformSpritePalette = { + WaveformPalette, 0xdacd +}; + +const struct SpriteSheet gWaveformSpriteSheet = { + WaveformTiles, 0x1c0, 0x0005 +}; + +const struct SpriteSheet gUnknown_083B6DCC = { + ePokemonStorageSystem.unk_2784, 0x800, 0x0002 +}; + +const struct SpritePalette gUnknown_083B6DD4 = { + ePokemonStorageSystem.unk_2704, 0xdac7 +}; + +const struct OamData gOamData_83B6EAC; + +const struct SpriteTemplate gSpriteTemplate_83B6DDC = { + 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +const struct StorageAction gPCStorageActionTexts[] = { + {PCText_ExitBox, 0}, + {PCText_WhatYouDo, 0}, + {PCText_PickATheme, 0}, + {PCText_PickAWallpaper, 0}, + {PCText_IsSelected, 1}, + {PCText_JumpToWhichBox, 0}, + {PCText_DepositInWhichBox, 0}, + {PCText_WasDeposited, 1}, + {PCText_BoxIsFull, 0}, + {PCText_ReleasePoke, 0}, + {PCText_WasReleased, 4}, + {PCText_ByeBye, 6}, + {PCText_MarkPoke, 0}, + {PCText_LastPoke, 0}, + {PCText_PartyFull, 0}, + {PCText_HoldingPoke, 0}, + {PCText_WhichOneWillTake, 0}, + {PCText_CantReleaseEgg, 0}, + {PCText_ContinueBox, 0}, + {PCText_CameBack, 1}, + {PCText_Worried, 0}, + {PCText_Surprise, 0}, + {PCText_PleaseRemoveMail, 0} +}; + +// .text + + +void task_intro_29(u8 whichMenu) +{ + gUnknown_0203847D = whichMenu; + gPokemonStorageSystemPtr->unk_0005 = whichMenu; + SetMainCallback2(sub_8096884); +} + +void sub_80967DC(void) +{ + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; +} + +void sub_8096804(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeSpriteTileRanges(); + FreeAllSpritePalettes(); + ResetTasks(); + gReservedSpriteTileCount = 0x280; + sub_809CFDC(gPokemonStorageSystemPtr->unk_0020, gPokemonStorageSystemPtr->unk_0020 + 1, 8); + gKeyRepeatStartDelay = 20; +} + +void sub_8096848(void) +{ + sub_809B0D4(); + gUnknown_0203847C = (gPokemonStorageSystemPtr->unk_0005 == 1 ? 1 : 0); + gUnknown_0203847E = 0; +} + +void sub_8096874(void) +{ + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +void sub_8096884(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + sub_8096804(); + gMain.state++; + break; + case 1: + SetUpWindowConfig(&gWindowConfig_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowConfig_81E6D00); + MenuZeroFillScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + sub_8096848(); + gMain.state++; + break; + case 4: + sub_8098B48(); + sub_809AA24(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; + gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + sub_8096874(); + SetPSSCallback(sub_8096BF0); + SetMainCallback2(sub_8096B38); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + } +} + +void sub_80969A0(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0x0000; + gPokemonStorageSystemPtr->unk_0005 = gUnknown_0203847D; + sub_8096804(); + if (gUnknown_0203847F == 1) + sub_809BBC0(); + if (gUnknown_0203847F == 0) + sub_809BD14(); + gMain.state++; + break; + case 1: + SetUpWindowConfig(&gWindowConfig_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowConfig_81E6D00); + MenuZeroFillScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + gMain.state++; + break; + case 4: + sub_8098B48(); + sub_809AA98(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; + gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + case 10: + sub_8096874(); + SetPSSCallback(sub_8096C68); + SetMainCallback2(sub_8096B38); + gMain.state++; + break; + } +} + +void sub_8096AFC(void) +{ + REG_BG2HOFS = gPokemonStorageSystemPtr->unk_08b4; + REG_BG3HOFS = gPokemonStorageSystemPtr->unk_000a; + REG_BG3VOFS = gPokemonStorageSystemPtr->unk_0008; + LoadOam(); + ProcessSpriteCopyRequests(); + sub_809CFF0(); + TransferPlttBuffer(); +} + +void sub_8096B38(void) +{ + gPokemonStorageSystemPtr->unk_0000(); + sub_8097E44(); + sub_8098734(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_8096B5C(void) +{ + switch (gPokemonStorageSystemPtr->unk_0006) + { + case 0: + ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e); + break; + case 1: + DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); + break; + } +} + +void SetPSSCallback(void (*func)(void)) +{ + gPokemonStorageSystemPtr->unk_0000 = func; + gPokemonStorageSystemPtr->unk_0004 = 0; +} + +void sub_8096BF0(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + BlendPalettes(0xffffffff, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + PlaySE(SE_PC_LOGON); + gPokemonStorageSystemPtr->unk_000c.tileTag = 14; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 0; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5CD4(&gPokemonStorageSystemPtr->unk_000c); + BlendPalettes(0xffffffff, 0, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 2: + if (sub_80C5DCC()) + SetPSSCallback(sub_8096C84); + break; + } +} + +void sub_8096C68(void) +{ + if (!UpdatePaletteFade()) + SetPSSCallback(sub_8096C84); +} + +void sub_8096C84(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + switch (sub_809CA40()) + { + case 1: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_0004 = 1; + break; + case 5: + if (gPokemonStorageSystemPtr->unk_0005 != 2) + { + PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + sub_809B0D4(); + SetPSSCallback(sub_8096FC8); + } + break; + case 6: + if (gPokemonStorageSystemPtr->unk_0005 == 2) + { + if (sub_809BF20() && ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 5; + } + else + { + SetPSSCallback(sub_8097004); + } + } + break; + case 4: + SetPSSCallback(sub_8097BA0); + break; + case 16: + SetPSSCallback(sub_8097CC0); + break; + case 7: + PlaySE(SE_SELECT); + SetPSSCallback(sub_809789C); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097078); + break; + case 9: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox + 1; + if (gPokemonStorageSystemPtr->unk_08b2 > 13) + gPokemonStorageSystemPtr->unk_08b2 = 0; + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004 = 2; + break; + case 10: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox - 1; + if (gPokemonStorageSystemPtr->unk_08b2 < 0) + gPokemonStorageSystemPtr->unk_08b2 = 13; + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004 = 2; + break; + case 11: + if (!sub_809BE80()) + { + if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 5; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_809746C); + } + } + else + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + break; + case 13: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972A8); + } + break; + case 14: + if (!sub_809BEBC()) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(c3_0808DC50); + } + break; + case 12: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097390); + break; + case 15: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972FC); + break; + } + break; + case 1: + if (!sub_809AC00()) + { + if (sub_809BF48()) + sub_80986E8(); + else + sub_8098710(); + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 2: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; + if (!gUnknown_0203847C && !sub_809BF20()) + { + sub_809B440(); + BoxSetMosaic(); + } + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + gPokemonStorageSystemPtr->unk_0004 = 6; + break; + case 5: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + gPokemonStorageSystemPtr->unk_0004 = 6; + break; + case 6: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8096FC8(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809880C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_8098830()) + SetPSSCallback(sub_8096C84); + break; + } +} + +void sub_8097004(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PlaySE(SE_SELECT); + add_to_c3_somehow(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_80985CC()) + { + sub_809B0C0(sub_809B0F4()); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 2: + if (!sub_809AC00()) + { + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097078(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_IS_SELECTED); + sub_809CE84(); + gPokemonStorageSystemPtr->unk_0004 = 1; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 3: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972A8); + } + break; + case 5: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972FC); + break; + case 4: + if (!sub_809BEBC()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(c3_0808DC50); + } + break; + case 2: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097390); + break; + case 1: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_809746C); + } + break; + case 7: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else if (gPokemonStorageSystemPtr->unk_11f9) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097594); + } + break; + case 6: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097788); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80977E4); + break; + } + break; + case 2: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 3: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_80972A8(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_80972FC(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(1); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void c3_0808DC50(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(2); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097390(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + if (CalculatePlayerPartyCount() == 6) + { + PrintStorageActionText(PC_TEXT_PARTY_FULL); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + sub_809B0E0(); + sub_809B100(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + if (!sub_809B130()) + { + sub_809880C(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 3: + if (!sub_8098830()) + { + sub_809B100(1); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 4: + if (!sub_809B130()) + { + sub_80987DC(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 5: + SetPSSCallback(sub_8097004); + break; + } +} + +void sub_809746C(void) +{ + u8 r4; + + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gUnknown_0203847E); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + r4 = sub_8096368(); + if (r4 == 200); + else if (r4 == 201) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + SetPSSCallback(sub_8096C84); + } + else + { + if (sub_809B62C(r4)) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PrintStorageActionText(PC_TEXT_BOX_IS_FULL); + gPokemonStorageSystemPtr->unk_0004 = 4; + } + gUnknown_0203847E = r4; + } + break; + case 2: + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 3: + if (!sub_8099374()) + { + sub_809B6BC(); + BoxSetMosaic(); + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + break; + } +} + +void sub_8097594(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_RELEASE_POKE); + sub_8098A38(1); + gPokemonStorageSystemPtr->unk_0004++; + // fallthrough + case 1: + switch (ProcessMenuInputNoWrap()) + { + case -1: + case 1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + sub_8098A5C(); + sub_809B7D4(); + sub_809B6DC(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 2: + sub_809B960(); + if (!sub_809B734()) + { + while (1) + { + s8 r0 = sub_809B960(); + if (r0 == 1) + { + gPokemonStorageSystemPtr->unk_0004++; + break; + } + if (r0 == 0) + { + gPokemonStorageSystemPtr->unk_0004 = 8; + break; + } + } + } + break; + case 3: + sub_809B760(); + sub_809801C(); + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_BYE_BYE); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + if (gUnknown_0203847C) + { + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + } + else + { + gPokemonStorageSystemPtr->unk_0004 = 7; + } + } + break; + case 6: + if (!sub_8099374()) + { + sub_809B440(); + BoxSetMosaic(); + sub_80987DC(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 7: + SetPSSCallback(sub_8096C84); + break; + case 8: + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 9: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_SURPRISE); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 10: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + sub_8099958(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 11: + if (!sub_8099990()) + { + sub_809B7AC(); + PrintStorageActionText(PC_TEXT_CAME_BACK); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 12: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_WORRIED); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 13: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097788(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809BC18(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 0; + gPokemonStorageSystemPtr->unk_0006 = 0; + SetMainCallback2(sub_8096B5C); + } + break; + } +} + +void sub_80977E4(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_MARK_POKE); + gPokemonStorageSystemPtr->unk_12bc.markings = gPokemonStorageSystemPtr->unk_11f7; + sub_80F7418(gPokemonStorageSystemPtr->unk_11f7, 0xb0, 0x10); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_80F7500()) + { + sub_80F7470(); + sub_8098A5C(); + sub_809BDD8(gPokemonStorageSystemPtr->unk_12bc.markings); + sub_809801C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097858(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_8099374()) + { + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_809789C(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); + sub_809CE84(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_809A860(1); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 11: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097B44); + break; + case 10: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097974); + break; + case 9: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097A64); + break; + } + break; + } +} + +void sub_8097974(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_8098A80(); + PrintStorageActionText(PC_TEXT_PICK_A_THEME); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + gPokemonStorageSystemPtr->unk_0d5e = sub_809CF30(); + switch (gPokemonStorageSystemPtr->unk_0d5e) + { + case -1: + sub_809A860(1); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 12 ... 15: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_0d5e -= 12; + sub_8098AA8(gPokemonStorageSystemPtr->unk_0d5e); + PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 2: + gPokemonStorageSystemPtr->unk_0d60 = sub_809CF30(); + switch (gPokemonStorageSystemPtr->unk_0d60) + { + case -1: + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004 = 0; + break; + case -2: + break; + default: + PlaySE(SE_SELECT); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0d60 -= 16; + sub_8099DCC(gPokemonStorageSystemPtr->unk_0d60); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + if (!sub_8099E08()) + { + sub_809A860(1); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097A64(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); + sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + gPokemonStorageSystemPtr->unk_08b2 = sub_8096368(); + switch (gPokemonStorageSystemPtr->unk_08b2) + { + case 200: + break; + default: + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + if (gPokemonStorageSystemPtr->unk_08b2 == 201 || gPokemonStorageSystemPtr->unk_08b2 == gPokemonStorage.currentBox) + { + sub_809A860(1); + SetPSSCallback(sub_8096C84); + } + else + { + gPokemonStorageSystemPtr->unk_0004++; + } + break; + } + break; + case 2: + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 3: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097B44(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809BB90(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 1; + gPokemonStorageSystemPtr->unk_0006 = 1; + SetMainCallback2(sub_8096B5C); + } + break; + } +} + +void sub_8097BA0(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + if (sub_809BF20()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_EXIT_BOX); + sub_8098A38(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (ProcessMenuInputNoWrap()) + { + case 1: + case -1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + PlaySE(SE_PC_OFF); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 20; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (sub_80C5F98()) + { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; + } +} + +void sub_8097CC0(void) { + switch (gPokemonStorageSystemPtr->unk_0004) { + case 0: + if (sub_809BF20()) { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_CONTINUE_BOX); + sub_8098A38(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (ProcessMenuInputNoWrap()) { + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case -1: + case 1: + PlaySE(SE_PC_OFF); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 20; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (sub_80C5F98()) { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; + } +} + +void sub_8097DE0(void) +{ + gPokemonStorageSystemPtr->unk_0007 = 0; + gPokemonStorageSystemPtr->unk_0008 = 0; + gPokemonStorageSystemPtr->unk_000a = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(30); + DmaCopy16Defvars(3, gPokemonStorageScrollingBGTile, BG_SCREEN_ADDR(28), sizeof gPokemonStorageScrollingBGTile); + LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, BG_SCREEN_ADDR(30)); + LoadPalette(gPokemonStorageScrollingBGPalette, 0xd0, 0x10); +} + +void sub_8097E44(void) +{ + if (++gPokemonStorageSystemPtr->unk_0007 >= 2) + { + gPokemonStorageSystemPtr->unk_0007 = 0; + gPokemonStorageSystemPtr->unk_0008--; + gPokemonStorageSystemPtr->unk_000a++; + } +} + +void sub_8097E70(void) +{ + LZ77UnCompVram(gPSSMenuHeader_Gfx, BG_SCREEN_ADDR(10)); + LZ77UnCompWram(gPSSMenuHeader_Tilemap, gUnknown_02039760); + sub_809D034(BG_SCREEN_ADDR(15), 0, 0, gUnknown_02039760, 0, 0, 10, 20); + LoadPalette(gPSSMenu1_Pal, 0x10, 0x20); + LoadPalette(gPSSMenu2_Pal, 0x00, 0x20); + LoadPalette(gUnknown_083B6D74, 0xB0, 0x20); + LoadPalette(gUnknown_083B6D94, 0xC0, 0x20); + LoadPalette(gUnknownPalette_81E6692 + 1, 0xF1, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 1, 0xF2, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 5, 0xF3, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 12, 0xF4, 0x04); + LoadPalette(gUnknownPalette_81E6692 + 10, 0xF6, 0x04); + LoadPalette(gUnknownPalette_81E6692 + 2, 0xFF, 0x02); + LoadSpritePalette(&gWaveformSpritePalette); + sub_80980D4(); + sub_8097F58(); + sub_8097FB8(); + sub_809801C(); +} + +asm(".section .text.8098898"); + +void PrintStorageActionText(u8 index) { + u8 *ptr; + + MenuDrawTextWindow(10, 16, 29, 19); + + switch (gPCStorageActionTexts[index].format) + { + + case PC_TEXT_FMT_UNK_02: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); + break; + + case PC_TEXT_FMT_UNK_05: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_26e4); + break; + + case PC_TEXT_FMT_MON_NAME: + // {var} + " is selected." + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_11fa); + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); + break; + + case PC_TEXT_FMT_MON_NAME_2: + // {var} + " was released." + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_26e4); +#if ENGLISH + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); +#elif GERMAN + ptr = de_sub_8073174(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); +#endif + break; + + case PC_TEXT_FMT_UNK_03: + { + const u8 *stringLength; + const u8 *text; + + text = gPCStorageActionTexts[index].text; + stringLength = &text[StringLength(text)] + 1; + + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); + ptr = StringCopy(ptr, stringLength); + } + break; + + case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK: + // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1) + { + const u8 *stringLength; + const u8 *text; + + text = gPCStorageActionTexts[index].text; + stringLength = &text[StringLength(text)] - 1; + + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr - 1, gPokemonStorageSystemPtr->unk_26e4); + ptr = StringCopy(ptr, stringLength); + } + break; + + case PC_TEXT_FMT_NORMAL: + default: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + break; + } + + while (ptr < gPokemonStorageSystemPtr->unk_26a6) + { + ptr[0] = CHAR_SPACE; + ptr++; + } + + ptr[0] = EOS; + MenuPrint(gPokemonStorageSystemPtr->unk_2694, 11, 17); +} diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c new file mode 100644 index 000000000..9e0052b89 --- /dev/null +++ b/src/pokemon/pokemon_storage_system_3.c @@ -0,0 +1,16 @@ + +// Includes +#include "global.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u16 gUnknown_02039760[0x600] = {}; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 9563bc08f..fb8363569 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -146,7 +146,6 @@ extern const u8 gUnknown_08E74E88[]; extern const u8 gUnknown_08E73508[]; extern const u8 gStatusScreen_Gfx[]; extern const u8 gFontDefaultPalette[]; -extern const u8 gUnknownPalette_81E6692[]; extern const u8 gAbilityNames[][13]; extern const u8 * const gAbilityDescriptions[]; extern const u8 * const gContestEffectStrings[]; @@ -940,21 +939,21 @@ static bool8 LoadPokemonSummaryScreenGraphics(void) static void sub_809E044(void) { - LoadPalette(&gUnknownPalette_81E6692[28], 129, 2); - LoadPalette(&gUnknownPalette_81E6692[30], 136, 2); - LoadPalette(&gUnknownPalette_81E6692[28], 143, 2); - LoadPalette(&gUnknownPalette_81E6692[30], 137, 2); - LoadPalette(&gUnknownPalette_81E6692[12], 209, 4); - LoadPalette(&gUnknownPalette_81E6692[20], 211, 4); - LoadPalette(&gUnknownPalette_81E6692[28], 213, 4); - LoadPalette(&gUnknownPalette_81E6692[12], 215, 4); - LoadPalette(&gUnknownPalette_81E6692[8], 217, 4); - LoadPalette(&gUnknownPalette_81E6692[16], 219, 4); - LoadPalette(&gUnknownPalette_81E6692[4], 221, 2); - LoadPalette(&gUnknownPalette_81E6692[6], 222, 2); - LoadPalette(&gUnknownPalette_81E6692[2], 223, 2); + LoadPalette(gUnknownPalette_81E6692 + 14, 129, 2); + LoadPalette(gUnknownPalette_81E6692 + 15, 136, 2); + LoadPalette(gUnknownPalette_81E6692 + 14, 143, 2); + LoadPalette(gUnknownPalette_81E6692 + 15, 137, 2); + LoadPalette(gUnknownPalette_81E6692 + 6, 209, 4); + LoadPalette(gUnknownPalette_81E6692 + 10, 211, 4); + LoadPalette(gUnknownPalette_81E6692 + 14, 213, 4); + LoadPalette(gUnknownPalette_81E6692 + 6, 215, 4); + LoadPalette(gUnknownPalette_81E6692 + 4, 217, 4); + LoadPalette(gUnknownPalette_81E6692 + 8, 219, 4); + LoadPalette(gUnknownPalette_81E6692 + 2, 221, 2); + LoadPalette(gUnknownPalette_81E6692 + 3, 222, 2); + LoadPalette(gUnknownPalette_81E6692 + 1, 223, 2); LoadPalette(gFontDefaultPalette, 240, 32); - LoadPalette(&gUnknownPalette_81E6692[6], 249, 2); + LoadPalette(gUnknownPalette_81E6692 + 3, 249, 2); } static void SummaryScreenExit(u8 taskId) diff --git a/src/pokenav_before.c b/src/pokenav_before.c index 8a67390ad..ee5bdb1cb 100644 --- a/src/pokenav_before.c +++ b/src/pokenav_before.c @@ -102,7 +102,6 @@ extern const u16 gPokenavConditionSearch2_Pal[]; extern const u8 gUnknown_083E0334[]; extern const u16 gUnknown_083E02B4[]; extern const u8 gPokenavConditionSearch2_Gfx[]; -extern const u8 gUnknownPalette_81E6692[]; extern const u8 gUnknown_083E0254[]; extern const u8 gUnknown_08E9FEB4[]; extern const u8 gUnknown_083E01AC[]; -- cgit v1.2.3 From 4facfe910285787778666eeee747b4c1c7201d98 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 14:43:24 -0500 Subject: through sub_80980D4 (nonmatching) --- src/pokemon/pokemon_storage_system_2.c | 321 ++++++++++++++++++++++++++++----- 1 file changed, 276 insertions(+), 45 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index 5c72d02e9..f8ae1c013 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -66,9 +66,13 @@ void sub_8097E44(void); void sub_8097E70(void); void sub_8097F58(void); void sub_8097FB8(void); -void BoxSetMosaic(void); void sub_809801C(void); +void BoxSetMosaic(void); +void sub_8098090(struct Sprite *sprite); void sub_80980D4(void); +void sub_80981F0(u16 species, u32 pid); +void sub_80982B4(void); +void sub_8098350(void); void sub_8098400(void); void add_to_c3_somehow(void); bool8 sub_80985CC(void); @@ -191,50 +195,6 @@ const struct SpritePalette gWaveformSpritePalette = { WaveformPalette, 0xdacd }; -const struct SpriteSheet gWaveformSpriteSheet = { - WaveformTiles, 0x1c0, 0x0005 -}; - -const struct SpriteSheet gUnknown_083B6DCC = { - ePokemonStorageSystem.unk_2784, 0x800, 0x0002 -}; - -const struct SpritePalette gUnknown_083B6DD4 = { - ePokemonStorageSystem.unk_2704, 0xdac7 -}; - -const struct OamData gOamData_83B6EAC; - -const struct SpriteTemplate gSpriteTemplate_83B6DDC = { - 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -const struct StorageAction gPCStorageActionTexts[] = { - {PCText_ExitBox, 0}, - {PCText_WhatYouDo, 0}, - {PCText_PickATheme, 0}, - {PCText_PickAWallpaper, 0}, - {PCText_IsSelected, 1}, - {PCText_JumpToWhichBox, 0}, - {PCText_DepositInWhichBox, 0}, - {PCText_WasDeposited, 1}, - {PCText_BoxIsFull, 0}, - {PCText_ReleasePoke, 0}, - {PCText_WasReleased, 4}, - {PCText_ByeBye, 6}, - {PCText_MarkPoke, 0}, - {PCText_LastPoke, 0}, - {PCText_PartyFull, 0}, - {PCText_HoldingPoke, 0}, - {PCText_WhichOneWillTake, 0}, - {PCText_CantReleaseEgg, 0}, - {PCText_ContinueBox, 0}, - {PCText_CameBack, 1}, - {PCText_Worried, 0}, - {PCText_Surprise, 0}, - {PCText_PleaseRemoveMail, 0} -}; - // .text @@ -1484,6 +1444,249 @@ void sub_8097E70(void) sub_809801C(); } +void sub_8097F58(void) +{ + gPokemonStorageSystemPtr->unk_12ac = sub_80F7940(0x000d, 0xdace, 0); + gPokemonStorageSystemPtr->unk_12ac->oam.priority = 0; + gPokemonStorageSystemPtr->unk_12ac->subpriority = 1; + gPokemonStorageSystemPtr->unk_12ac->pos1.x = 0x28; + gPokemonStorageSystemPtr->unk_12ac->pos1.y = 0x95; + gPokemonStorageSystemPtr->unk_12b8 = BG_CHAR_ADDR(4) + 32 * GetSpriteTileStartByTag(0x000d); +} + +const struct SpriteTemplate gSpriteTemplate_83B6EFC; + +void sub_8097FB8(void) +{ + u16 i; + struct SpriteSheet sheet = {WaveformTiles, 0x1c0, 0x0005}; + + LoadSpriteSheet(&sheet); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83B6EFC, i * 63 + 8, 9, 2); + gPokemonStorageSystemPtr->unk_12b0[i] = gSprites + spriteId; + } +} + +void sub_809801C(void) +{ + sub_80981F0(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec); + sub_80982B4(); + sub_8098350(); +} + +void BoxSetMosaic(void) +{ + sub_809801C(); + if (gPokemonStorageSystemPtr->unk_2700) + { + gPokemonStorageSystemPtr->unk_2700->oam.mosaic = TRUE; + gPokemonStorageSystemPtr->unk_2700->data[0] = 10; + gPokemonStorageSystemPtr->unk_2700->data[1] = 1; + gPokemonStorageSystemPtr->unk_2700->callback = sub_8098090; + REG_MOSAIC = (gPokemonStorageSystemPtr->unk_2700->data[0] << 12) | (gPokemonStorageSystemPtr->unk_2700->data[0] << 8); + } +} + +void sub_8098090(struct Sprite *sprite) +{ + sprite->data[0] -= sprite->data[1]; + if (sprite->data[0] < 0) + sprite->data[0] = 0; + REG_MOSAIC = (sprite->data[0] << 12) | (sprite->data[0] << 8); + if (sprite->data[0] == 0) + { + sprite->oam.mosaic = FALSE; + sprite->callback = SpriteCallbackDummy; + } +} + +// sub_80980D4 + +const struct OamData gOamData_83B6EAC; + +#ifdef NONMATCHING +void sub_80980D4(void) +{ + u16 i; + u16 tileStart; + u8 palSlot; + u8 spriteId; + struct SpriteSheet sheet = {gPokemonStorageSystemPtr->unk_2784, 0x800, 0x0002}; + struct SpritePalette palette = {gPokemonStorageSystemPtr->unk_2704, 0xdac7}; + struct SpriteTemplate template = { + 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy + }; + + for (i = 0; i < 0x800; i++) + gPokemonStorageSystemPtr->unk_2784[i] = 0; + for (i = 0; i < 0x10; i++) + gPokemonStorageSystemPtr->unk_2704[i] = 0; + + gPokemonStorageSystemPtr->unk_2700 = NULL; + if ((tileStart = LoadSpriteSheet(&sheet)) != 0 + && (palSlot = LoadSpritePalette(&palette)) != 0xff + && (spriteId = CreateSprite(&template, 0x28, 0x30, 0)) != MAX_SPRITES) + { + // FIXME this gets compiled as a separate block between the palSlot check and the spriteId check + gPokemonStorageSystemPtr->unk_2700 = gSprites + spriteId; + gPokemonStorageSystemPtr->unk_26fa = palSlot * 16 + 0x100; + gPokemonStorageSystemPtr->unk_26fc = BG_CHAR_ADDR(4) + tileStart * 32; + } + + if (gPokemonStorageSystemPtr->unk_2700 == NULL) + { + FreeSpriteTilesByTag(0x0002); + FreeSpritePaletteByTag(0xdac7); + } +} +#else + +const struct SpriteSheet gUnknown_083B6DCC = {ePokemonStorageSystem.unk_2784, 0x800, 0x0002}; +const struct SpritePalette gUnknown_083B6DD4 = {ePokemonStorageSystem.unk_2704, 0xdac7}; +const struct SpriteTemplate gSpriteTemplate_83B6DDC = { + 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +__attribute__((naked)) void sub_80980D4(void) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tsub sp, 0x28\n" + "\tldr r0, _08098150 @ =gUnknown_083B6DCC\n" + "\tldr r1, [r0, 0x4]\n" + "\tldr r0, [r0]\n" + "\tstr r0, [sp, 0x18]\n" + "\tstr r1, [sp, 0x1C]\n" + "\tldr r0, _08098154 @ =gUnknown_083B6DD4\n" + "\tldr r1, [r0, 0x4]\n" + "\tldr r0, [r0]\n" + "\tstr r0, [sp, 0x20]\n" + "\tstr r1, [sp, 0x24]\n" + "\tmov r1, sp\n" + "\tldr r0, _08098158 @ =gSpriteTemplate_83B6DDC\n" + "\tldm r0!, {r2-r4}\n" + "\tstm r1!, {r2-r4}\n" + "\tldm r0!, {r2-r4}\n" + "\tstm r1!, {r2-r4}\n" + "\tmovs r1, 0\n" + "\tadd r5, sp, 0x18\n" + "\tldr r4, _0809815C @ =gSharedMem + 0x2784\n" + "\tmovs r3, 0\n" + "\tldr r2, _08098160 @ =0x000007ff\n" + "_08098102:\n" + "\tadds r0, r1, r4\n" + "\tstrb r3, [r0]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, r2\n" + "\tbls _08098102\n" + "\tmovs r1, 0\n" + "\tldr r3, _08098164 @ =gSharedMem + 0x2704\n" + "\tmovs r2, 0\n" + "_08098116:\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r3\n" + "\tstrh r2, [r0]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0xF\n" + "\tbls _08098116\n" + "\tldr r0, _08098168 @ =gSharedMem\n" + "\tmovs r1, 0x9C\n" + "\tlsls r1, 6\n" + "\tadds r0, r1\n" + "\tmovs r1, 0\n" + "\tstr r1, [r0]\n" + "\tadds r0, r5, 0\n" + "\tbl LoadSpriteSheet\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0\n" + "\tbeq _080981C4\n" + "\tadd r0, sp, 0x20\n" + "\tbl LoadSpritePalette\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0xFF\n" + "\tbeq _080981C4\n" + "\tb _080981B0\n" + "\t.align 2, 0\n" + "_08098150: .4byte gUnknown_083B6DCC\n" + "_08098154: .4byte gUnknown_083B6DD4\n" + "_08098158: .4byte gSpriteTemplate_83B6DDC\n" + "_0809815C: .4byte gSharedMem + 0x2784\n" + "_08098160: .4byte 0x000007ff\n" + "_08098164: .4byte gSharedMem + 0x2704\n" + "_08098168: .4byte gSharedMem\n" + "_0809816C:\n" + "\tldr r2, _0809819C @ =gSharedMem\n" + "\tmovs r0, 0x9C\n" + "\tlsls r0, 6\n" + "\tadds r3, r2, r0\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _080981A0 @ =gSprites\n" + "\tadds r0, r1\n" + "\tstr r0, [r3]\n" + "\tlsls r0, r4, 4\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 1\n" + "\tadds r0, r1\n" + "\tldr r3, _080981A4 @ =0x000026fa\n" + "\tadds r1, r2, r3\n" + "\tstrh r0, [r1]\n" + "\tldr r4, _080981A8 @ =0x000026fc\n" + "\tadds r2, r4\n" + "\tlsls r0, r5, 5\n" + "\tldr r1, _080981AC @ =0x06010000\n" + "\tadds r0, r1\n" + "\tstr r0, [r2]\n" + "\tb _080981C4\n" + "\t.align 2, 0\n" + "_0809819C: .4byte gSharedMem\n" + "_080981A0: .4byte gSprites\n" + "_080981A4: .4byte 0x000026fa\n" + "_080981A8: .4byte 0x000026fc\n" + "_080981AC: .4byte 0x06010000\n" + "_080981B0:\n" + "\tmov r0, sp\n" + "\tmovs r1, 0x28\n" + "\tmovs r2, 0x30\n" + "\tmovs r3, 0\n" + "\tbl CreateSprite\n" + "\tlsls r0, 24\n" + "\tlsrs r1, r0, 24\n" + "\tcmp r1, 0x40\n" + "\tbne _0809816C\n" + "_080981C4:\n" + "\tldr r0, _080981E8 @ =gSharedMem\n" + "\tmovs r2, 0x9C\n" + "\tlsls r2, 6\n" + "\tadds r0, r2\n" + "\tldr r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080981DE\n" + "\tmovs r0, 0x2\n" + "\tbl FreeSpriteTilesByTag\n" + "\tldr r0, _080981EC @ =0x0000dac7\n" + "\tbl FreeSpritePaletteByTag\n" + "_080981DE:\n" + "\tadd sp, 0x28\n" + "\tpop {r4,r5}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080981E8: .4byte gSharedMem\n" + "_080981EC: .4byte 0x0000dac7"); +} +#endif + +extern const struct StorageAction gPCStorageActionTexts[]; + asm(".section .text.8098898"); void PrintStorageActionText(u8 index) { @@ -1564,3 +1767,31 @@ void PrintStorageActionText(u8 index) { ptr[0] = EOS; MenuPrint(gPokemonStorageSystemPtr->unk_2694, 11, 17); } + +// FIXME: move this back + +const struct StorageAction gPCStorageActionTexts[] = { + {PCText_ExitBox, 0}, + {PCText_WhatYouDo, 0}, + {PCText_PickATheme, 0}, + {PCText_PickAWallpaper, 0}, + {PCText_IsSelected, 1}, + {PCText_JumpToWhichBox, 0}, + {PCText_DepositInWhichBox, 0}, + {PCText_WasDeposited, 1}, + {PCText_BoxIsFull, 0}, + {PCText_ReleasePoke, 0}, + {PCText_WasReleased, 4}, + {PCText_ByeBye, 6}, + {PCText_MarkPoke, 0}, + {PCText_LastPoke, 0}, + {PCText_PartyFull, 0}, + {PCText_HoldingPoke, 0}, + {PCText_WhichOneWillTake, 0}, + {PCText_CantReleaseEgg, 0}, + {PCText_ContinueBox, 0}, + {PCText_CameBack, 1}, + {PCText_Worried, 0}, + {PCText_Surprise, 0}, + {PCText_PleaseRemoveMail, 0} +}; -- cgit v1.2.3 From ebae5167939d1a10a2a37324063bb4f70c43a4ea Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 17:29:50 -0500 Subject: through sub_8098350 --- src/pokemon/pokemon_storage_system_2.c | 58 ++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index f8ae1c013..7f97d7681 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -1,7 +1,10 @@ // Includes #include "global.h" +#include "decompress.h" #include "constants/songs.h" +#include "constants/species.h" +#include "data2.h" #include "sound.h" #include "ewram.h" #include "task.h" @@ -1685,6 +1688,61 @@ __attribute__((naked)) void sub_80980D4(void) } #endif +void sub_80981F0(u16 species, u32 pid) +{ + if (gPokemonStorageSystemPtr->unk_2700) + { + if (species != SPECIES_NONE) + { + HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, 1, (intptr_t)gPokemonStorageSystemPtr->unk_4784, gPokemonStorageSystemPtr->unk_2784, species, pid); + LZ77UnCompWram(gPokemonStorageSystemPtr->unk_11e8, gPokemonStorageSystemPtr->unk_2704); + CpuCopy32(gPokemonStorageSystemPtr->unk_2784, gPokemonStorageSystemPtr->unk_26fc, 0x800); + LoadPalette(gPokemonStorageSystemPtr->unk_2704, gPokemonStorageSystemPtr->unk_26fa, 0x20); + gPokemonStorageSystemPtr->unk_2700->invisible = FALSE; + } + else + { + gPokemonStorageSystemPtr->unk_2700->invisible = TRUE; + } + } +} + +void sub_80982B4(void) +{ + if (gPokemonStorageSystemPtr->unk_11f0) + { + sub_80F7A10(gPokemonStorageSystemPtr->unk_11f7, gPokemonStorageSystemPtr->unk_12b8); + gPokemonStorageSystemPtr->unk_12ac->invisible = FALSE; + } + else + { + gPokemonStorageSystemPtr->unk_12ac->invisible = TRUE; + } + MenuZeroFillWindowRect(0, 11, 9, 17); + MenuPrint(gPokemonStorageSystemPtr->unk_127a, 1, 16); + MenuPrint(gPokemonStorageSystemPtr->unk_120f, 1, 11); + MenuPrint(gPokemonStorageSystemPtr->unk_1234, 0, 13); + MenuPrint(gPokemonStorageSystemPtr->unk_1259, 1, 15); +} + +void sub_8098350(void) +{ + u16 i; + + if (gPokemonStorageSystemPtr->unk_11f0) + { + sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 1, 0, 8, 2); + for (i = 0; i < 2; i++) + StartSpriteAnimIfDifferent(gPokemonStorageSystemPtr->unk_12b0[i], i * 2 + 1); + } + else + { + sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 10, 0, 8, 2); + for (i = 0; i < 2; i++) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_12b0[i], i * 2); + } +} + extern const struct StorageAction gPCStorageActionTexts[]; asm(".section .text.8098898"); -- cgit v1.2.3 From 2eb10c6f2d16729dde12b0fd26cac3f45b85a557 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 20:18:46 -0500 Subject: close swiss cheese in pokemon_storage_system_2.c --- src/pokemon/pokemon_storage_system_2.c | 282 +++++++++++++++++++++++++++++---- 1 file changed, 255 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index 7f97d7681..ff6f1f587 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -78,6 +78,9 @@ void sub_80982B4(void); void sub_8098350(void); void sub_8098400(void); void add_to_c3_somehow(void); +void sub_8098780(void); +void sub_8098690(bool8 flag); +void sub_8099200(u8 a0); bool8 sub_80985CC(void); void sub_80986E8(void); void sub_8098710(void); @@ -93,6 +96,8 @@ void sub_8098AA8(u8 a0); void sub_8098B48(void); void sub_8099310(void); bool8 sub_8099374(void); +void sub_80994A8(s16 a0); +void sub_809954C(void); void sub_8099958(void); bool8 sub_8099990(void); void sub_809BB90(void); @@ -109,6 +114,7 @@ void sub_809B0C0(u8 a0); void sub_809B0D4(void); void sub_809B0E0(void); u8 sub_809B0F4(void); +void sub_809B068(void); void sub_809B100(u8 a0); bool8 sub_809B130(void); void sub_809B440(void); @@ -134,6 +140,8 @@ s16 sub_809CF30(void); void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 *a1, u8 a2); void sub_809CFF0(void); void sub_809D034(void *dest, u16 dLeft, u16 dTop, const void *src, u16 sLeft, u16 sTop, u16 width, u16 height); +void sub_809D104(void *dest, u16 dLeft, u16 dTop, const void *src, u16 sLeft, u16 sTop, u16 width, u16 height); +void sub_809D16C(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height); // .rodata @@ -1743,9 +1751,192 @@ void sub_8098350(void) } } -extern const struct StorageAction gPCStorageActionTexts[]; +void sub_8098400(void) +{ + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(15); + LZ77UnCompVram(gPSSMenuMisc_Gfx, BG_SCREEN_ADDR(13)); + LZ77UnCompWram(gPSSMenuMisc_Tilemap, gPokemonStorageSystemPtr->unk_00a8); + LoadPalette(gPSSMenu3_Pal, 0x20, 0x20); + LoadPalette(gPSSMenu4_Pal, 0x30, 0x20); + DmaClear16(3, BG_SCREEN_ADDR(15), 0x800); + sub_8098780(); + if (gUnknown_0203847C) + { + sub_8098690(TRUE); + sub_8099200(1); + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); + } + else + { + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 20, 12, 2); + sub_8098690(TRUE); + } + gPokemonStorageSystemPtr->unk_08af = 0; +} + +void sub_80984E8(void) +{ + gPokemonStorageSystemPtr->unk_08a8 = 20; + gPokemonStorageSystemPtr->unk_08aa = 2; + gPokemonStorageSystemPtr->unk_08ad = 0; + sub_8099200(0); +} + +bool8 sub_8098520(void) +{ + if (gPokemonStorageSystemPtr->unk_08ad == 20) + return FALSE; + gPokemonStorageSystemPtr->unk_08a8--; + gPokemonStorageSystemPtr->unk_08aa++; + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa); + sub_80994A8(8); + if (++gPokemonStorageSystemPtr->unk_08ad == 20) + { + gUnknown_0203847C = 1; + return FALSE; + } + return TRUE; +} + +void add_to_c3_somehow(void) +{ + gPokemonStorageSystemPtr->unk_08a8 = 0; + gPokemonStorageSystemPtr->unk_08aa = 22; + gPokemonStorageSystemPtr->unk_08ad = 0; +} + +bool8 sub_80985CC(void) +{ + if (gPokemonStorageSystemPtr->unk_08ad == 20) + return FALSE; + gPokemonStorageSystemPtr->unk_08a8++; + gPokemonStorageSystemPtr->unk_08aa--; + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa); + sub_809D16C(BG_SCREEN_ADDR(15), 10, gPokemonStorageSystemPtr->unk_08aa, 12, 1); + sub_80994A8(-8); + if (++gPokemonStorageSystemPtr->unk_08ad == 20) + { + gUnknown_0203847C = 0; + sub_809954C(); + party_compaction(); + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 1, 2); + return FALSE; + } + return TRUE; +} + +void sub_8098690(bool8 flag) +{ + if (flag) + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 9, 2); + else + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 2, 9, 2); +} + +void sub_80986E8(void) +{ + gPokemonStorageSystemPtr->unk_08af = 1; + gPokemonStorageSystemPtr->unk_08b0 = 30; + gPokemonStorageSystemPtr->unk_08b1 = 1; +} + +void sub_8098710(void) +{ + if (gPokemonStorageSystemPtr->unk_08af) + { + gPokemonStorageSystemPtr->unk_08af = 0; + sub_8098690(TRUE); + } +} + +void sub_8098734(void) +{ + if (gPokemonStorageSystemPtr->unk_08af && ++gPokemonStorageSystemPtr->unk_08b0 > 30) + { + gPokemonStorageSystemPtr->unk_08b0 = 0; + gPokemonStorageSystemPtr->unk_08b1 = gPokemonStorageSystemPtr->unk_08b1 ? FALSE : TRUE; + sub_8098690(gPokemonStorageSystemPtr->unk_08b1); + } +} + +void sub_8098780(void) +{ + int i; + + for (i = 1; i < PARTY_SIZE; i++) + { + u16 r1; + bool32 r0 = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); + if (r0) + r0 = TRUE; + r1 = r0 ? 12 : 16; + sub_809D104(gPokemonStorageSystemPtr->unk_00a8, 7, (i - 1) * 3 + 1, gPokemonStorageSystemPtr->unk_00a8, r1, 4, 4, 3); + } +} + +void sub_80987DC(void) +{ + sub_8098780(); + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); +} + +void sub_809880C(void) +{ + gPokemonStorageSystemPtr->unk_08ae = 0; + PlaySE(SE_WIN_OPEN); + sub_80984E8(); +} + +bool8 sub_8098830(void) +{ + switch (gPokemonStorageSystemPtr->unk_08ae) + { + case 0: + if (!sub_8098520()) + { + sub_809B068(); + gPokemonStorageSystemPtr->unk_08ae++; + } + break; + case 1: + if (!sub_809AC00()) + { + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_08ae++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} -asm(".section .text.8098898"); +const struct StorageAction gPCStorageActionTexts[] = { + {PCText_ExitBox, 0}, + {PCText_WhatYouDo, 0}, + {PCText_PickATheme, 0}, + {PCText_PickAWallpaper, 0}, + {PCText_IsSelected, 1}, + {PCText_JumpToWhichBox, 0}, + {PCText_DepositInWhichBox, 0}, + {PCText_WasDeposited, 1}, + {PCText_BoxIsFull, 0}, + {PCText_ReleasePoke, 0}, + {PCText_WasReleased, 4}, + {PCText_ByeBye, 6}, + {PCText_MarkPoke, 0}, + {PCText_LastPoke, 0}, + {PCText_PartyFull, 0}, + {PCText_HoldingPoke, 0}, + {PCText_WhichOneWillTake, 0}, + {PCText_CantReleaseEgg, 0}, + {PCText_ContinueBox, 0}, + {PCText_CameBack, 1}, + {PCText_Worried, 0}, + {PCText_Surprise, 0}, + {PCText_PleaseRemoveMail, 0} +}; void PrintStorageActionText(u8 index) { u8 *ptr; @@ -1826,30 +2017,67 @@ void PrintStorageActionText(u8 index) { MenuPrint(gPokemonStorageSystemPtr->unk_2694, 11, 17); } -// FIXME: move this back +const struct OamData gOamData_83B6EAC = { + .size = 3 +}; -const struct StorageAction gPCStorageActionTexts[] = { - {PCText_ExitBox, 0}, - {PCText_WhatYouDo, 0}, - {PCText_PickATheme, 0}, - {PCText_PickAWallpaper, 0}, - {PCText_IsSelected, 1}, - {PCText_JumpToWhichBox, 0}, - {PCText_DepositInWhichBox, 0}, - {PCText_WasDeposited, 1}, - {PCText_BoxIsFull, 0}, - {PCText_ReleasePoke, 0}, - {PCText_WasReleased, 4}, - {PCText_ByeBye, 6}, - {PCText_MarkPoke, 0}, - {PCText_LastPoke, 0}, - {PCText_PartyFull, 0}, - {PCText_HoldingPoke, 0}, - {PCText_WhichOneWillTake, 0}, - {PCText_CantReleaseEgg, 0}, - {PCText_ContinueBox, 0}, - {PCText_CameBack, 1}, - {PCText_Worried, 0}, - {PCText_Surprise, 0}, - {PCText_PleaseRemoveMail, 0} +const struct OamData gOamData_83B6EB4 = { + .shape = ST_OAM_H_RECTANGLE +}; + +const union AnimCmd gSpriteAnim_83B6EBC[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6EC4[] = { + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gSpriteAnim_83B6ED4[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6EDC[] = { + ANIMCMD_FRAME(10, 8), + ANIMCMD_FRAME( 4, 8), + ANIMCMD_FRAME(12, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gSpriteAnimTable_83B6EEC[] = { + gSpriteAnim_83B6EBC, + gSpriteAnim_83B6EC4, + gSpriteAnim_83B6ED4, + gSpriteAnim_83B6EDC +}; + +const struct SpriteTemplate gSpriteTemplate_83B6EFC = { + 0x0005, + 0xdacd, + &gOamData_83B6EB4, + gSpriteAnimTable_83B6EEC, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_83B6F2C; + +const struct SpriteTemplate gSpriteTemplate_83B6F14 = { + 0x000f, + 0xdac0, + &gOamData_83B6F2C, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_83B6F2C = { + .size = 2 }; -- cgit v1.2.3 From f361bbd3e63a0b342ddfbd4c4c8d9e5a7536d2cc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 20:30:32 -0500 Subject: finish pokemon_storage_system_2.c --- src/pokemon/pokemon_storage_system_2.c | 107 ++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 50 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index ff6f1f587..474f16323 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -89,59 +89,10 @@ void sub_80987DC(void); void sub_809880C(void); bool8 sub_8098830(void); void PrintStorageActionText(u8 index); -void sub_8098A38(u8); +void sub_8098A38(s8); void sub_8098A5C(void); void sub_8098A80(void); void sub_8098AA8(u8 a0); -void sub_8098B48(void); -void sub_8099310(void); -bool8 sub_8099374(void); -void sub_80994A8(s16 a0); -void sub_809954C(void); -void sub_8099958(void); -bool8 sub_8099990(void); -void sub_809BB90(void); -void sub_8099BF8(u8 a0); -void sub_8099C70(u8 whichBox); -bool8 sub_8099D34(void); -void sub_8099DCC(u8 a0); -bool8 sub_8099E08(void); -void sub_809A860(u8 a0); -void sub_809AA24(void); -void sub_809AA98(void); -bool8 sub_809AC00(void); -void sub_809B0C0(u8 a0); -void sub_809B0D4(void); -void sub_809B0E0(void); -u8 sub_809B0F4(void); -void sub_809B068(void); -void sub_809B100(u8 a0); -bool8 sub_809B130(void); -void sub_809B440(void); -bool8 sub_809B62C(u8); -void sub_809B6BC(void); -void sub_809B6DC(void); -bool8 sub_809B734(void); -void sub_809B760(void); -void sub_809B7AC(void); -void sub_809B7D4(void); -s8 sub_809B960(void); -void sub_809BBC0(void); -void sub_809BC18(void); -void sub_809BD14(void); -void sub_809BDD8(u8 markings); -bool8 sub_809BE80(void); -bool8 sub_809BEBC(void); -bool8 sub_809BF20(void); -bool8 sub_809BF48(void); -u8 sub_809CA40(void); -void sub_809CE84(void); -s16 sub_809CF30(void); -void sub_809CFDC(struct UnkStruct_2000020 *a0, struct UnkStruct_2000020 *a1, u8 a2); -void sub_809CFF0(void); -void sub_809D034(void *dest, u16 dLeft, u16 dTop, const void *src, u16 sLeft, u16 sTop, u16 width, u16 height); -void sub_809D104(void *dest, u16 dLeft, u16 dTop, const void *src, u16 sLeft, u16 sTop, u16 width, u16 height); -void sub_809D16C(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height); // .rodata @@ -2081,3 +2032,59 @@ const struct SpriteTemplate gSpriteTemplate_83B6F14 = { const struct OamData gOamData_83B6F2C = { .size = 2 }; + +void sub_8098A38(s8 a0) +{ + DisplayYesNoMenu(23, 10, 0); + MoveMenuCursor(a0); +} + +void sub_8098A5C(void) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(10, 16, 29, 19); + MenuZeroFillWindowRect(23, 10, 29, 15); +} + +void sub_8098A80(void) +{ + sub_809CDCC(); + sub_809CDEC(12); + sub_809CDEC(13); + sub_809CDEC(14); + sub_809CDEC(15); + sub_809CE84(); +} + +void sub_8098AA8(u8 a0) +{ + sub_809CDCC(); + switch (a0) + { + case 0: + sub_809CDEC(16); + sub_809CDEC(17); + sub_809CDEC(18); + sub_809CDEC(19); + break; + case 1: + sub_809CDEC(20); + sub_809CDEC(21); + sub_809CDEC(22); + sub_809CDEC(23); + break; + case 2: + sub_809CDEC(24); + sub_809CDEC(25); + sub_809CDEC(26); + sub_809CDEC(27); + break; + case 3: + sub_809CDEC(28); + sub_809CDEC(29); + sub_809CDEC(30); + sub_809CDEC(31); + break; + } + sub_809CE84(); +} -- cgit v1.2.3 From c4244f5bec27741c18a12611f245df5572b11d8b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 21:18:42 -0500 Subject: through sub_8098BF0 --- src/pokemon/pokemon_storage_system.c | 14 ++++----- src/pokemon/pokemon_storage_system_2.c | 27 ------------------ src/pokemon/pokemon_storage_system_3.c | 52 ++++++++++++++++++++++++++++++++-- src/pokemon/pokemon_storage_system_4.c | 23 +++++++++++++++ src/pokemon/pokemon_storage_system_5.c | 16 +++++++++++ 5 files changed, 96 insertions(+), 36 deletions(-) create mode 100644 src/pokemon/pokemon_storage_system_4.c create mode 100644 src/pokemon/pokemon_storage_system_5.c (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index c91e45d7a..aebd13498 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -22,6 +22,12 @@ void sub_809665C(void); void sub_80966F4(const u8 *sourceString, u16 x, u16 y); void sub_8096784(struct Sprite *sprite); +EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; +EWRAM_DATA u8 gUnknown_02038470[3] = {}; +EWRAM_DATA u8 gUnknown_02038473 = 0; +EWRAM_DATA u8 gUnknown_02038474 = 0; +EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478 = NULL; + const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { {PCText_WithdrawPoke, PCText_MovePokeToParty}, {PCText_DepositPoke, PCText_StorePokeInBox}, @@ -71,13 +77,7 @@ const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/b const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); -EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; -EWRAM_DATA u8 gUnknown_02038470[3] = {}; -EWRAM_DATA u8 gUnknown_02038473 = 0; -EWRAM_DATA u8 gUnknown_02038474 = 0; -EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478 = NULL; - -static u8 CountPokemonInBoxN(u8 boxId) +u8 CountPokemonInBoxN(u8 boxId) { u16 i; u16 count; diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index 474f16323..2947562d0 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -27,15 +27,6 @@ EWRAM_DATA u8 gUnknown_0203847C = 0; EWRAM_DATA u8 gUnknown_0203847D = 0; EWRAM_DATA u8 gUnknown_0203847E = 0; EWRAM_DATA u8 gUnknown_0203847F = 0; -EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; -EWRAM_DATA u8 gUnknown_020384E4 = 0; -EWRAM_DATA u8 gUnknown_020384E5 = 0; -EWRAM_DATA u8 gUnknown_020384E6 = 0; -EWRAM_DATA u8 gUnknown_020384E7 = 0; -EWRAM_DATA u8 gUnknown_020384E8 = 0; -EWRAM_DATA u8 gUnknown_020384E9 = 0; -EWRAM_DATA u16 gUnknown_020384EA = 0; -EWRAM_DATA u32 gUnknown_020384EC = 0; // Static ROM declarations @@ -80,7 +71,6 @@ void sub_8098400(void); void add_to_c3_somehow(void); void sub_8098780(void); void sub_8098690(bool8 flag); -void sub_8099200(u8 a0); bool8 sub_80985CC(void); void sub_80986E8(void); void sub_8098710(void); @@ -159,7 +149,6 @@ const struct SpritePalette gWaveformSpritePalette = { // .text - void task_intro_29(u8 whichMenu) { gUnknown_0203847D = whichMenu; @@ -2017,22 +2006,6 @@ const struct SpriteTemplate gSpriteTemplate_83B6EFC = { SpriteCallbackDummy }; -const struct OamData gOamData_83B6F2C; - -const struct SpriteTemplate gSpriteTemplate_83B6F14 = { - 0x000f, - 0xdac0, - &gOamData_83B6F2C, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -const struct OamData gOamData_83B6F2C = { - .size = 2 -}; - void sub_8098A38(s8 a0) { DisplayYesNoMenu(23, 10, 0); diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index 9e0052b89..eff542756 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -1,16 +1,64 @@ // Includes #include "global.h" +#include "sprite.h" +#include "pokemon_icon.h" #include "pokemon_storage_system.h" // Static type declarations // Static RAM declarations -EWRAM_DATA u16 gUnknown_02039760[0x600] = {}; - // Static ROM declarations +void sub_80999C4(struct Sprite *sprite); +struct Sprite *sub_8099AFC(u16 species, u32 personality, u16 a2, u16 a3, u8 a4, u8 a5); + // .rodata +const struct OamData gOamData_83B6F2C; + +const struct SpriteTemplate gSpriteTemplate_83B6F14 = { + 0x000f, + 0xdac0, + &gOamData_83B6F2C, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_83B6F2C = { + .size = 2 +}; + // .text + +u8 get_preferred_box(void) +{ + return gPokemonStorage.currentBox; +} + +void sub_8098B48(void) +{ + u16 i; + + sub_809D51C(); + for (i = 0; i < 40; i++) + gPokemonStorageSystemPtr->unk_10d0[i] = 0; + for (i = 0; i < 40; i++) + gPokemonStorageSystemPtr->unk_1120[i] = 0; + for (i = 0; i < 6; i++) + gPokemonStorageSystemPtr->unk_1038[i] = 0; + for (i = 0; i < 30; i++) + gPokemonStorageSystemPtr->unk_1050[i] = 0; + gPokemonStorageSystemPtr->unk_1034 = NULL; + gPokemonStorageSystemPtr->unk_0d5c = 0; +} + +void sub_8098BF0(void) +{ + u32 personality = GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1034 = sub_8099AFC(GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_SPECIES2), personality, 0, 0, 1, 7); + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; +} diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c new file mode 100644 index 000000000..f7a008db2 --- /dev/null +++ b/src/pokemon/pokemon_storage_system_4.c @@ -0,0 +1,23 @@ + +// Includes +#include "global.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; +EWRAM_DATA u8 gUnknown_020384E4 = 0; +EWRAM_DATA u8 gUnknown_020384E5 = 0; +EWRAM_DATA u8 gUnknown_020384E6 = 0; +EWRAM_DATA u8 gUnknown_020384E7 = 0; +EWRAM_DATA u8 gUnknown_020384E8 = 0; +EWRAM_DATA u8 gUnknown_020384E9 = 0; +EWRAM_DATA u16 gUnknown_020384EA = 0; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/pokemon/pokemon_storage_system_5.c b/src/pokemon/pokemon_storage_system_5.c new file mode 100644 index 000000000..f809439ff --- /dev/null +++ b/src/pokemon/pokemon_storage_system_5.c @@ -0,0 +1,16 @@ + +// Includes +#include "global.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u32 gUnknown_020384EC = 0; + +// Static ROM declarations + +// .rodata + +// .text -- cgit v1.2.3 From 7cdd2b2a42a96135949e399d1fa3a00c5f56ae67 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 22:08:11 -0500 Subject: through sub_8098E68 --- src/pokemon/pokemon_storage_system_2.c | 4 +- src/pokemon/pokemon_storage_system_3.c | 89 ++++++++++++++++++++++++++++++++-- 2 files changed, 86 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index 2947562d0..dbb1cf992 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -217,7 +217,7 @@ void sub_8096884(void) gMain.state++; break; case 4: - sub_8098B48(); + ResetPSSMonIconSprites(); sub_809AA24(); gMain.state++; break; @@ -280,7 +280,7 @@ void sub_80969A0(void) gMain.state++; break; case 4: - sub_8098B48(); + ResetPSSMonIconSprites(); sub_809AA98(); gMain.state++; break; diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index eff542756..e1ccd107f 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -1,6 +1,7 @@ // Includes #include "global.h" +#include "constants/species.h" #include "sprite.h" #include "pokemon_icon.h" #include "pokemon_storage_system.h" @@ -11,8 +12,9 @@ // Static ROM declarations +void sub_8098E68(struct Sprite *sprite); void sub_80999C4(struct Sprite *sprite); -struct Sprite *sub_8099AFC(u16 species, u32 personality, u16 a2, u16 a3, u8 a4, u8 a5); +struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 a2, s16 a3, u8 a4, u8 a5); // .rodata @@ -39,7 +41,7 @@ u8 get_preferred_box(void) return gPokemonStorage.currentBox; } -void sub_8098B48(void) +void ResetPSSMonIconSprites(void) { u16 i; @@ -49,9 +51,9 @@ void sub_8098B48(void) for (i = 0; i < 40; i++) gPokemonStorageSystemPtr->unk_1120[i] = 0; for (i = 0; i < 6; i++) - gPokemonStorageSystemPtr->unk_1038[i] = 0; + gPokemonStorageSystemPtr->unk_1038[i] = NULL; for (i = 0; i < 30; i++) - gPokemonStorageSystemPtr->unk_1050[i] = 0; + gPokemonStorageSystemPtr->unk_1050[i] = NULL; gPokemonStorageSystemPtr->unk_1034 = NULL; gPokemonStorageSystemPtr->unk_0d5c = 0; } @@ -59,6 +61,83 @@ void sub_8098B48(void) void sub_8098BF0(void) { u32 personality = GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_PERSONALITY); - gPokemonStorageSystemPtr->unk_1034 = sub_8099AFC(GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_SPECIES2), personality, 0, 0, 1, 7); + gPokemonStorageSystemPtr->unk_1034 = PSS_SpawnMonIconSprite(GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_SPECIES2), personality, 0, 0, 1, 7); gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; } + +void SpawnBoxIconSprites(u8 boxId) +{ + struct BoxPokemon *box = gPokemonStorage.boxes[boxId]; + u16 i; + u16 k = 0; + for (i = 0; i < 5; i++) + { + u16 j; + for (j = 0; j < 6; j++) + { + u16 species = GetBoxMonData(box, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + gPokemonStorageSystemPtr->unk_1050[k] = PSS_SpawnMonIconSprite(species, GetBoxMonData(box, MON_DATA_PERSONALITY), 24 * j + 0x64, 24 * i + 0x2c, 2, 18 - j); + else + gPokemonStorageSystemPtr->unk_1050[k] = NULL; + box++; + k++; + } + } +} + +void sub_8098D20(u8 monId) +{ + struct BoxPokemon *mon = gPokemonStorage.boxes[get_preferred_box()] + monId; + u16 species = GetBoxMonData(mon, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + s16 x = 24 * (monId % 6) + 0x64; + s16 y = 24 * (monId / 6) + 0x2c; + gPokemonStorageSystemPtr->unk_1050[monId] = PSS_SpawnMonIconSprite(species, GetBoxMonData(mon, MON_DATA_PERSONALITY), x, y, 2, 18 - (monId % 6)); + } +} + +void sub_8098DE0(s16 a0) +{ + u16 monId; + for (monId = 0; monId < 30; monId++) + { + if (gPokemonStorageSystemPtr->unk_1050[monId]) + { + gPokemonStorageSystemPtr->unk_1050[monId]->data[2] = a0; + gPokemonStorageSystemPtr->unk_1050[monId]->data[4] = 1; + gPokemonStorageSystemPtr->unk_1050[monId]->callback = sub_8098E68; + } + } +} + +void sub_8098E24(struct Sprite *sprite) +{ + if (sprite->data[1] != 0) + { + sprite->data[1]--; + sprite->pos1.x += sprite->data[2]; + } + else + { + gPokemonStorageSystemPtr->unk_1178--; + sprite->pos1.x = sprite->data[3]; + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_8098E68(struct Sprite *sprite) +{ + if (sprite->data[4] != 0) + { + sprite->data[4]--; + } + else + { + sprite->pos1.x += sprite->data[2]; + sprite->data[5] = sprite->pos1.x + sprite->pos2.x; + if (sprite->data[5] < 0x45 || sprite->data[5] > 0xfb) + sprite->callback = SpriteCallbackDummy; + } +} -- cgit v1.2.3 From 4ae149b93441ffce560f3b7018842bc4c5d39326 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 22:52:37 -0500 Subject: through sub_8098EE0 --- src/pokemon/pokemon_storage_system_3.c | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index e1ccd107f..77d85de65 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -15,6 +15,7 @@ void sub_8098E68(struct Sprite *sprite); void sub_80999C4(struct Sprite *sprite); struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 a2, s16 a3, u8 a4, u8 a5); +void sub_8099BE0(struct Sprite *sprite); // .rodata @@ -141,3 +142,54 @@ void sub_8098E68(struct Sprite *sprite) sprite->callback = SpriteCallbackDummy; } } + +void sub_8098EA0(u8 col) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (gPokemonStorageSystemPtr->unk_1050[col]) + { + sub_8099BE0(gPokemonStorageSystemPtr->unk_1050[col]); + gPokemonStorageSystemPtr->unk_1050[col] = NULL; + } + col += 6; + } +} + +u8 sub_8098EE0(u8 a0, u16 a1, s16 a2) +{ + u16 i; + u16 x; + u16 y; + u8 count; + u8 x1; + u16 sp1c; + + y = 0x2c; + x = 24 * a0 + 0x64; + sp1c = x - (a1 + 1) * a2; + x1 = 18 - a0; + count = 0; + + for (i = 0; i < 5; i++) + { + u16 species = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + a0, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_1050[a0] = PSS_SpawnMonIconSprite(species, GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + a0, MON_DATA_PERSONALITY), sp1c, y, 2, x1); + if (gPokemonStorageSystemPtr->unk_1050[a0]) + { + gPokemonStorageSystemPtr->unk_1050[a0]->data[1] = a1; + gPokemonStorageSystemPtr->unk_1050[a0]->data[2] = a2; + gPokemonStorageSystemPtr->unk_1050[a0]->data[3] = x; + gPokemonStorageSystemPtr->unk_1050[a0]->callback = sub_8098E24; + count++; + } + } + a0 += 6; + y += 24; + } + return count; +} -- cgit v1.2.3 From cb28e3a679841c01191f19cb7e7f0da28f0bf160 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 9 Jan 2018 23:05:21 -0500 Subject: sub_809900C --- src/pokemon/pokemon_storage_system_3.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index 77d85de65..af050d324 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -193,3 +193,19 @@ u8 sub_8098EE0(u8 a0, u16 a1, s16 a2) } return count; } + +void sub_809900C(u8 a0, s8 a1) +{ + gPokemonStorageSystemPtr->unk_117c = 0; + gPokemonStorageSystemPtr->unk_117d = a0; + gPokemonStorageSystemPtr->unk_117b = a1; + gPokemonStorageSystemPtr->unk_1172 = 32; + gPokemonStorageSystemPtr->unk_1176 = -6 * a1; + gPokemonStorageSystemPtr->unk_1178 = 0; + if (a1 > 0) + gPokemonStorageSystemPtr->unk_117a = 0; + else + gPokemonStorageSystemPtr->unk_117a = 5; + gPokemonStorageSystemPtr->unk_1174 = 24 * gPokemonStorageSystemPtr->unk_117a + 0x64; + sub_8098DE0(gPokemonStorageSystemPtr->unk_1176); +} -- cgit v1.2.3 From e0726bf8d6af39f287c65ad22ce192988e8468bb Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 10 Jan 2018 20:20:16 -0500 Subject: through sub_8099374 --- src/pokemon/pokemon_storage_system_2.c | 4 +- src/pokemon/pokemon_storage_system_3.c | 101 +++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index dbb1cf992..a158b29a9 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -1703,7 +1703,7 @@ void sub_8098400(void) if (gUnknown_0203847C) { sub_8098690(TRUE); - sub_8099200(1); + sub_8099200(TRUE); sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); } else @@ -1719,7 +1719,7 @@ void sub_80984E8(void) gPokemonStorageSystemPtr->unk_08a8 = 20; gPokemonStorageSystemPtr->unk_08aa = 2; gPokemonStorageSystemPtr->unk_08ad = 0; - sub_8099200(0); + sub_8099200(FALSE); } bool8 sub_8098520(void) diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index af050d324..230e9445b 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -13,6 +13,7 @@ // Static ROM declarations void sub_8098E68(struct Sprite *sprite); +void sub_8099388(struct Sprite *sprite, u16 a0); void sub_80999C4(struct Sprite *sprite); struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 a2, s16 a3, u8 a4, u8 a5); void sub_8099BE0(struct Sprite *sprite); @@ -209,3 +210,103 @@ void sub_809900C(u8 a0, s8 a1) gPokemonStorageSystemPtr->unk_1174 = 24 * gPokemonStorageSystemPtr->unk_117a + 0x64; sub_8098DE0(gPokemonStorageSystemPtr->unk_1176); } + +bool8 sub_80990AC(void) +{ + if (gPokemonStorageSystemPtr->unk_1172) + gPokemonStorageSystemPtr->unk_1172--; + switch (gPokemonStorageSystemPtr->unk_117c) + { + case 0: + gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176; + if (gPokemonStorageSystemPtr->unk_1174 < 0x41 || gPokemonStorageSystemPtr->unk_1174 > 0xfb) + { + sub_8098EA0(gPokemonStorageSystemPtr->unk_117a); + gPokemonStorageSystemPtr->unk_1174 += 24 * gPokemonStorageSystemPtr->unk_117b; + gPokemonStorageSystemPtr->unk_117c++; + } + break; + case 1: + gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176; + gPokemonStorageSystemPtr->unk_1178 += sub_8098EE0(gPokemonStorageSystemPtr->unk_117a, gPokemonStorageSystemPtr->unk_1172, gPokemonStorageSystemPtr->unk_1176); + if ((gPokemonStorageSystemPtr->unk_117b > 0 && gPokemonStorageSystemPtr->unk_117a == 5) || (gPokemonStorageSystemPtr->unk_117b < 0 && gPokemonStorageSystemPtr->unk_117a == 0)) + { + gPokemonStorageSystemPtr->unk_117c++; + } + else + { + gPokemonStorageSystemPtr->unk_117a += gPokemonStorageSystemPtr->unk_117b; + gPokemonStorageSystemPtr->unk_117c = 0; + } + break; + case 2: + if (gPokemonStorageSystemPtr->unk_1178 == 0) + { + gPokemonStorageSystemPtr->unk_1172++; + return FALSE; + } + break; + default: + return FALSE; + } + return TRUE; +} + +void sub_8099200(bool8 a0) +{ + u16 count; + u16 i; + u16 species = GetMonData(gPlayerParty + 0, MON_DATA_SPECIES2); + u32 personality = GetMonData(gPlayerParty + 0, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1038[0] = PSS_SpawnMonIconSprite(species, personality, 0x68, 0x40, 1, 11); + count = 1; + for (i = 1; i < PARTY_SIZE; i++) + { + species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + personality = GetMonData(gPlayerParty + i, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1038[i] = PSS_SpawnMonIconSprite(species, personality, 0x98, (i - 1) * 24 + 0x10, 1, 11); + count++; + } + else + { + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + } + } + if (!a0) + { + for (i = 0; i < count; i++) + { + // this routine assumes party_compaction has been called + gPokemonStorageSystemPtr->unk_1038[i]->pos1.y -= 0xa0; + gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE; + } + } +} + +void sub_8099310(void) +{ + u16 i; + u16 count; + + gPokemonStorageSystemPtr->unk_1171 = 0; + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + if (i != count) + { + sub_8099388(gPokemonStorageSystemPtr->unk_1038[i], count); + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + gPokemonStorageSystemPtr->unk_1171++; + } + count++; + } + } +} + +u8 sub_8099374(void) +{ + return gPokemonStorageSystemPtr->unk_1171; +} -- cgit v1.2.3 From e44c0f897d2d02f153d5adf139be3bac25e1ee93 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 10 Jan 2018 21:33:54 -0500 Subject: through sub_809960C --- src/pokemon/pokemon_storage_system_3.c | 145 ++++++++++++++++++++++++++++++++- 1 file changed, 144 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index 230e9445b..28b9e2655 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -13,7 +13,8 @@ // Static ROM declarations void sub_8098E68(struct Sprite *sprite); -void sub_8099388(struct Sprite *sprite, u16 a0); +void sub_8099388(struct Sprite *sprite, u16 a1); +void sub_80993F4(struct Sprite *sprite); void sub_80999C4(struct Sprite *sprite); struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 a2, s16 a3, u8 a4, u8 a5); void sub_8099BE0(struct Sprite *sprite); @@ -310,3 +311,145 @@ u8 sub_8099374(void) { return gPokemonStorageSystemPtr->unk_1171; } + +void sub_8099388(struct Sprite *sprite, u16 a1) +{ + s16 r3; + s16 r4; + + sprite->data[1] = a1; + if (a1 == 0) + { + r3 = 0x68; + r4 = 0x40; + } + else + { + r3 = 0x98; + r4 = 24 * (a1 - 1) + 0x10; + } + sprite->data[2] = sprite->pos1.x << 3; + sprite->data[3] = sprite->pos1.y << 3; + sprite->data[4] = (r3 * 8 - sprite->data[2]) / 8; + sprite->data[5] = (r4 * 8 - sprite->data[3]) / 8; + sprite->data[6] = 8; + sprite->callback = sub_80993F4; +} + +void sub_80993F4(struct Sprite *sprite) +{ + if (sprite->data[6]) + { + sprite->data[2] += sprite->data[4]; + sprite->data[3] += sprite->data[5]; + sprite->pos1.x = sprite->data[2] >> 3; + sprite->pos1.y = sprite->data[3] >> 3; + sprite->data[6]--; + } + else + { + if (sprite->data[1] == 0) + { + sprite->pos1.x = 0x68; + sprite->pos1.y = 0x40; + } + else + { + sprite->pos1.x = 0x98; + sprite->pos1.y = (sprite->data[1] - 1) * 24 + 0x10; + } + sprite->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1038[sprite->data[1]] = sprite; + gPokemonStorageSystemPtr->unk_1171--; + } +} + +void sub_8099480(void) +{ + if (gPokemonStorageSystemPtr->unk_1034) + { + sub_8099BE0(gPokemonStorageSystemPtr->unk_1034); + gPokemonStorageSystemPtr->unk_1034 = NULL; + } +} + +void sub_80994A8(s16 y) +{ + u16 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + s16 yy; + gPokemonStorageSystemPtr->unk_1038[i]->pos1.y += y; + yy = gPokemonStorageSystemPtr->unk_1038[i]->pos1.y + gPokemonStorageSystemPtr->unk_1038[i]->pos2.y + gPokemonStorageSystemPtr->unk_1038[i]->centerToCornerVecY; + if (yy < -0x10 || yy > 0xb0) + gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE; + else + gPokemonStorageSystemPtr->unk_1038[i]->invisible = FALSE; + } + } +} + +void sub_8099520(u8 a0) +{ + if (gPokemonStorageSystemPtr->unk_1038[a0]) + { + sub_8099BE0(gPokemonStorageSystemPtr->unk_1038[a0]); + gPokemonStorageSystemPtr->unk_1038[a0] = NULL; + } +} + +void sub_809954C(void) +{ + u16 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + sub_8099BE0(gPokemonStorageSystemPtr->unk_1038[i]); + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + } + } +} + +void sub_8099584(u8 a0, u8 a1) +{ + if (a0 == 0) + { + gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1038[a1]; + gPokemonStorageSystemPtr->unk_1038[a1] = NULL; + } + else if (a0 == 1) + { + gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1050[a1]; + gPokemonStorageSystemPtr->unk_1050[a1] = NULL; + } + else + { + return; + } + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; + gPokemonStorageSystemPtr->unk_1034->oam.priority = 1; + gPokemonStorageSystemPtr->unk_1034->subpriority = 7; +} + +void sub_809960C(u8 a0, u8 a1) +{ + if (a0 == 14) + { + gPokemonStorageSystemPtr->unk_1038[a1] = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1038[a1]->oam.priority = 1; + gPokemonStorageSystemPtr->unk_1038[a1]->subpriority = 11; + } + else + { + gPokemonStorageSystemPtr->unk_1050[a1] = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1050[a1]->oam.priority = 2; + gPokemonStorageSystemPtr->unk_1050[a1]->subpriority = 18 - (a1 % 6); + } + gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1034 = NULL; +} -- cgit v1.2.3 From d6464c7c40f5ac1b9da557d5990e2b7e83997720 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 10 Jan 2018 21:53:25 -0500 Subject: through sub_809971C --- src/pokemon/pokemon_storage_system_3.c | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index 28b9e2655..7f5c84b49 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -3,6 +3,7 @@ #include "global.h" #include "constants/species.h" #include "sprite.h" +#include "trig.h" #include "pokemon_icon.h" #include "pokemon_storage_system.h" @@ -453,3 +454,43 @@ void sub_809960C(u8 a0, u8 a1) gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; gPokemonStorageSystemPtr->unk_1034 = NULL; } + +void sub_80996B0(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1038 + a1; + else + gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1050 + a1; + gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1170 = 0; +} + +bool8 sub_809971C(void) +{ + if (gPokemonStorageSystemPtr->unk_1170 == 16) + return FALSE; + gPokemonStorageSystemPtr->unk_1170++; + if (gPokemonStorageSystemPtr->unk_1170 & 1) + { + (*gPokemonStorageSystemPtr->unk_10c8)->pos1.y--; + gPokemonStorageSystemPtr->unk_1034->pos1.y++; + } + (*gPokemonStorageSystemPtr->unk_10c8)->pos2.x = gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16; + gPokemonStorageSystemPtr->unk_1034->pos2.x = -(gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16); + if (gPokemonStorageSystemPtr->unk_1170 == 8) + { + gPokemonStorageSystemPtr->unk_1034->oam.priority = (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority; + gPokemonStorageSystemPtr->unk_1034->subpriority = (*gPokemonStorageSystemPtr->unk_10c8)->subpriority; + (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority = 1; + (*gPokemonStorageSystemPtr->unk_10c8)->subpriority = 7; + } + if (gPokemonStorageSystemPtr->unk_1170 == 16) + { + struct Sprite *sprite = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1034 = *(gPokemonStorageSystemPtr->unk_10c8); + (*gPokemonStorageSystemPtr->unk_10c8) = sprite; + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; + (*gPokemonStorageSystemPtr->unk_10c8)->callback = SpriteCallbackDummy; + } + return TRUE; +} -- cgit v1.2.3 From a1ccd03edd90601759a04f223c9558181a657728 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 10 Jan 2018 22:08:58 -0500 Subject: Refine struct at 02000028 --- src/pokemon/pokemon_storage_system_2.c | 2 +- src/pokemon/pokemon_storage_system_5.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index a158b29a9..e5466ea70 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -176,7 +176,7 @@ void sub_8096804(void) FreeAllSpritePalettes(); ResetTasks(); gReservedSpriteTileCount = 0x280; - sub_809CFDC(gPokemonStorageSystemPtr->unk_0020, gPokemonStorageSystemPtr->unk_0020 + 1, 8); + sub_809CFDC(&gPokemonStorageSystemPtr->unk_0020, gPokemonStorageSystemPtr->unk_0028, 8); gKeyRepeatStartDelay = 20; } diff --git a/src/pokemon/pokemon_storage_system_5.c b/src/pokemon/pokemon_storage_system_5.c index f809439ff..b7c3d42f5 100644 --- a/src/pokemon/pokemon_storage_system_5.c +++ b/src/pokemon/pokemon_storage_system_5.c @@ -7,7 +7,7 @@ // Static RAM declarations -EWRAM_DATA u32 gUnknown_020384EC = 0; +EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL; // Static ROM declarations -- cgit v1.2.3 From 7a65953ccc2313db6de0ec061220b1a5f8751b36 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 12 Jan 2018 08:53:01 -0500 Subject: through sub_80999C4 --- src/pokemon/pokemon_storage_system_3.c | 86 ++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index 7f5c84b49..2af88e8cd 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -494,3 +494,89 @@ bool8 sub_809971C(void) } return TRUE; } + +const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = { + AFFINEANIMCMD_FRAME(-2, -2, 0, 120), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = { + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(16, 16, 0, 15), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = { + gSpriteAffineAnim_83B6F34, + gSpriteAffineAnim_83B6F44 +}; + +void sub_809981C(u8 mode, u8 idx) +{ + switch (mode) + { + case 0: + gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1038 + idx; + break; + case 1: + gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1050 + idx; + break; + case 2: + gPokemonStorageSystemPtr->unk_10cc = &gPokemonStorageSystemPtr->unk_1034; + break; + default: + return; + } + if (*gPokemonStorageSystemPtr->unk_10cc) + { + InitSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc); + (*gPokemonStorageSystemPtr->unk_10cc)->oam.affineMode = ST_OAM_AFFINE_NORMAL; + (*gPokemonStorageSystemPtr->unk_10cc)->affineAnims = gSpriteAffineAnimTable_83B6F5C; + StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 0); + } +} + +bool8 sub_80998D8(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc == NULL || (*gPokemonStorageSystemPtr->unk_10cc)->invisible) + return FALSE; + if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded) + { + (*gPokemonStorageSystemPtr->unk_10cc)->invisible = TRUE; + } + return TRUE; +} + +void sub_8099920(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc) + { + FreeOamMatrix((*gPokemonStorageSystemPtr->unk_10cc)->oam.matrixNum); + sub_8099BE0(*gPokemonStorageSystemPtr->unk_10cc); + *gPokemonStorageSystemPtr->unk_10cc = NULL; + } +} + +void sub_8099958(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc) + { + (*gPokemonStorageSystemPtr->unk_10cc)->invisible = FALSE; + StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 1); + } +} + +bool8 sub_8099990(void) +{ + if (gPokemonStorageSystemPtr->unk_10cc == NULL) + return FALSE; + if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded) + gPokemonStorageSystemPtr->unk_10cc = NULL; + return TRUE; +} + +void sub_80999C4(struct Sprite *sprite) +{ + sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x; + sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + gPokemonStorageSystemPtr->unk_11c0->pos2.y + 4; +} -- cgit v1.2.3 From 12ec094b4b3641cf33fc1cf45634090e067c70b6 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 12 Jan 2018 09:46:31 -0500 Subject: Remaining functions and data in pss3 --- src/pokemon/pokemon_storage_system_3.c | 131 +++++++++++++++++++++++++-------- 1 file changed, 102 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index 2af88e8cd..9d4b88b5d 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -24,20 +24,6 @@ void sub_8099BE0(struct Sprite *sprite); const struct OamData gOamData_83B6F2C; -const struct SpriteTemplate gSpriteTemplate_83B6F14 = { - 0x000f, - 0xdac0, - &gOamData_83B6F2C, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -const struct OamData gOamData_83B6F2C = { - .size = 2 -}; - // .text u8 get_preferred_box(void) @@ -495,21 +481,7 @@ bool8 sub_809971C(void) return TRUE; } -const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = { - AFFINEANIMCMD_FRAME(-2, -2, 0, 120), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = { - AFFINEANIMCMD_FRAME(16, 16, 0, 0), - AFFINEANIMCMD_FRAME(16, 16, 0, 15), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = { - gSpriteAffineAnim_83B6F34, - gSpriteAffineAnim_83B6F44 -}; +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[]; void sub_809981C(u8 mode, u8 idx) { @@ -580,3 +552,104 @@ void sub_80999C4(struct Sprite *sprite) sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x; sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + gPokemonStorageSystemPtr->unk_11c0->pos2.y + 4; } + +u16 sub_80999E8(u16 a0) +{ + u16 i; + u16 retval; + + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == a0) + break; + } + if (i == 40) + { + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == 0) + break; + } + } + if (i != 40) + { + gPokemonStorageSystemPtr->unk_1120[i] = a0; + gPokemonStorageSystemPtr->unk_10d0[i]++; + retval = i * 16; + CpuCopy32(gMonIconTable[a0], BG_CHAR_ADDR(4) + 32 * retval, 0x200); + return retval; + } + return -1; +} + +void sub_8099AAC(u16 a0) +{ + u16 i; + + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == a0) + { + if (--gPokemonStorageSystemPtr->unk_10d0[i] == 0) + gPokemonStorageSystemPtr->unk_1120[i] = 0; + break; + } + } +} + +struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority) +{ + struct SpriteTemplate template = { + 0x000f, + 0xdac0, + &gOamData_83B6F2C, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy + }; + u16 tileNum; + u8 spriteId; + + species = mon_icon_convert_unown_species_id(species, personality); + template.paletteTag = 0xdac0 + gMonIconPaletteIndices[species]; + tileNum = sub_80999E8(species); + if (tileNum == 0xFFFF) + return NULL; + spriteId = CreateSprite(&template, x, y, subpriority); + if (spriteId == MAX_SPRITES) + { + sub_8099AAC(species); + return NULL; + } + gSprites[spriteId].oam.tileNum = tileNum; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = species; + return gSprites + spriteId; +} + +void sub_8099BE0(struct Sprite *sprite) +{ + sub_8099AAC(sprite->data[0]); + DestroySprite(sprite); +} + +const struct OamData gOamData_83B6F2C = { + .size = 2 +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = { + AFFINEANIMCMD_FRAME(-2, -2, 0, 120), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = { + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(16, 16, 0, 15), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = { + gSpriteAffineAnim_83B6F34, + gSpriteAffineAnim_83B6F44 +}; -- cgit v1.2.3 From 3b8f6133865af6ede3628f3df8dd71648b43b3bc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 12 Jan 2018 09:57:20 -0500 Subject: some renaming in pss3 --- src/pokemon/pokemon_storage_system_2.c | 6 +-- src/pokemon/pokemon_storage_system_3.c | 78 +++++++++++++++++----------------- 2 files changed, 42 insertions(+), 42 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index e5466ea70..f5eaa2166 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -872,7 +872,7 @@ void sub_809746C(void) gPokemonStorageSystemPtr->unk_0004++; break; case 3: - if (!sub_8099374()) + if (sub_8099374() == 0) { sub_809B6BC(); BoxSetMosaic(); @@ -965,7 +965,7 @@ void sub_8097594(void) } break; case 6: - if (!sub_8099374()) + if (sub_8099374() == 0) { sub_809B440(); BoxSetMosaic(); @@ -1073,7 +1073,7 @@ void sub_8097858(void) gPokemonStorageSystemPtr->unk_0004++; break; case 1: - if (!sub_8099374()) + if (sub_8099374() == 0) { sub_80987DC(); SetPSSCallback(sub_8096C84); diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c index 9d4b88b5d..da26c6fc5 100644 --- a/src/pokemon/pokemon_storage_system_3.c +++ b/src/pokemon/pokemon_storage_system_3.c @@ -13,12 +13,12 @@ // Static ROM declarations -void sub_8098E68(struct Sprite *sprite); -void sub_8099388(struct Sprite *sprite, u16 a1); -void sub_80993F4(struct Sprite *sprite); -void sub_80999C4(struct Sprite *sprite); -struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 a2, s16 a3, u8 a4, u8 a5); -void sub_8099BE0(struct Sprite *sprite); +static void sub_8098E68(struct Sprite *sprite); +static void sub_8099388(struct Sprite *sprite, u16 a1); +static void sub_80993F4(struct Sprite *sprite); +static void sub_80999C4(struct Sprite *sprite); +static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority); +static void PSS_DestroyMonIconSprite(struct Sprite *sprite); // .rodata @@ -88,7 +88,7 @@ void sub_8098D20(u8 monId) } } -void sub_8098DE0(s16 a0) +static void sub_8098DE0(s16 a0) { u16 monId; for (monId = 0; monId < 30; monId++) @@ -102,7 +102,7 @@ void sub_8098DE0(s16 a0) } } -void sub_8098E24(struct Sprite *sprite) +static void sub_8098E24(struct Sprite *sprite) { if (sprite->data[1] != 0) { @@ -117,7 +117,7 @@ void sub_8098E24(struct Sprite *sprite) } } -void sub_8098E68(struct Sprite *sprite) +static void sub_8098E68(struct Sprite *sprite) { if (sprite->data[4] != 0) { @@ -132,7 +132,7 @@ void sub_8098E68(struct Sprite *sprite) } } -void sub_8098EA0(u8 col) +static void sub_8098EA0(u8 col) { u16 i; @@ -140,44 +140,44 @@ void sub_8098EA0(u8 col) { if (gPokemonStorageSystemPtr->unk_1050[col]) { - sub_8099BE0(gPokemonStorageSystemPtr->unk_1050[col]); + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1050[col]); gPokemonStorageSystemPtr->unk_1050[col] = NULL; } col += 6; } } -u8 sub_8098EE0(u8 a0, u16 a1, s16 a2) +static u8 sub_8098EE0(u8 col, u16 a1, s16 a2) { u16 i; u16 x; u16 y; u8 count; u8 x1; - u16 sp1c; + u16 curX; y = 0x2c; - x = 24 * a0 + 0x64; - sp1c = x - (a1 + 1) * a2; - x1 = 18 - a0; + x = 24 * col + 0x64; + curX = x - (a1 + 1) * a2; + x1 = 18 - col; count = 0; for (i = 0; i < 5; i++) { - u16 species = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + a0, MON_DATA_SPECIES2); + u16 species = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_SPECIES2); if (species != SPECIES_NONE) { - gPokemonStorageSystemPtr->unk_1050[a0] = PSS_SpawnMonIconSprite(species, GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + a0, MON_DATA_PERSONALITY), sp1c, y, 2, x1); - if (gPokemonStorageSystemPtr->unk_1050[a0]) + gPokemonStorageSystemPtr->unk_1050[col] = PSS_SpawnMonIconSprite(species, GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_PERSONALITY), curX, y, 2, x1); + if (gPokemonStorageSystemPtr->unk_1050[col]) { - gPokemonStorageSystemPtr->unk_1050[a0]->data[1] = a1; - gPokemonStorageSystemPtr->unk_1050[a0]->data[2] = a2; - gPokemonStorageSystemPtr->unk_1050[a0]->data[3] = x; - gPokemonStorageSystemPtr->unk_1050[a0]->callback = sub_8098E24; + gPokemonStorageSystemPtr->unk_1050[col]->data[1] = a1; + gPokemonStorageSystemPtr->unk_1050[col]->data[2] = a2; + gPokemonStorageSystemPtr->unk_1050[col]->data[3] = x; + gPokemonStorageSystemPtr->unk_1050[col]->callback = sub_8098E24; count++; } } - a0 += 6; + col += 6; y += 24; } return count; @@ -299,7 +299,7 @@ u8 sub_8099374(void) return gPokemonStorageSystemPtr->unk_1171; } -void sub_8099388(struct Sprite *sprite, u16 a1) +static void sub_8099388(struct Sprite *sprite, u16 a1) { s16 r3; s16 r4; @@ -323,7 +323,7 @@ void sub_8099388(struct Sprite *sprite, u16 a1) sprite->callback = sub_80993F4; } -void sub_80993F4(struct Sprite *sprite) +static void sub_80993F4(struct Sprite *sprite) { if (sprite->data[6]) { @@ -355,7 +355,7 @@ void sub_8099480(void) { if (gPokemonStorageSystemPtr->unk_1034) { - sub_8099BE0(gPokemonStorageSystemPtr->unk_1034); + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1034); gPokemonStorageSystemPtr->unk_1034 = NULL; } } @@ -383,7 +383,7 @@ void sub_8099520(u8 a0) { if (gPokemonStorageSystemPtr->unk_1038[a0]) { - sub_8099BE0(gPokemonStorageSystemPtr->unk_1038[a0]); + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[a0]); gPokemonStorageSystemPtr->unk_1038[a0] = NULL; } } @@ -396,7 +396,7 @@ void sub_809954C(void) { if (gPokemonStorageSystemPtr->unk_1038[i]) { - sub_8099BE0(gPokemonStorageSystemPtr->unk_1038[i]); + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[i]); gPokemonStorageSystemPtr->unk_1038[i] = NULL; } } @@ -524,7 +524,7 @@ void sub_8099920(void) if (*gPokemonStorageSystemPtr->unk_10cc) { FreeOamMatrix((*gPokemonStorageSystemPtr->unk_10cc)->oam.matrixNum); - sub_8099BE0(*gPokemonStorageSystemPtr->unk_10cc); + PSS_DestroyMonIconSprite(*gPokemonStorageSystemPtr->unk_10cc); *gPokemonStorageSystemPtr->unk_10cc = NULL; } } @@ -547,13 +547,13 @@ bool8 sub_8099990(void) return TRUE; } -void sub_80999C4(struct Sprite *sprite) +static void sub_80999C4(struct Sprite *sprite) { sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x; sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + gPokemonStorageSystemPtr->unk_11c0->pos2.y + 4; } -u16 sub_80999E8(u16 a0) +static u16 PSS_LoadSpeciesIconGfx(u16 a0) { u16 i; u16 retval; @@ -579,10 +579,10 @@ u16 sub_80999E8(u16 a0) CpuCopy32(gMonIconTable[a0], BG_CHAR_ADDR(4) + 32 * retval, 0x200); return retval; } - return -1; + return 0xFFFF; } -void sub_8099AAC(u16 a0) +static void PSS_ForgetSpeciesIcon(u16 a0) { u16 i; @@ -597,7 +597,7 @@ void sub_8099AAC(u16 a0) } } -struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority) +static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority) { struct SpriteTemplate template = { 0x000f, @@ -613,13 +613,13 @@ struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y species = mon_icon_convert_unown_species_id(species, personality); template.paletteTag = 0xdac0 + gMonIconPaletteIndices[species]; - tileNum = sub_80999E8(species); + tileNum = PSS_LoadSpeciesIconGfx(species); if (tileNum == 0xFFFF) return NULL; spriteId = CreateSprite(&template, x, y, subpriority); if (spriteId == MAX_SPRITES) { - sub_8099AAC(species); + PSS_ForgetSpeciesIcon(species); return NULL; } gSprites[spriteId].oam.tileNum = tileNum; @@ -628,9 +628,9 @@ struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y return gSprites + spriteId; } -void sub_8099BE0(struct Sprite *sprite) +static void PSS_DestroyMonIconSprite(struct Sprite *sprite) { - sub_8099AAC(sprite->data[0]); + PSS_ForgetSpeciesIcon(sprite->data[0]); DestroySprite(sprite); } -- cgit v1.2.3 From f37add5cfb4bb369ec096d91f62915ee4f88a1d7 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 12 Jan 2018 12:13:35 -0500 Subject: through sub_8099D90 --- src/pokemon/pokemon_storage_system_4.c | 71 ++++++++++++++++++++++++++++++++++ src/pokemon/pokemon_storage_system_6.c | 14 +++++++ 2 files changed, 85 insertions(+) create mode 100644 src/pokemon/pokemon_storage_system_6.c (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index f7a008db2..697292d5c 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -18,6 +18,77 @@ EWRAM_DATA u16 gUnknown_020384EA = 0; // Static ROM declarations +void sub_809900C(u8 boxId, s8 a1); +s8 sub_8099D90(u8 boxId); +void sub_8099EB0(u8 boxId, s8 a1); +void sub_809A23C(u8 boxId); +void sub_809A3D0(u8 boxId, s8 a1); +void sub_809A598(void); +void sub_809A6DC(void); +void sub_809A774(s8 a0); +void sub_809A810(void); + // .rodata // .text + +void sub_8099BF8(u8 boxId) +{ + gPokemonStorageSystemPtr->unk_08ba = 0; + gPokemonStorageSystemPtr->unk_08b4 = 0; + DmaFill32(3, 0, BG_SCREEN_ADDR(26), 0x1000); + sub_8099EB0(boxId, 0); + sub_809A23C(boxId); + sub_809A6DC(); + SpawnBoxIconSprites(boxId); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT512x256; +} + +void sub_8099C70(u8 whichBox) +{ + s8 r4 = sub_8099D90(whichBox); + sub_8099EB0(whichBox, r4); + gPokemonStorageSystemPtr->unk_08b6 = r4 * 6; + gPokemonStorageSystemPtr->unk_08b8 = 0x20; + gPokemonStorageSystemPtr->unk_08bb = whichBox; + gPokemonStorageSystemPtr->unk_08bc = r4 > 0 ? 0 : 5; + gPokemonStorageSystemPtr->unk_08be = r4; + gPokemonStorageSystemPtr->unk_08c0 = r4 > 0 ? 0x108 : 0x38; + gPokemonStorageSystemPtr->unk_08c2 = r4 > 0 ? 0 : 5; + gPokemonStorageSystemPtr->unk_08c4 = r4; + gPokemonStorageSystemPtr->unk_08c6 = 0; + gPokemonStorageSystemPtr->unk_08c8 = 2; + sub_809900C(whichBox, r4); + sub_809A3D0(whichBox, r4); + sub_809A774(r4); +} + +bool8 sub_8099D34(void) +{ + bool8 retVal = sub_80990AC(); + if (gPokemonStorageSystemPtr->unk_08b8 != 0) + { + gPokemonStorageSystemPtr->unk_08b4 += gPokemonStorageSystemPtr->unk_08b6; + gPokemonStorageSystemPtr->unk_08b4 &= 0x1ff; + if (--gPokemonStorageSystemPtr->unk_08b8 == 0) + { + sub_809A598(); + sub_809A810(); + } + return TRUE; + } + return retVal; +} + +s8 sub_8099D90(u8 boxId) +{ + u8 curBox = get_preferred_box(); + u8 i; + + for (i = 0; curBox != boxId; i++) + { + if (++curBox >= 14) + curBox = 0; + } + return i <= 6 ? 1 : -1; +} diff --git a/src/pokemon/pokemon_storage_system_6.c b/src/pokemon/pokemon_storage_system_6.c new file mode 100644 index 000000000..a781c1ed2 --- /dev/null +++ b/src/pokemon/pokemon_storage_system_6.c @@ -0,0 +1,14 @@ + +// Includes +#include "global.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +// Static ROM declarations + +// .rodata + +// .text -- cgit v1.2.3 From 8c2c8ed3a9e377382a0ac645053e4b7b4ab41c4e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 12 Jan 2018 12:50:59 -0500 Subject: match unref_sub_8095D08 --- src/pokemon/pokemon_storage_system.c | 149 ++++++----------------------------- 1 file changed, 22 insertions(+), 127 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 80081c963..c02fdfb3a 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -177,7 +177,27 @@ void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src } } -#ifdef NONMATCHING +#define MAX_DMA_BLOCK_SIZE 0x1000 +#define Dma3FillLarge_(value, dest, size, bit) \ +{ \ + void *_dest = dest; \ + u32 _size = size; \ + while (1) \ + { \ + if (_size <= MAX_DMA_BLOCK_SIZE) \ + { \ + DmaFill##bit(3, value, _dest, _size); \ + break; \ + } \ + DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ + _dest += MAX_DMA_BLOCK_SIZE; \ + _size -= MAX_DMA_BLOCK_SIZE; \ + } \ +} + +#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) +#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) + void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) { u16 i; @@ -185,133 +205,8 @@ void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 he dest += dest_top * 0x20 + dest_left; width *= 2; for (i = 0; i < height; dest += 0x20, i++) - { - void *_dest = dest; - size_t _size = width; - if (_size <= 0x1000) - { - DmaFill16(3, 0, _dest, _size); - } - else - { - while (1) - { - DmaFill16(3, 0, _dest, 0x1000); - _dest += 0x1000; - _size -= 0x1000; - if (_size <= 0x1000) - { - DmaFill16(3, 0, _dest, _size); - break; - } - } - } - } -} -#else -__attribute__((naked)) void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tadds r4, r0, 0\n" - "\tldr r0, [sp, 0x28]\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tlsls r2, 16\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r10, r0\n" - "\tlsrs r2, 11\n" - "\tadds r2, r1\n" - "\tlsls r2, 1\n" - "\tadds r4, r2\n" - "\tlsls r3, 17\n" - "\tlsrs r0, r3, 16\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r0, 0\n" - "\tcmp r0, r10\n" - "\tbcs _08095DB2\n" - "\tmovs r6, 0x80\n" - "\tlsls r6, 5\n" - "\tmov r5, sp\n" - "\tldr r7, _08095D74 @ =0x040000d4\n" - "\tlsrs r3, 17\n" - "\tmov r9, r3\n" - "\tmov r1, r9\n" - "\tmovs r2, 0x81\n" - "\tlsls r2, 24\n" - "\torrs r1, r2\n" - "\tmov r9, r1\n" - "_08095D4E:\n" - "\tadds r3, r4, 0\n" - "\tldr r2, [sp, 0x4]\n" - "\tmovs r1, 0x40\n" - "\tadds r1, r4\n" - "\tmov r8, r1\n" - "\tadds r0, 0x1\n" - "\tmov r12, r0\n" - "\tcmp r2, r6\n" - "\tbhi _08095D78\n" - "\tmovs r0, 0\n" - "\tstrh r0, [r5]\n" - "\tmov r2, sp\n" - "\tstr r2, [r7]\n" - "\tstr r4, [r7, 0x4]\n" - "\tmov r0, r9\n" - "\tstr r0, [r7, 0x8]\n" - "\tldr r0, [r7, 0x8]\n" - "\tb _08095DA6\n" - "\t.align 2, 0\n" - "_08095D74: .4byte 0x040000d4\n" - "_08095D78:\n" - "\tmovs r4, 0\n" - "\tstrh r4, [r5]\n" - "\tldr r1, _08095DC4 @ =0x040000d4\n" - "\tmov r0, sp\n" - "\tstr r0, [r1]\n" - "\tstr r3, [r1, 0x4]\n" - "\tldr r0, _08095DC8 @ =0x81000800\n" - "\tstr r0, [r1, 0x8]\n" - "\tldr r0, [r1, 0x8]\n" - "\tadds r3, r6\n" - "\tsubs r2, r6\n" - "\tcmp r2, r6\n" - "\tbhi _08095D78\n" - "\tstrh r4, [r5]\n" - "\tmov r0, sp\n" - "\tstr r0, [r1]\n" - "\tstr r3, [r1, 0x4]\n" - "\tlsrs r0, r2, 1\n" - "\tmovs r2, 0x81\n" - "\tlsls r2, 24\n" - "\torrs r0, r2\n" - "\tstr r0, [r1, 0x8]\n" - "\tldr r0, [r1, 0x8]\n" - "_08095DA6:\n" - "\tmov r4, r8\n" - "\tmov r1, r12\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, r10\n" - "\tbcc _08095D4E\n" - "_08095DB2:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08095DC4: .4byte 0x040000d4\n" - "_08095DC8: .4byte 0x81000800"); + Dma3FillLarge16_(0, dest, width); } -#endif s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) { -- cgit v1.2.3 From aadd5c8ac07ef5967d8e2cf58fbdd04f79d5b82a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 12 Jan 2018 13:41:32 -0500 Subject: through sub_8099EB0 and relevant data --- src/pokemon/pokemon_storage_system_4.c | 233 ++++++++++++++++++++++++++++++++- 1 file changed, 232 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 697292d5c..8982ce461 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -1,6 +1,7 @@ // Includes #include "global.h" +#include "palette.h" #include "pokemon_storage_system.h" // Static type declarations @@ -16,14 +17,24 @@ EWRAM_DATA u8 gUnknown_020384E8 = 0; EWRAM_DATA u8 gUnknown_020384E9 = 0; EWRAM_DATA u16 gUnknown_020384EA = 0; +struct WallpaperTable { + const u8 *tiles; + u32 size; + const u8 *tileMap; + const u16 *palettes; +}; + // Static ROM declarations void sub_809900C(u8 boxId, s8 a1); s8 sub_8099D90(u8 boxId); void sub_8099EB0(u8 boxId, s8 a1); +void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3); +void sub_809A14C(u16 *vdest); void sub_809A23C(u8 boxId); void sub_809A3D0(u8 boxId, s8 a1); void sub_809A598(void); +void sub_809A654(void); void sub_809A6DC(void); void sub_809A774(s8 a0); void sub_809A810(void); @@ -34,7 +45,7 @@ void sub_809A810(void); void sub_8099BF8(u8 boxId) { - gPokemonStorageSystemPtr->unk_08ba = 0; + gPokemonStorageSystemPtr->unk_08ba = FALSE; gPokemonStorageSystemPtr->unk_08b4 = 0; DmaFill32(3, 0, BG_SCREEN_ADDR(26), 0x1000); sub_8099EB0(boxId, 0); @@ -92,3 +103,223 @@ s8 sub_8099D90(u8 boxId) } return i <= 6 ? 1 : -1; } + +void sub_8099DCC(u8 wallpaperId) +{ + u8 curBox = get_preferred_box(); + gPokemonStorage.wallpaper[curBox] = wallpaperId; + gPokemonStorageSystemPtr->unk_1032 = 0; +} + +bool8 sub_8099E08(void) +{ + switch (gPokemonStorageSystemPtr->unk_1032) + { + case 0: + BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0, 0x10, 0xffff); + gPokemonStorageSystemPtr->unk_1032++; + break; + case 1: + if (!UpdatePaletteFade()) + { + u8 curBox = get_preferred_box(); + sub_8099EB0(curBox, 0); + sub_809A654(); + BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0x10, 0, 0xffff); + gPokemonStorageSystemPtr->unk_1032++; + } + break; + case 2: + if (!UpdatePaletteFade()) + gPokemonStorageSystemPtr->unk_1032++; + break; + case 3: + return FALSE; + } + return TRUE; +} + +const u16 gWallpaperPalettes_Forest[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Forest_2[] = INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal"); +const u16 gWallpaperPalettes_Forest_2_3[] = INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal"); + +const u8 gWallpaperTiles_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.4bpp.lz"); + +const u8 gWallpaperTilemap_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.bin.lz"); + +const u16 gWallpaperPalettes_City[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_City_2[] = INCBIN_U16("graphics/pokemon_storage/city_frame.gbapal"); +const u16 gWallpaperPalettes_City_2_3[] = INCBIN_U16("graphics/pokemon_storage/city_bg.gbapal"); + +const u8 gWallpaperTiles_City[] = INCBIN_U8("graphics/pokemon_storage/city.4bpp.lz"); + +const u8 gWallpaperTilemap_City[] = INCBIN_U8("graphics/pokemon_storage/city.bin.lz"); + +const u16 gWallpaperPalettes_Desert[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Desert_2[] = INCBIN_U16("graphics/pokemon_storage/desert_frame.gbapal"); +const u16 gWallpaperPalettes_Desert_2_3[] = INCBIN_U16("graphics/pokemon_storage/desert_bg.gbapal"); + +const u8 gWallpaperTiles_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.4bpp.lz"); + +const u8 gWallpaperTilemap_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.bin.lz"); + +const u16 gWallpaperPalettes_Savanna[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Savanna_2[] = INCBIN_U16("graphics/pokemon_storage/savanna_frame.gbapal"); +const u16 gWallpaperPalettes_Savanna_2_3[] = INCBIN_U16("graphics/pokemon_storage/savanna_bg.gbapal"); + +const u8 gWallpaperTiles_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.4bpp.lz"); + +const u8 gWallpaperTilemap_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.bin.lz"); + +const u16 gWallpaperPalettes_Crag[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Crag_2[] = INCBIN_U16("graphics/pokemon_storage/crag_frame.gbapal"); +const u16 gWallpaperPalettes_Crag_2_3[] = INCBIN_U16("graphics/pokemon_storage/crag_bg.gbapal"); + +const u8 gWallpaperTiles_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.4bpp.lz"); + +const u8 gWallpaperTilemap_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.bin.lz"); + +const u16 gWallpaperPalettes_Volcano[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Volcano_2[] = INCBIN_U16("graphics/pokemon_storage/volcano_frame.gbapal"); +const u16 gWallpaperPalettes_Volcano_2_3[] = INCBIN_U16("graphics/pokemon_storage/volcano_bg.gbapal"); + +const u8 gWallpaperTiles_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.4bpp.lz"); +const u32 filler_83b871c = 0; // needed to match but otherwise garbage + +const u8 gWallpaperTilemap_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.bin.lz"); + +const u16 gWallpaperPalettes_Snow[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Snow_2[] = INCBIN_U16("graphics/pokemon_storage/snow_frame.gbapal"); +const u16 gWallpaperPalettes_Snow_2_3[] = INCBIN_U16("graphics/pokemon_storage/snow_bg.gbapal"); + +const u8 gWallpaperTiles_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.4bpp.lz"); + +const u8 gWallpaperTilemap_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.bin.lz"); + +const u16 gWallpaperPalettes_Cave[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Cave_2[] = INCBIN_U16("graphics/pokemon_storage/cave_frame.gbapal"); +const u16 gWallpaperPalettes_Cave_2_3[] = INCBIN_U16("graphics/pokemon_storage/cave_bg.gbapal"); + +const u8 gWallpaperTiles_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.4bpp.lz"); + +const u8 gWallpaperTilemap_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.bin.lz"); + +const u16 gWallpaperPalettes_Beach[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Beach_2[] = INCBIN_U16("graphics/pokemon_storage/beach_frame.gbapal"); +const u16 gWallpaperPalettes_Beach_2_3[] = INCBIN_U16("graphics/pokemon_storage/beach_bg.gbapal"); + +const u8 gWallpaperTiles_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.4bpp.lz"); + +const u8 gWallpaperTilemap_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.bin.lz"); + +const u16 gWallpaperPalettes_Seafloor[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Seafloor_2[] = INCBIN_U16("graphics/pokemon_storage/seafloor_frame.gbapal"); +const u16 gWallpaperPalettes_Seafloor_2_3[] = INCBIN_U16("graphics/pokemon_storage/seafloor_bg.gbapal"); + +const u8 gWallpaperTiles_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.4bpp.lz"); + +const u8 gWallpaperTilemap_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.bin.lz"); + +const u16 gWallpaperPalettes_River[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_River_2[] = INCBIN_U16("graphics/pokemon_storage/river_frame.gbapal"); +const u16 gWallpaperPalettes_River_2_3[] = INCBIN_U16("graphics/pokemon_storage/river_bg.gbapal"); + +const u8 gWallpaperTiles_River[] = INCBIN_U8("graphics/pokemon_storage/river.4bpp.lz"); + +const u8 gWallpaperTilemap_River[] = INCBIN_U8("graphics/pokemon_storage/river.bin.lz"); + +const u16 gWallpaperPalettes_Sky[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Sky_2[] = INCBIN_U16("graphics/pokemon_storage/sky_frame.gbapal"); +const u16 gWallpaperPalettes_Sky_2_3[] = INCBIN_U16("graphics/pokemon_storage/sky_bg.gbapal"); + +const u8 gWallpaperTiles_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.4bpp.lz"); + +const u8 gWallpaperTilemap_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.bin.lz"); + +const u16 gWallpaperPalettes_Polkadot[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal"); +const u16 gWallpaperPalettes_Polkadot_2[] = INCBIN_U16("graphics/pokemon_storage/polkadot_frame.gbapal"); +const u16 gWallpaperPalettes_Polkadot_2_3[] = INCBIN_U16("graphics/pokemon_storage/polkadot_bg.gbapal"); + +const u8 gWallpaperTiles_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.4bpp.lz"); + +const u8 gWallpaperTilemap_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.bin.lz"); + +const u16 gWallpaperPalettes_Pokecenter[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal"); +const u16 gWallpaperPalettes_Pokecenter_2[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_frame.gbapal"); +const u16 gWallpaperPalettes_Pokecenter_2_3[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_bg.gbapal"); + +const u8 gWallpaperTiles_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.4bpp.lz"); + +const u8 gWallpaperTilemap_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.bin.lz"); + +const u16 gWallpaperPalettes_Machine[] = INCBIN_U16("graphics/pokemon_storage/box_bg3.gbapal"); +const u16 gWallpaperPalettes_Machine_2[] = INCBIN_U16("graphics/pokemon_storage/machine_frame.gbapal"); +const u16 gWallpaperPalettes_Machine_2_3[] = INCBIN_U16("graphics/pokemon_storage/machine_bg.gbapal"); + +const u8 gWallpaperTiles_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.4bpp.lz"); + +const u8 gWallpaperTilemap_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.bin.lz"); + +const u16 gWallpaperPalettes_Plain[] = INCBIN_U16("graphics/pokemon_storage/box_bg4.gbapal"); +const u16 gWallpaperPalettes_Plain_2[] = INCBIN_U16("graphics/pokemon_storage/plain_frame.gbapal"); +const u16 gWallpaperPalettes_Plain_2_3[] = INCBIN_U16("graphics/pokemon_storage/plain_bg.gbapal"); + +const u8 gWallpaperTiles_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.4bpp.lz"); + +const u8 gWallpaperTilemap_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.bin.lz"); + +const u16 gUnknown_083BAEF8[] = INCBIN_U16("graphics/unused/tilemap_3BAEF8.bin"); + +const u16 gUnknown_083BB0A8[][2] = { + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF} +}; + +const struct WallpaperTable gWallpaperTable[] = { + {gWallpaperTiles_Forest, 0x3D0, gWallpaperTilemap_Forest, gWallpaperPalettes_Forest}, // Forest + {gWallpaperTiles_City, 0x208, gWallpaperTilemap_City, gWallpaperPalettes_City}, // City + {gWallpaperTiles_Desert, 0x2EC, gWallpaperTilemap_Desert, gWallpaperPalettes_Desert}, // Desert + {gWallpaperTiles_Savanna, 0x220, gWallpaperTilemap_Savanna, gWallpaperPalettes_Savanna}, // Savanna + {gWallpaperTiles_Crag, 0x350, gWallpaperTilemap_Crag, gWallpaperPalettes_Crag}, // Crag + {gWallpaperTiles_Volcano, 0x334, gWallpaperTilemap_Volcano, gWallpaperPalettes_Volcano}, // Volcano + {gWallpaperTiles_Snow, 0x2B8, gWallpaperTilemap_Snow, gWallpaperPalettes_Snow}, // Snow + {gWallpaperTiles_Cave, 0x344, gWallpaperTilemap_Cave, gWallpaperPalettes_Cave}, // Cave + {gWallpaperTiles_Beach, 0x384, gWallpaperTilemap_Beach, gWallpaperPalettes_Beach}, // Beach + {gWallpaperTiles_Seafloor, 0x2B4, gWallpaperTilemap_Seafloor, gWallpaperPalettes_Seafloor}, // Seafloor + {gWallpaperTiles_River, 0x294, gWallpaperTilemap_River, gWallpaperPalettes_River}, // River + {gWallpaperTiles_Sky, 0x298, gWallpaperTilemap_Sky, gWallpaperPalettes_Sky}, // Sky + {gWallpaperTiles_Polkadot, 0x1FC, gWallpaperTilemap_Polkadot, gWallpaperPalettes_Polkadot}, // Polkadot + {gWallpaperTiles_Pokecenter, 0x3A4, gWallpaperTilemap_Pokecenter, gWallpaperPalettes_Pokecenter}, // Pokecenter + {gWallpaperTiles_Machine, 0x2F0, gWallpaperTilemap_Machine, gWallpaperPalettes_Machine}, // Machine + {gWallpaperTiles_Plain, 0xFC, gWallpaperTilemap_Plain, gWallpaperPalettes_Plain} // Plain +}; + +void sub_8099EB0(u8 boxId, s8 a1) +{ + const struct WallpaperTable *wallpaperTable; + + if (a1) + { + gPokemonStorageSystemPtr->unk_08ba = gPokemonStorageSystemPtr->unk_08ba ? FALSE : TRUE; + sub_809A14C(BG_SCREEN_ADDR(26)); + } + wallpaperTable = gWallpaperTable +gPokemonStorage.wallpaper[boxId]; + LoadPalette(wallpaperTable->palettes, gPokemonStorageSystemPtr->unk_08ba * 0x30 + 0x40, 0x60); + LZ77UnCompWram(wallpaperTable->tileMap, gPokemonStorageSystemPtr->unk_0d62); + sub_8099F58(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); + LZ77UnCompVram(wallpaperTable->tiles, BG_CHAR_ADDR(2) + (gPokemonStorageSystemPtr->unk_08ba << 13)); +} -- cgit v1.2.3 From e9c74d2472bc322b9d60f1b7033268efbd0bd159 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 13 Jan 2018 13:02:57 -0500 Subject: nonmatching sub_8099F58 --- src/pokemon/pokemon_storage_system_4.c | 350 +++++++++++++++++++++++++++++++++ 1 file changed, 350 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 8982ce461..9f19814a5 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -323,3 +323,353 @@ void sub_8099EB0(u8 boxId, s8 a1) sub_8099F58(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); LZ77UnCompVram(wallpaperTable->tiles, BG_CHAR_ADDR(2) + (gPokemonStorageSystemPtr->unk_08ba << 13)); } + +#ifdef NONMATCHING +void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) +{ + s16 r6; + s16 r3; + u16 sp0 = a3 << 8; + u16 sp4 = (a3 * 3 + 4) << 12; + u16 *r4; + u16 *r7; + u16 i; + u16 j; + s16 sp8 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 10 + a2 * 24) & 0x3f; + if (sp8 < 13) + { + r6 = 20; + r3 = 0; + r4 = vdest + sp8 + 0x40; + r7 = NULL; + } + else if (sp8 < 32) + { + r6 = 32 - sp8; + r3 = 20 - r6; + r4 = vdest + sp8 + 0x40; + r7 = vdest + 0x440; + } + else if (sp8 < 45) + { + r6 = 20; + r3 = 0; + r4 = vdest + sp8 + 0x420; + r7 = NULL; + } + else + { + r6 = 64 - sp8; + r3 = 20 - r6; + r4 = vdest + sp8 + 0x420; + r7 = vdest + 0x40; + } + for (i = 0; i < 18; i++) + { + for (j = 0; j < r6; j++) + { + u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); + r4[j] = tile; + src++; + } + for (j = 0; j < r3; j++) + { + u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); + r7[j] = tile; + src++; + } + r4 += 0x20; + r7 += 0x20; + } + if (a2) + { + s16 r4_2; + u16 *r2; + if (a2 > 0) + r4_2 = (sp8 + 20) & 0x3f; + else + r4_2 = (sp8 - 4) & 0x3f; + r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; + for (i = 0; i < 4; i++) + { + for (j = 0; j < 18; j++) + { + *r2 = 0; + r2 += 0x20; + } + r4_2++; + r4_2 &= 0x3f; + r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; + } + } +} +#else +__attribute__((naked)) void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x20\n" + "\tmov r9, r0\n" + "\tadds r5, r1, 0\n" + "\tlsls r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tlsls r0, r3, 8\n" + "\tstr r0, [sp]\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r3\n" + "\tadds r0, 0x4\n" + "\tlsls r0, 28\n" + "\tlsrs r0, 16\n" + "\tstr r0, [sp, 0x4]\n" + "\tldr r0, _08099FB8 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldr r1, _08099FBC @ =0x000008b4\n" + "\tadds r0, r1\n" + "\tldrh r1, [r0]\n" + "\tlsrs r1, 3\n" + "\tadds r1, 0xA\n" + "\tlsrs r0, r2, 24\n" + "\tmov r8, r0\n" + "\tasrs r2, 24\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, r2\n" + "\tlsls r0, 3\n" + "\tadds r1, r0\n" + "\tmovs r0, 0x3F\n" + "\tands r1, r0\n" + "\tstr r1, [sp, 0x8]\n" + "\tadds r2, r1, 0\n" + "\tcmp r2, 0xC\n" + "\tbgt _08099FC0\n" + "\tmovs r6, 0x14\n" + "\tmovs r3, 0\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, 0x80\n" + "\tmov r1, r9\n" + "\tadds r4, r1, r0\n" + "\tmovs r7, 0\n" + "\tb _0809A020\n" + "\t.align 2, 0\n" + "_08099FB8: .4byte gPokemonStorageSystemPtr\n" + "_08099FBC: .4byte 0x000008b4\n" + "_08099FC0:\n" + "\tcmp r2, 0x1F\n" + "\tbgt _08099FE6\n" + "\tmovs r0, 0x20\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tmovs r1, 0x14\n" + "\tlsrs r6, r0, 16\n" + "\tasrs r0, 16\n" + "\tsubs r1, r0\n" + "\tlsls r1, 16\n" + "\tlsrs r3, r1, 16\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, 0x80\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmovs r7, 0x88\n" + "\tlsls r7, 4\n" + "\tadd r7, r9\n" + "\tb _0809A020\n" + "_08099FE6:\n" + "\tcmp r2, 0x2C\n" + "\tbgt _08099FFE\n" + "\tmovs r6, 0x14\n" + "\tmovs r3, 0\n" + "\tlsls r0, r2, 1\n" + "\tmovs r1, 0x84\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmovs r7, 0\n" + "\tb _0809A020\n" + "_08099FFE:\n" + "\tmovs r0, 0x40\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tmovs r1, 0x14\n" + "\tlsrs r6, r0, 16\n" + "\tasrs r0, 16\n" + "\tsubs r1, r0\n" + "\tlsls r1, 16\n" + "\tlsrs r3, r1, 16\n" + "\tlsls r0, r2, 1\n" + "\tmovs r1, 0x84\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmov r7, r9\n" + "\tadds r7, 0x80\n" + "_0809A020:\n" + "\tmovs r1, 0\n" + "\tmov r0, r8\n" + "\tlsls r0, 24\n" + "\tstr r0, [sp, 0x14]\n" + "\tlsls r0, r6, 16\n" + "\tasrs r0, 16\n" + "\tmov r8, r0\n" + "\tlsls r3, 16\n" + "\tstr r3, [sp, 0xC]\n" + "\tasrs r2, r3, 16\n" + "\tstr r2, [sp, 0x10]\n" + "_0809A036:\n" + "\tmovs r3, 0\n" + "\tadds r0, r4, 0\n" + "\tadds r0, 0x40\n" + "\tstr r0, [sp, 0x18]\n" + "\tadds r2, r7, 0\n" + "\tadds r2, 0x40\n" + "\tstr r2, [sp, 0x1C]\n" + "\tadds r1, 0x1\n" + "\tmov r10, r1\n" + "\tcmp r3, r8\n" + "\tbge _0809A07A\n" + "\tldr r0, _0809A0D4 @ =0x00000fff\n" + "\tmov r12, r0\n" + "\tmovs r6, 0xF0\n" + "\tlsls r6, 8\n" + "_0809A054:\n" + "\tldrh r2, [r5]\n" + "\tmov r0, r12\n" + "\tands r0, r2\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, r0\n" + "\tadds r1, r6, 0\n" + "\tands r1, r2\n" + "\tldr r2, [sp, 0x4]\n" + "\tadds r1, r2, r1\n" + "\torrs r1, r0\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r4\n" + "\tstrh r1, [r0]\n" + "\tadds r5, 0x2\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, r8\n" + "\tblt _0809A054\n" + "_0809A07A:\n" + "\tmovs r3, 0\n" + "\tldr r0, [sp, 0x10]\n" + "\tcmp r3, r0\n" + "\tbge _0809A0B4\n" + "\tldr r1, _0809A0D4 @ =0x00000fff\n" + "\tmov r12, r1\n" + "\tmovs r6, 0xF0\n" + "\tlsls r6, 8\n" + "\tldr r2, [sp, 0xC]\n" + "\tasrs r4, r2, 16\n" + "_0809A08E:\n" + "\tldrh r2, [r5]\n" + "\tmov r0, r12\n" + "\tands r0, r2\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, r0\n" + "\tadds r1, r6, 0\n" + "\tands r1, r2\n" + "\tldr r2, [sp, 0x4]\n" + "\tadds r1, r2, r1\n" + "\torrs r1, r0\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r7\n" + "\tstrh r1, [r0]\n" + "\tadds r5, 0x2\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, r4\n" + "\tblt _0809A08E\n" + "_0809A0B4:\n" + "\tldr r4, [sp, 0x18]\n" + "\tldr r7, [sp, 0x1C]\n" + "\tmov r1, r10\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0x11\n" + "\tbls _0809A036\n" + "\tldr r0, [sp, 0x14]\n" + "\tasrs r2, r0, 24\n" + "\tcmp r2, 0\n" + "\tbeq _0809A13A\n" + "\tcmp r2, 0\n" + "\tble _0809A0D8\n" + "\tldr r1, [sp, 0x8]\n" + "\tadds r1, 0x14\n" + "\tb _0809A0DC\n" + "\t.align 2, 0\n" + "_0809A0D4: .4byte 0x00000fff\n" + "_0809A0D8:\n" + "\tldr r1, [sp, 0x8]\n" + "\tsubs r1, 0x4\n" + "_0809A0DC:\n" + "\tmovs r0, 0x3F\n" + "\tands r1, r0\n" + "\tadds r4, r1, 0\n" + "\tadds r0, r4, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A0EE\n" + "\tlsls r0, 1\n" + "\tadds r0, 0x80\n" + "\tb _0809A0F6\n" + "_0809A0EE:\n" + "\tlsls r0, 1\n" + "\tmovs r2, 0x84\n" + "\tlsls r2, 4\n" + "\tadds r0, r2\n" + "_0809A0F6:\n" + "\tmov r1, r9\n" + "\tadds r2, r1, r0\n" + "\tmovs r3, 0\n" + "\tmovs r6, 0\n" + "_0809A0FE:\n" + "\tmovs r1, 0\n" + "\tadds r5, r3, 0x1\n" + "\tlsls r3, r4, 16\n" + "_0809A104:\n" + "\tstrh r6, [r2]\n" + "\tadds r2, 0x40\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0x11\n" + "\tbls _0809A104\n" + "\tasrs r0, r3, 16\n" + "\tadds r4, r0, 0x1\n" + "\tmovs r0, 0x3F\n" + "\tands r4, r0\n" + "\tadds r0, r4, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A126\n" + "\tlsls r0, 1\n" + "\tadds r0, 0x80\n" + "\tb _0809A12E\n" + "_0809A126:\n" + "\tlsls r0, 1\n" + "\tmovs r2, 0x84\n" + "\tlsls r2, 4\n" + "\tadds r0, r2\n" + "_0809A12E:\n" + "\tmov r1, r9\n" + "\tadds r2, r1, r0\n" + "\tlsls r0, r5, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, 0x3\n" + "\tbls _0809A0FE\n" + "_0809A13A:\n" + "\tadd sp, 0x20\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif -- cgit v1.2.3 From a5721ffd736f30d424da8aede5c52071365f3850 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 13 Jan 2018 16:40:15 -0500 Subject: nonmatching sub_809A14C --- src/pokemon/pokemon_storage_system_4.c | 84 ++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 9f19814a5..1ccaa01f1 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -673,3 +673,87 @@ __attribute__((naked)) void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3 "\tbx r0"); } #endif + +#ifdef NONMATCHING +void sub_809A14C(u16 *vdest) +{ + u16 *r2; + u16 i; + int r3 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 30) & 0x3f; + r2 = vdest + (r3 < 0x20 ? r3 + 0x260 : r3 + 0x640); + for (i = 0; i < 0x2b; i++) + { + *r2++ = 0; + r3++; + r3 &= 0x3f; + if (r3 == 0) + r2 -= 0x420; + if (r3 == 0x20) + r2 += 0x3e0; + } +} +#else +__attribute__((naked)) void sub_809A14C(u16 *vdest) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r2, r0, 0\n" + "\tldr r0, _0809A174 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldr r1, _0809A178 @ =0x000008b4\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0]\n" + "\tlsrs r0, 3\n" + "\tadds r3, r0, 0\n" + "\tadds r3, 0x1E\n" + "\tmovs r0, 0x3F\n" + "\tands r3, r0\n" + "\tadds r0, r3, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A17C\n" + "\tlsls r0, 1\n" + "\tmovs r6, 0x98\n" + "\tlsls r6, 3\n" + "\tadds r0, r6\n" + "\tb _0809A184\n" + "\t.align 2, 0\n" + "_0809A174: .4byte gPokemonStorageSystemPtr\n" + "_0809A178: .4byte 0x000008b4\n" + "_0809A17C:\n" + "\tlsls r0, 1\n" + "\tmovs r1, 0xC8\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "_0809A184:\n" + "\tadds r2, r0\n" + "\tmovs r0, 0\n" + "\tmovs r5, 0\n" + "\tmovs r4, 0x3F\n" + "_0809A18C:\n" + "\tstrh r5, [r2]\n" + "\tadds r2, 0x2\n" + "\tadds r3, 0x1\n" + "\tands r3, r4\n" + "\tadds r1, r3, 0\n" + "\tcmp r1, 0\n" + "\tbne _0809A19E\n" + "\tldr r6, _0809A1B8 @ =0xfffff7c0\n" + "\tadds r2, r6\n" + "_0809A19E:\n" + "\tcmp r1, 0x20\n" + "\tbne _0809A1A8\n" + "\tmovs r1, 0xF8\n" + "\tlsls r1, 3\n" + "\tadds r2, r1\n" + "_0809A1A8:\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x2B\n" + "\tbls _0809A18C\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0809A1B8: .4byte 0xfffff7c0"); +} +#endif -- cgit v1.2.3 From daa0a98ee0129be1797274de318a35df30d39020 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 13 Jan 2018 20:07:32 -0500 Subject: through sub_809A23C --- src/pokemon/pokemon_storage_system_4.c | 90 ++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 1ccaa01f1..836a3433f 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -2,6 +2,8 @@ // Includes #include "global.h" #include "palette.h" +#include "text.h" +#include "menu.h" #include "pokemon_storage_system.h" // Static type declarations @@ -35,6 +37,7 @@ void sub_809A23C(u8 boxId); void sub_809A3D0(u8 boxId, s8 a1); void sub_809A598(void); void sub_809A654(void); +s16 sub_809A6D0(u8 width); void sub_809A6DC(void); void sub_809A774(s8 a0); void sub_809A810(void); @@ -757,3 +760,90 @@ __attribute__((naked)) void sub_809A14C(u16 *vdest) "_0809A1B8: .4byte 0xfffff7c0"); } #endif + +void sub_809A1BC(const u8 *a0, const u8 *text) +{ + u8 *r5 = gUnknown_083B6DB8; + DmaClear16(3, r5, 0x200); + Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, r5, text); + DmaCopy16(3, r5 + 0x000, a0 + 0x000, 0x80); + DmaCopy16(3, r5 + 0x100, a0 + 0x080, 0x80); + DmaCopy16(3, r5 + 0x080, a0 + 0x100, 0x80); + DmaCopy16(3, r5 + 0x180, a0 + 0x180, 0x80); +} + +const struct SpriteTemplate gSpriteTemplate_83BB2B8; + +void sub_809A23C(u8 boxId) +{ + u8 tagIdx; + s16 r6; + u16 i; + + struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3}; + struct SpritePalette palettes[] = { + {gPokemonStorageSystemPtr->unk_0ccc, 0xdac8}, + {gPokemonStorageSystemPtr->unk_0ccc, 0xdac9}, + {} + }; + + u16 wallpaper = gPokemonStorage.wallpaper[boxId]; + gPokemonStorageSystemPtr->unk_0ccc[14] = gUnknown_083BB0A8[wallpaper][0]; + gPokemonStorageSystemPtr->unk_0ccc[15] = gUnknown_083BB0A8[wallpaper][1]; + LoadSpritePalettes(palettes); + gPokemonStorageSystemPtr->unk_0d08 = 0x3f0; + tagIdx = IndexOfSpritePaletteTag(0xdac8); + gPokemonStorageSystemPtr->unk_0cec = 0x10e + 16 * tagIdx; + gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx; + tagIdx = IndexOfSpritePaletteTag(0xdac9); + gPokemonStorageSystemPtr->unk_0cee = 0x10e + 16 * tagIdx; + gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx; + sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]); + LoadSpriteSheet(&spriteSheet); + r6 = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId])); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2B8, r6 + i * 32, 0x1c, 23); + gPokemonStorageSystemPtr->unk_0cf0[i] = gSprites + spriteId; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf0[i], i); + } + gPokemonStorageSystemPtr->unk_0cca = 0; +} + + +const u16 PCPal_Arrow[] = INCBIN_U16("graphics/pokemon_storage/arrow.gbapal"); +const u8 PCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); + +const struct SpriteSheet gUnknown_083BB288 = {PCGfx_Arrow, 0x80, 6}; +const struct SpritePalette gUnknown_083BB290 = {PCPal_Arrow, 0xdacf}; + +const struct OamData gOamData_83BB298 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83BB2A0[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83BB2A8[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = { + gSpriteAnim_83BB2A0, + gSpriteAnim_83BB2A8 +}; + +const struct SpriteTemplate gSpriteTemplate_83BB2B8 = { + 3, + 0xdac8, + &gOamData_83BB298, + gSpriteAnimTable_83BB2B0, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; -- cgit v1.2.3 From e8daaa0f3ef2d97f7afe378494f33037f5bc8ee9 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 14 Jan 2018 18:21:22 -0500 Subject: sub_809A3D0 --- src/pokemon/pokemon_storage_system_4.c | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 836a3433f..b0378a254 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -36,11 +36,14 @@ void sub_809A14C(u16 *vdest); void sub_809A23C(u8 boxId); void sub_809A3D0(u8 boxId, s8 a1); void sub_809A598(void); +void sub_809A5E8(struct Sprite *sprite); +void sub_809A61C(struct Sprite *sprite); void sub_809A654(void); s16 sub_809A6D0(u8 width); void sub_809A6DC(void); void sub_809A774(s8 a0); void sub_809A810(void); +void sub_809A8C8(struct Sprite *sprite); // .rodata @@ -810,6 +813,47 @@ void sub_809A23C(u8 boxId) gPokemonStorageSystemPtr->unk_0cca = 0; } +void sub_809A3D0(u8 boxId, s8 a1) +{ + u16 r8; + s16 x; + s16 x2; + u16 i; + struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3}; + struct SpriteTemplate template = gSpriteTemplate_83BB2B8; + + gPokemonStorageSystemPtr->unk_0cca = gPokemonStorageSystemPtr->unk_0cca ? FALSE : TRUE; + if (gPokemonStorageSystemPtr->unk_0cca == 0) + { + spriteSheet.tag = 3; + r8 = gPokemonStorageSystemPtr->unk_0cec; + } + else + { + spriteSheet.tag = 4; + r8 = gPokemonStorageSystemPtr->unk_0cec; + template.tileTag = 4; + template.paletteTag = 0xdac9; + } + sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]); + LoadSpriteSheet(&spriteSheet); + LoadPalette(gUnknown_083BB0A8[gPokemonStorage.wallpaper[boxId]], r8, 0x04); + x = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId])); + x2 = x + a1 * 192; + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&template, i * 32 + x2, 0x1c, 23); + gPokemonStorageSystemPtr->unk_0cf8[i] = gSprites + spriteId; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[0] = (-a1) * 6; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[1] = i * 32 + x; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[2] = 1; + gPokemonStorageSystemPtr->unk_0cf8[i]->callback = sub_809A5E8; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf8[i], i); + gPokemonStorageSystemPtr->unk_0cf0[i]->data[0] = (-a1) * 6; + gPokemonStorageSystemPtr->unk_0cf0[i]->data[1] = 1; + gPokemonStorageSystemPtr->unk_0cf0[i]->callback = sub_809A61C; + } +} const u16 PCPal_Arrow[] = INCBIN_U16("graphics/pokemon_storage/arrow.gbapal"); const u8 PCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); -- cgit v1.2.3 From f33a73ed931885507b1a5f199044d85255078bc2 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 14 Jan 2018 18:37:27 -0500 Subject: through sub_809A6D0 --- src/pokemon/pokemon_storage_system_4.c | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index b0378a254..b48b20d5c 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -891,3 +891,49 @@ const struct SpriteTemplate gSpriteTemplate_83BB2B8 = { gDummySpriteAffineAnimTable, SpriteCallbackDummy }; + +void sub_809A598(void) +{ + if (gPokemonStorageSystemPtr->unk_0cca == 0) + FreeSpriteTilesByTag(4); + else + FreeSpriteTilesByTag(3); + gPokemonStorageSystemPtr->unk_0cf0[0] = gPokemonStorageSystemPtr->unk_0cf8[0]; + gPokemonStorageSystemPtr->unk_0cf0[1] = gPokemonStorageSystemPtr->unk_0cf8[1]; +} + +void sub_809A5E8(struct Sprite *sprite) +{ + if (sprite->data[2]) + sprite->data[2]--; + else if ((sprite->pos1.x += sprite->data[0]) == sprite->data[1]) + sprite->callback = SpriteCallbackDummy; +} + +void sub_809A61C(struct Sprite *sprite) +{ + if (sprite->data[1]) + sprite->data[1]--; + else + { + sprite->pos1.x += sprite->data[0]; + sprite->data[2] = sprite->pos1.x + sprite->pos2.x; + if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100) + DestroySprite(sprite); + } +} + +void sub_809A654(void) +{ + u8 boxId = get_preferred_box(); + u8 wallpaperId = gPokemonStorage.wallpaper[boxId]; + if (gPokemonStorageSystemPtr->unk_0cca == 0) + CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cec, 4); + else + CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cee, 4); +} + +s16 sub_809A6D0(u8 width) +{ + return 0xb0 - width / 2; +} -- cgit v1.2.3 From 5fcd1184d8a189887e44559edb12417717afca5b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 14 Jan 2018 19:10:31 -0500 Subject: through sub_809A860 --- src/pokemon/pokemon_storage_system_2.c | 8 +- src/pokemon/pokemon_storage_system_4.c | 384 +++++++++++++++++++++------------ 2 files changed, 253 insertions(+), 139 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index 290fa120a..4657ed158 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -1096,7 +1096,7 @@ void sub_809789C(void) { case -1: case 0: - sub_809A860(1); + sub_809A860(TRUE); sub_8098A5C(); SetPSSCallback(sub_8096C84); break; @@ -1133,7 +1133,7 @@ void sub_8097974(void) switch (gPokemonStorageSystemPtr->unk_0d5e) { case -1: - sub_809A860(1); + sub_809A860(TRUE); sub_8098A5C(); SetPSSCallback(sub_8096C84); break; @@ -1168,7 +1168,7 @@ void sub_8097974(void) case 3: if (!sub_8099E08()) { - sub_809A860(1); + sub_809A860(TRUE); SetPSSCallback(sub_8096C84); } break; @@ -1197,7 +1197,7 @@ void sub_8097A64(void) sub_8096310(); if (gPokemonStorageSystemPtr->unk_08b2 == 201 || gPokemonStorageSystemPtr->unk_08b2 == gPokemonStorage.currentBox) { - sub_809A860(1); + sub_809A860(TRUE); SetPSSCallback(sub_8096C84); } else diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index b48b20d5c..b40cc916c 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -44,107 +44,10 @@ void sub_809A6DC(void); void sub_809A774(s8 a0); void sub_809A810(void); void sub_809A8C8(struct Sprite *sprite); +bool8 sub_809BF2C(void); // .rodata -// .text - -void sub_8099BF8(u8 boxId) -{ - gPokemonStorageSystemPtr->unk_08ba = FALSE; - gPokemonStorageSystemPtr->unk_08b4 = 0; - DmaFill32(3, 0, BG_SCREEN_ADDR(26), 0x1000); - sub_8099EB0(boxId, 0); - sub_809A23C(boxId); - sub_809A6DC(); - SpawnBoxIconSprites(boxId); - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT512x256; -} - -void sub_8099C70(u8 whichBox) -{ - s8 r4 = sub_8099D90(whichBox); - sub_8099EB0(whichBox, r4); - gPokemonStorageSystemPtr->unk_08b6 = r4 * 6; - gPokemonStorageSystemPtr->unk_08b8 = 0x20; - gPokemonStorageSystemPtr->unk_08bb = whichBox; - gPokemonStorageSystemPtr->unk_08bc = r4 > 0 ? 0 : 5; - gPokemonStorageSystemPtr->unk_08be = r4; - gPokemonStorageSystemPtr->unk_08c0 = r4 > 0 ? 0x108 : 0x38; - gPokemonStorageSystemPtr->unk_08c2 = r4 > 0 ? 0 : 5; - gPokemonStorageSystemPtr->unk_08c4 = r4; - gPokemonStorageSystemPtr->unk_08c6 = 0; - gPokemonStorageSystemPtr->unk_08c8 = 2; - sub_809900C(whichBox, r4); - sub_809A3D0(whichBox, r4); - sub_809A774(r4); -} - -bool8 sub_8099D34(void) -{ - bool8 retVal = sub_80990AC(); - if (gPokemonStorageSystemPtr->unk_08b8 != 0) - { - gPokemonStorageSystemPtr->unk_08b4 += gPokemonStorageSystemPtr->unk_08b6; - gPokemonStorageSystemPtr->unk_08b4 &= 0x1ff; - if (--gPokemonStorageSystemPtr->unk_08b8 == 0) - { - sub_809A598(); - sub_809A810(); - } - return TRUE; - } - return retVal; -} - -s8 sub_8099D90(u8 boxId) -{ - u8 curBox = get_preferred_box(); - u8 i; - - for (i = 0; curBox != boxId; i++) - { - if (++curBox >= 14) - curBox = 0; - } - return i <= 6 ? 1 : -1; -} - -void sub_8099DCC(u8 wallpaperId) -{ - u8 curBox = get_preferred_box(); - gPokemonStorage.wallpaper[curBox] = wallpaperId; - gPokemonStorageSystemPtr->unk_1032 = 0; -} - -bool8 sub_8099E08(void) -{ - switch (gPokemonStorageSystemPtr->unk_1032) - { - case 0: - BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0, 0x10, 0xffff); - gPokemonStorageSystemPtr->unk_1032++; - break; - case 1: - if (!UpdatePaletteFade()) - { - u8 curBox = get_preferred_box(); - sub_8099EB0(curBox, 0); - sub_809A654(); - BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0x10, 0, 0xffff); - gPokemonStorageSystemPtr->unk_1032++; - } - break; - case 2: - if (!UpdatePaletteFade()) - gPokemonStorageSystemPtr->unk_1032++; - break; - case 3: - return FALSE; - } - return TRUE; -} - const u16 gWallpaperPalettes_Forest[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); const u16 gWallpaperPalettes_Forest_2[] = INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal"); const u16 gWallpaperPalettes_Forest_2_3[] = INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal"); @@ -314,6 +217,171 @@ const struct WallpaperTable gWallpaperTable[] = { {gWallpaperTiles_Plain, 0xFC, gWallpaperTilemap_Plain, gWallpaperPalettes_Plain} // Plain }; +const u16 PCPal_Arrow[] = INCBIN_U16("graphics/pokemon_storage/arrow.gbapal"); +const u8 PCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); + +const struct SpriteSheet gUnknown_083BB288 = {PCGfx_Arrow, 0x80, 6}; +const struct SpritePalette gUnknown_083BB290 = {PCPal_Arrow, 0xdacf}; + +const struct OamData gOamData_83BB298 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83BB2A0[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83BB2A8[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = { + gSpriteAnim_83BB2A0, + gSpriteAnim_83BB2A8 +}; + +const struct SpriteTemplate gSpriteTemplate_83BB2B8 = { + 3, + 0xdac8, + &gOamData_83BB298, + gSpriteAnimTable_83BB2B0, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_83BB2D0 = { + .shape = ST_OAM_V_RECTANGLE, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83BB2D8[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83BB2E0[] = { + ANIMCMD_FRAME(2, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83BB2E8[] = { + gSpriteAnim_83BB2D8, + gSpriteAnim_83BB2E0 +}; + +const struct SpriteTemplate gSpriteTemplate_83BB2F0 = { + 6, + 0xdacf, + &gOamData_83BB2D0, + gSpriteAnimTable_83BB2E8, + NULL, + gDummySpriteAffineAnimTable, + sub_809A8C8 +}; + +// .text + +void sub_8099BF8(u8 boxId) +{ + gPokemonStorageSystemPtr->unk_08ba = FALSE; + gPokemonStorageSystemPtr->unk_08b4 = 0; + DmaFill32(3, 0, BG_SCREEN_ADDR(26), 0x1000); + sub_8099EB0(boxId, 0); + sub_809A23C(boxId); + sub_809A6DC(); + SpawnBoxIconSprites(boxId); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT512x256; +} + +void sub_8099C70(u8 whichBox) +{ + s8 r4 = sub_8099D90(whichBox); + sub_8099EB0(whichBox, r4); + gPokemonStorageSystemPtr->unk_08b6 = r4 * 6; + gPokemonStorageSystemPtr->unk_08b8 = 0x20; + gPokemonStorageSystemPtr->unk_08bb = whichBox; + gPokemonStorageSystemPtr->unk_08bc = r4 > 0 ? 0 : 5; + gPokemonStorageSystemPtr->unk_08be = r4; + gPokemonStorageSystemPtr->unk_08c0 = r4 > 0 ? 0x108 : 0x38; + gPokemonStorageSystemPtr->unk_08c2 = r4 > 0 ? 0 : 5; + gPokemonStorageSystemPtr->unk_08c4 = r4; + gPokemonStorageSystemPtr->unk_08c6 = 0; + gPokemonStorageSystemPtr->unk_08c8 = 2; + sub_809900C(whichBox, r4); + sub_809A3D0(whichBox, r4); + sub_809A774(r4); +} + +bool8 sub_8099D34(void) +{ + bool8 retVal = sub_80990AC(); + if (gPokemonStorageSystemPtr->unk_08b8 != 0) + { + gPokemonStorageSystemPtr->unk_08b4 += gPokemonStorageSystemPtr->unk_08b6; + gPokemonStorageSystemPtr->unk_08b4 &= 0x1ff; + if (--gPokemonStorageSystemPtr->unk_08b8 == 0) + { + sub_809A598(); + sub_809A810(); + } + return TRUE; + } + return retVal; +} + +s8 sub_8099D90(u8 boxId) +{ + u8 curBox = get_preferred_box(); + u8 i; + + for (i = 0; curBox != boxId; i++) + { + if (++curBox >= 14) + curBox = 0; + } + return i <= 6 ? 1 : -1; +} + +void sub_8099DCC(u8 wallpaperId) +{ + u8 curBox = get_preferred_box(); + gPokemonStorage.wallpaper[curBox] = wallpaperId; + gPokemonStorageSystemPtr->unk_1032 = 0; +} + +bool8 sub_8099E08(void) +{ + switch (gPokemonStorageSystemPtr->unk_1032) + { + case 0: + BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0, 0x10, 0xffff); + gPokemonStorageSystemPtr->unk_1032++; + break; + case 1: + if (!UpdatePaletteFade()) + { + u8 curBox = get_preferred_box(); + sub_8099EB0(curBox, 0); + sub_809A654(); + BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0x10, 0, 0xffff); + gPokemonStorageSystemPtr->unk_1032++; + } + break; + case 2: + if (!UpdatePaletteFade()) + gPokemonStorageSystemPtr->unk_1032++; + break; + case 3: + return FALSE; + } + return TRUE; +} + void sub_8099EB0(u8 boxId, s8 a1) { const struct WallpaperTable *wallpaperTable; @@ -855,43 +923,6 @@ void sub_809A3D0(u8 boxId, s8 a1) } } -const u16 PCPal_Arrow[] = INCBIN_U16("graphics/pokemon_storage/arrow.gbapal"); -const u8 PCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); - -const struct SpriteSheet gUnknown_083BB288 = {PCGfx_Arrow, 0x80, 6}; -const struct SpritePalette gUnknown_083BB290 = {PCPal_Arrow, 0xdacf}; - -const struct OamData gOamData_83BB298 = { - .shape = ST_OAM_H_RECTANGLE, - .size = 2, - .priority = 2 -}; - -const union AnimCmd gSpriteAnim_83BB2A0[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83BB2A8[] = { - ANIMCMD_FRAME(8, 5), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = { - gSpriteAnim_83BB2A0, - gSpriteAnim_83BB2A8 -}; - -const struct SpriteTemplate gSpriteTemplate_83BB2B8 = { - 3, - 0xdac8, - &gOamData_83BB298, - gSpriteAnimTable_83BB2B0, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - void sub_809A598(void) { if (gPokemonStorageSystemPtr->unk_0cca == 0) @@ -937,3 +968,86 @@ s16 sub_809A6D0(u8 width) { return 0xb0 - width / 2; } + +void sub_809A6DC(void) +{ + u16 i; + + LoadSpriteSheet(&gUnknown_083BB288); + LoadSpritePalette(&gUnknown_083BB290); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, 0x5c + i * 0x88, 0x1c, 21); + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = gSprites + spriteId; + StartSpriteAnim(sprite, i); + sprite->data[3] = (i == 0) ? -1 : 1; + gPokemonStorageSystemPtr->unk_0d00[i] = sprite; + } + } + if (sub_809BF2C()) + sub_809A860(TRUE); +} + +void sub_809A774(s8 a0) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 2; + } + if (a0 < 0) + { + gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 29; + gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 5; + gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0x48; + gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0x48; + } + else + { + gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 5; + gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 29; + gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0xF8; + gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0xF8; + } + gPokemonStorageSystemPtr->unk_0d00[0]->data[7] = 0; + gPokemonStorageSystemPtr->unk_0d00[1]->data[7] = 1; +} + +void sub_809A810(void) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->pos1.x = 0x88 * i + 0x5c; + gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->invisible = FALSE; + } + sub_809A860(TRUE); +} + +void sub_809A860(bool8 a0) +{ + u16 i; + if (a0) + { + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 1; + gPokemonStorageSystemPtr->unk_0d00[i]->data[1] = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[2] = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[4] = 0; + } + } + else + { + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 0; + } + } +} -- cgit v1.2.3 From d8091a8fadb1089cbc090772bbb2fbcbab633357 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 14 Jan 2018 21:01:43 -0500 Subject: through sub_809AA98 --- src/pokemon/pokemon_storage_system_4.c | 94 +++++++++++++++++++++++++++++++--- 1 file changed, 87 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index b40cc916c..63d94b5a1 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -8,6 +8,13 @@ // Static type declarations +struct WallpaperTable { + const u8 *tiles; + u32 size; + const u8 *tileMap; + const u16 *palettes; +}; + // Static RAM declarations EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; @@ -19,13 +26,6 @@ EWRAM_DATA u8 gUnknown_020384E8 = 0; EWRAM_DATA u8 gUnknown_020384E9 = 0; EWRAM_DATA u16 gUnknown_020384EA = 0; -struct WallpaperTable { - const u8 *tiles; - u32 size; - const u8 *tileMap; - const u16 *palettes; -}; - // Static ROM declarations void sub_809900C(u8 boxId, s8 a1); @@ -45,6 +45,9 @@ void sub_809A774(s8 a0); void sub_809A810(void); void sub_809A8C8(struct Sprite *sprite); bool8 sub_809BF2C(void); +void sub_809BF74(void); +void sub_809C028(void); +void sub_809CC04(void); // .rodata @@ -1051,3 +1054,80 @@ void sub_809A860(bool8 a0) } } } + +void sub_809A8C8(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos2.x = 0; + break; + case 1: + if (++sprite->data[1] > 3) + { + sprite->data[1] = 0; + sprite->pos2.x += sprite->data[3]; + if (++sprite->data[2] > 5) + { + sprite->data[2] = 0; + sprite->pos2.x = 0; + } + } + break; + case 2: + sprite->data[0] = 3; + break; + case 3: + sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6; + if (sprite->pos1.x < 0x49 || sprite->pos1.x > 0xf7) + sprite->invisible = TRUE; + if (--sprite->data[1] == 0) + { + sprite->pos1.x = sprite->data[2]; + sprite->invisible = FALSE; + sprite->data[0] = 4; + } + break; + case 4: + sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6; + break; + } +} + +struct Sprite *sub_809A9A0(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, x, y, subpriority); + if (spriteId == MAX_SPRITES) + return NULL; + animId %= 2; + StartSpriteAnim(gSprites + spriteId, animId); + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].callback = SpriteCallbackDummy; + return gSprites + spriteId; +} + +void sub_809AA24(void) +{ + if (gPokemonStorageSystemPtr->unk_0005 != 1) + gUnknown_020384E4 = 0; + else + gUnknown_020384E4 = 1; + gUnknown_020384E5 = 0; + gUnknown_020384E6 = 0; + gUnknown_020384E7 = 0; + gUnknown_020384E8 = 0; + gUnknown_020384E9 = 0; + sub_809B0D4(); + sub_809CC04(); + gPokemonStorageSystemPtr->unk_11e2 = 1; + sub_809BF74(); +} + +void sub_809AA98(void) +{ + sub_809CC04(); + sub_809C028(); + gPokemonStorageSystemPtr->unk_11e2 = 1; + if (gUnknown_020384E6) + sub_8098BF0(); +} -- cgit v1.2.3 From 1288b752480e5d301c9ea9cff6d1efc737d6c5cc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 14 Jan 2018 21:25:25 -0500 Subject: through sub_809AB8C --- src/pokemon/pokemon_storage_system_4.c | 58 ++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 63d94b5a1..6d44b8ae8 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -1,6 +1,7 @@ // Includes #include "global.h" +#include "constants/species.h" #include "palette.h" #include "text.h" #include "menu.h" @@ -18,8 +19,8 @@ struct WallpaperTable { // Static RAM declarations EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; -EWRAM_DATA u8 gUnknown_020384E4 = 0; -EWRAM_DATA u8 gUnknown_020384E5 = 0; +EWRAM_DATA s8 gUnknown_020384E4 = 0; +EWRAM_DATA s8 gUnknown_020384E5 = 0; EWRAM_DATA u8 gUnknown_020384E6 = 0; EWRAM_DATA u8 gUnknown_020384E7 = 0; EWRAM_DATA u8 gUnknown_020384E8 = 0; @@ -1131,3 +1132,56 @@ void sub_809AA98(void) if (gUnknown_020384E6) sub_8098BF0(); } + +void sub_809AACC(u8 a0, u8 a1, u16 *a2, u16 *a3) +{ + switch (a0) + { + case 0: + *a2 = (a1 % 6) * 24 + 100; + *a3 = (a1 / 6) * 24 + 32; + break; + case 1: + if (a1 == 0) + { + *a2 = 0x68; + *a3 = 0x34; + } + else if (a1 == 6) + { + *a2 = 0x98; + *a3 = 0x84; + } + else + { + *a2 = 0x98; + *a3 = (a1 - 1) * 24 + 4; + } + break; + case 2: + *a2 = 0xa2; + *a3 = 0x0c; + break; + case 3: + *a3 = gUnknown_020384E6 ? 8 : 14; + *a2 = a1 * 0x58 + 0x78; + break; + case 4: + *a2 = 0xa0; + *a3 = 0x60; + break; + } +} + +u16 sub_809AB8C(void) +{ + switch (gUnknown_020384E4) + { + case 1: + return GetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_SPECIES); + case 0: + return GetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_SPECIES); + default: + return SPECIES_NONE; + } +} -- cgit v1.2.3 From 68528382d5d8a17c5d6d65f1566a9ba7c807e14a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 15:10:56 -0500 Subject: through sub_809AF18 --- src/pokemon/pokemon_storage_system_4.c | 121 +++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 6d44b8ae8..06c2eeff5 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -44,6 +44,7 @@ s16 sub_809A6D0(u8 width); void sub_809A6DC(void); void sub_809A774(s8 a0); void sub_809A810(void); +void sub_809AFB8(void); void sub_809A8C8(struct Sprite *sprite); bool8 sub_809BF2C(void); void sub_809BF74(void); @@ -1185,3 +1186,123 @@ u16 sub_809AB8C(void) return SPECIES_NONE; } } + +bool8 sub_809AC00(void) +{ + s16 tmp; + if (gPokemonStorageSystemPtr->unk_11dc == 0) + return FALSE; + if (--gPokemonStorageSystemPtr->unk_11dc) + { + gPokemonStorageSystemPtr->unk_11c8 += gPokemonStorageSystemPtr->unk_11d0; + gPokemonStorageSystemPtr->unk_11cc += gPokemonStorageSystemPtr->unk_11d4; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11c8 >> 8; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11cc >> 8; + if (gPokemonStorageSystemPtr->unk_11c0->pos1.x > 0x100) + { + tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.x - 0x100; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = tmp + 0x40; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.x < 0x40) + { + tmp = 0x40 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = 0x100 - tmp; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.y > 0xb0) + { + tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.y - 0xb0; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = tmp - 0x10; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.y < -0x10) + { + tmp = -0x10 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = 0xb0 - tmp; + } + if (gPokemonStorageSystemPtr->unk_11e3 && --gPokemonStorageSystemPtr->unk_11e3 == 0) + gPokemonStorageSystemPtr->unk_11c0->vFlip = gPokemonStorageSystemPtr->unk_11c0->vFlip ? FALSE : TRUE; + } + else + { + gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11d8; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11da; + sub_809AFB8(); + } + return TRUE; +} + +void sub_809AD3C(u8 a0, u8 a1) +{ + u16 x; + u16 y; + + sub_809AACC(a0, a1, &x, &y); + gPokemonStorageSystemPtr->unk_11e0 = a0; + gPokemonStorageSystemPtr->unk_11e1 = a1; + gPokemonStorageSystemPtr->unk_11d8 = x; + gPokemonStorageSystemPtr->unk_11da = y; +} + +void sub_809AD94(void) +{ + int r7; + int r0; + + if (gPokemonStorageSystemPtr->unk_11de || gPokemonStorageSystemPtr->unk_11df) + gPokemonStorageSystemPtr->unk_11dc = 12; + else + gPokemonStorageSystemPtr->unk_11dc = 6; + if (gPokemonStorageSystemPtr->unk_11e3) + gPokemonStorageSystemPtr->unk_11e3 = gPokemonStorageSystemPtr->unk_11dc >> 1; + switch (gPokemonStorageSystemPtr->unk_11de) + { + default: + r7 = gPokemonStorageSystemPtr->unk_11da - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + case -1: + r7 = gPokemonStorageSystemPtr->unk_11da - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + case 1: + r7 = gPokemonStorageSystemPtr->unk_11da + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + } + switch (gPokemonStorageSystemPtr->unk_11df) + { + default: + r0 = gPokemonStorageSystemPtr->unk_11d8 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + case -1: + r0 = gPokemonStorageSystemPtr->unk_11d8 - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + case 1: + r0 = gPokemonStorageSystemPtr->unk_11d8 + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + } + r7 <<= 8; + r0 <<= 8; + gPokemonStorageSystemPtr->unk_11d0 = r0 / gPokemonStorageSystemPtr->unk_11dc; + gPokemonStorageSystemPtr->unk_11d4 = r7 / gPokemonStorageSystemPtr->unk_11dc; + gPokemonStorageSystemPtr->unk_11c8 = gPokemonStorageSystemPtr->unk_11c0->pos1.x << 8; + gPokemonStorageSystemPtr->unk_11cc = gPokemonStorageSystemPtr->unk_11c0->pos1.y << 8; +} + +void sub_809AF18(u8 a0, u8 a1) +{ + sub_809AD3C(a0, a1); + sub_809AD94(); + if (gUnknown_020384E6 == 0) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); + if (a0 == 1 && gUnknown_020384E4 != 1) + { + gPokemonStorageSystemPtr->unk_11e2 = a0; + gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE; + } + switch (a0) + { + case 0: + break; + case 1 ... 3: + gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE; + gPokemonStorageSystemPtr->unk_11c4->oam.priority = 1; + break; + } +} -- cgit v1.2.3 From 650f85e7db8ea123256d661a7db59c9325115130 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 15:46:17 -0500 Subject: through sub_809B130 --- src/pokemon/pokemon_storage_system_4.c | 85 +++++++++++++++++++++++++++++++++- src/pokemon/pokemon_storage_system_6.c | 14 ------ 2 files changed, 84 insertions(+), 15 deletions(-) delete mode 100644 src/pokemon/pokemon_storage_system_6.c (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 06c2eeff5..2f2091259 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -25,7 +25,7 @@ EWRAM_DATA u8 gUnknown_020384E6 = 0; EWRAM_DATA u8 gUnknown_020384E7 = 0; EWRAM_DATA u8 gUnknown_020384E8 = 0; EWRAM_DATA u8 gUnknown_020384E9 = 0; -EWRAM_DATA u16 gUnknown_020384EA = 0; +EWRAM_DATA u8 gUnknown_020384EA = 0; // Static ROM declarations @@ -46,6 +46,9 @@ void sub_809A774(s8 a0); void sub_809A810(void); void sub_809AFB8(void); void sub_809A8C8(struct Sprite *sprite); +bool8 sub_809B150(void); +bool8 sub_809B1D8(void); +bool8 sub_809B24C(void); bool8 sub_809BF2C(void); void sub_809BF74(void); void sub_809C028(void); @@ -289,6 +292,16 @@ const struct SpriteTemplate gSpriteTemplate_83BB2F0 = { sub_809A8C8 }; +const u16 HandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_pal.bin"); +const u16 HandCursorAltPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_alt_pal.bin"); +const u8 HandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp"); +const u8 HandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp"); + +bool8 (*const gUnknown_083BBBC8[])(void) = { + sub_809B150, + sub_809B1D8, + sub_809B24C +}; // .text void sub_8099BF8(u8 boxId) @@ -1306,3 +1319,73 @@ void sub_809AF18(u8 a0, u8 a1) break; } } + +void sub_809AFB8(void) +{ + gUnknown_020384E4 = gPokemonStorageSystemPtr->unk_11e0; + gUnknown_020384E5 = gPokemonStorageSystemPtr->unk_11e1; + if (gUnknown_020384E6 == 0) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + sub_809BF74(); + switch (gUnknown_020384E4) + { + case 2: + sub_809A860(TRUE); + break; + case 1: + gPokemonStorageSystemPtr->unk_11c4->subpriority = 12; + break; + case 0: + gPokemonStorageSystemPtr->unk_11c4->oam.priority = 2; + gPokemonStorageSystemPtr->unk_11c4->subpriority = 20; + gPokemonStorageSystemPtr->unk_11c4->invisible = FALSE; + break; + } +} + +void sub_809B068(void) +{ + u8 partyCount; + if (gUnknown_020384E6 == 0) + partyCount = 0; + else + { + partyCount = CalculatePlayerPartyCount(); + if (partyCount > PARTY_SIZE - 1) + partyCount = PARTY_SIZE - 1; + } + if (gPokemonStorageSystemPtr->unk_11c0->vFlip) + gPokemonStorageSystemPtr->unk_11e3 = 1; + sub_809AF18(1, partyCount); +} + +void sub_809B0C0(u8 a0) +{ + sub_809AF18(0, a0); +} + +void sub_809B0D4(void) +{ + gUnknown_020384EA = 0; +} + +void sub_809B0E0(void) +{ + gUnknown_020384EA = gUnknown_020384E5; +} + +u8 sub_809B0F4(void) +{ + return gUnknown_020384EA; +} + +void sub_809B100(u8 a0) +{ + gPokemonStorageSystemPtr->unk_12a4 = gUnknown_083BBBC8[a0]; + gPokemonStorageSystemPtr->unk_12a8 = 0; +} + +bool8 sub_809B130(void) +{ + return gPokemonStorageSystemPtr->unk_12a4(); +} diff --git a/src/pokemon/pokemon_storage_system_6.c b/src/pokemon/pokemon_storage_system_6.c deleted file mode 100644 index a781c1ed2..000000000 --- a/src/pokemon/pokemon_storage_system_6.c +++ /dev/null @@ -1,14 +0,0 @@ - -// Includes -#include "global.h" -#include "pokemon_storage_system.h" - -// Static type declarations - -// Static RAM declarations - -// Static ROM declarations - -// .rodata - -// .text -- cgit v1.2.3 From 66fe535e7f5f0466c15f5f82dd1c2823fc6110cf Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 16:16:25 -0500 Subject: through sub_809B24C --- src/pokemon/pokemon_storage_system_4.c | 92 ++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 2f2091259..9e4865910 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -49,6 +49,11 @@ void sub_809A8C8(struct Sprite *sprite); bool8 sub_809B150(void); bool8 sub_809B1D8(void); bool8 sub_809B24C(void); +bool8 sub_809B324(void); +bool8 sub_809B358(void); +void sub_809B384(void); +void sub_809B3E0(void); +void diegohint1(u8 a0, u8 a1); bool8 sub_809BF2C(void); void sub_809BF74(void); void sub_809C028(void); @@ -1389,3 +1394,90 @@ bool8 sub_809B130(void) { return gPokemonStorageSystemPtr->unk_12a4(); } + +bool8 sub_809B150(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + if (gUnknown_020384E6) + return FALSE; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 1: + if (!sub_809B324()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); + sub_809B384(); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + if (!sub_809B358()) + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 3: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B1D8(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + if (!sub_809B324()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + sub_809B3E0(); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 1: + if (!sub_809B358()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B24C(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + switch (gUnknown_020384E4) + { + case 1: + gPokemonStorageSystemPtr->unk_12a9 = 14; + break; + case 0: + gPokemonStorageSystemPtr->unk_12a9 = get_preferred_box(); + break; + default: + return FALSE; + } + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + sub_80996B0(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5); + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 1: + if (!sub_809971C()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); + diegohint1(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} -- cgit v1.2.3 From e3238abc63ac7e939ccdc58e555a9dcdc66f3525 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 16:54:02 -0500 Subject: through sub_809B44C --- src/pokemon/pokemon_storage_system_4.c | 86 ++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 9e4865910..1127927bf 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -53,6 +53,9 @@ bool8 sub_809B324(void); bool8 sub_809B358(void); void sub_809B384(void); void sub_809B3E0(void); +void sub_809B44C(u8 a0, u8 a1); +void diegohint2(u8 a0, u8 a1); +void sub_809B548(u8 a0, u8 a1); void diegohint1(u8 a0, u8 a1); bool8 sub_809BF2C(void); void sub_809BF74(void); @@ -1481,3 +1484,86 @@ bool8 sub_809B24C(void) } return TRUE; } + +bool8 sub_809B324(void) +{ + switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y) + { + default: + gPokemonStorageSystemPtr->unk_11c0->pos2.y++; + break; + case 0: + gPokemonStorageSystemPtr->unk_11c0->pos2.y++; + break; + case 8: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B358(void) +{ + switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y) + { + case 0: + return FALSE; + default: + gPokemonStorageSystemPtr->unk_11c0->pos2.y--; + break; + } + return TRUE; +} + +void sub_809B384(void) +{ + switch (gUnknown_020384E4) + { + case 1: + sub_809B44C(14, gUnknown_020384E5); + sub_8099584(0, gUnknown_020384E5); + break; + case 0: + sub_809B44C(get_preferred_box(), gUnknown_020384E5); + sub_8099584(1, gUnknown_020384E5); + break; + default: + return; + } + gUnknown_020384E6 = 1; +} + +void sub_809B3E0(void) +{ + u8 boxId; + switch (gUnknown_020384E4) + { + case 1: + diegohint2(14, gUnknown_020384E5); + sub_809960C(14, gUnknown_020384E5); + break; + case 0: + boxId = get_preferred_box(); + diegohint2(boxId, gUnknown_020384E5); + sub_809960C(boxId, gUnknown_020384E5); + break; + default: + return; + } + gUnknown_020384E6 = 0; +} + +void sub_809B440(void) +{ + sub_809BF74(); +} + +void sub_809B44C(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_25b4 = gPlayerParty[gUnknown_020384E5]; + else + sub_803B4B4(gPokemonStorage.boxes[a0], &gPokemonStorageSystemPtr->unk_25b4); + sub_809B548(a0, a1); + gUnknown_020384E7 = a0; + gUnknown_020384E8 = a1; +} -- cgit v1.2.3 From 08a108f432325d6501f3c6473a6d43265af0d5b7 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 17:14:39 -0500 Subject: through diegohint1 --- src/field/daycare.c | 2 +- src/pokemon/pokemon_1.c | 2 +- src/pokemon/pokemon_storage_system_4.c | 37 +++++++++++++++++++++++++++++++++- src/pokemon/pokemon_summary_screen.c | 2 +- 4 files changed, 39 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/field/daycare.c b/src/field/daycare.c index 36dd7ec03..2f0c7281e 100644 --- a/src/field/daycare.c +++ b/src/field/daycare.c @@ -205,7 +205,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DayCare * daycare, u8 slot) GetBoxMonNick(&daycare->mons[slot], gStringVar1); species = GetBoxMonData(&daycare->mons[slot], MON_DATA_SPECIES); - sub_803B4B4(&daycare->mons[slot], &pokemon); + ExpandBoxMon(&daycare->mons[slot], &pokemon); if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) { diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c index 0242e7444..06a088046 100644 --- a/src/pokemon/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -524,7 +524,7 @@ void CalculateMonStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_HP, ¤tHP); } -void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest) +void ExpandBoxMon(const struct BoxPokemon *src, struct Pokemon *dest) { u32 value = 0; dest->box = *src; diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 1127927bf..73d71fa0e 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -60,6 +60,7 @@ void diegohint1(u8 a0, u8 a1); bool8 sub_809BF2C(void); void sub_809BF74(void); void sub_809C028(void); +void sub_809C04C(struct Pokemon *pokemon, u8 a1); void sub_809CC04(void); // .rodata @@ -1562,8 +1563,42 @@ void sub_809B44C(u8 a0, u8 a1) if (a0 == 14) gPokemonStorageSystemPtr->unk_25b4 = gPlayerParty[gUnknown_020384E5]; else - sub_803B4B4(gPokemonStorage.boxes[a0], &gPokemonStorageSystemPtr->unk_25b4); + ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_25b4); sub_809B548(a0, a1); gUnknown_020384E7 = a0; gUnknown_020384E8 = a1; } + +void diegohint2(u8 a0, u8 a1) +{ + if (a0 == 14) + { + gPlayerParty[a1] = gPokemonStorageSystemPtr->unk_25b4; + } + else + { + BoxMonRestorePP(&gPokemonStorageSystemPtr->unk_25b4.box); + gPokemonStorage.boxes[a0][a1] = gPokemonStorageSystemPtr->unk_25b4.box; + } +} + +void sub_809B548(u8 a0, u8 a1) +{ + if (a0 == 14) + ZeroMonData(gPlayerParty + a1); + else + ZeroBoxMonData(gPokemonStorage.boxes[a0] + a1); +} + +void diegohint1(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[a1]; + else + ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_2618); + diegohint2(a0, a1); + gPokemonStorageSystemPtr->unk_25b4 = gPokemonStorageSystemPtr->unk_2618; + sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4, 0); + gUnknown_020384E7 = a0; + gUnknown_020384E8 = a1; +} diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index ce83ad070..dce65898c 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -2253,7 +2253,7 @@ static void sub_809F678(struct Pokemon *mon) else { struct BoxPokemon *mons = pssData.monList.boxMons; - sub_803B4B4(&mons[pssData.monIndex], mon); + ExpandBoxMon(&mons[pssData.monIndex], mon); } } -- cgit v1.2.3 From 7b45766d0765d42d7326a7f6cdb21a54d386117e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 19:32:02 -0500 Subject: through sub_809B7D4 --- src/pokemon/pokemon_2.c | 3 +- src/pokemon/pokemon_storage_system_4.c | 119 +++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c index b941ed2ab..7fd1aa7b2 100644 --- a/src/pokemon/pokemon_2.c +++ b/src/pokemon/pokemon_2.c @@ -1,5 +1,6 @@ #include "global.h" #include "constants/hold_effects.h" +#include "constants/moves.h" #include "battle.h" #include "battle_util.h" #include "data2.h" @@ -569,7 +570,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) u16 *moves = (u16 *)data; s32 i = 0; - while (moves[i] != 355) + while (moves[i] != NUM_MOVES) { u16 move = moves[i]; if (substruct1->moves[0] == move diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 73d71fa0e..a0a6fa145 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -1,8 +1,10 @@ // Includes #include "global.h" +#include "constants/moves.h" #include "constants/species.h" #include "palette.h" +#include "string_util.h" #include "text.h" #include "menu.h" #include "pokemon_storage_system.h" @@ -1602,3 +1604,120 @@ void diegohint1(u8 a0, u8 a1) gUnknown_020384E7 = a0; gUnknown_020384E8 = a1; } + +bool8 sub_809B62C(u8 boxId) +{ + s16 monIdx = GetIndexOfFirstEmptySpaceInBoxN(boxId); + if (monIdx == -1) + return FALSE; + if (gUnknown_020384E6) + { + diegohint2(boxId, monIdx); + sub_8099480(); + gUnknown_020384E6 = 0; + } + else + { + sub_809B44C(14, gUnknown_020384E5); + diegohint2(boxId, monIdx); + sub_8099520(gUnknown_020384E5); + } + if (boxId == get_preferred_box()) + sub_8098D20(monIdx); + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); + return TRUE; +} + +void sub_809B6BC(void) +{ + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + sub_809BF74(); +} + +void sub_809B6DC(void) +{ + u8 mode; + + if (gUnknown_020384E6) + mode = 2; + else if (gUnknown_020384E4 == 1) + mode = 0; + else + mode = 1; + sub_809981C(mode, gUnknown_020384E5); + StringCopy(gPokemonStorageSystemPtr->unk_26e4, gPokemonStorageSystemPtr->unk_11fa); +} + +bool8 sub_809B734(void) +{ + if (!sub_80998D8()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + return FALSE; + } + return TRUE; +} + +void sub_809B760(void) +{ + sub_8099920(); + if (gUnknown_020384E6) + gUnknown_020384E6 = 0; + else + { + u8 boxId; + if (gUnknown_020384E4 == 1) + boxId = 14; + else + boxId = get_preferred_box(); + sub_809B548(boxId, gUnknown_020384E5); + } + sub_809BF74(); +} + +void sub_809B7AC(void) +{ + if (gUnknown_020384E6) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); +} + +void sub_809B7D4(void) +{ + u16 knownMoves; + if (gUnknown_020384E6) + { + gPokemonStorageSystemPtr->unk_2618 = gPokemonStorageSystemPtr->unk_25b4; + gPokemonStorageSystemPtr->unk_2682 = -1; + gPokemonStorageSystemPtr->unk_2683 = -1; + } + else + { + if (gUnknown_020384E4 == 1) + { + gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[gUnknown_020384E5]; + gPokemonStorageSystemPtr->unk_2682 = 14; + } + else + { + ExpandBoxMon(gPokemonStorage.boxes[gPokemonStorage.currentBox] + gUnknown_020384E5, &gPokemonStorageSystemPtr->unk_2618); + gPokemonStorageSystemPtr->unk_2682 = gPokemonStorage.currentBox; + } + gPokemonStorageSystemPtr->unk_2683 = gUnknown_020384E5; + } + gPokemonStorageSystemPtr->unk_267e = 0; + gPokemonStorageSystemPtr->unk_267f = 0; + gPokemonStorageSystemPtr->unk_2686[0] = MOVE_SURF; + gPokemonStorageSystemPtr->unk_2686[1] = MOVE_DIVE; + gPokemonStorageSystemPtr->unk_2686[2] = NUM_MOVES; + knownMoves = GetMonData(&gPokemonStorageSystemPtr->unk_2618, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + gPokemonStorageSystemPtr->unk_267e = knownMoves & 1; + gPokemonStorageSystemPtr->unk_267f = (knownMoves >> 1) & 1; + if (gPokemonStorageSystemPtr->unk_267e || gPokemonStorageSystemPtr->unk_267f) + gPokemonStorageSystemPtr->unk_267d = 0; + else + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + gPokemonStorageSystemPtr->unk_2684 = 0; +} -- cgit v1.2.3 From 7a2eef97c35e4672bd17bfca86a6ea19d22a3eba Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 20:34:56 -0500 Subject: sub_809B960 --- src/pokemon/pokemon_storage_system_4.c | 65 ++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index a0a6fa145..2469d42b1 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -1721,3 +1721,68 @@ void sub_809B7D4(void) } gPokemonStorageSystemPtr->unk_2684 = 0; } + +s8 sub_809B960(void) +{ + u16 i; + u16 knownMoves; + + if (gPokemonStorageSystemPtr->unk_267d) + return gPokemonStorageSystemPtr->unk_267c; + switch (gPokemonStorageSystemPtr->unk_2684) + { + case 0: + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_2682 != 14 || gPokemonStorageSystemPtr->unk_2683 != i) + { + knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + if (knownMoves & 1) + gPokemonStorageSystemPtr->unk_267e = 0; + if (knownMoves & 2) + gPokemonStorageSystemPtr->unk_267f = 0; + } + } + if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + else + { + gPokemonStorageSystemPtr->unk_2680 = 0; + gPokemonStorageSystemPtr->unk_2681 = 0; + gPokemonStorageSystemPtr->unk_2684++; + } + break; + case 1: + for (i = 0; i < 5; i++) + { + knownMoves = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_2680] + gPokemonStorageSystemPtr->unk_2681, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + if (knownMoves && (gPokemonStorageSystemPtr->unk_2682 != gPokemonStorageSystemPtr->unk_2680 || gPokemonStorageSystemPtr->unk_2683 != gPokemonStorageSystemPtr->unk_2681)) + { + if (knownMoves & 1) + gPokemonStorageSystemPtr->unk_267e = 0; + if (knownMoves & 2) + gPokemonStorageSystemPtr->unk_267f = 0; + } + if (++gPokemonStorageSystemPtr->unk_2681 >= 30) + { + gPokemonStorageSystemPtr->unk_2681 = 0; + if (++gPokemonStorageSystemPtr->unk_2680 >= 14) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 0; + break; + } + } + } + if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + break; + } + return -1; +} -- cgit v1.2.3 From 102515325993caef0d57082cd7d8db69335b665b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 21:11:01 -0500 Subject: through party_compaction --- src/pokemon/pokemon_storage_system_2.c | 2 +- src/pokemon/pokemon_storage_system_4.c | 75 ++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index 4657ed158..512bde5db 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -343,7 +343,7 @@ void sub_8096B5C(void) switch (gPokemonStorageSystemPtr->unk_0006) { case 0: - ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e); + ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690.pokemon, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e); break; case 1: DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 2469d42b1..40de7d634 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -1,12 +1,14 @@ // Includes #include "global.h" +#include "ewram.h" #include "constants/moves.h" #include "constants/species.h" #include "palette.h" #include "string_util.h" #include "text.h" #include "menu.h" +#include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" // Static type declarations @@ -1786,3 +1788,76 @@ s8 sub_809B960(void) } return -1; } + +void sub_809BB90(void) +{ + if (gUnknown_020384E6) + gUnknown_02038480 = gPokemonStorageSystemPtr->unk_25b4; +} + +void sub_809BBC0(void) +{ + if (gUnknown_020384E6) + { + if (gUnknown_020384E7 == 14) + gPokemonStorageSystemPtr->unk_25b4 = gUnknown_02038480; + else + gPokemonStorageSystemPtr->unk_25b4.box = gUnknown_02038480.box; + } +} + +void sub_809BC18(void) +{ + if (gUnknown_020384E6) + { + sub_809BB90(); + gPokemonStorageSystemPtr->unk_2690.pokemon = &gUnknown_02038480; + gPokemonStorageSystemPtr->unk_268d = 0; + gPokemonStorageSystemPtr->unk_268c = 0; + gPokemonStorageSystemPtr->unk_268e = 0; + } + else if (gUnknown_020384E4 == 1) + { + gPokemonStorageSystemPtr->unk_2690.pokemon = gPlayerParty; + gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_268c = StorageSystemGetPartySize() - 1; + gPokemonStorageSystemPtr->unk_268e = 0; + } + else + { + gPokemonStorageSystemPtr->unk_2690.box = gPokemonStorage.boxes[gPokemonStorage.currentBox]; + gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_268c = 30 - 1; + gPokemonStorageSystemPtr->unk_268e = 5; + } +} + +void sub_809BD14(void) +{ + if (gUnknown_020384E6) + sub_809BBC0(); + else + gUnknown_020384E5 = pssData.monIndex; +} + +s16 party_compaction(void) +{ + s16 retVal = -1; + u16 i; + u16 last; + + for (i = 0, last = 0; i < PARTY_SIZE; i++) + { + if ((u16)GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != SPECIES_NONE) + { + if (i != last) + gPlayerParty[last] = gPlayerParty[i]; + last++; + } + else if (retVal == -1) + retVal = i; + } + for (; last < PARTY_SIZE; last++) + ZeroMonData(gPlayerParty + last); + return retVal; +} -- cgit v1.2.3 From 40d8fee1d0badb81120cad7a5aabfd8f5b0031d8 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 21:59:56 -0500 Subject: through sub_809BF48 --- src/pokemon/pokemon_storage_system_4.c | 68 +++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 40de7d634..96e237d4f 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -25,7 +25,7 @@ struct WallpaperTable { EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; EWRAM_DATA s8 gUnknown_020384E4 = 0; EWRAM_DATA s8 gUnknown_020384E5 = 0; -EWRAM_DATA u8 gUnknown_020384E6 = 0; +EWRAM_DATA bool8 gUnknown_020384E6 = FALSE; EWRAM_DATA u8 gUnknown_020384E7 = 0; EWRAM_DATA u8 gUnknown_020384E8 = 0; EWRAM_DATA u8 gUnknown_020384E9 = 0; @@ -1141,7 +1141,7 @@ void sub_809AA24(void) else gUnknown_020384E4 = 1; gUnknown_020384E5 = 0; - gUnknown_020384E6 = 0; + gUnknown_020384E6 = FALSE; gUnknown_020384E7 = 0; gUnknown_020384E8 = 0; gUnknown_020384E9 = 0; @@ -1315,7 +1315,7 @@ void sub_809AF18(u8 a0, u8 a1) { sub_809AD3C(a0, a1); sub_809AD94(); - if (gUnknown_020384E6 == 0) + if (!gUnknown_020384E6) StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); if (a0 == 1 && gUnknown_020384E4 != 1) { @@ -1337,7 +1337,7 @@ void sub_809AFB8(void) { gUnknown_020384E4 = gPokemonStorageSystemPtr->unk_11e0; gUnknown_020384E5 = gPokemonStorageSystemPtr->unk_11e1; - if (gUnknown_020384E6 == 0) + if (!gUnknown_020384E6) StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); sub_809BF74(); switch (gUnknown_020384E4) @@ -1359,7 +1359,7 @@ void sub_809AFB8(void) void sub_809B068(void) { u8 partyCount; - if (gUnknown_020384E6 == 0) + if (!gUnknown_020384E6) partyCount = 0; else { @@ -1534,7 +1534,7 @@ void sub_809B384(void) default: return; } - gUnknown_020384E6 = 1; + gUnknown_020384E6 = TRUE; } void sub_809B3E0(void) @@ -1554,7 +1554,7 @@ void sub_809B3E0(void) default: return; } - gUnknown_020384E6 = 0; + gUnknown_020384E6 = FALSE; } void sub_809B440(void) @@ -1616,7 +1616,7 @@ bool8 sub_809B62C(u8 boxId) { diegohint2(boxId, monIdx); sub_8099480(); - gUnknown_020384E6 = 0; + gUnknown_020384E6 = FALSE; } else { @@ -1664,7 +1664,7 @@ void sub_809B760(void) { sub_8099920(); if (gUnknown_020384E6) - gUnknown_020384E6 = 0; + gUnknown_020384E6 = FALSE; else { u8 boxId; @@ -1861,3 +1861,53 @@ s16 party_compaction(void) ZeroMonData(gPlayerParty + last); return retVal; } + +void sub_809BDD8(u8 markings) +{ + gPokemonStorageSystemPtr->unk_11f7 = markings; + if (gUnknown_020384E6) + SetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_MARKINGS, &markings); + else + { + if (gUnknown_020384E4 == 1) + SetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_MARKINGS, &markings); + if (gUnknown_020384E4 == 0) + SetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_MARKINGS, &markings); + } +} + +bool8 sub_809BE80(void) +{ + if (gUnknown_020384E4 == 1 && !gUnknown_020384E6 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0) + return TRUE; + return FALSE; +} + +bool8 sub_809BEBC(void) +{ + if (gUnknown_020384E6) + { + if (gUnknown_020384E4 == 1 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0) + { + if (gPokemonStorageSystemPtr->unk_11f9 || GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_HP) == 0) + return FALSE; + } + return TRUE; + } + return FALSE; +} + +bool8 sub_809BF20(void) +{ + return gUnknown_020384E6; +} + +bool8 sub_809BF2C(void) +{ + return gUnknown_020384E4 == 2 ? TRUE : FALSE; +} + +bool8 sub_809BF48(void) +{ + return (gUnknown_020384E4 == 3 && gUnknown_020384E5 == 1) ? TRUE : FALSE; +} -- cgit v1.2.3 From 470c09225f4c058831c2226195af413204f5f03c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 22:08:46 -0500 Subject: through sub_809C028 --- src/pokemon/pokemon_storage_system_4.c | 37 ++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 96e237d4f..ada4b43bd 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -64,7 +64,7 @@ void diegohint1(u8 a0, u8 a1); bool8 sub_809BF2C(void); void sub_809BF74(void); void sub_809C028(void); -void sub_809C04C(struct Pokemon *pokemon, u8 a1); +void sub_809C04C(struct BoxPokemon *pokemon, u8 a1); void sub_809CC04(void); // .rodata @@ -1602,7 +1602,7 @@ void diegohint1(u8 a0, u8 a1) ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_2618); diegohint2(a0, a1); gPokemonStorageSystemPtr->unk_25b4 = gPokemonStorageSystemPtr->unk_2618; - sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4, 0); + sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4.box, 0); gUnknown_020384E7 = a0; gUnknown_020384E8 = a1; } @@ -1911,3 +1911,36 @@ bool8 sub_809BF48(void) { return (gUnknown_020384E4 == 3 && gUnknown_020384E5 == 1) ? TRUE : FALSE; } + +void sub_809BF74(void) +{ + gPokemonStorageSystemPtr->unk_11f6 = gUnknown_020384E6 ? 0 : 1; + if (!gUnknown_020384E6) + { + switch (gUnknown_020384E4) + { + case 1: + if (gUnknown_020384E5 < PARTY_SIZE) + { + sub_809C04C(&gPlayerParty[gUnknown_020384E5].box, 0); + break; + } + // fallthrough + case 2: + case 3: + sub_809C04C(NULL, 2); + break; + case 0: + sub_809C04C(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, 1); + break; + } + } +} + +void sub_809C028(void) +{ + if (gUnknown_020384E6) + sub_809C04C(&gUnknown_02038480.box, 0); + else + sub_809BF74(); +} -- cgit v1.2.3 From c4bae7a571f5aea6785e108089e904f9dad67701 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 15 Jan 2018 22:45:08 -0500 Subject: sub_809C04C --- src/pokemon/pokemon_storage_system_4.c | 163 ++++++++++++++++++++++++++++++++- 1 file changed, 160 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index ada4b43bd..eb5a6cb0b 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -2,12 +2,14 @@ // Includes #include "global.h" #include "ewram.h" +#include "data2.h" #include "constants/moves.h" #include "constants/species.h" #include "palette.h" #include "string_util.h" #include "text.h" #include "menu.h" +#include "item.h" #include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" @@ -64,7 +66,7 @@ void diegohint1(u8 a0, u8 a1); bool8 sub_809BF2C(void); void sub_809BF74(void); void sub_809C028(void); -void sub_809C04C(struct BoxPokemon *pokemon, u8 a1); +void sub_809C04C(void *pokemon, u8 a1); void sub_809CC04(void); // .rodata @@ -1602,7 +1604,7 @@ void diegohint1(u8 a0, u8 a1) ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_2618); diegohint2(a0, a1); gPokemonStorageSystemPtr->unk_25b4 = gPokemonStorageSystemPtr->unk_2618; - sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4.box, 0); + sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4, 0); gUnknown_020384E7 = a0; gUnknown_020384E8 = a1; } @@ -1922,7 +1924,7 @@ void sub_809BF74(void) case 1: if (gUnknown_020384E5 < PARTY_SIZE) { - sub_809C04C(&gPlayerParty[gUnknown_020384E5].box, 0); + sub_809C04C(gPlayerParty + gUnknown_020384E5, 0); break; } // fallthrough @@ -1944,3 +1946,158 @@ void sub_809C028(void) else sub_809BF74(); } + +void sub_809C04C(void *pokemon, u8 a1) +{ + u8 *buf; + u16 gender = MON_MALE; + gPokemonStorageSystemPtr->unk_11f2 = 0; + if (a1 == 0) + { + struct Pokemon *pkmn = (struct Pokemon *)pokemon; + gPokemonStorageSystemPtr->unk_11f0 = GetMonData(pokemon, MON_DATA_SPECIES2); + if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_11f9 = GetMonData(pkmn, MON_DATA_IS_EGG); + GetMonData(pkmn, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa); + StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_11f8 = GetMonData(pkmn, MON_DATA_LEVEL); + gPokemonStorageSystemPtr->unk_11f7 = GetMonData(pkmn, MON_DATA_MARKINGS); + gPokemonStorageSystemPtr->unk_11ec = GetMonData(pkmn, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePal(pkmn); + gender = GetMonGender(pkmn); + gPokemonStorageSystemPtr->unk_11f2 = GetMonData(pkmn, MON_DATA_HELD_ITEM); + } + } + else if (a1 == 1) + { + struct BoxPokemon *boxmon = (struct BoxPokemon *)pokemon; + gPokemonStorageSystemPtr->unk_11f0 = GetBoxMonData(pokemon, MON_DATA_SPECIES2); + if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE) + { + u32 otId = GetBoxMonData(boxmon, MON_DATA_OT_ID); + gPokemonStorageSystemPtr->unk_11f9 = GetBoxMonData(boxmon, MON_DATA_IS_EGG); + GetBoxMonData(boxmon, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa); + StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_11f8 = GetLevelFromBoxMonExp(boxmon); + gPokemonStorageSystemPtr->unk_11f7 = GetBoxMonData(boxmon, MON_DATA_MARKINGS); + gPokemonStorageSystemPtr->unk_11ec = GetBoxMonData(boxmon, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePalFromOtIdPersonality(gPokemonStorageSystemPtr->unk_11f0, otId, gPokemonStorageSystemPtr->unk_11ec); + gender = GetGenderFromSpeciesAndPersonality(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec); + gPokemonStorageSystemPtr->unk_11f2 = GetBoxMonData(boxmon, MON_DATA_HELD_ITEM); + } + } + else + { + gPokemonStorageSystemPtr->unk_11f0 = SPECIES_NONE; + } + if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_11fa[0] = EOS; + gPokemonStorageSystemPtr->unk_120f[0] = EOS; + gPokemonStorageSystemPtr->unk_1234[0] = EOS; + gPokemonStorageSystemPtr->unk_1259[0] = EOS; + gPokemonStorageSystemPtr->unk_127a[0] = EOS; + } + else if (gPokemonStorageSystemPtr->unk_11f9) + { + buf = gPokemonStorageSystemPtr->unk_120f; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_120f + 5; + buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_1234[0] = EOS; + gPokemonStorageSystemPtr->unk_1259[0] = EOS; + gPokemonStorageSystemPtr->unk_127a[0] = EOS; + } + else + { + if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_M || gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_F) + gender = MON_GENDERLESS; + buf = gPokemonStorageSystemPtr->unk_120f; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_120f + 5; + buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa); + buf = gPokemonStorageSystemPtr->unk_1234; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf[5] = EXT_CTRL_CODE_BEGIN; + buf[6] = 0x13; // CLEAR_TO + buf[7] = 7; + buf[8] = CHAR_SLASH; + buf = gPokemonStorageSystemPtr->unk_1234 + 9; + buf = StringCopy(buf, gSpeciesNames[gPokemonStorageSystemPtr->unk_11f0]); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x13; // CLEAR_TO + buf[2] = 0x50; + buf[3] = EOS; + buf = gPokemonStorageSystemPtr->unk_1259; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf[5] = EXT_CTRL_CODE_BEGIN; + buf[6] = 0x13; // CLEAR_TO + buf[7] = 8; + buf = gPokemonStorageSystemPtr->unk_1259 + 8; + buf[0] = 0x34; // LV + buf = gPokemonStorageSystemPtr->unk_1259 + 9; + buf = sub_8072C14(buf, gPokemonStorageSystemPtr->unk_11f8, 0x22, STR_CONV_MODE_RIGHT_ALIGN); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x11; // CLEAR + buf[2] = 8; + buf += 3; + switch (gender) + { + case MON_MALE: + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x04; // BLUE + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x05; // YELLOW + buf[5] = CHAR_MALE; + buf += 6; + break; + case MON_FEMALE: + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x06; // CYAN + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x07; // MAGENTA + buf[5] = CHAR_FEMALE; + buf += 6; + break; + } + buf[0] = EOS; + buf = gPokemonStorageSystemPtr->unk_127a; + if (gPokemonStorageSystemPtr->unk_11f2) + { + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_127a + 5; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x06; // size + buf[2] = 0x04; + buf = gPokemonStorageSystemPtr->unk_127a + 8; + buf = StringCopy(buf, ItemId_GetItem(gPokemonStorageSystemPtr->unk_11f2)->name); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x07; // UNKNOWN_7; + buf += 2; + } + buf[0] = EOS; + } +} -- cgit v1.2.3 From 91cfb6a564f73f02eb57792f8a0f4aa82e1867d1 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 16 Jan 2018 22:25:35 -0600 Subject: add debug ifdefs --- src/battle/battle_2.c | 7964 ++++++++++++++++++++++++++++++ src/battle/battle_ai.c | 209 + src/battle/battle_interface.c | 669 ++- src/battle/battle_records.c | 29 +- src/debug/kagaya_debug_menu.c | 420 ++ src/debug/nakamura_debug_menu.c | 5031 +++++++++++++++++++ src/debug/nohara_debug_menu.c | 2316 +++++++++ src/debug/taya_debug_window.c | 2122 ++++++++ src/debug/tomomichi_debug_menu.c | 8643 +++++++++++++++++++++++++++++++++ src/debug/watanabe_debug_menu.c | 9846 ++++++++++++++++++++++++++++++++++++++ src/engine/cable_club.c | 4 + src/engine/clock.c | 3 +- src/engine/link.c | 141 + src/engine/rtc.c | 29 + src/engine/save.c | 77 + src/engine/sprite.c | 14 + src/engine/task.c | 10 +- src/engine/trainer_card.c | 97 +- src/field/berry.c | 521 ++ src/field/bike.c | 21 + src/field/choose_party.c | 101 + src/field/decoration_inventory.c | 11 + src/field/field_control_avatar.c | 472 +- src/field/field_map_obj.c | 515 ++ src/field/field_player_avatar.c | 100 +- src/field/mauville_man.c | 81 + src/field/overworld.c | 95 + src/field/party_menu.c | 14 +- src/field/pokeblock.c | 46 +- src/field/roamer.c | 19 + src/field/slot_machine.c | 1237 ++++- src/field/start_menu.c | 303 ++ src/field/wild_encounter.c | 31 + src/pokemon/mail.c | 1866 +++++++- src/pokemon/pokemon_1.c | 322 ++ src/rom3.c | 14 + src/rom6.c | 18 +- src/roulette.c | 5 +- src/scene/cable_car.c | 218 + src/scene/new_game.c | 77 + src/scene/title_screen.c | 17 + 41 files changed, 43665 insertions(+), 63 deletions(-) create mode 100644 src/debug/kagaya_debug_menu.c create mode 100644 src/debug/nakamura_debug_menu.c create mode 100644 src/debug/nohara_debug_menu.c create mode 100644 src/debug/taya_debug_window.c create mode 100644 src/debug/tomomichi_debug_menu.c create mode 100644 src/debug/watanabe_debug_menu.c (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 990535b4e..5212f5bdc 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -203,6 +203,231 @@ void sub_800E7C4(void) } } +#if DEBUG +__attribute__((naked)) +void InitBattle(void) +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x0\n" + " bl SetHBlankCallback\n" + " mov r0, #0x0\n" + " bl SetVBlankCallback\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x13\n" + " ldr r2, ._10\n" + " mov r0, sp\n" + " bl gScriptFuncs_End+0x3cb4\n" + " ldr r0, ._10 + 4\n" + " strh r4, [r0]\n" + " sub r0, r0, #0xc\n" + " mov r2, #0xf0\n" + " strh r2, [r0]\n" + " add r0, r0, #0x4\n" + " ldr r3, ._10 + 8\n" + " add r1, r3, #0\n" + " strh r1, [r0]\n" + " add r0, r0, #0x4\n" + " strh r4, [r0]\n" + " add r0, r0, #0x2\n" + " strh r4, [r0]\n" + " ldr r0, ._10 + 12\n" + " strh r2, [r0]\n" + " ldr r0, ._10 + 16\n" + " strh r1, [r0]\n" + " bl dp12_8087EA4\n" + " ldr r0, ._10 + 20\n" + " mov r3, #0xf0\n" + " mov r5, #0xf0\n" + " lsl r5, r5, #0x3\n" + " add r2, r0, r5\n" + " mov r1, #0x4f\n" + "._5:\n" + " strh r3, [r0]\n" + " strh r3, [r2]\n" + " add r2, r2, #0x2\n" + " add r0, r0, #0x2\n" + " sub r1, r1, #0x1\n" + " cmp r1, #0\n" + " bge ._5 @cond_branch\n" + " mov r1, #0x50\n" + " ldr r4, ._10 + 24\n" + " ldr r0, ._10 + 20\n" + " ldr r3, ._10 + 28\n" + " mov r5, #0x82\n" + " lsl r5, r5, #0x4\n" + " add r2, r0, r5\n" + " add r0, r0, #0xa0\n" + "._6:\n" + " strh r3, [r0]\n" + " strh r3, [r2]\n" + " add r2, r2, #0x2\n" + " add r0, r0, #0x2\n" + " add r1, r1, #0x1\n" + " cmp r1, #0x9f\n" + " ble ._6 @cond_branch\n" + " ldr r0, [r4]\n" + " ldr r1, [r4, #0x4]\n" + " ldr r2, [r4, #0x8]\n" + " bl sub_80895F8\n" + " ldr r4, ._10 + 32\n" + " add r0, r4, #0\n" + " bl SetUpWindowConfig\n" + " bl ResetPaletteFade\n" + " ldr r0, ._10 + 36\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " ldr r0, ._10 + 40\n" + " strh r1, [r0]\n" + " ldr r0, ._10 + 44\n" + " strh r1, [r0]\n" + " ldr r0, ._10 + 48\n" + " strh r1, [r0]\n" + " ldr r0, ._10 + 52\n" + " strh r1, [r0]\n" + " ldr r0, ._10 + 56\n" + " strh r1, [r0]\n" + " ldr r0, ._10 + 60\n" + " strh r1, [r0]\n" + " ldr r0, ._10 + 64\n" + " strh r1, [r0]\n" + " ldr r0, ._10 + 68\n" + " ldrb r1, [r0]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._7 @cond_branch\n" + " bl GetBattleTerrain\n" + " ldr r1, ._10 + 72\n" + " strb r0, [r1]\n" + "._7:\n" + " ldr r0, ._10 + 76\n" + " add r1, r4, #0\n" + " bl InitWindowFromConfig\n" + " ldr r0, ._10 + 80\n" + " ldr r1, ._10 + 84\n" + " bl InitWindowFromConfig\n" + " ldr r0, ._10 + 88\n" + " ldr r1, ._10 + 92\n" + " bl InitWindowFromConfig\n" + " bl sub_800D6D4\n" + " bl sub_800DAB8\n" + " bl ResetSpriteData\n" + " bl ResetTasks\n" + " bl sub_800E23C\n" + " bl FreeAllSpritePalettes\n" + " ldr r1, ._10 + 96\n" + " mov r0, #0x4\n" + " strb r0, [r1]\n" + " ldr r0, ._10 + 100\n" + " bl SetVBlankCallback\n" + " bl setup_poochyena_battle\n" + " ldr r0, ._10 + 104\n" + " ldrh r1, [r0]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._8 @cond_branch\n" + " ldr r0, ._10 + 108\n" + " bl SetMainCallback2\n" + " b ._9\n" + "._11:\n" + " .align 2, 0\n" + "._10:\n" + " .word 0x5006000\n" + " .word 0x400004c\n" + " .word 0x5051\n" + " .word gUnknown_030042C4\n" + " .word gUnknown_03004240\n" + " .word gUnknown_03004DE0\n" + " .word gUnknown_081F9674\n" + " .word 0xff10\n" + " .word gWindowConfig_81E6C58\n" + " .word gUnknown_030042A4\n" + " .word gUnknown_030042A0\n" + " .word gUnknown_030042C0\n" + " .word gUnknown_030041B4\n" + " .word gUnknown_03004288\n" + " .word gUnknown_03004280\n" + " .word gUnknown_030041B0\n" + " .word gUnknown_030041B8\n" + " .word gUnknown_02023A14+0x50\n" + " .word gBattleTerrain\n" + " .word gUnknown_03004210\n" + " .word gUnknown_030041D0\n" + " .word gWindowConfig_81E71D0\n" + " .word gUnknown_03004250\n" + " .word gWindowConfig_81E71EC\n" + " .word gReservedSpritePaletteCount\n" + " .word sub_800FCFC+1\n" + " .word gBattleTypeFlags\n" + " .word sub_800F298+1\n" + "._8:\n" + " ldr r0, ._15\n" + " bl SetMainCallback2\n" + "._9:\n" + " ldr r0, ._15 + 4\n" + " ldrh r1, [r0]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._13 @cond_branch\n" + " ldr r0, ._15 + 8\n" + " ldrb r1, [r0]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._13 @cond_branch\n" + " ldr r0, ._15 + 12\n" + " ldr r1, ._15 + 16\n" + " ldrh r1, [r1]\n" + " bl CreateNPCTrainerParty\n" + " bl SetWildMonHeldItem\n" + "._13:\n" + " ldr r0, ._15 + 20\n" + " ldr r1, ._15 + 24\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " mov r2, #0x2\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + " ldr r4, ._15 + 28\n" + " mov r3, #0xfa\n" + " lsl r3, r3, #0x1\n" + " add r5, r4, r3\n" + "._14:\n" + " add r0, r4, #0\n" + " mov r1, #0x3\n" + " bl AdjustFriendship\n" + " add r4, r4, #0x64\n" + " cmp r4, r5\n" + " ble ._14 @cond_branch\n" + " mov r1, #0x0\n" + " ldr r0, ._15 + 32\n" + " strb r1, [r0]\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._16:\n" + " .align 2, 0\n" + "._15:\n" + " .word sub_800EC9C+1\n" + " .word gBattleTypeFlags\n" + " .word gUnknown_02023A14+0x50\n" + " .word gEnemyParty\n" + " .word gTrainerBattleOpponent\n" + " .word gMain\n" + " .word 0x43d\n" + " .word gPlayerParty\n" + " .word gBattleCommunication\n" + "\n" + ); +} +#else void InitBattle(void) { s32 i; @@ -271,6 +496,7 @@ void InitBattle(void) AdjustFriendship(&gPlayerParty[i], 3); gBattleCommunication[0] = 0; } +#endif void sub_800E9EC(void) { @@ -379,6 +605,476 @@ void shedinja_something(struct Pokemon *pkmn) } } +#if DEBUG +__attribute__((naked)) +void sub_800EC9C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " bl RunTasks\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " bl GetMultiplayerId\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._55\n" + " ldr r1, ._55 + 4\n" + " add r0, r0, r1\n" + " strb r4, [r0]\n" + " mov r0, #0x1\n" + " add r5, r4, #0\n" + " eor r5, r5, r0\n" + " ldr r0, ._55 + 8\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x9\n" + " bls ._53 @cond_branch\n" + " b ._140\n" + "._53:\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._55 + 12\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._56:\n" + " .align 2, 0\n" + "._55:\n" + " .word +0x2000000\n" + " .word 0x160cb\n" + " .word gBattleCommunication\n" + " .word ._57\n" + "._57:\n" + " .word ._58\n" + " .word ._59\n" + " .word ._60\n" + " .word ._61\n" + " .word ._62\n" + " .word ._63\n" + " .word ._64\n" + " .word ._65\n" + " .word ._66\n" + " .word ._67\n" + "._58:\n" + " ldr r2, ._76\n" + " ldrh r1, [r2]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._68 @cond_branch\n" + " ldr r0, ._76 + 4\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._69 @cond_branch\n" + " b ._140\n" + "._69:\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._71 @cond_branch\n" + " b ._140\n" + "._71:\n" + " ldr r1, ._76 + 8\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " strb r0, [r1, #0x1]\n" + " bl sub_800E9EC\n" + " bl sub_800EAAC\n" + " ldr r0, ._76 + 12\n" + " ldrb r1, [r0]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._73 @cond_branch\n" + " mov r3, #0x0\n" + " ldr r1, ._76 + 16\n" + " ldr r0, ._76 + 20\n" + "._74:\n" + " strh r3, [r0, #0x18]\n" + " str r1, [r0, #0x14]\n" + " add r0, r0, #0x1c\n" + " add r3, r3, #0x1\n" + " cmp r3, #0x1\n" + " ble ._74 @cond_branch\n" + "._73:\n" + " bl bitmask_all_link_players_but_self\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._76 + 8\n" + " mov r2, #0x20\n" + " bl SendBlock\n" + " ldr r1, ._76 + 24\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " b ._140\n" + "._77:\n" + " .align 2, 0\n" + "._76:\n" + " .word gBattleTypeFlags\n" + " .word gReceivedRemoteLinkPlayers\n" + " .word +0x2000000\n" + " .word gUnknown_02023A14+0x50\n" + " .word 0x2211\n" + " .word gLinkPlayers\n" + " .word gBattleCommunication\n" + "._68:\n" + " mov r0, #0x4\n" + " orr r0, r0, r1\n" + " strh r0, [r2]\n" + " ldr r1, ._79\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " bl sub_800EB08\n" + " b ._140\n" + "._80:\n" + " .align 2, 0\n" + "._79:\n" + " .word gBattleCommunication\n" + "._59:\n" + " bl GetBlockReceivedStatus\n" + " mov r1, #0x3\n" + " and r1, r1, r0\n" + " cmp r1, #0x3\n" + " beq ._81 @cond_branch\n" + " b ._140\n" + "._81:\n" + " bl ResetBlockReceivedFlags\n" + " mov r3, #0x0\n" + " ldr r0, ._86\n" + " ldrh r1, [r0]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " cmp r1, r0\n" + " bne ._83 @cond_branch\n" + " cmp r4, #0\n" + " bne ._84 @cond_branch\n" + " ldr r0, ._86 + 4\n" + " ldrh r1, [r0]\n" + " mov r2, #0xc\n" + " b ._85\n" + "._87:\n" + " .align 2, 0\n" + "._86:\n" + " .word gBlockRecvBuffer\n" + " .word gBattleTypeFlags\n" + "._84:\n" + " ldr r0, ._92\n" + " ldrh r1, [r0]\n" + " mov r2, #0x8\n" + "._85:\n" + " orr r1, r1, r2\n" + " strh r1, [r0]\n" + " add r3, r3, #0x1\n" + "._83:\n" + " lsl r7, r5, #0x8\n" + " cmp r3, #0\n" + " bne ._94 @cond_branch\n" + " ldr r0, ._92 + 4\n" + " mov r1, #0x80\n" + " lsl r1, r1, #0x1\n" + " add r2, r0, r1\n" + " ldrh r1, [r0]\n" + " add r6, r0, #0\n" + " ldrh r2, [r2]\n" + " cmp r1, r2\n" + " bne ._89 @cond_branch\n" + " cmp r4, #0\n" + " bne ._90 @cond_branch\n" + " ldr r0, ._92\n" + " ldrh r1, [r0]\n" + " mov r2, #0xc\n" + " b ._91\n" + "._93:\n" + " .align 2, 0\n" + "._92:\n" + " .word gBattleTypeFlags\n" + " .word gBlockRecvBuffer\n" + "._90:\n" + " ldr r0, ._96\n" + " ldrh r1, [r0]\n" + " mov r2, #0x8\n" + "._91:\n" + " orr r1, r1, r2\n" + " strh r1, [r0]\n" + " add r3, r3, #0x1\n" + "._89:\n" + " lsl r7, r5, #0x8\n" + " cmp r3, #0\n" + " bne ._94 @cond_branch\n" + " ldrh r1, [r6]\n" + " ldr r0, ._96 + 4\n" + " ldr r2, ._96\n" + " b ._95\n" + "._97:\n" + " .align 2, 0\n" + "._96:\n" + " .word gBattleTypeFlags\n" + " .word 0x101\n" + "._100:\n" + " add r3, r3, #0x1\n" + " cmp r3, #0x1\n" + " bgt ._98 @cond_branch\n" + " lsl r0, r3, #0x8\n" + " add r0, r0, r6\n" + " ldrh r1, [r0]\n" + " ldr r0, ._103\n" + "._95:\n" + " cmp r1, r0\n" + " bls ._100 @cond_branch\n" + " cmp r3, r4\n" + " beq ._100 @cond_branch\n" + "._98:\n" + " cmp r3, #0x2\n" + " bne ._101 @cond_branch\n" + " ldrh r0, [r2]\n" + " mov r1, #0xc\n" + " b ._102\n" + "._104:\n" + " .align 2, 0\n" + "._103:\n" + " .word 0x101\n" + "._101:\n" + " ldrh r0, [r2]\n" + " mov r1, #0x8\n" + "._102:\n" + " orr r0, r0, r1\n" + " strh r0, [r2]\n" + "._94:\n" + " bl sub_800EB08\n" + " ldr r0, ._106\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._106 + 4\n" + " lsl r2, r0, #0x2\n" + " add r2, r2, r0\n" + " lsl r2, r2, #0x3\n" + " add r2, r2, r1\n" + " mov r1, #0x0\n" + " mov r0, #0x87\n" + " lsl r0, r0, #0x1\n" + " strh r0, [r2, #0xa]\n" + " mov r0, #0x5a\n" + " strh r0, [r2, #0xc]\n" + " strh r1, [r2, #0x12]\n" + " ldr r0, ._106 + 8\n" + " ldrb r1, [r0, #0x2]\n" + " ldrb r0, [r0, #0x3]\n" + " lsl r0, r0, #0x8\n" + " orr r1, r1, r0\n" + " strh r1, [r2, #0xe]\n" + " ldr r0, ._106 + 12\n" + " add r0, r0, #0x2\n" + " add r0, r7, r0\n" + " ldrh r0, [r0]\n" + " strh r0, [r2, #0x10]\n" + " b ._129\n" + "._107:\n" + " .align 2, 0\n" + "._106:\n" + " .word sub_800DE30+1\n" + " .word gTasks\n" + " .word +0x2000000\n" + " .word gBlockRecvBuffer\n" + "._60:\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._108 @cond_branch\n" + " b ._140\n" + "._108:\n" + " bl bitmask_all_link_players_but_self\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._111\n" + " mov r2, #0xc8\n" + " bl SendBlock\n" + " b ._129\n" + "._112:\n" + " .align 2, 0\n" + "._111:\n" + " .word gPlayerParty\n" + "._61:\n" + " bl GetBlockReceivedStatus\n" + " mov r1, #0x3\n" + " and r1, r1, r0\n" + " cmp r1, #0x3\n" + " beq ._113 @cond_branch\n" + " b ._140\n" + "._113:\n" + " bl ResetBlockReceivedFlags\n" + " ldr r0, ._116\n" + " lsl r1, r5, #0x8\n" + " ldr r2, ._116 + 4\n" + " add r1, r1, r2\n" + " mov r2, #0xc8\n" + " bl gScriptFuncs_End+0x5bc4\n" + " b ._129\n" + "._117:\n" + " .align 2, 0\n" + "._116:\n" + " .word gEnemyParty\n" + " .word gBlockRecvBuffer\n" + "._62:\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._118 @cond_branch\n" + " b ._140\n" + "._118:\n" + " bl bitmask_all_link_players_but_self\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._121\n" + " mov r2, #0xc8\n" + " bl SendBlock\n" + " b ._129\n" + "._122:\n" + " .align 2, 0\n" + "._121:\n" + " .word gPlayerParty+0xc8\n" + "._63:\n" + " bl GetBlockReceivedStatus\n" + " mov r1, #0x3\n" + " and r1, r1, r0\n" + " cmp r1, #0x3\n" + " beq ._123 @cond_branch\n" + " b ._140\n" + "._123:\n" + " bl ResetBlockReceivedFlags\n" + " ldr r0, ._126\n" + " lsl r1, r5, #0x8\n" + " ldr r2, ._126 + 4\n" + " add r1, r1, r2\n" + " mov r2, #0xc8\n" + " bl gScriptFuncs_End+0x5bc4\n" + " b ._129\n" + "._127:\n" + " .align 2, 0\n" + "._126:\n" + " .word gEnemyParty+0xc8\n" + " .word gBlockRecvBuffer\n" + "._64:\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._140 @cond_branch\n" + " bl bitmask_all_link_players_but_self\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._130\n" + " mov r2, #0xc8\n" + " bl SendBlock\n" + " b ._129\n" + "._131:\n" + " .align 2, 0\n" + "._130:\n" + " .word gPlayerParty+0x190\n" + "._65:\n" + " bl GetBlockReceivedStatus\n" + " mov r1, #0x3\n" + " and r1, r1, r0\n" + " cmp r1, #0x3\n" + " bne ._140 @cond_branch\n" + " bl ResetBlockReceivedFlags\n" + " ldr r4, ._134\n" + " lsl r1, r5, #0x8\n" + " ldr r0, ._134 + 4\n" + " add r1, r1, r0\n" + " add r0, r4, #0\n" + " mov r2, #0xc8\n" + " bl gScriptFuncs_End+0x5bc4\n" + " ldr r1, ._134 + 8\n" + " add r0, r4, r1\n" + " bl shedinja_something\n" + " ldr r1, ._134 + 12\n" + " add r0, r4, r1\n" + " bl shedinja_something\n" + " add r0, r4, #0\n" + " sub r0, r0, #0xc8\n" + " bl shedinja_something\n" + " add r0, r4, #0\n" + " sub r0, r0, #0x64\n" + " bl shedinja_something\n" + " add r0, r4, #0\n" + " bl shedinja_something\n" + " add r0, r4, #0\n" + " add r0, r0, #0x64\n" + " bl shedinja_something\n" + "._129:\n" + " ldr r1, ._134 + 16\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._140\n" + "._135:\n" + " .align 2, 0\n" + "._134:\n" + " .word gEnemyParty+0x190\n" + " .word gBlockRecvBuffer\n" + " .word 0xfffffe70\n" + " .word 0xfffffed4\n" + " .word gBattleCommunication\n" + "._66:\n" + " bl sub_800B950\n" + " ldr r0, ._137\n" + " ldrb r1, [r0]\n" + " add r1, r1, #0x1\n" + " mov r2, #0x0\n" + " strb r1, [r0]\n" + " strb r2, [r0, #0x1]\n" + " strb r2, [r0, #0x2]\n" + " b ._140\n" + "._138:\n" + " .align 2, 0\n" + "._137:\n" + " .word gBattleCommunication\n" + "._67:\n" + " ldr r0, ._141\n" + " add r1, r0, #1\n" + " bl battle_load_something\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._140 @cond_branch\n" + " ldr r2, ._141 + 4\n" + " ldr r1, ._141 + 8\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " ldr r0, ._141 + 12\n" + " str r0, [r1]\n" + " ldr r0, ._141 + 16\n" + " bl SetMainCallback2\n" + " ldr r3, ._141 + 20\n" + " ldrh r2, [r3]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._140 @cond_branch\n" + " ldr r1, ._141 + 24\n" + " mov r4, #0x80\n" + " lsl r4, r4, #0x4\n" + " add r0, r4, #0\n" + " strh r0, [r1]\n" + " mov r0, #0x20\n" + " orr r0, r0, r2\n" + " strh r0, [r3]\n" + "._140:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._142:\n" + " .align 2, 0\n" + "._141:\n" + " .word gUnknown_02024D1F\n" + " .word gPreBattleCallback1\n" + " .word gMain\n" + " .word debug_sub_80139E4+1\n" + " .word sub_800F808+1\n" + " .word gBattleTypeFlags\n" + " .word gTrainerBattleOpponent\n" + "\n" + ); +} +#else void sub_800EC9C(void) { u8 playerId; @@ -535,6 +1231,7 @@ void sub_800EC9C(void) break; } } +#endif void sub_800F02C(void) { @@ -561,6 +1258,236 @@ void sub_800F02C(void) memcpy(gSharedMem, gUnknown_02023A00, 0x60); } +#ifdef DEBUG +__attribute__((naked)) +void sub_800F104() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " bl GetMultiplayerId\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " ldr r0, ._151\n" + " ldr r2, ._151 + 4\n" + " add r1, r0, r2\n" + " strb r6, [r1]\n" + " ldr r1, ._151 + 8\n" + " add r1, r1, r0\n" + " mov r9, r1\n" + " sub r2, r2, #0x9\n" + " add r2, r2, r0\n" + " mov r8, r2\n" + " bl RunTasks\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " ldr r2, ._151 + 12\n" + " ldrb r0, [r2]\n" + " cmp r0, #0x1\n" + " beq ._147 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._148 @cond_branch\n" + " cmp r0, #0\n" + " beq ._149 @cond_branch\n" + " b ._183\n" + "._152:\n" + " .align 2, 0\n" + "._151:\n" + " .word +0x2000000\n" + " .word 0x160cb\n" + " .word 0x160c4\n" + " .word gBattleCommunication\n" + "._148:\n" + " cmp r0, #0x2\n" + " bne ._153 @cond_branch\n" + " b ._154\n" + "._153:\n" + " cmp r0, #0x3\n" + " bne ._155 @cond_branch\n" + " b ._156\n" + "._155:\n" + " b ._183\n" + "._149:\n" + " ldr r0, ._165\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._158 @cond_branch\n" + " b ._183\n" + "._158:\n" + " ldr r0, ._165 + 4\n" + " ldrb r1, [r0]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._160 @cond_branch\n" + " mov r4, #0x0\n" + " ldr r1, ._165 + 8\n" + " ldr r0, ._165 + 12\n" + "._161:\n" + " strh r4, [r0, #0x18]\n" + " str r1, [r0, #0x14]\n" + " add r0, r0, #0x1c\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x3\n" + " ble ._161 @cond_branch\n" + "._160:\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._162 @cond_branch\n" + " b ._183\n" + "._162:\n" + " bl sub_800F02C\n" + " bl bitmask_all_link_players_but_self\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._165 + 16\n" + " mov r2, #0x60\n" + " bl SendBlock\n" + " ldr r1, ._165 + 20\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._183\n" + "._166:\n" + " .align 2, 0\n" + "._165:\n" + " .word gReceivedRemoteLinkPlayers\n" + " .word gUnknown_02023A14+0x50\n" + " .word 0x2211\n" + " .word gLinkPlayers\n" + " .word +0x2000000\n" + " .word gBattleCommunication\n" + "._147:\n" + " bl GetBlockReceivedStatus\n" + " mov r1, #0xf\n" + " and r1, r1, r0\n" + " cmp r1, #0xf\n" + " bne ._183 @cond_branch\n" + " bl ResetBlockReceivedFlags\n" + " mov r4, #0x0\n" + " lsl r0, r6, #0x3\n" + " sub r0, r0, r6\n" + " lsl r5, r0, #0x2\n" + " mov r7, #0x0\n" + "._175:\n" + " cmp r4, r6\n" + " beq ._174 @cond_branch\n" + " ldr r2, ._172\n" + " add r0, r7, r2\n" + " ldrh r1, [r0, #0x18]\n" + " mov r3, #0x1\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._169 @cond_branch\n" + " add r0, r5, r2\n" + " ldrh r1, [r0, #0x18]\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._170 @cond_branch\n" + " b ._174\n" + "._173:\n" + " .align 2, 0\n" + "._172:\n" + " .word gLinkPlayers\n" + "._169:\n" + " add r0, r5, r2\n" + " ldrh r1, [r0, #0x18]\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._174 @cond_branch\n" + "._170:\n" + " lsl r1, r4, #0x8\n" + " ldr r0, ._177\n" + " add r1, r1, r0\n" + " ldr r0, ._177 + 4\n" + " mov r2, #0x60\n" + " bl gScriptFuncs_End+0x5bc4\n" + "._174:\n" + " add r7, r7, #0x1c\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x3\n" + " ble ._175 @cond_branch\n" + " ldr r1, ._177 + 8\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._177 + 12\n" + " ldr r0, [r1, #0x8]\n" + " mov r2, r9\n" + " str r0, [r2]\n" + " ldr r0, ._177 + 16\n" + " ldrh r0, [r0]\n" + " mov r2, r8\n" + " strh r0, [r2]\n" + " ldr r0, ._177 + 20\n" + " str r0, [r1, #0x8]\n" + " mov r0, #0x5\n" + " mov r1, #0x0\n" + " bl OpenPartyMenu\n" + " b ._183\n" + "._178:\n" + " .align 2, 0\n" + "._177:\n" + " .word gBlockRecvBuffer\n" + " .word gUnknown_02023A00\n" + " .word gBattleCommunication\n" + " .word gMain\n" + " .word gBattleTypeFlags\n" + " .word sub_800F104+1\n" + "._154:\n" + " ldr r0, ._181\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._183 @cond_branch\n" + " mov r0, #0x3\n" + " strb r0, [r2]\n" + " bl sub_800832C\n" + " b ._183\n" + "._182:\n" + " .align 2, 0\n" + "._181:\n" + " .word gPaletteFade\n" + "._156:\n" + " ldr r0, ._184\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._183 @cond_branch\n" + " ldr r1, ._184 + 4\n" + " mov r2, r8\n" + " ldrh r0, [r2]\n" + " strh r0, [r1]\n" + " ldr r1, ._184 + 8\n" + " mov r2, r9\n" + " ldr r0, [r2]\n" + " str r0, [r1, #0x8]\n" + " ldr r0, ._184 + 12\n" + " bl SetMainCallback2\n" + "._183:\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._185:\n" + " .align 2, 0\n" + "._184:\n" + " .word gReceivedRemoteLinkPlayers\n" + " .word gBattleTypeFlags\n" + " .word gMain\n" + " .word InitBattle+1\n" + "\n" + ); +} +#else void sub_800F104(void) { u8 playerId; @@ -625,7 +1552,774 @@ void sub_800F104(void) break; } } +#endif +#ifdef DEBUG +__attribute__((naked)) +void sub_800F298() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " bl GetMultiplayerId\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " ldr r0, ._188\n" + " ldr r1, ._188 + 4\n" + " add r0, r0, r1\n" + " strb r6, [r0]\n" + " bl RunTasks\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " ldr r0, ._188 + 8\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x7\n" + " bls ._186 @cond_branch\n" + " b ._352\n" + "._186:\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._188 + 12\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._189:\n" + " .align 2, 0\n" + "._188:\n" + " .word +0x2000000\n" + " .word 0x160cb\n" + " .word gBattleCommunication\n" + " .word ._190\n" + "._190:\n" + " .word ._191\n" + " .word ._192\n" + " .word ._193\n" + " .word ._194\n" + " .word ._195\n" + " .word ._196\n" + " .word ._197\n" + " .word ._198\n" + "._191:\n" + " ldr r0, ._206\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._199 @cond_branch\n" + " b ._352\n" + "._199:\n" + " ldr r0, ._206 + 4\n" + " ldrb r1, [r0]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._201 @cond_branch\n" + " mov r4, #0x0\n" + " ldr r1, ._206 + 8\n" + " ldr r0, ._206 + 12\n" + "._202:\n" + " strh r4, [r0, #0x18]\n" + " str r1, [r0, #0x14]\n" + " add r0, r0, #0x1c\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x3\n" + " ble ._202 @cond_branch\n" + "._201:\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._203 @cond_branch\n" + " b ._352\n" + "._203:\n" + " ldr r4, ._206 + 16\n" + " mov r0, #0x1\n" + " strb r0, [r4]\n" + " strb r0, [r4, #0x1]\n" + " bl sub_800E9EC\n" + " bl sub_800EAAC\n" + " bl bitmask_all_link_players_but_self\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r1, r4, #0\n" + " mov r2, #0x20\n" + " bl SendBlock\n" + " b ._300\n" + "._207:\n" + " .align 2, 0\n" + "._206:\n" + " .word gReceivedRemoteLinkPlayers\n" + " .word gUnknown_02023A14+0x50\n" + " .word 0x2211\n" + " .word gLinkPlayers\n" + " .word +0x2000000\n" + "._192:\n" + " bl GetBlockReceivedStatus\n" + " mov r1, #0xf\n" + " and r1, r1, r0\n" + " cmp r1, #0xf\n" + " beq ._208 @cond_branch\n" + " b ._352\n" + "._208:\n" + " bl ResetBlockReceivedFlags\n" + " mov r4, #0x0\n" + " ldr r0, ._213\n" + " ldrh r1, [r0]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " cmp r1, r0\n" + " bne ._210 @cond_branch\n" + " cmp r6, #0\n" + " bne ._211 @cond_branch\n" + " ldr r0, ._213 + 4\n" + " ldrh r1, [r0]\n" + " mov r2, #0xc\n" + " b ._212\n" + "._214:\n" + " .align 2, 0\n" + "._213:\n" + " .word gBlockRecvBuffer\n" + " .word gBattleTypeFlags\n" + "._211:\n" + " ldr r0, ._221\n" + " ldrh r1, [r0]\n" + " mov r2, #0x8\n" + "._212:\n" + " orr r1, r1, r2\n" + " strh r1, [r0]\n" + " add r4, r4, #0x1\n" + "._210:\n" + " cmp r4, #0\n" + " bne ._223 @cond_branch\n" + " mov r2, #0x0\n" + " ldr r1, ._221 + 4\n" + " add r5, r1, #0\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x1\n" + "._217:\n" + " add r1, r1, r3\n" + " add r2, r2, #0x1\n" + " cmp r2, #0x3\n" + " bgt ._216 @cond_branch\n" + " ldrh r0, [r5]\n" + " ldrh r7, [r1]\n" + " cmp r0, r7\n" + " beq ._217 @cond_branch\n" + "._216:\n" + " cmp r2, #0x4\n" + " bne ._218 @cond_branch\n" + " cmp r6, #0\n" + " bne ._219 @cond_branch\n" + " ldr r0, ._221\n" + " ldrh r1, [r0]\n" + " mov r2, #0xc\n" + " b ._220\n" + "._222:\n" + " .align 2, 0\n" + "._221:\n" + " .word gBattleTypeFlags\n" + " .word gBlockRecvBuffer\n" + "._219:\n" + " ldr r0, ._233\n" + " ldrh r1, [r0]\n" + " mov r2, #0x8\n" + "._220:\n" + " orr r1, r1, r2\n" + " strh r1, [r0]\n" + " add r4, r4, #0x1\n" + "._218:\n" + " cmp r4, #0\n" + " bne ._223 @cond_branch\n" + " ldr r0, ._233 + 4\n" + " ldrh r2, [r0]\n" + " ldr r1, ._233 + 8\n" + " add r3, r0, #0\n" + " ldr r5, ._233\n" + " cmp r2, r1\n" + " beq ._224 @cond_branch\n" + "._230:\n" + " lsl r0, r4, #0x8\n" + " add r0, r0, r3\n" + " ldrh r0, [r0]\n" + " ldr r1, ._233 + 8\n" + " cmp r0, r1\n" + " bls ._225 @cond_branch\n" + " cmp r4, r6\n" + " bne ._227 @cond_branch\n" + "._225:\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x3\n" + " bgt ._227 @cond_branch\n" + " lsl r0, r4, #0x8\n" + " add r0, r0, r3\n" + " ldrh r0, [r0]\n" + " cmp r0, r1\n" + " bne ._230 @cond_branch\n" + "._224:\n" + " cmp r4, r6\n" + " beq ._230 @cond_branch\n" + " cmp r4, r6\n" + " bge ._230 @cond_branch\n" + "._227:\n" + " cmp r4, #0x4\n" + " bne ._231 @cond_branch\n" + " ldrh r0, [r5]\n" + " mov r1, #0xc\n" + " b ._232\n" + "._234:\n" + " .align 2, 0\n" + "._233:\n" + " .word gBattleTypeFlags\n" + " .word gBlockRecvBuffer\n" + " .word 0x101\n" + "._231:\n" + " ldrh r0, [r5]\n" + " mov r1, #0x8\n" + "._232:\n" + " orr r0, r0, r1\n" + " strh r0, [r5]\n" + "._223:\n" + " bl sub_800EB08\n" + " ldr r0, ._239\n" + " ldr r1, ._239 + 4\n" + " mov r2, #0x96\n" + " lsl r2, r2, #0x1\n" + " bl gScriptFuncs_End+0x5bc4\n" + " ldr r0, ._239 + 8\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._239 + 12\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " mov r2, #0x0\n" + " mov r0, #0x87\n" + " lsl r0, r0, #0x1\n" + " strh r0, [r1, #0xa]\n" + " mov r0, #0x5a\n" + " strh r0, [r1, #0xc]\n" + " strh r2, [r1, #0x12]\n" + " strh r2, [r1, #0xe]\n" + " strh r2, [r1, #0x10]\n" + " add r2, r1, #0\n" + " ldr r0, ._239 + 16\n" + " add r3, r0, #2\n" + " ldr r6, ._239 + 20\n" + " mov r5, #0x3f\n" + " mov r7, #0x80\n" + " lsl r7, r7, #0x1\n" + " mov r4, #0x3\n" + "._247:\n" + " ldrh r0, [r6, #0x18]\n" + " cmp r0, #0x1\n" + " beq ._235 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._236 @cond_branch\n" + " cmp r0, #0\n" + " beq ._237 @cond_branch\n" + " b ._246\n" + "._240:\n" + " .align 2, 0\n" + "._239:\n" + " .word +0x201d000\n" + " .word gPlayerParty\n" + " .word sub_800DE30+1\n" + " .word gTasks\n" + " .word gBlockRecvBuffer\n" + " .word gLinkPlayers\n" + "._236:\n" + " cmp r0, #0x2\n" + " beq ._241 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._242 @cond_branch\n" + " b ._246\n" + "._237:\n" + " ldrh r0, [r3]\n" + " add r1, r5, #0\n" + " and r1, r1, r0\n" + " b ._244\n" + "._235:\n" + " ldrh r0, [r3]\n" + " add r1, r5, #0\n" + " and r1, r1, r0\n" + " b ._245\n" + "._241:\n" + " ldrh r0, [r3]\n" + " add r1, r5, #0\n" + " and r1, r1, r0\n" + " lsl r1, r1, #0x6\n" + "._244:\n" + " ldrh r0, [r2, #0xe]\n" + " orr r1, r1, r0\n" + " strh r1, [r2, #0xe]\n" + " b ._246\n" + "._242:\n" + " ldrh r0, [r3]\n" + " add r1, r5, #0\n" + " and r1, r1, r0\n" + " lsl r1, r1, #0x6\n" + "._245:\n" + " ldrh r0, [r2, #0x10]\n" + " orr r1, r1, r0\n" + " strh r1, [r2, #0x10]\n" + "._246:\n" + " add r3, r3, r7\n" + " add r6, r6, #0x1c\n" + " sub r4, r4, #0x1\n" + " cmp r4, #0\n" + " bge ._247 @cond_branch\n" + " bl ZeroPlayerPartyMons\n" + " bl ZeroEnemyPartyMons\n" + " ldr r1, ._251\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._193:\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._248 @cond_branch\n" + " b ._352\n" + "._248:\n" + " bl bitmask_all_link_players_but_self\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._251 + 4\n" + " mov r2, #0xc8\n" + " bl SendBlock\n" + " b ._300\n" + "._252:\n" + " .align 2, 0\n" + "._251:\n" + " .word gBattleCommunication\n" + " .word +0x201d000\n" + "._194:\n" + " bl GetBlockReceivedStatus\n" + " mov r1, #0xf\n" + " and r1, r1, r0\n" + " cmp r1, #0xf\n" + " beq ._253 @cond_branch\n" + " b ._352\n" + "._253:\n" + " bl ResetBlockReceivedFlags\n" + " mov r4, #0x0\n" + " lsl r0, r6, #0x3\n" + " sub r0, r0, r6\n" + " lsl r0, r0, #0x2\n" + " mov r8, r0\n" + " ldr r5, ._260\n" + " mov r7, #0x0\n" + "._294:\n" + " cmp r4, r6\n" + " bne ._255 @cond_branch\n" + " ldr r0, ._260 + 4\n" + " add r0, r7, r0\n" + " ldrh r0, [r0, #0x18]\n" + " cmp r0, #0x2\n" + " bgt ._256 @cond_branch\n" + " cmp r0, #0x1\n" + " bge ._257 @cond_branch\n" + " cmp r0, #0\n" + " beq ._258 @cond_branch\n" + " b ._291\n" + "._261:\n" + " .align 2, 0\n" + "._260:\n" + " .word gBlockRecvBuffer\n" + " .word gLinkPlayers\n" + "._256:\n" + " cmp r0, #0x3\n" + " bne ._291 @cond_branch\n" + "._258:\n" + " ldr r0, ._264\n" + " b ._283\n" + "._265:\n" + " .align 2, 0\n" + "._264:\n" + " .word gPlayerParty\n" + "._257:\n" + " ldr r0, ._267\n" + " b ._283\n" + "._268:\n" + " .align 2, 0\n" + "._267:\n" + " .word gPlayerParty+0x12c\n" + "._255:\n" + " ldr r2, ._272\n" + " add r0, r7, r2\n" + " ldrh r1, [r0, #0x18]\n" + " mov r3, #0x1\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._269 @cond_branch\n" + " mov r1, r8\n" + " add r0, r1, r2\n" + " ldrh r1, [r0, #0x18]\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._270 @cond_branch\n" + " b ._274\n" + "._273:\n" + " .align 2, 0\n" + "._272:\n" + " .word gLinkPlayers\n" + "._269:\n" + " mov r1, r8\n" + " add r0, r1, r2\n" + " ldrh r1, [r0, #0x18]\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._274 @cond_branch\n" + "._270:\n" + " add r0, r7, r2\n" + " ldrh r2, [r0, #0x18]\n" + " cmp r2, #0x2\n" + " bgt ._275 @cond_branch\n" + " cmp r2, #0x1\n" + " bge ._276 @cond_branch\n" + " cmp r2, #0\n" + " beq ._277 @cond_branch\n" + " b ._291\n" + "._275:\n" + " cmp r2, #0x3\n" + " bne ._291 @cond_branch\n" + "._277:\n" + " ldr r0, ._281\n" + " b ._283\n" + "._282:\n" + " .align 2, 0\n" + "._281:\n" + " .word gPlayerParty\n" + "._276:\n" + " ldr r0, ._284\n" + " b ._283\n" + "._285:\n" + " .align 2, 0\n" + "._284:\n" + " .word gPlayerParty+0x12c\n" + "._274:\n" + " add r0, r7, r2\n" + " ldrh r2, [r0, #0x18]\n" + " cmp r2, #0x2\n" + " bgt ._286 @cond_branch\n" + " cmp r2, #0x1\n" + " bge ._287 @cond_branch\n" + " cmp r2, #0\n" + " beq ._288 @cond_branch\n" + " b ._291\n" + "._286:\n" + " cmp r2, #0x3\n" + " bne ._291 @cond_branch\n" + "._288:\n" + " ldr r0, ._292\n" + "._283:\n" + " add r1, r5, #0\n" + " mov r2, #0xc8\n" + " bl gScriptFuncs_End+0x5bc4\n" + " b ._291\n" + "._293:\n" + " .align 2, 0\n" + "._292:\n" + " .word gEnemyParty\n" + "._287:\n" + " ldr r0, ._296\n" + " add r1, r5, #0\n" + " mov r2, #0xc8\n" + " bl gScriptFuncs_End+0x5bc4\n" + "._291:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " add r5, r5, r0\n" + " add r7, r7, #0x1c\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x3\n" + " ble ._294 @cond_branch\n" + " b ._300\n" + "._297:\n" + " .align 2, 0\n" + "._296:\n" + " .word gEnemyParty+0x12c\n" + "._195:\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._298 @cond_branch\n" + " b ._352\n" + "._298:\n" + " bl bitmask_all_link_players_but_self\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._301\n" + " mov r2, #0x64\n" + " bl SendBlock\n" + " b ._300\n" + "._302:\n" + " .align 2, 0\n" + "._301:\n" + " .word +0x201d0c8\n" + "._196:\n" + " bl GetBlockReceivedStatus\n" + " mov r1, #0xf\n" + " and r1, r1, r0\n" + " cmp r1, #0xf\n" + " beq ._303 @cond_branch\n" + " b ._352\n" + "._303:\n" + " bl ResetBlockReceivedFlags\n" + " mov r4, #0x0\n" + " lsl r0, r6, #0x3\n" + " sub r0, r0, r6\n" + " lsl r0, r0, #0x2\n" + " mov r8, r0\n" + " ldr r5, ._310\n" + " mov r7, #0x0\n" + "._344:\n" + " cmp r4, r6\n" + " bne ._305 @cond_branch\n" + " ldr r0, ._310 + 4\n" + " add r0, r7, r0\n" + " ldrh r0, [r0, #0x18]\n" + " cmp r0, #0x2\n" + " bgt ._306 @cond_branch\n" + " cmp r0, #0x1\n" + " bge ._307 @cond_branch\n" + " cmp r0, #0\n" + " beq ._308 @cond_branch\n" + " b ._341\n" + "._311:\n" + " .align 2, 0\n" + "._310:\n" + " .word gBlockRecvBuffer\n" + " .word gLinkPlayers\n" + "._306:\n" + " cmp r0, #0x3\n" + " bne ._341 @cond_branch\n" + "._308:\n" + " ldr r0, ._314\n" + " b ._333\n" + "._315:\n" + " .align 2, 0\n" + "._314:\n" + " .word gPlayerParty+0xc8\n" + "._307:\n" + " ldr r0, ._317\n" + " b ._333\n" + "._318:\n" + " .align 2, 0\n" + "._317:\n" + " .word gPlayerParty+0x1f4\n" + "._305:\n" + " ldr r2, ._322\n" + " add r0, r7, r2\n" + " ldrh r1, [r0, #0x18]\n" + " mov r3, #0x1\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._319 @cond_branch\n" + " mov r1, r8\n" + " add r0, r1, r2\n" + " ldrh r1, [r0, #0x18]\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._320 @cond_branch\n" + " b ._324\n" + "._323:\n" + " .align 2, 0\n" + "._322:\n" + " .word gLinkPlayers\n" + "._319:\n" + " mov r1, r8\n" + " add r0, r1, r2\n" + " ldrh r1, [r0, #0x18]\n" + " add r0, r3, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._324 @cond_branch\n" + "._320:\n" + " add r0, r7, r2\n" + " ldrh r2, [r0, #0x18]\n" + " cmp r2, #0x2\n" + " bgt ._325 @cond_branch\n" + " cmp r2, #0x1\n" + " bge ._326 @cond_branch\n" + " cmp r2, #0\n" + " beq ._327 @cond_branch\n" + " b ._341\n" + "._325:\n" + " cmp r2, #0x3\n" + " bne ._341 @cond_branch\n" + "._327:\n" + " ldr r0, ._331\n" + " b ._333\n" + "._332:\n" + " .align 2, 0\n" + "._331:\n" + " .word gPlayerParty+0xc8\n" + "._326:\n" + " ldr r0, ._334\n" + " b ._333\n" + "._335:\n" + " .align 2, 0\n" + "._334:\n" + " .word gPlayerParty+0x1f4\n" + "._324:\n" + " add r0, r7, r2\n" + " ldrh r2, [r0, #0x18]\n" + " cmp r2, #0x2\n" + " bgt ._336 @cond_branch\n" + " cmp r2, #0x1\n" + " bge ._337 @cond_branch\n" + " cmp r2, #0\n" + " beq ._338 @cond_branch\n" + " b ._341\n" + "._336:\n" + " cmp r2, #0x3\n" + " bne ._341 @cond_branch\n" + "._338:\n" + " ldr r0, ._342\n" + "._333:\n" + " add r1, r5, #0\n" + " mov r2, #0x64\n" + " bl gScriptFuncs_End+0x5bc4\n" + " b ._341\n" + "._343:\n" + " .align 2, 0\n" + "._342:\n" + " .word gEnemyParty+0xc8\n" + "._337:\n" + " ldr r0, ._346\n" + " add r1, r5, #0\n" + " mov r2, #0x64\n" + " bl gScriptFuncs_End+0x5bc4\n" + "._341:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " add r5, r5, r0\n" + " add r7, r7, #0x1c\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x3\n" + " ble ._344 @cond_branch\n" + " ldr r4, ._346 + 4\n" + " add r0, r4, #0\n" + " bl shedinja_something\n" + " add r0, r4, #0\n" + " add r0, r0, #0x64\n" + " bl shedinja_something\n" + " add r0, r4, #0\n" + " add r0, r0, #0xc8\n" + " bl shedinja_something\n" + " mov r1, #0x96\n" + " lsl r1, r1, #0x1\n" + " add r0, r4, r1\n" + " bl shedinja_something\n" + " mov r7, #0xc8\n" + " lsl r7, r7, #0x1\n" + " add r0, r4, r7\n" + " bl shedinja_something\n" + " mov r1, #0xfa\n" + " lsl r1, r1, #0x1\n" + " add r0, r4, r1\n" + " bl shedinja_something\n" + " ldr r4, ._346 + 8\n" + " add r0, r4, #0\n" + " bl shedinja_something\n" + " add r0, r4, #0\n" + " add r0, r0, #0x64\n" + " bl shedinja_something\n" + " add r0, r4, #0\n" + " add r0, r0, #0xc8\n" + " bl shedinja_something\n" + " sub r7, r7, #0x64\n" + " add r0, r4, r7\n" + " bl shedinja_something\n" + " mov r1, #0xc8\n" + " lsl r1, r1, #0x1\n" + " add r0, r4, r1\n" + " bl shedinja_something\n" + " add r7, r7, #0xc8\n" + " add r0, r4, r7\n" + " bl shedinja_something\n" + "._300:\n" + " ldr r1, ._346 + 12\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._352\n" + "._347:\n" + " .align 2, 0\n" + "._346:\n" + " .word gEnemyParty+0x1f4\n" + " .word gPlayerParty\n" + " .word gEnemyParty\n" + " .word gBattleCommunication\n" + "._197:\n" + " bl sub_800B950\n" + " ldr r0, ._349\n" + " ldrb r1, [r0]\n" + " add r1, r1, #0x1\n" + " mov r2, #0x0\n" + " strb r1, [r0]\n" + " strb r2, [r0, #0x1]\n" + " strb r2, [r0, #0x2]\n" + " b ._352\n" + "._350:\n" + " .align 2, 0\n" + "._349:\n" + " .word gBattleCommunication\n" + "._198:\n" + " ldr r0, ._353\n" + " add r1, r0, #1\n" + " bl battle_load_something\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._352 @cond_branch\n" + " ldr r2, ._353 + 4\n" + " ldr r1, ._353 + 8\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " ldr r0, ._353 + 12\n" + " str r0, [r1]\n" + " ldr r0, ._353 + 16\n" + " bl SetMainCallback2\n" + " ldr r3, ._353 + 20\n" + " ldrh r2, [r3]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._352 @cond_branch\n" + " ldr r1, ._353 + 24\n" + " mov r4, #0x80\n" + " lsl r4, r4, #0x4\n" + " add r0, r4, #0\n" + " strh r0, [r1]\n" + " mov r0, #0x20\n" + " orr r0, r0, r2\n" + " strh r0, [r3]\n" + "._352:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._354:\n" + " .align 2, 0\n" + "._353:\n" + " .word gUnknown_02024D1F\n" + " .word gPreBattleCallback1\n" + " .word gMain\n" + " .word debug_sub_80139E4+1\n" + " .word sub_800F808+1\n" + " .word gBattleTypeFlags\n" + " .word gTrainerBattleOpponent\n" + "\n" + ); +} +#else void sub_800F298(void) { u8 playerId; @@ -893,7 +2587,119 @@ void sub_800F298(void) break; } } +#endif +#if DEBUG +__attribute__((naked)) +void BattleMainCB2(void) +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " ldr r4, ._358\n" + " ldrh r2, [r4, #0x2c]\n" + " mov r1, #0x82\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, #0\n" + " and r0, r0, r2\n" + " cmp r0, r1\n" + " bne ._357 @cond_branch\n" + " ldr r2, ._358 + 4\n" + " ldr r1, ._358 + 8\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x1\n" + " strh r0, [r2]\n" + " ldr r0, ._358 + 12\n" + " add r2, r4, r0\n" + " ldrb r1, [r2]\n" + " mov r0, #0x3\n" + " neg r0, r0\n" + " and r0, r0, r1\n" + " strb r0, [r2]\n" + " ldr r1, ._358 + 16\n" + " mov r0, #0x3\n" + " strb r0, [r1, #0x15]\n" + " ldr r0, ._358 + 20\n" + " ldr r0, [r0]\n" + " str r0, [r4]\n" + " bl ZeroEnemyPartyMons\n" + " mov r0, #0x5a\n" + " bl gScriptFuncs_End+0x148c\n" + " ldr r0, ._358 + 24\n" + " ldrh r1, [r0]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._356 @cond_branch\n" + " ldr r0, ._358 + 28\n" + " bl SetMainCallback2\n" + " b ._357\n" + "._359:\n" + " .align 2, 0\n" + "._358:\n" + " .word gMain\n" + " .word gScriptResult\n" + " .word gBattleOutcome\n" + " .word 0x43d\n" + " .word gUnknown_03004DC0\n" + " .word gPreBattleCallback1\n" + " .word gBattleTypeFlags\n" + " .word sub_805465C+1\n" + "._356:\n" + " ldr r0, [r4, #0x8]\n" + " bl SetMainCallback2\n" + "._357:\n" + " ldr r5, ._361\n" + " ldrh r1, [r5]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._360 @cond_branch\n" + " lsr r0, r1, #0x2\n" + " mov r4, #0x1\n" + " and r0, r0, r4\n" + " str r4, [sp]\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl debug_sub_8008264\n" + " ldrh r0, [r5]\n" + " lsr r0, r0, #0x2\n" + " and r0, r0, r4\n" + " str r4, [sp]\n" + " mov r1, #0x1\n" + " mov r2, #0x15\n" + " mov r3, #0x1\n" + " bl debug_sub_8008264\n" + " ldrh r0, [r5]\n" + " lsr r0, r0, #0x2\n" + " and r0, r0, r4\n" + " str r4, [sp]\n" + " mov r1, #0x1\n" + " mov r2, #0x29\n" + " mov r3, #0x1\n" + " bl debug_sub_8008264\n" + "._360:\n" + " ldr r0, ._361 + 4\n" + " bl sub_800374C\n" + " bl UpdatePaletteFade\n" + " bl RunTasks\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._362:\n" + " .align 2, 0\n" + "._361:\n" + " .word gBattleTypeFlags\n" + " .word gUnknown_03004210\n" + "\n" + ); +} +#else void BattleMainCB2(void) { AnimateSprites(); @@ -902,6 +2708,7 @@ void BattleMainCB2(void) UpdatePaletteFade(); RunTasks(); } +#endif void sub_800F828(struct Sprite *sprite) { @@ -1275,6 +3082,5525 @@ void c2_081284E0(void) } } +// A LOT of debug code! +#if DEBUG +__attribute__((naked)) +void debug_sub_8010800() +{ + asm( + " push {lr}\n" + " bl debug_sub_8010818\n" + " bl debug_sub_80108B8\n" + " ldr r1, ._496\n" + " mov r0, #0x0\n" + " str r0, [r1]\n" + " pop {r0}\n" + " bx r0\n" + "._497:\n" + " .align 2, 0\n" + "._496:\n" + " .word gBattleBuffersTransferData+0x100\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8010818() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " ldr r1, ._501\n" + " ldr r0, ._501 + 4\n" + " strh r0, [r1]\n" + " add r2, r1, #0\n" + " add r2, r2, #0x46\n" + " strh r0, [r2]\n" + " ldr r0, ._501 + 8\n" + " add r4, r1, #0\n" + " add r4, r4, #0x48\n" + " add r3, r0, #0\n" + " add r3, r3, #0x12\n" + " add r2, r1, #2\n" + " mov r1, #0x1d\n" + "._498:\n" + " ldrh r0, [r3]\n" + " strh r0, [r2]\n" + " strh r0, [r4]\n" + " add r4, r4, #0x2\n" + " add r3, r3, #0xa\n" + " add r2, r2, #0x2\n" + " sub r1, r1, #0x1\n" + " cmp r1, #0\n" + " bge ._498 @cond_branch\n" + " mov r1, #0x0\n" + " ldr r4, ._501 + 12\n" + " ldr r7, ._501 + 16\n" + " ldr r6, ._501 + 20\n" + " mov r0, #0x30\n" + " add r0, r0, r7\n" + " mov ip, r0\n" + "._500:\n" + " mov r0, #0x0\n" + " strb r0, [r4]\n" + " add r5, r1, #1\n" + " lsl r3, r1, #0x3\n" + "._499:\n" + " ldrb r2, [r4]\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r3\n" + " add r1, r1, r7\n" + " lsl r0, r2, #0x2\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r6\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " ldrb r2, [r4]\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r3\n" + " add r1, r1, ip\n" + " lsl r0, r2, #0x2\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r6\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " ldrb r0, [r4]\n" + " add r0, r0, #0x1\n" + " strb r0, [r4]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x3\n" + " bls ._499 @cond_branch\n" + " add r1, r5, #0\n" + " cmp r1, #0x5\n" + " ble ._500 @cond_branch\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._502:\n" + " .align 2, 0\n" + "._501:\n" + " .word gUnknown_02023A14+0x52\n" + " .word 0x115\n" + " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_02023A14+0xde\n" + " .word UnkDebug0+0x1b4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80108B8() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " bl gScriptFuncs_End+0x19f4\n" + " mov r0, #0x0\n" + " bl SetHBlankCallback\n" + " mov r0, #0x0\n" + " bl SetVBlankCallback\n" + " mov r3, #0x0\n" + " str r3, [sp]\n" + " ldr r2, ._507\n" + " mov r0, sp\n" + " str r0, [r2]\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x13\n" + " str r1, [r2, #0x4]\n" + " ldr r0, ._507 + 4\n" + " str r0, [r2, #0x8]\n" + " ldr r0, [r2, #0x8]\n" + " ldr r2, ._507 + 8\n" + " mov r0, #0x1\n" + " strh r0, [r2]\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x13\n" + " mov r4, #0x9a\n" + " lsl r4, r4, #0x5\n" + " add r0, r4, #0\n" + " strh r0, [r2]\n" + " ldr r0, ._507 + 12\n" + " mov r5, #0x0\n" + " strh r3, [r0]\n" + " ldr r0, ._507 + 16\n" + " strh r3, [r0]\n" + " ldr r0, ._507 + 20\n" + " strh r3, [r0]\n" + " ldr r0, ._507 + 24\n" + " strh r3, [r0]\n" + " ldr r0, ._507 + 28\n" + " strh r3, [r0]\n" + " ldr r0, ._507 + 32\n" + " strh r3, [r0]\n" + " ldr r0, ._507 + 36\n" + " strh r3, [r0]\n" + " ldr r0, ._507 + 40\n" + " strh r3, [r0]\n" + " add r2, r2, #0x8\n" + " ldr r4, ._507 + 44\n" + " add r0, r4, #0\n" + " strh r0, [r2]\n" + " add r2, r2, #0x2\n" + " ldr r4, ._507 + 48\n" + " add r0, r4, #0\n" + " strh r0, [r2]\n" + " ldr r0, ._507 + 52\n" + " strh r3, [r0]\n" + " add r0, r0, #0x4\n" + " strh r3, [r0]\n" + " ldr r0, ._507 + 56\n" + " bl LZDecompressVram\n" + " ldr r0, ._507 + 60\n" + " ldr r1, ._507 + 64\n" + " bl sub_800D238\n" + " ldr r4, ._507 + 68\n" + " mov r1, #0xa0\n" + " lsl r1, r1, #0x13\n" + " add r0, r4, #0\n" + " bl LZDecompressVram\n" + " ldr r1, ._507 + 72\n" + " add r0, r4, #0\n" + " bl LZDecompressVram\n" + " bl gScriptFuncs_End+0x1a70\n" + " ldr r0, ._507 + 76\n" + " bl SetVBlankCallback\n" + " ldr r0, ._507 + 80\n" + " bl SetMainCallback2\n" + " bl ResetTasks\n" + " bl ResetSpriteData\n" + " bl remove_some_task\n" + " ldr r4, ._507 + 84\n" + " add r0, r4, #0\n" + " bl SetUpWindowConfig\n" + " ldr r0, ._507 + 88\n" + " add r1, r4, #0\n" + " bl InitWindowFromConfig\n" + " ldr r0, ._507 + 92\n" + " strb r5, [r0]\n" + " ldr r0, ._507 + 96\n" + " strb r5, [r0]\n" + " ldr r0, ._507 + 100\n" + " strb r5, [r0]\n" + " mov r4, #0x0\n" + "._503:\n" + " lsl r0, r4, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x1e\n" + " ble ._503 @cond_branch\n" + " ldr r1, ._507 + 104\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " add r4, r1, #0\n" + "._504:\n" + " bl debug_sub_8012294\n" + " ldrb r0, [r4]\n" + " add r0, r0, #0x1\n" + " strb r0, [r4]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x3\n" + " bls ._504 @cond_branch\n" + " ldr r0, ._507 + 100\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + " bl debug_sub_8012540\n" + " bl debug_nullsub_3\n" + " ldr r1, ._507 + 104\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl debug_sub_80125A0\n" + " ldr r0, ._507 + 108\n" + " add r0, r0, #0x44\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x8\n" + " bne ._505 @cond_branch\n" + " bl debug_sub_801174C\n" + " b ._506\n" + "._508:\n" + " .align 2, 0\n" + "._507:\n" + " .word 0x40000d4\n" + " .word 0x85006000\n" + " .word 0x4000200\n" + " .word gUnknown_030042A4\n" + " .word gUnknown_030042A0\n" + " .word gUnknown_030042C0\n" + " .word gUnknown_030041B4\n" + " .word gUnknown_03004288\n" + " .word gUnknown_03004280\n" + " .word gUnknown_030041B0\n" + " .word gUnknown_030041B8\n" + " .word 0x1f09\n" + " .word 0x4801\n" + " .word 0x4000050\n" + " .word gMonShinyPalette_CircledQuestionMark+0x18\n" + " .word gMonShinyPalette_CircledQuestionMark+0x834\n" + " .word +0x2000000\n" + " .word gMonShinyPalette_CircledQuestionMark+0xa8c\n" + " .word 0x50001e0\n" + " .word debug_sub_8011D40+1\n" + " .word debug_sub_8010CAC+1\n" + " .word gWindowConfig_81E6C3C\n" + " .word gUnknown_Debug_03004370\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_02023A14+0x52\n" + "._505:\n" + " ldr r0, ._510\n" + " mov r1, #0x0\n" + " mov r4, #0x7\n" + " ldr r2, ._510 + 4\n" + " add r0, r0, r2\n" + "._509:\n" + " strb r1, [r0]\n" + " sub r0, r0, #0x1\n" + " sub r4, r4, #0x1\n" + " cmp r4, #0\n" + " bge ._509 @cond_branch\n" + "._506:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._511:\n" + " .align 2, 0\n" + "._510:\n" + " .word +0x2000000\n" + " .word 0x160bb\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8010A7C() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r2, r1, #0x18\n" + " mov r1, #0x0\n" + " ldr r5, ._514\n" + " cmp r1, r2\n" + " bge ._512 @cond_branch\n" + " add r3, r5, #0\n" + "._513:\n" + " add r0, r1, r3\n" + " strb r4, [r0]\n" + " add r1, r1, #0x1\n" + " cmp r1, r2\n" + " blt ._513 @cond_branch\n" + "._512:\n" + " add r1, r1, r5\n" + " mov r0, #0xff\n" + " strb r0, [r1]\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._515:\n" + " .align 2, 0\n" + "._514:\n" + " .word gBattleTextBuff1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8010AAC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov ip, r0\n" + " ldr r6, ._520\n" + " ldr r4, ._520 + 4\n" + " ldr r5, ._520 + 8\n" + " ldrb r1, [r5]\n" + " lsl r0, r1, #0x2\n" + " add r7, r0, r1\n" + " lsl r1, r7, #0x1\n" + " ldr r3, ._520 + 12\n" + " ldrb r2, [r3]\n" + " mov r0, #0x46\n" + " mul r2, r2, r0\n" + " add r1, r1, r2\n" + " add r1, r1, r4\n" + " mov r0, #0x0\n" + " ldsh r1, [r1, r0]\n" + " lsl r0, r1, #0x3\n" + " sub r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldrb r0, [r0, #0x10]\n" + " add r6, r3, #0\n" + " cmp r0, #0xfe\n" + " beq ._516 @cond_branch\n" + " cmp r0, #0xfe\n" + " bgt ._517 @cond_branch\n" + " cmp r0, #0\n" + " beq ._518 @cond_branch\n" + " b ._523\n" + "._521:\n" + " .align 2, 0\n" + "._520:\n" + " .word gBaseStats\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004360\n" + "._517:\n" + " cmp r0, #0xff\n" + " beq ._522 @cond_branch\n" + " b ._523\n" + "._518:\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r2\n" + " add r0, r0, r4\n" + " mov r1, #0x2\n" + " b ._528\n" + "._516:\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r2\n" + " add r0, r0, r4\n" + " mov r1, #0x3\n" + " b ._528\n" + "._522:\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r2\n" + " add r0, r0, r4\n" + " mov r1, #0x4\n" + " b ._528\n" + "._523:\n" + " ldrb r0, [r5]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " add r1, r1, #0x4\n" + " lsl r1, r1, #0x1\n" + " ldrb r0, [r6]\n" + " mov r3, #0x46\n" + " mul r0, r0, r3\n" + " add r1, r1, r0\n" + " add r1, r1, r4\n" + " ldrh r2, [r1]\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " strh r0, [r1]\n" + " mov r1, ip\n" + " cmp r1, #0\n" + " beq ._527 @cond_branch\n" + " ldrb r1, [r5]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " add r0, r0, #0x4\n" + " lsl r0, r0, #0x1\n" + " ldrb r1, [r6]\n" + " mul r1, r1, r3\n" + " add r0, r0, r1\n" + " add r0, r0, r4\n" + " ldrh r1, [r0]\n" + " mov r2, #0x1\n" + " eor r1, r1, r2\n" + " b ._528\n" + "._527:\n" + " ldrb r1, [r5]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " add r0, r0, #0x4\n" + " lsl r0, r0, #0x1\n" + " ldrb r1, [r6]\n" + " mul r1, r1, r3\n" + " add r0, r0, r1\n" + " add r0, r0, r4\n" + " mov r1, ip\n" + "._528:\n" + " strh r1, [r0]\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8010B80() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " mov r0, #0x0\n" + " mov ip, r0\n" + " ldr r4, ._534\n" + " ldr r1, ._534 + 4\n" + " mov r8, r1\n" + " ldr r5, ._534 + 8\n" + " ldrb r1, [r5]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " mov r2, r8\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x1\n" + " ldr r3, ._534 + 12\n" + " ldrb r2, [r3]\n" + " mov r1, #0x46\n" + " mul r1, r1, r2\n" + " add r0, r0, r1\n" + " add r0, r0, r4\n" + " ldrb r7, [r0]\n" + " lsl r1, r7, #0x18\n" + " asr r0, r1, #0x18\n" + " mov r9, r4\n" + " add r2, r5, #0\n" + " add r4, r3, #0\n" + " cmp r0, #0x9\n" + " ble ._529 @cond_branch\n" + "._530:\n" + " mov r3, #0xf6\n" + " lsl r3, r3, #0x18\n" + " add r0, r1, r3\n" + " lsr r7, r0, #0x18\n" + " mov r1, ip\n" + " lsl r0, r1, #0x18\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x11\n" + " add r0, r0, r3\n" + " lsr r0, r0, #0x18\n" + " mov ip, r0\n" + " lsl r1, r7, #0x18\n" + " asr r0, r1, #0x18\n" + " cmp r0, #0x9\n" + " bgt ._530 @cond_branch\n" + "._529:\n" + " mov r0, #0x2\n" + " and r0, r0, r6\n" + " cmp r0, #0\n" + " beq ._531 @cond_branch\n" + " mov r0, #0x1\n" + " and r0, r0, r6\n" + " cmp r0, #0\n" + " beq ._532 @cond_branch\n" + " mov r1, ip\n" + " lsl r0, r1, #0x18\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x11\n" + " b ._533\n" + "._535:\n" + " .align 2, 0\n" + "._534:\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004360\n" + "._532:\n" + " mov r1, ip\n" + " lsl r0, r1, #0x18\n" + " mov r3, #0xff\n" + " lsl r3, r3, #0x18\n" + "._533:\n" + " add r0, r0, r3\n" + " lsr r0, r0, #0x18\n" + " mov ip, r0\n" + " mov r1, ip\n" + " lsl r0, r1, #0x18\n" + " cmp r0, #0\n" + " bge ._536 @cond_branch\n" + " mov r3, #0x9\n" + " mov ip, r3\n" + "._536:\n" + " mov r1, ip\n" + " lsl r0, r1, #0x18\n" + " asr r0, r0, #0x18\n" + " cmp r0, #0x9\n" + " ble ._542 @cond_branch\n" + " mov r3, #0x0\n" + " mov ip, r3\n" + " b ._542\n" + "._531:\n" + " mov r0, #0x1\n" + " and r0, r0, r6\n" + " cmp r0, #0\n" + " beq ._539 @cond_branch\n" + " lsl r0, r7, #0x18\n" + " mov r1, #0x80\n" + " lsl r1, r1, #0x11\n" + " add r0, r0, r1\n" + " b ._540\n" + "._539:\n" + " lsl r0, r7, #0x18\n" + " mov r3, #0xff\n" + " lsl r3, r3, #0x18\n" + " add r0, r0, r3\n" + "._540:\n" + " lsr r7, r0, #0x18\n" + " lsl r0, r7, #0x18\n" + " cmp r0, #0\n" + " bgt ._541 @cond_branch\n" + " mov r7, #0x9\n" + "._541:\n" + " lsl r0, r7, #0x18\n" + " asr r0, r0, #0x18\n" + " cmp r0, #0x9\n" + " ble ._542 @cond_branch\n" + " mov r7, #0x1\n" + "._542:\n" + " ldrb r0, [r2]\n" + " lsl r2, r0, #0x2\n" + " add r2, r2, r0\n" + " mov r0, r8\n" + " ldrb r0, [r0]\n" + " add r2, r2, r0\n" + " lsl r2, r2, #0x1\n" + " ldrb r1, [r4]\n" + " mov r0, #0x1\n" + " eor r0, r0, r1\n" + " mov r1, #0x46\n" + " add r3, r0, #0\n" + " mul r3, r3, r1\n" + " add r3, r2, r3\n" + " add r3, r3, r9\n" + " ldrb r0, [r4]\n" + " mul r0, r0, r1\n" + " add r2, r2, r0\n" + " add r2, r2, r9\n" + " mov r1, ip\n" + " lsl r0, r1, #0x18\n" + " asr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x1\n" + " lsl r0, r7, #0x18\n" + " asr r0, r0, #0x18\n" + " add r0, r0, r1\n" + " strh r0, [r2]\n" + " strh r0, [r3]\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8010CAC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xfffffff0\n" + " ldr r4, ._553\n" + " ldrh r1, [r4, #0x28]\n" + " mov r0, #0x81\n" + " lsl r0, r0, #0x2\n" + " cmp r1, r0\n" + " bne ._543 @cond_branch\n" + " bl DoSoftReset\n" + "._543:\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x4\n" + " beq ._544 @cond_branch\n" + " b ._559\n" + "._544:\n" + " ldr r0, ._553 + 4\n" + " ldrb r1, [r0]\n" + " mov r8, r0\n" + " cmp r1, #0x5\n" + " bhi ._546 @cond_branch\n" + " ldr r0, ._553 + 8\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " bl debug_sub_8012628\n" + " ldr r0, ._553 + 12\n" + " bl SetMainCallback2\n" + "._546:\n" + " ldr r0, ._553 + 16\n" + " ldrb r3, [r0]\n" + " cmp r3, #0\n" + " bne ._555 @cond_branch\n" + " mov r1, r8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x6\n" + " bne ._555 @cond_branch\n" + " ldr r0, ._553 + 20\n" + " str r0, [r4, #0x8]\n" + " ldr r4, ._553 + 24\n" + " ldr r0, ._553 + 28\n" + " ldrh r1, [r0]\n" + " ldrb r2, [r0, #0x2]\n" + " str r3, [sp]\n" + " str r3, [sp, #0x4]\n" + " str r3, [sp, #0x8]\n" + " str r3, [sp, #0xc]\n" + " add r0, r4, #0\n" + " mov r3, #0x20\n" + " bl CreateMon\n" + " mov r5, #0x0\n" + " add r6, r4, #0\n" + "._549:\n" + " add r1, r5, #0\n" + " add r1, r1, #0xd\n" + " lsl r4, r5, #0x1\n" + " ldr r0, ._553 + 32\n" + " add r4, r4, r0\n" + " add r0, r6, #0\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " add r1, r5, #0\n" + " add r1, r1, #0x11\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " lsl r2, r0, #0x1\n" + " add r2, r2, r0\n" + " lsl r2, r2, #0x2\n" + " ldr r0, ._553 + 36\n" + " add r2, r2, r0\n" + " add r0, r6, #0\n" + " bl SetMonData\n" + " add r5, r5, #0x1\n" + " cmp r5, #0x3\n" + " ble ._549 @cond_branch\n" + " ldr r2, ._553 + 28\n" + " mov r4, #0x3c\n" + " ldsh r0, [r2, r4]\n" + " cmp r0, #0x1\n" + " beq ._550 @cond_branch\n" + " cmp r0, #0x2\n" + " beq ._551 @cond_branch\n" + " b ._555\n" + "._554:\n" + " .align 2, 0\n" + "._553:\n" + " .word gMain\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_030043A8\n" + " .word debug_sub_8011498+1\n" + " .word gUnknown_Debug_030043A0\n" + " .word debug_sub_80108B8+1\n" + " .word gPlayerParty\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_02023A14+0xde\n" + " .word gBattleMoves+0x4\n" + "._550:\n" + " ldr r1, ._556\n" + " ldr r0, ._556 + 4\n" + " str r0, [r1]\n" + " ldr r0, ._556 + 8\n" + " ldrh r1, [r2, #0xa]\n" + " mov r2, #0x1\n" + " mov r3, #0x0\n" + " bl EvolutionScene\n" + " b ._555\n" + "._557:\n" + " .align 2, 0\n" + "._556:\n" + " .word gUnknown_03005E94\n" + " .word debug_sub_80108B8+1\n" + " .word gPlayerParty\n" + "._551:\n" + " bl debug_sub_8012688\n" + "._555:\n" + " ldr r0, ._565\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x1\n" + " bne ._559 @cond_branch\n" + " ldr r0, ._565 + 4\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x6\n" + " bne ._559 @cond_branch\n" + " ldr r3, ._565 + 8\n" + " ldrb r2, [r3, #0x15]\n" + " lsl r0, r2, #0x1d\n" + " lsr r5, r0, #0x1f\n" + " lsl r0, r2, #0x1f\n" + " lsr r0, r0, #0x1f\n" + " lsl r0, r0, #0x1\n" + " orr r5, r5, r0\n" + " add r5, r5, #0x1\n" + " cmp r5, #0x4\n" + " bne ._560 @cond_branch\n" + " mov r5, #0x0\n" + "._560:\n" + " mov r0, #0x1\n" + " add r1, r5, #0\n" + " and r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " mov r0, #0x5\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " mov r1, #0x2\n" + " and r5, r5, r1\n" + " lsr r2, r5, #0x1\n" + " sub r1, r1, #0x4\n" + " and r0, r0, r1\n" + " orr r0, r0, r2\n" + " strb r0, [r3, #0x15]\n" + " lsl r0, r0, #0x1f\n" + " lsr r0, r0, #0x1f\n" + " bl gScriptFuncs_End+0x2aa0\n" + " bl debug_nullsub_3\n" + "._559:\n" + " ldr r4, ._565 + 12\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x8\n" + " bne ._561 @cond_branch\n" + " bl debug_sub_801174C\n" + "._561:\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x40\n" + " bne ._562 @cond_branch\n" + " bl debug_sub_80125E4\n" + " ldr r1, ._565 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._563 @cond_branch\n" + " sub r0, r0, #0x1\n" + " b ._564\n" + "._566:\n" + " .align 2, 0\n" + "._565:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gSaveBlock2\n" + " .word gMain\n" + "._563:\n" + " mov r0, #0x6\n" + "._564:\n" + " strb r0, [r1]\n" + " bl debug_sub_8011E74\n" + " ldr r0, ._570\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + " bl debug_sub_80125A0\n" + "._562:\n" + " ldr r0, ._570 + 4\n" + " ldrh r0, [r0, #0x2a]\n" + " cmp r0, #0x80\n" + " bne ._567 @cond_branch\n" + " bl debug_sub_80125E4\n" + " ldr r1, ._570\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x6\n" + " bne ._568 @cond_branch\n" + " mov r0, #0x0\n" + " b ._569\n" + "._571:\n" + " .align 2, 0\n" + "._570:\n" + " .word gUnknown_Debug_030043A4\n" + " .word gMain\n" + "._568:\n" + " add r0, r0, #0x1\n" + "._569:\n" + " strb r0, [r1]\n" + " bl debug_sub_8011E74\n" + " ldr r0, ._575\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + " bl debug_sub_80125A0\n" + "._567:\n" + " ldr r0, ._575 + 4\n" + " ldrh r0, [r0, #0x2a]\n" + " cmp r0, #0x20\n" + " bne ._572 @cond_branch\n" + " bl debug_sub_80125E4\n" + " ldr r2, ._575 + 8\n" + " ldrb r0, [r2]\n" + " add r1, r0, #0\n" + " cmp r1, #0\n" + " beq ._573 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r2]\n" + " b ._577\n" + "._576:\n" + " .align 2, 0\n" + "._575:\n" + " .word gUnknown_Debug_030043A4\n" + " .word gMain\n" + " .word gUnknown_Debug_030043A0\n" + "._573:\n" + " ldr r3, ._581\n" + " ldrb r0, [r3]\n" + " cmp r0, #0\n" + " beq ._577 @cond_branch\n" + " strb r1, [r3]\n" + " mov r0, #0x4\n" + " strb r0, [r2]\n" + " ldr r0, ._581 + 4\n" + " strh r1, [r0]\n" + " bl debug_sub_8011E5C\n" + " bl debug_sub_8011E74\n" + " ldr r0, ._581 + 8\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + "._577:\n" + " bl debug_sub_80125A0\n" + "._572:\n" + " ldr r0, ._581 + 12\n" + " ldrh r0, [r0, #0x2a]\n" + " cmp r0, #0x10\n" + " bne ._578 @cond_branch\n" + " bl debug_sub_80125E4\n" + " ldr r2, ._581 + 16\n" + " ldrb r0, [r2]\n" + " cmp r0, #0x4\n" + " beq ._579 @cond_branch\n" + " add r0, r0, #0x1\n" + " strb r0, [r2]\n" + " b ._583\n" + "._582:\n" + " .align 2, 0\n" + "._581:\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_030042C0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gMain\n" + " .word gUnknown_Debug_030043A0\n" + "._579:\n" + " ldr r3, ._587\n" + " ldrb r1, [r3]\n" + " cmp r1, #0\n" + " bne ._583 @cond_branch\n" + " mov r0, #0x1\n" + " strb r0, [r3]\n" + " strb r1, [r2]\n" + " ldr r1, ._587 + 4\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " bl debug_sub_8011E5C\n" + " bl debug_sub_8011E74\n" + " ldr r0, ._587 + 8\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + "._583:\n" + " bl debug_sub_80125A0\n" + "._578:\n" + " ldr r0, ._587 + 12\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._584 @cond_branch\n" + " b ._607\n" + "._584:\n" + " ldr r0, ._587 + 16\n" + " ldrb r2, [r0]\n" + " ldr r0, ._587 + 8\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " add r0, r2, r0\n" + " sub r0, r0, #0x1e\n" + " cmp r0, #0x4\n" + " bhi ._586 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._587 + 20\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._588:\n" + " .align 2, 0\n" + "._587:\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_030042C0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gMain\n" + " .word gUnknown_Debug_030043A0\n" + " .word ._589\n" + "._589:\n" + " .word ._590\n" + " .word ._591\n" + " .word ._592\n" + " .word ._593\n" + " .word ._594\n" + "._591:\n" + " bl debug_sub_8010818\n" + " b ._595\n" + "._592:\n" + " ldr r1, ._597\n" + " mov r0, #0x1f\n" + " mov r2, #0xec\n" + " bl debug_sub_80132C8\n" + "._595:\n" + " bl debug_sub_8011E5C\n" + " bl debug_sub_8011E74\n" + " bl debug_sub_8012540\n" + " bl debug_nullsub_3\n" + " ldr r0, ._597 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + " b ._607\n" + "._598:\n" + " .align 2, 0\n" + "._597:\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_030043A4\n" + "._593:\n" + " ldr r1, ._600\n" + " mov r0, #0x1f\n" + " mov r2, #0xec\n" + " bl debug_sub_8013294\n" + " b ._607\n" + "._601:\n" + " .align 2, 0\n" + "._600:\n" + " .word gUnknown_02023A14+0x52\n" + "._594:\n" + " ldr r3, ._604\n" + " add r2, r3, #0\n" + " add r2, r2, #0x44\n" + " ldrh r1, [r2]\n" + " mov r4, #0x0\n" + " ldsh r0, [r2, r4]\n" + " cmp r0, #0\n" + " beq ._602 @cond_branch\n" + " sub r0, r1, #1\n" + " strh r0, [r2]\n" + " add r1, r3, #0\n" + " add r1, r1, #0x8a\n" + " ldrh r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1]\n" + " b ._603\n" + "._605:\n" + " .align 2, 0\n" + "._604:\n" + " .word gUnknown_02023A14+0x52\n" + "._602:\n" + " mov r1, #0x8\n" + " strh r1, [r2]\n" + " add r0, r3, #0\n" + " add r0, r0, #0x8a\n" + " strh r1, [r0]\n" + "._603:\n" + " bl debug_sub_8012540\n" + " b ._607\n" + "._590:\n" + " mov r0, #0x0\n" + " bl debug_sub_8010B80\n" + " ldr r2, ._608\n" + " ldr r0, ._608 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + " b ._607\n" + "._609:\n" + " .align 2, 0\n" + "._608:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + "._586:\n" + " cmp r2, #0x4\n" + " bne ._611 @cond_branch\n" + " cmp r1, #0x5\n" + " bhi ._611 @cond_branch\n" + " mov r0, #0x1\n" + " bl debug_sub_8010AAC\n" + " b ._613\n" + "._611:\n" + " ldr r6, ._618\n" + " ldr r5, ._618 + 4\n" + " ldr r4, ._618 + 8\n" + " ldrb r0, [r4]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " ldrb r0, [r5]\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x1\n" + " ldr r2, ._618 + 12\n" + " ldrb r0, [r2]\n" + " mov r3, #0x46\n" + " mul r0, r0, r3\n" + " add r1, r1, r0\n" + " add r1, r1, r6\n" + " ldrh r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1]\n" + " ldrb r0, [r4]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " ldrb r5, [r5]\n" + " add r1, r1, r5\n" + " lsl r0, r1, #0x1\n" + " ldrb r2, [r2]\n" + " mul r2, r2, r3\n" + " add r0, r0, r2\n" + " add r3, r0, r6\n" + " mov r4, #0x0\n" + " ldsh r2, [r3, r4]\n" + " ldr r4, ._618 + 16\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r1, r0, #0x1\n" + " add r0, r4, #0\n" + " add r0, r0, #0x8\n" + " add r0, r1, r0\n" + " ldrh r0, [r0]\n" + " cmp r2, r0\n" + " bge ._613 @cond_branch\n" + " add r0, r4, #6\n" + " add r0, r1, r0\n" + " ldrh r0, [r0]\n" + " strh r0, [r3]\n" + "._613:\n" + " ldr r5, ._618 + 4\n" + " ldrb r0, [r5]\n" + " cmp r0, #0\n" + " bne ._614 @cond_branch\n" + " mov r0, #0x0\n" + " bl debug_sub_8010AAC\n" + " ldr r0, ._618 + 8\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " add r0, r0, #0x4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + "._614:\n" + " ldr r4, ._618 + 8\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r5, [r5]\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + "._607:\n" + " ldr r0, ._618 + 20\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._615 @cond_branch\n" + " b ._638\n" + "._615:\n" + " ldr r0, ._618 + 4\n" + " ldrb r2, [r0]\n" + " ldr r0, ._618 + 8\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " add r0, r2, r0\n" + " sub r0, r0, #0x1e\n" + " cmp r0, #0x4\n" + " bhi ._617 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._618 + 24\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._619:\n" + " .align 2, 0\n" + "._618:\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004360\n" + " .word UnkDebug0+0x6c\n" + " .word gMain\n" + " .word ._620\n" + "._620:\n" + " .word ._621\n" + " .word ._622\n" + " .word ._623\n" + " .word ._624\n" + " .word ._625\n" + "._622:\n" + " bl debug_sub_8010818\n" + " b ._626\n" + "._623:\n" + " ldr r1, ._628\n" + " mov r0, #0x1f\n" + " mov r2, #0xec\n" + " bl debug_sub_80132C8\n" + "._626:\n" + " bl debug_sub_8011E5C\n" + " bl debug_sub_8011E74\n" + " bl debug_sub_8012540\n" + " bl debug_nullsub_3\n" + " ldr r0, ._628 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + " b ._638\n" + "._629:\n" + " .align 2, 0\n" + "._628:\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_030043A4\n" + "._624:\n" + " ldr r1, ._631\n" + " mov r0, #0x1f\n" + " mov r2, #0xec\n" + " bl debug_sub_8013294\n" + " b ._638\n" + "._632:\n" + " .align 2, 0\n" + "._631:\n" + " .word gUnknown_02023A14+0x52\n" + "._625:\n" + " ldr r3, ._635\n" + " add r2, r3, #0\n" + " add r2, r2, #0x44\n" + " ldrh r1, [r2]\n" + " mov r4, #0x0\n" + " ldsh r0, [r2, r4]\n" + " cmp r0, #0x7\n" + " bgt ._633 @cond_branch\n" + " add r0, r1, #1\n" + " strh r0, [r2]\n" + " add r1, r3, #0\n" + " add r1, r1, #0x8a\n" + " ldrh r0, [r1]\n" + " add r0, r0, #0x1\n" + " strh r0, [r1]\n" + " b ._634\n" + "._636:\n" + " .align 2, 0\n" + "._635:\n" + " .word gUnknown_02023A14+0x52\n" + "._633:\n" + " mov r1, #0x0\n" + " strh r1, [r2]\n" + " add r0, r3, #0\n" + " add r0, r0, #0x8a\n" + " strh r1, [r0]\n" + "._634:\n" + " bl debug_sub_8012540\n" + " b ._638\n" + "._621:\n" + " mov r0, #0x1\n" + " bl debug_sub_8010B80\n" + " ldr r2, ._639\n" + " ldr r0, ._639 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + " b ._638\n" + "._640:\n" + " .align 2, 0\n" + "._639:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + "._617:\n" + " cmp r2, #0x4\n" + " bne ._642 @cond_branch\n" + " cmp r1, #0x5\n" + " bhi ._642 @cond_branch\n" + " mov r0, #0x1\n" + " bl debug_sub_8010AAC\n" + " b ._644\n" + "._642:\n" + " ldr r6, ._650\n" + " ldr r5, ._650 + 4\n" + " ldr r4, ._650 + 8\n" + " ldrb r0, [r4]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " ldrb r0, [r5]\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x1\n" + " ldr r2, ._650 + 12\n" + " ldrb r0, [r2]\n" + " mov r3, #0x46\n" + " mul r0, r0, r3\n" + " add r1, r1, r0\n" + " add r1, r1, r6\n" + " ldrh r0, [r1]\n" + " add r0, r0, #0x1\n" + " strh r0, [r1]\n" + " ldrb r0, [r4]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " ldrb r5, [r5]\n" + " add r1, r1, r5\n" + " lsl r0, r1, #0x1\n" + " ldrb r2, [r2]\n" + " mul r2, r2, r3\n" + " add r0, r0, r2\n" + " add r3, r0, r6\n" + " mov r4, #0x0\n" + " ldsh r2, [r3, r4]\n" + " ldr r4, ._650 + 16\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r1, r0, #0x1\n" + " add r0, r4, #6\n" + " add r0, r1, r0\n" + " ldrh r0, [r0]\n" + " cmp r2, r0\n" + " ble ._644 @cond_branch\n" + " add r0, r4, #0\n" + " add r0, r0, #0x8\n" + " add r0, r1, r0\n" + " ldrh r0, [r0]\n" + " strh r0, [r3]\n" + "._644:\n" + " ldr r5, ._650 + 4\n" + " ldrb r0, [r5]\n" + " cmp r0, #0\n" + " bne ._645 @cond_branch\n" + " mov r0, #0x0\n" + " bl debug_sub_8010AAC\n" + " ldr r0, ._650 + 8\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " add r0, r0, #0x4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + "._645:\n" + " ldr r4, ._650 + 8\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r5, [r5]\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + "._638:\n" + " ldr r0, ._650 + 20\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._646 @cond_branch\n" + " ldr r0, ._650 + 4\n" + " ldrb r1, [r0]\n" + " ldr r2, ._650 + 8\n" + " mov r8, r2\n" + " add r7, r0, #0\n" + " cmp r1, #0x4\n" + " bne ._648 @cond_branch\n" + " ldrb r0, [r2]\n" + " cmp r0, #0x5\n" + " bhi ._648 @cond_branch\n" + " mov r0, #0x1\n" + " bl debug_sub_8010AAC\n" + " b ._653\n" + "._651:\n" + " .align 2, 0\n" + "._650:\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004360\n" + " .word UnkDebug0+0x6c\n" + " .word gMain\n" + "._648:\n" + " mov r4, r8\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r1, [r7]\n" + " add r0, r0, r1\n" + " cmp r0, #0x1e\n" + " bne ._652 @cond_branch\n" + " mov r0, #0x2\n" + " bl debug_sub_8010B80\n" + " b ._653\n" + "._652:\n" + " ldr r4, ._655\n" + " lsl r1, r0, #0x1\n" + " ldr r3, ._655 + 4\n" + " ldrb r2, [r3]\n" + " mov r0, #0x46\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r4\n" + " ldrh r0, [r1]\n" + " sub r0, r0, #0xa\n" + " strh r0, [r1]\n" + " add r6, r3, #0\n" + " ldr r5, ._655 + 8\n" + " b ._654\n" + "._656:\n" + " .align 2, 0\n" + "._655:\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_03004360\n" + " .word UnkDebug0+0x6c\n" + "._657:\n" + " add r0, r5, #6\n" + " add r0, r1, r0\n" + " ldrh r0, [r0]\n" + " ldrh r2, [r3]\n" + " add r0, r0, r2\n" + " strh r0, [r3]\n" + "._654:\n" + " mov r1, r8\n" + " ldrb r0, [r1]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " ldrb r2, [r7]\n" + " add r1, r1, r2\n" + " lsl r2, r1, #0x1\n" + " ldrb r3, [r6]\n" + " mov r0, #0x46\n" + " mul r0, r0, r3\n" + " add r2, r2, r0\n" + " add r3, r2, r4\n" + " mov r0, #0x0\n" + " ldsh r2, [r3, r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r1, r0, #0x1\n" + " add r0, r5, #0\n" + " add r0, r0, #0x8\n" + " add r0, r1, r0\n" + " ldrh r0, [r0]\n" + " cmp r2, r0\n" + " blt ._657 @cond_branch\n" + "._653:\n" + " ldr r5, ._663\n" + " ldrb r0, [r5]\n" + " cmp r0, #0\n" + " bne ._658 @cond_branch\n" + " mov r0, #0x0\n" + " bl debug_sub_8010AAC\n" + " ldr r0, ._663 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " add r0, r0, #0x4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + "._658:\n" + " ldr r4, ._663 + 4\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r5, [r5]\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + "._646:\n" + " ldr r0, ._663 + 8\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._659 @cond_branch\n" + " ldr r0, ._663\n" + " ldrb r1, [r0]\n" + " ldr r2, ._663 + 4\n" + " mov r8, r2\n" + " add r7, r0, #0\n" + " cmp r1, #0x4\n" + " bne ._661 @cond_branch\n" + " ldrb r0, [r2]\n" + " cmp r0, #0x5\n" + " bhi ._661 @cond_branch\n" + " mov r0, #0x1\n" + " bl debug_sub_8010AAC\n" + " b ._666\n" + "._664:\n" + " .align 2, 0\n" + "._663:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gMain\n" + "._661:\n" + " mov r4, r8\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r1, [r7]\n" + " add r0, r0, r1\n" + " cmp r0, #0x1e\n" + " bne ._665 @cond_branch\n" + " mov r0, #0x3\n" + " bl debug_sub_8010B80\n" + " b ._666\n" + "._665:\n" + " ldr r4, ._668\n" + " lsl r1, r0, #0x1\n" + " ldr r3, ._668 + 4\n" + " ldrb r2, [r3]\n" + " mov r0, #0x46\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r4\n" + " ldrh r0, [r1]\n" + " add r0, r0, #0xa\n" + " strh r0, [r1]\n" + " add r6, r3, #0\n" + " ldr r5, ._668 + 8\n" + " b ._667\n" + "._669:\n" + " .align 2, 0\n" + "._668:\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_03004360\n" + " .word UnkDebug0+0x6c\n" + "._670:\n" + " ldrh r0, [r3]\n" + " sub r0, r0, r1\n" + " strh r0, [r3]\n" + "._667:\n" + " mov r2, r8\n" + " ldrb r0, [r2]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " ldrb r0, [r7]\n" + " add r1, r1, r0\n" + " lsl r2, r1, #0x1\n" + " ldrb r3, [r6]\n" + " mov r0, #0x46\n" + " mul r0, r0, r3\n" + " add r2, r2, r0\n" + " add r3, r2, r4\n" + " mov r0, #0x0\n" + " ldsh r2, [r3, r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x1\n" + " add r1, r5, #6\n" + " add r0, r0, r1\n" + " ldrh r1, [r0]\n" + " cmp r2, r1\n" + " bgt ._670 @cond_branch\n" + "._666:\n" + " ldr r5, ._672\n" + " ldrb r0, [r5]\n" + " cmp r0, #0\n" + " bne ._671 @cond_branch\n" + " mov r0, #0x0\n" + " bl debug_sub_8010AAC\n" + " ldr r0, ._672 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " add r0, r0, #0x4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + "._671:\n" + " ldr r4, ._672 + 4\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r5, [r5]\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + " ldrb r1, [r4]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_80123D8\n" + "._659:\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " add sp, sp, #0x10\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._673:\n" + " .align 2, 0\n" + "._672:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8011498() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " ldr r2, ._687\n" + " ldr r0, ._687 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r9, r0\n" + " ldr r4, ._687 + 8\n" + " ldrh r1, [r4, #0x28]\n" + " mov r0, #0x81\n" + " lsl r0, r0, #0x2\n" + " cmp r1, r0\n" + " bne ._674 @cond_branch\n" + " bl DoSoftReset\n" + "._674:\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x4\n" + " bne ._675 @cond_branch\n" + " bl debug_sub_8012658\n" + " ldr r0, ._687 + 12\n" + " bl SetMainCallback2\n" + "._675:\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x8\n" + " bne ._676 @cond_branch\n" + " bl debug_sub_801174C\n" + "._676:\n" + " ldrh r0, [r4, #0x2a]\n" + " cmp r0, #0x40\n" + " beq ._677 @cond_branch\n" + " cmp r0, #0x80\n" + " bne ._678 @cond_branch\n" + "._677:\n" + " bl debug_sub_8012658\n" + " ldr r0, ._687 + 16\n" + " ldrb r1, [r0]\n" + " mov r2, #0x2\n" + " eor r1, r1, r2\n" + " strb r1, [r0]\n" + " bl debug_sub_8012628\n" + "._678:\n" + " ldr r0, ._687 + 8\n" + " ldrh r0, [r0, #0x2a]\n" + " cmp r0, #0x20\n" + " beq ._679 @cond_branch\n" + " cmp r0, #0x10\n" + " bne ._680 @cond_branch\n" + "._679:\n" + " bl debug_sub_8012658\n" + " ldr r0, ._687 + 16\n" + " ldrb r1, [r0]\n" + " mov r2, #0x1\n" + " eor r1, r1, r2\n" + " strb r1, [r0]\n" + " bl debug_sub_8012628\n" + "._680:\n" + " ldr r0, ._687 + 8\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._681 @cond_branch\n" + " ldr r0, ._687 + 20\n" + " mov r8, r0\n" + " ldr r6, ._687 + 16\n" + " ldrb r4, [r6]\n" + " lsl r4, r4, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x4358\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldr r5, ._687 + 24\n" + " ldrb r2, [r5]\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x4\n" + " add r4, r4, r1\n" + " add r4, r4, r8\n" + " ldrh r1, [r4]\n" + " sub r1, r1, #0x1\n" + " strh r1, [r4]\n" + " ldrb r3, [r6]\n" + " lsl r1, r3, #0x1\n" + " add r1, r1, r0\n" + " ldrb r2, [r5]\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x4\n" + " add r1, r1, r0\n" + " mov r0, r8\n" + " add r4, r1, r0\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " ldr r5, ._687 + 28\n" + " lsl r0, r3, #0x2\n" + " add r0, r0, r3\n" + " lsl r2, r0, #0x1\n" + " add r0, r5, #0\n" + " add r0, r0, #0x8\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " cmp r1, r0\n" + " bge ._682 @cond_branch\n" + " add r0, r5, #6\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " strh r0, [r4]\n" + "._682:\n" + " bl debug_sub_8012294\n" + "._681:\n" + " ldr r0, ._687 + 8\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._683 @cond_branch\n" + " ldr r1, ._687 + 20\n" + " mov r8, r1\n" + " ldr r6, ._687 + 16\n" + " ldrb r4, [r6]\n" + " lsl r4, r4, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x4358\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldr r5, ._687 + 24\n" + " ldrb r2, [r5]\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x4\n" + " add r4, r4, r1\n" + " add r4, r4, r8\n" + " ldrh r1, [r4]\n" + " add r1, r1, #0x1\n" + " strh r1, [r4]\n" + " ldrb r3, [r6]\n" + " lsl r1, r3, #0x1\n" + " add r1, r1, r0\n" + " ldrb r2, [r5]\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x4\n" + " add r1, r1, r0\n" + " mov r0, r8\n" + " add r4, r1, r0\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " ldr r5, ._687 + 28\n" + " lsl r0, r3, #0x2\n" + " add r0, r0, r3\n" + " lsl r2, r0, #0x1\n" + " add r0, r5, #6\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " cmp r1, r0\n" + " ble ._684 @cond_branch\n" + " add r0, r5, #0\n" + " add r0, r0, #0x8\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " strh r0, [r4]\n" + "._684:\n" + " bl debug_sub_8012294\n" + "._683:\n" + " ldr r0, ._687 + 8\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._685 @cond_branch\n" + " ldr r6, ._687 + 20\n" + " ldr r5, ._687 + 16\n" + " ldrb r4, [r5]\n" + " lsl r4, r4, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x4358\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldr r2, ._687 + 24\n" + " ldrb r1, [r2]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " add r4, r4, r6\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0xa\n" + " strh r0, [r4]\n" + " mov sl, r5\n" + " mov r8, r6\n" + " add r7, r2, #0\n" + " ldr r6, ._687 + 28\n" + " b ._686\n" + "._688:\n" + " .align 2, 0\n" + "._687:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gMain\n" + " .word debug_sub_8010CAC+1\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_02023A14+0xde\n" + " .word gUnknown_Debug_03004360\n" + " .word UnkDebug0+0x1ac\n" + "._689:\n" + " add r0, r6, #6\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " ldrh r1, [r4]\n" + " add r0, r0, r1\n" + " strh r0, [r4]\n" + "._686:\n" + " mov r0, sl\n" + " ldrb r5, [r0]\n" + " lsl r4, r5, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x4358\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " add r4, r4, r8\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r2, r0, #0x1\n" + " add r0, r6, #0\n" + " add r0, r0, #0x8\n" + " add r0, r2, r0\n" + " ldrh r0, [r0]\n" + " cmp r1, r0\n" + " blt ._689 @cond_branch\n" + " bl debug_sub_8012294\n" + "._685:\n" + " ldr r0, ._692\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._690 @cond_branch\n" + " ldr r6, ._692 + 4\n" + " ldr r5, ._692 + 8\n" + " ldrb r4, [r5]\n" + " lsl r4, r4, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x4358\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldr r2, ._692 + 12\n" + " ldrb r1, [r2]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " add r4, r4, r6\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0xa\n" + " strh r0, [r4]\n" + " mov sl, r5\n" + " mov r8, r6\n" + " add r7, r2, #0\n" + " ldr r6, ._692 + 16\n" + " b ._691\n" + "._693:\n" + " .align 2, 0\n" + "._692:\n" + " .word gMain\n" + " .word gUnknown_02023A14+0xde\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_Debug_03004360\n" + " .word UnkDebug0+0x1ac\n" + "._694:\n" + " ldrh r0, [r4]\n" + " sub r0, r0, r1\n" + " strh r0, [r4]\n" + "._691:\n" + " mov r1, sl\n" + " ldrb r5, [r1]\n" + " lsl r4, r5, #0x1\n" + " mov r0, r9\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x4358\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, r0\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " add r4, r4, r8\n" + " mov r0, #0x0\n" + " ldsh r2, [r4, r0]\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x1\n" + " add r1, r6, #6\n" + " add r0, r0, r1\n" + " ldrh r1, [r0]\n" + " cmp r2, r1\n" + " bgt ._694 @cond_branch\n" + " bl debug_sub_8012294\n" + "._690:\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_801174C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xffffffe8\n" + " mov r0, #0x0\n" + " mov r9, r0\n" + " ldr r1, ._704\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl Random\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " mov r0, #0x3\n" + " and r4, r4, r0\n" + " lsl r4, r4, #0x18\n" + " lsr r6, r4, #0x18\n" + " ldr r5, ._704 + 4\n" + " lsl r1, r6, #0x1\n" + " add r1, r1, r6\n" + " lsl r1, r1, #0x1\n" + " ldr r0, ._704 + 8\n" + " add r1, r1, r0\n" + " add r0, r5, #0\n" + " bl StringCopy\n" + " lsr r4, r4, #0x19\n" + " strb r4, [r5, #0x8]\n" + " bl ZeroPlayerPartyMons\n" + " bl ZeroEnemyPartyMons\n" + " ldr r0, ._704 + 12\n" + " mov r1, #0x3c\n" + " ldsh r7, [r0, r1]\n" + " mov r2, r9\n" + " str r2, [sp, #0xc]\n" + " cmp r7, #0x9\n" + " ble ._695 @cond_branch\n" + " mov r0, #0x0\n" + "._696:\n" + " sub r7, r7, #0xa\n" + " add r0, r0, #0x1\n" + " cmp r7, #0x9\n" + " bgt ._696 @cond_branch\n" + " str r0, [sp, #0xc]\n" + "._695:\n" + " ldr r2, ._704 + 16\n" + " ldr r1, ._704 + 20\n" + " sub r0, r7, #1\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrh r3, [r0]\n" + " strh r3, [r2]\n" + " ldr r1, ._704 + 24\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldr r1, ._704 + 28\n" + " add r0, sp, #0xc\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " mov r0, #0x80\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._697 @cond_branch\n" + " bl EnterSafariMode\n" + "._697:\n" + " ldr r5, ._704 + 12\n" + " ldrh r0, [r5, #0x3c]\n" + " sub r0, r0, #0x2\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0x2\n" + " bhi ._698 @cond_branch\n" + " ldr r4, ._704 + 32\n" + " bl Random\n" + " mov r1, #0x7\n" + " and r1, r1, r0\n" + " add r1, r1, #0x1\n" + " strh r1, [r4]\n" + "._698:\n" + " ldr r1, ._704 + 36\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " mov r7, #0x0\n" + "._745:\n" + " lsl r0, r7, #0x1\n" + " ldr r3, ._704 + 12\n" + " add r1, r0, r3\n" + " mov r2, #0x0\n" + " ldsh r1, [r1, r2]\n" + " add r2, r3, #0\n" + " mov r8, r0\n" + " add r3, r7, #5\n" + " mov sl, r3\n" + " cmp r1, #0\n" + " beq ._699 @cond_branch\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, #0\n" + " add r0, r0, r1\n" + " mov r3, #0x0\n" + " ldsh r0, [r0, r3]\n" + " cmp r0, #0x1\n" + " beq ._707 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._701 @cond_branch\n" + " cmp r0, #0\n" + " beq ._706 @cond_branch\n" + " b ._708\n" + "._705:\n" + " .align 2, 0\n" + "._704:\n" + " .word gUnknown_020297ED\n" + " .word gSaveBlock2\n" + " .word UnkDebug0+0x279\n" + " .word gUnknown_02023A14+0x52\n" + " .word gBattleTypeFlags\n" + " .word UnkDebug0+0x1e0\n" + " .word gUnknown_02023A14+0x50\n" + " .word gBattleTerrain\n" + " .word gTrainerBattleOpponent\n" + " .word gPlayerPartyCount\n" + "._701:\n" + " cmp r0, #0x2\n" + " beq ._706 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._707 @cond_branch\n" + " b ._708\n" + "._706:\n" + " mov r6, #0x0\n" + " b ._710\n" + "._707:\n" + " mov r6, #0xfe\n" + " b ._710\n" + "._708:\n" + " mov r6, #0xff\n" + "._710:\n" + " mov r1, r8\n" + " add r0, r1, r2\n" + " mov r3, #0x0\n" + " ldsh r0, [r0, r3]\n" + " add r1, r7, #5\n" + " mov sl, r1\n" + " cmp r0, #0xc9\n" + " bne ._712 @cond_branch\n" + " cmp r1, #0x1d\n" + " bgt ._712 @cond_branch\n" + " add r0, r7, #7\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r2\n" + " ldrb r0, [r0]\n" + " mov r9, r0\n" + " b ._713\n" + "._712:\n" + " mov r2, #0x0\n" + " mov r9, r2\n" + "._713:\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x3d30\n" + " mov r3, #0x64\n" + " mul r0, r0, r3\n" + " ldr r1, ._719\n" + " add r0, r0, r1\n" + " ldr r1, ._719 + 4\n" + " add r1, r1, r8\n" + " ldrh r1, [r1]\n" + " add r2, r7, #1\n" + " lsl r2, r2, #0x1\n" + " ldr r3, ._719 + 4\n" + " add r2, r2, r3\n" + " ldrb r2, [r2]\n" + " str r6, [sp]\n" + " mov r3, #0x0\n" + " str r3, [sp, #0x4]\n" + " mov r3, r9\n" + " str r3, [sp, #0x8]\n" + " mov r3, #0x0\n" + " bl CreateMonWithGenderNatureLetter\n" + "._699:\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x3d30\n" + " mov r2, #0x64\n" + " add r1, r0, #0\n" + " mul r1, r1, r2\n" + " ldr r0, ._719\n" + " add r5, r1, r0\n" + " ldr r4, ._719 + 8\n" + " mov r3, r8\n" + " add r6, r3, r4\n" + " add r0, r5, #0\n" + " mov r1, #0xc\n" + " add r2, r6, #0\n" + " bl SetMonData\n" + " sub r4, r4, #0x4\n" + " add r1, r7, #2\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r4\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r1, [sp, #0x10]\n" + " cmp r0, #0xb\n" + " bhi ._714 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0x26\n" + " add r2, r6, #0\n" + " bl SetMonData\n" + "._714:\n" + " add r1, r7, #3\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r4\n" + " mov r3, #0x0\n" + " ldsh r2, [r0, r3]\n" + " str r1, [sp, #0x14]\n" + " cmp r2, #0\n" + " beq ._716 @cond_branch\n" + " cmp r2, #0x3\n" + " beq ._716 @cond_branch\n" + " cmp r2, #0x2\n" + " bgt ._717 @cond_branch\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " sub r0, r0, #0x1\n" + " b ._718\n" + "._720:\n" + " .align 2, 0\n" + "._719:\n" + " .word gEnemyParty\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_02023A14+0x56\n" + "._717:\n" + " mov r2, #0x0\n" + " ldsh r0, [r0, r2]\n" + " sub r0, r0, #0x4\n" + "._718:\n" + " str r0, [sp, #0xc]\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x3d30\n" + " mov r3, #0x64\n" + " mul r0, r0, r3\n" + " ldr r1, ._726\n" + " add r0, r0, r1\n" + " mov r1, #0x2e\n" + " add r2, sp, #0xc\n" + " bl SetMonData\n" + "._716:\n" + " ldr r1, ._726 + 4\n" + " add r1, r1, #0x46\n" + " mov r2, r8\n" + " add r0, r2, r1\n" + " mov r3, #0x0\n" + " ldsh r0, [r0, r3]\n" + " ldr r2, ._726 + 4\n" + " cmp r0, #0\n" + " beq ._721 @cond_branch\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x1\n" + " beq ._729 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._723 @cond_branch\n" + " cmp r0, #0\n" + " beq ._728 @cond_branch\n" + " b ._730\n" + "._727:\n" + " .align 2, 0\n" + "._726:\n" + " .word gEnemyParty\n" + " .word gUnknown_02023A14+0x52\n" + "._723:\n" + " cmp r0, #0x2\n" + " beq ._728 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._729 @cond_branch\n" + " b ._730\n" + "._728:\n" + " mov r6, #0x0\n" + " b ._732\n" + "._729:\n" + " mov r6, #0xfe\n" + " b ._732\n" + "._730:\n" + " mov r6, #0xff\n" + "._732:\n" + " add r1, r2, #0\n" + " add r1, r1, #0x46\n" + " mov r2, r8\n" + " add r0, r2, r1\n" + " mov r3, #0x0\n" + " ldsh r0, [r0, r3]\n" + " cmp r0, #0xc9\n" + " bne ._734 @cond_branch\n" + " mov r0, sl\n" + " cmp r0, #0x1d\n" + " bgt ._734 @cond_branch\n" + " add r0, r7, #7\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " mov r9, r0\n" + " b ._735\n" + "._734:\n" + " mov r1, #0x0\n" + " mov r9, r1\n" + "._735:\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x3d30\n" + " mov r2, #0x64\n" + " mul r0, r0, r2\n" + " ldr r1, ._741\n" + " add r0, r0, r1\n" + " ldr r1, ._741 + 4\n" + " add r1, r1, r8\n" + " ldrh r1, [r1]\n" + " add r2, r7, #1\n" + " lsl r2, r2, #0x1\n" + " ldr r3, ._741 + 4\n" + " add r2, r2, r3\n" + " ldrb r2, [r2]\n" + " str r6, [sp]\n" + " mov r3, #0x0\n" + " str r3, [sp, #0x4]\n" + " mov r3, r9\n" + " str r3, [sp, #0x8]\n" + " mov r3, #0x0\n" + " bl CreateMonWithGenderNatureLetter\n" + " ldr r1, ._741 + 8\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._721:\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x3d30\n" + " mov r2, #0x64\n" + " add r1, r0, #0\n" + " mul r1, r1, r2\n" + " ldr r0, ._741\n" + " add r4, r1, r0\n" + " ldr r0, ._741 + 12\n" + " mov r3, r8\n" + " add r5, r3, r0\n" + " add r0, r4, #0\n" + " mov r1, #0xc\n" + " add r2, r5, #0\n" + " bl SetMonData\n" + " ldr r1, [sp, #0x10]\n" + " lsl r0, r1, #0x1\n" + " ldr r2, ._741 + 16\n" + " add r0, r0, r2\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi ._736 @cond_branch\n" + " add r0, r4, #0\n" + " mov r1, #0x26\n" + " add r2, r5, #0\n" + " bl SetMonData\n" + "._736:\n" + " ldr r3, [sp, #0x14]\n" + " lsl r0, r3, #0x1\n" + " ldr r1, ._741 + 4\n" + " add r0, r0, r1\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " cmp r1, #0\n" + " beq ._738 @cond_branch\n" + " cmp r1, #0x3\n" + " beq ._738 @cond_branch\n" + " cmp r1, #0x2\n" + " bgt ._739 @cond_branch\n" + " add r0, r1, #0\n" + " sub r0, r0, #0x1\n" + " b ._740\n" + "._742:\n" + " .align 2, 0\n" + "._741:\n" + " .word gPlayerParty\n" + " .word gUnknown_02023A14+0x98\n" + " .word gPlayerPartyCount\n" + " .word gUnknown_02023A14+0x9c\n" + " .word gUnknown_02023A14+0x52\n" + "._739:\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " sub r0, r0, #0x4\n" + "._740:\n" + " str r0, [sp, #0xc]\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x3d30\n" + " mov r2, #0x64\n" + " mul r0, r0, r2\n" + " ldr r1, ._750\n" + " add r0, r0, r1\n" + " mov r1, #0x2e\n" + " add r2, sp, #0xc\n" + " bl SetMonData\n" + "._738:\n" + " ldr r3, [sp, #0x14]\n" + " lsl r0, r3, #0x1\n" + " ldr r1, ._750 + 4\n" + " add r0, r0, r1\n" + " mov r2, #0x0\n" + " ldsh r0, [r0, r2]\n" + " cmp r0, #0x2\n" + " ble ._743 @cond_branch\n" + " add r0, r7, #0\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x3d30\n" + " mov r3, #0x64\n" + " mul r0, r0, r3\n" + " ldr r1, ._750\n" + " add r0, r0, r1\n" + " mov r1, #0x7\n" + " ldr r2, ._750 + 8\n" + " bl SetMonData\n" + " ldr r2, ._750 + 12\n" + " ldrb r0, [r2]\n" + " mov r1, #0x40\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + "._743:\n" + " mov r7, sl\n" + " cmp r7, #0x1d\n" + " bgt ._744 @cond_branch\n" + " b ._745\n" + "._744:\n" + " mov r0, #0x0\n" + " str r0, [sp, #0xc]\n" + " mov r0, #0x64\n" + " mov r8, r0\n" + " ldr r1, ._750 + 16\n" + " mov r9, r1\n" + " ldr r2, ._750\n" + " mov sl, r2\n" + "._747:\n" + " mov r7, #0x0\n" + "._746:\n" + " ldr r2, [sp, #0xc]\n" + " mov r0, r8\n" + " mul r0, r0, r2\n" + " ldr r3, ._750 + 20\n" + " add r0, r0, r3\n" + " add r5, r7, #0\n" + " add r5, r5, #0xd\n" + " lsl r2, r2, #0x3\n" + " lsl r4, r7, #0x1\n" + " mov r3, r9\n" + " add r1, r4, r3\n" + " add r2, r2, r1\n" + " add r1, r5, #0\n" + " bl SetMonData\n" + " ldr r1, [sp, #0xc]\n" + " mov r0, r8\n" + " mul r0, r0, r1\n" + " ldr r2, ._750 + 20\n" + " add r0, r0, r2\n" + " add r6, r7, #0\n" + " add r6, r6, #0x11\n" + " lsl r1, r1, #0x3\n" + " add r1, r4, r1\n" + " add r1, r1, r9\n" + " mov r3, #0x0\n" + " ldsh r1, [r1, r3]\n" + " lsl r2, r1, #0x1\n" + " add r2, r2, r1\n" + " lsl r2, r2, #0x2\n" + " ldr r1, ._750 + 24\n" + " add r2, r2, r1\n" + " add r1, r6, #0\n" + " bl SetMonData\n" + " ldr r2, [sp, #0xc]\n" + " mov r0, r8\n" + " mul r0, r0, r2\n" + " add r0, r0, sl\n" + " lsl r2, r2, #0x3\n" + " ldr r3, ._750 + 28\n" + " add r1, r4, r3\n" + " add r2, r2, r1\n" + " add r1, r5, #0\n" + " bl SetMonData\n" + " ldr r1, [sp, #0xc]\n" + " mov r0, r8\n" + " mul r0, r0, r1\n" + " add r0, r0, sl\n" + " lsl r1, r1, #0x3\n" + " add r4, r4, r1\n" + " ldr r1, ._750 + 28\n" + " add r4, r4, r1\n" + " mov r2, #0x0\n" + " ldsh r1, [r4, r2]\n" + " lsl r2, r1, #0x1\n" + " add r2, r2, r1\n" + " lsl r2, r2, #0x2\n" + " ldr r3, ._750 + 24\n" + " add r2, r2, r3\n" + " add r1, r6, #0\n" + " bl SetMonData\n" + " add r7, r7, #0x1\n" + " cmp r7, #0x3\n" + " ble ._746 @cond_branch\n" + " ldr r0, [sp, #0xc]\n" + " add r0, r0, #0x1\n" + " str r0, [sp, #0xc]\n" + " cmp r0, #0x5\n" + " ble ._747 @cond_branch\n" + " ldr r3, ._750 + 32\n" + " add r4, r3, #0\n" + " add r4, r4, #0x44\n" + " ldrh r1, [r4]\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " cmp r0, #0x8\n" + " bne ._748 @cond_branch\n" + " ldr r0, ._750 + 12\n" + " ldrb r1, [r0]\n" + " mov r2, #0x80\n" + " b ._753\n" + "._751:\n" + " .align 2, 0\n" + "._750:\n" + " .word gPlayerParty\n" + " .word gUnknown_02023A14+0x98\n" + " .word UnkDebug0+0x291\n" + " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14+0xde\n" + " .word gEnemyParty\n" + " .word gBattleMoves+0x4\n" + " .word gUnknown_02023A14+0x10e\n" + " .word gUnknown_02023A14+0x52\n" + "._748:\n" + " cmp r0, #0x7\n" + " bne ._752 @cond_branch\n" + " ldr r0, ._754\n" + " ldrb r1, [r0]\n" + " mov r2, #0x20\n" + " b ._753\n" + "._755:\n" + " .align 2, 0\n" + "._754:\n" + " .word gUnknown_02023A14+0x50\n" + "._752:\n" + " cmp r0, #0x6\n" + " bne ._756 @cond_branch\n" + " ldr r2, ._759\n" + " ldrb r0, [r2]\n" + " mov r1, #0x10\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " ldrh r1, [r3, #0x4]\n" + " mov r2, #0x4\n" + " ldsh r0, [r3, r2]\n" + " cmp r0, #0x5\n" + " ble ._757 @cond_branch\n" + " ldr r0, ._759 + 4\n" + " sub r1, r1, #0x2\n" + " ldr r3, ._759 + 8\n" + " add r0, r0, r3\n" + " b ._761\n" + "._760:\n" + " .align 2, 0\n" + "._759:\n" + " .word gUnknown_02023A14+0x50\n" + " .word +0x2000000\n" + " .word 0x160a3\n" + "._757:\n" + " ldr r0, ._762\n" + " ldr r2, ._762 + 4\n" + " add r0, r0, r2\n" + " b ._761\n" + "._763:\n" + " .align 2, 0\n" + "._762:\n" + " .word +0x2000000\n" + " .word 0x160a3\n" + "._756:\n" + " cmp r0, #0x5\n" + " bne ._764 @cond_branch\n" + " ldr r0, ._766\n" + " ldrb r1, [r0]\n" + " mov r2, #0x21\n" + "._753:\n" + " orr r1, r1, r2\n" + "._761:\n" + " strb r1, [r0]\n" + " bl sub_80408BC\n" + " b ._770\n" + "._767:\n" + " .align 2, 0\n" + "._766:\n" + " .word gUnknown_02023A14+0x50\n" + "._764:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._768 @cond_branch\n" + " bl sub_80408BC\n" + "._768:\n" + " ldrh r3, [r4]\n" + " mov r0, #0x2\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._769 @cond_branch\n" + " ldr r0, ._772\n" + " ldrb r1, [r0]\n" + " mov r2, #0x4\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + "._769:\n" + " mov r0, #0x4\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._770 @cond_branch\n" + " ldr r0, ._772\n" + " ldrb r1, [r0]\n" + " mov r2, #0x6\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + "._770:\n" + " ldr r0, ._772 + 4\n" + " ldr r1, ._772 + 8\n" + " str r1, [r0, #0x8]\n" + " ldr r0, ._772 + 12\n" + " bl SetMainCallback2\n" + " bl ClearBag\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x2\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x3\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x4\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x5\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x6\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x7\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x8\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x9\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0xa\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0xb\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0xc\n" + " mov r1, #0xa\n" + " bl AddBagItem\n" + " mov r0, #0x13\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x14\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x19\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x22\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x23\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x25\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x49\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4a\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4b\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4c\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4d\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x4e\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " mov r0, #0x50\n" + " mov r1, #0x63\n" + " bl AddBagItem\n" + " ldr r4, ._772 + 16\n" + " mov r7, #0xe\n" + "._771:\n" + " add r0, r4, #0\n" + " bl sub_810CA34\n" + " add r4, r4, #0x8\n" + " sub r7, r7, #0x1\n" + " cmp r7, #0\n" + " bge ._771 @cond_branch\n" + " add sp, sp, #0x18\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._773:\n" + " .align 2, 0\n" + "._772:\n" + " .word gUnknown_02023A14+0x50\n" + " .word gMain\n" + " .word debug_sub_80108B8+1\n" + " .word unref_sub_800D684+1\n" + " .word UnkDebug0+0x1f4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8011D40() +{ + asm( + " push {lr}\n" + " ldr r1, ._774\n" + " ldr r0, ._774 + 4\n" + " str r0, [r1]\n" + " ldr r0, ._774 + 8\n" + " str r0, [r1, #0x4]\n" + " ldr r0, ._774 + 12\n" + " str r0, [r1, #0x8]\n" + " ldr r0, [r1, #0x8]\n" + " sub r1, r1, #0xc4\n" + " ldr r0, ._774 + 16\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._774 + 20\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._774 + 24\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._774 + 28\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._774 + 32\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._774 + 36\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._774 + 40\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._774 + 44\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " bl LoadOam\n" + " bl ProcessSpriteCopyRequests\n" + " pop {r0}\n" + " bx r0\n" + "._775:\n" + " .align 2, 0\n" + "._774:\n" + " .word 0x40000d4\n" + " .word +0x2000000\n" + " .word 0x6004000\n" + " .word 0x80000800\n" + " .word gUnknown_030042A4\n" + " .word gUnknown_030042A0\n" + " .word gUnknown_030042C0\n" + " .word gUnknown_030041B4\n" + " .word gUnknown_03004288\n" + " .word gUnknown_03004280\n" + " .word gUnknown_030041B0\n" + " .word gUnknown_030041B8\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_nullsub_45() +{ + asm( + " bx lr\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8011DD4() +{ + asm( + " push {lr}\n" + " ldr r1, ._776\n" + " ldr r2, ._776 + 4\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x8\n" + " ldr r0, ._776 + 8\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._776 + 12\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._776 + 16\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._776 + 20\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._776 + 24\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._776 + 28\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._776 + 32\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r0, ._776 + 36\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + " bl LoadOam\n" + " bl ProcessSpriteCopyRequests\n" + " bl TransferPlttBuffer\n" + " bl sub_8089668\n" + " pop {r0}\n" + " bx r0\n" + "._777:\n" + " .align 2, 0\n" + "._776:\n" + " .word 0x4000008\n" + " .word 0x9803\n" + " .word gUnknown_030042A4\n" + " .word gUnknown_030042A0\n" + " .word gUnknown_030042C0\n" + " .word gUnknown_030041B4\n" + " .word gUnknown_03004288\n" + " .word gUnknown_03004280\n" + " .word gUnknown_030041B0\n" + " .word gUnknown_030041B8\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8011E5C() +{ + asm( + " push {r4, lr}\n" + " mov r4, #0x0\n" + "._778:\n" + " lsl r0, r4, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8011EA0\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x1e\n" + " ble ._778 @cond_branch\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8011E74() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r0, ._780\n" + " ldrb r5, [r0]\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " add r4, r0, #0\n" + "._779:\n" + " bl debug_sub_8012294\n" + " ldrb r0, [r4]\n" + " add r0, r0, #0x1\n" + " strb r0, [r4]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x3\n" + " bls ._779 @cond_branch\n" + " ldr r0, ._780\n" + " strb r5, [r0]\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._781:\n" + " .align 2, 0\n" + "._780:\n" + " .word gUnknown_Debug_030043A8\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8011EA0() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffff4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x22\n" + " bls ._782 @cond_branch\n" + " b ._815\n" + "._782:\n" + " lsl r0, r7, #0x2\n" + " ldr r1, ._785\n" + " add r1, r0, r1\n" + " ldr r1, [r1]\n" + " str r0, [sp, #0x8]\n" + " mov pc, r1\n" + "._786:\n" + " .align 2, 0\n" + "._785:\n" + " .word ._784\n" + "._784:\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._812\n" + " .word ._817\n" + " .word ._814\n" + " .word ._815\n" + " .word ._816\n" + " .word ._817\n" + " .word ._848\n" + " .word ._848\n" + " .word ._848\n" + " .word ._848\n" + "._812:\n" + " mov r0, #0x0\n" + " mov r1, #0x14\n" + " bl debug_sub_8010A7C\n" + " ldr r6, ._823\n" + " ldr r2, ._823 + 4\n" + " ldr r0, [sp, #0x8]\n" + " add r1, r0, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r2\n" + " ldrh r0, [r0]\n" + " str r0, [sp, #0x4]\n" + " add r0, r2, #2\n" + " add r0, r1, r0\n" + " ldrb r0, [r0]\n" + " mov r8, r0\n" + " add r2, r2, #0x4\n" + " add r1, r1, r2\n" + " ldrb r1, [r1]\n" + " mov r9, r1\n" + " str r1, [sp]\n" + " ldr r0, ._823 + 8\n" + " add r1, r6, #0\n" + " ldr r2, [sp, #0x4]\n" + " mov r3, r8\n" + " bl InitWindow\n" + " ldr r0, ._823 + 8\n" + " bl sub_8002F44\n" + " ldr r1, ._823 + 12\n" + " mov sl, r1\n" + " lsl r4, r7, #0x1\n" + " ldr r5, ._823 + 16\n" + " ldrb r0, [r5]\n" + " mov r7, #0x46\n" + " mul r0, r0, r7\n" + " add r0, r4, r0\n" + " add r0, r0, sl\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " add r0, r6, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r2, #0xd3\n" + " lsl r2, r2, #0x1\n" + " ldrb r3, [r5]\n" + " lsl r3, r3, #0x5\n" + " add r3, r3, #0x19\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " ldr r0, ._823 + 8\n" + " add r1, r6, #0\n" + " bl InitWindow\n" + " ldr r0, ._823 + 8\n" + " bl sub_8002F44\n" + " mov r0, #0xff\n" + " strb r0, [r6]\n" + " ldrb r0, [r5]\n" + " mul r0, r0, r7\n" + " add r4, r4, r0\n" + " add r4, r4, sl\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " mov r0, #0xb\n" + " mul r1, r1, r0\n" + " ldr r0, ._823 + 20\n" + " add r1, r1, r0\n" + " add r0, r6, #0\n" + " bl StringAppend\n" + " mov r1, r9\n" + " str r1, [sp]\n" + " ldr r0, ._823 + 8\n" + " add r1, r6, #0\n" + " ldr r2, [sp, #0x4]\n" + " mov r3, r8\n" + " bl InitWindow\n" + " ldr r0, ._823 + 8\n" + " bl sub_8002F44\n" + " b ._848\n" + "._824:\n" + " .align 2, 0\n" + "._823:\n" + " .word gBattleTextBuff1\n" + " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_03004370\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_03004360\n" + " .word gSpeciesNames\n" + "._817:\n" + " ldr r6, ._826\n" + " ldr r3, ._826 + 4\n" + " lsl r1, r7, #0x1\n" + " ldr r0, ._826 + 8\n" + " ldrb r2, [r0]\n" + " mov r0, #0x46\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r3\n" + " mov r2, #0x0\n" + " ldsh r1, [r1, r2]\n" + " add r0, r6, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " b ._825\n" + "._827:\n" + " .align 2, 0\n" + "._826:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_03004360\n" + "._814:\n" + " mov r0, #0x0\n" + " mov r1, #0x18\n" + " bl debug_sub_8010A7C\n" + " ldr r6, ._830\n" + " ldr r1, ._830 + 4\n" + " mov sl, r1\n" + " ldr r4, ._830 + 8\n" + " ldr r2, [sp, #0x8]\n" + " add r1, r2, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r4\n" + " ldrh r2, [r0]\n" + " add r0, r4, #2\n" + " add r0, r1, r0\n" + " ldrb r3, [r0]\n" + " add r4, r4, #0x4\n" + " add r1, r1, r4\n" + " ldrb r0, [r1]\n" + " str r0, [sp]\n" + " add r0, r6, #0\n" + " mov r1, sl\n" + " bl InitWindow\n" + " add r0, r6, #0\n" + " bl sub_8002F44\n" + " lsl r4, r7, #0x1\n" + " ldr r5, ._830 + 12\n" + " ldrb r0, [r5]\n" + " mov r1, #0x46\n" + " mul r0, r0, r1\n" + " add r0, r4, r0\n" + " ldr r2, ._830 + 16\n" + " add r0, r0, r2\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " mov r0, sl\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r2, #0xd3\n" + " lsl r2, r2, #0x1\n" + " ldrb r3, [r5]\n" + " lsl r3, r3, #0x5\n" + " add r3, r3, #0x19\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " add r0, r6, #0\n" + " mov r1, sl\n" + " bl InitWindow\n" + " add r0, r6, #0\n" + " bl sub_8002F44\n" + " mov r0, #0xff\n" + " mov r1, sl\n" + " strb r0, [r1]\n" + " ldrb r0, [r5]\n" + " mov r2, #0x46\n" + " mul r0, r0, r2\n" + " add r4, r4, r0\n" + " ldr r0, ._830 + 16\n" + " add r4, r4, r0\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0\n" + " beq ._828 @cond_branch\n" + " ldrh r0, [r4]\n" + " bl ItemId_GetItem\n" + " add r1, r0, #0\n" + " mov r0, sl\n" + " bl StringAppend\n" + " b ._829\n" + "._831:\n" + " .align 2, 0\n" + "._830:\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_02023A14+0x52\n" + "._828:\n" + " ldr r1, ._833\n" + " mov r0, sl\n" + " bl StringAppend\n" + "._829:\n" + " ldr r6, ._833 + 4\n" + " ldr r1, ._833 + 8\n" + " ldr r5, ._833 + 12\n" + " ldr r2, [sp, #0x8]\n" + " add r4, r2, r7\n" + " lsl r4, r4, #0x1\n" + " add r0, r4, r5\n" + " ldrh r2, [r0]\n" + " add r0, r5, #2\n" + " add r0, r4, r0\n" + " ldrb r3, [r0]\n" + " add r5, r5, #0x4\n" + " add r4, r4, r5\n" + " ldrb r0, [r4]\n" + " str r0, [sp]\n" + " add r0, r6, #0\n" + " bl InitWindow\n" + " add r0, r6, #0\n" + " bl sub_8002F44\n" + " b ._848\n" + "._834:\n" + " .align 2, 0\n" + "._833:\n" + " .word UnkDebug0+0x26c\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word UnkDebug0+0x6c\n" + "._816:\n" + " mov r0, #0x0\n" + " mov r1, #0x4\n" + " bl debug_sub_8010A7C\n" + " ldr r5, ._839\n" + " ldr r6, ._839 + 4\n" + " ldr r4, ._839 + 8\n" + " ldr r0, [sp, #0x8]\n" + " add r1, r0, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r4\n" + " ldrh r2, [r0]\n" + " add r0, r4, #2\n" + " add r0, r1, r0\n" + " ldrb r3, [r0]\n" + " add r4, r4, #0x4\n" + " add r1, r1, r4\n" + " ldrb r0, [r1]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl InitWindow\n" + " add r0, r5, #0\n" + " bl sub_8002F44\n" + " mov r4, #0x0\n" + " ldr r3, ._839 + 12\n" + " lsl r1, r7, #0x1\n" + " ldr r0, ._839 + 16\n" + " ldrb r2, [r0]\n" + " mov r0, #0x46\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r3\n" + " mov r2, #0x0\n" + " ldsh r0, [r1, r2]\n" + " cmp r0, #0x1\n" + " beq ._835 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._836 @cond_branch\n" + " cmp r0, #0\n" + " beq ._837 @cond_branch\n" + " b ._843\n" + "._840:\n" + " .align 2, 0\n" + "._839:\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word UnkDebug0+0x6c\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_03004360\n" + "._836:\n" + " cmp r0, #0x2\n" + " beq ._841 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._842 @cond_branch\n" + " b ._843\n" + "._837:\n" + " mov r0, #0xb5\n" + " b ._844\n" + "._835:\n" + " mov r0, #0xb6\n" + "._844:\n" + " strb r0, [r6]\n" + " mov r4, #0x1\n" + " b ._847\n" + "._841:\n" + " mov r0, #0xb5\n" + " b ._846\n" + "._842:\n" + " mov r0, #0xb6\n" + "._846:\n" + " strb r0, [r6]\n" + " strb r0, [r6, #0x1]\n" + " mov r4, #0x2\n" + " b ._847\n" + "._843:\n" + " ldr r2, ._849\n" + " add r1, r4, r2\n" + " mov r0, #0xac\n" + " strb r0, [r1]\n" + " add r4, r4, #0x1\n" + " add r6, r2, #0\n" + "._847:\n" + " add r1, r4, r6\n" + " mov r0, #0xff\n" + " strb r0, [r1]\n" + "._825:\n" + " ldr r5, ._849 + 4\n" + " ldr r4, ._849 + 8\n" + " ldr r0, [sp, #0x8]\n" + " add r1, r0, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r4\n" + " ldrh r2, [r0]\n" + " add r0, r4, #2\n" + " add r0, r1, r0\n" + " ldrb r3, [r0]\n" + " add r4, r4, #0x4\n" + " add r1, r1, r4\n" + " ldrb r0, [r1]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl InitWindow\n" + " add r0, r5, #0\n" + " bl sub_8002F44\n" + " b ._848\n" + "._850:\n" + " .align 2, 0\n" + "._849:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_Debug_03004370\n" + " .word UnkDebug0+0x6c\n" + "._815:\n" + " ldr r6, ._851\n" + " ldr r3, ._851 + 4\n" + " lsl r1, r7, #0x1\n" + " ldr r0, ._851 + 8\n" + " ldrb r2, [r0]\n" + " mov r0, #0x46\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r3\n" + " mov r2, #0x0\n" + " ldsh r1, [r1, r2]\n" + " add r0, r6, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r5, ._851 + 12\n" + " ldr r4, ._851 + 16\n" + " lsl r1, r7, #0x2\n" + " add r1, r1, r7\n" + " lsl r1, r1, #0x1\n" + " add r0, r1, r4\n" + " ldrh r2, [r0]\n" + " add r0, r4, #2\n" + " add r0, r1, r0\n" + " ldrb r3, [r0]\n" + " add r4, r4, #0x4\n" + " add r1, r1, r4\n" + " ldrb r0, [r1]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl InitWindow\n" + " add r0, r5, #0\n" + " bl sub_8002F44\n" + "._848:\n" + " add sp, sp, #0xc\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._852:\n" + " .align 2, 0\n" + "._851:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_Debug_03004370\n" + " .word UnkDebug0+0x6c\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012294() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r2, ._854\n" + " ldr r0, ._854 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x1d\n" + " bhi ._853 @cond_branch\n" + " mov r0, #0x0\n" + " mov r1, #0x18\n" + " bl debug_sub_8010A7C\n" + " ldr r0, ._854 + 8\n" + " mov sl, r0\n" + " ldr r1, ._854 + 12\n" + " mov r9, r1\n" + " ldr r2, ._854 + 16\n" + " mov r8, r2\n" + " ldr r7, ._854 + 20\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x1\n" + " add r1, r0, r2\n" + " ldrh r2, [r1]\n" + " ldr r3, ._854 + 24\n" + " add r1, r0, r3\n" + " ldrb r3, [r1]\n" + " ldr r1, ._854 + 28\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r9\n" + " bl InitWindow\n" + " mov r0, sl\n" + " bl sub_8002F44\n" + " ldrb r4, [r7]\n" + " lsl r4, r4, #0x1\n" + " add r0, r5, #0\n" + " mov r1, #0x5\n" + " bl gScriptFuncs_End+0x4358\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x15\n" + " add r4, r4, r5\n" + " ldr r6, ._854 + 32\n" + " ldrb r1, [r6]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " add r4, r4, r0\n" + " ldr r2, ._854 + 36\n" + " add r4, r4, r2\n" + " mov r3, #0x0\n" + " ldsh r1, [r4, r3]\n" + " mov r0, r9\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r2, #0xd3\n" + " lsl r2, r2, #0x1\n" + " ldrb r3, [r6]\n" + " lsl r3, r3, #0x5\n" + " add r3, r3, #0x19\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r9\n" + " bl InitWindow\n" + " mov r0, sl\n" + " bl sub_8002F44\n" + " mov r0, #0xff\n" + " mov r1, r9\n" + " strb r0, [r1]\n" + " ldrb r1, [r7]\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r5\n" + " ldrb r2, [r6]\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r2, ._854 + 36\n" + " add r1, r1, r2\n" + " mov r3, #0x0\n" + " ldsh r1, [r1, r3]\n" + " mov r0, #0xd\n" + " mul r1, r1, r0\n" + " ldr r0, ._854 + 40\n" + " add r1, r1, r0\n" + " mov r0, r9\n" + " bl StringAppend\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x1\n" + " add r8, r8, r0\n" + " mov r1, r8\n" + " ldrh r2, [r1]\n" + " ldr r3, ._854 + 24\n" + " add r1, r0, r3\n" + " ldrb r3, [r1]\n" + " ldr r1, ._854 + 28\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r9\n" + " bl InitWindow\n" + " mov r0, sl\n" + " bl sub_8002F44\n" + "._853:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._855:\n" + " .align 2, 0\n" + "._854:\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word UnkDebug0+0x1ac\n" + " .word gUnknown_Debug_030043A8\n" + " .word UnkDebug0+0x1ae\n" + " .word UnkDebug0+0x1b0\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_02023A14+0xde\n" + " .word gMoveNames\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80123D8() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x1d\n" + " bhi ._856 @cond_branch\n" + " mov r0, #0x0\n" + " mov r1, #0x12\n" + " bl debug_sub_8010A7C\n" + " ldr r4, ._858\n" + " ldr r0, ._858 + 4\n" + " mov r8, r0\n" + " ldr r6, ._858 + 8\n" + " ldrh r1, [r6]\n" + " mov sl, r1\n" + " ldrb r7, [r6, #0x2]\n" + " ldrb r2, [r6, #0x4]\n" + " mov r9, r2\n" + " str r2, [sp]\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " mov r2, sl\n" + " add r3, r7, #0\n" + " bl InitWindow\n" + " add r0, r4, #0\n" + " bl sub_8002F44\n" + " lsl r5, r5, #0x1\n" + " ldr r1, ._858 + 12\n" + " ldrb r0, [r1]\n" + " mov r2, #0x46\n" + " mul r0, r0, r2\n" + " add r0, r5, r0\n" + " ldr r1, ._858 + 16\n" + " add r0, r0, r1\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " lsl r0, r1, #0x3\n" + " sub r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._858 + 20\n" + " add r0, r0, r1\n" + " ldrb r0, [r0, #0x16]\n" + " mov r2, #0xd\n" + " add r1, r0, #0\n" + " mul r1, r1, r2\n" + " ldr r0, ._858 + 24\n" + " add r1, r1, r0\n" + " mov r0, r8\n" + " bl StringCopy\n" + " mov r1, r9\n" + " str r1, [sp]\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " mov r2, sl\n" + " add r3, r7, #0\n" + " bl InitWindow\n" + " add r0, r4, #0\n" + " bl sub_8002F44\n" + " mov r0, #0x0\n" + " mov r1, #0x12\n" + " bl debug_sub_8010A7C\n" + " ldrh r2, [r6, #0x6]\n" + " mov r9, r2\n" + " ldrb r0, [r6, #0x8]\n" + " mov sl, r0\n" + " ldrb r6, [r6, #0xa]\n" + " str r6, [sp]\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " mov r3, sl\n" + " bl InitWindow\n" + " add r0, r4, #0\n" + " bl sub_8002F44\n" + " ldr r1, ._858 + 12\n" + " ldrb r0, [r1]\n" + " mov r2, #0x46\n" + " mul r0, r0, r2\n" + " add r5, r5, r0\n" + " ldr r0, ._858 + 16\n" + " add r5, r5, r0\n" + " mov r2, #0x0\n" + " ldsh r1, [r5, r2]\n" + " lsl r0, r1, #0x3\n" + " sub r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._858 + 20\n" + " add r0, r0, r1\n" + " ldrb r0, [r0, #0x17]\n" + " mov r2, #0xd\n" + " add r1, r0, #0\n" + " mul r1, r1, r2\n" + " ldr r0, ._858 + 24\n" + " add r1, r1, r0\n" + " mov r0, r8\n" + " bl StringCopy\n" + " str r6, [sp]\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " mov r2, r9\n" + " mov r3, sl\n" + " bl InitWindow\n" + " add r0, r4, #0\n" + " bl sub_8002F44\n" + " b ._857\n" + "._859:\n" + " .align 2, 0\n" + "._858:\n" + " .word gUnknown_Debug_03004370\n" + " .word gBattleTextBuff1\n" + " .word UnkDebug0+0x1d4\n" + " .word gUnknown_Debug_03004360\n" + " .word gUnknown_02023A14+0x52\n" + " .word gBaseStats\n" + " .word gAbilityNames\n" + "._856:\n" + " ldr r6, ._860\n" + " ldr r1, ._860 + 4\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " ldr r5, ._860 + 8\n" + " ldr r4, ._860 + 12\n" + " ldrh r2, [r4]\n" + " ldrb r3, [r4, #0x2]\n" + " ldrb r0, [r4, #0x4]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl InitWindow\n" + " add r0, r5, #0\n" + " bl sub_8002F44\n" + " ldrh r2, [r4, #0x6]\n" + " ldrb r3, [r4, #0x8]\n" + " ldrb r0, [r4, #0xa]\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl InitWindow\n" + " add r0, r5, #0\n" + " bl sub_8002F44\n" + "._857:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._861:\n" + " .align 2, 0\n" + "._860:\n" + " .word gBattleTextBuff1\n" + " .word gAbilityNames\n" + " .word gUnknown_Debug_03004370\n" + " .word UnkDebug0+0x1d4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012540() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r5, ._862\n" + " ldr r0, ._862 + 4\n" + " add r0, r0, #0x44\n" + " mov r2, #0x0\n" + " ldsh r1, [r0, r2]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r4, ._862 + 8\n" + " ldr r1, ._862 + 12\n" + " mov r3, #0x9b\n" + " lsl r3, r3, #0x1\n" + " add r0, r1, r3\n" + " ldrh r2, [r0]\n" + " mov r6, #0x9c\n" + " lsl r6, r6, #0x1\n" + " add r0, r1, r6\n" + " ldrb r3, [r0]\n" + " add r6, r6, #0x2\n" + " add r0, r1, r6\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " bl InitWindow\n" + " add r0, r4, #0\n" + " bl sub_8002F44\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._863:\n" + " .align 2, 0\n" + "._862:\n" + " .word gBattleTextBuff1\n" + " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_03004370\n" + " .word UnkDebug0+0x6c\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_nullsub_3() +{ + asm( + " bx lr\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80125A0() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._864\n" + " ldr r3, ._864 + 4\n" + " ldr r2, ._864 + 8\n" + " ldr r0, ._864 + 12\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._864 + 16\n" + " ldrb r2, [r1]\n" + " mov r1, #0x8c\n" + " mul r1, r1, r2\n" + " add r0, r0, r1\n" + " add r0, r0, r3\n" + " ldr r0, [r0]\n" + " add r0, r0, r4\n" + " mov r1, #0x6d\n" + " strb r1, [r0]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._865:\n" + " .align 2, 0\n" + "._864:\n" + " .word +0x2000000\n" + " .word UnkDebug0+0x2c8\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004360\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80125E4() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._866\n" + " ldr r3, ._866 + 4\n" + " ldr r2, ._866 + 8\n" + " ldr r0, ._866 + 12\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._866 + 16\n" + " ldrb r2, [r1]\n" + " mov r1, #0x8c\n" + " mul r1, r1, r2\n" + " add r0, r0, r1\n" + " add r0, r0, r3\n" + " ldr r0, [r0]\n" + " add r0, r0, r4\n" + " mov r1, #0x81\n" + " strb r1, [r0]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._867:\n" + " .align 2, 0\n" + "._866:\n" + " .word +0x2000000\n" + " .word UnkDebug0+0x2c8\n" + " .word gUnknown_Debug_030043A0\n" + " .word gUnknown_Debug_030043A4\n" + " .word gUnknown_Debug_03004360\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012628() +{ + asm( + " ldr r3, ._868\n" + " ldr r2, ._868 + 4\n" + " ldr r0, ._868 + 8\n" + " ldrb r1, [r0]\n" + " lsl r1, r1, #0x2\n" + " ldr r0, ._868 + 12\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x4\n" + " add r1, r1, r0\n" + " add r1, r1, r2\n" + " ldr r0, [r1]\n" + " add r0, r0, r3\n" + " mov r1, #0x6d\n" + " strb r1, [r0]\n" + " bx lr\n" + "._869:\n" + " .align 2, 0\n" + "._868:\n" + " .word +0x2000000\n" + " .word UnkDebug0+0x3e0\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_Debug_03004360\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012658() +{ + asm( + " ldr r3, ._870\n" + " ldr r2, ._870 + 4\n" + " ldr r0, ._870 + 8\n" + " ldrb r1, [r0]\n" + " lsl r1, r1, #0x2\n" + " ldr r0, ._870 + 12\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x4\n" + " add r1, r1, r0\n" + " add r1, r1, r2\n" + " ldr r0, [r1]\n" + " add r0, r0, r3\n" + " mov r1, #0x81\n" + " strb r1, [r0]\n" + " bx lr\n" + "._871:\n" + " .align 2, 0\n" + "._870:\n" + " .word +0x2000000\n" + " .word UnkDebug0+0x3e0\n" + " .word gUnknown_Debug_030043A8\n" + " .word gUnknown_Debug_03004360\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012688() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add sp, sp, #0xfffffff4\n" + " mov r1, #0x0\n" + " mov r4, #0xcd\n" + " lsl r4, r4, #0x1\n" + " ldr r3, ._873\n" + " mov r2, #0x0\n" + "._872:\n" + " add r0, r1, r3\n" + " strb r2, [r0]\n" + " add r1, r1, #0x1\n" + " cmp r1, r4\n" + " ble ._872 @cond_branch\n" + " mov r0, #0x0\n" + " bl SetHBlankCallback\n" + " mov r0, #0x0\n" + " bl SetVBlankCallback\n" + " mov r5, #0x0\n" + " str r5, [sp, #0x8]\n" + " ldr r1, ._873 + 4\n" + " add r0, sp, #0x8\n" + " str r0, [r1]\n" + " mov r0, #0xc0\n" + " lsl r0, r0, #0x13\n" + " str r0, [r1, #0x4]\n" + " ldr r0, ._873 + 8\n" + " str r0, [r1, #0x8]\n" + " ldr r0, [r1, #0x8]\n" + " ldr r0, ._873 + 12\n" + " strh r5, [r0]\n" + " sub r0, r0, #0xc\n" + " strh r5, [r0]\n" + " add r0, r0, #0x4\n" + " strh r5, [r0]\n" + " sub r0, r0, #0x2\n" + " strh r5, [r0]\n" + " add r0, r0, #0x4\n" + " strh r5, [r0]\n" + " add r0, r0, #0x2\n" + " strh r5, [r0]\n" + " add r0, r0, #0x2\n" + " strh r5, [r0]\n" + " ldr r4, ._873 + 16\n" + " add r0, r4, #0\n" + " bl SetUpWindowConfig\n" + " bl ResetPaletteFade\n" + " ldr r0, ._873 + 20\n" + " strh r5, [r0]\n" + " ldr r1, ._873 + 24\n" + " mov r0, #0xa0\n" + " strh r0, [r1]\n" + " ldr r0, ._873 + 28\n" + " strh r5, [r0]\n" + " ldr r0, ._873 + 32\n" + " strh r5, [r0]\n" + " ldr r0, ._873 + 36\n" + " strh r5, [r0]\n" + " ldr r0, ._873 + 40\n" + " strh r5, [r0]\n" + " ldr r0, ._873 + 44\n" + " strh r5, [r0]\n" + " ldr r0, ._873 + 48\n" + " strh r5, [r0]\n" + " ldr r1, ._873 + 52\n" + " mov r0, #0x9\n" + " strb r0, [r1]\n" + " bl sub_800D6D4\n" + " bl sub_800DAB8\n" + " bl ResetSpriteData\n" + " bl ResetTasks\n" + " bl FreeAllSpritePalettes\n" + " ldr r1, ._873 + 56\n" + " mov r0, #0x4\n" + " strb r0, [r1]\n" + " ldr r6, ._873 + 60\n" + " mov r0, #0x1\n" + " strh r0, [r6]\n" + " ldr r0, ._873 + 64\n" + " add r1, r4, #0\n" + " bl InitWindowFromConfig\n" + " ldrh r2, [r6]\n" + " lsl r0, r2, #0x3\n" + " ldr r1, ._873 + 68\n" + " add r0, r0, r1\n" + " ldr r1, ._873 + 72\n" + " mov r8, r1\n" + " lsl r2, r2, #0x2\n" + " add r2, r2, r8\n" + " ldrb r1, [r2]\n" + " ldrb r2, [r2, #0x1]\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x12\n" + " ldr r4, ._873 + 76\n" + " ldr r4, [r4, #0x4]\n" + " str r4, [sp]\n" + " ldrh r4, [r6]\n" + " str r4, [sp, #0x4]\n" + " bl DecompressPicFromTable_2\n" + " ldr r1, ._873 + 80\n" + " ldrh r0, [r6]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0x88\n" + " lsl r1, r1, #0x1\n" + " mov r2, #0x20\n" + " bl LoadCompressedPalette\n" + " ldrh r0, [r6]\n" + " mov r1, #0x1\n" + " bl GetMonSpriteTemplate_803C56C\n" + " ldr r0, ._873 + 84\n" + " ldrh r1, [r6]\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r8\n" + " ldrb r2, [r1, #0x1]\n" + " add r2, r2, #0x28\n" + " mov r1, #0xb0\n" + " mov r3, #0x28\n" + " bl CreateSprite\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r3, ._873 + 88\n" + " lsl r1, r4, #0x4\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x2\n" + " add r0, r3, #0\n" + " add r0, r0, #0x1c\n" + " add r0, r1, r0\n" + " ldr r2, ._873 + 92\n" + " str r2, [r0]\n" + " add r1, r1, r3\n" + " ldrb r2, [r1, #0x5]\n" + " mov r0, #0xf\n" + " and r0, r0, r2\n" + " mov r2, #0x10\n" + " orr r0, r0, r2\n" + " strb r0, [r1, #0x5]\n" + " mov r1, #0x80\n" + " lsl r1, r1, #0x13\n" + " mov r2, #0xfa\n" + " lsl r2, r2, #0x5\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r0, ._873 + 96\n" + " bl SetHBlankCallback\n" + " ldr r0, ._873 + 100\n" + " bl SetVBlankCallback\n" + " bl gScriptFuncs_End+0x14f4\n" + " ldr r0, ._873 + 104\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._873 + 108\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " strh r5, [r1, #0x8]\n" + " strh r4, [r1, #0xa]\n" + " ldr r0, ._873 + 112\n" + " bl SetMainCallback2\n" + " add sp, sp, #0xc\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._874:\n" + " .align 2, 0\n" + "._873:\n" + " .word gUnknown_02023A14+0x13e\n" + " .word 0x40000d4\n" + " .word 0x85006000\n" + " .word 0x400004c\n" + " .word gWindowConfig_81E6C58\n" + " .word gUnknown_030042A4\n" + " .word gUnknown_030042A0\n" + " .word gUnknown_030042C0\n" + " .word gUnknown_030041B4\n" + " .word gUnknown_03004288\n" + " .word gUnknown_03004280\n" + " .word gUnknown_030041B0\n" + " .word gUnknown_030041B8\n" + " .word gBattleTerrain\n" + " .word gReservedSpritePaletteCount\n" + " .word gCurrentMove\n" + " .word gUnknown_03004210\n" + " .word gMonFrontPicTable\n" + " .word gMonFrontPicCoords\n" + " .word gUnknown_081FAF4C\n" + " .word gMonPaletteTable\n" + " .word gUnknown_02024E8C\n" + " .word gSprites\n" + " .word nullsub_37+1\n" + " .word debug_nullsub_45+1\n" + " .word debug_sub_8011DD4+1\n" + " .word debug_sub_8012D10+1\n" + " .word gTasks\n" + " .word debug_sub_8012878+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012878() +{ + asm( + " push {lr}\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " ldr r0, ._876\n" + " bl sub_800374C\n" + " bl UpdatePaletteFade\n" + " bl RunTasks\n" + " ldr r0, ._876 + 4\n" + " ldrh r1, [r0, #0x2c]\n" + " mov r0, #0x82\n" + " lsl r0, r0, #0x1\n" + " cmp r1, r0\n" + " bne ._875 @cond_branch\n" + " ldr r0, ._876 + 8\n" + " bl SetMainCallback2\n" + "._875:\n" + " pop {r0}\n" + " bx r0\n" + "._877:\n" + " .align 2, 0\n" + "._876:\n" + " .word gUnknown_03004210\n" + " .word gMain\n" + " .word debug_sub_80108B8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80128B4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x0\n" + " mov r1, #0x9\n" + " bl debug_sub_8010A7C\n" + " ldr r5, ._878\n" + " ldr r4, ._878 + 4\n" + " mov r0, #0x23\n" + " mov r8, r0\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " mov r2, #0x90\n" + " mov r3, #0x2\n" + " bl InitWindow\n" + " add r0, r5, #0\n" + " bl sub_8002F44\n" + " ldr r6, ._878 + 8\n" + " ldrh r1, [r6]\n" + " add r0, r4, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0x0\n" + " strb r0, [r4, #0x3]\n" + " mov r0, #0xff\n" + " strb r0, [r4, #0x4]\n" + " ldrh r1, [r6]\n" + " mov r0, #0xb\n" + " mul r1, r1, r0\n" + " ldr r0, ._878 + 12\n" + " add r1, r1, r0\n" + " add r0, r4, #0\n" + " bl StringAppend\n" + " mov r0, r8\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " mov r2, #0x90\n" + " mov r3, #0x2\n" + " bl InitWindow\n" + " add r0, r5, #0\n" + " bl sub_8002F44\n" + " add sp, sp, #0x4\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._879:\n" + " .align 2, 0\n" + "._878:\n" + " .word gUnknown_03004210\n" + " .word gBattleTextBuff1\n" + " .word gCurrentMove\n" + " .word gSpeciesNames\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012938() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, sl\n" + " mov r5, r9\n" + " mov r4, r8\n" + " push {r4, r5, r6}\n" + " add sp, sp, #0xfffffffc\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " mov r0, #0x0\n" + " mov r1, #0x7\n" + " bl debug_sub_8010A7C\n" + " ldr r6, ._880\n" + " ldr r4, ._880 + 4\n" + " mov r0, #0x25\n" + " mov r8, r0\n" + " str r0, [sp]\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " mov r2, #0xa2\n" + " mov r3, #0x2\n" + " bl InitWindow\n" + " add r0, r6, #0\n" + " bl sub_8002F44\n" + " ldr r1, ._880 + 8\n" + " add r0, r4, #0\n" + " bl StringCopy\n" + " add r0, r4, #4\n" + " ldr r1, ._880 + 12\n" + " mov sl, r1\n" + " ldr r2, ._880 + 16\n" + " mov r9, r2\n" + " ldrh r1, [r2]\n" + " sub r1, r1, #0x1\n" + " add r1, r1, sl\n" + " ldrb r1, [r1]\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, r8\n" + " str r0, [sp]\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " mov r2, #0xa2\n" + " mov r3, #0x2\n" + " bl InitWindow\n" + " add r0, r6, #0\n" + " bl sub_8002F44\n" + " ldr r2, ._880 + 20\n" + " ldr r1, ._880 + 24\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0xa\n" + " ldsh r0, [r0, r1]\n" + " lsl r1, r0, #0x4\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r2\n" + " mov r2, r9\n" + " ldrh r0, [r2]\n" + " sub r0, r0, #0x1\n" + " add r0, r0, sl\n" + " ldrb r0, [r0]\n" + " neg r0, r0\n" + " strh r0, [r1, #0x26]\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._881:\n" + " .align 2, 0\n" + "._880:\n" + " .word gUnknown_03004210\n" + " .word gBattleTextBuff1\n" + " .word UnkDebug0+0x400\n" + " .word gUnknown_02023A14+0x13e\n" + " .word gCurrentMove\n" + " .word gSprites\n" + " .word gTasks\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80129F8() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add sp, sp, #0xfffffff8\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " ldr r6, ._882\n" + " ldrh r2, [r6]\n" + " lsl r0, r2, #0x3\n" + " ldr r1, ._882 + 4\n" + " add r0, r0, r1\n" + " ldr r1, ._882 + 8\n" + " mov r8, r1\n" + " lsl r2, r2, #0x2\n" + " add r2, r2, r8\n" + " ldrb r1, [r2]\n" + " ldrb r2, [r2, #0x1]\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x12\n" + " ldr r4, ._882 + 12\n" + " ldr r4, [r4, #0x4]\n" + " str r4, [sp]\n" + " ldrh r4, [r6]\n" + " str r4, [sp, #0x4]\n" + " bl DecompressPicFromTable_2\n" + " ldr r1, ._882 + 16\n" + " ldrh r0, [r6]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0x88\n" + " lsl r1, r1, #0x1\n" + " mov r2, #0x20\n" + " bl LoadCompressedPalette\n" + " ldr r4, ._882 + 20\n" + " ldr r0, ._882 + 24\n" + " lsl r2, r5, #0x2\n" + " add r2, r2, r5\n" + " lsl r2, r2, #0x3\n" + " add r2, r2, r0\n" + " mov r1, #0xa\n" + " ldsh r0, [r2, r1]\n" + " lsl r1, r0, #0x4\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r4\n" + " ldrh r0, [r6]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r8\n" + " ldrb r0, [r0, #0x1]\n" + " add r0, r0, #0x28\n" + " strh r0, [r1, #0x22]\n" + " mov r1, #0xa\n" + " ldsh r0, [r2, r1]\n" + " lsl r1, r0, #0x4\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r4\n" + " ldr r3, ._882 + 28\n" + " ldrh r0, [r6]\n" + " sub r0, r0, #0x1\n" + " add r0, r0, r3\n" + " ldrb r0, [r0]\n" + " neg r0, r0\n" + " strh r0, [r1, #0x26]\n" + " mov r0, #0xa\n" + " ldsh r1, [r2, r0]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r4\n" + " mov r1, #0x0\n" + " bl StartSpriteAnim\n" + " add sp, sp, #0x8\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._883:\n" + " .align 2, 0\n" + "._882:\n" + " .word gCurrentMove\n" + " .word gMonFrontPicTable\n" + " .word gMonFrontPicCoords\n" + " .word gUnknown_081FAF4C\n" + " .word gMonPaletteTable\n" + " .word gSprites\n" + " .word gTasks\n" + " .word gUnknown_02023A14+0x13e\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012AC0() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r6, r1, #0x18\n" + " ldr r3, ._885\n" + " ldr r4, ._885 + 4\n" + " b ._884\n" + "._886:\n" + " .align 2, 0\n" + "._885:\n" + " .word gCurrentMove\n" + " .word gBaseStats\n" + "._890:\n" + " ldrb r0, [r1, #0x7]\n" + " cmp r0, #0x2\n" + " beq ._887 @cond_branch\n" + "._884:\n" + " add r2, r3, #0\n" + " lsl r0, r5, #0x18\n" + " asr r0, r0, #0x18\n" + " ldrh r1, [r2]\n" + " add r0, r0, r1\n" + " strh r0, [r2]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " bne ._888 @cond_branch\n" + " ldr r1, ._891\n" + " add r0, r1, #0\n" + " strh r0, [r2]\n" + "._888:\n" + " ldrh r1, [r2]\n" + " ldr r0, ._891\n" + " cmp r1, r0\n" + " bne ._889 @cond_branch\n" + " mov r0, #0x1\n" + " strh r0, [r2]\n" + "._889:\n" + " ldrh r0, [r3]\n" + " lsl r1, r0, #0x3\n" + " sub r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r4\n" + " ldrb r0, [r1, #0x6]\n" + " cmp r0, #0x2\n" + " bne ._890 @cond_branch\n" + "._887:\n" + " bl debug_sub_80128B4\n" + " add r0, r6, #0\n" + " bl debug_sub_8012938\n" + " add r0, r6, #0\n" + " bl debug_sub_80129F8\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._892:\n" + " .align 2, 0\n" + "._891:\n" + " .word 0x19b\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012B2C() +{ + asm( + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x11\n" + " ldr r1, ._893\n" + " add r2, r0, r1\n" + " mov r1, #0x1\n" + " strh r1, [r2]\n" + " ldr r1, ._893 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0x2\n" + " strh r1, [r0]\n" + " bx lr\n" + "._894:\n" + " .align 2, 0\n" + "._893:\n" + " .word 0x600c772\n" + " .word 0x600c7b2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012B4C() +{ + asm( + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x11\n" + " ldr r2, ._895\n" + " add r1, r0, r2\n" + " ldr r3, ._895 + 4\n" + " add r2, r3, #0\n" + " strh r2, [r1]\n" + " ldr r1, ._895 + 8\n" + " add r0, r0, r1\n" + " strh r2, [r0]\n" + " bx lr\n" + "._896:\n" + " .align 2, 0\n" + "._895:\n" + " .word 0x600c772\n" + " .word 0x1016\n" + " .word 0x600c7b2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012B70() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r6, r1, #0x18\n" + " cmp r6, #0\n" + " beq ._897 @cond_branch\n" + " mov r4, #0x1\n" + " str r4, [sp]\n" + " mov r0, #0x18\n" + " mov r1, #0x1c\n" + " mov r2, #0x1d\n" + " mov r3, #0x21\n" + " bl sub_802BBD4\n" + " bl debug_sub_80128B4\n" + " add r0, r5, #0\n" + " bl debug_sub_8012938\n" + " add r0, r5, #0\n" + " bl debug_sub_80129F8\n" + " ldr r1, ._899\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " strh r4, [r0, #0x8]\n" + " b ._898\n" + "._900:\n" + " .align 2, 0\n" + "._899:\n" + " .word gTasks\n" + "._897:\n" + " str r6, [sp]\n" + " mov r0, #0x18\n" + " mov r1, #0x1c\n" + " mov r2, #0x1d\n" + " mov r3, #0x21\n" + " bl sub_802BBD4\n" + " ldr r0, ._901\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " mov r0, #0x2\n" + " strh r0, [r4, #0x8]\n" + " ldr r5, ._901 + 4\n" + " ldr r1, ._901 + 8\n" + " mov r2, #0xa4\n" + " lsl r2, r2, #0x2\n" + " mov r0, #0x1d\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " mov r3, #0x1a\n" + " bl InitWindow\n" + " add r0, r5, #0\n" + " bl sub_8002F44\n" + " strh r6, [r4, #0xe]\n" + " mov r0, #0x0\n" + " bl debug_sub_8012B2C\n" + "._898:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._902:\n" + " .align 2, 0\n" + "._901:\n" + " .word gTasks\n" + " .word gUnknown_03004210\n" + " .word UnkDebug0+0x422\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012C08() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r1, #0\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " mov r0, #0x0\n" + " mov r1, #0x9\n" + " bl debug_sub_8010A7C\n" + " ldr r7, ._905\n" + " ldr r5, ._905 + 4\n" + " mov r0, #0x23\n" + " mov r8, r0\n" + " str r0, [sp]\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " mov r2, #0x90\n" + " mov r3, #0x2\n" + " bl InitWindow\n" + " add r0, r7, #0\n" + " bl sub_8002F44\n" + " mov r0, #0x0\n" + " mov r1, #0x7\n" + " bl debug_sub_8010A7C\n" + " mov r0, #0x25\n" + " str r0, [sp]\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " mov r2, #0xa2\n" + " mov r3, #0x2\n" + " bl InitWindow\n" + " add r0, r7, #0\n" + " bl sub_8002F44\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x18\n" + " mov r1, #0x1c\n" + " mov r2, #0x1d\n" + " mov r3, #0x21\n" + " bl sub_802BBD4\n" + " cmp r4, #0\n" + " beq ._903 @cond_branch\n" + " ldr r1, ._905 + 8\n" + " lsl r4, r6, #0x2\n" + " add r0, r4, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0x4\n" + " strh r1, [r0, #0x8]\n" + " ldr r1, ._905 + 12\n" + " mov r0, r8\n" + " str r0, [sp]\n" + " add r0, r7, #0\n" + " mov r2, #0x90\n" + " mov r3, #0x2\n" + " bl InitWindow\n" + " b ._904\n" + "._906:\n" + " .align 2, 0\n" + "._905:\n" + " .word gUnknown_03004210\n" + " .word gBattleTextBuff1\n" + " .word gTasks\n" + " .word gUnknown_Debug_821F7F3\n" + "._903:\n" + " ldr r1, ._907\n" + " lsl r4, r6, #0x2\n" + " add r0, r4, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0x3\n" + " strh r1, [r0, #0x8]\n" + " ldr r1, ._907 + 4\n" + " mov r0, r8\n" + " str r0, [sp]\n" + " add r0, r7, #0\n" + " mov r2, #0x90\n" + " mov r3, #0x2\n" + " bl InitWindow\n" + "._904:\n" + " add r5, r4, #0\n" + " ldr r4, ._907 + 8\n" + " add r0, r4, #0\n" + " bl sub_8002F44\n" + " ldr r1, ._907 + 12\n" + " mov r2, #0xa4\n" + " lsl r2, r2, #0x2\n" + " mov r0, #0x1d\n" + " str r0, [sp]\n" + " add r0, r4, #0\n" + " mov r3, #0x1a\n" + " bl InitWindow\n" + " add r0, r4, #0\n" + " bl sub_8002F44\n" + " ldr r1, ._907\n" + " add r0, r5, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0x1\n" + " strh r1, [r0, #0xe]\n" + " mov r0, #0x1\n" + " bl debug_sub_8012B2C\n" + " add sp, sp, #0x4\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._908:\n" + " .align 2, 0\n" + "._907:\n" + " .word gTasks\n" + " .word UnkDebug0+0x432\n" + " .word gUnknown_03004210\n" + " .word gUnknown_08400D7A\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8012D10() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._911\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0x8\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x4\n" + " bls ._909 @cond_branch\n" + " b ._1067\n" + "._909:\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._911 + 4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._912:\n" + " .align 2, 0\n" + "._911:\n" + " .word gTasks\n" + " .word ._913\n" + "._913:\n" + " .word ._914\n" + " .word ._915\n" + " .word ._916\n" + " .word ._917\n" + " .word ._918\n" + "._914:\n" + " bl debug_sub_80128B4\n" + " add r0, r5, #0\n" + " bl debug_sub_8012938\n" + " ldr r4, ._920\n" + " ldr r1, ._920 + 4\n" + " mov r2, #0xc8\n" + " lsl r2, r2, #0x1\n" + " mov r0, #0x23\n" + " str r0, [sp]\n" + " add r0, r4, #0\n" + " mov r3, #0x13\n" + " bl InitWindow\n" + " add r0, r4, #0\n" + " bl sub_8002F44\n" + " ldr r1, ._920 + 8\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrh r1, [r0, #0x8]\n" + " add r1, r1, #0x1\n" + " strh r1, [r0, #0x8]\n" + " ldrb r0, [r0, #0xc]\n" + " b ._919\n" + "._921:\n" + " .align 2, 0\n" + "._920:\n" + " .word gUnknown_03004210\n" + " .word UnkDebug0+0x405\n" + " .word gTasks\n" + "._915:\n" + " ldr r2, ._924\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._922 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._924 + 4\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " ldrb r0, [r4, #0xc]\n" + " bl nullsub_8\n" + " ldrh r1, [r4, #0xc]\n" + " mov r0, #0x3\n" + " neg r0, r0\n" + " and r0, r0, r1\n" + " b ._931\n" + "._925:\n" + " .align 2, 0\n" + "._924:\n" + " .word gMain\n" + " .word gTasks\n" + "._922:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._926 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._928\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " ldrb r0, [r4, #0xc]\n" + " bl nullsub_8\n" + " ldrh r1, [r4, #0xc]\n" + " mov r0, #0x2\n" + " b ._927\n" + "._929:\n" + " .align 2, 0\n" + "._928:\n" + " .word gTasks\n" + "._926:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._930 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._932\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " ldrb r0, [r4, #0xc]\n" + " bl nullsub_8\n" + " ldrh r1, [r4, #0xc]\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " and r0, r0, r1\n" + " b ._931\n" + "._933:\n" + " .align 2, 0\n" + "._932:\n" + " .word gTasks\n" + "._930:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._934 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._936\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " ldrb r0, [r4, #0xc]\n" + " bl nullsub_8\n" + " ldrh r1, [r4, #0xc]\n" + " mov r0, #0x1\n" + "._927:\n" + " orr r0, r0, r1\n" + "._931:\n" + " strh r0, [r4, #0xc]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + "._919:\n" + " mov r1, #0x0\n" + " bl sub_802E3E4\n" + " b ._1067\n" + "._937:\n" + " .align 2, 0\n" + "._936:\n" + " .word gTasks\n" + "._934:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r4, #0x1\n" + " add r0, r4, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._938 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._943\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r2, #0xc\n" + " ldsh r0, [r0, r2]\n" + " cmp r0, #0x1\n" + " beq ._939 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._940 @cond_branch\n" + " cmp r0, #0\n" + " beq ._941 @cond_branch\n" + " b ._1067\n" + "._944:\n" + " .align 2, 0\n" + "._943:\n" + " .word gTasks\n" + "._940:\n" + " cmp r0, #0x2\n" + " beq ._945 @cond_branch\n" + "._990:\n" + " cmp r0, #0x3\n" + " bne ._946 @cond_branch\n" + " b ._1014\n" + "._946:\n" + " b ._1067\n" + "._941:\n" + " ldr r1, ._952\n" + " ldr r0, ._952 + 4\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x1\n" + " add r1, r0, r1\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x3f\n" + " bls ._949 @cond_branch\n" + " b ._1067\n" + "._949:\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._1019\n" + "._953:\n" + " .align 2, 0\n" + "._952:\n" + " .word gUnknown_02023A14+0x13e\n" + " .word gCurrentMove\n" + "._939:\n" + " mov r0, #0x1\n" + " b ._997\n" + "._945:\n" + " ldr r1, ._957\n" + " ldrh r2, [r1]\n" + " mov r0, #0xcd\n" + " lsl r0, r0, #0x1\n" + " cmp r2, r0\n" + " bhi ._955 @cond_branch\n" + " add r0, r2, #1\n" + "._979:\n" + " strh r0, [r1]\n" + " b ._1025\n" + "._958:\n" + " .align 2, 0\n" + "._957:\n" + " .word gCurrentMove\n" + "._955:\n" + " strh r4, [r1]\n" + " b ._1025\n" + "._938:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._960 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._966\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0xc\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x1\n" + " bne ._961 @cond_branch\n" + " b ._1007\n" + "._961:\n" + " cmp r0, #0x1\n" + " bgt ._963 @cond_branch\n" + " cmp r0, #0\n" + " beq ._964 @cond_branch\n" + " b ._1067\n" + "._967:\n" + " .align 2, 0\n" + "._966:\n" + " .word gTasks\n" + "._963:\n" + " cmp r0, #0x2\n" + " beq ._968 @cond_branch\n" + " b ._990\n" + "._964:\n" + " ldr r1, ._973\n" + " ldr r0, ._973 + 4\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x1\n" + " add r1, r0, r1\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._970 @cond_branch\n" + " b ._1067\n" + "._970:\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._1019\n" + "._974:\n" + " .align 2, 0\n" + "._973:\n" + " .word gUnknown_02023A14+0x13e\n" + " .word gCurrentMove\n" + "._968:\n" + " ldr r1, ._977\n" + " ldrh r0, [r1]\n" + " cmp r0, #0x1\n" + " bls ._975 @cond_branch\n" + " sub r0, r0, #0x1\n" + " b ._979\n" + "._978:\n" + " .align 2, 0\n" + "._977:\n" + " .word gCurrentMove\n" + "._975:\n" + " ldr r2, ._980\n" + " add r0, r2, #0\n" + " b ._979\n" + "._981:\n" + " .align 2, 0\n" + "._980:\n" + " .word 0x19b\n" + "._960:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._982 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._987\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0xc\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x1\n" + " beq ._983 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._984 @cond_branch\n" + " cmp r0, #0\n" + " beq ._985 @cond_branch\n" + " b ._1067\n" + "._988:\n" + " .align 2, 0\n" + "._987:\n" + " .word gTasks\n" + "._984:\n" + " cmp r0, #0x2\n" + " beq ._989 @cond_branch\n" + " b ._990\n" + "._985:\n" + " ldr r3, ._995\n" + " ldr r2, ._995 + 4\n" + " ldrh r0, [r2]\n" + " sub r0, r0, #0x1\n" + " add r1, r0, r3\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x3f\n" + " bls ._991 @cond_branch\n" + " b ._1067\n" + "._991:\n" + " add r0, r0, #0x8\n" + " strb r0, [r1]\n" + " ldrh r0, [r2]\n" + " sub r0, r0, #0x1\n" + " add r1, r0, r3\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x40\n" + " bls ._1019 @cond_branch\n" + " mov r0, #0x40\n" + " strb r0, [r1]\n" + " b ._1019\n" + "._996:\n" + " .align 2, 0\n" + "._995:\n" + " .word gUnknown_02023A14+0x13e\n" + " .word gCurrentMove\n" + "._983:\n" + " mov r0, #0x1\n" + " b ._997\n" + "._989:\n" + " ldr r3, ._1000\n" + " ldrh r2, [r3]\n" + " add r1, r2, #0\n" + " add r1, r1, #0xa\n" + " ldr r0, ._1000 + 4\n" + " cmp r1, r0\n" + " bgt ._998 @cond_branch\n" + " strh r1, [r3]\n" + " b ._1025\n" + "._1001:\n" + " .align 2, 0\n" + "._1000:\n" + " .word gCurrentMove\n" + " .word 0x19b\n" + "._998:\n" + " ldr r1, ._1003\n" + " add r0, r2, r1\n" + " strh r0, [r3]\n" + " b ._1025\n" + "._1004:\n" + " .align 2, 0\n" + "._1003:\n" + " .word 0xfffffe70\n" + "._982:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._1005 @cond_branch\n" + " b ._1067\n" + "._1005:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._1011\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r2, #0xc\n" + " ldsh r3, [r0, r2]\n" + " cmp r3, #0x1\n" + " beq ._1007 @cond_branch\n" + " cmp r3, #0x1\n" + " bgt ._1008 @cond_branch\n" + " cmp r3, #0\n" + " beq ._1009 @cond_branch\n" + " b ._1067\n" + "._1012:\n" + " .align 2, 0\n" + "._1011:\n" + " .word gTasks\n" + "._1008:\n" + " cmp r3, #0x2\n" + " beq ._1013 @cond_branch\n" + " cmp r3, #0x3\n" + " beq ._1014 @cond_branch\n" + " b ._1067\n" + "._1009:\n" + " ldr r1, ._1020\n" + " ldr r0, ._1020 + 4\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x1\n" + " add r2, r0, r1\n" + " ldrb r0, [r2]\n" + " add r1, r0, #0\n" + " cmp r1, #0\n" + " bne ._1016 @cond_branch\n" + " b ._1067\n" + "._1016:\n" + " cmp r1, #0x8\n" + " bls ._1018 @cond_branch\n" + " sub r0, r0, #0x8\n" + " strb r0, [r2]\n" + " b ._1019\n" + "._1021:\n" + " .align 2, 0\n" + "._1020:\n" + " .word gUnknown_02023A14+0x13e\n" + " .word gCurrentMove\n" + "._1018:\n" + " strb r3, [r2]\n" + "._1019:\n" + " add r0, r5, #0\n" + " bl debug_sub_8012938\n" + " b ._1067\n" + "._1007:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + "._997:\n" + " add r1, r5, #0\n" + " bl debug_sub_8012AC0\n" + " b ._1067\n" + "._1013:\n" + " ldr r2, ._1026\n" + " ldrh r0, [r2]\n" + " add r1, r0, #0\n" + " sub r1, r1, #0xa\n" + " cmp r1, #0x1\n" + " ble ._1024 @cond_branch\n" + " strh r1, [r2]\n" + " b ._1025\n" + "._1027:\n" + " .align 2, 0\n" + "._1026:\n" + " .word gCurrentMove\n" + "._1024:\n" + " mov r1, #0xc8\n" + " lsl r1, r1, #0x1\n" + " add r0, r0, r1\n" + " strh r0, [r2]\n" + "._1025:\n" + " bl debug_sub_80128B4\n" + " add r0, r5, #0\n" + " bl debug_sub_8012938\n" + " add r0, r5, #0\n" + " bl debug_sub_80129F8\n" + " b ._1067\n" + "._1014:\n" + " add r0, r5, #0\n" + " mov r1, #0x0\n" + " bl debug_sub_8012B70\n" + " b ._1067\n" + "._916:\n" + " ldr r0, ._1032\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1030 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._1032 + 4\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " ldrb r0, [r4, #0xe]\n" + " bl debug_sub_8012B4C\n" + " mov r0, #0x0\n" + " b ._1055\n" + "._1033:\n" + " .align 2, 0\n" + "._1032:\n" + " .word gMain\n" + " .word gTasks\n" + "._1030:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._1046 @cond_branch\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1035 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._1037\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldrb r1, [r1, #0xe]\n" + " add r0, r5, #0\n" + " bl debug_sub_8012C08\n" + " b ._1067\n" + "._1038:\n" + " .align 2, 0\n" + "._1037:\n" + " .word gTasks\n" + "._1035:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._1039 @cond_branch\n" + " b ._1067\n" + "._1039:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " b ._1063\n" + "._917:\n" + " ldr r0, ._1044\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1042 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._1044 + 4\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " ldrb r0, [r4, #0xe]\n" + " bl debug_sub_8012B4C\n" + " mov r0, #0x0\n" + " b ._1055\n" + "._1045:\n" + " .align 2, 0\n" + "._1044:\n" + " .word gMain\n" + " .word gTasks\n" + "._1042:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._1046 @cond_branch\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1047 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._1050\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " mov r2, #0xe\n" + " ldsh r0, [r1, r2]\n" + " cmp r0, #0\n" + " bne ._1063 @cond_branch\n" + " ldr r1, ._1050 + 4\n" + " ldr r2, ._1050 + 8\n" + " mov r0, #0x1f\n" + " bl debug_sub_80132C8\n" + " b ._1063\n" + "._1051:\n" + " .align 2, 0\n" + "._1050:\n" + " .word gTasks\n" + " .word gUnknown_02023A14+0x13e\n" + " .word 0x19b\n" + "._1047:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1067 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " b ._1063\n" + "._918:\n" + " ldr r0, ._1056\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1054 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._1056 + 4\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " ldrb r0, [r4, #0xe]\n" + " bl debug_sub_8012B4C\n" + " mov r0, #0x0\n" + " b ._1055\n" + "._1057:\n" + " .align 2, 0\n" + "._1056:\n" + " .word gMain\n" + " .word gTasks\n" + "._1054:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1058 @cond_branch\n" + "._1046:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._1060\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " ldrb r0, [r4, #0xe]\n" + " bl debug_sub_8012B4C\n" + " mov r0, #0x1\n" + "._1055:\n" + " strh r0, [r4, #0xe]\n" + " bl debug_sub_8012B2C\n" + " b ._1067\n" + "._1061:\n" + " .align 2, 0\n" + "._1060:\n" + " .word gTasks\n" + "._1058:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1062 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._1065\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " mov r2, #0xe\n" + " ldsh r0, [r1, r2]\n" + " cmp r0, #0\n" + " bne ._1063 @cond_branch\n" + " ldr r1, ._1065 + 4\n" + " ldr r2, ._1065 + 8\n" + " mov r0, #0x1f\n" + " bl debug_sub_8013294\n" + "._1063:\n" + " add r0, r5, #0\n" + " mov r1, #0x1\n" + " bl debug_sub_8012B70\n" + " b ._1067\n" + "._1066:\n" + " .align 2, 0\n" + "._1065:\n" + " .word gTasks\n" + " .word gUnknown_02023A14+0x13e\n" + " .word 0x19b\n" + "._1062:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1067 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " add r0, r5, #0\n" + " mov r1, #0x1\n" + " bl debug_sub_8012B70\n" + "._1067:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8013240() +{ + asm( + " push {lr}\n" + " bl gScriptFuncs_End+0x2fec\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " beq ._1068 @cond_branch\n" + " mov r0, #0x1\n" + " b ._1069\n" + "._1068:\n" + " mov r0, #0x0\n" + "._1069:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8013258() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r1, #0\n" + " add r5, r2, #0\n" + " b ._1070\n" + "._1072:\n" + " ldr r0, ._1074\n" + " add r5, r5, r0\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x5\n" + " add r6, r6, r0\n" + " add r0, r4, #1\n" + "._1070:\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl gScriptFuncs_End+0x2f60\n" + " cmp r0, #0\n" + " bne ._1071 @cond_branch\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x5\n" + " cmp r5, r0\n" + " bhi ._1072 @cond_branch\n" + " mov r0, #0x1\n" + " b ._1073\n" + "._1075:\n" + " .align 2, 0\n" + "._1074:\n" + " .word 0xfffff000\n" + "._1071:\n" + " mov r0, #0x0\n" + "._1073:\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8013294() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r5, r1, #0\n" + " add r6, r2, #0\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " bl debug_sub_8013240\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._1076 @cond_branch\n" + " bl gScriptFuncs_End+0x19f4\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " add r2, r6, #0\n" + " bl debug_sub_8013258\n" + " add r4, r0, #0\n" + " bl gScriptFuncs_End+0x1a70\n" + " add r0, r4, #0\n" + " b ._1077\n" + "._1076:\n" + " mov r0, #0x0\n" + "._1077:\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80132C8() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r5, r1, #0\n" + " add r6, r2, #0\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " bl debug_sub_8013240\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._1078 @cond_branch\n" + " add r0, r4, #0\n" + " mov r1, #0x0\n" + " add r2, r5, #0\n" + " add r3, r6, #0\n" + " bl gScriptFuncs_End+0x2d64\n" + "._1078:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} +#endif + void oac_poke_opponent(struct Sprite *sprite) { sprite->callback = sub_8010278; @@ -1554,6 +8880,269 @@ void sub_8010800(void) gBattleMainFunc = bc_8012FAC; } +#if DEBUG +__attribute__((naked)) +void debug_sub_80138CC() +{ + asm( + " push {lr}\n" + " ldr r0, ._1167\n" + " ldrb r0, [r0]\n" + " bl GetBankSide\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._1163 @cond_branch\n" + " b ._1186\n" + "._1163:\n" + " ldr r1, ._1167 + 4\n" + " ldr r2, ._1167 + 8\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " add r2, r1, #0\n" + " cmp r0, #0x4\n" + " bls ._1165 @cond_branch\n" + " b ._1186\n" + "._1165:\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._1167 + 12\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._1168:\n" + " .align 2, 0\n" + "._1167:\n" + " .word gActiveBank\n" + " .word +0x2000000\n" + " .word 0x160fd\n" + " .word ._1169\n" + "._1169:\n" + " .word ._1170\n" + " .word ._1171\n" + " .word ._1172\n" + " .word ._1173\n" + " .word ._1174\n" + "._1170:\n" + " ldr r1, ._1177\n" + " ldr r0, ._1177 + 4\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldr r1, [r0]\n" + " ldr r0, ._1177 + 8\n" + " cmp r1, r0\n" + " bne ._1186 @cond_branch\n" + " ldr r0, ._1177 + 12\n" + " add r1, r2, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " b ._1187\n" + "._1178:\n" + " .align 2, 0\n" + "._1177:\n" + " .word gBattleBankFunc\n" + " .word gActiveBank\n" + " .word sub_802C098+1\n" + " .word 0x160fd\n" + "._1171:\n" + " ldr r1, ._1180\n" + " mov r0, #0x1\n" + " strh r0, [r1, #0x2c]\n" + " strh r0, [r1, #0x2e]\n" + " ldr r0, ._1180 + 4\n" + " add r1, r2, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, ._1180 + 8\n" + " add r1, r2, r0\n" + " mov r0, #0x80\n" + " b ._1187\n" + "._1181:\n" + " .align 2, 0\n" + "._1180:\n" + " .word gMain\n" + " .word 0x160fd\n" + " .word 0x160fe\n" + "._1172:\n" + " ldr r0, ._1184\n" + " add r3, r2, r0\n" + " ldrb r0, [r3]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r3]\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._1186 @cond_branch\n" + " ldr r1, ._1184 + 4\n" + " mov r0, #0x1\n" + " strh r0, [r1, #0x2c]\n" + " strh r0, [r1, #0x2e]\n" + " ldr r0, ._1184 + 8\n" + " add r1, r2, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x80\n" + " strb r0, [r3]\n" + " b ._1186\n" + "._1185:\n" + " .align 2, 0\n" + "._1184:\n" + " .word 0x160fe\n" + " .word gMain\n" + " .word 0x160fd\n" + "._1173:\n" + " ldr r0, ._1188\n" + " add r1, r2, r0\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._1186 @cond_branch\n" + " ldr r1, ._1188 + 4\n" + " mov r0, #0x1\n" + " strh r0, [r1, #0x2c]\n" + " strh r0, [r1, #0x2e]\n" + " ldr r0, ._1188 + 8\n" + " add r1, r2, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " b ._1187\n" + "._1189:\n" + " .align 2, 0\n" + "._1188:\n" + " .word 0x160fe\n" + " .word gMain\n" + " .word 0x160fd\n" + "._1174:\n" + " ldr r0, ._1190\n" + " add r1, r2, r0\n" + " mov r0, #0x0\n" + "._1187:\n" + " strb r0, [r1]\n" + "._1186:\n" + " pop {r0}\n" + " bx r0\n" + "._1191:\n" + " .align 2, 0\n" + "._1190:\n" + " .word 0x160fd\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80139E4() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r0, ._1198\n" + " ldrb r1, [r0]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0\n" + " beq ._1192 @cond_branch\n" + " ldr r2, ._1198 + 4\n" + " mov r0, #0x0\n" + " strb r0, [r2]\n" + " ldr r1, ._1198 + 8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._1193 @cond_branch\n" + " add r4, r2, #0\n" + " add r5, r1, #0\n" + "._1194:\n" + " bl debug_sub_80138CC\n" + " ldrb r0, [r4]\n" + " add r0, r0, #0x1\n" + " strb r0, [r4]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldrb r1, [r5]\n" + " cmp r0, r1\n" + " bcc ._1194 @cond_branch\n" + "._1193:\n" + " ldr r0, ._1198 + 12\n" + " ldr r0, [r0]\n" + " bl gScriptFuncs_End+0x3cf4\n" + " ldr r1, ._1198 + 4\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " ldr r0, ._1198 + 8\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._1200 @cond_branch\n" + " ldr r5, ._1198 + 16\n" + " add r4, r1, #0\n" + "._1196:\n" + " ldrb r0, [r4]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r5\n" + " ldr r0, [r0]\n" + " bl gScriptFuncs_End+0x3cf4\n" + " ldrb r0, [r4]\n" + " add r0, r0, #0x1\n" + " strb r0, [r4]\n" + " ldr r1, ._1198 + 8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldrb r1, [r1]\n" + " cmp r0, r1\n" + " bcc ._1196 @cond_branch\n" + " b ._1200\n" + "._1199:\n" + " .align 2, 0\n" + "._1198:\n" + " .word gUnknown_02023A14+0x50\n" + " .word gActiveBank\n" + " .word gNoOfAllBanks\n" + " .word gBattleMainFunc\n" + " .word gBattleBankFunc\n" + "._1192:\n" + " ldr r0, ._1202\n" + " ldr r0, [r0]\n" + " bl gScriptFuncs_End+0x3cf4\n" + " ldr r1, ._1202 + 4\n" + " strb r4, [r1]\n" + " ldr r0, ._1202 + 8\n" + " ldrb r0, [r0]\n" + " cmp r4, r0\n" + " bcs ._1200 @cond_branch\n" + " ldr r5, ._1202 + 12\n" + " add r4, r1, #0\n" + "._1201:\n" + " ldrb r0, [r4]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r5\n" + " ldr r0, [r0]\n" + " bl gScriptFuncs_End+0x3cf4\n" + " ldrb r0, [r4]\n" + " add r0, r0, #0x1\n" + " strb r0, [r4]\n" + " ldr r1, ._1202 + 8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldrb r1, [r1]\n" + " cmp r0, r1\n" + " bcc ._1201 @cond_branch\n" + "._1200:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._1203:\n" + " .align 2, 0\n" + "._1202:\n" + " .word gBattleMainFunc\n" + " .word gActiveBank\n" + " .word gNoOfAllBanks\n" + " .word gBattleBankFunc\n" + "\n" + ); +} +#endif + void sub_8010824(void) { gBattleMainFunc(); @@ -1562,6 +9151,380 @@ void sub_8010824(void) gBattleBankFunc[gActiveBank](); } +#if DEBUG +__attribute__((naked)) +void sub_8010874() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " mov r0, #0x0\n" + " bl TurnValuesCleanUp\n" + " bl SpecialStatusesClear\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " ldr r0, ._1215\n" + " mov sl, r0\n" + " ldr r1, ._1215 + 4\n" + " mov r9, r1\n" + " ldr r4, ._1215 + 8\n" + " mov r8, r4\n" + " ldr r0, ._1215 + 12\n" + " mov ip, r0\n" + " ldr r4, ._1215 + 16\n" + " mov r5, #0x0\n" + " ldr r7, ._1215 + 20\n" + " ldr r6, ._1215 + 24\n" + "._1205:\n" + " ldr r0, ._1215 + 28\n" + " add r0, r5, r0\n" + " str r3, [r0]\n" + " mov r1, #0x0\n" + "._1204:\n" + " add r0, r4, r1\n" + " strb r3, [r0]\n" + " add r1, r1, #0x1\n" + " cmp r1, #0x1b\n" + " bls ._1204 @cond_branch\n" + " mov r0, #0x2\n" + " strb r0, [r4, #0x16]\n" + " ldr r1, ._1215 + 32\n" + " add r0, r2, r1\n" + " strb r3, [r0]\n" + " mov r0, ip\n" + " strh r3, [r0]\n" + " mov r1, r8\n" + " strh r3, [r1]\n" + " mov r0, r9\n" + " strh r3, [r0]\n" + " mov r1, sl\n" + " strh r3, [r1]\n" + " ldr r0, ._1215 + 36\n" + " add r1, r2, r0\n" + " mov r0, #0xff\n" + " strb r0, [r1]\n" + " strh r3, [r6]\n" + " strh r3, [r7]\n" + " ldr r1, ._1215 + 40\n" + " add r0, r5, r1\n" + " str r3, [r0]\n" + " mov r0, #0x2\n" + " add sl, sl, r0\n" + " add r9, r9, r0\n" + " add r8, r8, r0\n" + " add ip, ip, r0\n" + " add r4, r4, #0x1c\n" + " add r5, r5, #0x4\n" + " add r7, r7, #0x2\n" + " add r6, r6, #0x2\n" + " add r2, r2, #0x1\n" + " cmp r2, #0x3\n" + " ble ._1205 @cond_branch\n" + " mov r5, #0x0\n" + " ldr r3, ._1215 + 44\n" + " ldr r4, ._1215 + 48\n" + " mov r2, #0x1\n" + "._1207:\n" + " strh r5, [r4]\n" + " mov r1, #0x0\n" + "._1206:\n" + " add r0, r3, r1\n" + " strb r5, [r0]\n" + " add r1, r1, #0x1\n" + " cmp r1, #0xb\n" + " bls ._1206 @cond_branch\n" + " add r3, r3, #0xc\n" + " add r4, r4, #0x2\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bge ._1207 @cond_branch\n" + " mov r1, #0x0\n" + " ldr r2, ._1215 + 52\n" + " strb r1, [r2]\n" + " ldr r3, ._1215 + 56\n" + " strb r1, [r3]\n" + " ldr r4, ._1215 + 60\n" + " strh r1, [r4]\n" + " ldr r1, ._1215 + 64\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + "._1208:\n" + " add r0, r1, r2\n" + " strb r3, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, #0x2b\n" + " bls ._1208 @cond_branch\n" + " mov r0, #0x0\n" + " ldr r1, ._1215 + 68\n" + " str r0, [r1]\n" + " ldr r2, ._1215 + 72\n" + " ldrh r1, [r2]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._1210 @cond_branch\n" + " ldr r3, ._1215 + 76\n" + " ldrb r1, [r3, #0x15]\n" + " mov r0, #0x4\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._1210 @cond_branch\n" + " mov r0, #0x80\n" + " ldr r4, ._1215 + 68\n" + " str r0, [r4]\n" + "._1210:\n" + " ldr r1, ._1215 + 76\n" + " ldrb r0, [r1, #0x15]\n" + " lsl r0, r0, #0x1e\n" + " lsr r0, r0, #0x1f\n" + " ldr r3, ._1215 + 80\n" + " ldr r4, ._1215 + 84\n" + " add r2, r3, r4\n" + " mov r1, #0x0\n" + " strb r0, [r2]\n" + " ldr r0, ._1215 + 88\n" + " strb r1, [r0]\n" + " ldr r2, ._1215 + 92\n" + " strb r1, [r2]\n" + " ldr r3, ._1215 + 96\n" + " str r1, [r3]\n" + " mov r2, #0x0\n" + " ldr r4, ._1215 + 100\n" + " strh r1, [r4]\n" + " ldr r1, ._1215 + 80\n" + " ldr r3, ._1215 + 104\n" + " add r0, r1, r3\n" + " strb r2, [r0]\n" + " ldr r4, ._1215 + 108\n" + " add r0, r1, r4\n" + " strb r2, [r0]\n" + " ldr r1, ._1215 + 112\n" + " mov r2, #0x0\n" + " add r0, r1, #7\n" + "._1211:\n" + " strb r2, [r0]\n" + " sub r0, r0, #0x1\n" + " cmp r0, r1\n" + " bge ._1211 @cond_branch\n" + " mov r5, #0x0\n" + " ldr r0, ._1215 + 116\n" + " strh r5, [r0]\n" + " mov r0, #0x0\n" + " ldr r1, ._1215 + 120\n" + " str r0, [r1]\n" + " ldr r2, ._1215 + 124\n" + " strh r0, [r2]\n" + " ldr r4, ._1215 + 80\n" + " ldr r3, ._1215 + 128\n" + " add r0, r4, r3\n" + " strb r5, [r0]\n" + " ldr r1, ._1215 + 132\n" + " add r0, r4, r1\n" + " strb r5, [r0]\n" + " ldr r2, ._1215 + 136\n" + " strb r5, [r2]\n" + " ldr r3, ._1215 + 140\n" + " strb r5, [r3]\n" + " sub r1, r1, #0x29\n" + " add r0, r4, r1\n" + " strb r5, [r0]\n" + " ldr r2, ._1215 + 144\n" + " add r0, r4, r2\n" + " strb r5, [r0]\n" + " ldr r3, ._1215 + 148\n" + " add r0, r4, r3\n" + " strb r5, [r0]\n" + " ldr r0, ._1215 + 152\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " ldr r2, ._1215 + 156\n" + " lsl r1, r0, #0x3\n" + " sub r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r2\n" + " ldrb r1, [r1, #0x8]\n" + " mov r0, #0x64\n" + " mul r0, r0, r1\n" + " ldr r1, ._1215 + 160\n" + " bl gScriptFuncs_End+0x3d30\n" + " ldr r2, ._1215 + 164\n" + " add r1, r4, r2\n" + " strb r0, [r1]\n" + " ldr r3, ._1215 + 168\n" + " add r1, r4, r3\n" + " mov r0, #0x3\n" + " strb r0, [r1]\n" + " ldr r1, ._1215 + 172\n" + " add r0, r4, r1\n" + " strb r5, [r0]\n" + " sub r2, r2, #0x33\n" + " add r1, r4, r2\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " mov r2, #0x0\n" + " mov r1, #0x0\n" + "._1212:\n" + " ldr r3, ._1215 + 176\n" + " add r0, r2, r3\n" + " add r0, r0, r4\n" + " strb r1, [r0]\n" + " add r3, r3, #0x20\n" + " add r0, r2, r3\n" + " add r0, r0, r4\n" + " strb r1, [r0]\n" + " add r3, r3, #0x1c\n" + " add r0, r2, r3\n" + " add r0, r0, r4\n" + " strb r1, [r0]\n" + " add r3, r3, #0x8\n" + " add r0, r2, r3\n" + " add r0, r0, r4\n" + " strb r1, [r0]\n" + " add r3, r3, #0x10\n" + " add r0, r2, r3\n" + " add r0, r0, r4\n" + " strb r1, [r0]\n" + " add r3, r3, #0x8\n" + " add r0, r2, r3\n" + " add r0, r0, r4\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, #0x7\n" + " ble ._1212 @cond_branch\n" + " ldr r4, ._1215 + 80\n" + " ldr r1, ._1215 + 180\n" + " add r0, r4, r1\n" + " mov r2, #0x0\n" + " mov r1, #0x6\n" + " strb r1, [r0]\n" + " sub r3, r3, #0x3f\n" + " add r0, r4, r3\n" + " strb r1, [r0]\n" + " ldr r1, ._1215 + 184\n" + " add r0, r4, r1\n" + " strb r2, [r0]\n" + " ldr r3, ._1215 + 188\n" + " mov r1, #0x0\n" + " mov r2, #0xa\n" + " add r0, r3, #0\n" + " add r0, r0, #0x40\n" + "._1213:\n" + " strb r1, [r0]\n" + " sub r0, r0, #0x1\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bge ._1213 @cond_branch\n" + " mov r1, #0x0\n" + " strb r1, [r3, #0x13]\n" + " strb r1, [r3]\n" + " strb r1, [r3, #0x1]\n" + " strb r1, [r3, #0x2]\n" + " strb r1, [r3, #0x3]\n" + " strb r1, [r3, #0x4]\n" + " ldrb r2, [r3, #0x5]\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " mov r2, #0x3\n" + " neg r2, r2\n" + " and r0, r0, r2\n" + " strb r0, [r3, #0x5]\n" + " strh r1, [r3, #0x20]\n" + " strh r1, [r3, #0x22]\n" + " strh r1, [r3, #0x24]\n" + " strh r1, [r3, #0x6]\n" + " strh r1, [r3, #0x26]\n" + " strh r1, [r3, #0x28]\n" + " mov r2, #0x0\n" + " add r5, r3, #0\n" + " add r5, r5, #0x8\n" + " mov r4, #0x0\n" + " add r1, r3, #0\n" + " add r1, r1, #0x14\n" + "._1214:\n" + " add r0, r2, r5\n" + " strb r4, [r0]\n" + " strb r4, [r1]\n" + " strb r4, [r1, #0x16]\n" + " add r1, r1, #0x1\n" + " add r2, r2, #0x1\n" + " cmp r2, #0x9\n" + " ble ._1214 @cond_branch\n" + " ldr r2, ._1215 + 80\n" + " ldr r3, ._1215 + 192\n" + " add r0, r2, r3\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " ldr r4, ._1215 + 196\n" + " add r0, r2, r4\n" + " strb r1, [r0]\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._1216:\n" + " .align 2, 0\n" + "._1215:\n" + " .word gUnknown_02024C4C\n" + " .word gUnknown_02024C44\n" + " .word gMoveHitWith\n" + " .word gLastUsedMove\n" + " .word gDisableStructs\n" + " .word gUnknown_02024C2C\n" + " .word gLockedMove\n" + " .word gStatuses3\n" + " .word gUnknown_02024C70\n" + " .word gUnknown_02024C5C\n" + " .word +0x2017100\n" + " .word gSideTimer\n" + " .word gSideAffecting\n" + " .word gBankAttacker\n" + " .word gBankTarget\n" + " .word gBattleWeather\n" + " .word gWishFutureKnock\n" + " .word gHitMarker\n" + " .word gBattleTypeFlags\n" + " .word gSaveBlock2\n" + " .word +0x2000000\n" + " .word 0x16084\n" + " .word gMultiHitCounter\n" + " .word gBattleOutcome\n" + " .word gBattleExecBuffer\n" + " .word gPaydayMoney\n" + " .word 0x17130\n" + " .word 0x17160\n" + " .word gBattleCommunication\n" + " .word gPauseCounterBattle\n" + " .word gBattleMoveDamage\n" + " .word gUnknown_02024DE8\n" + " .word 0x16002\n" + " .word 0x160a1\n" + " .word gLeveledUpInBattle\n" + " .word gAbsentBankFlags\n" + " .word 0x16086\n" + " .word 0x16087\n" + " .word gEnemyParty\n" + " .word gBaseStats\n" + " .word 0x4fb\n" + " .word 0x16089\n" + " .word 0x16088\n" + " .word 0x1601b\n" + " .word 0x160ac\n" + " .word 0x160c8\n" + " .word 0x16113\n" + " .word gBattleResults\n" + " .word 0x1609e\n" + " .word 0x1609f\n" + "\n" + ); +} +#else void sub_8010874(void) { s32 i; @@ -1663,6 +9626,7 @@ void sub_8010874(void) gBattleResults.caughtNick[i] = 0; } } +#endif void SwitchInClearStructs(void) { diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c index 977e91f5c..613f2ebe0 100644 --- a/src/battle/battle_ai.c +++ b/src/battle/battle_ai.c @@ -289,6 +289,214 @@ void BattleAI_HandleItemUseBeforeAISetup(void) BattleAI_SetupAIData(); } +#if DEBUG +__attribute__((naked)) +void BattleAI_SetupAIData() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " ldr r2, ._16\n" + " mov r4, #0x0\n" + " ldr r3, ._16 + 4\n" + " mov r1, #0x0\n" + "._9:\n" + " add r0, r2, r4\n" + " strb r1, [r0]\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x1b\n" + " bls ._9 @cond_branch\n" + " ldr r0, ._16\n" + " mov r1, #0x64\n" + " mov r4, #0x3\n" + " add r0, r0, #0x7\n" + "._10:\n" + " strb r1, [r0]\n" + " sub r0, r0, #0x1\n" + " sub r4, r4, #0x1\n" + " cmp r4, #0\n" + " bge ._10 @cond_branch\n" + " ldrb r0, [r3]\n" + " mov r1, #0x0\n" + " mov r2, #0xff\n" + " bl sub_8015A98\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " mov r4, #0x0\n" + " ldr r0, ._16\n" + " add r5, r0, #4\n" + " ldr r6, ._16 + 8\n" + "._12:\n" + " ldr r0, [r6]\n" + " and r0, r0, r7\n" + " cmp r0, #0\n" + " beq ._11 @cond_branch\n" + " mov r0, #0x0\n" + " strb r0, [r5]\n" + "._11:\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0xf\n" + " and r0, r0, r1\n" + " mov r1, #0x64\n" + " sub r1, r1, r0\n" + " strb r1, [r5, #0x14]\n" + " add r5, r5, #0x1\n" + " add r6, r6, #0x4\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x3\n" + " ble ._12 @cond_branch\n" + " ldr r0, ._16 + 12\n" + " add r0, r0, #0x20\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " ldr r1, ._16 + 16\n" + " ldr r0, ._16 + 4\n" + " ldrb r2, [r0]\n" + " strb r2, [r1]\n" + " ldr r0, ._16 + 20\n" + " ldrh r1, [r0]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._13 @cond_branch\n" + " ldr r4, ._16 + 24\n" + " bl Random\n" + " mov r5, #0x2\n" + " and r0, r0, r5\n" + " strb r0, [r4]\n" + " ldr r0, ._16 + 28\n" + " ldrb r1, [r0]\n" + " ldr r2, ._16 + 8\n" + " ldrb r3, [r4]\n" + " lsl r0, r3, #0x2\n" + " add r0, r0, r2\n" + " ldr r0, [r0]\n" + " and r1, r1, r0\n" + " cmp r1, #0\n" + " beq ._15 @cond_branch\n" + " eor r3, r3, r5\n" + " strb r3, [r4]\n" + " b ._15\n" + "._17:\n" + " .align 2, 0\n" + "._16:\n" + " .word +0x2016800\n" + " .word gActiveBank\n" + " .word gBitTable\n" + " .word +0x2016c00\n" + " .word gBankAttacker\n" + " .word gBattleTypeFlags\n" + " .word gBankTarget\n" + " .word gAbsentBankFlags\n" + "._13:\n" + " ldr r0, ._20\n" + " mov r1, #0x1\n" + " eor r1, r1, r2\n" + " strb r1, [r0]\n" + "._15:\n" + " ldr r0, ._20 + 4\n" + " ldrh r1, [r0]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._18 @cond_branch\n" + " ldr r1, ._20 + 8\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x17\n" + " b ._27\n" + "._21:\n" + " .align 2, 0\n" + "._20:\n" + " .word gBankTarget\n" + " .word gBattleTypeFlags\n" + " .word +0x2016800\n" + "._18:\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x3\n" + " add r0, r2, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._22 @cond_branch\n" + " ldr r1, ._24\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x16\n" + " b ._27\n" + "._25:\n" + " .align 2, 0\n" + "._24:\n" + " .word +0x2016800\n" + "._22:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._26 @cond_branch\n" + " ldr r1, ._28\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x18\n" + " b ._27\n" + "._29:\n" + " .align 2, 0\n" + "._28:\n" + " .word +0x2016800\n" + "._26:\n" + " mov r0, #0x90\n" + " lsl r0, r0, #0x4\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._30 @cond_branch\n" + " ldr r1, ._33\n" + " ldrh r0, [r1]\n" + " cmp r0, r2\n" + " bne ._31 @cond_branch\n" + "._30:\n" + " ldr r1, ._33 + 4\n" + " mov r0, #0x7\n" + "._27:\n" + " str r0, [r1, #0xc]\n" + " add r3, r1, #0\n" + " b ._32\n" + "._34:\n" + " .align 2, 0\n" + "._33:\n" + " .word gTrainerBattleOpponent\n" + " .word +0x2016800\n" + "._31:\n" + " ldr r3, ._36\n" + " ldr r2, ._36 + 4\n" + " ldrh r1, [r1]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x3\n" + " add r2, r2, #0x1c\n" + " add r0, r0, r2\n" + " ldr r0, [r0]\n" + " str r0, [r3, #0xc]\n" + "._32:\n" + " ldr r0, ._36 + 8\n" + " ldrb r1, [r0]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._35 @cond_branch\n" + " ldr r0, ._36 + 12\n" + " ldr r0, [r0]\n" + " str r0, [r3, #0xc]\n" + "._35:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._37:\n" + " .align 2, 0\n" + "._36:\n" + " .word +0x2016800\n" + " .word gTrainers\n" + " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14+0x4c\n" + "\n" + ); +} +#else void BattleAI_SetupAIData(void) { s32 i; @@ -342,6 +550,7 @@ void BattleAI_SetupAIData(void) else // otherwise, just set aiFlags to whatever flags the trainer has set in their data. AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags; } +#endif u8 BattleAI_GetAIActionToUse(void) { diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c index 97568d254..f7734301c 100644 --- a/src/battle/battle_interface.c +++ b/src/battle/battle_interface.c @@ -79,8 +79,8 @@ extern const u16 gBattleInterfaceStatusIcons_DynPal[]; static void sub_8043D5C(struct Sprite *); static const void *sub_8043CDC(u8); -static void sub_8044210(u8, s16, u8); -static void draw_status_ailment_maybe(u8); +/*static*/ void sub_8044210(u8, s16, u8); +/*static*/ void draw_status_ailment_maybe(u8); extern void sub_8045180(struct Sprite *); static void sub_8045110(struct Sprite *); static void sub_8045048(struct Sprite *); @@ -651,7 +651,7 @@ void sub_8043F44(u8 a) #define CHAR_LV_SEPARATOR CHAR_PERIOD #endif -static void sub_8043FC0(u8 a, u8 b) +/*static*/ void sub_8043FC0(u8 a, u8 b) { u8 str[30]; void *const *r7; @@ -905,7 +905,7 @@ _0804420C: .4byte 0x04000008\n\ } #endif -static void sub_8044210(u8 a, s16 b, u8 c) +/*static*/ void sub_8044210(u8 a, s16 b, u8 c) { u8 str[0x14]; u8 *ptr; @@ -1277,6 +1277,353 @@ _08044548: .4byte 0x04000008\n\ } #endif +#if DEBUG +__attribute__((naked)) +void sub_804454C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x0\n" + " mov r8, r0\n" + " ldr r0, ._150\n" + " ldrb r0, [r0]\n" + " cmp r8, r0\n" + " blt ._133 @cond_branch\n" + " b ._164\n" + "._133:\n" + " ldr r1, ._150 + 4\n" + " mov r9, r1\n" + " mov r2, #0x64\n" + " mov sl, r2\n" + " ldr r7, ._150 + 8\n" + "._165:\n" + " ldr r0, ._150 + 12\n" + " mov r6, r8\n" + " add r5, r6, r0\n" + " ldrb r1, [r5]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " mov r1, r9\n" + " add r1, r1, #0x1c\n" + " add r0, r0, r1\n" + " ldr r1, [r0]\n" + " ldr r0, ._150 + 16\n" + " cmp r1, r0\n" + " beq ._135 @cond_branch\n" + " b ._147\n" + "._135:\n" + " ldr r0, ._150 + 20\n" + " ldrb r0, [r0]\n" + " lsl r4, r6, #0x18\n" + " cmp r0, #0\n" + " bne ._138 @cond_branch\n" + " lsr r0, r4, #0x18\n" + " bl GetBankSide\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._138 @cond_branch\n" + " b ._147\n" + "._138:\n" + " bl IsDoubleBattle\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._141 @cond_branch\n" + " lsr r0, r4, #0x18\n" + " bl GetBankSide\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._141 @cond_branch\n" + " b ._147\n" + "._141:\n" + " mov r0, r8\n" + " lsl r3, r0, #0x2\n" + " ldr r0, ._150 + 24\n" + " add r3, r3, r0\n" + " ldr r0, [r3]\n" + " lsl r0, r0, #0x1b\n" + " lsr r0, r0, #0x1f\n" + " mov r2, #0x1\n" + " eor r2, r2, r0\n" + " lsl r2, r2, #0x4\n" + " ldrb r0, [r3]\n" + " mov r6, #0x11\n" + " neg r6, r6\n" + " add r1, r6, #0\n" + " and r0, r0, r1\n" + " orr r0, r0, r2\n" + " strb r0, [r3]\n" + " ldr r0, [r3]\n" + " lsl r0, r0, #0x1b\n" + " lsr r6, r0, #0x1f\n" + " lsr r0, r4, #0x18\n" + " bl GetBankSide\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._143 @cond_branch\n" + " bl IsDoubleBattle\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._144 @cond_branch\n" + " b ._147\n" + "._144:\n" + " ldr r0, ._150 + 28\n" + " ldrh r1, [r0]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " cmp r2, #0\n" + " beq ._146 @cond_branch\n" + " b ._147\n" + "._146:\n" + " cmp r6, #0x1\n" + " bne ._148 @cond_branch\n" + " ldrb r1, [r5]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r9\n" + " ldrh r0, [r0, #0x38]\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " str r2, [sp]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r9\n" + " ldrh r1, [r0, #0x4]\n" + " lsl r1, r1, #0x16\n" + " lsr r1, r1, #0x11\n" + " ldr r0, ._150 + 32\n" + " add r1, r1, r0\n" + " mov r0, sp\n" + " ldr r2, ._150 + 36\n" + " bl gScriptFuncs_End+0x3cb4\n" + " ldrb r4, [r5]\n" + " ldrh r0, [r7]\n" + " mov r1, sl\n" + " mul r1, r1, r0\n" + " add r0, r1, #0\n" + " ldr r2, ._150 + 40\n" + " add r0, r0, r2\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " mov r2, #0x0\n" + " bl sub_8044210\n" + " ldrb r4, [r5]\n" + " ldrh r0, [r7]\n" + " mov r6, sl\n" + " mul r6, r6, r0\n" + " add r0, r6, #0\n" + " ldr r1, ._150 + 40\n" + " b ._149\n" + "._151:\n" + " .align 2, 0\n" + "._150:\n" + " .word gNoOfAllBanks\n" + " .word gSprites\n" + " .word gBattlePartyID\n" + " .word gHealthboxIDs\n" + " .word SpriteCallbackDummy+1\n" + " .word gUnknown_020297ED\n" + " .word +0x2017800\n" + " .word gBattleTypeFlags\n" + " .word 0x6010000\n" + " .word 0x5000040\n" + " .word gPlayerParty\n" + "._148:\n" + " ldrb r0, [r5]\n" + " bl draw_status_ailment_maybe\n" + " ldrb r0, [r5]\n" + " ldrh r1, [r7]\n" + " mov r2, sl\n" + " mul r2, r2, r1\n" + " add r1, r2, #0\n" + " ldr r6, ._153\n" + " add r1, r1, r6\n" + " mov r2, #0x5\n" + " bl sub_8045A5C\n" + " mov r0, #0x75\n" + " bl sub_8043CDC\n" + " ldrb r2, [r5]\n" + " lsl r1, r2, #0x4\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r9\n" + " ldrh r1, [r1, #0x4]\n" + " lsl r1, r1, #0x16\n" + " lsr r1, r1, #0x11\n" + " ldr r2, ._153 + 4\n" + " add r1, r1, r2\n" + " ldr r2, ._153 + 8\n" + " bl gScriptFuncs_End+0x3cb4\n" + " b ._163\n" + "._154:\n" + " .align 2, 0\n" + "._153:\n" + " .word gPlayerParty\n" + " .word 0x6010680\n" + " .word 0x4000008\n" + "._143:\n" + " cmp r6, #0x1\n" + " bne ._155 @cond_branch\n" + " ldr r0, ._158\n" + " ldrh r1, [r0]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " cmp r2, #0\n" + " beq ._156 @cond_branch\n" + " ldrb r0, [r5]\n" + " ldrh r1, [r7]\n" + " mov r6, sl\n" + " mul r6, r6, r1\n" + " add r1, r6, #0\n" + " ldr r2, ._158 + 4\n" + " add r1, r1, r2\n" + " bl sub_8044338\n" + " b ._163\n" + "._159:\n" + " .align 2, 0\n" + "._158:\n" + " .word gBattleTypeFlags\n" + " .word gEnemyParty\n" + "._156:\n" + " ldrb r1, [r5]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r9\n" + " ldrh r0, [r0, #0x38]\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " str r2, [sp]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r9\n" + " ldrh r1, [r0, #0x4]\n" + " lsl r1, r1, #0x16\n" + " lsr r1, r1, #0x11\n" + " ldr r6, ._161\n" + " add r1, r1, r6\n" + " mov r0, sp\n" + " ldr r2, ._161 + 4\n" + " bl gScriptFuncs_End+0x3cb4\n" + " ldrb r4, [r5]\n" + " ldrh r0, [r7]\n" + " mov r1, sl\n" + " mul r1, r1, r0\n" + " add r0, r1, #0\n" + " ldr r2, ._161 + 8\n" + " add r0, r0, r2\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " mov r2, #0x0\n" + " bl sub_8044210\n" + " ldrb r4, [r5]\n" + " ldrh r0, [r7]\n" + " mov r6, sl\n" + " mul r6, r6, r0\n" + " add r0, r6, #0\n" + " ldr r1, ._161 + 8\n" + "._149:\n" + " add r0, r0, r1\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl sub_8044210\n" + " b ._163\n" + "._162:\n" + " .align 2, 0\n" + "._161:\n" + " .word 0x6010000\n" + " .word 0x5000040\n" + " .word gEnemyParty\n" + "._155:\n" + " ldrb r0, [r5]\n" + " bl draw_status_ailment_maybe\n" + " ldrb r0, [r5]\n" + " ldrh r1, [r7]\n" + " mov r6, #0x64\n" + " mul r1, r1, r6\n" + " ldr r4, ._166\n" + " add r1, r1, r4\n" + " mov r2, #0x5\n" + " bl sub_8045A5C\n" + " ldr r0, ._166 + 4\n" + " ldrh r1, [r0]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._163 @cond_branch\n" + " ldrb r0, [r5]\n" + " ldrh r1, [r7]\n" + " mul r1, r1, r6\n" + " add r1, r1, r4\n" + " mov r2, #0x4\n" + " bl sub_8045A5C\n" + "._163:\n" + " ldr r0, ._166 + 8\n" + " add r0, r0, r8\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r9\n" + " ldrh r1, [r0, #0x3c]\n" + " mov r2, #0x1\n" + " eor r1, r1, r2\n" + " strh r1, [r0, #0x3c]\n" + "._147:\n" + " add r7, r7, #0x2\n" + " mov r2, #0x1\n" + " add r8, r8, r2\n" + " ldr r0, ._166 + 12\n" + " ldrb r0, [r0]\n" + " cmp r8, r0\n" + " bge ._164 @cond_branch\n" + " b ._165\n" + "._164:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._167:\n" + " .align 2, 0\n" + "._166:\n" + " .word gEnemyParty\n" + " .word gBattleTypeFlags\n" + " .word gHealthboxIDs\n" + " .word gNoOfAllBanks\n" + "\n" + ); +} +#else void sub_804454C(void) { s32 i; @@ -1344,6 +1691,7 @@ void sub_804454C(void) } } } +#endif // This function almost matches except for just two instructions around 0x08044B52 that are swapped. #ifdef NONMATCHING @@ -2359,7 +2707,7 @@ void sub_8045180(struct Sprite *sprite) sprite->pos2.y = gSprites[spriteId].pos2.y; } -static void sub_80451A0(u8 a, struct Pokemon *pkmn) +/*static*/ void sub_80451A0(u8 a, struct Pokemon *pkmn) { u8 nickname[POKEMON_NAME_LENGTH]; u8 gender; @@ -2507,7 +2855,7 @@ static void sub_8045458(u8 a, u8 b) } } -static void draw_status_ailment_maybe(u8 a) +/*static*/ void draw_status_ailment_maybe(u8 a) { s32 r4; s32 r4_2; @@ -2649,7 +2997,7 @@ static u8 sub_80457E8(u8 a, u8 b) return ret; } -static void sub_80458B0(u8 a) +/*static*/ void sub_80458B0(u8 a) { u8 *r6; u8 r8; @@ -2675,7 +3023,7 @@ static void sub_80458B0(u8 a) } -static void sub_8045998(u8 a) +/*static*/ void sub_8045998(u8 a) { u8 *r7; u8 status; @@ -2697,6 +3045,310 @@ static void sub_8045998(u8 a) } } +#ifdef DEBUG +__attribute__((naked)) +void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffff8\n" + " mov r9, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " lsl r2, r2, #0x18\n" + " lsr r7, r2, #0x18\n" + " ldr r1, ._429\n" + " lsl r0, r0, #0x4\n" + " add r0, r0, r8\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldrh r0, [r0, #0x3a]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov sl, r0\n" + " bl GetBankSide\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._410 @cond_branch\n" + " b ._411\n" + "._410:\n" + " cmp r7, #0x3\n" + " beq ._412 @cond_branch\n" + " cmp r7, #0\n" + " bne ._413 @cond_branch\n" + "._412:\n" + " mov r0, r9\n" + " mov r1, #0x38\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r0, r8\n" + " bl sub_8043FC0\n" + "._413:\n" + " cmp r7, #0x1\n" + " bhi ._414 @cond_branch\n" + " mov r0, r9\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " mov r0, r8\n" + " mov r2, #0x0\n" + " bl sub_80440EC\n" + "._414:\n" + " cmp r7, #0x2\n" + " beq ._415 @cond_branch\n" + " cmp r7, #0\n" + " bne ._416 @cond_branch\n" + "._415:\n" + " mov r0, r9\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " mov r0, r8\n" + " mov r2, #0x1\n" + " bl sub_80440EC\n" + "._416:\n" + " cmp r7, #0x5\n" + " beq ._417 @cond_branch\n" + " cmp r7, #0\n" + " bne ._418 @cond_branch\n" + "._417:\n" + " mov r0, #0x0\n" + " bl load_gfxc_health_bar\n" + " mov r0, r9\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " add r4, r0, #0\n" + " mov r0, r9\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " add r3, r0, #0\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r8\n" + " add r2, r4, #0\n" + " bl sub_8043D84\n" + " mov r0, sl\n" + " mov r1, r8\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl sub_8045C78\n" + "._418:\n" + " bl IsDoubleBattle\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " str r0, [sp, #0x4]\n" + " cmp r0, #0\n" + " bne ._421 @cond_branch\n" + " cmp r7, #0x6\n" + " beq ._420 @cond_branch\n" + " cmp r7, #0\n" + " bne ._421 @cond_branch\n" + "._420:\n" + " mov r0, #0x3\n" + " bl load_gfxc_health_bar\n" + " mov r0, r9\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x10\n" + " lsr r5, r5, #0x10\n" + " mov r0, r9\n" + " mov r1, #0x38\n" + " bl GetMonData\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " mov r0, r9\n" + " mov r1, #0x19\n" + " bl GetMonData\n" + " add r3, r0, #0\n" + " ldr r6, ._429 + 4\n" + " lsl r1, r4, #0x2\n" + " ldr r2, ._429 + 8\n" + " lsl r0, r5, #0x3\n" + " sub r0, r0, r5\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrb r2, [r0, #0x13]\n" + " mov r0, #0xca\n" + " lsl r0, r0, #0x1\n" + " mul r0, r0, r2\n" + " add r1, r1, r0\n" + " add r1, r1, r6\n" + " ldr r1, [r1]\n" + " sub r3, r3, r1\n" + " add r4, r4, #0x1\n" + " lsl r4, r4, #0x2\n" + " add r4, r4, r0\n" + " add r4, r4, r6\n" + " ldr r2, [r4]\n" + " sub r2, r2, r1\n" + " ldr r0, [sp, #0x4]\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r8\n" + " bl sub_8043D84\n" + " mov r0, sl\n" + " mov r1, r8\n" + " mov r2, #0x1\n" + " mov r3, #0x0\n" + " bl sub_8045C78\n" + "._421:\n" + " cmp r7, #0x4\n" + " beq ._422 @cond_branch\n" + " cmp r7, #0\n" + " bne ._423 @cond_branch\n" + "._422:\n" + " mov r0, r8\n" + " mov r1, r9\n" + " bl sub_80451A0\n" + "._423:\n" + " cmp r7, #0x9\n" + " beq ._424 @cond_branch\n" + " cmp r7, #0\n" + " bne ._425 @cond_branch\n" + "._424:\n" + " mov r0, r8\n" + " bl draw_status_ailment_maybe\n" + "._425:\n" + " cmp r7, #0xa\n" + " bne ._426 @cond_branch\n" + " mov r0, r8\n" + " bl sub_80458B0\n" + "._426:\n" + " add r0, r7, #0\n" + " sub r0, r0, #0xa\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bhi ._442 @cond_branch\n" + " mov r0, r8\n" + " bl sub_8045998\n" + " b ._442\n" + "._430:\n" + " .align 2, 0\n" + "._429:\n" + " .word gSprites\n" + " .word gExperienceTables\n" + " .word gBaseStats\n" + "._411:\n" + " cmp r7, #0x3\n" + " beq ._431 @cond_branch\n" + " cmp r7, #0\n" + " bne ._432 @cond_branch\n" + "._431:\n" + " mov r0, r9\n" + " mov r1, #0x38\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r0, r8\n" + " bl sub_8043FC0\n" + "._432:\n" + " ldr r0, ._443\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x1\n" + " bne ._436 @cond_branch\n" + " cmp r7, #0x1\n" + " bhi ._434 @cond_branch\n" + " mov r0, r9\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " mov r0, r8\n" + " mov r2, #0x0\n" + " bl sub_80440EC\n" + "._434:\n" + " cmp r7, #0x2\n" + " beq ._435 @cond_branch\n" + " cmp r7, #0\n" + " bne ._436 @cond_branch\n" + "._435:\n" + " mov r0, r9\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " mov r0, r8\n" + " mov r2, #0x1\n" + " bl sub_80440EC\n" + "._436:\n" + " cmp r7, #0x5\n" + " beq ._437 @cond_branch\n" + " cmp r7, #0\n" + " bne ._438 @cond_branch\n" + "._437:\n" + " mov r0, #0x0\n" + " bl load_gfxc_health_bar\n" + " mov r0, r9\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " add r4, r0, #0\n" + " mov r0, r9\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " add r3, r0, #0\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, sl\n" + " mov r1, r8\n" + " add r2, r4, #0\n" + " bl sub_8043D84\n" + " mov r0, sl\n" + " mov r1, r8\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl sub_8045C78\n" + "._438:\n" + " cmp r7, #0x4\n" + " beq ._439 @cond_branch\n" + " cmp r7, #0\n" + " bne ._440 @cond_branch\n" + "._439:\n" + " mov r0, r8\n" + " mov r1, r9\n" + " bl sub_80451A0\n" + "._440:\n" + " cmp r7, #0x9\n" + " beq ._441 @cond_branch\n" + " cmp r7, #0\n" + " bne ._442 @cond_branch\n" + "._441:\n" + " mov r0, r8\n" + " bl draw_status_ailment_maybe\n" + "._442:\n" + " add sp, sp, #0x8\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._444:\n" + " .align 2, 0\n" + "._443:\n" + " .word gUnknown_020297ED\n" + "\n" + ); +} +#else void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) { u8 r10; @@ -2766,6 +3418,7 @@ void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) draw_status_ailment_maybe(a); } } +#endif s32 sub_8045C78(u8 a, u8 unused1, u8 c, u8 unused2) { diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c index 4979760d7..a03a215fd 100644 --- a/src/battle/battle_records.c +++ b/src/battle/battle_records.c @@ -8,9 +8,35 @@ #include "strings2.h" #include "trainer_card.h" +struct DebugStruct1 +{ + u16 var0; + u8 var1[10]; +}; + extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4]; extern u8 gBattleOutcome; +#ifdef DEBUG +const struct DebugStruct1 gUnknown_Debug_4245CC[] = +{ + { 1, _("NUMBER1") }, + { 2, _("ナンバー2") }, + { 3, _("ナンバー3") }, + { 4, _("ナンバー4") }, + { 5, _("ナンバー5") }, + { 6, _("ナンバー6") }, + { 7, _("ナンバー7") }, +}; + +const u8 gUnknown_Debug_8424620[][4] = +{ + { 1, 1, 0, 0 }, + { 2, 1, 0, 0 }, + { 3, 1, 0, 0 }, +}; +#endif + static void InitLinkBattleRecord(struct LinkBattleRecord *record) { CpuFill16(0, record, sizeof(struct LinkBattleRecord)); @@ -240,7 +266,8 @@ static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y) } } -void ShowLinkBattleRecords(void) { +void ShowLinkBattleRecords(void) +{ s32 i; Menu_DrawStdWindowFrame(1, 0, 28, 18); sub_8072BD8(gOtherText_BattleResults, 0, 1, 240); diff --git a/src/debug/kagaya_debug_menu.c b/src/debug/kagaya_debug_menu.c new file mode 100644 index 000000000..6f2734b08 --- /dev/null +++ b/src/debug/kagaya_debug_menu.c @@ -0,0 +1,420 @@ +#ifdef DEBUG +#include "global.h" +#include "menu.h" + +u8 KagayaDebugMenu_TrainerCard(); +u8 KagayaDebugMenu_CardToExchange(); +u8 KagayaDebugMenu_SlotMachine(); + +const u8 Str_83EBB34[] = _("Trainer’s card"); +const u8 Str_83EBB43[] = _("Card to exchange"); +const u8 Str_83EBB54[] = _("Slot machine"); + +const struct MenuAction _83EBB64[] = { + { Str_83EBB34, KagayaDebugMenu_TrainerCard }, + { Str_83EBB43, KagayaDebugMenu_CardToExchange }, + { Str_83EBB54, KagayaDebugMenu_SlotMachine }, +}; + +__attribute__((naked)) +void InitKagayaDebugMenu_A() +{ + asm( + " push {lr}\n" + " bl InitKagayaDebugMenu_B\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void InitKagayaDebugMenu_B() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xe\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._1\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xd\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl InitMenu\n" + " ldr r1, ._1 + 4\n" + " ldr r0, ._1 + 8\n" + " str r0, [r1]\n" + " add sp, sp, #0x8\n" + " pop {r0}\n" + " bx r0\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word _83EBB64\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_80B061C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80B061C() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._3 @cond_branch\n" + " mov r0, #0x0\n" + " b ._6\n" + "._3:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._5 @cond_branch\n" + " ldr r2, ._7\n" + " ldr r0, ._7 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._6\n" + "._8:\n" + " .align 2, 0\n" + "._7:\n" + " .word gCallback_03004AE8\n" + " .word _83EBB64\n" + "._5:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._6:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 KagayaDebugMenu_TrainerCard() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._9\n" + " ldr r0, ._9 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x4\n" + " pop {r1}\n" + " bx r1\n" + "._10:\n" + " .align 2, 0\n" + "._9:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_80B068C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80B068C() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._11 @cond_branch\n" + " mov r0, #0x0\n" + " b ._12\n" + "._11:\n" + " ldr r0, ._13\n" + " bl debug_sub_80A0710\n" + " bl CloseMenu\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + "._12:\n" + " pop {r1}\n" + " bx r1\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word sub_805469C+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 KagayaDebugMenu_CardToExchange() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._15\n" + " ldr r0, ._15 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x4\n" + " pop {r1}\n" + " bx r1\n" + "._16:\n" + " .align 2, 0\n" + "._15:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_80B06E0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80B06E0() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._17 @cond_branch\n" + " mov r0, #0x0\n" + " b ._18\n" + "._17:\n" + " ldr r0, ._19\n" + " bl debug_sub_80A073C\n" + " bl CloseMenu\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + "._18:\n" + " pop {r1}\n" + " bx r1\n" + "._20:\n" + " .align 2, 0\n" + "._19:\n" + " .word sub_805469C+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 KagayaDebugMenu_SlotMachine() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._21\n" + " ldr r0, ._21 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x4\n" + " pop {r1}\n" + " bx r1\n" + "._22:\n" + " .align 2, 0\n" + "._21:\n" + " .word gCallback_03004AE8\n" + " .word Kagaya_80B0734+1\n" + "\n" + ); +} + +__attribute__((naked)) +void Kagaya_80B0734() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._23 @cond_branch\n" + " mov r0, #0x0\n" + " b ._24\n" + "._23:\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._25\n" + " bl debug_sub_811609C\n" + " bl CloseMenu\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + "._24:\n" + " pop {r1}\n" + " bx r1\n" + "._26:\n" + " .align 2, 0\n" + "._25:\n" + " .word sub_805469C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80B0770() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._30\n" + " ldrb r1, [r0]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne ._27 @cond_branch\n" + " bl CloseMenu\n" + " bl IsPlayerFacingSurfableFishableWater\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._29 @cond_branch\n" + " ldr r0, ._30 + 4\n" + " str r4, [r0]\n" + " mov r0, #0x9\n" + " bl FieldEffectStart\n" + " b ._29\n" + "._31:\n" + " .align 2, 0\n" + "._30:\n" + " .word gPlayerAvatar\n" + " .word gUnknown_0202FF84\n" + "._27:\n" + " bl CloseMenu\n" + "._29:\n" + " mov r0, #0x1\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80B07B0() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._32\n" + " ldr r0, ._32 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x4\n" + " pop {r1}\n" + " bx r1\n" + "._33:\n" + " .align 2, 0\n" + "._32:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_80B07DC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80B07DC() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._34 @cond_branch\n" + " mov r0, #0x0\n" + " b ._35\n" + "._34:\n" + " bl CloseMenu\n" + " ldr r0, ._36\n" + " bl SetMainCallback2\n" + " mov r0, #0x1\n" + "._35:\n" + " pop {r1}\n" + " bx r1\n" + "._37:\n" + " .align 2, 0\n" + "._36:\n" + " .word sub_80FC074+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80B0800() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl sub_8068F18\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0\n" + " beq ._38 @cond_branch\n" + " ldr r0, ._39\n" + " mov r1, #0x0\n" + " str r1, [r0]\n" + " sub r1, r2, #1\n" + " str r1, [r0, #0x4]\n" + " mov r0, #0x2c\n" + " bl FieldEffectStart\n" + "._38:\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._40:\n" + " .align 2, 0\n" + "._39:\n" + " .word gUnknown_0202FF84\n" + "\n" + ); +} + +#endif // DEBUG diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c new file mode 100644 index 000000000..48b6d91b8 --- /dev/null +++ b/src/debug/nakamura_debug_menu.c @@ -0,0 +1,5031 @@ +#ifdef DEBUG +#include "global.h" +#include "menu.h" + +EWRAM_DATA u8 _nakamuraData[0x10] = {0}; + +static u8 _nakamuraStatic[32] __attribute__((unused)); + +u8 debug_sub_815FC54(); +u8 debug_sub_815F2B4(); +u8 debug_sub_815FC94(); +u8 debug_sub_815FB1C(); +u8 debug_sub_815F2F4(); +u8 debug_sub_815F62C(); +u8 debug_sub_815FBE8(); +u8 debug_sub_815FE1C(); +u8 debug_sub_8160D98(); + +const u8 Str_843E36C[] = _("Berries"); +const u8 Str_843E374[] = _("Goods"); +const u8 Str_843E37A[] = _("{PKMN} list"); +const u8 Str_843E382[] = _("トラップ"); +const u8 Str_843E387[] = _("Move your base"); +const u8 Str_843E396[] = _("Moving {PKMN}"); +const u8 Str_843E3A0[] = _("Fishing points"); +const u8 Str_843E3AF[] = _("Set {POKEBLOCK}"); +const u8 Str_843E3B9[] = _("Make bases(to max)"); +const u8 Str_843E3CC[] = _("Base location"); + +const struct MenuAction _843E3DC[] = { + { Str_843E36C, debug_sub_815FC54 }, + { Str_843E37A, debug_sub_815F2B4 }, + { Str_843E374, debug_sub_815FC94 }, + { Str_843E387, debug_sub_815FB1C }, + { Str_843E3B9, debug_sub_815F2F4 }, + { Str_843E3CC, debug_sub_815F62C }, + { Str_843E396, debug_sub_815FBE8 }, + { Str_843E3A0, debug_sub_815FE1C }, + { Str_843E3AF, debug_sub_8160D98 }, +}; + +const u8 _843E424[][4] = { + { 1, 118, 47, 14 }, + { 2, 125, 53, 10 }, + { 3, 113, 49, 8 }, + { 0xB, 118, 67, 6 }, + { 0xC, 121, 40, 11 }, + { 0xD, 111, 35, 1 }, + { 0x15, 115, 20, 53 }, + { 0x16, 121, 18, 13 }, + { 0x17, 119, 26, 81 }, + { 0x1F, 127, 59, 67 }, + { 0x20, 125, 55, 11 }, + { 0x21, 111, 27, 27 }, + { 0x29, 114, 9, 47 }, + { 0x2A, 115, 32, 39 }, + { 0x2B, 115, 23, 8 }, + { 0x33, 114, 30, 51 }, + { 0x34, 115, 26, 15 }, + { 0x35, 115, 32, 46 }, + { 0x3D, 114, 11, 62 }, + { 0x3E, 115, 21, 18 }, + { 0x3F, 115, 25, 24 }, + { 0x47, 114, 19, 70 }, + { 0x48, 115, 32, 6 }, + { 0x49, 114, 32, 57 }, + { 0x51, 116, 71, 4 }, + { 0x52, 123, 47, 3 }, + { 0x53, 123, 57, 5 }, + { 0x5B, 116, 79, 11 }, + { 0x5C, 123, 49, 3 }, + { 0x5D, 120, 18, 12 }, + { 0x65, 120, 28, 62 }, + { 0x66, 116, 56, 6 }, + { 0x67, 119, 16, 81 }, + { 0x6F, 120, 30, 62 }, + { 0x70, 116, 55, 15 }, + { 0x71, 119, 16, 28 }, + { 0x79, 111, 33, 34 }, + { 0x7A, 118, 29, 5 }, + { 0x7B, 127, 45, 24 }, + { 0x83, 111, 24, 36 }, + { 0x84, 125, 7, 25 }, + { 0x85, 115, 8, 30 }, + { 0x8D, 111, 34, 50 }, + { 0x8E, 127, 59, 72 }, + { 0x8F, 127, 61, 21 }, + { 0x97, 127, 67, 63 }, + { 0x98, 125, 24, 32 }, + { 0x99, 111, 35, 31 }, + { 0xA1, 111, 13, 19 }, + { 0xA2, 121, 43, 7 }, + { 0xA3, 118, 47, 5 }, + { 0xA4, 111, 14, 19 }, + { 0xAB, 118, 46, 5 }, + { 0xAC, 121, 42, 7 }, + { 0xAD, 119, 19, 76 }, + { 0xAE, 115, 7, 20 }, + { 0xB5, 110, 16, 25 }, + { 0xB6, 114, 11, 27 }, + { 0xB7, 115, 8, 20 }, + { 0xBF, 110, 17, 25 }, + { 0xC0, 114, 12, 27 }, + { 0xC1, 119, 18, 76 }, + { 0xC9, 119, 5, 2 }, + { 0xCA, 119, 4, 89 }, + { 0xCB, 120, 38, 54 }, + { 0xCC, 120, 5, 76 }, + { 0xD3, 119, 5, 15 }, + { 0xD4, 119, 7, 101 }, + { 0xD5, 120, 31, 23 }, + { 0xDD, 119, 34, 24 }, + { 0xDE, 120, 26, 10 }, + { 0xDF, 119, 4, 15 }, + { 0xE7, 119, 31, 73 }, + { 0xE8, 120, 29, 85 }, + { 0xE9, 119, 6, 2 }, +}; + +const u8 Str_843E550[] = _("R"); +const u8 Str_843E552[] = _("X"); +const u8 Str_843E554[] = _("Y"); +const u8 Str_843E556[] = _( + "♂1\n" + "♂2\n" + "♂3\n" + "♂4\n" + "♂5\n" + "♀1\n" + "♀2\n" + "♀3\n" + "♀4\n" + "♀5"); +const u8 Str_843E574[] = _("ー"); +const u8 Str_843E576[] = _("あ"); +const u8 Str_843E578[] = _("ア"); +const u8 Str_843E57A[] = _("A"); +const u8 Str_843E57C[] = _("a"); +const u8 Str_843E57E[] = _("0"); +const u8 Str_843E580[] = _( + "ADD\n" + "DEL\n" + "EXIT"); +const u8 Str_843E58D[] = _( + "Fishing location R119\n" + " Y1\n" + " Y2\n" + " Y3\n" + "Encounter location\n" + "\n" + "\n" + "front of you"); +const u8 _843E5D1[] = {0x0F, 0x16, 0x19}; +const u8 Str_843E5D4[] = _( + "Aボタン {ESCAPE}\p" + "  Bボタン ー\n" + "START けってい"); +const u8 Str_843E5F0[] = _("?"); +const u8 Str_843E5F2[] = _("HP どりょくち"); +const u8 Str_843E5FB[] = _("こうげき どりょくち"); +const u8 Str_843E606[] = _("ぼうぎょ どりょくち"); +const u8 Str_843E611[] = _("すばやさ どりょくち"); +const u8 Str_843E61C[] = _("とくこう どりょくち"); +const u8 Str_843E627[] = _("とくぼう どりょくち"); +const u8 Str_843E632[] = _("なつきど"); +const u8 Str_843E637[] = _("どりょくち ごうけい"); +const u8 Str_843E642[] = _("ここから"); +const u8 Str_843E647[] = _("ここまで"); +const u8 Str_843E64C[] = _("かいすう"); +const u8 Str_843E651[] = _("けっか"); +const u8 Str_843E655[] = _("かい"); +const u8 Str_843E658[] = _("0"); +const u8 Str_843E65A[] = _("はんい"); + +__attribute__((naked)) +void debug_sub_815F1B8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0xe\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._1\n" + " mov r0, #0x10\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xe\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0xf\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " add sp, sp, #0x8\n" + " pop {r0}\n" + " bx r0\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word _843E3DC\n" + "\n" + ); +} + +__attribute__((naked)) +void InitNakamuraDebugMenu() +{ + asm( + " push {lr}\n" + " bl debug_sub_815F1B8\n" + " ldr r1, ._3\n" + " ldr r0, ._3 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_815F214+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F214() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._9\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._5 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl MoveMenuCursor\n" + "._5:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._6 @cond_branch\n" + " mov r0, #0x1\n" + " bl MoveMenuCursor\n" + "._6:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._7 @cond_branch\n" + " ldr r4, ._9 + 4\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x15\n" + " add r4, r4, #0x4\n" + " add r0, r0, r4\n" + " ldr r4, [r0]\n" + " bl HandleDestroyMenuCursors\n" + " bl _call_via_r4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._12\n" + "._10:\n" + " .align 2, 0\n" + "._9:\n" + " .word gMain\n" + " .word _843E3DC\n" + "._7:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._11 @cond_branch\n" + " mov r0, #0x0\n" + " b ._12\n" + "._11:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._12:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F284() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._14\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._13 @cond_branch\n" + " bl debug_sub_81381B4\n" + " mov r0, #0x5\n" + " mov r1, #0x0\n" + " bl OpenPartyMenu\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + "._13:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._15:\n" + " .align 2, 0\n" + "._14:\n" + " .word gPaletteFade\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_815F2B4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " bl CloseMenu\n" + " bl MenuZeroFillScreen\n" + " ldr r1, ._16\n" + " ldr r0, ._16 + 4\n" + " str r0, [r1, #0x8]\n" + " ldr r0, ._16 + 8\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " mov r0, #0x1\n" + " add sp, sp, #0x4\n" + " pop {r1}\n" + " bx r1\n" + "._17:\n" + " .align 2, 0\n" + "._16:\n" + " .word gMain\n" + " .word sub_805469C+1\n" + " .word debug_sub_815F284+1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_815F2F4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " bl CloseMenu\n" + " mov r7, #0x1\n" + "._34:\n" + " lsl r1, r7, #0x2\n" + " add r0, r1, r7\n" + " lsl r2, r0, #0x5\n" + " ldr r3, ._24\n" + " add r0, r2, r3\n" + " ldr r5, ._24 + 4\n" + " add r0, r0, r5\n" + " ldrb r0, [r0]\n" + " mov r9, r1\n" + " add r1, r7, #1\n" + " str r1, [sp]\n" + " cmp r0, #0\n" + " beq ._18 @cond_branch\n" + " b ._19\n" + "._18:\n" + " mov r5, #0x0\n" + " ldr r6, ._24 + 8\n" + " add r4, r7, #0\n" + " sub r4, r4, #0x46\n" + " ldr r3, ._24 + 12\n" + "._21:\n" + " add r1, r5, r2\n" + " add r1, r1, r3\n" + " add r0, r5, r6\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0xff\n" + " beq ._20 @cond_branch\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x6\n" + " bls ._21 @cond_branch\n" + "._20:\n" + " cmp r5, #0x7\n" + " bne ._22 @cond_branch\n" + " add r0, r2, #6\n" + " b ._23\n" + "._25:\n" + " .align 2, 0\n" + "._24:\n" + " .word gSaveBlock1\n" + " .word 0x1a08\n" + " .word gSaveBlock2\n" + " .word gSaveBlock1+0x1a0a\n" + "._22:\n" + " add r0, r5, r2\n" + "._23:\n" + " add r0, r0, r3\n" + " strb r4, [r0]\n" + " ldr r1, ._35\n" + " ldr r2, ._35 + 4\n" + " add r2, r2, r1\n" + " mov sl, r2\n" + " mov r3, r9\n" + " add r0, r3, r7\n" + " lsl r6, r0, #0x5\n" + " add r1, r6, r1\n" + " ldr r5, ._35 + 4\n" + " add r5, r5, r1\n" + " mov r8, r5\n" + "._30:\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0x4b\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0xe\n" + " ldr r1, ._35 + 8\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " mov r2, r8\n" + " strb r0, [r2]\n" + " mov r5, #0x0\n" + " cmp r5, r7\n" + " bcs ._28 @cond_branch\n" + " mov r3, sl\n" + " ldrb r3, [r3]\n" + " cmp r0, r3\n" + " beq ._28 @cond_branch\n" + " ldr r4, ._35\n" + " add r0, r6, r4\n" + " ldr r2, ._35 + 4\n" + " add r3, r0, r2\n" + "._29:\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r7\n" + " bcs ._28 @cond_branch\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r4\n" + " add r0, r0, r2\n" + " ldrb r1, [r3]\n" + " ldrb r0, [r0]\n" + " cmp r1, r0\n" + " bne ._29 @cond_branch\n" + "._28:\n" + " cmp r5, r7\n" + " bne ._30 @cond_branch\n" + " bl Random\n" + " mov r5, r9\n" + " add r4, r5, r7\n" + " lsl r4, r4, #0x5\n" + " ldr r1, ._35\n" + " add r3, r4, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0x1\n" + " ldr r2, ._35 + 12\n" + " add r3, r3, r2\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x4\n" + " ldrb r1, [r3]\n" + " mov r5, #0x11\n" + " neg r5, r5\n" + " add r2, r5, #0\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r3]\n" + " mov r5, #0x0\n" + " ldr r6, ._35 + 16\n" + "._31:\n" + " bl Random\n" + " add r1, r5, r4\n" + " add r1, r1, r6\n" + " strb r0, [r1]\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x3\n" + " bls ._31 @cond_branch\n" + " mov r5, #0x0\n" + " mov r1, r9\n" + " add r0, r1, r7\n" + " lsl r4, r0, #0x5\n" + " ldr r3, ._35 + 20\n" + " mov r2, #0x0\n" + " add r6, r3, #0\n" + " add r6, r6, #0x10\n" + "._32:\n" + " add r1, r5, r4\n" + " add r0, r1, r3\n" + " strb r2, [r0]\n" + " add r1, r1, r6\n" + " strb r2, [r1]\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0xf\n" + " bls ._32 @cond_branch\n" + " add r0, r7, #0\n" + " bl unref_sub_80BCD7C\n" + "._19:\n" + " ldr r2, [sp]\n" + " lsl r0, r2, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x13\n" + " bhi ._33 @cond_branch\n" + " b ._34\n" + "._33:\n" + " mov r0, #0x1\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._36:\n" + " .align 2, 0\n" + "._35:\n" + " .word gSaveBlock1\n" + " .word 0x1a08\n" + " .word _843E424\n" + " .word 0x1a09\n" + " .word gSaveBlock1+0x1a11\n" + " .word gSaveBlock1+0x1a1a\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F470() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add r6, r0, #0\n" + " add r7, r1, #0\n" + " mov ip, r2\n" + " ldr r2, ._39\n" + " ldr r0, ._39 + 4\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r2\n" + " ldr r1, ._39 + 8\n" + " add r0, r0, r1\n" + " ldrb r4, [r0]\n" + " mov r2, #0x0\n" + " ldr r3, ._39 + 12\n" + " add r5, r3, #0\n" + "._41:\n" + " lsl r1, r2, #0x2\n" + " add r0, r1, r5\n" + " ldrb r0, [r0]\n" + " cmp r0, r4\n" + " bne ._37 @cond_branch\n" + " add r0, r1, #1\n" + " add r0, r0, r3\n" + " ldrb r0, [r0]\n" + " strb r0, [r6]\n" + " add r0, r1, #2\n" + " add r0, r0, r3\n" + " ldrb r0, [r0]\n" + " strb r0, [r7]\n" + " add r0, r1, #3\n" + " add r0, r0, r3\n" + " ldrb r0, [r0]\n" + " mov r1, ip\n" + " strb r0, [r1]\n" + " b ._38\n" + "._40:\n" + " .align 2, 0\n" + "._39:\n" + " .word gSaveBlock1\n" + " .word _nakamuraData\n" + " .word 0x1a08\n" + " .word _843E424\n" + "._37:\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x4a\n" + " bls ._41 @cond_branch\n" + "._38:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F4D8() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0xa\n" + " mov r3, #0xa\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r6, ._43\n" + " ldr r7, ._43 + 4\n" + " ldrb r1, [r7]\n" + " add r0, r6, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r2, ._43 + 8\n" + " ldrb r1, [r7]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r2\n" + " ldr r1, ._43 + 12\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._42 @cond_branch\n" + " mov r4, sp\n" + " add r4, r4, #0x1\n" + " mov r5, sp\n" + " add r5, r5, #0x2\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl debug_sub_815F470\n" + " ldrb r1, [r7]\n" + " add r0, r6, #0\n" + " bl sub_80BC190\n" + " add r0, r6, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r0, ._43 + 16\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, sp\n" + " ldrb r1, [r0]\n" + " add r0, r6, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " ldr r0, ._43 + 20\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldrb r1, [r4]\n" + " add r0, r6, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0x3\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r0, ._43 + 24\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " ldrb r1, [r5]\n" + " add r0, r6, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0x3\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + "._42:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._44:\n" + " .align 2, 0\n" + "._43:\n" + " .word gStringVar1\n" + " .word _nakamuraData\n" + " .word gSaveBlock1\n" + " .word 0x1a08\n" + " .word Str_843E550\n" + " .word Str_843E552\n" + " .word Str_843E554\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F5C4() +{ + asm( + " push {lr}\n" + " ldr r0, ._48\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " cmp r2, #0\n" + " beq ._45 @cond_branch\n" + " ldr r1, ._48 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._46 @cond_branch\n" + " mov r0, #0x13\n" + " b ._50\n" + "._49:\n" + " .align 2, 0\n" + "._48:\n" + " .word gMain\n" + " .word _nakamuraData\n" + "._46:\n" + " sub r0, r0, #0x1\n" + " b ._50\n" + "._45:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._51 @cond_branch\n" + " ldr r1, ._54\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x13\n" + " bne ._52 @cond_branch\n" + " strb r2, [r1]\n" + " b ._53\n" + "._55:\n" + " .align 2, 0\n" + "._54:\n" + " .word _nakamuraData\n" + "._52:\n" + " add r0, r0, #0x1\n" + "._50:\n" + " strb r0, [r1]\n" + "._53:\n" + " bl debug_sub_815F4D8\n" + " mov r0, #0x0\n" + " b ._58\n" + "._51:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._57 @cond_branch\n" + " mov r0, #0x0\n" + " b ._58\n" + "._57:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._58:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_815F62C() +{ + asm( + " push {lr}\n" + " ldr r1, ._59\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " ldr r1, ._59 + 4\n" + " ldr r0, ._59 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xb\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " bl debug_sub_815F4D8\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._60:\n" + " .align 2, 0\n" + "._59:\n" + " .word _nakamuraData\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_815F5C4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F668() +{ + asm( + " push {r4, r5, r6, lr}\n" + " ldr r0, ._61\n" + " ldrb r0, [r0]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x5\n" + " ldr r0, ._61 + 4\n" + " add r1, r1, r0\n" + " ldrb r4, [r1, #0x3]\n" + " lsl r4, r4, #0x18\n" + " ldrb r0, [r1, #0x2]\n" + " lsl r0, r0, #0x10\n" + " orr r4, r4, r0\n" + " ldrb r0, [r1, #0x1]\n" + " lsl r0, r0, #0x8\n" + " orr r4, r4, r0\n" + " ldrb r0, [r1]\n" + " orr r4, r4, r0\n" + " ldr r5, ._61 + 8\n" + " ldr r6, ._61 + 12\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " add r0, r5, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl __umodsi3\n" + " add r1, r0, #0\n" + " add r0, r5, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r5, #0\n" + " mov r1, #0x7\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._62:\n" + " .align 2, 0\n" + "._61:\n" + " .word _nakamuraData\n" + " .word gSaveBlock1+0x1a11\n" + " .word gStringVar1\n" + " .word 0x186a0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F6E4() +{ + asm( + " push {r4, lr}\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0xb\n" + " mov r3, #0x4\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r4, ._63\n" + " ldr r0, ._63 + 4\n" + " ldrb r0, [r0]\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x5\n" + " ldr r0, ._63 + 8\n" + " add r1, r1, r0\n" + " add r0, r4, #0\n" + " mov r2, #0x7\n" + " bl StringCopyN\n" + " mov r1, #0xff\n" + " strb r1, [r0]\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._64:\n" + " .align 2, 0\n" + "._63:\n" + " .word gStringVar1\n" + " .word _nakamuraData\n" + " .word gSaveBlock1+0x1a0a\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F72C() +{ + asm( + " push {r4, r5, lr}\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0xb\n" + " mov r3, #0xa\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r4, ._66\n" + " ldr r5, ._66 + 4\n" + " ldrb r1, [r5]\n" + " add r0, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r2, ._66 + 8\n" + " ldrb r1, [r5]\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r2\n" + " ldr r1, ._66 + 12\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._65 @cond_branch\n" + " bl debug_sub_815F6E4\n" + " bl debug_sub_815F668\n" + "._65:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._67:\n" + " .align 2, 0\n" + "._66:\n" + " .word gStringVar1\n" + " .word _nakamuraData\n" + " .word gSaveBlock1\n" + " .word 0x1a08\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F788() +{ + asm( + " push {lr}\n" + " mov r0, #0x2\n" + " mov r1, #0x5\n" + " mov r2, #0xb\n" + " mov r3, #0x6\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r0, ._68\n" + " ldr r1, ._68 + 4\n" + " ldrb r1, [r1]\n" + " add r1, r1, #0x2\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " pop {r0}\n" + " bx r0\n" + "._69:\n" + " .align 2, 0\n" + "._68:\n" + " .word Str_843E574\n" + " .word _nakamuraData+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F7B4() +{ + asm( + " push {lr}\n" + " ldr r0, ._72\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._70 @cond_branch\n" + " mov r0, #0xb\n" + " mov r1, #0x1\n" + " mov r2, #0xb\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " b ._71\n" + "._73:\n" + " .align 2, 0\n" + "._72:\n" + " .word _nakamuraData+0x1\n" + "._70:\n" + " ldr r0, ._74\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x1\n" + " ldr r1, ._74 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xb\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + "._71:\n" + " pop {r0}\n" + " bx r0\n" + "._75:\n" + " .align 2, 0\n" + "._74:\n" + " .word _nakamuraData+0x3\n" + " .word Str_843E576\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F7F0() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r1, ._78\n" + " ldrb r2, [r1]\n" + " lsl r1, r2, #0x2\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x5\n" + " ldr r2, ._78 + 4\n" + " add r3, r1, r2\n" + " ldrb r1, [r3, #0x3]\n" + " lsl r2, r1, #0x18\n" + " ldrb r1, [r3, #0x2]\n" + " lsl r1, r1, #0x10\n" + " orr r2, r2, r1\n" + " ldrb r1, [r3, #0x1]\n" + " lsl r1, r1, #0x8\n" + " orr r2, r2, r1\n" + " ldrb r1, [r3]\n" + " orr r2, r2, r1\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r4, #0x9\n" + " ldr r0, ._78 + 8\n" + " ldrb r0, [r0]\n" + " cmp r4, r0\n" + " ble ._76 @cond_branch\n" + " add r5, r0, #0\n" + "._77:\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r1, r0, #0x1\n" + " lsl r0, r4, #0x18\n" + " mov r4, #0xff\n" + " lsl r4, r4, #0x18\n" + " add r0, r0, r4\n" + " lsr r4, r0, #0x18\n" + " asr r0, r0, #0x18\n" + " cmp r0, r5\n" + " bgt ._77 @cond_branch\n" + "._76:\n" + " add r2, r2, r1\n" + " lsr r0, r2, #0x18\n" + " strb r0, [r3, #0x3]\n" + " mov r0, #0xff\n" + " lsl r0, r0, #0x10\n" + " and r0, r0, r2\n" + " lsr r0, r0, #0x10\n" + " strb r0, [r3, #0x2]\n" + " mov r0, #0xff\n" + " lsl r0, r0, #0x8\n" + " and r0, r0, r2\n" + " lsr r0, r0, #0x8\n" + " strb r0, [r3, #0x1]\n" + " strb r2, [r3]\n" + " bl debug_sub_815F668\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._79:\n" + " .align 2, 0\n" + "._78:\n" + " .word _nakamuraData\n" + " .word gSaveBlock1+0x1a11\n" + " .word _nakamuraData+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F86C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " ldr r1, ._84\n" + " ldrb r2, [r1]\n" + " lsl r1, r2, #0x2\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x5\n" + " ldr r2, ._84 + 4\n" + " add r5, r1, r2\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " lsr r6, r0, #0x18\n" + " asr r0, r0, #0x18\n" + " cmp r0, #0x64\n" + " bne ._80 @cond_branch\n" + " ldr r0, ._84 + 8\n" + " ldrb r1, [r0]\n" + " cmp r1, #0x6\n" + " bhi ._100 @cond_branch\n" + " mov r2, #0xff\n" + "._82:\n" + " add r0, r5, r1\n" + " strb r2, [r0]\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " cmp r1, #0x6\n" + " bls ._82 @cond_branch\n" + " b ._100\n" + "._85:\n" + " .align 2, 0\n" + "._84:\n" + " .word _nakamuraData\n" + " .word gSaveBlock1+0x1a0a\n" + " .word _nakamuraData+0x2\n" + "._80:\n" + " ldr r0, ._87\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x4\n" + " bhi ._98 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._87 + 4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._88:\n" + " .align 2, 0\n" + "._87:\n" + " .word _nakamuraData+0x3\n" + " .word ._89\n" + "._89:\n" + " .word ._90\n" + " .word ._91\n" + " .word ._92\n" + " .word ._93\n" + " .word ._94\n" + "._90:\n" + " mov r3, #0x1\n" + " mov r2, #0x50\n" + " b ._98\n" + "._91:\n" + " mov r3, #0x51\n" + " mov r2, #0xa0\n" + " b ._98\n" + "._92:\n" + " mov r3, #0xbb\n" + " mov r2, #0xd4\n" + " b ._98\n" + "._93:\n" + " mov r3, #0xd5\n" + " mov r2, #0xee\n" + " b ._98\n" + "._94:\n" + " mov r3, #0xa1\n" + " mov r2, #0xaa\n" + "._98:\n" + " ldr r4, ._101\n" + " ldrb r1, [r4]\n" + " add r1, r5, r1\n" + " ldrb r0, [r1]\n" + " add r0, r0, r6\n" + " strb r0, [r1]\n" + " ldrb r0, [r4]\n" + " add r1, r5, r0\n" + " ldrb r0, [r1]\n" + " cmp r0, r3\n" + " bcs ._99 @cond_branch\n" + " strb r2, [r1]\n" + "._99:\n" + " ldrb r0, [r4]\n" + " add r1, r5, r0\n" + " ldrb r0, [r1]\n" + " cmp r0, r2\n" + " bls ._100 @cond_branch\n" + " strb r3, [r1]\n" + "._100:\n" + " bl debug_sub_815F6E4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._102:\n" + " .align 2, 0\n" + "._101:\n" + " .word _nakamuraData+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815F930() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r0, ._107\n" + " ldrb r2, [r0]\n" + " mov r4, #0xa\n" + " cmp r2, #0\n" + " bne ._103 @cond_branch\n" + " mov r4, #0x7\n" + "._103:\n" + " ldr r5, ._107 + 4\n" + " ldrh r1, [r5, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._104 @cond_branch\n" + " cmp r2, #0\n" + " beq ._105 @cond_branch\n" + " mov r0, #0x1\n" + " bl debug_sub_815F7F0\n" + " b ._136\n" + "._108:\n" + " .align 2, 0\n" + "._107:\n" + " .word _nakamuraData+0x1\n" + " .word gMain\n" + "._105:\n" + " mov r0, #0x1\n" + " b ._113\n" + "._104:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._110 @cond_branch\n" + " cmp r2, #0\n" + " beq ._111 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl debug_sub_815F7F0\n" + " b ._136\n" + "._111:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " b ._113\n" + "._110:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " cmp r3, #0\n" + " beq ._114 @cond_branch\n" + " ldr r1, ._117\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._115 @cond_branch\n" + " sub r0, r4, #1\n" + " b ._116\n" + "._118:\n" + " .align 2, 0\n" + "._117:\n" + " .word _nakamuraData+0x2\n" + "._115:\n" + " sub r0, r0, #0x1\n" + "._116:\n" + " strb r0, [r1]\n" + "._125:\n" + " bl debug_sub_815F788\n" + " b ._136\n" + "._114:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._120 @cond_branch\n" + " ldr r2, ._123\n" + " ldrb r1, [r2]\n" + " sub r0, r4, #1\n" + " cmp r1, r0\n" + " bne ._121 @cond_branch\n" + " strb r3, [r2]\n" + " b ._125\n" + "._124:\n" + " .align 2, 0\n" + "._123:\n" + " .word _nakamuraData+0x2\n" + "._121:\n" + " add r0, r1, #1\n" + " strb r0, [r2]\n" + " b ._125\n" + "._120:\n" + " ldrh r1, [r5, #0x2e]\n" + " mov r0, #0x4\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._126 @cond_branch\n" + " cmp r2, #0\n" + " bne ._127 @cond_branch\n" + " ldr r4, ._129\n" + " ldrb r0, [r4]\n" + " add r0, r0, #0x1\n" + " mov r1, #0x5\n" + " bl __modsi3\n" + " strb r0, [r4]\n" + "._127:\n" + " bl debug_sub_815F7B4\n" + " b ._136\n" + "._130:\n" + " .align 2, 0\n" + "._129:\n" + " .word _nakamuraData+0x3\n" + "._126:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._131 @cond_branch\n" + " mov r0, #0x2\n" + " mov r1, #0x5\n" + " mov r2, #0xb\n" + " mov r3, #0x6\n" + " bl MenuFillWindowRectWithBlankTile\n" + " mov r0, #0xb\n" + " mov r1, #0x1\n" + " mov r2, #0xb\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r1, ._133\n" + " ldr r0, ._133 + 4\n" + " str r0, [r1]\n" + " b ._136\n" + "._134:\n" + " .align 2, 0\n" + "._133:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_815FA38+1\n" + "._131:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._136 @cond_branch\n" + " cmp r2, #0\n" + " bne ._136 @cond_branch\n" + " mov r0, #0x64\n" + "._113:\n" + " bl debug_sub_815F86C\n" + "._136:\n" + " mov r0, #0x0\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815FA38() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._139\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._137 @cond_branch\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " b ._138\n" + "._140:\n" + " .align 2, 0\n" + "._139:\n" + " .word gMain\n" + "._137:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._141 @cond_branch\n" + " mov r0, #0x2\n" + "._138:\n" + " bl MoveMenuCursor\n" + "._161:\n" + " mov r0, #0x0\n" + " b ._142\n" + "._141:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " cmp r2, #0\n" + " beq ._143 @cond_branch\n" + " ldr r1, ._146\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._144 @cond_branch\n" + " mov r0, #0x13\n" + " b ._148\n" + "._147:\n" + " .align 2, 0\n" + "._146:\n" + " .word _nakamuraData\n" + "._144:\n" + " sub r0, r0, #0x1\n" + " b ._148\n" + "._143:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0\n" + " beq ._149 @cond_branch\n" + " ldr r1, ._152\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x13\n" + " bne ._150 @cond_branch\n" + " strb r2, [r1]\n" + " b ._151\n" + "._153:\n" + " .align 2, 0\n" + "._152:\n" + " .word _nakamuraData\n" + "._150:\n" + " add r0, r0, #0x1\n" + "._148:\n" + " strb r0, [r1]\n" + "._151:\n" + " bl debug_sub_815F72C\n" + " b ._161\n" + "._149:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._155 @cond_branch\n" + " ldr r1, ._159\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._161 @cond_branch\n" + " ldr r2, ._159 + 4\n" + " add r1, r0, #0\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r2\n" + " ldr r1, ._159 + 8\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._161 @cond_branch\n" + " bl GetMenuCursorPos\n" + " ldr r1, ._159 + 12\n" + " strb r0, [r1]\n" + " ldr r0, ._159 + 16\n" + " strb r4, [r0]\n" + " bl debug_sub_815F788\n" + " bl debug_sub_815F7B4\n" + " ldr r1, ._159 + 20\n" + " ldr r0, ._159 + 24\n" + " str r0, [r1]\n" + " b ._161\n" + "._160:\n" + " .align 2, 0\n" + "._159:\n" + " .word _nakamuraData\n" + " .word gSaveBlock1\n" + " .word 0x1a08\n" + " .word _nakamuraData+0x1\n" + " .word _nakamuraData+0x2\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_815F930+1\n" + "._155:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._161 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._142:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_815FB1C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " ldr r0, ._162\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " ldr r0, ._162 + 4\n" + " strb r1, [r0]\n" + " ldr r1, ._162 + 8\n" + " ldr r0, ._162 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xc\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " bl debug_sub_815F72C\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xb\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x3\n" + " bl InitMenu\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._163:\n" + " .align 2, 0\n" + "._162:\n" + " .word _nakamuraData\n" + " .word _nakamuraData+0x3\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_815FA38+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815FB78() +{ + asm( + " push {lr}\n" + " ldr r0, ._166\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._164 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " b ._165\n" + "._167:\n" + " .align 2, 0\n" + "._166:\n" + " .word gMain\n" + "._164:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._168 @cond_branch\n" + " mov r0, #0x1\n" + "._165:\n" + " bl MoveMenuCursor\n" + " mov r0, #0x0\n" + " b ._177\n" + "._168:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._170 @cond_branch\n" + " bl CloseMenu\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._171 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._172 @cond_branch\n" + " b ._175\n" + "._171:\n" + " bl debug_sub_814A714\n" + " b ._175\n" + "._172:\n" + " bl ClearRoamerData\n" + " bl ClearRoamerLocationData\n" + " b ._175\n" + "._170:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._176 @cond_branch\n" + " mov r0, #0x0\n" + " b ._177\n" + "._176:\n" + " bl CloseMenu\n" + "._175:\n" + " mov r0, #0x1\n" + "._177:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_815FBE8() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " ldr r1, ._178\n" + " ldr r0, ._178 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " ldr r4, ._178 + 8\n" + " add r0, r4, #0\n" + " bl debug_sub_814A73C\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xb\n" + " mov r3, #0x9\n" + " bl MenuDrawTextWindow\n" + " add r0, r4, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._178 + 12\n" + " mov r1, #0x2\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xa\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x3\n" + " bl InitMenu\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._179:\n" + " .align 2, 0\n" + "._178:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_815FB78+1\n" + " .word gStringVar1\n" + " .word Str_843E580\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_815FC54() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r3, #0x0\n" + " ldr r7, ._181\n" + " mov r6, #0xe8\n" + " lsl r6, r6, #0x3\n" + " ldr r5, ._181 + 4\n" + " ldr r4, ._181 + 8\n" + "._180:\n" + " lsl r1, r3, #0x2\n" + " add r1, r1, r7\n" + " add r2, r3, #0\n" + " add r2, r2, #0x85\n" + " add r0, r1, r6\n" + " strh r2, [r0]\n" + " add r1, r1, r4\n" + " strh r5, [r1]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " cmp r3, #0x2a\n" + " bls ._180 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._182:\n" + " .align 2, 0\n" + "._181:\n" + " .word gSaveBlock1\n" + " .word 0x3e7\n" + " .word 0x742\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_815FC94() +{ + asm( + " push {lr}\n" + " bl ClearDecorationInventories\n" + " bl debug_sub_814A3A8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815FCB4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " mov r7, #0x0\n" + " ldr r5, ._188\n" + " ldr r0, [r5]\n" + " ldr r0, [r0, #0x4]\n" + " mov r1, #0x3\n" + " bl __divsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " add r1, r0, #0\n" + " mul r1, r1, r4\n" + " lsl r1, r1, #0x10\n" + " lsr r6, r1, #0x10\n" + " add r0, r6, r0\n" + " mov r9, r5\n" + " cmp r6, r0\n" + " bge ._183 @cond_branch\n" + " mov r8, r0\n" + "._187:\n" + " mov r4, #0x0\n" + " mov r1, r9\n" + " ldr r0, [r1]\n" + " ldr r0, [r0]\n" + " add r5, r6, #1\n" + " cmp r4, r0\n" + " bge ._184 @cond_branch\n" + " ldr r0, ._188\n" + " mov r9, r0\n" + "._186:\n" + " add r0, r4, #7\n" + " add r1, r6, #7\n" + " bl MapGridGetMetatileBehaviorAt\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl sub_805759C\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._185 @cond_branch\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r7, r0, #0x10\n" + "._185:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " ldr r0, ._188\n" + " ldr r0, [r0]\n" + " ldr r0, [r0]\n" + " cmp r4, r0\n" + " blt ._186 @cond_branch\n" + "._184:\n" + " lsl r0, r5, #0x10\n" + " lsr r6, r0, #0x10\n" + " cmp r6, r8\n" + " blt ._187 @cond_branch\n" + "._183:\n" + " add r0, r7, #0\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._189:\n" + " .align 2, 0\n" + "._188:\n" + " .word gMapHeader\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815FD40() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r6, #0x0\n" + " mov r4, sp\n" + " add r4, r4, #0x2\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " bl GetXYCoordsOneStepInFrontOfPlayer\n" + " mov r1, sp\n" + " mov r0, sp\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x7\n" + " strh r0, [r1]\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0x7\n" + " strh r0, [r4]\n" + " mov r5, #0x0\n" + " ldr r1, ._192\n" + " ldr r0, [r1]\n" + " ldr r0, [r0, #0x4]\n" + " add r7, r4, #0\n" + " cmp r6, r0\n" + " bge ._190 @cond_branch\n" + "._199:\n" + " mov r4, #0x0\n" + " ldr r0, [r1]\n" + " b ._191\n" + "._193:\n" + " .align 2, 0\n" + "._192:\n" + " .word gMapHeader\n" + "._198:\n" + " add r0, r4, #7\n" + " add r1, r5, #7\n" + " bl MapGridGetMetatileBehaviorAt\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl sub_805759C\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._196 @cond_branch\n" + " add r0, r6, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r6, r0, #0x10\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, r4\n" + " bne ._196 @cond_branch\n" + " mov r1, #0x0\n" + " ldsh r0, [r7, r1]\n" + " cmp r0, r5\n" + " bne ._196 @cond_branch\n" + " add r0, r6, #0\n" + " b ._197\n" + "._196:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " ldr r0, ._200\n" + " ldr r0, [r0]\n" + "._191:\n" + " ldr r0, [r0]\n" + " cmp r4, r0\n" + " blt ._198 @cond_branch\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " ldr r1, ._200\n" + " ldr r0, [r1]\n" + " ldr r0, [r0, #0x4]\n" + " cmp r5, r0\n" + " blt ._199 @cond_branch\n" + "._190:\n" + " add r0, r6, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + "._197:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._201:\n" + " .align 2, 0\n" + "._200:\n" + " .word gMapHeader\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815FDE4() +{ + asm( + " push {lr}\n" + " ldr r0, ._205\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._202 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._203 @cond_branch\n" + "._202:\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._204\n" + "._206:\n" + " .align 2, 0\n" + "._205:\n" + " .word gMain\n" + "._203:\n" + " mov r0, #0x0\n" + "._204:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_815FE1C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x10\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._210\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r6, ._210 + 4\n" + " mov r0, #0x0\n" + " bl debug_sub_815FCB4\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0x5\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " mov r0, #0x1\n" + " bl debug_sub_815FCB4\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0x5\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, #0x2\n" + " bl debug_sub_815FCB4\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0x5\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " bl debug_sub_8092344\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " mov r0, #0x1\n" + " bl debug_sub_8092344\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, #0x2\n" + " bl debug_sub_8092344\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r6, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r0, ._210 + 8\n" + " ldr r1, ._210 + 12\n" + " add r0, r0, r1\n" + " ldrh r0, [r0]\n" + " bl FeebasSeedRng\n" + " mov r0, #0x0\n" + " bl debug_sub_815FCB4\n" + " add r4, r0, #0\n" + " mov r0, #0x1\n" + " bl debug_sub_815FCB4\n" + " add r5, r0, #0\n" + " mov r0, #0x2\n" + " bl debug_sub_815FCB4\n" + " add r4, r4, r5\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x10\n" + " lsr r7, r0, #0x10\n" + " mov r5, #0x0\n" + "._209:\n" + " bl FeebasRandom\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " add r1, r7, #0\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r1, r0, #0x10\n" + " cmp r1, #0\n" + " bne ._207 @cond_branch\n" + " add r1, r7, #0\n" + "._207:\n" + " sub r0, r1, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0x2\n" + " bls ._208 @cond_branch\n" + " add r0, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r5, #0\n" + " mov r1, #0x3\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " lsl r4, r0, #0x2\n" + " add r4, r4, r0\n" + " add r4, r4, #0x2\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r5, #0\n" + " mov r1, #0x3\n" + " bl __udivsi3\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x19\n" + " mov r0, #0xb0\n" + " lsl r0, r0, #0x14\n" + " add r2, r2, r0\n" + " lsr r2, r2, #0x18\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " bl MenuPrint\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + "._208:\n" + " cmp r5, #0x6\n" + " bne ._209 @cond_branch\n" + " ldr r4, ._210 + 4\n" + " bl debug_sub_815FD40\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " ldr r1, ._210 + 16\n" + " ldr r0, ._210 + 20\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._211:\n" + " .align 2, 0\n" + "._210:\n" + " .word Str_843E58D\n" + " .word gStringVar1\n" + " .word gSaveBlock1\n" + " .word 0x2dd6\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_815FDE4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_815FFDC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " mov r0, #0xe\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x0\n" + " mov r1, #0xe\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._214\n" + " mov r1, #0x1\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " mov r5, #0x0\n" + " ldr r0, ._214 + 4\n" + " mov r8, r0\n" + "._216:\n" + " mov r0, #0x64\n" + " add r1, r5, #0\n" + " mul r1, r1, r0\n" + " ldr r0, ._214 + 8\n" + " add r6, r1, r0\n" + " add r0, r6, #0\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " lsl r1, r5, #0x2\n" + " mov r2, r8\n" + " add r4, r1, r2\n" + " strh r0, [r4]\n" + " lsl r0, r0, #0x10\n" + " add r7, r1, #0\n" + " cmp r0, #0\n" + " beq ._212 @cond_branch\n" + " add r0, r6, #0\n" + " mov r1, #0x38\n" + " bl GetMonData\n" + " strb r0, [r4, #0x2]\n" + " add r0, r5, #0\n" + " bl debug_sub_816009C\n" + " add r0, r5, #0\n" + " bl debug_sub_81600D0\n" + " add r0, r5, #0\n" + " bl debug_sub_816013C\n" + " b ._213\n" + "._215:\n" + " .align 2, 0\n" + "._214:\n" + " .word Str_843E5D4\n" + " .word _nakamuraStatic\n" + " .word gPlayerParty\n" + "._212:\n" + " mov r0, #0x1\n" + " strb r0, [r4, #0x2]\n" + "._213:\n" + " mov r0, r8\n" + " add r1, r7, r0\n" + " mov r0, #0x0\n" + " strb r0, [r1, #0x3]\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x5\n" + " bls ._216 @cond_branch\n" + " ldr r1, ._217\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " mov r0, #0xf\n" + " mov r1, #0x1\n" + " mov r2, #0xff\n" + " bl unref_sub_80F924C\n" + " ldr r1, ._217 + 4\n" + " ldr r0, ._217 + 8\n" + " str r0, [r1]\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._218:\n" + " .align 2, 0\n" + "._217:\n" + " .word _nakamuraData+0x4\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8160498+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_816009C() +{ + asm( + " push {lr}\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " ldr r1, ._219\n" + " lsl r0, r2, #0x2\n" + " add r0, r0, r1\n" + " mov r3, #0x0\n" + " ldsh r1, [r0, r3]\n" + " mov r0, #0xb\n" + " mul r0, r0, r1\n" + " ldr r1, ._219 + 4\n" + " add r0, r0, r1\n" + " lsl r2, r2, #0x1\n" + " add r2, r2, #0x1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r1, #0x10\n" + " bl MenuPrint\n" + " pop {r0}\n" + " bx r0\n" + "._220:\n" + " .align 2, 0\n" + "._219:\n" + " .word _nakamuraStatic\n" + " .word gSpeciesNames\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_81600D0() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r5, r4, #0\n" + " ldr r1, ._223\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " bl memcpy\n" + " mov r0, #0x64\n" + " mul r0, r0, r4\n" + " ldr r1, ._223 + 4\n" + " add r0, r0, r1\n" + " bl GetMonGender\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._221 @cond_branch\n" + " ldr r0, ._223 + 8\n" + " b ._222\n" + "._224:\n" + " .align 2, 0\n" + "._223:\n" + " .word Str_843E5F0\n" + " .word gPlayerParty\n" + " .word gOtherText_MaleSymbol2\n" + "._221:\n" + " cmp r0, #0xfe\n" + " bne ._225 @cond_branch\n" + " ldr r0, ._227\n" + "._222:\n" + " lsl r2, r4, #0x1\n" + " add r2, r2, #0x1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r1, #0x17\n" + " bl MenuPrint\n" + " b ._226\n" + "._228:\n" + " .align 2, 0\n" + "._227:\n" + " .word gOtherText_FemaleSymbolAndLv\n" + "._225:\n" + " lsl r2, r5, #0x1\n" + " add r2, r2, #0x1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r0, sp\n" + " mov r1, #0x17\n" + " bl MenuPrint\n" + "._226:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_816013C() +{ + asm( + " push {r4, r5, lr}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r5, ._229\n" + " ldr r1, ._229 + 4\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r1\n" + " mov r1, #0x2\n" + " ldrsb r1, [r0, r1]\n" + " add r0, r5, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " lsl r4, r4, #0x1\n" + " add r4, r4, #0x1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r5, #0\n" + " mov r1, #0x1a\n" + " add r2, r4, #0\n" + " bl MenuPrint\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._230:\n" + " .align 2, 0\n" + "._229:\n" + " .word gStringVar1\n" + " .word _nakamuraStatic\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_816017C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " lsl r3, r4, #0x1\n" + " add r1, r3, #1\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r3, r3, #0x2\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x10\n" + " mov r2, #0x1c\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r1, ._232\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0\n" + " beq ._231 @cond_branch\n" + " add r0, r4, #0\n" + " bl debug_sub_816009C\n" + " add r0, r4, #0\n" + " bl debug_sub_81600D0\n" + " add r0, r4, #0\n" + " bl debug_sub_816013C\n" + "._231:\n" + " mov r0, #0x5\n" + " bl debug_sub_81603B8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._233:\n" + " .align 2, 0\n" + "._232:\n" + " .word _nakamuraStatic\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_81601C8() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffff0\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r1, ._239\n" + " lsl r0, r5, #0x2\n" + " add r2, r0, r1\n" + " mov r4, #0x0\n" + " ldsh r0, [r2, r4]\n" + " cmp r0, #0\n" + " bne ._236 @cond_branch\n" + " ldrb r0, [r2, #0x3]\n" + " cmp r0, #0\n" + " bne ._236 @cond_branch\n" + " cmp r3, #0x1\n" + " bne ._236 @cond_branch\n" + " mov r0, #0x8a\n" + " lsl r0, r0, #0x1\n" + " strh r0, [r2]\n" + "._236:\n" + " lsl r0, r5, #0x2\n" + " add r4, r0, r1\n" + " lsl r0, r3, #0x18\n" + " asr r0, r0, #0x18\n" + " ldrh r1, [r4]\n" + " add r2, r0, r1\n" + " mov r3, #0x0\n" + " strh r2, [r4]\n" + " lsl r1, r2, #0x10\n" + " mov r0, #0xcd\n" + " lsl r0, r0, #0x11\n" + " cmp r1, r0\n" + " ble ._237 @cond_branch\n" + " ldr r1, ._239 + 4\n" + " add r0, r2, r1\n" + " strh r0, [r4]\n" + "._237:\n" + " ldrh r1, [r4]\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " cmp r0, #0\n" + " bge ._238 @cond_branch\n" + " ldr r2, ._239 + 8\n" + " add r0, r1, r2\n" + " strh r0, [r4]\n" + "._238:\n" + " mov r0, #0x64\n" + " mul r0, r0, r5\n" + " ldr r1, ._239 + 12\n" + " add r0, r0, r1\n" + " ldrh r1, [r4]\n" + " ldrb r2, [r4, #0x2]\n" + " str r3, [sp]\n" + " str r3, [sp, #0x4]\n" + " str r3, [sp, #0x8]\n" + " str r3, [sp, #0xc]\n" + " mov r3, #0x20\n" + " bl CreateMon\n" + " mov r0, #0x1\n" + " strb r0, [r4, #0x3]\n" + " add sp, sp, #0x10\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._240:\n" + " .align 2, 0\n" + "._239:\n" + " .word _nakamuraStatic\n" + " .word 0xfffffe65\n" + " .word 0x19b\n" + " .word gPlayerParty\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160258() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " ldr r1, ._242\n" + " lsl r0, r2, #0x2\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0\n" + " beq ._241 @cond_branch\n" + " add r0, r2, #0\n" + " bl debug_sub_816062C\n" + "._241:\n" + " pop {r0}\n" + " bx r0\n" + "._243:\n" + " .align 2, 0\n" + "._242:\n" + " .word _nakamuraStatic\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_816027C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r4, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r2, r1, #0x18\n" + " ldr r1, ._247\n" + " lsl r0, r4, #0x2\n" + " add r3, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r3, r1]\n" + " cmp r0, #0\n" + " beq ._244 @cond_branch\n" + " lsl r0, r2, #0x18\n" + " asr r0, r0, #0x18\n" + " ldrb r1, [r3, #0x2]\n" + " add r0, r0, r1\n" + " strb r0, [r3, #0x2]\n" + " lsl r0, r0, #0x18\n" + " asr r0, r0, #0x18\n" + " cmp r0, #0x64\n" + " ble ._245 @cond_branch\n" + " mov r0, #0x1\n" + " strb r0, [r3, #0x2]\n" + "._245:\n" + " mov r0, #0x2\n" + " ldrsb r0, [r3, r0]\n" + " cmp r0, #0\n" + " bgt ._246 @cond_branch\n" + " mov r0, #0x64\n" + " strb r0, [r3, #0x2]\n" + "._246:\n" + " mov r0, #0x64\n" + " mul r4, r4, r0\n" + " ldr r0, ._247 + 4\n" + " add r4, r4, r0\n" + " ldr r2, ._247 + 8\n" + " mov r0, #0x0\n" + " ldsh r1, [r3, r0]\n" + " lsl r0, r1, #0x3\n" + " sub r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrb r1, [r0, #0x13]\n" + " mov r0, #0xca\n" + " lsl r0, r0, #0x1\n" + " add r2, r1, #0\n" + " mul r2, r2, r0\n" + " mov r0, #0x2\n" + " ldrsb r0, [r3, r0]\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._247 + 12\n" + " add r0, r0, r1\n" + " add r2, r2, r0\n" + " add r0, r4, #0\n" + " mov r1, #0x19\n" + " bl SetMonData\n" + " add r0, r4, #0\n" + " bl debug_sub_803F55C\n" + "._244:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._248:\n" + " .align 2, 0\n" + "._247:\n" + " .word _nakamuraStatic\n" + " .word gPlayerParty\n" + " .word gBaseStats\n" + " .word gExperienceTables\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160308() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add sp, sp, #0xffffff8c\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " mov r2, #0x0\n" + "._252:\n" + " add r1, r2, #1\n" + " lsl r0, r1, #0x18\n" + " lsr r5, r0, #0x18\n" + " mov r8, r1\n" + " cmp r5, #0x5\n" + " bhi ._249 @cond_branch\n" + " mov r0, #0x64\n" + " mov r9, r0\n" + " mov r0, r9\n" + " mul r0, r0, r2\n" + " ldr r7, ._254\n" + " add r6, r0, r7\n" + "._251:\n" + " add r0, r6, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " bne ._250 @cond_branch\n" + " add r0, sp, #0x10\n" + " add r1, r6, #0\n" + " mov r2, #0x64\n" + " bl memcpy\n" + " mov r4, r9\n" + " mul r4, r4, r5\n" + " add r4, r4, r7\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " mov r2, #0x64\n" + " bl memcpy\n" + " add r0, r4, #0\n" + " add r1, sp, #0x10\n" + " mov r2, #0x64\n" + " bl memcpy\n" + "._250:\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x5\n" + " bls ._251 @cond_branch\n" + "._249:\n" + " mov r1, r8\n" + " lsl r0, r1, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x4\n" + " bls ._252 @cond_branch\n" + " bl CalculatePlayerPartyCount\n" + " ldr r4, ._254 + 4\n" + " ldrb r1, [r4]\n" + " cmp r1, #0\n" + " bne ._253 @cond_branch\n" + " ldr r0, ._254\n" + " str r1, [sp]\n" + " str r1, [sp, #0x4]\n" + " str r1, [sp, #0x8]\n" + " str r1, [sp, #0xc]\n" + " mov r1, #0x1\n" + " mov r2, #0xa\n" + " mov r3, #0x20\n" + " bl CreateMon\n" + " mov r0, #0x1\n" + " strb r0, [r4]\n" + "._253:\n" + " add sp, sp, #0x74\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._255:\n" + " .align 2, 0\n" + "._254:\n" + " .word gPlayerParty\n" + " .word gPlayerPartyCount\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_81603B8() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r7, ._259\n" + " ldrb r4, [r7]\n" + " add r0, r4, #0\n" + " mov r1, #0x6\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " add r0, r4, #0\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._259 + 4\n" + " add r0, r5, r0\n" + " ldrb r2, [r0]\n" + " lsl r3, r4, #0x1\n" + " add r1, r3, #1\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r3, r3, #0x2\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " add r0, r2, #0\n" + " bl MenuFillWindowRectWithBlankTile\n" + " cmp r6, #0\n" + " bne ._256 @cond_branch\n" + " cmp r4, #0\n" + " beq ._257 @cond_branch\n" + " ldrb r0, [r7]\n" + " sub r0, r0, #0x1\n" + " b ._258\n" + "._260:\n" + " .align 2, 0\n" + "._259:\n" + " .word _nakamuraData+0x4\n" + " .word _843E5D1\n" + "._257:\n" + " lsl r0, r5, #0x1\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, #0x5\n" + "._258:\n" + " strb r0, [r7]\n" + "._256:\n" + " ldr r1, ._264\n" + " cmp r6, #0x1\n" + " bne ._261 @cond_branch\n" + " cmp r4, #0x5\n" + " beq ._262 @cond_branch\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " b ._263\n" + "._265:\n" + " .align 2, 0\n" + "._264:\n" + " .word _nakamuraData+0x4\n" + "._262:\n" + " lsl r0, r5, #0x1\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x1\n" + "._263:\n" + " strb r0, [r1]\n" + "._261:\n" + " cmp r6, #0x2\n" + " bne ._266 @cond_branch\n" + " cmp r5, #0\n" + " beq ._267 @cond_branch\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x6\n" + " b ._268\n" + "._267:\n" + " add r0, r4, #0\n" + " add r0, r0, #0xc\n" + "._268:\n" + " strb r0, [r1]\n" + "._266:\n" + " cmp r6, #0x3\n" + " bne ._271 @cond_branch\n" + " cmp r5, #0x2\n" + " beq ._270 @cond_branch\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x6\n" + " strb r0, [r1]\n" + " b ._271\n" + "._270:\n" + " strb r4, [r1]\n" + "._271:\n" + " ldrb r4, [r1]\n" + " add r0, r4, #0\n" + " mov r1, #0x6\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " add r0, r4, #0\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " ldr r0, ._272\n" + " add r0, r5, r0\n" + " ldrb r0, [r0]\n" + " lsr r1, r1, #0x17\n" + " add r1, r1, #0x1\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r2, #0xff\n" + " bl unref_sub_80F924C\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._273:\n" + " .align 2, 0\n" + "._272:\n" + " .word _843E5D1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160498() +{ + asm( + " push {r4, lr}\n" + " ldr r1, ._276\n" + " ldrh r2, [r1, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._274 @cond_branch\n" + " mov r0, #0x0\n" + " b ._281\n" + "._277:\n" + " .align 2, 0\n" + "._276:\n" + " .word gMain\n" + "._274:\n" + " mov r0, #0x80\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._278 @cond_branch\n" + " mov r0, #0x1\n" + " b ._281\n" + "._278:\n" + " mov r0, #0x20\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._280 @cond_branch\n" + " mov r0, #0x2\n" + " b ._281\n" + "._280:\n" + " mov r0, #0x10\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._282 @cond_branch\n" + " mov r0, #0x3\n" + "._281:\n" + " bl debug_sub_81603B8\n" + " mov r0, #0x0\n" + " b ._311\n" + "._282:\n" + " ldrh r1, [r1, #0x30]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._284 @cond_branch\n" + " ldr r4, ._289\n" + " ldrb r0, [r4]\n" + " cmp r0, #0x5\n" + " bhi ._285 @cond_branch\n" + " mov r1, #0x1\n" + " bl debug_sub_81601C8\n" + "._285:\n" + " ldrb r0, [r4]\n" + " sub r0, r0, #0x6\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bhi ._286 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8160258\n" + "._286:\n" + " ldrb r0, [r4]\n" + " sub r0, r0, #0xc\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bhi ._306 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " b ._300\n" + "._290:\n" + " .align 2, 0\n" + "._289:\n" + " .word _nakamuraData+0x4\n" + "._284:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._291 @cond_branch\n" + " ldr r4, ._294\n" + " ldrb r0, [r4]\n" + " cmp r0, #0x5\n" + " bhi ._304 @cond_branch\n" + " mov r1, #0x1\n" + " neg r1, r1\n" + " b ._293\n" + "._295:\n" + " .align 2, 0\n" + "._294:\n" + " .word _nakamuraData+0x4\n" + "._291:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._296 @cond_branch\n" + " ldr r4, ._301\n" + " ldrb r0, [r4]\n" + " cmp r0, #0x5\n" + " bhi ._297 @cond_branch\n" + " mov r1, #0xa\n" + " bl debug_sub_81601C8\n" + "._297:\n" + " ldrb r0, [r4]\n" + " sub r0, r0, #0x6\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bhi ._298 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8160258\n" + "._298:\n" + " ldrb r0, [r4]\n" + " sub r0, r0, #0xc\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bhi ._306 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " b ._300\n" + "._302:\n" + " .align 2, 0\n" + "._301:\n" + " .word _nakamuraData+0x4\n" + "._296:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._303 @cond_branch\n" + " ldr r4, ._308\n" + " ldrb r0, [r4]\n" + " cmp r0, #0x5\n" + " bhi ._304 @cond_branch\n" + " mov r1, #0xa\n" + " neg r1, r1\n" + "._293:\n" + " bl debug_sub_81601C8\n" + "._304:\n" + " ldrb r0, [r4]\n" + " sub r0, r0, #0x6\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bhi ._305 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8160258\n" + "._305:\n" + " ldrb r0, [r4]\n" + " sub r0, r0, #0xc\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bhi ._306 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " neg r1, r1\n" + "._300:\n" + " bl debug_sub_816027C\n" + "._306:\n" + " ldrb r0, [r4]\n" + " mov r1, #0x6\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_816017C\n" + " mov r0, #0x0\n" + " b ._311\n" + "._309:\n" + " .align 2, 0\n" + "._308:\n" + " .word _nakamuraData+0x4\n" + "._303:\n" + " mov r0, #0x8\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._310 @cond_branch\n" + " mov r0, #0x0\n" + " b ._311\n" + "._310:\n" + " bl debug_sub_8160308\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._311:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_816062C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add sp, sp, #0xfffffff0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " mov r0, #0x64\n" + " mov r4, r8\n" + " mul r4, r4, r0\n" + " ldr r0, ._316\n" + " add r4, r4, r0\n" + " add r0, r4, #0\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " lsl r0, r0, #0x10\n" + " lsr r7, r0, #0x10\n" + " add r0, r4, #0\n" + " bl GetMonGender\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " ldr r1, ._316 + 4\n" + " lsl r0, r7, #0x3\n" + " sub r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldrb r6, [r0, #0x10]\n" + " cmp r6, #0\n" + " beq ._313 @cond_branch\n" + " cmp r6, #0xfe\n" + " beq ._313 @cond_branch\n" + " cmp r6, #0xff\n" + " bne ._314 @cond_branch\n" + "._313:\n" + " mov r0, #0x64\n" + " mov r1, r8\n" + " mul r1, r1, r0\n" + " add r0, r1, #0\n" + " ldr r1, ._316\n" + " add r0, r0, r1\n" + " bl GetMonGender\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._320\n" + "._317:\n" + " .align 2, 0\n" + "._316:\n" + " .word gPlayerParty\n" + " .word gBaseStats\n" + "._314:\n" + " cmp r2, #0\n" + " beq ._318 @cond_branch\n" + " cmp r2, #0xfe\n" + " beq ._319 @cond_branch\n" + " mov r0, #0x0\n" + " b ._320\n" + "._318:\n" + " mov r6, #0xfe\n" + " b ._321\n" + "._319:\n" + " mov r6, #0x0\n" + "._321:\n" + " mov r0, r8\n" + " lsl r0, r0, #0x2\n" + " mov r9, r0\n" + "._322:\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " orr r5, r5, r0\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " bl GetGenderFromSpeciesAndPersonality\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, r6\n" + " bne ._322 @cond_branch\n" + " mov r0, #0x64\n" + " mov r4, r8\n" + " mul r4, r4, r0\n" + " ldr r0, ._323\n" + " add r4, r4, r0\n" + " add r0, r4, #0\n" + " mov r1, #0x42\n" + " bl GetMonData\n" + " ldr r0, ._323 + 4\n" + " add r0, r0, r9\n" + " ldrh r1, [r0]\n" + " ldrb r2, [r0, #0x2]\n" + " mov r0, #0x1\n" + " str r0, [sp]\n" + " str r5, [sp, #0x4]\n" + " mov r0, #0x0\n" + " str r0, [sp, #0x8]\n" + " str r0, [sp, #0xc]\n" + " add r0, r4, #0\n" + " mov r3, #0x20\n" + " bl CreateMon\n" + " add r0, r6, #0\n" + "._320:\n" + " add sp, sp, #0x10\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._324:\n" + " .align 2, 0\n" + "._323:\n" + " .word gPlayerParty\n" + " .word _nakamuraStatic\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160714() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add sp, sp, #0xfffffff0\n" + " add r6, r0, #0\n" + " mov r9, r1\n" + " mov r7, #0x0\n" + " mov r0, #0x0\n" + " mov r8, r0\n" + " mov r2, #0x0\n" + " mov r5, #0x0\n" + "._329:\n" + " add r4, r5, #1\n" + " lsl r1, r4, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r0, r9\n" + " str r2, [sp, #0xc]\n" + " bl sub_810CA9C\n" + " add r1, r0, #0\n" + " lsl r0, r5, #0x1\n" + " add r0, r0, sp\n" + " strh r1, [r0]\n" + " ldr r2, [sp, #0xc]\n" + " cmp r5, #0x5\n" + " beq ._328 @cond_branch\n" + " lsl r0, r1, #0x10\n" + " asr r1, r0, #0x10\n" + " cmp r1, #0\n" + " ble ._326 @cond_branch\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._326:\n" + " cmp r1, #0\n" + " bge ._327 @cond_branch\n" + " mov r0, r8\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + "._327:\n" + " cmp r1, #0\n" + " bne ._328 @cond_branch\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + "._328:\n" + " lsl r0, r4, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x5\n" + " bls ._329 @cond_branch\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x31\n" + " bgt ._333 @cond_branch\n" + " mov r0, sp\n" + " ldrh r0, [r0, #0x2]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " cmp r0, #0x31\n" + " bgt ._333 @cond_branch\n" + " mov r0, sp\n" + " mov r4, #0x4\n" + " ldsh r0, [r0, r4]\n" + " cmp r0, #0x31\n" + " bgt ._333 @cond_branch\n" + " mov r0, sp\n" + " mov r1, #0x6\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x31\n" + " bgt ._333 @cond_branch\n" + " mov r0, sp\n" + " mov r4, #0x8\n" + " ldsh r0, [r0, r4]\n" + " cmp r0, #0x31\n" + " ble ._334 @cond_branch\n" + "._333:\n" + " ldr r1, ._336\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0xe\n" + " b ._400\n" + "._337:\n" + " .align 2, 0\n" + "._336:\n" + " .word ContestStatsText_GoldPokeBlock\n" + "._334:\n" + " cmp r7, #0x4\n" + " bne ._338 @cond_branch\n" + " ldr r1, ._340\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0xd\n" + " b ._400\n" + "._341:\n" + " .align 2, 0\n" + "._340:\n" + " .word ContestStatsText_WhitePokeBlock\n" + "._338:\n" + " mov r3, #0x0\n" + " mov r5, #0x0\n" + "._343:\n" + " lsl r0, r5, #0x1\n" + " add r0, r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0x2\n" + " bne ._342 @cond_branch\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + "._342:\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x4\n" + " bls ._343 @cond_branch\n" + " cmp r3, #0x3\n" + " beq ._345 @cond_branch\n" + " cmp r2, #0x5\n" + " beq ._345 @cond_branch\n" + " mov r4, r8\n" + " cmp r4, #0x4\n" + " bne ._346 @cond_branch\n" + "._345:\n" + " ldr r1, ._348\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0xc\n" + " b ._400\n" + "._349:\n" + " .align 2, 0\n" + "._348:\n" + " .word ContestStatsText_BlackPokeBlock\n" + "._346:\n" + " cmp r7, #0x3\n" + " bne ._350 @cond_branch\n" + " ldr r1, ._352\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0xb\n" + " b ._400\n" + "._353:\n" + " .align 2, 0\n" + "._352:\n" + " .word ContestStatsText_GrayPokeBlock\n" + "._350:\n" + " cmp r7, #0x2\n" + " beq ._354 @cond_branch\n" + " mov r0, r8\n" + " cmp r0, #0x2\n" + " bne ._377 @cond_branch\n" + "._354:\n" + " mov r3, #0x6\n" + " mov r2, #0x0\n" + " mov r5, #0x0\n" + "._359:\n" + " lsl r0, r5, #0x1\n" + " add r0, r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0\n" + " beq ._358 @cond_branch\n" + " cmp r3, #0x6\n" + " bne ._357 @cond_branch\n" + " add r3, r5, #0\n" + " b ._358\n" + "._357:\n" + " add r2, r5, #0\n" + "._358:\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x4\n" + " bls ._359 @cond_branch\n" + " lsl r0, r3, #0x1\n" + " mov r4, sp\n" + " add r1, r4, r0\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, sp\n" + " mov r4, #0x0\n" + " ldsh r1, [r1, r4]\n" + " mov r4, #0x0\n" + " ldsh r0, [r0, r4]\n" + " cmp r1, r0\n" + " blt ._360 @cond_branch\n" + " add r2, r3, #0\n" + "._360:\n" + " cmp r2, #0\n" + " bne ._361 @cond_branch\n" + " ldr r1, ._363\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x6\n" + " b ._400\n" + "._364:\n" + " .align 2, 0\n" + "._363:\n" + " .word ContestStatsText_PurplePokeBlock\n" + "._361:\n" + " cmp r2, #0x1\n" + " bne ._365 @cond_branch\n" + " ldr r1, ._367\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x7\n" + " b ._400\n" + "._368:\n" + " .align 2, 0\n" + "._367:\n" + " .word ContestStatsText_IndigoPokeBlock\n" + "._365:\n" + " cmp r2, #0x2\n" + " bne ._369 @cond_branch\n" + " ldr r1, ._371\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x8\n" + " b ._400\n" + "._372:\n" + " .align 2, 0\n" + "._371:\n" + " .word ContestStatsText_BrownPokeBlock\n" + "._369:\n" + " cmp r2, #0x3\n" + " bne ._373 @cond_branch\n" + " ldr r1, ._375\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x9\n" + " b ._400\n" + "._376:\n" + " .align 2, 0\n" + "._375:\n" + " .word ContestStatsText_LiteBluePokeBlock\n" + "._373:\n" + " cmp r2, #0x4\n" + " bne ._377 @cond_branch\n" + " ldr r1, ._379\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0xa\n" + " b ._400\n" + "._380:\n" + " .align 2, 0\n" + "._379:\n" + " .word ContestStatsText_OlivePokeBlock\n" + "._377:\n" + " cmp r7, #0x1\n" + " beq ._381 @cond_branch\n" + " mov r0, r8\n" + " cmp r0, #0x1\n" + " bne ._399 @cond_branch\n" + "._381:\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0\n" + " beq ._383 @cond_branch\n" + " ldr r1, ._385\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x1\n" + " b ._400\n" + "._386:\n" + " .align 2, 0\n" + "._385:\n" + " .word ContestStatsText_RedPokeBlock\n" + "._383:\n" + " mov r0, sp\n" + " ldrh r0, [r0, #0x2]\n" + " cmp r0, #0\n" + " beq ._387 @cond_branch\n" + " ldr r1, ._389\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x2\n" + " b ._400\n" + "._390:\n" + " .align 2, 0\n" + "._389:\n" + " .word ContestStatsText_BluePokeBlock\n" + "._387:\n" + " mov r0, sp\n" + " mov r4, #0x4\n" + " ldsh r0, [r0, r4]\n" + " cmp r0, #0\n" + " beq ._391 @cond_branch\n" + " ldr r1, ._393\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x3\n" + " b ._400\n" + "._394:\n" + " .align 2, 0\n" + "._393:\n" + " .word ContestStatsText_PinkPokeBlock\n" + "._391:\n" + " mov r0, sp\n" + " mov r1, #0x6\n" + " ldsh r0, [r0, r1]\n" + " cmp r0, #0\n" + " beq ._395 @cond_branch\n" + " ldr r1, ._397\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x4\n" + " b ._400\n" + "._398:\n" + " .align 2, 0\n" + "._397:\n" + " .word ContestStatsText_GreenPokeBlock\n" + "._395:\n" + " mov r0, sp\n" + " mov r4, #0x8\n" + " ldsh r0, [r0, r4]\n" + " cmp r0, #0\n" + " beq ._399 @cond_branch\n" + " ldr r1, ._401\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x5\n" + " b ._400\n" + "._402:\n" + " .align 2, 0\n" + "._401:\n" + " .word ContestStatsText_YellowPokeBlock\n" + "._399:\n" + " ldr r1, ._403\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " mov r0, #0x0\n" + "._400:\n" + " add sp, sp, #0x10\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._404:\n" + " .align 2, 0\n" + "._403:\n" + " .word gOtherText_FiveQuestions\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_816097C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add r7, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r5, r1, #0x10\n" + " mov r6, #0x0\n" + " mov r1, #0x0\n" + "._405:\n" + " add r0, r7, r6\n" + " strb r1, [r0]\n" + " add r0, r6, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " cmp r6, #0x3\n" + " bls ._405 @cond_branch\n" + " mov r0, #0xff\n" + " strb r0, [r7, #0x4]\n" + " lsl r0, r5, #0x10\n" + " asr r0, r0, #0x10\n" + " cmp r0, #0\n" + " bne ._406 @cond_branch\n" + " mov r0, #0xa1\n" + " strb r0, [r7, #0x3]\n" + " b ._414\n" + "._406:\n" + " cmp r0, #0\n" + " ble ._408 @cond_branch\n" + " mov r4, #0x64\n" + " mov r0, #0x0\n" + " mov r8, r0\n" + " mov r6, #0x0\n" + "._412:\n" + " lsl r5, r5, #0x10\n" + " asr r0, r5, #0x10\n" + " lsl r4, r4, #0x10\n" + " asr r1, r4, #0x10\n" + " bl __divsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " mov r1, r8\n" + " cmp r1, #0\n" + " bne ._410 @cond_branch\n" + " cmp r6, #0x2\n" + " beq ._410 @cond_branch\n" + " cmp r2, #0\n" + " beq ._411 @cond_branch\n" + "._410:\n" + " add r1, r6, r7\n" + " add r0, r2, #0\n" + " sub r0, r0, #0x5f\n" + " strb r0, [r1, #0x1]\n" + " mov r0, #0x1\n" + " mov r8, r0\n" + "._411:\n" + " asr r0, r5, #0x10\n" + " asr r4, r4, #0x10\n" + " add r1, r4, #0\n" + " bl __modsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " add r0, r4, #0\n" + " mov r1, #0xa\n" + " bl __divsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " add r0, r6, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " cmp r6, #0x2\n" + " bls ._412 @cond_branch\n" + " b ._414\n" + "._408:\n" + " cmp r0, #0\n" + " bge ._414 @cond_branch\n" + " neg r0, r0\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " mov r4, #0x64\n" + " mov r1, #0x0\n" + " mov r8, r1\n" + " mov r6, #0x0\n" + "._419:\n" + " lsl r5, r5, #0x10\n" + " asr r0, r5, #0x10\n" + " lsl r4, r4, #0x10\n" + " asr r1, r4, #0x10\n" + " bl __divsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " mov r1, r8\n" + " lsl r0, r1, #0x10\n" + " add r3, r0, #0\n" + " cmp r3, #0\n" + " bne ._416 @cond_branch\n" + " cmp r6, #0x2\n" + " beq ._416 @cond_branch\n" + " cmp r2, #0\n" + " beq ._417 @cond_branch\n" + "._416:\n" + " add r1, r6, r7\n" + " add r0, r2, #0\n" + " sub r0, r0, #0x5f\n" + " strb r0, [r1, #0x1]\n" + " cmp r3, #0\n" + " bne ._418 @cond_branch\n" + " mov r0, #0xae\n" + " strb r0, [r1]\n" + "._418:\n" + " mov r0, #0x1\n" + " mov r8, r0\n" + "._417:\n" + " asr r0, r5, #0x10\n" + " asr r4, r4, #0x10\n" + " add r1, r4, #0\n" + " bl __modsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " add r0, r4, #0\n" + " mov r1, #0xa\n" + " bl __divsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " add r0, r6, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " cmp r6, #0x2\n" + " bls ._419 @cond_branch\n" + "._414:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160A80() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r2, r0, #0\n" + " ldr r1, ._422\n" + " cmp r0, #0\n" + " bne ._420 @cond_branch\n" + " ldr r4, ._422 + 4\n" + " ldrb r1, [r1, #0x1]\n" + " add r0, r4, #0\n" + " bl debug_sub_816097C\n" + " add r0, r4, #0\n" + " mov r1, #0x8\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " b ._440\n" + "._423:\n" + " .align 2, 0\n" + "._422:\n" + " .word _nakamuraStatic+0x18\n" + " .word gStringVar1\n" + "._420:\n" + " cmp r0, #0x1\n" + " bne ._424 @cond_branch\n" + " ldr r4, ._426\n" + " ldrb r1, [r1, #0x2]\n" + " add r0, r4, #0\n" + " bl debug_sub_816097C\n" + " add r0, r4, #0\n" + " mov r1, #0x8\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " b ._440\n" + "._427:\n" + " .align 2, 0\n" + "._426:\n" + " .word gStringVar1\n" + "._424:\n" + " cmp r0, #0x2\n" + " bne ._428 @cond_branch\n" + " ldr r4, ._430\n" + " ldrb r1, [r1, #0x3]\n" + " add r0, r4, #0\n" + " bl debug_sub_816097C\n" + " add r0, r4, #0\n" + " mov r1, #0x8\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " b ._440\n" + "._431:\n" + " .align 2, 0\n" + "._430:\n" + " .word gStringVar1\n" + "._428:\n" + " cmp r0, #0x3\n" + " bne ._432 @cond_branch\n" + " ldr r4, ._434\n" + " ldrb r1, [r1, #0x4]\n" + " add r0, r4, #0\n" + " bl debug_sub_816097C\n" + " add r0, r4, #0\n" + " mov r1, #0x8\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " b ._440\n" + "._435:\n" + " .align 2, 0\n" + "._434:\n" + " .word gStringVar1\n" + "._432:\n" + " cmp r0, #0x4\n" + " bne ._436 @cond_branch\n" + " ldr r4, ._438\n" + " ldrb r1, [r1, #0x5]\n" + " add r0, r4, #0\n" + " bl debug_sub_816097C\n" + " add r0, r4, #0\n" + " mov r1, #0x8\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " b ._440\n" + "._439:\n" + " .align 2, 0\n" + "._438:\n" + " .word gStringVar1\n" + "._436:\n" + " cmp r2, #0x5\n" + " bne ._440 @cond_branch\n" + " ldr r4, ._441\n" + " ldrb r1, [r1, #0x6]\n" + " add r0, r4, #0\n" + " bl debug_sub_816097C\n" + " add r0, r4, #0\n" + " mov r1, #0x8\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + "._440:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._442:\n" + " .align 2, 0\n" + "._441:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160B50() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r3, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r4, r1, #0\n" + " ldr r2, ._445\n" + " cmp r0, #0\n" + " bne ._443 @cond_branch\n" + " ldrb r0, [r2, #0x1]\n" + " add r0, r0, r1\n" + " strb r0, [r2, #0x1]\n" + " b ._455\n" + "._446:\n" + " .align 2, 0\n" + "._445:\n" + " .word _nakamuraStatic+0x18\n" + "._443:\n" + " cmp r0, #0x1\n" + " bne ._447 @cond_branch\n" + " ldrb r0, [r2, #0x2]\n" + " add r0, r0, r1\n" + " strb r0, [r2, #0x2]\n" + " b ._455\n" + "._447:\n" + " cmp r0, #0x2\n" + " bne ._449 @cond_branch\n" + " ldrb r0, [r2, #0x3]\n" + " add r0, r0, r1\n" + " strb r0, [r2, #0x3]\n" + " b ._455\n" + "._449:\n" + " cmp r0, #0x3\n" + " bne ._451 @cond_branch\n" + " ldrb r0, [r2, #0x4]\n" + " add r0, r0, r1\n" + " strb r0, [r2, #0x4]\n" + " b ._455\n" + "._451:\n" + " cmp r0, #0x4\n" + " bne ._453 @cond_branch\n" + " ldrb r0, [r2, #0x5]\n" + " add r0, r0, r1\n" + " strb r0, [r2, #0x5]\n" + " b ._455\n" + "._453:\n" + " cmp r3, #0x5\n" + " bne ._455 @cond_branch\n" + " ldrb r0, [r2, #0x6]\n" + " add r0, r0, r4\n" + " strb r0, [r2, #0x6]\n" + "._455:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160BB0() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r5, ._456\n" + " ldr r4, ._456 + 4\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " bl debug_sub_8160714\n" + " strb r0, [r4]\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._457:\n" + " .align 2, 0\n" + "._456:\n" + " .word gStringVar1\n" + " .word _nakamuraStatic+0x18\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160BE4() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xc\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " bl debug_sub_8160BB0\n" + " ldr r0, ._459\n" + " mov r1, #0x2\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r0, ._459 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " ldr r0, ._459 + 8\n" + " mov r1, #0x2\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r0, ._459 + 12\n" + " mov r1, #0x2\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " ldr r0, ._459 + 16\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " ldr r0, ._459 + 20\n" + " mov r1, #0x2\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " mov r4, #0x0\n" + "._458:\n" + " add r0, r4, #0\n" + " bl debug_sub_8160A80\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x5\n" + " bls ._458 @cond_branch\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xb\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._460:\n" + " .align 2, 0\n" + "._459:\n" + " .word gContestStatsText_Spicy\n" + " .word gContestStatsText_Dry\n" + " .word gContestStatsText_Sweet\n" + " .word gContestStatsText_Bitter\n" + " .word gContestStatsText_Sour\n" + " .word gContestStatsText_Tasty\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160C7C() +{ + asm( + " push {r4, lr}\n" + " ldr r2, ._469\n" + " mov r1, #0x0\n" + " ldrb r0, [r2]\n" + " cmp r0, #0xc\n" + " bne ._467 @cond_branch\n" + " ldrb r0, [r2, #0x1]\n" + " cmp r0, #0x2\n" + " bne ._462 @cond_branch\n" + " mov r1, #0x1\n" + "._462:\n" + " ldrb r0, [r2, #0x3]\n" + " cmp r0, #0x2\n" + " bne ._463 @cond_branch\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + "._463:\n" + " ldrb r0, [r2, #0x4]\n" + " cmp r0, #0x2\n" + " bne ._464 @cond_branch\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + "._464:\n" + " ldrb r0, [r2, #0x2]\n" + " cmp r0, #0x2\n" + " bne ._465 @cond_branch\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + "._465:\n" + " ldrb r0, [r2, #0x5]\n" + " cmp r0, #0x2\n" + " bne ._466 @cond_branch\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + "._466:\n" + " cmp r1, #0x3\n" + " beq ._467 @cond_branch\n" + " mov r0, #0x2\n" + " strb r0, [r2, #0x1]\n" + " strb r0, [r2, #0x3]\n" + " strb r0, [r2, #0x4]\n" + "._467:\n" + " add r0, r2, #0\n" + " bl sub_810CA34\n" + " bl debug_sub_8160BB0\n" + " mov r4, #0x0\n" + "._468:\n" + " add r0, r4, #0\n" + " bl debug_sub_8160A80\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x5\n" + " bls ._468 @cond_branch\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._470:\n" + " .align 2, 0\n" + "._469:\n" + " .word _nakamuraStatic+0x18\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160CF4() +{ + asm( + " push {lr}\n" + " ldr r2, ._473\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._471 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " b ._472\n" + "._474:\n" + " .align 2, 0\n" + "._473:\n" + " .word gMain\n" + "._471:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._475 @cond_branch\n" + " mov r0, #0x1\n" + "._472:\n" + " bl MoveMenuCursor\n" + " mov r0, #0x0\n" + " b ._484\n" + "._475:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._477 @cond_branch\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " neg r1, r1\n" + " b ._478\n" + "._477:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._479 @cond_branch\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + "._478:\n" + " bl debug_sub_8160B50\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl debug_sub_8160A80\n" + " bl debug_sub_8160BB0\n" + " mov r0, #0x0\n" + " b ._484\n" + "._479:\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._481 @cond_branch\n" + " bl debug_sub_8160C7C\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x0\n" + " b ._484\n" + "._481:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._483 @cond_branch\n" + " mov r0, #0x0\n" + " b ._484\n" + "._483:\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._484:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +u8 debug_sub_8160D98() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " bl debug_sub_8160BE4\n" + " ldr r1, ._485\n" + " ldr r0, ._485 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._486:\n" + " .align 2, 0\n" + "._485:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8160CF4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160DC0() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x16\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._487\n" + " mov r1, #0xb\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._487 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r0, ._487 + 8\n" + " mov r1, #0x2\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " ldr r0, ._487 + 12\n" + " mov r1, #0x2\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r0, ._487 + 16\n" + " mov r1, #0x2\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " ldr r0, ._487 + 20\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " ldr r0, ._487 + 24\n" + " mov r1, #0x2\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " ldr r0, ._487 + 28\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldr r0, ._487 + 32\n" + " mov r1, #0x2\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " pop {r0}\n" + " bx r0\n" + "._488:\n" + " .align 2, 0\n" + "._487:\n" + " .word gOtherText_Slash\n" + " .word Str_843E5F2\n" + " .word Str_843E5FB\n" + " .word Str_843E606\n" + " .word Str_843E611\n" + " .word Str_843E61C\n" + " .word Str_843E627\n" + " .word Str_843E637\n" + " .word Str_843E632\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8160E50() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0xa\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r5, ._489\n" + " add r0, r6, #0\n" + " mov r1, #0x2\n" + " add r2, r5, #0\n" + " bl GetMonData\n" + " add r0, r5, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " mov r0, #0xc\n" + " mov r1, #0x1\n" + " mov r2, #0x15\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r6, #0\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " mov r1, #0xb\n" + " mul r0, r0, r1\n" + " ldr r1, ._489 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xc\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " add r0, r6, #0\n" + " mov r1, #0x1a\n" + " bl GetMonData\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0xd\n" + " mov r1, #0x3\n" + " mov r2, #0x11\n" + " mov r3, #0x4\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0xd\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " add r0, r6, #0\n" + " mov r1, #0x1b\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r4, r4, r1\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0xd\n" + " mov r1, #0x5\n" + " mov r2, #0x11\n" + " mov r3, #0x6\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0xd\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " add r0, r6, #0\n" + " mov r1, #0x1c\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r4, r4, r1\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0xd\n" + " mov r1, #0x7\n" + " mov r2, #0x11\n" + " mov r3, #0x8\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0xd\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " add r0, r6, #0\n" + " mov r1, #0x1d\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r4, r4, r1\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0xd\n" + " mov r1, #0x9\n" + " mov r2, #0x11\n" + " mov r3, #0xa\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0xd\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " add r0, r6, #0\n" + " mov r1, #0x1e\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r4, r4, r1\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0xd\n" + " mov r1, #0xb\n" + " mov r2, #0x11\n" + " mov r3, #0xc\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0xd\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " add r0, r6, #0\n" + " mov r1, #0x1f\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r4, r4, r1\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0xd\n" + " mov r1, #0xd\n" + " mov r2, #0x11\n" + " mov r3, #0xe\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0xd\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0xd\n" + " mov r1, #0xf\n" + " mov r2, #0x11\n" + " mov r3, #0x10\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0xd\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " add r0, r6, #0\n" + " mov r1, #0x20\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0xd\n" + " mov r1, #0x11\n" + " mov r2, #0x11\n" + " mov r3, #0x12\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0xd\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._490:\n" + " .align 2, 0\n" + "._489:\n" + " .word gStringVar1\n" + " .word gSpeciesNames\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8161028() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._491 @cond_branch\n" + " ldr r0, ._496\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._492 @cond_branch\n" + " mov r5, #0x5\n" + "._494:\n" + " lsl r0, r5, #0x10\n" + " asr r4, r0, #0x10\n" + " mov r0, #0x64\n" + " mul r0, r0, r4\n" + " ldr r1, ._496 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " bne ._493 @cond_branch\n" + " sub r0, r4, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " cmp r0, #0\n" + " bge ._494 @cond_branch\n" + "._492:\n" + " ldr r1, ._496\n" + " ldrb r0, [r1]\n" + " add r0, r0, r6\n" + " strb r0, [r1]\n" + " b ._506\n" + "._497:\n" + " .align 2, 0\n" + "._496:\n" + " .word _nakamuraData+0x5\n" + " .word gPlayerParty\n" + "._491:\n" + " cmp r1, #0x1\n" + " bne ._506 @cond_branch\n" + " ldr r4, ._501\n" + " ldrb r0, [r4]\n" + " add r0, r0, r6\n" + " strb r0, [r4]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x6\n" + " bne ._499 @cond_branch\n" + " mov r0, #0x0\n" + " b ._500\n" + "._502:\n" + " .align 2, 0\n" + "._501:\n" + " .word _nakamuraData+0x5\n" + "._493:\n" + " ldr r0, ._504\n" + " strb r5, [r0]\n" + " b ._506\n" + "._505:\n" + " .align 2, 0\n" + "._504:\n" + " .word _nakamuraData+0x5\n" + "._499:\n" + " ldrb r1, [r4]\n" + " mov r0, #0x64\n" + " mul r0, r0, r1\n" + " ldr r1, ._507\n" + " add r0, r0, r1\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " bne ._506 @cond_branch\n" + "._500:\n" + " strb r0, [r4]\n" + "._506:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._508:\n" + " .align 2, 0\n" + "._507:\n" + " .word gPlayerParty\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_81610BC() +{ + asm( + " push {lr}\n" + " ldr r0, ._511\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._509 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " b ._510\n" + "._512:\n" + " .align 2, 0\n" + "._511:\n" + " .word gMain\n" + "._509:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._513 @cond_branch\n" + " mov r0, #0x1\n" + "._510:\n" + " bl debug_sub_8161028\n" + " ldr r0, ._515\n" + " ldrb r1, [r0]\n" + " mov r0, #0x64\n" + " mul r0, r0, r1\n" + " ldr r1, ._515 + 4\n" + " add r0, r0, r1\n" + " bl debug_sub_8160E50\n" + " mov r0, #0x0\n" + " b ._518\n" + "._516:\n" + " .align 2, 0\n" + "._515:\n" + " .word _nakamuraData+0x5\n" + " .word gPlayerParty\n" + "._513:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._517 @cond_branch\n" + " mov r0, #0x0\n" + " b ._518\n" + "._517:\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._518:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_EffortValues() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " ldr r1, ._519\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl debug_sub_8160DC0\n" + " ldr r0, ._519 + 4\n" + " bl debug_sub_8160E50\n" + " ldr r1, ._519 + 8\n" + " ldr r0, ._519 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._520:\n" + " .align 2, 0\n" + "._519:\n" + " .word _nakamuraData+0x5\n" + " .word gPlayerParty\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_81610BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8161160() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " mov r7, #0x0\n" + " ldr r2, ._523\n" + " ldr r1, ._523 + 4\n" + " ldrh r0, [r2]\n" + " ldrh r3, [r1]\n" + " cmp r0, r3\n" + " bhi ._521 @cond_branch\n" + " add r6, r0, #0\n" + " ldrh r5, [r1]\n" + " b ._522\n" + "._524:\n" + " .align 2, 0\n" + "._523:\n" + " .word _nakamuraData+0x6\n" + " .word _nakamuraData+0x8\n" + "._521:\n" + " ldrh r6, [r1]\n" + " ldrh r5, [r2]\n" + "._522:\n" + " mov r4, #0x0\n" + " ldr r0, ._529\n" + " ldrh r0, [r0]\n" + " cmp r4, r0\n" + " bcs ._525 @cond_branch\n" + " ldr r0, ._529 + 4\n" + " mov r8, r0\n" + "._528:\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r2, r8\n" + " ldrh r1, [r2]\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, r6\n" + " bcc ._527 @cond_branch\n" + " cmp r0, r5\n" + " bhi ._527 @cond_branch\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r7, r0, #0x10\n" + "._527:\n" + " add r4, r4, #0x1\n" + " ldr r0, ._529\n" + " ldrh r0, [r0]\n" + " cmp r4, r0\n" + " bcc ._528 @cond_branch\n" + "._525:\n" + " add r0, r7, #0\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._530:\n" + " .align 2, 0\n" + "._529:\n" + " .word _nakamuraData+0xa\n" + " .word _nakamuraData+0xc\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_81611D8() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xf\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._531\n" + " mov r1, #0x2\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._531 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r0, ._531 + 8\n" + " mov r1, #0x2\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " ldr r0, ._531 + 12\n" + " mov r1, #0x2\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r0, ._531 + 16\n" + " mov r1, #0x2\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " ldr r0, ._531 + 20\n" + " mov r1, #0xd\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " ldr r4, ._531 + 24\n" + " add r0, r4, #0\n" + " mov r1, #0xc\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0xc\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0xc\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0xc\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0xc\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xe\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._532:\n" + " .align 2, 0\n" + "._531:\n" + " .word Str_843E642\n" + " .word Str_843E647\n" + " .word Str_843E65A\n" + " .word Str_843E64C\n" + " .word Str_843E651\n" + " .word Str_843E655\n" + " .word Str_843E658\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8161290() +{ + asm( + " push {r4, lr}\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r4, ._533\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x8\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._534:\n" + " .align 2, 0\n" + "._533:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_81612B8() +{ + asm( + " push {r4, r5, lr}\n" + " add r4, r2, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " lsl r1, r1, #0x18\n" + " asr r1, r1, #0x18\n" + " ldrh r2, [r0]\n" + " add r1, r1, r2\n" + " strh r1, [r0]\n" + " ldr r5, ._535\n" + " ldrh r1, [r0]\n" + " add r0, r5, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r5, #0\n" + " mov r1, #0x8\n" + " add r2, r4, #0\n" + " bl MenuPrint\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._536:\n" + " .align 2, 0\n" + "._535:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_81612EC() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r2, ._540\n" + " ldrh r1, [r2, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " mov r5, #0x1\n" + " cmp r0, #0\n" + " beq ._537 @cond_branch\n" + " mov r5, #0x64\n" + "._537:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._538 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " b ._539\n" + "._541:\n" + " .align 2, 0\n" + "._540:\n" + " .word gMain\n" + "._538:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._542 @cond_branch\n" + " mov r0, #0x1\n" + "._539:\n" + " bl MoveMenuCursor\n" + "._565:\n" + " mov r0, #0x0\n" + " b ._543\n" + "._542:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._544 @cond_branch\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " asr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne ._545 @cond_branch\n" + " ldr r0, ._550\n" + " neg r1, r5\n" + " mov r2, #0x1\n" + " bl debug_sub_81612B8\n" + "._545:\n" + " cmp r4, #0x1\n" + " bne ._546 @cond_branch\n" + " ldr r0, ._550 + 4\n" + " neg r1, r5\n" + " mov r2, #0x3\n" + " bl debug_sub_81612B8\n" + "._546:\n" + " cmp r4, #0x2\n" + " bne ._547 @cond_branch\n" + " ldr r0, ._550 + 8\n" + " neg r1, r5\n" + " mov r2, #0x5\n" + " bl debug_sub_81612B8\n" + "._547:\n" + " cmp r4, #0x3\n" + " bne ._565 @cond_branch\n" + " ldr r0, ._550 + 12\n" + " neg r1, r5\n" + " mov r2, #0x7\n" + " bl debug_sub_81612B8\n" + " b ._565\n" + "._551:\n" + " .align 2, 0\n" + "._550:\n" + " .word _nakamuraData+0x6\n" + " .word _nakamuraData+0x8\n" + " .word _nakamuraData+0xc\n" + " .word _nakamuraData+0xa\n" + "._544:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._552 @cond_branch\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " asr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne ._553 @cond_branch\n" + " ldr r0, ._558\n" + " add r1, r5, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_81612B8\n" + "._553:\n" + " cmp r4, #0x1\n" + " bne ._554 @cond_branch\n" + " ldr r0, ._558 + 4\n" + " add r1, r5, #0\n" + " mov r2, #0x3\n" + " bl debug_sub_81612B8\n" + "._554:\n" + " cmp r4, #0x2\n" + " bne ._555 @cond_branch\n" + " ldr r0, ._558 + 8\n" + " add r1, r5, #0\n" + " mov r2, #0x5\n" + " bl debug_sub_81612B8\n" + "._555:\n" + " cmp r4, #0x3\n" + " bne ._565 @cond_branch\n" + " ldr r0, ._558 + 12\n" + " add r1, r5, #0\n" + " mov r2, #0x7\n" + " bl debug_sub_81612B8\n" + " b ._565\n" + "._559:\n" + " .align 2, 0\n" + "._558:\n" + " .word _nakamuraData+0x6\n" + " .word _nakamuraData+0x8\n" + " .word _nakamuraData+0xc\n" + " .word _nakamuraData+0xa\n" + "._552:\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._560 @cond_branch\n" + " ldr r0, ._563\n" + " ldrh r0, [r0]\n" + " cmp r0, #0\n" + " beq ._565 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " bl debug_sub_8161160\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl debug_sub_8161290\n" + " b ._565\n" + "._564:\n" + " .align 2, 0\n" + "._563:\n" + " .word _nakamuraData+0xc\n" + "._560:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._565 @cond_branch\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._543:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_RandomNumberTest() +{ + asm( + " push {lr}\n" + " ldr r0, ._566\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " ldr r0, ._566 + 4\n" + " strh r1, [r0]\n" + " ldr r0, ._566 + 8\n" + " strh r1, [r0]\n" + " ldr r0, ._566 + 12\n" + " strh r1, [r0]\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " bl debug_sub_81611D8\n" + " ldr r1, ._566 + 16\n" + " ldr r0, ._566 + 20\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._567:\n" + " .align 2, 0\n" + "._566:\n" + " .word _nakamuraData+0x6\n" + " .word _nakamuraData+0x8\n" + " .word _nakamuraData+0xc\n" + " .word _nakamuraData+0xa\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_81612EC+1\n" + "\n" + ); +} + +#endif // DEBUG diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c new file mode 100644 index 000000000..b7e62481b --- /dev/null +++ b/src/debug/nohara_debug_menu.c @@ -0,0 +1,2316 @@ +#ifdef DEBUG +#include "global.h" + +#define BSS_DATA __attribute__((section(".bss"))) + +BSS_DATA u8 gDebug_03000724[4] = { 0 }; + +__attribute__((naked)) +void InitNoharaDebugMenu() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x13\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._1\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x12\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._1 + 4\n" + " ldr r0, ._1 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word gUnknown_Debug_083C4938\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808F414+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F414() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._3 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " beq ._4 @cond_branch\n" + " ldr r2, ._6\n" + " ldr r0, ._6 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + "._3:\n" + " mov r0, #0x0\n" + " b ._5\n" + "._7:\n" + " .align 2, 0\n" + "._6:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C4938\n" + "._4:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._5:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_TV() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " ldr r1, ._8\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xa\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._8 + 4\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x9\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._8 + 8\n" + " ldr r0, ._8 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._9:\n" + " .align 2, 0\n" + "._8:\n" + " .word gDebug_03000724+0x2\n" + " .word gUnknown_Debug_083C4B8C\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808F4AC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F4AC() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._10 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " beq ._11 @cond_branch\n" + " ldr r2, ._13\n" + " ldr r0, ._13 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + "._10:\n" + " mov r0, #0x0\n" + " b ._12\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C4B8C\n" + "._11:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._12:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F4EC() +{ + asm( + " push {lr}\n" + " bl debug_sub_808F6BC\n" + " ldr r0, ._15\n" + " bl sub_8071F40\n" + " mov r0, #0x3\n" + " mov r1, #0x3\n" + " mov r2, #0x1\n" + " bl DisplayYesNoMenu\n" + " ldr r1, ._15 + 4\n" + " ldr r0, ._15 + 8\n" + " str r0, [r1]\n" + " pop {r0}\n" + " bx r0\n" + "._16:\n" + " .align 2, 0\n" + "._15:\n" + " .word gUnknown_Debug_083C4980\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808F648+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F518() +{ + asm( + " push {r4, lr}\n" + " mov r2, #0x0\n" + " ldr r4, ._20\n" + " ldr r3, ._20 + 4\n" + "._19:\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x2\n" + " add r1, r0, r4\n" + " add r0, r1, r3\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x15\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x13\n" + " bhi ._18 @cond_branch\n" + " ldr r0, ._20 + 8\n" + " add r1, r1, r0\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._18 @cond_branch\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + "._18:\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x17\n" + " bls ._19 @cond_branch\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._21:\n" + " .align 2, 0\n" + "._20:\n" + " .word gSaveBlock1\n" + " .word 0x2738\n" + " .word 0x2739\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F560() +{ + asm( + " push {r4, lr}\n" + " mov r1, #0x0\n" + " ldr r4, ._23\n" + " ldr r3, ._23 + 4\n" + " mov r2, #0x0\n" + "._22:\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r4\n" + " add r0, r0, r3\n" + " strb r2, [r0]\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " cmp r1, #0x17\n" + " bls ._22 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._24:\n" + " .align 2, 0\n" + "._23:\n" + " .word gSaveBlock1\n" + " .word 0x2739\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F594() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r2, #0x0\n" + " ldr r6, ._27\n" + " ldr r5, ._27 + 4\n" + " ldr r4, ._27 + 8\n" + " mov r3, #0x1\n" + "._26:\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x2\n" + " add r1, r0, r6\n" + " add r0, r1, r5\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " add r0, r1, r4\n" + " strb r3, [r0]\n" + "._25:\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x17\n" + " bls ._26 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word gSaveBlock1\n" + " .word 0x2738\n" + " .word 0x2739\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F5D8() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " mov r4, #0x0\n" + " ldr r6, ._30\n" + " ldr r7, ._30 + 4\n" + " add r0, r7, #1\n" + " mov r8, r0\n" + "._29:\n" + " ldr r5, ._30 + 8\n" + " strh r4, [r5]\n" + " bl sub_810F424\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r6, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " lsl r0, r4, #0x1\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r1, r0, r7\n" + " ldrb r1, [r1]\n" + " add r0, r0, r8\n" + " ldrb r2, [r0]\n" + " add r0, r6, #0\n" + " bl MenuPrint\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0xb\n" + " bls ._29 @cond_branch\n" + " mov r0, #0x0\n" + " strh r0, [r5]\n" + " ldr r1, ._30 + 12\n" + " ldr r0, ._30 + 16\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._31:\n" + " .align 2, 0\n" + "._30:\n" + " .word gStringVar1\n" + " .word gUnknown_Debug_083C4BD4\n" + " .word gSpecialVar_0x8004\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8090278+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F648() +{ + asm( + " push {lr}\n" + " ldr r0, ._35\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._32 @cond_branch\n" + " mov r0, #0xa\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xd\n" + " bl MenuZeroFillWindowRect\n" + " ldr r0, ._35 + 4\n" + " ldrb r1, [r0]\n" + " mov r2, #0x1\n" + " eor r1, r1, r2\n" + " strb r1, [r0]\n" + " cmp r1, #0\n" + " beq ._33 @cond_branch\n" + " bl debug_sub_808F7B4\n" + " b ._40\n" + "._36:\n" + " .align 2, 0\n" + "._35:\n" + " .word gMain\n" + " .word gDebug_03000724+0x2\n" + "._33:\n" + " bl debug_sub_808F6BC\n" + " b ._40\n" + "._32:\n" + " bl ProcessMenuInputNoWrap_\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._43 @cond_branch\n" + " cmp r1, r0\n" + " bgt ._39 @cond_branch\n" + " sub r0, r0, #0x1\n" + " cmp r1, r0\n" + " beq ._40 @cond_branch\n" + " b ._43\n" + "._39:\n" + " cmp r1, #0\n" + " beq ._42 @cond_branch\n" + " b ._43\n" + "._40:\n" + " mov r0, #0x0\n" + " b ._44\n" + "._42:\n" + " bl debug_sub_808F518\n" + "._43:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._44:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F6BC() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._48\n" + " ldr r6, ._48 + 4\n" + "._45:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldr r1, ._48 + 8\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " lsl r1, r4, #0x19\n" + " mov r0, #0xa0\n" + " lsl r0, r0, #0x14\n" + " add r1, r1, r0\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " bl MenuPrint\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x4\n" + " bls ._45 @cond_branch\n" + " mov r4, #0x5\n" + " ldr r5, ._48\n" + " ldr r6, ._48 + 4\n" + "._50:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldr r1, ._48 + 8\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " cmp r4, #0xe\n" + " bhi ._46 @cond_branch\n" + " lsl r1, r4, #0x19\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " b ._47\n" + "._49:\n" + " .align 2, 0\n" + "._48:\n" + " .word gStringVar1\n" + " .word gSaveBlock1\n" + " .word 0x2738\n" + "._46:\n" + " lsl r1, r4, #0x19\n" + " mov r0, #0xec\n" + " lsl r0, r0, #0x18\n" + " add r1, r1, r0\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0x6\n" + " bl MenuPrint\n" + "._47:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x17\n" + " bls ._50 @cond_branch\n" + " mov r4, #0x0\n" + " ldr r5, ._53\n" + "._55:\n" + " ldr r0, ._53 + 4\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r0\n" + " ldr r0, ._53 + 8\n" + " add r1, r1, r0\n" + " ldrb r1, [r1]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " cmp r4, #0x7\n" + " bhi ._51 @cond_branch\n" + " lsl r1, r4, #0x19\n" + " mov r0, #0xa0\n" + " lsl r0, r0, #0x14\n" + " add r1, r1, r0\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " b ._52\n" + "._54:\n" + " .align 2, 0\n" + "._53:\n" + " .word gStringVar1\n" + " .word gSaveBlock1\n" + " .word 0x2abc\n" + "._51:\n" + " lsl r1, r4, #0x19\n" + " mov r0, #0xfa\n" + " lsl r0, r0, #0x18\n" + " add r1, r1, r0\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0xc\n" + " bl MenuPrint\n" + "._52:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0xf\n" + " bls ._55 @cond_branch\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F7B4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._59\n" + " ldr r6, ._59 + 4\n" + "._56:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldr r1, ._59 + 8\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " lsl r1, r4, #0x19\n" + " mov r0, #0xa0\n" + " lsl r0, r0, #0x14\n" + " add r1, r1, r0\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " bl MenuPrint\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x4\n" + " bls ._56 @cond_branch\n" + " mov r4, #0x5\n" + " ldr r5, ._59\n" + " ldr r6, ._59 + 4\n" + "._61:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldr r1, ._59 + 8\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " cmp r4, #0xe\n" + " bhi ._57 @cond_branch\n" + " lsl r1, r4, #0x19\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " b ._58\n" + "._60:\n" + " .align 2, 0\n" + "._59:\n" + " .word gStringVar1\n" + " .word gSaveBlock1\n" + " .word 0x2739\n" + "._57:\n" + " lsl r1, r4, #0x19\n" + " mov r0, #0xec\n" + " lsl r0, r0, #0x18\n" + " add r1, r1, r0\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0x6\n" + " bl MenuPrint\n" + "._58:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x17\n" + " bls ._61 @cond_branch\n" + " mov r4, #0x0\n" + " ldr r5, ._64\n" + "._66:\n" + " ldr r0, ._64 + 4\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r0\n" + " ldr r0, ._64 + 8\n" + " add r1, r1, r0\n" + " ldrb r1, [r1]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " cmp r4, #0x7\n" + " bhi ._62 @cond_branch\n" + " lsl r1, r4, #0x19\n" + " mov r0, #0xa0\n" + " lsl r0, r0, #0x14\n" + " add r1, r1, r0\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " b ._63\n" + "._65:\n" + " .align 2, 0\n" + "._64:\n" + " .word gStringVar1\n" + " .word gSaveBlock1\n" + " .word 0x2abd\n" + "._62:\n" + " lsl r1, r4, #0x19\n" + " mov r0, #0xfa\n" + " lsl r0, r0, #0x18\n" + " add r1, r1, r0\n" + " lsr r1, r1, #0x18\n" + " add r0, r5, #0\n" + " mov r2, #0xc\n" + " bl MenuPrint\n" + "._63:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0xf\n" + " bls ._66 @cond_branch\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F8AC() +{ + asm( + " push {lr}\n" + " ldr r0, ._67\n" + " bl FlagSet\n" + " ldr r0, ._67 + 4\n" + " bl FlagSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._68:\n" + " .align 2, 0\n" + "._67:\n" + " .word 0x832\n" + " .word 0x818\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F8CC() +{ + asm( + " push {r4, lr}\n" + " ldr r1, ._69\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " ldr r0, ._69 + 4\n" + " bl sub_8071F40\n" + " mov r0, #0xd\n" + " mov r1, #0x6\n" + " mov r2, #0x1a\n" + " mov r3, #0x8\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r0, ._69 + 8\n" + " ldr r0, [r0]\n" + " mov r1, #0xe\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " mov r0, #0x16\n" + " mov r1, #0x1\n" + " mov r2, #0x18\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r4, ._69 + 12\n" + " add r0, r4, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x17\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r1, ._69 + 16\n" + " ldr r0, ._69 + 20\n" + " str r0, [r1]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._70:\n" + " .align 2, 0\n" + "._69:\n" + " .word gDebug_03000724\n" + " .word gUnknown_Debug_083C49CA\n" + " .word gUnknown_Debug_083C4ABD+0xf\n" + " .word gStringVar1\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808F93C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F93C() +{ + asm( + " push {r4, lr}\n" + " mov r2, #0x0\n" + " ldr r0, ._83\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._71 @cond_branch\n" + " ldr r1, ._83 + 4\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x18\n" + " bne ._72 @cond_branch\n" + " strb r2, [r1]\n" + "._72:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r2, #0x1\n" + "._71:\n" + " ldr r0, ._83\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._73 @cond_branch\n" + " ldr r1, ._83 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._74 @cond_branch\n" + " mov r0, #0x18\n" + " strb r0, [r1]\n" + "._74:\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r2, #0x1\n" + "._73:\n" + " ldr r0, ._83\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._75 @cond_branch\n" + " ldr r1, ._83 + 8\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0xc\n" + " bne ._76 @cond_branch\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + "._76:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r2, #0x1\n" + "._75:\n" + " ldr r0, ._83\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._77 @cond_branch\n" + " ldr r1, ._83 + 8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._78 @cond_branch\n" + " mov r0, #0xc\n" + " strb r0, [r1]\n" + "._78:\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r2, #0x1\n" + "._77:\n" + " cmp r2, #0\n" + " beq ._79 @cond_branch\n" + " mov r0, #0xd\n" + " mov r1, #0x6\n" + " mov r2, #0x1a\n" + " mov r3, #0x8\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r1, ._83 + 12\n" + " ldr r0, ._83 + 8\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0xe\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " mov r0, #0x16\n" + " mov r1, #0x1\n" + " mov r2, #0x18\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r4, ._83 + 16\n" + " ldr r0, ._83 + 4\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x17\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + "._79:\n" + " ldr r4, ._83\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._80 @cond_branch\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + " ldr r0, ._83 + 4\n" + " ldrb r0, [r0]\n" + " ldr r2, ._83 + 20\n" + " ldr r1, ._83 + 8\n" + " ldrb r1, [r1]\n" + " add r1, r1, r2\n" + " ldrb r1, [r1]\n" + " bl debug_sub_808FA88\n" + "._80:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._81 @cond_branch\n" + " mov r0, #0x0\n" + " b ._82\n" + "._84:\n" + " .align 2, 0\n" + "._83:\n" + " .word gMain\n" + " .word gDebug_03000724+0x1\n" + " .word gDebug_03000724\n" + " .word gUnknown_Debug_083C4ABD+0xf\n" + " .word gStringVar1\n" + " .word gUnknown_Debug_083C4ABD\n" + "._81:\n" + " ldr r0, ._85\n" + " bl sub_80BF588\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._82:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._86:\n" + " .align 2, 0\n" + "._85:\n" + " .word gSaveBlock1+0x2738\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808FA88() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add sp, sp, #0xffffffcc\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r7, r1, #0x18\n" + " bl GetLeadMonIndex\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r9, r0\n" + " ldr r3, ._92\n" + " lsl r4, r6, #0x3\n" + " add r2, r4, r6\n" + " lsl r2, r2, #0x2\n" + " add r0, r2, r3\n" + " ldr r5, ._92 + 4\n" + " add r1, r0, r5\n" + " strb r7, [r1]\n" + " ldr r1, ._92 + 8\n" + " add r0, r0, r1\n" + " mov r1, #0x1\n" + " strb r1, [r0]\n" + " mov r1, #0x0\n" + " ldr r0, ._92 + 12\n" + " add r5, r3, r0\n" + " mov r3, #0x1\n" + "._87:\n" + " add r0, r1, r2\n" + " add r0, r0, r5\n" + " strb r3, [r0]\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " cmp r1, #0x21\n" + " bls ._87 @cond_branch\n" + " add r0, r7, #0\n" + " bl sub_80BFB54\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r1, r0, #0\n" + " cmp r0, #0x3\n" + " beq ._88 @cond_branch\n" + " cmp r0, #0x3\n" + " bgt ._89 @cond_branch\n" + " cmp r0, #0x2\n" + " beq ._90 @cond_branch\n" + " b ._95\n" + "._93:\n" + " .align 2, 0\n" + "._92:\n" + " .word gSaveBlock1\n" + " .word 0x2738\n" + " .word 0x2739\n" + " .word 0x273a\n" + "._89:\n" + " cmp r1, #0x4\n" + " bne ._95 @cond_branch\n" + "._90:\n" + " add r0, r4, r6\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._96\n" + " add r0, r0, r1\n" + " bl sub_80BE160\n" + " b ._95\n" + "._97:\n" + " .align 2, 0\n" + "._96:\n" + " .word gSaveBlock1+0x2738\n" + "._88:\n" + " add r0, r4, r6\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._100\n" + " add r0, r0, r1\n" + " bl sub_80BE138\n" + "._95:\n" + " sub r0, r7, #1\n" + " cmp r0, #0x28\n" + " bls ._98 @cond_branch\n" + " b ._173\n" + "._98:\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._100 + 4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._101:\n" + " .align 2, 0\n" + "._100:\n" + " .word gSaveBlock1+0x2738\n" + " .word ._102\n" + "._102:\n" + " .word ._104\n" + " .word ._104\n" + " .word ._105\n" + " .word ._173\n" + " .word ._107\n" + " .word ._108\n" + " .word ._109\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._123\n" + " .word ._124\n" + " .word ._125\n" + " .word ._126\n" + " .word ._127\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._173\n" + " .word ._143\n" + "._104:\n" + " add r0, r4, r6\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._145\n" + " add r4, r0, r1\n" + " mov r2, #0x1\n" + " strh r2, [r4, #0x2]\n" + " add r1, r1, #0x10\n" + " add r0, r0, r1\n" + " ldr r1, ._145 + 4\n" + " bl StringCopy\n" + " mov r0, #0x5\n" + " strb r0, [r4, #0x18]\n" + " b ._173\n" + "._146:\n" + " .align 2, 0\n" + "._145:\n" + " .word gSaveBlock1+0x2738\n" + " .word gSaveBlock2\n" + "._105:\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x2\n" + " ldr r6, ._148\n" + " add r1, r4, r6\n" + " mov r8, r1\n" + " mov r0, #0x1\n" + " strh r0, [r1, #0x2]\n" + " add r0, r6, #5\n" + " add r0, r4, r0\n" + " ldr r1, ._148 + 4\n" + " bl StringCopy\n" + " mov r0, #0x64\n" + " mov r5, r9\n" + " mul r5, r5, r0\n" + " ldr r0, ._148 + 8\n" + " add r5, r5, r0\n" + " add r6, r6, #0x10\n" + " add r4, r4, r6\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " add r2, r4, #0\n" + " bl GetMonData\n" + " mov r0, #0x5\n" + " mov r1, r8\n" + " strb r0, [r1, #0xd]\n" + " add r0, r5, #0\n" + " mov r1, #0x3\n" + " bl GetMonData\n" + " mov r5, r8\n" + " strb r0, [r5, #0xe]\n" + " b ._173\n" + "._149:\n" + " .align 2, 0\n" + "._148:\n" + " .word gSaveBlock1+0x2738\n" + " .word gSaveBlock2\n" + " .word gPlayerParty\n" + "._107:\n" + " mov r0, #0x64\n" + " mov r1, r9\n" + " mul r1, r1, r0\n" + " mov r8, r1\n" + " ldr r0, ._151\n" + " add r8, r8, r0\n" + " mov r0, r8\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x2\n" + " ldr r5, ._151 + 4\n" + " add r6, r4, r5\n" + " strh r0, [r6, #0x2]\n" + " mov r0, #0x1\n" + " strh r0, [r6, #0x1c]\n" + " add r0, r5, #0\n" + " add r0, r0, #0xf\n" + " add r0, r4, r0\n" + " ldr r1, ._151 + 8\n" + " bl StringCopy\n" + " add r5, r5, #0x4\n" + " add r4, r4, r5\n" + " mov r0, r8\n" + " mov r1, #0x2\n" + " add r2, r4, #0\n" + " bl GetMonData\n" + " mov r0, #0x5\n" + " strb r0, [r6, #0x1e]\n" + " mov r0, r8\n" + " mov r1, #0x3\n" + " bl GetMonData\n" + " strb r0, [r6, #0x1f]\n" + " b ._173\n" + "._152:\n" + " .align 2, 0\n" + "._151:\n" + " .word gPlayerParty\n" + " .word gSaveBlock1+0x2738\n" + " .word gSaveBlock2\n" + "._108:\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x2\n" + " ldr r6, ._154\n" + " add r5, r4, r6\n" + " mov r8, r5\n" + " mov r0, #0x1\n" + " strh r0, [r5, #0x2]\n" + " add r0, r6, #0\n" + " add r0, r0, #0x16\n" + " add r0, r4, r0\n" + " ldr r1, ._154 + 4\n" + " bl StringCopy\n" + " mov r0, #0x64\n" + " mov r5, r9\n" + " mul r5, r5, r0\n" + " ldr r0, ._154 + 8\n" + " add r5, r5, r0\n" + " add r6, r6, #0x8\n" + " add r4, r4, r6\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " add r2, r4, #0\n" + " bl GetMonData\n" + " mov r0, #0x5\n" + " mov r1, r8\n" + " strb r0, [r1, #0x1e]\n" + " add r0, r5, #0\n" + " mov r1, #0x3\n" + " bl GetMonData\n" + " mov r5, r8\n" + " strb r0, [r5, #0x1f]\n" + " b ._173\n" + "._155:\n" + " .align 2, 0\n" + "._154:\n" + " .word gSaveBlock1+0x2738\n" + " .word gSaveBlock2\n" + " .word gPlayerParty\n" + "._109:\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x2\n" + " ldr r5, ._157\n" + " add r6, r4, r5\n" + " mov r0, #0x1\n" + " strh r0, [r6, #0xa]\n" + " strh r0, [r6, #0x14]\n" + " add r0, r5, #2\n" + " add r0, r4, r0\n" + " ldr r1, ._157 + 4\n" + " mov r8, r1\n" + " bl StringCopy\n" + " add r5, r5, #0xc\n" + " add r4, r4, r5\n" + " add r0, r4, #0\n" + " mov r1, r8\n" + " bl StringCopy\n" + " mov r0, #0x5\n" + " strb r0, [r6, #0x1d]\n" + " b ._173\n" + "._158:\n" + " .align 2, 0\n" + "._157:\n" + " .word gSaveBlock1+0x2738\n" + " .word gSaveBlock2\n" + "._143:\n" + " add r0, r4, r6\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._160\n" + " add r0, r0, r1\n" + " mov r1, #0x1\n" + " strh r1, [r0, #0xc]\n" + " strh r1, [r0, #0x16]\n" + " b ._173\n" + "._161:\n" + " .align 2, 0\n" + "._160:\n" + " .word gSaveBlock1+0x2738\n" + "._123:\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x2\n" + " ldr r0, ._163\n" + " add r4, r4, r0\n" + " ldr r1, ._163 + 4\n" + " mov r0, sp\n" + " mov r2, #0x8\n" + " bl memcpy\n" + " add r5, sp, #0x8\n" + " ldr r1, ._163 + 8\n" + " add r0, r5, #0\n" + " mov r2, #0xb\n" + " bl memcpy\n" + " mov r0, #0xff\n" + " strb r0, [r4, #0x12]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x13\n" + " mov r1, sp\n" + " bl StringCopy\n" + " add r0, r4, #4\n" + " add r1, r5, #0\n" + " bl StringCopy\n" + " mov r0, #0xc\n" + " strb r0, [r4, #0xf]\n" + " mov r0, #0x28\n" + " strh r0, [r4, #0x10]\n" + " mov r0, #0x5\n" + " strb r0, [r4, #0x2]\n" + " strb r0, [r4, #0x3]\n" + " b ._173\n" + "._164:\n" + " .align 2, 0\n" + "._163:\n" + " .word gSaveBlock1+0x2738\n" + " .word gUnknown_Debug_083C4C64\n" + " .word gUnknown_Debug_083C4C6C\n" + "._124:\n" + " add r0, r4, r6\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._168\n" + " add r5, r0, r1\n" + " add r4, sp, #0x14\n" + " ldr r1, ._168 + 4\n" + " add r0, r4, #0\n" + " mov r2, #0x8\n" + " bl memcpy\n" + " add r1, r4, #0\n" + " mov r3, #0xfe\n" + " mov r2, #0x2\n" + " add r0, r5, #0\n" + " add r0, r0, #0x10\n" + "._165:\n" + " strh r3, [r0]\n" + " sub r0, r0, #0x2\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bge ._165 @cond_branch\n" + " mov r0, #0x1\n" + " strb r0, [r5, #0x2]\n" + " mov r0, #0x28\n" + " strb r0, [r5, #0x12]\n" + " add r0, r5, #0\n" + " add r0, r0, #0x13\n" + " add r3, r5, #6\n" + " mov r6, #0x1e\n" + " add r2, r5, #0\n" + " add r2, r2, #0xa\n" + "._166:\n" + " strh r6, [r2]\n" + " sub r2, r2, #0x2\n" + " cmp r2, r3\n" + " bge ._166 @cond_branch\n" + " bl StringCopy\n" + " mov r0, #0x5\n" + " strb r0, [r5, #0x3]\n" + " b ._173\n" + "._169:\n" + " .align 2, 0\n" + "._168:\n" + " .word gSaveBlock1+0x2738\n" + " .word gUnknown_Debug_083C4C64\n" + "._125:\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x2\n" + " ldr r0, ._171\n" + " add r4, r4, r0\n" + " add r5, sp, #0x1c\n" + " ldr r1, ._171 + 4\n" + " add r0, r5, #0\n" + " mov r2, #0x8\n" + " bl memcpy\n" + " mov r0, #0x28\n" + " strh r0, [r4, #0xc]\n" + " strh r0, [r4, #0xe]\n" + " mov r0, #0x3\n" + " strb r0, [r4, #0x12]\n" + " mov r0, #0xff\n" + " strb r0, [r4, #0x10]\n" + " mov r0, #0x1\n" + " strb r0, [r4, #0x11]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x13\n" + " add r1, r5, #0\n" + " bl StringCopy\n" + " mov r0, #0x5\n" + " strb r0, [r4, #0x2]\n" + " b ._173\n" + "._172:\n" + " .align 2, 0\n" + "._171:\n" + " .word gSaveBlock1+0x2738\n" + " .word gUnknown_Debug_083C4C64\n" + "._126:\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x2\n" + " ldr r0, ._174\n" + " add r4, r4, r0\n" + " add r5, sp, #0x24\n" + " ldr r1, ._174 + 4\n" + " add r0, r5, #0\n" + " mov r2, #0x8\n" + " bl memcpy\n" + " mov r0, #0xff\n" + " strb r0, [r4, #0x2]\n" + " mov r0, #0x0\n" + " strb r0, [r4, #0x3]\n" + " mov r0, #0x28\n" + " strh r0, [r4, #0x4]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x13\n" + " add r1, r5, #0\n" + " bl StringCopy\n" + " mov r0, #0x5\n" + " strb r0, [r4, #0x6]\n" + " b ._173\n" + "._175:\n" + " .align 2, 0\n" + "._174:\n" + " .word gSaveBlock1+0x2738\n" + " .word gUnknown_Debug_083C4C64\n" + "._127:\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x2\n" + " ldr r0, ._176\n" + " add r4, r4, r0\n" + " add r5, sp, #0x2c\n" + " ldr r1, ._176 + 4\n" + " add r0, r5, #0\n" + " mov r2, #0x8\n" + " bl memcpy\n" + " ldr r0, ._176 + 8\n" + " strh r0, [r4, #0x2]\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " strh r0, [r4, #0x6]\n" + " mov r0, #0x28\n" + " strh r0, [r4, #0x4]\n" + " strh r0, [r4, #0x8]\n" + " mov r0, #0x3\n" + " strb r0, [r4, #0xa]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x13\n" + " add r1, r5, #0\n" + " bl StringCopy\n" + " mov r0, #0x5\n" + " strb r0, [r4, #0xb]\n" + "._173:\n" + " add sp, sp, #0x34\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._177:\n" + " .align 2, 0\n" + "._176:\n" + " .word gSaveBlock1+0x2738\n" + " .word gUnknown_Debug_083C4C64\n" + " .word 0xffff\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808FEBC() +{ + asm( + " push {lr}\n" + " bl ClearTVShowData\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808FECC() +{ + asm( + " push {r4, lr}\n" + " ldr r1, ._178\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " ldr r0, ._178 + 4\n" + " bl sub_8071F40\n" + " mov r0, #0xd\n" + " mov r1, #0x6\n" + " mov r2, #0x17\n" + " mov r3, #0x8\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r0, ._178 + 8\n" + " ldr r0, [r0]\n" + " mov r1, #0xe\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " mov r0, #0x16\n" + " mov r1, #0x1\n" + " mov r2, #0x18\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r4, ._178 + 12\n" + " add r0, r4, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x17\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r1, ._178 + 16\n" + " ldr r0, ._178 + 20\n" + " str r0, [r1]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._179:\n" + " .align 2, 0\n" + "._178:\n" + " .word gDebug_03000724\n" + " .word gUnknown_Debug_083C49CA\n" + " .word gUnknown_Debug_083C4B20+0x4\n" + " .word gStringVar1\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808FF3C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808FF3C() +{ + asm( + " push {r4, lr}\n" + " mov r2, #0x0\n" + " ldr r0, ._192\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._180 @cond_branch\n" + " ldr r1, ._192 + 4\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x10\n" + " bne ._181 @cond_branch\n" + " strb r2, [r1]\n" + "._181:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r2, #0x1\n" + "._180:\n" + " ldr r0, ._192\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._182 @cond_branch\n" + " ldr r1, ._192 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._183 @cond_branch\n" + " mov r0, #0x10\n" + " strb r0, [r1]\n" + "._183:\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r2, #0x1\n" + "._182:\n" + " ldr r0, ._192\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._184 @cond_branch\n" + " ldr r1, ._192 + 8\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x3\n" + " bne ._185 @cond_branch\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + "._185:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r2, #0x1\n" + "._184:\n" + " ldr r0, ._192\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._186 @cond_branch\n" + " ldr r1, ._192 + 8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._187 @cond_branch\n" + " mov r0, #0x3\n" + " strb r0, [r1]\n" + "._187:\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r2, #0x1\n" + "._186:\n" + " cmp r2, #0\n" + " beq ._188 @cond_branch\n" + " mov r0, #0xd\n" + " mov r1, #0x6\n" + " mov r2, #0x17\n" + " mov r3, #0x8\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r1, ._192 + 12\n" + " ldr r0, ._192 + 8\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0xe\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " mov r0, #0x16\n" + " mov r1, #0x1\n" + " mov r2, #0x18\n" + " mov r3, #0x2\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r4, ._192 + 16\n" + " ldr r0, ._192 + 4\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x17\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + "._188:\n" + " ldr r4, ._192\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._189 @cond_branch\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + " ldr r0, ._192 + 4\n" + " ldrb r0, [r0]\n" + " ldr r2, ._192 + 20\n" + " ldr r1, ._192 + 8\n" + " ldrb r1, [r1]\n" + " add r1, r1, r2\n" + " ldrb r1, [r1]\n" + " bl debug_sub_8090080\n" + "._189:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._190 @cond_branch\n" + " mov r0, #0x0\n" + " b ._191\n" + "._193:\n" + " .align 2, 0\n" + "._192:\n" + " .word gMain\n" + " .word gDebug_03000724+0x1\n" + " .word gDebug_03000724\n" + " .word gUnknown_Debug_083C4B20+0x4\n" + " .word gStringVar1\n" + " .word gUnknown_Debug_083C4B20\n" + "._190:\n" + " bl sub_80BEC40\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._191:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090080() +{ + asm( + " lsl r0, r0, #0x18\n" + " ldr r2, ._194\n" + " lsr r0, r0, #0x16\n" + " add r0, r0, r2\n" + " ldr r3, ._194 + 4\n" + " add r2, r0, r3\n" + " strb r1, [r2]\n" + " ldr r1, ._194 + 8\n" + " add r2, r0, r1\n" + " mov r1, #0x1\n" + " strb r1, [r2]\n" + " add r3, r3, #0x2\n" + " add r0, r0, r3\n" + " mov r1, #0x4\n" + " strh r1, [r0]\n" + " bx lr\n" + "._195:\n" + " .align 2, 0\n" + "._194:\n" + " .word gSaveBlock1\n" + " .word 0x2abc\n" + " .word 0x2abd\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80900AC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " mov r7, #0x0\n" + " mov r5, #0x0\n" + " ldr r0, ._202\n" + " mov r8, r0\n" + "._198:\n" + " lsl r0, r5, #0x3\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x2\n" + " mov r1, r8\n" + " add r6, r0, r1\n" + " ldr r1, ._202 + 4\n" + " add r0, r6, r1\n" + " ldrb r4, [r0]\n" + " cmp r4, #0\n" + " bne ._196 @cond_branch\n" + " cmp r7, #0xc\n" + " bne ._197 @cond_branch\n" + " mov r7, #0x0\n" + "._197:\n" + " ldr r0, ._202 + 8\n" + " add r0, r7, r0\n" + " ldrb r1, [r0]\n" + " add r0, r5, #0\n" + " bl debug_sub_808FA88\n" + " ldr r1, ._202 + 12\n" + " add r0, r6, r1\n" + " strb r4, [r0]\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._196:\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x17\n" + " bls ._198 @cond_branch\n" + " mov r7, #0x0\n" + " mov r5, #0x0\n" + "._201:\n" + " ldr r0, ._202\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r0\n" + " ldr r0, ._202 + 16\n" + " add r1, r1, r0\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._199 @cond_branch\n" + " cmp r7, #0x3\n" + " bne ._200 @cond_branch\n" + " mov r7, #0x0\n" + "._200:\n" + " ldr r0, ._202 + 20\n" + " add r0, r7, r0\n" + " ldrb r1, [r0]\n" + " add r0, r5, #0\n" + " bl debug_sub_8090080\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._199:\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0xf\n" + " bls ._201 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._203:\n" + " .align 2, 0\n" + "._202:\n" + " .word gSaveBlock1\n" + " .word 0x2738\n" + " .word gUnknown_Debug_083C4ABD\n" + " .word 0x2739\n" + " .word 0x2abc\n" + " .word gUnknown_Debug_083C4B20\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_Fan() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xb\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._204\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xa\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._204 + 4\n" + " ldr r0, ._204 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._205:\n" + " .align 2, 0\n" + "._204:\n" + " .word gUnknown_Debug_083C4D28\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_80901A4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80901A4() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._206 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " beq ._207 @cond_branch\n" + " ldr r2, ._209\n" + " ldr r0, ._209 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + "._206:\n" + " mov r0, #0x0\n" + " b ._208\n" + "._210:\n" + " .align 2, 0\n" + "._209:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C4D28\n" + "._207:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._208:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80901E4() +{ + asm( + " push {lr}\n" + " bl ResetFanClub\n" + " bl sub_810FAA0\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80901F8() +{ + asm( + " push {lr}\n" + " bl sub_810FB9C\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._211\n" + " ldr r1, ._211 + 4\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x8\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldr r0, [r0]\n" + " mov r1, #0xe\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r1, ._211 + 8\n" + " ldr r0, ._211 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._212:\n" + " .align 2, 0\n" + "._211:\n" + " .word gUnknown_Debug_083C4CA8\n" + " .word gUnknown_083F8408\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8090278+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090238() +{ + asm( + " push {lr}\n" + " bl sub_810FC18\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._213\n" + " ldr r1, ._213 + 4\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x8\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldr r0, [r0]\n" + " mov r1, #0xe\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r1, ._213 + 8\n" + " ldr r0, ._213 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._214:\n" + " .align 2, 0\n" + "._213:\n" + " .word gUnknown_Debug_083C4CA8\n" + " .word gUnknown_083F8410\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8090278+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090278() +{ + asm( + " push {lr}\n" + " ldr r0, ._217\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._215 @cond_branch\n" + " mov r0, #0x0\n" + " b ._216\n" + "._218:\n" + " .align 2, 0\n" + "._217:\n" + " .word gMain\n" + "._215:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._216:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_809029C() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._219\n" + " ldr r0, ._219 + 4\n" + " ldr r1, ._219 + 8\n" + " add r0, r0, r1\n" + " ldrh r0, [r0]\n" + " mov r1, #0x7f\n" + " and r1, r1, r0\n" + " add r0, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x10\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r1, ._219 + 12\n" + " ldr r0, ._219 + 16\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._220:\n" + " .align 2, 0\n" + "._219:\n" + " .word gStringVar1\n" + " .word gSaveBlock1\n" + " .word 0x13c2\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8090278+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80902E4() +{ + asm( + " push {lr}\n" + " ldr r1, ._221\n" + " ldrh r0, [r1, #0xe]\n" + " add r0, r0, #0x6\n" + " strh r0, [r1, #0xe]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._222:\n" + " .align 2, 0\n" + "._221:\n" + " .word gSaveBlock2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80902FC() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " bl sub_810FB10\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090310() +{ + asm( + " push {lr}\n" + " mov r0, #0x1\n" + " bl sub_810FB10\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090324() +{ + asm( + " push {lr}\n" + " mov r0, #0x2\n" + " bl sub_810FB10\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090338() +{ + asm( + " push {lr}\n" + " mov r0, #0x3\n" + " bl sub_810FB10\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_BattleVSDad() +{ + asm( + " push {lr}\n" + " ldr r0, ._223\n" + " mov r1, #0x6\n" + " bl VarSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._224:\n" + " .align 2, 0\n" + "._223:\n" + " .word 0x4085\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_DadAfterBattle() +{ + asm( + " push {lr}\n" + " ldr r0, ._225\n" + " mov r1, #0x7\n" + " bl VarSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._226:\n" + " .align 2, 0\n" + "._225:\n" + " .word 0x4085\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_SootopolisCity() +{ + asm( + " push {lr}\n" + " mov r0, #0x81\n" + " bl FlagSet\n" + " mov r0, #0x71\n" + " bl FlagSet\n" + " ldr r0, ._227\n" + " bl FlagReset\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._228:\n" + " .align 2, 0\n" + "._227:\n" + " .word 0x32f\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_Embark() +{ + asm( + " push {lr}\n" + " ldr r0, ._229\n" + " bl FlagReset\n" + " ldr r0, ._229 + 4\n" + " mov r1, #0x1\n" + " bl VarSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._230:\n" + " .align 2, 0\n" + "._229:\n" + " .word 0x2e3\n" + " .word 0x4090\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_Yes9999() +{ + asm( + " push {lr}\n" + " ldr r0, ._231\n" + " ldr r1, ._231 + 4\n" + " bl VarSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._232:\n" + " .align 2, 0\n" + "._231:\n" + " .word 0x4048\n" + " .word 0x270f\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_LegendsFlagOn() +{ + asm( + " push {lr}\n" + " mov r0, #0xe4\n" + " bl FlagSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void NoharaDebugMenu_AddNumWinningStreaks() +{ + asm( + " push {lr}\n" + " ldr r0, ._235\n" + " ldr r1, ._235 + 4\n" + " add r2, r0, r1\n" + " ldrh r1, [r2]\n" + " cmp r1, #0x31\n" + " bhi ._233 @cond_branch\n" + " mov r0, #0x32\n" + " b ._244\n" + "._236:\n" + " .align 2, 0\n" + "._235:\n" + " .word gSaveBlock2\n" + " .word 0x572\n" + "._233:\n" + " cmp r1, #0x63\n" + " bhi ._237 @cond_branch\n" + " mov r0, #0x64\n" + " b ._244\n" + "._237:\n" + " ldr r0, ._241\n" + " cmp r1, r0\n" + " bhi ._239 @cond_branch\n" + " add r0, r0, #0x1\n" + " b ._244\n" + "._242:\n" + " .align 2, 0\n" + "._241:\n" + " .word 0x3e7\n" + "._239:\n" + " ldr r0, ._245\n" + " cmp r1, r0\n" + " bhi ._243 @cond_branch\n" + " ldr r0, ._245 + 4\n" + " b ._244\n" + "._246:\n" + " .align 2, 0\n" + "._245:\n" + " .word 0x1387\n" + " .word 0x2706\n" + "._243:\n" + " ldr r0, ._248\n" + " cmp r1, r0\n" + " bhi ._247 @cond_branch\n" + " add r0, r0, #0xa\n" + "._244:\n" + " strh r0, [r2]\n" + "._247:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._249:\n" + " .align 2, 0\n" + "._248:\n" + " .word 0x2705\n" + "\n" + ); +} + +#endif diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c new file mode 100644 index 000000000..4f9b588d8 --- /dev/null +++ b/src/debug/taya_debug_window.c @@ -0,0 +1,2122 @@ +#ifdef DEBUG +#include "global.h" + +EWRAM_DATA u8 unk_2030224[4] = { 0 }; + +__attribute__((naked)) +void TayaDebugMenu_Trend() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xffffffd8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1e\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r5, ._3\n" + " mov r7, #0x0\n" + " mov r0, #0x1\n" + " add r0, r0, sp\n" + " mov sl, r0\n" + " mov r9, sp\n" + " mov r0, #0x0\n" + " mov r8, r0\n" + " add r6, sp, #0x20\n" + "._2:\n" + " ldrb r1, [r5, #0x1]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " mov r1, #0xa1\n" + " cmp r0, #0\n" + " beq ._1 @cond_branch\n" + " mov r1, #0xa2\n" + "._1:\n" + " mov r0, r9\n" + " strb r1, [r0]\n" + " ldrh r1, [r5, #0x4]\n" + " add r0, r6, #0\n" + " bl sub_80EB3FC\n" + " mov r0, sl\n" + " add r1, r6, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x7\n" + " bl StringCopyPadded\n" + " add r4, r0, #0\n" + " ldrh r1, [r5, #0x6]\n" + " add r0, r6, #0\n" + " bl sub_80EB3FC\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x8\n" + " bl StringCopyPadded\n" + " add r4, r0, #0\n" + " ldrb r1, [r5]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x19\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r4, r0, #0\n" + " mov r0, r8\n" + " strb r0, [r4]\n" + " add r4, r4, #0x1\n" + " ldrh r1, [r5]\n" + " lsl r1, r1, #0x12\n" + " lsr r1, r1, #0x19\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r4, r0, #0\n" + " mov r0, r8\n" + " strb r0, [r4]\n" + " add r4, r4, #0x1\n" + " ldrh r1, [r5, #0x2]\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " lsl r2, r7, #0x1\n" + " add r2, r2, #0x1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r0, sp\n" + " mov r1, #0x1\n" + " bl MenuPrint\n" + " add r5, r5, #0x8\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r7, r0, #0x10\n" + " cmp r7, #0x4\n" + " bls ._2 @cond_branch\n" + " ldr r1, ._3 + 4\n" + " ldr r0, ._3 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x28\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gSaveBlock1+0x2dd4\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8090808+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090808() +{ + asm( + " push {lr}\n" + " ldr r0, ._7\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x3\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._5 @cond_branch\n" + " mov r0, #0x0\n" + " b ._6\n" + "._8:\n" + " .align 2, 0\n" + "._7:\n" + " .word gMain\n" + "._5:\n" + " bl MenuZeroFillScreen\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._6:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_TrendR() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r0, #0x0\n" + " ldr r7, ._11\n" + "._10:\n" + " mov r4, #0x0\n" + " lsl r5, r0, #0x3\n" + " add r6, r0, #1\n" + "._9:\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0x16\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl sub_80EB72C\n" + " lsl r1, r4, #0x1\n" + " add r1, r1, r5\n" + " add r1, r1, r7\n" + " strh r0, [r1]\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0x1\n" + " bls ._9 @cond_branch\n" + " lsl r0, r6, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0x4\n" + " bls ._10 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._12:\n" + " .align 2, 0\n" + "._11:\n" + " .word gSaveBlock1+0x2dd8\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090880() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._13 @cond_branch\n" + " mov r0, #0x0\n" + " b ._14\n" + "._13:\n" + " bl sub_80E60D8\n" + " mov r0, #0x1\n" + "._14:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_809089C() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._15 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " bne ._16 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._17\n" + "._16:\n" + " ldr r2, ._19\n" + " ldr r0, ._19 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " strh r0, [r2]\n" + " ldrh r0, [r2]\n" + " sub r0, r0, #0x5\n" + " cmp r0, #0x7\n" + " bhi ._27 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._19 + 8\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._20:\n" + " .align 2, 0\n" + "._19:\n" + " .word gSpecialVar_0x8004\n" + " .word gUnknown_Debug_083C4EC0\n" + " .word ._21\n" + "._21:\n" + " .word ._29\n" + " .word ._27\n" + " .word ._29\n" + " .word ._29\n" + " .word ._27\n" + " .word ._27\n" + " .word ._29\n" + " .word ._29\n" + "._29:\n" + " ldr r0, ._30\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " ldr r0, ._30 + 4\n" + " strh r1, [r0]\n" + "._27:\n" + " mov r0, #0x1\n" + " mov r1, #0x0\n" + " bl fade_screen\n" + " ldr r1, ._30 + 8\n" + " ldr r0, ._30 + 12\n" + " str r0, [r1]\n" + "._15:\n" + " mov r0, #0x0\n" + "._17:\n" + " pop {r1}\n" + " bx r1\n" + "._31:\n" + " .align 2, 0\n" + "._30:\n" + " .word gSpecialVar_0x8005\n" + " .word gSpecialVar_0x8006\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8090880+1\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_SimpleText() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xc\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._32\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xb\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._32 + 4\n" + " ldr r0, ._32 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._33:\n" + " .align 2, 0\n" + "._32:\n" + " .word gUnknown_Debug_083C4EC0\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_809089C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090984() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " bl ProcessMenuInput\n" + " lsl r2, r0, #0x18\n" + " asr r1, r2, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._34 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " beq ._46 @cond_branch\n" + " cmp r1, #0x4\n" + " bgt ._36 @cond_branch\n" + " lsr r0, r2, #0x18\n" + " bl debug_sub_810B32C\n" + " b ._46\n" + "._34:\n" + " mov r0, #0x0\n" + " b ._38\n" + "._36:\n" + " cmp r1, #0x5\n" + " bne ._39 @cond_branch\n" + " bl sub_80F7F30\n" + " b ._46\n" + "._39:\n" + " cmp r1, #0x6\n" + " bne ._41 @cond_branch\n" + " mov r4, #0x0\n" + " ldr r0, ._44\n" + " add r1, r0, #2\n" + " mov ip, r1\n" + " ldr r7, ._44 + 4\n" + " ldr r1, ._44 + 8\n" + " add r6, r0, r1\n" + " add r5, r0, #0\n" + " add r5, r5, #0xe\n" + "._42:\n" + " lsl r1, r4, #0x1\n" + " mov r0, ip\n" + " add r3, r1, r0\n" + " add r0, r1, r7\n" + " ldrh r2, [r0]\n" + " strh r2, [r3]\n" + " add r0, r1, r5\n" + " strh r2, [r0]\n" + " add r1, r6, r1\n" + " strh r2, [r1]\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0x2\n" + " bls ._42 @cond_branch\n" + " b ._46\n" + "._45:\n" + " .align 2, 0\n" + "._44:\n" + " .word gSaveBlock1+0x2d94\n" + " .word gUnknown_Debug_083C4F08\n" + " .word 0xfffffd94\n" + "._41:\n" + " cmp r1, #0x7\n" + " bne ._46 @cond_branch\n" + " mov r4, #0x0\n" + "._47:\n" + " lsl r0, r4, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl sub_80EB890\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0x20\n" + " bls ._47 @cond_branch\n" + "._46:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._38:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_OldMan() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xa\n" + " mov r3, #0x11\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._48\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " bl PrintMenuItems\n" + " bl GetCurrentMauvilleOldMan\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " str r0, [sp]\n" + " mov r0, #0x9\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " ldr r1, ._48 + 4\n" + " ldr r0, ._48 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._49:\n" + " .align 2, 0\n" + "._48:\n" + " .word gUnknown_Debug_083C4F54\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8090984+1\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_LanettesPC() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " bl ShowPokemonStorageSystem\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_TownFlags() +{ + asm( + " push {lr}\n" + " ldr r0, ._50\n" + " bl FlagSet\n" + " mov r0, #0x81\n" + " lsl r0, r0, #0x4\n" + " bl FlagSet\n" + " ldr r0, ._50 + 4\n" + " bl FlagSet\n" + " ldr r0, ._50 + 8\n" + " bl FlagSet\n" + " ldr r0, ._50 + 12\n" + " bl FlagSet\n" + " ldr r0, ._50 + 16\n" + " bl FlagSet\n" + " ldr r0, ._50 + 20\n" + " bl FlagSet\n" + " ldr r0, ._50 + 24\n" + " bl FlagSet\n" + " ldr r0, ._50 + 28\n" + " bl FlagSet\n" + " ldr r0, ._50 + 32\n" + " bl FlagSet\n" + " ldr r0, ._50 + 36\n" + " bl FlagSet\n" + " ldr r0, ._50 + 40\n" + " bl FlagSet\n" + " ldr r0, ._50 + 44\n" + " bl FlagSet\n" + " ldr r0, ._50 + 48\n" + " bl FlagSet\n" + " ldr r0, ._50 + 52\n" + " bl FlagSet\n" + " ldr r0, ._50 + 56\n" + " bl FlagSet\n" + " ldr r0, ._50 + 60\n" + " bl FlagSet\n" + " ldr r0, ._50 + 64\n" + " bl FlagSet\n" + " ldr r0, ._50 + 68\n" + " bl FlagSet\n" + " ldr r0, ._50 + 72\n" + " bl FlagSet\n" + " ldr r0, ._50 + 76\n" + " bl FlagSet\n" + " ldr r0, ._50 + 80\n" + " bl FlagSet\n" + " ldr r0, ._50 + 84\n" + " bl FlagSet\n" + " ldr r0, ._50 + 88\n" + " bl FlagSet\n" + " ldr r0, ._50 + 92\n" + " bl FlagSet\n" + " ldr r0, ._50 + 96\n" + " bl FlagSet\n" + " ldr r0, ._50 + 100\n" + " bl FlagSet\n" + " ldr r0, ._50 + 104\n" + " bl FlagSet\n" + " ldr r0, ._50 + 108\n" + " bl FlagSet\n" + " ldr r0, ._50 + 112\n" + " bl FlagSet\n" + " ldr r0, ._50 + 116\n" + " bl FlagSet\n" + " ldr r0, ._50 + 120\n" + " bl FlagSet\n" + " mov r0, #0x84\n" + " lsl r0, r0, #0x4\n" + " bl FlagSet\n" + " ldr r0, ._50 + 124\n" + " bl FlagSet\n" + " ldr r0, ._50 + 128\n" + " bl FlagSet\n" + " ldr r0, ._50 + 132\n" + " bl FlagSet\n" + " ldr r0, ._50 + 136\n" + " bl FlagSet\n" + " ldr r0, ._50 + 140\n" + " bl FlagSet\n" + " ldr r0, ._50 + 144\n" + " bl FlagSet\n" + " ldr r0, ._50 + 148\n" + " bl FlagSet\n" + " ldr r0, ._50 + 152\n" + " bl FlagSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._51:\n" + " .align 2, 0\n" + "._50:\n" + " .word 0x80f\n" + " .word 0x811\n" + " .word 0x812\n" + " .word 0x813\n" + " .word 0x814\n" + " .word 0x815\n" + " .word 0x816\n" + " .word 0x817\n" + " .word 0x818\n" + " .word 0x819\n" + " .word 0x81a\n" + " .word 0x81b\n" + " .word 0x81c\n" + " .word 0x81d\n" + " .word 0x81e\n" + " .word 0x848\n" + " .word 0x849\n" + " .word 0x84a\n" + " .word 0x854\n" + " .word 0x855\n" + " .word 0x856\n" + " .word 0x857\n" + " .word 0x858\n" + " .word 0x859\n" + " .word 0x85a\n" + " .word 0x85b\n" + " .word 0x85c\n" + " .word 0x83c\n" + " .word 0x83d\n" + " .word 0x83e\n" + " .word 0x83f\n" + " .word 0x841\n" + " .word 0x842\n" + " .word 0x843\n" + " .word 0x844\n" + " .word 0x845\n" + " .word 0x846\n" + " .word 0x847\n" + " .word 0x83b\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_AwardARibbon() +{ + asm( + " push {lr}\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x10\n" + " mov r2, #0x0\n" + " bl BlendPalettes\n" + " ldr r0, ._52\n" + " bl SetMainCallback2\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._53:\n" + " .align 2, 0\n" + "._52:\n" + " .word debug_sub_80915BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090C44() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r4, ._54\n" + " sub r5, r4, #1\n" + " ldrh r1, [r5, #0x8]\n" + " add r0, r4, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x5\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x5\n" + " bl StringFill\n" + " ldrb r0, [r5]\n" + " add r0, r0, r4\n" + " mov r1, #0x79\n" + " strb r1, [r0]\n" + " add r0, r4, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._55:\n" + " .align 2, 0\n" + "._54:\n" + " .word +0x2000001\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8090C88() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " mov r8, r0\n" + " ldr r2, ._59\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " add r3, r2, #0\n" + " cmp r0, #0\n" + " beq ._57 @cond_branch\n" + " ldr r1, ._59 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._57 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._62\n" + "._60:\n" + " .align 2, 0\n" + "._59:\n" + " .word gMain\n" + " .word +0x2000000\n" + "._67:\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._62\n" + "._77:\n" + " strh r1, [r7, #0x8]\n" + " b ._62\n" + "._79:\n" + " ldr r0, ._64\n" + " ldrh r0, [r0, #0x8]\n" + " bl SetLotteryNumber16_Unused\n" + "._78:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._63\n" + "._65:\n" + " .align 2, 0\n" + "._64:\n" + " .word +0x2000000\n" + "._57:\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._66 @cond_branch\n" + " ldr r1, ._81\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x3\n" + " bls ._67 @cond_branch\n" + "._66:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._68 @cond_branch\n" + " ldr r0, ._81\n" + " ldrh r1, [r0, #0x8]\n" + " str r1, [r0, #0xc]\n" + " ldr r1, ._81 + 4\n" + " strh r1, [r0, #0x10]\n" + " mov r4, #0x0\n" + " ldrb r1, [r0]\n" + " add r7, r0, #0\n" + " cmp r4, r1\n" + " bcs ._69 @cond_branch\n" + " add r5, r7, #0\n" + " add r6, r1, #0\n" + "._70:\n" + " ldrh r0, [r5, #0x10]\n" + " mov r1, #0xa\n" + " str r3, [sp]\n" + " bl __udivsi3\n" + " strh r0, [r5, #0x10]\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r3, [sp]\n" + " cmp r4, r6\n" + " bcc ._70 @cond_branch\n" + "._69:\n" + " ldrh r1, [r7, #0x10]\n" + " ldr r0, [r7, #0xc]\n" + " add r0, r0, r1\n" + " str r0, [r7, #0xc]\n" + " ldr r1, ._81 + 8\n" + " cmp r0, r1\n" + " ble ._71 @cond_branch\n" + " str r1, [r7, #0xc]\n" + "._71:\n" + " ldrh r0, [r7, #0x8]\n" + " ldr r1, [r7, #0xc]\n" + " cmp r0, r1\n" + " bne ._77 @cond_branch\n" + "._68:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._73 @cond_branch\n" + " ldr r0, ._81\n" + " ldrh r1, [r0, #0x8]\n" + " str r1, [r0, #0xc]\n" + " ldr r1, ._81 + 4\n" + " strh r1, [r0, #0x10]\n" + " mov r4, #0x0\n" + " ldrb r1, [r0]\n" + " add r7, r0, #0\n" + " cmp r4, r1\n" + " bcs ._74 @cond_branch\n" + " add r5, r7, #0\n" + " add r6, r1, #0\n" + "._75:\n" + " ldrh r0, [r5, #0x10]\n" + " mov r1, #0xa\n" + " str r3, [sp]\n" + " bl __udivsi3\n" + " strh r0, [r5, #0x10]\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r3, [sp]\n" + " cmp r4, r6\n" + " bcc ._75 @cond_branch\n" + "._74:\n" + " add r2, r7, #0\n" + " ldrh r1, [r2, #0x10]\n" + " ldr r0, [r2, #0xc]\n" + " sub r0, r0, r1\n" + " str r0, [r2, #0xc]\n" + " cmp r0, #0\n" + " bge ._76 @cond_branch\n" + " mov r0, #0x0\n" + " str r0, [r2, #0xc]\n" + "._76:\n" + " ldrh r0, [r2, #0x8]\n" + " ldr r1, [r2, #0xc]\n" + " cmp r0, r1\n" + " bne ._77 @cond_branch\n" + "._73:\n" + " ldrh r2, [r3, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._78 @cond_branch\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._79 @cond_branch\n" + " mov r0, #0x0\n" + " mov r8, r0\n" + "._62:\n" + " mov r0, r8\n" + " cmp r0, #0\n" + " beq ._80 @cond_branch\n" + " bl debug_sub_8090C44\n" + "._80:\n" + " mov r0, #0x0\n" + "._63:\n" + " add sp, sp, #0x4\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._82:\n" + " .align 2, 0\n" + "._81:\n" + " .word +0x2000000\n" + " .word 0x2710\n" + " .word 0xffff\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_PKMNLottery() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x6\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " bl RetrieveLotteryNumber\n" + " ldr r2, ._83\n" + " ldr r0, ._83 + 4\n" + " ldrh r0, [r0]\n" + " mov r1, #0x0\n" + " strh r0, [r2, #0x8]\n" + " strb r1, [r2]\n" + " bl debug_sub_8090C44\n" + " ldr r1, ._83 + 8\n" + " ldr r0, ._83 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._84:\n" + " .align 2, 0\n" + "._83:\n" + " .word +0x2000000\n" + " .word gScriptResult\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_8090C88+1\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_Trainer() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._86\n" + "._85:\n" + " lsl r0, r4, #0x4\n" + " add r0, r0, r5\n" + " ldrh r0, [r0]\n" + " bl trainer_flag_set\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0x37\n" + " bls ._85 @cond_branch\n" + " ldr r0, ._86 + 4\n" + " bl trainer_flag_set\n" + " mov r0, #0x85\n" + " lsl r0, r0, #0x1\n" + " bl trainer_flag_set\n" + " ldr r0, ._86 + 8\n" + " bl trainer_flag_set\n" + " mov r0, #0x86\n" + " lsl r0, r0, #0x1\n" + " bl trainer_flag_set\n" + " ldr r0, ._86 + 12\n" + " bl trainer_flag_set\n" + " mov r0, #0x87\n" + " lsl r0, r0, #0x1\n" + " bl trainer_flag_set\n" + " ldr r0, ._86 + 16\n" + " bl trainer_flag_set\n" + " mov r0, #0x88\n" + " lsl r0, r0, #0x1\n" + " bl trainer_flag_set\n" + " ldr r0, ._86 + 20\n" + " bl trainer_flag_set\n" + " mov r0, #0x83\n" + " lsl r0, r0, #0x1\n" + " bl trainer_flag_set\n" + " ldr r0, ._86 + 24\n" + " bl trainer_flag_set\n" + " mov r0, #0x84\n" + " lsl r0, r0, #0x1\n" + " bl trainer_flag_set\n" + " ldr r0, ._86 + 28\n" + " bl trainer_flag_set\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "._87:\n" + " .align 2, 0\n" + "._86:\n" + " .word gTrainerEyeTrainers\n" + " .word 0x109\n" + " .word 0x10b\n" + " .word 0x10d\n" + " .word 0x10f\n" + " .word 0x105\n" + " .word 0x107\n" + " .word 0x14f\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_PokenavD() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xffffffe4\n" + " bl MenuDisplayMessageBox\n" + " mov r0, #0x0\n" + " mov sl, r0\n" + " mov r6, #0x1\n" + " mov r7, #0xff\n" + " mov r1, #0x3\n" + " mov r9, r1\n" + "._93:\n" + " ldr r4, ._94\n" + " add r0, r4, #0\n" + " ldr r1, ._94 + 4\n" + " bl StringCopy\n" + " mov r5, sl\n" + " add r5, r5, #0x1\n" + " add r1, r5, r4\n" + " mov r0, #0xff\n" + " strb r0, [r1]\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " mov r8, r0\n" + " str r5, [sp, #0x14]\n" + " mov r1, sl\n" + " lsl r1, r1, #0x2\n" + " str r1, [sp, #0x18]\n" + "._91:\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " add r0, r0, #0x1\n" + " str r0, [sp, #0x10]\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0x64\n" + " bl __umodsi3\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " bl Random\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0xc1\n" + " lsl r1, r1, #0x1\n" + " bl __umodsi3\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " cmp r3, #0xfb\n" + " bls ._89 @cond_branch\n" + " add r0, r3, #0\n" + " add r0, r0, #0x19\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " ldr r0, ._94 + 8\n" + " cmp r3, r0\n" + " bls ._89 @cond_branch\n" + " mov r3, #0x1\n" + "._89:\n" + " ldr r0, [sp, #0x18]\n" + " add r0, r0, sl\n" + " lsl r4, r0, #0x4\n" + " sub r4, r4, r0\n" + " lsl r4, r4, #0x5\n" + " mov r1, r8\n" + " lsl r0, r1, #0x2\n" + " add r0, r0, r8\n" + " lsl r0, r0, #0x4\n" + " ldr r1, ._94 + 12\n" + " add r0, r0, r1\n" + " add r4, r4, r0\n" + " lsl r2, r5, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " str r6, [sp, #0x8]\n" + " ldr r0, [sp, #0x10]\n" + " str r0, [sp, #0xc]\n" + " add r0, r4, #0\n" + " add r1, r3, #0\n" + " mov r3, #0x20\n" + " bl CreateBoxMon\n" + " bl Random\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x16\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x17\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x18\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x21\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x2f\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x30\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " mov r1, r9\n" + " and r1, r1, r0\n" + " add r1, r1, #0x1\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x32\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " mov r1, r9\n" + " and r1, r1, r0\n" + " add r1, r1, #0x1\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x33\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " mov r1, r9\n" + " and r1, r1, r0\n" + " add r1, r1, #0x1\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x34\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " mov r1, r9\n" + " and r1, r1, r0\n" + " add r1, r1, #0x1\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x36\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " mov r1, r9\n" + " and r1, r1, r0\n" + " add r1, r1, #0x1\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x35\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x43\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x44\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x45\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x46\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x47\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x48\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x49\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x4a\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x4b\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x4c\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x4d\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " bl Random\n" + " add r1, r6, #0\n" + " and r1, r1, r0\n" + " str r1, [sp, #0x10]\n" + " add r0, r4, #0\n" + " mov r1, #0x4e\n" + " add r2, sp, #0x10\n" + " bl SetBoxMonData\n" + " mov r0, r8\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r8, r0\n" + " cmp r0, #0x1d\n" + " bhi ._90 @cond_branch\n" + " b ._91\n" + "._90:\n" + " ldr r1, [sp, #0x14]\n" + " lsl r0, r1, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov sl, r0\n" + " cmp r0, #0xd\n" + " bhi ._92 @cond_branch\n" + " b ._93\n" + "._92:\n" + " bl TayaDebugMenu_TownFlags\n" + " bl TayaDebugMenu_Trainer\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " add sp, sp, #0x1c\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._95:\n" + " .align 2, 0\n" + "._94:\n" + " .word +0x2000000\n" + " .word gUnknown_Debug_083C4F94\n" + " .word 0x19b\n" + " .word gPokemonStorage+0x4\n" + "\n" + ); +} + +__attribute__((naked)) +void TayaDebugMenu_8091190() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r3, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r3, r0\n" + " beq ._96 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r3, r0\n" + " beq ._97 @cond_branch\n" + " ldr r2, ._99\n" + " ldr r1, ._99 + 4\n" + " ldr r0, ._99 + 8\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x18\n" + " asr r0, r0, #0x18\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, [r0]\n" + " lsl r0, r3, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0, #0x4]\n" + " str r0, [r2]\n" + "._106:\n" + " mov r0, #0x0\n" + " b ._98\n" + "._100:\n" + " .align 2, 0\n" + "._99:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_83C5068\n" + " .word unk_2030224\n" + "._96:\n" + " ldr r3, ._107\n" + " ldrb r4, [r3]\n" + " ldr r2, ._107 + 4\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " add r5, r3, #0\n" + " cmp r0, #0\n" + " beq ._102 @cond_branch\n" + " sub r0, r4, #1\n" + " strb r0, [r5]\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bge ._102 @cond_branch\n" + " mov r0, #0x1\n" + " strb r0, [r5]\n" + "._102:\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._104 @cond_branch\n" + " ldrb r0, [r5]\n" + " add r0, r0, #0x1\n" + " strb r0, [r5]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bls ._104 @cond_branch\n" + " mov r0, #0x0\n" + " strb r0, [r5]\n" + "._104:\n" + " lsl r0, r4, #0x18\n" + " asr r0, r0, #0x18\n" + " mov r1, #0x0\n" + " ldrsb r1, [r5, r1]\n" + " cmp r0, r1\n" + " beq ._106 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xb\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r4, ._107 + 8\n" + " mov r0, #0x0\n" + " ldrsb r0, [r5, r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r4\n" + " ldrb r2, [r0, #0x4]\n" + " ldr r3, [r0]\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " ldrsb r0, [r5, r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r4\n" + " ldrb r3, [r0, #0x4]\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xa\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl InitMenu\n" + " b ._106\n" + "._108:\n" + " .align 2, 0\n" + "._107:\n" + " .word unk_2030224\n" + " .word gMain\n" + " .word gUnknown_Debug_83C5068\n" + "._97:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._98:\n" + " add sp, sp, #0x8\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void InitTayaDebugWindow() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " ldr r1, ._109\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xb\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._109 + 4\n" + " ldr r3, [r0]\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xa\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._109 + 8\n" + " ldr r0, ._109 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._110:\n" + " .align 2, 0\n" + "._109:\n" + " .word unk_2030224\n" + " .word gUnknown_Debug_83C5068\n" + " .word gCallback_03004AE8\n" + " .word TayaDebugMenu_8091190+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80912D8() +{ + asm( + " push {lr}\n" + " ldr r0, ._113\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._111 @cond_branch\n" + " mov r0, #0x0\n" + " b ._112\n" + "._114:\n" + " .align 2, 0\n" + "._113:\n" + " .word gPaletteFade\n" + "._111:\n" + " ldr r0, ._115\n" + " bl SetMainCallback2\n" + " mov r0, #0x1\n" + "._112:\n" + " pop {r1}\n" + " bx r1\n" + "._116:\n" + " .align 2, 0\n" + "._115:\n" + " .word debug_sub_8110F28+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8091300() +{ + asm( + " push {lr}\n" + " mov r0, #0x1\n" + " mov r1, #0x0\n" + " bl fade_screen\n" + " ldr r1, ._117\n" + " ldr r0, ._117 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._118:\n" + " .align 2, 0\n" + "._117:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_80912D8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8091320() +{ + asm( + " push {lr}\n" + " bl LoadOam\n" + " bl ProcessSpriteCopyRequests\n" + " bl TransferPlttBuffer\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8091334() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " ldr r3, ._123\n" + " add r0, r3, #0\n" + " add r0, r0, #0x52\n" + " ldrb r4, [r0]\n" + " cmp r4, #0\n" + " beq ._119 @cond_branch\n" + " cmp r4, #0x1\n" + " bne ._120 @cond_branch\n" + " b ._121\n" + "._120:\n" + " b ._162\n" + "._124:\n" + " .align 2, 0\n" + "._123:\n" + " .word +0x2000000\n" + "._119:\n" + " add r5, r3, #0\n" + " add r5, r5, #0x55\n" + " strb r4, [r5]\n" + " ldr r2, ._131\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " mov r9, r2\n" + " cmp r0, #0\n" + " beq ._126 @cond_branch\n" + " add r1, r3, #0\n" + " add r1, r1, #0x54\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._126 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x1\n" + " strb r0, [r5]\n" + "._126:\n" + " mov r0, r9\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " ldr r5, ._131 + 4\n" + " cmp r0, #0\n" + " beq ._133 @cond_branch\n" + " add r0, r5, #0\n" + " add r0, r0, #0x53\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x2\n" + " beq ._128 @cond_branch\n" + " add r1, r5, #0\n" + " add r1, r1, #0x54\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x4\n" + " bhi ._133 @cond_branch\n" + " b ._130\n" + "._132:\n" + " .align 2, 0\n" + "._131:\n" + " .word gMain\n" + " .word +0x2000000\n" + "._128:\n" + " add r1, r5, #0\n" + " add r1, r1, #0x54\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x3\n" + " bhi ._133 @cond_branch\n" + "._130:\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " add r1, r1, #0x1\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + "._133:\n" + " mov r2, r9\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._135 @cond_branch\n" + " add r1, r5, #0\n" + " add r1, r1, #0x53\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._135 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " add r1, r1, #0x2\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + "._135:\n" + " mov r3, r9\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._140 @cond_branch\n" + " add r0, r5, #0\n" + " add r0, r0, #0x54\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x5\n" + " beq ._137 @cond_branch\n" + " add r1, r5, #0\n" + " add r1, r1, #0x53\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x1\n" + " bhi ._140 @cond_branch\n" + " b ._139\n" + "._137:\n" + " add r1, r5, #0\n" + " add r1, r1, #0x53\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._140 @cond_branch\n" + "._139:\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " add r1, r1, #0x2\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + "._140:\n" + " add r0, r5, #0\n" + " add r0, r0, #0x55\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._141 @cond_branch\n" + " mov r0, r9\n" + " ldrh r2, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._142 @cond_branch\n" + " ldr r2, ._145\n" + " add r3, r5, #0\n" + " add r3, r3, #0x53\n" + " add r0, r5, #0\n" + " add r0, r0, #0x54\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " ldrb r3, [r3]\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r2\n" + " ldrh r0, [r0, #0x4]\n" + " sub r0, r0, #0x32\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0x4\n" + " bhi ._143 @cond_branch\n" + " add r1, r5, #0\n" + " add r1, r1, #0x56\n" + " mov r0, #0x4\n" + " b ._144\n" + "._146:\n" + " .align 2, 0\n" + "._145:\n" + " .word gUnknown_Debug_083C50EC\n" + "._143:\n" + " add r1, r5, #0\n" + " add r1, r1, #0x56\n" + " mov r0, #0x1\n" + "._144:\n" + " strb r0, [r1]\n" + " add r1, r5, #0\n" + " add r1, r1, #0x52\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " b ._162\n" + "._142:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._148 @cond_branch\n" + " b ._162\n" + "._148:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x10\n" + " mov r2, #0x0\n" + " bl BlendPalettes\n" + " ldr r0, ._151\n" + " bl SetMainCallback2\n" + " b ._162\n" + "._152:\n" + " .align 2, 0\n" + "._151:\n" + " .word sub_80546F0+1\n" + "._121:\n" + " add r5, r3, #0\n" + " add r5, r5, #0x55\n" + " mov r0, #0x0\n" + " strb r0, [r5]\n" + " ldr r2, ._159\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " mov r9, r2\n" + " cmp r0, #0\n" + " beq ._154 @cond_branch\n" + " add r2, r3, #0\n" + " add r2, r2, #0x53\n" + " add r0, r3, #0\n" + " add r0, r0, #0x54\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " add r2, r0, r3\n" + " add r0, r3, #0\n" + " add r0, r0, #0x56\n" + " ldrb r1, [r2]\n" + " ldrb r0, [r0]\n" + " cmp r1, r0\n" + " bcs ._154 @cond_branch\n" + " add r0, r1, #1\n" + " strb r0, [r2]\n" + " strb r4, [r5]\n" + "._154:\n" + " mov r2, r9\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " ldr r5, ._159 + 4\n" + " cmp r0, #0\n" + " beq ._156 @cond_branch\n" + " add r2, r5, #0\n" + " add r2, r2, #0x53\n" + " add r0, r5, #0\n" + " add r0, r0, #0x54\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x1\n" + " add r0, r0, r1\n" + " ldrb r2, [r2]\n" + " add r0, r0, r2\n" + " add r1, r0, r5\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._156 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " add r1, r5, #0\n" + " add r1, r1, #0x55\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + "._156:\n" + " add r6, r5, #0\n" + " add r0, r6, #0\n" + " add r0, r0, #0x55\n" + " ldrb r7, [r0]\n" + " cmp r7, #0\n" + " beq ._157 @cond_branch\n" + "._141:\n" + " bl debug_sub_80916AC\n" + " b ._162\n" + "._160:\n" + " .align 2, 0\n" + "._159:\n" + " .word gMain\n" + " .word +0x2000000\n" + "._157:\n" + " mov r3, r9\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._161 @cond_branch\n" + " ldr r0, ._164\n" + " ldr r1, ._164 + 4\n" + " mov ip, r1\n" + " mov r2, #0x53\n" + " add r2, r2, r6\n" + " mov r8, r2\n" + " add r4, r6, #0\n" + " add r4, r4, #0x54\n" + " ldrb r2, [r4]\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r2\n" + " mov r3, r8\n" + " ldrb r3, [r3]\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, ip\n" + " ldrh r1, [r1, #0x4]\n" + " bl GetMonData\n" + " ldrb r2, [r4]\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r2\n" + " mov r2, r8\n" + " ldrb r2, [r2]\n" + " add r1, r1, r2\n" + " add r1, r1, r6\n" + " strb r0, [r1]\n" + " bl debug_sub_80916AC\n" + " add r0, r6, #0\n" + " add r0, r0, #0x52\n" + " strb r7, [r0]\n" + "._161:\n" + " mov r3, r9\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._162 @cond_branch\n" + " ldr r2, ._164 + 4\n" + " add r0, r6, #0\n" + " add r0, r0, #0x53\n" + " ldrb r4, [r0]\n" + " add r0, r0, #0x1\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x1\n" + " add r3, r0, r1\n" + " add r0, r3, r4\n" + " lsl r0, r0, #0x3\n" + " add r1, r0, r2\n" + " ldrh r0, [r1, #0x4]\n" + " cmp r0, #0\n" + " beq ._163 @cond_branch\n" + " ldr r0, ._164\n" + " ldrh r1, [r1, #0x4]\n" + " add r2, r4, r6\n" + " add r2, r3, r2\n" + " bl SetMonData\n" + "._163:\n" + " add r0, r5, #0\n" + " add r0, r0, #0x52\n" + " strb r7, [r0]\n" + "._162:\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._165:\n" + " .align 2, 0\n" + "._164:\n" + " .word gPlayerParty\n" + " .word gUnknown_Debug_083C50EC\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80915BC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " ldr r0, ._168\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " mov r1, #0x0\n" + " ldr r0, ._168 + 4\n" + " mov r8, r0\n" + " ldr r7, ._168 + 8\n" + "._171:\n" + " mov r4, #0x0\n" + " lsl r0, r1, #0x1\n" + " add r6, r1, #1\n" + " add r5, r0, r1\n" + "._170:\n" + " add r0, r5, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r8\n" + " ldrh r1, [r0, #0x4]\n" + " cmp r1, #0\n" + " beq ._166 @cond_branch\n" + " ldr r0, ._168 + 12\n" + " bl GetMonData\n" + " add r1, r4, r5\n" + " add r1, r1, r7\n" + " strb r0, [r1]\n" + " b ._167\n" + "._169:\n" + " .align 2, 0\n" + "._168:\n" + " .word 0x4000010\n" + " .word gUnknown_Debug_083C50EC\n" + " .word +0x2000000\n" + " .word gPlayerParty\n" + "._166:\n" + " add r0, r4, r5\n" + " add r0, r0, r7\n" + " strb r1, [r0]\n" + "._167:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x2\n" + " bls ._170 @cond_branch\n" + " lsl r0, r6, #0x18\n" + " lsr r1, r0, #0x18\n" + " cmp r1, #0x5\n" + " bls ._171 @cond_branch\n" + " ldr r4, ._172\n" + " add r0, r4, #0\n" + " bl SetUpWindowConfig\n" + " add r0, r4, #0\n" + " bl InitMenuWindow\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x3\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._172 + 4\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " mov r1, #0x4\n" + " mov r2, #0x1d\n" + " mov r3, #0x11\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x0\n" + " mov r1, #0x12\n" + " mov r2, #0x1d\n" + " mov r3, #0x15\n" + " bl MenuDrawTextWindow\n" + " mov r1, #0x80\n" + " lsl r1, r1, #0x13\n" + " mov r2, #0x8a\n" + " lsl r2, r2, #0x5\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r2, ._172 + 8\n" + " add r0, r2, #0\n" + " add r0, r0, #0x53\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " add r0, r0, #0x1\n" + " strb r1, [r0]\n" + " sub r0, r0, #0x2\n" + " strb r1, [r0]\n" + " bl debug_sub_80916AC\n" + " ldr r0, ._172 + 12\n" + " bl SetVBlankCallback\n" + " ldr r0, ._172 + 16\n" + " bl SetMainCallback2\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._173:\n" + " .align 2, 0\n" + "._172:\n" + " .word gWindowConfig_81E7224\n" + " .word gUnknown_Debug_083C517C\n" + " .word +0x2000000\n" + " .word debug_sub_8091320+1\n" + " .word debug_sub_8091334+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80916AC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " mov r6, #0x0\n" + " ldr r0, ._177\n" + " mov sl, r0\n" + " mov r1, #0x0\n" + " mov r8, r1\n" + "._182:\n" + " ldr r2, ._177 + 4\n" + " mov r5, #0x0\n" + " lsl r0, r6, #0x1\n" + " mov r9, r0\n" + " add r1, r6, #1\n" + " str r1, [sp]\n" + "._181:\n" + " mov r0, sl\n" + " add r0, r0, #0x53\n" + " ldrb r0, [r0]\n" + " cmp r0, r5\n" + " bne ._175 @cond_branch\n" + " ldr r1, ._177 + 8\n" + " ldrb r0, [r1]\n" + " cmp r0, r6\n" + " bne ._175 @cond_branch\n" + " mov r0, #0xef\n" + " b ._176\n" + "._178:\n" + " .align 2, 0\n" + "._177:\n" + " .word +0x2000000\n" + " .word +0x2000012\n" + " .word +0x2000054\n" + "._175:\n" + " mov r0, r8\n" + " strb r0, [r2]\n" + " add r2, r2, #0x1\n" + "._176:\n" + " strb r0, [r2]\n" + " add r2, r2, #0x1\n" + " mov r1, r9\n" + " add r4, r1, r6\n" + " add r0, r4, r5\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._183\n" + " add r0, r0, r1\n" + " ldr r1, [r0]\n" + " add r0, r2, #0\n" + " bl StringCopy\n" + " add r2, r0, #0\n" + " mov r0, r8\n" + " strb r0, [r2]\n" + " add r2, r2, #0x1\n" + " ldr r7, ._183 + 4\n" + " add r4, r5, r4\n" + " add r4, r4, r7\n" + " ldrb r1, [r4]\n" + " add r0, r2, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " add r2, r0, #0\n" + " mov r1, r8\n" + " strb r1, [r2]\n" + " add r2, r2, #0x1\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x2\n" + " bhi ._179 @cond_branch\n" + " cmp r6, #0x5\n" + " bne ._181 @cond_branch\n" + " cmp r5, #0x2\n" + " bne ._181 @cond_branch\n" + "._179:\n" + " sub r1, r2, #1\n" + " mov r0, #0xff\n" + " strb r0, [r1]\n" + " mov r2, r9\n" + " add r2, r2, #0x5\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " add r0, r7, #0\n" + " add r0, r0, #0x12\n" + " mov r1, #0x1\n" + " bl MenuPrint\n" + " ldr r1, [sp]\n" + " lsl r0, r1, #0x18\n" + " lsr r6, r0, #0x18\n" + " cmp r6, #0x5\n" + " bls ._182 @cond_branch\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._184:\n" + " .align 2, 0\n" + "._183:\n" + " .word gUnknown_Debug_083C50EC\n" + " .word +0x2000000\n" + "\n" + ); +} + +#endif diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c new file mode 100644 index 000000000..f745f2993 --- /dev/null +++ b/src/debug/tomomichi_debug_menu.c @@ -0,0 +1,8643 @@ +#ifdef DEBUG +#include "global.h" + +#define BSS_DATA __attribute__((section(".bss"))) + +BSS_DATA u8 gDebug_03000700[0x24] = { 0 }; + +__attribute__((naked)) +void InitTomomichiDebugWindow() +{ + asm( + " push {lr}\n" + " bl debug_sub_808B874\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808B868() +{ + asm( + " push {lr}\n" + " bl c2_exit_to_overworld_1_continue_scripts_restart_music\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808B874() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xd\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._1\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " ldr r0, ._1 + 4\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, #0xc\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._1 + 8\n" + " ldr r0, ._1 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word gUnknown_Debug_083C0CBA\n" + " .word gDebug_03000700+0x1d\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808B8C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808B8C8() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._7\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._3 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl MoveMenuCursor\n" + " ldr r1, ._7 + 4\n" + " strb r0, [r1]\n" + "._3:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._4 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl MoveMenuCursor\n" + " ldr r1, ._7 + 4\n" + " strb r0, [r1]\n" + "._4:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._5 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._7 + 8\n" + " ldr r0, ._7 + 4\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r1, r1, #0x4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._10\n" + "._8:\n" + " .align 2, 0\n" + "._7:\n" + " .word gMain\n" + " .word gDebug_03000700+0x1d\n" + " .word gUnknown_Debug_083C0CBA\n" + "._5:\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._9 @cond_branch\n" + " mov r0, #0x0\n" + " b ._10\n" + "._9:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._10:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_ContestGraphics() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x14\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._11\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r3, ._11 + 4\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x4\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x13\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " ldr r1, ._11 + 8\n" + " ldr r0, ._11 + 12\n" + " str r0, [r1]\n" + " ldr r0, ._11 + 16\n" + " mov r2, #0x1\n" + " strh r2, [r0]\n" + " ldr r1, ._11 + 20\n" + " ldr r0, ._11 + 24\n" + " str r0, [r1]\n" + " ldr r0, ._11 + 28\n" + " str r4, [r0]\n" + " ldr r0, ._11 + 32\n" + " strb r2, [r0]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._12:\n" + " .align 2, 0\n" + "._11:\n" + " .word gUnknown_Debug_083C0CF4\n" + " .word gUnknown_Debug_083C0D2C\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808BC48+1\n" + " .word gDebug_03000700\n" + " .word gDebug_03000700+0x4\n" + " .word 0x6f33\n" + " .word gDebug_03000700+0x8\n" + " .word gDebug_03000700+0xc\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_ArtMusGraphics() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x14\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._13\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r3, ._13 + 4\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x4\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x13\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " ldr r1, ._13 + 8\n" + " ldr r0, ._13 + 12\n" + " str r0, [r1]\n" + " ldr r0, ._13 + 16\n" + " mov r2, #0x1\n" + " strh r2, [r0]\n" + " ldr r1, ._13 + 20\n" + " ldr r0, ._13 + 24\n" + " str r0, [r1]\n" + " ldr r0, ._13 + 28\n" + " str r4, [r0]\n" + " ldr r0, ._13 + 32\n" + " strb r2, [r0]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word gUnknown_Debug_083C0D4C\n" + " .word gUnknown_Debug_083C0D83\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808BCBC+1\n" + " .word gDebug_03000700\n" + " .word gDebug_03000700+0x4\n" + " .word 0x6f33\n" + " .word gDebug_03000700+0x8\n" + " .word gDebug_03000700+0xd\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_PreviewData() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x14\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._15\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r3, ._15 + 4\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x4\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x13\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " ldr r1, ._15 + 8\n" + " ldr r0, ._15 + 12\n" + " str r0, [r1]\n" + " ldr r0, ._15 + 16\n" + " mov r2, #0x1\n" + " strh r2, [r0]\n" + " ldr r1, ._15 + 20\n" + " ldr r0, ._15 + 24\n" + " str r0, [r1]\n" + " ldr r0, ._15 + 28\n" + " str r4, [r0]\n" + " ldr r0, ._15 + 32\n" + " strb r2, [r0]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._16:\n" + " .align 2, 0\n" + "._15:\n" + " .word gUnknown_Debug_083C0DA4\n" + " .word gUnknown_Debug_083C0DD4\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808BD30+1\n" + " .word gDebug_03000700\n" + " .word gDebug_03000700+0x4\n" + " .word 0x6f33\n" + " .word gDebug_03000700+0x8\n" + " .word gDebug_03000700+0xe\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_TrickHouse() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._17\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r3, ._17 + 4\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " ldr r0, ._17 + 8\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r1, ._17 + 12\n" + " ldr r0, ._17 + 16\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._18:\n" + " .align 2, 0\n" + "._17:\n" + " .word gUnknown_Debug_083C0DF4\n" + " .word gUnknown_Debug_083C0E15\n" + " .word gDebug_03000700+0x1e\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808BDA4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_ControlEvents() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._19\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " ldr r0, ._19 + 4\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r1, ._19 + 8\n" + " ldr r0, ._19 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._20:\n" + " .align 2, 0\n" + "._19:\n" + " .word gUnknown_Debug_083C0E32\n" + " .word gDebug_03000700+0x1f\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808BE2C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_ControlFlags() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._21\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " ldr r0, ._21 + 4\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._21 + 8\n" + " ldr r0, ._21 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._22:\n" + " .align 2, 0\n" + "._21:\n" + " .word gUnknown_Debug_083C0E7F\n" + " .word gDebug_03000700+0x20\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808BEB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_ControlWorks() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._23\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x6\n" + " bl PrintMenuItems\n" + " ldr r0, ._23 + 4\n" + " ldrb r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " ldr r1, ._23 + 8\n" + " ldr r0, ._23 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._24:\n" + " .align 2, 0\n" + "._23:\n" + " .word gUnknown_Debug_083C0EF1\n" + " .word gDebug_03000700+0x21\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808BF3C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808BC48() +{ + asm( + " push {r4, lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " asr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._25 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._26 @cond_branch\n" + " cmp r0, #0\n" + " beq ._27 @cond_branch\n" + " b ._32\n" + "._26:\n" + " cmp r0, #0x2\n" + " beq ._29 @cond_branch\n" + " b ._32\n" + "._27:\n" + " bl debug_sub_808ED0C\n" + " b ._32\n" + "._25:\n" + " bl debug_sub_808ED9C\n" + " b ._32\n" + "._29:\n" + " bl debug_sub_808EE3C\n" + "._32:\n" + " mov r0, #0x0\n" + " bl debug_sub_808EF8C\n" + " lsl r0, r4, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._36 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._34 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._35\n" + "._34:\n" + " cmp r1, #0x3\n" + " bne ._36 @cond_branch\n" + " ldr r0, ._37\n" + " ldr r1, ._37 + 4\n" + " ldr r1, [r1, #0x1c]\n" + " str r1, [r0]\n" + "._36:\n" + " mov r0, #0x0\n" + "._35:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._38:\n" + " .align 2, 0\n" + "._37:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C0D2C\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808BCBC() +{ + asm( + " push {r4, lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " asr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._39 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._40 @cond_branch\n" + " cmp r0, #0\n" + " beq ._41 @cond_branch\n" + " b ._46\n" + "._40:\n" + " cmp r0, #0x2\n" + " beq ._43 @cond_branch\n" + " b ._46\n" + "._41:\n" + " bl debug_sub_808ED0C\n" + " b ._46\n" + "._39:\n" + " bl debug_sub_808ED9C\n" + " b ._46\n" + "._43:\n" + " bl debug_sub_808EE9C\n" + "._46:\n" + " mov r0, #0x1\n" + " bl debug_sub_808EF8C\n" + " lsl r0, r4, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._50 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._48 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._49\n" + "._48:\n" + " cmp r1, #0x3\n" + " bne ._50 @cond_branch\n" + " ldr r0, ._51\n" + " ldr r1, ._51 + 4\n" + " ldr r1, [r1, #0x1c]\n" + " str r1, [r0]\n" + "._50:\n" + " mov r0, #0x0\n" + "._49:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._52:\n" + " .align 2, 0\n" + "._51:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C0D83\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808BD30() +{ + asm( + " push {r4, lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " asr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._53 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._54 @cond_branch\n" + " cmp r0, #0\n" + " beq ._55 @cond_branch\n" + " b ._60\n" + "._54:\n" + " cmp r0, #0x2\n" + " beq ._57 @cond_branch\n" + " b ._60\n" + "._55:\n" + " bl debug_sub_808ED0C\n" + " b ._60\n" + "._53:\n" + " bl debug_sub_808ED9C\n" + " b ._60\n" + "._57:\n" + " bl debug_sub_808EF14\n" + "._60:\n" + " mov r0, #0x2\n" + " bl debug_sub_808EF8C\n" + " lsl r0, r4, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._64 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._62 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._63\n" + "._62:\n" + " cmp r1, #0x3\n" + " bne ._64 @cond_branch\n" + " ldr r0, ._65\n" + " ldr r1, ._65 + 4\n" + " ldr r1, [r1, #0x1c]\n" + " str r1, [r0]\n" + "._64:\n" + " mov r0, #0x0\n" + "._63:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._66:\n" + " .align 2, 0\n" + "._65:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C0DD4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808BDA4() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._71\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._67 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl MoveMenuCursor\n" + " ldr r1, ._71 + 4\n" + " strb r0, [r1]\n" + "._67:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._68 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl MoveMenuCursor\n" + " ldr r1, ._71 + 4\n" + " strb r0, [r1]\n" + "._68:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._69 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._71 + 8\n" + " ldr r0, ._71 + 4\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r1, r1, #0x4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._74\n" + "._72:\n" + " .align 2, 0\n" + "._71:\n" + " .word gMain\n" + " .word gDebug_03000700+0x1e\n" + " .word gUnknown_Debug_083C0E15\n" + "._69:\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._73 @cond_branch\n" + " mov r0, #0x0\n" + " b ._74\n" + "._73:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._74:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808BE2C() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._79\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._75 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl MoveMenuCursor\n" + " ldr r1, ._79 + 4\n" + " strb r0, [r1]\n" + "._75:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._76 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl MoveMenuCursor\n" + " ldr r1, ._79 + 4\n" + " strb r0, [r1]\n" + "._76:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._77 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._79 + 8\n" + " ldr r0, ._79 + 4\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r1, r1, #0x4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._82\n" + "._80:\n" + " .align 2, 0\n" + "._79:\n" + " .word gMain\n" + " .word gDebug_03000700+0x1f\n" + " .word gUnknown_Debug_083C0E32\n" + "._77:\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._81 @cond_branch\n" + " mov r0, #0x0\n" + " b ._82\n" + "._81:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._82:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808BEB4() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._87\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._83 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl MoveMenuCursor\n" + " ldr r1, ._87 + 4\n" + " strb r0, [r1]\n" + "._83:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._84 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl MoveMenuCursor\n" + " ldr r1, ._87 + 4\n" + " strb r0, [r1]\n" + "._84:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._85 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._87 + 8\n" + " ldr r0, ._87 + 4\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r1, r1, #0x4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._90\n" + "._88:\n" + " .align 2, 0\n" + "._87:\n" + " .word gMain\n" + " .word gDebug_03000700+0x20\n" + " .word gUnknown_Debug_083C0E7F\n" + "._85:\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._89 @cond_branch\n" + " mov r0, #0x0\n" + " b ._90\n" + "._89:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._90:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808BF3C() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._95\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._91 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl MoveMenuCursor\n" + " ldr r1, ._95 + 4\n" + " strb r0, [r1]\n" + "._91:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._92 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl MoveMenuCursor\n" + " ldr r1, ._95 + 4\n" + " strb r0, [r1]\n" + "._92:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._93 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._95 + 8\n" + " ldr r0, ._95 + 4\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r1, r1, #0x4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._98\n" + "._96:\n" + " .align 2, 0\n" + "._95:\n" + " .word gMain\n" + " .word gDebug_03000700+0x21\n" + " .word gUnknown_Debug_083C0EF1\n" + "._93:\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._97 @cond_branch\n" + " mov r0, #0x0\n" + " b ._98\n" + "._97:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._98:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808BFC4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._99\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._99 + 4\n" + " ldr r0, ._99 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._100:\n" + " .align 2, 0\n" + "._99:\n" + " .word gUnknown_Debug_083C0F79\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C064+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C014() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._101\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x6\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " ldr r1, ._101 + 4\n" + " ldr r0, ._101 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._102:\n" + " .align 2, 0\n" + "._101:\n" + " .word gUnknown_Debug_083C0FFC\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C0A8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C064() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._103 @cond_branch\n" + " mov r0, #0x0\n" + " b ._106\n" + "._103:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._105 @cond_branch\n" + " ldr r2, ._107\n" + " ldr r0, ._107 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._106\n" + "._108:\n" + " .align 2, 0\n" + "._107:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C0F79\n" + "._105:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._106:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C0A8() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._109 @cond_branch\n" + " mov r0, #0x0\n" + " b ._112\n" + "._109:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._111 @cond_branch\n" + " ldr r2, ._113\n" + " ldr r0, ._113 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._112\n" + "._114:\n" + " .align 2, 0\n" + "._113:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C0FFC\n" + "._111:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._112:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C0EC() +{ + asm( + " push {lr}\n" + " ldr r0, ._115\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._116:\n" + " .align 2, 0\n" + "._115:\n" + " .word DebugScript_081C1CFE\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C104() +{ + asm( + " push {lr}\n" + " ldr r0, ._117\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._118:\n" + " .align 2, 0\n" + "._117:\n" + " .word DebugScript_081C1D07\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C11C() +{ + asm( + " push {lr}\n" + " ldr r0, ._119\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._120:\n" + " .align 2, 0\n" + "._119:\n" + " .word DebugScript_081C1D1E\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C134() +{ + asm( + " push {lr}\n" + " ldr r0, ._121\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._122:\n" + " .align 2, 0\n" + "._121:\n" + " .word DebugScript_081C1D24\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C14C() +{ + asm( + " push {lr}\n" + " ldr r0, ._123\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._124:\n" + " .align 2, 0\n" + "._123:\n" + " .word DebugScript_081C1D2A\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C164() +{ + asm( + " push {lr}\n" + " ldr r0, ._125\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._126:\n" + " .align 2, 0\n" + "._125:\n" + " .word DebugScript_081C1D35\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C17C() +{ + asm( + " push {lr}\n" + " ldr r0, ._127\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._128:\n" + " .align 2, 0\n" + "._127:\n" + " .word DebugScript_081C1D46\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C194() +{ + asm( + " push {lr}\n" + " ldr r0, ._129\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._130:\n" + " .align 2, 0\n" + "._129:\n" + " .word DebugScript_081C221F\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C1AC() +{ + asm( + " push {lr}\n" + " ldr r0, ._131\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._132:\n" + " .align 2, 0\n" + "._131:\n" + " .word DebugScript_081C23E2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C1C4() +{ + asm( + " push {lr}\n" + " ldr r0, ._133\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._134:\n" + " .align 2, 0\n" + "._133:\n" + " .word DebugScript_081C23E6\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C1DC() +{ + asm( + " push {lr}\n" + " ldr r0, ._135\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._136:\n" + " .align 2, 0\n" + "._135:\n" + " .word DebugScript_081C23F6\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C1F4() +{ + asm( + " push {lr}\n" + " ldr r0, ._137\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._138:\n" + " .align 2, 0\n" + "._137:\n" + " .word DebugScript_081C2482\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C20C() +{ + asm( + " push {lr}\n" + " ldr r0, ._139\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._140:\n" + " .align 2, 0\n" + "._139:\n" + " .word DebugScript_081C23FD\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C224() +{ + asm( + " push {lr}\n" + " ldr r0, ._141\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._142:\n" + " .align 2, 0\n" + "._141:\n" + " .word DebugScript_081C2518\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C23C() +{ + asm( + " push {lr}\n" + " ldr r0, ._143\n" + " bl ScriptContext1_SetupScript\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._144:\n" + " .align 2, 0\n" + "._143:\n" + " .word DebugScript_081C2507\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_ContestGraphics_Show() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._145\n" + " ldr r0, ._145 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x4\n" + " pop {r1}\n" + " bx r1\n" + "._146:\n" + " .align 2, 0\n" + "._145:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C280+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C280() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._147 @cond_branch\n" + " mov r0, #0x0\n" + " b ._148\n" + "._147:\n" + " bl CloseMenu\n" + " mov r0, #0x0\n" + " bl debug_sub_808F168\n" + " ldr r0, ._149\n" + " bl SetMainCallback2\n" + " ldr r1, ._149 + 4\n" + " ldr r0, ._149 + 8\n" + " str r0, [r1, #0x8]\n" + " mov r0, #0x1\n" + "._148:\n" + " pop {r1}\n" + " bx r1\n" + "._150:\n" + " .align 2, 0\n" + "._149:\n" + " .word CB2_ContestPainting+1\n" + " .word gMain\n" + " .word debug_sub_808B868+1\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_MuseumGraphics_Show() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._151\n" + " ldr r0, ._151 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x4\n" + " pop {r1}\n" + " bx r1\n" + "._152:\n" + " .align 2, 0\n" + "._151:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C2E4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C2E4() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._153 @cond_branch\n" + " mov r0, #0x0\n" + " b ._154\n" + "._153:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " bl debug_sub_808F168\n" + " ldr r0, ._155\n" + " bl SetMainCallback2\n" + " ldr r1, ._155 + 4\n" + " ldr r0, ._155 + 8\n" + " str r0, [r1, #0x8]\n" + " mov r0, #0x1\n" + "._154:\n" + " pop {r1}\n" + " bx r1\n" + "._156:\n" + " .align 2, 0\n" + "._155:\n" + " .word CB2_ContestPainting+1\n" + " .word gMain\n" + " .word debug_sub_808B868+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C31C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._157\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._157 + 4\n" + " ldr r0, ._157 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._158:\n" + " .align 2, 0\n" + "._157:\n" + " .word gUnknown_Debug_083C2828\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C36C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C36C() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._159 @cond_branch\n" + " mov r0, #0x0\n" + " b ._162\n" + "._159:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._161 @cond_branch\n" + " ldr r2, ._163\n" + " ldr r0, ._163 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._162\n" + "._164:\n" + " .align 2, 0\n" + "._163:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C2828\n" + "._161:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._162:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C3B0() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._165\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r0, ._165 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._165 + 8\n" + " ldr r0, ._165 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._166:\n" + " .align 2, 0\n" + "._165:\n" + " .word gUnknown_Debug_083C2938\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C408() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._167\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._167 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._167 + 8\n" + " ldr r0, ._167 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._168:\n" + " .align 2, 0\n" + "._167:\n" + " .word gUnknown_Debug_083C2A48\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C460() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._169\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._169 + 4\n" + " mov r0, #0x2\n" + " strb r0, [r1]\n" + " ldr r1, ._169 + 8\n" + " ldr r0, ._169 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._170:\n" + " .align 2, 0\n" + "._169:\n" + " .word gUnknown_Debug_083C2B4C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C4B8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._171\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._171 + 4\n" + " mov r0, #0x3\n" + " strb r0, [r1]\n" + " ldr r1, ._171 + 8\n" + " ldr r0, ._171 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._172:\n" + " .align 2, 0\n" + "._171:\n" + " .word gUnknown_Debug_083C2C80\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C510() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._173\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._173 + 4\n" + " mov r0, #0x4\n" + " strb r0, [r1]\n" + " ldr r1, ._173 + 8\n" + " ldr r0, ._173 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._174:\n" + " .align 2, 0\n" + "._173:\n" + " .word gUnknown_Debug_083C2D8C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C568() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._175\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._175 + 4\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " ldr r1, ._175 + 8\n" + " ldr r0, ._175 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._176:\n" + " .align 2, 0\n" + "._175:\n" + " .word gUnknown_Debug_083C2EB0\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C5C0() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._177\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._177 + 4\n" + " mov r0, #0x6\n" + " strb r0, [r1]\n" + " ldr r1, ._177 + 8\n" + " ldr r0, ._177 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._178:\n" + " .align 2, 0\n" + "._177:\n" + " .word gUnknown_Debug_083C2FE0\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C618() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._179\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._179 + 4\n" + " mov r0, #0x7\n" + " strb r0, [r1]\n" + " ldr r1, ._179 + 8\n" + " ldr r0, ._179 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._180:\n" + " .align 2, 0\n" + "._179:\n" + " .word gUnknown_Debug_083C3100\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C670() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._181\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl InitMenu\n" + " ldr r1, ._181 + 4\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldr r1, ._181 + 8\n" + " ldr r0, ._181 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._182:\n" + " .align 2, 0\n" + "._181:\n" + " .word gUnknown_Debug_083C3194\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C6C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C6C8() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._186\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808C714\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808C764\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._183 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._184 @cond_branch\n" + "._183:\n" + " mov r0, #0x0\n" + " b ._185\n" + "._187:\n" + " .align 2, 0\n" + "._186:\n" + " .word gDebug_03000700+0xf\n" + "._184:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._185:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C714() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._191\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._190 @cond_branch\n" + " ldr r0, ._191 + 4\n" + " lsl r1, r2, #0x3\n" + " add r1, r1, r2\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r0\n" + " ldrh r4, [r1]\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._189 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._190\n" + "._192:\n" + " .align 2, 0\n" + "._191:\n" + " .word gMain\n" + " .word gUnknown_Debug_083C31DC+0xa\n" + "._189:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + "._190:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C764() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._195\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._193 @cond_branch\n" + " ldr r0, ._195 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._194:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " neg r2, r0\n" + " orr r2, r2, r0\n" + " lsr r2, r2, #0x1f\n" + " mov r0, #0x1c\n" + " add r1, r4, #0\n" + " bl debug_sub_808F2E0\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._194 @cond_branch\n" + "._193:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._196:\n" + " .align 2, 0\n" + "._195:\n" + " .word gUnknown_Debug_083C31DC\n" + " .word gUnknown_Debug_083C31DC+0xa\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C7C8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._197\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._197 + 4\n" + " ldr r0, ._197 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._198:\n" + " .align 2, 0\n" + "._197:\n" + " .word gUnknown_Debug_083C1CE8\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808C818+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C818() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._199 @cond_branch\n" + " mov r0, #0x0\n" + " b ._202\n" + "._199:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._201 @cond_branch\n" + " ldr r2, ._203\n" + " ldr r0, ._203 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._202\n" + "._204:\n" + " .align 2, 0\n" + "._203:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C1CE8\n" + "._201:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._202:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C85C() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._205\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r0, ._205 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._205 + 8\n" + " ldr r0, ._205 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._206:\n" + " .align 2, 0\n" + "._205:\n" + " .word gUnknown_Debug_083C1E0C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C8B4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._207\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._207 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._207 + 8\n" + " ldr r0, ._207 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._208:\n" + " .align 2, 0\n" + "._207:\n" + " .word gUnknown_Debug_083C1F38\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C90C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._209\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._209 + 4\n" + " mov r0, #0x2\n" + " strb r0, [r1]\n" + " ldr r1, ._209 + 8\n" + " ldr r0, ._209 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._210:\n" + " .align 2, 0\n" + "._209:\n" + " .word gUnknown_Debug_083C206C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C964() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._211\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._211 + 4\n" + " mov r0, #0x3\n" + " strb r0, [r1]\n" + " ldr r1, ._211 + 8\n" + " ldr r0, ._211 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._212:\n" + " .align 2, 0\n" + "._211:\n" + " .word gUnknown_Debug_083C2190\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808C9BC() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._213\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x6\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " ldr r1, ._213 + 4\n" + " mov r0, #0x4\n" + " strb r0, [r1]\n" + " ldr r1, ._213 + 8\n" + " ldr r0, ._213 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._214:\n" + " .align 2, 0\n" + "._213:\n" + " .word gUnknown_Debug_083C2264\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CA14() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._215\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._215 + 4\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " ldr r1, ._215 + 8\n" + " ldr r0, ._215 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._216:\n" + " .align 2, 0\n" + "._215:\n" + " .word gUnknown_Debug_083C2370\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CA6C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._217\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._217 + 4\n" + " mov r0, #0x6\n" + " strb r0, [r1]\n" + " ldr r1, ._217 + 8\n" + " ldr r0, ._217 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._218:\n" + " .align 2, 0\n" + "._217:\n" + " .word gUnknown_Debug_083C248C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CAC4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._219\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._219 + 4\n" + " mov r0, #0x7\n" + " strb r0, [r1]\n" + " ldr r1, ._219 + 8\n" + " ldr r0, ._219 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._220:\n" + " .align 2, 0\n" + "._219:\n" + " .word gUnknown_Debug_083C259C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CB1C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._221\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._221 + 4\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldr r1, ._221 + 8\n" + " ldr r0, ._221 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._222:\n" + " .align 2, 0\n" + "._221:\n" + " .word gUnknown_Debug_083C26C8\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CB74+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CB74() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._226\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808CBC0\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808CC10\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._223 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._224 @cond_branch\n" + "._223:\n" + " mov r0, #0x0\n" + " b ._225\n" + "._227:\n" + " .align 2, 0\n" + "._226:\n" + " .word gDebug_03000700+0xf\n" + "._224:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._225:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CBC0() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._231\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._230 @cond_branch\n" + " ldr r0, ._231 + 4\n" + " lsl r1, r2, #0x3\n" + " add r1, r1, r2\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r0\n" + " ldrh r4, [r1]\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._229 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._230\n" + "._232:\n" + " .align 2, 0\n" + "._231:\n" + " .word gMain\n" + " .word gUnknown_Debug_083C2710+0xa\n" + "._229:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + "._230:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CC10() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._235\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._233 @cond_branch\n" + " ldr r0, ._235 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._234:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " neg r2, r0\n" + " orr r2, r2, r0\n" + " lsr r2, r2, #0x1f\n" + " mov r0, #0x1c\n" + " add r1, r4, #0\n" + " bl debug_sub_808F2E0\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._234 @cond_branch\n" + "._233:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._236:\n" + " .align 2, 0\n" + "._235:\n" + " .word gUnknown_Debug_083C2710\n" + " .word gUnknown_Debug_083C2710+0xa\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CC74() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._237\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl InitMenu\n" + " ldr r1, ._237 + 4\n" + " ldr r0, ._237 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._238:\n" + " .align 2, 0\n" + "._237:\n" + " .word gUnknown_Debug_083C1ADC\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CCC4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CCC4() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._239 @cond_branch\n" + " mov r0, #0x0\n" + " b ._242\n" + "._239:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._241 @cond_branch\n" + " ldr r2, ._243\n" + " ldr r0, ._243 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._242\n" + "._244:\n" + " .align 2, 0\n" + "._243:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C1ADC\n" + "._241:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._242:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CD08() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x11\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._245\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " ldr r0, ._245 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._245 + 8\n" + " ldr r0, ._245 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._246:\n" + " .align 2, 0\n" + "._245:\n" + " .word gUnknown_Debug_083C1B7C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CE10+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CD60() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x9\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._247\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x4\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " ldr r1, ._247 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._247 + 8\n" + " ldr r0, ._247 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._248:\n" + " .align 2, 0\n" + "._247:\n" + " .word gUnknown_Debug_083C1BF0\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CE10+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CDB8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x3\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._249\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl InitMenu\n" + " ldr r1, ._249 + 4\n" + " mov r0, #0x2\n" + " strb r0, [r1]\n" + " ldr r1, ._249 + 8\n" + " ldr r0, ._249 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._250:\n" + " .align 2, 0\n" + "._249:\n" + " .word gUnknown_Debug_083C1C2C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CE10+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CE10() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._254\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808CE5C\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808CEAC\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._251 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._252 @cond_branch\n" + "._251:\n" + " mov r0, #0x0\n" + " b ._253\n" + "._255:\n" + " .align 2, 0\n" + "._254:\n" + " .word gDebug_03000700+0xf\n" + "._252:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._253:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CE5C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._259\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._258 @cond_branch\n" + " ldr r0, ._259 + 4\n" + " lsl r1, r2, #0x3\n" + " add r1, r1, r2\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r0\n" + " ldrh r4, [r1]\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._257 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._258\n" + "._260:\n" + " .align 2, 0\n" + "._259:\n" + " .word gMain\n" + " .word gUnknown_Debug_083C1C34+0x4\n" + "._257:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + "._258:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CEAC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._263\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._261 @cond_branch\n" + " ldr r0, ._263 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._262:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " neg r2, r0\n" + " orr r2, r2, r0\n" + " lsr r2, r2, #0x1f\n" + " mov r0, #0x1c\n" + " add r1, r4, #0\n" + " bl debug_sub_808F2E0\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._262 @cond_branch\n" + "._261:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._264:\n" + " .align 2, 0\n" + "._263:\n" + " .word gUnknown_Debug_083C1C34\n" + " .word gUnknown_Debug_083C1C34+0x4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CF10() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._265\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._265 + 4\n" + " ldr r0, ._265 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._266:\n" + " .align 2, 0\n" + "._265:\n" + " .word gUnknown_Debug_083C1330\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808CF60+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CF60() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._267 @cond_branch\n" + " mov r0, #0x0\n" + " b ._270\n" + "._267:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._269 @cond_branch\n" + " ldr r2, ._271\n" + " ldr r0, ._271 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._270\n" + "._272:\n" + " .align 2, 0\n" + "._271:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C1330\n" + "._269:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._270:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CFA4() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x11\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._273\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " ldr r0, ._273 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._273 + 8\n" + " ldr r0, ._273 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._274:\n" + " .align 2, 0\n" + "._273:\n" + " .word gUnknown_Debug_083C13D8\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808CFFC() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._275\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._275 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._275 + 8\n" + " ldr r0, ._275 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._276:\n" + " .align 2, 0\n" + "._275:\n" + " .word gUnknown_Debug_083C1465\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D054() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._277\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._277 + 4\n" + " mov r0, #0x2\n" + " strb r0, [r1]\n" + " ldr r1, ._277 + 8\n" + " ldr r0, ._277 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._278:\n" + " .align 2, 0\n" + "._277:\n" + " .word gUnknown_Debug_083C1503\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D0AC() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x9\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._279\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x4\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " ldr r1, ._279 + 4\n" + " mov r0, #0x3\n" + " strb r0, [r1]\n" + " ldr r1, ._279 + 8\n" + " ldr r0, ._279 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._280:\n" + " .align 2, 0\n" + "._279:\n" + " .word gUnknown_Debug_083C158A\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D104() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._281\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._281 + 4\n" + " mov r0, #0x4\n" + " strb r0, [r1]\n" + " ldr r1, ._281 + 8\n" + " ldr r0, ._281 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._282:\n" + " .align 2, 0\n" + "._281:\n" + " .word gUnknown_Debug_083C1647\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D15C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._283\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._283 + 4\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " ldr r1, ._283 + 8\n" + " ldr r0, ._283 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._284:\n" + " .align 2, 0\n" + "._283:\n" + " .word gUnknown_Debug_083C1712\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D1B4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._285\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._285 + 4\n" + " mov r0, #0x6\n" + " strb r0, [r1]\n" + " ldr r1, ._285 + 8\n" + " ldr r0, ._285 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._286:\n" + " .align 2, 0\n" + "._285:\n" + " .word gUnknown_Debug_083C17F8\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D20C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._287\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._287 + 4\n" + " mov r0, #0x7\n" + " strb r0, [r1]\n" + " ldr r1, ._287 + 8\n" + " ldr r0, ._287 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._288:\n" + " .align 2, 0\n" + "._287:\n" + " .word gUnknown_Debug_083C18B8\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D264() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._289\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl InitMenu\n" + " ldr r1, ._289 + 4\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldr r1, ._289 + 8\n" + " ldr r0, ._289 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._290:\n" + " .align 2, 0\n" + "._289:\n" + " .word gDebug_0x83C1974\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D2BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D2BC() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._294\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808D308\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808D358\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._291 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._292 @cond_branch\n" + "._291:\n" + " mov r0, #0x0\n" + " b ._293\n" + "._295:\n" + " .align 2, 0\n" + "._294:\n" + " .word gDebug_03000700+0xf\n" + "._292:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._293:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D308() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._299\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._298 @cond_branch\n" + " ldr r0, ._299 + 4\n" + " lsl r1, r2, #0x3\n" + " add r1, r1, r2\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r0\n" + " ldrh r4, [r1]\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._297 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._298\n" + "._300:\n" + " .align 2, 0\n" + "._299:\n" + " .word gMain\n" + " .word gUnknown_Debug_083C19C6\n" + "._297:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + "._298:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D358() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._303\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._301 @cond_branch\n" + " ldr r0, ._303 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._302:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " neg r2, r0\n" + " orr r2, r2, r0\n" + " lsr r2, r2, #0x1f\n" + " mov r0, #0x1c\n" + " add r1, r4, #0\n" + " bl debug_sub_808F2E0\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._302 @cond_branch\n" + "._301:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._304:\n" + " .align 2, 0\n" + "._303:\n" + " .word gUnknown_Debug_083C19BC\n" + " .word gUnknown_Debug_083C19C6\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D3BC() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._305\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r1, ._305 + 4\n" + " ldr r0, ._305 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._306:\n" + " .align 2, 0\n" + "._305:\n" + " .word gUnknown_Debug_083C105C\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D40C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D40C() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._307 @cond_branch\n" + " mov r0, #0x0\n" + " b ._310\n" + "._307:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._309 @cond_branch\n" + " ldr r2, ._311\n" + " ldr r0, ._311 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._310\n" + "._312:\n" + " .align 2, 0\n" + "._311:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C105C\n" + "._309:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._310:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D450() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._313\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r0, ._313 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._313 + 8\n" + " ldr r0, ._313 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._314:\n" + " .align 2, 0\n" + "._313:\n" + " .word gUnknown_Debug_083C10BD\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D500+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D4A8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._315\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._315 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._315 + 8\n" + " ldr r0, ._315 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._316:\n" + " .align 2, 0\n" + "._315:\n" + " .word gUnknown_Debug_083C1149\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D500+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D500() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._320\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808D54C\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808D59C\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._317 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._318 @cond_branch\n" + "._317:\n" + " mov r0, #0x0\n" + " b ._319\n" + "._321:\n" + " .align 2, 0\n" + "._320:\n" + " .word gDebug_03000700+0xf\n" + "._318:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._319:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D54C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._325\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._324 @cond_branch\n" + " ldr r0, ._325 + 4\n" + " lsl r1, r2, #0x3\n" + " add r1, r1, r2\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r0\n" + " ldrh r4, [r1]\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._323 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._324\n" + "._326:\n" + " .align 2, 0\n" + "._325:\n" + " .word gMain\n" + " .word gUnknown_Debug_083C1194+0x2\n" + "._323:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + "._324:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D59C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._329\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._327 @cond_branch\n" + " ldr r0, ._329 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._328:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " neg r2, r0\n" + " orr r2, r2, r0\n" + " lsr r2, r2, #0x1f\n" + " mov r0, #0x1c\n" + " add r1, r4, #0\n" + " bl debug_sub_808F2E0\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._328 @cond_branch\n" + "._327:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._330:\n" + " .align 2, 0\n" + "._329:\n" + " .word gUnknown_Debug_083C1194\n" + " .word gUnknown_Debug_083C1194+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D600() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._331\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r1, ._331 + 4\n" + " ldr r0, ._331 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._332:\n" + " .align 2, 0\n" + "._331:\n" + " .word gUnknown_Debug_083C11CC\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D650+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D650() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._333 @cond_branch\n" + " mov r0, #0x0\n" + " b ._336\n" + "._333:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._335 @cond_branch\n" + " ldr r2, ._337\n" + " ldr r0, ._337 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._336\n" + "._338:\n" + " .align 2, 0\n" + "._337:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C11CC\n" + "._335:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._336:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D694() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._339\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r0, ._339 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._339 + 8\n" + " ldr r0, ._339 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._340:\n" + " .align 2, 0\n" + "._339:\n" + " .word gUnknown_Debug_083C1212\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D744+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D6EC() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._341\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._341 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._341 + 8\n" + " ldr r0, ._341 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._342:\n" + " .align 2, 0\n" + "._341:\n" + " .word gUnknown_Debug_083C1288\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D744+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D744() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._346\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808D790\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808D7E0\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._343 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._344 @cond_branch\n" + "._343:\n" + " mov r0, #0x0\n" + " b ._345\n" + "._347:\n" + " .align 2, 0\n" + "._346:\n" + " .word gDebug_03000700+0xf\n" + "._344:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._345:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D790() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._351\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._350 @cond_branch\n" + " ldr r0, ._351 + 4\n" + " lsl r1, r2, #0x3\n" + " add r1, r1, r2\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r0\n" + " ldrh r4, [r1]\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._349 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._350\n" + "._352:\n" + " .align 2, 0\n" + "._351:\n" + " .word gMain\n" + " .word gUnknown_Debug_083C12D0+0x2\n" + "._349:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + "._350:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D7E0() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._355\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._353 @cond_branch\n" + " ldr r0, ._355 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._354:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " neg r2, r0\n" + " orr r2, r2, r0\n" + " lsr r2, r2, #0x1f\n" + " mov r0, #0x1c\n" + " add r1, r4, #0\n" + " bl debug_sub_808F2E0\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._354 @cond_branch\n" + "._353:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._356:\n" + " .align 2, 0\n" + "._355:\n" + " .word gUnknown_Debug_083C12D0\n" + " .word gUnknown_Debug_083C12D0+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D844() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1c\n" + " mov r3, #0x3\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._357\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1b\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl InitMenu\n" + " ldr r1, ._357 + 4\n" + " ldr r0, ._357 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._358:\n" + " .align 2, 0\n" + "._357:\n" + " .word gUnknown_Debug_083C1A78\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D894+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D894() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r3, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r3, r0\n" + " bne ._359 @cond_branch\n" + " mov r0, #0x0\n" + " b ._362\n" + "._359:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r3, r0\n" + " beq ._361 @cond_branch\n" + " ldr r2, ._363\n" + " ldr r1, ._363 + 4\n" + " lsl r0, r3, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0, #0x4]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._362\n" + "._364:\n" + " .align 2, 0\n" + "._363:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C1A78\n" + "._361:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._362:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D8D8() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._365\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r0, ._365 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._365 + 8\n" + " ldr r0, ._365 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._366:\n" + " .align 2, 0\n" + "._365:\n" + " .word gUnknown_Debug_083C1A9C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808D930+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D930() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._370\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808D97C\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808D9CC\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._367 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._368 @cond_branch\n" + "._367:\n" + " mov r0, #0x0\n" + " b ._369\n" + "._371:\n" + " .align 2, 0\n" + "._370:\n" + " .word gDebug_03000700+0xf\n" + "._368:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._369:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D97C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._375\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._374 @cond_branch\n" + " ldr r0, ._375 + 4\n" + " lsl r1, r2, #0x3\n" + " add r1, r1, r2\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r0\n" + " ldrh r4, [r1]\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._373 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._374\n" + "._376:\n" + " .align 2, 0\n" + "._375:\n" + " .word gMain\n" + " .word gUnknown_Debug_083C1AAC+0x2\n" + "._373:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + "._374:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808D9CC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._379\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._377 @cond_branch\n" + " ldr r0, ._379 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._378:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " neg r2, r0\n" + " orr r2, r2, r0\n" + " lsr r2, r2, #0x1f\n" + " mov r0, #0x1c\n" + " add r1, r4, #0\n" + " bl debug_sub_808F2E0\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._378 @cond_branch\n" + "._377:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._380:\n" + " .align 2, 0\n" + "._379:\n" + " .word gUnknown_Debug_083C1AAC\n" + " .word gUnknown_Debug_083C1AAC+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DA30() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x3\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._381\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl InitMenu\n" + " ldr r1, ._381 + 4\n" + " ldr r0, ._381 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._382:\n" + " .align 2, 0\n" + "._381:\n" + " .word gUnknown_Debug_083C103A\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DA80+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DA80() +{ + asm( + " push {r4, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " bl debug_sub_808DAD4\n" + " bl debug_sub_808DABC\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._383 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._384 @cond_branch\n" + "._383:\n" + " mov r0, #0x0\n" + " b ._385\n" + "._384:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._385:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DABC() +{ + asm( + " push {lr}\n" + " ldr r0, ._386\n" + " ldrh r2, [r0]\n" + " mov r0, #0x18\n" + " mov r1, #0x1\n" + " bl debug_sub_808F31C\n" + " pop {r0}\n" + " bx r0\n" + "._387:\n" + " .align 2, 0\n" + "._386:\n" + " .word gScriptResult\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DAD4() +{ + asm( + " push {lr}\n" + " ldr r0, ._390\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._388 @cond_branch\n" + " mov r2, #0x1\n" + " b ._389\n" + "._391:\n" + " .align 2, 0\n" + "._390:\n" + " .word gMain\n" + "._388:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._392 @cond_branch\n" + " ldr r2, ._393\n" + "._389:\n" + " ldr r1, ._393 + 4\n" + " ldrh r0, [r1]\n" + " add r0, r2, r0\n" + " strh r0, [r1]\n" + "._392:\n" + " pop {r0}\n" + " bx r0\n" + "._394:\n" + " .align 2, 0\n" + "._393:\n" + " .word 0xffff\n" + " .word gScriptResult\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DB0C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._395\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._395 + 4\n" + " ldr r0, ._395 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._396:\n" + " .align 2, 0\n" + "._395:\n" + " .word gUnknown_Debug_083C3D08\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DB5C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DB5C() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._397 @cond_branch\n" + " mov r0, #0x0\n" + " b ._400\n" + "._397:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._399 @cond_branch\n" + " ldr r2, ._401\n" + " ldr r0, ._401 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._400\n" + "._402:\n" + " .align 2, 0\n" + "._401:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C3D08\n" + "._399:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._400:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DBA0() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x11\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._403\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " ldr r0, ._403 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._403 + 8\n" + " ldr r0, ._403 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._404:\n" + " .align 2, 0\n" + "._403:\n" + " .word gUnknown_Debug_083C432C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DBF8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._405\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._405 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._405 + 8\n" + " ldr r0, ._405 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._406:\n" + " .align 2, 0\n" + "._405:\n" + " .word gUnknown_Debug_083C436C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DC50() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._407\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._407 + 4\n" + " mov r0, #0x2\n" + " strb r0, [r1]\n" + " ldr r1, ._407 + 8\n" + " ldr r0, ._407 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._408:\n" + " .align 2, 0\n" + "._407:\n" + " .word gUnknown_Debug_083C43B4\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DCA8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._409\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._409 + 4\n" + " mov r0, #0x3\n" + " strb r0, [r1]\n" + " ldr r1, ._409 + 8\n" + " ldr r0, ._409 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._410:\n" + " .align 2, 0\n" + "._409:\n" + " .word gUnknown_Debug_083C43FC\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DD00() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._411\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._411 + 4\n" + " mov r0, #0x4\n" + " strb r0, [r1]\n" + " ldr r1, ._411 + 8\n" + " ldr r0, ._411 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._412:\n" + " .align 2, 0\n" + "._411:\n" + " .word gUnknown_Debug_083C4444\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DD58() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._413\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._413 + 4\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " ldr r1, ._413 + 8\n" + " ldr r0, ._413 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._414:\n" + " .align 2, 0\n" + "._413:\n" + " .word gUnknown_Debug_083C448C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DDB0() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._415\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x6\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " ldr r1, ._415 + 4\n" + " mov r0, #0x6\n" + " strb r0, [r1]\n" + " ldr r1, ._415 + 8\n" + " ldr r0, ._415 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._416:\n" + " .align 2, 0\n" + "._415:\n" + " .word gUnknown_Debug_83C44C4\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DE08() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._417\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._417 + 4\n" + " mov r0, #0x7\n" + " strb r0, [r1]\n" + " ldr r1, ._417 + 8\n" + " ldr r0, ._417 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._418:\n" + " .align 2, 0\n" + "._417:\n" + " .word gUnknown_Debug_83C44EC\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DE60() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._419\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._419 + 4\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldr r1, ._419 + 8\n" + " ldr r0, ._419 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._420:\n" + " .align 2, 0\n" + "._419:\n" + " .word gUnknown_Debug_083C4534\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808DEB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DEB8() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._424\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808DF64\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808DF04\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._421 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._422 @cond_branch\n" + "._421:\n" + " mov r0, #0x0\n" + " b ._423\n" + "._425:\n" + " .align 2, 0\n" + "._424:\n" + " .word gDebug_03000700+0xf\n" + "._422:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._423:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DF04() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._428\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._426 @cond_branch\n" + " ldr r0, ._428 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._427:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl VarGet\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " mov r0, #0x18\n" + " add r1, r4, #0\n" + " bl debug_sub_808F31C\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._427 @cond_branch\n" + "._426:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._429:\n" + " .align 2, 0\n" + "._428:\n" + " .word gUnknown_Debug_083C457C\n" + " .word gUnknown_Debug_083C457C+0xa\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DF64() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._432\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._430 @cond_branch\n" + " mov r5, #0x1\n" + " b ._431\n" + "._433:\n" + " .align 2, 0\n" + "._432:\n" + " .word gMain\n" + "._430:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._434 @cond_branch\n" + " ldr r5, ._435\n" + "._431:\n" + " ldr r1, ._435 + 4\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrh r4, [r0]\n" + " add r0, r4, #0\n" + " bl VarGet\n" + " add r1, r0, #0\n" + " add r1, r5, r1\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " bl VarSet\n" + "._434:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._436:\n" + " .align 2, 0\n" + "._435:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_083C457C+0xa\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808DFC0() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._437\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x6\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " ldr r1, ._437 + 4\n" + " ldr r0, ._437 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._438:\n" + " .align 2, 0\n" + "._437:\n" + " .word gUnknown_Debug_083C377C\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E010+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E010() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._439 @cond_branch\n" + " mov r0, #0x0\n" + " b ._442\n" + "._439:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._441 @cond_branch\n" + " ldr r2, ._443\n" + " ldr r0, ._443 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._442\n" + "._444:\n" + " .align 2, 0\n" + "._443:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C377C\n" + "._441:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._442:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E054() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._445\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x6\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " ldr r0, ._445 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._445 + 8\n" + " ldr r0, ._445 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._446:\n" + " .align 2, 0\n" + "._445:\n" + " .word gUnknown_Debug_083C3AA0\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E264+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E0AC() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._447\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl InitMenu\n" + " ldr r1, ._447 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._447 + 8\n" + " ldr r0, ._447 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._448:\n" + " .align 2, 0\n" + "._447:\n" + " .word gUnknown_Debug_83C3AE0\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E264+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E104() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._449\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._449 + 4\n" + " mov r0, #0x2\n" + " strb r0, [r1]\n" + " ldr r1, ._449 + 8\n" + " ldr r0, ._449 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._450:\n" + " .align 2, 0\n" + "._449:\n" + " .word gUnknown_Debug_83C3B28\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E264+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E15C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._451\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r1, ._451 + 4\n" + " mov r0, #0x3\n" + " strb r0, [r1]\n" + " ldr r1, ._451 + 8\n" + " ldr r0, ._451 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._452:\n" + " .align 2, 0\n" + "._451:\n" + " .word gUnknown_Debug_83C3B70\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E264+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E1B4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._453\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._453 + 4\n" + " mov r0, #0x4\n" + " strb r0, [r1]\n" + " ldr r1, ._453 + 8\n" + " ldr r0, ._453 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._454:\n" + " .align 2, 0\n" + "._453:\n" + " .word gUnknown_Debug_83C3BB8\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E264+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E20C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._455\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x6\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " ldr r1, ._455 + 4\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " ldr r1, ._455 + 8\n" + " ldr r0, ._455 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._456:\n" + " .align 2, 0\n" + "._455:\n" + " .word gUnknown_Debug_83C3C00\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E264+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E264() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._460\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808E310\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808E2B0\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._457 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._458 @cond_branch\n" + "._457:\n" + " mov r0, #0x0\n" + " b ._459\n" + "._461:\n" + " .align 2, 0\n" + "._460:\n" + " .word gDebug_03000700+0xf\n" + "._458:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._459:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E2B0() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._464\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._462 @cond_branch\n" + " ldr r0, ._464 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._463:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl VarGet\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " mov r0, #0x18\n" + " add r1, r4, #0\n" + " bl debug_sub_808F31C\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._463 @cond_branch\n" + "._462:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._465:\n" + " .align 2, 0\n" + "._464:\n" + " .word gUnknown_Debug_083C3C48\n" + " .word gUnknown_Debug_083C3C48+0x6\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E310() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._468\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._466 @cond_branch\n" + " mov r5, #0x1\n" + " b ._467\n" + "._469:\n" + " .align 2, 0\n" + "._468:\n" + " .word gMain\n" + "._466:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._470 @cond_branch\n" + " ldr r5, ._471\n" + "._467:\n" + " ldr r1, ._471 + 4\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrh r4, [r0]\n" + " add r0, r4, #0\n" + " bl VarGet\n" + " add r1, r0, #0\n" + " add r1, r5, r1\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " bl VarSet\n" + "._470:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._472:\n" + " .align 2, 0\n" + "._471:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_083C3C48+0x6\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E36C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._473\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl InitMenu\n" + " ldr r1, ._473 + 4\n" + " ldr r0, ._473 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._474:\n" + " .align 2, 0\n" + "._473:\n" + " .word gUnknown_Debug_083C32AC\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E3BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E3BC() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._475 @cond_branch\n" + " mov r0, #0x0\n" + " b ._478\n" + "._475:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._477 @cond_branch\n" + " ldr r2, ._479\n" + " ldr r0, ._479 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._478\n" + "._480:\n" + " .align 2, 0\n" + "._479:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C32AC\n" + "._477:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._478:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E400() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._481\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl InitMenu\n" + " ldr r0, ._481 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._481 + 8\n" + " ldr r0, ._481 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._482:\n" + " .align 2, 0\n" + "._481:\n" + " .word gUnknown_Debug_083C347C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E5B8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E458() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._483\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r1, ._483 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._483 + 8\n" + " ldr r0, ._483 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._484:\n" + " .align 2, 0\n" + "._483:\n" + " .word gUnknown_Debug_083C3494\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E5B8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E4B0() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._485\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x6\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x6\n" + " bl InitMenu\n" + " ldr r1, ._485 + 4\n" + " mov r0, #0x2\n" + " strb r0, [r1]\n" + " ldr r1, ._485 + 8\n" + " ldr r0, ._485 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._486:\n" + " .align 2, 0\n" + "._485:\n" + " .word gUnknown_Debug_083C34A4\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E5B8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E508() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._487\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r1, ._487 + 4\n" + " mov r0, #0x3\n" + " strb r0, [r1]\n" + " ldr r1, ._487 + 8\n" + " ldr r0, ._487 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._488:\n" + " .align 2, 0\n" + "._487:\n" + " .word gUnknown_Debug_083C34D4\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E5B8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E560() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._489\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x5\n" + " bl InitMenu\n" + " ldr r1, ._489 + 4\n" + " mov r0, #0x4\n" + " strb r0, [r1]\n" + " ldr r1, ._489 + 8\n" + " ldr r0, ._489 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._490:\n" + " .align 2, 0\n" + "._489:\n" + " .word gUnknown_Debug_083C351C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E5B8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E5B8() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._494\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808E604\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808E660\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._491 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._492 @cond_branch\n" + "._491:\n" + " mov r0, #0x0\n" + " b ._493\n" + "._495:\n" + " .align 2, 0\n" + "._494:\n" + " .word gDebug_03000700+0xf\n" + "._492:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._493:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E604() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._498\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._496 @cond_branch\n" + " mov r5, #0x1\n" + " b ._497\n" + "._499:\n" + " .align 2, 0\n" + "._498:\n" + " .word gMain\n" + "._496:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._500 @cond_branch\n" + " ldr r5, ._501\n" + "._497:\n" + " ldr r1, ._501 + 4\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrh r4, [r0]\n" + " add r0, r4, #0\n" + " bl VarGet\n" + " add r1, r0, #0\n" + " add r1, r5, r1\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " bl VarSet\n" + "._500:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._502:\n" + " .align 2, 0\n" + "._501:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_083C3544+0x6\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E660() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._505\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._503 @cond_branch\n" + " ldr r0, ._505 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._504:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl VarGet\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " mov r0, #0x18\n" + " add r1, r4, #0\n" + " bl debug_sub_808F31C\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._504 @cond_branch\n" + "._503:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._506:\n" + " .align 2, 0\n" + "._505:\n" + " .word gUnknown_Debug_083C3544\n" + " .word gUnknown_Debug_083C3544+0x6\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E6C0() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._507\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r1, ._507 + 4\n" + " ldr r0, ._507 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._508:\n" + " .align 2, 0\n" + "._507:\n" + " .word gUnknown_Debug_083C4644\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E710+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E710() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._509 @cond_branch\n" + " mov r0, #0x0\n" + " b ._512\n" + "._509:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._511 @cond_branch\n" + " ldr r2, ._513\n" + " ldr r0, ._513 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._512\n" + "._514:\n" + " .align 2, 0\n" + "._513:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C4644\n" + "._511:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._512:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E754() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._515\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r0, ._515 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._515 + 8\n" + " ldr r0, ._515 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._516:\n" + " .align 2, 0\n" + "._515:\n" + " .word gUnknown_Debug_083C470C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E804+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E7AC() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._517\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._517 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._517 + 8\n" + " ldr r0, ._517 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._518:\n" + " .align 2, 0\n" + "._517:\n" + " .word gUnknown_Debug_083C4754C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E804+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E804() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._522\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808E850\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808E8AC\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._519 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._520 @cond_branch\n" + "._519:\n" + " mov r0, #0x0\n" + " b ._521\n" + "._523:\n" + " .align 2, 0\n" + "._522:\n" + " .word gDebug_03000700+0xf\n" + "._520:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._521:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E850() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._526\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._524 @cond_branch\n" + " mov r5, #0x1\n" + " b ._525\n" + "._527:\n" + " .align 2, 0\n" + "._526:\n" + " .word gMain\n" + "._524:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._528 @cond_branch\n" + " ldr r5, ._529\n" + "._525:\n" + " ldr r1, ._529 + 4\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrh r4, [r0]\n" + " add r0, r4, #0\n" + " bl VarGet\n" + " add r1, r0, #0\n" + " add r1, r5, r1\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " bl VarSet\n" + "._528:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._530:\n" + " .align 2, 0\n" + "._529:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_083C478C+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E8AC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._533\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._531 @cond_branch\n" + " ldr r0, ._533 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._532:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl VarGet\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " mov r0, #0x18\n" + " add r1, r4, #0\n" + " bl debug_sub_808F31C\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._532 @cond_branch\n" + "._531:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._534:\n" + " .align 2, 0\n" + "._533:\n" + " .word gUnknown_Debug_083C478C\n" + " .word gUnknown_Debug_083C478C+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E90C() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._535\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x2\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x17\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x2\n" + " bl InitMenu\n" + " ldr r1, ._535 + 4\n" + " ldr r0, ._535 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._536:\n" + " .align 2, 0\n" + "._535:\n" + " .word gUnknown_Debug_083C35C4\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808E95C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E95C() +{ + asm( + " push {lr}\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bne ._537 @cond_branch\n" + " mov r0, #0x0\n" + " b ._540\n" + "._537:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._539 @cond_branch\n" + " ldr r2, ._541\n" + " ldr r0, ._541 + 4\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " str r0, [r2]\n" + " mov r0, #0x0\n" + " b ._540\n" + "._542:\n" + " .align 2, 0\n" + "._541:\n" + " .word gCallback_03004AE8\n" + " .word gUnknown_Debug_083C35C4\n" + "._539:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._540:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E9A0() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._543\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl PrintMenuItems\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " ldr r0, ._543 + 4\n" + " strb r4, [r0]\n" + " ldr r1, ._543 + 8\n" + " ldr r0, ._543 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._544:\n" + " .align 2, 0\n" + "._543:\n" + " .word gUnknown_Debug_083C369C\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808EA50+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808E9F8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._545\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x1c\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x7\n" + " bl InitMenu\n" + " ldr r1, ._545 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._545 + 8\n" + " ldr r0, ._545 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._546:\n" + " .align 2, 0\n" + "._545:\n" + " .word gUnknown_Debug_083C36E4\n" + " .word gDebug_03000700+0xf\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808EA50+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EA50() +{ + asm( + " push {r4, r5, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " add r1, r0, #0\n" + " ldr r5, ._550\n" + " ldrb r0, [r5]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " bl debug_sub_808EAFC\n" + " ldrb r0, [r5]\n" + " bl debug_sub_808EA9C\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._547 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._548 @cond_branch\n" + "._547:\n" + " mov r0, #0x0\n" + " b ._549\n" + "._551:\n" + " .align 2, 0\n" + "._550:\n" + " .word gDebug_03000700+0xf\n" + "._548:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._549:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EA9C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " mov r5, #0x0\n" + " ldr r0, ._554\n" + " add r0, r1, r0\n" + " ldrb r2, [r0]\n" + " cmp r5, r2\n" + " bcs ._552 @cond_branch\n" + " ldr r0, ._554 + 4\n" + " mov r8, r0\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r7, r0, #0x1\n" + " add r6, r2, #0\n" + "._553:\n" + " lsl r0, r5, #0x1\n" + " add r4, r0, #1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " add r0, r0, r7\n" + " add r0, r0, r8\n" + " ldrh r0, [r0]\n" + " bl VarGet\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " mov r0, #0x18\n" + " add r1, r4, #0\n" + " bl debug_sub_808F31C\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, r6\n" + " bcc ._553 @cond_branch\n" + "._552:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._555:\n" + " .align 2, 0\n" + "._554:\n" + " .word gUnknown_Debug_083C371C\n" + " .word gUnknown_Debug_083C371C+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EAFC() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " ldr r0, ._558\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._556 @cond_branch\n" + " mov r5, #0x1\n" + " b ._557\n" + "._559:\n" + " .align 2, 0\n" + "._558:\n" + " .word gMain\n" + "._556:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._560 @cond_branch\n" + " ldr r5, ._561\n" + "._557:\n" + " ldr r1, ._561 + 4\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r1\n" + " ldrh r4, [r0]\n" + " add r0, r4, #0\n" + " bl VarGet\n" + " add r1, r0, #0\n" + " add r1, r5, r1\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r4, #0\n" + " bl VarSet\n" + "._560:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._562:\n" + " .align 2, 0\n" + "._561:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_083C371C+0x2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EB58() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xc\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._563\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r3, ._563 + 4\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x8\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xb\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " ldr r1, ._563 + 8\n" + " ldr r0, ._563 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._564:\n" + " .align 2, 0\n" + "._563:\n" + " .word gUnknown_Debug_083C47B2\n" + " .word gUnknown_Debug_083C47F0\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808EC10+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EBB4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xd\n" + " mov r3, #0xd\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._565\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r3, ._565 + 4\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x5\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xc\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x5\n" + " bl InitMenu\n" + " ldr r1, ._565 + 8\n" + " ldr r0, ._565 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._566:\n" + " .align 2, 0\n" + "._565:\n" + " .word gUnknown_Debug_083C4830\n" + " .word gUnknown_Debug_083C4888\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808EC5C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EC10() +{ + asm( + " push {r4, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._568 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._568 @cond_branch\n" + " ldr r1, ._570\n" + " lsl r0, r2, #0x18\n" + " asr r0, r0, #0x18\n" + " ldr r2, ._570 + 4\n" + " add r1, r1, r2\n" + " strh r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._569\n" + "._571:\n" + " .align 2, 0\n" + "._570:\n" + " .word gSaveBlock1\n" + " .word 0x13c8\n" + "._568:\n" + " mov r0, #0x0\n" + "._569:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EC5C() +{ + asm( + " push {r4, lr}\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._573 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._573 @cond_branch\n" + " ldr r0, ._575\n" + " lsl r1, r1, #0x18\n" + " asr r1, r1, #0x8\n" + " lsr r1, r1, #0x10\n" + " bl VarSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._574\n" + "._576:\n" + " .align 2, 0\n" + "._575:\n" + " .word 0x40a7\n" + "._573:\n" + " mov r0, #0x0\n" + "._574:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808ECA4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._577\n" + " ldr r0, ._577 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x4\n" + " pop {r1}\n" + " bx r1\n" + "._578:\n" + " .align 2, 0\n" + "._577:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_808ECD0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808ECD0() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._579 @cond_branch\n" + " mov r0, #0x0\n" + " b ._580\n" + "._579:\n" + " bl CloseMenu\n" + " mov r0, #0x2\n" + " bl debug_sub_808F168\n" + " ldr r0, ._581\n" + " bl SetMainCallback2\n" + " ldr r1, ._581 + 4\n" + " ldr r0, ._581 + 8\n" + " str r0, [r1, #0x8]\n" + " mov r0, #0x1\n" + "._580:\n" + " pop {r1}\n" + " bx r1\n" + "._582:\n" + " .align 2, 0\n" + "._581:\n" + " .word CB2_ContestPainting+1\n" + " .word gMain\n" + " .word debug_sub_808B868+1\n" + "\n" + ); +} + +__attribute__((naked)) +void TomomichiDebugMenu_Config() +{ + asm( + " mov r0, #0x0\n" + " bx lr\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808ED0C() +{ + asm( + " push {lr}\n" + " ldr r2, ._590\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._584 @cond_branch\n" + " ldr r1, ._590 + 4\n" + " ldrh r0, [r1]\n" + " cmp r0, #0x1\n" + " beq ._584 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1]\n" + "._584:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._586 @cond_branch\n" + " ldr r3, ._590 + 4\n" + " ldrh r1, [r3]\n" + " ldr r0, ._590 + 8\n" + " cmp r1, r0\n" + " beq ._586 @cond_branch\n" + " add r0, r1, #1\n" + " strh r0, [r3]\n" + "._586:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._587 @cond_branch\n" + " ldr r1, ._590 + 4\n" + " ldrh r0, [r1]\n" + " cmp r0, #0xa\n" + " bls ._588 @cond_branch\n" + " sub r0, r0, #0xa\n" + " b ._589\n" + "._591:\n" + " .align 2, 0\n" + "._590:\n" + " .word gMain\n" + " .word gDebug_03000700\n" + " .word 0x19b\n" + "._588:\n" + " mov r0, #0x1\n" + "._589:\n" + " strh r0, [r1]\n" + "._587:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._592 @cond_branch\n" + " ldr r2, ._595\n" + " ldrh r1, [r2]\n" + " ldr r0, ._595 + 4\n" + " cmp r1, r0\n" + " bhi ._593 @cond_branch\n" + " add r0, r1, #0\n" + " add r0, r0, #0xa\n" + " b ._594\n" + "._596:\n" + " .align 2, 0\n" + "._595:\n" + " .word gDebug_03000700\n" + " .word 0x191\n" + "._593:\n" + " ldr r1, ._597\n" + " add r0, r1, #0\n" + "._594:\n" + " strh r0, [r2]\n" + "._592:\n" + " pop {r0}\n" + " bx r0\n" + "._598:\n" + " .align 2, 0\n" + "._597:\n" + " .word 0x19b\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808ED9C() +{ + asm( + " push {lr}\n" + " ldr r2, ._606\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._600 @cond_branch\n" + " ldr r1, ._606 + 4\n" + " ldr r0, [r1]\n" + " cmp r0, #0\n" + " beq ._600 @cond_branch\n" + " sub r0, r0, #0x1\n" + " str r0, [r1]\n" + "._600:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._602 @cond_branch\n" + " ldr r3, ._606 + 4\n" + " ldr r1, [r3]\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._602 @cond_branch\n" + " add r0, r1, #1\n" + " str r0, [r3]\n" + "._602:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._603 @cond_branch\n" + " ldr r1, ._606 + 4\n" + " ldr r0, [r1]\n" + " cmp r0, #0xf\n" + " bls ._604 @cond_branch\n" + " sub r0, r0, #0x10\n" + " b ._605\n" + "._607:\n" + " .align 2, 0\n" + "._606:\n" + " .word gMain\n" + " .word gDebug_03000700+0x8\n" + "._604:\n" + " mov r0, #0x0\n" + "._605:\n" + " str r0, [r1]\n" + "._603:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._608 @cond_branch\n" + " ldr r3, ._611\n" + " ldr r1, [r3]\n" + " mov r0, #0x11\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " bhi ._609 @cond_branch\n" + " add r0, r1, #0\n" + " add r0, r0, #0x10\n" + " b ._610\n" + "._612:\n" + " .align 2, 0\n" + "._611:\n" + " .word gDebug_03000700+0x8\n" + "._609:\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + "._610:\n" + " str r0, [r3]\n" + "._608:\n" + " ldrh r2, [r2, #0x2e]\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x2\n" + " add r0, r1, #0\n" + " and r0, r0, r2\n" + " cmp r0, r1\n" + " bne ._613 @cond_branch\n" + " ldr r1, ._614\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " str r0, [r1]\n" + "._613:\n" + " pop {r0}\n" + " bx r0\n" + "._615:\n" + " .align 2, 0\n" + "._614:\n" + " .word gDebug_03000700+0x8\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EE3C() +{ + asm( + " push {lr}\n" + " ldr r2, ._622\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._617 @cond_branch\n" + " ldr r1, ._622 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x1\n" + " beq ._617 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._617:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._619 @cond_branch\n" + " ldr r1, ._622 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x5\n" + " beq ._619 @cond_branch\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._619:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._620 @cond_branch\n" + " ldr r1, ._622 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + "._620:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._621 @cond_branch\n" + " ldr r1, ._622 + 4\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + "._621:\n" + " pop {r0}\n" + " bx r0\n" + "._623:\n" + " .align 2, 0\n" + "._622:\n" + " .word gMain\n" + " .word gDebug_03000700+0xc\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EE9C() +{ + asm( + " push {lr}\n" + " ldr r2, ._631\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._625 @cond_branch\n" + " ldr r1, ._631 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x1\n" + " beq ._625 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._625:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._627 @cond_branch\n" + " ldr r1, ._631 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0xf\n" + " beq ._627 @cond_branch\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._627:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._628 @cond_branch\n" + " ldr r1, ._631 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0xa\n" + " bls ._629 @cond_branch\n" + " sub r0, r0, #0xa\n" + " b ._630\n" + "._632:\n" + " .align 2, 0\n" + "._631:\n" + " .word gMain\n" + " .word gDebug_03000700+0xd\n" + "._629:\n" + " mov r0, #0x0\n" + "._630:\n" + " strb r0, [r1]\n" + "._628:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._633 @cond_branch\n" + " ldr r1, ._636\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x5\n" + " bhi ._634 @cond_branch\n" + " add r0, r0, #0xa\n" + " b ._635\n" + "._637:\n" + " .align 2, 0\n" + "._636:\n" + " .word gDebug_03000700+0xd\n" + "._634:\n" + " mov r0, #0xf\n" + "._635:\n" + " strb r0, [r1]\n" + "._633:\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EF14() +{ + asm( + " push {lr}\n" + " ldr r2, ._645\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._639 @cond_branch\n" + " ldr r1, ._645 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x1\n" + " beq ._639 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._639:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._641 @cond_branch\n" + " ldr r1, ._645 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0xf\n" + " beq ._641 @cond_branch\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._641:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._642 @cond_branch\n" + " ldr r1, ._645 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0xa\n" + " bls ._643 @cond_branch\n" + " sub r0, r0, #0xa\n" + " b ._644\n" + "._646:\n" + " .align 2, 0\n" + "._645:\n" + " .word gMain\n" + " .word gDebug_03000700+0xe\n" + "._643:\n" + " mov r0, #0x0\n" + "._644:\n" + " strb r0, [r1]\n" + "._642:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._647 @cond_branch\n" + " ldr r1, ._650\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x5\n" + " bhi ._648 @cond_branch\n" + " add r0, r0, #0xa\n" + " b ._649\n" + "._651:\n" + " .align 2, 0\n" + "._650:\n" + " .word gDebug_03000700+0xe\n" + "._648:\n" + " mov r0, #0xf\n" + "._649:\n" + " strb r0, [r1]\n" + "._647:\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808EF8C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " cmp r6, #0x2\n" + " bgt ._653 @cond_branch\n" + " cmp r6, #0\n" + " blt ._653 @cond_branch\n" + " mov r3, #0x0\n" + " ldr r0, ._656\n" + " mov r8, r0\n" + " ldr r4, ._656 + 4\n" + " mov r7, #0x7\n" + " mov r5, #0xf\n" + "._658:\n" + " sub r0, r7, r3\n" + " lsl r0, r0, #0x2\n" + " mov r1, r8\n" + " ldr r2, [r1]\n" + " LSR r2, r0\n" + " and r2, r2, r5\n" + " cmp r2, #0x9\n" + " bhi ._654 @cond_branch\n" + " add r1, r3, r4\n" + " add r0, r2, #0\n" + " add r0, r0, #0xa1\n" + " b ._655\n" + "._657:\n" + " .align 2, 0\n" + "._656:\n" + " .word gDebug_03000700+0x8\n" + " .word gDebug_03000700+0x10\n" + "._654:\n" + " add r1, r3, r4\n" + " add r0, r2, #0\n" + " sub r0, r0, #0x4f\n" + "._655:\n" + " strb r0, [r1]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " cmp r3, #0x7\n" + " bls ._658 @cond_branch\n" + " ldr r0, ._666\n" + " mov r1, #0xff\n" + " strb r1, [r0, #0x8]\n" + " mov r1, #0xc\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + "._653:\n" + " mov r3, #0x0\n" + " ldr r7, ._666\n" + " ldr r5, ._666 + 4\n" + " ldr r2, ._666 + 8\n" + " mov r8, r2\n" + " add r4, r7, #0\n" + " mov r2, #0x0\n" + "._659:\n" + " add r1, r3, #1\n" + " add r0, r1, r4\n" + " strb r2, [r0]\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " cmp r3, #0x9\n" + " bls ._659 @cond_branch\n" + " mov r3, #0x0\n" + " ldrh r2, [r5]\n" + " mov r0, #0xb\n" + " add r1, r2, #0\n" + " mul r1, r1, r0\n" + " mov r2, r8\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._661 @cond_branch\n" + " ldr r0, ._666\n" + " mov ip, r0\n" + " mov r5, r8\n" + " add r4, r1, #0\n" + "._662:\n" + " add r1, r3, #1\n" + " mov r0, ip\n" + " add r2, r1, r0\n" + " add r0, r3, r4\n" + " add r0, r0, r5\n" + " ldrb r0, [r0]\n" + " strb r0, [r2]\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " add r0, r3, r4\n" + " add r0, r0, r5\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._661 @cond_branch\n" + " cmp r3, #0x9\n" + " bls ._662 @cond_branch\n" + "._661:\n" + " mov r0, #0xb1\n" + " strb r0, [r7]\n" + " mov r0, #0xb2\n" + " strb r0, [r7, #0xb]\n" + " mov r0, #0xff\n" + " strb r0, [r7, #0xc]\n" + " cmp r6, #0x2\n" + " bgt ._664 @cond_branch\n" + " cmp r6, #0\n" + " blt ._664 @cond_branch\n" + " add r0, r7, #0\n" + " mov r1, #0x8\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " b ._665\n" + "._667:\n" + " .align 2, 0\n" + "._666:\n" + " .word gDebug_03000700+0x10\n" + " .word gDebug_03000700\n" + " .word gSpeciesNames\n" + "._664:\n" + " ldr r0, ._672\n" + " mov r1, #0xc\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + "._665:\n" + " ldr r5, ._672\n" + " mov r0, #0xff\n" + " strb r0, [r5, #0x3]\n" + " ldr r4, ._672 + 4\n" + " ldrh r0, [r4]\n" + " mov r1, #0x64\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5]\n" + " ldrh r0, [r4]\n" + " mov r1, #0x64\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0xa\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x1]\n" + " ldrh r0, [r4]\n" + " mov r1, #0xa\n" + " bl __umodsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x2]\n" + " add r0, r5, #0\n" + " mov r1, #0xc\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " cmp r6, #0x1\n" + " beq ._668 @cond_branch\n" + " cmp r6, #0x1\n" + " bgt ._669 @cond_branch\n" + " cmp r6, #0\n" + " beq ._670 @cond_branch\n" + " b ._679\n" + "._673:\n" + " .align 2, 0\n" + "._672:\n" + " .word gDebug_03000700+0x10\n" + " .word gDebug_03000700\n" + "._669:\n" + " cmp r6, #0x2\n" + " beq ._674 @cond_branch\n" + " b ._679\n" + "._670:\n" + " ldr r4, ._677\n" + " b ._676\n" + "._678:\n" + " .align 2, 0\n" + "._677:\n" + " .word gDebug_03000700+0xc\n" + "._668:\n" + " ldr r4, ._680\n" + "._676:\n" + " ldrb r0, [r4]\n" + " mov r1, #0x64\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5]\n" + " ldrb r0, [r4]\n" + " mov r1, #0x64\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0xa\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x1]\n" + " ldrb r0, [r4]\n" + " mov r1, #0xa\n" + " bl __umodsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x2]\n" + " add r0, r5, #0\n" + " mov r1, #0xc\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " b ._679\n" + "._681:\n" + " .align 2, 0\n" + "._680:\n" + " .word gDebug_03000700+0xd\n" + "._674:\n" + " ldr r4, ._682\n" + " ldrb r0, [r4]\n" + " mov r1, #0x64\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5]\n" + " ldrb r0, [r4]\n" + " mov r1, #0x64\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0xa\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x1]\n" + " ldrb r0, [r4]\n" + " mov r1, #0xa\n" + " bl __umodsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x2]\n" + " add r0, r5, #0\n" + " mov r1, #0xc\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + "._679:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._683:\n" + " .align 2, 0\n" + "._682:\n" + " .word gDebug_03000700+0xe\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F168() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " ldr r4, ._686\n" + " ldr r0, ._686 + 4\n" + " ldrh r0, [r0]\n" + " strh r0, [r4, #0x8]\n" + " ldr r0, ._686 + 8\n" + " ldr r0, [r0]\n" + " str r0, [r4, #0x4]\n" + " ldr r0, ._686 + 12\n" + " ldr r0, [r0]\n" + " str r0, [r4]\n" + " cmp r1, #0x5\n" + " bls ._684 @cond_branch\n" + " b ._707\n" + "._684:\n" + " lsl r0, r1, #0x2\n" + " ldr r1, ._686 + 16\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._687:\n" + " .align 2, 0\n" + "._686:\n" + " .word +0x2015de0\n" + " .word gDebug_03000700\n" + " .word gDebug_03000700+0x4\n" + " .word gDebug_03000700+0x8\n" + " .word ._688\n" + "._688:\n" + " .word ._689\n" + " .word ._690\n" + " .word ._691\n" + " .word ._692\n" + " .word ._693\n" + " .word ._694\n" + "._689:\n" + " ldr r0, ._696\n" + " ldr r2, ._696 + 4\n" + " add r1, r0, r2\n" + " mov r2, #0x0\n" + " strb r2, [r1]\n" + " ldr r1, ._696 + 8\n" + " add r0, r0, r1\n" + " strb r2, [r0]\n" + " ldr r0, ._696 + 12\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r4, #0xa]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x16\n" + " ldr r1, ._696 + 16\n" + " bl StringCopy\n" + " b ._704\n" + "._697:\n" + " .align 2, 0\n" + "._696:\n" + " .word +0x2000000\n" + " .word 0x15ddf\n" + " .word 0x15dde\n" + " .word gDebug_03000700+0xc\n" + " .word gUnknown_Debug_083C48BB\n" + "._690:\n" + " ldr r1, ._699\n" + " ldr r0, ._699 + 4\n" + " add r2, r1, r0\n" + " mov r0, #0x0\n" + " strb r0, [r2]\n" + " ldr r2, ._699 + 8\n" + " add r1, r1, r2\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldr r0, ._699 + 12\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x1\n" + " b ._698\n" + "._700:\n" + " .align 2, 0\n" + "._699:\n" + " .word +0x2000000\n" + " .word 0x15ddf\n" + " .word 0x15dde\n" + " .word gDebug_03000700+0xd\n" + "._691:\n" + " ldr r1, ._702\n" + " ldr r0, ._702 + 4\n" + " add r2, r1, r0\n" + " mov r0, #0x1\n" + " strb r0, [r2]\n" + " ldr r2, ._702 + 8\n" + " add r1, r1, r2\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldr r0, ._702 + 12\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r4, #0xa]\n" + " b ._707\n" + "._703:\n" + " .align 2, 0\n" + "._702:\n" + " .word +0x2000000\n" + " .word 0x15ddf\n" + " .word 0x15dde\n" + " .word gDebug_03000700+0xe\n" + "._692:\n" + " ldr r1, ._705\n" + " ldr r2, ._705 + 4\n" + " add r0, r1, r2\n" + " mov r2, #0x0\n" + " strb r2, [r0]\n" + " ldr r0, ._705 + 8\n" + " add r1, r1, r0\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " strb r2, [r4, #0xa]\n" + " b ._704\n" + "._706:\n" + " .align 2, 0\n" + "._705:\n" + " .word +0x2000000\n" + " .word 0x15ddf\n" + " .word 0x15dde\n" + "._693:\n" + " ldr r1, ._708\n" + " ldr r0, ._708 + 4\n" + " add r2, r1, r0\n" + " mov r0, #0x0\n" + " strb r0, [r2]\n" + " ldr r2, ._708 + 8\n" + " add r1, r1, r2\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " mov r0, #0x3\n" + "._698:\n" + " strb r0, [r4, #0xa]\n" + "._704:\n" + " add r0, r4, #0\n" + " add r0, r0, #0xb\n" + " ldr r1, ._708 + 12\n" + " bl StringCopy\n" + " b ._707\n" + "._709:\n" + " .align 2, 0\n" + "._708:\n" + " .word +0x2000000\n" + " .word 0x15ddf\n" + " .word 0x15dde\n" + " .word gUnknown_Debug_083C48B0\n" + "._694:\n" + " ldr r1, ._710\n" + " ldr r0, ._710 + 4\n" + " add r2, r1, r0\n" + " mov r0, #0x0\n" + " strb r0, [r2]\n" + " ldr r2, ._710 + 8\n" + " add r1, r1, r2\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " mov r0, #0x9\n" + " strb r0, [r4, #0xa]\n" + " add r0, r4, #0\n" + " add r0, r0, #0xb\n" + " ldr r1, ._710 + 12\n" + " bl StringCopy\n" + "._707:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._711:\n" + " .align 2, 0\n" + "._710:\n" + " .word +0x2000000\n" + " .word 0x15ddf\n" + " .word 0x15dde\n" + " .word gUnknown_Debug_083C48B0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F2E0() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " lsl r1, r1, #0x18\n" + " lsr r3, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " cmp r2, #0\n" + " bne ._712 @cond_branch\n" + " ldr r1, ._714\n" + " mov r0, #0xa1\n" + " b ._713\n" + "._715:\n" + " .align 2, 0\n" + "._714:\n" + " .word gDebug_03000700+0x10\n" + "._712:\n" + " ldr r1, ._716\n" + " mov r0, #0xa2\n" + "._713:\n" + " strb r0, [r1]\n" + " mov r0, #0xff\n" + " strb r0, [r1, #0x1]\n" + " add r0, r1, #0\n" + " add r1, r4, #0\n" + " add r2, r3, #0\n" + " bl MenuPrint\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._717:\n" + " .align 2, 0\n" + "._716:\n" + " .word gDebug_03000700+0x10\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_808F31C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6}\n" + " mov r8, r0\n" + " mov r9, r1\n" + " add r4, r2, #0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " mov r0, r9\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r9, r0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " ldr r5, ._718\n" + " ldr r6, ._718 + 4\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5]\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r6, #0xfa\n" + " lsl r6, r6, #0x2\n" + " add r1, r6, #0\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x1]\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0x64\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x2]\n" + " add r0, r4, #0\n" + " mov r1, #0x64\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0xa\n" + " bl __udivsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x3]\n" + " add r0, r4, #0\n" + " mov r1, #0xa\n" + " bl __umodsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r5, #0x4]\n" + " mov r0, #0xff\n" + " strb r0, [r5, #0x5]\n" + " add r0, r5, #0\n" + " mov r1, r8\n" + " mov r2, r9\n" + " bl MenuPrint\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._719:\n" + " .align 2, 0\n" + "._718:\n" + " .word gDebug_03000700+0x10\n" + " .word 0x2710\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_nullsub_66() +{ + asm( + " bx lr\n" + "\n" + ); +} + +#endif diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c new file mode 100644 index 000000000..fed5b4e52 --- /dev/null +++ b/src/debug/watanabe_debug_menu.c @@ -0,0 +1,9846 @@ +#ifdef DEBUG +#include "global.h" + +EWRAM_DATA u8 unk_debug_ewram_0[56] = { 0 }; + +u8 byte_3005E30[0x20]; + +__attribute__((naked)) +void debug_69() +{ + asm( + " bx lr\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C35DC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " bl SetVBlankCallback\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x13\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " add r0, r0, #0xe\n" + " strh r1, [r0]\n" + " sub r0, r0, #0x2\n" + " strh r1, [r0]\n" + " sub r0, r0, #0x2\n" + " strh r1, [r0]\n" + " sub r0, r0, #0x2\n" + " strh r1, [r0]\n" + " add r0, r0, #0x14\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " sub r0, r0, #0x6\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " sub r0, r0, #0x6\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " sub r0, r0, #0x6\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " mov r3, #0xc0\n" + " lsl r3, r3, #0x13\n" + " mov r4, #0xc0\n" + " lsl r4, r4, #0x9\n" + " add r0, sp, #0x4\n" + " mov r8, r0\n" + " mov r2, sp\n" + " mov r6, #0x0\n" + " ldr r1, ._2\n" + " mov r5, #0x80\n" + " lsl r5, r5, #0x5\n" + " ldr r7, ._2 + 4\n" + " mov r0, #0x81\n" + " lsl r0, r0, #0x18\n" + " mov ip, r0\n" + "._1:\n" + " strh r6, [r2]\n" + " mov r0, sp\n" + " str r0, [r1]\n" + " str r3, [r1, #0x4]\n" + " str r7, [r1, #0x8]\n" + " ldr r0, [r1, #0x8]\n" + " add r3, r3, r5\n" + " sub r4, r4, r5\n" + " cmp r4, r5\n" + " bhi ._1 @cond_branch\n" + " strh r6, [r2]\n" + " mov r2, sp\n" + " str r2, [r1]\n" + " str r3, [r1, #0x4]\n" + " lsr r0, r4, #0x1\n" + " mov r2, ip\n" + " orr r0, r0, r2\n" + " str r0, [r1, #0x8]\n" + " ldr r0, [r1, #0x8]\n" + " mov r0, #0xe0\n" + " lsl r0, r0, #0x13\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x3\n" + " mov r4, #0x0\n" + " str r4, [sp, #0x4]\n" + " ldr r2, ._2\n" + " mov r1, r8\n" + " str r1, [r2]\n" + " str r0, [r2, #0x4]\n" + " lsr r0, r3, #0x2\n" + " mov r1, #0x85\n" + " lsl r1, r1, #0x18\n" + " orr r0, r0, r1\n" + " str r0, [r2, #0x8]\n" + " ldr r0, [r2, #0x8]\n" + " mov r1, #0xa0\n" + " lsl r1, r1, #0x13\n" + " mov r0, sp\n" + " strh r4, [r0]\n" + " str r0, [r2]\n" + " str r1, [r2, #0x4]\n" + " lsr r3, r3, #0x1\n" + " mov r0, #0x81\n" + " lsl r0, r0, #0x18\n" + " orr r3, r3, r0\n" + " str r3, [r2, #0x8]\n" + " ldr r0, [r2, #0x8]\n" + " bl ResetPaletteFade\n" + " bl remove_some_task\n" + " bl ResetTasks\n" + " bl ResetSpriteData\n" + " bl ResetPaletteFade\n" + " bl FreeAllSpritePalettes\n" + " ldr r0, ._2 + 8\n" + " bl LoadSpriteSheet\n" + " ldr r0, ._2 + 12\n" + " bl LoadSpritePalette\n" + " ldr r0, ._2 + 16\n" + " bl SetUpWindowConfig\n" + " ldr r0, ._2 + 20\n" + " bl InitMenuWindow\n" + " add sp, sp, #0x8\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._3:\n" + " .align 2, 0\n" + "._2:\n" + " .word 0x40000d4\n" + " .word 0x81000800\n" + " .word stru_83F8828\n" + " .word stru_83F8838\n" + " .word gWindowConfig_81E6C3C\n" + " .word gWindowConfig_81E6CE4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C36F4() +{ + asm( + " push {lr}\n" + " bl RunTasks\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " bl UpdatePaletteFade\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C370C() +{ + asm( + " push {lr}\n" + " ldr r0, ._6\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._4 @cond_branch\n" + " ldr r0, ._6 + 4\n" + " bl SetMainCallback2\n" + " b ._5\n" + "._7:\n" + " .align 2, 0\n" + "._6:\n" + " .word gPaletteFade\n" + " .word debug_80C36F4+1\n" + "._4:\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " bl UpdatePaletteFade\n" + "._5:\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C373C() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + " ldr r0, ._8\n" + " bl SetMainCallback2\n" + " pop {r0}\n" + " bx r0\n" + "._9:\n" + " .align 2, 0\n" + "._8:\n" + " .word sub_80546F0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C3758() +{ + asm( + " push {lr}\n" + " bl LoadOam\n" + " bl ProcessSpriteCopyRequests\n" + " bl TransferPlttBuffer\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C376C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " lsl r1, r1, #0x18\n" + " lsr r7, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r6, r2, #0x18\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + "._10:\n" + " mov r3, sp\n" + " add r0, r3, r1\n" + " strb r2, [r0]\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " cmp r1, #0x2\n" + " bls ._10 @cond_branch\n" + " mov r1, sp\n" + " mov r0, #0xff\n" + " strb r0, [r1, #0x3]\n" + " mov r4, #0x0\n" + " add r0, r5, #0\n" + " mov r1, #0x64\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._11 @cond_branch\n" + " mov r1, sp\n" + " add r0, r0, #0xa1\n" + " strb r0, [r1]\n" + " mov r4, #0x1\n" + "._11:\n" + " add r0, r5, #0\n" + " mov r1, #0x64\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0xa\n" + " bl __udivsi3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._12 @cond_branch\n" + " cmp r4, #0\n" + " beq ._13 @cond_branch\n" + "._12:\n" + " mov r1, sp\n" + " add r0, r0, #0xa1\n" + " strb r0, [r1, #0x1]\n" + "._13:\n" + " mov r4, sp\n" + " add r0, r5, #0\n" + " mov r1, #0x64\n" + " bl __umodsi3\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0xa\n" + " bl __umodsi3\n" + " add r0, r0, #0xa1\n" + " strb r0, [r4, #0x2]\n" + " mov r0, sp\n" + " add r1, r7, #0\n" + " add r2, r6, #0\n" + " bl MenuPrint\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C3800() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffff4\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " lsl r1, r1, #0x18\n" + " lsr r6, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r5, r2, #0x18\n" + " mov r3, #0x0\n" + " ldr r2, ._18\n" + " mov r1, #0x0\n" + "._14:\n" + " mov r7, sp\n" + " add r0, r7, r3\n" + " strb r1, [r0]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " cmp r3, #0x9\n" + " bls ._14 @cond_branch\n" + " add r1, r7, r3\n" + " mov r0, #0xff\n" + " strb r0, [r1]\n" + " mov r3, #0x0\n" + " mov r0, #0xb\n" + " add r1, r4, #0\n" + " mul r1, r1, r0\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._16 @cond_branch\n" + " add r4, r2, #0\n" + " add r2, r1, #0\n" + "._17:\n" + " mov r0, sp\n" + " add r1, r0, r3\n" + " add r0, r3, r2\n" + " add r0, r0, r4\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " add r0, r3, r2\n" + " add r0, r0, r4\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._16 @cond_branch\n" + " cmp r3, #0x9\n" + " bls ._17 @cond_branch\n" + "._16:\n" + " mov r0, sp\n" + " add r1, r6, #0\n" + " add r2, r5, #0\n" + " bl MenuPrint\n" + " add sp, sp, #0xc\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._19:\n" + " .align 2, 0\n" + "._18:\n" + " .word gSpeciesNames\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C3878() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " cmp r0, #0\n" + " beq ._20 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._21 @cond_branch\n" + "._20:\n" + " cmp r1, #0x1\n" + " bls ._22 @cond_branch\n" + " sub r0, r1, #1\n" + " b ._23\n" + "._22:\n" + " ldr r1, ._25\n" + " b ._28\n" + "._26:\n" + " .align 2, 0\n" + "._25:\n" + " .word 0x19b\n" + "._21:\n" + " mov r0, #0xcd\n" + " lsl r0, r0, #0x1\n" + " cmp r1, r0\n" + " bhi ._27 @cond_branch\n" + " add r0, r1, #1\n" + "._23:\n" + " lsl r0, r0, #0x10\n" + " lsr r1, r0, #0x10\n" + " b ._28\n" + "._27:\n" + " mov r1, #0x1\n" + "._28:\n" + " add r0, r1, #0\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C38B4() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r1, r1, #0x10\n" + " lsr r0, r1, #0x10\n" + " cmp r2, #0\n" + " beq ._29 @cond_branch\n" + " cmp r2, #0x1\n" + " beq ._30 @cond_branch\n" + "._29:\n" + " cmp r0, #0\n" + " beq ._31 @cond_branch\n" + " sub r0, r0, #0x1\n" + " b ._32\n" + "._31:\n" + " mov r0, #0x52\n" + " b ._35\n" + "._30:\n" + " cmp r0, #0x51\n" + " bhi ._34 @cond_branch\n" + " add r0, r0, #0x1\n" + "._32:\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " b ._35\n" + "._34:\n" + " mov r0, #0x0\n" + "._35:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C38E4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r2, #0\n" + " add r5, r3, #0\n" + " ldr r6, [sp, #0x1c]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " lsl r1, r1, #0x18\n" + " lsr r7, r1, #0x18\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " lsl r6, r6, #0x18\n" + " lsr r6, r6, #0x18\n" + " ldr r1, ._37\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " bl memcpy\n" + " add r0, r7, #0\n" + " add r1, r4, #0\n" + " add r2, r7, #0\n" + " add r3, r5, #0\n" + " bl MenuFillWindowRectWithBlankTile\n" + " cmp r6, #0\n" + " beq ._36 @cond_branch\n" + " mov r0, sp\n" + " add r1, r7, #0\n" + " mov r2, r8\n" + " bl MenuPrint\n" + "._36:\n" + " add sp, sp, #0x4\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._38:\n" + " .align 2, 0\n" + "._37:\n" + " .word gUnknown_Debug_083F7FD4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C393C() +{ + asm( + " push {lr}\n" + " ldr r1, ._39\n" + " mov r0, #0x1e\n" + " bl ProgramFlashSectorAndVerify\n" + " pop {r0}\n" + " bx r0\n" + "._40:\n" + " .align 2, 0\n" + "._39:\n" + " .word gUnknown_Debug_083F7FD6\n" + "\n" + ); +} + +__attribute__((naked)) +void InitWatanabeDebugMenu() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._46\n" + " ldr r1, ._46 + 4\n" + " add r4, r0, r1\n" + " ldrb r0, [r4]\n" + " cmp r0, #0x1\n" + " beq ._41 @cond_branch\n" + " cmp r0, #0x1\n" + " ble ._42 @cond_branch\n" + " cmp r0, #0x2\n" + " beq ._43 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._44 @cond_branch\n" + "._42:\n" + " bl save_serialize_map\n" + " bl sub_8125E2C\n" + " mov r0, #0x1\n" + " strb r0, [r4]\n" + " b ._51\n" + "._47:\n" + " .align 2, 0\n" + "._46:\n" + " .word gMain\n" + " .word 0x43c\n" + "._41:\n" + " bl sub_8125E6C\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._51 @cond_branch\n" + " b ._49\n" + "._43:\n" + " mov r0, #0x37\n" + " bl PlaySE\n" + "._49:\n" + " ldrb r0, [r4]\n" + " add r0, r0, #0x1\n" + " strb r0, [r4]\n" + " b ._51\n" + "._44:\n" + " bl IsSEPlaying\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._51 @cond_branch\n" + " bl ScriptContext2_Disable\n" + " ldr r0, ._52\n" + " bl SetMainCallback2\n" + "._51:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._53:\n" + " .align 2, 0\n" + "._52:\n" + " .word sub_80546F0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void InitSizeComparison() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " bl debug_80C35DC\n" + " ldr r1, ._54\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, ._54 + 4\n" + " mov r1, #0x80\n" + " lsl r1, r1, #0x1\n" + " mov r2, #0x20\n" + " bl LoadPalette\n" + " ldr r3, ._54 + 8\n" + " ldrh r2, [r3]\n" + " mov r0, #0x0\n" + " strh r0, [r3]\n" + " ldr r4, ._54 + 12\n" + " ldrh r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strh r0, [r4]\n" + " strh r2, [r3]\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x10\n" + " mov r3, #0x0\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._54 + 16\n" + " bl SetVBlankCallback\n" + " ldr r0, ._54 + 20\n" + " bl SetMainCallback2\n" + " mov r1, #0x80\n" + " lsl r1, r1, #0x13\n" + " mov r2, #0x8a\n" + " lsl r2, r2, #0x5\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r0, ._54 + 24\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._54 + 28\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " mov r0, #0xfc\n" + " strh r0, [r1, #0x8]\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._55:\n" + " .align 2, 0\n" + "._54:\n" + " .word gReservedSpritePaletteCount\n" + " .word unk_debug_ewram_0\n" + " .word 0x4000208\n" + " .word 0x4000200\n" + " .word debug_80C3758+1\n" + " .word debug_80C370C+1\n" + " .word debug_80C3A50+1\n" + " .word gTasks\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C3A50() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xffffffd8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r1, ._56\n" + " lsl r2, r0, #0x2\n" + " add r0, r2, r0\n" + " lsl r0, r0, #0x3\n" + " add r7, r0, r1\n" + " ldrh r0, [r7, #0x8]\n" + " str r0, [sp, #0x4]\n" + " bl NationalPokedexNumToSpecies\n" + " mov r1, sp\n" + " strh r0, [r1, #0x8]\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x10\n" + " str r2, [sp, #0xc]\n" + " lsr r2, r2, #0x10\n" + " mov r9, r2\n" + " ldr r3, ._56 + 4\n" + " mov r8, r3\n" + " mov r0, #0x6\n" + " mov r1, #0x0\n" + " mov r2, #0x17\n" + " mov r3, #0x9\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x5\n" + " mov r3, #0x9\n" + " bl MenuDrawTextWindow\n" + " ldr r5, ._56 + 8\n" + " add r0, r5, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r4, ._56 + 12\n" + " add r0, r4, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, #0x18\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x9\n" + " bl MenuDrawTextWindow\n" + " add r0, r5, #0\n" + " mov r1, #0x19\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0x19\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " mov r1, #0xa\n" + " mov r2, #0xb\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._56 + 16\n" + " mov r1, #0x1\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " ldr r0, ._56 + 20\n" + " mov r1, #0x1\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " ldr r0, ._56 + 24\n" + " mov r1, #0x1\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldr r0, ._56 + 28\n" + " mov r1, #0x1\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " mov r0, #0xc\n" + " mov r1, #0xa\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._56 + 32\n" + " mov r1, #0xd\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " ldr r0, ._56 + 36\n" + " mov r1, #0xd\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " mov r0, #0xc\n" + " mov r1, #0x10\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._56 + 40\n" + " mov r1, #0xd\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " ldr r0, ._56 + 44\n" + " mov r1, #0x18\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " mov r0, r9\n" + " mov r1, #0x12\n" + " mov r2, #0x11\n" + " bl debug_80C3800\n" + " mov r1, r8\n" + " ldrb r0, [r1, #0x8]\n" + " mov r1, #0x98\n" + " mov r2, #0x28\n" + " mov r3, #0x0\n" + " bl sub_8091A4C\n" + " mov r2, sp\n" + " strh r0, [r2, #0x10]\n" + " add r3, r0, #0\n" + " lsl r3, r3, #0x10\n" + " str r3, [sp, #0x18]\n" + " lsr r0, r3, #0x10\n" + " str r0, [sp, #0x14]\n" + " lsl r4, r0, #0x4\n" + " add r4, r4, r0\n" + " lsl r4, r4, #0x2\n" + " ldr r1, ._56 + 48\n" + " add r4, r4, r1\n" + " ldrb r1, [r4, #0x1]\n" + " mov r2, #0x4\n" + " neg r2, r2\n" + " mov sl, r2\n" + " mov r0, sl\n" + " and r0, r0, r1\n" + " mov r3, #0x1\n" + " orr r0, r0, r3\n" + " strb r0, [r4, #0x1]\n" + " ldrb r1, [r4, #0x3]\n" + " mov r0, #0x3f\n" + " neg r0, r0\n" + " mov r9, r0\n" + " and r0, r0, r1\n" + " mov r1, #0x4\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x3]\n" + " ldrb r1, [r4, #0x5]\n" + " sub r2, r2, #0x9\n" + " mov r8, r2\n" + " mov r0, r8\n" + " and r0, r0, r1\n" + " mov r3, #0xf\n" + " and r0, r0, r3\n" + " strb r0, [r4, #0x5]\n" + " mov r0, #0x0\n" + " bl GetSpritePaletteTagByPaletteNum\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl FreeSpritePaletteByTag\n" + " ldr r0, ._56 + 52\n" + " ldr r1, [sp, #0x4]\n" + " lsl r5, r1, #0x3\n" + " add r5, r5, r1\n" + " lsl r5, r5, #0x2\n" + " add r5, r5, r0\n" + " ldrh r6, [r5, #0x20]\n" + " strh r6, [r4, #0x26]\n" + " ldrh r4, [r5, #0x1e]\n" + " str r4, [sp]\n" + " mov r0, #0x2\n" + " add r1, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl SetOamMatrix\n" + " mov r2, sp\n" + " ldrh r2, [r2, #0x14]\n" + " strh r2, [r7, #0xe]\n" + " strh r6, [r7, #0x10]\n" + " strh r4, [r7, #0x14]\n" + " ldr r0, [sp, #0x4]\n" + " mov r1, #0x58\n" + " mov r2, #0x28\n" + " mov r3, #0x1\n" + " bl sub_80918EC\n" + " mov r3, sp\n" + " strh r0, [r3, #0x1c]\n" + " lsl r0, r0, #0x10\n" + " str r0, [sp, #0x24]\n" + " lsr r1, r0, #0x10\n" + " str r1, [sp, #0x20]\n" + " lsl r4, r1, #0x4\n" + " add r4, r4, r1\n" + " lsl r4, r4, #0x2\n" + " ldr r2, ._56 + 48\n" + " add r4, r4, r2\n" + " ldrb r0, [r4, #0x1]\n" + " mov r3, sl\n" + " and r3, r3, r0\n" + " mov r0, #0x1\n" + " orr r3, r3, r0\n" + " strb r3, [r4, #0x1]\n" + " ldrb r0, [r4, #0x3]\n" + " mov r1, r9\n" + " and r1, r1, r0\n" + " mov r0, #0x2\n" + " orr r1, r1, r0\n" + " strb r1, [r4, #0x3]\n" + " ldrb r0, [r4, #0x5]\n" + " mov r2, r8\n" + " and r2, r2, r0\n" + " mov r3, #0xf\n" + " and r2, r2, r3\n" + " strb r2, [r4, #0x5]\n" + " mov r0, #0x0\n" + " bl GetSpritePaletteTagByPaletteNum\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl FreeSpritePaletteByTag\n" + " ldrh r0, [r5, #0x1c]\n" + " mov r8, r0\n" + " strh r0, [r4, #0x26]\n" + " ldrh r4, [r5, #0x1a]\n" + " str r4, [sp]\n" + " mov r0, #0x1\n" + " add r1, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl SetOamMatrix\n" + " mov r1, sp\n" + " ldrh r1, [r1, #0x20]\n" + " strh r1, [r7, #0xc]\n" + " mov r2, r8\n" + " strh r2, [r7, #0x12]\n" + " strh r4, [r7, #0x16]\n" + " mov r3, #0x0\n" + " strh r3, [r7, #0x18]\n" + " strh r3, [r7, #0x1a]\n" + " ldr r1, ._56 + 56\n" + " ldr r2, ._56 + 60\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " mov r0, #0x1f\n" + " strh r0, [r1]\n" + " ldr r2, ._56 + 64\n" + " mov r3, #0x18\n" + " ldsh r1, [r7, r3]\n" + " lsl r1, r1, #0x6\n" + " add r0, r1, #0\n" + " add r0, r0, #0x38\n" + " lsl r0, r0, #0x8\n" + " add r1, r1, #0x78\n" + " add r0, r0, r1\n" + " strh r0, [r2]\n" + " ldr r1, ._56 + 68\n" + " ldr r2, ._56 + 72\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " sub r1, r1, #0x2\n" + " ldr r3, ._56 + 76\n" + " add r0, r3, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._56 + 80\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0xa\n" + " mov r0, #0xe1\n" + " strh r0, [r1]\n" + " ldr r0, ._56 + 84\n" + " mov r3, #0x0\n" + " strh r3, [r0]\n" + " add r1, r1, #0x4\n" + " mov r0, #0x7\n" + " strh r0, [r1]\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x13\n" + " ldrh r0, [r2]\n" + " mov r3, #0xc0\n" + " lsl r3, r3, #0x7\n" + " add r1, r3, #0\n" + " orr r0, r0, r1\n" + " strh r0, [r2]\n" + " ldr r0, ._56 + 88\n" + " str r0, [r7]\n" + " add sp, sp, #0x28\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._57:\n" + " .align 2, 0\n" + "._56:\n" + " .word gTasks\n" + " .word gSaveBlock2\n" + " .word gUnknown_Debug_083F7FD6+0x4\n" + " .word gUnknown_Debug_083F7FDE\n" + " .word gUnknown_Debug_083F7FE2\n" + " .word gUnknown_Debug_083F7FED\n" + " .word gUnknown_Debug_083F7FF6\n" + " .word gUnknown_Debug_083F8001\n" + " .word gUnknown_Debug_083F800C\n" + " .word gUnknown_Debug_083F8019\n" + " .word gUnknown_Debug_083F8022\n" + " .word gUnknown_Debug_083F8028\n" + " .word gSprites\n" + " .word gPokedexEntries\n" + " .word 0x4000048\n" + " .word 0x3f1f\n" + " .word 0x4000040\n" + " .word 0x4000044\n" + " .word 0x848\n" + " .word 0x31bf\n" + " .word 0x14f\n" + " .word 0x4000052\n" + " .word debug_80C3D2C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C3D2C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " add r7, r6, #0\n" + " ldr r4, ._60\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._58 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._60 + 4\n" + " bl SetMainCallback2\n" + " ldr r1, ._60 + 8\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._60 + 12\n" + " str r1, [r0]\n" + " b ._117\n" + "._61:\n" + " .align 2, 0\n" + "._60:\n" + " .word gMain\n" + " .word debug_80C370C+1\n" + " .word gTasks\n" + " .word debug_80C373C+1\n" + "._58:\n" + " mov r5, #0x1\n" + " add r0, r5, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._62 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._64\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrh r1, [r0, #0x18]\n" + " mov r2, #0x1\n" + " eor r1, r1, r2\n" + " strh r1, [r0, #0x18]\n" + " b ._117\n" + "._65:\n" + " .align 2, 0\n" + "._64:\n" + " .word gTasks\n" + "._62:\n" + " ldrh r1, [r4, #0x30]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._66 @cond_branch\n" + " ldr r1, ._70\n" + " lsl r2, r6, #0x2\n" + " add r0, r2, r6\n" + " lsl r0, r0, #0x3\n" + " add r3, r0, r1\n" + " mov r5, #0x18\n" + " ldsh r0, [r3, r5]\n" + " mov r8, r1\n" + " cmp r0, #0\n" + " beq ._67 @cond_branch\n" + " ldrh r1, [r4, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._68 @cond_branch\n" + " ldrh r0, [r3, #0x14]\n" + " add r0, r0, #0x10\n" + " b ._69\n" + "._71:\n" + " .align 2, 0\n" + "._70:\n" + " .word gTasks\n" + "._68:\n" + " ldrh r0, [r3, #0x14]\n" + " add r0, r0, #0x1\n" + "._69:\n" + " strh r0, [r3, #0x14]\n" + " add r0, r2, r7\n" + " lsl r0, r0, #0x3\n" + " mov r2, r8\n" + " add r1, r0, r2\n" + " ldrh r0, [r1, #0x14]\n" + " mov r6, #0x80\n" + " lsl r6, r6, #0x8\n" + " cmp r0, r6\n" + " bhi ._72 @cond_branch\n" + " b ._117\n" + "._72:\n" + " strh r6, [r1, #0x14]\n" + " b ._117\n" + "._67:\n" + " ldrh r1, [r4, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._75 @cond_branch\n" + " ldrh r0, [r3, #0x16]\n" + " add r0, r0, #0x10\n" + " b ._76\n" + "._75:\n" + " ldrh r0, [r3, #0x16]\n" + " add r0, r0, #0x1\n" + "._76:\n" + " strh r0, [r3, #0x16]\n" + " add r0, r2, r7\n" + " lsl r0, r0, #0x3\n" + " mov r4, r8\n" + " add r1, r0, r4\n" + " ldrh r0, [r1, #0x16]\n" + " mov r6, #0x80\n" + " lsl r6, r6, #0x8\n" + " cmp r0, r6\n" + " bhi ._77 @cond_branch\n" + " b ._117\n" + "._77:\n" + " strh r6, [r1, #0x16]\n" + " b ._117\n" + "._66:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._80 @cond_branch\n" + " ldr r1, ._84\n" + " lsl r2, r6, #0x2\n" + " add r0, r2, r6\n" + " lsl r0, r0, #0x3\n" + " add r3, r0, r1\n" + " mov r5, #0x18\n" + " ldsh r0, [r3, r5]\n" + " mov r8, r1\n" + " cmp r0, #0\n" + " beq ._81 @cond_branch\n" + " ldrh r1, [r4, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._82 @cond_branch\n" + " ldrh r0, [r3, #0x14]\n" + " sub r0, r0, #0x10\n" + " b ._83\n" + "._85:\n" + " .align 2, 0\n" + "._84:\n" + " .word gTasks\n" + "._82:\n" + " ldrh r0, [r3, #0x14]\n" + " sub r0, r0, #0x1\n" + "._83:\n" + " strh r0, [r3, #0x14]\n" + " add r0, r2, r7\n" + " lsl r0, r0, #0x3\n" + " mov r2, r8\n" + " add r1, r0, r2\n" + " mov r4, #0x14\n" + " ldsh r0, [r1, r4]\n" + " cmp r0, #0xff\n" + " ble ._86 @cond_branch\n" + " b ._117\n" + "._86:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " strh r0, [r1, #0x14]\n" + " b ._117\n" + "._81:\n" + " ldrh r1, [r4, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._89 @cond_branch\n" + " ldrh r0, [r3, #0x16]\n" + " sub r0, r0, #0x10\n" + " b ._90\n" + "._89:\n" + " ldrh r0, [r3, #0x16]\n" + " sub r0, r0, #0x1\n" + "._90:\n" + " strh r0, [r3, #0x16]\n" + " add r0, r2, r7\n" + " lsl r0, r0, #0x3\n" + " mov r5, r8\n" + " add r1, r0, r5\n" + " mov r2, #0x16\n" + " ldsh r0, [r1, r2]\n" + " cmp r0, #0xff\n" + " ble ._91 @cond_branch\n" + " b ._117\n" + "._91:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " strh r0, [r1, #0x16]\n" + " b ._117\n" + "._80:\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._94 @cond_branch\n" + " ldr r0, ._97\n" + " lsl r1, r6, #0x2\n" + " add r1, r1, r6\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " mov r4, #0x18\n" + " ldsh r0, [r1, r4]\n" + " cmp r0, #0\n" + " beq ._95 @cond_branch\n" + " ldrh r0, [r1, #0x10]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1, #0x10]\n" + " b ._117\n" + "._98:\n" + " .align 2, 0\n" + "._97:\n" + " .word gTasks\n" + "._95:\n" + " ldrh r0, [r1, #0x12]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1, #0x12]\n" + " b ._117\n" + "._94:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._100 @cond_branch\n" + " ldr r0, ._103\n" + " lsl r1, r6, #0x2\n" + " add r1, r1, r6\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " mov r5, #0x18\n" + " ldsh r0, [r1, r5]\n" + " cmp r0, #0\n" + " beq ._101 @cond_branch\n" + " ldrh r0, [r1, #0x10]\n" + " add r0, r0, #0x1\n" + " strh r0, [r1, #0x10]\n" + " b ._117\n" + "._104:\n" + " .align 2, 0\n" + "._103:\n" + " .word gTasks\n" + "._101:\n" + " ldrh r0, [r1, #0x12]\n" + " add r0, r0, #0x1\n" + " strh r0, [r1, #0x12]\n" + " b ._117\n" + "._100:\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._106 @cond_branch\n" + " ldr r2, ._109\n" + " lsl r3, r6, #0x2\n" + " add r0, r3, r6\n" + " lsl r0, r0, #0x3\n" + " add r6, r0, r2\n" + " ldrh r4, [r6, #0x8]\n" + " mov r0, #0x8\n" + " ldsh r1, [r6, r0]\n" + " ldr r0, ._109 + 4\n" + " mov r8, r2\n" + " add r2, r3, #0\n" + " cmp r1, r0\n" + " bgt ._107 @cond_branch\n" + " add r0, r4, #1\n" + " strh r0, [r6, #0x8]\n" + " b ._108\n" + "._110:\n" + " .align 2, 0\n" + "._109:\n" + " .word gTasks\n" + " .word 0x181\n" + "._107:\n" + " strh r5, [r6, #0x8]\n" + "._108:\n" + " add r4, r2, r7\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r8\n" + " mov r2, #0xc\n" + " ldsh r1, [r4, r2]\n" + " b ._111\n" + "._106:\n" + " mov r0, #0x4\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._112 @cond_branch\n" + " ldr r1, ._115\n" + " lsl r2, r6, #0x2\n" + " add r0, r2, r6\n" + " lsl r0, r0, #0x3\n" + " add r3, r0, r1\n" + " ldrh r6, [r3, #0x8]\n" + " mov r4, #0x8\n" + " ldsh r0, [r3, r4]\n" + " mov r8, r1\n" + " cmp r0, #0x1\n" + " ble ._113 @cond_branch\n" + " sub r0, r6, #1\n" + " b ._114\n" + "._116:\n" + " .align 2, 0\n" + "._115:\n" + " .word gTasks\n" + "._113:\n" + " mov r0, #0xc1\n" + " lsl r0, r0, #0x1\n" + "._114:\n" + " strh r0, [r3, #0x8]\n" + " add r4, r2, r7\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r8\n" + " mov r5, #0xc\n" + " ldsh r1, [r4, r5]\n" + "._111:\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r5, ._118\n" + " add r0, r0, r5\n" + " bl DestroySprite\n" + " mov r0, #0xe\n" + " ldsh r1, [r4, r0]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r5\n" + " bl DestroySprite\n" + " ldr r0, ._118 + 4\n" + " str r0, [r4]\n" + " b ._117\n" + "._119:\n" + " .align 2, 0\n" + "._118:\n" + " .word gSprites\n" + " .word debug_80C3A50+1\n" + "._112:\n" + " ldr r0, ._120\n" + " lsl r5, r7, #0x2\n" + " add r5, r5, r7\n" + " lsl r5, r5, #0x3\n" + " add r5, r5, r0\n" + " ldrh r4, [r5, #0x16]\n" + " ldrh r6, [r5, #0x12]\n" + " str r4, [sp]\n" + " mov r0, #0x1\n" + " add r1, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl SetOamMatrix\n" + " add r0, r4, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x4\n" + " bl debug_80C68CC\n" + " add r0, r6, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " mov r3, #0x4\n" + " bl debug_80C68CC\n" + " ldr r2, ._120 + 4\n" + " mov r8, r2\n" + " mov r4, #0xc\n" + " ldsh r1, [r5, r4]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r8\n" + " strh r6, [r0, #0x26]\n" + " ldrh r4, [r5, #0x14]\n" + " ldrh r6, [r5, #0x10]\n" + " str r4, [sp]\n" + " mov r0, #0x2\n" + " add r1, r4, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl SetOamMatrix\n" + " add r0, r4, #0\n" + " mov r1, #0x19\n" + " mov r2, #0x3\n" + " mov r3, #0x4\n" + " bl debug_80C68CC\n" + " add r0, r6, #0\n" + " mov r1, #0x19\n" + " mov r2, #0x7\n" + " mov r3, #0x4\n" + " bl debug_80C68CC\n" + " mov r0, #0xe\n" + " ldsh r1, [r5, r0]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r8\n" + " strh r6, [r0, #0x26]\n" + " ldr r2, ._120 + 8\n" + " mov r4, #0x18\n" + " ldsh r1, [r5, r4]\n" + " lsl r1, r1, #0x6\n" + " add r0, r1, #0\n" + " add r0, r0, #0x38\n" + " lsl r0, r0, #0x8\n" + " add r1, r1, #0x78\n" + " add r0, r0, r1\n" + " strh r0, [r2]\n" + "._117:\n" + " add sp, sp, #0x4\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._121:\n" + " .align 2, 0\n" + "._120:\n" + " .word gTasks\n" + " .word gSprites\n" + " .word 0x4000040\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C405C() +{ + asm( + " push {r4, r5, lr}\n" + " add r4, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r5, r1, #0x10\n" + " mov r2, #0x0\n" + " mov r1, #0x0\n" + "._122:\n" + " add r0, r4, r2\n" + " strb r1, [r0]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x9\n" + " bls ._122 @cond_branch\n" + " add r0, r4, r2\n" + " mov r1, #0xff\n" + " strb r1, [r0]\n" + " mov r0, #0xae\n" + " strb r0, [r4]\n" + " cmp r5, #0\n" + " beq ._125 @cond_branch\n" + " mov r2, #0x0\n" + " ldr r3, ._127\n" + " mov r0, #0xb\n" + " add r1, r5, #0\n" + " mul r1, r1, r0\n" + " add r0, r1, r3\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._125 @cond_branch\n" + " add r5, r3, #0\n" + " add r3, r1, #0\n" + "._126:\n" + " add r1, r4, r2\n" + " add r0, r2, r3\n" + " add r0, r0, r5\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " add r0, r2, r3\n" + " add r0, r0, r5\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._125 @cond_branch\n" + " cmp r2, #0x9\n" + " bls ._126 @cond_branch\n" + "._125:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._128:\n" + " .align 2, 0\n" + "._127:\n" + " .word gSpeciesNames\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C40C4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " mov r5, #0x0\n" + " mov r6, sp\n" + "._135:\n" + " cmp r7, #0\n" + " beq ._129 @cond_branch\n" + " mov r0, #0x64\n" + " add r1, r5, #0\n" + " mul r1, r1, r0\n" + " ldr r0, ._132\n" + " add r4, r1, r0\n" + " add r0, r4, #0\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " beq ._134 @cond_branch\n" + " add r0, r4, #0\n" + " bl CalculateMonStats\n" + " add r0, r4, #0\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " strh r0, [r6]\n" + " add r0, r4, #0\n" + " mov r1, #0x39\n" + " mov r2, sp\n" + " bl SetMonData\n" + " b ._134\n" + "._133:\n" + " .align 2, 0\n" + "._132:\n" + " .word gEnemyParty\n" + "._129:\n" + " mov r0, #0x64\n" + " add r1, r5, #0\n" + " mul r1, r1, r0\n" + " ldr r0, ._136\n" + " add r4, r1, r0\n" + " add r0, r4, #0\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " beq ._134 @cond_branch\n" + " add r0, r4, #0\n" + " bl CalculateMonStats\n" + " add r0, r4, #0\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " strh r0, [r6]\n" + " add r0, r4, #0\n" + " mov r1, #0x39\n" + " mov r2, sp\n" + " bl SetMonData\n" + "._134:\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x5\n" + " bls ._135 @cond_branch\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._137:\n" + " .align 2, 0\n" + "._136:\n" + " .word gPlayerParty\n" + "\n" + ); +} + +__attribute__((naked)) +void InitBattleForDebug() +{ + asm( + " push {lr}\n" + " bl SavePlayerParty\n" + " ldr r1, ._138\n" + " ldr r0, ._138 + 4\n" + " ldrb r2, [r0, #0x8]\n" + " mov r0, #0x0\n" + " strb r2, [r1, #0xd]\n" + " strb r0, [r1]\n" + " strb r0, [r1, #0x1]\n" + " strb r0, [r1, #0x2]\n" + " strb r0, [r1, #0x3]\n" + " strb r0, [r1, #0x4]\n" + " strb r0, [r1, #0x5]\n" + " strb r0, [r1, #0x6]\n" + " strb r0, [r1, #0x7]\n" + " strb r0, [r1, #0x8]\n" + " strb r0, [r1, #0xc]\n" + " ldr r1, ._138 + 8\n" + " str r0, [r1]\n" + " bl ZeroPlayerPartyMons\n" + " bl ZeroEnemyPartyMons\n" + " mov r0, #0x0\n" + " bl debug_80C4214\n" + " ldr r0, ._138 + 12\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._139:\n" + " .align 2, 0\n" + "._138:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gSaveBlock2\n" + " .word byte_3005E30\n" + " .word debug_80C47BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C41A8() +{ + asm( + " push {lr}\n" + " ldr r1, ._140\n" + " mov r0, #0x0\n" + " strb r0, [r1, #0x1]\n" + " strb r0, [r1, #0x2]\n" + " bl ZeroPlayerPartyMons\n" + " bl ZeroEnemyPartyMons\n" + " mov r0, #0x0\n" + " bl debug_80C4214\n" + " ldr r0, ._140 + 4\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._141:\n" + " .align 2, 0\n" + "._140:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word debug_80C47BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C41D4() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " bl debug_80C40C4\n" + " mov r0, #0x0\n" + " bl debug_80C4214\n" + " ldr r0, ._142\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._143:\n" + " .align 2, 0\n" + "._142:\n" + " .word debug_80C42B8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C41F4() +{ + asm( + " push {lr}\n" + " mov r0, #0x1\n" + " bl debug_80C40C4\n" + " mov r0, #0x1\n" + " bl debug_80C4214\n" + " ldr r0, ._144\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._145:\n" + " .align 2, 0\n" + "._144:\n" + " .word debug_80C42B8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4214() +{ + asm( + " push {r4, r5, r6, lr}\n" + " bl debug_80C35DC\n" + " ldr r6, ._146\n" + " mov r4, #0x0\n" + " strh r4, [r6]\n" + " ldr r5, ._146 + 4\n" + " strh r4, [r5]\n" + " ldr r0, ._146 + 8\n" + " strh r4, [r0]\n" + " add r0, r0, #0x4\n" + " strh r4, [r0]\n" + " ldr r1, ._146 + 12\n" + " ldr r2, ._146 + 16\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " mov r0, #0x31\n" + " strh r0, [r1]\n" + " add r1, r1, #0x6\n" + " mov r0, #0xe1\n" + " strh r0, [r1]\n" + " ldr r0, ._146 + 20\n" + " strh r4, [r0]\n" + " add r1, r1, #0x4\n" + " mov r0, #0x7\n" + " strh r0, [r1]\n" + " ldr r3, ._146 + 24\n" + " ldrh r2, [r3]\n" + " strh r4, [r3]\n" + " ldr r4, ._146 + 28\n" + " ldrh r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strh r0, [r4]\n" + " strh r2, [r3]\n" + " ldr r0, ._146 + 32\n" + " bl SetVBlankCallback\n" + " ldr r0, ._146 + 36\n" + " bl SetMainCallback2\n" + " mov r1, #0x80\n" + " lsl r1, r1, #0x13\n" + " ldr r2, ._146 + 40\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._146 + 44\n" + " add r0, r1, #0\n" + " strh r0, [r6]\n" + " ldr r2, ._146 + 48\n" + " add r0, r2, #0\n" + " strh r0, [r5]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._147:\n" + " .align 2, 0\n" + "._146:\n" + " .word 0x4000040\n" + " .word 0x4000044\n" + " .word 0x4000042\n" + " .word 0x4000048\n" + " .word 0x1111\n" + " .word 0x4000052\n" + " .word 0x4000208\n" + " .word 0x4000200\n" + " .word debug_80C3758+1\n" + " .word debug_80C370C+1\n" + " .word 0x7140\n" + " .word 0x1ef\n" + " .word 0x819f\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C42B8() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xffffffe4\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._150\n" + " mov r0, sp\n" + " mov r2, #0xc\n" + " bl memcpy\n" + " add r4, sp, #0xc\n" + " ldr r1, ._150 + 4\n" + " add r0, r4, #0\n" + " mov r2, #0xd\n" + " bl memcpy\n" + " mov r0, #0x0\n" + " mov r1, #0x10\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r0, sp\n" + " mov r1, #0x1\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0x14\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " bl debug_80C4694\n" + " bl debug_80C4704\n" + " ldr r0, ._150 + 8\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._148 @cond_branch\n" + " ldr r0, ._150 + 12\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._150 + 16\n" + " b ._149\n" + "._151:\n" + " .align 2, 0\n" + "._150:\n" + " .word gUnknown_Debug_083F8194\n" + " .word gUnknown_Debug_083F81A0\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gTasks\n" + " .word debug_80C44EC+1\n" + "._148:\n" + " ldr r0, ._152\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._152 + 4\n" + "._149:\n" + " str r0, [r1]\n" + " add sp, sp, #0x1c\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._153:\n" + " .align 2, 0\n" + "._152:\n" + " .word gTasks\n" + " .word debug_80C4348+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4348() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r0, ._154\n" + " ldrb r0, [r0, #0x1]\n" + " lsl r0, r0, #0x19\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x12\n" + " add r0, r0, r1\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " str r1, [sp]\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r1, ._154 + 4\n" + " ldr r2, ._154 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " add r2, r2, #0x8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._154 + 12\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._154 + 16\n" + " str r1, [r0]\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._155:\n" + " .align 2, 0\n" + "._154:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word 0x4000042\n" + " .word 0x177\n" + " .word gTasks\n" + " .word debug_80C43A8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C43A8() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r1, ._158\n" + " ldrh r2, [r1, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " add r3, r1, #0\n" + " cmp r0, #0\n" + " beq ._156 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._158 + 4\n" + " ldrb r1, [r0, #0x1]\n" + " mov r0, #0x64\n" + " mul r0, r0, r1\n" + " ldr r1, ._158 + 8\n" + " add r0, r0, r1\n" + " ldr r1, ._158 + 12\n" + " bl debug_sub_80A433C\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " b ._180\n" + "._159:\n" + " .align 2, 0\n" + "._158:\n" + " .word gMain\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gPlayerParty\n" + " .word debug_80C41D4+1\n" + "._156:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._160 @cond_branch\n" + " ldr r0, ._162\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._162 + 4\n" + " str r0, [r1]\n" + " b ._180\n" + "._163:\n" + " .align 2, 0\n" + "._162:\n" + " .word gTasks\n" + " .word debug_80C4F48+1\n" + "._160:\n" + " mov r0, #0x8\n" + " and r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " lsr r1, r0, #0x10\n" + " cmp r1, #0\n" + " beq ._164 @cond_branch\n" + " bl debug_80C4774\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._180 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " bl CalculatePlayerPartyCount\n" + " bl CalculateEnemyPartyCount\n" + " ldr r0, ._167\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._167 + 4\n" + " str r0, [r1]\n" + " b ._180\n" + "._168:\n" + " .align 2, 0\n" + "._167:\n" + " .word gTasks\n" + " .word debug_80C4D14+1\n" + "._164:\n" + " mov r0, #0x88\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._169 @cond_branch\n" + " str r1, [sp]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r0, ._171\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._171 + 4\n" + " str r0, [r1]\n" + " b ._180\n" + "._172:\n" + " .align 2, 0\n" + "._171:\n" + " .word gTasks\n" + " .word debug_80C44EC+1\n" + "._169:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._174 @cond_branch\n" + " ldr r1, ._176\n" + " ldrb r0, [r1, #0x1]\n" + " cmp r0, #0\n" + " beq ._174 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0x1]\n" + " b ._175\n" + "._177:\n" + " .align 2, 0\n" + "._176:\n" + " .word unk_debug_ewram_0+0x20\n" + "._174:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._180 @cond_branch\n" + " ldr r5, ._181\n" + " ldrb r0, [r5, #0x1]\n" + " cmp r0, #0x4\n" + " bhi ._180 @cond_branch\n" + " add r1, r0, #0\n" + " mov r0, #0x64\n" + " mul r0, r0, r1\n" + " ldr r1, ._181 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " beq ._180 @cond_branch\n" + " ldrb r0, [r5, #0x1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r5, #0x1]\n" + "._175:\n" + " ldr r1, ._181 + 8\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._181 + 12\n" + " str r1, [r0]\n" + "._180:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._182:\n" + " .align 2, 0\n" + "._181:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gPlayerParty\n" + " .word gTasks\n" + " .word debug_80C4348+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C44EC() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r0, ._183\n" + " ldrb r0, [r0, #0x2]\n" + " lsl r0, r0, #0x19\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x12\n" + " add r0, r0, r1\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " str r1, [sp]\n" + " mov r1, #0x10\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r1, ._183 + 4\n" + " ldr r2, ._183 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._183 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._183 + 16\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._183 + 20\n" + " str r1, [r0]\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._184:\n" + " .align 2, 0\n" + "._183:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word 0x4000042\n" + " .word 0x79ef\n" + " .word 0x17f\n" + " .word gTasks\n" + " .word debug_80C4550+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4550() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r1, ._187\n" + " ldrh r2, [r1, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " add r3, r1, #0\n" + " cmp r0, #0\n" + " beq ._185 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r0, ._187 + 4\n" + " ldrb r1, [r0, #0x2]\n" + " mov r0, #0x64\n" + " mul r0, r0, r1\n" + " ldr r1, ._187 + 8\n" + " add r0, r0, r1\n" + " ldr r1, ._187 + 12\n" + " bl debug_sub_80A433C\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " b ._209\n" + "._188:\n" + " .align 2, 0\n" + "._187:\n" + " .word gMain\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gEnemyParty\n" + " .word debug_80C41F4+1\n" + "._185:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._189 @cond_branch\n" + " ldr r0, ._191\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._191 + 4\n" + " str r0, [r1]\n" + " b ._209\n" + "._192:\n" + " .align 2, 0\n" + "._191:\n" + " .word gTasks\n" + " .word debug_80C4F48+1\n" + "._189:\n" + " mov r0, #0x8\n" + " and r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " lsr r1, r0, #0x10\n" + " cmp r1, #0\n" + " beq ._193 @cond_branch\n" + " bl debug_80C4774\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._209 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " bl CalculatePlayerPartyCount\n" + " bl CalculateEnemyPartyCount\n" + " ldr r0, ._196\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._196 + 4\n" + " str r0, [r1]\n" + " b ._209\n" + "._197:\n" + " .align 2, 0\n" + "._196:\n" + " .word gTasks\n" + " .word debug_80C4D14+1\n" + "._193:\n" + " mov r0, #0x88\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._198 @cond_branch\n" + " str r1, [sp]\n" + " mov r0, #0x0\n" + " mov r1, #0x10\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r0, ._200\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._200 + 4\n" + " str r0, [r1]\n" + " b ._209\n" + "._201:\n" + " .align 2, 0\n" + "._200:\n" + " .word gTasks\n" + " .word debug_80C4348+1\n" + "._198:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._203 @cond_branch\n" + " ldr r1, ._205\n" + " ldrb r0, [r1, #0x2]\n" + " cmp r0, #0\n" + " beq ._203 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0x2]\n" + " b ._204\n" + "._206:\n" + " .align 2, 0\n" + "._205:\n" + " .word unk_debug_ewram_0+0x20\n" + "._203:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._209 @cond_branch\n" + " ldr r5, ._210\n" + " ldrb r0, [r5, #0x2]\n" + " cmp r0, #0x4\n" + " bhi ._209 @cond_branch\n" + " add r1, r0, #0\n" + " mov r0, #0x64\n" + " mul r0, r0, r1\n" + " ldr r1, ._210 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " beq ._209 @cond_branch\n" + " ldrb r0, [r5, #0x2]\n" + " add r0, r0, #0x1\n" + " strb r0, [r5, #0x2]\n" + "._204:\n" + " ldr r1, ._210 + 8\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._210 + 12\n" + " str r1, [r0]\n" + "._209:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._211:\n" + " .align 2, 0\n" + "._210:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gEnemyParty\n" + " .word gTasks\n" + " .word debug_80C44EC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4694() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xffffffe4\n" + " ldr r1, ._213\n" + " mov r0, sp\n" + " mov r2, #0xd\n" + " bl memcpy\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xe\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " mov r0, sp\n" + " mov r1, #0x2\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " mov r4, #0x0\n" + " add r5, sp, #0x10\n" + "._212:\n" + " mov r0, #0x64\n" + " mul r0, r0, r4\n" + " ldr r1, ._213 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r5, #0\n" + " bl debug_80C405C\n" + " lsl r2, r4, #0x19\n" + " mov r0, #0xc0\n" + " lsl r0, r0, #0x12\n" + " add r2, r2, r0\n" + " lsr r2, r2, #0x18\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " bl MenuPrint\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x5\n" + " bls ._212 @cond_branch\n" + " add sp, sp, #0x1c\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._214:\n" + " .align 2, 0\n" + "._213:\n" + " .word gUnknown_Debug_083F81AD\n" + " .word gPlayerParty\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4704() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xffffffe4\n" + " ldr r1, ._216\n" + " mov r0, sp\n" + " mov r2, #0xd\n" + " bl memcpy\n" + " mov r0, #0xf\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " mov r0, sp\n" + " mov r1, #0x11\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " mov r4, #0x0\n" + " add r5, sp, #0x10\n" + "._215:\n" + " mov r0, #0x64\n" + " mul r0, r0, r4\n" + " ldr r1, ._216 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r5, #0\n" + " bl debug_80C405C\n" + " lsl r2, r4, #0x19\n" + " mov r0, #0xc0\n" + " lsl r0, r0, #0x12\n" + " add r2, r2, r0\n" + " lsr r2, r2, #0x18\n" + " add r0, r5, #0\n" + " mov r1, #0x11\n" + " bl MenuPrint\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x5\n" + " bls ._215 @cond_branch\n" + " add sp, sp, #0x1c\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._217:\n" + " .align 2, 0\n" + "._216:\n" + " .word gUnknown_Debug_083F81BA\n" + " .word gEnemyParty\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4774() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._221\n" + " ldrb r0, [r0, #0xc]\n" + " sub r0, r0, #0x1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x64\n" + " add r4, r0, #0\n" + " mul r4, r4, r1\n" + " ldr r0, ._221 + 4\n" + " add r0, r4, r0\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " beq ._219 @cond_branch\n" + " ldr r0, ._221 + 8\n" + " add r0, r4, r0\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " beq ._219 @cond_branch\n" + " mov r0, #0x1\n" + " b ._220\n" + "._222:\n" + " .align 2, 0\n" + "._221:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gPlayerParty\n" + " .word gEnemyParty\n" + "._219:\n" + " mov r0, #0x0\n" + "._220:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C47BC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xffffffc0\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " ldr r1, ._224\n" + " mov r0, sp\n" + " mov r2, #0xf\n" + " bl memcpy\n" + " add r4, sp, #0x10\n" + " ldr r1, ._224 + 4\n" + " add r0, r4, #0\n" + " mov r2, #0xd\n" + " bl memcpy\n" + " add r6, sp, #0x20\n" + " ldr r1, ._224 + 8\n" + " add r0, r6, #0\n" + " mov r2, #0xf\n" + " bl memcpy\n" + " add r5, sp, #0x30\n" + " ldr r1, ._224 + 12\n" + " add r0, r5, #0\n" + " mov r2, #0x10\n" + " bl memcpy\n" + " mov r0, #0x0\n" + " mov r1, #0x10\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r0, sp\n" + " mov r1, #0x1\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0x14\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xe\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " add r0, r6, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " mov r4, #0x0\n" + " ldr r6, ._224 + 16\n" + "._223:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r6\n" + " ldr r0, [r0]\n" + " lsl r2, r4, #0x19\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x12\n" + " add r2, r2, r1\n" + " lsr r2, r2, #0x18\n" + " mov r1, #0x2\n" + " bl MenuPrint\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x4\n" + " bls ._223 @cond_branch\n" + " mov r0, #0xf\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " add r0, r5, #0\n" + " mov r1, #0x11\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._224 + 20\n" + " ldrb r0, [r0, #0x4]\n" + " bl debug_80C4C44\n" + " ldr r1, ._224 + 24\n" + " lsl r0, r7, #0x2\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._224 + 28\n" + " str r1, [r0]\n" + " add sp, sp, #0x40\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._225:\n" + " .align 2, 0\n" + "._224:\n" + " .word gUnknown_Debug_083F81C7\n" + " .word gUnknown_Debug_083F81A0\n" + " .word gUnknown_Debug_083F81D6\n" + " .word gUnknown_Debug_083F81E5\n" + " .word gUnknown_Debug_083F8068\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gTasks\n" + " .word debug_80C48A0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C48A0() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r0, ._226\n" + " ldrb r0, [r0, #0x3]\n" + " lsl r0, r0, #0x19\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x12\n" + " add r0, r0, r1\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " str r1, [sp]\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r1, ._226 + 4\n" + " ldr r2, ._226 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " add r2, r2, #0x8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._226 + 12\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._226 + 16\n" + " str r1, [r0]\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._227:\n" + " .align 2, 0\n" + "._226:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word 0x4000042\n" + " .word 0x177\n" + " .word gTasks\n" + " .word debug_80C4900+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4900() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._230\n" + " ldrh r2, [r1, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " add r3, r1, #0\n" + " cmp r4, #0\n" + " beq ._228 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._230 + 4\n" + " bl SetMainCallback2\n" + " bl LoadPlayerParty\n" + " ldr r1, ._230 + 8\n" + " ldr r0, ._230 + 12\n" + " ldrb r0, [r0, #0xd]\n" + " strb r0, [r1, #0x8]\n" + " ldr r0, ._230 + 16\n" + " mov r1, #0x0\n" + " strh r4, [r0]\n" + " ldr r0, ._230 + 20\n" + " strb r1, [r0]\n" + " ldr r1, ._230 + 24\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._230 + 28\n" + " b ._229\n" + "._231:\n" + " .align 2, 0\n" + "._230:\n" + " .word gMain\n" + " .word debug_80C370C+1\n" + " .word gSaveBlock2\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gBattleTypeFlags\n" + " .word gUnknown_02023A14_50\n" + " .word gTasks\n" + " .word debug_80C373C+1\n" + "._228:\n" + " mov r0, #0x8\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._232 @cond_branch\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._233 @cond_branch\n" + "._232:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._236\n" + " ldr r3, ._236 + 4\n" + " ldr r2, ._236 + 8\n" + " ldrb r0, [r2, #0x3]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r3\n" + " ldrb r0, [r0, #0x4]\n" + " strh r0, [r1]\n" + " ldr r1, ._236 + 12\n" + " mov r0, #0x8\n" + " strb r0, [r1]\n" + " ldrb r0, [r2, #0x3]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r3\n" + " ldrb r0, [r0, #0x5]\n" + " strb r0, [r2, #0xc]\n" + " ldrb r0, [r2, #0x3]\n" + " sub r0, r0, #0x1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bhi ._234 @cond_branch\n" + " str r4, [sp]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r0, ._236 + 16\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._236 + 20\n" + " str r0, [r1]\n" + " b ._247\n" + "._237:\n" + " .align 2, 0\n" + "._236:\n" + " .word gBattleTypeFlags\n" + " .word gUnknown_Debug_083F8068\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_02023A14_50\n" + " .word gTasks\n" + " .word debug_80C4A60+1\n" + "._234:\n" + " ldr r0, ._239\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._239 + 4\n" + " str r0, [r1]\n" + " b ._247\n" + "._240:\n" + " .align 2, 0\n" + "._239:\n" + " .word gTasks\n" + " .word debug_80C4F48+1\n" + "._233:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._242 @cond_branch\n" + " ldr r1, ._244\n" + " ldrb r0, [r1, #0x3]\n" + " cmp r0, #0\n" + " beq ._242 @cond_branch\n" + " sub r0, r0, #0x1\n" + " b ._243\n" + "._245:\n" + " .align 2, 0\n" + "._244:\n" + " .word unk_debug_ewram_0+0x20\n" + "._242:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._247 @cond_branch\n" + " ldr r1, ._248\n" + " ldrb r0, [r1, #0x3]\n" + " cmp r0, #0x1\n" + " bhi ._247 @cond_branch\n" + " add r0, r0, #0x1\n" + "._243:\n" + " strb r0, [r1, #0x3]\n" + " ldr r1, ._248 + 4\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._248 + 8\n" + "._229:\n" + " str r1, [r0]\n" + "._247:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._249:\n" + " .align 2, 0\n" + "._248:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gTasks\n" + " .word debug_80C48A0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4A60() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r0, ._250\n" + " ldrb r0, [r0, #0x5]\n" + " lsl r0, r0, #0x19\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x12\n" + " add r0, r0, r1\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " str r1, [sp]\n" + " mov r1, #0x10\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r1, ._250 + 4\n" + " ldr r2, ._250 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._250 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._250 + 16\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._250 + 20\n" + " str r1, [r0]\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._251:\n" + " .align 2, 0\n" + "._250:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word 0x4000042\n" + " .word 0x79ef\n" + " .word 0x17f\n" + " .word gTasks\n" + " .word debug_80C4AC4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4AC4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " ldr r7, ._255\n" + " ldrb r0, [r7, #0x4]\n" + " mov ip, r0\n" + " ldrb r5, [r7, #0x5]\n" + " mov r1, ip\n" + " add r0, r1, r5\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " ldr r2, ._255 + 4\n" + " mov r8, r2\n" + " ldrh r2, [r2, #0x2e]\n" + " mov r3, #0x1\n" + " and r3, r3, r2\n" + " add r4, r7, #0\n" + " cmp r3, #0\n" + " beq ._252 @cond_branch\n" + " ldr r0, ._255 + 8\n" + " lsl r1, r1, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r1, [r1]\n" + " ldr r3, ._255 + 12\n" + " ldr r2, [r3]\n" + " add r0, r2, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._253 @cond_branch\n" + " ldr r0, ._255 + 16\n" + " eor r1, r1, r0\n" + " and r2, r2, r1\n" + " b ._254\n" + "._256:\n" + " .align 2, 0\n" + "._255:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gMain\n" + " .word gUnknown_Debug_083F80D8\n" + " .word byte_3005E30\n" + " .word 0xffff\n" + "._253:\n" + " orr r2, r2, r1\n" + "._254:\n" + " str r2, [r3]\n" + " ldrb r0, [r4, #0x4]\n" + " bl debug_80C4C44\n" + " ldr r1, ._258\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._258 + 4\n" + " str r1, [r0]\n" + " b ._274\n" + "._259:\n" + " .align 2, 0\n" + "._258:\n" + " .word gTasks\n" + " .word debug_80C4A60+1\n" + "._252:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0\n" + " beq ._260 @cond_branch\n" + " str r3, [sp]\n" + " mov r0, #0x0\n" + " mov r1, #0x10\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r0, ._262\n" + " lsl r1, r6, #0x2\n" + " add r1, r1, r6\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._262 + 4\n" + " b ._261\n" + "._263:\n" + " .align 2, 0\n" + "._262:\n" + " .word gTasks\n" + " .word debug_80C48A0+1\n" + "._260:\n" + " mov r0, #0x8\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._264 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._266\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x3\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._266 + 4\n" + " ldrb r2, [r1, #0x1]\n" + " mov r0, #0x11\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " strb r0, [r1, #0x1]\n" + " mov r0, #0xac\n" + " strb r0, [r1, #0x2]\n" + " mov r0, #0xff\n" + " strb r0, [r1, #0x3]\n" + " strb r4, [r1, #0x9]\n" + " strb r4, [r1, #0xa]\n" + " strb r4, [r1, #0xb]\n" + " strb r4, [r1, #0xc]\n" + " ldr r1, ._266 + 8\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._266 + 12\n" + " str r1, [r0]\n" + " b ._274\n" + "._267:\n" + " .align 2, 0\n" + "._266:\n" + " .word gTrainerBattleOpponent\n" + " .word +0x2017000\n" + " .word gTasks\n" + " .word debug_80C4F48+1\n" + "._264:\n" + " mov r0, r8\n" + " ldrh r1, [r0, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._268 @cond_branch\n" + " lsl r0, r5, #0x18\n" + " cmp r0, #0\n" + " beq ._269 @cond_branch\n" + " sub r0, r5, #1\n" + " strb r0, [r7, #0x5]\n" + " b ._277\n" + "._269:\n" + " mov r1, ip\n" + " lsl r0, r1, #0x18\n" + " cmp r0, #0\n" + " beq ._277 @cond_branch\n" + " mov r0, ip\n" + " sub r0, r0, #0x1\n" + " b ._272\n" + "._268:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._274 @cond_branch\n" + " lsl r0, r5, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x8\n" + " bhi ._274 @cond_branch\n" + " cmp r0, #0x4\n" + " bhi ._275 @cond_branch\n" + " add r0, r5, #1\n" + " strb r0, [r7, #0x5]\n" + " b ._277\n" + "._275:\n" + " mov r2, ip\n" + " lsl r0, r2, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x3\n" + " bhi ._277 @cond_branch\n" + " mov r0, ip\n" + " add r0, r0, #0x1\n" + "._272:\n" + " strb r0, [r7, #0x4]\n" + " ldrb r0, [r7, #0x4]\n" + " bl debug_80C4C44\n" + "._277:\n" + " ldr r0, ._278\n" + " lsl r1, r6, #0x2\n" + " add r1, r1, r6\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._278 + 4\n" + "._261:\n" + " str r0, [r1]\n" + "._274:\n" + " add sp, sp, #0x4\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._279:\n" + " .align 2, 0\n" + "._278:\n" + " .word gTasks\n" + " .word debug_80C4A60+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4C44() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffff0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov sl, r0\n" + " mov r2, #0x0\n" + " mov r5, sp\n" + "._290:\n" + " mov r0, sl\n" + " add r6, r2, r0\n" + " add r4, r6, #0\n" + " add r1, r2, #1\n" + " mov r8, r1\n" + " cmp r4, #0x9\n" + " bgt ._280 @cond_branch\n" + " mov r3, #0x0\n" + " ldr r1, ._288\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " ldrb r0, [r0]\n" + " ldr r7, ._288 + 4\n" + " mov r9, r7\n" + " lsl r2, r2, #0x1\n" + " mov ip, r2\n" + " cmp r0, #0xff\n" + " beq ._282 @cond_branch\n" + " add r7, r1, #0\n" + "._283:\n" + " add r0, r3, #3\n" + " mov r1, sp\n" + " add r2, r1, r0\n" + " lsl r1, r6, #0x3\n" + " add r1, r1, r7\n" + " ldr r0, [r1]\n" + " add r0, r0, r3\n" + " ldrb r0, [r0]\n" + " strb r0, [r2]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " ldr r0, [r1]\n" + " add r0, r0, r3\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._282 @cond_branch\n" + " cmp r3, #0xb\n" + " bls ._283 @cond_branch\n" + "._282:\n" + " cmp r3, #0xb\n" + " bhi ._284 @cond_branch\n" + " mov r1, #0x0\n" + "._285:\n" + " add r0, r3, #3\n" + " add r0, r0, sp\n" + " strb r1, [r0]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " cmp r3, #0xb\n" + " bls ._285 @cond_branch\n" + "._284:\n" + " mov r0, #0xff\n" + " strb r0, [r5, #0xe]\n" + " mov r0, #0xfc\n" + " strb r0, [r5]\n" + " mov r2, #0x1\n" + " strb r2, [r5, #0x1]\n" + " add r1, r2, #0\n" + " LSL r1, r4\n" + " mov r3, r9\n" + " ldr r0, [r3]\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._286 @cond_branch\n" + " mov r0, #0x3\n" + " strb r0, [r5, #0x2]\n" + " b ._287\n" + "._289:\n" + " .align 2, 0\n" + "._288:\n" + " .word gUnknown_Debug_083F80D8\n" + " .word byte_3005E30\n" + "._286:\n" + " strb r2, [r5, #0x2]\n" + "._287:\n" + " mov r2, ip\n" + " add r2, r2, #0x3\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r0, sp\n" + " mov r1, #0x11\n" + " bl MenuPrint\n" + "._280:\n" + " mov r7, r8\n" + " lsl r0, r7, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x5\n" + " bls ._290 @cond_branch\n" + " add sp, sp, #0x10\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4D14() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xffffffd0\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r1, ._291\n" + " mov r0, sp\n" + " mov r2, #0xf\n" + " bl memcpy\n" + " add r5, sp, #0x10\n" + " ldr r1, ._291 + 4\n" + " add r0, r5, #0\n" + " mov r2, #0xd\n" + " bl memcpy\n" + " add r6, sp, #0x20\n" + " ldr r1, ._291 + 8\n" + " add r0, r6, #0\n" + " mov r2, #0xf\n" + " bl memcpy\n" + " mov r0, #0x0\n" + " mov r1, #0x10\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r0, sp\n" + " mov r1, #0x1\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " add r0, r5, #0\n" + " mov r1, #0x14\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xe\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " add r0, r6, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._291 + 12\n" + " ldrb r0, [r0, #0x6]\n" + " bl debug_80C4F00\n" + " mov r0, #0xf\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r1, ._291 + 16\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._291 + 20\n" + " str r1, [r0]\n" + " add sp, sp, #0x30\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._292:\n" + " .align 2, 0\n" + "._291:\n" + " .word gUnknown_Debug_083F81C7\n" + " .word gUnknown_Debug_083F81F5\n" + " .word gUnknown_Debug_083F8202\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gTasks\n" + " .word debug_80C4DB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4DB8() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r0, ._293\n" + " ldrb r0, [r0, #0x7]\n" + " lsl r0, r0, #0x19\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x12\n" + " add r0, r0, r1\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " str r1, [sp]\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r1, ._293 + 4\n" + " ldr r2, ._293 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " add r2, r2, #0x8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._293 + 12\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._293 + 16\n" + " str r1, [r0]\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._294:\n" + " .align 2, 0\n" + "._293:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word 0x4000042\n" + " .word 0x177\n" + " .word gTasks\n" + " .word debug_80C4E18+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4E18() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r5, ._297\n" + " ldrb r3, [r5, #0x6]\n" + " ldrb r2, [r5, #0x7]\n" + " add r0, r3, r2\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " ldr r7, ._297 + 4\n" + " ldrh r1, [r7, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._295 @cond_branch\n" + " ldr r0, ._297 + 8\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._297 + 12\n" + " b ._296\n" + "._298:\n" + " .align 2, 0\n" + "._297:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gMain\n" + " .word gTasks\n" + " .word debug_80C42B8+1\n" + "._295:\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._299 @cond_branch\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._300 @cond_branch\n" + "._299:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r2, ._302\n" + " ldr r1, ._302 + 4\n" + " lsl r0, r6, #0x3\n" + " add r0, r0, r1\n" + " ldrb r0, [r0, #0x4]\n" + " strb r0, [r2]\n" + " ldr r1, ._302 + 8\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._302 + 12\n" + " str r1, [r0]\n" + " b ._310\n" + "._303:\n" + " .align 2, 0\n" + "._302:\n" + " .word gBattleTerrain\n" + " .word gUnknown_Debug_083F814C\n" + " .word gTasks\n" + " .word debug_80C5158+1\n" + "._300:\n" + " ldrh r1, [r7, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._304 @cond_branch\n" + " lsl r0, r2, #0x18\n" + " cmp r0, #0\n" + " beq ._305 @cond_branch\n" + " sub r0, r2, #1\n" + " strb r0, [r5, #0x7]\n" + " b ._313\n" + "._305:\n" + " lsl r0, r3, #0x18\n" + " cmp r0, #0\n" + " beq ._313 @cond_branch\n" + " sub r0, r3, #1\n" + " b ._308\n" + "._304:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._310 @cond_branch\n" + " lsl r0, r2, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x7\n" + " bhi ._310 @cond_branch\n" + " cmp r0, #0x4\n" + " bhi ._311 @cond_branch\n" + " add r0, r2, #1\n" + " strb r0, [r5, #0x7]\n" + " b ._313\n" + "._311:\n" + " lsl r0, r3, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x2\n" + " bhi ._313 @cond_branch\n" + " add r0, r3, #1\n" + "._308:\n" + " strb r0, [r5, #0x6]\n" + " ldrb r0, [r5, #0x6]\n" + " bl debug_80C4F00\n" + "._313:\n" + " ldr r0, ._314\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._314 + 4\n" + "._296:\n" + " str r0, [r1]\n" + "._310:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._315:\n" + " .align 2, 0\n" + "._314:\n" + " .word gTasks\n" + " .word debug_80C4DB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4F00() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " mov r0, #0x1\n" + " mov r1, #0x3\n" + " mov r2, #0xd\n" + " mov r3, #0xe\n" + " bl MenuFillWindowRectWithBlankTile\n" + " mov r4, #0x0\n" + " ldr r6, ._318\n" + "._317:\n" + " cmp r4, #0x8\n" + " bhi ._316 @cond_branch\n" + " add r0, r4, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r6\n" + " ldr r0, [r0]\n" + " lsl r2, r4, #0x19\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x12\n" + " add r2, r2, r1\n" + " lsr r2, r2, #0x18\n" + " mov r1, #0x2\n" + " bl MenuPrint\n" + "._316:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x5\n" + " bls ._317 @cond_branch\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._319:\n" + " .align 2, 0\n" + "._318:\n" + " .word gUnknown_Debug_083F814C\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C4F48() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6}\n" + " add sp, sp, #0xffffffc4\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r1, ._320\n" + " mov r0, sp\n" + " mov r2, #0x11\n" + " bl memcpy\n" + " add r6, sp, #0x14\n" + " ldr r1, ._320 + 4\n" + " add r0, r6, #0\n" + " mov r2, #0xd\n" + " bl memcpy\n" + " add r5, sp, #0x24\n" + " ldr r1, ._320 + 8\n" + " add r0, r5, #0\n" + " mov r2, #0xd\n" + " bl memcpy\n" + " add r0, sp, #0x34\n" + " mov r9, r0\n" + " ldr r1, ._320 + 12\n" + " mov r2, #0x4\n" + " bl memcpy\n" + " add r0, sp, #0x38\n" + " mov r8, r0\n" + " ldr r1, ._320 + 16\n" + " mov r2, #0x4\n" + " bl memcpy\n" + " mov r0, #0x0\n" + " mov r1, #0x10\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r0, sp\n" + " mov r1, #0x1\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " add r0, r6, #0\n" + " mov r1, #0x14\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xe\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " mov r0, #0x1\n" + " mov r1, #0x3\n" + " mov r2, #0xd\n" + " mov r3, #0xe\n" + " bl MenuFillWindowRectWithBlankTile\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " mov r0, r9\n" + " mov r1, #0x2\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " mov r0, r8\n" + " mov r1, #0x2\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, #0xf\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r1, ._320 + 20\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._320 + 24\n" + " str r1, [r0]\n" + " add sp, sp, #0x3c\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._321:\n" + " .align 2, 0\n" + "._320:\n" + " .word gUnknown_Debug_083F8211\n" + " .word gUnknown_Debug_083F81A0\n" + " .word gUnknown_Debug_083F8222\n" + " .word gUnknown_Debug_083F822F\n" + " .word gUnknown_Debug_083F8233\n" + " .word gTasks\n" + " .word debug_80C5038+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5038() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r0, ._322\n" + " ldrb r0, [r0, #0x8]\n" + " lsl r0, r0, #0x19\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x12\n" + " add r0, r0, r1\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " str r1, [sp]\n" + " mov r2, #0x1\n" + " mov r3, #0xe\n" + " bl debug_80C38E4\n" + " ldr r1, ._322 + 4\n" + " ldr r2, ._322 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " add r2, r2, #0x8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._322 + 12\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._322 + 16\n" + " str r1, [r0]\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._323:\n" + " .align 2, 0\n" + "._322:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word 0x4000042\n" + " .word 0x177\n" + " .word gTasks\n" + " .word debug_80C5098+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5098() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r1, ._326\n" + " ldrh r2, [r1, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " add r3, r1, #0\n" + " cmp r0, #0\n" + " beq ._324 @cond_branch\n" + " ldr r0, ._326 + 4\n" + " lsl r1, r4, #0x2\n" + " add r1, r1, r4\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._326 + 8\n" + " str r0, [r1]\n" + " b ._339\n" + "._327:\n" + " .align 2, 0\n" + "._326:\n" + " .word gMain\n" + " .word gTasks\n" + " .word debug_80C47BC+1\n" + "._324:\n" + " mov r0, #0x8\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._328 @cond_branch\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._329 @cond_branch\n" + "._328:\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._331\n" + " ldr r0, ._331 + 4\n" + " ldrb r0, [r0, #0x8]\n" + " strb r0, [r1, #0x8]\n" + " ldr r1, ._331 + 8\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._331 + 12\n" + " b ._330\n" + "._332:\n" + " .align 2, 0\n" + "._331:\n" + " .word gSaveBlock2\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gTasks\n" + " .word debug_80C42B8+1\n" + "._329:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._334 @cond_branch\n" + " ldr r1, ._336\n" + " ldrb r0, [r1, #0x8]\n" + " cmp r0, #0\n" + " beq ._334 @cond_branch\n" + " sub r0, r0, #0x1\n" + " b ._335\n" + "._337:\n" + " .align 2, 0\n" + "._336:\n" + " .word unk_debug_ewram_0+0x20\n" + "._334:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._339 @cond_branch\n" + " ldr r1, ._340\n" + " ldrb r0, [r1, #0x8]\n" + " cmp r0, #0\n" + " bne ._339 @cond_branch\n" + " add r0, r0, #0x1\n" + "._335:\n" + " strb r0, [r1, #0x8]\n" + " ldr r1, ._340 + 4\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._340 + 8\n" + "._330:\n" + " str r1, [r0]\n" + "._339:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._341:\n" + " .align 2, 0\n" + "._340:\n" + " .word unk_debug_ewram_0+0x20\n" + " .word gTasks\n" + " .word debug_80C5038+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5158() +{ + asm( + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._342\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldr r0, ._342 + 4\n" + " str r0, [r1]\n" + " bx lr\n" + "._343:\n" + " .align 2, 0\n" + "._342:\n" + " .word gTasks\n" + " .word debug_80C5174+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5174() +{ + asm( + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._344\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldr r0, ._344 + 4\n" + " str r0, [r1]\n" + " bx lr\n" + "._345:\n" + " .align 2, 0\n" + "._344:\n" + " .word gTasks\n" + " .word debug_80C5190+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5190() +{ + asm( + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._346\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldr r0, ._346 + 4\n" + " str r0, [r1]\n" + " bx lr\n" + "._347:\n" + " .align 2, 0\n" + "._346:\n" + " .word gTasks\n" + " .word debug_80C51AC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C51AC() +{ + asm( + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._348\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldr r0, ._348 + 4\n" + " str r0, [r1]\n" + " bx lr\n" + "._349:\n" + " .align 2, 0\n" + "._348:\n" + " .word gTasks\n" + " .word debug_80C51C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C51C8() +{ + asm( + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._350\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldr r0, ._350 + 4\n" + " str r0, [r1]\n" + " bx lr\n" + "._351:\n" + " .align 2, 0\n" + "._350:\n" + " .word gTasks\n" + " .word debug_80C51E4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C51E4() +{ + asm( + " push {lr}\n" + " bl sub_80408BC\n" + " ldr r0, ._352\n" + " ldr r1, ._352 + 4\n" + " str r1, [r0, #0x8]\n" + " ldr r0, ._352 + 8\n" + " bl SetMainCallback2\n" + " pop {r0}\n" + " bx r0\n" + "._353:\n" + " .align 2, 0\n" + "._352:\n" + " .word gMain\n" + " .word debug_80C41A8+1\n" + " .word unref_sub_800D684+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5208() +{ + asm( + " push {r4, r5, r6, lr}\n" + " ldr r1, ._355\n" + " ldr r0, ._355 + 4\n" + " str r0, [r1]\n" + " mov r3, #0x0\n" + " add r6, r1, #0\n" + " ldr r4, ._355 + 8\n" + " add r5, r6, #0\n" + " mov r2, #0x0\n" + "._354:\n" + " ldr r0, [r5]\n" + " lsl r1, r3, #0x2\n" + " add r0, r0, #0x64\n" + " add r0, r0, r1\n" + " str r2, [r0]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " cmp r3, #0x3f\n" + " bls ._354 @cond_branch\n" + " ldr r2, [r6]\n" + " mov r0, #0xfc\n" + " str r0, [r2, #0x64]\n" + " ldrb r1, [r4, #0xa]\n" + " ldrb r0, [r4, #0xb]\n" + " lsl r0, r0, #0x8\n" + " orr r1, r1, r0\n" + " ldrb r0, [r4, #0xc]\n" + " lsl r0, r0, #0x10\n" + " orr r1, r1, r0\n" + " ldrb r0, [r4, #0xd]\n" + " lsl r0, r0, #0x18\n" + " orr r1, r1, r0\n" + " str r1, [r2, #0x70]\n" + " bl Random\n" + " add r4, r0, #0\n" + " bl Random\n" + " ldr r1, [r6]\n" + " lsl r4, r4, #0x10\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " orr r4, r4, r0\n" + " str r4, [r1, #0x74]\n" + " mov r0, #0x1\n" + " str r0, [r1, #0x68]\n" + " str r0, [r1, #0x6c]\n" + " bl debug_80C5C94\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._356:\n" + " .align 2, 0\n" + "._355:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word +0x2018000\n" + " .word gSaveBlock2\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C527C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add r6, r0, #0\n" + " mov r5, #0x0\n" + " ldr r7, ._359\n" + "._361:\n" + " mov r0, #0x64\n" + " add r1, r5, #0\n" + " mul r1, r1, r0\n" + " ldr r0, ._359 + 4\n" + " add r4, r1, r0\n" + " add r0, r4, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " cmp r0, #0\n" + " bne ._357 @cond_branch\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " mov r2, #0x64\n" + " bl memcpy\n" + " add r0, r5, #1\n" + " strb r0, [r7]\n" + " mov r0, #0x0\n" + " b ._358\n" + "._360:\n" + " .align 2, 0\n" + "._359:\n" + " .word gPlayerPartyCount\n" + " .word gPlayerParty\n" + "._357:\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x5\n" + " bls ._361 @cond_branch\n" + " ldr r0, ._362\n" + " ldr r0, [r0]\n" + " bl SendMonToPC\n" + " mov r0, #0x1\n" + "._358:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._363:\n" + " .align 2, 0\n" + "._362:\n" + " .word unk_debug_ewram_0+0x30\n" + "\n" + ); +} + +__attribute__((naked)) +void InitCreatePokemon() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xffffffd4\n" + " ldr r1, ._364\n" + " add r0, sp, #0x4\n" + " mov r2, #0x25\n" + " bl memcpy\n" + " bl debug_80C35DC\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r4, #0x0\n" + " str r4, [sp]\n" + " mov r1, #0x0\n" + " mov r2, #0x10\n" + " mov r3, #0x0\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._364 + 4\n" + " mov r5, #0x0\n" + " strh r4, [r0]\n" + " add r0, r0, #0x2\n" + " strh r4, [r0]\n" + " add r0, r0, #0x2\n" + " strh r4, [r0]\n" + " ldr r3, ._364 + 8\n" + " ldrh r2, [r3]\n" + " strh r4, [r3]\n" + " ldr r4, ._364 + 12\n" + " ldrh r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strh r0, [r4]\n" + " strh r2, [r3]\n" + " ldr r2, ._364 + 16\n" + " ldrh r0, [r2]\n" + " mov r1, #0x8\n" + " orr r0, r0, r1\n" + " strh r0, [r2]\n" + " ldr r0, ._364 + 20\n" + " bl SetVBlankCallback\n" + " ldr r0, ._364 + 24\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x3\n" + " bl MenuDrawTextWindow\n" + " add r0, sp, #0x4\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " mov r1, #0x80\n" + " lsl r1, r1, #0x13\n" + " mov r2, #0x8a\n" + " lsl r2, r2, #0x5\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r0, ._364 + 28\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " bl debug_80C5208\n" + " ldr r1, ._364 + 32\n" + " ldr r0, [r1]\n" + " mov r2, #0xb4\n" + " lsl r2, r2, #0x1\n" + " add r0, r0, r2\n" + " strb r5, [r0]\n" + " ldr r0, [r1]\n" + " ldr r1, ._364 + 36\n" + " add r0, r0, r1\n" + " strb r5, [r0]\n" + " add sp, sp, #0x2c\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._365:\n" + " .align 2, 0\n" + "._364:\n" + " .word gUnknown_Debug_083F8733\n" + " .word 0x4000050\n" + " .word 0x4000208\n" + " .word 0x4000200\n" + " .word 0x4000004\n" + " .word debug_80C3758+1\n" + " .word debug_80C370C+1\n" + " .word debug_80C53A4+1\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C53A4() +{ + asm( + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._366\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldr r0, ._366 + 4\n" + " str r0, [r1]\n" + " bx lr\n" + "._367:\n" + " .align 2, 0\n" + "._366:\n" + " .word gTasks\n" + " .word debug_80C53C0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C53C0() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl debug_80C6384\n" + " mov r0, #0x0\n" + " bl debug_80C627C\n" + " ldr r1, ._368\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._368 + 4\n" + " str r1, [r0]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._369:\n" + " .align 2, 0\n" + "._368:\n" + " .word gTasks\n" + " .word debug_80C53F0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C53F0() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r0, ._372\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r2, #0x1\n" + " and r2, r2, r1\n" + " add r4, r0, #0\n" + " cmp r2, #0\n" + " beq ._370 @cond_branch\n" + " ldr r0, ._372 + 4\n" + " ldr r3, [r0]\n" + " mov r0, #0xb2\n" + " lsl r0, r0, #0x1\n" + " add r2, r3, r0\n" + " ldr r1, ._372 + 8\n" + " mov r4, #0xb4\n" + " lsl r4, r4, #0x1\n" + " add r0, r3, r4\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r6, ._372 + 12\n" + " add r1, r3, r6\n" + " ldrb r1, [r1]\n" + " ldr r0, [r0]\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " lsl r1, r1, #0x2\n" + " add r0, r3, #0\n" + " add r0, r0, #0x64\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " str r0, [r2]\n" + " mov r0, #0xb5\n" + " lsl r0, r0, #0x1\n" + " add r1, r3, r0\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl debug_80C643C\n" + " ldr r1, ._372 + 16\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._372 + 20\n" + " b ._375\n" + "._373:\n" + " .align 2, 0\n" + "._372:\n" + " .word gMain\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_083F8698\n" + " .word 0x169\n" + " .word gTasks\n" + " .word debug_80C55E4+1\n" + "._370:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._374 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " str r2, [sp]\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._376\n" + " bl SetMainCallback2\n" + " ldr r1, ._376 + 4\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._376 + 8\n" + " b ._375\n" + "._377:\n" + " .align 2, 0\n" + "._376:\n" + " .word debug_80C370C+1\n" + " .word gTasks\n" + " .word debug_80C373C+1\n" + "._374:\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._378 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " bl debug_80C5FFC\n" + " ldr r0, ._381\n" + " ldr r0, [r0]\n" + " bl debug_80C527C\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " mov r0, #0x3\n" + " mov r1, #0x8\n" + " mov r2, #0x1a\n" + " mov r3, #0xb\n" + " bl MenuDrawTextWindow\n" + " cmp r4, #0\n" + " beq ._379 @cond_branch\n" + " ldr r0, ._381 + 4\n" + " mov r1, #0x4\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " b ._380\n" + "._382:\n" + " .align 2, 0\n" + "._381:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_083F872A\n" + "._379:\n" + " ldr r0, ._384\n" + " mov r1, #0x4\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + "._380:\n" + " ldr r0, ._384 + 4\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._384 + 8\n" + " str r0, [r1]\n" + " b ._400\n" + "._385:\n" + " .align 2, 0\n" + "._384:\n" + " .word gUnknown_Debug_083F8720\n" + " .word gTasks\n" + " .word debug_80C5708+1\n" + "._378:\n" + " mov r0, #0x4\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._386 @cond_branch\n" + " ldr r0, ._388\n" + " ldr r0, [r0]\n" + " ldr r4, [r0, #0x64]\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " bl GetNationalPokedexFlag\n" + " add r0, r4, #0\n" + " mov r1, #0x3\n" + " bl GetNationalPokedexFlag\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " b ._400\n" + "._389:\n" + " .align 2, 0\n" + "._388:\n" + " .word unk_debug_ewram_0+0x30\n" + "._386:\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._390 @cond_branch\n" + " mov r0, #0x2\n" + " bl debug_80C627C\n" + " b ._400\n" + "._390:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " cmp r3, #0\n" + " beq ._392 @cond_branch\n" + " mov r0, #0x1\n" + " bl debug_80C627C\n" + " b ._400\n" + "._392:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._395 @cond_branch\n" + " ldr r2, ._397\n" + " ldr r0, [r2]\n" + " mov r6, #0xb4\n" + " lsl r6, r6, #0x1\n" + " add r1, r0, r6\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._395 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, [r2]\n" + " ldr r1, ._397 + 4\n" + " add r0, r0, r1\n" + " strb r3, [r0]\n" + " b ._396\n" + "._398:\n" + " .align 2, 0\n" + "._397:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + "._395:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._400 @cond_branch\n" + " ldr r3, ._401\n" + " ldr r0, [r3]\n" + " mov r4, #0xb4\n" + " lsl r4, r4, #0x1\n" + " add r2, r0, r4\n" + " ldrb r0, [r2]\n" + " cmp r0, #0x4\n" + " bhi ._400 @cond_branch\n" + " add r0, r0, #0x1\n" + " mov r1, #0x0\n" + " strb r0, [r2]\n" + " ldr r0, [r3]\n" + " ldr r6, ._401 + 4\n" + " add r0, r0, r6\n" + " strb r1, [r0]\n" + "._396:\n" + " ldr r1, ._401 + 8\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._401 + 12\n" + "._375:\n" + " str r1, [r0]\n" + "._400:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._402:\n" + " .align 2, 0\n" + "._401:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + " .word gTasks\n" + " .word debug_80C53C0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C55E4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " add r6, r3, #0\n" + " ldr r1, ._405\n" + " ldr r2, ._405 + 4\n" + " ldr r0, [r2]\n" + " mov ip, r0\n" + " mov r0, #0xb4\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, ip\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._405 + 8\n" + " add r1, r1, ip\n" + " ldrb r1, [r1]\n" + " ldr r0, [r0]\n" + " add r0, r0, r1\n" + " ldrb r5, [r0]\n" + " add r7, r5, #0\n" + " ldr r1, ._405 + 12\n" + " ldrh r4, [r1, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r4\n" + " mov r8, r2\n" + " add r2, r1, #0\n" + " cmp r0, #0\n" + " beq ._403 @cond_branch\n" + " ldr r0, ._405 + 16\n" + " lsl r1, r3, #0x2\n" + " add r1, r1, r3\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._405 + 20\n" + " str r0, [r1]\n" + " b ._422\n" + "._406:\n" + " .align 2, 0\n" + "._405:\n" + " .word gUnknown_Debug_083F8698\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + " .word gMain\n" + " .word gTasks\n" + " .word debug_80C53C0+1\n" + "._403:\n" + " mov r0, #0x2\n" + " and r0, r0, r4\n" + " cmp r0, #0\n" + " beq ._407 @cond_branch\n" + " lsl r1, r5, #0x2\n" + " mov r0, ip\n" + " add r0, r0, #0x64\n" + " add r0, r0, r1\n" + " mov r1, #0xb2\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, ip\n" + " ldr r1, [r1]\n" + " str r1, [r0]\n" + " ldr r1, ._409\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._409 + 4\n" + " str r1, [r0]\n" + " b ._422\n" + "._410:\n" + " .align 2, 0\n" + "._409:\n" + " .word gTasks\n" + " .word debug_80C53C0+1\n" + "._407:\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._411 @cond_branch\n" + " mov r0, #0x1\n" + " b ._412\n" + "._411:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._413 @cond_branch\n" + " mov r0, #0x2\n" + "._412:\n" + " bl debug_80C6544\n" + " bl debug_80C643C\n" + " b ._422\n" + "._413:\n" + " ldr r0, ._419\n" + " lsl r1, r7, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r1, [r1]\n" + " ldrb r0, [r1, #0x9]\n" + " cmp r0, #0xff\n" + " beq ._422 @cond_branch\n" + " mov r0, #0x20\n" + " and r0, r0, r4\n" + " cmp r0, #0\n" + " beq ._417 @cond_branch\n" + " mov r0, #0xb5\n" + " lsl r0, r0, #0x1\n" + " add ip, ip, r0\n" + " mov r0, ip\n" + " ldrb r3, [r0]\n" + " ldrb r0, [r1, #0x9]\n" + " sub r0, r0, #0x1\n" + " cmp r3, r0\n" + " bge ._417 @cond_branch\n" + " add r0, r3, #1\n" + " mov r1, ip\n" + " strb r0, [r1]\n" + " bl debug_80C643C\n" + " b ._422\n" + "._420:\n" + " .align 2, 0\n" + "._419:\n" + " .word gUnknown_Debug_083F8554\n" + "._417:\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._422 @cond_branch\n" + " mov r2, r8\n" + " ldr r0, [r2]\n" + " mov r2, #0xb5\n" + " lsl r2, r2, #0x1\n" + " add r1, r0, r2\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._422 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " bl debug_80C643C\n" + "._422:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5708() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " ldr r0, ._424\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._423 @cond_branch\n" + " ldr r0, ._424 + 4\n" + " lsl r1, r2, #0x2\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._424 + 8\n" + " str r0, [r1]\n" + "._423:\n" + " pop {r0}\n" + " bx r0\n" + "._425:\n" + " .align 2, 0\n" + "._424:\n" + " .word gMain\n" + " .word gTasks\n" + " .word debug_80C53C0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5738() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add r6, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r4, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r8, r2\n" + " cmp r4, #0xfe\n" + " bne ._426 @cond_branch\n" + " ldr r1, ._428\n" + " mov r2, #0x7\n" + " bl debug_80C689C\n" + " add r0, r6, #7\n" + " ldr r7, ._428 + 4\n" + " ldr r1, [r7]\n" + " add r1, r1, #0xf0\n" + " ldr r1, [r1]\n" + " mov r2, #0x3\n" + " mov r3, #0x1\n" + " bl debug_80C6678\n" + " mov r4, #0x0\n" + " strb r4, [r6, #0x13]\n" + " strb r4, [r6, #0x14]\n" + " add r0, r6, #0\n" + " add r0, r0, #0x15\n" + " ldr r1, ._428 + 8\n" + " mov r2, #0x7\n" + " bl debug_80C689C\n" + " add r0, r6, #0\n" + " add r0, r0, #0x1c\n" + " ldr r1, [r7]\n" + " add r1, r1, #0xf4\n" + " ldr r1, [r1]\n" + " mov r2, #0x3\n" + " mov r3, #0x1\n" + " bl debug_80C6678\n" + " add r0, r6, #0\n" + " add r0, r0, #0x28\n" + " strb r4, [r0]\n" + " add r0, r0, #0x1\n" + " strb r4, [r0]\n" + " add r0, r0, #0x1\n" + " ldr r1, ._428 + 12\n" + " mov r2, #0x9\n" + " bl debug_80C689C\n" + " add r0, r6, #0\n" + " add r0, r0, #0x31\n" + " ldr r1, [r7]\n" + " add r1, r1, #0xf8\n" + "._431:\n" + " ldr r1, [r1]\n" + " mov r2, #0x3\n" + " mov r3, #0x1\n" + " bl debug_80C6678\n" + " b ._517\n" + "._429:\n" + " .align 2, 0\n" + "._428:\n" + " .word gUnknown_Debug_083F850A\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_083F8514\n" + " .word gUnknown_Debug_083F851C\n" + "._426:\n" + " cmp r4, #0xfd\n" + " bne ._430 @cond_branch\n" + " ldr r1, ._432\n" + " add r0, r6, #0\n" + " mov r2, #0x9\n" + " bl debug_80C689C\n" + " add r0, r6, #0\n" + " add r0, r0, #0x9\n" + " ldr r7, ._432 + 4\n" + " ldr r1, [r7]\n" + " add r1, r1, #0xfc\n" + " ldr r1, [r1]\n" + " mov r2, #0x3\n" + " mov r3, #0x1\n" + " bl debug_80C6678\n" + " mov r4, #0x0\n" + " strb r4, [r6, #0x15]\n" + " strb r4, [r6, #0x16]\n" + " add r0, r6, #0\n" + " add r0, r0, #0x17\n" + " ldr r1, ._432 + 8\n" + " mov r2, #0x9\n" + " bl debug_80C689C\n" + " add r0, r6, #0\n" + " add r0, r0, #0x20\n" + " ldr r1, [r7]\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r1, r1, r2\n" + " ldr r1, [r1]\n" + " mov r2, #0x3\n" + " mov r3, #0x1\n" + " bl debug_80C6678\n" + " add r0, r6, #0\n" + " add r0, r0, #0x2c\n" + " strb r4, [r0]\n" + " add r0, r0, #0x1\n" + " strb r4, [r0]\n" + " add r0, r0, #0x1\n" + " ldr r1, ._432 + 12\n" + " mov r2, #0x9\n" + " bl debug_80C689C\n" + " add r0, r6, #0\n" + " add r0, r0, #0x37\n" + " ldr r1, [r7]\n" + " mov r3, #0x82\n" + " lsl r3, r3, #0x1\n" + " add r1, r1, r3\n" + " b ._431\n" + "._433:\n" + " .align 2, 0\n" + "._432:\n" + " .word gUnknown_Debug_083F8524\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_083F852D\n" + " .word gUnknown_Debug_083F8537\n" + "._430:\n" + " mov r1, #0x0\n" + " lsl r5, r4, #0x3\n" + " mov r2, #0x0\n" + "._434:\n" + " add r0, r6, r1\n" + " strb r2, [r0]\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r1, r0, #0x10\n" + " cmp r1, #0xb\n" + " bls ._434 @cond_branch\n" + " ldr r0, ._437\n" + " add r0, r5, r0\n" + " ldr r1, [r0]\n" + " add r0, r6, #0\n" + " mov r2, #0xb\n" + " bl debug_80C689C\n" + " mov r1, #0xc\n" + " mov r2, #0xff\n" + "._435:\n" + " add r0, r6, r1\n" + " strb r2, [r0]\n" + " add r0, r1, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r1, r0, #0x10\n" + " cmp r1, #0xff\n" + " bls ._435 @cond_branch\n" + " ldr r0, ._437\n" + " add r0, r0, #0x4\n" + " add r0, r5, r0\n" + " ldr r0, [r0]\n" + " ldrb r2, [r0, #0x9]\n" + " lsl r0, r2, #0x1a\n" + " lsr r5, r0, #0x18\n" + " cmp r4, #0x22\n" + " bhi ._436 @cond_branch\n" + " lsl r0, r4, #0x2\n" + " ldr r1, ._437 + 4\n" + " add r1, r0, r1\n" + " ldr r1, [r1]\n" + " add r7, r0, #0\n" + " mov pc, r1\n" + "._438:\n" + " .align 2, 0\n" + "._437:\n" + " .word gUnknown_Debug_083F8554\n" + " .word ._439\n" + "._439:\n" + " .word ._440\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._445\n" + " .word ._446\n" + " .word ._450\n" + " .word ._450\n" + " .word ._450\n" + " .word ._450\n" + " .word ._451\n" + " .word ._452\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._472\n" + " .word ._473\n" + " .word ._474\n" + "._436:\n" + " mov r0, #0xff\n" + " strb r0, [r6]\n" + " b ._517\n" + "._440:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r1, ._477\n" + " mov r9, r1\n" + " ldr r1, [r1]\n" + " add r1, r1, #0x64\n" + " add r1, r1, r7\n" + " ldr r1, [r1]\n" + " mov r3, r8\n" + " bl debug_80C6678\n" + " add r1, r5, r6\n" + " mov r0, #0x0\n" + " strb r0, [r1, #0xa]\n" + " mov r0, #0xfc\n" + " strb r0, [r1, #0xb]\n" + " mov r0, #0x1\n" + " strb r0, [r1, #0xc]\n" + " mov r2, r8\n" + " strb r2, [r1, #0xd]\n" + " add r4, r5, #0\n" + " add r4, r4, #0xe\n" + " add r4, r6, r4\n" + " mov r3, r9\n" + " ldr r0, [r3]\n" + " add r0, r0, #0x64\n" + " add r0, r0, r7\n" + " ldrh r0, [r0]\n" + " bl NationalPokedexNumToSpecies\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r1, #0xb\n" + " mul r1, r1, r0\n" + " ldr r0, ._477 + 4\n" + " add r1, r1, r0\n" + " add r0, r4, #0\n" + " mov r2, #0xa\n" + " bl debug_80C689C\n" + " b ._517\n" + "._478:\n" + " .align 2, 0\n" + "._477:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gSpeciesNames\n" + "._445:\n" + " ldr r0, ._483\n" + " ldr r0, [r0]\n" + " add r0, r0, #0x64\n" + " add r0, r0, r7\n" + " ldr r0, [r0]\n" + " cmp r0, #0x1\n" + " beq ._479 @cond_branch\n" + " cmp r0, #0x1\n" + " bcc ._480 @cond_branch\n" + " cmp r0, #0x2\n" + " beq ._481 @cond_branch\n" + " b ._517\n" + "._484:\n" + " .align 2, 0\n" + "._483:\n" + " .word unk_debug_ewram_0+0x30\n" + "._480:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r1, ._486\n" + " b ._488\n" + "._487:\n" + " .align 2, 0\n" + "._486:\n" + " .word gUnknown_Debug_083F8546\n" + "._479:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r1, ._489\n" + " b ._488\n" + "._490:\n" + " .align 2, 0\n" + "._489:\n" + " .word gUnknown_Debug_083F8541\n" + "._481:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r1, ._492\n" + "._488:\n" + " mov r2, #0x2\n" + " bl debug_80C689C\n" + " b ._517\n" + "._493:\n" + " .align 2, 0\n" + "._492:\n" + " .word gUnknown_Debug_083F8544\n" + "._450:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r4, ._495\n" + " ldr r1, [r4]\n" + " add r1, r1, #0x64\n" + " add r1, r1, r7\n" + " ldr r1, [r1]\n" + " mov r3, r8\n" + " bl debug_80C6678\n" + " add r1, r5, r6\n" + " mov r0, #0x0\n" + " strb r0, [r1, #0xa]\n" + " mov r0, #0xfc\n" + " strb r0, [r1, #0xb]\n" + " mov r0, #0x1\n" + " strb r0, [r1, #0xc]\n" + " mov r0, r8\n" + " strb r0, [r1, #0xd]\n" + " add r0, r5, #0\n" + " add r0, r0, #0xe\n" + " add r0, r6, r0\n" + " ldr r1, [r4]\n" + " add r1, r1, #0x64\n" + " add r1, r1, r7\n" + " ldr r2, [r1]\n" + " mov r1, #0xd\n" + " mul r1, r1, r2\n" + " ldr r2, ._495 + 4\n" + " add r1, r1, r2\n" + " b ._494\n" + "._496:\n" + " .align 2, 0\n" + "._495:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gMoveNames\n" + "._451:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r4, ._499\n" + " ldr r1, [r4]\n" + " add r1, r1, #0x64\n" + " add r1, r1, r7\n" + " ldr r1, [r1]\n" + " mov r3, r8\n" + " bl debug_80C6678\n" + " add r1, r5, r6\n" + " mov r0, #0x0\n" + " strb r0, [r1, #0xa]\n" + " mov r0, #0xfc\n" + " strb r0, [r1, #0xb]\n" + " mov r0, #0x1\n" + " strb r0, [r1, #0xc]\n" + " mov r2, r8\n" + " strb r2, [r1, #0xd]\n" + " ldr r0, [r4]\n" + " add r0, r0, #0x64\n" + " add r0, r0, r7\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._497 @cond_branch\n" + " add r4, r5, #0\n" + " add r4, r4, #0xe\n" + " add r4, r6, r4\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl ItemId_GetItem\n" + " add r1, r0, #0\n" + " add r0, r4, #0\n" + " b ._498\n" + "._500:\n" + " .align 2, 0\n" + "._499:\n" + " .word unk_debug_ewram_0+0x30\n" + "._497:\n" + " add r0, r5, #0\n" + " add r0, r0, #0xe\n" + " add r0, r6, r0\n" + " ldr r1, ._502\n" + "._498:\n" + " mov r2, #0x9\n" + " bl debug_80C689C\n" + " b ._517\n" + "._503:\n" + " .align 2, 0\n" + "._502:\n" + " .word gUnknown_Debug_083F8541\n" + "._452:\n" + " add r6, r6, #0xc\n" + " ldr r4, ._505\n" + " ldr r0, [r4]\n" + " ldr r0, [r0, #0x64]\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl NationalPokedexNumToSpecies\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " ldr r1, [r4]\n" + " add r1, r1, #0x64\n" + " add r1, r1, r7\n" + " ldrb r1, [r1]\n" + " bl GetAbilityBySpecies\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0xd\n" + " mul r1, r1, r0\n" + " ldr r0, ._505 + 4\n" + " add r1, r1, r0\n" + " add r0, r6, #0\n" + "._494:\n" + " mov r2, #0xc\n" + " bl debug_80C689C\n" + " b ._517\n" + "._506:\n" + " .align 2, 0\n" + "._505:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gAbilityNames\n" + "._474:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r2, ._508\n" + " ldr r1, ._508 + 4\n" + " ldr r1, [r1]\n" + " add r1, r1, #0x64\n" + " add r1, r1, r7\n" + " ldr r1, [r1]\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldr r1, [r1]\n" + " b ._514\n" + "._509:\n" + " .align 2, 0\n" + "._508:\n" + " .word gUnknown_Debug_083F86E8\n" + " .word unk_debug_ewram_0+0x30\n" + "._472:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xc\n" + " ldr r1, ._511\n" + " ldr r1, [r1]\n" + " add r1, r1, #0x64\n" + " add r1, r1, r7\n" + " ldr r1, [r1]\n" + " mov r3, r8\n" + " bl debug_80C6678\n" + " b ._517\n" + "._512:\n" + " .align 2, 0\n" + "._511:\n" + " .word unk_debug_ewram_0+0x30\n" + "._473:\n" + " ldr r0, ._515\n" + " ldr r0, [r0]\n" + " add r0, r0, #0x64\n" + " add r0, r0, r7\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._513 @cond_branch\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r1, ._515 + 4\n" + " b ._514\n" + "._516:\n" + " .align 2, 0\n" + "._515:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_083F854A\n" + "._513:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r1, ._518\n" + "._514:\n" + " mov r2, #0x4\n" + " bl debug_80C689C\n" + " b ._517\n" + "._519:\n" + " .align 2, 0\n" + "._518:\n" + " .word gUnknown_Debug_083F854D\n" + "._446:\n" + " add r0, r6, #0\n" + " add r0, r0, #0xa\n" + " ldr r2, ._520\n" + " ldr r1, ._520 + 4\n" + " ldr r1, [r1]\n" + " add r1, r1, #0x64\n" + " add r1, r1, r7\n" + " ldr r1, [r1]\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r2\n" + " ldr r1, [r1]\n" + " mov r2, #0x5\n" + " bl debug_80C689C\n" + "._517:\n" + " mov r0, #0x0\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._521:\n" + " .align 2, 0\n" + "._520:\n" + " .word gNatureNames\n" + " .word unk_debug_ewram_0+0x30\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5B60() +{ + asm( + " lsl r0, r0, #0x18\n" + " ldr r1, ._522\n" + " ldr r1, [r1]\n" + " lsr r0, r0, #0x16\n" + " add r1, r1, #0x64\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " bx lr\n" + "._523:\n" + " .align 2, 0\n" + "._522:\n" + " .word unk_debug_ewram_0+0x30\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5B74() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r2, r1, #0x18\n" + " cmp r2, #0x18\n" + " bhi ._540 @cond_branch\n" + " lsl r0, r2, #0x2\n" + " ldr r1, ._526\n" + " add r1, r0, r1\n" + " ldr r1, [r1]\n" + " add r3, r0, #0\n" + " mov pc, r1\n" + "._527:\n" + " .align 2, 0\n" + "._526:\n" + " .word ._525\n" + "._525:\n" + " .word ._532\n" + " .word ._529\n" + " .word ._530\n" + " .word ._532\n" + " .word ._532\n" + " .word ._540\n" + " .word ._540\n" + " .word ._540\n" + " .word ._540\n" + " .word ._540\n" + " .word ._540\n" + " .word ._540\n" + " .word ._540\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + " .word ._552\n" + "._540:\n" + " ldr r0, ._554\n" + " ldr r0, [r0]\n" + " lsl r1, r2, #0x2\n" + " add r0, r0, #0x64\n" + " add r0, r0, r1\n" + " str r6, [r0]\n" + " b ._562\n" + "._555:\n" + " .align 2, 0\n" + "._554:\n" + " .word unk_debug_ewram_0+0x30\n" + "._532:\n" + " ldr r0, ._557\n" + " ldr r0, [r0]\n" + " add r0, r0, #0x64\n" + " add r0, r0, r3\n" + " str r6, [r0]\n" + " bl debug_80C5C94\n" + " b ._562\n" + "._558:\n" + " .align 2, 0\n" + "._557:\n" + " .word unk_debug_ewram_0+0x30\n" + "._529:\n" + " ldr r4, ._560\n" + " ldr r1, [r4]\n" + " add r0, r1, #0\n" + " add r0, r0, #0x64\n" + " add r0, r0, r3\n" + " str r6, [r0]\n" + " ldr r0, [r1, #0x64]\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl NationalPokedexNumToSpecies\n" + " ldr r5, [r4]\n" + " ldr r4, ._560 + 4\n" + " lsl r2, r6, #0x2\n" + " ldr r3, ._560 + 8\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " lsl r1, r0, #0x3\n" + " sub r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r3\n" + " ldrb r1, [r1, #0x13]\n" + " mov r0, #0xca\n" + " lsl r0, r0, #0x1\n" + " mul r0, r0, r1\n" + " add r2, r2, r0\n" + " add r2, r2, r4\n" + " ldr r0, [r2]\n" + " str r0, [r5, #0x6c]\n" + " bl debug_80C5C94\n" + " b ._562\n" + "._561:\n" + " .align 2, 0\n" + "._560:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gExperienceTables\n" + " .word gBaseStats\n" + "._530:\n" + " ldr r0, ._563\n" + " ldr r0, [r0]\n" + " add r0, r0, #0x64\n" + " add r0, r0, r3\n" + " str r6, [r0]\n" + " bl debug_80C5DEC\n" + " b ._562\n" + "._564:\n" + " .align 2, 0\n" + "._563:\n" + " .word unk_debug_ewram_0+0x30\n" + "._552:\n" + " ldr r0, ._565\n" + " ldr r0, [r0]\n" + " add r0, r0, #0x64\n" + " add r0, r0, r3\n" + " str r6, [r0]\n" + " bl debug_80C5EF4\n" + "._562:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._566:\n" + " .align 2, 0\n" + "._565:\n" + " .word unk_debug_ewram_0+0x30\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5C94() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffff0\n" + " ldr r6, ._567\n" + " ldr r2, [r6]\n" + " add r0, r2, #0\n" + " add r0, r0, #0x98\n" + " ldr r4, [r0]\n" + " mov r1, #0x1f\n" + " and r4, r4, r1\n" + " add r0, r0, #0x8\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " orr r4, r4, r0\n" + " add r0, r2, #0\n" + " add r0, r0, #0xa8\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0xa\n" + " orr r4, r4, r0\n" + " add r0, r2, #0\n" + " add r0, r0, #0xb0\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0xf\n" + " orr r4, r4, r0\n" + " add r0, r2, #0\n" + " add r0, r0, #0xb8\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x14\n" + " orr r4, r4, r0\n" + " add r0, r2, #0\n" + " add r0, r0, #0xc0\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x19\n" + " orr r4, r4, r0\n" + " ldr r0, [r2, #0x64]\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl NationalPokedexNumToSpecies\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r0, [r6]\n" + " ldr r2, [r0, #0x68]\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " mov r5, #0x1\n" + " str r5, [sp]\n" + " ldr r3, [r0, #0x74]\n" + " str r3, [sp, #0x4]\n" + " str r5, [sp, #0x8]\n" + " ldr r3, [r0, #0x70]\n" + " str r3, [sp, #0xc]\n" + " add r3, r4, #0\n" + " bl CreateMon\n" + " ldr r0, [r6]\n" + " bl GetMonGender\n" + " ldr r1, [r6]\n" + " add r0, r0, #0x2\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " str r0, [r1, #0x78]\n" + " add r0, r1, #0\n" + " bl GetNature\n" + " ldr r1, [r6]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " str r0, [r1, #0x7c]\n" + " add r0, r1, #0\n" + " mov r1, #0xd\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " add r1, r0, #0\n" + " add r1, r1, #0x80\n" + " str r2, [r1]\n" + " mov r1, #0xe\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " add r1, r0, #0\n" + " add r1, r1, #0x84\n" + " str r2, [r1]\n" + " mov r1, #0xf\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " add r1, r0, #0\n" + " add r1, r1, #0x88\n" + " str r2, [r1]\n" + " mov r1, #0x10\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " add r1, r0, #0\n" + " add r1, r1, #0x8c\n" + " str r2, [r1]\n" + " mov r1, #0x19\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " ldr r0, [r6]\n" + " str r1, [r0, #0x6c]\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf0\n" + " str r2, [r1]\n" + " mov r1, #0x3b\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf4\n" + " str r2, [r1]\n" + " mov r1, #0x3c\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf8\n" + " str r2, [r1]\n" + " mov r1, #0x3d\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xfc\n" + " str r2, [r1]\n" + " mov r1, #0x3e\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r6]\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x1\n" + " add r1, r0, r3\n" + " str r2, [r1]\n" + " mov r1, #0x3f\n" + " bl GetMonData\n" + " ldr r1, [r6]\n" + " mov r2, #0x82\n" + " lsl r2, r2, #0x1\n" + " add r1, r1, r2\n" + " str r0, [r1]\n" + " add sp, sp, #0x10\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._568:\n" + " .align 2, 0\n" + "._567:\n" + " .word unk_debug_ewram_0+0x30\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5DEC() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " ldr r4, ._569\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0x6c\n" + " mov r1, #0x19\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " mov r1, #0xd\n" + " mov r2, sp\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " mov r1, #0xe\n" + " mov r2, sp\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " mov r1, #0xf\n" + " mov r2, sp\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " mov r1, #0x10\n" + " mov r2, sp\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " bl CalculateMonStats\n" + " ldr r0, [r4]\n" + " bl GiveMonInitialMoveset\n" + " ldr r0, [r4]\n" + " mov r1, #0x38\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " ldr r0, [r4]\n" + " str r1, [r0, #0x68]\n" + " mov r1, #0xd\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0x80\n" + " str r2, [r1]\n" + " mov r1, #0xe\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0x84\n" + " str r2, [r1]\n" + " mov r1, #0xf\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0x88\n" + " str r2, [r1]\n" + " mov r1, #0x10\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0x8c\n" + " str r2, [r1]\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf0\n" + " str r2, [r1]\n" + " mov r1, #0x3b\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf4\n" + " str r2, [r1]\n" + " mov r1, #0x3c\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf8\n" + " str r2, [r1]\n" + " mov r1, #0x3d\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xfc\n" + " str r2, [r1]\n" + " mov r1, #0x3e\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x1\n" + " add r1, r0, r3\n" + " str r2, [r1]\n" + " mov r1, #0x3f\n" + " bl GetMonData\n" + " ldr r1, [r4]\n" + " mov r2, #0x82\n" + " lsl r2, r2, #0x1\n" + " add r1, r1, r2\n" + " str r0, [r1]\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._570:\n" + " .align 2, 0\n" + "._569:\n" + " .word unk_debug_ewram_0+0x30\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5EF4() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._571\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0x98\n" + " mov r1, #0x27\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0x9c\n" + " mov r1, #0x1a\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xa0\n" + " mov r1, #0x28\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xa4\n" + " mov r1, #0x1b\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xa8\n" + " mov r1, #0x29\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xac\n" + " mov r1, #0x1c\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xb0\n" + " mov r1, #0x2a\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xb4\n" + " mov r1, #0x1d\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xb8\n" + " mov r1, #0x2b\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xbc\n" + " mov r1, #0x1e\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xc0\n" + " mov r1, #0x2c\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xc4\n" + " mov r1, #0x1f\n" + " bl SetMonData\n" + " ldr r0, [r4]\n" + " bl CalculateMonStats\n" + " ldr r0, [r4]\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf0\n" + " str r2, [r1]\n" + " mov r1, #0x3b\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf4\n" + " str r2, [r1]\n" + " mov r1, #0x3c\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xf8\n" + " str r2, [r1]\n" + " mov r1, #0x3d\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xfc\n" + " str r2, [r1]\n" + " mov r1, #0x3e\n" + " bl GetMonData\n" + " add r2, r0, #0\n" + " ldr r0, [r4]\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x1\n" + " add r1, r0, r3\n" + " str r2, [r1]\n" + " mov r1, #0x3f\n" + " bl GetMonData\n" + " ldr r1, [r4]\n" + " mov r2, #0x82\n" + " lsl r2, r2, #0x1\n" + " add r1, r1, r2\n" + " str r0, [r1]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._572:\n" + " .align 2, 0\n" + "._571:\n" + " .word unk_debug_ewram_0+0x30\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C5FFC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xffffffe0\n" + " ldr r1, ._578\n" + " add r0, sp, #0x10\n" + " mov r2, #0x4\n" + " bl memcpy\n" + " add r7, sp, #0x14\n" + " ldr r1, ._578 + 4\n" + " add r0, r7, #0\n" + " mov r2, #0x8\n" + " bl memcpy\n" + " ldr r5, ._578 + 8\n" + " ldr r2, [r5]\n" + " add r0, r2, #0\n" + " add r0, r0, #0x98\n" + " ldr r4, [r0]\n" + " mov r1, #0x1f\n" + " and r4, r4, r1\n" + " add r0, r0, #0x8\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " orr r4, r4, r0\n" + " add r0, r2, #0\n" + " add r0, r0, #0xa8\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0xa\n" + " orr r4, r4, r0\n" + " add r0, r2, #0\n" + " add r0, r0, #0xb0\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0xf\n" + " orr r4, r4, r0\n" + " add r0, r2, #0\n" + " add r0, r0, #0xb8\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x14\n" + " orr r4, r4, r0\n" + " add r0, r2, #0\n" + " add r0, r0, #0xc0\n" + " ldr r0, [r0]\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x19\n" + " orr r4, r4, r0\n" + " ldr r0, [r2, #0x64]\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl NationalPokedexNumToSpecies\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r0, [r5]\n" + " ldr r2, [r0, #0x68]\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " mov r6, #0x1\n" + " str r6, [sp]\n" + " ldr r3, [r0, #0x74]\n" + " str r3, [sp, #0x4]\n" + " str r6, [sp, #0x8]\n" + " ldr r3, [r0, #0x70]\n" + " str r3, [sp, #0xc]\n" + " add r3, r4, #0\n" + " bl CreateMon\n" + " ldr r2, [r5]\n" + " add r0, r2, #0\n" + " add r0, r0, #0x80\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._573 @cond_branch\n" + " lsl r1, r0, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r2, #0\n" + " mov r2, #0x0\n" + " bl SetMonMoveSlot\n" + "._573:\n" + " ldr r2, [r5]\n" + " add r0, r2, #0\n" + " add r0, r0, #0x84\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._574 @cond_branch\n" + " lsl r1, r0, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r2, #0\n" + " mov r2, #0x1\n" + " bl SetMonMoveSlot\n" + "._574:\n" + " ldr r2, [r5]\n" + " add r0, r2, #0\n" + " add r0, r0, #0x88\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._575 @cond_branch\n" + " lsl r1, r0, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r2, #0\n" + " mov r2, #0x2\n" + " bl SetMonMoveSlot\n" + "._575:\n" + " ldr r2, [r5]\n" + " add r0, r2, #0\n" + " add r0, r0, #0x8c\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._576 @cond_branch\n" + " lsl r1, r0, #0x10\n" + " lsr r1, r1, #0x10\n" + " add r0, r2, #0\n" + " mov r2, #0x3\n" + " bl SetMonMoveSlot\n" + "._576:\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0x6c\n" + " mov r1, #0x19\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0x98\n" + " mov r1, #0x27\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0x9c\n" + " mov r1, #0x1a\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xa0\n" + " mov r1, #0x28\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xa4\n" + " mov r1, #0x1b\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xa8\n" + " mov r1, #0x29\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xac\n" + " mov r1, #0x1c\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xb0\n" + " mov r1, #0x2a\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xb4\n" + " mov r1, #0x1d\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xb8\n" + " mov r1, #0x2b\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xbc\n" + " mov r1, #0x1e\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xc0\n" + " mov r1, #0x2c\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xc4\n" + " mov r1, #0x1f\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xc8\n" + " mov r1, #0x16\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xcc\n" + " mov r1, #0x17\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xd0\n" + " mov r1, #0x18\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xd4\n" + " mov r1, #0x21\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xd8\n" + " mov r1, #0x2f\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xdc\n" + " mov r1, #0x30\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xe0\n" + " mov r1, #0x20\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xe4\n" + " mov r1, #0x22\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0x90\n" + " mov r1, #0xc\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0x94\n" + " mov r1, #0x2e\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r1, r0, #0\n" + " add r1, r1, #0xec\n" + " ldr r2, [r1]\n" + " lsl r2, r2, #0x3\n" + " ldr r1, ._578 + 12\n" + " add r2, r2, r1\n" + " mov r1, #0x37\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " add r2, r0, #0\n" + " add r2, r2, #0xe8\n" + " mov r1, #0x2d\n" + " bl SetMonData\n" + " ldr r1, [r5]\n" + " add r0, r1, #0\n" + " add r0, r0, #0xe8\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._577 @cond_branch\n" + " add r0, r1, #0\n" + " mov r1, #0x2\n" + " add r2, sp, #0x10\n" + " bl SetMonData\n" + " add r2, sp, #0x1c\n" + " strb r6, [r2]\n" + " ldr r0, [r5]\n" + " mov r1, #0x3\n" + " bl SetMonData\n" + "._577:\n" + " ldr r0, [r5]\n" + " mov r1, #0x7\n" + " add r2, r7, #0\n" + " bl SetMonData\n" + " mov r2, sp\n" + " add r2, r2, #0x1e\n" + " mov r0, #0xff\n" + " strh r0, [r2]\n" + " ldr r0, [r5]\n" + " mov r1, #0x23\n" + " bl SetMonData\n" + " ldr r0, [r5]\n" + " bl CalculateMonStats\n" + " add sp, sp, #0x20\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._579:\n" + " .align 2, 0\n" + "._578:\n" + " .word gUnknown_Debug_083F8758\n" + " .word gUnknown_Debug_083F875C\n" + " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_083F86E8+0x4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C627C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r6, r4, #0\n" + " ldr r1, ._584\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " bl memcpy\n" + " add r5, sp, #0x4\n" + " ldr r1, ._584 + 4\n" + " add r0, r5, #0\n" + " mov r2, #0x2\n" + " bl memcpy\n" + " cmp r4, #0x1\n" + " beq ._580 @cond_branch\n" + " cmp r4, #0x1\n" + " bgt ._581 @cond_branch\n" + " cmp r4, #0\n" + " beq ._582 @cond_branch\n" + " b ._595\n" + "._585:\n" + " .align 2, 0\n" + "._584:\n" + " .word gUnknown_Debug_083F7FD4\n" + " .word gUnknown_Debug_083F8764\n" + "._581:\n" + " cmp r6, #0x2\n" + " beq ._586 @cond_branch\n" + " b ._595\n" + "._582:\n" + " ldr r0, ._589\n" + " ldr r0, [r0]\n" + " ldr r1, ._589 + 4\n" + " add r0, r0, r1\n" + " b ._588\n" + "._590:\n" + " .align 2, 0\n" + "._589:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + "._580:\n" + " ldr r4, ._593\n" + " ldr r3, [r4]\n" + " ldr r1, ._593 + 4\n" + " add r0, r3, r1\n" + " ldrb r2, [r0]\n" + " ldr r1, ._593 + 8\n" + " mov r6, #0xb4\n" + " lsl r6, r6, #0x1\n" + " add r0, r3, r6\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrb r0, [r0, #0x4]\n" + " sub r0, r0, #0x1\n" + " cmp r2, r0\n" + " bge ._595 @cond_branch\n" + " lsl r2, r2, #0x19\n" + " mov r0, #0xa0\n" + " lsl r0, r0, #0x13\n" + " add r2, r2, r0\n" + " lsr r2, r2, #0x18\n" + " add r0, r5, #0\n" + " mov r1, #0x1\n" + " bl MenuPrint\n" + " ldr r0, [r4]\n" + " ldr r2, ._593 + 4\n" + " add r1, r0, r2\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, [r4]\n" + " add r0, r0, r2\n" + "._588:\n" + " ldrb r2, [r0]\n" + " lsl r2, r2, #0x19\n" + " mov r6, #0xa0\n" + " lsl r6, r6, #0x13\n" + " add r2, r2, r6\n" + " lsr r2, r2, #0x18\n" + " mov r0, sp\n" + " mov r1, #0x1\n" + " bl MenuPrint\n" + " b ._595\n" + "._594:\n" + " .align 2, 0\n" + "._593:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + " .word gUnknown_Debug_083F8698\n" + "._586:\n" + " ldr r4, ._596\n" + " ldr r0, [r4]\n" + " ldr r2, ._596 + 4\n" + " add r1, r0, r2\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._595 @cond_branch\n" + " add r2, r0, #0\n" + " lsl r2, r2, #0x19\n" + " mov r6, #0xa0\n" + " lsl r6, r6, #0x13\n" + " add r2, r2, r6\n" + " lsr r2, r2, #0x18\n" + " add r0, r5, #0\n" + " mov r1, #0x1\n" + " bl MenuPrint\n" + " ldr r0, [r4]\n" + " ldr r2, ._596 + 4\n" + " add r1, r0, r2\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, [r4]\n" + " add r0, r0, r2\n" + " ldrb r2, [r0]\n" + " lsl r2, r2, #0x19\n" + " add r2, r2, r6\n" + " lsr r2, r2, #0x18\n" + " mov r0, sp\n" + " mov r1, #0x1\n" + " bl MenuPrint\n" + "._595:\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._597:\n" + " .align 2, 0\n" + "._596:\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C6384() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " mov r0, #0x0\n" + " mov r1, #0x4\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r5, #0x0\n" + " ldr r3, ._600\n" + " ldr r1, ._600 + 4\n" + " ldr r0, [r1]\n" + " mov r2, #0xb4\n" + " lsl r2, r2, #0x1\n" + " add r0, r0, r2\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r3\n" + " ldr r0, [r0]\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._598 @cond_branch\n" + " add r4, r1, #0\n" + " ldr r0, ._600 + 8\n" + " mov r9, r0\n" + " mov r8, r3\n" + " add r7, r2, #0\n" + " mov r6, #0x1\n" + "._599:\n" + " ldr r0, [r4]\n" + " add r0, r0, r9\n" + " mov r1, #0xfc\n" + " strb r1, [r0]\n" + " ldr r0, [r4]\n" + " add r1, r1, #0x70\n" + " add r0, r0, r1\n" + " strb r6, [r0]\n" + " ldr r0, [r4]\n" + " ldr r2, ._600 + 12\n" + " add r0, r0, r2\n" + " strb r6, [r0]\n" + " ldr r1, [r4]\n" + " add r2, r2, #0x1\n" + " add r0, r1, r2\n" + " add r1, r1, r7\n" + " ldrb r1, [r1]\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r8\n" + " ldr r1, [r1]\n" + " add r1, r1, r5\n" + " ldrb r1, [r1]\n" + " mov r2, #0x1\n" + " bl debug_80C5738\n" + " ldr r0, [r4]\n" + " add r0, r0, r9\n" + " lsl r2, r5, #0x19\n" + " mov r1, #0xa0\n" + " lsl r1, r1, #0x13\n" + " add r2, r2, r1\n" + " lsr r2, r2, #0x18\n" + " mov r1, #0x2\n" + " bl MenuPrint\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " ldr r0, [r4]\n" + " add r0, r0, r7\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r8\n" + " ldr r0, [r0]\n" + " add r0, r0, r5\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " bne ._599 @cond_branch\n" + "._598:\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._601:\n" + " .align 2, 0\n" + "._600:\n" + " .word gUnknown_Debug_083F8698\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x16b\n" + " .word 0x16d\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C643C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " mov r0, #0x2\n" + " mov r1, #0x5\n" + " mov r2, #0x1c\n" + " mov r3, #0x12\n" + " bl MenuFillWindowRectWithBlankTile\n" + " mov r5, #0x0\n" + " ldr r6, ._605\n" + " ldr r1, ._605 + 4\n" + " ldr r0, [r1]\n" + " mov r3, #0xb4\n" + " lsl r3, r3, #0x1\n" + " add r0, r0, r3\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r6\n" + " ldr r0, [r0]\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " beq ._602 @cond_branch\n" + " add r4, r1, #0\n" + " mov r0, #0x1\n" + " mov r8, r0\n" + "._607:\n" + " ldr r0, [r4]\n" + " ldr r7, ._605 + 8\n" + " add r2, r0, r7\n" + " mov r0, #0xfc\n" + " strb r0, [r2]\n" + " ldr r0, [r4]\n" + " mov r2, #0xb6\n" + " lsl r2, r2, #0x1\n" + " add r0, r0, r2\n" + " mov r7, r8\n" + " strb r7, [r0]\n" + " ldr r2, [r4]\n" + " ldr r7, ._605 + 12\n" + " add r0, r2, r7\n" + " ldrb r0, [r0]\n" + " cmp r5, r0\n" + " bne ._603 @cond_branch\n" + " ldr r0, ._605 + 16\n" + " add r2, r2, r0\n" + " mov r0, #0x2\n" + " strb r0, [r2]\n" + " ldr r1, [r1]\n" + " mov r2, #0xb7\n" + " lsl r2, r2, #0x1\n" + " add r0, r1, r2\n" + " add r1, r1, r3\n" + " ldrb r1, [r1]\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r6\n" + " ldr r1, [r1]\n" + " add r1, r1, r5\n" + " ldrb r1, [r1]\n" + " mov r2, #0x2\n" + " bl debug_80C5738\n" + " b ._604\n" + "._606:\n" + " .align 2, 0\n" + "._605:\n" + " .word gUnknown_Debug_083F8698\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x16b\n" + " .word 0x169\n" + " .word 0x16d\n" + "._603:\n" + " ldr r3, ._608\n" + " add r0, r2, r3\n" + " mov r7, r8\n" + " strb r7, [r0]\n" + " ldr r1, [r1]\n" + " mov r2, #0xb7\n" + " lsl r2, r2, #0x1\n" + " add r0, r1, r2\n" + " ldr r2, ._608 + 4\n" + " sub r3, r3, #0x5\n" + " add r1, r1, r3\n" + " ldrb r1, [r1]\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldr r1, [r1]\n" + " add r1, r1, r5\n" + " ldrb r1, [r1]\n" + " mov r2, #0x1\n" + " bl debug_80C5738\n" + "._604:\n" + " ldr r0, [r4]\n" + " ldr r7, ._608 + 8\n" + " add r0, r0, r7\n" + " lsl r2, r5, #0x19\n" + " mov r1, #0xa0\n" + " lsl r1, r1, #0x13\n" + " add r2, r2, r1\n" + " lsr r2, r2, #0x18\n" + " mov r1, #0x2\n" + " bl MenuPrint\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " ldr r6, ._608 + 4\n" + " add r1, r4, #0\n" + " ldr r0, [r4]\n" + " mov r3, #0xb4\n" + " lsl r3, r3, #0x1\n" + " add r0, r0, r3\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r6\n" + " ldr r0, [r0]\n" + " add r0, r0, r5\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " bne ._607 @cond_branch\n" + "._602:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._609:\n" + " .align 2, 0\n" + "._608:\n" + " .word 0x16d\n" + " .word gUnknown_Debug_083F8698\n" + " .word 0x16b\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C6544() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r9, r0\n" + " ldr r0, ._614\n" + " mov r8, r0\n" + " ldr r6, ._614 + 4\n" + " ldr r1, [r6]\n" + " mov r5, #0xb4\n" + " lsl r5, r5, #0x1\n" + " add r0, r1, r5\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r8\n" + " ldr r4, ._614 + 8\n" + " add r1, r1, r4\n" + " ldrb r1, [r1]\n" + " ldr r0, [r0]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " bl debug_80C5B60\n" + " add r7, r0, #0\n" + " ldr r2, ._614 + 12\n" + " ldr r3, [r6]\n" + " add r5, r3, r5\n" + " ldrb r0, [r5]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r8\n" + " add r4, r3, r4\n" + " ldrb r1, [r4]\n" + " ldr r0, [r0]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r2, r2, #0x4\n" + " add r0, r0, r2\n" + " ldr r1, [r0]\n" + " ldr r5, [r1]\n" + " ldr r4, [r1, #0x4]\n" + " ldr r2, ._614 + 16\n" + " mov r6, #0xb5\n" + " lsl r6, r6, #0x1\n" + " add r0, r3, r6\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldr r3, [r0]\n" + " ldrb r0, [r1, #0x8]\n" + " cmp r0, #0\n" + " bne ._623 @cond_branch\n" + " mov r0, r9\n" + " cmp r0, #0x1\n" + " beq ._611 @cond_branch\n" + " cmp r0, #0x2\n" + " beq ._612 @cond_branch\n" + " b ._623\n" + "._615:\n" + " .align 2, 0\n" + "._614:\n" + " .word gUnknown_Debug_083F8698\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + " .word gUnknown_Debug_083F8554\n" + " .word gUnknown_Debug_083F8768\n" + "._611:\n" + " sub r0, r4, r3\n" + " cmp r7, r0\n" + " bcs ._616 @cond_branch\n" + " add r7, r7, r3\n" + " b ._623\n" + "._616:\n" + " cmp r7, r4\n" + " bcc ._622 @cond_branch\n" + " b ._619\n" + "._612:\n" + " add r0, r5, r3\n" + " cmp r7, r0\n" + " bls ._620 @cond_branch\n" + " sub r7, r7, r3\n" + " b ._623\n" + "._620:\n" + " cmp r7, r5\n" + " bls ._622 @cond_branch\n" + "._619:\n" + " add r7, r5, #0\n" + " b ._623\n" + "._622:\n" + " add r7, r4, #0\n" + "._623:\n" + " ldr r1, ._624\n" + " ldr r0, ._624 + 4\n" + " ldr r2, [r0]\n" + " mov r3, #0xb4\n" + " lsl r3, r3, #0x1\n" + " add r0, r2, r3\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r6, ._624 + 8\n" + " add r1, r2, r6\n" + " ldrb r1, [r1]\n" + " ldr r0, [r0]\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r7, #0\n" + " bl debug_80C5B74\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._625:\n" + " .align 2, 0\n" + "._624:\n" + " .word gUnknown_Debug_083F8698\n" + " .word unk_debug_ewram_0+0x30\n" + " .word 0x169\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C6630() +{ + asm( + " push {r4, r5, lr}\n" + " add r4, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0xfc\n" + " strb r0, [r4]\n" + " add r4, r4, #0x1\n" + " mov r0, #0x1\n" + " strb r0, [r4]\n" + " add r4, r4, #0x1\n" + " cmp r2, #0x2\n" + " bne ._626 @cond_branch\n" + " ldr r0, ._629\n" + " ldr r0, [r0]\n" + " mov r5, #0xb5\n" + " lsl r5, r5, #0x1\n" + " add r0, r0, r5\n" + " ldrb r0, [r0]\n" + " cmp r3, r0\n" + " beq ._627 @cond_branch\n" + " strb r2, [r4]\n" + " b ._628\n" + "._630:\n" + " .align 2, 0\n" + "._629:\n" + " .word unk_debug_ewram_0+0x30\n" + "._627:\n" + " mov r0, #0x4\n" + "._626:\n" + " strb r0, [r4]\n" + "._628:\n" + " add r0, r1, #0\n" + " add r0, r0, #0xa1\n" + " strb r0, [r4, #0x1]\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C6678() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " mov r9, r0\n" + " add r6, r1, #0\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r8, r3\n" + " mov r7, #0x0\n" + " sub r0, r2, #1\n" + " cmp r0, #0x9\n" + " bhi ._644 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._633\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._634:\n" + " .align 2, 0\n" + "._633:\n" + " .word ._632\n" + "._632:\n" + " .word ._635\n" + " .word ._636\n" + " .word ._637\n" + " .word ._638\n" + " .word ._639\n" + " .word ._640\n" + " .word ._641\n" + " .word ._642\n" + " .word ._643\n" + " .word ._644\n" + "._644:\n" + " mov r0, r9\n" + " add r4, r0, r7\n" + " ldr r5, ._645\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x9\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._643:\n" + " mov r1, r9\n" + " add r4, r1, r7\n" + " ldr r5, ._645 + 4\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x8\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._642:\n" + " mov r0, r9\n" + " add r4, r0, r7\n" + " ldr r5, ._645 + 8\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x7\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._641:\n" + " mov r1, r9\n" + " add r4, r1, r7\n" + " ldr r5, ._645 + 12\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x6\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._640:\n" + " mov r0, r9\n" + " add r4, r0, r7\n" + " ldr r5, ._645 + 16\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x5\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._639:\n" + " mov r1, r9\n" + " add r4, r1, r7\n" + " ldr r5, ._645 + 20\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x4\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._638:\n" + " mov r0, r9\n" + " add r4, r0, r7\n" + " mov r5, #0xfa\n" + " lsl r5, r5, #0x2\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x3\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._637:\n" + " mov r1, r9\n" + " add r4, r1, r7\n" + " add r0, r6, #0\n" + " mov r1, #0x64\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x2\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " mov r1, #0x64\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._636:\n" + " mov r0, r9\n" + " add r4, r0, r7\n" + " add r0, r6, #0\n" + " mov r1, #0xa\n" + " bl __udivsi3\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " mov r2, r8\n" + " mov r3, #0x1\n" + " bl debug_80C6630\n" + " add r0, r6, #0\n" + " mov r1, #0xa\n" + " bl __umodsi3\n" + " add r6, r0, #0\n" + " add r0, r7, #4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + "._635:\n" + " mov r1, r9\n" + " add r0, r1, r7\n" + " lsl r1, r6, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r2, r8\n" + " mov r3, #0x0\n" + " bl debug_80C6630\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._646:\n" + " .align 2, 0\n" + "._645:\n" + " .word 0x3b9aca00\n" + " .word 0x5f5e100\n" + " .word 0x989680\n" + " .word 0xf4240\n" + " .word 0x186a0\n" + " .word 0x2710\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C689C() +{ + asm( + " push {r4, r5, lr}\n" + " add r5, r0, #0\n" + " add r4, r1, #0\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r3, #0x0\n" + " ldrb r0, [r4]\n" + " b ._647\n" + "._649:\n" + " add r1, r5, r3\n" + " add r0, r4, r3\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " add r0, r4, r3\n" + " ldrb r0, [r0]\n" + "._647:\n" + " cmp r0, #0xff\n" + " beq ._648 @cond_branch\n" + " cmp r3, r2\n" + " bcc ._649 @cond_branch\n" + "._648:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C68CC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " lsl r1, r1, #0x18\n" + " lsr r6, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r5, r2, #0x18\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r2, #0x0\n" + " mov r1, #0x0\n" + "._650:\n" + " mov r7, sp\n" + " add r0, r7, r2\n" + " strb r1, [r0]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x3\n" + " bls ._650 @cond_branch\n" + " mov r1, sp\n" + " mov r0, #0xff\n" + " strb r0, [r1, #0x4]\n" + " cmp r3, #0x2\n" + " beq ._651 @cond_branch\n" + " cmp r3, #0x2\n" + " bgt ._652 @cond_branch\n" + " cmp r3, #0x1\n" + " beq ._653 @cond_branch\n" + " b ._654\n" + "._652:\n" + " cmp r3, #0x3\n" + " beq ._655 @cond_branch\n" + "._654:\n" + " mov r1, sp\n" + " lsr r0, r4, #0xc\n" + " strb r0, [r1]\n" + "._655:\n" + " mov r1, sp\n" + " mov r0, #0xf0\n" + " lsl r0, r0, #0x4\n" + " and r0, r0, r4\n" + " lsr r0, r0, #0x8\n" + " strb r0, [r1, #0x1]\n" + "._651:\n" + " mov r1, sp\n" + " mov r0, #0xf0\n" + " and r0, r0, r4\n" + " lsr r0, r0, #0x4\n" + " strb r0, [r1, #0x2]\n" + "._653:\n" + " mov r2, sp\n" + " mov r1, #0xf\n" + " add r0, r4, #0\n" + " and r0, r0, r1\n" + " strb r0, [r2, #0x3]\n" + " mov r2, #0x0\n" + "._658:\n" + " mov r0, sp\n" + " add r1, r0, r2\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x9\n" + " bhi ._656 @cond_branch\n" + " add r0, r0, #0xa1\n" + " b ._657\n" + "._656:\n" + " add r0, r0, #0xb1\n" + "._657:\n" + " strb r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x3\n" + " bls ._658 @cond_branch\n" + " mov r0, #0x4\n" + " sub r0, r0, r3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r0, r0, sp\n" + " add r1, r6, #0\n" + " add r2, r5, #0\n" + " bl MenuPrint\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void InitSeePokemonGraphics() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl debug_80C35DC\n" + " ldr r1, ._659\n" + " ldr r2, ._659 + 4\n" + " ldr r0, ._659 + 8\n" + " str r1, [r0]\n" + " str r2, [r0, #0x4]\n" + " ldr r1, ._659 + 12\n" + " str r1, [r0, #0x8]\n" + " ldr r0, [r0, #0x8]\n" + " ldr r0, ._659 + 16\n" + " mov r1, #0x80\n" + " mov r2, #0x60\n" + " bl LoadPalette\n" + " ldr r1, ._659 + 20\n" + " add r0, sp, #0x4\n" + " strh r1, [r0]\n" + " mov r1, #0x0\n" + " mov r2, #0x2\n" + " bl LoadPalette\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r5, #0x0\n" + " str r5, [sp]\n" + " mov r1, #0x0\n" + " mov r2, #0x10\n" + " mov r3, #0x0\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._659 + 24\n" + " mov r6, #0x0\n" + " strh r5, [r0]\n" + " add r0, r0, #0x4\n" + " strh r5, [r0]\n" + " sub r0, r0, #0x2\n" + " strh r5, [r0]\n" + " add r0, r0, #0x4\n" + " strh r5, [r0]\n" + " ldr r1, ._659 + 28\n" + " mov r0, #0x3f\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " mov r0, #0x1f\n" + " strh r0, [r1]\n" + " add r1, r1, #0x6\n" + " mov r0, #0xf1\n" + " strh r0, [r1]\n" + " ldr r0, ._659 + 32\n" + " strh r5, [r0]\n" + " add r1, r1, #0x4\n" + " mov r0, #0x7\n" + " strh r0, [r1]\n" + " ldr r3, ._659 + 36\n" + " ldrh r2, [r3]\n" + " strh r5, [r3]\n" + " ldr r4, ._659 + 40\n" + " ldrh r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strh r0, [r4]\n" + " strh r2, [r3]\n" + " ldr r0, ._659 + 44\n" + " bl SetVBlankCallback\n" + " ldr r0, ._659 + 48\n" + " bl SetMainCallback2\n" + " bl sub_809D51C\n" + " ldr r1, ._659 + 52\n" + " ldr r2, ._659 + 56\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r2, ._659 + 60\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " sub r1, r1, #0xa\n" + " mov r2, #0xcd\n" + " lsl r2, r2, #0x6\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r0, ._659 + 64\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " ldr r1, ._659 + 68\n" + " ldr r0, ._659 + 72\n" + " str r0, [r1]\n" + " ldr r1, ._659 + 76\n" + " strh r1, [r0]\n" + " strb r6, [r0, #0x2]\n" + " strb r6, [r0, #0x3]\n" + " strb r6, [r0, #0x5]\n" + " strb r6, [r0, #0x7]\n" + " strb r6, [r0, #0xa]\n" + " strb r6, [r0, #0x8]\n" + " ldr r4, ._659 + 80\n" + " add r0, r4, #0\n" + " mov r1, #0x6c\n" + " mov r2, #0x74\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " ldr r6, ._659 + 84\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " strh r5, [r0, #0x2e]\n" + " mov r1, #0x0\n" + " bl StartSpriteAnim\n" + " add r0, r4, #0\n" + " mov r1, #0x6c\n" + " mov r2, #0x74\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " mov r1, #0x1\n" + " strh r1, [r0, #0x2e]\n" + " bl StartSpriteAnim\n" + " add r0, r4, #0\n" + " mov r1, #0x6c\n" + " mov r2, #0x74\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " mov r1, #0x2\n" + " strh r1, [r0, #0x2e]\n" + " bl StartSpriteAnim\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._660:\n" + " .align 2, 0\n" + "._659:\n" + " .word byte_83F88EC\n" + " .word 0x600e000\n" + " .word 0x40000d4\n" + " .word 0x80000400\n" + " .word word_83F888C\n" + " .word 0x7fff\n" + " .word 0x4000040\n" + " .word 0x4000048\n" + " .word 0x4000052\n" + " .word 0x4000208\n" + " .word 0x4000200\n" + " .word debug_80C3758+1\n" + " .word debug_80C370C+1\n" + " .word 0x4000008\n" + " .word 0x1f0b\n" + " .word 0x1e0a\n" + " .word debug_80C6B00+1\n" + " .word unk_debug_ewram_0+0x34\n" + " .word +0x2018000\n" + " .word 0x115\n" + " .word unk_83F8868+0xc\n" + " .word gSprites\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C6B00() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xffffffec\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " ldr r1, ._666\n" + " mov r0, sp\n" + " mov r2, #0x12\n" + " bl memcpy\n" + " mov r0, #0xa\n" + " mov r1, #0x0\n" + " mov r2, #0xf\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x9\n" + " mov r3, #0x9\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x0\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x10\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._666 + 4\n" + " mov r1, #0x11\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._666 + 8\n" + " mov r1, #0x1b\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._666 + 12\n" + " mov r1, #0x11\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, #0xa\n" + " mov r1, #0x8\n" + " mov r2, #0x1d\n" + " mov r3, #0xc\n" + " bl MenuDrawTextWindow\n" + " mov r2, #0x0\n" + " ldr r4, ._666 + 16\n" + " ldr r0, ._666 + 20\n" + " add r3, r0, #0\n" + "._661:\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r4\n" + " add r1, r2, r3\n" + " strh r1, [r0]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0xe\n" + " bls ._661 @cond_branch\n" + " mov r2, #0x0\n" + " ldr r5, ._666 + 24\n" + " lsl r6, r7, #0x2\n" + " mov r8, r6\n" + " ldr r4, ._666 + 28\n" + " ldr r0, ._666 + 32\n" + " add r3, r0, #0\n" + "._662:\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r4\n" + " add r1, r2, r3\n" + " strh r1, [r0]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0xe\n" + " bls ._662 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0x14\n" + " mov r2, #0xa\n" + " bl MenuPrint\n" + " mov r0, #0xa\n" + " mov r1, #0xd\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r1, sp\n" + " mov r0, #0x23\n" + " strb r0, [r1]\n" + " mov r2, #0x0\n" + " ldr r4, ._666 + 36\n" + " mov r5, #0x93\n" + " lsl r5, r5, #0x8\n" + " add r3, r5, #0\n" + "._663:\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r4\n" + " mov r6, sp\n" + " add r0, r6, r2\n" + " ldrb r0, [r0]\n" + " add r0, r0, r3\n" + " strh r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x11\n" + " bls ._663 @cond_branch\n" + " mov r1, sp\n" + " mov r0, #0x24\n" + " strb r0, [r1]\n" + " mov r2, #0x0\n" + " ldr r5, ._666 + 40\n" + " ldr r4, ._666 + 44\n" + " mov r0, #0x93\n" + " lsl r0, r0, #0x8\n" + " add r3, r0, #0\n" + "._664:\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r4\n" + " mov r6, sp\n" + " add r0, r6, r2\n" + " ldrb r0, [r0]\n" + " add r0, r0, r3\n" + " strh r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x11\n" + " bls ._664 @cond_branch\n" + " mov r1, sp\n" + " mov r0, #0x25\n" + " strb r0, [r1]\n" + " mov r2, #0x0\n" + " ldr r4, ._666 + 48\n" + " mov r0, #0x93\n" + " lsl r0, r0, #0x8\n" + " add r3, r0, #0\n" + "._665:\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r4\n" + " mov r6, sp\n" + " add r0, r6, r2\n" + " ldrb r0, [r0]\n" + " add r0, r0, r3\n" + " strh r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x11\n" + " bls ._665 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0xf\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " ldr r1, ._666 + 52\n" + " ldr r2, ._666 + 56\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r5, ._666 + 60\n" + " add r0, r5, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._666 + 64\n" + " mov r6, r8\n" + " add r0, r6, r7\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._666 + 68\n" + " str r1, [r0]\n" + " add sp, sp, #0x14\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._667:\n" + " .align 2, 0\n" + "._666:\n" + " .word gUnknown_Debug_083F8815\n" + " .word gUnknown_Debug_083F87D0\n" + " .word gUnknown_Debug_083F87D8\n" + " .word gUnknown_Debug_083F87E0\n" + " .word 0x600fa56\n" + " .word 0xa311\n" + " .word gUnknown_Debug_083F87F4\n" + " .word 0x600f256\n" + " .word 0x8301\n" + " .word 0x600f396\n" + " .word gUnknown_Debug_083F8801\n" + " .word 0x600f3d6\n" + " .word 0x600f416\n" + " .word 0x4000040\n" + " .word 0x51ef\n" + " .word 0x699f\n" + " .word gTasks\n" + " .word debug_80C6CB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C6CB8() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffff4\n" + " mov sl, r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov sl, r0\n" + " ldr r5, ._668\n" + " ldr r4, [r5]\n" + " ldrh r2, [r4]\n" + " lsl r0, r2, #0x3\n" + " ldr r1, ._668 + 4\n" + " add r0, r0, r1\n" + " ldr r1, ._668 + 8\n" + " lsl r2, r2, #0x2\n" + " add r2, r2, r1\n" + " ldrb r1, [r2]\n" + " ldrb r2, [r2, #0x1]\n" + " ldr r3, ._668 + 12\n" + " mov r8, r3\n" + " ldr r6, [r3]\n" + " str r6, [sp, #0x8]\n" + " ldr r3, [r3, #0x4]\n" + " str r3, [sp]\n" + " ldrh r3, [r4]\n" + " str r3, [sp, #0x4]\n" + " add r3, r6, #0\n" + " bl DecompressPicFromTable_2\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r7, ._668 + 16\n" + " add r0, r0, r7\n" + " bl LoadCompressedObjectPalette\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " mov r1, #0x1\n" + " bl GetMonSpriteTemplate_803C56C\n" + " ldr r0, ._668 + 20\n" + " mov r1, #0x28\n" + " mov r2, #0x28\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " ldr r1, [r5]\n" + " strb r0, [r1, #0x2]\n" + " ldr r2, [r5]\n" + " ldrb r1, [r2, #0x2]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._668 + 24\n" + " add r0, r0, r1\n" + " ldr r3, ._668 + 28\n" + " mov r9, r3\n" + " str r3, [r0]\n" + " ldrb r0, [r2, #0x2]\n" + " lsl r1, r0, #0x4\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " ldr r6, ._668 + 32\n" + " add r1, r1, r6\n" + " ldrb r2, [r1, #0x5]\n" + " mov r6, #0xd\n" + " neg r6, r6\n" + " add r0, r6, #0\n" + " and r0, r0, r2\n" + " strb r0, [r1, #0x5]\n" + " ldr r4, [r5]\n" + " ldrh r2, [r4]\n" + " lsl r0, r2, #0x3\n" + " ldr r1, ._668 + 36\n" + " add r0, r0, r1\n" + " ldr r1, ._668 + 40\n" + " lsl r2, r2, #0x2\n" + " add r2, r2, r1\n" + " ldrb r1, [r2]\n" + " ldrb r2, [r2, #0x1]\n" + " mov r7, r8\n" + " ldr r3, [r7, #0x8]\n" + " str r3, [sp]\n" + " ldrh r3, [r4]\n" + " str r3, [sp, #0x4]\n" + " ldr r3, [sp, #0x8]\n" + " bl DecompressPicFromTable_2\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._668 + 16\n" + " add r0, r0, r1\n" + " bl LoadCompressedObjectPalette\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " mov r1, #0x2\n" + " bl GetMonSpriteTemplate_803C56C\n" + " ldr r0, ._668 + 20\n" + " mov r1, #0x28\n" + " mov r2, #0x78\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " ldr r1, [r5]\n" + " strb r0, [r1, #0x3]\n" + " ldr r2, [r5]\n" + " ldrb r1, [r2, #0x3]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r3, ._668 + 24\n" + " add r0, r0, r3\n" + " mov r7, r9\n" + " str r7, [r0]\n" + " ldrb r1, [r2, #0x3]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._668 + 32\n" + " add r0, r0, r1\n" + " ldrb r1, [r0, #0x5]\n" + " and r6, r6, r1\n" + " strb r6, [r0, #0x5]\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " ldr r1, ._668 + 44\n" + " mov r2, #0x0\n" + " str r2, [sp]\n" + " str r2, [sp, #0x4]\n" + " mov r2, #0x68\n" + " mov r3, #0x2c\n" + " bl CreateMonIcon\n" + " ldr r1, [r5]\n" + " strb r0, [r1, #0x4]\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " bl SpeciesToNationalPokedexNum\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r2, #0xff\n" + " lsl r2, r2, #0x2\n" + " mov r1, #0x2\n" + " bl sub_8091738\n" + " ldr r1, ._668 + 48\n" + " ldr r3, ._668 + 52\n" + " add r0, r3, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r6, ._668 + 56\n" + " add r0, r6, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x3e\n" + " ldr r7, ._668 + 60\n" + " add r0, r7, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r2, ._668 + 64\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " mov r1, #0x11\n" + " mov r2, #0x3\n" + " bl debug_80C3800\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " mov r1, #0x1a\n" + " mov r2, #0x5\n" + " bl debug_80C376C\n" + " ldr r2, [r5]\n" + " ldrb r1, [r2, #0x2]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r3, ._668 + 32\n" + " add r0, r0, r3\n" + " ldrb r0, [r0, #0x5]\n" + " lsr r0, r0, #0x4\n" + " strb r0, [r2, #0x6]\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x6]\n" + " lsl r0, r0, #0x5\n" + " ldr r4, ._668 + 68\n" + " add r0, r0, r4\n" + " ldr r6, ._668 + 72\n" + " add r1, r4, r6\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x6]\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r4\n" + " ldr r1, ._668 + 76\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r1, ._668 + 80\n" + " mov r7, sl\n" + " lsl r0, r7, #0x2\n" + " add r0, r0, sl\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._668 + 84\n" + " str r1, [r0]\n" + " ldr r0, [r5]\n" + " mov r1, #0x0\n" + " strb r1, [r0, #0x9]\n" + " bl StopCryAndClearCrySongs\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " mov r1, #0x0\n" + " bl PlayCry1\n" + " add sp, sp, #0xc\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._669:\n" + " .align 2, 0\n" + "._668:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gMonFrontPicTable\n" + " .word gMonFrontPicCoords\n" + " .word gUnknown_081FAF4C\n" + " .word gMonPaletteTable\n" + " .word gUnknown_02024E8C\n" + " .word gSprites+0x1c\n" + " .word debug_69+1\n" + " .word gSprites\n" + " .word gMonBackPicTable\n" + " .word gMonBackPicCoords\n" + " .word sub_809D62C+1\n" + " .word 0x600f858\n" + " .word 0xf3fc\n" + " .word 0xf3fd\n" + " .word 0xf3fe\n" + " .word 0xf3ff\n" + " .word gPlttBufferUnfaded+0x200\n" + " .word 0xffffff00\n" + " .word gPlttBufferFaded+0x100\n" + " .word gTasks\n" + " .word debug_80C6EE8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C6EE8() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " lsl r6, r6, #0x18\n" + " lsr r6, r6, #0x18\n" + " ldr r4, ._670\n" + " ldr r5, ._670 + 4\n" + " ldr r1, [r5]\n" + " add r1, r1, #0x10\n" + " add r0, r4, #0\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r0, ._670 + 8\n" + " add r4, r4, r0\n" + " ldr r3, [r5]\n" + " ldrb r0, [r3, #0x7]\n" + " add r0, r0, #0x81\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r4\n" + " ldrh r4, [r0]\n" + " mov r1, #0x1f\n" + " and r1, r1, r4\n" + " ldrb r2, [r3, #0xc]\n" + " mov r0, #0x20\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r3, #0xc]\n" + " ldr r3, [r5]\n" + " mov r1, #0xf8\n" + " lsl r1, r1, #0x2\n" + " and r1, r1, r4\n" + " ldrh r2, [r3, #0xc]\n" + " ldr r0, ._670 + 12\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strh r0, [r3, #0xc]\n" + " mov r1, #0xf8\n" + " lsl r1, r1, #0x7\n" + " and r1, r1, r4\n" + " lsr r1, r1, #0x8\n" + " ldrb r2, [r3, #0xd]\n" + " mov r0, #0x7d\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r3, #0xd]\n" + " ldr r2, [r5]\n" + " ldrb r1, [r2, #0xd]\n" + " mov r0, #0x7f\n" + " and r0, r0, r1\n" + " strb r0, [r2, #0xd]\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x7]\n" + " add r0, r0, #0x1\n" + " mov r1, #0xb\n" + " mov r2, #0xa\n" + " mov r3, #0x2\n" + " bl debug_80C68CC\n" + " ldr r0, ._670 + 16\n" + " mov r1, #0xd\n" + " mov r2, #0xa\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0xe\n" + " mov r2, #0xa\n" + " mov r3, #0x4\n" + " bl debug_80C68CC\n" + " ldr r1, ._670 + 20\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._670 + 24\n" + " str r1, [r0]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._671:\n" + " .align 2, 0\n" + "._670:\n" + " .word gPlttBufferUnfaded+0x100\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0xffffff00\n" + " .word 0xfffffc1f\n" + " .word gUnknown_Debug_083F8813\n" + " .word gTasks\n" + " .word debug_80C6FA8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C6FA8() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " ldr r1, ._674\n" + " ldrh r2, [r1, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " add r4, r1, #0\n" + " cmp r0, #0\n" + " beq ._672 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._674 + 4\n" + " bl SetMainCallback2\n" + " ldr r1, ._674 + 8\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._674 + 12\n" + " str r1, [r0]\n" + " b ._703\n" + "._675:\n" + " .align 2, 0\n" + "._674:\n" + " .word gMain\n" + " .word debug_80C370C+1\n" + " .word gTasks\n" + " .word debug_80C373C+1\n" + "._672:\n" + " ldrh r1, [r4, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._676 @cond_branch\n" + " ldr r4, ._678\n" + " ldr r0, [r4]\n" + " ldrh r1, [r0]\n" + " mov r0, #0x0\n" + " b ._677\n" + "._679:\n" + " .align 2, 0\n" + "._678:\n" + " .word unk_debug_ewram_0+0x34\n" + "._676:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._680 @cond_branch\n" + " ldr r4, ._682\n" + " ldr r0, [r4]\n" + " ldrh r1, [r0]\n" + " mov r0, #0x1\n" + "._677:\n" + " bl debug_80C3878\n" + " ldr r1, [r4]\n" + " strh r0, [r1]\n" + " ldr r1, ._682 + 4\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._682 + 8\n" + " str r1, [r0]\n" + " b ._703\n" + "._683:\n" + " .align 2, 0\n" + "._682:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gTasks\n" + " .word debug_80C71FC+1\n" + "._680:\n" + " mov r3, #0x1\n" + " and r3, r3, r2\n" + " cmp r3, #0\n" + " beq ._684 @cond_branch\n" + " ldr r0, ._686\n" + " ldr r1, [r0]\n" + " mov r0, #0x1\n" + " strb r0, [r1, #0x5]\n" + " ldr r1, ._686 + 4\n" + " ldr r2, ._686 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._686 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._686 + 16\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._686 + 20\n" + " str r1, [r0]\n" + " b ._703\n" + "._687:\n" + " .align 2, 0\n" + "._686:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x4000040\n" + " .word 0x51ef\n" + " .word 0x4167\n" + " .word gTasks\n" + " .word debug_80C7294+1\n" + "._684:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._689 @cond_branch\n" + " ldr r1, ._691\n" + " ldr r2, [r1]\n" + " ldrb r0, [r2, #0x7]\n" + " cmp r0, #0xd\n" + " bhi ._689 @cond_branch\n" + " lsl r0, r0, #0x1\n" + " ldr r2, ._691 + 4\n" + " add r0, r0, r2\n" + " strh r3, [r0]\n" + " ldr r1, [r1]\n" + " ldrb r0, [r1, #0x7]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1, #0x7]\n" + " b ._695\n" + "._692:\n" + " .align 2, 0\n" + "._691:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x5000102\n" + "._689:\n" + " ldrh r1, [r4, #0x30]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._694 @cond_branch\n" + " ldr r2, ._696\n" + " ldr r1, [r2]\n" + " ldrb r0, [r1, #0x7]\n" + " cmp r0, #0\n" + " beq ._694 @cond_branch\n" + " lsl r0, r0, #0x1\n" + " ldr r1, ._696 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " ldr r1, [r2]\n" + " ldrb r0, [r1, #0x7]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0x7]\n" + " b ._695\n" + "._697:\n" + " .align 2, 0\n" + "._696:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x5000102\n" + "._694:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._698 @cond_branch\n" + " ldr r4, ._701\n" + " ldr r2, [r4]\n" + " ldrb r0, [r2, #0x9]\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " strb r0, [r2, #0x9]\n" + " ldr r1, [r4]\n" + " ldrb r0, [r1, #0x9]\n" + " cmp r0, #0\n" + " beq ._699 @cond_branch\n" + " ldrh r0, [r1]\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " bl species_and_otid_get_pal\n" + " ldr r1, [r4]\n" + " ldrb r1, [r1, #0x6]\n" + " lsl r1, r1, #0x14\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x11\n" + " add r1, r1, r2\n" + " lsr r1, r1, #0x10\n" + " mov r2, #0x20\n" + " bl LoadCompressedPalette\n" + " b ._700\n" + "._702:\n" + " .align 2, 0\n" + "._701:\n" + " .word unk_debug_ewram_0+0x34\n" + "._699:\n" + " ldrh r0, [r1]\n" + " mov r1, #0x0\n" + " mov r2, #0x9\n" + " bl species_and_otid_get_pal\n" + " ldr r1, [r4]\n" + " ldrb r1, [r1, #0x6]\n" + " lsl r1, r1, #0x14\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x11\n" + " add r1, r1, r2\n" + " lsr r1, r1, #0x10\n" + " mov r2, #0x20\n" + " bl LoadCompressedPalette\n" + "._700:\n" + " ldr r5, ._704\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x6]\n" + " lsl r0, r0, #0x5\n" + " ldr r4, ._704 + 4\n" + " add r0, r0, r4\n" + " ldr r2, ._704 + 8\n" + " add r1, r4, r2\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x6]\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r4\n" + " ldr r1, ._704 + 12\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + "._695:\n" + " ldr r1, ._704 + 16\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._704 + 20\n" + " str r1, [r0]\n" + " b ._703\n" + "._705:\n" + " .align 2, 0\n" + "._704:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gPlttBufferUnfaded+0x200\n" + " .word 0xffffff00\n" + " .word gPlttBufferFaded+0x100\n" + " .word gTasks\n" + " .word debug_80C6EE8+1\n" + "._698:\n" + " mov r0, #0x4\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._706 @cond_branch\n" + " bl StopCryAndClearCrySongs\n" + " ldr r0, ._707\n" + " ldr r0, [r0]\n" + " ldrh r0, [r0]\n" + " mov r1, #0x0\n" + " bl PlayCry1\n" + "._706:\n" + " ldr r2, ._707\n" + " ldr r1, [r2]\n" + " ldrb r0, [r1, #0x8]\n" + " add r0, r0, #0x4\n" + " strb r0, [r1, #0x8]\n" + " ldr r3, [r2]\n" + " ldrb r1, [r3, #0x8]\n" + " mov r0, #0x1f\n" + " and r0, r0, r1\n" + " strb r0, [r3, #0x8]\n" + " ldr r0, [r2]\n" + " ldrb r1, [r0, #0x7]\n" + " lsl r1, r1, #0x1\n" + " ldr r2, ._707 + 4\n" + " add r1, r1, r2\n" + " ldr r2, ._707 + 8\n" + " ldrb r0, [r0, #0x8]\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r2\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + "._703:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._708:\n" + " .align 2, 0\n" + "._707:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x5000142\n" + " .word gUnknown_Debug_083F8790\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C71FC() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " ldr r6, ._709\n" + " ldr r4, ._709 + 4\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x2]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldrb r0, [r0, #0x5]\n" + " lsr r0, r0, #0x4\n" + " bl GetSpritePaletteTagByPaletteNum\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl FreeSpritePaletteByTag\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x2]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " bl DestroySprite\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x3]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldrb r0, [r0, #0x5]\n" + " lsr r0, r0, #0x4\n" + " bl GetSpritePaletteTagByPaletteNum\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl FreeSpritePaletteByTag\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x3]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " bl DestroySprite\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x4]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " bl sub_809D510\n" + " ldr r1, ._709 + 8\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._709 + 12\n" + " str r1, [r0]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._710:\n" + " .align 2, 0\n" + "._709:\n" + " .word gSprites\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gTasks\n" + " .word debug_80C6CB8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C7294() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " ldr r0, ._713\n" + " ldrh r2, [r0, #0x2e]\n" + " mov r1, #0x1\n" + " and r1, r1, r2\n" + " add r3, r0, #0\n" + " cmp r1, #0\n" + " beq ._711 @cond_branch\n" + " ldr r0, ._713 + 4\n" + " ldr r1, [r0]\n" + " mov r0, #0x0\n" + " strb r0, [r1, #0x5]\n" + " ldr r1, ._713 + 8\n" + " ldr r2, ._713 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._713 + 16\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " b ._712\n" + "._714:\n" + " .align 2, 0\n" + "._713:\n" + " .word gMain\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x4000040\n" + " .word 0x51ef\n" + " .word 0x699f\n" + "._711:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._715 @cond_branch\n" + " ldr r6, ._717\n" + " ldr r0, [r6]\n" + " strb r1, [r0, #0x5]\n" + " ldr r1, ._717 + 4\n" + " ldr r2, ._717 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._717 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r0, [r6]\n" + " add r0, r0, #0x10\n" + " ldr r4, ._717 + 16\n" + " add r1, r4, #0\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r0, [r6]\n" + " add r0, r0, #0x10\n" + " ldr r5, ._717 + 20\n" + " add r1, r5, #0\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r1, [r6]\n" + " add r0, r1, #0\n" + " add r0, r0, #0x10\n" + " ldrb r1, [r1, #0x6]\n" + " lsl r1, r1, #0x5\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r4, r4, r2\n" + " add r1, r1, r4\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r1, [r6]\n" + " add r0, r1, #0\n" + " add r0, r0, #0x10\n" + " ldrb r1, [r1, #0x6]\n" + " lsl r1, r1, #0x5\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r5, r5, r2\n" + " add r1, r1, r5\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + "._712:\n" + " ldr r1, ._717 + 24\n" + " lsl r0, r7, #0x2\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._717 + 28\n" + " str r1, [r0]\n" + " b ._754\n" + "._718:\n" + " .align 2, 0\n" + "._717:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x4000040\n" + " .word 0x51ef\n" + " .word 0x699f\n" + " .word gPlttBufferUnfaded+0x100\n" + " .word gPlttBufferFaded+0x100\n" + " .word gTasks\n" + " .word debug_80C6EE8+1\n" + "._715:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._720 @cond_branch\n" + " ldr r0, ._722\n" + " ldr r1, [r0]\n" + " ldrb r0, [r1, #0xa]\n" + " cmp r0, #0x1\n" + " bhi ._720 @cond_branch\n" + " add r0, r0, #0x1\n" + " strb r0, [r1, #0xa]\n" + " b ._754\n" + "._723:\n" + " .align 2, 0\n" + "._722:\n" + " .word unk_debug_ewram_0+0x34\n" + "._720:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._725 @cond_branch\n" + " ldr r0, ._727\n" + " ldr r1, [r0]\n" + " ldrb r0, [r1, #0xa]\n" + " cmp r0, #0\n" + " beq ._725 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0xa]\n" + " b ._754\n" + "._728:\n" + " .align 2, 0\n" + "._727:\n" + " .word unk_debug_ewram_0+0x34\n" + "._725:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._729 @cond_branch\n" + " ldr r0, ._734\n" + " ldr r2, [r0]\n" + " ldrb r0, [r2, #0xa]\n" + " cmp r0, #0x1\n" + " beq ._730 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._731 @cond_branch\n" + " cmp r0, #0\n" + " beq ._732 @cond_branch\n" + " b ._754\n" + "._735:\n" + " .align 2, 0\n" + "._734:\n" + " .word unk_debug_ewram_0+0x34\n" + "._731:\n" + " cmp r0, #0x2\n" + " beq ._736 @cond_branch\n" + " b ._754\n" + "._732:\n" + " ldrb r3, [r2, #0xc]\n" + " lsl r1, r3, #0x1b\n" + " lsr r0, r1, #0x1b\n" + " cmp r0, #0x1e\n" + " bhi ._761 @cond_branch\n" + " add r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " mov r1, #0x20\n" + " neg r1, r1\n" + " and r1, r1, r3\n" + " orr r1, r1, r0\n" + " strb r1, [r2, #0xc]\n" + " b ._761\n" + "._730:\n" + " ldrh r3, [r2, #0xc]\n" + " lsl r1, r3, #0x16\n" + " lsr r0, r1, #0x1b\n" + " cmp r0, #0x1e\n" + " bhi ._761 @cond_branch\n" + " add r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " ldr r1, ._742\n" + " and r1, r1, r3\n" + " orr r1, r1, r0\n" + " strh r1, [r2, #0xc]\n" + " b ._761\n" + "._743:\n" + " .align 2, 0\n" + "._742:\n" + " .word 0xfffffc1f\n" + "._736:\n" + " ldrb r3, [r2, #0xd]\n" + " lsl r1, r3, #0x19\n" + " lsr r0, r1, #0x1b\n" + " cmp r0, #0x1e\n" + " bhi ._761 @cond_branch\n" + " add r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " mov r1, #0x7d\n" + " neg r1, r1\n" + " and r1, r1, r3\n" + " orr r1, r1, r0\n" + " strb r1, [r2, #0xd]\n" + " b ._761\n" + "._729:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._754 @cond_branch\n" + " ldr r0, ._751\n" + " ldr r3, [r0]\n" + " ldrb r0, [r3, #0xa]\n" + " cmp r0, #0x1\n" + " beq ._747 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._748 @cond_branch\n" + " cmp r0, #0\n" + " beq ._749 @cond_branch\n" + " b ._754\n" + "._752:\n" + " .align 2, 0\n" + "._751:\n" + " .word unk_debug_ewram_0+0x34\n" + "._748:\n" + " cmp r0, #0x2\n" + " beq ._753 @cond_branch\n" + " b ._754\n" + "._749:\n" + " ldrb r2, [r3, #0xc]\n" + " mov r0, #0x1f\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._761 @cond_branch\n" + " lsl r0, r2, #0x1b\n" + " lsr r0, r0, #0x1b\n" + " sub r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " mov r1, #0x20\n" + " neg r1, r1\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r3, #0xc]\n" + " b ._761\n" + "._747:\n" + " ldrh r2, [r3, #0xc]\n" + " mov r0, #0xf8\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._761 @cond_branch\n" + " lsl r0, r2, #0x16\n" + " lsr r0, r0, #0x1b\n" + " sub r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " ldr r1, ._759\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strh r1, [r3, #0xc]\n" + " b ._761\n" + "._760:\n" + " .align 2, 0\n" + "._759:\n" + " .word 0xfffffc1f\n" + "._753:\n" + " ldrb r2, [r3, #0xd]\n" + " mov r0, #0x7c\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._761 @cond_branch\n" + " lsl r0, r2, #0x19\n" + " lsr r0, r0, #0x1b\n" + " sub r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " mov r1, #0x7d\n" + " neg r1, r1\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r3, #0xd]\n" + "._761:\n" + " ldr r0, ._762\n" + " lsl r1, r7, #0x2\n" + " add r1, r1, r7\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._762 + 4\n" + " str r0, [r1]\n" + "._754:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._763:\n" + " .align 2, 0\n" + "._762:\n" + " .word gTasks\n" + " .word debug_80C74E4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C74E4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " ldr r0, ._764\n" + " ldr r3, [r0]\n" + " ldrb r0, [r3, #0xc]\n" + " lsl r0, r0, #0x1b\n" + " lsr r0, r0, #0x1b\n" + " ldrh r2, [r3, #0xc]\n" + " mov r1, #0xf8\n" + " lsl r1, r1, #0x2\n" + " and r1, r1, r2\n" + " add r0, r0, r1\n" + " ldrb r1, [r3, #0xd]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1b\n" + " lsl r1, r1, #0xa\n" + " add r0, r0, r1\n" + " ldr r6, ._764 + 4\n" + " ldrb r1, [r3, #0x7]\n" + " add r1, r1, #0x81\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r6\n" + " strh r0, [r1]\n" + " ldr r1, ._764 + 8\n" + " mov r8, r1\n" + " ldrb r1, [r3, #0x7]\n" + " add r1, r1, #0x81\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r8\n" + " strh r0, [r1]\n" + " ldrb r1, [r3, #0x6]\n" + " lsl r1, r1, #0x4\n" + " ldrb r2, [r3, #0x7]\n" + " ldr r4, ._764 + 12\n" + " add r2, r2, r4\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r6\n" + " strh r0, [r1]\n" + " ldrb r1, [r3, #0x6]\n" + " lsl r1, r1, #0x4\n" + " ldrb r2, [r3, #0x7]\n" + " add r2, r2, r4\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r8\n" + " strh r0, [r1]\n" + " mov r1, #0xe\n" + " mov r2, #0xa\n" + " mov r3, #0x4\n" + " bl debug_80C68CC\n" + " ldr r1, ._764 + 16\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._764 + 20\n" + " str r1, [r0]\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._765:\n" + " .align 2, 0\n" + "._764:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gPlttBufferUnfaded\n" + " .word gPlttBufferFaded\n" + " .word 0x101\n" + " .word gTasks\n" + " .word debug_80C7294+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C7584() +{ + asm( + " push {r4, lr}\n" + " add r2, r0, #0\n" + " ldr r0, ._771\n" + " ldr r3, [r0]\n" + " ldrb r1, [r3, #0x5]\n" + " add r4, r0, #0\n" + " cmp r1, #0\n" + " beq ._766 @cond_branch\n" + " mov r1, #0x2e\n" + " ldsh r0, [r2, r1]\n" + " cmp r0, #0x1\n" + " beq ._767 @cond_branch\n" + " cmp r0, #0x1\n" + " ble ._768 @cond_branch\n" + " cmp r0, #0x2\n" + " beq ._769 @cond_branch\n" + "._768:\n" + " ldrb r0, [r3, #0xc]\n" + " lsl r0, r0, #0x1b\n" + " b ._773\n" + "._772:\n" + " .align 2, 0\n" + "._771:\n" + " .word unk_debug_ewram_0+0x34\n" + "._767:\n" + " ldrh r0, [r3, #0xc]\n" + " lsl r0, r0, #0x16\n" + " b ._773\n" + "._769:\n" + " ldrb r0, [r3, #0xd]\n" + " lsl r0, r0, #0x19\n" + "._773:\n" + " lsr r0, r0, #0x1b\n" + " lsl r0, r0, #0x2\n" + " strh r0, [r2, #0x24]\n" + " mov r1, #0x2e\n" + " ldsh r0, [r2, r1]\n" + " lsl r0, r0, #0x3\n" + " strh r0, [r2, #0x26]\n" + " ldrh r0, [r2, #0x30]\n" + " add r3, r0, #1\n" + " strh r3, [r2, #0x30]\n" + " mov r0, #0x2e\n" + " ldsh r1, [r2, r0]\n" + " ldr r0, [r4]\n" + " ldrb r0, [r0, #0xa]\n" + " cmp r1, r0\n" + " bne ._775 @cond_branch\n" + " mov r0, #0x8\n" + " and r3, r3, r0\n" + " cmp r3, #0\n" + " bne ._775 @cond_branch\n" + "._766:\n" + " add r0, r2, #0\n" + " add r0, r0, #0x3e\n" + " ldrb r1, [r0]\n" + " mov r2, #0x4\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + " b ._776\n" + "._775:\n" + " add r2, r2, #0x3e\n" + " ldrb r1, [r2]\n" + " mov r0, #0x5\n" + " neg r0, r0\n" + " and r0, r0, r1\n" + " strb r0, [r2]\n" + "._776:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void InitSeeTrainers() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " bl debug_80C35DC\n" + " ldr r1, ._777\n" + " ldr r2, ._777 + 4\n" + " ldr r0, ._777 + 8\n" + " str r1, [r0]\n" + " str r2, [r0, #0x4]\n" + " ldr r1, ._777 + 12\n" + " str r1, [r0, #0x8]\n" + " ldr r0, [r0, #0x8]\n" + " ldr r0, ._777 + 16\n" + " mov r1, #0x80\n" + " mov r2, #0x60\n" + " bl LoadPalette\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r5, #0x0\n" + " str r5, [sp]\n" + " mov r1, #0x0\n" + " mov r2, #0x10\n" + " mov r3, #0x0\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._777 + 20\n" + " mov r6, #0x0\n" + " strh r5, [r0]\n" + " add r0, r0, #0x4\n" + " strh r5, [r0]\n" + " sub r0, r0, #0x2\n" + " strh r5, [r0]\n" + " add r0, r0, #0x4\n" + " strh r5, [r0]\n" + " ldr r1, ._777 + 24\n" + " mov r0, #0x3f\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " mov r0, #0x1f\n" + " strh r0, [r1]\n" + " add r1, r1, #0x6\n" + " mov r0, #0xf1\n" + " strh r0, [r1]\n" + " ldr r0, ._777 + 28\n" + " strh r5, [r0]\n" + " add r1, r1, #0x4\n" + " mov r0, #0x7\n" + " strh r0, [r1]\n" + " ldr r3, ._777 + 32\n" + " ldrh r2, [r3]\n" + " strh r5, [r3]\n" + " ldr r4, ._777 + 36\n" + " ldrh r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strh r0, [r4]\n" + " strh r2, [r3]\n" + " ldr r0, ._777 + 40\n" + " bl SetVBlankCallback\n" + " ldr r0, ._777 + 44\n" + " bl SetMainCallback2\n" + " ldr r1, ._777 + 48\n" + " ldr r2, ._777 + 52\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r2, ._777 + 56\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " sub r1, r1, #0xa\n" + " mov r2, #0xcd\n" + " lsl r2, r2, #0x6\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r0, ._777 + 60\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " ldr r1, ._777 + 64\n" + " ldr r0, ._777 + 68\n" + " str r0, [r1]\n" + " strh r5, [r0]\n" + " strb r6, [r0, #0x2]\n" + " strb r6, [r0, #0x3]\n" + " strb r6, [r0, #0x5]\n" + " strb r6, [r0, #0x7]\n" + " strb r6, [r0, #0xa]\n" + " strb r6, [r0, #0x8]\n" + " ldr r4, ._777 + 72\n" + " add r0, r4, #0\n" + " mov r1, #0x6c\n" + " mov r2, #0x74\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " ldr r6, ._777 + 76\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " strh r5, [r0, #0x2e]\n" + " mov r1, #0x0\n" + " bl StartSpriteAnim\n" + " add r0, r4, #0\n" + " mov r1, #0x6c\n" + " mov r2, #0x74\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " mov r1, #0x1\n" + " strh r1, [r0, #0x2e]\n" + " bl StartSpriteAnim\n" + " add r0, r4, #0\n" + " mov r1, #0x6c\n" + " mov r2, #0x74\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " mov r1, #0x2\n" + " strh r1, [r0, #0x2e]\n" + " bl StartSpriteAnim\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._778:\n" + " .align 2, 0\n" + "._777:\n" + " .word byte_83F88EC\n" + " .word 0x600e000\n" + " .word 0x40000d4\n" + " .word 0x80000400\n" + " .word word_83F888C\n" + " .word 0x4000040\n" + " .word 0x4000048\n" + " .word 0x4000052\n" + " .word 0x4000208\n" + " .word 0x4000200\n" + " .word debug_80C3758+1\n" + " .word debug_80C370C+1\n" + " .word 0x4000008\n" + " .word 0x1f0b\n" + " .word 0x1e0a\n" + " .word debug_80C777C+1\n" + " .word unk_debug_ewram_0+0x34\n" + " .word +0x2018000\n" + " .word unk_83F8868+0xc\n" + " .word gSprites\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C777C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xffffffec\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " ldr r1, ._784\n" + " mov r0, sp\n" + " mov r2, #0x12\n" + " bl memcpy\n" + " mov r0, #0x9\n" + " mov r1, #0x0\n" + " mov r2, #0xe\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x9\n" + " mov r3, #0x9\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x0\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0xe\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._784 + 4\n" + " mov r1, #0xf\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._784 + 8\n" + " mov r1, #0x19\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._784 + 12\n" + " mov r1, #0xf\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, #0xa\n" + " mov r1, #0x8\n" + " mov r2, #0x1d\n" + " mov r3, #0xc\n" + " bl MenuDrawTextWindow\n" + " mov r2, #0x0\n" + " ldr r4, ._784 + 16\n" + " ldr r0, ._784 + 20\n" + " add r3, r0, #0\n" + "._779:\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r4\n" + " add r1, r2, r3\n" + " strh r1, [r0]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0xe\n" + " bls ._779 @cond_branch\n" + " mov r2, #0x0\n" + " ldr r5, ._784 + 24\n" + " lsl r6, r7, #0x2\n" + " mov r8, r6\n" + " ldr r4, ._784 + 28\n" + " ldr r0, ._784 + 32\n" + " add r3, r0, #0\n" + "._780:\n" + " lsl r0, r2, #0x1\n" + " add r0, r0, r4\n" + " add r1, r2, r3\n" + " strh r1, [r0]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0xe\n" + " bls ._780 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0x14\n" + " mov r2, #0xa\n" + " bl MenuPrint\n" + " mov r0, #0xa\n" + " mov r1, #0xd\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r1, sp\n" + " mov r0, #0x23\n" + " strb r0, [r1]\n" + " mov r2, #0x0\n" + " ldr r4, ._784 + 36\n" + " mov r5, #0x93\n" + " lsl r5, r5, #0x8\n" + " add r3, r5, #0\n" + "._781:\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r4\n" + " mov r6, sp\n" + " add r0, r6, r2\n" + " ldrb r0, [r0]\n" + " add r0, r0, r3\n" + " strh r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x11\n" + " bls ._781 @cond_branch\n" + " mov r1, sp\n" + " mov r0, #0x24\n" + " strb r0, [r1]\n" + " mov r2, #0x0\n" + " ldr r5, ._784 + 40\n" + " ldr r4, ._784 + 44\n" + " mov r0, #0x93\n" + " lsl r0, r0, #0x8\n" + " add r3, r0, #0\n" + "._782:\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r4\n" + " mov r6, sp\n" + " add r0, r6, r2\n" + " ldrb r0, [r0]\n" + " add r0, r0, r3\n" + " strh r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x11\n" + " bls ._782 @cond_branch\n" + " mov r1, sp\n" + " mov r0, #0x25\n" + " strb r0, [r1]\n" + " mov r2, #0x0\n" + " ldr r4, ._784 + 48\n" + " mov r0, #0x93\n" + " lsl r0, r0, #0x8\n" + " add r3, r0, #0\n" + "._783:\n" + " lsl r1, r2, #0x1\n" + " add r1, r1, r4\n" + " mov r6, sp\n" + " add r0, r6, r2\n" + " ldrb r0, [r0]\n" + " add r0, r0, r3\n" + " strh r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x11\n" + " bls ._783 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0xf\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " ldr r1, ._784 + 52\n" + " ldr r2, ._784 + 56\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r5, ._784 + 60\n" + " add r0, r5, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._784 + 64\n" + " mov r6, r8\n" + " add r0, r6, r7\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._784 + 68\n" + " str r1, [r0]\n" + " add sp, sp, #0x14\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._785:\n" + " .align 2, 0\n" + "._784:\n" + " .word gUnknown_Debug_083F8815\n" + " .word gUnknown_Debug_083F87D0\n" + " .word gUnknown_Debug_083F87D8\n" + " .word gUnknown_Debug_083F87E0\n" + " .word 0x600fa56\n" + " .word 0xa311\n" + " .word gUnknown_Debug_083F87F4\n" + " .word 0x600f256\n" + " .word 0x8301\n" + " .word 0x600f396\n" + " .word gUnknown_Debug_083F8801\n" + " .word 0x600f3d6\n" + " .word 0x600f416\n" + " .word 0x4000040\n" + " .word 0x51ef\n" + " .word 0x699f\n" + " .word gTasks\n" + " .word debug_80C7934+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C7934() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add sp, sp, #0xfffffff8\n" + " mov r8, r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " ldr r5, ._786\n" + " ldr r6, [r5]\n" + " ldrh r2, [r6]\n" + " lsl r0, r2, #0x3\n" + " ldr r1, ._786 + 4\n" + " add r0, r0, r1\n" + " ldr r1, ._786 + 8\n" + " lsl r2, r2, #0x2\n" + " add r2, r2, r1\n" + " ldrb r1, [r2]\n" + " ldrb r2, [r2, #0x1]\n" + " ldr r4, ._786 + 12\n" + " ldr r3, [r4]\n" + " ldr r4, [r4, #0x4]\n" + " str r4, [sp]\n" + " ldrh r4, [r6]\n" + " str r4, [sp, #0x4]\n" + " bl DecompressPicFromTable_2\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._786 + 16\n" + " add r0, r0, r1\n" + " bl LoadCompressedObjectPalette\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " mov r1, #0x1\n" + " bl GetMonSpriteTemplate_803C5A0\n" + " ldr r0, ._786 + 20\n" + " mov r1, #0x28\n" + " mov r2, #0x28\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " ldr r1, [r5]\n" + " mov r6, #0x0\n" + " strb r0, [r1, #0x2]\n" + " ldr r4, ._786 + 24\n" + " ldr r2, [r5]\n" + " ldrb r1, [r2, #0x2]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r1, r4, #0\n" + " add r1, r1, #0x1c\n" + " add r0, r0, r1\n" + " ldr r1, ._786 + 28\n" + " str r1, [r0]\n" + " ldrb r0, [r2, #0x2]\n" + " lsl r1, r0, #0x4\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r4\n" + " ldrb r2, [r1, #0x5]\n" + " mov r0, #0xd\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " strb r0, [r1, #0x5]\n" + " ldr r0, [r5]\n" + " ldrh r0, [r0]\n" + " mov r1, #0x1a\n" + " mov r2, #0x5\n" + " bl debug_80C376C\n" + " ldr r2, [r5]\n" + " ldrb r1, [r2, #0x2]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r4\n" + " ldrb r0, [r0, #0x5]\n" + " lsr r0, r0, #0x4\n" + " strb r0, [r2, #0x6]\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x6]\n" + " lsl r0, r0, #0x5\n" + " ldr r4, ._786 + 32\n" + " add r0, r0, r4\n" + " ldr r2, ._786 + 36\n" + " add r1, r4, r2\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x6]\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r4\n" + " ldr r1, ._786 + 40\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r1, ._786 + 44\n" + " mov r2, r8\n" + " lsl r0, r2, #0x2\n" + " add r0, r0, r8\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._786 + 48\n" + " str r1, [r0]\n" + " ldr r0, [r5]\n" + " strb r6, [r0, #0x9]\n" + " add sp, sp, #0x8\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._787:\n" + " .align 2, 0\n" + "._786:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gTrainerFrontPicTable\n" + " .word gTrainerFrontPicCoords\n" + " .word gUnknown_081FAF4C\n" + " .word gTrainerFrontPicPaletteTable\n" + " .word gUnknown_02024E8C\n" + " .word gSprites\n" + " .word debug_69+1\n" + " .word gPlttBufferUnfaded+0x200\n" + " .word 0xffffff00\n" + " .word gPlttBufferFaded+0x100\n" + " .word gTasks\n" + " .word debug_80C7A54+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C7A54() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " lsl r6, r6, #0x18\n" + " lsr r6, r6, #0x18\n" + " ldr r4, ._788\n" + " ldr r5, ._788 + 4\n" + " ldr r1, [r5]\n" + " add r1, r1, #0x10\n" + " add r0, r4, #0\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r0, ._788 + 8\n" + " add r4, r4, r0\n" + " ldr r3, [r5]\n" + " ldrb r0, [r3, #0x7]\n" + " add r0, r0, #0x81\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r4\n" + " ldrh r4, [r0]\n" + " mov r1, #0x1f\n" + " and r1, r1, r4\n" + " ldrb r2, [r3, #0xc]\n" + " mov r0, #0x20\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r3, #0xc]\n" + " ldr r3, [r5]\n" + " mov r1, #0xf8\n" + " lsl r1, r1, #0x2\n" + " and r1, r1, r4\n" + " ldrh r2, [r3, #0xc]\n" + " ldr r0, ._788 + 12\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strh r0, [r3, #0xc]\n" + " mov r1, #0xf8\n" + " lsl r1, r1, #0x7\n" + " and r1, r1, r4\n" + " lsr r1, r1, #0x8\n" + " ldrb r2, [r3, #0xd]\n" + " mov r0, #0x7d\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r3, #0xd]\n" + " ldr r2, [r5]\n" + " ldrb r1, [r2, #0xd]\n" + " mov r0, #0x7f\n" + " and r0, r0, r1\n" + " strb r0, [r2, #0xd]\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x7]\n" + " add r0, r0, #0x1\n" + " mov r1, #0xb\n" + " mov r2, #0xa\n" + " mov r3, #0x2\n" + " bl debug_80C68CC\n" + " ldr r0, ._788 + 16\n" + " mov r1, #0xd\n" + " mov r2, #0xa\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " mov r1, #0xe\n" + " mov r2, #0xa\n" + " mov r3, #0x4\n" + " bl debug_80C68CC\n" + " ldr r1, ._788 + 20\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._788 + 24\n" + " str r1, [r0]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._789:\n" + " .align 2, 0\n" + "._788:\n" + " .word gPlttBufferUnfaded+0x100\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0xffffff00\n" + " .word 0xfffffc1f\n" + " .word gUnknown_Debug_083F8813\n" + " .word gTasks\n" + " .word debug_80C7B14+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C7B14() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " ldr r1, ._792\n" + " ldrh r3, [r1, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r3\n" + " add r4, r1, #0\n" + " cmp r0, #0\n" + " beq ._790 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._792 + 4\n" + " bl SetMainCallback2\n" + " ldr r1, ._792 + 8\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._792 + 12\n" + " str r1, [r0]\n" + " b ._821\n" + "._793:\n" + " .align 2, 0\n" + "._792:\n" + " .word gMain\n" + " .word debug_80C370C+1\n" + " .word gTasks\n" + " .word debug_80C373C+1\n" + "._790:\n" + " ldrh r1, [r4, #0x30]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._794 @cond_branch\n" + " ldr r4, ._796\n" + " ldr r0, [r4]\n" + " ldrh r1, [r0]\n" + " mov r0, #0x0\n" + " b ._795\n" + "._797:\n" + " .align 2, 0\n" + "._796:\n" + " .word unk_debug_ewram_0+0x34\n" + "._794:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._798 @cond_branch\n" + " ldr r4, ._800\n" + " ldr r0, [r4]\n" + " ldrh r1, [r0]\n" + " mov r0, #0x1\n" + "._795:\n" + " bl debug_80C38B4\n" + " ldr r1, [r4]\n" + " strh r0, [r1]\n" + " ldr r1, ._800 + 4\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._800 + 8\n" + " str r1, [r0]\n" + " b ._821\n" + "._801:\n" + " .align 2, 0\n" + "._800:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gTasks\n" + " .word debug_80C7D44+1\n" + "._798:\n" + " mov r2, #0x1\n" + " and r2, r2, r3\n" + " cmp r2, #0\n" + " beq ._802 @cond_branch\n" + " ldr r0, ._804\n" + " ldr r1, [r0]\n" + " mov r0, #0x1\n" + " strb r0, [r1, #0x5]\n" + " ldr r1, ._804 + 4\n" + " ldr r2, ._804 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._804 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r1, ._804 + 16\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._804 + 20\n" + " str r1, [r0]\n" + " b ._821\n" + "._805:\n" + " .align 2, 0\n" + "._804:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x4000040\n" + " .word 0x51ef\n" + " .word 0x4167\n" + " .word gTasks\n" + " .word debug_80C7DDC+1\n" + "._802:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " ldr r3, ._809\n" + " cmp r0, #0\n" + " beq ._807 @cond_branch\n" + " ldr r1, [r3]\n" + " ldrb r0, [r1, #0x7]\n" + " cmp r0, #0xd\n" + " bhi ._807 @cond_branch\n" + " lsl r0, r0, #0x1\n" + " ldr r1, ._809 + 4\n" + " add r0, r0, r1\n" + " strh r2, [r0]\n" + " ldr r1, [r3]\n" + " ldrb r0, [r1, #0x7]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1, #0x7]\n" + " b ._813\n" + "._810:\n" + " .align 2, 0\n" + "._809:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x5000102\n" + "._807:\n" + " ldrh r1, [r4, #0x30]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._812 @cond_branch\n" + " ldr r1, [r3]\n" + " ldrb r0, [r1, #0x7]\n" + " cmp r0, #0\n" + " beq ._812 @cond_branch\n" + " lsl r0, r0, #0x1\n" + " ldr r2, ._814\n" + " add r0, r0, r2\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " ldr r1, [r3]\n" + " ldrb r0, [r1, #0x7]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0x7]\n" + " b ._813\n" + "._815:\n" + " .align 2, 0\n" + "._814:\n" + " .word 0x5000102\n" + "._812:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._816 @cond_branch\n" + " ldr r4, ._819\n" + " ldr r2, [r4]\n" + " ldrb r0, [r2, #0x9]\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " strb r0, [r2, #0x9]\n" + " ldr r1, [r4]\n" + " ldrb r0, [r1, #0x9]\n" + " cmp r0, #0\n" + " beq ._817 @cond_branch\n" + " ldrh r0, [r1]\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " bl species_and_otid_get_pal\n" + " ldr r1, [r4]\n" + " ldrb r1, [r1, #0x6]\n" + " lsl r1, r1, #0x14\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x11\n" + " add r1, r1, r2\n" + " lsr r1, r1, #0x10\n" + " mov r2, #0x20\n" + " bl LoadCompressedPalette\n" + " b ._818\n" + "._820:\n" + " .align 2, 0\n" + "._819:\n" + " .word unk_debug_ewram_0+0x34\n" + "._817:\n" + " ldrh r0, [r1]\n" + " mov r1, #0x0\n" + " mov r2, #0x9\n" + " bl species_and_otid_get_pal\n" + " ldr r1, [r4]\n" + " ldrb r1, [r1, #0x6]\n" + " lsl r1, r1, #0x14\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x11\n" + " add r1, r1, r2\n" + " lsr r1, r1, #0x10\n" + " mov r2, #0x20\n" + " bl LoadCompressedPalette\n" + "._818:\n" + " ldr r5, ._822\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x6]\n" + " lsl r0, r0, #0x5\n" + " ldr r4, ._822 + 4\n" + " add r0, r0, r4\n" + " ldr r2, ._822 + 8\n" + " add r1, r4, r2\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r0, [r5]\n" + " ldrb r0, [r0, #0x6]\n" + " lsl r0, r0, #0x5\n" + " add r0, r0, r4\n" + " ldr r1, ._822 + 12\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + "._813:\n" + " ldr r1, ._822 + 16\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._822 + 20\n" + " str r1, [r0]\n" + " b ._821\n" + "._823:\n" + " .align 2, 0\n" + "._822:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gPlttBufferUnfaded+0x200\n" + " .word 0xffffff00\n" + " .word gPlttBufferFaded+0x100\n" + " .word gTasks\n" + " .word debug_80C7A54+1\n" + "._816:\n" + " ldr r1, [r3]\n" + " ldrb r0, [r1, #0x8]\n" + " add r0, r0, #0x4\n" + " strb r0, [r1, #0x8]\n" + " ldr r2, [r3]\n" + " ldrb r1, [r2, #0x8]\n" + " mov r0, #0x1f\n" + " and r0, r0, r1\n" + " strb r0, [r2, #0x8]\n" + " ldr r0, [r3]\n" + " ldrb r1, [r0, #0x7]\n" + " lsl r1, r1, #0x1\n" + " ldr r2, ._824\n" + " add r1, r1, r2\n" + " ldr r2, ._824 + 4\n" + " ldrb r0, [r0, #0x8]\n" + " lsl r0, r0, #0x1\n" + " add r0, r0, r2\n" + " ldrh r0, [r0]\n" + " strh r0, [r1]\n" + "._821:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._825:\n" + " .align 2, 0\n" + "._824:\n" + " .word 0x5000142\n" + " .word gUnknown_Debug_083F8790\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C7D44() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " ldr r6, ._826\n" + " ldr r4, ._826 + 4\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x2]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldrb r0, [r0, #0x5]\n" + " lsr r0, r0, #0x4\n" + " bl GetSpritePaletteTagByPaletteNum\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl FreeSpritePaletteByTag\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x2]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " bl DestroySprite\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x3]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldrb r0, [r0, #0x5]\n" + " lsr r0, r0, #0x4\n" + " bl GetSpritePaletteTagByPaletteNum\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl FreeSpritePaletteByTag\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x3]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " bl DestroySprite\n" + " ldr r0, [r4]\n" + " ldrb r1, [r0, #0x4]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " bl sub_809D510\n" + " ldr r1, ._826 + 8\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._826 + 12\n" + " str r1, [r0]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._827:\n" + " .align 2, 0\n" + "._826:\n" + " .word gSprites\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gTasks\n" + " .word debug_80C7934+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C7DDC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " ldr r0, ._830\n" + " ldrh r2, [r0, #0x2e]\n" + " mov r1, #0x1\n" + " and r1, r1, r2\n" + " add r3, r0, #0\n" + " cmp r1, #0\n" + " beq ._828 @cond_branch\n" + " ldr r0, ._830 + 4\n" + " ldr r1, [r0]\n" + " mov r0, #0x0\n" + " strb r0, [r1, #0x5]\n" + " ldr r1, ._830 + 8\n" + " ldr r2, ._830 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._830 + 16\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " b ._829\n" + "._831:\n" + " .align 2, 0\n" + "._830:\n" + " .word gMain\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x4000040\n" + " .word 0x51ef\n" + " .word 0x699f\n" + "._828:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._832 @cond_branch\n" + " ldr r6, ._834\n" + " ldr r0, [r6]\n" + " strb r1, [r0, #0x5]\n" + " ldr r1, ._834 + 4\n" + " ldr r2, ._834 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x4\n" + " ldr r2, ._834 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " ldr r0, [r6]\n" + " add r0, r0, #0x10\n" + " ldr r4, ._834 + 16\n" + " add r1, r4, #0\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r0, [r6]\n" + " add r0, r0, #0x10\n" + " ldr r5, ._834 + 20\n" + " add r1, r5, #0\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r1, [r6]\n" + " add r0, r1, #0\n" + " add r0, r0, #0x10\n" + " ldrb r1, [r1, #0x6]\n" + " lsl r1, r1, #0x5\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r4, r4, r2\n" + " add r1, r1, r4\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + " ldr r1, [r6]\n" + " add r0, r1, #0\n" + " add r0, r0, #0x10\n" + " ldrb r1, [r1, #0x6]\n" + " lsl r1, r1, #0x5\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r5, r5, r2\n" + " add r1, r1, r5\n" + " mov r2, #0x10\n" + " bl CpuSet\n" + "._829:\n" + " ldr r1, ._834 + 24\n" + " lsl r0, r7, #0x2\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._834 + 28\n" + " str r1, [r0]\n" + " b ._871\n" + "._835:\n" + " .align 2, 0\n" + "._834:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word 0x4000040\n" + " .word 0x51ef\n" + " .word 0x699f\n" + " .word gPlttBufferUnfaded+0x100\n" + " .word gPlttBufferFaded+0x100\n" + " .word gTasks\n" + " .word debug_80C7A54+1\n" + "._832:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._837 @cond_branch\n" + " ldr r0, ._839\n" + " ldr r1, [r0]\n" + " ldrb r0, [r1, #0xa]\n" + " cmp r0, #0x1\n" + " bhi ._837 @cond_branch\n" + " add r0, r0, #0x1\n" + " strb r0, [r1, #0xa]\n" + " b ._871\n" + "._840:\n" + " .align 2, 0\n" + "._839:\n" + " .word unk_debug_ewram_0+0x34\n" + "._837:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._842 @cond_branch\n" + " ldr r0, ._844\n" + " ldr r1, [r0]\n" + " ldrb r0, [r1, #0xa]\n" + " cmp r0, #0\n" + " beq ._842 @cond_branch\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0xa]\n" + " b ._871\n" + "._845:\n" + " .align 2, 0\n" + "._844:\n" + " .word unk_debug_ewram_0+0x34\n" + "._842:\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._846 @cond_branch\n" + " ldr r0, ._851\n" + " ldr r2, [r0]\n" + " ldrb r0, [r2, #0xa]\n" + " cmp r0, #0x1\n" + " beq ._847 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._848 @cond_branch\n" + " cmp r0, #0\n" + " beq ._849 @cond_branch\n" + " b ._871\n" + "._852:\n" + " .align 2, 0\n" + "._851:\n" + " .word unk_debug_ewram_0+0x34\n" + "._848:\n" + " cmp r0, #0x2\n" + " beq ._853 @cond_branch\n" + " b ._871\n" + "._849:\n" + " ldrb r3, [r2, #0xc]\n" + " lsl r1, r3, #0x1b\n" + " lsr r0, r1, #0x1b\n" + " cmp r0, #0x1e\n" + " bhi ._878 @cond_branch\n" + " add r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " mov r1, #0x20\n" + " neg r1, r1\n" + " and r1, r1, r3\n" + " orr r1, r1, r0\n" + " strb r1, [r2, #0xc]\n" + " b ._878\n" + "._847:\n" + " ldrh r3, [r2, #0xc]\n" + " lsl r1, r3, #0x16\n" + " lsr r0, r1, #0x1b\n" + " cmp r0, #0x1e\n" + " bhi ._878 @cond_branch\n" + " add r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " ldr r1, ._859\n" + " and r1, r1, r3\n" + " orr r1, r1, r0\n" + " strh r1, [r2, #0xc]\n" + " b ._878\n" + "._860:\n" + " .align 2, 0\n" + "._859:\n" + " .word 0xfffffc1f\n" + "._853:\n" + " ldrb r3, [r2, #0xd]\n" + " lsl r1, r3, #0x19\n" + " lsr r0, r1, #0x1b\n" + " cmp r0, #0x1e\n" + " bhi ._878 @cond_branch\n" + " add r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " mov r1, #0x7d\n" + " neg r1, r1\n" + " and r1, r1, r3\n" + " orr r1, r1, r0\n" + " strb r1, [r2, #0xd]\n" + " b ._878\n" + "._846:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._871 @cond_branch\n" + " ldr r0, ._868\n" + " ldr r3, [r0]\n" + " ldrb r0, [r3, #0xa]\n" + " cmp r0, #0x1\n" + " beq ._864 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._865 @cond_branch\n" + " cmp r0, #0\n" + " beq ._866 @cond_branch\n" + " b ._871\n" + "._869:\n" + " .align 2, 0\n" + "._868:\n" + " .word unk_debug_ewram_0+0x34\n" + "._865:\n" + " cmp r0, #0x2\n" + " beq ._870 @cond_branch\n" + " b ._871\n" + "._866:\n" + " ldrb r2, [r3, #0xc]\n" + " mov r0, #0x1f\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._878 @cond_branch\n" + " lsl r0, r2, #0x1b\n" + " lsr r0, r0, #0x1b\n" + " sub r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " mov r1, #0x20\n" + " neg r1, r1\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r3, #0xc]\n" + " b ._878\n" + "._864:\n" + " ldrh r2, [r3, #0xc]\n" + " mov r0, #0xf8\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._878 @cond_branch\n" + " lsl r0, r2, #0x16\n" + " lsr r0, r0, #0x1b\n" + " sub r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x5\n" + " ldr r1, ._876\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strh r1, [r3, #0xc]\n" + " b ._878\n" + "._877:\n" + " .align 2, 0\n" + "._876:\n" + " .word 0xfffffc1f\n" + "._870:\n" + " ldrb r2, [r3, #0xd]\n" + " mov r0, #0x7c\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._878 @cond_branch\n" + " lsl r0, r2, #0x19\n" + " lsr r0, r0, #0x1b\n" + " sub r0, r0, #0x1\n" + " mov r1, #0x1f\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " mov r1, #0x7d\n" + " neg r1, r1\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r3, #0xd]\n" + "._878:\n" + " ldr r0, ._879\n" + " lsl r1, r7, #0x2\n" + " add r1, r1, r7\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " ldr r0, ._879 + 4\n" + " str r0, [r1]\n" + "._871:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._880:\n" + " .align 2, 0\n" + "._879:\n" + " .word gTasks\n" + " .word debug_80C802C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_80C802C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " ldr r0, ._881\n" + " ldr r3, [r0]\n" + " ldrb r0, [r3, #0xc]\n" + " lsl r0, r0, #0x1b\n" + " lsr r0, r0, #0x1b\n" + " ldrh r2, [r3, #0xc]\n" + " mov r1, #0xf8\n" + " lsl r1, r1, #0x2\n" + " and r1, r1, r2\n" + " add r0, r0, r1\n" + " ldrb r1, [r3, #0xd]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1b\n" + " lsl r1, r1, #0xa\n" + " add r0, r0, r1\n" + " ldr r6, ._881 + 4\n" + " ldrb r1, [r3, #0x7]\n" + " add r1, r1, #0x81\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r6\n" + " strh r0, [r1]\n" + " ldr r1, ._881 + 8\n" + " mov r8, r1\n" + " ldrb r1, [r3, #0x7]\n" + " add r1, r1, #0x81\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r8\n" + " strh r0, [r1]\n" + " ldrb r1, [r3, #0x6]\n" + " lsl r1, r1, #0x4\n" + " ldrb r2, [r3, #0x7]\n" + " ldr r4, ._881 + 12\n" + " add r2, r2, r4\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r6\n" + " strh r0, [r1]\n" + " ldrb r1, [r3, #0x6]\n" + " lsl r1, r1, #0x4\n" + " ldrb r2, [r3, #0x7]\n" + " add r2, r2, r4\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x1\n" + " add r1, r1, r8\n" + " strh r0, [r1]\n" + " mov r1, #0xe\n" + " mov r2, #0xa\n" + " mov r3, #0x4\n" + " bl debug_80C68CC\n" + " ldr r1, ._881 + 16\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._881 + 20\n" + " str r1, [r0]\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._882:\n" + " .align 2, 0\n" + "._881:\n" + " .word unk_debug_ewram_0+0x34\n" + " .word gPlttBufferUnfaded\n" + " .word gPlttBufferFaded\n" + " .word 0x101\n" + " .word gTasks\n" + " .word debug_80C7DDC+1\n" + "\n" + ); +} + +#endif diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index 44d832e2b..03a64afc6 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -360,6 +360,10 @@ void sub_80831F8(u8 taskId) || sub_8082DF4(taskId) == TRUE) return; +#ifdef DEBUG + sub_8082D60(taskId, GetLinkPlayerCount_2()); +#endif + gSpecialVar_Result = sub_8082D9C(local1, local2); if (gSpecialVar_Result == 0) return; diff --git a/src/engine/clock.c b/src/engine/clock.c index 416aaa6bb..fceccdfcb 100644 --- a/src/engine/clock.c +++ b/src/engine/clock.c @@ -13,12 +13,11 @@ #include "tv.h" #include "wallclock.h" -static void InitTimeBasedEvents(void); static void UpdatePerDay(struct Time *time); static void UpdatePerMinute(struct Time *time); static void ReturnFromStartWallClock(void); -static void InitTimeBasedEvents(void) +void InitTimeBasedEvents(void) { FlagSet(FLAG_SYS_CLOCK_SET); RtcCalcLocalTime(); diff --git a/src/engine/link.c b/src/engine/link.c index 34016d607..502715116 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -1,4 +1,5 @@ #include "global.h" +#include "cable_club.h" #include "link.h" #include "battle.h" #include "berry.h" @@ -543,6 +544,9 @@ static void ProcessRecvCmds(u8 unusedParam) else { SetBlockReceivedFlag(i); +#ifdef DEBUG + debug_sub_808B838(i); +#endif } } break; @@ -975,6 +979,143 @@ static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) } } +#ifdef DEBUG + +EWRAM_DATA u16 *debugCharacterBase = NULL; +EWRAM_DATA void *unk_20238C8 = NULL; +EWRAM_DATA u16 (*debugTileMap)[] = NULL; +EWRAM_DATA u32 unk_20238D0 = 0; + +void debug_sub_8008218(u16 *buffer, void *arg1, u16 (*arg2)[], u32 arg3) +{ + CpuSet(sLinkTestDigitTiles, buffer, 272); + debugCharacterBase = buffer; + unk_20238C8 = arg1; + debugTileMap = arg2; + unk_20238D0 = arg3; +} + +#ifdef NONMATCHING +void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) +{ + u32 buffer[8]; + u32 *ptr; + + u16 *dest; + + int i; + + if (unk_20238D0 != sp0) + return; + + r3 = max(r3, 8); + + ptr = &buffer[0]; + dest = &(*debugTileMap)[left + top * 32]; + + for (i = r3; i != 0; i--) + { + *(ptr++) = value & 0xF; + value = value >> 4; + } + + ptr = &buffer[8 - r3]; + for (i = r3; i != 0; i--) + { + int charOffset = (((uintptr_t) debugCharacterBase) - ((uintptr_t) unk_20238C8)) / 32; + *dest = *ptr + charOffset + 1; + ptr--; + dest++; + } +} +#else +__attribute__((naked)) +void debug_sub_8008264() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xffffffe0\n" + " add r5, r0, #0\n" + " add r6, r1, #0\n" + " add r4, r3, #0\n" + " ldr r0, [sp, #0x38]\n" + " ldr r1, ._347\n" + " ldr r1, [r1]\n" + " cmp r1, r0\n" + " bne ._345 @cond_branch\n" + " cmp r4, #0x8\n" + " ble ._342 @cond_branch\n" + " mov r4, #0x8\n" + "._342:\n" + " mov r3, sp\n" + " ldr r0, ._347 + 4\n" + " mov r8, r0\n" + " lsl r2, r2, #0x6\n" + " mov ip, r2\n" + " lsl r6, r6, #0x1\n" + " lsl r7, r4, #0x2\n" + " cmp r4, #0\n" + " ble ._343 @cond_branch\n" + " mov r1, #0xf\n" + " add r2, r4, #0\n" + "._344:\n" + " add r0, r5, #0\n" + " and r0, r0, r1\n" + " stmia r3!, {r0}\n" + " lsr r5, r5, #0x4\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bne ._344 @cond_branch\n" + "._343:\n" + " mov r1, r8\n" + " ldr r0, [r1]\n" + " add r0, r0, ip\n" + " add r5, r0, r6\n" + " mov r1, sp\n" + " add r0, r1, r7\n" + " sub r3, r0, #4\n" + " cmp r4, #0\n" + " ble ._345 @cond_branch\n" + " ldr r7, ._347 + 8\n" + " ldr r6, ._347 + 12\n" + " add r2, r4, #0\n" + "._346:\n" + " ldr r1, [r7]\n" + " ldr r0, [r6]\n" + " sub r1, r1, r0\n" + " lsr r1, r1, #0x5\n" + " ldr r0, [r3]\n" + " add r0, r0, r1\n" + " add r0, r0, #0x1\n" + " strh r0, [r5]\n" + " sub r3, r3, #0x4\n" + " add r5, r5, #0x2\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bne ._346 @cond_branch\n" + "._345:\n" + " add sp, sp, #0x20\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._348:\n" + " .align 2, 0\n" + "._347:\n" + " .word unk_20238D0\n" + " .word debugTileMap\n" + " .word debugCharacterBase\n" + " .word unk_20238C8\n" + "\n" + ); +} +#endif + +#endif + static void LinkCB_RequestPlayerDataExchange(void) { // Only one request needs to be sent, so only the master sends it. diff --git a/src/engine/rtc.c b/src/engine/rtc.c index d73f943d2..a56fcd44e 100644 --- a/src/engine/rtc.c +++ b/src/engine/rtc.c @@ -268,6 +268,28 @@ void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day) *dest = EOS; } +#ifdef DEBUG + +void debug_sub_800987C(u8 *dest) +{ + FormatHexDate(dest, sRtc.year, sRtc.month, sRtc.day); +} + +void debug_sub_8009894(u8 *dest) +{ + u16 dayCount; + + dayCount = RtcGetDayCount(&sRtc); + ConvertIntToDecimalStringN(dest, dayCount, STR_CONV_MODE_RIGHT_ALIGN, 4); +} + +void debug_sub_80098B8(u8 *dest) +{ + ConvertIntToHexStringN(dest, sRtc.status, STR_CONV_MODE_LEADING_ZEROS, 2); +} + +#endif + void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t) { u16 days = RtcGetDayCount(rtc); @@ -347,3 +369,10 @@ u32 RtcGetMinuteCount() RtcGetInfo(&sRtc); return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute; } + +#ifdef DEBUG +void debug_sub_8009A60() +{ + RtcGetRawInfo(&sRtc); +} +#endif diff --git a/src/engine/save.c b/src/engine/save.c index d5de2e408..8b045eaaa 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -574,6 +574,83 @@ u16 CalculateChecksum(void *data, u16 size) return ((checksum >> 16) + checksum); } +#ifdef DEBUG +__attribute__((naked)) +void sub_813B79C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " ldr r4, ._163\n" + " ldr r6, ._163 + 4\n" + " mov r5, #0x0\n" + "._161:\n" + " lsl r0, r5, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r1, r4, #0\n" + " bl DoReadFlashWholeSection\n" + " ldr r1, ._163 + 8\n" + " add r0, r4, r1\n" + " ldrh r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r6\n" + " ldrh r1, [r0, #0x4]\n" + " add r0, r4, #0\n" + " bl CalculateChecksum\n" + " ldr r2, ._163 + 12\n" + " add r1, r4, r2\n" + " strh r0, [r1]\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " bl gScriptFuncs_End+0x2f60\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " cmp r5, #0x1b\n" + " bls ._161 @cond_branch\n" + " ldr r6, ._163\n" + " ldr r7, ._163 + 16\n" + " mov r5, #0x0\n" + "._162:\n" + " add r4, r5, #0\n" + " add r4, r4, #0x1c\n" + " lsl r0, r4, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r1, r6, #0\n" + " bl DoReadFlashWholeSection\n" + " lsl r0, r5, #0x3\n" + " add r0, r0, r7\n" + " ldrh r1, [r0, #0x4]\n" + " add r0, r6, #0\n" + " bl CalculateChecksum\n" + " ldr r2, ._163 + 8\n" + " add r1, r6, r2\n" + " strh r0, [r1]\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl gScriptFuncs_End+0x2f60\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x10\n" + " lsr r5, r0, #0x10\n" + " cmp r5, #0x1\n" + " bls ._162 @cond_branch\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._164:\n" + " .align 2, 0\n" + "._163:\n" + " .word +0x2000000\n" + " .word gSaveSectionLocations\n" + " .word 0xff4\n" + " .word 0xff6\n" + " .word gHallOfFameSaveSectionLocations\n" + "\n" + ); +} +#endif + u8 HandleSavingData(u8 saveType) { u8 i; diff --git a/src/engine/sprite.c b/src/engine/sprite.c index cf35e12a3..cec3d0b3a 100644 --- a/src/engine/sprite.c +++ b/src/engine/sprite.c @@ -1,8 +1,10 @@ #include "global.h" +#include "debug.h" #include "sprite.h" #include "main.h" #include "menu_cursor.h" #include "palette.h" +#include "sprite.h" #define MAX_SPRITE_COPY_REQUESTS 64 @@ -822,6 +824,12 @@ static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct Spr gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size; gSpriteCopyRequestCount++; } +#ifdef DEBUG + else + { + unref_sub_80AB084(sDmaOverErrorMsg); + } +#endif } void RequestSpriteCopy(const void *src, u8 *dest, u16 size) @@ -833,6 +841,12 @@ void RequestSpriteCopy(const void *src, u8 *dest, u16 size) gSpriteCopyRequests[gSpriteCopyRequestCount].size = size; gSpriteCopyRequestCount++; } +#ifdef DEBUG + else + { + unref_sub_80AB084(sDmaOverErrorMsg); + } +#endif } // these two functions are unused. diff --git a/src/engine/task.c b/src/engine/task.c index 7bd2b5937..ed17d28bb 100644 --- a/src/engine/task.c +++ b/src/engine/task.c @@ -1,4 +1,5 @@ #include "global.h" +#include "debug.h" #include "task.h" #define ACTIVE_SENTINEL 0x10 @@ -11,8 +12,9 @@ struct Task gTasks[ACTIVE_SENTINEL]; static void InsertTask(u8 newTaskId); static u8 FindFirstActiveTask(); -// Unused string -const u8 sTaskOverString[] = _("TASK OVER\nタスクがオーバーしました"); +const u8 gError_NoTasksLeft[] = _( + "TASK OVER\n" + "タスクがオーバーしました"); void ResetTasks() { @@ -49,6 +51,10 @@ u8 CreateTask(TaskFunc func, u8 priority) } } +#ifdef DEBUG + unref_sub_80AB084(gError_NoTasksLeft); +#endif + return 0; } diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c index 9d09575c8..daa513145 100644 --- a/src/engine/trainer_card.c +++ b/src/engine/trainer_card.c @@ -5,6 +5,7 @@ #include "field_effect.h" #include "graphics.h" #include "link.h" +#include "m4a.h" #include "main.h" #include "menu.h" #include "money.h" @@ -52,7 +53,6 @@ extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; -extern const u8 gBadgesTiles[]; extern const u16 gUnknown_083B5F0C[]; extern const u16 gBadgesPalette[]; extern const u16 gUnknown_083B5F4C[]; @@ -63,6 +63,34 @@ const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp"); // XXX: what is this? u8 *const ewram_ = gSharedMem; +#ifdef DEBUG +const struct TrainerCard gUnknown_Debug_083E0448 = +{ + .gender = FEMALE, + .stars = 4, + .hasPokedex = TRUE, + .var_3 = TRUE, + .var_4 = TRUE, + .firstHallOfFameA = 999, + .firstHallOfFameB = 99, + .firstHallOfFameC = 99, + .pokedexSeen = 411, + .trainerId = 12345, + .playTimeHours = 99, + .playTimeMinutes = 99, + .linkBattleWins = 9999, + .linkBattleLosses = 9999, + .battleTowerWins = 9999, + .battleTowerLosses = 9999, + .contestsWithFriends = 999, + .pokeblocksWithFriends = 0xFFFF, + .pokemonTrades = 0xFFFF, + .money = 99999, + .var_28 = {1, 2, 3, 4}, + .playerName = _("てすと"), +}; +#endif + bool8 TrainerCard_Init(struct Task *); bool8 TrainerCard_WaitForFadeInToFinish(struct Task *); bool8 TrainerCard_WaitForKeys(struct Task *); @@ -176,8 +204,15 @@ static void TrainerCard_Back_PrintPokemonTrades_Label(void); static void TrainerCard_Back_PrintPokemonTrades(void); void unref_sub_8094588(u16 left, u16 top); +#ifdef DEBUG +static u8 gDebug_03000748; +#endif + void TrainerCard_ShowPlayerCard(Callback arg1) { +#ifdef DEBUG + gDebug_03000748 = 0; +#endif TrainerCard_InitScreenForPlayer(arg1); SetMainCallback2(sub_8093174); ewram0_2.language = GAME_LANGUAGE; @@ -185,11 +220,41 @@ void TrainerCard_ShowPlayerCard(Callback arg1) void TrainerCard_ShowLinkCard(u8 playerIndex, Callback arg2) { +#ifdef DEBUG + gDebug_03000748 = 0; +#endif TrainerCard_InitScreenForLinkPlayer(playerIndex, arg2); SetMainCallback2(sub_8093174); ewram0_2.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language; } +#ifdef DEBUG +void debug_sub_80A0710(Callback callback) +{ + gDebug_03000748 = TRUE; + TrainerCard_InitScreenForPlayer(callback); + SetMainCallback2(sub_8093174); + ewram0_2.language = GAME_LANGUAGE; +} + +void debug_sub_80A073C(Callback callback) +{ + memcpy(&gTrainerCards[0], &gUnknown_Debug_083E0448, sizeof(struct TrainerCard)); + gDebug_03000748=TRUE; + TrainerCard_InitScreenForLinkPlayer(0, callback); + SetMainCallback2(sub_8093174); + ewram0_2.language = GAME_LANGUAGE; +} + +void debug_sub_80A0780() +{ + int i; + + for (i = 0; i < 4; i++) + memcpy(&gTrainerCards[i], &gUnknown_Debug_083E0448, sizeof(struct TrainerCard)); +} +#endif + static void sub_8093174(void) { switch (gMain.state) @@ -553,6 +618,19 @@ static void TrainerCard_FillFlags(void) } } } + +#ifdef DEBUG + if (gDebug_03000748 != 0) + { + ewram0_2.showHallOfFame = TRUE; + ewram0_2.showLinkBattleStatus = TRUE; + ewram0_2.showBattleTowerStatus = TRUE; + ewram0_2.showContestRecord = TRUE; + ewram0_2.showMixingRecord = TRUE; + ewram0_2.showTradingRecord = TRUE; + memset(ewram0_2.ownedBadges, TRUE, sizeof(ewram0_2.ownedBadges)); + } +#endif } void sub_80937A4() @@ -645,6 +723,17 @@ bool8 TrainerCard_WaitForKeys(struct Task *task) } return TRUE; } +#ifdef DEBUG + else if (gDebug_03000748 && gMain.newKeys & R_BUTTON) + { + ewram0_2.starCount++; + ewram0_2.starCount %= 5; + TrainerCard_LoadPalettes(); + if (ewram0_2.backSideShown == 0) + TrainerCard_DrawStars(); + } +#endif + return FALSE; } @@ -1372,7 +1461,11 @@ static void TrainerCard_Front_PrintPokedexCount(void) { u8 buffer[16]; - if (!ewram0_2.showPokedexCount) + if ( +#ifdef DEBUG + gDebug_03000748 == 0 && +#endif + !ewram0_2.showPokedexCount) { TrainerCard_ClearPokedexLabel(); } diff --git a/src/field/berry.c b/src/field/berry.c index 088267ad0..7c6640dc8 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -999,6 +999,66 @@ extern u16 gSpecialVar_0x8006; static u8 CalcBerryYield(struct BerryTree *tree); static u16 GetStageDurationByBerryType(u8 berry); +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2B04() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " bl sub_80B47D8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._1\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldrh r0, [r1, #0x10]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1, #0x10]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word gTasks\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80C2B30() +{ + asm( + " push {lr}\n" + " mov r0, #0x1\n" + " bl sub_80B47D8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._3\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldrh r0, [r1, #0x10]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1, #0x10]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gTasks\n" + "\n" + ); +} +#endif + // unused // this could be static, but making it so causes a compile-time warning. void ClearEnigmaBerries(void) @@ -1022,6 +1082,180 @@ void SetEnigmaBerry(u8 *src) gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; } +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2BD0() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " ldr r3, ._11\n" + " ldr r1, ._11 + 4\n" + " add r4, r3, r1\n" + " ldr r6, [r4]\n" + " add r1, r1, #0x4\n" + " add r2, r3, r1\n" + " ldr r7, [r2]\n" + " mov r1, #0x0\n" + " str r1, [r4]\n" + " str r1, [r2]\n" + " add r4, r0, #0\n" + " mov r2, #0x0\n" + " ldr r5, ._11 + 8\n" + "._10:\n" + " add r0, r4, r1\n" + " ldrb r0, [r0]\n" + " add r2, r2, r0\n" + " add r1, r1, #0x1\n" + " cmp r1, r5\n" + " bls ._10 @cond_branch\n" + " ldr r1, ._11 + 4\n" + " add r0, r3, r1\n" + " str r6, [r0]\n" + " add r1, r1, #0x4\n" + " add r0, r3, r1\n" + " str r7, [r0]\n" + " add r0, r2, #0\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._12:\n" + " .align 2, 0\n" + "._11:\n" + " .word gSaveBlock1\n" + " .word 0x316c\n" + " .word 0x52b\n" + "\n" + ); +} +#endif + +#if DEBUG +__attribute__((naked)) +u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add r3, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r9, r1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r8, r2\n" + " ldr r4, ._16\n" + " ldr r1, ._16 + 4\n" + " add r0, r4, r1\n" + " add r2, r0, #0\n" + " ldr r1, ._16 + 8\n" + " ldmia r1!, {r5, r6, r7}\n" + " stmia r2!, {r5, r6, r7}\n" + " ldmia r1!, {r5, r6, r7}\n" + " stmia r2!, {r5, r6, r7}\n" + " ldr r1, [r1]\n" + " str r1, [r2]\n" + " add r1, r3, #0\n" + " bl StringCopy\n" + " ldr r0, ._16 + 12\n" + " add r6, r4, r0\n" + " ldr r1, ._16 + 16\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " ldr r1, ._16 + 20\n" + " add r5, r4, r1\n" + " ldr r1, ._16 + 24\n" + " add r0, r5, #0\n" + " bl StringCopy\n" + " ldr r2, ._16 + 28\n" + " add r0, r4, r2\n" + " str r6, [r0]\n" + " ldr r6, ._16 + 32\n" + " add r0, r4, r6\n" + " str r5, [r0]\n" + " mov r2, #0x0\n" + " ldr r6, ._16 + 36\n" + " ldr r7, ._16 + 40\n" + " add r5, r4, r7\n" + " ldr r3, ._16 + 44\n" + "._13:\n" + " add r0, r2, r5\n" + " add r1, r2, r3\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, r6\n" + " ble ._13 @cond_branch\n" + " ldr r0, ._16\n" + " ldr r3, ._16 + 48\n" + " ldr r2, ._16 + 52\n" + " add r1, r0, r2\n" + " mov r2, #0xf\n" + "._14:\n" + " ldrh r0, [r3]\n" + " strh r0, [r1]\n" + " add r3, r3, #0x2\n" + " add r1, r1, #0x2\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bge ._14 @cond_branch\n" + " mov r2, #0x0\n" + " ldr r5, ._16 + 56\n" + " ldr r3, ._16 + 60\n" + "._15:\n" + " add r0, r2, r5\n" + " add r1, r2, r3\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, #0x11\n" + " ble ._15 @cond_branch\n" + " ldr r5, ._16 + 64\n" + " add r0, r4, r5\n" + " mov r6, r9\n" + " strb r6, [r0]\n" + " ldr r7, ._16 + 68\n" + " add r0, r4, r7\n" + " mov r1, r8\n" + " strb r1, [r0]\n" + " ldr r2, ._16 + 4\n" + " add r0, r4, r2\n" + " bl debug_sub_80C2BD0\n" + " add r5, r5, #0x4\n" + " add r1, r4, r5\n" + " str r0, [r1]\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._17:\n" + " .align 2, 0\n" + "._16:\n" + " .word gSaveBlock1\n" + " .word 0x3160\n" + " .word gBerries\n" + " .word 0x361c\n" + " .word gUnknown_Debug_083F7F84\n" + " .word 0x3649\n" + " .word gUnknown_Debug_083F7F90\n" + " .word 0x316c\n" + " .word 0x3170\n" + " .word 0x47f\n" + " .word 0x317c\n" + " .word gSpriteImage_83C172C+0x80\n" + " .word gSpriteImage_83C172C+0x500\n" + " .word 0x35fc\n" + " .word gSaveBlock1+0x3676\n" + " .word gUnknown_Debug_839B6CE\n" + " .word 0x3688\n" + " .word 0x3689\n" + "\n" + ); +} +#else static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) { const u8 *description1; @@ -1051,9 +1285,110 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) return checksum; } +#endif + +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2D24() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " ldr r6, [sp, #0x18]\n" + " ldr r4, [sp, #0x1c]\n" + " mov r8, r4\n" + " ldr r5, ._18\n" + " ldr r7, ._18 + 4\n" + " add r4, r5, r7\n" + " strb r0, [r4]\n" + " ldr r4, ._18 + 8\n" + " add r0, r5, r4\n" + " strb r1, [r0]\n" + " add r7, r7, #0x2\n" + " add r0, r5, r7\n" + " strb r2, [r0]\n" + " ldr r1, ._18 + 12\n" + " add r0, r5, r1\n" + " strb r3, [r0]\n" + " add r4, r4, #0x3\n" + " add r0, r5, r4\n" + " strb r6, [r0]\n" + " add r7, r7, #0x3\n" + " add r0, r5, r7\n" + " mov r1, r8\n" + " strb r1, [r0]\n" + " sub r4, r4, #0x19\n" + " add r0, r5, r4\n" + " bl debug_sub_80C2BD0\n" + " ldr r7, ._18 + 16\n" + " add r5, r5, r7\n" + " str r0, [r5]\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._19:\n" + " .align 2, 0\n" + "._18:\n" + " .word gSaveBlock1\n" + " .word 0x3175\n" + " .word 0x3176\n" + " .word 0x3178\n" + " .word 0x368c\n" + "\n" + ); +} +#endif // due to e-reader scans being particularly volatile to failure, it is a requirement to check for // their integrity here due to scans possibly failing to produce the correct result. +#if DEBUG +__attribute__((naked)) +bool32 IsEnigmaBerryValid() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._24\n" + " ldr r1, ._24 + 4\n" + " add r0, r4, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._22 @cond_branch\n" + " ldr r2, ._24 + 8\n" + " add r0, r4, r2\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._22 @cond_branch\n" + " ldr r1, ._24 + 12\n" + " add r0, r4, r1\n" + " bl debug_sub_80C2BD0\n" + " ldr r2, ._24 + 16\n" + " add r1, r4, r2\n" + " ldr r1, [r1]\n" + " cmp r0, r1\n" + " bne ._22 @cond_branch\n" + " mov r0, #0x1\n" + " b ._23\n" + "._25:\n" + " .align 2, 0\n" + "._24:\n" + " .word gSaveBlock1\n" + " .word 0x3174\n" + " .word 0x316a\n" + " .word 0x3160\n" + " .word 0x368c\n" + "._22:\n" + " mov r0, #0x0\n" + "._23:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} +#else bool32 IsEnigmaBerryValid(void) { if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0) @@ -1064,6 +1399,7 @@ bool32 IsEnigmaBerryValid(void) return FALSE; return TRUE; } +#endif const struct Berry *GetBerryInfo(u8 berry) { @@ -1417,6 +1753,177 @@ bool8 PlayerHasBerries(void) return IsBagPocketNonEmpty(BAG_BERRIES); } +#if DEBUG +void debug_sub_80C33FC(u8 *buffer, s32 value, u8 n) +{ + StringAppend(gStringVar4, buffer); + ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n); + StringAppend(gStringVar4, gStringVar1); +} + +extern const u8 gUnknown_Debug_083F7F9D[]; +extern const u8 gUnknown_Debug_083F7FA2[]; +extern const u8 gUnknown_Debug_083F7FA9[]; +extern const u8 gUnknown_Debug_083F7FB0[]; +extern const u8 gUnknown_Debug_083F7FB7[]; +extern const u8 gUnknown_Debug_083F7FBE[]; +extern const u8 gUnknown_Debug_083F7FC5[]; +extern const u8 gUnknown_Debug_083F7FCC[]; +extern const u8 gUnknown_Debug_083F7FD3[]; +extern const u8 gUnknown_Debug_083F7FD3[]; +extern const u8 gUnknown_Debug_083F7FD3[]; + +#ifdef NONMATCHING +u8* DebugOpenBerryInfo(void) +{ + s32 i; + u8 berryTreeId; + struct BerryTree *berryTree; + + if (GetFieldObjectScriptPointerForComparison() != &BerryTreeScript) + return NULL; + + berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject); + berryTree = GetBerryTreeInfo(berryTreeId); + + for (i = 0; i < 500; i++) + gStringVar4[i] |= 0xFF; + + debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->secondsUntilNextStage, 5); + debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1); + + return gStringVar4; +} +#else +__attribute__((naked)) +void DebugOpenBerryInfo() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " bl GetFieldObjectScriptPointerForComparison\n" + " ldr r1, ._138\n" + " cmp r0, r1\n" + " beq ._136 @cond_branch\n" + " mov r0, #0x0\n" + " b ._137\n" + "._139:\n" + " .align 2, 0\n" + "._138:\n" + " .word BerryTreeScript\n" + "._136:\n" + " ldr r0, ._141\n" + " ldrb r0, [r0]\n" + " bl FieldObjectGetBerryTreeId\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " add r0, r6, #0\n" + " bl GetBerryTreeInfo\n" + " add r5, r0, #0\n" + " mov r2, #0x0\n" + " ldr r7, ._141 + 4\n" + " ldr r4, ._141 + 8\n" + " mov r3, #0xff\n" + "._140:\n" + " add r1, r2, r4\n" + " ldrb r0, [r1]\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " add r2, r2, #0x1\n" + " cmp r2, r7\n" + " ble ._140 @cond_branch\n" + " ldr r0, ._141 + 12\n" + " add r1, r6, #0\n" + " mov r2, #0x3\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 16\n" + " ldrb r1, [r5]\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 20\n" + " ldrb r1, [r5, #0x1]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x19\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 24\n" + " ldrh r1, [r5, #0x2]\n" + " mov r2, #0x5\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 28\n" + " ldrb r1, [r5, #0x4]\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 32\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " mov r2, #0x3\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 36\n" + " ldrb r1, [r5, #0x1]\n" + " lsr r1, r1, #0x7\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 40\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1b\n" + " lsr r1, r1, #0x1f\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r4, ._141 + 44\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1a\n" + " lsr r1, r1, #0x1f\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1f\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldrb r1, [r5, #0x5]\n" + " lsr r1, r1, #0x7\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 8\n" + "._137:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._142:\n" + " .align 2, 0\n" + "._141:\n" + " .word gSelectedMapObject\n" + " .word 0x1f3\n" + " .word gStringVar4\n" + " .word gUnknown_Debug_083F7F9D\n" + " .word gUnknown_Debug_083F7FA2\n" + " .word gUnknown_Debug_083F7FA9\n" + " .word gUnknown_Debug_083F7FB0\n" + " .word gUnknown_Debug_083F7FB7\n" + " .word gUnknown_Debug_083F7FBE\n" + " .word gUnknown_Debug_083F7FC5\n" + " .word gUnknown_Debug_083F7FCC\n" + " .word gUnknown_Debug_083F7FD3\n" + "\n" + ); +} +#endif + +#endif + // whenever the player is not within view of the berry tree during its sparkle state, the // sparkle state will be reset. void ResetBerryTreeSparkleFlags(void) @@ -1445,3 +1952,17 @@ void ResetBerryTreeSparkleFlags(void) } } } + +#if DEBUG +static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ"); +static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう"); +static const u8 gUnknown_Debug_083F7F9D[] = _("POS:"); +static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:"); +static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:"); +static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:"); +static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:"); +static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:"); +static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:"); +static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:"); +static const u8 gUnknown_Debug_083F7FD3[] = _(""); +#endif diff --git a/src/field/bike.c b/src/field/bike.c index 8db01b4b4..736dbc837 100644 --- a/src/field/bike.c +++ b/src/field/bike.c @@ -14,6 +14,11 @@ extern bool8 gBikeCyclingChallenge; extern u8 gBikeCollisions; extern u8 gUnusedBikeCameraAheadPanback; +#ifdef DEBUG +extern u8 gUnknown_020297ED; +u8 debug_sub_805F2B0(u8); +#endif + static void MovePlayerOnMachBike(u8, u16, u16); static u8 GetMachBikeTransition(u8 *); static void MachBikeTransition_FaceDirection(u8); @@ -126,6 +131,14 @@ static const struct BikeHistoryInputInfo gAcroBikeTricksList[] = void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) { +#ifdef DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(direction)) + { + Bike_SetBikeStill(); + return; + } +#endif + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) MovePlayerOnMachBike(direction, newKeys, heldKeys); else @@ -271,6 +284,14 @@ static void MachBikeTransition_TrySlowDown(u8 var) // the acro bike requires the input handler to be executed before the transition can. static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) { +#ifdef DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(newDirection)) + { + Bike_SetBikeStill(); + return; + } +#endif + sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); } diff --git a/src/field/choose_party.c b/src/field/choose_party.c index 3ba04e489..545c19dfa 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -527,6 +527,107 @@ static void BattleTowerEntryMenuCallback_Exit(u8 taskId) sub_81227FC(taskId); } +#if DEBUG +__attribute__((naked)) +void debug_sub_81381B4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " ldr r4, ._189\n" + " add r0, r4, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x60\n" + " bl gScriptFuncs_End+0x5c24\n" + " mov r7, #0x0\n" + " mov r8, r4\n" + " mov r0, #0x4\n" + " add r0, r0, r8\n" + " mov r9, r0\n" + "._188:\n" + " mov r0, #0x64\n" + " add r1, r7, #0\n" + " mul r1, r1, r0\n" + " ldr r0, ._189 + 4\n" + " add r5, r1, r0\n" + " add r0, r5, #0\n" + " mov r1, #0x41\n" + " bl GetMonData\n" + " lsl r4, r7, #0x5\n" + " mov r1, r8\n" + " add r6, r4, r1\n" + " strh r0, [r6]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " beq ._187 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0x38\n" + " bl GetMonData\n" + " strb r0, [r6, #0xf]\n" + " add r0, r5, #0\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " strh r0, [r6, #0x10]\n" + " add r0, r5, #0\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " strh r0, [r6, #0x12]\n" + " add r0, r5, #0\n" + " mov r1, #0x37\n" + " bl GetMonData\n" + " mov r1, r8\n" + " add r1, r1, #0x14\n" + " add r1, r4, r1\n" + " str r0, [r1]\n" + " add r0, r5, #0\n" + " mov r1, #0xc\n" + " bl GetMonData\n" + " strh r0, [r6, #0x2]\n" + " add r0, r5, #0\n" + " mov r1, #0x0\n" + " bl GetMonData\n" + " mov r1, r8\n" + " add r1, r1, #0x18\n" + " add r1, r4, r1\n" + " str r0, [r1]\n" + " add r0, r5, #0\n" + " bl GetMonGender\n" + " strb r0, [r6, #0x1c]\n" + " add r4, r4, r9\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " add r2, r4, #0\n" + " bl GetMonData\n" + " add r0, r4, #0\n" + " bl StripExtCtrlCodes\n" + " add r0, r5, #0\n" + " mov r1, #0x3\n" + " bl GetMonData\n" + " strb r0, [r6, #0x1d]\n" + "._187:\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x2\n" + " bls ._188 @cond_branch\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._190:\n" + " .align 2, 0\n" + "._189:\n" + " .word gUnknown_02023A00\n" + " .word gPlayerParty+0x12c\n" + "\n" + ); +} +#endif + bool8 SetupLinkMultiBattlePartyMenu(void) { switch (ewram1B000_alt.setupState) diff --git a/src/field/decoration_inventory.c b/src/field/decoration_inventory.c index dd0e972aa..21ced1be8 100644 --- a/src/field/decoration_inventory.c +++ b/src/field/decoration_inventory.c @@ -164,3 +164,14 @@ u8 sub_81341D4(void) } return count; } + + +#ifdef DEBUG +void debug_sub_814A3A8(void) +{ + u8 decor; + + for (decor = 0; decor < DECOR_COUNT; decor++) + IsThereStorageSpaceForDecoration(decor); +} +#endif diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c index 52e66f16e..dad2fb1d2 100644 --- a/src/field/field_control_avatar.c +++ b/src/field/field_control_avatar.c @@ -82,25 +82,25 @@ extern u8 gUnknown_081C6BDE[]; static void player_get_pos_to_and_height(struct MapPosition *); static void player_get_next_pos_and_height(struct MapPosition *); -static u16 cur_mapdata_block_role_at_player_pos(int); -static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c); +/*static*/ u16 cur_mapdata_block_role_at_player_pos(int); +/*static*/ bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c); static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c); static u8 *sub_8068364(struct MapPosition *, u8, u8); static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *, u8, u8 c); static u8 *sub_8068500(struct MapPosition *, u8, u8); static u8 *TryGetFieldMoveScript(struct MapPosition *, u8, u8); -static bool32 sub_8068770(void); -static bool32 sub_80687A4(void); -static bool8 sub_80687E4(struct MapPosition *, u16, u16); +/*static*/ bool32 sub_8068770(void); +/*static*/ bool32 sub_80687A4(void); +/*static*/ bool8 sub_80687E4(struct MapPosition *, u16, u16); static void happiness_algorithm_step(void); static bool8 overworld_poison_step(void); -static bool8 is_it_battle_time_3(u16); -static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); +/*static*/ bool8 is_it_battle_time_3(u16); +/*static*/ bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); static bool8 sub_8068B30(u16); static bool8 is_non_stair_warp_tile(u16, u8); static s8 map_warp_check_packed(struct MapHeader *, struct MapPosition *); static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *); -static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); +/*static*/ bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); static s8 map_warp_check(struct MapHeader *, u16, u16, u8); static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8); static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8); @@ -122,6 +122,230 @@ void FieldClearPlayerInput(struct FieldInput *input) input->dpadDirection = 0; } +#if DEBUG +__attribute__((naked)) +void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add r4, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " mov r8, r1\n" + " lsl r2, r2, #0x10\n" + " lsr r5, r2, #0x10\n" + " ldr r0, ._17\n" + " ldrb r6, [r0, #0x3]\n" + " ldrb r0, [r0, #0x2]\n" + " mov r9, r0\n" + " bl cur_mapdata_block_role_at_player_pos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl MetatileBehavior_IsMoveTile\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r6, #0x2\n" + " bne ._1 @cond_branch\n" + " cmp r7, #0\n" + " beq ._2 @cond_branch\n" + "._1:\n" + " cmp r6, #0\n" + " bne ._9 @cond_branch\n" + "._2:\n" + " bl GetPlayerSpeed\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " cmp r0, #0x4\n" + " beq ._8 @cond_branch\n" + " mov r0, #0x8\n" + " mov r1, r8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._5 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x4\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + "._5:\n" + " mov r0, #0x4\n" + " mov r3, r8\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._6 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x8\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + "._6:\n" + " mov r0, #0x1\n" + " mov r1, r8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._7 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + "._7:\n" + " mov r0, #0x2\n" + " mov r3, r8\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._8 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x80\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + "._8:\n" + " mov r0, #0xf0\n" + " and r0, r0, r5\n" + " cmp r0, #0\n" + " beq ._9 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x10\n" + " orr r0, r0, r1\n" + " mov r1, #0x20\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + "._9:\n" + " cmp r7, #0\n" + " bne ._14 @cond_branch\n" + " cmp r6, #0x2\n" + " bne ._12 @cond_branch\n" + " mov r0, r9\n" + " cmp r0, #0x2\n" + " bne ._12 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x40\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + "._12:\n" + " cmp r7, #0\n" + " bne ._14 @cond_branch\n" + " cmp r6, #0x2\n" + " bne ._14 @cond_branch\n" + " ldrb r0, [r4]\n" + " mov r1, #0x2\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + "._14:\n" + " mov r0, #0x40\n" + " and r0, r0, r5\n" + " cmp r0, #0\n" + " beq ._15 @cond_branch\n" + " mov r0, #0x2\n" + " b ._22\n" + "._18:\n" + " .align 2, 0\n" + "._17:\n" + " .word gPlayerAvatar\n" + "._15:\n" + " mov r0, #0x80\n" + " and r0, r0, r5\n" + " cmp r0, #0\n" + " beq ._19 @cond_branch\n" + " mov r0, #0x1\n" + " b ._22\n" + "._19:\n" + " mov r0, #0x20\n" + " and r0, r0, r5\n" + " cmp r0, #0\n" + " beq ._21 @cond_branch\n" + " mov r0, #0x3\n" + " b ._22\n" + "._21:\n" + " mov r0, #0x10\n" + " and r0, r0, r5\n" + " cmp r0, #0\n" + " beq ._23 @cond_branch\n" + " mov r0, #0x4\n" + "._22:\n" + " strb r0, [r4, #0x2]\n" + "._23:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r5\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " ldrb r2, [r4]\n" + " mov r0, #0x4\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " ldrb r0, [r4, #0x1]\n" + " mov r1, #0x4\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x1]\n" + " mov r0, #0x5\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " strb r0, [r4]\n" + "._25:\n" + " ldr r0, ._30\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._29 @cond_branch\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r5\n" + " cmp r0, #0\n" + " beq ._28 @cond_branch\n" + " ldrb r1, [r4, #0x1]\n" + " mov r0, #0x2\n" + " orr r1, r1, r0\n" + " strb r1, [r4, #0x1]\n" + " ldrb r0, [r4]\n" + " mov r2, #0x41\n" + " neg r2, r2\n" + " and r2, r2, r0\n" + " mov r0, #0x3\n" + " neg r0, r0\n" + " and r2, r2, r0\n" + " sub r0, r0, #0xe\n" + " and r2, r2, r0\n" + " sub r0, r0, #0x10\n" + " and r2, r2, r0\n" + " strb r2, [r4]\n" + " mov r0, #0x4\n" + " mov r3, r8\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._28 @cond_branch\n" + " mov r0, #0x1\n" + " orr r1, r1, r0\n" + " strb r1, [r4, #0x1]\n" + " mov r0, #0x9\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " strb r0, [r4]\n" + "._28:\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x2\n" + " and r0, r0, r5\n" + " cmp r0, #0\n" + " beq ._29 @cond_branch\n" + " ldrb r0, [r4, #0x1]\n" + " mov r1, #0x8\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x1]\n" + "._29:\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._31:\n" + " .align 2, 0\n" + "._30:\n" + " .word gUnknown_020297ED\n" + "\n" + ); +} +#else void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) { u8 r6 = gPlayerAvatar.tileTransitionState; @@ -163,7 +387,222 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; } +#endif +#if DEBUG +__attribute__((naked)) +int sub_8068024(struct FieldInput *input) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffff8\n" + " add r5, r0, #0\n" + " bl player_get_direction_lower_nybble\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " mov r4, sp\n" + " mov r0, sp\n" + " bl player_get_pos_to_and_height\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " mov r2, #0x2\n" + " ldsh r1, [r4, r2]\n" + " bl MapGridGetMetatileBehaviorAt\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " ldrb r1, [r5, #0x1]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._33 @cond_branch\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " bl dive_warp\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._33 @cond_branch\n" + " b ._63\n" + "._33:\n" + " ldrb r1, [r5, #0x1]\n" + " mov r6, #0x2\n" + " add r0, r6, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._39 @cond_branch\n" + " bl CheckTrainers\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._36 @cond_branch\n" + " b ._63\n" + "._36:\n" + " ldrb r1, [r5, #0x1]\n" + " add r0, r6, #0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._39 @cond_branch\n" + " bl mapheader_run_first_tag2_script_list_match\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._39 @cond_branch\n" + " b ._63\n" + "._39:\n" + " ldrb r1, [r5]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._42 @cond_branch\n" + " bl sub_80687A4\n" + " cmp r0, #0x1\n" + " bne ._42 @cond_branch\n" + " b ._63\n" + "._42:\n" + " ldrb r1, [r5]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._44 @cond_branch\n" + " mov r0, #0x5\n" + " bl IncrementGameStat\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " add r2, r7, #0\n" + " bl sub_80687E4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._63 @cond_branch\n" + "._44:\n" + " ldrb r1, [r5]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._46 @cond_branch\n" + " add r0, r4, #0\n" + " bl is_it_battle_time_3\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._63 @cond_branch\n" + "._46:\n" + " ldrb r1, [r5]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._49 @cond_branch\n" + " ldrb r0, [r5, #0x2]\n" + " cmp r0, r7\n" + " bne ._49 @cond_branch\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " add r2, r7, #0\n" + " bl mapheader_run_first_tag2_script_list_match_conditionally\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._63 @cond_branch\n" + "._49:\n" + " mov r4, sp\n" + " mov r0, sp\n" + " bl player_get_next_pos_and_height\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " mov r2, #0x2\n" + " ldsh r1, [r4, r2]\n" + " bl MapGridGetMetatileBehaviorAt\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " ldrb r1, [r5]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._51 @cond_branch\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " add r2, r7, #0\n" + " bl sub_80681F0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._63 @cond_branch\n" + "._51:\n" + " ldrb r1, [r5]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._54 @cond_branch\n" + " ldrb r0, [r5, #0x2]\n" + " cmp r0, r7\n" + " bne ._54 @cond_branch\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " add r2, r7, #0\n" + " bl map_warp_consider_2_to_inside\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._63 @cond_branch\n" + "._54:\n" + " ldrb r1, [r5]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._56 @cond_branch\n" + " bl sub_8068770\n" + " cmp r0, #0x1\n" + " beq ._63 @cond_branch\n" + "._56:\n" + " ldrb r1, [r5]\n" + " mov r0, #0x4\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._58 @cond_branch\n" + " mov r0, #0x6\n" + " bl PlaySE\n" + " bl sub_8071310\n" + " b ._63\n" + "._58:\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._60 @cond_branch\n" + " bl sub_80A6D1C\n" + " cmp r0, #0x1\n" + " beq ._63 @cond_branch\n" + "._60:\n" + " ldrb r1, [r5, #0x1]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._62 @cond_branch\n" + " bl debug_sub_80888D8\n" + " b ._63\n" + "._62:\n" + " mov r0, #0x4\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._64 @cond_branch\n" + " mov r0, #0x0\n" + " b ._65\n" + "._64:\n" + " mov r0, #0x6\n" + " bl PlaySE\n" + " bl DebugMenu_8077048\n" + "._63:\n" + " mov r0, #0x1\n" + "._65:\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} +#else int sub_8068024(struct FieldInput *input) { struct MapPosition position; @@ -213,6 +652,7 @@ int sub_8068024(struct FieldInput *input) return TRUE; return FALSE; } +#endif static void player_get_pos_to_and_height(struct MapPosition *position) { @@ -232,7 +672,7 @@ static void player_get_next_pos_and_height(struct MapPosition *position) position->height = 0; } -static u16 cur_mapdata_block_role_at_player_pos(int unused) +/*static*/ u16 cur_mapdata_block_role_at_player_pos(int unused) { s16 x, y; @@ -240,7 +680,7 @@ static u16 cur_mapdata_block_role_at_player_pos(int unused) return MapGridGetMetatileBehaviorAt(x, y); } -static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c) +/*static*/ bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c) { u8 *script = TryGetScriptOnPressingA(position, b, c); @@ -435,7 +875,7 @@ static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2) return NULL; } -static bool32 sub_8068770(void) +/*static*/ bool32 sub_8068770(void) { if (FlagGet(FLAG_BADGE07_GET) && sub_8068F18() == 2) { @@ -445,7 +885,7 @@ static bool32 sub_8068770(void) return FALSE; } -static bool32 sub_80687A4(void) +/*static*/ bool32 sub_80687A4(void) { if (FlagGet(FLAG_BADGE07_GET) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_8068F18() == 1) { @@ -455,7 +895,7 @@ static bool32 sub_80687A4(void) return FALSE; } -static bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused) +/*static*/ bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused) { if (mapheader_trigger_activate_at__run_now(position) == TRUE) return TRUE; @@ -575,7 +1015,7 @@ void prev_quest_postbuffer_cursor_backup_reset(void) gUnknown_0202E8C0 = 0; } -static bool8 is_it_battle_time_3(u16 a) +/*static*/ bool8 is_it_battle_time_3(u16 a) { if (gUnknown_0202E8C0 < 4) { @@ -596,7 +1036,7 @@ static bool8 is_it_battle_time_3(u16 a) } } -static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c) +/*static*/ bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c) { s8 r6 = map_warp_check_packed(&gMapHeader, position); @@ -704,7 +1144,7 @@ static void sub_8068C30(struct MapHeader *unused, s8 b, struct MapPosition *posi } } -static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c) +/*static*/ bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c) { s8 r4; diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index 77b4c8b5c..1c0cefacb 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1917,6 +1917,40 @@ void npc_clear_ids_and_state(struct MapObject *mapObj) mapObj->mapobj_unk_1C = 0xFF; } +#if DEBUG +__attribute__((naked)) +void npcs_clear_ids_and_state() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._2\n" + "._1:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r5\n" + " bl npc_clear_ids_and_state\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0xf\n" + " bls ._1 @cond_branch\n" + " ldr r1, ._2 + 4\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._3:\n" + " .align 2, 0\n" + "._2:\n" + " .word gMapObjects\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else void npcs_clear_ids_and_state(void) { u8 i; @@ -1924,6 +1958,7 @@ void npcs_clear_ids_and_state(void) for (i = 0; i < 16; i++) npc_clear_ids_and_state(&gMapObjects[i]); } +#endif void sub_805AA98(void) { @@ -2017,6 +2052,176 @@ u8 GetFieldObjectIdByLocalId(u8 localId) return 16; } +#if DEBUG +__attribute__((naked)) +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " add r5, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r6, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r7, r2, #0x18\n" + " ldrb r0, [r5]\n" + " add r1, r6, #0\n" + " add r2, r7, #0\n" + " mov r3, sp\n" + " bl GetAvailableFieldObjectSlot\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._35 @cond_branch\n" + " mov r0, #0x10\n" + " b ._36\n" + "._35:\n" + " mov r0, sp\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._40\n" + " add r4, r0, r1\n" + " add r0, r4, #0\n" + " bl npc_clear_ids_and_state\n" + " ldrh r3, [r5, #0x4]\n" + " add r3, r3, #0x7\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " ldrh r2, [r5, #0x6]\n" + " add r2, r2, #0x7\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " ldrb r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " mov r1, #0x4\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + " ldrb r0, [r5, #0x1]\n" + " strb r0, [r4, #0x5]\n" + " ldrb r0, [r5, #0x9]\n" + " strb r0, [r4, #0x6]\n" + " ldrb r0, [r5]\n" + " strb r0, [r4, #0x8]\n" + " strb r6, [r4, #0x9]\n" + " strb r7, [r4, #0xa]\n" + " strh r3, [r4, #0xc]\n" + " strh r2, [r4, #0xe]\n" + " strh r3, [r4, #0x10]\n" + " strh r2, [r4, #0x12]\n" + " strh r3, [r4, #0x14]\n" + " strh r2, [r4, #0x16]\n" + " ldrb r0, [r5, #0x8]\n" + " mov r7, #0xf\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " ldrb r2, [r4, #0xb]\n" + " mov r0, #0x10\n" + " neg r0, r0\n" + " mov r8, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0xb]\n" + " ldrb r1, [r5, #0x8]\n" + " lsl r1, r1, #0x4\n" + " and r0, r0, r7\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0xb]\n" + " ldrb r1, [r5, #0xa]\n" + " lsl r1, r1, #0x1c\n" + " mov r0, #0xf\n" + " mov r9, r0\n" + " lsr r1, r1, #0x1c\n" + " ldrb r2, [r4, #0x19]\n" + " mov r0, r8\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + " ldrb r1, [r5, #0xa]\n" + " lsr r1, r1, #0x4\n" + " lsl r1, r1, #0x4\n" + " and r0, r0, r7\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + " ldrh r0, [r5, #0xc]\n" + " strb r0, [r4, #0x7]\n" + " ldrh r0, [r5, #0xe]\n" + " strb r0, [r4, #0x1d]\n" + " ldr r1, ._40 + 4\n" + " ldrb r0, [r5, #0x9]\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x20\n" + " strb r1, [r0]\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " bl FieldObjectSetDirection\n" + " add r0, r4, #0\n" + " bl FieldObjectHandleDynamicGraphicsId\n" + " ldr r1, ._40 + 8\n" + " ldrb r0, [r4, #0x6]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._39 @cond_branch\n" + " ldrb r2, [r4, #0x19]\n" + " add r0, r7, #0\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._38 @cond_branch\n" + " lsl r0, r2, #0x1c\n" + " lsr r0, r0, #0x1c\n" + " add r0, r0, #0x1\n" + " mov r1, r9\n" + " and r0, r0, r1\n" + " mov r1, r8\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r4, #0x19]\n" + "._38:\n" + " ldrb r2, [r4, #0x19]\n" + " mov r0, #0xf0\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._39 @cond_branch\n" + " lsr r1, r2, #0x4\n" + " add r1, r1, #0x1\n" + " lsl r1, r1, #0x4\n" + " add r0, r7, #0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + "._39:\n" + " ldr r1, ._40 + 12\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, sp\n" + " ldrb r0, [r0]\n" + "._36:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._41:\n" + " .align 2, 0\n" + "._40:\n" + " .word gMapObjects\n" + " .word gUnknown_0836DC09\n" + " .word gUnknown_0836DBBC\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else #ifdef NONMATCHING u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) { @@ -2227,6 +2432,7 @@ _0805ADD8: .4byte gUnknown_0836DBBC\n\ .syntax divided\n"); } #endif +#endif u8 sub_805ADDC(u8 localId) { @@ -2266,11 +2472,38 @@ u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) return 0; } +#if DEBUG +__attribute__((naked)) +void RemoveFieldObject(struct MapObject *mapObject) +{ + asm( + " push {lr}\n" + " ldrb r2, [r0]\n" + " mov r1, #0x2\n" + " neg r1, r1\n" + " and r1, r1, r2\n" + " strb r1, [r0]\n" + " bl RemoveFieldObjectInternal\n" + " ldr r1, ._72\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " pop {r0}\n" + " bx r0\n" + "._73:\n" + " .align 2, 0\n" + "._72:\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else void RemoveFieldObject(struct MapObject *mapObject) { mapObject->active = FALSE; RemoveFieldObjectInternal(mapObject); } +#endif void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { @@ -2303,6 +2536,226 @@ void npc_hide_all_but_player(void) } } +#if DEBUG +__attribute__((naked)) +u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add r7, r1, #0\n" + " add r1, r2, #0\n" + " add r2, r3, #0\n" + " ldr r3, [sp, #0x20]\n" + " ldr r4, [sp, #0x24]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " mov r9, r3\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " mov sl, r4\n" + " bl InitFieldObjectStateFromTemplate\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " cmp r0, #0x10\n" + " bne ._83 @cond_branch\n" + " mov r0, #0x10\n" + " b ._92\n" + "._83:\n" + " mov r0, r8\n" + " lsl r4, r0, #0x3\n" + " add r0, r4, r0\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._87\n" + " add r5, r0, r1\n" + " ldrb r0, [r5, #0x5]\n" + " bl GetFieldObjectGraphicsInfo\n" + " add r6, r0, #0\n" + " ldrb r1, [r6, #0xc]\n" + " mov r0, #0xf\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._85 @cond_branch\n" + " ldrh r0, [r6, #0x2]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " bl npc_load_two_palettes__no_record\n" + " b ._89\n" + "._88:\n" + " .align 2, 0\n" + "._87:\n" + " .word gMapObjects\n" + "._85:\n" + " cmp r0, #0xa\n" + " bne ._89 @cond_branch\n" + " ldrh r0, [r6, #0x2]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " bl npc_load_two_palettes__and_record\n" + "._89:\n" + " ldrb r0, [r5, #0x6]\n" + " cmp r0, #0x4c\n" + " bne ._90 @cond_branch\n" + " ldrb r0, [r5, #0x1]\n" + " mov r1, #0x20\n" + " orr r0, r0, r1\n" + " strb r0, [r5, #0x1]\n" + "._90:\n" + " ldr r1, ._93\n" + " add r0, r1, #0\n" + " strh r0, [r7, #0x2]\n" + " add r0, r7, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x40\n" + " bne ._91 @cond_branch\n" + " ldr r1, ._93 + 4\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, ._93 + 8\n" + " mov r2, r8\n" + " add r1, r4, r2\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r0\n" + " ldrb r2, [r1]\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " strb r0, [r1]\n" + " mov r0, #0x10\n" + " b ._92\n" + "._94:\n" + " .align 2, 0\n" + "._93:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_03004BC0\n" + " .word gMapObjects\n" + "._91:\n" + " lsl r0, r7, #0x4\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._96\n" + " add r4, r0, r1\n" + " mov r1, r9\n" + " lsl r0, r1, #0x10\n" + " asr r0, r0, #0x10\n" + " ldrh r2, [r5, #0x10]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " mov r2, sl\n" + " lsl r1, r2, #0x10\n" + " asr r1, r1, #0x10\n" + " ldrh r2, [r5, #0x12]\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " add r2, r4, #0\n" + " add r2, r2, #0x20\n" + " add r3, r4, #0\n" + " add r3, r3, #0x22\n" + " bl sub_8060388\n" + " ldrh r0, [r6, #0x8]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x11\n" + " neg r0, r0\n" + " add r1, r4, #0\n" + " add r1, r1, #0x28\n" + " strb r0, [r1]\n" + " ldrh r0, [r6, #0xa]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x11\n" + " neg r0, r0\n" + " add r2, r4, #0\n" + " add r2, r2, #0x29\n" + " strb r0, [r2]\n" + " ldrh r0, [r4, #0x20]\n" + " add r0, r0, #0x8\n" + " strh r0, [r4, #0x20]\n" + " ldrh r1, [r4, #0x22]\n" + " add r1, r1, #0x10\n" + " mov r0, #0x0\n" + " ldsb r0, [r2, r0]\n" + " add r0, r0, r1\n" + " strh r0, [r4, #0x22]\n" + " ldrb r1, [r6, #0xc]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x18\n" + " ldrb r2, [r4, #0x5]\n" + " mov r0, #0xf\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x5]\n" + " add r2, r4, #0\n" + " add r2, r2, #0x3e\n" + " ldrb r0, [r2]\n" + " mov r1, #0x2\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " mov r0, r8\n" + " strh r0, [r4, #0x2e]\n" + " strb r7, [r5, #0x4]\n" + " ldrb r1, [r6, #0xc]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1f\n" + " lsl r1, r1, #0x4\n" + " ldrb r2, [r5, #0x1]\n" + " mov r0, #0x11\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r5, #0x1]\n" + " lsl r0, r0, #0x1b\n" + " cmp r0, #0\n" + " blt ._95 @cond_branch\n" + " ldrb r0, [r5, #0x18]\n" + " lsl r0, r0, #0x1c\n" + " lsr r0, r0, #0x1c\n" + " bl FieldObjectDirectionToImageAnimId\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " bl StartSpriteAnim\n" + "._95:\n" + " ldrb r0, [r5, #0xb]\n" + " lsr r0, r0, #0x4\n" + " add r1, r4, #0\n" + " mov r2, #0x1\n" + " bl SetObjectSubpriorityByZCoord\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " bl sub_80634D0\n" + " mov r0, r8\n" + "._92:\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._97:\n" + " .align 2, 0\n" + "._96:\n" + " .word gSprites\n" + "\n" + ); +} +#else u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) { u8 mapObjectId; @@ -2352,6 +2805,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * sub_80634D0(mapObject, sprite); return mapObjectId; } +#endif u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) { @@ -2574,6 +3028,66 @@ void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) void sub_805B75C(u8, s16, s16); +#if DEBUG +__attribute__((naked)) +void sub_805B710(u16 u161, u16 u162) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " lsl r5, r5, #0x10\n" + " lsr r5, r5, #0x10\n" + " ldr r6, ._153\n" + " mov r0, #0x0\n" + " strb r0, [r6]\n" + " bl ClearPlayerAvatarInfo\n" + " mov r7, #0x0\n" + " ldr r0, ._153 + 4\n" + " mov r8, r0\n" + " lsl r4, r4, #0x10\n" + " lsl r5, r5, #0x10\n" + "._152:\n" + " lsl r0, r7, #0x3\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r8\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x1f\n" + " cmp r0, #0\n" + " beq ._151 @cond_branch\n" + " add r0, r7, #0\n" + " asr r1, r4, #0x10\n" + " asr r2, r5, #0x10\n" + " bl sub_805B75C\n" + " ldrb r0, [r6]\n" + " add r0, r0, #0x1\n" + " strb r0, [r6]\n" + "._151:\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0xf\n" + " bls ._152 @cond_branch\n" + " bl sub_805AAB0\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._154:\n" + " .align 2, 0\n" + "._153:\n" + " .word gUnknown_Debug_03004BC0\n" + " .word gMapObjects\n" + "\n" + ); +} +#else void sub_805B710(u16 a, u16 b) { u8 i; @@ -2586,6 +3100,7 @@ void sub_805B710(u16 a, u16 b) } sub_805AAB0(); } +#endif extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); extern void sub_805B914(struct MapObject *); diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index 9a29e2e92..747edf816 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -32,9 +32,9 @@ static void npc_clear_strange_bits(struct MapObject *a); static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); static void PlayerAllowForcedMovementIfMovingSameDirection(void); static bool8 TryDoMetatileBehaviorForcedMovement(void); -static u8 GetForcedMovementByMetatileBehavior(void); +/*static*/ u8 GetForcedMovementByMetatileBehavior(void); static void MovePlayerNotOnBike(u8 a, u16 b); -static u8 CheckMovementInputNotOnBike(u8 a); +/*static*/ u8 CheckMovementInputNotOnBike(u8 a); static u8 CheckForPlayerAvatarCollision(u8 a); static u8 sub_8058EF0(s16 a, s16 b, u8 c); static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c); @@ -260,12 +260,59 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void) gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; } +#if DEBUG +__attribute__((naked)) +u8 TryDoMetatileBehaviorForcedMovement() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._27\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " ldr r0, ._27 + 4\n" + " ldrh r1, [r0, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " mov r0, #0x0\n" + " b ._26\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word gUnknown_020297ED\n" + " .word gMain\n" + "._25:\n" + " ldr r4, ._29\n" + " bl GetForcedMovementByMetatileBehavior\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x16\n" + " add r0, r0, r4\n" + " ldr r0, [r0]\n" + " bl gScriptFuncs_End+0x3cf4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + "._26:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._30:\n" + " .align 2, 0\n" + "._29:\n" + " .word gUnknown_0830FBA0\n" + "\n" + ); +} +#else static bool8 TryDoMetatileBehaviorForcedMovement(void) { return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); } +#endif -static u8 GetForcedMovementByMetatileBehavior(void) +/*static*/ u8 GetForcedMovementByMetatileBehavior(void) { u8 i; @@ -436,12 +483,57 @@ bool8 ForcedMovement_MuddySlope(void) } } +#if DEBUG +__attribute__((naked)) +void MovePlayerNotOnBike(u8 u81, u16 u161) +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " add r5, r2, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r6, r1, #0x10\n" + " ldr r0, ._84\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._82 @cond_branch\n" + " add r0, r2, #0\n" + " bl debug_sub_805F2B0\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._83 @cond_branch\n" + "._82:\n" + " ldr r4, ._84 + 4\n" + " add r0, r5, #0\n" + " bl CheckMovementInputNotOnBike\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x16\n" + " add r0, r0, r4\n" + " ldr r2, [r0]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl gScriptFuncs_End+0x3cfc\n" + "._83:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._85:\n" + " .align 2, 0\n" + "._84:\n" + " .word gUnknown_020297ED\n" + " .word gUnknown_0830FBEC\n" + "\n" + ); +} +#else static void MovePlayerNotOnBike(u8 direction, u16 heldKeys) { gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys); } +#endif -static u8 CheckMovementInputNotOnBike(u8 direction) +/*static*/ u8 CheckMovementInputNotOnBike(u8 direction) { if (direction == DIR_NONE) { diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 0a841eed1..1b53df6be 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -250,6 +250,87 @@ void SetupMauvilleOldMan(void) sub_80F83D0(); } +#ifdef DEBUG +__attribute__((naked)) +void debug_sub_810B32C() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x4\n" + " bhi ._37 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._23\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._24:\n" + " .align 2, 0\n" + "._23:\n" + " .word ._22\n" + "._22:\n" + " .word ._25\n" + " .word ._26\n" + " .word ._27\n" + " .word ._28\n" + " .word ._29\n" + "._25:\n" + " bl sub_80F7A34\n" + " b ._37\n" + "._26:\n" + " mov r2, #0x0\n" + " ldr r3, ._34\n" + "._31:\n" + " mov r0, sp\n" + " add r1, r0, r2\n" + " add r0, r2, r3\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x7\n" + " bls ._31 @cond_branch\n" + " bl sub_80F7A6C\n" + " mov r2, #0x0\n" + " ldr r3, ._34\n" + "._32:\n" + " add r1, r2, r3\n" + " mov r4, sp\n" + " add r0, r4, r2\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x7\n" + " bls ._32 @cond_branch\n" + " b ._37\n" + "._35:\n" + " .align 2, 0\n" + "._34:\n" + " .word gSaveBlock1+0x2d8c\n" + "._27:\n" + " bl sub_80F7A98\n" + " b ._37\n" + "._28:\n" + " bl sub_80F7A7C\n" + " b ._37\n" + "._29:\n" + " bl sub_80F7A88\n" + "._37:\n" + " bl sub_80F83D0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} +#endif + static u8 GetCurrentMauvilleOldMan(void) { struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common; diff --git a/src/field/overworld.c b/src/field/overworld.c index 86b0a5dac..8346ce3f9 100644 --- a/src/field/overworld.c +++ b/src/field/overworld.c @@ -25,6 +25,7 @@ #include "link.h" #include "load_save.h" #include "main.h" +#include "m4a.h" #include "constants/maps.h" #include "map_name_popup.h" #include "menu.h" @@ -62,6 +63,7 @@ struct UnkTVStruct u32 tv_field_4; }; +extern u8 gUnknown_020297ED; extern u16 gUnknown_03004898; extern u16 gUnknown_0300489C; @@ -1106,6 +1108,68 @@ u8 sav1_map_get_battletype(void) return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType; } +#if DEBUG + +void debug_sub_8076B68(void); + +void debug_sub_80589D8(void); + +void debug_sub_8058A50(void); + +void CB2_InitTestMenu(void) +{ + m4aSoundVSyncOff(); + SetVBlankCallback(NULL); + DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + ScanlineEffect_Stop(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + debug_sub_8076B68(); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + REG_IE |= 1; + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; + m4aSoundVSyncOn(); + SetVBlankCallback(debug_sub_8058A50); + m4aSongNumStart(0x19D); + SetMainCallback2(debug_sub_80589D8); +} + +void debug_sub_80589D8(void) +{ + if (UpdatePaletteFade()) + return; + + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); +} + +void debug_sub_80589F4(void) +{ + if (UpdatePaletteFade()) + return; + + SetVBlankCallback(NULL); + + DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); + + SetMainCallback2(gMain.savedCallback); +} + +void debug_sub_8058A50(void) +{ + ProcessSpriteCopyRequests(); + LoadOam(); + TransferPlttBuffer(); +} + +#endif + void ResetSafariZoneFlag_(void) { ResetSafariZoneFlag(); @@ -1210,6 +1274,33 @@ void CB2_NewGame(void) SetMainCallback2(c2_overworld); } +#if DEBUG + +extern void (*gFieldCallback)(void); + +void debug_sub_8058C00(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + player_avatar_init_params_reset(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + + if (gMain.heldKeys & R_BUTTON) + gFieldCallback = ExecuteTruckSequence; + else + gFieldCallback = sub_8080B60; + + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +#endif + void CB2_WhiteOut(void) { u8 val; @@ -1365,6 +1456,10 @@ void CB2_ContinueSavedGame(void) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); +#if DEBUG + if (gMain.heldKeys & R_BUTTON) + gUnknown_020297ED = TRUE; +#endif ResetSafariZoneFlag_(); LoadSaveblockMapHeader(); LoadSaveblockMapObjScripts(); diff --git a/src/field/party_menu.c b/src/field/party_menu.c index 7d243f569..053368a0e 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -4022,6 +4022,10 @@ void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) CreateTask(Task_TeamMonTMMove, 5); } +#ifdef DEBUG +extern u8 gUnknown_020297ED; +#endif + void Task_TeamMonTMMove(u8 taskId) { GetMonNickname(ewram1C000.pokemon, gStringVar1); @@ -4036,7 +4040,11 @@ void Task_TeamMonTMMove(u8 taskId) } else { - if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) + if ( +#ifdef DEBUG + !gUnknown_020297ED && +#endif + !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) { StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); sub_806E834(gStringVar4, 1); @@ -5514,9 +5522,13 @@ _08070F8A:\n\ } #endif // NONMATCHING + +// Maybe this goes in start_menu.c +#if !DEBUG void unref_sub_8070F90(void) { FlagSet(FLAG_SYS_POKEDEX_GET); FlagSet(FLAG_SYS_POKEMON_GET); FlagSet(FLAG_SYS_POKENAV_GET); } +#endif diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c index 7e8bdc2ce..73fa53d97 100644 --- a/src/field/pokeblock.c +++ b/src/field/pokeblock.c @@ -95,7 +95,8 @@ static const u8 *gUnknown_03000758; #define GFX_TAG_POKEBLOCK_CASE 14800 -const s8 gPokeblockFlavorCompatibilityTable[] = { +const s8 gPokeblockFlavorCompatibilityTable[] = +{ // Cool, Beauty, Cute, Smart, Tough 0, 0, 0, 0, 0, // Hardy 1, 0, 0, 0, -1, // Lonely @@ -124,14 +125,16 @@ const s8 gPokeblockFlavorCompatibilityTable[] = { 0, 0, 0, 0, 0 // Quirky }; -void (*const gUnknown_083F7EA8[])(void) = { +void (*const gUnknown_083F7EA8[])(void) = +{ sub_80A5B40, c2_exit_to_overworld_2_switch, sub_802E424, c2_exit_to_overworld_2_switch }; -const u8 *const gPokeblockNames[] = { +const u8 *const gPokeblockNames[] = +{ NULL, ContestStatsText_RedPokeBlock, ContestStatsText_BluePokeBlock, @@ -149,7 +152,8 @@ const u8 *const gPokeblockNames[] = { ContestStatsText_GoldPokeBlock }; -const struct MenuAction2 gUnknown_083F7EF4[] = { +const struct MenuAction2 gUnknown_083F7EF4[] = +{ {OtherText_Use, sub_810C508}, {OtherText_Toss, sub_810C5C0}, {gOtherText_CancelNoTerminator, sub_810C748}, @@ -165,21 +169,25 @@ const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668}; const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f}; -const struct OamData gOamData_83F7F34 = { +const struct OamData gOamData_83F7F34 = +{ .size = 3, .priority = 2 }; -const union AnimCmd gSpriteAnim_83F7F3C[] = { +const union AnimCmd gSpriteAnim_83F7F3C[] = +{ ANIMCMD_FRAME(.imageValue = 0, .duration = 0), ANIMCMD_END }; -const union AnimCmd *const gSpriteAnimTable_83F7F44[] = { +const union AnimCmd *const gSpriteAnimTable_83F7F44[] = +{ gSpriteAnim_83F7F3C }; -const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = { +const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = +{ AFFINEANIMCMD_FRAME(0, 0, -2, 2), AFFINEANIMCMD_FRAME(0, 0, 2, 4), AFFINEANIMCMD_FRAME(0, 0, -2, 4), @@ -187,22 +195,26 @@ const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = { AFFINEANIMCMD_END }; -const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = { +const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = +{ gSpriteAffineAnim_83F7F48 }; -const struct CompressedSpriteSheet gUnknown_083F7F74 = { +const struct CompressedSpriteSheet gUnknown_083F7F74 = +{ gMenuPokeblockDevice_Gfx, 0x800, GFX_TAG_POKEBLOCK_CASE }; -const struct CompressedSpritePalette gUnknown_083F7F7C = { +const struct CompressedSpritePalette gUnknown_083F7F7C = +{ gMenuPokeblockDevice_Pal, GFX_TAG_POKEBLOCK_CASE }; -const struct SpriteTemplate gSpriteTemplate_83F7F84 = { +const struct SpriteTemplate gSpriteTemplate_83F7F84 = +{ GFX_TAG_POKEBLOCK_CASE, GFX_TAG_POKEBLOCK_CASE, &gOamData_83F7F34, @@ -212,7 +224,8 @@ const struct SpriteTemplate gSpriteTemplate_83F7F84 = { SpriteCallbackDummy }; -const struct Pokeblock gUnknown_083F7F9C[] = { +const struct Pokeblock gUnknown_083F7F9C[] = +{ { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20}, { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20}, { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20}, @@ -432,14 +445,13 @@ void OpenPokeblockCaseOnFeeder(void) SetMainCallback2(sub_810B96C); } -#ifdef DEBUG +#if DEBUG void debug_sub_8120F98(void) { u8 i; - for (i=0; i<40 && gUnknown_083F7F9C[i].color != 0; i++) - { + + for (i = 0; i < 40 && gUnknown_083F7F9C[i].color != 0; i++) gSaveBlock1.pokeblocks[i] = gUnknown_083F7F9C[i]; - } } #endif diff --git a/src/field/roamer.c b/src/field/roamer.c index 2eb26ef9d..16a42e9f1 100644 --- a/src/field/roamer.c +++ b/src/field/roamer.c @@ -1,7 +1,9 @@ #include "global.h" +#include "debug.h" #include "roamer.h" #include "pokemon.h" #include "random.h" +#include "region_map.h" #include "constants/species.h" #ifdef SAPPHIRE @@ -224,3 +226,20 @@ void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) *mapGroup = sRoamerLocation[MAP_GRP]; *mapNum = sRoamerLocation[MAP_NUM]; } + +#ifdef DEBUG +void debug_sub_814A714(void) +{ + if (gSaveBlock1.location.mapGroup == 0) + { + CreateInitialRoamerMon(); + sRoamerLocation[0] = 0; + sRoamerLocation[1] = gSaveBlock1.location.mapNum; + } +} + +void debug_sub_814A73C(u8* str) +{ + GetMapSectionName(str, sRoamerLocation[1], 0); +} +#endif diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 9ff3a037c..e231f686d 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -17,7 +17,8 @@ #include "menu.h" #include "ewram.h" -struct UnkStruct1 { +struct UnkStruct1 +{ /*0x00*/ u8 unk00; /*0x01*/ u8 unk01; /*0x02*/ s16 unk02; @@ -2854,7 +2855,13 @@ static void sub_8104C5C(void) static void LoadSlotMachineWheelOverlay(void); -static void sub_8104CAC(u8 arg0) { +#ifdef DEBUG +// should be static +__attribute__((section(".bss"))) u8 unk_debug_bss_1[0xC] = { 0 }; +#endif + +static void sub_8104CAC(u8 arg0) +{ u8 i; struct Task *task; @@ -2875,9 +2882,7 @@ static void sub_8104CAC(u8 arg0) { #ifdef GERMAN if (arg0 == 5 && i <= 2) - { gSprites[spriteId].invisible = TRUE; - } #endif } } @@ -3966,7 +3971,8 @@ static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { vram[16 * 32 + 1 + arg0] = arg4; } -static void sub_81065DC(void) { +static void sub_81065DC(void) +{ s16 y, x; u16 *screen; @@ -3982,7 +3988,1226 @@ static void sub_81065DC(void) { } } -static const u8 sReelSymbols[][21] = { +#if DEBUG +__attribute__((naked)) +void debug_sub_811B1C4() +{ + asm( + " ldr r1, ._1\n" + " ldrb r0, [r1]\n" + " mov r3, #0x2\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, ._1 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x2\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B1EC() +{ + asm( + " ldr r2, ._3\n" + " ldrb r0, [r2]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " ldr r2, ._3 + 4\n" + " ldrb r0, [r2]\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " neg r0, r0\n" + " lsr r0, r0, #0x1f\n" + " strb r0, [r2]\n" + " bx lr\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B210() +{ + asm( + " ldr r1, ._5\n" + " ldrb r0, [r1]\n" + " mov r3, #0x4\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, ._5 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x4\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + "._6:\n" + " .align 2, 0\n" + "._5:\n" + " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B238() +{ + asm( + " ldr r1, ._7\n" + " ldrb r0, [r1]\n" + " mov r3, #0x8\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, ._7 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x8\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + "._8:\n" + " .align 2, 0\n" + "._7:\n" + " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B260() +{ + asm( + " ldr r1, ._9\n" + " ldrb r0, [r1]\n" + " mov r3, #0x10\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, ._9 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x10\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + "._10:\n" + " .align 2, 0\n" + "._9:\n" + " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B288() +{ + asm( + " ldr r1, ._11\n" + " ldrb r0, [r1]\n" + " mov r3, #0x40\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, ._11 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x40\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + "._12:\n" + " .align 2, 0\n" + "._11:\n" + " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2B0() +{ + asm( + " ldr r1, ._13\n" + " ldrb r0, [r1]\n" + " mov r3, #0x80\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, ._13 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x80\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2D8() +{ + asm( + " ldr r0, ._15\n" + " ldrb r1, [r0]\n" + " mov r2, #0x20\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + " bx lr\n" + "._16:\n" + " .align 2, 0\n" + "._15:\n" + " .word unk_debug_bss_1+0x3\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2E8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r0, ._17\n" + " ldrb r1, [r0, #0x1]\n" + " add r1, r1, #0x1\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x6\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " add sp, sp, #0x4\n" + " pop {r0}\n" + " bx r0\n" + "._18:\n" + " .align 2, 0\n" + "._17:\n" + " .word +0x2000000\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B310() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " ldr r0, ._21\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 4\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 8\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 12\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 16\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 20\n" + " mov r1, #0x1\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 24\n" + " mov r1, #0x1\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 28\n" + " mov r1, #0x1\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 32\n" + " mov r1, #0x1\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 36\n" + " mov r1, #0xf\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 40\n" + " mov r1, #0xf\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 44\n" + " mov r1, #0xf\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 48\n" + " mov r1, #0xf\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 52\n" + " mov r1, #0xf\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 56\n" + " mov r1, #0xf\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 60\n" + " mov r1, #0xf\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 64\n" + " mov r1, #0xf\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 68\n" + " mov r1, #0xf\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " ldr r0, ._21 + 72\n" + " ldrb r0, [r0, #0x3]\n" + " cmp r0, #0\n" + " bne ._19 @cond_branch\n" + " ldr r0, ._21 + 76\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " b ._20\n" + "._22:\n" + " .align 2, 0\n" + "._21:\n" + " .word Str_841B1C4\n" + " .word Str_841B1CB\n" + " .word Str_841B1D4\n" + " .word Str_841B1DB\n" + " .word Str_841B1E2\n" + " .word Str_841B1E8\n" + " .word Str_841B1F3\n" + " .word Str_841B202\n" + " .word Str_841B24C\n" + " .word Str_841B211\n" + " .word Str_841B219\n" + " .word Str_841B220\n" + " .word Str_841B227\n" + " .word Str_841B22E\n" + " .word Str_841B235\n" + " .word Str_841B23B\n" + " .word Str_841B23F\n" + " .word Str_841B243\n" + " .word +0x2000000\n" + " .word Str_841B246\n" + "._19:\n" + " ldr r0, ._30\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + "._20:\n" + " ldr r4, ._30 + 4\n" + " ldr r1, [r4, #0x68]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r1, [r4, #0x6c]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " mov r0, #0x10\n" + " ldsh r1, [r4, r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r1, [r4, #0x70]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r1, [r4, #0x74]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " ldr r1, [r4, #0x78]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x7\n" + " bl MenuPrint\n" + " ldr r1, [r4, #0x7c]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " add r0, r0, #0x80\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xb\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " add r0, r0, #0x84\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " add r0, r0, #0x88\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " add r0, r0, #0x8c\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " ldr r1, ._30 + 8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._23 @cond_branch\n" + " mov r2, #0x0\n" + " cmp r0, #0x8\n" + " beq ._24 @cond_branch\n" + " cmp r0, #0x8\n" + " bgt ._25 @cond_branch\n" + " cmp r0, #0x2\n" + " beq ._26 @cond_branch\n" + " cmp r0, #0x2\n" + " bgt ._27 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._28 @cond_branch\n" + " b ._45\n" + "._31:\n" + " .align 2, 0\n" + "._30:\n" + " .word Str_841B249\n" + " .word +0x2000000\n" + " .word unk_debug_bss_1\n" + "._27:\n" + " cmp r0, #0x4\n" + " beq ._32 @cond_branch\n" + " b ._45\n" + "._25:\n" + " cmp r0, #0x40\n" + " beq ._34 @cond_branch\n" + " cmp r0, #0x40\n" + " bgt ._35 @cond_branch\n" + " cmp r0, #0x10\n" + " beq ._36 @cond_branch\n" + " b ._45\n" + "._35:\n" + " cmp r0, #0x80\n" + " beq ._38 @cond_branch\n" + " b ._45\n" + "._26:\n" + " mov r2, #0x3\n" + " b ._45\n" + "._28:\n" + " mov r2, #0x5\n" + " b ._45\n" + "._32:\n" + " mov r2, #0x7\n" + " b ._45\n" + "._24:\n" + " mov r2, #0x9\n" + " b ._45\n" + "._36:\n" + " mov r2, #0xb\n" + " b ._45\n" + "._34:\n" + " mov r2, #0xd\n" + " b ._45\n" + "._38:\n" + " mov r2, #0xf\n" + "._45:\n" + " ldr r0, ._46\n" + " mov r1, #0x17\n" + " bl MenuPrint\n" + "._23:\n" + " bl debug_sub_811B2E8\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._47:\n" + " .align 2, 0\n" + "._46:\n" + " .word Str_841B26D\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B5B4() +{ + asm( + " push {lr}\n" + " add r2, r0, #0\n" + " ldr r0, [r2]\n" + " add r0, r0, r1\n" + " str r0, [r2]\n" + " ldr r1, ._49\n" + " cmp r0, r1\n" + " ble ._48 @cond_branch\n" + " str r1, [r2]\n" + "._48:\n" + " pop {r0}\n" + " bx r0\n" + "._50:\n" + " .align 2, 0\n" + "._49:\n" + " .word 0x270f\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B5D0() +{ + asm( + " ldr r0, ._51\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " ldr r0, ._51 + 4\n" + " strb r1, [r0]\n" + " ldr r0, ._51 + 8\n" + " strb r1, [r0]\n" + " ldr r0, ._51 + 12\n" + " strb r1, [r0]\n" + " ldr r2, ._51 + 16\n" + " mov r0, #0x0\n" + " str r0, [r2, #0x68]\n" + " str r0, [r2, #0x6c]\n" + " str r0, [r2, #0x70]\n" + " str r0, [r2, #0x74]\n" + " str r0, [r2, #0x78]\n" + " str r0, [r2, #0x7c]\n" + " add r1, r2, #0\n" + " add r1, r1, #0x80\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " bx lr\n" + "._52:\n" + " .align 2, 0\n" + "._51:\n" + " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1+0x2\n" + " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1+0x4\n" + " .word +0x2000000\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B620() +{ + asm( + " push {lr}\n" + " ldr r0, ._53\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._54:\n" + " .align 2, 0\n" + "._53:\n" + " .word debug_sub_811B654+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B634() +{ + asm( + " push {lr}\n" + " ldr r0, ._57\n" + " bl FindTaskIdByFunc\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0xff\n" + " beq ._55 @cond_branch\n" + " mov r0, #0x0\n" + " b ._56\n" + "._58:\n" + " .align 2, 0\n" + "._57:\n" + " .word debug_sub_811B654+1\n" + "._55:\n" + " mov r0, #0x1\n" + "._56:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B654() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._63\n" + " add r5, r0, r1\n" + " mov r0, #0x8\n" + " ldsh r1, [r5, r0]\n" + " cmp r1, #0x1\n" + " beq ._59 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt ._60 @cond_branch\n" + " cmp r1, #0\n" + " beq ._61 @cond_branch\n" + " b ._116\n" + "._64:\n" + " .align 2, 0\n" + "._63:\n" + " .word gTasks\n" + "._60:\n" + " cmp r1, #0x2\n" + " bne ._65 @cond_branch\n" + " b ._66\n" + "._65:\n" + " cmp r1, #0x3\n" + " bne ._67 @cond_branch\n" + " b ._68\n" + "._67:\n" + " b ._116\n" + "._61:\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " bl debug_sub_811B310\n" + " ldrh r0, [r5, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5, #0x8]\n" + " b ._116\n" + "._59:\n" + " ldr r7, ._76\n" + " ldrh r2, [r7, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._71 @cond_branch\n" + " b ._94\n" + "._71:\n" + " mov r0, #0x20\n" + " and r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " cmp r3, #0\n" + " beq ._73 @cond_branch\n" + " ldr r1, ._76 + 4\n" + " ldrb r0, [r1, #0x1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0x1]\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bge ._79 @cond_branch\n" + " mov r0, #0x5\n" + " strb r0, [r1, #0x1]\n" + " b ._79\n" + "._77:\n" + " .align 2, 0\n" + "._76:\n" + " .word gMain\n" + " .word +0x2000000\n" + "._73:\n" + " mov r0, #0x10\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._78 @cond_branch\n" + " ldr r1, ._81\n" + " ldrb r0, [r1, #0x1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1, #0x1]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bls ._79 @cond_branch\n" + " strb r3, [r1, #0x1]\n" + "._79:\n" + " bl debug_sub_811B2E8\n" + " b ._116\n" + "._82:\n" + " .align 2, 0\n" + "._81:\n" + " .word +0x2000000\n" + "._78:\n" + " and r1, r1, r2\n" + " lsl r0, r1, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0\n" + " beq ._83 @cond_branch\n" + " mov r0, #0x3\n" + " strh r0, [r5, #0x8]\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x9\n" + " mov r3, #0x5\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._85\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._85 + 4\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " b ._116\n" + "._86:\n" + " .align 2, 0\n" + "._85:\n" + " .word Str_841B25C\n" + " .word Str_841B264\n" + "._83:\n" + " mov r0, #0x4\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._87 @cond_branch\n" + " ldr r0, ._91\n" + " strb r4, [r0]\n" + " ldr r0, ._91 + 4\n" + " strb r4, [r0]\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xa\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._91 + 8\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r3, ._91 + 12\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x8\n" + " bl PrintMenuItems\n" + " str r4, [sp]\n" + " mov r0, #0x9\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " ldrh r0, [r5, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5, #0x8]\n" + "._87:\n" + " ldrh r1, [r7, #0x2e]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._88 @cond_branch\n" + " b ._116\n" + "._88:\n" + " ldr r1, ._91 + 16\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " b ._94\n" + "._92:\n" + " .align 2, 0\n" + "._91:\n" + " .word unk_debug_bss_1+0x2\n" + " .word unk_debug_bss_1+0x3\n" + " .word Str_841B254\n" + " .word _841B270\n" + " .word unk_debug_bss_1+0x4\n" + "._66:\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r2, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r2, r0\n" + " beq ._116 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r2, r0\n" + " beq ._94 @cond_branch\n" + " ldr r1, ._96\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, ._96 + 4\n" + " lsl r1, r2, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " bl _call_via_r0\n" + "._94:\n" + " bl MenuZeroFillScreen\n" + " add r0, r6, #0\n" + " bl DestroyTask\n" + " b ._116\n" + "._97:\n" + " .align 2, 0\n" + "._96:\n" + " .word unk_debug_bss_1+0x2\n" + " .word _841B270\n" + "._68:\n" + " ldr r2, ._100\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._98 @cond_branch\n" + " ldr r2, ._100 + 4\n" + " ldrh r0, [r2, #0xc]\n" + " add r0, r0, #0x64\n" + " b ._99\n" + "._101:\n" + " .align 2, 0\n" + "._100:\n" + " .word gMain\n" + " .word +0x2000000\n" + "._98:\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._102 @cond_branch\n" + " ldr r1, ._104\n" + " ldrh r0, [r1, #0xc]\n" + " sub r0, r0, #0x64\n" + " b ._103\n" + "._105:\n" + " .align 2, 0\n" + "._104:\n" + " .word +0x2000000\n" + "._102:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._106 @cond_branch\n" + " ldr r1, ._109\n" + " ldr r2, ._109 + 4\n" + " add r0, r2, #0\n" + " ldrh r2, [r1, #0xc]\n" + " add r0, r0, r2\n" + "._103:\n" + " strh r0, [r1, #0xc]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " bgt ._116 @cond_branch\n" + " ldr r0, ._109 + 8\n" + " strh r0, [r1, #0xc]\n" + " b ._116\n" + "._110:\n" + " .align 2, 0\n" + "._109:\n" + " .word +0x2000000\n" + " .word 0xfffffc18\n" + " .word 0x270f\n" + "._106:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._111 @cond_branch\n" + " ldr r2, ._114\n" + " mov r1, #0xfa\n" + " lsl r1, r1, #0x2\n" + " add r0, r1, #0\n" + " ldrh r1, [r2, #0xc]\n" + " add r0, r0, r1\n" + "._99:\n" + " strh r0, [r2, #0xc]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " ldr r1, ._114 + 4\n" + " cmp r0, r1\n" + " ble ._116 @cond_branch\n" + " strh r1, [r2, #0xc]\n" + " b ._116\n" + "._115:\n" + " .align 2, 0\n" + "._114:\n" + " .word +0x2000000\n" + " .word 0x270f\n" + "._111:\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._116 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " add r0, r6, #0\n" + " bl DestroyTask\n" + "._116:\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B894() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r1, ._122\n" + " ldrh r2, [r1, #0x8]\n" + " mov r0, #0xc0\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r2\n" + " add r4, r1, #0\n" + " cmp r0, #0\n" + " beq ._117 @cond_branch\n" + " add r1, r1, #0x90\n" + " ldr r0, [r1]\n" + " add r0, r0, #0x1\n" + " str r0, [r1]\n" + " ldr r2, ._122 + 4\n" + " cmp r0, r2\n" + " ble ._118 @cond_branch\n" + " str r2, [r1]\n" + "._118:\n" + " add r0, r4, #0\n" + " add r0, r0, #0x88\n" + " ldr r1, [r1]\n" + " ldr r0, [r0]\n" + " cmp r1, r0\n" + " beq ._119 @cond_branch\n" + " ldr r0, ._122 + 8\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldr r1, ._122 + 12\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + "._119:\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne ._126 @cond_branch\n" + " ldr r0, ._122 + 16\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " b ._121\n" + "._123:\n" + " .align 2, 0\n" + "._122:\n" + " .word +0x2000000\n" + " .word 0x270f\n" + " .word Str_841B2B0\n" + " .word unk_debug_bss_1+0x4\n" + " .word Str_841B2D3\n" + "._117:\n" + " lsl r0, r2, #0x10\n" + " cmp r0, #0\n" + " beq ._127 @cond_branch\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._126 @cond_branch\n" + " mov r4, #0x3\n" + " and r4, r4, r2\n" + " cmp r4, #0\n" + " bne ._126 @cond_branch\n" + " ldr r0, ._163\n" + " mov r1, #0x4\n" + " mov r2, #0x2\n" + "._121:\n" + " bl MenuPrint\n" + " ldr r0, ._163 + 4\n" + " strb r4, [r0]\n" + "._126:\n" + " ldr r0, ._163 + 8\n" + " ldrh r1, [r0, #0x8]\n" + " add r4, r0, #0\n" + " cmp r1, #0\n" + " beq ._127 @cond_branch\n" + " b ._162\n" + "._127:\n" + " mov r1, #0x12\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x3\n" + " beq ._129 @cond_branch\n" + " b ._162\n" + "._129:\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._131 @cond_branch\n" + " b ._162\n" + "._131:\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " mov r0, #0x0\n" + " mov r1, #0x2\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " str r0, [sp]\n" + " mov r0, #0x0\n" + " mov r1, #0x3\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r9, r0\n" + " mov r0, #0x1\n" + " mov r1, #0x2\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " mov r0, #0x1\n" + " mov r1, #0x3\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov sl, r0\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " mov r0, #0x2\n" + " mov r1, #0x2\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " bl sub_8102BA4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r7, #0\n" + " bne ._134 @cond_branch\n" + " mov r1, r9\n" + " cmp r1, #0x1\n" + " bne ._134 @cond_branch\n" + " cmp r5, #0\n" + " beq ._159 @cond_branch\n" + "._134:\n" + " ldr r1, [sp]\n" + " cmp r1, #0\n" + " bne ._137 @cond_branch\n" + " cmp r4, #0x1\n" + " bne ._137 @cond_branch\n" + " mov r1, r8\n" + " cmp r1, #0\n" + " beq ._159 @cond_branch\n" + "._137:\n" + " cmp r6, #0\n" + " bne ._140 @cond_branch\n" + " mov r1, sl\n" + " cmp r1, #0x1\n" + " bne ._140 @cond_branch\n" + " cmp r0, #0\n" + " beq ._159 @cond_branch\n" + "._140:\n" + " cmp r7, #0\n" + " bne ._143 @cond_branch\n" + " cmp r4, #0x1\n" + " bne ._143 @cond_branch\n" + " cmp r0, #0\n" + " beq ._159 @cond_branch\n" + "._143:\n" + " cmp r6, #0\n" + " bne ._146 @cond_branch\n" + " cmp r4, #0x1\n" + " bne ._146 @cond_branch\n" + " cmp r5, #0\n" + " beq ._159 @cond_branch\n" + "._146:\n" + " cmp r7, #0x1\n" + " bne ._149 @cond_branch\n" + " mov r1, r9\n" + " cmp r1, #0\n" + " bne ._149 @cond_branch\n" + " cmp r5, #0x1\n" + " beq ._159 @cond_branch\n" + "._149:\n" + " ldr r1, [sp]\n" + " cmp r1, #0x1\n" + " bne ._152 @cond_branch\n" + " cmp r4, #0\n" + " bne ._152 @cond_branch\n" + " mov r1, r8\n" + " cmp r1, #0x1\n" + " beq ._159 @cond_branch\n" + "._152:\n" + " cmp r6, #0x1\n" + " bne ._155 @cond_branch\n" + " mov r1, sl\n" + " cmp r1, #0\n" + " bne ._155 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._159 @cond_branch\n" + "._155:\n" + " cmp r7, #0x1\n" + " bne ._158 @cond_branch\n" + " cmp r4, #0\n" + " bne ._158 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._159 @cond_branch\n" + "._158:\n" + " cmp r6, #0x1\n" + " bne ._162 @cond_branch\n" + " cmp r4, #0\n" + " bne ._162 @cond_branch\n" + " cmp r5, #0x1\n" + " bne ._162 @cond_branch\n" + "._159:\n" + " ldr r0, ._163 + 12\n" + " mov r1, #0x4\n" + " mov r2, #0x0\n" + " bl MenuPrint\n" + " ldr r1, ._163 + 4\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + "._162:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._164:\n" + " .align 2, 0\n" + "._163:\n" + " .word Str_841B2E4\n" + " .word unk_debug_bss_1+0x4\n" + " .word +0x2000000\n" + " .word Str_841B2BF\n" + "\n" + ); +} +#endif + +static const u8 sReelSymbols[][21] = +{ { SLOT_MACHINE_TAG_7_RED, SLOT_MACHINE_TAG_CHERRY, diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 2f6f1e7dd..5e76d30a6 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -44,6 +44,11 @@ enum { MENU_ACTION_PLAYER_LINK }; +#ifdef DEBUG +static u32 _debugStartMenu_0 __attribute__((unused)); +static u32 _debugStartMenu_1 __attribute__((unused)); +#endif + static u8 (*saveDialogCallback)(void); static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed static bool8 savingComplete; @@ -132,6 +137,304 @@ static bool32 sub_80719FC(u8 *ptr); static void sub_8071B54(void); static void Task_8071B64(u8 taskId); +#ifdef DEBUG +__attribute__((naked)) +void debug_sub_8075C30() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl debug_sub_8075D9C\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075C40() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._5\n" + " add r5, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r5, r1]\n" + " cmp r0, #0x1\n" + " beq ._1 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._2 @cond_branch\n" + " cmp r0, #0\n" + " beq ._3 @cond_branch\n" + " b ._18\n" + "._6:\n" + " .align 2, 0\n" + "._5:\n" + " .word gTasks+0x8\n" + "._2:\n" + " cmp r0, #0x2\n" + " beq ._7 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._8 @cond_branch\n" + " b ._18\n" + "._3:\n" + " bl m4aSoundVSyncOff\n" + " b ._12\n" + "._1:\n" + " ldr r1, ._13\n" + " ldrh r0, [r1]\n" + " mov sl, r0\n" + " mov r0, #0x0\n" + " strh r0, [r1]\n" + " ldr r1, ._13 + 4\n" + " strh r0, [r1]\n" + " mov r0, #0x83\n" + " lsl r0, r0, #0x10\n" + " str r0, [r1]\n" + " ldr r4, ._13 + 8\n" + " mov r9, r4\n" + " ldr r2, ._13 + 12\n" + " ldr r0, ._13 + 16\n" + " mov ip, r0\n" + " ldr r1, ._13 + 20\n" + " mov r8, r1\n" + " ldr r7, ._13 + 24\n" + " mov r3, r9\n" + " add r3, r3, #0x1\n" + " ldr r6, ._13 + 28\n" + " ldr r4, ._13 + 32\n" + "._11:\n" + " mov r0, ip\n" + " str r0, [r2]\n" + " str r6, [r2, #0x4]\n" + " str r4, [r2, #0x8]\n" + " ldr r0, [r2, #0x8]\n" + " ldrh r1, [r2, #0xa]\n" + " mov r0, r8\n" + " and r0, r0, r1\n" + " strh r0, [r2, #0xa]\n" + " ldrh r1, [r2, #0xa]\n" + " add r0, r7, #0\n" + " and r0, r0, r1\n" + " strh r0, [r2, #0xa]\n" + " ldrh r0, [r2, #0xa]\n" + " sub r3, r3, #0x1\n" + " cmp r3, #0\n" + " bne ._11 @cond_branch\n" + " mov r3, r9\n" + " add r3, r3, #0x1\n" + " ldr r0, ._13 + 36\n" + " mov r2, #0x0\n" + " strh r2, [r0]\n" + " ldr r1, ._13 + 4\n" + " ldrh r0, [r1]\n" + " ldr r4, ._13 + 40\n" + " str r0, [r4]\n" + " strh r2, [r1]\n" + " ldr r0, ._13\n" + " mov r1, sl\n" + " strh r1, [r0]\n" + " ldr r4, ._13 + 44\n" + " str r3, [r4]\n" + " bl m4aSoundVSyncOn\n" + " b ._12\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word 0x4000208\n" + " .word 0x4000108\n" + " .word 0xc34f\n" + " .word 0x40000b0\n" + " .word gUnknown_03004DE0\n" + " .word 0xc5ff\n" + " .word 0x7fff\n" + " .word 0x4000040\n" + " .word 0xa2600001\n" + " .word 0x400010a\n" + " .word _debugStartMenu_0\n" + " .word _debugStartMenu_1\n" + "._7:\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + " ldr r0, ._16\n" + " ldr r1, ._16 + 4\n" + " ldr r1, [r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._16 + 8\n" + " ldr r1, ._16 + 12\n" + " ldr r1, [r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl ConvertIntToDecimalStringN\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._16 + 16\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + "._12:\n" + " ldrh r0, [r5]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5]\n" + " b ._18\n" + "._17:\n" + " .align 2, 0\n" + "._16:\n" + " .word gStringVar1\n" + " .word _debugStartMenu_1\n" + " .word gStringVar2\n" + " .word _debugStartMenu_0\n" + " .word gUnknown_Debug_839B6D8\n" + "._8:\n" + " ldr r0, ._19\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._18 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + "._18:\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._20:\n" + " .align 2, 0\n" + "._19:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075D9C() +{ + asm( + " push {lr}\n" + " ldr r0, ._21\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " pop {r0}\n" + " bx r0\n" + "._22:\n" + " .align 2, 0\n" + "._21:\n" + " .word debug_sub_8075C40+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075DB4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " add r5, r1, #0\n" + " add r4, r2, #0\n" + " add r0, r4, #0\n" + " mov r1, #0x4d\n" + " bl __umodsi3\n" + " strb r0, [r6, #0x1]\n" + " add r1, r6, #0\n" + " add r1, r1, #0xc\n" + " add r0, r4, #0\n" + " bl write_word_to_mem\n" + " add r0, r6, #4\n" + " add r1, r5, #0\n" + " bl StringCopy8\n" + " mov r3, #0x7\n" + " mov r4, #0x0\n" + " ldr r0, ._25\n" + " ldr r1, ._25 + 4\n" + " add r5, r0, r1\n" + " add r2, r6, #0\n" + " add r2, r2, #0x10\n" + " add r1, r6, #0\n" + " add r1, r1, #0x1c\n" + "._23:\n" + " ldrh r0, [r5]\n" + " strh r0, [r2]\n" + " strh r3, [r1]\n" + " add r0, r3, #6\n" + " strh r0, [r1, #0xc]\n" + " add r3, r3, #0x1\n" + " add r5, r5, #0x2\n" + " add r2, r2, #0x2\n" + " add r1, r1, #0x2\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x5\n" + " ble ._23 @cond_branch\n" + " mov r4, #0x0\n" + "._24:\n" + " mov r0, #0x64\n" + " mul r0, r0, r4\n" + " ldr r1, ._25 + 8\n" + " add r0, r0, r1\n" + " mov r1, #0x2c\n" + " mul r1, r1, r4\n" + " add r1, r1, #0x34\n" + " add r1, r6, r1\n" + " bl sub_803AF78\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x2\n" + " ble ._24 @cond_branch\n" + " add r0, r6, #0\n" + " bl sub_8136088\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._26:\n" + " .align 2, 0\n" + "._25:\n" + " .word gSaveBlock1\n" + " .word 0x2b28\n" + " .word gPlayerParty\n" + "\n" + ); +} + +__attribute__((naked)) +void unref_sub_8070F90() +{ + asm( + " push {lr}\n" + " ldr r0, ._27\n" + " bl FlagSet\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x4\n" + " bl FlagSet\n" + " ldr r0, ._27 + 4\n" + " bl FlagSet\n" + " pop {r0}\n" + " bx r0\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word 0x801\n" + " .word 0x802\n" + "\n" + ); +} +#endif static void BuildStartMenuActions(void) { diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c index 4bf83cad8..08913f40d 100644 --- a/src/field/wild_encounter.c +++ b/src/field/wild_encounter.c @@ -3802,6 +3802,19 @@ static void FeebasSeedRng(u16 seed) sFeebasRngValue = seed; } +#if DEBUG +u16 debug_sub_8092344(u8 arg0) +{ + if (arg0 == 0) + return 131; + if (arg0 == 1) + return 167; + if (arg0 == 2) + return 149; + return 0; +} +#endif + static u8 ChooseWildMonIndex_Land(void) { u8 rand = Random() % 100; @@ -4042,6 +4055,24 @@ static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) return FALSE; } +#if DEBUG +u16 debug_sub_809283C(u16 attempts) +{ + u16 retval = 0; + u16 i = 0; + + while (i < attempts) + { + if (DoWildEncounterRateDiceRoll(320) == TRUE) + retval++; + + i++; + } + + return retval; +} +#endif + static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility) { encounterRate *= 16; diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index 921a3ad93..c652b9398 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -238,7 +238,7 @@ const struct MailLayout gUnknown_083E57A4[] = static u8 *const sSharedMemPtr = gSharedMem; static u8 sub_80F8A28(void); -static void sub_80F8D50(void); +/*static*/ void sub_80F8D50(void); static void sub_80F8DA0(void); static void sub_80F8E80(void); static void sub_80F8F18(void); @@ -247,6 +247,205 @@ static void sub_80F8F58(void); static void sub_80F8F78(void); static void sub_80F8FB4(void); + +#if DEBUG + +// should be static +__attribute__((section(".bss"))) u8 unk_debug_bss_2; + +__attribute__((naked)) +void HandleReadMail(struct MailStruct *aStruct, MainCallback callback, bool8 bool81) +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " add r6, r1, #0\n" + " lsl r2, r2, #0x18\n" + " lsr r5, r2, #0x18\n" + " ldr r0, ._3\n" + " ldrb r3, [r0]\n" + " cmp r3, #0\n" + " beq ._1 @cond_branch\n" + " ldr r2, ._3 + 4\n" + " add r1, r2, #0\n" + " add r1, r1, #0xff\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " ldr r0, ._3 + 8\n" + " ldrh r1, [r0]\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x1\n" + " add r0, r2, r3\n" + " strb r1, [r0]\n" + " mov r0, #0x82\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, ._3 + 12\n" + " str r0, [r1]\n" + " add r3, r3, #0x8\n" + " add r1, r2, r3\n" + " ldr r0, ._3 + 16\n" + " str r0, [r1]\n" + " ldr r0, ._3 + 20\n" + " ldrh r1, [r0]\n" + " b ._2\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gUnknown_03000748+0x4\n" + " .word +0x2000000\n" + " .word gSpecialVar_0x8004\n" + " .word EasyChat_GetWordText+1\n" + " .word ConvertEasyChatWordsToString+1\n" + " .word gSpecialVar_0x8006\n" + "._1:\n" + " ldr r2, ._7\n" + " add r1, r2, #0\n" + " add r1, r1, #0xff\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " add r0, r0, #0xfb\n" + " add r1, r2, r0\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x82\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, ._7 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x84\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, ._7 + 8\n" + " str r0, [r1]\n" + " ldrh r1, [r4, #0x20]\n" + " add r0, r1, #0\n" + " sub r0, r0, #0x79\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi ._5 @cond_branch\n" + " sub r1, r1, #0x79\n" + "._2:\n" + " add r0, r2, #0\n" + " add r0, r0, #0xfa\n" + " strb r1, [r0]\n" + " b ._6\n" + "._8:\n" + " .align 2, 0\n" + "._7:\n" + " .word +0x2000000\n" + " .word EasyChat_GetWordText+1\n" + " .word ConvertEasyChatWordsToString+1\n" + "._5:\n" + " add r0, r2, #0\n" + " add r0, r0, #0xfa\n" + " strb r3, [r0]\n" + " mov r5, #0x0\n" + "._6:\n" + " ldr r1, ._12\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._9 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._10 @cond_branch\n" + "._9:\n" + " mov r3, #0x86\n" + " lsl r3, r3, #0x1\n" + " add r2, r1, r3\n" + " add r0, r1, #0\n" + " add r0, r0, #0xfa\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._12 + 4\n" + " b ._11\n" + "._13:\n" + " .align 2, 0\n" + "._12:\n" + " .word +0x2000000\n" + " .word gUnknown_083E5730\n" + "._10:\n" + " mov r0, #0x86\n" + " lsl r0, r0, #0x1\n" + " add r2, r1, r0\n" + " add r0, r1, #0\n" + " add r0, r0, #0xfa\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._18\n" + "._11:\n" + " add r0, r0, r1\n" + " str r0, [r2]\n" + " ldrh r0, [r4, #0x1e]\n" + " mov r1, sp\n" + " bl MailSpeciesToSpecies\n" + " lsl r0, r0, #0x10\n" + " ldr r1, ._18 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xcd\n" + " lsl r1, r1, #0x11\n" + " cmp r0, r1\n" + " bhi ._14 @cond_branch\n" + " ldr r0, ._18 + 8\n" + " add r1, r0, #0\n" + " add r1, r1, #0xfa\n" + " ldrb r2, [r1]\n" + " add r1, r0, #0\n" + " cmp r2, #0x6\n" + " beq ._15 @cond_branch\n" + " cmp r2, #0x9\n" + " beq ._16 @cond_branch\n" + " b ._17\n" + "._19:\n" + " .align 2, 0\n" + "._18:\n" + " .word gUnknown_083E57A4\n" + " .word 0xffff0000\n" + " .word +0x2000000\n" + "._15:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x1\n" + " b ._21\n" + "._16:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x2\n" + " b ._21\n" + "._14:\n" + " ldr r1, ._22\n" + "._17:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x0\n" + "._21:\n" + " strb r0, [r2]\n" + " add r0, r1, #0\n" + " add r0, r0, #0xf4\n" + " str r4, [r0]\n" + " sub r0, r0, #0x8\n" + " str r6, [r0]\n" + " add r0, r0, #0xc\n" + " strb r5, [r0]\n" + " ldr r0, ._22 + 4\n" + " bl SetMainCallback2\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._23:\n" + " .align 2, 0\n" + "._22:\n" + " .word +0x2000000\n" + " .word sub_80F8D50+1\n" + "\n" + ); +} +#else void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) { u16 mailDesign; @@ -310,6 +509,7 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) SetMainCallback2(sub_80F8D50); } +#endif #define RETURN_UP_STATE break #define RETURN_SKIP_STATE return FALSE @@ -456,7 +656,7 @@ static u8 sub_80F8A28(void) return FALSE; } -static void sub_80F8D50(void) +/*static*/ void sub_80F8D50(void) { do { @@ -573,6 +773,60 @@ static void sub_80F8F78(void) } } +#if DEBUG +__attribute__((naked)) +void sub_80F8FB4() +{ + asm( + " push {r4, lr}\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._135 @cond_branch\n" + " ldr r4, ._138\n" + " add r0, r4, #0\n" + " add r0, r0, #0xec\n" + " ldr r0, [r0]\n" + " bl SetMainCallback2\n" + " add r0, r4, #0\n" + " add r0, r0, #0xfb\n" + " ldrb r0, [r0]\n" + " cmp r0, #0x2\n" + " bgt ._137 @cond_branch\n" + " cmp r0, #0x1\n" + " blt ._137 @cond_branch\n" + " add r0, r4, #0\n" + " add r0, r0, #0xf4\n" + " ldr r0, [r0]\n" + " ldrh r0, [r0, #0x1e]\n" + " bl sub_809D4A8\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " bl sub_809D608\n" + " add r0, r4, #0\n" + " add r0, r0, #0xfc\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x4\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._138 + 4\n" + " add r0, r0, r1\n" + " bl sub_809D510\n" + "._137:\n" + " bl ResetPaletteFade\n" + "._135:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._139:\n" + " .align 2, 0\n" + "._138:\n" + " .word +0x2000000\n" + " .word gSprites\n" + "\n" + ); +} +#else static void sub_80F8FB4(void) { u16 local1; @@ -597,3 +851,1611 @@ static void sub_80F8FB4(void) memset(&ewram0_4, 0, 0x110); ResetPaletteFade(); } +#endif + +#if DEBUG +__attribute__((naked)) +void debug_sub_810C910() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._143\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._142 @cond_branch\n" + " ldr r1, ._143 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl Menu_EraseScreen\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " ldr r2, ._143 + 8\n" + " ldr r0, ._143 + 12\n" + " ldrh r1, [r0]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r1, r0, #0x2\n" + " add r0, r1, r2\n" + " ldr r3, ._143 + 16\n" + " add r0, r0, r3\n" + " ldrh r0, [r0]\n" + " cmp r0, #0\n" + " bne ._141 @cond_branch\n" + " sub r3, r3, #0x20\n" + " add r0, r2, r3\n" + " add r0, r1, r0\n" + " ldr r1, ._143 + 20\n" + " mov r2, #0x0\n" + " bl HandleReadMail\n" + " b ._142\n" + "._144:\n" + " .align 2, 0\n" + "._143:\n" + " .word gPaletteFade\n" + " .word unk_debug_bss_2\n" + " .word gSaveBlock1\n" + " .word gSpecialVar_0x8005\n" + " .word 0x2b6c\n" + " .word debug_sub_810D388+1\n" + "._141:\n" + " ldr r3, ._145\n" + " add r0, r2, r3\n" + " add r0, r1, r0\n" + " ldr r1, ._145 + 4\n" + " mov r2, #0x1\n" + " bl HandleReadMail\n" + "._142:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._146:\n" + " .align 2, 0\n" + "._145:\n" + " .word 0x2b4c\n" + " .word debug_sub_810D388+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810C990() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r5, r4, #0\n" + " ldr r0, ._149\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0xa0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._147 @cond_branch\n" + " ldr r4, ._149 + 4\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0xb\n" + " b ._148\n" + "._150:\n" + " .align 2, 0\n" + "._149:\n" + " .word gMain\n" + " .word gSpecialVar_0x8006\n" + "._147:\n" + " mov r2, #0x50\n" + " and r2, r2, r1\n" + " cmp r2, #0\n" + " beq ._151 @cond_branch\n" + " ldr r4, ._153\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + "._148:\n" + " mov r1, #0xc\n" + " bl __modsi3\n" + " strh r0, [r4]\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0xa\n" + " mov r3, #0x4\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r1, ._153 + 4\n" + " ldrh r0, [r4]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0x2\n" + " mov r2, #0x2\n" + " bl Menu_PrintText\n" + " b ._159\n" + "._154:\n" + " .align 2, 0\n" + "._153:\n" + " .word gSpecialVar_0x8006\n" + " .word _84115C4\n" + "._151:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._155 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " str r2, [sp]\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._157\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._157 + 4\n" + " b ._156\n" + "._158:\n" + " .align 2, 0\n" + "._157:\n" + " .word gTasks\n" + " .word debug_sub_810C910+1\n" + "._155:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._159 @cond_branch\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._160\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r1, ._160 + 4\n" + " ldr r0, ._160 + 8\n" + " ldrh r0, [r0]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0x2\n" + " mov r2, #0x2\n" + " bl Menu_PrintText\n" + " ldr r1, ._160 + 12\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._160 + 16\n" + "._156:\n" + " str r1, [r0]\n" + "._159:\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._161:\n" + " .align 2, 0\n" + "._160:\n" + " .word Str_8411540\n" + " .word _8411560\n" + " .word gSpecialVar_0x8004\n" + " .word gTasks\n" + " .word debug_sub_810CA7C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CA7C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r3, ._164\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r2, #0xf0\n" + " and r2, r2, r1\n" + " cmp r2, #0\n" + " beq ._162 @cond_branch\n" + " ldr r2, ._164 + 4\n" + " ldrh r0, [r2]\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " strh r0, [r2]\n" + " ldr r1, ._164 + 8\n" + " ldrh r0, [r2]\n" + " b ._163\n" + "._165:\n" + " .align 2, 0\n" + "._164:\n" + " .word gMain\n" + " .word gSpecialVar_0x8004\n" + " .word _8411560\n" + "._162:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._168 @cond_branch\n" + " ldrh r0, [r3, #0x34]\n" + " cmp r0, #0\n" + " beq ._167 @cond_branch\n" + " strh r2, [r3, #0x34]\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._169\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0xa\n" + " mov r3, #0x4\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r1, ._169 + 4\n" + " ldr r0, ._169 + 8\n" + " ldrh r0, [r0]\n" + "._163:\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0x2\n" + " mov r2, #0x2\n" + " bl Menu_PrintText\n" + " b ._168\n" + "._170:\n" + " .align 2, 0\n" + "._169:\n" + " .word Str_8411540\n" + " .word _8411560\n" + " .word gSpecialVar_0x8004\n" + "._167:\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._171\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0xa\n" + " mov r3, #0x4\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r1, ._171 + 4\n" + " ldr r0, ._171 + 8\n" + " ldrh r0, [r0]\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0x2\n" + " mov r2, #0x2\n" + " bl Menu_PrintText\n" + " ldr r1, ._171 + 12\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._171 + 16\n" + " str r1, [r0]\n" + "._168:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._172:\n" + " .align 2, 0\n" + "._171:\n" + " .word Str_8411568\n" + " .word _84115C4\n" + " .word gSpecialVar_0x8006\n" + " .word gTasks\n" + " .word debug_sub_810C990+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CB50() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xffffffec\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " ldr r1, ._175\n" + " mov r0, sp\n" + " mov r2, #0x6\n" + " bl memcpy\n" + " add r7, sp, #0x8\n" + " ldr r1, ._175 + 4\n" + " add r0, r7, #0\n" + " mov r2, #0x9\n" + " bl memcpy\n" + " mov r2, #0x0\n" + " ldr r0, ._175 + 8\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._173 @cond_branch\n" + " ldr r0, ._175 + 12\n" + " ldr r5, ._175 + 16\n" + " ldrh r1, [r5]\n" + " mov r2, #0x2\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._175 + 20\n" + " ldr r1, ._175 + 24\n" + " lsl r4, r6, #0x2\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r1\n" + " mov r1, #0x8\n" + " ldsh r2, [r4, r1]\n" + " mov r1, #0xb\n" + " mul r1, r1, r2\n" + " ldr r2, ._175 + 28\n" + " add r1, r1, r2\n" + " bl StringCopy\n" + " ldr r2, ._175 + 32\n" + " ldrh r1, [r5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrh r1, [r4, #0x8]\n" + " ldr r2, ._175 + 36\n" + " add r0, r0, r2\n" + " strh r1, [r0]\n" + " ldr r4, ._175 + 40\n" + " add r0, r4, #0\n" + " add r1, r7, #0\n" + " bl StringExpandPlaceholders\n" + " bl Menu_DisplayDialogueFrame\n" + " add r0, r4, #0\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " add r0, r6, #0\n" + " bl DestroyTask\n" + " b ._174\n" + "._176:\n" + " .align 2, 0\n" + "._175:\n" + " .word Str_841160F\n" + " .word Str_841161A\n" + " .word gMain\n" + " .word gStringVar1\n" + " .word gSpecialVar_0x8005\n" + " .word gStringVar2\n" + " .word gTasks\n" + " .word gSpeciesNames\n" + " .word gSaveBlock1\n" + " .word 0x2b6a\n" + " .word gStringVar4\n" + "._173:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._177 @cond_branch\n" + " add r0, r6, #0\n" + " bl DestroyTask\n" + " bl Menu_EraseScreen\n" + "._174:\n" + " ldr r0, ._179\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " bl debug_sub_810D340\n" + " b ._186\n" + "._180:\n" + " .align 2, 0\n" + "._179:\n" + " .word debug_sub_810CE1C+1\n" + "._177:\n" + " mov r0, #0xa0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._181 @cond_branch\n" + " ldr r0, ._183\n" + " lsl r4, r6, #0x2\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " mov r1, #0x8\n" + " ldsh r0, [r4, r1]\n" + " ldr r2, ._183 + 4\n" + " add r0, r0, r2\n" + " mov r1, #0xce\n" + " lsl r1, r1, #0x1\n" + " bl __modsi3\n" + " strh r0, [r4, #0x8]\n" + " b ._182\n" + "._184:\n" + " .align 2, 0\n" + "._183:\n" + " .word gTasks\n" + " .word 0x19b\n" + "._181:\n" + " mov r0, #0x50\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._185 @cond_branch\n" + " ldr r0, ._187\n" + " lsl r4, r6, #0x2\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r0\n" + " mov r1, #0x8\n" + " ldsh r0, [r4, r1]\n" + " add r0, r0, #0x1\n" + " mov r1, #0xce\n" + " lsl r1, r1, #0x1\n" + " bl __modsi3\n" + " strh r0, [r4, #0x8]\n" + " mov r2, #0x1\n" + "._185:\n" + " cmp r2, #0\n" + " beq ._186 @cond_branch\n" + "._182:\n" + " ldr r0, ._187 + 4\n" + " ldr r1, ._187\n" + " lsl r4, r6, #0x2\n" + " add r4, r4, r6\n" + " lsl r4, r4, #0x3\n" + " add r4, r4, r1\n" + " mov r2, #0x8\n" + " ldsh r1, [r4, r2]\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._187 + 8\n" + " mov r1, #0x8\n" + " ldsh r2, [r4, r1]\n" + " mov r1, #0xb\n" + " mul r1, r1, r2\n" + " ldr r2, ._187 + 12\n" + " add r1, r1, r2\n" + " bl StringCopy\n" + " ldr r4, ._187 + 16\n" + " add r0, r4, #0\n" + " mov r1, sp\n" + " bl StringExpandPlaceholders\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xc\n" + " mov r3, #0x3\n" + " bl Menu_DrawStdWindowFrame\n" + " add r0, r4, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + "._186:\n" + " add sp, sp, #0x14\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._188:\n" + " .align 2, 0\n" + "._187:\n" + " .word gTasks\n" + " .word gStringVar1\n" + " .word gStringVar2\n" + " .word gSpeciesNames\n" + " .word gStringVar4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CCEC() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add sp, sp, #0xffffffe4\n" + " add r5, r0, #0\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " ldr r1, ._189\n" + " mov r0, sp\n" + " mov r2, #0x11\n" + " bl memcpy\n" + " add r6, sp, #0x14\n" + " ldr r1, ._189 + 4\n" + " add r0, r6, #0\n" + " mov r2, #0x7\n" + " bl memcpy\n" + " ldr r0, ._189 + 8\n" + " mov r8, r0\n" + " ldr r0, ._189 + 12\n" + " ldrh r1, [r0]\n" + " mov r0, r8\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r4, ._189 + 16\n" + " add r0, r4, #0\n" + " mov r1, sp\n" + " bl StringExpandPlaceholders\n" + " bl Menu_DisplayDialogueFrame\n" + " add r0, r4, #0\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r1, ._189 + 20\n" + " mov r0, r8\n" + " bl StringCopy\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl StringExpandPlaceholders\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xc\n" + " mov r3, #0x3\n" + " bl Menu_DrawStdWindowFrame\n" + " add r0, r6, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r1, ._189 + 24\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r1, ._189 + 28\n" + " str r1, [r0]\n" + " add sp, sp, #0x1c\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._190:\n" + " .align 2, 0\n" + "._189:\n" + " .word Str_8411623\n" + " .word Str_8411634\n" + " .word gStringVar1\n" + " .word gSpecialVar_0x8005\n" + " .word gStringVar4\n" + " .word gSpeciesNames\n" + " .word gTasks\n" + " .word debug_sub_810CB50+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CD9C() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl ScriptContext1_Stop\n" + " bl ScriptContext2_Enable\n" + " ldr r1, ._191\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " ldr r3, ._191 + 4\n" + " ldr r2, ._191 + 8\n" + " ldr r1, ._191 + 12\n" + " mov r0, #0x0\n" + " strh r0, [r1]\n" + " strh r0, [r2]\n" + " strh r0, [r3]\n" + " ldr r0, ._191 + 16\n" + " bl SetMainCallback2\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._192:\n" + " .align 2, 0\n" + "._191:\n" + " .word unk_debug_bss_2\n" + " .word gSpecialVar_0x8004\n" + " .word gSpecialVar_0x8005\n" + " .word gSpecialVar_0x8006\n" + " .word debug_sub_810D388+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CDE0() +{ + asm( + " push {lr}\n" + " bl UpdatePaletteFade\n" + " bl RunTasks\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CDF0() +{ + asm( + " push {lr}\n" + " ldr r1, ._193\n" + " mov r0, #0x0\n" + " strh r0, [r1, #0x34]\n" + " strh r0, [r1, #0x36]\n" + " ldr r1, ._193 + 4\n" + " ldr r0, ._193 + 8\n" + " str r0, [r1]\n" + " ldr r0, ._193 + 12\n" + " bl SetMainCallback2\n" + " pop {r0}\n" + " bx r0\n" + "._194:\n" + " .align 2, 0\n" + "._193:\n" + " .word gMain\n" + " .word gFieldCallback\n" + " .word mapldr_default+1\n" + " .word c2_exit_to_overworld_2_switch+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CE1C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._196\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._195 @cond_branch\n" + " bl CloseMenu\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + "._195:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._197:\n" + " .align 2, 0\n" + "._196:\n" + " .word gCallback_03004AE8\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CE48() +{ + asm( + " push {r4, lr}\n" + " bl Menu_ProcessInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._198 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " bne ._199 @cond_branch\n" + " bl Menu_EraseScreen\n" + " bl debug_sub_810D340\n" + "._198:\n" + " mov r0, #0x0\n" + " b ._200\n" + "._199:\n" + " ldr r0, ._201\n" + " strh r1, [r0]\n" + " ldr r4, ._201 + 4\n" + " ldrh r0, [r4]\n" + " mov r1, #0xc\n" + " bl __umodsi3\n" + " strh r0, [r4]\n" + " ldr r0, ._201 + 8\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " ldr r1, ._201 + 12\n" + " mov r2, #0x0\n" + " mov r0, #0x1\n" + " strh r0, [r1, #0x34]\n" + " strh r2, [r1, #0x36]\n" + "._200:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._202:\n" + " .align 2, 0\n" + "._201:\n" + " .word gSpecialVar_0x8005\n" + " .word gSpecialVar_0x8006\n" + " .word debug_sub_810CA7C+1\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CEA4() +{ + asm( + " push {lr}\n" + " ldr r0, ._205\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._203 @cond_branch\n" + " mov r0, #0x0\n" + " b ._204\n" + "._206:\n" + " .align 2, 0\n" + "._205:\n" + " .word gPaletteFade\n" + "._203:\n" + " ldr r1, ._207\n" + " mov r0, #0x4\n" + " strh r0, [r1]\n" + " bl sub_80E60D8\n" + " mov r0, #0x1\n" + "._204:\n" + " pop {r1}\n" + " bx r1\n" + "._208:\n" + " .align 2, 0\n" + "._207:\n" + " .word gSpecialVar_0x8004\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CED0() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xffffffdc\n" + " ldr r1, ._212\n" + " mov r0, sp\n" + " mov r2, #0x23\n" + " bl memcpy\n" + " bl Menu_ProcessInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._215 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " bne ._210 @cond_branch\n" + " bl Menu_EraseScreen\n" + " b ._211\n" + "._213:\n" + " .align 2, 0\n" + "._212:\n" + " .word Str_841163B\n" + "._210:\n" + " ldr r5, ._216\n" + " strh r1, [r5]\n" + " ldr r6, ._216 + 4\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldr r1, ._216 + 8\n" + " add r0, r0, r1\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x79\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bls ._214 @cond_branch\n" + " ldrh r1, [r5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r6\n" + " ldr r2, ._216 + 8\n" + " add r0, r0, r2\n" + " ldr r1, ._216 + 12\n" + " strh r1, [r0]\n" + " ldrh r1, [r5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " sub r2, r2, #0xe\n" + " add r1, r6, r2\n" + " add r0, r0, r1\n" + " ldr r4, ._216 + 16\n" + " add r1, r4, #0\n" + " bl StringCopy\n" + " ldrh r1, [r5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r2, ._216 + 20\n" + " add r1, r6, r2\n" + " add r0, r0, r1\n" + " add r4, r4, #0xa\n" + " ldr r1, [r4]\n" + " str r1, [r0]\n" + " ldr r1, ._216 + 24\n" + " ldr r0, ._216 + 28\n" + " str r0, [r1]\n" + " b ._215\n" + "._217:\n" + " .align 2, 0\n" + "._216:\n" + " .word gSpecialVar_0x8005\n" + " .word gSaveBlock1\n" + " .word 0x2b6c\n" + " .word 0xffff\n" + " .word gSaveBlock2\n" + " .word 0x2b66\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_810CEA4+1\n" + "._214:\n" + " bl Menu_EraseScreen\n" + " bl Menu_DisplayDialogueFrame\n" + " mov r0, sp\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + "._211:\n" + " bl debug_sub_810D340\n" + "._215:\n" + " mov r0, #0x0\n" + " add sp, sp, #0x24\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810CFA4() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xffffffe0\n" + " ldr r1, ._221\n" + " mov r0, sp\n" + " mov r2, #0x1f\n" + " bl memcpy\n" + " bl Menu_ProcessInput\n" + " lsl r0, r0, #0x18\n" + " asr r2, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r2, r0\n" + " beq ._218 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r2, r0\n" + " bne ._219 @cond_branch\n" + " bl Menu_EraseScreen\n" + " b ._220\n" + "._222:\n" + " .align 2, 0\n" + "._221:\n" + " .word Str_841165E\n" + "._219:\n" + " ldr r0, ._225\n" + " strh r2, [r0]\n" + " ldr r1, ._225 + 4\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldr r1, ._225 + 8\n" + " add r0, r0, r1\n" + " ldrh r0, [r0]\n" + " sub r0, r0, #0x79\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bls ._223 @cond_branch\n" + " ldr r0, ._225 + 12\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " mov r0, #0x1\n" + " b ._224\n" + "._226:\n" + " .align 2, 0\n" + "._225:\n" + " .word gSpecialVar_0x8005\n" + " .word gSaveBlock1\n" + " .word 0x2b6c\n" + " .word debug_sub_810CCEC+1\n" + "._223:\n" + " bl Menu_EraseScreen\n" + " bl Menu_DisplayDialogueFrame\n" + " mov r0, sp\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + "._220:\n" + " bl debug_sub_810D340\n" + "._218:\n" + " mov r0, #0x0\n" + "._224:\n" + " add sp, sp, #0x20\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810D030() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xffffffcc\n" + " ldr r1, ._230\n" + " mov r0, sp\n" + " mov r2, #0x10\n" + " bl memcpy\n" + " add r5, sp, #0x10\n" + " ldr r1, ._230 + 4\n" + " add r0, r5, #0\n" + " mov r2, #0x21\n" + " bl memcpy\n" + " bl Menu_ProcessInput\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._227 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " bne ._228 @cond_branch\n" + " bl Menu_EraseScreen\n" + " b ._229\n" + "._231:\n" + " .align 2, 0\n" + "._230:\n" + " .word Str_841167D\n" + " .word Str_841168D\n" + "._228:\n" + " ldr r2, ._235\n" + " strh r1, [r2]\n" + " ldr r3, ._235 + 4\n" + " ldrh r1, [r2]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r3\n" + " ldr r1, ._235 + 8\n" + " add r0, r0, r1\n" + " ldrh r1, [r0]\n" + " ldr r0, ._235 + 12\n" + " add r4, r2, #0\n" + " cmp r1, r0\n" + " beq ._233 @cond_branch\n" + " cmp r1, #0\n" + " beq ._233 @cond_branch\n" + " bl Menu_EraseScreen\n" + " bl Menu_DisplayDialogueFrame\n" + " add r0, r5, #0\n" + " b ._234\n" + "._236:\n" + " .align 2, 0\n" + "._235:\n" + " .word gSpecialVar_0x8005\n" + " .word gSaveBlock1\n" + " .word 0x2b6c\n" + " .word 0xffff\n" + "._233:\n" + " ldrh r1, [r4]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r3\n" + " ldr r5, ._238\n" + " add r0, r0, r5\n" + " mov r2, #0x0\n" + " strh r2, [r0]\n" + " ldrh r1, [r4]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r3\n" + " ldr r1, ._238 + 4\n" + " add r0, r0, r1\n" + " strh r2, [r0]\n" + " ldrh r1, [r4]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r3\n" + " sub r5, r5, #0xe\n" + " add r0, r0, r5\n" + " mov r1, #0xff\n" + " strb r1, [r0]\n" + " ldrh r1, [r4]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r5, r5, #0x8\n" + " add r1, r3, r5\n" + " add r0, r0, r1\n" + " str r2, [r0]\n" + " mov r0, #0x0\n" + " ldr r1, ._238 + 8\n" + " mov ip, r1\n" + " sub r5, r5, #0x1a\n" + " add r7, r3, r5\n" + " add r6, r4, #0\n" + " ldr r1, ._238 + 12\n" + " add r5, r1, #0\n" + "._237:\n" + " lsl r1, r0, #0x18\n" + " asr r1, r1, #0x18\n" + " lsl r3, r1, #0x1\n" + " ldrh r2, [r6]\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x2\n" + " add r3, r3, r0\n" + " add r3, r3, r7\n" + " ldrh r0, [r3]\n" + " orr r0, r0, r5\n" + " strh r0, [r3]\n" + " add r1, r1, #0x1\n" + " lsl r1, r1, #0x18\n" + " lsr r0, r1, #0x18\n" + " asr r1, r1, #0x18\n" + " cmp r1, #0x8\n" + " ble ._237 @cond_branch\n" + " ldrh r1, [r4]\n" + " mov r0, ip\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r4, ._238 + 16\n" + " add r0, r4, #0\n" + " mov r1, sp\n" + " bl StringExpandPlaceholders\n" + " bl Menu_EraseScreen\n" + " bl Menu_DisplayDialogueFrame\n" + " add r0, r4, #0\n" + "._234:\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + "._229:\n" + " bl debug_sub_810D340\n" + "._227:\n" + " mov r0, #0x0\n" + " add sp, sp, #0x34\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._239:\n" + " .align 2, 0\n" + "._238:\n" + " .word 0x2b6c\n" + " .word 0x2b6a\n" + " .word gStringVar1\n" + " .word 0xffff\n" + " .word gStringVar4\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810D174() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffeec\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " ldr r1, ._242\n" + " add r0, sp, #0x8\n" + " mov r2, #0xc\n" + " bl memcpy\n" + " mov r5, #0x0\n" + " mov r0, sp\n" + " add r0, r0, #0x14\n" + " str r0, [sp, #0x110]\n" + " add r1, sp, #0xc8\n" + " mov r8, r1\n" + " add r2, sp, #0xcc\n" + " mov sl, r2\n" + " ldr r0, ._242 + 4\n" + " mov r9, r0\n" + "._248:\n" + " ldr r0, ._242 + 8\n" + " add r1, r5, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " lsl r1, r5, #0x3\n" + " add r0, r1, r5\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r9\n" + " ldr r2, ._242 + 12\n" + " add r4, r0, r2\n" + " ldrh r0, [r4]\n" + " add r6, r1, #0\n" + " ldr r1, ._242 + 16\n" + " cmp r0, r1\n" + " bne ._240 @cond_branch\n" + " ldr r0, ._242 + 20\n" + " mov r1, #0x1\n" + " b ._241\n" + "._243:\n" + " .align 2, 0\n" + "._242:\n" + " .word Str_84116AE\n" + " .word gSaveBlock1\n" + " .word gStringVar1\n" + " .word 0x2b6c\n" + " .word 0xffff\n" + " .word gStringVar2\n" + "._240:\n" + " sub r0, r0, #0x79\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi ._244 @cond_branch\n" + " ldr r0, ._246\n" + " mov r1, #0x2\n" + "._241:\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " b ._245\n" + "._247:\n" + " .align 2, 0\n" + "._246:\n" + " .word gStringVar2\n" + "._244:\n" + " ldr r0, ._253\n" + " mov r1, #0x0\n" + " mov r2, #0x1\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0x0\n" + " strh r0, [r4]\n" + "._245:\n" + " add r0, r6, r5\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r9\n" + " ldr r2, ._253 + 4\n" + " add r0, r0, r2\n" + " ldrh r1, [r0]\n" + " mov r0, #0xb\n" + " mul r1, r1, r0\n" + " ldr r0, ._253 + 8\n" + " add r1, r1, r0\n" + " ldr r0, ._253 + 12\n" + " bl StringCopy\n" + " lsl r4, r5, #0x2\n" + " add r4, r4, r5\n" + " lsl r4, r4, #0x2\n" + " ldr r0, [sp, #0x110]\n" + " add r4, r0, r4\n" + " add r0, r4, #0\n" + " add r1, sp, #0x8\n" + " bl StringExpandPlaceholders\n" + " mov r1, r8\n" + " add r0, r1, r6\n" + " str r4, [r0]\n" + " mov r2, sl\n" + " add r0, r2, r6\n" + " mov r4, #0x0\n" + " str r4, [r0]\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x8\n" + " bls ._248 @cond_branch\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x10\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " mov r3, r8\n" + " bl Menu_PrintItems\n" + " str r4, [sp]\n" + " mov r0, #0xf\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x9\n" + " bl InitMenu\n" + " cmp r7, #0x1\n" + " beq ._249 @cond_branch\n" + " cmp r7, #0x1\n" + " bgt ._250 @cond_branch\n" + " cmp r7, #0\n" + " beq ._251 @cond_branch\n" + " b ._257\n" + "._254:\n" + " .align 2, 0\n" + "._253:\n" + " .word gStringVar2\n" + " .word 0x2b6a\n" + " .word gSpeciesNames\n" + " .word gStringVar3\n" + "._250:\n" + " cmp r7, #0x2\n" + " beq ._255 @cond_branch\n" + " cmp r7, #0x3\n" + " beq ._256 @cond_branch\n" + " b ._257\n" + "._251:\n" + " ldr r1, ._259\n" + " ldr r0, ._259 + 4\n" + " b ._264\n" + "._260:\n" + " .align 2, 0\n" + "._259:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_810CE48+1\n" + "._249:\n" + " ldr r1, ._262\n" + " ldr r0, ._262 + 4\n" + " b ._264\n" + "._263:\n" + " .align 2, 0\n" + "._262:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_810CED0+1\n" + "._255:\n" + " ldr r1, ._265\n" + " ldr r0, ._265 + 4\n" + " b ._264\n" + "._266:\n" + " .align 2, 0\n" + "._265:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_810CFA4+1\n" + "._256:\n" + " ldr r1, ._267\n" + " ldr r0, ._267 + 4\n" + "._264:\n" + " str r0, [r1]\n" + "._257:\n" + " add sp, sp, #0x114\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._268:\n" + " .align 2, 0\n" + "._267:\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_810D030+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810D2F4() +{ + asm( + " push {lr}\n" + " bl Menu_ProcessInput\n" + " lsl r2, r0, #0x18\n" + " asr r1, r2, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._269 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r1, r0\n" + " bne ._270 @cond_branch\n" + " ldr r0, ._272\n" + " bl SetMainCallback2\n" + " b ._279\n" + "._273:\n" + " .align 2, 0\n" + "._272:\n" + " .word debug_sub_810CDF0+1\n" + "._270:\n" + " cmp r1, #0x1\n" + " beq ._278 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt ._275 @cond_branch\n" + " cmp r1, #0\n" + " beq ._278 @cond_branch\n" + " b ._279\n" + "._275:\n" + " cmp r1, #0x2\n" + " beq ._278 @cond_branch\n" + " cmp r1, #0x3\n" + " bne ._279 @cond_branch\n" + "._278:\n" + " lsr r0, r2, #0x18\n" + " bl debug_sub_810D174\n" + "._269:\n" + " mov r0, #0x0\n" + " b ._280\n" + "._279:\n" + " mov r0, #0x1\n" + "._280:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810D340() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x9\n" + " mov r3, #0x9\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r3, ._281\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x4\n" + " bl Menu_PrintItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x8\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " ldr r1, ._281 + 4\n" + " ldr r0, ._281 + 8\n" + " str r0, [r1]\n" + " add sp, sp, #0x8\n" + " pop {r0}\n" + " bx r0\n" + "._282:\n" + " .align 2, 0\n" + "._281:\n" + " .word _84116BC\n" + " .word gCallback_03004AE8\n" + " .word debug_sub_810D2F4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_810D388() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " ldr r1, ._285\n" + " ldr r2, ._285 + 4\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " add r2, r1, #0\n" + " cmp r0, #0x8\n" + " bls ._283 @cond_branch\n" + " b ._320\n" + "._283:\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._285 + 8\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._286:\n" + " .align 2, 0\n" + "._285:\n" + " .word gMain\n" + " .word 0x43c\n" + " .word ._287\n" + "._287:\n" + " .word ._288\n" + " .word ._289\n" + " .word ._290\n" + " .word ._291\n" + " .word ._292\n" + " .word ._293\n" + " .word ._294\n" + " .word ._295\n" + " .word ._296\n" + "._288:\n" + " ldr r3, ._299\n" + " ldrb r4, [r3]\n" + " cmp r4, #0\n" + " beq ._297 @cond_branch\n" + " ldr r1, ._299 + 4\n" + " add r0, r2, r1\n" + " mov r2, #0x0\n" + " mov r1, #0x2\n" + " strb r1, [r0]\n" + " strb r2, [r3]\n" + " b ._320\n" + "._300:\n" + " .align 2, 0\n" + "._299:\n" + " .word unk_debug_bss_2\n" + " .word 0x43c\n" + "._297:\n" + " bl remove_some_task\n" + " bl ResetPaletteFade\n" + " ldr r0, ._302\n" + " bl SetVBlankCallback\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " str r4, [sp]\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " b ._321\n" + "._303:\n" + " .align 2, 0\n" + "._302:\n" + " .word sub_80F8F18+1\n" + "._289:\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._304 @cond_branch\n" + " b ._320\n" + "._304:\n" + " b ._321\n" + "._290:\n" + " mov r0, #0x0\n" + " bl SetVBlankCallback\n" + " ldr r0, ._308\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " add r0, r0, #0x4\n" + " strh r1, [r0]\n" + " sub r0, r0, #0x2\n" + " strh r1, [r0]\n" + " add r0, r0, #0x4\n" + " strh r1, [r0]\n" + " add r0, r0, #0x2\n" + " strh r1, [r0]\n" + " b ._321\n" + "._309:\n" + " .align 2, 0\n" + "._308:\n" + " .word 0x4000010\n" + "._291:\n" + " bl ResetSpriteData\n" + " bl ResetTasks\n" + " bl FreeAllSpritePalettes\n" + " b ._321\n" + "._292:\n" + " ldr r4, ._312\n" + " add r0, r4, #0\n" + " bl Text_LoadWindowTemplate\n" + " add r0, r4, #0\n" + " bl InitMenuWindow\n" + " bl Menu_EraseScreen\n" + " b ._321\n" + "._313:\n" + " .align 2, 0\n" + "._312:\n" + " .word gWindowTemplate_81E6CE4\n" + "._293:\n" + " ldr r4, ._315\n" + " ldr r0, [r4]\n" + " mov r1, #0x0\n" + " mov r2, #0x20\n" + " bl LoadPalette\n" + " ldr r0, [r4, #0x4]\n" + " mov r1, #0xc0\n" + " lsl r1, r1, #0x13\n" + " bl LZ77UnCompVram\n" + " add r1, sp, #0x4\n" + " mov r0, #0x1\n" + " strh r0, [r1]\n" + " ldr r1, ._315 + 4\n" + " add r2, sp, #0x4\n" + " str r2, [r1]\n" + " ldr r0, ._315 + 8\n" + " str r0, [r1, #0x4]\n" + " ldr r0, ._315 + 12\n" + " str r0, [r1, #0x8]\n" + " ldr r0, [r1, #0x8]\n" + " b ._321\n" + "._316:\n" + " .align 2, 0\n" + "._315:\n" + " .word gMailGraphicsTable\n" + " .word 0x40000d4\n" + " .word 0x6004000\n" + " .word 0x81000280\n" + "._294:\n" + " ldr r1, ._318\n" + " ldr r2, ._318 + 4\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x2\n" + " ldr r2, ._318 + 8\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " add r1, r1, #0x46\n" + " mov r0, #0x0\n" + " strh r0, [r1]\n" + " sub r1, r1, #0x50\n" + " mov r2, #0xd0\n" + " lsl r2, r2, #0x2\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " bl debug_sub_810D340\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x10\n" + " mov r3, #0x0\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._318 + 12\n" + " bl SetVBlankCallback\n" + " b ._321\n" + "._319:\n" + " .align 2, 0\n" + "._318:\n" + " .word 0x4000008\n" + " .word 0x9f08\n" + " .word 0x801\n" + " .word sub_80F8F18+1\n" + "._295:\n" + " bl UpdatePaletteFade\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._320 @cond_branch\n" + " b ._321\n" + "._296:\n" + " ldr r0, ._322\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " ldr r0, ._322 + 4\n" + " bl SetMainCallback2\n" + "._321:\n" + " ldr r1, ._322 + 8\n" + " ldr r0, ._322 + 12\n" + " add r1, r1, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._320:\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._323:\n" + " .align 2, 0\n" + "._322:\n" + " .word debug_sub_810CE1C+1\n" + " .word debug_sub_810CDE0+1\n" + " .word gMain\n" + " .word 0x43c\n" + "\n" + ); +} +#endif \ No newline at end of file diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c index 0242e7444..079bcf489 100644 --- a/src/pokemon/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -524,6 +524,328 @@ void CalculateMonStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_HP, ¤tHP); } +#ifdef DEBUG +__attribute__((naked)) +void debug_sub_803F55C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xffffffc4\n" + " add r5, r0, #0\n" + " mov r1, #0x39\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " str r0, [sp, #0x1c]\n" + " add r0, r5, #0\n" + " mov r1, #0x27\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " add r7, r0, #0\n" + " add r0, r5, #0\n" + " mov r1, #0x1a\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " add r4, r0, #0\n" + " add r0, r5, #0\n" + " mov r1, #0x28\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " mov r9, r0\n" + " add r0, r5, #0\n" + " mov r1, #0x1b\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " mov r8, r0\n" + " add r0, r5, #0\n" + " mov r1, #0x29\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " str r0, [sp, #0x20]\n" + " add r0, r5, #0\n" + " mov r1, #0x1c\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " mov sl, r0\n" + " add r0, r5, #0\n" + " mov r1, #0x2a\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " str r0, [sp, #0x24]\n" + " add r0, r5, #0\n" + " mov r1, #0x1d\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " str r0, [sp, #0x28]\n" + " add r0, r5, #0\n" + " mov r1, #0x2b\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " str r0, [sp, #0x2c]\n" + " add r0, r5, #0\n" + " mov r1, #0x1e\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " str r0, [sp, #0x30]\n" + " add r0, r5, #0\n" + " mov r1, #0x2c\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " str r0, [sp, #0x34]\n" + " add r0, r5, #0\n" + " mov r1, #0x1f\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " str r0, [sp, #0x38]\n" + " add r0, r5, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x0\n" + " bl GetMonData\n" + " lsl r0, r0, #0x10\n" + " lsr r6, r0, #0x10\n" + " add r0, r5, #0\n" + " bl GetLevelFromMonExp\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " str r0, [sp]\n" + " add r0, r5, #0\n" + " mov r1, #0x38\n" + " mov r2, sp\n" + " bl SetMonData\n" + " ldr r0, ._71\n" + " cmp r6, r0\n" + " bne ._69 @cond_branch\n" + " mov r0, #0x1\n" + " str r0, [sp, #0x4]\n" + " lsl r7, r6, #0x3\n" + " b ._70\n" + "._72:\n" + " .align 2, 0\n" + "._71:\n" + " .word 0x12f\n" + "._69:\n" + " ldr r1, ._80\n" + " lsl r2, r6, #0x3\n" + " sub r0, r2, r6\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x1\n" + " add r1, r0, r7\n" + " add r0, r4, #0\n" + " add r7, r2, #0\n" + " cmp r0, #0\n" + " bge ._73 @cond_branch\n" + " add r0, r0, #0x3\n" + "._73:\n" + " asr r0, r0, #0x2\n" + " add r0, r1, r0\n" + " ldr r4, [sp]\n" + " mul r0, r0, r4\n" + " mov r1, #0x64\n" + " bl gScriptFuncs_End+0x3d30\n" + " add r0, r0, r4\n" + " add r0, r0, #0xa\n" + " str r0, [sp, #0x4]\n" + "._70:\n" + " add r2, sp, #0x4\n" + " add r0, r5, #0\n" + " mov r1, #0x3a\n" + " bl SetMonData\n" + " ldr r1, ._80\n" + " sub r0, r7, r6\n" + " lsl r0, r0, #0x2\n" + " add r6, r0, r1\n" + " ldrb r0, [r6, #0x1]\n" + " lsl r0, r0, #0x1\n" + " mov r2, r9\n" + " add r1, r0, r2\n" + " mov r0, r8\n" + " cmp r0, #0\n" + " bge ._74 @cond_branch\n" + " add r0, r0, #0x3\n" + "._74:\n" + " asr r0, r0, #0x2\n" + " add r0, r1, r0\n" + " ldr r1, [sp]\n" + " mul r0, r0, r1\n" + " mov r1, #0x64\n" + " bl gScriptFuncs_End+0x3d30\n" + " add r0, r0, #0x5\n" + " str r0, [sp, #0x8]\n" + " add r0, r5, #0\n" + " bl GetNature\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r4, sp, #0x8\n" + " ldrh r1, [r4]\n" + " mov r2, #0x1\n" + " bl nature_stat_mod\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r0, [sp, #0x8]\n" + " add r0, r5, #0\n" + " mov r1, #0x3b\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " ldrb r0, [r6, #0x2]\n" + " lsl r0, r0, #0x1\n" + " ldr r2, [sp, #0x20]\n" + " add r1, r0, r2\n" + " mov r0, sl\n" + " cmp r0, #0\n" + " bge ._75 @cond_branch\n" + " add r0, r0, #0x3\n" + "._75:\n" + " asr r0, r0, #0x2\n" + " add r0, r1, r0\n" + " ldr r1, [sp]\n" + " mul r0, r0, r1\n" + " mov r1, #0x64\n" + " bl gScriptFuncs_End+0x3d30\n" + " add r0, r0, #0x5\n" + " str r0, [sp, #0xc]\n" + " add r0, r5, #0\n" + " bl GetNature\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r4, sp, #0xc\n" + " ldrh r1, [r4]\n" + " mov r2, #0x2\n" + " bl nature_stat_mod\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r0, [sp, #0xc]\n" + " add r0, r5, #0\n" + " mov r1, #0x3c\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " ldrb r0, [r6, #0x3]\n" + " lsl r0, r0, #0x1\n" + " ldr r2, [sp, #0x24]\n" + " add r1, r0, r2\n" + " ldr r0, [sp, #0x28]\n" + " cmp r0, #0\n" + " bge ._76 @cond_branch\n" + " add r0, r0, #0x3\n" + "._76:\n" + " asr r0, r0, #0x2\n" + " add r0, r1, r0\n" + " ldr r1, [sp]\n" + " mul r0, r0, r1\n" + " mov r1, #0x64\n" + " bl gScriptFuncs_End+0x3d30\n" + " add r0, r0, #0x5\n" + " str r0, [sp, #0x10]\n" + " add r0, r5, #0\n" + " bl GetNature\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r4, sp, #0x10\n" + " ldrh r1, [r4]\n" + " mov r2, #0x3\n" + " bl nature_stat_mod\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r0, [sp, #0x10]\n" + " add r0, r5, #0\n" + " mov r1, #0x3d\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " ldrb r0, [r6, #0x4]\n" + " lsl r0, r0, #0x1\n" + " ldr r2, [sp, #0x2c]\n" + " add r1, r0, r2\n" + " ldr r0, [sp, #0x30]\n" + " cmp r0, #0\n" + " bge ._77 @cond_branch\n" + " add r0, r0, #0x3\n" + "._77:\n" + " asr r0, r0, #0x2\n" + " add r0, r1, r0\n" + " ldr r1, [sp]\n" + " mul r0, r0, r1\n" + " mov r1, #0x64\n" + " bl gScriptFuncs_End+0x3d30\n" + " add r0, r0, #0x5\n" + " str r0, [sp, #0x14]\n" + " add r0, r5, #0\n" + " bl GetNature\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r4, sp, #0x14\n" + " ldrh r1, [r4]\n" + " mov r2, #0x4\n" + " bl nature_stat_mod\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r0, [sp, #0x14]\n" + " add r0, r5, #0\n" + " mov r1, #0x3e\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " ldrb r0, [r6, #0x5]\n" + " lsl r0, r0, #0x1\n" + " ldr r1, [sp, #0x34]\n" + " add r2, r0, r1\n" + " ldr r0, [sp, #0x38]\n" + " cmp r0, #0\n" + " bge ._78 @cond_branch\n" + " add r0, r0, #0x3\n" + "._78:\n" + " asr r0, r0, #0x2\n" + " add r0, r2, r0\n" + " ldr r1, [sp]\n" + " mul r0, r0, r1\n" + " mov r1, #0x64\n" + " bl gScriptFuncs_End+0x3d30\n" + " add r0, r0, #0x5\n" + " str r0, [sp, #0x18]\n" + " add r0, r5, #0\n" + " bl GetNature\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " add r4, sp, #0x18\n" + " ldrh r1, [r4]\n" + " mov r2, #0x5\n" + " bl nature_stat_mod\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r0, [sp, #0x18]\n" + " add r0, r5, #0\n" + " mov r1, #0x3f\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " ldr r1, [sp, #0x4]\n" + " ldr r0, [sp, #0x1c]\n" + " cmp r1, r0\n" + " bge ._79 @cond_branch\n" + " str r1, [sp, #0x1c]\n" + "._79:\n" + " add r2, sp, #0x1c\n" + " add r0, r5, #0\n" + " mov r1, #0x39\n" + " bl SetMonData\n" + " add sp, sp, #0x3c\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._81:\n" + " .align 2, 0\n" + "._80:\n" + " .word gBaseStats\n" + "\n" + ); +} +#endif + void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest) { u32 value = 0; diff --git a/src/rom3.c b/src/rom3.c index 11239a681..2b719d14a 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -67,6 +67,10 @@ void sub_800B858(void) } } +#ifdef DEBUG +extern u8 gUnknown_02023A14_50; +#endif + void setup_poochyena_battle(void) { s32 i; @@ -93,6 +97,16 @@ void setup_poochyena_battle(void) } gUnknown_020239FC = 0; gUnknown_02024C78 = 0; + +#ifdef DEBUG + if (gUnknown_02023A14_50 & 0x80) + { + ewram[0x160fd] = 0; + ewram[0x160fe] = 0; + ewram[0x160ff] = 0; + ((u32 *) gBattleBuffersTransferData)[64]++; + } +#endif } void sub_800B950(void) diff --git a/src/rom6.c b/src/rom6.c index e71484b0a..1c0654538 100644 --- a/src/rom6.c +++ b/src/rom6.c @@ -1,4 +1,6 @@ #include "global.h" +#include "constants/map_objects.h" +#include "constants/songs.h" #include "rom6.h" #include "braille_puzzles.h" #include "field_effect.h" @@ -8,7 +10,6 @@ #include "pokemon_menu.h" #include "overworld.h" #include "script.h" -#include "constants/songs.h" #include "sound.h" #include "sprite.h" #include "task.h" @@ -116,6 +117,21 @@ static void sub_810B4CC(u8 taskId) DestroyTask(taskId); } +#ifdef DEBUG +void debug_sub_8120968(void) +{ + if (npc_before_player_of_type(MAP_OBJ_GFX_BREAKABLE_ROCK) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + sub_810B53C(); + } + else + { + ScriptContext2_Disable(); + } +} +#endif + bool8 SetUpFieldMove_RockSmash(void) { if (npc_before_player_of_type(0x56) == TRUE) diff --git a/src/roulette.c b/src/roulette.c index 6d79f9d38..ce95bc1c9 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -308,7 +308,10 @@ extern const u16 gUnknown_083FA632[]; extern const s8 gUnknown_083FA64A[0x2]; extern const s8 gUnknown_083FA64C[0x8][0x2]; - +#if DEBUG +EWRAM_DATA u8 unk_203955C[4] = { 0 }; +EWRAM_DATA u8 unk_2039560[4] = { 0 }; +#endif void sub_81150FC(void) diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index d8e099130..4bf0cef09 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -6,6 +6,7 @@ #include "palette.h" #include "random.h" #include "main.h" +#include "menu.h" #include "script.h" #include "task.h" #include "sound.h" @@ -102,6 +103,31 @@ static void sub_81248AC(u8); // .rodata +#if DEBUG + +u8 debug_sub_8138D74(void); +u8 debug_sub_8138D8C(void); +u8 debug_sub_8138C14(void); +u8 debug_sub_8138C34(void); +u8 debug_sub_810CD9C(void); + +const u8 Str_842DBD0[] = _("CABLE CAR U"); +const u8 Str_842DBDC[] = _("CABLE CAR D"); +const u8 Str_842DBE8[] = _("ROULETTE1"); +const u8 Str_842DBF2[] = _("ROULETTE3"); +const u8 Str_842DBFC[] = _("View a MAIL"); + +const struct MenuAction gUnkDebug4Menu[] = +{ + {Str_842DBD0, debug_sub_8138D74}, + {Str_842DBDC, debug_sub_8138D8C}, + {Str_842DBE8, debug_sub_8138C14}, + {Str_842DBF2, debug_sub_8138C34}, + {Str_842DBFC, debug_sub_810CD9C}, +}; + +#endif + static const u8 gCableCarMtChimneyTilemap[] = INCBIN_U8("graphics/misc/cable_car_mt_chimney_map.bin.lz"); static const u8 gCableCarTreeTilemap[] = INCBIN_U8("graphics/misc/cable_car_tree_map.bin.lz"); @@ -182,6 +208,158 @@ static const struct SpriteTemplate gSpriteTemplate_8401D40[] = { // .text +#if DEBUG + +__attribute__((naked)) +u8 debug_sub_8138C14(void) +{ + asm("\n\ + push {lr}\n\ + ldr r0, ._1\n\ + mov r1, #0x1\n\ + strb r1, [r0]\n\ + ldr r0, ._1 + 4\n\ + bl ScriptContext1_SetupScript\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ + pop {r1}\n\ + bx r1\n\ +._2:\n\ + .align 2, 0\n\ +._1:\n\ + .word unk_203955C\n\ + .word MauvilleCity_GameCorner_EventScript_1C407E"); +} + +__attribute__((naked)) +u8 debug_sub_8138C34(void) +{ + asm("\n\ + push {lr}\n\ + ldr r0, ._3\n\ + mov r1, #0x1\n\ + strb r1, [r0]\n\ + ldr r0, ._3 + 4\n\ + bl ScriptContext1_SetupScript\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ + pop {r1}\n\ + bx r1\n\ +._4:\n\ + .align 2, 0\n\ +._3:\n\ + .word unk_203955C\n\ + .word MauvilleCity_GameCorner_EventScript_1C40AC"); +} + +__attribute__((naked)) +u8 debug_sub_8138C54(void) +{ + asm("\n\ + push {r4, lr}\n\ + ldr r4, ._10\n\ + ldrh r0, [r4, #0x2e]\n\ + cmp r0, #0x40\n\ + bne ._5 @cond_branch\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + bl Menu_MoveCursor\n\ +._5:\n\ + ldrh r0, [r4, #0x2e]\n\ + cmp r0, #0x80\n\ + bne ._6 @cond_branch\n\ + mov r0, #0x1\n\ + bl Menu_MoveCursor\n\ +._6:\n\ + ldrh r1, [r4, #0x2e]\n\ + cmp r1, #0x1\n\ + beq ._7 @cond_branch\n\ + ldr r0, ._10 + 4\n\ + cmp r1, r0\n\ + bne ._8 @cond_branch\n\ + ldr r1, ._10 + 8\n\ + mov r0, #0x1\n\ + strh r0, [r1]\n\ +._7:\n\ + ldr r4, ._10 + 12\n\ + bl Menu_GetCursorPos\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x15\n\ + add r4, r4, #0x4\n\ + add r0, r0, r4\n\ + ldr r0, [r0]\n\ + bl _call_via_r0\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + b ._13\n\ +._11:\n\ + .align 2, 0\n\ +._10:\n\ + .word gMain\n\ + .word 0x101\n\ + .word gSpecialVar_0x8004\n\ + .word gUnkDebug4Menu\n\ +._8:\n\ + cmp r1, #0x2\n\ + beq ._12 @cond_branch\n\ + mov r0, #0x0\n\ + b ._13\n\ +._12:\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ +._13:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1"); +} + +__attribute__((naked)) +u8 debug_sub_8138CC4(void) +{ + asm("\n\ + push {lr}\n\ + add sp, sp, #0xfffffff8\n\ + ldr r1, ._14\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + bl Menu_EraseScreen\n\ + mov r0, #0x13\n\ + mov r1, #0x0\n\ + mov r2, #0x1d\n\ + mov r3, #0xc\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r3, ._14 + 4\n\ + mov r0, #0x14\n\ + mov r1, #0x1\n\ + mov r2, #0x5\n\ + bl Menu_PrintItems\n\ + mov r0, #0x0\n\ + str r0, [sp]\n\ + mov r0, #0x8\n\ + str r0, [sp, #0x4]\n\ + mov r0, #0x0\n\ + mov r1, #0x14\n\ + mov r2, #0x1\n\ + mov r3, #0x5\n\ + bl InitMenu\n\ + ldr r1, ._14 + 8\n\ + ldr r0, ._14 + 12\n\ + str r0, [r1]\n\ + mov r0, #0x0\n\ + add sp, sp, #0x8\n\ + pop {r1}\n\ + bx r1\n\ +._15:\n\ + .align 2, 0\n\ +._14:\n\ + .word gSpecialVar_0x8004\n\ + .word gUnkDebug4Menu\n\ + .word gCallback_03004AE8\n\ + .word debug_sub_8138C54+1"); +} + +#endif + static void CableCarTask1(u8 taskId) { if (!gPaletteFade.active) @@ -198,6 +376,46 @@ void CableCar(void) BeginNormalPaletteFade(-1, 0, 0, 16, 0); } +#if DEBUG + +__attribute__((naked)) +u8 debug_sub_8138D74(void) +{ + asm("\n\ + push {lr}\n\ + ldr r1, ._21\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + bl CloseMenu\n\ + bl CableCar\n\ + pop {r0}\n\ + bx r0\n\ +._22:\n\ + .align 2, 0\n\ +._21:\n\ + .word gSpecialVar_0x8004"); +} + +__attribute__((naked)) +u8 debug_sub_8138D8C(void) +{ + asm("\n\ + push {lr}\n\ + ldr r1, ._23\n\ + mov r0, #0x1\n\ + strh r0, [r1]\n\ + bl CloseMenu\n\ + bl CableCar\n\ + pop {r0}\n\ + bx r0\n\ +._24:\n\ + .align 2, 0\n\ +._23:\n\ + .word gSpecialVar_0x8004"); +} + +#endif + static void CableCarMainCallback_Setup(void) { u8 i; diff --git a/src/scene/new_game.c b/src/scene/new_game.c index 0279f99c6..d954fb3c8 100644 --- a/src/scene/new_game.c +++ b/src/scene/new_game.c @@ -1,4 +1,7 @@ #include "global.h" +#include "constants/maps.h" +#include "constants/species.h" +#include "clock.h" #include "new_game.h" #include "battle_records.h" #include "berry.h" @@ -20,6 +23,7 @@ #include "pokemon_storage_system.h" #include "random.h" #include "roamer.h" +#include "script_pokemon_80C4.h" #include "overworld.h" #include "rtc.h" #include "script.h" @@ -27,6 +31,10 @@ #include "text.h" #include "tv.h" +#ifdef DEBUG +extern u8 gUnknown_020297ED; +#endif + EWRAM_DATA u8 gDifferentSaveFile = 0; EWRAM_DATA u8 gUnknown_020297ED = 0; @@ -42,6 +50,18 @@ static const struct ContestWinner sEmptyMuseumPortrait = .trainerName = {EOS}, }; +#ifdef DEBUG +const s8 gUnknown_Debug_0823C788[][2] = +{ + { MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK) }, + { MAP_GROUP(OLDALE_TOWN_POKEMON_CENTER_2F), MAP_NUM(OLDALE_TOWN_POKEMON_CENTER_2F) }, + { MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN) }, + { MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F) } +}; + +const u8 gUnknown_Debug_0823C790[] = _("KRÖTE"); +#endif + void write_word_to_mem(u32 var, u8 *dataPtr) { dataPtr[0] = var; @@ -94,6 +114,30 @@ void ZeroBattleTowerData(void) CpuFill32(0, &gSaveBlock2.battleTower, sizeof(gSaveBlock2.battleTower)); } +#ifdef DEBUG +void debug_sub_8052E04() +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_Debug_0823C788[i][0] == gSaveBlock1.location.mapGroup && + gUnknown_Debug_0823C788[i][1] == gSaveBlock1.location.mapNum) + { + break; + } + } + + i++; + if (i >= 4) + { + i = 0; + } + + Overworld_SetWarpDestination(gUnknown_Debug_0823C788[i][0], gUnknown_Debug_0823C788[i][1], -1, -1, -1); +} +#endif + void WarpToTruck(void) { Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck @@ -109,6 +153,9 @@ void ClearSav2(void) void sub_8052E4C(void) { gDifferentSaveFile = 0; +#ifdef DEBUG + gUnknown_020297ED = 0; +#endif sub_808C0A0(); ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); @@ -161,3 +208,33 @@ void NewGameInitData(void) WarpToTruck(); ScriptContext2_RunNewScript(gUnknown_0819FA81); } + +#ifdef DEBUG +extern void debug_sub_80A3904(void); +extern void debug_sub_80A3714(void); +extern void debug_sub_8120F98(void); +extern void unref_sub_8070F90(void); + +void debug_sub_8057508(bool32 arg0) +{ + gUnknown_020297ED = 1; + NewGameInitData(); + gSaveBlock1.money = 999999; + FlagSet(FLAG_SYS_POKEMON_GET); + FlagSet(FLAG_SYS_POKEDEX_GET); + FlagSet(FLAG_SYS_POKENAV_GET); + FlagSet(FLAG_SYS_B_DASH); + ScriptGiveMon(SPECIES_TREECKO, 99, 0, 0, 0, 0); + + if (arg0 == TRUE) + SetMonData(&gPlayerParty[0], MON_DATA_NICKNAME, gUnknown_Debug_0823C790); + + debug_sub_80A3904(); + debug_sub_80A3714(); + debug_sub_8120F98(); + FlagSet(FLAG_SYS_HIPSTER_MEET); + sub_80EB8EC(); + unref_sub_8070F90(); + InitTimeBasedEvents(); +} +#endif diff --git a/src/scene/title_screen.c b/src/scene/title_screen.c index 202b752a6..8d5c4da13 100644 --- a/src/scene/title_screen.c +++ b/src/scene/title_screen.c @@ -8,6 +8,7 @@ #include "m4a.h" #include "main.h" #include "main_menu.h" +#include "overworld.h" #include "palette.h" #include "reset_rtc_screen.h" #include "sound.h" @@ -353,6 +354,7 @@ static void Task_TitleScreenPhase1(u8); static void Task_TitleScreenPhase2(u8); static void Task_TitleScreenPhase3(u8); static void CB2_GoToMainMenu(void); +static void CB2_GoToTestMenu(void); static void CB2_GoToClearSaveDataScreen(void); static void CB2_GoToResetRtcScreen(void); static void CB2_GoToCopyrightScreen(void); @@ -829,6 +831,13 @@ static void Task_TitleScreenPhase3(u8 taskId) BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); SetMainCallback2(CB2_GoToResetRtcScreen); } +#ifdef DEBUG + else if (gMain.heldKeys == SELECT_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + SetMainCallback2(CB2_GoToTestMenu); + } +#endif else { REG_BG2Y = 0; @@ -855,6 +864,14 @@ static void CB2_GoToMainMenu(void) SetMainCallback2(CB2_InitMainMenu); } +#ifdef DEBUG +static void CB2_GoToTestMenu(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitTestMenu); +} +#endif + static void CB2_GoToCopyrightScreen(void) { if (!UpdatePaletteFade()) -- cgit v1.2.3 From bcf3fb87450883c9c26afec55f5f0ddc04864e84 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 12:07:40 -0600 Subject: add more debug data --- src/debug/start_menu_debug.c | 6130 ++++++++++++++++++++++++++++++++++++++++++ src/debug/unk_debug_menu_3.c | 797 ++++++ src/engine/sprite.c | 4 +- 3 files changed, 6929 insertions(+), 2 deletions(-) create mode 100644 src/debug/start_menu_debug.c create mode 100644 src/debug/unk_debug_menu_3.c (limited to 'src') diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c new file mode 100644 index 000000000..28f3a26d1 --- /dev/null +++ b/src/debug/start_menu_debug.c @@ -0,0 +1,6130 @@ +__attribute__((naked)) +void debug_sub_8076AC8() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._3\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x1\n" + " ldr r0, ._3 + 4\n" + " add r1, r1, r0\n" + " str r1, [r2]\n" + " mov r4, #0x0\n" + " ldrb r0, [r1]\n" + " cmp r0, #0xff\n" + " beq ._1 @cond_branch\n" + "._2:\n" + " add r4, r4, #0x1\n" + " add r0, r1, r4\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " bne ._2 @cond_branch\n" + "._1:\n" + " mov r0, #0x10\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuZeroFillWindowRect\n" + " lsl r3, r4, #0x1\n" + " add r3, r3, #0x1\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x10\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " bl MenuDrawTextWindow\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r3, ._3 + 8\n" + " ldr r0, ._3\n" + " ldr r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, #0x11\n" + " mov r1, #0x1\n" + " add r2, r4, #0\n" + " bl PrintMenuItemsReordered\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0xc\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x11\n" + " mov r2, #0x1\n" + " add r3, r4, #0\n" + " bl InitMenu\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word 0x30006c4 @ gTileset1AnimLength\n" + " .word gUnknown_Debug_0839BBC1+0x153\n" + " .word gUnknown_Debug_0839BBC1+0xd3\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8076B4C() +{ + asm( + " push {lr}\n" + " ldr r0, ._6\n" + " bl FindTaskIdByFunc\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0xff\n" + " beq ._5 @cond_branch\n" + " bl DestroyTask\n" + "._5:\n" + " pop {r0}\n" + " bx r0\n" + "._7:\n" + " .align 2, 0\n" + "._6:\n" + " .word debug_sub_8076BB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8076B68() +{ + asm( + " push {lr}\n" + " ldr r0, ._8\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r0, ._8 + 4\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl MenuPrint\n" + " ldr r0, ._8 + 8\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl MenuPrint\n" + " mov r0, #0x4\n" + " mov r1, #0xb\n" + " bl debug_sub_8077CF4\n" + " mov r0, #0x0\n" + " bl debug_sub_8076AC8\n" + " ldr r0, ._8 + 12\n" + " mov r1, #0x1\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._9:\n" + " .align 2, 0\n" + "._8:\n" + " .word gUnknown_Debug_0839BBB6\n" + " .word gUnknown_Debug_0839BBC1\n" + " .word gUnknown_Debug_0839BBA4\n" + " .word debug_sub_8076BB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8076BB4() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._13\n" + " add r5, r1, r0\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r1, r0, #0x18\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._10 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r4, r0\n" + " beq ._11 @cond_branch\n" + " ldr r2, ._13 + 4\n" + " lsl r1, r1, #0x18\n" + " asr r1, r1, #0x18\n" + " ldr r0, ._13 + 8\n" + " ldr r0, [r0]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r2, r2, #0x4\n" + " add r0, r0, r2\n" + " ldr r0, [r0]\n" + " bl gScriptFuncs_End+0x3cf4\n" + " b ._24\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word gTasks+0x8\n" + " .word gUnknown_Debug_0839BBC1+0xd3\n" + " .word 0x30006c4 @ gTileset1AnimLength\n" + "._10:\n" + " ldr r0, ._18\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " cmp r2, #0\n" + " beq ._15 @cond_branch\n" + " ldrh r1, [r5]\n" + " mov r2, #0x0\n" + " ldsh r0, [r5, r2]\n" + " cmp r0, #0\n" + " bne ._16 @cond_branch\n" + " mov r0, #0x1\n" + " b ._20\n" + "._19:\n" + " .align 2, 0\n" + "._18:\n" + " .word gMain\n" + "._16:\n" + " sub r0, r1, #1\n" + " b ._20\n" + "._15:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._24 @cond_branch\n" + " ldrh r1, [r5]\n" + " mov r3, #0x0\n" + " ldsh r0, [r5, r3]\n" + " cmp r0, #0x1\n" + " bne ._22 @cond_branch\n" + " strh r2, [r5]\n" + " b ._23\n" + "._22:\n" + " add r0, r1, #1\n" + "._20:\n" + " strh r0, [r5]\n" + "._23:\n" + " ldrb r0, [r5]\n" + " bl debug_sub_8076AC8\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " b ._24\n" + "._11:\n" + " bl DoSoftReset\n" + "._24:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076C6C() +{ + asm( + " push {lr}\n" + " ldr r0, ._25\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._26:\n" + " .align 2, 0\n" + "._25:\n" + " .word debug_sub_8010800+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076C80() +{ + asm( + " push {lr}\n" + " bl debug_sub_8076B4C\n" + " bl DebugMenu_8076FEC\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076C90() +{ + asm( + " push {lr}\n" + " ldr r0, ._29\n" + " ldrh r0, [r0]\n" + " cmp r0, #0xff\n" + " bne ._27 @cond_branch\n" + " mov r0, #0x16\n" + " bl PlaySE\n" + " b ._28\n" + "._30:\n" + " .align 2, 0\n" + "._29:\n" + " .word gSaveFileStatus\n" + "._27:\n" + " bl debug_sub_8076B4C\n" + " ldr r0, ._31\n" + " bl SetMainCallback2\n" + "._28:\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._32:\n" + " .align 2, 0\n" + "._31:\n" + " .word CB2_ContinueSavedGame+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076CBC() +{ + asm( + " mov r0, #0x0\n" + " bx lr\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076CC0() +{ + asm( + " push {lr}\n" + " ldr r0, ._33\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._34:\n" + " .align 2, 0\n" + "._33:\n" + " .word debug_nullsub_66+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076CD4() +{ + asm( + " mov r0, #0x0\n" + " bx lr\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076CD8() +{ + asm( + " push {lr}\n" + " ldr r0, ._35\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._36:\n" + " .align 2, 0\n" + "._35:\n" + " .word unref_sub_80524BC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076CEC() +{ + asm( + " push {lr}\n" + " ldr r0, ._37\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._38:\n" + " .align 2, 0\n" + "._37:\n" + " .word CB2_InitMysteryEventMenu+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076D00() +{ + asm( + " push {lr}\n" + " ldr r0, ._39\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._40:\n" + " .align 2, 0\n" + "._39:\n" + " .word debug_sub_815D15C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076D14() +{ + asm( + " push {lr}\n" + " ldr r0, ._41\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._42:\n" + " .align 2, 0\n" + "._41:\n" + " .word sub_804B790+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076D28() +{ + asm( + " push {lr}\n" + " ldr r0, ._43\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._44:\n" + " .align 2, 0\n" + "._43:\n" + " .word LinkTestScreen+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076D3C() +{ + asm( + " push {lr}\n" + " ldr r0, ._45\n" + " bl SetMainCallback2\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._46:\n" + " .align 2, 0\n" + "._45:\n" + " .word CB2_StartSoundCheckMenu+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076D50() +{ + asm( + " push {lr}\n" + " bl ClearSaveData\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076D5C() +{ + asm( + " push {lr}\n" + " bl debug_sub_8076B4C\n" + " bl debug_sub_806F8F8\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076D6C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " lsl r0, r3, #0x2\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._51\n" + " add r4, r0, r1\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " cmp r1, #0x1\n" + " beq ._47 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt ._48 @cond_branch\n" + " cmp r1, #0\n" + " beq ._49 @cond_branch\n" + " b ._64\n" + "._52:\n" + " .align 2, 0\n" + "._51:\n" + " .word gTasks+0x8\n" + "._48:\n" + " cmp r1, #0x2\n" + " beq ._53 @cond_branch\n" + " b ._64\n" + "._49:\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._56\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " b ._55\n" + "._57:\n" + " .align 2, 0\n" + "._56:\n" + " .word gUnknown_Debug_0839BBC1+0x16b\n" + "._47:\n" + " ldr r0, ._60\n" + " ldrh r2, [r0, #0x2e]\n" + " and r1, r1, r2\n" + " cmp r1, #0\n" + " beq ._58 @cond_branch\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._60 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " bl RtcReset\n" + "._55:\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._64\n" + "._61:\n" + " .align 2, 0\n" + "._60:\n" + " .word gMain\n" + " .word gUnknown_Debug_0839BBC1+0x18b\n" + "._58:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._64 @cond_branch\n" + " add r0, r3, #0\n" + " bl DestroyTask\n" + " bl DoSoftReset\n" + " b ._64\n" + "._53:\n" + " ldr r0, ._65\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._64 @cond_branch\n" + " add r0, r3, #0\n" + " bl DestroyTask\n" + " bl DoSoftReset\n" + "._64:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._66:\n" + " .align 2, 0\n" + "._65:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076E18() +{ + asm( + " push {lr}\n" + " bl debug_sub_8076B4C\n" + " ldr r0, ._67\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._68:\n" + " .align 2, 0\n" + "._67:\n" + " .word DebugMenu_8076D6C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076E30() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " lsl r0, r3, #0x2\n" + " add r0, r0, r3\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._73\n" + " add r4, r0, r1\n" + " mov r0, #0x0\n" + " ldsh r1, [r4, r0]\n" + " cmp r1, #0x1\n" + " beq ._69 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt ._70 @cond_branch\n" + " cmp r1, #0\n" + " beq ._71 @cond_branch\n" + " b ._86\n" + "._74:\n" + " .align 2, 0\n" + "._73:\n" + " .word gTasks+0x8\n" + "._70:\n" + " cmp r1, #0x2\n" + " beq ._75 @cond_branch\n" + " b ._86\n" + "._71:\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._78\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " b ._77\n" + "._79:\n" + " .align 2, 0\n" + "._78:\n" + " .word gUnknown_Debug_0839BBC1+0x199\n" + "._69:\n" + " ldr r0, ._82\n" + " ldrh r2, [r0, #0x2e]\n" + " and r1, r1, r2\n" + " cmp r1, #0\n" + " beq ._80 @cond_branch\n" + " bl MenuDisplayMessageBox\n" + " bl sub_813B79C\n" + " ldr r0, ._82 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + "._77:\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._86\n" + "._83:\n" + " .align 2, 0\n" + "._82:\n" + " .word gMain\n" + " .word gUnknown_Debug_0839BBC1+0x1bc\n" + "._80:\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._86 @cond_branch\n" + " add r0, r3, #0\n" + " bl DestroyTask\n" + " bl DoSoftReset\n" + " b ._86\n" + "._75:\n" + " ldr r0, ._87\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._86 @cond_branch\n" + " add r0, r3, #0\n" + " bl DestroyTask\n" + " bl DoSoftReset\n" + "._86:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._88:\n" + " .align 2, 0\n" + "._87:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076EDC() +{ + asm( + " push {lr}\n" + " bl debug_sub_8076B4C\n" + " ldr r0, ._89\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._90:\n" + " .align 2, 0\n" + "._89:\n" + " .word DebugMenu_8076E30+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076EF4() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xb\n" + " mov r3, #0x11\n" + " bl MenuDrawTextWindow\n" + " ldr r4, ._93\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " add r3, r4, #0\n" + " bl PrintMenuItems\n" + " mov r5, #0x0\n" + " add r4, r4, #0x4\n" + "._92:\n" + " lsl r0, r5, #0x3\n" + " add r0, r0, r4\n" + " ldr r1, [r0]\n" + " mov r0, #0x1\n" + " and r1, r1, r0\n" + " mov r0, #0xb6\n" + " cmp r1, #0\n" + " bne ._91 @cond_branch\n" + " mov r0, #0xb5\n" + "._91:\n" + " lsl r2, r5, #0x1\n" + " add r2, r2, #0x1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r1, #0xa\n" + " bl sub_8071F60\n" + " add r0, r5, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " cmp r5, #0x7\n" + " bls ._92 @cond_branch\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x9\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " add sp, sp, #0x8\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._94:\n" + " .align 2, 0\n" + "._93:\n" + " .word gUnknown_Debug_0839BBC1+0x203\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076F60() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " bl ProcessMenuInput\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " lsl r4, r4, #0x18\n" + " asr r4, r4, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._97 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r4, r0\n" + " bne ._96 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " bl debug_sub_8076B68\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " b ._97\n" + "._96:\n" + " ldr r3, ._100\n" + " lsl r2, r2, #0x18\n" + " asr r2, r2, #0x15\n" + " add r0, r3, #4\n" + " add r0, r2, r0\n" + " ldrb r4, [r0]\n" + " ldr r0, ._100 + 4\n" + " mov r1, #0x1\n" + " and r1, r1, r4\n" + " strb r1, [r0, #0x8]\n" + " add r2, r2, r3\n" + " ldr r1, [r2]\n" + " bl StringCopy\n" + " mov r0, #0x80\n" + " and r4, r4, r0\n" + " cmp r4, #0\n" + " bne ._98 @cond_branch\n" + " mov r0, #0x0\n" + " bl debug_sub_8057508\n" + " b ._99\n" + "._101:\n" + " .align 2, 0\n" + "._100:\n" + " .word gUnknown_Debug_0839BBC1+0x203\n" + " .word gSaveBlock2\n" + "._98:\n" + " mov r0, #0x1\n" + " bl debug_sub_8057508\n" + "._99:\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " ldr r0, ._102\n" + " bl SetMainCallback2\n" + "._97:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._103:\n" + " .align 2, 0\n" + "._102:\n" + " .word debug_sub_8058C00+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8076FEC() +{ + asm( + " push {lr}\n" + " bl DebugMenu_8076EF4\n" + " ldr r0, ._104\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._105:\n" + " .align 2, 0\n" + "._104:\n" + " .word DebugMenu_8076F60+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077004() +{ + asm( + " ldr r2, ._106\n" + " ldr r0, ._106 + 4\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._106 + 8\n" + " add r0, r0, r1\n" + " str r0, [r2]\n" + " bx lr\n" + "._107:\n" + " .align 2, 0\n" + "._106:\n" + " .word 0x30006c4 @ gTileset1AnimLength\n" + " .word 0x030006c0+0x1 @ gNumTilesetAnimDmas+0x1\n" + " .word gDebug0x839B9BC+0x1a8\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077020() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._109\n" + " ldr r0, [r0]\n" + " bl gScriptFuncs_End+0x3cf4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._108 @cond_branch\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + "._108:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._110:\n" + " .align 2, 0\n" + "._109:\n" + " .word gCallback_03004AE8\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077048() +{ + asm( + " push {lr}\n" + " ldr r0, ._111\n" + " ldr r1, ._111 + 4\n" + " str r1, [r0]\n" + " bl ScriptContext2_Enable\n" + " ldr r0, ._111 + 8\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + "._112:\n" + " .align 2, 0\n" + "._111:\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_807706C+1\n" + " .word DebugMenu_8077020+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807706C() +{ + asm( + " push {lr}\n" + " ldr r0, ._113\n" + " bl InitMenuWindow\n" + " bl DebugMenu_8077004\n" + " bl DebugMenu_807719C\n" + " bl DebugMenu_80771EC\n" + " bl DebugMenu_8077238\n" + " ldr r1, ._113 + 4\n" + " ldr r0, ._113 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._114:\n" + " .align 2, 0\n" + "._113:\n" + " .word gWindowConfig_81E6CE4\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_807709C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807709C() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._120\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._115 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl MoveMenuCursor\n" + " ldr r1, ._120 + 4\n" + " strb r0, [r1]\n" + "._115:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._116 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl MoveMenuCursor\n" + " ldr r1, ._120 + 4\n" + " strb r0, [r1]\n" + "._116:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._117 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._120 + 8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " bne ._118 @cond_branch\n" + " mov r0, #0x7\n" + " b ._119\n" + "._121:\n" + " .align 2, 0\n" + "._120:\n" + " .word gMain\n" + " .word 0x030006c0 @ gNumTilesetAnimDmas\n" + " .word 0x030006c0+0x1 @ gNumTilesetAnimDmas+0x1\n" + "._118:\n" + " sub r0, r0, #0x1\n" + "._119:\n" + " strb r0, [r1]\n" + " bl DebugMenu_8077004\n" + " bl DebugMenu_807719C\n" + "._117:\n" + " ldr r0, ._125\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._122 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._125 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x7\n" + " bne ._123 @cond_branch\n" + " mov r0, #0x0\n" + " b ._124\n" + "._126:\n" + " .align 2, 0\n" + "._125:\n" + " .word gMain\n" + " .word 0x030006c0+0x1 @ gNumTilesetAnimDmas+0x1\n" + "._123:\n" + " add r0, r0, #0x1\n" + "._124:\n" + " strb r0, [r1]\n" + " bl DebugMenu_8077004\n" + " bl DebugMenu_807719C\n" + "._122:\n" + " ldr r0, ._129\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._127 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r1, ._129 + 4\n" + " ldr r0, ._129 + 8\n" + " ldrb r2, [r0]\n" + " ldr r0, ._129 + 12\n" + " ldr r0, [r0]\n" + " add r0, r0, r2\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " add r1, r1, #0x4\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " bl gScriptFuncs_End+0x3cf4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " b ._132\n" + "._130:\n" + " .align 2, 0\n" + "._129:\n" + " .word gMain\n" + " .word gDebug0x839B9BC\n" + " .word 0x030006c0 @ gNumTilesetAnimDmas\n" + " .word 0x30006c4 @ gTileset1AnimLength\n" + "._127:\n" + " mov r0, #0xa\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._131 @cond_branch\n" + " mov r0, #0x0\n" + " b ._132\n" + "._131:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._132:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807719C() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xe\n" + " mov r3, #0x11\n" + " bl MenuDrawTextWindow\n" + " ldr r3, ._133\n" + " ldr r0, ._133 + 4\n" + " ldr r0, [r0]\n" + " str r0, [sp]\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " mov r2, #0x8\n" + " bl PrintMenuItemsReordered\n" + " ldr r4, ._133 + 8\n" + " ldrb r0, [r4]\n" + " str r0, [sp]\n" + " mov r0, #0xd\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " strb r0, [r4]\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._134:\n" + " .align 2, 0\n" + "._133:\n" + " .word gDebug0x839B9BC\n" + " .word 0x30006c4 @ gTileset1AnimLength\n" + " .word 0x030006c0 @ gNumTilesetAnimDmas\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80771EC() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._135\n" + " ldr r1, ._135 + 4\n" + " bl StringCopy\n" + " ldr r4, ._135 + 8\n" + " mov r1, #0x4\n" + " ldsb r1, [r4, r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r1, #0x5\n" + " ldsb r1, [r4, r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, #0x13\n" + " mov r1, #0xc\n" + " mov r2, #0x1d\n" + " mov r3, #0xf\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._135\n" + " mov r1, #0x14\n" + " mov r2, #0xd\n" + " bl MenuPrint\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._136:\n" + " .align 2, 0\n" + "._135:\n" + " .word gStringVar4\n" + " .word gUnknown_Debug_0839BBC1+0x243\n" + " .word gSaveBlock1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077238() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xffffffe8\n" + " ldr r1, ._139\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, sp, #0x4\n" + " mov r9, r0\n" + " ldr r1, ._139 + 4\n" + " mov r2, #0x3\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r1, sp, #0x8\n" + " mov sl, r1\n" + " ldr r1, ._139 + 8\n" + " mov r0, sl\n" + " mov r2, #0x3\n" + " bl gScriptFuncs_End+0x5bc4\n" + " mov r2, #0x0\n" + " str r2, [sp, #0x14]\n" + " add r4, sp, #0x10\n" + " mov r6, sp\n" + " add r6, r6, #0x12\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl PlayerGetDestCoords\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " mov r2, #0x0\n" + " ldsh r1, [r6, r2]\n" + " bl MapGridGetZCoordAt\n" + " mov r8, r0\n" + " mov r0, r8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0x7\n" + " strh r0, [r4]\n" + " ldrh r0, [r6]\n" + " sub r0, r0, #0x7\n" + " strh r0, [r6]\n" + " ldr r7, ._139 + 12\n" + " add r0, r7, #0\n" + " mov r1, sp\n" + " bl StringCopy\n" + " add r5, sp, #0xc\n" + " mov r2, #0x0\n" + " ldsh r1, [r4, r2]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " bl StringAppend\n" + " add r0, r7, #0\n" + " mov r1, r9\n" + " bl StringAppend\n" + " mov r0, #0x0\n" + " ldsh r1, [r6, r0]\n" + " add r0, r5, #0\n" + " mov r2, #0x0\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " bl StringAppend\n" + " add r0, r7, #0\n" + " mov r1, sl\n" + " bl StringAppend\n" + " add r0, r5, #0\n" + " mov r1, r8\n" + " mov r2, #0x0\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " bl StringAppend\n" + " ldrb r0, [r7]\n" + " cmp r0, #0xff\n" + " beq ._137 @cond_branch\n" + " add r1, r7, #0\n" + "._138:\n" + " ldr r0, [sp, #0x14]\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " str r0, [sp, #0x14]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0xff\n" + " bne ._138 @cond_branch\n" + "._137:\n" + " mov r0, #0x1c\n" + " ldr r1, [sp, #0x14]\n" + " sub r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x10\n" + " mov r2, #0x1d\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._139 + 12\n" + " mov r1, #0x1d\n" + " ldr r2, [sp, #0x14]\n" + " sub r1, r1, r2\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " add sp, sp, #0x18\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._140:\n" + " .align 2, 0\n" + "._139:\n" + " .word gUnknown_Debug_0839BBC1+0x246\n" + " .word gUnknown_Debug_0839BBC1+0x248\n" + " .word gUnknown_Debug_0839BBC1+0x24b\n" + " .word gStringVar4\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_Exit() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenSogabe() +{ + asm( + " push {lr}\n" + " bl unref_sub_814A414\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenTamada() +{ + asm( + " push {lr}\n" + " bl debug_sub_8075C30\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenKagaya() +{ + asm( + " push {lr}\n" + " bl InitKagayaDebugMenu_A\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenMatsuda() +{ + asm( + " push {lr}\n" + " bl unref_sub_80A9B28\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenNohara() +{ + asm( + " push {lr}\n" + " bl InitNoharaDebugMenu\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenWatanabe() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._141\n" + " bl SetMainCallback2\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._142:\n" + " .align 2, 0\n" + "._141:\n" + " .word InitWatanabeDebugMenu+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_EndSequenceDemo() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._143\n" + " bl SetMainCallback2\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._144:\n" + " .align 2, 0\n" + "._143:\n" + " .word sub_81439D0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_HallOfFame() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl GameClear\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenSizeComparison() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitSizeComparison\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_HoennNationalDex() +{ + asm( + " push {lr}\n" + " bl IsNationalPokedexEnabled\n" + " cmp r0, #0\n" + " beq ._145 @cond_branch\n" + " bl DisableNationalPokedex\n" + " b ._146\n" + "._145:\n" + " bl EnableNationalPokedex\n" + "._146:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077434() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x4\n" + " bhi ._165 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._149\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._150:\n" + " .align 2, 0\n" + "._149:\n" + " .word ._148\n" + "._148:\n" + " .word ._151\n" + " .word ._152\n" + " .word ._153\n" + " .word ._154\n" + " .word ._155\n" + "._151:\n" + " ldr r0, ._157\n" + " mov r1, #0x1\n" + " mov r2, #0x4\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r1, #0xff\n" + " mov r2, #0xff\n" + " mov r3, #0x0\n" + " bl debug_sub_80C2D24\n" + " b ._165\n" + "._158:\n" + " .align 2, 0\n" + "._157:\n" + " .word gUnknown_Debug_0839BBC1+0x24e\n" + "._152:\n" + " ldr r0, ._160\n" + " mov r1, #0x2\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r1, #0xff\n" + " mov r2, #0x0\n" + " b ._159\n" + "._161:\n" + " .align 2, 0\n" + "._160:\n" + " .word gUnknown_Debug_0839BBC1+0x251\n" + "._153:\n" + " ldr r0, ._163\n" + " mov r1, #0x3\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r1, #0x0\n" + " b ._162\n" + "._164:\n" + " .align 2, 0\n" + "._163:\n" + " .word gUnknown_Debug_0839BBC1+0x255\n" + "._154:\n" + " ldr r0, ._166\n" + " mov r1, #0x4\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0xff\n" + "._162:\n" + " mov r2, #0xff\n" + "._159:\n" + " mov r3, #0xff\n" + " bl debug_sub_80C2D24\n" + " b ._165\n" + "._167:\n" + " .align 2, 0\n" + "._166:\n" + " .word gUnknown_Debug_0839BBC1+0x259\n" + "._155:\n" + " ldr r0, ._168\n" + " mov r1, #0x4\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r0, #0xff\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r1, #0xff\n" + " mov r2, #0xff\n" + " mov r3, #0xff\n" + " bl debug_sub_80C2D24\n" + "._165:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._169:\n" + " .align 2, 0\n" + "._168:\n" + " .word gUnknown_Debug_0839BBC1+0x25d\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807750C() +{ + asm( + " push {lr}\n" + " ldr r0, ._170\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._171:\n" + " .align 2, 0\n" + "._170:\n" + " .word gUnknown_Debug_0839BBC1+0x263\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_SetRamBerry() +{ + asm( + " push {lr}\n" + " ldr r0, ._172\n" + " mov r1, #0xc\n" + " mov r2, #0x5\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._172 + 4\n" + " ldr r0, ._172 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._173:\n" + " .align 2, 0\n" + "._172:\n" + " .word gUnknown_Debug_0839BBC1+0x263\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_807750C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_ToggleBGM() +{ + asm( + " push {lr}\n" + " ldr r2, ._175\n" + " mov r1, #0x0\n" + " ldrb r0, [r2]\n" + " cmp r0, #0\n" + " bne ._174 @cond_branch\n" + " mov r1, #0x1\n" + "._174:\n" + " strb r1, [r2]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._176:\n" + " .align 2, 0\n" + "._175:\n" + " .word gDisableMusic\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_BattleForDebug() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitBattleForDebug\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_NationalDex() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._178\n" + "._177:\n" + " add r4, r4, #0x1\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " bl GetNationalPokedexFlag\n" + " add r0, r4, #0\n" + " mov r1, #0x3\n" + " bl GetNationalPokedexFlag\n" + " cmp r4, r5\n" + " bls ._177 @cond_branch\n" + " ldr r1, ._178 + 4\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "._179:\n" + " .align 2, 0\n" + "._178:\n" + " .word 0x181\n" + " .word gUnknown_03005CE8\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_HoennDex() +{ + asm( + " push {r4, r5, lr}\n" + " mov r5, #0x0\n" + "._180:\n" + " add r5, r5, #0x1\n" + " lsl r5, r5, #0x10\n" + " lsr r5, r5, #0x10\n" + " add r0, r5, #0\n" + " bl HoennToNationalOrder\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " bl GetNationalPokedexFlag\n" + " add r0, r4, #0\n" + " mov r1, #0x3\n" + " bl GetNationalPokedexFlag\n" + " cmp r5, #0xc9\n" + " bls ._180 @cond_branch\n" + " ldr r1, ._181\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "._182:\n" + " .align 2, 0\n" + "._181:\n" + " .word gUnknown_03005CE8\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_CreatePKMN() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitCreatePokemon\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_ViewPokemonGraphics() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitSeePokemonGraphics\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenSeeTrainers() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl InitSeeTrainers\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenMori() +{ + asm( + " push {lr}\n" + " bl InitMoriDebugMenu\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenTomomichi() +{ + asm( + " push {lr}\n" + " bl InitTomomichiDebugWindow\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenAoki() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenTaya() +{ + asm( + " push {lr}\n" + " bl InitTayaDebugWindow\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenNakamura() +{ + asm( + " push {lr}\n" + " bl InitNakamuraDebugMenu\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenIwasawa() +{ + asm( + " push {lr}\n" + " bl debug_sub_8138CC4\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_Teleport() +{ + asm( + " push {lr}\n" + " bl sub_8053570\n" + " bl sub_8080E88\n" + " bl ScriptContext2_Enable\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_EditPKMN() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " bl debug_sub_815FFDC\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80776B4() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffff8\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r1, ._183\n" + " mov r0, sp\n" + " mov r2, #0x7\n" + " bl gScriptFuncs_End+0x5bc4\n" + " lsl r3, r4, #0x1\n" + " lsl r5, r4, #0x19\n" + " lsr r5, r5, #0x18\n" + " add r3, r3, #0x1\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x19\n" + " add r1, r5, #0\n" + " mov r2, #0x1d\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r0, ._183 + 4\n" + " ldrb r0, [r0]\n" + " ASR r0, r4\n" + " mov r1, #0x1\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, sp\n" + " mov r1, #0x19\n" + " add r2, r5, #0\n" + " bl MenuPrint\n" + " add sp, sp, #0x8\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._184:\n" + " .align 2, 0\n" + "._183:\n" + " .word gUnknown_Debug_0839BBC1+0x28b\n" + " .word 0x30006c8 @ gTileset2AnimLength\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077704() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xffffffec\n" + " ldr r1, ._185\n" + " mov r0, sp\n" + " mov r2, #0x11\n" + " bl gScriptFuncs_End+0x5bc4\n" + " mov r0, #0x13\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x8\n" + " bl MenuFillWindowRectWithBlankTile\n" + " mov r0, sp\n" + " mov r1, #0x15\n" + " mov r2, #0x0\n" + " bl MenuPrint\n" + " ldr r2, ._185 + 4\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x13\n" + " ldrh r0, [r0]\n" + " lsr r0, r0, #0x8\n" + " mov r1, #0xf\n" + " and r0, r0, r1\n" + " strb r0, [r2]\n" + " mov r0, #0x0\n" + " bl DebugMenu_80776B4\n" + " mov r0, #0x1\n" + " bl DebugMenu_80776B4\n" + " mov r0, #0x2\n" + " bl DebugMenu_80776B4\n" + " mov r0, #0x3\n" + " bl DebugMenu_80776B4\n" + " add sp, sp, #0x14\n" + " pop {r0}\n" + " bx r0\n" + "._186:\n" + " .align 2, 0\n" + "._185:\n" + " .word gUnknown_Debug_0839BBC1+0x292\n" + " .word 0x30006c8 @ gTileset2AnimLength\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077760() +{ + asm( + " push {r4, r5, lr}\n" + " ldr r2, ._190\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " add r5, r2, #0\n" + " cmp r0, #0\n" + " beq ._187 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " bl MoveMenuCursor\n" + " ldr r1, ._190 + 4\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._188 @cond_branch\n" + " sub r0, r0, #0x1\n" + " b ._189\n" + "._191:\n" + " .align 2, 0\n" + "._190:\n" + " .word gMain\n" + " .word 0x030006b0+0x8 @ gMenu+0x8\n" + "._188:\n" + " mov r0, #0x3\n" + "._189:\n" + " strb r0, [r1]\n" + "._187:\n" + " ldrh r1, [r5, #0x2e]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._192 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + " bl MoveMenuCursor\n" + " ldr r1, ._195\n" + " ldrb r0, [r1]\n" + " cmp r0, #0x3\n" + " beq ._193 @cond_branch\n" + " add r0, r0, #0x1\n" + " b ._194\n" + "._196:\n" + " .align 2, 0\n" + "._195:\n" + " .word 0x030006b0+0x8 @ gMenu+0x8\n" + "._193:\n" + " mov r0, #0x0\n" + "._194:\n" + " strb r0, [r1]\n" + "._192:\n" + " ldrh r1, [r5, #0x2e]\n" + " mov r0, #0x30\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._197 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r4, ._201\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x1\n" + " LSL r1, r0\n" + " ldrb r0, [r4]\n" + " eor r1, r1, r0\n" + " strb r1, [r4]\n" + " bl GetMenuCursorPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DebugMenu_80776B4\n" + "._197:\n" + " ldrh r2, [r5, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._198 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq ._199 @cond_branch\n" + "._198:\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x13\n" + " ldrh r0, [r2]\n" + " ldr r1, ._201 + 4\n" + " and r1, r1, r0\n" + " ldr r0, ._201\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x8\n" + " add r1, r1, r0\n" + " strh r1, [r2]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._200\n" + "._202:\n" + " .align 2, 0\n" + "._201:\n" + " .word 0x30006c8 @ gTileset2AnimLength\n" + " .word 0xf0ff\n" + "._199:\n" + " mov r0, #0x0\n" + "._200:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_SwitchBG() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffff8\n" + " bl MenuZeroFillScreen\n" + " bl DebugMenu_8077704\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " mov r0, #0x6\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x14\n" + " mov r2, #0x0\n" + " mov r3, #0x4\n" + " bl InitMenu\n" + " ldr r1, ._203\n" + " ldr r0, ._203 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " add sp, sp, #0x8\n" + " pop {r1}\n" + " bx r1\n" + "._204:\n" + " .align 2, 0\n" + "._203:\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8077760+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807786C() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " ldr r1, ._205\n" + " mov r0, sp\n" + " mov r2, #0x7\n" + " bl gScriptFuncs_End+0x5bc4\n" + " mov r0, #0x19\n" + " mov r1, #0x0\n" + " mov r2, #0x1d\n" + " mov r3, #0x3\n" + " bl MenuDrawTextWindow\n" + " lsl r0, r4, #0x1\n" + " add r0, r0, r4\n" + " add r0, r0, sp\n" + " mov r1, #0x1a\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._206:\n" + " .align 2, 0\n" + "._205:\n" + " .word gUnknown_Debug_0839BBC1+0x2a3\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80778A8() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._211\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x30\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._207 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r2, ._211 + 4\n" + " ldrb r0, [r2]\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " strb r0, [r2]\n" + " ldrb r0, [r2]\n" + " bl DebugMenu_807786C\n" + "._207:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._208 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._209 @cond_branch\n" + "._208:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._210\n" + "._212:\n" + " .align 2, 0\n" + "._211:\n" + " .word gMain\n" + " .word sWildEncountersDisabled\n" + "._209:\n" + " mov r0, #0x0\n" + "._210:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_ControlEncounter() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._213\n" + " ldrb r0, [r0]\n" + " bl DebugMenu_807786C\n" + " ldr r1, ._213 + 4\n" + " ldr r0, ._213 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._214:\n" + " .align 2, 0\n" + "._213:\n" + " .word sWildEncountersDisabled\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_80778A8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_UseHM() +{ + asm( + " ldr r1, ._215\n" + " ldr r0, ._215 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " bx lr\n" + "._216:\n" + " .align 2, 0\n" + "._215:\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8077C14+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077934() +{ + asm( + " push {lr}\n" + " mov r1, #0x0\n" + " ldr r3, ._218\n" + " mov r2, #0x1\n" + "._217:\n" + " add r0, r1, r3\n" + " strb r2, [r0]\n" + " add r1, r1, #0x1\n" + " cmp r1, #0x63\n" + " bls ._217 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._219:\n" + " .align 2, 0\n" + "._218:\n" + " .word gSaveBlock1+0x97a\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077954() +{ + asm( + " push {lr}\n" + " mov r1, #0x0\n" + " ldr r3, ._222\n" + " mov r2, #0x0\n" + "._221:\n" + " add r0, r1, r3\n" + " strb r2, [r0]\n" + " add r1, r1, #0x1\n" + " cmp r1, #0x63\n" + " bls ._221 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._223:\n" + " .align 2, 0\n" + "._222:\n" + " .word gSaveBlock1+0x97a\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077974() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " ldr r1, ._226\n" + " mov r0, #0x4\n" + " ldsb r0, [r1, r0]\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " ldrb r1, [r1, #0x5]\n" + " lsl r1, r1, #0x18\n" + " asr r1, r1, #0x18\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " bl unref_sub_8082C2C\n" + " cmp r0, #0\n" + " beq ._224 @cond_branch\n" + " ldr r0, ._226 + 4\n" + " ldr r1, ._226 + 8\n" + " bl StringCopy\n" + " b ._225\n" + "._227:\n" + " .align 2, 0\n" + "._226:\n" + " .word gSaveBlock1\n" + " .word gStringVar1\n" + " .word gUnknown_Debug_0839BBC1+0x2cc\n" + "._224:\n" + " ldr r0, ._230\n" + " ldr r1, ._230 + 4\n" + " bl StringCopy\n" + "._225:\n" + " ldr r1, ._230 + 8\n" + " mov r0, #0x4\n" + " ldsb r0, [r1, r0]\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " ldrb r1, [r1, #0x5]\n" + " lsl r1, r1, #0x18\n" + " asr r1, r1, #0x18\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " bl sub_8082C0C\n" + " cmp r0, #0\n" + " beq ._228 @cond_branch\n" + " ldr r0, ._230 + 12\n" + " ldr r1, ._230 + 16\n" + " bl StringCopy\n" + " b ._229\n" + "._231:\n" + " .align 2, 0\n" + "._230:\n" + " .word gStringVar1\n" + " .word gUnknown_Debug_0839BBC1+0x2cf\n" + " .word gSaveBlock1\n" + " .word gStringVar2\n" + " .word gUnknown_Debug_0839BBC1+0x2cc\n" + "._228:\n" + " ldr r0, ._232\n" + " ldr r1, ._232 + 4\n" + " bl StringCopy\n" + "._229:\n" + " ldr r0, ._232 + 8\n" + " bl sub_8071F40\n" + " ldr r1, ._232 + 12\n" + " ldr r0, ._232 + 16\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._233:\n" + " .align 2, 0\n" + "._232:\n" + " .word gStringVar2\n" + " .word gUnknown_Debug_0839BBC1+0x2cf\n" + " .word gUnknown_Debug_0839BBC1+0x2aa\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8077DB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077A20() +{ + asm( + " push {lr}\n" + " ldr r0, ._234\n" + " ldr r1, ._234 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xff\n" + " strh r1, [r0]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._235:\n" + " .align 2, 0\n" + "._234:\n" + " .word gSaveBlock1\n" + " .word 0x978\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077A40() +{ + asm( + " push {lr}\n" + " ldr r0, ._236\n" + " ldr r1, ._236 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " strh r1, [r0]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._237:\n" + " .align 2, 0\n" + "._236:\n" + " .word gSaveBlock1\n" + " .word 0x978\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077A60() +{ + asm( + " push {lr}\n" + " ldr r0, ._238\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._239:\n" + " .align 2, 0\n" + "._238:\n" + " .word gUnknown_Debug_0839BBC1+0x323\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_RematchTrainers() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._240\n" + " mov r1, #0xd\n" + " mov r2, #0x5\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._240 + 4\n" + " ldr r0, ._240 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._241:\n" + " .align 2, 0\n" + "._240:\n" + " .word gUnknown_Debug_0839BBC1+0x323\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8077A60+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077A9C() +{ + asm( + " push {lr}\n" + " ldr r1, ._242\n" + " mov r0, #0x1e\n" + " strb r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._243:\n" + " .align 2, 0\n" + "._242:\n" + " .word gNumSafariBalls\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077AB4() +{ + asm( + " push {lr}\n" + " ldr r1, ._244\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._245:\n" + " .align 2, 0\n" + "._244:\n" + " .word gNumSafariBalls\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077ACC() +{ + asm( + " push {lr}\n" + " ldr r1, ._246\n" + " mov r2, #0xfa\n" + " lsl r2, r2, #0x1\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._247:\n" + " .align 2, 0\n" + "._246:\n" + " .word gSafariZoneStepCounter\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077AE8() +{ + asm( + " push {lr}\n" + " ldr r1, ._248\n" + " mov r0, #0x1\n" + " strh r0, [r1]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._249:\n" + " .align 2, 0\n" + "._248:\n" + " .word gSafariZoneStepCounter\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077B00() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " bl unref_sub_80C853C\n" + " cmp r0, #0\n" + " beq ._250 @cond_branch\n" + " ldr r0, ._252\n" + " bl sub_8071F40\n" + " b ._251\n" + "._253:\n" + " .align 2, 0\n" + "._252:\n" + " .word gUnknown_Debug_0839BBC1+0x353\n" + "._250:\n" + " ldr r0, ._254\n" + " bl sub_8071F40\n" + "._251:\n" + " ldr r1, ._254 + 4\n" + " ldr r0, ._254 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._255:\n" + " .align 2, 0\n" + "._254:\n" + " .word gUnknown_Debug_0839BBC1+0x35e\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8077DB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077B3C() +{ + asm( + " push {lr}\n" + " ldr r0, ._256\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._257:\n" + " .align 2, 0\n" + "._256:\n" + " .word gUnknown_Debug_0839BBC1+0x3ab\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_Safari() +{ + asm( + " push {lr}\n" + " bl GetSafariZoneFlag\n" + " cmp r0, #0\n" + " beq ._258 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._260\n" + " mov r1, #0xe\n" + " mov r2, #0x5\n" + " bl DebugMenu_8077D24\n" + " ldr r0, ._260 + 4\n" + " ldr r1, ._260 + 8\n" + " ldrh r1, [r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._260 + 12\n" + " bl sub_8071F40\n" + " ldr r1, ._260 + 16\n" + " ldr r0, ._260 + 20\n" + " str r0, [r1]\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x0\n" + " b ._259\n" + "._261:\n" + " .align 2, 0\n" + "._260:\n" + " .word gUnknown_Debug_0839BBC1+0x3ab\n" + " .word gStringVar1\n" + " .word gSafariZoneStepCounter\n" + " .word gUnknown_Debug_0839BBC1+0x34b\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8077B3C+1\n" + "._258:\n" + " bl CloseMenu\n" + " mov r0, #0x16\n" + " bl PlaySE\n" + " mov r0, #0x1\n" + "._259:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BB4() +{ + asm( + " push {lr}\n" + " bl debug_sub_80AFEE4\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BC0() +{ + asm( + " push {lr}\n" + " bl debug_sub_8122080\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BCC() +{ + asm( + " push {lr}\n" + " bl debug_sub_8120968\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BD8() +{ + asm( + " push {lr}\n" + " bl debug_sub_8130318\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BE4() +{ + asm( + " push {lr}\n" + " bl debug_sub_80986AC\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077BF4() +{ + asm( + " push {lr}\n" + " bl debug_sub_80D93F4\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077C00() +{ + asm( + " push {lr}\n" + " ldr r0, ._262\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._263:\n" + " .align 2, 0\n" + "._262:\n" + " .word gUnknown_Debug_0839BBC1+0x3d3\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077C14() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._264\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._264 + 4\n" + " ldr r0, ._264 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._265:\n" + " .align 2, 0\n" + "._264:\n" + " .word gUnknown_Debug_0839BBC1+0x3d3\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8077C00+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077C3C() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " mov sl, r0\n" + " add r7, r1, #0\n" + " ldr r0, ._271\n" + " ldr r1, ._271 + 4\n" + " str r1, [r0]\n" + " mov r1, #0x0\n" + " strb r1, [r7]\n" + " add r7, r7, #0x1\n" + " strb r1, [r7]\n" + " add r7, r7, #0x1\n" + " mov r3, #0x0\n" + " mov r8, r0\n" + "._269:\n" + " mov r5, #0x0\n" + " ldr r1, ._271\n" + " ldr r0, [r1]\n" + " ldr r2, [r0, #0x4]\n" + " mov r4, #0x0\n" + " ldr r1, [r0, #0x8]\n" + " add r3, r3, #0x1\n" + " mov r9, r3\n" + " cmp r5, r1\n" + " bge ._266 @cond_branch\n" + " add r3, r0, #0\n" + " add r6, r1, #0\n" + "._267:\n" + " ldr r0, [r3, #0xc]\n" + " add r0, r0, r4\n" + " add r0, r0, sl\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x30\n" + " mul r0, r0, r2\n" + " add r5, r5, r0\n" + " add r4, r4, #0x1\n" + " add r0, r2, #0\n" + " mov r1, #0xa\n" + " str r3, [sp]\n" + " bl gScriptFuncs_End+0x3d30\n" + " add r2, r0, #0\n" + " ldr r3, [sp]\n" + " cmp r4, r6\n" + " blt ._267 @cond_branch\n" + "._266:\n" + " mov r0, r8\n" + " ldr r1, [r0]\n" + " ldr r0, [r1]\n" + " cmp r0, r5\n" + " bcs ._268 @cond_branch\n" + " add r5, r0, #0\n" + "._268:\n" + " ldrb r3, [r1, #0x8]\n" + " add r0, r7, #0\n" + " add r1, r5, #0\n" + " mov r2, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r7, r0, #0\n" + " mov r3, r9\n" + " mov r1, r8\n" + " ldr r0, [r1]\n" + " add r0, r0, #0x10\n" + " str r0, [r1]\n" + " cmp r3, #0x1\n" + " ble ._269 @cond_branch\n" + " mov r1, sl\n" + " ldrb r0, [r1, #0x1d]\n" + " add r0, r0, #0x7a\n" + " strb r0, [r7]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0xf6\n" + " bls ._270 @cond_branch\n" + " mov r0, #0xf6\n" + " strb r0, [r7]\n" + "._270:\n" + " mov r0, #0xff\n" + " strb r0, [r7, #0x1]\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._272:\n" + " .align 2, 0\n" + "._271:\n" + " .word 0x030006b0+0xc @ gMenu+0xc\n" + " .word gUnknown_Debug_0839BBC1+0x427\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8077CF4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " ldr r0, ._273\n" + " ldr r6, ._273 + 4\n" + " add r1, r6, #0\n" + " bl DebugMenu_8077C3C\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl MenuPrint\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._274:\n" + " .align 2, 0\n" + "._273:\n" + " .word BuildDateTime\n" + " .word gStringVar4\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077D24() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffff8\n" + " add r6, r0, #0\n" + " add r4, r1, #0\n" + " add r5, r2, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " bl MenuZeroFillScreen\n" + " lsl r3, r5, #0x1\n" + " add r3, r3, #0x1\n" + " lsl r3, r3, #0x18\n" + " lsr r3, r3, #0x18\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " add r2, r4, #0\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " add r2, r5, #0\n" + " add r3, r6, #0\n" + " bl PrintMenuItems\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " sub r4, r4, #0x1\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " str r4, [sp, #0x4]\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " add r3, r5, #0\n" + " bl InitMenu\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077D78() +{ + asm( + " push {r4, r5, lr}\n" + " add r5, r0, #0\n" + " bl ProcessMenuInput\n" + " lsl r0, r0, #0x18\n" + " asr r4, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r4, r0\n" + " beq ._275 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r4, r0\n" + " beq ._276 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._278\n" + " lsl r1, r4, #0x3\n" + " add r1, r1, r5\n" + " ldr r1, [r1, #0x4]\n" + " str r1, [r0]\n" + "._275:\n" + " mov r0, #0x0\n" + " b ._277\n" + "._279:\n" + " .align 2, 0\n" + "._278:\n" + " .word gCallback_03004AE8\n" + "._276:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._277:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077DB4() +{ + asm( + " push {lr}\n" + " ldr r0, ._282\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._280 @cond_branch\n" + " mov r0, #0x0\n" + " b ._281\n" + "._283:\n" + " .align 2, 0\n" + "._282:\n" + " .word gMain\n" + "._280:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._281:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077DD8() +{ + asm( + " push {r4, r5, lr}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " add r1, r3, #0\n" + " mov r0, #0x80\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._284 @cond_branch\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0x1\n" + " b ._285\n" + "._284:\n" + " mov r0, #0x40\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._286 @cond_branch\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " b ._287\n" + "._286:\n" + " mov r0, #0x20\n" + " and r0, r0, r3\n" + " cmp r0, #0\n" + " beq ._288 @cond_branch\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0xa\n" + "._285:\n" + " strh r0, [r4]\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, r5\n" + " bge ._293 @cond_branch\n" + " strh r2, [r4]\n" + " b ._293\n" + "._288:\n" + " mov r0, #0x10\n" + " and r1, r1, r0\n" + " cmp r1, #0\n" + " bne ._291 @cond_branch\n" + " mov r0, #0x0\n" + " b ._292\n" + "._291:\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0xa\n" + "._287:\n" + " strh r0, [r4]\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, r2\n" + " ble ._293 @cond_branch\n" + " strh r5, [r4]\n" + "._293:\n" + " mov r0, #0x1\n" + "._292:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077E40() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " ldr r0, ._297\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._294 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._295 @cond_branch\n" + "._294:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " b ._302\n" + "._298:\n" + " .align 2, 0\n" + "._297:\n" + " .word gMain\n" + "._295:\n" + " mov r0, #0x30\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._299 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " cmp r4, #0\n" + " beq ._300 @cond_branch\n" + " mov r0, #0x1\n" + " bl DebugMenu_807786C\n" + " mov r0, #0x0\n" + " b ._302\n" + "._300:\n" + " mov r0, #0x0\n" + " bl DebugMenu_807786C\n" + " mov r0, #0x1\n" + " b ._302\n" + "._299:\n" + " add r0, r4, #0\n" + "._302:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_MakeItems() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl DebugMenu_8077EAC\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077EAC() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._303\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl MenuZeroFillScreen\n" + " ldr r1, ._303 + 4\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0x1\n" + " strh r1, [r0, #0xa]\n" + " strh r1, [r0, #0xc]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._304:\n" + " .align 2, 0\n" + "._303:\n" + " .word DebugMenu_8077F40+1\n" + " .word gTasks\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077EE0() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r4, r0, #0\n" + " add r6, r1, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " lsl r6, r6, #0x10\n" + " lsr r6, r6, #0x10\n" + " mov r0, #0x4\n" + " mov r1, #0x11\n" + " mov r2, #0x16\n" + " mov r3, #0x12\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r5, ._305\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r5, #0\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " add r0, r4, #0\n" + " bl ItemId_GetItem\n" + " mov r1, #0x8\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r5, #0\n" + " mov r1, #0x12\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._306:\n" + " .align 2, 0\n" + "._305:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077F40() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r4, r0, #0x2\n" + " add r4, r4, r0\n" + " lsl r4, r4, #0x3\n" + " ldr r0, ._307\n" + " add r4, r4, r0\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._307 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl DebugMenu_8077EE0\n" + " ldr r0, ._307 + 8\n" + " str r0, [r4]\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._308:\n" + " .align 2, 0\n" + "._307:\n" + " .word gTasks\n" + " .word gDebug0x839C008\n" + " .word DebugMenu_8077F7C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077F7C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._311\n" + " add r4, r1, r0\n" + " ldr r3, ._311 + 4\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._309 @cond_branch\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._311 + 8\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl DebugMenu_8077EE0\n" + " ldr r0, ._311 + 12\n" + " str r0, [r4]\n" + " b ._317\n" + "._312:\n" + " .align 2, 0\n" + "._311:\n" + " .word gTasks\n" + " .word gMain\n" + " .word gDebug0x839C008+0xc\n" + " .word DebugMenu_8077FFC+1\n" + "._309:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._313 @cond_branch\n" + " ldr r0, ._315\n" + " str r0, [r4]\n" + " b ._317\n" + "._316:\n" + " .align 2, 0\n" + "._315:\n" + " .word DebugMenu_807806C+1\n" + "._313:\n" + " add r0, r4, #0\n" + " add r0, r0, #0xa\n" + " mov r2, #0xae\n" + " lsl r2, r2, #0x1\n" + " ldrh r3, [r3, #0x30]\n" + " mov r1, #0x1\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._317 @cond_branch\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl DebugMenu_8077EE0\n" + "._317:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8077FFC() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._321\n" + " add r4, r1, r0\n" + " ldr r2, ._321 + 4\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._318 @cond_branch\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl AddBagItem\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._320 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " b ._320\n" + "._322:\n" + " .align 2, 0\n" + "._321:\n" + " .word gTasks\n" + " .word gMain\n" + "._318:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._323 @cond_branch\n" + "._320:\n" + " ldr r0, ._325\n" + " str r0, [r4]\n" + " b ._327\n" + "._326:\n" + " .align 2, 0\n" + "._325:\n" + " .word DebugMenu_8077F40+1\n" + "._323:\n" + " add r0, r4, #0\n" + " add r0, r0, #0xc\n" + " ldrh r3, [r2, #0x30]\n" + " mov r1, #0x1\n" + " mov r2, #0x63\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._327 @cond_branch\n" + " ldrh r0, [r4, #0xa]\n" + " ldrh r1, [r4, #0xc]\n" + " bl DebugMenu_8077EE0\n" + "._327:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807806C() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl MenuZeroFillScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " bl DebugMenu_8077048\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807808C() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffff4\n" + " add r4, r0, #0\n" + " sub r0, r4, #1\n" + " cmp r0, #0xc\n" + " bls ._328 @cond_branch\n" + " mov r4, #0x1\n" + "._328:\n" + " lsl r1, r4, #0x5\n" + " ldr r0, ._331\n" + " add r5, r1, r0\n" + " bl MenuZeroFillScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x13\n" + " mov r3, #0x11\n" + " bl MenuDrawTextWindow\n" + " ldr r0, ._331 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0x2\n" + " bl MenuPrint\n" + " mov r0, sp\n" + " add r1, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xb\n" + " mov r2, #0x2\n" + " bl MenuPrint\n" + " ldrh r1, [r5, #0x8]\n" + " mov r0, sp\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xb\n" + " mov r2, #0x4\n" + " bl MenuPrint\n" + " add r4, r5, #0\n" + " add r4, r4, #0xb\n" + " add r0, r4, #0\n" + " bl StringLength\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi ._329 @cond_branch\n" + " add r0, r4, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x6\n" + " bl MenuPrint\n" + " b ._330\n" + "._332:\n" + " .align 2, 0\n" + "._331:\n" + " .word gSaveBlock1+0x2ddc\n" + " .word gDebug0x839C008+0x16\n" + "._329:\n" + " ldr r0, ._335\n" + " mov r1, #0xb\n" + " mov r2, #0x6\n" + " bl MenuPrint\n" + "._330:\n" + " add r4, r5, #0\n" + " add r4, r4, #0x16\n" + " add r0, r4, #0\n" + " bl StringLength\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi ._333 @cond_branch\n" + " add r0, r4, #0\n" + " mov r1, #0xb\n" + " mov r2, #0x8\n" + " bl MenuPrint\n" + " b ._334\n" + "._336:\n" + " .align 2, 0\n" + "._335:\n" + " .word gDebug0x839C008+0x45\n" + "._333:\n" + " ldr r0, ._337\n" + " mov r1, #0xb\n" + " mov r2, #0x8\n" + " bl MenuPrint\n" + "._334:\n" + " ldrb r1, [r5, #0xa]\n" + " mov r0, sp\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xb\n" + " mov r2, #0xa\n" + " bl MenuPrint\n" + " ldr r1, [r5]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x8\n" + " bl ConvertIntToHexStringN\n" + " mov r0, sp\n" + " mov r1, #0xb\n" + " mov r2, #0xc\n" + " bl MenuPrint\n" + " add sp, sp, #0xc\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._338:\n" + " .align 2, 0\n" + "._337:\n" + " .word gDebug0x839C008+0x45\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807817C() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, ._340\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._339 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + "._339:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._341:\n" + " .align 2, 0\n" + "._340:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80781A8() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._344\n" + " add r5, r1, r0\n" + " ldrh r1, [r5, #0x8]\n" + " mov r2, #0x8\n" + " ldsh r0, [r5, r2]\n" + " cmp r0, #0\n" + " bne ._342 @cond_branch\n" + " add r0, r1, #1\n" + " strh r0, [r5, #0x8]\n" + " b ._343\n" + "._345:\n" + " .align 2, 0\n" + "._344:\n" + " .word gTasks\n" + "._342:\n" + " ldr r2, ._348\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._346 @cond_branch\n" + " mov r1, #0x8\n" + " ldsh r0, [r5, r1]\n" + " bl DebugMenu_807808C\n" + " ldr r0, ._348 + 4\n" + " str r0, [r5]\n" + " b ._350\n" + "._349:\n" + " .align 2, 0\n" + "._348:\n" + " .word gMain\n" + " .word DebugMenu_807817C+1\n" + "._346:\n" + " add r0, r5, #0\n" + " add r0, r0, #0x8\n" + " ldrh r1, [r2, #0x30]\n" + " mov r3, #0xc0\n" + " and r3, r3, r1\n" + " mov r1, #0x1\n" + " mov r2, #0xd\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0\n" + " beq ._350 @cond_branch\n" + "._343:\n" + " mov r0, #0x4\n" + " mov r1, #0x11\n" + " mov r2, #0x16\n" + " mov r3, #0x12\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r4, ._351\n" + " mov r2, #0x8\n" + " ldsh r1, [r5, r2]\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + "._350:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._352:\n" + " .align 2, 0\n" + "._351:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_ViewPortraits() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._353\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._354:\n" + " .align 2, 0\n" + "._353:\n" + " .word DebugMenu_80781A8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078254() +{ + asm( + " push {lr}\n" + " bl DebugMenu_807808C\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_AllBadges() +{ + asm( + " push {lr}\n" + " ldr r0, ._355\n" + " bl FlagSet\n" + " ldr r0, ._355 + 4\n" + " bl FlagSet\n" + " ldr r0, ._355 + 8\n" + " bl FlagSet\n" + " ldr r0, ._355 + 12\n" + " bl FlagSet\n" + " ldr r0, ._355 + 16\n" + " bl FlagSet\n" + " ldr r0, ._355 + 20\n" + " bl FlagSet\n" + " ldr r0, ._355 + 24\n" + " bl FlagSet\n" + " ldr r0, ._355 + 28\n" + " bl FlagSet\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._356:\n" + " .align 2, 0\n" + "._355:\n" + " .word 0x807\n" + " .word 0x808\n" + " .word 0x809\n" + " .word 0x80a\n" + " .word 0x80b\n" + " .word 0x80c\n" + " .word 0x80d\n" + " .word 0x80e\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_TimeRecords() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._357\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._358:\n" + " .align 2, 0\n" + "._357:\n" + " .word debug_sub_806F9E4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_SetTime() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl debug_sub_806F99C\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80782EC() +{ + asm( + " push {lr}\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r0, ._359\n" + " mov r2, #0x0\n" + " mov r3, #0x4\n" + " bl ConvertIntToHexStringN\n" + " ldr r0, ._359 + 4\n" + " bl sub_8071F40\n" + " pop {r0}\n" + " bx r0\n" + "._360:\n" + " .align 2, 0\n" + "._359:\n" + " .word gStringVar1\n" + " .word gDebug0x839C008+0x4b\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078310() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._364\n" + " add r4, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0\n" + " beq ._361 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._362 @cond_branch\n" + " b ._375\n" + "._365:\n" + " .align 2, 0\n" + "._364:\n" + " .word gTasks+0x8\n" + "._361:\n" + " ldr r0, ._367\n" + " bl VarGet\n" + " strh r0, [r4, #0x2]\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_80782EC\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._375\n" + "._368:\n" + " .align 2, 0\n" + "._367:\n" + " .word 0x4024\n" + "._362:\n" + " ldr r3, ._371\n" + " ldrh r1, [r3, #0x2e]\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._369 @cond_branch\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " ldr r0, ._371 + 4\n" + " bl GetVarPointer\n" + " ldrh r1, [r4, #0x2]\n" + " strh r1, [r0]\n" + " b ._370\n" + "._372:\n" + " .align 2, 0\n" + "._371:\n" + " .word gMain\n" + " .word 0x4024\n" + "._369:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._373 @cond_branch\n" + "._370:\n" + " bl MenuZeroFillScreen\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + " b ._375\n" + "._373:\n" + " add r0, r4, #2\n" + " ldr r2, ._376\n" + " ldrh r3, [r3, #0x30]\n" + " mov r1, #0x0\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._375 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_80782EC\n" + "._375:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._377:\n" + " .align 2, 0\n" + "._376:\n" + " .word 0xffff\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_MiragaIslandRND() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._378\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._379:\n" + " .align 2, 0\n" + "._378:\n" + " .word DebugMenu_8078310+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80783C8() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._383\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x30\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._382 @cond_branch\n" + " mov r0, #0x5\n" + " bl PlaySE\n" + " ldr r4, ._383 + 4\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._381 @cond_branch\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " mov r0, #0x0\n" + " bl DebugMenu_807786C\n" + " b ._382\n" + "._384:\n" + " .align 2, 0\n" + "._383:\n" + " .word gMain\n" + " .word 0x804\n" + "._381:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + " mov r0, #0x1\n" + " bl DebugMenu_807786C\n" + "._382:\n" + " ldr r0, ._388\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._385 @cond_branch\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._386 @cond_branch\n" + "._385:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._387\n" + "._389:\n" + " .align 2, 0\n" + "._388:\n" + " .word gMain\n" + "._386:\n" + " mov r0, #0x0\n" + "._387:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_ToggleClearFlag() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._390\n" + " bl FlagGet\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DebugMenu_807786C\n" + " ldr r1, ._390 + 4\n" + " ldr r0, ._390 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._391:\n" + " .align 2, 0\n" + "._390:\n" + " .word 0x804\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_80783C8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078464() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._396\n" + " add r0, r4, #0\n" + " bl FlagGet\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DebugMenu_8077E40\n" + " add r1, r0, #0\n" + " cmp r1, #0\n" + " beq ._392 @cond_branch\n" + " cmp r1, #0\n" + " bgt ._393 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._394 @cond_branch\n" + " b ._401\n" + "._397:\n" + " .align 2, 0\n" + "._396:\n" + " .word 0x82a\n" + "._393:\n" + " cmp r1, #0x1\n" + " beq ._398 @cond_branch\n" + " b ._401\n" + "._392:\n" + " add r0, r4, #0\n" + " bl FlagReset\n" + " b ._401\n" + "._398:\n" + " add r0, r4, #0\n" + " bl FlagSet\n" + " b ._401\n" + "._394:\n" + " mov r0, #0x1\n" + " b ._402\n" + "._401:\n" + " mov r0, #0x0\n" + "._402:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenWeatherEvents() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._404\n" + " bl FlagGet\n" + " mov r1, #0x0\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._403 @cond_branch\n" + " mov r1, #0x1\n" + "._403:\n" + " add r0, r1, #0\n" + " bl DebugMenu_807786C\n" + " ldr r1, ._404 + 4\n" + " ldr r0, ._404 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._405:\n" + " .align 2, 0\n" + "._404:\n" + " .word 0x82a\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8078464+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80784E8() +{ + asm( + " push {lr}\n" + " bl IsMysteryGiftEnabled\n" + " bl DebugMenu_8077E40\n" + " add r1, r0, #0\n" + " cmp r1, #0\n" + " beq ._406 @cond_branch\n" + " cmp r1, #0\n" + " bgt ._407 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._408 @cond_branch\n" + " b ._413\n" + "._407:\n" + " cmp r1, #0x1\n" + " beq ._410 @cond_branch\n" + " b ._413\n" + "._406:\n" + " bl DisableMysteryGift\n" + " b ._413\n" + "._410:\n" + " bl EnableMysteryGift\n" + " b ._413\n" + "._408:\n" + " mov r0, #0x1\n" + " b ._414\n" + "._413:\n" + " mov r0, #0x0\n" + "._414:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenMysteryEvent() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " bl IsMysteryGiftEnabled\n" + " mov r1, #0x0\n" + " cmp r0, #0\n" + " bne ._415 @cond_branch\n" + " mov r1, #0x1\n" + "._415:\n" + " add r0, r1, #0\n" + " bl DebugMenu_807786C\n" + " ldr r1, ._416\n" + " ldr r0, ._416 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._417:\n" + " .align 2, 0\n" + "._416:\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_80784E8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078550() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x10\n" + " lsr r6, r0, #0x10\n" + " lsl r0, r6, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl GetGameStat\n" + " add r7, r0, #0\n" + " ldr r0, ._420\n" + " add r1, r6, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._420 + 4\n" + " ldr r5, ._420 + 8\n" + " lsl r4, r6, #0x3\n" + " add r1, r5, #4\n" + " add r1, r4, r1\n" + " ldr r1, [r1]\n" + " bl StringCopy\n" + " add r4, r4, r5\n" + " ldr r0, [r4]\n" + " cmp r0, #0\n" + " bne ._418 @cond_branch\n" + " ldr r0, ._420 + 12\n" + " ldr r1, ._420 + 16\n" + " bl StringCopy\n" + " b ._423\n" + "._421:\n" + " .align 2, 0\n" + "._420:\n" + " .word gStringVar1\n" + " .word gStringVar2\n" + " .word gDebug0x839C008+0x264\n" + " .word gStringVar3\n" + " .word gDebug0x839C008+0x7d\n" + "._418:\n" + " cmp r6, #0x1\n" + " beq ._422 @cond_branch\n" + " ldr r0, ._424\n" + " add r1, r7, #0\n" + " mov r2, #0x1\n" + " mov r3, #0xa\n" + " bl ConvertIntToDecimalStringN\n" + " b ._423\n" + "._425:\n" + " .align 2, 0\n" + "._424:\n" + " .word gStringVar3\n" + "._422:\n" + " ldr r4, ._426\n" + " lsr r1, r7, #0x10\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " mov r6, #0xf0\n" + " strb r6, [r4, #0x3]\n" + " add r0, r4, #4\n" + " lsr r1, r7, #0x8\n" + " mov r5, #0xff\n" + " and r1, r1, r5\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " strb r6, [r4, #0x6]\n" + " add r4, r4, #0x7\n" + " and r7, r7, r5\n" + " add r0, r4, #0\n" + " add r1, r7, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + "._423:\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._426 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._427:\n" + " .align 2, 0\n" + "._426:\n" + " .word gStringVar3\n" + " .word gDebug0x839C008+0x74\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807860C() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._432\n" + " add r4, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x1\n" + " beq ._428 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._429 @cond_branch\n" + " cmp r0, #0\n" + " beq ._430 @cond_branch\n" + " b ._447\n" + "._433:\n" + " .align 2, 0\n" + "._432:\n" + " .word gTasks+0x8\n" + "._429:\n" + " cmp r0, #0x2\n" + " beq ._434 @cond_branch\n" + " b ._447\n" + "._430:\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_8078550\n" + "._441:\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._447\n" + "._428:\n" + " ldr r3, ._439\n" + " ldrh r1, [r3, #0x2e]\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._437 @cond_branch\n" + " ldrh r0, [r4]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r4]\n" + " mov r0, #0x1\n" + " b ._438\n" + "._440:\n" + " .align 2, 0\n" + "._439:\n" + " .word gMain\n" + "._437:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x10\n" + " lsr r2, r0, #0x10\n" + " cmp r2, #0\n" + " bne ._441 @cond_branch\n" + " ldrh r1, [r3, #0x30]\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._442 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x2]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " cmp r0, #0x32\n" + " bne ._446 @cond_branch\n" + " strh r2, [r4, #0x2]\n" + " b ._446\n" + "._442:\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._447 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r4, #0x2]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " bge ._446 @cond_branch\n" + " mov r0, #0x31\n" + " strh r0, [r4, #0x2]\n" + "._446:\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_8078550\n" + " b ._447\n" + "._434:\n" + " bl MenuZeroFillScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._447:\n" + " mov r0, #0x0\n" + "._438:\n" + " pop {r4, r5}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80786C0() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " bl DebugMenu_807860C\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80786D0() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r0, r4, #0\n" + " bl DebugMenu_807860C\n" + " cmp r0, #0\n" + " beq ._449 @cond_branch\n" + " ldr r1, ._450\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrb r2, [r0, #0xa]\n" + " ldr r1, ._450 + 4\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._449 @cond_branch\n" + " sub r1, r0, #1\n" + " add r0, r2, #0\n" + " bl SetGameStat\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + "._449:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._451:\n" + " .align 2, 0\n" + "._450:\n" + " .word gTasks\n" + " .word gDebug0x839C008+0x264\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078714() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r0, r4, #0\n" + " bl DebugMenu_807860C\n" + " cmp r0, #0\n" + " beq ._453 @cond_branch\n" + " ldr r1, ._454\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrb r2, [r0, #0xa]\n" + " ldr r1, ._454 + 4\n" + " lsl r0, r2, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " beq ._453 @cond_branch\n" + " add r0, r2, #0\n" + " mov r1, #0x0\n" + " bl SetGameStat\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + "._453:\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._455:\n" + " .align 2, 0\n" + "._454:\n" + " .word gTasks\n" + " .word gDebug0x839C008+0x264\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078758() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " bl CloseMenu\n" + " bl ScriptContext2_Enable\n" + " add r0, r4, #0\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " mov r0, #0x1\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078774() +{ + asm( + " push {lr}\n" + " ldr r0, ._456\n" + " bl DebugMenu_8078758\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._457:\n" + " .align 2, 0\n" + "._456:\n" + " .word DebugMenu_80786C0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078788() +{ + asm( + " push {lr}\n" + " ldr r0, ._458\n" + " bl DebugMenu_8078758\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._459:\n" + " .align 2, 0\n" + "._458:\n" + " .word DebugMenu_80786D0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_807879C() +{ + asm( + " push {lr}\n" + " ldr r0, ._460\n" + " bl DebugMenu_8078758\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._461:\n" + " .align 2, 0\n" + "._460:\n" + " .word DebugMenu_8078714+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80787B0() +{ + asm( + " push {lr}\n" + " ldr r0, ._462\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._463:\n" + " .align 2, 0\n" + "._462:\n" + " .word gDebug0x839C008+0x3f4\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenLegendsRecord() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._464\n" + " mov r1, #0xc\n" + " mov r2, #0x3\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._464 + 4\n" + " ldr r0, ._464 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._465:\n" + " .align 2, 0\n" + "._464:\n" + " .word gDebug0x839C008+0x3f4\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_80787B0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80787EC() +{ + asm( + " push {r4, r5, lr}\n" + " add sp, sp, #0xfffffffc\n" + " mov r5, sp\n" + " add r5, r5, #0x2\n" + " mov r0, sp\n" + " add r1, r5, #0\n" + " bl GetXYCoordsOneStepInFrontOfPlayer\n" + " ldr r4, ._466\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " mov r2, #0x0\n" + " ldsh r1, [r5, r2]\n" + " bl MapGridGetMetatileBehaviorAt\n" + " strh r0, [r4]\n" + " ldr r0, ._466 + 4\n" + " ldrh r1, [r4]\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToHexStringN\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " mov r2, #0x0\n" + " ldsh r1, [r5, r2]\n" + " bl MapGridGetMetatileIdAt\n" + " strh r0, [r4]\n" + " ldr r0, ._466 + 8\n" + " ldrh r1, [r4]\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToHexStringN\n" + " mov r0, sp\n" + " mov r1, #0x0\n" + " ldsh r0, [r0, r1]\n" + " mov r2, #0x0\n" + " ldsh r1, [r5, r2]\n" + " bl MapGridGetZCoordAt\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " strh r0, [r4]\n" + " ldr r0, ._466 + 12\n" + " ldrh r1, [r4]\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToHexStringN\n" + " ldr r0, ._466 + 16\n" + " ldr r1, ._466 + 20\n" + " bl StringExpandPlaceholders\n" + " add sp, sp, #0x4\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._467:\n" + " .align 2, 0\n" + "._466:\n" + " .word gScriptResult\n" + " .word gStringVar1\n" + " .word gStringVar2\n" + " .word gStringVar3\n" + " .word gStringVar4\n" + " .word gDebug0x839C008+0x40c\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078880() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._472\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r1, #0x8\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x1\n" + " beq ._468 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._469 @cond_branch\n" + " cmp r0, #0\n" + " beq ._470 @cond_branch\n" + " b ._480\n" + "._473:\n" + " .align 2, 0\n" + "._472:\n" + " .word gTasks\n" + "._469:\n" + " cmp r0, #0x2\n" + " beq ._474 @cond_branch\n" + " b ._480\n" + "._470:\n" + " bl MenuDisplayMessageBox\n" + " b ._476\n" + "._468:\n" + " ldr r0, ._478\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + "._476:\n" + " ldrh r0, [r4, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x8]\n" + " b ._480\n" + "._479:\n" + " .align 2, 0\n" + "._478:\n" + " .word gStringVar4\n" + "._474:\n" + " ldr r0, ._481\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._480 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._480:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._482:\n" + " .align 2, 0\n" + "._481:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_CellInfo() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._483\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl DebugMenu_80787EC\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._484:\n" + " .align 2, 0\n" + "._483:\n" + " .word DebugMenu_8078880+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenBerryInfo() +{ + asm( + " push {r4, lr}\n" + " bl DebugOpenBerryInfo\n" + " add r4, r0, #0\n" + " cmp r4, #0\n" + " bne ._485 @cond_branch\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " b ._486\n" + "._485:\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x13\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " add r0, r4, #0\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl MenuPrint\n" + " ldr r1, ._487\n" + " ldr r0, ._487 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + "._486:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._488:\n" + " .align 2, 0\n" + "._487:\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8077DB4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078950() +{ + asm( + " push {lr}\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._489\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " pop {r0}\n" + " bx r0\n" + "._490:\n" + " .align 2, 0\n" + "._489:\n" + " .word gDebug0x839C008+0x426\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078968() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " bne ._491 @cond_branch\n" + " ldr r0, ._493\n" + " mov r1, #0x32\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " b ._492\n" + "._494:\n" + " .align 2, 0\n" + "._493:\n" + " .word gStringVar1\n" + "._491:\n" + " ldr r0, ._495\n" + " mov r1, #0x64\n" + " mov r2, #0x2\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + "._492:\n" + " ldr r0, ._495\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " pop {r0}\n" + " bx r0\n" + "._496:\n" + " .align 2, 0\n" + "._495:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80789A4() +{ + asm( + " push {r4, lr}\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r4, ._497\n" + " add r0, r4, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x9\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._498:\n" + " .align 2, 0\n" + "._497:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_80789CC() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r4, r0, #0x2\n" + " add r4, r4, r0\n" + " lsl r4, r4, #0x3\n" + " ldr r6, ._499\n" + " add r5, r4, r6\n" + " mov r0, #0x0\n" + " strh r0, [r5]\n" + " ldr r0, ._499 + 4\n" + " ldr r1, ._499 + 8\n" + " add r0, r0, r1\n" + " ldrh r0, [r0]\n" + " strh r0, [r5, #0x2]\n" + " bl DebugMenu_8078950\n" + " ldrh r0, [r5]\n" + " bl DebugMenu_8078968\n" + " sub r6, r6, #0x8\n" + " add r4, r4, r6\n" + " ldr r0, ._499 + 12\n" + " str r0, [r4]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._500:\n" + " .align 2, 0\n" + "._499:\n" + " .word gTasks+0x8\n" + " .word gSaveBlock2\n" + " .word 0x55c\n" + " .word DebugMenu_8078A14+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078A14() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r4, r1, #0x3\n" + " ldr r5, ._504\n" + " add r2, r4, r5\n" + " ldr r0, ._504 + 4\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0xc0\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._501 @cond_branch\n" + " mov r1, #0x0\n" + " mov r3, #0x0\n" + " ldsh r0, [r2, r3]\n" + " cmp r0, #0\n" + " bne ._502 @cond_branch\n" + " mov r1, #0x1\n" + "._502:\n" + " strh r1, [r2]\n" + " ldrh r0, [r2]\n" + " bl DebugMenu_8078968\n" + " b ._510\n" + "._505:\n" + " .align 2, 0\n" + "._504:\n" + " .word gTasks+0x8\n" + " .word gMain\n" + "._501:\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._506 @cond_branch\n" + " ldr r1, ._508\n" + " mov r3, #0x0\n" + " ldsh r0, [r2, r3]\n" + " lsl r0, r0, #0x1\n" + " ldr r3, ._508 + 4\n" + " add r1, r1, r3\n" + " add r0, r0, r1\n" + " ldrh r0, [r0]\n" + " strh r0, [r2, #0x2]\n" + " ldrh r0, [r2, #0x2]\n" + " bl DebugMenu_80789A4\n" + " add r0, r5, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r4, r0\n" + " ldr r1, ._508 + 8\n" + " b ._507\n" + "._509:\n" + " .align 2, 0\n" + "._508:\n" + " .word gSaveBlock2\n" + " .word 0x55c\n" + " .word DebugMenu_8078AA4+1\n" + "._506:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._510 @cond_branch\n" + " add r0, r5, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r4, r0\n" + " ldr r1, ._511\n" + "._507:\n" + " str r1, [r0]\n" + "._510:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._512:\n" + " .align 2, 0\n" + "._511:\n" + " .word DebugMenu_8078B38+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078AA4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r5, r1, #0x3\n" + " ldr r7, ._515\n" + " add r4, r5, r7\n" + " add r0, r4, #2\n" + " mov r2, #0xfa\n" + " lsl r2, r2, #0x3\n" + " ldr r6, ._515 + 4\n" + " ldrh r3, [r6, #0x30]\n" + " mov r1, #0x0\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._513 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_80789A4\n" + " b ._521\n" + "._516:\n" + " .align 2, 0\n" + "._515:\n" + " .word gTasks+0x8\n" + " .word gMain\n" + "._513:\n" + " ldrh r1, [r6, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._517 @cond_branch\n" + " ldr r1, ._519\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " lsl r0, r0, #0x1\n" + " ldr r2, ._519 + 4\n" + " add r1, r1, r2\n" + " add r0, r0, r1\n" + " ldrh r1, [r4, #0x2]\n" + " strh r1, [r0]\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " add r0, r7, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r5, r0\n" + " ldr r1, ._519 + 8\n" + " b ._518\n" + "._520:\n" + " .align 2, 0\n" + "._519:\n" + " .word gSaveBlock2\n" + " .word 0x55c\n" + " .word DebugMenu_8078B38+1\n" + "._517:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._521 @cond_branch\n" + " bl DebugMenu_8078950\n" + " ldrh r0, [r4]\n" + " bl DebugMenu_8078968\n" + " add r0, r7, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r5, r0\n" + " ldr r1, ._522\n" + "._518:\n" + " str r1, [r0]\n" + "._521:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._523:\n" + " .align 2, 0\n" + "._522:\n" + " .word DebugMenu_8078A14+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078B38() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl MenuZeroFillScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_BattleTowerStages() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl ScriptContext2_Enable\n" + " ldr r0, ._524\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._525:\n" + " .align 2, 0\n" + "._524:\n" + " .word DebugMenu_80789CC+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078B70() +{ + asm( + " push {lr}\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r1, r1, #0x10\n" + " ldr r0, ._526\n" + " mov r2, #0x0\n" + " mov r3, #0x1\n" + " bl ConvertIntToHexStringN\n" + " ldr r0, ._526 + 4\n" + " bl sub_8071F40\n" + " pop {r0}\n" + " bx r0\n" + "._527:\n" + " .align 2, 0\n" + "._526:\n" + " .word gStringVar1\n" + " .word gDebug0x839C008+0x430\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078B94() +{ + asm( + " push {r4, r5, lr}\n" + " mov r3, #0x0\n" + " ldr r1, ._531\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq ._529 @cond_branch\n" + " ldr r5, ._531 + 4\n" + " add r4, r1, #0\n" + "._530:\n" + " lsl r0, r3, #0x3\n" + " add r2, r0, r5\n" + " add r0, r0, r4\n" + " ldr r1, [r0, #0x4]\n" + " ldr r0, [r0]\n" + " str r0, [r2]\n" + " str r1, [r2, #0x4]\n" + " add r0, r3, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r3, r0, #0x18\n" + " cmp r3, #0x27\n" + " bhi ._529 @cond_branch\n" + " lsl r0, r3, #0x3\n" + " add r0, r0, r4\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._530 @cond_branch\n" + "._529:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._532:\n" + " .align 2, 0\n" + "._531:\n" + " .word gDebug0x839C008+0x43c\n" + " .word gSaveBlock1+0x7f8\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078BD4() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._536\n" + " add r4, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0\n" + " beq ._533 @cond_branch\n" + " cmp r0, #0x1\n" + " beq ._534 @cond_branch\n" + " b ._545\n" + "._537:\n" + " .align 2, 0\n" + "._536:\n" + " .word gTasks+0x8\n" + "._533:\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_8078B70\n" + " ldrh r0, [r4]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4]\n" + " b ._545\n" + "._534:\n" + " ldr r2, ._541\n" + " ldrh r1, [r2, #0x2e]\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._539 @cond_branch\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " bl MenuZeroFillScreen\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + " bl DebugMenu_8078B94\n" + " b ._545\n" + "._542:\n" + " .align 2, 0\n" + "._541:\n" + " .word gMain\n" + "._539:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._543 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + " bl ScriptContext2_Disable\n" + " b ._545\n" + "._543:\n" + " add r0, r4, #2\n" + " ldrh r3, [r2, #0x30]\n" + " mov r1, #0x0\n" + " mov r2, #0x4\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._545 @cond_branch\n" + " ldrh r0, [r4, #0x2]\n" + " bl DebugMenu_8078B70\n" + "._545:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_CheckPKBLCK() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._546\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._547:\n" + " .align 2, 0\n" + "._546:\n" + " .word DebugMenu_8078BD4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078C80() +{ + asm( + " push {lr}\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._548\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldr r1, ._548 + 4\n" + " ldr r0, ._548 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._549:\n" + " .align 2, 0\n" + "._548:\n" + " .word gDebug0x839C574+0x30\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8078CA8+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078CA8() +{ + asm( + " push {lr}\n" + " ldr r0, ._552\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._550 @cond_branch\n" + " ldr r1, ._552 + 4\n" + " ldr r0, ._552 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " b ._555\n" + "._553:\n" + " .align 2, 0\n" + "._552:\n" + " .word gMain\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8078CE4+1\n" + "._550:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._554 @cond_branch\n" + " mov r0, #0x0\n" + " b ._555\n" + "._554:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._555:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078CE4() +{ + asm( + " push {lr}\n" + " ldr r1, ._558\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0xa\n" + " mov r0, #0x0\n" + " bl DebugMenu_8078E40\n" + " cmp r0, #0x1\n" + " bne ._556 @cond_branch\n" + " ldr r0, ._558 + 4\n" + " ldr r1, ._558 + 8\n" + " bl StringCopy\n" + " b ._557\n" + "._559:\n" + " .align 2, 0\n" + "._558:\n" + " .word +0x2000000\n" + " .word gStringVar4\n" + " .word gDebug0x839C574+0x58\n" + "._556:\n" + " ldr r0, ._560\n" + " ldr r1, ._560 + 4\n" + " bl StringCopy\n" + "._557:\n" + " ldr r1, ._560 + 8\n" + " ldr r0, ._560 + 12\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._561:\n" + " .align 2, 0\n" + "._560:\n" + " .word gStringVar4\n" + " .word gDebug0x839C574+0x6b\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8078D7C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078D30() +{ + asm( + " push {r4, r5, r6, lr}\n" + " ldr r5, ._563\n" + " mov r4, #0x0\n" + " mov r6, #0x80\n" + " lsl r6, r6, #0x5\n" + "._562:\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " add r2, r6, #0\n" + " bl DebugMenu_8078E68\n" + " add r5, r5, r6\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0x1f\n" + " bls ._562 @cond_branch\n" + " ldr r0, ._563 + 4\n" + " ldr r1, ._563 + 8\n" + " bl StringCopy\n" + " ldr r1, ._563 + 12\n" + " ldr r0, ._563 + 16\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._564:\n" + " .align 2, 0\n" + "._563:\n" + " .word +0x2000000\n" + " .word gStringVar4\n" + " .word gDebug0x839C574+0x62\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8078D7C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078D7C() +{ + asm( + " push {lr}\n" + " bl MenuDisplayMessageBox\n" + " ldr r0, ._565\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldr r1, ._565 + 4\n" + " ldr r0, ._565 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._566:\n" + " .align 2, 0\n" + "._565:\n" + " .word gStringVar4\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8078DA4+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078DA4() +{ + asm( + " push {lr}\n" + " ldr r0, ._569\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._567 @cond_branch\n" + " mov r0, #0x0\n" + " b ._568\n" + "._570:\n" + " .align 2, 0\n" + "._569:\n" + " .word gMain\n" + "._567:\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + "._568:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_MeTooBackupMan() +{ + asm( + " push {lr}\n" + " bl MenuZeroFillScreen\n" + " ldr r0, ._571\n" + " mov r1, #0xc\n" + " mov r2, #0x2\n" + " bl DebugMenu_8077D24\n" + " ldr r1, ._571 + 4\n" + " ldr r0, ._571 + 8\n" + " str r0, [r1]\n" + " mov r0, #0x0\n" + " pop {r1}\n" + " bx r1\n" + "._572:\n" + " .align 2, 0\n" + "._571:\n" + " .word gDebug0x839C574+0x20\n" + " .word gCallback_03004AE8\n" + " .word DebugMenu_8078DF0+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078DF0() +{ + asm( + " push {lr}\n" + " ldr r0, ._573\n" + " bl DebugMenu_8077D78\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " pop {r1}\n" + " bx r1\n" + "._574:\n" + " .align 2, 0\n" + "._573:\n" + " .word gDebug0x839C574+0x20\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078E04() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r1, #0\n" + " add r5, r2, #0\n" + " b ._575\n" + "._577:\n" + " ldr r0, ._579\n" + " add r5, r5, r0\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x5\n" + " add r6, r6, r0\n" + " add r0, r4, #1\n" + "._575:\n" + " lsl r0, r0, #0x10\n" + " lsr r4, r0, #0x10\n" + " add r0, r4, #0\n" + " add r1, r6, #0\n" + " bl gScriptFuncs_End+0x2f60\n" + " cmp r0, #0\n" + " bne ._576 @cond_branch\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x5\n" + " cmp r5, r0\n" + " bhi ._577 @cond_branch\n" + " mov r0, #0x1\n" + " b ._578\n" + "._580:\n" + " .align 2, 0\n" + "._579:\n" + " .word 0xfffff000\n" + "._576:\n" + " mov r0, #0x0\n" + "._578:\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078E40() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " add r6, r2, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl gScriptFuncs_End+0x19f4\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " add r2, r6, #0\n" + " bl DebugMenu_8078E04\n" + " add r4, r0, #0\n" + " bl gScriptFuncs_End+0x1a70\n" + " add r0, r4, #0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078E68() +{ + asm( + " push {r4, lr}\n" + " add r4, r1, #0\n" + " add r3, r2, #0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r1, #0x0\n" + " add r2, r4, #0\n" + " bl gScriptFuncs_End+0x2d64\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078E80() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " mov r0, #0x2\n" + " mov r1, #0xf\n" + " mov r2, #0x16\n" + " mov r3, #0x10\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r1, ._581\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldrb r1, [r0, #0x4]\n" + " mov r0, #0xd0\n" + " mov r2, #0xf\n" + " bl sub_8071F60\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._582:\n" + " .align 2, 0\n" + "._581:\n" + " .word gDebug0x839C574+0x80\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078EB0() +{ + asm( + " push {r4, r5, lr}\n" + " add r5, r0, #0\n" + " ldr r4, ._583\n" + " mov r0, #0x2\n" + " ldsh r1, [r5, r0]\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " mov r3, #0x3\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " mov r0, #0xf0\n" + " mov r1, #0x5\n" + " mov r2, #0x11\n" + " bl sub_8071F60\n" + " mov r0, #0x4\n" + " ldsh r1, [r5, r0]\n" + " add r0, r4, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x6\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " mov r0, #0xf0\n" + " mov r1, #0x8\n" + " mov r2, #0x11\n" + " bl sub_8071F60\n" + " mov r0, #0x6\n" + " ldsh r1, [r5, r0]\n" + " add r0, r4, #0\n" + " mov r2, #0x2\n" + " mov r3, #0x2\n" + " bl ConvertIntToDecimalStringN\n" + " add r0, r4, #0\n" + " mov r1, #0x9\n" + " mov r2, #0x11\n" + " bl MenuPrint\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._584:\n" + " .align 2, 0\n" + "._583:\n" + " .word gStringVar1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078F1C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r4, r0, #0x2\n" + " add r4, r4, r0\n" + " lsl r4, r4, #0x3\n" + " ldr r6, ._585\n" + " add r5, r4, r6\n" + " mov r0, #0x0\n" + " strh r0, [r5]\n" + " ldr r1, ._585 + 4\n" + " ldrh r0, [r1, #0xe]\n" + " strh r0, [r5, #0x2]\n" + " ldrb r0, [r1, #0x10]\n" + " strh r0, [r5, #0x4]\n" + " ldrb r0, [r1, #0x11]\n" + " strh r0, [r5, #0x6]\n" + " bl MenuDisplayMessageBox\n" + " add r0, r5, #0\n" + " bl DebugMenu_8078EB0\n" + " add r0, r5, #0\n" + " bl DebugMenu_8078E80\n" + " sub r6, r6, #0x8\n" + " add r4, r4, r6\n" + " ldr r0, ._585 + 8\n" + " str r0, [r4]\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._586:\n" + " .align 2, 0\n" + "._585:\n" + " .word gTasks+0x8\n" + " .word gSaveBlock2\n" + " .word DebugMenu_8078F68+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8078F68() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r5, r1, #0x3\n" + " ldr r6, ._589\n" + " add r4, r5, r6\n" + " ldr r3, ._589 + 4\n" + " ldrh r1, [r3, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._587 @cond_branch\n" + " ldr r1, ._589 + 8\n" + " ldrh r0, [r4, #0x2]\n" + " strh r0, [r1, #0xe]\n" + " ldrh r0, [r4, #0x4]\n" + " strb r0, [r1, #0x10]\n" + " ldrh r0, [r4, #0x6]\n" + " strb r0, [r1, #0x11]\n" + " mov r0, #0x49\n" + " bl PlaySE\n" + " b ._588\n" + "._590:\n" + " .align 2, 0\n" + "._589:\n" + " .word gTasks+0x8\n" + " .word gMain\n" + " .word gSaveBlock2\n" + "._587:\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._591 @cond_branch\n" + "._588:\n" + " add r0, r6, #0\n" + " sub r0, r0, #0x8\n" + " add r0, r5, r0\n" + " ldr r1, ._593\n" + " str r1, [r0]\n" + " b ._601\n" + "._594:\n" + " .align 2, 0\n" + "._593:\n" + " .word DebugMenu_8079020+1\n" + "._591:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._595 @cond_branch\n" + " ldrh r1, [r4]\n" + " mov r2, #0x0\n" + " ldsh r0, [r4, r2]\n" + " cmp r0, #0\n" + " beq ._601 @cond_branch\n" + " sub r0, r1, #1\n" + " b ._597\n" + "._595:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._598 @cond_branch\n" + " ldrh r0, [r4]\n" + " cmp r0, #0x1\n" + " bhi ._601 @cond_branch\n" + " add r0, r0, #0x1\n" + "._597:\n" + " strh r0, [r4]\n" + " add r0, r4, #0\n" + " bl DebugMenu_8078E80\n" + " b ._601\n" + "._598:\n" + " mov r0, #0x0\n" + " ldsh r2, [r4, r0]\n" + " lsl r2, r2, #0x3\n" + " ldr r0, ._602\n" + " add r2, r2, r0\n" + " ldrb r0, [r2, #0x5]\n" + " lsl r0, r0, #0x1\n" + " add r0, r4, r0\n" + " ldrh r1, [r2]\n" + " ldrh r2, [r2, #0x2]\n" + " ldrh r3, [r3, #0x30]\n" + " bl DebugMenu_8077DD8\n" + " cmp r0, #0x1\n" + " bne ._601 @cond_branch\n" + " add r0, r4, #0\n" + " bl DebugMenu_8078EB0\n" + "._601:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._603:\n" + " .align 2, 0\n" + "._602:\n" + " .word gDebug0x839C574+0x80\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8079020() +{ + asm( + " push {r4, lr}\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x18\n" + " lsr r4, r4, #0x18\n" + " bl MenuZeroFillScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_PTime() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._604\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._605:\n" + " .align 2, 0\n" + "._604:\n" + " .word DebugMenu_8078F1C+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8079058() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._610\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r0, #0x8\n" + " ldsh r1, [r4, r0]\n" + " cmp r1, #0x1\n" + " beq ._606 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt ._607 @cond_branch\n" + " cmp r1, #0\n" + " beq ._608 @cond_branch\n" + " b ._620\n" + "._611:\n" + " .align 2, 0\n" + "._610:\n" + " .word gTasks\n" + "._607:\n" + " cmp r1, #0x2\n" + " beq ._612 @cond_branch\n" + " b ._620\n" + "._608:\n" + " ldr r0, ._615\n" + " str r1, [r0]\n" + " bl MenuDisplayMessageBox\n" + " b ._614\n" + "._616:\n" + " .align 2, 0\n" + "._615:\n" + " .word gUnknown_Debug_03004BD0\n" + "._606:\n" + " ldr r0, ._618\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " mov r0, #0x14\n" + " mov r1, #0x8\n" + " mov r2, #0x1\n" + " bl DisplayYesNoMenu\n" + "._614:\n" + " ldrh r0, [r4, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x8]\n" + " b ._620\n" + "._619:\n" + " .align 2, 0\n" + "._618:\n" + " .word gDebug0x839C60C\n" + "._612:\n" + " bl ProcessMenuInputNoWrap_\n" + " lsl r0, r0, #0x18\n" + " asr r1, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r1, r0\n" + " beq ._620 @cond_branch\n" + " cmp r1, #0\n" + " bne ._621 @cond_branch\n" + " ldr r1, ._623\n" + " mov r0, #0x1\n" + " b ._622\n" + "._624:\n" + " .align 2, 0\n" + "._623:\n" + " .word gUnknown_Debug_03004BD0\n" + "._621:\n" + " ldr r1, ._625\n" + " mov r0, #0x0\n" + "._622:\n" + " str r0, [r1]\n" + " bl MenuZeroFillScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._620:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._626:\n" + " .align 2, 0\n" + "._625:\n" + " .word gUnknown_Debug_03004BD0\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenMurakawa() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._627\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._628:\n" + " .align 2, 0\n" + "._627:\n" + " .word DebugMenu_8079058+1\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_8079110() +{ + asm( + " push {r4, r5, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._633\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r1, #0x8\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x1\n" + " beq ._629 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._630 @cond_branch\n" + " cmp r0, #0\n" + " beq ._631 @cond_branch\n" + " b ._642\n" + "._634:\n" + " .align 2, 0\n" + "._633:\n" + " .word gTasks\n" + "._630:\n" + " cmp r0, #0x2\n" + " beq ._635 @cond_branch\n" + " b ._642\n" + "._631:\n" + " bl MenuDisplayMessageBox\n" + " b ._637\n" + "._629:\n" + " ldr r0, ._639\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl MenuPrintMessage\n" + "._637:\n" + " ldrh r0, [r4, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x8]\n" + " b ._642\n" + "._640:\n" + " .align 2, 0\n" + "._639:\n" + " .word gDebug0x839C60C+0xe\n" + "._635:\n" + " bl MenuUpdateWindowText\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._642 @cond_branch\n" + " ldr r0, ._643\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._642 @cond_branch\n" + " bl MenuZeroFillScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._642:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._644:\n" + " .align 2, 0\n" + "._643:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void DebugMenu_OpenKiwa() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " ldr r0, ._645\n" + " mov r1, #0x50\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " pop {r1}\n" + " bx r1\n" + "._646:\n" + " .align 2, 0\n" + "._645:\n" + " .word DebugMenu_8079110+1\n" + "\n" + ); +} + diff --git a/src/debug/unk_debug_menu_3.c b/src/debug/unk_debug_menu_3.c new file mode 100644 index 000000000..70e194907 --- /dev/null +++ b/src/debug/unk_debug_menu_3.c @@ -0,0 +1,797 @@ +__attribute__((naked)) +void debug_sub_813C404() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " ldr r5, ._1\n" + " ldr r4, ._1 + 4\n" + " sub r5, r5, r4\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " bl unref_sub_812620C\n" + " add r0, r5, #0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word gOtherText_DataCannotUseVersion+0x30d\n" + " .word gOtherText_DataCannotUseVersion+0x3c\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C430() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " ldr r5, ._3\n" + " ldr r4, ._3 + 4\n" + " sub r5, r5, r4\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " bl unref_sub_812620C\n" + " add r0, r5, #0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gOtherText_DataCannotUseVersion+0x95d\n" + " .word gOtherText_DataCannotUseVersion+0x93b\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C45C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " ldr r5, ._5\n" + " ldr r4, ._5 + 4\n" + " sub r5, r5, r4\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " bl unref_sub_812620C\n" + " add r0, r5, #0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._6:\n" + " .align 2, 0\n" + "._5:\n" + " .word gOtherText_DataCannotUseVersion+0x99e\n" + " .word gOtherText_DataCannotUseVersion+0x97d\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C488() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " ldr r5, ._7\n" + " ldr r4, ._7 + 4\n" + " sub r5, r5, r4\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " bl unref_sub_812620C\n" + " add r0, r5, #0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._8:\n" + " .align 2, 0\n" + "._7:\n" + " .word gOtherText_DataCannotUseVersion+0x97d\n" + " .word gOtherText_DataCannotUseVersion+0x95d\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C4B4() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._9\n" + " ldr r1, ._9 + 4\n" + " sub r4, r4, r1\n" + " add r2, r4, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r4, #0\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._10:\n" + " .align 2, 0\n" + "._9:\n" + " .word gOtherText_DataCannotUseVersion+0xb74\n" + " .word gOtherText_DataCannotUseVersion+0xb61\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C4D4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " ldr r5, ._11\n" + " ldr r4, ._11 + 4\n" + " sub r5, r5, r4\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " bl unref_sub_81261B4\n" + " add r0, r5, #0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._12:\n" + " .align 2, 0\n" + "._11:\n" + " .word gOtherText_DataCannotUseVersion+0xc6d\n" + " .word gOtherText_DataCannotUseVersion+0xb74\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C500() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " ldr r5, ._13\n" + " ldr r4, ._13 + 4\n" + " sub r5, r5, r4\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r6, #0\n" + " add r1, r4, #0\n" + " bl unref_sub_812620C\n" + " add r0, r5, #0\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word gOtherText_DataCannotUseVersion+0xcf2\n" + " .word gOtherText_DataCannotUseVersion+0xc6d\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C52C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6}\n" + " mov r8, r0\n" + " lsl r5, r1, #0x10\n" + " lsr r0, r5, #0x10\n" + " mov r9, r0\n" + " ldr r6, ._15\n" + " ldr r4, ._15 + 4\n" + " sub r6, r6, r4\n" + " mov r0, r8\n" + " add r1, r4, #0\n" + " add r2, r6, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " ldr r0, ._15 + 8\n" + " sub r0, r0, r4\n" + " add r0, r0, r8\n" + " add r0, r0, #0x3\n" + " mov r1, r9\n" + " strb r1, [r0]\n" + " lsr r5, r5, #0x18\n" + " strb r5, [r0, #0x1]\n" + " mov r0, r8\n" + " add r1, r4, #0\n" + " bl unref_sub_812620C\n" + " add r0, r6, #0\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._16:\n" + " .align 2, 0\n" + "._15:\n" + " .word gOtherText_DataCannotUseVersion+0xd16\n" + " .word gOtherText_DataCannotUseVersion+0xcf2\n" + " .word gOtherText_DataCannotUseVersion+0xd10\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C580() +{ + asm( + " push {lr}\n" + " mov r1, #0xd\n" + " bl debug_sub_813C52C\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C58C() +{ + asm( + " push {lr}\n" + " mov r1, #0x4\n" + " bl debug_sub_813C52C\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C598() +{ + asm( + " push {lr}\n" + " mov r1, #0x85\n" + " bl debug_sub_813C52C\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C5A4() +{ + asm( + " push {lr}\n" + " ldr r1, ._17\n" + " bl debug_sub_813C52C\n" + " pop {r1}\n" + " bx r1\n" + "._18:\n" + " .align 2, 0\n" + "._17:\n" + " .word 0x121\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C5B4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add r4, r0, #0\n" + " ldr r7, ._23\n" + " ldr r0, ._23 + 4\n" + " ldr r1, ._23 + 8\n" + " sub r0, r0, r1\n" + " add r6, r0, r4\n" + " ldr r0, ._23 + 12\n" + " sub r5, r0, r1\n" + " ldr r0, ._23 + 16\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " bl GetEnigmaBerryChecksum\n" + " mov r2, #0x0\n" + " ldr r3, ._23 + 20\n" + " mov r1, #0x0\n" + "._19:\n" + " add r0, r4, r2\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, r3\n" + " ble ._19 @cond_branch\n" + " mov r2, #0x0\n" + " cmp r2, r5\n" + " bcs ._20 @cond_branch\n" + " ldr r3, ._23 + 8\n" + "._21:\n" + " add r0, r4, r2\n" + " add r1, r2, r3\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, r5\n" + " bcc ._21 @cond_branch\n" + "._20:\n" + " mov r2, #0x0\n" + " ldr r3, ._23 + 24\n" + "._22:\n" + " add r0, r6, r2\n" + " add r1, r7, r2\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, r3\n" + " bls ._22 @cond_branch\n" + " bl ClearEnigmaBerries\n" + " ldr r1, ._23 + 8\n" + " add r0, r4, #0\n" + " bl unref_sub_81261B4\n" + " add r0, r5, #0\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._24:\n" + " .align 2, 0\n" + "._23:\n" + " .word gSaveBlock1+0x3160\n" + " .word gOtherText_DataCannotUseVersion+0x331\n" + " .word gOtherText_DataCannotUseVersion+0x30d\n" + " .word gOtherText_DataCannotUseVersion+0x861\n" + " .word gFlashSectors+0x8\n" + " .word 0xfff\n" + " .word 0x52f\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C638() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add sp, sp, #0xffffffec\n" + " mov r8, r0\n" + " add r4, r1, #0\n" + " add r5, r2, #0\n" + " add r6, r3, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " lsl r5, r5, #0x18\n" + " lsr r5, r5, #0x18\n" + " lsl r6, r6, #0x10\n" + " lsr r6, r6, #0x10\n" + " bl ZeroMonData\n" + " mov r0, #0x0\n" + " str r0, [sp]\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x1\n" + " str r0, [sp, #0x8]\n" + " ldr r0, ._25\n" + " str r0, [sp, #0xc]\n" + " mov r0, r8\n" + " add r1, r4, #0\n" + " add r2, r5, #0\n" + " mov r3, #0x20\n" + " bl CreateMon\n" + " ldr r2, ._25 + 4\n" + " mov r0, r8\n" + " mov r1, #0x7\n" + " bl SetMonData\n" + " ldr r2, ._25 + 8\n" + " mov r0, r8\n" + " mov r1, #0x2\n" + " bl SetMonData\n" + " str r6, [sp, #0x10]\n" + " mov r0, r8\n" + " mov r1, #0xc\n" + " add r2, sp, #0x10\n" + " bl SetMonData\n" + " add sp, sp, #0x14\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._26:\n" + " .align 2, 0\n" + "._25:\n" + " .word 0x270f\n" + " .word gFlashSectors+0xc\n" + " .word gFlashSectors+0x14\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C6AC() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add sp, sp, #0xfffffff8\n" + " add r6, r0, #0\n" + " add r5, r1, #0\n" + " add r0, r5, #0\n" + " bl ClearMailStruct\n" + " add r0, r6, #0\n" + " mov r1, #0xc\n" + " bl GetMonData\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " mov r8, r0\n" + " bl ItemIsMail\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._27 @cond_branch\n" + " add r4, r5, #0\n" + " add r4, r4, #0x12\n" + " add r7, r5, #0\n" + " add r7, r7, #0x1a\n" + " mov r1, #0x9\n" + " add r0, r5, #0\n" + " add r0, r0, #0x10\n" + "._28:\n" + " strh r1, [r0]\n" + " sub r1, r1, #0x1\n" + " sub r0, r0, #0x2\n" + " cmp r0, r5\n" + " bge ._28 @cond_branch\n" + " add r0, r6, #0\n" + " mov r1, #0x7\n" + " mov r2, sp\n" + " bl GetMonData\n" + " add r0, r4, #0\n" + " mov r1, sp\n" + " mov r2, #0x8\n" + " bl StringCopyN\n" + " add r0, r6, #0\n" + " mov r1, #0x1\n" + " bl GetMonData\n" + " add r1, r7, #0\n" + " bl write_word_to_mem\n" + " add r0, r6, #0\n" + " mov r1, #0xb\n" + " bl GetMonData\n" + " add r4, r0, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " add r0, r6, #0\n" + " mov r1, #0x0\n" + " bl GetMonData\n" + " add r1, r0, #0\n" + " add r0, r4, #0\n" + " bl SpeciesToMailSpecies\n" + " strh r0, [r5, #0x1e]\n" + " mov r0, r8\n" + " strh r0, [r5, #0x20]\n" + "._27:\n" + " add sp, sp, #0x8\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C740() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, sl\n" + " mov r5, r9\n" + " mov r4, r8\n" + " push {r4, r5, r6}\n" + " add sp, sp, #0xffffffd0\n" + " add r6, r0, #0\n" + " ldr r0, ._29\n" + " mov r8, r0\n" + " ldr r1, ._29 + 4\n" + " ldr r5, ._29 + 8\n" + " sub r1, r1, r0\n" + " mov r9, r1\n" + " add r0, r6, #0\n" + " mov r1, r8\n" + " mov r2, r9\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r5, #0\n" + " mov r1, #0x19\n" + " mov r2, #0x5\n" + " mov r3, #0x0\n" + " bl debug_sub_813C638\n" + " add r4, sp, #0x24\n" + " mov r0, #0x1\n" + " mov sl, r0\n" + " mov r1, sl\n" + " strb r1, [r4]\n" + " add r0, r5, #0\n" + " mov r1, #0x2d\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " mov r0, #0x3\n" + " strb r0, [r4]\n" + " add r0, r5, #0\n" + " mov r1, #0x20\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " mov r0, #0xff\n" + " strb r0, [r4]\n" + " add r0, r5, #0\n" + " mov r1, #0x23\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " ldr r1, ._29 + 12\n" + " add r0, r4, #0\n" + " mov r2, #0xb\n" + " bl StringCopyN\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " mov r0, sl\n" + " strb r0, [r4]\n" + " add r0, r5, #0\n" + " mov r1, #0x3\n" + " add r2, r4, #0\n" + " bl SetMonData\n" + " ldr r0, ._29 + 16\n" + " add r0, r6, r0\n" + " mov r1, r8\n" + " sub r0, r0, r1\n" + " add r1, r5, #0\n" + " mov r2, #0x64\n" + " bl gScriptFuncs_End+0x5bc4\n" + " ldr r0, ._29 + 20\n" + " add r6, r6, r0\n" + " mov r0, r8\n" + " sub r6, r6, r0\n" + " add r0, r6, #0\n" + " mov r1, sp\n" + " mov r2, #0x24\n" + " bl gScriptFuncs_End+0x5bc4\n" + " mov r0, r9\n" + " add sp, sp, #0x30\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._30:\n" + " .align 2, 0\n" + "._29:\n" + " .word gOtherText_DataCannotUseVersion+0x99e\n" + " .word gOtherText_DataCannotUseVersion+0xa4a\n" + " .word gEnemyParty\n" + " .word gFlashSectors+0x4\n" + " .word gOtherText_DataCannotUseVersion+0x9c2\n" + " .word gOtherText_DataCannotUseVersion+0xa26\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C810() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add sp, sp, #0xffffffdc\n" + " add r6, r0, #0\n" + " ldr r5, ._31\n" + " ldr r0, ._31 + 4\n" + " ldr r4, ._31 + 8\n" + " sub r0, r0, r5\n" + " mov r8, r0\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " mov r2, r8\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r4, #0\n" + " mov r1, #0xc9\n" + " mov r2, #0x15\n" + " mov r3, #0x82\n" + " bl debug_sub_813C638\n" + " add r0, r4, #0\n" + " mov r1, sp\n" + " bl debug_sub_813C6AC\n" + " ldr r0, ._31 + 12\n" + " add r0, r6, r0\n" + " sub r0, r0, r5\n" + " add r1, r4, #0\n" + " mov r2, #0x64\n" + " bl gScriptFuncs_End+0x5bc4\n" + " ldr r0, ._31 + 16\n" + " add r0, r6, r0\n" + " sub r0, r0, r5\n" + " mov r1, sp\n" + " mov r2, #0x24\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl unref_sub_812620C\n" + " mov r0, r8\n" + " add sp, sp, #0x24\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._32:\n" + " .align 2, 0\n" + "._31:\n" + " .word gOtherText_DataCannotUseVersion+0x99e\n" + " .word gOtherText_DataCannotUseVersion+0xa4a\n" + " .word gEnemyParty\n" + " .word gOtherText_DataCannotUseVersion+0x9c2\n" + " .word gOtherText_DataCannotUseVersion+0xa26\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C888() +{ + asm( + " push {r4, r5, r6, lr}\n" + " mov r6, r8\n" + " push {r6}\n" + " add sp, sp, #0xffffffdc\n" + " add r6, r0, #0\n" + " ldr r5, ._33\n" + " ldr r0, ._33 + 4\n" + " ldr r4, ._33 + 8\n" + " sub r0, r0, r5\n" + " mov r8, r0\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " mov r2, r8\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r4, #0\n" + " mov r1, #0xc9\n" + " mov r2, #0x15\n" + " mov r3, #0x82\n" + " bl debug_sub_813C638\n" + " add r0, r4, #0\n" + " mov r1, sp\n" + " bl debug_sub_813C6AC\n" + " mov r0, #0x0\n" + " strh r0, [r4, #0x1c]\n" + " ldr r0, ._33 + 12\n" + " add r0, r6, r0\n" + " sub r0, r0, r5\n" + " add r1, r4, #0\n" + " mov r2, #0x64\n" + " bl gScriptFuncs_End+0x5bc4\n" + " ldr r0, ._33 + 16\n" + " add r0, r6, r0\n" + " sub r0, r0, r5\n" + " mov r1, sp\n" + " mov r2, #0x24\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r6, #0\n" + " add r1, r5, #0\n" + " bl unref_sub_812620C\n" + " mov r0, r8\n" + " add sp, sp, #0x24\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._34:\n" + " .align 2, 0\n" + "._33:\n" + " .word gOtherText_DataCannotUseVersion+0x99e\n" + " .word gOtherText_DataCannotUseVersion+0xa4a\n" + " .word gEnemyParty\n" + " .word gOtherText_DataCannotUseVersion+0x9c2\n" + " .word gOtherText_DataCannotUseVersion+0xa26\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C904() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._35\n" + " add r0, r4, #0\n" + " mov r1, #0x5\n" + " mov r2, #0x32\n" + " mov r3, #0xb7\n" + " bl debug_sub_813C638\n" + " add r0, r4, #0\n" + " add r0, r0, #0x64\n" + " mov r1, #0x8\n" + " mov r2, #0x32\n" + " mov r3, #0xc4\n" + " bl debug_sub_813C638\n" + " add r4, r4, #0xc8\n" + " add r0, r4, #0\n" + " mov r1, #0x2\n" + " mov r2, #0x32\n" + " mov r3, #0x8d\n" + " bl debug_sub_813C638\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._36:\n" + " .align 2, 0\n" + "._35:\n" + " .word gPlayerParty\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_813C93C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xffffff44\n" + " add r4, r0, #0\n" + " ldr r6, ._37\n" + " ldr r5, ._37 + 4\n" + " sub r5, r5, r6\n" + " add r1, r6, #0\n" + " add r2, r5, #0\n" + " bl gScriptFuncs_End+0x5bc4\n" + " bl SavePlayerParty\n" + " bl debug_sub_813C904\n" + " ldr r1, ._37 + 8\n" + " ldr r2, ._37 + 12\n" + " mov r0, sp\n" + " bl debug_sub_8075DB4\n" + " bl LoadPlayerParty\n" + " ldr r0, ._37 + 16\n" + " add r4, r4, r0\n" + " sub r4, r4, r6\n" + " add r0, r4, #0\n" + " mov r1, sp\n" + " mov r2, #0xbc\n" + " bl gScriptFuncs_End+0x5bc4\n" + " add r0, r5, #0\n" + " add sp, sp, #0xbc\n" + " pop {r4, r5, r6}\n" + " pop {r1}\n" + " bx r1\n" + "._38:\n" + " .align 2, 0\n" + "._37:\n" + " .word gOtherText_DataCannotUseVersion+0xa4a\n" + " .word gOtherText_DataCannotUseVersion+0xb61\n" + " .word gFlashSectors+0x24\n" + " .word 0x270f\n" + " .word gOtherText_DataCannotUseVersion+0xa61\n" + "\n" + ); +} + diff --git a/src/engine/sprite.c b/src/engine/sprite.c index cec3d0b3a..ed143ae8e 100644 --- a/src/engine/sprite.c +++ b/src/engine/sprite.c @@ -815,7 +815,7 @@ void ProcessSpriteCopyRequests(void) } } -static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) +/*static*/ void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) { if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) { @@ -824,7 +824,7 @@ static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct Spr gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size; gSpriteCopyRequestCount++; } -#ifdef DEBUG +#if DEBUG else { unref_sub_80AB084(sDmaOverErrorMsg); -- cgit v1.2.3 From d79f440b8d4c5af26a98011719807b05745533e1 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 12:10:41 -0600 Subject: use 'if DEBUG' instead of 'ifdef DEBUG' --- src/battle/battle_2.c | 4 ++-- src/battle/battle_interface.c | 2 +- src/battle/battle_records.c | 2 +- src/debug/kagaya_debug_menu.c | 2 +- src/debug/nakamura_debug_menu.c | 2 +- src/debug/nohara_debug_menu.c | 2 +- src/debug/taya_debug_window.c | 2 +- src/debug/tomomichi_debug_menu.c | 2 +- src/debug/watanabe_debug_menu.c | 2 +- src/engine/cable_club.c | 2 +- src/engine/link.c | 4 ++-- src/engine/rtc.c | 4 ++-- src/engine/save.c | 2 +- src/engine/sprite.c | 2 +- src/engine/task.c | 2 +- src/engine/trainer_card.c | 16 ++++++++-------- src/field/bike.c | 6 +++--- src/field/decoration_inventory.c | 2 +- src/field/mauville_man.c | 2 +- src/field/party_menu.c | 4 ++-- src/field/roamer.c | 2 +- src/field/slot_machine.c | 2 +- src/field/start_menu.c | 4 ++-- src/pokemon/pokemon_1.c | 2 +- src/rom3.c | 4 ++-- src/rom6.c | 2 +- src/scene/new_game.c | 10 +++++----- src/scene/title_screen.c | 4 ++-- 28 files changed, 48 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 12b18bb52..5700d1b7e 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1258,7 +1258,7 @@ void sub_800F02C(void) memcpy(gSharedMem, gUnknown_02023A00, 0x60); } -#ifdef DEBUG +#if DEBUG __attribute__((naked)) void sub_800F104() { @@ -1554,7 +1554,7 @@ void sub_800F104(void) } #endif -#ifdef DEBUG +#if DEBUG __attribute__((naked)) void sub_800F298() { diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c index f7734301c..b19547d52 100644 --- a/src/battle/battle_interface.c +++ b/src/battle/battle_interface.c @@ -3045,7 +3045,7 @@ static u8 sub_80457E8(u8 a, u8 b) } } -#ifdef DEBUG +#if DEBUG __attribute__((naked)) void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) { diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c index a03a215fd..17e2352ff 100644 --- a/src/battle/battle_records.c +++ b/src/battle/battle_records.c @@ -17,7 +17,7 @@ struct DebugStruct1 extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4]; extern u8 gBattleOutcome; -#ifdef DEBUG +#if DEBUG const struct DebugStruct1 gUnknown_Debug_4245CC[] = { { 1, _("NUMBER1") }, diff --git a/src/debug/kagaya_debug_menu.c b/src/debug/kagaya_debug_menu.c index 6f2734b08..e54e0d17f 100644 --- a/src/debug/kagaya_debug_menu.c +++ b/src/debug/kagaya_debug_menu.c @@ -1,4 +1,4 @@ -#ifdef DEBUG +#if DEBUG #include "global.h" #include "menu.h" diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c index 48b6d91b8..343d56bc2 100644 --- a/src/debug/nakamura_debug_menu.c +++ b/src/debug/nakamura_debug_menu.c @@ -1,4 +1,4 @@ -#ifdef DEBUG +#if DEBUG #include "global.h" #include "menu.h" diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c index b7e62481b..2e739ef4d 100644 --- a/src/debug/nohara_debug_menu.c +++ b/src/debug/nohara_debug_menu.c @@ -1,4 +1,4 @@ -#ifdef DEBUG +#if DEBUG #include "global.h" #define BSS_DATA __attribute__((section(".bss"))) diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c index 4f9b588d8..c20d9b87c 100644 --- a/src/debug/taya_debug_window.c +++ b/src/debug/taya_debug_window.c @@ -1,4 +1,4 @@ -#ifdef DEBUG +#if DEBUG #include "global.h" EWRAM_DATA u8 unk_2030224[4] = { 0 }; diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index f745f2993..eb2fd8a7e 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -1,4 +1,4 @@ -#ifdef DEBUG +#if DEBUG #include "global.h" #define BSS_DATA __attribute__((section(".bss"))) diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index fed5b4e52..dcb3bd90b 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -1,4 +1,4 @@ -#ifdef DEBUG +#if DEBUG #include "global.h" EWRAM_DATA u8 unk_debug_ewram_0[56] = { 0 }; diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index 03a64afc6..688560218 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -360,7 +360,7 @@ void sub_80831F8(u8 taskId) || sub_8082DF4(taskId) == TRUE) return; -#ifdef DEBUG +#if DEBUG sub_8082D60(taskId, GetLinkPlayerCount_2()); #endif diff --git a/src/engine/link.c b/src/engine/link.c index f93fb775f..5747915d7 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -544,7 +544,7 @@ static void ProcessRecvCmds(u8 unusedParam) else { SetBlockReceivedFlag(i); -#ifdef DEBUG +#if DEBUG debug_sub_808B838(i); #endif } @@ -979,7 +979,7 @@ static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) } } -#ifdef DEBUG +#if DEBUG EWRAM_DATA u16 *debugCharacterBase = NULL; EWRAM_DATA void *unk_20238C8 = NULL; diff --git a/src/engine/rtc.c b/src/engine/rtc.c index a56fcd44e..5462298ed 100644 --- a/src/engine/rtc.c +++ b/src/engine/rtc.c @@ -268,7 +268,7 @@ void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day) *dest = EOS; } -#ifdef DEBUG +#if DEBUG void debug_sub_800987C(u8 *dest) { @@ -370,7 +370,7 @@ u32 RtcGetMinuteCount() return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute; } -#ifdef DEBUG +#if DEBUG void debug_sub_8009A60() { RtcGetRawInfo(&sRtc); diff --git a/src/engine/save.c b/src/engine/save.c index d7df98e5f..5564a6ce3 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -663,7 +663,7 @@ static u16 CalculateChecksum(void *data, u16 size) return ((checksum >> 16) + checksum); } -#ifdef DEBUG +#if DEBUG __attribute__((naked)) void sub_813B79C() { diff --git a/src/engine/sprite.c b/src/engine/sprite.c index ed143ae8e..eaffedfdc 100644 --- a/src/engine/sprite.c +++ b/src/engine/sprite.c @@ -841,7 +841,7 @@ void RequestSpriteCopy(const void *src, u8 *dest, u16 size) gSpriteCopyRequests[gSpriteCopyRequestCount].size = size; gSpriteCopyRequestCount++; } -#ifdef DEBUG +#if DEBUG else { unref_sub_80AB084(sDmaOverErrorMsg); diff --git a/src/engine/task.c b/src/engine/task.c index ed17d28bb..d1f2cb5df 100644 --- a/src/engine/task.c +++ b/src/engine/task.c @@ -51,7 +51,7 @@ u8 CreateTask(TaskFunc func, u8 priority) } } -#ifdef DEBUG +#if DEBUG unref_sub_80AB084(gError_NoTasksLeft); #endif diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c index daa513145..f9adc5777 100644 --- a/src/engine/trainer_card.c +++ b/src/engine/trainer_card.c @@ -63,7 +63,7 @@ const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp"); // XXX: what is this? u8 *const ewram_ = gSharedMem; -#ifdef DEBUG +#if DEBUG const struct TrainerCard gUnknown_Debug_083E0448 = { .gender = FEMALE, @@ -204,13 +204,13 @@ static void TrainerCard_Back_PrintPokemonTrades_Label(void); static void TrainerCard_Back_PrintPokemonTrades(void); void unref_sub_8094588(u16 left, u16 top); -#ifdef DEBUG +#if DEBUG static u8 gDebug_03000748; #endif void TrainerCard_ShowPlayerCard(Callback arg1) { -#ifdef DEBUG +#if DEBUG gDebug_03000748 = 0; #endif TrainerCard_InitScreenForPlayer(arg1); @@ -220,7 +220,7 @@ void TrainerCard_ShowPlayerCard(Callback arg1) void TrainerCard_ShowLinkCard(u8 playerIndex, Callback arg2) { -#ifdef DEBUG +#if DEBUG gDebug_03000748 = 0; #endif TrainerCard_InitScreenForLinkPlayer(playerIndex, arg2); @@ -228,7 +228,7 @@ void TrainerCard_ShowLinkCard(u8 playerIndex, Callback arg2) ewram0_2.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language; } -#ifdef DEBUG +#if DEBUG void debug_sub_80A0710(Callback callback) { gDebug_03000748 = TRUE; @@ -619,7 +619,7 @@ static void TrainerCard_FillFlags(void) } } -#ifdef DEBUG +#if DEBUG if (gDebug_03000748 != 0) { ewram0_2.showHallOfFame = TRUE; @@ -723,7 +723,7 @@ bool8 TrainerCard_WaitForKeys(struct Task *task) } return TRUE; } -#ifdef DEBUG +#if DEBUG else if (gDebug_03000748 && gMain.newKeys & R_BUTTON) { ewram0_2.starCount++; @@ -1462,7 +1462,7 @@ static void TrainerCard_Front_PrintPokedexCount(void) u8 buffer[16]; if ( -#ifdef DEBUG +#if DEBUG gDebug_03000748 == 0 && #endif !ewram0_2.showPokedexCount) diff --git a/src/field/bike.c b/src/field/bike.c index 736dbc837..eb9d56a64 100644 --- a/src/field/bike.c +++ b/src/field/bike.c @@ -14,7 +14,7 @@ extern bool8 gBikeCyclingChallenge; extern u8 gBikeCollisions; extern u8 gUnusedBikeCameraAheadPanback; -#ifdef DEBUG +#if DEBUG extern u8 gUnknown_020297ED; u8 debug_sub_805F2B0(u8); #endif @@ -131,7 +131,7 @@ static const struct BikeHistoryInputInfo gAcroBikeTricksList[] = void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) { -#ifdef DEBUG +#if DEBUG if (gUnknown_020297ED && debug_sub_805F2B0(direction)) { Bike_SetBikeStill(); @@ -284,7 +284,7 @@ static void MachBikeTransition_TrySlowDown(u8 var) // the acro bike requires the input handler to be executed before the transition can. static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) { -#ifdef DEBUG +#if DEBUG if (gUnknown_020297ED && debug_sub_805F2B0(newDirection)) { Bike_SetBikeStill(); diff --git a/src/field/decoration_inventory.c b/src/field/decoration_inventory.c index 21ced1be8..8f7f5eb92 100644 --- a/src/field/decoration_inventory.c +++ b/src/field/decoration_inventory.c @@ -166,7 +166,7 @@ u8 sub_81341D4(void) } -#ifdef DEBUG +#if DEBUG void debug_sub_814A3A8(void) { u8 decor; diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 1b53df6be..00368c2f5 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -250,7 +250,7 @@ void SetupMauvilleOldMan(void) sub_80F83D0(); } -#ifdef DEBUG +#if DEBUG __attribute__((naked)) void debug_sub_810B32C() { diff --git a/src/field/party_menu.c b/src/field/party_menu.c index c099fd8f4..7994dd60c 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -4025,7 +4025,7 @@ void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) CreateTask(Task_TeamMonTMMove, 5); } -#ifdef DEBUG +#if DEBUG extern u8 gUnknown_020297ED; #endif @@ -4044,7 +4044,7 @@ void Task_TeamMonTMMove(u8 taskId) else { if ( -#ifdef DEBUG +#if DEBUG !gUnknown_020297ED && #endif !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) diff --git a/src/field/roamer.c b/src/field/roamer.c index 16a42e9f1..6ed5b6c89 100644 --- a/src/field/roamer.c +++ b/src/field/roamer.c @@ -227,7 +227,7 @@ void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) *mapNum = sRoamerLocation[MAP_NUM]; } -#ifdef DEBUG +#if DEBUG void debug_sub_814A714(void) { if (gSaveBlock1.location.mapGroup == 0) diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index e231f686d..311679cb7 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -2855,7 +2855,7 @@ static void sub_8104C5C(void) static void LoadSlotMachineWheelOverlay(void); -#ifdef DEBUG +#if DEBUG // should be static __attribute__((section(".bss"))) u8 unk_debug_bss_1[0xC] = { 0 }; #endif diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 105ef1756..36295b3f8 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -44,7 +44,7 @@ enum { MENU_ACTION_PLAYER_LINK }; -#ifdef DEBUG +#if DEBUG static u32 _debugStartMenu_0 __attribute__((unused)); static u32 _debugStartMenu_1 __attribute__((unused)); #endif @@ -137,7 +137,7 @@ static bool32 sub_80719FC(u8 *ptr); static void sub_8071B54(void); static void Task_8071B64(u8 taskId); -#ifdef DEBUG +#if DEBUG __attribute__((naked)) void debug_sub_8075C30() { diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c index 079bcf489..fd4684832 100644 --- a/src/pokemon/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -524,7 +524,7 @@ void CalculateMonStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_HP, ¤tHP); } -#ifdef DEBUG +#if DEBUG __attribute__((naked)) void debug_sub_803F55C() { diff --git a/src/rom3.c b/src/rom3.c index 0fe67dcec..efaa1d97f 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -67,7 +67,7 @@ void sub_800B858(void) } } -#ifdef DEBUG +#if DEBUG extern u8 gUnknown_02023A14_50; #endif @@ -98,7 +98,7 @@ void setup_poochyena_battle(void) gUnknown_020239FC = 0; gUnknown_02024C78 = 0; -#ifdef DEBUG +#if DEBUG if (gUnknown_02023A14_50 & 0x80) { ewram[0x160fd] = 0; diff --git a/src/rom6.c b/src/rom6.c index 1c0654538..b23f1c15a 100644 --- a/src/rom6.c +++ b/src/rom6.c @@ -117,7 +117,7 @@ static void sub_810B4CC(u8 taskId) DestroyTask(taskId); } -#ifdef DEBUG +#if DEBUG void debug_sub_8120968(void) { if (npc_before_player_of_type(MAP_OBJ_GFX_BREAKABLE_ROCK) == TRUE) diff --git a/src/scene/new_game.c b/src/scene/new_game.c index d954fb3c8..cec7134a3 100644 --- a/src/scene/new_game.c +++ b/src/scene/new_game.c @@ -31,7 +31,7 @@ #include "text.h" #include "tv.h" -#ifdef DEBUG +#if DEBUG extern u8 gUnknown_020297ED; #endif @@ -50,7 +50,7 @@ static const struct ContestWinner sEmptyMuseumPortrait = .trainerName = {EOS}, }; -#ifdef DEBUG +#if DEBUG const s8 gUnknown_Debug_0823C788[][2] = { { MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK) }, @@ -114,7 +114,7 @@ void ZeroBattleTowerData(void) CpuFill32(0, &gSaveBlock2.battleTower, sizeof(gSaveBlock2.battleTower)); } -#ifdef DEBUG +#if DEBUG void debug_sub_8052E04() { u8 i; @@ -153,7 +153,7 @@ void ClearSav2(void) void sub_8052E4C(void) { gDifferentSaveFile = 0; -#ifdef DEBUG +#if DEBUG gUnknown_020297ED = 0; #endif sub_808C0A0(); @@ -209,7 +209,7 @@ void NewGameInitData(void) ScriptContext2_RunNewScript(gUnknown_0819FA81); } -#ifdef DEBUG +#if DEBUG extern void debug_sub_80A3904(void); extern void debug_sub_80A3714(void); extern void debug_sub_8120F98(void); diff --git a/src/scene/title_screen.c b/src/scene/title_screen.c index 8d5c4da13..4ff02d93c 100644 --- a/src/scene/title_screen.c +++ b/src/scene/title_screen.c @@ -831,7 +831,7 @@ static void Task_TitleScreenPhase3(u8 taskId) BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); SetMainCallback2(CB2_GoToResetRtcScreen); } -#ifdef DEBUG +#if DEBUG else if (gMain.heldKeys == SELECT_BUTTON) { BeginNormalPaletteFade(-1, 0, 0, 16, 0); @@ -864,7 +864,7 @@ static void CB2_GoToMainMenu(void) SetMainCallback2(CB2_InitMainMenu); } -#ifdef DEBUG +#if DEBUG static void CB2_GoToTestMenu(void) { if (!UpdatePaletteFade()) -- cgit v1.2.3 From 6903b3626aed4e5521243b4517c43fed3c4d0ff5 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 13:11:10 -0600 Subject: resolve some undefined references --- src/battle/battle_2.c | 90 +++--- src/debug/kagaya_debug_menu.c | 8 +- src/debug/nakamura_debug_menu.c | 272 ++++++++-------- src/debug/nohara_debug_menu.c | 86 +++--- src/debug/start_menu_debug.c | 224 +++++++------- src/debug/taya_debug_window.c | 62 ++-- src/debug/tomomichi_debug_menu.c | 652 +++++++++++++++++++-------------------- src/debug/watanabe_debug_menu.c | 194 ++++++------ src/field/slot_machine.c | 96 +++--- src/field/start_menu.c | 6 +- 10 files changed, 845 insertions(+), 845 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 5700d1b7e..78fc35ba5 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -275,7 +275,7 @@ void InitBattle(void) " bl sub_80895F8\n" " ldr r4, ._10 + 32\n" " add r0, r4, #0\n" - " bl SetUpWindowConfig\n" + " bl Text_LoadWindowTemplate\n" " bl ResetPaletteFade\n" " ldr r0, ._10 + 36\n" " mov r1, #0x0\n" @@ -306,13 +306,13 @@ void InitBattle(void) "._7:\n" " ldr r0, ._10 + 76\n" " add r1, r4, #0\n" - " bl InitWindowFromConfig\n" + " bl Text_InitWindowWithTemplate\n" " ldr r0, ._10 + 80\n" " ldr r1, ._10 + 84\n" - " bl InitWindowFromConfig\n" + " bl Text_InitWindowWithTemplate\n" " ldr r0, ._10 + 88\n" " ldr r1, ._10 + 92\n" - " bl InitWindowFromConfig\n" + " bl Text_InitWindowWithTemplate\n" " bl sub_800D6D4\n" " bl sub_800DAB8\n" " bl ResetSpriteData\n" @@ -348,7 +348,7 @@ void InitBattle(void) " .word gWindowConfig_81E6C58\n" " .word gUnknown_030042A4\n" " .word gUnknown_030042A0\n" - " .word gUnknown_030042C0\n" + " .word gBattle_BG1_X\n" " .word gUnknown_030041B4\n" " .word gUnknown_03004288\n" " .word gUnknown_03004280\n" @@ -3274,10 +3274,10 @@ void debug_sub_80108B8() " bl remove_some_task\n" " ldr r4, ._507 + 84\n" " add r0, r4, #0\n" - " bl SetUpWindowConfig\n" + " bl Text_LoadWindowTemplate\n" " ldr r0, ._507 + 88\n" " add r1, r4, #0\n" - " bl InitWindowFromConfig\n" + " bl Text_InitWindowWithTemplate\n" " ldr r0, ._507 + 92\n" " strb r5, [r0]\n" " ldr r0, ._507 + 96\n" @@ -3334,7 +3334,7 @@ void debug_sub_80108B8() " .word 0x4000200\n" " .word gUnknown_030042A4\n" " .word gUnknown_030042A0\n" - " .word gUnknown_030042C0\n" + " .word gBattle_BG1_X\n" " .word gUnknown_030041B4\n" " .word gUnknown_03004288\n" " .word gUnknown_03004280\n" @@ -3987,7 +3987,7 @@ void debug_sub_8010CAC() " .align 2, 0\n" "._581:\n" " .word gUnknown_Debug_03004360\n" - " .word gUnknown_030042C0\n" + " .word gBattle_BG1_X\n" " .word gUnknown_Debug_030043A4\n" " .word gMain\n" " .word gUnknown_Debug_030043A0\n" @@ -4043,7 +4043,7 @@ void debug_sub_8010CAC() " .align 2, 0\n" "._587:\n" " .word gUnknown_Debug_03004360\n" - " .word gUnknown_030042C0\n" + " .word gBattle_BG1_X\n" " .word gUnknown_Debug_030043A4\n" " .word gMain\n" " .word gUnknown_Debug_030043A0\n" @@ -5839,7 +5839,7 @@ void debug_sub_8011D40() " .word 0x80000800\n" " .word gUnknown_030042A4\n" " .word gUnknown_030042A0\n" - " .word gUnknown_030042C0\n" + " .word gBattle_BG1_X\n" " .word gUnknown_030041B4\n" " .word gUnknown_03004288\n" " .word gUnknown_03004280\n" @@ -5912,7 +5912,7 @@ void debug_sub_8011DD4() " .word 0x9803\n" " .word gUnknown_030042A4\n" " .word gUnknown_030042A0\n" - " .word gUnknown_030042C0\n" + " .word gBattle_BG1_X\n" " .word gUnknown_030041B4\n" " .word gUnknown_03004288\n" " .word gUnknown_03004280\n" @@ -6061,7 +6061,7 @@ void debug_sub_8011EA0() " add r1, r6, #0\n" " ldr r2, [sp, #0x4]\n" " mov r3, r8\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " ldr r0, ._823 + 8\n" " bl sub_8002F44\n" " ldr r1, ._823 + 12\n" @@ -6090,7 +6090,7 @@ void debug_sub_8011EA0() " str r0, [sp]\n" " ldr r0, ._823 + 8\n" " add r1, r6, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " ldr r0, ._823 + 8\n" " bl sub_8002F44\n" " mov r0, #0xff\n" @@ -6113,7 +6113,7 @@ void debug_sub_8011EA0() " add r1, r6, #0\n" " ldr r2, [sp, #0x4]\n" " mov r3, r8\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " ldr r0, ._823 + 8\n" " bl sub_8002F44\n" " b ._848\n" @@ -6171,7 +6171,7 @@ void debug_sub_8011EA0() " str r0, [sp]\n" " add r0, r6, #0\n" " mov r1, sl\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r6, #0\n" " bl sub_8002F44\n" " lsl r4, r7, #0x1\n" @@ -6199,7 +6199,7 @@ void debug_sub_8011EA0() " str r0, [sp]\n" " add r0, r6, #0\n" " mov r1, sl\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r6, #0\n" " bl sub_8002F44\n" " mov r0, #0xff\n" @@ -6250,7 +6250,7 @@ void debug_sub_8011EA0() " ldrb r0, [r4]\n" " str r0, [sp]\n" " add r0, r6, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r6, #0\n" " bl sub_8002F44\n" " b ._848\n" @@ -6282,7 +6282,7 @@ void debug_sub_8011EA0() " str r0, [sp]\n" " add r0, r5, #0\n" " add r1, r6, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl sub_8002F44\n" " mov r4, #0x0\n" @@ -6364,7 +6364,7 @@ void debug_sub_8011EA0() " str r0, [sp]\n" " add r0, r5, #0\n" " add r1, r6, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl sub_8002F44\n" " b ._848\n" @@ -6406,7 +6406,7 @@ void debug_sub_8011EA0() " str r0, [sp]\n" " add r0, r5, #0\n" " add r1, r6, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl sub_8002F44\n" "._848:\n" @@ -6476,7 +6476,7 @@ void debug_sub_8012294() " str r0, [sp]\n" " mov r0, sl\n" " mov r1, r9\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " mov r0, sl\n" " bl sub_8002F44\n" " ldrb r4, [r7]\n" @@ -6513,7 +6513,7 @@ void debug_sub_8012294() " str r0, [sp]\n" " mov r0, sl\n" " mov r1, r9\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " mov r0, sl\n" " bl sub_8002F44\n" " mov r0, #0xff\n" @@ -6553,7 +6553,7 @@ void debug_sub_8012294() " str r0, [sp]\n" " mov r0, sl\n" " mov r1, r9\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " mov r0, sl\n" " bl sub_8002F44\n" "._853:\n" @@ -6614,7 +6614,7 @@ void debug_sub_80123D8() " mov r1, r8\n" " mov r2, sl\n" " add r3, r7, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl sub_8002F44\n" " lsl r5, r5, #0x1\n" @@ -6646,7 +6646,7 @@ void debug_sub_80123D8() " mov r1, r8\n" " mov r2, sl\n" " add r3, r7, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl sub_8002F44\n" " mov r0, #0x0\n" @@ -6661,7 +6661,7 @@ void debug_sub_80123D8() " add r0, r4, #0\n" " mov r1, r8\n" " mov r3, sl\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl sub_8002F44\n" " ldr r1, ._858 + 12\n" @@ -6691,7 +6691,7 @@ void debug_sub_80123D8() " mov r1, r8\n" " mov r2, r9\n" " mov r3, sl\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl sub_8002F44\n" " b ._857\n" @@ -6718,7 +6718,7 @@ void debug_sub_80123D8() " str r0, [sp]\n" " add r0, r5, #0\n" " add r1, r6, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl sub_8002F44\n" " ldrh r2, [r4, #0x6]\n" @@ -6727,7 +6727,7 @@ void debug_sub_80123D8() " str r0, [sp]\n" " add r0, r5, #0\n" " add r1, r6, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl sub_8002F44\n" "._857:\n" @@ -6781,7 +6781,7 @@ void debug_sub_8012540() " str r0, [sp]\n" " add r0, r4, #0\n" " add r1, r5, #0\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl sub_8002F44\n" " add sp, sp, #0x4\n" @@ -6998,7 +6998,7 @@ void debug_sub_8012688() " strh r5, [r0]\n" " ldr r4, ._873 + 16\n" " add r0, r4, #0\n" - " bl SetUpWindowConfig\n" + " bl Text_LoadWindowTemplate\n" " bl ResetPaletteFade\n" " ldr r0, ._873 + 20\n" " strh r5, [r0]\n" @@ -7033,7 +7033,7 @@ void debug_sub_8012688() " strh r0, [r6]\n" " ldr r0, ._873 + 64\n" " add r1, r4, #0\n" - " bl InitWindowFromConfig\n" + " bl Text_InitWindowWithTemplate\n" " ldrh r2, [r6]\n" " lsl r0, r2, #0x3\n" " ldr r1, ._873 + 68\n" @@ -7133,7 +7133,7 @@ void debug_sub_8012688() " .word gWindowConfig_81E6C58\n" " .word gUnknown_030042A4\n" " .word gUnknown_030042A0\n" - " .word gUnknown_030042C0\n" + " .word gBattle_BG1_X\n" " .word gUnknown_030041B4\n" " .word gUnknown_03004288\n" " .word gUnknown_03004280\n" @@ -7211,7 +7211,7 @@ void debug_sub_80128B4() " add r1, r4, #0\n" " mov r2, #0x90\n" " mov r3, #0x2\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl sub_8002F44\n" " ldr r6, ._878 + 8\n" @@ -7237,7 +7237,7 @@ void debug_sub_80128B4() " add r1, r4, #0\n" " mov r2, #0x90\n" " mov r3, #0x2\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl sub_8002F44\n" " add sp, sp, #0x4\n" @@ -7282,7 +7282,7 @@ void debug_sub_8012938() " add r1, r4, #0\n" " mov r2, #0xa2\n" " mov r3, #0x2\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r6, #0\n" " bl sub_8002F44\n" " ldr r1, ._880 + 8\n" @@ -7306,7 +7306,7 @@ void debug_sub_8012938() " add r1, r4, #0\n" " mov r2, #0xa2\n" " mov r3, #0x2\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r6, #0\n" " bl sub_8002F44\n" " ldr r2, ._880 + 20\n" @@ -7622,7 +7622,7 @@ void debug_sub_8012B70() " str r0, [sp]\n" " add r0, r5, #0\n" " mov r3, #0x1a\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl sub_8002F44\n" " strh r6, [r4, #0xe]\n" @@ -7668,7 +7668,7 @@ void debug_sub_8012C08() " add r1, r5, #0\n" " mov r2, #0x90\n" " mov r3, #0x2\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r7, #0\n" " bl sub_8002F44\n" " mov r0, #0x0\n" @@ -7680,7 +7680,7 @@ void debug_sub_8012C08() " add r1, r5, #0\n" " mov r2, #0xa2\n" " mov r3, #0x2\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r7, #0\n" " bl sub_8002F44\n" " mov r0, #0x0\n" @@ -7705,7 +7705,7 @@ void debug_sub_8012C08() " add r0, r7, #0\n" " mov r2, #0x90\n" " mov r3, #0x2\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " b ._904\n" "._906:\n" " .align 2, 0\n" @@ -7728,7 +7728,7 @@ void debug_sub_8012C08() " add r0, r7, #0\n" " mov r2, #0x90\n" " mov r3, #0x2\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" "._904:\n" " add r5, r4, #0\n" " ldr r4, ._907 + 8\n" @@ -7741,7 +7741,7 @@ void debug_sub_8012C08() " str r0, [sp]\n" " add r0, r4, #0\n" " mov r3, #0x1a\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl sub_8002F44\n" " ldr r1, ._907\n" @@ -7816,7 +7816,7 @@ void debug_sub_8012D10() " str r0, [sp]\n" " add r0, r4, #0\n" " mov r3, #0x13\n" - " bl InitWindow\n" + " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl sub_8002F44\n" " ldr r1, ._920 + 8\n" diff --git a/src/debug/kagaya_debug_menu.c b/src/debug/kagaya_debug_menu.c index e54e0d17f..8ece4ebec 100644 --- a/src/debug/kagaya_debug_menu.c +++ b/src/debug/kagaya_debug_menu.c @@ -35,17 +35,17 @@ void InitKagayaDebugMenu_B() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xe\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._1\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xd\n" @@ -76,7 +76,7 @@ void debug_sub_80B061C() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c index 343d56bc2..1d36d528f 100644 --- a/src/debug/nakamura_debug_menu.c +++ b/src/debug/nakamura_debug_menu.c @@ -178,17 +178,17 @@ void debug_sub_815F1B8() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0xe\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._1\n" " mov r0, #0x10\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xe\n" @@ -243,7 +243,7 @@ void debug_sub_815F214() " beq ._5 @cond_branch\n" " mov r0, #0x1\n" " neg r0, r0\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" "._5:\n" " ldrh r1, [r4, #0x2e]\n" " mov r0, #0x80\n" @@ -251,7 +251,7 @@ void debug_sub_815F214() " cmp r0, #0\n" " beq ._6 @cond_branch\n" " mov r0, #0x1\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" "._6:\n" " ldrh r1, [r4, #0x2e]\n" " mov r0, #0x1\n" @@ -259,13 +259,13 @@ void debug_sub_815F214() " cmp r0, #0\n" " beq ._7 @cond_branch\n" " ldr r4, ._9 + 4\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, #0x4\n" " add r0, r0, r4\n" " ldr r4, [r0]\n" - " bl HandleDestroyMenuCursors\n" + " bl Menu_DestroyCursor\n" " bl _call_via_r4\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -331,7 +331,7 @@ u8 debug_sub_815F2B4() " push {lr}\n" " add sp, sp, #0xfffffffc\n" " bl CloseMenu\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r1, ._16\n" " ldr r0, ._16 + 4\n" " str r0, [r1, #0x8]\n" @@ -632,7 +632,7 @@ void debug_sub_815F4D8() " mov r1, #0x1\n" " mov r2, #0xa\n" " mov r3, #0xa\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r6, ._43\n" " ldr r7, ._43 + 4\n" " ldrb r1, [r7]\n" @@ -643,7 +643,7 @@ void debug_sub_815F4D8() " add r0, r6, #0\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r2, ._43 + 8\n" " ldrb r1, [r7]\n" " lsl r0, r1, #0x2\n" @@ -669,11 +669,11 @@ void debug_sub_815F4D8() " add r0, r6, #0\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._43 + 16\n" " mov r1, #0x1\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, sp\n" " ldrb r1, [r0]\n" " add r0, r6, #0\n" @@ -683,11 +683,11 @@ void debug_sub_815F4D8() " add r0, r6, #0\n" " mov r1, #0x2\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._43 + 20\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldrb r1, [r4]\n" " add r0, r6, #0\n" " mov r2, #0x0\n" @@ -696,11 +696,11 @@ void debug_sub_815F4D8() " add r0, r6, #0\n" " mov r1, #0x3\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._43 + 24\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldrb r1, [r5]\n" " add r0, r6, #0\n" " mov r2, #0x0\n" @@ -709,7 +709,7 @@ void debug_sub_815F4D8() " add r0, r6, #0\n" " mov r1, #0x3\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._42:\n" " add sp, sp, #0x4\n" " pop {r4, r5, r6, r7}\n" @@ -811,12 +811,12 @@ u8 debug_sub_815F62C() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xb\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " bl debug_sub_815F4D8\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -866,7 +866,7 @@ void debug_sub_815F668() " add r0, r5, #0\n" " mov r1, #0x2\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " add r1, r6, #0\n" " bl __umodsi3\n" @@ -878,7 +878,7 @@ void debug_sub_815F668() " add r0, r5, #0\n" " mov r1, #0x7\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5, r6}\n" " pop {r0}\n" " bx r0\n" @@ -902,7 +902,7 @@ void debug_sub_815F6E4() " mov r1, #0x3\n" " mov r2, #0xb\n" " mov r3, #0x4\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r4, ._63\n" " ldr r0, ._63 + 4\n" " ldrb r0, [r0]\n" @@ -919,7 +919,7 @@ void debug_sub_815F6E4() " add r0, r4, #0\n" " mov r1, #0x2\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4}\n" " pop {r0}\n" " bx r0\n" @@ -942,7 +942,7 @@ void debug_sub_815F72C() " mov r1, #0x1\n" " mov r2, #0xb\n" " mov r3, #0xa\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r4, ._66\n" " ldr r5, ._66 + 4\n" " ldrb r1, [r5]\n" @@ -953,7 +953,7 @@ void debug_sub_815F72C() " add r0, r4, #0\n" " mov r1, #0x2\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r2, ._66 + 8\n" " ldrb r1, [r5]\n" " lsl r0, r1, #0x2\n" @@ -991,7 +991,7 @@ void debug_sub_815F788() " mov r1, #0x5\n" " mov r2, #0xb\n" " mov r3, #0x6\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r0, ._68\n" " ldr r1, ._68 + 4\n" " ldrb r1, [r1]\n" @@ -999,7 +999,7 @@ void debug_sub_815F788() " lsl r1, r1, #0x18\n" " lsr r1, r1, #0x18\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r0}\n" " bx r0\n" "._69:\n" @@ -1024,7 +1024,7 @@ void debug_sub_815F7B4() " mov r1, #0x1\n" " mov r2, #0xb\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " b ._71\n" "._73:\n" " .align 2, 0\n" @@ -1038,7 +1038,7 @@ void debug_sub_815F7B4() " add r0, r0, r1\n" " mov r1, #0xb\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._71:\n" " pop {r0}\n" " bx r0\n" @@ -1354,12 +1354,12 @@ void debug_sub_815F930() " mov r1, #0x5\n" " mov r2, #0xb\n" " mov r3, #0x6\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " mov r0, #0xb\n" " mov r1, #0x1\n" " mov r2, #0xb\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r1, ._133\n" " ldr r0, ._133 + 4\n" " str r0, [r1]\n" @@ -1413,7 +1413,7 @@ void debug_sub_815FA38() " beq ._141 @cond_branch\n" " mov r0, #0x2\n" "._138:\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" "._161:\n" " mov r0, #0x0\n" " b ._142\n" @@ -1481,7 +1481,7 @@ void debug_sub_815FA38() " ldrb r0, [r0]\n" " cmp r0, #0\n" " beq ._161 @cond_branch\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " ldr r1, ._159 + 12\n" " strb r0, [r1]\n" " ldr r0, ._159 + 16\n" @@ -1535,12 +1535,12 @@ u8 debug_sub_815FB1C() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xc\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " bl debug_sub_815F72C\n" " mov r0, #0x0\n" " str r0, [sp]\n" @@ -1591,7 +1591,7 @@ void debug_sub_815FB78() " beq ._168 @cond_branch\n" " mov r0, #0x1\n" "._165:\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " mov r0, #0x0\n" " b ._177\n" "._168:\n" @@ -1600,7 +1600,7 @@ void debug_sub_815FB78() " cmp r0, #0\n" " beq ._170 @cond_branch\n" " bl CloseMenu\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " cmp r0, #0\n" @@ -1646,7 +1646,7 @@ u8 debug_sub_815FBE8() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " ldr r4, ._178 + 8\n" " add r0, r4, #0\n" " bl debug_sub_814A73C\n" @@ -1654,15 +1654,15 @@ u8 debug_sub_815FBE8() " mov r1, #0x0\n" " mov r2, #0xb\n" " mov r3, #0x9\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " add r0, r4, #0\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._178 + 12\n" " mov r1, #0x2\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xa\n" @@ -1739,7 +1739,7 @@ u8 debug_sub_815FC94() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " bl CloseMenu\n" " mov r0, #0x1\n" " pop {r1}\n" @@ -1945,7 +1945,7 @@ void debug_sub_815FDE4() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " bl CloseMenu\n" " mov r0, #0x1\n" " b ._204\n" @@ -1971,16 +1971,16 @@ u8 debug_sub_815FE1C() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x10\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._210\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r6, ._210 + 4\n" " mov r0, #0x0\n" " bl debug_sub_815FCB4\n" @@ -1994,7 +1994,7 @@ u8 debug_sub_815FE1C() " add r0, r6, #0\n" " mov r1, #0x5\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x1\n" " bl debug_sub_815FCB4\n" " add r1, r0, #0\n" @@ -2007,7 +2007,7 @@ u8 debug_sub_815FE1C() " add r0, r6, #0\n" " mov r1, #0x5\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x2\n" " bl debug_sub_815FCB4\n" " add r1, r0, #0\n" @@ -2020,7 +2020,7 @@ u8 debug_sub_815FE1C() " add r0, r6, #0\n" " mov r1, #0x5\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " bl debug_sub_8092344\n" " add r1, r0, #0\n" @@ -2033,7 +2033,7 @@ u8 debug_sub_815FE1C() " add r0, r6, #0\n" " mov r1, #0xb\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x1\n" " bl debug_sub_8092344\n" " add r1, r0, #0\n" @@ -2046,7 +2046,7 @@ u8 debug_sub_815FE1C() " add r0, r6, #0\n" " mov r1, #0xb\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x2\n" " bl debug_sub_8092344\n" " add r1, r0, #0\n" @@ -2059,7 +2059,7 @@ u8 debug_sub_815FE1C() " add r0, r6, #0\n" " mov r1, #0xb\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._210 + 8\n" " ldr r1, ._210 + 12\n" " add r0, r0, r1\n" @@ -2120,7 +2120,7 @@ u8 debug_sub_815FE1C() " lsr r2, r2, #0x18\n" " add r0, r6, #0\n" " add r1, r4, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r5, #1\n" " lsl r0, r0, #0x10\n" " lsr r5, r0, #0x10\n" @@ -2139,7 +2139,7 @@ u8 debug_sub_815FE1C() " add r0, r4, #0\n" " mov r1, #0x2\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._210 + 16\n" " ldr r0, ._210 + 20\n" " str r0, [r1]\n" @@ -2171,16 +2171,16 @@ void debug_sub_815FFDC() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x0\n" " mov r1, #0xe\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._214\n" " mov r1, #0x1\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r5, #0x0\n" " ldr r0, ._214 + 4\n" " mov r8, r0\n" @@ -2278,7 +2278,7 @@ void debug_sub_816009C() " lsl r2, r2, #0x18\n" " lsr r2, r2, #0x18\n" " mov r1, #0x10\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r0}\n" " bx r0\n" "._220:\n" @@ -2330,7 +2330,7 @@ void debug_sub_81600D0() " lsl r2, r2, #0x18\n" " lsr r2, r2, #0x18\n" " mov r1, #0x17\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._226\n" "._228:\n" " .align 2, 0\n" @@ -2343,7 +2343,7 @@ void debug_sub_81600D0() " lsr r2, r2, #0x18\n" " mov r0, sp\n" " mov r1, #0x17\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._226:\n" " add sp, sp, #0x4\n" " pop {r4, r5}\n" @@ -2378,7 +2378,7 @@ void debug_sub_816013C() " add r0, r5, #0\n" " mov r1, #0x1a\n" " add r2, r4, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5}\n" " pop {r0}\n" " bx r0\n" @@ -2407,7 +2407,7 @@ void debug_sub_816017C() " lsr r3, r3, #0x18\n" " mov r0, #0x10\n" " mov r2, #0x1c\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r1, ._232\n" " lsl r0, r4, #0x2\n" " add r0, r0, r1\n" @@ -2634,7 +2634,7 @@ void debug_sub_8160308() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " mov r2, #0x0\n" "._252:\n" " add r1, r2, #1\n" @@ -2748,7 +2748,7 @@ void debug_sub_81603B8() " lsl r3, r3, #0x18\n" " lsr r3, r3, #0x18\n" " add r0, r2, #0\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " cmp r6, #0\n" " bne ._256 @cond_branch\n" " cmp r4, #0\n" @@ -3698,7 +3698,7 @@ void debug_sub_8160A80() " add r0, r4, #0\n" " mov r1, #0x8\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._440\n" "._423:\n" " .align 2, 0\n" @@ -3715,7 +3715,7 @@ void debug_sub_8160A80() " add r0, r4, #0\n" " mov r1, #0x8\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._440\n" "._427:\n" " .align 2, 0\n" @@ -3731,7 +3731,7 @@ void debug_sub_8160A80() " add r0, r4, #0\n" " mov r1, #0x8\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._440\n" "._431:\n" " .align 2, 0\n" @@ -3747,7 +3747,7 @@ void debug_sub_8160A80() " add r0, r4, #0\n" " mov r1, #0x8\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._440\n" "._435:\n" " .align 2, 0\n" @@ -3763,7 +3763,7 @@ void debug_sub_8160A80() " add r0, r4, #0\n" " mov r1, #0x8\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._440\n" "._439:\n" " .align 2, 0\n" @@ -3779,7 +3779,7 @@ void debug_sub_8160A80() " add r0, r4, #0\n" " mov r1, #0x8\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._440:\n" " pop {r4}\n" " pop {r0}\n" @@ -3871,11 +3871,11 @@ void debug_sub_8160BB0() " mov r1, #0x1\n" " mov r2, #0x8\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5}\n" " pop {r0}\n" " bx r0\n" @@ -3898,32 +3898,32 @@ void debug_sub_8160BE4() " mov r1, #0x0\n" " mov r2, #0xc\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " bl debug_sub_8160BB0\n" " ldr r0, ._459\n" " mov r1, #0x2\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._459 + 4\n" " mov r1, #0x2\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._459 + 8\n" " mov r1, #0x2\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._459 + 12\n" " mov r1, #0x2\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._459 + 16\n" " mov r1, #0x2\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._459 + 20\n" " mov r1, #0x2\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r4, #0x0\n" "._458:\n" " add r0, r4, #0\n" @@ -4057,7 +4057,7 @@ void debug_sub_8160CF4() " beq ._475 @cond_branch\n" " mov r0, #0x1\n" "._472:\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " mov r0, #0x0\n" " b ._484\n" "._475:\n" @@ -4065,7 +4065,7 @@ void debug_sub_8160CF4() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._477 @cond_branch\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " mov r1, #0x1\n" @@ -4076,13 +4076,13 @@ void debug_sub_8160CF4() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._479 @cond_branch\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " mov r1, #0x1\n" "._478:\n" " bl debug_sub_8160B50\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " bl debug_sub_8160A80\n" @@ -4112,7 +4112,7 @@ void debug_sub_8160CF4() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " bl CloseMenu\n" " mov r0, #0x1\n" "._484:\n" @@ -4131,7 +4131,7 @@ u8 debug_sub_8160D98() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " bl debug_sub_8160BE4\n" " ldr r1, ._485\n" " ldr r0, ._485 + 4\n" @@ -4157,43 +4157,43 @@ void debug_sub_8160DC0() " mov r1, #0x0\n" " mov r2, #0x16\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._487\n" " mov r1, #0xb\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._487 + 4\n" " mov r1, #0x2\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._487 + 8\n" " mov r1, #0x2\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._487 + 12\n" " mov r1, #0x2\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._487 + 16\n" " mov r1, #0x2\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._487 + 20\n" " mov r1, #0x2\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._487 + 24\n" " mov r1, #0x2\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._487 + 28\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._487 + 32\n" " mov r1, #0x2\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r0}\n" " bx r0\n" "._488:\n" @@ -4222,7 +4222,7 @@ void debug_sub_8160E50() " mov r1, #0x1\n" " mov r2, #0xa\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r5, ._489\n" " add r0, r6, #0\n" " mov r1, #0x2\n" @@ -4231,12 +4231,12 @@ void debug_sub_8160E50() " add r0, r5, #0\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xc\n" " mov r1, #0x1\n" " mov r2, #0x15\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r6, #0\n" " mov r1, #0xb\n" " bl GetMonData\n" @@ -4246,7 +4246,7 @@ void debug_sub_8160E50() " add r0, r0, r1\n" " mov r1, #0xc\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r6, #0\n" " mov r1, #0x1a\n" " bl GetMonData\n" @@ -4262,11 +4262,11 @@ void debug_sub_8160E50() " mov r1, #0x3\n" " mov r2, #0x11\n" " mov r3, #0x4\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0xd\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r6, #0\n" " mov r1, #0x1b\n" " bl GetMonData\n" @@ -4284,11 +4284,11 @@ void debug_sub_8160E50() " mov r1, #0x5\n" " mov r2, #0x11\n" " mov r3, #0x6\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0xd\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r6, #0\n" " mov r1, #0x1c\n" " bl GetMonData\n" @@ -4306,11 +4306,11 @@ void debug_sub_8160E50() " mov r1, #0x7\n" " mov r2, #0x11\n" " mov r3, #0x8\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0xd\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r6, #0\n" " mov r1, #0x1d\n" " bl GetMonData\n" @@ -4328,11 +4328,11 @@ void debug_sub_8160E50() " mov r1, #0x9\n" " mov r2, #0x11\n" " mov r3, #0xa\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0xd\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r6, #0\n" " mov r1, #0x1e\n" " bl GetMonData\n" @@ -4350,11 +4350,11 @@ void debug_sub_8160E50() " mov r1, #0xb\n" " mov r2, #0x11\n" " mov r3, #0xc\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0xd\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r6, #0\n" " mov r1, #0x1f\n" " bl GetMonData\n" @@ -4372,11 +4372,11 @@ void debug_sub_8160E50() " mov r1, #0xd\n" " mov r2, #0x11\n" " mov r3, #0xe\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0xd\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r5, #0\n" " add r1, r4, #0\n" " mov r2, #0x0\n" @@ -4386,11 +4386,11 @@ void debug_sub_8160E50() " mov r1, #0xf\n" " mov r2, #0x11\n" " mov r3, #0x10\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0xd\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r6, #0\n" " mov r1, #0x20\n" " bl GetMonData\n" @@ -4403,11 +4403,11 @@ void debug_sub_8160E50() " mov r1, #0x11\n" " mov r2, #0x11\n" " mov r3, #0x12\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0xd\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5, r6}\n" " pop {r0}\n" " bx r0\n" @@ -4565,7 +4565,7 @@ void debug_sub_81610BC() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " bl CloseMenu\n" " mov r0, #0x1\n" "._518:\n" @@ -4584,7 +4584,7 @@ void DebugMenu_EffortValues() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " ldr r1, ._519\n" " mov r0, #0x0\n" " strb r0, [r1]\n" @@ -4689,52 +4689,52 @@ void debug_sub_81611D8() " mov r1, #0x0\n" " mov r2, #0xf\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._531\n" " mov r1, #0x2\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._531 + 4\n" " mov r1, #0x2\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._531 + 8\n" " mov r1, #0x2\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._531 + 12\n" " mov r1, #0x2\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._531 + 16\n" " mov r1, #0x2\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._531 + 20\n" " mov r1, #0xd\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r4, ._531 + 24\n" " add r0, r4, #0\n" " mov r1, #0xc\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0xc\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0xc\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0xc\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0xc\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xe\n" @@ -4778,7 +4778,7 @@ void debug_sub_8161290() " add r0, r4, #0\n" " mov r1, #0x8\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4}\n" " pop {r0}\n" " bx r0\n" @@ -4812,7 +4812,7 @@ void debug_sub_81612B8() " add r0, r5, #0\n" " mov r1, #0x8\n" " add r2, r4, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5}\n" " pop {r0}\n" " bx r0\n" @@ -4858,7 +4858,7 @@ void debug_sub_81612EC() " beq ._542 @cond_branch\n" " mov r0, #0x1\n" "._539:\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" "._565:\n" " mov r0, #0x0\n" " b ._543\n" @@ -4867,7 +4867,7 @@ void debug_sub_81612EC() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._544 @cond_branch\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " asr r4, r0, #0x18\n" " cmp r4, #0\n" @@ -4910,7 +4910,7 @@ void debug_sub_81612EC() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._552 @cond_branch\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " asr r4, r0, #0x18\n" " cmp r4, #0\n" @@ -4978,7 +4978,7 @@ void debug_sub_81612EC() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " bl CloseMenu\n" " mov r0, #0x1\n" "._543:\n" @@ -5007,7 +5007,7 @@ void DebugMenu_RandomNumberTest() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " bl debug_sub_81611D8\n" " ldr r1, ._566 + 16\n" " ldr r0, ._566 + 20\n" diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c index 2e739ef4d..f929170fd 100644 --- a/src/debug/nohara_debug_menu.c +++ b/src/debug/nohara_debug_menu.c @@ -11,17 +11,17 @@ void InitNoharaDebugMenu() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x13\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._1\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x12\n" @@ -53,7 +53,7 @@ void debug_sub_808F414() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -97,17 +97,17 @@ void NoharaDebugMenu_TV() " ldr r1, ._8\n" " mov r0, #0x0\n" " strb r0, [r1]\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xa\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._8 + 4\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x9\n" @@ -140,7 +140,7 @@ void debug_sub_808F4AC() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -356,7 +356,7 @@ void debug_sub_808F5D8() " add r0, r0, r8\n" " ldrb r2, [r0]\n" " add r0, r6, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" @@ -400,7 +400,7 @@ void debug_sub_808F648() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xd\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " ldr r0, ._35 + 4\n" " ldrb r1, [r0]\n" " mov r2, #0x1\n" @@ -478,7 +478,7 @@ void debug_sub_808F6BC() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0x0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" @@ -505,7 +505,7 @@ void debug_sub_808F6BC() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._47\n" "._49:\n" " .align 2, 0\n" @@ -521,7 +521,7 @@ void debug_sub_808F6BC() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0x6\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._47:\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" @@ -550,7 +550,7 @@ void debug_sub_808F6BC() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._52\n" "._54:\n" " .align 2, 0\n" @@ -566,7 +566,7 @@ void debug_sub_808F6BC() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0xc\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._52:\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" @@ -607,7 +607,7 @@ void debug_sub_808F7B4() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0x0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" @@ -634,7 +634,7 @@ void debug_sub_808F7B4() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._58\n" "._60:\n" " .align 2, 0\n" @@ -650,7 +650,7 @@ void debug_sub_808F7B4() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0x6\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._58:\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" @@ -679,7 +679,7 @@ void debug_sub_808F7B4() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._63\n" "._65:\n" " .align 2, 0\n" @@ -695,7 +695,7 @@ void debug_sub_808F7B4() " lsr r1, r1, #0x18\n" " add r0, r5, #0\n" " mov r2, #0xc\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._63:\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" @@ -745,17 +745,17 @@ void debug_sub_808F8CC() " mov r1, #0x6\n" " mov r2, #0x1a\n" " mov r3, #0x8\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r0, ._69 + 8\n" " ldr r0, [r0]\n" " mov r1, #0xe\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x16\n" " mov r1, #0x1\n" " mov r2, #0x18\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r4, ._69 + 12\n" " add r0, r4, #0\n" " mov r1, #0x0\n" @@ -765,7 +765,7 @@ void debug_sub_808F8CC() " add r0, r4, #0\n" " mov r1, #0x17\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._69 + 16\n" " ldr r0, ._69 + 20\n" " str r0, [r1]\n" @@ -878,7 +878,7 @@ void debug_sub_808F93C() " mov r1, #0x6\n" " mov r2, #0x1a\n" " mov r3, #0x8\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r1, ._83 + 12\n" " ldr r0, ._83 + 8\n" " ldrb r0, [r0]\n" @@ -887,12 +887,12 @@ void debug_sub_808F93C() " ldr r0, [r0]\n" " mov r1, #0xe\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x16\n" " mov r1, #0x1\n" " mov r2, #0x18\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r4, ._83 + 16\n" " ldr r0, ._83 + 4\n" " ldrb r1, [r0]\n" @@ -903,7 +903,7 @@ void debug_sub_808F93C() " add r0, r4, #0\n" " mov r1, #0x17\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._79:\n" " ldr r4, ._83\n" " ldrh r1, [r4, #0x2e]\n" @@ -1483,17 +1483,17 @@ void debug_sub_808FECC() " mov r1, #0x6\n" " mov r2, #0x17\n" " mov r3, #0x8\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r0, ._178 + 8\n" " ldr r0, [r0]\n" " mov r1, #0xe\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x16\n" " mov r1, #0x1\n" " mov r2, #0x18\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r4, ._178 + 12\n" " add r0, r4, #0\n" " mov r1, #0x0\n" @@ -1503,7 +1503,7 @@ void debug_sub_808FECC() " add r0, r4, #0\n" " mov r1, #0x17\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._178 + 16\n" " ldr r0, ._178 + 20\n" " str r0, [r1]\n" @@ -1616,7 +1616,7 @@ void debug_sub_808FF3C() " mov r1, #0x6\n" " mov r2, #0x17\n" " mov r3, #0x8\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r1, ._192 + 12\n" " ldr r0, ._192 + 8\n" " ldrb r0, [r0]\n" @@ -1625,12 +1625,12 @@ void debug_sub_808FF3C() " ldr r0, [r0]\n" " mov r1, #0xe\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x16\n" " mov r1, #0x1\n" " mov r2, #0x18\n" " mov r3, #0x2\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r4, ._192 + 16\n" " ldr r0, ._192 + 4\n" " ldrb r1, [r0]\n" @@ -1641,7 +1641,7 @@ void debug_sub_808FF3C() " add r0, r4, #0\n" " mov r1, #0x17\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._188:\n" " ldr r4, ._192\n" " ldrh r1, [r4, #0x2e]\n" @@ -1816,17 +1816,17 @@ void NoharaDebugMenu_Fan() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xb\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._204\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xa\n" @@ -1858,7 +1858,7 @@ void debug_sub_80901A4() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -1926,7 +1926,7 @@ void debug_sub_80901F8() " ldr r0, [r0]\n" " mov r1, #0xe\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._211 + 8\n" " ldr r0, ._211 + 12\n" " str r0, [r1]\n" @@ -1962,7 +1962,7 @@ void debug_sub_8090238() " ldr r0, [r0]\n" " mov r1, #0xe\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._213 + 8\n" " ldr r0, ._213 + 12\n" " str r0, [r1]\n" @@ -2026,7 +2026,7 @@ void debug_sub_809029C() " add r0, r4, #0\n" " mov r1, #0x10\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._219 + 12\n" " ldr r0, ._219 + 16\n" " str r0, [r1]\n" diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 28f3a26d1..6f9f0d02c 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -28,7 +28,7 @@ void debug_sub_8076AC8() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuZeroFillWindowRect\n" + " bl Menu_EraseWindowRect\n" " lsl r3, r4, #0x1\n" " add r3, r3, #0x1\n" " lsl r3, r3, #0x18\n" @@ -36,7 +36,7 @@ void debug_sub_8076AC8() " mov r0, #0x10\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" " ldr r3, ._3 + 8\n" @@ -101,15 +101,15 @@ void debug_sub_8076B68() " ldr r0, ._8\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._8 + 4\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._8 + 8\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x4\n" " mov r1, #0xb\n" " bl debug_sub_8077CF4\n" @@ -143,11 +143,11 @@ void debug_sub_8076BB4() " lsl r1, r1, #0x3\n" " ldr r0, ._13\n" " add r5, r1, r0\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r1, r0, #0x18\n" " lsl r4, r4, #0x18\n" @@ -500,11 +500,11 @@ void DebugMenu_8076D6C() " beq ._53 @cond_branch\n" " b ._64\n" "._49:\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._56\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._55\n" "._57:\n" " .align 2, 0\n" @@ -516,11 +516,11 @@ void DebugMenu_8076D6C() " and r1, r1, r2\n" " cmp r1, #0\n" " beq ._58 @cond_branch\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._60 + 4\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x49\n" " bl PlaySE\n" " bl RtcReset\n" @@ -615,11 +615,11 @@ void DebugMenu_8076E30() " beq ._75 @cond_branch\n" " b ._86\n" "._71:\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._78\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._77\n" "._79:\n" " .align 2, 0\n" @@ -631,12 +631,12 @@ void DebugMenu_8076E30() " and r1, r1, r2\n" " cmp r1, #0\n" " beq ._80 @cond_branch\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " bl sub_813B79C\n" " ldr r0, ._82 + 4\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x49\n" " bl PlaySE\n" "._77:\n" @@ -710,13 +710,13 @@ void DebugMenu_8076EF4() " mov r1, #0x0\n" " mov r2, #0xb\n" " mov r3, #0x11\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r4, ._93\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x8\n" " add r3, r4, #0\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r5, #0x0\n" " add r4, r4, #0x4\n" "._92:\n" @@ -769,11 +769,11 @@ void DebugMenu_8076F60() " push {r4, r5, lr}\n" " lsl r0, r0, #0x18\n" " lsr r5, r0, #0x18\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r2, r0, #0x18\n" " lsl r4, r4, #0x18\n" @@ -785,7 +785,7 @@ void DebugMenu_8076F60() " add r0, r0, #0x1\n" " cmp r4, r0\n" " bne ._96 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl debug_sub_8076B68\n" " add r0, r5, #0\n" " bl DestroyTask\n" @@ -971,7 +971,7 @@ void DebugMenu_807709C() " bl PlaySE\n" " mov r0, #0x1\n" " neg r0, r0\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._120 + 4\n" " strb r0, [r1]\n" "._115:\n" @@ -983,7 +983,7 @@ void DebugMenu_807709C() " mov r0, #0x5\n" " bl PlaySE\n" " mov r0, #0x1\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._120 + 4\n" " strb r0, [r1]\n" "._116:\n" @@ -1097,7 +1097,7 @@ void DebugMenu_807719C() " mov r1, #0x0\n" " mov r2, #0xe\n" " mov r3, #0x11\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._133\n" " ldr r0, ._133 + 4\n" " ldr r0, [r0]\n" @@ -1154,11 +1154,11 @@ void DebugMenu_80771EC() " mov r1, #0xc\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._135\n" " mov r1, #0x14\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4}\n" " pop {r0}\n" " bx r0\n" @@ -1281,7 +1281,7 @@ void DebugMenu_8077238() " mov r1, #0x10\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._139 + 12\n" " mov r1, #0x1d\n" " ldr r2, [sp, #0x14]\n" @@ -1289,7 +1289,7 @@ void DebugMenu_8077238() " lsl r1, r1, #0x18\n" " lsr r1, r1, #0x18\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add sp, sp, #0x18\n" " pop {r3, r4, r5}\n" " mov r8, r3\n" @@ -1489,7 +1489,7 @@ void DebugMenu_8077434() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " cmp r0, #0x4\n" @@ -1909,7 +1909,7 @@ void DebugMenu_EditPKMN() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl debug_sub_815FFDC\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -1940,7 +1940,7 @@ void DebugMenu_80776B4() " mov r0, #0x19\n" " add r1, r5, #0\n" " mov r2, #0x1d\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r0, ._183 + 4\n" " ldrb r0, [r0]\n" " ASR r0, r4\n" @@ -1950,7 +1950,7 @@ void DebugMenu_80776B4() " add r0, r0, sp\n" " mov r1, #0x19\n" " add r2, r5, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add sp, sp, #0x8\n" " pop {r4, r5}\n" " pop {r0}\n" @@ -1978,11 +1978,11 @@ void DebugMenu_8077704() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x8\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " mov r0, sp\n" " mov r1, #0x15\n" " mov r2, #0x0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r2, ._185 + 4\n" " mov r0, #0x80\n" " lsl r0, r0, #0x13\n" @@ -2027,7 +2027,7 @@ void DebugMenu_8077760() " bl PlaySE\n" " mov r0, #0x1\n" " neg r0, r0\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._190 + 4\n" " ldrb r0, [r1]\n" " cmp r0, #0\n" @@ -2052,7 +2052,7 @@ void DebugMenu_8077760() " mov r0, #0x5\n" " bl PlaySE\n" " mov r0, #0x1\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._195\n" " ldrb r0, [r1]\n" " cmp r0, #0x3\n" @@ -2076,7 +2076,7 @@ void DebugMenu_8077760() " mov r0, #0x5\n" " bl PlaySE\n" " ldr r4, ._201\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " mov r1, #0x1\n" @@ -2084,7 +2084,7 @@ void DebugMenu_8077760() " ldrb r0, [r4]\n" " eor r1, r1, r0\n" " strb r1, [r4]\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " bl DebugMenu_80776B4\n" @@ -2133,7 +2133,7 @@ void DebugMenu_SwitchBG() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl DebugMenu_8077704\n" " mov r0, #0x0\n" " str r0, [sp]\n" @@ -2177,13 +2177,13 @@ void DebugMenu_807786C() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x3\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " lsl r0, r4, #0x1\n" " add r0, r0, r4\n" " add r0, r0, sp\n" " mov r1, #0x1a\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add sp, sp, #0x8\n" " pop {r4}\n" " pop {r0}\n" @@ -2250,7 +2250,7 @@ void DebugMenu_ControlEncounter() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._213\n" " ldrb r0, [r0]\n" " bl DebugMenu_807786C\n" @@ -2345,7 +2345,7 @@ void DebugMenu_8077974() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r1, ._226\n" " mov r0, #0x4\n" " ldsb r0, [r1, r0]\n" @@ -2494,7 +2494,7 @@ void DebugMenu_RematchTrainers() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._240\n" " mov r1, #0xd\n" " mov r2, #0x5\n" @@ -2602,7 +2602,7 @@ void DebugMenu_8077B00() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl unref_sub_80C853C\n" " cmp r0, #0\n" " beq ._250 @cond_branch\n" @@ -2660,7 +2660,7 @@ void DebugMenu_Safari() " bl GetSafariZoneFlag\n" " cmp r0, #0\n" " beq ._258 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._260\n" " mov r1, #0xe\n" " mov r2, #0x5\n" @@ -2803,7 +2803,7 @@ void DebugMenu_8077C14() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._264\n" " mov r1, #0xa\n" " mov r2, #0x9\n" @@ -2945,7 +2945,7 @@ void debug_sub_8077CF4() " add r0, r6, #0\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5, r6}\n" " pop {r0}\n" " bx r0\n" @@ -2971,7 +2971,7 @@ void DebugMenu_8077D24() " lsr r4, r4, #0x18\n" " lsl r5, r5, #0x18\n" " lsr r5, r5, #0x18\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " lsl r3, r5, #0x1\n" " add r3, r3, #0x1\n" " lsl r3, r3, #0x18\n" @@ -2979,12 +2979,12 @@ void DebugMenu_8077D24() " mov r0, #0x0\n" " mov r1, #0x0\n" " add r2, r4, #0\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " add r2, r5, #0\n" " add r3, r6, #0\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " sub r4, r4, #0x1\n" @@ -3009,7 +3009,7 @@ void DebugMenu_8077D78() asm( " push {r4, r5, lr}\n" " add r5, r0, #0\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r4, r0, #0x18\n" " mov r0, #0x2\n" @@ -3019,7 +3019,7 @@ void DebugMenu_8077D78() " add r0, r0, #0x1\n" " cmp r4, r0\n" " beq ._276 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._278\n" " lsl r1, r4, #0x3\n" " add r1, r1, r5\n" @@ -3216,7 +3216,7 @@ void DebugMenu_8077EAC() " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r1, ._303 + 4\n" " lsl r0, r4, #0x2\n" " add r0, r0, r4\n" @@ -3252,7 +3252,7 @@ void DebugMenu_8077EE0() " mov r1, #0x11\n" " mov r2, #0x16\n" " mov r3, #0x12\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r5, ._305\n" " add r0, r5, #0\n" " add r1, r4, #0\n" @@ -3262,12 +3262,12 @@ void DebugMenu_8077EE0() " add r0, r5, #0\n" " mov r1, #0x4\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " bl ItemId_GetItem\n" " mov r1, #0x8\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r5, #0\n" " add r1, r6, #0\n" " mov r2, #0x1\n" @@ -3276,7 +3276,7 @@ void DebugMenu_8077EE0() " add r0, r5, #0\n" " mov r1, #0x12\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5, r6}\n" " pop {r0}\n" " bx r0\n" @@ -3300,11 +3300,11 @@ void DebugMenu_8077F40() " lsl r4, r4, #0x3\n" " ldr r0, ._307\n" " add r4, r4, r0\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._307 + 4\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldrh r0, [r4, #0xa]\n" " ldrh r1, [r4, #0xc]\n" " bl DebugMenu_8077EE0\n" @@ -3341,11 +3341,11 @@ void DebugMenu_8077F7C() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._309 @cond_branch\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._311 + 8\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldrh r0, [r4, #0xa]\n" " ldrh r1, [r4, #0xc]\n" " bl DebugMenu_8077EE0\n" @@ -3466,7 +3466,7 @@ void DebugMenu_807806C() " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ScriptContext2_Disable\n" " add r0, r4, #0\n" " bl DestroyTask\n" @@ -3493,16 +3493,16 @@ void DebugMenu_807808C() " lsl r1, r4, #0x5\n" " ldr r0, ._331\n" " add r5, r1, r0\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x13\n" " mov r3, #0x11\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._331 + 4\n" " mov r1, #0x2\n" " mov r2, #0x2\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, sp\n" " add r1, r4, #0\n" " mov r2, #0x1\n" @@ -3511,7 +3511,7 @@ void DebugMenu_807808C() " mov r0, sp\n" " mov r1, #0xb\n" " mov r2, #0x2\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldrh r1, [r5, #0x8]\n" " mov r0, sp\n" " mov r2, #0x1\n" @@ -3520,7 +3520,7 @@ void DebugMenu_807808C() " mov r0, sp\n" " mov r1, #0xb\n" " mov r2, #0x4\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r4, r5, #0\n" " add r4, r4, #0xb\n" " add r0, r4, #0\n" @@ -3532,7 +3532,7 @@ void DebugMenu_807808C() " add r0, r4, #0\n" " mov r1, #0xb\n" " mov r2, #0x6\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._330\n" "._332:\n" " .align 2, 0\n" @@ -3543,7 +3543,7 @@ void DebugMenu_807808C() " ldr r0, ._335\n" " mov r1, #0xb\n" " mov r2, #0x6\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._330:\n" " add r4, r5, #0\n" " add r4, r4, #0x16\n" @@ -3556,7 +3556,7 @@ void DebugMenu_807808C() " add r0, r4, #0\n" " mov r1, #0xb\n" " mov r2, #0x8\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._334\n" "._336:\n" " .align 2, 0\n" @@ -3566,7 +3566,7 @@ void DebugMenu_807808C() " ldr r0, ._337\n" " mov r1, #0xb\n" " mov r2, #0x8\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._334:\n" " ldrb r1, [r5, #0xa]\n" " mov r0, sp\n" @@ -3576,7 +3576,7 @@ void DebugMenu_807808C() " mov r0, sp\n" " mov r1, #0xb\n" " mov r2, #0xa\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, [r5]\n" " mov r0, sp\n" " mov r2, #0x2\n" @@ -3585,7 +3585,7 @@ void DebugMenu_807808C() " mov r0, sp\n" " mov r1, #0xb\n" " mov r2, #0xc\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add sp, sp, #0xc\n" " pop {r4, r5}\n" " pop {r0}\n" @@ -3611,7 +3611,7 @@ void DebugMenu_807817C() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._339 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " add r0, r4, #0\n" " bl DestroyTask\n" " bl ScriptContext2_Disable\n" @@ -3685,7 +3685,7 @@ void DebugMenu_80781A8() " mov r1, #0x11\n" " mov r2, #0x16\n" " mov r3, #0x12\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r4, ._351\n" " mov r2, #0x8\n" " ldsh r1, [r5, r2]\n" @@ -3696,7 +3696,7 @@ void DebugMenu_80781A8() " add r0, r4, #0\n" " mov r1, #0x4\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._350:\n" " pop {r4, r5}\n" " pop {r0}\n" @@ -3904,7 +3904,7 @@ void DebugMenu_8078310() " cmp r0, #0\n" " beq ._373 @cond_branch\n" "._370:\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " add r0, r5, #0\n" " bl DestroyTask\n" " bl ScriptContext2_Disable\n" @@ -4020,7 +4020,7 @@ void DebugMenu_ToggleClearFlag() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._390\n" " bl FlagGet\n" " mov r1, #0x1\n" @@ -4099,7 +4099,7 @@ void DebugMenu_OpenWeatherEvents() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._404\n" " bl FlagGet\n" " mov r1, #0x0\n" @@ -4170,7 +4170,7 @@ void DebugMenu_OpenMysteryEvent() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl IsMysteryGiftEnabled\n" " mov r1, #0x0\n" " cmp r0, #0\n" @@ -4271,11 +4271,11 @@ void DebugMenu_8078550() " mov r3, #0x2\n" " bl ConvertIntToDecimalStringN\n" "._423:\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._426 + 4\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5, r6, r7}\n" " pop {r0}\n" " bx r0\n" @@ -4379,7 +4379,7 @@ void DebugMenu_807860C() " bl DebugMenu_8078550\n" " b ._447\n" "._434:\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ScriptContext2_Disable\n" " add r0, r5, #0\n" " bl DestroyTask\n" @@ -4589,7 +4589,7 @@ void DebugMenu_OpenLegendsRecord() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._464\n" " mov r1, #0xc\n" " mov r2, #0x3\n" @@ -4710,13 +4710,13 @@ void DebugMenu_8078880() " beq ._474 @cond_branch\n" " b ._480\n" "._470:\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " b ._476\n" "._468:\n" " ldr r0, ._478\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._476:\n" " ldrh r0, [r4, #0x8]\n" " add r0, r0, #0x1\n" @@ -4733,7 +4733,7 @@ void DebugMenu_8078880() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._480 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ScriptContext2_Disable\n" " add r0, r5, #0\n" " bl DestroyTask\n" @@ -4788,11 +4788,11 @@ void DebugMenu_OpenBerryInfo() " mov r1, #0x0\n" " mov r2, #0x13\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " add r0, r4, #0\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._487\n" " ldr r0, ._487 + 4\n" " str r0, [r1]\n" @@ -4815,11 +4815,11 @@ void DebugMenu_8078950() { asm( " push {lr}\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._489\n" " mov r1, #0x4\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r0}\n" " bx r0\n" "._490:\n" @@ -4858,7 +4858,7 @@ void DebugMenu_8078968() " ldr r0, ._495\n" " mov r1, #0x4\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r0}\n" " bx r0\n" "._496:\n" @@ -4885,7 +4885,7 @@ void DebugMenu_80789A4() " add r0, r4, #0\n" " mov r1, #0x9\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4}\n" " pop {r0}\n" " bx r0\n" @@ -5112,7 +5112,7 @@ void DebugMenu_8078B38() " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ScriptContext2_Disable\n" " add r0, r4, #0\n" " bl DestroyTask\n" @@ -5250,7 +5250,7 @@ void DebugMenu_8078BD4() " beq ._539 @cond_branch\n" " mov r0, #0x49\n" " bl PlaySE\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " add r0, r5, #0\n" " bl DestroyTask\n" " bl ScriptContext2_Disable\n" @@ -5265,7 +5265,7 @@ void DebugMenu_8078BD4() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._543 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " add r0, r5, #0\n" " bl DestroyTask\n" " bl ScriptContext2_Disable\n" @@ -5314,11 +5314,11 @@ void DebugMenu_8078C80() { asm( " push {lr}\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._548\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._548 + 4\n" " ldr r0, ._548 + 8\n" " str r0, [r1]\n" @@ -5465,11 +5465,11 @@ void DebugMenu_8078D7C() { asm( " push {lr}\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._565\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._565 + 4\n" " ldr r0, ._565 + 8\n" " str r0, [r1]\n" @@ -5518,7 +5518,7 @@ void DebugMenu_MeTooBackupMan() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " ldr r0, ._571\n" " mov r1, #0xc\n" " mov r2, #0x2\n" @@ -5655,7 +5655,7 @@ void DebugMenu_8078E80() " mov r1, #0xf\n" " mov r2, #0x16\n" " mov r3, #0x10\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r1, ._581\n" " mov r2, #0x0\n" " ldsh r0, [r4, r2]\n" @@ -5692,7 +5692,7 @@ void DebugMenu_8078EB0() " add r0, r4, #0\n" " mov r1, #0x2\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xf0\n" " mov r1, #0x5\n" " mov r2, #0x11\n" @@ -5706,7 +5706,7 @@ void DebugMenu_8078EB0() " add r0, r4, #0\n" " mov r1, #0x6\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xf0\n" " mov r1, #0x8\n" " mov r2, #0x11\n" @@ -5720,7 +5720,7 @@ void DebugMenu_8078EB0() " add r0, r4, #0\n" " mov r1, #0x9\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5}\n" " pop {r0}\n" " bx r0\n" @@ -5753,7 +5753,7 @@ void DebugMenu_8078F1C() " strh r0, [r5, #0x4]\n" " ldrb r0, [r1, #0x11]\n" " strh r0, [r5, #0x6]\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " add r0, r5, #0\n" " bl DebugMenu_8078EB0\n" " add r0, r5, #0\n" @@ -5888,7 +5888,7 @@ void DebugMenu_8079020() " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ScriptContext2_Disable\n" " add r0, r4, #0\n" " bl DestroyTask\n" @@ -5952,7 +5952,7 @@ void DebugMenu_8079058() "._608:\n" " ldr r0, ._615\n" " str r1, [r0]\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " b ._614\n" "._616:\n" " .align 2, 0\n" @@ -5962,7 +5962,7 @@ void DebugMenu_8079058() " ldr r0, ._618\n" " mov r1, #0x4\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x14\n" " mov r1, #0x8\n" " mov r2, #0x1\n" @@ -5998,7 +5998,7 @@ void DebugMenu_8079058() " mov r0, #0x0\n" "._622:\n" " str r0, [r1]\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ScriptContext2_Disable\n" " add r0, r5, #0\n" " bl DestroyTask\n" @@ -6065,7 +6065,7 @@ void DebugMenu_8079110() " beq ._635 @cond_branch\n" " b ._642\n" "._631:\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " b ._637\n" "._629:\n" " ldr r0, ._639\n" @@ -6092,7 +6092,7 @@ void DebugMenu_8079110() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._642 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ScriptContext2_Disable\n" " add r0, r5, #0\n" " bl DestroyTask\n" diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c index c20d9b87c..ce1cc47ee 100644 --- a/src/debug/taya_debug_window.c +++ b/src/debug/taya_debug_window.c @@ -13,12 +13,12 @@ void TayaDebugMenu_Trend() " mov r5, r8\n" " push {r5, r6, r7}\n" " add sp, sp, #0xffffffd8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1e\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r5, ._3\n" " mov r7, #0x0\n" " mov r0, #0x1\n" @@ -89,7 +89,7 @@ void TayaDebugMenu_Trend() " lsr r2, r2, #0x18\n" " mov r0, sp\n" " mov r1, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r5, r5, #0x8\n" " add r0, r7, #1\n" " lsl r0, r0, #0x10\n" @@ -136,7 +136,7 @@ void debug_sub_8090808() "._7:\n" " .word gMain\n" "._5:\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl CloseMenu\n" " mov r0, #0x1\n" "._6:\n" @@ -179,7 +179,7 @@ void TayaDebugMenu_TrendR() " lsr r0, r0, #0x10\n" " cmp r0, #0x4\n" " bls ._10 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl CloseMenu\n" " mov r0, #0x1\n" " pop {r4, r5, r6, r7}\n" @@ -219,7 +219,7 @@ void debug_sub_809089C() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -303,12 +303,12 @@ void TayaDebugMenu_SimpleText() " mov r1, #0x0\n" " mov r2, #0xc\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._32\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xb\n" @@ -340,7 +340,7 @@ void debug_sub_8090984() { asm( " push {r4, r5, r6, r7, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r2, r0, #0x18\n" " asr r1, r2, #0x18\n" " mov r0, #0x2\n" @@ -432,12 +432,12 @@ void TayaDebugMenu_OldMan() " mov r1, #0x0\n" " mov r2, #0xa\n" " mov r3, #0x11\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._48\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x8\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " bl GetCurrentMauvilleOldMan\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -471,7 +471,7 @@ void TayaDebugMenu_LanettesPC() { asm( " push {lr}\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ShowPokemonStorageSystem\n" " mov r0, #0x1\n" " pop {r1}\n" @@ -658,7 +658,7 @@ void debug_sub_8090C44() " add r0, r4, #0\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0x0\n" " mov r2, #0x5\n" @@ -670,7 +670,7 @@ void debug_sub_8090C44() " add r0, r4, #0\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4, r5}\n" " pop {r0}\n" " bx r0\n" @@ -874,7 +874,7 @@ void TayaDebugMenu_PKMNLottery() " mov r1, #0x0\n" " mov r2, #0x6\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " bl RetrieveLotteryNumber\n" " ldr r2, ._83\n" " ldr r0, ._83 + 4\n" @@ -979,7 +979,7 @@ void TayaDebugMenu_PokenavD() " mov r5, r8\n" " push {r5, r6, r7}\n" " add sp, sp, #0xffffffe4\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " mov r0, #0x0\n" " mov sl, r0\n" " mov r6, #0x1\n" @@ -999,7 +999,7 @@ void TayaDebugMenu_PokenavD() " add r0, r4, #0\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " mov r8, r0\n" " str r5, [sp, #0x14]\n" @@ -1299,7 +1299,7 @@ void TayaDebugMenu_8091190() asm( " push {r4, r5, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r3, r0, #0x18\n" " mov r0, #0x2\n" @@ -1370,12 +1370,12 @@ void TayaDebugMenu_8091190() " ldrsb r1, [r5, r1]\n" " cmp r0, r1\n" " beq ._106 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xb\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r4, ._107 + 8\n" " mov r0, #0x0\n" " ldrsb r0, [r5, r0]\n" @@ -1385,7 +1385,7 @@ void TayaDebugMenu_8091190() " ldr r3, [r0]\n" " mov r0, #0x1\n" " mov r1, #0x1\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " ldrsb r0, [r5, r0]\n" " lsl r0, r0, #0x3\n" @@ -1427,18 +1427,18 @@ void InitTayaDebugWindow() " ldr r1, ._109\n" " mov r0, #0x0\n" " strb r0, [r1]\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xb\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._109 + 4\n" " ldr r3, [r0]\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xa\n" @@ -1944,29 +1944,29 @@ void debug_sub_80915BC() " bls ._171 @cond_branch\n" " ldr r4, ._172\n" " add r0, r4, #0\n" - " bl SetUpWindowConfig\n" + " bl Text_LoadWindowTemplate\n" " add r0, r4, #0\n" " bl InitMenuWindow\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x3\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._172 + 4\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " mov r1, #0x4\n" " mov r2, #0x1d\n" " mov r3, #0x11\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x0\n" " mov r1, #0x12\n" " mov r2, #0x1d\n" " mov r3, #0x15\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r1, #0x80\n" " lsl r1, r1, #0x13\n" " mov r2, #0x8a\n" @@ -2096,7 +2096,7 @@ void debug_sub_80916AC() " add r0, r7, #0\n" " add r0, r0, #0x12\n" " mov r1, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, [sp]\n" " lsl r0, r1, #0x18\n" " lsr r6, r0, #0x18\n" diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index eb2fd8a7e..cc2bdd80e 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -36,17 +36,17 @@ void debug_sub_808B874() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xd\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._1\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " ldr r0, ._1 + 4\n" " ldrb r0, [r0]\n" " str r0, [sp]\n" @@ -90,7 +90,7 @@ void debug_sub_808B8C8() " bl PlaySE\n" " mov r0, #0x1\n" " neg r0, r0\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._7 + 4\n" " strb r0, [r1]\n" "._3:\n" @@ -102,7 +102,7 @@ void debug_sub_808B8C8() " mov r0, #0x5\n" " bl PlaySE\n" " mov r0, #0x1\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._7 + 4\n" " strb r0, [r1]\n" "._4:\n" @@ -154,21 +154,21 @@ void TomomichiDebugMenu_ContestGraphics() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x14\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._11\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r3, ._11 + 4\n" " mov r0, #0x2\n" " mov r1, #0x3\n" " mov r2, #0x4\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x13\n" @@ -218,21 +218,21 @@ void TomomichiDebugMenu_ArtMusGraphics() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x14\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._13\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r3, ._13 + 4\n" " mov r0, #0x2\n" " mov r1, #0x3\n" " mov r2, #0x4\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x13\n" @@ -282,21 +282,21 @@ void TomomichiDebugMenu_PreviewData() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x14\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._15\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r3, ._15 + 4\n" " mov r0, #0x2\n" " mov r1, #0x3\n" " mov r2, #0x4\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x13\n" @@ -346,21 +346,21 @@ void TomomichiDebugMenu_TrickHouse() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._17\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r3, ._17 + 4\n" " mov r0, #0x2\n" " mov r1, #0x3\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " ldr r0, ._17 + 8\n" " ldrb r0, [r0]\n" " str r0, [sp]\n" @@ -396,17 +396,17 @@ void TomomichiDebugMenu_ControlEvents() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._19\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " ldr r0, ._19 + 4\n" " ldrb r0, [r0]\n" " str r0, [sp]\n" @@ -441,17 +441,17 @@ void TomomichiDebugMenu_ControlFlags() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._21\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " ldr r0, ._21 + 4\n" " ldrb r0, [r0]\n" " str r0, [sp]\n" @@ -486,17 +486,17 @@ void TomomichiDebugMenu_ControlWorks() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._23\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x6\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " ldr r0, ._23 + 4\n" " ldrb r0, [r0]\n" " str r0, [sp]\n" @@ -530,10 +530,10 @@ void debug_sub_808BC48() { asm( " push {r4, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " asr r0, r0, #0x18\n" " cmp r0, #0x1\n" @@ -598,10 +598,10 @@ void debug_sub_808BCBC() { asm( " push {r4, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " asr r0, r0, #0x18\n" " cmp r0, #0x1\n" @@ -666,10 +666,10 @@ void debug_sub_808BD30() { asm( " push {r4, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " asr r0, r0, #0x18\n" " cmp r0, #0x1\n" @@ -744,7 +744,7 @@ void debug_sub_808BDA4() " bl PlaySE\n" " mov r0, #0x1\n" " neg r0, r0\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._71 + 4\n" " strb r0, [r1]\n" "._67:\n" @@ -756,7 +756,7 @@ void debug_sub_808BDA4() " mov r0, #0x5\n" " bl PlaySE\n" " mov r0, #0x1\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._71 + 4\n" " strb r0, [r1]\n" "._68:\n" @@ -817,7 +817,7 @@ void debug_sub_808BE2C() " bl PlaySE\n" " mov r0, #0x1\n" " neg r0, r0\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._79 + 4\n" " strb r0, [r1]\n" "._75:\n" @@ -829,7 +829,7 @@ void debug_sub_808BE2C() " mov r0, #0x5\n" " bl PlaySE\n" " mov r0, #0x1\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._79 + 4\n" " strb r0, [r1]\n" "._76:\n" @@ -890,7 +890,7 @@ void debug_sub_808BEB4() " bl PlaySE\n" " mov r0, #0x1\n" " neg r0, r0\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._87 + 4\n" " strb r0, [r1]\n" "._83:\n" @@ -902,7 +902,7 @@ void debug_sub_808BEB4() " mov r0, #0x5\n" " bl PlaySE\n" " mov r0, #0x1\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._87 + 4\n" " strb r0, [r1]\n" "._84:\n" @@ -963,7 +963,7 @@ void debug_sub_808BF3C() " bl PlaySE\n" " mov r0, #0x1\n" " neg r0, r0\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._95 + 4\n" " strb r0, [r1]\n" "._91:\n" @@ -975,7 +975,7 @@ void debug_sub_808BF3C() " mov r0, #0x5\n" " bl PlaySE\n" " mov r0, #0x1\n" - " bl MoveMenuCursor\n" + " bl Menu_MoveCursor\n" " ldr r1, ._95 + 4\n" " strb r0, [r1]\n" "._92:\n" @@ -1027,17 +1027,17 @@ void debug_sub_808BFC4() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._99\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -1070,17 +1070,17 @@ void debug_sub_808C014() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._101\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x6\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -1112,7 +1112,7 @@ void debug_sub_808C064() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -1155,7 +1155,7 @@ void debug_sub_808C0A8() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -1610,17 +1610,17 @@ void debug_sub_808C31C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._157\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -1652,7 +1652,7 @@ void debug_sub_808C36C() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -1696,17 +1696,17 @@ void debug_sub_808C3B0() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._165\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -1743,17 +1743,17 @@ void debug_sub_808C408() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._167\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -1790,17 +1790,17 @@ void debug_sub_808C460() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._169\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -1837,17 +1837,17 @@ void debug_sub_808C4B8() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._171\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -1884,17 +1884,17 @@ void debug_sub_808C510() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._173\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -1931,17 +1931,17 @@ void debug_sub_808C568() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._175\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -1978,17 +1978,17 @@ void debug_sub_808C5C0() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._177\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2025,17 +2025,17 @@ void debug_sub_808C618() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._179\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2072,17 +2072,17 @@ void debug_sub_808C670() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._181\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2118,11 +2118,11 @@ void debug_sub_808C6C8() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._186\n" " ldrb r0, [r5]\n" @@ -2270,17 +2270,17 @@ void debug_sub_808C7C8() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._197\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -2312,7 +2312,7 @@ void debug_sub_808C818() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -2356,17 +2356,17 @@ void debug_sub_808C85C() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._205\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -2403,17 +2403,17 @@ void debug_sub_808C8B4() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._207\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2450,17 +2450,17 @@ void debug_sub_808C90C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._209\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2497,17 +2497,17 @@ void debug_sub_808C964() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._211\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2544,17 +2544,17 @@ void debug_sub_808C9BC() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._213\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x6\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2591,17 +2591,17 @@ void debug_sub_808CA14() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._215\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2638,17 +2638,17 @@ void debug_sub_808CA6C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._217\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2685,17 +2685,17 @@ void debug_sub_808CAC4() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._219\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -2732,17 +2732,17 @@ void debug_sub_808CB1C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._221\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -2778,11 +2778,11 @@ void debug_sub_808CB74() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._226\n" " ldrb r0, [r5]\n" @@ -2930,17 +2930,17 @@ void debug_sub_808CC74() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._237\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -2972,7 +2972,7 @@ void debug_sub_808CCC4() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -3016,17 +3016,17 @@ void debug_sub_808CD08() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x11\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._245\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x8\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -3063,17 +3063,17 @@ void debug_sub_808CD60() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x9\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._247\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x4\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3110,17 +3110,17 @@ void debug_sub_808CDB8() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x3\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._249\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3156,11 +3156,11 @@ void debug_sub_808CE10() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._254\n" " ldrb r0, [r5]\n" @@ -3308,17 +3308,17 @@ void debug_sub_808CF10() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._265\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -3350,7 +3350,7 @@ void debug_sub_808CF60() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -3394,17 +3394,17 @@ void debug_sub_808CFA4() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x11\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._273\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x8\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -3441,17 +3441,17 @@ void debug_sub_808CFFC() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._275\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3488,17 +3488,17 @@ void debug_sub_808D054() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._277\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3535,17 +3535,17 @@ void debug_sub_808D0AC() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x9\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._279\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x4\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3582,17 +3582,17 @@ void debug_sub_808D104() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._281\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3629,17 +3629,17 @@ void debug_sub_808D15C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._283\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3676,17 +3676,17 @@ void debug_sub_808D1B4() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._285\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3723,17 +3723,17 @@ void debug_sub_808D20C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._287\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3770,17 +3770,17 @@ void debug_sub_808D264() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._289\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x5\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -3816,11 +3816,11 @@ void debug_sub_808D2BC() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._294\n" " ldrb r0, [r5]\n" @@ -3968,17 +3968,17 @@ void debug_sub_808D3BC() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._305\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -4010,7 +4010,7 @@ void debug_sub_808D40C() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -4054,17 +4054,17 @@ void debug_sub_808D450() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._313\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -4101,17 +4101,17 @@ void debug_sub_808D4A8() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._315\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -4147,11 +4147,11 @@ void debug_sub_808D500() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._320\n" " ldrb r0, [r5]\n" @@ -4299,17 +4299,17 @@ void debug_sub_808D600() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._331\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -4341,7 +4341,7 @@ void debug_sub_808D650() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -4385,17 +4385,17 @@ void debug_sub_808D694() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._339\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -4432,17 +4432,17 @@ void debug_sub_808D6EC() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._341\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -4478,11 +4478,11 @@ void debug_sub_808D744() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._346\n" " ldrb r0, [r5]\n" @@ -4630,17 +4630,17 @@ void debug_sub_808D844() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1c\n" " mov r3, #0x3\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._357\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1b\n" @@ -4672,7 +4672,7 @@ void debug_sub_808D894() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r3, r0, #0x18\n" " mov r0, #0x2\n" @@ -4715,17 +4715,17 @@ void debug_sub_808D8D8() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._365\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -4761,11 +4761,11 @@ void debug_sub_808D930() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._370\n" " ldrb r0, [r5]\n" @@ -4913,17 +4913,17 @@ void debug_sub_808DA30() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x3\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._381\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -4955,11 +4955,11 @@ void debug_sub_808DA80() { asm( " push {r4, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " bl debug_sub_808DAD4\n" " bl debug_sub_808DABC\n" " lsl r4, r4, #0x18\n" @@ -5054,17 +5054,17 @@ void debug_sub_808DB0C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._395\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x17\n" @@ -5096,7 +5096,7 @@ void debug_sub_808DB5C() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -5140,17 +5140,17 @@ void debug_sub_808DBA0() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x11\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._403\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x8\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -5187,17 +5187,17 @@ void debug_sub_808DBF8() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._405\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5234,17 +5234,17 @@ void debug_sub_808DC50() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._407\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5281,17 +5281,17 @@ void debug_sub_808DCA8() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._409\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5328,17 +5328,17 @@ void debug_sub_808DD00() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._411\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5375,17 +5375,17 @@ void debug_sub_808DD58() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._413\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5422,17 +5422,17 @@ void debug_sub_808DDB0() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._415\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x6\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5469,17 +5469,17 @@ void debug_sub_808DE08() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._417\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5516,17 +5516,17 @@ void debug_sub_808DE60() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._419\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5562,11 +5562,11 @@ void debug_sub_808DEB8() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._424\n" " ldrb r0, [r5]\n" @@ -5723,17 +5723,17 @@ void debug_sub_808DFC0() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._437\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x6\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x17\n" @@ -5765,7 +5765,7 @@ void debug_sub_808E010() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -5809,17 +5809,17 @@ void debug_sub_808E054() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._445\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x6\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -5856,17 +5856,17 @@ void debug_sub_808E0AC() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._447\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x5\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5903,17 +5903,17 @@ void debug_sub_808E104() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._449\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5950,17 +5950,17 @@ void debug_sub_808E15C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._451\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -5997,17 +5997,17 @@ void debug_sub_808E1B4() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._453\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -6044,17 +6044,17 @@ void debug_sub_808E20C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._455\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x6\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -6090,11 +6090,11 @@ void debug_sub_808E264() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._460\n" " ldrb r0, [r5]\n" @@ -6251,17 +6251,17 @@ void debug_sub_808E36C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._473\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x5\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x17\n" @@ -6293,7 +6293,7 @@ void debug_sub_808E3BC() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -6337,17 +6337,17 @@ void debug_sub_808E400() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._481\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -6384,17 +6384,17 @@ void debug_sub_808E458() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._483\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -6431,17 +6431,17 @@ void debug_sub_808E4B0() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._485\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x6\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -6478,17 +6478,17 @@ void debug_sub_808E508() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._487\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -6525,17 +6525,17 @@ void debug_sub_808E560() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._489\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x5\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -6571,11 +6571,11 @@ void debug_sub_808E5B8() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._494\n" " ldrb r0, [r5]\n" @@ -6732,17 +6732,17 @@ void debug_sub_808E6C0() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._507\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x17\n" @@ -6774,7 +6774,7 @@ void debug_sub_808E710() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -6818,17 +6818,17 @@ void debug_sub_808E754() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._515\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -6865,17 +6865,17 @@ void debug_sub_808E7AC() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._517\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -6911,11 +6911,11 @@ void debug_sub_808E804() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._522\n" " ldrb r0, [r5]\n" @@ -7072,17 +7072,17 @@ void debug_sub_808E90C() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._535\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x2\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x17\n" @@ -7114,7 +7114,7 @@ void debug_sub_808E95C() { asm( " push {lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -7158,17 +7158,17 @@ void debug_sub_808E9A0() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._543\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r4, #0x0\n" " str r4, [sp]\n" " mov r0, #0x1c\n" @@ -7205,17 +7205,17 @@ void debug_sub_808E9F8() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r3, ._545\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x1c\n" @@ -7251,11 +7251,11 @@ void debug_sub_808EA50() { asm( " push {r4, r5, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " add r1, r0, #0\n" " ldr r5, ._550\n" " ldrb r0, [r5]\n" @@ -7412,21 +7412,21 @@ void debug_sub_808EB58() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xc\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._563\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r3, ._563 + 4\n" " mov r0, #0x2\n" " mov r1, #0x3\n" " mov r2, #0x8\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xb\n" @@ -7460,21 +7460,21 @@ void debug_sub_808EBB4() asm( " push {lr}\n" " add sp, sp, #0xfffffff8\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xd\n" " mov r3, #0xd\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._565\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r3, ._565 + 4\n" " mov r0, #0x2\n" " mov r1, #0x3\n" " mov r2, #0x5\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xc\n" @@ -7507,11 +7507,11 @@ void debug_sub_808EC10() { asm( " push {r4, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r2, r0, #0x18\n" " lsl r4, r4, #0x18\n" @@ -7553,11 +7553,11 @@ void debug_sub_808EC5C() { asm( " push {r4, lr}\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl GetMenuCursorPos\n" + " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r1, r0, #0x18\n" " lsl r4, r4, #0x18\n" @@ -8127,7 +8127,7 @@ void debug_sub_808EF8C() " strb r1, [r0, #0x8]\n" " mov r1, #0xc\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._653:\n" " mov r3, #0x0\n" " ldr r7, ._666\n" @@ -8189,7 +8189,7 @@ void debug_sub_808EF8C() " add r0, r7, #0\n" " mov r1, #0x8\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._665\n" "._667:\n" " .align 2, 0\n" @@ -8201,7 +8201,7 @@ void debug_sub_808EF8C() " ldr r0, ._672\n" " mov r1, #0xc\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._665:\n" " ldr r5, ._672\n" " mov r0, #0xff\n" @@ -8229,7 +8229,7 @@ void debug_sub_808EF8C() " add r0, r5, #0\n" " mov r1, #0xc\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " cmp r6, #0x1\n" " beq ._668 @cond_branch\n" " cmp r6, #0x1\n" @@ -8278,7 +8278,7 @@ void debug_sub_808EF8C() " add r0, r5, #0\n" " mov r1, #0xc\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._679\n" "._681:\n" " .align 2, 0\n" @@ -8308,7 +8308,7 @@ void debug_sub_808EF8C() " add r0, r5, #0\n" " mov r1, #0xc\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._679:\n" " pop {r3}\n" " mov r8, r3\n" @@ -8537,7 +8537,7 @@ void debug_sub_808F2E0() " add r0, r1, #0\n" " add r1, r4, #0\n" " add r2, r3, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r4}\n" " pop {r0}\n" " bx r0\n" @@ -8615,7 +8615,7 @@ void debug_sub_808F31C() " add r0, r5, #0\n" " mov r1, r8\n" " mov r2, r9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " pop {r3, r4}\n" " mov r8, r3\n" " mov r9, r4\n" diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index dcb3bd90b..731e58986 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -126,7 +126,7 @@ void debug_80C35DC() " ldr r0, ._2 + 12\n" " bl LoadSpritePalette\n" " ldr r0, ._2 + 16\n" - " bl SetUpWindowConfig\n" + " bl Text_LoadWindowTemplate\n" " ldr r0, ._2 + 20\n" " bl InitMenuWindow\n" " add sp, sp, #0x8\n" @@ -298,7 +298,7 @@ void debug_80C376C() " mov r0, sp\n" " add r1, r7, #0\n" " add r2, r6, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add sp, sp, #0x4\n" " pop {r4, r5, r6, r7}\n" " pop {r0}\n" @@ -365,7 +365,7 @@ void debug_80C3800() " mov r0, sp\n" " add r1, r6, #0\n" " add r2, r5, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add sp, sp, #0xc\n" " pop {r4, r5, r6, r7}\n" " pop {r0}\n" @@ -491,13 +491,13 @@ void debug_80C38E4() " add r1, r4, #0\n" " add r2, r7, #0\n" " add r3, r5, #0\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " cmp r6, #0\n" " beq ._36 @cond_branch\n" " mov r0, sp\n" " add r1, r7, #0\n" " mov r2, r8\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._36:\n" " add sp, sp, #0x4\n" " pop {r3}\n" @@ -699,82 +699,82 @@ void debug_80C3A50() " mov r1, #0x0\n" " mov r2, #0x17\n" " mov r3, #0x9\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x5\n" " mov r3, #0x9\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r5, ._56 + 8\n" " add r0, r5, #0\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r4, ._56 + 12\n" " add r0, r4, #0\n" " mov r1, #0x1\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x18\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x9\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " add r0, r5, #0\n" " mov r1, #0x19\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0x19\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " mov r1, #0xa\n" " mov r2, #0xb\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._56 + 16\n" " mov r1, #0x1\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._56 + 20\n" " mov r1, #0x1\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._56 + 24\n" " mov r1, #0x1\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._56 + 28\n" " mov r1, #0x1\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xc\n" " mov r1, #0xa\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._56 + 32\n" " mov r1, #0xd\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._56 + 36\n" " mov r1, #0xd\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xc\n" " mov r1, #0x10\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._56 + 40\n" " mov r1, #0xd\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._56 + 44\n" " mov r1, #0x18\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, r9\n" " mov r1, #0x12\n" " mov r2, #0x11\n" @@ -1788,15 +1788,15 @@ void debug_80C42B8() " mov r1, #0x10\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, sp\n" " mov r1, #0x1\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0x14\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " bl debug_80C4694\n" " bl debug_80C4704\n" " ldr r0, ._150 + 8\n" @@ -2298,11 +2298,11 @@ void debug_80C4694() " mov r1, #0x0\n" " mov r2, #0xe\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, sp\n" " mov r1, #0x2\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r4, #0x0\n" " add r5, sp, #0x10\n" "._212:\n" @@ -2324,7 +2324,7 @@ void debug_80C4694() " lsr r2, r2, #0x18\n" " add r0, r5, #0\n" " mov r1, #0x2\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" @@ -2357,11 +2357,11 @@ void debug_80C4704() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, sp\n" " mov r1, #0x11\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r4, #0x0\n" " add r5, sp, #0x10\n" "._215:\n" @@ -2383,7 +2383,7 @@ void debug_80C4704() " lsr r2, r2, #0x18\n" " add r0, r5, #0\n" " mov r1, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" @@ -2476,24 +2476,24 @@ void debug_80C47BC() " mov r1, #0x10\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, sp\n" " mov r1, #0x1\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0x14\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xe\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " add r0, r6, #0\n" " mov r1, #0x2\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r4, #0x0\n" " ldr r6, ._224 + 16\n" "._223:\n" @@ -2506,7 +2506,7 @@ void debug_80C47BC() " add r2, r2, r1\n" " lsr r2, r2, #0x18\n" " mov r1, #0x2\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" @@ -2516,11 +2516,11 @@ void debug_80C47BC() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " add r0, r5, #0\n" " mov r1, #0x11\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._224 + 20\n" " ldrb r0, [r0, #0x4]\n" " bl debug_80C4C44\n" @@ -3142,7 +3142,7 @@ void debug_80C4C44() " lsr r2, r2, #0x18\n" " mov r0, sp\n" " mov r1, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._280:\n" " mov r7, r8\n" " lsl r0, r7, #0x18\n" @@ -3188,24 +3188,24 @@ void debug_80C4D14() " mov r1, #0x10\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, sp\n" " mov r1, #0x1\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r5, #0\n" " mov r1, #0x14\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xe\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " add r0, r6, #0\n" " mov r1, #0x2\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._291 + 12\n" " ldrb r0, [r0, #0x6]\n" " bl debug_80C4F00\n" @@ -3213,7 +3213,7 @@ void debug_80C4D14() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r1, ._291 + 16\n" " lsl r0, r4, #0x2\n" " add r0, r0, r4\n" @@ -3431,7 +3431,7 @@ void debug_80C4F00() " mov r1, #0x3\n" " mov r2, #0xd\n" " mov r3, #0xe\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " mov r4, #0x0\n" " ldr r6, ._318\n" "._317:\n" @@ -3447,7 +3447,7 @@ void debug_80C4F00() " add r2, r2, r1\n" " lsr r2, r2, #0x18\n" " mov r1, #0x2\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._316:\n" " add r0, r4, #1\n" " lsl r0, r0, #0x18\n" @@ -3505,46 +3505,46 @@ void debug_80C4F48() " mov r1, #0x10\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, sp\n" " mov r1, #0x1\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r6, #0\n" " mov r1, #0x14\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xe\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " add r0, r5, #0\n" " mov r1, #0x2\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x1\n" " mov r1, #0x3\n" " mov r2, #0xd\n" " mov r3, #0xe\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " add r0, r5, #0\n" " mov r1, #0x2\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, r9\n" " mov r1, #0x2\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, r8\n" " mov r1, #0x2\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xf\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0xf\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r1, ._320 + 20\n" " lsl r0, r4, #0x2\n" " add r0, r0, r4\n" @@ -4039,11 +4039,11 @@ void InitCreatePokemon() " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x3\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " add r0, sp, #0x4\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r1, #0x80\n" " lsl r1, r1, #0x13\n" " mov r2, #0x8a\n" @@ -4244,13 +4244,13 @@ void debug_80C53F0() " mov r1, #0x8\n" " mov r2, #0x1a\n" " mov r3, #0xb\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " cmp r4, #0\n" " beq ._379 @cond_branch\n" " ldr r0, ._381 + 4\n" " mov r1, #0x4\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._380\n" "._382:\n" " .align 2, 0\n" @@ -4261,7 +4261,7 @@ void debug_80C53F0() " ldr r0, ._384\n" " mov r1, #0x4\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._380:\n" " ldr r0, ._384 + 4\n" " lsl r1, r5, #0x2\n" @@ -6028,7 +6028,7 @@ void debug_80C627C() " lsr r2, r2, #0x18\n" " add r0, r5, #0\n" " mov r1, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, [r4]\n" " ldr r2, ._593 + 4\n" " add r1, r0, r2\n" @@ -6046,7 +6046,7 @@ void debug_80C627C() " lsr r2, r2, #0x18\n" " mov r0, sp\n" " mov r1, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._595\n" "._594:\n" " .align 2, 0\n" @@ -6070,7 +6070,7 @@ void debug_80C627C() " lsr r2, r2, #0x18\n" " add r0, r5, #0\n" " mov r1, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, [r4]\n" " ldr r2, ._596 + 4\n" " add r1, r0, r2\n" @@ -6085,7 +6085,7 @@ void debug_80C627C() " lsr r2, r2, #0x18\n" " mov r0, sp\n" " mov r1, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._595:\n" " add sp, sp, #0x8\n" " pop {r4, r5, r6}\n" @@ -6112,7 +6112,7 @@ void debug_80C6384() " mov r1, #0x4\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r5, #0x0\n" " ldr r3, ._600\n" " ldr r1, ._600 + 4\n" @@ -6166,7 +6166,7 @@ void debug_80C6384() " add r2, r2, r1\n" " lsr r2, r2, #0x18\n" " mov r1, #0x2\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r5, #1\n" " lsl r0, r0, #0x10\n" " lsr r5, r0, #0x10\n" @@ -6209,7 +6209,7 @@ void debug_80C643C() " mov r1, #0x5\n" " mov r2, #0x1c\n" " mov r3, #0x12\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " mov r5, #0x0\n" " ldr r6, ._605\n" " ldr r1, ._605 + 4\n" @@ -6301,7 +6301,7 @@ void debug_80C643C() " add r2, r2, r1\n" " lsr r2, r2, #0x18\n" " mov r1, #0x2\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r5, #1\n" " lsl r0, r0, #0x10\n" " lsr r5, r0, #0x10\n" @@ -6888,7 +6888,7 @@ void debug_80C68CC() " add r0, r0, sp\n" " add r1, r6, #0\n" " add r2, r5, #0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add sp, sp, #0x8\n" " pop {r4, r5, r6, r7}\n" " pop {r0}\n" @@ -7092,39 +7092,39 @@ void debug_80C6B00() " mov r1, #0x0\n" " mov r2, #0xf\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x9\n" " mov r3, #0x9\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x0\n" " mov r1, #0xa\n" " mov r2, #0x9\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x10\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._666 + 4\n" " mov r1, #0x11\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._666 + 8\n" " mov r1, #0x1b\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._666 + 12\n" " mov r1, #0x11\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xa\n" " mov r1, #0x8\n" " mov r2, #0x1d\n" " mov r3, #0xc\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r2, #0x0\n" " ldr r4, ._666 + 16\n" " ldr r0, ._666 + 20\n" @@ -7159,12 +7159,12 @@ void debug_80C6B00() " add r0, r5, #0\n" " mov r1, #0x14\n" " mov r2, #0xa\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xa\n" " mov r1, #0xd\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r1, sp\n" " mov r0, #0x23\n" " strb r0, [r1]\n" @@ -7232,7 +7232,7 @@ void debug_80C6B00() " add r0, r5, #0\n" " mov r1, #0xf\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._666 + 52\n" " ldr r2, ._666 + 56\n" " add r0, r2, #0\n" @@ -7595,7 +7595,7 @@ void debug_80C6EE8() " ldr r0, ._670 + 16\n" " mov r1, #0xd\n" " mov r2, #0xa\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0xe\n" " mov r2, #0xa\n" @@ -8665,39 +8665,39 @@ void debug_80C777C() " mov r1, #0x0\n" " mov r2, #0xe\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x9\n" " mov r3, #0x9\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x0\n" " mov r1, #0xa\n" " mov r2, #0x9\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0xe\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._784 + 4\n" " mov r1, #0xf\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._784 + 8\n" " mov r1, #0x19\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._784 + 12\n" " mov r1, #0xf\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xa\n" " mov r1, #0x8\n" " mov r2, #0x1d\n" " mov r3, #0xc\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r2, #0x0\n" " ldr r4, ._784 + 16\n" " ldr r0, ._784 + 20\n" @@ -8732,12 +8732,12 @@ void debug_80C777C() " add r0, r5, #0\n" " mov r1, #0x14\n" " mov r2, #0xa\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0xa\n" " mov r1, #0xd\n" " mov r2, #0x1d\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r1, sp\n" " mov r0, #0x23\n" " strb r0, [r1]\n" @@ -8805,7 +8805,7 @@ void debug_80C777C() " add r0, r5, #0\n" " mov r1, #0xf\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._784 + 52\n" " ldr r2, ._784 + 56\n" " add r0, r2, #0\n" @@ -9052,7 +9052,7 @@ void debug_80C7A54() " ldr r0, ._788 + 16\n" " mov r1, #0xd\n" " mov r2, #0xa\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " mov r1, #0xe\n" " mov r2, #0xa\n" diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 311679cb7..3aefa80de 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -4217,7 +4217,7 @@ void debug_sub_811B2E8() " mov r0, sp\n" " mov r1, #0x6\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add sp, sp, #0x4\n" " pop {r0}\n" " bx r0\n" @@ -4238,75 +4238,75 @@ void debug_sub_811B310() " ldr r0, ._21\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 4\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 8\n" " mov r1, #0x1\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 12\n" " mov r1, #0x1\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 16\n" " mov r1, #0x1\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 20\n" " mov r1, #0x1\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 24\n" " mov r1, #0x1\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 28\n" " mov r1, #0x1\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 32\n" " mov r1, #0x1\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 36\n" " mov r1, #0xf\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 40\n" " mov r1, #0xf\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 44\n" " mov r1, #0xf\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 48\n" " mov r1, #0xf\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 52\n" " mov r1, #0xf\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 56\n" " mov r1, #0xf\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 60\n" " mov r1, #0xf\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 64\n" " mov r1, #0xf\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 68\n" " mov r1, #0xf\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._21 + 72\n" " ldrb r0, [r0, #0x3]\n" " cmp r0, #0\n" @@ -4314,7 +4314,7 @@ void debug_sub_811B310() " ldr r0, ._21 + 76\n" " mov r1, #0xa\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._20\n" "._22:\n" " .align 2, 0\n" @@ -4343,7 +4343,7 @@ void debug_sub_811B310() " ldr r0, ._30\n" " mov r1, #0xa\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._20:\n" " ldr r4, ._30 + 4\n" " ldr r1, [r4, #0x68]\n" @@ -4354,7 +4354,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0xa\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, [r4, #0x6c]\n" " mov r0, sp\n" " mov r2, #0x2\n" @@ -4363,7 +4363,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0xa\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " mov r0, #0x10\n" " ldsh r1, [r4, r0]\n" " mov r0, sp\n" @@ -4373,7 +4373,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0xa\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, [r4, #0x70]\n" " mov r0, sp\n" " mov r2, #0x2\n" @@ -4382,7 +4382,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0x14\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, [r4, #0x74]\n" " mov r0, sp\n" " mov r2, #0x2\n" @@ -4391,7 +4391,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0x14\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, [r4, #0x78]\n" " mov r0, sp\n" " mov r2, #0x2\n" @@ -4400,7 +4400,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0x14\n" " mov r2, #0x7\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, [r4, #0x7c]\n" " mov r0, sp\n" " mov r2, #0x2\n" @@ -4409,7 +4409,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0x14\n" " mov r2, #0x9\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " add r0, r0, #0x80\n" " ldr r1, [r0]\n" @@ -4420,7 +4420,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0x14\n" " mov r2, #0xb\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " add r0, r0, #0x84\n" " ldr r1, [r0]\n" @@ -4431,7 +4431,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0x14\n" " mov r2, #0xd\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " add r0, r0, #0x88\n" " ldr r1, [r0]\n" @@ -4442,7 +4442,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0x14\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " add r0, r4, #0\n" " add r0, r0, #0x8c\n" " ldr r1, [r0]\n" @@ -4453,7 +4453,7 @@ void debug_sub_811B310() " mov r0, sp\n" " mov r1, #0x14\n" " mov r2, #0x11\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._30 + 8\n" " ldrb r0, [r1]\n" " cmp r0, #0\n" @@ -4515,7 +4515,7 @@ void debug_sub_811B310() "._45:\n" " ldr r0, ._46\n" " mov r1, #0x17\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._23:\n" " bl debug_sub_811B2E8\n" " add sp, sp, #0x8\n" @@ -4684,7 +4684,7 @@ void debug_sub_811B654() " mov r1, #0x0\n" " mov r2, #0x18\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " bl debug_sub_811B310\n" " ldrh r0, [r5, #0x8]\n" " add r0, r0, #0x1\n" @@ -4749,20 +4749,20 @@ void debug_sub_811B654() " beq ._83 @cond_branch\n" " mov r0, #0x3\n" " strh r0, [r5, #0x8]\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x9\n" " mov r3, #0x5\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._85\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._85 + 4\n" " mov r1, #0x1\n" " mov r2, #0x3\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " b ._116\n" "._86:\n" " .align 2, 0\n" @@ -4778,21 +4778,21 @@ void debug_sub_811B654() " strb r4, [r0]\n" " ldr r0, ._91 + 4\n" " strb r4, [r0]\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0xa\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r0, ._91 + 8\n" " mov r1, #0x1\n" " mov r2, #0x1\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r3, ._91 + 12\n" " mov r0, #0x2\n" " mov r1, #0x3\n" " mov r2, #0x8\n" - " bl PrintMenuItems\n" + " bl Menu_PrintItems\n" " str r4, [sp]\n" " mov r0, #0x9\n" " str r0, [sp, #0x4]\n" @@ -4825,7 +4825,7 @@ void debug_sub_811B654() " .word _841B270\n" " .word unk_debug_bss_1+0x4\n" "._66:\n" - " bl ProcessMenuInput\n" + " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r2, r0, #0x18\n" " mov r0, #0x2\n" @@ -4845,7 +4845,7 @@ void debug_sub_811B654() " ldr r0, [r1]\n" " bl _call_via_r0\n" "._94:\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " add r0, r6, #0\n" " bl DestroyTask\n" " b ._116\n" @@ -4938,7 +4938,7 @@ void debug_sub_811B654() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._116 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " add r0, r6, #0\n" " bl DestroyTask\n" "._116:\n" @@ -4986,7 +4986,7 @@ void debug_sub_811B894() " ldr r0, ._122 + 8\n" " mov r1, #0x4\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._122 + 12\n" " mov r0, #0x0\n" " strb r0, [r1]\n" @@ -5027,7 +5027,7 @@ void debug_sub_811B894() " mov r1, #0x4\n" " mov r2, #0x2\n" "._121:\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r0, ._163 + 4\n" " strb r4, [r0]\n" "._126:\n" @@ -5181,7 +5181,7 @@ void debug_sub_811B894() " ldr r0, ._163 + 12\n" " mov r1, #0x4\n" " mov r2, #0x0\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._163 + 4\n" " mov r0, #0x0\n" " strb r0, [r1]\n" diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 36295b3f8..1e4eace87 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -278,11 +278,11 @@ void debug_sub_8075C40() " mov r2, #0x1\n" " mov r3, #0x8\n" " bl ConvertIntToDecimalStringN\n" - " bl MenuDisplayMessageBox\n" + " bl Menu_DisplayDialogueFrame\n" " ldr r0, ._16 + 16\n" " mov r1, #0x2\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" "._12:\n" " ldrh r0, [r5]\n" " add r0, r0, #0x1\n" @@ -303,7 +303,7 @@ void debug_sub_8075C40() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._18 @cond_branch\n" - " bl MenuZeroFillScreen\n" + " bl Menu_EraseScreen\n" " bl ScriptContext2_Disable\n" " add r0, r4, #0\n" " bl DestroyTask\n" -- cgit v1.2.3 From 6efb614f3f3bf1b1b381bdfe220391e152fc8ebe Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 15:49:51 -0600 Subject: add more debug things --- src/battle/battle_2.c | 140 +-- src/battle/battle_ai.c | 2 +- src/battle/battle_interface.c | 6 +- src/debug/nakamura_debug_menu.c | 6 +- src/debug/nohara_debug_menu.c | 4 +- src/debug/start_menu_debug.c | 32 +- src/debug/tomomichi_debug_menu.c | 14 +- src/debug/unk_debug_menu_3.c | 38 +- src/engine/save.c | 4 +- src/field/choose_party.c | 2 +- src/field/field_player_avatar.c | 99 +- src/field/field_weather.c | 181 ++++ src/field/fldeff_secretpower.c | 96 ++ src/field/mauville_man.c | 2 +- src/field/party_menu.c | 17 +- src/field/region_map.c | 4 +- src/field/slot_machine.c | 1863 ++++++++++++++++++++++++++++------ src/pokemon/mail.c | 75 ++ src/pokemon/pokemon_1.c | 12 +- src/pokemon/pokemon_storage_system.c | 3 +- 20 files changed, 2150 insertions(+), 450 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 78fc35ba5..454b47e08 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -220,7 +220,7 @@ void InitBattle(void) " lsl r1, r1, #0x13\n" " ldr r2, ._10\n" " mov r0, sp\n" - " bl gScriptFuncs_End+0x3cb4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cb4\n" " ldr r0, ._10 + 4\n" " strh r4, [r0]\n" " sub r0, r0, #0xc\n" @@ -347,13 +347,13 @@ void InitBattle(void) " .word 0xff10\n" " .word gWindowConfig_81E6C58\n" " .word gUnknown_030042A4\n" - " .word gUnknown_030042A0\n" + " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" - " .word gUnknown_030041B4\n" - " .word gUnknown_03004288\n" - " .word gUnknown_03004280\n" - " .word gUnknown_030041B0\n" - " .word gUnknown_030041B8\n" + " .word gBattle_BG1_Y\n" + " .word gBattle_BG2_X\n" + " .word gBattle_BG2_Y\n" + " .word gBattle_BG3_X\n" + " .word gBattle_BG3_Y\n" " .word gUnknown_02023A14+0x50\n" " .word gBattleTerrain\n" " .word gUnknown_03004210\n" @@ -907,7 +907,7 @@ void sub_800EC9C() " ldr r2, ._116 + 4\n" " add r1, r1, r2\n" " mov r2, #0xc8\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " b ._129\n" "._117:\n" " .align 2, 0\n" @@ -946,7 +946,7 @@ void sub_800EC9C() " ldr r2, ._126 + 4\n" " add r1, r1, r2\n" " mov r2, #0xc8\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " b ._129\n" "._127:\n" " .align 2, 0\n" @@ -982,7 +982,7 @@ void sub_800EC9C() " add r1, r1, r0\n" " add r0, r4, #0\n" " mov r2, #0xc8\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " ldr r1, ._134 + 8\n" " add r0, r4, r1\n" " bl shedinja_something\n" @@ -1407,7 +1407,7 @@ void sub_800F104() " add r1, r1, r0\n" " ldr r0, ._177 + 4\n" " mov r2, #0x60\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" "._174:\n" " add r7, r7, #0x1c\n" " add r4, r4, #0x1\n" @@ -1781,7 +1781,7 @@ void sub_800F298() " ldr r1, ._239 + 4\n" " mov r2, #0x96\n" " lsl r2, r2, #0x1\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " ldr r0, ._239 + 8\n" " mov r1, #0x0\n" " bl CreateTask\n" @@ -2018,7 +2018,7 @@ void sub_800F298() "._283:\n" " add r1, r5, #0\n" " mov r2, #0xc8\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " b ._291\n" "._293:\n" " .align 2, 0\n" @@ -2028,7 +2028,7 @@ void sub_800F298() " ldr r0, ._296\n" " add r1, r5, #0\n" " mov r2, #0xc8\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" "._291:\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" @@ -2185,7 +2185,7 @@ void sub_800F298() "._333:\n" " add r1, r5, #0\n" " mov r2, #0x64\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " b ._341\n" "._343:\n" " .align 2, 0\n" @@ -2195,7 +2195,7 @@ void sub_800F298() " ldr r0, ._346\n" " add r1, r5, #0\n" " mov r2, #0x64\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" "._341:\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" @@ -2627,7 +2627,7 @@ void BattleMainCB2(void) " str r0, [r4]\n" " bl ZeroEnemyPartyMons\n" " mov r0, #0x5a\n" - " bl gScriptFuncs_End+0x148c\n" + " bl gMysteryEventScriptCmdTableEnd+0x148c\n" " ldr r0, ._358 + 24\n" " ldrh r1, [r0]\n" " mov r0, #0x2\n" @@ -3197,7 +3197,7 @@ void debug_sub_80108B8() asm( " push {r4, r5, lr}\n" " add sp, sp, #0xfffffffc\n" - " bl gScriptFuncs_End+0x19f4\n" + " bl gMysteryEventScriptCmdTableEnd+0x19f4\n" " mov r0, #0x0\n" " bl SetHBlankCallback\n" " mov r0, #0x0\n" @@ -3264,7 +3264,7 @@ void debug_sub_80108B8() " ldr r1, ._507 + 72\n" " add r0, r4, #0\n" " bl LZDecompressVram\n" - " bl gScriptFuncs_End+0x1a70\n" + " bl gMysteryEventScriptCmdTableEnd+0x1a70\n" " ldr r0, ._507 + 76\n" " bl SetVBlankCallback\n" " ldr r0, ._507 + 80\n" @@ -3333,13 +3333,13 @@ void debug_sub_80108B8() " .word 0x85006000\n" " .word 0x4000200\n" " .word gUnknown_030042A4\n" - " .word gUnknown_030042A0\n" + " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" - " .word gUnknown_030041B4\n" - " .word gUnknown_03004288\n" - " .word gUnknown_03004280\n" - " .word gUnknown_030041B0\n" - " .word gUnknown_030041B8\n" + " .word gBattle_BG1_Y\n" + " .word gBattle_BG2_X\n" + " .word gBattle_BG2_Y\n" + " .word gBattle_BG3_X\n" + " .word gBattle_BG3_Y\n" " .word 0x1f09\n" " .word 0x4801\n" " .word 0x4000050\n" @@ -3860,7 +3860,7 @@ void debug_sub_8010CAC() " strb r0, [r3, #0x15]\n" " lsl r0, r0, #0x1f\n" " lsr r0, r0, #0x1f\n" - " bl gScriptFuncs_End+0x2aa0\n" + " bl gMysteryEventScriptCmdTableEnd+0x2aa0\n" " bl debug_nullsub_3\n" "._559:\n" " ldr r4, ._565 + 12\n" @@ -4774,7 +4774,7 @@ void debug_sub_8011498() " lsl r4, r4, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x4358\n" + " bl gMysteryEventScriptCmdTableEnd+0x4358\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -4830,7 +4830,7 @@ void debug_sub_8011498() " lsl r4, r4, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x4358\n" + " bl gMysteryEventScriptCmdTableEnd+0x4358\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -4886,7 +4886,7 @@ void debug_sub_8011498() " lsl r4, r4, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x4358\n" + " bl gMysteryEventScriptCmdTableEnd+0x4358\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -4929,7 +4929,7 @@ void debug_sub_8011498() " lsl r4, r5, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x4358\n" + " bl gMysteryEventScriptCmdTableEnd+0x4358\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -4965,7 +4965,7 @@ void debug_sub_8011498() " lsl r4, r4, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x4358\n" + " bl gMysteryEventScriptCmdTableEnd+0x4358\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -5002,7 +5002,7 @@ void debug_sub_8011498() " lsl r4, r5, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x4358\n" + " bl gMysteryEventScriptCmdTableEnd+0x4358\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -5200,7 +5200,7 @@ void debug_sub_801174C() "._713:\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" " ldr r1, ._719\n" @@ -5223,7 +5223,7 @@ void debug_sub_801174C() "._699:\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " mov r2, #0x64\n" " add r1, r0, #0\n" " mul r1, r1, r2\n" @@ -5282,7 +5282,7 @@ void debug_sub_801174C() " str r0, [sp, #0xc]\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" " ldr r1, ._726\n" @@ -5355,7 +5355,7 @@ void debug_sub_801174C() "._735:\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " mov r2, #0x64\n" " mul r0, r0, r2\n" " ldr r1, ._741\n" @@ -5382,7 +5382,7 @@ void debug_sub_801174C() "._721:\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " mov r2, #0x64\n" " add r1, r0, #0\n" " mul r1, r1, r2\n" @@ -5441,7 +5441,7 @@ void debug_sub_801174C() " str r0, [sp, #0xc]\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " mov r2, #0x64\n" " mul r0, r0, r2\n" " ldr r1, ._750\n" @@ -5460,7 +5460,7 @@ void debug_sub_801174C() " ble ._743 @cond_branch\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" " ldr r1, ._750\n" @@ -5838,13 +5838,13 @@ void debug_sub_8011D40() " .word 0x6004000\n" " .word 0x80000800\n" " .word gUnknown_030042A4\n" - " .word gUnknown_030042A0\n" + " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" - " .word gUnknown_030041B4\n" - " .word gUnknown_03004288\n" - " .word gUnknown_03004280\n" - " .word gUnknown_030041B0\n" - " .word gUnknown_030041B8\n" + " .word gBattle_BG1_Y\n" + " .word gBattle_BG2_X\n" + " .word gBattle_BG2_Y\n" + " .word gBattle_BG3_X\n" + " .word gBattle_BG3_Y\n" "\n" ); } @@ -5911,13 +5911,13 @@ void debug_sub_8011DD4() " .word 0x4000008\n" " .word 0x9803\n" " .word gUnknown_030042A4\n" - " .word gUnknown_030042A0\n" + " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" - " .word gUnknown_030041B4\n" - " .word gUnknown_03004288\n" - " .word gUnknown_03004280\n" - " .word gUnknown_030041B0\n" - " .word gUnknown_030041B8\n" + " .word gBattle_BG1_Y\n" + " .word gBattle_BG2_X\n" + " .word gBattle_BG2_Y\n" + " .word gBattle_BG3_X\n" + " .word gBattle_BG3_Y\n" "\n" ); } @@ -6483,7 +6483,7 @@ void debug_sub_8012294() " lsl r4, r4, #0x1\n" " add r0, r5, #0\n" " mov r1, #0x5\n" - " bl gScriptFuncs_End+0x4358\n" + " bl gMysteryEventScriptCmdTableEnd+0x4358\n" " add r5, r0, #0\n" " lsl r5, r5, #0x18\n" " lsr r5, r5, #0x15\n" @@ -7102,7 +7102,7 @@ void debug_sub_8012688() " bl SetHBlankCallback\n" " ldr r0, ._873 + 100\n" " bl SetVBlankCallback\n" - " bl gScriptFuncs_End+0x14f4\n" + " bl gMysteryEventScriptCmdTableEnd+0x14f4\n" " ldr r0, ._873 + 104\n" " mov r1, #0x0\n" " bl CreateTask\n" @@ -7132,13 +7132,13 @@ void debug_sub_8012688() " .word 0x400004c\n" " .word gWindowConfig_81E6C58\n" " .word gUnknown_030042A4\n" - " .word gUnknown_030042A0\n" + " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" - " .word gUnknown_030041B4\n" - " .word gUnknown_03004288\n" - " .word gUnknown_03004280\n" - " .word gUnknown_030041B0\n" - " .word gUnknown_030041B8\n" + " .word gBattle_BG1_Y\n" + " .word gBattle_BG2_X\n" + " .word gBattle_BG2_Y\n" + " .word gBattle_BG3_X\n" + " .word gBattle_BG3_Y\n" " .word gBattleTerrain\n" " .word gReservedSpritePaletteCount\n" " .word gCurrentMove\n" @@ -7764,7 +7764,7 @@ void debug_sub_8012C08() " .word gTasks\n" " .word UnkDebug0+0x432\n" " .word gUnknown_03004210\n" - " .word gUnknown_08400D7A\n" + " .word BattleText_YesNo\n" "\n" ); } @@ -8484,7 +8484,7 @@ void debug_sub_8013240() { asm( " push {lr}\n" - " bl gScriptFuncs_End+0x2fec\n" + " bl gMysteryEventScriptCmdTableEnd+0x2fec\n" " lsl r0, r0, #0x10\n" " cmp r0, #0\n" " beq ._1068 @cond_branch\n" @@ -8519,7 +8519,7 @@ void debug_sub_8013258() " lsr r4, r0, #0x10\n" " add r0, r4, #0\n" " add r1, r6, #0\n" - " bl gScriptFuncs_End+0x2f60\n" + " bl gMysteryEventScriptCmdTableEnd+0x2f60\n" " cmp r0, #0\n" " bne ._1071 @cond_branch\n" " mov r0, #0x80\n" @@ -8555,13 +8555,13 @@ void debug_sub_8013294() " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " bne ._1076 @cond_branch\n" - " bl gScriptFuncs_End+0x19f4\n" + " bl gMysteryEventScriptCmdTableEnd+0x19f4\n" " add r0, r4, #0\n" " add r1, r5, #0\n" " add r2, r6, #0\n" " bl debug_sub_8013258\n" " add r4, r0, #0\n" - " bl gScriptFuncs_End+0x1a70\n" + " bl gMysteryEventScriptCmdTableEnd+0x1a70\n" " add r0, r4, #0\n" " b ._1077\n" "._1076:\n" @@ -8591,7 +8591,7 @@ void debug_sub_80132C8() " mov r1, #0x0\n" " add r2, r5, #0\n" " add r3, r6, #0\n" - " bl gScriptFuncs_End+0x2d64\n" + " bl gMysteryEventScriptCmdTableEnd+0x2d64\n" "._1078:\n" " pop {r4, r5, r6}\n" " pop {r0}\n" @@ -9066,7 +9066,7 @@ void debug_sub_80139E4() "._1193:\n" " ldr r0, ._1198 + 12\n" " ldr r0, [r0]\n" - " bl gScriptFuncs_End+0x3cf4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" " ldr r1, ._1198 + 4\n" " mov r0, #0x0\n" " strb r0, [r1]\n" @@ -9081,7 +9081,7 @@ void debug_sub_80139E4() " lsl r0, r0, #0x2\n" " add r0, r0, r5\n" " ldr r0, [r0]\n" - " bl gScriptFuncs_End+0x3cf4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" " ldrb r0, [r4]\n" " add r0, r0, #0x1\n" " strb r0, [r4]\n" @@ -9103,7 +9103,7 @@ void debug_sub_80139E4() "._1192:\n" " ldr r0, ._1202\n" " ldr r0, [r0]\n" - " bl gScriptFuncs_End+0x3cf4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" " ldr r1, ._1202 + 4\n" " strb r4, [r1]\n" " ldr r0, ._1202 + 8\n" @@ -9117,7 +9117,7 @@ void debug_sub_80139E4() " lsl r0, r0, #0x2\n" " add r0, r0, r5\n" " ldr r0, [r0]\n" - " bl gScriptFuncs_End+0x3cf4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" " ldrb r0, [r4]\n" " add r0, r0, #0x1\n" " strb r0, [r4]\n" @@ -9349,7 +9349,7 @@ void sub_8010874() " mov r0, #0x64\n" " mul r0, r0, r1\n" " ldr r1, ._1215 + 160\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " ldr r2, ._1215 + 164\n" " add r1, r4, r2\n" " strb r0, [r1]\n" diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c index 938d0fde1..ffc9281e4 100644 --- a/src/battle/battle_ai.c +++ b/src/battle/battle_ai.c @@ -318,7 +318,7 @@ void BattleAI_SetupAIData() " ldrb r0, [r3]\n" " mov r1, #0x0\n" " mov r2, #0xff\n" - " bl sub_8015A98\n" + " bl CheckMoveLimitations\n" " lsl r0, r0, #0x18\n" " lsr r7, r0, #0x18\n" " mov r4, #0x0\n" diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c index b19547d52..1b6240159 100644 --- a/src/battle/battle_interface.c +++ b/src/battle/battle_interface.c @@ -1405,7 +1405,7 @@ void sub_804454C() " add r1, r1, r0\n" " mov r0, sp\n" " ldr r2, ._150 + 36\n" - " bl gScriptFuncs_End+0x3cb4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cb4\n" " ldrb r4, [r5]\n" " ldrh r0, [r7]\n" " mov r1, sl\n" @@ -1467,7 +1467,7 @@ void sub_804454C() " ldr r2, ._153 + 4\n" " add r1, r1, r2\n" " ldr r2, ._153 + 8\n" - " bl gScriptFuncs_End+0x3cb4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cb4\n" " b ._163\n" "._154:\n" " .align 2, 0\n" @@ -1521,7 +1521,7 @@ void sub_804454C() " add r1, r1, r6\n" " mov r0, sp\n" " ldr r2, ._161 + 4\n" - " bl gScriptFuncs_End+0x3cb4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cb4\n" " ldrb r4, [r5]\n" " ldrh r0, [r7]\n" " mov r1, sl\n" diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c index 1d36d528f..b86fa0abf 100644 --- a/src/debug/nakamura_debug_menu.c +++ b/src/debug/nakamura_debug_menu.c @@ -2237,7 +2237,7 @@ void debug_sub_815FFDC() " mov r0, #0xf\n" " mov r1, #0x1\n" " mov r2, #0xff\n" - " bl unref_sub_80F924C\n" + " bl PrintTriangleCursorWithPalette\n" " ldr r1, ._217 + 4\n" " ldr r0, ._217 + 8\n" " str r0, [r1]\n" @@ -2831,7 +2831,7 @@ void debug_sub_81603B8() " lsl r1, r1, #0x18\n" " lsr r1, r1, #0x18\n" " mov r2, #0xff\n" - " bl unref_sub_80F924C\n" + " bl PrintTriangleCursorWithPalette\n" " pop {r4, r5, r6, r7}\n" " pop {r0}\n" " bx r0\n" @@ -3206,7 +3206,7 @@ void debug_sub_8160714() " lsr r1, r1, #0x18\n" " mov r0, r9\n" " str r2, [sp, #0xc]\n" - " bl sub_810CA9C\n" + " bl GetPokeblockData\n" " add r1, r0, #0\n" " lsl r0, r5, #0x1\n" " add r0, r0, sp\n" diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c index f929170fd..766137871 100644 --- a/src/debug/nohara_debug_menu.c +++ b/src/debug/nohara_debug_menu.c @@ -2177,7 +2177,7 @@ void NoharaDebugMenu_SootopolisCity() " mov r0, #0x71\n" " bl FlagSet\n" " ldr r0, ._227\n" - " bl FlagReset\n" + " bl FlagClear\n" " bl CloseMenu\n" " mov r0, #0x1\n" " pop {r1}\n" @@ -2196,7 +2196,7 @@ void NoharaDebugMenu_Embark() asm( " push {lr}\n" " ldr r0, ._229\n" - " bl FlagReset\n" + " bl FlagClear\n" " ldr r0, ._229 + 4\n" " mov r1, #0x1\n" " bl VarSet\n" diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 6f9f0d02c..e4ae404e2 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -170,7 +170,7 @@ void debug_sub_8076BB4() " add r2, r2, #0x4\n" " add r0, r0, r2\n" " ldr r0, [r0]\n" - " bl gScriptFuncs_End+0x3cf4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" " b ._24\n" "._14:\n" " .align 2, 0\n" @@ -886,7 +886,7 @@ void DebugMenu_8077020() " lsr r4, r0, #0x18\n" " ldr r0, ._109\n" " ldr r0, [r0]\n" - " bl gScriptFuncs_End+0x3cf4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " cmp r0, #0x1\n" @@ -1058,7 +1058,7 @@ void DebugMenu_807709C() " add r1, r1, #0x4\n" " add r0, r0, r1\n" " ldr r0, [r0]\n" - " bl gScriptFuncs_End+0x3cf4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " b ._132\n" @@ -1185,18 +1185,18 @@ void DebugMenu_8077238() " ldr r1, ._139\n" " mov r0, sp\n" " mov r2, #0x2\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, sp, #0x4\n" " mov r9, r0\n" " ldr r1, ._139 + 4\n" " mov r2, #0x3\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r1, sp, #0x8\n" " mov sl, r1\n" " ldr r1, ._139 + 8\n" " mov r0, sl\n" " mov r2, #0x3\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " mov r2, #0x0\n" " str r2, [sp, #0x14]\n" " add r4, sp, #0x10\n" @@ -1930,7 +1930,7 @@ void DebugMenu_80776B4() " ldr r1, ._183\n" " mov r0, sp\n" " mov r2, #0x7\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " lsl r3, r4, #0x1\n" " lsl r5, r4, #0x19\n" " lsr r5, r5, #0x18\n" @@ -1973,7 +1973,7 @@ void DebugMenu_8077704() " ldr r1, ._185\n" " mov r0, sp\n" " mov r2, #0x11\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " mov r0, #0x13\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" @@ -2172,7 +2172,7 @@ void DebugMenu_807786C() " ldr r1, ._205\n" " mov r0, sp\n" " mov r2, #0x7\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " mov r0, #0x19\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" @@ -2871,7 +2871,7 @@ void DebugMenu_8077C3C() " add r0, r2, #0\n" " mov r1, #0xa\n" " str r3, [sp]\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " add r2, r0, #0\n" " ldr r3, [sp]\n" " cmp r4, r6\n" @@ -3983,7 +3983,7 @@ void DebugMenu_80783C8() " .word 0x804\n" "._381:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" " mov r0, #0x1\n" " bl DebugMenu_807786C\n" "._382:\n" @@ -4075,7 +4075,7 @@ void DebugMenu_8078464() " b ._401\n" "._392:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" " b ._401\n" "._398:\n" " add r0, r4, #0\n" @@ -5578,7 +5578,7 @@ void DebugMenu_8078E04() " lsr r4, r0, #0x10\n" " add r0, r4, #0\n" " add r1, r6, #0\n" - " bl gScriptFuncs_End+0x2f60\n" + " bl gMysteryEventScriptCmdTableEnd+0x2f60\n" " cmp r0, #0\n" " bne ._576 @cond_branch\n" " mov r0, #0x80\n" @@ -5611,13 +5611,13 @@ void DebugMenu_8078E40() " add r6, r2, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl gScriptFuncs_End+0x19f4\n" + " bl gMysteryEventScriptCmdTableEnd+0x19f4\n" " add r0, r4, #0\n" " add r1, r5, #0\n" " add r2, r6, #0\n" " bl DebugMenu_8078E04\n" " add r4, r0, #0\n" - " bl gScriptFuncs_End+0x1a70\n" + " bl gMysteryEventScriptCmdTableEnd+0x1a70\n" " add r0, r4, #0\n" " pop {r4, r5, r6}\n" " pop {r1}\n" @@ -5637,7 +5637,7 @@ void DebugMenu_8078E68() " lsr r0, r0, #0x18\n" " mov r1, #0x0\n" " add r2, r4, #0\n" - " bl gScriptFuncs_End+0x2d64\n" + " bl gMysteryEventScriptCmdTableEnd+0x2d64\n" " pop {r4}\n" " pop {r0}\n" " bx r0\n" diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index cc2bdd80e..2d9074d19 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -2197,7 +2197,7 @@ void debug_sub_808C714() " .word gUnknown_Debug_083C31DC+0xa\n" "._189:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" "._190:\n" " pop {r4}\n" " pop {r0}\n" @@ -2857,7 +2857,7 @@ void debug_sub_808CBC0() " .word gUnknown_Debug_083C2710+0xa\n" "._229:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" "._230:\n" " pop {r4}\n" " pop {r0}\n" @@ -3235,7 +3235,7 @@ void debug_sub_808CE5C() " .word gUnknown_Debug_083C1C34+0x4\n" "._257:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" "._258:\n" " pop {r4}\n" " pop {r0}\n" @@ -3895,7 +3895,7 @@ void debug_sub_808D308() " .word gUnknown_Debug_083C19C6\n" "._297:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" "._298:\n" " pop {r4}\n" " pop {r0}\n" @@ -4226,7 +4226,7 @@ void debug_sub_808D54C() " .word gUnknown_Debug_083C1194+0x2\n" "._323:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" "._324:\n" " pop {r4}\n" " pop {r0}\n" @@ -4557,7 +4557,7 @@ void debug_sub_808D790() " .word gUnknown_Debug_083C12D0+0x2\n" "._349:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" "._350:\n" " pop {r4}\n" " pop {r0}\n" @@ -4840,7 +4840,7 @@ void debug_sub_808D97C() " .word gUnknown_Debug_083C1AAC+0x2\n" "._373:\n" " add r0, r4, #0\n" - " bl FlagReset\n" + " bl FlagClear\n" "._374:\n" " pop {r4}\n" " pop {r0}\n" diff --git a/src/debug/unk_debug_menu_3.c b/src/debug/unk_debug_menu_3.c index 70e194907..a217a0258 100644 --- a/src/debug/unk_debug_menu_3.c +++ b/src/debug/unk_debug_menu_3.c @@ -9,7 +9,7 @@ void debug_sub_813C404() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -37,7 +37,7 @@ void debug_sub_813C430() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -65,7 +65,7 @@ void debug_sub_813C45C() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -93,7 +93,7 @@ void debug_sub_813C488() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -119,7 +119,7 @@ void debug_sub_813C4B4() " ldr r1, ._9 + 4\n" " sub r4, r4, r1\n" " add r2, r4, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r4, #0\n" " pop {r4}\n" " pop {r1}\n" @@ -144,7 +144,7 @@ void debug_sub_813C4D4() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_81261B4\n" @@ -172,7 +172,7 @@ void debug_sub_813C500() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -207,7 +207,7 @@ void debug_sub_813C52C() " mov r0, r8\n" " add r1, r4, #0\n" " add r2, r6, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " ldr r0, ._15 + 8\n" " sub r0, r0, r4\n" " add r0, r0, r8\n" @@ -517,7 +517,7 @@ void debug_sub_813C740() " add r0, r6, #0\n" " mov r1, r8\n" " mov r2, r9\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r5, #0\n" " mov r1, #0x19\n" " mov r2, #0x5\n" @@ -564,7 +564,7 @@ void debug_sub_813C740() " sub r0, r0, r1\n" " add r1, r5, #0\n" " mov r2, #0x64\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " ldr r0, ._29 + 20\n" " add r6, r6, r0\n" " mov r0, r8\n" @@ -572,7 +572,7 @@ void debug_sub_813C740() " add r0, r6, #0\n" " mov r1, sp\n" " mov r2, #0x24\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " mov r0, r9\n" " add sp, sp, #0x30\n" " pop {r3, r4, r5}\n" @@ -612,7 +612,7 @@ void debug_sub_813C810() " add r0, r6, #0\n" " add r1, r5, #0\n" " mov r2, r8\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r4, #0\n" " mov r1, #0xc9\n" " mov r2, #0x15\n" @@ -626,13 +626,13 @@ void debug_sub_813C810() " sub r0, r0, r5\n" " add r1, r4, #0\n" " mov r2, #0x64\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " ldr r0, ._31 + 16\n" " add r0, r6, r0\n" " sub r0, r0, r5\n" " mov r1, sp\n" " mov r2, #0x24\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r6, #0\n" " add r1, r5, #0\n" " bl unref_sub_812620C\n" @@ -672,7 +672,7 @@ void debug_sub_813C888() " add r0, r6, #0\n" " add r1, r5, #0\n" " mov r2, r8\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r4, #0\n" " mov r1, #0xc9\n" " mov r2, #0x15\n" @@ -688,13 +688,13 @@ void debug_sub_813C888() " sub r0, r0, r5\n" " add r1, r4, #0\n" " mov r2, #0x64\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " ldr r0, ._33 + 16\n" " add r0, r6, r0\n" " sub r0, r0, r5\n" " mov r1, sp\n" " mov r2, #0x24\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r6, #0\n" " add r1, r5, #0\n" " bl unref_sub_812620C\n" @@ -763,7 +763,7 @@ void debug_sub_813C93C() " sub r5, r5, r6\n" " add r1, r6, #0\n" " add r2, r5, #0\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " bl SavePlayerParty\n" " bl debug_sub_813C904\n" " ldr r1, ._37 + 8\n" @@ -777,7 +777,7 @@ void debug_sub_813C93C() " add r0, r4, #0\n" " mov r1, sp\n" " mov r2, #0xbc\n" - " bl gScriptFuncs_End+0x5bc4\n" + " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" " add r0, r5, #0\n" " add sp, sp, #0xbc\n" " pop {r4, r5, r6}\n" diff --git a/src/engine/save.c b/src/engine/save.c index 5564a6ce3..e1fb47dcc 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -690,7 +690,7 @@ void sub_813B79C() " strh r0, [r1]\n" " add r0, r5, #0\n" " add r1, r4, #0\n" - " bl gScriptFuncs_End+0x2f60\n" + " bl gMysteryEventScriptCmdTableEnd+0x2f60\n" " add r0, r5, #1\n" " lsl r0, r0, #0x10\n" " lsr r5, r0, #0x10\n" @@ -718,7 +718,7 @@ void sub_813B79C() " lsr r4, r4, #0x10\n" " add r0, r4, #0\n" " add r1, r6, #0\n" - " bl gScriptFuncs_End+0x2f60\n" + " bl gMysteryEventScriptCmdTableEnd+0x2f60\n" " add r0, r5, #1\n" " lsl r0, r0, #0x10\n" " lsr r5, r0, #0x10\n" diff --git a/src/field/choose_party.c b/src/field/choose_party.c index 545c19dfa..8a54b0ad0 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -540,7 +540,7 @@ void debug_sub_81381B4() " add r0, r4, #0\n" " mov r1, #0x0\n" " mov r2, #0x60\n" - " bl gScriptFuncs_End+0x5c24\n" + " bl gMysteryEventScriptCmdTableEnd+0x5c24\n" " mov r7, #0x0\n" " mov r8, r4\n" " mov r0, #0x4\n" diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index 747edf816..db674e52f 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -291,7 +291,7 @@ u8 TryDoMetatileBehaviorForcedMovement() " lsr r0, r0, #0x16\n" " add r0, r0, r4\n" " ldr r0, [r0]\n" - " bl gScriptFuncs_End+0x3cf4\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" "._26:\n" @@ -513,7 +513,7 @@ void MovePlayerNotOnBike(u8 u81, u16 u161) " ldr r2, [r0]\n" " add r0, r5, #0\n" " add r1, r6, #0\n" - " bl gScriptFuncs_End+0x3cfc\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cfc\n" "._83:\n" " pop {r4, r5, r6}\n" " pop {r0}\n" @@ -1855,3 +1855,98 @@ static void sub_805A954(void) if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y); } + +#if DEBUG +__attribute__((naked)) +void debug_sub_805F2B0() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " ldr r0, ._422\n" + " ldrh r1, [r0, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._420 @cond_branch\n" + " mov r0, #0x0\n" + " b ._421\n" + "._423:\n" + " .align 2, 0\n" + "._422:\n" + " .word gMain\n" + "._420:\n" + " add r0, r2, #0\n" + " bl debug_sub_805F2DC\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + "._421:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_805F2DC() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne ._424 @cond_branch\n" + " ldr r2, ._426\n" + " ldr r0, ._426 + 4\n" + " ldrb r1, [r0, #0x5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrb r0, [r0, #0x18]\n" + " lsr r0, r0, #0x4\n" + " bl PlayerFaceDirection\n" + " b ._430\n" + "._427:\n" + " .align 2, 0\n" + "._426:\n" + " .word gMapObjects\n" + " .word gPlayerAvatar\n" + "._424:\n" + " ldr r2, ._431\n" + " ldr r0, ._431 + 4\n" + " ldrb r1, [r0, #0x5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrb r0, [r0, #0x1]\n" + " lsr r0, r0, #0x7\n" + " cmp r0, #0\n" + " beq ._429 @cond_branch\n" + " add r0, r4, #0\n" + " bl CanCameraMoveInDirection\n" + " cmp r0, #0\n" + " bne ._429 @cond_branch\n" + " add r0, r4, #0\n" + " bl PlayerOnBikeCollide\n" + " b ._430\n" + "._432:\n" + " .align 2, 0\n" + "._431:\n" + " .word gMapObjects\n" + " .word gPlayerAvatar\n" + "._429:\n" + " add r0, r4, #0\n" + " bl sub_80593F4\n" + "._430:\n" + " mov r0, #0x1\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} +#endif diff --git a/src/field/field_weather.c b/src/field/field_weather.c index b6475d8ff..97eba16e0 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -188,6 +188,45 @@ const u8 gUnknown_083970C8[] = 1, }; +#if DEBUG + +const u8 gDebugText_Weather_0[] = _("なし   "); +const u8 gDebugText_Weather_1[] = _("はれ   "); +const u8 gDebugText_Weather_2[] = _("はれ2  "); +const u8 gDebugText_Weather_3[] = _("あめ   "); +const u8 gDebugText_Weather_4[] = _("ゆき   "); +const u8 gDebugText_Weather_5[] = _("かみなり "); +const u8 gDebugText_Weather_6[] = _("きり   "); +const u8 gDebugText_Weather_7[] = _("かざんばい"); +const u8 gDebugText_Weather_8[] = _("すなあらし"); +const u8 gDebugText_Weather_9[] = _("きり2  "); +const u8 gDebugText_Weather_10[] = _("かいてい "); +const u8 gDebugText_Weather_11[] = _("くもり  "); +const u8 gDebugText_Weather_12[] = _("はれ3  "); +const u8 gDebugText_Weather_13[] = _("おおあめ"); +const u8 gDebugText_Weather_14[] = _("かいてい2"); + +const u8 *const gDebugText_Weather[] = +{ + gDebugText_Weather_0, + gDebugText_Weather_1, + gDebugText_Weather_2, + gDebugText_Weather_3, + gDebugText_Weather_4, + gDebugText_Weather_5, + gDebugText_Weather_6, + gDebugText_Weather_7, + gDebugText_Weather_8, + gDebugText_Weather_9, + gDebugText_Weather_10, + gDebugText_Weather_11, + gDebugText_Weather_12, + gDebugText_Weather_13, + gDebugText_Weather_14, +}; + +#endif + const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); void StartWeather(void) @@ -1159,3 +1198,145 @@ void sub_807DE68(void) { gUnknown_030006DC = gUnknown_083970C8; } + +#if DEBUG + +__attribute__((naked)) +u8 debug_sub_8085564(void) +{ + asm("\ + push {lr}\n\ + mov r2, #0x0\n\ + ldr r0, ._375\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._370 @cond_branch\n\ + ldr r1, ._375 + 4\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xf\n\ + bne ._371 @cond_branch\n\ + strb r2, [r1]\n\ +._371:\n\ + mov r2, #0x1\n\ +._370:\n\ + ldr r0, ._375\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._372 @cond_branch\n\ + ldr r1, ._375 + 4\n\ + ldrb r0, [r1]\n\ + cmp r0, #0\n\ + beq ._373 @cond_branch\n\ + sub r0, r0, #0x1\n\ + b ._374\n\ +._376:\n\ + .align 2, 0\n\ +._375:\n\ + .word gMain\n\ + .word gUnknown_0202FF58+0x2\n\ +._373:\n\ + mov r0, #0xe\n\ +._374:\n\ + strb r0, [r1]\n\ + mov r2, #0x1\n\ +._372:\n\ + cmp r2, #0\n\ + beq ._377 @cond_branch\n\ + mov r0, #0x16\n\ + mov r1, #0x1\n\ + mov r2, #0x1c\n\ + mov r3, #0x2\n\ + bl MenuFillWindowRectWithBlankTile\n\ + ldr r1, ._380\n\ + ldr r0, ._380 + 4\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x17\n\ + mov r2, #0x1\n\ + bl MenuPrint\n\ +._377:\n\ + ldr r0, ._380 + 8\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._378 @cond_branch\n\ + mov r0, #0x0\n\ + b ._379\n\ +._381:\n\ + .align 2, 0\n\ +._380:\n\ + .word gDebugText_Weather\n\ + .word gUnknown_0202FF58+0x2\n\ + .word gMain\n\ +._378:\n\ + ldr r0, ._382\n\ + ldrb r0, [r0]\n\ + bl DoWeatherEffect\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ +._379:\n\ + pop {r1}\n\ + bx r1\n\ +._383:\n\ + .align 2, 0\n\ +._382:\n\ + .word gUnknown_0202FF58+0x2"); +} + +__attribute__((naked)) +u8 debug_sub_808560C(void) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._384\n\ + ldr r0, ._384 + 4\n\ + mov r1, #0xda\n\ + lsl r1, r1, #0x3\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r4]\n\ + bl MenuZeroFillScreen\n\ + mov r0, #0x16\n\ + mov r1, #0x1\n\ + mov r2, #0x1c\n\ + mov r3, #0x2\n\ + bl MenuFillWindowRectWithBlankTile\n\ + ldr r1, ._384 + 8\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x17\n\ + mov r2, #0x1\n\ + bl MenuPrint\n\ + ldr r1, ._384 + 12\n\ + ldr r0, ._384 + 16\n\ + str r0, [r1]\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._385:\n\ + .align 2, 0\n\ +._384:\n\ + .word gUnknown_0202FF58+0x2\n\ + .word gUnknown_0202F7E8\n\ + .word gDebugText_Weather\n\ + .word gCallback_03004AE8\n\ + .word debug_sub_8085564+1"); +} + +#endif diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c index bf8e98403..c200ce2f5 100644 --- a/src/field/fldeff_secretpower.c +++ b/src/field/fldeff_secretpower.c @@ -243,6 +243,102 @@ void sub_80C6280(void) } } +#if DEBUG + +__attribute__((naked)) +void debug_sub_80D93F4() +{ + asm("\ + push {r4, lr}\n\ + bl sub_80BB63C\n\ + ldr r0, ._98\n\ + ldrh r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._95 @cond_branch\n\ + bl player_get_direction_lower_nybble\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x2\n\ + beq ._96 @cond_branch\n\ +._95:\n\ + bl ScriptContext2_Disable\n\ + b ._109\n\ +._99:\n\ + .align 2, 0\n\ +._98:\n\ + .word gScriptResult\n\ +._96:\n\ + ldr r4, ._102\n\ + add r1, r4, #2\n\ + add r0, r4, #0\n\ + bl GetXYCoordsOneStepInFrontOfPlayer\n\ + mov r1, #0x0\n\ + ldsh r0, [r4, r1]\n\ + mov r2, #0x2\n\ + ldsh r1, [r4, r2]\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseCave\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._100 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._102 + 4\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C639C\n\ + b ._109\n\ +._103:\n\ + .align 2, 0\n\ +._102:\n\ + .word gUnknown_0203923C\n\ + .word gLastFieldPokeMenuOpened\n\ +._100:\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseTree\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._104 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._106\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C64A8\n\ + b ._109\n\ +._107:\n\ + .align 2, 0\n\ +._106:\n\ + .word gLastFieldPokeMenuOpened\n\ +._104:\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseShrub\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._108 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._110\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C660C\n\ + b ._109\n\ +._111:\n\ + .align 2, 0\n\ +._110:\n\ + .word gLastFieldPokeMenuOpened\n\ +._108:\n\ + bl ScriptContext2_Disable\n\ +._109:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0"); +} +#endif + bool8 SetUpFieldMove_SecretPower(void) { u8 behavior; diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 00368c2f5..1bce9bc3f 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -277,7 +277,7 @@ void debug_sub_810B32C() " .word ._28\n" " .word ._29\n" "._25:\n" - " bl sub_80F7A34\n" + " bl SetupBard\n" " b ._37\n" "._26:\n" " mov r2, #0x0\n" diff --git a/src/field/party_menu.c b/src/field/party_menu.c index 7994dd60c..75c0cba78 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -4777,7 +4777,8 @@ void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) gMain.newKeys = 0; } -static const u8 *const StatNames[] = { +static const u8 *const StatNames[] = +{ gOtherText_HP, gOtherText_Attack, gOtherText_Defense, @@ -4786,7 +4787,8 @@ static const u8 *const StatNames[] = { gOtherText_Speed, }; -static const u8 StatDataTypes[] = { +static const u8 StatDataTypes[] = +{ MON_DATA_MAX_HP, MON_DATA_ATK, MON_DATA_DEF, @@ -4794,6 +4796,17 @@ static const u8 StatDataTypes[] = { MON_DATA_SPDEF, MON_DATA_SPEED, }; + +#if DEBUG + +const u8 gUnknown_Debug_839B6CE[] = {0x40, 0, 0, 0, 0x44, 0, 0xFF, 0, 0, 0}; + +const u8 gUnknown_Debug_839B6D8[] = _( + "{STR_VAR_1}かい じっこう\n" + "{STR_VAR_2}たんいじかん しょうひ"); + +#endif + void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) { u8 i; diff --git a/src/field/region_map.c b/src/field/region_map.c index a098eb73d..3bd64a8a0 100644 --- a/src/field/region_map.c +++ b/src/field/region_map.c @@ -280,7 +280,7 @@ static u16 sub_80FB9C0(u16); static void sub_80FBA18(void); static bool8 sub_80FBAA0(u16); void CreateRegionMapCursor(u16, u16); -static void sub_80FBCA0(void); +void sub_80FBCA0(void); static void sub_80FBDF8(void); static void sub_80FBE24(void); static void SpriteCB_PlayerIconZoomedOut(struct Sprite *); @@ -1127,7 +1127,7 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) } } -static void sub_80FBCA0(void) +void sub_80FBCA0(void) { if (gRegionMap->cursorSprite != NULL) { diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 3aefa80de..d84a6e592 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -30,6 +30,8 @@ struct UnkStruct1 #define SLOTMACHINE_GFX_TILES 236 #endif +// TODO: figure out which functions are static and which are not. +#define static static void CB2_SlotMachineSetup(void); static void CB2_SlotMachineLoop(void); @@ -77,6 +79,7 @@ static bool8 sub_81023E0(struct Task *task); static bool8 sub_81023FC(struct Task *task); static bool8 sub_8102424(struct Task *task); static bool8 sub_8102460(struct Task *task); +static bool8 debug_sub_8116E74(struct Task *); static void sub_8102484(void); static void sub_81024F0(void); static bool8 sub_8102540(void); @@ -230,11 +233,59 @@ static const u8 gUnknown_083ECE3A[]; static const u16 gUnknown_083ECE42[]; static const u16 gUnknown_083ECE48[]; +#if DEBUG +__attribute__((naked)) +void PlaySlotMachine(u8 arg0, MainCallback cb) +{ + asm("\ + push {lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r3, ._1\n\ + mov r2, #0x0\n\ + strb r2, [r3]\n\ + bl sub_81019B0\n\ + ldr r0, ._1 + 4\n\ + bl SetMainCallback2\n\ + pop {r0}\n\ + bx r0\n\ +._2:\n\ + .align 2, 0\n\ +._1:\n\ + .word unk_debug_bss_1+0x1\n\ + .word sub_81018B8+1"); +} +#else void PlaySlotMachine(u8 arg0, MainCallback cb) { PlaySlotMachine_Internal(arg0, cb); SetMainCallback2(CB2_SlotMachineSetup); } +#endif + +#if DEBUG +__attribute__((naked)) +void debug_sub_811609C() +{ + asm("\ + push {lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r3, ._3\n\ + mov r2, #0x1\n\ + strb r2, [r3]\n\ + bl sub_81019B0\n\ + ldr r0, ._3 + 4\n\ + bl SetMainCallback2\n\ + pop {r0}\n\ + bx r0\n\ +._4:\n\ + .align 2, 0\n\ +._3:\n\ + .word unk_debug_bss_1+0x1\n\ + .word sub_81018B8+1"); +} +#endif static void CB2_SlotMachineSetup(void) { @@ -367,6 +418,135 @@ static void SlotMachineSetup_2_1(void) static const s16 gUnknown_083ECCF8[][2]; +#if DEBUG +__attribute__((naked)) +static void SlotMachineSetup_0_1(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + bl sub_81019EC\n\ + ldr r5, ._43\n\ + mov r4, #0x0\n\ + strb r4, [r5]\n\ + strb r4, [r5, #0x2]\n\ + bl Random\n\ + mov r1, #0x1\n\ + and r1, r1, r0\n\ + strb r1, [r5, #0x3]\n\ + strb r4, [r5, #0x4]\n\ + mov r0, #0x0\n\ + strh r4, [r5, #0x8]\n\ + strb r0, [r5, #0xa]\n\ + strb r0, [r5, #0xb]\n\ + ldr r0, ._43 + 4\n\ + ldr r1, ._43 + 8\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + strh r0, [r5, #0xc]\n\ + strh r4, [r5, #0xe]\n\ + strh r4, [r5, #0x10]\n\ + strh r4, [r5, #0x12]\n\ + strh r4, [r5, #0x18]\n\ + mov r0, #0x8\n\ + strh r0, [r5, #0x1a]\n\ + add r1, r5, #0\n\ + add r1, r1, #0x58\n\ + mov r0, #0xf0\n\ + strh r0, [r1]\n\ + add r1, r1, #0x2\n\ + mov r0, #0xa0\n\ + strh r0, [r1]\n\ + add r0, r5, #0\n\ + add r0, r0, #0x5c\n\ + mov r1, #0x3f\n\ + strh r1, [r0]\n\ + add r0, r0, #0x2\n\ + strh r1, [r0]\n\ + bl GetCurrentMapMusic\n\ + add r1, r5, #0\n\ + add r1, r1, #0x60\n\ + strh r0, [r1]\n\ + mov r7, #0x0\n\ + add r6, r5, #0\n\ + ldr r2, ._43 + 12\n\ + mov sl, r2\n\ + mov r0, #0x1c\n\ + add r0, r0, r6\n\ + mov r9, r0\n\ +._41:\n\ + lsl r5, r7, #0x1\n\ + mov r1, #0x22\n\ + add r1, r1, r6\n\ + mov r8, r1\n\ + add r1, r5, r1\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + add r4, r6, #0\n\ + add r4, r4, #0x28\n\ + add r4, r5, r4\n\ + ldrb r0, [r6, #0x3]\n\ + lsl r0, r0, #0x1\n\ + lsl r1, r7, #0x2\n\ + add r0, r0, r1\n\ + add r0, r0, sl\n\ + mov r2, #0x0\n\ + ldsh r0, [r0, r2]\n\ + mov r1, #0x15\n\ + bl __modsi3\n\ + strh r0, [r4]\n\ + add r5, r5, r9\n\ + mov r1, #0x0\n\ + ldsh r0, [r4, r1]\n\ + lsl r1, r0, #0x1\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + mov r2, #0xfc\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + sub r0, r0, r1\n\ + strh r0, [r5]\n\ + mov r1, #0x0\n\ + ldsh r0, [r5, r1]\n\ + add r1, r2, #0\n\ + bl __modsi3\n\ + strh r0, [r5]\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + cmp r7, #0x2\n\ + bls ._41 @cond_branch\n\ + bl debug_sub_811B5D0\n\ + ldr r0, ._43 + 16\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._42 @cond_branch\n\ + mov r1, r8\n\ + sub r1, r1, #0x22\n\ + mov r0, #0xfa\n\ + lsl r0, r0, #0x2\n\ + strh r0, [r1, #0xc]\n\ +._42:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._44:\n\ + .align 2, 0\n\ +._43:\n\ + .word +0x2000000\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word gUnknown_083ECCF8\n\ + .word unk_debug_bss_1+0x1"); +} +#else static void SlotMachineSetup_0_1(void) { u8 i; @@ -398,6 +578,7 @@ static void SlotMachineSetup_0_1(void) eSlotMachine->unk1C[i] %= 0x1f8; } } +#endif static void SlotMachineSetup_3_0(void) { @@ -442,7 +623,8 @@ static void sub_8101D04(void) sub_8101D24(CreateTask(sub_8101D24, 0)); } -static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = { +static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = +{ sub_8101D5C, sub_8101D8C, sub_8101DB0, @@ -471,7 +653,10 @@ static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = { sub_81023E0, sub_81023FC, sub_8102424, - sub_8102460 + sub_8102460, +#if DEBUG + debug_sub_8116E74, +#endif }; static void sub_8101D24(u8 taskId) @@ -524,6 +709,46 @@ static bool8 sub_8101DF4(struct Task *task) return FALSE; } +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101E10(struct Task *task) +{ + asm("\ + push {lr}\n\ + mov r0, #0x0\n\ + bl sub_8104CAC\n\ + ldr r2, ._70\n\ + mov r0, #0x5\n\ + strb r0, [r2]\n\ + ldr r0, ._70 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._67 @cond_branch\n\ + ldr r0, ._70 + 8\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._69 @cond_branch\n\ +._67:\n\ + mov r0, #0xc\n\ + ldsh r1, [r2, r0]\n\ + ldr r0, ._70 + 12\n\ + cmp r1, r0\n\ + ble ._69 @cond_branch\n\ + mov r0, #0x17\n\ + strb r0, [r2]\n\ +._69:\n\ + mov r0, #0x1\n\ + pop {r1}\n\ + bx r1\n\ +._71:\n\ + .align 2, 0\n\ +._70:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1+0x1\n\ + .word unk_debug_bss_1+0x4\n\ + .word 0x270e"); +} +#else static bool8 sub_8101E10(struct Task *task) { sub_8104CAC(0); @@ -534,7 +759,205 @@ static bool8 sub_8101E10(struct Task *task) } return TRUE; } +#endif +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101E3C(struct Task *task) +{ + asm("\ + push {r4, r5, lr}\n\ + ldr r0, ._77\n\ + ldrb r1, [r0]\n\ + add r3, r0, #0\n\ + ldr r5, ._77 + 4\n\ + cmp r1, #0\n\ + beq ._76 @cond_branch\n\ + ldr r2, ._77 + 8\n\ + ldrb r0, [r2]\n\ + cmp r0, #0\n\ + beq ._76 @cond_branch\n\ + ldr r4, ._77 + 12\n\ + mov r1, #0xc\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0x3\n\ + ble ._74 @cond_branch\n\ + ldrh r1, [r5, #0x2c]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._75 @cond_branch\n\ +._74:\n\ + mov r0, #0x0\n\ + strb r0, [r2]\n\ + b ._76\n\ +._78:\n\ + .align 2, 0\n\ +._77:\n\ + .word unk_debug_bss_1+0x1\n\ + .word gMain\n\ + .word unk_debug_bss_1+0x4\n\ + .word +0x2000000\n\ +._75:\n\ + mov r0, #0x0\n\ + bl sub_8103D50\n\ + mov r0, #0x1\n\ + bl sub_8103D50\n\ + mov r0, #0x2\n\ + bl sub_8103D50\n\ + ldrh r0, [r4, #0xc]\n\ + sub r0, r0, #0x3\n\ + strh r0, [r4, #0xc]\n\ + mov r0, #0x3\n\ + strh r0, [r4, #0x12]\n\ + mov r0, #0x9\n\ + strb r0, [r4]\n\ + b ._102\n\ +._76:\n\ + ldrb r0, [r3]\n\ + cmp r0, #0\n\ + beq ._81 @cond_branch\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._81 @cond_branch\n\ + bl debug_sub_811B620\n\ + ldr r1, ._83\n\ + mov r0, #0x1d\n\ + strb r0, [r1]\n\ + b ._102\n\ +._84:\n\ + .align 2, 0\n\ +._83:\n\ + .word +0x2000000\n\ +._81:\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._85 @cond_branch\n\ + mov r0, #0x0\n\ + bl sub_8104AB8\n\ + ldr r1, ._87\n\ + mov r0, #0x8\n\ + strb r0, [r1]\n\ + b ._102\n\ +._88:\n\ + .align 2, 0\n\ +._87:\n\ + .word +0x2000000\n\ +._85:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._89 @cond_branch\n\ + ldr r2, ._94\n\ + mov r3, #0xc\n\ + ldsh r0, [r2, r3]\n\ + sub r0, r0, #0x3\n\ + mov r3, #0x12\n\ + ldsh r1, [r2, r3]\n\ + add r0, r0, r1\n\ + cmp r0, #0\n\ + blt ._90 @cond_branch\n\ + ldrh r4, [r2, #0x12]\n\ + add r0, r1, #0\n\ + cmp r0, #0x2\n\ + bgt ._91 @cond_branch\n\ +._92:\n\ + lsl r0, r4, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl sub_8103D50\n\ + lsl r0, r4, #0x10\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x9\n\ + add r0, r0, r2\n\ + lsr r4, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x2\n\ + ble ._92 @cond_branch\n\ +._91:\n\ + ldr r1, ._94\n\ + ldrh r0, [r1, #0xc]\n\ + sub r0, r0, #0x3\n\ + ldrh r3, [r1, #0x12]\n\ + add r0, r0, r3\n\ + strh r0, [r1, #0xc]\n\ + mov r0, #0x3\n\ + strh r0, [r1, #0x12]\n\ + mov r0, #0x9\n\ + strb r0, [r1]\n\ + mov r0, #0x5f\n\ + bl PlaySE\n\ + b ._102\n\ +._95:\n\ + .align 2, 0\n\ +._94:\n\ + .word +0x2000000\n\ +._90:\n\ + mov r0, #0x6\n\ + b ._96\n\ +._89:\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._98 @cond_branch\n\ + ldr r4, ._103\n\ + mov r1, #0xc\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0\n\ + beq ._98 @cond_branch\n\ + mov r0, #0x5f\n\ + bl PlaySE\n\ + ldrb r0, [r4, #0x12]\n\ + bl sub_8103D50\n\ + ldrh r0, [r4, #0xc]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r4, #0xc]\n\ + ldrh r0, [r4, #0x12]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0x12]\n\ +._98:\n\ + ldr r0, ._103\n\ + mov r2, #0x12\n\ + ldsh r1, [r0, r2]\n\ + add r2, r0, #0\n\ + ldr r5, ._103 + 4\n\ + cmp r1, #0x2\n\ + bgt ._99 @cond_branch\n\ + cmp r1, #0\n\ + beq ._101 @cond_branch\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._101 @cond_branch\n\ +._99:\n\ + mov r0, #0x9\n\ + strb r0, [r2]\n\ +._101:\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._102 @cond_branch\n\ + mov r0, #0x15\n\ +._96:\n\ + strb r0, [r2]\n\ +._102:\n\ + mov r0, #0x0\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1\n\ +._104:\n\ + .align 2, 0\n\ +._103:\n\ + .word +0x2000000\n\ + .word gMain"); +} +#else static bool8 sub_8101E3C(struct Task *task) { s16 i; @@ -582,6 +1005,7 @@ static bool8 sub_8101E3C(struct Task *task) } return FALSE; } +#endif static void sub_8101F2C(const u8 *str) { @@ -615,6 +1039,71 @@ static bool8 sub_8101F88(struct Task *task) return FALSE; } +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101FA4(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + add r4, r0, #0\n\ + bl sub_8102484\n\ + bl sub_8104DA4\n\ + mov r0, #0x0\n\ + bl sub_8102DEC\n\ + mov r0, #0x1\n\ + bl sub_8102DEC\n\ + mov r0, #0x2\n\ + bl sub_8102DEC\n\ + mov r0, #0x0\n\ + strh r0, [r4, #0x8]\n\ + ldr r4, ._115\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._113 @cond_branch\n\ + bl sub_810430C\n\ + mov r0, #0xa\n\ + b ._114\n\ +._116:\n\ + .align 2, 0\n\ +._115:\n\ + .word +0x2000000\n\ +._113:\n\ + mov r0, #0x1\n\ + bl sub_8104CAC\n\ + mov r0, #0xb\n\ +._114:\n\ + strb r0, [r4]\n\ + ldr r4, ._119\n\ + mov r0, #0x8\n\ + strh r0, [r4, #0x1a]\n\ + ldrb r0, [r4, #0xa]\n\ + cmp r0, #0\n\ + beq ._117 @cond_branch\n\ + bl dp15_jump_random_unknown\n\ + strh r0, [r4, #0x1a]\n\ +._117:\n\ + ldr r0, ._119 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._118 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x68\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._118:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._120:\n\ + .align 2, 0\n\ +._119:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1+0x1"); +} +#else static bool8 sub_8101FA4(struct Task *task) { sub_8102484(); @@ -640,6 +1129,7 @@ static bool8 sub_8101FA4(struct Task *task) } return FALSE; } +#endif static bool8 sub_8102008(struct Task *task) { @@ -652,6 +1142,52 @@ static bool8 sub_8102008(struct Task *task) return FALSE; } +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102034(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldrh r1, [r0, #0x8]\n\ + add r1, r1, #0x1\n\ + strh r1, [r0, #0x8]\n\ + lsl r1, r1, #0x10\n\ + asr r1, r1, #0x10\n\ + cmp r1, #0x1d\n\ + ble ._124 @cond_branch\n\ + ldr r0, ._127\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._126 @cond_branch\n\ + ldr r0, ._127 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._126 @cond_branch\n\ + ldr r4, ._127 + 8\n\ + bl Random\n\ + mov r1, #0x1f\n\ + and r1, r1, r0\n\ + add r1, r1, #0x1\n\ + str r1, [r4]\n\ +._126:\n\ + bl sub_81024F0\n\ + ldr r1, ._127 + 12\n\ + mov r0, #0xc\n\ + strb r0, [r1]\n\ +._124:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._128:\n\ + .align 2, 0\n\ +._127:\n\ + .word unk_debug_bss_1+0x1\n\ + .word unk_debug_bss_1+0x4\n\ + .word unk_debug_bss_1+0x8\n\ + .word +0x2000000"); +} +#else static bool8 sub_8102034(struct Task *task) { if (++task->data[0] >= 30) @@ -661,7 +1197,77 @@ static bool8 sub_8102034(struct Task *task) } return FALSE; } +#endif +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102058(struct Task *task) +{ + asm("\ + push {r4, r5, lr}\n\ + ldr r0, ._133\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._130 @cond_branch\n\ + ldr r0, ._133 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._130 @cond_branch\n\ + ldr r5, ._133 + 8\n\ + ldr r0, [r5]\n\ + sub r0, r0, #0x1\n\ + str r0, [r5]\n\ + cmp r0, #0\n\ + bne ._135 @cond_branch\n\ + mov r0, #0x18\n\ + bl PlaySE\n\ + ldr r4, ._133 + 12\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E1C\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8103C14\n\ + bl Random\n\ + mov r1, #0x1f\n\ + and r1, r1, r0\n\ + add r1, r1, #0x1\n\ + str r1, [r5]\n\ + b ._132\n\ +._134:\n\ + .align 2, 0\n\ +._133:\n\ + .word unk_debug_bss_1+0x1\n\ + .word unk_debug_bss_1+0x4\n\ + .word unk_debug_bss_1+0x8\n\ + .word +0x2000000\n\ +._130:\n\ + ldr r0, ._136\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._135 @cond_branch\n\ + mov r0, #0x18\n\ + bl PlaySE\n\ + ldr r4, ._136 + 4\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E1C\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8103C14\n\ +._132:\n\ + mov r0, #0xd\n\ + strb r0, [r4]\n\ +._135:\n\ + mov r0, #0x0\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1\n\ +._137:\n\ + .align 2, 0\n\ +._136:\n\ + .word gMain\n\ + .word +0x2000000"); +} +#else static bool8 sub_8102058(struct Task *task) { if (gMain.newKeys & A_BUTTON) @@ -673,7 +1279,121 @@ static bool8 sub_8102058(struct Task *task) } return FALSE; } +#endif +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102090(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._146\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E40\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + bne ._138 @cond_branch\n\ + ldrh r0, [r4, #0x18]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0x18]\n\ + mov r1, #0xc\n\ + strb r1, [r4]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x2\n\ + ble ._161 @cond_branch\n\ + mov r0, #0xe\n\ + strb r0, [r4]\n\ + ldr r0, ._146 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x8\n\ + beq ._140 @cond_branch\n\ + cmp r0, #0x8\n\ + bgt ._141 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._142 @cond_branch\n\ + cmp r0, #0x2\n\ + bgt ._143 @cond_branch\n\ + cmp r0, #0x1\n\ + beq ._144 @cond_branch\n\ + b ._161\n\ +._147:\n\ + .align 2, 0\n\ +._146:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1\n\ +._143:\n\ + cmp r0, #0x4\n\ + beq ._148 @cond_branch\n\ + b ._161\n\ +._141:\n\ + cmp r0, #0x40\n\ + beq ._150 @cond_branch\n\ + cmp r0, #0x40\n\ + bgt ._151 @cond_branch\n\ + cmp r0, #0x10\n\ + beq ._152 @cond_branch\n\ + b ._161\n\ +._151:\n\ + cmp r0, #0x80\n\ + beq ._154 @cond_branch\n\ + b ._161\n\ +._142:\n\ + mov r0, #0x14\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x12\n\ + b ._160\n\ +._144:\n\ + mov r0, #0x14\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x12\n\ + b ._160\n\ +._148:\n\ + mov r0, #0x3\n\ + strh r0, [r4, #0x28]\n\ + mov r0, #0x1\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x2\n\ + b ._160\n\ +._140:\n\ + strh r2, [r4, #0x28]\n\ + mov r0, #0x2\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x3\n\ + b ._160\n\ +._152:\n\ + mov r0, #0x2\n\ + strh r0, [r4, #0x28]\n\ + mov r0, #0x5\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x14\n\ + b ._160\n\ +._150:\n\ + mov r0, #0x13\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + strh r2, [r4, #0x2c]\n\ + b ._161\n\ +._154:\n\ + mov r0, #0x13\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ +._160:\n\ + strh r0, [r4, #0x2c]\n\ +._161:\n\ + mov r0, #0x1\n\ + b ._162\n\ +._138:\n\ + mov r0, #0x0\n\ +._162:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1"); +} +#else static bool8 sub_8102090(struct Task *task) { if (!sub_8102E40(eSlotMachine->unk18)) @@ -688,7 +1408,168 @@ static bool8 sub_8102090(struct Task *task) } return FALSE; } +#endif +#if DEBUG +__attribute__((naked)) +static bool8 sub_81020C8(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._165\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0xc0\n\ + and r0, r0, r1\n\ + strb r0, [r4, #0x4]\n\ + bl sub_81027A0\n\ + ldrb r0, [r4, #0xa]\n\ + cmp r0, #0\n\ + beq ._163 @cond_branch\n\ + sub r0, r0, #0x1\n\ + strb r0, [r4, #0xa]\n\ + ldrb r0, [r4, #0xb]\n\ + add r0, r0, #0x1\n\ + strb r0, [r4, #0xb]\n\ + b ._164\n\ +._166:\n\ + .align 2, 0\n\ +._165:\n\ + .word +0x2000000\n\ +._163:\n\ + bl debug_sub_811B894\n\ +._164:\n\ + ldr r4, ._171\n\ + ldrh r0, [r4, #0x8]\n\ + cmp r0, #0\n\ + beq ._167 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x6c\n\ + mov r2, #0xe\n\ + ldsh r1, [r4, r2]\n\ + bl debug_sub_811B5B4\n\ + mov r0, #0xf\n\ + strb r0, [r4]\n\ + bl sub_8102A24\n\ + bl sub_8103F70\n\ + ldrh r0, [r4, #0x10]\n\ + ldrh r1, [r4, #0xe]\n\ + sub r0, r0, r1\n\ + strh r0, [r4, #0x10]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._168 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r4, #0x10]\n\ +._168:\n\ + ldrh r1, [r4, #0x8]\n\ + mov r0, #0xc0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._169 @cond_branch\n\ + ldr r0, ._171 + 4\n\ + bl PlayFanfare\n\ + mov r0, #0x6\n\ + bl sub_8104CAC\n\ + b ._174\n\ +._172:\n\ + .align 2, 0\n\ +._171:\n\ + .word +0x2000000\n\ + .word 0x185\n\ +._169:\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._173 @cond_branch\n\ + ldr r0, ._175\n\ + bl PlayFanfare\n\ + mov r0, #0x5\n\ + bl sub_8104CAC\n\ + b ._174\n\ +._176:\n\ + .align 2, 0\n\ +._175:\n\ + .word 0x185\n\ +._173:\n\ + mov r0, #0xc3\n\ + lsl r0, r0, #0x1\n\ + bl PlayFanfare\n\ + mov r0, #0x2\n\ + bl sub_8104CAC\n\ +._174:\n\ + ldr r1, ._183\n\ + ldrh r3, [r1, #0x8]\n\ + mov r0, #0xe0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + add r2, r1, #0\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + ldrb r1, [r2, #0x4]\n\ + mov r0, #0x3f\n\ + and r0, r0, r1\n\ + mov r1, #0x0\n\ + strb r0, [r2, #0x4]\n\ + mov r0, #0xc0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + strb r1, [r2, #0xa]\n\ + strb r1, [r2, #0xb]\n\ + strb r1, [r2, #0x3]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + mov r0, #0x1\n\ + strb r0, [r2, #0x3]\n\ +._179:\n\ + ldrh r1, [r2, #0x8]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._185 @cond_branch\n\ + ldrb r0, [r2, #0x2]\n\ + cmp r0, #0xf\n\ + bhi ._185 @cond_branch\n\ + add r0, r0, #0x1\n\ + strb r0, [r2, #0x2]\n\ + ldrb r0, [r2, #0x2]\n\ + bl sub_8104064\n\ + b ._185\n\ +._184:\n\ + .align 2, 0\n\ +._183:\n\ + .word +0x2000000\n\ +._167:\n\ + mov r0, #0x3\n\ + bl sub_8104CAC\n\ + mov r0, #0x14\n\ + strb r0, [r4]\n\ + ldrh r0, [r4, #0x12]\n\ + ldrh r1, [r4, #0x10]\n\ + add r0, r0, r1\n\ + strh r0, [r4, #0x10]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + ldr r1, ._186\n\ + cmp r0, r1\n\ + ble ._185 @cond_branch\n\ + strh r1, [r4, #0x10]\n\ +._185:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._187:\n\ + .align 2, 0\n\ +._186:\n\ + .word 0x270f"); +} +#else static bool8 sub_81020C8(struct Task *task) { eSlotMachine->unk04 &= 0xc0; @@ -753,6 +1634,7 @@ static bool8 sub_81020C8(struct Task *task) } return FALSE; } +#endif static bool8 sub_81021E0(struct Task *task) { @@ -903,6 +1785,48 @@ static bool8 sub_81023FC(struct Task *task) return FALSE; } +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102424(struct Task *task) +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._234\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._233 @cond_branch\n\ + ldr r0, ._234 + 4\n\ + ldr r1, ._234 + 8\n\ + ldrh r1, [r1, #0xc]\n\ + ldr r2, ._234 + 12\n\ + add r0, r0, r2\n\ + strh r1, [r0]\n\ +._233:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, ._234 + 8\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + mov r0, #0x0\n\ + add sp, sp, #0x4\n\ + pop {r1}\n\ + bx r1\n\ +._235:\n\ + .align 2, 0\n\ +._234:\n\ + .word unk_debug_bss_1+0x1\n\ + .word gSaveBlock1\n\ + .word +0x2000000\n\ + .word 0x494"); +} +#else static bool8 sub_8102424(struct Task *task) { gSaveBlock1.coins = eSlotMachine->coins; @@ -910,6 +1834,7 @@ static bool8 sub_8102424(struct Task *task) eSlotMachine->state++; return FALSE; } +#endif static bool8 sub_8102460(struct Task *task) { @@ -920,6 +1845,272 @@ static bool8 sub_8102460(struct Task *task) return FALSE; } +#if DEBUG +__attribute__((naked)) +static bool8 debug_sub_8116E74(struct Task *task) +{ + asm("\ + push {lr}\n\ + bl debug_sub_811B634\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._239 @cond_branch\n\ + ldr r1, ._240\n\ + mov r0, #0x5\n\ + strb r0, [r1]\n\ +._239:\n\ + mov r0, #0x0\n\ + pop {r1}\n\ + bx r1\n\ +._241:\n\ + .align 2, 0\n\ +._240:\n\ + .word +0x2000000"); +} +#endif + +#if DEBUG +__attribute__((naked)) +static void sub_8102484(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + ldr r0, ._256\n\ + ldrb r2, [r0, #0xa]\n\ + add r4, r0, #0\n\ + cmp r2, #0\n\ + beq ._242 @cond_branch\n\ + b ._270\n\ +._242:\n\ + ldr r0, ._256 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._245 @cond_branch\n\ + ldr r3, ._256 + 8\n\ + ldrb r0, [r3]\n\ + cmp r0, #0\n\ + beq ._245 @cond_branch\n\ + ldr r0, ._256 + 12\n\ + ldrb r1, [r0]\n\ + strb r1, [r4, #0x4]\n\ + strb r2, [r3]\n\ + strb r2, [r0]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._246 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x88\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._246:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._247 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x84\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._247:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._248 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x8c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._248:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._249 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x80\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._249:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._250 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x7c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._250:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._251 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x78\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._251:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._252 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x74\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._252:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._253 @cond_branch\n\ + b ._270\n\ +._253:\n\ + add r0, r4, #0\n\ + add r0, r0, #0x70\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ + b ._270\n\ +._257:\n\ + .align 2, 0\n\ +._256:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1+0x1\n\ + .word unk_debug_bss_1+0x2\n\ + .word unk_debug_bss_1+0x3\n\ +._245:\n\ + add r5, r4, #0\n\ + ldrb r1, [r5, #0x4]\n\ + mov r0, #0xc0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._270 @cond_branch\n\ + bl sub_8102540\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._260 @cond_branch\n\ + bl sub_8102578\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + cmp r6, #0x3\n\ + beq ._260 @cond_branch\n\ + ldr r1, ._271\n\ + lsl r0, r6, #0x1\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + ldrb r0, [r5, #0x4]\n\ + orr r0, r0, r1\n\ + strb r0, [r5, #0x4]\n\ + mov r1, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._261 @cond_branch\n\ + add r0, r5, #0\n\ + add r0, r0, #0x88\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._261:\n\ + ldrb r1, [r5, #0x4]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._262 @cond_branch\n\ + add r0, r5, #0\n\ + add r0, r0, #0x84\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._262:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._263 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x8c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._263:\n\ + cmp r6, #0x1\n\ + bne ._270 @cond_branch\n\ +._260:\n\ + bl sub_81025BC\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + cmp r6, #0x5\n\ + beq ._270 @cond_branch\n\ + ldr r4, ._271 + 4\n\ + ldr r1, ._271 + 8\n\ + lsl r0, r6, #0x1\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + ldrb r0, [r4, #0x4]\n\ + orr r0, r0, r1\n\ + strb r0, [r4, #0x4]\n\ + mov r1, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._266 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x80\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._266:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._267 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x7c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._267:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._268 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x78\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._268:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._269 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x74\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._269:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._270 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x70\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._270:\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._272:\n\ + .align 2, 0\n\ +._271:\n\ + .word gUnknown_083ECE42\n\ + .word +0x2000000\n\ + .word gUnknown_083ECE48"); +} +#else static void sub_8102484(void) { u8 r3; @@ -945,6 +2136,7 @@ static void sub_8102484(void) } } } +#endif static void sub_81024F0(void) { @@ -3993,12 +5185,12 @@ __attribute__((naked)) void debug_sub_811B1C4() { asm( - " ldr r1, ._1\n" + " ldr r1, .__1_\n" " ldrb r0, [r1]\n" " mov r3, #0x2\n" " orr r0, r0, r3\n" " strb r0, [r1]\n" - " ldr r2, ._1 + 4\n" + " ldr r2, .__1_ + 4\n" " ldrb r1, [r2]\n" " mov r0, #0x2\n" " eor r1, r1, r0\n" @@ -4008,9 +5200,9 @@ void debug_sub_811B1C4() " and r0, r0, r3\n" " strb r0, [r2]\n" " bx lr\n" - "._2:\n" + ".__2_:\n" " .align 2, 0\n" - "._1:\n" + ".__1_:\n" " .word unk_debug_bss_1+0x3\n" " .word unk_debug_bss_1\n" "\n" @@ -4021,12 +5213,12 @@ __attribute__((naked)) void debug_sub_811B1EC() { asm( - " ldr r2, ._3\n" + " ldr r2, .__3\n" " ldrb r0, [r2]\n" " mov r1, #0x1\n" " orr r0, r0, r1\n" " strb r0, [r2]\n" - " ldr r2, ._3 + 4\n" + " ldr r2, .__3 + 4\n" " ldrb r0, [r2]\n" " mov r1, #0x1\n" " eor r0, r0, r1\n" @@ -4034,9 +5226,9 @@ void debug_sub_811B1EC() " lsr r0, r0, #0x1f\n" " strb r0, [r2]\n" " bx lr\n" - "._4:\n" + ".__4:\n" " .align 2, 0\n" - "._3:\n" + ".__3:\n" " .word unk_debug_bss_1+0x3\n" " .word unk_debug_bss_1\n" "\n" @@ -4047,12 +5239,12 @@ __attribute__((naked)) void debug_sub_811B210() { asm( - " ldr r1, ._5\n" + " ldr r1, .__5\n" " ldrb r0, [r1]\n" " mov r3, #0x4\n" " orr r0, r0, r3\n" " strb r0, [r1]\n" - " ldr r2, ._5 + 4\n" + " ldr r2, .__5 + 4\n" " ldrb r1, [r2]\n" " mov r0, #0x4\n" " eor r1, r1, r0\n" @@ -4062,9 +5254,9 @@ void debug_sub_811B210() " and r0, r0, r3\n" " strb r0, [r2]\n" " bx lr\n" - "._6:\n" + ".__6:\n" " .align 2, 0\n" - "._5:\n" + ".__5:\n" " .word unk_debug_bss_1+0x3\n" " .word unk_debug_bss_1\n" "\n" @@ -4075,12 +5267,12 @@ __attribute__((naked)) void debug_sub_811B238() { asm( - " ldr r1, ._7\n" + " ldr r1, .__7\n" " ldrb r0, [r1]\n" " mov r3, #0x8\n" " orr r0, r0, r3\n" " strb r0, [r1]\n" - " ldr r2, ._7 + 4\n" + " ldr r2, .__7 + 4\n" " ldrb r1, [r2]\n" " mov r0, #0x8\n" " eor r1, r1, r0\n" @@ -4090,9 +5282,9 @@ void debug_sub_811B238() " and r0, r0, r3\n" " strb r0, [r2]\n" " bx lr\n" - "._8:\n" + ".__8:\n" " .align 2, 0\n" - "._7:\n" + ".__7:\n" " .word unk_debug_bss_1+0x3\n" " .word unk_debug_bss_1\n" "\n" @@ -4103,12 +5295,12 @@ __attribute__((naked)) void debug_sub_811B260() { asm( - " ldr r1, ._9\n" + " ldr r1, .__9\n" " ldrb r0, [r1]\n" " mov r3, #0x10\n" " orr r0, r0, r3\n" " strb r0, [r1]\n" - " ldr r2, ._9 + 4\n" + " ldr r2, .__9 + 4\n" " ldrb r1, [r2]\n" " mov r0, #0x10\n" " eor r1, r1, r0\n" @@ -4118,9 +5310,9 @@ void debug_sub_811B260() " and r0, r0, r3\n" " strb r0, [r2]\n" " bx lr\n" - "._10:\n" + ".__10:\n" " .align 2, 0\n" - "._9:\n" + ".__9:\n" " .word unk_debug_bss_1+0x3\n" " .word unk_debug_bss_1\n" "\n" @@ -4131,12 +5323,12 @@ __attribute__((naked)) void debug_sub_811B288() { asm( - " ldr r1, ._11\n" + " ldr r1, .__11\n" " ldrb r0, [r1]\n" " mov r3, #0x40\n" " orr r0, r0, r3\n" " strb r0, [r1]\n" - " ldr r2, ._11 + 4\n" + " ldr r2, .__11 + 4\n" " ldrb r1, [r2]\n" " mov r0, #0x40\n" " eor r1, r1, r0\n" @@ -4146,9 +5338,9 @@ void debug_sub_811B288() " and r0, r0, r3\n" " strb r0, [r2]\n" " bx lr\n" - "._12:\n" + ".__12:\n" " .align 2, 0\n" - "._11:\n" + ".__11:\n" " .word unk_debug_bss_1+0x3\n" " .word unk_debug_bss_1\n" "\n" @@ -4159,12 +5351,12 @@ __attribute__((naked)) void debug_sub_811B2B0() { asm( - " ldr r1, ._13\n" + " ldr r1, .__13\n" " ldrb r0, [r1]\n" " mov r3, #0x80\n" " orr r0, r0, r3\n" " strb r0, [r1]\n" - " ldr r2, ._13 + 4\n" + " ldr r2, .__13 + 4\n" " ldrb r1, [r2]\n" " mov r0, #0x80\n" " eor r1, r1, r0\n" @@ -4174,9 +5366,9 @@ void debug_sub_811B2B0() " and r0, r0, r3\n" " strb r0, [r2]\n" " bx lr\n" - "._14:\n" + ".__14:\n" " .align 2, 0\n" - "._13:\n" + ".__13:\n" " .word unk_debug_bss_1+0x3\n" " .word unk_debug_bss_1\n" "\n" @@ -4187,15 +5379,15 @@ __attribute__((naked)) void debug_sub_811B2D8() { asm( - " ldr r0, ._15\n" + " ldr r0, .__15\n" " ldrb r1, [r0]\n" " mov r2, #0x20\n" " orr r1, r1, r2\n" " strb r1, [r0]\n" " bx lr\n" - "._16:\n" + ".__16:\n" " .align 2, 0\n" - "._15:\n" + ".__15:\n" " .word unk_debug_bss_1+0x3\n" "\n" ); @@ -4207,7 +5399,7 @@ void debug_sub_811B2E8() asm( " push {lr}\n" " add sp, sp, #0xfffffffc\n" - " ldr r0, ._17\n" + " ldr r0, .__17\n" " ldrb r1, [r0, #0x1]\n" " add r1, r1, #0x1\n" " mov r0, sp\n" @@ -4221,9 +5413,9 @@ void debug_sub_811B2E8() " add sp, sp, #0x4\n" " pop {r0}\n" " bx r0\n" - "._18:\n" + ".__18:\n" " .align 2, 0\n" - "._17:\n" + ".__17:\n" " .word +0x2000000\n" "\n" ); @@ -4235,90 +5427,90 @@ void debug_sub_811B310() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffff8\n" - " ldr r0, ._21\n" + " ldr r0, .__21\n" " mov r1, #0x1\n" " mov r2, #0x1\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 4\n" + " ldr r0, .__21 + 4\n" " mov r1, #0x1\n" " mov r2, #0x3\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 8\n" + " ldr r0, .__21 + 8\n" " mov r1, #0x1\n" " mov r2, #0x5\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 12\n" + " ldr r0, .__21 + 12\n" " mov r1, #0x1\n" " mov r2, #0x7\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 16\n" + " ldr r0, .__21 + 16\n" " mov r1, #0x1\n" " mov r2, #0x9\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 20\n" + " ldr r0, .__21 + 20\n" " mov r1, #0x1\n" " mov r2, #0xb\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 24\n" + " ldr r0, .__21 + 24\n" " mov r1, #0x1\n" " mov r2, #0xd\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 28\n" + " ldr r0, .__21 + 28\n" " mov r1, #0x1\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 32\n" + " ldr r0, .__21 + 32\n" " mov r1, #0x1\n" " mov r2, #0x11\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 36\n" + " ldr r0, .__21 + 36\n" " mov r1, #0xf\n" " mov r2, #0x1\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 40\n" + " ldr r0, .__21 + 40\n" " mov r1, #0xf\n" " mov r2, #0x3\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 44\n" + " ldr r0, .__21 + 44\n" " mov r1, #0xf\n" " mov r2, #0x5\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 48\n" + " ldr r0, .__21 + 48\n" " mov r1, #0xf\n" " mov r2, #0x7\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 52\n" + " ldr r0, .__21 + 52\n" " mov r1, #0xf\n" " mov r2, #0x9\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 56\n" + " ldr r0, .__21 + 56\n" " mov r1, #0xf\n" " mov r2, #0xb\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 60\n" + " ldr r0, .__21 + 60\n" " mov r1, #0xf\n" " mov r2, #0xd\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 64\n" + " ldr r0, .__21 + 64\n" " mov r1, #0xf\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 68\n" + " ldr r0, .__21 + 68\n" " mov r1, #0xf\n" " mov r2, #0x11\n" " bl Menu_PrintText\n" - " ldr r0, ._21 + 72\n" + " ldr r0, .__21 + 72\n" " ldrb r0, [r0, #0x3]\n" " cmp r0, #0\n" - " bne ._19 @cond_branch\n" - " ldr r0, ._21 + 76\n" + " bne .__19 @cond_branch\n" + " ldr r0, .__21 + 76\n" " mov r1, #0xa\n" " mov r2, #0x9\n" " bl Menu_PrintText\n" - " b ._20\n" - "._22:\n" + " b .__20\n" + ".__22:\n" " .align 2, 0\n" - "._21:\n" + ".__21:\n" " .word Str_841B1C4\n" " .word Str_841B1CB\n" " .word Str_841B1D4\n" @@ -4339,13 +5531,13 @@ void debug_sub_811B310() " .word Str_841B243\n" " .word +0x2000000\n" " .word Str_841B246\n" - "._19:\n" - " ldr r0, ._30\n" + ".__19:\n" + " ldr r0, .__30\n" " mov r1, #0xa\n" " mov r2, #0x9\n" " bl Menu_PrintText\n" - "._20:\n" - " ldr r4, ._30 + 4\n" + ".__20:\n" + " ldr r4, .__30 + 4\n" " ldr r1, [r4, #0x68]\n" " mov r0, sp\n" " mov r2, #0x2\n" @@ -4454,77 +5646,77 @@ void debug_sub_811B310() " mov r1, #0x14\n" " mov r2, #0x11\n" " bl Menu_PrintText\n" - " ldr r1, ._30 + 8\n" + " ldr r1, .__30 + 8\n" " ldrb r0, [r1]\n" " cmp r0, #0\n" - " beq ._23 @cond_branch\n" + " beq .__23 @cond_branch\n" " mov r2, #0x0\n" " cmp r0, #0x8\n" - " beq ._24 @cond_branch\n" + " beq .__24 @cond_branch\n" " cmp r0, #0x8\n" - " bgt ._25 @cond_branch\n" + " bgt .__25 @cond_branch\n" " cmp r0, #0x2\n" - " beq ._26 @cond_branch\n" + " beq .__26 @cond_branch\n" " cmp r0, #0x2\n" - " bgt ._27 @cond_branch\n" + " bgt .__27 @cond_branch\n" " cmp r0, #0x1\n" - " beq ._28 @cond_branch\n" - " b ._45\n" - "._31:\n" + " beq .__28 @cond_branch\n" + " b .__45\n" + ".__31:\n" " .align 2, 0\n" - "._30:\n" + ".__30:\n" " .word Str_841B249\n" " .word +0x2000000\n" " .word unk_debug_bss_1\n" - "._27:\n" + ".__27:\n" " cmp r0, #0x4\n" - " beq ._32 @cond_branch\n" - " b ._45\n" - "._25:\n" + " beq .__32 @cond_branch\n" + " b .__45\n" + ".__25:\n" " cmp r0, #0x40\n" - " beq ._34 @cond_branch\n" + " beq .__34 @cond_branch\n" " cmp r0, #0x40\n" - " bgt ._35 @cond_branch\n" + " bgt .__35 @cond_branch\n" " cmp r0, #0x10\n" - " beq ._36 @cond_branch\n" - " b ._45\n" - "._35:\n" + " beq .__36 @cond_branch\n" + " b .__45\n" + ".__35:\n" " cmp r0, #0x80\n" - " beq ._38 @cond_branch\n" - " b ._45\n" - "._26:\n" + " beq .__38 @cond_branch\n" + " b .__45\n" + ".__26:\n" " mov r2, #0x3\n" - " b ._45\n" - "._28:\n" + " b .__45\n" + ".__28:\n" " mov r2, #0x5\n" - " b ._45\n" - "._32:\n" + " b .__45\n" + ".__32:\n" " mov r2, #0x7\n" - " b ._45\n" - "._24:\n" + " b .__45\n" + ".__24:\n" " mov r2, #0x9\n" - " b ._45\n" - "._36:\n" + " b .__45\n" + ".__36:\n" " mov r2, #0xb\n" - " b ._45\n" - "._34:\n" + " b .__45\n" + ".__34:\n" " mov r2, #0xd\n" - " b ._45\n" - "._38:\n" + " b .__45\n" + ".__38:\n" " mov r2, #0xf\n" - "._45:\n" - " ldr r0, ._46\n" + ".__45:\n" + " ldr r0, .__46\n" " mov r1, #0x17\n" " bl Menu_PrintText\n" - "._23:\n" + ".__23:\n" " bl debug_sub_811B2E8\n" " add sp, sp, #0x8\n" " pop {r4}\n" " pop {r0}\n" " bx r0\n" - "._47:\n" + ".__47:\n" " .align 2, 0\n" - "._46:\n" + ".__46:\n" " .word Str_841B26D\n" "\n" ); @@ -4539,16 +5731,16 @@ void debug_sub_811B5B4() " ldr r0, [r2]\n" " add r0, r0, r1\n" " str r0, [r2]\n" - " ldr r1, ._49\n" + " ldr r1, .__49\n" " cmp r0, r1\n" - " ble ._48 @cond_branch\n" + " ble .__48 @cond_branch\n" " str r1, [r2]\n" - "._48:\n" + ".__48:\n" " pop {r0}\n" " bx r0\n" - "._50:\n" + ".__50:\n" " .align 2, 0\n" - "._49:\n" + ".__49:\n" " .word 0x270f\n" "\n" ); @@ -4558,16 +5750,16 @@ __attribute__((naked)) void debug_sub_811B5D0() { asm( - " ldr r0, ._51\n" + " ldr r0, .__51\n" " mov r1, #0x0\n" " strb r1, [r0]\n" - " ldr r0, ._51 + 4\n" + " ldr r0, .__51 + 4\n" " strb r1, [r0]\n" - " ldr r0, ._51 + 8\n" + " ldr r0, .__51 + 8\n" " strb r1, [r0]\n" - " ldr r0, ._51 + 12\n" + " ldr r0, .__51 + 12\n" " strb r1, [r0]\n" - " ldr r2, ._51 + 16\n" + " ldr r2, .__51 + 16\n" " mov r0, #0x0\n" " str r0, [r2, #0x68]\n" " str r0, [r2, #0x6c]\n" @@ -4587,9 +5779,9 @@ void debug_sub_811B5D0() " add r1, r1, #0x4\n" " str r0, [r1]\n" " bx lr\n" - "._52:\n" + ".__52:\n" " .align 2, 0\n" - "._51:\n" + ".__51:\n" " .word unk_debug_bss_1\n" " .word unk_debug_bss_1+0x2\n" " .word unk_debug_bss_1+0x3\n" @@ -4604,14 +5796,14 @@ void debug_sub_811B620() { asm( " push {lr}\n" - " ldr r0, ._53\n" + " ldr r0, .__53\n" " mov r1, #0x0\n" " bl CreateTask\n" " pop {r0}\n" " bx r0\n" - "._54:\n" + ".__54:\n" " .align 2, 0\n" - "._53:\n" + ".__53:\n" " .word debug_sub_811B654+1\n" "\n" ); @@ -4622,21 +5814,21 @@ void debug_sub_811B634() { asm( " push {lr}\n" - " ldr r0, ._57\n" + " ldr r0, .__57\n" " bl FindTaskIdByFunc\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " cmp r0, #0xff\n" - " beq ._55 @cond_branch\n" + " beq .__55 @cond_branch\n" " mov r0, #0x0\n" - " b ._56\n" - "._58:\n" + " b .__56\n" + ".__58:\n" " .align 2, 0\n" - "._57:\n" + ".__57:\n" " .word debug_sub_811B654+1\n" - "._55:\n" + ".__55:\n" " mov r0, #0x1\n" - "._56:\n" + ".__56:\n" " pop {r1}\n" " bx r1\n" "\n" @@ -4654,32 +5846,32 @@ void debug_sub_811B654() " lsl r0, r6, #0x2\n" " add r0, r0, r6\n" " lsl r0, r0, #0x3\n" - " ldr r1, ._63\n" + " ldr r1, .__63\n" " add r5, r0, r1\n" " mov r0, #0x8\n" " ldsh r1, [r5, r0]\n" " cmp r1, #0x1\n" - " beq ._59 @cond_branch\n" + " beq .__59 @cond_branch\n" " cmp r1, #0x1\n" - " bgt ._60 @cond_branch\n" + " bgt .__60 @cond_branch\n" " cmp r1, #0\n" - " beq ._61 @cond_branch\n" - " b ._116\n" - "._64:\n" + " beq .__61 @cond_branch\n" + " b .__116\n" + ".__64:\n" " .align 2, 0\n" - "._63:\n" + ".__63:\n" " .word gTasks\n" - "._60:\n" + ".__60:\n" " cmp r1, #0x2\n" - " bne ._65 @cond_branch\n" - " b ._66\n" - "._65:\n" + " bne .__65 @cond_branch\n" + " b .__66\n" + ".__65:\n" " cmp r1, #0x3\n" - " bne ._67 @cond_branch\n" - " b ._68\n" - "._67:\n" - " b ._116\n" - "._61:\n" + " bne .__67 @cond_branch\n" + " b .__68\n" + ".__67:\n" + " b .__116\n" + ".__61:\n" " mov r0, #0x0\n" " mov r1, #0x0\n" " mov r2, #0x18\n" @@ -4689,64 +5881,64 @@ void debug_sub_811B654() " ldrh r0, [r5, #0x8]\n" " add r0, r0, #0x1\n" " strh r0, [r5, #0x8]\n" - " b ._116\n" - "._59:\n" - " ldr r7, ._76\n" + " b .__116\n" + ".__59:\n" + " ldr r7, .__76\n" " ldrh r2, [r7, #0x2e]\n" " mov r0, #0x2\n" " and r0, r0, r2\n" " cmp r0, #0\n" - " beq ._71 @cond_branch\n" - " b ._94\n" - "._71:\n" + " beq .__71 @cond_branch\n" + " b .__94\n" + ".__71:\n" " mov r0, #0x20\n" " and r0, r0, r2\n" " lsl r0, r0, #0x10\n" " lsr r3, r0, #0x10\n" " cmp r3, #0\n" - " beq ._73 @cond_branch\n" - " ldr r1, ._76 + 4\n" + " beq .__73 @cond_branch\n" + " ldr r1, .__76 + 4\n" " ldrb r0, [r1, #0x1]\n" " sub r0, r0, #0x1\n" " strb r0, [r1, #0x1]\n" " lsl r0, r0, #0x18\n" " cmp r0, #0\n" - " bge ._79 @cond_branch\n" + " bge .__79 @cond_branch\n" " mov r0, #0x5\n" " strb r0, [r1, #0x1]\n" - " b ._79\n" - "._77:\n" + " b .__79\n" + ".__77:\n" " .align 2, 0\n" - "._76:\n" + ".__76:\n" " .word gMain\n" " .word +0x2000000\n" - "._73:\n" + ".__73:\n" " mov r0, #0x10\n" " and r0, r0, r2\n" " cmp r0, #0\n" - " beq ._78 @cond_branch\n" - " ldr r1, ._81\n" + " beq .__78 @cond_branch\n" + " ldr r1, .__81\n" " ldrb r0, [r1, #0x1]\n" " add r0, r0, #0x1\n" " strb r0, [r1, #0x1]\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " cmp r0, #0x5\n" - " bls ._79 @cond_branch\n" + " bls .__79 @cond_branch\n" " strb r3, [r1, #0x1]\n" - "._79:\n" + ".__79:\n" " bl debug_sub_811B2E8\n" - " b ._116\n" - "._82:\n" + " b .__116\n" + ".__82:\n" " .align 2, 0\n" - "._81:\n" + ".__81:\n" " .word +0x2000000\n" - "._78:\n" + ".__78:\n" " and r1, r1, r2\n" " lsl r0, r1, #0x10\n" " lsr r4, r0, #0x10\n" " cmp r4, #0\n" - " beq ._83 @cond_branch\n" + " beq .__83 @cond_branch\n" " mov r0, #0x3\n" " strh r0, [r5, #0x8]\n" " bl Menu_EraseScreen\n" @@ -4755,28 +5947,28 @@ void debug_sub_811B654() " mov r2, #0x9\n" " mov r3, #0x5\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._85\n" + " ldr r0, .__85\n" " mov r1, #0x1\n" " mov r2, #0x1\n" " bl Menu_PrintText\n" - " ldr r0, ._85 + 4\n" + " ldr r0, .__85 + 4\n" " mov r1, #0x1\n" " mov r2, #0x3\n" " bl Menu_PrintText\n" - " b ._116\n" - "._86:\n" + " b .__116\n" + ".__86:\n" " .align 2, 0\n" - "._85:\n" + ".__85:\n" " .word Str_841B25C\n" " .word Str_841B264\n" - "._83:\n" + ".__83:\n" " mov r0, #0x4\n" " and r0, r0, r2\n" " cmp r0, #0\n" - " beq ._87 @cond_branch\n" - " ldr r0, ._91\n" + " beq .__87 @cond_branch\n" + " ldr r0, .__91\n" " strb r4, [r0]\n" - " ldr r0, ._91 + 4\n" + " ldr r0, .__91 + 4\n" " strb r4, [r0]\n" " bl Menu_EraseScreen\n" " mov r0, #0x0\n" @@ -4784,11 +5976,11 @@ void debug_sub_811B654() " mov r2, #0xa\n" " mov r3, #0x13\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._91 + 8\n" + " ldr r0, .__91 + 8\n" " mov r1, #0x1\n" " mov r2, #0x1\n" " bl Menu_PrintText\n" - " ldr r3, ._91 + 12\n" + " ldr r3, .__91 + 12\n" " mov r0, #0x2\n" " mov r1, #0x3\n" " mov r2, #0x8\n" @@ -4804,144 +5996,144 @@ void debug_sub_811B654() " ldrh r0, [r5, #0x8]\n" " add r0, r0, #0x1\n" " strh r0, [r5, #0x8]\n" - "._87:\n" + ".__87:\n" " ldrh r1, [r7, #0x2e]\n" " mov r0, #0x8\n" " and r0, r0, r1\n" " cmp r0, #0\n" - " bne ._88 @cond_branch\n" - " b ._116\n" - "._88:\n" - " ldr r1, ._91 + 16\n" + " bne .__88 @cond_branch\n" + " b .__116\n" + ".__88:\n" + " ldr r1, .__91 + 16\n" " mov r0, #0x1\n" " strb r0, [r1]\n" - " b ._94\n" - "._92:\n" + " b .__94\n" + ".__92:\n" " .align 2, 0\n" - "._91:\n" + ".__91:\n" " .word unk_debug_bss_1+0x2\n" " .word unk_debug_bss_1+0x3\n" " .word Str_841B254\n" " .word _841B270\n" " .word unk_debug_bss_1+0x4\n" - "._66:\n" + ".__66:\n" " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" " asr r2, r0, #0x18\n" " mov r0, #0x2\n" " neg r0, r0\n" " cmp r2, r0\n" - " beq ._116 @cond_branch\n" + " beq .__116 @cond_branch\n" " add r0, r0, #0x1\n" " cmp r2, r0\n" - " beq ._94 @cond_branch\n" - " ldr r1, ._96\n" + " beq .__94 @cond_branch\n" + " ldr r1, .__96\n" " mov r0, #0x1\n" " strb r0, [r1]\n" - " ldr r0, ._96 + 4\n" + " ldr r0, .__96 + 4\n" " lsl r1, r2, #0x3\n" " add r0, r0, #0x4\n" " add r1, r1, r0\n" " ldr r0, [r1]\n" " bl _call_via_r0\n" - "._94:\n" + ".__94:\n" " bl Menu_EraseScreen\n" " add r0, r6, #0\n" " bl DestroyTask\n" - " b ._116\n" - "._97:\n" + " b .__116\n" + ".__97:\n" " .align 2, 0\n" - "._96:\n" + ".__96:\n" " .word unk_debug_bss_1+0x2\n" " .word _841B270\n" - "._68:\n" - " ldr r2, ._100\n" + ".__68:\n" + " ldr r2, .__100\n" " ldrh r1, [r2, #0x30]\n" " mov r0, #0x80\n" " and r0, r0, r1\n" " cmp r0, #0\n" - " beq ._98 @cond_branch\n" - " ldr r2, ._100 + 4\n" + " beq .__98 @cond_branch\n" + " ldr r2, .__100 + 4\n" " ldrh r0, [r2, #0xc]\n" " add r0, r0, #0x64\n" - " b ._99\n" - "._101:\n" + " b .__99\n" + ".__101:\n" " .align 2, 0\n" - "._100:\n" + ".__100:\n" " .word gMain\n" " .word +0x2000000\n" - "._98:\n" + ".__98:\n" " mov r0, #0x40\n" " and r0, r0, r1\n" " cmp r0, #0\n" - " beq ._102 @cond_branch\n" - " ldr r1, ._104\n" + " beq .__102 @cond_branch\n" + " ldr r1, .__104\n" " ldrh r0, [r1, #0xc]\n" " sub r0, r0, #0x64\n" - " b ._103\n" - "._105:\n" + " b .__103\n" + ".__105:\n" " .align 2, 0\n" - "._104:\n" + ".__104:\n" " .word +0x2000000\n" - "._102:\n" + ".__102:\n" " mov r0, #0x20\n" " and r0, r0, r1\n" " cmp r0, #0\n" - " beq ._106 @cond_branch\n" - " ldr r1, ._109\n" - " ldr r2, ._109 + 4\n" + " beq .__106 @cond_branch\n" + " ldr r1, .__109\n" + " ldr r2, .__109 + 4\n" " add r0, r2, #0\n" " ldrh r2, [r1, #0xc]\n" " add r0, r0, r2\n" - "._103:\n" + ".__103:\n" " strh r0, [r1, #0xc]\n" " lsl r0, r0, #0x10\n" " cmp r0, #0\n" - " bgt ._116 @cond_branch\n" - " ldr r0, ._109 + 8\n" + " bgt .__116 @cond_branch\n" + " ldr r0, .__109 + 8\n" " strh r0, [r1, #0xc]\n" - " b ._116\n" - "._110:\n" + " b .__116\n" + ".__110:\n" " .align 2, 0\n" - "._109:\n" + ".__109:\n" " .word +0x2000000\n" " .word 0xfffffc18\n" " .word 0x270f\n" - "._106:\n" + ".__106:\n" " mov r0, #0x10\n" " and r0, r0, r1\n" " cmp r0, #0\n" - " beq ._111 @cond_branch\n" - " ldr r2, ._114\n" + " beq .__111 @cond_branch\n" + " ldr r2, .__114\n" " mov r1, #0xfa\n" " lsl r1, r1, #0x2\n" " add r0, r1, #0\n" " ldrh r1, [r2, #0xc]\n" " add r0, r0, r1\n" - "._99:\n" + ".__99:\n" " strh r0, [r2, #0xc]\n" " lsl r0, r0, #0x10\n" " asr r0, r0, #0x10\n" - " ldr r1, ._114 + 4\n" + " ldr r1, .__114 + 4\n" " cmp r0, r1\n" - " ble ._116 @cond_branch\n" + " ble .__116 @cond_branch\n" " strh r1, [r2, #0xc]\n" - " b ._116\n" - "._115:\n" + " b .__116\n" + ".__115:\n" " .align 2, 0\n" - "._114:\n" + ".__114:\n" " .word +0x2000000\n" " .word 0x270f\n" - "._111:\n" + ".__111:\n" " ldrh r1, [r2, #0x2e]\n" " mov r0, #0x2\n" " and r0, r0, r1\n" " cmp r0, #0\n" - " beq ._116 @cond_branch\n" + " beq .__116 @cond_branch\n" " bl Menu_EraseScreen\n" " add r0, r6, #0\n" " bl DestroyTask\n" - "._116:\n" + ".__116:\n" " add sp, sp, #0x8\n" " pop {r4, r5, r6, r7}\n" " pop {r0}\n" @@ -4960,232 +6152,232 @@ void debug_sub_811B894() " mov r5, r8\n" " push {r5, r6, r7}\n" " add sp, sp, #0xfffffffc\n" - " ldr r1, ._122\n" + " ldr r1, .__122\n" " ldrh r2, [r1, #0x8]\n" " mov r0, #0xc0\n" " lsl r0, r0, #0x1\n" " and r0, r0, r2\n" " add r4, r1, #0\n" " cmp r0, #0\n" - " beq ._117 @cond_branch\n" + " beq .__117 @cond_branch\n" " add r1, r1, #0x90\n" " ldr r0, [r1]\n" " add r0, r0, #0x1\n" " str r0, [r1]\n" - " ldr r2, ._122 + 4\n" + " ldr r2, .__122 + 4\n" " cmp r0, r2\n" - " ble ._118 @cond_branch\n" + " ble .__118 @cond_branch\n" " str r2, [r1]\n" - "._118:\n" + ".__118:\n" " add r0, r4, #0\n" " add r0, r0, #0x88\n" " ldr r1, [r1]\n" " ldr r0, [r0]\n" " cmp r1, r0\n" - " beq ._119 @cond_branch\n" - " ldr r0, ._122 + 8\n" + " beq .__119 @cond_branch\n" + " ldr r0, .__122 + 8\n" " mov r1, #0x4\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" - " ldr r1, ._122 + 12\n" + " ldr r1, .__122 + 12\n" " mov r0, #0x0\n" " strb r0, [r1]\n" - "._119:\n" + ".__119:\n" " ldrb r1, [r4, #0x4]\n" " mov r0, #0x80\n" " and r0, r0, r1\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" " cmp r4, #0\n" - " bne ._126 @cond_branch\n" - " ldr r0, ._122 + 16\n" + " bne .__126 @cond_branch\n" + " ldr r0, .__122 + 16\n" " mov r1, #0x4\n" " mov r2, #0x11\n" - " b ._121\n" - "._123:\n" + " b .__121\n" + ".__123:\n" " .align 2, 0\n" - "._122:\n" + ".__122:\n" " .word +0x2000000\n" " .word 0x270f\n" " .word Str_841B2B0\n" " .word unk_debug_bss_1+0x4\n" " .word Str_841B2D3\n" - "._117:\n" + ".__117:\n" " lsl r0, r2, #0x10\n" " cmp r0, #0\n" - " beq ._127 @cond_branch\n" + " beq .__127 @cond_branch\n" " ldrb r1, [r4, #0x4]\n" " mov r0, #0x80\n" " and r0, r0, r1\n" " cmp r0, #0\n" - " beq ._126 @cond_branch\n" + " beq .__126 @cond_branch\n" " mov r4, #0x3\n" " and r4, r4, r2\n" " cmp r4, #0\n" - " bne ._126 @cond_branch\n" - " ldr r0, ._163\n" + " bne .__126 @cond_branch\n" + " ldr r0, .__163\n" " mov r1, #0x4\n" " mov r2, #0x2\n" - "._121:\n" + ".__121:\n" " bl Menu_PrintText\n" - " ldr r0, ._163 + 4\n" + " ldr r0, .__163 + 4\n" " strb r4, [r0]\n" - "._126:\n" - " ldr r0, ._163 + 8\n" + ".__126:\n" + " ldr r0, .__163 + 8\n" " ldrh r1, [r0, #0x8]\n" " add r4, r0, #0\n" " cmp r1, #0\n" - " beq ._127 @cond_branch\n" - " b ._162\n" - "._127:\n" + " beq .__127 @cond_branch\n" + " b .__162\n" + ".__127:\n" " mov r1, #0x12\n" " ldsh r0, [r4, r1]\n" " cmp r0, #0x3\n" - " beq ._129 @cond_branch\n" - " b ._162\n" - "._129:\n" + " beq .__129 @cond_branch\n" + " b .__162\n" + ".__129:\n" " ldrb r1, [r4, #0x4]\n" " mov r0, #0x80\n" " and r0, r0, r1\n" " cmp r0, #0\n" - " beq ._131 @cond_branch\n" - " b ._162\n" - "._131:\n" + " beq .__131 @cond_branch\n" + " b .__162\n" + ".__131:\n" " mov r0, #0x0\n" " mov r1, #0x1\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r7, r0, #0x18\n" " mov r0, #0x0\n" " mov r1, #0x2\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " str r0, [sp]\n" " mov r0, #0x0\n" " mov r1, #0x3\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r6, r0, #0x18\n" " mov r0, #0x1\n" " mov r1, #0x1\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " mov r9, r0\n" " mov r0, #0x1\n" " mov r1, #0x2\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" " mov r0, #0x1\n" " mov r1, #0x3\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " mov sl, r0\n" " mov r0, #0x2\n" " mov r1, #0x1\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r5, r0, #0x18\n" " mov r0, #0x2\n" " mov r1, #0x2\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " mov r8, r0\n" " mov r0, #0x2\n" " mov r1, #0x3\n" - " bl sub_8102BA4\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " cmp r7, #0\n" - " bne ._134 @cond_branch\n" + " bne .__134 @cond_branch\n" " mov r1, r9\n" " cmp r1, #0x1\n" - " bne ._134 @cond_branch\n" + " bne .__134 @cond_branch\n" " cmp r5, #0\n" - " beq ._159 @cond_branch\n" - "._134:\n" + " beq .__159 @cond_branch\n" + ".__134:\n" " ldr r1, [sp]\n" " cmp r1, #0\n" - " bne ._137 @cond_branch\n" + " bne .__137 @cond_branch\n" " cmp r4, #0x1\n" - " bne ._137 @cond_branch\n" + " bne .__137 @cond_branch\n" " mov r1, r8\n" " cmp r1, #0\n" - " beq ._159 @cond_branch\n" - "._137:\n" + " beq .__159 @cond_branch\n" + ".__137:\n" " cmp r6, #0\n" - " bne ._140 @cond_branch\n" + " bne .__140 @cond_branch\n" " mov r1, sl\n" " cmp r1, #0x1\n" - " bne ._140 @cond_branch\n" + " bne .__140 @cond_branch\n" " cmp r0, #0\n" - " beq ._159 @cond_branch\n" - "._140:\n" + " beq .__159 @cond_branch\n" + ".__140:\n" " cmp r7, #0\n" - " bne ._143 @cond_branch\n" + " bne .__143 @cond_branch\n" " cmp r4, #0x1\n" - " bne ._143 @cond_branch\n" + " bne .__143 @cond_branch\n" " cmp r0, #0\n" - " beq ._159 @cond_branch\n" - "._143:\n" + " beq .__159 @cond_branch\n" + ".__143:\n" " cmp r6, #0\n" - " bne ._146 @cond_branch\n" + " bne .__146 @cond_branch\n" " cmp r4, #0x1\n" - " bne ._146 @cond_branch\n" + " bne .__146 @cond_branch\n" " cmp r5, #0\n" - " beq ._159 @cond_branch\n" - "._146:\n" + " beq .__159 @cond_branch\n" + ".__146:\n" " cmp r7, #0x1\n" - " bne ._149 @cond_branch\n" + " bne .__149 @cond_branch\n" " mov r1, r9\n" " cmp r1, #0\n" - " bne ._149 @cond_branch\n" + " bne .__149 @cond_branch\n" " cmp r5, #0x1\n" - " beq ._159 @cond_branch\n" - "._149:\n" + " beq .__159 @cond_branch\n" + ".__149:\n" " ldr r1, [sp]\n" " cmp r1, #0x1\n" - " bne ._152 @cond_branch\n" + " bne .__152 @cond_branch\n" " cmp r4, #0\n" - " bne ._152 @cond_branch\n" + " bne .__152 @cond_branch\n" " mov r1, r8\n" " cmp r1, #0x1\n" - " beq ._159 @cond_branch\n" - "._152:\n" + " beq .__159 @cond_branch\n" + ".__152:\n" " cmp r6, #0x1\n" - " bne ._155 @cond_branch\n" + " bne .__155 @cond_branch\n" " mov r1, sl\n" " cmp r1, #0\n" - " bne ._155 @cond_branch\n" + " bne .__155 @cond_branch\n" " cmp r0, #0x1\n" - " beq ._159 @cond_branch\n" - "._155:\n" + " beq .__159 @cond_branch\n" + ".__155:\n" " cmp r7, #0x1\n" - " bne ._158 @cond_branch\n" + " bne .__158 @cond_branch\n" " cmp r4, #0\n" - " bne ._158 @cond_branch\n" + " bne .__158 @cond_branch\n" " cmp r0, #0x1\n" - " beq ._159 @cond_branch\n" - "._158:\n" + " beq .__159 @cond_branch\n" + ".__158:\n" " cmp r6, #0x1\n" - " bne ._162 @cond_branch\n" + " bne .__162 @cond_branch\n" " cmp r4, #0\n" - " bne ._162 @cond_branch\n" + " bne .__162 @cond_branch\n" " cmp r5, #0x1\n" - " bne ._162 @cond_branch\n" - "._159:\n" - " ldr r0, ._163 + 12\n" + " bne .__162 @cond_branch\n" + ".__159:\n" + " ldr r0, .__163 + 12\n" " mov r1, #0x4\n" " mov r2, #0x0\n" " bl Menu_PrintText\n" - " ldr r1, ._163 + 4\n" + " ldr r1, .__163 + 4\n" " mov r0, #0x0\n" " strb r0, [r1]\n" - "._162:\n" + ".__162:\n" " add sp, sp, #0x4\n" " pop {r3, r4, r5}\n" " mov r8, r3\n" @@ -5194,9 +6386,9 @@ void debug_sub_811B894() " pop {r4, r5, r6, r7}\n" " pop {r0}\n" " bx r0\n" - "._164:\n" + ".__164:\n" " .align 2, 0\n" - "._163:\n" + ".__163:\n" " .word Str_841B2E4\n" " .word unk_debug_bss_1+0x4\n" " .word +0x2000000\n" @@ -6636,3 +7828,50 @@ static const struct SpritePalette gSlotMachineSpritePalettes[] = { static const u8 sReelTimeGfx[] = INCBIN_U8("graphics/slot_machine/reel_time.4bpp.lz"); static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin"); + +#if DEBUG + +const u8 Str_841B1C4[] = _("SETTEI"); +const u8 Str_841B1CB[] = _("MAWASITA"); +const u8 Str_841B1D4[] = _("MODOSI"); +const u8 Str_841B1DB[] = _("NOMARE"); +const u8 Str_841B1E2[] = _("MAE 7"); +const u8 Str_841B1E8[] = _("LR  HENKOU"); +const u8 Str_841B1F3[] = _("START  JIDOUSU"); +const u8 Str_841B202[] = _("SELECT  SETTEI"); +const u8 Str_841B211[] = _("TYUHSEN"); +const u8 Str_841B219[] = _("CHERRY"); +const u8 Str_841B220[] = _("REPLAY"); +const u8 Str_841B227[] = _("HASUBO"); +const u8 Str_841B22E[] = _("RURIRI"); +const u8 Str_841B235[] = _("INAZU"); +const u8 Str_841B23B[] = _("REG"); +const u8 Str_841B23F[] = _("BIG"); +const u8 Str_841B243[] = _("BD"); +const u8 Str_841B246[] = _("R7"); +const u8 Str_841B249[] = _("B7"); +const u8 Str_841B24C[] = _("A  COIN"); +const u8 Str_841B254[] = _("TYUHSEN"); +const u8 Str_841B25C[] = _("UD  100"); +const u8 Str_841B264[] = _("LR  1000"); +const u8 Str_841B26D[] = _("×"); + +// Is this MenuAction2? I'm not sure. +const struct {const u8 *text; void (*func)();} _841B270[] = +{ + {Str_841B219, debug_sub_811B1C4}, + {Str_841B220, debug_sub_811B1EC}, + {Str_841B227, debug_sub_811B210}, + {Str_841B22E, debug_sub_811B238}, + {Str_841B235, debug_sub_811B260}, + {Str_841B23B, debug_sub_811B288}, + {Str_841B23F, debug_sub_811B2B0}, + {Str_841B243, debug_sub_811B2D8}, +}; + +const u8 Str_841B2B0[] = _("·カウントエラーがおきました"); +const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました"); +const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました"); +const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました"); + +#endif diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index c652b9398..ecff15c21 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -234,9 +234,84 @@ const struct MailLayout gUnknown_083E57A4[] = {5, 15, 15, 4, 3, Unknown_3E5790}, }; +#if DEBUG + +const u8 Str_8411540[] = _("レイアウトを にほんごで ひょうじ?"); // Display using Japanese layout? +const u8 Str_8411553[] = _("にほんご "); // Japanese +const u8 Str_8411559[] = _("かいがい "); // Overseas + +const u8 *const _8411560[] = +{ + Str_8411553, + Str_8411559, +}; + +const u8 Str_8411568[] = _("イメージ タイプを えらんでね"); // Choose an image type +const u8 Str_8411578[] = _("{STR_VAR_1}"); +const u8 Str_841157B[] = _("オレンジ "); // Orange +const u8 Str_8411581[] = _("ハーバー "); // Harbor +const u8 Str_8411587[] = _("キラキラ "); // Glitter +const u8 Str_841158D[] = _("メカニカル"); // Mech +const u8 Str_8411593[] = _("ウッディー"); // Wood +const u8 Str_8411599[] = _("クロス  "); // Wave +const u8 Str_841159F[] = _("トレジャー"); // Bead +const u8 Str_84115A5[] = _("シャドウ "); // Shadow +const u8 Str_84115AB[] = _("トロピカル"); // Tropic +const u8 Str_84115B1[] = _("ドリーム "); // Dream +const u8 Str_84115B7[] = _("ミラクル "); // Fab +const u8 Str_84115BD[] = _("レトロ  "); // Retro + +const u8 *const _84115C4[] = +{ + Str_841157B, + Str_8411581, + Str_8411587, + Str_841158D, + Str_8411593, + Str_8411599, + Str_841159F, + Str_84115A5, + Str_84115AB, + Str_84115B1, + Str_84115B7, + Str_84115BD, +}; + +const u8 Str_84115F4[] = _("メールをみる"); // View Mail +const u8 Str_84115FB[] = _("メールとうろく"); // Register Mail +const u8 Str_8411603[] = _("もたせる"); // Give to Pokémon +const u8 Str_8411608[] = _("メールをけす"); // Delete Mail + +#endif + // XXX: what is this? static u8 *const sSharedMemPtr = gSharedMem; +#if DEBUG + +const u8 Str_841160F[] = _("{STR_VAR_1} {STR_VAR_2}"); +const u8 Str_841161A[] = _("メール{STR_VAR_1} {STR_VAR_2}"); +const u8 Str_8411623[] = _("メール{STR_VAR_1}を だれに もたせる?"); +const u8 Str_8411634[] = _("000 {STR_VAR_1}"); +const u8 Str_841163B[] = _("せいきの データが とうろくずみ です\n"); +const u8 Str_841163B_after[] = _("しんき とうろく できません"); +const u8 Str_841165E[] = _("せいきに とうろくされたメールデータは\n"); +const u8 Str_841165E_after[] = _("へんこう できません"); +const u8 Str_841167D[] = _("メール{STR_VAR_1} とうろく かいじょ"); +const u8 Str_841168D[] = _("デバッグメニューから とうろくした\n"); +const u8 Str_841168D_after[] = _("メール いがいは けせません"); +const u8 Str_84116AE[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); + +const struct MenuAction _84116BC[] = +{ + {Str_84115F4, NULL}, + {Str_84115FB, NULL}, + {Str_8411603, NULL}, + {Str_8411608, NULL}, +}; + +#endif + static u8 sub_80F8A28(void); /*static*/ void sub_80F8D50(void); static void sub_80F8DA0(void); diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c index fd4684832..63f1b322a 100644 --- a/src/pokemon/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -646,7 +646,7 @@ void debug_sub_803F55C() " ldr r4, [sp]\n" " mul r0, r0, r4\n" " mov r1, #0x64\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " add r0, r0, r4\n" " add r0, r0, #0xa\n" " str r0, [sp, #0x4]\n" @@ -673,7 +673,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " add r0, r0, #0x5\n" " str r0, [sp, #0x8]\n" " add r0, r5, #0\n" @@ -705,7 +705,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " add r0, r0, #0x5\n" " str r0, [sp, #0xc]\n" " add r0, r5, #0\n" @@ -737,7 +737,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " add r0, r0, #0x5\n" " str r0, [sp, #0x10]\n" " add r0, r5, #0\n" @@ -769,7 +769,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " add r0, r0, #0x5\n" " str r0, [sp, #0x14]\n" " add r0, r5, #0\n" @@ -801,7 +801,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gScriptFuncs_End+0x3d30\n" + " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" " add r0, r0, #0x5\n" " str r0, [sp, #0x18]\n" " add r0, r5, #0\n" diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 001cebe45..cd4c18252 100644 --- a/src/pokemon/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c @@ -13,7 +13,8 @@ extern const struct StorageAction gUnknown_083B6DF4[]; EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; -void sub_8098898(u8 index) { +void sub_8098898(u8 index) +{ u8 *ptr; Menu_DrawStdWindowFrame(10, 16, 29, 19); -- cgit v1.2.3 From c3534e7b0e2df48fe989deb74c26f98e1fe759b8 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 16:46:54 -0600 Subject: add more debug code --- src/engine/cable_club.c | 436 +++++++++++++++++++++++++++++++++- src/engine/mystery_event_menu.c | 460 ++++++++++++++++++++++++++++++++++++ src/engine/reset_rtc_screen.c | 316 +++++++++++++++++++++++++ src/field/field_fadetransition.c | 16 ++ src/field/fldeff_cut.c | 109 +++++++++ src/field/fldeff_flash.c | 30 +++ src/field/fldeff_strength.c | 23 ++ src/field/item_menu.c | 498 +++++++++++++++++++++++++++++++++++++++ src/pokemon/pokemon_menu.c | 42 ++++ 9 files changed, 1929 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index 688560218..c0397f67b 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -95,6 +95,325 @@ const u8 *const gTrainerCardColorNames[] = TrainerCardColorName_Gold, }; +#if DEBUG + +__attribute__((naked)) +int debug_sub_808A4D0() +{ + asm("\ + push {lr}\n\ + add r1, r0, #0\n\ + ldr r0, ._3\n\ + cmp r1, r0\n\ + bne ._1 @cond_branch\n\ + mov r0, #0x1\n\ + b ._30\n\ +._4:\n\ + .align 2, 0\n\ +._3:\n\ + .word sub_8082F68+1\n\ +._1:\n\ + ldr r0, ._7\n\ + cmp r1, r0\n\ + bne ._5 @cond_branch\n\ + mov r0, #0x11\n\ + b ._30\n\ +._8:\n\ + .align 2, 0\n\ +._7:\n\ + .word sub_8082FEC+1\n\ +._5:\n\ + ldr r0, ._11\n\ + cmp r1, r0\n\ + bne ._9 @cond_branch\n\ + mov r0, #0x12\n\ + b ._30\n\ +._12:\n\ + .align 2, 0\n\ +._11:\n\ + .word sub_808303C+1\n\ +._9:\n\ + ldr r0, ._15\n\ + cmp r1, r0\n\ + bne ._13 @cond_branch\n\ + mov r0, #0x13\n\ + b ._30\n\ +._16:\n\ + .align 2, 0\n\ +._15:\n\ + .word sub_8083188+1\n\ +._13:\n\ + ldr r0, ._19\n\ + cmp r1, r0\n\ + bne ._17 @cond_branch\n\ + mov r0, #0x14\n\ + b ._30\n\ +._20:\n\ + .align 2, 0\n\ +._19:\n\ + .word sub_80830E4+1\n\ +._17:\n\ + ldr r0, ._23\n\ + cmp r1, r0\n\ + bne ._21 @cond_branch\n\ + mov r0, #0x21\n\ + b ._30\n\ +._24:\n\ + .align 2, 0\n\ +._23:\n\ + .word sub_80831F8+1\n\ +._21:\n\ + ldr r0, ._27\n\ + cmp r1, r0\n\ + bne ._25 @cond_branch\n\ + mov r0, #0x2\n\ + b ._30\n\ +._28:\n\ + .align 2, 0\n\ +._27:\n\ + .word sub_8083314+1\n\ +._25:\n\ + ldr r0, ._31\n\ + cmp r1, r0\n\ + beq ._29 @cond_branch\n\ + mov r0, #0x0\n\ + b ._30\n\ +._32:\n\ + .align 2, 0\n\ +._31:\n\ + .word sub_80833C4+1\n\ +._29:\n\ + mov r0, #0x3\n\ +._30:\n\ + pop {r1}\n\ + bx r1"); +} + +__attribute__((naked)) +void debug_sub_808A55C() +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + ldr r2, ._37\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + add r4, r0, r2\n\ + mov r0, #0x8\n\ + ldsh r1, [r4, r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + ldrb r0, [r0, #0x4]\n\ + cmp r0, #0\n\ + bne ._33 @cond_branch\n\ + mov r1, #0xa\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0x5\n\ + bne ._34 @cond_branch\n\ + add r0, r7, #0\n\ + bl DestroyTask\n\ +._34:\n\ + ldrh r0, [r4, #0xa]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0xa]\n\ +._33:\n\ + ldr r0, ._37 + 4\n\ + ldrb r0, [r0]\n\ + mov r1, #0x2\n\ + mov r2, #0x0\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + ldr r0, ._37 + 8\n\ + ldrb r0, [r0]\n\ + mov r1, #0x16\n\ + mov r2, #0x5\n\ + mov r3, #0x4\n\ + bl PrintHex\n\ + mov r4, #0x0\n\ + lsl r3, r7, #0x2\n\ + mov r8, r3\n\ + mov r6, #0xc0\n\ + lsl r6, r6, #0x13\n\ + mov r5, #0xa0\n\ + lsl r5, r5, #0x13\n\ +._35:\n\ + ldr r0, ._37 + 12\n\ + add r0, r4, r0\n\ + ldrb r0, [r0]\n\ + lsr r1, r5, #0x18\n\ + mov r2, #0x0\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + ldr r1, ._37 + 16\n\ + lsl r0, r4, #0x8\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + lsr r2, r6, #0x18\n\ + mov r1, #0x16\n\ + mov r3, #0x4\n\ + bl PrintHex\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x11\n\ + add r6, r6, r0\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x12\n\ + add r5, r5, r1\n\ + add r4, r4, #0x1\n\ + cmp r4, #0x3\n\ + ble ._35 @cond_branch\n\ + ldr r4, ._37 + 20\n\ + ldr r0, [r4]\n\ + mov r1, #0xf\n\ + mov r2, #0x0\n\ + mov r3, #0x8\n\ + bl PrintHex\n\ + ldr r0, ._37 + 24\n\ + ldrb r0, [r0, #0x1]\n\ + mov r1, #0x2\n\ + mov r2, #0xa\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + bl GetMultiplayerId\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0x7\n\ + mov r2, #0xc\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + bl GetBlockReceivedStatus\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0x7\n\ + mov r2, #0xa\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + ldr r0, ._37 + 28\n\ + ldrb r0, [r0]\n\ + mov r1, #0x2\n\ + mov r2, #0xc\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + ldr r0, ._37 + 32\n\ + ldrh r0, [r0]\n\ + mov r1, #0xb\n\ + mov r2, #0x8\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + ldr r0, [r4]\n\ + mov r1, #0x1c\n\ + and r0, r0, r1\n\ + lsr r0, r0, #0x2\n\ + mov r1, #0xb\n\ + mov r2, #0xa\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + bl IsLinkConnectionEstablished\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0xb\n\ + mov r2, #0xc\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + bl sub_8007ECC\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0xf\n\ + mov r2, #0xa\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + ldr r2, ._37\n\ + mov r3, r8\n\ + add r0, r3, r7\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + mov r3, #0x8\n\ + ldsh r1, [r0, r3]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + bl debug_sub_808A4D0\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0xf\n\ + mov r2, #0xc\n\ + mov r3, #0x2\n\ + bl PrintHex\n\ + ldr r0, ._37 + 36\n\ + ldr r0, [r0]\n\ + mov r1, #0x2\n\ + mov r2, #0xd\n\ + mov r3, #0x8\n\ + bl PrintHex\n\ + bl HasLinkErrorOccurred\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0x2\n\ + mov r2, #0x2\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + ldr r0, ._37 + 40\n\ + mov r6, #0x80\n\ + lsl r6, r6, #0x12\n\ + add r5, r0, #0\n\ + add r5, r5, #0x14\n\ + mov r4, #0x3\n\ +._36:\n\ + ldr r0, [r5]\n\ + lsr r1, r6, #0x18\n\ + mov r2, #0x3\n\ + mov r3, #0x4\n\ + bl PrintHex\n\ + mov r0, #0xc0\n\ + lsl r0, r0, #0x13\n\ + add r6, r6, r0\n\ + add r5, r5, #0x1c\n\ + sub r4, r4, #0x1\n\ + cmp r4, #0\n\ + bge ._36 @cond_branch\n\ + ldr r0, ._37 + 44\n\ + ldrh r0, [r0]\n\ + mov r1, #0x2\n\ + mov r2, #0x6\n\ + mov r3, #0x4\n\ + bl PrintHex\n\ + bl debug_sub_808B850\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r1, #0x19\n\ + mov r2, #0x3\n\ + mov r3, #0x1\n\ + bl PrintHex\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._38:\n\ + .align 2, 0\n\ +._37:\n\ + .word gTasks\n\ + .word gShouldAdvanceLinkState\n\ + .word gBlockSendBuffer\n\ + .word gLinkPlayerPending\n\ + .word gBlockRecvBuffer\n\ + .word gLinkStatus\n\ + .word gLink\n\ + .word gReceivedRemoteLinkPlayers\n\ + .word gScriptResult\n\ + .word gLinkCallback\n\ + .word gLinkPlayers\n\ + .word 0x4000128"); +} +#endif + static void sub_8082CD4(u8 arg0, u8 arg1) { if (FindTaskIdByFunc(sub_8082F20) == 0xFF) @@ -912,6 +1231,74 @@ void sub_8083C50(u8 taskId) DestroyTask(taskId); } +#if DEBUG + +__attribute__((naked)) +void debug_sub_808B778() +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._390\n\ + add r0, r4, #0\n\ + bl FuncIsActiveTask\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._389 @cond_branch\n\ + add r0, r4, #0\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ +._389:\n\ + ldr r1, ._390 + 4\n\ + ldr r0, [r1]\n\ + add r0, r0, #0x1\n\ + str r0, [r1]\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._391:\n\ + .align 2, 0\n\ +._390:\n\ + .word debug_sub_808B7A8+1\n\ + .word unk_3004E98"); +} + +__attribute__((naked)) +void debug_sub_808B7A8() +{ + asm("\ + push {lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._393\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + ldrh r0, [r1, #0x8]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1, #0x8]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x1e\n\ + bne ._392 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r1, #0x8]\n\ + ldr r2, ._393 + 4\n\ + ldrh r0, [r2]\n\ + mov r1, #0x1\n\ + orr r0, r0, r1\n\ + strh r0, [r2]\n\ +._392:\n\ + pop {r0}\n\ + bx r0\n\ +._394:\n\ + .align 2, 0\n\ +._393:\n\ + .word gTasks\n\ + .word unk_3004E94"); +} +#endif + static void sub_8083CA4(u8 taskId) { if (!gReceivedRemoteLinkPlayers) @@ -925,4 +1312,51 @@ void unref_sub_8083CC8(u8 taskId) { sub_800832C(); gTasks[taskId].func = sub_8083CA4; -} \ No newline at end of file +} + +#if DEBUG + +void debug_sub_808B82C() +{ + asm("\ + ldr r1, ._400\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bx lr\n\ +._401:\n\ + .align 2, 0\n\ +._400:\n\ + .word unk_2030220"); +} + +void debug_sub_808B838(u8 a) +{ + asm("\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._402\n\ + mov r1, #0x1\n\ + LSL r1, r0\n\ + ldrb r0, [r2]\n\ + orr r1, r1, r0\n\ + strb r1, [r2]\n\ + bx lr\n\ +._403:\n\ + .align 2, 0\n\ +._402:\n\ + .word unk_2030220"); +} + +int debug_sub_808B850() +{ + asm("\ + ldr r0, ._404\n\ + ldrb r0, [r0]\n\ + bx lr\n\ +._405:\n\ + .align 2, 0\n\ +._404:\n\ + .word unk_2030220"); +} + +#endif \ No newline at end of file diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index 8fad563e6..522a185c8 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -338,3 +338,463 @@ static void CB2_MysteryEventMenu(void) BuildOamBuffer(); UpdatePaletteFade(); } + +#if DEBUG + +void debug_sub_815D1D8(); + +__attribute__((naked)) +void debug_sub_815D04C() +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " ldr r1, ._125\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r1, #0x8\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0\n" + " bne ._121 @cond_branch\n" + " mov r0, #0x4\n" + " mov r1, #0x4\n" + " mov r2, #0xd\n" + " mov r3, #0x7\n" + " bl MenuDrawTextWindow\n" + " ldr r1, ._125 + 4\n" + " mov r2, #0xa\n" + " ldsh r0, [r4, r2]\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov r1, #0x5\n" + " mov r2, #0x5\n" + " bl MenuPrint\n" + " ldrh r0, [r4, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r4, #0x8]\n" + "._121:\n" + " ldr r2, ._125 + 8\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " add r6, r2, #0\n" + " cmp r0, #0\n" + " beq ._122 @cond_branch\n" + " ldrh r1, [r4, #0xa]\n" + " mov r2, #0xa\n" + " ldsh r0, [r4, r2]\n" + " cmp r0, #0\n" + " bne ._123 @cond_branch\n" + " ldr r0, ._125 + 12\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x1\n" + " b ._124\n" + "._126:\n" + " .align 2, 0\n" + "._125:\n" + " .word gTasks\n" + " .word gFlashSectors+0x9c\n" + " .word gMain\n" + " .word gFlashSectors+0x11c\n" + "._123:\n" + " sub r0, r1, #1\n" + "._124:\n" + " strh r0, [r4, #0xa]\n" + " ldr r0, ._130\n" + " lsl r1, r5, #0x2\n" + " add r1, r1, r5\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r0\n" + " mov r0, #0x0\n" + " strh r0, [r1, #0x8]\n" + "._122:\n" + " ldrh r1, [r6, #0x2e]\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._127 @cond_branch\n" + " ldr r1, ._130\n" + " lsl r2, r5, #0x2\n" + " add r0, r2, r5\n" + " lsl r0, r0, #0x3\n" + " add r4, r0, r1\n" + " mov r0, #0xa\n" + " ldsh r3, [r4, r0]\n" + " ldr r0, ._130 + 4\n" + " ldrb r0, [r0]\n" + " sub r0, r0, #0x1\n" + " cmp r3, r0\n" + " bne ._128 @cond_branch\n" + " mov r0, #0x0\n" + " b ._129\n" + "._131:\n" + " .align 2, 0\n" + "._130:\n" + " .word gTasks\n" + " .word gFlashSectors+0x11c\n" + "._128:\n" + " ldrh r0, [r4, #0xa]\n" + " add r0, r0, #0x1\n" + "._129:\n" + " strh r0, [r4, #0xa]\n" + " add r0, r2, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r1, #0x0\n" + " strh r1, [r0, #0x8]\n" + "._127:\n" + " ldrh r1, [r6, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._132 @cond_branch\n" + " ldr r1, ._133\n" + " lsl r0, r5, #0x2\n" + " add r0, r0, r5\n" + " lsl r0, r0, #0x3\n" + " add r0, r0, r1\n" + " mov r2, #0xa\n" + " ldsh r1, [r0, r2]\n" + " lsl r1, r1, #0x3\n" + " ldr r0, ._133 + 4\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, ._133 + 8\n" + " ldr r1, [r1]\n" + " bl gScriptFuncs_End+0x3cf8\n" + " ldr r0, ._133 + 12\n" + " add r1, r6, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " add r0, r5, #0\n" + " bl DestroyTask\n" + "._132:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._134:\n" + " .align 2, 0\n" + "._133:\n" + " .word gTasks\n" + " .word gFlashSectors+0x9c\n" + " .word +0x2004000\n" + " .word 0x43c\n" + "\n" + ); +} + +void debug_sub_815D15C(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + REG_DISPCNT = DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; + REG_BLDCNT = 0; + + CreateTask(Task_DestroySelf, 0); + StopMapMusic(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + FillPalette(0, 0, 2); + SetMainCallback2(debug_sub_815D1D8); +} + +__attribute__((naked)) +void debug_sub_815D1D8() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r1, ._139\n" + " ldr r2, ._139 + 4\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " add r4, r1, #0\n" + " cmp r0, #0xb\n" + " bls ._137 @cond_branch\n" + " b ._196\n" + "._137:\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._139 + 8\n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._140:\n" + " .align 2, 0\n" + "._139:\n" + " .word gMain\n" + " .word 0x43c\n" + " .word ._141\n" + "._141:\n" + " .word ._142\n" + " .word ._143\n" + " .word ._144\n" + " .word ._145\n" + " .word ._146\n" + " .word ._196\n" + " .word ._148\n" + " .word ._149\n" + " .word ._150\n" + " .word ._151\n" + " .word ._152\n" + " .word ._153\n" + "._142:\n" + " mov r0, #0x3\n" + " mov r1, #0xe\n" + " mov r2, #0x1b\n" + " mov r3, #0x13\n" + " bl MenuDrawTextWindow\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x10\n" + " mov r3, #0x0\n" + " bl BeginNormalPaletteFade\n" + " ldr r1, ._155\n" + " ldr r0, ._155 + 4\n" + " add r1, r1, r0\n" + " b ._189\n" + "._156:\n" + " .align 2, 0\n" + "._155:\n" + " .word gMain\n" + " .word 0x43c\n" + "._143:\n" + " ldr r0, ._161\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._157 @cond_branch\n" + " b ._196\n" + "._157:\n" + " ldrh r1, [r4, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._159 @cond_branch\n" + " ldr r1, ._161 + 4\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + "._159:\n" + " ldr r0, ._161 + 8\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrintMessage\n" + " ldr r2, ._161 + 12\n" + " add r1, r4, r2\n" + " b ._189\n" + "._162:\n" + " .align 2, 0\n" + "._161:\n" + " .word gPaletteFade\n" + " .word gLinkTestBlockChecksums+0x8\n" + " .word gUnknown_0841192C+0x14\n" + " .word 0x43c\n" + "._144:\n" + " bl MenuUpdateWindowText\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._163 @cond_branch\n" + " b ._196\n" + "._163:\n" + " ldr r1, ._166\n" + " ldr r0, ._166 + 4\n" + " add r1, r1, r0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r1, ._166 + 8\n" + " ldr r2, ._166 + 12\n" + " add r0, r2, #0\n" + " strh r0, [r1]\n" + " bl OpenLink\n" + " b ._196\n" + "._167:\n" + " .align 2, 0\n" + "._166:\n" + " .word gMain\n" + " .word 0x43c\n" + " .word gLinkType\n" + " .word 0x5501\n" + "._145:\n" + " ldr r0, ._171\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._168 @cond_branch\n" + " b ._196\n" + "._168:\n" + " ldr r1, ._171 + 4\n" + " add r0, r4, r1\n" + " ldrb r1, [r0]\n" + " add r1, r1, #0x1\n" + " strb r1, [r0]\n" + " ldr r0, ._171 + 8\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrintMessage\n" + " b ._196\n" + "._172:\n" + " .align 2, 0\n" + "._171:\n" + " .word gReceivedRemoteLinkPlayers\n" + " .word 0x43c\n" + " .word gUnknown_0841192C+0x28\n" + "._146:\n" + " bl MenuUpdateWindowText\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._173 @cond_branch\n" + " b ._196\n" + "._173:\n" + " ldr r0, ._176\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " ldr r1, ._176 + 4\n" + " ldr r2, ._176 + 8\n" + " add r1, r1, r2\n" + " b ._189\n" + "._177:\n" + " .align 2, 0\n" + "._176:\n" + " .word debug_sub_815D04C+1\n" + " .word gMain\n" + " .word 0x43c\n" + "._148:\n" + " ldr r0, ._179\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrintMessage\n" + " ldr r1, ._179 + 4\n" + " ldr r2, ._179 + 8\n" + " mov r0, #0x0\n" + " bl SendBlock\n" + " ldr r1, ._179 + 12\n" + " ldr r0, ._179 + 16\n" + " add r1, r1, r0\n" + " b ._189\n" + "._180:\n" + " .align 2, 0\n" + "._179:\n" + " .word gUnknown_0841192C+0x3c\n" + " .word +0x2004000\n" + " .word 0x2004\n" + " .word gMain\n" + " .word 0x43c\n" + "._149:\n" + " bl MenuUpdateWindowText\n" + " bl sub_8007ECC\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._196 @cond_branch\n" + " ldr r1, ._183\n" + " ldr r2, ._183 + 4\n" + " add r1, r1, r2\n" + " b ._189\n" + "._184:\n" + " .align 2, 0\n" + "._183:\n" + " .word gMain\n" + " .word 0x43c\n" + "._150:\n" + " bl sub_800832C\n" + " ldr r1, ._186\n" + " ldr r0, ._186 + 4\n" + " add r1, r1, r0\n" + " b ._189\n" + "._187:\n" + " .align 2, 0\n" + "._186:\n" + " .word gMain\n" + " .word 0x43c\n" + "._151:\n" + " ldr r0, ._190\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " bne ._196 @cond_branch\n" + " mov r0, #0x4\n" + " mov r1, #0xf\n" + " mov r2, #0x1a\n" + " mov r3, #0x12\n" + " bl MenuFillWindowRectWithBlankTile\n" + " ldr r0, ._190 + 4\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl MenuPrint\n" + " ldr r1, ._190 + 8\n" + " ldr r2, ._190 + 12\n" + " add r1, r1, r2\n" + " b ._189\n" + "._191:\n" + " .align 2, 0\n" + "._190:\n" + " .word gReceivedRemoteLinkPlayers\n" + " .word gUnknown_0841192C+0x47\n" + " .word gMain\n" + " .word 0x43c\n" + "._152:\n" + " ldrh r1, [r4, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._196 @cond_branch\n" + " mov r0, #0x1\n" + " neg r0, r0\n" + " mov r1, #0x0\n" + " str r1, [sp]\n" + " mov r2, #0x0\n" + " mov r3, #0x10\n" + " bl BeginNormalPaletteFade\n" + " ldr r0, ._194\n" + " add r1, r4, r0\n" + "._189:\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " b ._196\n" + "._195:\n" + " .align 2, 0\n" + "._194:\n" + " .word 0x43c\n" + "._153:\n" + " ldr r0, ._197\n" + " ldrb r1, [r0, #0x7]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._196 @cond_branch\n" + " ldr r0, ._197 + 4\n" + " bl SetMainCallback2\n" + "._196:\n" + " bl RunTasks\n" + " bl AnimateSprites\n" + " bl BuildOamBuffer\n" + " bl UpdatePaletteFade\n" + " add sp, sp, #0x4\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "._198:\n" + " .align 2, 0\n" + "._197:\n" + " .word gPaletteFade\n" + " .word CB2_InitTitleScreen+1\n" + "\n" + ); +} + +#endif diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index c7d45e929..a11e1b3e3 100644 --- a/src/engine/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c @@ -605,3 +605,319 @@ void Task_ResetRtcScreen(u8 taskId) } } } + +#if DEBUG + +__attribute__((naked)) +void debug_sub_806F8F8(void) +{ + asm("\ + push {lr}\n\ + ldr r0, ._131\n\ + bl SetMainCallback2\n\ + pop {r0}\n\ + bx r0\n\ +._132:\n\ + .align 2, 0\n\ +._131:\n\ + .word CB2_InitResetRtcScreen+1"); +} + +__attribute__((naked)) +void debug_sub_806F908(u8 a) +{ + asm("\ + push {r4, r5, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + lsl r0, r5, #0x2\n\ + add r0, r0, r5\n\ + lsl r0, r0, #0x3\n\ + ldr r2, ._136\n\ + add r4, r0, r2\n\ + mov r1, #0x0\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0\n\ + beq ._133 @cond_branch\n\ + cmp r0, #0x1\n\ + beq ._134 @cond_branch\n\ + b ._141\n\ +._137:\n\ + .align 2, 0\n\ +._136:\n\ + .word gTasks+0x8\n\ +._133:\n\ + ldr r0, ._139\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + strh r0, [r4, #0x2]\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._141\n\ +._140:\n\ + .align 2, 0\n\ +._139:\n\ + .word Task_ResetRtc_0+1\n\ +._134:\n\ + sub r2, r2, #0x8\n\ + mov r0, #0x2\n\ + ldsh r1, [r4, r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r2\n\ + mov r1, #0x8\n\ + ldsh r0, [r2, r1]\n\ + cmp r0, #0\n\ + beq ._141 @cond_branch\n\ + mov r1, #0xa\n\ + ldsh r0, [r2, r1]\n\ + cmp r0, #0x1\n\ + bne ._142 @cond_branch\n\ + ldr r3, ._143\n\ + mov r1, #0x0\n\ + ldsh r0, [r3, r1]\n\ + mov r1, #0x2\n\ + ldsb r1, [r3, r1]\n\ + mov r2, #0x3\n\ + ldsb r2, [r3, r2]\n\ + ldrb r3, [r3, #0x4]\n\ + lsl r3, r3, #0x18\n\ + asr r3, r3, #0x18\n\ + bl RtcCalcLocalTimeOffset\n\ +._142:\n\ + ldrb r0, [r4, #0x2]\n\ + bl DestroyTask\n\ + bl MenuZeroFillScreen\n\ + bl ScriptContext2_Disable\n\ + add r0, r5, #0\n\ + bl DestroyTask\n\ +._141:\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._144:\n\ + .align 2, 0\n\ +._143:\n\ + .word gLocalTime"); +} + +__attribute__((naked)) +void debug_sub_806F99C() +{ + asm("\ + push {lr}\n\ + bl RtcCalcLocalTime\n\ + ldr r0, ._145\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + bl ScriptContext2_Enable\n\ + pop {r0}\n\ + bx r0\n\ +._146:\n\ + .align 2, 0\n\ +._145:\n\ + .word debug_sub_806F908+1"); +} + +__attribute__((naked)) +void debug_sub_806F9B8() +{ + asm("\ + push {lr}\n\ + ldr r2, ._147\n\ + ldr r0, ._147 + 4\n\ + add r0, r0, #0xa0\n\ + ldr r1, [r0, #0x4]\n\ + ldr r0, [r0]\n\ + str r0, [r2]\n\ + str r1, [r2, #0x4]\n\ + ldr r0, ._147 + 8\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + bl ScriptContext2_Enable\n\ + pop {r0}\n\ + bx r0\n\ +._148:\n\ + .align 2, 0\n\ +._147:\n\ + .word gLocalTime\n\ + .word gSaveBlock2\n\ + .word debug_sub_806F908+1"); +} + +__attribute__((naked)) +void debug_sub_806F9E4() +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + ldr r1, ._153\n\ + add r5, r0, r1\n\ + ldr r6, ._153 + 4\n\ + mov r1, #0x0\n\ + ldsh r0, [r5, r1]\n\ + cmp r0, #0x1\n\ + beq ._149 @cond_branch\n\ + cmp r0, #0x1\n\ + bgt ._150 @cond_branch\n\ + cmp r0, #0\n\ + beq ._151 @cond_branch\n\ + b ._165\n\ +._154:\n\ + .align 2, 0\n\ +._153:\n\ + .word gTasks+0x8\n\ + .word gStringVar4\n\ +._150:\n\ + cmp r0, #0x2\n\ + beq ._155 @cond_branch\n\ + b ._165\n\ +._149:\n\ + mov r0, #0x0\n\ + mov r1, #0x9\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl MenuDrawTextWindow\n\ + add r4, r6, #0\n\ + add r4, r4, #0x50\n\ + bl RtcGetErrorStatus\n\ + add r1, r0, #0\n\ + lsl r1, r1, #0x10\n\ + lsr r1, r1, #0x10\n\ + add r0, r4, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x4\n\ + bl ConvertIntToHexStringN\n\ + add r0, r4, #0\n\ + mov r1, #0x2\n\ + mov r2, #0xa\n\ + bl MenuPrint\n\ + ldr r0, ._158\n\ + mov r1, #0xc\n\ + mov r2, #0xc\n\ + bl MenuPrint\n\ + ldr r0, ._158 + 4\n\ + mov r1, #0x14\n\ + mov r2, #0xc\n\ + bl MenuPrint\n\ + ldr r0, ._158 + 8\n\ + mov r1, #0x1\n\ + mov r2, #0xe\n\ + bl MenuPrint\n\ + ldr r0, ._158 + 12\n\ + mov r1, #0x1\n\ + mov r2, #0x10\n\ + bl MenuPrint\n\ +._151:\n\ + ldrh r0, [r5]\n\ + add r0, r0, #0x1\n\ + strh r0, [r5]\n\ + b ._165\n\ +._159:\n\ + .align 2, 0\n\ +._158:\n\ + .word gUnknown_08376500+0x4\n\ + .word gUnknown_08376500+0x9\n\ + .word gUnknown_08376500+0x17\n\ + .word gUnknown_08376500+0xd\n\ +._155:\n\ + bl RtcCalcLocalTime\n\ + add r0, r6, #0\n\ + bl FormatHexRtcTime\n\ + mov r2, #0x14\n\ + add r2, r2, r6\n\ + mov r9, r2\n\ + mov r0, r9\n\ + bl debug_sub_8009894\n\ + mov r0, #0x28\n\ + add r0, r0, r6\n\ + mov sl, r0\n\ + ldr r4, ._163\n\ + mov r1, #0x2\n\ + ldsb r1, [r4, r1]\n\ + mov r2, #0x3\n\ + ldsb r2, [r4, r2]\n\ + mov r3, #0x4\n\ + ldsb r3, [r4, r3]\n\ + bl FormatDecimalTime\n\ + mov r1, #0x3c\n\ + add r1, r1, r6\n\ + mov r8, r1\n\ + mov r2, #0x0\n\ + ldsh r1, [r4, r2]\n\ + mov r0, r8\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, ._163 + 4\n\ + ldrb r0, [r0, #0x12]\n\ + cmp r0, #0\n\ + bne ._160 @cond_branch\n\ + add r0, r6, #0\n\ + mov r1, #0x14\n\ + mov r2, #0xe\n\ + bl MenuPrint\n\ + mov r0, r9\n\ + mov r1, #0xc\n\ + mov r2, #0xe\n\ + bl MenuPrint\n\ + mov r0, sl\n\ + mov r1, #0x14\n\ + mov r2, #0x10\n\ + bl MenuPrint\n\ + mov r0, r8\n\ + mov r1, #0xc\n\ + mov r2, #0x10\n\ + bl MenuPrint\n\ +._160:\n\ + ldrh r1, [r5, #0x2]\n\ + mov r2, #0x2\n\ + ldsh r0, [r5, r2]\n\ + cmp r0, #0x13\n\ + ble ._161 @cond_branch\n\ + add r0, r1, #1\n\ + strh r0, [r5, #0x2]\n\ + b ._165\n\ +._164:\n\ + .align 2, 0\n\ +._163:\n\ + .word gLocalTime\n\ + .word gSaveBlock2\n\ +._161:\n\ + ldr r0, ._166\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._165 @cond_branch\n\ + bl MenuZeroFillScreen\n\ + add r0, r7, #0\n\ + bl DestroyTask\n\ + bl ScriptContext2_Disable\n\ +._165:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._167:\n\ + .align 2, 0\n\ +._166:\n\ + .word gMain"); +} + +#endif \ No newline at end of file diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c index 5014e97e3..6d40c53aa 100644 --- a/src/field/field_fadetransition.c +++ b/src/field/field_fadetransition.c @@ -511,6 +511,22 @@ void sub_80810DC(void) CreateTask(sub_8081050, 10); } +#if DEBUG + +__attribute__((naked)) +void debug_sub_80888D8() +{ + asm("\ + PUSH {LR}\n\ + BL debug_sub_8052E04\n\ + BL sub_8080E88\n\ + BL ScriptContext2_Enable\n\ + POP {R0}\n\ + BX R0"); +} + +#endif + void task0A_fade_n_map_maybe(u8 taskId) { struct Task *task = &gTasks[taskId]; diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c index e4328acfc..7d90b9f4d 100644 --- a/src/field/fldeff_cut.c +++ b/src/field/fldeff_cut.c @@ -72,6 +72,115 @@ static const struct SpriteTemplate gSpriteTemplate_CutGrass = .callback = sub_80A2A48, }; +#if DEBUG +__attribute__((naked)) +void debug_sub_80AFEE4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " mov r0, #0x52\n" + " bl npc_before_player_of_type\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._1 @cond_branch\n" + " ldr r1, ._3\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl sub_80A2634\n" + " b ._8\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gLastFieldPokeMenuOpened\n" + "._1:\n" + " ldr r4, ._9\n" + " add r1, r4, #2\n" + " add r0, r4, #0\n" + " bl PlayerGetDestCoords\n" + " mov r7, #0x0\n" + " mov r8, r4\n" + "._12:\n" + " ldr r1, ._9 + 4\n" + " add r0, r7, r1\n" + " mov r2, r8\n" + " ldrh r2, [r2, #0x2]\n" + " add r0, r0, r2\n" + " mov r6, #0x0\n" + " lsl r0, r0, #0x10\n" + " asr r5, r0, #0x10\n" + "._11:\n" + " ldr r1, ._9 + 4\n" + " add r0, r6, r1\n" + " mov r2, r8\n" + " ldrh r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " asr r4, r0, #0x10\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " bl MapGridGetZCoordAt\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r2, r8\n" + " mov r1, #0x4\n" + " ldsb r1, [r2, r1]\n" + " cmp r0, r1\n" + " bne ._7 @cond_branch\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " bl MapGridGetMetatileBehaviorAt\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r0, r4, #0\n" + " bl MetatileBehavior_IsPokeGrass\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._6 @cond_branch\n" + " add r0, r4, #0\n" + " bl MetatileBehavior_IsAshGrass\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._7 @cond_branch\n" + "._6:\n" + " ldr r1, ._9 + 8\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl sub_80A25E8\n" + " b ._8\n" + "._10:\n" + " .align 2, 0\n" + "._9:\n" + " .word gUnknown_0203923C\n" + " .word 0xffff\n" + " .word gLastFieldPokeMenuOpened\n" + "._7:\n" + " add r0, r6, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " cmp r6, #0x2\n" + " bls ._11 @cond_branch\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x2\n" + " bls ._12 @cond_branch\n" + " bl ScriptContext2_Disable\n" + "._8:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} +#endif + bool8 SetUpFieldMove_Cut(void) { s16 x, y; diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c index 22f170184..d8f70200c 100644 --- a/src/field/fldeff_flash.c +++ b/src/field/fldeff_flash.c @@ -71,6 +71,36 @@ static const u16 gUnknown_083F809C[] = INCBIN_U16("graphics/misc/83F809C.gbapal" static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz"); static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz"); +#if DEBUG +__attribute__((naked)) +void debug_sub_8122080(void) +{ + asm("\ + push {lr}\n\ + ldr r0, ._4\n\ + ldrb r0, [r0, #0x15]\n\ + cmp r0, #0x1\n\ + bne ._2 @cond_branch\n\ + ldr r0, ._4 + 4\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._2 @cond_branch\n\ + bl sub_810CBFC\n\ + b ._3\n\ +._5:\n\ + .align 2, 0\n\ +._4:\n\ + .word gMapHeader\n\ + .word 0x828\n\ +._2:\n\ + bl ScriptContext2_Disable\n\ +._3:\n\ + pop {r0}\n\ + bx r0"); +} +#endif + bool8 SetUpFieldMove_Flash(void) { if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH)) diff --git a/src/field/fldeff_strength.c b/src/field/fldeff_strength.c index 565ac1651..9f9cd4013 100644 --- a/src/field/fldeff_strength.c +++ b/src/field/fldeff_strength.c @@ -1,4 +1,5 @@ #include "global.h" +#include "constants/map_objects.h" #include "braille_puzzles.h" #include "field_effect.h" #include "party_menu.h" @@ -20,6 +21,28 @@ extern void (*gUnknown_03005CE4)(void); extern u8 S_UseStrength[]; +#if DEBUG +void debug_sub_8130318(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + gLastFieldPokeMenuOpened = 0; + gSpecialVar_Result = 0; + sub_811AA38(); + } + else if (npc_before_player_of_type(MAP_OBJ_GFX_PUSHABLE_BOULDER) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + gSpecialVar_Result = 0; + sub_811AA18(); + } + else + { + ScriptContext2_Disable(); + } +} +#endif + bool8 SetUpFieldMove_Strength(void) { if (ShouldDoBrailleStrengthEffect()) diff --git a/src/field/item_menu.c b/src/field/item_menu.c index e0575af4c..125edfef2 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -158,6 +158,9 @@ extern struct PocketScrollState gBagPocketScrollStates[]; extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots extern const u8 Event_NoRegisteredItem[]; +// TODO: decompile the debug code so we can use static in this file +#define static + extern const struct CompressedSpriteSheet sMaleBagSpriteSheet; extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet; extern const struct CompressedSpritePalette sBagSpritePalette; @@ -384,6 +387,390 @@ static void sub_80A3134(void) } } +#if DEBUG +__attribute__((naked)) +static bool8 SetupBagMultistep(void) +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._5\n\ + ldr r1, ._5 + 4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x10\n\ + bls ._3 @cond_branch\n\ + b ._66\n\ +._3:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._5 + 8\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._6:\n\ + .align 2, 0\n\ +._5:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._7\n\ +._7:\n\ + .word ._8\n\ + .word ._9\n\ + .word ._10\n\ + .word ._11\n\ + .word ._12\n\ + .word ._13\n\ + .word ._14\n\ + .word ._15\n\ + .word ._16\n\ + .word ._17\n\ + .word ._18\n\ + .word ._19\n\ + .word ._20\n\ + .word ._21\n\ + .word ._22\n\ + .word ._23\n\ + .word ._24\n\ +._8:\n\ + bl sub_80F9438\n\ + bl sub_80A34E8\n\ + b ._61\n\ +._9:\n\ + bl remove_some_task\n\ + ldr r1, ._27\n\ + ldr r0, ._27 + 4\n\ + add r1, r1, r0\n\ + b ._62\n\ +._28:\n\ + .align 2, 0\n\ +._27:\n\ + .word gMain\n\ + .word 0x43c\n\ +._10:\n\ + bl gpu_pal_allocator_reset__manage_upper_four\n\ + b ._61\n\ +._11:\n\ + bl sub_80F9020\n\ + ldr r0, ._31\n\ + ldr r1, ._31 + 4\n\ + add r0, r0, r1\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ + b ._61\n\ +._32:\n\ + .align 2, 0\n\ +._31:\n\ + .word +0x2000000\n\ + .word 0x1ffff\n\ +._12:\n\ + bl ResetPaletteFade\n\ + ldr r2, ._34\n\ + ldrb r0, [r2, #0x8]\n\ + mov r1, #0x80\n\ + orr r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._34 + 4\n\ + ldr r0, ._34 + 8\n\ + add r1, r1, r0\n\ + b ._62\n\ +._35:\n\ + .align 2, 0\n\ +._34:\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._13:\n\ + bl ResetSpriteData\n\ + b ._61\n\ +._14:\n\ + bl sub_80A3520\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._37 @cond_branch\n\ + b ._66\n\ +._37:\n\ + ldr r1, ._40\n\ + ldr r0, ._40 + 4\n\ + add r1, r1, r0\n\ + b ._62\n\ +._41:\n\ + .align 2, 0\n\ +._40:\n\ + .word gMain\n\ + .word 0x43c\n\ +._15:\n\ + ldr r0, ._43\n\ + bl SetUpWindowConfig\n\ + b ._61\n\ +._44:\n\ + .align 2, 0\n\ +._43:\n\ + .word gWindowConfig_81E6DFC\n\ +._16:\n\ + ldr r0, ._46\n\ + bl MultistepInitMenuWindowBegin\n\ + ldr r1, ._46 + 4\n\ + ldr r0, ._46 + 8\n\ + add r1, r1, r0\n\ + b ._62\n\ +._47:\n\ + .align 2, 0\n\ +._46:\n\ + .word gWindowConfig_81E6DFC\n\ + .word gMain\n\ + .word 0x43c\n\ +._17:\n\ + bl MultistepInitMenuWindowContinue\n\ + cmp r0, #0\n\ + bne ._48 @cond_branch\n\ + b ._66\n\ +._48:\n\ + b ._61\n\ +._18:\n\ + bl sub_80F944C\n\ + bl LoadScrollIndicatorPalette\n\ + mov r0, #0x0\n\ + mov r1, #0xac\n\ + mov r2, #0xc\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x1\n\ + mov r1, #0xac\n\ + mov r2, #0x94\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x2\n\ + mov r1, #0x1c\n\ + mov r2, #0x58\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x3\n\ + mov r1, #0x64\n\ + mov r2, #0x58\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x0\n\ + mov r1, #0x2\n\ + bl sub_80F9988\n\ + mov r0, #0x1\n\ + mov r1, #0x2\n\ + bl sub_80F9988\n\ + mov r0, #0x2\n\ + mov r1, #0x2\n\ + bl sub_80F9988\n\ + mov r0, #0x3\n\ + mov r1, #0x2\n\ + bl sub_80F9988\n\ + ldr r0, ._53\n\ + ldrb r0, [r0]\n\ + sub r0, r0, #0x4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bhi ._51 @cond_branch\n\ + mov r0, #0x2\n\ + mov r1, #0x1\n\ + bl sub_80F979C\n\ + mov r0, #0x3\n\ + mov r1, #0x1\n\ + bl sub_80F979C\n\ +._51:\n\ + ldr r1, ._53 + 4\n\ + ldr r0, ._53 + 8\n\ + add r1, r1, r0\n\ + b ._62\n\ +._54:\n\ + .align 2, 0\n\ +._53:\n\ + .word gUnknown_03000701\n\ + .word gMain\n\ + .word 0x43c\n\ +._19:\n\ + ldr r1, ._56\n\ + mov r0, #0x10\n\ + strb r0, [r1]\n\ + ldr r4, ._56 + 4\n\ + ldr r5, ._56 + 8\n\ + ldrb r1, [r5]\n\ + add r1, r1, #0x1\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + add r0, r4, #0\n\ + bl sub_80A39B8\n\ + ldrb r1, [r5]\n\ + add r0, r4, #0\n\ + bl sub_80A3AC0\n\ + bl sub_80A3D08\n\ + ldr r4, ._56 + 12\n\ + ldr r0, [r4, #0x10]\n\ + ldr r1, [r4, #0x14]\n\ + bl sub_80A3C34\n\ + ldr r0, [r4, #0x18]\n\ + ldr r1, [r4, #0x1c]\n\ + bl sub_80A3C34\n\ + bl sub_80A3D40\n\ + ldr r1, ._56 + 16\n\ + mov r0, #0x0\n\ + ldsb r0, [r5, r0]\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r4\n\ + ldr r0, [r0]\n\ + str r0, [r1]\n\ + bl sub_80A362C\n\ + b ._61\n\ +._57:\n\ + .align 2, 0\n\ +._56:\n\ + .word gUnknown_0203855A\n\ + .word gBGTilemapBuffers+0x1000\n\ + .word gUnknown_02038559\n\ + .word gBagPockets\n\ + .word gUnknown_03005D24\n\ +._20:\n\ + ldr r0, ._59\n\ + mov r1, #0x0\n\ + mov r2, #0x7\n\ + bl sub_80A48E8\n\ + ldr r1, ._59 + 4\n\ + ldr r4, ._59 + 8\n\ + mov r0, #0x0\n\ + ldsb r0, [r4, r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x1]\n\ + ldrb r0, [r0]\n\ + add r1, r1, r0\n\ + ldr r0, ._59 + 12\n\ + ldr r0, [r0]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + mov r2, #0x0\n\ + ldsh r0, [r1, r2]\n\ + bl ItemListMenu_InitDescription\n\ + bl ItemListMenu_InitMenu\n\ + ldr r1, ._59 + 16\n\ + ldrb r0, [r4]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + ldr r1, ._59 + 20\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + ldr r1, ._59 + 24\n\ + ldr r0, ._59 + 28\n\ + add r1, r1, r0\n\ + b ._62\n\ +._60:\n\ + .align 2, 0\n\ +._59:\n\ + .word 0xffff\n\ + .word gUnknown_03005D10\n\ + .word gUnknown_02038559\n\ + .word gUnknown_03005D24\n\ + .word gUnknown_0203855B\n\ + .word gUnknown_0203855C\n\ + .word gMain\n\ + .word 0x43c\n\ +._21:\n\ + bl CreateBagSprite\n\ + mov r0, #0x0\n\ + bl CreateBagPokeballSprite\n\ + bl sub_80A3740\n\ + b ._61\n\ +._22:\n\ + ldr r3, ._63\n\ + ldrh r2, [r3]\n\ + mov r0, #0x0\n\ + strh r0, [r3]\n\ + ldr r4, ._63 + 4\n\ + ldrh r0, [r4]\n\ + mov r1, #0x1\n\ + orr r0, r0, r1\n\ + strh r0, [r4]\n\ + strh r2, [r3]\n\ + ldr r2, ._63 + 8\n\ + ldrh r0, [r2]\n\ + mov r1, #0x8\n\ + orr r0, r0, r1\n\ + strh r0, [r2]\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r2, ._63 + 12\n\ + ldrb r1, [r2, #0x8]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._63 + 16\n\ + ldr r0, ._63 + 20\n\ + add r1, r1, r0\n\ + b ._62\n\ +._64:\n\ + .align 2, 0\n\ +._63:\n\ + .word 0x4000208\n\ + .word 0x4000200\n\ + .word 0x4000004\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._23:\n\ + bl sub_8055870\n\ + cmp r0, #0x1\n\ + beq ._66 @cond_branch\n\ +._61:\n\ + ldr r1, ._67\n\ + ldr r2, ._67 + 4\n\ + add r1, r1, r2\n\ +._62:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._66\n\ +._68:\n\ + .align 2, 0\n\ +._67:\n\ + .word gMain\n\ + .word 0x43c\n\ +._24:\n\ + ldr r0, ._71\n\ + bl SetVBlankCallback\n\ + ldr r0, ._71 + 4\n\ + bl SetMainCallback2\n\ + bl sub_80A751C\n\ + bl sub_80A7630\n\ + bl sub_80A770C\n\ + bl sub_80A7828\n\ + bl sub_80A78B8\n\ + ldr r0, ._71 + 8\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._69 @cond_branch\n\ + ldr r0, ._71 + 12\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x8\n\ + ldr r2, ._71 + 16\n\ + mov r3, #0x0\n\ + bl debug_sub_8008218\n\ +._69:\n\ + mov r0, #0x1\n\ + b ._70\n\ +._72:\n\ + .align 2, 0\n\ +._71:\n\ + .word sub_80A3134+1\n\ + .word sub_80A3118+1\n\ + .word gLinkOpen\n\ + .word 0x600f5e0\n\ + .word 0x600f800\n\ +._66:\n\ + mov r0, #0x0\n\ +._70:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1"); +} +#else static bool8 SetupBagMultistep(void) { u32 index; @@ -508,6 +895,7 @@ static bool8 SetupBagMultistep(void) } return FALSE; } +#endif static bool8 sub_80A34B4(void) { @@ -634,6 +1022,79 @@ void ClearBag(void) ResetBagScrollPositions(); } +#if DEBUG +__attribute__((naked)) +void debug_sub_80A3714() +{ + asm("\ + push {r4, r5, r6, lr}\n\ + add sp, sp, #0xfffffff4\n\ + mov r5, #0x0\n\ + ldr r2, ._138\n\ + mov r1, #0x0\n\ +._134:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, sp\n\ + strh r1, [r0]\n\ + add r0, r5, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r5, r0, #0x10\n\ + cmp r5, #0x4\n\ + bls ._134 @cond_branch\n\ + mov r5, #0x0\n\ + ldrh r0, [r2]\n\ + cmp r0, #0\n\ + beq ._136 @cond_branch\n\ + add r6, r2, #0\n\ +._137:\n\ + lsl r4, r5, #0x2\n\ + add r4, r4, r6\n\ + ldrh r0, [r4]\n\ + bl ItemId_GetPocket\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x8\n\ + ldr r1, ._138 + 4\n\ + add r0, r0, r1\n\ + lsr r0, r0, #0x10\n\ + ldr r1, ._138 + 8\n\ + lsl r2, r0, #0x3\n\ + add r2, r2, r1\n\ + lsl r0, r0, #0x1\n\ + mov r1, sp\n\ + add r3, r1, r0\n\ + ldrh r1, [r3]\n\ + ldr r0, [r2]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldr r0, [r4]\n\ + str r0, [r1]\n\ + ldrh r0, [r3]\n\ + add r0, r0, #0x1\n\ + strh r0, [r3]\n\ + add r0, r5, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r5, r0, #0x10\n\ + cmp r5, #0x3b\n\ + bhi ._136 @cond_branch\n\ + lsl r0, r5, #0x2\n\ + add r0, r0, r6\n\ + ldrh r0, [r0]\n\ + cmp r0, #0\n\ + bne ._137 @cond_branch\n\ +._136:\n\ + add sp, sp, #0xc\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._139:\n\ + .align 2, 0\n\ +._138:\n\ + .word gUnknown_Debug_083EBC68\n\ + .word 0xffff0000\n\ + .word gBagPockets"); +} +#endif + static void sub_80A3740(void) { const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; @@ -3573,12 +4034,49 @@ static void sub_80A73FC(void) MenuCursor_Destroy814AD44(); } +#if DEBUG +__attribute__((naked)) +static void sub_80A740C(void) +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + bl sub_80A75E4\n\ + bl sub_80A7768\n\ + bl sub_80A7420\n\ + ldr r0, ._931\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._930 @cond_branch\n\ + ldr r0, ._931 + 4\n\ + ldr r1, ._931 + 8\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._930:\n\ + add sp, sp, #0x4\n\ + pop {r0}\n\ + bx r0\n\ +._932:\n\ + .align 2, 0\n\ +._931:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else static void sub_80A740C(void) { sub_80A75E4(); sub_80A7768(); sub_80A7420(); } +#endif static void sub_80A7420(void) { diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c index 70234ac48..2b3405640 100644 --- a/src/pokemon/pokemon_menu.c +++ b/src/pokemon/pokemon_menu.c @@ -912,6 +912,48 @@ static bool8 SetUpFieldMove_Waterfall(void) return FALSE; } +#if DEBUG +__attribute__((naked)) +void debug_sub_80986AC() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + mov r4, sp\n\ + add r4, r4, #0x2\n\ + mov r0, sp\n\ + add r1, r4, #0\n\ + bl GetXYCoordsOneStepInFrontOfPlayer\n\ + mov r0, sp\n\ + mov r1, #0x0\n\ + ldsh r0, [r0, r1]\n\ + mov r2, #0x0\n\ + ldsh r1, [r4, r2]\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl MetatileBehavior_IsWaterfall\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._274 @cond_branch\n\ + bl IsPlayerSurfingNorth\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._274 @cond_branch\n\ + bl sub_808AE08\n\ + b ._275\n\ +._274:\n\ + bl ScriptContext2_Disable\n\ +._275:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0"); +} +#endif + static void sub_808AE8C(void) { u8 i; -- cgit v1.2.3 From 233654746815b884d303cc3416c3fe6c377b4a73 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 17:30:45 -0600 Subject: resolve more undefined references --- src/battle/battle_2.c | 86 ++++++++++++++++++++--------------------- src/debug/kagaya_debug_menu.c | 6 +-- src/debug/nohara_debug_menu.c | 4 +- src/debug/start_menu_debug.c | 10 ++--- src/debug/taya_debug_window.c | 6 +-- src/debug/unk_debug_menu_3.c | 10 ++--- src/debug/watanabe_debug_menu.c | 4 +- src/engine/mystery_event_menu.c | 24 ++++++------ src/engine/reset_rtc_screen.c | 20 +++++----- src/engine/save.c | 4 +- src/field/berry_tag_screen.c | 2 +- src/field/choose_party.c | 2 +- src/field/field_weather.c | 10 ++--- src/field/item_menu.c | 28 +++++++------- src/field/mauville_man.c | 10 ++--- src/field/region_map.c | 14 +++---- src/field/slot_machine.c | 16 ++++---- src/field/start_menu.c | 2 +- src/pokemon/pokedex.c | 4 +- 19 files changed, 131 insertions(+), 131 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 454b47e08..7a819a8ef 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -340,13 +340,13 @@ void InitBattle(void) " .word 0x5006000\n" " .word 0x400004c\n" " .word 0x5051\n" - " .word gUnknown_030042C4\n" + " .word gBattle_WIN0H\n" " .word gUnknown_03004240\n" - " .word gUnknown_03004DE0\n" + " .word gScanlineEffectRegBuffers\n" " .word gUnknown_081F9674\n" " .word 0xff10\n" - " .word gWindowConfig_81E6C58\n" - " .word gUnknown_030042A4\n" + " .word gWindowTemplate_81E6C58\n" + " .word gBattle_BG0_X\n" " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" " .word gBattle_BG1_Y\n" @@ -358,9 +358,9 @@ void InitBattle(void) " .word gBattleTerrain\n" " .word gUnknown_03004210\n" " .word gUnknown_030041D0\n" - " .word gWindowConfig_81E71D0\n" + " .word gWindowTemplate_81E71D0\n" " .word gUnknown_03004250\n" - " .word gWindowConfig_81E71EC\n" + " .word gWindowTemplate_81E71EC\n" " .word gReservedSpritePaletteCount\n" " .word sub_800FCFC+1\n" " .word gBattleTypeFlags\n" @@ -1068,7 +1068,7 @@ void sub_800EC9C() " .word gPreBattleCallback1\n" " .word gMain\n" " .word debug_sub_80139E4+1\n" - " .word sub_800F808+1\n" + " .word BattleMainCB2+1\n" " .word gBattleTypeFlags\n" " .word gTrainerBattleOpponent\n" "\n" @@ -2313,7 +2313,7 @@ void sub_800F298() " .word gPreBattleCallback1\n" " .word gMain\n" " .word debug_sub_80139E4+1\n" - " .word sub_800F808+1\n" + " .word BattleMainCB2+1\n" " .word gBattleTypeFlags\n" " .word gTrainerBattleOpponent\n" "\n" @@ -3332,7 +3332,7 @@ void debug_sub_80108B8() " .word 0x40000d4\n" " .word 0x85006000\n" " .word 0x4000200\n" - " .word gUnknown_030042A4\n" + " .word gBattle_BG0_X\n" " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" " .word gBattle_BG1_Y\n" @@ -3350,7 +3350,7 @@ void debug_sub_80108B8() " .word 0x50001e0\n" " .word debug_sub_8011D40+1\n" " .word debug_sub_8010CAC+1\n" - " .word gWindowConfig_81E6C3C\n" + " .word gWindowTemplate_81E6C3C\n" " .word gUnknown_Debug_03004370\n" " .word gUnknown_Debug_03004360\n" " .word gUnknown_Debug_030043A0\n" @@ -5837,7 +5837,7 @@ void debug_sub_8011D40() " .word +0x2000000\n" " .word 0x6004000\n" " .word 0x80000800\n" - " .word gUnknown_030042A4\n" + " .word gBattle_BG0_X\n" " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" " .word gBattle_BG1_Y\n" @@ -5910,7 +5910,7 @@ void debug_sub_8011DD4() "._776:\n" " .word 0x4000008\n" " .word 0x9803\n" - " .word gUnknown_030042A4\n" + " .word gBattle_BG0_X\n" " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" " .word gBattle_BG1_Y\n" @@ -6063,7 +6063,7 @@ void debug_sub_8011EA0() " mov r3, r8\n" " bl Text_InitWindow\n" " ldr r0, ._823 + 8\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldr r1, ._823 + 12\n" " mov sl, r1\n" " lsl r4, r7, #0x1\n" @@ -6092,7 +6092,7 @@ void debug_sub_8011EA0() " add r1, r6, #0\n" " bl Text_InitWindow\n" " ldr r0, ._823 + 8\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " mov r0, #0xff\n" " strb r0, [r6]\n" " ldrb r0, [r5]\n" @@ -6115,7 +6115,7 @@ void debug_sub_8011EA0() " mov r3, r8\n" " bl Text_InitWindow\n" " ldr r0, ._823 + 8\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " b ._848\n" "._824:\n" " .align 2, 0\n" @@ -6173,7 +6173,7 @@ void debug_sub_8011EA0() " mov r1, sl\n" " bl Text_InitWindow\n" " add r0, r6, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " lsl r4, r7, #0x1\n" " ldr r5, ._830 + 12\n" " ldrb r0, [r5]\n" @@ -6201,7 +6201,7 @@ void debug_sub_8011EA0() " mov r1, sl\n" " bl Text_InitWindow\n" " add r0, r6, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " mov r0, #0xff\n" " mov r1, sl\n" " strb r0, [r1]\n" @@ -6252,7 +6252,7 @@ void debug_sub_8011EA0() " add r0, r6, #0\n" " bl Text_InitWindow\n" " add r0, r6, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " b ._848\n" "._834:\n" " .align 2, 0\n" @@ -6284,7 +6284,7 @@ void debug_sub_8011EA0() " add r1, r6, #0\n" " bl Text_InitWindow\n" " add r0, r5, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " mov r4, #0x0\n" " ldr r3, ._839 + 12\n" " lsl r1, r7, #0x1\n" @@ -6366,7 +6366,7 @@ void debug_sub_8011EA0() " add r1, r6, #0\n" " bl Text_InitWindow\n" " add r0, r5, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " b ._848\n" "._850:\n" " .align 2, 0\n" @@ -6408,7 +6408,7 @@ void debug_sub_8011EA0() " add r1, r6, #0\n" " bl Text_InitWindow\n" " add r0, r5, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" "._848:\n" " add sp, sp, #0xc\n" " pop {r3, r4, r5}\n" @@ -6478,7 +6478,7 @@ void debug_sub_8012294() " mov r1, r9\n" " bl Text_InitWindow\n" " mov r0, sl\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldrb r4, [r7]\n" " lsl r4, r4, #0x1\n" " add r0, r5, #0\n" @@ -6515,7 +6515,7 @@ void debug_sub_8012294() " mov r1, r9\n" " bl Text_InitWindow\n" " mov r0, sl\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " mov r0, #0xff\n" " mov r1, r9\n" " strb r0, [r1]\n" @@ -6555,7 +6555,7 @@ void debug_sub_8012294() " mov r1, r9\n" " bl Text_InitWindow\n" " mov r0, sl\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" "._853:\n" " add sp, sp, #0x4\n" " pop {r3, r4, r5}\n" @@ -6616,7 +6616,7 @@ void debug_sub_80123D8() " add r3, r7, #0\n" " bl Text_InitWindow\n" " add r0, r4, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " lsl r5, r5, #0x1\n" " ldr r1, ._858 + 12\n" " ldrb r0, [r1]\n" @@ -6648,7 +6648,7 @@ void debug_sub_80123D8() " add r3, r7, #0\n" " bl Text_InitWindow\n" " add r0, r4, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " mov r0, #0x0\n" " mov r1, #0x12\n" " bl debug_sub_8010A7C\n" @@ -6663,7 +6663,7 @@ void debug_sub_80123D8() " mov r3, sl\n" " bl Text_InitWindow\n" " add r0, r4, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldr r1, ._858 + 12\n" " ldrb r0, [r1]\n" " mov r2, #0x46\n" @@ -6693,7 +6693,7 @@ void debug_sub_80123D8() " mov r3, sl\n" " bl Text_InitWindow\n" " add r0, r4, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " b ._857\n" "._859:\n" " .align 2, 0\n" @@ -6720,7 +6720,7 @@ void debug_sub_80123D8() " add r1, r6, #0\n" " bl Text_InitWindow\n" " add r0, r5, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldrh r2, [r4, #0x6]\n" " ldrb r3, [r4, #0x8]\n" " ldrb r0, [r4, #0xa]\n" @@ -6729,7 +6729,7 @@ void debug_sub_80123D8() " add r1, r6, #0\n" " bl Text_InitWindow\n" " add r0, r5, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" "._857:\n" " add sp, sp, #0x4\n" " pop {r3, r4, r5}\n" @@ -6783,7 +6783,7 @@ void debug_sub_8012540() " add r1, r5, #0\n" " bl Text_InitWindow\n" " add r0, r4, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " add sp, sp, #0x4\n" " pop {r4, r5, r6}\n" " pop {r0}\n" @@ -7130,8 +7130,8 @@ void debug_sub_8012688() " .word 0x40000d4\n" " .word 0x85006000\n" " .word 0x400004c\n" - " .word gWindowConfig_81E6C58\n" - " .word gUnknown_030042A4\n" + " .word gWindowTemplate_81E6C58\n" + " .word gBattle_BG0_X\n" " .word gBattle_BG0_Y\n" " .word gBattle_BG1_X\n" " .word gBattle_BG1_Y\n" @@ -7213,7 +7213,7 @@ void debug_sub_80128B4() " mov r3, #0x2\n" " bl Text_InitWindow\n" " add r0, r5, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldr r6, ._878 + 8\n" " ldrh r1, [r6]\n" " add r0, r4, #0\n" @@ -7239,7 +7239,7 @@ void debug_sub_80128B4() " mov r3, #0x2\n" " bl Text_InitWindow\n" " add r0, r5, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " add sp, sp, #0x4\n" " pop {r3}\n" " mov r8, r3\n" @@ -7284,7 +7284,7 @@ void debug_sub_8012938() " mov r3, #0x2\n" " bl Text_InitWindow\n" " add r0, r6, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldr r1, ._880 + 8\n" " add r0, r4, #0\n" " bl StringCopy\n" @@ -7308,7 +7308,7 @@ void debug_sub_8012938() " mov r3, #0x2\n" " bl Text_InitWindow\n" " add r0, r6, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldr r2, ._880 + 20\n" " ldr r1, ._880 + 24\n" " lsl r0, r5, #0x2\n" @@ -7624,7 +7624,7 @@ void debug_sub_8012B70() " mov r3, #0x1a\n" " bl Text_InitWindow\n" " add r0, r5, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " strh r6, [r4, #0xe]\n" " mov r0, #0x0\n" " bl debug_sub_8012B2C\n" @@ -7670,7 +7670,7 @@ void debug_sub_8012C08() " mov r3, #0x2\n" " bl Text_InitWindow\n" " add r0, r7, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " mov r0, #0x0\n" " mov r1, #0x7\n" " bl debug_sub_8010A7C\n" @@ -7682,7 +7682,7 @@ void debug_sub_8012C08() " mov r3, #0x2\n" " bl Text_InitWindow\n" " add r0, r7, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0x18\n" @@ -7733,7 +7733,7 @@ void debug_sub_8012C08() " add r5, r4, #0\n" " ldr r4, ._907 + 8\n" " add r0, r4, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldr r1, ._907 + 12\n" " mov r2, #0xa4\n" " lsl r2, r2, #0x2\n" @@ -7743,7 +7743,7 @@ void debug_sub_8012C08() " mov r3, #0x1a\n" " bl Text_InitWindow\n" " add r0, r4, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldr r1, ._907\n" " add r0, r5, r6\n" " lsl r0, r0, #0x3\n" @@ -7818,7 +7818,7 @@ void debug_sub_8012D10() " mov r3, #0x13\n" " bl Text_InitWindow\n" " add r0, r4, #0\n" - " bl sub_8002F44\n" + " bl Text_PrintWindow8002F44\n" " ldr r1, ._920 + 8\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" diff --git a/src/debug/kagaya_debug_menu.c b/src/debug/kagaya_debug_menu.c index 8ece4ebec..321627a10 100644 --- a/src/debug/kagaya_debug_menu.c +++ b/src/debug/kagaya_debug_menu.c @@ -319,7 +319,7 @@ void debug_sub_80B0770() " .align 2, 0\n" "._30:\n" " .word gPlayerAvatar\n" - " .word gUnknown_0202FF84\n" + " .word gFieldEffectArguments\n" "._27:\n" " bl CloseMenu\n" "._29:\n" @@ -382,7 +382,7 @@ void debug_sub_80B07DC() "._37:\n" " .align 2, 0\n" "._36:\n" - " .word sub_80FC074+1\n" + " .word CB2_InitFlyRegionMap+1\n" "\n" ); } @@ -412,7 +412,7 @@ void debug_sub_80B0800() "._40:\n" " .align 2, 0\n" "._39:\n" - " .word gUnknown_0202FF84\n" + " .word gFieldEffectArguments\n" "\n" ); } diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c index 766137871..53c6394ba 100644 --- a/src/debug/nohara_debug_menu.c +++ b/src/debug/nohara_debug_menu.c @@ -419,7 +419,7 @@ void debug_sub_808F648() " bl debug_sub_808F6BC\n" " b ._40\n" "._32:\n" - " bl ProcessMenuInputNoWrap_\n" + " bl Menu_ProcessInputNoWrap_\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x1\n" @@ -998,7 +998,7 @@ void debug_sub_808FA88() " cmp r1, #0x21\n" " bls ._87 @cond_branch\n" " add r0, r7, #0\n" - " bl sub_80BFB54\n" + " bl GetTVChannelByShowType\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " add r1, r0, #0\n" diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index e4ae404e2..321bbb951 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -949,7 +949,7 @@ void DebugMenu_807706C() "._114:\n" " .align 2, 0\n" "._113:\n" - " .word gWindowConfig_81E6CE4\n" + " .word gWindowTemplate_81E6CE4\n" " .word gCallback_03004AE8\n" " .word DebugMenu_807709C+1\n" "\n" @@ -1893,7 +1893,7 @@ void DebugMenu_Teleport() { asm( " push {lr}\n" - " bl sub_8053570\n" + " bl Overworld_SetWarpDestToLastHealLoc\n" " bl sub_8080E88\n" " bl ScriptContext2_Enable\n" " bl CloseMenu\n" @@ -2384,7 +2384,7 @@ void DebugMenu_8077974() " asr r1, r1, #0x18\n" " lsl r1, r1, #0x10\n" " lsr r1, r1, #0x10\n" - " bl sub_8082C0C\n" + " bl DoesSomeoneWantRematchIn\n" " cmp r0, #0\n" " beq ._228 @cond_branch\n" " ldr r0, ._230 + 12\n" @@ -5977,7 +5977,7 @@ void DebugMenu_8079058() "._618:\n" " .word gDebug0x839C60C\n" "._612:\n" - " bl ProcessMenuInputNoWrap_\n" + " bl Menu_ProcessInputNoWrap_\n" " lsl r0, r0, #0x18\n" " asr r1, r0, #0x18\n" " mov r0, #0x2\n" @@ -6082,7 +6082,7 @@ void DebugMenu_8079110() "._639:\n" " .word gDebug0x839C60C+0xe\n" "._635:\n" - " bl MenuUpdateWindowText\n" + " bl Menu_UpdateWindowText\n" " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " beq ._642 @cond_branch\n" diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c index ce1cc47ee..842837b18 100644 --- a/src/debug/taya_debug_window.c +++ b/src/debug/taya_debug_window.c @@ -41,7 +41,7 @@ void TayaDebugMenu_Trend() " strb r1, [r0]\n" " ldrh r1, [r5, #0x4]\n" " add r0, r6, #0\n" - " bl sub_80EB3FC\n" + " bl EasyChat_GetWordText\n" " mov r0, sl\n" " add r1, r6, #0\n" " mov r2, #0x0\n" @@ -50,7 +50,7 @@ void TayaDebugMenu_Trend() " add r4, r0, #0\n" " ldrh r1, [r5, #0x6]\n" " add r0, r6, #0\n" - " bl sub_80EB3FC\n" + " bl EasyChat_GetWordText\n" " add r0, r4, #0\n" " add r1, r6, #0\n" " mov r2, #0x0\n" @@ -1995,7 +1995,7 @@ void debug_sub_80915BC() "._173:\n" " .align 2, 0\n" "._172:\n" - " .word gWindowConfig_81E7224\n" + " .word gWindowTemplate_81E7224\n" " .word gUnknown_Debug_083C517C\n" " .word +0x2000000\n" " .word debug_sub_8091320+1\n" diff --git a/src/debug/unk_debug_menu_3.c b/src/debug/unk_debug_menu_3.c index a217a0258..dfb92feb9 100644 --- a/src/debug/unk_debug_menu_3.c +++ b/src/debug/unk_debug_menu_3.c @@ -356,7 +356,7 @@ void debug_sub_813C5B4() " .word gOtherText_DataCannotUseVersion+0x331\n" " .word gOtherText_DataCannotUseVersion+0x30d\n" " .word gOtherText_DataCannotUseVersion+0x861\n" - " .word gFlashSectors+0x8\n" + " .word sUnusedFlashSectors+0x8\n" " .word 0xfff\n" " .word 0x52f\n" "\n" @@ -417,8 +417,8 @@ void debug_sub_813C638() " .align 2, 0\n" "._25:\n" " .word 0x270f\n" - " .word gFlashSectors+0xc\n" - " .word gFlashSectors+0x14\n" + " .word sUnusedFlashSectors+0xc\n" + " .word sUnusedFlashSectors+0x14\n" "\n" ); } @@ -588,7 +588,7 @@ void debug_sub_813C740() " .word gOtherText_DataCannotUseVersion+0x99e\n" " .word gOtherText_DataCannotUseVersion+0xa4a\n" " .word gEnemyParty\n" - " .word gFlashSectors+0x4\n" + " .word sUnusedFlashSectors+0x4\n" " .word gOtherText_DataCannotUseVersion+0x9c2\n" " .word gOtherText_DataCannotUseVersion+0xa26\n" "\n" @@ -788,7 +788,7 @@ void debug_sub_813C93C() "._37:\n" " .word gOtherText_DataCannotUseVersion+0xa4a\n" " .word gOtherText_DataCannotUseVersion+0xb61\n" - " .word gFlashSectors+0x24\n" + " .word sUnusedFlashSectors+0x24\n" " .word 0x270f\n" " .word gOtherText_DataCannotUseVersion+0xa61\n" "\n" diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index 731e58986..7288f602e 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -142,8 +142,8 @@ void debug_80C35DC() " .word 0x81000800\n" " .word stru_83F8828\n" " .word stru_83F8838\n" - " .word gWindowConfig_81E6C3C\n" - " .word gWindowConfig_81E6CE4\n" + " .word gWindowTemplate_81E6C3C\n" + " .word gWindowTemplate_81E6CE4\n" "\n" ); } diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index 522a185c8..8f280dc18 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -363,7 +363,7 @@ void debug_sub_815D04C() " mov r1, #0x4\n" " mov r2, #0xd\n" " mov r3, #0x7\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " ldr r1, ._125 + 4\n" " mov r2, #0xa\n" " ldsh r0, [r4, r2]\n" @@ -372,7 +372,7 @@ void debug_sub_815D04C() " ldr r0, [r0]\n" " mov r1, #0x5\n" " mov r2, #0x5\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldrh r0, [r4, #0x8]\n" " add r0, r0, #0x1\n" " strh r0, [r4, #0x8]\n" @@ -397,9 +397,9 @@ void debug_sub_815D04C() " .align 2, 0\n" "._125:\n" " .word gTasks\n" - " .word gFlashSectors+0x9c\n" + " .word sUnusedFlashSectors+0x9c\n" " .word gMain\n" - " .word gFlashSectors+0x11c\n" + " .word sUnusedFlashSectors+0x11c\n" "._123:\n" " sub r0, r1, #1\n" "._124:\n" @@ -435,7 +435,7 @@ void debug_sub_815D04C() " .align 2, 0\n" "._130:\n" " .word gTasks\n" - " .word gFlashSectors+0x11c\n" + " .word sUnusedFlashSectors+0x11c\n" "._128:\n" " ldrh r0, [r4, #0xa]\n" " add r0, r0, #0x1\n" @@ -481,7 +481,7 @@ void debug_sub_815D04C() " .align 2, 0\n" "._133:\n" " .word gTasks\n" - " .word gFlashSectors+0x9c\n" + " .word sUnusedFlashSectors+0x9c\n" " .word +0x2004000\n" " .word 0x43c\n" "\n" @@ -554,7 +554,7 @@ void debug_sub_815D1D8() " mov r1, #0xe\n" " mov r2, #0x1b\n" " mov r3, #0x13\n" - " bl MenuDrawTextWindow\n" + " bl Menu_DrawStdWindowFrame\n" " mov r0, #0x1\n" " neg r0, r0\n" " mov r1, #0x0\n" @@ -606,7 +606,7 @@ void debug_sub_815D1D8() " .word gUnknown_0841192C+0x14\n" " .word 0x43c\n" "._144:\n" - " bl MenuUpdateWindowText\n" + " bl Menu_UpdateWindowText\n" " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " bne ._163 @cond_branch\n" @@ -655,7 +655,7 @@ void debug_sub_815D1D8() " .word 0x43c\n" " .word gUnknown_0841192C+0x28\n" "._146:\n" - " bl MenuUpdateWindowText\n" + " bl Menu_UpdateWindowText\n" " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " bne ._173 @cond_branch\n" @@ -696,7 +696,7 @@ void debug_sub_815D1D8() " .word gMain\n" " .word 0x43c\n" "._149:\n" - " bl MenuUpdateWindowText\n" + " bl Menu_UpdateWindowText\n" " bl sub_8007ECC\n" " lsl r0, r0, #0x18\n" " cmp r0, #0\n" @@ -730,11 +730,11 @@ void debug_sub_815D1D8() " mov r1, #0xf\n" " mov r2, #0x1a\n" " mov r3, #0x12\n" - " bl MenuFillWindowRectWithBlankTile\n" + " bl Menu_BlankWindowRect\n" " ldr r0, ._190 + 4\n" " mov r1, #0x4\n" " mov r2, #0xf\n" - " bl MenuPrint\n" + " bl Menu_PrintText\n" " ldr r1, ._190 + 8\n" " ldr r2, ._190 + 12\n" " add r1, r1, r2\n" diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index a11e1b3e3..df4ab4f76 100644 --- a/src/engine/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c @@ -789,7 +789,7 @@ void debug_sub_806F9E4() mov r1, #0x9\n\ mov r2, #0x1d\n\ mov r3, #0x13\n\ - bl MenuDrawTextWindow\n\ + bl Menu_DrawStdWindowFrame\n\ add r4, r6, #0\n\ add r4, r4, #0x50\n\ bl RtcGetErrorStatus\n\ @@ -803,23 +803,23 @@ void debug_sub_806F9E4() add r0, r4, #0\n\ mov r1, #0x2\n\ mov r2, #0xa\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ldr r0, ._158\n\ mov r1, #0xc\n\ mov r2, #0xc\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ldr r0, ._158 + 4\n\ mov r1, #0x14\n\ mov r2, #0xc\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ldr r0, ._158 + 8\n\ mov r1, #0x1\n\ mov r2, #0xe\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ldr r0, ._158 + 12\n\ mov r1, #0x1\n\ mov r2, #0x10\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ._151:\n\ ldrh r0, [r5]\n\ add r0, r0, #0x1\n\ @@ -868,19 +868,19 @@ void debug_sub_806F9E4() add r0, r6, #0\n\ mov r1, #0x14\n\ mov r2, #0xe\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ mov r0, r9\n\ mov r1, #0xc\n\ mov r2, #0xe\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ mov r0, sl\n\ mov r1, #0x14\n\ mov r2, #0x10\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ mov r0, r8\n\ mov r1, #0xc\n\ mov r2, #0x10\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ._160:\n\ ldrh r1, [r5, #0x2]\n\ mov r2, #0x2\n\ diff --git a/src/engine/save.c b/src/engine/save.c index e1fb47dcc..1245d0a62 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -731,7 +731,7 @@ void sub_813B79C() " .align 2, 0\n" "._163:\n" " .word +0x2000000\n" - " .word gSaveSectionLocations\n" + " .word sSaveBlockChunks\n" " .word 0xff4\n" " .word 0xff6\n" " .word gHallOfFameSaveSectionLocations\n" @@ -892,7 +892,7 @@ u8 Save_LoadGameData(u8 saveType) return result; } -static const u8 sUnusedFlashSectors[] = { 30, 31 }; +const u8 sUnusedFlashSectors[] = { 30, 31 }; bool8 unref_sub_8125F4C(struct UnkSaveSection *a1) { diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c index a05d9bf87..56d578464 100644 --- a/src/field/berry_tag_screen.c +++ b/src/field/berry_tag_screen.c @@ -42,7 +42,7 @@ extern u8 gBerryCheck_Pal[]; extern u8 gUnknown_08E788E4[]; extern u8 gUnknown_08E78A84[]; -static const u8 *const gUnknown_0841192C[] = +const u8 *const gUnknown_0841192C[] = { ContestStatsText_VerySoft, ContestStatsText_Soft, diff --git a/src/field/choose_party.c b/src/field/choose_party.c index 8a54b0ad0..b108ede5a 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -601,7 +601,7 @@ void debug_sub_81381B4() " add r2, r4, #0\n" " bl GetMonData\n" " add r0, r4, #0\n" - " bl StripExtCtrlCodes\n" + " bl Text_StripExtCtrlCodes\n" " add r0, r5, #0\n" " mov r1, #0x3\n" " bl GetMonData\n" diff --git a/src/field/field_weather.c b/src/field/field_weather.c index 97eba16e0..1a4985892 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -1256,7 +1256,7 @@ u8 debug_sub_8085564(void) mov r1, #0x1\n\ mov r2, #0x1c\n\ mov r3, #0x2\n\ - bl MenuFillWindowRectWithBlankTile\n\ + bl Menu_BlankWindowRect\n\ ldr r1, ._380\n\ ldr r0, ._380 + 4\n\ ldrb r0, [r0]\n\ @@ -1265,7 +1265,7 @@ u8 debug_sub_8085564(void) ldr r0, [r0]\n\ mov r1, #0x17\n\ mov r2, #0x1\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ._377:\n\ ldr r0, ._380 + 8\n\ ldrh r1, [r0, #0x2e]\n\ @@ -1313,7 +1313,7 @@ u8 debug_sub_808560C(void) mov r1, #0x1\n\ mov r2, #0x1c\n\ mov r3, #0x2\n\ - bl MenuFillWindowRectWithBlankTile\n\ + bl Menu_BlankWindowRect\n\ ldr r1, ._384 + 8\n\ ldrb r0, [r4]\n\ lsl r0, r0, #0x2\n\ @@ -1321,7 +1321,7 @@ u8 debug_sub_808560C(void) ldr r0, [r0]\n\ mov r1, #0x17\n\ mov r2, #0x1\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ldr r1, ._384 + 12\n\ ldr r0, ._384 + 16\n\ str r0, [r1]\n\ @@ -1333,7 +1333,7 @@ u8 debug_sub_808560C(void) .align 2, 0\n\ ._384:\n\ .word gUnknown_0202FF58+0x2\n\ - .word gUnknown_0202F7E8\n\ + .word gWeather\n\ .word gDebugText_Weather\n\ .word gCallback_03004AE8\n\ .word debug_sub_8085564+1"); diff --git a/src/field/item_menu.c b/src/field/item_menu.c index 125edfef2..ce1f18cdb 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -483,7 +483,7 @@ static bool8 SetupBagMultistep(void) bl ResetSpriteData\n\ b ._61\n\ ._14:\n\ - bl sub_80A3520\n\ + bl LoadBagGraphicsMultistep\n\ lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._37 @cond_branch\n\ @@ -500,12 +500,12 @@ static bool8 SetupBagMultistep(void) .word 0x43c\n\ ._15:\n\ ldr r0, ._43\n\ - bl SetUpWindowConfig\n\ + bl Text_LoadWindowTemplate\n\ b ._61\n\ ._44:\n\ .align 2, 0\n\ ._43:\n\ - .word gWindowConfig_81E6DFC\n\ + .word gWindowTemplate_81E6DFC\n\ ._16:\n\ ldr r0, ._46\n\ bl MultistepInitMenuWindowBegin\n\ @@ -516,7 +516,7 @@ static bool8 SetupBagMultistep(void) ._47:\n\ .align 2, 0\n\ ._46:\n\ - .word gWindowConfig_81E6DFC\n\ + .word gWindowTemplate_81E6DFC\n\ .word gMain\n\ .word 0x43c\n\ ._17:\n\ @@ -578,7 +578,7 @@ static bool8 SetupBagMultistep(void) ._54:\n\ .align 2, 0\n\ ._53:\n\ - .word gUnknown_03000701\n\ + .word sReturnLocation\n\ .word gMain\n\ .word 0x43c\n\ ._19:\n\ @@ -595,15 +595,15 @@ static bool8 SetupBagMultistep(void) bl sub_80A39B8\n\ ldrb r1, [r5]\n\ add r0, r4, #0\n\ - bl sub_80A3AC0\n\ - bl sub_80A3D08\n\ + bl DrawPocketIndicatorDots\n\ + bl UpdateAllBagPockets\n\ ldr r4, ._56 + 12\n\ ldr r0, [r4, #0x10]\n\ ldr r1, [r4, #0x14]\n\ - bl sub_80A3C34\n\ + bl SortItemSlots\n\ ldr r0, [r4, #0x18]\n\ ldr r1, [r4, #0x1c]\n\ - bl sub_80A3C34\n\ + bl SortItemSlots\n\ bl sub_80A3D40\n\ ldr r1, ._56 + 16\n\ mov r0, #0x0\n\ @@ -619,9 +619,9 @@ static bool8 SetupBagMultistep(void) ._56:\n\ .word gUnknown_0203855A\n\ .word gBGTilemapBuffers+0x1000\n\ - .word gUnknown_02038559\n\ + .word sCurrentBagPocket\n\ .word gBagPockets\n\ - .word gUnknown_03005D24\n\ + .word gCurrentBagPocketItemSlots\n\ ._20:\n\ ldr r0, ._59\n\ mov r1, #0x0\n\ @@ -659,9 +659,9 @@ static bool8 SetupBagMultistep(void) .align 2, 0\n\ ._59:\n\ .word 0xffff\n\ - .word gUnknown_03005D10\n\ - .word gUnknown_02038559\n\ - .word gUnknown_03005D24\n\ + .word gBagPocketScrollStates\n\ + .word sCurrentBagPocket\n\ + .word gCurrentBagPocketItemSlots\n\ .word gUnknown_0203855B\n\ .word gUnknown_0203855C\n\ .word gMain\n\ diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 1bce9bc3f..91165a2ee 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -293,7 +293,7 @@ void debug_sub_810B32C() " lsr r2, r0, #0x18\n" " cmp r2, #0x7\n" " bls ._31 @cond_branch\n" - " bl sub_80F7A6C\n" + " bl SetupHipster\n" " mov r2, #0x0\n" " ldr r3, ._34\n" "._32:\n" @@ -313,13 +313,13 @@ void debug_sub_810B32C() "._34:\n" " .word gSaveBlock1+0x2d8c\n" "._27:\n" - " bl sub_80F7A98\n" + " bl SetupTrader\n" " b ._37\n" "._28:\n" - " bl sub_80F7A7C\n" + " bl SetupStoryteller\n" " b ._37\n" "._29:\n" - " bl sub_80F7A88\n" + " bl SetupGiddy\n" "._37:\n" " bl sub_80F83D0\n" " add sp, sp, #0x8\n" @@ -1313,7 +1313,7 @@ static void PrintStoryList(void) Menu_PrintText(gPCText_Cancel, 1, 2 + i * 2); } -static u8 gUnknown_03000748; +u8 gUnknown_03000748; static void Task_StoryListMenu(u8 taskId) { diff --git a/src/field/region_map.c b/src/field/region_map.c index 3bd64a8a0..d6ebf0b9f 100644 --- a/src/field/region_map.c +++ b/src/field/region_map.c @@ -289,7 +289,7 @@ static void SpriteCB_PlayerIconZoomedIn(struct Sprite *); const u8 *GetMapSectionName(u8 *, u16, u16); static void VBlankCB_FlyRegionMap(void); static void CB2_FlyRegionMap(void); -static void sub_80FC244(void (*func)(void)); +void sub_80FC244(void (*func)(void)); static void PrintFlyTargetName(void); static void CreateFlyTargetGraphics(void); static void CreateCityTownFlyTargetIcons(void); @@ -297,7 +297,7 @@ static void CreateSpecialAreaFlyTargetIcons(void); static void SpriteCB_FlyTargetIcons(struct Sprite *); static void sub_80FC5B4(void); static void sub_80FC600(void); -static void sub_80FC69C(void); +void sub_80FC69C(void); void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed) { @@ -1420,7 +1420,7 @@ struct UnknownStruct4 static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter}; -static const struct UnknownStruct4 sUnknown_083E79C0[1] = +const struct UnknownStruct4 gUnknown_083E79C0[1] = { {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY}, }; @@ -1598,7 +1598,7 @@ static void CB2_FlyRegionMap(void) BuildOamBuffer(); } -static void sub_80FC244(void (*func)(void)) +void sub_80FC244(void (*func)(void)) { ewram0_3.unk0 = func; ewram0_3.unk4 = 0; @@ -1611,9 +1611,9 @@ static void PrintFlyTargetName(void) u16 i = 0; int zero; - for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++) + for (i = 0; i < ARRAY_COUNT(gUnknown_083E79C0); i++) { - const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i]; + const struct UnknownStruct4 *r4 = &gUnknown_083E79C0[i]; if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId) { @@ -1796,7 +1796,7 @@ static void sub_80FC600(void) } } -static void sub_80FC69C(void) +void sub_80FC69C(void) { switch (ewram0_3.unk4) { diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index d84a6e592..c4a4128b3 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -64,7 +64,7 @@ static bool8 sub_8102008(struct Task *task); static bool8 sub_8102034(struct Task *task); static bool8 sub_8102058(struct Task *task); static bool8 sub_8102090(struct Task *task); -static bool8 sub_81020C8(struct Task *task); +bool8 sub_81020C8(struct Task *task); static bool8 sub_81021E0(struct Task *task); static bool8 sub_81021FC(struct Task *task); static bool8 sub_8102264(struct Task *task); @@ -244,7 +244,7 @@ void PlaySlotMachine(u8 arg0, MainCallback cb) ldr r3, ._1\n\ mov r2, #0x0\n\ strb r2, [r3]\n\ - bl sub_81019B0\n\ + bl PlaySlotMachine_Internal\n\ ldr r0, ._1 + 4\n\ bl SetMainCallback2\n\ pop {r0}\n\ @@ -253,7 +253,7 @@ void PlaySlotMachine(u8 arg0, MainCallback cb) .align 2, 0\n\ ._1:\n\ .word unk_debug_bss_1+0x1\n\ - .word sub_81018B8+1"); + .word CB2_SlotMachineSetup+1"); } #else void PlaySlotMachine(u8 arg0, MainCallback cb) @@ -274,7 +274,7 @@ void debug_sub_811609C() ldr r3, ._3\n\ mov r2, #0x1\n\ strb r2, [r3]\n\ - bl sub_81019B0\n\ + bl PlaySlotMachine_Internal\n\ ldr r0, ._3 + 4\n\ bl SetMainCallback2\n\ pop {r0}\n\ @@ -283,7 +283,7 @@ void debug_sub_811609C() .align 2, 0\n\ ._3:\n\ .word unk_debug_bss_1+0x1\n\ - .word sub_81018B8+1"); + .word CB2_SlotMachineSetup+1"); } #endif @@ -1412,7 +1412,7 @@ static bool8 sub_8102090(struct Task *task) #if DEBUG __attribute__((naked)) -static bool8 sub_81020C8(struct Task *task) +bool8 sub_81020C8(struct Task *task) { asm("\ push {r4, lr}\n\ @@ -1421,7 +1421,7 @@ static bool8 sub_81020C8(struct Task *task) mov r0, #0xc0\n\ and r0, r0, r1\n\ strb r0, [r4, #0x4]\n\ - bl sub_81027A0\n\ + bl CheckMatch\n\ ldrb r0, [r4, #0xa]\n\ cmp r0, #0\n\ beq ._163 @cond_branch\n\ @@ -1570,7 +1570,7 @@ static bool8 sub_81020C8(struct Task *task) .word 0x270f"); } #else -static bool8 sub_81020C8(struct Task *task) +bool8 sub_81020C8(struct Task *task) { eSlotMachine->unk04 &= 0xc0; CheckMatch(); diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 1e4eace87..17aeb8242 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -255,7 +255,7 @@ void debug_sub_8075C40() " .word 0x4000108\n" " .word 0xc34f\n" " .word 0x40000b0\n" - " .word gUnknown_03004DE0\n" + " .word gScanlineEffectRegBuffers\n" " .word 0xc5ff\n" " .word 0x7fff\n" " .word 0x4000040\n" diff --git a/src/pokemon/pokedex.c b/src/pokemon/pokedex.c index 4fb6a4920..4f656a910 100644 --- a/src/pokemon/pokedex.c +++ b/src/pokemon/pokedex.c @@ -1273,7 +1273,7 @@ static u8 sub_8091260(u16 num, u8, u8, u8); static void sub_8091304(const u8 *name, u8, u8); static void sub_8091458(u16 height, u8 i, u8 i1); static void sub_8091564(u16 weight, u8 i, u8 i1); -static void sub_8091738(u16, u16, u16); +void sub_8091738(u16, u16, u16); static void sub_80917CC(u16 i, u16 i1); static u16 sub_8091818(u8, u16, u16, u16); u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d); @@ -4457,7 +4457,7 @@ static void sub_8091564(u16 arg0, u8 left, u8 top) } #endif -static void sub_8091738(u16 num, u16 b, u16 c) +void sub_8091738(u16 num, u16 b, u16 c) { u8 arr[0x80]; u16 i; -- cgit v1.2.3 From 73392181fe47fd0fe5ac3702978307926a442ef4 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 18:08:02 -0600 Subject: resolve more undefined references --- src/battle/battle_2.c | 26 +++++++++++++------------- src/data/pokedex_entries_de.h | 3 ++- src/data/pokedex_entries_en.h | 2 +- src/debug/nohara_debug_menu.c | 2 +- src/debug/start_menu_debug.c | 18 +++++++++--------- src/debug/taya_debug_window.c | 30 +++++++++++++++--------------- src/debug/tomomichi_debug_menu.c | 4 ++-- src/debug/watanabe_debug_menu.c | 14 +++++++------- src/engine/cable_club.c | 2 +- src/engine/link.c | 4 ++-- src/engine/reset_rtc_screen.c | 4 ++-- src/engine/save.c | 2 +- src/engine/trade.c | 2 +- src/field/berry.c | 6 +++--- src/field/field_player_avatar.c | 2 +- src/field/field_weather.c | 2 +- src/field/fldeff_secretpower.c | 2 +- src/field/item_menu.c | 2 +- src/field/mauville_man.c | 2 +- src/field/region_map.c | 4 ++-- src/field/safari_zone.c | 2 +- src/field/start_menu.c | 2 +- src/field/wild_encounter.c | 10 +++++----- src/pokemon/mail.c | 2 +- 24 files changed, 75 insertions(+), 74 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 7a819a8ef..bedcb0bb6 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -238,7 +238,7 @@ void InitBattle(void) " strh r2, [r0]\n" " ldr r0, ._10 + 16\n" " strh r1, [r0]\n" - " bl dp12_8087EA4\n" + " bl ScanlineEffect_Clear\n" " ldr r0, ._10 + 20\n" " mov r3, #0xf0\n" " mov r5, #0xf0\n" @@ -272,7 +272,7 @@ void InitBattle(void) " ldr r0, [r4]\n" " ldr r1, [r4, #0x4]\n" " ldr r2, [r4, #0x8]\n" - " bl sub_80895F8\n" + " bl ScanlineEffect_SetParams\n" " ldr r4, ._10 + 32\n" " add r0, r4, #0\n" " bl Text_LoadWindowTemplate\n" @@ -300,7 +300,7 @@ void InitBattle(void) " and r0, r0, r1\n" " cmp r0, #0\n" " bne ._7 @cond_branch\n" - " bl GetBattleTerrain\n" + " bl BattleSetup_GetTerrain\n" " ldr r1, ._10 + 72\n" " strb r0, [r1]\n" "._7:\n" @@ -341,7 +341,7 @@ void InitBattle(void) " .word 0x400004c\n" " .word 0x5051\n" " .word gBattle_WIN0H\n" - " .word gUnknown_03004240\n" + " .word gBattle_WIN0V\n" " .word gScanlineEffectRegBuffers\n" " .word gUnknown_081F9674\n" " .word 0xff10\n" @@ -2641,10 +2641,10 @@ void BattleMainCB2(void) " .align 2, 0\n" "._358:\n" " .word gMain\n" - " .word gScriptResult\n" + " .word gSpecialVar_Result\n" " .word gBattleOutcome\n" " .word 0x43d\n" - " .word gUnknown_03004DC0\n" + " .word gScanlineEffect\n" " .word gPreBattleCallback1\n" " .word gBattleTypeFlags\n" " .word sub_805465C+1\n" @@ -2684,7 +2684,7 @@ void BattleMainCB2(void) " bl debug_sub_8008264\n" "._360:\n" " ldr r0, ._361 + 4\n" - " bl sub_800374C\n" + " bl Text_UpdateWindowInBattle\n" " bl UpdatePaletteFade\n" " bl RunTasks\n" " add sp, sp, #0x4\n" @@ -3255,7 +3255,7 @@ void debug_sub_80108B8() " bl LZDecompressVram\n" " ldr r0, ._507 + 60\n" " ldr r1, ._507 + 64\n" - " bl sub_800D238\n" + " bl LZDecompressWram\n" " ldr r4, ._507 + 68\n" " mov r1, #0xa0\n" " lsl r1, r1, #0x13\n" @@ -3271,7 +3271,7 @@ void debug_sub_80108B8() " bl SetMainCallback2\n" " bl ResetTasks\n" " bl ResetSpriteData\n" - " bl remove_some_task\n" + " bl ScanlineEffect_Stop\n" " ldr r4, ._507 + 84\n" " add r0, r4, #0\n" " bl Text_LoadWindowTemplate\n" @@ -3816,7 +3816,7 @@ void debug_sub_8010CAC() "._557:\n" " .align 2, 0\n" "._556:\n" - " .word gUnknown_03005E94\n" + " .word gCB2_AfterEvolution\n" " .word debug_sub_80108B8+1\n" " .word gPlayerParty\n" "._551:\n" @@ -5902,7 +5902,7 @@ void debug_sub_8011DD4() " bl LoadOam\n" " bl ProcessSpriteCopyRequests\n" " bl TransferPlttBuffer\n" - " bl sub_8089668\n" + " bl ScanlineEffect_InitHBlankDmaTransfer\n" " pop {r0}\n" " bx r0\n" "._777:\n" @@ -7167,7 +7167,7 @@ void debug_sub_8012878() " bl AnimateSprites\n" " bl BuildOamBuffer\n" " ldr r0, ._876\n" - " bl sub_800374C\n" + " bl Text_UpdateWindowInBattle\n" " bl UpdatePaletteFade\n" " bl RunTasks\n" " ldr r0, ._876 + 4\n" @@ -9472,7 +9472,7 @@ void sub_8010874() " .align 2, 0\n" "._1215:\n" " .word gUnknown_02024C4C\n" - " .word gUnknown_02024C44\n" + " .word gLastHitByType\n" " .word gMoveHitWith\n" " .word gLastUsedMove\n" " .word gDisableStructs\n" diff --git a/src/data/pokedex_entries_de.h b/src/data/pokedex_entries_de.h index 0f64cba66..413b73d90 100644 --- a/src/data/pokedex_entries_de.h +++ b/src/data/pokedex_entries_de.h @@ -6337,7 +6337,8 @@ static const u8 DexDescription_Deoxys_2[] = _( "dieses POKéMON ist sein Gehirn."); #endif -static const struct PokedexEntry gPokedexEntries[] = { +const struct PokedexEntry gPokedexEntries[] = +{ { // Dummy .categoryName = _("UNBEKANNT"), diff --git a/src/data/pokedex_entries_en.h b/src/data/pokedex_entries_en.h index 86da3d67b..933b1fc7d 100644 --- a/src/data/pokedex_entries_en.h +++ b/src/data/pokedex_entries_en.h @@ -5389,7 +5389,7 @@ static const u8 DexDescription_Deoxys_2[] = _( "chest appears to be its brain."); #endif -static const struct PokedexEntry gPokedexEntries[] = +const struct PokedexEntry gPokedexEntries[] = { { //Dummy .categoryName = _("UNKNOWN"), diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c index 53c6394ba..629b7b9eb 100644 --- a/src/debug/nohara_debug_menu.c +++ b/src/debug/nohara_debug_menu.c @@ -340,7 +340,7 @@ void debug_sub_808F5D8() "._29:\n" " ldr r5, ._30 + 8\n" " strh r4, [r5]\n" - " bl sub_810F424\n" + " bl GetSlotMachineId\n" " add r1, r0, #0\n" " lsl r1, r1, #0x10\n" " lsr r1, r1, #0x10\n" diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 321bbb951..b376a4076 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -46,7 +46,7 @@ void debug_sub_8076AC8() " mov r0, #0x11\n" " mov r1, #0x1\n" " add r2, r4, #0\n" - " bl PrintMenuItemsReordered\n" + " bl Menu_PrintItemsReordered\n" " mov r0, #0x0\n" " str r0, [sp]\n" " mov r0, #0xc\n" @@ -448,7 +448,7 @@ void DebugMenu_8076D50() { asm( " push {lr}\n" - " bl ClearSaveData\n" + " bl Save_EraseAllData\n" " mov r0, #0x0\n" " pop {r1}\n" " bx r1\n" @@ -1105,7 +1105,7 @@ void DebugMenu_807719C() " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x8\n" - " bl PrintMenuItemsReordered\n" + " bl Menu_PrintItemsReordered\n" " ldr r4, ._133 + 8\n" " ldrb r0, [r4]\n" " str r0, [sp]\n" @@ -1698,10 +1698,10 @@ void DebugMenu_NationalDex() " lsr r4, r4, #0x10\n" " add r0, r4, #0\n" " mov r1, #0x2\n" - " bl GetNationalPokedexFlag\n" + " bl GetSetPokedexFlag\n" " add r0, r4, #0\n" " mov r1, #0x3\n" - " bl GetNationalPokedexFlag\n" + " bl GetSetPokedexFlag\n" " cmp r4, r5\n" " bls ._177 @cond_branch\n" " ldr r1, ._178 + 4\n" @@ -1738,10 +1738,10 @@ void DebugMenu_HoennDex() " lsr r4, r4, #0x10\n" " add r0, r4, #0\n" " mov r1, #0x2\n" - " bl GetNationalPokedexFlag\n" + " bl GetSetPokedexFlag\n" " add r0, r4, #0\n" " mov r1, #0x3\n" - " bl GetNationalPokedexFlag\n" + " bl GetSetPokedexFlag\n" " cmp r5, #0xc9\n" " bls ._180 @cond_branch\n" " ldr r1, ._181\n" @@ -2356,7 +2356,7 @@ void DebugMenu_8077974() " asr r1, r1, #0x18\n" " lsl r1, r1, #0x10\n" " lsr r1, r1, #0x10\n" - " bl unref_sub_8082C2C\n" + " bl IsRematchTrainerIn\n" " cmp r0, #0\n" " beq ._224 @cond_branch\n" " ldr r0, ._226 + 4\n" @@ -4670,7 +4670,7 @@ void DebugMenu_80787EC() "._467:\n" " .align 2, 0\n" "._466:\n" - " .word gScriptResult\n" + " .word gSpecialVar_Result\n" " .word gStringVar1\n" " .word gStringVar2\n" " .word gStringVar3\n" diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c index 842837b18..8b586deb2 100644 --- a/src/debug/taya_debug_window.c +++ b/src/debug/taya_debug_window.c @@ -893,7 +893,7 @@ void TayaDebugMenu_PKMNLottery() " .align 2, 0\n" "._83:\n" " .word +0x2000000\n" - " .word gScriptResult\n" + " .word gSpecialVar_Result\n" " .word gCallback_03004AE8\n" " .word debug_sub_8090C88+1\n" "\n" @@ -911,44 +911,44 @@ void TayaDebugMenu_Trainer() " lsl r0, r4, #0x4\n" " add r0, r0, r5\n" " ldrh r0, [r0]\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " add r0, r4, #1\n" " lsl r0, r0, #0x10\n" " lsr r4, r0, #0x10\n" " cmp r4, #0x37\n" " bls ._85 @cond_branch\n" " ldr r0, ._86 + 4\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " mov r0, #0x85\n" " lsl r0, r0, #0x1\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " ldr r0, ._86 + 8\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " mov r0, #0x86\n" " lsl r0, r0, #0x1\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " ldr r0, ._86 + 12\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " mov r0, #0x87\n" " lsl r0, r0, #0x1\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " ldr r0, ._86 + 16\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " mov r0, #0x88\n" " lsl r0, r0, #0x1\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " ldr r0, ._86 + 20\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " mov r0, #0x83\n" " lsl r0, r0, #0x1\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " ldr r0, ._86 + 24\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " mov r0, #0x84\n" " lsl r0, r0, #0x1\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " ldr r0, ._86 + 28\n" - " bl trainer_flag_set\n" + " bl SetTrainerFlag\n" " bl CloseMenu\n" " mov r0, #0x1\n" " pop {r4, r5}\n" diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 2d9074d19..28bb2717d 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -5001,7 +5001,7 @@ void debug_sub_808DABC() "._387:\n" " .align 2, 0\n" "._386:\n" - " .word gScriptResult\n" + " .word gSpecialVar_Result\n" "\n" ); } @@ -5043,7 +5043,7 @@ void debug_sub_808DAD4() " .align 2, 0\n" "._393:\n" " .word 0xffff\n" - " .word gScriptResult\n" + " .word gSpecialVar_Result\n" "\n" ); } diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index 7288f602e..b0fbebac1 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -116,7 +116,7 @@ void debug_80C35DC() " str r3, [r2, #0x8]\n" " ldr r0, [r2, #0x8]\n" " bl ResetPaletteFade\n" - " bl remove_some_task\n" + " bl ScanlineEffect_Stop\n" " bl ResetTasks\n" " bl ResetSpriteData\n" " bl ResetPaletteFade\n" @@ -4289,10 +4289,10 @@ void debug_80C53F0() " lsr r4, r4, #0x10\n" " add r0, r4, #0\n" " mov r1, #0x2\n" - " bl GetNationalPokedexFlag\n" + " bl GetSetPokedexFlag\n" " add r0, r4, #0\n" " mov r1, #0x3\n" - " bl GetNationalPokedexFlag\n" + " bl GetSetPokedexFlag\n" " mov r0, #0x5\n" " bl PlaySE\n" " b ._400\n" @@ -7813,7 +7813,7 @@ void debug_80C6FA8() " ldrh r0, [r1]\n" " mov r1, #0x0\n" " mov r2, #0x0\n" - " bl species_and_otid_get_pal\n" + " bl GetMonSpritePal\n" " ldr r1, [r4]\n" " ldrb r1, [r1, #0x6]\n" " lsl r1, r1, #0x14\n" @@ -7832,7 +7832,7 @@ void debug_80C6FA8() " ldrh r0, [r1]\n" " mov r1, #0x0\n" " mov r2, #0x9\n" - " bl species_and_otid_get_pal\n" + " bl GetMonSpritePal\n" " ldr r1, [r4]\n" " ldrb r1, [r1, #0x6]\n" " lsl r1, r1, #0x14\n" @@ -9268,7 +9268,7 @@ void debug_80C7B14() " ldrh r0, [r1]\n" " mov r1, #0x0\n" " mov r2, #0x0\n" - " bl species_and_otid_get_pal\n" + " bl GetMonSpritePal\n" " ldr r1, [r4]\n" " ldrb r1, [r1, #0x6]\n" " lsl r1, r1, #0x14\n" @@ -9287,7 +9287,7 @@ void debug_80C7B14() " ldrh r0, [r1]\n" " mov r1, #0x0\n" " mov r2, #0x9\n" - " bl species_and_otid_get_pal\n" + " bl GetMonSpritePal\n" " ldr r1, [r4]\n" " ldrb r1, [r1, #0x6]\n" " lsl r1, r1, #0x14\n" diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index c0397f67b..4063aee3a 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -407,7 +407,7 @@ void debug_sub_808A55C() .word gLinkStatus\n\ .word gLink\n\ .word gReceivedRemoteLinkPlayers\n\ - .word gScriptResult\n\ + .word gSpecialVar_Result\n\ .word gLinkCallback\n\ .word gLinkPlayers\n\ .word 0x4000128"); diff --git a/src/engine/link.c b/src/engine/link.c index 5747915d7..3bcacd12b 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -67,7 +67,7 @@ u32 sub_8007E40(void); static void SetBlockReceivedFlag(u8); static u16 LinkTestCalcBlockChecksum(void *, u16); static void PrintHexDigit(u8, u8, u8); -static void PrintHex(u32, u8, u8, u8); +void PrintHex(u32, u8, u8, u8); static void LinkCB_RequestPlayerDataExchange(void); static void Task_PrintTestData(u8); bool8 sub_8008224(void); @@ -961,7 +961,7 @@ static void PrintHexDigit(u8 tileNum, u8 x, u8 y) tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1); } -static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) +void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) { u8 buffer[16]; s32 i; diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index df4ab4f76..0cfa1e71a 100644 --- a/src/engine/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c @@ -691,7 +691,7 @@ void debug_sub_806F908(u8 a) ._142:\n\ ldrb r0, [r4, #0x2]\n\ bl DestroyTask\n\ - bl MenuZeroFillScreen\n\ + bl Menu_EraseScreen\n\ bl ScriptContext2_Disable\n\ add r0, r5, #0\n\ bl DestroyTask\n\ @@ -902,7 +902,7 @@ void debug_sub_806F9E4() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._165 @cond_branch\n\ - bl MenuZeroFillScreen\n\ + bl Menu_EraseScreen\n\ add r0, r7, #0\n\ bl DestroyTask\n\ bl ScriptContext2_Disable\n\ diff --git a/src/engine/save.c b/src/engine/save.c index 1245d0a62..a9945a80d 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -734,7 +734,7 @@ void sub_813B79C() " .word sSaveBlockChunks\n" " .word 0xff4\n" " .word 0xff6\n" - " .word gHallOfFameSaveSectionLocations\n" + " .word sHallOfFameChunks\n" "\n" ); } diff --git a/src/engine/trade.c b/src/engine/trade.c index e49cde6cd..715cc0377 100644 --- a/src/engine/trade.c +++ b/src/engine/trade.c @@ -4514,8 +4514,8 @@ static __attribute__((naked)) void sub_804B41C(void) } #endif -static void sub_804B790(void) // In-game trade init +void sub_804B790(void) { u8 otName[11]; switch (gMain.state) diff --git a/src/field/berry.c b/src/field/berry.c index 7c6640dc8..d6982479e 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -1780,7 +1780,7 @@ u8* DebugOpenBerryInfo(void) u8 berryTreeId; struct BerryTree *berryTree; - if (GetFieldObjectScriptPointerForComparison() != &BerryTreeScript) + if (GetFieldObjectScriptPointerPlayerFacing() != &S_BerryTree) return NULL; berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject); @@ -1809,7 +1809,7 @@ void DebugOpenBerryInfo() { asm( " push {r4, r5, r6, r7, lr}\n" - " bl GetFieldObjectScriptPointerForComparison\n" + " bl GetFieldObjectScriptPointerPlayerFacing\n" " ldr r1, ._138\n" " cmp r0, r1\n" " beq ._136 @cond_branch\n" @@ -1818,7 +1818,7 @@ void DebugOpenBerryInfo() "._139:\n" " .align 2, 0\n" "._138:\n" - " .word BerryTreeScript\n" + " .word S_BerryTree\n" "._136:\n" " ldr r0, ._141\n" " ldrb r0, [r0]\n" diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index db674e52f..795a53d0b 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -1940,7 +1940,7 @@ void debug_sub_805F2DC() " .word gPlayerAvatar\n" "._429:\n" " add r0, r4, #0\n" - " bl sub_80593F4\n" + " bl PlayerGoSpeed4\n" "._430:\n" " mov r0, #0x1\n" " pop {r4}\n" diff --git a/src/field/field_weather.c b/src/field/field_weather.c index 1a4985892..4a03322d5 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -1308,7 +1308,7 @@ u8 debug_sub_808560C(void) add r0, r0, r1\n\ ldrb r0, [r0]\n\ strb r0, [r4]\n\ - bl MenuZeroFillScreen\n\ + bl Menu_EraseScreen\n\ mov r0, #0x16\n\ mov r1, #0x1\n\ mov r2, #0x1c\n\ diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c index c200ce2f5..3f539fc6e 100644 --- a/src/field/fldeff_secretpower.c +++ b/src/field/fldeff_secretpower.c @@ -266,7 +266,7 @@ void debug_sub_80D93F4() ._99:\n\ .align 2, 0\n\ ._98:\n\ - .word gScriptResult\n\ + .word gSpecialVar_Result\n\ ._96:\n\ ldr r4, ._102\n\ add r1, r4, #2\n\ diff --git a/src/field/item_menu.c b/src/field/item_menu.c index ce1f18cdb..61774f816 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -436,7 +436,7 @@ static bool8 SetupBagMultistep(void) bl sub_80A34E8\n\ b ._61\n\ ._9:\n\ - bl remove_some_task\n\ + bl ScanlineEffect_Stop\n\ ldr r1, ._27\n\ ldr r0, ._27 + 4\n\ add r1, r1, r0\n\ diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 91165a2ee..51bd9bb35 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -331,7 +331,7 @@ void debug_sub_810B32C() } #endif -static u8 GetCurrentMauvilleOldMan(void) +u8 GetCurrentMauvilleOldMan(void) { struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common; diff --git a/src/field/region_map.c b/src/field/region_map.c index d6ebf0b9f..9194e791d 100644 --- a/src/field/region_map.c +++ b/src/field/region_map.c @@ -288,7 +288,7 @@ static void UpdateIconBlink(struct Sprite *); static void SpriteCB_PlayerIconZoomedIn(struct Sprite *); const u8 *GetMapSectionName(u8 *, u16, u16); static void VBlankCB_FlyRegionMap(void); -static void CB2_FlyRegionMap(void); +void CB2_FlyRegionMap(void); void sub_80FC244(void (*func)(void)); static void PrintFlyTargetName(void); static void CreateFlyTargetGraphics(void); @@ -1591,7 +1591,7 @@ static void VBlankCB_FlyRegionMap(void) TransferPlttBuffer(); } -static void CB2_FlyRegionMap(void) +void CB2_FlyRegionMap(void) { ewram0_3.unk0(); AnimateSprites(); diff --git a/src/field/safari_zone.c b/src/field/safari_zone.c index e9ca3a9f9..2829001f6 100644 --- a/src/field/safari_zone.c +++ b/src/field/safari_zone.c @@ -26,7 +26,7 @@ static void DecrementFeederStepCounters(void); extern u8 gBattleOutcome; EWRAM_DATA u8 gNumSafariBalls = 0; -EWRAM_DATA static u16 gSafariZoneStepCounter = 0; +EWRAM_DATA u16 gSafariZoneStepCounter = 0; EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0}; extern void (*gFieldCallback)(void); diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 17aeb8242..47c7fca05 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -398,7 +398,7 @@ void debug_sub_8075DB4() " cmp r4, #0x2\n" " ble ._24 @cond_branch\n" " add r0, r6, #0\n" - " bl sub_8136088\n" + " bl SetEReaderTrainerChecksum\n" " pop {r4, r5, r6}\n" " pop {r0}\n" " bx r0\n" diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c index 08913f40d..10391348d 100644 --- a/src/field/wild_encounter.c +++ b/src/field/wild_encounter.c @@ -3698,13 +3698,13 @@ const u16 gRoute119WaterTileData[] = extern u16 gSpecialVar_Result; extern u8 S_RepelWoreOff[]; -EWRAM_DATA static u8 sWildEncountersDisabled = 0; +EWRAM_DATA u8 sWildEncountersDisabled = 0; EWRAM_DATA static u32 sFeebasRngValue = 0; #define NUM_FEEBAS_SPOTS 6 -static u16 FeebasRandom(void); -static void FeebasSeedRng(u16 seed); +u16 FeebasRandom(void); +void FeebasSeedRng(u16 seed); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *encRate); @@ -3791,13 +3791,13 @@ static bool8 CheckFeebas(void) return FALSE; } -static u16 FeebasRandom(void) +u16 FeebasRandom(void) { sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue; return sFeebasRngValue >> 16; } -static void FeebasSeedRng(u16 seed) +void FeebasSeedRng(u16 seed) { sFeebasRngValue = seed; } diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index ecff15c21..565a9861b 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -2369,7 +2369,7 @@ void debug_sub_810D388() " .word unk_debug_bss_2\n" " .word 0x43c\n" "._297:\n" - " bl remove_some_task\n" + " bl ScanlineEffect_Stop\n" " bl ResetPaletteFade\n" " ldr r0, ._302\n" " bl SetVBlankCallback\n" -- cgit v1.2.3 From 8835353325d9c7eba7664bde5d5a2d4c40c4376d Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 18:24:33 -0600 Subject: resolve more undefined references --- src/battle/battle_2.c | 6 +++--- src/engine/mystery_event_menu.c | 2 +- src/field/battle_tower.c | 2 +- src/field/trader.c | 2 +- src/pokemon/pokemon_summary_screen.c | 4 ++-- src/rom3.c | 6 +++--- src/strings.c | 14 ++++++++++---- 7 files changed, 21 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index bedcb0bb6..6d2045604 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -9473,16 +9473,16 @@ void sub_8010874() "._1215:\n" " .word gUnknown_02024C4C\n" " .word gLastHitByType\n" - " .word gMoveHitWith\n" + " .word gLastLandedMoves\n" " .word gLastUsedMove\n" " .word gDisableStructs\n" " .word gUnknown_02024C2C\n" - " .word gLockedMove\n" + " .word gLockedMoves\n" " .word gStatuses3\n" " .word gUnknown_02024C70\n" " .word gUnknown_02024C5C\n" " .word +0x2017100\n" - " .word gSideTimer\n" + " .word gSideTimers\n" " .word gSideAffecting\n" " .word gBankAttacker\n" " .word gBankTarget\n" diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index 8f280dc18..656e774c5 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -465,7 +465,7 @@ void debug_sub_815D04C() " add r1, r1, r0\n" " ldr r0, ._133 + 8\n" " ldr r1, [r1]\n" - " bl gScriptFuncs_End+0x3cf8\n" + " bl gMysteryEventScriptCmdTableEnd+0x3cf8\n" " ldr r0, ._133 + 12\n" " add r1, r6, r0\n" " ldrb r0, [r1]\n" diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c index ab2a818a7..41d5ae9d1 100644 --- a/src/field/battle_tower.c +++ b/src/field/battle_tower.c @@ -259,7 +259,7 @@ static void SaveCurrentWinStreak(void); static void sub_8135CFC(void); static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *); static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); -static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); +void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *); static void ClearBattleTowerRecord(struct BattleTowerRecord *); diff --git a/src/field/trader.c b/src/field/trader.c index b4732ab15..2801df322 100644 --- a/src/field/trader.c +++ b/src/field/trader.c @@ -108,7 +108,7 @@ void CreateAvailableDecorationsMenu(u8 taskId) { if (trader->unk1[i] > DECOR_REGISTEEL_DOLL) { - Menu_PrintText(gOtherText_FiveQuestionsAndSlash, 1, numDecorations * 2 + 2); + Menu_PrintText(gOtherText_FiveQuestions, 1, numDecorations * 2 + 2); } else { diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 7b40918e9..0102b7526 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -2576,14 +2576,14 @@ static void sub_809FC34(struct Pokemon *mon) buffer = gStringVar1; buffer = sub_80A1E58(buffer, 13); buffer = StringCopy(buffer, gOtherText_OriginalTrainer); - buffer = StringCopy(buffer, gOtherText_FiveQuestionsAndSlash); + buffer = StringCopy(buffer, gOtherText_FiveQuestions); buffer[0] = EXT_CTRL_CODE_BEGIN; buffer[1] = 0x13; buffer[2] = 0x4E; buffer[3] = EOS; Menu_PrintText(gStringVar1, 11, 4); - sub_80A1EF8(gOtherText_FiveQuestionsAndSlash, 13, 193, 32, 1); + sub_80A1EF8(gOtherText_FiveQuestions, 13, 193, 32, 1); sub_80A198C(9, 120, 48, 0); friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); diff --git a/src/rom3.c b/src/rom3.c index efaa1d97f..34746c1a8 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -101,9 +101,9 @@ void setup_poochyena_battle(void) #if DEBUG if (gUnknown_02023A14_50 & 0x80) { - ewram[0x160fd] = 0; - ewram[0x160fe] = 0; - ewram[0x160ff] = 0; + gSharedMem[0x160fd] = 0; + gSharedMem[0x160fe] = 0; + gSharedMem[0x160ff] = 0; ((u32 *) gBattleBuffersTransferData)[64]++; } #endif diff --git a/src/strings.c b/src/strings.c index 06bbadb8f..0f599db72 100644 --- a/src/strings.c +++ b/src/strings.c @@ -173,7 +173,8 @@ const u8 gOtherText_None[] = _("NONE"); const u8 gOtherText_ThreeQuestions2[] = _("???"); -const u8 gOtherText_FiveQuestionsAndSlash[] = _("?????$/"); +const u8 gOtherText_FiveQuestions[] = _("?????"); +const u8 gOtherText_Slash[] = _("/"); const u8 gOtherText_OneDash[] = _("-"); const u8 gOtherText_TwoDashes[] = _("--"); @@ -267,7 +268,9 @@ const u8 gContestStatsText_Spicy[] = _("SPICY"); const u8 gContestStatsText_Dry[] = _("DRY"); const u8 gContestStatsText_Sweet[] = _("SWEET"); const u8 gContestStatsText_Bitter[] = _("BITTER"); -const u8 gContestStatsText_Sour[] = _("SOUR$TASTY$FEEL"); // tasty is unused, feel might not be +const u8 gContestStatsText_Sour[] = _("SOUR"); +const u8 gContestStatsText_Tasty[] = _("TASTY"); +const u8 gContestStatsText_Feel[] = _("FEEL"); const u8 gContestStatsText_StowCase[] = _("Stow CASE."); const u8 gContestStatsText_ThrowAwayPrompt[] = _("Throw away this\n{STR_VAR_1}?"); @@ -1096,7 +1099,8 @@ const u8 gOtherText_None[] = _("KEINES"); const u8 gOtherText_ThreeQuestions2[] = _("???"); -const u8 gOtherText_FiveQuestionsAndSlash[] = _("?????$/"); +const u8 gOtherText_FiveQuestions[] = _("?????"); +const u8 gOtherText_Slash[] = _("/"); const u8 gOtherText_OneDash[] = _("-"); const u8 gOtherText_TwoDashes[] = _("--"); @@ -1190,7 +1194,9 @@ const u8 gContestStatsText_Spicy[] = _("SCHARF"); const u8 gContestStatsText_Dry[] = _("TROCKEN"); const u8 gContestStatsText_Sweet[] = _("SÜSS"); const u8 gContestStatsText_Bitter[] = _("BITTER"); -const u8 gContestStatsText_Sour[] = _("SAUER$LECKER$WÜRZE"); +const u8 gContestStatsText_Sour[] = _("SAUER"); +const u8 gContestStatsText_Tasty[] = _("LECKER"); +const u8 gContestStatsText_Feel[] = _("WÜRZE"); const u8 gContestStatsText_StowCase[] = _("BOX verstauen."); const u8 gContestStatsText_ThrowAwayPrompt[] = _("{STR_VAR_1}\nwegwerfen?"); -- cgit v1.2.3 From a02a85f477cbf44aa0370de8f40bd8ced77513c2 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 18:56:16 -0600 Subject: get nonmatching debug rom to build --- src/field/field_map_obj.c | 3 + src/field/item_menu.c | 18 ++++ src/field/mauville_man.c | 197 +++++++++++++++++++++++++++++++++++++++++++- src/pokemon/mail.c | 205 ++-------------------------------------------- 4 files changed, 222 insertions(+), 201 deletions(-) (limited to 'src') diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index 1c0cefacb..c255d3013 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1907,6 +1907,9 @@ static u8 gUnknown_030005A4; static u16 gUnknown_030005A6; struct MapObject gMapObjects[16]; +#if DEBUG +u8 gUnknown_Debug_03004BC0[4]; // unknown type +#endif void npc_clear_ids_and_state(struct MapObject *mapObj) { diff --git a/src/field/item_menu.c b/src/field/item_menu.c index 61774f816..7922bf69d 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -289,6 +289,24 @@ static void sub_80A6618(u8); const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618}; +#if DEBUG +const struct {u16 item; u8 unk;} gUnknown_Debug_083EBC68[12+48] = +{ + {ITEM_POKE_BALL, 10}, + {ITEM_ULTRA_BALL, 15}, + {ITEM_GREAT_BALL, 20}, + {ITEM_MASTER_BALL, 25}, + {ITEM_ACRO_BIKE, 1 }, + {ITEM_OLD_ROD, 1 }, + {ITEM_GOOD_ROD, 1 }, + {ITEM_SUPER_ROD, 1 }, + {ITEM_POKEBLOCK_CASE, 1 }, + {ITEM_WAILMER_PAIL, 1 }, + {ITEM_ITEMFINDER, 1 }, + {ITEM_NONE, 1 }, +}; +#endif + void sub_80A34E8(void); static bool8 LoadBagGraphicsMultistep(void); static void sub_80A362C(void); diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 51bd9bb35..144c0235a 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -1313,7 +1313,7 @@ static void PrintStoryList(void) Menu_PrintText(gPCText_Cancel, 1, 2 + i * 2); } -u8 gUnknown_03000748; +static u8 gUnknown_03000748; static void Task_StoryListMenu(u8 taskId) { @@ -1392,3 +1392,198 @@ bool8 ScrSpecial_StorytellerInitializeRandomStat(void) { return StorytellerInitializeRandomStat(); } + +#if DEBUG +__attribute__((naked)) +void This_is_not_HandleReadMail() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " add r6, r1, #0\n" + " lsl r2, r2, #0x18\n" + " lsr r5, r2, #0x18\n" + " ldr r0, .__3\n" + " ldrb r3, [r0]\n" + " cmp r3, #0\n" + " beq .__1 @cond_branch\n" + " ldr r2, .__3 + 4\n" + " add r1, r2, #0\n" + " add r1, r1, #0xff\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " ldr r0, .__3 + 8\n" + " ldrh r1, [r0]\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x1\n" + " add r0, r2, r3\n" + " strb r1, [r0]\n" + " mov r0, #0x82\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, .__3 + 12\n" + " str r0, [r1]\n" + " add r3, r3, #0x8\n" + " add r1, r2, r3\n" + " ldr r0, .__3 + 16\n" + " str r0, [r1]\n" + " ldr r0, .__3 + 20\n" + " ldrh r1, [r0]\n" + " b .__2\n" + ".__4:\n" + " .align 2, 0\n" + ".__3:\n" + " .word gUnknown_03000748+0x4\n" + " .word +0x2000000\n" + " .word gSpecialVar_0x8004\n" + " .word EasyChat_GetWordText+1\n" + " .word ConvertEasyChatWordsToString+1\n" + " .word gSpecialVar_0x8006\n" + ".__1:\n" + " ldr r2, .__7\n" + " add r1, r2, #0\n" + " add r1, r1, #0xff\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " add r0, r0, #0xfb\n" + " add r1, r2, r0\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x82\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, .__7 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x84\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, .__7 + 8\n" + " str r0, [r1]\n" + " ldrh r1, [r4, #0x20]\n" + " add r0, r1, #0\n" + " sub r0, r0, #0x79\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi .__5 @cond_branch\n" + " sub r1, r1, #0x79\n" + ".__2:\n" + " add r0, r2, #0\n" + " add r0, r0, #0xfa\n" + " strb r1, [r0]\n" + " b .__6\n" + ".__8:\n" + " .align 2, 0\n" + ".__7:\n" + " .word +0x2000000\n" + " .word EasyChat_GetWordText+1\n" + " .word ConvertEasyChatWordsToString+1\n" + ".__5:\n" + " add r0, r2, #0\n" + " add r0, r0, #0xfa\n" + " strb r3, [r0]\n" + " mov r5, #0x0\n" + ".__6:\n" + " ldr r1, .__12\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq .__9 @cond_branch\n" + " cmp r0, #0x1\n" + " beq .__10 @cond_branch\n" + ".__9:\n" + " mov r3, #0x86\n" + " lsl r3, r3, #0x1\n" + " add r2, r1, r3\n" + " add r0, r1, #0\n" + " add r0, r0, #0xfa\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, .__12 + 4\n" + " b .__11\n" + ".__13:\n" + " .align 2, 0\n" + ".__12:\n" + " .word +0x2000000\n" + " .word gUnknown_083E5730\n" + ".__10:\n" + " mov r0, #0x86\n" + " lsl r0, r0, #0x1\n" + " add r2, r1, r0\n" + " add r0, r1, #0\n" + " add r0, r0, #0xfa\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, .__18\n" + ".__11:\n" + " add r0, r0, r1\n" + " str r0, [r2]\n" + " ldrh r0, [r4, #0x1e]\n" + " mov r1, sp\n" + " bl MailSpeciesToSpecies\n" + " lsl r0, r0, #0x10\n" + " ldr r1, .__18 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xcd\n" + " lsl r1, r1, #0x11\n" + " cmp r0, r1\n" + " bhi .__14 @cond_branch\n" + " ldr r0, .__18 + 8\n" + " add r1, r0, #0\n" + " add r1, r1, #0xfa\n" + " ldrb r2, [r1]\n" + " add r1, r0, #0\n" + " cmp r2, #0x6\n" + " beq .__15 @cond_branch\n" + " cmp r2, #0x9\n" + " beq .__16 @cond_branch\n" + " b .__17\n" + ".__19:\n" + " .align 2, 0\n" + ".__18:\n" + " .word gUnknown_083E57A4\n" + " .word 0xffff0000\n" + " .word +0x2000000\n" + ".__15:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x1\n" + " b .__21\n" + ".__16:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x2\n" + " b .__21\n" + ".__14:\n" + " ldr r1, .__22\n" + ".__17:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x0\n" + ".__21:\n" + " strb r0, [r2]\n" + " add r0, r1, #0\n" + " add r0, r0, #0xf4\n" + " str r4, [r0]\n" + " sub r0, r0, #0x8\n" + " str r6, [r0]\n" + " add r0, r0, #0xc\n" + " strb r5, [r0]\n" + " ldr r0, .__22 + 4\n" + " bl SetMainCallback2\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + ".__23:\n" + " .align 2, 0\n" + ".__22:\n" + " .word +0x2000000\n" + " .word sub_80F8D50+1\n" + "\n" + ); +} +#endif diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index 565a9861b..6e03958e6 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -68,6 +68,11 @@ struct MailGraphics u16 color12; }; +#if DEBUG +// should be static +__attribute__((section(".bss"))) u8 unk_debug_bss_2; +#endif + const u16 gUnknown_083E562C[][2] = { {0x6ACD, 0x51A5}, @@ -322,205 +327,6 @@ static void sub_80F8F58(void); static void sub_80F8F78(void); static void sub_80F8FB4(void); - -#if DEBUG - -// should be static -__attribute__((section(".bss"))) u8 unk_debug_bss_2; - -__attribute__((naked)) -void HandleReadMail(struct MailStruct *aStruct, MainCallback callback, bool8 bool81) -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " add r6, r1, #0\n" - " lsl r2, r2, #0x18\n" - " lsr r5, r2, #0x18\n" - " ldr r0, ._3\n" - " ldrb r3, [r0]\n" - " cmp r3, #0\n" - " beq ._1 @cond_branch\n" - " ldr r2, ._3 + 4\n" - " add r1, r2, #0\n" - " add r1, r1, #0xff\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " ldr r0, ._3 + 8\n" - " ldrh r1, [r0]\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x1\n" - " add r0, r2, r3\n" - " strb r1, [r0]\n" - " mov r0, #0x82\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, ._3 + 12\n" - " str r0, [r1]\n" - " add r3, r3, #0x8\n" - " add r1, r2, r3\n" - " ldr r0, ._3 + 16\n" - " str r0, [r1]\n" - " ldr r0, ._3 + 20\n" - " ldrh r1, [r0]\n" - " b ._2\n" - "._4:\n" - " .align 2, 0\n" - "._3:\n" - " .word gUnknown_03000748+0x4\n" - " .word +0x2000000\n" - " .word gSpecialVar_0x8004\n" - " .word EasyChat_GetWordText+1\n" - " .word ConvertEasyChatWordsToString+1\n" - " .word gSpecialVar_0x8006\n" - "._1:\n" - " ldr r2, ._7\n" - " add r1, r2, #0\n" - " add r1, r1, #0xff\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " add r0, r0, #0xfb\n" - " add r1, r2, r0\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x82\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, ._7 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x84\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, ._7 + 8\n" - " str r0, [r1]\n" - " ldrh r1, [r4, #0x20]\n" - " add r0, r1, #0\n" - " sub r0, r0, #0x79\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0xb\n" - " bhi ._5 @cond_branch\n" - " sub r1, r1, #0x79\n" - "._2:\n" - " add r0, r2, #0\n" - " add r0, r0, #0xfa\n" - " strb r1, [r0]\n" - " b ._6\n" - "._8:\n" - " .align 2, 0\n" - "._7:\n" - " .word +0x2000000\n" - " .word EasyChat_GetWordText+1\n" - " .word ConvertEasyChatWordsToString+1\n" - "._5:\n" - " add r0, r2, #0\n" - " add r0, r0, #0xfa\n" - " strb r3, [r0]\n" - " mov r5, #0x0\n" - "._6:\n" - " ldr r1, ._12\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r0, r1, r2\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._9 @cond_branch\n" - " cmp r0, #0x1\n" - " beq ._10 @cond_branch\n" - "._9:\n" - " mov r3, #0x86\n" - " lsl r3, r3, #0x1\n" - " add r2, r1, r3\n" - " add r0, r1, #0\n" - " add r0, r0, #0xfa\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r1, ._12 + 4\n" - " b ._11\n" - "._13:\n" - " .align 2, 0\n" - "._12:\n" - " .word +0x2000000\n" - " .word gUnknown_083E5730\n" - "._10:\n" - " mov r0, #0x86\n" - " lsl r0, r0, #0x1\n" - " add r2, r1, r0\n" - " add r0, r1, #0\n" - " add r0, r0, #0xfa\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r1, ._18\n" - "._11:\n" - " add r0, r0, r1\n" - " str r0, [r2]\n" - " ldrh r0, [r4, #0x1e]\n" - " mov r1, sp\n" - " bl MailSpeciesToSpecies\n" - " lsl r0, r0, #0x10\n" - " ldr r1, ._18 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xcd\n" - " lsl r1, r1, #0x11\n" - " cmp r0, r1\n" - " bhi ._14 @cond_branch\n" - " ldr r0, ._18 + 8\n" - " add r1, r0, #0\n" - " add r1, r1, #0xfa\n" - " ldrb r2, [r1]\n" - " add r1, r0, #0\n" - " cmp r2, #0x6\n" - " beq ._15 @cond_branch\n" - " cmp r2, #0x9\n" - " beq ._16 @cond_branch\n" - " b ._17\n" - "._19:\n" - " .align 2, 0\n" - "._18:\n" - " .word gUnknown_083E57A4\n" - " .word 0xffff0000\n" - " .word +0x2000000\n" - "._15:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x1\n" - " b ._21\n" - "._16:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x2\n" - " b ._21\n" - "._14:\n" - " ldr r1, ._22\n" - "._17:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x0\n" - "._21:\n" - " strb r0, [r2]\n" - " add r0, r1, #0\n" - " add r0, r0, #0xf4\n" - " str r4, [r0]\n" - " sub r0, r0, #0x8\n" - " str r6, [r0]\n" - " add r0, r0, #0xc\n" - " strb r5, [r0]\n" - " ldr r0, ._22 + 4\n" - " bl SetMainCallback2\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._23:\n" - " .align 2, 0\n" - "._22:\n" - " .word +0x2000000\n" - " .word sub_80F8D50+1\n" - "\n" - ); -} -#else void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) { u16 mailDesign; @@ -584,7 +390,6 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) SetMainCallback2(sub_80F8D50); } -#endif #define RETURN_UP_STATE break #define RETURN_SKIP_STATE return FALSE -- cgit v1.2.3 From 8a21a49a35d91ba9b07ac5027a0560ddf1f4ad25 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 21:04:48 -0600 Subject: add some debug changes that I missed --- src/battle/battle_2.c | 19 +- src/battle/battle_util.c | 4473 ++++++++++++++++++++++++++++++++++++++++++++++ src/engine/link.c | 22 +- 3 files changed, 4503 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 6d2045604..696f1fde0 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -9141,17 +9141,7 @@ void debug_sub_80139E4() "\n" ); } -#endif - -void sub_8010824(void) -{ - gBattleMainFunc(); - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - gBattleBankFunc[gActiveBank](); -} - -#if DEBUG __attribute__((naked)) void sub_8010874() { @@ -9525,6 +9515,15 @@ void sub_8010874() ); } #else + +void sub_8010824(void) +{ + gBattleMainFunc(); + + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + gBattleBankFunc[gActiveBank](); +} + void sub_8010874(void) { s32 i; diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c index f93664593..3bb99f845 100644 --- a/src/battle/battle_util.c +++ b/src/battle/battle_util.c @@ -1683,6 +1683,4066 @@ u8 CastformDataTypeChange(u8 bank) return formChange; } +#if DEBUG +__attribute__((naked)) +u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + add sp, sp, #0xffffffd8\n\ + ldr r4, [sp, #0x48]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + str r0, [sp, #0x4]\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + mov sl, r1\n\ + lsl r2, r2, #0x18\n\ + lsr r6, r2, #0x18\n\ + lsl r3, r3, #0x18\n\ + lsr r3, r3, #0x18\n\ + mov r8, r3\n\ + lsl r4, r4, #0x10\n\ + lsr r4, r4, #0x10\n\ + mov r0, #0x0\n\ + mov r9, r0\n\ + ldr r5, ._718\n\ + ldr r1, ._718 + 4\n\ + ldrb r0, [r5]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc ._715 @cond_branch\n\ + mov r1, sl\n\ + strb r1, [r5]\n\ +._715:\n\ + ldrb r0, [r5]\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._716 @cond_branch\n\ + ldr r1, ._718 + 8\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r1, r1, r0\n\ + ldr r0, ._718 + 12\n\ + b ._717\n\ +._719:\n\ + .align 2, 0\n\ +._718:\n\ + .word gBankAttacker\n\ + .word gNoOfAllBanks\n\ + .word gBattlePartyID\n\ + .word gPlayerParty\n\ +._716:\n\ + ldr r1, ._723\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r1, r1, r0\n\ + ldr r0, ._723 + 4\n\ +._717:\n\ + add r7, r1, r0\n\ + ldr r5, ._723 + 8\n\ + ldr r1, ._723 + 12\n\ + ldrb r0, [r5]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc ._720 @cond_branch\n\ + mov r2, sl\n\ + strb r2, [r5]\n\ +._720:\n\ + ldrb r0, [r5]\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._721 @cond_branch\n\ + ldr r1, ._723\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r1, r1, r0\n\ + ldr r0, ._723 + 16\n\ + b ._722\n\ +._724:\n\ + .align 2, 0\n\ +._723:\n\ + .word gBattlePartyID\n\ + .word gEnemyParty\n\ + .word gBankTarget\n\ + .word gNoOfAllBanks\n\ + .word gPlayerParty\n\ +._721:\n\ + ldr r1, ._729\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r1, r1, r0\n\ + ldr r0, ._729 + 4\n\ +._722:\n\ + add r5, r1, r0\n\ + add r0, r7, #0\n\ + mov r1, #0xb\n\ + bl GetMonData\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + str r0, [sp, #0x8]\n\ + add r0, r7, #0\n\ + mov r1, #0x0\n\ + bl GetMonData\n\ + str r0, [sp, #0x10]\n\ + add r0, r5, #0\n\ + mov r1, #0xb\n\ + bl GetMonData\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + str r0, [sp, #0xc]\n\ + add r0, r5, #0\n\ + mov r1, #0x0\n\ + bl GetMonData\n\ + str r0, [sp, #0x14]\n\ + ldr r0, ._729 + 8\n\ + ldrh r1, [r0]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._725 @cond_branch\n\ + bl ._1540\n\ +._725:\n\ + mov r3, r8\n\ + cmp r3, #0\n\ + beq ._727 @cond_branch\n\ + ldr r0, ._729 + 12\n\ + strb r3, [r0]\n\ + mov r8, r0\n\ + b ._728\n\ +._730:\n\ + .align 2, 0\n\ +._729:\n\ + .word gBattlePartyID\n\ + .word gEnemyParty\n\ + .word gBattleTypeFlags\n\ + .word gLastUsedAbility\n\ +._727:\n\ + ldr r2, ._733\n\ + ldr r1, ._733 + 4\n\ + mov r0, #0x58\n\ + mov r5, sl\n\ + mul r5, r5, r0\n\ + add r0, r5, #0\n\ + add r0, r0, r1\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + strb r0, [r2]\n\ + mov r8, r2\n\ +._728:\n\ + cmp r4, #0\n\ + beq ._731 @cond_branch\n\ + add r3, r4, #0\n\ + b ._732\n\ +._734:\n\ + .align 2, 0\n\ +._733:\n\ + .word gLastUsedAbility\n\ + .word gBattleMons\n\ +._731:\n\ + ldr r0, ._737\n\ + ldrh r3, [r0]\n\ +._732:\n\ + ldr r1, ._737 + 4\n\ + ldr r2, ._737 + 8\n\ + add r0, r1, r2\n\ + ldrb r0, [r0]\n\ + add r7, r1, #0\n\ + cmp r0, #0\n\ + beq ._735 @cond_branch\n\ + mov r4, #0x3f\n\ + and r4, r4, r0\n\ + b ._736\n\ +._738:\n\ + .align 2, 0\n\ +._737:\n\ + .word gCurrentMove\n\ + .word +0x2000000\n\ + .word 0x1601c\n\ +._735:\n\ + ldr r1, ._741\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r4, [r0, #0x2]\n\ +._736:\n\ + ldr r5, [sp, #0x4]\n\ + cmp r5, #0x13\n\ + bls ._739 @cond_branch\n\ + bl ._1534\n\ +._739:\n\ + lsl r0, r5, #0x2\n\ + ldr r1, ._741 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._742:\n\ + .align 2, 0\n\ +._741:\n\ + .word gBattleMoves\n\ + .word ._743\n\ +._743:\n\ + .word ._744\n\ + .word ._745\n\ + .word ._746\n\ + .word ._747\n\ + .word ._748\n\ + .word ._749\n\ + .word ._750\n\ + .word ._751\n\ + .word ._752\n\ + .word ._753\n\ + .word ._754\n\ + .word ._755\n\ + .word ._756\n\ + .word ._757\n\ + .word ._758\n\ + .word ._759\n\ + .word ._760\n\ + .word ._761\n\ + .word ._762\n\ + .word ._763\n\ +._744:\n\ + ldr r2, ._774\n\ + ldr r0, ._774 + 4\n\ + ldrb r1, [r2]\n\ + add r5, r0, #0\n\ + ldrb r0, [r5]\n\ + cmp r1, r0\n\ + bcc ._764 @cond_branch\n\ + mov r1, sl\n\ + strb r1, [r2]\n\ +._764:\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + cmp r0, #0x2d\n\ + bne ._765 @cond_branch\n\ + b ._766\n\ +._765:\n\ + cmp r0, #0x2d\n\ + bgt ._767 @cond_branch\n\ + cmp r0, #0xd\n\ + bne ._768 @cond_branch\n\ + b ._788\n\ +._768:\n\ + cmp r0, #0xd\n\ + bgt ._770 @cond_branch\n\ + cmp r0, #0x2\n\ + bne ._771 @cond_branch\n\ + b ._772\n\ +._771:\n\ + bl ._1534\n\ +._775:\n\ + .align 2, 0\n\ +._774:\n\ + .word gBankAttacker\n\ + .word gNoOfAllBanks\n\ +._770:\n\ + cmp r0, #0x16\n\ + bne ._776 @cond_branch\n\ + b ._777\n\ +._776:\n\ + cmp r0, #0x24\n\ + bne ._778 @cond_branch\n\ + b ._779\n\ +._778:\n\ + bl ._1534\n\ +._767:\n\ + cmp r0, #0x46\n\ + bne ._781 @cond_branch\n\ + b ._782\n\ +._781:\n\ + cmp r0, #0x46\n\ + bgt ._783 @cond_branch\n\ + cmp r0, #0x3b\n\ + bne ._784 @cond_branch\n\ + b ._785\n\ +._784:\n\ + bl ._1534\n\ +._783:\n\ + cmp r0, #0x4d\n\ + bne ._787 @cond_branch\n\ + b ._788\n\ +._787:\n\ + cmp r0, #0xff\n\ + beq ._789 @cond_branch\n\ + bl ._1534\n\ +._789:\n\ + bl weather_get_current\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + sub r0, r0, #0x3\n\ + cmp r0, #0xa\n\ + bhi ._814 @cond_branch\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._793\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._794:\n\ + .align 2, 0\n\ +._793:\n\ + .word ._792\n\ +._792:\n\ + .word ._805\n\ + .word ._814\n\ + .word ._805\n\ + .word ._814\n\ + .word ._814\n\ + .word ._800\n\ + .word ._814\n\ + .word ._814\n\ + .word ._814\n\ + .word ._804\n\ + .word ._805\n\ +._805:\n\ + ldr r2, ._808\n\ + ldrh r1, [r2]\n\ + mov r0, #0x7\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._814 @cond_branch\n\ + mov r0, #0x5\n\ + strh r0, [r2]\n\ + ldr r0, ._808 + 4\n\ + ldr r3, ._808 + 8\n\ + add r2, r0, r3\n\ + mov r1, #0xa\n\ + b ._811\n\ +._809:\n\ + .align 2, 0\n\ +._808:\n\ + .word gBattleWeather\n\ + .word +0x2000000\n\ + .word 0x160a4\n\ +._800:\n\ + ldr r3, ._812\n\ + ldrh r1, [r3]\n\ + mov r2, #0x18\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._814 @cond_branch\n\ + strh r2, [r3]\n\ + ldr r0, ._812 + 4\n\ + ldr r3, ._812 + 8\n\ + add r2, r0, r3\n\ + mov r1, #0xc\n\ + b ._811\n\ +._813:\n\ + .align 2, 0\n\ +._812:\n\ + .word gBattleWeather\n\ + .word +0x2000000\n\ + .word 0x160a4\n\ +._804:\n\ + ldr r3, ._818\n\ + ldrh r1, [r3]\n\ + mov r2, #0x60\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._814 @cond_branch\n\ + strh r2, [r3]\n\ + ldr r0, ._818 + 4\n\ + ldr r3, ._818 + 8\n\ + add r2, r0, r3\n\ + mov r1, #0xb\n\ +._811:\n\ + strb r1, [r2]\n\ + ldr r5, ._818 + 12\n\ + add r0, r0, r5\n\ + mov r1, sl\n\ + strb r1, [r0]\n\ + mov r0, r9\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._814:\n\ + mov r2, r9\n\ + cmp r2, #0\n\ + bne ._815 @cond_branch\n\ + bl ._1540\n\ +._815:\n\ + bl weather_get_current\n\ + ldr r1, ._818 + 16\n\ + strb r0, [r1, #0x5]\n\ + ldr r0, ._818 + 20\n\ + bl BattleScriptPushCursorAndCallback\n\ + bl ._1534\n\ +._819:\n\ + .align 2, 0\n\ +._818:\n\ + .word gBattleWeather\n\ + .word +0x2000000\n\ + .word 0x160a4\n\ + .word 0x16003\n\ + .word gBattleCommunication\n\ + .word BattleScript_OverworldWeatherStarts\n\ +._772:\n\ + ldr r2, ._823\n\ + ldrh r1, [r2]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._820 @cond_branch\n\ + bl ._1534\n\ +._820:\n\ + mov r0, #0x5\n\ + strh r0, [r2]\n\ + ldr r0, ._823 + 4\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r0, ._823 + 8\n\ + ldr r3, ._823 + 12\n\ + add r0, r0, r3\n\ + mov r5, sl\n\ + strb r5, [r0]\n\ + bl ._1392\n\ +._824:\n\ + .align 2, 0\n\ +._823:\n\ + .word gBattleWeather\n\ + .word BattleScript_DrizzleActivates\n\ + .word +0x2000000\n\ + .word 0x16003\n\ +._766:\n\ + ldr r2, ._828\n\ + ldrh r1, [r2]\n\ + mov r0, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._825 @cond_branch\n\ + bl ._1534\n\ +._825:\n\ + mov r0, #0x18\n\ + strh r0, [r2]\n\ + ldr r0, ._828 + 4\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r0, ._828 + 8\n\ + ldr r1, ._828 + 12\n\ + add r0, r0, r1\n\ + mov r2, sl\n\ + strb r2, [r0]\n\ + bl ._1392\n\ +._829:\n\ + .align 2, 0\n\ +._828:\n\ + .word gBattleWeather\n\ + .word BattleScript_SandstreamActivates\n\ + .word +0x2000000\n\ + .word 0x16003\n\ +._782:\n\ + ldr r2, ._833\n\ + ldrh r1, [r2]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._830 @cond_branch\n\ + bl ._1534\n\ +._830:\n\ + mov r0, #0x60\n\ + strh r0, [r2]\n\ + ldr r0, ._833 + 4\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r0, ._833 + 8\n\ + ldr r3, ._833 + 12\n\ + add r0, r0, r3\n\ + mov r5, sl\n\ + strb r5, [r0]\n\ + bl ._1392\n\ +._834:\n\ + .align 2, 0\n\ +._833:\n\ + .word gBattleWeather\n\ + .word BattleScript_DroughtActivates\n\ + .word +0x2000000\n\ + .word 0x16003\n\ +._777:\n\ + ldr r0, ._838\n\ + mov r1, sl\n\ + lsl r2, r1, #0x2\n\ + add r1, r2, r1\n\ + lsl r1, r1, #0x2\n\ + add r3, r1, r0\n\ + ldrb r0, [r3]\n\ + lsl r0, r0, #0x1c\n\ + cmp r0, #0\n\ + bge ._835 @cond_branch\n\ + bl ._1534\n\ +._835:\n\ + ldr r1, ._838 + 4\n\ + add r1, r2, r1\n\ + ldr r0, [r1]\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0xc\n\ + orr r0, r0, r2\n\ + str r0, [r1]\n\ + ldrb r0, [r3]\n\ + mov r1, #0x8\n\ + b ._837\n\ +._839:\n\ + .align 2, 0\n\ +._838:\n\ + .word gSpecialStatuses\n\ + .word gStatuses3\n\ +._785:\n\ + mov r0, sl\n\ + bl CastformDataTypeChange\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ + cmp r0, #0\n\ + bne ._840 @cond_branch\n\ + bl ._1540\n\ +._840:\n\ + ldr r0, ._843\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r0, ._843 + 4\n\ + ldr r2, ._843 + 8\n\ + add r1, r0, r2\n\ + mov r3, sl\n\ + strb r3, [r1]\n\ + mov r1, r9\n\ + sub r1, r1, #0x1\n\ + ldr r5, ._843 + 12\n\ + add r0, r0, r5\n\ + strb r1, [r0]\n\ + bl ._1534\n\ +._844:\n\ + .align 2, 0\n\ +._843:\n\ + .word BattleScript_CastformChange\n\ + .word +0x2000000\n\ + .word 0x16003\n\ + .word 0x1609b\n\ +._779:\n\ + ldr r0, ._848\n\ + mov r1, sl\n\ + lsl r2, r1, #0x2\n\ + add r1, r2, r1\n\ + lsl r1, r1, #0x2\n\ + add r3, r1, r0\n\ + ldrb r0, [r3]\n\ + lsl r0, r0, #0x1b\n\ + cmp r0, #0\n\ + bge ._845 @cond_branch\n\ + bl ._1534\n\ +._845:\n\ + ldr r1, ._848 + 4\n\ + add r1, r2, r1\n\ + ldr r0, [r1]\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0xd\n\ + orr r0, r0, r2\n\ + str r0, [r1]\n\ + ldrb r0, [r3]\n\ + mov r1, #0x10\n\ +._837:\n\ + orr r0, r0, r1\n\ + strb r0, [r3]\n\ + bl ._1534\n\ +._849:\n\ + .align 2, 0\n\ +._848:\n\ + .word gSpecialStatuses\n\ + .word gStatuses3\n\ +._788:\n\ + mov r6, #0x0\n\ + ldrb r5, [r5]\n\ + cmp r6, r5\n\ + bcc ._854 @cond_branch\n\ + bl ._1534\n\ +._854:\n\ + add r0, r6, #0\n\ + bl CastformDataTypeChange\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ + cmp r0, #0\n\ + beq ._852 @cond_branch\n\ + bl ._853\n\ +._852:\n\ + add r0, r6, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + ldr r0, ._856\n\ + ldrb r0, [r0]\n\ + cmp r6, r0\n\ + bcc ._854 @cond_branch\n\ + bl ._1534\n\ +._857:\n\ + .align 2, 0\n\ +._856:\n\ + .word gNoOfAllBanks\n\ +._745:\n\ + ldr r2, ._865\n\ + mov r0, #0x58\n\ + mov r1, sl\n\ + mul r1, r1, r0\n\ + add r4, r1, r2\n\ + ldrh r0, [r4, #0x28]\n\ + cmp r0, #0\n\ + bne ._858 @cond_branch\n\ + bl ._1534\n\ +._858:\n\ + ldr r0, ._865 + 4\n\ + mov r3, sl\n\ + strb r3, [r0]\n\ + mov r3, r8\n\ + ldrb r5, [r3]\n\ + cmp r5, #0x2c\n\ + beq ._860 @cond_branch\n\ + cmp r5, #0x2c\n\ + bgt ._861 @cond_branch\n\ + cmp r5, #0x3\n\ + bne ._862 @cond_branch\n\ + b ._863\n\ +._862:\n\ + bl ._1534\n\ +._866:\n\ + .align 2, 0\n\ +._865:\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ +._861:\n\ + cmp r5, #0x36\n\ + bne ._867 @cond_branch\n\ + b ._868\n\ +._867:\n\ + cmp r5, #0x3d\n\ + beq ._869 @cond_branch\n\ + bl ._1534\n\ +._860:\n\ + mov r0, #0x0\n\ + str r0, [sp]\n\ + mov r0, #0x13\n\ + mov r1, #0x0\n\ + mov r2, #0xd\n\ + mov r3, #0x0\n\ + bl AbilityBattleEffects\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._871 @cond_branch\n\ + bl ._1534\n\ +._871:\n\ + str r0, [sp]\n\ + mov r0, #0x13\n\ + mov r1, #0x0\n\ + mov r2, #0x4d\n\ + mov r3, #0x0\n\ + bl AbilityBattleEffects\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._873 @cond_branch\n\ + bl ._1534\n\ +._873:\n\ + ldr r0, ._881\n\ + ldrh r1, [r0]\n\ + mov r0, #0x7\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._875 @cond_branch\n\ + bl ._1534\n\ +._875:\n\ + ldrh r0, [r4, #0x2c]\n\ + ldrh r1, [r4, #0x28]\n\ + cmp r0, r1\n\ + bhi ._877 @cond_branch\n\ + bl ._1534\n\ +._877:\n\ + mov r2, r8\n\ + strb r5, [r2]\n\ + ldr r0, ._881 + 4\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r1, ._881 + 8\n\ + ldrh r0, [r4, #0x2c]\n\ + lsr r0, r0, #0x4\n\ + str r0, [r1]\n\ + cmp r0, #0\n\ + bne ._879 @cond_branch\n\ + mov r0, #0x1\n\ + str r0, [r1]\n\ +._879:\n\ + ldr r0, [r1]\n\ + neg r0, r0\n\ + str r0, [r1]\n\ + bl ._1392\n\ +._882:\n\ + .align 2, 0\n\ +._881:\n\ + .word gBattleWeather\n\ + .word BattleScript_RainDishActivates\n\ + .word gBattleMoveDamage\n\ +._869:\n\ + add r0, r2, #0\n\ + add r0, r0, #0x4c\n\ + add r5, r1, r0\n\ + ldrb r0, [r5]\n\ + cmp r0, #0\n\ + bne ._883 @cond_branch\n\ + bl ._1534\n\ +._883:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r1, #0x3\n\ + bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + lsl r0, r0, #0x10\n\ + lsr r4, r0, #0x10\n\ + cmp r4, #0\n\ + beq ._885 @cond_branch\n\ + bl ._1534\n\ +._885:\n\ + ldr r0, [r5]\n\ + mov r1, #0x88\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._887 @cond_branch\n\ + ldr r0, ._893\n\ + ldr r1, ._893 + 4\n\ + bl StringCopy\n\ +._887:\n\ + ldr r0, [r5]\n\ + mov r1, #0x7\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._888 @cond_branch\n\ + ldr r0, ._893\n\ + ldr r1, ._893 + 8\n\ + bl StringCopy\n\ +._888:\n\ + ldr r0, [r5]\n\ + mov r1, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._889 @cond_branch\n\ + ldr r0, ._893\n\ + ldr r1, ._893 + 12\n\ + bl StringCopy\n\ +._889:\n\ + ldr r0, [r5]\n\ + mov r1, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._890 @cond_branch\n\ + ldr r0, ._893\n\ + ldr r1, ._893 + 16\n\ + bl StringCopy\n\ +._890:\n\ + ldr r0, [r5]\n\ + mov r1, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._891 @cond_branch\n\ + ldr r0, ._893\n\ + ldr r1, ._893 + 20\n\ + bl StringCopy\n\ +._891:\n\ + str r4, [r5]\n\ + ldr r0, ._893 + 24\n\ + ldr r4, ._893 + 28\n\ + mov r3, sl\n\ + strb r3, [r4]\n\ + ldr r1, ._893 + 32\n\ + add r0, r0, r1\n\ + strb r3, [r0]\n\ + ldr r0, ._893 + 36\n\ + bl BattleScriptPushCursorAndCallback\n\ + str r5, [sp]\n\ + mov r0, #0x0\n\ + mov r1, #0x28\n\ + mov r2, #0x0\n\ + mov r3, #0x4\n\ + bl EmitSetMonData\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + bl ._1392\n\ +._894:\n\ + .align 2, 0\n\ +._893:\n\ + .word gBattleTextBuff1\n\ + .word gStatusConditionString_PoisonJpn\n\ + .word gStatusConditionString_SleepJpn\n\ + .word gStatusConditionString_ParalysisJpn\n\ + .word gStatusConditionString_BurnJpn\n\ + .word gStatusConditionString_IceJpn\n\ + .word +0x2000000\n\ + .word gActiveBank\n\ + .word 0x16003\n\ + .word BattleScript_ShedSkinActivates\n\ +._863:\n\ + ldrb r2, [r4, #0x1b]\n\ + mov r0, #0x1b\n\ + ldsb r0, [r4, r0]\n\ + cmp r0, #0xb\n\ + ble ._895 @cond_branch\n\ + bl ._1534\n\ +._895:\n\ + ldr r0, ._900\n\ + mov r3, sl\n\ + lsl r1, r3, #0x3\n\ + sub r1, r1, r3\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x16]\n\ + cmp r0, #0x2\n\ + bne ._897 @cond_branch\n\ + bl ._1534\n\ +._897:\n\ + add r0, r2, #1\n\ + mov r2, #0x0\n\ + strb r0, [r4, #0x1b]\n\ + ldr r5, ._900 + 4\n\ + add r1, r7, r5\n\ + mov r0, #0x11\n\ + strb r0, [r1]\n\ + ldr r1, ._900 + 8\n\ + add r0, r7, r1\n\ + strb r2, [r0]\n\ + ldr r0, ._900 + 12\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r2, ._900 + 16\n\ + add r0, r7, r2\n\ + mov r3, sl\n\ + strb r3, [r0]\n\ + bl ._1392\n\ +._901:\n\ + .align 2, 0\n\ +._900:\n\ + .word gDisableStructs\n\ + .word 0x160a4\n\ + .word 0x160a5\n\ + .word BattleScript_SpeedBoostActivates\n\ + .word 0x16003\n\ +._868:\n\ + ldr r2, ._903\n\ + ldrb r0, [r0]\n\ + lsl r1, r0, #0x3\n\ + sub r1, r1, r0\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r2\n\ + ldrb r3, [r1, #0x18]\n\ + lsl r0, r3, #0x1f\n\ + lsr r0, r0, #0x1f\n\ + mov r2, #0x1\n\ + eor r2, r2, r0\n\ + mov r0, #0x2\n\ + neg r0, r0\n\ + and r0, r0, r3\n\ + orr r0, r0, r2\n\ + strb r0, [r1, #0x18]\n\ + bl ._1534\n\ +._904:\n\ + .align 2, 0\n\ +._903:\n\ + .word gDisableStructs\n\ +._746:\n\ + mov r5, r8\n\ + ldrb r0, [r5]\n\ + cmp r0, #0x2b\n\ + beq ._905 @cond_branch\n\ + bl ._1534\n\ +._905:\n\ + mov r4, #0x0\n\ + ldr r0, ._917\n\ + ldrh r2, [r0]\n\ + ldr r5, ._917 + 4\n\ + add r1, r0, #0\n\ + cmp r2, r5\n\ + bne ._907 @cond_branch\n\ + bl ._1534\n\ +._907:\n\ + cmp r2, r3\n\ + beq ._909 @cond_branch\n\ + add r2, r1, #0\n\ +._912:\n\ + add r2, r2, #0x2\n\ + add r4, r4, #0x1\n\ + ldrh r0, [r2]\n\ + cmp r0, r5\n\ + bne ._910 @cond_branch\n\ + bl ._1534\n\ +._910:\n\ + cmp r0, r3\n\ + bne ._912 @cond_branch\n\ +._909:\n\ + lsl r0, r4, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + ldr r0, ._917 + 4\n\ + cmp r1, r0\n\ + bne ._913 @cond_branch\n\ + bl ._1534\n\ +._913:\n\ + ldr r1, ._917 + 8\n\ + ldr r0, ._917 + 12\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r1, r1, #0x50\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x5\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._915 @cond_branch\n\ + ldr r0, ._917 + 16\n\ + ldr r1, [r0]\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x4\n\ + orr r1, r1, r2\n\ + str r1, [r0]\n\ +._915:\n\ + ldr r1, ._917 + 20\n\ + ldr r0, ._917 + 24\n\ + str r0, [r1]\n\ + mov r0, #0x1\n\ + mov r9, r0\n\ + bl ._916\n\ +._918:\n\ + .align 2, 0\n\ +._917:\n\ + .word gSoundMovesTable\n\ + .word 0xffff\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gHitMarker\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_SoundproofProtected\n\ +._747:\n\ + cmp r3, #0\n\ + bne ._919 @cond_branch\n\ + bl ._1534\n\ +._919:\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + cmp r0, #0xb\n\ + beq ._921 @cond_branch\n\ + cmp r0, #0xb\n\ + bgt ._922 @cond_branch\n\ + cmp r0, #0xa\n\ + beq ._923 @cond_branch\n\ + b ._956\n\ +._922:\n\ + cmp r0, #0x12\n\ + beq ._925 @cond_branch\n\ + b ._956\n\ +._923:\n\ + cmp r4, #0xd\n\ + beq ._927 @cond_branch\n\ + b ._956\n\ +._927:\n\ + ldr r0, ._933\n\ + lsl r1, r3, #0x1\n\ + add r1, r1, r3\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + cmp r0, #0\n\ + bne ._929 @cond_branch\n\ + b ._956\n\ +._929:\n\ + ldr r1, ._933 + 4\n\ + ldr r0, ._933 + 8\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0, #0x2]\n\ + lsl r0, r0, #0x1c\n\ + cmp r0, #0\n\ + bge ._931 @cond_branch\n\ + ldr r1, ._933 + 12\n\ + ldr r0, ._933 + 16\n\ + b ._932\n\ +._934:\n\ + .align 2, 0\n\ +._933:\n\ + .word gBattleMoves\n\ + .word gProtectStructs\n\ + .word gBankAttacker\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_MoveHPDrain\n\ +._931:\n\ + ldr r1, ._936\n\ + ldr r0, ._936 + 4\n\ +._932:\n\ + str r0, [r1]\n\ + mov r2, #0x1\n\ + b ._935\n\ +._937:\n\ + .align 2, 0\n\ +._936:\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_MoveHPDrain_PPLoss\n\ +._921:\n\ + cmp r4, #0xb\n\ + beq ._938 @cond_branch\n\ + b ._956\n\ +._938:\n\ + ldr r0, ._944\n\ + lsl r1, r3, #0x1\n\ + add r1, r1, r3\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + cmp r0, #0\n\ + bne ._940 @cond_branch\n\ + b ._956\n\ +._940:\n\ + ldr r1, ._944 + 4\n\ + ldr r0, ._944 + 8\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0, #0x2]\n\ + lsl r0, r0, #0x1c\n\ + cmp r0, #0\n\ + bge ._942 @cond_branch\n\ + ldr r1, ._944 + 12\n\ + ldr r0, ._944 + 16\n\ + b ._943\n\ +._945:\n\ + .align 2, 0\n\ +._944:\n\ + .word gBattleMoves\n\ + .word gProtectStructs\n\ + .word gBankAttacker\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_MoveHPDrain\n\ +._942:\n\ + ldr r1, ._947\n\ + ldr r0, ._947 + 4\n\ +._943:\n\ + str r0, [r1]\n\ + mov r3, #0x1\n\ + mov r9, r3\n\ + b ._956\n\ +._948:\n\ + .align 2, 0\n\ +._947:\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_MoveHPDrain_PPLoss\n\ +._925:\n\ + cmp r4, #0xa\n\ + bne ._956 @cond_branch\n\ + ldr r1, ._954\n\ + mov r0, #0x58\n\ + mov r5, sl\n\ + mul r5, r5, r0\n\ + add r0, r5, #0\n\ + add r1, r1, #0x4c\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._956 @cond_branch\n\ + ldr r2, ._954 + 4\n\ + mov r0, sl\n\ + lsl r1, r0, #0x2\n\ + add r0, r1, r2\n\ + ldr r3, [r0]\n\ + mov r4, #0x1\n\ + and r3, r3, r4\n\ + add r5, r1, #0\n\ + cmp r3, #0\n\ + bne ._951 @cond_branch\n\ + ldr r0, ._954 + 8\n\ + strb r3, [r0, #0x5]\n\ + ldr r1, ._954 + 12\n\ + ldr r0, ._954 + 16\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0, #0x2]\n\ + lsl r0, r0, #0x1c\n\ + cmp r0, #0\n\ + bge ._952 @cond_branch\n\ + ldr r1, ._954 + 20\n\ + ldr r0, ._954 + 24\n\ + b ._953\n\ +._955:\n\ + .align 2, 0\n\ +._954:\n\ + .word gBattleMons\n\ + .word +0x2017100\n\ + .word gBattleCommunication\n\ + .word gProtectStructs\n\ + .word gBankAttacker\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_FlashFireBoost\n\ +._952:\n\ + ldr r1, ._957\n\ + ldr r0, ._957 + 4\n\ +._953:\n\ + str r0, [r1]\n\ + add r0, r5, r2\n\ + ldr r1, [r0]\n\ + mov r2, #0x1\n\ + orr r1, r1, r2\n\ + str r1, [r0]\n\ + mov r1, #0x2\n\ + mov r9, r1\n\ + b ._956\n\ +._958:\n\ + .align 2, 0\n\ +._957:\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_FlashFireBoost_PPLoss\n\ +._951:\n\ + ldr r0, ._961\n\ + strb r4, [r0, #0x5]\n\ + ldr r1, ._961 + 4\n\ + ldr r0, ._961 + 8\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0, #0x2]\n\ + lsl r0, r0, #0x1c\n\ + cmp r0, #0\n\ + bge ._959 @cond_branch\n\ + ldr r1, ._961 + 12\n\ + ldr r0, ._961 + 16\n\ + b ._960\n\ +._962:\n\ + .align 2, 0\n\ +._961:\n\ + .word gBattleCommunication\n\ + .word gProtectStructs\n\ + .word gBankAttacker\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_FlashFireBoost\n\ +._959:\n\ + ldr r1, ._968\n\ + ldr r0, ._968 + 4\n\ +._960:\n\ + str r0, [r1]\n\ + mov r2, #0x2\n\ +._935:\n\ + mov r9, r2\n\ +._956:\n\ + mov r3, r9\n\ + cmp r3, #0x1\n\ + beq ._963 @cond_branch\n\ + bl ._1534\n\ +._963:\n\ + ldr r1, ._968 + 8\n\ + mov r0, #0x58\n\ + mov r5, sl\n\ + mul r5, r5, r0\n\ + add r0, r5, #0\n\ + add r1, r0, r1\n\ + ldrh r0, [r1, #0x2c]\n\ + ldrh r2, [r1, #0x28]\n\ + cmp r0, r2\n\ + bne ._965 @cond_branch\n\ + ldr r1, ._968 + 12\n\ + ldr r0, ._968 + 16\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0, #0x2]\n\ + lsl r0, r0, #0x1c\n\ + cmp r0, #0\n\ + bge ._966 @cond_branch\n\ + ldr r1, ._968\n\ + ldr r0, ._968 + 20\n\ + str r0, [r1]\n\ + bl ._1534\n\ +._969:\n\ + .align 2, 0\n\ +._968:\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_FlashFireBoost_PPLoss\n\ + .word gBattleMons\n\ + .word gProtectStructs\n\ + .word gBankAttacker\n\ + .word BattleScript_MoveHPDrain_FullHP\n\ +._966:\n\ + ldr r1, ._971\n\ + ldr r0, ._971 + 4\n\ + str r0, [r1]\n\ + bl ._1534\n\ +._972:\n\ + .align 2, 0\n\ +._971:\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_MoveHPDrain_FullHP_PPLoss\n\ +._965:\n\ + ldr r2, ._975\n\ + ldrh r0, [r1, #0x2c]\n\ + lsr r0, r0, #0x2\n\ + str r0, [r2]\n\ + cmp r0, #0\n\ + bne ._973 @cond_branch\n\ + mov r3, r9\n\ + str r3, [r2]\n\ +._973:\n\ + ldr r0, [r2]\n\ + neg r0, r0\n\ + str r0, [r2]\n\ + bl ._1534\n\ +._976:\n\ + .align 2, 0\n\ +._975:\n\ + .word gBattleMoveDamage\n\ +._748:\n\ + mov r5, r8\n\ + ldrb r0, [r5]\n\ + sub r0, r0, #0x9\n\ + cmp r0, #0x2f\n\ + bls ._977 @cond_branch\n\ + bl ._1534\n\ +._977:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._980\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._981:\n\ + .align 2, 0\n\ +._980:\n\ + .word ._979\n\ +._979:\n\ + .word ._982\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._989\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._997\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1000\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1011\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1022\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1534\n\ + .word ._1029\n\ +._989:\n\ + ldr r0, ._1046\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1030 @cond_branch\n\ + bl ._1534\n\ +._1030:\n\ + cmp r3, #0xa5\n\ + bne ._1032 @cond_branch\n\ + bl ._1534\n\ +._1032:\n\ + ldr r0, ._1046 + 4\n\ + lsl r1, r3, #0x1\n\ + add r1, r1, r3\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + cmp r0, #0\n\ + bne ._1034 @cond_branch\n\ + bl ._1534\n\ +._1034:\n\ + ldr r2, ._1046 + 8\n\ + ldr r0, ._1046 + 12\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1037 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1037 @cond_branch\n\ + bl ._1534\n\ +._1037:\n\ + ldr r1, ._1046 + 16\n\ + mov r0, #0x58\n\ + mov r2, sl\n\ + mul r2, r2, r0\n\ + add r0, r2, #0\n\ + add r1, r0, r1\n\ + add r3, r1, #0\n\ + add r3, r3, #0x21\n\ + ldrb r0, [r3]\n\ + cmp r0, r4\n\ + bne ._1039 @cond_branch\n\ + bl ._1534\n\ +._1039:\n\ + add r2, r1, #0\n\ + add r2, r2, #0x22\n\ + ldrb r0, [r2]\n\ + cmp r0, r4\n\ + bne ._1041 @cond_branch\n\ + bl ._1534\n\ +._1041:\n\ + ldrh r0, [r1, #0x28]\n\ + cmp r0, #0\n\ + bne ._1043 @cond_branch\n\ + bl ._1534\n\ +._1043:\n\ + strb r4, [r3]\n\ + strb r4, [r2]\n\ + ldr r1, ._1046 + 20\n\ + mov r0, #0xfd\n\ + strb r0, [r1]\n\ + mov r0, #0x3\n\ + strb r0, [r1, #0x1]\n\ + strb r4, [r1, #0x2]\n\ + mov r0, #0xff\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1046 + 24\n\ + ldr r0, ._1046 + 28\n\ + str r0, [r1]\n\ + bl ._1392\n\ +._1047:\n\ + .align 2, 0\n\ +._1046:\n\ + .word gBattleMoveFlags\n\ + .word gBattleMoves\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleMons\n\ + .word gBattleTextBuff1\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ColorChangeActivates\n\ +._997:\n\ + ldr r0, ._1061\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1048 @cond_branch\n\ + bl ._1534\n\ +._1048:\n\ + ldr r1, ._1061 + 4\n\ + ldr r0, ._1061 + 8\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r4, r0, r1\n\ + ldrh r0, [r4, #0x28]\n\ + cmp r0, #0\n\ + bne ._1050 @cond_branch\n\ + bl ._1534\n\ +._1050:\n\ + ldr r0, ._1061 + 12\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1052 @cond_branch\n\ + bl ._1534\n\ +._1052:\n\ + ldr r2, ._1061 + 16\n\ + ldr r0, ._1061 + 20\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1055 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1055 @cond_branch\n\ + bl ._1534\n\ +._1055:\n\ + ldr r1, ._1061 + 24\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r2, #0x1\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1057 @cond_branch\n\ + bl ._1534\n\ +._1057:\n\ + ldr r1, ._1061 + 28\n\ + ldrh r0, [r4, #0x2c]\n\ + lsr r0, r0, #0x4\n\ + str r0, [r1]\n\ + cmp r0, #0\n\ + bne ._1059 @cond_branch\n\ + str r2, [r1]\n\ +._1059:\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1061 + 32\n\ + ldr r0, ._1061 + 36\n\ + str r0, [r1]\n\ + bl ._1392\n\ +._1062:\n\ + .align 2, 0\n\ +._1061:\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleMoves\n\ + .word gBattleMoveDamage\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_RoughSkinActivates\n\ +._1000:\n\ + ldr r0, ._1078\n\ + ldrb r1, [r0]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1063 @cond_branch\n\ + ldr r0, ._1078 + 4\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1064 @cond_branch\n\ + bl ._1534\n\ +._1064:\n\ + ldr r1, ._1078 + 8\n\ + ldr r0, ._1078 + 12\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1066 @cond_branch\n\ + bl ._1534\n\ +._1066:\n\ + ldr r0, ._1078 + 16\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1068 @cond_branch\n\ + bl ._1534\n\ +._1068:\n\ + ldr r2, ._1078 + 20\n\ + ldr r0, ._1078 + 24\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1071 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1071 @cond_branch\n\ + bl ._1534\n\ +._1071:\n\ + ldr r1, ._1078 + 28\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1073 @cond_branch\n\ + bl ._1534\n\ +._1073:\n\ + ldr r5, ._1078 + 32\n\ + mov r4, #0x3\n\ +._1075:\n\ + bl Random\n\ + and r0, r0, r4\n\ + strb r0, [r5, #0x3]\n\ + cmp r0, #0\n\ + beq ._1075 @cond_branch\n\ + ldr r1, ._1078 + 32\n\ + ldrb r0, [r1, #0x3]\n\ + cmp r0, #0x3\n\ + bne ._1076 @cond_branch\n\ + add r0, r0, #0x2\n\ + strb r0, [r1, #0x3]\n\ +._1076:\n\ + ldrb r0, [r1, #0x3]\n\ + add r0, r0, #0x40\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1078 + 36\n\ + ldr r0, ._1078 + 40\n\ + str r0, [r1]\n\ + ldr r2, ._1078 + 44\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl ._1392\n\ +._1079:\n\ + .align 2, 0\n\ +._1078:\n\ + .word gUnknown_02023A14+0x50\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleMoves\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ApplySecondaryEffect\n\ + .word gHitMarker\n\ +._1063:\n\ + ldr r0, ._1096\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1080 @cond_branch\n\ + bl ._1534\n\ +._1080:\n\ + ldr r1, ._1096 + 4\n\ + ldr r0, ._1096 + 8\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1082 @cond_branch\n\ + bl ._1534\n\ +._1082:\n\ + ldr r0, ._1096 + 12\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1084 @cond_branch\n\ + bl ._1534\n\ +._1084:\n\ + ldr r2, ._1096 + 16\n\ + ldr r0, ._1096 + 20\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1087 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1087 @cond_branch\n\ + bl ._1534\n\ +._1087:\n\ + ldr r1, ._1096 + 24\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1089 @cond_branch\n\ + bl ._1534\n\ +._1089:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r1, #0xa\n\ + bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + beq ._1091 @cond_branch\n\ + bl ._1534\n\ +._1091:\n\ + ldr r5, ._1096 + 28\n\ + mov r4, #0x3\n\ +._1093:\n\ + bl Random\n\ + and r0, r0, r4\n\ + strb r0, [r5, #0x3]\n\ + cmp r0, #0\n\ + beq ._1093 @cond_branch\n\ + ldr r1, ._1096 + 28\n\ + ldrb r0, [r1, #0x3]\n\ + cmp r0, #0x3\n\ + bne ._1094 @cond_branch\n\ + add r0, r0, #0x2\n\ + strb r0, [r1, #0x3]\n\ +._1094:\n\ + ldrb r0, [r1, #0x3]\n\ + add r0, r0, #0x40\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1096 + 32\n\ + ldr r0, ._1096 + 36\n\ + str r0, [r1]\n\ + ldr r2, ._1096 + 40\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl ._1392\n\ +._1097:\n\ + .align 2, 0\n\ +._1096:\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleMoves\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ApplySecondaryEffect\n\ + .word gHitMarker\n\ +._1011:\n\ + ldr r0, ._1111\n\ + ldrb r1, [r0]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1098 @cond_branch\n\ + ldr r0, ._1111 + 4\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1099 @cond_branch\n\ + bl ._1534\n\ +._1099:\n\ + ldr r1, ._1111 + 8\n\ + ldr r0, ._1111 + 12\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1101 @cond_branch\n\ + bl ._1534\n\ +._1101:\n\ + ldr r0, ._1111 + 16\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1103 @cond_branch\n\ + bl ._1534\n\ +._1103:\n\ + ldr r2, ._1111 + 20\n\ + ldr r0, ._1111 + 24\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1106 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1106 @cond_branch\n\ + bl ._1534\n\ +._1106:\n\ + ldr r1, ._1111 + 28\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1108 @cond_branch\n\ + bl ._1534\n\ +._1108:\n\ + ldr r1, ._1111 + 32\n\ + mov r0, #0x42\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1111 + 36\n\ + ldr r0, ._1111 + 40\n\ + str r0, [r1]\n\ + ldr r2, ._1111 + 44\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl ._1392\n\ +._1112:\n\ + .align 2, 0\n\ +._1111:\n\ + .word gUnknown_02023A14+0x50\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleMoves\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ApplySecondaryEffect\n\ + .word gHitMarker\n\ +._1098:\n\ + ldr r0, ._1127\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1113 @cond_branch\n\ + bl ._1534\n\ +._1113:\n\ + ldr r1, ._1127 + 4\n\ + ldr r0, ._1127 + 8\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1115 @cond_branch\n\ + bl ._1534\n\ +._1115:\n\ + ldr r0, ._1127 + 12\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1117 @cond_branch\n\ + bl ._1534\n\ +._1117:\n\ + ldr r2, ._1127 + 16\n\ + ldr r0, ._1127 + 20\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1120 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1120 @cond_branch\n\ + bl ._1534\n\ +._1120:\n\ + ldr r1, ._1127 + 24\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1122 @cond_branch\n\ + bl ._1534\n\ +._1122:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r1, #0x3\n\ + bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + beq ._1124 @cond_branch\n\ + bl ._1534\n\ +._1124:\n\ + ldr r1, ._1127 + 28\n\ + mov r0, #0x42\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1127 + 32\n\ + ldr r0, ._1127 + 36\n\ + str r0, [r1]\n\ + ldr r2, ._1127 + 40\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl ._1392\n\ +._1128:\n\ + .align 2, 0\n\ +._1127:\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleMoves\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ApplySecondaryEffect\n\ + .word gHitMarker\n\ +._982:\n\ + ldr r0, ._1142\n\ + ldrb r1, [r0]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1129 @cond_branch\n\ + ldr r0, ._1142 + 4\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1130 @cond_branch\n\ + bl ._1534\n\ +._1130:\n\ + ldr r1, ._1142 + 8\n\ + ldr r0, ._1142 + 12\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1132 @cond_branch\n\ + bl ._1534\n\ +._1132:\n\ + ldr r0, ._1142 + 16\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1134 @cond_branch\n\ + bl ._1534\n\ +._1134:\n\ + ldr r2, ._1142 + 20\n\ + ldr r0, ._1142 + 24\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1137 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1137 @cond_branch\n\ + bl ._1534\n\ +._1137:\n\ + ldr r1, ._1142 + 28\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1139 @cond_branch\n\ + bl ._1534\n\ +._1139:\n\ + ldr r1, ._1142 + 32\n\ + mov r0, #0x45\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1142 + 36\n\ + ldr r0, ._1142 + 40\n\ + str r0, [r1]\n\ + ldr r2, ._1142 + 44\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl ._1392\n\ +._1143:\n\ + .align 2, 0\n\ +._1142:\n\ + .word gUnknown_02023A14+0x50\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleMoves\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ApplySecondaryEffect\n\ + .word gHitMarker\n\ +._1129:\n\ + ldr r0, ._1158\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1144 @cond_branch\n\ + bl ._1534\n\ +._1144:\n\ + ldr r1, ._1158 + 4\n\ + ldr r0, ._1158 + 8\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1146 @cond_branch\n\ + bl ._1534\n\ +._1146:\n\ + ldr r0, ._1158 + 12\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1148 @cond_branch\n\ + bl ._1534\n\ +._1148:\n\ + ldr r2, ._1158 + 16\n\ + ldr r0, ._1158 + 20\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1151 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1151 @cond_branch\n\ + bl ._1534\n\ +._1151:\n\ + ldr r1, ._1158 + 24\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1153 @cond_branch\n\ + bl ._1534\n\ +._1153:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r1, #0x3\n\ + bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + beq ._1155 @cond_branch\n\ + bl ._1534\n\ +._1155:\n\ + ldr r1, ._1158 + 28\n\ + mov r0, #0x45\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1158 + 32\n\ + ldr r0, ._1158 + 36\n\ + str r0, [r1]\n\ + ldr r2, ._1158 + 40\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl ._1392\n\ +._1159:\n\ + .align 2, 0\n\ +._1158:\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleMoves\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ApplySecondaryEffect\n\ + .word gHitMarker\n\ +._1022:\n\ + ldr r0, ._1173\n\ + ldrb r1, [r0]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1160 @cond_branch\n\ + ldr r0, ._1173 + 4\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1161 @cond_branch\n\ + bl ._1534\n\ +._1161:\n\ + ldr r1, ._1173 + 8\n\ + ldr r0, ._1173 + 12\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1163 @cond_branch\n\ + bl ._1534\n\ +._1163:\n\ + ldr r0, ._1173 + 16\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1165 @cond_branch\n\ + bl ._1534\n\ +._1165:\n\ + ldr r1, ._1173 + 20\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1167 @cond_branch\n\ + bl ._1534\n\ +._1167:\n\ + ldr r2, ._1173 + 24\n\ + ldr r0, ._1173 + 28\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1170 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1170 @cond_branch\n\ + bl ._1534\n\ +._1170:\n\ + ldr r1, ._1173 + 32\n\ + mov r0, #0x43\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1173 + 36\n\ + ldr r0, ._1173 + 40\n\ + str r0, [r1]\n\ + ldr r2, ._1173 + 44\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl ._1392\n\ +._1174:\n\ + .align 2, 0\n\ +._1173:\n\ + .word gUnknown_02023A14+0x50\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gBattleMoves\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ApplySecondaryEffect\n\ + .word gHitMarker\n\ +._1160:\n\ + ldr r0, ._1189\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1175 @cond_branch\n\ + bl ._1534\n\ +._1175:\n\ + ldr r1, ._1189 + 4\n\ + ldr r0, ._1189 + 8\n\ + ldrb r2, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1177 @cond_branch\n\ + bl ._1534\n\ +._1177:\n\ + ldr r0, ._1189 + 12\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1179 @cond_branch\n\ + bl ._1534\n\ +._1179:\n\ + ldr r1, ._1189 + 16\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1181 @cond_branch\n\ + bl ._1534\n\ +._1181:\n\ + ldr r2, ._1189 + 20\n\ + ldr r0, ._1189 + 24\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r1, r0, #0x2\n\ + add r0, r2, #0\n\ + add r0, r0, #0x8\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1184 @cond_branch\n\ + add r0, r2, #0\n\ + add r0, r0, #0xc\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1184 @cond_branch\n\ + bl ._1534\n\ +._1184:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r1, #0x3\n\ + bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + beq ._1186 @cond_branch\n\ + bl ._1534\n\ +._1186:\n\ + ldr r1, ._1189 + 28\n\ + mov r0, #0x43\n\ + strb r0, [r1, #0x3]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1189 + 32\n\ + ldr r0, ._1189 + 36\n\ + str r0, [r1]\n\ + ldr r2, ._1189 + 40\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl ._1392\n\ +._1190:\n\ + .align 2, 0\n\ +._1189:\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gBattleMoves\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_ApplySecondaryEffect\n\ + .word gHitMarker\n\ +._1029:\n\ + ldr r0, ._1217\n\ + ldrb r1, [r0]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1191 @cond_branch\n\ + b ._1192\n\ +._1191:\n\ + ldr r0, ._1217 + 4\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1193 @cond_branch\n\ + bl ._1534\n\ +._1193:\n\ + ldr r5, ._1217 + 8\n\ + ldr r7, ._1217 + 12\n\ + ldrb r1, [r7]\n\ + mov r6, #0x58\n\ + add r0, r1, #0\n\ + mul r0, r0, r6\n\ + add r4, r0, r5\n\ + ldrh r0, [r4, #0x28]\n\ + cmp r0, #0\n\ + bne ._1195 @cond_branch\n\ + bl ._1534\n\ +._1195:\n\ + ldr r0, ._1217 + 16\n\ + lsl r1, r1, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1197 @cond_branch\n\ + bl ._1534\n\ +._1197:\n\ + ldr r1, ._1217 + 20\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1199 @cond_branch\n\ + bl ._1534\n\ +._1199:\n\ + ldr r3, ._1217 + 24\n\ + ldr r0, ._1217 + 28\n\ + mov r8, r0\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r2, r0, #0x2\n\ + add r0, r3, #0\n\ + add r0, r0, #0x8\n\ + add r0, r2, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1202 @cond_branch\n\ + add r0, r3, #0\n\ + add r0, r0, #0xc\n\ + add r0, r2, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1202 @cond_branch\n\ + bl ._1534\n\ +._1202:\n\ + add r0, r1, #0\n\ + mul r0, r0, r6\n\ + add r0, r0, r5\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1204 @cond_branch\n\ + bl ._1534\n\ +._1204:\n\ + add r0, r4, #0\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0xc\n\ + bne ._1206 @cond_branch\n\ + bl ._1534\n\ +._1206:\n\ + ldr r0, [sp, #0x8]\n\ + ldr r1, [sp, #0x10]\n\ + bl GetGenderFromSpeciesAndPersonality\n\ + add r4, r0, #0\n\ + ldr r0, [sp, #0xc]\n\ + ldr r1, [sp, #0x14]\n\ + bl GetGenderFromSpeciesAndPersonality\n\ + lsl r4, r4, #0x18\n\ + lsl r0, r0, #0x18\n\ + cmp r4, r0\n\ + bne ._1208 @cond_branch\n\ + bl ._1534\n\ +._1208:\n\ + ldrb r0, [r7]\n\ + mul r0, r0, r6\n\ + add r4, r5, #0\n\ + add r4, r4, #0x50\n\ + add r0, r0, r4\n\ + ldr r0, [r0]\n\ + mov r1, #0xf0\n\ + lsl r1, r1, #0xc\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1210 @cond_branch\n\ + bl ._1534\n\ +._1210:\n\ + ldr r0, [sp, #0x8]\n\ + ldr r1, [sp, #0x10]\n\ + bl GetGenderFromSpeciesAndPersonality\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xff\n\ + bne ._1212 @cond_branch\n\ + bl ._1534\n\ +._1212:\n\ + ldr r0, [sp, #0xc]\n\ + ldr r1, [sp, #0x14]\n\ + bl GetGenderFromSpeciesAndPersonality\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xff\n\ + bne ._1214 @cond_branch\n\ + bl ._1534\n\ +._1214:\n\ + ldrb r0, [r7]\n\ + add r2, r0, #0\n\ + mul r2, r2, r6\n\ + add r2, r2, r4\n\ + ldr r1, ._1217 + 32\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, [r0]\n\ + lsl r1, r1, #0x10\n\ + ldr r0, [r2]\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1217 + 36\n\ + ldr r0, ._1217 + 40\n\ + str r0, [r1]\n\ + bl ._1392\n\ +._1218:\n\ + .align 2, 0\n\ +._1217:\n\ + .word gUnknown_02023A14+0x50\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gBattleMoves\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBitTable\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_CuteCharmActivates\n\ +._1192:\n\ + ldr r0, ._1245\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1219 @cond_branch\n\ + bl ._1534\n\ +._1219:\n\ + ldr r5, ._1245 + 4\n\ + ldr r7, ._1245 + 8\n\ + ldrb r1, [r7]\n\ + mov r6, #0x58\n\ + add r0, r1, #0\n\ + mul r0, r0, r6\n\ + add r0, r0, r5\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1221 @cond_branch\n\ + bl ._1534\n\ +._1221:\n\ + ldr r0, ._1245 + 12\n\ + lsl r1, r1, #0x4\n\ + add r1, r1, r0\n\ + ldrb r0, [r1, #0x1]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._1223 @cond_branch\n\ + bl ._1534\n\ +._1223:\n\ + ldr r1, ._1245 + 16\n\ + lsl r0, r3, #0x1\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x8]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1225 @cond_branch\n\ + bl ._1534\n\ +._1225:\n\ + ldr r3, ._1245 + 20\n\ + ldr r0, ._1245 + 24\n\ + mov r8, r0\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r2, r0, #0x2\n\ + add r0, r3, #0\n\ + add r0, r0, #0x8\n\ + add r0, r2, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1228 @cond_branch\n\ + add r0, r3, #0\n\ + add r0, r0, #0xc\n\ + add r0, r2, r0\n\ + ldr r0, [r0]\n\ + cmp r0, #0\n\ + bne ._1228 @cond_branch\n\ + bl ._1534\n\ +._1228:\n\ + add r0, r1, #0\n\ + mul r0, r0, r6\n\ + add r0, r0, r5\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + bne ._1230 @cond_branch\n\ + bl ._1534\n\ +._1230:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r1, #0x3\n\ + bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + beq ._1232 @cond_branch\n\ + bl ._1534\n\ +._1232:\n\ + ldrb r0, [r7]\n\ + mul r0, r0, r6\n\ + add r0, r0, r5\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0xc\n\ + bne ._1234 @cond_branch\n\ + bl ._1534\n\ +._1234:\n\ + ldr r0, [sp, #0x8]\n\ + ldr r1, [sp, #0x10]\n\ + bl GetGenderFromSpeciesAndPersonality\n\ + add r4, r0, #0\n\ + ldr r0, [sp, #0xc]\n\ + ldr r1, [sp, #0x14]\n\ + bl GetGenderFromSpeciesAndPersonality\n\ + lsl r4, r4, #0x18\n\ + lsl r0, r0, #0x18\n\ + cmp r4, r0\n\ + bne ._1236 @cond_branch\n\ + bl ._1534\n\ +._1236:\n\ + ldrb r0, [r7]\n\ + mul r0, r0, r6\n\ + add r4, r5, #0\n\ + add r4, r4, #0x50\n\ + add r0, r0, r4\n\ + ldr r0, [r0]\n\ + mov r1, #0xf0\n\ + lsl r1, r1, #0xc\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1238 @cond_branch\n\ + bl ._1534\n\ +._1238:\n\ + ldr r0, [sp, #0x8]\n\ + ldr r1, [sp, #0x10]\n\ + bl GetGenderFromSpeciesAndPersonality\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xff\n\ + bne ._1240 @cond_branch\n\ + bl ._1534\n\ +._1240:\n\ + ldr r0, [sp, #0xc]\n\ + ldr r1, [sp, #0x14]\n\ + bl GetGenderFromSpeciesAndPersonality\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xff\n\ + bne ._1242 @cond_branch\n\ + bl ._1534\n\ +._1242:\n\ + ldrb r0, [r7]\n\ + add r2, r0, #0\n\ + mul r2, r2, r6\n\ + add r2, r2, r4\n\ + ldr r1, ._1245 + 28\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, [r0]\n\ + lsl r1, r1, #0x10\n\ + ldr r0, [r2]\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1245 + 32\n\ + ldr r0, ._1245 + 36\n\ + str r0, [r1]\n\ + bl ._1392\n\ +._1246:\n\ + .align 2, 0\n\ +._1245:\n\ + .word gBattleMoveFlags\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gProtectStructs\n\ + .word gBattleMoves\n\ + .word gSpecialStatuses\n\ + .word gBankTarget\n\ + .word gBitTable\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_CuteCharmActivates\n\ +._749:\n\ + mov r5, #0x0\n\ + mov sl, r5\n\ + ldr r0, ._1251\n\ + ldrb r0, [r0]\n\ + cmp sl, r0\n\ + bcc ._1366 @cond_branch\n\ + bl ._1534\n\ +._1366:\n\ + ldr r1, ._1251 + 4\n\ + mov r0, #0x58\n\ + mov r2, sl\n\ + mul r2, r2, r0\n\ + add r0, r2, #0\n\ + add r0, r0, r1\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + sub r0, r0, #0x7\n\ + add r2, r1, #0\n\ + cmp r0, #0x41\n\ + bls ._1249 @cond_branch\n\ + b ._1346\n\ +._1249:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._1251 + 8\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._1252:\n\ + .align 2, 0\n\ +._1251:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word ._1253\n\ +._1253:\n\ + .word ._1254\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1259\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1319\n\ + .word ._1346\n\ + .word ._1264\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1267\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1287\n\ + .word ._1288\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1346\n\ + .word ._1319\n\ +._1264:\n\ + mov r0, #0x58\n\ + mov r3, sl\n\ + mul r3, r3, r0\n\ + add r0, r3, #0\n\ + add r1, r2, #0\n\ + add r1, r1, #0x4c\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + ldr r1, ._1323\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1320 @cond_branch\n\ + b ._1346\n\ +._1320:\n\ + ldr r0, ._1323 + 4\n\ + ldr r1, ._1323 + 8\n\ + b ._1331\n\ +._1324:\n\ + .align 2, 0\n\ +._1323:\n\ + .word 0xf88\n\ + .word gBattleTextBuff1\n\ + .word gStatusConditionString_PoisonJpn\n\ +._1267:\n\ + mov r0, #0x58\n\ + mov r1, sl\n\ + mul r1, r1, r0\n\ + add r0, r1, #0\n\ + add r1, r2, #0\n\ + add r1, r1, #0x50\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x7\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1325 @cond_branch\n\ + b ._1346\n\ +._1325:\n\ + ldr r0, ._1328\n\ + ldr r1, ._1328 + 4\n\ + bl StringCopy\n\ + mov r2, #0x2\n\ + mov r9, r2\n\ + b ._1343\n\ +._1329:\n\ + .align 2, 0\n\ +._1328:\n\ + .word gBattleTextBuff1\n\ + .word gStatusConditionString_ConfusionJpn\n\ +._1254:\n\ + mov r0, #0x58\n\ + mov r3, sl\n\ + mul r3, r3, r0\n\ + add r0, r3, #0\n\ + add r1, r2, #0\n\ + add r1, r1, #0x4c\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1346 @cond_branch\n\ + ldr r0, ._1332\n\ + ldr r1, ._1332 + 4\n\ + b ._1331\n\ +._1333:\n\ + .align 2, 0\n\ +._1332:\n\ + .word gBattleTextBuff1\n\ + .word gStatusConditionString_ParalysisJpn\n\ +._1319:\n\ + mov r0, #0x58\n\ + mov r3, sl\n\ + mul r3, r3, r0\n\ + add r0, r2, #0\n\ + add r0, r0, #0x4c\n\ + add r0, r3, r0\n\ + ldr r0, [r0]\n\ + mov r1, #0x7\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1346 @cond_branch\n\ + add r2, r2, #0x50\n\ + add r2, r3, r2\n\ + ldr r0, [r2]\n\ + ldr r1, ._1336\n\ + and r0, r0, r1\n\ + str r0, [r2]\n\ + ldr r0, ._1336 + 4\n\ + ldr r1, ._1336 + 8\n\ + bl StringCopy\n\ + mov r0, #0x1\n\ + mov r9, r0\n\ + b ._1343\n\ +._1337:\n\ + .align 2, 0\n\ +._1336:\n\ + .word 0xf7ffffff\n\ + .word gBattleTextBuff1\n\ + .word gStatusConditionString_SleepJpn\n\ +._1288:\n\ + mov r0, #0x58\n\ + mov r1, sl\n\ + mul r1, r1, r0\n\ + add r0, r1, #0\n\ + add r1, r2, #0\n\ + add r1, r1, #0x4c\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1346 @cond_branch\n\ + ldr r0, ._1340\n\ + ldr r1, ._1340 + 4\n\ + bl StringCopy\n\ + mov r2, #0x1\n\ + mov r9, r2\n\ + b ._1343\n\ +._1341:\n\ + .align 2, 0\n\ +._1340:\n\ + .word gBattleTextBuff1\n\ + .word gStatusConditionString_BurnJpn\n\ +._1287:\n\ + mov r0, #0x58\n\ + mov r3, sl\n\ + mul r3, r3, r0\n\ + add r0, r3, #0\n\ + add r1, r2, #0\n\ + add r1, r1, #0x4c\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1346 @cond_branch\n\ + ldr r0, ._1344\n\ + ldr r1, ._1344 + 4\n\ +._1331:\n\ + bl StringCopy\n\ + mov r5, #0x1\n\ + mov r9, r5\n\ + b ._1343\n\ +._1345:\n\ + .align 2, 0\n\ +._1344:\n\ + .word gBattleTextBuff1\n\ + .word gStatusConditionString_IceJpn\n\ +._1259:\n\ + mov r0, #0x58\n\ + mov r1, sl\n\ + mul r1, r1, r0\n\ + add r0, r1, #0\n\ + add r1, r2, #0\n\ + add r1, r1, #0x50\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0xf0\n\ + lsl r1, r1, #0xc\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1346 @cond_branch\n\ + ldr r0, ._1352\n\ + ldr r1, ._1352 + 4\n\ + bl StringCopy\n\ + mov r2, #0x3\n\ + mov r9, r2\n\ +._1346:\n\ + mov r3, r9\n\ + cmp r3, #0\n\ + beq ._1347 @cond_branch\n\ +._1343:\n\ + mov r5, r9\n\ + cmp r5, #0x2\n\ + beq ._1348 @cond_branch\n\ + cmp r5, #0x2\n\ + bgt ._1349 @cond_branch\n\ + cmp r5, #0x1\n\ + beq ._1350 @cond_branch\n\ + b ._1355\n\ +._1353:\n\ + .align 2, 0\n\ +._1352:\n\ + .word gBattleTextBuff1\n\ + .word gStatusConditionString_LoveJpn\n\ +._1349:\n\ + mov r0, r9\n\ + cmp r0, #0x3\n\ + beq ._1354 @cond_branch\n\ + b ._1355\n\ +._1350:\n\ + ldr r1, ._1357\n\ + mov r0, #0x58\n\ + mov r2, sl\n\ + mul r2, r2, r0\n\ + add r1, r1, #0x4c\n\ + add r2, r2, r1\n\ + mov r0, #0x0\n\ + b ._1356\n\ +._1358:\n\ + .align 2, 0\n\ +._1357:\n\ + .word gBattleMons\n\ +._1348:\n\ + ldr r1, ._1360\n\ + mov r0, #0x58\n\ + mov r2, sl\n\ + mul r2, r2, r0\n\ + add r1, r1, #0x50\n\ + add r2, r2, r1\n\ + ldr r0, [r2]\n\ + mov r1, #0x8\n\ + neg r1, r1\n\ + b ._1359\n\ +._1361:\n\ + .align 2, 0\n\ +._1360:\n\ + .word gBattleMons\n\ +._1354:\n\ + ldr r1, ._1363\n\ + mov r0, #0x58\n\ + mov r2, sl\n\ + mul r2, r2, r0\n\ + add r1, r1, #0x50\n\ + add r2, r2, r1\n\ + ldr r0, [r2]\n\ + ldr r1, ._1363 + 4\n\ +._1359:\n\ + and r0, r0, r1\n\ +._1356:\n\ + str r0, [r2]\n\ +._1355:\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1363 + 8\n\ + ldr r0, ._1363 + 12\n\ + str r0, [r1]\n\ + ldr r0, ._1363 + 16\n\ + ldr r1, ._1363 + 20\n\ + add r0, r0, r1\n\ + mov r2, sl\n\ + strb r2, [r0]\n\ + ldr r4, ._1363 + 24\n\ + strb r2, [r4]\n\ + ldrb r1, [r4]\n\ + mov r0, #0x58\n\ + mul r0, r0, r1\n\ + ldr r1, ._1363 + 28\n\ + add r0, r0, r1\n\ + str r0, [sp]\n\ + mov r0, #0x0\n\ + mov r1, #0x28\n\ + mov r2, #0x0\n\ + mov r3, #0x4\n\ + bl EmitSetMonData\n\ + ldrb r0, [r4]\n\ + bl MarkBufferBankForExecution\n\ + bl ._1540\n\ +._1364:\n\ + .align 2, 0\n\ +._1363:\n\ + .word gBattleMons\n\ + .word 0xfff0ffff\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_AbilityCuredStatus\n\ + .word +0x2000000\n\ + .word 0x16003\n\ + .word gActiveBank\n\ + .word gUnknown_02024ACC\n\ +._1347:\n\ + mov r0, sl\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov sl, r0\n\ + ldr r0, ._1368\n\ + ldrb r0, [r0]\n\ + cmp sl, r0\n\ + bcs ._1365 @cond_branch\n\ + b ._1366\n\ +._1365:\n\ + bl ._1534\n\ +._1369:\n\ + .align 2, 0\n\ +._1368:\n\ + .word gNoOfAllBanks\n\ +._750:\n\ + mov r3, #0x0\n\ + mov sl, r3\n\ + ldr r0, ._1377\n\ + ldrb r0, [r0]\n\ + cmp sl, r0\n\ + bcc ._1370 @cond_branch\n\ + b ._1534\n\ +._1370:\n\ + ldr r4, ._1377 + 4\n\ +._1375:\n\ + mov r0, #0x58\n\ + mov r5, sl\n\ + mul r5, r5, r0\n\ + add r0, r5, #0\n\ + add r0, r0, r4\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x3b\n\ + bne ._1373 @cond_branch\n\ + mov r0, sl\n\ + bl CastformDataTypeChange\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ + cmp r0, #0\n\ + beq ._1373 @cond_branch\n\ + b ._1374\n\ +._1373:\n\ + mov r0, sl\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov sl, r0\n\ + ldr r0, ._1377\n\ + ldrb r0, [r0]\n\ + cmp sl, r0\n\ + bcc ._1375 @cond_branch\n\ + b ._1534\n\ +._1378:\n\ + .align 2, 0\n\ +._1377:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ +._751:\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + cmp r0, #0x1c\n\ + beq ._1379 @cond_branch\n\ + b ._1534\n\ +._1379:\n\ + ldr r4, ._1385\n\ + ldr r1, [r4]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x7\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1381 @cond_branch\n\ + b ._1534\n\ +._1381:\n\ + ldr r0, ._1385 + 4\n\ + and r1, r1, r0\n\ + str r1, [r4]\n\ + ldr r3, ._1385 + 8\n\ + add r2, r7, r3\n\ + ldrb r1, [r2]\n\ + mov r0, #0x3f\n\ + and r0, r0, r1\n\ + strb r0, [r2]\n\ + cmp r0, #0x6\n\ + bne ._1383 @cond_branch\n\ + mov r0, #0x2\n\ + strb r0, [r2]\n\ +._1383:\n\ + ldr r1, ._1385 + 12\n\ + ldrb r0, [r2]\n\ + add r0, r0, #0x40\n\ + strb r0, [r1, #0x3]\n\ + ldr r0, ._1385 + 16\n\ + ldrb r1, [r0]\n\ + ldr r5, ._1385 + 20\n\ + add r0, r7, r5\n\ + strb r1, [r0]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1385 + 24\n\ + ldr r0, ._1385 + 28\n\ + str r0, [r1]\n\ + ldr r0, [r4]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r4]\n\ + b ._1392\n\ +._1386:\n\ + .align 2, 0\n\ +._1385:\n\ + .word gHitMarker\n\ + .word 0xffffbfff\n\ + .word 0x160ca\n\ + .word gBattleCommunication\n\ + .word gBankTarget\n\ + .word 0x16003\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_SynchronizeActivates\n\ +._752:\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + cmp r0, #0x1c\n\ + beq ._1387 @cond_branch\n\ + b ._1534\n\ +._1387:\n\ + ldr r4, ._1393\n\ + ldr r1, [r4]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x7\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1389 @cond_branch\n\ + b ._1534\n\ +._1389:\n\ + ldr r0, ._1393 + 4\n\ + and r1, r1, r0\n\ + str r1, [r4]\n\ + ldr r3, ._1393 + 8\n\ + add r2, r7, r3\n\ + ldrb r1, [r2]\n\ + mov r0, #0x3f\n\ + and r0, r0, r1\n\ + strb r0, [r2]\n\ + cmp r0, #0x6\n\ + bne ._1391 @cond_branch\n\ + mov r0, #0x2\n\ + strb r0, [r2]\n\ +._1391:\n\ + ldr r1, ._1393 + 12\n\ + ldrb r0, [r2]\n\ + strb r0, [r1, #0x3]\n\ + ldr r0, ._1393 + 16\n\ + ldrb r1, [r0]\n\ + ldr r5, ._1393 + 20\n\ + add r0, r7, r5\n\ + strb r1, [r0]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1393 + 24\n\ + ldr r0, ._1393 + 28\n\ + str r0, [r1]\n\ + ldr r0, [r4]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x6\n\ + orr r0, r0, r1\n\ + str r0, [r4]\n\ + b ._1392\n\ +._1394:\n\ + .align 2, 0\n\ +._1393:\n\ + .word gHitMarker\n\ + .word 0xffffbfff\n\ + .word 0x160ca\n\ + .word gBattleCommunication\n\ + .word gBankAttacker\n\ + .word 0x16003\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_SynchronizeActivates\n\ +._753:\n\ + mov r4, #0x0\n\ + ldr r0, ._1402\n\ + ldrb r1, [r0]\n\ + cmp r4, r1\n\ + blt ._1395 @cond_branch\n\ + b ._1534\n\ +._1395:\n\ + ldr r0, ._1402 + 4\n\ + add r5, r1, #0\n\ + ldr r2, ._1402 + 8\n\ + add r3, r0, #0\n\ + add r3, r3, #0x20\n\ + mov r6, #0x80\n\ + lsl r6, r6, #0xc\n\ +._1400:\n\ + ldrb r1, [r3]\n\ + cmp r1, #0x16\n\ + bne ._1398 @cond_branch\n\ + ldr r0, [r2]\n\ + and r0, r0, r6\n\ + cmp r0, #0\n\ + beq ._1398 @cond_branch\n\ + b ._1399\n\ +._1398:\n\ + add r2, r2, #0x4\n\ + add r3, r3, #0x58\n\ + add r4, r4, #0x1\n\ + cmp r4, r5\n\ + blt ._1400 @cond_branch\n\ + b ._1534\n\ +._1403:\n\ + .align 2, 0\n\ +._1402:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word gStatuses3\n\ +._755:\n\ + mov r4, #0x0\n\ + ldr r0, ._1417\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1404 @cond_branch\n\ + b ._1534\n\ +._1404:\n\ + ldr r0, ._1417 + 4\n\ + mov r8, r0\n\ + ldr r1, ._1417 + 8\n\ + add r1, r1, #0x20\n\ + str r1, [sp, #0x1c]\n\ + mov r2, #0x0\n\ + str r2, [sp, #0x20]\n\ +._1434:\n\ + ldr r3, [sp, #0x1c]\n\ + ldrb r0, [r3]\n\ + cmp r0, #0x24\n\ + beq ._1406 @cond_branch\n\ + b ._1431\n\ +._1406:\n\ + ldr r0, ._1417 + 12\n\ + ldr r5, [sp, #0x20]\n\ + add r0, r5, r0\n\ + ldr r1, [r0]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0xd\n\ + and r1, r1, r0\n\ + str r5, [sp, #0x18]\n\ + cmp r1, #0\n\ + bne ._1408 @cond_branch\n\ + b ._1431\n\ +._1408:\n\ + lsl r0, r4, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl GetBankIdentity\n\ + mov r1, #0x1\n\ + add r5, r0, #0\n\ + eor r5, r5, r1\n\ + and r5, r5, r1\n\ + add r0, r5, #0\n\ + bl GetBankByIdentity\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + add r0, r5, #2\n\ + bl GetBankByIdentity\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + ldr r0, ._1417 + 16\n\ + ldrh r1, [r0]\n\ + mov r2, #0x1\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1410 @cond_branch\n\ + b ._1411\n\ +._1410:\n\ + mov r1, #0x58\n\ + add r0, r6, #0\n\ + mul r0, r0, r1\n\ + ldr r3, ._1417 + 8\n\ + add r1, r0, r3\n\ + add r0, r1, #0\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._1420 @cond_branch\n\ + ldrh r0, [r1, #0x28]\n\ + cmp r0, #0\n\ + beq ._1415 @cond_branch\n\ + mov r1, #0x58\n\ + add r0, r7, #0\n\ + mul r0, r0, r1\n\ + add r1, r0, r3\n\ + add r0, r1, #0\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._1415 @cond_branch\n\ + ldrh r0, [r1, #0x28]\n\ + cmp r0, #0\n\ + beq ._1415 @cond_branch\n\ + str r2, [sp, #0x24]\n\ + bl Random\n\ + ldr r2, [sp, #0x24]\n\ + add r1, r2, #0\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x1\n\ + orr r5, r5, r1\n\ + add r0, r5, #0\n\ + bl GetBankByIdentity\n\ + mov r2, r8\n\ + strb r0, [r2]\n\ + ldrb r0, [r2]\n\ + mov r3, #0x58\n\ + mul r0, r0, r3\n\ + ldr r5, ._1417 + 8\n\ + add r0, r0, r5\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + ldr r1, [sp, #0x1c]\n\ + strb r0, [r1]\n\ + ldrb r0, [r2]\n\ + mul r0, r0, r3\n\ + add r0, r0, r5\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + ldr r2, ._1417 + 20\n\ + strb r0, [r2]\n\ + b ._1416\n\ +._1418:\n\ + .align 2, 0\n\ +._1417:\n\ + .word gNoOfAllBanks\n\ + .word gActiveBank\n\ + .word gBattleMons\n\ + .word gStatuses3\n\ + .word gBattleTypeFlags\n\ + .word gLastUsedAbility\n\ +._1415:\n\ + ldr r3, ._1422\n\ + mov r2, #0x58\n\ + add r0, r6, #0\n\ + mul r0, r0, r2\n\ + add r1, r0, r3\n\ + add r0, r1, #0\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._1420 @cond_branch\n\ + ldrh r0, [r1, #0x28]\n\ + cmp r0, #0\n\ + beq ._1420 @cond_branch\n\ + mov r5, r8\n\ + strb r6, [r5]\n\ + add r1, r4, #0\n\ + mul r1, r1, r2\n\ + add r1, r1, r3\n\ + ldrb r0, [r5]\n\ + mul r0, r0, r2\n\ + add r0, r0, r3\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + add r1, r1, #0x20\n\ + strb r0, [r1]\n\ + ldrb r0, [r5]\n\ + mul r0, r0, r2\n\ + add r0, r0, r3\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + b ._1426\n\ +._1423:\n\ + .align 2, 0\n\ +._1422:\n\ + .word gBattleMons\n\ +._1420:\n\ + ldr r3, ._1427\n\ + mov r2, #0x58\n\ + add r0, r7, #0\n\ + mul r0, r0, r2\n\ + add r1, r0, r3\n\ + add r0, r1, #0\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._1430 @cond_branch\n\ + ldrh r0, [r1, #0x28]\n\ + cmp r0, #0\n\ + beq ._1430 @cond_branch\n\ + mov r5, r8\n\ + strb r7, [r5]\n\ + add r1, r4, #0\n\ + mul r1, r1, r2\n\ + add r1, r1, r3\n\ + ldrb r0, [r5]\n\ + mul r0, r0, r2\n\ + add r0, r0, r3\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + add r1, r1, #0x20\n\ + strb r0, [r1]\n\ + ldrb r0, [r5]\n\ + mul r0, r0, r2\n\ + add r0, r0, r3\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + b ._1426\n\ +._1428:\n\ + .align 2, 0\n\ +._1427:\n\ + .word gBattleMons\n\ +._1411:\n\ + mov r2, r8\n\ + strb r6, [r2]\n\ + mov r3, #0x58\n\ + add r0, r6, #0\n\ + mul r0, r0, r3\n\ + ldr r5, ._1436\n\ + add r0, r0, r5\n\ + add r2, r0, #0\n\ + add r2, r2, #0x20\n\ + ldrb r1, [r2]\n\ + cmp r1, #0\n\ + beq ._1430 @cond_branch\n\ + ldrh r0, [r0, #0x28]\n\ + cmp r0, #0\n\ + beq ._1430 @cond_branch\n\ + ldr r0, [sp, #0x1c]\n\ + strb r1, [r0]\n\ + ldrb r0, [r2]\n\ +._1426:\n\ + ldr r1, ._1436 + 4\n\ + strb r0, [r1]\n\ +._1416:\n\ + mov r0, r9\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1430:\n\ + mov r2, r9\n\ + cmp r2, #0\n\ + beq ._1431 @cond_branch\n\ + b ._1432\n\ +._1431:\n\ + ldr r3, [sp, #0x1c]\n\ + add r3, r3, #0x58\n\ + str r3, [sp, #0x1c]\n\ + ldr r5, [sp, #0x20]\n\ + add r5, r5, #0x4\n\ + str r5, [sp, #0x20]\n\ + add r4, r4, #0x1\n\ + ldr r0, ._1436 + 8\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + bge ._1433 @cond_branch\n\ + b ._1434\n\ +._1433:\n\ + b ._1534\n\ +._1437:\n\ + .align 2, 0\n\ +._1436:\n\ + .word gBattleMons\n\ + .word gLastUsedAbility\n\ + .word gNoOfAllBanks\n\ +._754:\n\ + mov r4, #0x0\n\ + ldr r0, ._1445\n\ + ldrb r1, [r0]\n\ + cmp r4, r1\n\ + blt ._1438 @cond_branch\n\ + b ._1534\n\ +._1438:\n\ + ldr r0, ._1445 + 4\n\ + add r5, r1, #0\n\ + ldr r2, ._1445 + 8\n\ + add r3, r0, #0\n\ + add r3, r3, #0x20\n\ + mov r6, #0x80\n\ + lsl r6, r6, #0xc\n\ +._1443:\n\ + ldrb r1, [r3]\n\ + cmp r1, #0x16\n\ + bne ._1441 @cond_branch\n\ + ldr r0, [r2]\n\ + and r0, r0, r6\n\ + cmp r0, #0\n\ + beq ._1441 @cond_branch\n\ + b ._1442\n\ +._1441:\n\ + add r2, r2, #0x4\n\ + add r3, r3, #0x58\n\ + add r4, r4, #0x1\n\ + cmp r4, r5\n\ + blt ._1443 @cond_branch\n\ + b ._1534\n\ +._1446:\n\ + .align 2, 0\n\ +._1445:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word gStatuses3\n\ +._756:\n\ + mov r0, sl\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + mov r4, #0x0\n\ + ldr r0, ._1453\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1447 @cond_branch\n\ + b ._1534\n\ +._1447:\n\ + ldr r7, ._1453 + 4\n\ +._1451:\n\ + lsl r0, r4, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + add r3, r4, #1\n\ + cmp r0, r5\n\ + beq ._1450 @cond_branch\n\ + mov r0, #0x58\n\ + mul r0, r0, r4\n\ + add r0, r0, r7\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, r6\n\ + bne ._1450 @cond_branch\n\ + ldr r0, ._1453 + 8\n\ + strb r6, [r0]\n\ + lsl r0, r3, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1450:\n\ + add r4, r3, #0\n\ + ldr r0, ._1453\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1451 @cond_branch\n\ + b ._1534\n\ +._1454:\n\ + .align 2, 0\n\ +._1453:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word gLastUsedAbility\n\ +._757:\n\ + mov r0, sl\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + mov r4, #0x0\n\ + ldr r0, ._1461\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1455 @cond_branch\n\ + b ._1534\n\ +._1455:\n\ + ldr r7, ._1461 + 4\n\ +._1459:\n\ + lsl r0, r4, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + add r3, r4, #1\n\ + cmp r0, r5\n\ + bne ._1458 @cond_branch\n\ + mov r0, #0x58\n\ + mul r0, r0, r4\n\ + add r0, r0, r7\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, r6\n\ + bne ._1458 @cond_branch\n\ + ldr r0, ._1461 + 8\n\ + strb r6, [r0]\n\ + lsl r0, r3, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1458:\n\ + add r4, r3, #0\n\ + ldr r0, ._1461\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1459 @cond_branch\n\ + b ._1534\n\ +._1462:\n\ + .align 2, 0\n\ +._1461:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word gLastUsedAbility\n\ +._758:\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + cmp r0, #0xfd\n\ + beq ._1463 @cond_branch\n\ + cmp r0, #0xfe\n\ + beq ._1464 @cond_branch\n\ + mov r4, #0x0\n\ + ldr r0, ._1468\n\ + add r5, r0, #0\n\ + ldrb r2, [r5]\n\ + cmp r4, r2\n\ + blt ._1465 @cond_branch\n\ + b ._1534\n\ +._1465:\n\ + ldr r2, ._1468 + 4\n\ + b ._1485\n\ +._1469:\n\ + .align 2, 0\n\ +._1468:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ +._1463:\n\ + mov r4, #0x0\n\ + ldr r0, ._1475\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1470 @cond_branch\n\ + b ._1534\n\ +._1470:\n\ + ldr r5, ._1475 + 4\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x9\n\ + add r1, r0, #0\n\ +._1473:\n\ + lsl r0, r4, #0x2\n\ + add r0, r0, r5\n\ + ldr r0, [r0]\n\ + and r0, r0, r2\n\ + add r3, r4, #1\n\ + cmp r0, #0\n\ + beq ._1472 @cond_branch\n\ + lsl r0, r3, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1472:\n\ + add r4, r3, #0\n\ + cmp r4, r1\n\ + blt ._1473 @cond_branch\n\ + b ._1534\n\ +._1476:\n\ + .align 2, 0\n\ +._1475:\n\ + .word gNoOfAllBanks\n\ + .word gStatuses3\n\ +._1464:\n\ + mov r4, #0x0\n\ + ldr r0, ._1482\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1477 @cond_branch\n\ + b ._1534\n\ +._1477:\n\ + ldr r5, ._1482 + 4\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0xa\n\ + add r1, r0, #0\n\ +._1480:\n\ + lsl r0, r4, #0x2\n\ + add r0, r0, r5\n\ + ldr r0, [r0]\n\ + and r0, r0, r2\n\ + add r3, r4, #1\n\ + cmp r0, #0\n\ + beq ._1479 @cond_branch\n\ + lsl r0, r3, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1479:\n\ + add r4, r3, #0\n\ + cmp r4, r1\n\ + blt ._1480 @cond_branch\n\ + b ._1534\n\ +._1483:\n\ + .align 2, 0\n\ +._1482:\n\ + .word gNoOfAllBanks\n\ + .word gStatuses3\n\ +._1485:\n\ + mov r0, #0x58\n\ + mul r0, r0, r4\n\ + add r0, r0, r2\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + add r3, r4, #1\n\ + cmp r0, r6\n\ + bne ._1484 @cond_branch\n\ + mov r0, r8\n\ + strb r6, [r0]\n\ + lsl r0, r3, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1484:\n\ + add r4, r3, #0\n\ + ldrb r1, [r5]\n\ + cmp r4, r1\n\ + blt ._1485 @cond_branch\n\ + b ._1534\n\ +._763:\n\ + mov r4, #0x0\n\ + ldr r0, ._1493\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1487 @cond_branch\n\ + b ._1534\n\ +._1487:\n\ + ldr r7, ._1493 + 4\n\ + add r2, r0, #0\n\ + mov r5, #0x58\n\ +._1491:\n\ + add r0, r4, #0\n\ + mul r0, r0, r5\n\ + add r1, r0, r7\n\ + add r0, r1, #0\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + add r3, r4, #1\n\ + cmp r0, r6\n\ + bne ._1490 @cond_branch\n\ + ldrh r0, [r1, #0x28]\n\ + cmp r0, #0\n\ + beq ._1490 @cond_branch\n\ + mov r0, r8\n\ + strb r6, [r0]\n\ + lsl r0, r3, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1490:\n\ + add r4, r3, #0\n\ + cmp r4, r2\n\ + blt ._1491 @cond_branch\n\ + b ._1534\n\ +._1494:\n\ + .align 2, 0\n\ +._1493:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ +._759:\n\ + mov r4, #0x0\n\ + ldr r0, ._1501\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1495 @cond_branch\n\ + b ._1534\n\ +._1495:\n\ + ldr r7, ._1501 + 4\n\ + add r1, r0, #0\n\ + mov r5, #0x58\n\ + ldr r2, ._1501 + 8\n\ +._1499:\n\ + add r0, r4, #0\n\ + mul r0, r0, r5\n\ + add r0, r0, r7\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + add r3, r4, #1\n\ + cmp r0, r6\n\ + bne ._1498 @cond_branch\n\ + cmp r4, sl\n\ + beq ._1498 @cond_branch\n\ + strb r6, [r2]\n\ + lsl r0, r3, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1498:\n\ + add r4, r3, #0\n\ + cmp r4, r1\n\ + blt ._1499 @cond_branch\n\ + b ._1534\n\ +._1502:\n\ + .align 2, 0\n\ +._1501:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word gLastUsedAbility\n\ +._760:\n\ + mov r0, sl\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + mov r4, #0x0\n\ + ldr r0, ._1509\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1503 @cond_branch\n\ + b ._1534\n\ +._1503:\n\ + ldr r7, ._1509 + 4\n\ +._1507:\n\ + lsl r0, r4, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, r5\n\ + beq ._1506 @cond_branch\n\ + mov r0, #0x58\n\ + mul r0, r0, r4\n\ + add r0, r0, r7\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, r6\n\ + bne ._1506 @cond_branch\n\ + ldr r0, ._1509 + 8\n\ + strb r6, [r0]\n\ + mov r0, r9\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1506:\n\ + add r4, r4, #0x1\n\ + ldr r0, ._1509\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1507 @cond_branch\n\ + b ._1534\n\ +._1510:\n\ + .align 2, 0\n\ +._1509:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word gLastUsedAbility\n\ +._761:\n\ + mov r0, sl\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + mov r4, #0x0\n\ + ldr r0, ._1517\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1511 @cond_branch\n\ + b ._1534\n\ +._1511:\n\ + ldr r7, ._1517 + 4\n\ +._1515:\n\ + lsl r0, r4, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, r5\n\ + bne ._1514 @cond_branch\n\ + mov r0, #0x58\n\ + mul r0, r0, r4\n\ + add r0, r0, r7\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, r6\n\ + bne ._1514 @cond_branch\n\ + ldr r0, ._1517 + 8\n\ + strb r6, [r0]\n\ + mov r0, r9\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1514:\n\ + add r4, r4, #0x1\n\ + ldr r0, ._1517\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._1515 @cond_branch\n\ + b ._1534\n\ +._1518:\n\ + .align 2, 0\n\ +._1517:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word gLastUsedAbility\n\ +._853:\n\ + ldr r0, ._1520\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r0, ._1520 + 4\n\ + ldr r2, ._1520 + 8\n\ + add r1, r0, r2\n\ + strb r6, [r1]\n\ + mov r1, r9\n\ + sub r1, r1, #0x1\n\ + ldr r3, ._1520 + 12\n\ + add r0, r0, r3\n\ + strb r1, [r0]\n\ + b ._1534\n\ +._1521:\n\ + .align 2, 0\n\ +._1520:\n\ + .word BattleScript_CastformChange\n\ + .word +0x2000000\n\ + .word 0x16003\n\ + .word 0x1609b\n\ +._1374:\n\ + ldr r0, ._1523\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r0, ._1523 + 4\n\ + ldr r5, ._1523 + 8\n\ + add r1, r0, r5\n\ + mov r2, sl\n\ + strb r2, [r1]\n\ + mov r1, r9\n\ + sub r1, r1, #0x1\n\ + ldr r3, ._1523 + 12\n\ + add r0, r0, r3\n\ + strb r1, [r0]\n\ + b ._1540\n\ +._1524:\n\ + .align 2, 0\n\ +._1523:\n\ + .word BattleScript_CastformChange\n\ + .word +0x2000000\n\ + .word 0x16003\n\ + .word 0x1609b\n\ +._1399:\n\ + mov r5, r8\n\ + strb r1, [r5]\n\ + ldr r0, [r2]\n\ + ldr r1, ._1526\n\ + and r0, r0, r1\n\ + str r0, [r2]\n\ + ldr r0, ._1526 + 4\n\ + bl BattleScriptPushCursorAndCallback\n\ + b ._1525\n\ +._1527:\n\ + .align 2, 0\n\ +._1526:\n\ + .word 0xfff7ffff\n\ + .word gUnknown_081D978C\n\ +._1432:\n\ + ldr r0, ._1529\n\ + bl BattleScriptPushCursorAndCallback\n\ + ldr r1, ._1529 + 4\n\ + ldr r2, [sp, #0x18]\n\ + add r1, r2, r1\n\ + ldr r0, [r1]\n\ + ldr r2, ._1529 + 8\n\ + and r0, r0, r2\n\ + str r0, [r1]\n\ + ldr r0, ._1529 + 12\n\ + ldr r3, ._1529 + 16\n\ + add r0, r0, r3\n\ + strb r4, [r0]\n\ + ldr r1, ._1529 + 20\n\ + mov r4, #0xfd\n\ + strb r4, [r1]\n\ + mov r0, #0x4\n\ + strb r0, [r1, #0x1]\n\ + ldr r2, ._1529 + 24\n\ + ldrb r0, [r2]\n\ + strb r0, [r1, #0x2]\n\ + ldr r3, ._1529 + 28\n\ + ldrb r0, [r2]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r3\n\ + ldrh r0, [r0]\n\ + strb r0, [r1, #0x3]\n\ + mov r0, #0xff\n\ + strb r0, [r1, #0x4]\n\ + ldr r1, ._1529 + 32\n\ + strb r4, [r1]\n\ + mov r0, #0x9\n\ + strb r0, [r1, #0x1]\n\ + ldr r0, ._1529 + 36\n\ + ldrb r0, [r0]\n\ + strb r0, [r1, #0x2]\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + strb r0, [r1, #0x3]\n\ + b ._1534\n\ +._1530:\n\ + .align 2, 0\n\ +._1529:\n\ + .word BattleScript_TraceActivates\n\ + .word gStatuses3\n\ + .word 0xffefffff\n\ + .word +0x2000000\n\ + .word 0x16003\n\ + .word gBattleTextBuff1\n\ + .word gActiveBank\n\ + .word gBattlePartyID\n\ + .word gBattleTextBuff2\n\ + .word gLastUsedAbility\n\ +._1442:\n\ + mov r5, r8\n\ + strb r1, [r5]\n\ + ldr r0, [r2]\n\ + ldr r1, ._1532\n\ + and r0, r0, r1\n\ + str r0, [r2]\n\ + bl BattleScriptPushCursor\n\ + ldr r1, ._1532 + 4\n\ + ldr r0, ._1532 + 8\n\ + str r0, [r1]\n\ +._1525:\n\ + ldr r0, ._1532 + 12\n\ + ldr r1, ._1532 + 16\n\ + add r0, r0, r1\n\ + strb r4, [r0]\n\ +._1392:\n\ + mov r0, r9\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ + b ._1534\n\ +._1533:\n\ + .align 2, 0\n\ +._1532:\n\ + .word 0xfff7ffff\n\ + .word gBattlescriptCurrInstr\n\ + .word gUnknown_081D9795\n\ + .word +0x2000000\n\ + .word 0x160dd\n\ +._762:\n\ + mov r4, #0x0\n\ + ldr r0, ._1541\n\ + ldrb r1, [r0]\n\ + cmp r4, r1\n\ + bge ._1534 @cond_branch\n\ + ldr r0, ._1541 + 4\n\ + add r2, r1, #0\n\ + add r1, r0, #0\n\ + add r1, r1, #0x20\n\ + ldr r3, ._1541 + 8\n\ +._1537:\n\ + ldrb r0, [r1]\n\ + cmp r0, r6\n\ + bne ._1536 @cond_branch\n\ + cmp r4, sl\n\ + beq ._1536 @cond_branch\n\ + strb r6, [r3]\n\ + mov r0, r9\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r9, r0\n\ +._1536:\n\ + add r1, r1, #0x58\n\ + add r4, r4, #0x1\n\ + cmp r4, r2\n\ + blt ._1537 @cond_branch\n\ +._1534:\n\ + mov r2, r9\n\ + cmp r2, #0\n\ + beq ._1540 @cond_branch\n\ +._916:\n\ + ldr r3, [sp, #0x4]\n\ + cmp r3, #0xb\n\ + bhi ._1540 @cond_branch\n\ + ldr r1, ._1541 + 8\n\ + ldrb r0, [r1]\n\ + cmp r0, #0xff\n\ + beq ._1540 @cond_branch\n\ + add r1, r0, #0\n\ + mov r0, sl\n\ + bl RecordAbilityBattle\n\ +._1540:\n\ + mov r0, r9\n\ + add sp, sp, #0x28\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r1}\n\ + bx r1\n\ +._1542:\n\ + .align 2, 0\n\ +._1541:\n\ + .word gNoOfAllBanks\n\ + .word gBattleMons\n\ + .word gLastUsedAbility"); +} +#else u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) { u8 effect = 0; @@ -2498,6 +6558,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) return effect; } +#endif void BattleScriptExecute(const u8* BS_ptr) { @@ -3377,6 +7438,417 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target return targetBank; } +#if DEBUG +__attribute__((naked)) +u8 IsMonDisobedient(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6, r7}\n\ + add sp, sp, #0xfffffff0\n\ + ldr r0, ._1785\n\ + ldrh r1, [r0]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1791 @cond_branch\n\ + ldr r4, ._1785 + 4\n\ + ldrb r0, [r4]\n\ + bl GetBankSide\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + beq ._1791 @cond_branch\n\ + ldr r2, ._1785 + 8\n\ + ldrb r1, [r4]\n\ + mov r0, #0x58\n\ + mul r1, r1, r0\n\ + add r0, r2, #0\n\ + add r0, r0, #0x54\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + add r2, r2, #0x3c\n\ + add r1, r1, r2\n\ + bl IsOtherTrainer\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1791 @cond_branch\n\ + ldr r0, ._1785 + 12\n\ + ldrb r1, [r0]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1783 @cond_branch\n\ + mov r0, #0xa\n\ + b ._1784\n\ +._1786:\n\ + .align 2, 0\n\ +._1785:\n\ + .word gBattleTypeFlags\n\ + .word gBankAttacker\n\ + .word gBattleMons\n\ + .word gUnknown_02023A14+0x50\n\ +._1783:\n\ + ldr r0, ._1794\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1791 @cond_branch\n\ + mov r1, #0xa\n\ + mov r8, r1\n\ + ldr r0, ._1794 + 4\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1788 @cond_branch\n\ + mov r2, #0x1e\n\ + mov r8, r2\n\ +._1788:\n\ + ldr r0, ._1794 + 8\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1789 @cond_branch\n\ + mov r4, #0x32\n\ + mov r8, r4\n\ +._1789:\n\ + ldr r0, ._1794 + 12\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1790 @cond_branch\n\ + mov r0, #0x46\n\ +._1784:\n\ + mov r8, r0\n\ +._1790:\n\ + ldr r5, ._1794 + 16\n\ + ldr r7, ._1794 + 20\n\ + ldrb r0, [r7]\n\ + mov r6, #0x58\n\ + mul r0, r0, r6\n\ + add r0, r0, r5\n\ + add r0, r0, #0x2a\n\ + ldrb r0, [r0]\n\ + cmp r0, r8\n\ + bls ._1791 @cond_branch\n\ + bl Random\n\ + mov r1, #0xff\n\ + and r1, r1, r0\n\ + ldrb r0, [r7]\n\ + add r2, r0, #0\n\ + mul r2, r2, r6\n\ + add r0, r2, r5\n\ + add r0, r0, #0x2a\n\ + ldrb r0, [r0]\n\ + add r0, r0, r8\n\ + mul r0, r0, r1\n\ + asr r4, r0, #0x8\n\ + cmp r4, r8\n\ + bge ._1792 @cond_branch\n\ +._1791:\n\ + mov r0, #0x0\n\ + b ._1823\n\ +._1795:\n\ + .align 2, 0\n\ +._1794:\n\ + .word 0x80e\n\ + .word 0x808\n\ + .word 0x80a\n\ + .word 0x80c\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ +._1792:\n\ + ldr r3, ._1801\n\ + ldrh r0, [r3]\n\ + cmp r0, #0x63\n\ + bne ._1796 @cond_branch\n\ + add r0, r5, #0\n\ + add r0, r0, #0x50\n\ + add r0, r2, r0\n\ + ldr r1, [r0]\n\ + ldr r2, ._1801 + 4\n\ + and r1, r1, r2\n\ + str r1, [r0]\n\ +._1796:\n\ + ldrb r0, [r7]\n\ + mul r0, r0, r6\n\ + add r1, r5, #0\n\ + add r1, r1, #0x4c\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x7\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1799 @cond_branch\n\ + ldrh r0, [r3]\n\ + cmp r0, #0xad\n\ + beq ._1798 @cond_branch\n\ + cmp r0, #0xd6\n\ + bne ._1799 @cond_branch\n\ +._1798:\n\ + ldr r1, ._1801 + 8\n\ + ldr r0, ._1801 + 12\n\ + b ._1819\n\ +._1802:\n\ + .align 2, 0\n\ +._1801:\n\ + .word gCurrentMove\n\ + .word 0xff7fffff\n\ + .word gBattlescriptCurrInstr\n\ + .word gUnknown_081D995F\n\ +._1799:\n\ + bl Random\n\ + mov r5, #0xff\n\ + add r1, r5, #0\n\ + and r1, r1, r0\n\ + ldr r6, ._1808\n\ + ldr r2, ._1808 + 4\n\ + mov r9, r2\n\ + ldrb r3, [r2]\n\ + mov r7, #0x58\n\ + add r0, r3, #0\n\ + mul r0, r0, r7\n\ + add r0, r0, r6\n\ + add r0, r0, #0x2a\n\ + ldrb r2, [r0]\n\ + mov r4, r8\n\ + add r0, r2, r4\n\ + mul r0, r0, r1\n\ + asr r4, r0, #0x8\n\ + cmp r4, r8\n\ + bge ._1803 @cond_branch\n\ + ldr r7, ._1808 + 8\n\ + ldr r5, ._1808 + 12\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r7\n\ + ldrb r1, [r0]\n\ + add r0, r3, #0\n\ + mov r2, #0xff\n\ + bl CheckMoveLimitations\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0xf\n\ + bne ._1804 @cond_branch\n\ + b ._1805\n\ +._1804:\n\ + add r6, r5, #0\n\ + ldr r0, ._1808 + 16\n\ + mov r9, r0\n\ + mov r1, #0x3\n\ + mov r8, r1\n\ +._1806:\n\ + bl Random\n\ + mov r2, r8\n\ + and r0, r0, r2\n\ + mov r1, r9\n\ + strb r0, [r1]\n\ + strb r0, [r6]\n\ + ldrb r0, [r6]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r7\n\ + ldr r5, [r0]\n\ + and r5, r5, r4\n\ + cmp r5, #0\n\ + bne ._1806 @cond_branch\n\ + ldr r4, ._1808 + 20\n\ + ldr r3, ._1808\n\ + ldr r0, ._1808 + 12\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x1\n\ + ldr r1, ._1808 + 4\n\ + ldrb r2, [r1]\n\ + mov r1, #0x58\n\ + mul r1, r1, r2\n\ + add r0, r0, r1\n\ + add r3, r3, #0xc\n\ + add r0, r0, r3\n\ + ldrh r0, [r0]\n\ + strh r0, [r4]\n\ + ldr r0, ._1808 + 24\n\ + strb r5, [r0, #0x3]\n\ + ldr r0, ._1808 + 28\n\ + mov r1, #0x0\n\ + strh r5, [r0]\n\ + ldr r0, ._1808 + 32\n\ + ldr r2, ._1808 + 36\n\ + add r0, r0, r2\n\ + strb r1, [r0]\n\ + ldr r1, ._1808 + 40\n\ + ldr r0, ._1808 + 44\n\ + str r0, [r1]\n\ + ldrh r0, [r4]\n\ + mov r1, #0x0\n\ + bl GetMoveTarget\n\ + ldr r1, ._1808 + 48\n\ + strb r0, [r1]\n\ + ldr r2, ._1808 + 52\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0xe\n\ + b ._1807\n\ +._1809:\n\ + .align 2, 0\n\ +._1808:\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gBitTable\n\ + .word gCurrMovePos\n\ + .word gUnknown_02024BE5\n\ + .word gRandomMove\n\ + .word gBattleCommunication\n\ + .word gDynamicBasePower\n\ + .word +0x2000000\n\ + .word 0x1601c\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_IgnoresAndUsesRandomMove\n\ + .word gBankTarget\n\ + .word gHitMarker\n\ +._1803:\n\ + mov r4, r8\n\ + sub r0, r2, r4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + mov r8, r0\n\ + bl Random\n\ + add r4, r5, #0\n\ + and r4, r4, r0\n\ + cmp r4, r8\n\ + bge ._1818 @cond_branch\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + add r1, r0, #0\n\ + mul r1, r1, r7\n\ + add r0, r6, #0\n\ + add r0, r0, #0x4c\n\ + add r0, r1, r0\n\ + ldr r0, [r0]\n\ + and r0, r0, r5\n\ + cmp r0, #0\n\ + bne ._1818 @cond_branch\n\ + add r0, r1, r6\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x48\n\ + beq ._1818 @cond_branch\n\ + cmp r0, #0xf\n\ + beq ._1818 @cond_branch\n\ + mov r2, #0x0\n\ + ldr r0, ._1820\n\ + ldrb r3, [r0]\n\ + add r7, r0, #0\n\ + cmp r2, r3\n\ + bge ._1816 @cond_branch\n\ + ldr r0, [r6, #0x50]\n\ + mov r1, #0x70\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1816 @cond_branch\n\ + add r1, r6, #0\n\ + add r1, r1, #0x50\n\ + mov r5, #0x70\n\ +._1817:\n\ + add r1, r1, #0x58\n\ + add r2, r2, #0x1\n\ + cmp r2, r3\n\ + bge ._1816 @cond_branch\n\ + ldr r0, [r1]\n\ + and r0, r0, r5\n\ + cmp r0, #0\n\ + beq ._1817 @cond_branch\n\ +._1816:\n\ + ldrb r7, [r7]\n\ + cmp r2, r7\n\ + bne ._1818 @cond_branch\n\ + ldr r1, ._1820 + 4\n\ + ldr r0, ._1820 + 8\n\ + b ._1819\n\ +._1821:\n\ + .align 2, 0\n\ +._1820:\n\ + .word gNoOfAllBanks\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_IgnoresAndFallsAsleep\n\ +._1818:\n\ + mov r2, r8\n\ + sub r4, r4, r2\n\ + cmp r4, r8\n\ + blt ._1822 @cond_branch\n\ +._1805:\n\ + bl Random\n\ + ldr r2, ._1824\n\ + mov r1, #0x3\n\ + and r1, r1, r0\n\ + strb r1, [r2, #0x5]\n\ + ldr r1, ._1824 + 4\n\ + ldr r0, ._1824 + 8\n\ +._1819:\n\ + str r0, [r1]\n\ + mov r0, #0x1\n\ + b ._1823\n\ +._1825:\n\ + .align 2, 0\n\ +._1824:\n\ + .word gBattleCommunication\n\ + .word gBattlescriptCurrInstr\n\ + .word BattleScript_MoveUsedLoafingAround\n\ +._1822:\n\ + ldr r4, ._1826\n\ + ldrb r1, [r4]\n\ + mov r0, #0x58\n\ + mul r1, r1, r0\n\ + ldr r0, ._1826 + 4\n\ + add r1, r1, r0\n\ + mov r0, #0x28\n\ + str r0, [sp]\n\ + mov r0, #0x0\n\ + str r0, [sp, #0x4]\n\ + ldrb r0, [r4]\n\ + str r0, [sp, #0x8]\n\ + ldrb r0, [r4]\n\ + str r0, [sp, #0xc]\n\ + add r0, r1, #0\n\ + mov r2, #0x1\n\ + mov r3, #0x0\n\ + bl CalculateBaseDamage\n\ + ldr r1, ._1826 + 8\n\ + str r0, [r1]\n\ + ldr r1, ._1826 + 12\n\ + ldrb r0, [r4]\n\ + strb r0, [r1]\n\ + ldr r1, ._1826 + 16\n\ + ldr r0, ._1826 + 20\n\ + str r0, [r1]\n\ + ldr r2, ._1826 + 24\n\ + ldr r0, [r2]\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0xc\n\ +._1807:\n\ + orr r0, r0, r1\n\ + str r0, [r2]\n\ + mov r0, #0x2\n\ +._1823:\n\ + add sp, sp, #0x10\n\ + pop {r3, r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4, r5, r6, r7}\n\ + pop {r1}\n\ + bx r1\n\ +._1827:\n\ + .align 2, 0\n\ +._1826:\n\ + .word gBankAttacker\n\ + .word gBattleMons\n\ + .word gBattleMoveDamage\n\ + .word gBankTarget\n\ + .word gBattlescriptCurrInstr\n\ + .word gUnknown_081D99A0\n\ + .word gHitMarker"); +} +#else u8 IsMonDisobedient(void) { u8 obedienceLevel; @@ -3477,3 +7949,4 @@ u8 IsMonDisobedient(void) } } } +#endif diff --git a/src/engine/link.c b/src/engine/link.c index 3bcacd12b..a716d5c2b 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -13,6 +13,7 @@ #include "constants/songs.h" #include "sound.h" #include "sprite.h" +#include "string_util.h" #include "strings2.h" #include "task.h" #include "text.h" @@ -1396,12 +1397,31 @@ void CB2_LinkError(void) static void CB2_PrintErrorMessage(void) { - u8 array[64] __attribute__((unused)); // unused + u8 array[32] __attribute__((unused)); // unused + u8 array2[32] __attribute__((unused)); // unused switch (gMain.state) { case 0: Menu_PrintTextPixelCoords(gMultiText_LinkError, 20, 56, 1); +#ifdef DEBUG + StringCopy(array, sColorCodes); + + ConvertIntToHexStringN(array2, sErrorLinkStatus, STR_CONV_MODE_LEADING_ZEROS, 8); + StringAppend(array, array2); + + StringAppend(array, sEmptyString); + + ConvertIntToHexStringN(array2, sErrorLastSendQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(array, array2); + + StringAppend(array, sEmptyString); + + ConvertIntToHexStringN(array2, sErrorLastRecvQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(array, array2); + + Menu_PrintText(array, 2, 15); +#endif break; case 30: case 60: -- cgit v1.2.3 From 6dea1a4af13d039c2bfe13170b3542cda535001b Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 17 Jan 2018 21:59:28 -0600 Subject: add debug code in battle_4.c and battle_controller_player.c --- src/battle/battle_4.c | 342 +++++++- src/battle/battle_controller_player.c | 1402 +++++++++++++++++++++++++++++++++ 2 files changed, 1742 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 3763fc309..038b4f5cf 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -1090,7 +1090,7 @@ static const u8 sTerrainToType[] = TYPE_NORMAL, // plain }; -static const u8 sBallCatchBonuses[] = +const u8 sBallCatchBonuses[] = { 20, 15, 10, 15 // Ultra, Great, Poke, Safari }; @@ -5018,7 +5018,156 @@ _0801F610: .4byte BattleScript_SAtkDown2\n\ } #endif // NONMATCHING - +#if DEBUG +__attribute__((naked)) +static void atk15_seteffectwithchance(void) +{ + asm("\ + push {r4, lr}\n\ + ldr r2, ._1037\n\ + ldr r0, ._1037 + 4\n\ + ldrb r1, [r0]\n\ + mov r0, #0x58\n\ + mul r0, r0, r1\n\ + add r0, r0, r2\n\ + add r0, r0, #0x20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x20\n\ + bne ._1035 @cond_branch\n\ + ldr r2, ._1037 + 8\n\ + ldr r0, ._1037 + 12\n\ + ldrh r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldrb r0, [r0, #0x5]\n\ + lsl r4, r0, #0x1\n\ + b ._1036\n\ +._1038:\n\ + .align 2, 0\n\ +._1037:\n\ + .word gBattleMons\n\ + .word gBankAttacker\n\ + .word gBattleMoves\n\ + .word gCurrentMove\n\ +._1035:\n\ + ldr r2, ._1045\n\ + ldr r0, ._1045 + 4\n\ + ldrh r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldrb r4, [r0, #0x5]\n\ +._1036:\n\ + ldr r0, ._1045 + 8\n\ + ldrb r1, [r0]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + ldr r2, ._1045 + 12\n\ + cmp r0, #0\n\ + beq ._1039 @cond_branch\n\ + ldrb r1, [r2, #0x3]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1040 @cond_branch\n\ + ldr r0, ._1045 + 16\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1050 @cond_branch\n\ +._1039:\n\ + ldrb r1, [r2, #0x3]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1043 @cond_branch\n\ +._1040:\n\ + ldr r0, ._1045 + 16\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1043 @cond_branch\n\ + ldr r2, ._1045 + 12\n\ + ldrb r1, [r2, #0x3]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x3]\n\ + b ._1044\n\ +._1046:\n\ + .align 2, 0\n\ +._1045:\n\ + .word gBattleMoves\n\ + .word gCurrentMove\n\ + .word gUnknown_02023A14+0x50\n\ + .word gBattleCommunication\n\ + .word gBattleMoveFlags\n\ +._1043:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r1, #0x64\n\ + bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + cmp r0, r4\n\ + bhi ._1049 @cond_branch\n\ + ldr r0, ._1052\n\ + ldrb r0, [r0, #0x3]\n\ + cmp r0, #0\n\ + beq ._1049 @cond_branch\n\ + ldr r0, ._1052 + 4\n\ + ldrb r1, [r0]\n\ + mov r0, #0x29\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1049 @cond_branch\n\ + cmp r4, #0x63\n\ + bls ._1050 @cond_branch\n\ +._1044:\n\ + mov r0, #0x0\n\ + mov r1, #0x80\n\ + bl SetMoveEffect\n\ + b ._1054\n\ +._1053:\n\ + .align 2, 0\n\ +._1052:\n\ + .word gBattleCommunication\n\ + .word gBattleMoveFlags\n\ +._1050:\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl SetMoveEffect\n\ + b ._1054\n\ +._1049:\n\ + ldr r1, ._1055\n\ + ldr r0, [r1]\n\ + add r0, r0, #0x1\n\ + str r0, [r1]\n\ +._1054:\n\ + ldr r0, ._1055 + 4\n\ + mov r1, #0x0\n\ + strb r1, [r0, #0x3]\n\ + ldr r0, ._1055 + 8\n\ + ldr r2, ._1055 + 12\n\ + add r0, r0, r2\n\ + strb r1, [r0]\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._1056:\n\ + .align 2, 0\n\ +._1055:\n\ + .word gBattlescriptCurrInstr\n\ + .word gBattleCommunication\n\ + .word +0x2000000\n\ + .word 0x16112"); +} +#else static void atk15_seteffectwithchance(void) { u32 PercentChance; @@ -5043,6 +5192,7 @@ static void atk15_seteffectwithchance(void) gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleStruct->unk16112 = 0; } +#endif static void atk16_seteffectprimary(void) { @@ -12620,6 +12770,193 @@ static void atk9D_mimicattackcopy(void) } } +#if DEBUG +__attribute__((naked)) +static void atk9E_metronome(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + ldr r6, ._3076\n\ + ldrb r2, [r6]\n\ + lsl r1, r2, #0x1\n\ + ldr r0, ._3076 + 4\n\ + add r3, r1, r0\n\ + ldr r5, ._3076 + 8\n\ + mov r4, #0x58\n\ + add r0, r2, #0\n\ + mul r0, r0, r4\n\ + add r1, r0, r5\n\ + ldrh r0, [r1, #0xe]\n\ + cmp r0, #0\n\ + bne ._3071 @cond_branch\n\ + ldrh r2, [r1, #0x10]\n\ + cmp r2, #0\n\ + beq ._3071 @cond_branch\n\ + ldrh r0, [r1, #0x12]\n\ + cmp r0, #0\n\ + beq ._3071 @cond_branch\n\ + ldrh r0, [r3]\n\ + cmp r0, #0\n\ + bne ._3072 @cond_branch\n\ + strh r2, [r3]\n\ +._3072:\n\ + ldr r1, ._3076 + 12\n\ + ldrh r0, [r3]\n\ + strh r0, [r1]\n\ + ldrb r0, [r6]\n\ + mul r0, r0, r4\n\ + add r0, r0, r5\n\ + ldrh r5, [r0, #0x10]\n\ + ldrh r2, [r0, #0x12]\n\ + add r7, r1, #0\n\ + cmp r5, r2\n\ + bcs ._3073 @cond_branch\n\ + ldrh r0, [r3]\n\ + cmp r0, r2\n\ + beq ._3074 @cond_branch\n\ + add r0, r0, #0x1\n\ + b ._3079\n\ +._3077:\n\ + .align 2, 0\n\ +._3076:\n\ + .word gBankAttacker\n\ + .word +0x20160b4\n\ + .word gBattleMons\n\ + .word gCurrentMove\n\ +._3073:\n\ + ldrh r4, [r3]\n\ + add r1, r4, #0\n\ + mov r0, #0xb1\n\ + lsl r0, r0, #0x1\n\ + cmp r1, r0\n\ + bne ._3078 @cond_branch\n\ + mov r0, #0x1\n\ + b ._3079\n\ +._3078:\n\ + cmp r1, r2\n\ + bne ._3080 @cond_branch\n\ +._3074:\n\ + strh r5, [r3]\n\ + b ._3081\n\ +._3080:\n\ + add r0, r4, #1\n\ +._3079:\n\ + strh r0, [r3]\n\ +._3081:\n\ + ldr r4, ._3083\n\ + ldr r2, [r4]\n\ + ldr r0, ._3083 + 4\n\ + and r2, r2, r0\n\ + str r2, [r4]\n\ + ldr r6, ._3083 + 8\n\ + ldr r5, ._3083 + 12\n\ + ldr r3, ._3083 + 16\n\ + ldrh r1, [r7]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r5\n\ + ldr r0, [r0]\n\ + str r0, [r6]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x4\n\ + orr r2, r2, r0\n\ + str r2, [r4]\n\ + ldrh r0, [r7]\n\ + b ._3082\n\ +._3084:\n\ + .align 2, 0\n\ +._3083:\n\ + .word gHitMarker\n\ + .word 0xfffffbff\n\ + .word gBattlescriptCurrInstr\n\ + .word gBattleScriptsForMoveEffects\n\ + .word gBattleMoves\n\ +._3071:\n\ + ldr r7, ._3090\n\ + mov r6, #0xb1\n\ + lsl r6, r6, #0x1\n\ + ldr r5, ._3090 + 4\n\ + ldr r0, ._3090 + 8\n\ + mov r8, r0\n\ +._3089:\n\ + bl Random\n\ + ldr r2, ._3090 + 12\n\ + add r1, r2, #0\n\ + and r0, r0, r1\n\ + add r0, r0, #0x1\n\ + strh r0, [r7]\n\ + cmp r0, r6\n\ + bhi ._3089 @cond_branch\n\ + mov r0, #0x3\n\ +._3086:\n\ + sub r0, r0, #0x1\n\ + cmp r0, #0\n\ + bge ._3086 @cond_branch\n\ + ldr r4, ._3090\n\ + ldrh r2, [r4]\n\ + ldr r3, ._3090 + 16\n\ + sub r0, r5, #2\n\ +._3088:\n\ + add r0, r0, #0x2\n\ + ldrh r1, [r0]\n\ + cmp r1, r2\n\ + beq ._3087 @cond_branch\n\ + cmp r1, r3\n\ + bne ._3088 @cond_branch\n\ +._3087:\n\ + ldr r0, ._3090 + 16\n\ + cmp r1, r0\n\ + bne ._3089 @cond_branch\n\ + ldr r2, ._3090 + 20\n\ + ldr r0, [r2]\n\ + ldr r1, ._3090 + 24\n\ + and r0, r0, r1\n\ + str r0, [r2]\n\ + ldr r3, ._3090 + 28\n\ + ldr r2, ._3090 + 32\n\ + ldrh r1, [r4]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldr r0, [r0]\n\ + mov r1, r8\n\ + str r0, [r1]\n\ + ldrh r0, [r4]\n\ +._3082:\n\ + mov r1, #0x0\n\ + bl GetMoveTarget\n\ + ldr r1, ._3090 + 36\n\ + strb r0, [r1]\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._3091:\n\ + .align 2, 0\n\ +._3090:\n\ + .word gCurrentMove\n\ + .word sMovesForbiddenToCopy\n\ + .word gBattlescriptCurrInstr\n\ + .word 0x1ff\n\ + .word 0xffff\n\ + .word gHitMarker\n\ + .word 0xfffffbff\n\ + .word gBattleScriptsForMoveEffects\n\ + .word gBattleMoves\n\ + .word gBankTarget"); +} +#else #ifdef NONMATCHING static void atk9E_metronome(void) { @@ -12721,6 +13058,7 @@ _0802795C: .4byte gBankTarget\n\ .syntax divided"); } #endif // NONMATCHING +#endif static void atk9F_dmgtolevel(void) { diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 0d05b7aed..eaabe9b53 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -617,6 +617,725 @@ struct ChooseMoveStruct const u8 gUnknown_081FAE80[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW WHITE LIGHT_BLUE WHITE2}"); +#if DEBUG +__attribute__((naked)) +void sub_802C68C(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + add sp, sp, #0xfffffff8\n\ + mov r0, #0x0\n\ + mov r8, r0\n\ + mov r7, #0x0\n\ + ldr r1, ._131\n\ + ldrb r2, [r1]\n\ + lsl r1, r2, #0x9\n\ + ldr r0, ._131 + 4\n\ + add r6, r1, r0\n\ + ldr r0, ._131 + 8\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r5, #0x1\n\ + add r0, r5, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._126 @cond_branch\n\ + b ._127\n\ +._126:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r1, ._131 + 12\n\ + ldr r2, ._131\n\ + ldrb r0, [r2]\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x1\n\ + add r1, r6, r0\n\ + ldrh r0, [r1]\n\ + cmp r0, #0xae\n\ + bne ._128 @cond_branch\n\ + ldrb r0, [r6, #0x12]\n\ + mov r4, #0x0\n\ + cmp r0, #0x7\n\ + beq ._130 @cond_branch\n\ + ldrb r1, [r6, #0x13]\n\ + mov r0, #0x7\n\ + eor r1, r1, r0\n\ + neg r0, r1\n\ + orr r0, r0, r1\n\ + asr r4, r0, #0x1f\n\ + mov r0, #0x10\n\ + and r4, r4, r0\n\ + b ._130\n\ +._132:\n\ + .align 2, 0\n\ +._131:\n\ + .word gActiveBank\n\ + .word gUnknown_02023A64\n\ + .word gMain\n\ + .word gMoveSelectionCursor\n\ +._128:\n\ + ldr r2, ._135\n\ + ldrh r1, [r1]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldrb r4, [r0, #0x6]\n\ +._130:\n\ + mov r0, #0x10\n\ + and r0, r0, r4\n\ + cmp r0, #0\n\ + beq ._133 @cond_branch\n\ + ldr r0, ._135 + 4\n\ + ldr r1, ._135 + 8\n\ + ldrb r1, [r1]\n\ + strb r1, [r0]\n\ + b ._134\n\ +._136:\n\ + .align 2, 0\n\ +._135:\n\ + .word gBattleMoves\n\ + .word gUnknown_03004344\n\ + .word gActiveBank\n\ +._133:\n\ + ldr r0, ._141\n\ + ldrb r0, [r0]\n\ + bl GetBankIdentity\n\ + add r1, r0, #0\n\ + mov r2, #0x1\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + eor r0, r0, r2\n\ + bl GetBankByIdentity\n\ + ldr r1, ._141 + 4\n\ + strb r0, [r1]\n\ +._134:\n\ + ldr r3, ._141 + 8\n\ + ldr r5, ._141\n\ + ldrb r2, [r5]\n\ + lsl r1, r2, #0x9\n\ + add r0, r3, #1\n\ + add r0, r1, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._137 @cond_branch\n\ + mov r0, #0x2\n\ + and r0, r0, r4\n\ + cmp r0, #0\n\ + beq ._146 @cond_branch\n\ + add r0, r3, #2\n\ + add r0, r1, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._146 @cond_branch\n\ + mov r0, #0x1\n\ + add r8, r8, r0\n\ + b ._146\n\ +._142:\n\ + .align 2, 0\n\ +._141:\n\ + .word gActiveBank\n\ + .word gUnknown_03004344\n\ + .word gBattleBufferA\n\ +._137:\n\ + mov r0, #0x7d\n\ + and r0, r0, r4\n\ + cmp r0, #0\n\ + bne ._143 @cond_branch\n\ + mov r1, #0x1\n\ + add r8, r8, r1\n\ +._143:\n\ + ldr r0, ._149\n\ + add r0, r2, r0\n\ + add r1, r6, #0\n\ + add r1, r1, #0x8\n\ + ldrb r0, [r0]\n\ + add r1, r1, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, #0\n\ + beq ._144 @cond_branch\n\ + mov r0, #0x12\n\ + and r0, r0, r4\n\ + cmp r0, #0\n\ + bne ._146 @cond_branch\n\ + mov r0, #0x0\n\ + bl CountAliveMons\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bhi ._146 @cond_branch\n\ + ldrb r0, [r5]\n\ + bl sub_803C434\n\ + ldr r1, ._149 + 4\n\ + strb r0, [r1]\n\ + mov r2, #0x0\n\ + mov r8, r2\n\ +._146:\n\ + mov r0, r8\n\ + cmp r0, #0\n\ + bne ._147 @cond_branch\n\ +._144:\n\ + bl DestroyMenuCursor\n\ + ldr r1, ._149\n\ + ldr r0, ._149 + 8\n\ + ldrb r0, [r0]\n\ + add r0, r0, r1\n\ + ldrb r2, [r0]\n\ + ldr r0, ._149 + 4\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x8\n\ + orr r2, r2, r0\n\ + b ._148\n\ +._150:\n\ + .align 2, 0\n\ +._149:\n\ + .word gMoveSelectionCursor\n\ + .word gUnknown_03004344\n\ + .word gActiveBank\n\ +._147:\n\ + ldr r1, ._153\n\ + ldr r2, ._153 + 4\n\ + ldrb r0, [r2]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._153 + 8\n\ + str r1, [r0]\n\ + mov r0, #0x12\n\ + and r4, r4, r0\n\ + cmp r4, #0\n\ + beq ._151 @cond_branch\n\ + ldr r1, ._153 + 12\n\ + ldrb r0, [r2]\n\ + b ._152\n\ +._154:\n\ + .align 2, 0\n\ +._153:\n\ + .word gBattleBankFunc\n\ + .word gActiveBank\n\ + .word sub_802C2EC+1\n\ + .word gUnknown_03004344\n\ +._151:\n\ + mov r0, #0x1\n\ + bl GetBankByIdentity\n\ + ldr r1, ._157\n\ + ldrb r1, [r1]\n\ + ldr r2, ._157 + 4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x16\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + and r1, r1, r0\n\ + cmp r1, #0\n\ + beq ._155 @cond_branch\n\ + mov r0, #0x3\n\ + b ._156\n\ +._158:\n\ + .align 2, 0\n\ +._157:\n\ + .word gAbsentBankFlags\n\ + .word gBitTable\n\ +._155:\n\ + mov r0, #0x1\n\ +._156:\n\ + bl GetBankByIdentity\n\ + ldr r1, ._160\n\ +._152:\n\ + strb r0, [r1]\n\ + ldr r2, ._160 + 4\n\ + ldr r1, ._160 + 8\n\ + ldr r0, ._160\n\ + ldrb r0, [r0]\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x4\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r2, r2, #0x1c\n\ + add r0, r0, r2\n\ + ldr r1, ._160 + 12\n\ + b ._203\n\ +._161:\n\ + .align 2, 0\n\ +._160:\n\ + .word gUnknown_03004344\n\ + .word gSprites\n\ + .word gObjectBankIDs\n\ + .word sub_8010520+1\n\ +._127:\n\ + mov r6, #0x2\n\ + add r0, r6, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._162 @cond_branch\n\ + bl DestroyMenuCursor\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._164\n\ + strh r7, [r0]\n\ + ldr r1, ._164 + 4\n\ + mov r2, #0xa0\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + ldr r2, ._164 + 8\n\ +._148:\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ + bl PlayerBufferExecCompleted\n\ + b ._209\n\ +._165:\n\ + .align 2, 0\n\ +._164:\n\ + .word gBattle_BG0_X\n\ + .word gBattle_BG0_Y\n\ + .word 0xffff\n\ +._162:\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._166 @cond_branch\n\ + ldr r4, ._170\n\ + add r2, r2, r4\n\ + ldrb r1, [r2]\n\ + add r0, r5, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._167 @cond_branch\n\ + b ._209\n\ +._167:\n\ + ldrb r0, [r2]\n\ + bl nullsub_7\n\ + ldr r0, ._170 + 4\n\ + ldrb r1, [r0]\n\ + add r1, r1, r4\n\ + ldrb r0, [r1]\n\ + mov r2, #0x1\n\ + eor r0, r0, r2\n\ + b ._183\n\ +._171:\n\ + .align 2, 0\n\ +._170:\n\ + .word gMoveSelectionCursor\n\ + .word gActiveBank\n\ +._166:\n\ + mov r3, #0x10\n\ + add r0, r3, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._172 @cond_branch\n\ + ldr r4, ._178\n\ + add r3, r2, r4\n\ + ldrb r2, [r3]\n\ + mov r6, #0x1\n\ + add r0, r5, #0\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + beq ._173 @cond_branch\n\ + b ._209\n\ +._173:\n\ + ldr r1, ._178 + 4\n\ + add r0, r6, #0\n\ + eor r0, r0, r2\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc ._175 @cond_branch\n\ + b ._209\n\ +._175:\n\ + ldrb r0, [r3]\n\ + bl nullsub_7\n\ + ldr r2, ._178 + 8\n\ + ldrb r1, [r2]\n\ + add r1, r1, r4\n\ + ldrb r0, [r1]\n\ + eor r0, r0, r6\n\ + b ._183\n\ +._179:\n\ + .align 2, 0\n\ +._178:\n\ + .word gMoveSelectionCursor\n\ + .word gUnknown_03004348\n\ + .word gActiveBank\n\ +._172:\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._180 @cond_branch\n\ + ldr r4, ._184\n\ + add r2, r2, r4\n\ + ldrb r1, [r2]\n\ + add r0, r6, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._181 @cond_branch\n\ + b ._209\n\ +._181:\n\ + ldrb r0, [r2]\n\ + bl nullsub_7\n\ + ldr r2, ._184 + 4\n\ + ldrb r1, [r2]\n\ + add r1, r1, r4\n\ + ldrb r0, [r1]\n\ + mov r2, #0x2\n\ + eor r0, r0, r2\n\ + b ._183\n\ +._185:\n\ + .align 2, 0\n\ +._184:\n\ + .word gMoveSelectionCursor\n\ + .word gActiveBank\n\ +._180:\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._186 @cond_branch\n\ + ldr r4, ._192\n\ + add r3, r2, r4\n\ + ldrb r2, [r3]\n\ + mov r5, #0x2\n\ + add r0, r6, #0\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + beq ._187 @cond_branch\n\ + b ._209\n\ +._187:\n\ + ldr r1, ._192 + 4\n\ + add r0, r5, #0\n\ + eor r0, r0, r2\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc ._189 @cond_branch\n\ + b ._209\n\ +._189:\n\ + ldrb r0, [r3]\n\ + bl nullsub_7\n\ + ldr r2, ._192 + 8\n\ + ldrb r1, [r2]\n\ + add r1, r1, r4\n\ + ldrb r0, [r1]\n\ + eor r0, r0, r5\n\ +._183:\n\ + strb r0, [r1]\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r1, ._192 + 8\n\ + ldrb r0, [r1]\n\ + add r0, r0, r4\n\ + ldrb r0, [r0]\n\ + mov r1, #0x0\n\ + bl sub_802E3B4\n\ + bl sub_802E220\n\ + bl sub_802E2D4\n\ + b ._209\n\ +._193:\n\ + .align 2, 0\n\ +._192:\n\ + .word gMoveSelectionCursor\n\ + .word gUnknown_03004348\n\ + .word gActiveBank\n\ +._186:\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._194 @cond_branch\n\ + ldr r0, ._201\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bhi ._195 @cond_branch\n\ + b ._209\n\ +._195:\n\ + ldr r0, ._201 + 4\n\ + ldrh r1, [r0]\n\ + add r0, r6, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._197 @cond_branch\n\ + b ._209\n\ +._197:\n\ + ldr r4, ._201 + 8\n\ + add r0, r2, r4\n\ + ldrb r0, [r0]\n\ + ldr r1, ._201 + 12\n\ + bl sub_802E12C\n\ + ldr r2, ._201 + 16\n\ + ldrb r0, [r2]\n\ + add r0, r0, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._199 @cond_branch\n\ + ldr r0, ._201 + 20\n\ + strb r7, [r0]\n\ + b ._200\n\ +._202:\n\ + .align 2, 0\n\ +._201:\n\ + .word gUnknown_03004348\n\ + .word gBattleTypeFlags\n\ + .word gMoveSelectionCursor\n\ + .word gUnknown_081FAE80\n\ + .word gActiveBank\n\ + .word gUnknown_03004344\n\ +._199:\n\ + ldr r1, ._204\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + add r0, r1, #0\n\ +._200:\n\ + ldrb r0, [r0]\n\ + mov r1, #0x1b\n\ + bl sub_802E3B4\n\ + ldr r4, ._204 + 4\n\ + ldr r1, ._204 + 8\n\ + mov r0, #0x1c\n\ + str r0, [sp]\n\ + mov r0, #0x3a\n\ + str r0, [sp, #0x4]\n\ + add r0, r4, #0\n\ + mov r2, #0x17\n\ + mov r3, #0x37\n\ + bl Text_FillWindowRect\n\ + ldr r1, ._204 + 12\n\ + mov r2, #0xa4\n\ + lsl r2, r2, #0x2\n\ + mov r0, #0x37\n\ + str r0, [sp]\n\ + add r0, r4, #0\n\ + mov r3, #0x17\n\ + bl Text_InitWindow\n\ + add r0, r4, #0\n\ + bl Text_PrintWindow8002F44\n\ + ldr r1, ._204 + 16\n\ + ldr r0, ._204 + 20\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._204 + 24\n\ + b ._203\n\ +._205:\n\ + .align 2, 0\n\ +._204:\n\ + .word gUnknown_03004344\n\ + .word gUnknown_03004210\n\ + .word 0x1016\n\ + .word BattleText_SwitchWhich\n\ + .word gBattleBankFunc\n\ + .word gActiveBank\n\ + .word sub_802CA60+1\n\ +._194:\n\ + ldr r0, ._214\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._206 @cond_branch\n\ + b ._209\n\ +._206:\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._208 @cond_branch\n\ + b ._209\n\ +._208:\n\ + ldr r6, ._214 + 4\n\ + ldr r1, ._214 + 8\n\ + str r3, [sp]\n\ + mov r0, #0x3a\n\ + str r0, [sp, #0x4]\n\ + add r0, r6, #0\n\ + mov r2, #0x1\n\ + mov r3, #0x37\n\ + bl Text_FillWindowRect\n\ + ldr r0, ._214 + 12\n\ + mov sl, r0\n\ + ldr r1, ._214 + 16\n\ + ldrb r0, [r1]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, sl\n\ + ldrh r0, [r0]\n\ + mov r2, #0x64\n\ + mov r9, r2\n\ + mov r1, r9\n\ + mul r1, r1, r0\n\ + add r0, r1, #0\n\ + ldr r5, ._214 + 20\n\ + add r0, r0, r5\n\ + mov r1, #0xd\n\ + bl GetMonData\n\ + mov r1, #0xd\n\ + mul r1, r1, r0\n\ + ldr r0, ._214 + 24\n\ + add r1, r1, r0\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x1\n\ + mov r0, #0x37\n\ + mov r8, r0\n\ + str r0, [sp]\n\ + add r0, r6, #0\n\ + mov r3, #0x2\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r4, ._214 + 28\n\ + ldr r1, ._214 + 16\n\ + ldrb r0, [r1]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, sl\n\ + ldrh r0, [r0]\n\ + mov r2, r9\n\ + mul r2, r2, r0\n\ + add r0, r2, #0\n\ + add r0, r0, r5\n\ + mov r1, #0xd\n\ + bl GetMonData\n\ + add r1, r0, #0\n\ + add r0, r4, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x3\n\ + bl ConvertIntToDecimalStringN\n\ + mov r2, #0x88\n\ + lsl r2, r2, #0x1\n\ + mov r0, r8\n\ + str r0, [sp]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0xa\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r1, ._214 + 32\n\ + mov r2, #0x8b\n\ + lsl r2, r2, #0x1\n\ + mov r5, #0x39\n\ + str r5, [sp]\n\ + add r0, r6, #0\n\ + mov r3, #0x1\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r0, ._214 + 36\n\ + ldrb r1, [r0]\n\ + add r0, r4, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x3\n\ + bl ConvertIntToDecimalStringN\n\ + mov r2, #0x8e\n\ + lsl r2, r2, #0x1\n\ + str r5, [sp]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0x4\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r0, ._214 + 40\n\ + add r2, r0, #0\n\ + add r2, r2, #0x3e\n\ + mov r1, #0x3f\n\ +._211:\n\ + ldrb r0, [r2]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._210 @cond_branch\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ +._210:\n\ + add r2, r2, #0x44\n\ + sub r1, r1, #0x1\n\ + cmp r1, #0\n\ + bge ._211 @cond_branch\n\ + ldr r4, ._214 + 28\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r6, ._214 + 4\n\ + mov r2, #0x91\n\ + lsl r2, r2, #0x1\n\ + mov r5, #0x39\n\ + str r5, [sp]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0x8\n\ + bl Text_InitWindowAndPrintText\n\ + bl GetTaskCount\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + mov r2, #0x93\n\ + lsl r2, r2, #0x1\n\ + str r5, [sp]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0xb\n\ + bl Text_InitWindowAndPrintText\n\ + mov r1, #0x0\n\ + mov r7, #0x0\n\ + ldr r0, ._214 + 44\n\ + mov r3, #0x1\n\ + ldr r2, [r0]\n\ +._213:\n\ + add r0, r3, #0\n\ + LSL r0, r1\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + beq ._212 @cond_branch\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ +._212:\n\ + add r1, r1, #0x1\n\ + cmp r1, #0x1f\n\ + ble ._213 @cond_branch\n\ + ldr r4, ._214 + 28\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, ._214 + 4\n\ + mov r2, #0x95\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x39\n\ + str r1, [sp]\n\ + add r1, r4, #0\n\ + mov r3, #0xe\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r1, ._214 + 48\n\ + ldr r0, ._214 + 16\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._214 + 52\n\ +._203:\n\ + str r1, [r0]\n\ +._209:\n\ + add sp, sp, #0x8\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._215:\n\ + .align 2, 0\n\ +._214:\n\ + .word gUnknown_020297ED\n\ + .word gUnknown_03004210\n\ + .word 0x1016\n\ + .word gBattlePartyID\n\ + .word gActiveBank\n\ + .word gPlayerParty\n\ + .word gMoveNames\n\ + .word gDisplayedStringBattle\n\ + .word sBallCatchBonuses+0x4\n\ + .word gAnimMoveTurn\n\ + .word gSprites\n\ + .word gOamMatrixAllocBitmap\n\ + .word gBattleBankFunc\n\ + .word debug_sub_8030C24+1"); +} +#else void sub_802C68C(void) { u32 r8 = 0; @@ -751,6 +1470,7 @@ void sub_802C68C(void) } } } +#endif extern const u8 BattleText_Format[]; @@ -956,6 +1676,688 @@ void sub_802D18C(void) } } +#if DEBUG +__attribute__((naked)) +void debug_sub_8030C24(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + add sp, sp, #0xfffffff4\n\ + ldr r1, ._293\n\ + ldr r4, ._293 + 4\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r0, r0, r1\n\ + ldr r1, ._293 + 8\n\ + add r0, r0, r1\n\ + mov r1, #0xd\n\ + bl GetMonData\n\ + add r1, sp, #0x8\n\ + strh r0, [r1]\n\ + ldr r5, ._293 + 12\n\ + ldrh r1, [r5, #0x30]\n\ + cmp r1, #0x20\n\ + bne ._286 @cond_branch\n\ + b ._287\n\ +._286:\n\ + cmp r1, #0x20\n\ + bgt ._288 @cond_branch\n\ + cmp r1, #0x8\n\ + beq ._289 @cond_branch\n\ + cmp r1, #0x8\n\ + bgt ._290 @cond_branch\n\ + cmp r1, #0x4\n\ + beq ._291 @cond_branch\n\ + b ._348\n\ +._294:\n\ + .align 2, 0\n\ +._293:\n\ + .word gBattlePartyID\n\ + .word gActiveBank\n\ + .word gPlayerParty\n\ + .word gMain\n\ +._290:\n\ + cmp r1, #0x10\n\ + bne ._295 @cond_branch\n\ + b ._296\n\ +._295:\n\ + b ._348\n\ +._288:\n\ + cmp r1, #0x80\n\ + bne ._298 @cond_branch\n\ + b ._302\n\ +._298:\n\ + cmp r1, #0x80\n\ + bgt ._300 @cond_branch\n\ + cmp r1, #0x40\n\ + bne ._301 @cond_branch\n\ + b ._302\n\ +._301:\n\ + b ._348\n\ +._300:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + cmp r1, r0\n\ + bne ._304 @cond_branch\n\ + b ._305\n\ +._304:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x2\n\ + cmp r1, r0\n\ + bne ._306 @cond_branch\n\ + b ._307\n\ +._306:\n\ + b ._348\n\ +._289:\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + bl dp11b_obj_free\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + bl dp11b_obj_free\n\ + ldr r0, ._312\n\ + ldrb r2, [r4]\n\ + strb r2, [r0]\n\ + ldrh r1, [r5, #0x28]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._310 @cond_branch\n\ + ldr r0, ._312 + 4\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._310 @cond_branch\n\ + ldr r0, ._312 + 8\n\ + mov r1, #0x2\n\ + eor r1, r1, r2\n\ + strb r1, [r0]\n\ + b ._311\n\ +._313:\n\ + .align 2, 0\n\ +._312:\n\ + .word gBankAttacker\n\ + .word gBattleTypeFlags\n\ + .word gBankTarget\n\ +._310:\n\ + ldr r0, ._317\n\ + ldrh r1, [r0, #0x28]\n\ + mov r2, #0x1\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._315 @cond_branch\n\ + ldr r0, ._317 + 4\n\ + ldrh r1, [r0]\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._315 @cond_branch\n\ + mov r0, #0x3\n\ + b ._316\n\ +._318:\n\ + .align 2, 0\n\ +._317:\n\ + .word gMain\n\ + .word gBattleTypeFlags\n\ +._315:\n\ + mov r0, #0x1\n\ +._316:\n\ + bl GetBankByIdentity\n\ + ldr r1, ._320\n\ + strb r0, [r1]\n\ +._311:\n\ + mov r0, #0x0\n\ + bl sub_80326EC\n\ + add r0, sp, #0x8\n\ + ldrh r0, [r0]\n\ + bl DoMoveAnim\n\ + ldr r1, ._320 + 4\n\ + ldr r0, ._320 + 8\n\ + ldrb r0, [r0]\n\ + b ._332\n\ +._321:\n\ + .align 2, 0\n\ +._320:\n\ + .word gBankTarget\n\ + .word gBattleBankFunc\n\ + .word gActiveBank\n\ +._291:\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + bl dp11b_obj_free\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + bl dp11b_obj_free\n\ + ldr r0, ._325\n\ + ldrb r2, [r4]\n\ + strb r2, [r0]\n\ + ldrh r1, [r5, #0x28]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._323 @cond_branch\n\ + ldr r0, ._325 + 4\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._323 @cond_branch\n\ + ldr r0, ._325 + 8\n\ + mov r1, #0x2\n\ + eor r1, r1, r2\n\ + strb r1, [r0]\n\ + b ._324\n\ +._326:\n\ + .align 2, 0\n\ +._325:\n\ + .word gBankTarget\n\ + .word gBattleTypeFlags\n\ + .word gBankAttacker\n\ +._323:\n\ + ldr r0, ._330\n\ + ldrh r1, [r0, #0x28]\n\ + mov r2, #0x1\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._328 @cond_branch\n\ + ldr r0, ._330 + 4\n\ + ldrh r1, [r0]\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._328 @cond_branch\n\ + mov r0, #0x3\n\ + b ._329\n\ +._331:\n\ + .align 2, 0\n\ +._330:\n\ + .word gMain\n\ + .word gBattleTypeFlags\n\ +._328:\n\ + mov r0, #0x1\n\ +._329:\n\ + bl GetBankByIdentity\n\ + ldr r1, ._333\n\ + strb r0, [r1]\n\ +._324:\n\ + mov r0, #0x0\n\ + bl sub_80326EC\n\ + add r0, sp, #0x8\n\ + ldrh r0, [r0]\n\ + bl DoMoveAnim\n\ + ldr r1, ._333 + 4\n\ + ldr r0, ._333 + 8\n\ + ldrb r0, [r0]\n\ + b ._332\n\ +._334:\n\ + .align 2, 0\n\ +._333:\n\ + .word gBankAttacker\n\ + .word gBattleBankFunc\n\ + .word gActiveBank\n\ +._305:\n\ + ldrh r1, [r5, #0x28]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._336 @cond_branch\n\ + ldr r0, ._338\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._336 @cond_branch\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + bl dp11b_obj_free\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + bl dp11b_obj_free\n\ + mov r0, #0x3\n\ + bl GetBankByIdentity\n\ + ldr r1, ._338 + 4\n\ + strb r0, [r1]\n\ + mov r0, #0x1\n\ + b ._337\n\ +._339:\n\ + .align 2, 0\n\ +._338:\n\ + .word gBattleTypeFlags\n\ + .word gBankAttacker\n\ +._336:\n\ + add r0, sp, #0x8\n\ + mov r1, #0x0\n\ + ldsh r0, [r0, r1]\n\ + add r0, r0, #0x9\n\ + add r1, sp, #0x8\n\ + strh r0, [r1]\n\ +._296:\n\ + add r0, sp, #0x8\n\ + mov r2, #0x0\n\ + ldsh r0, [r0, r2]\n\ + add r0, r0, #0x1\n\ + lsl r2, r0, #0x10\n\ + add r1, sp, #0x8\n\ + strh r0, [r1]\n\ + mov r0, #0xb1\n\ + lsl r0, r0, #0x11\n\ + cmp r2, r0\n\ + ble ._347 @cond_branch\n\ + mov r1, #0x1\n\ + add r0, sp, #0x8\n\ + strh r1, [r0]\n\ + b ._347\n\ +._307:\n\ + ldrh r1, [r5, #0x28]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._343 @cond_branch\n\ + ldr r0, ._345\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._343 @cond_branch\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + bl dp11b_obj_free\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + bl dp11b_obj_free\n\ + mov r0, #0x1\n\ + bl GetBankByIdentity\n\ + ldr r1, ._345 + 4\n\ + strb r0, [r1]\n\ + mov r0, #0x3\n\ +._337:\n\ + bl GetBankByIdentity\n\ + ldr r1, ._345 + 8\n\ + strb r0, [r1]\n\ + mov r0, #0x0\n\ + bl sub_80326EC\n\ + add r0, sp, #0x8\n\ + ldrh r0, [r0]\n\ + bl DoMoveAnim\n\ + ldr r1, ._345 + 12\n\ + ldrb r0, [r4]\n\ +._332:\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._345 + 16\n\ + str r1, [r0]\n\ + b ._348\n\ +._346:\n\ + .align 2, 0\n\ +._345:\n\ + .word gBattleTypeFlags\n\ + .word gBankAttacker\n\ + .word gBankTarget\n\ + .word gBattleBankFunc\n\ + .word debug_sub_803107C+1\n\ +._343:\n\ + add r1, sp, #0x8\n\ + add r0, r1, #0\n\ + ldrh r0, [r0]\n\ + sub r0, r0, #0x9\n\ + strh r0, [r1]\n\ +._287:\n\ + add r1, sp, #0x8\n\ + add r0, r1, #0\n\ + ldrh r0, [r0]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r1]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bgt ._347 @cond_branch\n\ + mov r2, #0xb1\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ +._347:\n\ + ldr r1, ._349\n\ + ldr r4, ._349 + 4\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r0, r0, r1\n\ + ldr r1, ._349 + 8\n\ + add r0, r0, r1\n\ + mov r1, #0xd\n\ + add r2, sp, #0x8\n\ + bl SetMonData\n\ + ldr r2, ._349 + 12\n\ + ldrb r1, [r4]\n\ + mov r0, #0x58\n\ + mul r0, r0, r1\n\ + add r0, r0, r2\n\ + add r1, sp, #0x8\n\ + ldrh r1, [r1]\n\ + strh r1, [r0, #0xc]\n\ + ldr r5, ._349 + 16\n\ + ldr r1, ._349 + 20\n\ + mov r0, #0x10\n\ + str r0, [sp]\n\ + mov r0, #0x38\n\ + str r0, [sp, #0x4]\n\ + add r0, r5, #0\n\ + mov r2, #0x1\n\ + mov r3, #0x37\n\ + bl Text_FillWindowRect\n\ + add r0, sp, #0x8\n\ + mov r2, #0x0\n\ + ldsh r1, [r0, r2]\n\ + mov r0, #0xd\n\ + mul r1, r1, r0\n\ + ldr r0, ._349 + 24\n\ + add r1, r1, r0\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x1\n\ + mov r6, #0x37\n\ + str r6, [sp]\n\ + add r0, r5, #0\n\ + mov r3, #0x2\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r4, ._349 + 28\n\ + add r0, sp, #0x8\n\ + mov r2, #0x0\n\ + ldsh r1, [r0, r2]\n\ + add r0, r4, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x3\n\ + bl ConvertIntToDecimalStringN\n\ + mov r2, #0x88\n\ + lsl r2, r2, #0x1\n\ + str r6, [sp]\n\ + add r0, r5, #0\n\ + add r1, r4, #0\n\ + mov r3, #0xa\n\ + bl Text_InitWindowAndPrintText\n\ + b ._348\n\ +._350:\n\ + .align 2, 0\n\ +._349:\n\ + .word gBattlePartyID\n\ + .word gActiveBank\n\ + .word gPlayerParty\n\ + .word gBattleMons\n\ + .word gUnknown_03004210\n\ + .word 0x1016\n\ + .word gMoveNames\n\ + .word gDisplayedStringBattle\n\ +._302:\n\ + ldr r0, ._353\n\ + ldrh r0, [r0, #0x30]\n\ + cmp r0, #0x40\n\ + bne ._351 @cond_branch\n\ + ldr r1, ._353 + 4\n\ + ldrb r0, [r1]\n\ + sub r0, r0, #0x1\n\ + b ._352\n\ +._354:\n\ + .align 2, 0\n\ +._353:\n\ + .word gMain\n\ + .word gAnimMoveTurn\n\ +._351:\n\ + ldr r1, ._359\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ +._352:\n\ + strb r0, [r1]\n\ + ldr r4, ._359 + 4\n\ + ldrb r1, [r1]\n\ + add r0, r4, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x3\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, ._359 + 8\n\ + mov r2, #0x8e\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x39\n\ + str r1, [sp]\n\ + add r1, r4, #0\n\ + mov r3, #0x4\n\ + bl Text_InitWindowAndPrintText\n\ +._348:\n\ + ldr r0, ._359 + 12\n\ + ldrh r2, [r0, #0x28]\n\ + mov r1, #0xc0\n\ + lsl r1, r1, #0x2\n\ + add r0, r1, #0\n\ + and r0, r0, r2\n\ + cmp r0, r1\n\ + bne ._355 @cond_branch\n\ + mov r4, #0x0\n\ + ldr r5, ._359 + 4\n\ + ldr r6, ._359 + 8\n\ +._361:\n\ + add r0, r5, #0\n\ + ldr r1, ._359 + 16\n\ + bl StringCopy\n\ + ldr r1, ._359 + 20\n\ + ldr r0, ._359 + 24\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x1\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + mov r0, #0x64\n\ + mul r0, r0, r1\n\ + ldr r1, ._359 + 28\n\ + add r0, r0, r1\n\ + add r1, r4, #0\n\ + add r1, r1, #0xd\n\ + bl GetMonData\n\ + mov r1, #0xd\n\ + mul r1, r1, r0\n\ + ldr r0, ._359 + 32\n\ + add r1, r1, r0\n\ + add r0, r5, #0\n\ + bl StringAppend\n\ + lsl r0, r4, #0x14\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x11\n\ + add r0, r0, r1\n\ + lsr r2, r0, #0x10\n\ + mov r0, #0x1\n\ + and r0, r0, r4\n\ + mov r3, #0x2\n\ + cmp r0, #0\n\ + beq ._356 @cond_branch\n\ + mov r3, #0xa\n\ +._356:\n\ + cmp r4, #0x1\n\ + bhi ._357 @cond_branch\n\ + mov r0, #0x37\n\ + b ._358\n\ +._360:\n\ + .align 2, 0\n\ +._359:\n\ + .word gAnimMoveTurn\n\ + .word gDisplayedStringBattle\n\ + .word gUnknown_03004210\n\ + .word gMain\n\ + .word BattleText_Format\n\ + .word gBattlePartyID\n\ + .word gActiveBank\n\ + .word gPlayerParty\n\ + .word gMoveNames\n\ +._357:\n\ + mov r0, #0x39\n\ +._358:\n\ + str r0, [sp]\n\ + add r0, r6, #0\n\ + add r1, r5, #0\n\ + bl Text_InitWindow\n\ + ldr r0, ._362\n\ + bl Text_PrintWindow8002F44\n\ + add r0, r4, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0x3\n\ + bls ._361 @cond_branch\n\ + ldr r1, ._362 + 4\n\ + ldr r0, ._362 + 8\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._362 + 12\n\ + str r1, [r0]\n\ +._355:\n\ + add sp, sp, #0xc\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._363:\n\ + .align 2, 0\n\ +._362:\n\ + .word gUnknown_03004210\n\ + .word gBattleBankFunc\n\ + .word gActiveBank\n\ + .word sub_802C68C+1"); +} + +__attribute__((naked)) +void debug_sub_803107C(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add sp, sp, #0xfffffffc\n\ + mov r7, #0x0\n\ + ldr r0, ._369\n\ + ldr r0, [r0]\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cf4\n\ + ldr r0, ._369 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._364 @cond_branch\n\ + mov r0, #0x1\n\ + bl sub_80326EC\n\ + ldr r4, ._369 + 8\n\ + ldrb r0, [r4]\n\ + mov r1, #0x1\n\ + mov r2, #0x7\n\ + mov r3, #0x1\n\ + bl dp11b_obj_instanciate\n\ + ldrb r0, [r4]\n\ + mov r1, #0x0\n\ + mov r2, #0x7\n\ + mov r3, #0x1\n\ + bl dp11b_obj_instanciate\n\ + ldr r0, ._369 + 12\n\ + add r2, r0, #0\n\ + add r2, r2, #0x3e\n\ + mov r1, #0x3f\n\ +._366:\n\ + ldrb r0, [r2]\n\ + lsl r0, r0, #0x1f\n\ + cmp r0, #0\n\ + beq ._365 @cond_branch\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ +._365:\n\ + add r2, r2, #0x44\n\ + sub r1, r1, #0x1\n\ + cmp r1, #0\n\ + bge ._366 @cond_branch\n\ + ldr r4, ._369 + 16\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r6, ._369 + 20\n\ + mov r2, #0x91\n\ + lsl r2, r2, #0x1\n\ + mov r5, #0x39\n\ + str r5, [sp]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0x8\n\ + bl Text_InitWindowAndPrintText\n\ + bl GetTaskCount\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + mov r2, #0x93\n\ + lsl r2, r2, #0x1\n\ + str r5, [sp]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0xb\n\ + bl Text_InitWindowAndPrintText\n\ + mov r1, #0x0\n\ + mov r7, #0x0\n\ + ldr r0, ._369 + 24\n\ + mov r3, #0x1\n\ + ldr r2, [r0]\n\ +._368:\n\ + add r0, r3, #0\n\ + LSL r0, r1\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + beq ._367 @cond_branch\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ +._367:\n\ + add r1, r1, #0x1\n\ + cmp r1, #0x1f\n\ + ble ._368 @cond_branch\n\ + ldr r4, ._369 + 16\n\ + add r0, r4, #0\n\ + add r1, r7, #0\n\ + mov r2, #0x2\n\ + mov r3, #0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r0, ._369 + 20\n\ + mov r2, #0x95\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x39\n\ + str r1, [sp]\n\ + add r1, r4, #0\n\ + mov r3, #0xe\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r1, ._369 + 28\n\ + ldr r0, ._369 + 8\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._369 + 32\n\ + str r1, [r0]\n\ +._364:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._370:\n\ + .align 2, 0\n\ +._369:\n\ + .word gAnimScriptCallback\n\ + .word gAnimScriptActive\n\ + .word gActiveBank\n\ + .word gSprites\n\ + .word gDisplayedStringBattle\n\ + .word gUnknown_03004210\n\ + .word gOamMatrixAllocBitmap\n\ + .word gBattleBankFunc\n\ + .word debug_sub_8030C24+1"); +} +#endif + void sub_802D204(void) { if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) -- cgit v1.2.3 From ec84ae801985ac7f83397979bde6a15508eb02ed Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 18 Jan 2018 11:54:49 -0600 Subject: add more debug code --- src/battle/battle_controller_opponent.c | 548 ++++++++++++++++++++++++++++++++ src/engine/cable_club.c | 65 +++- src/field/party_menu.c | 492 +++++++++++++++++++++++++++- src/pokemon/pokemon_menu.c | 92 ++++++ src/scene/berry_blender.c | 21 +- 5 files changed, 1207 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index 5947053b6..cc69c0120 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -1209,6 +1209,243 @@ void sub_8034B74(void) } } +#if DEBUG +__attribute__((naked)) +void OpponentHandleTrainerThrow(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6}\n\ + ldr r0, ._480\n\ + ldrb r1, [r0]\n\ + mov r0, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._478 @cond_branch\n\ + ldr r0, ._480 + 4\n\ + ldr r1, ._480 + 8\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + b ._491\n\ +._481:\n\ + .align 2, 0\n\ +._480:\n\ + .word gUnknown_02023A14+0x50\n\ + .word +0x2000000\n\ + .word 0x160a3\n\ +._478:\n\ + ldr r3, ._484\n\ + ldrh r1, [r3]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x3\n\ + cmp r1, r0\n\ + bne ._482 @cond_branch\n\ + bl GetSecretBaseTrainerPicIndex\n\ + b ._487\n\ +._485:\n\ + .align 2, 0\n\ +._484:\n\ + .word gTrainerBattleOpponent\n\ +._482:\n\ + ldr r0, ._488\n\ + ldrh r1, [r0]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._486 @cond_branch\n\ + bl get_trainer_class_pic_index\n\ + b ._487\n\ +._489:\n\ + .align 2, 0\n\ +._488:\n\ + .word gBattleTypeFlags\n\ +._486:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._490 @cond_branch\n\ + bl GetEReaderTrainerPicIndex\n\ +._487:\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + b ._491\n\ +._490:\n\ + ldr r2, ._492\n\ + ldrh r1, [r3]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + ldrb r0, [r0, #0x3]\n\ +._491:\n\ + mov r9, r0\n\ + ldr r2, ._492 + 4\n\ + mov r8, r2\n\ + ldrb r1, [r2]\n\ + bl sub_8031A6C\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + bl GetBankIdentity\n\ + add r1, r0, #0\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + mov r0, r9\n\ + bl GetMonSpriteTemplate_803C5A0\n\ + ldr r5, ._492 + 8\n\ + ldr r1, ._492 + 12\n\ + mov r2, r9\n\ + lsl r0, r2, #0x2\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r4, #0x8\n\ + sub r4, r4, r0\n\ + lsl r4, r4, #0x12\n\ + mov r0, #0xa0\n\ + lsl r0, r0, #0xe\n\ + add r4, r4, r0\n\ + asr r4, r4, #0x10\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + bl sub_8079E90\n\ + add r3, r0, #0\n\ + lsl r3, r3, #0x18\n\ + lsr r3, r3, #0x18\n\ + add r0, r5, #0\n\ + mov r1, #0xb0\n\ + add r2, r4, #0\n\ + bl CreateSprite\n\ + ldr r5, ._492 + 16\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + add r1, r1, r5\n\ + strb r0, [r1]\n\ + ldr r4, ._492 + 20\n\ + ldrb r0, [r2]\n\ + add r0, r0, r5\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x4\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r4\n\ + ldr r1, ._492 + 24\n\ + strh r1, [r0, #0x24]\n\ + ldrb r0, [r2]\n\ + add r0, r0, r5\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x4\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r4\n\ + mov r1, #0x2\n\ + strh r1, [r0, #0x2e]\n\ + ldr r0, ._492 + 28\n\ + mov r1, r9\n\ + lsl r6, r1, #0x3\n\ + add r0, r6, r0\n\ + ldrh r0, [r0, #0x4]\n\ + bl IndexOfSpritePaletteTag\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + add r1, r1, r5\n\ + ldrb r1, [r1]\n\ + lsl r2, r1, #0x4\n\ + add r2, r2, r1\n\ + lsl r2, r2, #0x2\n\ + add r2, r2, r4\n\ + lsl r0, r0, #0x4\n\ + ldrb r3, [r2, #0x5]\n\ + mov r1, #0xf\n\ + and r1, r1, r3\n\ + orr r1, r1, r0\n\ + strb r1, [r2, #0x5]\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + add r0, r0, r5\n\ + ldrb r0, [r0]\n\ + lsl r1, r0, #0x4\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r4\n\ + ldrh r0, [r1, #0x4]\n\ + lsl r0, r0, #0x16\n\ + lsr r0, r0, #0x16\n\ + strh r0, [r1, #0x38]\n\ + ldr r0, ._492 + 32\n\ + add r6, r6, r0\n\ + ldrh r0, [r6, #0x6]\n\ + bl GetSpriteTileStartByTag\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + add r1, r1, r5\n\ + ldrb r2, [r1]\n\ + lsl r1, r2, #0x4\n\ + add r1, r1, r2\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r4\n\ + ldr r2, ._492 + 36\n\ + and r2, r2, r0\n\ + ldrh r3, [r1, #0x4]\n\ + ldr r0, ._492 + 40\n\ + and r0, r0, r3\n\ + orr r0, r0, r2\n\ + strh r0, [r1, #0x4]\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + add r0, r0, r5\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x4\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r4\n\ + mov r2, r9\n\ + strh r2, [r0, #0x6]\n\ + mov r1, r8\n\ + ldrb r0, [r1]\n\ + add r0, r0, r5\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x4\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r4, r4, #0x1c\n\ + add r0, r0, r4\n\ + ldr r1, ._492 + 44\n\ + str r1, [r0]\n\ + ldr r1, ._492 + 48\n\ + mov r2, r8\n\ + ldrb r0, [r2]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r1, ._492 + 52\n\ + str r1, [r0]\n\ + pop {r3, r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._493:\n\ + .align 2, 0\n\ +._492:\n\ + .word gTrainers\n\ + .word gActiveBank\n\ + .word gUnknown_02024E8C\n\ + .word gTrainerFrontPicCoords\n\ + .word gObjectBankIDs\n\ + .word gSprites\n\ + .word 0xff10\n\ + .word gTrainerFrontPicPaletteTable\n\ + .word gTrainerFrontPicTable\n\ + .word 0x3ff\n\ + .word 0xfffffc00\n\ + .word sub_80313A0+1\n\ + .word gBattleBankFunc\n\ + .word sub_8032B4C+1"); +} +#else void OpponentHandleTrainerThrow(void) { u32 trainerPicIndex; @@ -1238,6 +1475,7 @@ void OpponentHandleTrainerThrow(void) gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_8032B4C; } +#endif void OpponentHandleTrainerSlide(void) { @@ -1427,6 +1665,315 @@ void OpponentHandlecmd19(void) OpponentBufferExecCompleted(); } +#if DEBUG +__attribute__((naked)) +void OpponentHandlecmd20(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + ldr r6, ._549\n\ + ldrb r0, [r6]\n\ + lsl r0, r0, #0x9\n\ + ldr r1, ._549 + 4\n\ + add r5, r0, r1\n\ + ldr r2, ._549 + 8\n\ + ldrb r1, [r2]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + mov sl, r6\n\ + cmp r0, #0\n\ + beq ._546 @cond_branch\n\ + ldr r0, ._549 + 12\n\ + mov r9, r0\n\ + ldr r1, ._549 + 16\n\ + mov ip, r1\n\ + add r7, r6, #0\n\ + mov r0, #0x2\n\ + mov r8, r0\n\ + ldr r6, ._549 + 20\n\ +._552:\n\ + ldrb r1, [r7]\n\ + mov r0, r8\n\ + and r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x19\n\ + add r0, r0, r6\n\ + mov r1, ip\n\ + add r3, r0, r1\n\ + ldrb r1, [r3]\n\ + lsl r0, r1, #0x1\n\ + add r0, r5, r0\n\ + ldrh r2, [r0]\n\ + add r4, r1, #0\n\ + cmp r2, #0\n\ + beq ._547 @cond_branch\n\ + add r0, r4, #1\n\ + strb r0, [r3]\n\ + b ._548\n\ +._550:\n\ + .align 2, 0\n\ +._549:\n\ + .word gActiveBank\n\ + .word gUnknown_02023A64\n\ + .word gUnknown_02023A14+0x50\n\ + .word gBattleMoves\n\ + .word +0x2000000\n\ + .word 0x1609e\n\ +._547:\n\ + strb r2, [r3]\n\ +._548:\n\ + ldrb r0, [r7]\n\ + mov r1, r8\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x19\n\ + add r1, r1, r6\n\ + add r1, r1, ip\n\ + ldrb r0, [r1]\n\ + cmp r0, #0x3\n\ + bls ._551 @cond_branch\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ +._551:\n\ + cmp r2, #0\n\ + beq ._552 @cond_branch\n\ + lsl r0, r2, #0x1\n\ + add r0, r0, r2\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r9\n\ + ldrb r3, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._553 @cond_branch\n\ + mov r1, sl\n\ + ldrb r0, [r1]\n\ + b ._561\n\ +._553:\n\ + ldr r0, ._559\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._557 @cond_branch\n\ + ldr r0, ._559 + 4\n\ + ldrb r1, [r0]\n\ + mov r5, #0x2\n\ + add r0, r5, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._556 @cond_branch\n\ + cmp r3, #0\n\ + bne ._557 @cond_branch\n\ + mov r1, sl\n\ + ldrb r0, [r1]\n\ + bl GetBankIdentity\n\ + mov r1, #0x2\n\ + eor r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + b ._558\n\ +._560:\n\ + .align 2, 0\n\ +._559:\n\ + .word gBattleTypeFlags\n\ + .word gUnknown_02023A14+0x50\n\ +._556:\n\ + bl Random\n\ + add r1, r5, #0\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x10\n\ + lsr r0, r1, #0x10\n\ + b ._561\n\ +._557:\n\ + mov r0, #0x0\n\ +._558:\n\ + bl GetBankByIdentity\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ +._561:\n\ + lsl r2, r0, #0x8\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ +._569:\n\ + bl Emitcmd33\n\ +._573:\n\ + bl OpponentBufferExecCompleted\n\ + b ._562\n\ +._546:\n\ + ldr r0, ._567\n\ + ldrh r1, [r0]\n\ + mov r0, #0x93\n\ + lsl r0, r0, #0x3\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._563 @cond_branch\n\ + bl BattleAI_SetupAIData\n\ + bl BattleAI_GetAIActionToUse\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0x4\n\ + beq ._564 @cond_branch\n\ + cmp r4, #0x5\n\ + bne ._565 @cond_branch\n\ + mov r0, #0x1\n\ + mov r1, #0x4\n\ + b ._566\n\ +._568:\n\ + .align 2, 0\n\ +._567:\n\ + .word gBattleTypeFlags\n\ +._564:\n\ + mov r0, #0x1\n\ + mov r1, #0x3\n\ +._566:\n\ + mov r2, #0x0\n\ + b ._569\n\ +._565:\n\ + ldr r3, ._574\n\ + lsl r0, r4, #0x1\n\ + add r2, r5, r0\n\ + ldrh r1, [r2]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._570 @cond_branch\n\ + ldr r1, ._574 + 4\n\ + ldrb r0, [r6]\n\ + strb r0, [r1]\n\ +._570:\n\ + ldrh r1, [r2]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._572 @cond_branch\n\ + mov r0, #0x0\n\ + bl GetBankByIdentity\n\ + ldr r5, ._574 + 4\n\ + strb r0, [r5]\n\ + ldr r0, ._574 + 8\n\ + ldrb r1, [r0]\n\ + ldr r2, ._574 + 12\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + and r1, r1, r0\n\ + cmp r1, #0\n\ + beq ._572 @cond_branch\n\ + mov r0, #0x2\n\ + bl GetBankByIdentity\n\ + strb r0, [r5]\n\ +._572:\n\ + ldr r0, ._574 + 4\n\ + ldrb r2, [r0]\n\ + lsl r2, r2, #0x8\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ + b ._573\n\ +._575:\n\ + .align 2, 0\n\ +._574:\n\ + .word gBattleMoves\n\ + .word gBankTarget\n\ + .word gAbsentBankFlags\n\ + .word gBitTable\n\ +._563:\n\ + mov r6, #0x3\n\ +._576:\n\ + bl Random\n\ + add r4, r0, #0\n\ + and r4, r4, r6\n\ + lsl r0, r4, #0x1\n\ + add r0, r5, r0\n\ + ldrh r2, [r0]\n\ + cmp r2, #0\n\ + beq ._576 @cond_branch\n\ + ldr r1, ._579\n\ + lsl r0, r2, #0x1\n\ + add r0, r0, r2\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._577 @cond_branch\n\ + ldr r0, ._579 + 4\n\ + ldrb r2, [r0]\n\ + lsl r2, r2, #0x8\n\ + b ._578\n\ +._580:\n\ + .align 2, 0\n\ +._579:\n\ + .word gBattleMoves\n\ + .word gActiveBank\n\ +._577:\n\ + ldr r0, ._583\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._581 @cond_branch\n\ + bl Random\n\ + mov r1, #0x2\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + add r0, r1, #0\n\ + bl GetBankByIdentity\n\ + add r2, r0, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r2, r2, #0x10\n\ +._578:\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ + b ._582\n\ +._584:\n\ + .align 2, 0\n\ +._583:\n\ + .word gBattleTypeFlags\n\ +._581:\n\ + mov r0, #0x0\n\ + bl GetBankByIdentity\n\ + add r2, r0, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r2, r2, #0x10\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ +._582:\n\ + bl OpponentBufferExecCompleted\n\ +._562:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0"); +} +#else #ifdef NONMATCHING void OpponentHandlecmd20(void) { @@ -1670,6 +2217,7 @@ _0803558A:\n\ .syntax divided\n"); } #endif +#endif void OpponentHandleOpenBag(void) { diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index 4063aee3a..d40c31b1b 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -41,7 +41,7 @@ extern struct u8 field1; } gUnknown_020297D8; -static void sub_8082F20(u8 taskId); +/*static*/ void sub_8082F20(u8 taskId); static void sub_8082F68(u8 taskId); static void sub_8082FEC(u8 taskId); static void sub_808303C(u8 taskId); @@ -414,6 +414,63 @@ void debug_sub_808A55C() } #endif +#if DEBUG +__attribute__((naked)) +static void sub_8082CD4(u8 arg0, u8 arg1) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + lsl r1, r1, #0x18\n\ + lsr r6, r1, #0x18\n\ + mov r0, #0xc\n\ + mov r1, #0x0\n\ + mov r2, #0x1f\n\ + mov r3, #0x2\n\ + bl InitLinkTestBG_Unused\n\ + ldr r4, ._40\n\ + add r0, r4, #0\n\ + bl FindTaskIdByFunc\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xff\n\ + bne ._39 @cond_branch\n\ + add r0, r4, #0\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + add r4, r0, #0\n\ + lsl r4, r4, #0x18\n\ + lsr r4, r4, #0x18\n\ + ldr r5, ._40 + 4\n\ + lsl r0, r4, #0x2\n\ + add r0, r0, r4\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r5\n\ + strh r7, [r0, #0xa]\n\ + strh r6, [r0, #0xc]\n\ + ldr r0, ._40 + 8\n\ + mov r1, #0x50\n\ + bl CreateTask\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r5\n\ + strh r4, [r1, #0x8]\n\ +._39:\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._41:\n\ + .align 2, 0\n\ +._40:\n\ + .word sub_8082F20+1\n\ + .word gTasks\n\ + .word debug_sub_808A55C+1"); +} +#else static void sub_8082CD4(u8 arg0, u8 arg1) { if (FindTaskIdByFunc(sub_8082F20) == 0xFF) @@ -424,6 +481,7 @@ static void sub_8082CD4(u8 arg0, u8 arg1) gTasks[taskId].data[2] = arg1; } } +#endif static void sub_8082D18(u32 value) { @@ -526,7 +584,7 @@ void unref_sub_8082EEC(u8 taskId) } } -static void sub_8082F20(u8 taskId) +/*static*/ void sub_8082F20(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -1316,6 +1374,7 @@ void unref_sub_8083CC8(u8 taskId) #if DEBUG +__attribute__((naked)) void debug_sub_808B82C() { asm("\ @@ -1329,6 +1388,7 @@ void debug_sub_808B82C() .word unk_2030220"); } +__attribute__((naked)) void debug_sub_808B838(u8 a) { asm("\ @@ -1347,6 +1407,7 @@ void debug_sub_808B838(u8 a) .word unk_2030220"); } +__attribute__((naked)) int debug_sub_808B850() { asm("\ diff --git a/src/field/party_menu.c b/src/field/party_menu.c index 75c0cba78..e26b801bc 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -94,9 +94,9 @@ static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite); static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId); static void ItemUseMoveMenu_HandleCancel(u8 taskId); static bool8 SetupDefaultPartyMenu(void); -static void sub_806B4A8(void); -static void VBlankCB_PartyMenu(void); -static bool8 LoadPartyMenuGraphics(u8 a); +/*static*/ void sub_806B4A8(void); +/*static*/ void VBlankCB_PartyMenu(void); +/*static*/ bool8 LoadPartyMenuGraphics(u8 a); static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d); static void sub_806BB9C(u8 a); static void sub_806BBEC(u8 a); @@ -493,6 +493,71 @@ extern const u8 gStatusPal_Icons[]; #define WINDOW_RIGHT (29) #endif +#if DEBUG +__attribute__((naked)) +void CB2_PartyMenuMain(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + add sp, sp, #0xfffffffc\n\ + bl AnimateSprites\n\ + bl BuildOamBuffer\n\ + ldr r0, ._3\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x4\n\ + ldr r1, ._3 + 4\n\ + add r5, r0, r1\n\ + mov r6, #0x0\n\ +._1:\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x3\n\ + ldrb r1, [r5, #0x1]\n\ + lsl r1, r1, #0x3\n\ + ldr r2, [r5, #0x4]\n\ + lsl r3, r6, #0x5\n\ + mov r4, #0x80\n\ + lsl r4, r4, #0x2\n\ + orr r3, r3, r4\n\ + str r3, [sp]\n\ + mov r3, #0x0\n\ + bl DrawPartyMenuMonText\n\ + add r5, r5, #0x8\n\ + add r6, r6, #0x1\n\ + cmp r6, #0x5\n\ + ble ._1 @cond_branch\n\ + bl RunTasks\n\ + bl UpdatePaletteFade\n\ + ldr r0, ._3 + 8\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._2 @cond_branch\n\ + ldr r0, ._3 + 12\n\ + ldr r1, ._3 + 16\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x2\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._2:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._4:\n\ + .align 2, 0\n\ +._3:\n\ + .word gPartyMenuType\n\ + .word PartyMonTextSettings\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void CB2_PartyMenuMain(void) { const struct PartyMonTextSettingsStruct *textSettings; @@ -517,6 +582,7 @@ void CB2_PartyMenuMain(void) RunTasks(); UpdatePaletteFade(); } +#endif void VBlankCB_PartyMenu(void) { @@ -621,6 +687,425 @@ bool8 SetupDefaultPartyMenu(void) return FALSE; } +#if DEBUG +__attribute__((naked)) +bool8 InitPartyMenu(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + add sp, sp, #0xfffffff4\n\ + ldr r0, ._55\n\ + ldr r1, ._55 + 4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x11\n\ + bls ._53 @cond_branch\n\ + b ._125\n\ +._53:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._55 + 8\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._56:\n\ + .align 2, 0\n\ +._55:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._57\n\ +._57:\n\ + .word ._58\n\ + .word ._59\n\ + .word ._60\n\ + .word ._61\n\ + .word ._62\n\ + .word ._63\n\ + .word ._64\n\ + .word ._65\n\ + .word ._66\n\ + .word ._67\n\ + .word ._68\n\ + .word ._69\n\ + .word ._70\n\ + .word ._71\n\ + .word ._72\n\ + .word ._73\n\ + .word ._74\n\ + .word ._75\n\ +._58:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + mov r3, #0xc0\n\ + lsl r3, r3, #0x13\n\ + mov r4, #0xc0\n\ + lsl r4, r4, #0x9\n\ + add r2, sp, #0x8\n\ + mov r8, r2\n\ + add r2, sp, #0x4\n\ + mov r6, #0x0\n\ + ldr r1, ._78\n\ + mov r5, #0x80\n\ + lsl r5, r5, #0x5\n\ + ldr r7, ._78 + 4\n\ + mov r0, #0x81\n\ + lsl r0, r0, #0x18\n\ + mov ip, r0\n\ +._76:\n\ + strh r6, [r2]\n\ + add r0, sp, #0x4\n\ + str r0, [r1]\n\ + str r3, [r1, #0x4]\n\ + str r7, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + add r3, r3, r5\n\ + sub r4, r4, r5\n\ + cmp r4, r5\n\ + bhi ._76 @cond_branch\n\ + strh r6, [r2]\n\ + add r2, sp, #0x4\n\ + str r2, [r1]\n\ + str r3, [r1, #0x4]\n\ + lsr r0, r4, #0x1\n\ + mov r3, ip\n\ + orr r0, r0, r3\n\ + str r0, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + mov r0, #0xe0\n\ + lsl r0, r0, #0x13\n\ + mov r3, #0x80\n\ + lsl r3, r3, #0x3\n\ + mov r4, #0x0\n\ + str r4, [sp, #0x8]\n\ + ldr r2, ._78\n\ + mov r1, r8\n\ + str r1, [r2]\n\ + str r0, [r2, #0x4]\n\ + lsr r0, r3, #0x2\n\ + mov r1, #0x85\n\ + lsl r1, r1, #0x18\n\ + orr r0, r0, r1\n\ + str r0, [r2, #0x8]\n\ + ldr r0, [r2, #0x8]\n\ + mov r1, #0xa0\n\ + lsl r1, r1, #0x13\n\ + add r0, sp, #0x4\n\ + strh r4, [r0]\n\ + str r0, [r2]\n\ + str r1, [r2, #0x4]\n\ + lsr r3, r3, #0x1\n\ + mov r0, #0x81\n\ + lsl r0, r0, #0x18\n\ + orr r3, r3, r0\n\ + str r3, [r2, #0x8]\n\ + ldr r0, [r2, #0x8]\n\ + ldr r2, ._78 + 8\n\ + ldrb r0, [r2, #0x8]\n\ + mov r1, #0x80\n\ + orr r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._78 + 12\n\ + ldr r2, ._78 + 16\n\ + add r1, r1, r2\n\ + b ._122\n\ +._79:\n\ + .align 2, 0\n\ +._78:\n\ + .word 0x40000d4\n\ + .word 0x81000800\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._59:\n\ + bl ScanlineEffect_Stop\n\ + b ._115\n\ +._60:\n\ + bl sub_806B4A8\n\ + ldr r1, ._82\n\ + mov r2, #0x99\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + mov r2, #0x0\n\ + strh r2, [r0]\n\ + ldr r3, ._82 + 4\n\ + add r0, r1, r3\n\ + strh r2, [r0]\n\ + mov r0, #0x9a\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + strh r2, [r1]\n\ + ldr r1, ._82 + 8\n\ + ldr r2, ._82 + 12\n\ + add r1, r1, r2\n\ + b ._122\n\ +._83:\n\ + .align 2, 0\n\ +._82:\n\ + .word +0x201b000\n\ + .word 0x266\n\ + .word gMain\n\ + .word 0x43c\n\ +._61:\n\ + bl ResetSpriteData\n\ + b ._115\n\ +._62:\n\ + ldr r0, ._88\n\ + mov r1, #0x96\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._86 @cond_branch\n\ + cmp r0, #0x5\n\ + beq ._86 @cond_branch\n\ + bl ResetTasks\n\ +._86:\n\ + ldr r1, ._88 + 4\n\ + ldr r2, ._88 + 8\n\ + add r1, r1, r2\n\ + b ._122\n\ +._89:\n\ + .align 2, 0\n\ +._88:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._63:\n\ + bl FreeAllSpritePalettes\n\ + b ._115\n\ +._64:\n\ + ldr r4, ._92\n\ + mov r1, #0x97\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + mov r2, #0x98\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + strb r0, [r1]\n\ + b ._115\n\ +._93:\n\ + .align 2, 0\n\ +._92:\n\ + .word +0x201b000\n\ +._65:\n\ + ldr r0, ._95\n\ + bl Text_LoadWindowTemplate\n\ + ldr r1, ._95 + 4\n\ + ldr r0, ._95 + 8\n\ + add r1, r1, r0\n\ + b ._122\n\ +._96:\n\ + .align 2, 0\n\ +._95:\n\ + .word gWindowTemplate_81E6C90\n\ + .word gMain\n\ + .word 0x43c\n\ +._66:\n\ + ldr r4, ._98\n\ + ldr r1, ._98 + 4\n\ + add r0, r4, #0\n\ + bl Text_InitWindowWithTemplate\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl MultistepInitWindowTileData\n\ + ldr r1, ._98 + 8\n\ + ldr r2, ._98 + 12\n\ + add r1, r1, r2\n\ + b ._122\n\ +._99:\n\ + .align 2, 0\n\ +._98:\n\ + .word gUnknown_03004210\n\ + .word gWindowTemplate_81E6C90\n\ + .word gMain\n\ + .word 0x43c\n\ +._67:\n\ + bl MultistepLoadFont\n\ + cmp r0, #0\n\ + bne ._100 @cond_branch\n\ + b ._125\n\ +._100:\n\ + ldr r0, ._103\n\ + mov r3, #0x99\n\ + lsl r3, r3, #0x2\n\ + add r0, r0, r3\n\ + mov r1, #0x1\n\ + strh r1, [r0]\n\ + ldr r1, ._103 + 4\n\ + ldr r0, ._103 + 8\n\ + add r1, r1, r0\n\ + b ._122\n\ +._104:\n\ + .align 2, 0\n\ +._103:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._68:\n\ + ldr r0, ._107\n\ + mov r1, #0x99\n\ + lsl r1, r1, #0x2\n\ + add r4, r0, r1\n\ + ldrb r0, [r4]\n\ + bl LoadPartyMenuGraphics\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._105 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r4]\n\ + ldr r1, ._107 + 4\n\ + ldr r2, ._107 + 8\n\ + add r1, r1, r2\n\ + b ._122\n\ +._108:\n\ + .align 2, 0\n\ +._107:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._105:\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._125\n\ +._69:\n\ + bl sub_809D51C\n\ + b ._115\n\ +._70:\n\ + ldr r2, ._113\n\ + ldr r0, ._113 + 4\n\ + mov r1, #0x96\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r2, r2, #0x4\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cf4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._125 @cond_branch\n\ + ldr r1, ._113 + 8\n\ + ldr r2, ._113 + 12\n\ + add r1, r1, r2\n\ + b ._122\n\ +._114:\n\ + .align 2, 0\n\ +._113:\n\ + .word PartyMenuHandlers\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._71:\n\ + ldr r0, ._116\n\ + bl MultistepInitMenuWindowBegin\n\ + b ._115\n\ +._117:\n\ + .align 2, 0\n\ +._116:\n\ + .word gWindowTemplate_81E6CC8\n\ +._72:\n\ + bl MultistepInitMenuWindowContinue\n\ + cmp r0, #0\n\ + beq ._125 @cond_branch\n\ + ldr r1, ._120\n\ + ldr r0, ._120 + 4\n\ + add r1, r1, r0\n\ + b ._122\n\ +._121:\n\ + .align 2, 0\n\ +._120:\n\ + .word gMain\n\ + .word 0x43c\n\ +._73:\n\ + ldr r0, ._123\n\ + ldr r1, ._123 + 4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x0\n\ + bl PrintPartyMenuPromptText\n\ + ldr r1, ._123 + 8\n\ + ldr r2, ._123 + 12\n\ + add r1, r1, r2\n\ + b ._122\n\ +._124:\n\ + .align 2, 0\n\ +._123:\n\ + .word +0x201b000\n\ + .word 0x259\n\ + .word gMain\n\ + .word 0x43c\n\ +._74:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r2, ._126\n\ + ldrb r1, [r2, #0x8]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ +._115:\n\ + ldr r1, ._126 + 4\n\ + ldr r3, ._126 + 8\n\ + add r1, r1, r3\n\ +._122:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._125\n\ +._127:\n\ + .align 2, 0\n\ +._126:\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._75:\n\ + ldr r0, ._130\n\ + bl SetVBlankCallback\n\ + ldr r0, ._130 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._128 @cond_branch\n\ + ldr r0, ._130 + 8\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x8\n\ + ldr r2, ._130 + 12\n\ + mov r3, #0x2\n\ + bl debug_sub_8008218\n\ +._128:\n\ + mov r0, #0x1\n\ + b ._129\n\ +._131:\n\ + .align 2, 0\n\ +._130:\n\ + .word VBlankCB_PartyMenu+1\n\ + .word gLinkOpen\n\ + .word 0x600e5e0\n\ + .word 0x6007800\n\ +._125:\n\ + mov r0, #0x0\n\ +._129:\n\ + add sp, sp, #0xc\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r1}\n\ + bx r1"); +} +#else bool8 InitPartyMenu(void) { u8 *addr; @@ -744,6 +1229,7 @@ bool8 InitPartyMenu(void) return FALSE; } +#endif void CB2_InitPartyMenu(void) { diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c index 2b3405640..34d816387 100644 --- a/src/pokemon/pokemon_menu.c +++ b/src/pokemon/pokemon_menu.c @@ -954,6 +954,97 @@ void debug_sub_80986AC() } #endif +#if DEBUG +__attribute__((naked)) +static void sub_808AE8C(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + ldr r0, ._281\n\ + ldrb r0, [r0]\n\ + sub r0, r0, #0x21\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + mov r5, #0x0\n\ +._287:\n\ + mov r0, #0x64\n\ + add r1, r5, #0\n\ + mul r1, r1, r0\n\ + ldr r0, ._281 + 4\n\ + add r4, r1, r0\n\ + add r0, r4, #0\n\ + mov r1, #0xb\n\ + bl GetMonData\n\ + cmp r0, #0\n\ + beq ._284 @cond_branch\n\ + add r0, r5, #0\n\ + bl sub_806D668\n\ + ldr r0, ._281 + 8\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._279 @cond_branch\n\ + add r0, r4, #0\n\ + mov r1, #0x2d\n\ + bl GetMonData\n\ + cmp r0, #0\n\ + bne ._278 @cond_branch\n\ + add r0, r4, #0\n\ + add r1, r6, #0\n\ + bl CanMonLearnTMHM\n\ + cmp r0, #0\n\ + bne ._279 @cond_branch\n\ +._278:\n\ + add r0, r5, #0\n\ + mov r1, #0x9a\n\ + bl sub_806BC3C\n\ + b ._284\n\ +._282:\n\ + .align 2, 0\n\ +._281:\n\ + .word gSpecialVar_ItemId\n\ + .word gPlayerParty\n\ + .word gUnknown_020297ED\n\ +._279:\n\ + mov r0, #0x64\n\ + add r4, r5, #0\n\ + mul r4, r4, r0\n\ + ldr r0, ._285\n\ + add r4, r4, r0\n\ + ldr r0, ._285 + 4\n\ + ldrh r0, [r0]\n\ + bl ItemIdToBattleMoveId\n\ + add r1, r0, #0\n\ + lsl r1, r1, #0x10\n\ + lsr r1, r1, #0x10\n\ + add r0, r4, #0\n\ + bl pokemon_has_move\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._283 @cond_branch\n\ + add r0, r5, #0\n\ + mov r1, #0xa8\n\ + bl sub_806BC3C\n\ + b ._284\n\ +._286:\n\ + .align 2, 0\n\ +._285:\n\ + .word gPlayerParty\n\ + .word gSpecialVar_ItemId\n\ +._283:\n\ + add r0, r5, #0\n\ + mov r1, #0x8c\n\ + bl sub_806BC3C\n\ +._284:\n\ + add r0, r5, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + cmp r5, #0x5\n\ + bls ._287 @cond_branch\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0"); +} +#else static void sub_808AE8C(void) { u8 i; @@ -972,6 +1063,7 @@ static void sub_808AE8C(void) } } } +#endif static void sub_808AF20(void) { diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index b59d02939..a93313e37 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -278,8 +278,8 @@ static bool8 Blender_PrintBlendingResults(void); static void sub_80510E8(void); static void sub_8050E30(void); static void sub_805197C(u16 a0, u16 a1); -static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst); -static void sub_8052BD0(u8 taskID); +/*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst); +/*static*/ void sub_8052BD0(u8 taskID); static void sub_8052AF8(void); static void sub_804F8C8(u8 taskID); static void sub_804F9F4(u8 taskID); @@ -2446,7 +2446,7 @@ static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavours, a4); } -static void sub_8050760(void) +/*static*/ void sub_8050760(void) { u32 frames = (u16)(gBerryBlenderData->gameFrameTime); u16 max_RPM = gBerryBlenderData->max_RPM; @@ -3305,12 +3305,20 @@ static void sub_8051C04(struct Sprite* sprite) sprite->pos2.y = -(gBerryBlenderData->field_146); } -static void Blender_TrySettingRecord(void) +/*static*/ void Blender_TrySettingRecord(void) { if (gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] < gBerryBlenderData->max_RPM) gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] = gBerryBlenderData->max_RPM; } +#if DEBUG +__attribute__((naked)) +static bool8 Blender_PrintBlendingResults(void) +{ + // TODO: disassemble this! + asm(".incbin \"baserom_de_debug.gba\", 0x56178, 0x5655C-0x56178"); +} +#else static bool8 Blender_PrintBlendingResults(void) { u16 i; @@ -3445,8 +3453,9 @@ static bool8 Blender_PrintBlendingResults(void) } return FALSE; } +#endif -static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) +/*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) { u8 text[12]; u8 flavourLvl, feel; @@ -3869,7 +3878,7 @@ void ShowBerryBlenderRecordWindow(void) } } -static void sub_8052BD0(u8 taskID) +/*static*/ void sub_8052BD0(u8 taskID) { if (gTasks[taskID].data[0] == 0) { -- cgit v1.2.3 From 2ca829a4abda20bb1b053f50a9f1c9b6c8e93223 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 18 Jan 2018 13:06:47 -0600 Subject: add more debug code --- src/contest.c | 840 ++++++ src/field/bike.c | 15 +- src/field/secret_base.c | 173 ++ src/field/shop.c | 21 + src/pokemon/pokemon_summary_screen.c | 552 +++- src/pokenav_before.c | 5192 +++++++++++++++++++++++++++++++++- 6 files changed, 6769 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/contest.c b/src/contest.c index 972c19c2c..d559ca81f 100644 --- a/src/contest.c +++ b/src/contest.c @@ -611,6 +611,35 @@ void sub_80AB9A0(u8 taskId) } } +#if DEBUG +__attribute__((naked)) +void ContestMainCallback2(void) +{ + asm("\ + push {lr}\n\ + ldr r0, ._122\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._121 @cond_branch\n\ + ldr r0, ._122 + 4\n\ + ldrh r0, [r0, #0x2e]\n\ + cmp r0, #0x4\n\ + bne ._121 @cond_branch\n\ + bl unref_sub_80B0CF4\n\ +._121:\n\ + bl AnimateSprites\n\ + bl RunTasks\n\ + bl BuildOamBuffer\n\ + bl UpdatePaletteFade\n\ + pop {r0}\n\ + bx r0\n\ +._123:\n\ + .align 2, 0\n\ +._122:\n\ + .word gUnknown_020297ED\n\ + .word gMain"); +} +#else void ContestMainCallback2(void) { AnimateSprites(); @@ -618,6 +647,7 @@ void ContestMainCallback2(void) BuildOamBuffer(); UpdatePaletteFade(); } +#endif void ContestVBlankCallback(void) { @@ -733,6 +763,272 @@ void sub_80ABCDC(u8 taskId) } // Handle move selection input +#if DEBUG +__attribute__((naked)) +void sub_80ABEA0(u8 taskId) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add sp, sp, #0xfffffff8\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + mov r6, #0x0\n\ + ldr r0, ._161\n\ + mov ip, r0\n\ + ldr r4, ._161 + 4\n\ + ldr r3, ._161 + 8\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x6\n\ + mov r1, ip\n\ + add r1, r1, #0x1e\n\ + add r1, r0, r1\n\ + mov r2, #0x3\n\ +._158:\n\ + ldrh r0, [r1]\n\ + cmp r0, #0\n\ + beq ._157 @cond_branch\n\ + add r0, r6, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ +._157:\n\ + add r1, r1, #0x2\n\ + sub r2, r2, #0x1\n\ + cmp r2, #0\n\ + bge ._158 @cond_branch\n\ + ldrh r0, [r3, #0x2e]\n\ + mov r5, #0x1\n\ + and r5, r5, r0\n\ + cmp r5, #0\n\ + beq ._159 @cond_branch\n\ + bl DestroyMenuCursor\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._161 + 12\n\ + lsl r1, r7, #0x2\n\ + add r1, r1, r7\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r0\n\ + ldr r0, ._161 + 16\n\ + b ._160\n\ +._162:\n\ + .align 2, 0\n\ +._161:\n\ + .word gContestMons\n\ + .word gContestPlayerMonIndex\n\ + .word gMain\n\ + .word gTasks\n\ + .word sub_80AC0C8+1\n\ +._159:\n\ + ldrh r0, [r3, #0x30]\n\ + cmp r0, #0x10\n\ + bne ._163 @cond_branch\n\ + b ._196\n\ +._163:\n\ + cmp r0, #0x10\n\ + bgt ._165 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._166 @cond_branch\n\ + cmp r0, #0x8\n\ + bne ._167 @cond_branch\n\ + b ._168\n\ +._167:\n\ + b ._196\n\ +._165:\n\ + cmp r0, #0x40\n\ + beq ._170 @cond_branch\n\ + cmp r0, #0x40\n\ + bgt ._171 @cond_branch\n\ + b ._196\n\ +._171:\n\ + cmp r0, #0x80\n\ + beq ._173 @cond_branch\n\ + b ._196\n\ +._166:\n\ + bl sub_814A904\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0x0\n\ + bl sub_80AFFE0\n\ + ldr r0, ._177\n\ + ldr r1, ._177 + 4\n\ + ldrb r2, [r1]\n\ + ldrb r3, [r1, #0x1]\n\ + ldrb r4, [r1, #0x2]\n\ + str r4, [sp]\n\ + ldrb r1, [r1, #0x3]\n\ + str r1, [sp, #0x4]\n\ + mov r1, #0x0\n\ + bl Text_FillWindowRectDefPalette\n\ + ldr r0, ._177 + 8\n\ + ldrb r0, [r0]\n\ + bl Contest_IsMonsTurnDisabled\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._175 @cond_branch\n\ + ldr r0, ._177 + 12\n\ + ldr r1, ._177 + 16\n\ + bl StringCopy\n\ + b ._176\n\ +._178:\n\ + .align 2, 0\n\ +._177:\n\ + .word gUnknown_03004210\n\ + .word gUnknown_083CA340\n\ + .word gContestPlayerMonIndex\n\ + .word gDisplayedStringBattle\n\ + .word gText_Contest_WhichMoveWillBePlayed\n\ +._175:\n\ + ldr r0, ._180\n\ + ldr r1, ._180 + 4\n\ + bl StringCopy\n\ +._176:\n\ + ldr r5, ._180\n\ + ldr r0, ._180 + 8\n\ + ldrb r1, [r0, #0x1]\n\ + add r1, r1, #0x1\n\ + add r0, r5, #0\n\ + bl InsertStringDigit\n\ + bl sub_80AF138\n\ + ldr r4, ._180 + 12\n\ + add r0, r4, #0\n\ + add r1, r5, #0\n\ + bl StringExpandPlaceholders\n\ + ldr r0, ._180 + 16\n\ + mov r2, #0xc2\n\ + lsl r2, r2, #0x2\n\ + mov r1, #0xf\n\ + str r1, [sp]\n\ + add r1, r4, #0\n\ + mov r3, #0x1\n\ + bl Text_InitWindowAndPrintText\n\ + ldr r0, ._180 + 20\n\ + mov r1, #0x0\n\ + strh r1, [r0]\n\ + ldr r0, ._180 + 24\n\ + strh r1, [r0]\n\ + ldr r1, ._180 + 28\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r1\n\ + ldr r1, ._180 + 32\n\ + str r1, [r0]\n\ + b ._196\n\ +._181:\n\ + .align 2, 0\n\ +._180:\n\ + .word gDisplayedStringBattle\n\ + .word gText_Contest_ButItCantParticipate\n\ + .word +0x2019204\n\ + .word gStringVar4\n\ + .word gMenuWindow\n\ + .word gBattle_BG0_Y\n\ + .word gBattle_BG2_Y\n\ + .word gTasks\n\ + .word sub_80ABC70+1\n\ +._170:\n\ + ldr r4, ._184\n\ + mov r0, #0x0\n\ + ldsb r0, [r4, r0]\n\ + bl nullsub_17\n\ + ldrb r0, [r4]\n\ + cmp r0, #0\n\ + bne ._182 @cond_branch\n\ + sub r0, r6, #1\n\ + b ._186\n\ +._185:\n\ + .align 2, 0\n\ +._184:\n\ + .word +0x2019204\n\ +._182:\n\ + sub r0, r0, #0x1\n\ + b ._186\n\ +._173:\n\ + ldr r4, ._189\n\ + mov r0, #0x0\n\ + ldsb r0, [r4, r0]\n\ + bl nullsub_17\n\ + ldrb r1, [r4]\n\ + sub r0, r6, #1\n\ + cmp r1, r0\n\ + bne ._187 @cond_branch\n\ + strb r5, [r4]\n\ + b ._188\n\ +._190:\n\ + .align 2, 0\n\ +._189:\n\ + .word +0x2019204\n\ +._187:\n\ + add r0, r1, #1\n\ +._186:\n\ + strb r0, [r4]\n\ +._188:\n\ + ldr r4, ._193\n\ + mov r0, #0x0\n\ + ldsb r0, [r4, r0]\n\ + bl sub_80AC0AC\n\ + bl sub_80AED58\n\ + ldr r2, ._193 + 4\n\ + ldrb r1, [r4]\n\ + lsl r1, r1, #0x1\n\ + ldr r0, ._193 + 8\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x6\n\ + add r1, r1, r0\n\ + add r2, r2, #0x1e\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + bl sub_80AEBEC\n\ + cmp r6, #0x1\n\ + bls ._196 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + b ._196\n\ +._194:\n\ + .align 2, 0\n\ +._193:\n\ + .word +0x2019204\n\ + .word gContestMons\n\ + .word gContestPlayerMonIndex\n\ +._168:\n\ + ldr r0, ._197\n\ + ldrb r1, [r0]\n\ + cmp r1, #0x1\n\ + bne ._196 @cond_branch\n\ + ldr r0, ._197 + 4\n\ + ldrb r0, [r0]\n\ + add r2, r0, #0\n\ + and r2, r2, r1\n\ + cmp r2, #0\n\ + bne ._196 @cond_branch\n\ + ldr r0, ._197 + 8\n\ + lsl r1, r7, #0x2\n\ + add r1, r1, r7\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r0\n\ + strh r2, [r1, #0x8]\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x6\n\ + add r0, r0, ip\n\ + ldrh r0, [r0, #0x1e]\n\ + strh r0, [r1, #0xa]\n\ + ldr r0, ._197 + 12\n\ +._160:\n\ + str r0, [r1]\n\ +._196:\n\ + add sp, sp, #0x8\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._198:\n\ + .align 2, 0\n\ +._197:\n\ + .word gUnknown_020297ED\n\ + .word gIsLinkContest\n\ + .word gTasks\n\ + .word debug_sub_80B9EBC+1"); +} +#else void sub_80ABEA0(u8 taskId) { u8 numMoves = 0; @@ -807,6 +1103,550 @@ void sub_80ABEA0(u8 taskId) } } } +#endif + +#if DEBUG +__attribute__((naked)) +void debug_sub_80B9EBC() +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + add sp, sp, #0xffffff94\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + ldr r1, ._202\n\ + lsl r0, r4, #0x2\n\ + add r0, r0, r4\n\ + lsl r0, r0, #0x3\n\ + add r7, r0, r1\n\ + mov r0, #0x8\n\ + ldsh r2, [r7, r0]\n\ + cmp r2, #0\n\ + beq ._199 @cond_branch\n\ + cmp r2, #0x1\n\ + beq ._200 @cond_branch\n\ + b ._229\n\ +._203:\n\ + .align 2, 0\n\ +._202:\n\ + .word gTasks\n\ +._199:\n\ + ldr r5, ._205\n\ + ldr r4, ._205 + 4\n\ + ldrb r0, [r4]\n\ + mov r8, r0\n\ + ldrb r6, [r4, #0x1]\n\ + ldrb r0, [r4, #0x2]\n\ + str r0, [sp]\n\ + ldrb r0, [r4, #0x3]\n\ + str r0, [sp, #0x4]\n\ + add r0, r5, #0\n\ + mov r1, #0x0\n\ + mov r2, r8\n\ + add r3, r6, #0\n\ + bl Text_FillWindowRectDefPalette\n\ + mov r0, #0xa\n\ + ldsh r1, [r7, r0]\n\ + mov r0, #0xd\n\ + mul r1, r1, r0\n\ + ldr r0, ._205 + 8\n\ + add r1, r1, r0\n\ + mov r2, #0xc2\n\ + lsl r2, r2, #0x2\n\ + str r6, [sp]\n\ + add r0, r5, #0\n\ + mov r3, r8\n\ + bl Text_InitWindowAndPrintText\n\ + mov r0, #0xa\n\ + ldsh r1, [r7, r0]\n\ + add r0, sp, #0x8\n\ + mov r2, #0x2\n\ + mov r3, #0x3\n\ + bl ConvertIntToDecimalStringN\n\ + mov r2, #0xc7\n\ + lsl r2, r2, #0x2\n\ + ldrb r3, [r4, #0x4]\n\ + ldrb r0, [r4, #0x5]\n\ + str r0, [sp]\n\ + add r0, r5, #0\n\ + add r1, sp, #0x8\n\ + bl Text_InitWindowAndPrintText\n\ + bl sub_80AED58\n\ + ldrh r0, [r7, #0xa]\n\ + bl sub_80AEBEC\n\ + ldrh r0, [r7, #0x8]\n\ + add r0, r0, #0x1\n\ + strh r0, [r7, #0x8]\n\ + b ._229\n\ +._206:\n\ + .align 2, 0\n\ +._205:\n\ + .word gUnknown_03004210\n\ + .word gUnknown_083CA340\n\ + .word gMoveNames\n\ +._200:\n\ + ldr r0, ._213\n\ + ldrh r1, [r0, #0x30]\n\ + cmp r1, #0x10\n\ + beq ._207 @cond_branch\n\ + cmp r1, #0x10\n\ + bgt ._208 @cond_branch\n\ + cmp r1, #0x4\n\ + beq ._215 @cond_branch\n\ + cmp r1, #0x4\n\ + bgt ._210 @cond_branch\n\ + cmp r1, #0x2\n\ + beq ._211 @cond_branch\n\ + b ._229\n\ +._214:\n\ + .align 2, 0\n\ +._213:\n\ + .word gMain\n\ +._210:\n\ + cmp r1, #0x8\n\ + beq ._215 @cond_branch\n\ + b ._229\n\ +._208:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + cmp r1, r0\n\ + beq ._217 @cond_branch\n\ + cmp r1, r0\n\ + bgt ._218 @cond_branch\n\ + cmp r1, #0x20\n\ + beq ._219 @cond_branch\n\ + b ._229\n\ +._218:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x2\n\ + cmp r1, r0\n\ + beq ._221 @cond_branch\n\ + b ._229\n\ +._219:\n\ + ldrh r0, [r7, #0xa]\n\ + sub r0, r0, #0x1\n\ + b ._223\n\ +._221:\n\ + ldrh r0, [r7, #0xa]\n\ + sub r0, r0, #0xa\n\ +._223:\n\ + strh r0, [r7, #0xa]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bgt ._227 @cond_branch\n\ + mov r0, #0xb1\n\ + lsl r0, r0, #0x1\n\ + strh r0, [r7, #0xa]\n\ + b ._227\n\ +._207:\n\ + ldrh r0, [r7, #0xa]\n\ + add r0, r0, #0x1\n\ + b ._226\n\ +._217:\n\ + ldrh r0, [r7, #0xa]\n\ + add r0, r0, #0xa\n\ +._226:\n\ + strh r0, [r7, #0xa]\n\ + lsl r0, r0, #0x10\n\ + mov r1, #0xb1\n\ + lsl r1, r1, #0x11\n\ + cmp r0, r1\n\ + ble ._227 @cond_branch\n\ + strh r2, [r7, #0xa]\n\ +._227:\n\ + ldrh r0, [r7, #0x8]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r7, #0x8]\n\ + b ._229\n\ +._215:\n\ + ldr r0, ._230\n\ + mov r1, #0x0\n\ + strh r1, [r0]\n\ + ldr r0, ._230 + 4\n\ + strh r1, [r0]\n\ + bl sub_80B1BDC\n\ + ldr r1, ._230 + 8\n\ + lsl r0, r4, #0x2\n\ + add r0, r0, r4\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r1\n\ + mov r1, #0x0\n\ + strh r1, [r0, #0x8]\n\ + ldr r1, ._230 + 12\n\ + str r1, [r0]\n\ + b ._229\n\ +._231:\n\ + .align 2, 0\n\ +._230:\n\ + .word gBattle_BG0_Y\n\ + .word gBattle_BG2_Y\n\ + .word gTasks\n\ + .word debug_sub_80BA054+1\n\ +._211:\n\ + ldr r0, ._232\n\ + mov r1, #0xa0\n\ + strh r1, [r0]\n\ + ldr r0, ._232 + 4\n\ + strh r1, [r0]\n\ + ldr r1, ._232 + 8\n\ + ldr r0, ._232 + 12\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x6\n\ + add r0, r0, r1\n\ + ldrh r2, [r7, #0xa]\n\ + mov r1, #0x0\n\ + strh r2, [r0, #0x1e]\n\ + strh r1, [r7, #0x8]\n\ + strh r1, [r7, #0xa]\n\ + strh r1, [r7, #0xc]\n\ + strh r1, [r7, #0xe]\n\ + ldr r0, ._232 + 16\n\ + str r0, [r7]\n\ +._229:\n\ + add sp, sp, #0x6c\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._233:\n\ + .align 2, 0\n\ +._232:\n\ + .word gBattle_BG0_Y\n\ + .word gBattle_BG2_Y\n\ + .word gContestMons\n\ + .word gContestPlayerMonIndex\n\ + .word sub_80ABCDC+1"); +} + +__attribute__((naked)) +void debug_sub_80BA054() +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6, r7}\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + ldr r1, ._236\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r1\n\ + mov r2, #0x8\n\ + ldsh r0, [r0, r2]\n\ + add r2, r1, #0\n\ + cmp r0, #0x14\n\ + bls ._234 @cond_branch\n\ + b ._286\n\ +._234:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._236 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._237:\n\ + .align 2, 0\n\ +._236:\n\ + .word gTasks\n\ + .word ._238\n\ +._238:\n\ + .word ._239\n\ + .word ._240\n\ + .word ._241\n\ + .word ._242\n\ + .word ._243\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._286\n\ + .word ._259\n\ +._239:\n\ + lsl r0, r7, #0x2\n\ + mov r8, r0\n\ + ldr r2, ._262\n\ + mov r9, r2\n\ + ldr r1, ._262 + 4\n\ + mov r2, #0x0\n\ + add r0, r1, #3\n\ +._260:\n\ + strb r2, [r0]\n\ + sub r0, r0, #0x1\n\ + cmp r0, r1\n\ + bge ._260 @cond_branch\n\ + mov r5, #0x0\n\ + mov r0, r9\n\ + mov r1, #0x0\n\ + mov r2, #0x14\n\ + bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + ldr r4, ._262 + 8\n\ + ldrb r0, [r4]\n\ + bl sub_80B28F0\n\ + ldr r3, ._262 + 12\n\ + ldrb r2, [r4]\n\ + lsl r2, r2, #0x6\n\ + add r0, r2, r3\n\ + ldrh r0, [r0]\n\ + add r1, r3, #0\n\ + add r1, r1, #0x3c\n\ + add r1, r2, r1\n\ + ldr r1, [r1]\n\ + add r3, r3, #0x38\n\ + add r2, r2, r3\n\ + ldr r2, [r2]\n\ + bl sub_80AE9FC\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + ldr r2, ._262 + 16\n\ + lsl r0, r6, #0x4\n\ + add r0, r0, r6\n\ + lsl r0, r0, #0x2\n\ + add r3, r0, r2\n\ + mov r4, #0x0\n\ + mov r1, #0x78\n\ + strh r1, [r3, #0x24]\n\ + add r2, r2, #0x1c\n\ + add r0, r0, r2\n\ + ldr r1, ._262 + 20\n\ + str r1, [r0]\n\ + ldr r0, ._262 + 24\n\ + mov r2, r8\n\ + add r1, r2, r7\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r0\n\ + strh r6, [r1, #0xc]\n\ + ldr r2, ._262 + 28\n\ + ldr r0, ._262 + 32\n\ + ldrb r0, [r0]\n\ + add r0, r0, r2\n\ + strb r6, [r0]\n\ + strh r5, [r1, #0xe]\n\ + ldrh r0, [r1, #0x8]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1, #0x8]\n\ + mov r0, r9\n\ + sub r0, r0, #0xea\n\ + strb r4, [r0]\n\ + b ._286\n\ +._263:\n\ + .align 2, 0\n\ +._262:\n\ + .word +0x2019348\n\ + .word gBattleMonForms\n\ + .word gContestPlayerMonIndex\n\ + .word gContestMons\n\ + .word gSprites\n\ + .word sub_80AD8FC+1\n\ + .word gTasks\n\ + .word gObjectBankIDs\n\ + .word gBankAttacker\n\ +._240:\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + add r7, r0, r2\n\ + ldrb r6, [r7, #0xc]\n\ + ldr r1, ._267\n\ + lsl r0, r6, #0x4\n\ + add r0, r0, r6\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, #0x1c\n\ + add r0, r0, r1\n\ + ldr r1, [r0]\n\ + ldr r0, ._267 + 4\n\ + cmp r1, r0\n\ + beq ._264 @cond_branch\n\ + b ._286\n\ +._264:\n\ + ldr r4, ._267 + 8\n\ + ldrb r1, [r4]\n\ + lsl r0, r1, #0x3\n\ + sub r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._267 + 12\n\ + add r0, r0, r1\n\ + ldrh r1, [r7, #0xa]\n\ + mov r5, #0x0\n\ + strh r1, [r0, #0x6]\n\ + ldrb r0, [r4]\n\ + bl sub_80B2790\n\ + ldrb r0, [r4]\n\ + bl sub_80B28F0\n\ + ldrh r0, [r7, #0xa]\n\ + bl SelectContestMoveBankTarget\n\ + ldrh r0, [r7, #0xa]\n\ + bl DoMoveAnim\n\ + strh r5, [r7, #0xe]\n\ + ldrh r0, [r7, #0x8]\n\ + add r0, r0, #0x1\n\ + strh r0, [r7, #0x8]\n\ + b ._286\n\ +._268:\n\ + .align 2, 0\n\ +._267:\n\ + .word gSprites\n\ + .word SpriteCallbackDummy+1\n\ + .word gContestPlayerMonIndex\n\ + .word +0x2019260\n\ +._241:\n\ + ldr r0, ._273\n\ + ldr r0, [r0]\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cf4\n\ + ldr r0, ._273 + 4\n\ + ldrb r4, [r0]\n\ + cmp r4, #0\n\ + beq ._269 @cond_branch\n\ + b ._286\n\ +._269:\n\ + ldr r0, ._273 + 8\n\ + ldrb r0, [r0]\n\ + bl sub_80B28CC\n\ + ldr r0, ._273 + 12\n\ + add r0, r0, #0x5a\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._271 @cond_branch\n\ + ldr r0, ._273 + 16\n\ + lsl r1, r7, #0x2\n\ + add r1, r1, r7\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r0\n\ + strh r4, [r1, #0x1c]\n\ + mov r0, #0x14\n\ + strh r0, [r1, #0x8]\n\ + b ._286\n\ +._274:\n\ + .align 2, 0\n\ +._273:\n\ + .word gAnimScriptCallback\n\ + .word gAnimScriptActive\n\ + .word gContestPlayerMonIndex\n\ + .word +0x2019204\n\ + .word gTasks\n\ +._271:\n\ + ldr r0, ._276\n\ + lsl r1, r7, #0x2\n\ + add r1, r1, r7\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r0\n\ + ldrh r0, [r1, #0x8]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1, #0x8]\n\ + b ._286\n\ +._277:\n\ + .align 2, 0\n\ +._276:\n\ + .word gTasks\n\ +._242:\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + add r4, r0, r2\n\ + ldrh r0, [r4, #0xe]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0xe]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x15\n\ + bne ._286 @cond_branch\n\ + ldrb r6, [r4, #0xc]\n\ + ldr r1, ._280\n\ + lsl r0, r6, #0x4\n\ + add r0, r0, r6\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, #0x1c\n\ + add r0, r0, r1\n\ + ldr r1, ._280 + 4\n\ + str r1, [r0]\n\ + bl sub_80B1B14\n\ + mov r0, #0x0\n\ + strh r0, [r4, #0xe]\n\ + ldrh r0, [r4, #0x8]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0x8]\n\ + b ._286\n\ +._281:\n\ + .align 2, 0\n\ +._280:\n\ + .word gSprites\n\ + .word sub_80AD92C+1\n\ +._243:\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + add r5, r0, r2\n\ + ldrb r6, [r5, #0xc]\n\ + ldr r1, ._284\n\ + lsl r0, r6, #0x4\n\ + add r0, r0, r6\n\ + lsl r0, r0, #0x2\n\ + add r4, r0, r1\n\ + add r0, r4, #0\n\ + add r0, r0, #0x3e\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x1d\n\ + cmp r0, #0\n\ + bge ._286 @cond_branch\n\ + add r0, r4, #0\n\ + bl FreeSpriteOamMatrix\n\ + add r0, r4, #0\n\ + bl DestroySprite\n\ + mov r0, #0x0\n\ + strh r0, [r5, #0x8]\n\ + ldr r0, ._284 + 4\n\ + str r0, [r5]\n\ + ldr r0, ._284 + 8\n\ + mov r1, #0xa0\n\ + strh r1, [r0]\n\ + ldr r0, ._284 + 12\n\ + strh r1, [r0]\n\ + b ._286\n\ +._285:\n\ + .align 2, 0\n\ +._284:\n\ + .word gSprites\n\ + .word debug_sub_80B9EBC+1\n\ + .word gBattle_BG0_Y\n\ + .word gBattle_BG2_Y\n\ +._259:\n\ + lsl r0, r7, #0x2\n\ + add r0, r0, r7\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r2\n\ + ldrh r0, [r2, #0x1c]\n\ + add r1, r0, #1\n\ + strh r1, [r2, #0x1c]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x1e\n\ + ble ._286 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r2, #0x1c]\n\ + mov r0, #0x1\n\ + strh r0, [r2, #0x8]\n\ +._286:\n\ + pop {r3, r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0"); +} +#endif void sub_80AC0AC(s8 a) { diff --git a/src/field/bike.c b/src/field/bike.c index eb9d56a64..98966ebd4 100644 --- a/src/field/bike.c +++ b/src/field/bike.c @@ -131,14 +131,6 @@ static const struct BikeHistoryInputInfo gAcroBikeTricksList[] = void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) { -#if DEBUG - if (gUnknown_020297ED && debug_sub_805F2B0(direction)) - { - Bike_SetBikeStill(); - return; - } -#endif - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) MovePlayerOnMachBike(direction, newKeys, heldKeys); else @@ -147,6 +139,13 @@ void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) { +#if DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(direction)) + { + Bike_SetBikeStill(); + return; + } +#endif sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); } diff --git a/src/field/secret_base.c b/src/field/secret_base.c index 728decc9c..1bdc76b23 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -1648,6 +1648,178 @@ void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases sub_80BD328(basesC, 0); } +#if DEBUG +__attribute__((naked)) +void sub_80BD674(void *playerRecords, u32 size, u8 c) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add r6, r0, #0\n\ + add r5, r1, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r7, r2, #0x18\n\ + ldr r0, ._503\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._498 @cond_branch\n\ + mov r0, #0x60\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._498 @cond_branch\n\ + b ._520\n\ +._498:\n\ + bl GetLinkPlayerCount\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x2\n\ + beq ._500 @cond_branch\n\ + cmp r0, #0x3\n\ + beq ._501 @cond_branch\n\ + b ._505\n\ +._504:\n\ + .align 2, 0\n\ +._503:\n\ + .word gUnknown_020297ED\n\ +._500:\n\ + lsl r4, r5, #0x1\n\ + add r0, r6, r4\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + add r4, r4, r5\n\ + add r4, r6, r4\n\ + add r0, r4, #0\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + b ._505\n\ +._501:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, r5\n\ + add r0, r6, r0\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ +._505:\n\ + cmp r7, #0x1\n\ + beq ._506 @cond_branch\n\ + cmp r7, #0x1\n\ + bgt ._507 @cond_branch\n\ + cmp r7, #0\n\ + beq ._508 @cond_branch\n\ + b ._515\n\ +._507:\n\ + cmp r7, #0x2\n\ + beq ._510 @cond_branch\n\ + cmp r7, #0x3\n\ + beq ._511 @cond_branch\n\ + b ._515\n\ +._508:\n\ + add r0, r6, r5\n\ + lsl r2, r5, #0x1\n\ + add r1, r6, r2\n\ + add r2, r2, r5\n\ + add r2, r6, r2\n\ + bl sub_80BD610\n\ + b ._515\n\ +._506:\n\ + lsl r1, r5, #0x1\n\ + add r0, r6, r1\n\ + add r1, r1, r5\n\ + add r1, r6, r1\n\ + add r2, r6, #0\n\ + bl sub_80BD610\n\ + b ._515\n\ +._510:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, r5\n\ + add r0, r6, r0\n\ + add r2, r6, r5\n\ + add r1, r6, #0\n\ + bl sub_80BD610\n\ + b ._515\n\ +._511:\n\ + add r1, r6, r5\n\ + lsl r2, r5, #0x1\n\ + add r2, r6, r2\n\ + add r0, r6, #0\n\ + bl sub_80BD610\n\ +._515:\n\ + mov r3, #0x1\n\ + ldr r6, ._521\n\ + mov r5, #0x10\n\ + neg r5, r5\n\ + ldr r4, ._521 + 4\n\ +._517:\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x5\n\ + add r0, r0, r6\n\ + add r2, r0, r4\n\ + ldrb r1, [r2]\n\ + lsl r0, r1, #0x1c\n\ + lsr r0, r0, #0x1c\n\ + cmp r0, #0x1\n\ + bne ._516 @cond_branch\n\ + mov r0, #0x3f\n\ + and r0, r0, r1\n\ + mov r1, #0x40\n\ + orr r0, r0, r1\n\ + and r0, r0, r5\n\ + strb r0, [r2]\n\ +._516:\n\ + add r0, r3, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r3, r0, #0x10\n\ + cmp r3, #0x13\n\ + bls ._517 @cond_branch\n\ + bl sub_80BD280\n\ + mov r3, #0x1\n\ + ldr r4, ._521\n\ + ldr r6, ._521 + 4\n\ + add r7, r4, #0\n\ + mov r5, #0x3f\n\ +._519:\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x5\n\ + add r0, r0, r4\n\ + add r2, r0, r6\n\ + ldrb r1, [r2]\n\ + lsr r0, r1, #0x6\n\ + cmp r0, #0x2\n\ + bne ._518 @cond_branch\n\ + add r0, r5, #0\n\ + and r0, r0, r1\n\ + strb r0, [r2]\n\ +._518:\n\ + add r0, r3, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r3, r0, #0x10\n\ + cmp r3, #0x13\n\ + bls ._519 @cond_branch\n\ + ldr r0, ._521 + 8\n\ + add r2, r7, r0\n\ + ldrh r1, [r2]\n\ + ldr r0, ._521 + 12\n\ + cmp r1, r0\n\ + beq ._520 @cond_branch\n\ + add r0, r1, #1\n\ + strh r0, [r2]\n\ +._520:\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._522:\n\ + .align 2, 0\n\ +._521:\n\ + .word gSaveBlock1\n\ + .word 0x1a09\n\ + .word 0x1a16\n\ + .word 0xffff"); +} +#else void sub_80BD674(void *playerRecords, u32 size, u8 c) { if (FlagGet(FLAG_RECEIVED_SECRET_POWER)) @@ -1706,3 +1878,4 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) } } } +#endif diff --git a/src/field/shop.c b/src/field/shop.c index 1dc6ba0cd..df271743d 100644 --- a/src/field/shop.c +++ b/src/field/shop.c @@ -1222,6 +1222,27 @@ void CreateDecorationShop2Menu(u16 *itemList) SetShopMenuCallback(EnableBothScriptContexts); } +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2818(void) +{ + asm("\ + push {lr}\n\ + mov r0, #0x0\n\ + bl CreateShopMenu\n\ + ldr r0, ._290\n\ + bl SetShopItemsForSale\n\ + mov r0, #0x0\n\ + bl SetShopMenuCallback\n\ + pop {r0}\n\ + bx r0\n\ +._291:\n\ + .align 2, 0\n\ +._290:\n\ + .word gUnknown_083CC6EB+0x3"); +} +#endif + void sub_80B45B4(u8 taskId, const s16 *list, u16 c) { s16 r5 = gTasks[taskId].data[4] - 1; diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 0102b7526..8f7c8728d 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -41,11 +41,11 @@ static void sub_80A0090(struct Pokemon *); static void sub_80A015C(struct Pokemon *); static void sub_809DE44(void); static void sub_809EB40(u8); -static void sub_809EBC4(void); -static void sub_809E044(void); +/*static*/ void sub_809EBC4(void); +/*static*/ void sub_809E044(void); static void sub_80A1D84(struct Pokemon *); -static void sub_80A18C4(void); -static bool8 LoadPokemonSummaryScreenGraphics(void); +/*static*/ void sub_80A18C4(void); +/*static*/ bool8 LoadPokemonSummaryScreenGraphics(void); static bool8 MonKnowsMultipleMoves(struct Pokemon *); static void PrintSummaryWindowHeaderText(void); static void sub_80A1DCC(struct Pokemon *); @@ -63,8 +63,8 @@ static void PrintHeldItemName(u16, u8, u8); static void PrintNumRibbons(struct Pokemon *); static void DrawExperienceProgressBar(struct Pokemon *, u8, u8); static void sub_809E13C(u8 taskId); -static void sub_80A1950(void); -static void sub_809DE64(void); +/*static*/ void sub_80A1950(void); +/*static*/ void sub_809DE64(void); static void SummaryScreenHandleAButton(u8); static void SummaryScreenHandleUpDownInput(u8, s8); static bool8 sub_809F7D0(u8); @@ -572,7 +572,43 @@ static const u8 sUnknown_083C15BC[] = { -1, 15, 0, 10, }; - +#if DEBUG +__attribute__((naked)) +void sub_809D844(void) +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + bl RunTasks\n\ + bl AnimateSprites\n\ + bl BuildOamBuffer\n\ + bl UpdatePaletteFade\n\ + ldr r0, ._2\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1 @cond_branch\n\ + ldr r0, ._2 + 4\n\ + ldr r1, ._2 + 8\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x3\n\ + str r1, [sp]\n\ + mov r1, #0x14\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1:\n\ + add sp, sp, #0x4\n\ + pop {r0}\n\ + bx r0\n\ +._3:\n\ + .align 2, 0\n\ +._2:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void sub_809D844(void) { RunTasks(); @@ -580,6 +616,7 @@ void sub_809D844(void) BuildOamBuffer(); UpdatePaletteFade(); } +#endif void sub_809D85C(void) { @@ -689,6 +726,491 @@ void sub_809DA1C(void) } } +#if DEBUG +__attribute__((naked)) +bool8 sub_809DA84(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add sp, sp, #0xfffffff8\n\ + ldr r1, ._52\n\ + ldr r2, ._52 + 4\n\ + add r0, r1, r2\n\ + ldrb r0, [r0]\n\ + mov ip, r1\n\ + cmp r0, #0x16\n\ + bls ._50 @cond_branch\n\ + b ._51\n\ +._50:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._52 + 8\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._53:\n\ + .align 2, 0\n\ +._52:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._54\n\ +._54:\n\ + .word ._55\n\ + .word ._56\n\ + .word ._57\n\ + .word ._58\n\ + .word ._59\n\ + .word ._60\n\ + .word ._61\n\ + .word ._62\n\ + .word ._63\n\ + .word ._64\n\ + .word ._65\n\ + .word ._66\n\ + .word ._67\n\ + .word ._68\n\ + .word ._69\n\ + .word ._70\n\ + .word ._71\n\ + .word ._72\n\ + .word ._73\n\ + .word ._74\n\ + .word ._75\n\ + .word ._76\n\ + .word ._77\n\ +._55:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl ResetSpriteData\n\ + b ._146\n\ +._56:\n\ + bl ScanlineEffect_Stop\n\ + ldr r1, ._80\n\ + ldr r2, ._80 + 4\n\ + add r1, r1, r2\n\ + b ._153\n\ +._81:\n\ + .align 2, 0\n\ +._80:\n\ + .word gMain\n\ + .word 0x43c\n\ +._57:\n\ + bl FreeAllSpritePalettes\n\ + b ._146\n\ +._58:\n\ + mov r2, #0xc0\n\ + lsl r2, r2, #0x13\n\ + mov r3, #0x80\n\ + lsl r3, r3, #0x9\n\ + mov r5, #0x0\n\ + ldr r1, ._85\n\ + mov r4, #0x80\n\ + lsl r4, r4, #0x5\n\ + ldr r6, ._85 + 4\n\ + mov r7, #0x85\n\ + lsl r7, r7, #0x18\n\ +._83:\n\ + str r5, [sp, #0x4]\n\ + add r0, sp, #0x4\n\ + str r0, [r1]\n\ + str r2, [r1, #0x4]\n\ + str r6, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + add r2, r2, r4\n\ + sub r3, r3, r4\n\ + cmp r3, r4\n\ + bhi ._83 @cond_branch\n\ + str r5, [sp, #0x4]\n\ + add r0, sp, #0x4\n\ + str r0, [r1]\n\ + str r2, [r1, #0x4]\n\ + lsr r0, r3, #0x2\n\ + orr r0, r0, r7\n\ + str r0, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + ldr r1, ._85 + 8\n\ + add r1, r1, ip\n\ + b ._153\n\ +._86:\n\ + .align 2, 0\n\ +._85:\n\ + .word 0x40000d4\n\ + .word 0x85000400\n\ + .word 0x43c\n\ +._59:\n\ + bl sub_809DE64\n\ + ldr r1, ._88\n\ + ldr r2, ._88 + 4\n\ + add r1, r1, r2\n\ + b ._153\n\ +._89:\n\ + .align 2, 0\n\ +._88:\n\ + .word gMain\n\ + .word 0x43c\n\ +._60:\n\ + ldr r0, ._91\n\ + bl Text_LoadWindowTemplate\n\ + b ._146\n\ +._92:\n\ + .align 2, 0\n\ +._91:\n\ + .word gWindowTemplate_81E6E6C\n\ +._61:\n\ + ldr r0, ._94\n\ + bl MultistepInitMenuWindowBegin\n\ + ldr r1, ._94 + 4\n\ + ldr r2, ._94 + 8\n\ + add r1, r1, r2\n\ + b ._153\n\ +._95:\n\ + .align 2, 0\n\ +._94:\n\ + .word gWindowTemplate_81E6E6C\n\ + .word gMain\n\ + .word 0x43c\n\ +._62:\n\ + bl MultistepInitMenuWindowContinue\n\ + cmp r0, #0\n\ + bne ._96 @cond_branch\n\ + b ._157\n\ +._96:\n\ + b ._146\n\ +._63:\n\ + bl sub_809DA1C\n\ + ldr r1, ._100\n\ + ldr r2, ._100 + 4\n\ + add r1, r1, r2\n\ + b ._153\n\ +._101:\n\ + .align 2, 0\n\ +._100:\n\ + .word gMain\n\ + .word 0x43c\n\ +._64:\n\ + ldr r1, ._103\n\ + ldr r2, ._103 + 4\n\ + ldr r0, ._103 + 8\n\ + str r1, [r0]\n\ + str r2, [r0, #0x4]\n\ + ldr r1, ._103 + 12\n\ + str r1, [r0, #0x8]\n\ + ldr r1, [r0, #0x8]\n\ + ldr r1, ._103 + 16\n\ + ldr r2, ._103 + 20\n\ + str r1, [r0]\n\ + str r2, [r0, #0x4]\n\ + ldr r1, ._103 + 24\n\ + str r1, [r0, #0x8]\n\ + ldr r0, [r0, #0x8]\n\ + ldr r0, ._103 + 28\n\ + add r0, r0, #0x74\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ + ldr r1, ._103 + 32\n\ + add r1, r1, ip\n\ + b ._153\n\ +._104:\n\ + .align 2, 0\n\ +._103:\n\ + .word gSummaryScreenTextTiles\n\ + .word 0x600d000\n\ + .word 0x40000d4\n\ + .word 0x800000a0\n\ + .word sSummaryScreenButtonTiles\n\ + .word 0x600d140\n\ + .word 0x80000080\n\ + .word +0x2018000\n\ + .word 0x43c\n\ +._65:\n\ + bl LoadPokemonSummaryScreenGraphics\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._105 @cond_branch\n\ + b ._157\n\ +._105:\n\ + ldr r0, ._108\n\ + add r0, r0, #0x74\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ + b ._146\n\ +._109:\n\ + .align 2, 0\n\ +._108:\n\ + .word +0x2018000\n\ +._66:\n\ + bl sub_80A18C4\n\ + ldr r1, ._111\n\ + ldr r2, ._111 + 4\n\ + add r1, r1, r2\n\ + b ._153\n\ +._112:\n\ + .align 2, 0\n\ +._111:\n\ + .word gMain\n\ + .word 0x43c\n\ +._67:\n\ + ldr r4, ._115\n\ + add r0, r4, #0\n\ + bl sub_809F678\n\ + add r0, r4, #0\n\ + bl GetMonStatusAndPokerus\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._113 @cond_branch\n\ + mov r0, #0x0\n\ + bl sub_80A12D0\n\ + b ._114\n\ +._116:\n\ + .align 2, 0\n\ +._115:\n\ + .word +0x2018010\n\ +._113:\n\ + mov r0, #0xa\n\ + bl sub_80A12D0\n\ +._114:\n\ + ldr r0, ._118\n\ + bl DrawPokerusSurvivorDot\n\ + b ._146\n\ +._119:\n\ + .align 2, 0\n\ +._118:\n\ + .word +0x2018010\n\ +._68:\n\ + bl sub_80A1950\n\ + ldr r0, ._121\n\ + bl sub_80A1D84\n\ + ldr r1, ._121 + 4\n\ + ldr r2, ._121 + 8\n\ + add r1, r1, r2\n\ + b ._153\n\ +._122:\n\ + .align 2, 0\n\ +._121:\n\ + .word +0x2018010\n\ + .word gMain\n\ + .word 0x43c\n\ +._69:\n\ + ldr r4, ._124\n\ + add r0, r4, #0\n\ + bl sub_80A1DE8\n\ + add r4, r4, #0x64\n\ + mov r0, #0x0\n\ + strb r0, [r4]\n\ + b ._146\n\ +._125:\n\ + .align 2, 0\n\ +._124:\n\ + .word +0x2018010\n\ +._70:\n\ + ldr r4, ._129\n\ + add r5, r4, #0\n\ + add r5, r5, #0x64\n\ + add r0, r4, #0\n\ + add r1, r5, #0\n\ + bl sub_809F6B4\n\ + sub r4, r4, #0x10\n\ + strb r0, [r4, #0xc]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xff\n\ + bne ._126 @cond_branch\n\ + b ._157\n\ +._126:\n\ + mov r0, #0x0\n\ + strb r0, [r5]\n\ + ldr r1, ._129 + 4\n\ + ldr r2, ._129 + 8\n\ + add r1, r1, r2\n\ + b ._153\n\ +._130:\n\ + .align 2, 0\n\ +._129:\n\ + .word +0x2018010\n\ + .word gMain\n\ + .word 0x43c\n\ +._71:\n\ + bl sub_809E044\n\ + bl DrawSummaryScreenNavigationDots\n\ + b ._146\n\ +._72:\n\ + ldr r1, ._134\n\ + ldrb r0, [r1, #0xb]\n\ + cmp r0, #0x1\n\ + bhi ._132 @cond_branch\n\ + ldr r0, ._134 + 4\n\ + ldrb r1, [r1, #0xb]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldr r0, [r1]\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cf4\n\ +._132:\n\ + ldr r1, ._134 + 8\n\ + ldr r2, ._134 + 12\n\ + add r1, r1, r2\n\ + b ._153\n\ +._135:\n\ + .align 2, 0\n\ +._134:\n\ + .word +0x2018000\n\ + .word sUnknown_083C1580\n\ + .word gMain\n\ + .word 0x43c\n\ +._73:\n\ + ldr r0, ._137\n\ + bl sub_809FAC8\n\ + b ._146\n\ +._138:\n\ + .align 2, 0\n\ +._137:\n\ + .word +0x2018010\n\ +._74:\n\ + ldr r2, ._140\n\ + ldr r0, ._140 + 4\n\ + ldrb r1, [r0, #0xb]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r2\n\ + add r0, r0, #0x10\n\ + ldr r1, [r1]\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cf8\n\ + ldr r1, ._140 + 8\n\ + ldr r2, ._140 + 12\n\ + add r1, r1, r2\n\ + b ._153\n\ +._141:\n\ + .align 2, 0\n\ +._140:\n\ + .word sUnknown_083C1598\n\ + .word +0x2018000\n\ + .word gMain\n\ + .word 0x43c\n\ +._75:\n\ + ldr r0, ._144\n\ + mov r1, #0x2d\n\ + bl GetMonData\n\ + add r1, r0, #0\n\ + cmp r1, #0\n\ + beq ._142 @cond_branch\n\ + ldr r1, ._144 + 4\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + b ._146\n\ +._145:\n\ + .align 2, 0\n\ +._144:\n\ + .word +0x2018010\n\ + .word gBattle_BG3_X\n\ +._142:\n\ + ldr r0, ._147\n\ + strh r1, [r0]\n\ + b ._146\n\ +._148:\n\ + .align 2, 0\n\ +._147:\n\ + .word gBattle_BG3_X\n\ +._76:\n\ + bl sub_809EBC4\n\ + ldr r0, ._151\n\ + add r0, r0, #0x79\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._149 @cond_branch\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl sub_80A1488\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl sub_80A1654\n\ + b ._150\n\ +._152:\n\ + .align 2, 0\n\ +._151:\n\ + .word +0x2018000\n\ +._149:\n\ + mov r0, #0xa\n\ + mov r1, #0x0\n\ + bl sub_80A1488\n\ + mov r0, #0xa\n\ + mov r1, #0x0\n\ + bl sub_80A1654\n\ +._150:\n\ + bl PrintSummaryWindowHeaderText\n\ + ldr r1, ._154\n\ + ldr r2, ._154 + 4\n\ + add r1, r1, r2\n\ + b ._153\n\ +._155:\n\ + .align 2, 0\n\ +._154:\n\ + .word gMain\n\ + .word 0x43c\n\ +._77:\n\ + bl sub_8055870\n\ + cmp r0, #0x1\n\ + beq ._157 @cond_branch\n\ +._146:\n\ + ldr r1, ._158\n\ + ldr r0, ._158 + 4\n\ + add r1, r1, r0\n\ +._153:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._157\n\ +._159:\n\ + .align 2, 0\n\ +._158:\n\ + .word gMain\n\ + .word 0x43c\n\ +._51:\n\ + ldr r0, ._162\n\ + bl SetVBlankCallback\n\ + mov r0, #0x1\n\ + str r0, [sp]\n\ + mov r0, #0xff\n\ + mov r1, #0x0\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginHardwarePaletteFade\n\ + ldr r0, ._162 + 4\n\ + bl SetMainCallback2\n\ + ldr r2, ._162 + 8\n\ + ldrb r1, [r2, #0x8]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r0, ._162 + 12\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._160 @cond_branch\n\ + ldr r0, ._162 + 16\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x8\n\ + ldr r2, ._162 + 20\n\ + mov r3, #0x3\n\ + bl debug_sub_8008218\n\ +._160:\n\ + mov r0, #0x1\n\ + b ._161\n\ +._163:\n\ + .align 2, 0\n\ +._162:\n\ + .word sub_809D85C+1\n\ + .word sub_809D844+1\n\ + .word gPaletteFade\n\ + .word gLinkOpen\n\ + .word 0x600dde0\n\ + .word 0x600f000\n\ +._157:\n\ + mov r0, #0x0\n\ +._161:\n\ + add sp, sp, #0x8\n\ + pop {r4, r5, r6, r7}\n\ + pop {r1}\n\ + bx r1"); +} +#else bool8 sub_809DA84(void) { const u16 *src; @@ -856,13 +1378,15 @@ bool8 sub_809DA84(void) return FALSE; } +#endif static void sub_809DE44(void) { - while (sub_809DA84() != TRUE && sub_80F9344() != TRUE); + while (sub_809DA84() != TRUE && sub_80F9344() != TRUE) + ; } -static void sub_809DE64(void) +/*static*/ void sub_809DE64(void) { REG_BG0CNT = 0x1E08; REG_BG1CNT = 0x4801; @@ -889,7 +1413,7 @@ static void sub_809DE64(void) REG_DISPCNT = 0x1F40; } -static bool8 LoadPokemonSummaryScreenGraphics(void) +/*static*/ bool8 LoadPokemonSummaryScreenGraphics(void) { switch (pssData.loadGfxState) { @@ -939,7 +1463,7 @@ static bool8 LoadPokemonSummaryScreenGraphics(void) return FALSE; } -static void sub_809E044(void) +/*static*/ void sub_809E044(void) { LoadPalette(&gUnknownPalette_81E6692[28], 129, 2); LoadPalette(&gUnknownPalette_81E6692[30], 136, 2); @@ -1518,7 +2042,7 @@ static void sub_809EB40(u8 taskId) } } -static void sub_809EBC4(void) +/*static*/ void sub_809EBC4(void) { if (pssData.page != PSS_PAGE_INFO) { @@ -4887,7 +5411,7 @@ static void sub_80A1888(struct Sprite *sprite) } } -static void sub_80A18C4(void) +/*static*/ void sub_80A18C4(void) { u8 i; @@ -4911,7 +5435,7 @@ static void sub_80A1918(u8 a, u8 invisible) gSprites[ewram1A000[a]].invisible = invisible; } -static void sub_80A1950(void) +/*static*/ void sub_80A1950(void) { u8 i; diff --git a/src/pokenav_before.c b/src/pokenav_before.c index b31be2ce1..f9e2beccb 100644 --- a/src/pokenav_before.c +++ b/src/pokenav_before.c @@ -132,6 +132,10 @@ extern const u8 gUnknown_08E99FB0[]; extern const u8 gUnknown_08E9A100[]; extern const u16 gPokenavHoennMap1_Pal[]; +// TODO: decompile the debug code so the compiler doesn't complain about +// unused static functions +#define static + static void sub_80EBCA8(); static void sub_80EEE20(); static bool8 sub_80EEE54(); @@ -297,7 +301,6 @@ extern void sub_80F19FC(); extern u16 gKeyRepeatStartDelay; - void sub_80EBA5C() { switch (gMain.state) @@ -469,6 +472,315 @@ void sub_80EBDBC(void (*func)(void)) ewram0_10.var304 = 0; } +#if DEBUG +__attribute__((naked)) +void sub_80EBDD8() +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._64\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r2, r1, #0\n\ + cmp r0, #0x11\n\ + bls ._62 @cond_branch\n\ + b ._131\n\ +._62:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._64 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._65:\n\ + .align 2, 0\n\ +._64:\n\ + .word +0x2000000\n\ + .word ._66\n\ +._66:\n\ + .word ._67\n\ + .word ._68\n\ + .word ._69\n\ + .word ._70\n\ + .word ._71\n\ + .word ._72\n\ + .word ._73\n\ + .word ._74\n\ + .word ._75\n\ + .word ._76\n\ + .word ._77\n\ + .word ._78\n\ + .word ._79\n\ + .word ._80\n\ + .word ._81\n\ + .word ._82\n\ + .word ._83\n\ + .word ._84\n\ +._67:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x13\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + ldr r1, ._86\n\ + ldr r3, ._86 + 4\n\ + add r0, r1, r3\n\ + ldrb r2, [r0]\n\ + sub r3, r3, #0x2f\n\ + add r0, r1, r3\n\ + strb r2, [r0]\n\ + ldr r0, ._86 + 8\n\ + add r2, r1, r0\n\ + mov r0, #0x5\n\ + strb r0, [r2]\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._124\n\ +._87:\n\ + .align 2, 0\n\ +._86:\n\ + .word +0x2000000\n\ + .word 0x6ddc\n\ + .word 0x6dae\n\ +._68:\n\ + bl sub_80F3FF0\n\ + ldr r1, ._91\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._69:\n\ + bl sub_80F4024\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._88 @cond_branch\n\ + b ._131\n\ +._88:\n\ + ldr r1, ._91\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._124\n\ +._92:\n\ + .align 2, 0\n\ +._91:\n\ + .word +0x2000000\n\ +._70:\n\ + bl sub_80F2598\n\ + ldr r1, ._94\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._124\n\ +._95:\n\ + .align 2, 0\n\ +._94:\n\ + .word +0x2000000\n\ +._71:\n\ + bl sub_80EEE20\n\ + ldr r1, ._99\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._72:\n\ + bl sub_80EEE54\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._96 @cond_branch\n\ + b ._131\n\ +._96:\n\ + bl sub_80EEE08\n\ + ldr r1, ._99\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._124\n\ +._100:\n\ + .align 2, 0\n\ +._99:\n\ + .word +0x2000000\n\ +._73:\n\ + mov r0, #0x0\n\ + bl sub_80EF248\n\ + ldr r1, ._104\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._74:\n\ + mov r0, #0x0\n\ + bl sub_80EF284\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._101 @cond_branch\n\ + b ._131\n\ +._101:\n\ + b ._110\n\ +._105:\n\ + .align 2, 0\n\ +._104:\n\ + .word +0x2000000\n\ +._75:\n\ + mov r0, #0x0\n\ + bl sub_80F1B8C\n\ + ldr r1, ._108\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._76:\n\ + mov r0, #0x0\n\ + bl sub_80F1BC8\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._131 @cond_branch\n\ + ldr r1, ._108\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._124\n\ +._109:\n\ + .align 2, 0\n\ +._108:\n\ + .word +0x2000000\n\ +._77:\n\ + ldr r0, ._111\n\ + bl SetVBlankCallback\n\ + b ._110\n\ +._112:\n\ + .align 2, 0\n\ +._111:\n\ + .word sub_80EBD18+1\n\ +._78:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, ._114\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._124\n\ +._115:\n\ + .align 2, 0\n\ +._114:\n\ + .word +0x2000000\n\ +._79:\n\ + mov r0, #0x0\n\ + bl sub_80EED2C\n\ + ldr r1, ._117\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._124\n\ +._118:\n\ + .align 2, 0\n\ +._117:\n\ + .word +0x2000000\n\ +._80:\n\ + ldr r0, ._121\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._131 @cond_branch\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r2, r3\n\ + b ._124\n\ +._122:\n\ + .align 2, 0\n\ +._121:\n\ + .word gPaletteFade\n\ +._81:\n\ + mov r0, #0x0\n\ + bl sub_80F2C80\n\ + ldr r1, ._125\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._82:\n\ + mov r0, #0x0\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._131 @cond_branch\n\ + ldr r1, ._125\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._124\n\ +._126:\n\ + .align 2, 0\n\ +._125:\n\ + .word +0x2000000\n\ +._83:\n\ + bl sub_80F1DF0\n\ +._110:\n\ + ldr r1, ._128\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ +._124:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._131\n\ +._129:\n\ + .align 2, 0\n\ +._128:\n\ + .word +0x2000000\n\ +._84:\n\ + bl sub_80F1E50\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._131 @cond_branch\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl sub_80EF428\n\ + ldr r0, ._132\n\ + bl sub_80EBDBC\n\ + ldr r0, ._132 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._131 @cond_branch\n\ + ldr r0, ._132 + 8\n\ + ldr r2, ._132 + 12\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ +._131:\n\ + add sp, sp, #0x4\n\ + pop {r0}\n\ + bx r0\n\ +._133:\n\ + .align 2, 0\n\ +._132:\n\ + .word sub_80EC268+1\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800"); +} +#else void sub_80EBDD8() { switch (ewram0_10.var304) @@ -556,7 +868,285 @@ void sub_80EBDD8() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80EC00C() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._136\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0xd\n\ + bls ._134 @cond_branch\n\ + b ._191\n\ +._134:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._136 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._137:\n\ + .align 2, 0\n\ +._136:\n\ + .word +0x2000000\n\ + .word ._138\n\ +._138:\n\ + .word ._139\n\ + .word ._140\n\ + .word ._141\n\ + .word ._142\n\ + .word ._143\n\ + .word ._144\n\ + .word ._145\n\ + .word ._146\n\ + .word ._147\n\ + .word ._148\n\ + .word ._149\n\ + .word ._150\n\ + .word ._151\n\ + .word ._152\n\ +._139:\n\ + bl sub_80EEF78\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._153 @cond_branch\n\ + b ._191\n\ +._153:\n\ + ldr r0, ._156\n\ + bl SetVBlankCallback\n\ + bl sub_80EED1C\n\ + ldr r4, ._156 + 4\n\ + ldr r1, ._156 + 8\n\ + add r0, r4, r1\n\ + ldrb r1, [r0]\n\ + ldr r2, ._156 + 12\n\ + add r0, r4, r2\n\ + strb r1, [r0]\n\ + ldr r0, ._156 + 16\n\ + add r1, r4, r0\n\ + mov r0, #0x5\n\ + strb r0, [r1]\n\ + bl sub_80EEE08\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r4, r4, r1\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._191\n\ +._157:\n\ + .align 2, 0\n\ +._156:\n\ + .word sub_80EBD80+1\n\ + .word +0x2000000\n\ + .word 0x6ddc\n\ + .word 0x6dad\n\ + .word 0x6dae\n\ +._140:\n\ + mov r0, #0x0\n\ + bl sub_80EF248\n\ + ldr r1, ._161\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._141:\n\ + mov r0, #0x0\n\ + bl sub_80EF284\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._158 @cond_branch\n\ + b ._191\n\ +._158:\n\ + ldr r1, ._161\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._184\n\ +._162:\n\ + .align 2, 0\n\ +._161:\n\ + .word +0x2000000\n\ +._142:\n\ + mov r0, #0x0\n\ + bl sub_80F1B8C\n\ + ldr r1, ._166\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._143:\n\ + mov r0, #0x0\n\ + bl sub_80F1BC8\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._163 @cond_branch\n\ + b ._191\n\ +._163:\n\ + ldr r1, ._166\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._184\n\ +._167:\n\ + .align 2, 0\n\ +._166:\n\ + .word +0x2000000\n\ +._144:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._191 @cond_branch\n\ + b ._169\n\ +._145:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._171\n\ + bl SetVBlankCallback\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._184\n\ +._172:\n\ + .align 2, 0\n\ +._171:\n\ + .word sub_80EBD18+1\n\ +._146:\n\ + mov r0, #0x0\n\ + bl sub_80EED2C\n\ + ldr r1, ._174\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._184\n\ +._175:\n\ + .align 2, 0\n\ +._174:\n\ + .word +0x2000000\n\ +._147:\n\ + ldr r0, ._178\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._191 @cond_branch\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._184\n\ +._179:\n\ + .align 2, 0\n\ +._178:\n\ + .word gPaletteFade\n\ +._148:\n\ + bl sub_80F2598\n\ + ldr r1, ._181\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._184\n\ +._182:\n\ + .align 2, 0\n\ +._181:\n\ + .word +0x2000000\n\ +._149:\n\ + mov r0, #0x0\n\ + bl sub_80F2C80\n\ + ldr r1, ._185\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._150:\n\ + mov r0, #0x0\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._191 @cond_branch\n\ + ldr r1, ._185\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._184\n\ +._186:\n\ + .align 2, 0\n\ +._185:\n\ + .word +0x2000000\n\ +._151:\n\ + bl sub_80F1DF0\n\ +._169:\n\ + ldr r1, ._188\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ +._184:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._191\n\ +._189:\n\ + .align 2, 0\n\ +._188:\n\ + .word +0x2000000\n\ +._152:\n\ + bl sub_80F1E50\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._191 @cond_branch\n\ + ldr r0, ._192\n\ + ldr r1, ._192 + 4\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + mov r0, #0x0\n\ + bl sub_80EF428\n\ + ldr r0, ._192 + 8\n\ + bl sub_80EBDBC\n\ + ldr r0, ._192 + 12\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._191 @cond_branch\n\ + ldr r0, ._192 + 16\n\ + ldr r2, ._192 + 20\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ +._191:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._193:\n\ + .align 2, 0\n\ +._192:\n\ + .word +0x2000000\n\ + .word 0x6dad\n\ + .word sub_80EC268+1\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800"); +} +#else void sub_80EC00C() { switch (ewram0_10.var304) @@ -630,6 +1220,7 @@ void sub_80EC00C() break; } } +#endif void sub_80EC210() { @@ -751,6 +1342,262 @@ void sub_80EC268() } } +#if DEBUG +__attribute__((naked)) +void sub_80EC4A0() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._285\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0xe\n\ + bls ._283 @cond_branch\n\ + b ._340\n\ +._283:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._285 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._286:\n\ + .align 2, 0\n\ +._285:\n\ + .word +0x2000000\n\ + .word ._287\n\ +._287:\n\ + .word ._288\n\ + .word ._289\n\ + .word ._290\n\ + .word ._291\n\ + .word ._292\n\ + .word ._293\n\ + .word ._294\n\ + .word ._295\n\ + .word ._296\n\ + .word ._297\n\ + .word ._298\n\ + .word ._299\n\ + .word ._300\n\ + .word ._301\n\ + .word ._302\n\ +._288:\n\ + bl sub_80F1E84\n\ + mov r0, #0x0\n\ + bl sub_80F2D04\n\ + b ._336\n\ +._289:\n\ + bl sub_80F1F10\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._304 @cond_branch\n\ + b ._340\n\ +._304:\n\ + ldr r0, ._308\n\ + ldrb r1, [r0, #0x15]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + mov r1, #0x8\n\ + cmp r0, #0\n\ + beq ._306 @cond_branch\n\ + mov r1, #0x7\n\ +._306:\n\ + add r0, r1, #0\n\ + bl sub_80EEFBC\n\ + ldr r1, ._308 + 4\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._335\n\ +._309:\n\ + .align 2, 0\n\ +._308:\n\ + .word gSaveBlock2\n\ + .word +0x2000000\n\ +._290:\n\ + bl sub_80EEF34\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + beq ._310 @cond_branch\n\ + b ._340\n\ +._310:\n\ + ldr r4, ._313\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + str r2, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._335\n\ +._314:\n\ + .align 2, 0\n\ +._313:\n\ + .word +0x2000000\n\ +._291:\n\ + ldr r0, ._318\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._315 @cond_branch\n\ + b ._340\n\ +._315:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl sub_80EED0C\n\ + b ._336\n\ +._319:\n\ + .align 2, 0\n\ +._318:\n\ + .word gPaletteFade\n\ +._292:\n\ + bl sub_80F2620\n\ + ldr r1, ._321\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._335\n\ +._322:\n\ + .align 2, 0\n\ +._321:\n\ + .word +0x2000000\n\ +._293:\n\ + bl sub_80EF814\n\ + b ._336\n\ +._294:\n\ + bl sub_80EF840\n\ + ldr r1, ._326\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._295:\n\ + bl sub_80EF874\n\ +._328:\n\ + lsl r0, r0, #0x18\n\ +._334:\n\ + cmp r0, #0\n\ + bne ._340 @cond_branch\n\ + b ._336\n\ +._327:\n\ + .align 2, 0\n\ +._326:\n\ + .word +0x2000000\n\ +._296:\n\ + mov r0, #0x4\n\ + bl sub_80F2C80\n\ + ldr r1, ._329\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._297:\n\ + mov r0, #0x4\n\ + bl sub_80F2CBC\n\ + b ._328\n\ +._330:\n\ + .align 2, 0\n\ +._329:\n\ + .word +0x2000000\n\ +._298:\n\ + bl sub_80F2DD8\n\ + ldr r0, ._332\n\ + bl SetVBlankCallback\n\ + ldr r1, ._332 + 4\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._335\n\ +._333:\n\ + .align 2, 0\n\ +._332:\n\ + .word sub_80EBD30+1\n\ + .word +0x2000000\n\ +._299:\n\ + bl sub_8055870\n\ + b ._334\n\ +._300:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._335\n\ +._301:\n\ + mov r0, #0x1\n\ + bl sub_80EED2C\n\ + ldr r0, ._338\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._336 @cond_branch\n\ + ldr r0, ._338 + 4\n\ + ldr r2, ._338 + 8\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ +._336:\n\ + ldr r1, ._338 + 12\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ +._335:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._340\n\ +._339:\n\ + .align 2, 0\n\ +._338:\n\ + .word gLinkOpen\n\ + .word 0x60075e0\n\ + .word 0x600f800\n\ + .word +0x2000000\n\ +._302:\n\ + ldr r0, ._341\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._340 @cond_branch\n\ + ldr r0, ._341 + 4\n\ + bl sub_80EBDBC\n\ +._340:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._342:\n\ + .align 2, 0\n\ +._341:\n\ + .word gPaletteFade\n\ + .word sub_80EC67C+1"); +} +#else void sub_80EC4A0() { u32 var1; @@ -835,7 +1682,243 @@ void sub_80EC4A0() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80EC67C() +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._345\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0x5\n\ + bls ._343 @cond_branch\n\ + b ._386\n\ +._343:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._345 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._346:\n\ + .align 2, 0\n\ +._345:\n\ + .word +0x2000000\n\ + .word ._347\n\ +._347:\n\ + .word ._348\n\ + .word ._349\n\ + .word ._350\n\ + .word ._351\n\ + .word ._352\n\ + .word ._353\n\ +._348:\n\ + bl sub_80FAB60\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x3\n\ + beq ._354 @cond_branch\n\ + cmp r0, #0x3\n\ + bgt ._355 @cond_branch\n\ + cmp r0, #0x1\n\ + beq ._356 @cond_branch\n\ + b ._386\n\ +._355:\n\ + cmp r0, #0x4\n\ + beq ._358 @cond_branch\n\ + cmp r0, #0x5\n\ + beq ._359 @cond_branch\n\ + b ._386\n\ +._356:\n\ + bl sub_80EED9C\n\ + b ._386\n\ +._354:\n\ + bl sub_80EF9F8\n\ + b ._386\n\ +._358:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._364\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + mov r1, #0x1\n\ + strh r1, [r0]\n\ + b ._386\n\ +._365:\n\ + .align 2, 0\n\ +._364:\n\ + .word +0x2000000\n\ +._359:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._367\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r0, r2\n\ + mov r1, #0x4\n\ + strh r1, [r0]\n\ + b ._386\n\ +._368:\n\ + .align 2, 0\n\ +._367:\n\ + .word +0x2000000\n\ +._349:\n\ + ldr r1, ._371\n\ + add r0, r4, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._369 @cond_branch\n\ + bl sub_80FAEC4\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._380\n\ +._372:\n\ + .align 2, 0\n\ +._371:\n\ + .word 0x6e90\n\ +._369:\n\ + mov r0, #0x1\n\ + bl sub_80EFBDC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._386 @cond_branch\n\ + bl sub_80FAEC4\n\ + b ._374\n\ +._350:\n\ + bl sub_80FAFC0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._386 @cond_branch\n\ + ldr r5, ._378\n\ + ldr r1, ._378 + 4\n\ + add r0, r5, r1\n\ + ldrb r4, [r0]\n\ + cmp r4, #0\n\ + bne ._376 @cond_branch\n\ + bl sub_80EFBB0\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r5, r2\n\ + strh r4, [r0]\n\ + b ._386\n\ +._379:\n\ + .align 2, 0\n\ +._378:\n\ + .word +0x2000000\n\ + .word 0x6e90\n\ +._376:\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r5, r0\n\ + b ._380\n\ +._351:\n\ + mov r0, #0x0\n\ + bl sub_80EFBDC\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0\n\ + bne ._386 @cond_branch\n\ + bl sub_80EFBB0\n\ + ldr r0, ._383\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + strh r4, [r0]\n\ + b ._386\n\ +._384:\n\ + .align 2, 0\n\ +._383:\n\ + .word +0x2000000\n\ +._352:\n\ + mov r2, #0xc2\n\ + lsl r2, r2, #0x2\n\ + add r0, r4, r2\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ +._374:\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ +._380:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._386\n\ +._353:\n\ + ldr r0, ._389\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._386 @cond_branch\n\ + bl sub_80F2DF4\n\ + mov r0, #0x4\n\ + bl sub_80F2D04\n\ + ldr r3, ._389 + 4\n\ + mov r2, #0x0\n\ + ldr r0, ._389 + 8\n\ + ldr r1, ._389 + 12\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._387 @cond_branch\n\ + mov r2, #0x1\n\ +._387:\n\ + lsl r2, r2, #0x3\n\ + ldrb r1, [r3, #0x15]\n\ + mov r0, #0x9\n\ + neg r0, r0\n\ + and r0, r0, r1\n\ + orr r0, r0, r2\n\ + strb r0, [r3, #0x15]\n\ + ldr r0, ._389 + 16\n\ + bl sub_80EBDBC\n\ +._386:\n\ + ldr r0, ._389 + 20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._388 @cond_branch\n\ + ldr r0, ._389 + 24\n\ + ldr r2, ._389 + 28\n\ + add r0, r0, r2\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._388:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._390:\n\ + .align 2, 0\n\ +._389:\n\ + .word gPaletteFade\n\ + .word gSaveBlock2\n\ + .word +0x2000000\n\ + .word 0x6e90\n\ + .word sub_80EC00C+1\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void sub_80EC67C() { switch (ewram0_10.var304) @@ -907,6 +1990,7 @@ void sub_80EC67C() break; } } +#endif void sub_80EC81C() { @@ -1001,6 +2085,275 @@ void sub_80EC9A8() } } +#if DEBUG +__attribute__((naked)) +void sub_80ECA10() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._456\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0xd\n\ + bls ._454 @cond_branch\n\ + b ._509\n\ +._454:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._456 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._457:\n\ + .align 2, 0\n\ +._456:\n\ + .word +0x2000000\n\ + .word ._458\n\ +._458:\n\ + .word ._459\n\ + .word ._460\n\ + .word ._461\n\ + .word ._462\n\ + .word ._463\n\ + .word ._464\n\ + .word ._465\n\ + .word ._466\n\ + .word ._467\n\ + .word ._468\n\ + .word ._469\n\ + .word ._470\n\ + .word ._471\n\ + .word ._472\n\ +._459:\n\ + bl sub_80EEF78\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._473 @cond_branch\n\ + b ._509\n\ +._473:\n\ + ldr r0, ._476\n\ + bl SetVBlankCallback\n\ + bl sub_80EED1C\n\ + ldr r4, ._476 + 4\n\ + ldr r1, ._476 + 8\n\ + add r0, r4, r1\n\ + ldrb r1, [r0]\n\ + ldr r2, ._476 + 12\n\ + add r0, r4, r2\n\ + strb r1, [r0]\n\ + ldr r0, ._476 + 16\n\ + add r1, r4, r0\n\ + mov r0, #0x3\n\ + strb r0, [r1]\n\ + bl sub_80EEE08\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r4, r4, r1\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._509\n\ +._477:\n\ + .align 2, 0\n\ +._476:\n\ + .word sub_80EBD80+1\n\ + .word +0x2000000\n\ + .word 0x6df0\n\ + .word 0x6dad\n\ + .word 0x6dae\n\ +._460:\n\ + mov r0, #0x1\n\ + bl sub_80EF248\n\ + ldr r1, ._481\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._461:\n\ + mov r0, #0x1\n\ + bl sub_80EF284\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._478 @cond_branch\n\ + b ._509\n\ +._478:\n\ + ldr r1, ._481\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._502\n\ +._482:\n\ + .align 2, 0\n\ +._481:\n\ + .word +0x2000000\n\ +._462:\n\ + mov r0, #0x1\n\ + bl sub_80F1B8C\n\ + ldr r1, ._486\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._463:\n\ + mov r0, #0x1\n\ + bl sub_80F1BC8\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._483 @cond_branch\n\ + b ._509\n\ +._483:\n\ + ldr r1, ._486\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._502\n\ +._487:\n\ + .align 2, 0\n\ +._486:\n\ + .word +0x2000000\n\ +._464:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._509 @cond_branch\n\ + b ._496\n\ +._465:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._491\n\ + bl SetVBlankCallback\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._502\n\ +._492:\n\ + .align 2, 0\n\ +._491:\n\ + .word sub_80EBD18+1\n\ +._466:\n\ + mov r0, #0x0\n\ + bl sub_80EED2C\n\ + ldr r1, ._494\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._502\n\ +._495:\n\ + .align 2, 0\n\ +._494:\n\ + .word +0x2000000\n\ +._467:\n\ + bl sub_80F2598\n\ + b ._496\n\ +._468:\n\ + ldr r0, ._499\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._509 @cond_branch\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ + b ._502\n\ +._500:\n\ + .align 2, 0\n\ +._499:\n\ + .word gPaletteFade\n\ +._469:\n\ + mov r0, #0x1\n\ + bl sub_80F2C80\n\ + ldr r1, ._503\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._470:\n\ + mov r0, #0x1\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._509 @cond_branch\n\ + ldr r1, ._503\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._502\n\ +._504:\n\ + .align 2, 0\n\ +._503:\n\ + .word +0x2000000\n\ +._471:\n\ + bl sub_80F1DF0\n\ +._496:\n\ + ldr r1, ._506\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ +._502:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._509\n\ +._507:\n\ + .align 2, 0\n\ +._506:\n\ + .word +0x2000000\n\ +._472:\n\ + bl sub_80F1E50\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._509 @cond_branch\n\ + ldr r0, ._510\n\ + ldr r1, ._510 + 4\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + mov r0, #0x1\n\ + bl sub_80EF428\n\ + ldr r0, ._510 + 8\n\ + bl sub_80EBDBC\n\ + ldr r0, ._510 + 12\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._509 @cond_branch\n\ + ldr r0, ._510 + 16\n\ + ldr r2, ._510 + 20\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ +._509:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._511:\n\ + .align 2, 0\n\ +._510:\n\ + .word +0x2000000\n\ + .word 0x6dad\n\ + .word sub_80EC86C+1\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800"); +} +#else void sub_80ECA10() { switch (ewram0_10.var304) @@ -1072,6 +2425,7 @@ void sub_80ECA10() break; } } +#endif void sub_80ECC08() { @@ -1127,6 +2481,362 @@ void sub_80ECC08() } } +#if DEBUG +__attribute__((naked)) +void sub_80ECD80() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._564\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0x14\n\ + bls ._562 @cond_branch\n\ + b ._642\n\ +._562:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._564 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._565:\n\ + .align 2, 0\n\ +._564:\n\ + .word +0x2000000\n\ + .word ._566\n\ +._566:\n\ + .word ._567\n\ + .word ._568\n\ + .word ._569\n\ + .word ._570\n\ + .word ._571\n\ + .word ._572\n\ + .word ._573\n\ + .word ._574\n\ + .word ._575\n\ + .word ._576\n\ + .word ._577\n\ + .word ._578\n\ + .word ._579\n\ + .word ._580\n\ + .word ._581\n\ + .word ._582\n\ + .word ._583\n\ + .word ._584\n\ + .word ._585\n\ + .word ._586\n\ + .word ._587\n\ +._567:\n\ + mov r3, #0xc2\n\ + lsl r3, r3, #0x2\n\ + add r0, r4, r3\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ + b ._630\n\ +._568:\n\ + ldr r0, ._592\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._589 @cond_branch\n\ + b ._642\n\ +._589:\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._630\n\ +._593:\n\ + .align 2, 0\n\ +._592:\n\ + .word gPaletteFade\n\ +._569:\n\ + bl sub_80EEF78\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._594 @cond_branch\n\ + b ._642\n\ +._594:\n\ + ldr r0, ._597\n\ + bl SetVBlankCallback\n\ + b ._625\n\ +._598:\n\ + .align 2, 0\n\ +._597:\n\ + .word sub_80EBD80+1\n\ +._570:\n\ + bl sub_80EED1C\n\ + bl sub_80F3130\n\ + ldr r1, ._600\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._630\n\ +._601:\n\ + .align 2, 0\n\ +._600:\n\ + .word +0x2000000\n\ +._571:\n\ + mov r0, #0x1\n\ + bl sub_80F2D6C\n\ + ldr r1, ._603\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._630\n\ +._604:\n\ + .align 2, 0\n\ +._603:\n\ + .word +0x2000000\n\ +._572:\n\ + mov r0, #0x5\n\ + bl sub_80F2D6C\n\ + b ._625\n\ +._573:\n\ + ldr r1, ._607\n\ + add r0, r4, r1\n\ + ldrb r1, [r0]\n\ + ldr r2, ._607 + 4\n\ + add r0, r4, r2\n\ + strb r1, [r0]\n\ + ldr r3, ._607 + 8\n\ + add r1, r4, r3\n\ + mov r0, #0x6\n\ + strb r0, [r1]\n\ + bl sub_80EEE08\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ + b ._630\n\ +._608:\n\ + .align 2, 0\n\ +._607:\n\ + .word 0x6dfc\n\ + .word 0x6dad\n\ + .word 0x6dae\n\ +._574:\n\ + mov r0, #0x2\n\ + bl sub_80EF248\n\ + ldr r1, ._612\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._575:\n\ + mov r0, #0x2\n\ + bl sub_80EF284\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._609 @cond_branch\n\ + b ._642\n\ +._609:\n\ + b ._625\n\ +._613:\n\ + .align 2, 0\n\ +._612:\n\ + .word +0x2000000\n\ +._576:\n\ + mov r0, #0x2\n\ + bl sub_80F1B8C\n\ + ldr r1, ._617\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._577:\n\ + mov r0, #0x2\n\ + bl sub_80F1BC8\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._614 @cond_branch\n\ + b ._642\n\ +._614:\n\ + ldr r1, ._617\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._630\n\ +._618:\n\ + .align 2, 0\n\ +._617:\n\ + .word +0x2000000\n\ +._578:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + beq ._619 @cond_branch\n\ + b ._642\n\ +._619:\n\ + b ._625\n\ +._579:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._623\n\ + bl SetVBlankCallback\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._630\n\ +._624:\n\ + .align 2, 0\n\ +._623:\n\ + .word sub_80EBD18+1\n\ +._580:\n\ + mov r0, #0x0\n\ + bl sub_80EED2C\n\ + b ._625\n\ +._581:\n\ + bl sub_80F2598\n\ + ldr r1, ._627\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._630\n\ +._628:\n\ + .align 2, 0\n\ +._627:\n\ + .word +0x2000000\n\ +._582:\n\ + ldr r0, ._631\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._642 @cond_branch\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._630\n\ +._632:\n\ + .align 2, 0\n\ +._631:\n\ + .word gPaletteFade\n\ +._583:\n\ + mov r0, #0x1\n\ + bl sub_80F2C80\n\ + ldr r1, ._635\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._584:\n\ + mov r0, #0x1\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + bne ._642 @cond_branch\n\ + ldr r0, ._635\n\ + ldr r3, ._635 + 4\n\ + add r1, r0, r3\n\ + strh r2, [r1]\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + add r1, r1, #0x1\n\ + strh r1, [r0]\n\ + b ._642\n\ +._636:\n\ + .align 2, 0\n\ +._635:\n\ + .word +0x2000000\n\ + .word 0x306\n\ +._585:\n\ + mov r0, #0x5\n\ + bl sub_80F2C80\n\ + ldr r1, ._639\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._586:\n\ + mov r0, #0x5\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._642 @cond_branch\n\ + bl sub_80F1DF0\n\ +._625:\n\ + ldr r1, ._639\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ +._630:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._642\n\ +._640:\n\ + .align 2, 0\n\ +._639:\n\ + .word +0x2000000\n\ +._587:\n\ + bl sub_80F1E50\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._642 @cond_branch\n\ + ldr r0, ._643\n\ + ldr r1, ._643 + 4\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + mov r0, #0x2\n\ + bl sub_80EF428\n\ + ldr r0, ._643 + 8\n\ + bl sub_80EBDBC\n\ + ldr r0, ._643 + 12\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._642 @cond_branch\n\ + ldr r0, ._643 + 16\n\ + ldr r2, ._643 + 20\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ +._642:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._644:\n\ + .align 2, 0\n\ +._643:\n\ + .word +0x2000000\n\ + .word 0x6dad\n\ + .word sub_80ECC08+1\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800"); +} +#else void sub_80ECD80() { switch (ewram0_10.var304) @@ -1233,7 +2943,418 @@ void sub_80ECD80() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80ED01C() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._647\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0x13\n\ + bls ._645 @cond_branch\n\ + b ._736\n\ +._645:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._647 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._648:\n\ + .align 2, 0\n\ +._647:\n\ + .word +0x2000000\n\ + .word ._649\n\ +._649:\n\ + .word ._650\n\ + .word ._651\n\ + .word ._652\n\ + .word ._653\n\ + .word ._654\n\ + .word ._655\n\ + .word ._656\n\ + .word ._657\n\ + .word ._658\n\ + .word ._659\n\ + .word ._660\n\ + .word ._661\n\ + .word ._662\n\ + .word ._663\n\ + .word ._664\n\ + .word ._665\n\ + .word ._666\n\ + .word ._667\n\ + .word ._668\n\ + .word ._669\n\ +._650:\n\ + bl sub_80F1E84\n\ + mov r0, #0x1\n\ + bl sub_80F2D04\n\ + mov r0, #0x5\n\ + bl sub_80F2D04\n\ + ldr r1, ._671\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + b ._724\n\ +._672:\n\ + .align 2, 0\n\ +._671:\n\ + .word +0x2000000\n\ +._651:\n\ + bl sub_80F1F10\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._673 @cond_branch\n\ + b ._736\n\ +._673:\n\ + mov r0, #0x0\n\ + bl sub_80EEFBC\n\ + ldr r1, ._676\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._724\n\ +._677:\n\ + .align 2, 0\n\ +._676:\n\ + .word +0x2000000\n\ +._652:\n\ + bl sub_80EEF34\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + beq ._678 @cond_branch\n\ + b ._736\n\ +._678:\n\ + ldr r4, ._681\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + str r2, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._724\n\ +._682:\n\ + .align 2, 0\n\ +._681:\n\ + .word +0x2000000\n\ +._653:\n\ + ldr r0, ._686\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._683 @cond_branch\n\ + b ._736\n\ +._683:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl sub_80EED0C\n\ + bl sub_80EF814\n\ + ldr r1, ._686 + 4\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + b ._724\n\ +._687:\n\ + .align 2, 0\n\ +._686:\n\ + .word gPaletteFade\n\ + .word +0x2000000\n\ +._654:\n\ + bl sub_80F2620\n\ + ldr r1, ._689\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._724\n\ +._690:\n\ + .align 2, 0\n\ +._689:\n\ + .word +0x2000000\n\ +._655:\n\ + bl sub_80F4D44\n\ + ldr r1, ._693\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._656:\n\ + bl sub_80F4D88\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._691 @cond_branch\n\ + ldr r1, ._693\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x2\n\ + strh r0, [r1]\n\ + b ._736\n\ +._694:\n\ + .align 2, 0\n\ +._693:\n\ + .word +0x2000000\n\ +._691:\n\ + ldr r1, ._696\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._724\n\ +._697:\n\ + .align 2, 0\n\ +._696:\n\ + .word +0x2000000\n\ +._657:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + beq ._698 @cond_branch\n\ + b ._736\n\ +._698:\n\ + ldr r1, ._701\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._736\n\ +._702:\n\ + .align 2, 0\n\ +._701:\n\ + .word +0x2000000\n\ +._658:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + beq ._703 @cond_branch\n\ + b ._736\n\ +._703:\n\ + ldr r1, ._706\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + b ._724\n\ +._707:\n\ + .align 2, 0\n\ +._706:\n\ + .word +0x2000000\n\ +._659:\n\ + mov r0, #0x0\n\ + bl sub_80F0264\n\ + ldr r1, ._711\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._660:\n\ + bl sub_80F02A0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._708 @cond_branch\n\ + b ._736\n\ +._708:\n\ + ldr r1, ._711\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._724\n\ +._712:\n\ + .align 2, 0\n\ +._711:\n\ + .word +0x2000000\n\ +._661:\n\ + mov r0, #0x0\n\ + bl sub_80F3008\n\ + ldr r1, ._714\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + b ._724\n\ +._715:\n\ + .align 2, 0\n\ +._714:\n\ + .word +0x2000000\n\ +._662:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + beq ._716 @cond_branch\n\ + b ._736\n\ +._716:\n\ + ldr r1, ._719\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._724\n\ +._720:\n\ + .align 2, 0\n\ +._719:\n\ + .word +0x2000000\n\ +._663:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._722\n\ + bl SetVBlankCallback\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._724\n\ +._723:\n\ + .align 2, 0\n\ +._722:\n\ + .word sub_80EBD18+1\n\ +._664:\n\ + mov r0, #0x4\n\ + bl sub_80EED2C\n\ + ldr r1, ._725\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r1, r3\n\ + b ._724\n\ +._726:\n\ + .align 2, 0\n\ +._725:\n\ + .word +0x2000000\n\ +._665:\n\ + ldr r0, ._729\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r1, r0, #0x18\n\ + cmp r1, #0\n\ + bne ._736 @cond_branch\n\ + ldr r2, ._729 + 4\n\ + add r0, r4, r2\n\ + strh r1, [r0]\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r1, r4, r3\n\ +._724:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._736\n\ +._730:\n\ + .align 2, 0\n\ +._729:\n\ + .word gPaletteFade\n\ + .word 0x306\n\ +._666:\n\ + mov r0, #0x1\n\ + bl sub_80F2C80\n\ + ldr r1, ._733\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._667:\n\ + mov r0, #0x1\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + bne ._736 @cond_branch\n\ + ldr r0, ._733\n\ + ldr r3, ._733 + 4\n\ + add r1, r0, r3\n\ + strh r2, [r1]\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + add r1, r1, #0x1\n\ + strh r1, [r0]\n\ + b ._736\n\ +._734:\n\ + .align 2, 0\n\ +._733:\n\ + .word +0x2000000\n\ + .word 0x306\n\ +._668:\n\ + ldr r4, ._737\n\ + ldr r2, ._737 + 4\n\ + add r0, r4, r2\n\ + ldrb r0, [r0]\n\ + add r0, r0, #0x7\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl sub_80F2C80\n\ + mov r3, #0xc1\n\ + lsl r3, r3, #0x2\n\ + add r4, r4, r3\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ +._669:\n\ + ldr r0, ._737\n\ + ldr r1, ._737 + 4\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + add r0, r0, #0x7\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._736 @cond_branch\n\ + ldr r0, ._737 + 8\n\ + bl sub_80EBDBC\n\ + ldr r0, ._737 + 12\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._736 @cond_branch\n\ + ldr r0, ._737 + 16\n\ + ldr r2, ._737 + 20\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ +._736:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._738:\n\ + .align 2, 0\n\ +._737:\n\ + .word +0x2000000\n\ + .word 0x6dfc\n\ + .word sub_80ED31C+1\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800"); +} +#else void sub_80ED01C() { switch (ewram0_10.var304) @@ -1342,7 +3463,129 @@ void sub_80ED01C() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80ED31C() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._743\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r4, r0, r1\n\ + ldrh r0, [r4]\n\ + cmp r0, #0x1\n\ + beq ._739 @cond_branch\n\ + cmp r0, #0x1\n\ + bgt ._740 @cond_branch\n\ + cmp r0, #0\n\ + beq ._741 @cond_branch\n\ + b ._761\n\ +._744:\n\ + .align 2, 0\n\ +._743:\n\ + .word +0x2000000\n\ +._740:\n\ + cmp r0, #0x2\n\ + beq ._745 @cond_branch\n\ + b ._761\n\ +._741:\n\ + bl sub_80F5DD4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + beq ._747 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._748 @cond_branch\n\ + ldr r0, ._751\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._749 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._751 + 4\n\ + bl sub_80EBDBC\n\ + b ._762\n\ +._752:\n\ + .align 2, 0\n\ +._751:\n\ + .word gMain\n\ + .word sub_80ED4D8+1\n\ +._747:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl ShowMapNamePopUpWindow\n\ + b ._762\n\ +._748:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._762\n\ +._749:\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._761 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._757\n\ + bl sub_80EBDBC\n\ + b ._762\n\ +._758:\n\ + .align 2, 0\n\ +._757:\n\ + .word sub_80ECD80+1\n\ +._739:\n\ + bl sub_80F0718\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._761 @cond_branch\n\ + bl ShowMapNamePopUpWindow\n\ + bl sub_80F3264\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + b ._760\n\ +._745:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._761 @cond_branch\n\ +._760:\n\ + strh r0, [r4]\n\ +._761:\n\ + ldr r0, ._763\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._762 @cond_branch\n\ + ldr r0, ._763 + 4\n\ + ldr r1, ._763 + 8\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x8\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._762:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._764:\n\ + .align 2, 0\n\ +._763:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void sub_80ED31C() { switch (ewram0_10.var304) @@ -1386,7 +3629,195 @@ void sub_80ED31C() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80ED3D0() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._767\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + cmp r0, #0x8\n\ + bls ._765 @cond_branch\n\ + b ._803\n\ +._765:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._767 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._768:\n\ + .align 2, 0\n\ +._767:\n\ + .word +0x2000000\n\ + .word ._769\n\ +._769:\n\ + .word ._770\n\ + .word ._771\n\ + .word ._772\n\ + .word ._773\n\ + .word ._774\n\ + .word ._775\n\ + .word ._776\n\ + .word ._777\n\ + .word ._778\n\ +._770:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + ldr r1, ._780\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._793\n\ +._781:\n\ + .align 2, 0\n\ +._780:\n\ + .word +0x2000000\n\ +._771:\n\ + bl sub_80EED0C\n\ + bl sub_80F6134\n\ + ldr r1, ._783\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._793\n\ +._784:\n\ + .align 2, 0\n\ +._783:\n\ + .word +0x2000000\n\ +._772:\n\ + mov r0, #0x0\n\ + bl sub_80EEFBC\n\ + ldr r1, ._786\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._793\n\ +._787:\n\ + .align 2, 0\n\ +._786:\n\ + .word +0x2000000\n\ +._773:\n\ + mov r0, #0x0\n\ + bl sub_80F0264\n\ + ldr r1, ._790\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._774:\n\ + bl sub_80F02A0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._803 @cond_branch\n\ + ldr r1, ._790\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._793\n\ +._791:\n\ + .align 2, 0\n\ +._790:\n\ + .word +0x2000000\n\ +._775:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._803 @cond_branch\n\ + ldr r1, ._794\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._793\n\ +._795:\n\ + .align 2, 0\n\ +._794:\n\ + .word +0x2000000\n\ +._776:\n\ + mov r0, #0x0\n\ + bl sub_80F3008\n\ + ldr r4, ._797\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._797 + 4\n\ + bl SetVBlankCallback\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ +._793:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._803\n\ +._798:\n\ + .align 2, 0\n\ +._797:\n\ + .word +0x2000000\n\ + .word sub_80EBD18+1\n\ +._777:\n\ + mov r0, #0x4\n\ + bl sub_80EED2C\n\ + ldr r1, ._801\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + ldr r0, ._801 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._803 @cond_branch\n\ + ldr r0, ._801 + 8\n\ + ldr r2, ._801 + 12\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ + b ._803\n\ +._802:\n\ + .align 2, 0\n\ +._801:\n\ + .word +0x2000000\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800\n\ +._778:\n\ + ldr r0, ._804\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._803 @cond_branch\n\ + ldr r0, ._804 + 4\n\ + bl sub_80EBDBC\n\ +._803:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._805:\n\ + .align 2, 0\n\ +._804:\n\ + .word gPaletteFade\n\ + .word sub_80ED31C+1"); +} +#else void sub_80ED3D0() { switch (ewram0_10.var304) @@ -1432,7 +3863,207 @@ void sub_80ED3D0() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80ED4D8() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._808\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0x8\n\ + bls ._806 @cond_branch\n\ + b ._844\n\ +._806:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._808 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._809:\n\ + .align 2, 0\n\ +._808:\n\ + .word +0x2000000\n\ + .word ._810\n\ +._810:\n\ + .word ._811\n\ + .word ._812\n\ + .word ._813\n\ + .word ._814\n\ + .word ._815\n\ + .word ._816\n\ + .word ._817\n\ + .word ._818\n\ + .word ._819\n\ +._811:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + b ._820\n\ +._812:\n\ + ldr r0, ._824\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._821 @cond_branch\n\ + b ._844\n\ +._821:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl sub_80EED0C\n\ + bl sub_80F3130\n\ + ldr r1, ._824 + 4\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._834\n\ +._825:\n\ + .align 2, 0\n\ +._824:\n\ + .word gPaletteFade\n\ + .word +0x2000000\n\ +._813:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._844 @cond_branch\n\ + ldr r1, ._828\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._834\n\ +._829:\n\ + .align 2, 0\n\ +._828:\n\ + .word +0x2000000\n\ +._814:\n\ + bl sub_80F4CF0\n\ + ldr r1, ._831\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._834\n\ +._832:\n\ + .align 2, 0\n\ +._831:\n\ + .word +0x2000000\n\ +._815:\n\ + bl sub_80EFF34\n\ + ldr r1, ._835\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._816:\n\ + bl sub_80EFF68\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._844 @cond_branch\n\ + ldr r1, ._835\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._834\n\ +._836:\n\ + .align 2, 0\n\ +._835:\n\ + .word +0x2000000\n\ +._817:\n\ + bl sub_80F35B4\n\ + mov r0, #0x2\n\ + bl sub_80EEFBC\n\ + ldr r4, ._838\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._838 + 4\n\ + bl SetVBlankCallback\n\ +._820:\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ +._834:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._844\n\ +._839:\n\ + .align 2, 0\n\ +._838:\n\ + .word +0x2000000\n\ + .word sub_80EBD4C+1\n\ +._818:\n\ + mov r0, #0x2\n\ + bl sub_80EED2C\n\ + ldr r1, ._842\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + ldr r0, ._842 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._844 @cond_branch\n\ + ldr r0, ._842 + 8\n\ + ldr r2, ._842 + 12\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ + b ._844\n\ +._843:\n\ + .align 2, 0\n\ +._842:\n\ + .word +0x2000000\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f000\n\ +._819:\n\ + ldr r0, ._845\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._844 @cond_branch\n\ + ldr r0, ._845 + 4\n\ + bl sub_80EBDBC\n\ +._844:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._846:\n\ + .align 2, 0\n\ +._845:\n\ + .word gPaletteFade\n\ + .word sub_80ED858+1"); +} +#else void sub_80ED4D8() { switch (ewram0_10.var304) @@ -1483,7 +4114,310 @@ void sub_80ED4D8() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80ED620() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._849\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0x10\n\ + bls ._847 @cond_branch\n\ + b ._912\n\ +._847:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._849 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._850:\n\ + .align 2, 0\n\ +._849:\n\ + .word +0x2000000\n\ + .word ._851\n\ +._851:\n\ + .word ._852\n\ + .word ._853\n\ + .word ._854\n\ + .word ._855\n\ + .word ._856\n\ + .word ._857\n\ + .word ._858\n\ + .word ._859\n\ + .word ._860\n\ + .word ._861\n\ + .word ._862\n\ + .word ._863\n\ + .word ._864\n\ + .word ._865\n\ + .word ._866\n\ + .word ._867\n\ + .word ._868\n\ +._852:\n\ + bl sub_80F1E84\n\ + mov r0, #0x1\n\ + bl sub_80F2D04\n\ + ldr r1, ._870\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._904\n\ +._871:\n\ + .align 2, 0\n\ +._870:\n\ + .word +0x2000000\n\ +._853:\n\ + bl sub_80F1F10\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._872 @cond_branch\n\ + b ._912\n\ +._872:\n\ + mov r0, #0x1\n\ + bl sub_80EEFBC\n\ + b ._885\n\ +._854:\n\ + bl sub_80EEF34\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + beq ._875 @cond_branch\n\ + b ._912\n\ +._875:\n\ + ldr r4, ._878\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + str r2, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._904\n\ +._879:\n\ + .align 2, 0\n\ +._878:\n\ + .word +0x2000000\n\ +._855:\n\ + ldr r0, ._883\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0\n\ + beq ._880 @cond_branch\n\ + b ._912\n\ +._880:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl sub_80EED0C\n\ + bl sub_80EF814\n\ + ldr r0, ._883 + 4\n\ + ldr r2, ._883 + 8\n\ + add r1, r0, r2\n\ + strb r4, [r1]\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrh r1, [r0]\n\ + add r1, r1, #0x1\n\ + strh r1, [r0]\n\ + b ._912\n\ +._884:\n\ + .align 2, 0\n\ +._883:\n\ + .word gPaletteFade\n\ + .word +0x2000000\n\ + .word 0x76aa\n\ +._856:\n\ + bl sub_80F2620\n\ + b ._885\n\ +._857:\n\ + ldr r0, ._887\n\ + add r1, r4, r0\n\ + mov r0, #0x2\n\ + strb r0, [r1]\n\ + bl sub_80F4BD0\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._904\n\ +._888:\n\ + .align 2, 0\n\ +._887:\n\ + .word 0xd162\n\ +._858:\n\ + bl sub_80EFF34\n\ + ldr r1, ._890\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._859:\n\ + bl sub_80EFF68\n\ + b ._889\n\ +._891:\n\ + .align 2, 0\n\ +._890:\n\ + .word +0x2000000\n\ +._860:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._912 @cond_branch\n\ + ldr r1, ._894\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._904\n\ +._895:\n\ + .align 2, 0\n\ +._894:\n\ + .word +0x2000000\n\ +._861:\n\ + bl sub_8055870\n\ + b ._896\n\ +._862:\n\ + bl sub_80F33A8\n\ + ldr r4, ._898\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._898 + 4\n\ + bl SetVBlankCallback\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._904\n\ +._899:\n\ + .align 2, 0\n\ +._898:\n\ + .word +0x2000000\n\ + .word sub_80EBD4C+1\n\ +._863:\n\ + mov r0, #0x2\n\ + bl sub_80EED2C\n\ + ldr r1, ._901\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._904\n\ +._902:\n\ + .align 2, 0\n\ +._901:\n\ + .word +0x2000000\n\ +._864:\n\ + ldr r0, ._905\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._912 @cond_branch\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + b ._904\n\ +._906:\n\ + .align 2, 0\n\ +._905:\n\ + .word gPaletteFade\n\ +._865:\n\ + mov r0, #0x1\n\ + bl sub_80F2C80\n\ + ldr r1, ._909\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._866:\n\ + mov r0, #0x1\n\ + bl sub_80F2CBC\n\ +._889:\n\ + lsl r0, r0, #0x18\n\ +._896:\n\ + cmp r0, #0\n\ + bne ._912 @cond_branch\n\ +._885:\n\ + ldr r1, ._909\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ +._904:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._912\n\ +._910:\n\ + .align 2, 0\n\ +._909:\n\ + .word +0x2000000\n\ +._867:\n\ + mov r0, #0x6\n\ + bl sub_80F2C80\n\ + ldr r1, ._913\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._868:\n\ + mov r0, #0x6\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._912 @cond_branch\n\ + ldr r0, ._913 + 4\n\ + bl sub_80EBDBC\n\ + ldr r0, ._913 + 8\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._912 @cond_branch\n\ + ldr r0, ._913 + 12\n\ + ldr r2, ._913 + 16\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ +._912:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._914:\n\ + .align 2, 0\n\ +._913:\n\ + .word +0x2000000\n\ + .word sub_80ED858+1\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f000"); +} +#else void sub_80ED620() { switch (ewram0_10.var304) @@ -1573,6 +4507,7 @@ void sub_80ED620() break; } } +#endif #if 0 void sub_80F4F78(); @@ -1742,8 +4677,433 @@ label2: } #else +#if DEBUG __attribute__((naked)) -void sub_80ED858() { +void sub_80ED858() +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._917\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r5, r1, #0\n\ + cmp r0, #0xb\n\ + bls ._915 @cond_branch\n\ + b ._999\n\ +._915:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._917 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._918:\n\ + .align 2, 0\n\ +._917:\n\ + .word +0x2000000\n\ + .word ._919\n\ +._919:\n\ + .word ._920\n\ + .word ._921\n\ + .word ._922\n\ + .word ._923\n\ + .word ._924\n\ + .word ._925\n\ + .word ._926\n\ + .word ._927\n\ + .word ._928\n\ + .word ._929\n\ + .word ._999\n\ + .word ._931\n\ +._920:\n\ + bl sub_80F4F78\n\ + bl sub_80F5B38\n\ + ldr r0, ._933\n\ + mov r4, #0xc1\n\ + lsl r4, r4, #0x2\n\ + add r0, r0, r4\n\ + mov r1, #0x1\n\ + strh r1, [r0]\n\ + b ._999\n\ +._934:\n\ + .align 2, 0\n\ +._933:\n\ + .word +0x2000000\n\ +._921:\n\ + bl sub_80F5B50\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._935 @cond_branch\n\ + b ._999\n\ +._935:\n\ + ldr r0, ._938\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + mov r1, #0x2\n\ + strh r1, [r0]\n\ + b ._999\n\ +._939:\n\ + .align 2, 0\n\ +._938:\n\ + .word +0x2000000\n\ +._922:\n\ + mov r0, #0x1\n\ + bl sub_80F0174\n\ + ldr r0, ._941\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r0, r2\n\ + mov r1, #0x3\n\ + strh r1, [r0]\n\ + b ._999\n\ +._942:\n\ + .align 2, 0\n\ +._941:\n\ + .word +0x2000000\n\ +._923:\n\ + bl sub_80F4FB4\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._943 @cond_branch\n\ + b ._999\n\ +._943:\n\ + bl sub_80F3C94\n\ + bl sub_80F3D00\n\ + b ._945\n\ +._924:\n\ + ldr r2, ._951\n\ + ldrh r1, [r2, #0x2c]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + add r3, r2, #0\n\ + cmp r0, #0\n\ + beq ._949 @cond_branch\n\ + ldr r1, ._951 + 4\n\ + add r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._949 @cond_branch\n\ + ldr r2, ._951 + 8\n\ + add r0, r5, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._948 @cond_branch\n\ + ldr r4, ._951 + 12\n\ + add r0, r5, r4\n\ + mov r1, #0x0\n\ + ldsh r0, [r0, r1]\n\ + cmp r0, #0\n\ + beq ._949 @cond_branch\n\ +._948:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0x1\n\ + bl sub_80F5060\n\ + bl move_anim_execute\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r5, r2\n\ + b ._950\n\ +._952:\n\ + .align 2, 0\n\ +._951:\n\ + .word gMain\n\ + .word 0x87cb\n\ + .word 0x76aa\n\ + .word 0x87dc\n\ +._949:\n\ + ldrh r1, [r3, #0x2c]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._956 @cond_branch\n\ + ldr r4, ._958\n\ + add r0, r5, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._956 @cond_branch\n\ + ldr r1, ._958 + 4\n\ + add r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._955 @cond_branch\n\ + ldr r2, ._958 + 8\n\ + add r0, r5, r2\n\ + sub r4, r4, #0x57\n\ + add r1, r5, r4\n\ + mov r4, #0x0\n\ + ldsh r2, [r0, r4]\n\ + mov r4, #0x0\n\ + ldsh r0, [r1, r4]\n\ + cmp r2, r0\n\ + bge ._956 @cond_branch\n\ +._955:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0x0\n\ + bl sub_80F5060\n\ + bl move_anim_execute\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r5, r0\n\ +._950:\n\ + mov r0, #0x5\n\ + strh r0, [r1]\n\ + b ._999\n\ +._959:\n\ + .align 2, 0\n\ +._958:\n\ + .word 0x87cb\n\ + .word 0x76aa\n\ + .word 0x87dc\n\ +._956:\n\ + ldrh r2, [r3, #0x2e]\n\ + mov r0, #0x2\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + beq ._960 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_80F4FDC\n\ + bl move_anim_execute\n\ + ldr r0, ._962\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + mov r1, #0x9\n\ + strh r1, [r0]\n\ + b ._999\n\ +._963:\n\ + .align 2, 0\n\ +._962:\n\ + .word +0x2000000\n\ +._960:\n\ + mov r0, #0x1\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + bne ._964 @cond_branch\n\ + b ._999\n\ +._964:\n\ + add r4, r5, #0\n\ + ldr r2, ._970\n\ + add r0, r4, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._966 @cond_branch\n\ + ldr r1, ._970 + 4\n\ + add r0, r4, r1\n\ + mov r2, #0x0\n\ + ldsh r1, [r0, r2]\n\ + ldr r2, ._970 + 8\n\ + add r0, r4, r2\n\ + mov r2, #0x0\n\ + ldsh r0, [r0, r2]\n\ + sub r0, r0, #0x1\n\ + cmp r1, r0\n\ + beq ._967 @cond_branch\n\ + b ._999\n\ +._967:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ + mov r0, #0x9\n\ + strh r0, [r1]\n\ + b ._999\n\ +._971:\n\ + .align 2, 0\n\ +._970:\n\ + .word 0x76aa\n\ + .word 0x87dc\n\ + .word 0x87da\n\ +._966:\n\ + ldr r1, ._975\n\ + add r0, r5, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._972 @cond_branch\n\ + b ._999\n\ +._972:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r5, r2\n\ + mov r0, #0x7\n\ + strh r0, [r1]\n\ + b ._999\n\ +._976:\n\ + .align 2, 0\n\ +._975:\n\ + .word 0x6dac\n\ +._925:\n\ + bl gpu_sync_bg_show\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._977 @cond_branch\n\ + b ._999\n\ +._977:\n\ + bl sub_80F3D00\n\ + ldr r0, ._980\n\ + mov r4, #0xc1\n\ + lsl r4, r4, #0x2\n\ + add r0, r0, r4\n\ + mov r1, #0x6\n\ + strh r1, [r0]\n\ + b ._999\n\ +._981:\n\ + .align 2, 0\n\ +._980:\n\ + .word +0x2000000\n\ +._926:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._999 @cond_branch\n\ + ldr r0, ._984\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + b ._983\n\ +._985:\n\ + .align 2, 0\n\ +._984:\n\ + .word +0x2000000\n\ +._927:\n\ + mov r0, #0x3\n\ + bl sub_80EEFBC\n\ + bl sub_80F3668\n\ + ldr r0, ._987\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r0, r2\n\ + mov r1, #0x8\n\ + strh r1, [r0]\n\ + b ._999\n\ +._988:\n\ + .align 2, 0\n\ +._987:\n\ + .word +0x2000000\n\ +._928:\n\ + bl sub_80F7500\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._999 @cond_branch\n\ + mov r0, #0x2\n\ + bl sub_80EEFBC\n\ + bl sub_80F3698\n\ +._945:\n\ + ldr r0, ._991\n\ + mov r4, #0xc1\n\ + lsl r4, r4, #0x2\n\ + add r0, r0, r4\n\ +._983:\n\ + mov r1, #0x4\n\ + strh r1, [r0]\n\ + b ._999\n\ +._992:\n\ + .align 2, 0\n\ +._991:\n\ + .word +0x2000000\n\ +._929:\n\ + bl sub_80F5038\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0\n\ + bne ._999 @cond_branch\n\ + mov r0, #0x0\n\ + bl sub_80F0174\n\ + bl sub_80F2F48\n\ + ldr r5, ._995\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r5, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + str r4, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r5, r2\n\ + mov r0, #0xb\n\ + strh r0, [r1]\n\ + b ._999\n\ +._996:\n\ + .align 2, 0\n\ +._995:\n\ + .word +0x2000000\n\ +._931:\n\ + ldr r0, ._1000\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._999 @cond_branch\n\ + bl sub_80F3CE8\n\ + bl sub_80F5BDC\n\ + ldr r0, ._1000 + 4\n\ + ldr r4, ._1000 + 8\n\ + add r0, r0, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._998 @cond_branch\n\ + bl sub_80F357C\n\ + mov r0, #0x1\n\ + bl sub_80F2D6C\n\ + mov r0, #0x6\n\ + bl sub_80F2D6C\n\ + ldr r0, ._1000 + 12\n\ + bl sub_80EBDBC\n\ + b ._999\n\ +._1001:\n\ + .align 2, 0\n\ +._1000:\n\ + .word gPaletteFade\n\ + .word +0x2000000\n\ + .word 0x76aa\n\ + .word sub_80ECA10+1\n\ +._998:\n\ + bl sub_80F3614\n\ + ldr r0, ._1003\n\ + bl sub_80EBDBC\n\ +._999:\n\ + ldr r0, ._1003 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1002 @cond_branch\n\ + ldr r0, ._1003 + 8\n\ + ldr r1, ._1003 + 12\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x9\n\ + mov r2, #0x6\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1002:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._1004:\n\ + .align 2, 0\n\ +._1003:\n\ + .word sub_80ED3D0+1\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else +__attribute__((naked)) +void sub_80ED858() +{ asm_unified("push {r4,r5,lr}\n\ sub sp, 0x4\n\ ldr r1, _080ED878 @ =gSharedMem\n\ @@ -2114,7 +5474,361 @@ _080EDB7A:\n\ _080EDB84: .4byte sub_80ED3D0\n"); } #endif +#endif +#if DEBUG +__attribute__((naked)) +void sub_80EDB88() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._1007\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0x11\n\ + bls ._1005 @cond_branch\n\ + b ._1088\n\ +._1005:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._1007 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._1008:\n\ + .align 2, 0\n\ +._1007:\n\ + .word +0x2000000\n\ + .word ._1009\n\ +._1009:\n\ + .word ._1010\n\ + .word ._1011\n\ + .word ._1012\n\ + .word ._1013\n\ + .word ._1014\n\ + .word ._1015\n\ + .word ._1016\n\ + .word ._1017\n\ + .word ._1018\n\ + .word ._1019\n\ + .word ._1020\n\ + .word ._1021\n\ + .word ._1022\n\ + .word ._1023\n\ + .word ._1024\n\ + .word ._1025\n\ + .word ._1026\n\ + .word ._1027\n\ +._1010:\n\ + bl sub_80F1E84\n\ + mov r0, #0x0\n\ + bl sub_80F2D04\n\ + ldr r1, ._1029\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1078\n\ +._1030:\n\ + .align 2, 0\n\ +._1029:\n\ + .word +0x2000000\n\ +._1011:\n\ + bl sub_80F1F10\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1031 @cond_branch\n\ + b ._1088\n\ +._1031:\n\ + mov r0, #0x4\n\ + bl sub_80EEFBC\n\ + ldr r1, ._1034\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._1078\n\ +._1035:\n\ + .align 2, 0\n\ +._1034:\n\ + .word +0x2000000\n\ +._1012:\n\ + bl sub_80EEF34\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + beq ._1036 @cond_branch\n\ + b ._1088\n\ +._1036:\n\ + ldr r4, ._1039\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + str r2, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + b ._1038\n\ +._1040:\n\ + .align 2, 0\n\ +._1039:\n\ + .word +0x2000000\n\ +._1013:\n\ + ldr r0, ._1044\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1041 @cond_branch\n\ + b ._1088\n\ +._1041:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl sub_80EED0C\n\ + bl sub_80EF814\n\ + ldr r1, ._1044 + 4\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1078\n\ +._1045:\n\ + .align 2, 0\n\ +._1044:\n\ + .word gPaletteFade\n\ + .word +0x2000000\n\ +._1014:\n\ + bl sub_80F2620\n\ + ldr r1, ._1047\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._1078\n\ +._1048:\n\ + .align 2, 0\n\ +._1047:\n\ + .word +0x2000000\n\ +._1015:\n\ + bl sub_80F638C\n\ + ldr r1, ._1051\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._1016:\n\ + bl sub_80F63D0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1049 @cond_branch\n\ + ldr r1, ._1051\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x2\n\ + strh r0, [r1]\n\ + b ._1088\n\ +._1052:\n\ + .align 2, 0\n\ +._1051:\n\ + .word +0x2000000\n\ +._1049:\n\ + ldr r1, ._1054\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1078\n\ +._1055:\n\ + .align 2, 0\n\ +._1054:\n\ + .word +0x2000000\n\ +._1017:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + beq ._1056 @cond_branch\n\ + b ._1088\n\ +._1056:\n\ + ldr r1, ._1059\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._1088\n\ +._1060:\n\ + .align 2, 0\n\ +._1059:\n\ + .word +0x2000000\n\ +._1018:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + beq ._1061 @cond_branch\n\ + b ._1088\n\ +._1061:\n\ + ldr r1, ._1064\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1078\n\ +._1065:\n\ + .align 2, 0\n\ +._1064:\n\ + .word +0x2000000\n\ +._1019:\n\ + mov r0, #0x1\n\ + bl sub_80F0264\n\ + ldr r1, ._1068\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._1020:\n\ + bl sub_80F02A0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1088 @cond_branch\n\ + ldr r1, ._1068\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1078\n\ +._1069:\n\ + .align 2, 0\n\ +._1068:\n\ + .word +0x2000000\n\ +._1021:\n\ + mov r0, #0x2\n\ + bl sub_80F2C80\n\ + ldr r1, ._1072\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._1022:\n\ + mov r0, #0x2\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1088 @cond_branch\n\ + ldr r1, ._1072\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1078\n\ +._1073:\n\ + .align 2, 0\n\ +._1072:\n\ + .word +0x2000000\n\ +._1023:\n\ + mov r0, #0x1\n\ + bl sub_80F3008\n\ + ldr r1, ._1075\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._1078\n\ +._1076:\n\ + .align 2, 0\n\ +._1075:\n\ + .word +0x2000000\n\ +._1024:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._1088 @cond_branch\n\ + ldr r1, ._1079\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1078\n\ +._1080:\n\ + .align 2, 0\n\ +._1079:\n\ + .word +0x2000000\n\ +._1025:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._1082\n\ + bl SetVBlankCallback\n\ +._1038:\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ +._1078:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._1088\n\ +._1083:\n\ + .align 2, 0\n\ +._1082:\n\ + .word sub_80EBD18+1\n\ +._1026:\n\ + mov r0, #0x4\n\ + bl sub_80EED2C\n\ + ldr r1, ._1086\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + ldr r0, ._1086 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1088 @cond_branch\n\ + ldr r0, ._1086 + 8\n\ + ldr r2, ._1086 + 12\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ + b ._1088\n\ +._1087:\n\ + .align 2, 0\n\ +._1086:\n\ + .word +0x2000000\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800\n\ +._1027:\n\ + ldr r0, ._1089\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1088 @cond_branch\n\ + ldr r0, ._1089 + 4\n\ + bl sub_80EBDBC\n\ +._1088:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._1090:\n\ + .align 2, 0\n\ +._1089:\n\ + .word gPaletteFade\n\ + .word sub_80EDDBC+1"); +} +#else void sub_80EDB88() { switch (ewram0_10.var304) @@ -2205,7 +5919,129 @@ void sub_80EDB88() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80EDDBC() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._1095\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r4, r0, r1\n\ + ldrh r0, [r4]\n\ + cmp r0, #0x1\n\ + beq ._1091 @cond_branch\n\ + cmp r0, #0x1\n\ + bgt ._1092 @cond_branch\n\ + cmp r0, #0\n\ + beq ._1093 @cond_branch\n\ + b ._1113\n\ +._1096:\n\ + .align 2, 0\n\ +._1095:\n\ + .word +0x2000000\n\ +._1092:\n\ + cmp r0, #0x2\n\ + beq ._1097 @cond_branch\n\ + b ._1113\n\ +._1093:\n\ + bl sub_80F5DD4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + beq ._1099 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._1100 @cond_branch\n\ + ldr r0, ._1103\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1101 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._1103 + 4\n\ + bl sub_80EBDBC\n\ + b ._1114\n\ +._1104:\n\ + .align 2, 0\n\ +._1103:\n\ + .word gMain\n\ + .word sub_80EDEE4+1\n\ +._1099:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl ShowMapNamePopUpWindow\n\ + b ._1114\n\ +._1100:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._1114\n\ +._1101:\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1113 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._1109\n\ + bl sub_80EBDBC\n\ + b ._1114\n\ +._1110:\n\ + .align 2, 0\n\ +._1109:\n\ + .word sub_80EDE70+1\n\ +._1091:\n\ + bl sub_80F0718\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1113 @cond_branch\n\ + bl ShowMapNamePopUpWindow\n\ + bl sub_80F3264\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + b ._1112\n\ +._1097:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._1113 @cond_branch\n\ +._1112:\n\ + strh r0, [r4]\n\ +._1113:\n\ + ldr r0, ._1115\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1114 @cond_branch\n\ + ldr r0, ._1115 + 4\n\ + ldr r1, ._1115 + 8\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x8\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1114:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._1116:\n\ + .align 2, 0\n\ +._1115:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void sub_80EDDBC() { switch (ewram0_10.var304) @@ -2250,6 +6086,7 @@ void sub_80EDDBC() } } +#endif void sub_80EDE70() { @@ -2274,6 +6111,228 @@ void sub_80EDE70() } +#if DEBUG +__attribute__((naked)) +void sub_80EDEE4() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._1134\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0xa\n\ + bls ._1132 @cond_branch\n\ + b ._1180\n\ +._1132:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._1134 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._1135:\n\ + .align 2, 0\n\ +._1134:\n\ + .word +0x2000000\n\ + .word ._1136\n\ +._1136:\n\ + .word ._1137\n\ + .word ._1138\n\ + .word ._1139\n\ + .word ._1140\n\ + .word ._1141\n\ + .word ._1142\n\ + .word ._1143\n\ + .word ._1144\n\ + .word ._1145\n\ + .word ._1146\n\ + .word ._1147\n\ +._1137:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + b ._1169\n\ +._1138:\n\ + ldr r0, ._1152\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1149 @cond_branch\n\ + b ._1180\n\ +._1149:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl sub_80EED0C\n\ + bl sub_80F3130\n\ + ldr r1, ._1152 + 4\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1166\n\ +._1153:\n\ + .align 2, 0\n\ +._1152:\n\ + .word gPaletteFade\n\ + .word +0x2000000\n\ +._1139:\n\ + bl sub_80F66E0\n\ + bl sub_80EEE08\n\ + ldr r1, ._1155\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._1166\n\ +._1156:\n\ + .align 2, 0\n\ +._1155:\n\ + .word +0x2000000\n\ +._1140:\n\ + bl sub_80F1080\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1180 @cond_branch\n\ + ldr r1, ._1159\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1166\n\ +._1160:\n\ + .align 2, 0\n\ +._1159:\n\ + .word +0x2000000\n\ +._1141:\n\ + mov r0, #0x5\n\ + bl sub_80EEFBC\n\ + bl sub_80F38B8\n\ + ldr r1, ._1163\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._1142:\n\ + bl sub_80F38EC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1180 @cond_branch\n\ + ldr r1, ._1163\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1166\n\ +._1164:\n\ + .align 2, 0\n\ +._1163:\n\ + .word +0x2000000\n\ +._1143:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._1180 @cond_branch\n\ + ldr r1, ._1167\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._1166\n\ +._1168:\n\ + .align 2, 0\n\ +._1167:\n\ + .word +0x2000000\n\ +._1144:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._1170\n\ + bl SetVBlankCallback\n\ + b ._1169\n\ +._1171:\n\ + .align 2, 0\n\ +._1170:\n\ + .word sub_80EBD18+1\n\ +._1145:\n\ + mov r0, #0x3\n\ + bl sub_80EED2C\n\ + ldr r1, ._1174\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + ldr r0, ._1174 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1180 @cond_branch\n\ + ldr r0, ._1174 + 8\n\ + ldr r2, ._1174 + 12\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ + b ._1180\n\ +._1175:\n\ + .align 2, 0\n\ +._1174:\n\ + .word +0x2000000\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f000\n\ +._1146:\n\ + ldr r0, ._1178\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1180 @cond_branch\n\ +._1169:\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ +._1166:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._1180\n\ +._1179:\n\ + .align 2, 0\n\ +._1178:\n\ + .word gPaletteFade\n\ +._1147:\n\ + bl sub_80F170C\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1180 @cond_branch\n\ + ldr r0, ._1181\n\ + bl sub_80EBDBC\n\ +._1180:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._1182:\n\ + .align 2, 0\n\ +._1181:\n\ + .word sub_80EE06C+1"); +} +#else void sub_80EDEE4() { switch (ewram0_10.var304) @@ -2331,7 +6390,316 @@ void sub_80EDEE4() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80EE06C() +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._1185\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0x8\n\ + bls ._1183 @cond_branch\n\ + b ._1248\n\ +._1183:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._1185 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._1186:\n\ + .align 2, 0\n\ +._1185:\n\ + .word +0x2000000\n\ + .word ._1187\n\ +._1187:\n\ + .word ._1188\n\ + .word ._1189\n\ + .word ._1190\n\ + .word ._1191\n\ + .word ._1192\n\ + .word ._1193\n\ + .word ._1194\n\ + .word ._1195\n\ + .word ._1196\n\ +._1188:\n\ + bl sub_80F15A8\n\ + ldr r1, ._1198\n\ + mov r5, #0xc1\n\ + lsl r5, r5, #0x2\n\ + add r1, r1, r5\n\ + b ._1221\n\ +._1199:\n\ + .align 2, 0\n\ +._1198:\n\ + .word +0x2000000\n\ +._1189:\n\ + ldr r2, ._1203\n\ + ldrh r1, [r2, #0x30]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + add r3, r2, #0\n\ + cmp r0, #0\n\ + beq ._1201 @cond_branch\n\ + ldr r1, ._1203 + 4\n\ + add r0, r4, r1\n\ + mov r2, #0x0\n\ + ldsh r0, [r0, r2]\n\ + cmp r0, #0\n\ + beq ._1201 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + bl sub_80F6A4C\n\ + mov r5, #0xc1\n\ + lsl r5, r5, #0x2\n\ + add r1, r4, r5\n\ + b ._1221\n\ +._1204:\n\ + .align 2, 0\n\ +._1203:\n\ + .word gMain\n\ + .word 0x87dc\n\ +._1201:\n\ + ldrh r1, [r3, #0x30]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1206 @cond_branch\n\ + ldr r1, ._1208\n\ + add r0, r4, r1\n\ + ldr r2, ._1208 + 4\n\ + add r1, r4, r2\n\ + mov r5, #0x0\n\ + ldsh r2, [r0, r5]\n\ + mov r5, #0x0\n\ + ldsh r0, [r1, r5]\n\ + cmp r2, r0\n\ + bge ._1206 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0x1\n\ + bl sub_80F6A4C\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ + b ._1221\n\ +._1209:\n\ + .align 2, 0\n\ +._1208:\n\ + .word 0x87dc\n\ + .word 0x8774\n\ +._1206:\n\ + ldrh r2, [r3, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + beq ._1210 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + mov r0, #0xb\n\ + bl sub_80EEFBC\n\ + ldr r0, ._1212\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + b ._1211\n\ +._1213:\n\ + .align 2, 0\n\ +._1212:\n\ + .word +0x2000000\n\ +._1210:\n\ + mov r0, #0x2\n\ + and r0, r0, r2\n\ + cmp r0, #0\n\ + bne ._1214 @cond_branch\n\ + b ._1248\n\ +._1214:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._1217\n\ + bl sub_80EBDBC\n\ + b ._1248\n\ +._1218:\n\ + .align 2, 0\n\ +._1217:\n\ + .word sub_80EE294+1\n\ +._1190:\n\ + bl sub_80F6AF0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1219 @cond_branch\n\ + b ._1248\n\ +._1219:\n\ + ldr r1, ._1222\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._1221\n\ +._1223:\n\ + .align 2, 0\n\ +._1222:\n\ + .word +0x2000000\n\ +._1191:\n\ + bl sub_8055870\n\ + add r1, r0, #0\n\ + cmp r1, #0\n\ + bne ._1248 @cond_branch\n\ + ldr r0, ._1226\n\ + mov r5, #0xc1\n\ + lsl r5, r5, #0x2\n\ + add r0, r0, r5\n\ + strh r1, [r0]\n\ + b ._1248\n\ +._1227:\n\ + .align 2, 0\n\ +._1226:\n\ + .word +0x2000000\n\ +._1192:\n\ + bl sub_80F3B00\n\ + ldr r1, ._1229\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ +._1221:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._1248\n\ +._1230:\n\ + .align 2, 0\n\ +._1229:\n\ + .word +0x2000000\n\ +._1193:\n\ + bl sub_80F3B58\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1248 @cond_branch\n\ + bl sub_80F1494\n\ + ldr r1, ._1233\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + bl sub_80EED9C\n\ + b ._1248\n\ +._1234:\n\ + .align 2, 0\n\ +._1233:\n\ + .word +0x2000000\n\ +._1194:\n\ + bl sub_80F68E8\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1236 @cond_branch\n\ + cmp r0, #0x1\n\ + bne ._1236 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_80F3B94\n\ + ldr r0, ._1238\n\ + mov r5, #0xc1\n\ + lsl r5, r5, #0x2\n\ + add r0, r0, r5\n\ + mov r1, #0x7\n\ + strh r1, [r0]\n\ + b ._1249\n\ +._1239:\n\ + .align 2, 0\n\ +._1238:\n\ + .word +0x2000000\n\ +._1236:\n\ + ldr r0, ._1242\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1248 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl sub_80F3B94\n\ + ldr r0, ._1242 + 4\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + mov r1, #0x8\n\ + strh r1, [r0]\n\ + b ._1248\n\ +._1243:\n\ + .align 2, 0\n\ +._1242:\n\ + .word gMain\n\ + .word +0x2000000\n\ +._1195:\n\ + bl sub_80F3BD4\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1248 @cond_branch\n\ + ldr r0, ._1246\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r0, r2\n\ +._1211:\n\ + mov r1, #0x4\n\ + strh r1, [r0]\n\ + b ._1248\n\ +._1247:\n\ + .align 2, 0\n\ +._1246:\n\ + .word +0x2000000\n\ +._1196:\n\ + bl sub_80F3BD4\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0\n\ + bne ._1248 @cond_branch\n\ + mov r0, #0x5\n\ + bl sub_80EEFBC\n\ + ldr r0, ._1250\n\ + mov r5, #0xc1\n\ + lsl r5, r5, #0x2\n\ + add r0, r0, r5\n\ + strh r4, [r0]\n\ +._1248:\n\ + ldr r0, ._1250 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1249 @cond_branch\n\ + ldr r0, ._1250 + 8\n\ + ldr r1, ._1250 + 12\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x4\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1249:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._1251:\n\ + .align 2, 0\n\ +._1250:\n\ + .word +0x2000000\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void sub_80EE06C() { switch (ewram0_10.var304) @@ -2417,7 +6785,204 @@ void sub_80EE06C() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80EE294() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._1254\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + ldrh r0, [r0]\n\ + add r4, r1, #0\n\ + cmp r0, #0x8\n\ + bls ._1252 @cond_branch\n\ + b ._1288\n\ +._1252:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._1254 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._1255:\n\ + .align 2, 0\n\ +._1254:\n\ + .word +0x2000000\n\ + .word ._1256\n\ +._1256:\n\ + .word ._1257\n\ + .word ._1258\n\ + .word ._1259\n\ + .word ._1260\n\ + .word ._1261\n\ + .word ._1262\n\ + .word ._1263\n\ + .word ._1264\n\ + .word ._1265\n\ +._1257:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r3, #0x10\n\ + b ._1266\n\ +._1258:\n\ + ldr r0, ._1270\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1267 @cond_branch\n\ + b ._1288\n\ +._1267:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl sub_80EED0C\n\ + bl sub_80F3C2C\n\ + bl sub_80EEE08\n\ + ldr r1, ._1270 + 4\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1280\n\ +._1271:\n\ + .align 2, 0\n\ +._1270:\n\ + .word gPaletteFade\n\ + .word +0x2000000\n\ +._1259:\n\ + bl sub_80F6134\n\ + mov r0, #0x1\n\ + bl sub_80F0264\n\ + ldr r1, ._1274\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._1260:\n\ + bl sub_80F02A0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1288 @cond_branch\n\ + ldr r1, ._1274\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1280\n\ +._1275:\n\ + .align 2, 0\n\ +._1274:\n\ + .word +0x2000000\n\ +._1261:\n\ + mov r0, #0x4\n\ + bl sub_80EEFBC\n\ + mov r0, #0x1\n\ + bl sub_80F3008\n\ + ldr r0, ._1277\n\ + bl SetVBlankCallback\n\ + ldr r1, ._1277 + 4\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r1, r2\n\ + b ._1280\n\ +._1278:\n\ + .align 2, 0\n\ +._1277:\n\ + .word sub_80EBD18+1\n\ + .word +0x2000000\n\ +._1262:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._1288 @cond_branch\n\ + ldr r1, ._1281\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1280\n\ +._1282:\n\ + .align 2, 0\n\ +._1281:\n\ + .word +0x2000000\n\ +._1263:\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ +._1266:\n\ + bl BeginNormalPaletteFade\n\ + mov r2, #0xc1\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ +._1280:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._1288\n\ +._1264:\n\ + mov r0, #0x4\n\ + bl sub_80EED2C\n\ + ldr r1, ._1286\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + ldr r0, ._1286 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1288 @cond_branch\n\ + ldr r0, ._1286 + 8\n\ + ldr r2, ._1286 + 12\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ + b ._1288\n\ +._1287:\n\ + .align 2, 0\n\ +._1286:\n\ + .word +0x2000000\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800\n\ +._1265:\n\ + ldr r0, ._1289\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1288 @cond_branch\n\ + ldr r0, ._1289 + 4\n\ + bl sub_80EBDBC\n\ +._1288:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._1290:\n\ + .align 2, 0\n\ +._1289:\n\ + .word gPaletteFade\n\ + .word sub_80EDDBC+1"); +} +#else void sub_80EE294() { switch (ewram0_10.var304) @@ -2468,7 +7033,293 @@ void sub_80EE294() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80EE3D8() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._1293\n\ + mov r1, #0xc1\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + cmp r0, #0xd\n\ + bls ._1291 @cond_branch\n\ + b ._1354\n\ +._1291:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._1293 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._1294:\n\ + .align 2, 0\n\ +._1293:\n\ + .word +0x2000000\n\ + .word ._1295\n\ +._1295:\n\ + .word ._1296\n\ + .word ._1297\n\ + .word ._1298\n\ + .word ._1299\n\ + .word ._1300\n\ + .word ._1301\n\ + .word ._1302\n\ + .word ._1303\n\ + .word ._1304\n\ + .word ._1305\n\ + .word ._1306\n\ + .word ._1307\n\ + .word ._1308\n\ + .word ._1309\n\ +._1296:\n\ + bl sub_80F1E84\n\ + mov r0, #0x0\n\ + bl sub_80F2D04\n\ + ldr r1, ._1311\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1344\n\ +._1312:\n\ + .align 2, 0\n\ +._1311:\n\ + .word +0x2000000\n\ +._1297:\n\ + bl sub_80F1F10\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1313 @cond_branch\n\ + b ._1354\n\ +._1313:\n\ + mov r0, #0x9\n\ + bl sub_80EEFBC\n\ + ldr r1, ._1316\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1344\n\ +._1317:\n\ + .align 2, 0\n\ +._1316:\n\ + .word +0x2000000\n\ +._1298:\n\ + bl sub_80EEF34\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + beq ._1318 @cond_branch\n\ + b ._1354\n\ +._1318:\n\ + ldr r4, ._1321\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + str r2, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + b ._1320\n\ +._1322:\n\ + .align 2, 0\n\ +._1321:\n\ + .word +0x2000000\n\ +._1299:\n\ + ldr r0, ._1326\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1323 @cond_branch\n\ + b ._1354\n\ +._1323:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl sub_80EED0C\n\ + bl sub_80EF814\n\ + bl sub_80EEE08\n\ + ldr r1, ._1326 + 4\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1344\n\ +._1327:\n\ + .align 2, 0\n\ +._1326:\n\ + .word gPaletteFade\n\ + .word +0x2000000\n\ +._1300:\n\ + bl sub_80F2620\n\ + ldr r1, ._1329\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1344\n\ +._1330:\n\ + .align 2, 0\n\ +._1329:\n\ + .word +0x2000000\n\ +._1301:\n\ + mov r0, #0x2\n\ + bl sub_80F0264\n\ + ldr r1, ._1334\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._1302:\n\ + bl sub_80F02A0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._1331 @cond_branch\n\ + b ._1354\n\ +._1331:\n\ + ldr r1, ._1334\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1344\n\ +._1335:\n\ + .align 2, 0\n\ +._1334:\n\ + .word +0x2000000\n\ +._1303:\n\ + mov r0, #0x3\n\ + bl sub_80F2C80\n\ + ldr r1, ._1338\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ +._1304:\n\ + mov r0, #0x3\n\ + bl sub_80F2CBC\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1354 @cond_branch\n\ + ldr r1, ._1338\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1344\n\ +._1339:\n\ + .align 2, 0\n\ +._1338:\n\ + .word +0x2000000\n\ +._1305:\n\ + mov r0, #0x2\n\ + bl sub_80F3008\n\ + ldr r1, ._1341\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1344\n\ +._1342:\n\ + .align 2, 0\n\ +._1341:\n\ + .word +0x2000000\n\ +._1306:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._1354 @cond_branch\n\ + ldr r1, ._1345\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + b ._1344\n\ +._1346:\n\ + .align 2, 0\n\ +._1345:\n\ + .word +0x2000000\n\ +._1307:\n\ + bl sub_80F6F10\n\ + ldr r4, ._1348\n\ + mov r1, #0xc2\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + mov r2, #0x0\n\ + str r2, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r0, ._1348 + 4\n\ + bl SetVBlankCallback\n\ +._1320:\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r4, r0\n\ +._1344:\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + b ._1354\n\ +._1349:\n\ + .align 2, 0\n\ +._1348:\n\ + .word +0x2000000\n\ + .word sub_80EBD68+1\n\ +._1308:\n\ + mov r0, #0x5\n\ + bl sub_80EED2C\n\ + ldr r1, ._1352\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + ldrh r0, [r1]\n\ + add r0, r0, #0x1\n\ + strh r0, [r1]\n\ + ldr r0, ._1352 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1354 @cond_branch\n\ + ldr r0, ._1352 + 8\n\ + ldr r2, ._1352 + 12\n\ + mov r1, #0x0\n\ + mov r3, #0x4\n\ + bl debug_sub_8008218\n\ + b ._1354\n\ +._1353:\n\ + .align 2, 0\n\ +._1352:\n\ + .word +0x2000000\n\ + .word gLinkOpen\n\ + .word 0x6007de0\n\ + .word 0x600f800\n\ +._1309:\n\ + ldr r0, ._1355\n\ + ldrb r1, [r0, #0x7]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._1354 @cond_branch\n\ + ldr r0, ._1355 + 4\n\ + bl sub_80EBDBC\n\ +._1354:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._1356:\n\ + .align 2, 0\n\ +._1355:\n\ + .word gPaletteFade\n\ + .word sub_80EE58C+1"); +} +#else void sub_80EE3D8() { switch (ewram0_10.var304) @@ -2544,7 +7395,143 @@ void sub_80EE3D8() break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_80EE58C() +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r5, ._1361\n\ + mov r0, #0xc1\n\ + lsl r0, r0, #0x2\n\ + add r4, r5, r0\n\ + ldrh r0, [r4]\n\ + cmp r0, #0x1\n\ + beq ._1357 @cond_branch\n\ + cmp r0, #0x1\n\ + bgt ._1358 @cond_branch\n\ + cmp r0, #0\n\ + beq ._1359 @cond_branch\n\ + b ._1383\n\ +._1362:\n\ + .align 2, 0\n\ +._1361:\n\ + .word +0x2000000\n\ +._1358:\n\ + cmp r0, #0x2\n\ + beq ._1363 @cond_branch\n\ + b ._1383\n\ +._1359:\n\ + bl sub_80F5DD4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + beq ._1365 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._1366 @cond_branch\n\ + ldr r0, ._1369\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1367 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._1369 + 4\n\ + bl sub_80EBDBC\n\ + b ._1384\n\ +._1370:\n\ + .align 2, 0\n\ +._1369:\n\ + .word gMain\n\ + .word sub_80EE658+1\n\ +._1365:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r1, ._1372\n\ + add r0, r5, r1\n\ + ldrb r0, [r0]\n\ + bl sub_80F0FFC\n\ + b ._1384\n\ +._1373:\n\ + .align 2, 0\n\ +._1372:\n\ + .word 0x876e\n\ +._1366:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._1384\n\ +._1367:\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1383 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldr r0, ._1377\n\ + bl sub_80EBDBC\n\ + b ._1384\n\ +._1378:\n\ + .align 2, 0\n\ +._1377:\n\ + .word sub_80EE8F4+1\n\ +._1357:\n\ + bl sub_80F0718\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._1383 @cond_branch\n\ + ldr r1, ._1381\n\ + add r0, r5, r1\n\ + ldrb r0, [r0]\n\ + bl sub_80F0FFC\n\ + bl sub_80F3264\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + b ._1380\n\ +._1382:\n\ + .align 2, 0\n\ +._1381:\n\ + .word 0x876e\n\ +._1363:\n\ + bl sub_8055870\n\ + cmp r0, #0\n\ + bne ._1383 @cond_branch\n\ +._1380:\n\ + strh r0, [r4]\n\ +._1383:\n\ + ldr r0, ._1385\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1384 @cond_branch\n\ + ldr r0, ._1385 + 4\n\ + ldr r1, ._1385 + 8\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x3\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1384:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._1386:\n\ + .align 2, 0\n\ +._1385:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void sub_80EE58C() { switch (ewram0_10.var304) @@ -2588,6 +7575,7 @@ void sub_80EE58C() break; } } +#endif void sub_80EE658() { @@ -3018,6 +8006,108 @@ _080EEC0A:\n\ #endif // var6dad and var6dae must be s8 in this func +#if DEBUG +__attribute__((naked)) +bool8 sub_80EEC10() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._1563\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1559 @cond_branch\n\ + ldr r1, ._1563 + 4\n\ + add r3, r1, #1\n\ + add r2, r1, #5\n\ +._1561:\n\ + ldrb r0, [r1]\n\ + sub r0, r0, #0x1\n\ + strb r0, [r1]\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bge ._1560 @cond_branch\n\ + ldrb r0, [r3]\n\ + sub r0, r0, #0x1\n\ + strb r0, [r1]\n\ +._1560:\n\ + mov r0, #0x0\n\ + ldsb r0, [r1, r0]\n\ + add r0, r0, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._1561 @cond_branch\n\ + mov r0, #0x1\n\ + b ._1568\n\ +._1564:\n\ + .align 2, 0\n\ +._1563:\n\ + .word gMain\n\ + .word +0x2006dad\n\ +._1559:\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1565 @cond_branch\n\ + ldr r1, ._1569\n\ + mov r4, #0x0\n\ + mov r2, #0x1\n\ + ldsb r2, [r1, r2]\n\ + add r3, r1, #5\n\ +._1567:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + lsl r0, r0, #0x18\n\ + asr r0, r0, #0x18\n\ + cmp r0, r2\n\ + blt ._1566 @cond_branch\n\ + strb r4, [r1]\n\ +._1566:\n\ + mov r0, #0x0\n\ + ldsb r0, [r1, r0]\n\ + add r0, r0, r3\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._1567 @cond_branch\n\ + mov r0, #0x1\n\ + b ._1568\n\ +._1570:\n\ + .align 2, 0\n\ +._1569:\n\ + .word +0x2006dad\n\ +._1565:\n\ + ldr r0, ._1572\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1571 @cond_branch\n\ + ldr r0, ._1572 + 4\n\ + ldr r1, ._1572 + 8\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x6\n\ + mov r2, #0xa\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1571:\n\ + mov r0, #0x0\n\ +._1568:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._1573:\n\ + .align 2, 0\n\ +._1572:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else bool8 sub_80EEC10() { if (gMain.newKeys & 0x40) @@ -3040,7 +8130,104 @@ bool8 sub_80EEC10() } return FALSE; } +#endif +#if DEBUG +__attribute__((naked)) +bool8 sub_80EEC90() +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._1577\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + lsl r0, r0, #0x10\n\ + lsr r3, r0, #0x10\n\ + cmp r3, #0\n\ + beq ._1574 @cond_branch\n\ + ldr r2, ._1577 + 4\n\ + ldr r0, ._1577 + 8\n\ + add r1, r2, r0\n\ + ldrb r0, [r1]\n\ + sub r0, r0, #0x1\n\ + strb r0, [r1]\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bge ._1580 @cond_branch\n\ + ldr r3, ._1577 + 12\n\ + add r0, r2, r3\n\ + ldrb r0, [r0]\n\ + sub r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._1580\n\ +._1578:\n\ + .align 2, 0\n\ +._1577:\n\ + .word gMain\n\ + .word +0x2000000\n\ + .word 0x6dad\n\ + .word 0x6dae\n\ +._1574:\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._1579 @cond_branch\n\ + ldr r0, ._1582\n\ + ldr r4, ._1582 + 4\n\ + add r2, r0, r4\n\ + ldrb r1, [r2]\n\ + add r1, r1, #0x1\n\ + strb r1, [r2]\n\ + add r4, r4, #0x1\n\ + add r0, r0, r4\n\ + lsl r1, r1, #0x18\n\ + asr r1, r1, #0x18\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x18\n\ + asr r0, r0, #0x18\n\ + cmp r1, r0\n\ + blt ._1580 @cond_branch\n\ + strb r3, [r2]\n\ +._1580:\n\ + mov r0, #0x1\n\ + b ._1581\n\ +._1583:\n\ + .align 2, 0\n\ +._1582:\n\ + .word +0x2000000\n\ + .word 0x6dad\n\ +._1579:\n\ + ldr r0, ._1585\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._1584 @cond_branch\n\ + ldr r0, ._1585 + 4\n\ + ldr r1, ._1585 + 8\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x4\n\ + str r1, [sp]\n\ + mov r1, #0x6\n\ + mov r2, #0xa\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._1584:\n\ + mov r0, #0x0\n\ +._1581:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._1586:\n\ + .align 2, 0\n\ +._1585:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else bool8 sub_80EEC90() { if (gMain.newKeys & 0x40) @@ -3057,6 +8244,7 @@ bool8 sub_80EEC90() } return FALSE; } +#endif void sub_80EED0C() { -- cgit v1.2.3 From 9c2f7c88f0d7e57c99d548870e78185e05cc472a Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 18 Jan 2018 13:54:10 -0600 Subject: add more debug code --- src/battle/battle_records.c | 60 ++++++++ src/field/mauville_man.c | 195 ------------------------- src/pokemon/mail.c | 199 +++++++++++++++++++++++++ src/scene/cute_sketch.c | 344 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 603 insertions(+), 195 deletions(-) (limited to 'src') diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c index 17e2352ff..4fce958fa 100644 --- a/src/battle/battle_records.c +++ b/src/battle/battle_records.c @@ -223,6 +223,66 @@ void UpdateLinkBattleRecords(int id) gLinkPlayers[gLinkPlayerMapObjects[id].linkPlayerId].language); } +#if DEBUG +__attribute__((naked)) +void debug_sub_81257E0(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + add sp, sp, #0xfffffffc\n\ + bl InitLinkBattleRecords\n\ + mov r5, #0x0\n\ + ldr r6, ._62\n\ + sub r0, r6, #2\n\ + mov r8, r0\n\ + ldr r7, ._62 + 4\n\ +._61:\n\ + ldr r0, ._62 + 8\n\ + lsl r3, r5, #0x2\n\ + add r3, r3, r0\n\ + ldrb r4, [r3]\n\ + sub r4, r4, #0x1\n\ + lsl r0, r4, #0x1\n\ + add r0, r0, r4\n\ + lsl r0, r0, #0x2\n\ + add r1, r0, r6\n\ + add r0, r0, r8\n\ + ldrh r2, [r0]\n\ + ldrb r3, [r3, #0x1]\n\ + ldr r0, ._62 + 12\n\ + lsl r4, r4, #0x2\n\ + add r4, r4, r0\n\ + ldrb r4, [r4, #0x1]\n\ + lsl r0, r4, #0x3\n\ + sub r0, r0, r4\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r7\n\ + ldrb r0, [r0, #0x1a]\n\ + str r0, [sp]\n\ + ldr r0, ._62 + 16\n\ + bl UpdateLinkBattleRecords_\n\ + add r5, r5, #0x1\n\ + cmp r5, #0x2\n\ + bls ._61 @cond_branch\n\ + add sp, sp, #0x4\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._63:\n\ + .align 2, 0\n\ +._62:\n\ + .word gUnknown_083F8410+0xa\n\ + .word gLinkPlayers\n\ + .word gUnknown_083F8410+0x5c\n\ + .word gLinkPlayerMapObjects\n\ + .word gSaveBlock1+0x30b8"); +} +#endif + static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records) { ConvertIntToDecimalStringN_DigitWidth6(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_RIGHT_ALIGN, 4); diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 144c0235a..e41ea1628 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -1392,198 +1392,3 @@ bool8 ScrSpecial_StorytellerInitializeRandomStat(void) { return StorytellerInitializeRandomStat(); } - -#if DEBUG -__attribute__((naked)) -void This_is_not_HandleReadMail() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " add r6, r1, #0\n" - " lsl r2, r2, #0x18\n" - " lsr r5, r2, #0x18\n" - " ldr r0, .__3\n" - " ldrb r3, [r0]\n" - " cmp r3, #0\n" - " beq .__1 @cond_branch\n" - " ldr r2, .__3 + 4\n" - " add r1, r2, #0\n" - " add r1, r1, #0xff\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " ldr r0, .__3 + 8\n" - " ldrh r1, [r0]\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x1\n" - " add r0, r2, r3\n" - " strb r1, [r0]\n" - " mov r0, #0x82\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, .__3 + 12\n" - " str r0, [r1]\n" - " add r3, r3, #0x8\n" - " add r1, r2, r3\n" - " ldr r0, .__3 + 16\n" - " str r0, [r1]\n" - " ldr r0, .__3 + 20\n" - " ldrh r1, [r0]\n" - " b .__2\n" - ".__4:\n" - " .align 2, 0\n" - ".__3:\n" - " .word gUnknown_03000748+0x4\n" - " .word +0x2000000\n" - " .word gSpecialVar_0x8004\n" - " .word EasyChat_GetWordText+1\n" - " .word ConvertEasyChatWordsToString+1\n" - " .word gSpecialVar_0x8006\n" - ".__1:\n" - " ldr r2, .__7\n" - " add r1, r2, #0\n" - " add r1, r1, #0xff\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " add r0, r0, #0xfb\n" - " add r1, r2, r0\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x82\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, .__7 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x84\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, .__7 + 8\n" - " str r0, [r1]\n" - " ldrh r1, [r4, #0x20]\n" - " add r0, r1, #0\n" - " sub r0, r0, #0x79\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0xb\n" - " bhi .__5 @cond_branch\n" - " sub r1, r1, #0x79\n" - ".__2:\n" - " add r0, r2, #0\n" - " add r0, r0, #0xfa\n" - " strb r1, [r0]\n" - " b .__6\n" - ".__8:\n" - " .align 2, 0\n" - ".__7:\n" - " .word +0x2000000\n" - " .word EasyChat_GetWordText+1\n" - " .word ConvertEasyChatWordsToString+1\n" - ".__5:\n" - " add r0, r2, #0\n" - " add r0, r0, #0xfa\n" - " strb r3, [r0]\n" - " mov r5, #0x0\n" - ".__6:\n" - " ldr r1, .__12\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r0, r1, r2\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq .__9 @cond_branch\n" - " cmp r0, #0x1\n" - " beq .__10 @cond_branch\n" - ".__9:\n" - " mov r3, #0x86\n" - " lsl r3, r3, #0x1\n" - " add r2, r1, r3\n" - " add r0, r1, #0\n" - " add r0, r0, #0xfa\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r1, .__12 + 4\n" - " b .__11\n" - ".__13:\n" - " .align 2, 0\n" - ".__12:\n" - " .word +0x2000000\n" - " .word gUnknown_083E5730\n" - ".__10:\n" - " mov r0, #0x86\n" - " lsl r0, r0, #0x1\n" - " add r2, r1, r0\n" - " add r0, r1, #0\n" - " add r0, r0, #0xfa\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r1, .__18\n" - ".__11:\n" - " add r0, r0, r1\n" - " str r0, [r2]\n" - " ldrh r0, [r4, #0x1e]\n" - " mov r1, sp\n" - " bl MailSpeciesToSpecies\n" - " lsl r0, r0, #0x10\n" - " ldr r1, .__18 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xcd\n" - " lsl r1, r1, #0x11\n" - " cmp r0, r1\n" - " bhi .__14 @cond_branch\n" - " ldr r0, .__18 + 8\n" - " add r1, r0, #0\n" - " add r1, r1, #0xfa\n" - " ldrb r2, [r1]\n" - " add r1, r0, #0\n" - " cmp r2, #0x6\n" - " beq .__15 @cond_branch\n" - " cmp r2, #0x9\n" - " beq .__16 @cond_branch\n" - " b .__17\n" - ".__19:\n" - " .align 2, 0\n" - ".__18:\n" - " .word gUnknown_083E57A4\n" - " .word 0xffff0000\n" - " .word +0x2000000\n" - ".__15:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x1\n" - " b .__21\n" - ".__16:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x2\n" - " b .__21\n" - ".__14:\n" - " ldr r1, .__22\n" - ".__17:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x0\n" - ".__21:\n" - " strb r0, [r2]\n" - " add r0, r1, #0\n" - " add r0, r0, #0xf4\n" - " str r4, [r0]\n" - " sub r0, r0, #0x8\n" - " str r6, [r0]\n" - " add r0, r0, #0xc\n" - " strb r5, [r0]\n" - " ldr r0, .__22 + 4\n" - " bl SetMainCallback2\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - ".__23:\n" - " .align 2, 0\n" - ".__22:\n" - " .word +0x2000000\n" - " .word sub_80F8D50+1\n" - "\n" - ); -} -#endif diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index 6e03958e6..1ad8d8376 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -327,6 +327,204 @@ static void sub_80F8F58(void); static void sub_80F8F78(void); static void sub_80F8FB4(void); +// some debug variable, I guess. +// TODO: where exactly is this located? +__attribute__((section(".bss"))) /*static*/ u8 gUnknown_0300074C = 0; + +#if DEBUG +__attribute__((naked)) +void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) +{ + asm( + " push {r4, r5, r6, lr}\n" + " add sp, sp, #0xfffffffc\n" + " add r4, r0, #0\n" + " add r6, r1, #0\n" + " lsl r2, r2, #0x18\n" + " lsr r5, r2, #0x18\n" + " ldr r0, .__3\n" + " ldrb r3, [r0]\n" + " cmp r3, #0\n" + " beq .__1 @cond_branch\n" + " ldr r2, .__3 + 4\n" + " add r1, r2, #0\n" + " add r1, r1, #0xff\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " ldr r0, .__3 + 8\n" + " ldrh r1, [r0]\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x1\n" + " add r0, r2, r3\n" + " strb r1, [r0]\n" + " mov r0, #0x82\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, .__3 + 12\n" + " str r0, [r1]\n" + " add r3, r3, #0x8\n" + " add r1, r2, r3\n" + " ldr r0, .__3 + 16\n" + " str r0, [r1]\n" + " ldr r0, .__3 + 20\n" + " ldrh r1, [r0]\n" + " b .__2\n" + ".__4:\n" + " .align 2, 0\n" + ".__3:\n" + " .word gUnknown_0300074C\n" + " .word +0x2000000\n" + " .word gSpecialVar_0x8004\n" + " .word EasyChat_GetWordText+1\n" + " .word ConvertEasyChatWordsToString+1\n" + " .word gSpecialVar_0x8006\n" + ".__1:\n" + " ldr r2, .__7\n" + " add r1, r2, #0\n" + " add r1, r1, #0xff\n" + " mov r0, #0x5\n" + " strb r0, [r1]\n" + " add r0, r0, #0xfb\n" + " add r1, r2, r0\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, #0x82\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, .__7 + 4\n" + " str r0, [r1]\n" + " mov r0, #0x84\n" + " lsl r0, r0, #0x1\n" + " add r1, r2, r0\n" + " ldr r0, .__7 + 8\n" + " str r0, [r1]\n" + " ldrh r1, [r4, #0x20]\n" + " add r0, r1, #0\n" + " sub r0, r0, #0x79\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, #0xb\n" + " bhi .__5 @cond_branch\n" + " sub r1, r1, #0x79\n" + ".__2:\n" + " add r0, r2, #0\n" + " add r0, r0, #0xfa\n" + " strb r1, [r0]\n" + " b .__6\n" + ".__8:\n" + " .align 2, 0\n" + ".__7:\n" + " .word +0x2000000\n" + " .word EasyChat_GetWordText+1\n" + " .word ConvertEasyChatWordsToString+1\n" + ".__5:\n" + " add r0, r2, #0\n" + " add r0, r0, #0xfa\n" + " strb r3, [r0]\n" + " mov r5, #0x0\n" + ".__6:\n" + " ldr r1, .__12\n" + " mov r2, #0x80\n" + " lsl r2, r2, #0x1\n" + " add r0, r1, r2\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq .__9 @cond_branch\n" + " cmp r0, #0x1\n" + " beq .__10 @cond_branch\n" + ".__9:\n" + " mov r3, #0x86\n" + " lsl r3, r3, #0x1\n" + " add r2, r1, r3\n" + " add r0, r1, #0\n" + " add r0, r0, #0xfa\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, .__12 + 4\n" + " b .__11\n" + ".__13:\n" + " .align 2, 0\n" + ".__12:\n" + " .word +0x2000000\n" + " .word gUnknown_083E5730\n" + ".__10:\n" + " mov r0, #0x86\n" + " lsl r0, r0, #0x1\n" + " add r2, r1, r0\n" + " add r0, r1, #0\n" + " add r0, r0, #0xfa\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x3\n" + " ldr r1, .__18\n" + ".__11:\n" + " add r0, r0, r1\n" + " str r0, [r2]\n" + " ldrh r0, [r4, #0x1e]\n" + " mov r1, sp\n" + " bl MailSpeciesToSpecies\n" + " lsl r0, r0, #0x10\n" + " ldr r1, .__18 + 4\n" + " add r0, r0, r1\n" + " mov r1, #0xcd\n" + " lsl r1, r1, #0x11\n" + " cmp r0, r1\n" + " bhi .__14 @cond_branch\n" + " ldr r0, .__18 + 8\n" + " add r1, r0, #0\n" + " add r1, r1, #0xfa\n" + " ldrb r2, [r1]\n" + " add r1, r0, #0\n" + " cmp r2, #0x6\n" + " beq .__15 @cond_branch\n" + " cmp r2, #0x9\n" + " beq .__16 @cond_branch\n" + " b .__17\n" + ".__19:\n" + " .align 2, 0\n" + ".__18:\n" + " .word gUnknown_083E57A4\n" + " .word 0xffff0000\n" + " .word +0x2000000\n" + ".__15:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x1\n" + " b .__21\n" + ".__16:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x2\n" + " b .__21\n" + ".__14:\n" + " ldr r1, .__22\n" + ".__17:\n" + " add r2, r1, #0\n" + " add r2, r2, #0xfb\n" + " mov r0, #0x0\n" + ".__21:\n" + " strb r0, [r2]\n" + " add r0, r1, #0\n" + " add r0, r0, #0xf4\n" + " str r4, [r0]\n" + " sub r0, r0, #0x8\n" + " str r6, [r0]\n" + " add r0, r0, #0xc\n" + " strb r5, [r0]\n" + " ldr r0, .__22 + 4\n" + " bl SetMainCallback2\n" + " add sp, sp, #0x4\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + ".__23:\n" + " .align 2, 0\n" + ".__22:\n" + " .word +0x2000000\n" + " .word sub_80F8D50+1\n" + "\n" + ); +} +#else void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) { u16 mailDesign; @@ -390,6 +588,7 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) SetMainCallback2(sub_80F8D50); } +#endif #define RETURN_UP_STATE break #define RETURN_SKIP_STATE return FALSE diff --git a/src/scene/cute_sketch.c b/src/scene/cute_sketch.c index 5317bc334..c4d9463f5 100644 --- a/src/scene/cute_sketch.c +++ b/src/scene/cute_sketch.c @@ -29,6 +29,350 @@ void sub_80FD1C8(u16); u16 sub_80FD39C(u16*); u16 sub_80FD68C(u16*, u16*, u16*); +#if DEBUG + +__attribute__((naked)) +void debug_sub_8110CCC(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, #0x0\n\ + mov r1, #0x0\n\ + ldr r2, ._5\n\ + ldr r6, ._5 + 4\n\ +._7:\n\ + lsl r0, r1, #0x3\n\ + add r4, r0, r2\n\ + ldrh r0, [r6, #0x1c]\n\ + ldrh r3, [r4, #0x4]\n\ + cmp r0, r3\n\ + bne ._1 @cond_branch\n\ + ldrh r0, [r4, #0x6]\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._4 @cond_branch\n\ + ldrb r0, [r6, #0x1f]\n\ + ldr r1, [r4]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + bl StringLength\n\ + mov r1, #0xc\n\ + sub r1, r1, r0\n\ + lsl r1, r1, #0x10\n\ + lsr r5, r1, #0x10\n\ + cmp r1, #0\n\ + bge ._3 @cond_branch\n\ + mov r5, #0x0\n\ +._3:\n\ + mov r7, #0x1\n\ + mov r0, #0x10\n\ + mov r1, #0xe\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + add r0, r6, #0\n\ + add r0, r0, #0x8\n\ + mov r1, #0x11\n\ + mov r2, #0xf\n\ + bl Menu_PrintText\n\ + ldrb r0, [r6, #0x1f]\n\ + ldr r1, [r4]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + add r1, r5, #0\n\ + add r1, r1, #0x11\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + mov r2, #0x11\n\ + bl Menu_PrintText\n\ + b ._4\n\ +._6:\n\ + .align 2, 0\n\ +._5:\n\ + .word gUnknown_083E79C0\n\ + .word +0x2000000\n\ +._1:\n\ + add r0, r1, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r1, r0, #0x10\n\ + cmp r1, #0\n\ + beq ._7 @cond_branch\n\ +._4:\n\ + cmp r7, #0\n\ + bne ._8 @cond_branch\n\ + mov r0, #0x10\n\ + mov r1, #0x10\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r0, ._9\n\ + mov r1, #0x11\n\ + mov r2, #0x11\n\ + bl Menu_PrintText\n\ + mov r0, #0x10\n\ + mov r1, #0xe\n\ + mov r2, #0x1d\n\ + mov r3, #0xf\n\ + bl Menu_EraseWindowRect\n\ +._8:\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._10:\n\ + .align 2, 0\n\ +._9:\n\ + .word +0x2000008"); +} + +__attribute__((naked)) +void debug_sub_8110D84(void) +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._13\n\ + ldrh r0, [r0, #0x4]\n\ + cmp r0, #0x7\n\ + bls ._11 @cond_branch\n\ + b ._65\n\ +._11:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._13 + 4\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._14:\n\ + .align 2, 0\n\ +._13:\n\ + .word +0x2000000\n\ + .word ._15\n\ +._15:\n\ + .word ._16\n\ + .word ._17\n\ + .word ._18\n\ + .word ._19\n\ + .word ._20\n\ + .word ._21\n\ + .word ._22\n\ + .word ._23\n\ +._16:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, ._25\n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._26:\n\ + .align 2, 0\n\ +._25:\n\ + .word +0x2000000\n\ +._17:\n\ + bl UpdatePaletteFade\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._27 @cond_branch\n\ + b ._65\n\ +._27:\n\ + ldr r1, ._30\n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._31:\n\ + .align 2, 0\n\ +._30:\n\ + .word +0x2000000\n\ +._18:\n\ + bl sub_80FAB60\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x3\n\ + beq ._32 @cond_branch\n\ + cmp r0, #0x3\n\ + bgt ._33 @cond_branch\n\ + b ._65\n\ +._33:\n\ + cmp r0, #0x4\n\ + beq ._35 @cond_branch\n\ + cmp r0, #0x5\n\ + beq ._36 @cond_branch\n\ + b ._65\n\ +._35:\n\ + ldr r4, ._41\n\ + ldrb r0, [r4, #0x1e]\n\ + cmp r0, #0\n\ + bne ._38 @cond_branch\n\ + b ._65\n\ +._38:\n\ + mov r0, #0x5\n\ + bl gMysteryEventScriptCmdTableEnd+0x13c0\n\ + ldr r1, ._41 + 4\n\ + add r0, r4, r1\n\ + mov r1, #0x1\n\ + strb r1, [r0]\n\ + ldr r0, ._41 + 8\n\ + bl sub_80FC244\n\ + b ._65\n\ +._42:\n\ + .align 2, 0\n\ +._41:\n\ + .word +0x2000000\n\ + .word 0xa6e\n\ + .word sub_80FC69C+1\n\ +._36:\n\ + mov r0, #0x5\n\ + bl gMysteryEventScriptCmdTableEnd+0x13c0\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, ._44\n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._45:\n\ + .align 2, 0\n\ +._44:\n\ + .word +0x2000000\n\ +._19:\n\ + bl UpdatePaletteFade\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._65 @cond_branch\n\ + ldr r0, ._48\n\ + bl SetMainCallback2\n\ + b ._65\n\ +._49:\n\ + .align 2, 0\n\ +._48:\n\ + .word sub_805469C+1\n\ +._20:\n\ + bl sub_80FAB60\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._50 @cond_branch\n\ +._32:\n\ + bl debug_sub_8110CCC\n\ + b ._65\n\ +._50:\n\ + ldr r0, ._54\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._65 @cond_branch\n\ + bl sub_80FBCA0\n\ + bl sub_80FAEC4\n\ + ldr r1, ._54 + 4\n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._55:\n\ + .align 2, 0\n\ +._54:\n\ + .word gMain\n\ + .word +0x2000000\n\ +._21:\n\ + bl sub_80FAFC0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._65 @cond_branch\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl CreateRegionMapCursor\n\ + ldr r1, ._58\n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._59:\n\ + .align 2, 0\n\ +._58:\n\ + .word +0x2000000\n\ +._22:\n\ + bl sub_80FAB60\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._60 @cond_branch\n\ + bl debug_sub_8110CCC\n\ +._60:\n\ + ldr r0, ._63\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._65 @cond_branch\n\ + bl sub_80FBCA0\n\ + bl sub_80FAEC4\n\ + ldr r1, ._63 + 4\n\ + ldrh r0, [r1, #0x4]\n\ + add r0, r0, #0x1\n\ + b ._62\n\ +._64:\n\ + .align 2, 0\n\ +._63:\n\ + .word gMain\n\ + .word +0x2000000\n\ +._23:\n\ + bl sub_80FAFC0\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._65 @cond_branch\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + bl CreateRegionMapCursor\n\ + ldr r1, ._66\n\ + mov r0, #0x3\n\ +._62:\n\ + strh r0, [r1, #0x4]\n\ +._65:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._67:\n\ + .align 2, 0\n\ +._66:\n\ + .word +0x2000000"); +} + +__attribute__((naked)) +void debug_sub_8110F28(void) +{ + asm("\ + push {lr}\n\ + bl CB2_InitFlyRegionMap\n\ + ldr r0, ._69\n\ + ldr r1, [r0, #0x4]\n\ + ldr r0, ._69 + 4\n\ + cmp r1, r0\n\ + bne ._68 @cond_branch\n\ + bl sub_80FBF94\n\ + ldr r0, ._69 + 8\n\ + bl sub_80FC244\n\ + bl debug_sub_8110CCC\n\ +._68:\n\ + pop {r0}\n\ + bx r0\n\ +._70:\n\ + .align 2, 0\n\ +._69:\n\ + .word gMain\n\ + .word CB2_FlyRegionMap+1\n\ + .word debug_sub_8110D84+1"); +} + +#endif + void sub_80FC7A0(struct Unk03005E20* info) { gUnknown_03005DEC = info->var_4; -- cgit v1.2.3 From 8d14b68921bf5a355e71031a9311125af114cbfe Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 18 Jan 2018 14:30:07 -0600 Subject: add more debug code --- src/engine/save.c | 10 +- src/roulette.c | 1093 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1101 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/engine/save.c b/src/engine/save.c index a9945a80d..de5fd2846 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -783,13 +783,21 @@ u8 Save_WriteDataInternal(u8 saveType) return 0; } +#ifdef DEBUG +extern u32 gUnknown_Debug_03004BD0; +#endif + u8 Save_WriteData(u8 saveType) // TrySave { if (gFlashMemoryPresent != TRUE) return SAVE_STATUS_ERROR; Save_WriteDataInternal(saveType); - if (!gDamagedSaveSectors) + if (!gDamagedSaveSectors +#ifdef DEBUG + && gUnknown_Debug_03004BD0 == 0 +#endif + ) return SAVE_STATUS_OK; DoSaveFailedScreen(saveType); diff --git a/src/roulette.c b/src/roulette.c index ce95bc1c9..240ca11fa 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -131,6 +131,12 @@ struct StructgUnknown_083F8D90 u32 var04; }; +#if DEBUG +u8 gUnknown_Debug_03005FB8; +#endif + +#define static + static void sub_81150FC(void); static void sub_8115124(void); static void sub_8115238(void); @@ -573,6 +579,305 @@ void sub_8115238(void) } #endif +#if DEBUG +__attribute__((naked)) +void sub_8115384(void) +{ + asm("\ + push {r4, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r1, ._35\n\ + ldr r0, ._35 + 4\n\ + str r0, [r1]\n\ + ldr r1, ._35 + 8\n\ + ldr r2, ._35 + 12\n\ + add r0, r1, r2\n\ + ldrb r0, [r0]\n\ + add r2, r1, #0\n\ + cmp r0, #0x7\n\ + bls ._33 @cond_branch\n\ + b ._64\n\ +._33:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._35 + 16\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._36:\n\ + .align 2, 0\n\ +._35:\n\ + .word gUnknown_Debug_03005FB8\n\ + .word +0x2019000\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._37\n\ +._37:\n\ + .word ._38\n\ + .word ._39\n\ + .word ._40\n\ + .word ._41\n\ + .word ._42\n\ + .word ._43\n\ + .word ._44\n\ + .word ._45\n\ +._38:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + bl ScanlineEffect_Stop\n\ + bl sub_80F9438\n\ + bl sub_80F9368\n\ + ldr r1, ._47\n\ + ldr r3, ._47 + 4\n\ + add r0, r3, #0\n\ + strh r0, [r1]\n\ + sub r1, r1, #0x2\n\ + ldr r2, ._47 + 8\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + add r1, r1, #0x46\n\ + mov r3, #0x90\n\ + lsl r3, r3, #0x6\n\ + add r0, r3, #0\n\ + strh r0, [r1]\n\ + add r1, r1, #0x2\n\ + ldr r2, ._47 + 12\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + ldr r0, ._47 + 16\n\ + mov r1, #0xc0\n\ + lsl r1, r1, #0x13\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cb8\n\ + ldr r0, ._47 + 20\n\ + ldr r1, ._47 + 24\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cb8\n\ + ldr r1, ._47 + 28\n\ + ldr r3, ._47 + 32\n\ + add r1, r1, r3\n\ + b ._61\n\ +._48:\n\ + .align 2, 0\n\ +._47:\n\ + .word 0x400000c\n\ + .word 0x4686\n\ + .word 0x4401\n\ + .word 0x60a\n\ + .word gUnknown_08E8096C\n\ + .word gRouletteWheelTiles\n\ + .word 0x6004000\n\ + .word gMain\n\ + .word 0x43c\n\ +._39:\n\ + bl ResetPaletteFade\n\ + bl ResetSpriteData\n\ + bl ResetTasks\n\ + ldr r1, ._50\n\ + ldr r0, ._50 + 4\n\ + add r1, r1, r0\n\ + b ._61\n\ +._51:\n\ + .align 2, 0\n\ +._50:\n\ + .word gMain\n\ + .word 0x43c\n\ +._40:\n\ + ldr r0, ._53\n\ + bl Text_LoadWindowTemplate\n\ + ldr r0, ._53 + 4\n\ + bl InitMenuWindow\n\ + ldr r0, ._53 + 8\n\ + mov r2, #0xe0\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x0\n\ + bl LoadPalette\n\ + ldr r1, ._53 + 12\n\ + ldr r2, ._53 + 16\n\ + add r1, r1, r2\n\ + b ._61\n\ +._54:\n\ + .align 2, 0\n\ +._53:\n\ + .word gWindowTemplate_81E6C3C\n\ + .word gWindowTemplate_81E6CE4\n\ + .word gUnknown_083F86BC\n\ + .word gMain\n\ + .word 0x43c\n\ +._41:\n\ + bl sub_8115238\n\ + bl sub_80F9020\n\ + ldr r0, ._56\n\ + ldr r1, ._56 + 4\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cbc\n\ + ldr r0, ._56 + 8\n\ + ldr r1, ._56 + 12\n\ + bl gMysteryEventScriptCmdTableEnd+0x3cb8\n\ + ldr r1, ._56 + 16\n\ + ldr r3, ._56 + 20\n\ + add r1, r1, r3\n\ + b ._61\n\ +._57:\n\ + .align 2, 0\n\ +._56:\n\ + .word gUnknown_083F88BC\n\ + .word +0x2018800\n\ + .word gUnknown_083F8A60\n\ + .word 0x6003000\n\ + .word gMain\n\ + .word 0x43c\n\ +._42:\n\ + mov r0, #0x0\n\ + bl sub_8117838\n\ + bl sub_811857C\n\ + bl sub_81184D8\n\ + bl sub_8117F2C\n\ + bl sub_8117900\n\ + bl sub_8117BBC\n\ + bl sub_8117DF4\n\ + ldr r1, ._59\n\ + ldr r0, ._59 + 4\n\ + add r1, r1, r0\n\ + b ._61\n\ +._60:\n\ + .align 2, 0\n\ +._59:\n\ + .word gMain\n\ + .word 0x43c\n\ +._43:\n\ + bl AnimateSprites\n\ + bl BuildOamBuffer\n\ + ldr r0, ._62\n\ + ldr r1, ._62 + 4\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + bl sub_81180F4\n\ + mov r0, #0x6\n\ + bl sub_81182F8\n\ + mov r0, #0x0\n\ + bl sub_811829C\n\ + mov r0, #0x0\n\ + bl sub_8117158\n\ + mov r0, #0x0\n\ + mov r1, #0xe\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r0, ._62 + 8\n\ + mov r1, #0x1\n\ + mov r2, #0xf\n\ + bl Menu_PrintText\n\ + ldr r1, ._62 + 12\n\ + mov r2, #0x3c\n\ + neg r2, r2\n\ + add r0, r2, #0\n\ + strh r0, [r1]\n\ + ldr r1, ._62 + 16\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + ldr r1, ._62 + 20\n\ + ldr r3, ._62 + 24\n\ + add r1, r1, r3\n\ + b ._61\n\ +._63:\n\ + .align 2, 0\n\ +._62:\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word gUnknown_081C4157\n\ + .word gSpriteCoordOffsetX\n\ + .word gSpriteCoordOffsetY\n\ + .word gMain\n\ + .word 0x43c\n\ +._44:\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x13\n\ + ldr r3, ._65\n\ + add r0, r3, #0\n\ + strh r0, [r1]\n\ + ldr r0, ._65 + 4\n\ + add r1, r2, r0\n\ +._61:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._64\n\ +._66:\n\ + .align 2, 0\n\ +._65:\n\ + .word 0x1741\n\ + .word 0x43c\n\ +._45:\n\ + ldr r3, ._67\n\ + ldrh r2, [r3]\n\ + mov r0, #0x0\n\ + strh r0, [r3]\n\ + ldr r4, ._67 + 4\n\ + ldrh r0, [r4]\n\ + mov r1, #0x1\n\ + orr r0, r0, r1\n\ + strh r0, [r4]\n\ + strh r2, [r3]\n\ + ldr r2, ._67 + 8\n\ + ldrh r0, [r2]\n\ + mov r1, #0x8\n\ + orr r0, r0, r1\n\ + strh r0, [r2]\n\ + ldr r0, ._67 + 12\n\ + bl SetVBlankCallback\n\ + mov r0, #0x1\n\ + str r0, [sp]\n\ + mov r0, #0xff\n\ + mov r1, #0x0\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginHardwarePaletteFade\n\ + ldr r0, ._67 + 16\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + ldr r4, ._67 + 20\n\ + add r1, r4, #0\n\ + add r1, r1, #0xa4\n\ + strb r0, [r1]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._67 + 24\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + mov r0, #0x6\n\ + strh r0, [r1, #0x14]\n\ + ldr r0, ._67 + 28\n\ + ldr r2, ._67 + 32\n\ + add r0, r0, r2\n\ + ldrh r0, [r0]\n\ + strh r0, [r1, #0x22]\n\ + ldr r0, ._67 + 36\n\ + mov r1, #0x1\n\ + bl CreateTask\n\ + add r4, r4, #0xa5\n\ + strb r0, [r4]\n\ + ldr r0, ._67 + 40\n\ + bl SetMainCallback2\n\ +._64:\n\ + add sp, sp, #0x4\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ +._68:\n\ + .align 2, 0\n\ +._67:\n\ + .word 0x4000208\n\ + .word 0x4000200\n\ + .word 0x4000004\n\ + .word sub_8115124+1\n\ + .word sub_81156BC+1\n\ + .word +0x2019000\n\ + .word gTasks\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word sub_8115634+1\n\ + .word sub_81150FC+1"); +} +#else void sub_8115384(void) { u32 temp_IME; @@ -654,7 +959,120 @@ void sub_8115384(void) break; } } +#endif +#if DEBUG +__attribute__((naked)) +void sub_8115634(u8 unused) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + ldr r0, ._75\n\ + add r3, r0, #0\n\ + add r3, r3, #0x21\n\ + ldrb r1, [r3]\n\ + add r2, r1, #1\n\ + strb r2, [r3]\n\ + add r2, r0, #0\n\ + add r2, r2, #0x23\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + add r6, r0, #0\n\ + ldrb r2, [r2]\n\ + cmp r1, r2\n\ + bne ._70 @cond_branch\n\ + mov r0, #0x0\n\ + strb r0, [r3]\n\ + add r2, r6, #0\n\ + add r2, r2, #0x22\n\ + ldrb r1, [r2]\n\ + ldrh r0, [r6, #0x24]\n\ + sub r0, r0, r1\n\ + strh r0, [r6, #0x24]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._70 @cond_branch\n\ + ldrb r1, [r2]\n\ + mov r2, #0xb4\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + sub r0, r0, r1\n\ + strh r0, [r6, #0x24]\n\ +._70:\n\ + add r4, r6, #0\n\ + ldrh r0, [r4, #0x24]\n\ + bl Sin2\n\ + lsl r0, r0, #0x10\n\ + lsr r5, r0, #0x10\n\ + ldrh r0, [r4, #0x24]\n\ + bl Cos2\n\ + lsl r0, r0, #0x10\n\ + lsr r1, r0, #0x10\n\ + lsl r0, r5, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._71 @cond_branch\n\ + add r0, r0, #0xf\n\ +._71:\n\ + lsl r0, r0, #0xc\n\ + lsr r5, r0, #0x10\n\ + lsl r0, r1, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._72 @cond_branch\n\ + add r0, r0, #0xf\n\ +._72:\n\ + asr r0, r0, #0x4\n\ + strh r0, [r6, #0x32]\n\ + strh r0, [r6, #0x2c]\n\ + strh r5, [r6, #0x2e]\n\ + lsl r0, r5, #0x10\n\ + asr r0, r0, #0x10\n\ + neg r0, r0\n\ + strh r0, [r6, #0x30]\n\ + ldr r0, ._75 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._74 @cond_branch\n\ + ldr r0, ._75 + 8\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._74 @cond_branch\n\ + ldr r2, ._75 + 12\n\ + add r0, r6, #0\n\ + add r0, r0, #0xa4\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x2\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r2\n\ + ldr r1, ._75 + 16\n\ + str r1, [r0]\n\ + ldr r0, ._75 + 20\n\ + bl gMysteryEventScriptCmdTableEnd+0x1c08\n\ + ldr r0, ._75 + 24\n\ + bl gMysteryEventScriptCmdTableEnd+0x1c08\n\ + ldr r0, ._75 + 28\n\ + bl gMysteryEventScriptCmdTableEnd+0x1c08\n\ +._74:\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._76:\n\ + .align 2, 0\n\ +._75:\n\ + .word +0x2019000\n\ + .word unk_203955C\n\ + .word gMain\n\ + .word gTasks\n\ + .word sub_81157AC+1\n\ + .word gMPlay_SE1\n\ + .word gMPlay_SE2\n\ + .word gMPlay_SE3"); +} +#else void sub_8115634(u8 unused) { s16 sin; @@ -675,6 +1093,7 @@ void sub_8115634(u8 unused) eRoulette->var2C.b = sin; eRoulette->var2C.c = -sin; } +#endif void sub_81156BC(u8 taskid) { @@ -1596,7 +2015,69 @@ void sub_8116AB0(u8 taskid) gTasks[taskid].func = &sub_8116B40; } -void sub_8116B40(u8 taskid) // end oulette ? +#if DEBUG +__attribute__((naked)) +void sub_8116B40(u8 taskid) // end roulette ? +{ + asm("\ + push {r4, r5, r6, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + bl UpdatePaletteFade\n\ + lsl r0, r0, #0x18\n\ + lsr r5, r0, #0x18\n\ + cmp r5, #0\n\ + bne ._380 @cond_branch\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + ldr r0, ._381\n\ + mov r2, #0xbe\n\ + lsl r2, r2, #0x1\n\ + mov r1, #0x0\n\ + bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + ldr r1, ._381 + 4\n\ + ldr r0, ._381 + 8\n\ + mov r4, #0x0\n\ + strh r5, [r0]\n\ + strh r5, [r1]\n\ + bl sub_80F9368\n\ + bl FreeAllSpritePalettes\n\ + bl ResetPaletteFade\n\ + bl ResetSpriteData\n\ + bl sub_80F9020\n\ + ldr r0, ._381 + 12\n\ + strh r5, [r0]\n\ + add r0, r0, #0x2\n\ + strh r5, [r0]\n\ + add r0, r0, #0x2\n\ + strh r5, [r0]\n\ + ldr r1, ._381 + 16\n\ + ldr r0, ._381 + 20\n\ + str r0, [r1]\n\ + ldr r0, ._381 + 24\n\ + bl SetMainCallback2\n\ + add r0, r6, #0\n\ + bl DestroyTask\n\ + ldr r0, ._381 + 28\n\ + strb r4, [r0]\n\ +._380:\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._382:\n\ + .align 2, 0\n\ +._381:\n\ + .word +0x2019000\n\ + .word gSpriteCoordOffsetX\n\ + .word gSpriteCoordOffsetY\n\ + .word 0x4000050\n\ + .word gFieldCallback\n\ + .word sub_8080990+1\n\ + .word c2_exit_to_overworld_2_switch+1\n\ + .word unk_203955C"); +} +#else +void sub_8116B40(u8 taskid) // end roulette ? { if (UpdatePaletteFade() == 0) { @@ -1616,6 +2097,7 @@ void sub_8116B40(u8 taskid) // end oulette ? DestroyTask(taskid); } } +#endif void sub_8116BC0(u8 taskid) { @@ -2632,6 +3114,9 @@ void sub_811755C(u8 taskid) void sub_81175C0(u8 taskid) { +#if DEBUG + unk_203955C[0] = 0; +#endif Menu_EraseScreen(); ScriptContext2_Disable(); DestroyTask(taskid); @@ -2694,6 +3179,386 @@ void Task_Roulette_0(u8 taskid) } } +#if DEBUG + +__attribute__((naked)) +void debug_sub_812CDE4() +{ + asm("\ + push {r4, r5, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r3, r0, #0x18\n\ + add r4, r3, #0\n\ + ldr r0, ._575\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._572 @cond_branch\n\ + ldr r1, ._575 + 4\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r1\n\ + ldrh r0, [r2, #0x22]\n\ + add r0, r0, #0x1\n\ + strh r0, [r2, #0x22]\n\ + lsl r0, r0, #0x10\n\ + ldr r1, ._575 + 8\n\ + cmp r0, r1\n\ + bne ._573 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r2, #0x22]\n\ +._573:\n\ + ldr r0, ._575 + 12\n\ + mov r3, #0x22\n\ + ldsh r1, [r2, r3]\n\ + b ._584\n\ +._576:\n\ + .align 2, 0\n\ +._575:\n\ + .word gMain\n\ + .word gTasks\n\ + .word 0x27100000\n\ + .word gStringVar1\n\ +._572:\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._577 @cond_branch\n\ + ldr r1, ._580\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r1\n\ + ldrh r0, [r2, #0x22]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r2, #0x22]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + mov r1, #0x1\n\ + neg r1, r1\n\ + cmp r0, r1\n\ + bne ._578 @cond_branch\n\ + ldr r0, ._580 + 4\n\ + strh r0, [r2, #0x22]\n\ +._578:\n\ + ldr r0, ._580 + 8\n\ + mov r3, #0x22\n\ + ldsh r1, [r2, r3]\n\ + b ._584\n\ +._581:\n\ + .align 2, 0\n\ +._580:\n\ + .word gTasks\n\ + .word 0x270f\n\ + .word gStringVar1\n\ +._577:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._582 @cond_branch\n\ + ldr r1, ._585\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x3\n\ + add r2, r0, r1\n\ + ldrh r3, [r2, #0x22]\n\ + add r0, r3, #0\n\ + add r0, r0, #0xa\n\ + strh r0, [r2, #0x22]\n\ + lsl r0, r0, #0x10\n\ + ldr r1, ._585 + 4\n\ + cmp r0, r1\n\ + ble ._583 @cond_branch\n\ + ldr r1, ._585 + 8\n\ + add r0, r3, r1\n\ + strh r0, [r2, #0x22]\n\ +._583:\n\ + ldr r0, ._585 + 12\n\ + mov r3, #0x22\n\ + ldsh r1, [r2, r3]\n\ + b ._584\n\ +._586:\n\ + .align 2, 0\n\ +._585:\n\ + .word gTasks\n\ + .word 0x270f0000\n\ + .word 0xffffd8fb\n\ + .word gStringVar1\n\ +._582:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._587 @cond_branch\n\ + ldr r0, ._590\n\ + lsl r1, r3, #0x2\n\ + add r1, r1, r3\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r0\n\ + ldrh r2, [r1, #0x22]\n\ + add r0, r2, #0\n\ + sub r0, r0, #0xa\n\ + strh r0, [r1, #0x22]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._588 @cond_branch\n\ + ldr r3, ._590 + 4\n\ + add r0, r2, r3\n\ + strh r0, [r1, #0x22]\n\ +._588:\n\ + ldr r0, ._590 + 8\n\ + mov r2, #0x22\n\ + ldsh r1, [r1, r2]\n\ +._584:\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, ._590 + 12\n\ + ldr r1, ._590 + 16\n\ + add r0, r4, #0\n\ + bl StringExpandPlaceholders\n\ + add r0, r4, #0\n\ + mov r1, #0x9\n\ + mov r2, #0x1\n\ + bl MenuPrint_RightAligned\n\ + b ._596\n\ +._591:\n\ + .align 2, 0\n\ +._590:\n\ + .word gTasks\n\ + .word 0x2705\n\ + .word gStringVar1\n\ + .word gStringVar4\n\ + .word gOtherText_Coins\n\ +._587:\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._592 @cond_branch\n\ + ldr r0, ._594\n\ + ldr r2, ._594 + 4\n\ + lsl r1, r3, #0x2\n\ + add r1, r1, r3\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + ldrh r2, [r1, #0x22]\n\ + ldr r3, ._594 + 8\n\ + add r0, r0, r3\n\ + mov r5, #0x0\n\ + strh r2, [r0]\n\ + ldr r0, ._594 + 12\n\ + str r0, [r1]\n\ + ldr r0, ._594 + 16\n\ + mov r2, #0x22\n\ + ldsh r1, [r1, r2]\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, ._594 + 20\n\ + ldr r1, ._594 + 24\n\ + add r0, r4, #0\n\ + bl StringExpandPlaceholders\n\ + add r0, r4, #0\n\ + mov r1, #0x9\n\ + mov r2, #0x1\n\ + bl MenuPrint_RightAligned\n\ + ldr r0, ._594 + 28\n\ + strb r5, [r0]\n\ + b ._596\n\ +._595:\n\ + .align 2, 0\n\ +._594:\n\ + .word gSaveBlock1\n\ + .word gTasks\n\ + .word 0x494\n\ + .word Task_Roulette_0+1\n\ + .word gStringVar1\n\ + .word gStringVar4\n\ + .word gOtherText_Coins\n\ + .word unk_2039560\n\ +._592:\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._596 @cond_branch\n\ + ldr r0, ._597\n\ + ldr r2, ._597 + 4\n\ + lsl r1, r4, #0x2\n\ + add r1, r1, r4\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + ldrh r2, [r1, #0x22]\n\ + ldr r3, ._597 + 8\n\ + add r0, r0, r3\n\ + strh r2, [r0]\n\ + ldr r0, ._597 + 12\n\ + str r0, [r1]\n\ + ldr r0, ._597 + 16\n\ + mov r2, #0x22\n\ + ldsh r1, [r1, r2]\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, ._597 + 20\n\ + ldr r1, ._597 + 24\n\ + add r0, r4, #0\n\ + bl StringExpandPlaceholders\n\ + add r0, r4, #0\n\ + mov r1, #0x9\n\ + mov r2, #0x1\n\ + bl MenuPrint_RightAligned\n\ + ldr r1, ._597 + 28\n\ + mov r0, #0x1\n\ + strb r0, [r1]\n\ +._596:\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._598:\n\ + .align 2, 0\n\ +._597:\n\ + .word gSaveBlock1\n\ + .word gTasks\n\ + .word 0x494\n\ + .word Task_Roulette_0+1\n\ + .word gStringVar1\n\ + .word gStringVar4\n\ + .word gOtherText_Coins\n\ + .word unk_2039560"); +} + +__attribute__((naked)) +void debug_sub_812CFE8() +{ + asm("\ + push {r4, r5, lr}\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._600\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r5, r1, r2\n\ + ldr r0, ._600 + 4\n\ + ldr r1, ._600 + 8\n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + strh r0, [r5, #0x22]\n\ + bl Random\n\ + mov r1, #0x1\n\ + and r1, r1, r0\n\ + cmp r1, #0\n\ + beq ._599 @cond_branch\n\ + ldr r0, ._600 + 12\n\ + ldrh r1, [r0]\n\ + mov r2, #0x80\n\ + orr r1, r1, r2\n\ + strh r1, [r0]\n\ +._599:\n\ + ldr r0, ._600 + 16\n\ + mov r2, #0x22\n\ + ldsh r1, [r5, r2]\n\ + mov r2, #0x1\n\ + mov r3, #0x4\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, ._600 + 20\n\ + ldr r1, ._600 + 24\n\ + add r0, r4, #0\n\ + bl StringExpandPlaceholders\n\ + mov r0, #0x0\n\ + mov r1, #0x0\n\ + mov r2, #0x9\n\ + mov r3, #0x3\n\ + bl Menu_DrawStdWindowFrame\n\ + add r0, r4, #0\n\ + mov r1, #0x9\n\ + mov r2, #0x1\n\ + bl MenuPrint_RightAligned\n\ + mov r0, #0x0\n\ + mov r1, #0xe\n\ + mov r2, #0x1d\n\ + mov r3, #0x13\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r0, ._600 + 28\n\ + mov r1, #0x1\n\ + mov r2, #0xf\n\ + bl Menu_PrintText\n\ + ldr r0, ._600 + 32\n\ + str r0, [r5]\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0\n\ +._601:\n\ + .align 2, 0\n\ +._600:\n\ + .word gTasks\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word gSpecialVar_0x8004\n\ + .word gStringVar1\n\ + .word gStringVar4\n\ + .word gOtherText_Coins\n\ + .word gUnknown_Debug_0842510D\n\ + .word debug_sub_812CDE4+1"); +} + +#endif + +#if DEBUG +__attribute__((naked)) +void PlayRoulette(void) +{ + asm("\ + push {lr}\n\ + bl ScriptContext2_Enable\n\ + ldr r1, ._604\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + ldr r0, ._604 + 4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._602 @cond_branch\n\ + ldr r0, ._604 + 8\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + b ._603\n\ +._605:\n\ + .align 2, 0\n\ +._604:\n\ + .word unk_2039560\n\ + .word unk_203955C\n\ + .word debug_sub_812CFE8+1\n\ +._602:\n\ + ldr r0, ._606\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r2, ._606 + 4\n\ + lsl r1, r0, #0x2\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + add r1, r1, r2\n\ + ldr r0, ._606 + 8\n\ + ldr r2, ._606 + 12\n\ + add r0, r0, r2\n\ + ldrh r0, [r0]\n\ + strh r0, [r1, #0x22]\n\ +._603:\n\ + pop {r0}\n\ + bx r0\n\ +._607:\n\ + .align 2, 0\n\ +._606:\n\ + .word Task_Roulette_0+1\n\ + .word gTasks\n\ + .word gSaveBlock1\n\ + .word 0x494"); +} +#else void PlayRoulette(void) { u8 taskid; @@ -2701,6 +3566,7 @@ void PlayRoulette(void) taskid = CreateTask(&Task_Roulette_0, 0x0); gTasks[taskid].data[0xD] = gSaveBlock1.coins; } +#endif void sub_8117838(u8 r0) { @@ -3594,6 +4460,99 @@ void sub_8118D2C(struct Sprite *sprite) } } +#if DEBUG +__attribute__((naked)) +void debug_sub_812E698() +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add r7, r0, #0\n\ + bl sub_8118724\n\ + mov r0, #0x0\n\ + strh r0, [r7, #0x32]\n\ + add r0, r7, #0\n\ + bl sub_81186B8\n\ + mov r0, #0x38\n\ + bl gMysteryEventScriptCmdTableEnd+0x13c0\n\ + bl Random\n\ + mov r1, #0x1\n\ + and r1, r1, r0\n\ + cmp r1, #0\n\ + beq ._837 @cond_branch\n\ + ldr r4, ._839\n\ + add r1, r4, #0\n\ + add r1, r1, #0x8c\n\ + ldr r0, ._839 + 4\n\ + str r0, [r1]\n\ + add r0, r4, #0\n\ + add r0, r0, #0x7e\n\ + ldrb r0, [r0]\n\ + add r0, r0, #0x1\n\ + mov r1, #0xc\n\ + bl gMysteryEventScriptCmdTableEnd+0x3e40\n\ + add r1, r4, #0\n\ + add r1, r1, #0x7f\n\ + strb r0, [r1]\n\ + add r1, r4, #0\n\ + ldr r4, ._839 + 8\n\ + b ._838\n\ +._840:\n\ + .align 2, 0\n\ +._839:\n\ + .word +0x2019000\n\ + .word 0x0\n\ + .word gUnknown_083F8DF4\n\ +._837:\n\ + ldr r6, ._841\n\ + add r5, r6, #0\n\ + add r5, r5, #0x8c\n\ + ldr r4, ._841 + 4\n\ + ldrb r0, [r6, #0x4]\n\ + lsl r0, r0, #0x1e\n\ + lsr r0, r0, #0x19\n\ + add r1, r4, #0\n\ + add r1, r1, #0x1c\n\ + add r0, r0, r1\n\ + ldr r1, [r0]\n\ + add r0, r1, #0\n\ + bl gMysteryEventScriptCmdTableEnd+0x54dc\n\ + str r0, [r5]\n\ + add r0, r6, #0\n\ + add r0, r0, #0x7e\n\ + ldrb r0, [r0]\n\ + add r1, r6, #0\n\ + add r1, r1, #0x7f\n\ + strb r0, [r1]\n\ + add r1, r6, #0\n\ +._838:\n\ + mov r0, #0x1\n\ + strh r0, [r7, #0x2e]\n\ + ldrb r0, [r1, #0x4]\n\ + lsl r0, r0, #0x1e\n\ + lsr r0, r0, #0x19\n\ + add r0, r0, r4\n\ + ldrb r0, [r0, #0x2]\n\ + strh r0, [r7, #0x32]\n\ + add r1, r1, #0x98\n\ + ldr r0, ._841 + 8\n\ + str r0, [r1]\n\ + ldr r0, ._841 + 12\n\ + str r0, [r7, #0x1c]\n\ + mov r0, #0x5\n\ + strh r0, [r7, #0x30]\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._842:\n\ + .align 2, 0\n\ +._841:\n\ + .word +0x2019000\n\ + .word gUnknown_083F8DF4\n\ + .word 0x3dae147b\n\ + .word sub_8118D2C+1"); +} +#endif + #ifdef NONMATCHING void sub_8118DE4(struct Sprite *sprite) { @@ -3869,6 +4828,137 @@ _08118F88: .4byte sub_8118D2C\n\ } #endif +#if DEBUG +__attribute__((naked)) +void sub_8118F8C(struct Sprite *sprite) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6, r7}\n\ + add r6, r0, #0\n\ + bl sub_8118724\n\ + ldr r5, ._868\n\ + mov r0, #0x8c\n\ + add r0, r0, r5\n\ + mov r8, r0\n\ + ldr r0, [r0]\n\ + ldr r1, ._868 + 4\n\ + bl gMysteryEventScriptCmdTableEnd+0x5928\n\ + cmp r0, #0\n\ + bgt ._874 @cond_branch\n\ + add r0, r6, #0\n\ + bl sub_81186B8\n\ + add r0, r6, #0\n\ + bl sub_81186E8\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bne ._864 @cond_branch\n\ + add r1, r5, #0\n\ + add r1, r1, #0x90\n\ + ldr r0, ._868 + 8\n\ + str r0, [r1]\n\ + ldr r1, ._868 + 12\n\ + mov r9, r1\n\ + ldrb r0, [r5, #0x4]\n\ + lsl r7, r0, #0x1e\n\ + lsr r0, r7, #0x19\n\ + add r0, r0, r9\n\ + mov r4, #0x3\n\ + ldsb r4, [r0, r4]\n\ + add r0, r4, #0\n\ + bl gMysteryEventScriptCmdTableEnd+0x5a48\n\ + add r5, r0, #0\n\ + cmp r4, #0\n\ + bge ._865 @cond_branch\n\ + ldr r1, ._868 + 16\n\ + bl gMysteryEventScriptCmdTableEnd+0x54dc\n\ + add r5, r0, #0\n\ +._865:\n\ + lsr r0, r7, #0x19\n\ + add r0, r0, r9\n\ + ldrb r0, [r0, #0x4]\n\ + add r0, r0, #0x1\n\ + bl gMysteryEventScriptCmdTableEnd+0x5a48\n\ + add r1, r0, #0\n\ + add r0, r5, #0\n\ + bl gMysteryEventScriptCmdTableEnd+0x56a0\n\ + add r1, r0, #0\n\ + mov r2, r8\n\ + ldr r0, [r2]\n\ + bl gMysteryEventScriptCmdTableEnd+0x5508\n\ + mov r1, r8\n\ + str r0, [r1]\n\ + mov r0, #0x4\n\ + strh r0, [r6, #0x30]\n\ + ldr r0, ._868 + 20\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._866 @cond_branch\n\ + ldr r0, ._868 + 24\n\ + str r0, [r6, #0x1c]\n\ + b ._874\n\ +._869:\n\ + .align 2, 0\n\ +._868:\n\ + .word +0x2019000\n\ + .word 0x3f000000\n\ + .word 0x0\n\ + .word gUnknown_083F8DF4\n\ + .word 0x43800000\n\ + .word unk_2039560\n\ + .word debug_sub_812E698+1\n\ +._866:\n\ + ldr r0, ._871\n\ + str r0, [r6, #0x1c]\n\ + b ._874\n\ +._872:\n\ + .align 2, 0\n\ +._871:\n\ + .word sub_8118DE4+1\n\ +._864:\n\ + add r6, r5, #0\n\ + add r6, r6, #0x90\n\ + ldr r0, [r6]\n\ + ldr r4, ._875\n\ + add r1, r4, #0\n\ + bl gMysteryEventScriptCmdTableEnd+0x58e0\n\ + cmp r0, #0\n\ + beq ._874 @cond_branch\n\ + mov r2, r8\n\ + ldr r0, [r2]\n\ + add r1, r4, #0\n\ + bl gMysteryEventScriptCmdTableEnd+0x59b8\n\ + cmp r0, #0\n\ + bge ._874 @cond_branch\n\ + str r4, [r6]\n\ + mov r0, r8\n\ + str r4, [r0]\n\ + add r4, r5, #0\n\ + add r4, r4, #0x98\n\ + ldr r0, [r4]\n\ + bl gMysteryEventScriptCmdTableEnd+0x5b4c\n\ + ldr r2, ._875 + 4\n\ + ldr r3, ._875 + 8\n\ + bl gMysteryEventScriptCmdTableEnd+0x4c2c\n\ + bl gMysteryEventScriptCmdTableEnd+0x51e8\n\ + str r0, [r4]\n\ +._874:\n\ + pop {r3, r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._876:\n\ + .align 2, 0\n\ +._875:\n\ + .word 0x0\n\ + .word 0x3ff33333\n\ + .word 0x33333333"); +} +#else void sub_8118F8C(struct Sprite *sprite) { sub_8118724(sprite); @@ -3899,6 +4989,7 @@ void sub_8118F8C(struct Sprite *sprite) } } } +#endif void sub_8119088(struct Sprite *sprite) { -- cgit v1.2.3 From bcbc9d040ba671df27183bff0b7356da3d9511f6 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 18 Jan 2018 15:19:31 -0600 Subject: finish adding all debug code --- src/battle/battle_controller_safari.c | 231 ++++++++++++++++++++++++++++++++++ src/engine/save_failed_screen.c | 192 +++++++++++++++++++++++++++- src/field/party_menu.c | 64 ++++++++++ 3 files changed, 483 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c index 0d193d68f..4af8adbbb 100644 --- a/src/battle/battle_controller_safari.c +++ b/src/battle/battle_controller_safari.c @@ -207,6 +207,236 @@ void SafariBufferRunCommand(void) } } +#if DEBUG +__attribute__((naked)) +void bx_battle_menu_t6_2(void) +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._94\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r2, #0x1\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._89 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + bl DestroyMenuCursor\n\ + ldr r1, ._94 + 4\n\ + ldr r0, ._94 + 8\n\ + ldrb r0, [r0]\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._90 @cond_branch\n\ + cmp r0, #0x1\n\ + bgt ._91 @cond_branch\n\ + cmp r0, #0\n\ + beq ._92 @cond_branch\n\ + b ._101\n\ +._95:\n\ + .align 2, 0\n\ +._94:\n\ + .word gMain\n\ + .word gActionSelectionCursor\n\ + .word gActiveBank\n\ +._91:\n\ + cmp r0, #0x2\n\ + beq ._96 @cond_branch\n\ + cmp r0, #0x3\n\ + beq ._97 @cond_branch\n\ + b ._101\n\ +._92:\n\ + mov r0, #0x1\n\ + mov r1, #0x5\n\ + b ._100\n\ +._90:\n\ + mov r0, #0x1\n\ + mov r1, #0x6\n\ + b ._100\n\ +._96:\n\ + mov r0, #0x1\n\ + mov r1, #0x7\n\ +._100:\n\ + mov r2, #0x0\n\ + bl Emitcmd33\n\ + b ._101\n\ +._97:\n\ + mov r0, #0x1\n\ + mov r1, #0x8\n\ + mov r2, #0x0\n\ + bl Emitcmd33\n\ +._101:\n\ + bl SafariBufferExecCompleted\n\ + b ._129\n\ +._89:\n\ + mov r3, #0x20\n\ + add r0, r3, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._103 @cond_branch\n\ + ldr r5, ._107\n\ + ldr r4, ._107 + 4\n\ + ldrb r0, [r4]\n\ + add r0, r0, r5\n\ + ldrb r1, [r0]\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._104 @cond_branch\n\ + b ._129\n\ +._104:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldrb r0, [r4]\n\ + add r0, r0, r5\n\ + ldrb r0, [r0]\n\ + bl nullsub_8\n\ + ldrb r1, [r4]\n\ + add r1, r1, r5\n\ + ldrb r0, [r1]\n\ + mov r2, #0x1\n\ + b ._111\n\ +._108:\n\ + .align 2, 0\n\ +._107:\n\ + .word gActionSelectionCursor\n\ + .word gActiveBank\n\ +._103:\n\ + mov r0, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._109 @cond_branch\n\ + ldr r5, ._112\n\ + ldr r4, ._112 + 4\n\ + ldrb r0, [r4]\n\ + add r0, r0, r5\n\ + ldrb r1, [r0]\n\ + add r0, r2, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._129 @cond_branch\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldrb r0, [r4]\n\ + add r0, r0, r5\n\ + ldrb r0, [r0]\n\ + bl nullsub_8\n\ + ldrb r1, [r4]\n\ + add r1, r1, r5\n\ + ldrb r0, [r1]\n\ + mov r2, #0x1\n\ + b ._111\n\ +._113:\n\ + .align 2, 0\n\ +._112:\n\ + .word gActionSelectionCursor\n\ + .word gActiveBank\n\ +._109:\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._114 @cond_branch\n\ + ldr r5, ._117\n\ + ldr r4, ._117 + 4\n\ + ldrb r0, [r4]\n\ + add r0, r0, r5\n\ + ldrb r1, [r0]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._129 @cond_branch\n\ + b ._116\n\ +._118:\n\ + .align 2, 0\n\ +._117:\n\ + .word gActionSelectionCursor\n\ + .word gActiveBank\n\ +._114:\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._119 @cond_branch\n\ + ldr r5, ._122\n\ + ldr r4, ._122 + 4\n\ + ldrb r0, [r4]\n\ + add r0, r0, r5\n\ + ldrb r1, [r0]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._129 @cond_branch\n\ +._116:\n\ + mov r0, #0x5\n\ + bl PlaySE\n\ + ldrb r0, [r4]\n\ + add r0, r0, r5\n\ + ldrb r0, [r0]\n\ + bl nullsub_8\n\ + ldrb r1, [r4]\n\ + add r1, r1, r5\n\ + ldrb r0, [r1]\n\ + mov r2, #0x2\n\ +._111:\n\ + eor r0, r0, r2\n\ + strb r0, [r1]\n\ + ldrb r0, [r4]\n\ + add r0, r0, r5\n\ + ldrb r0, [r0]\n\ + mov r1, #0x0\n\ + bl sub_802E3E4\n\ + b ._129\n\ +._123:\n\ + .align 2, 0\n\ +._122:\n\ + .word gActionSelectionCursor\n\ + .word gActiveBank\n\ +._119:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._124 @cond_branch\n\ + ldr r0, ._127\n\ + ldrb r2, [r0]\n\ + lsl r0, r2, #0x1\n\ + add r0, r0, r2\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._127 + 4\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + add r0, r3, #0\n\ + and r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._129 @cond_branch\n\ + str r0, [sp]\n\ + add r0, r2, #0\n\ + add r1, r2, #0\n\ + mov r3, #0x4\n\ + bl move_anim_start_t3\n\ + b ._129\n\ +._128:\n\ + .align 2, 0\n\ +._127:\n\ + .word gActiveBank\n\ + .word +0x2017810\n\ +._124:\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._129 @cond_branch\n\ + bl sub_804454C\n\ +._129:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r0}\n\ + bx r0"); +} +#else void bx_battle_menu_t6_2(void) { if (gMain.newKeys & A_BUTTON) @@ -273,6 +503,7 @@ void bx_battle_menu_t6_2(void) } } } +#endif void sub_812B65C(void) { diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c index 74a1e9612..421cd0779 100644 --- a/src/engine/save_failed_screen.c +++ b/src/engine/save_failed_screen.c @@ -61,16 +61,18 @@ static const u8 sClockFrames[8][3] = static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz"); +#define static + static void VBlankCB(void); static void CB2_SaveFailedScreen(void); static void CB2_WipeSave(void); -static void CB2_GameplayCannotBeContinued(void); +/*static*/ void CB2_GameplayCannotBeContinued(void); static void CB2_FadeAndReturnToTitleScreen(void); static void CB2_ReturnToTitleScreen(void); static void VBlankCB_UpdateClockGraphics(void); static bool8 VerifySectorWipe(u16 sector); static bool8 WipeSector(u16 sector); -static bool8 WipeSectors(u32 sectorBits); +/*static*/ bool8 WipeSectors(u32 sectorBits); void DoSaveFailedScreen(u8 saveType) { @@ -148,6 +150,151 @@ static void CB2_SaveFailedScreen(void) } } +#if DEBUG +__attribute__((naked)) +void CB2_WipeSave() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r0, ._20\n" + " mov r2, #0x1\n" + " strh r2, [r0]\n" + " ldr r0, ._20 + 4\n" + " ldr r0, [r0]\n" + " ldr r1, ._20 + 8\n" + " cmp r0, #0\n" + " beq ._12 @cond_branch\n" + " str r2, [r1]\n" + "._12:\n" + " ldr r0, [r1]\n" + " cmp r0, #0\n" + " beq ._16 @cond_branch\n" + " add r5, r1, #0\n" + "._17:\n" + " ldr r0, [r5]\n" + " bl WipeSectors\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._14 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 12\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._20 + 16\n" + " ldrb r0, [r0]\n" + " bl Save_WriteDataInternal\n" + " ldr r0, [r5]\n" + " cmp r0, #0\n" + " beq ._15 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 20\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + "._15:\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " ldr r0, [r5]\n" + " cmp r0, #0\n" + " beq ._16 @cond_branch\n" + " cmp r4, #0x2\n" + " bls ._17 @cond_branch\n" + "._16:\n" + " cmp r4, #0x3\n" + " bne ._18 @cond_branch\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._20 + 24\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._20 + 28\n" + " bl SetMainCallback2\n" + " b ._23\n" + "._21:\n" + " .align 2, 0\n" + "._20:\n" + " .word gSaveFailedClockInfo\n" + " .word gUnknown_Debug_03004BD0\n" + " .word gDamagedSaveSectors\n" + " .word gSystemText_CheckCompleteSaveAttempt\n" + " .word gSaveFailedType\n" + " .word gSystemText_SaveFailedBackupCheck\n" + " .word gSystemText_BackupDamagedGameContinue\n" + " .word CB2_FadeAndReturnToTitleScreen+1\n" + "._18:\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._24\n" + " ldr r0, [r0]\n" + " cmp r0, #0\n" + " bne ._22 @cond_branch\n" + " ldr r0, ._24 + 4\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " b ._23\n" + "._25:\n" + " .align 2, 0\n" + "._24:\n" + " .word gGameContinueCallback\n" + " .word gSystemText_SaveCompletedGameEnd\n" + "._14:\n" + " mov r0, #0x1\n" + " mov r1, #0xa\n" + " mov r2, #0x1c\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, ._27\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, ._27 + 4\n" + " bl SetMainCallback2\n" + " b ._26\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word gSystemText_BackupDamagedGameContinue\n" + " .word CB2_GameplayCannotBeContinued+1\n" + "._22:\n" + " ldr r0, ._29\n" + " mov r1, #0x2\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + "._23:\n" + " ldr r0, ._29 + 4\n" + " bl SetMainCallback2\n" + "._26:\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._30:\n" + " .align 2, 0\n" + "._29:\n" + " .word gSystemText_SaveCompletedPressA\n" + " .word CB2_FadeAndReturnToTitleScreen+1\n" + "\n" + ); +} +#else static void CB2_WipeSave(void) { u8 wipeTries = 0; @@ -198,8 +345,9 @@ static void CB2_WipeSave(void) SetMainCallback2(CB2_FadeAndReturnToTitleScreen); } +#endif -static void CB2_GameplayCannotBeContinued(void) +/*static*/ void CB2_GameplayCannotBeContinued(void) { gSaveFailedClockInfo[0] = FALSE; @@ -264,6 +412,41 @@ static void VBlankCB_UpdateClockGraphics(void) gSaveFailedClockInfo[1]--; } +#if DEBUG +__attribute__((naked)) +bool8 VerifySectorWipe(u16 sector) +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " ldr r2, ._50\n" + " mov r3, #0x80\n" + " lsl r3, r3, #0x5\n" + " mov r1, #0x0\n" + " bl gMysteryEventScriptCmdTableEnd+0x2d64\n" + " mov r0, #0x0\n" + " ldr r1, ._50 + 4\n" + "._49:\n" + " add r0, r0, #0x1\n" + " lsl r0, r0, #0x10\n" + " lsr r0, r0, #0x10\n" + " cmp r0, r1\n" + " bls ._49 @cond_branch\n" + " ldr r0, ._50 + 8\n" + " ldrb r0, [r0]\n" + " pop {r1}\n" + " bx r1\n" + "._51:\n" + " .align 2, 0\n" + "._50:\n" + " .word +0x2000000\n" + " .word 0x3ff\n" + " .word gUnknown_Debug_03004BD0\n" + "\n" + ); +} +#else static bool8 VerifySectorWipe(u16 sector) { u32 *ptr = (u32 *)&gSharedMem; @@ -277,6 +460,7 @@ static bool8 VerifySectorWipe(u16 sector) return FALSE; } +#endif static bool8 WipeSector(u16 sector) { @@ -294,7 +478,7 @@ static bool8 WipeSector(u16 sector) return failed; } -static bool8 WipeSectors(u32 sectorBits) +/*static*/ bool8 WipeSectors(u32 sectorBits) { u16 i; diff --git a/src/field/party_menu.c b/src/field/party_menu.c index e26b801bc..b76710a2d 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -107,6 +107,69 @@ EWRAM_DATA u8 gUnknown_0202E8F6 = 0; EWRAM_DATA u16 gUnknown_0202E8F8 = 0; EWRAM_DATA u8 gPartyMenuType = 0; +#if 0 +const u16 TMHMMoves[] = +{ + 0x5016, + 0x030D, + 0x3DFF, + MOVE_CALM_MIND, + MOVE_ROAR, + MOVE_TOXIC, + MOVE_HAIL, + MOVE_BULK_UP, + MOVE_BULLET_SEED, + MOVE_HIDDEN_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_ICE_BEAM, + MOVE_BLIZZARD, + MOVE_HYPER_BEAM, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_GIGA_DRAIN, + MOVE_SAFEGUARD, + MOVE_FRUSTRATION, + MOVE_SOLAR_BEAM, + MOVE_IRON_TAIL, + MOVE_THUNDERBOLT, + MOVE_THUNDER, + MOVE_EARTHQUAKE, + MOVE_RETURN, + MOVE_DIG, + MOVE_PSYCHIC, + MOVE_SHADOW_BALL, + MOVE_BRICK_BREAK, + MOVE_DOUBLE_TEAM, + MOVE_REFLECT, + MOVE_SHOCK_WAVE, + MOVE_FLAMETHROWER, + MOVE_SLUDGE_BOMB, + MOVE_SANDSTORM, + MOVE_FIRE_BLAST, + MOVE_ROCK_TOMB, + MOVE_AERIAL_ACE, + MOVE_TORMENT, + MOVE_FACADE, + MOVE_SECRET_POWER, + MOVE_REST, + MOVE_ATTRACT, + MOVE_THIEF, + MOVE_STEEL_WING, + MOVE_SKILL_SWAP, + MOVE_SNATCH, + MOVE_OVERHEAT, + MOVE_CUT, + MOVE_FLY, + MOVE_SURF, + MOVE_STRENGTH, + MOVE_FLASH, + MOVE_ROCK_SMASH, + MOVE_WATERFALL, + MOVE_DIVE, +}; +#else const u16 TMHMMoves[] = { MOVE_FOCUS_PUNCH, @@ -168,6 +231,7 @@ const u16 TMHMMoves[] = MOVE_WATERFALL, MOVE_DIVE, }; +#endif //FIXME //const u8 *unrefTileBuffer = gTileBuffer; -- cgit v1.2.3 From b85e23c15a5cbdd88d6c3111d2f54de0a2adac35 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 18 Jan 2018 17:07:11 -0600 Subject: add some debug data --- src/debug/unk_debug_menu_3.c | 39 ++++++++++++++---------- src/engine/menu_cursor.c | 9 ++++++ src/engine/reset_rtc_screen.c | 7 +++++ src/field/field_effect_helpers.c | 2 -- src/field/party_menu.c | 64 ---------------------------------------- src/field/pokeblock.c | 5 ++++ src/pokemon/mail.c | 12 ++++---- 7 files changed, 50 insertions(+), 88 deletions(-) (limited to 'src') diff --git a/src/debug/unk_debug_menu_3.c b/src/debug/unk_debug_menu_3.c index dfb92feb9..fe2e6317e 100644 --- a/src/debug/unk_debug_menu_3.c +++ b/src/debug/unk_debug_menu_3.c @@ -1,5 +1,10 @@ +#include "global.h" +#include "menu.h" + +#if DEBUG + __attribute__((naked)) -void debug_sub_813C404() +int debug_sub_813C404() { asm( " push {r4, r5, r6, lr}\n" @@ -27,7 +32,7 @@ void debug_sub_813C404() } __attribute__((naked)) -void debug_sub_813C430() +int debug_sub_813C430() { asm( " push {r4, r5, r6, lr}\n" @@ -55,7 +60,7 @@ void debug_sub_813C430() } __attribute__((naked)) -void debug_sub_813C45C() +int debug_sub_813C45C() { asm( " push {r4, r5, r6, lr}\n" @@ -83,7 +88,7 @@ void debug_sub_813C45C() } __attribute__((naked)) -void debug_sub_813C488() +int debug_sub_813C488() { asm( " push {r4, r5, r6, lr}\n" @@ -111,7 +116,7 @@ void debug_sub_813C488() } __attribute__((naked)) -void debug_sub_813C4B4() +int debug_sub_813C4B4() { asm( " push {r4, lr}\n" @@ -134,7 +139,7 @@ void debug_sub_813C4B4() } __attribute__((naked)) -void debug_sub_813C4D4() +int debug_sub_813C4D4() { asm( " push {r4, r5, r6, lr}\n" @@ -162,7 +167,7 @@ void debug_sub_813C4D4() } __attribute__((naked)) -void debug_sub_813C500() +int debug_sub_813C500() { asm( " push {r4, r5, r6, lr}\n" @@ -237,7 +242,7 @@ void debug_sub_813C52C() } __attribute__((naked)) -void debug_sub_813C580() +int debug_sub_813C580() { asm( " push {lr}\n" @@ -250,7 +255,7 @@ void debug_sub_813C580() } __attribute__((naked)) -void debug_sub_813C58C() +int debug_sub_813C58C() { asm( " push {lr}\n" @@ -263,7 +268,7 @@ void debug_sub_813C58C() } __attribute__((naked)) -void debug_sub_813C598() +int debug_sub_813C598() { asm( " push {lr}\n" @@ -276,7 +281,7 @@ void debug_sub_813C598() } __attribute__((naked)) -void debug_sub_813C5A4() +int debug_sub_813C5A4() { asm( " push {lr}\n" @@ -293,7 +298,7 @@ void debug_sub_813C5A4() } __attribute__((naked)) -void debug_sub_813C5B4() +int debug_sub_813C5B4() { asm( " push {r4, r5, r6, r7, lr}\n" @@ -498,7 +503,7 @@ void debug_sub_813C6AC() } __attribute__((naked)) -void debug_sub_813C740() +int debug_sub_813C740() { asm( " push {r4, r5, r6, lr}\n" @@ -596,7 +601,7 @@ void debug_sub_813C740() } __attribute__((naked)) -void debug_sub_813C810() +int debug_sub_813C810() { asm( " push {r4, r5, r6, lr}\n" @@ -656,7 +661,7 @@ void debug_sub_813C810() } __attribute__((naked)) -void debug_sub_813C888() +int debug_sub_813C888() { asm( " push {r4, r5, r6, lr}\n" @@ -752,7 +757,7 @@ void debug_sub_813C904() } __attribute__((naked)) -void debug_sub_813C93C() +int debug_sub_813C93C() { asm( " push {r4, r5, r6, lr}\n" @@ -795,3 +800,5 @@ void debug_sub_813C93C() ); } +#endif + diff --git a/src/engine/menu_cursor.c b/src/engine/menu_cursor.c index 35116d40b..ae4d5b14a 100644 --- a/src/engine/menu_cursor.c +++ b/src/engine/menu_cursor.c @@ -11,6 +11,15 @@ EWRAM_DATA static u8 gUnknown_0203A3D2 = 0; EWRAM_DATA static u8 gUnknown_0203A3D3 = 0; EWRAM_DATA static u8 gUnknown_0203A3D4 = 0; +#if DEBUG +//const u8 gEmptySpace_08459A8C[0x1C0] = {0}; +//const u8 gEmptySpace_08459A8C[0xE300-0xC700] = {0}; +asm(".section .rodata\n\ + .global gEmptySpace_08459A8C\n\ +gEmptySpace_08459A8C:\n\ + .incbin \"pokeruby_de_debug.gba\", 0x459A8C, 0x1C00"); +#endif + #if ENGLISH #include "../src/data/menu_cursor_en.h" #elif GERMAN diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index 0cfa1e71a..cda73f96b 100644 --- a/src/engine/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c @@ -147,6 +147,13 @@ const struct SpriteTemplate gSpriteTemplate_83764E8 = const u8 gUnknown_08376500[] = _(" : "); +#if DEBUG +const u8 gUnknown_Debug_0839AE94[] = _("にっすう"); +const u8 gUnknown_Debug_0839AE99[] = _("じかん"); +const u8 gUnknown_Debug_0839AE9D[] = _("ゲームない じかん"); +const u8 gUnknown_Debug_0839AEA7[] = _("RTC じかん"); +#endif + void SpriteCB_ResetRtcCusor0(struct Sprite *sprite) { int state = gTasks[sprite->data[0]].data[2]; diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c index 165829a55..e2514df90 100644 --- a/src/field/field_effect_helpers.c +++ b/src/field/field_effect_helpers.c @@ -29,8 +29,6 @@ static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *); static void sub_8128174(struct Sprite *); static u32 ShowDisguiseFieldEffect(u8, u8, u8); -const u8 UnusedEggString_8401E28[] = _("タマゴ"); - void SetUpReflection(struct MapObject *mapObject, struct Sprite *sprite, bool8 flag) { struct Sprite *newSprite; diff --git a/src/field/party_menu.c b/src/field/party_menu.c index b76710a2d..e26b801bc 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -107,69 +107,6 @@ EWRAM_DATA u8 gUnknown_0202E8F6 = 0; EWRAM_DATA u16 gUnknown_0202E8F8 = 0; EWRAM_DATA u8 gPartyMenuType = 0; -#if 0 -const u16 TMHMMoves[] = -{ - 0x5016, - 0x030D, - 0x3DFF, - MOVE_CALM_MIND, - MOVE_ROAR, - MOVE_TOXIC, - MOVE_HAIL, - MOVE_BULK_UP, - MOVE_BULLET_SEED, - MOVE_HIDDEN_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_ICE_BEAM, - MOVE_BLIZZARD, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_GIGA_DRAIN, - MOVE_SAFEGUARD, - MOVE_FRUSTRATION, - MOVE_SOLAR_BEAM, - MOVE_IRON_TAIL, - MOVE_THUNDERBOLT, - MOVE_THUNDER, - MOVE_EARTHQUAKE, - MOVE_RETURN, - MOVE_DIG, - MOVE_PSYCHIC, - MOVE_SHADOW_BALL, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_REFLECT, - MOVE_SHOCK_WAVE, - MOVE_FLAMETHROWER, - MOVE_SLUDGE_BOMB, - MOVE_SANDSTORM, - MOVE_FIRE_BLAST, - MOVE_ROCK_TOMB, - MOVE_AERIAL_ACE, - MOVE_TORMENT, - MOVE_FACADE, - MOVE_SECRET_POWER, - MOVE_REST, - MOVE_ATTRACT, - MOVE_THIEF, - MOVE_STEEL_WING, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_OVERHEAT, - MOVE_CUT, - MOVE_FLY, - MOVE_SURF, - MOVE_STRENGTH, - MOVE_FLASH, - MOVE_ROCK_SMASH, - MOVE_WATERFALL, - MOVE_DIVE, -}; -#else const u16 TMHMMoves[] = { MOVE_FOCUS_PUNCH, @@ -231,7 +168,6 @@ const u16 TMHMMoves[] = MOVE_WATERFALL, MOVE_DIVE, }; -#endif //FIXME //const u8 *unrefTileBuffer = gTileBuffer; diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c index 73fa53d97..b69d8ac06 100644 --- a/src/field/pokeblock.c +++ b/src/field/pokeblock.c @@ -233,6 +233,11 @@ const struct Pokeblock gUnknown_083F7F9C[] = { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20} }; +#if DEBUG +// possibly continuation of gUnknown_083F7F9C? +asm(".incbin \"baserom_de_debug.gba\", 0x424128, 0x50"); +#endif + // text static void sub_810B674(void) diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index 1ad8d8376..160bce913 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -298,13 +298,13 @@ const u8 Str_841160F[] = _("{STR_VAR_1} {STR_VAR_2}"); const u8 Str_841161A[] = _("メール{STR_VAR_1} {STR_VAR_2}"); const u8 Str_8411623[] = _("メール{STR_VAR_1}を だれに もたせる?"); const u8 Str_8411634[] = _("000 {STR_VAR_1}"); -const u8 Str_841163B[] = _("せいきの データが とうろくずみ です\n"); -const u8 Str_841163B_after[] = _("しんき とうろく できません"); -const u8 Str_841165E[] = _("せいきに とうろくされたメールデータは\n"); -const u8 Str_841165E_after[] = _("へんこう できません"); +const u8 Str_841163B[] = _("せいきの データが とうろくずみ です\n" + "しんき とうろく できません"); +const u8 Str_841165E[] = _("せいきに とうろくされたメールデータは\n" + "へんこう できません"); const u8 Str_841167D[] = _("メール{STR_VAR_1} とうろく かいじょ"); -const u8 Str_841168D[] = _("デバッグメニューから とうろくした\n"); -const u8 Str_841168D_after[] = _("メール いがいは けせません"); +const u8 Str_841168D[] = _("デバッグメニューから とうろくした\n" + "メール いがいは けせません"); const u8 Str_84116AE[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); const struct MenuAction _84116BC[] = -- cgit v1.2.3 From 6553903150b6ee262bead5d8c7c5b304bd323fb2 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Thu, 18 Jan 2018 18:56:44 -0600 Subject: start labeling field_weather --- src/field/coord_event_weather.c | 4 +- src/field/field_weather.c | 193 ++++++++++++++++++-------------------- src/field/field_weather_effects.c | 60 ++++++------ 3 files changed, 125 insertions(+), 132 deletions(-) (limited to 'src') diff --git a/src/field/coord_event_weather.c b/src/field/coord_event_weather.c index db4e9c161..60b87fa30 100644 --- a/src/field/coord_event_weather.c +++ b/src/field/coord_event_weather.c @@ -34,7 +34,7 @@ static const struct CoordEventWeather sCoordEventWeatherFuncs[] = { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog }, { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash }, { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm }, - { COORD_EVENT_WEATHER_DARK, CoordEventWeather_Dark }, + { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark }, { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought }, { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle }, { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle }, @@ -87,7 +87,7 @@ static void CoordEventWeather_Sandstorm(void) static void CoordEventWeather_Dark(void) { - SetWeather(WEATHER_DARK); + SetWeather(WEATHER_SHADE); } static void CoordEventWeather_Drought(void) diff --git a/src/field/field_weather.c b/src/field/field_weather.c index b6475d8ff..5f3f93096 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -13,7 +13,7 @@ #include "trig.h" #include "ewram.h" -#define MACRO1(a) ((((a) >> 1) & 0xF) | (((a) >> 2) & 0xF0) | (((a) >> 3) & 0xF00)) +#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) struct RGBColor { @@ -108,10 +108,10 @@ void Fog1_InitVars(void); void Fog1_Main(void); void Fog1_InitAll(void); bool8 Fog1_Finish(void); -void Weather11_InitVars(void); -void Weather11_Main(void); -void Weather11_InitAll(void); -bool8 Weather11_Finish(void); +void Shade_InitVars(void); +void Shade_Main(void); +void Shade_InitAll(void); +bool8 Shade_Finish(void); void Drought_InitVars(void); void Drought_Main(void); void Drought_InitAll(void); @@ -138,7 +138,7 @@ static const struct WeatherCallbacks sWeatherFuncs[] = {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish}, {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish}, {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, - {Weather11_InitVars, Weather11_Main, Weather11_InitAll, Weather11_Finish}, + {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish}, {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish}, {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish}, {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish}, @@ -152,7 +152,7 @@ void (*const gUnknown_083970B8[])(void) = nullsub_39, }; -const u8 gUnknown_083970C8[] = +const u8 gUnknown_083970C8[32] = { 1, 1, @@ -193,6 +193,7 @@ const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); void StartWeather(void) { u8 index; + if (!FuncIsActiveTask(Task_WeatherMain)) { index = AllocSpritePalette(0x1200); @@ -266,7 +267,7 @@ void Task_WeatherMain(u8 taskId) if (!sWeatherFuncs[gWeatherPtr->currWeather].finish()) { sWeatherFuncs[gWeatherPtr->nextWeather].initVars(); - gWeatherPtr->unknown_6C3 = 0; + gWeatherPtr->gammaStepFrameCounter = 0; gWeatherPtr->unknown_6C6 = 0; gWeatherPtr->currWeather = gWeatherPtr->nextWeather; gWeatherPtr->unknown_6D3 = 1; @@ -281,8 +282,8 @@ void Task_WeatherMain(u8 taskId) void None_Init(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 0; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 0; } void None_Main(void) @@ -315,7 +316,7 @@ void sub_807CB10(void) else v1 = gWeatherPtr->unk460; - for (v2 = 0; (u16)v2 <= 0x1f; v2++) + for (v2 = 0; v2 < 32; v2++) { v4 = v2 << 8; if (v0 == 0) @@ -334,33 +335,27 @@ void sub_807CB10(void) v10 += 0xf; } v11 = v10 >> 4; - if (v2 <= 0xb) + if (v2 < 12) { - for (; v6 <= 0x12; v6++) + for (; v6 < 19; v6++) { v4 += v11; dunno = v4 - v9; if (dunno > 0) - { v4 -= (dunno + ((u16)dunno >> 15)) >> 1; - } v1[v6][v2] = v4 >> 8; if (v1[v6][v2] > 0x1f) - { v1[v6][v2] = 0x1f; - } } } else { - for (; v6 <= 0x12; v6++) + for (; v6 < 19; v6++) { v4 += v11; v1[v6][v2] = v4 >> 8; if (v1[v6][v2] > 0x1f) - { v1[v6][v2] = 0x1f; - } } } } @@ -369,20 +364,20 @@ void sub_807CB10(void) void sub_807CC24(void) { - if (gWeatherPtr->unknown_6C0 == gWeatherPtr->unknown_6C1) + if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) { gWeatherPtr->unknown_6C6 = 3; } else { - if (++gWeatherPtr->unknown_6C3 >= gWeatherPtr->unknown_6C2) + if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay) { - gWeatherPtr->unknown_6C3 = 0; - if (gWeatherPtr->unknown_6C0 < gWeatherPtr->unknown_6C1) - gWeatherPtr->unknown_6C0++; + gWeatherPtr->gammaStepFrameCounter = 0; + if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex) + gWeatherPtr->gammaIndex++; else - gWeatherPtr->unknown_6C0--; - sub_807CEBC(0, 0x20, gWeatherPtr->unknown_6C0); + gWeatherPtr->gammaIndex--; + BlendSomething_807CEBC(0, 0x20, gWeatherPtr->gammaIndex); } } } @@ -397,24 +392,24 @@ void sub_807CCAC(void) case WEATHER_RAIN_MED: case WEATHER_RAIN_HEAVY: case WEATHER_SNOW: - case WEATHER_DARK: - if (sub_807CDC4() == 0) + case WEATHER_SHADE: + if (RainSnowShadeBlend_807CDC4() == 0) { - gWeatherPtr->unknown_6C0 = 3; + gWeatherPtr->gammaIndex = 3; gWeatherPtr->unknown_6C6 = 3; } break; case WEATHER_DROUGHT: - if (sub_807CE24() == 0) + if (DroughtBlend_807CE24() == 0) { - gWeatherPtr->unknown_6C0 = -6; + gWeatherPtr->gammaIndex = -6; gWeatherPtr->unknown_6C6 = 3; } break; case WEATHER_FOG_1: - if (sub_807CE7C() == 0) + if (Fog1Blend_807CE7C() == 0) { - gWeatherPtr->unknown_6C0 = 0; + gWeatherPtr->gammaIndex = 0; gWeatherPtr->unknown_6C6 = 3; } break; @@ -425,47 +420,47 @@ void sub_807CCAC(void) default: if (!gPaletteFade.active) { - gWeatherPtr->unknown_6C0 = gWeatherPtr->unknown_6C1; + gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex; gWeatherPtr->unknown_6C6 = 3; } break; } } -u8 sub_807CDC4(void) +u8 RainSnowShadeBlend_807CDC4(void) { if (gWeatherPtr->unknown_6C7 == 0x10) return 0; if (++gWeatherPtr->unknown_6C7 >= 0x10) { - sub_807CEBC(0, 0x20, 3); + BlendSomething_807CEBC(0, 0x20, 3); gWeatherPtr->unknown_6C7 = 0x10; return 0; } - sub_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); + BlendSomething_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); return 1; } -u8 sub_807CE24(void) +u8 DroughtBlend_807CE24(void) { if (gWeatherPtr->unknown_6C7 == 0x10) return 0; if (++gWeatherPtr->unknown_6C7 >= 0x10) { - sub_807CEBC(0, 0x20, -6); + BlendSomething_807CEBC(0, 0x20, -6); gWeatherPtr->unknown_6C7 = 0x10; return 0; } - sub_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); + BlendSomething_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); return 1; } -u8 sub_807CE7C(void) +u8 Fog1Blend_807CE7C(void) { if (gWeatherPtr->unknown_6C7 == 0x10) return 0; ++gWeatherPtr->unknown_6C7; - sub_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); + BlendSomething_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); return 1; } @@ -473,7 +468,7 @@ void nullsub_39(void) { } -void sub_807CEBC(u8 a, u8 b, s8 c) +void BlendSomething_807CEBC(u8 a, u8 b, s8 c) { u16 r4; u16 palOffset; @@ -578,7 +573,7 @@ void sub_807CEBC(u8 a, u8 b, s8 c) } } -void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e) +void BlendSomething_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e) { u16 palOffset; u16 r4; @@ -625,7 +620,7 @@ void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e) } } -void sub_807D304(s8 a, u8 coeff, u16 c) +void BlendSomething_807D304(s8 a, u8 coeff, u16 c) { struct RGBColor color; u8 r_; @@ -681,31 +676,30 @@ void sub_807D304(s8 a, u8 coeff, u16 c) bool8 sub_807D574(u8); -void sub_807D424(u8 a, u16 b) +void BlendSomething_807D424(u8 coeff, u16 blendColor) { struct RGBColor color; - u8 r_; - u8 g_; - u8 b_; - u16 r4; - - BlendPalette(0, 0x100, a, b); - color = *(struct RGBColor *)&b; - r_ = color.r; - g_ = color.g; - b_ = color.b; - - r4 = 16; - while (r4 < 32) + u8 blendR; + u8 blendG; + u8 blendB; + u16 palNum; + + BlendPalette(0, 0x100, coeff, blendColor); + color = *(struct RGBColor *)&blendColor; + blendR = color.r; + blendG = color.g; + blendB = color.b; + + for (palNum = 16; palNum < 32; palNum++) { - if (sub_807D574(r4)) + if (sub_807D574(palNum)) { - u16 r12 = (r4 + 1) * 16; - u16 r6 = r4 * 16; + u16 palEnd = (palNum + 1) * 16; + u16 palOffset = palNum * 16; - while (r6 < r12) + while (palOffset < palEnd) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[r6]; + struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; u8 r = color.r; u8 g = color.g; u8 b = color.b; @@ -714,19 +708,18 @@ void sub_807D424(u8 a, u16 b) g += ((31 - g) * 3) >> 2; b += ((28 - b) * 3) >> 2; - r += ((r_ - r) * a) >> 4; - g += ((g_ - g) * a) >> 4; - b += ((b_ - b) * a) >> 4; + r += ((blendR - r) * coeff) >> 4; + g += ((blendG - g) * coeff) >> 4; + b += ((blendB - b) * coeff) >> 4; - gPlttBufferFaded[r6] = (b << 10) | (g << 5) | r; - r6++; + gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; + palOffset++; } } else { - BlendPalette(r4 * 16, 16, a, b); + BlendPalette(palNum * 16, 16, coeff, blendColor); } - r4++; } } @@ -755,8 +748,8 @@ void sub_807D5BC(s8 a) { if (gWeatherPtr->unknown_6C6 == 3) { - sub_807CEBC(0, 32, a); - gWeatherPtr->unknown_6C0 = a; + BlendSomething_807CEBC(0, 32, a); + gWeatherPtr->gammaIndex = a; } } @@ -765,37 +758,37 @@ void sub_807D5F0(u8 a, u8 b, u8 c) if (gWeatherPtr->unknown_6C6 == 3) { gWeatherPtr->unknown_6C6 = 0; - gWeatherPtr->unknown_6C0 = a; - gWeatherPtr->unknown_6C1 = b; - gWeatherPtr->unknown_6C3 = 0; - gWeatherPtr->unknown_6C2 = c; + gWeatherPtr->gammaIndex = a; + gWeatherPtr->gammaTargetIndex = b; + gWeatherPtr->gammaStepFrameCounter = 0; + gWeatherPtr->gammaStepDelay = c; sub_807D5BC(a); } } -void fade_screen(u8 a, u8 delay) +void fade_screen(u8 mode, u8 delay) { u32 fadeColor; - u32 r1; - u32 r2; + bool8 fadeTo; + bool8 useWeatherPal; - switch (a) + switch (mode) { - case 0: + case FADE_FROM_BLACK: fadeColor = 0; - r1 = 0; + fadeTo = FALSE; break; - case 2: + case FADE_FROM_WHITE: fadeColor = 0xFFFF; - r1 = 0; + fadeTo = FALSE; break; - case 1: + case FADE_TO_BLACK: fadeColor = 0; - r1 = 1; + fadeTo = TRUE; break; - case 3: + case FADE_TO_WHITE: fadeColor = 0xFFFF; - r1 = 1; + fadeTo = TRUE; break; default: return; @@ -808,26 +801,26 @@ void fade_screen(u8 a, u8 delay) case WEATHER_RAIN_HEAVY: case WEATHER_SNOW: case WEATHER_FOG_1: - case WEATHER_DARK: + case WEATHER_SHADE: case WEATHER_DROUGHT: - r2 = 1; + useWeatherPal = TRUE; break; default: - r2 = 0; + useWeatherPal = FALSE; break; } - if (r1 != 0) + if (fadeTo) { - if (r2 != 0) + if (useWeatherPal) CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); gWeatherPtr->unknown_6C6 = 2; } else { - gWeatherPtr->unknown_6C4 = fadeColor; - if (r2 != 0) + gWeatherPtr->fadeDestColor = fadeColor; + if (useWeatherPal) gWeatherPtr->unknown_6C7 = 0; else BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); @@ -858,7 +851,7 @@ void sub_807D78C(u8 a) sub_807D540(r4); r4 *= 16; for (i = 0; i < 16; i++) - gPlttBufferFaded[r4 + i] = gWeatherPtr->unknown_6C4; + gPlttBufferFaded[r4 + i] = gWeatherPtr->fadeDestColor; } break; case 2: @@ -869,7 +862,7 @@ void sub_807D78C(u8 a) default: if (gWeatherPtr->currWeather != WEATHER_FOG_1) { - sub_807CEBC(r4, 1, gWeatherPtr->unknown_6C0); + BlendSomething_807CEBC(r4, 1, gWeatherPtr->gammaIndex); } else { @@ -882,7 +875,7 @@ void sub_807D78C(u8 a) void sub_807D874(u8 a) { - sub_807CEBC(a, 1, gWeatherPtr->unknown_6C0); + BlendSomething_807CEBC(a, 1, gWeatherPtr->gammaIndex); } u8 unref_sub_807D894(void) diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c index 5a59d6c2a..154cd2e12 100644 --- a/src/field/field_weather_effects.c +++ b/src/field/field_weather_effects.c @@ -91,8 +91,8 @@ extern void sub_807D5F0(u8 a, u8 b, u8 c); void Clouds_InitVars(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->initStep = 0; if (gWeatherPtr->cloudSpritesCreated == FALSE) @@ -159,8 +159,8 @@ bool8 Clouds_Finish(void) void Weather2_InitVars(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; } void Weather2_InitAll(void) @@ -236,8 +236,8 @@ void Drought_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 0; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 0; } void Drought_Main(void); @@ -368,8 +368,8 @@ void LightRain_InitVars(void) gWeatherPtr->unknown_6DB = 8; gWeatherPtr->unknown_6DC = 0; gWeatherPtr->unknown_6D9 = 10; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; SetRainStrengthFromSoundEffect(SE_T_KOAME); } @@ -885,8 +885,8 @@ void Snow_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6E5 = 16; gWeatherPtr->unknown_6E0 = 0; } @@ -1074,8 +1074,8 @@ void MedRain_InitVars(void) gWeatherPtr->unknown_6DB = 4; gWeatherPtr->unknown_6DC = 0; gWeatherPtr->unknown_6D9 = 16; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->unknown_6ED = 0; SetRainStrengthFromSoundEffect(SE_T_AME); @@ -1102,8 +1102,8 @@ void HeavyRain_InitVars(void) gWeatherPtr->unknown_6DB = 4; gWeatherPtr->unknown_6DC = 1; gWeatherPtr->unknown_6D9 = 24; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment SetRainStrengthFromSoundEffect(SE_T_OOAME); } @@ -1296,8 +1296,8 @@ void Fog1_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; if (gWeatherPtr->fog1SpritesCreated == 0) { gWeatherPtr->unknown_6F0 = 0; @@ -1446,8 +1446,8 @@ void Ash_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6FE = 20; if (!gWeatherPtr->ashSpritesCreated) { @@ -1634,8 +1634,8 @@ void Fog2_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = 0; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6F0 = 0; gWeatherPtr->unknown_6F2 = 1; if (gWeatherPtr->fog2SpritesCreated == 0) @@ -1835,8 +1835,8 @@ void Sandstorm_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = 0; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; if (gWeatherPtr->sandstormSprites1Created == 0) { gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0; @@ -2113,26 +2113,26 @@ void SandstormSpriteCallback3(struct Sprite *sprite) } //------------------------------------------------------------------------------ -// Weather 11 +// Shade //------------------------------------------------------------------------------ -void Weather11_InitVars(void) +void Shade_InitVars(void) { gWeatherPtr->initStep = 0; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; } -void Weather11_InitAll(void) +void Shade_InitAll(void) { - Weather11_InitVars(); + Shade_InitVars(); } -void Weather11_Main(void) +void Shade_Main(void) { } -bool8 Weather11_Finish(void) +bool8 Shade_Finish(void) { return FALSE; } -- cgit v1.2.3 From c9f2902f0ebce0cff90c9a06f9ae05b921b17448 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Fri, 19 Jan 2018 15:48:40 -0600 Subject: dump outline cursors for debug ROM --- src/data/menu_cursor_de.h | 19 +++++++++++++++++++ src/engine/menu_cursor.c | 9 --------- 2 files changed, 19 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/data/menu_cursor_de.h b/src/data/menu_cursor_de.h index cd56f51d9..7be9e96aa 100644 --- a/src/data/menu_cursor_de.h +++ b/src/data/menu_cursor_de.h @@ -1,6 +1,24 @@ #ifndef GUARD_DATA_MENU_CURSOR_H #define GUARD_DATA_MENU_CURSOR_H +#if DEBUG +const u8 OutlineCursorTiles_00[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_00.4bpp"); +const u8 OutlineCursorTiles_01[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_01.4bpp"); +const u8 OutlineCursorTiles_02[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_02.4bpp"); +const u8 OutlineCursorTiles_03[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_03.4bpp"); +const u8 OutlineCursorTiles_04[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_04.4bpp"); +const u8 OutlineCursorTiles_05[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_05.4bpp"); +const u8 OutlineCursorTiles_06[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_06.4bpp"); +const u8 OutlineCursorTiles_07[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_07.4bpp"); +const u8 OutlineCursorTiles_08[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_08.4bpp"); +const u8 OutlineCursorTiles_09[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_09.4bpp"); +const u8 OutlineCursorTiles_10[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_10.4bpp"); +const u8 OutlineCursorTiles_11[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_11.4bpp"); +const u8 OutlineCursorTiles_12[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_12.4bpp"); +const u8 OutlineCursorTiles_13[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_13.4bpp"); +const u8 OutlineCursorTiles_14[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_14.4bpp"); +const u8 OutlineCursorTiles_15[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_15.4bpp"); +#else const u8 OutlineCursorTiles_00[] = INCBIN_U8("graphics/interface/outline_cursor_00.4bpp"); const u8 OutlineCursorTiles_01[] = INCBIN_U8("graphics/interface/outline_cursor_01.4bpp"); const u8 OutlineCursorTiles_02[] = INCBIN_U8("graphics/interface/outline_cursor_02.4bpp"); @@ -17,6 +35,7 @@ const u8 OutlineCursorTiles_12[] = INCBIN_U8("graphics/interface/outline_cursor_ const u8 OutlineCursorTiles_13[] = INCBIN_U8("graphics/interface/outline_cursor_13.4bpp"); const u8 OutlineCursorTiles_14[] = INCBIN_U8("graphics/interface/outline_cursor_14.4bpp"); const u8 OutlineCursorTiles_15[] = INCBIN_U8("graphics/interface/outline_cursor_15.4bpp"); +#endif const struct OamData gOamData_842F11C = { .objMode = ST_OAM_OBJ_NORMAL, diff --git a/src/engine/menu_cursor.c b/src/engine/menu_cursor.c index ae4d5b14a..35116d40b 100644 --- a/src/engine/menu_cursor.c +++ b/src/engine/menu_cursor.c @@ -11,15 +11,6 @@ EWRAM_DATA static u8 gUnknown_0203A3D2 = 0; EWRAM_DATA static u8 gUnknown_0203A3D3 = 0; EWRAM_DATA static u8 gUnknown_0203A3D4 = 0; -#if DEBUG -//const u8 gEmptySpace_08459A8C[0x1C0] = {0}; -//const u8 gEmptySpace_08459A8C[0xE300-0xC700] = {0}; -asm(".section .rodata\n\ - .global gEmptySpace_08459A8C\n\ -gEmptySpace_08459A8C:\n\ - .incbin \"pokeruby_de_debug.gba\", 0x459A8C, 0x1C00"); -#endif - #if ENGLISH #include "../src/data/menu_cursor_en.h" #elif GERMAN -- cgit v1.2.3 From 428f712da678b3f5b9256d85c0e3248cacd8e7c2 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Fri, 19 Jan 2018 21:30:16 -0800 Subject: Further document weather --- src/battle/battle_util.c | 6 +- src/field/decoration.c | 6 +- src/field/field_control_avatar.c | 7 +- src/field/field_effect.c | 6 +- src/field/field_weather.c | 486 ++++++++++++++++++++------------------ src/field/field_weather_effects.c | 12 +- src/field/overworld.c | 6 +- src/scene/cable_car.c | 2 +- 8 files changed, 283 insertions(+), 248 deletions(-) (limited to 'src') diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c index f93664593..87b6952ff 100644 --- a/src/battle/battle_util.c +++ b/src/battle/battle_util.c @@ -4,6 +4,7 @@ #include "data2.h" #include "event_data.h" #include "ewram.h" +#include "field_weather.h" #include "item.h" #include "link.h" #include "pokemon.h" @@ -85,7 +86,6 @@ u8 CountTrailingZeroBits(u32 a); u8 GetMoveTarget(u16 move, u8 useMoveTarget); u8 sub_803FC34(u8 bank); u16 sub_803FBFC(u8 a); -u8 weather_get_current(void); void RecordAbilityBattle(u8 bank, u8 ability); void RecordItemBattle(u8 bank, u8 holdEffect); s8 GetPokeFlavourRelation(u32 pid, u8 flavor); @@ -1747,7 +1747,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) { case 0xFF: //weather from overworld //_08018586 - switch (weather_get_current()) + switch (GetCurrentWeather()) { case WEATHER_RAIN_LIGHT: case WEATHER_RAIN_MED: @@ -1781,7 +1781,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } if (effect) { - gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current(); + gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); } break; diff --git a/src/field/decoration.c b/src/field/decoration.c index e1604cfa1..1cc3bbe06 100644 --- a/src/field/decoration.c +++ b/src/field/decoration.c @@ -2289,7 +2289,7 @@ void sub_80FF6AC(u8 taskId) gTasks[taskId].data[2] = 2; break; case 2: - if (sub_807D770() == 1) + if (sub_807D770() == TRUE) { gTasks[taskId].data[12] = 0; sub_810065C(taskId); @@ -3222,7 +3222,7 @@ void c1_overworld_prev_quest(u8 taskId) void sub_8100334(u8 taskId) { - if (sub_807D770() == 1) + if (sub_807D770() == TRUE) { gTasks[taskId].func = sub_80FE948; } @@ -3735,7 +3735,7 @@ void sub_8100C88(u8 taskId) gTasks[taskId].data[2] = 3; break; case 3: - if (sub_807D770() == 1) + if (sub_807D770() == TRUE) { gTasks[taskId].data[13] = -1; DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c index c156df035..bf96c724f 100644 --- a/src/field/field_control_avatar.c +++ b/src/field/field_control_avatar.c @@ -767,20 +767,19 @@ static u8 *trigger_activate(struct CoordEvent *coordEvent) return NULL; } -static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 d) +static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) { s32 i; struct CoordEvent *coordEvents = mapHeader->events->coordEvents; u8 coordEventCount = mapHeader->events->coordEventCount; - u8 *script; for (i = 0; i < coordEventCount; i++) { if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y) { - if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0) + if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0) { - script = trigger_activate(&coordEvents[i]); + u8 *script = trigger_activate(&coordEvents[i]); if (script != NULL) return script; } diff --git a/src/field/field_effect.c b/src/field/field_effect.c index 5ff89574b..a3134552d 100644 --- a/src/field/field_effect.c +++ b/src/field/field_effect.c @@ -543,7 +543,7 @@ u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) LoadCompressedObjectPalette(&gMonPaletteTable[species]); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; - sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); + PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); } @@ -556,13 +556,13 @@ u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subprio LoadCompressedObjectPalette(spritePalette); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = spritePalette->tag; - sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); } void FreeResourcesAndDestroySprite(struct Sprite *sprite) { - sub_807DE68(); + ResetPreservedPalettesInWeather(); FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); if (sprite->oam.affineMode != 0) { diff --git a/src/field/field_weather.c b/src/field/field_weather.c index 5f3f93096..2a5c311ab 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -15,6 +15,12 @@ #define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) +enum { + GAMMA_NONE, + GAMMA_NORMAL, + GAMMA_ALT, +}; + struct RGBColor { u16 r:5; @@ -24,7 +30,7 @@ struct RGBColor struct WeatherPaletteData { - u16 data[0][0x1000]; // unknown length + u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes. }; struct WeatherCallbacks @@ -36,10 +42,10 @@ struct WeatherCallbacks }; EWRAM_DATA struct Weather gWeather = {0}; -EWRAM_DATA u8 gUnknown_0202FF38[32] = {0}; +EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0}; EWRAM_DATA u16 gUnknown_0202FF58 = {0}; -static const u8 *gUnknown_030006DC; +static const u8 *sPaletteGammaTypes; const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz"); const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz"); @@ -56,7 +62,7 @@ static const u8 *const sCompressedDroughtPalettes[] = DroughtPaletteData_3, DroughtPaletteData_4, DroughtPaletteData_5, - gSharedMem, + (u8*)eDroughtPaletteData.gammaShiftColors, }; // This is a pointer to gWeather. All code in this file accesses gWeather directly, @@ -65,6 +71,10 @@ static const u8 *const sCompressedDroughtPalettes[] = // this file produces the same result as accessing gWeather directly. struct Weather *const gWeatherPtr = &gWeather; +static bool8 sub_807D574(u8); +static void DroughtBlendSomething_807D304(s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void BuildGammaShiftTables(void); +static void UpdateGammaShift(void); void None_Init(void); void None_Main(void); bool8 None_Finish(void); @@ -130,7 +140,7 @@ static const struct WeatherCallbacks sWeatherFuncs[] = {None_Init, None_Main, None_Init, None_Finish}, {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish}, {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish}, - {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain + {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish}, {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish}, {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, @@ -146,46 +156,50 @@ static const struct WeatherCallbacks sWeatherFuncs[] = void (*const gUnknown_083970B8[])(void) = { - sub_807CC24, + UpdateGammaShift, sub_807CCAC, nullsub_39, nullsub_39, }; -const u8 gUnknown_083970C8[32] = +// This table specifies which of the gamma shift tables should be +// applied to each of the background and sprite palettes. +static const u8 sBasePaletteGammaTypes[32] = { - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 2, - 1, - 2, - 2, - 2, - 2, - 1, - 1, - 1, - 1, - 2, - 1, - 1, - 1, - 1, - 1, + // background palettes + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NONE, + GAMMA_NONE, + // sprite palettes + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, }; const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); @@ -198,8 +212,8 @@ void StartWeather(void) { index = AllocSpritePalette(0x1200); CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); - sub_807CB10(); - gWeatherPtr->unknown_6D5 = index; + BuildGammaShiftTables(); + gWeatherPtr->altGammaSpritePalIndex = index; gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201); gWeatherPtr->rainSpriteCount = 0; gWeatherPtr->unknown_6D8 = 0; @@ -221,33 +235,35 @@ void StartWeather(void) } } -void DoWeatherEffect(u8 effect) +void ChangeWeather(u8 weather) { - if (effect != WEATHER_RAIN_LIGHT && effect != WEATHER_RAIN_MED && effect != WEATHER_RAIN_HEAVY) + if (weather != WEATHER_RAIN_LIGHT && weather != WEATHER_RAIN_MED && weather != WEATHER_RAIN_HEAVY) { PlayRainSoundEffect(); } - if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect) + + if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather) { - sWeatherFuncs[effect].initVars(); + sWeatherFuncs[weather].initVars(); } + gWeatherPtr->unknown_6D3 = 0; - gWeatherPtr->nextWeather = effect; + gWeatherPtr->nextWeather = weather; gWeatherPtr->finishStep = 0; } -void sub_807C988(u8 effect) +void sub_807C988(u8 weather) { PlayRainSoundEffect(); - gWeatherPtr->currWeather = effect; - gWeatherPtr->nextWeather = effect; + gWeatherPtr->currWeather = weather; + gWeatherPtr->nextWeather = weather; } -void sub_807C9B4(u8 effect) +void sub_807C9B4(u8 weather) { PlayRainSoundEffect(); - gWeatherPtr->currWeather = effect; - gWeatherPtr->nextWeather = effect; + gWeatherPtr->currWeather = weather; + gWeatherPtr->nextWeather = weather; gWeatherPtr->unknown_6C8 = 1; } @@ -295,7 +311,10 @@ u8 None_Finish(void) return 0; } -void sub_807CB10(void) +// Builds two tables that contain gamma shifts for palette colors. +// It's unclear why the two tables aren't declared as const arrays, since +// this function always builds the same two tables. +static void BuildGammaShiftTables(void) { u16 v0; u8 (*v1)[32]; @@ -308,13 +327,13 @@ void sub_807CB10(void) u16 v11; s16 dunno; - gUnknown_030006DC = gUnknown_083970C8; + sPaletteGammaTypes = sBasePaletteGammaTypes; for (v0 = 0; v0 <= 1; v0++) { if (v0 == 0) - v1 = gWeatherPtr->unknown_200; + v1 = gWeatherPtr->gammaShifts; else - v1 = gWeatherPtr->unk460; + v1 = gWeatherPtr->altGammaShifts; for (v2 = 0; v2 < 32; v2++) { @@ -362,7 +381,9 @@ void sub_807CB10(void) } } -void sub_807CC24(void) +// When the weather is changing, it gradually updates the palettes +// towards the desired gamma shift. +static void UpdateGammaShift(void) { if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) { @@ -377,7 +398,7 @@ void sub_807CC24(void) gWeatherPtr->gammaIndex++; else gWeatherPtr->gammaIndex--; - BlendSomething_807CEBC(0, 0x20, gWeatherPtr->gammaIndex); + BlendSomething_807CEBC(0, 32, gWeatherPtr->gammaIndex); } } } @@ -433,11 +454,11 @@ u8 RainSnowShadeBlend_807CDC4(void) return 0; if (++gWeatherPtr->unknown_6C7 >= 0x10) { - BlendSomething_807CEBC(0, 0x20, 3); + BlendSomething_807CEBC(0, 32, 3); gWeatherPtr->unknown_6C7 = 0x10; return 0; } - BlendSomething_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); + BlendSomething_807D1BC(0, 32, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); return 1; } @@ -447,11 +468,11 @@ u8 DroughtBlend_807CE24(void) return 0; if (++gWeatherPtr->unknown_6C7 >= 0x10) { - BlendSomething_807CEBC(0, 0x20, -6); + BlendSomething_807CEBC(0, 32, -6); gWeatherPtr->unknown_6C7 = 0x10; return 0; } - BlendSomething_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); + DroughtBlendSomething_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); return 1; } @@ -468,23 +489,26 @@ void nullsub_39(void) { } -void BlendSomething_807CEBC(u8 a, u8 b, s8 c) +void BlendSomething_807CEBC(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) { - u16 r4; + u16 curPalIndex; u16 palOffset; - u8 *r6; + u8 *gammaTable; u16 i; - if (c > 0) + if (gammaIndex > 0) { - c = c - 1; - palOffset = a * 16; - b += a; - r4 = a; - while (r4 < b) + gammaIndex--; + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + curPalIndex = startPalIndex; + + // Loop through the speficied palette range and apply necessary gamma shifts to the colors. + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { + // No palette change. CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); palOffset += 16; } @@ -492,25 +516,27 @@ void BlendSomething_807CEBC(u8 a, u8 b, s8 c) { u8 r, g, b; - if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeatherPtr->unknown_6D5) - r6 = gWeatherPtr->unk460[c]; + if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex) + gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; else - r6 = gWeatherPtr->unknown_200[c]; - if (r4 == 16 || r4 > 0x1B) + gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; + + if (curPalIndex == 16 || curPalIndex > 27) { for (i = 0; i < 16; i++) { - if (gPlttBufferUnfaded[palOffset] == 0x2D9F) + if (gPlttBufferUnfaded[palOffset] == RGB(31, 12, 11)) { + // Skip gamma shift for this specific color. (Why?) palOffset++; } else { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - - r = r6[color.r]; - g = r6[color.g]; - b = r6[color.b]; + // Apply gamma shift to the original color. + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r = gammaTable[baseColor.r]; + g = gammaTable[baseColor.g]; + b = gammaTable[baseColor.b]; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } @@ -519,39 +545,45 @@ void BlendSomething_807CEBC(u8 a, u8 b, s8 c) { for (i = 0; i < 16; i++) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - - r = r6[color.r]; - g = r6[color.g]; - b = r6[color.b]; + // Apply gamma shift to the original color. + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r = gammaTable[baseColor.r]; + g = gammaTable[baseColor.g]; + b = gammaTable[baseColor.b]; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } } - r4++; + + curPalIndex++; } } - else if (c < 0) + else if (gammaIndex < 0) { - c = -c - 1; - palOffset = a * 16; - b += a; - r4 = a; - while (r4 < b) + // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables. + gammaIndex = -gammaIndex - 1; + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + curPalIndex = startPalIndex; + + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { + // No palette change. CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); palOffset += 16; } else { - if (r4 == 16 || r4 > 0x1B) + if (curPalIndex == 16 || curPalIndex > 27) { for (i = 0; i < 16; i++) { - if (gPlttBufferUnfaded[palOffset] != 0x2D9F) - gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])]; + // Skip gamma shift for this specific color. (Why?) + if (gPlttBufferUnfaded[palOffset] != RGB(31, 12, 11)) + gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; + palOffset++; } } @@ -559,93 +591,100 @@ void BlendSomething_807CEBC(u8 a, u8 b, s8 c) { for (i = 0; i < 16; i++) { - gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])]; + gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; palOffset++; } } } - r4++; + + curPalIndex++; } } else { - CpuFastCopy(gPlttBufferUnfaded + a * 16, gPlttBufferFaded + a * 16, b * 16 * sizeof(u16)); + // No palette blending. + CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); } } -void BlendSomething_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e) +void BlendSomething_807D1BC(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) { u16 palOffset; - u16 r4; + u16 curPalIndex; u16 i; - struct RGBColor color = *(struct RGBColor *)&e; - u8 r_ = color.r; - u8 g_ = color.g; - u8 b_ = color.b; - - palOffset = a1 * 16; - a2 += a1; - c = c - 1; - r4 = a1; - while (r4 < a2) + struct RGBColor color = *(struct RGBColor *)&blendColor; + u8 rBlend = color.r; + u8 gBlend = color.g; + u8 bBlend = color.b; + + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + gammaIndex--; + curPalIndex = startPalIndex; + + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { - BlendPalette(palOffset, 16, d, e); + // No gamma shift. Simply blend the colors. + BlendPalette(palOffset, 16, blendCoeff, blendColor); palOffset += 16; } else { - u8 *r5; + u8 *gammaTable; - if (gUnknown_030006DC[r4] == 1) - r5 = gWeatherPtr->unknown_200[c]; + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL) + gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; else - r5 = gWeatherPtr->unk460[c]; + gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; for (i = 0; i < 16; i++) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - u8 r = r5[color.r]; - u8 g = r5[color.g]; - u8 b = r5[color.b]; - - r += ((r_ - r) * d) >> 4; - g += ((g_ - g) * d) >> 4; - b += ((b_ - b) * d) >> 4; + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + u8 r = gammaTable[baseColor.r]; + u8 g = gammaTable[baseColor.g]; + u8 b = gammaTable[baseColor.b]; + + // Apply gamma shift and target blend color to the original color. + r += ((rBlend - r) * blendCoeff) >> 4; + g += ((gBlend - g) * blendCoeff) >> 4; + b += ((bBlend - b) * blendCoeff) >> 4; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } - r4++; + + curPalIndex++; } } -void BlendSomething_807D304(s8 a, u8 coeff, u16 c) +void DroughtBlendSomething_807D304(s8 gammaIndex, u8 blendCoeff, u16 blendColor) { struct RGBColor color; - u8 r_; - u8 g_; - u8 b_; - u16 r4; + u8 rBlend; + u8 gBlend; + u8 bBlend; + u16 curPalIndex; u16 palOffset; - u16 r12; + u16 i; - a = -a - 1; - color = *(struct RGBColor *)&c; - r_ = color.r; - g_ = color.g; - b_ = color.b; + gammaIndex = -gammaIndex - 1; + color = *(struct RGBColor *)&blendColor; + rBlend = color.r; + gBlend = color.g; + bBlend = color.b; palOffset = 0; - for (r4 = 0; r4 < 32; r4++) + for (curPalIndex = 0; curPalIndex < 32; curPalIndex++) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { - BlendPalette(palOffset, 16, coeff, c); + // No gamma shift. Simply blend the colors. + BlendPalette(palOffset, 16, blendCoeff, blendColor); palOffset += 16; } else { - for (r12 = 0; r12 < 16; r12++) + for (i = 0; i < 16; i++) { u32 offset; struct RGBColor color1; @@ -659,14 +698,14 @@ void BlendSomething_807D304(s8 a, u8 coeff, u16 c) b1 = color1.b; offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1); - color2 = *(struct RGBColor *)&eWeatherPaletteData.data[a][offset]; + color2 = *(struct RGBColor *)&eDroughtPaletteData.gammaShiftColors[gammaIndex][offset]; r2 = color2.r; g2 = color2.g; b2 = color2.b; - r2 += ((r_ - r2) * coeff) >> 4; - g2 += ((g_ - g2) * coeff) >> 4; - b2 += ((b_ - b2) * coeff) >> 4; + r2 += ((rBlend - r2) * blendCoeff) >> 4; + g2 += ((gBlend - g2) * blendCoeff) >> 4; + b2 += ((bBlend - b2) * blendCoeff) >> 4; gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2; } @@ -674,28 +713,26 @@ void BlendSomething_807D304(s8 a, u8 coeff, u16 c) } } -bool8 sub_807D574(u8); - -void BlendSomething_807D424(u8 coeff, u16 blendColor) +void BlendSomething_807D424(u8 blendCoeff, u16 blendColor) { struct RGBColor color; - u8 blendR; - u8 blendG; - u8 blendB; - u16 palNum; + u8 rBlend; + u8 gBlend; + u8 bBlend; + u16 curPalIndex; - BlendPalette(0, 0x100, coeff, blendColor); + BlendPalette(0, 0x100, blendCoeff, blendColor); color = *(struct RGBColor *)&blendColor; - blendR = color.r; - blendG = color.g; - blendB = color.b; + rBlend = color.r; + gBlend = color.g; + bBlend = color.b; - for (palNum = 16; palNum < 32; palNum++) + for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) { - if (sub_807D574(palNum)) + if (sub_807D574(curPalIndex)) { - u16 palEnd = (palNum + 1) * 16; - u16 palOffset = palNum * 16; + u16 palEnd = (curPalIndex + 1) * 16; + u16 palOffset = curPalIndex * 16; while (palOffset < palEnd) { @@ -708,9 +745,9 @@ void BlendSomething_807D424(u8 coeff, u16 blendColor) g += ((31 - g) * 3) >> 2; b += ((28 - b) * 3) >> 2; - r += ((blendR - r) * coeff) >> 4; - g += ((blendG - g) * coeff) >> 4; - b += ((blendB - b) * coeff) >> 4; + r += ((rBlend - r) * blendCoeff) >> 4; + g += ((gBlend - g) * blendCoeff) >> 4; + b += ((bBlend - b) * blendCoeff) >> 4; gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; palOffset++; @@ -718,51 +755,52 @@ void BlendSomething_807D424(u8 coeff, u16 blendColor) } else { - BlendPalette(palNum * 16, 16, coeff, blendColor); + BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor); } } } -void sub_807D540(u8 a) +void sub_807D540(u8 paletteIndex) { if (gWeatherPtr->unknown_6FA < 6) { - gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = a; + gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = paletteIndex; gWeatherPtr->unknown_6FA++; } } -bool8 sub_807D574(u8 a) +bool8 sub_807D574(u8 paletteIndex) { u16 i; for (i = 0; i < gWeatherPtr->unknown_6FA; i++) { - if (gWeatherPtr->unknown_6F4[i] == a) + if (gWeatherPtr->unknown_6F4[i] == paletteIndex) return TRUE; } + return FALSE; } -void sub_807D5BC(s8 a) +void sub_807D5BC(s8 gammaIndex) { if (gWeatherPtr->unknown_6C6 == 3) { - BlendSomething_807CEBC(0, 32, a); - gWeatherPtr->gammaIndex = a; + BlendSomething_807CEBC(0, 32, gammaIndex); + gWeatherPtr->gammaIndex = gammaIndex; } } -void sub_807D5F0(u8 a, u8 b, u8 c) +void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) { if (gWeatherPtr->unknown_6C6 == 3) { gWeatherPtr->unknown_6C6 = 0; - gWeatherPtr->gammaIndex = a; - gWeatherPtr->gammaTargetIndex = b; + gWeatherPtr->gammaIndex = gammaIndex; + gWeatherPtr->gammaTargetIndex = gammaTargetIndex; gWeatherPtr->gammaStepFrameCounter = 0; - gWeatherPtr->gammaStepDelay = c; - sub_807D5BC(a); + gWeatherPtr->gammaStepDelay = gammaStepDelay; + sub_807D5BC(gammaIndex); } } @@ -837,9 +875,9 @@ bool8 sub_807D770(void) return (gWeatherPtr->unknown_6C6 != 1); } -void sub_807D78C(u8 a) +void sub_807D78C(u8 spritePaletteIndex) { - u16 r4 = 16 + a; + u16 paletteIndex = 16 + spritePaletteIndex; u16 i; switch (gWeatherPtr->unknown_6C6) @@ -848,34 +886,34 @@ void sub_807D78C(u8 a) if (gWeatherPtr->unknown_6CA != 0) { if (gWeatherPtr->currWeather == WEATHER_FOG_1) - sub_807D540(r4); - r4 *= 16; + sub_807D540(paletteIndex); + paletteIndex *= 16; for (i = 0; i < 16; i++) - gPlttBufferFaded[r4 + i] = gWeatherPtr->fadeDestColor; + gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; } break; case 2: - r4 *= 16; - CpuFastCopy(gPlttBufferFaded + r4, gPlttBufferUnfaded + r4, 32); - BlendPalette(r4, 16, gPaletteFade.y, gPaletteFade.blendColor); + paletteIndex *= 16; + CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32); + BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); break; default: if (gWeatherPtr->currWeather != WEATHER_FOG_1) { - BlendSomething_807CEBC(r4, 1, gWeatherPtr->gammaIndex); + BlendSomething_807CEBC(paletteIndex, 1, gWeatherPtr->gammaIndex); } else { - r4 *= 16; - BlendPalette(r4, 16, 12, 0x73FC); + paletteIndex *= 16; + BlendPalette(paletteIndex, 16, 12, 0x73FC); } break; } } -void sub_807D874(u8 a) +void sub_807D874(u8 paletteIndex) { - BlendSomething_807CEBC(a, 1, gWeatherPtr->gammaIndex); + BlendSomething_807CEBC(paletteIndex, 1, gWeatherPtr->gammaIndex); } u8 unref_sub_807D894(void) @@ -892,54 +930,54 @@ void sub_807D8C0(const u16 *palette) sub_807D78C(gWeatherPtr->unknown_6D4); } -void sub_807D8F0(u8 *a, u8 *b) +static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b) { - u8 r4 = *a; + u8 gammaIndex = *gammaIndexPtr; u16 i; - if (r4 < 7) + if (gammaIndex < 7) { - r4--; - LZ77UnCompWram(sCompressedDroughtPalettes[r4], eWeatherPaletteData.data[r4]); - if (r4 == 0) + gammaIndex--; + LZ77UnCompWram(sCompressedDroughtPalettes[gammaIndex], eDroughtPaletteData.gammaShiftColors[gammaIndex]); + if (gammaIndex == 0) { - eWeatherPaletteData.data[r4][0] = 0x421; + eDroughtPaletteData.gammaShiftColors[gammaIndex][0] = RGB(1, 1, 1); for (i = 1; i < 0x1000; i++) - eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4][i - 1]; + eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex][i - 1]; } else { for (i = 0; i < 0x1000; i++) - eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4 - 1][i]; + eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex - 1][i]; } - if (++(*a) == 7) + if (++(*gammaIndexPtr) == 7) { - *a = 32; + *gammaIndexPtr = 32; *b = 32; } } } -void sub_807D9A8(void) +void ResetDroughtWeatherPaletteLoading(void) { - gWeatherPtr->unknown_74D = 1; - gWeatherPtr->unknown_74E = 1; + gWeatherPtr->loadDroughtPalsIndex = 1; + gWeatherPtr->loadDroughtPalsOffset = 1; } -bool8 sub_807D9C8(void) +bool8 LoadDroughtWeatherPalettes(void) { - if (gWeatherPtr->unknown_74D < 32) + if (gWeatherPtr->loadDroughtPalsIndex < 32) { - sub_807D8F0(&gWeatherPtr->unknown_74D, &gWeatherPtr->unknown_74E); - if (gWeatherPtr->unknown_74D < 32) + LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset); + if (gWeatherPtr->loadDroughtPalsIndex < 32) return TRUE; } return FALSE; } -void sub_807DA04(s8 a) +void sub_807DA04(s8 gammaIndex) { - sub_807D5BC(-a - 1); + sub_807D5BC(-gammaIndex - 1); } void sub_807DA14(void) @@ -1001,8 +1039,8 @@ void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay) gWeatherPtr->targetBlendEVA = eva; gWeatherPtr->targetBlendEVB = evb; gWeatherPtr->blendDelay = delay; - gWeatherPtr->unknown_739 = 0; - gWeatherPtr->unknown_738 = 0; + gWeatherPtr->blendFrameCounter = 0; + gWeatherPtr->blendUpdateCounter = 0; } bool8 Weather_UpdateBlend(void) @@ -1011,13 +1049,13 @@ bool8 Weather_UpdateBlend(void) && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) return TRUE; - if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay) + if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay) { - gWeatherPtr->unknown_739 = 0; - gWeatherPtr->unknown_738++; + gWeatherPtr->blendFrameCounter = 0; + gWeatherPtr->blendUpdateCounter++; // Update currBlendEVA and currBlendEVB on alternate frames - if (gWeatherPtr->unknown_738 & 1) + if (gWeatherPtr->blendUpdateCounter & 1) { if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA) gWeatherPtr->currBlendEVA++; @@ -1079,7 +1117,7 @@ void unref_sub_807DCB4(u8 a) } } -u8 weather_get_current(void) +u8 GetCurrentWeather(void) { return gWeatherPtr->currWeather; } @@ -1141,14 +1179,14 @@ void unref_sub_807DE24(void) gWeatherPtr->unknown_6C6 = 3; } -void sub_807DE38(u8 a) +void PreservePaletteInWeather(u8 preservedPalIndex) { - CpuCopy16(gUnknown_083970C8, gUnknown_0202FF38, 32); - gUnknown_0202FF38[a] = 0; - gUnknown_030006DC = gUnknown_0202FF38; + CpuCopy16(sBasePaletteGammaTypes, gFieldEffectPaletteGammaTypes, 32); + gFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE; + sPaletteGammaTypes = gFieldEffectPaletteGammaTypes; } -void sub_807DE68(void) +void ResetPreservedPalettesInWeather(void) { - gUnknown_030006DC = gUnknown_083970C8; + sPaletteGammaTypes = sBasePaletteGammaTypes; } diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c index 4ffa171e8..0fee26b89 100644 --- a/src/field/field_weather_effects.c +++ b/src/field/field_weather_effects.c @@ -74,10 +74,8 @@ static const struct SpriteTemplate sCloudSpriteTemplate = .callback = sub_807E0F4, }; -extern void sub_807D5BC(s8 a); +extern void sub_807D5BC(s8 gammaIndex); extern void sub_807D8C0(const u16 *palette); -extern void sub_807D9A8(void); -extern bool8 sub_807D9C8(void); extern void sub_807DA14(void); extern void sub_807DA4C(void); extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c); @@ -258,11 +256,11 @@ void Drought_Main(void) gWeatherPtr->initStep++; break; case 1: - sub_807D9A8(); + ResetDroughtWeatherPaletteLoading(); gWeatherPtr->initStep++; break; case 2: - if (sub_807D9C8() == FALSE) + if (LoadDroughtWeatherPalettes() == FALSE) gWeatherPtr->initStep++; break; case 3: @@ -2322,7 +2320,7 @@ void SetSav1WeatherFromCurrMapHeader(void) void SetWeather(u32 weather) { SetSav1Weather(weather); - DoWeatherEffect(GetSav1Weather()); + ChangeWeather(GetSav1Weather()); } void SetWeather_Unused(u32 weather) @@ -2333,7 +2331,7 @@ void SetWeather_Unused(u32 weather) void DoCurrentWeather(void) { - DoWeatherEffect(GetSav1Weather()); + ChangeWeather(GetSav1Weather()); } void sub_8080750(void) diff --git a/src/field/overworld.c b/src/field/overworld.c index a6d34e103..fc313693a 100644 --- a/src/field/overworld.c +++ b/src/field/overworld.c @@ -590,7 +590,7 @@ bool8 sub_80538D0(u16 x, u16 y) void sub_80538F0(u8 mapGroup, u8 mapNum) { - s32 i; + s32 paletteIndex; Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1); sub_8053F0C(); @@ -611,8 +611,8 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) sub_8056D38(gMapHeader.mapData); apply_map_tileset2_palette(gMapHeader.mapData); - for (i = 6; i < 12; i++) - sub_807D874(i); + for (paletteIndex = 6; paletteIndex < 12; paletteIndex++) + sub_807D874(paletteIndex); sub_8072ED0(); UpdateLocationHistoryForRoamer(); diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index d8e099130..8b4a1bb28 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -357,7 +357,7 @@ static void sub_8123878(u8 taskId) case 0: if (sCableCarPtr->unk_0006 == sCableCarPtr->unk_0004) { - DoWeatherEffect(sCableCarPtr->unk_0002); + ChangeWeather(sCableCarPtr->unk_0002); sCableCarPtr->unk_0001 = 1; } break; -- cgit v1.2.3 From 7383117626ebb2b3d993e5ad8855da5752c9cce8 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sat, 20 Jan 2018 14:36:32 -0600 Subject: turns out graphics are the same. I forgot to run 'make clean' :( --- src/data/menu_cursor_de.h | 19 ------------------- 1 file changed, 19 deletions(-) (limited to 'src') diff --git a/src/data/menu_cursor_de.h b/src/data/menu_cursor_de.h index 7be9e96aa..cd56f51d9 100644 --- a/src/data/menu_cursor_de.h +++ b/src/data/menu_cursor_de.h @@ -1,24 +1,6 @@ #ifndef GUARD_DATA_MENU_CURSOR_H #define GUARD_DATA_MENU_CURSOR_H -#if DEBUG -const u8 OutlineCursorTiles_00[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_00.4bpp"); -const u8 OutlineCursorTiles_01[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_01.4bpp"); -const u8 OutlineCursorTiles_02[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_02.4bpp"); -const u8 OutlineCursorTiles_03[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_03.4bpp"); -const u8 OutlineCursorTiles_04[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_04.4bpp"); -const u8 OutlineCursorTiles_05[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_05.4bpp"); -const u8 OutlineCursorTiles_06[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_06.4bpp"); -const u8 OutlineCursorTiles_07[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_07.4bpp"); -const u8 OutlineCursorTiles_08[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_08.4bpp"); -const u8 OutlineCursorTiles_09[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_09.4bpp"); -const u8 OutlineCursorTiles_10[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_10.4bpp"); -const u8 OutlineCursorTiles_11[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_11.4bpp"); -const u8 OutlineCursorTiles_12[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_12.4bpp"); -const u8 OutlineCursorTiles_13[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_13.4bpp"); -const u8 OutlineCursorTiles_14[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_14.4bpp"); -const u8 OutlineCursorTiles_15[] = INCBIN_U8("graphics/interface/outline_cursor_debug/outline_cursor_15.4bpp"); -#else const u8 OutlineCursorTiles_00[] = INCBIN_U8("graphics/interface/outline_cursor_00.4bpp"); const u8 OutlineCursorTiles_01[] = INCBIN_U8("graphics/interface/outline_cursor_01.4bpp"); const u8 OutlineCursorTiles_02[] = INCBIN_U8("graphics/interface/outline_cursor_02.4bpp"); @@ -35,7 +17,6 @@ const u8 OutlineCursorTiles_12[] = INCBIN_U8("graphics/interface/outline_cursor_ const u8 OutlineCursorTiles_13[] = INCBIN_U8("graphics/interface/outline_cursor_13.4bpp"); const u8 OutlineCursorTiles_14[] = INCBIN_U8("graphics/interface/outline_cursor_14.4bpp"); const u8 OutlineCursorTiles_15[] = INCBIN_U8("graphics/interface/outline_cursor_15.4bpp"); -#endif const struct OamData gOamData_842F11C = { .objMode = ST_OAM_OBJ_NORMAL, -- cgit v1.2.3 From 003ed9293b2c51f0481ed31f0e0459cbecbf757e Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sat, 20 Jan 2018 14:17:03 -0800 Subject: More documentation of field_weather --- src/battle/battle_transition.c | 4 +- src/engine/cable_club.c | 4 +- src/engine/time_events.c | 2 +- src/field/choose_party.c | 2 +- src/field/decoration.c | 20 +-- src/field/field_effect.c | 12 +- src/field/field_effect_helpers.c | 4 +- src/field/field_fadetransition.c | 14 +-- src/field/field_weather.c | 259 +++++++++++++++++++++----------------- src/field/field_weather_effects.c | 11 +- src/field/item_menu.c | 4 +- src/field/item_use.c | 2 +- src/field/overworld.c | 2 +- src/field/player_pc.c | 12 +- src/field/scrcmd.c | 4 +- src/field/secret_base.c | 8 +- src/field/shop.c | 6 +- src/field/start_menu.c | 2 +- src/pokemon/pokemon_menu.c | 2 +- src/scene/cable_car.c | 7 +- 20 files changed, 202 insertions(+), 179 deletions(-) (limited to 'src') diff --git a/src/battle/battle_transition.c b/src/battle/battle_transition.c index f7cdc0694..a94974b27 100644 --- a/src/battle/battle_transition.c +++ b/src/battle/battle_transition.c @@ -6,6 +6,7 @@ #include "palette.h" #include "trig.h" #include "field_effect.h" +#include "field_weather.h" #include "random.h" #include "sprite.h" #include "sound.h" @@ -15,7 +16,6 @@ #include "ewram.h" #include "scanline_effect.h" -void sub_807DE10(void); void ScanlineEffect_Clear(void); extern const struct OamData gFieldOamData_32x32; @@ -567,7 +567,7 @@ static void Task_BattleTransitionMain(u8 taskID) static bool8 Transition_Phase1(struct Task* task) { - sub_807DE10(); + SetWeatherScreenFadeOut(); CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); if (sPhase1_Tasks[task->tTransitionID] != NULL) { diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index 44d832e2b..e7c504c7b 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -676,7 +676,7 @@ static void sub_808382C(u8 taskId) switch (task->data[0]) { case 0: - fade_screen(1, 0); + FadeScreen(1, 0); gLinkType = 0x2211; ClearLinkCallback_2(); task->data[0]++; @@ -812,7 +812,7 @@ static void sub_8083AAC(u8 taskId) { case 0: ScriptContext2_Enable(); - fade_screen(1, 0); + FadeScreen(1, 0); ClearLinkCallback_2(); task->data[0]++; break; diff --git a/src/engine/time_events.c b/src/engine/time_events.c index 3e3054aa3..4bd732788 100644 --- a/src/engine/time_events.c +++ b/src/engine/time_events.c @@ -93,7 +93,7 @@ void UpdateShoalTideFlag(void) static void Task_WaitWeather(u8 taskId) { - if (sub_807DDFC()) + if (IsWeatherChangeComplete()) { EnableBothScriptContexts(); DestroyTask(taskId); diff --git a/src/field/choose_party.c b/src/field/choose_party.c index 3ba04e489..18d26f007 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -930,7 +930,7 @@ void sub_81231AC(void) static void sub_81231C4(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { DestroyTask(taskId); ScriptContext2_Disable(); diff --git a/src/field/decoration.c b/src/field/decoration.c index 1cc3bbe06..0e7fa5f41 100644 --- a/src/field/decoration.c +++ b/src/field/decoration.c @@ -2239,7 +2239,7 @@ void sub_80FF5BC(u8 taskId) { if (sub_80FF58C() == TRUE) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_80FF6AC; } else @@ -2289,7 +2289,7 @@ void sub_80FF6AC(u8 taskId) gTasks[taskId].data[2] = 2; break; case 2: - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].data[12] = 0; sub_810065C(taskId); @@ -3193,7 +3193,7 @@ void sub_810026C(u8 taskId) void sub_810028C(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = c1_overworld_prev_quest; } @@ -3222,7 +3222,7 @@ void c1_overworld_prev_quest(u8 taskId) void sub_8100334(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].func = sub_80FE948; } @@ -3629,7 +3629,7 @@ void sub_8100A0C(u8 taskId) { if (sub_8100D38(taskId) == 1) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_8100E70; } else @@ -3735,7 +3735,7 @@ void sub_8100C88(u8 taskId) gTasks[taskId].data[2] = 3; break; case 3: - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].data[13] = -1; DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); @@ -3800,7 +3800,7 @@ void sub_8100E70(u8 taskId) data[2] = 2; break; case 2: - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { data[12] = 1; sub_8100EEC(taskId); @@ -4138,7 +4138,7 @@ void sub_8101518(u8 taskId) void sub_810153C(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_8100C88; } @@ -4157,7 +4157,7 @@ void sub_8101590(u8 taskId) void sub_81015B0(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_81015E0; } @@ -4184,7 +4184,7 @@ void sub_81015E0(u8 taskId) void sub_8101648(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].func = Task_DecorationPCProcessMenuInput; } diff --git a/src/field/field_effect.c b/src/field/field_effect.c index a3134552d..ad570cf7f 100644 --- a/src/field/field_effect.c +++ b/src/field/field_effect.c @@ -407,7 +407,7 @@ void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); LoadSpritePalette(palette); - sub_807D78C(IndexOfSpritePaletteTag(palette->tag)); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); (*script) += 4; } @@ -1091,7 +1091,7 @@ void task00_8084310(u8 taskId) task = &gTasks[taskId]; if (!task->data[0]) { - if (!sub_807D770()) + if (!IsWeatherNotFadingIn()) { return; } @@ -1191,7 +1191,7 @@ bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { task->data[0]++; } @@ -1813,7 +1813,7 @@ bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { gFieldEffectArguments[0] = mapObject->coords2.x; gFieldEffectArguments[1] = mapObject->coords2.y; @@ -2046,7 +2046,7 @@ void sub_8087A74(u8 taskId) void sub_8087AA4(struct Task *task) { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { task->data[0]++; task->data[15] = player_get_direction_lower_nybble(); @@ -2199,7 +2199,7 @@ void sub_8087E4C(struct Task *task) { struct Sprite *sprite; s16 centerToCornerVecY; - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { sprite = &gSprites[gPlayerAvatar.spriteId]; centerToCornerVecY = -(sprite->centerToCornerVecY << 1); diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c index 165829a55..93fc62bd5 100644 --- a/src/field/field_effect_helpers.c +++ b/src/field/field_effect_helpers.c @@ -95,7 +95,7 @@ static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum) { pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum); } - sub_807D78C(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum); } } @@ -107,7 +107,7 @@ static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum) if (graphicsInfo->paletteTag2 != 0x11ff) { pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum); - sub_807D78C(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum); } } diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c index 5014e97e3..ad1cd4a59 100644 --- a/src/field/field_fadetransition.c +++ b/src/field/field_fadetransition.c @@ -44,18 +44,18 @@ void pal_fill_for_map_transition(void) switch (fade_type_for_given_maplight_pair(map_light, Overworld_GetMapTypeOfSaveblockLocation())) { case 0: - fade_screen(0, 0); + FadeScreen(0, 0); palette_bg_fill_black(); break; case 1: - fade_screen(2, 0); + FadeScreen(2, 0); palette_bg_fill_white(); } } void pal_fill_black(void) { - fade_screen(0, 0); + FadeScreen(0, 0); palette_bg_fill_black(); } @@ -65,10 +65,10 @@ void fade_8080918(void) switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) { case 0: - fade_screen(1, 0); + FadeScreen(1, 0); break; case 1: - fade_screen(3, 0); + FadeScreen(3, 0); } } @@ -366,7 +366,7 @@ bool32 sub_8080E64(void) bool32 sub_8080E70(void) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) return TRUE; else return FALSE; @@ -483,7 +483,7 @@ void sub_8081050(u8 taskId) { case 0: ClearLinkCallback_2(); - fade_screen(1, 0); + FadeScreen(1, 0); sub_8053FF8(); PlaySE(SE_KAIDAN); data[0]++; diff --git a/src/field/field_weather.c b/src/field/field_weather.c index 2a5c311ab..7beb1b440 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -71,10 +71,18 @@ static const u8 *const sCompressedDroughtPalettes[] = // this file produces the same result as accessing gWeather directly. struct Weather *const gWeatherPtr = &gWeather; -static bool8 sub_807D574(u8); -static void DroughtBlendSomething_807D304(s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static bool8 LightenSpritePaletteInFog(u8); static void BuildGammaShiftTables(void); -static void UpdateGammaShift(void); +static void UpdateWeatherGammaShift(void); +static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex); +static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void ApplyFogBlend(u8 blendCoeff, u16 blendColor); +static bool8 FadeInScreen_RainShowShade(void); +static bool8 FadeInScreen_Drought(void); +static bool8 FadeInScreen_Fog1(void); +static void FadeInScreenWithWeather(void); +static void DoNothing(void); void None_Init(void); void None_Main(void); bool8 None_Finish(void); @@ -154,12 +162,12 @@ static const struct WeatherCallbacks sWeatherFuncs[] = {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish}, }; -void (*const gUnknown_083970B8[])(void) = +void (*const gWeatherPalStateFuncs[])(void) = { - UpdateGammaShift, - sub_807CCAC, - nullsub_39, - nullsub_39, + UpdateWeatherGammaShift, // WEATHER_PAL_STATE_CHANGING_WEATHER + FadeInScreenWithWeather, // WEATHER_PAL_STATE_SCREEN_FADING_IN + DoNothing, // WEATHER_PAL_STATE_SCREEN_FADING_OUT + DoNothing, // WEATHER_PAL_STATE_IDLE }; // This table specifies which of the gamma shift tables should be @@ -214,7 +222,7 @@ void StartWeather(void) CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); BuildGammaShiftTables(); gWeatherPtr->altGammaSpritePalIndex = index; - gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201); + gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(0x1201); gWeatherPtr->rainSpriteCount = 0; gWeatherPtr->unknown_6D8 = 0; gWeatherPtr->cloudSpritesCreated = 0; @@ -225,13 +233,13 @@ void StartWeather(void) gWeatherPtr->sandstormSprites1Created = 0; gWeatherPtr->sandstormSprites2Created = 0; gWeatherPtr->unknown_72E = 0; - gWeatherPtr->unknown_6FA = 0; + gWeatherPtr->lightenedFogSpritePalsCount = 0; Weather_SetBlendCoeffs(16, 0); gWeatherPtr->currWeather = 0; - gWeatherPtr->unknown_6C6 = 3; - gWeatherPtr->unknown_6C8 = 0; - gWeatherPtr->unknown_6D3 = 1; - gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80); + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + gWeatherPtr->readyForInit = FALSE; + gWeatherPtr->weatherChangeComplete = TRUE; + gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80); } } @@ -247,7 +255,7 @@ void ChangeWeather(u8 weather) sWeatherFuncs[weather].initVars(); } - gWeatherPtr->unknown_6D3 = 0; + gWeatherPtr->weatherChangeComplete = FALSE; gWeatherPtr->nextWeather = weather; gWeatherPtr->finishStep = 0; } @@ -264,12 +272,14 @@ void sub_807C9B4(u8 weather) PlayRainSoundEffect(); gWeatherPtr->currWeather = weather; gWeatherPtr->nextWeather = weather; - gWeatherPtr->unknown_6C8 = 1; + gWeatherPtr->readyForInit = TRUE; } void Task_WeatherInit(u8 taskId) { - if (gWeatherPtr->unknown_6C8) + // Waits until it's ok to initialize weather. + // When the screen fades in, this is set to TRUE. + if (gWeatherPtr->readyForInit) { sWeatherFuncs[gWeatherPtr->currWeather].initAll(); gTasks[taskId].func = Task_WeatherMain; @@ -282,18 +292,20 @@ void Task_WeatherMain(u8 taskId) { if (!sWeatherFuncs[gWeatherPtr->currWeather].finish()) { + // Finished cleaning up previous weather. Now transition to next weather. sWeatherFuncs[gWeatherPtr->nextWeather].initVars(); gWeatherPtr->gammaStepFrameCounter = 0; - gWeatherPtr->unknown_6C6 = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; gWeatherPtr->currWeather = gWeatherPtr->nextWeather; - gWeatherPtr->unknown_6D3 = 1; + gWeatherPtr->weatherChangeComplete = TRUE; } } else { sWeatherFuncs[gWeatherPtr->currWeather].main(); } - gUnknown_083970B8[gWeatherPtr->unknown_6C6](); + + gWeatherPalStateFuncs[gWeatherPtr->palProcessingState](); } void None_Init(void) @@ -383,11 +395,11 @@ static void BuildGammaShiftTables(void) // When the weather is changing, it gradually updates the palettes // towards the desired gamma shift. -static void UpdateGammaShift(void) +static void UpdateWeatherGammaShift(void) { if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) { - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } else { @@ -398,15 +410,17 @@ static void UpdateGammaShift(void) gWeatherPtr->gammaIndex++; else gWeatherPtr->gammaIndex--; - BlendSomething_807CEBC(0, 32, gWeatherPtr->gammaIndex); + + ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex); } } } -void sub_807CCAC(void) +static void FadeInScreenWithWeather(void) { if (++gWeatherPtr->unknown_6CB > 1) gWeatherPtr->unknown_6CA = 0; + switch (gWeatherPtr->currWeather) { case WEATHER_RAIN_LIGHT: @@ -414,24 +428,24 @@ void sub_807CCAC(void) case WEATHER_RAIN_HEAVY: case WEATHER_SNOW: case WEATHER_SHADE: - if (RainSnowShadeBlend_807CDC4() == 0) + if (FadeInScreen_RainShowShade() == FALSE) { gWeatherPtr->gammaIndex = 3; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_DROUGHT: - if (DroughtBlend_807CE24() == 0) + if (FadeInScreen_Drought() == FALSE) { gWeatherPtr->gammaIndex = -6; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_FOG_1: - if (Fog1Blend_807CE7C() == 0) + if (FadeInScreen_Fog1() == FALSE) { gWeatherPtr->gammaIndex = 0; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_ASH: @@ -442,54 +456,58 @@ void sub_807CCAC(void) if (!gPaletteFade.active) { gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; } } -u8 RainSnowShadeBlend_807CDC4(void) +bool8 FadeInScreen_RainShowShade(void) { - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - if (++gWeatherPtr->unknown_6C7 >= 0x10) + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + if (++gWeatherPtr->fadeScreenCounter >= 16) { - BlendSomething_807CEBC(0, 32, 3); - gWeatherPtr->unknown_6C7 = 0x10; - return 0; + ApplyGammaShift(0, 32, 3); + gWeatherPtr->fadeScreenCounter = 16; + return FALSE; } - BlendSomething_807D1BC(0, 32, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); - return 1; + + ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -u8 DroughtBlend_807CE24(void) +bool8 FadeInScreen_Drought(void) { - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - if (++gWeatherPtr->unknown_6C7 >= 0x10) + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + if (++gWeatherPtr->fadeScreenCounter >= 16) { - BlendSomething_807CEBC(0, 32, -6); - gWeatherPtr->unknown_6C7 = 0x10; - return 0; + ApplyGammaShift(0, 32, -6); + gWeatherPtr->fadeScreenCounter = 16; + return FALSE; } - DroughtBlendSomething_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); - return 1; -} -u8 Fog1Blend_807CE7C(void) -{ - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - ++gWeatherPtr->unknown_6C7; - BlendSomething_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->fadeDestColor); - return 1; + ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -void nullsub_39(void) +bool8 FadeInScreen_Fog1(void) { + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + gWeatherPtr->fadeScreenCounter++; + ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -void BlendSomething_807CEBC(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) +static void DoNothing(void) +{ } + +static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) { u16 curPalIndex; u16 palOffset; @@ -607,7 +625,7 @@ void BlendSomething_807CEBC(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) } } -void BlendSomething_807D1BC(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) +static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) { u16 palOffset; u16 curPalIndex; @@ -658,7 +676,7 @@ void BlendSomething_807D1BC(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 } } -void DroughtBlendSomething_807D304(s8 gammaIndex, u8 blendCoeff, u16 blendColor) +void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor) { struct RGBColor color; u8 rBlend; @@ -713,7 +731,7 @@ void DroughtBlendSomething_807D304(s8 gammaIndex, u8 blendCoeff, u16 blendColor) } } -void BlendSomething_807D424(u8 blendCoeff, u16 blendColor) +void ApplyFogBlend(u8 blendCoeff, u16 blendColor) { struct RGBColor color; u8 rBlend; @@ -729,7 +747,7 @@ void BlendSomething_807D424(u8 blendCoeff, u16 blendColor) for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) { - if (sub_807D574(curPalIndex)) + if (LightenSpritePaletteInFog(curPalIndex)) { u16 palEnd = (curPalIndex + 1) * 16; u16 palOffset = curPalIndex * 16; @@ -760,22 +778,22 @@ void BlendSomething_807D424(u8 blendCoeff, u16 blendColor) } } -void sub_807D540(u8 paletteIndex) +static void MarkFogSpritePalToLighten(u8 paletteIndex) { - if (gWeatherPtr->unknown_6FA < 6) + if (gWeatherPtr->lightenedFogSpritePalsCount < 6) { - gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = paletteIndex; - gWeatherPtr->unknown_6FA++; + gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex; + gWeatherPtr->lightenedFogSpritePalsCount++; } } -bool8 sub_807D574(u8 paletteIndex) +static bool8 LightenSpritePaletteInFog(u8 paletteIndex) { u16 i; - for (i = 0; i < gWeatherPtr->unknown_6FA; i++) + for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) { - if (gWeatherPtr->unknown_6F4[i] == paletteIndex) + if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) return TRUE; } @@ -784,18 +802,18 @@ bool8 sub_807D574(u8 paletteIndex) void sub_807D5BC(s8 gammaIndex) { - if (gWeatherPtr->unknown_6C6 == 3) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { - BlendSomething_807CEBC(0, 32, gammaIndex); + ApplyGammaShift(0, 32, gammaIndex); gWeatherPtr->gammaIndex = gammaIndex; } } void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) { - if (gWeatherPtr->unknown_6C6 == 3) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { - gWeatherPtr->unknown_6C6 = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; gWeatherPtr->gammaIndex = gammaIndex; gWeatherPtr->gammaTargetIndex = gammaTargetIndex; gWeatherPtr->gammaStepFrameCounter = 0; @@ -804,29 +822,29 @@ void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) } } -void fade_screen(u8 mode, u8 delay) +void FadeScreen(u8 mode, u8 delay) { u32 fadeColor; - bool8 fadeTo; + bool8 fadeOut; bool8 useWeatherPal; switch (mode) { case FADE_FROM_BLACK: fadeColor = 0; - fadeTo = FALSE; + fadeOut = FALSE; break; case FADE_FROM_WHITE: fadeColor = 0xFFFF; - fadeTo = FALSE; + fadeOut = FALSE; break; case FADE_TO_BLACK: fadeColor = 0; - fadeTo = TRUE; + fadeOut = TRUE; break; case FADE_TO_WHITE: fadeColor = 0xFFFF; - fadeTo = TRUE; + fadeOut = TRUE; break; default: return; @@ -848,59 +866,63 @@ void fade_screen(u8 mode, u8 delay) break; } - if (fadeTo) + if (fadeOut) { if (useWeatherPal) CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); + BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); - gWeatherPtr->unknown_6C6 = 2; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } else { gWeatherPtr->fadeDestColor = fadeColor; if (useWeatherPal) - gWeatherPtr->unknown_6C7 = 0; + gWeatherPtr->fadeScreenCounter = 0; else BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); - gWeatherPtr->unknown_6C6 = 1; + + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; gWeatherPtr->unknown_6CA = 1; gWeatherPtr->unknown_6CB = 0; Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); - gWeatherPtr->unknown_6C8 = 1; + gWeatherPtr->readyForInit = TRUE; } } -bool8 sub_807D770(void) +bool8 IsWeatherNotFadingIn(void) { - return (gWeatherPtr->unknown_6C6 != 1); + return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); } -void sub_807D78C(u8 spritePaletteIndex) +void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) { u16 paletteIndex = 16 + spritePaletteIndex; u16 i; - switch (gWeatherPtr->unknown_6C6) + switch (gWeatherPtr->palProcessingState) { - case 1: + case WEATHER_PAL_STATE_SCREEN_FADING_IN: if (gWeatherPtr->unknown_6CA != 0) { if (gWeatherPtr->currWeather == WEATHER_FOG_1) - sub_807D540(paletteIndex); + MarkFogSpritePalToLighten(paletteIndex); paletteIndex *= 16; for (i = 0; i < 16; i++) gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; } break; - case 2: + case WEATHER_PAL_STATE_SCREEN_FADING_OUT: paletteIndex *= 16; CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32); BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); break; + // WEATHER_PAL_STATE_CHANGING_WEATHER + // WEATHER_PAL_STATE_CHANGING_IDLE default: if (gWeatherPtr->currWeather != WEATHER_FOG_1) { - BlendSomething_807CEBC(paletteIndex, 1, gWeatherPtr->gammaIndex); + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } else { @@ -911,23 +933,23 @@ void sub_807D78C(u8 spritePaletteIndex) } } -void sub_807D874(u8 paletteIndex) +void ApplyWeatherGammaShiftToPal(u8 paletteIndex) { - BlendSomething_807CEBC(paletteIndex, 1, gWeatherPtr->gammaIndex); + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } u8 unref_sub_807D894(void) { - if (gWeatherPtr->unknown_6C6 == 1) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) return gWeatherPtr->unknown_6CA; else return 0; } -void sub_807D8C0(const u16 *palette) +void LoadCustomWeatherSpritePalette(const u16 *palette) { - LoadPalette(palette, 0x100 + gWeatherPtr->unknown_6D4 * 16, 32); - sub_807D78C(gWeatherPtr->unknown_6D4); + LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); + UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); } static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b) @@ -1085,34 +1107,34 @@ void unref_sub_807DCB4(u8 a) switch (a) { case 1: - SetWeather(1); + SetWeather(WEATHER_CLOUDS); break; case 2: - SetWeather(2); + SetWeather(WEATHER_SUNNY); break; case 3: - SetWeather(3); + SetWeather(WEATHER_RAIN_LIGHT); break; case 4: - SetWeather(4); + SetWeather(WEATHER_SNOW); break; case 5: - SetWeather(5); + SetWeather(WEATHER_RAIN_MED); break; case 6: - SetWeather(6); + SetWeather(WEATHER_FOG_1); break; case 7: - SetWeather(9); + SetWeather(WEATHER_FOG_2); break; case 8: - SetWeather(7); + SetWeather(WEATHER_ASH); break; case 9: - SetWeather(8); + SetWeather(WEATHER_SANDSTORM); break; case 10: - SetWeather(11); + SetWeather(WEATHER_SHADE); break; } } @@ -1122,11 +1144,11 @@ u8 GetCurrentWeather(void) return gWeatherPtr->currWeather; } -void SetRainStrengthFromSoundEffect(u16 sndEff) +void SetRainStrengthFromSoundEffect(u16 soundEffect) { - if (gWeatherPtr->unknown_6C6 != 2) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) { - switch (sndEff) + switch (soundEffect) { case SE_T_KOAME: gWeatherPtr->rainStrength = 0; @@ -1140,7 +1162,8 @@ void SetRainStrengthFromSoundEffect(u16 sndEff) default: return; } - PlaySE(sndEff); + + PlaySE(soundEffect); } } @@ -1164,19 +1187,19 @@ void PlayRainSoundEffect(void) } } -u8 sub_807DDFC(void) +u8 IsWeatherChangeComplete(void) { - return gWeatherPtr->unknown_6D3; + return gWeatherPtr->weatherChangeComplete; } -void sub_807DE10(void) +void SetWeatherScreenFadeOut(void) { - gWeatherPtr->unknown_6C6 = 2; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } void unref_sub_807DE24(void) { - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } void PreservePaletteInWeather(u8 preservedPalIndex) diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c index 0fee26b89..eff702f8c 100644 --- a/src/field/field_weather_effects.c +++ b/src/field/field_weather_effects.c @@ -75,7 +75,6 @@ static const struct SpriteTemplate sCloudSpriteTemplate = }; extern void sub_807D5BC(s8 gammaIndex); -extern void sub_807D8C0(const u16 *palette); extern void sub_807DA14(void); extern void sub_807DA4C(void); extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c); @@ -182,7 +181,7 @@ void CreateCloudSprites(void) if (gWeatherPtr->cloudSpritesCreated == TRUE) return; LoadSpriteSheet(&sCloudSpriteSheet); - sub_807D8C0(gUnknown_08397108); + LoadCustomWeatherSpritePalette(gUnknown_08397108); for (i = 0; i < 3; i++) { u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF); @@ -252,7 +251,7 @@ void Drought_Main(void) switch (gWeatherPtr->initStep) { case 0: - if (gWeatherPtr->unknown_6C6 != 0) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) gWeatherPtr->initStep++; break; case 1: @@ -1137,7 +1136,7 @@ void Rain_Main(void) gWeatherPtr->initStep++; break; case 3: - if (gWeatherPtr->unknown_6C6 == 0) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_CHANGING_WEATHER) break; gWeatherPtr->initStep = 6; break; @@ -1211,7 +1210,7 @@ void Rain_Main(void) gWeatherPtr->initStep++; break; case 14: - if (gWeatherPtr->unknown_6C6 != 3) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_IDLE) break; gWeatherPtr->unknown_6EA = 1; gWeatherPtr->initStep = 4; @@ -2013,7 +2012,7 @@ void CreateSandstormSprites_1(void) if (!gWeatherPtr->sandstormSprites1Created) { LoadSpriteSheet(&sSandstormSpriteSheet); - sub_807D8C0(gUnknown_08397128); + LoadCustomWeatherSpritePalette(gUnknown_08397128); for (i = 0; i < 20; i++) { u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1); diff --git a/src/field/item_menu.c b/src/field/item_menu.c index 6bad9f4d6..959eb09ae 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -47,7 +47,7 @@ extern void sub_808B5B4(); extern u8 sub_80F92F4(); extern void sub_80C9C7C(u8); extern void pal_fill_black(void); -extern bool8 sub_807D770(void); +extern bool8 IsWeatherNotFadingIn(void); extern u8 sub_80F931C(); extern void sub_808A3F8(u8); extern void Shop_FadeReturnToMartMenu(void); @@ -2699,7 +2699,7 @@ void ExecuteItemUseFromBlackPalette(void) static void Task_CallItemUseOnFieldCallback(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) gFieldItemUseCallback(taskId); } diff --git a/src/field/item_use.c b/src/field/item_use.c index cdad3f840..219ef5080 100644 --- a/src/field/item_use.c +++ b/src/field/item_use.c @@ -100,7 +100,7 @@ void ItemMenu_ConfirmNormalFade(u8 var) void ItemMenu_ConfirmComplexFade(u8 var) { ExecuteSwitchToOverworldFromItemUse(var); - fade_screen(1, 0); + FadeScreen(1, 0); } void SetUpItemUseOnFieldCallback(u8 taskId) diff --git a/src/field/overworld.c b/src/field/overworld.c index fc313693a..07453e4fe 100644 --- a/src/field/overworld.c +++ b/src/field/overworld.c @@ -612,7 +612,7 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) apply_map_tileset2_palette(gMapHeader.mapData); for (paletteIndex = 6; paletteIndex < 12; paletteIndex++) - sub_807D874(paletteIndex); + ApplyWeatherGammaShiftToPal(paletteIndex); sub_8072ED0(); UpdateLocationHistoryForRoamer(); diff --git a/src/field/player_pc.c b/src/field/player_pc.c index 3719b7c7a..27427ecaa 100644 --- a/src/field/player_pc.c +++ b/src/field/player_pc.c @@ -29,7 +29,7 @@ extern void DestroyVerticalScrollIndicator(u8); extern void PauseVerticalScrollIndicator(u8); extern void LoadScrollIndicatorPalette(void); extern void ClearMailStruct(struct MailStruct *); -extern u8 sub_807D770(void); +extern u8 IsWeatherNotFadingIn(void); extern void sub_808B020(void); extern void ClearVerticalScrollIndicatorPalettes(void); @@ -357,12 +357,12 @@ static void Task_ItemStorage_Deposit(u8 taskId) static void ItemStorage_Deposit(u8 taskId) { TASK.FUNC = Task_ItemStorage_Deposit; - fade_screen(1, 0); + FadeScreen(1, 0); } static void ItemStorage_HandleReturnToProcessInput(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) TASK.FUNC = ItemStorageMenuProcessInput; } @@ -1196,7 +1196,7 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId) static void Mailbox_DoMailRead(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); TASK.FUNC = Mailbox_FadeAndReadMail; } @@ -1211,7 +1211,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId) static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput { - if(sub_807D770() == TRUE) // is black fade finished? why not gPaletteFade.active? + if (IsWeatherNotFadingIn() == TRUE) // is black fade finished? why not gPaletteFade.active? TASK.FUNC = Mailbox_ProcessInput; } @@ -1280,7 +1280,7 @@ static void Mailbox_Give(u8 taskId) Mailbox_NoPokemonForMail(taskId); // cannot be reached normally else { - fade_screen(1, 0); + FadeScreen(1, 0); TASK.FUNC = Mailbox_DoGiveMailPokeMenu; } } diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 36edbe472..bc5cd0b1d 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -626,7 +626,7 @@ bool8 IsPaletteNotActive(void) bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) { - fade_screen(ScriptReadByte(ctx), 0); + FadeScreen(ScriptReadByte(ctx), 0); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } @@ -636,7 +636,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) u8 duration = ScriptReadByte(ctx); u8 delay = ScriptReadByte(ctx); - fade_screen(duration, delay); + FadeScreen(duration, delay); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } diff --git a/src/field/secret_base.c b/src/field/secret_base.c index 134aebbc6..2d02de004 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -348,7 +348,7 @@ void sub_80BBA48(u8 taskid) void sub_80BBAF0(void) { CreateTask(sub_80BBA48, 0); - fade_screen(1, 0); + FadeScreen(1, 0); saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); } @@ -362,7 +362,7 @@ bool8 sub_80BBB24(void) void sub_80BBB50(u8 taskid) { FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); - if (sub_807D770() == 1) { + if (IsWeatherNotFadingIn() == 1) { EnableBothScriptContexts(); DestroyTask(taskid); } @@ -397,7 +397,7 @@ void sub_80BBC78(void) { u8 taskid = CreateTask(sub_80BBBEC, 0); gTasks[taskid].data[0] = 0; - fade_screen(1, 0); + FadeScreen(1, 0); } bool8 CurrentMapIsSecretBase(void) @@ -534,7 +534,7 @@ void sub_80BC074(u8 taskid) void sub_80BC0F8(void) { CreateTask(sub_80BC074, 0); - fade_screen(1, 0); + FadeScreen(1, 0); } void sub_80BC114(void) { diff --git a/src/field/shop.c b/src/field/shop.c index a228ff92f..e087628da 100644 --- a/src/field/shop.c +++ b/src/field/shop.c @@ -173,7 +173,7 @@ static void Task_HandleShopMenuBuy(u8 taskId) gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16; gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics; gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; - fade_screen(1, 0); + FadeScreen(1, 0); } static void Task_HandleShopMenuSell(u8 taskId) @@ -181,7 +181,7 @@ static void Task_HandleShopMenuSell(u8 taskId) gTasks[taskId].data[8] = (u32)ItemMenu_LoadSellMenu >> 16; gTasks[taskId].data[9] = (u32)ItemMenu_LoadSellMenu; gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; - fade_screen(1, 0); + FadeScreen(1, 0); } static void Task_HandleShopMenuQuit(u8 taskId) @@ -213,7 +213,7 @@ static void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) static void Task_ReturnToMartMenu(u8 taskId) { - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == 1) { if (gMartInfo.martType == MART_TYPE_2) DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 89cd404e9..381c19bb7 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -329,7 +329,7 @@ static u8 StartMenu_InputProcessCallback(void) if (gMenuCallback != StartMenu_SaveCallback && gMenuCallback != StartMenu_ExitCallback && gMenuCallback != StartMenu_RetireCallback) - fade_screen(1, 0); + FadeScreen(1, 0); return 0; } if (gMain.newKeys & (START_BUTTON | B_BUTTON)) diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c index a41e197f2..c0cae9353 100644 --- a/src/pokemon/pokemon_menu.c +++ b/src/pokemon/pokemon_menu.c @@ -786,7 +786,7 @@ void FieldCallback_Teleport(void) static void sub_808ABA8(u8 taskID) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gFieldEffectArguments[0] = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES); gUnknown_03005CE4(); diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index 8b4a1bb28..7faa8d844 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -18,6 +18,7 @@ #include "event_data.h" #include "cable_car_util.h" #include "constants/map_objects.h" +#include "constants/weather.h" // Static type declarations @@ -328,7 +329,7 @@ static void sub_8123740(void) i = 0; sub_8123FBC(0); gSpriteCoordOffsetX = 0; - sub_807C9B4(0); + sub_807C9B4(WEATHER_NONE); for (; i < 20; i++) { gWeatherPtr->sprites.s2.ashSprites[i] = NULL; @@ -769,7 +770,7 @@ static void LoadSprites(void) gSprites[spriteId].data[1] = 0x63; sCableCarPtr->unk_0002 = 7; sCableCarPtr->unk_0004 = 0x15e; - sub_807C9B4(2); + sub_807C9B4(WEATHER_SUNNY); break; case 1: CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0x18, 0x1a, 0x0c, 0x03); @@ -793,7 +794,7 @@ static void LoadSprites(void) gSprites[spriteId].data[1] = 0x41; sCableCarPtr->unk_0002 = 2; sCableCarPtr->unk_0004 = 0x109; - sub_807C9B4(7); + sub_807C9B4(WEATHER_ASH); break; } for (i = 0; i < 9; i++) -- cgit v1.2.3 From 7a4f92553a41fdd14a29ac038b512cb8603d2a0c Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 20 Jan 2018 22:06:58 -0600 Subject: use C preprocessor to generate common syms file --- src/field/tv.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/field/tv.c b/src/field/tv.c index efda4b925..8bd36bb9c 100644 --- a/src/field/tv.c +++ b/src/field/tv.c @@ -47,8 +47,6 @@ struct UnkTvStruct s8 var0; }; -extern u8 gUnknown_0300430A[11]; - struct OutbreakPokemon { /*0x00*/ u16 species; -- cgit v1.2.3 From 608e06126acdc8b6d32a0aa71fdc57bc188b8d7b Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sun, 21 Jan 2018 14:27:32 -0600 Subject: fix build of normal ROMs --- src/debug/start_menu_debug.c | 3 +++ src/engine/link.c | 2 +- src/engine/save.c | 4 ++-- src/pokemon/mail.c | 2 ++ src/scene/title_screen.c | 2 ++ 5 files changed, 10 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index f8e10baa2..572251fb4 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -1,3 +1,5 @@ +#if DEBUG + __attribute__((naked)) void debug_sub_8076AC8() { @@ -6128,3 +6130,4 @@ void DebugMenu_OpenKiwa() ); } +#endif diff --git a/src/engine/link.c b/src/engine/link.c index a716d5c2b..f800f4aad 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -1404,7 +1404,7 @@ static void CB2_PrintErrorMessage(void) { case 0: Menu_PrintTextPixelCoords(gMultiText_LinkError, 20, 56, 1); -#ifdef DEBUG +#if DEBUG StringCopy(array, sColorCodes); ConvertIntToHexStringN(array2, sErrorLinkStatus, STR_CONV_MODE_LEADING_ZEROS, 8); diff --git a/src/engine/save.c b/src/engine/save.c index 8217652f9..d11eebaac 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -783,7 +783,7 @@ u8 Save_WriteDataInternal(u8 saveType) return 0; } -#ifdef DEBUG +#if DEBUG extern u32 gUnknown_Debug_03004BD0; #endif @@ -794,7 +794,7 @@ u8 Save_WriteData(u8 saveType) // TrySave Save_WriteDataInternal(saveType); if (!gDamagedSaveSectors -#ifdef DEBUG +#if DEBUG && gUnknown_Debug_03004BD0 == 0 #endif ) diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index db0c96938..3187fef9f 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -327,9 +327,11 @@ static void sub_80F8F58(void); static void sub_80F8F78(void); static void sub_80F8FB4(void); +#if DEBUG // some debug variable, I guess. // TODO: where exactly is this located? __attribute__((section(".bss"))) /*static*/ u8 gUnknown_0300074C = 0; +#endif #if DEBUG __attribute__((naked)) diff --git a/src/scene/title_screen.c b/src/scene/title_screen.c index 4ff02d93c..a1c8e081d 100644 --- a/src/scene/title_screen.c +++ b/src/scene/title_screen.c @@ -354,7 +354,9 @@ static void Task_TitleScreenPhase1(u8); static void Task_TitleScreenPhase2(u8); static void Task_TitleScreenPhase3(u8); static void CB2_GoToMainMenu(void); +#if DEBUG static void CB2_GoToTestMenu(void); +#endif static void CB2_GoToClearSaveDataScreen(void); static void CB2_GoToResetRtcScreen(void); static void CB2_GoToCopyrightScreen(void); -- cgit v1.2.3 From ffb74a0211f750506650b66fe2bcdf7ddf770668 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sun, 21 Jan 2018 18:14:47 -0600 Subject: match debug ROM --- src/battle/battle_2.c | 6 ++++++ src/debug/watanabe_debug_menu.c | 8 ++++---- src/engine/link.c | 18 ++++++++++++++---- src/pokemon/mail.c | 11 +++-------- 4 files changed, 27 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 696f1fde0..03391cf92 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -12104,6 +12104,12 @@ void SetActionsAndBanksTurnOrder(void) } } } + // Debug ROM has a register swap from the retail ROM. + // And doing this seems to fix it. +#if DEBUG + asm("");asm("");asm("");asm("");asm("");asm("");asm("");asm("");asm(""); + asm("");asm("");asm("");asm("");asm("");asm("");asm("");asm(""); +#endif gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; eFocusPunchBank = 0; } diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index b0fbebac1..ff6f97933 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -7813,7 +7813,7 @@ void debug_80C6FA8() " ldrh r0, [r1]\n" " mov r1, #0x0\n" " mov r2, #0x0\n" - " bl GetMonSpritePal\n" + " bl GetMonSpritePalFromOtIdPersonality\n" " ldr r1, [r4]\n" " ldrb r1, [r1, #0x6]\n" " lsl r1, r1, #0x14\n" @@ -7832,7 +7832,7 @@ void debug_80C6FA8() " ldrh r0, [r1]\n" " mov r1, #0x0\n" " mov r2, #0x9\n" - " bl GetMonSpritePal\n" + " bl GetMonSpritePalFromOtIdPersonality\n" " ldr r1, [r4]\n" " ldrb r1, [r1, #0x6]\n" " lsl r1, r1, #0x14\n" @@ -9268,7 +9268,7 @@ void debug_80C7B14() " ldrh r0, [r1]\n" " mov r1, #0x0\n" " mov r2, #0x0\n" - " bl GetMonSpritePal\n" + " bl GetMonSpritePalFromOtIdPersonality\n" " ldr r1, [r4]\n" " ldrb r1, [r1, #0x6]\n" " lsl r1, r1, #0x14\n" @@ -9287,7 +9287,7 @@ void debug_80C7B14() " ldrh r0, [r1]\n" " mov r1, #0x0\n" " mov r2, #0x9\n" - " bl GetMonSpritePal\n" + " bl GetMonSpritePalFromOtIdPersonality\n" " ldr r1, [r4]\n" " ldrb r1, [r1, #0x6]\n" " lsl r1, r1, #0x14\n" diff --git a/src/engine/link.c b/src/engine/link.c index f800f4aad..5785a5a56 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -81,7 +81,7 @@ static void sub_80084C8(void); static void sub_80084F4(void); static void CheckErrorStatus(void); -static void CB2_PrintErrorMessage(void); +void CB2_PrintErrorMessage(void); static u8 IsSioMultiMaster(void); static void DisableSerial(void); static void EnableSerial(void); @@ -191,9 +191,19 @@ const struct BlockRequest sBlockRequestLookupTable[5] = static const u8 sTestString[] = _("テストな"); -ALIGNED(4) static const u8 sMagic[] = "GameFreak inc."; +// TODO: fix the alignment here -ALIGNED(4) static const u8 sEmptyString[] = _(""); +ALIGNED(4) const u8 sMagic[] = "GameFreak inc."; + +#if DEBUG +const u8 sEmptyString[] = _(" "); +#else +ALIGNED(4) const u8 sEmptyString[] = _(""); +#endif + +#if DEBUG +const u8 linkDebugFillerPleaseRemove[2] = {0}; +#endif void Task_DestroySelf(u8 taskId) { @@ -1395,7 +1405,7 @@ void CB2_LinkError(void) SetMainCallback2(CB2_PrintErrorMessage); } -static void CB2_PrintErrorMessage(void) +void CB2_PrintErrorMessage(void) { u8 array[32] __attribute__((unused)); // unused u8 array2[32] __attribute__((unused)); // unused diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index 3187fef9f..11851410b 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -68,11 +68,6 @@ struct MailGraphics u16 color12; }; -#if DEBUG -// should be static -__attribute__((section(".bss"))) u8 unk_debug_bss_2; -#endif - const u16 gUnknown_083E562C[][2] = { {0x6ACD, 0x51A5}, @@ -977,7 +972,7 @@ void debug_sub_810C910() " .align 2, 0\n" "._143:\n" " .word gPaletteFade\n" - " .word unk_debug_bss_2\n" + " .word gUnknown_0300074C\n" " .word gSaveBlock1\n" " .word gSpecialVar_0x8005\n" " .word 0x2b6c\n" @@ -1529,7 +1524,7 @@ void debug_sub_810CD9C() "._192:\n" " .align 2, 0\n" "._191:\n" - " .word unk_debug_bss_2\n" + " .word gUnknown_0300074C\n" " .word gSpecialVar_0x8004\n" " .word gSpecialVar_0x8005\n" " .word gSpecialVar_0x8006\n" @@ -2372,7 +2367,7 @@ void debug_sub_810D388() "._300:\n" " .align 2, 0\n" "._299:\n" - " .word unk_debug_bss_2\n" + " .word gUnknown_0300074C\n" " .word 0x43c\n" "._297:\n" " bl ScanlineEffect_Stop\n" -- cgit v1.2.3 From 5ffd006acfe8ad12e88fa53a93a55b6f59e77779 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 21 Jan 2018 19:33:08 -0500 Subject: nonmatching sub_809C464 --- src/pokemon/pokemon_storage_system_4.c | 378 +++++++++++++++++++++++++++++++++ 1 file changed, 378 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index eb5a6cb0b..c02ca878d 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -67,7 +67,10 @@ bool8 sub_809BF2C(void); void sub_809BF74(void); void sub_809C028(void); void sub_809C04C(void *pokemon, u8 a1); +bool8 sub_809CAB0(void); void sub_809CC04(void); +void sub_809CD88(void); +s8 sub_809CE4C(u8 a0); // .rodata @@ -2101,3 +2104,378 @@ void sub_809C04C(void *pokemon, u8 a1) buf[0] = EOS; } } + +#ifdef NONMATCHING +u8 sub_809C464(void) +{ + u8 r9; + s8 r8 = gUnknown_020384E4; + s8 r4 = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_11de = 0; + gPokemonStorageSystemPtr->unk_11df = 0; + gPokemonStorageSystemPtr->unk_11e3 = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + r9 = 1; + if (gUnknown_020384E5 >= 6) + { + r4 -= 6; + } + else + { + r8 = 2; + r4 = 0; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + r9 = 1; + r4 += 6; + if (r4 >= 30) + { + r8 = 3; + r4 -= 30; + r4 /= 3; + gPokemonStorageSystemPtr->unk_11de = 1; + gPokemonStorageSystemPtr->unk_11e3 = 1; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + r9 = 1; + if (gUnknown_020384E5 % 6) + r4--; + else + { + gPokemonStorageSystemPtr->unk_11df = -1; + r4 += 5; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + r9 = 1; + if ((gUnknown_020384E5 + 1) % 6) + r4++; + else + { + gPokemonStorageSystemPtr->unk_11df = 1; + r4 -= 5; + } + } + else if (gMain.newKeys & START_BUTTON) + { + r9 = 1; + r8 = 2; + r4 = 0; + } + else + { + if ((gMain.newKeys & A_BUTTON) && sub_809CAB0()) + { + if (gUnknown_020384E9 == 0) + return 8; + switch (sub_809CE4C(0)) + { + case 1: + return 11; + case 2: + return 12; + case 3: + return 13; + case 4: + return 14; + case 5: + return 15; + } + } + if (gMain.newKeys & B_BUTTON) + return 16; + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.heldKeys & L_BUTTON) + return 10; + if (gMain.heldKeys & R_BUTTON) + return 9; + } + if (gMain.newKeys & SELECT_BUTTON) + { + sub_809CD88(); + return 0; + } + r9 = 0; + } + if (r9) + sub_809AF18(r8, r4); + return r9; +} +#else +__attribute__((naked)) u8 sub_809C464(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tldr r0, _0809C4D8 @ =gUnknown_020384E4\n" + "\tldrb r0, [r0]\n" + "\tmov r8, r0\n" + "\tldr r2, _0809C4DC @ =gUnknown_020384E5\n" + "\tldrb r4, [r2]\n" + "\tldr r0, _0809C4E0 @ =gPokemonStorageSystemPtr\n" + "\tldr r1, [r0]\n" + "\tldr r0, _0809C4E4 @ =0x000011de\n" + "\tadds r7, r1, r0\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r7]\n" + "\tldr r3, _0809C4E8 @ =0x000011df\n" + "\tadds r5, r1, r3\n" + "\tstrb r0, [r5]\n" + "\tadds r3, 0x4\n" + "\tadds r6, r1, r3\n" + "\tstrb r0, [r6]\n" + "\tldr r0, _0809C4EC @ =gMain\n" + "\tmov r12, r0\n" + "\tldrh r1, [r0, 0x30]\n" + "\tmovs r0, 0x40\n" + "\tands r0, r1\n" + "\tadds r3, r2, 0\n" + "\tcmp r0, 0\n" + "\tbeq _0809C4A0\n" + "\tb _0809C62A\n" + "_0809C4A0:\n" + "\tmovs r0, 0x80\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C4F0\n" + "\tmovs r1, 0x1\n" + "\tmov r9, r1\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xC0\n" + "\tlsls r3, 19\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x1D\n" + "\tbgt _0809C4BE\n" + "\tb _0809C648\n" + "_0809C4BE:\n" + "\tmovs r1, 0x3\n" + "\tmov r8, r1\n" + "\tsubs r0, 0x1E\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tbl __divsi3\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tmov r3, r9\n" + "\tstrb r3, [r7]\n" + "\tstrb r3, [r6]\n" + "\tb _0809C648\n" + "\t.align 2, 0\n" + "_0809C4D8: .4byte gUnknown_020384E4\n" + "_0809C4DC: .4byte gUnknown_020384E5\n" + "_0809C4E0: .4byte gPokemonStorageSystemPtr\n" + "_0809C4E4: .4byte 0x000011de\n" + "_0809C4E8: .4byte 0x000011df\n" + "_0809C4EC: .4byte gMain\n" + "_0809C4F0:\n" + "\tmovs r0, 0x20\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C524\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r3, r0]\n" + "\tmovs r1, 0x6\n" + "\tbl __modsi3\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C514\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFF\n" + "\tlsls r1, 24\n" + "\tb _0809C63C\n" + "_0809C514:\n" + "\tmovs r0, 0xFF\n" + "\tstrb r0, [r5]\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xA0\n" + "\tlsls r3, 19\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tb _0809C648\n" + "_0809C524:\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C554\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r3, r0]\n" + "\tadds r0, 0x1\n" + "\tmovs r1, 0x6\n" + "\tbl __modsi3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C548\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 17\n" + "\tb _0809C63C\n" + "_0809C548:\n" + "\tmov r3, r9\n" + "\tstrb r3, [r5]\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFB\n" + "\tlsls r1, 24\n" + "\tb _0809C63C\n" + "_0809C554:\n" + "\tmov r3, r12\n" + "\tldrh r1, [r3, 0x2E]\n" + "\tmovs r0, 0x8\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C56A\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r1, 0x2\n" + "\tmov r8, r1\n" + "\tb _0809C646\n" + "_0809C56A:\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5D4\n" + "\tbl sub_809CAB0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5D4\n" + "\tldr r0, _0809C588 @ =gUnknown_020384E9\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C58C\n" + "\tmovs r0, 0x8\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C588: .4byte gUnknown_020384E9\n" + "_0809C58C:\n" + "\tmovs r0, 0\n" + "\tbl sub_809CE4C\n" + "\tsubs r0, 0x1\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x4\n" + "\tbhi _0809C5D4\n" + "\tlsls r0, 2\n" + "\tldr r1, _0809C5A8 @ =_0809C5AC\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0809C5A8: .4byte _0809C5AC\n" + "\t.align 2, 0\n" + "_0809C5AC:\n" + "\t.4byte _0809C5C0\n" + "\t.4byte _0809C5C4\n" + "\t.4byte _0809C5C8\n" + "\t.4byte _0809C5CC\n" + "\t.4byte _0809C5D0\n" + "_0809C5C0:\n" + "\tmovs r0, 0xB\n" + "\tb _0809C658\n" + "_0809C5C4:\n" + "\tmovs r0, 0xC\n" + "\tb _0809C658\n" + "_0809C5C8:\n" + "\tmovs r0, 0xD\n" + "\tb _0809C658\n" + "_0809C5CC:\n" + "\tmovs r0, 0xE\n" + "\tb _0809C658\n" + "_0809C5D0:\n" + "\tmovs r0, 0xF\n" + "\tb _0809C658\n" + "_0809C5D4:\n" + "\tldr r2, _0809C5E4 @ =gMain\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5E8\n" + "\tmovs r0, 0x10\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C5E4: .4byte gMain\n" + "_0809C5E8:\n" + "\tldr r0, _0809C600 @ =gSaveBlock2\n" + "\tldrb r0, [r0, 0x13]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C612\n" + "\tldrh r1, [r2, 0x2C]\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C604\n" + "\tmovs r0, 0xA\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C600: .4byte gSaveBlock2\n" + "_0809C604:\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C612\n" + "\tmovs r0, 0x9\n" + "\tb _0809C658\n" + "_0809C612:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C624\n" + "\tbl sub_809CD88\n" + "\tmovs r0, 0\n" + "\tb _0809C658\n" + "_0809C624:\n" + "\tmovs r3, 0\n" + "\tmov r9, r3\n" + "\tb _0809C656\n" + "_0809C62A:\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r2, r0]\n" + "\tcmp r0, 0x5\n" + "\tble _0809C642\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFA\n" + "\tlsls r1, 24\n" + "_0809C63C:\n" + "\tadds r0, r1\n" + "\tlsrs r4, r0, 24\n" + "\tb _0809C648\n" + "_0809C642:\n" + "\tmovs r3, 0x2\n" + "\tmov r8, r3\n" + "_0809C646:\n" + "\tmovs r4, 0\n" + "_0809C648:\n" + "\tmov r0, r9\n" + "\tcmp r0, 0\n" + "\tbeq _0809C656\n" + "\tmov r0, r8\n" + "\tadds r1, r4, 0\n" + "\tbl sub_809AF18\n" + "_0809C656:\n" + "\tmov r0, r9\n" + "_0809C658:\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif -- cgit v1.2.3 From 9cfd6fed81b77b4f3aca8ad7b4c2641672cc234b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 21 Jan 2018 21:04:43 -0500 Subject: Create stub files to hold ewram symbols --- src/field/pokedex_area_screen.c | 20 ++++++++++++++++++++ src/field/pokenav.c | 16 ++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/field/pokedex_area_screen.c create mode 100644 src/field/pokenav.c (limited to 'src') diff --git a/src/field/pokedex_area_screen.c b/src/field/pokedex_area_screen.c new file mode 100644 index 000000000..67ca276c4 --- /dev/null +++ b/src/field/pokedex_area_screen.c @@ -0,0 +1,20 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u16 gUnknown_02039260 = 0; +EWRAM_DATA u16 gUnknown_02039262 = 0; +EWRAM_DATA u16 gUnknown_02039264 = 0; +EWRAM_DATA u16 gUnknown_02039266 = 0; +EWRAM_DATA u16 gUnknown_02039268 = 0; +EWRAM_DATA u16 gUnknown_0203926A = 0; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/field/pokenav.c b/src/field/pokenav.c new file mode 100644 index 000000000..f57a98df6 --- /dev/null +++ b/src/field/pokenav.c @@ -0,0 +1,16 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u8 gUnknown_020388B0[4] = {}; +EWRAM_DATA u16 gUnknown_020388B4 = 0; + +// Static ROM declarations + +// .rodata + +// .text -- cgit v1.2.3 From cc1767cbc116d26d954d50c6e7642138f012540c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 21 Jan 2018 21:49:43 -0500 Subject: nonmatching sub_809C664 --- src/pokemon/pokemon_storage_system_4.c | 363 +++++++++++++++++++++++++++++++++ 1 file changed, 363 insertions(+) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index c02ca878d..1cc9f7e3b 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -2479,3 +2479,366 @@ __attribute__((naked)) u8 sub_809C464(void) "\tbx r1"); } #endif + +#ifdef NONMATCHING +u8 sub_809C664(void) +{ + s8 r10 = gUnknown_020384E4; + s8 r4 = gUnknown_020384E5; + u8 r8; + u8 r9; + + gPokemonStorageSystemPtr->unk_11df = 0; + gPokemonStorageSystemPtr->unk_11de = 0; + gPokemonStorageSystemPtr->unk_11e3 = 0; + r9 = FALSE; + r8 = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (--r4 < 0) + r4 = 6; + if (r4 != gUnknown_020384E5) + r8 = 1; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (++r4 > 6) + r4 = 0; + if (r4 != gUnknown_020384E5) + r8 = 1; + } + else if ((gMain.newAndRepeatedKeys & DPAD_LEFT) && gUnknown_020384E5) + { + r8 = 1; + gPokemonStorageSystemPtr->unk_11e2 = gUnknown_020384E5; + r4 = 0; + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gUnknown_020384E5 == 0) + { + r8 = 1; + r4 = gPokemonStorageSystemPtr->unk_11e2; + } + else + { + r8 = 6; + r10 = 0; + r4 = 0; + } + } + else + { + if (gMain.newKeys & A_BUTTON) + { + if (gUnknown_020384E5 == 6) + { + if (gPokemonStorageSystemPtr->unk_0005 == 1) + return 4; + r9 = TRUE; + } + else if (sub_809CAB0()) + { + if (gUnknown_020384E9 == 0) + return 8; + switch (sub_809CE4C(0)) + { + case 1: + return 11; + case 2: + return 12; + case 3: + return 13; + case 4: + return 14; + case 5: + return 15; + } + } + } + if (gMain.newKeys & B_BUTTON) + { + if (gPokemonStorageSystemPtr->unk_0005 == 1) + return 16; + r9 = TRUE; + } + if (!r9) + { + r8 = 6; + r10 = 0; + r4 = 0; + } + else if (gMain.newKeys & SELECT_BUTTON) + { + sub_809CD88(); + return 0; + } + } + if (r8) + sub_809AF18(r10, r4); + return r8; +} +#else +__attribute__((naked)) u8 sub_809C664(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tldr r0, _0809C6D8 @ =gUnknown_020384E4\n" + "\tldrb r0, [r0]\n" + "\tmov r10, r0\n" + "\tldr r7, _0809C6DC @ =gUnknown_020384E5\n" + "\tldrb r4, [r7]\n" + "\tldr r2, _0809C6E0 @ =gPokemonStorageSystemPtr\n" + "\tldr r5, [r2]\n" + "\tldr r1, _0809C6E4 @ =0x000011df\n" + "\tadds r0, r5, r1\n" + "\tmovs r1, 0\n" + "\tstrb r1, [r0]\n" + "\tldr r3, _0809C6E8 @ =0x000011de\n" + "\tadds r0, r5, r3\n" + "\tstrb r1, [r0]\n" + "\tadds r3, 0x5\n" + "\tadds r0, r5, r3\n" + "\tstrb r1, [r0]\n" + "\tmov r9, r1\n" + "\tmov r8, r1\n" + "\tldr r1, _0809C6EC @ =gMain\n" + "\tldrh r3, [r1, 0x30]\n" + "\tmovs r0, 0x40\n" + "\tands r0, r3\n" + "\tadds r6, r7, 0\n" + "\tmov r12, r2\n" + "\tadds r2, r1, 0\n" + "\tcmp r0, 0\n" + "\tbeq _0809C6A8\n" + "\tb _0809C81C\n" + "_0809C6A8:\n" + "\tmovs r0, 0x80\n" + "\tands r0, r3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C6F0\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 17\n" + "\tadds r0, r1\n" + "\tlsrs r4, r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x6\n" + "\tble _0809C6C2\n" + "\tmovs r4, 0\n" + "_0809C6C2:\n" + "\tlsls r0, r4, 24\n" + "\tasrs r0, 24\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r6, r1]\n" + "\tcmp r0, r1\n" + "\tbne _0809C6D0\n" + "\tb _0809C83C\n" + "_0809C6D0:\n" + "\tmovs r2, 0x1\n" + "\tmov r8, r2\n" + "\tb _0809C842\n" + "\t.align 2, 0\n" + "_0809C6D8: .4byte gUnknown_020384E4\n" + "_0809C6DC: .4byte gUnknown_020384E5\n" + "_0809C6E0: .4byte gPokemonStorageSystemPtr\n" + "_0809C6E4: .4byte 0x000011df\n" + "_0809C6E8: .4byte 0x000011de\n" + "_0809C6EC: .4byte gMain\n" + "_0809C6F0:\n" + "\tmovs r0, 0x20\n" + "\tands r0, r3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C714\n" + "\tldrb r1, [r6]\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0\n" + "\tbeq _0809C714\n" + "\tmovs r3, 0x1\n" + "\tmov r8, r3\n" + "\tldr r2, _0809C710 @ =0x000011e2\n" + "\tadds r0, r5, r2\n" + "\tstrb r1, [r0]\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "\t.align 2, 0\n" + "_0809C710: .4byte 0x000011e2\n" + "_0809C714:\n" + "\tldrh r1, [r2, 0x30]\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C748\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C73C\n" + "\tmovs r3, 0x1\n" + "\tmov r8, r3\n" + "\tmov r1, r12\n" + "\tldr r0, [r1]\n" + "\tldr r2, _0809C738 @ =0x000011e2\n" + "\tadds r0, r2\n" + "\tldrb r4, [r0]\n" + "\tb _0809C83C\n" + "\t.align 2, 0\n" + "_0809C738: .4byte 0x000011e2\n" + "_0809C73C:\n" + "\tmovs r3, 0x6\n" + "\tmov r8, r3\n" + "\tmovs r0, 0\n" + "\tmov r10, r0\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "_0809C748:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7D0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0x6\n" + "\tbne _0809C76E\n" + "\tmov r1, r12\n" + "\tldr r0, [r1]\n" + "\tldrb r0, [r0, 0x5]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C768\n" + "\tmovs r0, 0x4\n" + "\tb _0809C84C\n" + "_0809C768:\n" + "\tmovs r2, 0x1\n" + "\tmov r9, r2\n" + "\tb _0809C7D0\n" + "_0809C76E:\n" + "\tbl sub_809CAB0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7D0\n" + "\tldr r0, _0809C784 @ =gUnknown_020384E9\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C788\n" + "\tmovs r0, 0x8\n" + "\tb _0809C84C\n" + "\t.align 2, 0\n" + "_0809C784: .4byte gUnknown_020384E9\n" + "_0809C788:\n" + "\tmovs r0, 0\n" + "\tbl sub_809CE4C\n" + "\tsubs r0, 0x1\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x4\n" + "\tbhi _0809C7D0\n" + "\tlsls r0, 2\n" + "\tldr r1, _0809C7A4 @ =_0809C7A8\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0809C7A4: .4byte _0809C7A8\n" + "\t.align 2, 0\n" + "_0809C7A8:\n" + "\t.4byte _0809C7BC\n" + "\t.4byte _0809C7C0\n" + "\t.4byte _0809C7C4\n" + "\t.4byte _0809C7C8\n" + "\t.4byte _0809C7CC\n" + "_0809C7BC:\n" + "\tmovs r0, 0xB\n" + "\tb _0809C84C\n" + "_0809C7C0:\n" + "\tmovs r0, 0xC\n" + "\tb _0809C84C\n" + "_0809C7C4:\n" + "\tmovs r0, 0xD\n" + "\tb _0809C84C\n" + "_0809C7C8:\n" + "\tmovs r0, 0xE\n" + "\tb _0809C84C\n" + "_0809C7CC:\n" + "\tmovs r0, 0xF\n" + "\tb _0809C84C\n" + "_0809C7D0:\n" + "\tldr r2, _0809C7EC @ =gMain\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7F8\n" + "\tldr r0, _0809C7F0 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldrb r0, [r0, 0x5]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C7F4\n" + "\tmovs r0, 0x10\n" + "\tb _0809C84C\n" + "\t.align 2, 0\n" + "_0809C7EC: .4byte gMain\n" + "_0809C7F0: .4byte gPokemonStorageSystemPtr\n" + "_0809C7F4:\n" + "\tmovs r3, 0x1\n" + "\tmov r9, r3\n" + "_0809C7F8:\n" + "\tmov r0, r9\n" + "\tcmp r0, 0\n" + "\tbeq _0809C80A\n" + "\tmovs r1, 0x6\n" + "\tmov r8, r1\n" + "\tmovs r2, 0\n" + "\tmov r10, r2\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "_0809C80A:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C83C\n" + "\tbl sub_809CD88\n" + "\tmovs r0, 0\n" + "\tb _0809C84C\n" + "_0809C81C:\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xFF\n" + "\tlsls r3, 24\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r0, 0\n" + "\tbge _0809C82C\n" + "\tmovs r4, 0x6\n" + "_0809C82C:\n" + "\tlsls r0, r4, 24\n" + "\tasrs r0, 24\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r7, r1]\n" + "\tcmp r0, r1\n" + "\tbeq _0809C83C\n" + "\tmovs r0, 0x1\n" + "\tmov r8, r0\n" + "_0809C83C:\n" + "\tmov r1, r8\n" + "\tcmp r1, 0\n" + "\tbeq _0809C84A\n" + "_0809C842:\n" + "\tmov r0, r10\n" + "\tadds r1, r4, 0\n" + "\tbl sub_809AF18\n" + "_0809C84A:\n" + "\tmov r0, r8\n" + "_0809C84C:\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif -- cgit v1.2.3 From 796d331df605f17b3e5d89d494d89ce7a907eaab Mon Sep 17 00:00:00 2001 From: Thomas Winwood Date: Mon, 22 Jan 2018 06:35:10 +0000 Subject: Use BATTLE_TYPE_DOUBLE constant in guard.c --- src/battle/anim/guard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c index ab093eab1..01cf07e39 100644 --- a/src/battle/anim/guard.c +++ b/src/battle/anim/guard.c @@ -12,7 +12,7 @@ extern u16 gBattleTypeFlags; void sub_80D3014(struct Sprite *sprite) { - if ((gBattleTypeFlags & 1) && IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) { sub_807A3FC(gAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y); sprite->pos1.y += 40; -- cgit v1.2.3 From 4e98ffed3339ca9fd7c4f0915da707aa8b2417ef Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 14:54:37 -0500 Subject: through sub_80C8604 --- src/battle/contest_link_80C857C.c | 46 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 616a72d27..e0b24b9e1 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -1,6 +1,52 @@ #include "global.h" +#include "ewram.h" +#include "task.h" #include "link.h" +void sub_80C8644(u8 taskId); + +void sub_80C857C(const void *data, u16 size) +{ + memcpy(eContestLinkSendBuffer, data, size); + SendBlock(bitmask_all_link_players_but_self(), eContestLinkSendBuffer, size); +} + +bool8 sub_80C85AC(u8 who) +{ + u8 flag = 1 << who; + if (!(GetBlockReceivedStatus() & flag)) + return FALSE; + ResetBlockReceivedFlag(flag); + return TRUE; +} + +bool8 sub_80C85D8(void) +{ + int i; + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (!((GetBlockReceivedStatus() >> i) & 1)) + return FALSE; + } + ResetBlockReceivedFlags(); + return TRUE; +} + +void sub_80C8604(u8 taskId) +{ +#if ENGLISH + u8 i; + + for (i = 0; i < 4; i++) + gBlockRecvBuffer[i][0] = 0xff; +#endif + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80C8644; +} + +asm(".section .text_de"); + #if GERMAN void de_sub_80C9274(bool32 arg0) -- cgit v1.2.3 From fc504ce61b8698bc4777bbd37a8766b8c35a5814 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 15:51:57 -0500 Subject: through (nonmatching) sub_80C86A0 --- src/battle/contest_link_80C857C.c | 150 +++++++++++++++++++++++++++++++++++++- 1 file changed, 149 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index e0b24b9e1..3360ecbb6 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -1,9 +1,13 @@ #include "global.h" #include "ewram.h" #include "task.h" +#include "contest.h" +#include "text.h" +#include "string_util.h" #include "link.h" -void sub_80C8644(u8 taskId); +static void sub_80C8644(u8 taskId); +static void sub_80C8660(u8 taskId); void sub_80C857C(const void *data, u16 size) { @@ -45,6 +49,150 @@ void sub_80C8604(u8 taskId) gTasks[taskId].func = sub_80C8644; } +static void sub_80C8644(u8 taskId) +{ + gTasks[taskId].func = sub_80C8660; +} + +static void sub_80C8660(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers) + { + gContestPlayerMonIndex = GetMultiplayerId(); + if (GetLinkPlayerCount() == MAX_LINK_PLAYERS) + { + gIsLinkContest = TRUE; + SwitchTaskToFollowupFunc(taskId); + } + } +} + +#ifdef NONMATCHING +u8 sub_80C86A0(const u8 *string) +{ + u8 language = GAME_LANGUAGE; + if (string[0] == EXT_CTRL_CODE_BEGIN && string[1] == 0x15) + return language; + if (StringLength(string) > 5) + return language; + for (; *string != EOS; string++) + { + if (!((*string >= CHAR_A && *string <= CHAR_z) || + (*string >= CHAR_0 + 0 && *string <= CHAR_0 + 9) || + *string == CHAR_SPACE || + *string == CHAR_PERIOD || + *string == CHAR_COMMA || + *string == 0xAB || + *string == CHAR_QUESTION_MARK || + *string == CHAR_MALE || + *string == CHAR_FEMALE || + *string == CHAR_SLASH || + *string == CHAR_HYPHEN || + *string == CHAR_ELLIPSIS || + *string == 0xB1 || + *string == 0xB2 || + *string == 0xB3 || + *string == 0xB1 + )) + { + language = LANGUAGE_JAPANESE; + break; + } + } + return language; +} +#else +__attribute__((naked)) u8 sub_80C86A0(const u8 *string) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tadds r4, r0, 0\n" + ".ifdef ENGLISH\n" + "\tmovs r5, 0x2\n" + ".else\n" + "\tmovs r5, 0x5\n" + ".endif\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFC\n" + "\tbne _080C86B6\n" + "\tldrb r0, [r4, 0x1]\n" + "\tcmp r0, 0x15\n" + "\tbne _080C86B6\n" + ".ifdef ENGLISH\n" + "\tmovs r0, 0x2\n" + ".else\n" + "\tmovs r0, 0x5\n" + ".endif\n" + "\tb _080C872C\n" + "_080C86B6:\n" + "\tadds r0, r4, 0\n" + "\tbl StringLength\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x5\n" + "\tbhi _080C872A\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFF\n" + "\tbeq _080C872A\n" + "_080C86CA:\n" + "\tldrb r1, [r4]\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x45\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x33\n" + "\tbls _080C871E\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x5F\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x9\n" + "\tbls _080C871E\n" + "\tadds r0, r1, 0\n" + "\tcmp r0, 0\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAD\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB8\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAB\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAC\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB5\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB6\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xBA\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xAE\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB0\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB1\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB2\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB3\n" + "\tbeq _080C871E\n" + "\tcmp r0, 0xB1\n" + "\tbne _080C8728\n" + "_080C871E:\n" + "\tadds r4, 0x1\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFF\n" + "\tbne _080C86CA\n" + "\tb _080C872A\n" + "_080C8728:\n" + "\tmovs r5, 0x1\n" + "_080C872A:\n" + "\tadds r0, r5, 0\n" + "_080C872C:\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + asm(".section .text_de"); #if GERMAN -- cgit v1.2.3 From b2ea9aec023be26a83853ca53134ce78b95ac2e6 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 17:33:02 -0500 Subject: sub_80C8734 --- src/battle/contest_link_80C857C.c | 104 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 3360ecbb6..b86e7bb9c 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -8,6 +8,10 @@ static void sub_80C8644(u8 taskId); static void sub_80C8660(u8 taskId); +#if GERMAN +void de_sub_80C9274(bool32 arg0); +void de_sub_80C9294(bool32 arg0); +#endif void sub_80C857C(const void *data, u16 size) { @@ -193,6 +197,106 @@ __attribute__((naked)) u8 sub_80C86A0(const u8 *string) } #endif +void sub_80C8734(u8 taskId) +{ + int i; + u8 *name; + + switch (gTasks[taskId].data[0]) { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + if (GetMultiplayerId() == 0) { + if (sub_8007ECC()) { +#if GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { +#endif + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); +#if GERMAN + de_sub_80C9274(FALSE); +#endif + sub_8007E9C(2); +#if GERMAN + gTasks[taskId].data[0] = 1; + } +#else + gTasks[taskId].data[0]++; +#endif + } + } + else + { + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); +#if GERMAN + de_sub_80C9294(FALSE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + memcpy(gContestMons + i, gBlockRecvBuffer[i], sizeof(struct ContestPokemon)); + name = gContestMons[i].nickname; + if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + ConvertInternationalString(name, sub_80C86A0(name)); + } + else if (name[10] == EXT_CTRL_CODE_BEGIN) + { + ConvertInternationalString(name, LANGUAGE_JAPANESE); + } else + { + name[5] = name[10]; + name[10] = EOS; + } + name = gContestMons[i].trainerName; + if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + name[7] = EOS; + name[6] = name[4]; + name[5] = name[3]; + name[4] = name[2]; + name[3] = name[1]; + name[2] = name[0]; + name[1] = 0x15; + name[0] = EXT_CTRL_CODE_BEGIN; + } + else + { + name[5] = name[7]; + name[7] = EOS; + } + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif + } +} + + asm(".section .text_de"); #if GERMAN -- cgit v1.2.3 From 84769240d2002281c7bc274f18aab76fbe908483 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 18:04:04 -0500 Subject: sub_80C88AC --- src/battle/contest_link_80C857C.c | 33 +++++++++++++++++++++++++++++++++ src/contest.c | 6 +++--- src/script_pokemon_util_80C4BF0.c | 6 +++--- 3 files changed, 39 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index b86e7bb9c..937193172 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -1,5 +1,6 @@ #include "global.h" #include "ewram.h" +#include "random.h" #include "task.h" #include "contest.h" #include "text.h" @@ -296,6 +297,38 @@ void sub_80C8734(u8 taskId) } } +void sub_80C88AC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (GetMultiplayerId() == 0) + { + if (sub_8007ECC()) + { + sub_80C857C(&gRngValue, sizeof(u32)); + gTasks[taskId].data[0]++; + } + } + else + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85AC(0)) + { + memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(u32)); + memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(u32)); + gTasks[taskId].data[0]++; + } + break; + } +} asm(".section .text_de"); diff --git a/src/contest.c b/src/contest.c index 93d1a8efc..ce29d80b0 100644 --- a/src/contest.c +++ b/src/contest.c @@ -59,7 +59,7 @@ extern u16 gBattle_BG0_Y; extern u16 gBattle_BG0_X; extern u16 gBattle_BG1_X; extern u16 gBattle_WIN0H; -extern u32 gUnknown_03005D28; // saved RNG value +extern u32 gContestRngValue; // saved RNG value extern struct SpriteTemplate gUnknown_02024E8C; @@ -495,7 +495,7 @@ void sub_80AB6B4(u8 taskId) GetMultiplayerId(); // unused return value DestroyTask(taskId); gTasks[sContest.mainTaskId].func = sub_80AB960; - gRngValue = gUnknown_03005D28; + gRngValue = gContestRngValue; } } @@ -1812,7 +1812,7 @@ void sub_80ADDA4(u8 taskId) sub_80AF668(); sub_80AF138(); sub_80BE23C(sContestantStatus[gContestPlayerMonIndex].prevMove); - gUnknown_03005D28 = gRngValue; + gContestRngValue = gRngValue; StringExpandPlaceholders(gStringVar4, gUnknown_083CB02C); Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15); gTasks[taskId].data[2] = 0; diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c index f991297ab..e51bc3522 100644 --- a/src/script_pokemon_util_80C4BF0.c +++ b/src/script_pokemon_util_80C4BF0.c @@ -45,7 +45,7 @@ extern u16 gSpecialVar_ContestCategory; extern u16 gSpecialVar_ContestRank; extern u16 gSpecialVar_Result; -extern u32 gUnknown_03005D28; +extern u32 gContestRngValue; extern u8 gUnknown_02038694; extern u8 gUnknown_0203856C; @@ -373,8 +373,8 @@ void ScriptRandom(void) if(gIsLinkContest & 1) { - gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691; - random = gUnknown_03005D28 >> 16; + gContestRngValue = 1103515245 * gContestRngValue + 24691; + random = gContestRngValue >> 16; scriptPtr = &gSpecialVar_Result; } else -- cgit v1.2.3 From 9474c491c070fe38e89f7b3848a5820c763fe045 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 19:03:23 -0500 Subject: sub_80C8938 --- src/battle/contest_link_80C857C.c | 68 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 937193172..17b82388c 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -330,6 +330,74 @@ void sub_80C88AC(u8 taskId) } } +void sub_80C8938(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + gBlockSendBuffer[0] = gTasks[taskId].data[9]; + if (GetMultiplayerId() == 0) + { + if (sub_8007ECC()) + { +#if GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { + de_sub_80C9274(TRUE); +#endif + sub_8007E9C(2); +#if ENGLISH + gTasks[taskId].data[0]++; +#elif GERMAN + gTasks[taskId].data[0] = 1; + } +#endif + } + } + else + { +#if GERMAN + de_sub_80C9294(TRUE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif + } +} + asm(".section .text_de"); #if GERMAN -- cgit v1.2.3 From 5312cf566196e662aa7edd4ef68f32922eb54180 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 19:20:26 -0500 Subject: through sub_80C8A38 --- src/battle/contest_link_80C857C.c | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 17b82388c..cef290adf 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -398,6 +398,60 @@ void sub_80C8938(u8 taskId) } } +void sub_80C89DC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (sub_8007ECC()) + { + sub_80C857C(&gContestPlayerMonIndex, sizeof(u8)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + gTasks[taskId].data[0]++; + } + break; + } +} + +void sub_80C8A38(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (sub_8007ECC()) + { + sub_80C857C(&sContestantStatus[gContestPlayerMonIndex].currMove, sizeof(u16)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + *&sContestantStatus[i].currMove = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; + } +} + asm(".section .text_de"); #if GERMAN -- cgit v1.2.3 From cbab0f740349cbeece60f2155537c2a9870d2318 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 20:24:02 -0500 Subject: sub_80C8AD0 --- src/battle/contest_link_80C857C.c | 77 +++++++++++++++++++++++++++++++++++++++ src/debug/matsuda_debug_menu.c | 8 ---- src/script_pokemon_util_80C4BF0.c | 12 ------ 3 files changed, 77 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index cef290adf..465bb0487 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -452,6 +452,83 @@ void sub_80C8A38(u8 taskId) } } +void sub_80C8AD0(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (sub_8007ECC()) + { + sub_80C857C(gUnknown_02038678, sizeof gUnknown_02038678); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + memcpy(gUnknown_02038678, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038678); + gTasks[taskId].data[0]++; + } + break; + case 2: + case 5: + case 8: + case 11: + if (gTasks[taskId].data[1]++ > 10) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + if (sub_8007ECC()) + { + sub_80C857C(gUnknown_02038680, sizeof gUnknown_02038680); + gTasks[taskId].data[0]++; + } + break; + case 4: + if (sub_80C85D8()) + { + memcpy(gUnknown_02038680, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038680); + gTasks[taskId].data[0]++; + } + break; + case 6: + if (sub_8007ECC()) + { + sub_80C857C(gUnknown_02038688, sizeof gUnknown_02038688); + gTasks[taskId].data[0]++; + } + break; + case 7: + if (sub_80C85D8()) + { + memcpy(gUnknown_02038688, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038688); + gTasks[taskId].data[0]++; + } + break; + case 9: + if (sub_8007ECC()) + { + sub_80C857C(gContestFinalStandings, sizeof gContestFinalStandings); + gTasks[taskId].data[0]++; + } + break; + case 10: + if (sub_80C85D8()) + { + memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_0203869B], sizeof gContestFinalStandings); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + asm(".section .text_de"); #if GERMAN diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c index da1937adb..15d28df09 100644 --- a/src/debug/matsuda_debug_menu.c +++ b/src/debug/matsuda_debug_menu.c @@ -19,13 +19,7 @@ extern u8 gUnknown_0203856C; extern s16 gUnknown_02038670[]; -extern s16 gUnknown_02038678[]; -extern s16 gUnknown_02038680[]; -extern u8 gContestFinalStandings[]; extern u8 gUnknown_02038694; -extern u8 gIsLinkContest; -extern u8 gUnknown_0203869B; -extern u8 gContestPlayerMonIndex; extern u16 gSpecialVar_ContestCategory; extern u16 gSpecialVar_ContestRank; @@ -40,8 +34,6 @@ extern u16 gBattle_BG3_Y; extern u8 (*gMenuCallback)(void); -extern bool8 gReceivedRemoteLinkPlayers; - static bool8 sub_80A9B78(void); static void sub_80A9BE4(u8 taskId); static void sub_80A9C98(u8); diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c index e51bc3522..513f6ce2a 100644 --- a/src/script_pokemon_util_80C4BF0.c +++ b/src/script_pokemon_util_80C4BF0.c @@ -32,26 +32,14 @@ extern void sub_80C4698(u8 *, u8); extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gContestPlayerMonIndex; -extern u8 gIsLinkContest; -extern u8 gPlayerPartyCount; extern u8 gSelectedOrderFromParty[]; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - extern u16 gSpecialVar_ContestCategory; extern u16 gSpecialVar_ContestRank; -extern u16 gSpecialVar_Result; - -extern u32 gContestRngValue; extern u8 gUnknown_02038694; extern u8 gUnknown_0203856C; -extern u8 gContestFinalStandings[]; extern s16 gUnknown_02038670[]; -extern s16 gUnknown_02038678[]; void SetContestTrainerGfxIds(void) { -- cgit v1.2.3 From 399856bc7ead101718891712dd20dd85e138e640 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 20:30:31 -0500 Subject: sub_80C8C80 --- src/battle/contest_link_80C857C.c | 77 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 465bb0487..84695fb37 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -529,6 +529,83 @@ void sub_80C8AD0(u8 taskId) } } +void sub_80C8C80(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (sub_8007ECC()) + { + sub_80C857C(sContestantStatus, 4 * sizeof(struct ContestantStatus)); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + memcpy(sContestantStatus, gBlockRecvBuffer[gUnknown_0203869B], 4 * sizeof(struct ContestantStatus)); + gTasks[taskId].data[0]++; + } + break; + case 2: + case 5: + case 8: + case 11: + if (gTasks[taskId].data[1]++ > 10) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + if (sub_8007ECC()) + { + sub_80C857C(&shared192D0, sizeof shared192D0); + gTasks[taskId].data[0]++; + } + break; + case 4: + if (sub_80C85D8()) + { + memcpy(&shared192D0, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared192D0); + gTasks[taskId].data[0]++; + } + break; + case 6: + if (sub_8007ECC()) + { + sub_80C857C(&shared19328, sizeof shared19328); + gTasks[taskId].data[0]++; + } + break; + case 7: + if (sub_80C85D8()) + { + memcpy(&shared19328, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared19328); + gTasks[taskId].data[0]++; + } + break; + case 9: + if (sub_8007ECC()) + { + sub_80C857C(gUnknown_02038696, sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + case 10: + if (sub_80C85D8()) + { + memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + } +} + asm(".section .text_de"); #if GERMAN -- cgit v1.2.3 From bcba136599ff2cecf4eeb0e6d592186509a98a59 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Mon, 22 Jan 2018 19:33:29 -0600 Subject: disassemble debug Blender_PrintBlendingResults --- src/scene/berry_blender.c | 487 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 483 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index 2535f02a6..5b013e8de 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -274,7 +274,7 @@ static void sub_8051B18(void); static void sub_805123C(void); static void sub_8050954(void); static bool8 Blender_PrintBlendingRanking(void); -static bool8 Blender_PrintBlendingResults(void); +bool8 Blender_PrintBlendingResults(void); static void sub_80510E8(void); static void sub_8050E30(void); static void sub_805197C(u16 a0, u16 a1); @@ -3278,10 +3278,489 @@ static void sub_8051C04(struct Sprite* sprite) #if DEBUG __attribute__((naked)) -static bool8 Blender_PrintBlendingResults(void) +bool8 Blender_PrintBlendingResults(void) { - // TODO: disassemble this! - asm(".incbin \"baserom_de_debug.gba\", 0x56178, 0x5655C-0x56178"); + asm(".syntax unified\n\ +loc_8056178:\n\ + PUSH {R4-R7,LR}\n\ + MOV R7, R10\n\ + MOV R6, R9\n\ + MOV R5, R8\n\ + PUSH {R5-R7}\n\ + SUB SP, SP, #0x34\n\ + LDR R1, off_805619C\n\ + LDR R0, [R1]\n\ + LDRB R0, [R0]\n\ + ADDS R2, R1, #0\n\ + CMP R0, #6 @ switch 7 cases\n\ + BLS loc_8056192\n\ + B def_805619A @ jumptable 0805619A default case\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_8056192:\n\ + LSLS R0, R0, #2\n\ + LDR R1, off_80561A0\n\ + ADDS R0, R0, R1\n\ + LDR R0, [R0]\n\ + MOV PC, R0 @ switch jump\n\ +@ ---------------------------------------------------------------------------\n\ +off_805619C: .4byte gBerryBlenderData\n\ +off_80561A0: .4byte jpt_805619A\n\ +jpt_805619A: .4byte loc_80561C0 @ jump table for switch statement\n\ + .4byte loc_80561D6 @ jumptable 0805619A case 1\n\ + .4byte loc_80561F0 @ jumptable 0805619A case 2\n\ + .4byte loc_8056240 @ jumptable 0805619A case 3\n\ + .4byte loc_805645C @ jumptable 0805619A case 4\n\ + .4byte loc_8056470 @ jumptable 0805619A case 5\n\ + .4byte loc_8056538 @ jumptable 0805619A case 6\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_80561C0: @ jumptable 0805619A case 0\n\ + LDR R1, [R2]\n\ + LDRB R0, [R1]\n\ + ADDS R0, #1\n\ + STRB R0, [R1]\n\ + LDR R0, [R2]\n\ + MOVS R1, #0x98\n\ + LSLS R1, R1, #1\n\ + ADDS R0, R0, R1\n\ + MOVS R1, #0x11\n\ + STR R1, [R0]\n\ + B def_805619A @ jumptable 0805619A default case\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_80561D6: @ jumptable 0805619A case 1\n\ + LDR R1, [R2]\n\ + MOVS R0, #0x98\n\ + LSLS R0, R0, #1\n\ + ADDS R2, R1, R0\n\ + LDR R0, [R2]\n\ + SUBS R0, #0xA\n\ + STR R0, [R2]\n\ + CMP R0, #0\n\ + BLT loc_80561EA\n\ + B def_805619A @ jumptable 0805619A default case\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_80561EA:\n\ + MOVS R0, #0\n\ + STR R0, [R2]\n\ + B loc_8056520\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_80561F0: @ jumptable 0805619A case 2\n\ + LDR R1, [R2]\n\ + MOVS R2, #0x98\n\ + LSLS R2, R2, #1\n\ + ADDS R1, R1, R2\n\ + LDR R0, [R1]\n\ + ADDS R0, #1\n\ + STR R0, [R1]\n\ + CMP R0, #0x14\n\ + BGT loc_8056204\n\ + B def_805619A @ jumptable 0805619A default case\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_8056204:\n\ + MOVS R6, #0\n\ +\n\ +loc_8056206:\n\ + LDR R4, off_8056238\n\ + LDR R0, [R4]\n\ + ADDS R0, #0x50\n\ + ADDS R0, R0, R6\n\ + LDRB R1, [R0]\n\ + LSLS R0, R1, #4\n\ + ADDS R0, R0, R1\n\ + LSLS R0, R0, #2\n\ + LDR R1, off_805623C\n\ + ADDS R0, R0, R1\n\ + BL DestroySprite\n\ + ADDS R0, R6, #1\n\ + LSLS R0, R0, #0x10\n\ + LSRS R6, R0, #0x10\n\ + CMP R6, #2\n\ + BLS loc_8056206\n\ + LDR R1, [R4]\n\ + MOVS R0, #0x98\n\ + LSLS R0, R0, #1\n\ + ADDS R2, R1, R0\n\ + MOVS R0, #0\n\ + STR R0, [R2]\n\ + B loc_8056520\n\ +@ ---------------------------------------------------------------------------\n\ + .align 2, 0\n\ +off_8056238: .4byte gBerryBlenderData\n\ +off_805623C: .4byte gSprites\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_8056240: @ jumptable 0805619A case 3\n\ + MOVS R0, #4\n\ + MOVS R1, #2\n\ + MOVS R2, #0x19\n\ + MOVS R3, #0x11\n\ + BL Menu_DrawStdWindowFrame\n\ + LDR R0, dword_805642C\n\ + MOVS R1, #5\n\ + MOVS R2, #3\n\ + MOVS R3, #0xA0\n\ + BL sub_8072BD8\n\ + MOVS R6, #0\n\ + LDR R1, off_8056430\n\ + LDR R0, [R1]\n\ + ADDS R0, #0x88\n\ + ADD R2, SP, #0xC\n\ + MOV R8, R2\n\ + MOV R2, SP\n\ + ADDS R2, #0x16\n\ + STR R2, [SP,#0x30]\n\ + LDRB R0, [R0]\n\ + CMP R6, R0\n\ + BCS loc_8056322\n\ + MOV R9, R1\n\ + LDR R0, off_8056434\n\ + MOV R10, R0\n\ +\n\ +loc_8056276:\n\ + MOV R1, R9\n\ + LDR R2, [R1]\n\ + MOVS R1, #0xB2\n\ + LSLS R1, R1, #1\n\ + ADDS R0, R2, R1\n\ + ADDS R0, R0, R6\n\ + LDRB R4, [R0]\n\ + LSLS R1, R4, #4\n\ + ADDS R1, R1, R2\n\ + MOVS R2, #0xBF\n\ + LSLS R2, R2, #1\n\ + ADDS R1, R1, R2\n\ + MOV R0, R8\n\ + BL StringCopy\n\ + LSLS R5, R4, #3\n\ + SUBS R5, R5, R4\n\ + LSLS R5, R5, #2\n\ + MOV R1, R10\n\ + ADDS R0, R5, R1\n\ + LDRB R1, [R0,#0x1A]\n\ + MOV R0, R8\n\ + BL ConvertInternationalString\n\ + MOV R0, R8\n\ + LDR R1, dword_8056438\n\ + BL de_sub_8073174\n\ + MOV R2, R9\n\ + LDR R0, [R2]\n\ + ADDS R7, R0, #0\n\ + ADDS R7, #0xAB\n\ + ADDS R4, R6, #1\n\ + ADDS R0, R7, #0\n\ + ADDS R1, R4, #0\n\ + BL ConvertIntToDecimalString\n\ + ADDS R7, R0, #0\n\ + MOVS R1, #0\n\ + STRB R1, [R7]\n\ + MOVS R0, #0xAD\n\ + STRB R0, [R7,#1]\n\ + STRB R1, [R7,#2]\n\ + ADDS R7, #3\n\ + LDR R0, off_805643C\n\ + ADDS R5, R5, R0\n\ + ADDS R0, R7, #0\n\ + ADDS R1, R5, #0\n\ + MOVS R2, #0x58\n\ + MOVS R3, #0\n\ + BL sub_8072C74\n\ + ADDS R7, R0, #0\n\ + ADD R1, SP, #0xC\n\ + MOVS R2, #0x9D\n\ + MOVS R3, #0\n\ + BL sub_8072C74\n\ + MOV R2, R9\n\ + LDR R1, [R2]\n\ + ADDS R0, R1, #0\n\ + ADDS R0, #0xAB\n\ + LDR R3, dword_8056440\n\ + ADDS R1, #0x88\n\ + LDRB R2, [R1]\n\ + ADDS R3, R2, R3\n\ + LDR R1, dword_8056444\n\ + ADDS R2, R2, R1\n\ + LDRB R1, [R2]\n\ + ADDS R2, R6, #0\n\ + MULS R2, R1\n\ + LDRB R3, [R3]\n\ + ADDS R2, R2, R3\n\ + LSLS R2, R2, #0x18\n\ + LSRS R2, R2, #0x18\n\ + MOVS R1, #5\n\ + BL Menu_PrintText\n\ + LSLS R4, R4, #0x10\n\ + LSRS R6, R4, #0x10\n\ + MOV R1, R9\n\ + LDR R0, [R1]\n\ + ADDS R0, #0x88\n\ + LDRB R0, [R0]\n\ + CMP R6, R0\n\ + BCC loc_8056276\n\ +\n\ +loc_8056322:\n\ + LDR R6, off_8056430\n\ + LDR R0, [R6]\n\ + ADDS R0, #0x5A\n\ + LDRH R0, [R0]\n\ + MOVS R1, #0x64\n\ + BL __umodsi3\n\ + ADDS R1, R0, #0\n\ + LSLS R1, R1, #0x10\n\ + LSRS R1, R1, #0x10\n\ + MOV R0, R8\n\ + MOVS R2, #2\n\ + MOVS R3, #2\n\ + BL ConvertIntToDecimalStringN\n\ + LDR R0, [R6]\n\ + ADDS R7, R0, #0\n\ + ADDS R7, #0xAB\n\ + LDR R1, dword_8056448\n\ + ADDS R0, R7, #0\n\ + BL StringCopy\n\ + ADDS R7, R0, #0\n\ + LDR R0, [R6]\n\ + ADDS R0, #0x5A\n\ + LDRH R0, [R0]\n\ + MOVS R1, #0x64\n\ + BL __udivsi3\n\ + ADDS R1, R0, #0\n\ + LSLS R1, R1, #0x10\n\ + LSRS R1, R1, #0x10\n\ + ADDS R0, R7, #0\n\ + MOVS R2, #0x79\n\ + MOVS R3, #1\n\ + BL sub_8072C14\n\ + ADDS R7, R0, #0\n\ + MOVS R0, #0xB8\n\ + STRB R0, [R7]\n\ + ADDS R7, #1\n\ + ADDS R0, R7, #0\n\ + MOV R1, R8\n\ + MOVS R2, #0x88\n\ + MOVS R3, #1\n\ + BL sub_8072C74\n\ + ADDS R7, R0, #0\n\ + LDR R1, off_805644C\n\ + BL StringCopy\n\ + LDR R0, [R6]\n\ + ADDS R0, #0xAB\n\ + MOVS R1, #5\n\ + MOVS R2, #0xD\n\ + BL Menu_PrintText\n\ + LDR R0, [R6]\n\ + MOVS R2, #0x96\n\ + LSLS R2, R2, #1\n\ + ADDS R0, R0, R2\n\ + LDR R0, [R0]\n\ + MOVS R1, #0x3C\n\ + BL __udivsi3\n\ + ADDS R4, R0, #0\n\ + LSLS R4, R4, #0x10\n\ + LSRS R4, R4, #0x10\n\ + ADDS R0, R4, #0\n\ + MOVS R1, #0x3C\n\ + BL __umodsi3\n\ + ADDS R5, R0, #0\n\ + LSLS R5, R5, #0x10\n\ + LSRS R5, R5, #0x10\n\ + ADDS R0, R4, #0\n\ + MOVS R1, #0x3C\n\ + BL __udivsi3\n\ + ADDS R1, R0, #0\n\ + LSLS R1, R1, #0x10\n\ + LSRS R1, R1, #0x10\n\ + MOV R0, R8\n\ + MOVS R2, #2\n\ + MOVS R3, #2\n\ + BL ConvertIntToDecimalStringN\n\ + LDR R0, [SP,#0x30]\n\ + ADDS R1, R5, #0\n\ + MOVS R2, #2\n\ + MOVS R3, #2\n\ + BL ConvertIntToDecimalStringN\n\ + LDR R0, [R6]\n\ + ADDS R7, R0, #0\n\ + ADDS R7, #0xAB\n\ + LDR R1, dword_8056450\n\ + ADDS R0, R7, #0\n\ + BL StringCopy\n\ + ADDS R7, R0, #0\n\ + MOV R1, R8\n\ + MOVS R2, #0x63\n\ + MOVS R3, #1\n\ + BL sub_8072C74\n\ + ADDS R7, R0, #0\n\ + LDR R1, dword_8056454\n\ + BL StringAppend\n\ + ADDS R7, R0, #0\n\ + LDR R1, [SP,#0x30]\n\ + MOVS R2, #0x88\n\ + MOVS R3, #1\n\ + BL sub_8072C74\n\ + ADDS R7, R0, #0\n\ + LDR R1, dword_8056458\n\ + BL StringCopy\n\ + LDR R0, [R6]\n\ + ADDS R0, #0xAB\n\ + MOVS R1, #5\n\ + MOVS R2, #0xF\n\ + BL Menu_PrintText\n\ + LDR R1, [R6]\n\ + MOVS R0, #0x98\n\ + LSLS R0, R0, #1\n\ + ADDS R2, R1, R0\n\ + MOVS R0, #0\n\ + STR R0, [R2]\n\ + B loc_8056520\n\ +@ ---------------------------------------------------------------------------\n\ +dword_805642C: .4byte gOtherText_ResultsOfBlending\n\ +off_8056430: .4byte gBerryBlenderData\n\ +off_8056434: .4byte gLinkPlayers\n\ +dword_8056438: .4byte gOtherText_Berry\n\ +off_805643C: .4byte gLinkPlayers+0x8\n\ +dword_8056440: .4byte gUnknown_082165E9\n\ +dword_8056444: .4byte gUnknown_082165EE\n\ +dword_8056448: .4byte gOtherText_MaxSpeed\n\ +off_805644C: .4byte gOtherText_RPM\n\ +dword_8056450: .4byte gOtherText_RequiredTime\n\ +dword_8056454: .4byte gOtherText_Min\n\ +dword_8056458: .4byte gOtherText_Sec\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_805645C: @ jumptable 0805619A case 4\n\ + LDR R0, off_805646C\n\ + LDRH R1, [R0,#0x2E]\n\ + MOVS R0, #1\n\ + ANDS R0, R1\n\ + CMP R0, #0\n\ + BEQ def_805619A @ jumptable 0805619A default case\n\ + LDR R1, [R2]\n\ + B loc_8056520\n\ +@ ---------------------------------------------------------------------------\n\ +off_805646C: .4byte gMain\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_8056470: @ jumptable 0805619A case 5\n\ + BL Menu_EraseScreen\n\ + MOVS R0, #0\n\ + MOVS R1, #0xE\n\ + MOVS R2, #0x1D\n\ + MOVS R3, #0x13\n\ + BL Menu_DrawStdWindowFrame\n\ + MOVS R6, #0\n\ + ADD R1, SP, #0xC\n\ + MOV R8, R1\n\ + ADD R5, SP, #0x28\n\ + LDR R0, off_8056528\n\ + LDR R0, [R0]\n\ + ADDS R3, R0, #0\n\ + ADDS R3, #0x80\n\ + ADD R2, SP, #0x20\n\ +\n\ +loc_8056492:\n\ + LSLS R1, R6, #1\n\ + ADDS R0, R3, R1\n\ + LDRH R0, [R0]\n\ + CMP R0, #0\n\ + BEQ loc_80564A2\n\ + ADDS R1, R2, R1\n\ + SUBS R0, #0x85\n\ + STRH R0, [R1]\n\ +\n\ +loc_80564A2:\n\ + ADDS R0, R6, #1\n\ + LSLS R0, R0, #0x10\n\ + LSRS R6, R0, #0x10\n\ + CMP R6, #3\n\ + BLS loc_8056492\n\ + BL sub_8050760\n\ + LDR R4, off_8056528\n\ + LDR R3, [R4]\n\ + MOVS R2, #0xBE\n\ + LSLS R2, R2, #1\n\ + ADDS R0, R3, R2\n\ + ADDS R1, R3, #0\n\ + ADDS R1, #0x88\n\ + LDRB R2, [R1]\n\ + SUBS R1, #0x2E\n\ + LDRH R1, [R1]\n\ + STR R1, [SP]\n\ + ADDS R1, R5, #0\n\ + ADD R3, SP, #4\n\ + BL Blender_CalculatePokeblock\n\ + LDR R1, [R4]\n\ + ADDS R1, #0xAB\n\ + ADDS R0, R5, #0\n\ + BL Blender_PrintMadePokeblockString\n\ + LDR R0, off_805652C\n\ + MOVS R1, #6\n\ + BL CreateTask\n\ + BL sub_8007E40\n\ + ADDS R1, R0, #0\n\ + MOV R0, R8\n\ + MOVS R2, #0\n\ + MOVS R3, #4\n\ + BL ConvertIntToHexStringN\n\ + LDR R1, dword_8056530\n\ + MOV R0, R8\n\ + BL StringAppend\n\ + LDR R0, [R4]\n\ + ADDS R0, #0xAB\n\ + MOV R1, R8\n\ + BL StringAppend\n\ + LDR R0, [R4]\n\ + ADDS R0, #0xAB\n\ + MOVS R1, #1\n\ + MOVS R2, #0xF\n\ + BL MenuPrintMessage\n\ + LDR R0, off_8056534\n\ + LDRH R0, [R0]\n\ + MOVS R1, #1\n\ + BL RemoveBagItem\n\ + ADDS R0, R5, #0\n\ + BL sub_810CA34\n\ + LDR R1, [R4]\n\ +\n\ +loc_8056520:\n\ + LDRB R0, [R1]\n\ + ADDS R0, #1\n\ + STRB R0, [R1]\n\ + B def_805619A @ jumptable 0805619A default case\n\ +@ ---------------------------------------------------------------------------\n\ +off_8056528: .4byte gBerryBlenderData\n\ +off_805652C: .4byte sub_8052BD0+1\n\ +dword_8056530: .4byte gUnknown_08216249\n\ +off_8056534: .4byte gSpecialVar_ItemId\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +loc_8056538: @ jumptable 0805619A case 6\n\ + BL Menu_UpdateWindowText\n\ + LSLS R0, R0, #0x18\n\ + CMP R0, #0\n\ + BEQ def_805619A @ jumptable 0805619A default case\n\ + BL Blender_TrySettingRecord\n\ + MOVS R0, #1\n\ + B loc_805654C\n\ +@ ---------------------------------------------------------------------------\n\ +\n\ +def_805619A: @ jumptable 0805619A default case\n\ + MOVS R0, #0\n\ +\n\ +loc_805654C:\n\ + ADD SP, SP, #0x34\n\ + POP {R3-R5}\n\ + MOV R8, R3\n\ + MOV R9, R4\n\ + MOV R10, R5\n\ + POP {R4-R7}\n\ + POP {R1}\n\ + BX R1\n\ + .syntax divided\n"); } #else static bool8 Blender_PrintBlendingResults(void) -- cgit v1.2.3 From 765b2ffe3f7f49e49cc416a930a6e60ee265ce14 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 20:38:05 -0500 Subject: sub_80C8E1C --- src/battle/contest_link_80C857C.c | 68 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 84695fb37..f505fa658 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -606,6 +606,74 @@ void sub_80C8C80(u8 taskId) } } +void sub_80C8E1C(u8 taskId) +{ + int i; + + switch (gTasks[taskId].data[0]) + { +#if ENGLISH + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; +#elif GERMAN + case 8: +#endif + case 0: + gBlockSendBuffer[0] = 0x64; + if (GetMultiplayerId() == 0) + { + if (sub_8007ECC()) + { +#if GERMAN + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[0] = 3; + } + else + { + de_sub_80C9274(FALSE); +#endif + sub_8007E9C(2); +#if ENGLISH + gTasks[taskId].data[0]++; +#else + gTasks[taskId].data[0] = 1; + } +#endif + } + } + else + { +#if GERMAN + de_sub_80C9294(FALSE); +#endif + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + gTasks[taskId].data[5 + i] = gBlockRecvBuffer[i][0]; + } + gTasks[taskId].data[0]++; + } + break; +#if GERMAN + case 2: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + default: + gTasks[taskId].data[0]++; + break; +#endif + } +} + asm(".section .text_de"); #if GERMAN -- cgit v1.2.3 From c723b341c50df19f8951353a7efd4ab83bf56833 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 20:52:41 -0500 Subject: through sub_80C8F34 --- src/battle/contest_link_80C857C.c | 60 +++++++++++++++++++++++++++++++++++---- src/contest_ai.c | 1 - src/debug/matsuda_debug_menu.c | 1 - src/script_pokemon_util_80C4BF0.c | 1 - 4 files changed, 54 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index f505fa658..e85350aea 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -228,11 +228,11 @@ void sub_80C8734(u8 taskId) de_sub_80C9274(FALSE); #endif sub_8007E9C(2); -#if GERMAN - gTasks[taskId].data[0] = 1; - } -#else +#if ENGLISH gTasks[taskId].data[0]++; +#elif GERMAN + gTasks[taskId].data[0] = 1; + } #endif } } @@ -638,7 +638,7 @@ void sub_80C8E1C(u8 taskId) sub_8007E9C(2); #if ENGLISH gTasks[taskId].data[0]++; -#else +#elif GERMAN gTasks[taskId].data[0] = 1; } #endif @@ -674,7 +674,55 @@ void sub_80C8E1C(u8 taskId) } } -asm(".section .text_de"); +void sub_80C8EBC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (sub_8007ECC()) + { + sub_80C857C(gUnknown_02038670, sizeof gUnknown_02038670); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + memcpy(gUnknown_02038670, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038670); + gTasks[taskId].data[0]++; + } + break; + } +} + +void sub_80C8F34(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + gTasks[taskId].data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 0: + if (sub_8007ECC()) + { + sub_80C857C(gUnknown_02038696, sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_80C85D8()) + { + memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); + gTasks[taskId].data[0]++; + } + break; + } +} #if GERMAN diff --git a/src/contest_ai.c b/src/contest_ai.c index 66b387270..1e249083b 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -8,7 +8,6 @@ extern u8 AreMovesContestCombo(u16, u16); extern bool8 sub_80B214C(u8); extern bool8 Contest_IsMonsTurnDisabled(u8); -extern s16 gUnknown_02038670[]; extern u16 gSpecialVar_ContestCategory; extern u8 *gAIScriptPtr; diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c index 15d28df09..efd952ef7 100644 --- a/src/debug/matsuda_debug_menu.c +++ b/src/debug/matsuda_debug_menu.c @@ -18,7 +18,6 @@ #include "ewram.h" extern u8 gUnknown_0203856C; -extern s16 gUnknown_02038670[]; extern u8 gUnknown_02038694; extern u16 gSpecialVar_ContestCategory; extern u16 gSpecialVar_ContestRank; diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c index 513f6ce2a..02e66d313 100644 --- a/src/script_pokemon_util_80C4BF0.c +++ b/src/script_pokemon_util_80C4BF0.c @@ -39,7 +39,6 @@ extern u16 gSpecialVar_ContestRank; extern u8 gUnknown_02038694; extern u8 gUnknown_0203856C; -extern s16 gUnknown_02038670[]; void SetContestTrainerGfxIds(void) { -- cgit v1.2.3 From cc0d7a675d5fc85adac3bd94387c54e0eb507495 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 22 Jan 2018 21:01:33 -0500 Subject: Rename some static functions --- src/battle/battle_2.c | 16 +++--- src/battle/contest_link_80C857C.c | 104 +++++++++++++++++++------------------- src/engine/link.c | 9 +--- src/engine/trade.c | 16 +++--- src/field/field_fadetransition.c | 2 +- src/rom3.c | 2 +- src/scene/berry_blender.c | 16 +++--- 7 files changed, 80 insertions(+), 85 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index b00c35312..2ad2adb04 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -396,7 +396,7 @@ void sub_800EC9C(void) case 0: if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished()) { gBattleStruct->unk0 = 1; gBattleStruct->unk1 = 1; @@ -464,7 +464,7 @@ void sub_800EC9C(void) } break; case 2: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2); gBattleCommunication[0]++; @@ -479,7 +479,7 @@ void sub_800EC9C(void) } break; case 4: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2); gBattleCommunication[0]++; @@ -494,7 +494,7 @@ void sub_800EC9C(void) } break; case 6: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2); gBattleCommunication[0]++; @@ -579,7 +579,7 @@ void sub_800F104(void) switch (gBattleCommunication[0]) { case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished()) { sub_800F02C(); SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60); @@ -639,7 +639,7 @@ void sub_800F298(void) switch (gBattleCommunication[0]) { case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished()) { gBattleStruct->unk0 = 1; gBattleStruct->unk1 = 1; @@ -732,7 +732,7 @@ void sub_800F298(void) break; case 2: step_2: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); gBattleCommunication[0]++; @@ -795,7 +795,7 @@ void sub_800F298(void) } break; case 4: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon)); gBattleCommunication[0]++; diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index e85350aea..01088bf53 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -10,17 +10,17 @@ static void sub_80C8644(u8 taskId); static void sub_80C8660(u8 taskId); #if GERMAN -void de_sub_80C9274(bool32 arg0); -void de_sub_80C9294(bool32 arg0); +static void de_sub_80C9274(bool32 arg0); +static void de_sub_80C9294(bool32 arg0); #endif -void sub_80C857C(const void *data, u16 size) +static void SendBlockToAllOpponents(const void *data, u16 size) { memcpy(eContestLinkSendBuffer, data, size); SendBlock(bitmask_all_link_players_but_self(), eContestLinkSendBuffer, size); } -bool8 sub_80C85AC(u8 who) +static bool8 HasPlayerReceivedBlock(u8 who) { u8 flag = 1 << who; if (!(GetBlockReceivedStatus() & flag)) @@ -29,7 +29,7 @@ bool8 sub_80C85AC(u8 who) return TRUE; } -bool8 sub_80C85D8(void) +static bool8 HaveAllPlayersReceivedBlock(void) { int i; @@ -214,7 +214,7 @@ void sub_80C8734(u8 taskId) #endif case 0: if (GetMultiplayerId() == 0) { - if (sub_8007ECC()) { + if (IsLinkTaskFinished()) { #if GERMAN if (gTasks[taskId].data[0] == 0) { @@ -246,7 +246,7 @@ void sub_80C8734(u8 taskId) } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { for (i = 0; i < MAX_LINK_PLAYERS; i++) { @@ -308,9 +308,9 @@ void sub_80C88AC(u8 taskId) case 0: if (GetMultiplayerId() == 0) { - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(&gRngValue, sizeof(u32)); + SendBlockToAllOpponents(&gRngValue, sizeof(u32)); gTasks[taskId].data[0]++; } } @@ -320,7 +320,7 @@ void sub_80C88AC(u8 taskId) } break; case 1: - if (sub_80C85AC(0)) + if (HasPlayerReceivedBlock(0)) { memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(u32)); memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(u32)); @@ -348,7 +348,7 @@ void sub_80C8938(u8 taskId) gBlockSendBuffer[0] = gTasks[taskId].data[9]; if (GetMultiplayerId() == 0) { - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { #if GERMAN if (gTasks[taskId].data[0] == 0) @@ -377,7 +377,7 @@ void sub_80C8938(u8 taskId) } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { for (i = 0; i < MAX_LINK_PLAYERS; i++) { @@ -407,14 +407,14 @@ void sub_80C89DC(u8 taskId) SwitchTaskToFollowupFunc(taskId); break; case 0: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(&gContestPlayerMonIndex, sizeof(u8)); + SendBlockToAllOpponents(&gContestPlayerMonIndex, sizeof(u8)); gTasks[taskId].data[0]++; } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { gTasks[taskId].data[0]++; } @@ -433,14 +433,14 @@ void sub_80C8A38(u8 taskId) SwitchTaskToFollowupFunc(taskId); break; case 0: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(&sContestantStatus[gContestPlayerMonIndex].currMove, sizeof(u16)); + SendBlockToAllOpponents(&sContestantStatus[gContestPlayerMonIndex].currMove, sizeof(u16)); gTasks[taskId].data[0]++; } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { for (i = 0; i < MAX_LINK_PLAYERS; i++) { @@ -457,14 +457,14 @@ void sub_80C8AD0(u8 taskId) switch (gTasks[taskId].data[0]) { case 0: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(gUnknown_02038678, sizeof gUnknown_02038678); + SendBlockToAllOpponents(gUnknown_02038678, sizeof gUnknown_02038678); gTasks[taskId].data[0]++; } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(gUnknown_02038678, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038678); gTasks[taskId].data[0]++; @@ -481,42 +481,42 @@ void sub_80C8AD0(u8 taskId) } break; case 3: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(gUnknown_02038680, sizeof gUnknown_02038680); + SendBlockToAllOpponents(gUnknown_02038680, sizeof gUnknown_02038680); gTasks[taskId].data[0]++; } break; case 4: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(gUnknown_02038680, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038680); gTasks[taskId].data[0]++; } break; case 6: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(gUnknown_02038688, sizeof gUnknown_02038688); + SendBlockToAllOpponents(gUnknown_02038688, sizeof gUnknown_02038688); gTasks[taskId].data[0]++; } break; case 7: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(gUnknown_02038688, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038688); gTasks[taskId].data[0]++; } break; case 9: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(gContestFinalStandings, sizeof gContestFinalStandings); + SendBlockToAllOpponents(gContestFinalStandings, sizeof gContestFinalStandings); gTasks[taskId].data[0]++; } break; case 10: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_0203869B], sizeof gContestFinalStandings); gTasks[taskId].data[0]++; @@ -534,14 +534,14 @@ void sub_80C8C80(u8 taskId) switch (gTasks[taskId].data[0]) { case 0: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(sContestantStatus, 4 * sizeof(struct ContestantStatus)); + SendBlockToAllOpponents(sContestantStatus, 4 * sizeof(struct ContestantStatus)); gTasks[taskId].data[0]++; } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(sContestantStatus, gBlockRecvBuffer[gUnknown_0203869B], 4 * sizeof(struct ContestantStatus)); gTasks[taskId].data[0]++; @@ -558,42 +558,42 @@ void sub_80C8C80(u8 taskId) } break; case 3: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(&shared192D0, sizeof shared192D0); + SendBlockToAllOpponents(&shared192D0, sizeof shared192D0); gTasks[taskId].data[0]++; } break; case 4: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(&shared192D0, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared192D0); gTasks[taskId].data[0]++; } break; case 6: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(&shared19328, sizeof shared19328); + SendBlockToAllOpponents(&shared19328, sizeof shared19328); gTasks[taskId].data[0]++; } break; case 7: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(&shared19328, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared19328); gTasks[taskId].data[0]++; } break; case 9: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(gUnknown_02038696, sizeof gUnknown_02038696); + SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); gTasks[taskId].data[0]++; } break; case 10: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); gTasks[taskId].data[0]++; @@ -624,7 +624,7 @@ void sub_80C8E1C(u8 taskId) gBlockSendBuffer[0] = 0x64; if (GetMultiplayerId() == 0) { - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { #if GERMAN if (gTasks[taskId].data[0] == 0) @@ -653,7 +653,7 @@ void sub_80C8E1C(u8 taskId) } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { for (i = 0; i < MAX_LINK_PLAYERS; i++) { @@ -683,14 +683,14 @@ void sub_80C8EBC(u8 taskId) SwitchTaskToFollowupFunc(taskId); break; case 0: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(gUnknown_02038670, sizeof gUnknown_02038670); + SendBlockToAllOpponents(gUnknown_02038670, sizeof gUnknown_02038670); gTasks[taskId].data[0]++; } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(gUnknown_02038670, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038670); gTasks[taskId].data[0]++; @@ -708,14 +708,14 @@ void sub_80C8F34(u8 taskId) SwitchTaskToFollowupFunc(taskId); break; case 0: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { - sub_80C857C(gUnknown_02038696, sizeof gUnknown_02038696); + SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696); gTasks[taskId].data[0]++; } break; case 1: - if (sub_80C85D8()) + if (HaveAllPlayersReceivedBlock()) { memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696); gTasks[taskId].data[0]++; @@ -726,7 +726,7 @@ void sub_80C8F34(u8 taskId) #if GERMAN -void de_sub_80C9274(bool32 arg0) +static void de_sub_80C9274(bool32 arg0) { if (deUnkValue2 == 1) { @@ -737,7 +737,7 @@ void de_sub_80C9274(bool32 arg0) } } -void de_sub_80C9294(bool32 arg0) +static void de_sub_80C9294(bool32 arg0) { if (deUnkValue2 == 1) { diff --git a/src/engine/link.c b/src/engine/link.c index ec94295d7..33037b817 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -898,14 +898,9 @@ bool8 sub_8007E9C(u8 a1) } } -bool8 sub_8007ECC(void) +bool8 IsLinkTaskFinished(void) { - u8 retVal = FALSE; - - if (!gLinkCallback) - retVal = TRUE; - - return retVal; + return gLinkCallback == NULL; } u8 GetBlockReceivedStatus(void) diff --git a/src/engine/trade.c b/src/engine/trade.c index 4dc27ea6f..4bd39c4ef 100644 --- a/src/engine/trade.c +++ b/src/engine/trade.c @@ -1711,7 +1711,7 @@ static bool8 sub_8048D44(void) gUnknown_03004824->unk_0075 ++; break; case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { if (GetBlockReceivedStatus() == 0) { @@ -2210,7 +2210,7 @@ static void sub_8049A20(void) { sub_804AADC(3, 1); gUnknown_03004824->linkData[0] = 0xbbbb; - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { Trade_SendData(gUnknown_03004824); } @@ -2239,7 +2239,7 @@ static void sub_8049AC0(void) else { sub_804AADC(3, 1); - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gUnknown_03004824->linkData[0] = 0xbbcc; Trade_SendData(gUnknown_03004824); @@ -4632,7 +4632,7 @@ static void sub_804BB78(void) switch (gUnknown_03004828->unk_00bd) { case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { Trade_SendData(gUnknown_03004828); gUnknown_03004828->unk_00bd ++; @@ -5534,13 +5534,13 @@ static void sub_804DC88(void) gMain.state = 101; gUnknown_03004828->unk_00c0 = 0; } - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gMain.state = 2; } break; case 101: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gMain.state = 2; } @@ -5592,7 +5592,7 @@ static void sub_804DC88(void) gMain.state = 42; break; case 42: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { sub_8125E04(); gSoftResetDisabled = FALSE; @@ -5607,7 +5607,7 @@ static void sub_804DC88(void) } break; case 6: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { BeginNormalPaletteFade(-1, 0, 0, 16, 0); gMain.state ++; diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c index ad1cd4a59..d68be3b36 100644 --- a/src/field/field_fadetransition.c +++ b/src/field/field_fadetransition.c @@ -146,7 +146,7 @@ void sub_8080A5C(u8 taskId) task->data[0]++; break; case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { pal_fill_for_map_transition(); task->data[0]++; diff --git a/src/rom3.c b/src/rom3.c index 713713162..000de8356 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -463,7 +463,7 @@ void sub_800C1A8(u8 taskId) } break; case 4: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { var = (ewram14004arr(0, gTasks[taskId].data[15]) | (ewram14004arr(1, gTasks[taskId].data[15]) << 8)); gTasks[taskId].data[13] = 1; diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index 7567899ae..2cb68ccf1 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -1163,7 +1163,7 @@ static void sub_804E9F8(void) gBerryBlenderData->framesToWait = 0; break; case 9: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { ResetBlockReceivedFlags(); if (GetMultiplayerId() == 0) @@ -1215,7 +1215,7 @@ static void sub_804E9F8(void) } break; case 13: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gBerryBlenderData->field_0++; sub_8051414(&gBerryBlenderData->field_168); @@ -1257,7 +1257,7 @@ static void sub_804E9F8(void) gBerryBlenderData->field_0++; break; case 20: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { sub_8007E24(); gBerryBlenderData->field_0++; @@ -2506,7 +2506,7 @@ static void sub_8050954(void) case 3: if (/*multiplayerID != 0*/ GetMultiplayerId() != 0) gBerryBlenderData->field_6F++; - else if (sub_8007ECC()) + else if (IsLinkTaskFinished()) { gBerryBlenderData->field_1BC = gBerryBlenderData->gameFrameTime; gBerryBlenderData->field_1C0 = gBerryBlenderData->max_RPM; @@ -2646,7 +2646,7 @@ bool8 sub_8050CE8(void) gBerryBlenderData->framesToWait = 0; break; case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gBerryBlenderData->field_1C4++; gSoftResetDisabled = TRUE; @@ -2665,7 +2665,7 @@ bool8 sub_8050CE8(void) } break; case 4: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { if (sub_8125E6C()) gBerryBlenderData->field_1C4 = 5; @@ -2752,7 +2752,7 @@ static void sub_8050E30(void) gBerryBlenderData->field_6F++; break; case 6: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { gBerryBlenderData->framesToWait = 0; gBerryBlenderData->field_6F++; @@ -2771,7 +2771,7 @@ static void sub_8050E30(void) sub_80084A4(); break; case 9: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); gBerryBlenderData->field_6F++; -- cgit v1.2.3 From 1685a7977a652f35998a717395407d625878e20e Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Mon, 22 Jan 2018 21:42:14 -0600 Subject: dump some debug baseroms --- src/battle/battle_2.c | 4 ++-- src/debug/watanabe_debug_menu.c | 4 ++-- src/field/pokeblock.c | 25 ++++++++++++++++--------- 3 files changed, 20 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 03391cf92..478499ad7 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -5155,7 +5155,7 @@ void debug_sub_801174C() "._704:\n" " .word gUnknown_020297ED\n" " .word gSaveBlock2\n" - " .word UnkDebug0+0x279\n" + " .word str_821F631\n" " .word gUnknown_02023A14+0x52\n" " .word gBattleTypeFlags\n" " .word UnkDebug0+0x1e0\n" @@ -5575,7 +5575,7 @@ void debug_sub_801174C() "._750:\n" " .word gPlayerParty\n" " .word gUnknown_02023A14+0x98\n" - " .word UnkDebug0+0x291\n" + " .word Str_821F649\n" " .word gUnknown_02023A14+0x50\n" " .word gUnknown_02023A14+0xde\n" " .word gEnemyParty\n" diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index ff6f97933..58ae28510 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -7068,7 +7068,7 @@ void InitSeePokemonGraphics() " .word unk_debug_ewram_0+0x34\n" " .word +0x2018000\n" " .word 0x115\n" - " .word unk_83F8868+0xc\n" + " .word gSpriteTemplate_83F8874\n" " .word gSprites\n" "\n" ); @@ -8641,7 +8641,7 @@ void InitSeeTrainers() " .word debug_80C777C+1\n" " .word unk_debug_ewram_0+0x34\n" " .word +0x2018000\n" - " .word unk_83F8868+0xc\n" + " .word gSpriteTemplate_83F8874\n" " .word gSprites\n" "\n" ); diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c index 43684dfec..b4be44aa2 100644 --- a/src/field/pokeblock.c +++ b/src/field/pokeblock.c @@ -222,17 +222,24 @@ const struct SpriteTemplate gSpriteTemplate_83F7F84 = const struct Pokeblock gUnknown_083F7F9C[] = { - { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20}, - { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20}, - { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20}, - { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20}, - { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20} -}; - + { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20 }, + { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20 }, + { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20 }, + { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20 }, + { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20 }, #if DEBUG -// possibly continuation of gUnknown_083F7F9C? -asm(".incbin \"baserom_de_debug.gba\", 0x424128, 0x50"); + { PBLOCK_CLR_PURPLE, 20, 0, 20, 0, 0, 20 }, + { PBLOCK_CLR_INDIGO, 0, 20, 0, 20, 0, 20 }, + { PBLOCK_CLR_BROWN, 0, 0, 20, 0, 20, 20 }, + { PBLOCK_CLR_LITEBLUE, 20, 0, 0, 20, 0, 20 }, + { PBLOCK_CLR_OLIVE, 0, 20, 0, 0, 20, 20 }, + { PBLOCK_CLR_GRAY, 0, 2, 0, 2, 2, 0 }, + { PBLOCK_CLR_BLACK, 3, 3, 3, 4, 3, 0 }, + { PBLOCK_CLR_WHITE, 1, 1, 1, 1, 1, 1 }, + { PBLOCK_CLR_GOLD, 20, 0, 0, 0, 0, 20 }, + { 0 }, #endif +}; // text -- cgit v1.2.3 From 0f09d2e7046a54c95e2ed4a7ff759d4cd1db87f7 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Mon, 22 Jan 2018 22:35:27 -0600 Subject: fix false gMysteryEventScriptCmdTableEnd offsets --- src/battle/battle_2.c | 78 +++++++++++++++++------------------ src/battle/battle_4.c | 2 +- src/battle/battle_controller_player.c | 2 +- src/battle/battle_interface.c | 6 +-- src/battle/battle_util.c | 12 +++--- src/contest.c | 4 +- src/debug/start_menu_debug.c | 28 ++++++------- src/debug/unk_debug_menu_3.c | 38 ++++++++--------- src/engine/mystery_event_menu.c | 2 +- src/engine/save.c | 4 +- src/engine/save_failed_screen.c | 2 +- src/field/choose_party.c | 2 +- src/field/field_player_avatar.c | 4 +- src/field/party_menu.c | 2 +- src/field/secret_base.c | 6 +-- src/pokemon/pokemon_1.c | 12 +++--- src/pokemon/pokemon_summary_screen.c | 4 +- src/roulette.c | 44 ++++++++++---------- src/scene/cute_sketch.c | 4 +- 19 files changed, 128 insertions(+), 128 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 478499ad7..41d00546d 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -220,7 +220,7 @@ void InitBattle(void) " lsl r1, r1, #0x13\n" " ldr r2, ._10\n" " mov r0, sp\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cb4\n" + " bl CpuSet\n" " ldr r0, ._10 + 4\n" " strh r4, [r0]\n" " sub r0, r0, #0xc\n" @@ -907,7 +907,7 @@ void sub_800EC9C() " ldr r2, ._116 + 4\n" " add r1, r1, r2\n" " mov r2, #0xc8\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " b ._129\n" "._117:\n" " .align 2, 0\n" @@ -946,7 +946,7 @@ void sub_800EC9C() " ldr r2, ._126 + 4\n" " add r1, r1, r2\n" " mov r2, #0xc8\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " b ._129\n" "._127:\n" " .align 2, 0\n" @@ -982,7 +982,7 @@ void sub_800EC9C() " add r1, r1, r0\n" " add r0, r4, #0\n" " mov r2, #0xc8\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " ldr r1, ._134 + 8\n" " add r0, r4, r1\n" " bl shedinja_something\n" @@ -1407,7 +1407,7 @@ void sub_800F104() " add r1, r1, r0\n" " ldr r0, ._177 + 4\n" " mov r2, #0x60\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" "._174:\n" " add r7, r7, #0x1c\n" " add r4, r4, #0x1\n" @@ -1781,7 +1781,7 @@ void sub_800F298() " ldr r1, ._239 + 4\n" " mov r2, #0x96\n" " lsl r2, r2, #0x1\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " ldr r0, ._239 + 8\n" " mov r1, #0x0\n" " bl CreateTask\n" @@ -2018,7 +2018,7 @@ void sub_800F298() "._283:\n" " add r1, r5, #0\n" " mov r2, #0xc8\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " b ._291\n" "._293:\n" " .align 2, 0\n" @@ -2028,7 +2028,7 @@ void sub_800F298() " ldr r0, ._296\n" " add r1, r5, #0\n" " mov r2, #0xc8\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" "._291:\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" @@ -2185,7 +2185,7 @@ void sub_800F298() "._333:\n" " add r1, r5, #0\n" " mov r2, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " b ._341\n" "._343:\n" " .align 2, 0\n" @@ -2195,7 +2195,7 @@ void sub_800F298() " ldr r0, ._346\n" " add r1, r5, #0\n" " mov r2, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" "._341:\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" @@ -2627,7 +2627,7 @@ void BattleMainCB2(void) " str r0, [r4]\n" " bl ZeroEnemyPartyMons\n" " mov r0, #0x5a\n" - " bl gMysteryEventScriptCmdTableEnd+0x148c\n" + " bl m4aSongNumStop\n" " ldr r0, ._358 + 24\n" " ldrh r1, [r0]\n" " mov r0, #0x2\n" @@ -3197,7 +3197,7 @@ void debug_sub_80108B8() asm( " push {r4, r5, lr}\n" " add sp, sp, #0xfffffffc\n" - " bl gMysteryEventScriptCmdTableEnd+0x19f4\n" + " bl m4aSoundVSyncOff\n" " mov r0, #0x0\n" " bl SetHBlankCallback\n" " mov r0, #0x0\n" @@ -3264,7 +3264,7 @@ void debug_sub_80108B8() " ldr r1, ._507 + 72\n" " add r0, r4, #0\n" " bl LZDecompressVram\n" - " bl gMysteryEventScriptCmdTableEnd+0x1a70\n" + " bl m4aSoundVSyncOn\n" " ldr r0, ._507 + 76\n" " bl SetVBlankCallback\n" " ldr r0, ._507 + 80\n" @@ -3860,7 +3860,7 @@ void debug_sub_8010CAC() " strb r0, [r3, #0x15]\n" " lsl r0, r0, #0x1f\n" " lsr r0, r0, #0x1f\n" - " bl gMysteryEventScriptCmdTableEnd+0x2aa0\n" + " bl SetPokemonCryStereo\n" " bl debug_nullsub_3\n" "._559:\n" " ldr r4, ._565 + 12\n" @@ -4774,7 +4774,7 @@ void debug_sub_8011498() " lsl r4, r4, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x4358\n" + " bl __udivsi3\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -4830,7 +4830,7 @@ void debug_sub_8011498() " lsl r4, r4, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x4358\n" + " bl __udivsi3\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -4886,7 +4886,7 @@ void debug_sub_8011498() " lsl r4, r4, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x4358\n" + " bl __udivsi3\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -4929,7 +4929,7 @@ void debug_sub_8011498() " lsl r4, r5, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x4358\n" + " bl __udivsi3\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -4965,7 +4965,7 @@ void debug_sub_8011498() " lsl r4, r4, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x4358\n" + " bl __udivsi3\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -5002,7 +5002,7 @@ void debug_sub_8011498() " lsl r4, r5, #0x1\n" " mov r0, r9\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x4358\n" + " bl __udivsi3\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" @@ -5200,7 +5200,7 @@ void debug_sub_801174C() "._713:\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" " ldr r1, ._719\n" @@ -5223,7 +5223,7 @@ void debug_sub_801174C() "._699:\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " mov r2, #0x64\n" " add r1, r0, #0\n" " mul r1, r1, r2\n" @@ -5282,7 +5282,7 @@ void debug_sub_801174C() " str r0, [sp, #0xc]\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" " ldr r1, ._726\n" @@ -5355,7 +5355,7 @@ void debug_sub_801174C() "._735:\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " mov r2, #0x64\n" " mul r0, r0, r2\n" " ldr r1, ._741\n" @@ -5382,7 +5382,7 @@ void debug_sub_801174C() "._721:\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " mov r2, #0x64\n" " add r1, r0, #0\n" " mul r1, r1, r2\n" @@ -5441,7 +5441,7 @@ void debug_sub_801174C() " str r0, [sp, #0xc]\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " mov r2, #0x64\n" " mul r0, r0, r2\n" " ldr r1, ._750\n" @@ -5460,7 +5460,7 @@ void debug_sub_801174C() " ble ._743 @cond_branch\n" " add r0, r7, #0\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" " ldr r1, ._750\n" @@ -6483,7 +6483,7 @@ void debug_sub_8012294() " lsl r4, r4, #0x1\n" " add r0, r5, #0\n" " mov r1, #0x5\n" - " bl gMysteryEventScriptCmdTableEnd+0x4358\n" + " bl __udivsi3\n" " add r5, r0, #0\n" " lsl r5, r5, #0x18\n" " lsr r5, r5, #0x15\n" @@ -7102,7 +7102,7 @@ void debug_sub_8012688() " bl SetHBlankCallback\n" " ldr r0, ._873 + 100\n" " bl SetVBlankCallback\n" - " bl gMysteryEventScriptCmdTableEnd+0x14f4\n" + " bl m4aMPlayAllStop\n" " ldr r0, ._873 + 104\n" " mov r1, #0x0\n" " bl CreateTask\n" @@ -8484,7 +8484,7 @@ void debug_sub_8013240() { asm( " push {lr}\n" - " bl gMysteryEventScriptCmdTableEnd+0x2fec\n" + " bl IdentifyFlash\n" " lsl r0, r0, #0x10\n" " cmp r0, #0\n" " beq ._1068 @cond_branch\n" @@ -8519,7 +8519,7 @@ void debug_sub_8013258() " lsr r4, r0, #0x10\n" " add r0, r4, #0\n" " add r1, r6, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x2f60\n" + " bl ProgramFlashSectorAndVerify\n" " cmp r0, #0\n" " bne ._1071 @cond_branch\n" " mov r0, #0x80\n" @@ -8555,13 +8555,13 @@ void debug_sub_8013294() " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " bne ._1076 @cond_branch\n" - " bl gMysteryEventScriptCmdTableEnd+0x19f4\n" + " bl m4aSoundVSyncOff\n" " add r0, r4, #0\n" " add r1, r5, #0\n" " add r2, r6, #0\n" " bl debug_sub_8013258\n" " add r4, r0, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x1a70\n" + " bl m4aSoundVSyncOn\n" " add r0, r4, #0\n" " b ._1077\n" "._1076:\n" @@ -8591,7 +8591,7 @@ void debug_sub_80132C8() " mov r1, #0x0\n" " add r2, r5, #0\n" " add r3, r6, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x2d64\n" + " bl ReadFlash\n" "._1078:\n" " pop {r4, r5, r6}\n" " pop {r0}\n" @@ -9066,7 +9066,7 @@ void debug_sub_80139E4() "._1193:\n" " ldr r0, ._1198 + 12\n" " ldr r0, [r0]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" + " bl _call_via_r0\n" " ldr r1, ._1198 + 4\n" " mov r0, #0x0\n" " strb r0, [r1]\n" @@ -9081,7 +9081,7 @@ void debug_sub_80139E4() " lsl r0, r0, #0x2\n" " add r0, r0, r5\n" " ldr r0, [r0]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" + " bl _call_via_r0\n" " ldrb r0, [r4]\n" " add r0, r0, #0x1\n" " strb r0, [r4]\n" @@ -9103,7 +9103,7 @@ void debug_sub_80139E4() "._1192:\n" " ldr r0, ._1202\n" " ldr r0, [r0]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" + " bl _call_via_r0\n" " ldr r1, ._1202 + 4\n" " strb r4, [r1]\n" " ldr r0, ._1202 + 8\n" @@ -9117,7 +9117,7 @@ void debug_sub_80139E4() " lsl r0, r0, #0x2\n" " add r0, r0, r5\n" " ldr r0, [r0]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" + " bl _call_via_r0\n" " ldrb r0, [r4]\n" " add r0, r0, #0x1\n" " strb r0, [r4]\n" @@ -9339,7 +9339,7 @@ void sub_8010874() " mov r0, #0x64\n" " mul r0, r0, r1\n" " ldr r1, ._1215 + 160\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " ldr r2, ._1215 + 164\n" " add r1, r4, r2\n" " strb r0, [r1]\n" diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 038b4f5cf..3415d9337 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -5111,7 +5111,7 @@ static void atk15_seteffectwithchance(void) lsl r0, r0, #0x10\n\ lsr r0, r0, #0x10\n\ mov r1, #0x64\n\ - bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + bl __umodsi3\n\ lsl r0, r0, #0x10\n\ lsr r0, r0, #0x10\n\ cmp r0, r4\n\ diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 7e3655e4a..cbca4a586 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -2234,7 +2234,7 @@ void debug_sub_803107C(void) mov r7, #0x0\n\ ldr r0, ._369\n\ ldr r0, [r0]\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cf4\n\ + bl _call_via_r0\n\ ldr r0, ._369 + 4\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c index 1b6240159..b703bc7b8 100644 --- a/src/battle/battle_interface.c +++ b/src/battle/battle_interface.c @@ -1405,7 +1405,7 @@ void sub_804454C() " add r1, r1, r0\n" " mov r0, sp\n" " ldr r2, ._150 + 36\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cb4\n" + " bl CpuSet\n" " ldrb r4, [r5]\n" " ldrh r0, [r7]\n" " mov r1, sl\n" @@ -1467,7 +1467,7 @@ void sub_804454C() " ldr r2, ._153 + 4\n" " add r1, r1, r2\n" " ldr r2, ._153 + 8\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cb4\n" + " bl CpuSet\n" " b ._163\n" "._154:\n" " .align 2, 0\n" @@ -1521,7 +1521,7 @@ void sub_804454C() " add r1, r1, r6\n" " mov r0, sp\n" " ldr r2, ._161 + 4\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cb4\n" + " bl CpuSet\n" " ldrb r4, [r5]\n" " ldrh r0, [r7]\n" " mov r1, sl\n" diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c index 8dae98b66..817382911 100644 --- a/src/battle/battle_util.c +++ b/src/battle/battle_util.c @@ -2407,7 +2407,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) lsl r0, r0, #0x10\n\ lsr r0, r0, #0x10\n\ mov r1, #0x3\n\ - bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + bl __umodsi3\n\ lsl r0, r0, #0x10\n\ lsr r4, r0, #0x10\n\ cmp r4, #0\n\ @@ -3332,7 +3332,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) lsl r0, r0, #0x10\n\ lsr r0, r0, #0x10\n\ mov r1, #0xa\n\ - bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + bl __umodsi3\n\ lsl r0, r0, #0x10\n\ cmp r0, #0\n\ beq ._1091 @cond_branch\n\ @@ -3542,7 +3542,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) lsl r0, r0, #0x10\n\ lsr r0, r0, #0x10\n\ mov r1, #0x3\n\ - bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + bl __umodsi3\n\ lsl r0, r0, #0x10\n\ cmp r0, #0\n\ beq ._1124 @cond_branch\n\ @@ -3737,7 +3737,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) lsl r0, r0, #0x10\n\ lsr r0, r0, #0x10\n\ mov r1, #0x3\n\ - bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + bl __umodsi3\n\ lsl r0, r0, #0x10\n\ cmp r0, #0\n\ beq ._1155 @cond_branch\n\ @@ -3932,7 +3932,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) lsl r0, r0, #0x10\n\ lsr r0, r0, #0x10\n\ mov r1, #0x3\n\ - bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + bl __umodsi3\n\ lsl r0, r0, #0x10\n\ cmp r0, #0\n\ beq ._1186 @cond_branch\n\ @@ -4204,7 +4204,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) lsl r0, r0, #0x10\n\ lsr r0, r0, #0x10\n\ mov r1, #0x3\n\ - bl gMysteryEventScriptCmdTableEnd+0x43d0\n\ + bl __umodsi3\n\ lsl r0, r0, #0x10\n\ cmp r0, #0\n\ beq ._1232 @cond_branch\n\ diff --git a/src/contest.c b/src/contest.c index 20e202d80..834d641d0 100644 --- a/src/contest.c +++ b/src/contest.c @@ -1392,7 +1392,7 @@ void debug_sub_80BA054() mov r0, r9\n\ mov r1, #0x0\n\ mov r2, #0x14\n\ - bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + bl memset\n\ ldr r4, ._262 + 8\n\ ldrb r0, [r4]\n\ bl sub_80B28F0\n\ @@ -1505,7 +1505,7 @@ void debug_sub_80BA054() ._241:\n\ ldr r0, ._273\n\ ldr r0, [r0]\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cf4\n\ + bl _call_via_r0\n\ ldr r0, ._273 + 4\n\ ldrb r4, [r0]\n\ cmp r4, #0\n\ diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 572251fb4..d9f14a6b8 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -172,7 +172,7 @@ void debug_sub_8076BB4() " add r2, r2, #0x4\n" " add r0, r0, r2\n" " ldr r0, [r0]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" + " bl _call_via_r0\n" " b ._24\n" "._14:\n" " .align 2, 0\n" @@ -888,7 +888,7 @@ void DebugMenu_8077020() " lsr r4, r0, #0x18\n" " ldr r0, ._109\n" " ldr r0, [r0]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" + " bl _call_via_r0\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " cmp r0, #0x1\n" @@ -1060,7 +1060,7 @@ void DebugMenu_807709C() " add r1, r1, #0x4\n" " add r0, r0, r1\n" " ldr r0, [r0]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" + " bl _call_via_r0\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " b ._132\n" @@ -1187,18 +1187,18 @@ void DebugMenu_8077238() " ldr r1, ._139\n" " mov r0, sp\n" " mov r2, #0x2\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, sp, #0x4\n" " mov r9, r0\n" " ldr r1, ._139 + 4\n" " mov r2, #0x3\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r1, sp, #0x8\n" " mov sl, r1\n" " ldr r1, ._139 + 8\n" " mov r0, sl\n" " mov r2, #0x3\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " mov r2, #0x0\n" " str r2, [sp, #0x14]\n" " add r4, sp, #0x10\n" @@ -1932,7 +1932,7 @@ void DebugMenu_80776B4() " ldr r1, ._183\n" " mov r0, sp\n" " mov r2, #0x7\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " lsl r3, r4, #0x1\n" " lsl r5, r4, #0x19\n" " lsr r5, r5, #0x18\n" @@ -1975,7 +1975,7 @@ void DebugMenu_8077704() " ldr r1, ._185\n" " mov r0, sp\n" " mov r2, #0x11\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " mov r0, #0x13\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" @@ -2174,7 +2174,7 @@ void DebugMenu_807786C() " ldr r1, ._205\n" " mov r0, sp\n" " mov r2, #0x7\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " mov r0, #0x19\n" " mov r1, #0x0\n" " mov r2, #0x1d\n" @@ -2873,7 +2873,7 @@ void DebugMenu_8077C3C() " add r0, r2, #0\n" " mov r1, #0xa\n" " str r3, [sp]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " add r2, r0, #0\n" " ldr r3, [sp]\n" " cmp r4, r6\n" @@ -5580,7 +5580,7 @@ void DebugMenu_8078E04() " lsr r4, r0, #0x10\n" " add r0, r4, #0\n" " add r1, r6, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x2f60\n" + " bl ProgramFlashSectorAndVerify\n" " cmp r0, #0\n" " bne ._576 @cond_branch\n" " mov r0, #0x80\n" @@ -5613,13 +5613,13 @@ void DebugMenu_8078E40() " add r6, r2, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " bl gMysteryEventScriptCmdTableEnd+0x19f4\n" + " bl m4aSoundVSyncOff\n" " add r0, r4, #0\n" " add r1, r5, #0\n" " add r2, r6, #0\n" " bl DebugMenu_8078E04\n" " add r4, r0, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x1a70\n" + " bl m4aSoundVSyncOn\n" " add r0, r4, #0\n" " pop {r4, r5, r6}\n" " pop {r1}\n" @@ -5639,7 +5639,7 @@ void DebugMenu_8078E68() " lsr r0, r0, #0x18\n" " mov r1, #0x0\n" " add r2, r4, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x2d64\n" + " bl ReadFlash\n" " pop {r4}\n" " pop {r0}\n" " bx r0\n" diff --git a/src/debug/unk_debug_menu_3.c b/src/debug/unk_debug_menu_3.c index fe2e6317e..411b32fe3 100644 --- a/src/debug/unk_debug_menu_3.c +++ b/src/debug/unk_debug_menu_3.c @@ -14,7 +14,7 @@ int debug_sub_813C404() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -42,7 +42,7 @@ int debug_sub_813C430() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -70,7 +70,7 @@ int debug_sub_813C45C() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -98,7 +98,7 @@ int debug_sub_813C488() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -124,7 +124,7 @@ int debug_sub_813C4B4() " ldr r1, ._9 + 4\n" " sub r4, r4, r1\n" " add r2, r4, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r4, #0\n" " pop {r4}\n" " pop {r1}\n" @@ -149,7 +149,7 @@ int debug_sub_813C4D4() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_81261B4\n" @@ -177,7 +177,7 @@ int debug_sub_813C500() " sub r5, r5, r4\n" " add r1, r4, #0\n" " add r2, r5, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r6, #0\n" " add r1, r4, #0\n" " bl unref_sub_812620C\n" @@ -212,7 +212,7 @@ void debug_sub_813C52C() " mov r0, r8\n" " add r1, r4, #0\n" " add r2, r6, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " ldr r0, ._15 + 8\n" " sub r0, r0, r4\n" " add r0, r0, r8\n" @@ -522,7 +522,7 @@ int debug_sub_813C740() " add r0, r6, #0\n" " mov r1, r8\n" " mov r2, r9\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r5, #0\n" " mov r1, #0x19\n" " mov r2, #0x5\n" @@ -569,7 +569,7 @@ int debug_sub_813C740() " sub r0, r0, r1\n" " add r1, r5, #0\n" " mov r2, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " ldr r0, ._29 + 20\n" " add r6, r6, r0\n" " mov r0, r8\n" @@ -577,7 +577,7 @@ int debug_sub_813C740() " add r0, r6, #0\n" " mov r1, sp\n" " mov r2, #0x24\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " mov r0, r9\n" " add sp, sp, #0x30\n" " pop {r3, r4, r5}\n" @@ -617,7 +617,7 @@ int debug_sub_813C810() " add r0, r6, #0\n" " add r1, r5, #0\n" " mov r2, r8\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r4, #0\n" " mov r1, #0xc9\n" " mov r2, #0x15\n" @@ -631,13 +631,13 @@ int debug_sub_813C810() " sub r0, r0, r5\n" " add r1, r4, #0\n" " mov r2, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " ldr r0, ._31 + 16\n" " add r0, r6, r0\n" " sub r0, r0, r5\n" " mov r1, sp\n" " mov r2, #0x24\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r6, #0\n" " add r1, r5, #0\n" " bl unref_sub_812620C\n" @@ -677,7 +677,7 @@ int debug_sub_813C888() " add r0, r6, #0\n" " add r1, r5, #0\n" " mov r2, r8\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r4, #0\n" " mov r1, #0xc9\n" " mov r2, #0x15\n" @@ -693,13 +693,13 @@ int debug_sub_813C888() " sub r0, r0, r5\n" " add r1, r4, #0\n" " mov r2, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " ldr r0, ._33 + 16\n" " add r0, r6, r0\n" " sub r0, r0, r5\n" " mov r1, sp\n" " mov r2, #0x24\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r6, #0\n" " add r1, r5, #0\n" " bl unref_sub_812620C\n" @@ -768,7 +768,7 @@ int debug_sub_813C93C() " sub r5, r5, r6\n" " add r1, r6, #0\n" " add r2, r5, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " bl SavePlayerParty\n" " bl debug_sub_813C904\n" " ldr r1, ._37 + 8\n" @@ -782,7 +782,7 @@ int debug_sub_813C93C() " add r0, r4, #0\n" " mov r1, sp\n" " mov r2, #0xbc\n" - " bl gMysteryEventScriptCmdTableEnd+0x5bc4\n" + " bl memcpy\n" " add r0, r5, #0\n" " add sp, sp, #0xbc\n" " pop {r4, r5, r6}\n" diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index 656e774c5..da2973945 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -465,7 +465,7 @@ void debug_sub_815D04C() " add r1, r1, r0\n" " ldr r0, ._133 + 8\n" " ldr r1, [r1]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf8\n" + " bl _call_via_r1\n" " ldr r0, ._133 + 12\n" " add r1, r6, r0\n" " ldrb r0, [r1]\n" diff --git a/src/engine/save.c b/src/engine/save.c index d11eebaac..0eb93eb1d 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -690,7 +690,7 @@ void sub_813B79C() " strh r0, [r1]\n" " add r0, r5, #0\n" " add r1, r4, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x2f60\n" + " bl ProgramFlashSectorAndVerify\n" " add r0, r5, #1\n" " lsl r0, r0, #0x10\n" " lsr r5, r0, #0x10\n" @@ -718,7 +718,7 @@ void sub_813B79C() " lsr r4, r4, #0x10\n" " add r0, r4, #0\n" " add r1, r6, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x2f60\n" + " bl ProgramFlashSectorAndVerify\n" " add r0, r5, #1\n" " lsl r0, r0, #0x10\n" " lsr r5, r0, #0x10\n" diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c index 421cd0779..7902427e0 100644 --- a/src/engine/save_failed_screen.c +++ b/src/engine/save_failed_screen.c @@ -424,7 +424,7 @@ bool8 VerifySectorWipe(u16 sector) " mov r3, #0x80\n" " lsl r3, r3, #0x5\n" " mov r1, #0x0\n" - " bl gMysteryEventScriptCmdTableEnd+0x2d64\n" + " bl ReadFlash\n" " mov r0, #0x0\n" " ldr r1, ._50 + 4\n" "._49:\n" diff --git a/src/field/choose_party.c b/src/field/choose_party.c index fd5808fc3..b2d950e35 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -540,7 +540,7 @@ void debug_sub_81381B4() " add r0, r4, #0\n" " mov r1, #0x0\n" " mov r2, #0x60\n" - " bl gMysteryEventScriptCmdTableEnd+0x5c24\n" + " bl memset\n" " mov r7, #0x0\n" " mov r8, r4\n" " mov r0, #0x4\n" diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index 85cfdb829..c382db19f 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -291,7 +291,7 @@ u8 TryDoMetatileBehaviorForcedMovement() " lsr r0, r0, #0x16\n" " add r0, r0, r4\n" " ldr r0, [r0]\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cf4\n" + " bl _call_via_r0\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" "._26:\n" @@ -513,7 +513,7 @@ void MovePlayerNotOnBike(u8 u81, u16 u161) " ldr r2, [r0]\n" " add r0, r5, #0\n" " add r1, r6, #0\n" - " bl gMysteryEventScriptCmdTableEnd+0x3cfc\n" + " bl _call_via_r2\n" "._83:\n" " pop {r4, r5, r6}\n" " pop {r0}\n" diff --git a/src/field/party_menu.c b/src/field/party_menu.c index 4fdb17786..4108145c1 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -989,7 +989,7 @@ bool8 InitPartyMenu(void) add r2, r2, #0x4\n\ add r0, r0, r2\n\ ldr r0, [r0]\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cf4\n\ + bl _call_via_r0\n\ lsl r0, r0, #0x18\n\ lsr r0, r0, #0x18\n\ cmp r0, #0x1\n\ diff --git a/src/field/secret_base.c b/src/field/secret_base.c index 082e8ebc6..01e9711dc 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -1686,13 +1686,13 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) add r0, r6, r4\n\ mov r1, #0x0\n\ add r2, r5, #0\n\ - bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + bl memset\n\ add r4, r4, r5\n\ add r4, r6, r4\n\ add r0, r4, #0\n\ mov r1, #0x0\n\ add r2, r5, #0\n\ - bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + bl memset\n\ b ._505\n\ ._501:\n\ lsl r0, r5, #0x1\n\ @@ -1700,7 +1700,7 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) add r0, r6, r0\n\ mov r1, #0x0\n\ add r2, r5, #0\n\ - bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + bl memset\n\ ._505:\n\ cmp r7, #0x1\n\ beq ._506 @cond_branch\n\ diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c index 63f1b322a..6f187ad71 100644 --- a/src/pokemon/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -646,7 +646,7 @@ void debug_sub_803F55C() " ldr r4, [sp]\n" " mul r0, r0, r4\n" " mov r1, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " add r0, r0, r4\n" " add r0, r0, #0xa\n" " str r0, [sp, #0x4]\n" @@ -673,7 +673,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " add r0, r0, #0x5\n" " str r0, [sp, #0x8]\n" " add r0, r5, #0\n" @@ -705,7 +705,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " add r0, r0, #0x5\n" " str r0, [sp, #0xc]\n" " add r0, r5, #0\n" @@ -737,7 +737,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " add r0, r0, #0x5\n" " str r0, [sp, #0x10]\n" " add r0, r5, #0\n" @@ -769,7 +769,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " add r0, r0, #0x5\n" " str r0, [sp, #0x14]\n" " add r0, r5, #0\n" @@ -801,7 +801,7 @@ void debug_sub_803F55C() " ldr r1, [sp]\n" " mul r0, r0, r1\n" " mov r1, #0x64\n" - " bl gMysteryEventScriptCmdTableEnd+0x3d30\n" + " bl __divsi3\n" " add r0, r0, #0x5\n" " str r0, [sp, #0x18]\n" " add r0, r5, #0\n" diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 29973fd99..f1bded592 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -1042,7 +1042,7 @@ bool8 sub_809DA84(void) lsl r1, r1, #0x2\n\ add r1, r1, r0\n\ ldr r0, [r1]\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cf4\n\ + bl _call_via_r0\n\ ._132:\n\ ldr r1, ._134 + 8\n\ ldr r2, ._134 + 12\n\ @@ -1071,7 +1071,7 @@ bool8 sub_809DA84(void) add r1, r1, r2\n\ add r0, r0, #0x10\n\ ldr r1, [r1]\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cf8\n\ + bl _call_via_r1\n\ ldr r1, ._140 + 8\n\ ldr r2, ._140 + 12\n\ add r1, r1, r2\n\ diff --git a/src/roulette.c b/src/roulette.c index e01f085a2..5a8d35647 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -646,10 +646,10 @@ void sub_8115384(void) ldr r0, ._47 + 16\n\ mov r1, #0xc0\n\ lsl r1, r1, #0x13\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cb8\n\ + bl LZ77UnCompVram\n\ ldr r0, ._47 + 20\n\ ldr r1, ._47 + 24\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cb8\n\ + bl LZ77UnCompVram\n\ ldr r1, ._47 + 28\n\ ldr r3, ._47 + 32\n\ add r1, r1, r3\n\ @@ -706,10 +706,10 @@ void sub_8115384(void) bl ClearBGTilemapBuffers\n\ ldr r0, ._56\n\ ldr r1, ._56 + 4\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cbc\n\ + bl LZ77UnCompWram\n\ ldr r0, ._56 + 8\n\ ldr r1, ._56 + 12\n\ - bl gMysteryEventScriptCmdTableEnd+0x3cb8\n\ + bl LZ77UnCompVram\n\ ldr r1, ._56 + 16\n\ ldr r3, ._56 + 20\n\ add r1, r1, r3\n\ @@ -1051,11 +1051,11 @@ void sub_8115634(u8 unused) ldr r1, ._75 + 16\n\ str r1, [r0]\n\ ldr r0, ._75 + 20\n\ - bl gMysteryEventScriptCmdTableEnd+0x1c08\n\ + bl m4aMPlayStop\n\ ldr r0, ._75 + 24\n\ - bl gMysteryEventScriptCmdTableEnd+0x1c08\n\ + bl m4aMPlayStop\n\ ldr r0, ._75 + 28\n\ - bl gMysteryEventScriptCmdTableEnd+0x1c08\n\ + bl m4aMPlayStop\n\ ._74:\n\ pop {r4, r5, r6}\n\ pop {r0}\n\ @@ -2034,7 +2034,7 @@ void sub_8116B40(u8 taskid) // end roulette ? mov r2, #0xbe\n\ lsl r2, r2, #0x1\n\ mov r1, #0x0\n\ - bl gMysteryEventScriptCmdTableEnd+0x5c24\n\ + bl memset\n\ ldr r1, ._381 + 4\n\ ldr r0, ._381 + 8\n\ mov r4, #0x0\n\ @@ -4473,7 +4473,7 @@ void debug_sub_812E698() add r0, r7, #0\n\ bl sub_81186B8\n\ mov r0, #0x38\n\ - bl gMysteryEventScriptCmdTableEnd+0x13c0\n\ + bl m4aSongNumStart\n\ bl Random\n\ mov r1, #0x1\n\ and r1, r1, r0\n\ @@ -4489,7 +4489,7 @@ void debug_sub_812E698() ldrb r0, [r0]\n\ add r0, r0, #0x1\n\ mov r1, #0xc\n\ - bl gMysteryEventScriptCmdTableEnd+0x3e40\n\ + bl __modsi3\n\ add r1, r4, #0\n\ add r1, r1, #0x7f\n\ strb r0, [r1]\n\ @@ -4515,7 +4515,7 @@ void debug_sub_812E698() add r0, r0, r1\n\ ldr r1, [r0]\n\ add r0, r1, #0\n\ - bl gMysteryEventScriptCmdTableEnd+0x54dc\n\ + bl __addsf3\n\ str r0, [r5]\n\ add r0, r6, #0\n\ add r0, r0, #0x7e\n\ @@ -4845,7 +4845,7 @@ void sub_8118F8C(struct Sprite *sprite) mov r8, r0\n\ ldr r0, [r0]\n\ ldr r1, ._868 + 4\n\ - bl gMysteryEventScriptCmdTableEnd+0x5928\n\ + bl __gtsf2\n\ cmp r0, #0\n\ bgt ._874 @cond_branch\n\ add r0, r6, #0\n\ @@ -4868,26 +4868,26 @@ void sub_8118F8C(struct Sprite *sprite) mov r4, #0x3\n\ ldsb r4, [r0, r4]\n\ add r0, r4, #0\n\ - bl gMysteryEventScriptCmdTableEnd+0x5a48\n\ + bl __floatsisf\n\ add r5, r0, #0\n\ cmp r4, #0\n\ bge ._865 @cond_branch\n\ ldr r1, ._868 + 16\n\ - bl gMysteryEventScriptCmdTableEnd+0x54dc\n\ + bl __addsf3\n\ add r5, r0, #0\n\ ._865:\n\ lsr r0, r7, #0x19\n\ add r0, r0, r9\n\ ldrb r0, [r0, #0x4]\n\ add r0, r0, #0x1\n\ - bl gMysteryEventScriptCmdTableEnd+0x5a48\n\ + bl __floatsisf\n\ add r1, r0, #0\n\ add r0, r5, #0\n\ - bl gMysteryEventScriptCmdTableEnd+0x56a0\n\ + bl __divsf3\n\ add r1, r0, #0\n\ mov r2, r8\n\ ldr r0, [r2]\n\ - bl gMysteryEventScriptCmdTableEnd+0x5508\n\ + bl __subsf3\n\ mov r1, r8\n\ str r0, [r1]\n\ mov r0, #0x4\n\ @@ -4923,13 +4923,13 @@ void sub_8118F8C(struct Sprite *sprite) ldr r0, [r6]\n\ ldr r4, ._875\n\ add r1, r4, #0\n\ - bl gMysteryEventScriptCmdTableEnd+0x58e0\n\ + bl __nesf2\n\ cmp r0, #0\n\ beq ._874 @cond_branch\n\ mov r2, r8\n\ ldr r0, [r2]\n\ add r1, r4, #0\n\ - bl gMysteryEventScriptCmdTableEnd+0x59b8\n\ + bl __ltsf2\n\ cmp r0, #0\n\ bge ._874 @cond_branch\n\ str r4, [r6]\n\ @@ -4938,11 +4938,11 @@ void sub_8118F8C(struct Sprite *sprite) add r4, r5, #0\n\ add r4, r4, #0x98\n\ ldr r0, [r4]\n\ - bl gMysteryEventScriptCmdTableEnd+0x5b4c\n\ + bl __extendsfdf2\n\ ldr r2, ._875 + 4\n\ ldr r3, ._875 + 8\n\ - bl gMysteryEventScriptCmdTableEnd+0x4c2c\n\ - bl gMysteryEventScriptCmdTableEnd+0x51e8\n\ + bl __divdf3\n\ + bl __truncdfsf2\n\ str r0, [r4]\n\ ._874:\n\ pop {r3, r4}\n\ diff --git a/src/scene/cute_sketch.c b/src/scene/cute_sketch.c index c4d9463f5..848249528 100644 --- a/src/scene/cute_sketch.c +++ b/src/scene/cute_sketch.c @@ -212,7 +212,7 @@ void debug_sub_8110D84(void) b ._65\n\ ._38:\n\ mov r0, #0x5\n\ - bl gMysteryEventScriptCmdTableEnd+0x13c0\n\ + bl m4aSongNumStart\n\ ldr r1, ._41 + 4\n\ add r0, r4, r1\n\ mov r1, #0x1\n\ @@ -228,7 +228,7 @@ void debug_sub_8110D84(void) .word sub_80FC69C+1\n\ ._36:\n\ mov r0, #0x5\n\ - bl gMysteryEventScriptCmdTableEnd+0x13c0\n\ + bl m4aSongNumStart\n\ mov r0, #0x1\n\ neg r0, r0\n\ mov r1, #0x0\n\ -- cgit v1.2.3 From 305f571fb55bedea92eb0afad0d908fafc60f5c6 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 23 Jan 2018 00:32:33 -0600 Subject: dump more baseroms and fix more false offsets --- src/debug/tomomichi_debug_menu.c | 8 ++-- src/debug/unk_debug_menu_3.c | 80 ++++++++++++++++++++-------------------- src/engine/mystery_event_menu.c | 18 ++++----- 3 files changed, 53 insertions(+), 53 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 0549cb5c0..68c05270f 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -4223,7 +4223,7 @@ void debug_sub_808D54C() " .align 2, 0\n" "._325:\n" " .word gMain\n" - " .word gUnknown_Debug_083C1194+0x2\n" + " .word gUnknown_Debug_083C1196\n" "._323:\n" " add r0, r4, #0\n" " bl FlagClear\n" @@ -4288,7 +4288,7 @@ void debug_sub_808D59C() " .align 2, 0\n" "._329:\n" " .word gUnknown_Debug_083C1194\n" - " .word gUnknown_Debug_083C1194+0x2\n" + " .word gUnknown_Debug_083C1196\n" "\n" ); } @@ -4554,7 +4554,7 @@ void debug_sub_808D790() " .align 2, 0\n" "._351:\n" " .word gMain\n" - " .word gUnknown_Debug_083C12D0+0x2\n" + " .word gUnknown_Debug_083C12D2\n" "._349:\n" " add r0, r4, #0\n" " bl FlagClear\n" @@ -4619,7 +4619,7 @@ void debug_sub_808D7E0() " .align 2, 0\n" "._355:\n" " .word gUnknown_Debug_083C12D0\n" - " .word gUnknown_Debug_083C12D0+0x2\n" + " .word gUnknown_Debug_083C12D2\n" "\n" ); } diff --git a/src/debug/unk_debug_menu_3.c b/src/debug/unk_debug_menu_3.c index 411b32fe3..fa944b25f 100644 --- a/src/debug/unk_debug_menu_3.c +++ b/src/debug/unk_debug_menu_3.c @@ -25,8 +25,8 @@ int debug_sub_813C404() "._2:\n" " .align 2, 0\n" "._1:\n" - " .word gOtherText_DataCannotUseVersion+0x30d\n" - " .word gOtherText_DataCannotUseVersion+0x3c\n" + " .word gUnknown_Debug_845DDB2\n" + " .word gUnknown_Debug_845DAE1\n" "\n" ); } @@ -53,8 +53,8 @@ int debug_sub_813C430() "._4:\n" " .align 2, 0\n" "._3:\n" - " .word gOtherText_DataCannotUseVersion+0x95d\n" - " .word gOtherText_DataCannotUseVersion+0x93b\n" + " .word gUnknown_Debug_845E402\n" + " .word gUnknown_Debug_845E3E0\n" "\n" ); } @@ -81,8 +81,8 @@ int debug_sub_813C45C() "._6:\n" " .align 2, 0\n" "._5:\n" - " .word gOtherText_DataCannotUseVersion+0x99e\n" - " .word gOtherText_DataCannotUseVersion+0x97d\n" + " .word gUnknown_Debug_845E443\n" + " .word gUnknown_Debug_845E422\n" "\n" ); } @@ -109,8 +109,8 @@ int debug_sub_813C488() "._8:\n" " .align 2, 0\n" "._7:\n" - " .word gOtherText_DataCannotUseVersion+0x97d\n" - " .word gOtherText_DataCannotUseVersion+0x95d\n" + " .word gUnknown_Debug_845E422\n" + " .word gUnknown_Debug_845E402\n" "\n" ); } @@ -132,8 +132,8 @@ int debug_sub_813C4B4() "._10:\n" " .align 2, 0\n" "._9:\n" - " .word gOtherText_DataCannotUseVersion+0xb74\n" - " .word gOtherText_DataCannotUseVersion+0xb61\n" + " .word gUnknown_Debug_845E619\n" + " .word gUnknown_Debug_845E606\n" "\n" ); } @@ -160,8 +160,8 @@ int debug_sub_813C4D4() "._12:\n" " .align 2, 0\n" "._11:\n" - " .word gOtherText_DataCannotUseVersion+0xc6d\n" - " .word gOtherText_DataCannotUseVersion+0xb74\n" + " .word gUnknown_Debug_845E712\n" + " .word gUnknown_Debug_845E619\n" "\n" ); } @@ -188,8 +188,8 @@ int debug_sub_813C500() "._14:\n" " .align 2, 0\n" "._13:\n" - " .word gOtherText_DataCannotUseVersion+0xcf2\n" - " .word gOtherText_DataCannotUseVersion+0xc6d\n" + " .word gUnknown_Debug_845E797\n" + " .word gUnknown_Debug_845E712\n" "\n" ); } @@ -234,9 +234,9 @@ void debug_sub_813C52C() "._16:\n" " .align 2, 0\n" "._15:\n" - " .word gOtherText_DataCannotUseVersion+0xd16\n" - " .word gOtherText_DataCannotUseVersion+0xcf2\n" - " .word gOtherText_DataCannotUseVersion+0xd10\n" + " .word gUnknown_Debug_845E7BB\n" + " .word gUnknown_Debug_845E797\n" + " .word gUnknown_Debug_845E7B5\n" "\n" ); } @@ -358,10 +358,10 @@ int debug_sub_813C5B4() " .align 2, 0\n" "._23:\n" " .word gSaveBlock1+0x3160\n" - " .word gOtherText_DataCannotUseVersion+0x331\n" - " .word gOtherText_DataCannotUseVersion+0x30d\n" - " .word gOtherText_DataCannotUseVersion+0x861\n" - " .word sUnusedFlashSectors+0x8\n" + " .word gUnknown_Debug_845DDD6\n" + " .word gUnknown_Debug_845DDB2\n" + " .word gUnknown_Debug_845E306\n" + " .word Str_842E23C\n" " .word 0xfff\n" " .word 0x52f\n" "\n" @@ -422,8 +422,8 @@ void debug_sub_813C638() " .align 2, 0\n" "._25:\n" " .word 0x270f\n" - " .word sUnusedFlashSectors+0xc\n" - " .word sUnusedFlashSectors+0x14\n" + " .word Str_842E240\n" + " .word Str_842E248\n" "\n" ); } @@ -590,12 +590,12 @@ int debug_sub_813C740() "._30:\n" " .align 2, 0\n" "._29:\n" - " .word gOtherText_DataCannotUseVersion+0x99e\n" - " .word gOtherText_DataCannotUseVersion+0xa4a\n" + " .word gUnknown_Debug_845E443\n" + " .word gUnknown_Debug_845E4EF\n" " .word gEnemyParty\n" - " .word sUnusedFlashSectors+0x4\n" - " .word gOtherText_DataCannotUseVersion+0x9c2\n" - " .word gOtherText_DataCannotUseVersion+0xa26\n" + " .word Str_842E238\n" + " .word gUnknown_Debug_845E467\n" + " .word gUnknown_Debug_845E4CB\n" "\n" ); } @@ -651,11 +651,11 @@ int debug_sub_813C810() "._32:\n" " .align 2, 0\n" "._31:\n" - " .word gOtherText_DataCannotUseVersion+0x99e\n" - " .word gOtherText_DataCannotUseVersion+0xa4a\n" + " .word gUnknown_Debug_845E443\n" + " .word gUnknown_Debug_845E4EF\n" " .word gEnemyParty\n" - " .word gOtherText_DataCannotUseVersion+0x9c2\n" - " .word gOtherText_DataCannotUseVersion+0xa26\n" + " .word gUnknown_Debug_845E467\n" + " .word gUnknown_Debug_845E4CB\n" "\n" ); } @@ -713,11 +713,11 @@ int debug_sub_813C888() "._34:\n" " .align 2, 0\n" "._33:\n" - " .word gOtherText_DataCannotUseVersion+0x99e\n" - " .word gOtherText_DataCannotUseVersion+0xa4a\n" + " .word gUnknown_Debug_845E443\n" + " .word gUnknown_Debug_845E4EF\n" " .word gEnemyParty\n" - " .word gOtherText_DataCannotUseVersion+0x9c2\n" - " .word gOtherText_DataCannotUseVersion+0xa26\n" + " .word gUnknown_Debug_845E467\n" + " .word gUnknown_Debug_845E4CB\n" "\n" ); } @@ -791,11 +791,11 @@ int debug_sub_813C93C() "._38:\n" " .align 2, 0\n" "._37:\n" - " .word gOtherText_DataCannotUseVersion+0xa4a\n" - " .word gOtherText_DataCannotUseVersion+0xb61\n" - " .word sUnusedFlashSectors+0x24\n" + " .word gUnknown_Debug_845E4EF\n" + " .word gUnknown_Debug_845E606\n" + " .word Str_842E253+5 @ weird...\n" " .word 0x270f\n" - " .word gOtherText_DataCannotUseVersion+0xa61\n" + " .word gUnknown_Debug_845E506\n" "\n" ); } diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index da2973945..c80a8f3e9 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -397,9 +397,9 @@ void debug_sub_815D04C() " .align 2, 0\n" "._125:\n" " .word gTasks\n" - " .word sUnusedFlashSectors+0x9c\n" + " .word gUnknown_Debug_842E2D0\n" " .word gMain\n" - " .word sUnusedFlashSectors+0x11c\n" + " .word gUnknown_Debug_842E350\n" "._123:\n" " sub r0, r1, #1\n" "._124:\n" @@ -435,7 +435,7 @@ void debug_sub_815D04C() " .align 2, 0\n" "._130:\n" " .word gTasks\n" - " .word sUnusedFlashSectors+0x11c\n" + " .word gUnknown_Debug_842E350\n" "._128:\n" " ldrh r0, [r4, #0xa]\n" " add r0, r0, #0x1\n" @@ -481,7 +481,7 @@ void debug_sub_815D04C() " .align 2, 0\n" "._133:\n" " .word gTasks\n" - " .word sUnusedFlashSectors+0x9c\n" + " .word gUnknown_Debug_842E2D0\n" " .word +0x2004000\n" " .word 0x43c\n" "\n" @@ -603,7 +603,7 @@ void debug_sub_815D1D8() "._161:\n" " .word gPaletteFade\n" " .word gLinkTestBlockChecksums+0x8\n" - " .word gUnknown_0841192C+0x14\n" + " .word Str_843DA70\n" " .word 0x43c\n" "._144:\n" " bl Menu_UpdateWindowText\n" @@ -653,7 +653,7 @@ void debug_sub_815D1D8() "._171:\n" " .word gReceivedRemoteLinkPlayers\n" " .word 0x43c\n" - " .word gUnknown_0841192C+0x28\n" + " .word Str_843DA84\n" "._146:\n" " bl Menu_UpdateWindowText\n" " lsl r0, r0, #0x18\n" @@ -690,8 +690,8 @@ void debug_sub_815D1D8() "._180:\n" " .align 2, 0\n" "._179:\n" - " .word gUnknown_0841192C+0x3c\n" - " .word +0x2004000\n" + " .word Str_843DA98\n" + " .word 0x2004000\n" " .word 0x2004\n" " .word gMain\n" " .word 0x43c\n" @@ -743,7 +743,7 @@ void debug_sub_815D1D8() " .align 2, 0\n" "._190:\n" " .word gReceivedRemoteLinkPlayers\n" - " .word gUnknown_0841192C+0x47\n" + " .word Str_843DAA3\n" " .word gMain\n" " .word 0x43c\n" "._152:\n" -- cgit v1.2.3 From 76c40aac928d139afa725182ab291436f809258d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 23 Jan 2018 08:09:31 -0500 Subject: Clean up English/German blocks (fingers crossed) --- src/battle/contest_link_80C857C.c | 46 ++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 01088bf53..4fb236294 100644 --- a/src/battle/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c @@ -215,24 +215,22 @@ void sub_80C8734(u8 taskId) case 0: if (GetMultiplayerId() == 0) { if (IsLinkTaskFinished()) { -#if GERMAN +#if ENGLISH + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN if (gTasks[taskId].data[0] == 0) { gTasks[taskId].data[0] = 3; } else { -#endif - memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); -#if GERMAN - de_sub_80C9274(FALSE); -#endif - sub_8007E9C(2); -#if ENGLISH - gTasks[taskId].data[0]++; -#elif GERMAN - gTasks[taskId].data[0] = 1; - } + memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon)); + de_sub_80C9274(FALSE); + sub_8007E9C(2); + gTasks[taskId].data[0] = 1; + } #endif } } @@ -350,7 +348,10 @@ void sub_80C8938(u8 taskId) { if (IsLinkTaskFinished()) { -#if GERMAN +#if ENGLISH + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN if (gTasks[taskId].data[0] == 0) { gTasks[taskId].data[0] = 3; @@ -358,11 +359,7 @@ void sub_80C8938(u8 taskId) else { de_sub_80C9274(TRUE); -#endif - sub_8007E9C(2); -#if ENGLISH - gTasks[taskId].data[0]++; -#elif GERMAN + sub_8007E9C(2); gTasks[taskId].data[0] = 1; } #endif @@ -626,7 +623,10 @@ void sub_80C8E1C(u8 taskId) { if (IsLinkTaskFinished()) { -#if GERMAN +#if ENGLISH + sub_8007E9C(2); + gTasks[taskId].data[0]++; +#elif GERMAN if (gTasks[taskId].data[0] == 0) { gTasks[taskId].data[0] = 3; @@ -634,12 +634,8 @@ void sub_80C8E1C(u8 taskId) else { de_sub_80C9274(FALSE); -#endif - sub_8007E9C(2); -#if ENGLISH - gTasks[taskId].data[0]++; -#elif GERMAN - gTasks[taskId].data[0] = 1; + sub_8007E9C(2); + gTasks[taskId].data[0] = 1; } #endif } -- cgit v1.2.3 From 960bc2dd01bfc5bada0cbd96318440c81cfc235d Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 23 Jan 2018 15:29:39 -0600 Subject: fix more false offsets --- src/debug/nakamura_debug_menu.c | 152 +++++++++++---------- src/debug/start_menu_debug.c | 171 ++++++++++++------------ src/debug/taya_debug_window.c | 30 ++--- src/debug/tomomichi_debug_menu.c | 278 ++++++++++++++++++++------------------- src/debug/watanabe_debug_menu.c | 211 ++++++++++++++--------------- src/engine/reset_rtc_screen.c | 8 +- 6 files changed, 442 insertions(+), 408 deletions(-) (limited to 'src') diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c index 67f4a1af7..328903126 100644 --- a/src/debug/nakamura_debug_menu.c +++ b/src/debug/nakamura_debug_menu.c @@ -2,9 +2,19 @@ #include "global.h" #include "menu.h" -EWRAM_DATA u8 _nakamuraData[0x10] = {0}; +EWRAM_DATA u8 _nakamuraData0 = 0; +EWRAM_DATA u8 _nakamuraData1 = 0; +EWRAM_DATA u8 _nakamuraData2 = 0; +EWRAM_DATA u8 _nakamuraData3 = 0; +EWRAM_DATA u8 _nakamuraData4 = 0; +EWRAM_DATA u8 _nakamuraData5 = 0; +EWRAM_DATA u16 _nakamuraData6 = 0; +EWRAM_DATA u16 _nakamuraData8 = 0; +EWRAM_DATA u16 _nakamuraDataA = 0; +EWRAM_DATA u16 _nakamuraDataC = 0; -static u8 _nakamuraStatic[32] __attribute__((unused)); +__attribute__((unused)) static u8 _nakamuraStatic0[0x18]; +__attribute__((unused)) static u8 _nakamuraStatic18; u8 debug_sub_815FC54(); u8 debug_sub_815F2B4(); @@ -605,7 +615,7 @@ void debug_sub_815F470() " .align 2, 0\n" "._39:\n" " .word gSaveBlock1\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word 0x1a08\n" " .word _843E424\n" "._37:\n" @@ -719,7 +729,7 @@ void debug_sub_815F4D8() " .align 2, 0\n" "._43:\n" " .word gStringVar1\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word gSaveBlock1\n" " .word 0x1a08\n" " .word Str_843E550\n" @@ -752,7 +762,7 @@ void debug_sub_815F5C4() " .align 2, 0\n" "._48:\n" " .word gMain\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" "._46:\n" " sub r0, r0, #0x1\n" " b ._50\n" @@ -770,7 +780,7 @@ void debug_sub_815F5C4() "._55:\n" " .align 2, 0\n" "._54:\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" "._52:\n" " add r0, r0, #0x1\n" "._50:\n" @@ -824,7 +834,7 @@ u8 debug_sub_815F62C() "._60:\n" " .align 2, 0\n" "._59:\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word gMenuCallback\n" " .word debug_sub_815F5C4+1\n" "\n" @@ -885,7 +895,7 @@ void debug_sub_815F668() "._62:\n" " .align 2, 0\n" "._61:\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word gSaveBlock1+0x1a11\n" " .word gStringVar1\n" " .word 0x186a0\n" @@ -927,7 +937,7 @@ void debug_sub_815F6E4() " .align 2, 0\n" "._63:\n" " .word gStringVar1\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word gSaveBlock1+0x1a0a\n" "\n" ); @@ -975,7 +985,7 @@ void debug_sub_815F72C() " .align 2, 0\n" "._66:\n" " .word gStringVar1\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word gSaveBlock1\n" " .word 0x1a08\n" "\n" @@ -1006,7 +1016,7 @@ void debug_sub_815F788() " .align 2, 0\n" "._68:\n" " .word Str_843E574\n" - " .word _nakamuraData+0x2\n" + " .word _nakamuraData2\n" "\n" ); } @@ -1029,7 +1039,7 @@ void debug_sub_815F7B4() "._73:\n" " .align 2, 0\n" "._72:\n" - " .word _nakamuraData+0x1\n" + " .word _nakamuraData1\n" "._70:\n" " ldr r0, ._74\n" " ldrb r0, [r0]\n" @@ -1045,7 +1055,7 @@ void debug_sub_815F7B4() "._75:\n" " .align 2, 0\n" "._74:\n" - " .word _nakamuraData+0x3\n" + " .word _nakamuraData3\n" " .word Str_843E576\n" "\n" ); @@ -1115,9 +1125,9 @@ void debug_sub_815F7F0() "._79:\n" " .align 2, 0\n" "._78:\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word gSaveBlock1+0x1a11\n" - " .word _nakamuraData+0x2\n" + " .word _nakamuraData2\n" "\n" ); } @@ -1158,9 +1168,9 @@ void debug_sub_815F86C() "._85:\n" " .align 2, 0\n" "._84:\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word gSaveBlock1+0x1a0a\n" - " .word _nakamuraData+0x2\n" + " .word _nakamuraData2\n" "._80:\n" " ldr r0, ._87\n" " ldrb r0, [r0]\n" @@ -1174,7 +1184,7 @@ void debug_sub_815F86C() "._88:\n" " .align 2, 0\n" "._87:\n" - " .word _nakamuraData+0x3\n" + " .word _nakamuraData3\n" " .word ._89\n" "._89:\n" " .word ._90\n" @@ -1229,7 +1239,7 @@ void debug_sub_815F86C() "._102:\n" " .align 2, 0\n" "._101:\n" - " .word _nakamuraData+0x2\n" + " .word _nakamuraData2\n" "\n" ); } @@ -1260,7 +1270,7 @@ void debug_sub_815F930() "._108:\n" " .align 2, 0\n" "._107:\n" - " .word _nakamuraData+0x1\n" + " .word _nakamuraData1\n" " .word gMain\n" "._105:\n" " mov r0, #0x1\n" @@ -1296,7 +1306,7 @@ void debug_sub_815F930() "._118:\n" " .align 2, 0\n" "._117:\n" - " .word _nakamuraData+0x2\n" + " .word _nakamuraData2\n" "._115:\n" " sub r0, r0, #0x1\n" "._116:\n" @@ -1319,7 +1329,7 @@ void debug_sub_815F930() "._124:\n" " .align 2, 0\n" "._123:\n" - " .word _nakamuraData+0x2\n" + " .word _nakamuraData2\n" "._121:\n" " add r0, r1, #1\n" " strb r0, [r2]\n" @@ -1344,7 +1354,7 @@ void debug_sub_815F930() "._130:\n" " .align 2, 0\n" "._129:\n" - " .word _nakamuraData+0x3\n" + " .word _nakamuraData3\n" "._126:\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -1433,7 +1443,7 @@ void debug_sub_815FA38() "._147:\n" " .align 2, 0\n" "._146:\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" "._144:\n" " sub r0, r0, #0x1\n" " b ._148\n" @@ -1453,7 +1463,7 @@ void debug_sub_815FA38() "._153:\n" " .align 2, 0\n" "._152:\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" "._150:\n" " add r0, r0, #0x1\n" "._148:\n" @@ -1495,11 +1505,11 @@ void debug_sub_815FA38() "._160:\n" " .align 2, 0\n" "._159:\n" - " .word _nakamuraData\n" + " .word _nakamuraData0\n" " .word gSaveBlock1\n" " .word 0x1a08\n" - " .word _nakamuraData+0x1\n" - " .word _nakamuraData+0x2\n" + " .word _nakamuraData1\n" + " .word _nakamuraData2\n" " .word gMenuCallback\n" " .word debug_sub_815F930+1\n" "._155:\n" @@ -1558,8 +1568,8 @@ u8 debug_sub_815FB1C() "._163:\n" " .align 2, 0\n" "._162:\n" - " .word _nakamuraData\n" - " .word _nakamuraData+0x3\n" + " .word _nakamuraData0\n" + " .word _nakamuraData3\n" " .word gMenuCallback\n" " .word debug_sub_815FA38+1\n" "\n" @@ -2216,7 +2226,7 @@ void debug_sub_815FFDC() " .align 2, 0\n" "._214:\n" " .word Str_843E5D4\n" - " .word _nakamuraStatic\n" + " .word _nakamuraStatic0\n" " .word gPlayerParty\n" "._212:\n" " mov r0, #0x1\n" @@ -2249,7 +2259,7 @@ void debug_sub_815FFDC() "._218:\n" " .align 2, 0\n" "._217:\n" - " .word _nakamuraData+0x4\n" + " .word _nakamuraData4\n" " .word gMenuCallback\n" " .word debug_sub_8160498+1\n" "\n" @@ -2284,7 +2294,7 @@ void debug_sub_816009C() "._220:\n" " .align 2, 0\n" "._219:\n" - " .word _nakamuraStatic\n" + " .word _nakamuraStatic0\n" " .word gSpeciesNames\n" "\n" ); @@ -2386,7 +2396,7 @@ void debug_sub_816013C() " .align 2, 0\n" "._229:\n" " .word gStringVar1\n" - " .word _nakamuraStatic\n" + " .word _nakamuraStatic0\n" "\n" ); } @@ -2430,7 +2440,7 @@ void debug_sub_816017C() "._233:\n" " .align 2, 0\n" "._232:\n" - " .word _nakamuraStatic\n" + " .word _nakamuraStatic0\n" "\n" ); } @@ -2508,7 +2518,7 @@ void debug_sub_81601C8() "._240:\n" " .align 2, 0\n" "._239:\n" - " .word _nakamuraStatic\n" + " .word _nakamuraStatic0\n" " .word 0xfffffe65\n" " .word 0x19b\n" " .word gPlayerParty\n" @@ -2538,7 +2548,7 @@ void debug_sub_8160258() "._243:\n" " .align 2, 0\n" "._242:\n" - " .word _nakamuraStatic\n" + " .word _nakamuraStatic0\n" "\n" ); } @@ -2613,7 +2623,7 @@ void debug_sub_816027C() "._248:\n" " .align 2, 0\n" "._247:\n" - " .word _nakamuraStatic\n" + " .word _nakamuraStatic0\n" " .word gPlayerParty\n" " .word gBaseStats\n" " .word gExperienceTables\n" @@ -2759,7 +2769,7 @@ void debug_sub_81603B8() "._260:\n" " .align 2, 0\n" "._259:\n" - " .word _nakamuraData+0x4\n" + " .word _nakamuraData4\n" " .word _843E5D1\n" "._257:\n" " lsl r0, r5, #0x1\n" @@ -2780,7 +2790,7 @@ void debug_sub_81603B8() "._265:\n" " .align 2, 0\n" "._264:\n" - " .word _nakamuraData+0x4\n" + " .word _nakamuraData4\n" "._262:\n" " lsl r0, r5, #0x1\n" " add r0, r0, r5\n" @@ -2926,7 +2936,7 @@ void debug_sub_8160498() "._290:\n" " .align 2, 0\n" "._289:\n" - " .word _nakamuraData+0x4\n" + " .word _nakamuraData4\n" "._284:\n" " mov r0, #0x2\n" " and r0, r0, r1\n" @@ -2942,7 +2952,7 @@ void debug_sub_8160498() "._295:\n" " .align 2, 0\n" "._294:\n" - " .word _nakamuraData+0x4\n" + " .word _nakamuraData4\n" "._291:\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" @@ -2985,7 +2995,7 @@ void debug_sub_8160498() "._302:\n" " .align 2, 0\n" "._301:\n" - " .word _nakamuraData+0x4\n" + " .word _nakamuraData4\n" "._296:\n" " mov r0, #0x80\n" " lsl r0, r0, #0x2\n" @@ -3041,7 +3051,7 @@ void debug_sub_8160498() "._309:\n" " .align 2, 0\n" "._308:\n" - " .word _nakamuraData+0x4\n" + " .word _nakamuraData4\n" "._303:\n" " mov r0, #0x8\n" " and r0, r0, r2\n" @@ -3179,7 +3189,7 @@ void debug_sub_816062C() " .align 2, 0\n" "._323:\n" " .word gPlayerParty\n" - " .word _nakamuraStatic\n" + " .word _nakamuraStatic0\n" "\n" ); } @@ -3703,7 +3713,7 @@ void debug_sub_8160A80() "._423:\n" " .align 2, 0\n" "._422:\n" - " .word _nakamuraStatic+0x18\n" + " .word _nakamuraStatic18\n" " .word gStringVar1\n" "._420:\n" " cmp r0, #0x1\n" @@ -3813,7 +3823,7 @@ void debug_sub_8160B50() "._446:\n" " .align 2, 0\n" "._445:\n" - " .word _nakamuraStatic+0x18\n" + " .word _nakamuraStatic18\n" "._443:\n" " cmp r0, #0x1\n" " bne ._447 @cond_branch\n" @@ -3883,7 +3893,7 @@ void debug_sub_8160BB0() " .align 2, 0\n" "._456:\n" " .word gStringVar1\n" - " .word _nakamuraStatic+0x18\n" + " .word _nakamuraStatic18\n" "\n" ); } @@ -4027,7 +4037,7 @@ void debug_sub_8160C7C() "._470:\n" " .align 2, 0\n" "._469:\n" - " .word _nakamuraStatic+0x18\n" + " .word _nakamuraStatic18\n" "\n" ); } @@ -4462,7 +4472,7 @@ void debug_sub_8161028() "._497:\n" " .align 2, 0\n" "._496:\n" - " .word _nakamuraData+0x5\n" + " .word _nakamuraData5\n" " .word gPlayerParty\n" "._491:\n" " cmp r1, #0x1\n" @@ -4480,7 +4490,7 @@ void debug_sub_8161028() "._502:\n" " .align 2, 0\n" "._501:\n" - " .word _nakamuraData+0x5\n" + " .word _nakamuraData5\n" "._493:\n" " ldr r0, ._504\n" " strb r5, [r0]\n" @@ -4488,7 +4498,7 @@ void debug_sub_8161028() "._505:\n" " .align 2, 0\n" "._504:\n" - " .word _nakamuraData+0x5\n" + " .word _nakamuraData5\n" "._499:\n" " ldrb r1, [r4]\n" " mov r0, #0x64\n" @@ -4551,7 +4561,7 @@ void debug_sub_81610BC() "._516:\n" " .align 2, 0\n" "._515:\n" - " .word _nakamuraData+0x5\n" + " .word _nakamuraData5\n" " .word gPlayerParty\n" "._513:\n" " mov r0, #0x2\n" @@ -4600,7 +4610,7 @@ void DebugMenu_EffortValues() "._520:\n" " .align 2, 0\n" "._519:\n" - " .word _nakamuraData+0x5\n" + " .word _nakamuraData5\n" " .word gPlayerParty\n" " .word gMenuCallback\n" " .word debug_sub_81610BC+1\n" @@ -4628,8 +4638,8 @@ void debug_sub_8161160() "._524:\n" " .align 2, 0\n" "._523:\n" - " .word _nakamuraData+0x6\n" - " .word _nakamuraData+0x8\n" + " .word _nakamuraData6\n" + " .word _nakamuraData8\n" "._521:\n" " ldrh r6, [r1]\n" " ldrh r5, [r2]\n" @@ -4673,8 +4683,8 @@ void debug_sub_8161160() "._530:\n" " .align 2, 0\n" "._529:\n" - " .word _nakamuraData+0xa\n" - " .word _nakamuraData+0xc\n" + " .word _nakamuraDataA\n" + " .word _nakamuraDataC\n" "\n" ); } @@ -4901,10 +4911,10 @@ void debug_sub_81612EC() "._551:\n" " .align 2, 0\n" "._550:\n" - " .word _nakamuraData+0x6\n" - " .word _nakamuraData+0x8\n" - " .word _nakamuraData+0xc\n" - " .word _nakamuraData+0xa\n" + " .word _nakamuraData6\n" + " .word _nakamuraData8\n" + " .word _nakamuraDataC\n" + " .word _nakamuraDataA\n" "._544:\n" " mov r0, #0x10\n" " and r0, r0, r1\n" @@ -4944,10 +4954,10 @@ void debug_sub_81612EC() "._559:\n" " .align 2, 0\n" "._558:\n" - " .word _nakamuraData+0x6\n" - " .word _nakamuraData+0x8\n" - " .word _nakamuraData+0xc\n" - " .word _nakamuraData+0xa\n" + " .word _nakamuraData6\n" + " .word _nakamuraData8\n" + " .word _nakamuraDataC\n" + " .word _nakamuraDataA\n" "._552:\n" " ldrh r1, [r2, #0x2e]\n" " mov r0, #0x1\n" @@ -4968,7 +4978,7 @@ void debug_sub_81612EC() "._564:\n" " .align 2, 0\n" "._563:\n" - " .word _nakamuraData+0xc\n" + " .word _nakamuraDataC\n" "._560:\n" " mov r0, #0x2\n" " and r0, r0, r1\n" @@ -5018,10 +5028,10 @@ void DebugMenu_RandomNumberTest() "._567:\n" " .align 2, 0\n" "._566:\n" - " .word _nakamuraData+0x6\n" - " .word _nakamuraData+0x8\n" - " .word _nakamuraData+0xc\n" - " .word _nakamuraData+0xa\n" + " .word _nakamuraData6\n" + " .word _nakamuraData8\n" + " .word _nakamuraDataC\n" + " .word _nakamuraDataA\n" " .word gMenuCallback\n" " .word debug_sub_81612EC+1\n" "\n" diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index d9f14a6b8..318785945 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -1,5 +1,14 @@ #if DEBUG +#include "global.h" + +__attribute__((unused)) static u8 gUnknown_030006B8[4]; +__attribute__((unused)) static u8 gUnknown_030006BC[4]; +__attribute__((unused)) static u8 gUnknown_030006C0; +__attribute__((unused)) static u8 gUnknown_030006C1; +__attribute__((unused)) static void *gUnknown_030006C4; +__attribute__((unused)) static u8 gUnknown_030006C8; + __attribute__((naked)) void debug_sub_8076AC8() { @@ -65,9 +74,9 @@ void debug_sub_8076AC8() "._4:\n" " .align 2, 0\n" "._3:\n" - " .word 0x30006c4 @ gTileset1AnimLength\n" - " .word gUnknown_Debug_0839BBC1+0x153\n" - " .word gUnknown_Debug_0839BBC1+0xd3\n" + " .word gUnknown_030006C4 \n" + " .word Str_839BD14\n" + " .word gUnknown_Debug_839BC94\n" "\n" ); } @@ -178,8 +187,8 @@ void debug_sub_8076BB4() " .align 2, 0\n" "._13:\n" " .word gTasks+0x8\n" - " .word gUnknown_Debug_0839BBC1+0xd3\n" - " .word 0x30006c4 @ gTileset1AnimLength\n" + " .word gUnknown_Debug_839BC94\n" + " .word gUnknown_030006C4 \n" "._10:\n" " ldr r0, ._18\n" " ldrh r1, [r0, #0x2e]\n" @@ -511,7 +520,7 @@ void DebugMenu_8076D6C() "._57:\n" " .align 2, 0\n" "._56:\n" - " .word gUnknown_Debug_0839BBC1+0x16b\n" + " .word Str_839BD2C\n" "._47:\n" " ldr r0, ._60\n" " ldrh r2, [r0, #0x2e]\n" @@ -535,7 +544,7 @@ void DebugMenu_8076D6C() " .align 2, 0\n" "._60:\n" " .word gMain\n" - " .word gUnknown_Debug_0839BBC1+0x18b\n" + " .word Str_839BD4C\n" "._58:\n" " mov r0, #0x2\n" " and r0, r0, r2\n" @@ -626,7 +635,7 @@ void DebugMenu_8076E30() "._79:\n" " .align 2, 0\n" "._78:\n" - " .word gUnknown_Debug_0839BBC1+0x199\n" + " .word Str_839BD5A\n" "._69:\n" " ldr r0, ._82\n" " ldrh r2, [r0, #0x2e]\n" @@ -650,7 +659,7 @@ void DebugMenu_8076E30() " .align 2, 0\n" "._82:\n" " .word gMain\n" - " .word gUnknown_Debug_0839BBC1+0x1bc\n" + " .word Str_839BD7D\n" "._80:\n" " mov r0, #0x2\n" " and r0, r0, r2\n" @@ -759,7 +768,7 @@ void DebugMenu_8076EF4() "._94:\n" " .align 2, 0\n" "._93:\n" - " .word gUnknown_Debug_0839BBC1+0x203\n" + " .word gUnknown_Debug_839BDC4\n" "\n" ); } @@ -816,7 +825,7 @@ void DebugMenu_8076F60() "._101:\n" " .align 2, 0\n" "._100:\n" - " .word gUnknown_Debug_0839BBC1+0x203\n" + " .word gUnknown_Debug_839BDC4\n" " .word gSaveBlock2\n" "._98:\n" " mov r0, #0x1\n" @@ -872,9 +881,9 @@ void DebugMenu_8077004() "._107:\n" " .align 2, 0\n" "._106:\n" - " .word 0x30006c4 @ gTileset1AnimLength\n" - " .word 0x030006c0+0x1 @ gNumTilesetAnimDmas+0x1\n" - " .word gDebug0x839B9BC+0x1a8\n" + " .word gUnknown_030006C4 \n" + " .word gUnknown_030006C1 \n" + " .word gUnknown_Debug_839BB64\n" "\n" ); } @@ -1006,8 +1015,8 @@ void DebugMenu_807709C() " .align 2, 0\n" "._120:\n" " .word gMain\n" - " .word 0x030006c0 @ gNumTilesetAnimDmas\n" - " .word 0x030006c0+0x1 @ gNumTilesetAnimDmas+0x1\n" + " .word gUnknown_030006C0 \n" + " .word gUnknown_030006C1 \n" "._118:\n" " sub r0, r0, #0x1\n" "._119:\n" @@ -1033,7 +1042,7 @@ void DebugMenu_807709C() " .align 2, 0\n" "._125:\n" " .word gMain\n" - " .word 0x030006c0+0x1 @ gNumTilesetAnimDmas+0x1\n" + " .word gUnknown_030006C1 \n" "._123:\n" " add r0, r0, #0x1\n" "._124:\n" @@ -1069,8 +1078,8 @@ void DebugMenu_807709C() "._129:\n" " .word gMain\n" " .word gDebug0x839B9BC\n" - " .word 0x030006c0 @ gNumTilesetAnimDmas\n" - " .word 0x30006c4 @ gTileset1AnimLength\n" + " .word gUnknown_030006C0 \n" + " .word gUnknown_030006C4 \n" "._127:\n" " mov r0, #0xa\n" " and r0, r0, r1\n" @@ -1127,8 +1136,8 @@ void DebugMenu_807719C() " .align 2, 0\n" "._133:\n" " .word gDebug0x839B9BC\n" - " .word 0x30006c4 @ gTileset1AnimLength\n" - " .word 0x030006c0 @ gNumTilesetAnimDmas\n" + " .word gUnknown_030006C4 \n" + " .word gUnknown_030006C0 \n" "\n" ); } @@ -1168,7 +1177,7 @@ void DebugMenu_80771EC() " .align 2, 0\n" "._135:\n" " .word gStringVar4\n" - " .word gUnknown_Debug_0839BBC1+0x243\n" + " .word Str_839BE04\n" " .word gSaveBlock1\n" "\n" ); @@ -1303,9 +1312,9 @@ void DebugMenu_8077238() "._140:\n" " .align 2, 0\n" "._139:\n" - " .word gUnknown_Debug_0839BBC1+0x246\n" - " .word gUnknown_Debug_0839BBC1+0x248\n" - " .word gUnknown_Debug_0839BBC1+0x24b\n" + " .word Str_839BE07\n" + " .word Str_839BE09\n" + " .word Str_839BE0C\n" " .word gStringVar4\n" "\n" ); @@ -1527,7 +1536,7 @@ void DebugMenu_8077434() "._158:\n" " .align 2, 0\n" "._157:\n" - " .word gUnknown_Debug_0839BBC1+0x24e\n" + " .word Str_839BE0F\n" "._152:\n" " ldr r0, ._160\n" " mov r1, #0x2\n" @@ -1542,7 +1551,7 @@ void DebugMenu_8077434() "._161:\n" " .align 2, 0\n" "._160:\n" - " .word gUnknown_Debug_0839BBC1+0x251\n" + " .word Str_839BE12\n" "._153:\n" " ldr r0, ._163\n" " mov r1, #0x3\n" @@ -1556,7 +1565,7 @@ void DebugMenu_8077434() "._164:\n" " .align 2, 0\n" "._163:\n" - " .word gUnknown_Debug_0839BBC1+0x255\n" + " .word Str_839BE16\n" "._154:\n" " ldr r0, ._166\n" " mov r1, #0x4\n" @@ -1576,7 +1585,7 @@ void DebugMenu_8077434() "._167:\n" " .align 2, 0\n" "._166:\n" - " .word gUnknown_Debug_0839BBC1+0x259\n" + " .word Str_839BE1A\n" "._155:\n" " ldr r0, ._168\n" " mov r1, #0x4\n" @@ -1598,7 +1607,7 @@ void DebugMenu_8077434() "._169:\n" " .align 2, 0\n" "._168:\n" - " .word gUnknown_Debug_0839BBC1+0x25d\n" + " .word Str_839BE1E\n" "\n" ); } @@ -1617,7 +1626,7 @@ void DebugMenu_807750C() "._171:\n" " .align 2, 0\n" "._170:\n" - " .word gUnknown_Debug_0839BBC1+0x263\n" + " .word gUnknown_Debug_839BE24\n" "\n" ); } @@ -1640,7 +1649,7 @@ void DebugMenu_SetRamBerry() "._173:\n" " .align 2, 0\n" "._172:\n" - " .word gUnknown_Debug_0839BBC1+0x263\n" + " .word gUnknown_Debug_839BE24\n" " .word gMenuCallback\n" " .word DebugMenu_807750C+1\n" "\n" @@ -1960,8 +1969,8 @@ void DebugMenu_80776B4() "._184:\n" " .align 2, 0\n" "._183:\n" - " .word gUnknown_Debug_0839BBC1+0x28b\n" - " .word 0x30006c8 @ gTileset2AnimLength\n" + " .word Str_839BE4C\n" + " .word gUnknown_030006C8 \n" "\n" ); } @@ -2007,8 +2016,8 @@ void DebugMenu_8077704() "._186:\n" " .align 2, 0\n" "._185:\n" - " .word gUnknown_Debug_0839BBC1+0x292\n" - " .word 0x30006c8 @ gTileset2AnimLength\n" + " .word Str_839BE53\n" + " .word gUnknown_030006C8 \n" "\n" ); } @@ -2040,7 +2049,7 @@ void DebugMenu_8077760() " .align 2, 0\n" "._190:\n" " .word gMain\n" - " .word 0x030006b0+0x8 @ gMenu+0x8\n" + " .word gUnknown_030006B8 \n" "._188:\n" " mov r0, #0x3\n" "._189:\n" @@ -2064,7 +2073,7 @@ void DebugMenu_8077760() "._196:\n" " .align 2, 0\n" "._195:\n" - " .word 0x030006b0+0x8 @ gMenu+0x8\n" + " .word gUnknown_030006B8 \n" "._193:\n" " mov r0, #0x0\n" "._194:\n" @@ -2117,7 +2126,7 @@ void DebugMenu_8077760() "._202:\n" " .align 2, 0\n" "._201:\n" - " .word 0x30006c8 @ gTileset2AnimLength\n" + " .word gUnknown_030006C8 \n" " .word 0xf0ff\n" "._199:\n" " mov r0, #0x0\n" @@ -2193,7 +2202,7 @@ void DebugMenu_807786C() "._206:\n" " .align 2, 0\n" "._205:\n" - " .word gUnknown_Debug_0839BBC1+0x2a3\n" + " .word Str_839BE64\n" "\n" ); } @@ -2370,7 +2379,7 @@ void DebugMenu_8077974() "._226:\n" " .word gSaveBlock1\n" " .word gStringVar1\n" - " .word gUnknown_Debug_0839BBC1+0x2cc\n" + " .word Str_839BE8D\n" "._224:\n" " ldr r0, ._230\n" " ldr r1, ._230 + 4\n" @@ -2397,10 +2406,10 @@ void DebugMenu_8077974() " .align 2, 0\n" "._230:\n" " .word gStringVar1\n" - " .word gUnknown_Debug_0839BBC1+0x2cf\n" + " .word Str_839BE90\n" " .word gSaveBlock1\n" " .word gStringVar2\n" - " .word gUnknown_Debug_0839BBC1+0x2cc\n" + " .word Str_839BE8D\n" "._228:\n" " ldr r0, ._232\n" " ldr r1, ._232 + 4\n" @@ -2418,8 +2427,8 @@ void DebugMenu_8077974() " .align 2, 0\n" "._232:\n" " .word gStringVar2\n" - " .word gUnknown_Debug_0839BBC1+0x2cf\n" - " .word gUnknown_Debug_0839BBC1+0x2aa\n" + " .word Str_839BE90\n" + " .word Str_839BE6B\n" " .word gMenuCallback\n" " .word DebugMenu_8077DB4+1\n" "\n" @@ -2486,7 +2495,7 @@ void DebugMenu_8077A60() "._239:\n" " .align 2, 0\n" "._238:\n" - " .word gUnknown_Debug_0839BBC1+0x323\n" + " .word gUnknown_Debug_839BEE4\n" "\n" ); } @@ -2510,7 +2519,7 @@ void DebugMenu_RematchTrainers() "._241:\n" " .align 2, 0\n" "._240:\n" - " .word gUnknown_Debug_0839BBC1+0x323\n" + " .word gUnknown_Debug_839BEE4\n" " .word gMenuCallback\n" " .word DebugMenu_8077A60+1\n" "\n" @@ -2614,7 +2623,7 @@ void DebugMenu_8077B00() "._253:\n" " .align 2, 0\n" "._252:\n" - " .word gUnknown_Debug_0839BBC1+0x353\n" + " .word Str_839BF14\n" "._250:\n" " ldr r0, ._254\n" " bl sub_8071F40\n" @@ -2628,7 +2637,7 @@ void DebugMenu_8077B00() "._255:\n" " .align 2, 0\n" "._254:\n" - " .word gUnknown_Debug_0839BBC1+0x35e\n" + " .word Str_839BF1F\n" " .word gMenuCallback\n" " .word DebugMenu_8077DB4+1\n" "\n" @@ -2649,7 +2658,7 @@ void DebugMenu_8077B3C() "._257:\n" " .align 2, 0\n" "._256:\n" - " .word gUnknown_Debug_0839BBC1+0x3ab\n" + " .word gUnknown_Debug_839BF6C\n" "\n" ); } @@ -2684,10 +2693,10 @@ void DebugMenu_Safari() "._261:\n" " .align 2, 0\n" "._260:\n" - " .word gUnknown_Debug_0839BBC1+0x3ab\n" + " .word gUnknown_Debug_839BF6C\n" " .word gStringVar1\n" " .word gSafariZoneStepCounter\n" - " .word gUnknown_Debug_0839BBC1+0x34b\n" + " .word Str_839BF0C\n" " .word gMenuCallback\n" " .word DebugMenu_8077B3C+1\n" "._258:\n" @@ -2795,7 +2804,7 @@ void DebugMenu_8077C00() "._263:\n" " .align 2, 0\n" "._262:\n" - " .word gUnknown_Debug_0839BBC1+0x3d3\n" + " .word gUnknown_Debug_839BF94\n" "\n" ); } @@ -2819,7 +2828,7 @@ void DebugMenu_8077C14() "._265:\n" " .align 2, 0\n" "._264:\n" - " .word gUnknown_Debug_0839BBC1+0x3d3\n" + " .word gUnknown_Debug_839BF94\n" " .word gMenuCallback\n" " .word DebugMenu_8077C00+1\n" "\n" @@ -2923,8 +2932,8 @@ void DebugMenu_8077C3C() "._272:\n" " .align 2, 0\n" "._271:\n" - " .word 0x030006b0+0xc @ gMenu+0xc\n" - " .word gUnknown_Debug_0839BBC1+0x427\n" + " .word gUnknown_030006BC \n" + " .word gUnknown_Debug_839BFE8\n" "\n" ); } @@ -3359,7 +3368,7 @@ void DebugMenu_8077F7C() "._311:\n" " .word gTasks\n" " .word gMain\n" - " .word gDebug0x839C008+0xc\n" + " .word Str_839C014\n" " .word DebugMenu_8077FFC+1\n" "._309:\n" " mov r0, #0x2\n" @@ -3540,7 +3549,7 @@ void DebugMenu_807808C() " .align 2, 0\n" "._331:\n" " .word gSaveBlock1+0x2ddc\n" - " .word gDebug0x839C008+0x16\n" + " .word Str_839C01E\n" "._329:\n" " ldr r0, ._335\n" " mov r1, #0xb\n" @@ -3563,7 +3572,7 @@ void DebugMenu_807808C() "._336:\n" " .align 2, 0\n" "._335:\n" - " .word gDebug0x839C008+0x45\n" + " .word Str_839C04D\n" "._333:\n" " ldr r0, ._337\n" " mov r1, #0xb\n" @@ -3595,7 +3604,7 @@ void DebugMenu_807808C() "._338:\n" " .align 2, 0\n" "._337:\n" - " .word gDebug0x839C008+0x45\n" + " .word Str_839C04D\n" "\n" ); } @@ -3840,7 +3849,7 @@ void DebugMenu_80782EC() " .align 2, 0\n" "._359:\n" " .word gStringVar1\n" - " .word gDebug0x839C008+0x4b\n" + " .word Str_839C053\n" "\n" ); } @@ -4232,9 +4241,9 @@ void DebugMenu_8078550() "._420:\n" " .word gStringVar1\n" " .word gStringVar2\n" - " .word gDebug0x839C008+0x264\n" + " .word gUnknown_Debug_839C26C\n" " .word gStringVar3\n" - " .word gDebug0x839C008+0x7d\n" + " .word Str_839C085\n" "._418:\n" " cmp r6, #0x1\n" " beq ._422 @cond_branch\n" @@ -4285,7 +4294,7 @@ void DebugMenu_8078550() " .align 2, 0\n" "._426:\n" " .word gStringVar3\n" - " .word gDebug0x839C008+0x74\n" + " .word Str_839C07C\n" "\n" ); } @@ -4445,7 +4454,7 @@ void DebugMenu_80786D0() " .align 2, 0\n" "._450:\n" " .word gTasks\n" - " .word gDebug0x839C008+0x264\n" + " .word gUnknown_Debug_839C26C\n" "\n" ); } @@ -4486,7 +4495,7 @@ void DebugMenu_8078714() " .align 2, 0\n" "._454:\n" " .word gTasks\n" - " .word gDebug0x839C008+0x264\n" + " .word gUnknown_Debug_839C26C\n" "\n" ); } @@ -4581,7 +4590,7 @@ void DebugMenu_80787B0() "._463:\n" " .align 2, 0\n" "._462:\n" - " .word gDebug0x839C008+0x3f4\n" + " .word gUnknown_Debug_839C3FC\n" "\n" ); } @@ -4605,7 +4614,7 @@ void DebugMenu_OpenLegendsRecord() "._465:\n" " .align 2, 0\n" "._464:\n" - " .word gDebug0x839C008+0x3f4\n" + " .word gUnknown_Debug_839C3FC\n" " .word gMenuCallback\n" " .word DebugMenu_80787B0+1\n" "\n" @@ -4677,7 +4686,7 @@ void DebugMenu_80787EC() " .word gStringVar2\n" " .word gStringVar3\n" " .word gStringVar4\n" - " .word gDebug0x839C008+0x40c\n" + " .word Str_839C414\n" "\n" ); } @@ -4827,7 +4836,7 @@ void DebugMenu_8078950() "._490:\n" " .align 2, 0\n" "._489:\n" - " .word gDebug0x839C008+0x426\n" + " .word Str_839C42E\n" "\n" ); } @@ -5166,7 +5175,7 @@ void DebugMenu_8078B70() " .align 2, 0\n" "._526:\n" " .word gStringVar1\n" - " .word gDebug0x839C008+0x430\n" + " .word Str_839C438\n" "\n" ); } @@ -5208,7 +5217,7 @@ void DebugMenu_8078B94() "._532:\n" " .align 2, 0\n" "._531:\n" - " .word gDebug0x839C008+0x43c\n" + " .word gUnknown_Debug_839C444\n" " .word gSaveBlock1+0x7f8\n" "\n" ); @@ -5330,7 +5339,7 @@ void DebugMenu_8078C80() "._549:\n" " .align 2, 0\n" "._548:\n" - " .word gDebug0x839C574+0x30\n" + " .word Str_839C5A4\n" " .word gMenuCallback\n" " .word DebugMenu_8078CA8+1\n" "\n" @@ -5397,7 +5406,7 @@ void DebugMenu_8078CE4() "._558:\n" " .word +0x2000000\n" " .word gStringVar4\n" - " .word gDebug0x839C574+0x58\n" + " .word Str_839C5CC\n" "._556:\n" " ldr r0, ._560\n" " ldr r1, ._560 + 4\n" @@ -5413,7 +5422,7 @@ void DebugMenu_8078CE4() " .align 2, 0\n" "._560:\n" " .word gStringVar4\n" - " .word gDebug0x839C574+0x6b\n" + " .word Str_839C5DF\n" " .word gMenuCallback\n" " .word DebugMenu_8078D7C+1\n" "\n" @@ -5455,7 +5464,7 @@ void DebugMenu_8078D30() "._563:\n" " .word +0x2000000\n" " .word gStringVar4\n" - " .word gDebug0x839C574+0x62\n" + " .word Str_839C5D6\n" " .word gMenuCallback\n" " .word DebugMenu_8078D7C+1\n" "\n" @@ -5534,7 +5543,7 @@ void DebugMenu_MeTooBackupMan() "._572:\n" " .align 2, 0\n" "._571:\n" - " .word gDebug0x839C574+0x20\n" + " .word gUnknown_Debug_839C594\n" " .word gMenuCallback\n" " .word DebugMenu_8078DF0+1\n" "\n" @@ -5555,7 +5564,7 @@ void DebugMenu_8078DF0() "._574:\n" " .align 2, 0\n" "._573:\n" - " .word gDebug0x839C574+0x20\n" + " .word gUnknown_Debug_839C594\n" "\n" ); } @@ -5673,7 +5682,7 @@ void DebugMenu_8078E80() "._582:\n" " .align 2, 0\n" "._581:\n" - " .word gDebug0x839C574+0x80\n" + " .word gUnknown_Debug_839C5F4\n" "\n" ); } @@ -5877,7 +5886,7 @@ void DebugMenu_8078F68() "._603:\n" " .align 2, 0\n" "._602:\n" - " .word gDebug0x839C574+0x80\n" + " .word gUnknown_Debug_839C5F4\n" "\n" ); } @@ -6082,7 +6091,7 @@ void DebugMenu_8079110() "._640:\n" " .align 2, 0\n" "._639:\n" - " .word gDebug0x839C60C+0xe\n" + " .word Str_839C61A\n" "._635:\n" " bl Menu_UpdateWindowText\n" " lsl r0, r0, #0x18\n" diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c index 954974e50..d479c59c8 100644 --- a/src/debug/taya_debug_window.c +++ b/src/debug/taya_debug_window.c @@ -677,7 +677,7 @@ void debug_sub_8090C44() "._55:\n" " .align 2, 0\n" "._54:\n" - " .word +0x2000001\n" + " .word gSharedMem+1\n" "\n" ); } @@ -710,7 +710,7 @@ void debug_sub_8090C88() " .align 2, 0\n" "._59:\n" " .word gMain\n" - " .word +0x2000000\n" + " .word gSharedMem\n" "._67:\n" " add r0, r0, #0x1\n" " strb r0, [r1]\n" @@ -729,7 +729,7 @@ void debug_sub_8090C88() "._65:\n" " .align 2, 0\n" "._64:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" "._57:\n" " ldrh r1, [r3, #0x2e]\n" " mov r0, #0x10\n" @@ -858,7 +858,7 @@ void debug_sub_8090C88() "._82:\n" " .align 2, 0\n" "._81:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x2710\n" " .word 0xffff\n" "\n" @@ -892,7 +892,7 @@ void TayaDebugMenu_PKMNLottery() "._84:\n" " .align 2, 0\n" "._83:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word gSpecialVar_Result\n" " .word gMenuCallback\n" " .word debug_sub_8090C88+1\n" @@ -1285,7 +1285,7 @@ void TayaDebugMenu_PokenavD() "._95:\n" " .align 2, 0\n" "._94:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word gUnknown_Debug_083C4F94\n" " .word 0x19b\n" " .word gPokemonStorage+0x4\n" @@ -1559,7 +1559,7 @@ void debug_sub_8091334() "._124:\n" " .align 2, 0\n" "._123:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" "._119:\n" " add r5, r3, #0\n" " add r5, r5, #0x55\n" @@ -1603,7 +1603,7 @@ void debug_sub_8091334() " .align 2, 0\n" "._131:\n" " .word gMain\n" - " .word +0x2000000\n" + " .word gSharedMem\n" "._128:\n" " add r1, r5, #0\n" " add r1, r1, #0x54\n" @@ -1803,7 +1803,7 @@ void debug_sub_8091334() " .align 2, 0\n" "._159:\n" " .word gMain\n" - " .word +0x2000000\n" + " .word gSharedMem\n" "._157:\n" " mov r3, r9\n" " ldrh r1, [r3, #0x2e]\n" @@ -1926,7 +1926,7 @@ void debug_sub_80915BC() "._168:\n" " .word 0x4000010\n" " .word gUnknown_Debug_083C50EC\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word gPlayerParty\n" "._166:\n" " add r0, r4, r5\n" @@ -1997,7 +1997,7 @@ void debug_sub_80915BC() "._172:\n" " .word gWindowTemplate_81E7224\n" " .word gUnknown_Debug_083C517C\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word debug_sub_8091320+1\n" " .word debug_sub_8091334+1\n" "\n" @@ -2041,9 +2041,9 @@ void debug_sub_80916AC() "._178:\n" " .align 2, 0\n" "._177:\n" - " .word +0x2000000\n" - " .word +0x2000012\n" - " .word +0x2000054\n" + " .word gSharedMem\n" + " .word gSharedMem+0x12\n" + " .word gSharedMem+0x54\n" "._175:\n" " mov r0, r8\n" " strb r0, [r2]\n" @@ -2114,7 +2114,7 @@ void debug_sub_80916AC() " .align 2, 0\n" "._183:\n" " .word gUnknown_Debug_083C50EC\n" - " .word +0x2000000\n" + " .word gSharedMem\n" "\n" ); } diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 68c05270f..8451a104d 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -1,9 +1,21 @@ #if DEBUG #include "global.h" +// These should be static, uninitialized once it gets decompiled. #define BSS_DATA __attribute__((section(".bss"))) - -BSS_DATA u8 gDebug_03000700[0x24] = { 0 }; +BSS_DATA u8 gDebug_03000700[4] = {0}; +BSS_DATA u8 gDebug_03000704[4] = {0}; +BSS_DATA u8 gDebug_03000708[4] = {0}; +BSS_DATA u8 gDebug_0300070C = 0; +BSS_DATA u8 gDebug_0300070D = 0; +BSS_DATA u8 gDebug_0300070E = 0; +BSS_DATA u8 gDebug_0300070F = 0; +BSS_DATA u8 gDebug_03000710[13] = {0}; +BSS_DATA u8 gDebug_0300071D = 0; +BSS_DATA u8 gDebug_0300071E = 0; +BSS_DATA u8 gDebug_0300071F = 0; +BSS_DATA u8 gDebug_03000720 = 0; +BSS_DATA u8 gDebug_03000721 = 0; __attribute__((naked)) void InitTomomichiDebugWindow() @@ -68,7 +80,7 @@ void debug_sub_808B874() " .align 2, 0\n" "._1:\n" " .word gUnknown_Debug_083C0CBA\n" - " .word gDebug_03000700+0x1d\n" + " .word gDebug_0300071D\n" " .word gMenuCallback\n" " .word debug_sub_808B8C8+1\n" "\n" @@ -128,7 +140,7 @@ void debug_sub_808B8C8() " .align 2, 0\n" "._7:\n" " .word gMain\n" - " .word gDebug_03000700+0x1d\n" + " .word gDebug_0300071D\n" " .word gUnknown_Debug_083C0CBA\n" "._5:\n" " mov r0, #0xa\n" @@ -204,10 +216,10 @@ void TomomichiDebugMenu_ContestGraphics() " .word gMenuCallback\n" " .word debug_sub_808BC48+1\n" " .word gDebug_03000700\n" - " .word gDebug_03000700+0x4\n" + " .word gDebug_03000704\n" " .word 0x6f33\n" - " .word gDebug_03000700+0x8\n" - " .word gDebug_03000700+0xc\n" + " .word gDebug_03000708\n" + " .word gDebug_0300070C\n" "\n" ); } @@ -268,10 +280,10 @@ void TomomichiDebugMenu_ArtMusGraphics() " .word gMenuCallback\n" " .word debug_sub_808BCBC+1\n" " .word gDebug_03000700\n" - " .word gDebug_03000700+0x4\n" + " .word gDebug_03000704\n" " .word 0x6f33\n" - " .word gDebug_03000700+0x8\n" - " .word gDebug_03000700+0xd\n" + " .word gDebug_03000708\n" + " .word gDebug_0300070D\n" "\n" ); } @@ -332,10 +344,10 @@ void TomomichiDebugMenu_PreviewData() " .word gMenuCallback\n" " .word debug_sub_808BD30+1\n" " .word gDebug_03000700\n" - " .word gDebug_03000700+0x4\n" + " .word gDebug_03000704\n" " .word 0x6f33\n" - " .word gDebug_03000700+0x8\n" - " .word gDebug_03000700+0xe\n" + " .word gDebug_03000708\n" + " .word gDebug_0300070E\n" "\n" ); } @@ -383,7 +395,7 @@ void TomomichiDebugMenu_TrickHouse() "._17:\n" " .word gUnknown_Debug_083C0DF4\n" " .word gUnknown_Debug_083C0E15\n" - " .word gDebug_03000700+0x1e\n" + " .word gDebug_0300071E\n" " .word gMenuCallback\n" " .word debug_sub_808BDA4+1\n" "\n" @@ -428,7 +440,7 @@ void TomomichiDebugMenu_ControlEvents() " .align 2, 0\n" "._19:\n" " .word gUnknown_Debug_083C0E32\n" - " .word gDebug_03000700+0x1f\n" + " .word gDebug_0300071F\n" " .word gMenuCallback\n" " .word debug_sub_808BE2C+1\n" "\n" @@ -473,7 +485,7 @@ void TomomichiDebugMenu_ControlFlags() " .align 2, 0\n" "._21:\n" " .word gUnknown_Debug_083C0E7F\n" - " .word gDebug_03000700+0x20\n" + " .word gDebug_03000720\n" " .word gMenuCallback\n" " .word debug_sub_808BEB4+1\n" "\n" @@ -518,7 +530,7 @@ void TomomichiDebugMenu_ControlWorks() " .align 2, 0\n" "._23:\n" " .word gUnknown_Debug_083C0EF1\n" - " .word gDebug_03000700+0x21\n" + " .word gDebug_03000721\n" " .word gMenuCallback\n" " .word debug_sub_808BF3C+1\n" "\n" @@ -782,7 +794,7 @@ void debug_sub_808BDA4() " .align 2, 0\n" "._71:\n" " .word gMain\n" - " .word gDebug_03000700+0x1e\n" + " .word gDebug_0300071E\n" " .word gUnknown_Debug_083C0E15\n" "._69:\n" " mov r0, #0xa\n" @@ -855,7 +867,7 @@ void debug_sub_808BE2C() " .align 2, 0\n" "._79:\n" " .word gMain\n" - " .word gDebug_03000700+0x1f\n" + " .word gDebug_0300071F\n" " .word gUnknown_Debug_083C0E32\n" "._77:\n" " mov r0, #0xa\n" @@ -928,7 +940,7 @@ void debug_sub_808BEB4() " .align 2, 0\n" "._87:\n" " .word gMain\n" - " .word gDebug_03000700+0x20\n" + " .word gDebug_03000720\n" " .word gUnknown_Debug_083C0E7F\n" "._85:\n" " mov r0, #0xa\n" @@ -1001,7 +1013,7 @@ void debug_sub_808BF3C() " .align 2, 0\n" "._95:\n" " .word gMain\n" - " .word gDebug_03000700+0x21\n" + " .word gDebug_03000721\n" " .word gUnknown_Debug_083C0EF1\n" "._93:\n" " mov r0, #0xa\n" @@ -1730,7 +1742,7 @@ void debug_sub_808C3B0() " .align 2, 0\n" "._165:\n" " .word gUnknown_Debug_083C2938\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -1777,7 +1789,7 @@ void debug_sub_808C408() " .align 2, 0\n" "._167:\n" " .word gUnknown_Debug_083C2A48\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -1824,7 +1836,7 @@ void debug_sub_808C460() " .align 2, 0\n" "._169:\n" " .word gUnknown_Debug_083C2B4C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -1871,7 +1883,7 @@ void debug_sub_808C4B8() " .align 2, 0\n" "._171:\n" " .word gUnknown_Debug_083C2C80\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -1918,7 +1930,7 @@ void debug_sub_808C510() " .align 2, 0\n" "._173:\n" " .word gUnknown_Debug_083C2D8C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -1965,7 +1977,7 @@ void debug_sub_808C568() " .align 2, 0\n" "._175:\n" " .word gUnknown_Debug_083C2EB0\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -2012,7 +2024,7 @@ void debug_sub_808C5C0() " .align 2, 0\n" "._177:\n" " .word gUnknown_Debug_083C2FE0\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -2059,7 +2071,7 @@ void debug_sub_808C618() " .align 2, 0\n" "._179:\n" " .word gUnknown_Debug_083C3100\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -2106,7 +2118,7 @@ void debug_sub_808C670() " .align 2, 0\n" "._181:\n" " .word gUnknown_Debug_083C3194\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808C6C8+1\n" "\n" @@ -2147,7 +2159,7 @@ void debug_sub_808C6C8() "._187:\n" " .align 2, 0\n" "._186:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._184:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -2194,7 +2206,7 @@ void debug_sub_808C714() " .align 2, 0\n" "._191:\n" " .word gMain\n" - " .word gUnknown_Debug_083C31DC+0xa\n" + " .word gUnknown_Debug_83C31E6\n" "._189:\n" " add r0, r4, #0\n" " bl FlagClear\n" @@ -2259,7 +2271,7 @@ void debug_sub_808C764() " .align 2, 0\n" "._195:\n" " .word gUnknown_Debug_083C31DC\n" - " .word gUnknown_Debug_083C31DC+0xa\n" + " .word gUnknown_Debug_83C31E6\n" "\n" ); } @@ -2390,7 +2402,7 @@ void debug_sub_808C85C() " .align 2, 0\n" "._205:\n" " .word gUnknown_Debug_083C1E0C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2437,7 +2449,7 @@ void debug_sub_808C8B4() " .align 2, 0\n" "._207:\n" " .word gUnknown_Debug_083C1F38\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2484,7 +2496,7 @@ void debug_sub_808C90C() " .align 2, 0\n" "._209:\n" " .word gUnknown_Debug_083C206C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2531,7 +2543,7 @@ void debug_sub_808C964() " .align 2, 0\n" "._211:\n" " .word gUnknown_Debug_083C2190\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2578,7 +2590,7 @@ void debug_sub_808C9BC() " .align 2, 0\n" "._213:\n" " .word gUnknown_Debug_083C2264\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2625,7 +2637,7 @@ void debug_sub_808CA14() " .align 2, 0\n" "._215:\n" " .word gUnknown_Debug_083C2370\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2672,7 +2684,7 @@ void debug_sub_808CA6C() " .align 2, 0\n" "._217:\n" " .word gUnknown_Debug_083C248C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2719,7 +2731,7 @@ void debug_sub_808CAC4() " .align 2, 0\n" "._219:\n" " .word gUnknown_Debug_083C259C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2766,7 +2778,7 @@ void debug_sub_808CB1C() " .align 2, 0\n" "._221:\n" " .word gUnknown_Debug_083C26C8\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CB74+1\n" "\n" @@ -2807,7 +2819,7 @@ void debug_sub_808CB74() "._227:\n" " .align 2, 0\n" "._226:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._224:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -2854,7 +2866,7 @@ void debug_sub_808CBC0() " .align 2, 0\n" "._231:\n" " .word gMain\n" - " .word gUnknown_Debug_083C2710+0xa\n" + " .word gUnknown_Debug_083C271A\n" "._229:\n" " add r0, r4, #0\n" " bl FlagClear\n" @@ -2919,7 +2931,7 @@ void debug_sub_808CC10() " .align 2, 0\n" "._235:\n" " .word gUnknown_Debug_083C2710\n" - " .word gUnknown_Debug_083C2710+0xa\n" + " .word gUnknown_Debug_083C271A\n" "\n" ); } @@ -3050,7 +3062,7 @@ void debug_sub_808CD08() " .align 2, 0\n" "._245:\n" " .word gUnknown_Debug_083C1B7C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CE10+1\n" "\n" @@ -3097,7 +3109,7 @@ void debug_sub_808CD60() " .align 2, 0\n" "._247:\n" " .word gUnknown_Debug_083C1BF0\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CE10+1\n" "\n" @@ -3144,7 +3156,7 @@ void debug_sub_808CDB8() " .align 2, 0\n" "._249:\n" " .word gUnknown_Debug_083C1C2C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808CE10+1\n" "\n" @@ -3185,7 +3197,7 @@ void debug_sub_808CE10() "._255:\n" " .align 2, 0\n" "._254:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._252:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -3232,7 +3244,7 @@ void debug_sub_808CE5C() " .align 2, 0\n" "._259:\n" " .word gMain\n" - " .word gUnknown_Debug_083C1C34+0x4\n" + " .word gUnknown_Debug_083C1C38\n" "._257:\n" " add r0, r4, #0\n" " bl FlagClear\n" @@ -3297,7 +3309,7 @@ void debug_sub_808CEAC() " .align 2, 0\n" "._263:\n" " .word gUnknown_Debug_083C1C34\n" - " .word gUnknown_Debug_083C1C34+0x4\n" + " .word gUnknown_Debug_083C1C38\n" "\n" ); } @@ -3428,7 +3440,7 @@ void debug_sub_808CFA4() " .align 2, 0\n" "._273:\n" " .word gUnknown_Debug_083C13D8\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3475,7 +3487,7 @@ void debug_sub_808CFFC() " .align 2, 0\n" "._275:\n" " .word gUnknown_Debug_083C1465\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3522,7 +3534,7 @@ void debug_sub_808D054() " .align 2, 0\n" "._277:\n" " .word gUnknown_Debug_083C1503\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3569,7 +3581,7 @@ void debug_sub_808D0AC() " .align 2, 0\n" "._279:\n" " .word gUnknown_Debug_083C158A\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3616,7 +3628,7 @@ void debug_sub_808D104() " .align 2, 0\n" "._281:\n" " .word gUnknown_Debug_083C1647\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3663,7 +3675,7 @@ void debug_sub_808D15C() " .align 2, 0\n" "._283:\n" " .word gUnknown_Debug_083C1712\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3710,7 +3722,7 @@ void debug_sub_808D1B4() " .align 2, 0\n" "._285:\n" " .word gUnknown_Debug_083C17F8\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3757,7 +3769,7 @@ void debug_sub_808D20C() " .align 2, 0\n" "._287:\n" " .word gUnknown_Debug_083C18B8\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3804,7 +3816,7 @@ void debug_sub_808D264() " .align 2, 0\n" "._289:\n" " .word gDebug_0x83C1974\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D2BC+1\n" "\n" @@ -3845,7 +3857,7 @@ void debug_sub_808D2BC() "._295:\n" " .align 2, 0\n" "._294:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._292:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -4088,7 +4100,7 @@ void debug_sub_808D450() " .align 2, 0\n" "._313:\n" " .word gUnknown_Debug_083C10BD\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D500+1\n" "\n" @@ -4135,7 +4147,7 @@ void debug_sub_808D4A8() " .align 2, 0\n" "._315:\n" " .word gUnknown_Debug_083C1149\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D500+1\n" "\n" @@ -4176,7 +4188,7 @@ void debug_sub_808D500() "._321:\n" " .align 2, 0\n" "._320:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._318:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -4419,7 +4431,7 @@ void debug_sub_808D694() " .align 2, 0\n" "._339:\n" " .word gUnknown_Debug_083C1212\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D744+1\n" "\n" @@ -4466,7 +4478,7 @@ void debug_sub_808D6EC() " .align 2, 0\n" "._341:\n" " .word gUnknown_Debug_083C1288\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D744+1\n" "\n" @@ -4507,7 +4519,7 @@ void debug_sub_808D744() "._347:\n" " .align 2, 0\n" "._346:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._344:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -4749,7 +4761,7 @@ void debug_sub_808D8D8() " .align 2, 0\n" "._365:\n" " .word gUnknown_Debug_083C1A9C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808D930+1\n" "\n" @@ -4790,7 +4802,7 @@ void debug_sub_808D930() "._371:\n" " .align 2, 0\n" "._370:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._368:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -4837,7 +4849,7 @@ void debug_sub_808D97C() " .align 2, 0\n" "._375:\n" " .word gMain\n" - " .word gUnknown_Debug_083C1AAC+0x2\n" + " .word gUnknown_Debug_083C1AAE\n" "._373:\n" " add r0, r4, #0\n" " bl FlagClear\n" @@ -4902,7 +4914,7 @@ void debug_sub_808D9CC() " .align 2, 0\n" "._379:\n" " .word gUnknown_Debug_083C1AAC\n" - " .word gUnknown_Debug_083C1AAC+0x2\n" + " .word gUnknown_Debug_083C1AAE\n" "\n" ); } @@ -5174,7 +5186,7 @@ void debug_sub_808DBA0() " .align 2, 0\n" "._403:\n" " .word gUnknown_Debug_083C432C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5221,7 +5233,7 @@ void debug_sub_808DBF8() " .align 2, 0\n" "._405:\n" " .word gUnknown_Debug_083C436C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5268,7 +5280,7 @@ void debug_sub_808DC50() " .align 2, 0\n" "._407:\n" " .word gUnknown_Debug_083C43B4\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5315,7 +5327,7 @@ void debug_sub_808DCA8() " .align 2, 0\n" "._409:\n" " .word gUnknown_Debug_083C43FC\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5362,7 +5374,7 @@ void debug_sub_808DD00() " .align 2, 0\n" "._411:\n" " .word gUnknown_Debug_083C4444\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5409,7 +5421,7 @@ void debug_sub_808DD58() " .align 2, 0\n" "._413:\n" " .word gUnknown_Debug_083C448C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5456,7 +5468,7 @@ void debug_sub_808DDB0() " .align 2, 0\n" "._415:\n" " .word gUnknown_Debug_83C44C4\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5503,7 +5515,7 @@ void debug_sub_808DE08() " .align 2, 0\n" "._417:\n" " .word gUnknown_Debug_83C44EC\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5550,7 +5562,7 @@ void debug_sub_808DE60() " .align 2, 0\n" "._419:\n" " .word gUnknown_Debug_083C4534\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808DEB8+1\n" "\n" @@ -5591,7 +5603,7 @@ void debug_sub_808DEB8() "._425:\n" " .align 2, 0\n" "._424:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._422:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -5654,7 +5666,7 @@ void debug_sub_808DF04() " .align 2, 0\n" "._428:\n" " .word gUnknown_Debug_083C457C\n" - " .word gUnknown_Debug_083C457C+0xa\n" + " .word gUnknown_Debug_083C4586\n" "\n" ); } @@ -5712,7 +5724,7 @@ void debug_sub_808DF64() " .align 2, 0\n" "._435:\n" " .word 0xffff\n" - " .word gUnknown_Debug_083C457C+0xa\n" + " .word gUnknown_Debug_083C4586\n" "\n" ); } @@ -5843,7 +5855,7 @@ void debug_sub_808E054() " .align 2, 0\n" "._445:\n" " .word gUnknown_Debug_083C3AA0\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E264+1\n" "\n" @@ -5890,7 +5902,7 @@ void debug_sub_808E0AC() " .align 2, 0\n" "._447:\n" " .word gUnknown_Debug_83C3AE0\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E264+1\n" "\n" @@ -5937,7 +5949,7 @@ void debug_sub_808E104() " .align 2, 0\n" "._449:\n" " .word gUnknown_Debug_83C3B28\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E264+1\n" "\n" @@ -5984,7 +5996,7 @@ void debug_sub_808E15C() " .align 2, 0\n" "._451:\n" " .word gUnknown_Debug_83C3B70\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E264+1\n" "\n" @@ -6031,7 +6043,7 @@ void debug_sub_808E1B4() " .align 2, 0\n" "._453:\n" " .word gUnknown_Debug_83C3BB8\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E264+1\n" "\n" @@ -6078,7 +6090,7 @@ void debug_sub_808E20C() " .align 2, 0\n" "._455:\n" " .word gUnknown_Debug_83C3C00\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E264+1\n" "\n" @@ -6119,7 +6131,7 @@ void debug_sub_808E264() "._461:\n" " .align 2, 0\n" "._460:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._458:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -6182,7 +6194,7 @@ void debug_sub_808E2B0() " .align 2, 0\n" "._464:\n" " .word gUnknown_Debug_083C3C48\n" - " .word gUnknown_Debug_083C3C48+0x6\n" + " .word gUnknown_Debug_83C3C4E\n" "\n" ); } @@ -6240,7 +6252,7 @@ void debug_sub_808E310() " .align 2, 0\n" "._471:\n" " .word 0xffff\n" - " .word gUnknown_Debug_083C3C48+0x6\n" + " .word gUnknown_Debug_83C3C4E\n" "\n" ); } @@ -6371,7 +6383,7 @@ void debug_sub_808E400() " .align 2, 0\n" "._481:\n" " .word gUnknown_Debug_083C347C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E5B8+1\n" "\n" @@ -6418,7 +6430,7 @@ void debug_sub_808E458() " .align 2, 0\n" "._483:\n" " .word gUnknown_Debug_083C3494\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E5B8+1\n" "\n" @@ -6465,7 +6477,7 @@ void debug_sub_808E4B0() " .align 2, 0\n" "._485:\n" " .word gUnknown_Debug_083C34A4\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E5B8+1\n" "\n" @@ -6512,7 +6524,7 @@ void debug_sub_808E508() " .align 2, 0\n" "._487:\n" " .word gUnknown_Debug_083C34D4\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E5B8+1\n" "\n" @@ -6559,7 +6571,7 @@ void debug_sub_808E560() " .align 2, 0\n" "._489:\n" " .word gUnknown_Debug_083C351C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E5B8+1\n" "\n" @@ -6600,7 +6612,7 @@ void debug_sub_808E5B8() "._495:\n" " .align 2, 0\n" "._494:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._492:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -6665,7 +6677,7 @@ void debug_sub_808E604() " .align 2, 0\n" "._501:\n" " .word 0xffff\n" - " .word gUnknown_Debug_083C3544+0x6\n" + " .word gUnknown_Debug_083C354A\n" "\n" ); } @@ -6721,7 +6733,7 @@ void debug_sub_808E660() " .align 2, 0\n" "._505:\n" " .word gUnknown_Debug_083C3544\n" - " .word gUnknown_Debug_083C3544+0x6\n" + " .word gUnknown_Debug_083C354A\n" "\n" ); } @@ -6852,7 +6864,7 @@ void debug_sub_808E754() " .align 2, 0\n" "._515:\n" " .word gUnknown_Debug_083C470C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E804+1\n" "\n" @@ -6899,7 +6911,7 @@ void debug_sub_808E7AC() " .align 2, 0\n" "._517:\n" " .word gUnknown_Debug_083C4754C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808E804+1\n" "\n" @@ -6940,7 +6952,7 @@ void debug_sub_808E804() "._523:\n" " .align 2, 0\n" "._522:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._520:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -7005,7 +7017,7 @@ void debug_sub_808E850() " .align 2, 0\n" "._529:\n" " .word 0xffff\n" - " .word gUnknown_Debug_083C478C+0x2\n" + " .word gUnknown_Debug_083C478E\n" "\n" ); } @@ -7061,7 +7073,7 @@ void debug_sub_808E8AC() " .align 2, 0\n" "._533:\n" " .word gUnknown_Debug_083C478C\n" - " .word gUnknown_Debug_083C478C+0x2\n" + " .word gUnknown_Debug_083C478E\n" "\n" ); } @@ -7192,7 +7204,7 @@ void debug_sub_808E9A0() " .align 2, 0\n" "._543:\n" " .word gUnknown_Debug_083C369C\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808EA50+1\n" "\n" @@ -7239,7 +7251,7 @@ void debug_sub_808E9F8() " .align 2, 0\n" "._545:\n" " .word gUnknown_Debug_083C36E4\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" " .word gMenuCallback\n" " .word debug_sub_808EA50+1\n" "\n" @@ -7280,7 +7292,7 @@ void debug_sub_808EA50() "._551:\n" " .align 2, 0\n" "._550:\n" - " .word gDebug_03000700+0xf\n" + " .word gDebug_0300070F\n" "._548:\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -7343,7 +7355,7 @@ void debug_sub_808EA9C() " .align 2, 0\n" "._554:\n" " .word gUnknown_Debug_083C371C\n" - " .word gUnknown_Debug_083C371C+0x2\n" + " .word gUnknown_Debug_083C371E\n" "\n" ); } @@ -7401,7 +7413,7 @@ void debug_sub_808EAFC() " .align 2, 0\n" "._561:\n" " .word 0xffff\n" - " .word gUnknown_Debug_083C371C+0x2\n" + " .word gUnknown_Debug_083C371E\n" "\n" ); } @@ -7802,7 +7814,7 @@ void debug_sub_808ED9C() " .align 2, 0\n" "._606:\n" " .word gMain\n" - " .word gDebug_03000700+0x8\n" + " .word gDebug_03000708\n" "._604:\n" " mov r0, #0x0\n" "._605:\n" @@ -7826,7 +7838,7 @@ void debug_sub_808ED9C() "._612:\n" " .align 2, 0\n" "._611:\n" - " .word gDebug_03000700+0x8\n" + " .word gDebug_03000708\n" "._609:\n" " mov r0, #0x1\n" " neg r0, r0\n" @@ -7850,7 +7862,7 @@ void debug_sub_808ED9C() "._615:\n" " .align 2, 0\n" "._614:\n" - " .word gDebug_03000700+0x8\n" + " .word gDebug_03000708\n" "\n" ); } @@ -7911,7 +7923,7 @@ void debug_sub_808EE3C() " .align 2, 0\n" "._622:\n" " .word gMain\n" - " .word gDebug_03000700+0xc\n" + " .word gDebug_0300070C\n" "\n" ); } @@ -7962,7 +7974,7 @@ void debug_sub_808EE9C() " .align 2, 0\n" "._631:\n" " .word gMain\n" - " .word gDebug_03000700+0xd\n" + " .word gDebug_0300070D\n" "._629:\n" " mov r0, #0x0\n" "._630:\n" @@ -7983,7 +7995,7 @@ void debug_sub_808EE9C() "._637:\n" " .align 2, 0\n" "._636:\n" - " .word gDebug_03000700+0xd\n" + " .word gDebug_0300070D\n" "._634:\n" " mov r0, #0xf\n" "._635:\n" @@ -8041,7 +8053,7 @@ void debug_sub_808EF14() " .align 2, 0\n" "._645:\n" " .word gMain\n" - " .word gDebug_03000700+0xe\n" + " .word gDebug_0300070E\n" "._643:\n" " mov r0, #0x0\n" "._644:\n" @@ -8062,7 +8074,7 @@ void debug_sub_808EF14() "._651:\n" " .align 2, 0\n" "._650:\n" - " .word gDebug_03000700+0xe\n" + " .word gDebug_0300070E\n" "._648:\n" " mov r0, #0xf\n" "._649:\n" @@ -8109,8 +8121,8 @@ void debug_sub_808EF8C() "._657:\n" " .align 2, 0\n" "._656:\n" - " .word gDebug_03000700+0x8\n" - " .word gDebug_03000700+0x10\n" + " .word gDebug_03000708\n" + " .word gDebug_03000710\n" "._654:\n" " add r1, r3, r4\n" " add r0, r2, #0\n" @@ -8194,7 +8206,7 @@ void debug_sub_808EF8C() "._667:\n" " .align 2, 0\n" "._666:\n" - " .word gDebug_03000700+0x10\n" + " .word gDebug_03000710\n" " .word gDebug_03000700\n" " .word gSpeciesNames\n" "._664:\n" @@ -8240,7 +8252,7 @@ void debug_sub_808EF8C() "._673:\n" " .align 2, 0\n" "._672:\n" - " .word gDebug_03000700+0x10\n" + " .word gDebug_03000710\n" " .word gDebug_03000700\n" "._669:\n" " cmp r6, #0x2\n" @@ -8252,7 +8264,7 @@ void debug_sub_808EF8C() "._678:\n" " .align 2, 0\n" "._677:\n" - " .word gDebug_03000700+0xc\n" + " .word gDebug_0300070C\n" "._668:\n" " ldr r4, ._680\n" "._676:\n" @@ -8283,7 +8295,7 @@ void debug_sub_808EF8C() "._681:\n" " .align 2, 0\n" "._680:\n" - " .word gDebug_03000700+0xd\n" + " .word gDebug_0300070D\n" "._674:\n" " ldr r4, ._682\n" " ldrb r0, [r4]\n" @@ -8318,7 +8330,7 @@ void debug_sub_808EF8C() "._683:\n" " .align 2, 0\n" "._682:\n" - " .word gDebug_03000700+0xe\n" + " .word gDebug_0300070E\n" "\n" ); } @@ -8354,8 +8366,8 @@ void debug_sub_808F168() "._686:\n" " .word +0x2015de0\n" " .word gDebug_03000700\n" - " .word gDebug_03000700+0x4\n" - " .word gDebug_03000700+0x8\n" + " .word gDebug_03000704\n" + " .word gDebug_03000708\n" " .word ._688\n" "._688:\n" " .word ._689\n" @@ -8388,7 +8400,7 @@ void debug_sub_808F168() " .word +0x2000000\n" " .word 0x15ddf\n" " .word 0x15dde\n" - " .word gDebug_03000700+0xc\n" + " .word gDebug_0300070C\n" " .word gUnknown_Debug_083C48BB\n" "._690:\n" " ldr r1, ._699\n" @@ -8410,7 +8422,7 @@ void debug_sub_808F168() " .word +0x2000000\n" " .word 0x15ddf\n" " .word 0x15dde\n" - " .word gDebug_03000700+0xd\n" + " .word gDebug_0300070D\n" "._691:\n" " ldr r1, ._702\n" " ldr r0, ._702 + 4\n" @@ -8432,7 +8444,7 @@ void debug_sub_808F168() " .word +0x2000000\n" " .word 0x15ddf\n" " .word 0x15dde\n" - " .word gDebug_03000700+0xe\n" + " .word gDebug_0300070E\n" "._692:\n" " ldr r1, ._705\n" " ldr r2, ._705 + 4\n" @@ -8526,7 +8538,7 @@ void debug_sub_808F2E0() "._715:\n" " .align 2, 0\n" "._714:\n" - " .word gDebug_03000700+0x10\n" + " .word gDebug_03000710\n" "._712:\n" " ldr r1, ._716\n" " mov r0, #0xa2\n" @@ -8544,7 +8556,7 @@ void debug_sub_808F2E0() "._717:\n" " .align 2, 0\n" "._716:\n" - " .word gDebug_03000700+0x10\n" + " .word gDebug_03000710\n" "\n" ); } @@ -8625,7 +8637,7 @@ void debug_sub_808F31C() "._719:\n" " .align 2, 0\n" "._718:\n" - " .word gDebug_03000700+0x10\n" + " .word gDebug_03000710\n" " .word 0x2710\n" "\n" ); diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index 58ae28510..cc53f8c95 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -1,7 +1,10 @@ #if DEBUG #include "global.h" -EWRAM_DATA u8 unk_debug_ewram_0[56] = { 0 }; +EWRAM_DATA u8 gUnknown_Debug_20389EC[0x20] = { 0 }; +EWRAM_DATA u8 gUnknown_Debug_2038A0C[0x10] = { 0 }; +EWRAM_DATA u8 gUnknown_Debug_2038A1C[4] = { 0 }; +EWRAM_DATA u8 gUnknown_Debug_2038A20[4] = { 0 }; u8 byte_3005E30[0x20]; @@ -655,7 +658,7 @@ void InitSizeComparison() " .align 2, 0\n" "._54:\n" " .word gReservedSpritePaletteCount\n" - " .word unk_debug_ewram_0\n" + " .word gUnknown_Debug_20389EC\n" " .word 0x4000208\n" " .word 0x4000200\n" " .word debug_80C3758+1\n" @@ -1611,7 +1614,7 @@ void InitBattleForDebug() "._139:\n" " .align 2, 0\n" "._138:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gSaveBlock2\n" " .word byte_3005E30\n" " .word debug_80C47BC+1\n" @@ -1640,7 +1643,7 @@ void debug_80C41A8() "._141:\n" " .align 2, 0\n" "._140:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word debug_80C47BC+1\n" "\n" ); @@ -1815,7 +1818,7 @@ void debug_80C42B8() "._150:\n" " .word gUnknown_Debug_083F8194\n" " .word gUnknown_Debug_083F81A0\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gTasks\n" " .word debug_80C44EC+1\n" "._148:\n" @@ -1883,7 +1886,7 @@ void debug_80C4348() "._155:\n" " .align 2, 0\n" "._154:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word 0x4000042\n" " .word 0x177\n" " .word gTasks\n" @@ -1924,7 +1927,7 @@ void debug_80C43A8() " .align 2, 0\n" "._158:\n" " .word gMain\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gPlayerParty\n" " .word debug_80C41D4+1\n" "._156:\n" @@ -2014,7 +2017,7 @@ void debug_80C43A8() "._177:\n" " .align 2, 0\n" "._176:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" "._174:\n" " ldrh r1, [r3, #0x30]\n" " mov r0, #0x80\n" @@ -2053,7 +2056,7 @@ void debug_80C43A8() "._182:\n" " .align 2, 0\n" "._181:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gPlayerParty\n" " .word gTasks\n" " .word debug_80C4348+1\n" @@ -2105,7 +2108,7 @@ void debug_80C44EC() "._184:\n" " .align 2, 0\n" "._183:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word 0x4000042\n" " .word 0x79ef\n" " .word 0x17f\n" @@ -2147,7 +2150,7 @@ void debug_80C4550() " .align 2, 0\n" "._187:\n" " .word gMain\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gEnemyParty\n" " .word debug_80C41F4+1\n" "._185:\n" @@ -2237,7 +2240,7 @@ void debug_80C4550() "._206:\n" " .align 2, 0\n" "._205:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" "._203:\n" " ldrh r1, [r3, #0x30]\n" " mov r0, #0x80\n" @@ -2276,7 +2279,7 @@ void debug_80C4550() "._211:\n" " .align 2, 0\n" "._210:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gEnemyParty\n" " .word gTasks\n" " .word debug_80C44EC+1\n" @@ -2432,7 +2435,7 @@ void debug_80C4774() "._222:\n" " .align 2, 0\n" "._221:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gPlayerParty\n" " .word gEnemyParty\n" "._219:\n" @@ -2543,7 +2546,7 @@ void debug_80C47BC() " .word gUnknown_Debug_083F81D6\n" " .word gUnknown_Debug_083F81E5\n" " .word gUnknown_Debug_083F8068\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gTasks\n" " .word debug_80C48A0+1\n" "\n" @@ -2593,7 +2596,7 @@ void debug_80C48A0() "._227:\n" " .align 2, 0\n" "._226:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word 0x4000042\n" " .word 0x177\n" " .word gTasks\n" @@ -2654,7 +2657,7 @@ void debug_80C4900() " .word gMain\n" " .word debug_80C370C+1\n" " .word gSaveBlock2\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gBattleTypeFlags\n" " .word gUnknown_02023A14_50\n" " .word gTasks\n" @@ -2712,7 +2715,7 @@ void debug_80C4900() "._236:\n" " .word gBattleTypeFlags\n" " .word gUnknown_Debug_083F8068\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gUnknown_02023A14_50\n" " .word gTasks\n" " .word debug_80C4A60+1\n" @@ -2745,7 +2748,7 @@ void debug_80C4900() "._245:\n" " .align 2, 0\n" "._244:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" "._242:\n" " ldrh r1, [r3, #0x30]\n" " mov r0, #0x80\n" @@ -2775,7 +2778,7 @@ void debug_80C4900() "._249:\n" " .align 2, 0\n" "._248:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gTasks\n" " .word debug_80C48A0+1\n" "\n" @@ -2826,7 +2829,7 @@ void debug_80C4A60() "._251:\n" " .align 2, 0\n" "._250:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word 0x4000042\n" " .word 0x79ef\n" " .word 0x17f\n" @@ -2880,7 +2883,7 @@ void debug_80C4AC4() "._256:\n" " .align 2, 0\n" "._255:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gMain\n" " .word gUnknown_Debug_083F80D8\n" " .word byte_3005E30\n" @@ -3231,7 +3234,7 @@ void debug_80C4D14() " .word gUnknown_Debug_083F81C7\n" " .word gUnknown_Debug_083F81F5\n" " .word gUnknown_Debug_083F8202\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gTasks\n" " .word debug_80C4DB8+1\n" "\n" @@ -3281,7 +3284,7 @@ void debug_80C4DB8() "._294:\n" " .align 2, 0\n" "._293:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word 0x4000042\n" " .word 0x177\n" " .word gTasks\n" @@ -3319,7 +3322,7 @@ void debug_80C4E18() "._298:\n" " .align 2, 0\n" "._297:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gMain\n" " .word gTasks\n" " .word debug_80C42B8+1\n" @@ -3616,7 +3619,7 @@ void debug_80C5038() "._323:\n" " .align 2, 0\n" "._322:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word 0x4000042\n" " .word 0x177\n" " .word gTasks\n" @@ -3680,7 +3683,7 @@ void debug_80C5098() " .align 2, 0\n" "._331:\n" " .word gSaveBlock2\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gTasks\n" " .word debug_80C42B8+1\n" "._329:\n" @@ -3698,7 +3701,7 @@ void debug_80C5098() "._337:\n" " .align 2, 0\n" "._336:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" "._334:\n" " ldrh r1, [r3, #0x30]\n" " mov r0, #0x80\n" @@ -3727,7 +3730,7 @@ void debug_80C5098() "._341:\n" " .align 2, 0\n" "._340:\n" - " .word unk_debug_ewram_0+0x20\n" + " .word gUnknown_Debug_2038A0C\n" " .word gTasks\n" " .word debug_80C5038+1\n" "\n" @@ -3929,7 +3932,7 @@ void debug_80C5208() "._356:\n" " .align 2, 0\n" "._355:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word +0x2018000\n" " .word gSaveBlock2\n" "\n" @@ -3986,7 +3989,7 @@ void debug_80C527C() "._363:\n" " .align 2, 0\n" "._362:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "\n" ); } @@ -4079,7 +4082,7 @@ void InitCreatePokemon() " .word debug_80C3758+1\n" " .word debug_80C370C+1\n" " .word debug_80C53A4+1\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" "\n" ); @@ -4194,7 +4197,7 @@ void debug_80C53F0() " .align 2, 0\n" "._372:\n" " .word gMain\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gUnknown_Debug_083F8698\n" " .word 0x169\n" " .word gTasks\n" @@ -4255,7 +4258,7 @@ void debug_80C53F0() "._382:\n" " .align 2, 0\n" "._381:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gUnknown_Debug_083F872A\n" "._379:\n" " ldr r0, ._384\n" @@ -4299,7 +4302,7 @@ void debug_80C53F0() "._389:\n" " .align 2, 0\n" "._388:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._386:\n" " mov r0, #0x40\n" " and r0, r0, r1\n" @@ -4342,7 +4345,7 @@ void debug_80C53F0() "._398:\n" " .align 2, 0\n" "._397:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" "._395:\n" " ldrh r1, [r4, #0x2e]\n" @@ -4383,7 +4386,7 @@ void debug_80C53F0() "._402:\n" " .align 2, 0\n" "._401:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" " .word gTasks\n" " .word debug_80C53C0+1\n" @@ -4438,7 +4441,7 @@ void debug_80C55E4() " .align 2, 0\n" "._405:\n" " .word gUnknown_Debug_083F8698\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" " .word gMain\n" " .word gTasks\n" @@ -4645,7 +4648,7 @@ void debug_80C5738() " .align 2, 0\n" "._428:\n" " .word gUnknown_Debug_083F850A\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gUnknown_Debug_083F8514\n" " .word gUnknown_Debug_083F851C\n" "._426:\n" @@ -4702,7 +4705,7 @@ void debug_80C5738() " .align 2, 0\n" "._432:\n" " .word gUnknown_Debug_083F8524\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gUnknown_Debug_083F852D\n" " .word gUnknown_Debug_083F8537\n" "._430:\n" @@ -4835,7 +4838,7 @@ void debug_80C5738() "._478:\n" " .align 2, 0\n" "._477:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gSpeciesNames\n" "._445:\n" " ldr r0, ._483\n" @@ -4853,7 +4856,7 @@ void debug_80C5738() "._484:\n" " .align 2, 0\n" "._483:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._480:\n" " add r0, r6, #0\n" " add r0, r0, #0xa\n" @@ -4918,7 +4921,7 @@ void debug_80C5738() "._496:\n" " .align 2, 0\n" "._495:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gMoveNames\n" "._451:\n" " add r0, r6, #0\n" @@ -4957,7 +4960,7 @@ void debug_80C5738() "._500:\n" " .align 2, 0\n" "._499:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._497:\n" " add r0, r5, #0\n" " add r0, r0, #0xe\n" @@ -5000,7 +5003,7 @@ void debug_80C5738() "._506:\n" " .align 2, 0\n" "._505:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gAbilityNames\n" "._474:\n" " add r0, r6, #0\n" @@ -5019,7 +5022,7 @@ void debug_80C5738() " .align 2, 0\n" "._508:\n" " .word gUnknown_Debug_083F86E8\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._472:\n" " add r0, r6, #0\n" " add r0, r0, #0xc\n" @@ -5034,7 +5037,7 @@ void debug_80C5738() "._512:\n" " .align 2, 0\n" "._511:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._473:\n" " ldr r0, ._515\n" " ldr r0, [r0]\n" @@ -5050,7 +5053,7 @@ void debug_80C5738() "._516:\n" " .align 2, 0\n" "._515:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gUnknown_Debug_083F854A\n" "._513:\n" " add r0, r6, #0\n" @@ -5090,7 +5093,7 @@ void debug_80C5738() " .align 2, 0\n" "._520:\n" " .word gNatureNames\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "\n" ); } @@ -5110,7 +5113,7 @@ void debug_80C5B60() "._523:\n" " .align 2, 0\n" "._522:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "\n" ); } @@ -5172,7 +5175,7 @@ void debug_80C5B74() "._555:\n" " .align 2, 0\n" "._554:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._532:\n" " ldr r0, ._557\n" " ldr r0, [r0]\n" @@ -5184,7 +5187,7 @@ void debug_80C5B74() "._558:\n" " .align 2, 0\n" "._557:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._529:\n" " ldr r4, ._560\n" " ldr r1, [r4]\n" @@ -5219,7 +5222,7 @@ void debug_80C5B74() "._561:\n" " .align 2, 0\n" "._560:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gExperienceTables\n" " .word gBaseStats\n" "._530:\n" @@ -5233,7 +5236,7 @@ void debug_80C5B74() "._564:\n" " .align 2, 0\n" "._563:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._552:\n" " ldr r0, ._565\n" " ldr r0, [r0]\n" @@ -5248,7 +5251,7 @@ void debug_80C5B74() "._566:\n" " .align 2, 0\n" "._565:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "\n" ); } @@ -5414,7 +5417,7 @@ void debug_80C5C94() "._568:\n" " .align 2, 0\n" "._567:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "\n" ); } @@ -5537,7 +5540,7 @@ void debug_80C5DEC() "._570:\n" " .align 2, 0\n" "._569:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "\n" ); } @@ -5660,7 +5663,7 @@ void debug_80C5EF4() "._572:\n" " .align 2, 0\n" "._571:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "\n" ); } @@ -5953,7 +5956,7 @@ void debug_80C5FFC() "._578:\n" " .word gUnknown_Debug_083F8758\n" " .word gUnknown_Debug_083F875C\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word gUnknown_Debug_083F86E8+0x4\n" "\n" ); @@ -6002,7 +6005,7 @@ void debug_80C627C() "._590:\n" " .align 2, 0\n" "._589:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" "._580:\n" " ldr r4, ._593\n" @@ -6051,7 +6054,7 @@ void debug_80C627C() "._594:\n" " .align 2, 0\n" "._593:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" " .word gUnknown_Debug_083F8698\n" "._586:\n" @@ -6094,7 +6097,7 @@ void debug_80C627C() "._597:\n" " .align 2, 0\n" "._596:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" "\n" ); @@ -6191,7 +6194,7 @@ void debug_80C6384() " .align 2, 0\n" "._600:\n" " .word gUnknown_Debug_083F8698\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x16b\n" " .word 0x16d\n" "\n" @@ -6267,7 +6270,7 @@ void debug_80C643C() " .align 2, 0\n" "._605:\n" " .word gUnknown_Debug_083F8698\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x16b\n" " .word 0x169\n" " .word 0x16d\n" @@ -6402,7 +6405,7 @@ void debug_80C6544() " .align 2, 0\n" "._614:\n" " .word gUnknown_Debug_083F8698\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" " .word gUnknown_Debug_083F8554\n" " .word gUnknown_Debug_083F8768\n" @@ -6458,7 +6461,7 @@ void debug_80C6544() " .align 2, 0\n" "._624:\n" " .word gUnknown_Debug_083F8698\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" " .word 0x169\n" "\n" ); @@ -6497,7 +6500,7 @@ void debug_80C6630() "._630:\n" " .align 2, 0\n" "._629:\n" - " .word unk_debug_ewram_0+0x30\n" + " .word gUnknown_Debug_2038A1C\n" "._627:\n" " mov r0, #0x4\n" "._626:\n" @@ -7065,7 +7068,7 @@ void InitSeePokemonGraphics() " .word 0x1f0b\n" " .word 0x1e0a\n" " .word debug_80C6B00+1\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word +0x2018000\n" " .word 0x115\n" " .word gSpriteTemplate_83F8874\n" @@ -7504,7 +7507,7 @@ void debug_80C6CB8() "._669:\n" " .align 2, 0\n" "._668:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gMonFrontPicTable\n" " .word gMonFrontPicCoords\n" " .word gUnknown_081FAF4C\n" @@ -7615,7 +7618,7 @@ void debug_80C6EE8() " .align 2, 0\n" "._670:\n" " .word gPlttBufferUnfaded+0x100\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0xffffff00\n" " .word 0xfffffc1f\n" " .word gUnknown_Debug_083F8813\n" @@ -7681,7 +7684,7 @@ void debug_80C6FA8() "._679:\n" " .align 2, 0\n" "._678:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._676:\n" " mov r0, #0x80\n" " lsl r0, r0, #0x2\n" @@ -7707,7 +7710,7 @@ void debug_80C6FA8() "._683:\n" " .align 2, 0\n" "._682:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gTasks\n" " .word debug_80C71FC+1\n" "._680:\n" @@ -7738,7 +7741,7 @@ void debug_80C6FA8() "._687:\n" " .align 2, 0\n" "._686:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x4000040\n" " .word 0x51ef\n" " .word 0x4167\n" @@ -7766,7 +7769,7 @@ void debug_80C6FA8() "._692:\n" " .align 2, 0\n" "._691:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x5000102\n" "._689:\n" " ldrh r1, [r4, #0x30]\n" @@ -7792,7 +7795,7 @@ void debug_80C6FA8() "._697:\n" " .align 2, 0\n" "._696:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x5000102\n" "._694:\n" " ldrh r1, [r4, #0x2e]\n" @@ -7827,7 +7830,7 @@ void debug_80C6FA8() "._702:\n" " .align 2, 0\n" "._701:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._699:\n" " ldrh r0, [r1]\n" " mov r1, #0x0\n" @@ -7872,7 +7875,7 @@ void debug_80C6FA8() "._705:\n" " .align 2, 0\n" "._704:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gPlttBufferUnfaded+0x200\n" " .word 0xffffff00\n" " .word gPlttBufferFaded+0x100\n" @@ -7919,7 +7922,7 @@ void debug_80C6FA8() "._708:\n" " .align 2, 0\n" "._707:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x5000142\n" " .word gUnknown_Debug_083F8790\n" "\n" @@ -7995,7 +7998,7 @@ void debug_80C71FC() " .align 2, 0\n" "._709:\n" " .word gSprites\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gTasks\n" " .word debug_80C6CB8+1\n" "\n" @@ -8033,7 +8036,7 @@ void debug_80C7294() " .align 2, 0\n" "._713:\n" " .word gMain\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x4000040\n" " .word 0x51ef\n" " .word 0x699f\n" @@ -8099,7 +8102,7 @@ void debug_80C7294() "._718:\n" " .align 2, 0\n" "._717:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x4000040\n" " .word 0x51ef\n" " .word 0x699f\n" @@ -8124,7 +8127,7 @@ void debug_80C7294() "._723:\n" " .align 2, 0\n" "._722:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._720:\n" " ldrh r1, [r3, #0x30]\n" " mov r0, #0x40\n" @@ -8142,7 +8145,7 @@ void debug_80C7294() "._728:\n" " .align 2, 0\n" "._727:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._725:\n" " ldrh r1, [r3, #0x30]\n" " mov r0, #0x10\n" @@ -8162,7 +8165,7 @@ void debug_80C7294() "._735:\n" " .align 2, 0\n" "._734:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._731:\n" " cmp r0, #0x2\n" " beq ._736 @cond_branch\n" @@ -8235,7 +8238,7 @@ void debug_80C7294() "._752:\n" " .align 2, 0\n" "._751:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._748:\n" " cmp r0, #0x2\n" " beq ._753 @cond_branch\n" @@ -8391,7 +8394,7 @@ void debug_80C74E4() "._765:\n" " .align 2, 0\n" "._764:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gPlttBufferUnfaded\n" " .word gPlttBufferFaded\n" " .word 0x101\n" @@ -8428,7 +8431,7 @@ void debug_80C7584() "._772:\n" " .align 2, 0\n" "._771:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._767:\n" " ldrh r0, [r3, #0xc]\n" " lsl r0, r0, #0x16\n" @@ -8639,7 +8642,7 @@ void InitSeeTrainers() " .word 0x1f0b\n" " .word 0x1e0a\n" " .word debug_80C777C+1\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word +0x2018000\n" " .word gSpriteTemplate_83F8874\n" " .word gSprites\n" @@ -8970,7 +8973,7 @@ void debug_80C7934() "._787:\n" " .align 2, 0\n" "._786:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gTrainerFrontPicTable\n" " .word gTrainerFrontPicCoords\n" " .word gUnknown_081FAF4C\n" @@ -9072,7 +9075,7 @@ void debug_80C7A54() " .align 2, 0\n" "._788:\n" " .word gPlttBufferUnfaded+0x100\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0xffffff00\n" " .word 0xfffffc1f\n" " .word gUnknown_Debug_083F8813\n" @@ -9138,7 +9141,7 @@ void debug_80C7B14() "._797:\n" " .align 2, 0\n" "._796:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._794:\n" " mov r0, #0x80\n" " lsl r0, r0, #0x2\n" @@ -9164,7 +9167,7 @@ void debug_80C7B14() "._801:\n" " .align 2, 0\n" "._800:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gTasks\n" " .word debug_80C7D44+1\n" "._798:\n" @@ -9195,7 +9198,7 @@ void debug_80C7B14() "._805:\n" " .align 2, 0\n" "._804:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x4000040\n" " .word 0x51ef\n" " .word 0x4167\n" @@ -9223,7 +9226,7 @@ void debug_80C7B14() "._810:\n" " .align 2, 0\n" "._809:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x5000102\n" "._807:\n" " ldrh r1, [r4, #0x30]\n" @@ -9282,7 +9285,7 @@ void debug_80C7B14() "._820:\n" " .align 2, 0\n" "._819:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._817:\n" " ldrh r0, [r1]\n" " mov r1, #0x0\n" @@ -9327,7 +9330,7 @@ void debug_80C7B14() "._823:\n" " .align 2, 0\n" "._822:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gPlttBufferUnfaded+0x200\n" " .word 0xffffff00\n" " .word gPlttBufferFaded+0x100\n" @@ -9437,7 +9440,7 @@ void debug_80C7D44() " .align 2, 0\n" "._826:\n" " .word gSprites\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gTasks\n" " .word debug_80C7934+1\n" "\n" @@ -9475,7 +9478,7 @@ void debug_80C7DDC() " .align 2, 0\n" "._830:\n" " .word gMain\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x4000040\n" " .word 0x51ef\n" " .word 0x699f\n" @@ -9541,7 +9544,7 @@ void debug_80C7DDC() "._835:\n" " .align 2, 0\n" "._834:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word 0x4000040\n" " .word 0x51ef\n" " .word 0x699f\n" @@ -9566,7 +9569,7 @@ void debug_80C7DDC() "._840:\n" " .align 2, 0\n" "._839:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._837:\n" " ldrh r1, [r3, #0x30]\n" " mov r0, #0x40\n" @@ -9584,7 +9587,7 @@ void debug_80C7DDC() "._845:\n" " .align 2, 0\n" "._844:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._842:\n" " ldrh r1, [r3, #0x30]\n" " mov r0, #0x10\n" @@ -9604,7 +9607,7 @@ void debug_80C7DDC() "._852:\n" " .align 2, 0\n" "._851:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._848:\n" " cmp r0, #0x2\n" " beq ._853 @cond_branch\n" @@ -9677,7 +9680,7 @@ void debug_80C7DDC() "._869:\n" " .align 2, 0\n" "._868:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" "._865:\n" " cmp r0, #0x2\n" " beq ._870 @cond_branch\n" @@ -9833,7 +9836,7 @@ void debug_80C802C() "._882:\n" " .align 2, 0\n" "._881:\n" - " .word unk_debug_ewram_0+0x34\n" + " .word gUnknown_Debug_2038A20\n" " .word gPlttBufferUnfaded\n" " .word gPlttBufferFaded\n" " .word 0x101\n" diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index 45cde2cc0..9324ea1c1 100644 --- a/src/engine/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c @@ -817,10 +817,10 @@ void debug_sub_806F9E4() ._159:\n\ .align 2, 0\n\ ._158:\n\ - .word gUnknown_08376500+0x4\n\ - .word gUnknown_08376500+0x9\n\ - .word gUnknown_08376500+0x17\n\ - .word gUnknown_08376500+0xd\n\ + .word gUnknown_Debug_0839AE94\n\ + .word gUnknown_Debug_0839AE99\n\ + .word gUnknown_Debug_0839AEA7\n\ + .word gUnknown_Debug_0839AE9D\n\ ._155:\n\ bl RtcCalcLocalTime\n\ add r0, r6, #0\n\ -- cgit v1.2.3 From e03633d6bc1e1cd155bc258edbb7783020b4bdb7 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 23 Jan 2018 16:55:48 -0600 Subject: fix more false offsets --- src/battle/battle_2.c | 218 ++++++++++----------- src/battle/battle_4.c | 4 +- src/battle/battle_ai.c | 16 +- src/battle/battle_controller_opponent.c | 12 +- src/battle/battle_controller_player.c | 4 +- src/battle/battle_records.c | 4 +- src/battle/battle_util.c | 12 +- src/contest.c | 14 +- src/debug/nohara_debug_menu.c | 14 +- src/engine/link.c | 13 +- src/engine/mystery_event_menu.c | 2 +- src/field/berry.c | 4 +- src/field/field_weather.c | 13 +- src/field/slot_machine.c | 104 ++++++----- src/pokenav_before.c | 322 ++++++++++++++++---------------- 15 files changed, 383 insertions(+), 373 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 41d00546d..6808ad61c 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -354,7 +354,7 @@ void InitBattle(void) " .word gBattle_BG2_Y\n" " .word gBattle_BG3_X\n" " .word gBattle_BG3_Y\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14_50\n" " .word gBattleTerrain\n" " .word gUnknown_03004210\n" " .word gUnknown_030041D0\n" @@ -417,7 +417,7 @@ void InitBattle(void) "._15:\n" " .word sub_800EC9C+1\n" " .word gBattleTypeFlags\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14_50\n" " .word gEnemyParty\n" " .word gTrainerBattleOpponent\n" " .word gMain\n" @@ -638,7 +638,7 @@ void sub_800EC9C() "._56:\n" " .align 2, 0\n" "._55:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x160cb\n" " .word gBattleCommunication\n" " .word ._57\n" @@ -710,8 +710,8 @@ void sub_800EC9C() "._76:\n" " .word gBattleTypeFlags\n" " .word gReceivedRemoteLinkPlayers\n" - " .word +0x2000000\n" - " .word gUnknown_02023A14+0x50\n" + " .word gSharedMem\n" + " .word gUnknown_02023A14_50\n" " .word 0x2211\n" " .word gLinkPlayers\n" " .word gBattleCommunication\n" @@ -873,7 +873,7 @@ void sub_800EC9C() "._106:\n" " .word sub_800DE30+1\n" " .word gTasks\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word gBlockRecvBuffer\n" "._60:\n" " bl sub_8007ECC\n" @@ -1295,7 +1295,7 @@ void sub_800F104() "._152:\n" " .align 2, 0\n" "._151:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x160cb\n" " .word 0x160c4\n" " .word gBattleCommunication\n" @@ -1355,10 +1355,10 @@ void sub_800F104() " .align 2, 0\n" "._165:\n" " .word gReceivedRemoteLinkPlayers\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14_50\n" " .word 0x2211\n" " .word gLinkPlayers\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word gBattleCommunication\n" "._147:\n" " bl GetBlockReceivedStatus\n" @@ -1586,7 +1586,7 @@ void sub_800F298() "._189:\n" " .align 2, 0\n" "._188:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x160cb\n" " .word gBattleCommunication\n" " .word ._190\n" @@ -1646,10 +1646,10 @@ void sub_800F298() " .align 2, 0\n" "._206:\n" " .word gReceivedRemoteLinkPlayers\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14_50\n" " .word 0x2211\n" " .word gLinkPlayers\n" - " .word +0x2000000\n" + " .word gSharedMem\n" "._192:\n" " bl GetBlockReceivedStatus\n" " mov r1, #0xf\n" @@ -3181,12 +3181,12 @@ void debug_sub_8010818() "._502:\n" " .align 2, 0\n" "._501:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word 0x115\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_02023A14+0xde\n" - " .word UnkDebug0+0x1b4\n" + " .word gUnknown_Debug_2023B02\n" + " .word gUnknown_Debug_821F56C\n" "\n" ); } @@ -3345,7 +3345,7 @@ void debug_sub_80108B8() " .word 0x4000050\n" " .word gMonShinyPalette_CircledQuestionMark+0x18\n" " .word gMonShinyPalette_CircledQuestionMark+0x834\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word gMonShinyPalette_CircledQuestionMark+0xa8c\n" " .word 0x50001e0\n" " .word debug_sub_8011D40+1\n" @@ -3356,7 +3356,7 @@ void debug_sub_80108B8() " .word gUnknown_Debug_030043A0\n" " .word gUnknown_Debug_030043A4\n" " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" "._505:\n" " ldr r0, ._510\n" " mov r1, #0x0\n" @@ -3377,7 +3377,7 @@ void debug_sub_80108B8() "._511:\n" " .align 2, 0\n" "._510:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x160bb\n" "\n" ); @@ -3458,7 +3458,7 @@ void debug_sub_8010AAC() " .align 2, 0\n" "._520:\n" " .word gBaseStats\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_030043A4\n" " .word gUnknown_Debug_03004360\n" "._517:\n" @@ -3607,7 +3607,7 @@ void debug_sub_8010B80() "._535:\n" " .align 2, 0\n" "._534:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_030043A0\n" " .word gUnknown_Debug_030043A4\n" " .word gUnknown_Debug_03004360\n" @@ -3800,8 +3800,8 @@ void debug_sub_8010CAC() " .word gUnknown_Debug_030043A0\n" " .word debug_sub_80108B8+1\n" " .word gPlayerParty\n" - " .word gUnknown_02023A14+0x52\n" - " .word gUnknown_02023A14+0xde\n" + " .word gUnknown_Debug_2023A76\n" + " .word gUnknown_Debug_2023B02\n" " .word gBattleMoves+0x4\n" "._550:\n" " ldr r1, ._556\n" @@ -4078,7 +4078,7 @@ void debug_sub_8010CAC() "._598:\n" " .align 2, 0\n" "._597:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_030043A4\n" "._593:\n" " ldr r1, ._600\n" @@ -4089,7 +4089,7 @@ void debug_sub_8010CAC() "._601:\n" " .align 2, 0\n" "._600:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" "._594:\n" " ldr r3, ._604\n" " add r2, r3, #0\n" @@ -4110,7 +4110,7 @@ void debug_sub_8010CAC() "._605:\n" " .align 2, 0\n" "._604:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" "._602:\n" " mov r1, #0x8\n" " strh r1, [r2]\n" @@ -4250,11 +4250,11 @@ void debug_sub_8010CAC() "._619:\n" " .align 2, 0\n" "._618:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_030043A0\n" " .word gUnknown_Debug_030043A4\n" " .word gUnknown_Debug_03004360\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" " .word gMain\n" " .word ._620\n" "._620:\n" @@ -4287,7 +4287,7 @@ void debug_sub_8010CAC() "._629:\n" " .align 2, 0\n" "._628:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_030043A4\n" "._624:\n" " ldr r1, ._631\n" @@ -4298,7 +4298,7 @@ void debug_sub_8010CAC() "._632:\n" " .align 2, 0\n" "._631:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" "._625:\n" " ldr r3, ._635\n" " add r2, r3, #0\n" @@ -4319,7 +4319,7 @@ void debug_sub_8010CAC() "._636:\n" " .align 2, 0\n" "._635:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" "._633:\n" " mov r1, #0x0\n" " strh r1, [r2]\n" @@ -4456,11 +4456,11 @@ void debug_sub_8010CAC() "._651:\n" " .align 2, 0\n" "._650:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_030043A0\n" " .word gUnknown_Debug_030043A4\n" " .word gUnknown_Debug_03004360\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" " .word gMain\n" "._648:\n" " mov r4, r8\n" @@ -4492,9 +4492,9 @@ void debug_sub_8010CAC() "._656:\n" " .align 2, 0\n" "._655:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_03004360\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" "._657:\n" " add r0, r5, #6\n" " add r0, r1, r0\n" @@ -4614,9 +4614,9 @@ void debug_sub_8010CAC() "._669:\n" " .align 2, 0\n" "._668:\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_03004360\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" "._670:\n" " ldrh r0, [r3]\n" " sub r0, r0, r1\n" @@ -4913,9 +4913,9 @@ void debug_sub_8011498() " .word gMain\n" " .word debug_sub_8010CAC+1\n" " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_02023A14+0xde\n" + " .word gUnknown_Debug_2023B02\n" " .word gUnknown_Debug_03004360\n" - " .word UnkDebug0+0x1ac\n" + " .word gUnknown_Debug_821F564\n" "._689:\n" " add r0, r6, #6\n" " add r0, r2, r0\n" @@ -4988,10 +4988,10 @@ void debug_sub_8011498() " .align 2, 0\n" "._692:\n" " .word gMain\n" - " .word gUnknown_02023A14+0xde\n" + " .word gUnknown_Debug_2023B02\n" " .word gUnknown_Debug_030043A8\n" " .word gUnknown_Debug_03004360\n" - " .word UnkDebug0+0x1ac\n" + " .word gUnknown_Debug_821F564\n" "._694:\n" " ldrh r0, [r4]\n" " sub r0, r0, r1\n" @@ -5156,10 +5156,10 @@ void debug_sub_801174C() " .word gUnknown_020297ED\n" " .word gSaveBlock2\n" " .word str_821F631\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gBattleTypeFlags\n" - " .word UnkDebug0+0x1e0\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_Debug_821F598\n" + " .word gUnknown_02023A14_50\n" " .word gBattleTerrain\n" " .word gTrainerBattleOpponent\n" " .word gPlayerPartyCount\n" @@ -5272,8 +5272,8 @@ void debug_sub_801174C() " .align 2, 0\n" "._719:\n" " .word gEnemyParty\n" - " .word gUnknown_02023A14+0x52\n" - " .word gUnknown_02023A14+0x56\n" + " .word gUnknown_Debug_2023A76\n" + " .word gUnknown_Debug_2023A7A\n" "._717:\n" " mov r2, #0x0\n" " ldsh r0, [r0, r2]\n" @@ -5316,7 +5316,7 @@ void debug_sub_801174C() " .align 2, 0\n" "._726:\n" " .word gEnemyParty\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" "._723:\n" " cmp r0, #0x2\n" " beq ._728 @cond_branch\n" @@ -5429,10 +5429,10 @@ void debug_sub_801174C() " .align 2, 0\n" "._741:\n" " .word gPlayerParty\n" - " .word gUnknown_02023A14+0x98\n" + " .word gUnknown_Debug_2023ABC\n" " .word gPlayerPartyCount\n" - " .word gUnknown_02023A14+0x9c\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023AC0\n" + " .word gUnknown_Debug_2023A76\n" "._739:\n" " mov r1, #0x0\n" " ldsh r0, [r0, r1]\n" @@ -5574,14 +5574,14 @@ void debug_sub_801174C() " .align 2, 0\n" "._750:\n" " .word gPlayerParty\n" - " .word gUnknown_02023A14+0x98\n" + " .word gUnknown_Debug_2023ABC\n" " .word Str_821F649\n" - " .word gUnknown_02023A14+0x50\n" - " .word gUnknown_02023A14+0xde\n" + " .word gUnknown_02023A14_50\n" + " .word gUnknown_Debug_2023B02\n" " .word gEnemyParty\n" " .word gBattleMoves+0x4\n" - " .word gUnknown_02023A14+0x10e\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023B32\n" + " .word gUnknown_Debug_2023A76\n" "._748:\n" " cmp r0, #0x7\n" " bne ._752 @cond_branch\n" @@ -5592,7 +5592,7 @@ void debug_sub_801174C() "._755:\n" " .align 2, 0\n" "._754:\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14_50\n" "._752:\n" " cmp r0, #0x6\n" " bne ._756 @cond_branch\n" @@ -5614,8 +5614,8 @@ void debug_sub_801174C() "._760:\n" " .align 2, 0\n" "._759:\n" - " .word gUnknown_02023A14+0x50\n" - " .word +0x2000000\n" + " .word gUnknown_02023A14_50\n" + " .word gSharedMem\n" " .word 0x160a3\n" "._757:\n" " ldr r0, ._762\n" @@ -5625,7 +5625,7 @@ void debug_sub_801174C() "._763:\n" " .align 2, 0\n" "._762:\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x160a3\n" "._756:\n" " cmp r0, #0x5\n" @@ -5642,7 +5642,7 @@ void debug_sub_801174C() "._767:\n" " .align 2, 0\n" "._766:\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14_50\n" "._764:\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -5772,11 +5772,11 @@ void debug_sub_801174C() "._773:\n" " .align 2, 0\n" "._772:\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14_50\n" " .word gMain\n" " .word debug_sub_80108B8+1\n" " .word unref_sub_800D684+1\n" - " .word UnkDebug0+0x1f4\n" + " .word gUnknown_Debug_821F5AC\n" "\n" ); } @@ -5834,7 +5834,7 @@ void debug_sub_8011D40() " .align 2, 0\n" "._774:\n" " .word 0x40000d4\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x6004000\n" " .word 0x80000800\n" " .word gBattle_BG0_X\n" @@ -6121,9 +6121,9 @@ void debug_sub_8011EA0() " .align 2, 0\n" "._823:\n" " .word gBattleTextBuff1\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" " .word gUnknown_Debug_03004370\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_03004360\n" " .word gSpeciesNames\n" "._817:\n" @@ -6147,7 +6147,7 @@ void debug_sub_8011EA0() " .align 2, 0\n" "._826:\n" " .word gBattleTextBuff1\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_03004360\n" "._814:\n" " mov r0, #0x0\n" @@ -6226,9 +6226,9 @@ void debug_sub_8011EA0() "._830:\n" " .word gUnknown_Debug_03004370\n" " .word gBattleTextBuff1\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" " .word gUnknown_Debug_03004360\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" "._828:\n" " ldr r1, ._833\n" " mov r0, sl\n" @@ -6257,10 +6257,10 @@ void debug_sub_8011EA0() "._834:\n" " .align 2, 0\n" "._833:\n" - " .word UnkDebug0+0x26c\n" + " .word Str_821F624\n" " .word gUnknown_Debug_03004370\n" " .word gBattleTextBuff1\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" "._816:\n" " mov r0, #0x0\n" " mov r1, #0x4\n" @@ -6308,8 +6308,8 @@ void debug_sub_8011EA0() "._839:\n" " .word gUnknown_Debug_03004370\n" " .word gBattleTextBuff1\n" - " .word UnkDebug0+0x6c\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_821F424\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_03004360\n" "._836:\n" " cmp r0, #0x2\n" @@ -6373,7 +6373,7 @@ void debug_sub_8011EA0() "._849:\n" " .word gBattleTextBuff1\n" " .word gUnknown_Debug_03004370\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" "._815:\n" " ldr r6, ._851\n" " ldr r3, ._851 + 4\n" @@ -6422,10 +6422,10 @@ void debug_sub_8011EA0() " .align 2, 0\n" "._851:\n" " .word gBattleTextBuff1\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_03004360\n" " .word gUnknown_Debug_03004370\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" "\n" ); } @@ -6572,12 +6572,12 @@ void debug_sub_8012294() " .word gUnknown_Debug_030043A4\n" " .word gUnknown_Debug_03004370\n" " .word gBattleTextBuff1\n" - " .word UnkDebug0+0x1ac\n" + " .word gUnknown_Debug_821F564\n" " .word gUnknown_Debug_030043A8\n" - " .word UnkDebug0+0x1ae\n" - " .word UnkDebug0+0x1b0\n" + " .word gUnknown_Debug_821F566\n" + " .word gUnknown_Debug_821F568\n" " .word gUnknown_Debug_03004360\n" - " .word gUnknown_02023A14+0xde\n" + " .word gUnknown_Debug_2023B02\n" " .word gMoveNames\n" "\n" ); @@ -6700,9 +6700,9 @@ void debug_sub_80123D8() "._858:\n" " .word gUnknown_Debug_03004370\n" " .word gBattleTextBuff1\n" - " .word UnkDebug0+0x1d4\n" + " .word gUnknown_Debug_821F58C\n" " .word gUnknown_Debug_03004360\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gBaseStats\n" " .word gAbilityNames\n" "._856:\n" @@ -6745,7 +6745,7 @@ void debug_sub_80123D8() " .word gBattleTextBuff1\n" " .word gAbilityNames\n" " .word gUnknown_Debug_03004370\n" - " .word UnkDebug0+0x1d4\n" + " .word gUnknown_Debug_821F58C\n" "\n" ); } @@ -6792,9 +6792,9 @@ void debug_sub_8012540() " .align 2, 0\n" "._862:\n" " .word gBattleTextBuff1\n" - " .word gUnknown_02023A14+0x52\n" + " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_03004370\n" - " .word UnkDebug0+0x6c\n" + " .word gUnknown_Debug_821F424\n" "\n" ); } @@ -6839,8 +6839,8 @@ void debug_sub_80125A0() "._865:\n" " .align 2, 0\n" "._864:\n" - " .word +0x2000000\n" - " .word UnkDebug0+0x2c8\n" + " .word gSharedMem\n" + " .word gUnknown_Debug_821F680\n" " .word gUnknown_Debug_030043A0\n" " .word gUnknown_Debug_030043A4\n" " .word gUnknown_Debug_03004360\n" @@ -6879,8 +6879,8 @@ void debug_sub_80125E4() "._867:\n" " .align 2, 0\n" "._866:\n" - " .word +0x2000000\n" - " .word UnkDebug0+0x2c8\n" + " .word gSharedMem\n" + " .word gUnknown_Debug_821F680\n" " .word gUnknown_Debug_030043A0\n" " .word gUnknown_Debug_030043A4\n" " .word gUnknown_Debug_03004360\n" @@ -6910,8 +6910,8 @@ void debug_sub_8012628() "._869:\n" " .align 2, 0\n" "._868:\n" - " .word +0x2000000\n" - " .word UnkDebug0+0x3e0\n" + " .word gSharedMem\n" + " .word gUnknown_Debug_821F798\n" " .word gUnknown_Debug_030043A8\n" " .word gUnknown_Debug_03004360\n" "\n" @@ -6940,8 +6940,8 @@ void debug_sub_8012658() "._871:\n" " .align 2, 0\n" "._870:\n" - " .word +0x2000000\n" - " .word UnkDebug0+0x3e0\n" + " .word gSharedMem\n" + " .word gUnknown_Debug_821F798\n" " .word gUnknown_Debug_030043A8\n" " .word gUnknown_Debug_03004360\n" "\n" @@ -7126,7 +7126,7 @@ void debug_sub_8012688() "._874:\n" " .align 2, 0\n" "._873:\n" - " .word gUnknown_02023A14+0x13e\n" + " .word gUnknown_Debug_2023B62\n" " .word 0x40000d4\n" " .word 0x85006000\n" " .word 0x400004c\n" @@ -7341,8 +7341,8 @@ void debug_sub_8012938() "._880:\n" " .word gUnknown_03004210\n" " .word gBattleTextBuff1\n" - " .word UnkDebug0+0x400\n" - " .word gUnknown_02023A14+0x13e\n" + " .word Str_821F7B8\n" + " .word gUnknown_Debug_2023B62\n" " .word gCurrentMove\n" " .word gSprites\n" " .word gTasks\n" @@ -7444,7 +7444,7 @@ void debug_sub_80129F8() " .word gMonPaletteTable\n" " .word gSprites\n" " .word gTasks\n" - " .word gUnknown_02023A14+0x13e\n" + " .word gUnknown_Debug_2023B62\n" "\n" ); } @@ -7638,7 +7638,7 @@ void debug_sub_8012B70() "._901:\n" " .word gTasks\n" " .word gUnknown_03004210\n" - " .word UnkDebug0+0x422\n" + " .word Str_821F7DA\n" "\n" ); } @@ -7762,7 +7762,7 @@ void debug_sub_8012C08() " .align 2, 0\n" "._907:\n" " .word gTasks\n" - " .word UnkDebug0+0x432\n" + " .word Str_821F7EA\n" " .word gUnknown_03004210\n" " .word BattleText_YesNo\n" "\n" @@ -7833,7 +7833,7 @@ void debug_sub_8012D10() " .align 2, 0\n" "._920:\n" " .word gUnknown_03004210\n" - " .word UnkDebug0+0x405\n" + " .word Str_821F7BD\n" " .word gTasks\n" "._915:\n" " ldr r2, ._924\n" @@ -7988,7 +7988,7 @@ void debug_sub_8012D10() "._953:\n" " .align 2, 0\n" "._952:\n" - " .word gUnknown_02023A14+0x13e\n" + " .word gUnknown_Debug_2023B62\n" " .word gCurrentMove\n" "._939:\n" " mov r0, #0x1\n" @@ -8059,7 +8059,7 @@ void debug_sub_8012D10() "._974:\n" " .align 2, 0\n" "._973:\n" - " .word gUnknown_02023A14+0x13e\n" + " .word gUnknown_Debug_2023B62\n" " .word gCurrentMove\n" "._968:\n" " ldr r1, ._977\n" @@ -8135,7 +8135,7 @@ void debug_sub_8012D10() "._996:\n" " .align 2, 0\n" "._995:\n" - " .word gUnknown_02023A14+0x13e\n" + " .word gUnknown_Debug_2023B62\n" " .word gCurrentMove\n" "._983:\n" " mov r0, #0x1\n" @@ -8218,7 +8218,7 @@ void debug_sub_8012D10() "._1021:\n" " .align 2, 0\n" "._1020:\n" - " .word gUnknown_02023A14+0x13e\n" + " .word gUnknown_Debug_2023B62\n" " .word gCurrentMove\n" "._1018:\n" " strb r3, [r2]\n" @@ -8372,7 +8372,7 @@ void debug_sub_8012D10() " .align 2, 0\n" "._1050:\n" " .word gTasks\n" - " .word gUnknown_02023A14+0x13e\n" + " .word gUnknown_Debug_2023B62\n" " .word 0x19b\n" "._1047:\n" " mov r0, #0x2\n" @@ -8458,7 +8458,7 @@ void debug_sub_8012D10() " .align 2, 0\n" "._1065:\n" " .word gTasks\n" - " .word gUnknown_02023A14+0x13e\n" + " .word gUnknown_Debug_2023B62\n" " .word 0x19b\n" "._1062:\n" " mov r0, #0x2\n" @@ -8912,7 +8912,7 @@ void debug_sub_80138CC() " .align 2, 0\n" "._1167:\n" " .word gActiveBank\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x160fd\n" " .word ._1169\n" "._1169:\n" @@ -9095,7 +9095,7 @@ void debug_sub_80139E4() "._1199:\n" " .align 2, 0\n" "._1198:\n" - " .word gUnknown_02023A14+0x50\n" + " .word gUnknown_02023A14_50\n" " .word gActiveBank\n" " .word gNoOfAllBanks\n" " .word gBattleMainFunc\n" @@ -9471,7 +9471,7 @@ void sub_8010874() " .word gStatuses3\n" " .word gUnknown_02024C70\n" " .word gUnknown_02024C5C\n" - " .word +0x2017100\n" + " .word gSharedMem+0x17100\n" " .word gSideTimers\n" " .word gSideAffecting\n" " .word gBankAttacker\n" @@ -9481,7 +9481,7 @@ void sub_8010874() " .word gHitMarker\n" " .word gBattleTypeFlags\n" " .word gSaveBlock2\n" - " .word +0x2000000\n" + " .word gSharedMem\n" " .word 0x16084\n" " .word gMultiHitCounter\n" " .word gBattleOutcome\n" diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 3415d9337..9fe1f6cb0 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -1090,7 +1090,7 @@ static const u8 sTerrainToType[] = TYPE_NORMAL, // plain }; -const u8 sBallCatchBonuses[] = +static const u8 sBallCatchBonuses[] = { 20, 15, 10, 15 // Ultra, Great, Poke, Safari }; @@ -5103,7 +5103,7 @@ static void atk15_seteffectwithchance(void) ._1045:\n\ .word gBattleMoves\n\ .word gCurrentMove\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ .word gBattleCommunication\n\ .word gBattleMoveFlags\n\ ._1043:\n\ diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c index ffc9281e4..87a66c2c7 100644 --- a/src/battle/battle_ai.c +++ b/src/battle/battle_ai.c @@ -381,7 +381,7 @@ void BattleAI_SetupAIData() "._17:\n" " .align 2, 0\n" "._16:\n" - " .word +0x2016800\n" + " .word gSharedMem+0x16800\n" " .word gActiveBank\n" " .word gBitTable\n" " .word +0x2016c00\n" @@ -410,7 +410,7 @@ void BattleAI_SetupAIData() "._20:\n" " .word gBankTarget\n" " .word gBattleTypeFlags\n" - " .word +0x2016800\n" + " .word gSharedMem+0x16800\n" "._18:\n" " mov r2, #0x80\n" " lsl r2, r2, #0x3\n" @@ -425,7 +425,7 @@ void BattleAI_SetupAIData() "._25:\n" " .align 2, 0\n" "._24:\n" - " .word +0x2016800\n" + " .word gSharedMem+0x16800\n" "._22:\n" " mov r0, #0x10\n" " and r0, r0, r1\n" @@ -438,7 +438,7 @@ void BattleAI_SetupAIData() "._29:\n" " .align 2, 0\n" "._28:\n" - " .word +0x2016800\n" + " .word gSharedMem+0x16800\n" "._26:\n" " mov r0, #0x90\n" " lsl r0, r0, #0x4\n" @@ -460,7 +460,7 @@ void BattleAI_SetupAIData() " .align 2, 0\n" "._33:\n" " .word gTrainerBattleOpponent\n" - " .word +0x2016800\n" + " .word gSharedMem+0x16800\n" "._31:\n" " ldr r3, ._36\n" " ldr r2, ._36 + 4\n" @@ -489,10 +489,10 @@ void BattleAI_SetupAIData() "._37:\n" " .align 2, 0\n" "._36:\n" - " .word +0x2016800\n" + " .word gSharedMem+0x16800\n" " .word gTrainers\n" - " .word gUnknown_02023A14+0x50\n" - " .word gUnknown_02023A14+0x4c\n" + " .word gUnknown_02023A14_50\n" + " .word gUnknown_02023A14_4C\n" "\n" ); } diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index cc69c0120..d2045b6c4 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -1232,7 +1232,7 @@ void OpponentHandleTrainerThrow(void) ._481:\n\ .align 2, 0\n\ ._480:\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ .word +0x2000000\n\ .word 0x160a3\n\ ._478:\n\ @@ -1718,8 +1718,8 @@ void OpponentHandlecmd20(void) .align 2, 0\n\ ._549:\n\ .word gActiveBank\n\ - .word gUnknown_02023A64\n\ - .word gUnknown_02023A14+0x50\n\ + .word gBattleBufferA+4\n\ + .word gUnknown_02023A14_50\n\ .word gBattleMoves\n\ .word +0x2000000\n\ .word 0x1609e\n\ @@ -1781,7 +1781,7 @@ void OpponentHandlecmd20(void) .align 2, 0\n\ ._559:\n\ .word gBattleTypeFlags\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ ._556:\n\ bl Random\n\ add r1, r5, #0\n\ @@ -2048,7 +2048,7 @@ void OpponentHandlecmd20(void) ldr r6, _0803545C @ =gActiveBank\n\ ldrb r0, [r6]\n\ lsls r0, 9\n\ - ldr r1, _08035460 @ =gUnknown_02023A64\n\ + ldr r1, _08035460 @ =gBattleBufferA+4\n\ adds r5, r0, r1\n\ ldr r0, _08035464 @ =gBattleTypeFlags\n\ ldrh r1, [r0]\n\ @@ -2070,7 +2070,7 @@ void OpponentHandlecmd20(void) b _0803546C\n\ .align 2, 0\n\ _0803545C: .4byte gActiveBank\n\ -_08035460: .4byte gUnknown_02023A64\n\ +_08035460: .4byte gBattleBufferA+4\n\ _08035464: .4byte gBattleTypeFlags\n\ _08035468:\n\ movs r0, 0x1\n\ diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index cbca4a586..8875d5148 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -674,7 +674,7 @@ void sub_802C68C(void) .align 2, 0\n\ ._131:\n\ .word gActiveBank\n\ - .word gUnknown_02023A64\n\ + .word gBattleBufferA+4\n\ .word gMain\n\ .word gMoveSelectionCursor\n\ ._128:\n\ @@ -1328,7 +1328,7 @@ void sub_802C68C(void) .word gPlayerParty\n\ .word gMoveNames\n\ .word gDisplayedStringBattle\n\ - .word sBallCatchBonuses+0x4\n\ + .word gString_TurnJP\n\ .word gAnimMoveTurn\n\ .word gSprites\n\ .word gOamMatrixAllocBitmap\n\ diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c index 4fce958fa..9dd1d7b53 100644 --- a/src/battle/battle_records.c +++ b/src/battle/battle_records.c @@ -275,9 +275,9 @@ void debug_sub_81257E0(void) ._63:\n\ .align 2, 0\n\ ._62:\n\ - .word gUnknown_083F8410+0xa\n\ + .word gUnknown_Debug_4245CC+2\n\ .word gLinkPlayers\n\ - .word gUnknown_083F8410+0x5c\n\ + .word gUnknown_Debug_8424620\n\ .word gLinkPlayerMapObjects\n\ .word gSaveBlock1+0x30b8"); } diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c index 817382911..620e0690a 100644 --- a/src/battle/battle_util.c +++ b/src/battle/battle_util.c @@ -3255,7 +3255,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) ._1079:\n\ .align 2, 0\n\ ._1078:\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ .word gBattleMoveFlags\n\ .word gBattleMons\n\ .word gBankAttacker\n\ @@ -3465,7 +3465,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) ._1112:\n\ .align 2, 0\n\ ._1111:\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ .word gBattleMoveFlags\n\ .word gBattleMons\n\ .word gBankAttacker\n\ @@ -3660,7 +3660,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) ._1143:\n\ .align 2, 0\n\ ._1142:\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ .word gBattleMoveFlags\n\ .word gBattleMons\n\ .word gBankAttacker\n\ @@ -3855,7 +3855,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) ._1174:\n\ .align 2, 0\n\ ._1173:\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ .word gBattleMoveFlags\n\ .word gBattleMons\n\ .word gBankAttacker\n\ @@ -4118,7 +4118,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) ._1218:\n\ .align 2, 0\n\ ._1217:\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ .word gBattleMoveFlags\n\ .word gBattleMons\n\ .word gBankAttacker\n\ @@ -7489,7 +7489,7 @@ u8 IsMonDisobedient(void) .word gBattleTypeFlags\n\ .word gBankAttacker\n\ .word gBattleMons\n\ - .word gUnknown_02023A14+0x50\n\ + .word gUnknown_02023A14_50\n\ ._1783:\n\ ldr r0, ._1794\n\ bl FlagGet\n\ diff --git a/src/contest.c b/src/contest.c index 834d641d0..950b26d0c 100644 --- a/src/contest.c +++ b/src/contest.c @@ -919,7 +919,7 @@ void sub_80ABEA0(u8 taskId) ._180:\n\ .word gDisplayedStringBattle\n\ .word gText_Contest_ButItCantParticipate\n\ - .word +0x2019204\n\ + .word gSharedMem+0x19204\n\ .word gStringVar4\n\ .word gMenuWindow\n\ .word gBattle_BG0_Y\n\ @@ -939,7 +939,7 @@ void sub_80ABEA0(u8 taskId) ._185:\n\ .align 2, 0\n\ ._184:\n\ - .word +0x2019204\n\ + .word gSharedMem+0x19204\n\ ._182:\n\ sub r0, r0, #0x1\n\ b ._186\n\ @@ -957,7 +957,7 @@ void sub_80ABEA0(u8 taskId) ._190:\n\ .align 2, 0\n\ ._189:\n\ - .word +0x2019204\n\ + .word gSharedMem+0x19204\n\ ._187:\n\ add r0, r1, #1\n\ ._186:\n\ @@ -987,7 +987,7 @@ void sub_80ABEA0(u8 taskId) ._194:\n\ .align 2, 0\n\ ._193:\n\ - .word +0x2019204\n\ + .word gSharedMem+0x19204\n\ .word gContestMons\n\ .word gContestPlayerMonIndex\n\ ._168:\n\ @@ -1445,7 +1445,7 @@ void debug_sub_80BA054() ._263:\n\ .align 2, 0\n\ ._262:\n\ - .word +0x2019348\n\ + .word gSharedMem+0x19348\n\ .word gBattleMonForms\n\ .word gContestPlayerMonIndex\n\ .word gContestMons\n\ @@ -1501,7 +1501,7 @@ void debug_sub_80BA054() .word gSprites\n\ .word SpriteCallbackDummy+1\n\ .word gContestPlayerMonIndex\n\ - .word +0x2019260\n\ + .word gSharedMem+0x19260\n\ ._241:\n\ ldr r0, ._273\n\ ldr r0, [r0]\n\ @@ -1535,7 +1535,7 @@ void debug_sub_80BA054() .word gAnimScriptCallback\n\ .word gAnimScriptActive\n\ .word gContestPlayerMonIndex\n\ - .word +0x2019204\n\ + .word gSharedMem+0x19204\n\ .word gTasks\n\ ._271:\n\ ldr r0, ._276\n\ diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c index a932fee8d..bdfc8f9c5 100644 --- a/src/debug/nohara_debug_menu.c +++ b/src/debug/nohara_debug_menu.c @@ -1,9 +1,9 @@ #if DEBUG #include "global.h" -#define BSS_DATA __attribute__((section(".bss"))) - -BSS_DATA u8 gDebug_03000724[4] = { 0 }; +__attribute__((unused)) static u8 gDebug_03000724; +__attribute__((unused)) static u8 gDebug_03000725; +__attribute__((unused)) static u8 gDebug_03000726; __attribute__((naked)) void InitNoharaDebugMenu() @@ -127,7 +127,7 @@ void NoharaDebugMenu_TV() "._9:\n" " .align 2, 0\n" "._8:\n" - " .word gDebug_03000724+0x2\n" + " .word gDebug_03000726\n" " .word gUnknown_Debug_083C4B8C\n" " .word gMenuCallback\n" " .word debug_sub_808F4AC+1\n" @@ -414,7 +414,7 @@ void debug_sub_808F648() " .align 2, 0\n" "._35:\n" " .word gMain\n" - " .word gDebug_03000724+0x2\n" + " .word gDebug_03000726\n" "._33:\n" " bl debug_sub_808F6BC\n" " b ._40\n" @@ -933,7 +933,7 @@ void debug_sub_808F93C() " .align 2, 0\n" "._83:\n" " .word gMain\n" - " .word gDebug_03000724+0x1\n" + " .word gDebug_03000725\n" " .word gDebug_03000724\n" " .word gUnknown_Debug_083C4ABD+0xf\n" " .word gStringVar1\n" @@ -1671,7 +1671,7 @@ void debug_sub_808FF3C() " .align 2, 0\n" "._192:\n" " .word gMain\n" - " .word gDebug_03000724+0x1\n" + " .word gDebug_03000725\n" " .word gDebug_03000724\n" " .word gUnknown_Debug_083C4B20+0x4\n" " .word gStringVar1\n" diff --git a/src/engine/link.c b/src/engine/link.c index 5785a5a56..eb0ae4731 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -147,6 +147,9 @@ void (*gLinkCallback)(void); struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS]; u8 gShouldAdvanceLinkState; u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; +#if DEBUG +u8 gUnknown_Debug_30030E0; +#endif u8 gBlockRequestType; u8 gLastSendQueueCount; struct Link gLink; @@ -158,11 +161,11 @@ u8 deUnkValue1; u8 deUnkValue2; #endif -EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = {0}; -EWRAM_DATA bool8 gLinkTestDummyBool = {0}; -EWRAM_DATA u32 gFiller_20238B8 = {0}; -EWRAM_DATA u32 dword_20238BC = {0}; -EWRAM_DATA bool8 gLinkOpen = {0}; +EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = 0; +EWRAM_DATA bool8 gLinkTestDummyBool = 0; +EWRAM_DATA u32 gFiller_20238B8 = 0; +EWRAM_DATA u32 dword_20238BC = 0; +EWRAM_DATA bool8 gLinkOpen = 0; static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp"); diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index c80a8f3e9..2e526bb4a 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -602,7 +602,7 @@ void debug_sub_815D1D8() " .align 2, 0\n" "._161:\n" " .word gPaletteFade\n" - " .word gLinkTestBlockChecksums+0x8\n" + " .word gUnknown_Debug_30030E0\n" " .word Str_843DA70\n" " .word 0x43c\n" "._144:\n" diff --git a/src/field/berry.c b/src/field/berry.c index d6982479e..5c1ecd699 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -1245,8 +1245,8 @@ u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) " .word 0x3170\n" " .word 0x47f\n" " .word 0x317c\n" - " .word gSpriteImage_83C172C+0x80\n" - " .word gSpriteImage_83C172C+0x500\n" + " .word gSpriteImage_UnusedCherry\n" + " .word gSpritePalette_UnusedCherry\n" " .word 0x35fc\n" " .word gSaveBlock1+0x3676\n" " .word gUnknown_Debug_839B6CE\n" diff --git a/src/field/field_weather.c b/src/field/field_weather.c index cf96b2e87..c411bf20b 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -43,7 +43,10 @@ struct WeatherCallbacks EWRAM_DATA struct Weather gWeather = {0}; EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0}; -EWRAM_DATA u16 gUnknown_0202FF58 = {0}; +EWRAM_DATA u16 gUnknown_0202FF58 = 0; +#if DEBUG +EWRAM_DATA u16 gUnknown_Debug_20301FE = 0; +#endif static const u8 *sPaletteGammaTypes; @@ -1297,7 +1300,7 @@ u8 debug_sub_8085564(void) .align 2, 0\n\ ._375:\n\ .word gMain\n\ - .word gUnknown_0202FF58+0x2\n\ + .word gUnknown_Debug_20301FE\n\ ._373:\n\ mov r0, #0xe\n\ ._374:\n\ @@ -1333,7 +1336,7 @@ u8 debug_sub_8085564(void) .align 2, 0\n\ ._380:\n\ .word gDebugText_Weather\n\ - .word gUnknown_0202FF58+0x2\n\ + .word gUnknown_Debug_20301FE\n\ .word gMain\n\ ._378:\n\ ldr r0, ._382\n\ @@ -1347,7 +1350,7 @@ u8 debug_sub_8085564(void) ._383:\n\ .align 2, 0\n\ ._382:\n\ - .word gUnknown_0202FF58+0x2"); + .word gUnknown_Debug_20301FE"); } __attribute__((naked)) @@ -1386,7 +1389,7 @@ u8 debug_sub_808560C(void) ._385:\n\ .align 2, 0\n\ ._384:\n\ - .word gUnknown_0202FF58+0x2\n\ + .word gUnknown_Debug_20301FE\n\ .word gWeather\n\ .word gDebugText_Weather\n\ .word gMenuCallback\n\ diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index b5b13c533..99770f6e3 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -226,6 +226,15 @@ static void sub_81064B8(void); static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4); static void sub_81065DC(void); +#if DEBUG +__attribute__((section(".bss"))) u8 unk_debug_bss_1_0 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_1 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_2 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_3 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_4 = 0; +__attribute__((section(".bss"))) u32 unk_debug_bss_1_8 = 0; +#endif + static const struct UnkStruct1 *const gUnknown_083ED048[]; static const u16 gPalette_83EDE24[]; static const u8 gUnknown_083ECD04[][3]; @@ -252,7 +261,7 @@ void PlaySlotMachine(u8 arg0, MainCallback cb) ._2:\n\ .align 2, 0\n\ ._1:\n\ - .word unk_debug_bss_1+0x1\n\ + .word unk_debug_bss_1_1\n\ .word CB2_SlotMachineSetup+1"); } #else @@ -282,7 +291,7 @@ void debug_sub_811609C() ._4:\n\ .align 2, 0\n\ ._3:\n\ - .word unk_debug_bss_1+0x1\n\ + .word unk_debug_bss_1_1\n\ .word CB2_SlotMachineSetup+1"); } #endif @@ -544,7 +553,7 @@ static void SlotMachineSetup_0_1(void) .word gSaveBlock1\n\ .word 0x494\n\ .word gUnknown_083ECCF8\n\ - .word unk_debug_bss_1+0x1"); + .word unk_debug_bss_1_1"); } #else static void SlotMachineSetup_0_1(void) @@ -744,8 +753,8 @@ static bool8 sub_8101E10(struct Task *task) .align 2, 0\n\ ._70:\n\ .word +0x2000000\n\ - .word unk_debug_bss_1+0x1\n\ - .word unk_debug_bss_1+0x4\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ .word 0x270e"); } #else @@ -794,9 +803,9 @@ static bool8 sub_8101E3C(struct Task *task) ._78:\n\ .align 2, 0\n\ ._77:\n\ - .word unk_debug_bss_1+0x1\n\ + .word unk_debug_bss_1_1\n\ .word gMain\n\ - .word unk_debug_bss_1+0x4\n\ + .word unk_debug_bss_1_4\n\ .word +0x2000000\n\ ._75:\n\ mov r0, #0x0\n\ @@ -1101,7 +1110,7 @@ static bool8 sub_8101FA4(struct Task *task) .align 2, 0\n\ ._119:\n\ .word +0x2000000\n\ - .word unk_debug_bss_1+0x1"); + .word unk_debug_bss_1_1"); } #else static bool8 sub_8101FA4(struct Task *task) @@ -1182,9 +1191,9 @@ static bool8 sub_8102034(struct Task *task) ._128:\n\ .align 2, 0\n\ ._127:\n\ - .word unk_debug_bss_1+0x1\n\ - .word unk_debug_bss_1+0x4\n\ - .word unk_debug_bss_1+0x8\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ + .word unk_debug_bss_1_8\n\ .word +0x2000000"); } #else @@ -1235,9 +1244,9 @@ static bool8 sub_8102058(struct Task *task) ._134:\n\ .align 2, 0\n\ ._133:\n\ - .word unk_debug_bss_1+0x1\n\ - .word unk_debug_bss_1+0x4\n\ - .word unk_debug_bss_1+0x8\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ + .word unk_debug_bss_1_8\n\ .word +0x2000000\n\ ._130:\n\ ldr r0, ._136\n\ @@ -1322,7 +1331,7 @@ static bool8 sub_8102090(struct Task *task) .align 2, 0\n\ ._146:\n\ .word +0x2000000\n\ - .word unk_debug_bss_1\n\ + .word unk_debug_bss_1_0\n\ ._143:\n\ cmp r0, #0x4\n\ beq ._148 @cond_branch\n\ @@ -1821,7 +1830,7 @@ static bool8 sub_8102424(struct Task *task) ._235:\n\ .align 2, 0\n\ ._234:\n\ - .word unk_debug_bss_1+0x1\n\ + .word unk_debug_bss_1_1\n\ .word gSaveBlock1\n\ .word +0x2000000\n\ .word 0x494"); @@ -1980,9 +1989,9 @@ static void sub_8102484(void) .align 2, 0\n\ ._256:\n\ .word +0x2000000\n\ - .word unk_debug_bss_1+0x1\n\ - .word unk_debug_bss_1+0x2\n\ - .word unk_debug_bss_1+0x3\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_2\n\ + .word unk_debug_bss_1_3\n\ ._245:\n\ add r5, r4, #0\n\ ldrb r1, [r5, #0x4]\n\ @@ -4047,11 +4056,6 @@ static void sub_8104C5C(void) static void LoadSlotMachineWheelOverlay(void); -#if DEBUG -// should be static -__attribute__((section(".bss"))) u8 unk_debug_bss_1[0xC] = { 0 }; -#endif - static void sub_8104CAC(u8 arg0) { u8 i; @@ -5186,8 +5190,8 @@ void debug_sub_811B1C4() ".__2_:\n" " .align 2, 0\n" ".__1_:\n" - " .word unk_debug_bss_1+0x3\n" - " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" "\n" ); } @@ -5212,8 +5216,8 @@ void debug_sub_811B1EC() ".__4:\n" " .align 2, 0\n" ".__3:\n" - " .word unk_debug_bss_1+0x3\n" - " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" "\n" ); } @@ -5240,8 +5244,8 @@ void debug_sub_811B210() ".__6:\n" " .align 2, 0\n" ".__5:\n" - " .word unk_debug_bss_1+0x3\n" - " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" "\n" ); } @@ -5268,8 +5272,8 @@ void debug_sub_811B238() ".__8:\n" " .align 2, 0\n" ".__7:\n" - " .word unk_debug_bss_1+0x3\n" - " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" "\n" ); } @@ -5296,8 +5300,8 @@ void debug_sub_811B260() ".__10:\n" " .align 2, 0\n" ".__9:\n" - " .word unk_debug_bss_1+0x3\n" - " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" "\n" ); } @@ -5324,8 +5328,8 @@ void debug_sub_811B288() ".__12:\n" " .align 2, 0\n" ".__11:\n" - " .word unk_debug_bss_1+0x3\n" - " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" "\n" ); } @@ -5352,8 +5356,8 @@ void debug_sub_811B2B0() ".__14:\n" " .align 2, 0\n" ".__13:\n" - " .word unk_debug_bss_1+0x3\n" - " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" "\n" ); } @@ -5371,7 +5375,7 @@ void debug_sub_811B2D8() ".__16:\n" " .align 2, 0\n" ".__15:\n" - " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1_3\n" "\n" ); } @@ -5650,7 +5654,7 @@ void debug_sub_811B310() ".__30:\n" " .word Str_841B249\n" " .word +0x2000000\n" - " .word unk_debug_bss_1\n" + " .word unk_debug_bss_1_0\n" ".__27:\n" " cmp r0, #0x4\n" " beq .__32 @cond_branch\n" @@ -5765,10 +5769,10 @@ void debug_sub_811B5D0() ".__52:\n" " .align 2, 0\n" ".__51:\n" - " .word unk_debug_bss_1\n" - " .word unk_debug_bss_1+0x2\n" - " .word unk_debug_bss_1+0x3\n" - " .word unk_debug_bss_1+0x4\n" + " .word unk_debug_bss_1_0\n" + " .word unk_debug_bss_1_2\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_4\n" " .word +0x2000000\n" "\n" ); @@ -5994,11 +5998,11 @@ void debug_sub_811B654() ".__92:\n" " .align 2, 0\n" ".__91:\n" - " .word unk_debug_bss_1+0x2\n" - " .word unk_debug_bss_1+0x3\n" + " .word unk_debug_bss_1_2\n" + " .word unk_debug_bss_1_3\n" " .word Str_841B254\n" " .word _841B270\n" - " .word unk_debug_bss_1+0x4\n" + " .word unk_debug_bss_1_4\n" ".__66:\n" " bl Menu_ProcessInput\n" " lsl r0, r0, #0x18\n" @@ -6027,7 +6031,7 @@ void debug_sub_811B654() ".__97:\n" " .align 2, 0\n" ".__96:\n" - " .word unk_debug_bss_1+0x2\n" + " .word unk_debug_bss_1_2\n" " .word _841B270\n" ".__68:\n" " ldr r2, .__100\n" @@ -6183,7 +6187,7 @@ void debug_sub_811B894() " .word +0x2000000\n" " .word 0x270f\n" " .word Str_841B2B0\n" - " .word unk_debug_bss_1+0x4\n" + " .word unk_debug_bss_1_4\n" " .word Str_841B2D3\n" ".__117:\n" " lsl r0, r2, #0x10\n" @@ -6373,7 +6377,7 @@ void debug_sub_811B894() " .align 2, 0\n" ".__163:\n" " .word Str_841B2E4\n" - " .word unk_debug_bss_1+0x4\n" + " .word unk_debug_bss_1_4\n" " .word +0x2000000\n" " .word Str_841B2BF\n" "\n" diff --git a/src/pokenav_before.c b/src/pokenav_before.c index f9e2beccb..b292e80c4 100644 --- a/src/pokenav_before.c +++ b/src/pokenav_before.c @@ -497,7 +497,7 @@ void sub_80EBDD8() ._65:\n\ .align 2, 0\n\ ._64:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._66\n\ ._66:\n\ .word ._67\n\ @@ -543,7 +543,7 @@ void sub_80EBDD8() ._87:\n\ .align 2, 0\n\ ._86:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6ddc\n\ .word 0x6dae\n\ ._68:\n\ @@ -570,7 +570,7 @@ void sub_80EBDD8() ._92:\n\ .align 2, 0\n\ ._91:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._70:\n\ bl sub_80F2598\n\ ldr r1, ._94\n\ @@ -581,7 +581,7 @@ void sub_80EBDD8() ._95:\n\ .align 2, 0\n\ ._94:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._71:\n\ bl sub_80EEE20\n\ ldr r1, ._99\n\ @@ -607,7 +607,7 @@ void sub_80EBDD8() ._100:\n\ .align 2, 0\n\ ._99:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._73:\n\ mov r0, #0x0\n\ bl sub_80EF248\n\ @@ -630,7 +630,7 @@ void sub_80EBDD8() ._105:\n\ .align 2, 0\n\ ._104:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._75:\n\ mov r0, #0x0\n\ bl sub_80F1B8C\n\ @@ -655,7 +655,7 @@ void sub_80EBDD8() ._109:\n\ .align 2, 0\n\ ._108:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._77:\n\ ldr r0, ._111\n\ bl SetVBlankCallback\n\ @@ -680,7 +680,7 @@ void sub_80EBDD8() ._115:\n\ .align 2, 0\n\ ._114:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._79:\n\ mov r0, #0x0\n\ bl sub_80EED2C\n\ @@ -692,7 +692,7 @@ void sub_80EBDD8() ._118:\n\ .align 2, 0\n\ ._117:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._80:\n\ ldr r0, ._121\n\ ldrb r1, [r0, #0x7]\n\ @@ -732,7 +732,7 @@ void sub_80EBDD8() ._126:\n\ .align 2, 0\n\ ._125:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._83:\n\ bl sub_80F1DF0\n\ ._110:\n\ @@ -748,7 +748,7 @@ void sub_80EBDD8() ._129:\n\ .align 2, 0\n\ ._128:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._84:\n\ bl sub_80F1E50\n\ lsl r0, r0, #0x18\n\ @@ -895,7 +895,7 @@ void sub_80EC00C() ._137:\n\ .align 2, 0\n\ ._136:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._138\n\ ._138:\n\ .word ._139\n\ @@ -945,7 +945,7 @@ void sub_80EC00C() .align 2, 0\n\ ._156:\n\ .word sub_80EBD80+1\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6ddc\n\ .word 0x6dad\n\ .word 0x6dae\n\ @@ -975,7 +975,7 @@ void sub_80EC00C() ._162:\n\ .align 2, 0\n\ ._161:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._142:\n\ mov r0, #0x0\n\ bl sub_80F1B8C\n\ @@ -1002,7 +1002,7 @@ void sub_80EC00C() ._167:\n\ .align 2, 0\n\ ._166:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._144:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -1041,7 +1041,7 @@ void sub_80EC00C() ._175:\n\ .align 2, 0\n\ ._174:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._147:\n\ ldr r0, ._178\n\ ldrb r1, [r0, #0x7]\n\ @@ -1067,7 +1067,7 @@ void sub_80EC00C() ._182:\n\ .align 2, 0\n\ ._181:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._149:\n\ mov r0, #0x0\n\ bl sub_80F2C80\n\ @@ -1092,7 +1092,7 @@ void sub_80EC00C() ._186:\n\ .align 2, 0\n\ ._185:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._151:\n\ bl sub_80F1DF0\n\ ._169:\n\ @@ -1108,7 +1108,7 @@ void sub_80EC00C() ._189:\n\ .align 2, 0\n\ ._188:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._152:\n\ bl sub_80F1E50\n\ lsl r0, r0, #0x18\n\ @@ -1139,7 +1139,7 @@ void sub_80EC00C() ._193:\n\ .align 2, 0\n\ ._192:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6dad\n\ .word sub_80EC268+1\n\ .word gLinkOpen\n\ @@ -1367,7 +1367,7 @@ void sub_80EC4A0() ._286:\n\ .align 2, 0\n\ ._285:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._287\n\ ._287:\n\ .word ._288\n\ @@ -1417,7 +1417,7 @@ void sub_80EC4A0() .align 2, 0\n\ ._308:\n\ .word gSaveBlock2\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._290:\n\ bl sub_80EEF34\n\ lsl r0, r0, #0x18\n\ @@ -1444,7 +1444,7 @@ void sub_80EC4A0() ._314:\n\ .align 2, 0\n\ ._313:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._291:\n\ ldr r0, ._318\n\ ldrb r1, [r0, #0x7]\n\ @@ -1472,7 +1472,7 @@ void sub_80EC4A0() ._322:\n\ .align 2, 0\n\ ._321:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._293:\n\ bl sub_80EF814\n\ b ._336\n\ @@ -1496,7 +1496,7 @@ void sub_80EC4A0() ._327:\n\ .align 2, 0\n\ ._326:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._296:\n\ mov r0, #0x4\n\ bl sub_80F2C80\n\ @@ -1514,7 +1514,7 @@ void sub_80EC4A0() ._330:\n\ .align 2, 0\n\ ._329:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._298:\n\ bl sub_80F2DD8\n\ ldr r0, ._332\n\ @@ -1528,7 +1528,7 @@ void sub_80EC4A0() .align 2, 0\n\ ._332:\n\ .word sub_80EBD30+1\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._299:\n\ bl sub_8055870\n\ b ._334\n\ @@ -1576,7 +1576,7 @@ void sub_80EC4A0() .word gLinkOpen\n\ .word 0x60075e0\n\ .word 0x600f800\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._302:\n\ ldr r0, ._341\n\ ldrb r1, [r0, #0x7]\n\ @@ -1709,7 +1709,7 @@ void sub_80EC67C() ._346:\n\ .align 2, 0\n\ ._345:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._347\n\ ._347:\n\ .word ._348\n\ @@ -1754,7 +1754,7 @@ void sub_80EC67C() ._365:\n\ .align 2, 0\n\ ._364:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._359:\n\ mov r0, #0x5\n\ bl PlaySE\n\ @@ -1768,7 +1768,7 @@ void sub_80EC67C() ._368:\n\ .align 2, 0\n\ ._367:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._349:\n\ ldr r1, ._371\n\ add r0, r4, r1\n\ @@ -1812,7 +1812,7 @@ void sub_80EC67C() ._379:\n\ .align 2, 0\n\ ._378:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6e90\n\ ._376:\n\ mov r0, #0xc1\n\ @@ -1836,7 +1836,7 @@ void sub_80EC67C() ._384:\n\ .align 2, 0\n\ ._383:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._352:\n\ mov r2, #0xc2\n\ lsl r2, r2, #0x2\n\ @@ -1911,7 +1911,7 @@ void sub_80EC67C() ._389:\n\ .word gPaletteFade\n\ .word gSaveBlock2\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6e90\n\ .word sub_80EC00C+1\n\ .word gLinkOpen\n\ @@ -2110,7 +2110,7 @@ void sub_80ECA10() ._457:\n\ .align 2, 0\n\ ._456:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._458\n\ ._458:\n\ .word ._459\n\ @@ -2160,7 +2160,7 @@ void sub_80ECA10() .align 2, 0\n\ ._476:\n\ .word sub_80EBD80+1\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6df0\n\ .word 0x6dad\n\ .word 0x6dae\n\ @@ -2190,7 +2190,7 @@ void sub_80ECA10() ._482:\n\ .align 2, 0\n\ ._481:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._462:\n\ mov r0, #0x1\n\ bl sub_80F1B8C\n\ @@ -2217,7 +2217,7 @@ void sub_80ECA10() ._487:\n\ .align 2, 0\n\ ._486:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._464:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -2256,7 +2256,7 @@ void sub_80ECA10() ._495:\n\ .align 2, 0\n\ ._494:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._467:\n\ bl sub_80F2598\n\ b ._496\n\ @@ -2299,7 +2299,7 @@ void sub_80ECA10() ._504:\n\ .align 2, 0\n\ ._503:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._471:\n\ bl sub_80F1DF0\n\ ._496:\n\ @@ -2315,7 +2315,7 @@ void sub_80ECA10() ._507:\n\ .align 2, 0\n\ ._506:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._472:\n\ bl sub_80F1E50\n\ lsl r0, r0, #0x18\n\ @@ -2346,7 +2346,7 @@ void sub_80ECA10() ._511:\n\ .align 2, 0\n\ ._510:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6dad\n\ .word sub_80EC86C+1\n\ .word gLinkOpen\n\ @@ -2506,7 +2506,7 @@ void sub_80ECD80() ._565:\n\ .align 2, 0\n\ ._564:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._566\n\ ._566:\n\ .word ._567\n\ @@ -2587,7 +2587,7 @@ void sub_80ECD80() ._601:\n\ .align 2, 0\n\ ._600:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._571:\n\ mov r0, #0x1\n\ bl sub_80F2D6C\n\ @@ -2599,7 +2599,7 @@ void sub_80ECD80() ._604:\n\ .align 2, 0\n\ ._603:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._572:\n\ mov r0, #0x5\n\ bl sub_80F2D6C\n\ @@ -2648,7 +2648,7 @@ void sub_80ECD80() ._613:\n\ .align 2, 0\n\ ._612:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._576:\n\ mov r0, #0x2\n\ bl sub_80F1B8C\n\ @@ -2675,7 +2675,7 @@ void sub_80ECD80() ._618:\n\ .align 2, 0\n\ ._617:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._578:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -2719,7 +2719,7 @@ void sub_80ECD80() ._628:\n\ .align 2, 0\n\ ._627:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._582:\n\ ldr r0, ._631\n\ ldrb r1, [r0, #0x7]\n\ @@ -2766,7 +2766,7 @@ void sub_80ECD80() ._636:\n\ .align 2, 0\n\ ._635:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x306\n\ ._585:\n\ mov r0, #0x5\n\ @@ -2798,7 +2798,7 @@ void sub_80ECD80() ._640:\n\ .align 2, 0\n\ ._639:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._587:\n\ bl sub_80F1E50\n\ lsl r0, r0, #0x18\n\ @@ -2829,7 +2829,7 @@ void sub_80ECD80() ._644:\n\ .align 2, 0\n\ ._643:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6dad\n\ .word sub_80ECC08+1\n\ .word gLinkOpen\n\ @@ -2970,7 +2970,7 @@ void sub_80ED01C() ._648:\n\ .align 2, 0\n\ ._647:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._649\n\ ._649:\n\ .word ._650\n\ @@ -3007,7 +3007,7 @@ void sub_80ED01C() ._672:\n\ .align 2, 0\n\ ._671:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._651:\n\ bl sub_80F1F10\n\ lsl r0, r0, #0x18\n\ @@ -3025,7 +3025,7 @@ void sub_80ED01C() ._677:\n\ .align 2, 0\n\ ._676:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._652:\n\ bl sub_80EEF34\n\ lsl r0, r0, #0x18\n\ @@ -3052,7 +3052,7 @@ void sub_80ED01C() ._682:\n\ .align 2, 0\n\ ._681:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._653:\n\ ldr r0, ._686\n\ ldrb r1, [r0, #0x7]\n\ @@ -3075,7 +3075,7 @@ void sub_80ED01C() .align 2, 0\n\ ._686:\n\ .word gPaletteFade\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._654:\n\ bl sub_80F2620\n\ ldr r1, ._689\n\ @@ -3086,7 +3086,7 @@ void sub_80ED01C() ._690:\n\ .align 2, 0\n\ ._689:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._655:\n\ bl sub_80F4D44\n\ ldr r1, ._693\n\ @@ -3112,7 +3112,7 @@ void sub_80ED01C() ._694:\n\ .align 2, 0\n\ ._693:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._691:\n\ ldr r1, ._696\n\ mov r0, #0xc1\n\ @@ -3122,7 +3122,7 @@ void sub_80ED01C() ._697:\n\ .align 2, 0\n\ ._696:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._657:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -3140,7 +3140,7 @@ void sub_80ED01C() ._702:\n\ .align 2, 0\n\ ._701:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._658:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -3155,7 +3155,7 @@ void sub_80ED01C() ._707:\n\ .align 2, 0\n\ ._706:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._659:\n\ mov r0, #0x0\n\ bl sub_80F0264\n\ @@ -3181,7 +3181,7 @@ void sub_80ED01C() ._712:\n\ .align 2, 0\n\ ._711:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._661:\n\ mov r0, #0x0\n\ bl sub_80F3008\n\ @@ -3193,7 +3193,7 @@ void sub_80ED01C() ._715:\n\ .align 2, 0\n\ ._714:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._662:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -3208,7 +3208,7 @@ void sub_80ED01C() ._720:\n\ .align 2, 0\n\ ._719:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._663:\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ @@ -3242,7 +3242,7 @@ void sub_80ED01C() ._726:\n\ .align 2, 0\n\ ._725:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._665:\n\ ldr r0, ._729\n\ ldrb r1, [r0, #0x7]\n\ @@ -3299,7 +3299,7 @@ void sub_80ED01C() ._734:\n\ .align 2, 0\n\ ._733:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x306\n\ ._668:\n\ ldr r4, ._737\n\ @@ -3347,7 +3347,7 @@ void sub_80ED01C() ._738:\n\ .align 2, 0\n\ ._737:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6dfc\n\ .word sub_80ED31C+1\n\ .word gLinkOpen\n\ @@ -3487,7 +3487,7 @@ void sub_80ED31C() ._744:\n\ .align 2, 0\n\ ._743:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._740:\n\ cmp r0, #0x2\n\ beq ._745 @cond_branch\n\ @@ -3655,7 +3655,7 @@ void sub_80ED3D0() ._768:\n\ .align 2, 0\n\ ._767:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._769\n\ ._769:\n\ .word ._770\n\ @@ -3678,7 +3678,7 @@ void sub_80ED3D0() ._781:\n\ .align 2, 0\n\ ._780:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._771:\n\ bl sub_80EED0C\n\ bl sub_80F6134\n\ @@ -3690,7 +3690,7 @@ void sub_80ED3D0() ._784:\n\ .align 2, 0\n\ ._783:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._772:\n\ mov r0, #0x0\n\ bl sub_80EEFBC\n\ @@ -3702,7 +3702,7 @@ void sub_80ED3D0() ._787:\n\ .align 2, 0\n\ ._786:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._773:\n\ mov r0, #0x0\n\ bl sub_80F0264\n\ @@ -3726,7 +3726,7 @@ void sub_80ED3D0() ._791:\n\ .align 2, 0\n\ ._790:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._775:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -3739,7 +3739,7 @@ void sub_80ED3D0() ._795:\n\ .align 2, 0\n\ ._794:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._776:\n\ mov r0, #0x0\n\ bl sub_80F3008\n\ @@ -3768,7 +3768,7 @@ void sub_80ED3D0() ._798:\n\ .align 2, 0\n\ ._797:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word sub_80EBD18+1\n\ ._777:\n\ mov r0, #0x4\n\ @@ -3793,7 +3793,7 @@ void sub_80ED3D0() ._802:\n\ .align 2, 0\n\ ._801:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word gLinkOpen\n\ .word 0x6007de0\n\ .word 0x600f800\n\ @@ -3890,7 +3890,7 @@ void sub_80ED4D8() ._809:\n\ .align 2, 0\n\ ._808:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._810\n\ ._810:\n\ .word ._811\n\ @@ -3936,7 +3936,7 @@ void sub_80ED4D8() .align 2, 0\n\ ._824:\n\ .word gPaletteFade\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._813:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -3949,7 +3949,7 @@ void sub_80ED4D8() ._829:\n\ .align 2, 0\n\ ._828:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._814:\n\ bl sub_80F4CF0\n\ ldr r1, ._831\n\ @@ -3960,7 +3960,7 @@ void sub_80ED4D8() ._832:\n\ .align 2, 0\n\ ._831:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._815:\n\ bl sub_80EFF34\n\ ldr r1, ._835\n\ @@ -3983,7 +3983,7 @@ void sub_80ED4D8() ._836:\n\ .align 2, 0\n\ ._835:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._817:\n\ bl sub_80F35B4\n\ mov r0, #0x2\n\ @@ -4014,7 +4014,7 @@ void sub_80ED4D8() ._839:\n\ .align 2, 0\n\ ._838:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word sub_80EBD4C+1\n\ ._818:\n\ mov r0, #0x2\n\ @@ -4039,7 +4039,7 @@ void sub_80ED4D8() ._843:\n\ .align 2, 0\n\ ._842:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word gLinkOpen\n\ .word 0x6007de0\n\ .word 0x600f000\n\ @@ -4141,7 +4141,7 @@ void sub_80ED620() ._850:\n\ .align 2, 0\n\ ._849:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._851\n\ ._851:\n\ .word ._852\n\ @@ -4173,7 +4173,7 @@ void sub_80ED620() ._871:\n\ .align 2, 0\n\ ._870:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._853:\n\ bl sub_80F1F10\n\ lsl r0, r0, #0x18\n\ @@ -4210,7 +4210,7 @@ void sub_80ED620() ._879:\n\ .align 2, 0\n\ ._878:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._855:\n\ ldr r0, ._883\n\ ldrb r1, [r0, #0x7]\n\ @@ -4241,7 +4241,7 @@ void sub_80ED620() .align 2, 0\n\ ._883:\n\ .word gPaletteFade\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x76aa\n\ ._856:\n\ bl sub_80F2620\n\ @@ -4275,7 +4275,7 @@ void sub_80ED620() ._891:\n\ .align 2, 0\n\ ._890:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._860:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -4288,7 +4288,7 @@ void sub_80ED620() ._895:\n\ .align 2, 0\n\ ._894:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._861:\n\ bl sub_8055870\n\ b ._896\n\ @@ -4315,7 +4315,7 @@ void sub_80ED620() ._899:\n\ .align 2, 0\n\ ._898:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word sub_80EBD4C+1\n\ ._863:\n\ mov r0, #0x2\n\ @@ -4328,7 +4328,7 @@ void sub_80ED620() ._902:\n\ .align 2, 0\n\ ._901:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._864:\n\ ldr r0, ._905\n\ ldrb r1, [r0, #0x7]\n\ @@ -4375,7 +4375,7 @@ void sub_80ED620() ._910:\n\ .align 2, 0\n\ ._909:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._867:\n\ mov r0, #0x6\n\ bl sub_80F2C80\n\ @@ -4411,7 +4411,7 @@ void sub_80ED620() ._914:\n\ .align 2, 0\n\ ._913:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word sub_80ED858+1\n\ .word gLinkOpen\n\ .word 0x6007de0\n\ @@ -4702,7 +4702,7 @@ void sub_80ED858() ._918:\n\ .align 2, 0\n\ ._917:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._919\n\ ._919:\n\ .word ._920\n\ @@ -4730,7 +4730,7 @@ void sub_80ED858() ._934:\n\ .align 2, 0\n\ ._933:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._921:\n\ bl sub_80F5B50\n\ lsl r0, r0, #0x18\n\ @@ -4748,7 +4748,7 @@ void sub_80ED858() ._939:\n\ .align 2, 0\n\ ._938:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._922:\n\ mov r0, #0x1\n\ bl sub_80F0174\n\ @@ -4762,7 +4762,7 @@ void sub_80ED858() ._942:\n\ .align 2, 0\n\ ._941:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._923:\n\ bl sub_80F4FB4\n\ lsl r0, r0, #0x18\n\ @@ -4879,7 +4879,7 @@ void sub_80ED858() ._963:\n\ .align 2, 0\n\ ._962:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._960:\n\ mov r0, #0x1\n\ and r0, r0, r2\n\ @@ -4958,7 +4958,7 @@ void sub_80ED858() ._981:\n\ .align 2, 0\n\ ._980:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._926:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -4971,7 +4971,7 @@ void sub_80ED858() ._985:\n\ .align 2, 0\n\ ._984:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._927:\n\ mov r0, #0x3\n\ bl sub_80EEFBC\n\ @@ -4986,7 +4986,7 @@ void sub_80ED858() ._988:\n\ .align 2, 0\n\ ._987:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._928:\n\ bl sub_80F7500\n\ lsl r0, r0, #0x18\n\ @@ -5007,7 +5007,7 @@ void sub_80ED858() ._992:\n\ .align 2, 0\n\ ._991:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._929:\n\ bl sub_80F5038\n\ lsl r0, r0, #0x18\n\ @@ -5037,7 +5037,7 @@ void sub_80ED858() ._996:\n\ .align 2, 0\n\ ._995:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._931:\n\ ldr r0, ._1000\n\ ldrb r1, [r0, #0x7]\n\ @@ -5065,7 +5065,7 @@ void sub_80ED858() .align 2, 0\n\ ._1000:\n\ .word gPaletteFade\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x76aa\n\ .word sub_80ECA10+1\n\ ._998:\n\ @@ -5501,7 +5501,7 @@ void sub_80EDB88() ._1008:\n\ .align 2, 0\n\ ._1007:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._1009\n\ ._1009:\n\ .word ._1010\n\ @@ -5534,7 +5534,7 @@ void sub_80EDB88() ._1030:\n\ .align 2, 0\n\ ._1029:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1011:\n\ bl sub_80F1F10\n\ lsl r0, r0, #0x18\n\ @@ -5552,7 +5552,7 @@ void sub_80EDB88() ._1035:\n\ .align 2, 0\n\ ._1034:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1012:\n\ bl sub_80EEF34\n\ lsl r0, r0, #0x18\n\ @@ -5576,7 +5576,7 @@ void sub_80EDB88() ._1040:\n\ .align 2, 0\n\ ._1039:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1013:\n\ ldr r0, ._1044\n\ ldrb r1, [r0, #0x7]\n\ @@ -5599,7 +5599,7 @@ void sub_80EDB88() .align 2, 0\n\ ._1044:\n\ .word gPaletteFade\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1014:\n\ bl sub_80F2620\n\ ldr r1, ._1047\n\ @@ -5610,7 +5610,7 @@ void sub_80EDB88() ._1048:\n\ .align 2, 0\n\ ._1047:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1015:\n\ bl sub_80F638C\n\ ldr r1, ._1051\n\ @@ -5636,7 +5636,7 @@ void sub_80EDB88() ._1052:\n\ .align 2, 0\n\ ._1051:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1049:\n\ ldr r1, ._1054\n\ mov r0, #0xc1\n\ @@ -5646,7 +5646,7 @@ void sub_80EDB88() ._1055:\n\ .align 2, 0\n\ ._1054:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1017:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -5664,7 +5664,7 @@ void sub_80EDB88() ._1060:\n\ .align 2, 0\n\ ._1059:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1018:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -5679,7 +5679,7 @@ void sub_80EDB88() ._1065:\n\ .align 2, 0\n\ ._1064:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1019:\n\ mov r0, #0x1\n\ bl sub_80F0264\n\ @@ -5703,7 +5703,7 @@ void sub_80EDB88() ._1069:\n\ .align 2, 0\n\ ._1068:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1021:\n\ mov r0, #0x2\n\ bl sub_80F2C80\n\ @@ -5728,7 +5728,7 @@ void sub_80EDB88() ._1073:\n\ .align 2, 0\n\ ._1072:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1023:\n\ mov r0, #0x1\n\ bl sub_80F3008\n\ @@ -5740,7 +5740,7 @@ void sub_80EDB88() ._1076:\n\ .align 2, 0\n\ ._1075:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1024:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -5753,7 +5753,7 @@ void sub_80EDB88() ._1080:\n\ .align 2, 0\n\ ._1079:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1025:\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ @@ -5804,7 +5804,7 @@ void sub_80EDB88() ._1087:\n\ .align 2, 0\n\ ._1086:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word gLinkOpen\n\ .word 0x6007de0\n\ .word 0x600f800\n\ @@ -5943,7 +5943,7 @@ void sub_80EDDBC() ._1096:\n\ .align 2, 0\n\ ._1095:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1092:\n\ cmp r0, #0x2\n\ beq ._1097 @cond_branch\n\ @@ -6136,7 +6136,7 @@ void sub_80EDEE4() ._1135:\n\ .align 2, 0\n\ ._1134:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._1136\n\ ._1136:\n\ .word ._1137\n\ @@ -6184,7 +6184,7 @@ void sub_80EDEE4() .align 2, 0\n\ ._1152:\n\ .word gPaletteFade\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1139:\n\ bl sub_80F66E0\n\ bl sub_80EEE08\n\ @@ -6196,7 +6196,7 @@ void sub_80EDEE4() ._1156:\n\ .align 2, 0\n\ ._1155:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1140:\n\ bl sub_80F1080\n\ lsl r0, r0, #0x18\n\ @@ -6210,7 +6210,7 @@ void sub_80EDEE4() ._1160:\n\ .align 2, 0\n\ ._1159:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1141:\n\ mov r0, #0x5\n\ bl sub_80EEFBC\n\ @@ -6235,7 +6235,7 @@ void sub_80EDEE4() ._1164:\n\ .align 2, 0\n\ ._1163:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1143:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -6248,7 +6248,7 @@ void sub_80EDEE4() ._1168:\n\ .align 2, 0\n\ ._1167:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1144:\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ @@ -6291,7 +6291,7 @@ void sub_80EDEE4() ._1175:\n\ .align 2, 0\n\ ._1174:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word gLinkOpen\n\ .word 0x6007de0\n\ .word 0x600f000\n\ @@ -6417,7 +6417,7 @@ void sub_80EE06C() ._1186:\n\ .align 2, 0\n\ ._1185:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._1187\n\ ._1187:\n\ .word ._1188\n\ @@ -6439,7 +6439,7 @@ void sub_80EE06C() ._1199:\n\ .align 2, 0\n\ ._1198:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1189:\n\ ldr r2, ._1203\n\ ldrh r1, [r2, #0x30]\n\ @@ -6515,7 +6515,7 @@ void sub_80EE06C() ._1213:\n\ .align 2, 0\n\ ._1212:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1210:\n\ mov r0, #0x2\n\ and r0, r0, r2\n\ @@ -6547,7 +6547,7 @@ void sub_80EE06C() ._1223:\n\ .align 2, 0\n\ ._1222:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1191:\n\ bl sub_8055870\n\ add r1, r0, #0\n\ @@ -6562,7 +6562,7 @@ void sub_80EE06C() ._1227:\n\ .align 2, 0\n\ ._1226:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1192:\n\ bl sub_80F3B00\n\ ldr r1, ._1229\n\ @@ -6577,7 +6577,7 @@ void sub_80EE06C() ._1230:\n\ .align 2, 0\n\ ._1229:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1193:\n\ bl sub_80F3B58\n\ lsl r0, r0, #0x18\n\ @@ -6596,7 +6596,7 @@ void sub_80EE06C() ._1234:\n\ .align 2, 0\n\ ._1233:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1194:\n\ bl sub_80F68E8\n\ lsl r0, r0, #0x18\n\ @@ -6618,7 +6618,7 @@ void sub_80EE06C() ._1239:\n\ .align 2, 0\n\ ._1238:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1236:\n\ ldr r0, ._1242\n\ ldrh r1, [r0, #0x2e]\n\ @@ -6640,7 +6640,7 @@ void sub_80EE06C() .align 2, 0\n\ ._1242:\n\ .word gMain\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1195:\n\ bl sub_80F3BD4\n\ lsl r0, r0, #0x18\n\ @@ -6657,7 +6657,7 @@ void sub_80EE06C() ._1247:\n\ .align 2, 0\n\ ._1246:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1196:\n\ bl sub_80F3BD4\n\ lsl r0, r0, #0x18\n\ @@ -6694,7 +6694,7 @@ void sub_80EE06C() ._1251:\n\ .align 2, 0\n\ ._1250:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word gLinkOpen\n\ .word gLink\n\ .word 0xfbd"); @@ -6812,7 +6812,7 @@ void sub_80EE294() ._1255:\n\ .align 2, 0\n\ ._1254:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._1256\n\ ._1256:\n\ .word ._1257\n\ @@ -6858,7 +6858,7 @@ void sub_80EE294() .align 2, 0\n\ ._1270:\n\ .word gPaletteFade\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1259:\n\ bl sub_80F6134\n\ mov r0, #0x1\n\ @@ -6883,7 +6883,7 @@ void sub_80EE294() ._1275:\n\ .align 2, 0\n\ ._1274:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1261:\n\ mov r0, #0x4\n\ bl sub_80EEFBC\n\ @@ -6900,7 +6900,7 @@ void sub_80EE294() .align 2, 0\n\ ._1277:\n\ .word sub_80EBD18+1\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1262:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -6913,7 +6913,7 @@ void sub_80EE294() ._1282:\n\ .align 2, 0\n\ ._1281:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1263:\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ @@ -6958,7 +6958,7 @@ void sub_80EE294() ._1287:\n\ .align 2, 0\n\ ._1286:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word gLinkOpen\n\ .word 0x6007de0\n\ .word 0x600f800\n\ @@ -7059,7 +7059,7 @@ void sub_80EE3D8() ._1294:\n\ .align 2, 0\n\ ._1293:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word ._1295\n\ ._1295:\n\ .word ._1296\n\ @@ -7088,7 +7088,7 @@ void sub_80EE3D8() ._1312:\n\ .align 2, 0\n\ ._1311:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1297:\n\ bl sub_80F1F10\n\ lsl r0, r0, #0x18\n\ @@ -7106,7 +7106,7 @@ void sub_80EE3D8() ._1317:\n\ .align 2, 0\n\ ._1316:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1298:\n\ bl sub_80EEF34\n\ lsl r0, r0, #0x18\n\ @@ -7130,7 +7130,7 @@ void sub_80EE3D8() ._1322:\n\ .align 2, 0\n\ ._1321:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1299:\n\ ldr r0, ._1326\n\ ldrb r1, [r0, #0x7]\n\ @@ -7154,7 +7154,7 @@ void sub_80EE3D8() .align 2, 0\n\ ._1326:\n\ .word gPaletteFade\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1300:\n\ bl sub_80F2620\n\ ldr r1, ._1329\n\ @@ -7165,7 +7165,7 @@ void sub_80EE3D8() ._1330:\n\ .align 2, 0\n\ ._1329:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1301:\n\ mov r0, #0x2\n\ bl sub_80F0264\n\ @@ -7191,7 +7191,7 @@ void sub_80EE3D8() ._1335:\n\ .align 2, 0\n\ ._1334:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1303:\n\ mov r0, #0x3\n\ bl sub_80F2C80\n\ @@ -7216,7 +7216,7 @@ void sub_80EE3D8() ._1339:\n\ .align 2, 0\n\ ._1338:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1305:\n\ mov r0, #0x2\n\ bl sub_80F3008\n\ @@ -7228,7 +7228,7 @@ void sub_80EE3D8() ._1342:\n\ .align 2, 0\n\ ._1341:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1306:\n\ bl sub_8055870\n\ cmp r0, #0\n\ @@ -7241,7 +7241,7 @@ void sub_80EE3D8() ._1346:\n\ .align 2, 0\n\ ._1345:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1307:\n\ bl sub_80F6F10\n\ ldr r4, ._1348\n\ @@ -7270,7 +7270,7 @@ void sub_80EE3D8() ._1349:\n\ .align 2, 0\n\ ._1348:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word sub_80EBD68+1\n\ ._1308:\n\ mov r0, #0x5\n\ @@ -7295,7 +7295,7 @@ void sub_80EE3D8() ._1353:\n\ .align 2, 0\n\ ._1352:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word gLinkOpen\n\ .word 0x6007de0\n\ .word 0x600f800\n\ @@ -7419,7 +7419,7 @@ void sub_80EE58C() ._1362:\n\ .align 2, 0\n\ ._1361:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ ._1358:\n\ cmp r0, #0x2\n\ beq ._1363 @cond_branch\n\ @@ -8045,7 +8045,7 @@ bool8 sub_80EEC10() .align 2, 0\n\ ._1563:\n\ .word gMain\n\ - .word +0x2006dad\n\ + .word gSharedMem+0x6dad\n\ ._1559:\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -8077,7 +8077,7 @@ bool8 sub_80EEC10() ._1570:\n\ .align 2, 0\n\ ._1569:\n\ - .word +0x2006dad\n\ + .word gSharedMem+0x6dad\n\ ._1565:\n\ ldr r0, ._1572\n\ ldrb r0, [r0]\n\ @@ -8166,7 +8166,7 @@ bool8 sub_80EEC90() .align 2, 0\n\ ._1577:\n\ .word gMain\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6dad\n\ .word 0x6dae\n\ ._1574:\n\ @@ -8196,7 +8196,7 @@ bool8 sub_80EEC90() ._1583:\n\ .align 2, 0\n\ ._1582:\n\ - .word +0x2000000\n\ + .word gSharedMem\n\ .word 0x6dad\n\ ._1579:\n\ ldr r0, ._1585\n\ -- cgit v1.2.3 From f2885be7da921ef0a5058b2b36d4473481db1022 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 23 Jan 2018 17:03:59 -0600 Subject: remove some unnecessary DEBUG conditionals in symbol files --- src/scene/berry_blender.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index 5b013e8de..0799531cd 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -3763,7 +3763,7 @@ loc_805654C:\n\ .syntax divided\n"); } #else -static bool8 Blender_PrintBlendingResults(void) +bool8 Blender_PrintBlendingResults(void) { u16 i; -- cgit v1.2.3 From 1e6cb59a0cd0dff15f749a5274bee17ca994c178 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 23 Jan 2018 20:43:28 -0600 Subject: start decompiling start_menu_debug.c --- src/debug/start_menu_debug.c | 1041 +++++++++++++++++++----------------------- 1 file changed, 475 insertions(+), 566 deletions(-) (limited to 'src') diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 318785945..5d9b150e7 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -1,583 +1,492 @@ #if DEBUG #include "global.h" +#include "constants/songs.h" +#include "battle.h" +#include "debug.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "mystery_event_menu.h" +#include "overworld.h" +#include "reset_rtc_screen.h" +#include "rtc.h" +#include "save.h" +#include "sound.h" +#include "task.h" +#include "text.h" +#include "trade.h" + +// berry_blender.c +extern void unref_sub_80524BC(void); + +void debug_sub_8076BB4(u8); +void debug_sub_8077CF4(); + +u8 DebugMenu_Exit(void); +u8 DebugMenu_OpenWatanabe(void); +u8 DebugMenu_OpenSogabe(void); +u8 DebugMenu_OpenTamada(void); +u8 DebugMenu_OpenKagaya(void); +u8 DebugMenu_OpenMatsuda(void); +u8 DebugMenu_OpenNohara(void); +u8 DebugMenu_OpenNakamura(void); +u8 DebugMenu_Teleport(void); +u8 DebugMenu_EditPKMN(void); +u8 DebugMenu_SwitchBG(void); +u8 DebugMenu_OpenMori(void); +u8 DebugMenu_OpenTomomichi(void); +u8 DebugMenu_OpenAoki(void); +u8 DebugMenu_OpenTaya(void); +u8 DebugMenu_ToggleClearFlag(void); +u8 DebugMenu_ControlEncounter(void); +u8 DebugMenu_PTime(void); +u8 DebugMenu_MakeItems(void); +u8 debug_sub_8091300(void); +u8 DebugMenu_ViewPortraits(void); +u8 DebugMenu_TimeRecords(void); +u8 DebugMenu_SetTime(void); +u8 DebugMenu_NationalDex(void); +u8 DebugMenu_CreatePKMN(void); +u8 DebugMenu_ViewPokemonGraphics(void); +u8 DebugMenu_BattleForDebug(void); +u8 DebugMenu_AllBadges(void); +u8 DebugMenu_HoennNationalDex(void); +u8 DebugMenu_SetRamBerry(void); +u8 DebugMenu_UseHM(void); +u8 DebugMenu_OpenIwasawa(void); +u8 DebugMenu_ToggleBGM(void); +u8 DebugMenu_OpenSizeComparison(void); +u8 DebugMenu_Safari(void); +u8 DebugMenu_RematchTrainers(void); +u8 DebugMenu_MiragaIslandRND(void); +u8 DebugMenu_HallOfFame(void); +u8 DebugMenu_OpenMysteryEvent(void); +u8 DebugMenu_OpenLegendsRecord(void); +u8 DebugMenu_OpenWeatherEvents(void); +u8 DebugMenu_CellInfo(void); +u8 DebugMenu_CheckPKBLCK(void); +u8 DebugMenu_EffortValues(void); +u8 DebugMenu_HoennDex(void); +u8 DebugMenu_OpenSeeTrainers(void); +u8 DebugMenu_OpenBerryInfo(void); +u8 DebugMenu_BattleTowerStages(void); +u8 DebugMenu_EndSequenceDemo(void); +u8 DebugMenu_RandomNumberTest(void); +u8 DebugMenu_MeTooBackupMan(void); +u8 DebugMenu_OpenMurakawa(void); +u8 DebugMenu_OpenKiwa(void); +u8 DebugMenu_8076CBC(void); +u8 DebugMenu_8076CC0(void); +u8 DebugMenu_8076CD4(void); +u8 DebugMenu_8076C6C(void); +u8 DebugMenu_8076CD8(void); +u8 DebugMenu_8076D28(void); +u8 DebugMenu_8076D3C(void); +u8 DebugMenu_8076C80(void); +u8 DebugMenu_8076C90(void); +u8 DebugMenu_8076D50(void); +u8 DebugMenu_8076CEC(void); +u8 DebugMenu_8076D14(void); +u8 DebugMenu_8076D00(void); +u8 DebugMenu_8076D5C(void); +u8 DebugMenu_8076E18(void); +u8 DebugMenu_8076EDC(void); +void DebugMenu_8076FEC(void); + +const u8 Str_839B740[] = _("·WATANABE"); +const u8 Str_839B74A[] = _("SOGABE"); +const u8 Str_839B751[] = _("·TAMADA"); +const u8 Str_839B759[] = _("KAGAYA"); +const u8 Str_839B760[] = _("MATUDA"); +const u8 Str_839B767[] = _("NOHARA"); +const u8 Str_839B76E[] = _("NAKAMURA"); +const u8 Str_839B777[] = _("EXIT"); +const u8 Str_839B77C[] = _("Teleport"); +const u8 Str_839B785[] = _("Switch BG"); +const u8 Str_839B78F[] = _("Edit your {PKMN}"); +const u8 Str_839B79C[] = _("MORI"); +const u8 Str_839B7A1[] = _("TOMOMITI"); +const u8 Str_839B7AA[] = _("·AOKI"); +const u8 Str_839B7B0[] = _("TAYA"); +const u8 Str_839B7B5[] = _("Control Encounter"); +const u8 Str_839B7C7[] = _("PTIME"); +const u8 Str_839B7CD[] = _("Make items"); +const u8 Str_839B7D8[] = _("Transport"); +const u8 Str_839B7E2[] = _("See portraits"); +const u8 Str_839B7F0[] = _("Time records"); +const u8 Str_839B7FD[] = _("Set time"); +const u8 Str_839B806[] = _("National オカDex"); +const u8 Str_839B815[] = _("Hoenn オカDex"); +const u8 Str_839B821[] = _("Create {PKMN}"); +const u8 Str_839B82B[] = _("See {PKMN} graphics"); +const u8 Str_839B83B[] = _("See trainers"); +const u8 Str_839B848[] = _("Battle for debug"); +const u8 Str_839B859[] = _("Full set of badges"); +const u8 Str_839B86C[] = _("Hoenn National Dex"); +const u8 Str_839B87F[] = _("Set Ram berry"); +const u8 Str_839B88D[] = _("Use HM"); +const u8 Str_839B894[] = _("IWASAWA"); +const u8 Str_839B89C[] = _("BGM ON/OFF"); +const u8 Str_839B8A7[] = _("Size comparison"); +const u8 Str_839B8B7[] = _("Clear flag ON/OFF"); +const u8 Str_839B8C9[] = _("Safari"); +const u8 Str_839B8D0[] = _("Rematch trainers"); +const u8 Str_839B8E1[] = _("Mirage island RND"); +const u8 Str_839B8F3[] = _("Hall of fame"); +const u8 Str_839B900[] = _("Mystery event"); +const u8 Str_839B90E[] = _("Legends records"); +const u8 Str_839B91E[] = _("Weather events"); +const u8 Str_839B92D[] = _("Cell info."); +const u8 Str_839B938[] = _("Check {POKEBLOCK}"); +const u8 Str_839B944[] = _("Effort values"); +const u8 Str_839B952[] = _("Berrie Info"); +const u8 Str_839B95E[] = _("Battle Tower stages"); +const u8 Str_839B972[] = _("End sequence demo"); +const u8 Str_839B984[] = _("Random number test"); +const u8 Str_839B997[] = _("Me-too BackupMan"); +const u8 Str_839B9A8[] = _("MURAKAWA"); +const u8 Str_839B9B1[] = _("KINA(FONT)"); + +const struct MenuAction gDebug0x839B9BC[] = +{ + { Str_839B777, DebugMenu_Exit }, + { Str_839B740, DebugMenu_OpenWatanabe }, + { Str_839B74A, DebugMenu_OpenSogabe }, + { Str_839B751, DebugMenu_OpenTamada }, + { Str_839B759, DebugMenu_OpenKagaya }, + { Str_839B760, DebugMenu_OpenMatsuda }, + { Str_839B767, DebugMenu_OpenNohara }, + { Str_839B76E, DebugMenu_OpenNakamura }, + { Str_839B77C, DebugMenu_Teleport }, + { Str_839B78F, DebugMenu_EditPKMN }, + { Str_839B785, DebugMenu_SwitchBG }, + { Str_839B79C, DebugMenu_OpenMori }, + { Str_839B7A1, DebugMenu_OpenTomomichi }, + { Str_839B7AA, DebugMenu_OpenAoki }, + { Str_839B7B0, DebugMenu_OpenTaya }, + { Str_839B8B7, DebugMenu_ToggleClearFlag }, + { Str_839B7B5, DebugMenu_ControlEncounter }, + { Str_839B7C7, DebugMenu_PTime }, + { Str_839B7CD, DebugMenu_MakeItems }, + { Str_839B7D8, debug_sub_8091300 }, + { Str_839B7E2, DebugMenu_ViewPortraits }, + { Str_839B7F0, DebugMenu_TimeRecords }, + { Str_839B7FD, DebugMenu_SetTime }, + { Str_839B806, DebugMenu_NationalDex }, + { Str_839B821, DebugMenu_CreatePKMN }, + { Str_839B82B, DebugMenu_ViewPokemonGraphics }, + { Str_839B848, DebugMenu_BattleForDebug }, + { Str_839B859, DebugMenu_AllBadges }, + { Str_839B86C, DebugMenu_HoennNationalDex }, + { Str_839B87F, DebugMenu_SetRamBerry }, + { Str_839B88D, DebugMenu_UseHM }, + { Str_839B894, DebugMenu_OpenIwasawa }, + { Str_839B89C, DebugMenu_ToggleBGM }, + { Str_839B8A7, DebugMenu_OpenSizeComparison }, + { Str_839B8C9, DebugMenu_Safari }, + { Str_839B8D0, DebugMenu_RematchTrainers }, + { Str_839B8E1, DebugMenu_MiragaIslandRND }, + { Str_839B8F3, DebugMenu_HallOfFame }, + { Str_839B900, DebugMenu_OpenMysteryEvent }, + { Str_839B90E, DebugMenu_OpenLegendsRecord }, + { Str_839B91E, DebugMenu_OpenWeatherEvents }, + { Str_839B92D, DebugMenu_CellInfo }, + { Str_839B938, DebugMenu_CheckPKBLCK }, + { Str_839B944, DebugMenu_EffortValues }, + { Str_839B815, DebugMenu_HoennDex }, + { Str_839B83B, DebugMenu_OpenSeeTrainers }, + { Str_839B952, DebugMenu_OpenBerryInfo }, + { Str_839B95E, DebugMenu_BattleTowerStages }, + { Str_839B972, DebugMenu_EndSequenceDemo }, + { Str_839B984, DebugMenu_RandomNumberTest }, + { Str_839B997, DebugMenu_MeTooBackupMan }, + { Str_839B9A8, DebugMenu_OpenMurakawa }, + { Str_839B9B1, DebugMenu_OpenKiwa }, +}; + +const u8 gUnknown_Debug_839BB64[] = +{ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x00, 0x08, 0x09, 0x0a, 0x1e, 0x10, 0x24, 0x0f, 0x00, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, + 0x1c, 0x1d, 0x14, 0x20, 0x21, 0x22, 0x23, 0x00, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x00, 0x11, 0x33, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const u8 gUnknown_Debug_0839BBA4[] = _("Debugging Version"); +const u8 gUnknown_Debug_0839BBB6[] = _("{VERSION} Version"); +const u8 gUnknown_Debug_0839BBC1[] = _("Normal RTC compatible"); +const u8 Str_839BBD7[] = _("か の じっけん"); +const u8 Str_839BBE0[] = _("じっけん2"); +const u8 Str_839BBE6[] = _("BGじっけん"); +const u8 Str_839BBED[] = _("Battle"); +const u8 Str_839BBF4[] = _("つうしん じっけん"); +const u8 Str_839BBFE[] = _("LINK Test2"); +const u8 Str_839BC09[] = _("フィールド はじめる"); +const u8 Str_839BC14[] = _("フィールド つづき"); +const u8 Str_839BC1E[] = _("Sound test"); +const u8 Str_839BC29[] = _("{POKEBLOCK} test"); +const u8 Str_839BC34[] = _("Crash backup data"); +const u8 Str_839BC46[] = _("e-Card test"); +const u8 Str_839BC52[] = _("こうかんデモ   "); +const u8 Str_839BC5C[] = _("Time in game"); +const u8 Str_839BC69[] = _("フェスタ モード"); +const u8 Str_839BC72[] = _("Mimic e-Card"); +const u8 Str_839BC7F[] = _("RTC reset"); +const u8 Str_839BC89[] = _("Converter"); + +const struct MenuAction gUnknown_Debug_839BC94[] = +{ + { Str_839BBD7, DebugMenu_8076CBC }, + { Str_839BBE0, DebugMenu_8076CC0 }, + { Str_839BBE6, DebugMenu_8076CD4 }, + { Str_839BBED, DebugMenu_8076C6C }, + { Str_839BC29, DebugMenu_8076CD8 }, + { Str_839BBFE, DebugMenu_8076D28 }, + { Str_839BC1E, DebugMenu_8076D3C }, + { Str_839BC09, DebugMenu_8076C80 }, + { Str_839BC14, DebugMenu_8076C90 }, + { Str_839BC34, DebugMenu_8076D50 }, + { Str_839BC46, DebugMenu_8076CEC }, + { Str_839BC52, DebugMenu_8076D14 }, + { Str_839BC72, DebugMenu_8076D00 }, + { Str_839BC5C, DebugMenu_8076D5C }, + { Str_839BC7F, DebugMenu_8076E18 }, + { Str_839BC89, DebugMenu_8076EDC }, +}; + +// NOTE: When decompiling this file, I found out that having an extraneous extern +// in a C file can affect the generated asm. If this extern is commented out, +// debug_sub_8076BB4 will access the array differently and no longer match. +//extern const struct MenuAction gUnknown_Debug_839BC94[]; + +const u8 Str_839BD14[][10] = +{ + _("うかえ"), + _("おけこしすせそ"), +}; + +const u8 Str_839BD26[] = {2, 0, 0, 0}; // doesn't appear to be referenced + +const u8 Str_839BD2C[] = _("RTCを リセット します\n" + "Aで じっこう   Bでキャンセル"); + +const u8 Str_839BD4C[] = _("RTCを リセット した!"); + +const u8 Str_839BD5A[] = _("セーブデータを コンバートします\n" + "Aで けってい  Bで キャンセル"); + +const u8 Str_839BD7D[] = _("へんかんが しゅうりょう しました!"); + + +extern const u8 Str_839BD2C[]; +extern const u8 Str_839BD4C[]; __attribute__((unused)) static u8 gUnknown_030006B8[4]; __attribute__((unused)) static u8 gUnknown_030006BC[4]; __attribute__((unused)) static u8 gUnknown_030006C0; __attribute__((unused)) static u8 gUnknown_030006C1; -__attribute__((unused)) static void *gUnknown_030006C4; +static const u8 *gUnknown_030006C4; __attribute__((unused)) static u8 gUnknown_030006C8; -__attribute__((naked)) -void debug_sub_8076AC8() +void debug_sub_8076AC8(u8 a) { - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._3\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x1\n" - " ldr r0, ._3 + 4\n" - " add r1, r1, r0\n" - " str r1, [r2]\n" - " mov r4, #0x0\n" - " ldrb r0, [r1]\n" - " cmp r0, #0xff\n" - " beq ._1 @cond_branch\n" - "._2:\n" - " add r4, r4, #0x1\n" - " add r0, r1, r4\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " bne ._2 @cond_branch\n" - "._1:\n" - " mov r0, #0x10\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " lsl r3, r4, #0x1\n" - " add r3, r3, #0x1\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " mov r0, #0x10\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " bl Menu_DrawStdWindowFrame\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r3, ._3 + 8\n" - " ldr r0, ._3\n" - " ldr r0, [r0]\n" - " str r0, [sp]\n" - " mov r0, #0x11\n" - " mov r1, #0x1\n" - " add r2, r4, #0\n" - " bl Menu_PrintItemsReordered\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xc\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x11\n" - " mov r2, #0x1\n" - " add r3, r4, #0\n" - " bl InitMenu\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._4:\n" - " .align 2, 0\n" - "._3:\n" - " .word gUnknown_030006C4 \n" - " .word Str_839BD14\n" - " .word gUnknown_Debug_839BC94\n" - "\n" - ); + s32 r4; + + gUnknown_030006C4 = Str_839BD14[a]; + for (r4 = 0; gUnknown_030006C4[r4] != EOS; r4++) + ; + Menu_EraseWindowRect(16, 0, 29, 19); + Menu_DrawStdWindowFrame(16, 0, 29, r4 * 2 + 1); + Menu_PrintItemsReordered(17, 1, r4, (struct MenuAction2 *)gUnknown_Debug_839BC94, gUnknown_030006C4); + InitMenu(0, 17, 1, r4, 0, 12); } -__attribute__((naked)) -void debug_sub_8076B4C() +void debug_sub_8076B4C(void) { - asm( - " push {lr}\n" - " ldr r0, ._6\n" - " bl FindTaskIdByFunc\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0xff\n" - " beq ._5 @cond_branch\n" - " bl DestroyTask\n" - "._5:\n" - " pop {r0}\n" - " bx r0\n" - "._7:\n" - " .align 2, 0\n" - "._6:\n" - " .word debug_sub_8076BB4+1\n" - "\n" - ); + u8 taskId = FindTaskIdByFunc(debug_sub_8076BB4); + + if (taskId != 0xFF) + DestroyTask(taskId); } -__attribute__((naked)) -void debug_sub_8076B68() +// Initializes test menu +void debug_sub_8076B68(void) { - asm( - " push {lr}\n" - " ldr r0, ._8\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._8 + 4\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r0, ._8 + 8\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " mov r0, #0x4\n" - " mov r1, #0xb\n" - " bl debug_sub_8077CF4\n" - " mov r0, #0x0\n" - " bl debug_sub_8076AC8\n" - " ldr r0, ._8 + 12\n" - " mov r1, #0x1\n" - " bl CreateTask\n" - " pop {r0}\n" - " bx r0\n" - "._9:\n" - " .align 2, 0\n" - "._8:\n" - " .word gUnknown_Debug_0839BBB6\n" - " .word gUnknown_Debug_0839BBC1\n" - " .word gUnknown_Debug_0839BBA4\n" - " .word debug_sub_8076BB4+1\n" - "\n" - ); + Menu_PrintText(gUnknown_Debug_0839BBB6, 1, 1); + Menu_PrintText(gUnknown_Debug_0839BBC1, 1, 3); + Menu_PrintText(gUnknown_Debug_0839BBA4, 1, 9); + debug_sub_8077CF4(4, 11); + debug_sub_8076AC8(0); + CreateTask(debug_sub_8076BB4, 1); } -__attribute__((naked)) -void debug_sub_8076BB4() +// Handles input for the test menu +void debug_sub_8076BB4(u8 taskId) { - asm( - " push {r4, r5, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " ldr r0, ._13\n" - " add r5, r1, r0\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._10 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r4, r0\n" - " beq ._11 @cond_branch\n" - " ldr r2, ._13 + 4\n" - " lsl r1, r1, #0x18\n" - " asr r1, r1, #0x18\n" - " ldr r0, ._13 + 8\n" - " ldr r0, [r0]\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r2, r2, #0x4\n" - " add r0, r0, r2\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " b ._24\n" - "._14:\n" - " .align 2, 0\n" - "._13:\n" - " .word gTasks+0x8\n" - " .word gUnknown_Debug_839BC94\n" - " .word gUnknown_030006C4 \n" - "._10:\n" - " ldr r0, ._18\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r2, r0, #0x10\n" - " cmp r2, #0\n" - " beq ._15 @cond_branch\n" - " ldrh r1, [r5]\n" - " mov r2, #0x0\n" - " ldsh r0, [r5, r2]\n" - " cmp r0, #0\n" - " bne ._16 @cond_branch\n" - " mov r0, #0x1\n" - " b ._20\n" - "._19:\n" - " .align 2, 0\n" - "._18:\n" - " .word gMain\n" - "._16:\n" - " sub r0, r1, #1\n" - " b ._20\n" - "._15:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._24 @cond_branch\n" - " ldrh r1, [r5]\n" - " mov r3, #0x0\n" - " ldsh r0, [r5, r3]\n" - " cmp r0, #0x1\n" - " bne ._22 @cond_branch\n" - " strh r2, [r5]\n" - " b ._23\n" - "._22:\n" - " add r0, r1, #1\n" - "._20:\n" - " strh r0, [r5]\n" - "._23:\n" - " ldrb r0, [r5]\n" - " bl debug_sub_8076AC8\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " b ._24\n" - "._11:\n" - " bl DoSoftReset\n" - "._24:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + s16 *data = gTasks[taskId].data; + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + switch (input) + { + default: + gUnknown_Debug_839BC94[gUnknown_030006C4[cursorPos]].func(); + break; + case -2: + if (gMain.newKeys & 0x20) + { + if (data[0] == 0) + data[0] = 1; + else + data[0]--; + debug_sub_8076AC8(data[0]); + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & 0x10) + { + if (data[0] == 1) + data[0] = 0; + else + data[0]++; + debug_sub_8076AC8(data[0]); + PlaySE(SE_SELECT); + } + break; + case -1: + DoSoftReset(); + break; + } } -__attribute__((naked)) -void DebugMenu_8076C6C() +u8 DebugMenu_8076C6C(void) { - asm( - " push {lr}\n" - " ldr r0, ._25\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._26:\n" - " .align 2, 0\n" - "._25:\n" - " .word debug_sub_8010800+1\n" - "\n" - ); + SetMainCallback2(debug_sub_8010800); + return 0; } -__attribute__((naked)) -void DebugMenu_8076C80() +u8 DebugMenu_8076C80(void) { - asm( - " push {lr}\n" - " bl debug_sub_8076B4C\n" - " bl DebugMenu_8076FEC\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + debug_sub_8076B4C(); + DebugMenu_8076FEC(); + return 0; } -__attribute__((naked)) -void DebugMenu_8076C90() +u8 DebugMenu_8076C90(void) { - asm( - " push {lr}\n" - " ldr r0, ._29\n" - " ldrh r0, [r0]\n" - " cmp r0, #0xff\n" - " bne ._27 @cond_branch\n" - " mov r0, #0x16\n" - " bl PlaySE\n" - " b ._28\n" - "._30:\n" - " .align 2, 0\n" - "._29:\n" - " .word gSaveFileStatus\n" - "._27:\n" - " bl debug_sub_8076B4C\n" - " ldr r0, ._31\n" - " bl SetMainCallback2\n" - "._28:\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._32:\n" - " .align 2, 0\n" - "._31:\n" - " .word CB2_ContinueSavedGame+1\n" - "\n" - ); + if (gSaveFileStatus == SAVE_STATUS_ERROR) + { + PlaySE(0x16); + } + else + { + debug_sub_8076B4C(); + SetMainCallback2(CB2_ContinueSavedGame); + } + return 0; } -__attribute__((naked)) -void DebugMenu_8076CBC() +u8 DebugMenu_8076CBC(void) { - asm( - " mov r0, #0x0\n" - " bx lr\n" - "\n" - ); + return 0; } -__attribute__((naked)) -void DebugMenu_8076CC0() +u8 DebugMenu_8076CC0(void) { - asm( - " push {lr}\n" - " ldr r0, ._33\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._34:\n" - " .align 2, 0\n" - "._33:\n" - " .word debug_nullsub_66+1\n" - "\n" - ); + SetMainCallback2(debug_nullsub_66); + return 0; } -__attribute__((naked)) -void DebugMenu_8076CD4() +u8 DebugMenu_8076CD4(void) { - asm( - " mov r0, #0x0\n" - " bx lr\n" - "\n" - ); + return 0; } -__attribute__((naked)) -void DebugMenu_8076CD8() +u8 DebugMenu_8076CD8(void) { - asm( - " push {lr}\n" - " ldr r0, ._35\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._36:\n" - " .align 2, 0\n" - "._35:\n" - " .word unref_sub_80524BC+1\n" - "\n" - ); + SetMainCallback2(unref_sub_80524BC); + return 0; } -__attribute__((naked)) -void DebugMenu_8076CEC() +u8 DebugMenu_8076CEC(void) { - asm( - " push {lr}\n" - " ldr r0, ._37\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._38:\n" - " .align 2, 0\n" - "._37:\n" - " .word CB2_InitMysteryEventMenu+1\n" - "\n" - ); + SetMainCallback2(CB2_InitMysteryEventMenu); + return 0; } -__attribute__((naked)) -void DebugMenu_8076D00() +u8 DebugMenu_8076D00(void) { - asm( - " push {lr}\n" - " ldr r0, ._39\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._40:\n" - " .align 2, 0\n" - "._39:\n" - " .word debug_sub_815D15C+1\n" - "\n" - ); + SetMainCallback2(debug_sub_815D15C); + return 0; } -__attribute__((naked)) -void DebugMenu_8076D14() +u8 DebugMenu_8076D14(void) { - asm( - " push {lr}\n" - " ldr r0, ._41\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._42:\n" - " .align 2, 0\n" - "._41:\n" - " .word sub_804B790+1\n" - "\n" - ); + SetMainCallback2(sub_804B790); + return 0; } -__attribute__((naked)) -void DebugMenu_8076D28() +u8 DebugMenu_8076D28(void) { - asm( - " push {lr}\n" - " ldr r0, ._43\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._44:\n" - " .align 2, 0\n" - "._43:\n" - " .word LinkTestScreen+1\n" - "\n" - ); + SetMainCallback2(LinkTestScreen); + return 0; } -__attribute__((naked)) -void DebugMenu_8076D3C() +u8 DebugMenu_8076D3C(void) { - asm( - " push {lr}\n" - " ldr r0, ._45\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._46:\n" - " .align 2, 0\n" - "._45:\n" - " .word CB2_StartSoundCheckMenu+1\n" - "\n" - ); + SetMainCallback2(CB2_StartSoundCheckMenu); + return 0; } -__attribute__((naked)) -void DebugMenu_8076D50() +u8 DebugMenu_8076D50(void) { - asm( - " push {lr}\n" - " bl Save_EraseAllData\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + Save_EraseAllData(); + return 0; } -__attribute__((naked)) -void DebugMenu_8076D5C() +u8 DebugMenu_8076D5C(void) { - asm( - " push {lr}\n" - " bl debug_sub_8076B4C\n" - " bl debug_sub_806F8F8\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + debug_sub_8076B4C(); + debug_sub_806F8F8(); + return 0; } -__attribute__((naked)) -void DebugMenu_8076D6C() +void DebugMenu_8076D6C(u8 taskId) { - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - " lsl r0, r3, #0x2\n" - " add r0, r0, r3\n" - " lsl r0, r0, #0x3\n" - " ldr r1, ._51\n" - " add r4, r0, r1\n" - " mov r0, #0x0\n" - " ldsh r1, [r4, r0]\n" - " cmp r1, #0x1\n" - " beq ._47 @cond_branch\n" - " cmp r1, #0x1\n" - " bgt ._48 @cond_branch\n" - " cmp r1, #0\n" - " beq ._49 @cond_branch\n" - " b ._64\n" - "._52:\n" - " .align 2, 0\n" - "._51:\n" - " .word gTasks+0x8\n" - "._48:\n" - " cmp r1, #0x2\n" - " beq ._53 @cond_branch\n" - " b ._64\n" - "._49:\n" - " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._56\n" - " mov r1, #0x2\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " b ._55\n" - "._57:\n" - " .align 2, 0\n" - "._56:\n" - " .word Str_839BD2C\n" - "._47:\n" - " ldr r0, ._60\n" - " ldrh r2, [r0, #0x2e]\n" - " and r1, r1, r2\n" - " cmp r1, #0\n" - " beq ._58 @cond_branch\n" - " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._60 + 4\n" - " mov r1, #0x2\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " mov r0, #0x49\n" - " bl PlaySE\n" - " bl RtcReset\n" - "._55:\n" - " ldrh r0, [r4]\n" - " add r0, r0, #0x1\n" - " strh r0, [r4]\n" - " b ._64\n" - "._61:\n" - " .align 2, 0\n" - "._60:\n" - " .word gMain\n" - " .word Str_839BD4C\n" - "._58:\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._64 @cond_branch\n" - " add r0, r3, #0\n" - " bl DestroyTask\n" - " bl DoSoftReset\n" - " b ._64\n" - "._53:\n" - " ldr r0, ._65\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._64 @cond_branch\n" - " add r0, r3, #0\n" - " bl DestroyTask\n" - " bl DoSoftReset\n" - "._64:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._66:\n" - " .align 2, 0\n" - "._65:\n" - " .word gMain\n" - "\n" - ); + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_839BD2C, 2, 15); + data[0]++; + break; + case 1: + if (gMain.newKeys & A_BUTTON) + { + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_839BD4C, 2, 15); + PlaySE(0x49); + RtcReset(); + data[0]++; + } + else if (gMain.newKeys & B_BUTTON) + { + DestroyTask(taskId); + DoSoftReset(); + } + break; + case 2: + if (gMain.newKeys & A_BUTTON) + { + DestroyTask(taskId); + DoSoftReset(); + } + break; + } } __attribute__((naked)) -void DebugMenu_8076E18() +u8 DebugMenu_8076E18() { asm( " push {lr}\n" @@ -692,7 +601,7 @@ void DebugMenu_8076E30() } __attribute__((naked)) -void DebugMenu_8076EDC() +u8 DebugMenu_8076EDC() { asm( " push {lr}\n" @@ -1321,7 +1230,7 @@ void DebugMenu_8077238() } __attribute__((naked)) -void DebugMenu_Exit() +u8 DebugMenu_Exit() { asm( " push {lr}\n" @@ -1334,7 +1243,7 @@ void DebugMenu_Exit() } __attribute__((naked)) -void DebugMenu_OpenSogabe() +u8 DebugMenu_OpenSogabe() { asm( " push {lr}\n" @@ -1348,7 +1257,7 @@ void DebugMenu_OpenSogabe() } __attribute__((naked)) -void DebugMenu_OpenTamada() +u8 DebugMenu_OpenTamada() { asm( " push {lr}\n" @@ -1362,7 +1271,7 @@ void DebugMenu_OpenTamada() } __attribute__((naked)) -void DebugMenu_OpenKagaya() +u8 DebugMenu_OpenKagaya() { asm( " push {lr}\n" @@ -1376,7 +1285,7 @@ void DebugMenu_OpenKagaya() } __attribute__((naked)) -void DebugMenu_OpenMatsuda() +u8 DebugMenu_OpenMatsuda() { asm( " push {lr}\n" @@ -1390,7 +1299,7 @@ void DebugMenu_OpenMatsuda() } __attribute__((naked)) -void DebugMenu_OpenNohara() +u8 DebugMenu_OpenNohara() { asm( " push {lr}\n" @@ -1404,7 +1313,7 @@ void DebugMenu_OpenNohara() } __attribute__((naked)) -void DebugMenu_OpenWatanabe() +u8 DebugMenu_OpenWatanabe() { asm( " push {lr}\n" @@ -1424,7 +1333,7 @@ void DebugMenu_OpenWatanabe() } __attribute__((naked)) -void DebugMenu_EndSequenceDemo() +u8 DebugMenu_EndSequenceDemo() { asm( " push {lr}\n" @@ -1444,7 +1353,7 @@ void DebugMenu_EndSequenceDemo() } __attribute__((naked)) -void DebugMenu_HallOfFame() +u8 DebugMenu_HallOfFame() { asm( " push {lr}\n" @@ -1459,7 +1368,7 @@ void DebugMenu_HallOfFame() } __attribute__((naked)) -void DebugMenu_OpenSizeComparison() +u8 DebugMenu_OpenSizeComparison() { asm( " push {lr}\n" @@ -1474,7 +1383,7 @@ void DebugMenu_OpenSizeComparison() } __attribute__((naked)) -void DebugMenu_HoennNationalDex() +u8 DebugMenu_HoennNationalDex() { asm( " push {lr}\n" @@ -1495,7 +1404,7 @@ void DebugMenu_HoennNationalDex() } __attribute__((naked)) -void DebugMenu_8077434() +u8 DebugMenu_8077434() { asm( " push {lr}\n" @@ -1613,7 +1522,7 @@ void DebugMenu_8077434() } __attribute__((naked)) -void DebugMenu_807750C() +u8 DebugMenu_807750C() { asm( " push {lr}\n" @@ -1632,7 +1541,7 @@ void DebugMenu_807750C() } __attribute__((naked)) -void DebugMenu_SetRamBerry() +u8 DebugMenu_SetRamBerry() { asm( " push {lr}\n" @@ -1657,7 +1566,7 @@ void DebugMenu_SetRamBerry() } __attribute__((naked)) -void DebugMenu_ToggleBGM() +u8 DebugMenu_ToggleBGM() { asm( " push {lr}\n" @@ -1682,7 +1591,7 @@ void DebugMenu_ToggleBGM() } __attribute__((naked)) -void DebugMenu_BattleForDebug() +u8 DebugMenu_BattleForDebug() { asm( " push {lr}\n" @@ -1697,7 +1606,7 @@ void DebugMenu_BattleForDebug() } __attribute__((naked)) -void DebugMenu_NationalDex() +u8 DebugMenu_NationalDex() { asm( " push {r4, r5, lr}\n" @@ -1733,7 +1642,7 @@ void DebugMenu_NationalDex() } __attribute__((naked)) -void DebugMenu_HoennDex() +u8 DebugMenu_HoennDex() { asm( " push {r4, r5, lr}\n" @@ -1772,7 +1681,7 @@ void DebugMenu_HoennDex() } __attribute__((naked)) -void DebugMenu_CreatePKMN() +u8 DebugMenu_CreatePKMN() { asm( " push {lr}\n" @@ -1787,7 +1696,7 @@ void DebugMenu_CreatePKMN() } __attribute__((naked)) -void DebugMenu_ViewPokemonGraphics() +u8 DebugMenu_ViewPokemonGraphics() { asm( " push {lr}\n" @@ -1802,7 +1711,7 @@ void DebugMenu_ViewPokemonGraphics() } __attribute__((naked)) -void DebugMenu_OpenSeeTrainers() +u8 DebugMenu_OpenSeeTrainers() { asm( " push {lr}\n" @@ -1817,7 +1726,7 @@ void DebugMenu_OpenSeeTrainers() } __attribute__((naked)) -void DebugMenu_OpenMori() +u8 DebugMenu_OpenMori() { asm( " push {lr}\n" @@ -1831,7 +1740,7 @@ void DebugMenu_OpenMori() } __attribute__((naked)) -void DebugMenu_OpenTomomichi() +u8 DebugMenu_OpenTomomichi() { asm( " push {lr}\n" @@ -1845,7 +1754,7 @@ void DebugMenu_OpenTomomichi() } __attribute__((naked)) -void DebugMenu_OpenAoki() +u8 DebugMenu_OpenAoki() { asm( " push {lr}\n" @@ -1858,7 +1767,7 @@ void DebugMenu_OpenAoki() } __attribute__((naked)) -void DebugMenu_OpenTaya() +u8 DebugMenu_OpenTaya() { asm( " push {lr}\n" @@ -1872,7 +1781,7 @@ void DebugMenu_OpenTaya() } __attribute__((naked)) -void DebugMenu_OpenNakamura() +u8 DebugMenu_OpenNakamura() { asm( " push {lr}\n" @@ -1886,7 +1795,7 @@ void DebugMenu_OpenNakamura() } __attribute__((naked)) -void DebugMenu_OpenIwasawa() +u8 DebugMenu_OpenIwasawa() { asm( " push {lr}\n" @@ -1900,7 +1809,7 @@ void DebugMenu_OpenIwasawa() } __attribute__((naked)) -void DebugMenu_Teleport() +u8 DebugMenu_Teleport() { asm( " push {lr}\n" @@ -1916,7 +1825,7 @@ void DebugMenu_Teleport() } __attribute__((naked)) -void DebugMenu_EditPKMN() +u8 DebugMenu_EditPKMN() { asm( " push {lr}\n" @@ -2023,7 +1932,7 @@ void DebugMenu_8077704() } __attribute__((naked)) -void DebugMenu_8077760() +u8 DebugMenu_8077760() { asm( " push {r4, r5, lr}\n" @@ -2139,7 +2048,7 @@ void DebugMenu_8077760() } __attribute__((naked)) -void DebugMenu_SwitchBG() +u8 DebugMenu_SwitchBG() { asm( " push {lr}\n" @@ -2257,7 +2166,7 @@ void DebugMenu_80778A8() } __attribute__((naked)) -void DebugMenu_ControlEncounter() +u8 DebugMenu_ControlEncounter() { asm( " push {lr}\n" @@ -2282,7 +2191,7 @@ void DebugMenu_ControlEncounter() } __attribute__((naked)) -void DebugMenu_UseHM() +u8 DebugMenu_UseHM() { asm( " ldr r1, ._215\n" @@ -2501,7 +2410,7 @@ void DebugMenu_8077A60() } __attribute__((naked)) -void DebugMenu_RematchTrainers() +u8 DebugMenu_RematchTrainers() { asm( " push {lr}\n" @@ -2664,7 +2573,7 @@ void DebugMenu_8077B3C() } __attribute__((naked)) -void DebugMenu_Safari() +u8 DebugMenu_Safari() { asm( " push {lr}\n" @@ -3202,7 +3111,7 @@ void DebugMenu_8077E40() } __attribute__((naked)) -void DebugMenu_MakeItems() +u8 DebugMenu_MakeItems() { asm( " push {lr}\n" @@ -3721,7 +3630,7 @@ void DebugMenu_80781A8() } __attribute__((naked)) -void DebugMenu_ViewPortraits() +u8 DebugMenu_ViewPortraits() { asm( " push {lr}\n" @@ -3754,7 +3663,7 @@ void DebugMenu_8078254() } __attribute__((naked)) -void DebugMenu_AllBadges() +u8 DebugMenu_AllBadges() { asm( " push {lr}\n" @@ -3794,7 +3703,7 @@ void DebugMenu_AllBadges() } __attribute__((naked)) -void DebugMenu_TimeRecords() +u8 DebugMenu_TimeRecords() { asm( " push {lr}\n" @@ -3815,7 +3724,7 @@ void DebugMenu_TimeRecords() } __attribute__((naked)) -void DebugMenu_SetTime() +u8 DebugMenu_SetTime() { asm( " push {lr}\n" @@ -3943,7 +3852,7 @@ void DebugMenu_8078310() } __attribute__((naked)) -void DebugMenu_MiragaIslandRND() +u8 DebugMenu_MiragaIslandRND() { asm( " push {lr}\n" @@ -4027,7 +3936,7 @@ void DebugMenu_80783C8() } __attribute__((naked)) -void DebugMenu_ToggleClearFlag() +u8 DebugMenu_ToggleClearFlag() { asm( " push {lr}\n" @@ -4106,7 +4015,7 @@ void DebugMenu_8078464() } __attribute__((naked)) -void DebugMenu_OpenWeatherEvents() +u8 DebugMenu_OpenWeatherEvents() { asm( " push {lr}\n" @@ -4177,7 +4086,7 @@ void DebugMenu_80784E8() } __attribute__((naked)) -void DebugMenu_OpenMysteryEvent() +u8 DebugMenu_OpenMysteryEvent() { asm( " push {lr}\n" @@ -4596,7 +4505,7 @@ void DebugMenu_80787B0() } __attribute__((naked)) -void DebugMenu_OpenLegendsRecord() +u8 DebugMenu_OpenLegendsRecord() { asm( " push {lr}\n" @@ -4761,7 +4670,7 @@ void DebugMenu_8078880() } __attribute__((naked)) -void DebugMenu_CellInfo() +u8 DebugMenu_CellInfo() { asm( " push {lr}\n" @@ -4783,7 +4692,7 @@ void DebugMenu_CellInfo() } __attribute__((naked)) -void DebugMenu_OpenBerryInfo() +u8 DebugMenu_OpenBerryInfo() { asm( " push {r4, lr}\n" @@ -5135,7 +5044,7 @@ void DebugMenu_8078B38() } __attribute__((naked)) -void DebugMenu_BattleTowerStages() +u8 DebugMenu_BattleTowerStages() { asm( " push {lr}\n" @@ -5300,7 +5209,7 @@ void DebugMenu_8078BD4() } __attribute__((naked)) -void DebugMenu_CheckPKBLCK() +u8 DebugMenu_CheckPKBLCK() { asm( " push {lr}\n" @@ -5525,7 +5434,7 @@ void DebugMenu_8078DA4() } __attribute__((naked)) -void DebugMenu_MeTooBackupMan() +u8 DebugMenu_MeTooBackupMan() { asm( " push {lr}\n" @@ -5911,7 +5820,7 @@ void DebugMenu_8079020() } __attribute__((naked)) -void DebugMenu_PTime() +u8 DebugMenu_PTime() { asm( " push {lr}\n" @@ -6026,7 +5935,7 @@ void DebugMenu_8079058() } __attribute__((naked)) -void DebugMenu_OpenMurakawa() +u8 DebugMenu_OpenMurakawa() { asm( " push {lr}\n" @@ -6120,7 +6029,7 @@ void DebugMenu_8079110() } __attribute__((naked)) -void DebugMenu_OpenKiwa() +u8 DebugMenu_OpenKiwa() { asm( " push {lr}\n" -- cgit v1.2.3 From 6437a2acd5b662db779352c24f34116852a1c605 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 23 Jan 2018 21:44:01 -0600 Subject: decompile kagaya_debug_menu.c --- src/debug/kagaya_debug_menu.c | 497 +++++++++++------------------------------- src/field/slot_machine.c | 50 +---- 2 files changed, 137 insertions(+), 410 deletions(-) (limited to 'src') diff --git a/src/debug/kagaya_debug_menu.c b/src/debug/kagaya_debug_menu.c index 53e3fac1a..89df82f04 100644 --- a/src/debug/kagaya_debug_menu.c +++ b/src/debug/kagaya_debug_menu.c @@ -1,420 +1,183 @@ #if DEBUG + #include "global.h" +#include "field_effect.h" +#include "field_control_avatar.h" +#include "field_player_avatar.h" +#include "main.h" #include "menu.h" - -u8 KagayaDebugMenu_TrainerCard(); -u8 KagayaDebugMenu_CardToExchange(); -u8 KagayaDebugMenu_SlotMachine(); +#include "overworld.h" +#include "palette.h" +#include "random.h" +#include "region_map.h" +#include "script.h" +#include "slot_machine.h" +#include "trainer_card.h" + +extern u8 (*gMenuCallback)(void); + +void InitKagayaDebugMenu_B(void); +u8 debug_sub_80B061C(void); +u8 KagayaDebugMenu_TrainerCard(void); +u8 debug_sub_80B068C(void); +u8 KagayaDebugMenu_CardToExchange(void); +u8 debug_sub_80B06E0(void); +u8 KagayaDebugMenu_SlotMachine(void); +u8 Kagaya_80B0734(void); +u8 debug_sub_80B07DC(void); const u8 Str_83EBB34[] = _("Trainer’s card"); const u8 Str_83EBB43[] = _("Card to exchange"); const u8 Str_83EBB54[] = _("Slot machine"); -const struct MenuAction _83EBB64[] = { +const struct MenuAction _83EBB64[] = +{ { Str_83EBB34, KagayaDebugMenu_TrainerCard }, { Str_83EBB43, KagayaDebugMenu_CardToExchange }, { Str_83EBB54, KagayaDebugMenu_SlotMachine }, }; -__attribute__((naked)) -void InitKagayaDebugMenu_A() +u8 InitKagayaDebugMenu_A(void) { - asm( - " push {lr}\n" - " bl InitKagayaDebugMenu_B\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + InitKagayaDebugMenu_B(); + return 0; } -__attribute__((naked)) -void InitKagayaDebugMenu_B() +void InitKagayaDebugMenu_B(void) { - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xe\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._1\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xd\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x3\n" - " bl InitMenu\n" - " ldr r1, ._1 + 4\n" - " ldr r0, ._1 + 8\n" - " str r0, [r1]\n" - " add sp, sp, #0x8\n" - " pop {r0}\n" - " bx r0\n" - "._2:\n" - " .align 2, 0\n" - "._1:\n" - " .word _83EBB64\n" - " .word gMenuCallback\n" - " .word debug_sub_80B061C+1\n" - "\n" - ); + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 14, 7); + Menu_PrintItems(2, 1, 3, _83EBB64); + InitMenu(0, 1, 1, 3, 0, 13); + gMenuCallback = debug_sub_80B061C; } -__attribute__((naked)) -void debug_sub_80B061C() +u8 debug_sub_80B061C(void) { - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._3 @cond_branch\n" - " mov r0, #0x0\n" - " b ._6\n" - "._3:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._5 @cond_branch\n" - " ldr r2, ._7\n" - " ldr r0, ._7 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._6\n" - "._8:\n" - " .align 2, 0\n" - "._7:\n" - " .word gMenuCallback\n" - " .word _83EBB64\n" - "._5:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._6:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + s8 input = Menu_ProcessInput(); + + if (input == -2) + { + return 0; + } + else if (input == -1) + { + CloseMenu(); + return 1; + } + else + { + gMenuCallback = _83EBB64[input].func; + return 0; + } } -__attribute__((naked)) -u8 KagayaDebugMenu_TrainerCard() +u8 KagayaDebugMenu_TrainerCard(void) { - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._9\n" - " ldr r0, ._9 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x4\n" - " pop {r1}\n" - " bx r1\n" - "._10:\n" - " .align 2, 0\n" - "._9:\n" - " .word gMenuCallback\n" - " .word debug_sub_80B068C+1\n" - "\n" - ); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMenuCallback = debug_sub_80B068C; + return 0; } -__attribute__((naked)) -void debug_sub_80B068C() +u8 debug_sub_80B068C(void) { - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._11 @cond_branch\n" - " mov r0, #0x0\n" - " b ._12\n" - "._11:\n" - " ldr r0, ._13\n" - " bl debug_sub_80A0710\n" - " bl CloseMenu\n" - " bl ScriptContext2_Enable\n" - " mov r0, #0x1\n" - "._12:\n" - " pop {r1}\n" - " bx r1\n" - "._14:\n" - " .align 2, 0\n" - "._13:\n" - " .word sub_805469C+1\n" - "\n" - ); + if (!UpdatePaletteFade()) + { + debug_sub_80A0710(sub_805469C); + CloseMenu(); + ScriptContext2_Enable(); + return 1; + } + return 0; } -__attribute__((naked)) -u8 KagayaDebugMenu_CardToExchange() +u8 KagayaDebugMenu_CardToExchange(void) { - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._15\n" - " ldr r0, ._15 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x4\n" - " pop {r1}\n" - " bx r1\n" - "._16:\n" - " .align 2, 0\n" - "._15:\n" - " .word gMenuCallback\n" - " .word debug_sub_80B06E0+1\n" - "\n" - ); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMenuCallback = debug_sub_80B06E0; + return 0; } -__attribute__((naked)) -void debug_sub_80B06E0() +u8 debug_sub_80B06E0(void) { - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._17 @cond_branch\n" - " mov r0, #0x0\n" - " b ._18\n" - "._17:\n" - " ldr r0, ._19\n" - " bl debug_sub_80A073C\n" - " bl CloseMenu\n" - " bl ScriptContext2_Enable\n" - " mov r0, #0x1\n" - "._18:\n" - " pop {r1}\n" - " bx r1\n" - "._20:\n" - " .align 2, 0\n" - "._19:\n" - " .word sub_805469C+1\n" - "\n" - ); + if (!UpdatePaletteFade()) + { + debug_sub_80A073C(sub_805469C); + CloseMenu(); + ScriptContext2_Enable(); + return 1; + } + return 0; } -__attribute__((naked)) -u8 KagayaDebugMenu_SlotMachine() +u8 KagayaDebugMenu_SlotMachine(void) { - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._21\n" - " ldr r0, ._21 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x4\n" - " pop {r1}\n" - " bx r1\n" - "._22:\n" - " .align 2, 0\n" - "._21:\n" - " .word gMenuCallback\n" - " .word Kagaya_80B0734+1\n" - "\n" - ); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMenuCallback = Kagaya_80B0734; + return 0; } -__attribute__((naked)) -void Kagaya_80B0734() +u8 Kagaya_80B0734(void) { - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._23 @cond_branch\n" - " mov r0, #0x0\n" - " b ._24\n" - "._23:\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._25\n" - " bl debug_sub_811609C\n" - " bl CloseMenu\n" - " bl ScriptContext2_Enable\n" - " mov r0, #0x1\n" - "._24:\n" - " pop {r1}\n" - " bx r1\n" - "._26:\n" - " .align 2, 0\n" - "._25:\n" - " .word sub_805469C+1\n" - "\n" - ); + if (!UpdatePaletteFade()) + { + debug_sub_811609C(Random() % 6, sub_805469C); + CloseMenu(); + ScriptContext2_Enable(); + return 1; + } + return 0; } -__attribute__((naked)) -void debug_sub_80B0770() +u8 debug_sub_80B0770(void) { - asm( - " push {r4, lr}\n" - " ldr r0, ._30\n" - " ldrb r1, [r0]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0\n" - " bne ._27 @cond_branch\n" - " bl CloseMenu\n" - " bl IsPlayerFacingSurfableFishableWater\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._29 @cond_branch\n" - " ldr r0, ._30 + 4\n" - " str r4, [r0]\n" - " mov r0, #0x9\n" - " bl FieldEffectStart\n" - " b ._29\n" - "._31:\n" - " .align 2, 0\n" - "._30:\n" - " .word gPlayerAvatar\n" - " .word gFieldEffectArguments\n" - "._27:\n" - " bl CloseMenu\n" - "._29:\n" - " mov r0, #0x1\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + if (!(gPlayerAvatar.flags & 8)) + { + CloseMenu(); + if (IsPlayerFacingSurfableFishableWater()) + { + gFieldEffectArguments[0] = 0; + FieldEffectStart(9); + } + } + else + { + CloseMenu(); + } + return 1; } -__attribute__((naked)) -void debug_sub_80B07B0() +u8 debug_sub_80B07B0(void) { - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._32\n" - " ldr r0, ._32 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x4\n" - " pop {r1}\n" - " bx r1\n" - "._33:\n" - " .align 2, 0\n" - "._32:\n" - " .word gMenuCallback\n" - " .word debug_sub_80B07DC+1\n" - "\n" - ); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMenuCallback = debug_sub_80B07DC; + return 0; } -__attribute__((naked)) -void debug_sub_80B07DC() +u8 debug_sub_80B07DC(void) { - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._34 @cond_branch\n" - " mov r0, #0x0\n" - " b ._35\n" - "._34:\n" - " bl CloseMenu\n" - " ldr r0, ._36\n" - " bl SetMainCallback2\n" - " mov r0, #0x1\n" - "._35:\n" - " pop {r1}\n" - " bx r1\n" - "._37:\n" - " .align 2, 0\n" - "._36:\n" - " .word CB2_InitFlyRegionMap+1\n" - "\n" - ); + if (!UpdatePaletteFade()) + { + CloseMenu(); + SetMainCallback2(CB2_InitFlyRegionMap); + return 1; + } + return 0; } -__attribute__((naked)) -void debug_sub_80B0800() +u8 debug_sub_80B0800(void) { - asm( - " push {lr}\n" - " bl CloseMenu\n" - " bl sub_8068F18\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0\n" - " beq ._38 @cond_branch\n" - " ldr r0, ._39\n" - " mov r1, #0x0\n" - " str r1, [r0]\n" - " sub r1, r2, #1\n" - " str r1, [r0, #0x4]\n" - " mov r0, #0x2c\n" - " bl FieldEffectStart\n" - "._38:\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._40:\n" - " .align 2, 0\n" - "._39:\n" - " .word gFieldEffectArguments\n" - "\n" - ); + u8 r2; + + CloseMenu(); + r2 = sub_8068F18(); + if (r2 != 0) + { + gFieldEffectArguments[0] = 0; + gFieldEffectArguments[1] = r2 - 1; + FieldEffectStart(0x2C); + } + return 1; } #endif // DEBUG diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 99770f6e3..0d4ebe3f0 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -242,57 +242,21 @@ static const u8 gUnknown_083ECE3A[]; static const u16 gUnknown_083ECE42[]; static const u16 gUnknown_083ECE48[]; -#if DEBUG -__attribute__((naked)) -void PlaySlotMachine(u8 arg0, MainCallback cb) -{ - asm("\ - push {lr}\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r3, ._1\n\ - mov r2, #0x0\n\ - strb r2, [r3]\n\ - bl PlaySlotMachine_Internal\n\ - ldr r0, ._1 + 4\n\ - bl SetMainCallback2\n\ - pop {r0}\n\ - bx r0\n\ -._2:\n\ - .align 2, 0\n\ -._1:\n\ - .word unk_debug_bss_1_1\n\ - .word CB2_SlotMachineSetup+1"); -} -#else void PlaySlotMachine(u8 arg0, MainCallback cb) { +#if DEBUG + unk_debug_bss_1_1 = 0; +#endif PlaySlotMachine_Internal(arg0, cb); SetMainCallback2(CB2_SlotMachineSetup); } -#endif #if DEBUG -__attribute__((naked)) -void debug_sub_811609C() +void debug_sub_811609C(u8 a, void (*func)(void)) { - asm("\ - push {lr}\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r3, ._3\n\ - mov r2, #0x1\n\ - strb r2, [r3]\n\ - bl PlaySlotMachine_Internal\n\ - ldr r0, ._3 + 4\n\ - bl SetMainCallback2\n\ - pop {r0}\n\ - bx r0\n\ -._4:\n\ - .align 2, 0\n\ -._3:\n\ - .word unk_debug_bss_1_1\n\ - .word CB2_SlotMachineSetup+1"); + unk_debug_bss_1_1 = 1; + PlaySlotMachine_Internal(a, func); + SetMainCallback2(CB2_SlotMachineSetup); } #endif -- cgit v1.2.3 From 8cfc82726a0712e8c86d30294cee6506c1f0dc97 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 23 Jan 2018 22:36:44 -0600 Subject: move undecompiled debug menu code to asm --- src/debug/kagaya_debug_menu.c | 2 +- src/debug/nakamura_debug_menu.c | 4859 +------------------ src/debug/nohara_debug_menu.c | 2310 +-------- src/debug/taya_debug_window.c | 2116 -------- src/debug/tomomichi_debug_menu.c | 8635 --------------------------------- src/debug/unk_debug_menu_3.c | 804 ---- src/debug/watanabe_debug_menu.c | 9838 -------------------------------------- 7 files changed, 7 insertions(+), 28557 deletions(-) delete mode 100644 src/debug/unk_debug_menu_3.c (limited to 'src') diff --git a/src/debug/kagaya_debug_menu.c b/src/debug/kagaya_debug_menu.c index 89df82f04..3cb36ce0c 100644 --- a/src/debug/kagaya_debug_menu.c +++ b/src/debug/kagaya_debug_menu.c @@ -168,7 +168,7 @@ u8 debug_sub_80B07DC(void) u8 debug_sub_80B0800(void) { u8 r2; - + CloseMenu(); r2 = sub_8068F18(); if (r2 != 0) diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c index 328903126..b8c4ed73e 100644 --- a/src/debug/nakamura_debug_menu.c +++ b/src/debug/nakamura_debug_menu.c @@ -16,6 +16,9 @@ EWRAM_DATA u16 _nakamuraDataC = 0; __attribute__((unused)) static u8 _nakamuraStatic0[0x18]; __attribute__((unused)) static u8 _nakamuraStatic18; +asm(".global _nakamuraStatic0"); +asm(".global _nakamuraStatic18"); + u8 debug_sub_815FC54(); u8 debug_sub_815F2B4(); u8 debug_sub_815FC94(); @@ -182,4860 +185,4 @@ const u8 Str_843E655[] = _("かい"); const u8 Str_843E658[] = _("0"); const u8 Str_843E65A[] = _("はんい"); -__attribute__((naked)) -void debug_sub_815F1B8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0xe\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._1\n" - " mov r0, #0x10\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xe\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0xf\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " add sp, sp, #0x8\n" - " pop {r0}\n" - " bx r0\n" - "._2:\n" - " .align 2, 0\n" - "._1:\n" - " .word _843E3DC\n" - "\n" - ); -} - -__attribute__((naked)) -void InitNakamuraDebugMenu() -{ - asm( - " push {lr}\n" - " bl debug_sub_815F1B8\n" - " ldr r1, ._3\n" - " ldr r0, ._3 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._4:\n" - " .align 2, 0\n" - "._3:\n" - " .word gMenuCallback\n" - " .word debug_sub_815F214+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F214() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._9\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._5 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " bl Menu_MoveCursor\n" - "._5:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._6 @cond_branch\n" - " mov r0, #0x1\n" - " bl Menu_MoveCursor\n" - "._6:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._7 @cond_branch\n" - " ldr r4, ._9 + 4\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x15\n" - " add r4, r4, #0x4\n" - " add r0, r0, r4\n" - " ldr r4, [r0]\n" - " bl Menu_DestroyCursor\n" - " bl _call_via_r4\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " b ._12\n" - "._10:\n" - " .align 2, 0\n" - "._9:\n" - " .word gMain\n" - " .word _843E3DC\n" - "._7:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._11 @cond_branch\n" - " mov r0, #0x0\n" - " b ._12\n" - "._11:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._12:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F284() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r0, ._14\n" - " ldrb r1, [r0, #0x7]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._13 @cond_branch\n" - " bl debug_sub_81381B4\n" - " mov r0, #0x5\n" - " mov r1, #0x0\n" - " bl OpenPartyMenu\n" - " add r0, r4, #0\n" - " bl DestroyTask\n" - "._13:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._15:\n" - " .align 2, 0\n" - "._14:\n" - " .word gPaletteFade\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_815F2B4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " bl CloseMenu\n" - " bl Menu_EraseScreen\n" - " ldr r1, ._16\n" - " ldr r0, ._16 + 4\n" - " str r0, [r1, #0x8]\n" - " ldr r0, ._16 + 8\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " mov r0, #0x1\n" - " add sp, sp, #0x4\n" - " pop {r1}\n" - " bx r1\n" - "._17:\n" - " .align 2, 0\n" - "._16:\n" - " .word gMain\n" - " .word sub_805469C+1\n" - " .word debug_sub_815F284+1\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_815F2F4() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " bl CloseMenu\n" - " mov r7, #0x1\n" - "._34:\n" - " lsl r1, r7, #0x2\n" - " add r0, r1, r7\n" - " lsl r2, r0, #0x5\n" - " ldr r3, ._24\n" - " add r0, r2, r3\n" - " ldr r5, ._24 + 4\n" - " add r0, r0, r5\n" - " ldrb r0, [r0]\n" - " mov r9, r1\n" - " add r1, r7, #1\n" - " str r1, [sp]\n" - " cmp r0, #0\n" - " beq ._18 @cond_branch\n" - " b ._19\n" - "._18:\n" - " mov r5, #0x0\n" - " ldr r6, ._24 + 8\n" - " add r4, r7, #0\n" - " sub r4, r4, #0x46\n" - " ldr r3, ._24 + 12\n" - "._21:\n" - " add r1, r5, r2\n" - " add r1, r1, r3\n" - " add r0, r5, r6\n" - " ldrb r0, [r0]\n" - " strb r0, [r1]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0xff\n" - " beq ._20 @cond_branch\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x6\n" - " bls ._21 @cond_branch\n" - "._20:\n" - " cmp r5, #0x7\n" - " bne ._22 @cond_branch\n" - " add r0, r2, #6\n" - " b ._23\n" - "._25:\n" - " .align 2, 0\n" - "._24:\n" - " .word gSaveBlock1\n" - " .word 0x1a08\n" - " .word gSaveBlock2\n" - " .word gSaveBlock1+0x1a0a\n" - "._22:\n" - " add r0, r5, r2\n" - "._23:\n" - " add r0, r0, r3\n" - " strb r4, [r0]\n" - " ldr r1, ._35\n" - " ldr r2, ._35 + 4\n" - " add r2, r2, r1\n" - " mov sl, r2\n" - " mov r3, r9\n" - " add r0, r3, r7\n" - " lsl r6, r0, #0x5\n" - " add r1, r6, r1\n" - " ldr r5, ._35 + 4\n" - " add r5, r5, r1\n" - " mov r8, r5\n" - "._30:\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0x4b\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0xe\n" - " ldr r1, ._35 + 8\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " mov r2, r8\n" - " strb r0, [r2]\n" - " mov r5, #0x0\n" - " cmp r5, r7\n" - " bcs ._28 @cond_branch\n" - " mov r3, sl\n" - " ldrb r3, [r3]\n" - " cmp r0, r3\n" - " beq ._28 @cond_branch\n" - " ldr r4, ._35\n" - " add r0, r6, r4\n" - " ldr r2, ._35 + 4\n" - " add r3, r0, r2\n" - "._29:\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r7\n" - " bcs ._28 @cond_branch\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r4\n" - " add r0, r0, r2\n" - " ldrb r1, [r3]\n" - " ldrb r0, [r0]\n" - " cmp r1, r0\n" - " bne ._29 @cond_branch\n" - "._28:\n" - " cmp r5, r7\n" - " bne ._30 @cond_branch\n" - " bl Random\n" - " mov r5, r9\n" - " add r4, r5, r7\n" - " lsl r4, r4, #0x5\n" - " ldr r1, ._35\n" - " add r3, r4, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0x1\n" - " ldr r2, ._35 + 12\n" - " add r3, r3, r2\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x4\n" - " ldrb r1, [r3]\n" - " mov r5, #0x11\n" - " neg r5, r5\n" - " add r2, r5, #0\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strb r1, [r3]\n" - " mov r5, #0x0\n" - " ldr r6, ._35 + 16\n" - "._31:\n" - " bl Random\n" - " add r1, r5, r4\n" - " add r1, r1, r6\n" - " strb r0, [r1]\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x3\n" - " bls ._31 @cond_branch\n" - " mov r5, #0x0\n" - " mov r1, r9\n" - " add r0, r1, r7\n" - " lsl r4, r0, #0x5\n" - " ldr r3, ._35 + 20\n" - " mov r2, #0x0\n" - " add r6, r3, #0\n" - " add r6, r6, #0x10\n" - "._32:\n" - " add r1, r5, r4\n" - " add r0, r1, r3\n" - " strb r2, [r0]\n" - " add r1, r1, r6\n" - " strb r2, [r1]\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0xf\n" - " bls ._32 @cond_branch\n" - " add r0, r7, #0\n" - " bl unref_sub_80BCD7C\n" - "._19:\n" - " ldr r2, [sp]\n" - " lsl r0, r2, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r7, #0x13\n" - " bhi ._33 @cond_branch\n" - " b ._34\n" - "._33:\n" - " mov r0, #0x1\n" - " add sp, sp, #0x4\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._36:\n" - " .align 2, 0\n" - "._35:\n" - " .word gSaveBlock1\n" - " .word 0x1a08\n" - " .word _843E424\n" - " .word 0x1a09\n" - " .word gSaveBlock1+0x1a11\n" - " .word gSaveBlock1+0x1a1a\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F470() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add r6, r0, #0\n" - " add r7, r1, #0\n" - " mov ip, r2\n" - " ldr r2, ._39\n" - " ldr r0, ._39 + 4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r2\n" - " ldr r1, ._39 + 8\n" - " add r0, r0, r1\n" - " ldrb r4, [r0]\n" - " mov r2, #0x0\n" - " ldr r3, ._39 + 12\n" - " add r5, r3, #0\n" - "._41:\n" - " lsl r1, r2, #0x2\n" - " add r0, r1, r5\n" - " ldrb r0, [r0]\n" - " cmp r0, r4\n" - " bne ._37 @cond_branch\n" - " add r0, r1, #1\n" - " add r0, r0, r3\n" - " ldrb r0, [r0]\n" - " strb r0, [r6]\n" - " add r0, r1, #2\n" - " add r0, r0, r3\n" - " ldrb r0, [r0]\n" - " strb r0, [r7]\n" - " add r0, r1, #3\n" - " add r0, r0, r3\n" - " ldrb r0, [r0]\n" - " mov r1, ip\n" - " strb r0, [r1]\n" - " b ._38\n" - "._40:\n" - " .align 2, 0\n" - "._39:\n" - " .word gSaveBlock1\n" - " .word _nakamuraData0\n" - " .word 0x1a08\n" - " .word _843E424\n" - "._37:\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x4a\n" - " bls ._41 @cond_branch\n" - "._38:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F4D8() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0xa\n" - " mov r3, #0xa\n" - " bl Menu_BlankWindowRect\n" - " ldr r6, ._43\n" - " ldr r7, ._43 + 4\n" - " ldrb r1, [r7]\n" - " add r0, r6, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r2, ._43 + 8\n" - " ldrb r1, [r7]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r2\n" - " ldr r1, ._43 + 12\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._42 @cond_branch\n" - " mov r4, sp\n" - " add r4, r4, #0x1\n" - " mov r5, sp\n" - " add r5, r5, #0x2\n" - " mov r0, sp\n" - " add r1, r4, #0\n" - " add r2, r5, #0\n" - " bl debug_sub_815F470\n" - " ldrb r1, [r7]\n" - " add r0, r6, #0\n" - " bl sub_80BC190\n" - " add r0, r6, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r0, ._43 + 16\n" - " mov r1, #0x1\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, sp\n" - " ldrb r1, [r0]\n" - " add r0, r6, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " ldr r0, ._43 + 20\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldrb r1, [r4]\n" - " add r0, r6, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0x3\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r0, ._43 + 24\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " ldrb r1, [r5]\n" - " add r0, r6, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0x3\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - "._42:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._44:\n" - " .align 2, 0\n" - "._43:\n" - " .word gStringVar1\n" - " .word _nakamuraData0\n" - " .word gSaveBlock1\n" - " .word 0x1a08\n" - " .word Str_843E550\n" - " .word Str_843E552\n" - " .word Str_843E554\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F5C4() -{ - asm( - " push {lr}\n" - " ldr r0, ._48\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r2, r0, #0x10\n" - " cmp r2, #0\n" - " beq ._45 @cond_branch\n" - " ldr r1, ._48 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._46 @cond_branch\n" - " mov r0, #0x13\n" - " b ._50\n" - "._49:\n" - " .align 2, 0\n" - "._48:\n" - " .word gMain\n" - " .word _nakamuraData0\n" - "._46:\n" - " sub r0, r0, #0x1\n" - " b ._50\n" - "._45:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._51 @cond_branch\n" - " ldr r1, ._54\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x13\n" - " bne ._52 @cond_branch\n" - " strb r2, [r1]\n" - " b ._53\n" - "._55:\n" - " .align 2, 0\n" - "._54:\n" - " .word _nakamuraData0\n" - "._52:\n" - " add r0, r0, #0x1\n" - "._50:\n" - " strb r0, [r1]\n" - "._53:\n" - " bl debug_sub_815F4D8\n" - " mov r0, #0x0\n" - " b ._58\n" - "._51:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._57 @cond_branch\n" - " mov r0, #0x0\n" - " b ._58\n" - "._57:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._58:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_815F62C() -{ - asm( - " push {lr}\n" - " ldr r1, ._59\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " ldr r1, ._59 + 4\n" - " ldr r0, ._59 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xb\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " bl debug_sub_815F4D8\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._60:\n" - " .align 2, 0\n" - "._59:\n" - " .word _nakamuraData0\n" - " .word gMenuCallback\n" - " .word debug_sub_815F5C4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F668() -{ - asm( - " push {r4, r5, r6, lr}\n" - " ldr r0, ._61\n" - " ldrb r0, [r0]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x5\n" - " ldr r0, ._61 + 4\n" - " add r1, r1, r0\n" - " ldrb r4, [r1, #0x3]\n" - " lsl r4, r4, #0x18\n" - " ldrb r0, [r1, #0x2]\n" - " lsl r0, r0, #0x10\n" - " orr r4, r4, r0\n" - " ldrb r0, [r1, #0x1]\n" - " lsl r0, r0, #0x8\n" - " orr r4, r4, r0\n" - " ldrb r0, [r1]\n" - " orr r4, r4, r0\n" - " ldr r5, ._61 + 8\n" - " ldr r6, ._61 + 12\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " add r0, r5, #0\n" - " mov r2, #0x2\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r5, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " bl __umodsi3\n" - " add r1, r0, #0\n" - " add r0, r5, #0\n" - " mov r2, #0x2\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r5, #0\n" - " mov r1, #0x7\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._62:\n" - " .align 2, 0\n" - "._61:\n" - " .word _nakamuraData0\n" - " .word gSaveBlock1+0x1a11\n" - " .word gStringVar1\n" - " .word 0x186a0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F6E4() -{ - asm( - " push {r4, lr}\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " mov r2, #0xb\n" - " mov r3, #0x4\n" - " bl Menu_BlankWindowRect\n" - " ldr r4, ._63\n" - " ldr r0, ._63 + 4\n" - " ldrb r0, [r0]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x5\n" - " ldr r0, ._63 + 8\n" - " add r1, r1, r0\n" - " add r0, r4, #0\n" - " mov r2, #0x7\n" - " bl StringCopyN\n" - " mov r1, #0xff\n" - " strb r1, [r0]\n" - " add r0, r4, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._64:\n" - " .align 2, 0\n" - "._63:\n" - " .word gStringVar1\n" - " .word _nakamuraData0\n" - " .word gSaveBlock1+0x1a0a\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F72C() -{ - asm( - " push {r4, r5, lr}\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0xb\n" - " mov r3, #0xa\n" - " bl Menu_BlankWindowRect\n" - " ldr r4, ._66\n" - " ldr r5, ._66 + 4\n" - " ldrb r1, [r5]\n" - " add r0, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r2, ._66 + 8\n" - " ldrb r1, [r5]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r2\n" - " ldr r1, ._66 + 12\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._65 @cond_branch\n" - " bl debug_sub_815F6E4\n" - " bl debug_sub_815F668\n" - "._65:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._67:\n" - " .align 2, 0\n" - "._66:\n" - " .word gStringVar1\n" - " .word _nakamuraData0\n" - " .word gSaveBlock1\n" - " .word 0x1a08\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F788() -{ - asm( - " push {lr}\n" - " mov r0, #0x2\n" - " mov r1, #0x5\n" - " mov r2, #0xb\n" - " mov r3, #0x6\n" - " bl Menu_BlankWindowRect\n" - " ldr r0, ._68\n" - " ldr r1, ._68 + 4\n" - " ldrb r1, [r1]\n" - " add r1, r1, #0x2\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " pop {r0}\n" - " bx r0\n" - "._69:\n" - " .align 2, 0\n" - "._68:\n" - " .word Str_843E574\n" - " .word _nakamuraData2\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F7B4() -{ - asm( - " push {lr}\n" - " ldr r0, ._72\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._70 @cond_branch\n" - " mov r0, #0xb\n" - " mov r1, #0x1\n" - " mov r2, #0xb\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " b ._71\n" - "._73:\n" - " .align 2, 0\n" - "._72:\n" - " .word _nakamuraData1\n" - "._70:\n" - " ldr r0, ._74\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x1\n" - " ldr r1, ._74 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xb\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - "._71:\n" - " pop {r0}\n" - " bx r0\n" - "._75:\n" - " .align 2, 0\n" - "._74:\n" - " .word _nakamuraData3\n" - " .word Str_843E576\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F7F0() -{ - asm( - " push {r4, r5, lr}\n" - " ldr r1, ._78\n" - " ldrb r2, [r1]\n" - " lsl r1, r2, #0x2\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x5\n" - " ldr r2, ._78 + 4\n" - " add r3, r1, r2\n" - " ldrb r1, [r3, #0x3]\n" - " lsl r2, r1, #0x18\n" - " ldrb r1, [r3, #0x2]\n" - " lsl r1, r1, #0x10\n" - " orr r2, r2, r1\n" - " ldrb r1, [r3, #0x1]\n" - " lsl r1, r1, #0x8\n" - " orr r2, r2, r1\n" - " ldrb r1, [r3]\n" - " orr r2, r2, r1\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r4, #0x9\n" - " ldr r0, ._78 + 8\n" - " ldrb r0, [r0]\n" - " cmp r4, r0\n" - " ble ._76 @cond_branch\n" - " add r5, r0, #0\n" - "._77:\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r1, r0, #0x1\n" - " lsl r0, r4, #0x18\n" - " mov r4, #0xff\n" - " lsl r4, r4, #0x18\n" - " add r0, r0, r4\n" - " lsr r4, r0, #0x18\n" - " asr r0, r0, #0x18\n" - " cmp r0, r5\n" - " bgt ._77 @cond_branch\n" - "._76:\n" - " add r2, r2, r1\n" - " lsr r0, r2, #0x18\n" - " strb r0, [r3, #0x3]\n" - " mov r0, #0xff\n" - " lsl r0, r0, #0x10\n" - " and r0, r0, r2\n" - " lsr r0, r0, #0x10\n" - " strb r0, [r3, #0x2]\n" - " mov r0, #0xff\n" - " lsl r0, r0, #0x8\n" - " and r0, r0, r2\n" - " lsr r0, r0, #0x8\n" - " strb r0, [r3, #0x1]\n" - " strb r2, [r3]\n" - " bl debug_sub_815F668\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._79:\n" - " .align 2, 0\n" - "._78:\n" - " .word _nakamuraData0\n" - " .word gSaveBlock1+0x1a11\n" - " .word _nakamuraData2\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F86C() -{ - asm( - " push {r4, r5, r6, lr}\n" - " lsl r0, r0, #0x18\n" - " ldr r1, ._84\n" - " ldrb r2, [r1]\n" - " lsl r1, r2, #0x2\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x5\n" - " ldr r2, ._84 + 4\n" - " add r5, r1, r2\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " lsr r6, r0, #0x18\n" - " asr r0, r0, #0x18\n" - " cmp r0, #0x64\n" - " bne ._80 @cond_branch\n" - " ldr r0, ._84 + 8\n" - " ldrb r1, [r0]\n" - " cmp r1, #0x6\n" - " bhi ._100 @cond_branch\n" - " mov r2, #0xff\n" - "._82:\n" - " add r0, r5, r1\n" - " strb r2, [r0]\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " cmp r1, #0x6\n" - " bls ._82 @cond_branch\n" - " b ._100\n" - "._85:\n" - " .align 2, 0\n" - "._84:\n" - " .word _nakamuraData0\n" - " .word gSaveBlock1+0x1a0a\n" - " .word _nakamuraData2\n" - "._80:\n" - " ldr r0, ._87\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x4\n" - " bhi ._98 @cond_branch\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._87 + 4\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._88:\n" - " .align 2, 0\n" - "._87:\n" - " .word _nakamuraData3\n" - " .word ._89\n" - "._89:\n" - " .word ._90\n" - " .word ._91\n" - " .word ._92\n" - " .word ._93\n" - " .word ._94\n" - "._90:\n" - " mov r3, #0x1\n" - " mov r2, #0x50\n" - " b ._98\n" - "._91:\n" - " mov r3, #0x51\n" - " mov r2, #0xa0\n" - " b ._98\n" - "._92:\n" - " mov r3, #0xbb\n" - " mov r2, #0xd4\n" - " b ._98\n" - "._93:\n" - " mov r3, #0xd5\n" - " mov r2, #0xee\n" - " b ._98\n" - "._94:\n" - " mov r3, #0xa1\n" - " mov r2, #0xaa\n" - "._98:\n" - " ldr r4, ._101\n" - " ldrb r1, [r4]\n" - " add r1, r5, r1\n" - " ldrb r0, [r1]\n" - " add r0, r0, r6\n" - " strb r0, [r1]\n" - " ldrb r0, [r4]\n" - " add r1, r5, r0\n" - " ldrb r0, [r1]\n" - " cmp r0, r3\n" - " bcs ._99 @cond_branch\n" - " strb r2, [r1]\n" - "._99:\n" - " ldrb r0, [r4]\n" - " add r1, r5, r0\n" - " ldrb r0, [r1]\n" - " cmp r0, r2\n" - " bls ._100 @cond_branch\n" - " strb r3, [r1]\n" - "._100:\n" - " bl debug_sub_815F6E4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._102:\n" - " .align 2, 0\n" - "._101:\n" - " .word _nakamuraData2\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815F930() -{ - asm( - " push {r4, r5, lr}\n" - " ldr r0, ._107\n" - " ldrb r2, [r0]\n" - " mov r4, #0xa\n" - " cmp r2, #0\n" - " bne ._103 @cond_branch\n" - " mov r4, #0x7\n" - "._103:\n" - " ldr r5, ._107 + 4\n" - " ldrh r1, [r5, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._104 @cond_branch\n" - " cmp r2, #0\n" - " beq ._105 @cond_branch\n" - " mov r0, #0x1\n" - " bl debug_sub_815F7F0\n" - " b ._136\n" - "._108:\n" - " .align 2, 0\n" - "._107:\n" - " .word _nakamuraData1\n" - " .word gMain\n" - "._105:\n" - " mov r0, #0x1\n" - " b ._113\n" - "._104:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._110 @cond_branch\n" - " cmp r2, #0\n" - " beq ._111 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " bl debug_sub_815F7F0\n" - " b ._136\n" - "._111:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " b ._113\n" - "._110:\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r3, r0, #0x10\n" - " cmp r3, #0\n" - " beq ._114 @cond_branch\n" - " ldr r1, ._117\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._115 @cond_branch\n" - " sub r0, r4, #1\n" - " b ._116\n" - "._118:\n" - " .align 2, 0\n" - "._117:\n" - " .word _nakamuraData2\n" - "._115:\n" - " sub r0, r0, #0x1\n" - "._116:\n" - " strb r0, [r1]\n" - "._125:\n" - " bl debug_sub_815F788\n" - " b ._136\n" - "._114:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._120 @cond_branch\n" - " ldr r2, ._123\n" - " ldrb r1, [r2]\n" - " sub r0, r4, #1\n" - " cmp r1, r0\n" - " bne ._121 @cond_branch\n" - " strb r3, [r2]\n" - " b ._125\n" - "._124:\n" - " .align 2, 0\n" - "._123:\n" - " .word _nakamuraData2\n" - "._121:\n" - " add r0, r1, #1\n" - " strb r0, [r2]\n" - " b ._125\n" - "._120:\n" - " ldrh r1, [r5, #0x2e]\n" - " mov r0, #0x4\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._126 @cond_branch\n" - " cmp r2, #0\n" - " bne ._127 @cond_branch\n" - " ldr r4, ._129\n" - " ldrb r0, [r4]\n" - " add r0, r0, #0x1\n" - " mov r1, #0x5\n" - " bl __modsi3\n" - " strb r0, [r4]\n" - "._127:\n" - " bl debug_sub_815F7B4\n" - " b ._136\n" - "._130:\n" - " .align 2, 0\n" - "._129:\n" - " .word _nakamuraData3\n" - "._126:\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._131 @cond_branch\n" - " mov r0, #0x2\n" - " mov r1, #0x5\n" - " mov r2, #0xb\n" - " mov r3, #0x6\n" - " bl Menu_BlankWindowRect\n" - " mov r0, #0xb\n" - " mov r1, #0x1\n" - " mov r2, #0xb\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " ldr r1, ._133\n" - " ldr r0, ._133 + 4\n" - " str r0, [r1]\n" - " b ._136\n" - "._134:\n" - " .align 2, 0\n" - "._133:\n" - " .word gMenuCallback\n" - " .word debug_sub_815FA38+1\n" - "._131:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._136 @cond_branch\n" - " cmp r2, #0\n" - " bne ._136 @cond_branch\n" - " mov r0, #0x64\n" - "._113:\n" - " bl debug_sub_815F86C\n" - "._136:\n" - " mov r0, #0x0\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815FA38() -{ - asm( - " push {r4, lr}\n" - " ldr r0, ._139\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._137 @cond_branch\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " b ._138\n" - "._140:\n" - " .align 2, 0\n" - "._139:\n" - " .word gMain\n" - "._137:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._141 @cond_branch\n" - " mov r0, #0x2\n" - "._138:\n" - " bl Menu_MoveCursor\n" - "._161:\n" - " mov r0, #0x0\n" - " b ._142\n" - "._141:\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r2, r0, #0x10\n" - " cmp r2, #0\n" - " beq ._143 @cond_branch\n" - " ldr r1, ._146\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._144 @cond_branch\n" - " mov r0, #0x13\n" - " b ._148\n" - "._147:\n" - " .align 2, 0\n" - "._146:\n" - " .word _nakamuraData0\n" - "._144:\n" - " sub r0, r0, #0x1\n" - " b ._148\n" - "._143:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " cmp r4, #0\n" - " beq ._149 @cond_branch\n" - " ldr r1, ._152\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x13\n" - " bne ._150 @cond_branch\n" - " strb r2, [r1]\n" - " b ._151\n" - "._153:\n" - " .align 2, 0\n" - "._152:\n" - " .word _nakamuraData0\n" - "._150:\n" - " add r0, r0, #0x1\n" - "._148:\n" - " strb r0, [r1]\n" - "._151:\n" - " bl debug_sub_815F72C\n" - " b ._161\n" - "._149:\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._155 @cond_branch\n" - " ldr r1, ._159\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._161 @cond_branch\n" - " ldr r2, ._159 + 4\n" - " add r1, r0, #0\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r2\n" - " ldr r1, ._159 + 8\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._161 @cond_branch\n" - " bl Menu_GetCursorPos\n" - " ldr r1, ._159 + 12\n" - " strb r0, [r1]\n" - " ldr r0, ._159 + 16\n" - " strb r4, [r0]\n" - " bl debug_sub_815F788\n" - " bl debug_sub_815F7B4\n" - " ldr r1, ._159 + 20\n" - " ldr r0, ._159 + 24\n" - " str r0, [r1]\n" - " b ._161\n" - "._160:\n" - " .align 2, 0\n" - "._159:\n" - " .word _nakamuraData0\n" - " .word gSaveBlock1\n" - " .word 0x1a08\n" - " .word _nakamuraData1\n" - " .word _nakamuraData2\n" - " .word gMenuCallback\n" - " .word debug_sub_815F930+1\n" - "._155:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._161 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._142:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_815FB1C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " ldr r0, ._162\n" - " mov r1, #0x0\n" - " strb r1, [r0]\n" - " ldr r0, ._162 + 4\n" - " strb r1, [r0]\n" - " ldr r1, ._162 + 8\n" - " ldr r0, ._162 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xc\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " bl debug_sub_815F72C\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xb\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x3\n" - " bl InitMenu\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._163:\n" - " .align 2, 0\n" - "._162:\n" - " .word _nakamuraData0\n" - " .word _nakamuraData3\n" - " .word gMenuCallback\n" - " .word debug_sub_815FA38+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815FB78() -{ - asm( - " push {lr}\n" - " ldr r0, ._166\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._164 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " b ._165\n" - "._167:\n" - " .align 2, 0\n" - "._166:\n" - " .word gMain\n" - "._164:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._168 @cond_branch\n" - " mov r0, #0x1\n" - "._165:\n" - " bl Menu_MoveCursor\n" - " mov r0, #0x0\n" - " b ._177\n" - "._168:\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._170 @cond_branch\n" - " bl CloseMenu\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._171 @cond_branch\n" - " cmp r0, #0x1\n" - " beq ._172 @cond_branch\n" - " b ._175\n" - "._171:\n" - " bl debug_sub_814A714\n" - " b ._175\n" - "._172:\n" - " bl ClearRoamerData\n" - " bl ClearRoamerLocationData\n" - " b ._175\n" - "._170:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._176 @cond_branch\n" - " mov r0, #0x0\n" - " b ._177\n" - "._176:\n" - " bl CloseMenu\n" - "._175:\n" - " mov r0, #0x1\n" - "._177:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_815FBE8() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " ldr r1, ._178\n" - " ldr r0, ._178 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " ldr r4, ._178 + 8\n" - " add r0, r4, #0\n" - " bl debug_sub_814A73C\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xb\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, r4, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._178 + 12\n" - " mov r1, #0x2\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xa\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x3\n" - " bl InitMenu\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._179:\n" - " .align 2, 0\n" - "._178:\n" - " .word gMenuCallback\n" - " .word debug_sub_815FB78+1\n" - " .word gStringVar1\n" - " .word Str_843E580\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_815FC54() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r3, #0x0\n" - " ldr r7, ._181\n" - " mov r6, #0xe8\n" - " lsl r6, r6, #0x3\n" - " ldr r5, ._181 + 4\n" - " ldr r4, ._181 + 8\n" - "._180:\n" - " lsl r1, r3, #0x2\n" - " add r1, r1, r7\n" - " add r2, r3, #0\n" - " add r2, r2, #0x85\n" - " add r0, r1, r6\n" - " strh r2, [r0]\n" - " add r1, r1, r4\n" - " strh r5, [r1]\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r3, r0, #0x10\n" - " cmp r3, #0x2a\n" - " bls ._180 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._182:\n" - " .align 2, 0\n" - "._181:\n" - " .word gSaveBlock1\n" - " .word 0x3e7\n" - " .word 0x742\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_815FC94() -{ - asm( - " push {lr}\n" - " bl ClearDecorationInventories\n" - " bl debug_sub_814A3A8\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815FCB4() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " mov r7, #0x0\n" - " ldr r5, ._188\n" - " ldr r0, [r5]\n" - " ldr r0, [r0, #0x4]\n" - " mov r1, #0x3\n" - " bl __divsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " add r1, r0, #0\n" - " mul r1, r1, r4\n" - " lsl r1, r1, #0x10\n" - " lsr r6, r1, #0x10\n" - " add r0, r6, r0\n" - " mov r9, r5\n" - " cmp r6, r0\n" - " bge ._183 @cond_branch\n" - " mov r8, r0\n" - "._187:\n" - " mov r4, #0x0\n" - " mov r1, r9\n" - " ldr r0, [r1]\n" - " ldr r0, [r0]\n" - " add r5, r6, #1\n" - " cmp r4, r0\n" - " bge ._184 @cond_branch\n" - " ldr r0, ._188\n" - " mov r9, r0\n" - "._186:\n" - " add r0, r4, #7\n" - " add r1, r6, #7\n" - " bl MapGridGetMetatileBehaviorAt\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl sub_805759C\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._185 @cond_branch\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r7, r0, #0x10\n" - "._185:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " ldr r0, ._188\n" - " ldr r0, [r0]\n" - " ldr r0, [r0]\n" - " cmp r4, r0\n" - " blt ._186 @cond_branch\n" - "._184:\n" - " lsl r0, r5, #0x10\n" - " lsr r6, r0, #0x10\n" - " cmp r6, r8\n" - " blt ._187 @cond_branch\n" - "._183:\n" - " add r0, r7, #0\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._189:\n" - " .align 2, 0\n" - "._188:\n" - " .word gMapHeader\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815FD40() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r6, #0x0\n" - " mov r4, sp\n" - " add r4, r4, #0x2\n" - " mov r0, sp\n" - " add r1, r4, #0\n" - " bl GetXYCoordsOneStepInFrontOfPlayer\n" - " mov r1, sp\n" - " mov r0, sp\n" - " ldrh r0, [r0]\n" - " sub r0, r0, #0x7\n" - " strh r0, [r1]\n" - " ldrh r0, [r4]\n" - " sub r0, r0, #0x7\n" - " strh r0, [r4]\n" - " mov r5, #0x0\n" - " ldr r1, ._192\n" - " ldr r0, [r1]\n" - " ldr r0, [r0, #0x4]\n" - " add r7, r4, #0\n" - " cmp r6, r0\n" - " bge ._190 @cond_branch\n" - "._199:\n" - " mov r4, #0x0\n" - " ldr r0, [r1]\n" - " b ._191\n" - "._193:\n" - " .align 2, 0\n" - "._192:\n" - " .word gMapHeader\n" - "._198:\n" - " add r0, r4, #7\n" - " add r1, r5, #7\n" - " bl MapGridGetMetatileBehaviorAt\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl sub_805759C\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._196 @cond_branch\n" - " add r0, r6, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r6, r0, #0x10\n" - " mov r0, sp\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, r4\n" - " bne ._196 @cond_branch\n" - " mov r1, #0x0\n" - " ldsh r0, [r7, r1]\n" - " cmp r0, r5\n" - " bne ._196 @cond_branch\n" - " add r0, r6, #0\n" - " b ._197\n" - "._196:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " ldr r0, ._200\n" - " ldr r0, [r0]\n" - "._191:\n" - " ldr r0, [r0]\n" - " cmp r4, r0\n" - " blt ._198 @cond_branch\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " ldr r1, ._200\n" - " ldr r0, [r1]\n" - " ldr r0, [r0, #0x4]\n" - " cmp r5, r0\n" - " blt ._199 @cond_branch\n" - "._190:\n" - " add r0, r6, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - "._197:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._201:\n" - " .align 2, 0\n" - "._200:\n" - " .word gMapHeader\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815FDE4() -{ - asm( - " push {lr}\n" - " ldr r0, ._205\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._202 @cond_branch\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._203 @cond_branch\n" - "._202:\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " b ._204\n" - "._206:\n" - " .align 2, 0\n" - "._205:\n" - " .word gMain\n" - "._203:\n" - " mov r0, #0x0\n" - "._204:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_815FE1C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x10\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._210\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r6, ._210 + 4\n" - " mov r0, #0x0\n" - " bl debug_sub_815FCB4\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r6, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0x5\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " mov r0, #0x1\n" - " bl debug_sub_815FCB4\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r6, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0x5\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, #0x2\n" - " bl debug_sub_815FCB4\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r6, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0x5\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " bl debug_sub_8092344\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r6, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0xb\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " mov r0, #0x1\n" - " bl debug_sub_8092344\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r6, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0xb\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, #0x2\n" - " bl debug_sub_8092344\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r6, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r6, #0\n" - " mov r1, #0xb\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r0, ._210 + 8\n" - " ldr r1, ._210 + 12\n" - " add r0, r0, r1\n" - " ldrh r0, [r0]\n" - " bl FeebasSeedRng\n" - " mov r0, #0x0\n" - " bl debug_sub_815FCB4\n" - " add r4, r0, #0\n" - " mov r0, #0x1\n" - " bl debug_sub_815FCB4\n" - " add r5, r0, #0\n" - " mov r0, #0x2\n" - " bl debug_sub_815FCB4\n" - " add r4, r4, r5\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x10\n" - " lsr r7, r0, #0x10\n" - " mov r5, #0x0\n" - "._209:\n" - " bl FeebasRandom\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " add r1, r7, #0\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r1, r0, #0x10\n" - " cmp r1, #0\n" - " bne ._207 @cond_branch\n" - " add r1, r7, #0\n" - "._207:\n" - " sub r0, r1, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0x2\n" - " bls ._208 @cond_branch\n" - " add r0, r6, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r5, #0\n" - " mov r1, #0x3\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " lsl r4, r0, #0x2\n" - " add r4, r4, r0\n" - " add r4, r4, #0x2\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r5, #0\n" - " mov r1, #0x3\n" - " bl __udivsi3\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x19\n" - " mov r0, #0xb0\n" - " lsl r0, r0, #0x14\n" - " add r2, r2, r0\n" - " lsr r2, r2, #0x18\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " bl Menu_PrintText\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - "._208:\n" - " cmp r5, #0x6\n" - " bne ._209 @cond_branch\n" - " ldr r4, ._210 + 4\n" - " bl debug_sub_815FD40\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " ldr r1, ._210 + 16\n" - " ldr r0, ._210 + 20\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._211:\n" - " .align 2, 0\n" - "._210:\n" - " .word Str_843E58D\n" - " .word gStringVar1\n" - " .word gSaveBlock1\n" - " .word 0x2dd6\n" - " .word gMenuCallback\n" - " .word debug_sub_815FDE4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_815FFDC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " mov r0, #0xe\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x0\n" - " mov r1, #0xe\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._214\n" - " mov r1, #0x1\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " mov r5, #0x0\n" - " ldr r0, ._214 + 4\n" - " mov r8, r0\n" - "._216:\n" - " mov r0, #0x64\n" - " add r1, r5, #0\n" - " mul r1, r1, r0\n" - " ldr r0, ._214 + 8\n" - " add r6, r1, r0\n" - " add r0, r6, #0\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " lsl r1, r5, #0x2\n" - " mov r2, r8\n" - " add r4, r1, r2\n" - " strh r0, [r4]\n" - " lsl r0, r0, #0x10\n" - " add r7, r1, #0\n" - " cmp r0, #0\n" - " beq ._212 @cond_branch\n" - " add r0, r6, #0\n" - " mov r1, #0x38\n" - " bl GetMonData\n" - " strb r0, [r4, #0x2]\n" - " add r0, r5, #0\n" - " bl debug_sub_816009C\n" - " add r0, r5, #0\n" - " bl debug_sub_81600D0\n" - " add r0, r5, #0\n" - " bl debug_sub_816013C\n" - " b ._213\n" - "._215:\n" - " .align 2, 0\n" - "._214:\n" - " .word Str_843E5D4\n" - " .word _nakamuraStatic0\n" - " .word gPlayerParty\n" - "._212:\n" - " mov r0, #0x1\n" - " strb r0, [r4, #0x2]\n" - "._213:\n" - " mov r0, r8\n" - " add r1, r7, r0\n" - " mov r0, #0x0\n" - " strb r0, [r1, #0x3]\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x5\n" - " bls ._216 @cond_branch\n" - " ldr r1, ._217\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " mov r0, #0xf\n" - " mov r1, #0x1\n" - " mov r2, #0xff\n" - " bl PrintTriangleCursorWithPalette\n" - " ldr r1, ._217 + 4\n" - " ldr r0, ._217 + 8\n" - " str r0, [r1]\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._218:\n" - " .align 2, 0\n" - "._217:\n" - " .word _nakamuraData4\n" - " .word gMenuCallback\n" - " .word debug_sub_8160498+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_816009C() -{ - asm( - " push {lr}\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " ldr r1, ._219\n" - " lsl r0, r2, #0x2\n" - " add r0, r0, r1\n" - " mov r3, #0x0\n" - " ldsh r1, [r0, r3]\n" - " mov r0, #0xb\n" - " mul r0, r0, r1\n" - " ldr r1, ._219 + 4\n" - " add r0, r0, r1\n" - " lsl r2, r2, #0x1\n" - " add r2, r2, #0x1\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r1, #0x10\n" - " bl Menu_PrintText\n" - " pop {r0}\n" - " bx r0\n" - "._220:\n" - " .align 2, 0\n" - "._219:\n" - " .word _nakamuraStatic0\n" - " .word gSpeciesNames\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_81600D0() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " add r5, r4, #0\n" - " ldr r1, ._223\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " bl memcpy\n" - " mov r0, #0x64\n" - " mul r0, r0, r4\n" - " ldr r1, ._223 + 4\n" - " add r0, r0, r1\n" - " bl GetMonGender\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._221 @cond_branch\n" - " ldr r0, ._223 + 8\n" - " b ._222\n" - "._224:\n" - " .align 2, 0\n" - "._223:\n" - " .word Str_843E5F0\n" - " .word gPlayerParty\n" - " .word gOtherText_MaleSymbol2\n" - "._221:\n" - " cmp r0, #0xfe\n" - " bne ._225 @cond_branch\n" - " ldr r0, ._227\n" - "._222:\n" - " lsl r2, r4, #0x1\n" - " add r2, r2, #0x1\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r1, #0x17\n" - " bl Menu_PrintText\n" - " b ._226\n" - "._228:\n" - " .align 2, 0\n" - "._227:\n" - " .word gOtherText_FemaleSymbolAndLv\n" - "._225:\n" - " lsl r2, r5, #0x1\n" - " add r2, r2, #0x1\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r0, sp\n" - " mov r1, #0x17\n" - " bl Menu_PrintText\n" - "._226:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_816013C() -{ - asm( - " push {r4, r5, lr}\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r5, ._229\n" - " ldr r1, ._229 + 4\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r1\n" - " mov r1, #0x2\n" - " ldrsb r1, [r0, r1]\n" - " add r0, r5, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " lsl r4, r4, #0x1\n" - " add r4, r4, #0x1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r5, #0\n" - " mov r1, #0x1a\n" - " add r2, r4, #0\n" - " bl Menu_PrintText\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._230:\n" - " .align 2, 0\n" - "._229:\n" - " .word gStringVar1\n" - " .word _nakamuraStatic0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_816017C() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " lsl r3, r4, #0x1\n" - " add r1, r3, #1\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r3, r3, #0x2\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " mov r0, #0x10\n" - " mov r2, #0x1c\n" - " bl Menu_BlankWindowRect\n" - " ldr r1, ._232\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r1\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0\n" - " beq ._231 @cond_branch\n" - " add r0, r4, #0\n" - " bl debug_sub_816009C\n" - " add r0, r4, #0\n" - " bl debug_sub_81600D0\n" - " add r0, r4, #0\n" - " bl debug_sub_816013C\n" - "._231:\n" - " mov r0, #0x5\n" - " bl debug_sub_81603B8\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._233:\n" - " .align 2, 0\n" - "._232:\n" - " .word _nakamuraStatic0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_81601C8() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffff0\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r1, ._239\n" - " lsl r0, r5, #0x2\n" - " add r2, r0, r1\n" - " mov r4, #0x0\n" - " ldsh r0, [r2, r4]\n" - " cmp r0, #0\n" - " bne ._236 @cond_branch\n" - " ldrb r0, [r2, #0x3]\n" - " cmp r0, #0\n" - " bne ._236 @cond_branch\n" - " cmp r3, #0x1\n" - " bne ._236 @cond_branch\n" - " mov r0, #0x8a\n" - " lsl r0, r0, #0x1\n" - " strh r0, [r2]\n" - "._236:\n" - " lsl r0, r5, #0x2\n" - " add r4, r0, r1\n" - " lsl r0, r3, #0x18\n" - " asr r0, r0, #0x18\n" - " ldrh r1, [r4]\n" - " add r2, r0, r1\n" - " mov r3, #0x0\n" - " strh r2, [r4]\n" - " lsl r1, r2, #0x10\n" - " mov r0, #0xcd\n" - " lsl r0, r0, #0x11\n" - " cmp r1, r0\n" - " ble ._237 @cond_branch\n" - " ldr r1, ._239 + 4\n" - " add r0, r2, r1\n" - " strh r0, [r4]\n" - "._237:\n" - " ldrh r1, [r4]\n" - " mov r2, #0x0\n" - " ldsh r0, [r4, r2]\n" - " cmp r0, #0\n" - " bge ._238 @cond_branch\n" - " ldr r2, ._239 + 8\n" - " add r0, r1, r2\n" - " strh r0, [r4]\n" - "._238:\n" - " mov r0, #0x64\n" - " mul r0, r0, r5\n" - " ldr r1, ._239 + 12\n" - " add r0, r0, r1\n" - " ldrh r1, [r4]\n" - " ldrb r2, [r4, #0x2]\n" - " str r3, [sp]\n" - " str r3, [sp, #0x4]\n" - " str r3, [sp, #0x8]\n" - " str r3, [sp, #0xc]\n" - " mov r3, #0x20\n" - " bl CreateMon\n" - " mov r0, #0x1\n" - " strb r0, [r4, #0x3]\n" - " add sp, sp, #0x10\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._240:\n" - " .align 2, 0\n" - "._239:\n" - " .word _nakamuraStatic0\n" - " .word 0xfffffe65\n" - " .word 0x19b\n" - " .word gPlayerParty\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160258() -{ - asm( - " push {lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " ldr r1, ._242\n" - " lsl r0, r2, #0x2\n" - " add r0, r0, r1\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0\n" - " beq ._241 @cond_branch\n" - " add r0, r2, #0\n" - " bl debug_sub_816062C\n" - "._241:\n" - " pop {r0}\n" - " bx r0\n" - "._243:\n" - " .align 2, 0\n" - "._242:\n" - " .word _nakamuraStatic0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_816027C() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r4, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r2, r1, #0x18\n" - " ldr r1, ._247\n" - " lsl r0, r4, #0x2\n" - " add r3, r0, r1\n" - " mov r1, #0x0\n" - " ldsh r0, [r3, r1]\n" - " cmp r0, #0\n" - " beq ._244 @cond_branch\n" - " lsl r0, r2, #0x18\n" - " asr r0, r0, #0x18\n" - " ldrb r1, [r3, #0x2]\n" - " add r0, r0, r1\n" - " strb r0, [r3, #0x2]\n" - " lsl r0, r0, #0x18\n" - " asr r0, r0, #0x18\n" - " cmp r0, #0x64\n" - " ble ._245 @cond_branch\n" - " mov r0, #0x1\n" - " strb r0, [r3, #0x2]\n" - "._245:\n" - " mov r0, #0x2\n" - " ldrsb r0, [r3, r0]\n" - " cmp r0, #0\n" - " bgt ._246 @cond_branch\n" - " mov r0, #0x64\n" - " strb r0, [r3, #0x2]\n" - "._246:\n" - " mov r0, #0x64\n" - " mul r4, r4, r0\n" - " ldr r0, ._247 + 4\n" - " add r4, r4, r0\n" - " ldr r2, ._247 + 8\n" - " mov r0, #0x0\n" - " ldsh r1, [r3, r0]\n" - " lsl r0, r1, #0x3\n" - " sub r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r2\n" - " ldrb r1, [r0, #0x13]\n" - " mov r0, #0xca\n" - " lsl r0, r0, #0x1\n" - " add r2, r1, #0\n" - " mul r2, r2, r0\n" - " mov r0, #0x2\n" - " ldrsb r0, [r3, r0]\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._247 + 12\n" - " add r0, r0, r1\n" - " add r2, r2, r0\n" - " add r0, r4, #0\n" - " mov r1, #0x19\n" - " bl SetMonData\n" - " add r0, r4, #0\n" - " bl debug_sub_803F55C\n" - "._244:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._248:\n" - " .align 2, 0\n" - "._247:\n" - " .word _nakamuraStatic0\n" - " .word gPlayerParty\n" - " .word gBaseStats\n" - " .word gExperienceTables\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160308() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add sp, sp, #0xffffff8c\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " mov r2, #0x0\n" - "._252:\n" - " add r1, r2, #1\n" - " lsl r0, r1, #0x18\n" - " lsr r5, r0, #0x18\n" - " mov r8, r1\n" - " cmp r5, #0x5\n" - " bhi ._249 @cond_branch\n" - " mov r0, #0x64\n" - " mov r9, r0\n" - " mov r0, r9\n" - " mul r0, r0, r2\n" - " ldr r7, ._254\n" - " add r6, r0, r7\n" - "._251:\n" - " add r0, r6, #0\n" - " mov r1, #0xb\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " bne ._250 @cond_branch\n" - " add r0, sp, #0x10\n" - " add r1, r6, #0\n" - " mov r2, #0x64\n" - " bl memcpy\n" - " mov r4, r9\n" - " mul r4, r4, r5\n" - " add r4, r4, r7\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " mov r2, #0x64\n" - " bl memcpy\n" - " add r0, r4, #0\n" - " add r1, sp, #0x10\n" - " mov r2, #0x64\n" - " bl memcpy\n" - "._250:\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x5\n" - " bls ._251 @cond_branch\n" - "._249:\n" - " mov r1, r8\n" - " lsl r0, r1, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x4\n" - " bls ._252 @cond_branch\n" - " bl CalculatePlayerPartyCount\n" - " ldr r4, ._254 + 4\n" - " ldrb r1, [r4]\n" - " cmp r1, #0\n" - " bne ._253 @cond_branch\n" - " ldr r0, ._254\n" - " str r1, [sp]\n" - " str r1, [sp, #0x4]\n" - " str r1, [sp, #0x8]\n" - " str r1, [sp, #0xc]\n" - " mov r1, #0x1\n" - " mov r2, #0xa\n" - " mov r3, #0x20\n" - " bl CreateMon\n" - " mov r0, #0x1\n" - " strb r0, [r4]\n" - "._253:\n" - " add sp, sp, #0x74\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._255:\n" - " .align 2, 0\n" - "._254:\n" - " .word gPlayerParty\n" - " .word gPlayerPartyCount\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_81603B8() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r7, ._259\n" - " ldrb r4, [r7]\n" - " add r0, r4, #0\n" - " mov r1, #0x6\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " add r0, r4, #0\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r0, ._259 + 4\n" - " add r0, r5, r0\n" - " ldrb r2, [r0]\n" - " lsl r3, r4, #0x1\n" - " add r1, r3, #1\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r3, r3, #0x2\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " add r0, r2, #0\n" - " bl Menu_BlankWindowRect\n" - " cmp r6, #0\n" - " bne ._256 @cond_branch\n" - " cmp r4, #0\n" - " beq ._257 @cond_branch\n" - " ldrb r0, [r7]\n" - " sub r0, r0, #0x1\n" - " b ._258\n" - "._260:\n" - " .align 2, 0\n" - "._259:\n" - " .word _nakamuraData4\n" - " .word _843E5D1\n" - "._257:\n" - " lsl r0, r5, #0x1\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, #0x5\n" - "._258:\n" - " strb r0, [r7]\n" - "._256:\n" - " ldr r1, ._264\n" - " cmp r6, #0x1\n" - " bne ._261 @cond_branch\n" - " cmp r4, #0x5\n" - " beq ._262 @cond_branch\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " b ._263\n" - "._265:\n" - " .align 2, 0\n" - "._264:\n" - " .word _nakamuraData4\n" - "._262:\n" - " lsl r0, r5, #0x1\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x1\n" - "._263:\n" - " strb r0, [r1]\n" - "._261:\n" - " cmp r6, #0x2\n" - " bne ._266 @cond_branch\n" - " cmp r5, #0\n" - " beq ._267 @cond_branch\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x6\n" - " b ._268\n" - "._267:\n" - " add r0, r4, #0\n" - " add r0, r0, #0xc\n" - "._268:\n" - " strb r0, [r1]\n" - "._266:\n" - " cmp r6, #0x3\n" - " bne ._271 @cond_branch\n" - " cmp r5, #0x2\n" - " beq ._270 @cond_branch\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x6\n" - " strb r0, [r1]\n" - " b ._271\n" - "._270:\n" - " strb r4, [r1]\n" - "._271:\n" - " ldrb r4, [r1]\n" - " add r0, r4, #0\n" - " mov r1, #0x6\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " add r0, r4, #0\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " ldr r0, ._272\n" - " add r0, r5, r0\n" - " ldrb r0, [r0]\n" - " lsr r1, r1, #0x17\n" - " add r1, r1, #0x1\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " mov r2, #0xff\n" - " bl PrintTriangleCursorWithPalette\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._273:\n" - " .align 2, 0\n" - "._272:\n" - " .word _843E5D1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160498() -{ - asm( - " push {r4, lr}\n" - " ldr r1, ._276\n" - " ldrh r2, [r1, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._274 @cond_branch\n" - " mov r0, #0x0\n" - " b ._281\n" - "._277:\n" - " .align 2, 0\n" - "._276:\n" - " .word gMain\n" - "._274:\n" - " mov r0, #0x80\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._278 @cond_branch\n" - " mov r0, #0x1\n" - " b ._281\n" - "._278:\n" - " mov r0, #0x20\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._280 @cond_branch\n" - " mov r0, #0x2\n" - " b ._281\n" - "._280:\n" - " mov r0, #0x10\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._282 @cond_branch\n" - " mov r0, #0x3\n" - "._281:\n" - " bl debug_sub_81603B8\n" - " mov r0, #0x0\n" - " b ._311\n" - "._282:\n" - " ldrh r1, [r1, #0x30]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._284 @cond_branch\n" - " ldr r4, ._289\n" - " ldrb r0, [r4]\n" - " cmp r0, #0x5\n" - " bhi ._285 @cond_branch\n" - " mov r1, #0x1\n" - " bl debug_sub_81601C8\n" - "._285:\n" - " ldrb r0, [r4]\n" - " sub r0, r0, #0x6\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x5\n" - " bhi ._286 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8160258\n" - "._286:\n" - " ldrb r0, [r4]\n" - " sub r0, r0, #0xc\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x5\n" - " bhi ._306 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " b ._300\n" - "._290:\n" - " .align 2, 0\n" - "._289:\n" - " .word _nakamuraData4\n" - "._284:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._291 @cond_branch\n" - " ldr r4, ._294\n" - " ldrb r0, [r4]\n" - " cmp r0, #0x5\n" - " bhi ._304 @cond_branch\n" - " mov r1, #0x1\n" - " neg r1, r1\n" - " b ._293\n" - "._295:\n" - " .align 2, 0\n" - "._294:\n" - " .word _nakamuraData4\n" - "._291:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._296 @cond_branch\n" - " ldr r4, ._301\n" - " ldrb r0, [r4]\n" - " cmp r0, #0x5\n" - " bhi ._297 @cond_branch\n" - " mov r1, #0xa\n" - " bl debug_sub_81601C8\n" - "._297:\n" - " ldrb r0, [r4]\n" - " sub r0, r0, #0x6\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x5\n" - " bhi ._298 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8160258\n" - "._298:\n" - " ldrb r0, [r4]\n" - " sub r0, r0, #0xc\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x5\n" - " bhi ._306 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " b ._300\n" - "._302:\n" - " .align 2, 0\n" - "._301:\n" - " .word _nakamuraData4\n" - "._296:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._303 @cond_branch\n" - " ldr r4, ._308\n" - " ldrb r0, [r4]\n" - " cmp r0, #0x5\n" - " bhi ._304 @cond_branch\n" - " mov r1, #0xa\n" - " neg r1, r1\n" - "._293:\n" - " bl debug_sub_81601C8\n" - "._304:\n" - " ldrb r0, [r4]\n" - " sub r0, r0, #0x6\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x5\n" - " bhi ._305 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8160258\n" - "._305:\n" - " ldrb r0, [r4]\n" - " sub r0, r0, #0xc\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x5\n" - " bhi ._306 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " neg r1, r1\n" - "._300:\n" - " bl debug_sub_816027C\n" - "._306:\n" - " ldrb r0, [r4]\n" - " mov r1, #0x6\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_816017C\n" - " mov r0, #0x0\n" - " b ._311\n" - "._309:\n" - " .align 2, 0\n" - "._308:\n" - " .word _nakamuraData4\n" - "._303:\n" - " mov r0, #0x8\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._310 @cond_branch\n" - " mov r0, #0x0\n" - " b ._311\n" - "._310:\n" - " bl debug_sub_8160308\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._311:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_816062C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add sp, sp, #0xfffffff0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - " mov r0, #0x64\n" - " mov r4, r8\n" - " mul r4, r4, r0\n" - " ldr r0, ._316\n" - " add r4, r4, r0\n" - " add r0, r4, #0\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " lsl r0, r0, #0x10\n" - " lsr r7, r0, #0x10\n" - " add r0, r4, #0\n" - " bl GetMonGender\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " ldr r1, ._316 + 4\n" - " lsl r0, r7, #0x3\n" - " sub r0, r0, r7\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldrb r6, [r0, #0x10]\n" - " cmp r6, #0\n" - " beq ._313 @cond_branch\n" - " cmp r6, #0xfe\n" - " beq ._313 @cond_branch\n" - " cmp r6, #0xff\n" - " bne ._314 @cond_branch\n" - "._313:\n" - " mov r0, #0x64\n" - " mov r1, r8\n" - " mul r1, r1, r0\n" - " add r0, r1, #0\n" - " ldr r1, ._316\n" - " add r0, r0, r1\n" - " bl GetMonGender\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " b ._320\n" - "._317:\n" - " .align 2, 0\n" - "._316:\n" - " .word gPlayerParty\n" - " .word gBaseStats\n" - "._314:\n" - " cmp r2, #0\n" - " beq ._318 @cond_branch\n" - " cmp r2, #0xfe\n" - " beq ._319 @cond_branch\n" - " mov r0, #0x0\n" - " b ._320\n" - "._318:\n" - " mov r6, #0xfe\n" - " b ._321\n" - "._319:\n" - " mov r6, #0x0\n" - "._321:\n" - " mov r0, r8\n" - " lsl r0, r0, #0x2\n" - " mov r9, r0\n" - "._322:\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " orr r5, r5, r0\n" - " add r0, r7, #0\n" - " add r1, r5, #0\n" - " bl GetGenderFromSpeciesAndPersonality\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, r6\n" - " bne ._322 @cond_branch\n" - " mov r0, #0x64\n" - " mov r4, r8\n" - " mul r4, r4, r0\n" - " ldr r0, ._323\n" - " add r4, r4, r0\n" - " add r0, r4, #0\n" - " mov r1, #0x42\n" - " bl GetMonData\n" - " ldr r0, ._323 + 4\n" - " add r0, r0, r9\n" - " ldrh r1, [r0]\n" - " ldrb r2, [r0, #0x2]\n" - " mov r0, #0x1\n" - " str r0, [sp]\n" - " str r5, [sp, #0x4]\n" - " mov r0, #0x0\n" - " str r0, [sp, #0x8]\n" - " str r0, [sp, #0xc]\n" - " add r0, r4, #0\n" - " mov r3, #0x20\n" - " bl CreateMon\n" - " add r0, r6, #0\n" - "._320:\n" - " add sp, sp, #0x10\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._324:\n" - " .align 2, 0\n" - "._323:\n" - " .word gPlayerParty\n" - " .word _nakamuraStatic0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160714() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add sp, sp, #0xfffffff0\n" - " add r6, r0, #0\n" - " mov r9, r1\n" - " mov r7, #0x0\n" - " mov r0, #0x0\n" - " mov r8, r0\n" - " mov r2, #0x0\n" - " mov r5, #0x0\n" - "._329:\n" - " add r4, r5, #1\n" - " lsl r1, r4, #0x18\n" - " lsr r1, r1, #0x18\n" - " mov r0, r9\n" - " str r2, [sp, #0xc]\n" - " bl GetPokeblockData\n" - " add r1, r0, #0\n" - " lsl r0, r5, #0x1\n" - " add r0, r0, sp\n" - " strh r1, [r0]\n" - " ldr r2, [sp, #0xc]\n" - " cmp r5, #0x5\n" - " beq ._328 @cond_branch\n" - " lsl r0, r1, #0x10\n" - " asr r1, r0, #0x10\n" - " cmp r1, #0\n" - " ble ._326 @cond_branch\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._326:\n" - " cmp r1, #0\n" - " bge ._327 @cond_branch\n" - " mov r0, r8\n" - " add r0, r0, #0x1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - "._327:\n" - " cmp r1, #0\n" - " bne ._328 @cond_branch\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - "._328:\n" - " lsl r0, r4, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x5\n" - " bls ._329 @cond_branch\n" - " mov r0, sp\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0x31\n" - " bgt ._333 @cond_branch\n" - " mov r0, sp\n" - " ldrh r0, [r0, #0x2]\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x10\n" - " cmp r0, #0x31\n" - " bgt ._333 @cond_branch\n" - " mov r0, sp\n" - " mov r4, #0x4\n" - " ldsh r0, [r0, r4]\n" - " cmp r0, #0x31\n" - " bgt ._333 @cond_branch\n" - " mov r0, sp\n" - " mov r1, #0x6\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0x31\n" - " bgt ._333 @cond_branch\n" - " mov r0, sp\n" - " mov r4, #0x8\n" - " ldsh r0, [r0, r4]\n" - " cmp r0, #0x31\n" - " ble ._334 @cond_branch\n" - "._333:\n" - " ldr r1, ._336\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0xe\n" - " b ._400\n" - "._337:\n" - " .align 2, 0\n" - "._336:\n" - " .word ContestStatsText_GoldPokeBlock\n" - "._334:\n" - " cmp r7, #0x4\n" - " bne ._338 @cond_branch\n" - " ldr r1, ._340\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0xd\n" - " b ._400\n" - "._341:\n" - " .align 2, 0\n" - "._340:\n" - " .word ContestStatsText_WhitePokeBlock\n" - "._338:\n" - " mov r3, #0x0\n" - " mov r5, #0x0\n" - "._343:\n" - " lsl r0, r5, #0x1\n" - " add r0, r0, sp\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0x2\n" - " bne ._342 @cond_branch\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - "._342:\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x4\n" - " bls ._343 @cond_branch\n" - " cmp r3, #0x3\n" - " beq ._345 @cond_branch\n" - " cmp r2, #0x5\n" - " beq ._345 @cond_branch\n" - " mov r4, r8\n" - " cmp r4, #0x4\n" - " bne ._346 @cond_branch\n" - "._345:\n" - " ldr r1, ._348\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0xc\n" - " b ._400\n" - "._349:\n" - " .align 2, 0\n" - "._348:\n" - " .word ContestStatsText_BlackPokeBlock\n" - "._346:\n" - " cmp r7, #0x3\n" - " bne ._350 @cond_branch\n" - " ldr r1, ._352\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0xb\n" - " b ._400\n" - "._353:\n" - " .align 2, 0\n" - "._352:\n" - " .word ContestStatsText_GrayPokeBlock\n" - "._350:\n" - " cmp r7, #0x2\n" - " beq ._354 @cond_branch\n" - " mov r0, r8\n" - " cmp r0, #0x2\n" - " bne ._377 @cond_branch\n" - "._354:\n" - " mov r3, #0x6\n" - " mov r2, #0x0\n" - " mov r5, #0x0\n" - "._359:\n" - " lsl r0, r5, #0x1\n" - " add r0, r0, sp\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0\n" - " beq ._358 @cond_branch\n" - " cmp r3, #0x6\n" - " bne ._357 @cond_branch\n" - " add r3, r5, #0\n" - " b ._358\n" - "._357:\n" - " add r2, r5, #0\n" - "._358:\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x4\n" - " bls ._359 @cond_branch\n" - " lsl r0, r3, #0x1\n" - " mov r4, sp\n" - " add r1, r4, r0\n" - " lsl r0, r2, #0x1\n" - " add r0, r0, sp\n" - " mov r4, #0x0\n" - " ldsh r1, [r1, r4]\n" - " mov r4, #0x0\n" - " ldsh r0, [r0, r4]\n" - " cmp r1, r0\n" - " blt ._360 @cond_branch\n" - " add r2, r3, #0\n" - "._360:\n" - " cmp r2, #0\n" - " bne ._361 @cond_branch\n" - " ldr r1, ._363\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x6\n" - " b ._400\n" - "._364:\n" - " .align 2, 0\n" - "._363:\n" - " .word ContestStatsText_PurplePokeBlock\n" - "._361:\n" - " cmp r2, #0x1\n" - " bne ._365 @cond_branch\n" - " ldr r1, ._367\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x7\n" - " b ._400\n" - "._368:\n" - " .align 2, 0\n" - "._367:\n" - " .word ContestStatsText_IndigoPokeBlock\n" - "._365:\n" - " cmp r2, #0x2\n" - " bne ._369 @cond_branch\n" - " ldr r1, ._371\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x8\n" - " b ._400\n" - "._372:\n" - " .align 2, 0\n" - "._371:\n" - " .word ContestStatsText_BrownPokeBlock\n" - "._369:\n" - " cmp r2, #0x3\n" - " bne ._373 @cond_branch\n" - " ldr r1, ._375\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x9\n" - " b ._400\n" - "._376:\n" - " .align 2, 0\n" - "._375:\n" - " .word ContestStatsText_LiteBluePokeBlock\n" - "._373:\n" - " cmp r2, #0x4\n" - " bne ._377 @cond_branch\n" - " ldr r1, ._379\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0xa\n" - " b ._400\n" - "._380:\n" - " .align 2, 0\n" - "._379:\n" - " .word ContestStatsText_OlivePokeBlock\n" - "._377:\n" - " cmp r7, #0x1\n" - " beq ._381 @cond_branch\n" - " mov r0, r8\n" - " cmp r0, #0x1\n" - " bne ._399 @cond_branch\n" - "._381:\n" - " mov r0, sp\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0\n" - " beq ._383 @cond_branch\n" - " ldr r1, ._385\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x1\n" - " b ._400\n" - "._386:\n" - " .align 2, 0\n" - "._385:\n" - " .word ContestStatsText_RedPokeBlock\n" - "._383:\n" - " mov r0, sp\n" - " ldrh r0, [r0, #0x2]\n" - " cmp r0, #0\n" - " beq ._387 @cond_branch\n" - " ldr r1, ._389\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x2\n" - " b ._400\n" - "._390:\n" - " .align 2, 0\n" - "._389:\n" - " .word ContestStatsText_BluePokeBlock\n" - "._387:\n" - " mov r0, sp\n" - " mov r4, #0x4\n" - " ldsh r0, [r0, r4]\n" - " cmp r0, #0\n" - " beq ._391 @cond_branch\n" - " ldr r1, ._393\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x3\n" - " b ._400\n" - "._394:\n" - " .align 2, 0\n" - "._393:\n" - " .word ContestStatsText_PinkPokeBlock\n" - "._391:\n" - " mov r0, sp\n" - " mov r1, #0x6\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0\n" - " beq ._395 @cond_branch\n" - " ldr r1, ._397\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x4\n" - " b ._400\n" - "._398:\n" - " .align 2, 0\n" - "._397:\n" - " .word ContestStatsText_GreenPokeBlock\n" - "._395:\n" - " mov r0, sp\n" - " mov r4, #0x8\n" - " ldsh r0, [r0, r4]\n" - " cmp r0, #0\n" - " beq ._399 @cond_branch\n" - " ldr r1, ._401\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x5\n" - " b ._400\n" - "._402:\n" - " .align 2, 0\n" - "._401:\n" - " .word ContestStatsText_YellowPokeBlock\n" - "._399:\n" - " ldr r1, ._403\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " mov r0, #0x0\n" - "._400:\n" - " add sp, sp, #0x10\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._404:\n" - " .align 2, 0\n" - "._403:\n" - " .word gOtherText_FiveQuestions\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_816097C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add r7, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r5, r1, #0x10\n" - " mov r6, #0x0\n" - " mov r1, #0x0\n" - "._405:\n" - " add r0, r7, r6\n" - " strb r1, [r0]\n" - " add r0, r6, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " cmp r6, #0x3\n" - " bls ._405 @cond_branch\n" - " mov r0, #0xff\n" - " strb r0, [r7, #0x4]\n" - " lsl r0, r5, #0x10\n" - " asr r0, r0, #0x10\n" - " cmp r0, #0\n" - " bne ._406 @cond_branch\n" - " mov r0, #0xa1\n" - " strb r0, [r7, #0x3]\n" - " b ._414\n" - "._406:\n" - " cmp r0, #0\n" - " ble ._408 @cond_branch\n" - " mov r4, #0x64\n" - " mov r0, #0x0\n" - " mov r8, r0\n" - " mov r6, #0x0\n" - "._412:\n" - " lsl r5, r5, #0x10\n" - " asr r0, r5, #0x10\n" - " lsl r4, r4, #0x10\n" - " asr r1, r4, #0x10\n" - " bl __divsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r2, r0, #0x10\n" - " mov r1, r8\n" - " cmp r1, #0\n" - " bne ._410 @cond_branch\n" - " cmp r6, #0x2\n" - " beq ._410 @cond_branch\n" - " cmp r2, #0\n" - " beq ._411 @cond_branch\n" - "._410:\n" - " add r1, r6, r7\n" - " add r0, r2, #0\n" - " sub r0, r0, #0x5f\n" - " strb r0, [r1, #0x1]\n" - " mov r0, #0x1\n" - " mov r8, r0\n" - "._411:\n" - " asr r0, r5, #0x10\n" - " asr r4, r4, #0x10\n" - " add r1, r4, #0\n" - " bl __modsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " add r0, r4, #0\n" - " mov r1, #0xa\n" - " bl __divsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " add r0, r6, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " cmp r6, #0x2\n" - " bls ._412 @cond_branch\n" - " b ._414\n" - "._408:\n" - " cmp r0, #0\n" - " bge ._414 @cond_branch\n" - " neg r0, r0\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " mov r4, #0x64\n" - " mov r1, #0x0\n" - " mov r8, r1\n" - " mov r6, #0x0\n" - "._419:\n" - " lsl r5, r5, #0x10\n" - " asr r0, r5, #0x10\n" - " lsl r4, r4, #0x10\n" - " asr r1, r4, #0x10\n" - " bl __divsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r2, r0, #0x10\n" - " mov r1, r8\n" - " lsl r0, r1, #0x10\n" - " add r3, r0, #0\n" - " cmp r3, #0\n" - " bne ._416 @cond_branch\n" - " cmp r6, #0x2\n" - " beq ._416 @cond_branch\n" - " cmp r2, #0\n" - " beq ._417 @cond_branch\n" - "._416:\n" - " add r1, r6, r7\n" - " add r0, r2, #0\n" - " sub r0, r0, #0x5f\n" - " strb r0, [r1, #0x1]\n" - " cmp r3, #0\n" - " bne ._418 @cond_branch\n" - " mov r0, #0xae\n" - " strb r0, [r1]\n" - "._418:\n" - " mov r0, #0x1\n" - " mov r8, r0\n" - "._417:\n" - " asr r0, r5, #0x10\n" - " asr r4, r4, #0x10\n" - " add r1, r4, #0\n" - " bl __modsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " add r0, r4, #0\n" - " mov r1, #0xa\n" - " bl __divsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " add r0, r6, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " cmp r6, #0x2\n" - " bls ._419 @cond_branch\n" - "._414:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160A80() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r2, r0, #0\n" - " ldr r1, ._422\n" - " cmp r0, #0\n" - " bne ._420 @cond_branch\n" - " ldr r4, ._422 + 4\n" - " ldrb r1, [r1, #0x1]\n" - " add r0, r4, #0\n" - " bl debug_sub_816097C\n" - " add r0, r4, #0\n" - " mov r1, #0x8\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " b ._440\n" - "._423:\n" - " .align 2, 0\n" - "._422:\n" - " .word _nakamuraStatic18\n" - " .word gStringVar1\n" - "._420:\n" - " cmp r0, #0x1\n" - " bne ._424 @cond_branch\n" - " ldr r4, ._426\n" - " ldrb r1, [r1, #0x2]\n" - " add r0, r4, #0\n" - " bl debug_sub_816097C\n" - " add r0, r4, #0\n" - " mov r1, #0x8\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " b ._440\n" - "._427:\n" - " .align 2, 0\n" - "._426:\n" - " .word gStringVar1\n" - "._424:\n" - " cmp r0, #0x2\n" - " bne ._428 @cond_branch\n" - " ldr r4, ._430\n" - " ldrb r1, [r1, #0x3]\n" - " add r0, r4, #0\n" - " bl debug_sub_816097C\n" - " add r0, r4, #0\n" - " mov r1, #0x8\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " b ._440\n" - "._431:\n" - " .align 2, 0\n" - "._430:\n" - " .word gStringVar1\n" - "._428:\n" - " cmp r0, #0x3\n" - " bne ._432 @cond_branch\n" - " ldr r4, ._434\n" - " ldrb r1, [r1, #0x4]\n" - " add r0, r4, #0\n" - " bl debug_sub_816097C\n" - " add r0, r4, #0\n" - " mov r1, #0x8\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " b ._440\n" - "._435:\n" - " .align 2, 0\n" - "._434:\n" - " .word gStringVar1\n" - "._432:\n" - " cmp r0, #0x4\n" - " bne ._436 @cond_branch\n" - " ldr r4, ._438\n" - " ldrb r1, [r1, #0x5]\n" - " add r0, r4, #0\n" - " bl debug_sub_816097C\n" - " add r0, r4, #0\n" - " mov r1, #0x8\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " b ._440\n" - "._439:\n" - " .align 2, 0\n" - "._438:\n" - " .word gStringVar1\n" - "._436:\n" - " cmp r2, #0x5\n" - " bne ._440 @cond_branch\n" - " ldr r4, ._441\n" - " ldrb r1, [r1, #0x6]\n" - " add r0, r4, #0\n" - " bl debug_sub_816097C\n" - " add r0, r4, #0\n" - " mov r1, #0x8\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - "._440:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._442:\n" - " .align 2, 0\n" - "._441:\n" - " .word gStringVar1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160B50() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r3, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r4, r1, #0\n" - " ldr r2, ._445\n" - " cmp r0, #0\n" - " bne ._443 @cond_branch\n" - " ldrb r0, [r2, #0x1]\n" - " add r0, r0, r1\n" - " strb r0, [r2, #0x1]\n" - " b ._455\n" - "._446:\n" - " .align 2, 0\n" - "._445:\n" - " .word _nakamuraStatic18\n" - "._443:\n" - " cmp r0, #0x1\n" - " bne ._447 @cond_branch\n" - " ldrb r0, [r2, #0x2]\n" - " add r0, r0, r1\n" - " strb r0, [r2, #0x2]\n" - " b ._455\n" - "._447:\n" - " cmp r0, #0x2\n" - " bne ._449 @cond_branch\n" - " ldrb r0, [r2, #0x3]\n" - " add r0, r0, r1\n" - " strb r0, [r2, #0x3]\n" - " b ._455\n" - "._449:\n" - " cmp r0, #0x3\n" - " bne ._451 @cond_branch\n" - " ldrb r0, [r2, #0x4]\n" - " add r0, r0, r1\n" - " strb r0, [r2, #0x4]\n" - " b ._455\n" - "._451:\n" - " cmp r0, #0x4\n" - " bne ._453 @cond_branch\n" - " ldrb r0, [r2, #0x5]\n" - " add r0, r0, r1\n" - " strb r0, [r2, #0x5]\n" - " b ._455\n" - "._453:\n" - " cmp r3, #0x5\n" - " bne ._455 @cond_branch\n" - " ldrb r0, [r2, #0x6]\n" - " add r0, r0, r4\n" - " strb r0, [r2, #0x6]\n" - "._455:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160BB0() -{ - asm( - " push {r4, r5, lr}\n" - " ldr r5, ._456\n" - " ldr r4, ._456 + 4\n" - " add r0, r5, #0\n" - " add r1, r4, #0\n" - " bl debug_sub_8160714\n" - " strb r0, [r4]\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0x8\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._457:\n" - " .align 2, 0\n" - "._456:\n" - " .word gStringVar1\n" - " .word _nakamuraStatic18\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160BE4() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xc\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " bl debug_sub_8160BB0\n" - " ldr r0, ._459\n" - " mov r1, #0x2\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r0, ._459 + 4\n" - " mov r1, #0x2\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " ldr r0, ._459 + 8\n" - " mov r1, #0x2\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r0, ._459 + 12\n" - " mov r1, #0x2\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " ldr r0, ._459 + 16\n" - " mov r1, #0x2\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, ._459 + 20\n" - " mov r1, #0x2\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - " mov r4, #0x0\n" - "._458:\n" - " add r0, r4, #0\n" - " bl debug_sub_8160A80\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x5\n" - " bls ._458 @cond_branch\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xb\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._460:\n" - " .align 2, 0\n" - "._459:\n" - " .word gContestStatsText_Spicy\n" - " .word gContestStatsText_Dry\n" - " .word gContestStatsText_Sweet\n" - " .word gContestStatsText_Bitter\n" - " .word gContestStatsText_Sour\n" - " .word gContestStatsText_Tasty\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160C7C() -{ - asm( - " push {r4, lr}\n" - " ldr r2, ._469\n" - " mov r1, #0x0\n" - " ldrb r0, [r2]\n" - " cmp r0, #0xc\n" - " bne ._467 @cond_branch\n" - " ldrb r0, [r2, #0x1]\n" - " cmp r0, #0x2\n" - " bne ._462 @cond_branch\n" - " mov r1, #0x1\n" - "._462:\n" - " ldrb r0, [r2, #0x3]\n" - " cmp r0, #0x2\n" - " bne ._463 @cond_branch\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - "._463:\n" - " ldrb r0, [r2, #0x4]\n" - " cmp r0, #0x2\n" - " bne ._464 @cond_branch\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - "._464:\n" - " ldrb r0, [r2, #0x2]\n" - " cmp r0, #0x2\n" - " bne ._465 @cond_branch\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - "._465:\n" - " ldrb r0, [r2, #0x5]\n" - " cmp r0, #0x2\n" - " bne ._466 @cond_branch\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - "._466:\n" - " cmp r1, #0x3\n" - " beq ._467 @cond_branch\n" - " mov r0, #0x2\n" - " strb r0, [r2, #0x1]\n" - " strb r0, [r2, #0x3]\n" - " strb r0, [r2, #0x4]\n" - "._467:\n" - " add r0, r2, #0\n" - " bl sub_810CA34\n" - " bl debug_sub_8160BB0\n" - " mov r4, #0x0\n" - "._468:\n" - " add r0, r4, #0\n" - " bl debug_sub_8160A80\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x5\n" - " bls ._468 @cond_branch\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._470:\n" - " .align 2, 0\n" - "._469:\n" - " .word _nakamuraStatic18\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160CF4() -{ - asm( - " push {lr}\n" - " ldr r2, ._473\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._471 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " b ._472\n" - "._474:\n" - " .align 2, 0\n" - "._473:\n" - " .word gMain\n" - "._471:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._475 @cond_branch\n" - " mov r0, #0x1\n" - "._472:\n" - " bl Menu_MoveCursor\n" - " mov r0, #0x0\n" - " b ._484\n" - "._475:\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._477 @cond_branch\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " neg r1, r1\n" - " b ._478\n" - "._477:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._479 @cond_branch\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - "._478:\n" - " bl debug_sub_8160B50\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8160A80\n" - " bl debug_sub_8160BB0\n" - " mov r0, #0x0\n" - " b ._484\n" - "._479:\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._481 @cond_branch\n" - " bl debug_sub_8160C7C\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x0\n" - " b ._484\n" - "._481:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._483 @cond_branch\n" - " mov r0, #0x0\n" - " b ._484\n" - "._483:\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._484:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -u8 debug_sub_8160D98() -{ - asm( - " push {lr}\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " bl debug_sub_8160BE4\n" - " ldr r1, ._485\n" - " ldr r0, ._485 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._486:\n" - " .align 2, 0\n" - "._485:\n" - " .word gMenuCallback\n" - " .word debug_sub_8160CF4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160DC0() -{ - asm( - " push {lr}\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x16\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._487\n" - " mov r1, #0xb\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._487 + 4\n" - " mov r1, #0x2\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r0, ._487 + 8\n" - " mov r1, #0x2\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " ldr r0, ._487 + 12\n" - " mov r1, #0x2\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r0, ._487 + 16\n" - " mov r1, #0x2\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " ldr r0, ._487 + 20\n" - " mov r1, #0x2\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, ._487 + 24\n" - " mov r1, #0x2\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - " ldr r0, ._487 + 28\n" - " mov r1, #0x2\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " ldr r0, ._487 + 32\n" - " mov r1, #0x2\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " pop {r0}\n" - " bx r0\n" - "._488:\n" - " .align 2, 0\n" - "._487:\n" - " .word gOtherText_Slash\n" - " .word Str_843E5F2\n" - " .word Str_843E5FB\n" - " .word Str_843E606\n" - " .word Str_843E611\n" - " .word Str_843E61C\n" - " .word Str_843E627\n" - " .word Str_843E637\n" - " .word Str_843E632\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8160E50() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0xa\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " ldr r5, ._489\n" - " add r0, r6, #0\n" - " mov r1, #0x2\n" - " add r2, r5, #0\n" - " bl GetMonData\n" - " add r0, r5, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " mov r0, #0xc\n" - " mov r1, #0x1\n" - " mov r2, #0x15\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " add r0, r6, #0\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " mov r1, #0xb\n" - " mul r0, r0, r1\n" - " ldr r1, ._489 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xc\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " mov r1, #0x1a\n" - " bl GetMonData\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r5, #0\n" - " add r1, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0xd\n" - " mov r1, #0x3\n" - " mov r2, #0x11\n" - " mov r3, #0x4\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0xd\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " mov r1, #0x1b\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r4, r4, r1\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0xd\n" - " mov r1, #0x5\n" - " mov r2, #0x11\n" - " mov r3, #0x6\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0xd\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " mov r1, #0x1c\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r4, r4, r1\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0xd\n" - " mov r1, #0x7\n" - " mov r2, #0x11\n" - " mov r3, #0x8\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0xd\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " mov r1, #0x1d\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r4, r4, r1\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0xd\n" - " mov r1, #0x9\n" - " mov r2, #0x11\n" - " mov r3, #0xa\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0xd\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " mov r1, #0x1e\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r4, r4, r1\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0xd\n" - " mov r1, #0xb\n" - " mov r2, #0x11\n" - " mov r3, #0xc\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0xd\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " mov r1, #0x1f\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r4, r4, r1\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0xd\n" - " mov r1, #0xd\n" - " mov r2, #0x11\n" - " mov r3, #0xe\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0xd\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - " add r0, r5, #0\n" - " add r1, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0xd\n" - " mov r1, #0xf\n" - " mov r2, #0x11\n" - " mov r3, #0x10\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0xd\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " mov r1, #0x20\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0xd\n" - " mov r1, #0x11\n" - " mov r2, #0x11\n" - " mov r3, #0x12\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0xd\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._490:\n" - " .align 2, 0\n" - "._489:\n" - " .word gStringVar1\n" - " .word gSpeciesNames\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8161028() -{ - asm( - " push {r4, r5, r6, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._491 @cond_branch\n" - " ldr r0, ._496\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " bne ._492 @cond_branch\n" - " mov r5, #0x5\n" - "._494:\n" - " lsl r0, r5, #0x10\n" - " asr r4, r0, #0x10\n" - " mov r0, #0x64\n" - " mul r0, r0, r4\n" - " ldr r1, ._496 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " bne ._493 @cond_branch\n" - " sub r0, r4, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " cmp r0, #0\n" - " bge ._494 @cond_branch\n" - "._492:\n" - " ldr r1, ._496\n" - " ldrb r0, [r1]\n" - " add r0, r0, r6\n" - " strb r0, [r1]\n" - " b ._506\n" - "._497:\n" - " .align 2, 0\n" - "._496:\n" - " .word _nakamuraData5\n" - " .word gPlayerParty\n" - "._491:\n" - " cmp r1, #0x1\n" - " bne ._506 @cond_branch\n" - " ldr r4, ._501\n" - " ldrb r0, [r4]\n" - " add r0, r0, r6\n" - " strb r0, [r4]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x6\n" - " bne ._499 @cond_branch\n" - " mov r0, #0x0\n" - " b ._500\n" - "._502:\n" - " .align 2, 0\n" - "._501:\n" - " .word _nakamuraData5\n" - "._493:\n" - " ldr r0, ._504\n" - " strb r5, [r0]\n" - " b ._506\n" - "._505:\n" - " .align 2, 0\n" - "._504:\n" - " .word _nakamuraData5\n" - "._499:\n" - " ldrb r1, [r4]\n" - " mov r0, #0x64\n" - " mul r0, r0, r1\n" - " ldr r1, ._507\n" - " add r0, r0, r1\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " bne ._506 @cond_branch\n" - "._500:\n" - " strb r0, [r4]\n" - "._506:\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._508:\n" - " .align 2, 0\n" - "._507:\n" - " .word gPlayerParty\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_81610BC() -{ - asm( - " push {lr}\n" - " ldr r0, ._511\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._509 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " b ._510\n" - "._512:\n" - " .align 2, 0\n" - "._511:\n" - " .word gMain\n" - "._509:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._513 @cond_branch\n" - " mov r0, #0x1\n" - "._510:\n" - " bl debug_sub_8161028\n" - " ldr r0, ._515\n" - " ldrb r1, [r0]\n" - " mov r0, #0x64\n" - " mul r0, r0, r1\n" - " ldr r1, ._515 + 4\n" - " add r0, r0, r1\n" - " bl debug_sub_8160E50\n" - " mov r0, #0x0\n" - " b ._518\n" - "._516:\n" - " .align 2, 0\n" - "._515:\n" - " .word _nakamuraData5\n" - " .word gPlayerParty\n" - "._513:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._517 @cond_branch\n" - " mov r0, #0x0\n" - " b ._518\n" - "._517:\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._518:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void DebugMenu_EffortValues() -{ - asm( - " push {lr}\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " ldr r1, ._519\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " bl debug_sub_8160DC0\n" - " ldr r0, ._519 + 4\n" - " bl debug_sub_8160E50\n" - " ldr r1, ._519 + 8\n" - " ldr r0, ._519 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._520:\n" - " .align 2, 0\n" - "._519:\n" - " .word _nakamuraData5\n" - " .word gPlayerParty\n" - " .word gMenuCallback\n" - " .word debug_sub_81610BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8161160() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " mov r7, #0x0\n" - " ldr r2, ._523\n" - " ldr r1, ._523 + 4\n" - " ldrh r0, [r2]\n" - " ldrh r3, [r1]\n" - " cmp r0, r3\n" - " bhi ._521 @cond_branch\n" - " add r6, r0, #0\n" - " ldrh r5, [r1]\n" - " b ._522\n" - "._524:\n" - " .align 2, 0\n" - "._523:\n" - " .word _nakamuraData6\n" - " .word _nakamuraData8\n" - "._521:\n" - " ldrh r6, [r1]\n" - " ldrh r5, [r2]\n" - "._522:\n" - " mov r4, #0x0\n" - " ldr r0, ._529\n" - " ldrh r0, [r0]\n" - " cmp r4, r0\n" - " bcs ._525 @cond_branch\n" - " ldr r0, ._529 + 4\n" - " mov r8, r0\n" - "._528:\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r2, r8\n" - " ldrh r1, [r2]\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, r6\n" - " bcc ._527 @cond_branch\n" - " cmp r0, r5\n" - " bhi ._527 @cond_branch\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r7, r0, #0x10\n" - "._527:\n" - " add r4, r4, #0x1\n" - " ldr r0, ._529\n" - " ldrh r0, [r0]\n" - " cmp r4, r0\n" - " bcc ._528 @cond_branch\n" - "._525:\n" - " add r0, r7, #0\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._530:\n" - " .align 2, 0\n" - "._529:\n" - " .word _nakamuraDataA\n" - " .word _nakamuraDataC\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_81611D8() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xf\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._531\n" - " mov r1, #0x2\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._531 + 4\n" - " mov r1, #0x2\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r0, ._531 + 8\n" - " mov r1, #0x2\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " ldr r0, ._531 + 12\n" - " mov r1, #0x2\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r0, ._531 + 16\n" - " mov r1, #0x2\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " ldr r0, ._531 + 20\n" - " mov r1, #0xd\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " ldr r4, ._531 + 24\n" - " add r0, r4, #0\n" - " mov r1, #0xc\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0xc\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0xc\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0xc\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0xc\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xe\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x4\n" - " bl InitMenu\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._532:\n" - " .align 2, 0\n" - "._531:\n" - " .word Str_843E642\n" - " .word Str_843E647\n" - " .word Str_843E65A\n" - " .word Str_843E64C\n" - " .word Str_843E651\n" - " .word Str_843E655\n" - " .word Str_843E658\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8161290() -{ - asm( - " push {r4, lr}\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " ldr r4, ._533\n" - " add r0, r4, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x8\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._534:\n" - " .align 2, 0\n" - "._533:\n" - " .word gStringVar1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_81612B8() -{ - asm( - " push {r4, r5, lr}\n" - " add r4, r2, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " lsl r1, r1, #0x18\n" - " asr r1, r1, #0x18\n" - " ldrh r2, [r0]\n" - " add r1, r1, r2\n" - " strh r1, [r0]\n" - " ldr r5, ._535\n" - " ldrh r1, [r0]\n" - " add r0, r5, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r5, #0\n" - " mov r1, #0x8\n" - " add r2, r4, #0\n" - " bl Menu_PrintText\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._536:\n" - " .align 2, 0\n" - "._535:\n" - " .word gStringVar1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_81612EC() -{ - asm( - " push {r4, r5, lr}\n" - " ldr r2, ._540\n" - " ldrh r1, [r2, #0x2c]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " mov r5, #0x1\n" - " cmp r0, #0\n" - " beq ._537 @cond_branch\n" - " mov r5, #0x64\n" - "._537:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._538 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " b ._539\n" - "._541:\n" - " .align 2, 0\n" - "._540:\n" - " .word gMain\n" - "._538:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._542 @cond_branch\n" - " mov r0, #0x1\n" - "._539:\n" - " bl Menu_MoveCursor\n" - "._565:\n" - " mov r0, #0x0\n" - " b ._543\n" - "._542:\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._544 @cond_branch\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " asr r4, r0, #0x18\n" - " cmp r4, #0\n" - " bne ._545 @cond_branch\n" - " ldr r0, ._550\n" - " neg r1, r5\n" - " mov r2, #0x1\n" - " bl debug_sub_81612B8\n" - "._545:\n" - " cmp r4, #0x1\n" - " bne ._546 @cond_branch\n" - " ldr r0, ._550 + 4\n" - " neg r1, r5\n" - " mov r2, #0x3\n" - " bl debug_sub_81612B8\n" - "._546:\n" - " cmp r4, #0x2\n" - " bne ._547 @cond_branch\n" - " ldr r0, ._550 + 8\n" - " neg r1, r5\n" - " mov r2, #0x5\n" - " bl debug_sub_81612B8\n" - "._547:\n" - " cmp r4, #0x3\n" - " bne ._565 @cond_branch\n" - " ldr r0, ._550 + 12\n" - " neg r1, r5\n" - " mov r2, #0x7\n" - " bl debug_sub_81612B8\n" - " b ._565\n" - "._551:\n" - " .align 2, 0\n" - "._550:\n" - " .word _nakamuraData6\n" - " .word _nakamuraData8\n" - " .word _nakamuraDataC\n" - " .word _nakamuraDataA\n" - "._544:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._552 @cond_branch\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " asr r4, r0, #0x18\n" - " cmp r4, #0\n" - " bne ._553 @cond_branch\n" - " ldr r0, ._558\n" - " add r1, r5, #0\n" - " mov r2, #0x1\n" - " bl debug_sub_81612B8\n" - "._553:\n" - " cmp r4, #0x1\n" - " bne ._554 @cond_branch\n" - " ldr r0, ._558 + 4\n" - " add r1, r5, #0\n" - " mov r2, #0x3\n" - " bl debug_sub_81612B8\n" - "._554:\n" - " cmp r4, #0x2\n" - " bne ._555 @cond_branch\n" - " ldr r0, ._558 + 8\n" - " add r1, r5, #0\n" - " mov r2, #0x5\n" - " bl debug_sub_81612B8\n" - "._555:\n" - " cmp r4, #0x3\n" - " bne ._565 @cond_branch\n" - " ldr r0, ._558 + 12\n" - " add r1, r5, #0\n" - " mov r2, #0x7\n" - " bl debug_sub_81612B8\n" - " b ._565\n" - "._559:\n" - " .align 2, 0\n" - "._558:\n" - " .word _nakamuraData6\n" - " .word _nakamuraData8\n" - " .word _nakamuraDataC\n" - " .word _nakamuraDataA\n" - "._552:\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._560 @cond_branch\n" - " ldr r0, ._563\n" - " ldrh r0, [r0]\n" - " cmp r0, #0\n" - " beq ._565 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " bl debug_sub_8161160\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl debug_sub_8161290\n" - " b ._565\n" - "._564:\n" - " .align 2, 0\n" - "._563:\n" - " .word _nakamuraDataC\n" - "._560:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._565 @cond_branch\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._543:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void DebugMenu_RandomNumberTest() -{ - asm( - " push {lr}\n" - " ldr r0, ._566\n" - " mov r1, #0x0\n" - " strh r1, [r0]\n" - " ldr r0, ._566 + 4\n" - " strh r1, [r0]\n" - " ldr r0, ._566 + 8\n" - " strh r1, [r0]\n" - " ldr r0, ._566 + 12\n" - " strh r1, [r0]\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_EraseWindowRect\n" - " bl debug_sub_81611D8\n" - " ldr r1, ._566 + 16\n" - " ldr r0, ._566 + 20\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._567:\n" - " .align 2, 0\n" - "._566:\n" - " .word _nakamuraData6\n" - " .word _nakamuraData8\n" - " .word _nakamuraDataC\n" - " .word _nakamuraDataA\n" - " .word gMenuCallback\n" - " .word debug_sub_81612EC+1\n" - "\n" - ); -} - #endif // DEBUG diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c index bdfc8f9c5..b3885ff76 100644 --- a/src/debug/nohara_debug_menu.c +++ b/src/debug/nohara_debug_menu.c @@ -5,2312 +5,8 @@ __attribute__((unused)) static u8 gDebug_03000724; __attribute__((unused)) static u8 gDebug_03000725; __attribute__((unused)) static u8 gDebug_03000726; -__attribute__((naked)) -void InitNoharaDebugMenu() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x13\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._1\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x12\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._1 + 4\n" - " ldr r0, ._1 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._2:\n" - " .align 2, 0\n" - "._1:\n" - " .word gUnknown_Debug_083C4938\n" - " .word gMenuCallback\n" - " .word debug_sub_808F414+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F414() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._3 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " beq ._4 @cond_branch\n" - " ldr r2, ._6\n" - " ldr r0, ._6 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - "._3:\n" - " mov r0, #0x0\n" - " b ._5\n" - "._7:\n" - " .align 2, 0\n" - "._6:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C4938\n" - "._4:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._5:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_TV() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " ldr r1, ._8\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xa\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._8 + 4\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x9\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._8 + 8\n" - " ldr r0, ._8 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._9:\n" - " .align 2, 0\n" - "._8:\n" - " .word gDebug_03000726\n" - " .word gUnknown_Debug_083C4B8C\n" - " .word gMenuCallback\n" - " .word debug_sub_808F4AC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F4AC() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._10 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " beq ._11 @cond_branch\n" - " ldr r2, ._13\n" - " ldr r0, ._13 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - "._10:\n" - " mov r0, #0x0\n" - " b ._12\n" - "._14:\n" - " .align 2, 0\n" - "._13:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C4B8C\n" - "._11:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._12:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F4EC() -{ - asm( - " push {lr}\n" - " bl debug_sub_808F6BC\n" - " ldr r0, ._15\n" - " bl sub_8071F40\n" - " mov r0, #0x3\n" - " mov r1, #0x3\n" - " mov r2, #0x1\n" - " bl DisplayYesNoMenu\n" - " ldr r1, ._15 + 4\n" - " ldr r0, ._15 + 8\n" - " str r0, [r1]\n" - " pop {r0}\n" - " bx r0\n" - "._16:\n" - " .align 2, 0\n" - "._15:\n" - " .word gUnknown_Debug_083C4980\n" - " .word gMenuCallback\n" - " .word debug_sub_808F648+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F518() -{ - asm( - " push {r4, lr}\n" - " mov r2, #0x0\n" - " ldr r4, ._20\n" - " ldr r3, ._20 + 4\n" - "._19:\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x2\n" - " add r1, r0, r4\n" - " add r0, r1, r3\n" - " ldrb r0, [r0]\n" - " sub r0, r0, #0x15\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x13\n" - " bhi ._18 @cond_branch\n" - " ldr r0, ._20 + 8\n" - " add r1, r1, r0\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._18 @cond_branch\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - "._18:\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x17\n" - " bls ._19 @cond_branch\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._21:\n" - " .align 2, 0\n" - "._20:\n" - " .word gSaveBlock1\n" - " .word 0x2738\n" - " .word 0x2739\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F560() -{ - asm( - " push {r4, lr}\n" - " mov r1, #0x0\n" - " ldr r4, ._23\n" - " ldr r3, ._23 + 4\n" - " mov r2, #0x0\n" - "._22:\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r4\n" - " add r0, r0, r3\n" - " strb r2, [r0]\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " cmp r1, #0x17\n" - " bls ._22 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._24:\n" - " .align 2, 0\n" - "._23:\n" - " .word gSaveBlock1\n" - " .word 0x2739\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F594() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r2, #0x0\n" - " ldr r6, ._27\n" - " ldr r5, ._27 + 4\n" - " ldr r4, ._27 + 8\n" - " mov r3, #0x1\n" - "._26:\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x2\n" - " add r1, r0, r6\n" - " add r0, r1, r5\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._25 @cond_branch\n" - " add r0, r1, r4\n" - " strb r3, [r0]\n" - "._25:\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x17\n" - " bls ._26 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._28:\n" - " .align 2, 0\n" - "._27:\n" - " .word gSaveBlock1\n" - " .word 0x2738\n" - " .word 0x2739\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F5D8() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " mov r4, #0x0\n" - " ldr r6, ._30\n" - " ldr r7, ._30 + 4\n" - " add r0, r7, #1\n" - " mov r8, r0\n" - "._29:\n" - " ldr r5, ._30 + 8\n" - " strh r4, [r5]\n" - " bl GetSlotMachineId\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r6, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " lsl r0, r4, #0x1\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x2\n" - " add r1, r0, r7\n" - " ldrb r1, [r1]\n" - " add r0, r0, r8\n" - " ldrb r2, [r0]\n" - " add r0, r6, #0\n" - " bl Menu_PrintText\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0xb\n" - " bls ._29 @cond_branch\n" - " mov r0, #0x0\n" - " strh r0, [r5]\n" - " ldr r1, ._30 + 12\n" - " ldr r0, ._30 + 16\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._31:\n" - " .align 2, 0\n" - "._30:\n" - " .word gStringVar1\n" - " .word gUnknown_Debug_083C4BD4\n" - " .word gSpecialVar_0x8004\n" - " .word gMenuCallback\n" - " .word debug_sub_8090278+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F648() -{ - asm( - " push {lr}\n" - " ldr r0, ._35\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._32 @cond_branch\n" - " mov r0, #0xa\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xd\n" - " bl Menu_EraseWindowRect\n" - " ldr r0, ._35 + 4\n" - " ldrb r1, [r0]\n" - " mov r2, #0x1\n" - " eor r1, r1, r2\n" - " strb r1, [r0]\n" - " cmp r1, #0\n" - " beq ._33 @cond_branch\n" - " bl debug_sub_808F7B4\n" - " b ._40\n" - "._36:\n" - " .align 2, 0\n" - "._35:\n" - " .word gMain\n" - " .word gDebug_03000726\n" - "._33:\n" - " bl debug_sub_808F6BC\n" - " b ._40\n" - "._32:\n" - " bl Menu_ProcessInputNoWrap_\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._43 @cond_branch\n" - " cmp r1, r0\n" - " bgt ._39 @cond_branch\n" - " sub r0, r0, #0x1\n" - " cmp r1, r0\n" - " beq ._40 @cond_branch\n" - " b ._43\n" - "._39:\n" - " cmp r1, #0\n" - " beq ._42 @cond_branch\n" - " b ._43\n" - "._40:\n" - " mov r0, #0x0\n" - " b ._44\n" - "._42:\n" - " bl debug_sub_808F518\n" - "._43:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._44:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F6BC() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r4, #0x0\n" - " ldr r5, ._48\n" - " ldr r6, ._48 + 4\n" - "._45:\n" - " lsl r0, r4, #0x3\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldr r1, ._48 + 8\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " lsl r1, r4, #0x19\n" - " mov r0, #0xa0\n" - " lsl r0, r0, #0x14\n" - " add r1, r1, r0\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " bl Menu_PrintText\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x4\n" - " bls ._45 @cond_branch\n" - " mov r4, #0x5\n" - " ldr r5, ._48\n" - " ldr r6, ._48 + 4\n" - "._50:\n" - " lsl r0, r4, #0x3\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldr r1, ._48 + 8\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " cmp r4, #0xe\n" - " bhi ._46 @cond_branch\n" - " lsl r1, r4, #0x19\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " b ._47\n" - "._49:\n" - " .align 2, 0\n" - "._48:\n" - " .word gStringVar1\n" - " .word gSaveBlock1\n" - " .word 0x2738\n" - "._46:\n" - " lsl r1, r4, #0x19\n" - " mov r0, #0xec\n" - " lsl r0, r0, #0x18\n" - " add r1, r1, r0\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0x6\n" - " bl Menu_PrintText\n" - "._47:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x17\n" - " bls ._50 @cond_branch\n" - " mov r4, #0x0\n" - " ldr r5, ._53\n" - "._55:\n" - " ldr r0, ._53 + 4\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r0\n" - " ldr r0, ._53 + 8\n" - " add r1, r1, r0\n" - " ldrb r1, [r1]\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " cmp r4, #0x7\n" - " bhi ._51 @cond_branch\n" - " lsl r1, r4, #0x19\n" - " mov r0, #0xa0\n" - " lsl r0, r0, #0x14\n" - " add r1, r1, r0\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " b ._52\n" - "._54:\n" - " .align 2, 0\n" - "._53:\n" - " .word gStringVar1\n" - " .word gSaveBlock1\n" - " .word 0x2abc\n" - "._51:\n" - " lsl r1, r4, #0x19\n" - " mov r0, #0xfa\n" - " lsl r0, r0, #0x18\n" - " add r1, r1, r0\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0xc\n" - " bl Menu_PrintText\n" - "._52:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0xf\n" - " bls ._55 @cond_branch\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F7B4() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r4, #0x0\n" - " ldr r5, ._59\n" - " ldr r6, ._59 + 4\n" - "._56:\n" - " lsl r0, r4, #0x3\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldr r1, ._59 + 8\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " lsl r1, r4, #0x19\n" - " mov r0, #0xa0\n" - " lsl r0, r0, #0x14\n" - " add r1, r1, r0\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " bl Menu_PrintText\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x4\n" - " bls ._56 @cond_branch\n" - " mov r4, #0x5\n" - " ldr r5, ._59\n" - " ldr r6, ._59 + 4\n" - "._61:\n" - " lsl r0, r4, #0x3\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldr r1, ._59 + 8\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " cmp r4, #0xe\n" - " bhi ._57 @cond_branch\n" - " lsl r1, r4, #0x19\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " b ._58\n" - "._60:\n" - " .align 2, 0\n" - "._59:\n" - " .word gStringVar1\n" - " .word gSaveBlock1\n" - " .word 0x2739\n" - "._57:\n" - " lsl r1, r4, #0x19\n" - " mov r0, #0xec\n" - " lsl r0, r0, #0x18\n" - " add r1, r1, r0\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0x6\n" - " bl Menu_PrintText\n" - "._58:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x17\n" - " bls ._61 @cond_branch\n" - " mov r4, #0x0\n" - " ldr r5, ._64\n" - "._66:\n" - " ldr r0, ._64 + 4\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r0\n" - " ldr r0, ._64 + 8\n" - " add r1, r1, r0\n" - " ldrb r1, [r1]\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " cmp r4, #0x7\n" - " bhi ._62 @cond_branch\n" - " lsl r1, r4, #0x19\n" - " mov r0, #0xa0\n" - " lsl r0, r0, #0x14\n" - " add r1, r1, r0\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " b ._63\n" - "._65:\n" - " .align 2, 0\n" - "._64:\n" - " .word gStringVar1\n" - " .word gSaveBlock1\n" - " .word 0x2abd\n" - "._62:\n" - " lsl r1, r4, #0x19\n" - " mov r0, #0xfa\n" - " lsl r0, r0, #0x18\n" - " add r1, r1, r0\n" - " lsr r1, r1, #0x18\n" - " add r0, r5, #0\n" - " mov r2, #0xc\n" - " bl Menu_PrintText\n" - "._63:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0xf\n" - " bls ._66 @cond_branch\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F8AC() -{ - asm( - " push {lr}\n" - " ldr r0, ._67\n" - " bl FlagSet\n" - " ldr r0, ._67 + 4\n" - " bl FlagSet\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._68:\n" - " .align 2, 0\n" - "._67:\n" - " .word 0x832\n" - " .word 0x818\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F8CC() -{ - asm( - " push {r4, lr}\n" - " ldr r1, ._69\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " ldr r0, ._69 + 4\n" - " bl sub_8071F40\n" - " mov r0, #0xd\n" - " mov r1, #0x6\n" - " mov r2, #0x1a\n" - " mov r3, #0x8\n" - " bl Menu_BlankWindowRect\n" - " ldr r0, ._69 + 8\n" - " ldr r0, [r0]\n" - " mov r1, #0xe\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " mov r0, #0x16\n" - " mov r1, #0x1\n" - " mov r2, #0x18\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " ldr r4, ._69 + 12\n" - " add r0, r4, #0\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x17\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r1, ._69 + 16\n" - " ldr r0, ._69 + 20\n" - " str r0, [r1]\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._70:\n" - " .align 2, 0\n" - "._69:\n" - " .word gDebug_03000724\n" - " .word gUnknown_Debug_083C49CA\n" - " .word gUnknown_Debug_083C4ABD+0xf\n" - " .word gStringVar1\n" - " .word gMenuCallback\n" - " .word debug_sub_808F93C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F93C() -{ - asm( - " push {r4, lr}\n" - " mov r2, #0x0\n" - " ldr r0, ._83\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._71 @cond_branch\n" - " ldr r1, ._83 + 4\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x18\n" - " bne ._72 @cond_branch\n" - " strb r2, [r1]\n" - "._72:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r2, #0x1\n" - "._71:\n" - " ldr r0, ._83\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._73 @cond_branch\n" - " ldr r1, ._83 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._74 @cond_branch\n" - " mov r0, #0x18\n" - " strb r0, [r1]\n" - "._74:\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r2, #0x1\n" - "._73:\n" - " ldr r0, ._83\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._75 @cond_branch\n" - " ldr r1, ._83 + 8\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0xc\n" - " bne ._76 @cond_branch\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - "._76:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r2, #0x1\n" - "._75:\n" - " ldr r0, ._83\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._77 @cond_branch\n" - " ldr r1, ._83 + 8\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._78 @cond_branch\n" - " mov r0, #0xc\n" - " strb r0, [r1]\n" - "._78:\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r2, #0x1\n" - "._77:\n" - " cmp r2, #0\n" - " beq ._79 @cond_branch\n" - " mov r0, #0xd\n" - " mov r1, #0x6\n" - " mov r2, #0x1a\n" - " mov r3, #0x8\n" - " bl Menu_BlankWindowRect\n" - " ldr r1, ._83 + 12\n" - " ldr r0, ._83 + 8\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0xe\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " mov r0, #0x16\n" - " mov r1, #0x1\n" - " mov r2, #0x18\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " ldr r4, ._83 + 16\n" - " ldr r0, ._83 + 4\n" - " ldrb r1, [r0]\n" - " add r0, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x17\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - "._79:\n" - " ldr r4, ._83\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._80 @cond_branch\n" - " mov r0, #0x15\n" - " bl PlaySE\n" - " ldr r0, ._83 + 4\n" - " ldrb r0, [r0]\n" - " ldr r2, ._83 + 20\n" - " ldr r1, ._83 + 8\n" - " ldrb r1, [r1]\n" - " add r1, r1, r2\n" - " ldrb r1, [r1]\n" - " bl debug_sub_808FA88\n" - "._80:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0xa\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._81 @cond_branch\n" - " mov r0, #0x0\n" - " b ._82\n" - "._84:\n" - " .align 2, 0\n" - "._83:\n" - " .word gMain\n" - " .word gDebug_03000725\n" - " .word gDebug_03000724\n" - " .word gUnknown_Debug_083C4ABD+0xf\n" - " .word gStringVar1\n" - " .word gUnknown_Debug_083C4ABD\n" - "._81:\n" - " ldr r0, ._85\n" - " bl sub_80BF588\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._82:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._86:\n" - " .align 2, 0\n" - "._85:\n" - " .word gSaveBlock1+0x2738\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808FA88() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add sp, sp, #0xffffffcc\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r7, r1, #0x18\n" - " bl GetLeadMonIndex\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r9, r0\n" - " ldr r3, ._92\n" - " lsl r4, r6, #0x3\n" - " add r2, r4, r6\n" - " lsl r2, r2, #0x2\n" - " add r0, r2, r3\n" - " ldr r5, ._92 + 4\n" - " add r1, r0, r5\n" - " strb r7, [r1]\n" - " ldr r1, ._92 + 8\n" - " add r0, r0, r1\n" - " mov r1, #0x1\n" - " strb r1, [r0]\n" - " mov r1, #0x0\n" - " ldr r0, ._92 + 12\n" - " add r5, r3, r0\n" - " mov r3, #0x1\n" - "._87:\n" - " add r0, r1, r2\n" - " add r0, r0, r5\n" - " strb r3, [r0]\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " cmp r1, #0x21\n" - " bls ._87 @cond_branch\n" - " add r0, r7, #0\n" - " bl GetTVChannelByShowType\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r1, r0, #0\n" - " cmp r0, #0x3\n" - " beq ._88 @cond_branch\n" - " cmp r0, #0x3\n" - " bgt ._89 @cond_branch\n" - " cmp r0, #0x2\n" - " beq ._90 @cond_branch\n" - " b ._95\n" - "._93:\n" - " .align 2, 0\n" - "._92:\n" - " .word gSaveBlock1\n" - " .word 0x2738\n" - " .word 0x2739\n" - " .word 0x273a\n" - "._89:\n" - " cmp r1, #0x4\n" - " bne ._95 @cond_branch\n" - "._90:\n" - " add r0, r4, r6\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._96\n" - " add r0, r0, r1\n" - " bl sub_80BE160\n" - " b ._95\n" - "._97:\n" - " .align 2, 0\n" - "._96:\n" - " .word gSaveBlock1+0x2738\n" - "._88:\n" - " add r0, r4, r6\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._100\n" - " add r0, r0, r1\n" - " bl sub_80BE138\n" - "._95:\n" - " sub r0, r7, #1\n" - " cmp r0, #0x28\n" - " bls ._98 @cond_branch\n" - " b ._173\n" - "._98:\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._100 + 4\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._101:\n" - " .align 2, 0\n" - "._100:\n" - " .word gSaveBlock1+0x2738\n" - " .word ._102\n" - "._102:\n" - " .word ._104\n" - " .word ._104\n" - " .word ._105\n" - " .word ._173\n" - " .word ._107\n" - " .word ._108\n" - " .word ._109\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._123\n" - " .word ._124\n" - " .word ._125\n" - " .word ._126\n" - " .word ._127\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._173\n" - " .word ._143\n" - "._104:\n" - " add r0, r4, r6\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._145\n" - " add r4, r0, r1\n" - " mov r2, #0x1\n" - " strh r2, [r4, #0x2]\n" - " add r1, r1, #0x10\n" - " add r0, r0, r1\n" - " ldr r1, ._145 + 4\n" - " bl StringCopy\n" - " mov r0, #0x5\n" - " strb r0, [r4, #0x18]\n" - " b ._173\n" - "._146:\n" - " .align 2, 0\n" - "._145:\n" - " .word gSaveBlock1+0x2738\n" - " .word gSaveBlock2\n" - "._105:\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x2\n" - " ldr r6, ._148\n" - " add r1, r4, r6\n" - " mov r8, r1\n" - " mov r0, #0x1\n" - " strh r0, [r1, #0x2]\n" - " add r0, r6, #5\n" - " add r0, r4, r0\n" - " ldr r1, ._148 + 4\n" - " bl StringCopy\n" - " mov r0, #0x64\n" - " mov r5, r9\n" - " mul r5, r5, r0\n" - " ldr r0, ._148 + 8\n" - " add r5, r5, r0\n" - " add r6, r6, #0x10\n" - " add r4, r4, r6\n" - " add r0, r5, #0\n" - " mov r1, #0x2\n" - " add r2, r4, #0\n" - " bl GetMonData\n" - " mov r0, #0x5\n" - " mov r1, r8\n" - " strb r0, [r1, #0xd]\n" - " add r0, r5, #0\n" - " mov r1, #0x3\n" - " bl GetMonData\n" - " mov r5, r8\n" - " strb r0, [r5, #0xe]\n" - " b ._173\n" - "._149:\n" - " .align 2, 0\n" - "._148:\n" - " .word gSaveBlock1+0x2738\n" - " .word gSaveBlock2\n" - " .word gPlayerParty\n" - "._107:\n" - " mov r0, #0x64\n" - " mov r1, r9\n" - " mul r1, r1, r0\n" - " mov r8, r1\n" - " ldr r0, ._151\n" - " add r8, r8, r0\n" - " mov r0, r8\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x2\n" - " ldr r5, ._151 + 4\n" - " add r6, r4, r5\n" - " strh r0, [r6, #0x2]\n" - " mov r0, #0x1\n" - " strh r0, [r6, #0x1c]\n" - " add r0, r5, #0\n" - " add r0, r0, #0xf\n" - " add r0, r4, r0\n" - " ldr r1, ._151 + 8\n" - " bl StringCopy\n" - " add r5, r5, #0x4\n" - " add r4, r4, r5\n" - " mov r0, r8\n" - " mov r1, #0x2\n" - " add r2, r4, #0\n" - " bl GetMonData\n" - " mov r0, #0x5\n" - " strb r0, [r6, #0x1e]\n" - " mov r0, r8\n" - " mov r1, #0x3\n" - " bl GetMonData\n" - " strb r0, [r6, #0x1f]\n" - " b ._173\n" - "._152:\n" - " .align 2, 0\n" - "._151:\n" - " .word gPlayerParty\n" - " .word gSaveBlock1+0x2738\n" - " .word gSaveBlock2\n" - "._108:\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x2\n" - " ldr r6, ._154\n" - " add r5, r4, r6\n" - " mov r8, r5\n" - " mov r0, #0x1\n" - " strh r0, [r5, #0x2]\n" - " add r0, r6, #0\n" - " add r0, r0, #0x16\n" - " add r0, r4, r0\n" - " ldr r1, ._154 + 4\n" - " bl StringCopy\n" - " mov r0, #0x64\n" - " mov r5, r9\n" - " mul r5, r5, r0\n" - " ldr r0, ._154 + 8\n" - " add r5, r5, r0\n" - " add r6, r6, #0x8\n" - " add r4, r4, r6\n" - " add r0, r5, #0\n" - " mov r1, #0x2\n" - " add r2, r4, #0\n" - " bl GetMonData\n" - " mov r0, #0x5\n" - " mov r1, r8\n" - " strb r0, [r1, #0x1e]\n" - " add r0, r5, #0\n" - " mov r1, #0x3\n" - " bl GetMonData\n" - " mov r5, r8\n" - " strb r0, [r5, #0x1f]\n" - " b ._173\n" - "._155:\n" - " .align 2, 0\n" - "._154:\n" - " .word gSaveBlock1+0x2738\n" - " .word gSaveBlock2\n" - " .word gPlayerParty\n" - "._109:\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x2\n" - " ldr r5, ._157\n" - " add r6, r4, r5\n" - " mov r0, #0x1\n" - " strh r0, [r6, #0xa]\n" - " strh r0, [r6, #0x14]\n" - " add r0, r5, #2\n" - " add r0, r4, r0\n" - " ldr r1, ._157 + 4\n" - " mov r8, r1\n" - " bl StringCopy\n" - " add r5, r5, #0xc\n" - " add r4, r4, r5\n" - " add r0, r4, #0\n" - " mov r1, r8\n" - " bl StringCopy\n" - " mov r0, #0x5\n" - " strb r0, [r6, #0x1d]\n" - " b ._173\n" - "._158:\n" - " .align 2, 0\n" - "._157:\n" - " .word gSaveBlock1+0x2738\n" - " .word gSaveBlock2\n" - "._143:\n" - " add r0, r4, r6\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._160\n" - " add r0, r0, r1\n" - " mov r1, #0x1\n" - " strh r1, [r0, #0xc]\n" - " strh r1, [r0, #0x16]\n" - " b ._173\n" - "._161:\n" - " .align 2, 0\n" - "._160:\n" - " .word gSaveBlock1+0x2738\n" - "._123:\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x2\n" - " ldr r0, ._163\n" - " add r4, r4, r0\n" - " ldr r1, ._163 + 4\n" - " mov r0, sp\n" - " mov r2, #0x8\n" - " bl memcpy\n" - " add r5, sp, #0x8\n" - " ldr r1, ._163 + 8\n" - " add r0, r5, #0\n" - " mov r2, #0xb\n" - " bl memcpy\n" - " mov r0, #0xff\n" - " strb r0, [r4, #0x12]\n" - " add r0, r4, #0\n" - " add r0, r0, #0x13\n" - " mov r1, sp\n" - " bl StringCopy\n" - " add r0, r4, #4\n" - " add r1, r5, #0\n" - " bl StringCopy\n" - " mov r0, #0xc\n" - " strb r0, [r4, #0xf]\n" - " mov r0, #0x28\n" - " strh r0, [r4, #0x10]\n" - " mov r0, #0x5\n" - " strb r0, [r4, #0x2]\n" - " strb r0, [r4, #0x3]\n" - " b ._173\n" - "._164:\n" - " .align 2, 0\n" - "._163:\n" - " .word gSaveBlock1+0x2738\n" - " .word gUnknown_Debug_083C4C64\n" - " .word gUnknown_Debug_083C4C6C\n" - "._124:\n" - " add r0, r4, r6\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._168\n" - " add r5, r0, r1\n" - " add r4, sp, #0x14\n" - " ldr r1, ._168 + 4\n" - " add r0, r4, #0\n" - " mov r2, #0x8\n" - " bl memcpy\n" - " add r1, r4, #0\n" - " mov r3, #0xfe\n" - " mov r2, #0x2\n" - " add r0, r5, #0\n" - " add r0, r0, #0x10\n" - "._165:\n" - " strh r3, [r0]\n" - " sub r0, r0, #0x2\n" - " sub r2, r2, #0x1\n" - " cmp r2, #0\n" - " bge ._165 @cond_branch\n" - " mov r0, #0x1\n" - " strb r0, [r5, #0x2]\n" - " mov r0, #0x28\n" - " strb r0, [r5, #0x12]\n" - " add r0, r5, #0\n" - " add r0, r0, #0x13\n" - " add r3, r5, #6\n" - " mov r6, #0x1e\n" - " add r2, r5, #0\n" - " add r2, r2, #0xa\n" - "._166:\n" - " strh r6, [r2]\n" - " sub r2, r2, #0x2\n" - " cmp r2, r3\n" - " bge ._166 @cond_branch\n" - " bl StringCopy\n" - " mov r0, #0x5\n" - " strb r0, [r5, #0x3]\n" - " b ._173\n" - "._169:\n" - " .align 2, 0\n" - "._168:\n" - " .word gSaveBlock1+0x2738\n" - " .word gUnknown_Debug_083C4C64\n" - "._125:\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x2\n" - " ldr r0, ._171\n" - " add r4, r4, r0\n" - " add r5, sp, #0x1c\n" - " ldr r1, ._171 + 4\n" - " add r0, r5, #0\n" - " mov r2, #0x8\n" - " bl memcpy\n" - " mov r0, #0x28\n" - " strh r0, [r4, #0xc]\n" - " strh r0, [r4, #0xe]\n" - " mov r0, #0x3\n" - " strb r0, [r4, #0x12]\n" - " mov r0, #0xff\n" - " strb r0, [r4, #0x10]\n" - " mov r0, #0x1\n" - " strb r0, [r4, #0x11]\n" - " add r0, r4, #0\n" - " add r0, r0, #0x13\n" - " add r1, r5, #0\n" - " bl StringCopy\n" - " mov r0, #0x5\n" - " strb r0, [r4, #0x2]\n" - " b ._173\n" - "._172:\n" - " .align 2, 0\n" - "._171:\n" - " .word gSaveBlock1+0x2738\n" - " .word gUnknown_Debug_083C4C64\n" - "._126:\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x2\n" - " ldr r0, ._174\n" - " add r4, r4, r0\n" - " add r5, sp, #0x24\n" - " ldr r1, ._174 + 4\n" - " add r0, r5, #0\n" - " mov r2, #0x8\n" - " bl memcpy\n" - " mov r0, #0xff\n" - " strb r0, [r4, #0x2]\n" - " mov r0, #0x0\n" - " strb r0, [r4, #0x3]\n" - " mov r0, #0x28\n" - " strh r0, [r4, #0x4]\n" - " add r0, r4, #0\n" - " add r0, r0, #0x13\n" - " add r1, r5, #0\n" - " bl StringCopy\n" - " mov r0, #0x5\n" - " strb r0, [r4, #0x6]\n" - " b ._173\n" - "._175:\n" - " .align 2, 0\n" - "._174:\n" - " .word gSaveBlock1+0x2738\n" - " .word gUnknown_Debug_083C4C64\n" - "._127:\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x2\n" - " ldr r0, ._176\n" - " add r4, r4, r0\n" - " add r5, sp, #0x2c\n" - " ldr r1, ._176 + 4\n" - " add r0, r5, #0\n" - " mov r2, #0x8\n" - " bl memcpy\n" - " ldr r0, ._176 + 8\n" - " strh r0, [r4, #0x2]\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " strh r0, [r4, #0x6]\n" - " mov r0, #0x28\n" - " strh r0, [r4, #0x4]\n" - " strh r0, [r4, #0x8]\n" - " mov r0, #0x3\n" - " strb r0, [r4, #0xa]\n" - " add r0, r4, #0\n" - " add r0, r0, #0x13\n" - " add r1, r5, #0\n" - " bl StringCopy\n" - " mov r0, #0x5\n" - " strb r0, [r4, #0xb]\n" - "._173:\n" - " add sp, sp, #0x34\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._177:\n" - " .align 2, 0\n" - "._176:\n" - " .word gSaveBlock1+0x2738\n" - " .word gUnknown_Debug_083C4C64\n" - " .word 0xffff\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808FEBC() -{ - asm( - " push {lr}\n" - " bl ClearTVShowData\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808FECC() -{ - asm( - " push {r4, lr}\n" - " ldr r1, ._178\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " ldr r0, ._178 + 4\n" - " bl sub_8071F40\n" - " mov r0, #0xd\n" - " mov r1, #0x6\n" - " mov r2, #0x17\n" - " mov r3, #0x8\n" - " bl Menu_BlankWindowRect\n" - " ldr r0, ._178 + 8\n" - " ldr r0, [r0]\n" - " mov r1, #0xe\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " mov r0, #0x16\n" - " mov r1, #0x1\n" - " mov r2, #0x18\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " ldr r4, ._178 + 12\n" - " add r0, r4, #0\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x17\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r1, ._178 + 16\n" - " ldr r0, ._178 + 20\n" - " str r0, [r1]\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._179:\n" - " .align 2, 0\n" - "._178:\n" - " .word gDebug_03000724\n" - " .word gUnknown_Debug_083C49CA\n" - " .word gUnknown_Debug_083C4B20+0x4\n" - " .word gStringVar1\n" - " .word gMenuCallback\n" - " .word debug_sub_808FF3C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808FF3C() -{ - asm( - " push {r4, lr}\n" - " mov r2, #0x0\n" - " ldr r0, ._192\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._180 @cond_branch\n" - " ldr r1, ._192 + 4\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x10\n" - " bne ._181 @cond_branch\n" - " strb r2, [r1]\n" - "._181:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r2, #0x1\n" - "._180:\n" - " ldr r0, ._192\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._182 @cond_branch\n" - " ldr r1, ._192 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._183 @cond_branch\n" - " mov r0, #0x10\n" - " strb r0, [r1]\n" - "._183:\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r2, #0x1\n" - "._182:\n" - " ldr r0, ._192\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._184 @cond_branch\n" - " ldr r1, ._192 + 8\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x3\n" - " bne ._185 @cond_branch\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - "._185:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r2, #0x1\n" - "._184:\n" - " ldr r0, ._192\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._186 @cond_branch\n" - " ldr r1, ._192 + 8\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._187 @cond_branch\n" - " mov r0, #0x3\n" - " strb r0, [r1]\n" - "._187:\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r2, #0x1\n" - "._186:\n" - " cmp r2, #0\n" - " beq ._188 @cond_branch\n" - " mov r0, #0xd\n" - " mov r1, #0x6\n" - " mov r2, #0x17\n" - " mov r3, #0x8\n" - " bl Menu_BlankWindowRect\n" - " ldr r1, ._192 + 12\n" - " ldr r0, ._192 + 8\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0xe\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " mov r0, #0x16\n" - " mov r1, #0x1\n" - " mov r2, #0x18\n" - " mov r3, #0x2\n" - " bl Menu_BlankWindowRect\n" - " ldr r4, ._192 + 16\n" - " ldr r0, ._192 + 4\n" - " ldrb r1, [r0]\n" - " add r0, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x17\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - "._188:\n" - " ldr r4, ._192\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._189 @cond_branch\n" - " mov r0, #0x15\n" - " bl PlaySE\n" - " ldr r0, ._192 + 4\n" - " ldrb r0, [r0]\n" - " ldr r2, ._192 + 20\n" - " ldr r1, ._192 + 8\n" - " ldrb r1, [r1]\n" - " add r1, r1, r2\n" - " ldrb r1, [r1]\n" - " bl debug_sub_8090080\n" - "._189:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0xa\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._190 @cond_branch\n" - " mov r0, #0x0\n" - " b ._191\n" - "._193:\n" - " .align 2, 0\n" - "._192:\n" - " .word gMain\n" - " .word gDebug_03000725\n" - " .word gDebug_03000724\n" - " .word gUnknown_Debug_083C4B20+0x4\n" - " .word gStringVar1\n" - " .word gUnknown_Debug_083C4B20\n" - "._190:\n" - " bl sub_80BEC40\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._191:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090080() -{ - asm( - " lsl r0, r0, #0x18\n" - " ldr r2, ._194\n" - " lsr r0, r0, #0x16\n" - " add r0, r0, r2\n" - " ldr r3, ._194 + 4\n" - " add r2, r0, r3\n" - " strb r1, [r2]\n" - " ldr r1, ._194 + 8\n" - " add r2, r0, r1\n" - " mov r1, #0x1\n" - " strb r1, [r2]\n" - " add r3, r3, #0x2\n" - " add r0, r0, r3\n" - " mov r1, #0x4\n" - " strh r1, [r0]\n" - " bx lr\n" - "._195:\n" - " .align 2, 0\n" - "._194:\n" - " .word gSaveBlock1\n" - " .word 0x2abc\n" - " .word 0x2abd\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80900AC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " mov r7, #0x0\n" - " mov r5, #0x0\n" - " ldr r0, ._202\n" - " mov r8, r0\n" - "._198:\n" - " lsl r0, r5, #0x3\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x2\n" - " mov r1, r8\n" - " add r6, r0, r1\n" - " ldr r1, ._202 + 4\n" - " add r0, r6, r1\n" - " ldrb r4, [r0]\n" - " cmp r4, #0\n" - " bne ._196 @cond_branch\n" - " cmp r7, #0xc\n" - " bne ._197 @cond_branch\n" - " mov r7, #0x0\n" - "._197:\n" - " ldr r0, ._202 + 8\n" - " add r0, r7, r0\n" - " ldrb r1, [r0]\n" - " add r0, r5, #0\n" - " bl debug_sub_808FA88\n" - " ldr r1, ._202 + 12\n" - " add r0, r6, r1\n" - " strb r4, [r0]\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._196:\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x17\n" - " bls ._198 @cond_branch\n" - " mov r7, #0x0\n" - " mov r5, #0x0\n" - "._201:\n" - " ldr r0, ._202\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r0\n" - " ldr r0, ._202 + 16\n" - " add r1, r1, r0\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._199 @cond_branch\n" - " cmp r7, #0x3\n" - " bne ._200 @cond_branch\n" - " mov r7, #0x0\n" - "._200:\n" - " ldr r0, ._202 + 20\n" - " add r0, r7, r0\n" - " ldrb r1, [r0]\n" - " add r0, r5, #0\n" - " bl debug_sub_8090080\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._199:\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0xf\n" - " bls ._201 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._203:\n" - " .align 2, 0\n" - "._202:\n" - " .word gSaveBlock1\n" - " .word 0x2738\n" - " .word gUnknown_Debug_083C4ABD\n" - " .word 0x2739\n" - " .word 0x2abc\n" - " .word gUnknown_Debug_083C4B20\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_Fan() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xb\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._204\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xa\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._204 + 4\n" - " ldr r0, ._204 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._205:\n" - " .align 2, 0\n" - "._204:\n" - " .word gUnknown_Debug_083C4D28\n" - " .word gMenuCallback\n" - " .word debug_sub_80901A4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80901A4() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._206 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " beq ._207 @cond_branch\n" - " ldr r2, ._209\n" - " ldr r0, ._209 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - "._206:\n" - " mov r0, #0x0\n" - " b ._208\n" - "._210:\n" - " .align 2, 0\n" - "._209:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C4D28\n" - "._207:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._208:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80901E4() -{ - asm( - " push {lr}\n" - " bl ResetFanClub\n" - " bl sub_810FAA0\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80901F8() -{ - asm( - " push {lr}\n" - " bl sub_810FB9C\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._211\n" - " ldr r1, ._211 + 4\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " sub r0, r0, #0x8\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r2\n" - " ldr r0, [r0]\n" - " mov r1, #0xe\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r1, ._211 + 8\n" - " ldr r0, ._211 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._212:\n" - " .align 2, 0\n" - "._211:\n" - " .word gUnknown_Debug_083C4CA8\n" - " .word gUnknown_083F8408\n" - " .word gMenuCallback\n" - " .word debug_sub_8090278+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090238() -{ - asm( - " push {lr}\n" - " bl sub_810FC18\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._213\n" - " ldr r1, ._213 + 4\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " sub r0, r0, #0x8\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r2\n" - " ldr r0, [r0]\n" - " mov r1, #0xe\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r1, ._213 + 8\n" - " ldr r0, ._213 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._214:\n" - " .align 2, 0\n" - "._213:\n" - " .word gUnknown_Debug_083C4CA8\n" - " .word gUnknown_083F8410\n" - " .word gMenuCallback\n" - " .word debug_sub_8090278+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090278() -{ - asm( - " push {lr}\n" - " ldr r0, ._217\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._215 @cond_branch\n" - " mov r0, #0x0\n" - " b ._216\n" - "._218:\n" - " .align 2, 0\n" - "._217:\n" - " .word gMain\n" - "._215:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._216:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_809029C() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._219\n" - " ldr r0, ._219 + 4\n" - " ldr r1, ._219 + 8\n" - " add r0, r0, r1\n" - " ldrh r0, [r0]\n" - " mov r1, #0x7f\n" - " and r1, r1, r0\n" - " add r0, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x2\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x10\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r1, ._219 + 12\n" - " ldr r0, ._219 + 16\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._220:\n" - " .align 2, 0\n" - "._219:\n" - " .word gStringVar1\n" - " .word gSaveBlock1\n" - " .word 0x13c2\n" - " .word gMenuCallback\n" - " .word debug_sub_8090278+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80902E4() -{ - asm( - " push {lr}\n" - " ldr r1, ._221\n" - " ldrh r0, [r1, #0xe]\n" - " add r0, r0, #0x6\n" - " strh r0, [r1, #0xe]\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._222:\n" - " .align 2, 0\n" - "._221:\n" - " .word gSaveBlock2\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80902FC() -{ - asm( - " push {lr}\n" - " mov r0, #0x0\n" - " bl sub_810FB10\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090310() -{ - asm( - " push {lr}\n" - " mov r0, #0x1\n" - " bl sub_810FB10\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090324() -{ - asm( - " push {lr}\n" - " mov r0, #0x2\n" - " bl sub_810FB10\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090338() -{ - asm( - " push {lr}\n" - " mov r0, #0x3\n" - " bl sub_810FB10\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_BattleVSDad() -{ - asm( - " push {lr}\n" - " ldr r0, ._223\n" - " mov r1, #0x6\n" - " bl VarSet\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._224:\n" - " .align 2, 0\n" - "._223:\n" - " .word 0x4085\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_DadAfterBattle() -{ - asm( - " push {lr}\n" - " ldr r0, ._225\n" - " mov r1, #0x7\n" - " bl VarSet\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._226:\n" - " .align 2, 0\n" - "._225:\n" - " .word 0x4085\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_SootopolisCity() -{ - asm( - " push {lr}\n" - " mov r0, #0x81\n" - " bl FlagSet\n" - " mov r0, #0x71\n" - " bl FlagSet\n" - " ldr r0, ._227\n" - " bl FlagClear\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._228:\n" - " .align 2, 0\n" - "._227:\n" - " .word 0x32f\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_Embark() -{ - asm( - " push {lr}\n" - " ldr r0, ._229\n" - " bl FlagClear\n" - " ldr r0, ._229 + 4\n" - " mov r1, #0x1\n" - " bl VarSet\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._230:\n" - " .align 2, 0\n" - "._229:\n" - " .word 0x2e3\n" - " .word 0x4090\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_Yes9999() -{ - asm( - " push {lr}\n" - " ldr r0, ._231\n" - " ldr r1, ._231 + 4\n" - " bl VarSet\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._232:\n" - " .align 2, 0\n" - "._231:\n" - " .word 0x4048\n" - " .word 0x270f\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_LegendsFlagOn() -{ - asm( - " push {lr}\n" - " mov r0, #0xe4\n" - " bl FlagSet\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void NoharaDebugMenu_AddNumWinningStreaks() -{ - asm( - " push {lr}\n" - " ldr r0, ._235\n" - " ldr r1, ._235 + 4\n" - " add r2, r0, r1\n" - " ldrh r1, [r2]\n" - " cmp r1, #0x31\n" - " bhi ._233 @cond_branch\n" - " mov r0, #0x32\n" - " b ._244\n" - "._236:\n" - " .align 2, 0\n" - "._235:\n" - " .word gSaveBlock2\n" - " .word 0x572\n" - "._233:\n" - " cmp r1, #0x63\n" - " bhi ._237 @cond_branch\n" - " mov r0, #0x64\n" - " b ._244\n" - "._237:\n" - " ldr r0, ._241\n" - " cmp r1, r0\n" - " bhi ._239 @cond_branch\n" - " add r0, r0, #0x1\n" - " b ._244\n" - "._242:\n" - " .align 2, 0\n" - "._241:\n" - " .word 0x3e7\n" - "._239:\n" - " ldr r0, ._245\n" - " cmp r1, r0\n" - " bhi ._243 @cond_branch\n" - " ldr r0, ._245 + 4\n" - " b ._244\n" - "._246:\n" - " .align 2, 0\n" - "._245:\n" - " .word 0x1387\n" - " .word 0x2706\n" - "._243:\n" - " ldr r0, ._248\n" - " cmp r1, r0\n" - " bhi ._247 @cond_branch\n" - " add r0, r0, #0xa\n" - "._244:\n" - " strh r0, [r2]\n" - "._247:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._249:\n" - " .align 2, 0\n" - "._248:\n" - " .word 0x2705\n" - "\n" - ); -} +asm(".global gDebug_03000724"); +asm(".global gDebug_03000725"); +asm(".global gDebug_03000726"); #endif diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c index d479c59c8..f7e0e3770 100644 --- a/src/debug/taya_debug_window.c +++ b/src/debug/taya_debug_window.c @@ -3,2120 +3,4 @@ EWRAM_DATA u8 unk_2030224[4] = { 0 }; -__attribute__((naked)) -void TayaDebugMenu_Trend() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xffffffd8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1e\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r5, ._3\n" - " mov r7, #0x0\n" - " mov r0, #0x1\n" - " add r0, r0, sp\n" - " mov sl, r0\n" - " mov r9, sp\n" - " mov r0, #0x0\n" - " mov r8, r0\n" - " add r6, sp, #0x20\n" - "._2:\n" - " ldrb r1, [r5, #0x1]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " mov r1, #0xa1\n" - " cmp r0, #0\n" - " beq ._1 @cond_branch\n" - " mov r1, #0xa2\n" - "._1:\n" - " mov r0, r9\n" - " strb r1, [r0]\n" - " ldrh r1, [r5, #0x4]\n" - " add r0, r6, #0\n" - " bl EasyChat_GetWordText\n" - " mov r0, sl\n" - " add r1, r6, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x7\n" - " bl StringCopyPadded\n" - " add r4, r0, #0\n" - " ldrh r1, [r5, #0x6]\n" - " add r0, r6, #0\n" - " bl EasyChat_GetWordText\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x8\n" - " bl StringCopyPadded\n" - " add r4, r0, #0\n" - " ldrb r1, [r5]\n" - " lsl r1, r1, #0x19\n" - " lsr r1, r1, #0x19\n" - " mov r2, #0x1\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " add r4, r0, #0\n" - " mov r0, r8\n" - " strb r0, [r4]\n" - " add r4, r4, #0x1\n" - " ldrh r1, [r5]\n" - " lsl r1, r1, #0x12\n" - " lsr r1, r1, #0x19\n" - " add r0, r4, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " add r4, r0, #0\n" - " mov r0, r8\n" - " strb r0, [r4]\n" - " add r4, r4, #0x1\n" - " ldrh r1, [r5, #0x2]\n" - " add r0, r4, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " lsl r2, r7, #0x1\n" - " add r2, r2, #0x1\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r0, sp\n" - " mov r1, #0x1\n" - " bl Menu_PrintText\n" - " add r5, r5, #0x8\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r7, r0, #0x10\n" - " cmp r7, #0x4\n" - " bls ._2 @cond_branch\n" - " ldr r1, ._3 + 4\n" - " ldr r0, ._3 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x28\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._4:\n" - " .align 2, 0\n" - "._3:\n" - " .word gSaveBlock1+0x2dd4\n" - " .word gMenuCallback\n" - " .word debug_sub_8090808+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090808() -{ - asm( - " push {lr}\n" - " ldr r0, ._7\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x3\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._5 @cond_branch\n" - " mov r0, #0x0\n" - " b ._6\n" - "._8:\n" - " .align 2, 0\n" - "._7:\n" - " .word gMain\n" - "._5:\n" - " bl Menu_EraseScreen\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._6:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_TrendR() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r0, #0x0\n" - " ldr r7, ._11\n" - "._10:\n" - " mov r4, #0x0\n" - " lsl r5, r0, #0x3\n" - " add r6, r0, #1\n" - "._9:\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0x16\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl sub_80EB72C\n" - " lsl r1, r4, #0x1\n" - " add r1, r1, r5\n" - " add r1, r1, r7\n" - " strh r0, [r1]\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " cmp r4, #0x1\n" - " bls ._9 @cond_branch\n" - " lsl r0, r6, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0x4\n" - " bls ._10 @cond_branch\n" - " bl Menu_EraseScreen\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._12:\n" - " .align 2, 0\n" - "._11:\n" - " .word gSaveBlock1+0x2dd8\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090880() -{ - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._13 @cond_branch\n" - " mov r0, #0x0\n" - " b ._14\n" - "._13:\n" - " bl sub_80E60D8\n" - " mov r0, #0x1\n" - "._14:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_809089C() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._15 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " bne ._16 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " b ._17\n" - "._16:\n" - " ldr r2, ._19\n" - " ldr r0, ._19 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " strh r0, [r2]\n" - " ldrh r0, [r2]\n" - " sub r0, r0, #0x5\n" - " cmp r0, #0x7\n" - " bhi ._27 @cond_branch\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._19 + 8\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._20:\n" - " .align 2, 0\n" - "._19:\n" - " .word gSpecialVar_0x8004\n" - " .word gUnknown_Debug_083C4EC0\n" - " .word ._21\n" - "._21:\n" - " .word ._29\n" - " .word ._27\n" - " .word ._29\n" - " .word ._29\n" - " .word ._27\n" - " .word ._27\n" - " .word ._29\n" - " .word ._29\n" - "._29:\n" - " ldr r0, ._30\n" - " mov r1, #0x0\n" - " strh r1, [r0]\n" - " ldr r0, ._30 + 4\n" - " strh r1, [r0]\n" - "._27:\n" - " mov r0, #0x1\n" - " mov r1, #0x0\n" - " bl FadeScreen\n" - " ldr r1, ._30 + 8\n" - " ldr r0, ._30 + 12\n" - " str r0, [r1]\n" - "._15:\n" - " mov r0, #0x0\n" - "._17:\n" - " pop {r1}\n" - " bx r1\n" - "._31:\n" - " .align 2, 0\n" - "._30:\n" - " .word gSpecialVar_0x8005\n" - " .word gSpecialVar_0x8006\n" - " .word gMenuCallback\n" - " .word debug_sub_8090880+1\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_SimpleText() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xc\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._32\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xb\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._32 + 4\n" - " ldr r0, ._32 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._33:\n" - " .align 2, 0\n" - "._32:\n" - " .word gUnknown_Debug_083C4EC0\n" - " .word gMenuCallback\n" - " .word debug_sub_809089C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090984() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " bl Menu_ProcessInput\n" - " lsl r2, r0, #0x18\n" - " asr r1, r2, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._34 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " beq ._46 @cond_branch\n" - " cmp r1, #0x4\n" - " bgt ._36 @cond_branch\n" - " lsr r0, r2, #0x18\n" - " bl debug_sub_810B32C\n" - " b ._46\n" - "._34:\n" - " mov r0, #0x0\n" - " b ._38\n" - "._36:\n" - " cmp r1, #0x5\n" - " bne ._39 @cond_branch\n" - " bl sub_80F7F30\n" - " b ._46\n" - "._39:\n" - " cmp r1, #0x6\n" - " bne ._41 @cond_branch\n" - " mov r4, #0x0\n" - " ldr r0, ._44\n" - " add r1, r0, #2\n" - " mov ip, r1\n" - " ldr r7, ._44 + 4\n" - " ldr r1, ._44 + 8\n" - " add r6, r0, r1\n" - " add r5, r0, #0\n" - " add r5, r5, #0xe\n" - "._42:\n" - " lsl r1, r4, #0x1\n" - " mov r0, ip\n" - " add r3, r1, r0\n" - " add r0, r1, r7\n" - " ldrh r2, [r0]\n" - " strh r2, [r3]\n" - " add r0, r1, r5\n" - " strh r2, [r0]\n" - " add r1, r6, r1\n" - " strh r2, [r1]\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " cmp r4, #0x2\n" - " bls ._42 @cond_branch\n" - " b ._46\n" - "._45:\n" - " .align 2, 0\n" - "._44:\n" - " .word gSaveBlock1+0x2d94\n" - " .word gUnknown_Debug_083C4F08\n" - " .word 0xfffffd94\n" - "._41:\n" - " cmp r1, #0x7\n" - " bne ._46 @cond_branch\n" - " mov r4, #0x0\n" - "._47:\n" - " lsl r0, r4, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl sub_80EB890\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " cmp r4, #0x20\n" - " bls ._47 @cond_branch\n" - "._46:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._38:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_OldMan() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xa\n" - " mov r3, #0x11\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._48\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0x8\n" - " bl Menu_PrintItems\n" - " bl GetCurrentMauvilleOldMan\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " str r0, [sp]\n" - " mov r0, #0x9\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x8\n" - " bl InitMenu\n" - " ldr r1, ._48 + 4\n" - " ldr r0, ._48 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._49:\n" - " .align 2, 0\n" - "._48:\n" - " .word gUnknown_Debug_083C4F54\n" - " .word gMenuCallback\n" - " .word debug_sub_8090984+1\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_LanettesPC() -{ - asm( - " push {lr}\n" - " bl Menu_EraseScreen\n" - " bl ShowPokemonStorageSystem\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_TownFlags() -{ - asm( - " push {lr}\n" - " ldr r0, ._50\n" - " bl FlagSet\n" - " mov r0, #0x81\n" - " lsl r0, r0, #0x4\n" - " bl FlagSet\n" - " ldr r0, ._50 + 4\n" - " bl FlagSet\n" - " ldr r0, ._50 + 8\n" - " bl FlagSet\n" - " ldr r0, ._50 + 12\n" - " bl FlagSet\n" - " ldr r0, ._50 + 16\n" - " bl FlagSet\n" - " ldr r0, ._50 + 20\n" - " bl FlagSet\n" - " ldr r0, ._50 + 24\n" - " bl FlagSet\n" - " ldr r0, ._50 + 28\n" - " bl FlagSet\n" - " ldr r0, ._50 + 32\n" - " bl FlagSet\n" - " ldr r0, ._50 + 36\n" - " bl FlagSet\n" - " ldr r0, ._50 + 40\n" - " bl FlagSet\n" - " ldr r0, ._50 + 44\n" - " bl FlagSet\n" - " ldr r0, ._50 + 48\n" - " bl FlagSet\n" - " ldr r0, ._50 + 52\n" - " bl FlagSet\n" - " ldr r0, ._50 + 56\n" - " bl FlagSet\n" - " ldr r0, ._50 + 60\n" - " bl FlagSet\n" - " ldr r0, ._50 + 64\n" - " bl FlagSet\n" - " ldr r0, ._50 + 68\n" - " bl FlagSet\n" - " ldr r0, ._50 + 72\n" - " bl FlagSet\n" - " ldr r0, ._50 + 76\n" - " bl FlagSet\n" - " ldr r0, ._50 + 80\n" - " bl FlagSet\n" - " ldr r0, ._50 + 84\n" - " bl FlagSet\n" - " ldr r0, ._50 + 88\n" - " bl FlagSet\n" - " ldr r0, ._50 + 92\n" - " bl FlagSet\n" - " ldr r0, ._50 + 96\n" - " bl FlagSet\n" - " ldr r0, ._50 + 100\n" - " bl FlagSet\n" - " ldr r0, ._50 + 104\n" - " bl FlagSet\n" - " ldr r0, ._50 + 108\n" - " bl FlagSet\n" - " ldr r0, ._50 + 112\n" - " bl FlagSet\n" - " ldr r0, ._50 + 116\n" - " bl FlagSet\n" - " ldr r0, ._50 + 120\n" - " bl FlagSet\n" - " mov r0, #0x84\n" - " lsl r0, r0, #0x4\n" - " bl FlagSet\n" - " ldr r0, ._50 + 124\n" - " bl FlagSet\n" - " ldr r0, ._50 + 128\n" - " bl FlagSet\n" - " ldr r0, ._50 + 132\n" - " bl FlagSet\n" - " ldr r0, ._50 + 136\n" - " bl FlagSet\n" - " ldr r0, ._50 + 140\n" - " bl FlagSet\n" - " ldr r0, ._50 + 144\n" - " bl FlagSet\n" - " ldr r0, ._50 + 148\n" - " bl FlagSet\n" - " ldr r0, ._50 + 152\n" - " bl FlagSet\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._51:\n" - " .align 2, 0\n" - "._50:\n" - " .word 0x80f\n" - " .word 0x811\n" - " .word 0x812\n" - " .word 0x813\n" - " .word 0x814\n" - " .word 0x815\n" - " .word 0x816\n" - " .word 0x817\n" - " .word 0x818\n" - " .word 0x819\n" - " .word 0x81a\n" - " .word 0x81b\n" - " .word 0x81c\n" - " .word 0x81d\n" - " .word 0x81e\n" - " .word 0x848\n" - " .word 0x849\n" - " .word 0x84a\n" - " .word 0x854\n" - " .word 0x855\n" - " .word 0x856\n" - " .word 0x857\n" - " .word 0x858\n" - " .word 0x859\n" - " .word 0x85a\n" - " .word 0x85b\n" - " .word 0x85c\n" - " .word 0x83c\n" - " .word 0x83d\n" - " .word 0x83e\n" - " .word 0x83f\n" - " .word 0x841\n" - " .word 0x842\n" - " .word 0x843\n" - " .word 0x844\n" - " .word 0x845\n" - " .word 0x846\n" - " .word 0x847\n" - " .word 0x83b\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_AwardARibbon() -{ - asm( - " push {lr}\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x10\n" - " mov r2, #0x0\n" - " bl BlendPalettes\n" - " ldr r0, ._52\n" - " bl SetMainCallback2\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._53:\n" - " .align 2, 0\n" - "._52:\n" - " .word debug_sub_80915BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090C44() -{ - asm( - " push {r4, r5, lr}\n" - " ldr r4, ._54\n" - " sub r5, r4, #1\n" - " ldrh r1, [r5, #0x8]\n" - " add r0, r4, #0\n" - " mov r2, #0x2\n" - " mov r3, #0x5\n" - " bl ConvertIntToDecimalStringN\n" - " add r0, r4, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0x0\n" - " mov r2, #0x5\n" - " bl StringFill\n" - " ldrb r0, [r5]\n" - " add r0, r0, r4\n" - " mov r1, #0x79\n" - " strb r1, [r0]\n" - " add r0, r4, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._55:\n" - " .align 2, 0\n" - "._54:\n" - " .word gSharedMem+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8090C88() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " mov r8, r0\n" - " ldr r2, ._59\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " add r3, r2, #0\n" - " cmp r0, #0\n" - " beq ._57 @cond_branch\n" - " ldr r1, ._59 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._57 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " b ._62\n" - "._60:\n" - " .align 2, 0\n" - "._59:\n" - " .word gMain\n" - " .word gSharedMem\n" - "._67:\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " b ._62\n" - "._77:\n" - " strh r1, [r7, #0x8]\n" - " b ._62\n" - "._79:\n" - " ldr r0, ._64\n" - " ldrh r0, [r0, #0x8]\n" - " bl SetLotteryNumber16_Unused\n" - "._78:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " b ._63\n" - "._65:\n" - " .align 2, 0\n" - "._64:\n" - " .word gSharedMem\n" - "._57:\n" - " ldrh r1, [r3, #0x2e]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._66 @cond_branch\n" - " ldr r1, ._81\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x3\n" - " bls ._67 @cond_branch\n" - "._66:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._68 @cond_branch\n" - " ldr r0, ._81\n" - " ldrh r1, [r0, #0x8]\n" - " str r1, [r0, #0xc]\n" - " ldr r1, ._81 + 4\n" - " strh r1, [r0, #0x10]\n" - " mov r4, #0x0\n" - " ldrb r1, [r0]\n" - " add r7, r0, #0\n" - " cmp r4, r1\n" - " bcs ._69 @cond_branch\n" - " add r5, r7, #0\n" - " add r6, r1, #0\n" - "._70:\n" - " ldrh r0, [r5, #0x10]\n" - " mov r1, #0xa\n" - " str r3, [sp]\n" - " bl __udivsi3\n" - " strh r0, [r5, #0x10]\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r3, [sp]\n" - " cmp r4, r6\n" - " bcc ._70 @cond_branch\n" - "._69:\n" - " ldrh r1, [r7, #0x10]\n" - " ldr r0, [r7, #0xc]\n" - " add r0, r0, r1\n" - " str r0, [r7, #0xc]\n" - " ldr r1, ._81 + 8\n" - " cmp r0, r1\n" - " ble ._71 @cond_branch\n" - " str r1, [r7, #0xc]\n" - "._71:\n" - " ldrh r0, [r7, #0x8]\n" - " ldr r1, [r7, #0xc]\n" - " cmp r0, r1\n" - " bne ._77 @cond_branch\n" - "._68:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._73 @cond_branch\n" - " ldr r0, ._81\n" - " ldrh r1, [r0, #0x8]\n" - " str r1, [r0, #0xc]\n" - " ldr r1, ._81 + 4\n" - " strh r1, [r0, #0x10]\n" - " mov r4, #0x0\n" - " ldrb r1, [r0]\n" - " add r7, r0, #0\n" - " cmp r4, r1\n" - " bcs ._74 @cond_branch\n" - " add r5, r7, #0\n" - " add r6, r1, #0\n" - "._75:\n" - " ldrh r0, [r5, #0x10]\n" - " mov r1, #0xa\n" - " str r3, [sp]\n" - " bl __udivsi3\n" - " strh r0, [r5, #0x10]\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r3, [sp]\n" - " cmp r4, r6\n" - " bcc ._75 @cond_branch\n" - "._74:\n" - " add r2, r7, #0\n" - " ldrh r1, [r2, #0x10]\n" - " ldr r0, [r2, #0xc]\n" - " sub r0, r0, r1\n" - " str r0, [r2, #0xc]\n" - " cmp r0, #0\n" - " bge ._76 @cond_branch\n" - " mov r0, #0x0\n" - " str r0, [r2, #0xc]\n" - "._76:\n" - " ldrh r0, [r2, #0x8]\n" - " ldr r1, [r2, #0xc]\n" - " cmp r0, r1\n" - " bne ._77 @cond_branch\n" - "._73:\n" - " ldrh r2, [r3, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._78 @cond_branch\n" - " mov r0, #0x1\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._79 @cond_branch\n" - " mov r0, #0x0\n" - " mov r8, r0\n" - "._62:\n" - " mov r0, r8\n" - " cmp r0, #0\n" - " beq ._80 @cond_branch\n" - " bl debug_sub_8090C44\n" - "._80:\n" - " mov r0, #0x0\n" - "._63:\n" - " add sp, sp, #0x4\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._82:\n" - " .align 2, 0\n" - "._81:\n" - " .word gSharedMem\n" - " .word 0x2710\n" - " .word 0xffff\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_PKMNLottery() -{ - asm( - " push {lr}\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x6\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " bl RetrieveLotteryNumber\n" - " ldr r2, ._83\n" - " ldr r0, ._83 + 4\n" - " ldrh r0, [r0]\n" - " mov r1, #0x0\n" - " strh r0, [r2, #0x8]\n" - " strb r1, [r2]\n" - " bl debug_sub_8090C44\n" - " ldr r1, ._83 + 8\n" - " ldr r0, ._83 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._84:\n" - " .align 2, 0\n" - "._83:\n" - " .word gSharedMem\n" - " .word gSpecialVar_Result\n" - " .word gMenuCallback\n" - " .word debug_sub_8090C88+1\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_Trainer() -{ - asm( - " push {r4, r5, lr}\n" - " mov r4, #0x0\n" - " ldr r5, ._86\n" - "._85:\n" - " lsl r0, r4, #0x4\n" - " add r0, r0, r5\n" - " ldrh r0, [r0]\n" - " bl SetTrainerFlag\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " cmp r4, #0x37\n" - " bls ._85 @cond_branch\n" - " ldr r0, ._86 + 4\n" - " bl SetTrainerFlag\n" - " mov r0, #0x85\n" - " lsl r0, r0, #0x1\n" - " bl SetTrainerFlag\n" - " ldr r0, ._86 + 8\n" - " bl SetTrainerFlag\n" - " mov r0, #0x86\n" - " lsl r0, r0, #0x1\n" - " bl SetTrainerFlag\n" - " ldr r0, ._86 + 12\n" - " bl SetTrainerFlag\n" - " mov r0, #0x87\n" - " lsl r0, r0, #0x1\n" - " bl SetTrainerFlag\n" - " ldr r0, ._86 + 16\n" - " bl SetTrainerFlag\n" - " mov r0, #0x88\n" - " lsl r0, r0, #0x1\n" - " bl SetTrainerFlag\n" - " ldr r0, ._86 + 20\n" - " bl SetTrainerFlag\n" - " mov r0, #0x83\n" - " lsl r0, r0, #0x1\n" - " bl SetTrainerFlag\n" - " ldr r0, ._86 + 24\n" - " bl SetTrainerFlag\n" - " mov r0, #0x84\n" - " lsl r0, r0, #0x1\n" - " bl SetTrainerFlag\n" - " ldr r0, ._86 + 28\n" - " bl SetTrainerFlag\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "._87:\n" - " .align 2, 0\n" - "._86:\n" - " .word gTrainerEyeTrainers\n" - " .word 0x109\n" - " .word 0x10b\n" - " .word 0x10d\n" - " .word 0x10f\n" - " .word 0x105\n" - " .word 0x107\n" - " .word 0x14f\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_PokenavD() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xffffffe4\n" - " bl Menu_DisplayDialogueFrame\n" - " mov r0, #0x0\n" - " mov sl, r0\n" - " mov r6, #0x1\n" - " mov r7, #0xff\n" - " mov r1, #0x3\n" - " mov r9, r1\n" - "._93:\n" - " ldr r4, ._94\n" - " add r0, r4, #0\n" - " ldr r1, ._94 + 4\n" - " bl StringCopy\n" - " mov r5, sl\n" - " add r5, r5, #0x1\n" - " add r1, r5, r4\n" - " mov r0, #0xff\n" - " strb r0, [r1]\n" - " add r0, r4, #0\n" - " mov r1, #0x2\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " mov r8, r0\n" - " str r5, [sp, #0x14]\n" - " mov r1, sl\n" - " lsl r1, r1, #0x2\n" - " str r1, [sp, #0x18]\n" - "._91:\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " add r0, r0, #0x1\n" - " str r0, [sp, #0x10]\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0x64\n" - " bl __umodsi3\n" - " add r0, r0, #0x1\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0xc1\n" - " lsl r1, r1, #0x1\n" - " bl __umodsi3\n" - " add r0, r0, #0x1\n" - " lsl r0, r0, #0x10\n" - " lsr r3, r0, #0x10\n" - " cmp r3, #0xfb\n" - " bls ._89 @cond_branch\n" - " add r0, r3, #0\n" - " add r0, r0, #0x19\n" - " lsl r0, r0, #0x10\n" - " lsr r3, r0, #0x10\n" - " ldr r0, ._94 + 8\n" - " cmp r3, r0\n" - " bls ._89 @cond_branch\n" - " mov r3, #0x1\n" - "._89:\n" - " ldr r0, [sp, #0x18]\n" - " add r0, r0, sl\n" - " lsl r4, r0, #0x4\n" - " sub r4, r4, r0\n" - " lsl r4, r4, #0x5\n" - " mov r1, r8\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r8\n" - " lsl r0, r0, #0x4\n" - " ldr r1, ._94 + 12\n" - " add r0, r0, r1\n" - " add r4, r4, r0\n" - " lsl r2, r5, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " str r0, [sp, #0x4]\n" - " str r6, [sp, #0x8]\n" - " ldr r0, [sp, #0x10]\n" - " str r0, [sp, #0xc]\n" - " add r0, r4, #0\n" - " add r1, r3, #0\n" - " mov r3, #0x20\n" - " bl CreateBoxMon\n" - " bl Random\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x16\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x17\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x18\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x21\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x2f\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x30\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " mov r1, r9\n" - " and r1, r1, r0\n" - " add r1, r1, #0x1\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x32\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " mov r1, r9\n" - " and r1, r1, r0\n" - " add r1, r1, #0x1\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x33\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " mov r1, r9\n" - " and r1, r1, r0\n" - " add r1, r1, #0x1\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x34\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " mov r1, r9\n" - " and r1, r1, r0\n" - " add r1, r1, #0x1\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x36\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " mov r1, r9\n" - " and r1, r1, r0\n" - " add r1, r1, #0x1\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x35\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x43\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x44\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x45\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x46\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x47\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x48\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x49\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x4a\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x4b\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x4c\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x4d\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " bl Random\n" - " add r1, r6, #0\n" - " and r1, r1, r0\n" - " str r1, [sp, #0x10]\n" - " add r0, r4, #0\n" - " mov r1, #0x4e\n" - " add r2, sp, #0x10\n" - " bl SetBoxMonData\n" - " mov r0, r8\n" - " add r0, r0, #0x1\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r8, r0\n" - " cmp r0, #0x1d\n" - " bhi ._90 @cond_branch\n" - " b ._91\n" - "._90:\n" - " ldr r1, [sp, #0x14]\n" - " lsl r0, r1, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov sl, r0\n" - " cmp r0, #0xd\n" - " bhi ._92 @cond_branch\n" - " b ._93\n" - "._92:\n" - " bl TayaDebugMenu_TownFlags\n" - " bl TayaDebugMenu_Trainer\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " add sp, sp, #0x1c\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._95:\n" - " .align 2, 0\n" - "._94:\n" - " .word gSharedMem\n" - " .word gUnknown_Debug_083C4F94\n" - " .word 0x19b\n" - " .word gPokemonStorage+0x4\n" - "\n" - ); -} - -__attribute__((naked)) -void TayaDebugMenu_8091190() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r3, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r3, r0\n" - " beq ._96 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r3, r0\n" - " beq ._97 @cond_branch\n" - " ldr r2, ._99\n" - " ldr r1, ._99 + 4\n" - " ldr r0, ._99 + 8\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x18\n" - " asr r0, r0, #0x18\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, [r0]\n" - " lsl r0, r3, #0x3\n" - " add r0, r0, r1\n" - " ldr r0, [r0, #0x4]\n" - " str r0, [r2]\n" - "._106:\n" - " mov r0, #0x0\n" - " b ._98\n" - "._100:\n" - " .align 2, 0\n" - "._99:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_83C5068\n" - " .word unk_2030224\n" - "._96:\n" - " ldr r3, ._107\n" - " ldrb r4, [r3]\n" - " ldr r2, ._107 + 4\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " add r5, r3, #0\n" - " cmp r0, #0\n" - " beq ._102 @cond_branch\n" - " sub r0, r4, #1\n" - " strb r0, [r5]\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bge ._102 @cond_branch\n" - " mov r0, #0x1\n" - " strb r0, [r5]\n" - "._102:\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._104 @cond_branch\n" - " ldrb r0, [r5]\n" - " add r0, r0, #0x1\n" - " strb r0, [r5]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bls ._104 @cond_branch\n" - " mov r0, #0x0\n" - " strb r0, [r5]\n" - "._104:\n" - " lsl r0, r4, #0x18\n" - " asr r0, r0, #0x18\n" - " mov r1, #0x0\n" - " ldrsb r1, [r5, r1]\n" - " cmp r0, r1\n" - " beq ._106 @cond_branch\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xb\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r4, ._107 + 8\n" - " mov r0, #0x0\n" - " ldrsb r0, [r5, r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r4\n" - " ldrb r2, [r0, #0x4]\n" - " ldr r3, [r0]\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " ldrsb r0, [r5, r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r4\n" - " ldrb r3, [r0, #0x4]\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xa\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl InitMenu\n" - " b ._106\n" - "._108:\n" - " .align 2, 0\n" - "._107:\n" - " .word unk_2030224\n" - " .word gMain\n" - " .word gUnknown_Debug_83C5068\n" - "._97:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._98:\n" - " add sp, sp, #0x8\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void InitTayaDebugWindow() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " ldr r1, ._109\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xb\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._109 + 4\n" - " ldr r3, [r0]\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xa\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._109 + 8\n" - " ldr r0, ._109 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._110:\n" - " .align 2, 0\n" - "._109:\n" - " .word unk_2030224\n" - " .word gUnknown_Debug_83C5068\n" - " .word gMenuCallback\n" - " .word TayaDebugMenu_8091190+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80912D8() -{ - asm( - " push {lr}\n" - " ldr r0, ._113\n" - " ldrb r1, [r0, #0x7]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._111 @cond_branch\n" - " mov r0, #0x0\n" - " b ._112\n" - "._114:\n" - " .align 2, 0\n" - "._113:\n" - " .word gPaletteFade\n" - "._111:\n" - " ldr r0, ._115\n" - " bl SetMainCallback2\n" - " mov r0, #0x1\n" - "._112:\n" - " pop {r1}\n" - " bx r1\n" - "._116:\n" - " .align 2, 0\n" - "._115:\n" - " .word debug_sub_8110F28+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8091300() -{ - asm( - " push {lr}\n" - " mov r0, #0x1\n" - " mov r1, #0x0\n" - " bl FadeScreen\n" - " ldr r1, ._117\n" - " ldr r0, ._117 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "._118:\n" - " .align 2, 0\n" - "._117:\n" - " .word gMenuCallback\n" - " .word debug_sub_80912D8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8091320() -{ - asm( - " push {lr}\n" - " bl LoadOam\n" - " bl ProcessSpriteCopyRequests\n" - " bl TransferPlttBuffer\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8091334() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " ldr r3, ._123\n" - " add r0, r3, #0\n" - " add r0, r0, #0x52\n" - " ldrb r4, [r0]\n" - " cmp r4, #0\n" - " beq ._119 @cond_branch\n" - " cmp r4, #0x1\n" - " bne ._120 @cond_branch\n" - " b ._121\n" - "._120:\n" - " b ._162\n" - "._124:\n" - " .align 2, 0\n" - "._123:\n" - " .word gSharedMem\n" - "._119:\n" - " add r5, r3, #0\n" - " add r5, r5, #0x55\n" - " strb r4, [r5]\n" - " ldr r2, ._131\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " mov r9, r2\n" - " cmp r0, #0\n" - " beq ._126 @cond_branch\n" - " add r1, r3, #0\n" - " add r1, r1, #0x54\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._126 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x1\n" - " strb r0, [r5]\n" - "._126:\n" - " mov r0, r9\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " ldr r5, ._131 + 4\n" - " cmp r0, #0\n" - " beq ._133 @cond_branch\n" - " add r0, r5, #0\n" - " add r0, r0, #0x53\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x2\n" - " beq ._128 @cond_branch\n" - " add r1, r5, #0\n" - " add r1, r1, #0x54\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x4\n" - " bhi ._133 @cond_branch\n" - " b ._130\n" - "._132:\n" - " .align 2, 0\n" - "._131:\n" - " .word gMain\n" - " .word gSharedMem\n" - "._128:\n" - " add r1, r5, #0\n" - " add r1, r1, #0x54\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x3\n" - " bhi ._133 @cond_branch\n" - "._130:\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " add r1, r1, #0x1\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - "._133:\n" - " mov r2, r9\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._135 @cond_branch\n" - " add r1, r5, #0\n" - " add r1, r1, #0x53\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._135 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " add r1, r1, #0x2\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - "._135:\n" - " mov r3, r9\n" - " ldrh r1, [r3, #0x2e]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._140 @cond_branch\n" - " add r0, r5, #0\n" - " add r0, r0, #0x54\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x5\n" - " beq ._137 @cond_branch\n" - " add r1, r5, #0\n" - " add r1, r1, #0x53\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x1\n" - " bhi ._140 @cond_branch\n" - " b ._139\n" - "._137:\n" - " add r1, r5, #0\n" - " add r1, r1, #0x53\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._140 @cond_branch\n" - "._139:\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " add r1, r1, #0x2\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - "._140:\n" - " add r0, r5, #0\n" - " add r0, r0, #0x55\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " bne ._141 @cond_branch\n" - " mov r0, r9\n" - " ldrh r2, [r0, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._142 @cond_branch\n" - " ldr r2, ._145\n" - " add r3, r5, #0\n" - " add r3, r3, #0x53\n" - " add r0, r5, #0\n" - " add r0, r0, #0x54\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r1\n" - " ldrb r3, [r3]\n" - " add r0, r0, r3\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r2\n" - " ldrh r0, [r0, #0x4]\n" - " sub r0, r0, #0x32\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0x4\n" - " bhi ._143 @cond_branch\n" - " add r1, r5, #0\n" - " add r1, r1, #0x56\n" - " mov r0, #0x4\n" - " b ._144\n" - "._146:\n" - " .align 2, 0\n" - "._145:\n" - " .word gUnknown_Debug_083C50EC\n" - "._143:\n" - " add r1, r5, #0\n" - " add r1, r1, #0x56\n" - " mov r0, #0x1\n" - "._144:\n" - " strb r0, [r1]\n" - " add r1, r5, #0\n" - " add r1, r1, #0x52\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " b ._162\n" - "._142:\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._148 @cond_branch\n" - " b ._162\n" - "._148:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x10\n" - " mov r2, #0x0\n" - " bl BlendPalettes\n" - " ldr r0, ._151\n" - " bl SetMainCallback2\n" - " b ._162\n" - "._152:\n" - " .align 2, 0\n" - "._151:\n" - " .word sub_80546F0+1\n" - "._121:\n" - " add r5, r3, #0\n" - " add r5, r5, #0x55\n" - " mov r0, #0x0\n" - " strb r0, [r5]\n" - " ldr r2, ._159\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " mov r9, r2\n" - " cmp r0, #0\n" - " beq ._154 @cond_branch\n" - " add r2, r3, #0\n" - " add r2, r2, #0x53\n" - " add r0, r3, #0\n" - " add r0, r0, #0x54\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r1\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " add r2, r0, r3\n" - " add r0, r3, #0\n" - " add r0, r0, #0x56\n" - " ldrb r1, [r2]\n" - " ldrb r0, [r0]\n" - " cmp r1, r0\n" - " bcs ._154 @cond_branch\n" - " add r0, r1, #1\n" - " strb r0, [r2]\n" - " strb r4, [r5]\n" - "._154:\n" - " mov r2, r9\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " ldr r5, ._159 + 4\n" - " cmp r0, #0\n" - " beq ._156 @cond_branch\n" - " add r2, r5, #0\n" - " add r2, r2, #0x53\n" - " add r0, r5, #0\n" - " add r0, r0, #0x54\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r1\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " add r1, r0, r5\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._156 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " add r1, r5, #0\n" - " add r1, r1, #0x55\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - "._156:\n" - " add r6, r5, #0\n" - " add r0, r6, #0\n" - " add r0, r0, #0x55\n" - " ldrb r7, [r0]\n" - " cmp r7, #0\n" - " beq ._157 @cond_branch\n" - "._141:\n" - " bl debug_sub_80916AC\n" - " b ._162\n" - "._160:\n" - " .align 2, 0\n" - "._159:\n" - " .word gMain\n" - " .word gSharedMem\n" - "._157:\n" - " mov r3, r9\n" - " ldrh r1, [r3, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._161 @cond_branch\n" - " ldr r0, ._164\n" - " ldr r1, ._164 + 4\n" - " mov ip, r1\n" - " mov r2, #0x53\n" - " add r2, r2, r6\n" - " mov r8, r2\n" - " add r4, r6, #0\n" - " add r4, r4, #0x54\n" - " ldrb r2, [r4]\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r2\n" - " mov r3, r8\n" - " ldrb r3, [r3]\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, ip\n" - " ldrh r1, [r1, #0x4]\n" - " bl GetMonData\n" - " ldrb r2, [r4]\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r2\n" - " mov r2, r8\n" - " ldrb r2, [r2]\n" - " add r1, r1, r2\n" - " add r1, r1, r6\n" - " strb r0, [r1]\n" - " bl debug_sub_80916AC\n" - " add r0, r6, #0\n" - " add r0, r0, #0x52\n" - " strb r7, [r0]\n" - "._161:\n" - " mov r3, r9\n" - " ldrh r1, [r3, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._162 @cond_branch\n" - " ldr r2, ._164 + 4\n" - " add r0, r6, #0\n" - " add r0, r0, #0x53\n" - " ldrb r4, [r0]\n" - " add r0, r0, #0x1\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x1\n" - " add r3, r0, r1\n" - " add r0, r3, r4\n" - " lsl r0, r0, #0x3\n" - " add r1, r0, r2\n" - " ldrh r0, [r1, #0x4]\n" - " cmp r0, #0\n" - " beq ._163 @cond_branch\n" - " ldr r0, ._164\n" - " ldrh r1, [r1, #0x4]\n" - " add r2, r4, r6\n" - " add r2, r3, r2\n" - " bl SetMonData\n" - "._163:\n" - " add r0, r5, #0\n" - " add r0, r0, #0x52\n" - " strb r7, [r0]\n" - "._162:\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._165:\n" - " .align 2, 0\n" - "._164:\n" - " .word gPlayerParty\n" - " .word gUnknown_Debug_083C50EC\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80915BC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " ldr r0, ._168\n" - " mov r1, #0x0\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " mov r1, #0x0\n" - " ldr r0, ._168 + 4\n" - " mov r8, r0\n" - " ldr r7, ._168 + 8\n" - "._171:\n" - " mov r4, #0x0\n" - " lsl r0, r1, #0x1\n" - " add r6, r1, #1\n" - " add r5, r0, r1\n" - "._170:\n" - " add r0, r5, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r8\n" - " ldrh r1, [r0, #0x4]\n" - " cmp r1, #0\n" - " beq ._166 @cond_branch\n" - " ldr r0, ._168 + 12\n" - " bl GetMonData\n" - " add r1, r4, r5\n" - " add r1, r1, r7\n" - " strb r0, [r1]\n" - " b ._167\n" - "._169:\n" - " .align 2, 0\n" - "._168:\n" - " .word 0x4000010\n" - " .word gUnknown_Debug_083C50EC\n" - " .word gSharedMem\n" - " .word gPlayerParty\n" - "._166:\n" - " add r0, r4, r5\n" - " add r0, r0, r7\n" - " strb r1, [r0]\n" - "._167:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x2\n" - " bls ._170 @cond_branch\n" - " lsl r0, r6, #0x18\n" - " lsr r1, r0, #0x18\n" - " cmp r1, #0x5\n" - " bls ._171 @cond_branch\n" - " ldr r4, ._172\n" - " add r0, r4, #0\n" - " bl Text_LoadWindowTemplate\n" - " add r0, r4, #0\n" - " bl InitMenuWindow\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x3\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._172 + 4\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " mov r1, #0x4\n" - " mov r2, #0x1d\n" - " mov r3, #0x11\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x0\n" - " mov r1, #0x12\n" - " mov r2, #0x1d\n" - " mov r3, #0x15\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r1, #0x80\n" - " lsl r1, r1, #0x13\n" - " mov r2, #0x8a\n" - " lsl r2, r2, #0x5\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r2, ._172 + 8\n" - " add r0, r2, #0\n" - " add r0, r0, #0x53\n" - " mov r1, #0x0\n" - " strb r1, [r0]\n" - " add r0, r0, #0x1\n" - " strb r1, [r0]\n" - " sub r0, r0, #0x2\n" - " strb r1, [r0]\n" - " bl debug_sub_80916AC\n" - " ldr r0, ._172 + 12\n" - " bl SetVBlankCallback\n" - " ldr r0, ._172 + 16\n" - " bl SetMainCallback2\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._173:\n" - " .align 2, 0\n" - "._172:\n" - " .word gWindowTemplate_81E7224\n" - " .word gUnknown_Debug_083C517C\n" - " .word gSharedMem\n" - " .word debug_sub_8091320+1\n" - " .word debug_sub_8091334+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_80916AC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " mov r6, #0x0\n" - " ldr r0, ._177\n" - " mov sl, r0\n" - " mov r1, #0x0\n" - " mov r8, r1\n" - "._182:\n" - " ldr r2, ._177 + 4\n" - " mov r5, #0x0\n" - " lsl r0, r6, #0x1\n" - " mov r9, r0\n" - " add r1, r6, #1\n" - " str r1, [sp]\n" - "._181:\n" - " mov r0, sl\n" - " add r0, r0, #0x53\n" - " ldrb r0, [r0]\n" - " cmp r0, r5\n" - " bne ._175 @cond_branch\n" - " ldr r1, ._177 + 8\n" - " ldrb r0, [r1]\n" - " cmp r0, r6\n" - " bne ._175 @cond_branch\n" - " mov r0, #0xef\n" - " b ._176\n" - "._178:\n" - " .align 2, 0\n" - "._177:\n" - " .word gSharedMem\n" - " .word gSharedMem+0x12\n" - " .word gSharedMem+0x54\n" - "._175:\n" - " mov r0, r8\n" - " strb r0, [r2]\n" - " add r2, r2, #0x1\n" - "._176:\n" - " strb r0, [r2]\n" - " add r2, r2, #0x1\n" - " mov r1, r9\n" - " add r4, r1, r6\n" - " add r0, r4, r5\n" - " lsl r0, r0, #0x3\n" - " ldr r1, ._183\n" - " add r0, r0, r1\n" - " ldr r1, [r0]\n" - " add r0, r2, #0\n" - " bl StringCopy\n" - " add r2, r0, #0\n" - " mov r0, r8\n" - " strb r0, [r2]\n" - " add r2, r2, #0x1\n" - " ldr r7, ._183 + 4\n" - " add r4, r5, r4\n" - " add r4, r4, r7\n" - " ldrb r1, [r4]\n" - " add r0, r2, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " add r2, r0, #0\n" - " mov r1, r8\n" - " strb r1, [r2]\n" - " add r2, r2, #0x1\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x2\n" - " bhi ._179 @cond_branch\n" - " cmp r6, #0x5\n" - " bne ._181 @cond_branch\n" - " cmp r5, #0x2\n" - " bne ._181 @cond_branch\n" - "._179:\n" - " sub r1, r2, #1\n" - " mov r0, #0xff\n" - " strb r0, [r1]\n" - " mov r2, r9\n" - " add r2, r2, #0x5\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " add r0, r7, #0\n" - " add r0, r0, #0x12\n" - " mov r1, #0x1\n" - " bl Menu_PrintText\n" - " ldr r1, [sp]\n" - " lsl r0, r1, #0x18\n" - " lsr r6, r0, #0x18\n" - " cmp r6, #0x5\n" - " bls ._182 @cond_branch\n" - " add sp, sp, #0x4\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._184:\n" - " .align 2, 0\n" - "._183:\n" - " .word gUnknown_Debug_083C50EC\n" - " .word gSharedMem\n" - "\n" - ); -} - #endif diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 8451a104d..c3616797e 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -17,8639 +17,4 @@ BSS_DATA u8 gDebug_0300071F = 0; BSS_DATA u8 gDebug_03000720 = 0; BSS_DATA u8 gDebug_03000721 = 0; -__attribute__((naked)) -void InitTomomichiDebugWindow() -{ - asm( - " push {lr}\n" - " bl debug_sub_808B874\n" - " mov r0, #0x0\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808B868() -{ - asm( - " push {lr}\n" - " bl c2_exit_to_overworld_1_continue_scripts_restart_music\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808B874() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xd\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._1\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " ldr r0, ._1 + 4\n" - " ldrb r0, [r0]\n" - " str r0, [sp]\n" - " mov r0, #0xc\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._1 + 8\n" - " ldr r0, ._1 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._2:\n" - " .align 2, 0\n" - "._1:\n" - " .word gUnknown_Debug_083C0CBA\n" - " .word gDebug_0300071D\n" - " .word gMenuCallback\n" - " .word debug_sub_808B8C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808B8C8() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._7\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._3 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._7 + 4\n" - " strb r0, [r1]\n" - "._3:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._4 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._7 + 4\n" - " strb r0, [r1]\n" - "._4:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._5 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._7 + 8\n" - " ldr r0, ._7 + 4\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r1, r1, #0x4\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " b ._10\n" - "._8:\n" - " .align 2, 0\n" - "._7:\n" - " .word gMain\n" - " .word gDebug_0300071D\n" - " .word gUnknown_Debug_083C0CBA\n" - "._5:\n" - " mov r0, #0xa\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._9 @cond_branch\n" - " mov r0, #0x0\n" - " b ._10\n" - "._9:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._10:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_ContestGraphics() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x14\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._11\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r3, ._11 + 4\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " mov r2, #0x4\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x13\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x4\n" - " bl InitMenu\n" - " ldr r1, ._11 + 8\n" - " ldr r0, ._11 + 12\n" - " str r0, [r1]\n" - " ldr r0, ._11 + 16\n" - " mov r2, #0x1\n" - " strh r2, [r0]\n" - " ldr r1, ._11 + 20\n" - " ldr r0, ._11 + 24\n" - " str r0, [r1]\n" - " ldr r0, ._11 + 28\n" - " str r4, [r0]\n" - " ldr r0, ._11 + 32\n" - " strb r2, [r0]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._12:\n" - " .align 2, 0\n" - "._11:\n" - " .word gUnknown_Debug_083C0CF4\n" - " .word gUnknown_Debug_083C0D2C\n" - " .word gMenuCallback\n" - " .word debug_sub_808BC48+1\n" - " .word gDebug_03000700\n" - " .word gDebug_03000704\n" - " .word 0x6f33\n" - " .word gDebug_03000708\n" - " .word gDebug_0300070C\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_ArtMusGraphics() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x14\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._13\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r3, ._13 + 4\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " mov r2, #0x4\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x13\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x4\n" - " bl InitMenu\n" - " ldr r1, ._13 + 8\n" - " ldr r0, ._13 + 12\n" - " str r0, [r1]\n" - " ldr r0, ._13 + 16\n" - " mov r2, #0x1\n" - " strh r2, [r0]\n" - " ldr r1, ._13 + 20\n" - " ldr r0, ._13 + 24\n" - " str r0, [r1]\n" - " ldr r0, ._13 + 28\n" - " str r4, [r0]\n" - " ldr r0, ._13 + 32\n" - " strb r2, [r0]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._14:\n" - " .align 2, 0\n" - "._13:\n" - " .word gUnknown_Debug_083C0D4C\n" - " .word gUnknown_Debug_083C0D83\n" - " .word gMenuCallback\n" - " .word debug_sub_808BCBC+1\n" - " .word gDebug_03000700\n" - " .word gDebug_03000704\n" - " .word 0x6f33\n" - " .word gDebug_03000708\n" - " .word gDebug_0300070D\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_PreviewData() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x14\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._15\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r3, ._15 + 4\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " mov r2, #0x4\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x13\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x4\n" - " bl InitMenu\n" - " ldr r1, ._15 + 8\n" - " ldr r0, ._15 + 12\n" - " str r0, [r1]\n" - " ldr r0, ._15 + 16\n" - " mov r2, #0x1\n" - " strh r2, [r0]\n" - " ldr r1, ._15 + 20\n" - " ldr r0, ._15 + 24\n" - " str r0, [r1]\n" - " ldr r0, ._15 + 28\n" - " str r4, [r0]\n" - " ldr r0, ._15 + 32\n" - " strb r2, [r0]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._16:\n" - " .align 2, 0\n" - "._15:\n" - " .word gUnknown_Debug_083C0DA4\n" - " .word gUnknown_Debug_083C0DD4\n" - " .word gMenuCallback\n" - " .word debug_sub_808BD30+1\n" - " .word gDebug_03000700\n" - " .word gDebug_03000704\n" - " .word 0x6f33\n" - " .word gDebug_03000708\n" - " .word gDebug_0300070E\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_TrickHouse() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._17\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r3, ._17 + 4\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " ldr r0, ._17 + 8\n" - " ldrb r0, [r0]\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r1, ._17 + 12\n" - " ldr r0, ._17 + 16\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._18:\n" - " .align 2, 0\n" - "._17:\n" - " .word gUnknown_Debug_083C0DF4\n" - " .word gUnknown_Debug_083C0E15\n" - " .word gDebug_0300071E\n" - " .word gMenuCallback\n" - " .word debug_sub_808BDA4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_ControlEvents() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._19\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " ldr r0, ._19 + 4\n" - " ldrb r0, [r0]\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r1, ._19 + 8\n" - " ldr r0, ._19 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._20:\n" - " .align 2, 0\n" - "._19:\n" - " .word gUnknown_Debug_083C0E32\n" - " .word gDebug_0300071F\n" - " .word gMenuCallback\n" - " .word debug_sub_808BE2C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_ControlFlags() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._21\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " ldr r0, ._21 + 4\n" - " ldrb r0, [r0]\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._21 + 8\n" - " ldr r0, ._21 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._22:\n" - " .align 2, 0\n" - "._21:\n" - " .word gUnknown_Debug_083C0E7F\n" - " .word gDebug_03000720\n" - " .word gMenuCallback\n" - " .word debug_sub_808BEB4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_ControlWorks() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._23\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x6\n" - " bl Menu_PrintItems\n" - " ldr r0, ._23 + 4\n" - " ldrb r0, [r0]\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " ldr r1, ._23 + 8\n" - " ldr r0, ._23 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._24:\n" - " .align 2, 0\n" - "._23:\n" - " .word gUnknown_Debug_083C0EF1\n" - " .word gDebug_03000721\n" - " .word gMenuCallback\n" - " .word debug_sub_808BF3C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808BC48() -{ - asm( - " push {r4, lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " asr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._25 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._26 @cond_branch\n" - " cmp r0, #0\n" - " beq ._27 @cond_branch\n" - " b ._32\n" - "._26:\n" - " cmp r0, #0x2\n" - " beq ._29 @cond_branch\n" - " b ._32\n" - "._27:\n" - " bl debug_sub_808ED0C\n" - " b ._32\n" - "._25:\n" - " bl debug_sub_808ED9C\n" - " b ._32\n" - "._29:\n" - " bl debug_sub_808EE3C\n" - "._32:\n" - " mov r0, #0x0\n" - " bl debug_sub_808EF8C\n" - " lsl r0, r4, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._36 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._34 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " b ._35\n" - "._34:\n" - " cmp r1, #0x3\n" - " bne ._36 @cond_branch\n" - " ldr r0, ._37\n" - " ldr r1, ._37 + 4\n" - " ldr r1, [r1, #0x1c]\n" - " str r1, [r0]\n" - "._36:\n" - " mov r0, #0x0\n" - "._35:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._38:\n" - " .align 2, 0\n" - "._37:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C0D2C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808BCBC() -{ - asm( - " push {r4, lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " asr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._39 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._40 @cond_branch\n" - " cmp r0, #0\n" - " beq ._41 @cond_branch\n" - " b ._46\n" - "._40:\n" - " cmp r0, #0x2\n" - " beq ._43 @cond_branch\n" - " b ._46\n" - "._41:\n" - " bl debug_sub_808ED0C\n" - " b ._46\n" - "._39:\n" - " bl debug_sub_808ED9C\n" - " b ._46\n" - "._43:\n" - " bl debug_sub_808EE9C\n" - "._46:\n" - " mov r0, #0x1\n" - " bl debug_sub_808EF8C\n" - " lsl r0, r4, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._50 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._48 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " b ._49\n" - "._48:\n" - " cmp r1, #0x3\n" - " bne ._50 @cond_branch\n" - " ldr r0, ._51\n" - " ldr r1, ._51 + 4\n" - " ldr r1, [r1, #0x1c]\n" - " str r1, [r0]\n" - "._50:\n" - " mov r0, #0x0\n" - "._49:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._52:\n" - " .align 2, 0\n" - "._51:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C0D83\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808BD30() -{ - asm( - " push {r4, lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " asr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._53 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._54 @cond_branch\n" - " cmp r0, #0\n" - " beq ._55 @cond_branch\n" - " b ._60\n" - "._54:\n" - " cmp r0, #0x2\n" - " beq ._57 @cond_branch\n" - " b ._60\n" - "._55:\n" - " bl debug_sub_808ED0C\n" - " b ._60\n" - "._53:\n" - " bl debug_sub_808ED9C\n" - " b ._60\n" - "._57:\n" - " bl debug_sub_808EF14\n" - "._60:\n" - " mov r0, #0x2\n" - " bl debug_sub_808EF8C\n" - " lsl r0, r4, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._64 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._62 @cond_branch\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " b ._63\n" - "._62:\n" - " cmp r1, #0x3\n" - " bne ._64 @cond_branch\n" - " ldr r0, ._65\n" - " ldr r1, ._65 + 4\n" - " ldr r1, [r1, #0x1c]\n" - " str r1, [r0]\n" - "._64:\n" - " mov r0, #0x0\n" - "._63:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._66:\n" - " .align 2, 0\n" - "._65:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C0DD4\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808BDA4() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._71\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._67 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._71 + 4\n" - " strb r0, [r1]\n" - "._67:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._68 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._71 + 4\n" - " strb r0, [r1]\n" - "._68:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._69 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._71 + 8\n" - " ldr r0, ._71 + 4\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r1, r1, #0x4\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " b ._74\n" - "._72:\n" - " .align 2, 0\n" - "._71:\n" - " .word gMain\n" - " .word gDebug_0300071E\n" - " .word gUnknown_Debug_083C0E15\n" - "._69:\n" - " mov r0, #0xa\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._73 @cond_branch\n" - " mov r0, #0x0\n" - " b ._74\n" - "._73:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._74:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808BE2C() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._79\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._75 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._79 + 4\n" - " strb r0, [r1]\n" - "._75:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._76 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._79 + 4\n" - " strb r0, [r1]\n" - "._76:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._77 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._79 + 8\n" - " ldr r0, ._79 + 4\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r1, r1, #0x4\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " b ._82\n" - "._80:\n" - " .align 2, 0\n" - "._79:\n" - " .word gMain\n" - " .word gDebug_0300071F\n" - " .word gUnknown_Debug_083C0E32\n" - "._77:\n" - " mov r0, #0xa\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._81 @cond_branch\n" - " mov r0, #0x0\n" - " b ._82\n" - "._81:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._82:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808BEB4() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._87\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._83 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._87 + 4\n" - " strb r0, [r1]\n" - "._83:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._84 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._87 + 4\n" - " strb r0, [r1]\n" - "._84:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._85 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._87 + 8\n" - " ldr r0, ._87 + 4\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r1, r1, #0x4\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " b ._90\n" - "._88:\n" - " .align 2, 0\n" - "._87:\n" - " .word gMain\n" - " .word gDebug_03000720\n" - " .word gUnknown_Debug_083C0E7F\n" - "._85:\n" - " mov r0, #0xa\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._89 @cond_branch\n" - " mov r0, #0x0\n" - " b ._90\n" - "._89:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._90:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808BF3C() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._95\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._91 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._95 + 4\n" - " strb r0, [r1]\n" - "._91:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._92 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " bl Menu_MoveCursor\n" - " ldr r1, ._95 + 4\n" - " strb r0, [r1]\n" - "._92:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._93 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._95 + 8\n" - " ldr r0, ._95 + 4\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r1, r1, #0x4\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " b ._98\n" - "._96:\n" - " .align 2, 0\n" - "._95:\n" - " .word gMain\n" - " .word gDebug_03000721\n" - " .word gUnknown_Debug_083C0EF1\n" - "._93:\n" - " mov r0, #0xa\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._97 @cond_branch\n" - " mov r0, #0x0\n" - " b ._98\n" - "._97:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._98:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808BFC4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._99\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._99 + 4\n" - " ldr r0, ._99 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._100:\n" - " .align 2, 0\n" - "._99:\n" - " .word gUnknown_Debug_083C0F79\n" - " .word gMenuCallback\n" - " .word debug_sub_808C064+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C014() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._101\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x6\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " ldr r1, ._101 + 4\n" - " ldr r0, ._101 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._102:\n" - " .align 2, 0\n" - "._101:\n" - " .word gUnknown_Debug_083C0FFC\n" - " .word gMenuCallback\n" - " .word debug_sub_808C0A8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C064() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._103 @cond_branch\n" - " mov r0, #0x0\n" - " b ._106\n" - "._103:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._105 @cond_branch\n" - " ldr r2, ._107\n" - " ldr r0, ._107 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._106\n" - "._108:\n" - " .align 2, 0\n" - "._107:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C0F79\n" - "._105:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._106:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C0A8() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._109 @cond_branch\n" - " mov r0, #0x0\n" - " b ._112\n" - "._109:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._111 @cond_branch\n" - " ldr r2, ._113\n" - " ldr r0, ._113 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._112\n" - "._114:\n" - " .align 2, 0\n" - "._113:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C0FFC\n" - "._111:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._112:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C0EC() -{ - asm( - " push {lr}\n" - " ldr r0, ._115\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._116:\n" - " .align 2, 0\n" - "._115:\n" - " .word DebugScript_081C1CFE\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C104() -{ - asm( - " push {lr}\n" - " ldr r0, ._117\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._118:\n" - " .align 2, 0\n" - "._117:\n" - " .word DebugScript_081C1D07\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C11C() -{ - asm( - " push {lr}\n" - " ldr r0, ._119\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._120:\n" - " .align 2, 0\n" - "._119:\n" - " .word DebugScript_081C1D1E\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C134() -{ - asm( - " push {lr}\n" - " ldr r0, ._121\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._122:\n" - " .align 2, 0\n" - "._121:\n" - " .word DebugScript_081C1D24\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C14C() -{ - asm( - " push {lr}\n" - " ldr r0, ._123\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._124:\n" - " .align 2, 0\n" - "._123:\n" - " .word DebugScript_081C1D2A\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C164() -{ - asm( - " push {lr}\n" - " ldr r0, ._125\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._126:\n" - " .align 2, 0\n" - "._125:\n" - " .word DebugScript_081C1D35\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C17C() -{ - asm( - " push {lr}\n" - " ldr r0, ._127\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._128:\n" - " .align 2, 0\n" - "._127:\n" - " .word DebugScript_081C1D46\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C194() -{ - asm( - " push {lr}\n" - " ldr r0, ._129\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._130:\n" - " .align 2, 0\n" - "._129:\n" - " .word DebugScript_081C221F\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C1AC() -{ - asm( - " push {lr}\n" - " ldr r0, ._131\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._132:\n" - " .align 2, 0\n" - "._131:\n" - " .word DebugScript_081C23E2\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C1C4() -{ - asm( - " push {lr}\n" - " ldr r0, ._133\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._134:\n" - " .align 2, 0\n" - "._133:\n" - " .word DebugScript_081C23E6\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C1DC() -{ - asm( - " push {lr}\n" - " ldr r0, ._135\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._136:\n" - " .align 2, 0\n" - "._135:\n" - " .word DebugScript_081C23F6\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C1F4() -{ - asm( - " push {lr}\n" - " ldr r0, ._137\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._138:\n" - " .align 2, 0\n" - "._137:\n" - " .word DebugScript_081C2482\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C20C() -{ - asm( - " push {lr}\n" - " ldr r0, ._139\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._140:\n" - " .align 2, 0\n" - "._139:\n" - " .word DebugScript_081C23FD\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C224() -{ - asm( - " push {lr}\n" - " ldr r0, ._141\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._142:\n" - " .align 2, 0\n" - "._141:\n" - " .word DebugScript_081C2518\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C23C() -{ - asm( - " push {lr}\n" - " ldr r0, ._143\n" - " bl ScriptContext1_SetupScript\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._144:\n" - " .align 2, 0\n" - "._143:\n" - " .word DebugScript_081C2507\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_ContestGraphics_Show() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._145\n" - " ldr r0, ._145 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x4\n" - " pop {r1}\n" - " bx r1\n" - "._146:\n" - " .align 2, 0\n" - "._145:\n" - " .word gMenuCallback\n" - " .word debug_sub_808C280+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C280() -{ - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._147 @cond_branch\n" - " mov r0, #0x0\n" - " b ._148\n" - "._147:\n" - " bl CloseMenu\n" - " mov r0, #0x0\n" - " bl debug_sub_808F168\n" - " ldr r0, ._149\n" - " bl SetMainCallback2\n" - " ldr r1, ._149 + 4\n" - " ldr r0, ._149 + 8\n" - " str r0, [r1, #0x8]\n" - " mov r0, #0x1\n" - "._148:\n" - " pop {r1}\n" - " bx r1\n" - "._150:\n" - " .align 2, 0\n" - "._149:\n" - " .word CB2_ContestPainting+1\n" - " .word gMain\n" - " .word debug_sub_808B868+1\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_MuseumGraphics_Show() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._151\n" - " ldr r0, ._151 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x4\n" - " pop {r1}\n" - " bx r1\n" - "._152:\n" - " .align 2, 0\n" - "._151:\n" - " .word gMenuCallback\n" - " .word debug_sub_808C2E4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C2E4() -{ - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._153 @cond_branch\n" - " mov r0, #0x0\n" - " b ._154\n" - "._153:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " bl debug_sub_808F168\n" - " ldr r0, ._155\n" - " bl SetMainCallback2\n" - " ldr r1, ._155 + 4\n" - " ldr r0, ._155 + 8\n" - " str r0, [r1, #0x8]\n" - " mov r0, #0x1\n" - "._154:\n" - " pop {r1}\n" - " bx r1\n" - "._156:\n" - " .align 2, 0\n" - "._155:\n" - " .word CB2_ContestPainting+1\n" - " .word gMain\n" - " .word debug_sub_808B868+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C31C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._157\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._157 + 4\n" - " ldr r0, ._157 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._158:\n" - " .align 2, 0\n" - "._157:\n" - " .word gUnknown_Debug_083C2828\n" - " .word gMenuCallback\n" - " .word debug_sub_808C36C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C36C() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._159 @cond_branch\n" - " mov r0, #0x0\n" - " b ._162\n" - "._159:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._161 @cond_branch\n" - " ldr r2, ._163\n" - " ldr r0, ._163 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._162\n" - "._164:\n" - " .align 2, 0\n" - "._163:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C2828\n" - "._161:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._162:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C3B0() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._165\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r0, ._165 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._165 + 8\n" - " ldr r0, ._165 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._166:\n" - " .align 2, 0\n" - "._165:\n" - " .word gUnknown_Debug_083C2938\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C408() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._167\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._167 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._167 + 8\n" - " ldr r0, ._167 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._168:\n" - " .align 2, 0\n" - "._167:\n" - " .word gUnknown_Debug_083C2A48\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C460() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._169\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._169 + 4\n" - " mov r0, #0x2\n" - " strb r0, [r1]\n" - " ldr r1, ._169 + 8\n" - " ldr r0, ._169 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._170:\n" - " .align 2, 0\n" - "._169:\n" - " .word gUnknown_Debug_083C2B4C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C4B8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._171\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._171 + 4\n" - " mov r0, #0x3\n" - " strb r0, [r1]\n" - " ldr r1, ._171 + 8\n" - " ldr r0, ._171 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._172:\n" - " .align 2, 0\n" - "._171:\n" - " .word gUnknown_Debug_083C2C80\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C510() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._173\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._173 + 4\n" - " mov r0, #0x4\n" - " strb r0, [r1]\n" - " ldr r1, ._173 + 8\n" - " ldr r0, ._173 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._174:\n" - " .align 2, 0\n" - "._173:\n" - " .word gUnknown_Debug_083C2D8C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C568() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._175\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._175 + 4\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " ldr r1, ._175 + 8\n" - " ldr r0, ._175 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._176:\n" - " .align 2, 0\n" - "._175:\n" - " .word gUnknown_Debug_083C2EB0\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C5C0() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._177\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._177 + 4\n" - " mov r0, #0x6\n" - " strb r0, [r1]\n" - " ldr r1, ._177 + 8\n" - " ldr r0, ._177 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._178:\n" - " .align 2, 0\n" - "._177:\n" - " .word gUnknown_Debug_083C2FE0\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C618() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._179\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._179 + 4\n" - " mov r0, #0x7\n" - " strb r0, [r1]\n" - " ldr r1, ._179 + 8\n" - " ldr r0, ._179 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._180:\n" - " .align 2, 0\n" - "._179:\n" - " .word gUnknown_Debug_083C3100\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C670() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._181\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x3\n" - " bl InitMenu\n" - " ldr r1, ._181 + 4\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " ldr r1, ._181 + 8\n" - " ldr r0, ._181 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._182:\n" - " .align 2, 0\n" - "._181:\n" - " .word gUnknown_Debug_083C3194\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808C6C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C6C8() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._186\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808C714\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808C764\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._183 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._184 @cond_branch\n" - "._183:\n" - " mov r0, #0x0\n" - " b ._185\n" - "._187:\n" - " .align 2, 0\n" - "._186:\n" - " .word gDebug_0300070F\n" - "._184:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._185:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C714() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._191\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._190 @cond_branch\n" - " ldr r0, ._191 + 4\n" - " lsl r1, r2, #0x3\n" - " add r1, r1, r2\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r0\n" - " ldrh r4, [r1]\n" - " add r0, r4, #0\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._189 @cond_branch\n" - " add r0, r4, #0\n" - " bl FlagSet\n" - " b ._190\n" - "._192:\n" - " .align 2, 0\n" - "._191:\n" - " .word gMain\n" - " .word gUnknown_Debug_83C31E6\n" - "._189:\n" - " add r0, r4, #0\n" - " bl FlagClear\n" - "._190:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C764() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._195\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._193 @cond_branch\n" - " ldr r0, ._195 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._194:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " neg r2, r0\n" - " orr r2, r2, r0\n" - " lsr r2, r2, #0x1f\n" - " mov r0, #0x1c\n" - " add r1, r4, #0\n" - " bl debug_sub_808F2E0\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._194 @cond_branch\n" - "._193:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._196:\n" - " .align 2, 0\n" - "._195:\n" - " .word gUnknown_Debug_083C31DC\n" - " .word gUnknown_Debug_83C31E6\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C7C8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._197\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._197 + 4\n" - " ldr r0, ._197 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._198:\n" - " .align 2, 0\n" - "._197:\n" - " .word gUnknown_Debug_083C1CE8\n" - " .word gMenuCallback\n" - " .word debug_sub_808C818+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C818() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._199 @cond_branch\n" - " mov r0, #0x0\n" - " b ._202\n" - "._199:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._201 @cond_branch\n" - " ldr r2, ._203\n" - " ldr r0, ._203 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._202\n" - "._204:\n" - " .align 2, 0\n" - "._203:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C1CE8\n" - "._201:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._202:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C85C() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._205\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r0, ._205 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._205 + 8\n" - " ldr r0, ._205 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._206:\n" - " .align 2, 0\n" - "._205:\n" - " .word gUnknown_Debug_083C1E0C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C8B4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._207\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._207 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._207 + 8\n" - " ldr r0, ._207 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._208:\n" - " .align 2, 0\n" - "._207:\n" - " .word gUnknown_Debug_083C1F38\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C90C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._209\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._209 + 4\n" - " mov r0, #0x2\n" - " strb r0, [r1]\n" - " ldr r1, ._209 + 8\n" - " ldr r0, ._209 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._210:\n" - " .align 2, 0\n" - "._209:\n" - " .word gUnknown_Debug_083C206C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C964() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._211\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._211 + 4\n" - " mov r0, #0x3\n" - " strb r0, [r1]\n" - " ldr r1, ._211 + 8\n" - " ldr r0, ._211 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._212:\n" - " .align 2, 0\n" - "._211:\n" - " .word gUnknown_Debug_083C2190\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808C9BC() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._213\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x6\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " ldr r1, ._213 + 4\n" - " mov r0, #0x4\n" - " strb r0, [r1]\n" - " ldr r1, ._213 + 8\n" - " ldr r0, ._213 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._214:\n" - " .align 2, 0\n" - "._213:\n" - " .word gUnknown_Debug_083C2264\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CA14() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._215\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._215 + 4\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " ldr r1, ._215 + 8\n" - " ldr r0, ._215 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._216:\n" - " .align 2, 0\n" - "._215:\n" - " .word gUnknown_Debug_083C2370\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CA6C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._217\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._217 + 4\n" - " mov r0, #0x6\n" - " strb r0, [r1]\n" - " ldr r1, ._217 + 8\n" - " ldr r0, ._217 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._218:\n" - " .align 2, 0\n" - "._217:\n" - " .word gUnknown_Debug_083C248C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CAC4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._219\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._219 + 4\n" - " mov r0, #0x7\n" - " strb r0, [r1]\n" - " ldr r1, ._219 + 8\n" - " ldr r0, ._219 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._220:\n" - " .align 2, 0\n" - "._219:\n" - " .word gUnknown_Debug_083C259C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CB1C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._221\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._221 + 4\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " ldr r1, ._221 + 8\n" - " ldr r0, ._221 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._222:\n" - " .align 2, 0\n" - "._221:\n" - " .word gUnknown_Debug_083C26C8\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CB74+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CB74() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._226\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808CBC0\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808CC10\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._223 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._224 @cond_branch\n" - "._223:\n" - " mov r0, #0x0\n" - " b ._225\n" - "._227:\n" - " .align 2, 0\n" - "._226:\n" - " .word gDebug_0300070F\n" - "._224:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._225:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CBC0() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._231\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._230 @cond_branch\n" - " ldr r0, ._231 + 4\n" - " lsl r1, r2, #0x3\n" - " add r1, r1, r2\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r0\n" - " ldrh r4, [r1]\n" - " add r0, r4, #0\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._229 @cond_branch\n" - " add r0, r4, #0\n" - " bl FlagSet\n" - " b ._230\n" - "._232:\n" - " .align 2, 0\n" - "._231:\n" - " .word gMain\n" - " .word gUnknown_Debug_083C271A\n" - "._229:\n" - " add r0, r4, #0\n" - " bl FlagClear\n" - "._230:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CC10() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._235\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._233 @cond_branch\n" - " ldr r0, ._235 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._234:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " neg r2, r0\n" - " orr r2, r2, r0\n" - " lsr r2, r2, #0x1f\n" - " mov r0, #0x1c\n" - " add r1, r4, #0\n" - " bl debug_sub_808F2E0\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._234 @cond_branch\n" - "._233:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._236:\n" - " .align 2, 0\n" - "._235:\n" - " .word gUnknown_Debug_083C2710\n" - " .word gUnknown_Debug_083C271A\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CC74() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._237\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x3\n" - " bl InitMenu\n" - " ldr r1, ._237 + 4\n" - " ldr r0, ._237 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._238:\n" - " .align 2, 0\n" - "._237:\n" - " .word gUnknown_Debug_083C1ADC\n" - " .word gMenuCallback\n" - " .word debug_sub_808CCC4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CCC4() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._239 @cond_branch\n" - " mov r0, #0x0\n" - " b ._242\n" - "._239:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._241 @cond_branch\n" - " ldr r2, ._243\n" - " ldr r0, ._243 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._242\n" - "._244:\n" - " .align 2, 0\n" - "._243:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C1ADC\n" - "._241:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._242:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CD08() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x11\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._245\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x8\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x8\n" - " bl InitMenu\n" - " ldr r0, ._245 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._245 + 8\n" - " ldr r0, ._245 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._246:\n" - " .align 2, 0\n" - "._245:\n" - " .word gUnknown_Debug_083C1B7C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CE10+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CD60() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._247\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x4\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x4\n" - " bl InitMenu\n" - " ldr r1, ._247 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._247 + 8\n" - " ldr r0, ._247 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._248:\n" - " .align 2, 0\n" - "._247:\n" - " .word gUnknown_Debug_083C1BF0\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CE10+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CDB8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x3\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._249\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl InitMenu\n" - " ldr r1, ._249 + 4\n" - " mov r0, #0x2\n" - " strb r0, [r1]\n" - " ldr r1, ._249 + 8\n" - " ldr r0, ._249 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._250:\n" - " .align 2, 0\n" - "._249:\n" - " .word gUnknown_Debug_083C1C2C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808CE10+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CE10() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._254\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808CE5C\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808CEAC\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._251 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._252 @cond_branch\n" - "._251:\n" - " mov r0, #0x0\n" - " b ._253\n" - "._255:\n" - " .align 2, 0\n" - "._254:\n" - " .word gDebug_0300070F\n" - "._252:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._253:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CE5C() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._259\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._258 @cond_branch\n" - " ldr r0, ._259 + 4\n" - " lsl r1, r2, #0x3\n" - " add r1, r1, r2\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r0\n" - " ldrh r4, [r1]\n" - " add r0, r4, #0\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._257 @cond_branch\n" - " add r0, r4, #0\n" - " bl FlagSet\n" - " b ._258\n" - "._260:\n" - " .align 2, 0\n" - "._259:\n" - " .word gMain\n" - " .word gUnknown_Debug_083C1C38\n" - "._257:\n" - " add r0, r4, #0\n" - " bl FlagClear\n" - "._258:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CEAC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._263\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._261 @cond_branch\n" - " ldr r0, ._263 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._262:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " neg r2, r0\n" - " orr r2, r2, r0\n" - " lsr r2, r2, #0x1f\n" - " mov r0, #0x1c\n" - " add r1, r4, #0\n" - " bl debug_sub_808F2E0\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._262 @cond_branch\n" - "._261:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._264:\n" - " .align 2, 0\n" - "._263:\n" - " .word gUnknown_Debug_083C1C34\n" - " .word gUnknown_Debug_083C1C38\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CF10() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._265\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._265 + 4\n" - " ldr r0, ._265 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._266:\n" - " .align 2, 0\n" - "._265:\n" - " .word gUnknown_Debug_083C1330\n" - " .word gMenuCallback\n" - " .word debug_sub_808CF60+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CF60() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._267 @cond_branch\n" - " mov r0, #0x0\n" - " b ._270\n" - "._267:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._269 @cond_branch\n" - " ldr r2, ._271\n" - " ldr r0, ._271 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._270\n" - "._272:\n" - " .align 2, 0\n" - "._271:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C1330\n" - "._269:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._270:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CFA4() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x11\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._273\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x8\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x8\n" - " bl InitMenu\n" - " ldr r0, ._273 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._273 + 8\n" - " ldr r0, ._273 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._274:\n" - " .align 2, 0\n" - "._273:\n" - " .word gUnknown_Debug_083C13D8\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808CFFC() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._275\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._275 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._275 + 8\n" - " ldr r0, ._275 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._276:\n" - " .align 2, 0\n" - "._275:\n" - " .word gUnknown_Debug_083C1465\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D054() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._277\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._277 + 4\n" - " mov r0, #0x2\n" - " strb r0, [r1]\n" - " ldr r1, ._277 + 8\n" - " ldr r0, ._277 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._278:\n" - " .align 2, 0\n" - "._277:\n" - " .word gUnknown_Debug_083C1503\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D0AC() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._279\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x4\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x4\n" - " bl InitMenu\n" - " ldr r1, ._279 + 4\n" - " mov r0, #0x3\n" - " strb r0, [r1]\n" - " ldr r1, ._279 + 8\n" - " ldr r0, ._279 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._280:\n" - " .align 2, 0\n" - "._279:\n" - " .word gUnknown_Debug_083C158A\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D104() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._281\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._281 + 4\n" - " mov r0, #0x4\n" - " strb r0, [r1]\n" - " ldr r1, ._281 + 8\n" - " ldr r0, ._281 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._282:\n" - " .align 2, 0\n" - "._281:\n" - " .word gUnknown_Debug_083C1647\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D15C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._283\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._283 + 4\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " ldr r1, ._283 + 8\n" - " ldr r0, ._283 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._284:\n" - " .align 2, 0\n" - "._283:\n" - " .word gUnknown_Debug_083C1712\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D1B4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._285\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._285 + 4\n" - " mov r0, #0x6\n" - " strb r0, [r1]\n" - " ldr r1, ._285 + 8\n" - " ldr r0, ._285 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._286:\n" - " .align 2, 0\n" - "._285:\n" - " .word gUnknown_Debug_083C17F8\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D20C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._287\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._287 + 4\n" - " mov r0, #0x7\n" - " strb r0, [r1]\n" - " ldr r1, ._287 + 8\n" - " ldr r0, ._287 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._288:\n" - " .align 2, 0\n" - "._287:\n" - " .word gUnknown_Debug_083C18B8\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D264() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._289\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x5\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl InitMenu\n" - " ldr r1, ._289 + 4\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " ldr r1, ._289 + 8\n" - " ldr r0, ._289 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._290:\n" - " .align 2, 0\n" - "._289:\n" - " .word gDebug_0x83C1974\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D2BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D2BC() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._294\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808D308\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808D358\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._291 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._292 @cond_branch\n" - "._291:\n" - " mov r0, #0x0\n" - " b ._293\n" - "._295:\n" - " .align 2, 0\n" - "._294:\n" - " .word gDebug_0300070F\n" - "._292:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._293:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D308() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._299\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._298 @cond_branch\n" - " ldr r0, ._299 + 4\n" - " lsl r1, r2, #0x3\n" - " add r1, r1, r2\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r0\n" - " ldrh r4, [r1]\n" - " add r0, r4, #0\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._297 @cond_branch\n" - " add r0, r4, #0\n" - " bl FlagSet\n" - " b ._298\n" - "._300:\n" - " .align 2, 0\n" - "._299:\n" - " .word gMain\n" - " .word gUnknown_Debug_083C19C6\n" - "._297:\n" - " add r0, r4, #0\n" - " bl FlagClear\n" - "._298:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D358() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._303\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._301 @cond_branch\n" - " ldr r0, ._303 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._302:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " neg r2, r0\n" - " orr r2, r2, r0\n" - " lsr r2, r2, #0x1f\n" - " mov r0, #0x1c\n" - " add r1, r4, #0\n" - " bl debug_sub_808F2E0\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._302 @cond_branch\n" - "._301:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._304:\n" - " .align 2, 0\n" - "._303:\n" - " .word gUnknown_Debug_083C19BC\n" - " .word gUnknown_Debug_083C19C6\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D3BC() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._305\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r1, ._305 + 4\n" - " ldr r0, ._305 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._306:\n" - " .align 2, 0\n" - "._305:\n" - " .word gUnknown_Debug_083C105C\n" - " .word gMenuCallback\n" - " .word debug_sub_808D40C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D40C() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._307 @cond_branch\n" - " mov r0, #0x0\n" - " b ._310\n" - "._307:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._309 @cond_branch\n" - " ldr r2, ._311\n" - " ldr r0, ._311 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._310\n" - "._312:\n" - " .align 2, 0\n" - "._311:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C105C\n" - "._309:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._310:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D450() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._313\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r0, ._313 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._313 + 8\n" - " ldr r0, ._313 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._314:\n" - " .align 2, 0\n" - "._313:\n" - " .word gUnknown_Debug_083C10BD\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D500+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D4A8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._315\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._315 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._315 + 8\n" - " ldr r0, ._315 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._316:\n" - " .align 2, 0\n" - "._315:\n" - " .word gUnknown_Debug_083C1149\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D500+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D500() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._320\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808D54C\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808D59C\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._317 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._318 @cond_branch\n" - "._317:\n" - " mov r0, #0x0\n" - " b ._319\n" - "._321:\n" - " .align 2, 0\n" - "._320:\n" - " .word gDebug_0300070F\n" - "._318:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._319:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D54C() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._325\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._324 @cond_branch\n" - " ldr r0, ._325 + 4\n" - " lsl r1, r2, #0x3\n" - " add r1, r1, r2\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r0\n" - " ldrh r4, [r1]\n" - " add r0, r4, #0\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._323 @cond_branch\n" - " add r0, r4, #0\n" - " bl FlagSet\n" - " b ._324\n" - "._326:\n" - " .align 2, 0\n" - "._325:\n" - " .word gMain\n" - " .word gUnknown_Debug_083C1196\n" - "._323:\n" - " add r0, r4, #0\n" - " bl FlagClear\n" - "._324:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D59C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._329\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._327 @cond_branch\n" - " ldr r0, ._329 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._328:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " neg r2, r0\n" - " orr r2, r2, r0\n" - " lsr r2, r2, #0x1f\n" - " mov r0, #0x1c\n" - " add r1, r4, #0\n" - " bl debug_sub_808F2E0\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._328 @cond_branch\n" - "._327:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._330:\n" - " .align 2, 0\n" - "._329:\n" - " .word gUnknown_Debug_083C1194\n" - " .word gUnknown_Debug_083C1196\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D600() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._331\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r1, ._331 + 4\n" - " ldr r0, ._331 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._332:\n" - " .align 2, 0\n" - "._331:\n" - " .word gUnknown_Debug_083C11CC\n" - " .word gMenuCallback\n" - " .word debug_sub_808D650+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D650() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._333 @cond_branch\n" - " mov r0, #0x0\n" - " b ._336\n" - "._333:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._335 @cond_branch\n" - " ldr r2, ._337\n" - " ldr r0, ._337 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._336\n" - "._338:\n" - " .align 2, 0\n" - "._337:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C11CC\n" - "._335:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._336:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D694() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._339\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r0, ._339 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._339 + 8\n" - " ldr r0, ._339 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._340:\n" - " .align 2, 0\n" - "._339:\n" - " .word gUnknown_Debug_083C1212\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D744+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D6EC() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._341\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._341 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._341 + 8\n" - " ldr r0, ._341 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._342:\n" - " .align 2, 0\n" - "._341:\n" - " .word gUnknown_Debug_083C1288\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D744+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D744() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._346\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808D790\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808D7E0\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._343 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._344 @cond_branch\n" - "._343:\n" - " mov r0, #0x0\n" - " b ._345\n" - "._347:\n" - " .align 2, 0\n" - "._346:\n" - " .word gDebug_0300070F\n" - "._344:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._345:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D790() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._351\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._350 @cond_branch\n" - " ldr r0, ._351 + 4\n" - " lsl r1, r2, #0x3\n" - " add r1, r1, r2\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r0\n" - " ldrh r4, [r1]\n" - " add r0, r4, #0\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._349 @cond_branch\n" - " add r0, r4, #0\n" - " bl FlagSet\n" - " b ._350\n" - "._352:\n" - " .align 2, 0\n" - "._351:\n" - " .word gMain\n" - " .word gUnknown_Debug_083C12D2\n" - "._349:\n" - " add r0, r4, #0\n" - " bl FlagClear\n" - "._350:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D7E0() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._355\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._353 @cond_branch\n" - " ldr r0, ._355 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._354:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " neg r2, r0\n" - " orr r2, r2, r0\n" - " lsr r2, r2, #0x1f\n" - " mov r0, #0x1c\n" - " add r1, r4, #0\n" - " bl debug_sub_808F2E0\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._354 @cond_branch\n" - "._353:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._356:\n" - " .align 2, 0\n" - "._355:\n" - " .word gUnknown_Debug_083C12D0\n" - " .word gUnknown_Debug_083C12D2\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D844() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1c\n" - " mov r3, #0x3\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._357\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1b\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl InitMenu\n" - " ldr r1, ._357 + 4\n" - " ldr r0, ._357 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._358:\n" - " .align 2, 0\n" - "._357:\n" - " .word gUnknown_Debug_083C1A78\n" - " .word gMenuCallback\n" - " .word debug_sub_808D894+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D894() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r3, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r3, r0\n" - " bne ._359 @cond_branch\n" - " mov r0, #0x0\n" - " b ._362\n" - "._359:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r3, r0\n" - " beq ._361 @cond_branch\n" - " ldr r2, ._363\n" - " ldr r1, ._363 + 4\n" - " lsl r0, r3, #0x3\n" - " add r0, r0, r1\n" - " ldr r0, [r0, #0x4]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._362\n" - "._364:\n" - " .align 2, 0\n" - "._363:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C1A78\n" - "._361:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._362:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D8D8() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._365\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r0, ._365 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._365 + 8\n" - " ldr r0, ._365 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._366:\n" - " .align 2, 0\n" - "._365:\n" - " .word gUnknown_Debug_083C1A9C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808D930+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D930() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._370\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808D97C\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808D9CC\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._367 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._368 @cond_branch\n" - "._367:\n" - " mov r0, #0x0\n" - " b ._369\n" - "._371:\n" - " .align 2, 0\n" - "._370:\n" - " .word gDebug_0300070F\n" - "._368:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._369:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D97C() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._375\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._374 @cond_branch\n" - " ldr r0, ._375 + 4\n" - " lsl r1, r2, #0x3\n" - " add r1, r1, r2\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r0\n" - " ldrh r4, [r1]\n" - " add r0, r4, #0\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._373 @cond_branch\n" - " add r0, r4, #0\n" - " bl FlagSet\n" - " b ._374\n" - "._376:\n" - " .align 2, 0\n" - "._375:\n" - " .word gMain\n" - " .word gUnknown_Debug_083C1AAE\n" - "._373:\n" - " add r0, r4, #0\n" - " bl FlagClear\n" - "._374:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808D9CC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._379\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._377 @cond_branch\n" - " ldr r0, ._379 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._378:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl FlagGet\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " neg r2, r0\n" - " orr r2, r2, r0\n" - " lsr r2, r2, #0x1f\n" - " mov r0, #0x1c\n" - " add r1, r4, #0\n" - " bl debug_sub_808F2E0\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._378 @cond_branch\n" - "._377:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._380:\n" - " .align 2, 0\n" - "._379:\n" - " .word gUnknown_Debug_083C1AAC\n" - " .word gUnknown_Debug_083C1AAE\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DA30() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x3\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._381\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl InitMenu\n" - " ldr r1, ._381 + 4\n" - " ldr r0, ._381 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._382:\n" - " .align 2, 0\n" - "._381:\n" - " .word gUnknown_Debug_083C103A\n" - " .word gMenuCallback\n" - " .word debug_sub_808DA80+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DA80() -{ - asm( - " push {r4, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " bl debug_sub_808DAD4\n" - " bl debug_sub_808DABC\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._383 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._384 @cond_branch\n" - "._383:\n" - " mov r0, #0x0\n" - " b ._385\n" - "._384:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._385:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DABC() -{ - asm( - " push {lr}\n" - " ldr r0, ._386\n" - " ldrh r2, [r0]\n" - " mov r0, #0x18\n" - " mov r1, #0x1\n" - " bl debug_sub_808F31C\n" - " pop {r0}\n" - " bx r0\n" - "._387:\n" - " .align 2, 0\n" - "._386:\n" - " .word gSpecialVar_Result\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DAD4() -{ - asm( - " push {lr}\n" - " ldr r0, ._390\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._388 @cond_branch\n" - " mov r2, #0x1\n" - " b ._389\n" - "._391:\n" - " .align 2, 0\n" - "._390:\n" - " .word gMain\n" - "._388:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._392 @cond_branch\n" - " ldr r2, ._393\n" - "._389:\n" - " ldr r1, ._393 + 4\n" - " ldrh r0, [r1]\n" - " add r0, r2, r0\n" - " strh r0, [r1]\n" - "._392:\n" - " pop {r0}\n" - " bx r0\n" - "._394:\n" - " .align 2, 0\n" - "._393:\n" - " .word 0xffff\n" - " .word gSpecialVar_Result\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DB0C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._395\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._395 + 4\n" - " ldr r0, ._395 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._396:\n" - " .align 2, 0\n" - "._395:\n" - " .word gUnknown_Debug_083C3D08\n" - " .word gMenuCallback\n" - " .word debug_sub_808DB5C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DB5C() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._397 @cond_branch\n" - " mov r0, #0x0\n" - " b ._400\n" - "._397:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._399 @cond_branch\n" - " ldr r2, ._401\n" - " ldr r0, ._401 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._400\n" - "._402:\n" - " .align 2, 0\n" - "._401:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C3D08\n" - "._399:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._400:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DBA0() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x11\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._403\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x8\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x8\n" - " bl InitMenu\n" - " ldr r0, ._403 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._403 + 8\n" - " ldr r0, ._403 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._404:\n" - " .align 2, 0\n" - "._403:\n" - " .word gUnknown_Debug_083C432C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DBF8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._405\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._405 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._405 + 8\n" - " ldr r0, ._405 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._406:\n" - " .align 2, 0\n" - "._405:\n" - " .word gUnknown_Debug_083C436C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DC50() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._407\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._407 + 4\n" - " mov r0, #0x2\n" - " strb r0, [r1]\n" - " ldr r1, ._407 + 8\n" - " ldr r0, ._407 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._408:\n" - " .align 2, 0\n" - "._407:\n" - " .word gUnknown_Debug_083C43B4\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DCA8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._409\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._409 + 4\n" - " mov r0, #0x3\n" - " strb r0, [r1]\n" - " ldr r1, ._409 + 8\n" - " ldr r0, ._409 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._410:\n" - " .align 2, 0\n" - "._409:\n" - " .word gUnknown_Debug_083C43FC\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DD00() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._411\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._411 + 4\n" - " mov r0, #0x4\n" - " strb r0, [r1]\n" - " ldr r1, ._411 + 8\n" - " ldr r0, ._411 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._412:\n" - " .align 2, 0\n" - "._411:\n" - " .word gUnknown_Debug_083C4444\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DD58() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._413\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._413 + 4\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " ldr r1, ._413 + 8\n" - " ldr r0, ._413 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._414:\n" - " .align 2, 0\n" - "._413:\n" - " .word gUnknown_Debug_083C448C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DDB0() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._415\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x6\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " ldr r1, ._415 + 4\n" - " mov r0, #0x6\n" - " strb r0, [r1]\n" - " ldr r1, ._415 + 8\n" - " ldr r0, ._415 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._416:\n" - " .align 2, 0\n" - "._415:\n" - " .word gUnknown_Debug_83C44C4\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DE08() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._417\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._417 + 4\n" - " mov r0, #0x7\n" - " strb r0, [r1]\n" - " ldr r1, ._417 + 8\n" - " ldr r0, ._417 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._418:\n" - " .align 2, 0\n" - "._417:\n" - " .word gUnknown_Debug_83C44EC\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DE60() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._419\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._419 + 4\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " ldr r1, ._419 + 8\n" - " ldr r0, ._419 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._420:\n" - " .align 2, 0\n" - "._419:\n" - " .word gUnknown_Debug_083C4534\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808DEB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DEB8() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._424\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808DF64\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808DF04\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._421 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._422 @cond_branch\n" - "._421:\n" - " mov r0, #0x0\n" - " b ._423\n" - "._425:\n" - " .align 2, 0\n" - "._424:\n" - " .word gDebug_0300070F\n" - "._422:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._423:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DF04() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._428\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._426 @cond_branch\n" - " ldr r0, ._428 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._427:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl VarGet\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x10\n" - " lsr r2, r2, #0x10\n" - " mov r0, #0x18\n" - " add r1, r4, #0\n" - " bl debug_sub_808F31C\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._427 @cond_branch\n" - "._426:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._429:\n" - " .align 2, 0\n" - "._428:\n" - " .word gUnknown_Debug_083C457C\n" - " .word gUnknown_Debug_083C4586\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DF64() -{ - asm( - " push {r4, r5, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._432\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._430 @cond_branch\n" - " mov r5, #0x1\n" - " b ._431\n" - "._433:\n" - " .align 2, 0\n" - "._432:\n" - " .word gMain\n" - "._430:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._434 @cond_branch\n" - " ldr r5, ._435\n" - "._431:\n" - " ldr r1, ._435 + 4\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " add r0, r0, r3\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r1\n" - " ldrh r4, [r0]\n" - " add r0, r4, #0\n" - " bl VarGet\n" - " add r1, r0, #0\n" - " add r1, r5, r1\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " bl VarSet\n" - "._434:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._436:\n" - " .align 2, 0\n" - "._435:\n" - " .word 0xffff\n" - " .word gUnknown_Debug_083C4586\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808DFC0() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._437\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x6\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " ldr r1, ._437 + 4\n" - " ldr r0, ._437 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._438:\n" - " .align 2, 0\n" - "._437:\n" - " .word gUnknown_Debug_083C377C\n" - " .word gMenuCallback\n" - " .word debug_sub_808E010+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E010() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._439 @cond_branch\n" - " mov r0, #0x0\n" - " b ._442\n" - "._439:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._441 @cond_branch\n" - " ldr r2, ._443\n" - " ldr r0, ._443 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._442\n" - "._444:\n" - " .align 2, 0\n" - "._443:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C377C\n" - "._441:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._442:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E054() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._445\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x6\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " ldr r0, ._445 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._445 + 8\n" - " ldr r0, ._445 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._446:\n" - " .align 2, 0\n" - "._445:\n" - " .word gUnknown_Debug_083C3AA0\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E264+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E0AC() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._447\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x5\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl InitMenu\n" - " ldr r1, ._447 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._447 + 8\n" - " ldr r0, ._447 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._448:\n" - " .align 2, 0\n" - "._447:\n" - " .word gUnknown_Debug_83C3AE0\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E264+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E104() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._449\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._449 + 4\n" - " mov r0, #0x2\n" - " strb r0, [r1]\n" - " ldr r1, ._449 + 8\n" - " ldr r0, ._449 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._450:\n" - " .align 2, 0\n" - "._449:\n" - " .word gUnknown_Debug_83C3B28\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E264+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E15C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._451\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r1, ._451 + 4\n" - " mov r0, #0x3\n" - " strb r0, [r1]\n" - " ldr r1, ._451 + 8\n" - " ldr r0, ._451 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._452:\n" - " .align 2, 0\n" - "._451:\n" - " .word gUnknown_Debug_83C3B70\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E264+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E1B4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._453\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._453 + 4\n" - " mov r0, #0x4\n" - " strb r0, [r1]\n" - " ldr r1, ._453 + 8\n" - " ldr r0, ._453 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._454:\n" - " .align 2, 0\n" - "._453:\n" - " .word gUnknown_Debug_83C3BB8\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E264+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E20C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._455\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x6\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " ldr r1, ._455 + 4\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " ldr r1, ._455 + 8\n" - " ldr r0, ._455 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._456:\n" - " .align 2, 0\n" - "._455:\n" - " .word gUnknown_Debug_83C3C00\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E264+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E264() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._460\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808E310\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808E2B0\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._457 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._458 @cond_branch\n" - "._457:\n" - " mov r0, #0x0\n" - " b ._459\n" - "._461:\n" - " .align 2, 0\n" - "._460:\n" - " .word gDebug_0300070F\n" - "._458:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._459:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E2B0() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._464\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._462 @cond_branch\n" - " ldr r0, ._464 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._463:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl VarGet\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x10\n" - " lsr r2, r2, #0x10\n" - " mov r0, #0x18\n" - " add r1, r4, #0\n" - " bl debug_sub_808F31C\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._463 @cond_branch\n" - "._462:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._465:\n" - " .align 2, 0\n" - "._464:\n" - " .word gUnknown_Debug_083C3C48\n" - " .word gUnknown_Debug_83C3C4E\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E310() -{ - asm( - " push {r4, r5, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._468\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._466 @cond_branch\n" - " mov r5, #0x1\n" - " b ._467\n" - "._469:\n" - " .align 2, 0\n" - "._468:\n" - " .word gMain\n" - "._466:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._470 @cond_branch\n" - " ldr r5, ._471\n" - "._467:\n" - " ldr r1, ._471 + 4\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " add r0, r0, r3\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r1\n" - " ldrh r4, [r0]\n" - " add r0, r4, #0\n" - " bl VarGet\n" - " add r1, r0, #0\n" - " add r1, r5, r1\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " bl VarSet\n" - "._470:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._472:\n" - " .align 2, 0\n" - "._471:\n" - " .word 0xffff\n" - " .word gUnknown_Debug_83C3C4E\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E36C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._473\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x5\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl InitMenu\n" - " ldr r1, ._473 + 4\n" - " ldr r0, ._473 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._474:\n" - " .align 2, 0\n" - "._473:\n" - " .word gUnknown_Debug_083C32AC\n" - " .word gMenuCallback\n" - " .word debug_sub_808E3BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E3BC() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._475 @cond_branch\n" - " mov r0, #0x0\n" - " b ._478\n" - "._475:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._477 @cond_branch\n" - " ldr r2, ._479\n" - " ldr r0, ._479 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._478\n" - "._480:\n" - " .align 2, 0\n" - "._479:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C32AC\n" - "._477:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._478:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E400() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._481\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x3\n" - " bl InitMenu\n" - " ldr r0, ._481 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._481 + 8\n" - " ldr r0, ._481 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._482:\n" - " .align 2, 0\n" - "._481:\n" - " .word gUnknown_Debug_083C347C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E5B8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E458() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._483\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r1, ._483 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._483 + 8\n" - " ldr r0, ._483 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._484:\n" - " .align 2, 0\n" - "._483:\n" - " .word gUnknown_Debug_083C3494\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E5B8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E4B0() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._485\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x6\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x6\n" - " bl InitMenu\n" - " ldr r1, ._485 + 4\n" - " mov r0, #0x2\n" - " strb r0, [r1]\n" - " ldr r1, ._485 + 8\n" - " ldr r0, ._485 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._486:\n" - " .align 2, 0\n" - "._485:\n" - " .word gUnknown_Debug_083C34A4\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E5B8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E508() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._487\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r1, ._487 + 4\n" - " mov r0, #0x3\n" - " strb r0, [r1]\n" - " ldr r1, ._487 + 8\n" - " ldr r0, ._487 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._488:\n" - " .align 2, 0\n" - "._487:\n" - " .word gUnknown_Debug_083C34D4\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E5B8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E560() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._489\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x5\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x5\n" - " bl InitMenu\n" - " ldr r1, ._489 + 4\n" - " mov r0, #0x4\n" - " strb r0, [r1]\n" - " ldr r1, ._489 + 8\n" - " ldr r0, ._489 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._490:\n" - " .align 2, 0\n" - "._489:\n" - " .word gUnknown_Debug_083C351C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E5B8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E5B8() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._494\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808E604\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808E660\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._491 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._492 @cond_branch\n" - "._491:\n" - " mov r0, #0x0\n" - " b ._493\n" - "._495:\n" - " .align 2, 0\n" - "._494:\n" - " .word gDebug_0300070F\n" - "._492:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._493:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E604() -{ - asm( - " push {r4, r5, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._498\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._496 @cond_branch\n" - " mov r5, #0x1\n" - " b ._497\n" - "._499:\n" - " .align 2, 0\n" - "._498:\n" - " .word gMain\n" - "._496:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._500 @cond_branch\n" - " ldr r5, ._501\n" - "._497:\n" - " ldr r1, ._501 + 4\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " add r0, r0, r3\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r1\n" - " ldrh r4, [r0]\n" - " add r0, r4, #0\n" - " bl VarGet\n" - " add r1, r0, #0\n" - " add r1, r5, r1\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " bl VarSet\n" - "._500:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._502:\n" - " .align 2, 0\n" - "._501:\n" - " .word 0xffff\n" - " .word gUnknown_Debug_083C354A\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E660() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._505\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._503 @cond_branch\n" - " ldr r0, ._505 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._504:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl VarGet\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x10\n" - " lsr r2, r2, #0x10\n" - " mov r0, #0x18\n" - " add r1, r4, #0\n" - " bl debug_sub_808F31C\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._504 @cond_branch\n" - "._503:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._506:\n" - " .align 2, 0\n" - "._505:\n" - " .word gUnknown_Debug_083C3544\n" - " .word gUnknown_Debug_083C354A\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E6C0() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._507\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r1, ._507 + 4\n" - " ldr r0, ._507 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._508:\n" - " .align 2, 0\n" - "._507:\n" - " .word gUnknown_Debug_083C4644\n" - " .word gMenuCallback\n" - " .word debug_sub_808E710+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E710() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._509 @cond_branch\n" - " mov r0, #0x0\n" - " b ._512\n" - "._509:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._511 @cond_branch\n" - " ldr r2, ._513\n" - " ldr r0, ._513 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._512\n" - "._514:\n" - " .align 2, 0\n" - "._513:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C4644\n" - "._511:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._512:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E754() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._515\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r0, ._515 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._515 + 8\n" - " ldr r0, ._515 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._516:\n" - " .align 2, 0\n" - "._515:\n" - " .word gUnknown_Debug_083C470C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E804+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E7AC() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._517\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._517 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._517 + 8\n" - " ldr r0, ._517 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._518:\n" - " .align 2, 0\n" - "._517:\n" - " .word gUnknown_Debug_083C4754C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808E804+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E804() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._522\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808E850\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808E8AC\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._519 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._520 @cond_branch\n" - "._519:\n" - " mov r0, #0x0\n" - " b ._521\n" - "._523:\n" - " .align 2, 0\n" - "._522:\n" - " .word gDebug_0300070F\n" - "._520:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._521:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E850() -{ - asm( - " push {r4, r5, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._526\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._524 @cond_branch\n" - " mov r5, #0x1\n" - " b ._525\n" - "._527:\n" - " .align 2, 0\n" - "._526:\n" - " .word gMain\n" - "._524:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._528 @cond_branch\n" - " ldr r5, ._529\n" - "._525:\n" - " ldr r1, ._529 + 4\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " add r0, r0, r3\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r1\n" - " ldrh r4, [r0]\n" - " add r0, r4, #0\n" - " bl VarGet\n" - " add r1, r0, #0\n" - " add r1, r5, r1\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " bl VarSet\n" - "._528:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._530:\n" - " .align 2, 0\n" - "._529:\n" - " .word 0xffff\n" - " .word gUnknown_Debug_083C478E\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E8AC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._533\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._531 @cond_branch\n" - " ldr r0, ._533 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._532:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl VarGet\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x10\n" - " lsr r2, r2, #0x10\n" - " mov r0, #0x18\n" - " add r1, r4, #0\n" - " bl debug_sub_808F31C\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._532 @cond_branch\n" - "._531:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._534:\n" - " .align 2, 0\n" - "._533:\n" - " .word gUnknown_Debug_083C478C\n" - " .word gUnknown_Debug_083C478E\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E90C() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._535\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x2\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x17\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x2\n" - " bl InitMenu\n" - " ldr r1, ._535 + 4\n" - " ldr r0, ._535 + 8\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._536:\n" - " .align 2, 0\n" - "._535:\n" - " .word gUnknown_Debug_083C35C4\n" - " .word gMenuCallback\n" - " .word debug_sub_808E95C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E95C() -{ - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bne ._537 @cond_branch\n" - " mov r0, #0x0\n" - " b ._540\n" - "._537:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._539 @cond_branch\n" - " ldr r2, ._541\n" - " ldr r0, ._541 + 4\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " mov r0, #0x0\n" - " b ._540\n" - "._542:\n" - " .align 2, 0\n" - "._541:\n" - " .word gMenuCallback\n" - " .word gUnknown_Debug_083C35C4\n" - "._539:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._540:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E9A0() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._543\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintItems\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " ldr r0, ._543 + 4\n" - " strb r4, [r0]\n" - " ldr r1, ._543 + 8\n" - " ldr r0, ._543 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._544:\n" - " .align 2, 0\n" - "._543:\n" - " .word gUnknown_Debug_083C369C\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808EA50+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808E9F8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._545\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x1c\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x7\n" - " bl InitMenu\n" - " ldr r1, ._545 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._545 + 8\n" - " ldr r0, ._545 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._546:\n" - " .align 2, 0\n" - "._545:\n" - " .word gUnknown_Debug_083C36E4\n" - " .word gDebug_0300070F\n" - " .word gMenuCallback\n" - " .word debug_sub_808EA50+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EA50() -{ - asm( - " push {r4, r5, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " add r1, r0, #0\n" - " ldr r5, ._550\n" - " ldrb r0, [r5]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " bl debug_sub_808EAFC\n" - " ldrb r0, [r5]\n" - " bl debug_sub_808EA9C\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._547 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._548 @cond_branch\n" - "._547:\n" - " mov r0, #0x0\n" - " b ._549\n" - "._551:\n" - " .align 2, 0\n" - "._550:\n" - " .word gDebug_0300070F\n" - "._548:\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - "._549:\n" - " pop {r4, r5}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EA9C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " mov r5, #0x0\n" - " ldr r0, ._554\n" - " add r0, r1, r0\n" - " ldrb r2, [r0]\n" - " cmp r5, r2\n" - " bcs ._552 @cond_branch\n" - " ldr r0, ._554 + 4\n" - " mov r8, r0\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r7, r0, #0x1\n" - " add r6, r2, #0\n" - "._553:\n" - " lsl r0, r5, #0x1\n" - " add r4, r0, #1\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " add r0, r0, r7\n" - " add r0, r0, r8\n" - " ldrh r0, [r0]\n" - " bl VarGet\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x10\n" - " lsr r2, r2, #0x10\n" - " mov r0, #0x18\n" - " add r1, r4, #0\n" - " bl debug_sub_808F31C\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, r6\n" - " bcc ._553 @cond_branch\n" - "._552:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._555:\n" - " .align 2, 0\n" - "._554:\n" - " .word gUnknown_Debug_083C371C\n" - " .word gUnknown_Debug_083C371E\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EAFC() -{ - asm( - " push {r4, r5, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " ldr r0, ._558\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._556 @cond_branch\n" - " mov r5, #0x1\n" - " b ._557\n" - "._559:\n" - " .align 2, 0\n" - "._558:\n" - " .word gMain\n" - "._556:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._560 @cond_branch\n" - " ldr r5, ._561\n" - "._557:\n" - " ldr r1, ._561 + 4\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " add r0, r0, r3\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r1\n" - " ldrh r4, [r0]\n" - " add r0, r4, #0\n" - " bl VarGet\n" - " add r1, r0, #0\n" - " add r1, r5, r1\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " bl VarSet\n" - "._560:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._562:\n" - " .align 2, 0\n" - "._561:\n" - " .word 0xffff\n" - " .word gUnknown_Debug_083C371E\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EB58() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xc\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._563\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r3, ._563 + 4\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " mov r2, #0x8\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xb\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x8\n" - " bl InitMenu\n" - " ldr r1, ._563 + 8\n" - " ldr r0, ._563 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._564:\n" - " .align 2, 0\n" - "._563:\n" - " .word gUnknown_Debug_083C47B2\n" - " .word gUnknown_Debug_083C47F0\n" - " .word gMenuCallback\n" - " .word debug_sub_808EC10+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EBB4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xd\n" - " mov r3, #0xd\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._565\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r3, ._565 + 4\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " mov r2, #0x5\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0xc\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x5\n" - " bl InitMenu\n" - " ldr r1, ._565 + 8\n" - " ldr r0, ._565 + 12\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x8\n" - " pop {r1}\n" - " bx r1\n" - "._566:\n" - " .align 2, 0\n" - "._565:\n" - " .word gUnknown_Debug_083C4830\n" - " .word gUnknown_Debug_083C4888\n" - " .word gMenuCallback\n" - " .word debug_sub_808EC5C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EC10() -{ - asm( - " push {r4, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._568 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._568 @cond_branch\n" - " ldr r1, ._570\n" - " lsl r0, r2, #0x18\n" - " asr r0, r0, #0x18\n" - " ldr r2, ._570 + 4\n" - " add r1, r1, r2\n" - " strh r0, [r1]\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " b ._569\n" - "._571:\n" - " .align 2, 0\n" - "._570:\n" - " .word gSaveBlock1\n" - " .word 0x13c8\n" - "._568:\n" - " mov r0, #0x0\n" - "._569:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EC5C() -{ - asm( - " push {r4, lr}\n" - " bl Menu_ProcessInput\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl Menu_GetCursorPos\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " lsl r4, r4, #0x18\n" - " asr r4, r4, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._573 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r4, r0\n" - " beq ._573 @cond_branch\n" - " ldr r0, ._575\n" - " lsl r1, r1, #0x18\n" - " asr r1, r1, #0x8\n" - " lsr r1, r1, #0x10\n" - " bl VarSet\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " b ._574\n" - "._576:\n" - " .align 2, 0\n" - "._575:\n" - " .word 0x40a7\n" - "._573:\n" - " mov r0, #0x0\n" - "._574:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808ECA4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._577\n" - " ldr r0, ._577 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x0\n" - " add sp, sp, #0x4\n" - " pop {r1}\n" - " bx r1\n" - "._578:\n" - " .align 2, 0\n" - "._577:\n" - " .word gMenuCallback\n" - " .word debug_sub_808ECD0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808ECD0() -{ - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._579 @cond_branch\n" - " mov r0, #0x0\n" - " b ._580\n" - "._579:\n" - " bl CloseMenu\n" - " mov r0, #0x2\n" - " bl debug_sub_808F168\n" - " ldr r0, ._581\n" - " bl SetMainCallback2\n" - " ldr r1, ._581 + 4\n" - " ldr r0, ._581 + 8\n" - " str r0, [r1, #0x8]\n" - " mov r0, #0x1\n" - "._580:\n" - " pop {r1}\n" - " bx r1\n" - "._582:\n" - " .align 2, 0\n" - "._581:\n" - " .word CB2_ContestPainting+1\n" - " .word gMain\n" - " .word debug_sub_808B868+1\n" - "\n" - ); -} - -__attribute__((naked)) -void TomomichiDebugMenu_Config() -{ - asm( - " mov r0, #0x0\n" - " bx lr\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808ED0C() -{ - asm( - " push {lr}\n" - " ldr r2, ._590\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._584 @cond_branch\n" - " ldr r1, ._590 + 4\n" - " ldrh r0, [r1]\n" - " cmp r0, #0x1\n" - " beq ._584 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strh r0, [r1]\n" - "._584:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._586 @cond_branch\n" - " ldr r3, ._590 + 4\n" - " ldrh r1, [r3]\n" - " ldr r0, ._590 + 8\n" - " cmp r1, r0\n" - " beq ._586 @cond_branch\n" - " add r0, r1, #1\n" - " strh r0, [r3]\n" - "._586:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._587 @cond_branch\n" - " ldr r1, ._590 + 4\n" - " ldrh r0, [r1]\n" - " cmp r0, #0xa\n" - " bls ._588 @cond_branch\n" - " sub r0, r0, #0xa\n" - " b ._589\n" - "._591:\n" - " .align 2, 0\n" - "._590:\n" - " .word gMain\n" - " .word gDebug_03000700\n" - " .word 0x19b\n" - "._588:\n" - " mov r0, #0x1\n" - "._589:\n" - " strh r0, [r1]\n" - "._587:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._592 @cond_branch\n" - " ldr r2, ._595\n" - " ldrh r1, [r2]\n" - " ldr r0, ._595 + 4\n" - " cmp r1, r0\n" - " bhi ._593 @cond_branch\n" - " add r0, r1, #0\n" - " add r0, r0, #0xa\n" - " b ._594\n" - "._596:\n" - " .align 2, 0\n" - "._595:\n" - " .word gDebug_03000700\n" - " .word 0x191\n" - "._593:\n" - " ldr r1, ._597\n" - " add r0, r1, #0\n" - "._594:\n" - " strh r0, [r2]\n" - "._592:\n" - " pop {r0}\n" - " bx r0\n" - "._598:\n" - " .align 2, 0\n" - "._597:\n" - " .word 0x19b\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808ED9C() -{ - asm( - " push {lr}\n" - " ldr r2, ._606\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._600 @cond_branch\n" - " ldr r1, ._606 + 4\n" - " ldr r0, [r1]\n" - " cmp r0, #0\n" - " beq ._600 @cond_branch\n" - " sub r0, r0, #0x1\n" - " str r0, [r1]\n" - "._600:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._602 @cond_branch\n" - " ldr r3, ._606 + 4\n" - " ldr r1, [r3]\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._602 @cond_branch\n" - " add r0, r1, #1\n" - " str r0, [r3]\n" - "._602:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._603 @cond_branch\n" - " ldr r1, ._606 + 4\n" - " ldr r0, [r1]\n" - " cmp r0, #0xf\n" - " bls ._604 @cond_branch\n" - " sub r0, r0, #0x10\n" - " b ._605\n" - "._607:\n" - " .align 2, 0\n" - "._606:\n" - " .word gMain\n" - " .word gDebug_03000708\n" - "._604:\n" - " mov r0, #0x0\n" - "._605:\n" - " str r0, [r1]\n" - "._603:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._608 @cond_branch\n" - " ldr r3, ._611\n" - " ldr r1, [r3]\n" - " mov r0, #0x11\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " bhi ._609 @cond_branch\n" - " add r0, r1, #0\n" - " add r0, r0, #0x10\n" - " b ._610\n" - "._612:\n" - " .align 2, 0\n" - "._611:\n" - " .word gDebug_03000708\n" - "._609:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - "._610:\n" - " str r0, [r3]\n" - "._608:\n" - " ldrh r2, [r2, #0x2e]\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x2\n" - " add r0, r1, #0\n" - " and r0, r0, r2\n" - " cmp r0, r1\n" - " bne ._613 @cond_branch\n" - " ldr r1, ._614\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " str r0, [r1]\n" - "._613:\n" - " pop {r0}\n" - " bx r0\n" - "._615:\n" - " .align 2, 0\n" - "._614:\n" - " .word gDebug_03000708\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EE3C() -{ - asm( - " push {lr}\n" - " ldr r2, ._622\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._617 @cond_branch\n" - " ldr r1, ._622 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x1\n" - " beq ._617 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._617:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._619 @cond_branch\n" - " ldr r1, ._622 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x5\n" - " beq ._619 @cond_branch\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._619:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._620 @cond_branch\n" - " ldr r1, ._622 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - "._620:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._621 @cond_branch\n" - " ldr r1, ._622 + 4\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - "._621:\n" - " pop {r0}\n" - " bx r0\n" - "._623:\n" - " .align 2, 0\n" - "._622:\n" - " .word gMain\n" - " .word gDebug_0300070C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EE9C() -{ - asm( - " push {lr}\n" - " ldr r2, ._631\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._625 @cond_branch\n" - " ldr r1, ._631 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x1\n" - " beq ._625 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._625:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._627 @cond_branch\n" - " ldr r1, ._631 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0xf\n" - " beq ._627 @cond_branch\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._627:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._628 @cond_branch\n" - " ldr r1, ._631 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0xa\n" - " bls ._629 @cond_branch\n" - " sub r0, r0, #0xa\n" - " b ._630\n" - "._632:\n" - " .align 2, 0\n" - "._631:\n" - " .word gMain\n" - " .word gDebug_0300070D\n" - "._629:\n" - " mov r0, #0x0\n" - "._630:\n" - " strb r0, [r1]\n" - "._628:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._633 @cond_branch\n" - " ldr r1, ._636\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x5\n" - " bhi ._634 @cond_branch\n" - " add r0, r0, #0xa\n" - " b ._635\n" - "._637:\n" - " .align 2, 0\n" - "._636:\n" - " .word gDebug_0300070D\n" - "._634:\n" - " mov r0, #0xf\n" - "._635:\n" - " strb r0, [r1]\n" - "._633:\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EF14() -{ - asm( - " push {lr}\n" - " ldr r2, ._645\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._639 @cond_branch\n" - " ldr r1, ._645 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x1\n" - " beq ._639 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._639:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._641 @cond_branch\n" - " ldr r1, ._645 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0xf\n" - " beq ._641 @cond_branch\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._641:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._642 @cond_branch\n" - " ldr r1, ._645 + 4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0xa\n" - " bls ._643 @cond_branch\n" - " sub r0, r0, #0xa\n" - " b ._644\n" - "._646:\n" - " .align 2, 0\n" - "._645:\n" - " .word gMain\n" - " .word gDebug_0300070E\n" - "._643:\n" - " mov r0, #0x0\n" - "._644:\n" - " strb r0, [r1]\n" - "._642:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._647 @cond_branch\n" - " ldr r1, ._650\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x5\n" - " bhi ._648 @cond_branch\n" - " add r0, r0, #0xa\n" - " b ._649\n" - "._651:\n" - " .align 2, 0\n" - "._650:\n" - " .word gDebug_0300070E\n" - "._648:\n" - " mov r0, #0xf\n" - "._649:\n" - " strb r0, [r1]\n" - "._647:\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808EF8C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " cmp r6, #0x2\n" - " bgt ._653 @cond_branch\n" - " cmp r6, #0\n" - " blt ._653 @cond_branch\n" - " mov r3, #0x0\n" - " ldr r0, ._656\n" - " mov r8, r0\n" - " ldr r4, ._656 + 4\n" - " mov r7, #0x7\n" - " mov r5, #0xf\n" - "._658:\n" - " sub r0, r7, r3\n" - " lsl r0, r0, #0x2\n" - " mov r1, r8\n" - " ldr r2, [r1]\n" - " LSR r2, r0\n" - " and r2, r2, r5\n" - " cmp r2, #0x9\n" - " bhi ._654 @cond_branch\n" - " add r1, r3, r4\n" - " add r0, r2, #0\n" - " add r0, r0, #0xa1\n" - " b ._655\n" - "._657:\n" - " .align 2, 0\n" - "._656:\n" - " .word gDebug_03000708\n" - " .word gDebug_03000710\n" - "._654:\n" - " add r1, r3, r4\n" - " add r0, r2, #0\n" - " sub r0, r0, #0x4f\n" - "._655:\n" - " strb r0, [r1]\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - " cmp r3, #0x7\n" - " bls ._658 @cond_branch\n" - " ldr r0, ._666\n" - " mov r1, #0xff\n" - " strb r1, [r0, #0x8]\n" - " mov r1, #0xc\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - "._653:\n" - " mov r3, #0x0\n" - " ldr r7, ._666\n" - " ldr r5, ._666 + 4\n" - " ldr r2, ._666 + 8\n" - " mov r8, r2\n" - " add r4, r7, #0\n" - " mov r2, #0x0\n" - "._659:\n" - " add r1, r3, #1\n" - " add r0, r1, r4\n" - " strb r2, [r0]\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " cmp r3, #0x9\n" - " bls ._659 @cond_branch\n" - " mov r3, #0x0\n" - " ldrh r2, [r5]\n" - " mov r0, #0xb\n" - " add r1, r2, #0\n" - " mul r1, r1, r0\n" - " mov r2, r8\n" - " add r0, r1, r2\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._661 @cond_branch\n" - " ldr r0, ._666\n" - " mov ip, r0\n" - " mov r5, r8\n" - " add r4, r1, #0\n" - "._662:\n" - " add r1, r3, #1\n" - " mov r0, ip\n" - " add r2, r1, r0\n" - " add r0, r3, r4\n" - " add r0, r0, r5\n" - " ldrb r0, [r0]\n" - " strb r0, [r2]\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " add r0, r3, r4\n" - " add r0, r0, r5\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._661 @cond_branch\n" - " cmp r3, #0x9\n" - " bls ._662 @cond_branch\n" - "._661:\n" - " mov r0, #0xb1\n" - " strb r0, [r7]\n" - " mov r0, #0xb2\n" - " strb r0, [r7, #0xb]\n" - " mov r0, #0xff\n" - " strb r0, [r7, #0xc]\n" - " cmp r6, #0x2\n" - " bgt ._664 @cond_branch\n" - " cmp r6, #0\n" - " blt ._664 @cond_branch\n" - " add r0, r7, #0\n" - " mov r1, #0x8\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " b ._665\n" - "._667:\n" - " .align 2, 0\n" - "._666:\n" - " .word gDebug_03000710\n" - " .word gDebug_03000700\n" - " .word gSpeciesNames\n" - "._664:\n" - " ldr r0, ._672\n" - " mov r1, #0xc\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - "._665:\n" - " ldr r5, ._672\n" - " mov r0, #0xff\n" - " strb r0, [r5, #0x3]\n" - " ldr r4, ._672 + 4\n" - " ldrh r0, [r4]\n" - " mov r1, #0x64\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5]\n" - " ldrh r0, [r4]\n" - " mov r1, #0x64\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0xa\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x1]\n" - " ldrh r0, [r4]\n" - " mov r1, #0xa\n" - " bl __umodsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x2]\n" - " add r0, r5, #0\n" - " mov r1, #0xc\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " cmp r6, #0x1\n" - " beq ._668 @cond_branch\n" - " cmp r6, #0x1\n" - " bgt ._669 @cond_branch\n" - " cmp r6, #0\n" - " beq ._670 @cond_branch\n" - " b ._679\n" - "._673:\n" - " .align 2, 0\n" - "._672:\n" - " .word gDebug_03000710\n" - " .word gDebug_03000700\n" - "._669:\n" - " cmp r6, #0x2\n" - " beq ._674 @cond_branch\n" - " b ._679\n" - "._670:\n" - " ldr r4, ._677\n" - " b ._676\n" - "._678:\n" - " .align 2, 0\n" - "._677:\n" - " .word gDebug_0300070C\n" - "._668:\n" - " ldr r4, ._680\n" - "._676:\n" - " ldrb r0, [r4]\n" - " mov r1, #0x64\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5]\n" - " ldrb r0, [r4]\n" - " mov r1, #0x64\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0xa\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x1]\n" - " ldrb r0, [r4]\n" - " mov r1, #0xa\n" - " bl __umodsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x2]\n" - " add r0, r5, #0\n" - " mov r1, #0xc\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " b ._679\n" - "._681:\n" - " .align 2, 0\n" - "._680:\n" - " .word gDebug_0300070D\n" - "._674:\n" - " ldr r4, ._682\n" - " ldrb r0, [r4]\n" - " mov r1, #0x64\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5]\n" - " ldrb r0, [r4]\n" - " mov r1, #0x64\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0xa\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x1]\n" - " ldrb r0, [r4]\n" - " mov r1, #0xa\n" - " bl __umodsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x2]\n" - " add r0, r5, #0\n" - " mov r1, #0xc\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - "._679:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._683:\n" - " .align 2, 0\n" - "._682:\n" - " .word gDebug_0300070E\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F168() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " ldr r4, ._686\n" - " ldr r0, ._686 + 4\n" - " ldrh r0, [r0]\n" - " strh r0, [r4, #0x8]\n" - " ldr r0, ._686 + 8\n" - " ldr r0, [r0]\n" - " str r0, [r4, #0x4]\n" - " ldr r0, ._686 + 12\n" - " ldr r0, [r0]\n" - " str r0, [r4]\n" - " cmp r1, #0x5\n" - " bls ._684 @cond_branch\n" - " b ._707\n" - "._684:\n" - " lsl r0, r1, #0x2\n" - " ldr r1, ._686 + 16\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._687:\n" - " .align 2, 0\n" - "._686:\n" - " .word +0x2015de0\n" - " .word gDebug_03000700\n" - " .word gDebug_03000704\n" - " .word gDebug_03000708\n" - " .word ._688\n" - "._688:\n" - " .word ._689\n" - " .word ._690\n" - " .word ._691\n" - " .word ._692\n" - " .word ._693\n" - " .word ._694\n" - "._689:\n" - " ldr r0, ._696\n" - " ldr r2, ._696 + 4\n" - " add r1, r0, r2\n" - " mov r2, #0x0\n" - " strb r2, [r1]\n" - " ldr r1, ._696 + 8\n" - " add r0, r0, r1\n" - " strb r2, [r0]\n" - " ldr r0, ._696 + 12\n" - " ldrb r0, [r0]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r4, #0xa]\n" - " add r0, r4, #0\n" - " add r0, r0, #0x16\n" - " ldr r1, ._696 + 16\n" - " bl StringCopy\n" - " b ._704\n" - "._697:\n" - " .align 2, 0\n" - "._696:\n" - " .word +0x2000000\n" - " .word 0x15ddf\n" - " .word 0x15dde\n" - " .word gDebug_0300070C\n" - " .word gUnknown_Debug_083C48BB\n" - "._690:\n" - " ldr r1, ._699\n" - " ldr r0, ._699 + 4\n" - " add r2, r1, r0\n" - " mov r0, #0x0\n" - " strb r0, [r2]\n" - " ldr r2, ._699 + 8\n" - " add r1, r1, r2\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " ldr r0, ._699 + 12\n" - " ldrb r0, [r0]\n" - " sub r0, r0, #0x1\n" - " b ._698\n" - "._700:\n" - " .align 2, 0\n" - "._699:\n" - " .word +0x2000000\n" - " .word 0x15ddf\n" - " .word 0x15dde\n" - " .word gDebug_0300070D\n" - "._691:\n" - " ldr r1, ._702\n" - " ldr r0, ._702 + 4\n" - " add r2, r1, r0\n" - " mov r0, #0x1\n" - " strb r0, [r2]\n" - " ldr r2, ._702 + 8\n" - " add r1, r1, r2\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " ldr r0, ._702 + 12\n" - " ldrb r0, [r0]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r4, #0xa]\n" - " b ._707\n" - "._703:\n" - " .align 2, 0\n" - "._702:\n" - " .word +0x2000000\n" - " .word 0x15ddf\n" - " .word 0x15dde\n" - " .word gDebug_0300070E\n" - "._692:\n" - " ldr r1, ._705\n" - " ldr r2, ._705 + 4\n" - " add r0, r1, r2\n" - " mov r2, #0x0\n" - " strb r2, [r0]\n" - " ldr r0, ._705 + 8\n" - " add r1, r1, r0\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " strb r2, [r4, #0xa]\n" - " b ._704\n" - "._706:\n" - " .align 2, 0\n" - "._705:\n" - " .word +0x2000000\n" - " .word 0x15ddf\n" - " .word 0x15dde\n" - "._693:\n" - " ldr r1, ._708\n" - " ldr r0, ._708 + 4\n" - " add r2, r1, r0\n" - " mov r0, #0x0\n" - " strb r0, [r2]\n" - " ldr r2, ._708 + 8\n" - " add r1, r1, r2\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " mov r0, #0x3\n" - "._698:\n" - " strb r0, [r4, #0xa]\n" - "._704:\n" - " add r0, r4, #0\n" - " add r0, r0, #0xb\n" - " ldr r1, ._708 + 12\n" - " bl StringCopy\n" - " b ._707\n" - "._709:\n" - " .align 2, 0\n" - "._708:\n" - " .word +0x2000000\n" - " .word 0x15ddf\n" - " .word 0x15dde\n" - " .word gUnknown_Debug_083C48B0\n" - "._694:\n" - " ldr r1, ._710\n" - " ldr r0, ._710 + 4\n" - " add r2, r1, r0\n" - " mov r0, #0x0\n" - " strb r0, [r2]\n" - " ldr r2, ._710 + 8\n" - " add r1, r1, r2\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " mov r0, #0x9\n" - " strb r0, [r4, #0xa]\n" - " add r0, r4, #0\n" - " add r0, r0, #0xb\n" - " ldr r1, ._710 + 12\n" - " bl StringCopy\n" - "._707:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._711:\n" - " .align 2, 0\n" - "._710:\n" - " .word +0x2000000\n" - " .word 0x15ddf\n" - " .word 0x15dde\n" - " .word gUnknown_Debug_083C48B0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F2E0() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r3, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " cmp r2, #0\n" - " bne ._712 @cond_branch\n" - " ldr r1, ._714\n" - " mov r0, #0xa1\n" - " b ._713\n" - "._715:\n" - " .align 2, 0\n" - "._714:\n" - " .word gDebug_03000710\n" - "._712:\n" - " ldr r1, ._716\n" - " mov r0, #0xa2\n" - "._713:\n" - " strb r0, [r1]\n" - " mov r0, #0xff\n" - " strb r0, [r1, #0x1]\n" - " add r0, r1, #0\n" - " add r1, r4, #0\n" - " add r2, r3, #0\n" - " bl Menu_PrintText\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._717:\n" - " .align 2, 0\n" - "._716:\n" - " .word gDebug_03000710\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_808F31C() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6}\n" - " mov r8, r0\n" - " mov r9, r1\n" - " add r4, r2, #0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - " mov r0, r9\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r9, r0\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " ldr r5, ._718\n" - " ldr r6, ._718 + 4\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5]\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r6, #0xfa\n" - " lsl r6, r6, #0x2\n" - " add r1, r6, #0\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x1]\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0x64\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x2]\n" - " add r0, r4, #0\n" - " mov r1, #0x64\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0xa\n" - " bl __udivsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x3]\n" - " add r0, r4, #0\n" - " mov r1, #0xa\n" - " bl __umodsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r5, #0x4]\n" - " mov r0, #0xff\n" - " strb r0, [r5, #0x5]\n" - " add r0, r5, #0\n" - " mov r1, r8\n" - " mov r2, r9\n" - " bl Menu_PrintText\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._719:\n" - " .align 2, 0\n" - "._718:\n" - " .word gDebug_03000710\n" - " .word 0x2710\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_nullsub_66() -{ - asm( - " bx lr\n" - "\n" - ); -} - #endif diff --git a/src/debug/unk_debug_menu_3.c b/src/debug/unk_debug_menu_3.c deleted file mode 100644 index fa944b25f..000000000 --- a/src/debug/unk_debug_menu_3.c +++ /dev/null @@ -1,804 +0,0 @@ -#include "global.h" -#include "menu.h" - -#if DEBUG - -__attribute__((naked)) -int debug_sub_813C404() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " ldr r5, ._1\n" - " ldr r4, ._1 + 4\n" - " sub r5, r5, r4\n" - " add r1, r4, #0\n" - " add r2, r5, #0\n" - " bl memcpy\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " bl unref_sub_812620C\n" - " add r0, r5, #0\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._2:\n" - " .align 2, 0\n" - "._1:\n" - " .word gUnknown_Debug_845DDB2\n" - " .word gUnknown_Debug_845DAE1\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C430() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " ldr r5, ._3\n" - " ldr r4, ._3 + 4\n" - " sub r5, r5, r4\n" - " add r1, r4, #0\n" - " add r2, r5, #0\n" - " bl memcpy\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " bl unref_sub_812620C\n" - " add r0, r5, #0\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._4:\n" - " .align 2, 0\n" - "._3:\n" - " .word gUnknown_Debug_845E402\n" - " .word gUnknown_Debug_845E3E0\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C45C() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " ldr r5, ._5\n" - " ldr r4, ._5 + 4\n" - " sub r5, r5, r4\n" - " add r1, r4, #0\n" - " add r2, r5, #0\n" - " bl memcpy\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " bl unref_sub_812620C\n" - " add r0, r5, #0\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._6:\n" - " .align 2, 0\n" - "._5:\n" - " .word gUnknown_Debug_845E443\n" - " .word gUnknown_Debug_845E422\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C488() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " ldr r5, ._7\n" - " ldr r4, ._7 + 4\n" - " sub r5, r5, r4\n" - " add r1, r4, #0\n" - " add r2, r5, #0\n" - " bl memcpy\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " bl unref_sub_812620C\n" - " add r0, r5, #0\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._8:\n" - " .align 2, 0\n" - "._7:\n" - " .word gUnknown_Debug_845E422\n" - " .word gUnknown_Debug_845E402\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C4B4() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._9\n" - " ldr r1, ._9 + 4\n" - " sub r4, r4, r1\n" - " add r2, r4, #0\n" - " bl memcpy\n" - " add r0, r4, #0\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._10:\n" - " .align 2, 0\n" - "._9:\n" - " .word gUnknown_Debug_845E619\n" - " .word gUnknown_Debug_845E606\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C4D4() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " ldr r5, ._11\n" - " ldr r4, ._11 + 4\n" - " sub r5, r5, r4\n" - " add r1, r4, #0\n" - " add r2, r5, #0\n" - " bl memcpy\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " bl unref_sub_81261B4\n" - " add r0, r5, #0\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._12:\n" - " .align 2, 0\n" - "._11:\n" - " .word gUnknown_Debug_845E712\n" - " .word gUnknown_Debug_845E619\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C500() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " ldr r5, ._13\n" - " ldr r4, ._13 + 4\n" - " sub r5, r5, r4\n" - " add r1, r4, #0\n" - " add r2, r5, #0\n" - " bl memcpy\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " bl unref_sub_812620C\n" - " add r0, r5, #0\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._14:\n" - " .align 2, 0\n" - "._13:\n" - " .word gUnknown_Debug_845E797\n" - " .word gUnknown_Debug_845E712\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_813C52C() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6}\n" - " mov r8, r0\n" - " lsl r5, r1, #0x10\n" - " lsr r0, r5, #0x10\n" - " mov r9, r0\n" - " ldr r6, ._15\n" - " ldr r4, ._15 + 4\n" - " sub r6, r6, r4\n" - " mov r0, r8\n" - " add r1, r4, #0\n" - " add r2, r6, #0\n" - " bl memcpy\n" - " ldr r0, ._15 + 8\n" - " sub r0, r0, r4\n" - " add r0, r0, r8\n" - " add r0, r0, #0x3\n" - " mov r1, r9\n" - " strb r1, [r0]\n" - " lsr r5, r5, #0x18\n" - " strb r5, [r0, #0x1]\n" - " mov r0, r8\n" - " add r1, r4, #0\n" - " bl unref_sub_812620C\n" - " add r0, r6, #0\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._16:\n" - " .align 2, 0\n" - "._15:\n" - " .word gUnknown_Debug_845E7BB\n" - " .word gUnknown_Debug_845E797\n" - " .word gUnknown_Debug_845E7B5\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C580() -{ - asm( - " push {lr}\n" - " mov r1, #0xd\n" - " bl debug_sub_813C52C\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C58C() -{ - asm( - " push {lr}\n" - " mov r1, #0x4\n" - " bl debug_sub_813C52C\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C598() -{ - asm( - " push {lr}\n" - " mov r1, #0x85\n" - " bl debug_sub_813C52C\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C5A4() -{ - asm( - " push {lr}\n" - " ldr r1, ._17\n" - " bl debug_sub_813C52C\n" - " pop {r1}\n" - " bx r1\n" - "._18:\n" - " .align 2, 0\n" - "._17:\n" - " .word 0x121\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C5B4() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add r4, r0, #0\n" - " ldr r7, ._23\n" - " ldr r0, ._23 + 4\n" - " ldr r1, ._23 + 8\n" - " sub r0, r0, r1\n" - " add r6, r0, r4\n" - " ldr r0, ._23 + 12\n" - " sub r5, r0, r1\n" - " ldr r0, ._23 + 16\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " bl GetEnigmaBerryChecksum\n" - " mov r2, #0x0\n" - " ldr r3, ._23 + 20\n" - " mov r1, #0x0\n" - "._19:\n" - " add r0, r4, r2\n" - " strb r1, [r0]\n" - " add r2, r2, #0x1\n" - " cmp r2, r3\n" - " ble ._19 @cond_branch\n" - " mov r2, #0x0\n" - " cmp r2, r5\n" - " bcs ._20 @cond_branch\n" - " ldr r3, ._23 + 8\n" - "._21:\n" - " add r0, r4, r2\n" - " add r1, r2, r3\n" - " ldrb r1, [r1]\n" - " strb r1, [r0]\n" - " add r2, r2, #0x1\n" - " cmp r2, r5\n" - " bcc ._21 @cond_branch\n" - "._20:\n" - " mov r2, #0x0\n" - " ldr r3, ._23 + 24\n" - "._22:\n" - " add r0, r6, r2\n" - " add r1, r7, r2\n" - " ldrb r1, [r1]\n" - " strb r1, [r0]\n" - " add r2, r2, #0x1\n" - " cmp r2, r3\n" - " bls ._22 @cond_branch\n" - " bl ClearEnigmaBerries\n" - " ldr r1, ._23 + 8\n" - " add r0, r4, #0\n" - " bl unref_sub_81261B4\n" - " add r0, r5, #0\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._24:\n" - " .align 2, 0\n" - "._23:\n" - " .word gSaveBlock1+0x3160\n" - " .word gUnknown_Debug_845DDD6\n" - " .word gUnknown_Debug_845DDB2\n" - " .word gUnknown_Debug_845E306\n" - " .word Str_842E23C\n" - " .word 0xfff\n" - " .word 0x52f\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_813C638() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add sp, sp, #0xffffffec\n" - " mov r8, r0\n" - " add r4, r1, #0\n" - " add r5, r2, #0\n" - " add r6, r3, #0\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " lsl r6, r6, #0x10\n" - " lsr r6, r6, #0x10\n" - " bl ZeroMonData\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x1\n" - " str r0, [sp, #0x8]\n" - " ldr r0, ._25\n" - " str r0, [sp, #0xc]\n" - " mov r0, r8\n" - " add r1, r4, #0\n" - " add r2, r5, #0\n" - " mov r3, #0x20\n" - " bl CreateMon\n" - " ldr r2, ._25 + 4\n" - " mov r0, r8\n" - " mov r1, #0x7\n" - " bl SetMonData\n" - " ldr r2, ._25 + 8\n" - " mov r0, r8\n" - " mov r1, #0x2\n" - " bl SetMonData\n" - " str r6, [sp, #0x10]\n" - " mov r0, r8\n" - " mov r1, #0xc\n" - " add r2, sp, #0x10\n" - " bl SetMonData\n" - " add sp, sp, #0x14\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._26:\n" - " .align 2, 0\n" - "._25:\n" - " .word 0x270f\n" - " .word Str_842E240\n" - " .word Str_842E248\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_813C6AC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xfffffff8\n" - " add r6, r0, #0\n" - " add r5, r1, #0\n" - " add r0, r5, #0\n" - " bl ClearMailStruct\n" - " add r0, r6, #0\n" - " mov r1, #0xc\n" - " bl GetMonData\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r8, r0\n" - " bl ItemIsMail\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._27 @cond_branch\n" - " add r4, r5, #0\n" - " add r4, r4, #0x12\n" - " add r7, r5, #0\n" - " add r7, r7, #0x1a\n" - " mov r1, #0x9\n" - " add r0, r5, #0\n" - " add r0, r0, #0x10\n" - "._28:\n" - " strh r1, [r0]\n" - " sub r1, r1, #0x1\n" - " sub r0, r0, #0x2\n" - " cmp r0, r5\n" - " bge ._28 @cond_branch\n" - " add r0, r6, #0\n" - " mov r1, #0x7\n" - " mov r2, sp\n" - " bl GetMonData\n" - " add r0, r4, #0\n" - " mov r1, sp\n" - " mov r2, #0x8\n" - " bl StringCopyN\n" - " add r0, r6, #0\n" - " mov r1, #0x1\n" - " bl GetMonData\n" - " add r1, r7, #0\n" - " bl write_word_to_mem\n" - " add r0, r6, #0\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r6, #0\n" - " mov r1, #0x0\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " add r0, r4, #0\n" - " bl SpeciesToMailSpecies\n" - " strh r0, [r5, #0x1e]\n" - " mov r0, r8\n" - " strh r0, [r5, #0x20]\n" - "._27:\n" - " add sp, sp, #0x8\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C740() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, sl\n" - " mov r5, r9\n" - " mov r4, r8\n" - " push {r4, r5, r6}\n" - " add sp, sp, #0xffffffd0\n" - " add r6, r0, #0\n" - " ldr r0, ._29\n" - " mov r8, r0\n" - " ldr r1, ._29 + 4\n" - " ldr r5, ._29 + 8\n" - " sub r1, r1, r0\n" - " mov r9, r1\n" - " add r0, r6, #0\n" - " mov r1, r8\n" - " mov r2, r9\n" - " bl memcpy\n" - " add r0, r5, #0\n" - " mov r1, #0x19\n" - " mov r2, #0x5\n" - " mov r3, #0x0\n" - " bl debug_sub_813C638\n" - " add r4, sp, #0x24\n" - " mov r0, #0x1\n" - " mov sl, r0\n" - " mov r1, sl\n" - " strb r1, [r4]\n" - " add r0, r5, #0\n" - " mov r1, #0x2d\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " mov r0, #0x3\n" - " strb r0, [r4]\n" - " add r0, r5, #0\n" - " mov r1, #0x20\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " mov r0, #0xff\n" - " strb r0, [r4]\n" - " add r0, r5, #0\n" - " mov r1, #0x23\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " ldr r1, ._29 + 12\n" - " add r0, r4, #0\n" - " mov r2, #0xb\n" - " bl StringCopyN\n" - " add r0, r5, #0\n" - " mov r1, #0x2\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " mov r0, sl\n" - " strb r0, [r4]\n" - " add r0, r5, #0\n" - " mov r1, #0x3\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " ldr r0, ._29 + 16\n" - " add r0, r6, r0\n" - " mov r1, r8\n" - " sub r0, r0, r1\n" - " add r1, r5, #0\n" - " mov r2, #0x64\n" - " bl memcpy\n" - " ldr r0, ._29 + 20\n" - " add r6, r6, r0\n" - " mov r0, r8\n" - " sub r6, r6, r0\n" - " add r0, r6, #0\n" - " mov r1, sp\n" - " mov r2, #0x24\n" - " bl memcpy\n" - " mov r0, r9\n" - " add sp, sp, #0x30\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._30:\n" - " .align 2, 0\n" - "._29:\n" - " .word gUnknown_Debug_845E443\n" - " .word gUnknown_Debug_845E4EF\n" - " .word gEnemyParty\n" - " .word Str_842E238\n" - " .word gUnknown_Debug_845E467\n" - " .word gUnknown_Debug_845E4CB\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C810() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add sp, sp, #0xffffffdc\n" - " add r6, r0, #0\n" - " ldr r5, ._31\n" - " ldr r0, ._31 + 4\n" - " ldr r4, ._31 + 8\n" - " sub r0, r0, r5\n" - " mov r8, r0\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " mov r2, r8\n" - " bl memcpy\n" - " add r0, r4, #0\n" - " mov r1, #0xc9\n" - " mov r2, #0x15\n" - " mov r3, #0x82\n" - " bl debug_sub_813C638\n" - " add r0, r4, #0\n" - " mov r1, sp\n" - " bl debug_sub_813C6AC\n" - " ldr r0, ._31 + 12\n" - " add r0, r6, r0\n" - " sub r0, r0, r5\n" - " add r1, r4, #0\n" - " mov r2, #0x64\n" - " bl memcpy\n" - " ldr r0, ._31 + 16\n" - " add r0, r6, r0\n" - " sub r0, r0, r5\n" - " mov r1, sp\n" - " mov r2, #0x24\n" - " bl memcpy\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl unref_sub_812620C\n" - " mov r0, r8\n" - " add sp, sp, #0x24\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._32:\n" - " .align 2, 0\n" - "._31:\n" - " .word gUnknown_Debug_845E443\n" - " .word gUnknown_Debug_845E4EF\n" - " .word gEnemyParty\n" - " .word gUnknown_Debug_845E467\n" - " .word gUnknown_Debug_845E4CB\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C888() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add sp, sp, #0xffffffdc\n" - " add r6, r0, #0\n" - " ldr r5, ._33\n" - " ldr r0, ._33 + 4\n" - " ldr r4, ._33 + 8\n" - " sub r0, r0, r5\n" - " mov r8, r0\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " mov r2, r8\n" - " bl memcpy\n" - " add r0, r4, #0\n" - " mov r1, #0xc9\n" - " mov r2, #0x15\n" - " mov r3, #0x82\n" - " bl debug_sub_813C638\n" - " add r0, r4, #0\n" - " mov r1, sp\n" - " bl debug_sub_813C6AC\n" - " mov r0, #0x0\n" - " strh r0, [r4, #0x1c]\n" - " ldr r0, ._33 + 12\n" - " add r0, r6, r0\n" - " sub r0, r0, r5\n" - " add r1, r4, #0\n" - " mov r2, #0x64\n" - " bl memcpy\n" - " ldr r0, ._33 + 16\n" - " add r0, r6, r0\n" - " sub r0, r0, r5\n" - " mov r1, sp\n" - " mov r2, #0x24\n" - " bl memcpy\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl unref_sub_812620C\n" - " mov r0, r8\n" - " add sp, sp, #0x24\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._34:\n" - " .align 2, 0\n" - "._33:\n" - " .word gUnknown_Debug_845E443\n" - " .word gUnknown_Debug_845E4EF\n" - " .word gEnemyParty\n" - " .word gUnknown_Debug_845E467\n" - " .word gUnknown_Debug_845E4CB\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_813C904() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._35\n" - " add r0, r4, #0\n" - " mov r1, #0x5\n" - " mov r2, #0x32\n" - " mov r3, #0xb7\n" - " bl debug_sub_813C638\n" - " add r0, r4, #0\n" - " add r0, r0, #0x64\n" - " mov r1, #0x8\n" - " mov r2, #0x32\n" - " mov r3, #0xc4\n" - " bl debug_sub_813C638\n" - " add r4, r4, #0xc8\n" - " add r0, r4, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x32\n" - " mov r3, #0x8d\n" - " bl debug_sub_813C638\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._36:\n" - " .align 2, 0\n" - "._35:\n" - " .word gPlayerParty\n" - "\n" - ); -} - -__attribute__((naked)) -int debug_sub_813C93C() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xffffff44\n" - " add r4, r0, #0\n" - " ldr r6, ._37\n" - " ldr r5, ._37 + 4\n" - " sub r5, r5, r6\n" - " add r1, r6, #0\n" - " add r2, r5, #0\n" - " bl memcpy\n" - " bl SavePlayerParty\n" - " bl debug_sub_813C904\n" - " ldr r1, ._37 + 8\n" - " ldr r2, ._37 + 12\n" - " mov r0, sp\n" - " bl debug_sub_8075DB4\n" - " bl LoadPlayerParty\n" - " ldr r0, ._37 + 16\n" - " add r4, r4, r0\n" - " sub r4, r4, r6\n" - " add r0, r4, #0\n" - " mov r1, sp\n" - " mov r2, #0xbc\n" - " bl memcpy\n" - " add r0, r5, #0\n" - " add sp, sp, #0xbc\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "._38:\n" - " .align 2, 0\n" - "._37:\n" - " .word gUnknown_Debug_845E4EF\n" - " .word gUnknown_Debug_845E606\n" - " .word Str_842E253+5 @ weird...\n" - " .word 0x270f\n" - " .word gUnknown_Debug_845E506\n" - "\n" - ); -} - -#endif - diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index cc53f8c95..6c94b0466 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -8,9842 +8,4 @@ EWRAM_DATA u8 gUnknown_Debug_2038A20[4] = { 0 }; u8 byte_3005E30[0x20]; -__attribute__((naked)) -void debug_69() -{ - asm( - " bx lr\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C35DC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xfffffff8\n" - " mov r0, #0x0\n" - " bl SetVBlankCallback\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x13\n" - " mov r1, #0x0\n" - " strh r1, [r0]\n" - " add r0, r0, #0xe\n" - " strh r1, [r0]\n" - " sub r0, r0, #0x2\n" - " strh r1, [r0]\n" - " sub r0, r0, #0x2\n" - " strh r1, [r0]\n" - " sub r0, r0, #0x2\n" - " strh r1, [r0]\n" - " add r0, r0, #0x14\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " sub r0, r0, #0x6\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " sub r0, r0, #0x6\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " sub r0, r0, #0x6\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " mov r3, #0xc0\n" - " lsl r3, r3, #0x13\n" - " mov r4, #0xc0\n" - " lsl r4, r4, #0x9\n" - " add r0, sp, #0x4\n" - " mov r8, r0\n" - " mov r2, sp\n" - " mov r6, #0x0\n" - " ldr r1, ._2\n" - " mov r5, #0x80\n" - " lsl r5, r5, #0x5\n" - " ldr r7, ._2 + 4\n" - " mov r0, #0x81\n" - " lsl r0, r0, #0x18\n" - " mov ip, r0\n" - "._1:\n" - " strh r6, [r2]\n" - " mov r0, sp\n" - " str r0, [r1]\n" - " str r3, [r1, #0x4]\n" - " str r7, [r1, #0x8]\n" - " ldr r0, [r1, #0x8]\n" - " add r3, r3, r5\n" - " sub r4, r4, r5\n" - " cmp r4, r5\n" - " bhi ._1 @cond_branch\n" - " strh r6, [r2]\n" - " mov r2, sp\n" - " str r2, [r1]\n" - " str r3, [r1, #0x4]\n" - " lsr r0, r4, #0x1\n" - " mov r2, ip\n" - " orr r0, r0, r2\n" - " str r0, [r1, #0x8]\n" - " ldr r0, [r1, #0x8]\n" - " mov r0, #0xe0\n" - " lsl r0, r0, #0x13\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x3\n" - " mov r4, #0x0\n" - " str r4, [sp, #0x4]\n" - " ldr r2, ._2\n" - " mov r1, r8\n" - " str r1, [r2]\n" - " str r0, [r2, #0x4]\n" - " lsr r0, r3, #0x2\n" - " mov r1, #0x85\n" - " lsl r1, r1, #0x18\n" - " orr r0, r0, r1\n" - " str r0, [r2, #0x8]\n" - " ldr r0, [r2, #0x8]\n" - " mov r1, #0xa0\n" - " lsl r1, r1, #0x13\n" - " mov r0, sp\n" - " strh r4, [r0]\n" - " str r0, [r2]\n" - " str r1, [r2, #0x4]\n" - " lsr r3, r3, #0x1\n" - " mov r0, #0x81\n" - " lsl r0, r0, #0x18\n" - " orr r3, r3, r0\n" - " str r3, [r2, #0x8]\n" - " ldr r0, [r2, #0x8]\n" - " bl ResetPaletteFade\n" - " bl ScanlineEffect_Stop\n" - " bl ResetTasks\n" - " bl ResetSpriteData\n" - " bl ResetPaletteFade\n" - " bl FreeAllSpritePalettes\n" - " ldr r0, ._2 + 8\n" - " bl LoadSpriteSheet\n" - " ldr r0, ._2 + 12\n" - " bl LoadSpritePalette\n" - " ldr r0, ._2 + 16\n" - " bl Text_LoadWindowTemplate\n" - " ldr r0, ._2 + 20\n" - " bl InitMenuWindow\n" - " add sp, sp, #0x8\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._3:\n" - " .align 2, 0\n" - "._2:\n" - " .word 0x40000d4\n" - " .word 0x81000800\n" - " .word stru_83F8828\n" - " .word stru_83F8838\n" - " .word gWindowTemplate_81E6C3C\n" - " .word gWindowTemplate_81E6CE4\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C36F4() -{ - asm( - " push {lr}\n" - " bl RunTasks\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " bl UpdatePaletteFade\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C370C() -{ - asm( - " push {lr}\n" - " ldr r0, ._6\n" - " ldrb r1, [r0, #0x7]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._4 @cond_branch\n" - " ldr r0, ._6 + 4\n" - " bl SetMainCallback2\n" - " b ._5\n" - "._7:\n" - " .align 2, 0\n" - "._6:\n" - " .word gPaletteFade\n" - " .word debug_80C36F4+1\n" - "._4:\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " bl UpdatePaletteFade\n" - "._5:\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C373C() -{ - asm( - " push {lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl DestroyTask\n" - " bl ScriptContext2_Disable\n" - " ldr r0, ._8\n" - " bl SetMainCallback2\n" - " pop {r0}\n" - " bx r0\n" - "._9:\n" - " .align 2, 0\n" - "._8:\n" - " .word sub_80546F0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C3758() -{ - asm( - " push {lr}\n" - " bl LoadOam\n" - " bl ProcessSpriteCopyRequests\n" - " bl TransferPlttBuffer\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C376C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " lsl r1, r1, #0x18\n" - " lsr r7, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r6, r2, #0x18\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - "._10:\n" - " mov r3, sp\n" - " add r0, r3, r1\n" - " strb r2, [r0]\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " cmp r1, #0x2\n" - " bls ._10 @cond_branch\n" - " mov r1, sp\n" - " mov r0, #0xff\n" - " strb r0, [r1, #0x3]\n" - " mov r4, #0x0\n" - " add r0, r5, #0\n" - " mov r1, #0x64\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._11 @cond_branch\n" - " mov r1, sp\n" - " add r0, r0, #0xa1\n" - " strb r0, [r1]\n" - " mov r4, #0x1\n" - "._11:\n" - " add r0, r5, #0\n" - " mov r1, #0x64\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0xa\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._12 @cond_branch\n" - " cmp r4, #0\n" - " beq ._13 @cond_branch\n" - "._12:\n" - " mov r1, sp\n" - " add r0, r0, #0xa1\n" - " strb r0, [r1, #0x1]\n" - "._13:\n" - " mov r4, sp\n" - " add r0, r5, #0\n" - " mov r1, #0x64\n" - " bl __umodsi3\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0xa\n" - " bl __umodsi3\n" - " add r0, r0, #0xa1\n" - " strb r0, [r4, #0x2]\n" - " mov r0, sp\n" - " add r1, r7, #0\n" - " add r2, r6, #0\n" - " bl Menu_PrintText\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C3800() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xfffffff4\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " lsl r1, r1, #0x18\n" - " lsr r6, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r5, r2, #0x18\n" - " mov r3, #0x0\n" - " ldr r2, ._18\n" - " mov r1, #0x0\n" - "._14:\n" - " mov r7, sp\n" - " add r0, r7, r3\n" - " strb r1, [r0]\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - " cmp r3, #0x9\n" - " bls ._14 @cond_branch\n" - " add r1, r7, r3\n" - " mov r0, #0xff\n" - " strb r0, [r1]\n" - " mov r3, #0x0\n" - " mov r0, #0xb\n" - " add r1, r4, #0\n" - " mul r1, r1, r0\n" - " add r0, r1, r2\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._16 @cond_branch\n" - " add r4, r2, #0\n" - " add r2, r1, #0\n" - "._17:\n" - " mov r0, sp\n" - " add r1, r0, r3\n" - " add r0, r3, r2\n" - " add r0, r0, r4\n" - " ldrb r0, [r0]\n" - " strb r0, [r1]\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - " add r0, r3, r2\n" - " add r0, r0, r4\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._16 @cond_branch\n" - " cmp r3, #0x9\n" - " bls ._17 @cond_branch\n" - "._16:\n" - " mov r0, sp\n" - " add r1, r6, #0\n" - " add r2, r5, #0\n" - " bl Menu_PrintText\n" - " add sp, sp, #0xc\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._19:\n" - " .align 2, 0\n" - "._18:\n" - " .word gSpeciesNames\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C3878() -{ - asm( - " push {lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " cmp r0, #0\n" - " beq ._20 @cond_branch\n" - " cmp r0, #0x1\n" - " beq ._21 @cond_branch\n" - "._20:\n" - " cmp r1, #0x1\n" - " bls ._22 @cond_branch\n" - " sub r0, r1, #1\n" - " b ._23\n" - "._22:\n" - " ldr r1, ._25\n" - " b ._28\n" - "._26:\n" - " .align 2, 0\n" - "._25:\n" - " .word 0x19b\n" - "._21:\n" - " mov r0, #0xcd\n" - " lsl r0, r0, #0x1\n" - " cmp r1, r0\n" - " bhi ._27 @cond_branch\n" - " add r0, r1, #1\n" - "._23:\n" - " lsl r0, r0, #0x10\n" - " lsr r1, r0, #0x10\n" - " b ._28\n" - "._27:\n" - " mov r1, #0x1\n" - "._28:\n" - " add r0, r1, #0\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C38B4() -{ - asm( - " push {lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " lsl r1, r1, #0x10\n" - " lsr r0, r1, #0x10\n" - " cmp r2, #0\n" - " beq ._29 @cond_branch\n" - " cmp r2, #0x1\n" - " beq ._30 @cond_branch\n" - "._29:\n" - " cmp r0, #0\n" - " beq ._31 @cond_branch\n" - " sub r0, r0, #0x1\n" - " b ._32\n" - "._31:\n" - " mov r0, #0x52\n" - " b ._35\n" - "._30:\n" - " cmp r0, #0x51\n" - " bhi ._34 @cond_branch\n" - " add r0, r0, #0x1\n" - "._32:\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " b ._35\n" - "._34:\n" - " mov r0, #0x0\n" - "._35:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C38E4() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r2, #0\n" - " add r5, r3, #0\n" - " ldr r6, [sp, #0x1c]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - " lsl r1, r1, #0x18\n" - " lsr r7, r1, #0x18\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " lsl r6, r6, #0x18\n" - " lsr r6, r6, #0x18\n" - " ldr r1, ._37\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " bl memcpy\n" - " add r0, r7, #0\n" - " add r1, r4, #0\n" - " add r2, r7, #0\n" - " add r3, r5, #0\n" - " bl Menu_BlankWindowRect\n" - " cmp r6, #0\n" - " beq ._36 @cond_branch\n" - " mov r0, sp\n" - " add r1, r7, #0\n" - " mov r2, r8\n" - " bl Menu_PrintText\n" - "._36:\n" - " add sp, sp, #0x4\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._38:\n" - " .align 2, 0\n" - "._37:\n" - " .word gUnknown_Debug_083F7FD4\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C393C() -{ - asm( - " push {lr}\n" - " ldr r1, ._39\n" - " mov r0, #0x1e\n" - " bl ProgramFlashSectorAndVerify\n" - " pop {r0}\n" - " bx r0\n" - "._40:\n" - " .align 2, 0\n" - "._39:\n" - " .word gUnknown_Debug_083F7FD6\n" - "\n" - ); -} - -__attribute__((naked)) -void InitWatanabeDebugMenu() -{ - asm( - " push {r4, lr}\n" - " ldr r0, ._46\n" - " ldr r1, ._46 + 4\n" - " add r4, r0, r1\n" - " ldrb r0, [r4]\n" - " cmp r0, #0x1\n" - " beq ._41 @cond_branch\n" - " cmp r0, #0x1\n" - " ble ._42 @cond_branch\n" - " cmp r0, #0x2\n" - " beq ._43 @cond_branch\n" - " cmp r0, #0x3\n" - " beq ._44 @cond_branch\n" - "._42:\n" - " bl save_serialize_map\n" - " bl sub_8125E2C\n" - " mov r0, #0x1\n" - " strb r0, [r4]\n" - " b ._51\n" - "._47:\n" - " .align 2, 0\n" - "._46:\n" - " .word gMain\n" - " .word 0x43c\n" - "._41:\n" - " bl sub_8125E6C\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._51 @cond_branch\n" - " b ._49\n" - "._43:\n" - " mov r0, #0x37\n" - " bl PlaySE\n" - "._49:\n" - " ldrb r0, [r4]\n" - " add r0, r0, #0x1\n" - " strb r0, [r4]\n" - " b ._51\n" - "._44:\n" - " bl IsSEPlaying\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._51 @cond_branch\n" - " bl ScriptContext2_Disable\n" - " ldr r0, ._52\n" - " bl SetMainCallback2\n" - "._51:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._53:\n" - " .align 2, 0\n" - "._52:\n" - " .word sub_80546F0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void InitSizeComparison() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " bl debug_80C35DC\n" - " ldr r1, ._54\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r0, ._54 + 4\n" - " mov r1, #0x80\n" - " lsl r1, r1, #0x1\n" - " mov r2, #0x20\n" - " bl LoadPalette\n" - " ldr r3, ._54 + 8\n" - " ldrh r2, [r3]\n" - " mov r0, #0x0\n" - " strh r0, [r3]\n" - " ldr r4, ._54 + 12\n" - " ldrh r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " strh r0, [r4]\n" - " strh r2, [r3]\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x10\n" - " mov r3, #0x0\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._54 + 16\n" - " bl SetVBlankCallback\n" - " ldr r0, ._54 + 20\n" - " bl SetMainCallback2\n" - " mov r1, #0x80\n" - " lsl r1, r1, #0x13\n" - " mov r2, #0x8a\n" - " lsl r2, r2, #0x5\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r0, ._54 + 24\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._54 + 28\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " mov r0, #0xfc\n" - " strh r0, [r1, #0x8]\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._55:\n" - " .align 2, 0\n" - "._54:\n" - " .word gReservedSpritePaletteCount\n" - " .word gUnknown_Debug_20389EC\n" - " .word 0x4000208\n" - " .word 0x4000200\n" - " .word debug_80C3758+1\n" - " .word debug_80C370C+1\n" - " .word debug_80C3A50+1\n" - " .word gTasks\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C3A50() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xffffffd8\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._56\n" - " lsl r2, r0, #0x2\n" - " add r0, r2, r0\n" - " lsl r0, r0, #0x3\n" - " add r7, r0, r1\n" - " ldrh r0, [r7, #0x8]\n" - " str r0, [sp, #0x4]\n" - " bl NationalPokedexNumToSpecies\n" - " mov r1, sp\n" - " strh r0, [r1, #0x8]\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x10\n" - " str r2, [sp, #0xc]\n" - " lsr r2, r2, #0x10\n" - " mov r9, r2\n" - " ldr r3, ._56 + 4\n" - " mov r8, r3\n" - " mov r0, #0x6\n" - " mov r1, #0x0\n" - " mov r2, #0x17\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x5\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r5, ._56 + 8\n" - " add r0, r5, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r4, ._56 + 12\n" - " add r0, r4, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, #0x18\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, r5, #0\n" - " mov r1, #0x19\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0x19\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " mov r1, #0xa\n" - " mov r2, #0xb\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._56 + 16\n" - " mov r1, #0x1\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, ._56 + 20\n" - " mov r1, #0x1\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - " ldr r0, ._56 + 24\n" - " mov r1, #0x1\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " ldr r0, ._56 + 28\n" - " mov r1, #0x1\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " mov r0, #0xc\n" - " mov r1, #0xa\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._56 + 32\n" - " mov r1, #0xd\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, ._56 + 36\n" - " mov r1, #0xd\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - " mov r0, #0xc\n" - " mov r1, #0x10\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._56 + 40\n" - " mov r1, #0xd\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " ldr r0, ._56 + 44\n" - " mov r1, #0x18\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " mov r0, r9\n" - " mov r1, #0x12\n" - " mov r2, #0x11\n" - " bl debug_80C3800\n" - " mov r1, r8\n" - " ldrb r0, [r1, #0x8]\n" - " mov r1, #0x98\n" - " mov r2, #0x28\n" - " mov r3, #0x0\n" - " bl sub_8091A4C\n" - " mov r2, sp\n" - " strh r0, [r2, #0x10]\n" - " add r3, r0, #0\n" - " lsl r3, r3, #0x10\n" - " str r3, [sp, #0x18]\n" - " lsr r0, r3, #0x10\n" - " str r0, [sp, #0x14]\n" - " lsl r4, r0, #0x4\n" - " add r4, r4, r0\n" - " lsl r4, r4, #0x2\n" - " ldr r1, ._56 + 48\n" - " add r4, r4, r1\n" - " ldrb r1, [r4, #0x1]\n" - " mov r2, #0x4\n" - " neg r2, r2\n" - " mov sl, r2\n" - " mov r0, sl\n" - " and r0, r0, r1\n" - " mov r3, #0x1\n" - " orr r0, r0, r3\n" - " strb r0, [r4, #0x1]\n" - " ldrb r1, [r4, #0x3]\n" - " mov r0, #0x3f\n" - " neg r0, r0\n" - " mov r9, r0\n" - " and r0, r0, r1\n" - " mov r1, #0x4\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x3]\n" - " ldrb r1, [r4, #0x5]\n" - " sub r2, r2, #0x9\n" - " mov r8, r2\n" - " mov r0, r8\n" - " and r0, r0, r1\n" - " mov r3, #0xf\n" - " and r0, r0, r3\n" - " strb r0, [r4, #0x5]\n" - " mov r0, #0x0\n" - " bl GetSpritePaletteTagByPaletteNum\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl FreeSpritePaletteByTag\n" - " ldr r0, ._56 + 52\n" - " ldr r1, [sp, #0x4]\n" - " lsl r5, r1, #0x3\n" - " add r5, r5, r1\n" - " lsl r5, r5, #0x2\n" - " add r5, r5, r0\n" - " ldrh r6, [r5, #0x20]\n" - " strh r6, [r4, #0x26]\n" - " ldrh r4, [r5, #0x1e]\n" - " str r4, [sp]\n" - " mov r0, #0x2\n" - " add r1, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " bl SetOamMatrix\n" - " mov r2, sp\n" - " ldrh r2, [r2, #0x14]\n" - " strh r2, [r7, #0xe]\n" - " strh r6, [r7, #0x10]\n" - " strh r4, [r7, #0x14]\n" - " ldr r0, [sp, #0x4]\n" - " mov r1, #0x58\n" - " mov r2, #0x28\n" - " mov r3, #0x1\n" - " bl sub_80918EC\n" - " mov r3, sp\n" - " strh r0, [r3, #0x1c]\n" - " lsl r0, r0, #0x10\n" - " str r0, [sp, #0x24]\n" - " lsr r1, r0, #0x10\n" - " str r1, [sp, #0x20]\n" - " lsl r4, r1, #0x4\n" - " add r4, r4, r1\n" - " lsl r4, r4, #0x2\n" - " ldr r2, ._56 + 48\n" - " add r4, r4, r2\n" - " ldrb r0, [r4, #0x1]\n" - " mov r3, sl\n" - " and r3, r3, r0\n" - " mov r0, #0x1\n" - " orr r3, r3, r0\n" - " strb r3, [r4, #0x1]\n" - " ldrb r0, [r4, #0x3]\n" - " mov r1, r9\n" - " and r1, r1, r0\n" - " mov r0, #0x2\n" - " orr r1, r1, r0\n" - " strb r1, [r4, #0x3]\n" - " ldrb r0, [r4, #0x5]\n" - " mov r2, r8\n" - " and r2, r2, r0\n" - " mov r3, #0xf\n" - " and r2, r2, r3\n" - " strb r2, [r4, #0x5]\n" - " mov r0, #0x0\n" - " bl GetSpritePaletteTagByPaletteNum\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl FreeSpritePaletteByTag\n" - " ldrh r0, [r5, #0x1c]\n" - " mov r8, r0\n" - " strh r0, [r4, #0x26]\n" - " ldrh r4, [r5, #0x1a]\n" - " str r4, [sp]\n" - " mov r0, #0x1\n" - " add r1, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " bl SetOamMatrix\n" - " mov r1, sp\n" - " ldrh r1, [r1, #0x20]\n" - " strh r1, [r7, #0xc]\n" - " mov r2, r8\n" - " strh r2, [r7, #0x12]\n" - " strh r4, [r7, #0x16]\n" - " mov r3, #0x0\n" - " strh r3, [r7, #0x18]\n" - " strh r3, [r7, #0x1a]\n" - " ldr r1, ._56 + 56\n" - " ldr r2, ._56 + 60\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " mov r0, #0x1f\n" - " strh r0, [r1]\n" - " ldr r2, ._56 + 64\n" - " mov r3, #0x18\n" - " ldsh r1, [r7, r3]\n" - " lsl r1, r1, #0x6\n" - " add r0, r1, #0\n" - " add r0, r0, #0x38\n" - " lsl r0, r0, #0x8\n" - " add r1, r1, #0x78\n" - " add r0, r0, r1\n" - " strh r0, [r2]\n" - " ldr r1, ._56 + 68\n" - " ldr r2, ._56 + 72\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " sub r1, r1, #0x2\n" - " ldr r3, ._56 + 76\n" - " add r0, r3, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._56 + 80\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0xa\n" - " mov r0, #0xe1\n" - " strh r0, [r1]\n" - " ldr r0, ._56 + 84\n" - " mov r3, #0x0\n" - " strh r3, [r0]\n" - " add r1, r1, #0x4\n" - " mov r0, #0x7\n" - " strh r0, [r1]\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x13\n" - " ldrh r0, [r2]\n" - " mov r3, #0xc0\n" - " lsl r3, r3, #0x7\n" - " add r1, r3, #0\n" - " orr r0, r0, r1\n" - " strh r0, [r2]\n" - " ldr r0, ._56 + 88\n" - " str r0, [r7]\n" - " add sp, sp, #0x28\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._57:\n" - " .align 2, 0\n" - "._56:\n" - " .word gTasks\n" - " .word gSaveBlock2\n" - " .word gUnknown_Debug_083F7FD6+0x4\n" - " .word gUnknown_Debug_083F7FDE\n" - " .word gUnknown_Debug_083F7FE2\n" - " .word gUnknown_Debug_083F7FED\n" - " .word gUnknown_Debug_083F7FF6\n" - " .word gUnknown_Debug_083F8001\n" - " .word gUnknown_Debug_083F800C\n" - " .word gUnknown_Debug_083F8019\n" - " .word gUnknown_Debug_083F8022\n" - " .word gUnknown_Debug_083F8028\n" - " .word gSprites\n" - " .word gPokedexEntries\n" - " .word 0x4000048\n" - " .word 0x3f1f\n" - " .word 0x4000040\n" - " .word 0x4000044\n" - " .word 0x848\n" - " .word 0x31bf\n" - " .word 0x14f\n" - " .word 0x4000052\n" - " .word debug_80C3D2C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C3D2C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " add r7, r6, #0\n" - " ldr r4, ._60\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._58 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._60 + 4\n" - " bl SetMainCallback2\n" - " ldr r1, ._60 + 8\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._60 + 12\n" - " str r1, [r0]\n" - " b ._117\n" - "._61:\n" - " .align 2, 0\n" - "._60:\n" - " .word gMain\n" - " .word debug_80C370C+1\n" - " .word gTasks\n" - " .word debug_80C373C+1\n" - "._58:\n" - " mov r5, #0x1\n" - " add r0, r5, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._62 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._64\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldrh r1, [r0, #0x18]\n" - " mov r2, #0x1\n" - " eor r1, r1, r2\n" - " strh r1, [r0, #0x18]\n" - " b ._117\n" - "._65:\n" - " .align 2, 0\n" - "._64:\n" - " .word gTasks\n" - "._62:\n" - " ldrh r1, [r4, #0x30]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._66 @cond_branch\n" - " ldr r1, ._70\n" - " lsl r2, r6, #0x2\n" - " add r0, r2, r6\n" - " lsl r0, r0, #0x3\n" - " add r3, r0, r1\n" - " mov r5, #0x18\n" - " ldsh r0, [r3, r5]\n" - " mov r8, r1\n" - " cmp r0, #0\n" - " beq ._67 @cond_branch\n" - " ldrh r1, [r4, #0x2c]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._68 @cond_branch\n" - " ldrh r0, [r3, #0x14]\n" - " add r0, r0, #0x10\n" - " b ._69\n" - "._71:\n" - " .align 2, 0\n" - "._70:\n" - " .word gTasks\n" - "._68:\n" - " ldrh r0, [r3, #0x14]\n" - " add r0, r0, #0x1\n" - "._69:\n" - " strh r0, [r3, #0x14]\n" - " add r0, r2, r7\n" - " lsl r0, r0, #0x3\n" - " mov r2, r8\n" - " add r1, r0, r2\n" - " ldrh r0, [r1, #0x14]\n" - " mov r6, #0x80\n" - " lsl r6, r6, #0x8\n" - " cmp r0, r6\n" - " bhi ._72 @cond_branch\n" - " b ._117\n" - "._72:\n" - " strh r6, [r1, #0x14]\n" - " b ._117\n" - "._67:\n" - " ldrh r1, [r4, #0x2c]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._75 @cond_branch\n" - " ldrh r0, [r3, #0x16]\n" - " add r0, r0, #0x10\n" - " b ._76\n" - "._75:\n" - " ldrh r0, [r3, #0x16]\n" - " add r0, r0, #0x1\n" - "._76:\n" - " strh r0, [r3, #0x16]\n" - " add r0, r2, r7\n" - " lsl r0, r0, #0x3\n" - " mov r4, r8\n" - " add r1, r0, r4\n" - " ldrh r0, [r1, #0x16]\n" - " mov r6, #0x80\n" - " lsl r6, r6, #0x8\n" - " cmp r0, r6\n" - " bhi ._77 @cond_branch\n" - " b ._117\n" - "._77:\n" - " strh r6, [r1, #0x16]\n" - " b ._117\n" - "._66:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._80 @cond_branch\n" - " ldr r1, ._84\n" - " lsl r2, r6, #0x2\n" - " add r0, r2, r6\n" - " lsl r0, r0, #0x3\n" - " add r3, r0, r1\n" - " mov r5, #0x18\n" - " ldsh r0, [r3, r5]\n" - " mov r8, r1\n" - " cmp r0, #0\n" - " beq ._81 @cond_branch\n" - " ldrh r1, [r4, #0x2c]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._82 @cond_branch\n" - " ldrh r0, [r3, #0x14]\n" - " sub r0, r0, #0x10\n" - " b ._83\n" - "._85:\n" - " .align 2, 0\n" - "._84:\n" - " .word gTasks\n" - "._82:\n" - " ldrh r0, [r3, #0x14]\n" - " sub r0, r0, #0x1\n" - "._83:\n" - " strh r0, [r3, #0x14]\n" - " add r0, r2, r7\n" - " lsl r0, r0, #0x3\n" - " mov r2, r8\n" - " add r1, r0, r2\n" - " mov r4, #0x14\n" - " ldsh r0, [r1, r4]\n" - " cmp r0, #0xff\n" - " ble ._86 @cond_branch\n" - " b ._117\n" - "._86:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " strh r0, [r1, #0x14]\n" - " b ._117\n" - "._81:\n" - " ldrh r1, [r4, #0x2c]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._89 @cond_branch\n" - " ldrh r0, [r3, #0x16]\n" - " sub r0, r0, #0x10\n" - " b ._90\n" - "._89:\n" - " ldrh r0, [r3, #0x16]\n" - " sub r0, r0, #0x1\n" - "._90:\n" - " strh r0, [r3, #0x16]\n" - " add r0, r2, r7\n" - " lsl r0, r0, #0x3\n" - " mov r5, r8\n" - " add r1, r0, r5\n" - " mov r2, #0x16\n" - " ldsh r0, [r1, r2]\n" - " cmp r0, #0xff\n" - " ble ._91 @cond_branch\n" - " b ._117\n" - "._91:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " strh r0, [r1, #0x16]\n" - " b ._117\n" - "._80:\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._94 @cond_branch\n" - " ldr r0, ._97\n" - " lsl r1, r6, #0x2\n" - " add r1, r1, r6\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " mov r4, #0x18\n" - " ldsh r0, [r1, r4]\n" - " cmp r0, #0\n" - " beq ._95 @cond_branch\n" - " ldrh r0, [r1, #0x10]\n" - " sub r0, r0, #0x1\n" - " strh r0, [r1, #0x10]\n" - " b ._117\n" - "._98:\n" - " .align 2, 0\n" - "._97:\n" - " .word gTasks\n" - "._95:\n" - " ldrh r0, [r1, #0x12]\n" - " sub r0, r0, #0x1\n" - " strh r0, [r1, #0x12]\n" - " b ._117\n" - "._94:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._100 @cond_branch\n" - " ldr r0, ._103\n" - " lsl r1, r6, #0x2\n" - " add r1, r1, r6\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " mov r5, #0x18\n" - " ldsh r0, [r1, r5]\n" - " cmp r0, #0\n" - " beq ._101 @cond_branch\n" - " ldrh r0, [r1, #0x10]\n" - " add r0, r0, #0x1\n" - " strh r0, [r1, #0x10]\n" - " b ._117\n" - "._104:\n" - " .align 2, 0\n" - "._103:\n" - " .word gTasks\n" - "._101:\n" - " ldrh r0, [r1, #0x12]\n" - " add r0, r0, #0x1\n" - " strh r0, [r1, #0x12]\n" - " b ._117\n" - "._100:\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._106 @cond_branch\n" - " ldr r2, ._109\n" - " lsl r3, r6, #0x2\n" - " add r0, r3, r6\n" - " lsl r0, r0, #0x3\n" - " add r6, r0, r2\n" - " ldrh r4, [r6, #0x8]\n" - " mov r0, #0x8\n" - " ldsh r1, [r6, r0]\n" - " ldr r0, ._109 + 4\n" - " mov r8, r2\n" - " add r2, r3, #0\n" - " cmp r1, r0\n" - " bgt ._107 @cond_branch\n" - " add r0, r4, #1\n" - " strh r0, [r6, #0x8]\n" - " b ._108\n" - "._110:\n" - " .align 2, 0\n" - "._109:\n" - " .word gTasks\n" - " .word 0x181\n" - "._107:\n" - " strh r5, [r6, #0x8]\n" - "._108:\n" - " add r4, r2, r7\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r8\n" - " mov r2, #0xc\n" - " ldsh r1, [r4, r2]\n" - " b ._111\n" - "._106:\n" - " mov r0, #0x4\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._112 @cond_branch\n" - " ldr r1, ._115\n" - " lsl r2, r6, #0x2\n" - " add r0, r2, r6\n" - " lsl r0, r0, #0x3\n" - " add r3, r0, r1\n" - " ldrh r6, [r3, #0x8]\n" - " mov r4, #0x8\n" - " ldsh r0, [r3, r4]\n" - " mov r8, r1\n" - " cmp r0, #0x1\n" - " ble ._113 @cond_branch\n" - " sub r0, r6, #1\n" - " b ._114\n" - "._116:\n" - " .align 2, 0\n" - "._115:\n" - " .word gTasks\n" - "._113:\n" - " mov r0, #0xc1\n" - " lsl r0, r0, #0x1\n" - "._114:\n" - " strh r0, [r3, #0x8]\n" - " add r4, r2, r7\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r8\n" - " mov r5, #0xc\n" - " ldsh r1, [r4, r5]\n" - "._111:\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r5, ._118\n" - " add r0, r0, r5\n" - " bl DestroySprite\n" - " mov r0, #0xe\n" - " ldsh r1, [r4, r0]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r5\n" - " bl DestroySprite\n" - " ldr r0, ._118 + 4\n" - " str r0, [r4]\n" - " b ._117\n" - "._119:\n" - " .align 2, 0\n" - "._118:\n" - " .word gSprites\n" - " .word debug_80C3A50+1\n" - "._112:\n" - " ldr r0, ._120\n" - " lsl r5, r7, #0x2\n" - " add r5, r5, r7\n" - " lsl r5, r5, #0x3\n" - " add r5, r5, r0\n" - " ldrh r4, [r5, #0x16]\n" - " ldrh r6, [r5, #0x12]\n" - " str r4, [sp]\n" - " mov r0, #0x1\n" - " add r1, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " bl SetOamMatrix\n" - " add r0, r4, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x4\n" - " bl debug_80C68CC\n" - " add r0, r6, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " mov r3, #0x4\n" - " bl debug_80C68CC\n" - " ldr r2, ._120 + 4\n" - " mov r8, r2\n" - " mov r4, #0xc\n" - " ldsh r1, [r5, r4]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r8\n" - " strh r6, [r0, #0x26]\n" - " ldrh r4, [r5, #0x14]\n" - " ldrh r6, [r5, #0x10]\n" - " str r4, [sp]\n" - " mov r0, #0x2\n" - " add r1, r4, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " bl SetOamMatrix\n" - " add r0, r4, #0\n" - " mov r1, #0x19\n" - " mov r2, #0x3\n" - " mov r3, #0x4\n" - " bl debug_80C68CC\n" - " add r0, r6, #0\n" - " mov r1, #0x19\n" - " mov r2, #0x7\n" - " mov r3, #0x4\n" - " bl debug_80C68CC\n" - " mov r0, #0xe\n" - " ldsh r1, [r5, r0]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r8\n" - " strh r6, [r0, #0x26]\n" - " ldr r2, ._120 + 8\n" - " mov r4, #0x18\n" - " ldsh r1, [r5, r4]\n" - " lsl r1, r1, #0x6\n" - " add r0, r1, #0\n" - " add r0, r0, #0x38\n" - " lsl r0, r0, #0x8\n" - " add r1, r1, #0x78\n" - " add r0, r0, r1\n" - " strh r0, [r2]\n" - "._117:\n" - " add sp, sp, #0x4\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._121:\n" - " .align 2, 0\n" - "._120:\n" - " .word gTasks\n" - " .word gSprites\n" - " .word 0x4000040\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C405C() -{ - asm( - " push {r4, r5, lr}\n" - " add r4, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r5, r1, #0x10\n" - " mov r2, #0x0\n" - " mov r1, #0x0\n" - "._122:\n" - " add r0, r4, r2\n" - " strb r1, [r0]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x9\n" - " bls ._122 @cond_branch\n" - " add r0, r4, r2\n" - " mov r1, #0xff\n" - " strb r1, [r0]\n" - " mov r0, #0xae\n" - " strb r0, [r4]\n" - " cmp r5, #0\n" - " beq ._125 @cond_branch\n" - " mov r2, #0x0\n" - " ldr r3, ._127\n" - " mov r0, #0xb\n" - " add r1, r5, #0\n" - " mul r1, r1, r0\n" - " add r0, r1, r3\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._125 @cond_branch\n" - " add r5, r3, #0\n" - " add r3, r1, #0\n" - "._126:\n" - " add r1, r4, r2\n" - " add r0, r2, r3\n" - " add r0, r0, r5\n" - " ldrb r0, [r0]\n" - " strb r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " add r0, r2, r3\n" - " add r0, r0, r5\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._125 @cond_branch\n" - " cmp r2, #0x9\n" - " bls ._126 @cond_branch\n" - "._125:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._128:\n" - " .align 2, 0\n" - "._127:\n" - " .word gSpeciesNames\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C40C4() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " mov r5, #0x0\n" - " mov r6, sp\n" - "._135:\n" - " cmp r7, #0\n" - " beq ._129 @cond_branch\n" - " mov r0, #0x64\n" - " add r1, r5, #0\n" - " mul r1, r1, r0\n" - " ldr r0, ._132\n" - " add r4, r1, r0\n" - " add r0, r4, #0\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " beq ._134 @cond_branch\n" - " add r0, r4, #0\n" - " bl CalculateMonStats\n" - " add r0, r4, #0\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " strh r0, [r6]\n" - " add r0, r4, #0\n" - " mov r1, #0x39\n" - " mov r2, sp\n" - " bl SetMonData\n" - " b ._134\n" - "._133:\n" - " .align 2, 0\n" - "._132:\n" - " .word gEnemyParty\n" - "._129:\n" - " mov r0, #0x64\n" - " add r1, r5, #0\n" - " mul r1, r1, r0\n" - " ldr r0, ._136\n" - " add r4, r1, r0\n" - " add r0, r4, #0\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " beq ._134 @cond_branch\n" - " add r0, r4, #0\n" - " bl CalculateMonStats\n" - " add r0, r4, #0\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " strh r0, [r6]\n" - " add r0, r4, #0\n" - " mov r1, #0x39\n" - " mov r2, sp\n" - " bl SetMonData\n" - "._134:\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x5\n" - " bls ._135 @cond_branch\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._137:\n" - " .align 2, 0\n" - "._136:\n" - " .word gPlayerParty\n" - "\n" - ); -} - -__attribute__((naked)) -void InitBattleForDebug() -{ - asm( - " push {lr}\n" - " bl SavePlayerParty\n" - " ldr r1, ._138\n" - " ldr r0, ._138 + 4\n" - " ldrb r2, [r0, #0x8]\n" - " mov r0, #0x0\n" - " strb r2, [r1, #0xd]\n" - " strb r0, [r1]\n" - " strb r0, [r1, #0x1]\n" - " strb r0, [r1, #0x2]\n" - " strb r0, [r1, #0x3]\n" - " strb r0, [r1, #0x4]\n" - " strb r0, [r1, #0x5]\n" - " strb r0, [r1, #0x6]\n" - " strb r0, [r1, #0x7]\n" - " strb r0, [r1, #0x8]\n" - " strb r0, [r1, #0xc]\n" - " ldr r1, ._138 + 8\n" - " str r0, [r1]\n" - " bl ZeroPlayerPartyMons\n" - " bl ZeroEnemyPartyMons\n" - " mov r0, #0x0\n" - " bl debug_80C4214\n" - " ldr r0, ._138 + 12\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " pop {r0}\n" - " bx r0\n" - "._139:\n" - " .align 2, 0\n" - "._138:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gSaveBlock2\n" - " .word byte_3005E30\n" - " .word debug_80C47BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C41A8() -{ - asm( - " push {lr}\n" - " ldr r1, ._140\n" - " mov r0, #0x0\n" - " strb r0, [r1, #0x1]\n" - " strb r0, [r1, #0x2]\n" - " bl ZeroPlayerPartyMons\n" - " bl ZeroEnemyPartyMons\n" - " mov r0, #0x0\n" - " bl debug_80C4214\n" - " ldr r0, ._140 + 4\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " pop {r0}\n" - " bx r0\n" - "._141:\n" - " .align 2, 0\n" - "._140:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word debug_80C47BC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C41D4() -{ - asm( - " push {lr}\n" - " mov r0, #0x0\n" - " bl debug_80C40C4\n" - " mov r0, #0x0\n" - " bl debug_80C4214\n" - " ldr r0, ._142\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " pop {r0}\n" - " bx r0\n" - "._143:\n" - " .align 2, 0\n" - "._142:\n" - " .word debug_80C42B8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C41F4() -{ - asm( - " push {lr}\n" - " mov r0, #0x1\n" - " bl debug_80C40C4\n" - " mov r0, #0x1\n" - " bl debug_80C4214\n" - " ldr r0, ._144\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " pop {r0}\n" - " bx r0\n" - "._145:\n" - " .align 2, 0\n" - "._144:\n" - " .word debug_80C42B8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4214() -{ - asm( - " push {r4, r5, r6, lr}\n" - " bl debug_80C35DC\n" - " ldr r6, ._146\n" - " mov r4, #0x0\n" - " strh r4, [r6]\n" - " ldr r5, ._146 + 4\n" - " strh r4, [r5]\n" - " ldr r0, ._146 + 8\n" - " strh r4, [r0]\n" - " add r0, r0, #0x4\n" - " strh r4, [r0]\n" - " ldr r1, ._146 + 12\n" - " ldr r2, ._146 + 16\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " mov r0, #0x31\n" - " strh r0, [r1]\n" - " add r1, r1, #0x6\n" - " mov r0, #0xe1\n" - " strh r0, [r1]\n" - " ldr r0, ._146 + 20\n" - " strh r4, [r0]\n" - " add r1, r1, #0x4\n" - " mov r0, #0x7\n" - " strh r0, [r1]\n" - " ldr r3, ._146 + 24\n" - " ldrh r2, [r3]\n" - " strh r4, [r3]\n" - " ldr r4, ._146 + 28\n" - " ldrh r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " strh r0, [r4]\n" - " strh r2, [r3]\n" - " ldr r0, ._146 + 32\n" - " bl SetVBlankCallback\n" - " ldr r0, ._146 + 36\n" - " bl SetMainCallback2\n" - " mov r1, #0x80\n" - " lsl r1, r1, #0x13\n" - " ldr r2, ._146 + 40\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._146 + 44\n" - " add r0, r1, #0\n" - " strh r0, [r6]\n" - " ldr r2, ._146 + 48\n" - " add r0, r2, #0\n" - " strh r0, [r5]\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._147:\n" - " .align 2, 0\n" - "._146:\n" - " .word 0x4000040\n" - " .word 0x4000044\n" - " .word 0x4000042\n" - " .word 0x4000048\n" - " .word 0x1111\n" - " .word 0x4000052\n" - " .word 0x4000208\n" - " .word 0x4000200\n" - " .word debug_80C3758+1\n" - " .word debug_80C370C+1\n" - " .word 0x7140\n" - " .word 0x1ef\n" - " .word 0x819f\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C42B8() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xffffffe4\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " ldr r1, ._150\n" - " mov r0, sp\n" - " mov r2, #0xc\n" - " bl memcpy\n" - " add r4, sp, #0xc\n" - " ldr r1, ._150 + 4\n" - " add r0, r4, #0\n" - " mov r2, #0xd\n" - " bl memcpy\n" - " mov r0, #0x0\n" - " mov r1, #0x10\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, sp\n" - " mov r1, #0x1\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0x14\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " bl debug_80C4694\n" - " bl debug_80C4704\n" - " ldr r0, ._150 + 8\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._148 @cond_branch\n" - " ldr r0, ._150 + 12\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._150 + 16\n" - " b ._149\n" - "._151:\n" - " .align 2, 0\n" - "._150:\n" - " .word gUnknown_Debug_083F8194\n" - " .word gUnknown_Debug_083F81A0\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gTasks\n" - " .word debug_80C44EC+1\n" - "._148:\n" - " ldr r0, ._152\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._152 + 4\n" - "._149:\n" - " str r0, [r1]\n" - " add sp, sp, #0x1c\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._153:\n" - " .align 2, 0\n" - "._152:\n" - " .word gTasks\n" - " .word debug_80C4348+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4348() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r0, ._154\n" - " ldrb r0, [r0, #0x1]\n" - " lsl r0, r0, #0x19\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x12\n" - " add r0, r0, r1\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " str r1, [sp]\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r1, ._154 + 4\n" - " ldr r2, ._154 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " add r2, r2, #0x8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._154 + 12\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._154 + 16\n" - " str r1, [r0]\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._155:\n" - " .align 2, 0\n" - "._154:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word 0x4000042\n" - " .word 0x177\n" - " .word gTasks\n" - " .word debug_80C43A8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C43A8() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r1, ._158\n" - " ldrh r2, [r1, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r2\n" - " add r3, r1, #0\n" - " cmp r0, #0\n" - " beq ._156 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._158 + 4\n" - " ldrb r1, [r0, #0x1]\n" - " mov r0, #0x64\n" - " mul r0, r0, r1\n" - " ldr r1, ._158 + 8\n" - " add r0, r0, r1\n" - " ldr r1, ._158 + 12\n" - " bl debug_sub_80A433C\n" - " add r0, r4, #0\n" - " bl DestroyTask\n" - " b ._180\n" - "._159:\n" - " .align 2, 0\n" - "._158:\n" - " .word gMain\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gPlayerParty\n" - " .word debug_80C41D4+1\n" - "._156:\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._160 @cond_branch\n" - " ldr r0, ._162\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._162 + 4\n" - " str r0, [r1]\n" - " b ._180\n" - "._163:\n" - " .align 2, 0\n" - "._162:\n" - " .word gTasks\n" - " .word debug_80C4F48+1\n" - "._160:\n" - " mov r0, #0x8\n" - " and r0, r0, r2\n" - " lsl r0, r0, #0x10\n" - " lsr r1, r0, #0x10\n" - " cmp r1, #0\n" - " beq ._164 @cond_branch\n" - " bl debug_80C4774\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._180 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " bl CalculatePlayerPartyCount\n" - " bl CalculateEnemyPartyCount\n" - " ldr r0, ._167\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._167 + 4\n" - " str r0, [r1]\n" - " b ._180\n" - "._168:\n" - " .align 2, 0\n" - "._167:\n" - " .word gTasks\n" - " .word debug_80C4D14+1\n" - "._164:\n" - " mov r0, #0x88\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._169 @cond_branch\n" - " str r1, [sp]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r0, ._171\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._171 + 4\n" - " str r0, [r1]\n" - " b ._180\n" - "._172:\n" - " .align 2, 0\n" - "._171:\n" - " .word gTasks\n" - " .word debug_80C44EC+1\n" - "._169:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._174 @cond_branch\n" - " ldr r1, ._176\n" - " ldrb r0, [r1, #0x1]\n" - " cmp r0, #0\n" - " beq ._174 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1, #0x1]\n" - " b ._175\n" - "._177:\n" - " .align 2, 0\n" - "._176:\n" - " .word gUnknown_Debug_2038A0C\n" - "._174:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._180 @cond_branch\n" - " ldr r5, ._181\n" - " ldrb r0, [r5, #0x1]\n" - " cmp r0, #0x4\n" - " bhi ._180 @cond_branch\n" - " add r1, r0, #0\n" - " mov r0, #0x64\n" - " mul r0, r0, r1\n" - " ldr r1, ._181 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " beq ._180 @cond_branch\n" - " ldrb r0, [r5, #0x1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r5, #0x1]\n" - "._175:\n" - " ldr r1, ._181 + 8\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._181 + 12\n" - " str r1, [r0]\n" - "._180:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._182:\n" - " .align 2, 0\n" - "._181:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gPlayerParty\n" - " .word gTasks\n" - " .word debug_80C4348+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C44EC() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r0, ._183\n" - " ldrb r0, [r0, #0x2]\n" - " lsl r0, r0, #0x19\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x12\n" - " add r0, r0, r1\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " str r1, [sp]\n" - " mov r1, #0x10\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r1, ._183 + 4\n" - " ldr r2, ._183 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._183 + 12\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._183 + 16\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._183 + 20\n" - " str r1, [r0]\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._184:\n" - " .align 2, 0\n" - "._183:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word 0x4000042\n" - " .word 0x79ef\n" - " .word 0x17f\n" - " .word gTasks\n" - " .word debug_80C4550+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4550() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r1, ._187\n" - " ldrh r2, [r1, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r2\n" - " add r3, r1, #0\n" - " cmp r0, #0\n" - " beq ._185 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._187 + 4\n" - " ldrb r1, [r0, #0x2]\n" - " mov r0, #0x64\n" - " mul r0, r0, r1\n" - " ldr r1, ._187 + 8\n" - " add r0, r0, r1\n" - " ldr r1, ._187 + 12\n" - " bl debug_sub_80A433C\n" - " add r0, r4, #0\n" - " bl DestroyTask\n" - " b ._209\n" - "._188:\n" - " .align 2, 0\n" - "._187:\n" - " .word gMain\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gEnemyParty\n" - " .word debug_80C41F4+1\n" - "._185:\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._189 @cond_branch\n" - " ldr r0, ._191\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._191 + 4\n" - " str r0, [r1]\n" - " b ._209\n" - "._192:\n" - " .align 2, 0\n" - "._191:\n" - " .word gTasks\n" - " .word debug_80C4F48+1\n" - "._189:\n" - " mov r0, #0x8\n" - " and r0, r0, r2\n" - " lsl r0, r0, #0x10\n" - " lsr r1, r0, #0x10\n" - " cmp r1, #0\n" - " beq ._193 @cond_branch\n" - " bl debug_80C4774\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._209 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " bl CalculatePlayerPartyCount\n" - " bl CalculateEnemyPartyCount\n" - " ldr r0, ._196\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._196 + 4\n" - " str r0, [r1]\n" - " b ._209\n" - "._197:\n" - " .align 2, 0\n" - "._196:\n" - " .word gTasks\n" - " .word debug_80C4D14+1\n" - "._193:\n" - " mov r0, #0x88\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._198 @cond_branch\n" - " str r1, [sp]\n" - " mov r0, #0x0\n" - " mov r1, #0x10\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r0, ._200\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._200 + 4\n" - " str r0, [r1]\n" - " b ._209\n" - "._201:\n" - " .align 2, 0\n" - "._200:\n" - " .word gTasks\n" - " .word debug_80C4348+1\n" - "._198:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._203 @cond_branch\n" - " ldr r1, ._205\n" - " ldrb r0, [r1, #0x2]\n" - " cmp r0, #0\n" - " beq ._203 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1, #0x2]\n" - " b ._204\n" - "._206:\n" - " .align 2, 0\n" - "._205:\n" - " .word gUnknown_Debug_2038A0C\n" - "._203:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._209 @cond_branch\n" - " ldr r5, ._210\n" - " ldrb r0, [r5, #0x2]\n" - " cmp r0, #0x4\n" - " bhi ._209 @cond_branch\n" - " add r1, r0, #0\n" - " mov r0, #0x64\n" - " mul r0, r0, r1\n" - " ldr r1, ._210 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " beq ._209 @cond_branch\n" - " ldrb r0, [r5, #0x2]\n" - " add r0, r0, #0x1\n" - " strb r0, [r5, #0x2]\n" - "._204:\n" - " ldr r1, ._210 + 8\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._210 + 12\n" - " str r1, [r0]\n" - "._209:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._211:\n" - " .align 2, 0\n" - "._210:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gEnemyParty\n" - " .word gTasks\n" - " .word debug_80C44EC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4694() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xffffffe4\n" - " ldr r1, ._213\n" - " mov r0, sp\n" - " mov r2, #0xd\n" - " bl memcpy\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xe\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, sp\n" - " mov r1, #0x2\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " mov r4, #0x0\n" - " add r5, sp, #0x10\n" - "._212:\n" - " mov r0, #0x64\n" - " mul r0, r0, r4\n" - " ldr r1, ._213 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r5, #0\n" - " bl debug_80C405C\n" - " lsl r2, r4, #0x19\n" - " mov r0, #0xc0\n" - " lsl r0, r0, #0x12\n" - " add r2, r2, r0\n" - " lsr r2, r2, #0x18\n" - " add r0, r5, #0\n" - " mov r1, #0x2\n" - " bl Menu_PrintText\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x5\n" - " bls ._212 @cond_branch\n" - " add sp, sp, #0x1c\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._214:\n" - " .align 2, 0\n" - "._213:\n" - " .word gUnknown_Debug_083F81AD\n" - " .word gPlayerParty\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4704() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xffffffe4\n" - " ldr r1, ._216\n" - " mov r0, sp\n" - " mov r2, #0xd\n" - " bl memcpy\n" - " mov r0, #0xf\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, sp\n" - " mov r1, #0x11\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " mov r4, #0x0\n" - " add r5, sp, #0x10\n" - "._215:\n" - " mov r0, #0x64\n" - " mul r0, r0, r4\n" - " ldr r1, ._216 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r5, #0\n" - " bl debug_80C405C\n" - " lsl r2, r4, #0x19\n" - " mov r0, #0xc0\n" - " lsl r0, r0, #0x12\n" - " add r2, r2, r0\n" - " lsr r2, r2, #0x18\n" - " add r0, r5, #0\n" - " mov r1, #0x11\n" - " bl Menu_PrintText\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x5\n" - " bls ._215 @cond_branch\n" - " add sp, sp, #0x1c\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._217:\n" - " .align 2, 0\n" - "._216:\n" - " .word gUnknown_Debug_083F81BA\n" - " .word gEnemyParty\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4774() -{ - asm( - " push {r4, lr}\n" - " ldr r0, ._221\n" - " ldrb r0, [r0, #0xc]\n" - " sub r0, r0, #0x1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x64\n" - " add r4, r0, #0\n" - " mul r4, r4, r1\n" - " ldr r0, ._221 + 4\n" - " add r0, r4, r0\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " beq ._219 @cond_branch\n" - " ldr r0, ._221 + 8\n" - " add r0, r4, r0\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " beq ._219 @cond_branch\n" - " mov r0, #0x1\n" - " b ._220\n" - "._222:\n" - " .align 2, 0\n" - "._221:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gPlayerParty\n" - " .word gEnemyParty\n" - "._219:\n" - " mov r0, #0x0\n" - "._220:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C47BC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xffffffc0\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " ldr r1, ._224\n" - " mov r0, sp\n" - " mov r2, #0xf\n" - " bl memcpy\n" - " add r4, sp, #0x10\n" - " ldr r1, ._224 + 4\n" - " add r0, r4, #0\n" - " mov r2, #0xd\n" - " bl memcpy\n" - " add r6, sp, #0x20\n" - " ldr r1, ._224 + 8\n" - " add r0, r6, #0\n" - " mov r2, #0xf\n" - " bl memcpy\n" - " add r5, sp, #0x30\n" - " ldr r1, ._224 + 12\n" - " add r0, r5, #0\n" - " mov r2, #0x10\n" - " bl memcpy\n" - " mov r0, #0x0\n" - " mov r1, #0x10\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, sp\n" - " mov r1, #0x1\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0x14\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xe\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, r6, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " mov r4, #0x0\n" - " ldr r6, ._224 + 16\n" - "._223:\n" - " lsl r0, r4, #0x3\n" - " add r0, r0, r6\n" - " ldr r0, [r0]\n" - " lsl r2, r4, #0x19\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x12\n" - " add r2, r2, r1\n" - " lsr r2, r2, #0x18\n" - " mov r1, #0x2\n" - " bl Menu_PrintText\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x4\n" - " bls ._223 @cond_branch\n" - " mov r0, #0xf\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, r5, #0\n" - " mov r1, #0x11\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._224 + 20\n" - " ldrb r0, [r0, #0x4]\n" - " bl debug_80C4C44\n" - " ldr r1, ._224 + 24\n" - " lsl r0, r7, #0x2\n" - " add r0, r0, r7\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._224 + 28\n" - " str r1, [r0]\n" - " add sp, sp, #0x40\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._225:\n" - " .align 2, 0\n" - "._224:\n" - " .word gUnknown_Debug_083F81C7\n" - " .word gUnknown_Debug_083F81A0\n" - " .word gUnknown_Debug_083F81D6\n" - " .word gUnknown_Debug_083F81E5\n" - " .word gUnknown_Debug_083F8068\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gTasks\n" - " .word debug_80C48A0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C48A0() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r0, ._226\n" - " ldrb r0, [r0, #0x3]\n" - " lsl r0, r0, #0x19\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x12\n" - " add r0, r0, r1\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " str r1, [sp]\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r1, ._226 + 4\n" - " ldr r2, ._226 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " add r2, r2, #0x8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._226 + 12\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._226 + 16\n" - " str r1, [r0]\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._227:\n" - " .align 2, 0\n" - "._226:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word 0x4000042\n" - " .word 0x177\n" - " .word gTasks\n" - " .word debug_80C4900+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4900() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " ldr r1, ._230\n" - " ldrh r2, [r1, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " add r3, r1, #0\n" - " cmp r4, #0\n" - " beq ._228 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._230 + 4\n" - " bl SetMainCallback2\n" - " bl LoadPlayerParty\n" - " ldr r1, ._230 + 8\n" - " ldr r0, ._230 + 12\n" - " ldrb r0, [r0, #0xd]\n" - " strb r0, [r1, #0x8]\n" - " ldr r0, ._230 + 16\n" - " mov r1, #0x0\n" - " strh r4, [r0]\n" - " ldr r0, ._230 + 20\n" - " strb r1, [r0]\n" - " ldr r1, ._230 + 24\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._230 + 28\n" - " b ._229\n" - "._231:\n" - " .align 2, 0\n" - "._230:\n" - " .word gMain\n" - " .word debug_80C370C+1\n" - " .word gSaveBlock2\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gBattleTypeFlags\n" - " .word gUnknown_02023A14_50\n" - " .word gTasks\n" - " .word debug_80C373C+1\n" - "._228:\n" - " mov r0, #0x8\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._232 @cond_branch\n" - " mov r0, #0x1\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._233 @cond_branch\n" - "._232:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._236\n" - " ldr r3, ._236 + 4\n" - " ldr r2, ._236 + 8\n" - " ldrb r0, [r2, #0x3]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r3\n" - " ldrb r0, [r0, #0x4]\n" - " strh r0, [r1]\n" - " ldr r1, ._236 + 12\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " ldrb r0, [r2, #0x3]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r3\n" - " ldrb r0, [r0, #0x5]\n" - " strb r0, [r2, #0xc]\n" - " ldrb r0, [r2, #0x3]\n" - " sub r0, r0, #0x1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bhi ._234 @cond_branch\n" - " str r4, [sp]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r0, ._236 + 16\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._236 + 20\n" - " str r0, [r1]\n" - " b ._247\n" - "._237:\n" - " .align 2, 0\n" - "._236:\n" - " .word gBattleTypeFlags\n" - " .word gUnknown_Debug_083F8068\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gUnknown_02023A14_50\n" - " .word gTasks\n" - " .word debug_80C4A60+1\n" - "._234:\n" - " ldr r0, ._239\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._239 + 4\n" - " str r0, [r1]\n" - " b ._247\n" - "._240:\n" - " .align 2, 0\n" - "._239:\n" - " .word gTasks\n" - " .word debug_80C4F48+1\n" - "._233:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._242 @cond_branch\n" - " ldr r1, ._244\n" - " ldrb r0, [r1, #0x3]\n" - " cmp r0, #0\n" - " beq ._242 @cond_branch\n" - " sub r0, r0, #0x1\n" - " b ._243\n" - "._245:\n" - " .align 2, 0\n" - "._244:\n" - " .word gUnknown_Debug_2038A0C\n" - "._242:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._247 @cond_branch\n" - " ldr r1, ._248\n" - " ldrb r0, [r1, #0x3]\n" - " cmp r0, #0x1\n" - " bhi ._247 @cond_branch\n" - " add r0, r0, #0x1\n" - "._243:\n" - " strb r0, [r1, #0x3]\n" - " ldr r1, ._248 + 4\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._248 + 8\n" - "._229:\n" - " str r1, [r0]\n" - "._247:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._249:\n" - " .align 2, 0\n" - "._248:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gTasks\n" - " .word debug_80C48A0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4A60() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r0, ._250\n" - " ldrb r0, [r0, #0x5]\n" - " lsl r0, r0, #0x19\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x12\n" - " add r0, r0, r1\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " str r1, [sp]\n" - " mov r1, #0x10\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r1, ._250 + 4\n" - " ldr r2, ._250 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._250 + 12\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._250 + 16\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._250 + 20\n" - " str r1, [r0]\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._251:\n" - " .align 2, 0\n" - "._250:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word 0x4000042\n" - " .word 0x79ef\n" - " .word 0x17f\n" - " .word gTasks\n" - " .word debug_80C4AC4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4AC4() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " ldr r7, ._255\n" - " ldrb r0, [r7, #0x4]\n" - " mov ip, r0\n" - " ldrb r5, [r7, #0x5]\n" - " mov r1, ip\n" - " add r0, r1, r5\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " ldr r2, ._255 + 4\n" - " mov r8, r2\n" - " ldrh r2, [r2, #0x2e]\n" - " mov r3, #0x1\n" - " and r3, r3, r2\n" - " add r4, r7, #0\n" - " cmp r3, #0\n" - " beq ._252 @cond_branch\n" - " ldr r0, ._255 + 8\n" - " lsl r1, r1, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r1, [r1]\n" - " ldr r3, ._255 + 12\n" - " ldr r2, [r3]\n" - " add r0, r2, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._253 @cond_branch\n" - " ldr r0, ._255 + 16\n" - " eor r1, r1, r0\n" - " and r2, r2, r1\n" - " b ._254\n" - "._256:\n" - " .align 2, 0\n" - "._255:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gMain\n" - " .word gUnknown_Debug_083F80D8\n" - " .word byte_3005E30\n" - " .word 0xffff\n" - "._253:\n" - " orr r2, r2, r1\n" - "._254:\n" - " str r2, [r3]\n" - " ldrb r0, [r4, #0x4]\n" - " bl debug_80C4C44\n" - " ldr r1, ._258\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._258 + 4\n" - " str r1, [r0]\n" - " b ._274\n" - "._259:\n" - " .align 2, 0\n" - "._258:\n" - " .word gTasks\n" - " .word debug_80C4A60+1\n" - "._252:\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " cmp r4, #0\n" - " beq ._260 @cond_branch\n" - " str r3, [sp]\n" - " mov r0, #0x0\n" - " mov r1, #0x10\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r0, ._262\n" - " lsl r1, r6, #0x2\n" - " add r1, r1, r6\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._262 + 4\n" - " b ._261\n" - "._263:\n" - " .align 2, 0\n" - "._262:\n" - " .word gTasks\n" - " .word debug_80C48A0+1\n" - "._260:\n" - " mov r0, #0x8\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._264 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._266\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x3\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._266 + 4\n" - " ldrb r2, [r1, #0x1]\n" - " mov r0, #0x11\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " strb r0, [r1, #0x1]\n" - " mov r0, #0xac\n" - " strb r0, [r1, #0x2]\n" - " mov r0, #0xff\n" - " strb r0, [r1, #0x3]\n" - " strb r4, [r1, #0x9]\n" - " strb r4, [r1, #0xa]\n" - " strb r4, [r1, #0xb]\n" - " strb r4, [r1, #0xc]\n" - " ldr r1, ._266 + 8\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._266 + 12\n" - " str r1, [r0]\n" - " b ._274\n" - "._267:\n" - " .align 2, 0\n" - "._266:\n" - " .word gTrainerBattleOpponent\n" - " .word +0x2017000\n" - " .word gTasks\n" - " .word debug_80C4F48+1\n" - "._264:\n" - " mov r0, r8\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._268 @cond_branch\n" - " lsl r0, r5, #0x18\n" - " cmp r0, #0\n" - " beq ._269 @cond_branch\n" - " sub r0, r5, #1\n" - " strb r0, [r7, #0x5]\n" - " b ._277\n" - "._269:\n" - " mov r1, ip\n" - " lsl r0, r1, #0x18\n" - " cmp r0, #0\n" - " beq ._277 @cond_branch\n" - " mov r0, ip\n" - " sub r0, r0, #0x1\n" - " b ._272\n" - "._268:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._274 @cond_branch\n" - " lsl r0, r5, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x8\n" - " bhi ._274 @cond_branch\n" - " cmp r0, #0x4\n" - " bhi ._275 @cond_branch\n" - " add r0, r5, #1\n" - " strb r0, [r7, #0x5]\n" - " b ._277\n" - "._275:\n" - " mov r2, ip\n" - " lsl r0, r2, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x3\n" - " bhi ._277 @cond_branch\n" - " mov r0, ip\n" - " add r0, r0, #0x1\n" - "._272:\n" - " strb r0, [r7, #0x4]\n" - " ldrb r0, [r7, #0x4]\n" - " bl debug_80C4C44\n" - "._277:\n" - " ldr r0, ._278\n" - " lsl r1, r6, #0x2\n" - " add r1, r1, r6\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._278 + 4\n" - "._261:\n" - " str r0, [r1]\n" - "._274:\n" - " add sp, sp, #0x4\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._279:\n" - " .align 2, 0\n" - "._278:\n" - " .word gTasks\n" - " .word debug_80C4A60+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4C44() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffff0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov sl, r0\n" - " mov r2, #0x0\n" - " mov r5, sp\n" - "._290:\n" - " mov r0, sl\n" - " add r6, r2, r0\n" - " add r4, r6, #0\n" - " add r1, r2, #1\n" - " mov r8, r1\n" - " cmp r4, #0x9\n" - " bgt ._280 @cond_branch\n" - " mov r3, #0x0\n" - " ldr r1, ._288\n" - " lsl r0, r4, #0x3\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " ldrb r0, [r0]\n" - " ldr r7, ._288 + 4\n" - " mov r9, r7\n" - " lsl r2, r2, #0x1\n" - " mov ip, r2\n" - " cmp r0, #0xff\n" - " beq ._282 @cond_branch\n" - " add r7, r1, #0\n" - "._283:\n" - " add r0, r3, #3\n" - " mov r1, sp\n" - " add r2, r1, r0\n" - " lsl r1, r6, #0x3\n" - " add r1, r1, r7\n" - " ldr r0, [r1]\n" - " add r0, r0, r3\n" - " ldrb r0, [r0]\n" - " strb r0, [r2]\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - " ldr r0, [r1]\n" - " add r0, r0, r3\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._282 @cond_branch\n" - " cmp r3, #0xb\n" - " bls ._283 @cond_branch\n" - "._282:\n" - " cmp r3, #0xb\n" - " bhi ._284 @cond_branch\n" - " mov r1, #0x0\n" - "._285:\n" - " add r0, r3, #3\n" - " add r0, r0, sp\n" - " strb r1, [r0]\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - " cmp r3, #0xb\n" - " bls ._285 @cond_branch\n" - "._284:\n" - " mov r0, #0xff\n" - " strb r0, [r5, #0xe]\n" - " mov r0, #0xfc\n" - " strb r0, [r5]\n" - " mov r2, #0x1\n" - " strb r2, [r5, #0x1]\n" - " add r1, r2, #0\n" - " LSL r1, r4\n" - " mov r3, r9\n" - " ldr r0, [r3]\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._286 @cond_branch\n" - " mov r0, #0x3\n" - " strb r0, [r5, #0x2]\n" - " b ._287\n" - "._289:\n" - " .align 2, 0\n" - "._288:\n" - " .word gUnknown_Debug_083F80D8\n" - " .word byte_3005E30\n" - "._286:\n" - " strb r2, [r5, #0x2]\n" - "._287:\n" - " mov r2, ip\n" - " add r2, r2, #0x3\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r0, sp\n" - " mov r1, #0x11\n" - " bl Menu_PrintText\n" - "._280:\n" - " mov r7, r8\n" - " lsl r0, r7, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x5\n" - " bls ._290 @cond_branch\n" - " add sp, sp, #0x10\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4D14() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xffffffd0\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r1, ._291\n" - " mov r0, sp\n" - " mov r2, #0xf\n" - " bl memcpy\n" - " add r5, sp, #0x10\n" - " ldr r1, ._291 + 4\n" - " add r0, r5, #0\n" - " mov r2, #0xd\n" - " bl memcpy\n" - " add r6, sp, #0x20\n" - " ldr r1, ._291 + 8\n" - " add r0, r6, #0\n" - " mov r2, #0xf\n" - " bl memcpy\n" - " mov r0, #0x0\n" - " mov r1, #0x10\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, sp\n" - " mov r1, #0x1\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " add r0, r5, #0\n" - " mov r1, #0x14\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xe\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, r6, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._291 + 12\n" - " ldrb r0, [r0, #0x6]\n" - " bl debug_80C4F00\n" - " mov r0, #0xf\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r1, ._291 + 16\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._291 + 20\n" - " str r1, [r0]\n" - " add sp, sp, #0x30\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._292:\n" - " .align 2, 0\n" - "._291:\n" - " .word gUnknown_Debug_083F81C7\n" - " .word gUnknown_Debug_083F81F5\n" - " .word gUnknown_Debug_083F8202\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gTasks\n" - " .word debug_80C4DB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4DB8() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r0, ._293\n" - " ldrb r0, [r0, #0x7]\n" - " lsl r0, r0, #0x19\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x12\n" - " add r0, r0, r1\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " str r1, [sp]\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r1, ._293 + 4\n" - " ldr r2, ._293 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " add r2, r2, #0x8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._293 + 12\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._293 + 16\n" - " str r1, [r0]\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._294:\n" - " .align 2, 0\n" - "._293:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word 0x4000042\n" - " .word 0x177\n" - " .word gTasks\n" - " .word debug_80C4E18+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4E18() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r5, ._297\n" - " ldrb r3, [r5, #0x6]\n" - " ldrb r2, [r5, #0x7]\n" - " add r0, r3, r2\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " ldr r7, ._297 + 4\n" - " ldrh r1, [r7, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._295 @cond_branch\n" - " ldr r0, ._297 + 8\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._297 + 12\n" - " b ._296\n" - "._298:\n" - " .align 2, 0\n" - "._297:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gMain\n" - " .word gTasks\n" - " .word debug_80C42B8+1\n" - "._295:\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._299 @cond_branch\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._300 @cond_branch\n" - "._299:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r2, ._302\n" - " ldr r1, ._302 + 4\n" - " lsl r0, r6, #0x3\n" - " add r0, r0, r1\n" - " ldrb r0, [r0, #0x4]\n" - " strb r0, [r2]\n" - " ldr r1, ._302 + 8\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._302 + 12\n" - " str r1, [r0]\n" - " b ._310\n" - "._303:\n" - " .align 2, 0\n" - "._302:\n" - " .word gBattleTerrain\n" - " .word gUnknown_Debug_083F814C\n" - " .word gTasks\n" - " .word debug_80C5158+1\n" - "._300:\n" - " ldrh r1, [r7, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._304 @cond_branch\n" - " lsl r0, r2, #0x18\n" - " cmp r0, #0\n" - " beq ._305 @cond_branch\n" - " sub r0, r2, #1\n" - " strb r0, [r5, #0x7]\n" - " b ._313\n" - "._305:\n" - " lsl r0, r3, #0x18\n" - " cmp r0, #0\n" - " beq ._313 @cond_branch\n" - " sub r0, r3, #1\n" - " b ._308\n" - "._304:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._310 @cond_branch\n" - " lsl r0, r2, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x7\n" - " bhi ._310 @cond_branch\n" - " cmp r0, #0x4\n" - " bhi ._311 @cond_branch\n" - " add r0, r2, #1\n" - " strb r0, [r5, #0x7]\n" - " b ._313\n" - "._311:\n" - " lsl r0, r3, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x2\n" - " bhi ._313 @cond_branch\n" - " add r0, r3, #1\n" - "._308:\n" - " strb r0, [r5, #0x6]\n" - " ldrb r0, [r5, #0x6]\n" - " bl debug_80C4F00\n" - "._313:\n" - " ldr r0, ._314\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._314 + 4\n" - "._296:\n" - " str r0, [r1]\n" - "._310:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._315:\n" - " .align 2, 0\n" - "._314:\n" - " .word gTasks\n" - " .word debug_80C4DB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4F00() -{ - asm( - " push {r4, r5, r6, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " mov r0, #0x1\n" - " mov r1, #0x3\n" - " mov r2, #0xd\n" - " mov r3, #0xe\n" - " bl Menu_BlankWindowRect\n" - " mov r4, #0x0\n" - " ldr r6, ._318\n" - "._317:\n" - " cmp r4, #0x8\n" - " bhi ._316 @cond_branch\n" - " add r0, r4, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r6\n" - " ldr r0, [r0]\n" - " lsl r2, r4, #0x19\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x12\n" - " add r2, r2, r1\n" - " lsr r2, r2, #0x18\n" - " mov r1, #0x2\n" - " bl Menu_PrintText\n" - "._316:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0x5\n" - " bls ._317 @cond_branch\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._319:\n" - " .align 2, 0\n" - "._318:\n" - " .word gUnknown_Debug_083F814C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C4F48() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6}\n" - " add sp, sp, #0xffffffc4\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r1, ._320\n" - " mov r0, sp\n" - " mov r2, #0x11\n" - " bl memcpy\n" - " add r6, sp, #0x14\n" - " ldr r1, ._320 + 4\n" - " add r0, r6, #0\n" - " mov r2, #0xd\n" - " bl memcpy\n" - " add r5, sp, #0x24\n" - " ldr r1, ._320 + 8\n" - " add r0, r5, #0\n" - " mov r2, #0xd\n" - " bl memcpy\n" - " add r0, sp, #0x34\n" - " mov r9, r0\n" - " ldr r1, ._320 + 12\n" - " mov r2, #0x4\n" - " bl memcpy\n" - " add r0, sp, #0x38\n" - " mov r8, r0\n" - " ldr r1, ._320 + 16\n" - " mov r2, #0x4\n" - " bl memcpy\n" - " mov r0, #0x0\n" - " mov r1, #0x10\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, sp\n" - " mov r1, #0x1\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " mov r1, #0x14\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xe\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, r5, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " mov r0, #0x1\n" - " mov r1, #0x3\n" - " mov r2, #0xd\n" - " mov r3, #0xe\n" - " bl Menu_BlankWindowRect\n" - " add r0, r5, #0\n" - " mov r1, #0x2\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " mov r0, r9\n" - " mov r1, #0x2\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " mov r0, r8\n" - " mov r1, #0x2\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, #0xf\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0xf\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r1, ._320 + 20\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._320 + 24\n" - " str r1, [r0]\n" - " add sp, sp, #0x3c\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._321:\n" - " .align 2, 0\n" - "._320:\n" - " .word gUnknown_Debug_083F8211\n" - " .word gUnknown_Debug_083F81A0\n" - " .word gUnknown_Debug_083F8222\n" - " .word gUnknown_Debug_083F822F\n" - " .word gUnknown_Debug_083F8233\n" - " .word gTasks\n" - " .word debug_80C5038+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5038() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r0, ._322\n" - " ldrb r0, [r0, #0x8]\n" - " lsl r0, r0, #0x19\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x12\n" - " add r0, r0, r1\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0x1\n" - " str r1, [sp]\n" - " mov r2, #0x1\n" - " mov r3, #0xe\n" - " bl debug_80C38E4\n" - " ldr r1, ._322 + 4\n" - " ldr r2, ._322 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " add r2, r2, #0x8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._322 + 12\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._322 + 16\n" - " str r1, [r0]\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._323:\n" - " .align 2, 0\n" - "._322:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word 0x4000042\n" - " .word 0x177\n" - " .word gTasks\n" - " .word debug_80C5098+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5098() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r1, ._326\n" - " ldrh r2, [r1, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " add r3, r1, #0\n" - " cmp r0, #0\n" - " beq ._324 @cond_branch\n" - " ldr r0, ._326 + 4\n" - " lsl r1, r4, #0x2\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._326 + 8\n" - " str r0, [r1]\n" - " b ._339\n" - "._327:\n" - " .align 2, 0\n" - "._326:\n" - " .word gMain\n" - " .word gTasks\n" - " .word debug_80C47BC+1\n" - "._324:\n" - " mov r0, #0x8\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._328 @cond_branch\n" - " mov r0, #0x1\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._329 @cond_branch\n" - "._328:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._331\n" - " ldr r0, ._331 + 4\n" - " ldrb r0, [r0, #0x8]\n" - " strb r0, [r1, #0x8]\n" - " ldr r1, ._331 + 8\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._331 + 12\n" - " b ._330\n" - "._332:\n" - " .align 2, 0\n" - "._331:\n" - " .word gSaveBlock2\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gTasks\n" - " .word debug_80C42B8+1\n" - "._329:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._334 @cond_branch\n" - " ldr r1, ._336\n" - " ldrb r0, [r1, #0x8]\n" - " cmp r0, #0\n" - " beq ._334 @cond_branch\n" - " sub r0, r0, #0x1\n" - " b ._335\n" - "._337:\n" - " .align 2, 0\n" - "._336:\n" - " .word gUnknown_Debug_2038A0C\n" - "._334:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._339 @cond_branch\n" - " ldr r1, ._340\n" - " ldrb r0, [r1, #0x8]\n" - " cmp r0, #0\n" - " bne ._339 @cond_branch\n" - " add r0, r0, #0x1\n" - "._335:\n" - " strb r0, [r1, #0x8]\n" - " ldr r1, ._340 + 4\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._340 + 8\n" - "._330:\n" - " str r1, [r0]\n" - "._339:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._341:\n" - " .align 2, 0\n" - "._340:\n" - " .word gUnknown_Debug_2038A0C\n" - " .word gTasks\n" - " .word debug_80C5038+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5158() -{ - asm( - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._342\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldr r0, ._342 + 4\n" - " str r0, [r1]\n" - " bx lr\n" - "._343:\n" - " .align 2, 0\n" - "._342:\n" - " .word gTasks\n" - " .word debug_80C5174+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5174() -{ - asm( - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._344\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldr r0, ._344 + 4\n" - " str r0, [r1]\n" - " bx lr\n" - "._345:\n" - " .align 2, 0\n" - "._344:\n" - " .word gTasks\n" - " .word debug_80C5190+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5190() -{ - asm( - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._346\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldr r0, ._346 + 4\n" - " str r0, [r1]\n" - " bx lr\n" - "._347:\n" - " .align 2, 0\n" - "._346:\n" - " .word gTasks\n" - " .word debug_80C51AC+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C51AC() -{ - asm( - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._348\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldr r0, ._348 + 4\n" - " str r0, [r1]\n" - " bx lr\n" - "._349:\n" - " .align 2, 0\n" - "._348:\n" - " .word gTasks\n" - " .word debug_80C51C8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C51C8() -{ - asm( - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._350\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldr r0, ._350 + 4\n" - " str r0, [r1]\n" - " bx lr\n" - "._351:\n" - " .align 2, 0\n" - "._350:\n" - " .word gTasks\n" - " .word debug_80C51E4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C51E4() -{ - asm( - " push {lr}\n" - " bl sub_80408BC\n" - " ldr r0, ._352\n" - " ldr r1, ._352 + 4\n" - " str r1, [r0, #0x8]\n" - " ldr r0, ._352 + 8\n" - " bl SetMainCallback2\n" - " pop {r0}\n" - " bx r0\n" - "._353:\n" - " .align 2, 0\n" - "._352:\n" - " .word gMain\n" - " .word debug_80C41A8+1\n" - " .word unref_sub_800D684+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5208() -{ - asm( - " push {r4, r5, r6, lr}\n" - " ldr r1, ._355\n" - " ldr r0, ._355 + 4\n" - " str r0, [r1]\n" - " mov r3, #0x0\n" - " add r6, r1, #0\n" - " ldr r4, ._355 + 8\n" - " add r5, r6, #0\n" - " mov r2, #0x0\n" - "._354:\n" - " ldr r0, [r5]\n" - " lsl r1, r3, #0x2\n" - " add r0, r0, #0x64\n" - " add r0, r0, r1\n" - " str r2, [r0]\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r3, r0, #0x10\n" - " cmp r3, #0x3f\n" - " bls ._354 @cond_branch\n" - " ldr r2, [r6]\n" - " mov r0, #0xfc\n" - " str r0, [r2, #0x64]\n" - " ldrb r1, [r4, #0xa]\n" - " ldrb r0, [r4, #0xb]\n" - " lsl r0, r0, #0x8\n" - " orr r1, r1, r0\n" - " ldrb r0, [r4, #0xc]\n" - " lsl r0, r0, #0x10\n" - " orr r1, r1, r0\n" - " ldrb r0, [r4, #0xd]\n" - " lsl r0, r0, #0x18\n" - " orr r1, r1, r0\n" - " str r1, [r2, #0x70]\n" - " bl Random\n" - " add r4, r0, #0\n" - " bl Random\n" - " ldr r1, [r6]\n" - " lsl r4, r4, #0x10\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " orr r4, r4, r0\n" - " str r4, [r1, #0x74]\n" - " mov r0, #0x1\n" - " str r0, [r1, #0x68]\n" - " str r0, [r1, #0x6c]\n" - " bl debug_80C5C94\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._356:\n" - " .align 2, 0\n" - "._355:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word +0x2018000\n" - " .word gSaveBlock2\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C527C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add r6, r0, #0\n" - " mov r5, #0x0\n" - " ldr r7, ._359\n" - "._361:\n" - " mov r0, #0x64\n" - " add r1, r5, #0\n" - " mul r1, r1, r0\n" - " ldr r0, ._359 + 4\n" - " add r4, r1, r0\n" - " add r0, r4, #0\n" - " mov r1, #0xb\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " cmp r0, #0\n" - " bne ._357 @cond_branch\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " mov r2, #0x64\n" - " bl memcpy\n" - " add r0, r5, #1\n" - " strb r0, [r7]\n" - " mov r0, #0x0\n" - " b ._358\n" - "._360:\n" - " .align 2, 0\n" - "._359:\n" - " .word gPlayerPartyCount\n" - " .word gPlayerParty\n" - "._357:\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x5\n" - " bls ._361 @cond_branch\n" - " ldr r0, ._362\n" - " ldr r0, [r0]\n" - " bl SendMonToPC\n" - " mov r0, #0x1\n" - "._358:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._363:\n" - " .align 2, 0\n" - "._362:\n" - " .word gUnknown_Debug_2038A1C\n" - "\n" - ); -} - -__attribute__((naked)) -void InitCreatePokemon() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xffffffd4\n" - " ldr r1, ._364\n" - " add r0, sp, #0x4\n" - " mov r2, #0x25\n" - " bl memcpy\n" - " bl debug_80C35DC\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r1, #0x0\n" - " mov r2, #0x10\n" - " mov r3, #0x0\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._364 + 4\n" - " mov r5, #0x0\n" - " strh r4, [r0]\n" - " add r0, r0, #0x2\n" - " strh r4, [r0]\n" - " add r0, r0, #0x2\n" - " strh r4, [r0]\n" - " ldr r3, ._364 + 8\n" - " ldrh r2, [r3]\n" - " strh r4, [r3]\n" - " ldr r4, ._364 + 12\n" - " ldrh r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " strh r0, [r4]\n" - " strh r2, [r3]\n" - " ldr r2, ._364 + 16\n" - " ldrh r0, [r2]\n" - " mov r1, #0x8\n" - " orr r0, r0, r1\n" - " strh r0, [r2]\n" - " ldr r0, ._364 + 20\n" - " bl SetVBlankCallback\n" - " ldr r0, ._364 + 24\n" - " bl SetMainCallback2\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x3\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, sp, #0x4\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " mov r1, #0x80\n" - " lsl r1, r1, #0x13\n" - " mov r2, #0x8a\n" - " lsl r2, r2, #0x5\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r0, ._364 + 28\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " bl debug_80C5208\n" - " ldr r1, ._364 + 32\n" - " ldr r0, [r1]\n" - " mov r2, #0xb4\n" - " lsl r2, r2, #0x1\n" - " add r0, r0, r2\n" - " strb r5, [r0]\n" - " ldr r0, [r1]\n" - " ldr r1, ._364 + 36\n" - " add r0, r0, r1\n" - " strb r5, [r0]\n" - " add sp, sp, #0x2c\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._365:\n" - " .align 2, 0\n" - "._364:\n" - " .word gUnknown_Debug_083F8733\n" - " .word 0x4000050\n" - " .word 0x4000208\n" - " .word 0x4000200\n" - " .word 0x4000004\n" - " .word debug_80C3758+1\n" - " .word debug_80C370C+1\n" - " .word debug_80C53A4+1\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C53A4() -{ - asm( - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._366\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldr r0, ._366 + 4\n" - " str r0, [r1]\n" - " bx lr\n" - "._367:\n" - " .align 2, 0\n" - "._366:\n" - " .word gTasks\n" - " .word debug_80C53C0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C53C0() -{ - asm( - " push {r4, lr}\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " bl debug_80C6384\n" - " mov r0, #0x0\n" - " bl debug_80C627C\n" - " ldr r1, ._368\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._368 + 4\n" - " str r1, [r0]\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._369:\n" - " .align 2, 0\n" - "._368:\n" - " .word gTasks\n" - " .word debug_80C53F0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C53F0() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " ldr r0, ._372\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r2, #0x1\n" - " and r2, r2, r1\n" - " add r4, r0, #0\n" - " cmp r2, #0\n" - " beq ._370 @cond_branch\n" - " ldr r0, ._372 + 4\n" - " ldr r3, [r0]\n" - " mov r0, #0xb2\n" - " lsl r0, r0, #0x1\n" - " add r2, r3, r0\n" - " ldr r1, ._372 + 8\n" - " mov r4, #0xb4\n" - " lsl r4, r4, #0x1\n" - " add r0, r3, r4\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r6, ._372 + 12\n" - " add r1, r3, r6\n" - " ldrb r1, [r1]\n" - " ldr r0, [r0]\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " lsl r1, r1, #0x2\n" - " add r0, r3, #0\n" - " add r0, r0, #0x64\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " str r0, [r2]\n" - " mov r0, #0xb5\n" - " lsl r0, r0, #0x1\n" - " add r1, r3, r0\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " bl debug_80C643C\n" - " ldr r1, ._372 + 16\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._372 + 20\n" - " b ._375\n" - "._373:\n" - " .align 2, 0\n" - "._372:\n" - " .word gMain\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gUnknown_Debug_083F8698\n" - " .word 0x169\n" - " .word gTasks\n" - " .word debug_80C55E4+1\n" - "._370:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._374 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " str r2, [sp]\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._376\n" - " bl SetMainCallback2\n" - " ldr r1, ._376 + 4\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._376 + 8\n" - " b ._375\n" - "._377:\n" - " .align 2, 0\n" - "._376:\n" - " .word debug_80C370C+1\n" - " .word gTasks\n" - " .word debug_80C373C+1\n" - "._374:\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._378 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " bl debug_80C5FFC\n" - " ldr r0, ._381\n" - " ldr r0, [r0]\n" - " bl debug_80C527C\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " mov r0, #0x3\n" - " mov r1, #0x8\n" - " mov r2, #0x1a\n" - " mov r3, #0xb\n" - " bl Menu_DrawStdWindowFrame\n" - " cmp r4, #0\n" - " beq ._379 @cond_branch\n" - " ldr r0, ._381 + 4\n" - " mov r1, #0x4\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " b ._380\n" - "._382:\n" - " .align 2, 0\n" - "._381:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gUnknown_Debug_083F872A\n" - "._379:\n" - " ldr r0, ._384\n" - " mov r1, #0x4\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - "._380:\n" - " ldr r0, ._384 + 4\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._384 + 8\n" - " str r0, [r1]\n" - " b ._400\n" - "._385:\n" - " .align 2, 0\n" - "._384:\n" - " .word gUnknown_Debug_083F8720\n" - " .word gTasks\n" - " .word debug_80C5708+1\n" - "._378:\n" - " mov r0, #0x4\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._386 @cond_branch\n" - " ldr r0, ._388\n" - " ldr r0, [r0]\n" - " ldr r4, [r0, #0x64]\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r4, #0\n" - " mov r1, #0x2\n" - " bl GetSetPokedexFlag\n" - " add r0, r4, #0\n" - " mov r1, #0x3\n" - " bl GetSetPokedexFlag\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " b ._400\n" - "._389:\n" - " .align 2, 0\n" - "._388:\n" - " .word gUnknown_Debug_2038A1C\n" - "._386:\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._390 @cond_branch\n" - " mov r0, #0x2\n" - " bl debug_80C627C\n" - " b ._400\n" - "._390:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r3, r0, #0x10\n" - " cmp r3, #0\n" - " beq ._392 @cond_branch\n" - " mov r0, #0x1\n" - " bl debug_80C627C\n" - " b ._400\n" - "._392:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._395 @cond_branch\n" - " ldr r2, ._397\n" - " ldr r0, [r2]\n" - " mov r6, #0xb4\n" - " lsl r6, r6, #0x1\n" - " add r1, r0, r6\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._395 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r0, [r2]\n" - " ldr r1, ._397 + 4\n" - " add r0, r0, r1\n" - " strb r3, [r0]\n" - " b ._396\n" - "._398:\n" - " .align 2, 0\n" - "._397:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - "._395:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._400 @cond_branch\n" - " ldr r3, ._401\n" - " ldr r0, [r3]\n" - " mov r4, #0xb4\n" - " lsl r4, r4, #0x1\n" - " add r2, r0, r4\n" - " ldrb r0, [r2]\n" - " cmp r0, #0x4\n" - " bhi ._400 @cond_branch\n" - " add r0, r0, #0x1\n" - " mov r1, #0x0\n" - " strb r0, [r2]\n" - " ldr r0, [r3]\n" - " ldr r6, ._401 + 4\n" - " add r0, r0, r6\n" - " strb r1, [r0]\n" - "._396:\n" - " ldr r1, ._401 + 8\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._401 + 12\n" - "._375:\n" - " str r1, [r0]\n" - "._400:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._402:\n" - " .align 2, 0\n" - "._401:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - " .word gTasks\n" - " .word debug_80C53C0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C55E4() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - " add r6, r3, #0\n" - " ldr r1, ._405\n" - " ldr r2, ._405 + 4\n" - " ldr r0, [r2]\n" - " mov ip, r0\n" - " mov r0, #0xb4\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, ip\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._405 + 8\n" - " add r1, r1, ip\n" - " ldrb r1, [r1]\n" - " ldr r0, [r0]\n" - " add r0, r0, r1\n" - " ldrb r5, [r0]\n" - " add r7, r5, #0\n" - " ldr r1, ._405 + 12\n" - " ldrh r4, [r1, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r4\n" - " mov r8, r2\n" - " add r2, r1, #0\n" - " cmp r0, #0\n" - " beq ._403 @cond_branch\n" - " ldr r0, ._405 + 16\n" - " lsl r1, r3, #0x2\n" - " add r1, r1, r3\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._405 + 20\n" - " str r0, [r1]\n" - " b ._422\n" - "._406:\n" - " .align 2, 0\n" - "._405:\n" - " .word gUnknown_Debug_083F8698\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - " .word gMain\n" - " .word gTasks\n" - " .word debug_80C53C0+1\n" - "._403:\n" - " mov r0, #0x2\n" - " and r0, r0, r4\n" - " cmp r0, #0\n" - " beq ._407 @cond_branch\n" - " lsl r1, r5, #0x2\n" - " mov r0, ip\n" - " add r0, r0, #0x64\n" - " add r0, r0, r1\n" - " mov r1, #0xb2\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, ip\n" - " ldr r1, [r1]\n" - " str r1, [r0]\n" - " ldr r1, ._409\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._409 + 4\n" - " str r1, [r0]\n" - " b ._422\n" - "._410:\n" - " .align 2, 0\n" - "._409:\n" - " .word gTasks\n" - " .word debug_80C53C0+1\n" - "._407:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._411 @cond_branch\n" - " mov r0, #0x1\n" - " b ._412\n" - "._411:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._413 @cond_branch\n" - " mov r0, #0x2\n" - "._412:\n" - " bl debug_80C6544\n" - " bl debug_80C643C\n" - " b ._422\n" - "._413:\n" - " ldr r0, ._419\n" - " lsl r1, r7, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r1, [r1]\n" - " ldrb r0, [r1, #0x9]\n" - " cmp r0, #0xff\n" - " beq ._422 @cond_branch\n" - " mov r0, #0x20\n" - " and r0, r0, r4\n" - " cmp r0, #0\n" - " beq ._417 @cond_branch\n" - " mov r0, #0xb5\n" - " lsl r0, r0, #0x1\n" - " add ip, ip, r0\n" - " mov r0, ip\n" - " ldrb r3, [r0]\n" - " ldrb r0, [r1, #0x9]\n" - " sub r0, r0, #0x1\n" - " cmp r3, r0\n" - " bge ._417 @cond_branch\n" - " add r0, r3, #1\n" - " mov r1, ip\n" - " strb r0, [r1]\n" - " bl debug_80C643C\n" - " b ._422\n" - "._420:\n" - " .align 2, 0\n" - "._419:\n" - " .word gUnknown_Debug_083F8554\n" - "._417:\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._422 @cond_branch\n" - " mov r2, r8\n" - " ldr r0, [r2]\n" - " mov r2, #0xb5\n" - " lsl r2, r2, #0x1\n" - " add r1, r0, r2\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._422 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " bl debug_80C643C\n" - "._422:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5708() -{ - asm( - " push {lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " ldr r0, ._424\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._423 @cond_branch\n" - " ldr r0, ._424 + 4\n" - " lsl r1, r2, #0x2\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._424 + 8\n" - " str r0, [r1]\n" - "._423:\n" - " pop {r0}\n" - " bx r0\n" - "._425:\n" - " .align 2, 0\n" - "._424:\n" - " .word gMain\n" - " .word gTasks\n" - " .word debug_80C53C0+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5738() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add r6, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r4, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r8, r2\n" - " cmp r4, #0xfe\n" - " bne ._426 @cond_branch\n" - " ldr r1, ._428\n" - " mov r2, #0x7\n" - " bl debug_80C689C\n" - " add r0, r6, #7\n" - " ldr r7, ._428 + 4\n" - " ldr r1, [r7]\n" - " add r1, r1, #0xf0\n" - " ldr r1, [r1]\n" - " mov r2, #0x3\n" - " mov r3, #0x1\n" - " bl debug_80C6678\n" - " mov r4, #0x0\n" - " strb r4, [r6, #0x13]\n" - " strb r4, [r6, #0x14]\n" - " add r0, r6, #0\n" - " add r0, r0, #0x15\n" - " ldr r1, ._428 + 8\n" - " mov r2, #0x7\n" - " bl debug_80C689C\n" - " add r0, r6, #0\n" - " add r0, r0, #0x1c\n" - " ldr r1, [r7]\n" - " add r1, r1, #0xf4\n" - " ldr r1, [r1]\n" - " mov r2, #0x3\n" - " mov r3, #0x1\n" - " bl debug_80C6678\n" - " add r0, r6, #0\n" - " add r0, r0, #0x28\n" - " strb r4, [r0]\n" - " add r0, r0, #0x1\n" - " strb r4, [r0]\n" - " add r0, r0, #0x1\n" - " ldr r1, ._428 + 12\n" - " mov r2, #0x9\n" - " bl debug_80C689C\n" - " add r0, r6, #0\n" - " add r0, r0, #0x31\n" - " ldr r1, [r7]\n" - " add r1, r1, #0xf8\n" - "._431:\n" - " ldr r1, [r1]\n" - " mov r2, #0x3\n" - " mov r3, #0x1\n" - " bl debug_80C6678\n" - " b ._517\n" - "._429:\n" - " .align 2, 0\n" - "._428:\n" - " .word gUnknown_Debug_083F850A\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gUnknown_Debug_083F8514\n" - " .word gUnknown_Debug_083F851C\n" - "._426:\n" - " cmp r4, #0xfd\n" - " bne ._430 @cond_branch\n" - " ldr r1, ._432\n" - " add r0, r6, #0\n" - " mov r2, #0x9\n" - " bl debug_80C689C\n" - " add r0, r6, #0\n" - " add r0, r0, #0x9\n" - " ldr r7, ._432 + 4\n" - " ldr r1, [r7]\n" - " add r1, r1, #0xfc\n" - " ldr r1, [r1]\n" - " mov r2, #0x3\n" - " mov r3, #0x1\n" - " bl debug_80C6678\n" - " mov r4, #0x0\n" - " strb r4, [r6, #0x15]\n" - " strb r4, [r6, #0x16]\n" - " add r0, r6, #0\n" - " add r0, r0, #0x17\n" - " ldr r1, ._432 + 8\n" - " mov r2, #0x9\n" - " bl debug_80C689C\n" - " add r0, r6, #0\n" - " add r0, r0, #0x20\n" - " ldr r1, [r7]\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r1, r1, r2\n" - " ldr r1, [r1]\n" - " mov r2, #0x3\n" - " mov r3, #0x1\n" - " bl debug_80C6678\n" - " add r0, r6, #0\n" - " add r0, r0, #0x2c\n" - " strb r4, [r0]\n" - " add r0, r0, #0x1\n" - " strb r4, [r0]\n" - " add r0, r0, #0x1\n" - " ldr r1, ._432 + 12\n" - " mov r2, #0x9\n" - " bl debug_80C689C\n" - " add r0, r6, #0\n" - " add r0, r0, #0x37\n" - " ldr r1, [r7]\n" - " mov r3, #0x82\n" - " lsl r3, r3, #0x1\n" - " add r1, r1, r3\n" - " b ._431\n" - "._433:\n" - " .align 2, 0\n" - "._432:\n" - " .word gUnknown_Debug_083F8524\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gUnknown_Debug_083F852D\n" - " .word gUnknown_Debug_083F8537\n" - "._430:\n" - " mov r1, #0x0\n" - " lsl r5, r4, #0x3\n" - " mov r2, #0x0\n" - "._434:\n" - " add r0, r6, r1\n" - " strb r2, [r0]\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r1, r0, #0x10\n" - " cmp r1, #0xb\n" - " bls ._434 @cond_branch\n" - " ldr r0, ._437\n" - " add r0, r5, r0\n" - " ldr r1, [r0]\n" - " add r0, r6, #0\n" - " mov r2, #0xb\n" - " bl debug_80C689C\n" - " mov r1, #0xc\n" - " mov r2, #0xff\n" - "._435:\n" - " add r0, r6, r1\n" - " strb r2, [r0]\n" - " add r0, r1, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r1, r0, #0x10\n" - " cmp r1, #0xff\n" - " bls ._435 @cond_branch\n" - " ldr r0, ._437\n" - " add r0, r0, #0x4\n" - " add r0, r5, r0\n" - " ldr r0, [r0]\n" - " ldrb r2, [r0, #0x9]\n" - " lsl r0, r2, #0x1a\n" - " lsr r5, r0, #0x18\n" - " cmp r4, #0x22\n" - " bhi ._436 @cond_branch\n" - " lsl r0, r4, #0x2\n" - " ldr r1, ._437 + 4\n" - " add r1, r0, r1\n" - " ldr r1, [r1]\n" - " add r7, r0, #0\n" - " mov pc, r1\n" - "._438:\n" - " .align 2, 0\n" - "._437:\n" - " .word gUnknown_Debug_083F8554\n" - " .word ._439\n" - "._439:\n" - " .word ._440\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._445\n" - " .word ._446\n" - " .word ._450\n" - " .word ._450\n" - " .word ._450\n" - " .word ._450\n" - " .word ._451\n" - " .word ._452\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._472\n" - " .word ._473\n" - " .word ._474\n" - "._436:\n" - " mov r0, #0xff\n" - " strb r0, [r6]\n" - " b ._517\n" - "._440:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r1, ._477\n" - " mov r9, r1\n" - " ldr r1, [r1]\n" - " add r1, r1, #0x64\n" - " add r1, r1, r7\n" - " ldr r1, [r1]\n" - " mov r3, r8\n" - " bl debug_80C6678\n" - " add r1, r5, r6\n" - " mov r0, #0x0\n" - " strb r0, [r1, #0xa]\n" - " mov r0, #0xfc\n" - " strb r0, [r1, #0xb]\n" - " mov r0, #0x1\n" - " strb r0, [r1, #0xc]\n" - " mov r2, r8\n" - " strb r2, [r1, #0xd]\n" - " add r4, r5, #0\n" - " add r4, r4, #0xe\n" - " add r4, r6, r4\n" - " mov r3, r9\n" - " ldr r0, [r3]\n" - " add r0, r0, #0x64\n" - " add r0, r0, r7\n" - " ldrh r0, [r0]\n" - " bl NationalPokedexNumToSpecies\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0xb\n" - " mul r1, r1, r0\n" - " ldr r0, ._477 + 4\n" - " add r1, r1, r0\n" - " add r0, r4, #0\n" - " mov r2, #0xa\n" - " bl debug_80C689C\n" - " b ._517\n" - "._478:\n" - " .align 2, 0\n" - "._477:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gSpeciesNames\n" - "._445:\n" - " ldr r0, ._483\n" - " ldr r0, [r0]\n" - " add r0, r0, #0x64\n" - " add r0, r0, r7\n" - " ldr r0, [r0]\n" - " cmp r0, #0x1\n" - " beq ._479 @cond_branch\n" - " cmp r0, #0x1\n" - " bcc ._480 @cond_branch\n" - " cmp r0, #0x2\n" - " beq ._481 @cond_branch\n" - " b ._517\n" - "._484:\n" - " .align 2, 0\n" - "._483:\n" - " .word gUnknown_Debug_2038A1C\n" - "._480:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r1, ._486\n" - " b ._488\n" - "._487:\n" - " .align 2, 0\n" - "._486:\n" - " .word gUnknown_Debug_083F8546\n" - "._479:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r1, ._489\n" - " b ._488\n" - "._490:\n" - " .align 2, 0\n" - "._489:\n" - " .word gUnknown_Debug_083F8541\n" - "._481:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r1, ._492\n" - "._488:\n" - " mov r2, #0x2\n" - " bl debug_80C689C\n" - " b ._517\n" - "._493:\n" - " .align 2, 0\n" - "._492:\n" - " .word gUnknown_Debug_083F8544\n" - "._450:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r4, ._495\n" - " ldr r1, [r4]\n" - " add r1, r1, #0x64\n" - " add r1, r1, r7\n" - " ldr r1, [r1]\n" - " mov r3, r8\n" - " bl debug_80C6678\n" - " add r1, r5, r6\n" - " mov r0, #0x0\n" - " strb r0, [r1, #0xa]\n" - " mov r0, #0xfc\n" - " strb r0, [r1, #0xb]\n" - " mov r0, #0x1\n" - " strb r0, [r1, #0xc]\n" - " mov r0, r8\n" - " strb r0, [r1, #0xd]\n" - " add r0, r5, #0\n" - " add r0, r0, #0xe\n" - " add r0, r6, r0\n" - " ldr r1, [r4]\n" - " add r1, r1, #0x64\n" - " add r1, r1, r7\n" - " ldr r2, [r1]\n" - " mov r1, #0xd\n" - " mul r1, r1, r2\n" - " ldr r2, ._495 + 4\n" - " add r1, r1, r2\n" - " b ._494\n" - "._496:\n" - " .align 2, 0\n" - "._495:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gMoveNames\n" - "._451:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r4, ._499\n" - " ldr r1, [r4]\n" - " add r1, r1, #0x64\n" - " add r1, r1, r7\n" - " ldr r1, [r1]\n" - " mov r3, r8\n" - " bl debug_80C6678\n" - " add r1, r5, r6\n" - " mov r0, #0x0\n" - " strb r0, [r1, #0xa]\n" - " mov r0, #0xfc\n" - " strb r0, [r1, #0xb]\n" - " mov r0, #0x1\n" - " strb r0, [r1, #0xc]\n" - " mov r2, r8\n" - " strb r2, [r1, #0xd]\n" - " ldr r0, [r4]\n" - " add r0, r0, #0x64\n" - " add r0, r0, r7\n" - " ldr r0, [r0]\n" - " cmp r0, #0\n" - " beq ._497 @cond_branch\n" - " add r4, r5, #0\n" - " add r4, r4, #0xe\n" - " add r4, r6, r4\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl ItemId_GetItem\n" - " add r1, r0, #0\n" - " add r0, r4, #0\n" - " b ._498\n" - "._500:\n" - " .align 2, 0\n" - "._499:\n" - " .word gUnknown_Debug_2038A1C\n" - "._497:\n" - " add r0, r5, #0\n" - " add r0, r0, #0xe\n" - " add r0, r6, r0\n" - " ldr r1, ._502\n" - "._498:\n" - " mov r2, #0x9\n" - " bl debug_80C689C\n" - " b ._517\n" - "._503:\n" - " .align 2, 0\n" - "._502:\n" - " .word gUnknown_Debug_083F8541\n" - "._452:\n" - " add r6, r6, #0xc\n" - " ldr r4, ._505\n" - " ldr r0, [r4]\n" - " ldr r0, [r0, #0x64]\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl NationalPokedexNumToSpecies\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " ldr r1, [r4]\n" - " add r1, r1, #0x64\n" - " add r1, r1, r7\n" - " ldrb r1, [r1]\n" - " bl GetAbilityBySpecies\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r1, #0xd\n" - " mul r1, r1, r0\n" - " ldr r0, ._505 + 4\n" - " add r1, r1, r0\n" - " add r0, r6, #0\n" - "._494:\n" - " mov r2, #0xc\n" - " bl debug_80C689C\n" - " b ._517\n" - "._506:\n" - " .align 2, 0\n" - "._505:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gAbilityNames\n" - "._474:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r2, ._508\n" - " ldr r1, ._508 + 4\n" - " ldr r1, [r1]\n" - " add r1, r1, #0x64\n" - " add r1, r1, r7\n" - " ldr r1, [r1]\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldr r1, [r1]\n" - " b ._514\n" - "._509:\n" - " .align 2, 0\n" - "._508:\n" - " .word gUnknown_Debug_083F86E8\n" - " .word gUnknown_Debug_2038A1C\n" - "._472:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xc\n" - " ldr r1, ._511\n" - " ldr r1, [r1]\n" - " add r1, r1, #0x64\n" - " add r1, r1, r7\n" - " ldr r1, [r1]\n" - " mov r3, r8\n" - " bl debug_80C6678\n" - " b ._517\n" - "._512:\n" - " .align 2, 0\n" - "._511:\n" - " .word gUnknown_Debug_2038A1C\n" - "._473:\n" - " ldr r0, ._515\n" - " ldr r0, [r0]\n" - " add r0, r0, #0x64\n" - " add r0, r0, r7\n" - " ldr r0, [r0]\n" - " cmp r0, #0\n" - " beq ._513 @cond_branch\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r1, ._515 + 4\n" - " b ._514\n" - "._516:\n" - " .align 2, 0\n" - "._515:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gUnknown_Debug_083F854A\n" - "._513:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r1, ._518\n" - "._514:\n" - " mov r2, #0x4\n" - " bl debug_80C689C\n" - " b ._517\n" - "._519:\n" - " .align 2, 0\n" - "._518:\n" - " .word gUnknown_Debug_083F854D\n" - "._446:\n" - " add r0, r6, #0\n" - " add r0, r0, #0xa\n" - " ldr r2, ._520\n" - " ldr r1, ._520 + 4\n" - " ldr r1, [r1]\n" - " add r1, r1, #0x64\n" - " add r1, r1, r7\n" - " ldr r1, [r1]\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r2\n" - " ldr r1, [r1]\n" - " mov r2, #0x5\n" - " bl debug_80C689C\n" - "._517:\n" - " mov r0, #0x0\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._521:\n" - " .align 2, 0\n" - "._520:\n" - " .word gNatureNames\n" - " .word gUnknown_Debug_2038A1C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5B60() -{ - asm( - " lsl r0, r0, #0x18\n" - " ldr r1, ._522\n" - " ldr r1, [r1]\n" - " lsr r0, r0, #0x16\n" - " add r1, r1, #0x64\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " bx lr\n" - "._523:\n" - " .align 2, 0\n" - "._522:\n" - " .word gUnknown_Debug_2038A1C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5B74() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r2, r1, #0x18\n" - " cmp r2, #0x18\n" - " bhi ._540 @cond_branch\n" - " lsl r0, r2, #0x2\n" - " ldr r1, ._526\n" - " add r1, r0, r1\n" - " ldr r1, [r1]\n" - " add r3, r0, #0\n" - " mov pc, r1\n" - "._527:\n" - " .align 2, 0\n" - "._526:\n" - " .word ._525\n" - "._525:\n" - " .word ._532\n" - " .word ._529\n" - " .word ._530\n" - " .word ._532\n" - " .word ._532\n" - " .word ._540\n" - " .word ._540\n" - " .word ._540\n" - " .word ._540\n" - " .word ._540\n" - " .word ._540\n" - " .word ._540\n" - " .word ._540\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - " .word ._552\n" - "._540:\n" - " ldr r0, ._554\n" - " ldr r0, [r0]\n" - " lsl r1, r2, #0x2\n" - " add r0, r0, #0x64\n" - " add r0, r0, r1\n" - " str r6, [r0]\n" - " b ._562\n" - "._555:\n" - " .align 2, 0\n" - "._554:\n" - " .word gUnknown_Debug_2038A1C\n" - "._532:\n" - " ldr r0, ._557\n" - " ldr r0, [r0]\n" - " add r0, r0, #0x64\n" - " add r0, r0, r3\n" - " str r6, [r0]\n" - " bl debug_80C5C94\n" - " b ._562\n" - "._558:\n" - " .align 2, 0\n" - "._557:\n" - " .word gUnknown_Debug_2038A1C\n" - "._529:\n" - " ldr r4, ._560\n" - " ldr r1, [r4]\n" - " add r0, r1, #0\n" - " add r0, r0, #0x64\n" - " add r0, r0, r3\n" - " str r6, [r0]\n" - " ldr r0, [r1, #0x64]\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl NationalPokedexNumToSpecies\n" - " ldr r5, [r4]\n" - " ldr r4, ._560 + 4\n" - " lsl r2, r6, #0x2\n" - " ldr r3, ._560 + 8\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " lsl r1, r0, #0x3\n" - " sub r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r3\n" - " ldrb r1, [r1, #0x13]\n" - " mov r0, #0xca\n" - " lsl r0, r0, #0x1\n" - " mul r0, r0, r1\n" - " add r2, r2, r0\n" - " add r2, r2, r4\n" - " ldr r0, [r2]\n" - " str r0, [r5, #0x6c]\n" - " bl debug_80C5C94\n" - " b ._562\n" - "._561:\n" - " .align 2, 0\n" - "._560:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gExperienceTables\n" - " .word gBaseStats\n" - "._530:\n" - " ldr r0, ._563\n" - " ldr r0, [r0]\n" - " add r0, r0, #0x64\n" - " add r0, r0, r3\n" - " str r6, [r0]\n" - " bl debug_80C5DEC\n" - " b ._562\n" - "._564:\n" - " .align 2, 0\n" - "._563:\n" - " .word gUnknown_Debug_2038A1C\n" - "._552:\n" - " ldr r0, ._565\n" - " ldr r0, [r0]\n" - " add r0, r0, #0x64\n" - " add r0, r0, r3\n" - " str r6, [r0]\n" - " bl debug_80C5EF4\n" - "._562:\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._566:\n" - " .align 2, 0\n" - "._565:\n" - " .word gUnknown_Debug_2038A1C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5C94() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffff0\n" - " ldr r6, ._567\n" - " ldr r2, [r6]\n" - " add r0, r2, #0\n" - " add r0, r0, #0x98\n" - " ldr r4, [r0]\n" - " mov r1, #0x1f\n" - " and r4, r4, r1\n" - " add r0, r0, #0x8\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " orr r4, r4, r0\n" - " add r0, r2, #0\n" - " add r0, r0, #0xa8\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0xa\n" - " orr r4, r4, r0\n" - " add r0, r2, #0\n" - " add r0, r0, #0xb0\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0xf\n" - " orr r4, r4, r0\n" - " add r0, r2, #0\n" - " add r0, r0, #0xb8\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x14\n" - " orr r4, r4, r0\n" - " add r0, r2, #0\n" - " add r0, r0, #0xc0\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x19\n" - " orr r4, r4, r0\n" - " ldr r0, [r2, #0x64]\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl NationalPokedexNumToSpecies\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " ldr r0, [r6]\n" - " ldr r2, [r0, #0x68]\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " mov r5, #0x1\n" - " str r5, [sp]\n" - " ldr r3, [r0, #0x74]\n" - " str r3, [sp, #0x4]\n" - " str r5, [sp, #0x8]\n" - " ldr r3, [r0, #0x70]\n" - " str r3, [sp, #0xc]\n" - " add r3, r4, #0\n" - " bl CreateMon\n" - " ldr r0, [r6]\n" - " bl GetMonGender\n" - " ldr r1, [r6]\n" - " add r0, r0, #0x2\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " str r0, [r1, #0x78]\n" - " add r0, r1, #0\n" - " bl GetNature\n" - " ldr r1, [r6]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " str r0, [r1, #0x7c]\n" - " add r0, r1, #0\n" - " mov r1, #0xd\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " add r1, r0, #0\n" - " add r1, r1, #0x80\n" - " str r2, [r1]\n" - " mov r1, #0xe\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " add r1, r0, #0\n" - " add r1, r1, #0x84\n" - " str r2, [r1]\n" - " mov r1, #0xf\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " add r1, r0, #0\n" - " add r1, r1, #0x88\n" - " str r2, [r1]\n" - " mov r1, #0x10\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " add r1, r0, #0\n" - " add r1, r1, #0x8c\n" - " str r2, [r1]\n" - " mov r1, #0x19\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " ldr r0, [r6]\n" - " str r1, [r0, #0x6c]\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf0\n" - " str r2, [r1]\n" - " mov r1, #0x3b\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf4\n" - " str r2, [r1]\n" - " mov r1, #0x3c\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf8\n" - " str r2, [r1]\n" - " mov r1, #0x3d\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xfc\n" - " str r2, [r1]\n" - " mov r1, #0x3e\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r6]\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x1\n" - " add r1, r0, r3\n" - " str r2, [r1]\n" - " mov r1, #0x3f\n" - " bl GetMonData\n" - " ldr r1, [r6]\n" - " mov r2, #0x82\n" - " lsl r2, r2, #0x1\n" - " add r1, r1, r2\n" - " str r0, [r1]\n" - " add sp, sp, #0x10\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._568:\n" - " .align 2, 0\n" - "._567:\n" - " .word gUnknown_Debug_2038A1C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5DEC() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " ldr r4, ._569\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0x6c\n" - " mov r1, #0x19\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " mov r1, #0xd\n" - " mov r2, sp\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " mov r1, #0xe\n" - " mov r2, sp\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " mov r1, #0xf\n" - " mov r2, sp\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " mov r1, #0x10\n" - " mov r2, sp\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " bl CalculateMonStats\n" - " ldr r0, [r4]\n" - " bl GiveMonInitialMoveset\n" - " ldr r0, [r4]\n" - " mov r1, #0x38\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " ldr r0, [r4]\n" - " str r1, [r0, #0x68]\n" - " mov r1, #0xd\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0x80\n" - " str r2, [r1]\n" - " mov r1, #0xe\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0x84\n" - " str r2, [r1]\n" - " mov r1, #0xf\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0x88\n" - " str r2, [r1]\n" - " mov r1, #0x10\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0x8c\n" - " str r2, [r1]\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf0\n" - " str r2, [r1]\n" - " mov r1, #0x3b\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf4\n" - " str r2, [r1]\n" - " mov r1, #0x3c\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf8\n" - " str r2, [r1]\n" - " mov r1, #0x3d\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xfc\n" - " str r2, [r1]\n" - " mov r1, #0x3e\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x1\n" - " add r1, r0, r3\n" - " str r2, [r1]\n" - " mov r1, #0x3f\n" - " bl GetMonData\n" - " ldr r1, [r4]\n" - " mov r2, #0x82\n" - " lsl r2, r2, #0x1\n" - " add r1, r1, r2\n" - " str r0, [r1]\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._570:\n" - " .align 2, 0\n" - "._569:\n" - " .word gUnknown_Debug_2038A1C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5EF4() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._571\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0x98\n" - " mov r1, #0x27\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0x9c\n" - " mov r1, #0x1a\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xa0\n" - " mov r1, #0x28\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xa4\n" - " mov r1, #0x1b\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xa8\n" - " mov r1, #0x29\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xac\n" - " mov r1, #0x1c\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xb0\n" - " mov r1, #0x2a\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xb4\n" - " mov r1, #0x1d\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xb8\n" - " mov r1, #0x2b\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xbc\n" - " mov r1, #0x1e\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xc0\n" - " mov r1, #0x2c\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xc4\n" - " mov r1, #0x1f\n" - " bl SetMonData\n" - " ldr r0, [r4]\n" - " bl CalculateMonStats\n" - " ldr r0, [r4]\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf0\n" - " str r2, [r1]\n" - " mov r1, #0x3b\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf4\n" - " str r2, [r1]\n" - " mov r1, #0x3c\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xf8\n" - " str r2, [r1]\n" - " mov r1, #0x3d\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xfc\n" - " str r2, [r1]\n" - " mov r1, #0x3e\n" - " bl GetMonData\n" - " add r2, r0, #0\n" - " ldr r0, [r4]\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x1\n" - " add r1, r0, r3\n" - " str r2, [r1]\n" - " mov r1, #0x3f\n" - " bl GetMonData\n" - " ldr r1, [r4]\n" - " mov r2, #0x82\n" - " lsl r2, r2, #0x1\n" - " add r1, r1, r2\n" - " str r0, [r1]\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._572:\n" - " .align 2, 0\n" - "._571:\n" - " .word gUnknown_Debug_2038A1C\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C5FFC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xffffffe0\n" - " ldr r1, ._578\n" - " add r0, sp, #0x10\n" - " mov r2, #0x4\n" - " bl memcpy\n" - " add r7, sp, #0x14\n" - " ldr r1, ._578 + 4\n" - " add r0, r7, #0\n" - " mov r2, #0x8\n" - " bl memcpy\n" - " ldr r5, ._578 + 8\n" - " ldr r2, [r5]\n" - " add r0, r2, #0\n" - " add r0, r0, #0x98\n" - " ldr r4, [r0]\n" - " mov r1, #0x1f\n" - " and r4, r4, r1\n" - " add r0, r0, #0x8\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " orr r4, r4, r0\n" - " add r0, r2, #0\n" - " add r0, r0, #0xa8\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0xa\n" - " orr r4, r4, r0\n" - " add r0, r2, #0\n" - " add r0, r0, #0xb0\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0xf\n" - " orr r4, r4, r0\n" - " add r0, r2, #0\n" - " add r0, r0, #0xb8\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x14\n" - " orr r4, r4, r0\n" - " add r0, r2, #0\n" - " add r0, r0, #0xc0\n" - " ldr r0, [r0]\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x19\n" - " orr r4, r4, r0\n" - " ldr r0, [r2, #0x64]\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl NationalPokedexNumToSpecies\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " ldr r0, [r5]\n" - " ldr r2, [r0, #0x68]\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " mov r6, #0x1\n" - " str r6, [sp]\n" - " ldr r3, [r0, #0x74]\n" - " str r3, [sp, #0x4]\n" - " str r6, [sp, #0x8]\n" - " ldr r3, [r0, #0x70]\n" - " str r3, [sp, #0xc]\n" - " add r3, r4, #0\n" - " bl CreateMon\n" - " ldr r2, [r5]\n" - " add r0, r2, #0\n" - " add r0, r0, #0x80\n" - " ldr r0, [r0]\n" - " cmp r0, #0\n" - " beq ._573 @cond_branch\n" - " lsl r1, r0, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r2, #0\n" - " mov r2, #0x0\n" - " bl SetMonMoveSlot\n" - "._573:\n" - " ldr r2, [r5]\n" - " add r0, r2, #0\n" - " add r0, r0, #0x84\n" - " ldr r0, [r0]\n" - " cmp r0, #0\n" - " beq ._574 @cond_branch\n" - " lsl r1, r0, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r2, #0\n" - " mov r2, #0x1\n" - " bl SetMonMoveSlot\n" - "._574:\n" - " ldr r2, [r5]\n" - " add r0, r2, #0\n" - " add r0, r0, #0x88\n" - " ldr r0, [r0]\n" - " cmp r0, #0\n" - " beq ._575 @cond_branch\n" - " lsl r1, r0, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r2, #0\n" - " mov r2, #0x2\n" - " bl SetMonMoveSlot\n" - "._575:\n" - " ldr r2, [r5]\n" - " add r0, r2, #0\n" - " add r0, r0, #0x8c\n" - " ldr r0, [r0]\n" - " cmp r0, #0\n" - " beq ._576 @cond_branch\n" - " lsl r1, r0, #0x10\n" - " lsr r1, r1, #0x10\n" - " add r0, r2, #0\n" - " mov r2, #0x3\n" - " bl SetMonMoveSlot\n" - "._576:\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0x6c\n" - " mov r1, #0x19\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0x98\n" - " mov r1, #0x27\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0x9c\n" - " mov r1, #0x1a\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xa0\n" - " mov r1, #0x28\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xa4\n" - " mov r1, #0x1b\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xa8\n" - " mov r1, #0x29\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xac\n" - " mov r1, #0x1c\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xb0\n" - " mov r1, #0x2a\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xb4\n" - " mov r1, #0x1d\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xb8\n" - " mov r1, #0x2b\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xbc\n" - " mov r1, #0x1e\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xc0\n" - " mov r1, #0x2c\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xc4\n" - " mov r1, #0x1f\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xc8\n" - " mov r1, #0x16\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xcc\n" - " mov r1, #0x17\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xd0\n" - " mov r1, #0x18\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xd4\n" - " mov r1, #0x21\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xd8\n" - " mov r1, #0x2f\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xdc\n" - " mov r1, #0x30\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xe0\n" - " mov r1, #0x20\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xe4\n" - " mov r1, #0x22\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0x90\n" - " mov r1, #0xc\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0x94\n" - " mov r1, #0x2e\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r1, r0, #0\n" - " add r1, r1, #0xec\n" - " ldr r2, [r1]\n" - " lsl r2, r2, #0x3\n" - " ldr r1, ._578 + 12\n" - " add r2, r2, r1\n" - " mov r1, #0x37\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " add r2, r0, #0\n" - " add r2, r2, #0xe8\n" - " mov r1, #0x2d\n" - " bl SetMonData\n" - " ldr r1, [r5]\n" - " add r0, r1, #0\n" - " add r0, r0, #0xe8\n" - " ldr r0, [r0]\n" - " cmp r0, #0\n" - " beq ._577 @cond_branch\n" - " add r0, r1, #0\n" - " mov r1, #0x2\n" - " add r2, sp, #0x10\n" - " bl SetMonData\n" - " add r2, sp, #0x1c\n" - " strb r6, [r2]\n" - " ldr r0, [r5]\n" - " mov r1, #0x3\n" - " bl SetMonData\n" - "._577:\n" - " ldr r0, [r5]\n" - " mov r1, #0x7\n" - " add r2, r7, #0\n" - " bl SetMonData\n" - " mov r2, sp\n" - " add r2, r2, #0x1e\n" - " mov r0, #0xff\n" - " strh r0, [r2]\n" - " ldr r0, [r5]\n" - " mov r1, #0x23\n" - " bl SetMonData\n" - " ldr r0, [r5]\n" - " bl CalculateMonStats\n" - " add sp, sp, #0x20\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._579:\n" - " .align 2, 0\n" - "._578:\n" - " .word gUnknown_Debug_083F8758\n" - " .word gUnknown_Debug_083F875C\n" - " .word gUnknown_Debug_2038A1C\n" - " .word gUnknown_Debug_083F86E8+0x4\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C627C() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffff8\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " add r6, r4, #0\n" - " ldr r1, ._584\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " bl memcpy\n" - " add r5, sp, #0x4\n" - " ldr r1, ._584 + 4\n" - " add r0, r5, #0\n" - " mov r2, #0x2\n" - " bl memcpy\n" - " cmp r4, #0x1\n" - " beq ._580 @cond_branch\n" - " cmp r4, #0x1\n" - " bgt ._581 @cond_branch\n" - " cmp r4, #0\n" - " beq ._582 @cond_branch\n" - " b ._595\n" - "._585:\n" - " .align 2, 0\n" - "._584:\n" - " .word gUnknown_Debug_083F7FD4\n" - " .word gUnknown_Debug_083F8764\n" - "._581:\n" - " cmp r6, #0x2\n" - " beq ._586 @cond_branch\n" - " b ._595\n" - "._582:\n" - " ldr r0, ._589\n" - " ldr r0, [r0]\n" - " ldr r1, ._589 + 4\n" - " add r0, r0, r1\n" - " b ._588\n" - "._590:\n" - " .align 2, 0\n" - "._589:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - "._580:\n" - " ldr r4, ._593\n" - " ldr r3, [r4]\n" - " ldr r1, ._593 + 4\n" - " add r0, r3, r1\n" - " ldrb r2, [r0]\n" - " ldr r1, ._593 + 8\n" - " mov r6, #0xb4\n" - " lsl r6, r6, #0x1\n" - " add r0, r3, r6\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldrb r0, [r0, #0x4]\n" - " sub r0, r0, #0x1\n" - " cmp r2, r0\n" - " bge ._595 @cond_branch\n" - " lsl r2, r2, #0x19\n" - " mov r0, #0xa0\n" - " lsl r0, r0, #0x13\n" - " add r2, r2, r0\n" - " lsr r2, r2, #0x18\n" - " add r0, r5, #0\n" - " mov r1, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, [r4]\n" - " ldr r2, ._593 + 4\n" - " add r1, r0, r2\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r0, [r4]\n" - " add r0, r0, r2\n" - "._588:\n" - " ldrb r2, [r0]\n" - " lsl r2, r2, #0x19\n" - " mov r6, #0xa0\n" - " lsl r6, r6, #0x13\n" - " add r2, r2, r6\n" - " lsr r2, r2, #0x18\n" - " mov r0, sp\n" - " mov r1, #0x1\n" - " bl Menu_PrintText\n" - " b ._595\n" - "._594:\n" - " .align 2, 0\n" - "._593:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - " .word gUnknown_Debug_083F8698\n" - "._586:\n" - " ldr r4, ._596\n" - " ldr r0, [r4]\n" - " ldr r2, ._596 + 4\n" - " add r1, r0, r2\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._595 @cond_branch\n" - " add r2, r0, #0\n" - " lsl r2, r2, #0x19\n" - " mov r6, #0xa0\n" - " lsl r6, r6, #0x13\n" - " add r2, r2, r6\n" - " lsr r2, r2, #0x18\n" - " add r0, r5, #0\n" - " mov r1, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, [r4]\n" - " ldr r2, ._596 + 4\n" - " add r1, r0, r2\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r0, [r4]\n" - " add r0, r0, r2\n" - " ldrb r2, [r0]\n" - " lsl r2, r2, #0x19\n" - " add r2, r2, r6\n" - " lsr r2, r2, #0x18\n" - " mov r0, sp\n" - " mov r1, #0x1\n" - " bl Menu_PrintText\n" - "._595:\n" - " add sp, sp, #0x8\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._597:\n" - " .align 2, 0\n" - "._596:\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C6384() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " mov r0, #0x0\n" - " mov r1, #0x4\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r5, #0x0\n" - " ldr r3, ._600\n" - " ldr r1, ._600 + 4\n" - " ldr r0, [r1]\n" - " mov r2, #0xb4\n" - " lsl r2, r2, #0x1\n" - " add r0, r0, r2\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r3\n" - " ldr r0, [r0]\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._598 @cond_branch\n" - " add r4, r1, #0\n" - " ldr r0, ._600 + 8\n" - " mov r9, r0\n" - " mov r8, r3\n" - " add r7, r2, #0\n" - " mov r6, #0x1\n" - "._599:\n" - " ldr r0, [r4]\n" - " add r0, r0, r9\n" - " mov r1, #0xfc\n" - " strb r1, [r0]\n" - " ldr r0, [r4]\n" - " add r1, r1, #0x70\n" - " add r0, r0, r1\n" - " strb r6, [r0]\n" - " ldr r0, [r4]\n" - " ldr r2, ._600 + 12\n" - " add r0, r0, r2\n" - " strb r6, [r0]\n" - " ldr r1, [r4]\n" - " add r2, r2, #0x1\n" - " add r0, r1, r2\n" - " add r1, r1, r7\n" - " ldrb r1, [r1]\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r8\n" - " ldr r1, [r1]\n" - " add r1, r1, r5\n" - " ldrb r1, [r1]\n" - " mov r2, #0x1\n" - " bl debug_80C5738\n" - " ldr r0, [r4]\n" - " add r0, r0, r9\n" - " lsl r2, r5, #0x19\n" - " mov r1, #0xa0\n" - " lsl r1, r1, #0x13\n" - " add r2, r2, r1\n" - " lsr r2, r2, #0x18\n" - " mov r1, #0x2\n" - " bl Menu_PrintText\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " ldr r0, [r4]\n" - " add r0, r0, r7\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r8\n" - " ldr r0, [r0]\n" - " add r0, r0, r5\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " bne ._599 @cond_branch\n" - "._598:\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._601:\n" - " .align 2, 0\n" - "._600:\n" - " .word gUnknown_Debug_083F8698\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x16b\n" - " .word 0x16d\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C643C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " mov r0, #0x2\n" - " mov r1, #0x5\n" - " mov r2, #0x1c\n" - " mov r3, #0x12\n" - " bl Menu_BlankWindowRect\n" - " mov r5, #0x0\n" - " ldr r6, ._605\n" - " ldr r1, ._605 + 4\n" - " ldr r0, [r1]\n" - " mov r3, #0xb4\n" - " lsl r3, r3, #0x1\n" - " add r0, r0, r3\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r6\n" - " ldr r0, [r0]\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " beq ._602 @cond_branch\n" - " add r4, r1, #0\n" - " mov r0, #0x1\n" - " mov r8, r0\n" - "._607:\n" - " ldr r0, [r4]\n" - " ldr r7, ._605 + 8\n" - " add r2, r0, r7\n" - " mov r0, #0xfc\n" - " strb r0, [r2]\n" - " ldr r0, [r4]\n" - " mov r2, #0xb6\n" - " lsl r2, r2, #0x1\n" - " add r0, r0, r2\n" - " mov r7, r8\n" - " strb r7, [r0]\n" - " ldr r2, [r4]\n" - " ldr r7, ._605 + 12\n" - " add r0, r2, r7\n" - " ldrb r0, [r0]\n" - " cmp r5, r0\n" - " bne ._603 @cond_branch\n" - " ldr r0, ._605 + 16\n" - " add r2, r2, r0\n" - " mov r0, #0x2\n" - " strb r0, [r2]\n" - " ldr r1, [r1]\n" - " mov r2, #0xb7\n" - " lsl r2, r2, #0x1\n" - " add r0, r1, r2\n" - " add r1, r1, r3\n" - " ldrb r1, [r1]\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r6\n" - " ldr r1, [r1]\n" - " add r1, r1, r5\n" - " ldrb r1, [r1]\n" - " mov r2, #0x2\n" - " bl debug_80C5738\n" - " b ._604\n" - "._606:\n" - " .align 2, 0\n" - "._605:\n" - " .word gUnknown_Debug_083F8698\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x16b\n" - " .word 0x169\n" - " .word 0x16d\n" - "._603:\n" - " ldr r3, ._608\n" - " add r0, r2, r3\n" - " mov r7, r8\n" - " strb r7, [r0]\n" - " ldr r1, [r1]\n" - " mov r2, #0xb7\n" - " lsl r2, r2, #0x1\n" - " add r0, r1, r2\n" - " ldr r2, ._608 + 4\n" - " sub r3, r3, #0x5\n" - " add r1, r1, r3\n" - " ldrb r1, [r1]\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldr r1, [r1]\n" - " add r1, r1, r5\n" - " ldrb r1, [r1]\n" - " mov r2, #0x1\n" - " bl debug_80C5738\n" - "._604:\n" - " ldr r0, [r4]\n" - " ldr r7, ._608 + 8\n" - " add r0, r0, r7\n" - " lsl r2, r5, #0x19\n" - " mov r1, #0xa0\n" - " lsl r1, r1, #0x13\n" - " add r2, r2, r1\n" - " lsr r2, r2, #0x18\n" - " mov r1, #0x2\n" - " bl Menu_PrintText\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " ldr r6, ._608 + 4\n" - " add r1, r4, #0\n" - " ldr r0, [r4]\n" - " mov r3, #0xb4\n" - " lsl r3, r3, #0x1\n" - " add r0, r0, r3\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r6\n" - " ldr r0, [r0]\n" - " add r0, r0, r5\n" - " ldrb r0, [r0]\n" - " cmp r0, #0xff\n" - " bne ._607 @cond_branch\n" - "._602:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._609:\n" - " .align 2, 0\n" - "._608:\n" - " .word 0x16d\n" - " .word gUnknown_Debug_083F8698\n" - " .word 0x16b\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C6544() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r9, r0\n" - " ldr r0, ._614\n" - " mov r8, r0\n" - " ldr r6, ._614 + 4\n" - " ldr r1, [r6]\n" - " mov r5, #0xb4\n" - " lsl r5, r5, #0x1\n" - " add r0, r1, r5\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r8\n" - " ldr r4, ._614 + 8\n" - " add r1, r1, r4\n" - " ldrb r1, [r1]\n" - " ldr r0, [r0]\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " bl debug_80C5B60\n" - " add r7, r0, #0\n" - " ldr r2, ._614 + 12\n" - " ldr r3, [r6]\n" - " add r5, r3, r5\n" - " ldrb r0, [r5]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r8\n" - " add r4, r3, r4\n" - " ldrb r1, [r4]\n" - " ldr r0, [r0]\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r2, r2, #0x4\n" - " add r0, r0, r2\n" - " ldr r1, [r0]\n" - " ldr r5, [r1]\n" - " ldr r4, [r1, #0x4]\n" - " ldr r2, ._614 + 16\n" - " mov r6, #0xb5\n" - " lsl r6, r6, #0x1\n" - " add r0, r3, r6\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r2\n" - " ldr r3, [r0]\n" - " ldrb r0, [r1, #0x8]\n" - " cmp r0, #0\n" - " bne ._623 @cond_branch\n" - " mov r0, r9\n" - " cmp r0, #0x1\n" - " beq ._611 @cond_branch\n" - " cmp r0, #0x2\n" - " beq ._612 @cond_branch\n" - " b ._623\n" - "._615:\n" - " .align 2, 0\n" - "._614:\n" - " .word gUnknown_Debug_083F8698\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - " .word gUnknown_Debug_083F8554\n" - " .word gUnknown_Debug_083F8768\n" - "._611:\n" - " sub r0, r4, r3\n" - " cmp r7, r0\n" - " bcs ._616 @cond_branch\n" - " add r7, r7, r3\n" - " b ._623\n" - "._616:\n" - " cmp r7, r4\n" - " bcc ._622 @cond_branch\n" - " b ._619\n" - "._612:\n" - " add r0, r5, r3\n" - " cmp r7, r0\n" - " bls ._620 @cond_branch\n" - " sub r7, r7, r3\n" - " b ._623\n" - "._620:\n" - " cmp r7, r5\n" - " bls ._622 @cond_branch\n" - "._619:\n" - " add r7, r5, #0\n" - " b ._623\n" - "._622:\n" - " add r7, r4, #0\n" - "._623:\n" - " ldr r1, ._624\n" - " ldr r0, ._624 + 4\n" - " ldr r2, [r0]\n" - " mov r3, #0xb4\n" - " lsl r3, r3, #0x1\n" - " add r0, r2, r3\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r6, ._624 + 8\n" - " add r1, r2, r6\n" - " ldrb r1, [r1]\n" - " ldr r0, [r0]\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " add r0, r7, #0\n" - " bl debug_80C5B74\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._625:\n" - " .align 2, 0\n" - "._624:\n" - " .word gUnknown_Debug_083F8698\n" - " .word gUnknown_Debug_2038A1C\n" - " .word 0x169\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C6630() -{ - asm( - " push {r4, r5, lr}\n" - " add r4, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " mov r0, #0xfc\n" - " strb r0, [r4]\n" - " add r4, r4, #0x1\n" - " mov r0, #0x1\n" - " strb r0, [r4]\n" - " add r4, r4, #0x1\n" - " cmp r2, #0x2\n" - " bne ._626 @cond_branch\n" - " ldr r0, ._629\n" - " ldr r0, [r0]\n" - " mov r5, #0xb5\n" - " lsl r5, r5, #0x1\n" - " add r0, r0, r5\n" - " ldrb r0, [r0]\n" - " cmp r3, r0\n" - " beq ._627 @cond_branch\n" - " strb r2, [r4]\n" - " b ._628\n" - "._630:\n" - " .align 2, 0\n" - "._629:\n" - " .word gUnknown_Debug_2038A1C\n" - "._627:\n" - " mov r0, #0x4\n" - "._626:\n" - " strb r0, [r4]\n" - "._628:\n" - " add r0, r1, #0\n" - " add r0, r0, #0xa1\n" - " strb r0, [r4, #0x1]\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C6678() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " mov r9, r0\n" - " add r6, r1, #0\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " mov r8, r3\n" - " mov r7, #0x0\n" - " sub r0, r2, #1\n" - " cmp r0, #0x9\n" - " bhi ._644 @cond_branch\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._633\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._634:\n" - " .align 2, 0\n" - "._633:\n" - " .word ._632\n" - "._632:\n" - " .word ._635\n" - " .word ._636\n" - " .word ._637\n" - " .word ._638\n" - " .word ._639\n" - " .word ._640\n" - " .word ._641\n" - " .word ._642\n" - " .word ._643\n" - " .word ._644\n" - "._644:\n" - " mov r0, r9\n" - " add r4, r0, r7\n" - " ldr r5, ._645\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x9\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._643:\n" - " mov r1, r9\n" - " add r4, r1, r7\n" - " ldr r5, ._645 + 4\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x8\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._642:\n" - " mov r0, r9\n" - " add r4, r0, r7\n" - " ldr r5, ._645 + 8\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x7\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._641:\n" - " mov r1, r9\n" - " add r4, r1, r7\n" - " ldr r5, ._645 + 12\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x6\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._640:\n" - " mov r0, r9\n" - " add r4, r0, r7\n" - " ldr r5, ._645 + 16\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x5\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._639:\n" - " mov r1, r9\n" - " add r4, r1, r7\n" - " ldr r5, ._645 + 20\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x4\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._638:\n" - " mov r0, r9\n" - " add r4, r0, r7\n" - " mov r5, #0xfa\n" - " lsl r5, r5, #0x2\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x3\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " add r1, r5, #0\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._637:\n" - " mov r1, r9\n" - " add r4, r1, r7\n" - " add r0, r6, #0\n" - " mov r1, #0x64\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x2\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " mov r1, #0x64\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._636:\n" - " mov r0, r9\n" - " add r4, r0, r7\n" - " add r0, r6, #0\n" - " mov r1, #0xa\n" - " bl __udivsi3\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " mov r2, r8\n" - " mov r3, #0x1\n" - " bl debug_80C6630\n" - " add r0, r6, #0\n" - " mov r1, #0xa\n" - " bl __umodsi3\n" - " add r6, r0, #0\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - "._635:\n" - " mov r1, r9\n" - " add r0, r1, r7\n" - " lsl r1, r6, #0x18\n" - " lsr r1, r1, #0x18\n" - " mov r2, r8\n" - " mov r3, #0x0\n" - " bl debug_80C6630\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._646:\n" - " .align 2, 0\n" - "._645:\n" - " .word 0x3b9aca00\n" - " .word 0x5f5e100\n" - " .word 0x989680\n" - " .word 0xf4240\n" - " .word 0x186a0\n" - " .word 0x2710\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C689C() -{ - asm( - " push {r4, r5, lr}\n" - " add r5, r0, #0\n" - " add r4, r1, #0\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r3, #0x0\n" - " ldrb r0, [r4]\n" - " b ._647\n" - "._649:\n" - " add r1, r5, r3\n" - " add r0, r4, r3\n" - " ldrb r0, [r0]\n" - " strb r0, [r1]\n" - " add r0, r3, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r3, r0, #0x18\n" - " add r0, r4, r3\n" - " ldrb r0, [r0]\n" - "._647:\n" - " cmp r0, #0xff\n" - " beq ._648 @cond_branch\n" - " cmp r3, r2\n" - " bcc ._649 @cond_branch\n" - "._648:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C68CC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xfffffff8\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " lsl r1, r1, #0x18\n" - " lsr r6, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r5, r2, #0x18\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " mov r2, #0x0\n" - " mov r1, #0x0\n" - "._650:\n" - " mov r7, sp\n" - " add r0, r7, r2\n" - " strb r1, [r0]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x3\n" - " bls ._650 @cond_branch\n" - " mov r1, sp\n" - " mov r0, #0xff\n" - " strb r0, [r1, #0x4]\n" - " cmp r3, #0x2\n" - " beq ._651 @cond_branch\n" - " cmp r3, #0x2\n" - " bgt ._652 @cond_branch\n" - " cmp r3, #0x1\n" - " beq ._653 @cond_branch\n" - " b ._654\n" - "._652:\n" - " cmp r3, #0x3\n" - " beq ._655 @cond_branch\n" - "._654:\n" - " mov r1, sp\n" - " lsr r0, r4, #0xc\n" - " strb r0, [r1]\n" - "._655:\n" - " mov r1, sp\n" - " mov r0, #0xf0\n" - " lsl r0, r0, #0x4\n" - " and r0, r0, r4\n" - " lsr r0, r0, #0x8\n" - " strb r0, [r1, #0x1]\n" - "._651:\n" - " mov r1, sp\n" - " mov r0, #0xf0\n" - " and r0, r0, r4\n" - " lsr r0, r0, #0x4\n" - " strb r0, [r1, #0x2]\n" - "._653:\n" - " mov r2, sp\n" - " mov r1, #0xf\n" - " add r0, r4, #0\n" - " and r0, r0, r1\n" - " strb r0, [r2, #0x3]\n" - " mov r2, #0x0\n" - "._658:\n" - " mov r0, sp\n" - " add r1, r0, r2\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x9\n" - " bhi ._656 @cond_branch\n" - " add r0, r0, #0xa1\n" - " b ._657\n" - "._656:\n" - " add r0, r0, #0xb1\n" - "._657:\n" - " strb r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x3\n" - " bls ._658 @cond_branch\n" - " mov r0, #0x4\n" - " sub r0, r0, r3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r0, r0, sp\n" - " add r1, r6, #0\n" - " add r2, r5, #0\n" - " bl Menu_PrintText\n" - " add sp, sp, #0x8\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void InitSeePokemonGraphics() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffff8\n" - " bl debug_80C35DC\n" - " ldr r1, ._659\n" - " ldr r2, ._659 + 4\n" - " ldr r0, ._659 + 8\n" - " str r1, [r0]\n" - " str r2, [r0, #0x4]\n" - " ldr r1, ._659 + 12\n" - " str r1, [r0, #0x8]\n" - " ldr r0, [r0, #0x8]\n" - " ldr r0, ._659 + 16\n" - " mov r1, #0x80\n" - " mov r2, #0x60\n" - " bl LoadPalette\n" - " ldr r1, ._659 + 20\n" - " add r0, sp, #0x4\n" - " strh r1, [r0]\n" - " mov r1, #0x0\n" - " mov r2, #0x2\n" - " bl LoadPalette\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r5, #0x0\n" - " str r5, [sp]\n" - " mov r1, #0x0\n" - " mov r2, #0x10\n" - " mov r3, #0x0\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._659 + 24\n" - " mov r6, #0x0\n" - " strh r5, [r0]\n" - " add r0, r0, #0x4\n" - " strh r5, [r0]\n" - " sub r0, r0, #0x2\n" - " strh r5, [r0]\n" - " add r0, r0, #0x4\n" - " strh r5, [r0]\n" - " ldr r1, ._659 + 28\n" - " mov r0, #0x3f\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " mov r0, #0x1f\n" - " strh r0, [r1]\n" - " add r1, r1, #0x6\n" - " mov r0, #0xf1\n" - " strh r0, [r1]\n" - " ldr r0, ._659 + 32\n" - " strh r5, [r0]\n" - " add r1, r1, #0x4\n" - " mov r0, #0x7\n" - " strh r0, [r1]\n" - " ldr r3, ._659 + 36\n" - " ldrh r2, [r3]\n" - " strh r5, [r3]\n" - " ldr r4, ._659 + 40\n" - " ldrh r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " strh r0, [r4]\n" - " strh r2, [r3]\n" - " ldr r0, ._659 + 44\n" - " bl SetVBlankCallback\n" - " ldr r0, ._659 + 48\n" - " bl SetMainCallback2\n" - " bl sub_809D51C\n" - " ldr r1, ._659 + 52\n" - " ldr r2, ._659 + 56\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r2, ._659 + 60\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " sub r1, r1, #0xa\n" - " mov r2, #0xcd\n" - " lsl r2, r2, #0x6\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r0, ._659 + 64\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " ldr r1, ._659 + 68\n" - " ldr r0, ._659 + 72\n" - " str r0, [r1]\n" - " ldr r1, ._659 + 76\n" - " strh r1, [r0]\n" - " strb r6, [r0, #0x2]\n" - " strb r6, [r0, #0x3]\n" - " strb r6, [r0, #0x5]\n" - " strb r6, [r0, #0x7]\n" - " strb r6, [r0, #0xa]\n" - " strb r6, [r0, #0x8]\n" - " ldr r4, ._659 + 80\n" - " add r0, r4, #0\n" - " mov r1, #0x6c\n" - " mov r2, #0x74\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " ldr r6, ._659 + 84\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " strh r5, [r0, #0x2e]\n" - " mov r1, #0x0\n" - " bl StartSpriteAnim\n" - " add r0, r4, #0\n" - " mov r1, #0x6c\n" - " mov r2, #0x74\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " mov r1, #0x1\n" - " strh r1, [r0, #0x2e]\n" - " bl StartSpriteAnim\n" - " add r0, r4, #0\n" - " mov r1, #0x6c\n" - " mov r2, #0x74\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " mov r1, #0x2\n" - " strh r1, [r0, #0x2e]\n" - " bl StartSpriteAnim\n" - " add sp, sp, #0x8\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._660:\n" - " .align 2, 0\n" - "._659:\n" - " .word byte_83F88EC\n" - " .word 0x600e000\n" - " .word 0x40000d4\n" - " .word 0x80000400\n" - " .word word_83F888C\n" - " .word 0x7fff\n" - " .word 0x4000040\n" - " .word 0x4000048\n" - " .word 0x4000052\n" - " .word 0x4000208\n" - " .word 0x4000200\n" - " .word debug_80C3758+1\n" - " .word debug_80C370C+1\n" - " .word 0x4000008\n" - " .word 0x1f0b\n" - " .word 0x1e0a\n" - " .word debug_80C6B00+1\n" - " .word gUnknown_Debug_2038A20\n" - " .word +0x2018000\n" - " .word 0x115\n" - " .word gSpriteTemplate_83F8874\n" - " .word gSprites\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C6B00() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xffffffec\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " ldr r1, ._666\n" - " mov r0, sp\n" - " mov r2, #0x12\n" - " bl memcpy\n" - " mov r0, #0xa\n" - " mov r1, #0x0\n" - " mov r2, #0xf\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x9\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x0\n" - " mov r1, #0xa\n" - " mov r2, #0x9\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x10\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._666 + 4\n" - " mov r1, #0x11\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._666 + 8\n" - " mov r1, #0x1b\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._666 + 12\n" - " mov r1, #0x11\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, #0xa\n" - " mov r1, #0x8\n" - " mov r2, #0x1d\n" - " mov r3, #0xc\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r2, #0x0\n" - " ldr r4, ._666 + 16\n" - " ldr r0, ._666 + 20\n" - " add r3, r0, #0\n" - "._661:\n" - " lsl r0, r2, #0x1\n" - " add r0, r0, r4\n" - " add r1, r2, r3\n" - " strh r1, [r0]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0xe\n" - " bls ._661 @cond_branch\n" - " mov r2, #0x0\n" - " ldr r5, ._666 + 24\n" - " lsl r6, r7, #0x2\n" - " mov r8, r6\n" - " ldr r4, ._666 + 28\n" - " ldr r0, ._666 + 32\n" - " add r3, r0, #0\n" - "._662:\n" - " lsl r0, r2, #0x1\n" - " add r0, r0, r4\n" - " add r1, r2, r3\n" - " strh r1, [r0]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0xe\n" - " bls ._662 @cond_branch\n" - " add r0, r5, #0\n" - " mov r1, #0x14\n" - " mov r2, #0xa\n" - " bl Menu_PrintText\n" - " mov r0, #0xa\n" - " mov r1, #0xd\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r1, sp\n" - " mov r0, #0x23\n" - " strb r0, [r1]\n" - " mov r2, #0x0\n" - " ldr r4, ._666 + 36\n" - " mov r5, #0x93\n" - " lsl r5, r5, #0x8\n" - " add r3, r5, #0\n" - "._663:\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r4\n" - " mov r6, sp\n" - " add r0, r6, r2\n" - " ldrb r0, [r0]\n" - " add r0, r0, r3\n" - " strh r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x11\n" - " bls ._663 @cond_branch\n" - " mov r1, sp\n" - " mov r0, #0x24\n" - " strb r0, [r1]\n" - " mov r2, #0x0\n" - " ldr r5, ._666 + 40\n" - " ldr r4, ._666 + 44\n" - " mov r0, #0x93\n" - " lsl r0, r0, #0x8\n" - " add r3, r0, #0\n" - "._664:\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r4\n" - " mov r6, sp\n" - " add r0, r6, r2\n" - " ldrb r0, [r0]\n" - " add r0, r0, r3\n" - " strh r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x11\n" - " bls ._664 @cond_branch\n" - " mov r1, sp\n" - " mov r0, #0x25\n" - " strb r0, [r1]\n" - " mov r2, #0x0\n" - " ldr r4, ._666 + 48\n" - " mov r0, #0x93\n" - " lsl r0, r0, #0x8\n" - " add r3, r0, #0\n" - "._665:\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r4\n" - " mov r6, sp\n" - " add r0, r6, r2\n" - " ldrb r0, [r0]\n" - " add r0, r0, r3\n" - " strh r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x11\n" - " bls ._665 @cond_branch\n" - " add r0, r5, #0\n" - " mov r1, #0xf\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " ldr r1, ._666 + 52\n" - " ldr r2, ._666 + 56\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r5, ._666 + 60\n" - " add r0, r5, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._666 + 64\n" - " mov r6, r8\n" - " add r0, r6, r7\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._666 + 68\n" - " str r1, [r0]\n" - " add sp, sp, #0x14\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._667:\n" - " .align 2, 0\n" - "._666:\n" - " .word gUnknown_Debug_083F8815\n" - " .word gUnknown_Debug_083F87D0\n" - " .word gUnknown_Debug_083F87D8\n" - " .word gUnknown_Debug_083F87E0\n" - " .word 0x600fa56\n" - " .word 0xa311\n" - " .word gUnknown_Debug_083F87F4\n" - " .word 0x600f256\n" - " .word 0x8301\n" - " .word 0x600f396\n" - " .word gUnknown_Debug_083F8801\n" - " .word 0x600f3d6\n" - " .word 0x600f416\n" - " .word 0x4000040\n" - " .word 0x51ef\n" - " .word 0x699f\n" - " .word gTasks\n" - " .word debug_80C6CB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C6CB8() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffff4\n" - " mov sl, r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov sl, r0\n" - " ldr r5, ._668\n" - " ldr r4, [r5]\n" - " ldrh r2, [r4]\n" - " lsl r0, r2, #0x3\n" - " ldr r1, ._668 + 4\n" - " add r0, r0, r1\n" - " ldr r1, ._668 + 8\n" - " lsl r2, r2, #0x2\n" - " add r2, r2, r1\n" - " ldrb r1, [r2]\n" - " ldrb r2, [r2, #0x1]\n" - " ldr r3, ._668 + 12\n" - " mov r8, r3\n" - " ldr r6, [r3]\n" - " str r6, [sp, #0x8]\n" - " ldr r3, [r3, #0x4]\n" - " str r3, [sp]\n" - " ldrh r3, [r4]\n" - " str r3, [sp, #0x4]\n" - " add r3, r6, #0\n" - " bl DecompressPicFromTable_2\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r7, ._668 + 16\n" - " add r0, r0, r7\n" - " bl LoadCompressedObjectPalette\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " mov r1, #0x1\n" - " bl GetMonSpriteTemplate_803C56C\n" - " ldr r0, ._668 + 20\n" - " mov r1, #0x28\n" - " mov r2, #0x28\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " ldr r1, [r5]\n" - " strb r0, [r1, #0x2]\n" - " ldr r2, [r5]\n" - " ldrb r1, [r2, #0x2]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._668 + 24\n" - " add r0, r0, r1\n" - " ldr r3, ._668 + 28\n" - " mov r9, r3\n" - " str r3, [r0]\n" - " ldrb r0, [r2, #0x2]\n" - " lsl r1, r0, #0x4\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " ldr r6, ._668 + 32\n" - " add r1, r1, r6\n" - " ldrb r2, [r1, #0x5]\n" - " mov r6, #0xd\n" - " neg r6, r6\n" - " add r0, r6, #0\n" - " and r0, r0, r2\n" - " strb r0, [r1, #0x5]\n" - " ldr r4, [r5]\n" - " ldrh r2, [r4]\n" - " lsl r0, r2, #0x3\n" - " ldr r1, ._668 + 36\n" - " add r0, r0, r1\n" - " ldr r1, ._668 + 40\n" - " lsl r2, r2, #0x2\n" - " add r2, r2, r1\n" - " ldrb r1, [r2]\n" - " ldrb r2, [r2, #0x1]\n" - " mov r7, r8\n" - " ldr r3, [r7, #0x8]\n" - " str r3, [sp]\n" - " ldrh r3, [r4]\n" - " str r3, [sp, #0x4]\n" - " ldr r3, [sp, #0x8]\n" - " bl DecompressPicFromTable_2\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r1, ._668 + 16\n" - " add r0, r0, r1\n" - " bl LoadCompressedObjectPalette\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " mov r1, #0x2\n" - " bl GetMonSpriteTemplate_803C56C\n" - " ldr r0, ._668 + 20\n" - " mov r1, #0x28\n" - " mov r2, #0x78\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " ldr r1, [r5]\n" - " strb r0, [r1, #0x3]\n" - " ldr r2, [r5]\n" - " ldrb r1, [r2, #0x3]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r3, ._668 + 24\n" - " add r0, r0, r3\n" - " mov r7, r9\n" - " str r7, [r0]\n" - " ldrb r1, [r2, #0x3]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._668 + 32\n" - " add r0, r0, r1\n" - " ldrb r1, [r0, #0x5]\n" - " and r6, r6, r1\n" - " strb r6, [r0, #0x5]\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " ldr r1, ._668 + 44\n" - " mov r2, #0x0\n" - " str r2, [sp]\n" - " str r2, [sp, #0x4]\n" - " mov r2, #0x68\n" - " mov r3, #0x2c\n" - " bl CreateMonIcon\n" - " ldr r1, [r5]\n" - " strb r0, [r1, #0x4]\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " bl SpeciesToNationalPokedexNum\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r2, #0xff\n" - " lsl r2, r2, #0x2\n" - " mov r1, #0x2\n" - " bl sub_8091738\n" - " ldr r1, ._668 + 48\n" - " ldr r3, ._668 + 52\n" - " add r0, r3, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r6, ._668 + 56\n" - " add r0, r6, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x3e\n" - " ldr r7, ._668 + 60\n" - " add r0, r7, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r2, ._668 + 64\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " mov r1, #0x11\n" - " mov r2, #0x3\n" - " bl debug_80C3800\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " mov r1, #0x1a\n" - " mov r2, #0x5\n" - " bl debug_80C376C\n" - " ldr r2, [r5]\n" - " ldrb r1, [r2, #0x2]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r3, ._668 + 32\n" - " add r0, r0, r3\n" - " ldrb r0, [r0, #0x5]\n" - " lsr r0, r0, #0x4\n" - " strb r0, [r2, #0x6]\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x6]\n" - " lsl r0, r0, #0x5\n" - " ldr r4, ._668 + 68\n" - " add r0, r0, r4\n" - " ldr r6, ._668 + 72\n" - " add r1, r4, r6\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x6]\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r4\n" - " ldr r1, ._668 + 76\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r1, ._668 + 80\n" - " mov r7, sl\n" - " lsl r0, r7, #0x2\n" - " add r0, r0, sl\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._668 + 84\n" - " str r1, [r0]\n" - " ldr r0, [r5]\n" - " mov r1, #0x0\n" - " strb r1, [r0, #0x9]\n" - " bl StopCryAndClearCrySongs\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " mov r1, #0x0\n" - " bl PlayCry1\n" - " add sp, sp, #0xc\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._669:\n" - " .align 2, 0\n" - "._668:\n" - " .word gUnknown_Debug_2038A20\n" - " .word gMonFrontPicTable\n" - " .word gMonFrontPicCoords\n" - " .word gUnknown_081FAF4C\n" - " .word gMonPaletteTable\n" - " .word gUnknown_02024E8C\n" - " .word gSprites+0x1c\n" - " .word debug_69+1\n" - " .word gSprites\n" - " .word gMonBackPicTable\n" - " .word gMonBackPicCoords\n" - " .word sub_809D62C+1\n" - " .word 0x600f858\n" - " .word 0xf3fc\n" - " .word 0xf3fd\n" - " .word 0xf3fe\n" - " .word 0xf3ff\n" - " .word gPlttBufferUnfaded+0x200\n" - " .word 0xffffff00\n" - " .word gPlttBufferFaded+0x100\n" - " .word gTasks\n" - " .word debug_80C6EE8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C6EE8() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " lsl r6, r6, #0x18\n" - " lsr r6, r6, #0x18\n" - " ldr r4, ._670\n" - " ldr r5, ._670 + 4\n" - " ldr r1, [r5]\n" - " add r1, r1, #0x10\n" - " add r0, r4, #0\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r0, ._670 + 8\n" - " add r4, r4, r0\n" - " ldr r3, [r5]\n" - " ldrb r0, [r3, #0x7]\n" - " add r0, r0, #0x81\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r4\n" - " ldrh r4, [r0]\n" - " mov r1, #0x1f\n" - " and r1, r1, r4\n" - " ldrb r2, [r3, #0xc]\n" - " mov r0, #0x20\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r3, #0xc]\n" - " ldr r3, [r5]\n" - " mov r1, #0xf8\n" - " lsl r1, r1, #0x2\n" - " and r1, r1, r4\n" - " ldrh r2, [r3, #0xc]\n" - " ldr r0, ._670 + 12\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strh r0, [r3, #0xc]\n" - " mov r1, #0xf8\n" - " lsl r1, r1, #0x7\n" - " and r1, r1, r4\n" - " lsr r1, r1, #0x8\n" - " ldrb r2, [r3, #0xd]\n" - " mov r0, #0x7d\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r3, #0xd]\n" - " ldr r2, [r5]\n" - " ldrb r1, [r2, #0xd]\n" - " mov r0, #0x7f\n" - " and r0, r0, r1\n" - " strb r0, [r2, #0xd]\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x7]\n" - " add r0, r0, #0x1\n" - " mov r1, #0xb\n" - " mov r2, #0xa\n" - " mov r3, #0x2\n" - " bl debug_80C68CC\n" - " ldr r0, ._670 + 16\n" - " mov r1, #0xd\n" - " mov r2, #0xa\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0xe\n" - " mov r2, #0xa\n" - " mov r3, #0x4\n" - " bl debug_80C68CC\n" - " ldr r1, ._670 + 20\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._670 + 24\n" - " str r1, [r0]\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._671:\n" - " .align 2, 0\n" - "._670:\n" - " .word gPlttBufferUnfaded+0x100\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0xffffff00\n" - " .word 0xfffffc1f\n" - " .word gUnknown_Debug_083F8813\n" - " .word gTasks\n" - " .word debug_80C6FA8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C6FA8() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " ldr r1, ._674\n" - " ldrh r2, [r1, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " add r4, r1, #0\n" - " cmp r0, #0\n" - " beq ._672 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._674 + 4\n" - " bl SetMainCallback2\n" - " ldr r1, ._674 + 8\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._674 + 12\n" - " str r1, [r0]\n" - " b ._703\n" - "._675:\n" - " .align 2, 0\n" - "._674:\n" - " .word gMain\n" - " .word debug_80C370C+1\n" - " .word gTasks\n" - " .word debug_80C373C+1\n" - "._672:\n" - " ldrh r1, [r4, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._676 @cond_branch\n" - " ldr r4, ._678\n" - " ldr r0, [r4]\n" - " ldrh r1, [r0]\n" - " mov r0, #0x0\n" - " b ._677\n" - "._679:\n" - " .align 2, 0\n" - "._678:\n" - " .word gUnknown_Debug_2038A20\n" - "._676:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._680 @cond_branch\n" - " ldr r4, ._682\n" - " ldr r0, [r4]\n" - " ldrh r1, [r0]\n" - " mov r0, #0x1\n" - "._677:\n" - " bl debug_80C3878\n" - " ldr r1, [r4]\n" - " strh r0, [r1]\n" - " ldr r1, ._682 + 4\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._682 + 8\n" - " str r1, [r0]\n" - " b ._703\n" - "._683:\n" - " .align 2, 0\n" - "._682:\n" - " .word gUnknown_Debug_2038A20\n" - " .word gTasks\n" - " .word debug_80C71FC+1\n" - "._680:\n" - " mov r3, #0x1\n" - " and r3, r3, r2\n" - " cmp r3, #0\n" - " beq ._684 @cond_branch\n" - " ldr r0, ._686\n" - " ldr r1, [r0]\n" - " mov r0, #0x1\n" - " strb r0, [r1, #0x5]\n" - " ldr r1, ._686 + 4\n" - " ldr r2, ._686 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._686 + 12\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._686 + 16\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._686 + 20\n" - " str r1, [r0]\n" - " b ._703\n" - "._687:\n" - " .align 2, 0\n" - "._686:\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x4000040\n" - " .word 0x51ef\n" - " .word 0x4167\n" - " .word gTasks\n" - " .word debug_80C7294+1\n" - "._684:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._689 @cond_branch\n" - " ldr r1, ._691\n" - " ldr r2, [r1]\n" - " ldrb r0, [r2, #0x7]\n" - " cmp r0, #0xd\n" - " bhi ._689 @cond_branch\n" - " lsl r0, r0, #0x1\n" - " ldr r2, ._691 + 4\n" - " add r0, r0, r2\n" - " strh r3, [r0]\n" - " ldr r1, [r1]\n" - " ldrb r0, [r1, #0x7]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1, #0x7]\n" - " b ._695\n" - "._692:\n" - " .align 2, 0\n" - "._691:\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x5000102\n" - "._689:\n" - " ldrh r1, [r4, #0x30]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._694 @cond_branch\n" - " ldr r2, ._696\n" - " ldr r1, [r2]\n" - " ldrb r0, [r1, #0x7]\n" - " cmp r0, #0\n" - " beq ._694 @cond_branch\n" - " lsl r0, r0, #0x1\n" - " ldr r1, ._696 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0x0\n" - " strh r1, [r0]\n" - " ldr r1, [r2]\n" - " ldrb r0, [r1, #0x7]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1, #0x7]\n" - " b ._695\n" - "._697:\n" - " .align 2, 0\n" - "._696:\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x5000102\n" - "._694:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._698 @cond_branch\n" - " ldr r4, ._701\n" - " ldr r2, [r4]\n" - " ldrb r0, [r2, #0x9]\n" - " mov r1, #0x1\n" - " eor r0, r0, r1\n" - " strb r0, [r2, #0x9]\n" - " ldr r1, [r4]\n" - " ldrb r0, [r1, #0x9]\n" - " cmp r0, #0\n" - " beq ._699 @cond_branch\n" - " ldrh r0, [r1]\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " bl GetMonSpritePalFromOtIdPersonality\n" - " ldr r1, [r4]\n" - " ldrb r1, [r1, #0x6]\n" - " lsl r1, r1, #0x14\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x11\n" - " add r1, r1, r2\n" - " lsr r1, r1, #0x10\n" - " mov r2, #0x20\n" - " bl LoadCompressedPalette\n" - " b ._700\n" - "._702:\n" - " .align 2, 0\n" - "._701:\n" - " .word gUnknown_Debug_2038A20\n" - "._699:\n" - " ldrh r0, [r1]\n" - " mov r1, #0x0\n" - " mov r2, #0x9\n" - " bl GetMonSpritePalFromOtIdPersonality\n" - " ldr r1, [r4]\n" - " ldrb r1, [r1, #0x6]\n" - " lsl r1, r1, #0x14\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x11\n" - " add r1, r1, r2\n" - " lsr r1, r1, #0x10\n" - " mov r2, #0x20\n" - " bl LoadCompressedPalette\n" - "._700:\n" - " ldr r5, ._704\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x6]\n" - " lsl r0, r0, #0x5\n" - " ldr r4, ._704 + 4\n" - " add r0, r0, r4\n" - " ldr r2, ._704 + 8\n" - " add r1, r4, r2\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x6]\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r4\n" - " ldr r1, ._704 + 12\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - "._695:\n" - " ldr r1, ._704 + 16\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._704 + 20\n" - " str r1, [r0]\n" - " b ._703\n" - "._705:\n" - " .align 2, 0\n" - "._704:\n" - " .word gUnknown_Debug_2038A20\n" - " .word gPlttBufferUnfaded+0x200\n" - " .word 0xffffff00\n" - " .word gPlttBufferFaded+0x100\n" - " .word gTasks\n" - " .word debug_80C6EE8+1\n" - "._698:\n" - " mov r0, #0x4\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._706 @cond_branch\n" - " bl StopCryAndClearCrySongs\n" - " ldr r0, ._707\n" - " ldr r0, [r0]\n" - " ldrh r0, [r0]\n" - " mov r1, #0x0\n" - " bl PlayCry1\n" - "._706:\n" - " ldr r2, ._707\n" - " ldr r1, [r2]\n" - " ldrb r0, [r1, #0x8]\n" - " add r0, r0, #0x4\n" - " strb r0, [r1, #0x8]\n" - " ldr r3, [r2]\n" - " ldrb r1, [r3, #0x8]\n" - " mov r0, #0x1f\n" - " and r0, r0, r1\n" - " strb r0, [r3, #0x8]\n" - " ldr r0, [r2]\n" - " ldrb r1, [r0, #0x7]\n" - " lsl r1, r1, #0x1\n" - " ldr r2, ._707 + 4\n" - " add r1, r1, r2\n" - " ldr r2, ._707 + 8\n" - " ldrb r0, [r0, #0x8]\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r2\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - "._703:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._708:\n" - " .align 2, 0\n" - "._707:\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x5000142\n" - " .word gUnknown_Debug_083F8790\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C71FC() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " ldr r6, ._709\n" - " ldr r4, ._709 + 4\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x2]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldrb r0, [r0, #0x5]\n" - " lsr r0, r0, #0x4\n" - " bl GetSpritePaletteTagByPaletteNum\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl FreeSpritePaletteByTag\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x2]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " bl DestroySprite\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x3]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldrb r0, [r0, #0x5]\n" - " lsr r0, r0, #0x4\n" - " bl GetSpritePaletteTagByPaletteNum\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl FreeSpritePaletteByTag\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x3]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " bl DestroySprite\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x4]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " bl sub_809D510\n" - " ldr r1, ._709 + 8\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._709 + 12\n" - " str r1, [r0]\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._710:\n" - " .align 2, 0\n" - "._709:\n" - " .word gSprites\n" - " .word gUnknown_Debug_2038A20\n" - " .word gTasks\n" - " .word debug_80C6CB8+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C7294() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " ldr r0, ._713\n" - " ldrh r2, [r0, #0x2e]\n" - " mov r1, #0x1\n" - " and r1, r1, r2\n" - " add r3, r0, #0\n" - " cmp r1, #0\n" - " beq ._711 @cond_branch\n" - " ldr r0, ._713 + 4\n" - " ldr r1, [r0]\n" - " mov r0, #0x0\n" - " strb r0, [r1, #0x5]\n" - " ldr r1, ._713 + 8\n" - " ldr r2, ._713 + 12\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._713 + 16\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " b ._712\n" - "._714:\n" - " .align 2, 0\n" - "._713:\n" - " .word gMain\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x4000040\n" - " .word 0x51ef\n" - " .word 0x699f\n" - "._711:\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._715 @cond_branch\n" - " ldr r6, ._717\n" - " ldr r0, [r6]\n" - " strb r1, [r0, #0x5]\n" - " ldr r1, ._717 + 4\n" - " ldr r2, ._717 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._717 + 12\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r0, [r6]\n" - " add r0, r0, #0x10\n" - " ldr r4, ._717 + 16\n" - " add r1, r4, #0\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r0, [r6]\n" - " add r0, r0, #0x10\n" - " ldr r5, ._717 + 20\n" - " add r1, r5, #0\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r1, [r6]\n" - " add r0, r1, #0\n" - " add r0, r0, #0x10\n" - " ldrb r1, [r1, #0x6]\n" - " lsl r1, r1, #0x5\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r4, r4, r2\n" - " add r1, r1, r4\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r1, [r6]\n" - " add r0, r1, #0\n" - " add r0, r0, #0x10\n" - " ldrb r1, [r1, #0x6]\n" - " lsl r1, r1, #0x5\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r5, r5, r2\n" - " add r1, r1, r5\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - "._712:\n" - " ldr r1, ._717 + 24\n" - " lsl r0, r7, #0x2\n" - " add r0, r0, r7\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._717 + 28\n" - " str r1, [r0]\n" - " b ._754\n" - "._718:\n" - " .align 2, 0\n" - "._717:\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x4000040\n" - " .word 0x51ef\n" - " .word 0x699f\n" - " .word gPlttBufferUnfaded+0x100\n" - " .word gPlttBufferFaded+0x100\n" - " .word gTasks\n" - " .word debug_80C6EE8+1\n" - "._715:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._720 @cond_branch\n" - " ldr r0, ._722\n" - " ldr r1, [r0]\n" - " ldrb r0, [r1, #0xa]\n" - " cmp r0, #0x1\n" - " bhi ._720 @cond_branch\n" - " add r0, r0, #0x1\n" - " strb r0, [r1, #0xa]\n" - " b ._754\n" - "._723:\n" - " .align 2, 0\n" - "._722:\n" - " .word gUnknown_Debug_2038A20\n" - "._720:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._725 @cond_branch\n" - " ldr r0, ._727\n" - " ldr r1, [r0]\n" - " ldrb r0, [r1, #0xa]\n" - " cmp r0, #0\n" - " beq ._725 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1, #0xa]\n" - " b ._754\n" - "._728:\n" - " .align 2, 0\n" - "._727:\n" - " .word gUnknown_Debug_2038A20\n" - "._725:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._729 @cond_branch\n" - " ldr r0, ._734\n" - " ldr r2, [r0]\n" - " ldrb r0, [r2, #0xa]\n" - " cmp r0, #0x1\n" - " beq ._730 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._731 @cond_branch\n" - " cmp r0, #0\n" - " beq ._732 @cond_branch\n" - " b ._754\n" - "._735:\n" - " .align 2, 0\n" - "._734:\n" - " .word gUnknown_Debug_2038A20\n" - "._731:\n" - " cmp r0, #0x2\n" - " beq ._736 @cond_branch\n" - " b ._754\n" - "._732:\n" - " ldrb r3, [r2, #0xc]\n" - " lsl r1, r3, #0x1b\n" - " lsr r0, r1, #0x1b\n" - " cmp r0, #0x1e\n" - " bhi ._761 @cond_branch\n" - " add r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " mov r1, #0x20\n" - " neg r1, r1\n" - " and r1, r1, r3\n" - " orr r1, r1, r0\n" - " strb r1, [r2, #0xc]\n" - " b ._761\n" - "._730:\n" - " ldrh r3, [r2, #0xc]\n" - " lsl r1, r3, #0x16\n" - " lsr r0, r1, #0x1b\n" - " cmp r0, #0x1e\n" - " bhi ._761 @cond_branch\n" - " add r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " ldr r1, ._742\n" - " and r1, r1, r3\n" - " orr r1, r1, r0\n" - " strh r1, [r2, #0xc]\n" - " b ._761\n" - "._743:\n" - " .align 2, 0\n" - "._742:\n" - " .word 0xfffffc1f\n" - "._736:\n" - " ldrb r3, [r2, #0xd]\n" - " lsl r1, r3, #0x19\n" - " lsr r0, r1, #0x1b\n" - " cmp r0, #0x1e\n" - " bhi ._761 @cond_branch\n" - " add r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " mov r1, #0x7d\n" - " neg r1, r1\n" - " and r1, r1, r3\n" - " orr r1, r1, r0\n" - " strb r1, [r2, #0xd]\n" - " b ._761\n" - "._729:\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._754 @cond_branch\n" - " ldr r0, ._751\n" - " ldr r3, [r0]\n" - " ldrb r0, [r3, #0xa]\n" - " cmp r0, #0x1\n" - " beq ._747 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._748 @cond_branch\n" - " cmp r0, #0\n" - " beq ._749 @cond_branch\n" - " b ._754\n" - "._752:\n" - " .align 2, 0\n" - "._751:\n" - " .word gUnknown_Debug_2038A20\n" - "._748:\n" - " cmp r0, #0x2\n" - " beq ._753 @cond_branch\n" - " b ._754\n" - "._749:\n" - " ldrb r2, [r3, #0xc]\n" - " mov r0, #0x1f\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._761 @cond_branch\n" - " lsl r0, r2, #0x1b\n" - " lsr r0, r0, #0x1b\n" - " sub r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " mov r1, #0x20\n" - " neg r1, r1\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strb r1, [r3, #0xc]\n" - " b ._761\n" - "._747:\n" - " ldrh r2, [r3, #0xc]\n" - " mov r0, #0xf8\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._761 @cond_branch\n" - " lsl r0, r2, #0x16\n" - " lsr r0, r0, #0x1b\n" - " sub r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " ldr r1, ._759\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strh r1, [r3, #0xc]\n" - " b ._761\n" - "._760:\n" - " .align 2, 0\n" - "._759:\n" - " .word 0xfffffc1f\n" - "._753:\n" - " ldrb r2, [r3, #0xd]\n" - " mov r0, #0x7c\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._761 @cond_branch\n" - " lsl r0, r2, #0x19\n" - " lsr r0, r0, #0x1b\n" - " sub r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " mov r1, #0x7d\n" - " neg r1, r1\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strb r1, [r3, #0xd]\n" - "._761:\n" - " ldr r0, ._762\n" - " lsl r1, r7, #0x2\n" - " add r1, r1, r7\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._762 + 4\n" - " str r0, [r1]\n" - "._754:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._763:\n" - " .align 2, 0\n" - "._762:\n" - " .word gTasks\n" - " .word debug_80C74E4+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C74E4() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " ldr r0, ._764\n" - " ldr r3, [r0]\n" - " ldrb r0, [r3, #0xc]\n" - " lsl r0, r0, #0x1b\n" - " lsr r0, r0, #0x1b\n" - " ldrh r2, [r3, #0xc]\n" - " mov r1, #0xf8\n" - " lsl r1, r1, #0x2\n" - " and r1, r1, r2\n" - " add r0, r0, r1\n" - " ldrb r1, [r3, #0xd]\n" - " lsl r1, r1, #0x19\n" - " lsr r1, r1, #0x1b\n" - " lsl r1, r1, #0xa\n" - " add r0, r0, r1\n" - " ldr r6, ._764 + 4\n" - " ldrb r1, [r3, #0x7]\n" - " add r1, r1, #0x81\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r6\n" - " strh r0, [r1]\n" - " ldr r1, ._764 + 8\n" - " mov r8, r1\n" - " ldrb r1, [r3, #0x7]\n" - " add r1, r1, #0x81\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r8\n" - " strh r0, [r1]\n" - " ldrb r1, [r3, #0x6]\n" - " lsl r1, r1, #0x4\n" - " ldrb r2, [r3, #0x7]\n" - " ldr r4, ._764 + 12\n" - " add r2, r2, r4\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r6\n" - " strh r0, [r1]\n" - " ldrb r1, [r3, #0x6]\n" - " lsl r1, r1, #0x4\n" - " ldrb r2, [r3, #0x7]\n" - " add r2, r2, r4\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r8\n" - " strh r0, [r1]\n" - " mov r1, #0xe\n" - " mov r2, #0xa\n" - " mov r3, #0x4\n" - " bl debug_80C68CC\n" - " ldr r1, ._764 + 16\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._764 + 20\n" - " str r1, [r0]\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._765:\n" - " .align 2, 0\n" - "._764:\n" - " .word gUnknown_Debug_2038A20\n" - " .word gPlttBufferUnfaded\n" - " .word gPlttBufferFaded\n" - " .word 0x101\n" - " .word gTasks\n" - " .word debug_80C7294+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C7584() -{ - asm( - " push {r4, lr}\n" - " add r2, r0, #0\n" - " ldr r0, ._771\n" - " ldr r3, [r0]\n" - " ldrb r1, [r3, #0x5]\n" - " add r4, r0, #0\n" - " cmp r1, #0\n" - " beq ._766 @cond_branch\n" - " mov r1, #0x2e\n" - " ldsh r0, [r2, r1]\n" - " cmp r0, #0x1\n" - " beq ._767 @cond_branch\n" - " cmp r0, #0x1\n" - " ble ._768 @cond_branch\n" - " cmp r0, #0x2\n" - " beq ._769 @cond_branch\n" - "._768:\n" - " ldrb r0, [r3, #0xc]\n" - " lsl r0, r0, #0x1b\n" - " b ._773\n" - "._772:\n" - " .align 2, 0\n" - "._771:\n" - " .word gUnknown_Debug_2038A20\n" - "._767:\n" - " ldrh r0, [r3, #0xc]\n" - " lsl r0, r0, #0x16\n" - " b ._773\n" - "._769:\n" - " ldrb r0, [r3, #0xd]\n" - " lsl r0, r0, #0x19\n" - "._773:\n" - " lsr r0, r0, #0x1b\n" - " lsl r0, r0, #0x2\n" - " strh r0, [r2, #0x24]\n" - " mov r1, #0x2e\n" - " ldsh r0, [r2, r1]\n" - " lsl r0, r0, #0x3\n" - " strh r0, [r2, #0x26]\n" - " ldrh r0, [r2, #0x30]\n" - " add r3, r0, #1\n" - " strh r3, [r2, #0x30]\n" - " mov r0, #0x2e\n" - " ldsh r1, [r2, r0]\n" - " ldr r0, [r4]\n" - " ldrb r0, [r0, #0xa]\n" - " cmp r1, r0\n" - " bne ._775 @cond_branch\n" - " mov r0, #0x8\n" - " and r3, r3, r0\n" - " cmp r3, #0\n" - " bne ._775 @cond_branch\n" - "._766:\n" - " add r0, r2, #0\n" - " add r0, r0, #0x3e\n" - " ldrb r1, [r0]\n" - " mov r2, #0x4\n" - " orr r1, r1, r2\n" - " strb r1, [r0]\n" - " b ._776\n" - "._775:\n" - " add r2, r2, #0x3e\n" - " ldrb r1, [r2]\n" - " mov r0, #0x5\n" - " neg r0, r0\n" - " and r0, r0, r1\n" - " strb r0, [r2]\n" - "._776:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -void InitSeeTrainers() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " bl debug_80C35DC\n" - " ldr r1, ._777\n" - " ldr r2, ._777 + 4\n" - " ldr r0, ._777 + 8\n" - " str r1, [r0]\n" - " str r2, [r0, #0x4]\n" - " ldr r1, ._777 + 12\n" - " str r1, [r0, #0x8]\n" - " ldr r0, [r0, #0x8]\n" - " ldr r0, ._777 + 16\n" - " mov r1, #0x80\n" - " mov r2, #0x60\n" - " bl LoadPalette\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r5, #0x0\n" - " str r5, [sp]\n" - " mov r1, #0x0\n" - " mov r2, #0x10\n" - " mov r3, #0x0\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._777 + 20\n" - " mov r6, #0x0\n" - " strh r5, [r0]\n" - " add r0, r0, #0x4\n" - " strh r5, [r0]\n" - " sub r0, r0, #0x2\n" - " strh r5, [r0]\n" - " add r0, r0, #0x4\n" - " strh r5, [r0]\n" - " ldr r1, ._777 + 24\n" - " mov r0, #0x3f\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " mov r0, #0x1f\n" - " strh r0, [r1]\n" - " add r1, r1, #0x6\n" - " mov r0, #0xf1\n" - " strh r0, [r1]\n" - " ldr r0, ._777 + 28\n" - " strh r5, [r0]\n" - " add r1, r1, #0x4\n" - " mov r0, #0x7\n" - " strh r0, [r1]\n" - " ldr r3, ._777 + 32\n" - " ldrh r2, [r3]\n" - " strh r5, [r3]\n" - " ldr r4, ._777 + 36\n" - " ldrh r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " strh r0, [r4]\n" - " strh r2, [r3]\n" - " ldr r0, ._777 + 40\n" - " bl SetVBlankCallback\n" - " ldr r0, ._777 + 44\n" - " bl SetMainCallback2\n" - " ldr r1, ._777 + 48\n" - " ldr r2, ._777 + 52\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r2, ._777 + 56\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " sub r1, r1, #0xa\n" - " mov r2, #0xcd\n" - " lsl r2, r2, #0x6\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r0, ._777 + 60\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " ldr r1, ._777 + 64\n" - " ldr r0, ._777 + 68\n" - " str r0, [r1]\n" - " strh r5, [r0]\n" - " strb r6, [r0, #0x2]\n" - " strb r6, [r0, #0x3]\n" - " strb r6, [r0, #0x5]\n" - " strb r6, [r0, #0x7]\n" - " strb r6, [r0, #0xa]\n" - " strb r6, [r0, #0x8]\n" - " ldr r4, ._777 + 72\n" - " add r0, r4, #0\n" - " mov r1, #0x6c\n" - " mov r2, #0x74\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " ldr r6, ._777 + 76\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " strh r5, [r0, #0x2e]\n" - " mov r1, #0x0\n" - " bl StartSpriteAnim\n" - " add r0, r4, #0\n" - " mov r1, #0x6c\n" - " mov r2, #0x74\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " mov r1, #0x1\n" - " strh r1, [r0, #0x2e]\n" - " bl StartSpriteAnim\n" - " add r0, r4, #0\n" - " mov r1, #0x6c\n" - " mov r2, #0x74\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " mov r1, #0x2\n" - " strh r1, [r0, #0x2e]\n" - " bl StartSpriteAnim\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._778:\n" - " .align 2, 0\n" - "._777:\n" - " .word byte_83F88EC\n" - " .word 0x600e000\n" - " .word 0x40000d4\n" - " .word 0x80000400\n" - " .word word_83F888C\n" - " .word 0x4000040\n" - " .word 0x4000048\n" - " .word 0x4000052\n" - " .word 0x4000208\n" - " .word 0x4000200\n" - " .word debug_80C3758+1\n" - " .word debug_80C370C+1\n" - " .word 0x4000008\n" - " .word 0x1f0b\n" - " .word 0x1e0a\n" - " .word debug_80C777C+1\n" - " .word gUnknown_Debug_2038A20\n" - " .word +0x2018000\n" - " .word gSpriteTemplate_83F8874\n" - " .word gSprites\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C777C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xffffffec\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " ldr r1, ._784\n" - " mov r0, sp\n" - " mov r2, #0x12\n" - " bl memcpy\n" - " mov r0, #0x9\n" - " mov r1, #0x0\n" - " mov r2, #0xe\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x9\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x0\n" - " mov r1, #0xa\n" - " mov r2, #0x9\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0xe\n" - " mov r1, #0x0\n" - " mov r2, #0x1d\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._784 + 4\n" - " mov r1, #0xf\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._784 + 8\n" - " mov r1, #0x19\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, ._784 + 12\n" - " mov r1, #0xf\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, #0xa\n" - " mov r1, #0x8\n" - " mov r2, #0x1d\n" - " mov r3, #0xc\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r2, #0x0\n" - " ldr r4, ._784 + 16\n" - " ldr r0, ._784 + 20\n" - " add r3, r0, #0\n" - "._779:\n" - " lsl r0, r2, #0x1\n" - " add r0, r0, r4\n" - " add r1, r2, r3\n" - " strh r1, [r0]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0xe\n" - " bls ._779 @cond_branch\n" - " mov r2, #0x0\n" - " ldr r5, ._784 + 24\n" - " lsl r6, r7, #0x2\n" - " mov r8, r6\n" - " ldr r4, ._784 + 28\n" - " ldr r0, ._784 + 32\n" - " add r3, r0, #0\n" - "._780:\n" - " lsl r0, r2, #0x1\n" - " add r0, r0, r4\n" - " add r1, r2, r3\n" - " strh r1, [r0]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0xe\n" - " bls ._780 @cond_branch\n" - " add r0, r5, #0\n" - " mov r1, #0x14\n" - " mov r2, #0xa\n" - " bl Menu_PrintText\n" - " mov r0, #0xa\n" - " mov r1, #0xd\n" - " mov r2, #0x1d\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r1, sp\n" - " mov r0, #0x23\n" - " strb r0, [r1]\n" - " mov r2, #0x0\n" - " ldr r4, ._784 + 36\n" - " mov r5, #0x93\n" - " lsl r5, r5, #0x8\n" - " add r3, r5, #0\n" - "._781:\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r4\n" - " mov r6, sp\n" - " add r0, r6, r2\n" - " ldrb r0, [r0]\n" - " add r0, r0, r3\n" - " strh r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x11\n" - " bls ._781 @cond_branch\n" - " mov r1, sp\n" - " mov r0, #0x24\n" - " strb r0, [r1]\n" - " mov r2, #0x0\n" - " ldr r5, ._784 + 40\n" - " ldr r4, ._784 + 44\n" - " mov r0, #0x93\n" - " lsl r0, r0, #0x8\n" - " add r3, r0, #0\n" - "._782:\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r4\n" - " mov r6, sp\n" - " add r0, r6, r2\n" - " ldrb r0, [r0]\n" - " add r0, r0, r3\n" - " strh r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x11\n" - " bls ._782 @cond_branch\n" - " mov r1, sp\n" - " mov r0, #0x25\n" - " strb r0, [r1]\n" - " mov r2, #0x0\n" - " ldr r4, ._784 + 48\n" - " mov r0, #0x93\n" - " lsl r0, r0, #0x8\n" - " add r3, r0, #0\n" - "._783:\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r4\n" - " mov r6, sp\n" - " add r0, r6, r2\n" - " ldrb r0, [r0]\n" - " add r0, r0, r3\n" - " strh r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x11\n" - " bls ._783 @cond_branch\n" - " add r0, r5, #0\n" - " mov r1, #0xf\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " ldr r1, ._784 + 52\n" - " ldr r2, ._784 + 56\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r5, ._784 + 60\n" - " add r0, r5, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._784 + 64\n" - " mov r6, r8\n" - " add r0, r6, r7\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._784 + 68\n" - " str r1, [r0]\n" - " add sp, sp, #0x14\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._785:\n" - " .align 2, 0\n" - "._784:\n" - " .word gUnknown_Debug_083F8815\n" - " .word gUnknown_Debug_083F87D0\n" - " .word gUnknown_Debug_083F87D8\n" - " .word gUnknown_Debug_083F87E0\n" - " .word 0x600fa56\n" - " .word 0xa311\n" - " .word gUnknown_Debug_083F87F4\n" - " .word 0x600f256\n" - " .word 0x8301\n" - " .word 0x600f396\n" - " .word gUnknown_Debug_083F8801\n" - " .word 0x600f3d6\n" - " .word 0x600f416\n" - " .word 0x4000040\n" - " .word 0x51ef\n" - " .word 0x699f\n" - " .word gTasks\n" - " .word debug_80C7934+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C7934() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add sp, sp, #0xfffffff8\n" - " mov r8, r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - " ldr r5, ._786\n" - " ldr r6, [r5]\n" - " ldrh r2, [r6]\n" - " lsl r0, r2, #0x3\n" - " ldr r1, ._786 + 4\n" - " add r0, r0, r1\n" - " ldr r1, ._786 + 8\n" - " lsl r2, r2, #0x2\n" - " add r2, r2, r1\n" - " ldrb r1, [r2]\n" - " ldrb r2, [r2, #0x1]\n" - " ldr r4, ._786 + 12\n" - " ldr r3, [r4]\n" - " ldr r4, [r4, #0x4]\n" - " str r4, [sp]\n" - " ldrh r4, [r6]\n" - " str r4, [sp, #0x4]\n" - " bl DecompressPicFromTable_2\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r1, ._786 + 16\n" - " add r0, r0, r1\n" - " bl LoadCompressedObjectPalette\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " mov r1, #0x1\n" - " bl GetMonSpriteTemplate_803C5A0\n" - " ldr r0, ._786 + 20\n" - " mov r1, #0x28\n" - " mov r2, #0x28\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " ldr r1, [r5]\n" - " mov r6, #0x0\n" - " strb r0, [r1, #0x2]\n" - " ldr r4, ._786 + 24\n" - " ldr r2, [r5]\n" - " ldrb r1, [r2, #0x2]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r1, r4, #0\n" - " add r1, r1, #0x1c\n" - " add r0, r0, r1\n" - " ldr r1, ._786 + 28\n" - " str r1, [r0]\n" - " ldrb r0, [r2, #0x2]\n" - " lsl r1, r0, #0x4\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r4\n" - " ldrb r2, [r1, #0x5]\n" - " mov r0, #0xd\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " strb r0, [r1, #0x5]\n" - " ldr r0, [r5]\n" - " ldrh r0, [r0]\n" - " mov r1, #0x1a\n" - " mov r2, #0x5\n" - " bl debug_80C376C\n" - " ldr r2, [r5]\n" - " ldrb r1, [r2, #0x2]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r4\n" - " ldrb r0, [r0, #0x5]\n" - " lsr r0, r0, #0x4\n" - " strb r0, [r2, #0x6]\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x6]\n" - " lsl r0, r0, #0x5\n" - " ldr r4, ._786 + 32\n" - " add r0, r0, r4\n" - " ldr r2, ._786 + 36\n" - " add r1, r4, r2\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x6]\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r4\n" - " ldr r1, ._786 + 40\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r1, ._786 + 44\n" - " mov r2, r8\n" - " lsl r0, r2, #0x2\n" - " add r0, r0, r8\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._786 + 48\n" - " str r1, [r0]\n" - " ldr r0, [r5]\n" - " strb r6, [r0, #0x9]\n" - " add sp, sp, #0x8\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._787:\n" - " .align 2, 0\n" - "._786:\n" - " .word gUnknown_Debug_2038A20\n" - " .word gTrainerFrontPicTable\n" - " .word gTrainerFrontPicCoords\n" - " .word gUnknown_081FAF4C\n" - " .word gTrainerFrontPicPaletteTable\n" - " .word gUnknown_02024E8C\n" - " .word gSprites\n" - " .word debug_69+1\n" - " .word gPlttBufferUnfaded+0x200\n" - " .word 0xffffff00\n" - " .word gPlttBufferFaded+0x100\n" - " .word gTasks\n" - " .word debug_80C7A54+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C7A54() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " lsl r6, r6, #0x18\n" - " lsr r6, r6, #0x18\n" - " ldr r4, ._788\n" - " ldr r5, ._788 + 4\n" - " ldr r1, [r5]\n" - " add r1, r1, #0x10\n" - " add r0, r4, #0\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r0, ._788 + 8\n" - " add r4, r4, r0\n" - " ldr r3, [r5]\n" - " ldrb r0, [r3, #0x7]\n" - " add r0, r0, #0x81\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r4\n" - " ldrh r4, [r0]\n" - " mov r1, #0x1f\n" - " and r1, r1, r4\n" - " ldrb r2, [r3, #0xc]\n" - " mov r0, #0x20\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r3, #0xc]\n" - " ldr r3, [r5]\n" - " mov r1, #0xf8\n" - " lsl r1, r1, #0x2\n" - " and r1, r1, r4\n" - " ldrh r2, [r3, #0xc]\n" - " ldr r0, ._788 + 12\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strh r0, [r3, #0xc]\n" - " mov r1, #0xf8\n" - " lsl r1, r1, #0x7\n" - " and r1, r1, r4\n" - " lsr r1, r1, #0x8\n" - " ldrb r2, [r3, #0xd]\n" - " mov r0, #0x7d\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r3, #0xd]\n" - " ldr r2, [r5]\n" - " ldrb r1, [r2, #0xd]\n" - " mov r0, #0x7f\n" - " and r0, r0, r1\n" - " strb r0, [r2, #0xd]\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x7]\n" - " add r0, r0, #0x1\n" - " mov r1, #0xb\n" - " mov r2, #0xa\n" - " mov r3, #0x2\n" - " bl debug_80C68CC\n" - " ldr r0, ._788 + 16\n" - " mov r1, #0xd\n" - " mov r2, #0xa\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " mov r1, #0xe\n" - " mov r2, #0xa\n" - " mov r3, #0x4\n" - " bl debug_80C68CC\n" - " ldr r1, ._788 + 20\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._788 + 24\n" - " str r1, [r0]\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._789:\n" - " .align 2, 0\n" - "._788:\n" - " .word gPlttBufferUnfaded+0x100\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0xffffff00\n" - " .word 0xfffffc1f\n" - " .word gUnknown_Debug_083F8813\n" - " .word gTasks\n" - " .word debug_80C7B14+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C7B14() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " ldr r1, ._792\n" - " ldrh r3, [r1, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r3\n" - " add r4, r1, #0\n" - " cmp r0, #0\n" - " beq ._790 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._792 + 4\n" - " bl SetMainCallback2\n" - " ldr r1, ._792 + 8\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._792 + 12\n" - " str r1, [r0]\n" - " b ._821\n" - "._793:\n" - " .align 2, 0\n" - "._792:\n" - " .word gMain\n" - " .word debug_80C370C+1\n" - " .word gTasks\n" - " .word debug_80C373C+1\n" - "._790:\n" - " ldrh r1, [r4, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._794 @cond_branch\n" - " ldr r4, ._796\n" - " ldr r0, [r4]\n" - " ldrh r1, [r0]\n" - " mov r0, #0x0\n" - " b ._795\n" - "._797:\n" - " .align 2, 0\n" - "._796:\n" - " .word gUnknown_Debug_2038A20\n" - "._794:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._798 @cond_branch\n" - " ldr r4, ._800\n" - " ldr r0, [r4]\n" - " ldrh r1, [r0]\n" - " mov r0, #0x1\n" - "._795:\n" - " bl debug_80C38B4\n" - " ldr r1, [r4]\n" - " strh r0, [r1]\n" - " ldr r1, ._800 + 4\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._800 + 8\n" - " str r1, [r0]\n" - " b ._821\n" - "._801:\n" - " .align 2, 0\n" - "._800:\n" - " .word gUnknown_Debug_2038A20\n" - " .word gTasks\n" - " .word debug_80C7D44+1\n" - "._798:\n" - " mov r2, #0x1\n" - " and r2, r2, r3\n" - " cmp r2, #0\n" - " beq ._802 @cond_branch\n" - " ldr r0, ._804\n" - " ldr r1, [r0]\n" - " mov r0, #0x1\n" - " strb r0, [r1, #0x5]\n" - " ldr r1, ._804 + 4\n" - " ldr r2, ._804 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._804 + 12\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r1, ._804 + 16\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._804 + 20\n" - " str r1, [r0]\n" - " b ._821\n" - "._805:\n" - " .align 2, 0\n" - "._804:\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x4000040\n" - " .word 0x51ef\n" - " .word 0x4167\n" - " .word gTasks\n" - " .word debug_80C7DDC+1\n" - "._802:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " ldr r3, ._809\n" - " cmp r0, #0\n" - " beq ._807 @cond_branch\n" - " ldr r1, [r3]\n" - " ldrb r0, [r1, #0x7]\n" - " cmp r0, #0xd\n" - " bhi ._807 @cond_branch\n" - " lsl r0, r0, #0x1\n" - " ldr r1, ._809 + 4\n" - " add r0, r0, r1\n" - " strh r2, [r0]\n" - " ldr r1, [r3]\n" - " ldrb r0, [r1, #0x7]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1, #0x7]\n" - " b ._813\n" - "._810:\n" - " .align 2, 0\n" - "._809:\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x5000102\n" - "._807:\n" - " ldrh r1, [r4, #0x30]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._812 @cond_branch\n" - " ldr r1, [r3]\n" - " ldrb r0, [r1, #0x7]\n" - " cmp r0, #0\n" - " beq ._812 @cond_branch\n" - " lsl r0, r0, #0x1\n" - " ldr r2, ._814\n" - " add r0, r0, r2\n" - " mov r1, #0x0\n" - " strh r1, [r0]\n" - " ldr r1, [r3]\n" - " ldrb r0, [r1, #0x7]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1, #0x7]\n" - " b ._813\n" - "._815:\n" - " .align 2, 0\n" - "._814:\n" - " .word 0x5000102\n" - "._812:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._816 @cond_branch\n" - " ldr r4, ._819\n" - " ldr r2, [r4]\n" - " ldrb r0, [r2, #0x9]\n" - " mov r1, #0x1\n" - " eor r0, r0, r1\n" - " strb r0, [r2, #0x9]\n" - " ldr r1, [r4]\n" - " ldrb r0, [r1, #0x9]\n" - " cmp r0, #0\n" - " beq ._817 @cond_branch\n" - " ldrh r0, [r1]\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " bl GetMonSpritePalFromOtIdPersonality\n" - " ldr r1, [r4]\n" - " ldrb r1, [r1, #0x6]\n" - " lsl r1, r1, #0x14\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x11\n" - " add r1, r1, r2\n" - " lsr r1, r1, #0x10\n" - " mov r2, #0x20\n" - " bl LoadCompressedPalette\n" - " b ._818\n" - "._820:\n" - " .align 2, 0\n" - "._819:\n" - " .word gUnknown_Debug_2038A20\n" - "._817:\n" - " ldrh r0, [r1]\n" - " mov r1, #0x0\n" - " mov r2, #0x9\n" - " bl GetMonSpritePalFromOtIdPersonality\n" - " ldr r1, [r4]\n" - " ldrb r1, [r1, #0x6]\n" - " lsl r1, r1, #0x14\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x11\n" - " add r1, r1, r2\n" - " lsr r1, r1, #0x10\n" - " mov r2, #0x20\n" - " bl LoadCompressedPalette\n" - "._818:\n" - " ldr r5, ._822\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x6]\n" - " lsl r0, r0, #0x5\n" - " ldr r4, ._822 + 4\n" - " add r0, r0, r4\n" - " ldr r2, ._822 + 8\n" - " add r1, r4, r2\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r0, [r5]\n" - " ldrb r0, [r0, #0x6]\n" - " lsl r0, r0, #0x5\n" - " add r0, r0, r4\n" - " ldr r1, ._822 + 12\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - "._813:\n" - " ldr r1, ._822 + 16\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._822 + 20\n" - " str r1, [r0]\n" - " b ._821\n" - "._823:\n" - " .align 2, 0\n" - "._822:\n" - " .word gUnknown_Debug_2038A20\n" - " .word gPlttBufferUnfaded+0x200\n" - " .word 0xffffff00\n" - " .word gPlttBufferFaded+0x100\n" - " .word gTasks\n" - " .word debug_80C7A54+1\n" - "._816:\n" - " ldr r1, [r3]\n" - " ldrb r0, [r1, #0x8]\n" - " add r0, r0, #0x4\n" - " strb r0, [r1, #0x8]\n" - " ldr r2, [r3]\n" - " ldrb r1, [r2, #0x8]\n" - " mov r0, #0x1f\n" - " and r0, r0, r1\n" - " strb r0, [r2, #0x8]\n" - " ldr r0, [r3]\n" - " ldrb r1, [r0, #0x7]\n" - " lsl r1, r1, #0x1\n" - " ldr r2, ._824\n" - " add r1, r1, r2\n" - " ldr r2, ._824 + 4\n" - " ldrb r0, [r0, #0x8]\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r2\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - "._821:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._825:\n" - " .align 2, 0\n" - "._824:\n" - " .word 0x5000142\n" - " .word gUnknown_Debug_083F8790\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C7D44() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " ldr r6, ._826\n" - " ldr r4, ._826 + 4\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x2]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldrb r0, [r0, #0x5]\n" - " lsr r0, r0, #0x4\n" - " bl GetSpritePaletteTagByPaletteNum\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl FreeSpritePaletteByTag\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x2]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " bl DestroySprite\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x3]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldrb r0, [r0, #0x5]\n" - " lsr r0, r0, #0x4\n" - " bl GetSpritePaletteTagByPaletteNum\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl FreeSpritePaletteByTag\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x3]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " bl DestroySprite\n" - " ldr r0, [r4]\n" - " ldrb r1, [r0, #0x4]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " bl sub_809D510\n" - " ldr r1, ._826 + 8\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._826 + 12\n" - " str r1, [r0]\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._827:\n" - " .align 2, 0\n" - "._826:\n" - " .word gSprites\n" - " .word gUnknown_Debug_2038A20\n" - " .word gTasks\n" - " .word debug_80C7934+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C7DDC() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " ldr r0, ._830\n" - " ldrh r2, [r0, #0x2e]\n" - " mov r1, #0x1\n" - " and r1, r1, r2\n" - " add r3, r0, #0\n" - " cmp r1, #0\n" - " beq ._828 @cond_branch\n" - " ldr r0, ._830 + 4\n" - " ldr r1, [r0]\n" - " mov r0, #0x0\n" - " strb r0, [r1, #0x5]\n" - " ldr r1, ._830 + 8\n" - " ldr r2, ._830 + 12\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._830 + 16\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " b ._829\n" - "._831:\n" - " .align 2, 0\n" - "._830:\n" - " .word gMain\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x4000040\n" - " .word 0x51ef\n" - " .word 0x699f\n" - "._828:\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._832 @cond_branch\n" - " ldr r6, ._834\n" - " ldr r0, [r6]\n" - " strb r1, [r0, #0x5]\n" - " ldr r1, ._834 + 4\n" - " ldr r2, ._834 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x4\n" - " ldr r2, ._834 + 12\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r0, [r6]\n" - " add r0, r0, #0x10\n" - " ldr r4, ._834 + 16\n" - " add r1, r4, #0\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r0, [r6]\n" - " add r0, r0, #0x10\n" - " ldr r5, ._834 + 20\n" - " add r1, r5, #0\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r1, [r6]\n" - " add r0, r1, #0\n" - " add r0, r0, #0x10\n" - " ldrb r1, [r1, #0x6]\n" - " lsl r1, r1, #0x5\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r4, r4, r2\n" - " add r1, r1, r4\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - " ldr r1, [r6]\n" - " add r0, r1, #0\n" - " add r0, r0, #0x10\n" - " ldrb r1, [r1, #0x6]\n" - " lsl r1, r1, #0x5\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r5, r5, r2\n" - " add r1, r1, r5\n" - " mov r2, #0x10\n" - " bl CpuSet\n" - "._829:\n" - " ldr r1, ._834 + 24\n" - " lsl r0, r7, #0x2\n" - " add r0, r0, r7\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._834 + 28\n" - " str r1, [r0]\n" - " b ._871\n" - "._835:\n" - " .align 2, 0\n" - "._834:\n" - " .word gUnknown_Debug_2038A20\n" - " .word 0x4000040\n" - " .word 0x51ef\n" - " .word 0x699f\n" - " .word gPlttBufferUnfaded+0x100\n" - " .word gPlttBufferFaded+0x100\n" - " .word gTasks\n" - " .word debug_80C7A54+1\n" - "._832:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._837 @cond_branch\n" - " ldr r0, ._839\n" - " ldr r1, [r0]\n" - " ldrb r0, [r1, #0xa]\n" - " cmp r0, #0x1\n" - " bhi ._837 @cond_branch\n" - " add r0, r0, #0x1\n" - " strb r0, [r1, #0xa]\n" - " b ._871\n" - "._840:\n" - " .align 2, 0\n" - "._839:\n" - " .word gUnknown_Debug_2038A20\n" - "._837:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._842 @cond_branch\n" - " ldr r0, ._844\n" - " ldr r1, [r0]\n" - " ldrb r0, [r1, #0xa]\n" - " cmp r0, #0\n" - " beq ._842 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1, #0xa]\n" - " b ._871\n" - "._845:\n" - " .align 2, 0\n" - "._844:\n" - " .word gUnknown_Debug_2038A20\n" - "._842:\n" - " ldrh r1, [r3, #0x30]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._846 @cond_branch\n" - " ldr r0, ._851\n" - " ldr r2, [r0]\n" - " ldrb r0, [r2, #0xa]\n" - " cmp r0, #0x1\n" - " beq ._847 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._848 @cond_branch\n" - " cmp r0, #0\n" - " beq ._849 @cond_branch\n" - " b ._871\n" - "._852:\n" - " .align 2, 0\n" - "._851:\n" - " .word gUnknown_Debug_2038A20\n" - "._848:\n" - " cmp r0, #0x2\n" - " beq ._853 @cond_branch\n" - " b ._871\n" - "._849:\n" - " ldrb r3, [r2, #0xc]\n" - " lsl r1, r3, #0x1b\n" - " lsr r0, r1, #0x1b\n" - " cmp r0, #0x1e\n" - " bhi ._878 @cond_branch\n" - " add r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " mov r1, #0x20\n" - " neg r1, r1\n" - " and r1, r1, r3\n" - " orr r1, r1, r0\n" - " strb r1, [r2, #0xc]\n" - " b ._878\n" - "._847:\n" - " ldrh r3, [r2, #0xc]\n" - " lsl r1, r3, #0x16\n" - " lsr r0, r1, #0x1b\n" - " cmp r0, #0x1e\n" - " bhi ._878 @cond_branch\n" - " add r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " ldr r1, ._859\n" - " and r1, r1, r3\n" - " orr r1, r1, r0\n" - " strh r1, [r2, #0xc]\n" - " b ._878\n" - "._860:\n" - " .align 2, 0\n" - "._859:\n" - " .word 0xfffffc1f\n" - "._853:\n" - " ldrb r3, [r2, #0xd]\n" - " lsl r1, r3, #0x19\n" - " lsr r0, r1, #0x1b\n" - " cmp r0, #0x1e\n" - " bhi ._878 @cond_branch\n" - " add r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " mov r1, #0x7d\n" - " neg r1, r1\n" - " and r1, r1, r3\n" - " orr r1, r1, r0\n" - " strb r1, [r2, #0xd]\n" - " b ._878\n" - "._846:\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._871 @cond_branch\n" - " ldr r0, ._868\n" - " ldr r3, [r0]\n" - " ldrb r0, [r3, #0xa]\n" - " cmp r0, #0x1\n" - " beq ._864 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._865 @cond_branch\n" - " cmp r0, #0\n" - " beq ._866 @cond_branch\n" - " b ._871\n" - "._869:\n" - " .align 2, 0\n" - "._868:\n" - " .word gUnknown_Debug_2038A20\n" - "._865:\n" - " cmp r0, #0x2\n" - " beq ._870 @cond_branch\n" - " b ._871\n" - "._866:\n" - " ldrb r2, [r3, #0xc]\n" - " mov r0, #0x1f\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._878 @cond_branch\n" - " lsl r0, r2, #0x1b\n" - " lsr r0, r0, #0x1b\n" - " sub r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " mov r1, #0x20\n" - " neg r1, r1\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strb r1, [r3, #0xc]\n" - " b ._878\n" - "._864:\n" - " ldrh r2, [r3, #0xc]\n" - " mov r0, #0xf8\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._878 @cond_branch\n" - " lsl r0, r2, #0x16\n" - " lsr r0, r0, #0x1b\n" - " sub r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x5\n" - " ldr r1, ._876\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strh r1, [r3, #0xc]\n" - " b ._878\n" - "._877:\n" - " .align 2, 0\n" - "._876:\n" - " .word 0xfffffc1f\n" - "._870:\n" - " ldrb r2, [r3, #0xd]\n" - " mov r0, #0x7c\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._878 @cond_branch\n" - " lsl r0, r2, #0x19\n" - " lsr r0, r0, #0x1b\n" - " sub r0, r0, #0x1\n" - " mov r1, #0x1f\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " mov r1, #0x7d\n" - " neg r1, r1\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strb r1, [r3, #0xd]\n" - "._878:\n" - " ldr r0, ._879\n" - " lsl r1, r7, #0x2\n" - " add r1, r1, r7\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldr r0, ._879 + 4\n" - " str r0, [r1]\n" - "._871:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._880:\n" - " .align 2, 0\n" - "._879:\n" - " .word gTasks\n" - " .word debug_80C802C+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_80C802C() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " ldr r0, ._881\n" - " ldr r3, [r0]\n" - " ldrb r0, [r3, #0xc]\n" - " lsl r0, r0, #0x1b\n" - " lsr r0, r0, #0x1b\n" - " ldrh r2, [r3, #0xc]\n" - " mov r1, #0xf8\n" - " lsl r1, r1, #0x2\n" - " and r1, r1, r2\n" - " add r0, r0, r1\n" - " ldrb r1, [r3, #0xd]\n" - " lsl r1, r1, #0x19\n" - " lsr r1, r1, #0x1b\n" - " lsl r1, r1, #0xa\n" - " add r0, r0, r1\n" - " ldr r6, ._881 + 4\n" - " ldrb r1, [r3, #0x7]\n" - " add r1, r1, #0x81\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r6\n" - " strh r0, [r1]\n" - " ldr r1, ._881 + 8\n" - " mov r8, r1\n" - " ldrb r1, [r3, #0x7]\n" - " add r1, r1, #0x81\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r8\n" - " strh r0, [r1]\n" - " ldrb r1, [r3, #0x6]\n" - " lsl r1, r1, #0x4\n" - " ldrb r2, [r3, #0x7]\n" - " ldr r4, ._881 + 12\n" - " add r2, r2, r4\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r6\n" - " strh r0, [r1]\n" - " ldrb r1, [r3, #0x6]\n" - " lsl r1, r1, #0x4\n" - " ldrb r2, [r3, #0x7]\n" - " add r2, r2, r4\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r8\n" - " strh r0, [r1]\n" - " mov r1, #0xe\n" - " mov r2, #0xa\n" - " mov r3, #0x4\n" - " bl debug_80C68CC\n" - " ldr r1, ._881 + 16\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._881 + 20\n" - " str r1, [r0]\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._882:\n" - " .align 2, 0\n" - "._881:\n" - " .word gUnknown_Debug_2038A20\n" - " .word gPlttBufferUnfaded\n" - " .word gPlttBufferFaded\n" - " .word 0x101\n" - " .word gTasks\n" - " .word debug_80C7DDC+1\n" - "\n" - ); -} - #endif -- cgit v1.2.3 From d972f2af82d805b53bb4b93759fb3ba445b1ce78 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 23 Jan 2018 23:19:36 -0600 Subject: remove Japanese characters from menu order data --- src/debug/start_menu_debug.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 5d9b150e7..2bc536d6c 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -258,15 +258,15 @@ const struct MenuAction gUnknown_Debug_839BC94[] = // debug_sub_8076BB4 will access the array differently and no longer match. //extern const struct MenuAction gUnknown_Debug_839BC94[]; -const u8 Str_839BD14[][10] = +const u8 gMenuOrders_839BD14[][10] = { - _("うかえ"), - _("おけこしすせそ"), + { 3, 6, 4, 0xFF }, + { 5, 9, 10, 12, 13, 14, 15, 0xFF }, }; const u8 Str_839BD26[] = {2, 0, 0, 0}; // doesn't appear to be referenced -const u8 Str_839BD2C[] = _("RTCを リセット します\n" +const u8 Str_839BD2C[] = _("RTCを リセット します\n" // Reset RTC "Aで じっこう   Bでキャンセル"); const u8 Str_839BD4C[] = _("RTCを リセット した!"); @@ -291,8 +291,8 @@ void debug_sub_8076AC8(u8 a) { s32 r4; - gUnknown_030006C4 = Str_839BD14[a]; - for (r4 = 0; gUnknown_030006C4[r4] != EOS; r4++) + gUnknown_030006C4 = gMenuOrders_839BD14[a]; + for (r4 = 0; gUnknown_030006C4[r4] != 0xFF; r4++) ; Menu_EraseWindowRect(16, 0, 29, 19); Menu_DrawStdWindowFrame(16, 0, 29, r4 * 2 + 1); -- cgit v1.2.3 From dbcf1ce9cb124e303e6bed3fecede7a72b8000f2 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 24 Jan 2018 00:58:38 -0600 Subject: integrate some debug differences --- src/battle/battle_2.c | 2179 ++++------------------------------------------- src/engine/cable_club.c | 42 +- src/engine/link.c | 2 +- 3 files changed, 193 insertions(+), 2030 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 6808ad61c..64b64ecea 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -14,6 +14,7 @@ #include "main.h" #include "m4a.h" #include "name_string_util.h" +#include "overworld.h" #include "palette.h" #include "party_menu.h" #include "pokeball.h" @@ -64,6 +65,9 @@ struct UnknownStruct12 u8 filler4[0x54]; }; +void debug_sub_80139E4(void); +extern u8 gUnknown_02023A14_50; + extern const u16 gUnknown_08D004E0[]; extern const struct MonCoords gCastformFrontSpriteCoords[]; @@ -203,231 +207,6 @@ void sub_800E7C4(void) } } -#if DEBUG -__attribute__((naked)) -void InitBattle(void) -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x0\n" - " bl SetHBlankCallback\n" - " mov r0, #0x0\n" - " bl SetVBlankCallback\n" - " mov r4, #0x0\n" - " str r4, [sp]\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x13\n" - " ldr r2, ._10\n" - " mov r0, sp\n" - " bl CpuSet\n" - " ldr r0, ._10 + 4\n" - " strh r4, [r0]\n" - " sub r0, r0, #0xc\n" - " mov r2, #0xf0\n" - " strh r2, [r0]\n" - " add r0, r0, #0x4\n" - " ldr r3, ._10 + 8\n" - " add r1, r3, #0\n" - " strh r1, [r0]\n" - " add r0, r0, #0x4\n" - " strh r4, [r0]\n" - " add r0, r0, #0x2\n" - " strh r4, [r0]\n" - " ldr r0, ._10 + 12\n" - " strh r2, [r0]\n" - " ldr r0, ._10 + 16\n" - " strh r1, [r0]\n" - " bl ScanlineEffect_Clear\n" - " ldr r0, ._10 + 20\n" - " mov r3, #0xf0\n" - " mov r5, #0xf0\n" - " lsl r5, r5, #0x3\n" - " add r2, r0, r5\n" - " mov r1, #0x4f\n" - "._5:\n" - " strh r3, [r0]\n" - " strh r3, [r2]\n" - " add r2, r2, #0x2\n" - " add r0, r0, #0x2\n" - " sub r1, r1, #0x1\n" - " cmp r1, #0\n" - " bge ._5 @cond_branch\n" - " mov r1, #0x50\n" - " ldr r4, ._10 + 24\n" - " ldr r0, ._10 + 20\n" - " ldr r3, ._10 + 28\n" - " mov r5, #0x82\n" - " lsl r5, r5, #0x4\n" - " add r2, r0, r5\n" - " add r0, r0, #0xa0\n" - "._6:\n" - " strh r3, [r0]\n" - " strh r3, [r2]\n" - " add r2, r2, #0x2\n" - " add r0, r0, #0x2\n" - " add r1, r1, #0x1\n" - " cmp r1, #0x9f\n" - " ble ._6 @cond_branch\n" - " ldr r0, [r4]\n" - " ldr r1, [r4, #0x4]\n" - " ldr r2, [r4, #0x8]\n" - " bl ScanlineEffect_SetParams\n" - " ldr r4, ._10 + 32\n" - " add r0, r4, #0\n" - " bl Text_LoadWindowTemplate\n" - " bl ResetPaletteFade\n" - " ldr r0, ._10 + 36\n" - " mov r1, #0x0\n" - " strh r1, [r0]\n" - " ldr r0, ._10 + 40\n" - " strh r1, [r0]\n" - " ldr r0, ._10 + 44\n" - " strh r1, [r0]\n" - " ldr r0, ._10 + 48\n" - " strh r1, [r0]\n" - " ldr r0, ._10 + 52\n" - " strh r1, [r0]\n" - " ldr r0, ._10 + 56\n" - " strh r1, [r0]\n" - " ldr r0, ._10 + 60\n" - " strh r1, [r0]\n" - " ldr r0, ._10 + 64\n" - " strh r1, [r0]\n" - " ldr r0, ._10 + 68\n" - " ldrb r1, [r0]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._7 @cond_branch\n" - " bl BattleSetup_GetTerrain\n" - " ldr r1, ._10 + 72\n" - " strb r0, [r1]\n" - "._7:\n" - " ldr r0, ._10 + 76\n" - " add r1, r4, #0\n" - " bl Text_InitWindowWithTemplate\n" - " ldr r0, ._10 + 80\n" - " ldr r1, ._10 + 84\n" - " bl Text_InitWindowWithTemplate\n" - " ldr r0, ._10 + 88\n" - " ldr r1, ._10 + 92\n" - " bl Text_InitWindowWithTemplate\n" - " bl sub_800D6D4\n" - " bl sub_800DAB8\n" - " bl ResetSpriteData\n" - " bl ResetTasks\n" - " bl sub_800E23C\n" - " bl FreeAllSpritePalettes\n" - " ldr r1, ._10 + 96\n" - " mov r0, #0x4\n" - " strb r0, [r1]\n" - " ldr r0, ._10 + 100\n" - " bl SetVBlankCallback\n" - " bl setup_poochyena_battle\n" - " ldr r0, ._10 + 104\n" - " ldrh r1, [r0]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._8 @cond_branch\n" - " ldr r0, ._10 + 108\n" - " bl SetMainCallback2\n" - " b ._9\n" - "._11:\n" - " .align 2, 0\n" - "._10:\n" - " .word 0x5006000\n" - " .word 0x400004c\n" - " .word 0x5051\n" - " .word gBattle_WIN0H\n" - " .word gBattle_WIN0V\n" - " .word gScanlineEffectRegBuffers\n" - " .word gUnknown_081F9674\n" - " .word 0xff10\n" - " .word gWindowTemplate_81E6C58\n" - " .word gBattle_BG0_X\n" - " .word gBattle_BG0_Y\n" - " .word gBattle_BG1_X\n" - " .word gBattle_BG1_Y\n" - " .word gBattle_BG2_X\n" - " .word gBattle_BG2_Y\n" - " .word gBattle_BG3_X\n" - " .word gBattle_BG3_Y\n" - " .word gUnknown_02023A14_50\n" - " .word gBattleTerrain\n" - " .word gUnknown_03004210\n" - " .word gUnknown_030041D0\n" - " .word gWindowTemplate_81E71D0\n" - " .word gUnknown_03004250\n" - " .word gWindowTemplate_81E71EC\n" - " .word gReservedSpritePaletteCount\n" - " .word sub_800FCFC+1\n" - " .word gBattleTypeFlags\n" - " .word sub_800F298+1\n" - "._8:\n" - " ldr r0, ._15\n" - " bl SetMainCallback2\n" - "._9:\n" - " ldr r0, ._15 + 4\n" - " ldrh r1, [r0]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._13 @cond_branch\n" - " ldr r0, ._15 + 8\n" - " ldrb r1, [r0]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._13 @cond_branch\n" - " ldr r0, ._15 + 12\n" - " ldr r1, ._15 + 16\n" - " ldrh r1, [r1]\n" - " bl CreateNPCTrainerParty\n" - " bl SetWildMonHeldItem\n" - "._13:\n" - " ldr r0, ._15 + 20\n" - " ldr r1, ._15 + 24\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " mov r2, #0x2\n" - " orr r1, r1, r2\n" - " strb r1, [r0]\n" - " ldr r4, ._15 + 28\n" - " mov r3, #0xfa\n" - " lsl r3, r3, #0x1\n" - " add r5, r4, r3\n" - "._14:\n" - " add r0, r4, #0\n" - " mov r1, #0x3\n" - " bl AdjustFriendship\n" - " add r4, r4, #0x64\n" - " cmp r4, r5\n" - " ble ._14 @cond_branch\n" - " mov r1, #0x0\n" - " ldr r0, ._15 + 32\n" - " strb r1, [r0]\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._16:\n" - " .align 2, 0\n" - "._15:\n" - " .word sub_800EC9C+1\n" - " .word gBattleTypeFlags\n" - " .word gUnknown_02023A14_50\n" - " .word gEnemyParty\n" - " .word gTrainerBattleOpponent\n" - " .word gMain\n" - " .word 0x43d\n" - " .word gPlayerParty\n" - " .word gBattleCommunication\n" - "\n" - ); -} -#else void InitBattle(void) { s32 i; @@ -469,7 +248,14 @@ void InitBattle(void) gBattle_BG2_Y = 0; gBattle_BG3_X = 0; gBattle_BG3_Y = 0; + +#if DEBUG + if (!(gUnknown_02023A14_50 & 8)) + gBattleTerrain = BattleSetup_GetTerrain(); +#else gBattleTerrain = BattleSetup_GetTerrain(); +#endif + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0); Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC); @@ -486,7 +272,11 @@ void InitBattle(void) SetMainCallback2(sub_800F298); else SetMainCallback2(sub_800EC9C); - if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) +#if DEBUG + && !(gUnknown_02023A14_50 & 8) +#endif + ) { CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent); SetWildMonHeldItem(); @@ -496,7 +286,6 @@ void InitBattle(void) AdjustFriendship(&gPlayerParty[i], 3); gBattleCommunication[0] = 0; } -#endif void sub_800E9EC(void) { @@ -605,480 +394,11 @@ void shedinja_something(struct Pokemon *pkmn) } } -#if DEBUG -__attribute__((naked)) -void sub_800EC9C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " bl RunTasks\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " bl GetMultiplayerId\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r0, ._55\n" - " ldr r1, ._55 + 4\n" - " add r0, r0, r1\n" - " strb r4, [r0]\n" - " mov r0, #0x1\n" - " add r5, r4, #0\n" - " eor r5, r5, r0\n" - " ldr r0, ._55 + 8\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x9\n" - " bls ._53 @cond_branch\n" - " b ._140\n" - "._53:\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._55 + 12\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._56:\n" - " .align 2, 0\n" - "._55:\n" - " .word gSharedMem\n" - " .word 0x160cb\n" - " .word gBattleCommunication\n" - " .word ._57\n" - "._57:\n" - " .word ._58\n" - " .word ._59\n" - " .word ._60\n" - " .word ._61\n" - " .word ._62\n" - " .word ._63\n" - " .word ._64\n" - " .word ._65\n" - " .word ._66\n" - " .word ._67\n" - "._58:\n" - " ldr r2, ._76\n" - " ldrh r1, [r2]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._68 @cond_branch\n" - " ldr r0, ._76 + 4\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " bne ._69 @cond_branch\n" - " b ._140\n" - "._69:\n" - " bl sub_8007ECC\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._71 @cond_branch\n" - " b ._140\n" - "._71:\n" - " ldr r1, ._76 + 8\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " strb r0, [r1, #0x1]\n" - " bl sub_800E9EC\n" - " bl sub_800EAAC\n" - " ldr r0, ._76 + 12\n" - " ldrb r1, [r0]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._73 @cond_branch\n" - " mov r3, #0x0\n" - " ldr r1, ._76 + 16\n" - " ldr r0, ._76 + 20\n" - "._74:\n" - " strh r3, [r0, #0x18]\n" - " str r1, [r0, #0x14]\n" - " add r0, r0, #0x1c\n" - " add r3, r3, #0x1\n" - " cmp r3, #0x1\n" - " ble ._74 @cond_branch\n" - "._73:\n" - " bl bitmask_all_link_players_but_self\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._76 + 8\n" - " mov r2, #0x20\n" - " bl SendBlock\n" - " ldr r1, ._76 + 24\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " b ._140\n" - "._77:\n" - " .align 2, 0\n" - "._76:\n" - " .word gBattleTypeFlags\n" - " .word gReceivedRemoteLinkPlayers\n" - " .word gSharedMem\n" - " .word gUnknown_02023A14_50\n" - " .word 0x2211\n" - " .word gLinkPlayers\n" - " .word gBattleCommunication\n" - "._68:\n" - " mov r0, #0x4\n" - " orr r0, r0, r1\n" - " strh r0, [r2]\n" - " ldr r1, ._79\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " bl sub_800EB08\n" - " b ._140\n" - "._80:\n" - " .align 2, 0\n" - "._79:\n" - " .word gBattleCommunication\n" - "._59:\n" - " bl GetBlockReceivedStatus\n" - " mov r1, #0x3\n" - " and r1, r1, r0\n" - " cmp r1, #0x3\n" - " beq ._81 @cond_branch\n" - " b ._140\n" - "._81:\n" - " bl ResetBlockReceivedFlags\n" - " mov r3, #0x0\n" - " ldr r0, ._86\n" - " ldrh r1, [r0]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " cmp r1, r0\n" - " bne ._83 @cond_branch\n" - " cmp r4, #0\n" - " bne ._84 @cond_branch\n" - " ldr r0, ._86 + 4\n" - " ldrh r1, [r0]\n" - " mov r2, #0xc\n" - " b ._85\n" - "._87:\n" - " .align 2, 0\n" - "._86:\n" - " .word gBlockRecvBuffer\n" - " .word gBattleTypeFlags\n" - "._84:\n" - " ldr r0, ._92\n" - " ldrh r1, [r0]\n" - " mov r2, #0x8\n" - "._85:\n" - " orr r1, r1, r2\n" - " strh r1, [r0]\n" - " add r3, r3, #0x1\n" - "._83:\n" - " lsl r7, r5, #0x8\n" - " cmp r3, #0\n" - " bne ._94 @cond_branch\n" - " ldr r0, ._92 + 4\n" - " mov r1, #0x80\n" - " lsl r1, r1, #0x1\n" - " add r2, r0, r1\n" - " ldrh r1, [r0]\n" - " add r6, r0, #0\n" - " ldrh r2, [r2]\n" - " cmp r1, r2\n" - " bne ._89 @cond_branch\n" - " cmp r4, #0\n" - " bne ._90 @cond_branch\n" - " ldr r0, ._92\n" - " ldrh r1, [r0]\n" - " mov r2, #0xc\n" - " b ._91\n" - "._93:\n" - " .align 2, 0\n" - "._92:\n" - " .word gBattleTypeFlags\n" - " .word gBlockRecvBuffer\n" - "._90:\n" - " ldr r0, ._96\n" - " ldrh r1, [r0]\n" - " mov r2, #0x8\n" - "._91:\n" - " orr r1, r1, r2\n" - " strh r1, [r0]\n" - " add r3, r3, #0x1\n" - "._89:\n" - " lsl r7, r5, #0x8\n" - " cmp r3, #0\n" - " bne ._94 @cond_branch\n" - " ldrh r1, [r6]\n" - " ldr r0, ._96 + 4\n" - " ldr r2, ._96\n" - " b ._95\n" - "._97:\n" - " .align 2, 0\n" - "._96:\n" - " .word gBattleTypeFlags\n" - " .word 0x101\n" - "._100:\n" - " add r3, r3, #0x1\n" - " cmp r3, #0x1\n" - " bgt ._98 @cond_branch\n" - " lsl r0, r3, #0x8\n" - " add r0, r0, r6\n" - " ldrh r1, [r0]\n" - " ldr r0, ._103\n" - "._95:\n" - " cmp r1, r0\n" - " bls ._100 @cond_branch\n" - " cmp r3, r4\n" - " beq ._100 @cond_branch\n" - "._98:\n" - " cmp r3, #0x2\n" - " bne ._101 @cond_branch\n" - " ldrh r0, [r2]\n" - " mov r1, #0xc\n" - " b ._102\n" - "._104:\n" - " .align 2, 0\n" - "._103:\n" - " .word 0x101\n" - "._101:\n" - " ldrh r0, [r2]\n" - " mov r1, #0x8\n" - "._102:\n" - " orr r0, r0, r1\n" - " strh r0, [r2]\n" - "._94:\n" - " bl sub_800EB08\n" - " ldr r0, ._106\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._106 + 4\n" - " lsl r2, r0, #0x2\n" - " add r2, r2, r0\n" - " lsl r2, r2, #0x3\n" - " add r2, r2, r1\n" - " mov r1, #0x0\n" - " mov r0, #0x87\n" - " lsl r0, r0, #0x1\n" - " strh r0, [r2, #0xa]\n" - " mov r0, #0x5a\n" - " strh r0, [r2, #0xc]\n" - " strh r1, [r2, #0x12]\n" - " ldr r0, ._106 + 8\n" - " ldrb r1, [r0, #0x2]\n" - " ldrb r0, [r0, #0x3]\n" - " lsl r0, r0, #0x8\n" - " orr r1, r1, r0\n" - " strh r1, [r2, #0xe]\n" - " ldr r0, ._106 + 12\n" - " add r0, r0, #0x2\n" - " add r0, r7, r0\n" - " ldrh r0, [r0]\n" - " strh r0, [r2, #0x10]\n" - " b ._129\n" - "._107:\n" - " .align 2, 0\n" - "._106:\n" - " .word sub_800DE30+1\n" - " .word gTasks\n" - " .word gSharedMem\n" - " .word gBlockRecvBuffer\n" - "._60:\n" - " bl sub_8007ECC\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._108 @cond_branch\n" - " b ._140\n" - "._108:\n" - " bl bitmask_all_link_players_but_self\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._111\n" - " mov r2, #0xc8\n" - " bl SendBlock\n" - " b ._129\n" - "._112:\n" - " .align 2, 0\n" - "._111:\n" - " .word gPlayerParty\n" - "._61:\n" - " bl GetBlockReceivedStatus\n" - " mov r1, #0x3\n" - " and r1, r1, r0\n" - " cmp r1, #0x3\n" - " beq ._113 @cond_branch\n" - " b ._140\n" - "._113:\n" - " bl ResetBlockReceivedFlags\n" - " ldr r0, ._116\n" - " lsl r1, r5, #0x8\n" - " ldr r2, ._116 + 4\n" - " add r1, r1, r2\n" - " mov r2, #0xc8\n" - " bl memcpy\n" - " b ._129\n" - "._117:\n" - " .align 2, 0\n" - "._116:\n" - " .word gEnemyParty\n" - " .word gBlockRecvBuffer\n" - "._62:\n" - " bl sub_8007ECC\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._118 @cond_branch\n" - " b ._140\n" - "._118:\n" - " bl bitmask_all_link_players_but_self\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._121\n" - " mov r2, #0xc8\n" - " bl SendBlock\n" - " b ._129\n" - "._122:\n" - " .align 2, 0\n" - "._121:\n" - " .word gPlayerParty+0xc8\n" - "._63:\n" - " bl GetBlockReceivedStatus\n" - " mov r1, #0x3\n" - " and r1, r1, r0\n" - " cmp r1, #0x3\n" - " beq ._123 @cond_branch\n" - " b ._140\n" - "._123:\n" - " bl ResetBlockReceivedFlags\n" - " ldr r0, ._126\n" - " lsl r1, r5, #0x8\n" - " ldr r2, ._126 + 4\n" - " add r1, r1, r2\n" - " mov r2, #0xc8\n" - " bl memcpy\n" - " b ._129\n" - "._127:\n" - " .align 2, 0\n" - "._126:\n" - " .word gEnemyParty+0xc8\n" - " .word gBlockRecvBuffer\n" - "._64:\n" - " bl sub_8007ECC\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._140 @cond_branch\n" - " bl bitmask_all_link_players_but_self\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._130\n" - " mov r2, #0xc8\n" - " bl SendBlock\n" - " b ._129\n" - "._131:\n" - " .align 2, 0\n" - "._130:\n" - " .word gPlayerParty+0x190\n" - "._65:\n" - " bl GetBlockReceivedStatus\n" - " mov r1, #0x3\n" - " and r1, r1, r0\n" - " cmp r1, #0x3\n" - " bne ._140 @cond_branch\n" - " bl ResetBlockReceivedFlags\n" - " ldr r4, ._134\n" - " lsl r1, r5, #0x8\n" - " ldr r0, ._134 + 4\n" - " add r1, r1, r0\n" - " add r0, r4, #0\n" - " mov r2, #0xc8\n" - " bl memcpy\n" - " ldr r1, ._134 + 8\n" - " add r0, r4, r1\n" - " bl shedinja_something\n" - " ldr r1, ._134 + 12\n" - " add r0, r4, r1\n" - " bl shedinja_something\n" - " add r0, r4, #0\n" - " sub r0, r0, #0xc8\n" - " bl shedinja_something\n" - " add r0, r4, #0\n" - " sub r0, r0, #0x64\n" - " bl shedinja_something\n" - " add r0, r4, #0\n" - " bl shedinja_something\n" - " add r0, r4, #0\n" - " add r0, r0, #0x64\n" - " bl shedinja_something\n" - "._129:\n" - " ldr r1, ._134 + 16\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " b ._140\n" - "._135:\n" - " .align 2, 0\n" - "._134:\n" - " .word gEnemyParty+0x190\n" - " .word gBlockRecvBuffer\n" - " .word 0xfffffe70\n" - " .word 0xfffffed4\n" - " .word gBattleCommunication\n" - "._66:\n" - " bl sub_800B950\n" - " ldr r0, ._137\n" - " ldrb r1, [r0]\n" - " add r1, r1, #0x1\n" - " mov r2, #0x0\n" - " strb r1, [r0]\n" - " strb r2, [r0, #0x1]\n" - " strb r2, [r0, #0x2]\n" - " b ._140\n" - "._138:\n" - " .align 2, 0\n" - "._137:\n" - " .word gBattleCommunication\n" - "._67:\n" - " ldr r0, ._141\n" - " add r1, r0, #1\n" - " bl battle_load_something\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._140 @cond_branch\n" - " ldr r2, ._141 + 4\n" - " ldr r1, ._141 + 8\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " ldr r0, ._141 + 12\n" - " str r0, [r1]\n" - " ldr r0, ._141 + 16\n" - " bl SetMainCallback2\n" - " ldr r3, ._141 + 20\n" - " ldrh r2, [r3]\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._140 @cond_branch\n" - " ldr r1, ._141 + 24\n" - " mov r4, #0x80\n" - " lsl r4, r4, #0x4\n" - " add r0, r4, #0\n" - " strh r0, [r1]\n" - " mov r0, #0x20\n" - " orr r0, r0, r2\n" - " strh r0, [r3]\n" - "._140:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._142:\n" - " .align 2, 0\n" - "._141:\n" - " .word gUnknown_02024D1F\n" - " .word gPreBattleCallback1\n" - " .word gMain\n" - " .word debug_sub_80139E4+1\n" - " .word BattleMainCB2+1\n" - " .word gBattleTypeFlags\n" - " .word gTrainerBattleOpponent\n" - "\n" - ); -} -#else -void sub_800EC9C(void) +void sub_800EC9C(void) { u8 playerId; u8 enemyId; + s32 id; RunTasks(); AnimateSprites(); @@ -1098,6 +418,16 @@ void sub_800EC9C(void) gBattleStruct->unk1 = 1; sub_800E9EC(); sub_800EAAC(); +#if DEBUG + if (gUnknown_02023A14_50 & 8) + { + for (id = 0; id < 2; id++) // Why < 2 here? + { + gLinkPlayers[id].lp_field_18 = id; + gLinkPlayers[id].linkType = 0x2211; + } + } +#endif SendBlock(bitmask_all_link_players_but_self(), gBattleStruct, 32); gBattleCommunication[0] = 1; } @@ -1112,7 +442,6 @@ void sub_800EC9C(void) case 1: if ((GetBlockReceivedStatus() & 3) == 3) { - s32 id; u8 taskId; ResetBlockReceivedFlags(); @@ -1220,7 +549,11 @@ void sub_800EC9C(void) if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) { gPreBattleCallback1 = gMain.callback1; +#if DEBUG + gMain.callback1 = debug_sub_80139E4; +#else gMain.callback1 = sub_8010824; +#endif SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -1231,7 +564,6 @@ void sub_800EC9C(void) break; } } -#endif void sub_800F02C(void) { @@ -1258,241 +590,12 @@ void sub_800F02C(void) memcpy(gSharedMem, gUnknown_02023A00, 0x60); } -#if DEBUG -__attribute__((naked)) -void sub_800F104() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " bl GetMultiplayerId\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " ldr r0, ._151\n" - " ldr r2, ._151 + 4\n" - " add r1, r0, r2\n" - " strb r6, [r1]\n" - " ldr r1, ._151 + 8\n" - " add r1, r1, r0\n" - " mov r9, r1\n" - " sub r2, r2, #0x9\n" - " add r2, r2, r0\n" - " mov r8, r2\n" - " bl RunTasks\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " ldr r2, ._151 + 12\n" - " ldrb r0, [r2]\n" - " cmp r0, #0x1\n" - " beq ._147 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._148 @cond_branch\n" - " cmp r0, #0\n" - " beq ._149 @cond_branch\n" - " b ._183\n" - "._152:\n" - " .align 2, 0\n" - "._151:\n" - " .word gSharedMem\n" - " .word 0x160cb\n" - " .word 0x160c4\n" - " .word gBattleCommunication\n" - "._148:\n" - " cmp r0, #0x2\n" - " bne ._153 @cond_branch\n" - " b ._154\n" - "._153:\n" - " cmp r0, #0x3\n" - " bne ._155 @cond_branch\n" - " b ._156\n" - "._155:\n" - " b ._183\n" - "._149:\n" - " ldr r0, ._165\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " bne ._158 @cond_branch\n" - " b ._183\n" - "._158:\n" - " ldr r0, ._165 + 4\n" - " ldrb r1, [r0]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._160 @cond_branch\n" - " mov r4, #0x0\n" - " ldr r1, ._165 + 8\n" - " ldr r0, ._165 + 12\n" - "._161:\n" - " strh r4, [r0, #0x18]\n" - " str r1, [r0, #0x14]\n" - " add r0, r0, #0x1c\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x3\n" - " ble ._161 @cond_branch\n" - "._160:\n" - " bl sub_8007ECC\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._162 @cond_branch\n" - " b ._183\n" - "._162:\n" - " bl sub_800F02C\n" - " bl bitmask_all_link_players_but_self\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._165 + 16\n" - " mov r2, #0x60\n" - " bl SendBlock\n" - " ldr r1, ._165 + 20\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " b ._183\n" - "._166:\n" - " .align 2, 0\n" - "._165:\n" - " .word gReceivedRemoteLinkPlayers\n" - " .word gUnknown_02023A14_50\n" - " .word 0x2211\n" - " .word gLinkPlayers\n" - " .word gSharedMem\n" - " .word gBattleCommunication\n" - "._147:\n" - " bl GetBlockReceivedStatus\n" - " mov r1, #0xf\n" - " and r1, r1, r0\n" - " cmp r1, #0xf\n" - " bne ._183 @cond_branch\n" - " bl ResetBlockReceivedFlags\n" - " mov r4, #0x0\n" - " lsl r0, r6, #0x3\n" - " sub r0, r0, r6\n" - " lsl r5, r0, #0x2\n" - " mov r7, #0x0\n" - "._175:\n" - " cmp r4, r6\n" - " beq ._174 @cond_branch\n" - " ldr r2, ._172\n" - " add r0, r7, r2\n" - " ldrh r1, [r0, #0x18]\n" - " mov r3, #0x1\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._169 @cond_branch\n" - " add r0, r5, r2\n" - " ldrh r1, [r0, #0x18]\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._170 @cond_branch\n" - " b ._174\n" - "._173:\n" - " .align 2, 0\n" - "._172:\n" - " .word gLinkPlayers\n" - "._169:\n" - " add r0, r5, r2\n" - " ldrh r1, [r0, #0x18]\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._174 @cond_branch\n" - "._170:\n" - " lsl r1, r4, #0x8\n" - " ldr r0, ._177\n" - " add r1, r1, r0\n" - " ldr r0, ._177 + 4\n" - " mov r2, #0x60\n" - " bl memcpy\n" - "._174:\n" - " add r7, r7, #0x1c\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x3\n" - " ble ._175 @cond_branch\n" - " ldr r1, ._177 + 8\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._177 + 12\n" - " ldr r0, [r1, #0x8]\n" - " mov r2, r9\n" - " str r0, [r2]\n" - " ldr r0, ._177 + 16\n" - " ldrh r0, [r0]\n" - " mov r2, r8\n" - " strh r0, [r2]\n" - " ldr r0, ._177 + 20\n" - " str r0, [r1, #0x8]\n" - " mov r0, #0x5\n" - " mov r1, #0x0\n" - " bl OpenPartyMenu\n" - " b ._183\n" - "._178:\n" - " .align 2, 0\n" - "._177:\n" - " .word gBlockRecvBuffer\n" - " .word gUnknown_02023A00\n" - " .word gBattleCommunication\n" - " .word gMain\n" - " .word gBattleTypeFlags\n" - " .word sub_800F104+1\n" - "._154:\n" - " ldr r0, ._181\n" - " ldrb r1, [r0, #0x7]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._183 @cond_branch\n" - " mov r0, #0x3\n" - " strb r0, [r2]\n" - " bl sub_800832C\n" - " b ._183\n" - "._182:\n" - " .align 2, 0\n" - "._181:\n" - " .word gPaletteFade\n" - "._156:\n" - " ldr r0, ._184\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " bne ._183 @cond_branch\n" - " ldr r1, ._184 + 4\n" - " mov r2, r8\n" - " ldrh r0, [r2]\n" - " strh r0, [r1]\n" - " ldr r1, ._184 + 8\n" - " mov r2, r9\n" - " ldr r0, [r2]\n" - " str r0, [r1, #0x8]\n" - " ldr r0, ._184 + 12\n" - " bl SetMainCallback2\n" - "._183:\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._185:\n" - " .align 2, 0\n" - "._184:\n" - " .word gReceivedRemoteLinkPlayers\n" - " .word gBattleTypeFlags\n" - " .word gMain\n" - " .word InitBattle+1\n" - "\n" - ); -} -#else void sub_800F104(void) { u8 playerId; MainCallback *pSavedCallback; u16 *pSavedBattleTypeFlags; + s32 i; playerId = GetMultiplayerId(); ewram160CB = playerId; @@ -1506,820 +609,66 @@ void sub_800F104(void) switch (gBattleCommunication[0]) { case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) - { - sub_800F02C(); - SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60); - gBattleCommunication[0]++; - } - break; - case 1: - if ((GetBlockReceivedStatus() & 0xF) == 0xF) - { - s32 i; - - ResetBlockReceivedFlags(); - for (i = 0; i < 4; i++) - { - if (i != playerId) - { - if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) - || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) - memcpy(gUnknown_02023A00, gBlockRecvBuffer[i], 0x60); - } - } - gBattleCommunication[0]++; - *pSavedCallback = gMain.savedCallback; - *pSavedBattleTypeFlags = gBattleTypeFlags; - gMain.savedCallback = sub_800F104; - OpenPartyMenu(PARTY_MENU_TYPE_LINK_MULTI_BATTLE, 0); - } - break; - case 2: - if (!gPaletteFade.active) - { - gBattleCommunication[0] = 3; - sub_800832C(); - } - break; - case 3: - if (gReceivedRemoteLinkPlayers == 0) - { - gBattleTypeFlags = *pSavedBattleTypeFlags; - gMain.savedCallback = *pSavedCallback; - SetMainCallback2(InitBattle); - } - break; - } -} -#endif - -#if DEBUG -__attribute__((naked)) -void sub_800F298() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " bl GetMultiplayerId\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " ldr r0, ._188\n" - " ldr r1, ._188 + 4\n" - " add r0, r0, r1\n" - " strb r6, [r0]\n" - " bl RunTasks\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " ldr r0, ._188 + 8\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x7\n" - " bls ._186 @cond_branch\n" - " b ._352\n" - "._186:\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._188 + 12\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._189:\n" - " .align 2, 0\n" - "._188:\n" - " .word gSharedMem\n" - " .word 0x160cb\n" - " .word gBattleCommunication\n" - " .word ._190\n" - "._190:\n" - " .word ._191\n" - " .word ._192\n" - " .word ._193\n" - " .word ._194\n" - " .word ._195\n" - " .word ._196\n" - " .word ._197\n" - " .word ._198\n" - "._191:\n" - " ldr r0, ._206\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " bne ._199 @cond_branch\n" - " b ._352\n" - "._199:\n" - " ldr r0, ._206 + 4\n" - " ldrb r1, [r0]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._201 @cond_branch\n" - " mov r4, #0x0\n" - " ldr r1, ._206 + 8\n" - " ldr r0, ._206 + 12\n" - "._202:\n" - " strh r4, [r0, #0x18]\n" - " str r1, [r0, #0x14]\n" - " add r0, r0, #0x1c\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x3\n" - " ble ._202 @cond_branch\n" - "._201:\n" - " bl sub_8007ECC\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._203 @cond_branch\n" - " b ._352\n" - "._203:\n" - " ldr r4, ._206 + 16\n" - " mov r0, #0x1\n" - " strb r0, [r4]\n" - " strb r0, [r4, #0x1]\n" - " bl sub_800E9EC\n" - " bl sub_800EAAC\n" - " bl bitmask_all_link_players_but_self\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r1, r4, #0\n" - " mov r2, #0x20\n" - " bl SendBlock\n" - " b ._300\n" - "._207:\n" - " .align 2, 0\n" - "._206:\n" - " .word gReceivedRemoteLinkPlayers\n" - " .word gUnknown_02023A14_50\n" - " .word 0x2211\n" - " .word gLinkPlayers\n" - " .word gSharedMem\n" - "._192:\n" - " bl GetBlockReceivedStatus\n" - " mov r1, #0xf\n" - " and r1, r1, r0\n" - " cmp r1, #0xf\n" - " beq ._208 @cond_branch\n" - " b ._352\n" - "._208:\n" - " bl ResetBlockReceivedFlags\n" - " mov r4, #0x0\n" - " ldr r0, ._213\n" - " ldrh r1, [r0]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " cmp r1, r0\n" - " bne ._210 @cond_branch\n" - " cmp r6, #0\n" - " bne ._211 @cond_branch\n" - " ldr r0, ._213 + 4\n" - " ldrh r1, [r0]\n" - " mov r2, #0xc\n" - " b ._212\n" - "._214:\n" - " .align 2, 0\n" - "._213:\n" - " .word gBlockRecvBuffer\n" - " .word gBattleTypeFlags\n" - "._211:\n" - " ldr r0, ._221\n" - " ldrh r1, [r0]\n" - " mov r2, #0x8\n" - "._212:\n" - " orr r1, r1, r2\n" - " strh r1, [r0]\n" - " add r4, r4, #0x1\n" - "._210:\n" - " cmp r4, #0\n" - " bne ._223 @cond_branch\n" - " mov r2, #0x0\n" - " ldr r1, ._221 + 4\n" - " add r5, r1, #0\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x1\n" - "._217:\n" - " add r1, r1, r3\n" - " add r2, r2, #0x1\n" - " cmp r2, #0x3\n" - " bgt ._216 @cond_branch\n" - " ldrh r0, [r5]\n" - " ldrh r7, [r1]\n" - " cmp r0, r7\n" - " beq ._217 @cond_branch\n" - "._216:\n" - " cmp r2, #0x4\n" - " bne ._218 @cond_branch\n" - " cmp r6, #0\n" - " bne ._219 @cond_branch\n" - " ldr r0, ._221\n" - " ldrh r1, [r0]\n" - " mov r2, #0xc\n" - " b ._220\n" - "._222:\n" - " .align 2, 0\n" - "._221:\n" - " .word gBattleTypeFlags\n" - " .word gBlockRecvBuffer\n" - "._219:\n" - " ldr r0, ._233\n" - " ldrh r1, [r0]\n" - " mov r2, #0x8\n" - "._220:\n" - " orr r1, r1, r2\n" - " strh r1, [r0]\n" - " add r4, r4, #0x1\n" - "._218:\n" - " cmp r4, #0\n" - " bne ._223 @cond_branch\n" - " ldr r0, ._233 + 4\n" - " ldrh r2, [r0]\n" - " ldr r1, ._233 + 8\n" - " add r3, r0, #0\n" - " ldr r5, ._233\n" - " cmp r2, r1\n" - " beq ._224 @cond_branch\n" - "._230:\n" - " lsl r0, r4, #0x8\n" - " add r0, r0, r3\n" - " ldrh r0, [r0]\n" - " ldr r1, ._233 + 8\n" - " cmp r0, r1\n" - " bls ._225 @cond_branch\n" - " cmp r4, r6\n" - " bne ._227 @cond_branch\n" - "._225:\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x3\n" - " bgt ._227 @cond_branch\n" - " lsl r0, r4, #0x8\n" - " add r0, r0, r3\n" - " ldrh r0, [r0]\n" - " cmp r0, r1\n" - " bne ._230 @cond_branch\n" - "._224:\n" - " cmp r4, r6\n" - " beq ._230 @cond_branch\n" - " cmp r4, r6\n" - " bge ._230 @cond_branch\n" - "._227:\n" - " cmp r4, #0x4\n" - " bne ._231 @cond_branch\n" - " ldrh r0, [r5]\n" - " mov r1, #0xc\n" - " b ._232\n" - "._234:\n" - " .align 2, 0\n" - "._233:\n" - " .word gBattleTypeFlags\n" - " .word gBlockRecvBuffer\n" - " .word 0x101\n" - "._231:\n" - " ldrh r0, [r5]\n" - " mov r1, #0x8\n" - "._232:\n" - " orr r0, r0, r1\n" - " strh r0, [r5]\n" - "._223:\n" - " bl sub_800EB08\n" - " ldr r0, ._239\n" - " ldr r1, ._239 + 4\n" - " mov r2, #0x96\n" - " lsl r2, r2, #0x1\n" - " bl memcpy\n" - " ldr r0, ._239 + 8\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._239 + 12\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " mov r2, #0x0\n" - " mov r0, #0x87\n" - " lsl r0, r0, #0x1\n" - " strh r0, [r1, #0xa]\n" - " mov r0, #0x5a\n" - " strh r0, [r1, #0xc]\n" - " strh r2, [r1, #0x12]\n" - " strh r2, [r1, #0xe]\n" - " strh r2, [r1, #0x10]\n" - " add r2, r1, #0\n" - " ldr r0, ._239 + 16\n" - " add r3, r0, #2\n" - " ldr r6, ._239 + 20\n" - " mov r5, #0x3f\n" - " mov r7, #0x80\n" - " lsl r7, r7, #0x1\n" - " mov r4, #0x3\n" - "._247:\n" - " ldrh r0, [r6, #0x18]\n" - " cmp r0, #0x1\n" - " beq ._235 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._236 @cond_branch\n" - " cmp r0, #0\n" - " beq ._237 @cond_branch\n" - " b ._246\n" - "._240:\n" - " .align 2, 0\n" - "._239:\n" - " .word +0x201d000\n" - " .word gPlayerParty\n" - " .word sub_800DE30+1\n" - " .word gTasks\n" - " .word gBlockRecvBuffer\n" - " .word gLinkPlayers\n" - "._236:\n" - " cmp r0, #0x2\n" - " beq ._241 @cond_branch\n" - " cmp r0, #0x3\n" - " beq ._242 @cond_branch\n" - " b ._246\n" - "._237:\n" - " ldrh r0, [r3]\n" - " add r1, r5, #0\n" - " and r1, r1, r0\n" - " b ._244\n" - "._235:\n" - " ldrh r0, [r3]\n" - " add r1, r5, #0\n" - " and r1, r1, r0\n" - " b ._245\n" - "._241:\n" - " ldrh r0, [r3]\n" - " add r1, r5, #0\n" - " and r1, r1, r0\n" - " lsl r1, r1, #0x6\n" - "._244:\n" - " ldrh r0, [r2, #0xe]\n" - " orr r1, r1, r0\n" - " strh r1, [r2, #0xe]\n" - " b ._246\n" - "._242:\n" - " ldrh r0, [r3]\n" - " add r1, r5, #0\n" - " and r1, r1, r0\n" - " lsl r1, r1, #0x6\n" - "._245:\n" - " ldrh r0, [r2, #0x10]\n" - " orr r1, r1, r0\n" - " strh r1, [r2, #0x10]\n" - "._246:\n" - " add r3, r3, r7\n" - " add r6, r6, #0x1c\n" - " sub r4, r4, #0x1\n" - " cmp r4, #0\n" - " bge ._247 @cond_branch\n" - " bl ZeroPlayerPartyMons\n" - " bl ZeroEnemyPartyMons\n" - " ldr r1, ._251\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._193:\n" - " bl sub_8007ECC\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._248 @cond_branch\n" - " b ._352\n" - "._248:\n" - " bl bitmask_all_link_players_but_self\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._251 + 4\n" - " mov r2, #0xc8\n" - " bl SendBlock\n" - " b ._300\n" - "._252:\n" - " .align 2, 0\n" - "._251:\n" - " .word gBattleCommunication\n" - " .word +0x201d000\n" - "._194:\n" - " bl GetBlockReceivedStatus\n" - " mov r1, #0xf\n" - " and r1, r1, r0\n" - " cmp r1, #0xf\n" - " beq ._253 @cond_branch\n" - " b ._352\n" - "._253:\n" - " bl ResetBlockReceivedFlags\n" - " mov r4, #0x0\n" - " lsl r0, r6, #0x3\n" - " sub r0, r0, r6\n" - " lsl r0, r0, #0x2\n" - " mov r8, r0\n" - " ldr r5, ._260\n" - " mov r7, #0x0\n" - "._294:\n" - " cmp r4, r6\n" - " bne ._255 @cond_branch\n" - " ldr r0, ._260 + 4\n" - " add r0, r7, r0\n" - " ldrh r0, [r0, #0x18]\n" - " cmp r0, #0x2\n" - " bgt ._256 @cond_branch\n" - " cmp r0, #0x1\n" - " bge ._257 @cond_branch\n" - " cmp r0, #0\n" - " beq ._258 @cond_branch\n" - " b ._291\n" - "._261:\n" - " .align 2, 0\n" - "._260:\n" - " .word gBlockRecvBuffer\n" - " .word gLinkPlayers\n" - "._256:\n" - " cmp r0, #0x3\n" - " bne ._291 @cond_branch\n" - "._258:\n" - " ldr r0, ._264\n" - " b ._283\n" - "._265:\n" - " .align 2, 0\n" - "._264:\n" - " .word gPlayerParty\n" - "._257:\n" - " ldr r0, ._267\n" - " b ._283\n" - "._268:\n" - " .align 2, 0\n" - "._267:\n" - " .word gPlayerParty+0x12c\n" - "._255:\n" - " ldr r2, ._272\n" - " add r0, r7, r2\n" - " ldrh r1, [r0, #0x18]\n" - " mov r3, #0x1\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._269 @cond_branch\n" - " mov r1, r8\n" - " add r0, r1, r2\n" - " ldrh r1, [r0, #0x18]\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._270 @cond_branch\n" - " b ._274\n" - "._273:\n" - " .align 2, 0\n" - "._272:\n" - " .word gLinkPlayers\n" - "._269:\n" - " mov r1, r8\n" - " add r0, r1, r2\n" - " ldrh r1, [r0, #0x18]\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._274 @cond_branch\n" - "._270:\n" - " add r0, r7, r2\n" - " ldrh r2, [r0, #0x18]\n" - " cmp r2, #0x2\n" - " bgt ._275 @cond_branch\n" - " cmp r2, #0x1\n" - " bge ._276 @cond_branch\n" - " cmp r2, #0\n" - " beq ._277 @cond_branch\n" - " b ._291\n" - "._275:\n" - " cmp r2, #0x3\n" - " bne ._291 @cond_branch\n" - "._277:\n" - " ldr r0, ._281\n" - " b ._283\n" - "._282:\n" - " .align 2, 0\n" - "._281:\n" - " .word gPlayerParty\n" - "._276:\n" - " ldr r0, ._284\n" - " b ._283\n" - "._285:\n" - " .align 2, 0\n" - "._284:\n" - " .word gPlayerParty+0x12c\n" - "._274:\n" - " add r0, r7, r2\n" - " ldrh r2, [r0, #0x18]\n" - " cmp r2, #0x2\n" - " bgt ._286 @cond_branch\n" - " cmp r2, #0x1\n" - " bge ._287 @cond_branch\n" - " cmp r2, #0\n" - " beq ._288 @cond_branch\n" - " b ._291\n" - "._286:\n" - " cmp r2, #0x3\n" - " bne ._291 @cond_branch\n" - "._288:\n" - " ldr r0, ._292\n" - "._283:\n" - " add r1, r5, #0\n" - " mov r2, #0xc8\n" - " bl memcpy\n" - " b ._291\n" - "._293:\n" - " .align 2, 0\n" - "._292:\n" - " .word gEnemyParty\n" - "._287:\n" - " ldr r0, ._296\n" - " add r1, r5, #0\n" - " mov r2, #0xc8\n" - " bl memcpy\n" - "._291:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " add r5, r5, r0\n" - " add r7, r7, #0x1c\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x3\n" - " ble ._294 @cond_branch\n" - " b ._300\n" - "._297:\n" - " .align 2, 0\n" - "._296:\n" - " .word gEnemyParty+0x12c\n" - "._195:\n" - " bl sub_8007ECC\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._298 @cond_branch\n" - " b ._352\n" - "._298:\n" - " bl bitmask_all_link_players_but_self\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r1, ._301\n" - " mov r2, #0x64\n" - " bl SendBlock\n" - " b ._300\n" - "._302:\n" - " .align 2, 0\n" - "._301:\n" - " .word +0x201d0c8\n" - "._196:\n" - " bl GetBlockReceivedStatus\n" - " mov r1, #0xf\n" - " and r1, r1, r0\n" - " cmp r1, #0xf\n" - " beq ._303 @cond_branch\n" - " b ._352\n" - "._303:\n" - " bl ResetBlockReceivedFlags\n" - " mov r4, #0x0\n" - " lsl r0, r6, #0x3\n" - " sub r0, r0, r6\n" - " lsl r0, r0, #0x2\n" - " mov r8, r0\n" - " ldr r5, ._310\n" - " mov r7, #0x0\n" - "._344:\n" - " cmp r4, r6\n" - " bne ._305 @cond_branch\n" - " ldr r0, ._310 + 4\n" - " add r0, r7, r0\n" - " ldrh r0, [r0, #0x18]\n" - " cmp r0, #0x2\n" - " bgt ._306 @cond_branch\n" - " cmp r0, #0x1\n" - " bge ._307 @cond_branch\n" - " cmp r0, #0\n" - " beq ._308 @cond_branch\n" - " b ._341\n" - "._311:\n" - " .align 2, 0\n" - "._310:\n" - " .word gBlockRecvBuffer\n" - " .word gLinkPlayers\n" - "._306:\n" - " cmp r0, #0x3\n" - " bne ._341 @cond_branch\n" - "._308:\n" - " ldr r0, ._314\n" - " b ._333\n" - "._315:\n" - " .align 2, 0\n" - "._314:\n" - " .word gPlayerParty+0xc8\n" - "._307:\n" - " ldr r0, ._317\n" - " b ._333\n" - "._318:\n" - " .align 2, 0\n" - "._317:\n" - " .word gPlayerParty+0x1f4\n" - "._305:\n" - " ldr r2, ._322\n" - " add r0, r7, r2\n" - " ldrh r1, [r0, #0x18]\n" - " mov r3, #0x1\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._319 @cond_branch\n" - " mov r1, r8\n" - " add r0, r1, r2\n" - " ldrh r1, [r0, #0x18]\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._320 @cond_branch\n" - " b ._324\n" - "._323:\n" - " .align 2, 0\n" - "._322:\n" - " .word gLinkPlayers\n" - "._319:\n" - " mov r1, r8\n" - " add r0, r1, r2\n" - " ldrh r1, [r0, #0x18]\n" - " add r0, r3, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._324 @cond_branch\n" - "._320:\n" - " add r0, r7, r2\n" - " ldrh r2, [r0, #0x18]\n" - " cmp r2, #0x2\n" - " bgt ._325 @cond_branch\n" - " cmp r2, #0x1\n" - " bge ._326 @cond_branch\n" - " cmp r2, #0\n" - " beq ._327 @cond_branch\n" - " b ._341\n" - "._325:\n" - " cmp r2, #0x3\n" - " bne ._341 @cond_branch\n" - "._327:\n" - " ldr r0, ._331\n" - " b ._333\n" - "._332:\n" - " .align 2, 0\n" - "._331:\n" - " .word gPlayerParty+0xc8\n" - "._326:\n" - " ldr r0, ._334\n" - " b ._333\n" - "._335:\n" - " .align 2, 0\n" - "._334:\n" - " .word gPlayerParty+0x1f4\n" - "._324:\n" - " add r0, r7, r2\n" - " ldrh r2, [r0, #0x18]\n" - " cmp r2, #0x2\n" - " bgt ._336 @cond_branch\n" - " cmp r2, #0x1\n" - " bge ._337 @cond_branch\n" - " cmp r2, #0\n" - " beq ._338 @cond_branch\n" - " b ._341\n" - "._336:\n" - " cmp r2, #0x3\n" - " bne ._341 @cond_branch\n" - "._338:\n" - " ldr r0, ._342\n" - "._333:\n" - " add r1, r5, #0\n" - " mov r2, #0x64\n" - " bl memcpy\n" - " b ._341\n" - "._343:\n" - " .align 2, 0\n" - "._342:\n" - " .word gEnemyParty+0xc8\n" - "._337:\n" - " ldr r0, ._346\n" - " add r1, r5, #0\n" - " mov r2, #0x64\n" - " bl memcpy\n" - "._341:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " add r5, r5, r0\n" - " add r7, r7, #0x1c\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x3\n" - " ble ._344 @cond_branch\n" - " ldr r4, ._346 + 4\n" - " add r0, r4, #0\n" - " bl shedinja_something\n" - " add r0, r4, #0\n" - " add r0, r0, #0x64\n" - " bl shedinja_something\n" - " add r0, r4, #0\n" - " add r0, r0, #0xc8\n" - " bl shedinja_something\n" - " mov r1, #0x96\n" - " lsl r1, r1, #0x1\n" - " add r0, r4, r1\n" - " bl shedinja_something\n" - " mov r7, #0xc8\n" - " lsl r7, r7, #0x1\n" - " add r0, r4, r7\n" - " bl shedinja_something\n" - " mov r1, #0xfa\n" - " lsl r1, r1, #0x1\n" - " add r0, r4, r1\n" - " bl shedinja_something\n" - " ldr r4, ._346 + 8\n" - " add r0, r4, #0\n" - " bl shedinja_something\n" - " add r0, r4, #0\n" - " add r0, r0, #0x64\n" - " bl shedinja_something\n" - " add r0, r4, #0\n" - " add r0, r0, #0xc8\n" - " bl shedinja_something\n" - " sub r7, r7, #0x64\n" - " add r0, r4, r7\n" - " bl shedinja_something\n" - " mov r1, #0xc8\n" - " lsl r1, r1, #0x1\n" - " add r0, r4, r1\n" - " bl shedinja_something\n" - " add r7, r7, #0xc8\n" - " add r0, r4, r7\n" - " bl shedinja_something\n" - "._300:\n" - " ldr r1, ._346 + 12\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " b ._352\n" - "._347:\n" - " .align 2, 0\n" - "._346:\n" - " .word gEnemyParty+0x1f4\n" - " .word gPlayerParty\n" - " .word gEnemyParty\n" - " .word gBattleCommunication\n" - "._197:\n" - " bl sub_800B950\n" - " ldr r0, ._349\n" - " ldrb r1, [r0]\n" - " add r1, r1, #0x1\n" - " mov r2, #0x0\n" - " strb r1, [r0]\n" - " strb r2, [r0, #0x1]\n" - " strb r2, [r0, #0x2]\n" - " b ._352\n" - "._350:\n" - " .align 2, 0\n" - "._349:\n" - " .word gBattleCommunication\n" - "._198:\n" - " ldr r0, ._353\n" - " add r1, r0, #1\n" - " bl battle_load_something\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._352 @cond_branch\n" - " ldr r2, ._353 + 4\n" - " ldr r1, ._353 + 8\n" - " ldr r0, [r1]\n" - " str r0, [r2]\n" - " ldr r0, ._353 + 12\n" - " str r0, [r1]\n" - " ldr r0, ._353 + 16\n" - " bl SetMainCallback2\n" - " ldr r3, ._353 + 20\n" - " ldrh r2, [r3]\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._352 @cond_branch\n" - " ldr r1, ._353 + 24\n" - " mov r4, #0x80\n" - " lsl r4, r4, #0x4\n" - " add r0, r4, #0\n" - " strh r0, [r1]\n" - " mov r0, #0x20\n" - " orr r0, r0, r2\n" - " strh r0, [r3]\n" - "._352:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._354:\n" - " .align 2, 0\n" - "._353:\n" - " .word gUnknown_02024D1F\n" - " .word gPreBattleCallback1\n" - " .word gMain\n" - " .word debug_sub_80139E4+1\n" - " .word BattleMainCB2+1\n" - " .word gBattleTypeFlags\n" - " .word gTrainerBattleOpponent\n" - "\n" - ); + if (gReceivedRemoteLinkPlayers != 0) + { +#if DEBUG + if (gUnknown_02023A14_50 & 8) + { + for (i = 0; i < 4; i++) + { + gLinkPlayers[i].lp_field_18 = i; + gLinkPlayers[i].linkType = 0x2211; + } + } +#endif + if (sub_8007ECC()) + { + sub_800F02C(); + SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60); + gBattleCommunication[0]++; + } + } + break; + case 1: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + //s32 i; + + ResetBlockReceivedFlags(); + for (i = 0; i < 4; i++) + { + if (i != playerId) + { + if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) + || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) + memcpy(gUnknown_02023A00, gBlockRecvBuffer[i], 0x60); + } + } + gBattleCommunication[0]++; + *pSavedCallback = gMain.savedCallback; + *pSavedBattleTypeFlags = gBattleTypeFlags; + gMain.savedCallback = sub_800F104; + OpenPartyMenu(PARTY_MENU_TYPE_LINK_MULTI_BATTLE, 0); + } + break; + case 2: + if (!gPaletteFade.active) + { + gBattleCommunication[0] = 3; + sub_800832C(); + } + break; + case 3: + if (gReceivedRemoteLinkPlayers == 0) + { + gBattleTypeFlags = *pSavedBattleTypeFlags; + gMain.savedCallback = *pSavedCallback; + SetMainCallback2(InitBattle); + } + break; + } } -#else + void sub_800F298(void) { u8 playerId; @@ -2333,14 +682,27 @@ void sub_800F298(void) switch (gBattleCommunication[0]) { case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + if (gReceivedRemoteLinkPlayers != 0) { - gBattleStruct->unk0 = 1; - gBattleStruct->unk1 = 1; - sub_800E9EC(); - sub_800EAAC(); - SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20); - gBattleCommunication[0]++; +#if DEBUG + if (gUnknown_02023A14_50 & 8) + { + for (id = 0; id < 4; id++) + { + gLinkPlayers[id].lp_field_18 = id; + gLinkPlayers[id].linkType = 0x2211; + } + } +#endif + if (sub_8007ECC()) + { + gBattleStruct->unk0 = 1; + gBattleStruct->unk1 = 1; + sub_800E9EC(); + sub_800EAAC(); + SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20); + gBattleCommunication[0]++; + } } break; case 1: @@ -2576,7 +938,12 @@ void sub_800F298(void) if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) { gPreBattleCallback1 = gMain.callback1; + // debug +#if DEBUG + gMain.callback1 = debug_sub_80139E4; +#else gMain.callback1 = sub_8010824; +#endif SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -2587,128 +954,38 @@ void sub_800F298(void) break; } } -#endif -#if DEBUG -__attribute__((naked)) -void BattleMainCB2(void) -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " ldr r4, ._358\n" - " ldrh r2, [r4, #0x2c]\n" - " mov r1, #0x82\n" - " lsl r1, r1, #0x1\n" - " add r0, r1, #0\n" - " and r0, r0, r2\n" - " cmp r0, r1\n" - " bne ._357 @cond_branch\n" - " ldr r2, ._358 + 4\n" - " ldr r1, ._358 + 8\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x1\n" - " strh r0, [r2]\n" - " ldr r0, ._358 + 12\n" - " add r2, r4, r0\n" - " ldrb r1, [r2]\n" - " mov r0, #0x3\n" - " neg r0, r0\n" - " and r0, r0, r1\n" - " strb r0, [r2]\n" - " ldr r1, ._358 + 16\n" - " mov r0, #0x3\n" - " strb r0, [r1, #0x15]\n" - " ldr r0, ._358 + 20\n" - " ldr r0, [r0]\n" - " str r0, [r4]\n" - " bl ZeroEnemyPartyMons\n" - " mov r0, #0x5a\n" - " bl m4aSongNumStop\n" - " ldr r0, ._358 + 24\n" - " ldrh r1, [r0]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._356 @cond_branch\n" - " ldr r0, ._358 + 28\n" - " bl SetMainCallback2\n" - " b ._357\n" - "._359:\n" - " .align 2, 0\n" - "._358:\n" - " .word gMain\n" - " .word gSpecialVar_Result\n" - " .word gBattleOutcome\n" - " .word 0x43d\n" - " .word gScanlineEffect\n" - " .word gPreBattleCallback1\n" - " .word gBattleTypeFlags\n" - " .word sub_805465C+1\n" - "._356:\n" - " ldr r0, [r4, #0x8]\n" - " bl SetMainCallback2\n" - "._357:\n" - " ldr r5, ._361\n" - " ldrh r1, [r5]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._360 @cond_branch\n" - " lsr r0, r1, #0x2\n" - " mov r4, #0x1\n" - " and r0, r0, r4\n" - " str r4, [sp]\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl debug_sub_8008264\n" - " ldrh r0, [r5]\n" - " lsr r0, r0, #0x2\n" - " and r0, r0, r4\n" - " str r4, [sp]\n" - " mov r1, #0x1\n" - " mov r2, #0x15\n" - " mov r3, #0x1\n" - " bl debug_sub_8008264\n" - " ldrh r0, [r5]\n" - " lsr r0, r0, #0x2\n" - " and r0, r0, r4\n" - " str r4, [sp]\n" - " mov r1, #0x1\n" - " mov r2, #0x29\n" - " mov r3, #0x1\n" - " bl debug_sub_8008264\n" - "._360:\n" - " ldr r0, ._361 + 4\n" - " bl Text_UpdateWindowInBattle\n" - " bl UpdatePaletteFade\n" - " bl RunTasks\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._362:\n" - " .align 2, 0\n" - "._361:\n" - " .word gBattleTypeFlags\n" - " .word gUnknown_03004210\n" - "\n" - ); -} -#else void BattleMainCB2(void) { AnimateSprites(); BuildOamBuffer(); + +#if DEBUG + if ((gMain.heldKeys & (R_BUTTON | SELECT_BUTTON)) == ((R_BUTTON | SELECT_BUTTON))) + { + gSpecialVar_Result = gBattleOutcome = 1; + gMain.inBattle = FALSE; + gScanlineEffect.state = 3; + gMain.callback1 = gPreBattleCallback1; + ZeroEnemyPartyMons(); + m4aSongNumStop(0x5A); + if (gBattleTypeFlags & 2) + SetMainCallback2(sub_805465C); + else + SetMainCallback2(gMain.savedCallback); + } + if (gBattleTypeFlags & 2) + { + debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 1, 1, 1); + debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 21, 1, 1); + debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 41, 1, 1); + } +#endif + Text_UpdateWindowInBattle(&gUnknown_03004210); UpdatePaletteFade(); RunTasks(); } -#endif void sub_800F828(struct Sprite *sprite) { @@ -3084,24 +1361,19 @@ void c2_081284E0(void) // A LOT of debug code! #if DEBUG -__attribute__((naked)) -void debug_sub_8010800() + +extern u8 gBattleBuffersTransferData[]; + +void debug_sub_8010818(void); +void debug_sub_80108B8(void); +void debug_sub_8011EA0(u8); +void debug_sub_8012294(void); + +void debug_sub_8010800(void) { - asm( - " push {lr}\n" - " bl debug_sub_8010818\n" - " bl debug_sub_80108B8\n" - " ldr r1, ._496\n" - " mov r0, #0x0\n" - " str r0, [r1]\n" - " pop {r0}\n" - " bx r0\n" - "._497:\n" - " .align 2, 0\n" - "._496:\n" - " .word gBattleBuffersTransferData+0x100\n" - "\n" - ); + debug_sub_8010818(); + debug_sub_80108B8(); + *(u32 *)(gBattleBuffersTransferData + 0x100) = 0; } __attribute__((naked)) @@ -5849,133 +4121,54 @@ void debug_sub_8011D40() ); } -__attribute__((naked)) void debug_nullsub_45() { - asm( - " bx lr\n" - "\n" - ); } -__attribute__((naked)) -void debug_sub_8011DD4() +void debug_sub_8011DD4(void) { - asm( - " push {lr}\n" - " ldr r1, ._776\n" - " ldr r2, ._776 + 4\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x8\n" - " ldr r0, ._776 + 8\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._776 + 12\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._776 + 16\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._776 + 20\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._776 + 24\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._776 + 28\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._776 + 32\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._776 + 36\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " bl LoadOam\n" - " bl ProcessSpriteCopyRequests\n" - " bl TransferPlttBuffer\n" - " bl ScanlineEffect_InitHBlankDmaTransfer\n" - " pop {r0}\n" - " bx r0\n" - "._777:\n" - " .align 2, 0\n" - "._776:\n" - " .word 0x4000008\n" - " .word 0x9803\n" - " .word gBattle_BG0_X\n" - " .word gBattle_BG0_Y\n" - " .word gBattle_BG1_X\n" - " .word gBattle_BG1_Y\n" - " .word gBattle_BG2_X\n" - " .word gBattle_BG2_Y\n" - " .word gBattle_BG3_X\n" - " .word gBattle_BG3_Y\n" - "\n" - ); + REG_BG0CNT = 0x9803; + + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; + + REG_BG1HOFS = gBattle_BG1_X; + REG_BG1VOFS = gBattle_BG1_Y; + + REG_BG2HOFS = gBattle_BG2_X; + REG_BG2VOFS = gBattle_BG2_Y; + + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); } -__attribute__((naked)) -void debug_sub_8011E5C() +void debug_sub_8011E5C(void) { - asm( - " push {r4, lr}\n" - " mov r4, #0x0\n" - "._778:\n" - " lsl r0, r4, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x1e\n" - " ble ._778 @cond_branch\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + s32 i; + + for (i = 0; i < 31; i++) + debug_sub_8011EA0(i); } -__attribute__((naked)) -void debug_sub_8011E74() +extern u8 gUnknown_Debug_030043A8; + +void debug_sub_8011E74(void) { - asm( - " push {r4, r5, lr}\n" - " ldr r0, ._780\n" - " ldrb r5, [r0]\n" - " mov r1, #0x0\n" - " strb r1, [r0]\n" - " add r4, r0, #0\n" - "._779:\n" - " bl debug_sub_8012294\n" - " ldrb r0, [r4]\n" - " add r0, r0, #0x1\n" - " strb r0, [r4]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x3\n" - " bls ._779 @cond_branch\n" - " ldr r0, ._780\n" - " strb r5, [r0]\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._781:\n" - " .align 2, 0\n" - "._780:\n" - " .word gUnknown_Debug_030043A8\n" - "\n" - ); + u8 r5 = gUnknown_Debug_030043A8; + + for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) + debug_sub_8012294(); + + gUnknown_Debug_030043A8 = r5; } __attribute__((naked)) -void debug_sub_8011EA0() +void debug_sub_8011EA0(u8 a) { asm( " push {r4, r5, r6, r7, lr}\n" diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index ed6929638..8f79944de 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -23,6 +23,7 @@ #include "text.h" #include "trainer_card.h" +extern u8 unk_2030220; extern u16 gSpecialVar_Result; extern struct TrainerCard gTrainerCards[4]; extern u8 gUnknown_03004860; @@ -1374,50 +1375,19 @@ void unref_sub_8083CC8(u8 taskId) #if DEBUG -__attribute__((naked)) -void debug_sub_808B82C() +void debug_sub_808B82C(void) { - asm("\ - ldr r1, ._400\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ - bx lr\n\ -._401:\n\ - .align 2, 0\n\ -._400:\n\ - .word unk_2030220"); + unk_2030220 = 0; } -__attribute__((naked)) void debug_sub_808B838(u8 a) { - asm("\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r2, ._402\n\ - mov r1, #0x1\n\ - LSL r1, r0\n\ - ldrb r0, [r2]\n\ - orr r1, r1, r0\n\ - strb r1, [r2]\n\ - bx lr\n\ -._403:\n\ - .align 2, 0\n\ -._402:\n\ - .word unk_2030220"); + unk_2030220 |= 1 << a; } -__attribute__((naked)) -int debug_sub_808B850() +int debug_sub_808B850(void) { - asm("\ - ldr r0, ._404\n\ - ldrb r0, [r0]\n\ - bx lr\n\ -._405:\n\ - .align 2, 0\n\ -._404:\n\ - .word unk_2030220"); + return unk_2030220; } #endif \ No newline at end of file diff --git a/src/engine/link.c b/src/engine/link.c index eb0ae4731..31311d345 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -1044,7 +1044,7 @@ void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) } #else __attribute__((naked)) -void debug_sub_8008264() +void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) { asm( " push {r4, r5, r6, r7, lr}\n" -- cgit v1.2.3 From d125e9b461204d0f80ae25d35a1569613ee3aa6e Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 24 Jan 2018 01:35:05 -0600 Subject: integrate debug Blender_PrintBlendingResults --- src/scene/berry_blender.c | 493 +--------------------------------------------- 1 file changed, 5 insertions(+), 488 deletions(-) (limited to 'src') diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index 0799531cd..c636e245c 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -3276,493 +3276,6 @@ static void sub_8051C04(struct Sprite* sprite) gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] = gBerryBlenderData->max_RPM; } -#if DEBUG -__attribute__((naked)) -bool8 Blender_PrintBlendingResults(void) -{ - asm(".syntax unified\n\ -loc_8056178:\n\ - PUSH {R4-R7,LR}\n\ - MOV R7, R10\n\ - MOV R6, R9\n\ - MOV R5, R8\n\ - PUSH {R5-R7}\n\ - SUB SP, SP, #0x34\n\ - LDR R1, off_805619C\n\ - LDR R0, [R1]\n\ - LDRB R0, [R0]\n\ - ADDS R2, R1, #0\n\ - CMP R0, #6 @ switch 7 cases\n\ - BLS loc_8056192\n\ - B def_805619A @ jumptable 0805619A default case\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_8056192:\n\ - LSLS R0, R0, #2\n\ - LDR R1, off_80561A0\n\ - ADDS R0, R0, R1\n\ - LDR R0, [R0]\n\ - MOV PC, R0 @ switch jump\n\ -@ ---------------------------------------------------------------------------\n\ -off_805619C: .4byte gBerryBlenderData\n\ -off_80561A0: .4byte jpt_805619A\n\ -jpt_805619A: .4byte loc_80561C0 @ jump table for switch statement\n\ - .4byte loc_80561D6 @ jumptable 0805619A case 1\n\ - .4byte loc_80561F0 @ jumptable 0805619A case 2\n\ - .4byte loc_8056240 @ jumptable 0805619A case 3\n\ - .4byte loc_805645C @ jumptable 0805619A case 4\n\ - .4byte loc_8056470 @ jumptable 0805619A case 5\n\ - .4byte loc_8056538 @ jumptable 0805619A case 6\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_80561C0: @ jumptable 0805619A case 0\n\ - LDR R1, [R2]\n\ - LDRB R0, [R1]\n\ - ADDS R0, #1\n\ - STRB R0, [R1]\n\ - LDR R0, [R2]\n\ - MOVS R1, #0x98\n\ - LSLS R1, R1, #1\n\ - ADDS R0, R0, R1\n\ - MOVS R1, #0x11\n\ - STR R1, [R0]\n\ - B def_805619A @ jumptable 0805619A default case\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_80561D6: @ jumptable 0805619A case 1\n\ - LDR R1, [R2]\n\ - MOVS R0, #0x98\n\ - LSLS R0, R0, #1\n\ - ADDS R2, R1, R0\n\ - LDR R0, [R2]\n\ - SUBS R0, #0xA\n\ - STR R0, [R2]\n\ - CMP R0, #0\n\ - BLT loc_80561EA\n\ - B def_805619A @ jumptable 0805619A default case\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_80561EA:\n\ - MOVS R0, #0\n\ - STR R0, [R2]\n\ - B loc_8056520\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_80561F0: @ jumptable 0805619A case 2\n\ - LDR R1, [R2]\n\ - MOVS R2, #0x98\n\ - LSLS R2, R2, #1\n\ - ADDS R1, R1, R2\n\ - LDR R0, [R1]\n\ - ADDS R0, #1\n\ - STR R0, [R1]\n\ - CMP R0, #0x14\n\ - BGT loc_8056204\n\ - B def_805619A @ jumptable 0805619A default case\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_8056204:\n\ - MOVS R6, #0\n\ -\n\ -loc_8056206:\n\ - LDR R4, off_8056238\n\ - LDR R0, [R4]\n\ - ADDS R0, #0x50\n\ - ADDS R0, R0, R6\n\ - LDRB R1, [R0]\n\ - LSLS R0, R1, #4\n\ - ADDS R0, R0, R1\n\ - LSLS R0, R0, #2\n\ - LDR R1, off_805623C\n\ - ADDS R0, R0, R1\n\ - BL DestroySprite\n\ - ADDS R0, R6, #1\n\ - LSLS R0, R0, #0x10\n\ - LSRS R6, R0, #0x10\n\ - CMP R6, #2\n\ - BLS loc_8056206\n\ - LDR R1, [R4]\n\ - MOVS R0, #0x98\n\ - LSLS R0, R0, #1\n\ - ADDS R2, R1, R0\n\ - MOVS R0, #0\n\ - STR R0, [R2]\n\ - B loc_8056520\n\ -@ ---------------------------------------------------------------------------\n\ - .align 2, 0\n\ -off_8056238: .4byte gBerryBlenderData\n\ -off_805623C: .4byte gSprites\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_8056240: @ jumptable 0805619A case 3\n\ - MOVS R0, #4\n\ - MOVS R1, #2\n\ - MOVS R2, #0x19\n\ - MOVS R3, #0x11\n\ - BL Menu_DrawStdWindowFrame\n\ - LDR R0, dword_805642C\n\ - MOVS R1, #5\n\ - MOVS R2, #3\n\ - MOVS R3, #0xA0\n\ - BL sub_8072BD8\n\ - MOVS R6, #0\n\ - LDR R1, off_8056430\n\ - LDR R0, [R1]\n\ - ADDS R0, #0x88\n\ - ADD R2, SP, #0xC\n\ - MOV R8, R2\n\ - MOV R2, SP\n\ - ADDS R2, #0x16\n\ - STR R2, [SP,#0x30]\n\ - LDRB R0, [R0]\n\ - CMP R6, R0\n\ - BCS loc_8056322\n\ - MOV R9, R1\n\ - LDR R0, off_8056434\n\ - MOV R10, R0\n\ -\n\ -loc_8056276:\n\ - MOV R1, R9\n\ - LDR R2, [R1]\n\ - MOVS R1, #0xB2\n\ - LSLS R1, R1, #1\n\ - ADDS R0, R2, R1\n\ - ADDS R0, R0, R6\n\ - LDRB R4, [R0]\n\ - LSLS R1, R4, #4\n\ - ADDS R1, R1, R2\n\ - MOVS R2, #0xBF\n\ - LSLS R2, R2, #1\n\ - ADDS R1, R1, R2\n\ - MOV R0, R8\n\ - BL StringCopy\n\ - LSLS R5, R4, #3\n\ - SUBS R5, R5, R4\n\ - LSLS R5, R5, #2\n\ - MOV R1, R10\n\ - ADDS R0, R5, R1\n\ - LDRB R1, [R0,#0x1A]\n\ - MOV R0, R8\n\ - BL ConvertInternationalString\n\ - MOV R0, R8\n\ - LDR R1, dword_8056438\n\ - BL de_sub_8073174\n\ - MOV R2, R9\n\ - LDR R0, [R2]\n\ - ADDS R7, R0, #0\n\ - ADDS R7, #0xAB\n\ - ADDS R4, R6, #1\n\ - ADDS R0, R7, #0\n\ - ADDS R1, R4, #0\n\ - BL ConvertIntToDecimalString\n\ - ADDS R7, R0, #0\n\ - MOVS R1, #0\n\ - STRB R1, [R7]\n\ - MOVS R0, #0xAD\n\ - STRB R0, [R7,#1]\n\ - STRB R1, [R7,#2]\n\ - ADDS R7, #3\n\ - LDR R0, off_805643C\n\ - ADDS R5, R5, R0\n\ - ADDS R0, R7, #0\n\ - ADDS R1, R5, #0\n\ - MOVS R2, #0x58\n\ - MOVS R3, #0\n\ - BL sub_8072C74\n\ - ADDS R7, R0, #0\n\ - ADD R1, SP, #0xC\n\ - MOVS R2, #0x9D\n\ - MOVS R3, #0\n\ - BL sub_8072C74\n\ - MOV R2, R9\n\ - LDR R1, [R2]\n\ - ADDS R0, R1, #0\n\ - ADDS R0, #0xAB\n\ - LDR R3, dword_8056440\n\ - ADDS R1, #0x88\n\ - LDRB R2, [R1]\n\ - ADDS R3, R2, R3\n\ - LDR R1, dword_8056444\n\ - ADDS R2, R2, R1\n\ - LDRB R1, [R2]\n\ - ADDS R2, R6, #0\n\ - MULS R2, R1\n\ - LDRB R3, [R3]\n\ - ADDS R2, R2, R3\n\ - LSLS R2, R2, #0x18\n\ - LSRS R2, R2, #0x18\n\ - MOVS R1, #5\n\ - BL Menu_PrintText\n\ - LSLS R4, R4, #0x10\n\ - LSRS R6, R4, #0x10\n\ - MOV R1, R9\n\ - LDR R0, [R1]\n\ - ADDS R0, #0x88\n\ - LDRB R0, [R0]\n\ - CMP R6, R0\n\ - BCC loc_8056276\n\ -\n\ -loc_8056322:\n\ - LDR R6, off_8056430\n\ - LDR R0, [R6]\n\ - ADDS R0, #0x5A\n\ - LDRH R0, [R0]\n\ - MOVS R1, #0x64\n\ - BL __umodsi3\n\ - ADDS R1, R0, #0\n\ - LSLS R1, R1, #0x10\n\ - LSRS R1, R1, #0x10\n\ - MOV R0, R8\n\ - MOVS R2, #2\n\ - MOVS R3, #2\n\ - BL ConvertIntToDecimalStringN\n\ - LDR R0, [R6]\n\ - ADDS R7, R0, #0\n\ - ADDS R7, #0xAB\n\ - LDR R1, dword_8056448\n\ - ADDS R0, R7, #0\n\ - BL StringCopy\n\ - ADDS R7, R0, #0\n\ - LDR R0, [R6]\n\ - ADDS R0, #0x5A\n\ - LDRH R0, [R0]\n\ - MOVS R1, #0x64\n\ - BL __udivsi3\n\ - ADDS R1, R0, #0\n\ - LSLS R1, R1, #0x10\n\ - LSRS R1, R1, #0x10\n\ - ADDS R0, R7, #0\n\ - MOVS R2, #0x79\n\ - MOVS R3, #1\n\ - BL sub_8072C14\n\ - ADDS R7, R0, #0\n\ - MOVS R0, #0xB8\n\ - STRB R0, [R7]\n\ - ADDS R7, #1\n\ - ADDS R0, R7, #0\n\ - MOV R1, R8\n\ - MOVS R2, #0x88\n\ - MOVS R3, #1\n\ - BL sub_8072C74\n\ - ADDS R7, R0, #0\n\ - LDR R1, off_805644C\n\ - BL StringCopy\n\ - LDR R0, [R6]\n\ - ADDS R0, #0xAB\n\ - MOVS R1, #5\n\ - MOVS R2, #0xD\n\ - BL Menu_PrintText\n\ - LDR R0, [R6]\n\ - MOVS R2, #0x96\n\ - LSLS R2, R2, #1\n\ - ADDS R0, R0, R2\n\ - LDR R0, [R0]\n\ - MOVS R1, #0x3C\n\ - BL __udivsi3\n\ - ADDS R4, R0, #0\n\ - LSLS R4, R4, #0x10\n\ - LSRS R4, R4, #0x10\n\ - ADDS R0, R4, #0\n\ - MOVS R1, #0x3C\n\ - BL __umodsi3\n\ - ADDS R5, R0, #0\n\ - LSLS R5, R5, #0x10\n\ - LSRS R5, R5, #0x10\n\ - ADDS R0, R4, #0\n\ - MOVS R1, #0x3C\n\ - BL __udivsi3\n\ - ADDS R1, R0, #0\n\ - LSLS R1, R1, #0x10\n\ - LSRS R1, R1, #0x10\n\ - MOV R0, R8\n\ - MOVS R2, #2\n\ - MOVS R3, #2\n\ - BL ConvertIntToDecimalStringN\n\ - LDR R0, [SP,#0x30]\n\ - ADDS R1, R5, #0\n\ - MOVS R2, #2\n\ - MOVS R3, #2\n\ - BL ConvertIntToDecimalStringN\n\ - LDR R0, [R6]\n\ - ADDS R7, R0, #0\n\ - ADDS R7, #0xAB\n\ - LDR R1, dword_8056450\n\ - ADDS R0, R7, #0\n\ - BL StringCopy\n\ - ADDS R7, R0, #0\n\ - MOV R1, R8\n\ - MOVS R2, #0x63\n\ - MOVS R3, #1\n\ - BL sub_8072C74\n\ - ADDS R7, R0, #0\n\ - LDR R1, dword_8056454\n\ - BL StringAppend\n\ - ADDS R7, R0, #0\n\ - LDR R1, [SP,#0x30]\n\ - MOVS R2, #0x88\n\ - MOVS R3, #1\n\ - BL sub_8072C74\n\ - ADDS R7, R0, #0\n\ - LDR R1, dword_8056458\n\ - BL StringCopy\n\ - LDR R0, [R6]\n\ - ADDS R0, #0xAB\n\ - MOVS R1, #5\n\ - MOVS R2, #0xF\n\ - BL Menu_PrintText\n\ - LDR R1, [R6]\n\ - MOVS R0, #0x98\n\ - LSLS R0, R0, #1\n\ - ADDS R2, R1, R0\n\ - MOVS R0, #0\n\ - STR R0, [R2]\n\ - B loc_8056520\n\ -@ ---------------------------------------------------------------------------\n\ -dword_805642C: .4byte gOtherText_ResultsOfBlending\n\ -off_8056430: .4byte gBerryBlenderData\n\ -off_8056434: .4byte gLinkPlayers\n\ -dword_8056438: .4byte gOtherText_Berry\n\ -off_805643C: .4byte gLinkPlayers+0x8\n\ -dword_8056440: .4byte gUnknown_082165E9\n\ -dword_8056444: .4byte gUnknown_082165EE\n\ -dword_8056448: .4byte gOtherText_MaxSpeed\n\ -off_805644C: .4byte gOtherText_RPM\n\ -dword_8056450: .4byte gOtherText_RequiredTime\n\ -dword_8056454: .4byte gOtherText_Min\n\ -dword_8056458: .4byte gOtherText_Sec\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_805645C: @ jumptable 0805619A case 4\n\ - LDR R0, off_805646C\n\ - LDRH R1, [R0,#0x2E]\n\ - MOVS R0, #1\n\ - ANDS R0, R1\n\ - CMP R0, #0\n\ - BEQ def_805619A @ jumptable 0805619A default case\n\ - LDR R1, [R2]\n\ - B loc_8056520\n\ -@ ---------------------------------------------------------------------------\n\ -off_805646C: .4byte gMain\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_8056470: @ jumptable 0805619A case 5\n\ - BL Menu_EraseScreen\n\ - MOVS R0, #0\n\ - MOVS R1, #0xE\n\ - MOVS R2, #0x1D\n\ - MOVS R3, #0x13\n\ - BL Menu_DrawStdWindowFrame\n\ - MOVS R6, #0\n\ - ADD R1, SP, #0xC\n\ - MOV R8, R1\n\ - ADD R5, SP, #0x28\n\ - LDR R0, off_8056528\n\ - LDR R0, [R0]\n\ - ADDS R3, R0, #0\n\ - ADDS R3, #0x80\n\ - ADD R2, SP, #0x20\n\ -\n\ -loc_8056492:\n\ - LSLS R1, R6, #1\n\ - ADDS R0, R3, R1\n\ - LDRH R0, [R0]\n\ - CMP R0, #0\n\ - BEQ loc_80564A2\n\ - ADDS R1, R2, R1\n\ - SUBS R0, #0x85\n\ - STRH R0, [R1]\n\ -\n\ -loc_80564A2:\n\ - ADDS R0, R6, #1\n\ - LSLS R0, R0, #0x10\n\ - LSRS R6, R0, #0x10\n\ - CMP R6, #3\n\ - BLS loc_8056492\n\ - BL sub_8050760\n\ - LDR R4, off_8056528\n\ - LDR R3, [R4]\n\ - MOVS R2, #0xBE\n\ - LSLS R2, R2, #1\n\ - ADDS R0, R3, R2\n\ - ADDS R1, R3, #0\n\ - ADDS R1, #0x88\n\ - LDRB R2, [R1]\n\ - SUBS R1, #0x2E\n\ - LDRH R1, [R1]\n\ - STR R1, [SP]\n\ - ADDS R1, R5, #0\n\ - ADD R3, SP, #4\n\ - BL Blender_CalculatePokeblock\n\ - LDR R1, [R4]\n\ - ADDS R1, #0xAB\n\ - ADDS R0, R5, #0\n\ - BL Blender_PrintMadePokeblockString\n\ - LDR R0, off_805652C\n\ - MOVS R1, #6\n\ - BL CreateTask\n\ - BL sub_8007E40\n\ - ADDS R1, R0, #0\n\ - MOV R0, R8\n\ - MOVS R2, #0\n\ - MOVS R3, #4\n\ - BL ConvertIntToHexStringN\n\ - LDR R1, dword_8056530\n\ - MOV R0, R8\n\ - BL StringAppend\n\ - LDR R0, [R4]\n\ - ADDS R0, #0xAB\n\ - MOV R1, R8\n\ - BL StringAppend\n\ - LDR R0, [R4]\n\ - ADDS R0, #0xAB\n\ - MOVS R1, #1\n\ - MOVS R2, #0xF\n\ - BL MenuPrintMessage\n\ - LDR R0, off_8056534\n\ - LDRH R0, [R0]\n\ - MOVS R1, #1\n\ - BL RemoveBagItem\n\ - ADDS R0, R5, #0\n\ - BL sub_810CA34\n\ - LDR R1, [R4]\n\ -\n\ -loc_8056520:\n\ - LDRB R0, [R1]\n\ - ADDS R0, #1\n\ - STRB R0, [R1]\n\ - B def_805619A @ jumptable 0805619A default case\n\ -@ ---------------------------------------------------------------------------\n\ -off_8056528: .4byte gBerryBlenderData\n\ -off_805652C: .4byte sub_8052BD0+1\n\ -dword_8056530: .4byte gUnknown_08216249\n\ -off_8056534: .4byte gSpecialVar_ItemId\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -loc_8056538: @ jumptable 0805619A case 6\n\ - BL Menu_UpdateWindowText\n\ - LSLS R0, R0, #0x18\n\ - CMP R0, #0\n\ - BEQ def_805619A @ jumptable 0805619A default case\n\ - BL Blender_TrySettingRecord\n\ - MOVS R0, #1\n\ - B loc_805654C\n\ -@ ---------------------------------------------------------------------------\n\ -\n\ -def_805619A: @ jumptable 0805619A default case\n\ - MOVS R0, #0\n\ -\n\ -loc_805654C:\n\ - ADD SP, SP, #0x34\n\ - POP {R3-R5}\n\ - MOV R8, R3\n\ - MOV R9, R4\n\ - MOV R10, R5\n\ - POP {R4-R7}\n\ - POP {R1}\n\ - BX R1\n\ - .syntax divided\n"); -} -#else bool8 Blender_PrintBlendingResults(void) { u16 i; @@ -3882,6 +3395,11 @@ bool8 Blender_PrintBlendingResults(void) Blender_CalculatePokeblock(gBerryBlenderData->blendedBerries, &pokeblock, gBerryBlenderData->playersNo, flavours, gBerryBlenderData->max_RPM); Blender_PrintMadePokeblockString(&pokeblock, gBerryBlenderData->stringVar); CreateTask(sub_8052BD0, 6); +#if DEBUG + ConvertIntToHexStringN(text[0], sub_8007E40(), 0, 4); + StringAppend(text[0], gUnknown_08216249); + StringAppend(gBerryBlenderData->stringVar, text[0]); +#endif MenuPrintMessage(gBerryBlenderData->stringVar, 1, 15); RemoveBagItem(gSpecialVar_ItemId, 1); sub_810CA34(&pokeblock); @@ -3897,7 +3415,6 @@ bool8 Blender_PrintBlendingResults(void) } return FALSE; } -#endif /*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) { -- cgit v1.2.3 From 641d2749b67b6c7cad2054f5c52c990f0dad0121 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 24 Jan 2018 15:32:04 -0600 Subject: decompile debug_sub_8010818 and debug_sub_80108B8 --- src/battle/battle_2.c | 429 ++++++++++++++++---------------------------------- 1 file changed, 137 insertions(+), 292 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 64b64ecea..f9756db29 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1,5 +1,11 @@ #include "global.h" #include "constants/abilities.h" +#include "constants/battle_move_effects.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/songs.h" +#include "constants/species.h" #include "battle.h" #include "battle_ai.h" #include "battle_interface.h" @@ -7,6 +13,7 @@ #include "battle_setup.h" #include "battle_util.h" #include "data2.h" +#include "decompress.h" #include "event_data.h" #include "evolution_scene.h" #include "item.h" @@ -25,9 +32,7 @@ #include "rom3.h" #include "rom_8077ABC.h" #include "rom_8094928.h" -#include "constants/songs.h" #include "sound.h" -#include "constants/species.h" #include "sprite.h" #include "string_util.h" #include "task.h" @@ -37,10 +42,6 @@ #include "tv.h" #include "scanline_effect.h" #include "util.h" -#include "constants/battle_move_effects.h" -#include "constants/items.h" -#include "constants/hold_effects.h" -#include "constants/moves.h" #include "ewram.h" struct UnknownStruct7 @@ -1362,12 +1363,55 @@ void c2_081284E0(void) // A LOT of debug code! #if DEBUG -extern u8 gBattleBuffersTransferData[]; - void debug_sub_8010818(void); void debug_sub_80108B8(void); +void debug_sub_8010CAC(void); +void debug_sub_801174C(void); +void debug_sub_8011D40(void); void debug_sub_8011EA0(u8); void debug_sub_8012294(void); +void debug_sub_80123D8(u8); +void debug_sub_8012540(void); +void debug_sub_80125A0(void); +void debug_nullsub_3(void); + +struct UnknownStruct2023A76 +{ + u16 unk0; + u16 unk2[(0x44-2)/2]; + s16 unk44; + u16 unk46; + u16 unk48[1]; +}; + +struct UnknownStruct2023B02 +{ + u16 unk0[4][4]; + u8 filler20[0x10]; + u16 unk30[4][4]; +}; + +struct UnknownStruct821F424 +{ + u8 filler0[0x12]; + u16 unk12[1][5]; // unknown length +}; + +extern struct UnknownStruct2023A76 gUnknown_Debug_2023A76; +extern struct UnknownStruct2023B02 gUnknown_Debug_2023B02; +extern u8 gUnknown_Debug_03004360; +extern struct Window gUnknown_Debug_03004370; +extern u8 gUnknown_Debug_030043A0; +extern u8 gUnknown_Debug_030043A4; +extern u8 gUnknown_Debug_030043A8; +extern u8 gBattleBuffersTransferData[]; + +extern const struct UnknownStruct821F424 gUnknown_Debug_821F424; +extern const u16 gUnknown_Debug_821F56C[][5]; + +extern const u8 gUnusedOldCharmap_Gfx_lz[]; +extern const u8 gUnusedOldCharmap_Tilemap_lz[]; +extern const u8 gUnusedOldCharmap_Pal_lz[]; void debug_sub_8010800(void) { @@ -1376,283 +1420,84 @@ void debug_sub_8010800(void) *(u32 *)(gBattleBuffersTransferData + 0x100) = 0; } -__attribute__((naked)) -void debug_sub_8010818() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " ldr r1, ._501\n" - " ldr r0, ._501 + 4\n" - " strh r0, [r1]\n" - " add r2, r1, #0\n" - " add r2, r2, #0x46\n" - " strh r0, [r2]\n" - " ldr r0, ._501 + 8\n" - " add r4, r1, #0\n" - " add r4, r4, #0x48\n" - " add r3, r0, #0\n" - " add r3, r3, #0x12\n" - " add r2, r1, #2\n" - " mov r1, #0x1d\n" - "._498:\n" - " ldrh r0, [r3]\n" - " strh r0, [r2]\n" - " strh r0, [r4]\n" - " add r4, r4, #0x2\n" - " add r3, r3, #0xa\n" - " add r2, r2, #0x2\n" - " sub r1, r1, #0x1\n" - " cmp r1, #0\n" - " bge ._498 @cond_branch\n" - " mov r1, #0x0\n" - " ldr r4, ._501 + 12\n" - " ldr r7, ._501 + 16\n" - " ldr r6, ._501 + 20\n" - " mov r0, #0x30\n" - " add r0, r0, r7\n" - " mov ip, r0\n" - "._500:\n" - " mov r0, #0x0\n" - " strb r0, [r4]\n" - " add r5, r1, #1\n" - " lsl r3, r1, #0x3\n" - "._499:\n" - " ldrb r2, [r4]\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r3\n" - " add r1, r1, r7\n" - " lsl r0, r2, #0x2\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r6\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " ldrb r2, [r4]\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r3\n" - " add r1, r1, ip\n" - " lsl r0, r2, #0x2\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r6\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " ldrb r0, [r4]\n" - " add r0, r0, #0x1\n" - " strb r0, [r4]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x3\n" - " bls ._499 @cond_branch\n" - " add r1, r5, #0\n" - " cmp r1, #0x5\n" - " ble ._500 @cond_branch\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._502:\n" - " .align 2, 0\n" - "._501:\n" - " .word gUnknown_Debug_2023A76\n" - " .word 0x115\n" - " .word gUnknown_Debug_821F424\n" - " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_Debug_2023B02\n" - " .word gUnknown_Debug_821F56C\n" - "\n" - ); -} -__attribute__((naked)) -void debug_sub_80108B8() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " bl m4aSoundVSyncOff\n" - " mov r0, #0x0\n" - " bl SetHBlankCallback\n" - " mov r0, #0x0\n" - " bl SetVBlankCallback\n" - " mov r3, #0x0\n" - " str r3, [sp]\n" - " ldr r2, ._507\n" - " mov r0, sp\n" - " str r0, [r2]\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x13\n" - " str r1, [r2, #0x4]\n" - " ldr r0, ._507 + 4\n" - " str r0, [r2, #0x8]\n" - " ldr r0, [r2, #0x8]\n" - " ldr r2, ._507 + 8\n" - " mov r0, #0x1\n" - " strh r0, [r2]\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x13\n" - " mov r4, #0x9a\n" - " lsl r4, r4, #0x5\n" - " add r0, r4, #0\n" - " strh r0, [r2]\n" - " ldr r0, ._507 + 12\n" - " mov r5, #0x0\n" - " strh r3, [r0]\n" - " ldr r0, ._507 + 16\n" - " strh r3, [r0]\n" - " ldr r0, ._507 + 20\n" - " strh r3, [r0]\n" - " ldr r0, ._507 + 24\n" - " strh r3, [r0]\n" - " ldr r0, ._507 + 28\n" - " strh r3, [r0]\n" - " ldr r0, ._507 + 32\n" - " strh r3, [r0]\n" - " ldr r0, ._507 + 36\n" - " strh r3, [r0]\n" - " ldr r0, ._507 + 40\n" - " strh r3, [r0]\n" - " add r2, r2, #0x8\n" - " ldr r4, ._507 + 44\n" - " add r0, r4, #0\n" - " strh r0, [r2]\n" - " add r2, r2, #0x2\n" - " ldr r4, ._507 + 48\n" - " add r0, r4, #0\n" - " strh r0, [r2]\n" - " ldr r0, ._507 + 52\n" - " strh r3, [r0]\n" - " add r0, r0, #0x4\n" - " strh r3, [r0]\n" - " ldr r0, ._507 + 56\n" - " bl LZDecompressVram\n" - " ldr r0, ._507 + 60\n" - " ldr r1, ._507 + 64\n" - " bl LZDecompressWram\n" - " ldr r4, ._507 + 68\n" - " mov r1, #0xa0\n" - " lsl r1, r1, #0x13\n" - " add r0, r4, #0\n" - " bl LZDecompressVram\n" - " ldr r1, ._507 + 72\n" - " add r0, r4, #0\n" - " bl LZDecompressVram\n" - " bl m4aSoundVSyncOn\n" - " ldr r0, ._507 + 76\n" - " bl SetVBlankCallback\n" - " ldr r0, ._507 + 80\n" - " bl SetMainCallback2\n" - " bl ResetTasks\n" - " bl ResetSpriteData\n" - " bl ScanlineEffect_Stop\n" - " ldr r4, ._507 + 84\n" - " add r0, r4, #0\n" - " bl Text_LoadWindowTemplate\n" - " ldr r0, ._507 + 88\n" - " add r1, r4, #0\n" - " bl Text_InitWindowWithTemplate\n" - " ldr r0, ._507 + 92\n" - " strb r5, [r0]\n" - " ldr r0, ._507 + 96\n" - " strb r5, [r0]\n" - " ldr r0, ._507 + 100\n" - " strb r5, [r0]\n" - " mov r4, #0x0\n" - "._503:\n" - " lsl r0, r4, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x1e\n" - " ble ._503 @cond_branch\n" - " ldr r1, ._507 + 104\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " add r4, r1, #0\n" - "._504:\n" - " bl debug_sub_8012294\n" - " ldrb r0, [r4]\n" - " add r0, r0, #0x1\n" - " strb r0, [r4]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x3\n" - " bls ._504 @cond_branch\n" - " ldr r0, ._507 + 100\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - " bl debug_sub_8012540\n" - " bl debug_nullsub_3\n" - " ldr r1, ._507 + 104\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " bl debug_sub_80125A0\n" - " ldr r0, ._507 + 108\n" - " add r0, r0, #0x44\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0x8\n" - " bne ._505 @cond_branch\n" - " bl debug_sub_801174C\n" - " b ._506\n" - "._508:\n" - " .align 2, 0\n" - "._507:\n" - " .word 0x40000d4\n" - " .word 0x85006000\n" - " .word 0x4000200\n" - " .word gBattle_BG0_X\n" - " .word gBattle_BG0_Y\n" - " .word gBattle_BG1_X\n" - " .word gBattle_BG1_Y\n" - " .word gBattle_BG2_X\n" - " .word gBattle_BG2_Y\n" - " .word gBattle_BG3_X\n" - " .word gBattle_BG3_Y\n" - " .word 0x1f09\n" - " .word 0x4801\n" - " .word 0x4000050\n" - " .word gMonShinyPalette_CircledQuestionMark+0x18\n" - " .word gMonShinyPalette_CircledQuestionMark+0x834\n" - " .word gSharedMem\n" - " .word gMonShinyPalette_CircledQuestionMark+0xa8c\n" - " .word 0x50001e0\n" - " .word debug_sub_8011D40+1\n" - " .word debug_sub_8010CAC+1\n" - " .word gWindowTemplate_81E6C3C\n" - " .word gUnknown_Debug_03004370\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_Debug_2023A76\n" - "._505:\n" - " ldr r0, ._510\n" - " mov r1, #0x0\n" - " mov r4, #0x7\n" - " ldr r2, ._510 + 4\n" - " add r0, r0, r2\n" - "._509:\n" - " strb r1, [r0]\n" - " sub r0, r0, #0x1\n" - " sub r4, r4, #0x1\n" - " cmp r4, #0\n" - " bge ._509 @cond_branch\n" - "._506:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._511:\n" - " .align 2, 0\n" - "._510:\n" - " .word gSharedMem\n" - " .word 0x160bb\n" - "\n" - ); +void debug_sub_8010818(void) +{ + s32 i; + + gUnknown_Debug_2023A76.unk0 = 0x115; + gUnknown_Debug_2023A76.unk46 = 0x115; + for (i = 0; i < 30; i++) + { + gUnknown_Debug_2023A76.unk2[i] = gUnknown_Debug_821F424.unk12[i][0]; + gUnknown_Debug_2023A76.unk48[i] = gUnknown_Debug_821F424.unk12[i][0]; + } + + for (i = 0; i < 6; i++) + { + for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) + { + gUnknown_Debug_2023B02.unk0[i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; + gUnknown_Debug_2023B02.unk30[i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; + } + } +} + +void debug_sub_80108B8(void) +{ + s32 i; + + m4aSoundVSyncOff(); + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE); + REG_IE = 1; + REG_DISPCNT = 0x1340; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + REG_BG0CNT = 0x1F09; + REG_BG1CNT = 0x4801; + REG_BLDCNT = 0; + REG_BLDY = 0; + LZDecompressVram(gUnusedOldCharmap_Gfx_lz, (void *)VRAM); + LZDecompressWram(gUnusedOldCharmap_Tilemap_lz, gSharedMem); + LZDecompressVram(gUnusedOldCharmap_Pal_lz, (void *)PLTT); + LZDecompressVram(gUnusedOldCharmap_Pal_lz, (void *)(PLTT + 0x1E0)); + m4aSoundVSyncOn(); + SetVBlankCallback(debug_sub_8011D40); + SetMainCallback2(debug_sub_8010CAC); + ResetTasks(); + ResetSpriteData(); + ScanlineEffect_Stop(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + Text_InitWindowWithTemplate(&gUnknown_Debug_03004370, &gWindowTemplate_81E6C3C); + gUnknown_Debug_03004360 = 0; + gUnknown_Debug_030043A0 = 0; + gUnknown_Debug_030043A4 = 0; + for (i = 0; i < 31; i++) + debug_sub_8011EA0(i); + for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) + debug_sub_8012294(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + debug_sub_8012540(); + debug_nullsub_3(); + gUnknown_Debug_030043A8 = 0; + debug_sub_80125A0(); + if (gUnknown_Debug_2023A76.unk44 == 8) + { + debug_sub_801174C(); + } + else + { + for (i = 0; i < 8; i++) + gSharedMem[0x160B4 + i] = 0; + } } __attribute__((naked)) @@ -4128,19 +3973,19 @@ void debug_nullsub_45() void debug_sub_8011DD4(void) { REG_BG0CNT = 0x9803; - + REG_BG0HOFS = gBattle_BG0_X; REG_BG0VOFS = gBattle_BG0_Y; - + REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; - + REG_BG2HOFS = gBattle_BG2_X; REG_BG2VOFS = gBattle_BG2_Y; - + REG_BG3HOFS = gBattle_BG3_X; REG_BG3VOFS = gBattle_BG3_Y; - + LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); @@ -4150,7 +3995,7 @@ void debug_sub_8011DD4(void) void debug_sub_8011E5C(void) { s32 i; - + for (i = 0; i < 31; i++) debug_sub_8011EA0(i); } @@ -4160,7 +4005,7 @@ extern u8 gUnknown_Debug_030043A8; void debug_sub_8011E74(void) { u8 r5 = gUnknown_Debug_030043A8; - + for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) debug_sub_8012294(); @@ -4777,7 +4622,7 @@ void debug_sub_8012294() } __attribute__((naked)) -void debug_sub_80123D8() +void debug_sub_80123D8(u8 a) { asm( " push {r4, r5, r6, r7, lr}\n" -- cgit v1.2.3 From c7cd31f56ced799f6bb75ef8357b6d623a0b0de8 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 24 Jan 2018 18:17:43 -0600 Subject: integrate debug AbilityBattleEffects --- src/battle/battle_util.c | 4357 ++-------------------------------------------- 1 file changed, 179 insertions(+), 4178 deletions(-) (limited to 'src') diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c index 620e0690a..faa395a97 100644 --- a/src/battle/battle_util.c +++ b/src/battle/battle_util.c @@ -22,6 +22,8 @@ #include "constants/species.h" #include "constants/weather.h" +extern u8 gUnknown_02023A14_50; + extern const u8* gBattlescriptCurrInstr; extern u8 gActiveBank; extern u8 gBattleBufferB[4][0x200]; @@ -1683,4066 +1685,6 @@ u8 CastformDataTypeChange(u8 bank) return formChange; } -#if DEBUG -__attribute__((naked)) -u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - add sp, sp, #0xffffffd8\n\ - ldr r4, [sp, #0x48]\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - str r0, [sp, #0x4]\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x18\n\ - mov sl, r1\n\ - lsl r2, r2, #0x18\n\ - lsr r6, r2, #0x18\n\ - lsl r3, r3, #0x18\n\ - lsr r3, r3, #0x18\n\ - mov r8, r3\n\ - lsl r4, r4, #0x10\n\ - lsr r4, r4, #0x10\n\ - mov r0, #0x0\n\ - mov r9, r0\n\ - ldr r5, ._718\n\ - ldr r1, ._718 + 4\n\ - ldrb r0, [r5]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc ._715 @cond_branch\n\ - mov r1, sl\n\ - strb r1, [r5]\n\ -._715:\n\ - ldrb r0, [r5]\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._716 @cond_branch\n\ - ldr r1, ._718 + 8\n\ - ldrb r0, [r5]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - mov r0, #0x64\n\ - mul r1, r1, r0\n\ - ldr r0, ._718 + 12\n\ - b ._717\n\ -._719:\n\ - .align 2, 0\n\ -._718:\n\ - .word gBankAttacker\n\ - .word gNoOfAllBanks\n\ - .word gBattlePartyID\n\ - .word gPlayerParty\n\ -._716:\n\ - ldr r1, ._723\n\ - ldrb r0, [r5]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - mov r0, #0x64\n\ - mul r1, r1, r0\n\ - ldr r0, ._723 + 4\n\ -._717:\n\ - add r7, r1, r0\n\ - ldr r5, ._723 + 8\n\ - ldr r1, ._723 + 12\n\ - ldrb r0, [r5]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc ._720 @cond_branch\n\ - mov r2, sl\n\ - strb r2, [r5]\n\ -._720:\n\ - ldrb r0, [r5]\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._721 @cond_branch\n\ - ldr r1, ._723\n\ - ldrb r0, [r5]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - mov r0, #0x64\n\ - mul r1, r1, r0\n\ - ldr r0, ._723 + 16\n\ - b ._722\n\ -._724:\n\ - .align 2, 0\n\ -._723:\n\ - .word gBattlePartyID\n\ - .word gEnemyParty\n\ - .word gBankTarget\n\ - .word gNoOfAllBanks\n\ - .word gPlayerParty\n\ -._721:\n\ - ldr r1, ._729\n\ - ldrb r0, [r5]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - mov r0, #0x64\n\ - mul r1, r1, r0\n\ - ldr r0, ._729 + 4\n\ -._722:\n\ - add r5, r1, r0\n\ - add r0, r7, #0\n\ - mov r1, #0xb\n\ - bl GetMonData\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - str r0, [sp, #0x8]\n\ - add r0, r7, #0\n\ - mov r1, #0x0\n\ - bl GetMonData\n\ - str r0, [sp, #0x10]\n\ - add r0, r5, #0\n\ - mov r1, #0xb\n\ - bl GetMonData\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - str r0, [sp, #0xc]\n\ - add r0, r5, #0\n\ - mov r1, #0x0\n\ - bl GetMonData\n\ - str r0, [sp, #0x14]\n\ - ldr r0, ._729 + 8\n\ - ldrh r1, [r0]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._725 @cond_branch\n\ - bl ._1540\n\ -._725:\n\ - mov r3, r8\n\ - cmp r3, #0\n\ - beq ._727 @cond_branch\n\ - ldr r0, ._729 + 12\n\ - strb r3, [r0]\n\ - mov r8, r0\n\ - b ._728\n\ -._730:\n\ - .align 2, 0\n\ -._729:\n\ - .word gBattlePartyID\n\ - .word gEnemyParty\n\ - .word gBattleTypeFlags\n\ - .word gLastUsedAbility\n\ -._727:\n\ - ldr r2, ._733\n\ - ldr r1, ._733 + 4\n\ - mov r0, #0x58\n\ - mov r5, sl\n\ - mul r5, r5, r0\n\ - add r0, r5, #0\n\ - add r0, r0, r1\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r2]\n\ - mov r8, r2\n\ -._728:\n\ - cmp r4, #0\n\ - beq ._731 @cond_branch\n\ - add r3, r4, #0\n\ - b ._732\n\ -._734:\n\ - .align 2, 0\n\ -._733:\n\ - .word gLastUsedAbility\n\ - .word gBattleMons\n\ -._731:\n\ - ldr r0, ._737\n\ - ldrh r3, [r0]\n\ -._732:\n\ - ldr r1, ._737 + 4\n\ - ldr r2, ._737 + 8\n\ - add r0, r1, r2\n\ - ldrb r0, [r0]\n\ - add r7, r1, #0\n\ - cmp r0, #0\n\ - beq ._735 @cond_branch\n\ - mov r4, #0x3f\n\ - and r4, r4, r0\n\ - b ._736\n\ -._738:\n\ - .align 2, 0\n\ -._737:\n\ - .word gCurrentMove\n\ - .word +0x2000000\n\ - .word 0x1601c\n\ -._735:\n\ - ldr r1, ._741\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r4, [r0, #0x2]\n\ -._736:\n\ - ldr r5, [sp, #0x4]\n\ - cmp r5, #0x13\n\ - bls ._739 @cond_branch\n\ - bl ._1534\n\ -._739:\n\ - lsl r0, r5, #0x2\n\ - ldr r1, ._741 + 4\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._742:\n\ - .align 2, 0\n\ -._741:\n\ - .word gBattleMoves\n\ - .word ._743\n\ -._743:\n\ - .word ._744\n\ - .word ._745\n\ - .word ._746\n\ - .word ._747\n\ - .word ._748\n\ - .word ._749\n\ - .word ._750\n\ - .word ._751\n\ - .word ._752\n\ - .word ._753\n\ - .word ._754\n\ - .word ._755\n\ - .word ._756\n\ - .word ._757\n\ - .word ._758\n\ - .word ._759\n\ - .word ._760\n\ - .word ._761\n\ - .word ._762\n\ - .word ._763\n\ -._744:\n\ - ldr r2, ._774\n\ - ldr r0, ._774 + 4\n\ - ldrb r1, [r2]\n\ - add r5, r0, #0\n\ - ldrb r0, [r5]\n\ - cmp r1, r0\n\ - bcc ._764 @cond_branch\n\ - mov r1, sl\n\ - strb r1, [r2]\n\ -._764:\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - cmp r0, #0x2d\n\ - bne ._765 @cond_branch\n\ - b ._766\n\ -._765:\n\ - cmp r0, #0x2d\n\ - bgt ._767 @cond_branch\n\ - cmp r0, #0xd\n\ - bne ._768 @cond_branch\n\ - b ._788\n\ -._768:\n\ - cmp r0, #0xd\n\ - bgt ._770 @cond_branch\n\ - cmp r0, #0x2\n\ - bne ._771 @cond_branch\n\ - b ._772\n\ -._771:\n\ - bl ._1534\n\ -._775:\n\ - .align 2, 0\n\ -._774:\n\ - .word gBankAttacker\n\ - .word gNoOfAllBanks\n\ -._770:\n\ - cmp r0, #0x16\n\ - bne ._776 @cond_branch\n\ - b ._777\n\ -._776:\n\ - cmp r0, #0x24\n\ - bne ._778 @cond_branch\n\ - b ._779\n\ -._778:\n\ - bl ._1534\n\ -._767:\n\ - cmp r0, #0x46\n\ - bne ._781 @cond_branch\n\ - b ._782\n\ -._781:\n\ - cmp r0, #0x46\n\ - bgt ._783 @cond_branch\n\ - cmp r0, #0x3b\n\ - bne ._784 @cond_branch\n\ - b ._785\n\ -._784:\n\ - bl ._1534\n\ -._783:\n\ - cmp r0, #0x4d\n\ - bne ._787 @cond_branch\n\ - b ._788\n\ -._787:\n\ - cmp r0, #0xff\n\ - beq ._789 @cond_branch\n\ - bl ._1534\n\ -._789:\n\ - bl GetCurrentWeather\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - sub r0, r0, #0x3\n\ - cmp r0, #0xa\n\ - bhi ._814 @cond_branch\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._793\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._794:\n\ - .align 2, 0\n\ -._793:\n\ - .word ._792\n\ -._792:\n\ - .word ._805\n\ - .word ._814\n\ - .word ._805\n\ - .word ._814\n\ - .word ._814\n\ - .word ._800\n\ - .word ._814\n\ - .word ._814\n\ - .word ._814\n\ - .word ._804\n\ - .word ._805\n\ -._805:\n\ - ldr r2, ._808\n\ - ldrh r1, [r2]\n\ - mov r0, #0x7\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._814 @cond_branch\n\ - mov r0, #0x5\n\ - strh r0, [r2]\n\ - ldr r0, ._808 + 4\n\ - ldr r3, ._808 + 8\n\ - add r2, r0, r3\n\ - mov r1, #0xa\n\ - b ._811\n\ -._809:\n\ - .align 2, 0\n\ -._808:\n\ - .word gBattleWeather\n\ - .word +0x2000000\n\ - .word 0x160a4\n\ -._800:\n\ - ldr r3, ._812\n\ - ldrh r1, [r3]\n\ - mov r2, #0x18\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._814 @cond_branch\n\ - strh r2, [r3]\n\ - ldr r0, ._812 + 4\n\ - ldr r3, ._812 + 8\n\ - add r2, r0, r3\n\ - mov r1, #0xc\n\ - b ._811\n\ -._813:\n\ - .align 2, 0\n\ -._812:\n\ - .word gBattleWeather\n\ - .word +0x2000000\n\ - .word 0x160a4\n\ -._804:\n\ - ldr r3, ._818\n\ - ldrh r1, [r3]\n\ - mov r2, #0x60\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._814 @cond_branch\n\ - strh r2, [r3]\n\ - ldr r0, ._818 + 4\n\ - ldr r3, ._818 + 8\n\ - add r2, r0, r3\n\ - mov r1, #0xb\n\ -._811:\n\ - strb r1, [r2]\n\ - ldr r5, ._818 + 12\n\ - add r0, r0, r5\n\ - mov r1, sl\n\ - strb r1, [r0]\n\ - mov r0, r9\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._814:\n\ - mov r2, r9\n\ - cmp r2, #0\n\ - bne ._815 @cond_branch\n\ - bl ._1540\n\ -._815:\n\ - bl GetCurrentWeather\n\ - ldr r1, ._818 + 16\n\ - strb r0, [r1, #0x5]\n\ - ldr r0, ._818 + 20\n\ - bl BattleScriptPushCursorAndCallback\n\ - bl ._1534\n\ -._819:\n\ - .align 2, 0\n\ -._818:\n\ - .word gBattleWeather\n\ - .word +0x2000000\n\ - .word 0x160a4\n\ - .word 0x16003\n\ - .word gBattleCommunication\n\ - .word BattleScript_OverworldWeatherStarts\n\ -._772:\n\ - ldr r2, ._823\n\ - ldrh r1, [r2]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._820 @cond_branch\n\ - bl ._1534\n\ -._820:\n\ - mov r0, #0x5\n\ - strh r0, [r2]\n\ - ldr r0, ._823 + 4\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r0, ._823 + 8\n\ - ldr r3, ._823 + 12\n\ - add r0, r0, r3\n\ - mov r5, sl\n\ - strb r5, [r0]\n\ - bl ._1392\n\ -._824:\n\ - .align 2, 0\n\ -._823:\n\ - .word gBattleWeather\n\ - .word BattleScript_DrizzleActivates\n\ - .word +0x2000000\n\ - .word 0x16003\n\ -._766:\n\ - ldr r2, ._828\n\ - ldrh r1, [r2]\n\ - mov r0, #0x10\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._825 @cond_branch\n\ - bl ._1534\n\ -._825:\n\ - mov r0, #0x18\n\ - strh r0, [r2]\n\ - ldr r0, ._828 + 4\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r0, ._828 + 8\n\ - ldr r1, ._828 + 12\n\ - add r0, r0, r1\n\ - mov r2, sl\n\ - strb r2, [r0]\n\ - bl ._1392\n\ -._829:\n\ - .align 2, 0\n\ -._828:\n\ - .word gBattleWeather\n\ - .word BattleScript_SandstreamActivates\n\ - .word +0x2000000\n\ - .word 0x16003\n\ -._782:\n\ - ldr r2, ._833\n\ - ldrh r1, [r2]\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._830 @cond_branch\n\ - bl ._1534\n\ -._830:\n\ - mov r0, #0x60\n\ - strh r0, [r2]\n\ - ldr r0, ._833 + 4\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r0, ._833 + 8\n\ - ldr r3, ._833 + 12\n\ - add r0, r0, r3\n\ - mov r5, sl\n\ - strb r5, [r0]\n\ - bl ._1392\n\ -._834:\n\ - .align 2, 0\n\ -._833:\n\ - .word gBattleWeather\n\ - .word BattleScript_DroughtActivates\n\ - .word +0x2000000\n\ - .word 0x16003\n\ -._777:\n\ - ldr r0, ._838\n\ - mov r1, sl\n\ - lsl r2, r1, #0x2\n\ - add r1, r2, r1\n\ - lsl r1, r1, #0x2\n\ - add r3, r1, r0\n\ - ldrb r0, [r3]\n\ - lsl r0, r0, #0x1c\n\ - cmp r0, #0\n\ - bge ._835 @cond_branch\n\ - bl ._1534\n\ -._835:\n\ - ldr r1, ._838 + 4\n\ - add r1, r2, r1\n\ - ldr r0, [r1]\n\ - mov r2, #0x80\n\ - lsl r2, r2, #0xc\n\ - orr r0, r0, r2\n\ - str r0, [r1]\n\ - ldrb r0, [r3]\n\ - mov r1, #0x8\n\ - b ._837\n\ -._839:\n\ - .align 2, 0\n\ -._838:\n\ - .word gSpecialStatuses\n\ - .word gStatuses3\n\ -._785:\n\ - mov r0, sl\n\ - bl CastformDataTypeChange\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ - cmp r0, #0\n\ - bne ._840 @cond_branch\n\ - bl ._1540\n\ -._840:\n\ - ldr r0, ._843\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r0, ._843 + 4\n\ - ldr r2, ._843 + 8\n\ - add r1, r0, r2\n\ - mov r3, sl\n\ - strb r3, [r1]\n\ - mov r1, r9\n\ - sub r1, r1, #0x1\n\ - ldr r5, ._843 + 12\n\ - add r0, r0, r5\n\ - strb r1, [r0]\n\ - bl ._1534\n\ -._844:\n\ - .align 2, 0\n\ -._843:\n\ - .word BattleScript_CastformChange\n\ - .word +0x2000000\n\ - .word 0x16003\n\ - .word 0x1609b\n\ -._779:\n\ - ldr r0, ._848\n\ - mov r1, sl\n\ - lsl r2, r1, #0x2\n\ - add r1, r2, r1\n\ - lsl r1, r1, #0x2\n\ - add r3, r1, r0\n\ - ldrb r0, [r3]\n\ - lsl r0, r0, #0x1b\n\ - cmp r0, #0\n\ - bge ._845 @cond_branch\n\ - bl ._1534\n\ -._845:\n\ - ldr r1, ._848 + 4\n\ - add r1, r2, r1\n\ - ldr r0, [r1]\n\ - mov r2, #0x80\n\ - lsl r2, r2, #0xd\n\ - orr r0, r0, r2\n\ - str r0, [r1]\n\ - ldrb r0, [r3]\n\ - mov r1, #0x10\n\ -._837:\n\ - orr r0, r0, r1\n\ - strb r0, [r3]\n\ - bl ._1534\n\ -._849:\n\ - .align 2, 0\n\ -._848:\n\ - .word gSpecialStatuses\n\ - .word gStatuses3\n\ -._788:\n\ - mov r6, #0x0\n\ - ldrb r5, [r5]\n\ - cmp r6, r5\n\ - bcc ._854 @cond_branch\n\ - bl ._1534\n\ -._854:\n\ - add r0, r6, #0\n\ - bl CastformDataTypeChange\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ - cmp r0, #0\n\ - beq ._852 @cond_branch\n\ - bl ._853\n\ -._852:\n\ - add r0, r6, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r6, r0, #0x18\n\ - ldr r0, ._856\n\ - ldrb r0, [r0]\n\ - cmp r6, r0\n\ - bcc ._854 @cond_branch\n\ - bl ._1534\n\ -._857:\n\ - .align 2, 0\n\ -._856:\n\ - .word gNoOfAllBanks\n\ -._745:\n\ - ldr r2, ._865\n\ - mov r0, #0x58\n\ - mov r1, sl\n\ - mul r1, r1, r0\n\ - add r4, r1, r2\n\ - ldrh r0, [r4, #0x28]\n\ - cmp r0, #0\n\ - bne ._858 @cond_branch\n\ - bl ._1534\n\ -._858:\n\ - ldr r0, ._865 + 4\n\ - mov r3, sl\n\ - strb r3, [r0]\n\ - mov r3, r8\n\ - ldrb r5, [r3]\n\ - cmp r5, #0x2c\n\ - beq ._860 @cond_branch\n\ - cmp r5, #0x2c\n\ - bgt ._861 @cond_branch\n\ - cmp r5, #0x3\n\ - bne ._862 @cond_branch\n\ - b ._863\n\ -._862:\n\ - bl ._1534\n\ -._866:\n\ - .align 2, 0\n\ -._865:\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ -._861:\n\ - cmp r5, #0x36\n\ - bne ._867 @cond_branch\n\ - b ._868\n\ -._867:\n\ - cmp r5, #0x3d\n\ - beq ._869 @cond_branch\n\ - bl ._1534\n\ -._860:\n\ - mov r0, #0x0\n\ - str r0, [sp]\n\ - mov r0, #0x13\n\ - mov r1, #0x0\n\ - mov r2, #0xd\n\ - mov r3, #0x0\n\ - bl AbilityBattleEffects\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._871 @cond_branch\n\ - bl ._1534\n\ -._871:\n\ - str r0, [sp]\n\ - mov r0, #0x13\n\ - mov r1, #0x0\n\ - mov r2, #0x4d\n\ - mov r3, #0x0\n\ - bl AbilityBattleEffects\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._873 @cond_branch\n\ - bl ._1534\n\ -._873:\n\ - ldr r0, ._881\n\ - ldrh r1, [r0]\n\ - mov r0, #0x7\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._875 @cond_branch\n\ - bl ._1534\n\ -._875:\n\ - ldrh r0, [r4, #0x2c]\n\ - ldrh r1, [r4, #0x28]\n\ - cmp r0, r1\n\ - bhi ._877 @cond_branch\n\ - bl ._1534\n\ -._877:\n\ - mov r2, r8\n\ - strb r5, [r2]\n\ - ldr r0, ._881 + 4\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r1, ._881 + 8\n\ - ldrh r0, [r4, #0x2c]\n\ - lsr r0, r0, #0x4\n\ - str r0, [r1]\n\ - cmp r0, #0\n\ - bne ._879 @cond_branch\n\ - mov r0, #0x1\n\ - str r0, [r1]\n\ -._879:\n\ - ldr r0, [r1]\n\ - neg r0, r0\n\ - str r0, [r1]\n\ - bl ._1392\n\ -._882:\n\ - .align 2, 0\n\ -._881:\n\ - .word gBattleWeather\n\ - .word BattleScript_RainDishActivates\n\ - .word gBattleMoveDamage\n\ -._869:\n\ - add r0, r2, #0\n\ - add r0, r0, #0x4c\n\ - add r5, r1, r0\n\ - ldrb r0, [r5]\n\ - cmp r0, #0\n\ - bne ._883 @cond_branch\n\ - bl ._1534\n\ -._883:\n\ - bl Random\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - mov r1, #0x3\n\ - bl __umodsi3\n\ - lsl r0, r0, #0x10\n\ - lsr r4, r0, #0x10\n\ - cmp r4, #0\n\ - beq ._885 @cond_branch\n\ - bl ._1534\n\ -._885:\n\ - ldr r0, [r5]\n\ - mov r1, #0x88\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._887 @cond_branch\n\ - ldr r0, ._893\n\ - ldr r1, ._893 + 4\n\ - bl StringCopy\n\ -._887:\n\ - ldr r0, [r5]\n\ - mov r1, #0x7\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._888 @cond_branch\n\ - ldr r0, ._893\n\ - ldr r1, ._893 + 8\n\ - bl StringCopy\n\ -._888:\n\ - ldr r0, [r5]\n\ - mov r1, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._889 @cond_branch\n\ - ldr r0, ._893\n\ - ldr r1, ._893 + 12\n\ - bl StringCopy\n\ -._889:\n\ - ldr r0, [r5]\n\ - mov r1, #0x10\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._890 @cond_branch\n\ - ldr r0, ._893\n\ - ldr r1, ._893 + 16\n\ - bl StringCopy\n\ -._890:\n\ - ldr r0, [r5]\n\ - mov r1, #0x20\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._891 @cond_branch\n\ - ldr r0, ._893\n\ - ldr r1, ._893 + 20\n\ - bl StringCopy\n\ -._891:\n\ - str r4, [r5]\n\ - ldr r0, ._893 + 24\n\ - ldr r4, ._893 + 28\n\ - mov r3, sl\n\ - strb r3, [r4]\n\ - ldr r1, ._893 + 32\n\ - add r0, r0, r1\n\ - strb r3, [r0]\n\ - ldr r0, ._893 + 36\n\ - bl BattleScriptPushCursorAndCallback\n\ - str r5, [sp]\n\ - mov r0, #0x0\n\ - mov r1, #0x28\n\ - mov r2, #0x0\n\ - mov r3, #0x4\n\ - bl EmitSetMonData\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - bl ._1392\n\ -._894:\n\ - .align 2, 0\n\ -._893:\n\ - .word gBattleTextBuff1\n\ - .word gStatusConditionString_PoisonJpn\n\ - .word gStatusConditionString_SleepJpn\n\ - .word gStatusConditionString_ParalysisJpn\n\ - .word gStatusConditionString_BurnJpn\n\ - .word gStatusConditionString_IceJpn\n\ - .word +0x2000000\n\ - .word gActiveBank\n\ - .word 0x16003\n\ - .word BattleScript_ShedSkinActivates\n\ -._863:\n\ - ldrb r2, [r4, #0x1b]\n\ - mov r0, #0x1b\n\ - ldsb r0, [r4, r0]\n\ - cmp r0, #0xb\n\ - ble ._895 @cond_branch\n\ - bl ._1534\n\ -._895:\n\ - ldr r0, ._900\n\ - mov r3, sl\n\ - lsl r1, r3, #0x3\n\ - sub r1, r1, r3\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x16]\n\ - cmp r0, #0x2\n\ - bne ._897 @cond_branch\n\ - bl ._1534\n\ -._897:\n\ - add r0, r2, #1\n\ - mov r2, #0x0\n\ - strb r0, [r4, #0x1b]\n\ - ldr r5, ._900 + 4\n\ - add r1, r7, r5\n\ - mov r0, #0x11\n\ - strb r0, [r1]\n\ - ldr r1, ._900 + 8\n\ - add r0, r7, r1\n\ - strb r2, [r0]\n\ - ldr r0, ._900 + 12\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r2, ._900 + 16\n\ - add r0, r7, r2\n\ - mov r3, sl\n\ - strb r3, [r0]\n\ - bl ._1392\n\ -._901:\n\ - .align 2, 0\n\ -._900:\n\ - .word gDisableStructs\n\ - .word 0x160a4\n\ - .word 0x160a5\n\ - .word BattleScript_SpeedBoostActivates\n\ - .word 0x16003\n\ -._868:\n\ - ldr r2, ._903\n\ - ldrb r0, [r0]\n\ - lsl r1, r0, #0x3\n\ - sub r1, r1, r0\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r2\n\ - ldrb r3, [r1, #0x18]\n\ - lsl r0, r3, #0x1f\n\ - lsr r0, r0, #0x1f\n\ - mov r2, #0x1\n\ - eor r2, r2, r0\n\ - mov r0, #0x2\n\ - neg r0, r0\n\ - and r0, r0, r3\n\ - orr r0, r0, r2\n\ - strb r0, [r1, #0x18]\n\ - bl ._1534\n\ -._904:\n\ - .align 2, 0\n\ -._903:\n\ - .word gDisableStructs\n\ -._746:\n\ - mov r5, r8\n\ - ldrb r0, [r5]\n\ - cmp r0, #0x2b\n\ - beq ._905 @cond_branch\n\ - bl ._1534\n\ -._905:\n\ - mov r4, #0x0\n\ - ldr r0, ._917\n\ - ldrh r2, [r0]\n\ - ldr r5, ._917 + 4\n\ - add r1, r0, #0\n\ - cmp r2, r5\n\ - bne ._907 @cond_branch\n\ - bl ._1534\n\ -._907:\n\ - cmp r2, r3\n\ - beq ._909 @cond_branch\n\ - add r2, r1, #0\n\ -._912:\n\ - add r2, r2, #0x2\n\ - add r4, r4, #0x1\n\ - ldrh r0, [r2]\n\ - cmp r0, r5\n\ - bne ._910 @cond_branch\n\ - bl ._1534\n\ -._910:\n\ - cmp r0, r3\n\ - bne ._912 @cond_branch\n\ -._909:\n\ - lsl r0, r4, #0x1\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - ldr r0, ._917 + 4\n\ - cmp r1, r0\n\ - bne ._913 @cond_branch\n\ - bl ._1534\n\ -._913:\n\ - ldr r1, ._917 + 8\n\ - ldr r0, ._917 + 12\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r1, r1, #0x50\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x5\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._915 @cond_branch\n\ - ldr r0, ._917 + 16\n\ - ldr r1, [r0]\n\ - mov r2, #0x80\n\ - lsl r2, r2, #0x4\n\ - orr r1, r1, r2\n\ - str r1, [r0]\n\ -._915:\n\ - ldr r1, ._917 + 20\n\ - ldr r0, ._917 + 24\n\ - str r0, [r1]\n\ - mov r0, #0x1\n\ - mov r9, r0\n\ - bl ._916\n\ -._918:\n\ - .align 2, 0\n\ -._917:\n\ - .word gSoundMovesTable\n\ - .word 0xffff\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gHitMarker\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_SoundproofProtected\n\ -._747:\n\ - cmp r3, #0\n\ - bne ._919 @cond_branch\n\ - bl ._1534\n\ -._919:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - cmp r0, #0xb\n\ - beq ._921 @cond_branch\n\ - cmp r0, #0xb\n\ - bgt ._922 @cond_branch\n\ - cmp r0, #0xa\n\ - beq ._923 @cond_branch\n\ - b ._956\n\ -._922:\n\ - cmp r0, #0x12\n\ - beq ._925 @cond_branch\n\ - b ._956\n\ -._923:\n\ - cmp r4, #0xd\n\ - beq ._927 @cond_branch\n\ - b ._956\n\ -._927:\n\ - ldr r0, ._933\n\ - lsl r1, r3, #0x1\n\ - add r1, r1, r3\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - cmp r0, #0\n\ - bne ._929 @cond_branch\n\ - b ._956\n\ -._929:\n\ - ldr r1, ._933 + 4\n\ - ldr r0, ._933 + 8\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x4\n\ - add r0, r0, r1\n\ - ldrb r0, [r0, #0x2]\n\ - lsl r0, r0, #0x1c\n\ - cmp r0, #0\n\ - bge ._931 @cond_branch\n\ - ldr r1, ._933 + 12\n\ - ldr r0, ._933 + 16\n\ - b ._932\n\ -._934:\n\ - .align 2, 0\n\ -._933:\n\ - .word gBattleMoves\n\ - .word gProtectStructs\n\ - .word gBankAttacker\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_MoveHPDrain\n\ -._931:\n\ - ldr r1, ._936\n\ - ldr r0, ._936 + 4\n\ -._932:\n\ - str r0, [r1]\n\ - mov r2, #0x1\n\ - b ._935\n\ -._937:\n\ - .align 2, 0\n\ -._936:\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_MoveHPDrain_PPLoss\n\ -._921:\n\ - cmp r4, #0xb\n\ - beq ._938 @cond_branch\n\ - b ._956\n\ -._938:\n\ - ldr r0, ._944\n\ - lsl r1, r3, #0x1\n\ - add r1, r1, r3\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - cmp r0, #0\n\ - bne ._940 @cond_branch\n\ - b ._956\n\ -._940:\n\ - ldr r1, ._944 + 4\n\ - ldr r0, ._944 + 8\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x4\n\ - add r0, r0, r1\n\ - ldrb r0, [r0, #0x2]\n\ - lsl r0, r0, #0x1c\n\ - cmp r0, #0\n\ - bge ._942 @cond_branch\n\ - ldr r1, ._944 + 12\n\ - ldr r0, ._944 + 16\n\ - b ._943\n\ -._945:\n\ - .align 2, 0\n\ -._944:\n\ - .word gBattleMoves\n\ - .word gProtectStructs\n\ - .word gBankAttacker\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_MoveHPDrain\n\ -._942:\n\ - ldr r1, ._947\n\ - ldr r0, ._947 + 4\n\ -._943:\n\ - str r0, [r1]\n\ - mov r3, #0x1\n\ - mov r9, r3\n\ - b ._956\n\ -._948:\n\ - .align 2, 0\n\ -._947:\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_MoveHPDrain_PPLoss\n\ -._925:\n\ - cmp r4, #0xa\n\ - bne ._956 @cond_branch\n\ - ldr r1, ._954\n\ - mov r0, #0x58\n\ - mov r5, sl\n\ - mul r5, r5, r0\n\ - add r0, r5, #0\n\ - add r1, r1, #0x4c\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x20\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._956 @cond_branch\n\ - ldr r2, ._954 + 4\n\ - mov r0, sl\n\ - lsl r1, r0, #0x2\n\ - add r0, r1, r2\n\ - ldr r3, [r0]\n\ - mov r4, #0x1\n\ - and r3, r3, r4\n\ - add r5, r1, #0\n\ - cmp r3, #0\n\ - bne ._951 @cond_branch\n\ - ldr r0, ._954 + 8\n\ - strb r3, [r0, #0x5]\n\ - ldr r1, ._954 + 12\n\ - ldr r0, ._954 + 16\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x4\n\ - add r0, r0, r1\n\ - ldrb r0, [r0, #0x2]\n\ - lsl r0, r0, #0x1c\n\ - cmp r0, #0\n\ - bge ._952 @cond_branch\n\ - ldr r1, ._954 + 20\n\ - ldr r0, ._954 + 24\n\ - b ._953\n\ -._955:\n\ - .align 2, 0\n\ -._954:\n\ - .word gBattleMons\n\ - .word +0x2017100\n\ - .word gBattleCommunication\n\ - .word gProtectStructs\n\ - .word gBankAttacker\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_FlashFireBoost\n\ -._952:\n\ - ldr r1, ._957\n\ - ldr r0, ._957 + 4\n\ -._953:\n\ - str r0, [r1]\n\ - add r0, r5, r2\n\ - ldr r1, [r0]\n\ - mov r2, #0x1\n\ - orr r1, r1, r2\n\ - str r1, [r0]\n\ - mov r1, #0x2\n\ - mov r9, r1\n\ - b ._956\n\ -._958:\n\ - .align 2, 0\n\ -._957:\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_FlashFireBoost_PPLoss\n\ -._951:\n\ - ldr r0, ._961\n\ - strb r4, [r0, #0x5]\n\ - ldr r1, ._961 + 4\n\ - ldr r0, ._961 + 8\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x4\n\ - add r0, r0, r1\n\ - ldrb r0, [r0, #0x2]\n\ - lsl r0, r0, #0x1c\n\ - cmp r0, #0\n\ - bge ._959 @cond_branch\n\ - ldr r1, ._961 + 12\n\ - ldr r0, ._961 + 16\n\ - b ._960\n\ -._962:\n\ - .align 2, 0\n\ -._961:\n\ - .word gBattleCommunication\n\ - .word gProtectStructs\n\ - .word gBankAttacker\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_FlashFireBoost\n\ -._959:\n\ - ldr r1, ._968\n\ - ldr r0, ._968 + 4\n\ -._960:\n\ - str r0, [r1]\n\ - mov r2, #0x2\n\ -._935:\n\ - mov r9, r2\n\ -._956:\n\ - mov r3, r9\n\ - cmp r3, #0x1\n\ - beq ._963 @cond_branch\n\ - bl ._1534\n\ -._963:\n\ - ldr r1, ._968 + 8\n\ - mov r0, #0x58\n\ - mov r5, sl\n\ - mul r5, r5, r0\n\ - add r0, r5, #0\n\ - add r1, r0, r1\n\ - ldrh r0, [r1, #0x2c]\n\ - ldrh r2, [r1, #0x28]\n\ - cmp r0, r2\n\ - bne ._965 @cond_branch\n\ - ldr r1, ._968 + 12\n\ - ldr r0, ._968 + 16\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x4\n\ - add r0, r0, r1\n\ - ldrb r0, [r0, #0x2]\n\ - lsl r0, r0, #0x1c\n\ - cmp r0, #0\n\ - bge ._966 @cond_branch\n\ - ldr r1, ._968\n\ - ldr r0, ._968 + 20\n\ - str r0, [r1]\n\ - bl ._1534\n\ -._969:\n\ - .align 2, 0\n\ -._968:\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_FlashFireBoost_PPLoss\n\ - .word gBattleMons\n\ - .word gProtectStructs\n\ - .word gBankAttacker\n\ - .word BattleScript_MoveHPDrain_FullHP\n\ -._966:\n\ - ldr r1, ._971\n\ - ldr r0, ._971 + 4\n\ - str r0, [r1]\n\ - bl ._1534\n\ -._972:\n\ - .align 2, 0\n\ -._971:\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_MoveHPDrain_FullHP_PPLoss\n\ -._965:\n\ - ldr r2, ._975\n\ - ldrh r0, [r1, #0x2c]\n\ - lsr r0, r0, #0x2\n\ - str r0, [r2]\n\ - cmp r0, #0\n\ - bne ._973 @cond_branch\n\ - mov r3, r9\n\ - str r3, [r2]\n\ -._973:\n\ - ldr r0, [r2]\n\ - neg r0, r0\n\ - str r0, [r2]\n\ - bl ._1534\n\ -._976:\n\ - .align 2, 0\n\ -._975:\n\ - .word gBattleMoveDamage\n\ -._748:\n\ - mov r5, r8\n\ - ldrb r0, [r5]\n\ - sub r0, r0, #0x9\n\ - cmp r0, #0x2f\n\ - bls ._977 @cond_branch\n\ - bl ._1534\n\ -._977:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._980\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._981:\n\ - .align 2, 0\n\ -._980:\n\ - .word ._979\n\ -._979:\n\ - .word ._982\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._989\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._997\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1000\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1011\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1022\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1534\n\ - .word ._1029\n\ -._989:\n\ - ldr r0, ._1046\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1030 @cond_branch\n\ - bl ._1534\n\ -._1030:\n\ - cmp r3, #0xa5\n\ - bne ._1032 @cond_branch\n\ - bl ._1534\n\ -._1032:\n\ - ldr r0, ._1046 + 4\n\ - lsl r1, r3, #0x1\n\ - add r1, r1, r3\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - cmp r0, #0\n\ - bne ._1034 @cond_branch\n\ - bl ._1534\n\ -._1034:\n\ - ldr r2, ._1046 + 8\n\ - ldr r0, ._1046 + 12\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1037 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1037 @cond_branch\n\ - bl ._1534\n\ -._1037:\n\ - ldr r1, ._1046 + 16\n\ - mov r0, #0x58\n\ - mov r2, sl\n\ - mul r2, r2, r0\n\ - add r0, r2, #0\n\ - add r1, r0, r1\n\ - add r3, r1, #0\n\ - add r3, r3, #0x21\n\ - ldrb r0, [r3]\n\ - cmp r0, r4\n\ - bne ._1039 @cond_branch\n\ - bl ._1534\n\ -._1039:\n\ - add r2, r1, #0\n\ - add r2, r2, #0x22\n\ - ldrb r0, [r2]\n\ - cmp r0, r4\n\ - bne ._1041 @cond_branch\n\ - bl ._1534\n\ -._1041:\n\ - ldrh r0, [r1, #0x28]\n\ - cmp r0, #0\n\ - bne ._1043 @cond_branch\n\ - bl ._1534\n\ -._1043:\n\ - strb r4, [r3]\n\ - strb r4, [r2]\n\ - ldr r1, ._1046 + 20\n\ - mov r0, #0xfd\n\ - strb r0, [r1]\n\ - mov r0, #0x3\n\ - strb r0, [r1, #0x1]\n\ - strb r4, [r1, #0x2]\n\ - mov r0, #0xff\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1046 + 24\n\ - ldr r0, ._1046 + 28\n\ - str r0, [r1]\n\ - bl ._1392\n\ -._1047:\n\ - .align 2, 0\n\ -._1046:\n\ - .word gBattleMoveFlags\n\ - .word gBattleMoves\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleMons\n\ - .word gBattleTextBuff1\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ColorChangeActivates\n\ -._997:\n\ - ldr r0, ._1061\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1048 @cond_branch\n\ - bl ._1534\n\ -._1048:\n\ - ldr r1, ._1061 + 4\n\ - ldr r0, ._1061 + 8\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r4, r0, r1\n\ - ldrh r0, [r4, #0x28]\n\ - cmp r0, #0\n\ - bne ._1050 @cond_branch\n\ - bl ._1534\n\ -._1050:\n\ - ldr r0, ._1061 + 12\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1052 @cond_branch\n\ - bl ._1534\n\ -._1052:\n\ - ldr r2, ._1061 + 16\n\ - ldr r0, ._1061 + 20\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1055 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1055 @cond_branch\n\ - bl ._1534\n\ -._1055:\n\ - ldr r1, ._1061 + 24\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r2, #0x1\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1057 @cond_branch\n\ - bl ._1534\n\ -._1057:\n\ - ldr r1, ._1061 + 28\n\ - ldrh r0, [r4, #0x2c]\n\ - lsr r0, r0, #0x4\n\ - str r0, [r1]\n\ - cmp r0, #0\n\ - bne ._1059 @cond_branch\n\ - str r2, [r1]\n\ -._1059:\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1061 + 32\n\ - ldr r0, ._1061 + 36\n\ - str r0, [r1]\n\ - bl ._1392\n\ -._1062:\n\ - .align 2, 0\n\ -._1061:\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleMoves\n\ - .word gBattleMoveDamage\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_RoughSkinActivates\n\ -._1000:\n\ - ldr r0, ._1078\n\ - ldrb r1, [r0]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1063 @cond_branch\n\ - ldr r0, ._1078 + 4\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1064 @cond_branch\n\ - bl ._1534\n\ -._1064:\n\ - ldr r1, ._1078 + 8\n\ - ldr r0, ._1078 + 12\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1066 @cond_branch\n\ - bl ._1534\n\ -._1066:\n\ - ldr r0, ._1078 + 16\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1068 @cond_branch\n\ - bl ._1534\n\ -._1068:\n\ - ldr r2, ._1078 + 20\n\ - ldr r0, ._1078 + 24\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1071 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1071 @cond_branch\n\ - bl ._1534\n\ -._1071:\n\ - ldr r1, ._1078 + 28\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1073 @cond_branch\n\ - bl ._1534\n\ -._1073:\n\ - ldr r5, ._1078 + 32\n\ - mov r4, #0x3\n\ -._1075:\n\ - bl Random\n\ - and r0, r0, r4\n\ - strb r0, [r5, #0x3]\n\ - cmp r0, #0\n\ - beq ._1075 @cond_branch\n\ - ldr r1, ._1078 + 32\n\ - ldrb r0, [r1, #0x3]\n\ - cmp r0, #0x3\n\ - bne ._1076 @cond_branch\n\ - add r0, r0, #0x2\n\ - strb r0, [r1, #0x3]\n\ -._1076:\n\ - ldrb r0, [r1, #0x3]\n\ - add r0, r0, #0x40\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1078 + 36\n\ - ldr r0, ._1078 + 40\n\ - str r0, [r1]\n\ - ldr r2, ._1078 + 44\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl ._1392\n\ -._1079:\n\ - .align 2, 0\n\ -._1078:\n\ - .word gUnknown_02023A14_50\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleMoves\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ApplySecondaryEffect\n\ - .word gHitMarker\n\ -._1063:\n\ - ldr r0, ._1096\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1080 @cond_branch\n\ - bl ._1534\n\ -._1080:\n\ - ldr r1, ._1096 + 4\n\ - ldr r0, ._1096 + 8\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1082 @cond_branch\n\ - bl ._1534\n\ -._1082:\n\ - ldr r0, ._1096 + 12\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1084 @cond_branch\n\ - bl ._1534\n\ -._1084:\n\ - ldr r2, ._1096 + 16\n\ - ldr r0, ._1096 + 20\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1087 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1087 @cond_branch\n\ - bl ._1534\n\ -._1087:\n\ - ldr r1, ._1096 + 24\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1089 @cond_branch\n\ - bl ._1534\n\ -._1089:\n\ - bl Random\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - mov r1, #0xa\n\ - bl __umodsi3\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - beq ._1091 @cond_branch\n\ - bl ._1534\n\ -._1091:\n\ - ldr r5, ._1096 + 28\n\ - mov r4, #0x3\n\ -._1093:\n\ - bl Random\n\ - and r0, r0, r4\n\ - strb r0, [r5, #0x3]\n\ - cmp r0, #0\n\ - beq ._1093 @cond_branch\n\ - ldr r1, ._1096 + 28\n\ - ldrb r0, [r1, #0x3]\n\ - cmp r0, #0x3\n\ - bne ._1094 @cond_branch\n\ - add r0, r0, #0x2\n\ - strb r0, [r1, #0x3]\n\ -._1094:\n\ - ldrb r0, [r1, #0x3]\n\ - add r0, r0, #0x40\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1096 + 32\n\ - ldr r0, ._1096 + 36\n\ - str r0, [r1]\n\ - ldr r2, ._1096 + 40\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl ._1392\n\ -._1097:\n\ - .align 2, 0\n\ -._1096:\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleMoves\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ApplySecondaryEffect\n\ - .word gHitMarker\n\ -._1011:\n\ - ldr r0, ._1111\n\ - ldrb r1, [r0]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1098 @cond_branch\n\ - ldr r0, ._1111 + 4\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1099 @cond_branch\n\ - bl ._1534\n\ -._1099:\n\ - ldr r1, ._1111 + 8\n\ - ldr r0, ._1111 + 12\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1101 @cond_branch\n\ - bl ._1534\n\ -._1101:\n\ - ldr r0, ._1111 + 16\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1103 @cond_branch\n\ - bl ._1534\n\ -._1103:\n\ - ldr r2, ._1111 + 20\n\ - ldr r0, ._1111 + 24\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1106 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1106 @cond_branch\n\ - bl ._1534\n\ -._1106:\n\ - ldr r1, ._1111 + 28\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1108 @cond_branch\n\ - bl ._1534\n\ -._1108:\n\ - ldr r1, ._1111 + 32\n\ - mov r0, #0x42\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1111 + 36\n\ - ldr r0, ._1111 + 40\n\ - str r0, [r1]\n\ - ldr r2, ._1111 + 44\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl ._1392\n\ -._1112:\n\ - .align 2, 0\n\ -._1111:\n\ - .word gUnknown_02023A14_50\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleMoves\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ApplySecondaryEffect\n\ - .word gHitMarker\n\ -._1098:\n\ - ldr r0, ._1127\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1113 @cond_branch\n\ - bl ._1534\n\ -._1113:\n\ - ldr r1, ._1127 + 4\n\ - ldr r0, ._1127 + 8\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1115 @cond_branch\n\ - bl ._1534\n\ -._1115:\n\ - ldr r0, ._1127 + 12\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1117 @cond_branch\n\ - bl ._1534\n\ -._1117:\n\ - ldr r2, ._1127 + 16\n\ - ldr r0, ._1127 + 20\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1120 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1120 @cond_branch\n\ - bl ._1534\n\ -._1120:\n\ - ldr r1, ._1127 + 24\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1122 @cond_branch\n\ - bl ._1534\n\ -._1122:\n\ - bl Random\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - mov r1, #0x3\n\ - bl __umodsi3\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - beq ._1124 @cond_branch\n\ - bl ._1534\n\ -._1124:\n\ - ldr r1, ._1127 + 28\n\ - mov r0, #0x42\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1127 + 32\n\ - ldr r0, ._1127 + 36\n\ - str r0, [r1]\n\ - ldr r2, ._1127 + 40\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl ._1392\n\ -._1128:\n\ - .align 2, 0\n\ -._1127:\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleMoves\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ApplySecondaryEffect\n\ - .word gHitMarker\n\ -._982:\n\ - ldr r0, ._1142\n\ - ldrb r1, [r0]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1129 @cond_branch\n\ - ldr r0, ._1142 + 4\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1130 @cond_branch\n\ - bl ._1534\n\ -._1130:\n\ - ldr r1, ._1142 + 8\n\ - ldr r0, ._1142 + 12\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1132 @cond_branch\n\ - bl ._1534\n\ -._1132:\n\ - ldr r0, ._1142 + 16\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1134 @cond_branch\n\ - bl ._1534\n\ -._1134:\n\ - ldr r2, ._1142 + 20\n\ - ldr r0, ._1142 + 24\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1137 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1137 @cond_branch\n\ - bl ._1534\n\ -._1137:\n\ - ldr r1, ._1142 + 28\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1139 @cond_branch\n\ - bl ._1534\n\ -._1139:\n\ - ldr r1, ._1142 + 32\n\ - mov r0, #0x45\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1142 + 36\n\ - ldr r0, ._1142 + 40\n\ - str r0, [r1]\n\ - ldr r2, ._1142 + 44\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl ._1392\n\ -._1143:\n\ - .align 2, 0\n\ -._1142:\n\ - .word gUnknown_02023A14_50\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleMoves\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ApplySecondaryEffect\n\ - .word gHitMarker\n\ -._1129:\n\ - ldr r0, ._1158\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1144 @cond_branch\n\ - bl ._1534\n\ -._1144:\n\ - ldr r1, ._1158 + 4\n\ - ldr r0, ._1158 + 8\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1146 @cond_branch\n\ - bl ._1534\n\ -._1146:\n\ - ldr r0, ._1158 + 12\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1148 @cond_branch\n\ - bl ._1534\n\ -._1148:\n\ - ldr r2, ._1158 + 16\n\ - ldr r0, ._1158 + 20\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1151 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1151 @cond_branch\n\ - bl ._1534\n\ -._1151:\n\ - ldr r1, ._1158 + 24\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1153 @cond_branch\n\ - bl ._1534\n\ -._1153:\n\ - bl Random\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - mov r1, #0x3\n\ - bl __umodsi3\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - beq ._1155 @cond_branch\n\ - bl ._1534\n\ -._1155:\n\ - ldr r1, ._1158 + 28\n\ - mov r0, #0x45\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1158 + 32\n\ - ldr r0, ._1158 + 36\n\ - str r0, [r1]\n\ - ldr r2, ._1158 + 40\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl ._1392\n\ -._1159:\n\ - .align 2, 0\n\ -._1158:\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleMoves\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ApplySecondaryEffect\n\ - .word gHitMarker\n\ -._1022:\n\ - ldr r0, ._1173\n\ - ldrb r1, [r0]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1160 @cond_branch\n\ - ldr r0, ._1173 + 4\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1161 @cond_branch\n\ - bl ._1534\n\ -._1161:\n\ - ldr r1, ._1173 + 8\n\ - ldr r0, ._1173 + 12\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1163 @cond_branch\n\ - bl ._1534\n\ -._1163:\n\ - ldr r0, ._1173 + 16\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1165 @cond_branch\n\ - bl ._1534\n\ -._1165:\n\ - ldr r1, ._1173 + 20\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1167 @cond_branch\n\ - bl ._1534\n\ -._1167:\n\ - ldr r2, ._1173 + 24\n\ - ldr r0, ._1173 + 28\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1170 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1170 @cond_branch\n\ - bl ._1534\n\ -._1170:\n\ - ldr r1, ._1173 + 32\n\ - mov r0, #0x43\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1173 + 36\n\ - ldr r0, ._1173 + 40\n\ - str r0, [r1]\n\ - ldr r2, ._1173 + 44\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl ._1392\n\ -._1174:\n\ - .align 2, 0\n\ -._1173:\n\ - .word gUnknown_02023A14_50\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gBattleMoves\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ApplySecondaryEffect\n\ - .word gHitMarker\n\ -._1160:\n\ - ldr r0, ._1189\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1175 @cond_branch\n\ - bl ._1534\n\ -._1175:\n\ - ldr r1, ._1189 + 4\n\ - ldr r0, ._1189 + 8\n\ - ldrb r2, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1177 @cond_branch\n\ - bl ._1534\n\ -._1177:\n\ - ldr r0, ._1189 + 12\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1179 @cond_branch\n\ - bl ._1534\n\ -._1179:\n\ - ldr r1, ._1189 + 16\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1181 @cond_branch\n\ - bl ._1534\n\ -._1181:\n\ - ldr r2, ._1189 + 20\n\ - ldr r0, ._1189 + 24\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r1, r0, #0x2\n\ - add r0, r2, #0\n\ - add r0, r0, #0x8\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1184 @cond_branch\n\ - add r0, r2, #0\n\ - add r0, r0, #0xc\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1184 @cond_branch\n\ - bl ._1534\n\ -._1184:\n\ - bl Random\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - mov r1, #0x3\n\ - bl __umodsi3\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - beq ._1186 @cond_branch\n\ - bl ._1534\n\ -._1186:\n\ - ldr r1, ._1189 + 28\n\ - mov r0, #0x43\n\ - strb r0, [r1, #0x3]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1189 + 32\n\ - ldr r0, ._1189 + 36\n\ - str r0, [r1]\n\ - ldr r2, ._1189 + 40\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl ._1392\n\ -._1190:\n\ - .align 2, 0\n\ -._1189:\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gBattleMoves\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_ApplySecondaryEffect\n\ - .word gHitMarker\n\ -._1029:\n\ - ldr r0, ._1217\n\ - ldrb r1, [r0]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1191 @cond_branch\n\ - b ._1192\n\ -._1191:\n\ - ldr r0, ._1217 + 4\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1193 @cond_branch\n\ - bl ._1534\n\ -._1193:\n\ - ldr r5, ._1217 + 8\n\ - ldr r7, ._1217 + 12\n\ - ldrb r1, [r7]\n\ - mov r6, #0x58\n\ - add r0, r1, #0\n\ - mul r0, r0, r6\n\ - add r4, r0, r5\n\ - ldrh r0, [r4, #0x28]\n\ - cmp r0, #0\n\ - bne ._1195 @cond_branch\n\ - bl ._1534\n\ -._1195:\n\ - ldr r0, ._1217 + 16\n\ - lsl r1, r1, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1197 @cond_branch\n\ - bl ._1534\n\ -._1197:\n\ - ldr r1, ._1217 + 20\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1199 @cond_branch\n\ - bl ._1534\n\ -._1199:\n\ - ldr r3, ._1217 + 24\n\ - ldr r0, ._1217 + 28\n\ - mov r8, r0\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r2, r0, #0x2\n\ - add r0, r3, #0\n\ - add r0, r0, #0x8\n\ - add r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1202 @cond_branch\n\ - add r0, r3, #0\n\ - add r0, r0, #0xc\n\ - add r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1202 @cond_branch\n\ - bl ._1534\n\ -._1202:\n\ - add r0, r1, #0\n\ - mul r0, r0, r6\n\ - add r0, r0, r5\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1204 @cond_branch\n\ - bl ._1534\n\ -._1204:\n\ - add r0, r4, #0\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0xc\n\ - bne ._1206 @cond_branch\n\ - bl ._1534\n\ -._1206:\n\ - ldr r0, [sp, #0x8]\n\ - ldr r1, [sp, #0x10]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - add r4, r0, #0\n\ - ldr r0, [sp, #0xc]\n\ - ldr r1, [sp, #0x14]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsl r4, r4, #0x18\n\ - lsl r0, r0, #0x18\n\ - cmp r4, r0\n\ - bne ._1208 @cond_branch\n\ - bl ._1534\n\ -._1208:\n\ - ldrb r0, [r7]\n\ - mul r0, r0, r6\n\ - add r4, r5, #0\n\ - add r4, r4, #0x50\n\ - add r0, r0, r4\n\ - ldr r0, [r0]\n\ - mov r1, #0xf0\n\ - lsl r1, r1, #0xc\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1210 @cond_branch\n\ - bl ._1534\n\ -._1210:\n\ - ldr r0, [sp, #0x8]\n\ - ldr r1, [sp, #0x10]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0xff\n\ - bne ._1212 @cond_branch\n\ - bl ._1534\n\ -._1212:\n\ - ldr r0, [sp, #0xc]\n\ - ldr r1, [sp, #0x14]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0xff\n\ - bne ._1214 @cond_branch\n\ - bl ._1534\n\ -._1214:\n\ - ldrb r0, [r7]\n\ - add r2, r0, #0\n\ - mul r2, r2, r6\n\ - add r2, r2, r4\n\ - ldr r1, ._1217 + 32\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, [r0]\n\ - lsl r1, r1, #0x10\n\ - ldr r0, [r2]\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1217 + 36\n\ - ldr r0, ._1217 + 40\n\ - str r0, [r1]\n\ - bl ._1392\n\ -._1218:\n\ - .align 2, 0\n\ -._1217:\n\ - .word gUnknown_02023A14_50\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gBattleMoves\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBitTable\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_CuteCharmActivates\n\ -._1192:\n\ - ldr r0, ._1245\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1219 @cond_branch\n\ - bl ._1534\n\ -._1219:\n\ - ldr r5, ._1245 + 4\n\ - ldr r7, ._1245 + 8\n\ - ldrb r1, [r7]\n\ - mov r6, #0x58\n\ - add r0, r1, #0\n\ - mul r0, r0, r6\n\ - add r0, r0, r5\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1221 @cond_branch\n\ - bl ._1534\n\ -._1221:\n\ - ldr r0, ._1245 + 12\n\ - lsl r1, r1, #0x4\n\ - add r1, r1, r0\n\ - ldrb r0, [r1, #0x1]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._1223 @cond_branch\n\ - bl ._1534\n\ -._1223:\n\ - ldr r1, ._1245 + 16\n\ - lsl r0, r3, #0x1\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x8]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1225 @cond_branch\n\ - bl ._1534\n\ -._1225:\n\ - ldr r3, ._1245 + 20\n\ - ldr r0, ._1245 + 24\n\ - mov r8, r0\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r2, r0, #0x2\n\ - add r0, r3, #0\n\ - add r0, r0, #0x8\n\ - add r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1228 @cond_branch\n\ - add r0, r3, #0\n\ - add r0, r0, #0xc\n\ - add r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, #0\n\ - bne ._1228 @cond_branch\n\ - bl ._1534\n\ -._1228:\n\ - add r0, r1, #0\n\ - mul r0, r0, r6\n\ - add r0, r0, r5\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - bne ._1230 @cond_branch\n\ - bl ._1534\n\ -._1230:\n\ - bl Random\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - mov r1, #0x3\n\ - bl __umodsi3\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - beq ._1232 @cond_branch\n\ - bl ._1534\n\ -._1232:\n\ - ldrb r0, [r7]\n\ - mul r0, r0, r6\n\ - add r0, r0, r5\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0xc\n\ - bne ._1234 @cond_branch\n\ - bl ._1534\n\ -._1234:\n\ - ldr r0, [sp, #0x8]\n\ - ldr r1, [sp, #0x10]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - add r4, r0, #0\n\ - ldr r0, [sp, #0xc]\n\ - ldr r1, [sp, #0x14]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsl r4, r4, #0x18\n\ - lsl r0, r0, #0x18\n\ - cmp r4, r0\n\ - bne ._1236 @cond_branch\n\ - bl ._1534\n\ -._1236:\n\ - ldrb r0, [r7]\n\ - mul r0, r0, r6\n\ - add r4, r5, #0\n\ - add r4, r4, #0x50\n\ - add r0, r0, r4\n\ - ldr r0, [r0]\n\ - mov r1, #0xf0\n\ - lsl r1, r1, #0xc\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1238 @cond_branch\n\ - bl ._1534\n\ -._1238:\n\ - ldr r0, [sp, #0x8]\n\ - ldr r1, [sp, #0x10]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0xff\n\ - bne ._1240 @cond_branch\n\ - bl ._1534\n\ -._1240:\n\ - ldr r0, [sp, #0xc]\n\ - ldr r1, [sp, #0x14]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0xff\n\ - bne ._1242 @cond_branch\n\ - bl ._1534\n\ -._1242:\n\ - ldrb r0, [r7]\n\ - add r2, r0, #0\n\ - mul r2, r2, r6\n\ - add r2, r2, r4\n\ - ldr r1, ._1245 + 28\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, [r0]\n\ - lsl r1, r1, #0x10\n\ - ldr r0, [r2]\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1245 + 32\n\ - ldr r0, ._1245 + 36\n\ - str r0, [r1]\n\ - bl ._1392\n\ -._1246:\n\ - .align 2, 0\n\ -._1245:\n\ - .word gBattleMoveFlags\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gProtectStructs\n\ - .word gBattleMoves\n\ - .word gSpecialStatuses\n\ - .word gBankTarget\n\ - .word gBitTable\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_CuteCharmActivates\n\ -._749:\n\ - mov r5, #0x0\n\ - mov sl, r5\n\ - ldr r0, ._1251\n\ - ldrb r0, [r0]\n\ - cmp sl, r0\n\ - bcc ._1366 @cond_branch\n\ - bl ._1534\n\ -._1366:\n\ - ldr r1, ._1251 + 4\n\ - mov r0, #0x58\n\ - mov r2, sl\n\ - mul r2, r2, r0\n\ - add r0, r2, #0\n\ - add r0, r0, r1\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - sub r0, r0, #0x7\n\ - add r2, r1, #0\n\ - cmp r0, #0x41\n\ - bls ._1249 @cond_branch\n\ - b ._1346\n\ -._1249:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._1251 + 8\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._1252:\n\ - .align 2, 0\n\ -._1251:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word ._1253\n\ -._1253:\n\ - .word ._1254\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1259\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1319\n\ - .word ._1346\n\ - .word ._1264\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1267\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1287\n\ - .word ._1288\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1346\n\ - .word ._1319\n\ -._1264:\n\ - mov r0, #0x58\n\ - mov r3, sl\n\ - mul r3, r3, r0\n\ - add r0, r3, #0\n\ - add r1, r2, #0\n\ - add r1, r1, #0x4c\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - ldr r1, ._1323\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1320 @cond_branch\n\ - b ._1346\n\ -._1320:\n\ - ldr r0, ._1323 + 4\n\ - ldr r1, ._1323 + 8\n\ - b ._1331\n\ -._1324:\n\ - .align 2, 0\n\ -._1323:\n\ - .word 0xf88\n\ - .word gBattleTextBuff1\n\ - .word gStatusConditionString_PoisonJpn\n\ -._1267:\n\ - mov r0, #0x58\n\ - mov r1, sl\n\ - mul r1, r1, r0\n\ - add r0, r1, #0\n\ - add r1, r2, #0\n\ - add r1, r1, #0x50\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x7\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1325 @cond_branch\n\ - b ._1346\n\ -._1325:\n\ - ldr r0, ._1328\n\ - ldr r1, ._1328 + 4\n\ - bl StringCopy\n\ - mov r2, #0x2\n\ - mov r9, r2\n\ - b ._1343\n\ -._1329:\n\ - .align 2, 0\n\ -._1328:\n\ - .word gBattleTextBuff1\n\ - .word gStatusConditionString_ConfusionJpn\n\ -._1254:\n\ - mov r0, #0x58\n\ - mov r3, sl\n\ - mul r3, r3, r0\n\ - add r0, r3, #0\n\ - add r1, r2, #0\n\ - add r1, r1, #0x4c\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1346 @cond_branch\n\ - ldr r0, ._1332\n\ - ldr r1, ._1332 + 4\n\ - b ._1331\n\ -._1333:\n\ - .align 2, 0\n\ -._1332:\n\ - .word gBattleTextBuff1\n\ - .word gStatusConditionString_ParalysisJpn\n\ -._1319:\n\ - mov r0, #0x58\n\ - mov r3, sl\n\ - mul r3, r3, r0\n\ - add r0, r2, #0\n\ - add r0, r0, #0x4c\n\ - add r0, r3, r0\n\ - ldr r0, [r0]\n\ - mov r1, #0x7\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1346 @cond_branch\n\ - add r2, r2, #0x50\n\ - add r2, r3, r2\n\ - ldr r0, [r2]\n\ - ldr r1, ._1336\n\ - and r0, r0, r1\n\ - str r0, [r2]\n\ - ldr r0, ._1336 + 4\n\ - ldr r1, ._1336 + 8\n\ - bl StringCopy\n\ - mov r0, #0x1\n\ - mov r9, r0\n\ - b ._1343\n\ -._1337:\n\ - .align 2, 0\n\ -._1336:\n\ - .word 0xf7ffffff\n\ - .word gBattleTextBuff1\n\ - .word gStatusConditionString_SleepJpn\n\ -._1288:\n\ - mov r0, #0x58\n\ - mov r1, sl\n\ - mul r1, r1, r0\n\ - add r0, r1, #0\n\ - add r1, r2, #0\n\ - add r1, r1, #0x4c\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x10\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1346 @cond_branch\n\ - ldr r0, ._1340\n\ - ldr r1, ._1340 + 4\n\ - bl StringCopy\n\ - mov r2, #0x1\n\ - mov r9, r2\n\ - b ._1343\n\ -._1341:\n\ - .align 2, 0\n\ -._1340:\n\ - .word gBattleTextBuff1\n\ - .word gStatusConditionString_BurnJpn\n\ -._1287:\n\ - mov r0, #0x58\n\ - mov r3, sl\n\ - mul r3, r3, r0\n\ - add r0, r3, #0\n\ - add r1, r2, #0\n\ - add r1, r1, #0x4c\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x20\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1346 @cond_branch\n\ - ldr r0, ._1344\n\ - ldr r1, ._1344 + 4\n\ -._1331:\n\ - bl StringCopy\n\ - mov r5, #0x1\n\ - mov r9, r5\n\ - b ._1343\n\ -._1345:\n\ - .align 2, 0\n\ -._1344:\n\ - .word gBattleTextBuff1\n\ - .word gStatusConditionString_IceJpn\n\ -._1259:\n\ - mov r0, #0x58\n\ - mov r1, sl\n\ - mul r1, r1, r0\n\ - add r0, r1, #0\n\ - add r1, r2, #0\n\ - add r1, r1, #0x50\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0xf0\n\ - lsl r1, r1, #0xc\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1346 @cond_branch\n\ - ldr r0, ._1352\n\ - ldr r1, ._1352 + 4\n\ - bl StringCopy\n\ - mov r2, #0x3\n\ - mov r9, r2\n\ -._1346:\n\ - mov r3, r9\n\ - cmp r3, #0\n\ - beq ._1347 @cond_branch\n\ -._1343:\n\ - mov r5, r9\n\ - cmp r5, #0x2\n\ - beq ._1348 @cond_branch\n\ - cmp r5, #0x2\n\ - bgt ._1349 @cond_branch\n\ - cmp r5, #0x1\n\ - beq ._1350 @cond_branch\n\ - b ._1355\n\ -._1353:\n\ - .align 2, 0\n\ -._1352:\n\ - .word gBattleTextBuff1\n\ - .word gStatusConditionString_LoveJpn\n\ -._1349:\n\ - mov r0, r9\n\ - cmp r0, #0x3\n\ - beq ._1354 @cond_branch\n\ - b ._1355\n\ -._1350:\n\ - ldr r1, ._1357\n\ - mov r0, #0x58\n\ - mov r2, sl\n\ - mul r2, r2, r0\n\ - add r1, r1, #0x4c\n\ - add r2, r2, r1\n\ - mov r0, #0x0\n\ - b ._1356\n\ -._1358:\n\ - .align 2, 0\n\ -._1357:\n\ - .word gBattleMons\n\ -._1348:\n\ - ldr r1, ._1360\n\ - mov r0, #0x58\n\ - mov r2, sl\n\ - mul r2, r2, r0\n\ - add r1, r1, #0x50\n\ - add r2, r2, r1\n\ - ldr r0, [r2]\n\ - mov r1, #0x8\n\ - neg r1, r1\n\ - b ._1359\n\ -._1361:\n\ - .align 2, 0\n\ -._1360:\n\ - .word gBattleMons\n\ -._1354:\n\ - ldr r1, ._1363\n\ - mov r0, #0x58\n\ - mov r2, sl\n\ - mul r2, r2, r0\n\ - add r1, r1, #0x50\n\ - add r2, r2, r1\n\ - ldr r0, [r2]\n\ - ldr r1, ._1363 + 4\n\ -._1359:\n\ - and r0, r0, r1\n\ -._1356:\n\ - str r0, [r2]\n\ -._1355:\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1363 + 8\n\ - ldr r0, ._1363 + 12\n\ - str r0, [r1]\n\ - ldr r0, ._1363 + 16\n\ - ldr r1, ._1363 + 20\n\ - add r0, r0, r1\n\ - mov r2, sl\n\ - strb r2, [r0]\n\ - ldr r4, ._1363 + 24\n\ - strb r2, [r4]\n\ - ldrb r1, [r4]\n\ - mov r0, #0x58\n\ - mul r0, r0, r1\n\ - ldr r1, ._1363 + 28\n\ - add r0, r0, r1\n\ - str r0, [sp]\n\ - mov r0, #0x0\n\ - mov r1, #0x28\n\ - mov r2, #0x0\n\ - mov r3, #0x4\n\ - bl EmitSetMonData\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - bl ._1540\n\ -._1364:\n\ - .align 2, 0\n\ -._1363:\n\ - .word gBattleMons\n\ - .word 0xfff0ffff\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_AbilityCuredStatus\n\ - .word +0x2000000\n\ - .word 0x16003\n\ - .word gActiveBank\n\ - .word gUnknown_02024ACC\n\ -._1347:\n\ - mov r0, sl\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov sl, r0\n\ - ldr r0, ._1368\n\ - ldrb r0, [r0]\n\ - cmp sl, r0\n\ - bcs ._1365 @cond_branch\n\ - b ._1366\n\ -._1365:\n\ - bl ._1534\n\ -._1369:\n\ - .align 2, 0\n\ -._1368:\n\ - .word gNoOfAllBanks\n\ -._750:\n\ - mov r3, #0x0\n\ - mov sl, r3\n\ - ldr r0, ._1377\n\ - ldrb r0, [r0]\n\ - cmp sl, r0\n\ - bcc ._1370 @cond_branch\n\ - b ._1534\n\ -._1370:\n\ - ldr r4, ._1377 + 4\n\ -._1375:\n\ - mov r0, #0x58\n\ - mov r5, sl\n\ - mul r5, r5, r0\n\ - add r0, r5, #0\n\ - add r0, r0, r4\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x3b\n\ - bne ._1373 @cond_branch\n\ - mov r0, sl\n\ - bl CastformDataTypeChange\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ - cmp r0, #0\n\ - beq ._1373 @cond_branch\n\ - b ._1374\n\ -._1373:\n\ - mov r0, sl\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov sl, r0\n\ - ldr r0, ._1377\n\ - ldrb r0, [r0]\n\ - cmp sl, r0\n\ - bcc ._1375 @cond_branch\n\ - b ._1534\n\ -._1378:\n\ - .align 2, 0\n\ -._1377:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ -._751:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - cmp r0, #0x1c\n\ - beq ._1379 @cond_branch\n\ - b ._1534\n\ -._1379:\n\ - ldr r4, ._1385\n\ - ldr r1, [r4]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x7\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1381 @cond_branch\n\ - b ._1534\n\ -._1381:\n\ - ldr r0, ._1385 + 4\n\ - and r1, r1, r0\n\ - str r1, [r4]\n\ - ldr r3, ._1385 + 8\n\ - add r2, r7, r3\n\ - ldrb r1, [r2]\n\ - mov r0, #0x3f\n\ - and r0, r0, r1\n\ - strb r0, [r2]\n\ - cmp r0, #0x6\n\ - bne ._1383 @cond_branch\n\ - mov r0, #0x2\n\ - strb r0, [r2]\n\ -._1383:\n\ - ldr r1, ._1385 + 12\n\ - ldrb r0, [r2]\n\ - add r0, r0, #0x40\n\ - strb r0, [r1, #0x3]\n\ - ldr r0, ._1385 + 16\n\ - ldrb r1, [r0]\n\ - ldr r5, ._1385 + 20\n\ - add r0, r7, r5\n\ - strb r1, [r0]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1385 + 24\n\ - ldr r0, ._1385 + 28\n\ - str r0, [r1]\n\ - ldr r0, [r4]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r4]\n\ - b ._1392\n\ -._1386:\n\ - .align 2, 0\n\ -._1385:\n\ - .word gHitMarker\n\ - .word 0xffffbfff\n\ - .word 0x160ca\n\ - .word gBattleCommunication\n\ - .word gBankTarget\n\ - .word 0x16003\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_SynchronizeActivates\n\ -._752:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - cmp r0, #0x1c\n\ - beq ._1387 @cond_branch\n\ - b ._1534\n\ -._1387:\n\ - ldr r4, ._1393\n\ - ldr r1, [r4]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x7\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1389 @cond_branch\n\ - b ._1534\n\ -._1389:\n\ - ldr r0, ._1393 + 4\n\ - and r1, r1, r0\n\ - str r1, [r4]\n\ - ldr r3, ._1393 + 8\n\ - add r2, r7, r3\n\ - ldrb r1, [r2]\n\ - mov r0, #0x3f\n\ - and r0, r0, r1\n\ - strb r0, [r2]\n\ - cmp r0, #0x6\n\ - bne ._1391 @cond_branch\n\ - mov r0, #0x2\n\ - strb r0, [r2]\n\ -._1391:\n\ - ldr r1, ._1393 + 12\n\ - ldrb r0, [r2]\n\ - strb r0, [r1, #0x3]\n\ - ldr r0, ._1393 + 16\n\ - ldrb r1, [r0]\n\ - ldr r5, ._1393 + 20\n\ - add r0, r7, r5\n\ - strb r1, [r0]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1393 + 24\n\ - ldr r0, ._1393 + 28\n\ - str r0, [r1]\n\ - ldr r0, [r4]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x6\n\ - orr r0, r0, r1\n\ - str r0, [r4]\n\ - b ._1392\n\ -._1394:\n\ - .align 2, 0\n\ -._1393:\n\ - .word gHitMarker\n\ - .word 0xffffbfff\n\ - .word 0x160ca\n\ - .word gBattleCommunication\n\ - .word gBankAttacker\n\ - .word 0x16003\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_SynchronizeActivates\n\ -._753:\n\ - mov r4, #0x0\n\ - ldr r0, ._1402\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - blt ._1395 @cond_branch\n\ - b ._1534\n\ -._1395:\n\ - ldr r0, ._1402 + 4\n\ - add r5, r1, #0\n\ - ldr r2, ._1402 + 8\n\ - add r3, r0, #0\n\ - add r3, r3, #0x20\n\ - mov r6, #0x80\n\ - lsl r6, r6, #0xc\n\ -._1400:\n\ - ldrb r1, [r3]\n\ - cmp r1, #0x16\n\ - bne ._1398 @cond_branch\n\ - ldr r0, [r2]\n\ - and r0, r0, r6\n\ - cmp r0, #0\n\ - beq ._1398 @cond_branch\n\ - b ._1399\n\ -._1398:\n\ - add r2, r2, #0x4\n\ - add r3, r3, #0x58\n\ - add r4, r4, #0x1\n\ - cmp r4, r5\n\ - blt ._1400 @cond_branch\n\ - b ._1534\n\ -._1403:\n\ - .align 2, 0\n\ -._1402:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word gStatuses3\n\ -._755:\n\ - mov r4, #0x0\n\ - ldr r0, ._1417\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1404 @cond_branch\n\ - b ._1534\n\ -._1404:\n\ - ldr r0, ._1417 + 4\n\ - mov r8, r0\n\ - ldr r1, ._1417 + 8\n\ - add r1, r1, #0x20\n\ - str r1, [sp, #0x1c]\n\ - mov r2, #0x0\n\ - str r2, [sp, #0x20]\n\ -._1434:\n\ - ldr r3, [sp, #0x1c]\n\ - ldrb r0, [r3]\n\ - cmp r0, #0x24\n\ - beq ._1406 @cond_branch\n\ - b ._1431\n\ -._1406:\n\ - ldr r0, ._1417 + 12\n\ - ldr r5, [sp, #0x20]\n\ - add r0, r5, r0\n\ - ldr r1, [r0]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0xd\n\ - and r1, r1, r0\n\ - str r5, [sp, #0x18]\n\ - cmp r1, #0\n\ - bne ._1408 @cond_branch\n\ - b ._1431\n\ -._1408:\n\ - lsl r0, r4, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl GetBankIdentity\n\ - mov r1, #0x1\n\ - add r5, r0, #0\n\ - eor r5, r5, r1\n\ - and r5, r5, r1\n\ - add r0, r5, #0\n\ - bl GetBankByIdentity\n\ - lsl r0, r0, #0x18\n\ - lsr r6, r0, #0x18\n\ - add r0, r5, #2\n\ - bl GetBankByIdentity\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - ldr r0, ._1417 + 16\n\ - ldrh r1, [r0]\n\ - mov r2, #0x1\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1410 @cond_branch\n\ - b ._1411\n\ -._1410:\n\ - mov r1, #0x58\n\ - add r0, r6, #0\n\ - mul r0, r0, r1\n\ - ldr r3, ._1417 + 8\n\ - add r1, r0, r3\n\ - add r0, r1, #0\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._1420 @cond_branch\n\ - ldrh r0, [r1, #0x28]\n\ - cmp r0, #0\n\ - beq ._1415 @cond_branch\n\ - mov r1, #0x58\n\ - add r0, r7, #0\n\ - mul r0, r0, r1\n\ - add r1, r0, r3\n\ - add r0, r1, #0\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._1415 @cond_branch\n\ - ldrh r0, [r1, #0x28]\n\ - cmp r0, #0\n\ - beq ._1415 @cond_branch\n\ - str r2, [sp, #0x24]\n\ - bl Random\n\ - ldr r2, [sp, #0x24]\n\ - add r1, r2, #0\n\ - and r1, r1, r0\n\ - lsl r1, r1, #0x1\n\ - orr r5, r5, r1\n\ - add r0, r5, #0\n\ - bl GetBankByIdentity\n\ - mov r2, r8\n\ - strb r0, [r2]\n\ - ldrb r0, [r2]\n\ - mov r3, #0x58\n\ - mul r0, r0, r3\n\ - ldr r5, ._1417 + 8\n\ - add r0, r0, r5\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - ldr r1, [sp, #0x1c]\n\ - strb r0, [r1]\n\ - ldrb r0, [r2]\n\ - mul r0, r0, r3\n\ - add r0, r0, r5\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - ldr r2, ._1417 + 20\n\ - strb r0, [r2]\n\ - b ._1416\n\ -._1418:\n\ - .align 2, 0\n\ -._1417:\n\ - .word gNoOfAllBanks\n\ - .word gActiveBank\n\ - .word gBattleMons\n\ - .word gStatuses3\n\ - .word gBattleTypeFlags\n\ - .word gLastUsedAbility\n\ -._1415:\n\ - ldr r3, ._1422\n\ - mov r2, #0x58\n\ - add r0, r6, #0\n\ - mul r0, r0, r2\n\ - add r1, r0, r3\n\ - add r0, r1, #0\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._1420 @cond_branch\n\ - ldrh r0, [r1, #0x28]\n\ - cmp r0, #0\n\ - beq ._1420 @cond_branch\n\ - mov r5, r8\n\ - strb r6, [r5]\n\ - add r1, r4, #0\n\ - mul r1, r1, r2\n\ - add r1, r1, r3\n\ - ldrb r0, [r5]\n\ - mul r0, r0, r2\n\ - add r0, r0, r3\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - add r1, r1, #0x20\n\ - strb r0, [r1]\n\ - ldrb r0, [r5]\n\ - mul r0, r0, r2\n\ - add r0, r0, r3\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - b ._1426\n\ -._1423:\n\ - .align 2, 0\n\ -._1422:\n\ - .word gBattleMons\n\ -._1420:\n\ - ldr r3, ._1427\n\ - mov r2, #0x58\n\ - add r0, r7, #0\n\ - mul r0, r0, r2\n\ - add r1, r0, r3\n\ - add r0, r1, #0\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._1430 @cond_branch\n\ - ldrh r0, [r1, #0x28]\n\ - cmp r0, #0\n\ - beq ._1430 @cond_branch\n\ - mov r5, r8\n\ - strb r7, [r5]\n\ - add r1, r4, #0\n\ - mul r1, r1, r2\n\ - add r1, r1, r3\n\ - ldrb r0, [r5]\n\ - mul r0, r0, r2\n\ - add r0, r0, r3\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - add r1, r1, #0x20\n\ - strb r0, [r1]\n\ - ldrb r0, [r5]\n\ - mul r0, r0, r2\n\ - add r0, r0, r3\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - b ._1426\n\ -._1428:\n\ - .align 2, 0\n\ -._1427:\n\ - .word gBattleMons\n\ -._1411:\n\ - mov r2, r8\n\ - strb r6, [r2]\n\ - mov r3, #0x58\n\ - add r0, r6, #0\n\ - mul r0, r0, r3\n\ - ldr r5, ._1436\n\ - add r0, r0, r5\n\ - add r2, r0, #0\n\ - add r2, r2, #0x20\n\ - ldrb r1, [r2]\n\ - cmp r1, #0\n\ - beq ._1430 @cond_branch\n\ - ldrh r0, [r0, #0x28]\n\ - cmp r0, #0\n\ - beq ._1430 @cond_branch\n\ - ldr r0, [sp, #0x1c]\n\ - strb r1, [r0]\n\ - ldrb r0, [r2]\n\ -._1426:\n\ - ldr r1, ._1436 + 4\n\ - strb r0, [r1]\n\ -._1416:\n\ - mov r0, r9\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1430:\n\ - mov r2, r9\n\ - cmp r2, #0\n\ - beq ._1431 @cond_branch\n\ - b ._1432\n\ -._1431:\n\ - ldr r3, [sp, #0x1c]\n\ - add r3, r3, #0x58\n\ - str r3, [sp, #0x1c]\n\ - ldr r5, [sp, #0x20]\n\ - add r5, r5, #0x4\n\ - str r5, [sp, #0x20]\n\ - add r4, r4, #0x1\n\ - ldr r0, ._1436 + 8\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bge ._1433 @cond_branch\n\ - b ._1434\n\ -._1433:\n\ - b ._1534\n\ -._1437:\n\ - .align 2, 0\n\ -._1436:\n\ - .word gBattleMons\n\ - .word gLastUsedAbility\n\ - .word gNoOfAllBanks\n\ -._754:\n\ - mov r4, #0x0\n\ - ldr r0, ._1445\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - blt ._1438 @cond_branch\n\ - b ._1534\n\ -._1438:\n\ - ldr r0, ._1445 + 4\n\ - add r5, r1, #0\n\ - ldr r2, ._1445 + 8\n\ - add r3, r0, #0\n\ - add r3, r3, #0x20\n\ - mov r6, #0x80\n\ - lsl r6, r6, #0xc\n\ -._1443:\n\ - ldrb r1, [r3]\n\ - cmp r1, #0x16\n\ - bne ._1441 @cond_branch\n\ - ldr r0, [r2]\n\ - and r0, r0, r6\n\ - cmp r0, #0\n\ - beq ._1441 @cond_branch\n\ - b ._1442\n\ -._1441:\n\ - add r2, r2, #0x4\n\ - add r3, r3, #0x58\n\ - add r4, r4, #0x1\n\ - cmp r4, r5\n\ - blt ._1443 @cond_branch\n\ - b ._1534\n\ -._1446:\n\ - .align 2, 0\n\ -._1445:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word gStatuses3\n\ -._756:\n\ - mov r0, sl\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r5, r0, #0x18\n\ - mov r4, #0x0\n\ - ldr r0, ._1453\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1447 @cond_branch\n\ - b ._1534\n\ -._1447:\n\ - ldr r7, ._1453 + 4\n\ -._1451:\n\ - lsl r0, r4, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - add r3, r4, #1\n\ - cmp r0, r5\n\ - beq ._1450 @cond_branch\n\ - mov r0, #0x58\n\ - mul r0, r0, r4\n\ - add r0, r0, r7\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, r6\n\ - bne ._1450 @cond_branch\n\ - ldr r0, ._1453 + 8\n\ - strb r6, [r0]\n\ - lsl r0, r3, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1450:\n\ - add r4, r3, #0\n\ - ldr r0, ._1453\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1451 @cond_branch\n\ - b ._1534\n\ -._1454:\n\ - .align 2, 0\n\ -._1453:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word gLastUsedAbility\n\ -._757:\n\ - mov r0, sl\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r5, r0, #0x18\n\ - mov r4, #0x0\n\ - ldr r0, ._1461\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1455 @cond_branch\n\ - b ._1534\n\ -._1455:\n\ - ldr r7, ._1461 + 4\n\ -._1459:\n\ - lsl r0, r4, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - add r3, r4, #1\n\ - cmp r0, r5\n\ - bne ._1458 @cond_branch\n\ - mov r0, #0x58\n\ - mul r0, r0, r4\n\ - add r0, r0, r7\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, r6\n\ - bne ._1458 @cond_branch\n\ - ldr r0, ._1461 + 8\n\ - strb r6, [r0]\n\ - lsl r0, r3, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1458:\n\ - add r4, r3, #0\n\ - ldr r0, ._1461\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1459 @cond_branch\n\ - b ._1534\n\ -._1462:\n\ - .align 2, 0\n\ -._1461:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word gLastUsedAbility\n\ -._758:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - cmp r0, #0xfd\n\ - beq ._1463 @cond_branch\n\ - cmp r0, #0xfe\n\ - beq ._1464 @cond_branch\n\ - mov r4, #0x0\n\ - ldr r0, ._1468\n\ - add r5, r0, #0\n\ - ldrb r2, [r5]\n\ - cmp r4, r2\n\ - blt ._1465 @cond_branch\n\ - b ._1534\n\ -._1465:\n\ - ldr r2, ._1468 + 4\n\ - b ._1485\n\ -._1469:\n\ - .align 2, 0\n\ -._1468:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ -._1463:\n\ - mov r4, #0x0\n\ - ldr r0, ._1475\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1470 @cond_branch\n\ - b ._1534\n\ -._1470:\n\ - ldr r5, ._1475 + 4\n\ - mov r2, #0x80\n\ - lsl r2, r2, #0x9\n\ - add r1, r0, #0\n\ -._1473:\n\ - lsl r0, r4, #0x2\n\ - add r0, r0, r5\n\ - ldr r0, [r0]\n\ - and r0, r0, r2\n\ - add r3, r4, #1\n\ - cmp r0, #0\n\ - beq ._1472 @cond_branch\n\ - lsl r0, r3, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1472:\n\ - add r4, r3, #0\n\ - cmp r4, r1\n\ - blt ._1473 @cond_branch\n\ - b ._1534\n\ -._1476:\n\ - .align 2, 0\n\ -._1475:\n\ - .word gNoOfAllBanks\n\ - .word gStatuses3\n\ -._1464:\n\ - mov r4, #0x0\n\ - ldr r0, ._1482\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1477 @cond_branch\n\ - b ._1534\n\ -._1477:\n\ - ldr r5, ._1482 + 4\n\ - mov r2, #0x80\n\ - lsl r2, r2, #0xa\n\ - add r1, r0, #0\n\ -._1480:\n\ - lsl r0, r4, #0x2\n\ - add r0, r0, r5\n\ - ldr r0, [r0]\n\ - and r0, r0, r2\n\ - add r3, r4, #1\n\ - cmp r0, #0\n\ - beq ._1479 @cond_branch\n\ - lsl r0, r3, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1479:\n\ - add r4, r3, #0\n\ - cmp r4, r1\n\ - blt ._1480 @cond_branch\n\ - b ._1534\n\ -._1483:\n\ - .align 2, 0\n\ -._1482:\n\ - .word gNoOfAllBanks\n\ - .word gStatuses3\n\ -._1485:\n\ - mov r0, #0x58\n\ - mul r0, r0, r4\n\ - add r0, r0, r2\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - add r3, r4, #1\n\ - cmp r0, r6\n\ - bne ._1484 @cond_branch\n\ - mov r0, r8\n\ - strb r6, [r0]\n\ - lsl r0, r3, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1484:\n\ - add r4, r3, #0\n\ - ldrb r1, [r5]\n\ - cmp r4, r1\n\ - blt ._1485 @cond_branch\n\ - b ._1534\n\ -._763:\n\ - mov r4, #0x0\n\ - ldr r0, ._1493\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1487 @cond_branch\n\ - b ._1534\n\ -._1487:\n\ - ldr r7, ._1493 + 4\n\ - add r2, r0, #0\n\ - mov r5, #0x58\n\ -._1491:\n\ - add r0, r4, #0\n\ - mul r0, r0, r5\n\ - add r1, r0, r7\n\ - add r0, r1, #0\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - add r3, r4, #1\n\ - cmp r0, r6\n\ - bne ._1490 @cond_branch\n\ - ldrh r0, [r1, #0x28]\n\ - cmp r0, #0\n\ - beq ._1490 @cond_branch\n\ - mov r0, r8\n\ - strb r6, [r0]\n\ - lsl r0, r3, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1490:\n\ - add r4, r3, #0\n\ - cmp r4, r2\n\ - blt ._1491 @cond_branch\n\ - b ._1534\n\ -._1494:\n\ - .align 2, 0\n\ -._1493:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ -._759:\n\ - mov r4, #0x0\n\ - ldr r0, ._1501\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1495 @cond_branch\n\ - b ._1534\n\ -._1495:\n\ - ldr r7, ._1501 + 4\n\ - add r1, r0, #0\n\ - mov r5, #0x58\n\ - ldr r2, ._1501 + 8\n\ -._1499:\n\ - add r0, r4, #0\n\ - mul r0, r0, r5\n\ - add r0, r0, r7\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - add r3, r4, #1\n\ - cmp r0, r6\n\ - bne ._1498 @cond_branch\n\ - cmp r4, sl\n\ - beq ._1498 @cond_branch\n\ - strb r6, [r2]\n\ - lsl r0, r3, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1498:\n\ - add r4, r3, #0\n\ - cmp r4, r1\n\ - blt ._1499 @cond_branch\n\ - b ._1534\n\ -._1502:\n\ - .align 2, 0\n\ -._1501:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word gLastUsedAbility\n\ -._760:\n\ - mov r0, sl\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r5, r0, #0x18\n\ - mov r4, #0x0\n\ - ldr r0, ._1509\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1503 @cond_branch\n\ - b ._1534\n\ -._1503:\n\ - ldr r7, ._1509 + 4\n\ -._1507:\n\ - lsl r0, r4, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, r5\n\ - beq ._1506 @cond_branch\n\ - mov r0, #0x58\n\ - mul r0, r0, r4\n\ - add r0, r0, r7\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, r6\n\ - bne ._1506 @cond_branch\n\ - ldr r0, ._1509 + 8\n\ - strb r6, [r0]\n\ - mov r0, r9\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1506:\n\ - add r4, r4, #0x1\n\ - ldr r0, ._1509\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1507 @cond_branch\n\ - b ._1534\n\ -._1510:\n\ - .align 2, 0\n\ -._1509:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word gLastUsedAbility\n\ -._761:\n\ - mov r0, sl\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r5, r0, #0x18\n\ - mov r4, #0x0\n\ - ldr r0, ._1517\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1511 @cond_branch\n\ - b ._1534\n\ -._1511:\n\ - ldr r7, ._1517 + 4\n\ -._1515:\n\ - lsl r0, r4, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, r5\n\ - bne ._1514 @cond_branch\n\ - mov r0, #0x58\n\ - mul r0, r0, r4\n\ - add r0, r0, r7\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, r6\n\ - bne ._1514 @cond_branch\n\ - ldr r0, ._1517 + 8\n\ - strb r6, [r0]\n\ - mov r0, r9\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1514:\n\ - add r4, r4, #0x1\n\ - ldr r0, ._1517\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._1515 @cond_branch\n\ - b ._1534\n\ -._1518:\n\ - .align 2, 0\n\ -._1517:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word gLastUsedAbility\n\ -._853:\n\ - ldr r0, ._1520\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r0, ._1520 + 4\n\ - ldr r2, ._1520 + 8\n\ - add r1, r0, r2\n\ - strb r6, [r1]\n\ - mov r1, r9\n\ - sub r1, r1, #0x1\n\ - ldr r3, ._1520 + 12\n\ - add r0, r0, r3\n\ - strb r1, [r0]\n\ - b ._1534\n\ -._1521:\n\ - .align 2, 0\n\ -._1520:\n\ - .word BattleScript_CastformChange\n\ - .word +0x2000000\n\ - .word 0x16003\n\ - .word 0x1609b\n\ -._1374:\n\ - ldr r0, ._1523\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r0, ._1523 + 4\n\ - ldr r5, ._1523 + 8\n\ - add r1, r0, r5\n\ - mov r2, sl\n\ - strb r2, [r1]\n\ - mov r1, r9\n\ - sub r1, r1, #0x1\n\ - ldr r3, ._1523 + 12\n\ - add r0, r0, r3\n\ - strb r1, [r0]\n\ - b ._1540\n\ -._1524:\n\ - .align 2, 0\n\ -._1523:\n\ - .word BattleScript_CastformChange\n\ - .word +0x2000000\n\ - .word 0x16003\n\ - .word 0x1609b\n\ -._1399:\n\ - mov r5, r8\n\ - strb r1, [r5]\n\ - ldr r0, [r2]\n\ - ldr r1, ._1526\n\ - and r0, r0, r1\n\ - str r0, [r2]\n\ - ldr r0, ._1526 + 4\n\ - bl BattleScriptPushCursorAndCallback\n\ - b ._1525\n\ -._1527:\n\ - .align 2, 0\n\ -._1526:\n\ - .word 0xfff7ffff\n\ - .word gUnknown_081D978C\n\ -._1432:\n\ - ldr r0, ._1529\n\ - bl BattleScriptPushCursorAndCallback\n\ - ldr r1, ._1529 + 4\n\ - ldr r2, [sp, #0x18]\n\ - add r1, r2, r1\n\ - ldr r0, [r1]\n\ - ldr r2, ._1529 + 8\n\ - and r0, r0, r2\n\ - str r0, [r1]\n\ - ldr r0, ._1529 + 12\n\ - ldr r3, ._1529 + 16\n\ - add r0, r0, r3\n\ - strb r4, [r0]\n\ - ldr r1, ._1529 + 20\n\ - mov r4, #0xfd\n\ - strb r4, [r1]\n\ - mov r0, #0x4\n\ - strb r0, [r1, #0x1]\n\ - ldr r2, ._1529 + 24\n\ - ldrb r0, [r2]\n\ - strb r0, [r1, #0x2]\n\ - ldr r3, ._1529 + 28\n\ - ldrb r0, [r2]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, r3\n\ - ldrh r0, [r0]\n\ - strb r0, [r1, #0x3]\n\ - mov r0, #0xff\n\ - strb r0, [r1, #0x4]\n\ - ldr r1, ._1529 + 32\n\ - strb r4, [r1]\n\ - mov r0, #0x9\n\ - strb r0, [r1, #0x1]\n\ - ldr r0, ._1529 + 36\n\ - ldrb r0, [r0]\n\ - strb r0, [r1, #0x2]\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - strb r0, [r1, #0x3]\n\ - b ._1534\n\ -._1530:\n\ - .align 2, 0\n\ -._1529:\n\ - .word BattleScript_TraceActivates\n\ - .word gStatuses3\n\ - .word 0xffefffff\n\ - .word +0x2000000\n\ - .word 0x16003\n\ - .word gBattleTextBuff1\n\ - .word gActiveBank\n\ - .word gBattlePartyID\n\ - .word gBattleTextBuff2\n\ - .word gLastUsedAbility\n\ -._1442:\n\ - mov r5, r8\n\ - strb r1, [r5]\n\ - ldr r0, [r2]\n\ - ldr r1, ._1532\n\ - and r0, r0, r1\n\ - str r0, [r2]\n\ - bl BattleScriptPushCursor\n\ - ldr r1, ._1532 + 4\n\ - ldr r0, ._1532 + 8\n\ - str r0, [r1]\n\ -._1525:\n\ - ldr r0, ._1532 + 12\n\ - ldr r1, ._1532 + 16\n\ - add r0, r0, r1\n\ - strb r4, [r0]\n\ -._1392:\n\ - mov r0, r9\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ - b ._1534\n\ -._1533:\n\ - .align 2, 0\n\ -._1532:\n\ - .word 0xfff7ffff\n\ - .word gBattlescriptCurrInstr\n\ - .word gUnknown_081D9795\n\ - .word +0x2000000\n\ - .word 0x160dd\n\ -._762:\n\ - mov r4, #0x0\n\ - ldr r0, ._1541\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - bge ._1534 @cond_branch\n\ - ldr r0, ._1541 + 4\n\ - add r2, r1, #0\n\ - add r1, r0, #0\n\ - add r1, r1, #0x20\n\ - ldr r3, ._1541 + 8\n\ -._1537:\n\ - ldrb r0, [r1]\n\ - cmp r0, r6\n\ - bne ._1536 @cond_branch\n\ - cmp r4, sl\n\ - beq ._1536 @cond_branch\n\ - strb r6, [r3]\n\ - mov r0, r9\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r9, r0\n\ -._1536:\n\ - add r1, r1, #0x58\n\ - add r4, r4, #0x1\n\ - cmp r4, r2\n\ - blt ._1537 @cond_branch\n\ -._1534:\n\ - mov r2, r9\n\ - cmp r2, #0\n\ - beq ._1540 @cond_branch\n\ -._916:\n\ - ldr r3, [sp, #0x4]\n\ - cmp r3, #0xb\n\ - bhi ._1540 @cond_branch\n\ - ldr r1, ._1541 + 8\n\ - ldrb r0, [r1]\n\ - cmp r0, #0xff\n\ - beq ._1540 @cond_branch\n\ - add r1, r0, #0\n\ - mov r0, sl\n\ - bl RecordAbilityBattle\n\ -._1540:\n\ - mov r0, r9\n\ - add sp, sp, #0x28\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r1}\n\ - bx r1\n\ -._1542:\n\ - .align 2, 0\n\ -._1541:\n\ - .word gNoOfAllBanks\n\ - .word gBattleMons\n\ - .word gLastUsedAbility"); -} -#else u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) { u8 effect = 0; @@ -5796,17 +1738,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) else moveType = gBattleMoves[move].type; - //_080184AC switch (caseID) { case ABILITYEFFECT_ON_SWITCHIN: // 0 - //_08018518 if (gBankAttacker >= gNoOfAllBanks) gBankAttacker = bank; switch (gLastUsedAbility) { case 0xFF: //weather from overworld - //_08018586 switch (GetCurrentWeather()) { case WEATHER_RAIN_LIGHT: @@ -5846,7 +1785,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_DRIZZLE: - //_08018680 if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) { gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); @@ -5856,7 +1794,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_SAND_STREAM: - //_080186B8 if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT)) { gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); @@ -5866,7 +1803,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_DROUGHT: - //_080186F0 if (!(gBattleWeather & WEATHER_SUN_PERMANENT)) { gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); @@ -5876,7 +1812,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_INTIMIDATE: - //_08018728 if (!(gSpecialStatuses[bank].intimidatedPoke)) { gStatuses3[bank] |= STATUS3_INTIMIDATE_POKES; @@ -5884,7 +1819,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_FORECAST: - //_0801875C effect = CastformDataTypeChange(bank); if (effect != 0) { @@ -5894,7 +1828,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_TRACE: - //_080187A0 if (!(gSpecialStatuses[bank].traced)) { gStatuses3[bank] |= STATUS3_TRACE; @@ -5903,7 +1836,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) break; case ABILITY_CLOUD_NINE: case ABILITY_AIR_LOCK: - //_080187DC { // that's a weird choice for a variable, why not use i or bank? for (target1 = 0; target1 < gNoOfAllBanks; target1++) @@ -5922,7 +1854,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_ENDTURN: // 1 - //_08018814 if (gBattleMons[bank].hp != 0) { gBankAttacker = bank; @@ -5982,7 +1913,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 - //_08018A40 if (gLastUsedAbility == ABILITY_SOUNDPROOF) { for (i = 0; gSoundMovesTable[i] != 0xFFFF; i++) @@ -6000,7 +1930,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_ABSORBING: // 3 - //_08018AD8 if (move) { switch (gLastUsedAbility) @@ -6070,11 +1999,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CONTACT: // 4 - //_08018CF0 switch (gLastUsedAbility) { case ABILITY_COLOR_CHANGE: - //_08018DCC if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && move != MOVE_STRUGGLE && gBattleMoves[move].power != 0 @@ -6095,7 +2022,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_ROUGH_SKIN: - //_08018E94 if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) && gBattleMons[gBankAttacker].hp != 0 && !gProtectStructs[gBankAttacker].confusionSelfDmg @@ -6111,100 +2037,195 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITY_EFFECT_SPORE: - //_08018F54 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 10) == 0) - { - do - { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; - } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); - if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) - gBattleCommunication[MOVE_EFFECT_BYTE] += 2; - gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + do + { + gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; + } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); + if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) + gBattleCommunication[MOVE_EFFECT_BYTE] += 2; + gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 10) == 0) + { + do + { + gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; + } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); + if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3) + gBattleCommunication[MOVE_EFFECT_BYTE] += 2; + gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } break; case ABILITY_POISON_POINT: - //_0801904C - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } break; case ABILITY_STATIC: - //_08019128 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } break; case ABILITY_FLAME_BODY: - //_08019204 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && (Random() % 3) == 0) + { + gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } break; case ABILITY_CUTE_CHARM: - //_080192E0 - if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) - && gBattleMons[gBankAttacker].hp != 0 - && !gProtectStructs[gBankAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) - && gBattleMons[gBankTarget].hp != 0 - && (Random() % 3) == 0 - && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) - && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF - && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) - { - gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; - effect++; - } + if (DEBUG && (gUnknown_02023A14_50 & 4)) + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && gBattleMons[gBankTarget].hp != 0 + && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) + && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF + && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) + { + gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; + effect++; + } + } + else + { + if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) + && gBattleMons[gBankAttacker].hp != 0 + && !gProtectStructs[gBankAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special) + && gBattleMons[gBankTarget].hp != 0 + && (Random() % 3) == 0 + && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) + && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF + && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF) + { + gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; + effect++; + } + } break; } break; case ABILITYEFFECT_IMMUNITY: // 5 - //_08019448 { for (bank = 0; bank < gNoOfAllBanks; bank++) { @@ -6288,7 +2309,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_FORECAST: // 6 - //_080197B4 { for (bank = 0; bank < gNoOfAllBanks; bank++) { @@ -6307,7 +2327,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_SYNCHRONIZE: // 7 - //_08019804 if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); @@ -6323,7 +2342,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 - //_08019880 if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); @@ -6339,7 +2357,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_INTIMIDATE1: // 9 - //_080198FC for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) @@ -6354,7 +2371,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_TRACE: // 11 - //_08019940 for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) @@ -6368,7 +2384,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) { - //_080199AE gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | side); gBattleMons[i].ability = gBattleMons[gActiveBank].ability; gLastUsedAbility = gBattleMons[gActiveBank].ability; @@ -6376,7 +2391,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) { - //_08019A34 gActiveBank = target1; gBattleMons[i].ability = gBattleMons[gActiveBank].ability; gLastUsedAbility = gBattleMons[gActiveBank].ability; @@ -6384,7 +2398,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) { - //_08019A78 gActiveBank = target2; gBattleMons[i].ability = gBattleMons[gActiveBank].ability; gLastUsedAbility = gBattleMons[gActiveBank].ability; @@ -6392,7 +2405,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } } else - //_08019ABC { gActiveBank = target1; if (gBattleMons[target1].ability && gBattleMons[target1].hp) @@ -6424,7 +2436,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_INTIMIDATE2: // 10 - //_08019B1C for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) @@ -6440,7 +2451,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12 - //_08019B60 side = GetBankSide(bank); for (i = 0; i < gNoOfAllBanks; i++) { @@ -6452,7 +2462,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CHECK_BANK_SIDE: // 13 - //_08019BBC side = GetBankSide(bank); for (i = 0; i < gNoOfAllBanks; i++) { @@ -6464,7 +2473,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_FIELD_SPORT: // 14 - //_08019C18 switch (gLastUsedAbility) { case 0xFD: @@ -6494,7 +2502,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CHECK_ON_FIELD: // 19 - //_08019CD4 for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0) @@ -6505,7 +2512,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK: // 15 - //_08019D18 for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ability && i != bank) @@ -6516,7 +2522,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_COUNT_OTHER_SIZE: // 16 - //_08019D5C side = GetBankSide(bank); for (i = 0; i < gNoOfAllBanks; i++) { @@ -6528,7 +2533,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_COUNT_BANK_SIDE: // 17 - //_08019DB8 side = GetBankSide(bank); for (i = 0; i < gNoOfAllBanks; i++) { @@ -6540,7 +2544,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; case ABILITYEFFECT_COUNT_ON_FIELD: // 18 - //_08019F44 for (i = 0; i < gNoOfAllBanks; i++) { if (gBattleMons[i].ability == ability && i != bank) @@ -6551,14 +2554,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) } break; } - //_08019F76 if (effect && caseID < 0xC && gLastUsedAbility != 0xFF) RecordAbilityBattle(bank, gLastUsedAbility); } return effect; } -#endif void BattleScriptExecute(const u8* BS_ptr) { -- cgit v1.2.3 From 94c9998804e9da20edf5e7285603c3e03b07e3c5 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 24 Jan 2018 18:58:29 -0600 Subject: integrate debug IsMonDisobedient --- src/battle/battle_util.c | 440 ++--------------------------------------------- 1 file changed, 18 insertions(+), 422 deletions(-) (limited to 'src') diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c index faa395a97..194a002d3 100644 --- a/src/battle/battle_util.c +++ b/src/battle/battle_util.c @@ -3439,417 +3439,6 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target return targetBank; } -#if DEBUG -__attribute__((naked)) -u8 IsMonDisobedient(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6, r7}\n\ - add sp, sp, #0xfffffff0\n\ - ldr r0, ._1785\n\ - ldrh r1, [r0]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1791 @cond_branch\n\ - ldr r4, ._1785 + 4\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - beq ._1791 @cond_branch\n\ - ldr r2, ._1785 + 8\n\ - ldrb r1, [r4]\n\ - mov r0, #0x58\n\ - mul r1, r1, r0\n\ - add r0, r2, #0\n\ - add r0, r0, #0x54\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - add r2, r2, #0x3c\n\ - add r1, r1, r2\n\ - bl IsOtherTrainer\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1791 @cond_branch\n\ - ldr r0, ._1785 + 12\n\ - ldrb r1, [r0]\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1783 @cond_branch\n\ - mov r0, #0xa\n\ - b ._1784\n\ -._1786:\n\ - .align 2, 0\n\ -._1785:\n\ - .word gBattleTypeFlags\n\ - .word gBankAttacker\n\ - .word gBattleMons\n\ - .word gUnknown_02023A14_50\n\ -._1783:\n\ - ldr r0, ._1794\n\ - bl FlagGet\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1791 @cond_branch\n\ - mov r1, #0xa\n\ - mov r8, r1\n\ - ldr r0, ._1794 + 4\n\ - bl FlagGet\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1788 @cond_branch\n\ - mov r2, #0x1e\n\ - mov r8, r2\n\ -._1788:\n\ - ldr r0, ._1794 + 8\n\ - bl FlagGet\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1789 @cond_branch\n\ - mov r4, #0x32\n\ - mov r8, r4\n\ -._1789:\n\ - ldr r0, ._1794 + 12\n\ - bl FlagGet\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1790 @cond_branch\n\ - mov r0, #0x46\n\ -._1784:\n\ - mov r8, r0\n\ -._1790:\n\ - ldr r5, ._1794 + 16\n\ - ldr r7, ._1794 + 20\n\ - ldrb r0, [r7]\n\ - mov r6, #0x58\n\ - mul r0, r0, r6\n\ - add r0, r0, r5\n\ - add r0, r0, #0x2a\n\ - ldrb r0, [r0]\n\ - cmp r0, r8\n\ - bls ._1791 @cond_branch\n\ - bl Random\n\ - mov r1, #0xff\n\ - and r1, r1, r0\n\ - ldrb r0, [r7]\n\ - add r2, r0, #0\n\ - mul r2, r2, r6\n\ - add r0, r2, r5\n\ - add r0, r0, #0x2a\n\ - ldrb r0, [r0]\n\ - add r0, r0, r8\n\ - mul r0, r0, r1\n\ - asr r4, r0, #0x8\n\ - cmp r4, r8\n\ - bge ._1792 @cond_branch\n\ -._1791:\n\ - mov r0, #0x0\n\ - b ._1823\n\ -._1795:\n\ - .align 2, 0\n\ -._1794:\n\ - .word 0x80e\n\ - .word 0x808\n\ - .word 0x80a\n\ - .word 0x80c\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ -._1792:\n\ - ldr r3, ._1801\n\ - ldrh r0, [r3]\n\ - cmp r0, #0x63\n\ - bne ._1796 @cond_branch\n\ - add r0, r5, #0\n\ - add r0, r0, #0x50\n\ - add r0, r2, r0\n\ - ldr r1, [r0]\n\ - ldr r2, ._1801 + 4\n\ - and r1, r1, r2\n\ - str r1, [r0]\n\ -._1796:\n\ - ldrb r0, [r7]\n\ - mul r0, r0, r6\n\ - add r1, r5, #0\n\ - add r1, r1, #0x4c\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x7\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1799 @cond_branch\n\ - ldrh r0, [r3]\n\ - cmp r0, #0xad\n\ - beq ._1798 @cond_branch\n\ - cmp r0, #0xd6\n\ - bne ._1799 @cond_branch\n\ -._1798:\n\ - ldr r1, ._1801 + 8\n\ - ldr r0, ._1801 + 12\n\ - b ._1819\n\ -._1802:\n\ - .align 2, 0\n\ -._1801:\n\ - .word gCurrentMove\n\ - .word 0xff7fffff\n\ - .word gBattlescriptCurrInstr\n\ - .word gUnknown_081D995F\n\ -._1799:\n\ - bl Random\n\ - mov r5, #0xff\n\ - add r1, r5, #0\n\ - and r1, r1, r0\n\ - ldr r6, ._1808\n\ - ldr r2, ._1808 + 4\n\ - mov r9, r2\n\ - ldrb r3, [r2]\n\ - mov r7, #0x58\n\ - add r0, r3, #0\n\ - mul r0, r0, r7\n\ - add r0, r0, r6\n\ - add r0, r0, #0x2a\n\ - ldrb r2, [r0]\n\ - mov r4, r8\n\ - add r0, r2, r4\n\ - mul r0, r0, r1\n\ - asr r4, r0, #0x8\n\ - cmp r4, r8\n\ - bge ._1803 @cond_branch\n\ - ldr r7, ._1808 + 8\n\ - ldr r5, ._1808 + 12\n\ - ldrb r0, [r5]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r7\n\ - ldrb r1, [r0]\n\ - add r0, r3, #0\n\ - mov r2, #0xff\n\ - bl CheckMoveLimitations\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - cmp r4, #0xf\n\ - bne ._1804 @cond_branch\n\ - b ._1805\n\ -._1804:\n\ - add r6, r5, #0\n\ - ldr r0, ._1808 + 16\n\ - mov r9, r0\n\ - mov r1, #0x3\n\ - mov r8, r1\n\ -._1806:\n\ - bl Random\n\ - mov r2, r8\n\ - and r0, r0, r2\n\ - mov r1, r9\n\ - strb r0, [r1]\n\ - strb r0, [r6]\n\ - ldrb r0, [r6]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r7\n\ - ldr r5, [r0]\n\ - and r5, r5, r4\n\ - cmp r5, #0\n\ - bne ._1806 @cond_branch\n\ - ldr r4, ._1808 + 20\n\ - ldr r3, ._1808\n\ - ldr r0, ._1808 + 12\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x1\n\ - ldr r1, ._1808 + 4\n\ - ldrb r2, [r1]\n\ - mov r1, #0x58\n\ - mul r1, r1, r2\n\ - add r0, r0, r1\n\ - add r3, r3, #0xc\n\ - add r0, r0, r3\n\ - ldrh r0, [r0]\n\ - strh r0, [r4]\n\ - ldr r0, ._1808 + 24\n\ - strb r5, [r0, #0x3]\n\ - ldr r0, ._1808 + 28\n\ - mov r1, #0x0\n\ - strh r5, [r0]\n\ - ldr r0, ._1808 + 32\n\ - ldr r2, ._1808 + 36\n\ - add r0, r0, r2\n\ - strb r1, [r0]\n\ - ldr r1, ._1808 + 40\n\ - ldr r0, ._1808 + 44\n\ - str r0, [r1]\n\ - ldrh r0, [r4]\n\ - mov r1, #0x0\n\ - bl GetMoveTarget\n\ - ldr r1, ._1808 + 48\n\ - strb r0, [r1]\n\ - ldr r2, ._1808 + 52\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0xe\n\ - b ._1807\n\ -._1809:\n\ - .align 2, 0\n\ -._1808:\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gBitTable\n\ - .word gCurrMovePos\n\ - .word gUnknown_02024BE5\n\ - .word gRandomMove\n\ - .word gBattleCommunication\n\ - .word gDynamicBasePower\n\ - .word +0x2000000\n\ - .word 0x1601c\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_IgnoresAndUsesRandomMove\n\ - .word gBankTarget\n\ - .word gHitMarker\n\ -._1803:\n\ - mov r4, r8\n\ - sub r0, r2, r4\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r8, r0\n\ - bl Random\n\ - add r4, r5, #0\n\ - and r4, r4, r0\n\ - cmp r4, r8\n\ - bge ._1818 @cond_branch\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - add r1, r0, #0\n\ - mul r1, r1, r7\n\ - add r0, r6, #0\n\ - add r0, r0, #0x4c\n\ - add r0, r1, r0\n\ - ldr r0, [r0]\n\ - and r0, r0, r5\n\ - cmp r0, #0\n\ - bne ._1818 @cond_branch\n\ - add r0, r1, r6\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x48\n\ - beq ._1818 @cond_branch\n\ - cmp r0, #0xf\n\ - beq ._1818 @cond_branch\n\ - mov r2, #0x0\n\ - ldr r0, ._1820\n\ - ldrb r3, [r0]\n\ - add r7, r0, #0\n\ - cmp r2, r3\n\ - bge ._1816 @cond_branch\n\ - ldr r0, [r6, #0x50]\n\ - mov r1, #0x70\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1816 @cond_branch\n\ - add r1, r6, #0\n\ - add r1, r1, #0x50\n\ - mov r5, #0x70\n\ -._1817:\n\ - add r1, r1, #0x58\n\ - add r2, r2, #0x1\n\ - cmp r2, r3\n\ - bge ._1816 @cond_branch\n\ - ldr r0, [r1]\n\ - and r0, r0, r5\n\ - cmp r0, #0\n\ - beq ._1817 @cond_branch\n\ -._1816:\n\ - ldrb r7, [r7]\n\ - cmp r2, r7\n\ - bne ._1818 @cond_branch\n\ - ldr r1, ._1820 + 4\n\ - ldr r0, ._1820 + 8\n\ - b ._1819\n\ -._1821:\n\ - .align 2, 0\n\ -._1820:\n\ - .word gNoOfAllBanks\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_IgnoresAndFallsAsleep\n\ -._1818:\n\ - mov r2, r8\n\ - sub r4, r4, r2\n\ - cmp r4, r8\n\ - blt ._1822 @cond_branch\n\ -._1805:\n\ - bl Random\n\ - ldr r2, ._1824\n\ - mov r1, #0x3\n\ - and r1, r1, r0\n\ - strb r1, [r2, #0x5]\n\ - ldr r1, ._1824 + 4\n\ - ldr r0, ._1824 + 8\n\ -._1819:\n\ - str r0, [r1]\n\ - mov r0, #0x1\n\ - b ._1823\n\ -._1825:\n\ - .align 2, 0\n\ -._1824:\n\ - .word gBattleCommunication\n\ - .word gBattlescriptCurrInstr\n\ - .word BattleScript_MoveUsedLoafingAround\n\ -._1822:\n\ - ldr r4, ._1826\n\ - ldrb r1, [r4]\n\ - mov r0, #0x58\n\ - mul r1, r1, r0\n\ - ldr r0, ._1826 + 4\n\ - add r1, r1, r0\n\ - mov r0, #0x28\n\ - str r0, [sp]\n\ - mov r0, #0x0\n\ - str r0, [sp, #0x4]\n\ - ldrb r0, [r4]\n\ - str r0, [sp, #0x8]\n\ - ldrb r0, [r4]\n\ - str r0, [sp, #0xc]\n\ - add r0, r1, #0\n\ - mov r2, #0x1\n\ - mov r3, #0x0\n\ - bl CalculateBaseDamage\n\ - ldr r1, ._1826 + 8\n\ - str r0, [r1]\n\ - ldr r1, ._1826 + 12\n\ - ldrb r0, [r4]\n\ - strb r0, [r1]\n\ - ldr r1, ._1826 + 16\n\ - ldr r0, ._1826 + 20\n\ - str r0, [r1]\n\ - ldr r2, ._1826 + 24\n\ - ldr r0, [r2]\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0xc\n\ -._1807:\n\ - orr r0, r0, r1\n\ - str r0, [r2]\n\ - mov r0, #0x2\n\ -._1823:\n\ - add sp, sp, #0x10\n\ - pop {r3, r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4, r5, r6, r7}\n\ - pop {r1}\n\ - bx r1\n\ -._1827:\n\ - .align 2, 0\n\ -._1826:\n\ - .word gBankAttacker\n\ - .word gBattleMons\n\ - .word gBattleMoveDamage\n\ - .word gBankTarget\n\ - .word gBattlescriptCurrInstr\n\ - .word gUnknown_081D99A0\n\ - .word gHitMarker"); -} -#else u8 IsMonDisobedient(void) { u8 obedienceLevel; @@ -3858,17 +3447,25 @@ u8 IsMonDisobedient(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK || GetBankSide(gBankAttacker) == 1 - || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName) - || FlagGet(FLAG_BADGE08_GET)) - return 0; + || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName)) + return 0; - obedienceLevel = 10; - if (FlagGet(FLAG_BADGE02_GET)) - obedienceLevel = 30; - if (FlagGet(FLAG_BADGE04_GET)) - obedienceLevel = 50; - if (FlagGet(FLAG_BADGE06_GET)) - obedienceLevel = 70; + if (DEBUG && (gUnknown_02023A14_50 & 0x40)) + { + obedienceLevel = 10; + } + else + { + if (FlagGet(FLAG_BADGE08_GET)) + return 0; + obedienceLevel = 10; + if (FlagGet(FLAG_BADGE02_GET)) + obedienceLevel = 30; + if (FlagGet(FLAG_BADGE04_GET)) + obedienceLevel = 50; + if (FlagGet(FLAG_BADGE06_GET)) + obedienceLevel = 70; + } if (gBattleMons[gBankAttacker].level <= obedienceLevel) return 0; @@ -3950,4 +3547,3 @@ u8 IsMonDisobedient(void) } } } -#endif -- cgit v1.2.3 From 8cce68537704adb0d1d34a96fa977675ad1a0340 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 24 Jan 2018 20:11:06 -0600 Subject: integrate debug functions in field_control_avatar.c --- src/field/field_control_avatar.c | 537 ++++++--------------------------------- src/scene/new_game.c | 4 - 2 files changed, 77 insertions(+), 464 deletions(-) (limited to 'src') diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c index 9ac5ae11d..8dc1fed18 100644 --- a/src/field/field_control_avatar.c +++ b/src/field/field_control_avatar.c @@ -4,6 +4,7 @@ #include "bike.h" #include "coord_event_weather.h" #include "daycare.h" +#include "debug.h" #include "event_data.h" #include "field_fadetransition.h" #include "field_player_avatar.h" @@ -35,6 +36,7 @@ extern u16 gSpecialVar_Facing; extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; +extern u8 gUnknown_020297ED; static EWRAM_DATA u8 gUnknown_0202E8C0 = 0; static EWRAM_DATA u16 gUnknown_0202E8C2 = 0; @@ -82,28 +84,28 @@ extern u8 gUnknown_081C6BDE[]; static void player_get_pos_to_and_height(struct MapPosition *); static void player_get_next_pos_and_height(struct MapPosition *); -/*static*/ u16 cur_mapdata_block_role_at_player_pos(int); -/*static*/ bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c); +static u16 cur_mapdata_block_role_at_player_pos(int); +static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c); static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c); static u8 *sub_8068364(struct MapPosition *, u8, u8); static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *, u8, u8 c); static u8 *sub_8068500(struct MapPosition *, u8, u8); static u8 *TryGetFieldMoveScript(struct MapPosition *, u8, u8); -/*static*/ bool32 sub_8068770(void); -/*static*/ bool32 sub_80687A4(void); -/*static*/ bool8 sub_80687E4(struct MapPosition *, u16, u16); +static bool32 sub_8068770(void); +static bool32 sub_80687A4(void); +static bool8 sub_80687E4(struct MapPosition *, u16, u16); static void happiness_algorithm_step(void); static bool8 overworld_poison_step(void); -/*static*/ bool8 is_it_battle_time_3(u16); -/*static*/ bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); +static bool8 is_it_battle_time_3(u16); +static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); static bool8 sub_8068B30(u16); static bool8 is_non_stair_warp_tile(u16, u8); static s8 map_warp_check_packed(struct MapHeader *, struct MapPosition *); static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *); -/*static*/ bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); +static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); static s8 map_warp_check(struct MapHeader *, u16, u16, u8); static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8); -static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8); +static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);; void FieldClearPlayerInput(struct FieldInput *input) { @@ -122,230 +124,6 @@ void FieldClearPlayerInput(struct FieldInput *input) input->dpadDirection = 0; } -#if DEBUG -__attribute__((naked)) -void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add r4, r0, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r1, r1, #0x10\n" - " mov r8, r1\n" - " lsl r2, r2, #0x10\n" - " lsr r5, r2, #0x10\n" - " ldr r0, ._17\n" - " ldrb r6, [r0, #0x3]\n" - " ldrb r0, [r0, #0x2]\n" - " mov r9, r0\n" - " bl cur_mapdata_block_role_at_player_pos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl MetatileBehavior_IsMoveTile\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r6, #0x2\n" - " bne ._1 @cond_branch\n" - " cmp r7, #0\n" - " beq ._2 @cond_branch\n" - "._1:\n" - " cmp r6, #0\n" - " bne ._9 @cond_branch\n" - "._2:\n" - " bl GetPlayerSpeed\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x10\n" - " cmp r0, #0x4\n" - " beq ._8 @cond_branch\n" - " mov r0, #0x8\n" - " mov r1, r8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._5 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x4\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - "._5:\n" - " mov r0, #0x4\n" - " mov r3, r8\n" - " and r0, r0, r3\n" - " cmp r0, #0\n" - " beq ._6 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x8\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - "._6:\n" - " mov r0, #0x1\n" - " mov r1, r8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._7 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - "._7:\n" - " mov r0, #0x2\n" - " mov r3, r8\n" - " and r0, r0, r3\n" - " cmp r0, #0\n" - " beq ._8 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x80\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - "._8:\n" - " mov r0, #0xf0\n" - " and r0, r0, r5\n" - " cmp r0, #0\n" - " beq ._9 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x10\n" - " orr r0, r0, r1\n" - " mov r1, #0x20\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - "._9:\n" - " cmp r7, #0\n" - " bne ._14 @cond_branch\n" - " cmp r6, #0x2\n" - " bne ._12 @cond_branch\n" - " mov r0, r9\n" - " cmp r0, #0x2\n" - " bne ._12 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x40\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - "._12:\n" - " cmp r7, #0\n" - " bne ._14 @cond_branch\n" - " cmp r6, #0x2\n" - " bne ._14 @cond_branch\n" - " ldrb r0, [r4]\n" - " mov r1, #0x2\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - "._14:\n" - " mov r0, #0x40\n" - " and r0, r0, r5\n" - " cmp r0, #0\n" - " beq ._15 @cond_branch\n" - " mov r0, #0x2\n" - " b ._22\n" - "._18:\n" - " .align 2, 0\n" - "._17:\n" - " .word gPlayerAvatar\n" - "._15:\n" - " mov r0, #0x80\n" - " and r0, r0, r5\n" - " cmp r0, #0\n" - " beq ._19 @cond_branch\n" - " mov r0, #0x1\n" - " b ._22\n" - "._19:\n" - " mov r0, #0x20\n" - " and r0, r0, r5\n" - " cmp r0, #0\n" - " beq ._21 @cond_branch\n" - " mov r0, #0x3\n" - " b ._22\n" - "._21:\n" - " mov r0, #0x10\n" - " and r0, r0, r5\n" - " cmp r0, #0\n" - " beq ._23 @cond_branch\n" - " mov r0, #0x4\n" - "._22:\n" - " strb r0, [r4, #0x2]\n" - "._23:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r5\n" - " cmp r0, #0\n" - " beq ._25 @cond_branch\n" - " ldrb r2, [r4]\n" - " mov r0, #0x4\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq ._25 @cond_branch\n" - " ldrb r0, [r4, #0x1]\n" - " mov r1, #0x4\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x1]\n" - " mov r0, #0x5\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " strb r0, [r4]\n" - "._25:\n" - " ldr r0, ._30\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._29 @cond_branch\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r5\n" - " cmp r0, #0\n" - " beq ._28 @cond_branch\n" - " ldrb r1, [r4, #0x1]\n" - " mov r0, #0x2\n" - " orr r1, r1, r0\n" - " strb r1, [r4, #0x1]\n" - " ldrb r0, [r4]\n" - " mov r2, #0x41\n" - " neg r2, r2\n" - " and r2, r2, r0\n" - " mov r0, #0x3\n" - " neg r0, r0\n" - " and r2, r2, r0\n" - " sub r0, r0, #0xe\n" - " and r2, r2, r0\n" - " sub r0, r0, #0x10\n" - " and r2, r2, r0\n" - " strb r2, [r4]\n" - " mov r0, #0x4\n" - " mov r3, r8\n" - " and r0, r0, r3\n" - " cmp r0, #0\n" - " beq ._28 @cond_branch\n" - " mov r0, #0x1\n" - " orr r1, r1, r0\n" - " strb r1, [r4, #0x1]\n" - " mov r0, #0x9\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " strb r0, [r4]\n" - "._28:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r5\n" - " cmp r0, #0\n" - " beq ._29 @cond_branch\n" - " ldrb r0, [r4, #0x1]\n" - " mov r1, #0x8\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x1]\n" - "._29:\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._31:\n" - " .align 2, 0\n" - "._30:\n" - " .word gUnknown_020297ED\n" - "\n" - ); -} -#else void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) { u8 r6 = gPlayerAvatar.tileTransitionState; @@ -386,223 +164,33 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) input->dpadDirection = DIR_WEST; else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; -} -#endif - #if DEBUG -__attribute__((naked)) -int sub_8068024(struct FieldInput *input) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xfffffff8\n" - " add r5, r0, #0\n" - " bl player_get_direction_lower_nybble\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " mov r4, sp\n" - " mov r0, sp\n" - " bl player_get_pos_to_and_height\n" - " mov r0, sp\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " mov r2, #0x2\n" - " ldsh r1, [r4, r2]\n" - " bl MapGridGetMetatileBehaviorAt\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " ldrb r1, [r5, #0x1]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._33 @cond_branch\n" - " mov r0, sp\n" - " add r1, r4, #0\n" - " bl dive_warp\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._33 @cond_branch\n" - " b ._63\n" - "._33:\n" - " ldrb r1, [r5, #0x1]\n" - " mov r6, #0x2\n" - " add r0, r6, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._39 @cond_branch\n" - " bl CheckTrainers\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._36 @cond_branch\n" - " b ._63\n" - "._36:\n" - " ldrb r1, [r5, #0x1]\n" - " add r0, r6, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._39 @cond_branch\n" - " bl mapheader_run_first_tag2_script_list_match\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._39 @cond_branch\n" - " b ._63\n" - "._39:\n" - " ldrb r1, [r5]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._42 @cond_branch\n" - " bl sub_80687A4\n" - " cmp r0, #0x1\n" - " bne ._42 @cond_branch\n" - " b ._63\n" - "._42:\n" - " ldrb r1, [r5]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._44 @cond_branch\n" - " mov r0, #0x5\n" - " bl IncrementGameStat\n" - " mov r0, sp\n" - " add r1, r4, #0\n" - " add r2, r7, #0\n" - " bl sub_80687E4\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._63 @cond_branch\n" - "._44:\n" - " ldrb r1, [r5]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._46 @cond_branch\n" - " add r0, r4, #0\n" - " bl is_it_battle_time_3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._63 @cond_branch\n" - "._46:\n" - " ldrb r1, [r5]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._49 @cond_branch\n" - " ldrb r0, [r5, #0x2]\n" - " cmp r0, r7\n" - " bne ._49 @cond_branch\n" - " mov r0, sp\n" - " add r1, r4, #0\n" - " add r2, r7, #0\n" - " bl mapheader_run_first_tag2_script_list_match_conditionally\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._63 @cond_branch\n" - "._49:\n" - " mov r4, sp\n" - " mov r0, sp\n" - " bl player_get_next_pos_and_height\n" - " mov r0, sp\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " mov r2, #0x2\n" - " ldsh r1, [r4, r2]\n" - " bl MapGridGetMetatileBehaviorAt\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " ldrb r1, [r5]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._51 @cond_branch\n" - " mov r0, sp\n" - " add r1, r4, #0\n" - " add r2, r7, #0\n" - " bl sub_80681F0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._63 @cond_branch\n" - "._51:\n" - " ldrb r1, [r5]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._54 @cond_branch\n" - " ldrb r0, [r5, #0x2]\n" - " cmp r0, r7\n" - " bne ._54 @cond_branch\n" - " mov r0, sp\n" - " add r1, r4, #0\n" - " add r2, r7, #0\n" - " bl map_warp_consider_2_to_inside\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._63 @cond_branch\n" - "._54:\n" - " ldrb r1, [r5]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._56 @cond_branch\n" - " bl sub_8068770\n" - " cmp r0, #0x1\n" - " beq ._63 @cond_branch\n" - "._56:\n" - " ldrb r1, [r5]\n" - " mov r0, #0x4\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._58 @cond_branch\n" - " mov r0, #0x6\n" - " bl PlaySE\n" - " bl sub_8071310\n" - " b ._63\n" - "._58:\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._60 @cond_branch\n" - " bl sub_80A6D1C\n" - " cmp r0, #0x1\n" - " beq ._63 @cond_branch\n" - "._60:\n" - " ldrb r1, [r5, #0x1]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._62 @cond_branch\n" - " bl debug_sub_80888D8\n" - " b ._63\n" - "._62:\n" - " mov r0, #0x4\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._64 @cond_branch\n" - " mov r0, #0x0\n" - " b ._65\n" - "._64:\n" - " mov r0, #0x6\n" - " bl PlaySE\n" - " bl DebugMenu_8077048\n" - "._63:\n" - " mov r0, #0x1\n" - "._65:\n" - " add sp, sp, #0x8\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + if ((heldKeys & R_BUTTON) && input->pressedStartButton) + { + input->input_field_1_2 = TRUE; + input->pressedStartButton = FALSE; + } + if (gUnknown_020297ED) + { + if (heldKeys & R_BUTTON) + { + input->input_field_1_1 = TRUE; + input->input_field_0_6 = FALSE; + input->input_field_0_1 = FALSE; + input->input_field_0_4 = FALSE; + input->input_field_0_5 = FALSE; + if (newKeys & SELECT_BUTTON) + { + input->input_field_1_0 = TRUE; + input->pressedSelectButton = FALSE; + } + } + if (heldKeys & L_BUTTON) + input->input_field_1_3 = TRUE; + } +#endif } -#else + int sub_8068024(struct FieldInput *input) { struct MapPosition position; @@ -612,10 +200,25 @@ int sub_8068024(struct FieldInput *input) r6 = player_get_direction_lower_nybble(); player_get_pos_to_and_height(&position); r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (CheckTrainers() == TRUE) +#if DEBUG + if (input->input_field_1_3 && dive_warp(&position, r4) == TRUE) return TRUE; - if (mapheader_run_first_tag2_script_list_match() == 1) +#endif + + if ( +#if DEBUG + !input->input_field_1_1 +#endif + && CheckTrainers() == TRUE) return TRUE; + + if ( +#if DEBUG + !input->input_field_1_1 +#endif + && mapheader_run_first_tag2_script_list_match() == 1) + return TRUE; + if (input->pressedBButton && sub_80687A4() == 1) return TRUE; if (input->input_field_0_6) @@ -650,9 +253,23 @@ int sub_8068024(struct FieldInput *input) } if (input->pressedSelectButton && sub_80A6D1C() == TRUE) return TRUE; + +#if DEBUG + if (input->input_field_1_0) + { + debug_sub_80888D8(); + return TRUE; + } + if (input->input_field_1_2) + { + PlaySE(SE_WIN_OPEN); + DebugMenu_8077048(); + return TRUE; + } +#endif + return FALSE; } -#endif static void player_get_pos_to_and_height(struct MapPosition *position) { @@ -672,7 +289,7 @@ static void player_get_next_pos_and_height(struct MapPosition *position) position->height = 0; } -/*static*/ u16 cur_mapdata_block_role_at_player_pos(int unused) +static u16 cur_mapdata_block_role_at_player_pos(int unused) { s16 x, y; @@ -680,7 +297,7 @@ static void player_get_next_pos_and_height(struct MapPosition *position) return MapGridGetMetatileBehaviorAt(x, y); } -/*static*/ bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c) +static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c) { u8 *script = TryGetScriptOnPressingA(position, b, c); @@ -875,7 +492,7 @@ static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2) return NULL; } -/*static*/ bool32 sub_8068770(void) +static bool32 sub_8068770(void) { if (FlagGet(FLAG_BADGE07_GET) && sub_8068F18() == 2) { @@ -885,7 +502,7 @@ static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2) return FALSE; } -/*static*/ bool32 sub_80687A4(void) +static bool32 sub_80687A4(void) { if (FlagGet(FLAG_BADGE07_GET) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_8068F18() == 1) { @@ -895,7 +512,7 @@ static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2) return FALSE; } -/*static*/ bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused) +static bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused) { if (mapheader_trigger_activate_at__run_now(position) == TRUE) return TRUE; @@ -1015,7 +632,7 @@ void prev_quest_postbuffer_cursor_backup_reset(void) gUnknown_0202E8C0 = 0; } -/*static*/ bool8 is_it_battle_time_3(u16 a) +static bool8 is_it_battle_time_3(u16 a) { if (gUnknown_0202E8C0 < 4) { @@ -1036,7 +653,7 @@ void prev_quest_postbuffer_cursor_backup_reset(void) } } -/*static*/ bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c) +static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c) { s8 r6 = map_warp_check_packed(&gMapHeader, position); @@ -1144,7 +761,7 @@ static void sub_8068C30(struct MapHeader *unused, s8 b, struct MapPosition *posi } } -/*static*/ bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c) +static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c) { s8 r4; @@ -1250,7 +867,7 @@ static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHea return NULL; } -int dive_warp(struct MapPosition *position, u16 b) +bool8 dive_warp(struct MapPosition *position, u16 b) { if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(b) == 0) { diff --git a/src/scene/new_game.c b/src/scene/new_game.c index cec7134a3..e64dc91e3 100644 --- a/src/scene/new_game.c +++ b/src/scene/new_game.c @@ -31,10 +31,6 @@ #include "text.h" #include "tv.h" -#if DEBUG -extern u8 gUnknown_020297ED; -#endif - EWRAM_DATA u8 gDifferentSaveFile = 0; EWRAM_DATA u8 gUnknown_020297ED = 0; -- cgit v1.2.3 From d6f6e12490f5d980c66c2de0f767bbaf8da75da1 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 24 Jan 2018 20:16:00 -0600 Subject: fix build --- src/field/field_control_avatar.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c index 8dc1fed18..48eb64dd7 100644 --- a/src/field/field_control_avatar.c +++ b/src/field/field_control_avatar.c @@ -207,16 +207,16 @@ int sub_8068024(struct FieldInput *input) if ( #if DEBUG - !input->input_field_1_1 + !input->input_field_1_1 && #endif - && CheckTrainers() == TRUE) + CheckTrainers() == TRUE) return TRUE; if ( #if DEBUG - !input->input_field_1_1 + !input->input_field_1_1 && #endif - && mapheader_run_first_tag2_script_list_match() == 1) + mapheader_run_first_tag2_script_list_match() == 1) return TRUE; if (input->pressedBButton && sub_80687A4() == 1) -- cgit v1.2.3 From 4327bee485510b424cbf28e450d90ff50e6fe78b Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Wed, 24 Jan 2018 23:34:17 -0500 Subject: merge field files into evobjmv.c. --- src/battle/battle_setup.c | 1 - src/easy_chat_2.c | 2 +- src/engine/naming_screen.c | 2 +- src/field/berry.c | 2 +- src/field/berry_tag_screen.c | 2 +- src/field/bike.c | 2 +- src/field/evobjmv.c | 9499 +++++++++++++++++++++++++++++++++++++ src/field/field_effect.c | 4 +- src/field/field_effect_helpers.c | 4 +- src/field/field_fadetransition.c | 3 +- src/field/field_ground_effect.c | 772 --- src/field/field_map_obj.c | 8355 -------------------------------- src/field/field_map_obj_helpers.c | 387 -- src/field/field_player_avatar.c | 4 +- src/field/field_special_scene.c | 2 +- src/field/field_specials.c | 2 +- src/field/field_weather.c | 2 +- src/field/field_weather_effects.c | 2 +- src/field/fldeff_berrytree.c | 2 +- src/field/fldeff_cut.c | 2 +- src/field/fldeff_decoration.c | 2 +- src/field/fldeff_recordmixing.c | 2 +- src/field/item_menu.c | 2 +- src/field/item_use.c | 1 - src/field/map_obj_lock.c | 3 +- src/field/overworld.c | 4 +- src/field/rotating_gate.c | 2 +- src/field/scrcmd.c | 3 +- src/field/script_movement.c | 3 +- src/field/shop.c | 2 +- src/field/start_menu.c | 1 - src/field/trainer_see.c | 2 +- src/field/tv.c | 2 +- src/rom6.c | 2 +- src/scene/cable_car.c | 2 +- 35 files changed, 9527 insertions(+), 9557 deletions(-) create mode 100644 src/field/evobjmv.c delete mode 100644 src/field/field_ground_effect.c delete mode 100644 src/field/field_map_obj.c delete mode 100644 src/field/field_map_obj_helpers.c (limited to 'src') diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c index 892be1029..41e84a8a0 100644 --- a/src/battle/battle_setup.c +++ b/src/battle/battle_setup.c @@ -6,7 +6,6 @@ #include "event_data.h" #include "field_control_avatar.h" #include "field_fadetransition.h" -#include "field_map_obj_helpers.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_weather.h" diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c index c56fe7576..481bc66c5 100644 --- a/src/easy_chat_2.c +++ b/src/easy_chat_2.c @@ -5,7 +5,7 @@ #include "decompress.h" #include "easy_chat.h" #include "event_data.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_message_box.h" #include "graphics.h" #include "menu.h" diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c index 97819322c..55e377c21 100644 --- a/src/engine/naming_screen.c +++ b/src/engine/naming_screen.c @@ -3,7 +3,7 @@ #include "data2.h" #include "graphics.h" #include "field_effect.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "main.h" #include "menu.h" diff --git a/src/field/berry.c b/src/field/berry.c index 088267ad0..7d22b50b1 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -1,7 +1,7 @@ #include "global.h" #include "berry.h" #include "field_control_avatar.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "fieldmap.h" #include "item.h" #include "item_menu.h" diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c index bb937ea43..9e518c06a 100644 --- a/src/field/berry_tag_screen.c +++ b/src/field/berry_tag_screen.c @@ -2,7 +2,7 @@ #include "berry_tag_screen.h" #include "berry.h" #include "decompress.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "item_menu.h" #include "constants/items.h" #include "item_use.h" diff --git a/src/field/bike.c b/src/field/bike.c index 8db01b4b4..2d763cb14 100644 --- a/src/field/bike.c +++ b/src/field/bike.c @@ -1,6 +1,6 @@ #include "global.h" #include "bike.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "constants/flags.h" diff --git a/src/field/evobjmv.c b/src/field/evobjmv.c new file mode 100644 index 000000000..9c282e266 --- /dev/null +++ b/src/field/evobjmv.c @@ -0,0 +1,9499 @@ +#include "global.h" +#include "evobjmv.h" +#include "berry.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "palette.h" +#include "random.h" +#include "overworld.h" +#include "sprite.h" +#include "metatile_behavior.h" +#include "constants/maps.h" +#include "constants/map_objects.h" +#include "trainer_see.h" + +// rodata + +const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; + +void ObjectCB_CameraObject(struct Sprite *sprite); +const struct SpriteTemplate gSpriteTemplate_830FD24 = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; + +void CameraObject_0(struct Sprite *); +void CameraObject_1(struct Sprite *); +void CameraObject_2(struct Sprite *); +void (*const gCameraObjectFuncs[])(struct Sprite *) = { + CameraObject_0, + CameraObject_1, + CameraObject_2, +}; + +const u32 gMapObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/00.4bpp"); +const u32 gMapObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/01.4bpp"); +const u32 gMapObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/02.4bpp"); +const u32 gMapObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/03.4bpp"); +const u32 gMapObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/04.4bpp"); +const u32 gMapObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/05.4bpp"); +const u32 gMapObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/06.4bpp"); +const u32 gMapObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/07.4bpp"); +const u32 gMapObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/08.4bpp"); +const u32 gMapObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/09.4bpp"); +const u32 gMapObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/10.4bpp"); +const u32 gMapObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/11.4bpp"); +const u32 gMapObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/12.4bpp"); +const u32 gMapObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/13.4bpp"); +const u32 gMapObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/14.4bpp"); +const u32 gMapObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/15.4bpp"); +const u32 gMapObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/16.4bpp"); +const u32 gMapObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/17.4bpp"); +const u16 gMapObjectPalette8[] = INCBIN_U16("graphics/map_objects/palettes/08.gbapal"); +const u16 NullPalette_8310F68[16] = {}; +const u16 NullPalette_8310F88[16] = {}; +const u16 NullPalette_8310FA8[16] = {}; +const u16 NullPalette_8310FC8[16] = {}; +const u16 NullPalette_8310FE8[16] = {}; +const u16 NullPalette_8311008[16] = {}; +const u16 NullPalette_8311028[16] = {}; +const u16 NullPalette_8311048[16] = {}; +const u16 NullPalette_8311068[16] = {}; +const u16 NullPalette_8311088[16] = {}; +const u16 NullPalette_83110A8[16] = {}; +const u16 NullPalette_83110C8[16] = {}; +const u16 NullPalette_83110E8[16] = {}; +const u16 NullPalette_8311108[16] = {}; +const u16 NullPalette_8311128[16] = {}; +const u16 gMapObjectPalette9[] = INCBIN_U16("graphics/map_objects/palettes/09.gbapal"); +const u16 gMapObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/10.gbapal"); +const u32 gMapObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/0.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/1.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/2.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/3.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/4.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/0.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/3.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/1.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/4.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/2.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/5.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/0.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/1.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/2.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/3.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/4.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/5.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/6.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/7.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/8.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/00.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/01.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/02.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/03.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/04.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/05.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/06.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/07.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/08.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/09.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/10.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/11.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/12.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/13.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/14.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/15.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/16.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/17.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/18.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/19.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/20.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/21.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/22.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/23.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/24.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/25.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/26.4bpp"); +const u32 gMapObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/00.4bpp"); +const u32 gMapObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/01.4bpp"); +const u32 gMapObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/02.4bpp"); +const u32 gMapObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/03.4bpp"); +const u32 gMapObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/04.4bpp"); +const u32 gMapObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/05.4bpp"); +const u32 gMapObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/06.4bpp"); +const u32 gMapObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/07.4bpp"); +const u32 gMapObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/08.4bpp"); +const u32 gMapObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/09.4bpp"); +const u32 gMapObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/10.4bpp"); +const u32 gMapObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/11.4bpp"); +const u32 gMapObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/0.4bpp"); +const u32 gMapObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/3.4bpp"); +const u32 gMapObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/1.4bpp"); +const u32 gMapObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/4.4bpp"); +const u32 gMapObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/2.4bpp"); +const u32 gMapObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/5.4bpp"); +const u32 gMapObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/decorating.4bpp"); +const u32 gMapObjectPic_MayDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/may/decorating.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/0.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/1.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/2.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/3.4bpp"); +const u32 gMapObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/0.4bpp"); +const u32 gMapObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/1.4bpp"); +const u32 gMapObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/2.4bpp"); +const u32 gMapObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/3.4bpp"); +const u16 gMapObjectPalette11[] = INCBIN_U16("graphics/map_objects/palettes/11.gbapal"); +const u32 gMapObjectPic_MayNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/00.4bpp"); +const u32 gMapObjectPic_MayNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/01.4bpp"); +const u32 gMapObjectPic_MayNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/02.4bpp"); +const u32 gMapObjectPic_MayNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/03.4bpp"); +const u32 gMapObjectPic_MayNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/04.4bpp"); +const u32 gMapObjectPic_MayNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/05.4bpp"); +const u32 gMapObjectPic_MayNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/06.4bpp"); +const u32 gMapObjectPic_MayNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/07.4bpp"); +const u32 gMapObjectPic_MayNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/08.4bpp"); +const u32 gMapObjectPic_MayNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/09.4bpp"); +const u32 gMapObjectPic_MayNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/10.4bpp"); +const u32 gMapObjectPic_MayNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/11.4bpp"); +const u32 gMapObjectPic_MayNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/12.4bpp"); +const u32 gMapObjectPic_MayNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/13.4bpp"); +const u32 gMapObjectPic_MayNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/14.4bpp"); +const u32 gMapObjectPic_MayNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/15.4bpp"); +const u32 gMapObjectPic_MayNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/16.4bpp"); +const u32 gMapObjectPic_MayNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/17.4bpp"); +const u16 gMapObjectPalette17[] = INCBIN_U16("graphics/map_objects/palettes/17.gbapal"); +const u16 gMapObjectPalette18[] = INCBIN_U16("graphics/map_objects/palettes/18.gbapal"); +const u16 NullPalette_831B7E8[16] = {}; +const u16 NullPalette_831B808[16] = {}; +const u16 NullPalette_831B828[16] = {}; +const u16 NullPalette_831B848[16] = {}; +const u16 NullPalette_831B868[16] = {}; +const u16 NullPalette_831B888[16] = {}; +const u16 NullPalette_831B8A8[16] = {}; +const u16 NullPalette_831B8C8[16] = {}; +const u16 NullPalette_831B8E8[16] = {}; +const u16 NullPalette_831B908[16] = {}; +const u16 NullPalette_831B928[16] = {}; +const u16 NullPalette_831B948[16] = {}; +const u16 NullPalette_831B968[16] = {}; +const u16 NullPalette_831B988[16] = {}; +const u32 gMapObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/0.4bpp"); +const u32 gMapObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/1.4bpp"); +const u32 gMapObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/2.4bpp"); +const u32 gMapObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/3.4bpp"); +const u32 gMapObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/4.4bpp"); +const u32 gMapObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/5.4bpp"); +const u32 gMapObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/6.4bpp"); +const u32 gMapObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/7.4bpp"); +const u32 gMapObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/8.4bpp"); +const u32 gMapObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/00.4bpp"); +const u32 gMapObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/01.4bpp"); +const u32 gMapObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/02.4bpp"); +const u32 gMapObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/03.4bpp"); +const u32 gMapObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/04.4bpp"); +const u32 gMapObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/05.4bpp"); +const u32 gMapObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/06.4bpp"); +const u32 gMapObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/07.4bpp"); +const u32 gMapObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/08.4bpp"); +const u32 gMapObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/09.4bpp"); +const u32 gMapObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/10.4bpp"); +const u32 gMapObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/11.4bpp"); +const u32 gMapObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/12.4bpp"); +const u32 gMapObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/13.4bpp"); +const u32 gMapObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/14.4bpp"); +const u32 gMapObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/15.4bpp"); +const u32 gMapObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/16.4bpp"); +const u32 gMapObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/17.4bpp"); +const u32 gMapObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/18.4bpp"); +const u32 gMapObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/19.4bpp"); +const u32 gMapObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/20.4bpp"); +const u32 gMapObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/21.4bpp"); +const u32 gMapObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/22.4bpp"); +const u32 gMapObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/23.4bpp"); +const u32 gMapObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/24.4bpp"); +const u32 gMapObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/25.4bpp"); +const u32 gMapObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/26.4bpp"); +const u32 gMapObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/0.4bpp"); +const u32 gMapObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/3.4bpp"); +const u32 gMapObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/1.4bpp"); +const u32 gMapObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/4.4bpp"); +const u32 gMapObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/2.4bpp"); +const u32 gMapObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/5.4bpp"); +const u32 gMapObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/0.4bpp"); +const u32 gMapObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/1.4bpp"); +const u32 gMapObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/2.4bpp"); +const u32 gMapObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/3.4bpp"); +const u32 gMapObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/4.4bpp"); +const u32 gMapObjectPic_MayFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/00.4bpp"); +const u32 gMapObjectPic_MayFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/01.4bpp"); +const u32 gMapObjectPic_MayFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/02.4bpp"); +const u32 gMapObjectPic_MayFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/03.4bpp"); +const u32 gMapObjectPic_MayFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/04.4bpp"); +const u32 gMapObjectPic_MayFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/05.4bpp"); +const u32 gMapObjectPic_MayFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/06.4bpp"); +const u32 gMapObjectPic_MayFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/07.4bpp"); +const u32 gMapObjectPic_MayFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/08.4bpp"); +const u32 gMapObjectPic_MayFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/09.4bpp"); +const u32 gMapObjectPic_MayFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/10.4bpp"); +const u32 gMapObjectPic_MayFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/11.4bpp"); +const u32 gMapObjectPic_MayWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/0.4bpp"); +const u32 gMapObjectPic_MayWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/3.4bpp"); +const u32 gMapObjectPic_MayWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/1.4bpp"); +const u32 gMapObjectPic_MayWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/4.4bpp"); +const u32 gMapObjectPic_MayWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/2.4bpp"); +const u32 gMapObjectPic_MayWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/5.4bpp"); +const u16 gMapObjectPalette0[] = INCBIN_U16("graphics/map_objects/palettes/00.gbapal"); +const u16 gMapObjectPalette1[] = INCBIN_U16("graphics/map_objects/palettes/01.gbapal"); +const u16 gMapObjectPalette2[] = INCBIN_U16("graphics/map_objects/palettes/02.gbapal"); +const u16 gMapObjectPalette3[] = INCBIN_U16("graphics/map_objects/palettes/03.gbapal"); +const u16 gMapObjectPalette4[] = INCBIN_U16("graphics/map_objects/palettes/04.gbapal"); +const u16 gMapObjectPalette5[] = INCBIN_U16("graphics/map_objects/palettes/05.gbapal"); +const u16 gMapObjectPalette6[] = INCBIN_U16("graphics/map_objects/palettes/06.gbapal"); +const u16 gMapObjectPalette7[] = INCBIN_U16("graphics/map_objects/palettes/07.gbapal"); +const u32 gMapObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/0.4bpp"); +const u32 gMapObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/1.4bpp"); +const u32 gMapObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/2.4bpp"); +const u32 gMapObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/3.4bpp"); +const u32 gMapObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/4.4bpp"); +const u32 gMapObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/5.4bpp"); +const u32 gMapObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/6.4bpp"); +const u32 gMapObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/7.4bpp"); +const u32 gMapObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/8.4bpp"); +const u32 gMapObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/0.4bpp"); +const u32 gMapObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/1.4bpp"); +const u32 gMapObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/2.4bpp"); +const u32 gMapObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/3.4bpp"); +const u32 gMapObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/4.4bpp"); +const u32 gMapObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/5.4bpp"); +const u32 gMapObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/6.4bpp"); +const u32 gMapObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/7.4bpp"); +const u32 gMapObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/8.4bpp"); +const u32 gMapObjectPic_Boy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/0.4bpp"); +const u32 gMapObjectPic_Boy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/1.4bpp"); +const u32 gMapObjectPic_Boy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/2.4bpp"); +const u32 gMapObjectPic_Boy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/3.4bpp"); +const u32 gMapObjectPic_Boy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/4.4bpp"); +const u32 gMapObjectPic_Boy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/5.4bpp"); +const u32 gMapObjectPic_Boy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/6.4bpp"); +const u32 gMapObjectPic_Boy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/7.4bpp"); +const u32 gMapObjectPic_Boy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/8.4bpp"); +const u32 gMapObjectPic_Girl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/0.4bpp"); +const u32 gMapObjectPic_Girl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/1.4bpp"); +const u32 gMapObjectPic_Girl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/2.4bpp"); +const u32 gMapObjectPic_Girl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/3.4bpp"); +const u32 gMapObjectPic_Girl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/4.4bpp"); +const u32 gMapObjectPic_Girl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/5.4bpp"); +const u32 gMapObjectPic_Girl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/6.4bpp"); +const u32 gMapObjectPic_Girl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/7.4bpp"); +const u32 gMapObjectPic_Girl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/8.4bpp"); +const u32 gMapObjectPic_Boy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/0.4bpp"); +const u32 gMapObjectPic_Boy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/1.4bpp"); +const u32 gMapObjectPic_Boy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/2.4bpp"); +const u32 gMapObjectPic_Boy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/3.4bpp"); +const u32 gMapObjectPic_Boy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/4.4bpp"); +const u32 gMapObjectPic_Boy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/5.4bpp"); +const u32 gMapObjectPic_Boy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/6.4bpp"); +const u32 gMapObjectPic_Boy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/7.4bpp"); +const u32 gMapObjectPic_Boy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/8.4bpp"); +const u32 gMapObjectPic_Girl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/0.4bpp"); +const u32 gMapObjectPic_Girl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/1.4bpp"); +const u32 gMapObjectPic_Girl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/2.4bpp"); +const u32 gMapObjectPic_Girl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/3.4bpp"); +const u32 gMapObjectPic_Girl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/4.4bpp"); +const u32 gMapObjectPic_Girl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/5.4bpp"); +const u32 gMapObjectPic_Girl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/6.4bpp"); +const u32 gMapObjectPic_Girl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/7.4bpp"); +const u32 gMapObjectPic_Girl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/8.4bpp"); +const u32 gMapObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/0.4bpp"); +const u32 gMapObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/1.4bpp"); +const u32 gMapObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/2.4bpp"); +const u32 gMapObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/3.4bpp"); +const u32 gMapObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/4.4bpp"); +const u32 gMapObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/5.4bpp"); +const u32 gMapObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/6.4bpp"); +const u32 gMapObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/7.4bpp"); +const u32 gMapObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/8.4bpp"); +const u32 gMapObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/0.4bpp"); +const u32 gMapObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/1.4bpp"); +const u32 gMapObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/2.4bpp"); +const u32 gMapObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/3.4bpp"); +const u32 gMapObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/4.4bpp"); +const u32 gMapObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/5.4bpp"); +const u32 gMapObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/6.4bpp"); +const u32 gMapObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/7.4bpp"); +const u32 gMapObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/8.4bpp"); +const u32 gMapObjectPic_Boy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/0.4bpp"); +const u32 gMapObjectPic_Boy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/1.4bpp"); +const u32 gMapObjectPic_Boy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/2.4bpp"); +const u32 gMapObjectPic_Boy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/3.4bpp"); +const u32 gMapObjectPic_Boy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/4.4bpp"); +const u32 gMapObjectPic_Boy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/5.4bpp"); +const u32 gMapObjectPic_Boy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/6.4bpp"); +const u32 gMapObjectPic_Boy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/7.4bpp"); +const u32 gMapObjectPic_Boy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/8.4bpp"); +const u32 gMapObjectPic_Girl3_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/0.4bpp"); +const u32 gMapObjectPic_Girl3_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/1.4bpp"); +const u32 gMapObjectPic_Girl3_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/2.4bpp"); +const u32 gMapObjectPic_Girl3_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/3.4bpp"); +const u32 gMapObjectPic_Girl3_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/4.4bpp"); +const u32 gMapObjectPic_Girl3_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/5.4bpp"); +const u32 gMapObjectPic_Girl3_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/6.4bpp"); +const u32 gMapObjectPic_Girl3_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/7.4bpp"); +const u32 gMapObjectPic_Girl3_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/8.4bpp"); +const u32 gMapObjectPic_Boy4_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/0.4bpp"); +const u32 gMapObjectPic_Boy4_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/1.4bpp"); +const u32 gMapObjectPic_Boy4_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/2.4bpp"); +const u32 gMapObjectPic_Boy4_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/3.4bpp"); +const u32 gMapObjectPic_Boy4_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/4.4bpp"); +const u32 gMapObjectPic_Boy4_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/5.4bpp"); +const u32 gMapObjectPic_Boy4_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/6.4bpp"); +const u32 gMapObjectPic_Boy4_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/7.4bpp"); +const u32 gMapObjectPic_Boy4_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/8.4bpp"); +const u32 gMapObjectPic_Woman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/0.4bpp"); +const u32 gMapObjectPic_Woman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/1.4bpp"); +const u32 gMapObjectPic_Woman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/2.4bpp"); +const u32 gMapObjectPic_Woman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/3.4bpp"); +const u32 gMapObjectPic_Woman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/4.4bpp"); +const u32 gMapObjectPic_Woman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/5.4bpp"); +const u32 gMapObjectPic_Woman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/6.4bpp"); +const u32 gMapObjectPic_Woman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/7.4bpp"); +const u32 gMapObjectPic_Woman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/8.4bpp"); +const u32 gMapObjectPic_FatMan_0[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/0.4bpp"); +const u32 gMapObjectPic_FatMan_1[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/1.4bpp"); +const u32 gMapObjectPic_FatMan_2[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/2.4bpp"); +const u32 gMapObjectPic_FatMan_3[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/3.4bpp"); +const u32 gMapObjectPic_FatMan_4[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/4.4bpp"); +const u32 gMapObjectPic_FatMan_5[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/5.4bpp"); +const u32 gMapObjectPic_FatMan_6[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/6.4bpp"); +const u32 gMapObjectPic_FatMan_7[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/7.4bpp"); +const u32 gMapObjectPic_FatMan_8[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/8.4bpp"); +const u32 gMapObjectPic_Woman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/0.4bpp"); +const u32 gMapObjectPic_Woman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/1.4bpp"); +const u32 gMapObjectPic_Woman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/2.4bpp"); +const u32 gMapObjectPic_Woman2_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/3.4bpp"); +const u32 gMapObjectPic_Woman2_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/4.4bpp"); +const u32 gMapObjectPic_Woman2_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/5.4bpp"); +const u32 gMapObjectPic_Woman2_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/6.4bpp"); +const u32 gMapObjectPic_Woman2_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/7.4bpp"); +const u32 gMapObjectPic_Woman2_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/8.4bpp"); +const u32 gMapObjectPic_Man1_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/0.4bpp"); +const u32 gMapObjectPic_Man1_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/1.4bpp"); +const u32 gMapObjectPic_Man1_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/2.4bpp"); +const u32 gMapObjectPic_Man1_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/3.4bpp"); +const u32 gMapObjectPic_Man1_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/4.4bpp"); +const u32 gMapObjectPic_Man1_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/5.4bpp"); +const u32 gMapObjectPic_Man1_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/6.4bpp"); +const u32 gMapObjectPic_Man1_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/7.4bpp"); +const u32 gMapObjectPic_Man1_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/8.4bpp"); +const u32 gMapObjectPic_Woman3_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/0.4bpp"); +const u32 gMapObjectPic_Woman3_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/1.4bpp"); +const u32 gMapObjectPic_Woman3_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/2.4bpp"); +const u32 gMapObjectPic_Woman3_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/3.4bpp"); +const u32 gMapObjectPic_Woman3_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/4.4bpp"); +const u32 gMapObjectPic_Woman3_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/5.4bpp"); +const u32 gMapObjectPic_Woman3_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/6.4bpp"); +const u32 gMapObjectPic_Woman3_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/7.4bpp"); +const u32 gMapObjectPic_Woman3_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/8.4bpp"); +const u32 gMapObjectPic_OldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/0.4bpp"); +const u32 gMapObjectPic_OldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/1.4bpp"); +const u32 gMapObjectPic_OldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/2.4bpp"); +const u32 gMapObjectPic_OldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/3.4bpp"); +const u32 gMapObjectPic_OldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/4.4bpp"); +const u32 gMapObjectPic_OldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/5.4bpp"); +const u32 gMapObjectPic_OldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/6.4bpp"); +const u32 gMapObjectPic_OldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/7.4bpp"); +const u32 gMapObjectPic_OldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/8.4bpp"); +const u32 gMapObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/0.4bpp"); +const u32 gMapObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/1.4bpp"); +const u32 gMapObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/2.4bpp"); +const u32 gMapObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/3.4bpp"); +const u32 gMapObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/4.4bpp"); +const u32 gMapObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/5.4bpp"); +const u32 gMapObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/6.4bpp"); +const u32 gMapObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/7.4bpp"); +const u32 gMapObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/8.4bpp"); +const u32 gMapObjectPic_Man2_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/0.4bpp"); +const u32 gMapObjectPic_Man2_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/1.4bpp"); +const u32 gMapObjectPic_Man2_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/2.4bpp"); +const u32 gMapObjectPic_Man2_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/3.4bpp"); +const u32 gMapObjectPic_Man2_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/4.4bpp"); +const u32 gMapObjectPic_Man2_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/5.4bpp"); +const u32 gMapObjectPic_Man2_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/6.4bpp"); +const u32 gMapObjectPic_Man2_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/7.4bpp"); +const u32 gMapObjectPic_Man2_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/8.4bpp"); +const u32 gMapObjectPic_Woman4_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/0.4bpp"); +const u32 gMapObjectPic_Woman4_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/1.4bpp"); +const u32 gMapObjectPic_Woman4_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/2.4bpp"); +const u32 gMapObjectPic_Woman4_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/3.4bpp"); +const u32 gMapObjectPic_Woman4_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/4.4bpp"); +const u32 gMapObjectPic_Woman4_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/5.4bpp"); +const u32 gMapObjectPic_Woman4_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/6.4bpp"); +const u32 gMapObjectPic_Woman4_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/7.4bpp"); +const u32 gMapObjectPic_Woman4_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/8.4bpp"); +const u32 gMapObjectPic_Man3_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/0.4bpp"); +const u32 gMapObjectPic_Man3_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/1.4bpp"); +const u32 gMapObjectPic_Man3_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/2.4bpp"); +const u32 gMapObjectPic_Man3_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/3.4bpp"); +const u32 gMapObjectPic_Man3_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/4.4bpp"); +const u32 gMapObjectPic_Man3_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/5.4bpp"); +const u32 gMapObjectPic_Man3_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/6.4bpp"); +const u32 gMapObjectPic_Man3_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/7.4bpp"); +const u32 gMapObjectPic_Man3_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/8.4bpp"); +const u32 gMapObjectPic_Woman5_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/0.4bpp"); +const u32 gMapObjectPic_Woman5_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/1.4bpp"); +const u32 gMapObjectPic_Woman5_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/2.4bpp"); +const u32 gMapObjectPic_Woman5_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/3.4bpp"); +const u32 gMapObjectPic_Woman5_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/4.4bpp"); +const u32 gMapObjectPic_Woman5_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/5.4bpp"); +const u32 gMapObjectPic_Woman5_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/6.4bpp"); +const u32 gMapObjectPic_Woman5_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/7.4bpp"); +const u32 gMapObjectPic_Woman5_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/8.4bpp"); +const u32 gMapObjectPic_Cook_0[] = INCBIN_U32("graphics/map_objects/pics/people/cook/0.4bpp"); +const u32 gMapObjectPic_Cook_1[] = INCBIN_U32("graphics/map_objects/pics/people/cook/1.4bpp"); +const u32 gMapObjectPic_Cook_2[] = INCBIN_U32("graphics/map_objects/pics/people/cook/2.4bpp"); +const u32 gMapObjectPic_Woman6_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/0.4bpp"); +const u32 gMapObjectPic_Woman6_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/1.4bpp"); +const u32 gMapObjectPic_Woman6_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/2.4bpp"); +const u32 gMapObjectPic_Woman6_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/3.4bpp"); +const u32 gMapObjectPic_Woman6_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/4.4bpp"); +const u32 gMapObjectPic_Woman6_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/5.4bpp"); +const u32 gMapObjectPic_Woman6_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/6.4bpp"); +const u32 gMapObjectPic_Woman6_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/7.4bpp"); +const u32 gMapObjectPic_Woman6_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/8.4bpp"); +const u32 gMapObjectPic_OldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/0.4bpp"); +const u32 gMapObjectPic_OldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/1.4bpp"); +const u32 gMapObjectPic_OldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/2.4bpp"); +const u32 gMapObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/0.4bpp"); +const u32 gMapObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/1.4bpp"); +const u32 gMapObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/2.4bpp"); +const u32 gMapObjectPic_Camper_0[] = INCBIN_U32("graphics/map_objects/pics/people/camper/0.4bpp"); +const u32 gMapObjectPic_Camper_1[] = INCBIN_U32("graphics/map_objects/pics/people/camper/1.4bpp"); +const u32 gMapObjectPic_Camper_2[] = INCBIN_U32("graphics/map_objects/pics/people/camper/2.4bpp"); +const u32 gMapObjectPic_Camper_3[] = INCBIN_U32("graphics/map_objects/pics/people/camper/3.4bpp"); +const u32 gMapObjectPic_Camper_4[] = INCBIN_U32("graphics/map_objects/pics/people/camper/4.4bpp"); +const u32 gMapObjectPic_Camper_5[] = INCBIN_U32("graphics/map_objects/pics/people/camper/5.4bpp"); +const u32 gMapObjectPic_Camper_6[] = INCBIN_U32("graphics/map_objects/pics/people/camper/6.4bpp"); +const u32 gMapObjectPic_Camper_7[] = INCBIN_U32("graphics/map_objects/pics/people/camper/7.4bpp"); +const u32 gMapObjectPic_Camper_8[] = INCBIN_U32("graphics/map_objects/pics/people/camper/8.4bpp"); +const u32 gMapObjectPic_Picnicker_0[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/0.4bpp"); +const u32 gMapObjectPic_Picnicker_1[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/1.4bpp"); +const u32 gMapObjectPic_Picnicker_2[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/2.4bpp"); +const u32 gMapObjectPic_Picnicker_3[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/3.4bpp"); +const u32 gMapObjectPic_Picnicker_4[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/4.4bpp"); +const u32 gMapObjectPic_Picnicker_5[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/5.4bpp"); +const u32 gMapObjectPic_Picnicker_6[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/6.4bpp"); +const u32 gMapObjectPic_Picnicker_7[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/7.4bpp"); +const u32 gMapObjectPic_Picnicker_8[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/8.4bpp"); +const u32 gMapObjectPic_Man4_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/0.4bpp"); +const u32 gMapObjectPic_Man4_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/1.4bpp"); +const u32 gMapObjectPic_Man4_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/2.4bpp"); +const u32 gMapObjectPic_Man4_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/3.4bpp"); +const u32 gMapObjectPic_Man4_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/4.4bpp"); +const u32 gMapObjectPic_Man4_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/5.4bpp"); +const u32 gMapObjectPic_Man4_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/6.4bpp"); +const u32 gMapObjectPic_Man4_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/7.4bpp"); +const u32 gMapObjectPic_Man4_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/8.4bpp"); +const u32 gMapObjectPic_Woman7_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/0.4bpp"); +const u32 gMapObjectPic_Woman7_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/1.4bpp"); +const u32 gMapObjectPic_Woman7_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/2.4bpp"); +const u32 gMapObjectPic_Woman7_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/3.4bpp"); +const u32 gMapObjectPic_Woman7_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/4.4bpp"); +const u32 gMapObjectPic_Woman7_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/5.4bpp"); +const u32 gMapObjectPic_Woman7_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/6.4bpp"); +const u32 gMapObjectPic_Woman7_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/7.4bpp"); +const u32 gMapObjectPic_Woman7_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/8.4bpp"); +const u32 gMapObjectPic_Youngster_0[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/0.4bpp"); +const u32 gMapObjectPic_Youngster_1[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/1.4bpp"); +const u32 gMapObjectPic_Youngster_2[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/2.4bpp"); +const u32 gMapObjectPic_Youngster_3[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/3.4bpp"); +const u32 gMapObjectPic_Youngster_4[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/4.4bpp"); +const u32 gMapObjectPic_Youngster_5[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/5.4bpp"); +const u32 gMapObjectPic_Youngster_6[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/6.4bpp"); +const u32 gMapObjectPic_Youngster_7[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/7.4bpp"); +const u32 gMapObjectPic_Youngster_8[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/8.4bpp"); +const u32 gMapObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/0.4bpp"); +const u32 gMapObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/1.4bpp"); +const u32 gMapObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/2.4bpp"); +const u32 gMapObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/3.4bpp"); +const u32 gMapObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/4.4bpp"); +const u32 gMapObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/5.4bpp"); +const u32 gMapObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/6.4bpp"); +const u32 gMapObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/7.4bpp"); +const u32 gMapObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/8.4bpp"); +const u32 gMapObjectPic_PsychicM_0[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/0.4bpp"); +const u32 gMapObjectPic_PsychicM_1[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/1.4bpp"); +const u32 gMapObjectPic_PsychicM_2[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/2.4bpp"); +const u32 gMapObjectPic_PsychicM_3[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/3.4bpp"); +const u32 gMapObjectPic_PsychicM_4[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/4.4bpp"); +const u32 gMapObjectPic_PsychicM_5[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/5.4bpp"); +const u32 gMapObjectPic_PsychicM_6[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/6.4bpp"); +const u32 gMapObjectPic_PsychicM_7[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/7.4bpp"); +const u32 gMapObjectPic_PsychicM_8[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/8.4bpp"); +const u32 gMapObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/0.4bpp"); +const u32 gMapObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/1.4bpp"); +const u32 gMapObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/2.4bpp"); +const u32 gMapObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/3.4bpp"); +const u32 gMapObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/4.4bpp"); +const u32 gMapObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/5.4bpp"); +const u32 gMapObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/6.4bpp"); +const u32 gMapObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/7.4bpp"); +const u32 gMapObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/8.4bpp"); +const u32 gMapObjectPic_Maniac_0[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/0.4bpp"); +const u32 gMapObjectPic_Maniac_1[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/1.4bpp"); +const u32 gMapObjectPic_Maniac_2[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/2.4bpp"); +const u32 gMapObjectPic_Maniac_3[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/3.4bpp"); +const u32 gMapObjectPic_Maniac_4[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/4.4bpp"); +const u32 gMapObjectPic_Maniac_5[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/5.4bpp"); +const u32 gMapObjectPic_Maniac_6[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/6.4bpp"); +const u32 gMapObjectPic_Maniac_7[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/7.4bpp"); +const u32 gMapObjectPic_Maniac_8[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/8.4bpp"); +const u32 gMapObjectPic_HexManiac_0[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/0.4bpp"); +const u32 gMapObjectPic_HexManiac_1[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/1.4bpp"); +const u32 gMapObjectPic_HexManiac_2[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/2.4bpp"); +const u32 gMapObjectPic_HexManiac_3[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/3.4bpp"); +const u32 gMapObjectPic_HexManiac_4[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/4.4bpp"); +const u32 gMapObjectPic_HexManiac_5[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/5.4bpp"); +const u32 gMapObjectPic_HexManiac_6[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/6.4bpp"); +const u32 gMapObjectPic_HexManiac_7[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/7.4bpp"); +const u32 gMapObjectPic_HexManiac_8[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/8.4bpp"); +const u32 gMapObjectPic_Woman8_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/0.4bpp"); +const u32 gMapObjectPic_Woman8_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/1.4bpp"); +const u32 gMapObjectPic_Woman8_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/2.4bpp"); +const u32 gMapObjectPic_Woman8_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/3.4bpp"); +const u32 gMapObjectPic_Woman8_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/4.4bpp"); +const u32 gMapObjectPic_Woman8_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/5.4bpp"); +const u32 gMapObjectPic_Woman8_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/6.4bpp"); +const u32 gMapObjectPic_Woman8_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/7.4bpp"); +const u32 gMapObjectPic_Woman8_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/8.4bpp"); +const u32 gMapObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/0.4bpp"); +const u32 gMapObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/1.4bpp"); +const u32 gMapObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/2.4bpp"); +const u32 gMapObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/3.4bpp"); +const u32 gMapObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/4.4bpp"); +const u32 gMapObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/5.4bpp"); +const u32 gMapObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/6.4bpp"); +const u32 gMapObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/7.4bpp"); +const u32 gMapObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/8.4bpp"); +const u32 gMapObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/0.4bpp"); +const u32 gMapObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/1.4bpp"); +const u32 gMapObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/2.4bpp"); +const u32 gMapObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/3.4bpp"); +const u32 gMapObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/4.4bpp"); +const u32 gMapObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/5.4bpp"); +const u32 gMapObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/6.4bpp"); +const u32 gMapObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/7.4bpp"); +const u32 gMapObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/8.4bpp"); +const u32 gMapObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/0.4bpp"); +const u32 gMapObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/1.4bpp"); +const u32 gMapObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/2.4bpp"); +const u32 gMapObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/3.4bpp"); +const u32 gMapObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/4.4bpp"); +const u32 gMapObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/5.4bpp"); +const u32 gMapObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/6.4bpp"); +const u32 gMapObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/7.4bpp"); +const u32 gMapObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/8.4bpp"); +const u32 gMapObjectPic_Beauty_0[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/0.4bpp"); +const u32 gMapObjectPic_Beauty_1[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/1.4bpp"); +const u32 gMapObjectPic_Beauty_2[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/2.4bpp"); +const u32 gMapObjectPic_Beauty_3[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/3.4bpp"); +const u32 gMapObjectPic_Beauty_4[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/4.4bpp"); +const u32 gMapObjectPic_Beauty_5[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/5.4bpp"); +const u32 gMapObjectPic_Beauty_6[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/6.4bpp"); +const u32 gMapObjectPic_Beauty_7[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/7.4bpp"); +const u32 gMapObjectPic_Beauty_8[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/8.4bpp"); +const u32 gMapObjectPic_Scientist1_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/0.4bpp"); +const u32 gMapObjectPic_Scientist1_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/1.4bpp"); +const u32 gMapObjectPic_Scientist1_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/2.4bpp"); +const u32 gMapObjectPic_Scientist1_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/3.4bpp"); +const u32 gMapObjectPic_Scientist1_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/4.4bpp"); +const u32 gMapObjectPic_Scientist1_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/5.4bpp"); +const u32 gMapObjectPic_Scientist1_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/6.4bpp"); +const u32 gMapObjectPic_Scientist1_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/7.4bpp"); +const u32 gMapObjectPic_Scientist1_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/8.4bpp"); +const u32 gMapObjectPic_Lass_0[] = INCBIN_U32("graphics/map_objects/pics/people/lass/0.4bpp"); +const u32 gMapObjectPic_Lass_1[] = INCBIN_U32("graphics/map_objects/pics/people/lass/1.4bpp"); +const u32 gMapObjectPic_Lass_2[] = INCBIN_U32("graphics/map_objects/pics/people/lass/2.4bpp"); +const u32 gMapObjectPic_Lass_3[] = INCBIN_U32("graphics/map_objects/pics/people/lass/3.4bpp"); +const u32 gMapObjectPic_Lass_4[] = INCBIN_U32("graphics/map_objects/pics/people/lass/4.4bpp"); +const u32 gMapObjectPic_Lass_5[] = INCBIN_U32("graphics/map_objects/pics/people/lass/5.4bpp"); +const u32 gMapObjectPic_Lass_6[] = INCBIN_U32("graphics/map_objects/pics/people/lass/6.4bpp"); +const u32 gMapObjectPic_Lass_7[] = INCBIN_U32("graphics/map_objects/pics/people/lass/7.4bpp"); +const u32 gMapObjectPic_Lass_8[] = INCBIN_U32("graphics/map_objects/pics/people/lass/8.4bpp"); +const u32 gMapObjectPic_Gentleman_0[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/0.4bpp"); +const u32 gMapObjectPic_Gentleman_1[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/1.4bpp"); +const u32 gMapObjectPic_Gentleman_2[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/2.4bpp"); +const u32 gMapObjectPic_Gentleman_3[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/3.4bpp"); +const u32 gMapObjectPic_Gentleman_4[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/4.4bpp"); +const u32 gMapObjectPic_Gentleman_5[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/5.4bpp"); +const u32 gMapObjectPic_Gentleman_6[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/6.4bpp"); +const u32 gMapObjectPic_Gentleman_7[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/7.4bpp"); +const u32 gMapObjectPic_Gentleman_8[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/8.4bpp"); +const u32 gMapObjectPic_Sailor_0[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/0.4bpp"); +const u32 gMapObjectPic_Sailor_1[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/1.4bpp"); +const u32 gMapObjectPic_Sailor_2[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/2.4bpp"); +const u32 gMapObjectPic_Sailor_3[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/3.4bpp"); +const u32 gMapObjectPic_Sailor_4[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/4.4bpp"); +const u32 gMapObjectPic_Sailor_5[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/5.4bpp"); +const u32 gMapObjectPic_Sailor_6[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/6.4bpp"); +const u32 gMapObjectPic_Sailor_7[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/7.4bpp"); +const u32 gMapObjectPic_Sailor_8[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/8.4bpp"); +const u32 gMapObjectPic_Fisherman_0[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/0.4bpp"); +const u32 gMapObjectPic_Fisherman_1[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/1.4bpp"); +const u32 gMapObjectPic_Fisherman_2[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/2.4bpp"); +const u32 gMapObjectPic_Fisherman_3[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/3.4bpp"); +const u32 gMapObjectPic_Fisherman_4[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/4.4bpp"); +const u32 gMapObjectPic_Fisherman_5[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/5.4bpp"); +const u32 gMapObjectPic_Fisherman_6[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/6.4bpp"); +const u32 gMapObjectPic_Fisherman_7[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/7.4bpp"); +const u32 gMapObjectPic_Fisherman_8[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/8.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/0.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/1.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/2.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/3.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/4.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/5.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/6.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/7.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/8.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/0.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/1.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/2.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/3.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/4.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/5.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/6.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/7.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/8.4bpp"); +const u32 gMapObjectPic_TuberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/0.4bpp"); +const u32 gMapObjectPic_TuberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/1.4bpp"); +const u32 gMapObjectPic_TuberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/2.4bpp"); +const u32 gMapObjectPic_TuberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/3.4bpp"); +const u32 gMapObjectPic_TuberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/4.4bpp"); +const u32 gMapObjectPic_TuberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/5.4bpp"); +const u32 gMapObjectPic_TuberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/6.4bpp"); +const u32 gMapObjectPic_TuberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/7.4bpp"); +const u32 gMapObjectPic_TuberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/8.4bpp"); +const u32 gMapObjectPic_TuberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/0.4bpp"); +const u32 gMapObjectPic_TuberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/1.4bpp"); +const u32 gMapObjectPic_TuberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/2.4bpp"); +const u32 gMapObjectPic_TuberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/3.4bpp"); +const u32 gMapObjectPic_TuberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/4.4bpp"); +const u32 gMapObjectPic_TuberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/5.4bpp"); +const u32 gMapObjectPic_TuberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/6.4bpp"); +const u32 gMapObjectPic_TuberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/7.4bpp"); +const u32 gMapObjectPic_TuberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/8.4bpp"); +const u32 gMapObjectPic_Hiker_0[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/0.4bpp"); +const u32 gMapObjectPic_Hiker_1[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/1.4bpp"); +const u32 gMapObjectPic_Hiker_2[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/2.4bpp"); +const u32 gMapObjectPic_Hiker_3[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/3.4bpp"); +const u32 gMapObjectPic_Hiker_4[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/4.4bpp"); +const u32 gMapObjectPic_Hiker_5[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/5.4bpp"); +const u32 gMapObjectPic_Hiker_6[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/6.4bpp"); +const u32 gMapObjectPic_Hiker_7[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/7.4bpp"); +const u32 gMapObjectPic_Hiker_8[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/8.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/0.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/1.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/2.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/3.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/4.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/5.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/6.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/7.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/8.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/0.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/1.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/2.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/3.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/4.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/5.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/6.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/7.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/8.4bpp"); +const u32 gMapObjectPic_Man5_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/0.4bpp"); +const u32 gMapObjectPic_Man5_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/1.4bpp"); +const u32 gMapObjectPic_Man5_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/2.4bpp"); +const u32 gMapObjectPic_Man5_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/3.4bpp"); +const u32 gMapObjectPic_Man5_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/4.4bpp"); +const u32 gMapObjectPic_Man5_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/5.4bpp"); +const u32 gMapObjectPic_Man5_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/6.4bpp"); +const u32 gMapObjectPic_Man5_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/7.4bpp"); +const u32 gMapObjectPic_Man5_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/8.4bpp"); +const u32 gMapObjectPic_Man6_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/0.4bpp"); +const u32 gMapObjectPic_Man6_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/1.4bpp"); +const u32 gMapObjectPic_Man6_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/2.4bpp"); +const u32 gMapObjectPic_Man6_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/3.4bpp"); +const u32 gMapObjectPic_Man6_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/4.4bpp"); +const u32 gMapObjectPic_Man6_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/5.4bpp"); +const u32 gMapObjectPic_Man6_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/6.4bpp"); +const u32 gMapObjectPic_Man6_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/7.4bpp"); +const u32 gMapObjectPic_Man6_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/8.4bpp"); +const u32 gMapObjectPic_Nurse_0[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/0.4bpp"); +const u32 gMapObjectPic_Nurse_1[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/1.4bpp"); +const u32 gMapObjectPic_Nurse_2[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/2.4bpp"); +const u32 gMapObjectPic_Nurse_3[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/3.4bpp"); +const u32 gMapObjectPic_Nurse_4[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/4.4bpp"); +const u32 gMapObjectPic_Nurse_5[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/5.4bpp"); +const u32 gMapObjectPic_Nurse_6[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/6.4bpp"); +const u32 gMapObjectPic_Nurse_7[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/7.4bpp"); +const u32 gMapObjectPic_Nurse_8[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/8.4bpp"); +const u32 gMapObjectPic_Nurse_9[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/9.4bpp"); +const u32 gMapObjectPic_ItemBall[] = INCBIN_U32("graphics/map_objects/pics/misc/item_ball.4bpp"); +const u32 gMapObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/0.4bpp"); +const u32 gMapObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/1.4bpp"); +const u32 gMapObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/2.4bpp"); +const u32 gMapObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/3.4bpp"); +const u32 gMapObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/4.4bpp"); +const u32 gMapObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/5.4bpp"); +const u32 gMapObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/6.4bpp"); +const u32 gMapObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/7.4bpp"); +const u32 gMapObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/8.4bpp"); +const u32 gMapObjectPic_ReporterM_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/0.4bpp"); +const u32 gMapObjectPic_ReporterM_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/1.4bpp"); +const u32 gMapObjectPic_ReporterM_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/2.4bpp"); +const u32 gMapObjectPic_ReporterM_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/3.4bpp"); +const u32 gMapObjectPic_ReporterM_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/4.4bpp"); +const u32 gMapObjectPic_ReporterM_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/5.4bpp"); +const u32 gMapObjectPic_ReporterM_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/6.4bpp"); +const u32 gMapObjectPic_ReporterM_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/7.4bpp"); +const u32 gMapObjectPic_ReporterM_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/8.4bpp"); +const u32 gMapObjectPic_ReporterF_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/0.4bpp"); +const u32 gMapObjectPic_ReporterF_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/1.4bpp"); +const u32 gMapObjectPic_ReporterF_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/2.4bpp"); +const u32 gMapObjectPic_ReporterF_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/3.4bpp"); +const u32 gMapObjectPic_ReporterF_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/4.4bpp"); +const u32 gMapObjectPic_ReporterF_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/5.4bpp"); +const u32 gMapObjectPic_ReporterF_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/6.4bpp"); +const u32 gMapObjectPic_ReporterF_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/7.4bpp"); +const u32 gMapObjectPic_ReporterF_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/8.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/0.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/1.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/2.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/3.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/4.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/5.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/6.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/7.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/8.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/0.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/1.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/2.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/3.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/4.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/5.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/6.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/7.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/8.4bpp"); +const u32 gMapObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/0.4bpp"); +const u32 gMapObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/1.4bpp"); +const u32 gMapObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/2.4bpp"); +const u32 gMapObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/3.4bpp"); +const u32 gMapObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/4.4bpp"); +const u32 gMapObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/5.4bpp"); +const u32 gMapObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/6.4bpp"); +const u32 gMapObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/7.4bpp"); +const u32 gMapObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/8.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/0.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/1.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/2.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/3.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/4.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/5.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/6.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/7.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/8.4bpp"); +const u32 gMapObjectPic_Teala_0[] = INCBIN_U32("graphics/map_objects/pics/people/teala/0.4bpp"); +const u32 gMapObjectPic_Teala_1[] = INCBIN_U32("graphics/map_objects/pics/people/teala/1.4bpp"); +const u32 gMapObjectPic_Teala_2[] = INCBIN_U32("graphics/map_objects/pics/people/teala/2.4bpp"); +const u32 gMapObjectPic_Teala_3[] = INCBIN_U32("graphics/map_objects/pics/people/teala/3.4bpp"); +const u32 gMapObjectPic_Teala_4[] = INCBIN_U32("graphics/map_objects/pics/people/teala/4.4bpp"); +const u32 gMapObjectPic_Teala_5[] = INCBIN_U32("graphics/map_objects/pics/people/teala/5.4bpp"); +const u32 gMapObjectPic_Teala_6[] = INCBIN_U32("graphics/map_objects/pics/people/teala/6.4bpp"); +const u32 gMapObjectPic_Teala_7[] = INCBIN_U32("graphics/map_objects/pics/people/teala/7.4bpp"); +const u32 gMapObjectPic_Teala_8[] = INCBIN_U32("graphics/map_objects/pics/people/teala/8.4bpp"); +const u32 gMapObjectPic_Artist_0[] = INCBIN_U32("graphics/map_objects/pics/people/artist/0.4bpp"); +const u32 gMapObjectPic_Artist_1[] = INCBIN_U32("graphics/map_objects/pics/people/artist/1.4bpp"); +const u32 gMapObjectPic_Artist_2[] = INCBIN_U32("graphics/map_objects/pics/people/artist/2.4bpp"); +const u32 gMapObjectPic_Artist_3[] = INCBIN_U32("graphics/map_objects/pics/people/artist/3.4bpp"); +const u32 gMapObjectPic_Artist_4[] = INCBIN_U32("graphics/map_objects/pics/people/artist/4.4bpp"); +const u32 gMapObjectPic_Artist_5[] = INCBIN_U32("graphics/map_objects/pics/people/artist/5.4bpp"); +const u32 gMapObjectPic_Artist_6[] = INCBIN_U32("graphics/map_objects/pics/people/artist/6.4bpp"); +const u32 gMapObjectPic_Artist_7[] = INCBIN_U32("graphics/map_objects/pics/people/artist/7.4bpp"); +const u32 gMapObjectPic_Artist_8[] = INCBIN_U32("graphics/map_objects/pics/people/artist/8.4bpp"); +const u32 gMapObjectPic_Cameraman_0[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/0.4bpp"); +const u32 gMapObjectPic_Cameraman_1[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/1.4bpp"); +const u32 gMapObjectPic_Cameraman_2[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/2.4bpp"); +const u32 gMapObjectPic_Cameraman_3[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/3.4bpp"); +const u32 gMapObjectPic_Cameraman_4[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/4.4bpp"); +const u32 gMapObjectPic_Cameraman_5[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/5.4bpp"); +const u32 gMapObjectPic_Cameraman_6[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/6.4bpp"); +const u32 gMapObjectPic_Cameraman_7[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/7.4bpp"); +const u32 gMapObjectPic_Cameraman_8[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/8.4bpp"); +const u32 gMapObjectPic_Scientist2_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/0.4bpp"); +const u32 gMapObjectPic_Scientist2_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/1.4bpp"); +const u32 gMapObjectPic_Scientist2_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/2.4bpp"); +const u32 gMapObjectPic_Scientist2_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/3.4bpp"); +const u32 gMapObjectPic_Scientist2_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/4.4bpp"); +const u32 gMapObjectPic_Scientist2_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/5.4bpp"); +const u32 gMapObjectPic_Scientist2_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/6.4bpp"); +const u32 gMapObjectPic_Scientist2_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/7.4bpp"); +const u32 gMapObjectPic_Scientist2_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/8.4bpp"); +const u32 gMapObjectPic_Man7_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/0.4bpp"); +const u32 gMapObjectPic_Man7_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/1.4bpp"); +const u32 gMapObjectPic_Man7_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/2.4bpp"); +const u32 gMapObjectPic_Man7_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/3.4bpp"); +const u32 gMapObjectPic_Man7_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/4.4bpp"); +const u32 gMapObjectPic_Man7_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/5.4bpp"); +const u32 gMapObjectPic_Man7_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/6.4bpp"); +const u32 gMapObjectPic_Man7_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/7.4bpp"); +const u32 gMapObjectPic_Man7_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/8.4bpp"); +const u32 gMapObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/0.4bpp"); +const u32 gMapObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/1.4bpp"); +const u32 gMapObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/2.4bpp"); +const u32 gMapObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/3.4bpp"); +const u32 gMapObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/4.4bpp"); +const u32 gMapObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/5.4bpp"); +const u32 gMapObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/6.4bpp"); +const u32 gMapObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/7.4bpp"); +const u32 gMapObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/8.4bpp"); +const u32 gMapObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/0.4bpp"); +const u32 gMapObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/1.4bpp"); +const u32 gMapObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/2.4bpp"); +const u32 gMapObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/3.4bpp"); +const u32 gMapObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/4.4bpp"); +const u32 gMapObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/5.4bpp"); +const u32 gMapObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/6.4bpp"); +const u32 gMapObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/7.4bpp"); +const u32 gMapObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/8.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/0.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/1.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/2.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/3.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/4.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/5.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/6.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/7.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/8.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/0.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/1.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/2.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/3.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/4.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/5.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/6.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/7.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/8.4bpp"); +const u32 gMapObjectPic_Sidney_0[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/0.4bpp"); +const u32 gMapObjectPic_Sidney_1[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/1.4bpp"); +const u32 gMapObjectPic_Sidney_2[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/2.4bpp"); +const u32 gMapObjectPic_Phoebe_0[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/0.4bpp"); +const u32 gMapObjectPic_Phoebe_1[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/1.4bpp"); +const u32 gMapObjectPic_Phoebe_2[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/2.4bpp"); +const u32 gMapObjectPic_Glacia_0[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/0.4bpp"); +const u32 gMapObjectPic_Glacia_1[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/1.4bpp"); +const u32 gMapObjectPic_Glacia_2[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/2.4bpp"); +const u32 gMapObjectPic_Drake_0[] = INCBIN_U32("graphics/map_objects/pics/people/drake/0.4bpp"); +const u32 gMapObjectPic_Drake_1[] = INCBIN_U32("graphics/map_objects/pics/people/drake/1.4bpp"); +const u32 gMapObjectPic_Drake_2[] = INCBIN_U32("graphics/map_objects/pics/people/drake/2.4bpp"); +const u32 gMapObjectPic_Roxanne_0[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/0.4bpp"); +const u32 gMapObjectPic_Roxanne_1[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/1.4bpp"); +const u32 gMapObjectPic_Roxanne_2[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/2.4bpp"); +const u32 gMapObjectPic_Brawly_0[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/0.4bpp"); +const u32 gMapObjectPic_Brawly_1[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/1.4bpp"); +const u32 gMapObjectPic_Brawly_2[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/2.4bpp"); +const u32 gMapObjectPic_Wattson_0[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/0.4bpp"); +const u32 gMapObjectPic_Wattson_1[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/1.4bpp"); +const u32 gMapObjectPic_Wattson_2[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/2.4bpp"); +const u32 gMapObjectPic_Flannery_0[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/0.4bpp"); +const u32 gMapObjectPic_Flannery_1[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/1.4bpp"); +const u32 gMapObjectPic_Flannery_2[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/2.4bpp"); +const u32 gMapObjectPic_Norman_0[] = INCBIN_U32("graphics/map_objects/pics/people/norman/0.4bpp"); +const u32 gMapObjectPic_Norman_1[] = INCBIN_U32("graphics/map_objects/pics/people/norman/1.4bpp"); +const u32 gMapObjectPic_Norman_2[] = INCBIN_U32("graphics/map_objects/pics/people/norman/2.4bpp"); +const u32 gMapObjectPic_Norman_3[] = INCBIN_U32("graphics/map_objects/pics/people/norman/3.4bpp"); +const u32 gMapObjectPic_Norman_4[] = INCBIN_U32("graphics/map_objects/pics/people/norman/4.4bpp"); +const u32 gMapObjectPic_Norman_5[] = INCBIN_U32("graphics/map_objects/pics/people/norman/5.4bpp"); +const u32 gMapObjectPic_Norman_6[] = INCBIN_U32("graphics/map_objects/pics/people/norman/6.4bpp"); +const u32 gMapObjectPic_Norman_7[] = INCBIN_U32("graphics/map_objects/pics/people/norman/7.4bpp"); +const u32 gMapObjectPic_Norman_8[] = INCBIN_U32("graphics/map_objects/pics/people/norman/8.4bpp"); +const u32 gMapObjectPic_Winona_0[] = INCBIN_U32("graphics/map_objects/pics/people/winona/0.4bpp"); +const u32 gMapObjectPic_Winona_1[] = INCBIN_U32("graphics/map_objects/pics/people/winona/1.4bpp"); +const u32 gMapObjectPic_Winona_2[] = INCBIN_U32("graphics/map_objects/pics/people/winona/2.4bpp"); +const u32 gMapObjectPic_Liza_0[] = INCBIN_U32("graphics/map_objects/pics/people/liza/0.4bpp"); +const u32 gMapObjectPic_Liza_1[] = INCBIN_U32("graphics/map_objects/pics/people/liza/1.4bpp"); +const u32 gMapObjectPic_Liza_2[] = INCBIN_U32("graphics/map_objects/pics/people/liza/2.4bpp"); +const u32 gMapObjectPic_Tate_0[] = INCBIN_U32("graphics/map_objects/pics/people/tate/0.4bpp"); +const u32 gMapObjectPic_Tate_1[] = INCBIN_U32("graphics/map_objects/pics/people/tate/1.4bpp"); +const u32 gMapObjectPic_Tate_2[] = INCBIN_U32("graphics/map_objects/pics/people/tate/2.4bpp"); +const u32 gMapObjectPic_Wallace_0[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/0.4bpp"); +const u32 gMapObjectPic_Wallace_1[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/1.4bpp"); +const u32 gMapObjectPic_Wallace_2[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/2.4bpp"); +const u32 gMapObjectPic_Wallace_3[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/3.4bpp"); +const u32 gMapObjectPic_Wallace_4[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/4.4bpp"); +const u32 gMapObjectPic_Wallace_5[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/5.4bpp"); +const u32 gMapObjectPic_Wallace_6[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/6.4bpp"); +const u32 gMapObjectPic_Wallace_7[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/7.4bpp"); +const u32 gMapObjectPic_Wallace_8[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/8.4bpp"); +const u32 gMapObjectPic_Steven_0[] = INCBIN_U32("graphics/map_objects/pics/people/steven/0.4bpp"); +const u32 gMapObjectPic_Steven_1[] = INCBIN_U32("graphics/map_objects/pics/people/steven/1.4bpp"); +const u32 gMapObjectPic_Steven_2[] = INCBIN_U32("graphics/map_objects/pics/people/steven/2.4bpp"); +const u32 gMapObjectPic_Steven_3[] = INCBIN_U32("graphics/map_objects/pics/people/steven/3.4bpp"); +const u32 gMapObjectPic_Steven_4[] = INCBIN_U32("graphics/map_objects/pics/people/steven/4.4bpp"); +const u32 gMapObjectPic_Steven_5[] = INCBIN_U32("graphics/map_objects/pics/people/steven/5.4bpp"); +const u32 gMapObjectPic_Steven_6[] = INCBIN_U32("graphics/map_objects/pics/people/steven/6.4bpp"); +const u32 gMapObjectPic_Steven_7[] = INCBIN_U32("graphics/map_objects/pics/people/steven/7.4bpp"); +const u32 gMapObjectPic_Steven_8[] = INCBIN_U32("graphics/map_objects/pics/people/steven/8.4bpp"); +const u32 gMapObjectPic_Wally_0[] = INCBIN_U32("graphics/map_objects/pics/people/wally/0.4bpp"); +const u32 gMapObjectPic_Wally_1[] = INCBIN_U32("graphics/map_objects/pics/people/wally/1.4bpp"); +const u32 gMapObjectPic_Wally_2[] = INCBIN_U32("graphics/map_objects/pics/people/wally/2.4bpp"); +const u32 gMapObjectPic_Wally_3[] = INCBIN_U32("graphics/map_objects/pics/people/wally/3.4bpp"); +const u32 gMapObjectPic_Wally_4[] = INCBIN_U32("graphics/map_objects/pics/people/wally/4.4bpp"); +const u32 gMapObjectPic_Wally_5[] = INCBIN_U32("graphics/map_objects/pics/people/wally/5.4bpp"); +const u32 gMapObjectPic_Wally_6[] = INCBIN_U32("graphics/map_objects/pics/people/wally/6.4bpp"); +const u32 gMapObjectPic_Wally_7[] = INCBIN_U32("graphics/map_objects/pics/people/wally/7.4bpp"); +const u32 gMapObjectPic_Wally_8[] = INCBIN_U32("graphics/map_objects/pics/people/wally/8.4bpp"); +const u32 gMapObjectPic_LittleBoy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/0.4bpp"); +const u32 gMapObjectPic_LittleBoy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/1.4bpp"); +const u32 gMapObjectPic_LittleBoy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/2.4bpp"); +const u32 gMapObjectPic_LittleBoy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/3.4bpp"); +const u32 gMapObjectPic_LittleBoy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/4.4bpp"); +const u32 gMapObjectPic_LittleBoy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/5.4bpp"); +const u32 gMapObjectPic_LittleBoy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/6.4bpp"); +const u32 gMapObjectPic_LittleBoy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/7.4bpp"); +const u32 gMapObjectPic_LittleBoy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/8.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/0.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/1.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/2.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/3.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/4.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/5.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/6.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/7.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/8.4bpp"); +const u32 gMapObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/0.4bpp"); +const u32 gMapObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/1.4bpp"); +const u32 gMapObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/2.4bpp"); +const u32 gMapObjectPic_Boy5_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/0.4bpp"); +const u32 gMapObjectPic_Boy5_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/1.4bpp"); +const u32 gMapObjectPic_Boy5_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/2.4bpp"); +const u32 gMapObjectPic_ContestJudge_0[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/0.4bpp"); +const u32 gMapObjectPic_ContestJudge_1[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/1.4bpp"); +const u32 gMapObjectPic_ContestJudge_2[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/2.4bpp"); +const u32 gMapObjectPic_ContestJudge_3[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/3.4bpp"); +const u32 gMapObjectPic_ContestJudge_4[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/4.4bpp"); +const u32 gMapObjectPic_ContestJudge_5[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/5.4bpp"); +const u32 gMapObjectPic_ContestJudge_6[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/6.4bpp"); +const u32 gMapObjectPic_ContestJudge_7[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/7.4bpp"); +const u32 gMapObjectPic_ContestJudge_8[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/8.4bpp"); +const u32 gMapObjectPic_Archie_0[] = INCBIN_U32("graphics/map_objects/pics/people/archie/0.4bpp"); +const u32 gMapObjectPic_Archie_1[] = INCBIN_U32("graphics/map_objects/pics/people/archie/1.4bpp"); +const u32 gMapObjectPic_Archie_2[] = INCBIN_U32("graphics/map_objects/pics/people/archie/2.4bpp"); +const u32 gMapObjectPic_Archie_3[] = INCBIN_U32("graphics/map_objects/pics/people/archie/3.4bpp"); +const u32 gMapObjectPic_Archie_4[] = INCBIN_U32("graphics/map_objects/pics/people/archie/4.4bpp"); +const u32 gMapObjectPic_Archie_5[] = INCBIN_U32("graphics/map_objects/pics/people/archie/5.4bpp"); +const u32 gMapObjectPic_Archie_6[] = INCBIN_U32("graphics/map_objects/pics/people/archie/6.4bpp"); +const u32 gMapObjectPic_Archie_7[] = INCBIN_U32("graphics/map_objects/pics/people/archie/7.4bpp"); +const u32 gMapObjectPic_Archie_8[] = INCBIN_U32("graphics/map_objects/pics/people/archie/8.4bpp"); +const u32 gMapObjectPic_Maxie_0[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/0.4bpp"); +const u32 gMapObjectPic_Maxie_1[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/1.4bpp"); +const u32 gMapObjectPic_Maxie_2[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/2.4bpp"); +const u32 gMapObjectPic_Maxie_3[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/3.4bpp"); +const u32 gMapObjectPic_Maxie_4[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/4.4bpp"); +const u32 gMapObjectPic_Maxie_5[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/5.4bpp"); +const u32 gMapObjectPic_Maxie_6[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/6.4bpp"); +const u32 gMapObjectPic_Maxie_7[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/7.4bpp"); +const u32 gMapObjectPic_Maxie_8[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/8.4bpp"); +const u32 gMapObjectPic_Kyogre_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/0.4bpp"); +const u32 gMapObjectPic_Kyogre_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/1.4bpp"); +const u32 gMapObjectPic_Groudon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/0.4bpp"); +const u32 gMapObjectPic_Groudon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/1.4bpp"); +const u32 gMapObjectPic_Regi[] = INCBIN_U32("graphics/map_objects/pics/pokemon/regi.4bpp"); +const u32 gMapObjectPic_Skitty_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/0.4bpp"); +const u32 gMapObjectPic_Skitty_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/1.4bpp"); +const u32 gMapObjectPic_Skitty_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/2.4bpp"); +const u32 gMapObjectPic_Kecleon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/0.4bpp"); +const u32 gMapObjectPic_Kecleon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/1.4bpp"); +const u32 gMapObjectPic_Kecleon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/2.4bpp"); +const u32 gMapObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/0.4bpp"); +const u32 gMapObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/1.4bpp"); +const u32 gMapObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/0.4bpp"); +const u32 gMapObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/1.4bpp"); +const u32 gMapObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/2.4bpp"); +const u32 gMapObjectPic_Pikachu_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/0.4bpp"); +const u32 gMapObjectPic_Pikachu_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/1.4bpp"); +const u32 gMapObjectPic_Pikachu_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/2.4bpp"); +const u32 gMapObjectPic_Azumarill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/0.4bpp"); +const u32 gMapObjectPic_Azumarill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/1.4bpp"); +const u32 gMapObjectPic_Azumarill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/2.4bpp"); +const u32 gMapObjectPic_Wingull_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/0.4bpp"); +const u32 gMapObjectPic_Wingull_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/3.4bpp"); +const u32 gMapObjectPic_Wingull_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/1.4bpp"); +const u32 gMapObjectPic_Wingull_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/4.4bpp"); +const u32 gMapObjectPic_Wingull_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/2.4bpp"); +const u32 gMapObjectPic_Wingull_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/5.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/0.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/1.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/2.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/3.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/4.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/5.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/6.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/7.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/8.4bpp"); +const u32 gMapObjectPic_Azurill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/0.4bpp"); +const u32 gMapObjectPic_Azurill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/1.4bpp"); +const u32 gMapObjectPic_Azurill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/2.4bpp"); +const u32 gMapObjectPic_Mom_0[] = INCBIN_U32("graphics/map_objects/pics/people/mom/0.4bpp"); +const u32 gMapObjectPic_Mom_1[] = INCBIN_U32("graphics/map_objects/pics/people/mom/1.4bpp"); +const u32 gMapObjectPic_Mom_2[] = INCBIN_U32("graphics/map_objects/pics/people/mom/2.4bpp"); +const u32 gMapObjectPic_Mom_3[] = INCBIN_U32("graphics/map_objects/pics/people/mom/3.4bpp"); +const u32 gMapObjectPic_Mom_4[] = INCBIN_U32("graphics/map_objects/pics/people/mom/4.4bpp"); +const u32 gMapObjectPic_Mom_5[] = INCBIN_U32("graphics/map_objects/pics/people/mom/5.4bpp"); +const u32 gMapObjectPic_Mom_6[] = INCBIN_U32("graphics/map_objects/pics/people/mom/6.4bpp"); +const u32 gMapObjectPic_Mom_7[] = INCBIN_U32("graphics/map_objects/pics/people/mom/7.4bpp"); +const u32 gMapObjectPic_Mom_8[] = INCBIN_U32("graphics/map_objects/pics/people/mom/8.4bpp"); +const u16 gMapObjectPalette22[] = INCBIN_U16("graphics/map_objects/palettes/22.gbapal"); +const u16 gMapObjectPalette23[] = INCBIN_U16("graphics/map_objects/palettes/23.gbapal"); +const u16 gMapObjectPalette24[] = INCBIN_U16("graphics/map_objects/palettes/24.gbapal"); +const u16 gMapObjectPalette25[] = INCBIN_U16("graphics/map_objects/palettes/25.gbapal"); +const u32 gMapObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_natu_doll.4bpp"); +const u32 gMapObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_magnemite_doll.4bpp"); +const u32 gMapObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_squirtle_doll.4bpp"); +const u32 gMapObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_wooper_doll.4bpp"); +const u32 gMapObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_pikachu_doll.4bpp"); +const u32 gMapObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_porygon2_doll.4bpp"); +const u32 gMapObjectPic_PichuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pichu_doll.4bpp"); +const u32 gMapObjectPic_PikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pikachu_doll.4bpp"); +const u32 gMapObjectPic_MarillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/marill_doll.4bpp"); +const u32 gMapObjectPic_TogepiDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/togepi_doll.4bpp"); +const u32 gMapObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/cyndaquil_doll.4bpp"); +const u32 gMapObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/chikorita_doll.4bpp"); +const u32 gMapObjectPic_TotodileDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/totodile_doll.4bpp"); +const u32 gMapObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/jigglypuff_doll.4bpp"); +const u32 gMapObjectPic_MeowthDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/meowth_doll.4bpp"); +const u32 gMapObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/clefairy_doll.4bpp"); +const u32 gMapObjectPic_DittoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/ditto_doll.4bpp"); +const u32 gMapObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/smoochum_doll.4bpp"); +const u32 gMapObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/treecko_doll.4bpp"); +const u32 gMapObjectPic_TorchicDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/torchic_doll.4bpp"); +const u32 gMapObjectPic_MudkipDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/mudkip_doll.4bpp"); +const u32 gMapObjectPic_DuskullDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/duskull_doll.4bpp"); +const u32 gMapObjectPic_WynautDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/wynaut_doll.4bpp"); +const u32 gMapObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/baltoy_doll.4bpp"); +const u32 gMapObjectPic_KecleonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/kecleon_doll.4bpp"); +const u32 gMapObjectPic_AzurillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/azurill_doll.4bpp"); +const u32 gMapObjectPic_SkittyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/skitty_doll.4bpp"); +const u32 gMapObjectPic_SwabluDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/swablu_doll.4bpp"); +const u32 gMapObjectPic_GulpinDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/gulpin_doll.4bpp"); +const u32 gMapObjectPic_LotadDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/lotad_doll.4bpp"); +const u32 gMapObjectPic_SeedotDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/seedot_doll.4bpp"); +const u32 gMapObjectPic_PikaCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/pika_cushion.4bpp"); +const u32 gMapObjectPic_RoundCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/round_cushion.4bpp"); +const u32 gMapObjectPic_KissCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/kiss_cushion.4bpp"); +const u32 gMapObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/zigzag_cushion.4bpp"); +const u32 gMapObjectPic_SpinCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/spin_cushion.4bpp"); +const u32 gMapObjectPic_DiamondCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/diamond_cushion.4bpp"); +const u32 gMapObjectPic_BallCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/ball_cushion.4bpp"); +const u32 gMapObjectPic_GrassCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/grass_cushion.4bpp"); +const u32 gMapObjectPic_FireCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/fire_cushion.4bpp"); +const u32 gMapObjectPic_WaterCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/water_cushion.4bpp"); +const u32 gMapObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_snorlax_doll.4bpp"); +const u32 gMapObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_rhydon_doll.4bpp"); +const u32 gMapObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_lapras_doll.4bpp"); +const u32 gMapObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_venusaur_doll.4bpp"); +const u32 gMapObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_charizard_doll.4bpp"); +const u32 gMapObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_blastoise_doll.4bpp"); +const u32 gMapObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_wailmer_doll.4bpp"); +const u32 gMapObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regirock_doll.4bpp"); +const u32 gMapObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regice_doll.4bpp"); +const u32 gMapObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_registeel_doll.4bpp"); +const u32 gMapObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/0.4bpp"); +const u32 gMapObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/1.4bpp"); +const u32 gMapObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/2.4bpp"); +const u32 gMapObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/3.4bpp"); +const u32 gMapObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/0.4bpp"); +const u32 gMapObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/1.4bpp"); +const u32 gMapObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/2.4bpp"); +const u32 gMapObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/3.4bpp"); +const u32 gMapObjectPic_PushableBoulder[] = INCBIN_U32("graphics/map_objects/pics/misc/pushable_boulder.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/0.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/1.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/2.4bpp"); +const u32 gMapObjectPic_Fossil[] = INCBIN_U32("graphics/map_objects/pics/misc/fossil.4bpp"); +const u32 gMapObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/map_objects/pics/misc/submarine_shadow.4bpp"); +const u16 gMapObjectPalette26[] = INCBIN_U16("graphics/map_objects/palettes/26.gbapal"); +const u32 gMapObjectPic_Truck[] = INCBIN_U32("graphics/map_objects/pics/misc/truck.4bpp"); +const u16 gMapObjectPalette14[] = INCBIN_U16("graphics/map_objects/palettes/14.gbapal"); +const u32 gMapObjectPic_MachokeCarryingBox_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/0.4bpp"); +const u32 gMapObjectPic_MachokeCarryingBox_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/1.4bpp"); +const u32 gMapObjectPic_MachokeCarryingBox_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/2.4bpp"); +const u32 gMapObjectPic_MachokeFacingAway_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/0.4bpp"); +const u32 gMapObjectPic_MachokeFacingAway_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/1.4bpp"); +const u16 gMapObjectPalette15[] = INCBIN_U16("graphics/map_objects/palettes/15.gbapal"); +const u32 gMapObjectPic_BirchsBag[] = INCBIN_U32("graphics/map_objects/pics/misc/birchs_bag.4bpp"); +const u32 gMapObjectPic_Poochyena_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/0.4bpp"); +const u32 gMapObjectPic_Poochyena_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/1.4bpp"); +const u32 gMapObjectPic_Poochyena_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/2.4bpp"); +const u32 gMapObjectPic_Poochyena_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/3.4bpp"); +const u32 gMapObjectPic_Poochyena_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/4.4bpp"); +const u32 gMapObjectPic_Poochyena_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/5.4bpp"); +const u32 gMapObjectPic_Poochyena_6[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/6.4bpp"); +const u32 gMapObjectPic_Poochyena_7[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/7.4bpp"); +const u32 gMapObjectPic_Poochyena_8[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/8.4bpp"); +const u16 gMapObjectPalette16[] = INCBIN_U16("graphics/map_objects/palettes/16.gbapal"); +const u32 gMapObjectPic_CableCar[] = INCBIN_U32("graphics/map_objects/pics/misc/cable_car.4bpp"); +const u16 gMapObjectPalette20[] = INCBIN_U16("graphics/map_objects/palettes/20.gbapal"); +const u32 gMapObjectPic_SSTidal[] = INCBIN_U32("graphics/map_objects/pics/misc/ss_tidal.4bpp"); +const u16 gMapObjectPalette21[] = INCBIN_U16("graphics/map_objects/palettes/21.gbapal"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/0.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/1.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/2.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/3.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/4.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/5.4bpp"); +const u32 gMapObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/dirt_pile.4bpp"); +const u32 gMapObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/0.4bpp"); +const u32 gMapObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/1.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/0.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/1.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/2.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/3.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/4.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/5.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/0.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/1.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/2.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/3.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/4.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/5.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/0.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/1.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/2.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/3.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/4.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/5.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/0.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/1.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/2.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/3.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/4.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/5.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/0.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/1.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/2.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/3.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/4.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/5.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/0.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/1.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/2.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/3.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/4.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/5.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/0.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/1.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/2.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/3.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/4.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/5.4bpp"); +const u32 gMapObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/0.4bpp"); +const u32 gMapObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/1.4bpp"); +const u32 gMapObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/2.4bpp"); +const u32 gMapObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/3.4bpp"); +const u32 gMapObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/4.4bpp"); +const u32 gMapObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/5.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/0.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/1.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/2.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/3.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/4.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/5.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/0.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/1.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/2.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/3.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/4.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/5.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/0.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/1.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/2.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/3.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/4.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/5.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/0.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/1.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/2.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/3.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/4.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/5.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/0.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/1.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/2.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/3.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/4.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/5.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/0.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/1.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/2.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/3.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/4.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/5.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/0.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/1.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/2.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/3.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/4.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/5.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/0.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/1.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/2.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/3.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/4.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/5.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/0.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/1.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/2.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/3.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/4.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/5.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/0.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/1.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/2.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/3.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/4.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/5.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/0.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/1.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/2.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/3.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/4.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/5.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/0.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/1.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/2.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/3.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/4.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/5.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/0.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/1.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/2.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/3.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/4.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/5.4bpp"); +const u32 gMapObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/0.4bpp"); +const u32 gMapObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/1.4bpp"); +const u32 gMapObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/2.4bpp"); +const u32 gMapObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/3.4bpp"); +const u32 gMapObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/4.4bpp"); +const u32 gMapObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/5.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/0.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/1.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/2.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/3.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/4.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/5.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/0.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/1.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/2.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/3.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/4.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/5.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/0.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/1.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/2.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/3.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/4.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/5.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/0.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/1.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/2.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/3.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/4.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/5.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/0.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/1.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/2.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/3.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/4.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/5.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/0.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/1.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/2.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/3.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/4.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/5.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/0.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/1.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/2.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/3.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/4.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/5.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/0.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/1.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/2.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/3.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/4.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/5.4bpp"); +const u32 gFieldEffectPic_SurfBlob_0[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/0.4bpp"); +const u32 gFieldEffectPic_SurfBlob_1[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/1.4bpp"); +const u32 gFieldEffectPic_SurfBlob_2[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/2.4bpp"); +const u32 gMapObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/0.4bpp"); +const u32 gMapObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/1.4bpp"); +const u32 gMapObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/2.4bpp"); +const u32 gMapObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/3.4bpp"); +const u32 gMapObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/4.4bpp"); +const u32 gMapObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/5.4bpp"); +const u32 gMapObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/6.4bpp"); +const u16 gMapObjectPalette12[] = INCBIN_U16("graphics/map_objects/palettes/12.gbapal"); +const u16 gMapObjectPalette13[] = INCBIN_U16("graphics/map_objects/palettes/13.gbapal"); + +const u32 gFieldEffectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_small.4bpp"); +const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_medium.4bpp"); +const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp"); +const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp"); +const u32 filler_8368A08[0x48] = {}; +const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effect_objects/pics/cut_grass.4bpp"); +const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); +const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal"); +const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp"); +const u32 gFieldEffectPic_Ripple_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/1.4bpp"); +const u32 gFieldEffectPic_Ripple_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/2.4bpp"); +const u32 gFieldEffectPic_Ripple_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/3.4bpp"); +const u32 gFieldEffectPic_Ripple_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/4.4bpp"); +const u32 gFieldEffectPic_Ash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/0.4bpp"); +const u32 gFieldEffectPic_Ash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/1.4bpp"); +const u32 gFieldEffectPic_Ash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/2.4bpp"); +const u32 gFieldEffectPic_Ash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/3.4bpp"); +const u32 gFieldEffectPic_Ash_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/4.4bpp"); +const u32 gFieldEffectPic_Arrow_0[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/0.4bpp"); +const u32 gFieldEffectPic_Arrow_1[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/1.4bpp"); +const u32 gFieldEffectPic_Arrow_2[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/2.4bpp"); +const u32 gFieldEffectPic_Arrow_3[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/3.4bpp"); +const u32 gFieldEffectPic_Arrow_4[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/4.4bpp"); +const u32 gFieldEffectPic_Arrow_5[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/5.4bpp"); +const u32 gFieldEffectPic_Arrow_6[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/6.4bpp"); +const u32 gFieldEffectPic_Arrow_7[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/7.4bpp"); +const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effect_objects/palettes/00.gbapal"); +const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effect_objects/palettes/01.gbapal"); +const u32 gFieldEffectPic_Dust_0[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/0.4bpp"); +const u32 gFieldEffectPic_Dust_1[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/1.4bpp"); +const u32 gFieldEffectPic_Dust_2[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/2.4bpp"); +const u32 unknown_8369588[] = INCBIN_U32("graphics/field_effect_objects/unknown.bin"); +const u32 gFieldEffectPic_JumpTallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/0.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/1.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/2.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/3.4bpp"); +const u32 UnusedGrass0[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/0.4bpp"); +const u32 UnusedGrass1[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/1.4bpp"); +const u32 UnusedGrass2[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/2.4bpp"); +const u32 UnusedGrass3[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/3.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/0.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/1.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/2.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/3.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/4.4bpp"); +const u32 UnusedGrassLong[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/unused.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_5[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/5.4bpp"); +const u32 gFieldEffectPic_Unknown17_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/0.4bpp"); +const u32 gFieldEffectPic_Unknown17_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/1.4bpp"); +const u32 gFieldEffectPic_Unknown17_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/2.4bpp"); +const u32 gFieldEffectPic_Unknown17_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/3.4bpp"); +const u32 gFieldEffectPic_Unknown17_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/4.4bpp"); +const u32 gFieldEffectPic_Unknown17_5[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/5.4bpp"); +const u32 gFieldEffectPic_Unknown17_6[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/6.4bpp"); +const u32 gFieldEffectPic_Unknown17_7[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/7.4bpp"); +const u32 gFieldEffectPic_Unknown18_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/0.4bpp"); +const u32 gFieldEffectPic_Unknown18_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/1.4bpp"); +const u32 gFieldEffectPic_Unknown18_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/2.4bpp"); +const u32 gFieldEffectPic_Unknown18_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/3.4bpp"); +const u32 gFieldEffectPic_LongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/0.4bpp"); +const u32 gFieldEffectPic_LongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/1.4bpp"); +const u32 gFieldEffectPic_LongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/2.4bpp"); +const u32 gFieldEffectPic_LongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/3.4bpp"); +const u32 gFieldEffectPic_TallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/0.4bpp"); +const u32 gFieldEffectPic_TallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/1.4bpp"); +const u32 gFieldEffectPic_TallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/2.4bpp"); +const u32 gFieldEffectPic_TallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/3.4bpp"); +const u32 gFieldEffectPic_TallGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/4.4bpp"); +const u32 gFieldEffectPic_ShortGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/0.4bpp"); +const u32 gFieldEffectPic_ShortGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/1.4bpp"); +const u32 gFieldEffectPic_SandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/0.4bpp"); +const u32 gFieldEffectPic_SandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/1.4bpp"); +const u32 gFieldEffectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/0.4bpp"); +const u32 gFieldEffectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/1.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/0.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/1.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/2.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/3.4bpp"); +const u32 gFieldEffectPic_Unknown19_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/0.4bpp"); +const u32 gFieldEffectPic_Unknown19_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/1.4bpp"); +const u32 gFieldEffectPic_Unknown19_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/2.4bpp"); +const u32 gFieldEffectPic_Unknown19_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/3.4bpp"); +const u32 gFieldEffectPic_SandPile_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/0.4bpp"); +const u32 gFieldEffectPic_SandPile_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/1.4bpp"); +const u32 gFieldEffectPic_SandPile_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/2.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/0.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/1.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/2.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/3.4bpp"); +const u32 gFieldEffectPic_Splash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/0.4bpp"); +const u32 gFieldEffectPic_Splash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/1.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/0.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/1.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/2.4bpp"); +const u32 gFieldEffectPic_Unknown20_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/0.4bpp"); +const u32 gFieldEffectPic_Unknown20_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/1.4bpp"); +const u32 gFieldEffectPic_Unknown20_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/2.4bpp"); +const u32 gFieldEffectPic_Unknown20_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/3.4bpp"); +const u32 gFieldEffectPic_Unknown20_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/4.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/0.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/1.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/2.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/3.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/4.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/5.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/6.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/0.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/1.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/2.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/3.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/4.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/5.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/6.4bpp"); +const u32 gFieldEffectPic_SandDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/0.4bpp"); +const u32 gFieldEffectPic_SandDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/1.4bpp"); +const u32 gFieldEffectPic_SandDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/2.4bpp"); +const u32 gFieldEffectPic_SandDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/3.4bpp"); +const u32 gFieldEffectPic_SandDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/4.4bpp"); +const u32 gFieldEffectPic_SandDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/5.4bpp"); +const u32 gFieldEffectPic_SandDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/6.4bpp"); +const u32 gFieldEffectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effect_objects/pics/hot_springs_water.4bpp"); +const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effect_objects/palettes/02.gbapal"); +const u32 gFieldEffectPic_PopOutOfAsh_0[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/0.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_1[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/1.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_2[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/2.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_3[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/3.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_4[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/4.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_0[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/0.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_1[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/1.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_2[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/2.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_3[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/3.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_4[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/4.4bpp"); +const u32 gFieldEffectPic_Bubbles_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/0.4bpp"); +const u32 gFieldEffectPic_Bubbles_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/1.4bpp"); +const u32 gFieldEffectPic_Bubbles_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/2.4bpp"); +const u32 gFieldEffectPic_Bubbles_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/3.4bpp"); +const u32 gFieldEffectPic_Bubbles_4[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/4.4bpp"); +const u32 gFieldEffectPic_Bubbles_5[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/5.4bpp"); +const u32 gFieldEffectPic_Bubbles_6[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/6.4bpp"); +const u32 gFieldEffectPic_Bubbles_7[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/7.4bpp"); +const u32 gFieldEffectPic_Sparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/0.4bpp"); +const u32 gFieldEffectPic_Sparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/1.4bpp"); +const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/field_effect_objects/palettes/03.gbapal"); +const u32 gFieldEffectPic_Bird[] = INCBIN_U32("graphics/field_effect_objects/pics/bird.4bpp"); + +void (*const gUnknown_0836DA88[])(struct Sprite *) = +{ + sub_805C884, + sub_805CDE8, + sub_805C8AC, + sub_805CF28, + sub_805CF28, + sub_805D0AC, + sub_805D0AC, + sub_805D230, + sub_805D230, + sub_805D230, + sub_805D230, + sub_80587B4, + FieldObjectCB_BerryTree, + sub_805D4F4, + sub_805D634, + sub_805D774, + sub_805D8B4, + sub_805D9F4, + sub_805DB34, + sub_805DC74, + sub_805DDB4, + sub_805DEF4, + sub_805E034, + sub_805E174, + sub_805E278, + sub_805E37C, + sub_805E37C, + sub_805E37C, + sub_805E37C, + sub_805E5DC, + sub_805E668, + sub_805E6F4, + sub_805E780, + sub_805E80C, + sub_805E898, + sub_805E924, + sub_805E9B0, + sub_805EA3C, + sub_805EAC8, + sub_805EB54, + sub_805EBE0, + sub_805EC6C, + sub_805ECF8, + sub_805ED84, + sub_805EE10, + sub_805EE9C, + sub_805EF28, + sub_805EFB4, + sub_805F040, + sub_805F0CC, + sub_805F158, + sub_805F1E4, + sub_805F270, + sub_805F2FC, + sub_805F2FC, + sub_805F2FC, + sub_805F2FC, + FieldObjectCB_TreeDisguise, + FieldObjectCB_MountainDisguise, + sub_805F8E0, + sub_805F8E0, + sub_805F8E0, + sub_805F8E0, + FieldObjectCB_Hidden1, + sub_805FB20, + sub_805FB20, + sub_805FB20, + sub_805FB20, + sub_805FB90, + sub_805FB90, + sub_805FB90, + sub_805FB90, + sub_805FC00, + sub_805FC00, + sub_805FC00, + sub_805FC00, + sub_805FC70 +}; + +const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; + +#include "../data/field_map_obj/map_object_graphics_info_pointers.h" +#include "../data/field_map_obj/field_effect_object_template_pointers.h" +#include "../data/field_map_obj/map_object_pic_tables.h" +#include "../data/field_map_obj/map_object_anims.h" +#include "../data/field_map_obj/base_oam.h" +#include "../data/field_map_obj/map_object_subsprites.h" +#include "../data/field_map_obj/map_object_graphics_info.h" + +const struct SpritePalette gUnknown_0837377C[] = { + {gMapObjectPalette0, 0x1103}, + {gMapObjectPalette1, 0x1104}, + {gMapObjectPalette2, 0x1105}, + {gMapObjectPalette3, 0x1106}, + {gMapObjectPalette4, 0x1107}, + {gMapObjectPalette5, 0x1108}, + {gMapObjectPalette6, 0x1109}, + {gMapObjectPalette7, 0x110A}, + {gMapObjectPalette8, 0x1100}, + {gMapObjectPalette9, 0x1101}, + {gMapObjectPalette10, 0x1102}, + {gMapObjectPalette11, 0x1115}, + {gMapObjectPalette12, 0x110B}, + {gMapObjectPalette13, 0x110C}, + {gMapObjectPalette14, 0x110D}, + {gMapObjectPalette15, 0x110E}, + {gMapObjectPalette16, 0x110F}, + {gMapObjectPalette17, 0x1110}, + {gMapObjectPalette18, 0x1111}, + {gMapObjectPalette19, 0x1112}, + {gMapObjectPalette20, 0x1113}, + {gMapObjectPalette21, 0x1114}, + {gMapObjectPalette22, 0x1116}, + {gMapObjectPalette23, 0x1117}, + {gMapObjectPalette24, 0x1118}, + {gMapObjectPalette25, 0x1119}, + {gMapObjectPalette26, 0x111A}, + {NULL, 0x0000} +}; + +const u16 Palettes_837385C[] = { + 0x1101, + 0x1101, + 0x1101, + 0x1101 +}; + +const u16 Palettes_8373864[] = { + 0x1111, + 0x1111, + 0x1111, + 0x1111 +}; + +const u16 Palettes_837386C[] = { + 0x1115, + 0x1115, + 0x1115, + 0x1115 +}; + +const struct PairedPalettes gUnknown_08373874[] = { + {0x1100, Palettes_837385C}, + {0x1110, Palettes_837385C}, + {0x1115, Palettes_837386C}, + {0x11FF, NULL} +}; + +const u16 Palettes_8373894[] = { + 0x110C, + 0x110C, + 0x110C, + 0x110C +}; + +const u16 Palettes_837389C[] = { + 0x110D, + 0x110D, + 0x110D, + 0x110D +}; + +const u16 Palettes_83738A4[] = { + 0x110E, + 0x110E, + 0x110E, + 0x110E +}; + +const u16 Palettes_83738AC[] = { + 0x1112, + 0x1112, + 0x1112, + 0x1112 +}; + +const u16 Palettes_83738B4[] = { + 0x1113, + 0x1113, + 0x1113, + 0x1113 +}; + +const u16 Palettes_83738BC[] = { + 0x1114, + 0x1114, + 0x1114, + 0x1114 +}; + +const u16 Palettes_83738C4[] = { + 0x111A, + 0x111A, + 0x111A, + 0x111A +}; + +const u16 Palettes_83738CC[] = { + 0x1117, + 0x1117, + 0x1117, + 0x1117 +}; + +const u16 Palettes_83738D4[] = { + 0x1119, + 0x1119, + 0x1119, + 0x1119 +}; + +const u16 Palettes_83738DC[] = { + 0x1109, + 0x1109, + 0x1109, + 0x1109 +}; + +const struct PairedPalettes gUnknown_083738E4[] = { + {0x1100, Palettes_837385C}, + {0x1110, Palettes_837385C}, + {0x110B, Palettes_8373894}, + {0x110D, Palettes_837389C}, + {0x110E, Palettes_83738A4}, + {0x1112, Palettes_83738AC}, + {0x1113, Palettes_83738B4}, + {0x1114, Palettes_83738BC}, + {0x1116, Palettes_83738CC}, + {0x1118, Palettes_83738D4}, + {0x1105, Palettes_83738DC}, + {0x111A, Palettes_83738C4}, + {0x11FF, NULL} +}; + +const u16 Unknown_837394C[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373960[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373974[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373988[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 *const gUnknown_0837399C[] = { + Unknown_837394C, + Unknown_8373960, + Unknown_8373974, + Unknown_8373988 +}; + +#include "../data/field_map_obj/berry_tree_graphics_tables.h" +#include "../data/field_map_obj/field_effect_objects.h" + +const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; +const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; +const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; + +#include "../data/field_map_obj/callback_subroutine_pointers.h" + +const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; +const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; +const u8 gUnknown_08375606[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; +const u8 gUnknown_0837560F[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D}; +const u8 gUnknown_08375618[] = {0x10, 0x10, 0x11, 0x12, 0x13, 0x10, 0x10, 0x11, 0x11}; +const u8 gUnknown_08375621[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_0837562A[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_08375633[] = {0x18, 0x18, 0x19, 0x1A, 0x1B, 0x18, 0x18, 0x19, 0x19}; +const u8 gUnknown_0837563C[] = {0x1C, 0x1C, 0x1D, 0x1E, 0x1F, 0x1C, 0x1C, 0x1D, 0x1D}; +const u8 gUnknown_08375645[] = {0x20, 0x20, 0x21, 0x22, 0x23, 0x20, 0x20, 0x21, 0x21}; +const u8 gUnknown_0837564E[] = {0x24, 0x24, 0x25, 0x26, 0x27, 0x24, 0x24, 0x25, 0x25}; +const u8 gUnknown_08375657[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; +const u8 gUnknown_08375660[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; +const u8 gUnknown_08375669[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; +const u8 gUnknown_08375672[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_0837567B[] = {0x08, 0x08, 0x07, 0x09, 0x0A, 0x08, 0x08, 0x07, 0x07}; + +bool8 (*const gUnknown_08375684[])(u8) = { + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsWestBlocked, + MetatileBehavior_IsEastBlocked +}; + +bool8 (*const gUnknown_08375694[])(u8) = { + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsEastBlocked, + MetatileBehavior_IsWestBlocked +}; + +const struct Coords16 gDirectionToVector[] = { + { 0, 0}, + { 0, 1}, + { 0, -1}, + {-1, 0}, + { 1, 0}, + {-1, 1}, + { 1, 1}, + {-1, -1}, + { 1, -1} +}; + +const u8 gUnknown_083756C8[] = {0x00, 0x00, 0x01, 0x02, 0x03}; +const u8 gUnknown_083756CD[] = {0x04, 0x04, 0x05, 0x06, 0x07}; +const u8 gUnknown_083756D2[] = {0x08, 0x08, 0x09, 0x0A, 0x0B}; +const u8 gUnknown_083756D7[] = {0x15, 0x15, 0x16, 0x17, 0x18}; +const u8 gUnknown_083756DC[] = {0x29, 0x29, 0x2A, 0x2B, 0x2C}; +const u8 gUnknown_083756E1[] = {0x2D, 0x2D, 0x2E, 0x2F, 0x30}; +const u8 gUnknown_083756E6[] = {0x31, 0x31, 0x32, 0x33, 0x34}; +const u8 gUnknown_083756EB[] = {0x35, 0x35, 0x36, 0x37, 0x38}; +const u8 gUnknown_083756F0[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F}; +const u8 gUnknown_083756F5[] = {0x46, 0x46, 0x47, 0x48, 0x49}; +const u8 gUnknown_083756FA[] = {0x4B, 0x4B, 0x4A, 0x4D, 0x4C}; +const u8 gUnknown_083756FF[] = {0x42, 0x42, 0x43, 0x44, 0x45}; +const u8 gUnknown_08375704[] = {0x3A, 0x3A, 0x3B, 0x3C, 0x3D}; +const u8 gUnknown_08375709[] = {0x19, 0x19, 0x1A, 0x1B, 0x1C}; +const u8 gUnknown_0837570E[] = {0x1D, 0x1D, 0x1E, 0x1F, 0x20}; +const u8 gUnknown_08375713[] = {0x21, 0x21, 0x22, 0x23, 0x24}; +const u8 gUnknown_08375718[] = {0x25, 0x25, 0x26, 0x27, 0x28}; +const u8 gUnknown_0837571D[] = {0x62, 0x62, 0x63, 0x64, 0x65}; +const u8 gUnknown_08375722[] = {0x66, 0x66, 0x67, 0x68, 0x69}; +const u8 gUnknown_08375727[] = {0x6A, 0x6A, 0x6B, 0x6C, 0x6D}; +const u8 gUnknown_0837572C[] = {0x6E, 0x6E, 0x6F, 0x70, 0x71}; +const u8 gUnknown_08375731[] = {0x72, 0x72, 0x73, 0x74, 0x75}; +const u8 gUnknown_08375736[] = {0x76, 0x76, 0x77, 0x78, 0x79}; +const u8 gUnknown_0837573B[] = {0x7A, 0x7A, 0x7B, 0x7C, 0x7D}; +const u8 gUnknown_08375740[] = {0x7E, 0x7E, 0x7F, 0x80, 0x81}; +const u8 gUnknown_08375745[] = {0x82, 0x82, 0x83, 0x84, 0x85}; +const u8 gUnknown_0837574A[] = {0x86, 0x86, 0x87, 0x88, 0x89}; + +const u8 gUnknown_0837574F[] = {2, 1, 4, 3, 8, 7, 6, 5}; + +const u8 gUnknown_08375757[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {3, 4, 2, 1}, + {4, 3, 1, 2} +}; + +const u8 gUnknown_08375767[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {4, 3, 1, 2}, + {3, 4, 2, 1} +}; + +#include "../data/field_map_obj/anim_func_ptrs.h" + +// text + +extern void strange_npc_table_clear(void); +extern void ClearPlayerAvatarInfo(void); +extern void npc_load_two_palettes__no_record(u16, u8); +extern void npc_load_two_palettes__and_record(u16, u8); +extern void sub_8060388(s16, s16, s16 *, s16 *); +void sub_80634D0(struct MapObject *, struct Sprite *); +extern void pal_patch_for_npc(u16, u16); +extern void CameraObjectReset1(void); + +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; +extern u8 gReservedSpritePaletteCount; +extern struct Camera gCamera; + +static u8 gUnknown_030005A4; +static u16 gUnknown_030005A6; + +struct MapObject gMapObjects[16]; + +void npc_clear_ids_and_state(struct MapObject *mapObj) +{ + memset(mapObj, 0, sizeof(struct MapObject)); + mapObj->localId = 0xFF; + mapObj->mapNum = 0xFF; + mapObj->mapGroup = 0xFF; + mapObj->mapobj_unk_1C = 0xFF; +} + +void npcs_clear_ids_and_state(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + npc_clear_ids_and_state(&gMapObjects[i]); +} + +void sub_805AA98(void) +{ + strange_npc_table_clear(); + npcs_clear_ids_and_state(); + ClearPlayerAvatarInfo(); + sub_805AAB0(); +} + +void sub_805AAB0(void) +{ + u8 spriteId; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); + + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 0); + gSprites[spriteId].invisible = 1; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); + + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 1); + gSprites[spriteId].invisible = 1; +} + +u8 sub_805AB54(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (!gMapObjects[i].active) + break; + } + return i; +} + +u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + if (localId <= 0xFE) + return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); + else + return GetFieldObjectIdByLocalId(localId); +} + +bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId) +{ + *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); + if (*mapObjectId == 16) + return TRUE; + else + return FALSE; +} + +u8 GetFieldObjectIdByXY(s16 x, s16 y) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) + break; + } + return i; +} + +u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) + return i; + } + return 16; +} + +u8 GetFieldObjectIdByLocalId(u8 localId) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == localId) + return i; + } + return 16; +} + +#ifdef NONMATCHING +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness + u8 var; + u16 r3; + u16 r2; + + //asm("nop"::"r"(b)); + if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) + return 16; + //_0805ACCE + mapObj = &gMapObjects[var]; + npc_clear_ids_and_state(mapObj); + r3 = template->x + 7; + r2 = template->y + 7; + mapObj->active = TRUE; + mapObj->mapobj_bit_2 = TRUE; + mapObj->graphicsId = template->graphicsId; + mapObj->animPattern = template->movementType; + mapObj->localId = template->localId; + mapObj->mapNum = b; + mapObj->mapGroup = c; + mapObj->coords1.x = r3; + mapObj->coords1.y = r2; + mapObj->coords2.x = r3; + mapObj->coords2.y = r2; + mapObj->coords3.x = r3; + mapObj->coords3.y = r2; + mapObj->mapobj_unk_0B_0 = template->elevation; + mapObj->elevation = template->elevation; + mapObj->range.as_nybbles.x = template->unkA_0; + mapObj->range.as_nybbles.y = template->unkA_4; + mapObj->trainerType = template->unkC; + mapObj->trainerRange_berryTreeId = template->unkE; + mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; + FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); + FieldObjectHandleDynamicGraphicsId(mapObj); + //asm("":::"r5","r6"); + if (gUnknown_0836DBBC[mapObj->animPattern] != 0) + { + if (mapObj->range.as_nybbles.x == 0) + mapObj->range.as_nybbles.x++; + if (mapObj->range.as_nybbles.y == 0) + mapObj->range.as_nybbles.y++; + } + return var; +} +#else +__attribute__((naked)) +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x4\n\ + adds r5, r0, 0\n\ + lsls r1, 24\n\ + lsrs r6, r1, 24\n\ + lsls r2, 24\n\ + lsrs r7, r2, 24\n\ + ldrb r0, [r5]\n\ + adds r1, r6, 0\n\ + adds r2, r7, 0\n\ + mov r3, sp\n\ + bl GetAvailableFieldObjectSlot\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0805ACCE\n\ + movs r0, 0x10\n\ + b _0805ADC2\n\ +_0805ACCE:\n\ + mov r0, sp\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 3\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0805ADD0 @ =gMapObjects\n\ + adds r4, r0, r1\n\ + adds r0, r4, 0\n\ + bl npc_clear_ids_and_state\n\ + ldrh r3, [r5, 0x4]\n\ + adds r3, 0x7\n\ + lsls r3, 16\n\ + lsrs r3, 16\n\ + ldrh r2, [r5, 0x6]\n\ + adds r2, 0x7\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + ldrb r0, [r4]\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + strb r0, [r4]\n\ + ldrb r0, [r5, 0x1]\n\ + strb r0, [r4, 0x5]\n\ + ldrb r0, [r5, 0x9]\n\ + strb r0, [r4, 0x6]\n\ + ldrb r0, [r5]\n\ + strb r0, [r4, 0x8]\n\ + strb r6, [r4, 0x9]\n\ + strb r7, [r4, 0xA]\n\ + strh r3, [r4, 0xC]\n\ + strh r2, [r4, 0xE]\n\ + strh r3, [r4, 0x10]\n\ + strh r2, [r4, 0x12]\n\ + strh r3, [r4, 0x14]\n\ + strh r2, [r4, 0x16]\n\ + ldrb r0, [r5, 0x8]\n\ + movs r7, 0xF\n\ + adds r1, r7, 0\n\ + ands r1, r0\n\ + ldrb r2, [r4, 0xB]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + mov r8, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0xB]\n\ + ldrb r1, [r5, 0x8]\n\ + lsls r1, 4\n\ + ands r0, r7\n\ + orrs r0, r1\n\ + strb r0, [r4, 0xB]\n\ + ldrb r1, [r5, 0xA]\n\ + lsls r1, 28\n\ + movs r0, 0xF\n\ + mov r9, r0\n\ + lsrs r1, 28\n\ + ldrb r2, [r4, 0x19]\n\ + mov r0, r8\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x19]\n\ + ldrb r1, [r5, 0xA]\n\ + lsrs r1, 4\n\ + lsls r1, 4\n\ + ands r0, r7\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x19]\n\ + ldrh r0, [r5, 0xC]\n\ + strb r0, [r4, 0x7]\n\ + ldrh r0, [r5, 0xE]\n\ + strb r0, [r4, 0x1D]\n\ + ldr r1, _0805ADD4 @ =gUnknown_0836DC09\n\ + ldrb r0, [r5, 0x9]\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + adds r0, r4, 0\n\ + adds r0, 0x20\n\ + strb r1, [r0]\n\ + ldrb r1, [r0]\n\ + adds r0, r4, 0\n\ + bl FieldObjectSetDirection\n\ + adds r0, r4, 0\n\ + bl FieldObjectHandleDynamicGraphicsId\n\ + ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\ + ldrb r0, [r4, 0x6]\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _0805ADBE\n\ + ldrb r2, [r4, 0x19]\n\ + adds r0, r7, 0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0805ADA6\n\ + lsls r0, r2, 28\n\ + lsrs r0, 28\n\ + adds r0, 0x1\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r8\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + strb r1, [r4, 0x19]\n\ +_0805ADA6:\n\ + ldrb r2, [r4, 0x19]\n\ + movs r0, 0xF0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0805ADBE\n\ + lsrs r1, r2, 4\n\ + adds r1, 0x1\n\ + lsls r1, 4\n\ + adds r0, r7, 0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x19]\n\ +_0805ADBE:\n\ + mov r0, sp\n\ + ldrb r0, [r0]\n\ +_0805ADC2:\n\ + add sp, 0x4\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_0805ADD0: .4byte gMapObjects\n\ +_0805ADD4: .4byte gUnknown_0836DC09\n\ +_0805ADD8: .4byte gUnknown_0836DBBC\n\ + .syntax divided\n"); +} +#endif + +u8 sub_805ADDC(u8 localId) +{ + u8 objectCount; + u8 i; + + if (gMapHeader.events == NULL) + return 16; + objectCount = gMapHeader.events->mapObjectCount; + for (i = 0; i < objectCount; i++) + { + struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; + + if (template->localId == localId && !FlagGet(template->flagId)) + return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + } + return 16; +} + +u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) +{ + u8 i = 0; + + for (i = 0; i < 16 && gMapObjects[i].active; i++) + { + if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) + return 1; + } + if (i >= 16) + return 1; + *d = i; + for (; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) + return 1; + } + return 0; +} + +void RemoveFieldObject(struct MapObject *mapObject) +{ + mapObject->active = FALSE; + RemoveFieldObjectInternal(mapObject); +} + +void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return; + FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId)); + RemoveFieldObject(&gMapObjects[mapObjectId]); +} + +void RemoveFieldObjectInternal(struct MapObject *mapObject) +{ + struct SpriteFrameImage image; + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + + image.size = gfxInfo->size; + gSprites[mapObject->spriteId].images = ℑ + DestroySprite(&gSprites[mapObject->spriteId]); +} + +void npc_hide_all_but_player(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (i != gPlayerAvatar.mapObjectId) + RemoveFieldObject(&gMapObjects[i]); + } +} + +u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) +{ + u8 mapObjectId; + u8 spriteId; + const struct MapObjectGraphicsInfo *gfxInfo; + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d); + if (mapObjectId == 16) + return 16; + + mapObject = &gMapObjects[mapObjectId]; + gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (gfxInfo->paletteSlot == 0) + npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + else if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (mapObject->animPattern == 0x4C) + mapObject->mapobj_bit_13 = TRUE; + +#ifdef NONMATCHING + sprTemplate->paletteTag = 0xFFFF; +#else + *(u16 *)&sprTemplate->paletteTag = 0xFFFF; +#endif + spriteId = CreateSprite(sprTemplate, 0, 0, 0); + if (spriteId == 64) + { + gMapObjects[mapObjectId].active = FALSE; + return 16; + } + sprite = &gSprites[spriteId]; + sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = mapObjectId; + mapObject->spriteId = spriteId; + mapObject->mapobj_bit_12 = gfxInfo->inanimate; + if (!mapObject->mapobj_bit_12) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); + sub_80634D0(mapObject, sprite); + return mapObjectId; +} + +u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) +{ + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables = NULL; + struct SpriteFrameImage spriteFrameImage; + const struct MapObjectGraphicsInfo *gfxInfo; + u8 mapObjectId; + + gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId); + MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = gfxInfo->size; + spriteTemplate.images = &spriteFrameImage; + mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e); + if (mapObjectId == 16) + return 16; + gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images; + if (subspriteTables != NULL) + SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); + return mapObjectId; +} + +u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate) +{ + s16 x; + s16 y; + + GetFieldObjectMovingCameraOffset(&x, &y); + return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); +} + +u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f) +{ + struct MapObjectTemplate mapObjTemplate; + + d -= 7; + e -= 7; + mapObjTemplate.localId = c; + mapObjTemplate.graphicsId = a; + mapObjTemplate.unk2 = 0; + mapObjTemplate.x = d; + mapObjTemplate.y = e; + mapObjTemplate.elevation = f; + mapObjTemplate.movementType = b; + mapObjTemplate.unkA_0 = 0; + mapObjTemplate.unkA_4 = 0; + mapObjTemplate.unkC = 0; + mapObjTemplate.unkE = 0; + return SpawnSpecialFieldObject(&mapObjTemplate); +} + +u8 show_sprite(u8 a, u8 b, u8 c) +{ + struct MapObjectTemplate *r5; + s16 x; + s16 y; + + r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c); + if (r5 == NULL) + return 16; + GetFieldObjectMovingCameraOffset(&x, &y); + return SpawnFieldObject(r5, b, c, x, y); +} + +void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + + sprTemplate->tileTag = gfxInfo->tileTag; + sprTemplate->paletteTag = gfxInfo->paletteTag1; + sprTemplate->oam = gfxInfo->oam; + sprTemplate->anims = gfxInfo->anims; + sprTemplate->images = gfxInfo->images; + sprTemplate->affineAnims = gfxInfo->affineAnims; + sprTemplate->callback = callback; + *subspriteTables = gfxInfo->subspriteTables; +} + +void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables); +} + +void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); +} + +u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); + if (spriteTemplate.paletteTag != 0xFFFF) + sub_805BDF8(spriteTemplate.paletteTag); + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); + if (spriteId != 64 && subspriteTables != NULL) + { + SetSubspriteTables(&gSprites[spriteId], subspriteTables); + gSprites[spriteId].subspriteMode = 2; + } + return spriteId; +} + +extern void sub_8064970(struct Sprite *); +extern void sub_8060470(s16 *, s16 *, s16, s16); +void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z); + +u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) +{ + const struct MapObjectGraphicsInfo *gfxInfo; + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8064970, &spriteTemplate, &subspriteTables); +#ifdef NONMATCHING + spriteTemplate.paletteTag = 0xFFFF; +#else + *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; +#endif + x += 7; + y += 7; + sub_8060470(&x, &y, 8, 16); + spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); + if (spriteId != 64) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.y += sprite->centerToCornerVecY; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = b; + sprite->data[1] = elevation; + if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (subspriteTables != NULL) + { + SetSubspriteTables(sprite, subspriteTables); + sprite->subspriteMode = 2; + } + InitObjectPriorityByZCoord(sprite, elevation); + SetObjectSubpriorityByZCoord(elevation, sprite, 1); + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); + } + return spriteId; +} + +void sub_805B55C(s16 a, s16 b) +{ + u8 i; + + if (gMapHeader.events != NULL) + { + s16 r9 = gSaveBlock1.pos.x - 2; + s16 sp8 = gSaveBlock1.pos.x + 17; + s16 r10 = gSaveBlock1.pos.y; + s16 spC = gSaveBlock1.pos.y + 16; + u8 objectCount = gMapHeader.events->mapObjectCount; + + for (i = 0; i < objectCount; i++) + { + struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; + s16 foo = template->x + 7; + s16 bar = template->y + 7; + + if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo + && !FlagGet(template->flagId)) + SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b); + } + } +} + +void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject); + +void RemoveFieldObjectsOutsideView(void) +{ + u8 i; + u8 j; + + for (i = 0; i < 16; i++) + { + bool8 isActiveLinkPlayer; + + for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) + { + if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) + isActiveLinkPlayer = TRUE; + } + if (!isActiveLinkPlayer) + { + struct MapObject *mapObject = &gMapObjects[i]; + + if (mapObject->active && !mapObject->mapobj_bit_16) + RemoveFieldObjectIfOutsideView(mapObject); + } + } +} + +void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) +{ + s16 r7 = gSaveBlock1.pos.x - 2; + s16 r5 = gSaveBlock1.pos.x + 17; + s16 r4 = gSaveBlock1.pos.y; + s16 r6 = gSaveBlock1.pos.y + 16; + + if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5 + && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6) + return; + if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5 + && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6) + return; + RemoveFieldObject(mapObject); +} + +void sub_805B75C(u8, s16, s16); + +void sub_805B710(u16 a, u16 b) +{ + u8 i; + + ClearPlayerAvatarInfo(); + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active) + sub_805B75C(i, a, b); + } + sub_805AAB0(); +} + +extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); +extern void sub_805B914(struct MapObject *); + +void sub_805B75C(u8 a, s16 b, s16 c) +{ + struct SpriteTemplate sp0; + struct SpriteFrameImage sp18; + const struct SubspriteTable *subspriteTables; + const struct MapObjectGraphicsInfo *gfxInfo; + struct MapObject *mapObject; + u8 spriteId; + + #define i spriteId + for (i = 0; i < 4; i++) + { + if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId) + return; + } + #undef i + + mapObject = &gMapObjects[a]; + asm("":::"r5"); + subspriteTables = NULL; + gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sp18.size = gfxInfo->size; + MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables); + sp0.images = &sp18; + *(u16 *)&sp0.paletteTag = 0xFFFF; + if (gfxInfo->paletteSlot == 0) + npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (gfxInfo->paletteSlot > 9) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + *(u16 *)&sp0.paletteTag = 0xFFFF; + spriteId = CreateSprite(&sp0, 0, 0, 0); + if (spriteId != 64) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sprite->images = gfxInfo->images; + if (mapObject->animPattern == 11) + { + SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId); + mapObject->mapobj_unk_1B = sub_8126B54(); + } + if (subspriteTables != NULL) + SetSubspriteTables(sprite, subspriteTables); + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = a; + mapObject->spriteId = spriteId; + if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + sub_805B914(mapObject); + SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); + } +} + +void sub_805B914(struct MapObject *mapObject) +{ + mapObject->mapobj_bit_1 = FALSE; + mapObject->mapobj_bit_2 = TRUE; + mapObject->mapobj_bit_22 = FALSE; + mapObject->mapobj_bit_17 = FALSE; + mapObject->mapobj_bit_18 = FALSE; + mapObject->mapobj_bit_19 = FALSE; + mapObject->mapobj_bit_20 = FALSE; + mapObject->mapobj_bit_21 = FALSE; + FieldObjectClearAnim(mapObject); +} + +void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) +{ + gPlayerAvatar.mapObjectId = mapObjectId; + gPlayerAvatar.spriteId = spriteId; + gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); + SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); +} + +void sub_805B980(struct MapObject *mapObject, u8 graphicsId) +{ + const struct MapObjectGraphicsInfo *gfxInfo; + struct Sprite *sprite; + + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + sprite = &gSprites[mapObject->spriteId]; + if (gfxInfo->paletteSlot == 0) + pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + sprite->oam.shape = gfxInfo->oam->shape; + sprite->oam.size = gfxInfo->oam->size; + sprite->images = gfxInfo->images; + sprite->anims = gfxInfo->anims; + sprite->subspriteTables = gfxInfo->subspriteTables; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + mapObject->mapobj_bit_12 = gfxInfo->inanimate; + mapObject->graphicsId = graphicsId; + sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + if (mapObject->mapobj_bit_15) + CameraObjectReset1(); +} + +void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + sub_805B980(&gMapObjects[mapObjectId], graphicsId); +} + +void FieldObjectTurn(struct MapObject *mapObject, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + if (!mapObject->mapobj_bit_12) + { + StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); + } +} + +void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + FieldObjectTurn(&gMapObjects[mapObjectId], direction); +} + +void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction) +{ + FieldObjectTurn(&gMapObjects[player->mapObjectId], direction); +} + +void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 treeStage; + u8 treeId; + + mapObject->mapobj_bit_13 = TRUE; + sprite->invisible = TRUE; + treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); + if (treeStage != 0) + { + mapObject->mapobj_bit_13 = FALSE; + sprite->invisible = FALSE; + treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; + treeStage--; + if (treeId > 0x2B) + treeId = 0; + sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]); + sprite->images = gBerryTreePicTablePointers[treeId]; + sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage]; + StartSpriteAnim(sprite, treeStage); + } +} + +const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) +{ + if (graphicsId > 0xEF) + graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16); + if (graphicsId > 0xD9) + graphicsId = 5; + return gMapObjectGraphicsInfoPointers[graphicsId]; +} + +void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) +{ + if (mapObject->graphicsId > 0xEF) + mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16); +} + +void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + gMapObjects[mapObjectId].mapobj_bit_13 = d; +} + +void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) +{ + *(u8 *)localId = mapObject->localId; + *(u8 *)mapNum = mapObject->mapNum; + *(u8 *)mapGroup = mapObject->mapGroup; +} + +void sub_805BCC0(s16 x, s16 y) +{ + u8 mapObjectId; + struct MapObject *mapObject; + + mapObjectId = GetFieldObjectIdByXY(x, y); + if (mapObjectId != 16) + { + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_2 = TRUE; + } +} + +void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) +{ + u8 mapObjectId; + struct MapObject *mapObject; + struct Sprite *sprite; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + mapObject = &gMapObjects[mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + mapObject->mapobj_bit_26 = TRUE; + sprite->subpriority = subpriority; + } +} + +void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + struct MapObject *mapObject; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_26 = FALSE; + mapObject->mapobj_bit_2 = TRUE; + } +} + +void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 mapObjectId; + struct Sprite *sprite; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + } +} + +void gpu_pal_allocator_reset__manage_upper_four(void) +{ + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 12; +} + +void sub_805BDF8(u16 tag) +{ + u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag); + + if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8 + sub_805BE58(&gUnknown_0837377C[paletteIndex]); +} + +void unref_sub_805BE24(u16 *arr) +{ + u8 i; + + for (i = 0; arr[i] != 0x11FF; i++) + sub_805BDF8(arr[i]); +} + +u8 sub_805BE58(const struct SpritePalette *palette) +{ + if (IndexOfSpritePaletteTag(palette->tag) != 0xFF) + return 0xFF; + else + return LoadSpritePalette(palette); +} + +void pal_patch_for_npc(u16 a, u16 b) +{ + u8 var = b; + u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a); + + LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20); +} + +void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c) +{ + for (; b < c; arr++, b++) + pal_patch_for_npc(*arr, b); +} + +u8 FindFieldObjectPaletteIndexByTag(u16 tag) +{ + u8 i; + + for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++) + { + if (gUnknown_0837377C[i].tag == tag) + return i; + } + return 0xFF; +} + +void npc_load_two_palettes__no_record(u16 a, u8 b) +{ + u8 i; + + pal_patch_for_npc(a, b); + for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++) + { + if (gUnknown_08373874[i].tag == a) + { + pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); + break; + } + } +} + +void npc_load_two_palettes__and_record(u16 a, u8 b) +{ + u8 i; + + gUnknown_030005A6 = a; + pal_patch_for_npc(a, b); + for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) + { + if (gUnknown_083738E4[i].tag == a) + { + pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); + break; + } + } +} + +void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = mapObject->coords2.x; + mapObject->coords3.y = mapObject->coords2.y; + mapObject->coords2.x += x; + mapObject->coords2.y += y; +} + +void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = mapObject->coords2.x; + mapObject->coords3.y = mapObject->coords2.y; + mapObject->coords2.x = x; + mapObject->coords2.y = y; +} + +void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = x; + mapObject->coords3.y = y; + mapObject->coords2.x = x; + mapObject->coords2.y = y; +} + +void sub_805C058(struct MapObject *mapObject, s16 x, s16 y) +{ + struct Sprite *sprite = &gSprites[mapObject->spriteId]; + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + + npc_coords_set(mapObject, x, y); + sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sub_805B914(mapObject); + if (mapObject->mapobj_bit_15) + CameraObjectReset1(); +} + +void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + x += 7; + y += 7; + sub_805C058(&gMapObjects[mapObjectId], x, y); + } +} + +void npc_coords_shift_still(struct MapObject *mapObject) +{ + npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); +} + +void UpdateFieldObjectCoordsForCameraUpdate(void) +{ + u8 i; + s16 deltaX; + s16 deltaY; + + if (gCamera.field_0) + { + deltaX = gCamera.x; + deltaY = gCamera.y; + for (i = 0; i < 16; i++) + { + + if (gMapObjects[i].active) + { + gMapObjects[i].coords1.x -= deltaX; + gMapObjects[i].coords1.y -= deltaY; + gMapObjects[i].coords2.x -= deltaX; + gMapObjects[i].coords2.y -= deltaY; + gMapObjects[i].coords3.x -= deltaX; + gMapObjects[i].coords3.y -= deltaY; + } + } + } +} + +bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); + +u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y + && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) + return i; + } + return 16; +} + +bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) +{ + if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 + && mapObject->mapobj_unk_0B_0 != z) + return FALSE; + else + return TRUE; +} + +void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) +{ + UpdateFieldObjectCoordsForCameraUpdate(); + sub_805B55C(x, y); + RemoveFieldObjectsOutsideView(); +} + +u8 AddCameraObject(u8 a) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4); + + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[0] = a; + return spriteId; +} + +void ObjectCB_CameraObject(struct Sprite *sprite) +{ + void (*cameraObjectFuncs[3])(struct Sprite *); + memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs); + cameraObjectFuncs[sprite->data[1]](sprite); +} + +void CameraObject_0(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->invisible = TRUE; + sprite->data[1] = 1; + CameraObject_1(sprite); +} + +void CameraObject_1(struct Sprite *sprite) +{ + s16 x = gSprites[sprite->data[0]].pos1.x; + s16 y = gSprites[sprite->data[0]].pos1.y; + + sprite->data[2] = x - sprite->pos1.x; + sprite->data[3] = y - sprite->pos1.y; + sprite->pos1.x = x; + sprite->pos1.y = y; +} + +void CameraObject_2(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->data[2] = 0; + sprite->data[3] = 0; +} + +struct Sprite *FindCameraObject(void) +{ + u8 i; + + for (i = 0; i < 64; i++) + { + if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) + return &gSprites[i]; + } + return NULL; +} + +void CameraObjectReset1(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite != NULL) + { + cameraSprite->data[1] = 0; + cameraSprite->callback(cameraSprite); + } +} + +void CameraObjectSetFollowedObjectId(u8 spriteId) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite != NULL) + { + cameraSprite->data[0] = spriteId; + CameraObjectReset1(); + } +} + +u8 CameraObjectGetFollowedObjectId(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite == NULL) + return 64; + else + return cameraSprite->data[0]; +} + +void CameraObjectReset2(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + cameraSprite->data[1] = 2; +} + +u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < 64; i++) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *src; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + break; + } + } + return i; +} + +u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority) +{ + s16 i; + + for (i = 63; i > -1; i--) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *src; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + return i; + } + } + return 64; +} + +void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) +{ + mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; + if (!mapObject->mapobj_bit_9) + { + s8 _direction = direction; //needed for the asm to match + mapObject->mapobj_unk_18 = _direction; + } + mapObject->placeholder18 = direction; +} + +u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + + return template->script; +} + +u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) +{ + return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); +} + +u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + + return template->flagId; +} + +u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) +{ + return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); +} + +u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return 0xFF; + else + return gMapObjects[mapObjectId].trainerType; +} + +u8 unref_sub_805C60C(u8 mapObjectId) +{ + return gMapObjects[mapObjectId].trainerType; +} + +u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return 0xFF; + else + return gMapObjects[mapObjectId].trainerRange_berryTreeId; +} + +u8 FieldObjectGetBerryTreeId(u8 mapObjectId) +{ + return gMapObjects[mapObjectId].trainerRange_berryTreeId; +} + +struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8); + +struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup) + return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount); + else + { + struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); + + return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount); + } +} + +struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) +{ + u8 i; + + for (i = 0; i < count; i++) + { + if (templates[i].localId == localId) + return &templates[i]; + } + return NULL; +} + +struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject) +{ + s32 i; + + if (mapObject->mapNum != gSaveBlock1.location.mapNum + || mapObject->mapGroup != gSaveBlock1.location.mapGroup) + return NULL; + + for (i = 0; i < 64; i++) + { + if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId) + return &gSaveBlock1.mapObjectTemplates[i]; + } + return NULL; +} + +void sub_805C754(struct MapObject *mapObject) +{ + struct MapObjectTemplate *template = sub_805C700(mapObject); + + if (template != NULL) + { + template->x = mapObject->coords2.x - 7; + template->y = mapObject->coords2.y - 7; + } +} + +void sub_805C774(struct MapObject *mapObject, u8 movementType) +{ + struct MapObjectTemplate *template = sub_805C700(mapObject); + + if (template != NULL) + template->movementType = movementType; +} + +void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + sub_805C754(&gMapObjects[mapObjectId]); +} + +void sub_805C7C4(u8 a) +{ + gpu_pal_allocator_reset__manage_upper_four(); + gUnknown_030005A6 = 0x11FF; + gUnknown_030005A4 = a; + pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10); +} + +u16 npc_paltag_by_palslot(u8 a) +{ + u8 i; + + if (a < 10) + return gUnknown_0837399C[gUnknown_030005A4][a]; + + for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) + { + if (gUnknown_083738E4[i].tag == gUnknown_030005A6) + { + return gUnknown_083738E4[i].data[gUnknown_030005A4]; + } + } + return 0x11FF; +} + +fieldmap_object_null_cb(sub_805C884, sub_805C8A8); +fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224); + +u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); + +u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); +void sub_8064820(struct Sprite *, s16); + +u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +extern u8 sub_8064824(struct Sprite *); + +u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +extern u8 sub_805FF20(struct MapObject *, u8); + +u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + direction = directions[Random() & 3]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) +{ + s16 x; + s16 y; + s16 objx; + s16 objy; + s16 minx; + s16 maxx; + s16 miny; + s16 maxy; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0) + { + return 0; + } + if (mapObject->trainerType != 1 && mapObject->trainerType != 3) + { + return 0; + } + PlayerGetDestCoords(&x, &y); + objx = mapObject->coords2.x; + objy = mapObject->coords2.y; + minx = objx - mapObject->trainerRange_berryTreeId; + miny = objy - mapObject->trainerRange_berryTreeId; + maxx = objx + mapObject->trainerRange_berryTreeId; + maxy = objy + mapObject->trainerRange_berryTreeId; + if (minx > x || maxx < x || miny > y || maxy < y) + { + return 0; + } + return 1; +} + +u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + if (a2 > a3) + { + dirn = DIR_EAST; + if (a0 < 0) + { + dirn = DIR_WEST; + } + } + else + { + dirn = DIR_SOUTH; + if (a1 < 0) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = DIR_SOUTH; + if (a1 < 0) + { + dirn = DIR_NORTH; + } + return dirn; +} + +u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = DIR_EAST; + if (a0 < 0) + { + dirn = DIR_WEST; + } + return dirn; +} + +u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = DIR_NORTH; + } + } + else if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = DIR_NORTH; + } + } + else if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = DIR_SOUTH; + } + } + else if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = DIR_SOUTH; + } + } + return dirn; +} + +u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) { + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = DIR_SOUTH; + } + } + else if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = DIR_SOUTH; + } + } + return dirn; +} + +u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CD60(struct MapObject *mapObject, u8 a1) +{ + s16 x; + s16 y; + s16 x2; + s16 y2; + if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + return 0; + } + PlayerGetDestCoords(&x, &y); + x -= mapObject->coords2.x; + y -= mapObject->coords2.y; + x2 = x; + y2 = y; + if (x2 < 0) + { + x2 = -x2; + } + if (y2 < 0) + { + y2 = -y2; + } + return gUnknown_08375244[a1](x, y, x2, y2); +} + +fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270); + +u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284); + +u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752A0, 2); + direction = directions[Random() & 1]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4); + +u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752C0, 2); + direction = directions[Random() & 1]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4); + +u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + sprite->data[1] = 2; + return 1; + } + return 0; +} + +u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + return 0; +} + +u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite); + +void FieldObjectCB_BerryTree(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (!(sprite->data[7] & 1)) + { + get_berry_tree_graphics(mapObject, sprite); + sprite->data[7] |= 1; + } + meta_step(mapObject, sprite, sub_805D314); +} + +u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite) +{ + return gUnknown_083752D0[sprite->data[1]](mapObject, sprite); +} + +u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 berryTreeStage; + npc_reset(mapObject, sprite); + mapObject->mapobj_bit_13 = 1; + sprite->invisible = 1; + berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); + if (!berryTreeStage) + { + if (!(sprite->data[7] & 4) && sprite->animNum == 4) + { + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); + sprite->animNum = 0; + } + return 0; + } + mapObject->mapobj_bit_13 = 0; + sprite->invisible = 0; + berryTreeStage--; + if (sprite->animNum != berryTreeStage) + { + sprite->data[1] = 2; + return 1; + } + get_berry_tree_graphics(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, 0x39); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 0; + return 1; + } + return 0; +} + +u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 3; + sprite->data[2] = 0; + sprite->data[7] |= 2; + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); + return 1; +} + +u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[2]++; + mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); + sprite->animPaused = 1; + if (sprite->data[2] > 64) + { + get_berry_tree_graphics(mapObject, sprite); + sprite->data[1] = 4; + sprite->data[2] = 0; + return 1; + } + return 0; +} + +u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[2]++; + mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); + sprite->animPaused = 1; + if (sprite->data[2] > 64) + { + sprite->data[1] = 0; + sprite->data[7] &= (-3); + return 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4); + +u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752A0, 2); + direction = sub_805CD60(mapObject, 1); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8); + +u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752C0, 2); + direction = sub_805CD60(mapObject, 2); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C); + +u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375320, 2); + direction = sub_805CD60(mapObject, 3); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324); + +u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375338, 2); + direction = sub_805CD60(mapObject, 4); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C); + +u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375350, 2); + direction = sub_805CD60(mapObject, 5); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354); + +u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375368, 2); + direction = sub_805CD60(mapObject, 6); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C); + +u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375380, 4); + direction = sub_805CD60(mapObject, 7); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384); + +u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375398, 4); + direction = sub_805CD60(mapObject, 8); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C); + +u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_083753B0, 4); + direction = sub_805CD60(mapObject, 9); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4); + +u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_083753C8, 4); + direction = sub_805CD60(mapObject, 10); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC); + +u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, 0x30); + sprite->data[1] = 2; + } + return 0; +} + +u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gUnknown_083753DC, 5); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[mapObject->mapobj_unk_18]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 0; + return 1; +} + +fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4); + +u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, 0x30); + sprite->data[1] = 2; + } + return 0; +} + +u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gUnknown_083753F4, 5); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[mapObject->mapobj_unk_18]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 0; + return 1; +} + +fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC); + +u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + direction = gUnknown_0836DC09[mapObject->animPattern]; + if (mapObject->mapobj_unk_21 != 0) + { + direction = GetOppositeDirection(direction); + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 v0; + u8 goSpeed0AnimId; + if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 0; + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + } + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + if (v0 == 1) + { + mapObject->mapobj_unk_21 ++; + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + } + if (v0 != 0) + { + goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); + } + FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 3; + return 1; +} + +u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence) +{ + u8 v0; + u8 goSpeed0AnimId; + if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 0; + } + FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + if (v0 == 1) + { + mapObject->mapobj_unk_21 ++; + FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + } + if (v0 != 0) + { + goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); + } + FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C); + +u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375418, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C); + +u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375428, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C); + +u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375438, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C); + +u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375448, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + + + +fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C); + +u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375458, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C); + +u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375468, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C); + +u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478); + +u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375484, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488); + +u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375494, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498); + +u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754A4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8); + +u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754B4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8); + +u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754C4, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8); + +u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754D4, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8); + +u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754E4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8); + +u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754F4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8); + +u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375504, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508); + +u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375514, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518); + +u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375524, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528); + +u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375534, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538); + +u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375544, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548); + +u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375554, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558); + +u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375564, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568); + +u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375574, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578); + +u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375584, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +}; + +fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588); + +u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + if (mapObject->mapobj_unk_21 == 0) + { + mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); + } + sprite->data[1] = 1; + return 1; +} + +u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + { + return 0; + } + return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); +} + +u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +bool8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + return 0; +} + +bool8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2))); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +bool8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = a2; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); + if (npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +bool8 sub_805F4F0(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_8060744(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F5A8(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806079C(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F660(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80607C8(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806084C(direction)); + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F760(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80608A4(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + x = mapObject->coords2.x; + y = mapObject->coords2.y; + sub_8060320(direction, &x, &y, 2, 2); + FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); + +u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + { + return 0; + } + return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); +} + +u8 sub_805F9F8(struct MapObject *, struct Sprite *); + +void FieldObjectCB_TreeDisguise(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) + { + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); + mapObject->mapobj_unk_21 = 1; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); +} + +u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + return 0; +} + +void FieldObjectCB_MountainDisguise(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) + { + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); + mapObject->mapobj_unk_21 = 1; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); +} + +u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite); + +void FieldObjectCB_Hidden1(struct Sprite *sprite) +{ + if (sprite->data[7] == 0) + { + gMapObjects[sprite->data[0]].mapobj_bit_26 = 1; + sprite->subspriteMode = 2; + sprite->oam.priority = 3; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805FAD8); +} + +u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + return gUnknown_083755CC[sprite->data[1]](mapObject, sprite); +} + +u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + return 0; +} + +u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 0; + } + return 0; +} + +fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0); + +u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8); + +u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0); + +u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8); + +u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + mapObject->mapobj_bit_13 = 1; + sprite->data[1] = 1; + return 1; +} + +u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 2; + return 1; + } + return 0; +} + +u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + return 0; +} + +void sub_805FC70(struct Sprite *sprite); + +void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + mapObject->mapobj_bit_6 = 0; + mapObject->mapobj_bit_7 = 0; + mapObject->mapobj_unk_1C = 0xff; + sprite->data[1] = 0; +} + +u8 FieldObjectDirectionToImageAnimId(u8 direction) +{ + return gUnknown_083755F4[direction]; +} + +u8 get_go_image_anim_num(u8 direction) +{ + return gUnknown_083755FD[direction]; +} + +u8 get_go_fast_image_anim_num(u8 direction) +{ + return gUnknown_08375606[direction]; +} + +u8 get_go_faster_image_anim_num(u8 direction) +{ + return gUnknown_0837560F[direction]; +} + +u8 sub_805FD78(u8 direction) +{ + return gUnknown_08375618[direction]; +} + +u8 sub_805FD88(u8 direction) +{ + return gUnknown_08375621[direction]; +} + +u8 sub_805FD98(u8 direction) +{ + return gUnknown_0837562A[direction]; +} + +u8 unref_sub_805FDA8(u8 direction) +{ + return gUnknown_08375633[direction]; +} + +u8 sub_805FDB8(u8 direction) +{ + return gUnknown_0837563C[direction]; +} + +u8 sub_805FDC8(u8 direction) +{ + return gUnknown_08375645[direction]; +} + +u8 sub_805FDD8(u8 direction) +{ + return gUnknown_0837564E[direction]; +} + +u8 sub_805FDE8(u8 direction) +{ + return gUnknown_08375657[direction]; +} + +u8 sub_805FDF8(u8 direction) +{ + return gUnknown_08375660[direction]; +} + +u8 sub_805FE08(u8 direction) +{ + return gUnknown_08375669[direction]; +} + +u8 get_run_image_anim_num(u8 direction) +{ + return gUnknown_08375672[direction]; +} + +void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) +{ + if (!mapObject->mapobj_bit_12) + { + sprite->animNum = animNum; + if (sprite->animCmdIndex == 1) + { + sprite->animCmdIndex = 2; + } else if (sprite->animCmdIndex == 3) + { + sprite->animCmdIndex = 0; + } + SeekSpriteAnim(sprite, sprite->animCmdIndex); + } +} + +void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) +{ + u8 animCmdIndex; + if (!mapObject->mapobj_bit_12) + { + sprite->animNum = animNum; + animCmdIndex = 3; + if (sprite->animCmdIndex < 2) + { + animCmdIndex = 1; + } + SeekSpriteAnim(sprite, animCmdIndex); + } +} + +u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3) +{ + if (a0 > a2) + { + return DIR_WEST; + } else if (a0 < a2) + { + return DIR_EAST; + } else if (a1 > a3) + { + return DIR_NORTH; + } else + { + return DIR_SOUTH; + } +} + +void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) +{ + mapObject->animPattern = animPattern; + mapObject->mapobj_unk_21 = 0; + mapObject->animId = 0; + gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern]; + gSprites[mapObject->spriteId].data[1] = 0; +} + +u8 npc_running_behaviour_by_direction(u8 direction) +{ + return gUnknown_0837567B[direction]; +} + +u8 sub_805FF20(struct MapObject *mapObject, u8 direction) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + MoveCoords(direction, &x, &y); + return npc_block_way(mapObject, x, y, direction); +} + +bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y); +static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y); +bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); + +u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) +{ + u8 direction; + direction = dirn; + if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) + return 1; + else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) + return 2; + else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) + return 2; + else if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) + return 3; + else if (DoesObjectCollideWithObjectAt(mapObject, x, y)) + return 4; + return 0; +} + +u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + u8 flags = 0; + + if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) + flags |= 1; + if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) + flags |= 2; + if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) + flags |= 4; + if (DoesObjectCollideWithObjectAt(mapObject, x, y)) + flags |= 8; + return flags; +} + +bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y) +{ + s16 minv; + s16 maxv; + + if (mapObject->range.as_nybbles.x != 0) + { + minv = mapObject->coords1.x - (mapObject->range.as_nybbles.x); + maxv = mapObject->coords1.x + (mapObject->range.as_nybbles.x); + if (minv > x || maxv < x) + return TRUE; + } + if (mapObject->range.as_nybbles.y != 0) + { + minv = mapObject->coords1.y - (mapObject->range.as_nybbles.y); + maxv = mapObject->coords1.y + (mapObject->range.as_nybbles.y); + if (minv > y || maxv < y) + return TRUE; + } + return FALSE; +} + +bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) + { + return 1; + } + return 0; +} + +static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + struct MapObject *mapObject2 = &gMapObjects[i]; + + if (mapObject2->active && mapObject2 != mapObject) + { + if (((mapObject2->coords2.x == x && mapObject2->coords2.y == y) || (mapObject2->coords3.x == x && mapObject2->coords3.y == y)) + && AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0)) + return TRUE; + } + } + return 0; +} + +// this function is only used in berry.c, but its unknown whether its intended context is the berry tree check or if its checking for the flickering. +bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + if (gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 2) + return TRUE; + + return FALSE; +} + +void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 4; + } +} + +void MoveCoords(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVector[direction].x; + *y += gDirectionToVector[direction].y; +} + +void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVector[direction].x << 4; + *y += gDirectionToVector[direction].y << 4; +} + +void sub_8060320(u32 dirn, s16 *x, s16 *y, s16 deltaX, s16 deltaY) +{ + u8 direction = dirn; + s16 dx2 = deltaX; + s16 dy2 = deltaY; + if (gDirectionToVector[direction].x > 0) + { + *x += dx2; + } + if (gDirectionToVector[direction].x < 0) + { + *x -= dx2; + } + if (gDirectionToVector[direction].y > 0) + { + *y += dy2; + } + if (gDirectionToVector[direction].y < 0) + { + *y -= dy2; + } +} + +void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2) +{ + *x2 = (x1 - gSaveBlock1.pos.x) << 4; + *y2 = (y1 - gSaveBlock1.pos.y) << 4; + *x2 -= gUnknown_0300489C; + *y2 -= gUnknown_03004898; +} + +void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2) +{ + s16 x3; + s16 y3; + x3 = -gUnknown_0300489C - gUnknown_03004880.unk10; + y3 = -gUnknown_03004898 - gUnknown_03004880.unk14; + if (gUnknown_03004880.unk10 > 0) + { + x3 += 0x10; + } + if (gUnknown_03004880.unk10 < 0) + { + x3 -= 0x10; + } + if (gUnknown_03004880.unk14 > 0) + { + y3 += 0x10; + } + if (gUnknown_03004880.unk14 < 0) + { + y3 -= 0x10; + } + *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3; + *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3; +} + +void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy) +{ + sub_80603CC(*x, *y, x, y); + *x += dx; + *y += dy; +} + +void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) +{ + *x = 0; + *y = 0; + if (gUnknown_03004880.unk10 > 0) + { + (*x)++; + } + if (gUnknown_03004880.unk10 < 0) + { + (*x)--; + } + if (gUnknown_03004880.unk14 > 0) + { + (*y)++; + } + if (gUnknown_03004880.unk14 < 0) + { + (*y)--; + } +} + +void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 direction, s16 *x, s16 *y) +{ + u8 newDirn = direction; + *x = mapObject->coords2.x; + *y = mapObject->coords2.y; + MoveCoords(newDirn, x, y); +} + +bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) + { + return TRUE; + } + return FALSE; +} + +bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff) + { + return TRUE; + } + return FALSE; +} + +bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) +{ + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) + { + return TRUE; + } + UnfreezeMapObject(mapObject); + mapObject->mapobj_unk_1C = specialAnimId; + mapObject->mapobj_bit_6 = 1; + mapObject->mapobj_bit_7 = 0; + gSprites[mapObject->spriteId].data[2] = 0; + return FALSE; +} + +void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) +{ + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + FieldObjectSetSpecialAnim(mapObject, specialAnimId); +} + +void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + { + FieldObjectClearAnim(mapObject); + } +} + +void FieldObjectClearAnim(struct MapObject *mapObject) +{ + mapObject->mapobj_unk_1C = 0xFF; + mapObject->mapobj_bit_6 = 0; + mapObject->mapobj_bit_7 = 0; + gSprites[mapObject->spriteId].data[1] = 0; + gSprites[mapObject->spriteId].data[2] = 0; +} + +bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + return mapObject->mapobj_bit_7; + return 0x10; +} + +bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) +{ + u8 specialAnimStatus; + specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); + if (specialAnimStatus != 0 && specialAnimStatus != 0x10) + { + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + } + return specialAnimStatus; +} + +u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + { + return mapObject->mapobj_unk_1C; + } + return 0xFF; +} + +extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite); +extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite); +extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite); +void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite); +void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite); +void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite); +void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite); + +void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *)) +{ + DoGroundEffects_OnSpawn(mapObject, sprite); + sub_80634A0(mapObject, sprite); + if (FieldObjectIsSpecialAnimActive(mapObject)) + { + FieldObjectExecSpecialAnim(mapObject, sprite); + } else + { + if (!mapObject->mapobj_bit_8) + { + while (callback(mapObject, sprite)); + } + } + DoGroundEffects_OnBeginStep(mapObject, sprite); + DoGroundEffects_OnFinishStep(mapObject, sprite); + npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); + sub_80634D0(mapObject, sprite); + FieldObjectUpdateSubpriority(mapObject, sprite); +} + +#define dirn_to_anim(name, table)\ +u8 name(u32 idx)\ +{\ + u8 direction;\ + u8 animIds[sizeof(table)];\ + direction = idx;\ + memcpy(animIds, (table), sizeof(table));\ + if (direction > DIR_EAST) direction = 0;\ + return animIds[direction];\ +} + +dirn_to_anim(GetFaceDirectionAnimId, gUnknown_083756C8) +dirn_to_anim(GetSimpleGoAnimId, gUnknown_083756CD) +dirn_to_anim(GetGoSpeed0AnimId, gUnknown_083756D2) +dirn_to_anim(sub_8060744, gUnknown_083756D7) +dirn_to_anim(d2s_08064034, gUnknown_083756DC) +dirn_to_anim(sub_806079C, gUnknown_083756E1) +dirn_to_anim(sub_80607C8, gUnknown_083756E6) +dirn_to_anim(sub_80607F4, gUnknown_083756EB) +dirn_to_anim(GetJumpLedgeAnimId, gUnknown_083756F0) +dirn_to_anim(sub_806084C, gUnknown_083756F5) +dirn_to_anim(sub_8060878, gUnknown_083756FA) +dirn_to_anim(sub_80608A4, gUnknown_083756FF) +dirn_to_anim(sub_80608D0, gUnknown_08375704) +dirn_to_anim(GetStepInPlaceDelay32AnimId, gUnknown_08375709) +dirn_to_anim(GetStepInPlaceDelay16AnimId, gUnknown_0837570E) +dirn_to_anim(GetStepInPlaceDelay8AnimId, gUnknown_08375713) +dirn_to_anim(GetStepInPlaceDelay4AnimId, gUnknown_08375718) + +u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) +{ + return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); +} + +u8 sub_80609D8(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837571D, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A04(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375722, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A30(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375727, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A5C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837572C, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A88(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375731, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060AB4(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375736, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060AE0(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837573B, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B0C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375740, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B38(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375745, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B64(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837574A, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetOppositeDirection(u8 direction) +{ + u8 directions[8]; + memcpy(directions, gUnknown_0837574F, 8); + if (direction == 0 || direction > 8) + { + return direction; + } + return directions[direction - 1]; +} + +u32 zffu_offset_calc(u8 a0, u8 a1) +{ + return gUnknown_08375757[a0 - 1][a1 - 1]; +} + +u32 state_to_direction(u8 a0, u32 a1, u32 a2) +{ + u32 zffuOffset; + u8 a1_2 = a1; + u8 a2_2 = a2; + if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) + { + return 0; + } + zffuOffset = zffu_offset_calc(a1_2, a2); + return gUnknown_08375767[a0 - 1][zffuOffset - 1]; +} + +void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) + { + mapObject->mapobj_bit_7 = 1; + } +} + +bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) + { + mapObject->mapobj_unk_1C = 0xFF; + sprite->data[2] = 0; + return 1; + } + return 0; +} + +void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) +{ + mapObject->mapobj_unk_1C = animId; + sprite->data[2] = 0; +} + +void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + npc_coords_shift_still(mapObject); + sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + sprite->animPaused = 1; + sprite->data[2] = 1; +} + +u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_SOUTH); + return 1; +} + +u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_NORTH); + return 1; +} + +u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_WEST); + return 1; +} + +u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_EAST); + return 1; +} + +void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + FieldObjectSetDirection(mapObject, direction); + MoveCoords(direction, &x, &y); + npc_coords_shift(mapObject, x, y); + oamt_npc_ministep_reset(sprite, direction, a3); + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + sprite->data[2] = 1; +} + +extern u8 (*const gUnknown_083759C0[5])(u8); + +void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + u8 (*const functions[5])(u8); + memcpy((void *)functions, gUnknown_083759C0, sizeof(gUnknown_083759C0)); + sub_8060D20(mapObject, sprite, direction, a3); + sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18)); +} + +void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_8060D20(mapObject, sprite, direction, 1); + sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); +} + +bool8 obj_npc_ministep(struct Sprite *); + +bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (obj_npc_ministep(sprite)) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + sprite->animPaused = 1; + return 1; + } + return 0; +} + +void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + FieldObjectSetDirection(mapObject, direction); + MoveCoords(direction, &x, &y); + npc_coords_shift(mapObject, x, y); + sub_806467C(sprite, direction); + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + sprite->data[2] = 1; +} + +void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_8060E68(mapObject, sprite, direction); + sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); +} + +bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_806468C(sprite)) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + sprite->animPaused = 1; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060F5C(struct MapObject *, struct Sprite *); + +bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + return sub_8060F5C(mapObject, sprite); +} + +bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060F9C(struct MapObject *, struct Sprite *); + +bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_NORTH); + return sub_8060F9C(mapObject, sprite); +} + +bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060FDC(struct MapObject *, struct Sprite *); + +bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_WEST); + return sub_8060FDC(mapObject, sprite); +} + +bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806101C(struct MapObject *, struct Sprite *); + +bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_EAST); + return sub_806101C(mapObject, sprite); +} + +bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806105C(struct MapObject *, struct Sprite *); + +bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 0); + return sub_806105C(mapObject, sprite); +} + +bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806109C(struct MapObject *, struct Sprite *); + +bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 0); + return sub_806109C(mapObject, sprite); +} + +bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80610DC(struct MapObject *, struct Sprite *); + +bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 0); + return sub_80610DC(mapObject, sprite); +} + +bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806111C(struct MapObject *, struct Sprite *); + +bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 0); + return sub_806111C(mapObject, sprite); +} + +bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) +{ + s16 vSPp4[3]; + s16 x; + s16 y; + memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34); + x = 0; + y = 0; + FieldObjectSetDirection(mapObject, direction); + sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]); + npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); + sub_80646E4(sprite, direction, a4, a5); + sprite->data[2] = 1; + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + mapObject->mapobj_bit_4 = 1; +} + +void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) +{ + sub_806113C(mapObject, sprite, direction, a4, a5); + sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + DoShadowFieldEffect(mapObject); +} + +u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *)) +{ + s16 vSPp4[3]; + s16 x; + s16 y; + u8 retval; + memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A); + retval = callback(sprite); + if (retval == 1 && vSPp4[sprite->data[4]] != 0) + { + x = 0; + y = 0; + sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data[4]], vSPp4[sprite->data[4]]); + npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); + mapObject->mapobj_bit_2 = 1; + mapObject->mapobj_bit_4 = 1; + } else if (retval == 0xff) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->animPaused = 1; + } + return retval; +} + +u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite) +{ + return sub_806123C(mapObject, sprite, sub_8064704); +} + +u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite) +{ + return sub_806123C(mapObject, sprite, sub_806478C); +} + +bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061300(mapObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061314(mapObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 retval; + + retval = sub_8061300(mapObject, sprite); + if (retval != 1) + { + if (retval == 0xFF) + { + return TRUE; + } + return FALSE; + } + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + return FALSE; +} + +bool8 sub_80613D4(struct MapObject *, struct Sprite *); +bool8 sub_806142C(struct MapObject *, struct Sprite *); +bool8 sub_8061484(struct MapObject *, struct Sprite *); +bool8 sub_80614DC(struct MapObject *, struct Sprite *); + +bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0); + return sub_80613D4(mapObject, sprite); +} + +bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0); + return sub_806142C(mapObject, sprite); +} + +bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0); + return sub_8061484(mapObject, sprite); +} + +bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0); + return sub_80614DC(mapObject, sprite); +} + +bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8061508(struct Sprite *sprite, u16 duration) +{ + sprite->data[2] = 1; + sprite->data[3] = duration; +} + +bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[3]--; + if (!sprite->data[3]) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 1); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 2); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 4); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 8); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 16); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 1); + return sub_80615EC(mapObject, sprite); +} + +bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 1); + return sub_806162C(mapObject, sprite); +} + +bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 1); + return sub_806166C(mapObject, sprite); +} + +bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 1); + return sub_80616AC(mapObject, sprite); +} + +bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration) +{ + FieldObjectSetDirection(mapObject, direction); + sub_805FE28(mapObject, sprite, animId); + sprite->animPaused = 0; + sprite->data[2] = 1; + sprite->data[3] = duration; +} + +bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[3]--; + if (sprite->data[3] == 0) + { + sprite->data[2] = 2; + sprite->animPaused = 1; + return TRUE; + } + return FALSE; +} + +bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sprite->data[3] & 1) + { + sprite->animDelayCounter++; + } + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061B18(struct MapObject *, struct Sprite *); + +bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 2); + return sub_8061B18(mapObject, sprite); +} + +bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061B58(struct MapObject *, struct Sprite *); + +bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 2); + return sub_8061B58(mapObject, sprite); +} + +bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061B98(struct MapObject *, struct Sprite *); + +bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 2); + return sub_8061B98(mapObject, sprite); +} + +bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061BD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 2); + return sub_8061BD8(mapObject, sprite); +} + +bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061C18(struct MapObject *, struct Sprite *); + +bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 3); + return sub_8061C18(mapObject, sprite); +} + +bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061C58(struct MapObject *, struct Sprite *); + +bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 3); + return sub_8061C58(mapObject, sprite); +} + +bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061C98(struct MapObject *, struct Sprite *); + +bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 3); + return sub_8061C98(mapObject, sprite); +} + +bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061CD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 3); + return sub_8061CD8(mapObject, sprite); +} + +bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061D18(struct MapObject *, struct Sprite *); + +bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 4); + return sub_8061D18(mapObject, sprite); +} + +bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061D58(struct MapObject *, struct Sprite *); + +bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 4); + return sub_8061D58(mapObject, sprite); +} + +bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061D98(struct MapObject *, struct Sprite *); + +bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 4); + return sub_8061D98(mapObject, sprite); +} + +bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061DD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 4); + return sub_8061DD8(mapObject, sprite); +} + +bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E18(struct MapObject *, struct Sprite *); + +bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_SOUTH); + return sub_8061E18(mapObject, sprite); +} + +bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E58(struct MapObject *, struct Sprite *); + +bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_NORTH); + return sub_8061E58(mapObject, sprite); +} + +bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E98(struct MapObject *, struct Sprite *); + +bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_WEST); + return sub_8061E98(mapObject, sprite); +} + +bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061ED8(struct MapObject *, struct Sprite *); + +bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_EAST); + return sub_8061ED8(mapObject, sprite); +} + +bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) +{ + obj_anim_image_set_and_seek(sprite, animNum, 0); + FieldObjectSetDirection(mapObject, direction); + sprite->data[2] = 1; +} + +bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); + return FALSE; +} + +bool8 sub_8064864(struct Sprite *); + +bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_806113C(mapObject, sprite, direction, 1, 0); + StartSpriteAnim(sprite, sub_805FD88(direction)); +} + +bool8 sub_8061FB0(struct MapObject *, struct Sprite *); + +bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_SOUTH); + return sub_8061FB0(mapObject, sprite); +} + +bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061FF8(struct MapObject *, struct Sprite *); + +bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_NORTH); + return sub_8061FF8(mapObject, sprite); +} + +bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062040(struct MapObject *, struct Sprite *); + +bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_WEST); + return sub_8062040(mapObject, sprite); +} + +bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062088(struct MapObject *, struct Sprite *); + +bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_EAST); + return sub_8062088(mapObject, sprite); +} + +bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 objectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) + { + an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)); + } + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 objectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) + { + an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y))); + } + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_9 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_9 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2); + return sub_80621BC(mapObject, sprite); +} + +bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2); + return sub_8062214(mapObject, sprite); +} + +bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2); + return sub_806226C(mapObject, sprite); +} + +bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2); + return sub_80622C4(mapObject, sprite); +} + +bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0); + return sub_806231C(mapObject, sprite); +} + +bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0); + return sub_8062374(mapObject, sprite); +} + +bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0); + return sub_80623CC(mapObject, sprite); +} + +bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0); + return sub_8062424(mapObject, sprite); +} + +bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2); + return sub_806247C(mapObject, sprite); +} + +bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2); + return sub_80624D4(mapObject, sprite); +} + +bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2); + return sub_806252C(mapObject, sprite); +} + +bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2); + return sub_8062584(mapObject, sprite); +} + +bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]); + return TRUE; +} + +bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); + return FALSE; +} + +bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_25 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_25 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_12 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_HEART_ICON); + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062704(struct MapObject *, struct Sprite *); + +bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->animPattern == 0x3F) + { + sub_8084794(mapObject); + return FALSE; + } + else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) + { + sprite->data[2] = 2; + return TRUE; + } + else + { + sub_812869C(mapObject); + sprite->data[2] = 1; + return sub_8062704(mapObject, sprite); + } +} + +bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_81286C4(mapObject)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite) +{ + obj_anim_image_set_and_seek(sprite, 1, 0); + sprite->data[2] = 1; + return FALSE; +} + +bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sub_8064820(sprite, 0x20); + sprite->data[2] = 2; + } + return FALSE; +} + +bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 ^= 1; + if (sub_8064824(sprite)) + { + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 3; + } + return FALSE; +} + +bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + obj_anim_image_set_and_seek(sprite, 1, 0); + sprite->data[2] = 1; + return FALSE; +} + +bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sub_8064820(sprite, 0x20); + sprite->data[2] = 2; + } + return FALSE; +} + +bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 ^= 1; + if (sub_8064824(sprite)) + { + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 3; + } + return FALSE; +} + +bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_26 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_26 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->oam.affineMode = 3; + InitSpriteAffineAnim(sprite); + sprite->affineAnimPaused = 1; + sprite->subspriteMode = 0; + return TRUE; +} + +bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + return TRUE; +} + +bool8 sub_80628D0(struct MapObject *, struct Sprite *); + +bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = 0; + StartSpriteAffineAnimIfDifferent(sprite, 0); + return sub_80628D0(mapObject, sprite); +} + +bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->affineAnimPaused = 1; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062930(struct MapObject *, struct Sprite *); + +bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = 0; + ChangeSpriteAffineAnimIfDifferent(sprite, 1); + return sub_8062930(mapObject, sprite); +} + +bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->affineAnimPaused = 1; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + npc_coords_shift_still(mapObject); + sub_805FE64(mapObject, sprite, sub_805FDD8(direction)); + sprite->animPaused = 1; + sprite->data[2] = 1; +} + +bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_SOUTH); + return TRUE; +} + +bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_NORTH); + return TRUE; +} + +bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_WEST); + return TRUE; +} + +bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_EAST); + return TRUE; +} + +bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST)); + return FALSE; +} + +bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST)); + return FALSE; +} + +bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST)); + return FALSE; +} + +void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4) +{ + sub_806113C(mapObject, sprite, direction, a3, a4); + StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction)); + DoShadowFieldEffect(mapObject); +} + +bool8 sub_8062BFC(struct MapObject *, struct Sprite *); + +bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1); + return sub_8062BFC(mapObject, sprite); +} + +bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062C54(struct MapObject *, struct Sprite *); + +bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1); + return sub_8062C54(mapObject, sprite); +} + +bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062CAC(struct MapObject *, struct Sprite *); + +bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1); + return sub_8062CAC(mapObject, sprite); +} + +bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062D04(struct MapObject *, struct Sprite *); + +bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1); + return sub_8062D04(mapObject, sprite); +} + +bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062D5C(struct MapObject *, struct Sprite *); + +bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1); + return sub_8062D5C(mapObject, sprite); +} + +bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062DB4(struct MapObject *, struct Sprite *); + +bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1); + return sub_8062DB4(mapObject, sprite); +} + +bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062E0C(struct MapObject *, struct Sprite *); + +bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1); + return sub_8062E0C(mapObject, sprite); +} + +bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062E64(struct MapObject *, struct Sprite *); + +bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1); + return sub_8062E64(mapObject, sprite); +} + +bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062EBC(struct MapObject *, struct Sprite *); + +bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0); + return sub_8062EBC(mapObject, sprite); +} + +bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062F14(struct MapObject *, struct Sprite *); + +bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0); + return sub_8062F14(mapObject, sprite); +} + +bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062F6C(struct MapObject *, struct Sprite *); + +bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0); + return sub_8062F6C(mapObject, sprite); +} + +bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062FC4(struct MapObject *, struct Sprite *); + +bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0); + return sub_8062FC4(mapObject, sprite); +} + +bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8); + return sub_8061714(mapObject, sprite); +} + +void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18)); + SeekSpriteAnim(sprite, 0); +} + +bool8 sub_8063128(struct MapObject *, struct Sprite *); + +bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063128(mapObject, sprite); +} + +bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063168(struct MapObject *, struct Sprite *); + +bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_NORTH, 1); + return sub_8063168(mapObject, sprite); +} + +bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80631A8(struct MapObject *, struct Sprite *); + +bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_WEST, 1); + return sub_80631A8(mapObject, sprite); +} + +bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80631E8(struct MapObject *, struct Sprite *); + +bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_EAST, 1); + return sub_80631E8(mapObject, sprite); +} + +bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18)); +} + +bool8 sub_8063258(struct MapObject *, struct Sprite *); + +bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063258(mapObject, sprite); +} + +bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063298(struct MapObject *, struct Sprite *); + +bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_NORTH, 1); + return sub_8063298(mapObject, sprite); +} + +bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80632D8(struct MapObject *, struct Sprite *); + +bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_WEST, 1); + return sub_80632D8(mapObject, sprite); +} + +bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063318(struct MapObject *, struct Sprite *); + +bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_EAST, 1); + return sub_8063318(mapObject, sprite); +} + +bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18)); + SeekSpriteAnim(sprite, 0); +} + +bool8 sub_8063390(struct MapObject *, struct Sprite *); + +bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063390(mapObject, sprite); +} + +bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80633D0(struct MapObject *, struct Sprite *); + +bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_NORTH, 1); + return sub_80633D0(mapObject, sprite); +} + +bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063410(struct MapObject *, struct Sprite *); + +bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_WEST, 1); + return sub_8063410(mapObject, sprite); +} + +bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063450(struct MapObject *, struct Sprite *); + +bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_EAST, 1); + return sub_8063450(mapObject, sprite); +} + +bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite) +{ + return TRUE; +} + +bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->animPaused = 1; + return TRUE; +} + +void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->mapobj_bit_10) + { + sprite->animPaused = 1; + } +} + +void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->mapobj_bit_11) + { + sprite->animPaused = 0; + mapObject->mapobj_bit_10 = 0; + mapObject->mapobj_bit_11 = 0; + } +} + +void sub_80634E8(struct MapObject *, struct Sprite *); +static void UpdateMapObjSpriteVisibility(struct MapObject *, struct Sprite *); + +void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80634E8(mapObject, sprite); + UpdateMapObjSpriteVisibility(mapObject, sprite); +} + +#ifdef NONMATCHING +void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u16 x; + u16 y; + s16 x2; + s16 y2; + const struct MapObjectGraphicsInfo *graphicsInfo; + mapObject->mapobj_bit_14 = 0; + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + x2 = graphicsInfo->width + x; // offending line + y2 = graphicsInfo->height + y; // similarly offending line + if ((s16)x >= 0x100 || x2 < -0x10) + { + mapObject->mapobj_bit_14 = 1; + } + if ((s16)y >= 0xB0 || y2 < -0x10) + { + mapObject->mapobj_bit_14 = 1; + } +} +#else +__attribute__((naked)) +void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r5, r0, 0\n\ + adds r4, r1, 0\n\ + ldrb r1, [r5, 0x1]\n\ + movs r0, 0x41\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r5, 0x1]\n\ + ldrb r0, [r5, 0x5]\n\ + bl GetFieldObjectGraphicsInfo\n\ + adds r6, r0, 0\n\ + adds r0, r4, 0\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0806354C\n\ + ldrh r1, [r4, 0x24]\n\ + ldrh r0, [r4, 0x20]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\ + adds r0, r1\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r0, [r4, 0x22]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x29\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\ + adds r0, r1\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + b _08063574\n\ + .align 2, 0\n\ +_08063544: .4byte gSpriteCoordOffsetX\n\ +_08063548: .4byte gSpriteCoordOffsetY\n\ +_0806354C:\n\ + ldrh r1, [r4, 0x24]\n\ + ldrh r0, [r4, 0x20]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + adds r0, r1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r0, [r4, 0x22]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x29\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + adds r0, r1\n\ +_08063574:\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + ldrh r0, [r6, 0x8]\n\ + adds r0, r3\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + ldrh r0, [r6, 0xA]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + cmp r0, 0xFF\n\ + bgt _0806359C\n\ + lsls r0, r1, 16\n\ + asrs r0, 16\n\ + movs r1, 0x10\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _080635A4\n\ +_0806359C:\n\ + ldrb r0, [r5, 0x1]\n\ + movs r1, 0x40\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ +_080635A4:\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + cmp r0, 0xAF\n\ + bgt _080635B8\n\ + lsls r0, r4, 16\n\ + asrs r0, 16\n\ + movs r1, 0x10\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _080635C0\n\ +_080635B8:\n\ + ldrb r0, [r5, 0x1]\n\ + movs r1, 0x40\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ +_080635C0:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ +.syntax divided\n"); +} +#endif + +void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->invisible = 0; + if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) + { + sprite->invisible = 1; + } +} + +static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void DoTracksGroundEffect_BikeTireTracks( +struct MapObject *mapObj, struct Sprite *sprite, u8); +void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); +u8 GetReflectionTypeByMetatileBehavior(u32 behavior); + +static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_Reflection(mapObj, flags); + GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags); + GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); +} + +static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_Reflection(mapObj, flags); + GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags); + GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags); + GetGroundEffectFlags_Tracks(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_Puddle(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); +} + +static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_Puddle(mapObj, flags); + GetGroundEffectFlags_Ripple(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); + GetGroundEffectFlags_Seaweed(mapObj, flags); + GetGroundEffectFlags_JumpLanding(mapObj, flags); +} + +void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) +{ + mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y); + mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y); +} + +void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) +{ + u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; + u8 type = FieldObjectCheckForReflectiveSurface(mapObj); + + if (type) + { + if (!mapObj->mapobj_bit_17) + { + mapObj->mapobj_bit_17 = 0; + mapObj->mapobj_bit_17 = 1; + *flags |= reflectionFlags[type - 1]; + } + } + else + { + mapObj->mapobj_bit_17 = 0; + } +} + +void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x1; +} + +void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x2; +} + +void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x4; +} + +void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x8; +} + +void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + { + *flags |= 0x100; + } + else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) + || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) + { + *flags |= 0x80; + } +} + +void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_20) + { + mapObj->mapobj_bit_20 = 0; + mapObj->mapobj_bit_20 = 1; + *flags |= 0x800; + } + } + else + { + mapObj->mapobj_bit_20 = 0; + } +} + +void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) +{ + if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) + || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) + { + if (!mapObj->mapobj_bit_19) + { + mapObj->mapobj_bit_19 = 0; + mapObj->mapobj_bit_19 = 1; + *flags |= 0x40; + } + } + else + { + mapObj->mapobj_bit_19 = 0; + } +} + +void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) + { + *flags |= 0x400; + } +} + +void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E)) + *flags |= 0x200; +} + +void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_18) + { + mapObj->mapobj_bit_18 = 0; + mapObj->mapobj_bit_18 = 1; + *flags |= 0x20000; + } + } + else + { + mapObj->mapobj_bit_18 = 0; + } +} + +void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_21) + { + mapObj->mapobj_bit_21 = 0; + mapObj->mapobj_bit_21 = 1; + *flags |= 0x40000; + } + } + else + { + mapObj->mapobj_bit_21 = 0; + } +} + +void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E)) + *flags |= 0x80000; +} + +void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) +{ + typedef bool8 (*MetatileFunc)(u8); + + static const MetatileFunc metatileFuncs[] = { + MetatileBehavior_IsTallGrass, + MetatileBehavior_IsLongGrass, + MetatileBehavior_IsPuddle, + MetatileBehavior_IsSurfableWaterOrUnderwater, + MetatileBehavior_IsShallowFlowingWater, + MetatileBehavior_IsATile, + }; + + static const u32 jumpLandingFlags[] = { + 0x00001000, // Landing in tall grass + 0x00002000, // Landing in long grass + 0x00004000, // Landing on puddle + 0x00008000, // Landing on surfable water or underwater + 0x00004000, // Landing on shallow flowing water + 0x00010000, // Landing on any other type of ground + }; + + if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) + { + u8 i; + + for (i = 0; i < 6; i++) + { + if (metatileFuncs[i](mapObj->mapobj_unk_1E)) + { + *flags |= jumpLandingFlags[i]; + return; + } + } + } +} + +u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + + // ceil div by tile width? + s16 width = (info->width + 8) >> 4; + s16 height = (info->height + 8) >> 4; + s16 i; + s16 j; + u8 result; + u8 b; + s16 one; + +#define RETURN_REFLECTION_TYPE_AT(x, y) \ + b = MapGridGetMetatileBehaviorAt(x, y); \ + result = GetReflectionTypeByMetatileBehavior(b); \ + if (result != 0) \ + return result; + + for (i = 0, one = 1; i < height; i++) + { + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i) + for (j = 1; j < width; j++) + { + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i) + } + } + return 0; + +#undef RETURN_REFLECTION_TYPE_AT +} + +u8 GetReflectionTypeByMetatileBehavior(u32 behavior) +{ + if (MetatileBehavior_IsIce(behavior)) + return 1; + else if (MetatileBehavior_IsReflective(behavior)) + return 2; + else + return 0; +} + +u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) +{ + static bool8 (*const unknown_08376040[])(u8) = { + MetatileBehavior_IsJumpSouth, + MetatileBehavior_IsJumpNorth, + MetatileBehavior_IsJumpWest, + MetatileBehavior_IsJumpEast, + }; + + u8 b; + u8 index = z; + + if (index == 0) + return 0; + else if (index > 4) + index -= 4; + + index--; + b = MapGridGetMetatileBehaviorAt(x, y); + + if (unknown_08376040[index](b) == 1) + return index + 1; + + return 0; +} + +void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_4) + return; + + if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + return; + + if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F)) + return; + + sprite->subspriteTableNum = 4; + + if (ZCoordToPriority(mapObj->elevation) == 1) + sprite->subspriteTableNum = 5; +} + +bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) +{ + u8 mapZ; + + if (z == 0) + return FALSE; + + mapZ = MapGridGetZCoordAt(x, y); + + if (mapZ == 0 || mapZ == 0xF) + return FALSE; + + if (mapZ != z) + return TRUE; + + return FALSE; +} + +static const u8 sUnknown_08376050[] = { + 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is directly the inverse of gFieldObjectPriorities_08376070. +static const u8 sFieldObjectPriorities_08376060[] = { + 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is the inverse of gFieldObjectPriorities_08376060. +// 1 = Above player sprite +// 2 = Below player sprite +static const u8 sFieldObjectPriorities_08376070[] = { + 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, +}; + +void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_26) + return; + + FieldObjectUpdateZCoord(mapObj); + + sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation]; + sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation]; +} + +void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) +{ + sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z]; + sprite->oam.priority = sFieldObjectPriorities_08376060[z]; +} + +u8 ZCoordToPriority(u8 z) +{ + return sFieldObjectPriorities_08376060[z]; +} + +void FieldObjectUpdateZCoord(struct MapObject *mapObj) +{ + u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y); + u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y); + + if (z == 0xF || z2 == 0xF) + return; + + mapObj->mapobj_unk_0B_0 = z; + + if (z != 0 && z != 0xF) + mapObj->elevation = z; +} + +void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) +{ + s32 tmp = sprite->centerToCornerVecY; + u32 tmpa = *(u16 *)&sprite->pos1.y; + u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; + s32 tmp2 = (tmpa - tmp) + tmpb; + u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; + sprite->subpriority = tmp3 + sUnknown_08376050[a] + b; +} + +void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_26) + return; + + SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); +} + +bool8 AreZCoordsCompatible(u8 a, u8 b) +{ + if (a == 0 || b == 0) + return TRUE; + + if (a != b) + return FALSE; + + return TRUE; +} + +void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 1; + FieldEffectStart(FLDEFF_TALL_GRASS); +} + +void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 0; + FieldEffectStart(FLDEFF_TALL_GRASS); +} + +void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 1; + FieldEffectStart(FLDEFF_LONG_GRASS); +} + +void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 0; + FieldEffectStart(FLDEFF_LONG_GRASS); +} + +void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) +{ + SetUpReflection(mapObj, sprite, 0); +} + +void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite) +{ + SetUpReflection(mapObj, sprite, 1); +} + +void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); +} + +static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { + nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, +}; + +void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + gUnknown_08376080[info->tracks](mapObj, sprite, 0); +} + +void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + gUnknown_08376080[info->tracks](mapObj, sprite, 1); +} + +static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ +} + +static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ + // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) + u16 sandFootprints_FieldEffectData[2] = { + FLDEFF_SAND_FOOTPRINTS, + FLDEFF_DEEP_SAND_FOOTPRINTS + }; + + gFieldEffectArguments[0] = mapObj->coords3.x; + gFieldEffectArguments[1] = mapObj->coords3.y; + gFieldEffectArguments[2] = 149; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->mapobj_unk_18; + FieldEffectStart(sandFootprints_FieldEffectData[a]); +} + +static void DoTracksGroundEffect_BikeTireTracks( + struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ + // Specifies which bike track shape to show next. + // For example, when the bike turns from up to right, it will show + // a track that curves to the right. + // Each 4-byte row corresponds to the initial direction of the bike, and + // each byte in that row is for the next direction of the bike in the order + // of down, up, left, right. + static const u8 bikeTireTracks_Transitions[4][4] = { + 1, 2, 7, 8, + 1, 2, 6, 5, + 5, 8, 3, 4, + 6, 7, 3, 4, + }; + + if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) + { + gFieldEffectArguments[0] = mapObj->coords3.x; + gFieldEffectArguments[1] = mapObj->coords3.y; + gFieldEffectArguments[2] = 149; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = + bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; + FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); + } +} + +void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite) +{ + DoRippleFieldEffect(mapObj, sprite); +} + +void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj); +} + +void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj); +} + +void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + u8 spriteId; + + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); + + spriteId = sub_8126FF0( + mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y); + + if (spriteId == MAX_SPRITES) + GroundEffect_SpawnOnTallGrass(mapObj, sprite); +} + +void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); +} + +void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); +} + +void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); +} + +void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_DUST); +} + +void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj); +} + +void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj); +} + +void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + FieldEffectStart(FLDEFF_BUBBLES); +} + +static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { + GroundEffect_SpawnOnTallGrass, + sub_8063E94, + sub_8063EE0, + sub_8063F2C, + GroundEffect_WaterReflection, + GroundEffect_IceReflection, + GroundEffect_FlowingWater, + sub_8063FA0, + sub_8063FCC, + GroundEffect_Ripple, + GroundEffect_StepOnPuddle, + GroundEffect_SandPile, + GroundEffect_JumpOnTallGrass, + GroundEffect_JumpOnLongGrass, + GroundEffect_JumpOnShallowWater, + GroundEffect_JumpOnWater, + GroundEffect_JumpLandingDust, + GroundEffect_ShortGrass, + GroundEffect_HotSprings, + GroundEffect_Seaweed +}; + +void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1) + if (flags & 1) + gUnknown_083760A0[i](mapObj, sprite); +} + +void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags) +{ + if (mapObj->mapobj_bit_4) + { + mapObj->mapobj_bit_18 = 0; + mapObj->mapobj_bit_20 = 0; + mapObj->mapobj_bit_19 = 0; + mapObj->mapobj_bit_21 = 0; + *flags &= 0xFFF9F7BD; + } +} + +void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags) +{ + if (mapObj->mapobj_bit_5) + *flags &= 0xFFFFFBFF; +} + +void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_2) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnSpawn(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_2 = 0; + mapObj->mapobj_bit_4 = 0; + } +} + +void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_2) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + filters_out_some_ground_effects(mapObj, &flags); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_2 = 0; + mapObj->mapobj_bit_4 = 0; + } +} + +void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_3) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_3 = 0; + mapObj->mapobj_bit_5 = 0; + } +} + +typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); + +void Step1(struct Sprite *sprite, u8 dir); +void Step2(struct Sprite *sprite, u8 dir); +void Step3(struct Sprite *sprite, u8 dir); +void Step4(struct Sprite *sprite, u8 dir); +void Step8(struct Sprite *sprite, u8 dir); + +const SpriteStepFunc Unknown_83760F0[] = { + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1 +}; + +const SpriteStepFunc Unknown_8376130[] = { + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, + Step2 +}; + +const SpriteStepFunc Unknown_8376150[] = { + Step2, + Step3, + Step3, + Step2, + Step3, + Step3 +}; + +const SpriteStepFunc Unknown_8376168[] = { + Step4, + Step4, + Step4, + Step4 +}; + +const SpriteStepFunc Unknown_8376178[] = { + Step8, + Step8 +}; + +const SpriteStepFunc *const gUnknown_08376180[] = { + Unknown_83760F0, + Unknown_8376130, + Unknown_8376150, + Unknown_8376168, + Unknown_8376178 +}; + +const s16 gUnknown_08376194[] = { + 16, 8, 6, 4, 2 +}; + +const s8 Unknown_837619E[] = { + -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0 +}; + +const s8 Unknown_83761AE[] = { + 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0 +}; + +const s8 Unknown_83761BE[] = { + -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0 +}; + +const s8 *const gUnknown_083761D0[] = { + Unknown_837619E, + Unknown_83761AE, + Unknown_83761BE +}; + +bool8 FreezeMapObject(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) + { + return TRUE; + } + else + { + mapObject->mapobj_bit_8 = 1; + mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; + mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; + gSprites[mapObject->spriteId].animPaused = 1; + gSprites[mapObject->spriteId].affineAnimPaused = 1; + return FALSE; + } +} + +void FreezeMapObjects(void) +{ + u8 i; + for (i = 0; i < 16; i++) + if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) + FreezeMapObject(&gMapObjects[i]); +} + +void FreezeMapObjectsExceptOne(u8 a1) +{ + u8 i; + for (i = 0; i < 16; i++) + if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) + FreezeMapObject(&gMapObjects[i]); +} + +void UnfreezeMapObject(struct MapObject *mapObject) +{ + if (mapObject->active && mapObject->mapobj_bit_8) + { + mapObject->mapobj_bit_8 = 0; + gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; + gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; + } +} + +void UnfreezeMapObjects(void) +{ + u8 i; + for (i = 0; i < 16; i++) + if (gMapObjects[i].active) + UnfreezeMapObject(&gMapObjects[i]); +} + +void Step1(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += gDirectionToVector[dir].x; + sprite->pos1.y += gDirectionToVector[dir].y; +} + +void Step2(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y; +} + +void Step3(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y; +} + +void Step4(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y; +} + +void Step8(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y; +} + +void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->data[3] = a2; + sprite->data[4] = a3; + sprite->data[5] = 0; +} + +bool8 obj_npc_ministep(struct Sprite *sprite) +{ + if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]]) + return FALSE; + + gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); + + sprite->data[5]++; + + if (sprite->data[5] < gUnknown_08376194[sprite->data[4]]) + return FALSE; + + return TRUE; +} + +void sub_806467C(struct Sprite *sprite, u8 a2) +{ + sprite->data[3] = a2; + sprite->data[4] = 0; + sprite->data[5] = 0; +} + +bool8 sub_806468C(struct Sprite *sprite) +{ + if (!(sprite->data[4] & 1)) + { + Step1(sprite, sprite->data[3]); + sprite->data[5]++; + } + + sprite->data[4]++; + + if (sprite->data[5] > 15) + return TRUE; + else + return FALSE; +} + +s16 sub_80646C8(s16 a1, u8 a2) +{ + return gUnknown_083761D0[a2][a1]; +} + +void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) +{ + sprite->data[3] = a2; + sprite->data[4] = a3; + sprite->data[5] = a4; + sprite->data[6] = 0; +} + +u8 sub_8064704(struct Sprite *sprite) +{ + s16 v5[3] = {0x10, 0x10, 0x20}; + u8 v6[3] = {0, 0, 1}; + u8 v2 = 0; + + if (sprite->data[4]) + Step1(sprite, sprite->data[3]); + + sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + + sprite->data[6]++; + + if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) + v2 = 1; + + if (sprite->data[6] >= v5[sprite->data[4]]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +u8 sub_806478C(struct Sprite *sprite) +{ + s16 v5[3] = {0x20, 0x20, 0x40}; + u8 v6[3] = {1, 1, 2}; + u8 v2 = 0; + + if (sprite->data[4] && !(sprite->data[6] & 1)) + Step1(sprite, sprite->data[3]); + + sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + + sprite->data[6]++; + + if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) + v2 = 1; + + if (sprite->data[6] >= v5[sprite->data[4]]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +void sub_8064820(struct Sprite *sprite, s16 a2) +{ + sprite->data[3] = a2; +} + +bool8 sub_8064824(struct Sprite *sprite) +{ + sprite->data[3]--; + + if (sprite->data[3] == 0) + return TRUE; + else + return FALSE; +} + +void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->animNum = a2; + sprite->animPaused = 0 ; + SeekSpriteAnim(sprite, a3); +} + +bool8 sub_8064864(struct Sprite *sprite) +{ + if (sprite->animEnded) + return TRUE; + else + return FALSE; +} + +void sub_806487C(struct Sprite *sprite, bool8 invisible) +{ + u16 x, y; + s16 x2, y2; + + sprite->invisible = invisible; + + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + + x2 = x - (sprite->centerToCornerVecX >> 1); + y2 = y - (sprite->centerToCornerVecY >> 1); + + if ((s16)x > 255 || x2 < -16) + sprite->invisible = 1; + if ((s16)y > 175 || y2 < -16) + sprite->invisible = 1; +} + +void sub_8064970(struct Sprite *sprite) +{ + SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); + sub_806487C(sprite, 0); +} + +void sub_8064990(u8 a1, u8 dir) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1) + { + u8 animNum = FieldObjectDirectionToImageAnimId(dir); + StartSpriteAnim(sprite, animNum); + break; + } + } +} + +u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + return FieldEffectStart(fieldEffectId); +} + +void DoShadowFieldEffect(struct MapObject *mapObject) +{ + if (!mapObject->mapobj_bit_22) + { + mapObject->mapobj_bit_22 = 1; + oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); + } +} + +void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + gFieldEffectArguments[0] = sprite->pos1.x; + gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; + gFieldEffectArguments[2] = 151; + gFieldEffectArguments[3] = 3; + FieldEffectStart(FLDEFF_RIPPLE); +} diff --git a/src/field/field_effect.c b/src/field/field_effect.c index 5ff89574b..384da4bd2 100644 --- a/src/field/field_effect.c +++ b/src/field/field_effect.c @@ -15,14 +15,12 @@ #include "constants/songs.h" #include "decoration.h" #include "field_player_avatar.h" -#include "field_map_obj_helpers.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "metatile_behavior.h" #include "field_camera.h" #include "field_effect.h" #include "field_fadetransition.h" #include "fieldmap.h" -#include "field_map_obj.h" #include "util.h" #include "field_effect_helpers.h" diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c index 165829a55..3e1fb1c13 100644 --- a/src/field/field_effect_helpers.c +++ b/src/field/field_effect_helpers.c @@ -4,12 +4,10 @@ #include "metatile_behavior.h" #include "constants/songs.h" #include "sound.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_camera.h" -#include "field_map_obj_helpers.h" #include "field_weather.h" #include "field_effect.h" -#include "field_ground_effect.h" #include "field_effect_helpers.h" static void sub_81269E0(struct Sprite *); diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c index 5014e97e3..4350f7960 100644 --- a/src/field/field_fadetransition.c +++ b/src/field/field_fadetransition.c @@ -4,8 +4,7 @@ #include "field_door.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "field_special_scene.h" #include "field_weather.h" diff --git a/src/field/field_ground_effect.c b/src/field/field_ground_effect.c deleted file mode 100644 index 25b678ff9..000000000 --- a/src/field/field_ground_effect.c +++ /dev/null @@ -1,772 +0,0 @@ -#include "global.h" -#include "field_ground_effect.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "field_map_obj_helpers.h" -#include "fieldmap.h" -#include "metatile_behavior.h" - -static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8); -static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); -static void DoTracksGroundEffect_BikeTireTracks( - struct MapObject *mapObj, struct Sprite *sprite, u8); -void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); -u8 GetReflectionTypeByMetatileBehavior(u32 behavior); - -static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_Reflection(mapObj, flags); - GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags); - GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); -} - -static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_Reflection(mapObj, flags); - GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags); - GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags); - GetGroundEffectFlags_Tracks(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_Puddle(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); -} - -static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_Puddle(mapObj, flags); - GetGroundEffectFlags_Ripple(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); - GetGroundEffectFlags_Seaweed(mapObj, flags); - GetGroundEffectFlags_JumpLanding(mapObj, flags); -} - -void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) -{ - mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y); - mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y); -} - -void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) -{ - u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; - u8 type = FieldObjectCheckForReflectiveSurface(mapObj); - - if (type) - { - if (!mapObj->mapobj_bit_17) - { - mapObj->mapobj_bit_17 = 0; - mapObj->mapobj_bit_17 = 1; - *flags |= reflectionFlags[type - 1]; - } - } - else - { - mapObj->mapobj_bit_17 = 0; - } -} - -void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x1; -} - -void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x2; -} - -void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x4; -} - -void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x8; -} - -void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) - { - *flags |= 0x100; - } - else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) - || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) - { - *flags |= 0x80; - } -} - -void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_20) - { - mapObj->mapobj_bit_20 = 0; - mapObj->mapobj_bit_20 = 1; - *flags |= 0x800; - } - } - else - { - mapObj->mapobj_bit_20 = 0; - } -} - -void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) -{ - if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) - || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) - { - if (!mapObj->mapobj_bit_19) - { - mapObj->mapobj_bit_19 = 0; - mapObj->mapobj_bit_19 = 1; - *flags |= 0x40; - } - } - else - { - mapObj->mapobj_bit_19 = 0; - } -} - -void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) - { - *flags |= 0x400; - } -} - -void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E)) - *flags |= 0x200; -} - -void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_18) - { - mapObj->mapobj_bit_18 = 0; - mapObj->mapobj_bit_18 = 1; - *flags |= 0x20000; - } - } - else - { - mapObj->mapobj_bit_18 = 0; - } -} - -void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_21) - { - mapObj->mapobj_bit_21 = 0; - mapObj->mapobj_bit_21 = 1; - *flags |= 0x40000; - } - } - else - { - mapObj->mapobj_bit_21 = 0; - } -} - -void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E)) - *flags |= 0x80000; -} - -void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) -{ - typedef bool8 (*MetatileFunc)(u8); - - static const MetatileFunc metatileFuncs[] = { - MetatileBehavior_IsTallGrass, - MetatileBehavior_IsLongGrass, - MetatileBehavior_IsPuddle, - MetatileBehavior_IsSurfableWaterOrUnderwater, - MetatileBehavior_IsShallowFlowingWater, - MetatileBehavior_IsATile, - }; - - static const u32 jumpLandingFlags[] = { - 0x00001000, // Landing in tall grass - 0x00002000, // Landing in long grass - 0x00004000, // Landing on puddle - 0x00008000, // Landing on surfable water or underwater - 0x00004000, // Landing on shallow flowing water - 0x00010000, // Landing on any other type of ground - }; - - if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) - { - u8 i; - - for (i = 0; i < 6; i++) - { - if (metatileFuncs[i](mapObj->mapobj_unk_1E)) - { - *flags |= jumpLandingFlags[i]; - return; - } - } - } -} - -u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - - // ceil div by tile width? - s16 width = (info->width + 8) >> 4; - s16 height = (info->height + 8) >> 4; - s16 i; - s16 j; - u8 result; - u8 b; - s16 one; - -#define RETURN_REFLECTION_TYPE_AT(x, y) \ - b = MapGridGetMetatileBehaviorAt(x, y); \ - result = GetReflectionTypeByMetatileBehavior(b); \ - if (result != 0) \ - return result; - - for (i = 0, one = 1; i < height; i++) - { - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i) - for (j = 1; j < width; j++) - { - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i) - } - } - return 0; - -#undef RETURN_REFLECTION_TYPE_AT -} - -u8 GetReflectionTypeByMetatileBehavior(u32 behavior) -{ - if (MetatileBehavior_IsIce(behavior)) - return 1; - else if (MetatileBehavior_IsReflective(behavior)) - return 2; - else - return 0; -} - -u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) -{ - static bool8 (*const unknown_08376040[])(u8) = { - MetatileBehavior_IsJumpSouth, - MetatileBehavior_IsJumpNorth, - MetatileBehavior_IsJumpWest, - MetatileBehavior_IsJumpEast, - }; - - u8 b; - u8 index = z; - - if (index == 0) - return 0; - else if (index > 4) - index -= 4; - - index--; - b = MapGridGetMetatileBehaviorAt(x, y); - - if (unknown_08376040[index](b) == 1) - return index + 1; - - return 0; -} - -void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_4) - return; - - if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - return; - - if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F)) - return; - - sprite->subspriteTableNum = 4; - - if (ZCoordToPriority(mapObj->elevation) == 1) - sprite->subspriteTableNum = 5; -} - -bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) -{ - u8 mapZ; - - if (z == 0) - return FALSE; - - mapZ = MapGridGetZCoordAt(x, y); - - if (mapZ == 0 || mapZ == 0xF) - return FALSE; - - if (mapZ != z) - return TRUE; - - return FALSE; -} - -static const u8 sUnknown_08376050[] = { - 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 -}; - -// Each byte corresponds to a sprite priority for a field object. -// This is directly the inverse of gFieldObjectPriorities_08376070. -static const u8 sFieldObjectPriorities_08376060[] = { - 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 -}; - -// Each byte corresponds to a sprite priority for a field object. -// This is the inverse of gFieldObjectPriorities_08376060. -// 1 = Above player sprite -// 2 = Below player sprite -static const u8 sFieldObjectPriorities_08376070[] = { - 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, -}; - -void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_26) - return; - - FieldObjectUpdateZCoord(mapObj); - - sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation]; - sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation]; -} - -void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) -{ - sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z]; - sprite->oam.priority = sFieldObjectPriorities_08376060[z]; -} - -u8 ZCoordToPriority(u8 z) -{ - return sFieldObjectPriorities_08376060[z]; -} - -void FieldObjectUpdateZCoord(struct MapObject *mapObj) -{ - u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y); - u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y); - - if (z == 0xF || z2 == 0xF) - return; - - mapObj->mapobj_unk_0B_0 = z; - - if (z != 0 && z != 0xF) - mapObj->elevation = z; -} - -void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) -{ - s32 tmp = sprite->centerToCornerVecY; - u32 tmpa = *(u16 *)&sprite->pos1.y; - u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; - s32 tmp2 = (tmpa - tmp) + tmpb; - u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; - sprite->subpriority = tmp3 + sUnknown_08376050[a] + b; -} - -void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_26) - return; - - SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); -} - -bool8 AreZCoordsCompatible(u8 a, u8 b) -{ - if (a == 0 || b == 0) - return TRUE; - - if (a != b) - return FALSE; - - return TRUE; -} - -void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 1; - FieldEffectStart(FLDEFF_TALL_GRASS); -} - -void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 0; - FieldEffectStart(FLDEFF_TALL_GRASS); -} - -void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 1; - FieldEffectStart(FLDEFF_LONG_GRASS); -} - -void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 0; - FieldEffectStart(FLDEFF_LONG_GRASS); -} - -void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) -{ - SetUpReflection(mapObj, sprite, 0); -} - -void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite) -{ - SetUpReflection(mapObj, sprite, 1); -} - -void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); -} - -static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { - nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, -}; - -void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - gUnknown_08376080[info->tracks](mapObj, sprite, 0); -} - -void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - gUnknown_08376080[info->tracks](mapObj, sprite, 1); -} - -static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ -} - -static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ - // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) - u16 sandFootprints_FieldEffectData[2] = { - FLDEFF_SAND_FOOTPRINTS, - FLDEFF_DEEP_SAND_FOOTPRINTS - }; - - gFieldEffectArguments[0] = mapObj->coords3.x; - gFieldEffectArguments[1] = mapObj->coords3.y; - gFieldEffectArguments[2] = 149; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->mapobj_unk_18; - FieldEffectStart(sandFootprints_FieldEffectData[a]); -} - -static void DoTracksGroundEffect_BikeTireTracks( - struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ - // Specifies which bike track shape to show next. - // For example, when the bike turns from up to right, it will show - // a track that curves to the right. - // Each 4-byte row corresponds to the initial direction of the bike, and - // each byte in that row is for the next direction of the bike in the order - // of down, up, left, right. - static const u8 bikeTireTracks_Transitions[4][4] = { - 1, 2, 7, 8, - 1, 2, 6, 5, - 5, 8, 3, 4, - 6, 7, 3, 4, - }; - - if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) - { - gFieldEffectArguments[0] = mapObj->coords3.x; - gFieldEffectArguments[1] = mapObj->coords3.y; - gFieldEffectArguments[2] = 149; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = - bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; - FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); - } -} - -void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite) -{ - DoRippleFieldEffect(mapObj, sprite); -} - -void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj); -} - -void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj); -} - -void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - u8 spriteId; - - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); - - spriteId = sub_8126FF0( - mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y); - - if (spriteId == MAX_SPRITES) - GroundEffect_SpawnOnTallGrass(mapObj, sprite); -} - -void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); -} - -void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); -} - -void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); -} - -void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_DUST); -} - -void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj); -} - -void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj); -} - -void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - FieldEffectStart(FLDEFF_BUBBLES); -} - -static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { - GroundEffect_SpawnOnTallGrass, - sub_8063E94, - sub_8063EE0, - sub_8063F2C, - GroundEffect_WaterReflection, - GroundEffect_IceReflection, - GroundEffect_FlowingWater, - sub_8063FA0, - sub_8063FCC, - GroundEffect_Ripple, - GroundEffect_StepOnPuddle, - GroundEffect_SandPile, - GroundEffect_JumpOnTallGrass, - GroundEffect_JumpOnLongGrass, - GroundEffect_JumpOnShallowWater, - GroundEffect_JumpOnWater, - GroundEffect_JumpLandingDust, - GroundEffect_ShortGrass, - GroundEffect_HotSprings, - GroundEffect_Seaweed -}; - -void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1) - if (flags & 1) - gUnknown_083760A0[i](mapObj, sprite); -} - -void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags) -{ - if (mapObj->mapobj_bit_4) - { - mapObj->mapobj_bit_18 = 0; - mapObj->mapobj_bit_20 = 0; - mapObj->mapobj_bit_19 = 0; - mapObj->mapobj_bit_21 = 0; - *flags &= 0xFFF9F7BD; - } -} - -void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags) -{ - if (mapObj->mapobj_bit_5) - *flags &= 0xFFFFFBFF; -} - -void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_2) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnSpawn(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_2 = 0; - mapObj->mapobj_bit_4 = 0; - } -} - -void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_2) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - filters_out_some_ground_effects(mapObj, &flags); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_2 = 0; - mapObj->mapobj_bit_4 = 0; - } -} - -void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_3) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_3 = 0; - mapObj->mapobj_bit_5 = 0; - } -} diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c deleted file mode 100644 index 77b4c8b5c..000000000 --- a/src/field/field_map_obj.c +++ /dev/null @@ -1,8355 +0,0 @@ -#include "global.h" -#include "field_map_obj.h" -#include "berry.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "field_ground_effect.h" -#include "field_map_obj_helpers.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "palette.h" -#include "random.h" -#include "overworld.h" -#include "sprite.h" -#include "metatile_behavior.h" -#include "constants/maps.h" -#include "constants/map_objects.h" -#include "trainer_see.h" - -// rodata - -const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; - -void ObjectCB_CameraObject(struct Sprite *sprite); -const struct SpriteTemplate gSpriteTemplate_830FD24 = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; - -void CameraObject_0(struct Sprite *); -void CameraObject_1(struct Sprite *); -void CameraObject_2(struct Sprite *); -void (*const gCameraObjectFuncs[])(struct Sprite *) = { - CameraObject_0, - CameraObject_1, - CameraObject_2, -}; - -const u32 gMapObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/00.4bpp"); -const u32 gMapObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/01.4bpp"); -const u32 gMapObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/02.4bpp"); -const u32 gMapObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/03.4bpp"); -const u32 gMapObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/04.4bpp"); -const u32 gMapObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/05.4bpp"); -const u32 gMapObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/06.4bpp"); -const u32 gMapObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/07.4bpp"); -const u32 gMapObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/08.4bpp"); -const u32 gMapObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/09.4bpp"); -const u32 gMapObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/10.4bpp"); -const u32 gMapObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/11.4bpp"); -const u32 gMapObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/12.4bpp"); -const u32 gMapObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/13.4bpp"); -const u32 gMapObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/14.4bpp"); -const u32 gMapObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/15.4bpp"); -const u32 gMapObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/16.4bpp"); -const u32 gMapObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/17.4bpp"); -const u16 gMapObjectPalette8[] = INCBIN_U16("graphics/map_objects/palettes/08.gbapal"); -const u16 NullPalette_8310F68[16] = {}; -const u16 NullPalette_8310F88[16] = {}; -const u16 NullPalette_8310FA8[16] = {}; -const u16 NullPalette_8310FC8[16] = {}; -const u16 NullPalette_8310FE8[16] = {}; -const u16 NullPalette_8311008[16] = {}; -const u16 NullPalette_8311028[16] = {}; -const u16 NullPalette_8311048[16] = {}; -const u16 NullPalette_8311068[16] = {}; -const u16 NullPalette_8311088[16] = {}; -const u16 NullPalette_83110A8[16] = {}; -const u16 NullPalette_83110C8[16] = {}; -const u16 NullPalette_83110E8[16] = {}; -const u16 NullPalette_8311108[16] = {}; -const u16 NullPalette_8311128[16] = {}; -const u16 gMapObjectPalette9[] = INCBIN_U16("graphics/map_objects/palettes/09.gbapal"); -const u16 gMapObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/10.gbapal"); -const u32 gMapObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/0.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/1.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/2.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/3.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/4.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/0.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/3.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/1.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/4.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/2.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/5.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/0.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/1.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/2.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/3.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/4.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/5.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/6.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/7.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/8.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/00.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/01.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/02.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/03.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/04.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/05.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/06.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/07.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/08.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/09.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/10.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/11.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/12.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/13.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/14.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/15.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/16.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/17.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/18.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/19.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/20.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/21.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/22.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/23.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/24.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/25.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/26.4bpp"); -const u32 gMapObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/00.4bpp"); -const u32 gMapObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/01.4bpp"); -const u32 gMapObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/02.4bpp"); -const u32 gMapObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/03.4bpp"); -const u32 gMapObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/04.4bpp"); -const u32 gMapObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/05.4bpp"); -const u32 gMapObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/06.4bpp"); -const u32 gMapObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/07.4bpp"); -const u32 gMapObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/08.4bpp"); -const u32 gMapObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/09.4bpp"); -const u32 gMapObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/10.4bpp"); -const u32 gMapObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/11.4bpp"); -const u32 gMapObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/0.4bpp"); -const u32 gMapObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/3.4bpp"); -const u32 gMapObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/1.4bpp"); -const u32 gMapObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/4.4bpp"); -const u32 gMapObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/2.4bpp"); -const u32 gMapObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/5.4bpp"); -const u32 gMapObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/decorating.4bpp"); -const u32 gMapObjectPic_MayDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/may/decorating.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/0.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/1.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/2.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/3.4bpp"); -const u32 gMapObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/0.4bpp"); -const u32 gMapObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/1.4bpp"); -const u32 gMapObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/2.4bpp"); -const u32 gMapObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/3.4bpp"); -const u16 gMapObjectPalette11[] = INCBIN_U16("graphics/map_objects/palettes/11.gbapal"); -const u32 gMapObjectPic_MayNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/00.4bpp"); -const u32 gMapObjectPic_MayNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/01.4bpp"); -const u32 gMapObjectPic_MayNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/02.4bpp"); -const u32 gMapObjectPic_MayNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/03.4bpp"); -const u32 gMapObjectPic_MayNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/04.4bpp"); -const u32 gMapObjectPic_MayNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/05.4bpp"); -const u32 gMapObjectPic_MayNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/06.4bpp"); -const u32 gMapObjectPic_MayNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/07.4bpp"); -const u32 gMapObjectPic_MayNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/08.4bpp"); -const u32 gMapObjectPic_MayNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/09.4bpp"); -const u32 gMapObjectPic_MayNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/10.4bpp"); -const u32 gMapObjectPic_MayNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/11.4bpp"); -const u32 gMapObjectPic_MayNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/12.4bpp"); -const u32 gMapObjectPic_MayNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/13.4bpp"); -const u32 gMapObjectPic_MayNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/14.4bpp"); -const u32 gMapObjectPic_MayNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/15.4bpp"); -const u32 gMapObjectPic_MayNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/16.4bpp"); -const u32 gMapObjectPic_MayNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/17.4bpp"); -const u16 gMapObjectPalette17[] = INCBIN_U16("graphics/map_objects/palettes/17.gbapal"); -const u16 gMapObjectPalette18[] = INCBIN_U16("graphics/map_objects/palettes/18.gbapal"); -const u16 NullPalette_831B7E8[16] = {}; -const u16 NullPalette_831B808[16] = {}; -const u16 NullPalette_831B828[16] = {}; -const u16 NullPalette_831B848[16] = {}; -const u16 NullPalette_831B868[16] = {}; -const u16 NullPalette_831B888[16] = {}; -const u16 NullPalette_831B8A8[16] = {}; -const u16 NullPalette_831B8C8[16] = {}; -const u16 NullPalette_831B8E8[16] = {}; -const u16 NullPalette_831B908[16] = {}; -const u16 NullPalette_831B928[16] = {}; -const u16 NullPalette_831B948[16] = {}; -const u16 NullPalette_831B968[16] = {}; -const u16 NullPalette_831B988[16] = {}; -const u32 gMapObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/0.4bpp"); -const u32 gMapObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/1.4bpp"); -const u32 gMapObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/2.4bpp"); -const u32 gMapObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/3.4bpp"); -const u32 gMapObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/4.4bpp"); -const u32 gMapObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/5.4bpp"); -const u32 gMapObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/6.4bpp"); -const u32 gMapObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/7.4bpp"); -const u32 gMapObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/8.4bpp"); -const u32 gMapObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/00.4bpp"); -const u32 gMapObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/01.4bpp"); -const u32 gMapObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/02.4bpp"); -const u32 gMapObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/03.4bpp"); -const u32 gMapObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/04.4bpp"); -const u32 gMapObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/05.4bpp"); -const u32 gMapObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/06.4bpp"); -const u32 gMapObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/07.4bpp"); -const u32 gMapObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/08.4bpp"); -const u32 gMapObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/09.4bpp"); -const u32 gMapObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/10.4bpp"); -const u32 gMapObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/11.4bpp"); -const u32 gMapObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/12.4bpp"); -const u32 gMapObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/13.4bpp"); -const u32 gMapObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/14.4bpp"); -const u32 gMapObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/15.4bpp"); -const u32 gMapObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/16.4bpp"); -const u32 gMapObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/17.4bpp"); -const u32 gMapObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/18.4bpp"); -const u32 gMapObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/19.4bpp"); -const u32 gMapObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/20.4bpp"); -const u32 gMapObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/21.4bpp"); -const u32 gMapObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/22.4bpp"); -const u32 gMapObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/23.4bpp"); -const u32 gMapObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/24.4bpp"); -const u32 gMapObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/25.4bpp"); -const u32 gMapObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/26.4bpp"); -const u32 gMapObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/0.4bpp"); -const u32 gMapObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/3.4bpp"); -const u32 gMapObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/1.4bpp"); -const u32 gMapObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/4.4bpp"); -const u32 gMapObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/2.4bpp"); -const u32 gMapObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/5.4bpp"); -const u32 gMapObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/0.4bpp"); -const u32 gMapObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/1.4bpp"); -const u32 gMapObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/2.4bpp"); -const u32 gMapObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/3.4bpp"); -const u32 gMapObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/4.4bpp"); -const u32 gMapObjectPic_MayFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/00.4bpp"); -const u32 gMapObjectPic_MayFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/01.4bpp"); -const u32 gMapObjectPic_MayFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/02.4bpp"); -const u32 gMapObjectPic_MayFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/03.4bpp"); -const u32 gMapObjectPic_MayFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/04.4bpp"); -const u32 gMapObjectPic_MayFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/05.4bpp"); -const u32 gMapObjectPic_MayFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/06.4bpp"); -const u32 gMapObjectPic_MayFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/07.4bpp"); -const u32 gMapObjectPic_MayFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/08.4bpp"); -const u32 gMapObjectPic_MayFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/09.4bpp"); -const u32 gMapObjectPic_MayFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/10.4bpp"); -const u32 gMapObjectPic_MayFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/11.4bpp"); -const u32 gMapObjectPic_MayWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/0.4bpp"); -const u32 gMapObjectPic_MayWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/3.4bpp"); -const u32 gMapObjectPic_MayWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/1.4bpp"); -const u32 gMapObjectPic_MayWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/4.4bpp"); -const u32 gMapObjectPic_MayWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/2.4bpp"); -const u32 gMapObjectPic_MayWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/5.4bpp"); -const u16 gMapObjectPalette0[] = INCBIN_U16("graphics/map_objects/palettes/00.gbapal"); -const u16 gMapObjectPalette1[] = INCBIN_U16("graphics/map_objects/palettes/01.gbapal"); -const u16 gMapObjectPalette2[] = INCBIN_U16("graphics/map_objects/palettes/02.gbapal"); -const u16 gMapObjectPalette3[] = INCBIN_U16("graphics/map_objects/palettes/03.gbapal"); -const u16 gMapObjectPalette4[] = INCBIN_U16("graphics/map_objects/palettes/04.gbapal"); -const u16 gMapObjectPalette5[] = INCBIN_U16("graphics/map_objects/palettes/05.gbapal"); -const u16 gMapObjectPalette6[] = INCBIN_U16("graphics/map_objects/palettes/06.gbapal"); -const u16 gMapObjectPalette7[] = INCBIN_U16("graphics/map_objects/palettes/07.gbapal"); -const u32 gMapObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/0.4bpp"); -const u32 gMapObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/1.4bpp"); -const u32 gMapObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/2.4bpp"); -const u32 gMapObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/3.4bpp"); -const u32 gMapObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/4.4bpp"); -const u32 gMapObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/5.4bpp"); -const u32 gMapObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/6.4bpp"); -const u32 gMapObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/7.4bpp"); -const u32 gMapObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/8.4bpp"); -const u32 gMapObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/0.4bpp"); -const u32 gMapObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/1.4bpp"); -const u32 gMapObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/2.4bpp"); -const u32 gMapObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/3.4bpp"); -const u32 gMapObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/4.4bpp"); -const u32 gMapObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/5.4bpp"); -const u32 gMapObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/6.4bpp"); -const u32 gMapObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/7.4bpp"); -const u32 gMapObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/8.4bpp"); -const u32 gMapObjectPic_Boy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/0.4bpp"); -const u32 gMapObjectPic_Boy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/1.4bpp"); -const u32 gMapObjectPic_Boy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/2.4bpp"); -const u32 gMapObjectPic_Boy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/3.4bpp"); -const u32 gMapObjectPic_Boy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/4.4bpp"); -const u32 gMapObjectPic_Boy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/5.4bpp"); -const u32 gMapObjectPic_Boy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/6.4bpp"); -const u32 gMapObjectPic_Boy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/7.4bpp"); -const u32 gMapObjectPic_Boy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/8.4bpp"); -const u32 gMapObjectPic_Girl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/0.4bpp"); -const u32 gMapObjectPic_Girl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/1.4bpp"); -const u32 gMapObjectPic_Girl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/2.4bpp"); -const u32 gMapObjectPic_Girl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/3.4bpp"); -const u32 gMapObjectPic_Girl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/4.4bpp"); -const u32 gMapObjectPic_Girl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/5.4bpp"); -const u32 gMapObjectPic_Girl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/6.4bpp"); -const u32 gMapObjectPic_Girl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/7.4bpp"); -const u32 gMapObjectPic_Girl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/8.4bpp"); -const u32 gMapObjectPic_Boy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/0.4bpp"); -const u32 gMapObjectPic_Boy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/1.4bpp"); -const u32 gMapObjectPic_Boy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/2.4bpp"); -const u32 gMapObjectPic_Boy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/3.4bpp"); -const u32 gMapObjectPic_Boy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/4.4bpp"); -const u32 gMapObjectPic_Boy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/5.4bpp"); -const u32 gMapObjectPic_Boy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/6.4bpp"); -const u32 gMapObjectPic_Boy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/7.4bpp"); -const u32 gMapObjectPic_Boy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/8.4bpp"); -const u32 gMapObjectPic_Girl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/0.4bpp"); -const u32 gMapObjectPic_Girl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/1.4bpp"); -const u32 gMapObjectPic_Girl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/2.4bpp"); -const u32 gMapObjectPic_Girl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/3.4bpp"); -const u32 gMapObjectPic_Girl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/4.4bpp"); -const u32 gMapObjectPic_Girl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/5.4bpp"); -const u32 gMapObjectPic_Girl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/6.4bpp"); -const u32 gMapObjectPic_Girl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/7.4bpp"); -const u32 gMapObjectPic_Girl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/8.4bpp"); -const u32 gMapObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/0.4bpp"); -const u32 gMapObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/1.4bpp"); -const u32 gMapObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/2.4bpp"); -const u32 gMapObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/3.4bpp"); -const u32 gMapObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/4.4bpp"); -const u32 gMapObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/5.4bpp"); -const u32 gMapObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/6.4bpp"); -const u32 gMapObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/7.4bpp"); -const u32 gMapObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/8.4bpp"); -const u32 gMapObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/0.4bpp"); -const u32 gMapObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/1.4bpp"); -const u32 gMapObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/2.4bpp"); -const u32 gMapObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/3.4bpp"); -const u32 gMapObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/4.4bpp"); -const u32 gMapObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/5.4bpp"); -const u32 gMapObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/6.4bpp"); -const u32 gMapObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/7.4bpp"); -const u32 gMapObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/8.4bpp"); -const u32 gMapObjectPic_Boy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/0.4bpp"); -const u32 gMapObjectPic_Boy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/1.4bpp"); -const u32 gMapObjectPic_Boy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/2.4bpp"); -const u32 gMapObjectPic_Boy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/3.4bpp"); -const u32 gMapObjectPic_Boy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/4.4bpp"); -const u32 gMapObjectPic_Boy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/5.4bpp"); -const u32 gMapObjectPic_Boy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/6.4bpp"); -const u32 gMapObjectPic_Boy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/7.4bpp"); -const u32 gMapObjectPic_Boy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/8.4bpp"); -const u32 gMapObjectPic_Girl3_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/0.4bpp"); -const u32 gMapObjectPic_Girl3_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/1.4bpp"); -const u32 gMapObjectPic_Girl3_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/2.4bpp"); -const u32 gMapObjectPic_Girl3_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/3.4bpp"); -const u32 gMapObjectPic_Girl3_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/4.4bpp"); -const u32 gMapObjectPic_Girl3_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/5.4bpp"); -const u32 gMapObjectPic_Girl3_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/6.4bpp"); -const u32 gMapObjectPic_Girl3_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/7.4bpp"); -const u32 gMapObjectPic_Girl3_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/8.4bpp"); -const u32 gMapObjectPic_Boy4_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/0.4bpp"); -const u32 gMapObjectPic_Boy4_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/1.4bpp"); -const u32 gMapObjectPic_Boy4_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/2.4bpp"); -const u32 gMapObjectPic_Boy4_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/3.4bpp"); -const u32 gMapObjectPic_Boy4_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/4.4bpp"); -const u32 gMapObjectPic_Boy4_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/5.4bpp"); -const u32 gMapObjectPic_Boy4_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/6.4bpp"); -const u32 gMapObjectPic_Boy4_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/7.4bpp"); -const u32 gMapObjectPic_Boy4_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/8.4bpp"); -const u32 gMapObjectPic_Woman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/0.4bpp"); -const u32 gMapObjectPic_Woman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/1.4bpp"); -const u32 gMapObjectPic_Woman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/2.4bpp"); -const u32 gMapObjectPic_Woman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/3.4bpp"); -const u32 gMapObjectPic_Woman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/4.4bpp"); -const u32 gMapObjectPic_Woman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/5.4bpp"); -const u32 gMapObjectPic_Woman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/6.4bpp"); -const u32 gMapObjectPic_Woman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/7.4bpp"); -const u32 gMapObjectPic_Woman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/8.4bpp"); -const u32 gMapObjectPic_FatMan_0[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/0.4bpp"); -const u32 gMapObjectPic_FatMan_1[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/1.4bpp"); -const u32 gMapObjectPic_FatMan_2[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/2.4bpp"); -const u32 gMapObjectPic_FatMan_3[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/3.4bpp"); -const u32 gMapObjectPic_FatMan_4[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/4.4bpp"); -const u32 gMapObjectPic_FatMan_5[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/5.4bpp"); -const u32 gMapObjectPic_FatMan_6[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/6.4bpp"); -const u32 gMapObjectPic_FatMan_7[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/7.4bpp"); -const u32 gMapObjectPic_FatMan_8[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/8.4bpp"); -const u32 gMapObjectPic_Woman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/0.4bpp"); -const u32 gMapObjectPic_Woman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/1.4bpp"); -const u32 gMapObjectPic_Woman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/2.4bpp"); -const u32 gMapObjectPic_Woman2_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/3.4bpp"); -const u32 gMapObjectPic_Woman2_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/4.4bpp"); -const u32 gMapObjectPic_Woman2_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/5.4bpp"); -const u32 gMapObjectPic_Woman2_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/6.4bpp"); -const u32 gMapObjectPic_Woman2_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/7.4bpp"); -const u32 gMapObjectPic_Woman2_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/8.4bpp"); -const u32 gMapObjectPic_Man1_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/0.4bpp"); -const u32 gMapObjectPic_Man1_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/1.4bpp"); -const u32 gMapObjectPic_Man1_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/2.4bpp"); -const u32 gMapObjectPic_Man1_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/3.4bpp"); -const u32 gMapObjectPic_Man1_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/4.4bpp"); -const u32 gMapObjectPic_Man1_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/5.4bpp"); -const u32 gMapObjectPic_Man1_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/6.4bpp"); -const u32 gMapObjectPic_Man1_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/7.4bpp"); -const u32 gMapObjectPic_Man1_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/8.4bpp"); -const u32 gMapObjectPic_Woman3_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/0.4bpp"); -const u32 gMapObjectPic_Woman3_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/1.4bpp"); -const u32 gMapObjectPic_Woman3_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/2.4bpp"); -const u32 gMapObjectPic_Woman3_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/3.4bpp"); -const u32 gMapObjectPic_Woman3_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/4.4bpp"); -const u32 gMapObjectPic_Woman3_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/5.4bpp"); -const u32 gMapObjectPic_Woman3_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/6.4bpp"); -const u32 gMapObjectPic_Woman3_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/7.4bpp"); -const u32 gMapObjectPic_Woman3_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/8.4bpp"); -const u32 gMapObjectPic_OldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/0.4bpp"); -const u32 gMapObjectPic_OldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/1.4bpp"); -const u32 gMapObjectPic_OldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/2.4bpp"); -const u32 gMapObjectPic_OldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/3.4bpp"); -const u32 gMapObjectPic_OldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/4.4bpp"); -const u32 gMapObjectPic_OldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/5.4bpp"); -const u32 gMapObjectPic_OldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/6.4bpp"); -const u32 gMapObjectPic_OldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/7.4bpp"); -const u32 gMapObjectPic_OldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/8.4bpp"); -const u32 gMapObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/0.4bpp"); -const u32 gMapObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/1.4bpp"); -const u32 gMapObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/2.4bpp"); -const u32 gMapObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/3.4bpp"); -const u32 gMapObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/4.4bpp"); -const u32 gMapObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/5.4bpp"); -const u32 gMapObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/6.4bpp"); -const u32 gMapObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/7.4bpp"); -const u32 gMapObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/8.4bpp"); -const u32 gMapObjectPic_Man2_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/0.4bpp"); -const u32 gMapObjectPic_Man2_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/1.4bpp"); -const u32 gMapObjectPic_Man2_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/2.4bpp"); -const u32 gMapObjectPic_Man2_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/3.4bpp"); -const u32 gMapObjectPic_Man2_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/4.4bpp"); -const u32 gMapObjectPic_Man2_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/5.4bpp"); -const u32 gMapObjectPic_Man2_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/6.4bpp"); -const u32 gMapObjectPic_Man2_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/7.4bpp"); -const u32 gMapObjectPic_Man2_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/8.4bpp"); -const u32 gMapObjectPic_Woman4_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/0.4bpp"); -const u32 gMapObjectPic_Woman4_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/1.4bpp"); -const u32 gMapObjectPic_Woman4_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/2.4bpp"); -const u32 gMapObjectPic_Woman4_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/3.4bpp"); -const u32 gMapObjectPic_Woman4_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/4.4bpp"); -const u32 gMapObjectPic_Woman4_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/5.4bpp"); -const u32 gMapObjectPic_Woman4_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/6.4bpp"); -const u32 gMapObjectPic_Woman4_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/7.4bpp"); -const u32 gMapObjectPic_Woman4_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/8.4bpp"); -const u32 gMapObjectPic_Man3_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/0.4bpp"); -const u32 gMapObjectPic_Man3_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/1.4bpp"); -const u32 gMapObjectPic_Man3_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/2.4bpp"); -const u32 gMapObjectPic_Man3_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/3.4bpp"); -const u32 gMapObjectPic_Man3_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/4.4bpp"); -const u32 gMapObjectPic_Man3_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/5.4bpp"); -const u32 gMapObjectPic_Man3_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/6.4bpp"); -const u32 gMapObjectPic_Man3_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/7.4bpp"); -const u32 gMapObjectPic_Man3_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/8.4bpp"); -const u32 gMapObjectPic_Woman5_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/0.4bpp"); -const u32 gMapObjectPic_Woman5_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/1.4bpp"); -const u32 gMapObjectPic_Woman5_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/2.4bpp"); -const u32 gMapObjectPic_Woman5_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/3.4bpp"); -const u32 gMapObjectPic_Woman5_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/4.4bpp"); -const u32 gMapObjectPic_Woman5_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/5.4bpp"); -const u32 gMapObjectPic_Woman5_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/6.4bpp"); -const u32 gMapObjectPic_Woman5_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/7.4bpp"); -const u32 gMapObjectPic_Woman5_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/8.4bpp"); -const u32 gMapObjectPic_Cook_0[] = INCBIN_U32("graphics/map_objects/pics/people/cook/0.4bpp"); -const u32 gMapObjectPic_Cook_1[] = INCBIN_U32("graphics/map_objects/pics/people/cook/1.4bpp"); -const u32 gMapObjectPic_Cook_2[] = INCBIN_U32("graphics/map_objects/pics/people/cook/2.4bpp"); -const u32 gMapObjectPic_Woman6_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/0.4bpp"); -const u32 gMapObjectPic_Woman6_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/1.4bpp"); -const u32 gMapObjectPic_Woman6_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/2.4bpp"); -const u32 gMapObjectPic_Woman6_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/3.4bpp"); -const u32 gMapObjectPic_Woman6_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/4.4bpp"); -const u32 gMapObjectPic_Woman6_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/5.4bpp"); -const u32 gMapObjectPic_Woman6_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/6.4bpp"); -const u32 gMapObjectPic_Woman6_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/7.4bpp"); -const u32 gMapObjectPic_Woman6_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/8.4bpp"); -const u32 gMapObjectPic_OldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/0.4bpp"); -const u32 gMapObjectPic_OldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/1.4bpp"); -const u32 gMapObjectPic_OldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/2.4bpp"); -const u32 gMapObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/0.4bpp"); -const u32 gMapObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/1.4bpp"); -const u32 gMapObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/2.4bpp"); -const u32 gMapObjectPic_Camper_0[] = INCBIN_U32("graphics/map_objects/pics/people/camper/0.4bpp"); -const u32 gMapObjectPic_Camper_1[] = INCBIN_U32("graphics/map_objects/pics/people/camper/1.4bpp"); -const u32 gMapObjectPic_Camper_2[] = INCBIN_U32("graphics/map_objects/pics/people/camper/2.4bpp"); -const u32 gMapObjectPic_Camper_3[] = INCBIN_U32("graphics/map_objects/pics/people/camper/3.4bpp"); -const u32 gMapObjectPic_Camper_4[] = INCBIN_U32("graphics/map_objects/pics/people/camper/4.4bpp"); -const u32 gMapObjectPic_Camper_5[] = INCBIN_U32("graphics/map_objects/pics/people/camper/5.4bpp"); -const u32 gMapObjectPic_Camper_6[] = INCBIN_U32("graphics/map_objects/pics/people/camper/6.4bpp"); -const u32 gMapObjectPic_Camper_7[] = INCBIN_U32("graphics/map_objects/pics/people/camper/7.4bpp"); -const u32 gMapObjectPic_Camper_8[] = INCBIN_U32("graphics/map_objects/pics/people/camper/8.4bpp"); -const u32 gMapObjectPic_Picnicker_0[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/0.4bpp"); -const u32 gMapObjectPic_Picnicker_1[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/1.4bpp"); -const u32 gMapObjectPic_Picnicker_2[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/2.4bpp"); -const u32 gMapObjectPic_Picnicker_3[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/3.4bpp"); -const u32 gMapObjectPic_Picnicker_4[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/4.4bpp"); -const u32 gMapObjectPic_Picnicker_5[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/5.4bpp"); -const u32 gMapObjectPic_Picnicker_6[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/6.4bpp"); -const u32 gMapObjectPic_Picnicker_7[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/7.4bpp"); -const u32 gMapObjectPic_Picnicker_8[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/8.4bpp"); -const u32 gMapObjectPic_Man4_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/0.4bpp"); -const u32 gMapObjectPic_Man4_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/1.4bpp"); -const u32 gMapObjectPic_Man4_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/2.4bpp"); -const u32 gMapObjectPic_Man4_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/3.4bpp"); -const u32 gMapObjectPic_Man4_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/4.4bpp"); -const u32 gMapObjectPic_Man4_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/5.4bpp"); -const u32 gMapObjectPic_Man4_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/6.4bpp"); -const u32 gMapObjectPic_Man4_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/7.4bpp"); -const u32 gMapObjectPic_Man4_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/8.4bpp"); -const u32 gMapObjectPic_Woman7_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/0.4bpp"); -const u32 gMapObjectPic_Woman7_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/1.4bpp"); -const u32 gMapObjectPic_Woman7_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/2.4bpp"); -const u32 gMapObjectPic_Woman7_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/3.4bpp"); -const u32 gMapObjectPic_Woman7_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/4.4bpp"); -const u32 gMapObjectPic_Woman7_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/5.4bpp"); -const u32 gMapObjectPic_Woman7_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/6.4bpp"); -const u32 gMapObjectPic_Woman7_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/7.4bpp"); -const u32 gMapObjectPic_Woman7_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/8.4bpp"); -const u32 gMapObjectPic_Youngster_0[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/0.4bpp"); -const u32 gMapObjectPic_Youngster_1[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/1.4bpp"); -const u32 gMapObjectPic_Youngster_2[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/2.4bpp"); -const u32 gMapObjectPic_Youngster_3[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/3.4bpp"); -const u32 gMapObjectPic_Youngster_4[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/4.4bpp"); -const u32 gMapObjectPic_Youngster_5[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/5.4bpp"); -const u32 gMapObjectPic_Youngster_6[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/6.4bpp"); -const u32 gMapObjectPic_Youngster_7[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/7.4bpp"); -const u32 gMapObjectPic_Youngster_8[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/8.4bpp"); -const u32 gMapObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/0.4bpp"); -const u32 gMapObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/1.4bpp"); -const u32 gMapObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/2.4bpp"); -const u32 gMapObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/3.4bpp"); -const u32 gMapObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/4.4bpp"); -const u32 gMapObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/5.4bpp"); -const u32 gMapObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/6.4bpp"); -const u32 gMapObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/7.4bpp"); -const u32 gMapObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/8.4bpp"); -const u32 gMapObjectPic_PsychicM_0[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/0.4bpp"); -const u32 gMapObjectPic_PsychicM_1[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/1.4bpp"); -const u32 gMapObjectPic_PsychicM_2[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/2.4bpp"); -const u32 gMapObjectPic_PsychicM_3[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/3.4bpp"); -const u32 gMapObjectPic_PsychicM_4[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/4.4bpp"); -const u32 gMapObjectPic_PsychicM_5[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/5.4bpp"); -const u32 gMapObjectPic_PsychicM_6[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/6.4bpp"); -const u32 gMapObjectPic_PsychicM_7[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/7.4bpp"); -const u32 gMapObjectPic_PsychicM_8[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/8.4bpp"); -const u32 gMapObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/0.4bpp"); -const u32 gMapObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/1.4bpp"); -const u32 gMapObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/2.4bpp"); -const u32 gMapObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/3.4bpp"); -const u32 gMapObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/4.4bpp"); -const u32 gMapObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/5.4bpp"); -const u32 gMapObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/6.4bpp"); -const u32 gMapObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/7.4bpp"); -const u32 gMapObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/8.4bpp"); -const u32 gMapObjectPic_Maniac_0[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/0.4bpp"); -const u32 gMapObjectPic_Maniac_1[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/1.4bpp"); -const u32 gMapObjectPic_Maniac_2[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/2.4bpp"); -const u32 gMapObjectPic_Maniac_3[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/3.4bpp"); -const u32 gMapObjectPic_Maniac_4[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/4.4bpp"); -const u32 gMapObjectPic_Maniac_5[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/5.4bpp"); -const u32 gMapObjectPic_Maniac_6[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/6.4bpp"); -const u32 gMapObjectPic_Maniac_7[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/7.4bpp"); -const u32 gMapObjectPic_Maniac_8[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/8.4bpp"); -const u32 gMapObjectPic_HexManiac_0[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/0.4bpp"); -const u32 gMapObjectPic_HexManiac_1[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/1.4bpp"); -const u32 gMapObjectPic_HexManiac_2[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/2.4bpp"); -const u32 gMapObjectPic_HexManiac_3[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/3.4bpp"); -const u32 gMapObjectPic_HexManiac_4[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/4.4bpp"); -const u32 gMapObjectPic_HexManiac_5[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/5.4bpp"); -const u32 gMapObjectPic_HexManiac_6[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/6.4bpp"); -const u32 gMapObjectPic_HexManiac_7[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/7.4bpp"); -const u32 gMapObjectPic_HexManiac_8[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/8.4bpp"); -const u32 gMapObjectPic_Woman8_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/0.4bpp"); -const u32 gMapObjectPic_Woman8_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/1.4bpp"); -const u32 gMapObjectPic_Woman8_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/2.4bpp"); -const u32 gMapObjectPic_Woman8_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/3.4bpp"); -const u32 gMapObjectPic_Woman8_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/4.4bpp"); -const u32 gMapObjectPic_Woman8_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/5.4bpp"); -const u32 gMapObjectPic_Woman8_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/6.4bpp"); -const u32 gMapObjectPic_Woman8_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/7.4bpp"); -const u32 gMapObjectPic_Woman8_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/8.4bpp"); -const u32 gMapObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/0.4bpp"); -const u32 gMapObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/1.4bpp"); -const u32 gMapObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/2.4bpp"); -const u32 gMapObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/3.4bpp"); -const u32 gMapObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/4.4bpp"); -const u32 gMapObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/5.4bpp"); -const u32 gMapObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/6.4bpp"); -const u32 gMapObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/7.4bpp"); -const u32 gMapObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/8.4bpp"); -const u32 gMapObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/0.4bpp"); -const u32 gMapObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/1.4bpp"); -const u32 gMapObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/2.4bpp"); -const u32 gMapObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/3.4bpp"); -const u32 gMapObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/4.4bpp"); -const u32 gMapObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/5.4bpp"); -const u32 gMapObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/6.4bpp"); -const u32 gMapObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/7.4bpp"); -const u32 gMapObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/8.4bpp"); -const u32 gMapObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/0.4bpp"); -const u32 gMapObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/1.4bpp"); -const u32 gMapObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/2.4bpp"); -const u32 gMapObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/3.4bpp"); -const u32 gMapObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/4.4bpp"); -const u32 gMapObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/5.4bpp"); -const u32 gMapObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/6.4bpp"); -const u32 gMapObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/7.4bpp"); -const u32 gMapObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/8.4bpp"); -const u32 gMapObjectPic_Beauty_0[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/0.4bpp"); -const u32 gMapObjectPic_Beauty_1[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/1.4bpp"); -const u32 gMapObjectPic_Beauty_2[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/2.4bpp"); -const u32 gMapObjectPic_Beauty_3[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/3.4bpp"); -const u32 gMapObjectPic_Beauty_4[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/4.4bpp"); -const u32 gMapObjectPic_Beauty_5[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/5.4bpp"); -const u32 gMapObjectPic_Beauty_6[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/6.4bpp"); -const u32 gMapObjectPic_Beauty_7[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/7.4bpp"); -const u32 gMapObjectPic_Beauty_8[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/8.4bpp"); -const u32 gMapObjectPic_Scientist1_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/0.4bpp"); -const u32 gMapObjectPic_Scientist1_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/1.4bpp"); -const u32 gMapObjectPic_Scientist1_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/2.4bpp"); -const u32 gMapObjectPic_Scientist1_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/3.4bpp"); -const u32 gMapObjectPic_Scientist1_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/4.4bpp"); -const u32 gMapObjectPic_Scientist1_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/5.4bpp"); -const u32 gMapObjectPic_Scientist1_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/6.4bpp"); -const u32 gMapObjectPic_Scientist1_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/7.4bpp"); -const u32 gMapObjectPic_Scientist1_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/8.4bpp"); -const u32 gMapObjectPic_Lass_0[] = INCBIN_U32("graphics/map_objects/pics/people/lass/0.4bpp"); -const u32 gMapObjectPic_Lass_1[] = INCBIN_U32("graphics/map_objects/pics/people/lass/1.4bpp"); -const u32 gMapObjectPic_Lass_2[] = INCBIN_U32("graphics/map_objects/pics/people/lass/2.4bpp"); -const u32 gMapObjectPic_Lass_3[] = INCBIN_U32("graphics/map_objects/pics/people/lass/3.4bpp"); -const u32 gMapObjectPic_Lass_4[] = INCBIN_U32("graphics/map_objects/pics/people/lass/4.4bpp"); -const u32 gMapObjectPic_Lass_5[] = INCBIN_U32("graphics/map_objects/pics/people/lass/5.4bpp"); -const u32 gMapObjectPic_Lass_6[] = INCBIN_U32("graphics/map_objects/pics/people/lass/6.4bpp"); -const u32 gMapObjectPic_Lass_7[] = INCBIN_U32("graphics/map_objects/pics/people/lass/7.4bpp"); -const u32 gMapObjectPic_Lass_8[] = INCBIN_U32("graphics/map_objects/pics/people/lass/8.4bpp"); -const u32 gMapObjectPic_Gentleman_0[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/0.4bpp"); -const u32 gMapObjectPic_Gentleman_1[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/1.4bpp"); -const u32 gMapObjectPic_Gentleman_2[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/2.4bpp"); -const u32 gMapObjectPic_Gentleman_3[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/3.4bpp"); -const u32 gMapObjectPic_Gentleman_4[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/4.4bpp"); -const u32 gMapObjectPic_Gentleman_5[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/5.4bpp"); -const u32 gMapObjectPic_Gentleman_6[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/6.4bpp"); -const u32 gMapObjectPic_Gentleman_7[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/7.4bpp"); -const u32 gMapObjectPic_Gentleman_8[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/8.4bpp"); -const u32 gMapObjectPic_Sailor_0[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/0.4bpp"); -const u32 gMapObjectPic_Sailor_1[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/1.4bpp"); -const u32 gMapObjectPic_Sailor_2[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/2.4bpp"); -const u32 gMapObjectPic_Sailor_3[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/3.4bpp"); -const u32 gMapObjectPic_Sailor_4[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/4.4bpp"); -const u32 gMapObjectPic_Sailor_5[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/5.4bpp"); -const u32 gMapObjectPic_Sailor_6[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/6.4bpp"); -const u32 gMapObjectPic_Sailor_7[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/7.4bpp"); -const u32 gMapObjectPic_Sailor_8[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/8.4bpp"); -const u32 gMapObjectPic_Fisherman_0[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/0.4bpp"); -const u32 gMapObjectPic_Fisherman_1[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/1.4bpp"); -const u32 gMapObjectPic_Fisherman_2[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/2.4bpp"); -const u32 gMapObjectPic_Fisherman_3[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/3.4bpp"); -const u32 gMapObjectPic_Fisherman_4[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/4.4bpp"); -const u32 gMapObjectPic_Fisherman_5[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/5.4bpp"); -const u32 gMapObjectPic_Fisherman_6[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/6.4bpp"); -const u32 gMapObjectPic_Fisherman_7[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/7.4bpp"); -const u32 gMapObjectPic_Fisherman_8[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/8.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/0.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/1.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/2.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/3.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/4.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/5.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/6.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/7.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/8.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/0.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/1.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/2.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/3.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/4.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/5.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/6.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/7.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/8.4bpp"); -const u32 gMapObjectPic_TuberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/0.4bpp"); -const u32 gMapObjectPic_TuberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/1.4bpp"); -const u32 gMapObjectPic_TuberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/2.4bpp"); -const u32 gMapObjectPic_TuberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/3.4bpp"); -const u32 gMapObjectPic_TuberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/4.4bpp"); -const u32 gMapObjectPic_TuberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/5.4bpp"); -const u32 gMapObjectPic_TuberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/6.4bpp"); -const u32 gMapObjectPic_TuberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/7.4bpp"); -const u32 gMapObjectPic_TuberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/8.4bpp"); -const u32 gMapObjectPic_TuberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/0.4bpp"); -const u32 gMapObjectPic_TuberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/1.4bpp"); -const u32 gMapObjectPic_TuberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/2.4bpp"); -const u32 gMapObjectPic_TuberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/3.4bpp"); -const u32 gMapObjectPic_TuberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/4.4bpp"); -const u32 gMapObjectPic_TuberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/5.4bpp"); -const u32 gMapObjectPic_TuberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/6.4bpp"); -const u32 gMapObjectPic_TuberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/7.4bpp"); -const u32 gMapObjectPic_TuberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/8.4bpp"); -const u32 gMapObjectPic_Hiker_0[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/0.4bpp"); -const u32 gMapObjectPic_Hiker_1[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/1.4bpp"); -const u32 gMapObjectPic_Hiker_2[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/2.4bpp"); -const u32 gMapObjectPic_Hiker_3[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/3.4bpp"); -const u32 gMapObjectPic_Hiker_4[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/4.4bpp"); -const u32 gMapObjectPic_Hiker_5[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/5.4bpp"); -const u32 gMapObjectPic_Hiker_6[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/6.4bpp"); -const u32 gMapObjectPic_Hiker_7[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/7.4bpp"); -const u32 gMapObjectPic_Hiker_8[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/8.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/0.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/1.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/2.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/3.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/4.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/5.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/6.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/7.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/8.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/0.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/1.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/2.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/3.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/4.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/5.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/6.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/7.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/8.4bpp"); -const u32 gMapObjectPic_Man5_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/0.4bpp"); -const u32 gMapObjectPic_Man5_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/1.4bpp"); -const u32 gMapObjectPic_Man5_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/2.4bpp"); -const u32 gMapObjectPic_Man5_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/3.4bpp"); -const u32 gMapObjectPic_Man5_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/4.4bpp"); -const u32 gMapObjectPic_Man5_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/5.4bpp"); -const u32 gMapObjectPic_Man5_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/6.4bpp"); -const u32 gMapObjectPic_Man5_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/7.4bpp"); -const u32 gMapObjectPic_Man5_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/8.4bpp"); -const u32 gMapObjectPic_Man6_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/0.4bpp"); -const u32 gMapObjectPic_Man6_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/1.4bpp"); -const u32 gMapObjectPic_Man6_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/2.4bpp"); -const u32 gMapObjectPic_Man6_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/3.4bpp"); -const u32 gMapObjectPic_Man6_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/4.4bpp"); -const u32 gMapObjectPic_Man6_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/5.4bpp"); -const u32 gMapObjectPic_Man6_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/6.4bpp"); -const u32 gMapObjectPic_Man6_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/7.4bpp"); -const u32 gMapObjectPic_Man6_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/8.4bpp"); -const u32 gMapObjectPic_Nurse_0[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/0.4bpp"); -const u32 gMapObjectPic_Nurse_1[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/1.4bpp"); -const u32 gMapObjectPic_Nurse_2[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/2.4bpp"); -const u32 gMapObjectPic_Nurse_3[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/3.4bpp"); -const u32 gMapObjectPic_Nurse_4[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/4.4bpp"); -const u32 gMapObjectPic_Nurse_5[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/5.4bpp"); -const u32 gMapObjectPic_Nurse_6[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/6.4bpp"); -const u32 gMapObjectPic_Nurse_7[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/7.4bpp"); -const u32 gMapObjectPic_Nurse_8[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/8.4bpp"); -const u32 gMapObjectPic_Nurse_9[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/9.4bpp"); -const u32 gMapObjectPic_ItemBall[] = INCBIN_U32("graphics/map_objects/pics/misc/item_ball.4bpp"); -const u32 gMapObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/0.4bpp"); -const u32 gMapObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/1.4bpp"); -const u32 gMapObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/2.4bpp"); -const u32 gMapObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/3.4bpp"); -const u32 gMapObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/4.4bpp"); -const u32 gMapObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/5.4bpp"); -const u32 gMapObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/6.4bpp"); -const u32 gMapObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/7.4bpp"); -const u32 gMapObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/8.4bpp"); -const u32 gMapObjectPic_ReporterM_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/0.4bpp"); -const u32 gMapObjectPic_ReporterM_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/1.4bpp"); -const u32 gMapObjectPic_ReporterM_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/2.4bpp"); -const u32 gMapObjectPic_ReporterM_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/3.4bpp"); -const u32 gMapObjectPic_ReporterM_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/4.4bpp"); -const u32 gMapObjectPic_ReporterM_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/5.4bpp"); -const u32 gMapObjectPic_ReporterM_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/6.4bpp"); -const u32 gMapObjectPic_ReporterM_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/7.4bpp"); -const u32 gMapObjectPic_ReporterM_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/8.4bpp"); -const u32 gMapObjectPic_ReporterF_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/0.4bpp"); -const u32 gMapObjectPic_ReporterF_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/1.4bpp"); -const u32 gMapObjectPic_ReporterF_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/2.4bpp"); -const u32 gMapObjectPic_ReporterF_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/3.4bpp"); -const u32 gMapObjectPic_ReporterF_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/4.4bpp"); -const u32 gMapObjectPic_ReporterF_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/5.4bpp"); -const u32 gMapObjectPic_ReporterF_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/6.4bpp"); -const u32 gMapObjectPic_ReporterF_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/7.4bpp"); -const u32 gMapObjectPic_ReporterF_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/8.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/0.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/1.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/2.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/3.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/4.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/5.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/6.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/7.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/8.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/0.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/1.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/2.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/3.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/4.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/5.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/6.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/7.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/8.4bpp"); -const u32 gMapObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/0.4bpp"); -const u32 gMapObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/1.4bpp"); -const u32 gMapObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/2.4bpp"); -const u32 gMapObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/3.4bpp"); -const u32 gMapObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/4.4bpp"); -const u32 gMapObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/5.4bpp"); -const u32 gMapObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/6.4bpp"); -const u32 gMapObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/7.4bpp"); -const u32 gMapObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/8.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/0.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/1.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/2.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/3.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/4.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/5.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/6.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/7.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/8.4bpp"); -const u32 gMapObjectPic_Teala_0[] = INCBIN_U32("graphics/map_objects/pics/people/teala/0.4bpp"); -const u32 gMapObjectPic_Teala_1[] = INCBIN_U32("graphics/map_objects/pics/people/teala/1.4bpp"); -const u32 gMapObjectPic_Teala_2[] = INCBIN_U32("graphics/map_objects/pics/people/teala/2.4bpp"); -const u32 gMapObjectPic_Teala_3[] = INCBIN_U32("graphics/map_objects/pics/people/teala/3.4bpp"); -const u32 gMapObjectPic_Teala_4[] = INCBIN_U32("graphics/map_objects/pics/people/teala/4.4bpp"); -const u32 gMapObjectPic_Teala_5[] = INCBIN_U32("graphics/map_objects/pics/people/teala/5.4bpp"); -const u32 gMapObjectPic_Teala_6[] = INCBIN_U32("graphics/map_objects/pics/people/teala/6.4bpp"); -const u32 gMapObjectPic_Teala_7[] = INCBIN_U32("graphics/map_objects/pics/people/teala/7.4bpp"); -const u32 gMapObjectPic_Teala_8[] = INCBIN_U32("graphics/map_objects/pics/people/teala/8.4bpp"); -const u32 gMapObjectPic_Artist_0[] = INCBIN_U32("graphics/map_objects/pics/people/artist/0.4bpp"); -const u32 gMapObjectPic_Artist_1[] = INCBIN_U32("graphics/map_objects/pics/people/artist/1.4bpp"); -const u32 gMapObjectPic_Artist_2[] = INCBIN_U32("graphics/map_objects/pics/people/artist/2.4bpp"); -const u32 gMapObjectPic_Artist_3[] = INCBIN_U32("graphics/map_objects/pics/people/artist/3.4bpp"); -const u32 gMapObjectPic_Artist_4[] = INCBIN_U32("graphics/map_objects/pics/people/artist/4.4bpp"); -const u32 gMapObjectPic_Artist_5[] = INCBIN_U32("graphics/map_objects/pics/people/artist/5.4bpp"); -const u32 gMapObjectPic_Artist_6[] = INCBIN_U32("graphics/map_objects/pics/people/artist/6.4bpp"); -const u32 gMapObjectPic_Artist_7[] = INCBIN_U32("graphics/map_objects/pics/people/artist/7.4bpp"); -const u32 gMapObjectPic_Artist_8[] = INCBIN_U32("graphics/map_objects/pics/people/artist/8.4bpp"); -const u32 gMapObjectPic_Cameraman_0[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/0.4bpp"); -const u32 gMapObjectPic_Cameraman_1[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/1.4bpp"); -const u32 gMapObjectPic_Cameraman_2[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/2.4bpp"); -const u32 gMapObjectPic_Cameraman_3[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/3.4bpp"); -const u32 gMapObjectPic_Cameraman_4[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/4.4bpp"); -const u32 gMapObjectPic_Cameraman_5[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/5.4bpp"); -const u32 gMapObjectPic_Cameraman_6[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/6.4bpp"); -const u32 gMapObjectPic_Cameraman_7[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/7.4bpp"); -const u32 gMapObjectPic_Cameraman_8[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/8.4bpp"); -const u32 gMapObjectPic_Scientist2_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/0.4bpp"); -const u32 gMapObjectPic_Scientist2_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/1.4bpp"); -const u32 gMapObjectPic_Scientist2_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/2.4bpp"); -const u32 gMapObjectPic_Scientist2_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/3.4bpp"); -const u32 gMapObjectPic_Scientist2_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/4.4bpp"); -const u32 gMapObjectPic_Scientist2_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/5.4bpp"); -const u32 gMapObjectPic_Scientist2_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/6.4bpp"); -const u32 gMapObjectPic_Scientist2_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/7.4bpp"); -const u32 gMapObjectPic_Scientist2_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/8.4bpp"); -const u32 gMapObjectPic_Man7_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/0.4bpp"); -const u32 gMapObjectPic_Man7_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/1.4bpp"); -const u32 gMapObjectPic_Man7_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/2.4bpp"); -const u32 gMapObjectPic_Man7_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/3.4bpp"); -const u32 gMapObjectPic_Man7_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/4.4bpp"); -const u32 gMapObjectPic_Man7_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/5.4bpp"); -const u32 gMapObjectPic_Man7_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/6.4bpp"); -const u32 gMapObjectPic_Man7_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/7.4bpp"); -const u32 gMapObjectPic_Man7_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/8.4bpp"); -const u32 gMapObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/0.4bpp"); -const u32 gMapObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/1.4bpp"); -const u32 gMapObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/2.4bpp"); -const u32 gMapObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/3.4bpp"); -const u32 gMapObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/4.4bpp"); -const u32 gMapObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/5.4bpp"); -const u32 gMapObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/6.4bpp"); -const u32 gMapObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/7.4bpp"); -const u32 gMapObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/8.4bpp"); -const u32 gMapObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/0.4bpp"); -const u32 gMapObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/1.4bpp"); -const u32 gMapObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/2.4bpp"); -const u32 gMapObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/3.4bpp"); -const u32 gMapObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/4.4bpp"); -const u32 gMapObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/5.4bpp"); -const u32 gMapObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/6.4bpp"); -const u32 gMapObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/7.4bpp"); -const u32 gMapObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/8.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/0.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/1.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/2.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/3.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/4.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/5.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/6.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/7.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/8.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/0.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/1.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/2.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/3.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/4.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/5.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/6.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/7.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/8.4bpp"); -const u32 gMapObjectPic_Sidney_0[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/0.4bpp"); -const u32 gMapObjectPic_Sidney_1[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/1.4bpp"); -const u32 gMapObjectPic_Sidney_2[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/2.4bpp"); -const u32 gMapObjectPic_Phoebe_0[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/0.4bpp"); -const u32 gMapObjectPic_Phoebe_1[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/1.4bpp"); -const u32 gMapObjectPic_Phoebe_2[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/2.4bpp"); -const u32 gMapObjectPic_Glacia_0[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/0.4bpp"); -const u32 gMapObjectPic_Glacia_1[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/1.4bpp"); -const u32 gMapObjectPic_Glacia_2[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/2.4bpp"); -const u32 gMapObjectPic_Drake_0[] = INCBIN_U32("graphics/map_objects/pics/people/drake/0.4bpp"); -const u32 gMapObjectPic_Drake_1[] = INCBIN_U32("graphics/map_objects/pics/people/drake/1.4bpp"); -const u32 gMapObjectPic_Drake_2[] = INCBIN_U32("graphics/map_objects/pics/people/drake/2.4bpp"); -const u32 gMapObjectPic_Roxanne_0[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/0.4bpp"); -const u32 gMapObjectPic_Roxanne_1[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/1.4bpp"); -const u32 gMapObjectPic_Roxanne_2[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/2.4bpp"); -const u32 gMapObjectPic_Brawly_0[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/0.4bpp"); -const u32 gMapObjectPic_Brawly_1[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/1.4bpp"); -const u32 gMapObjectPic_Brawly_2[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/2.4bpp"); -const u32 gMapObjectPic_Wattson_0[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/0.4bpp"); -const u32 gMapObjectPic_Wattson_1[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/1.4bpp"); -const u32 gMapObjectPic_Wattson_2[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/2.4bpp"); -const u32 gMapObjectPic_Flannery_0[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/0.4bpp"); -const u32 gMapObjectPic_Flannery_1[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/1.4bpp"); -const u32 gMapObjectPic_Flannery_2[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/2.4bpp"); -const u32 gMapObjectPic_Norman_0[] = INCBIN_U32("graphics/map_objects/pics/people/norman/0.4bpp"); -const u32 gMapObjectPic_Norman_1[] = INCBIN_U32("graphics/map_objects/pics/people/norman/1.4bpp"); -const u32 gMapObjectPic_Norman_2[] = INCBIN_U32("graphics/map_objects/pics/people/norman/2.4bpp"); -const u32 gMapObjectPic_Norman_3[] = INCBIN_U32("graphics/map_objects/pics/people/norman/3.4bpp"); -const u32 gMapObjectPic_Norman_4[] = INCBIN_U32("graphics/map_objects/pics/people/norman/4.4bpp"); -const u32 gMapObjectPic_Norman_5[] = INCBIN_U32("graphics/map_objects/pics/people/norman/5.4bpp"); -const u32 gMapObjectPic_Norman_6[] = INCBIN_U32("graphics/map_objects/pics/people/norman/6.4bpp"); -const u32 gMapObjectPic_Norman_7[] = INCBIN_U32("graphics/map_objects/pics/people/norman/7.4bpp"); -const u32 gMapObjectPic_Norman_8[] = INCBIN_U32("graphics/map_objects/pics/people/norman/8.4bpp"); -const u32 gMapObjectPic_Winona_0[] = INCBIN_U32("graphics/map_objects/pics/people/winona/0.4bpp"); -const u32 gMapObjectPic_Winona_1[] = INCBIN_U32("graphics/map_objects/pics/people/winona/1.4bpp"); -const u32 gMapObjectPic_Winona_2[] = INCBIN_U32("graphics/map_objects/pics/people/winona/2.4bpp"); -const u32 gMapObjectPic_Liza_0[] = INCBIN_U32("graphics/map_objects/pics/people/liza/0.4bpp"); -const u32 gMapObjectPic_Liza_1[] = INCBIN_U32("graphics/map_objects/pics/people/liza/1.4bpp"); -const u32 gMapObjectPic_Liza_2[] = INCBIN_U32("graphics/map_objects/pics/people/liza/2.4bpp"); -const u32 gMapObjectPic_Tate_0[] = INCBIN_U32("graphics/map_objects/pics/people/tate/0.4bpp"); -const u32 gMapObjectPic_Tate_1[] = INCBIN_U32("graphics/map_objects/pics/people/tate/1.4bpp"); -const u32 gMapObjectPic_Tate_2[] = INCBIN_U32("graphics/map_objects/pics/people/tate/2.4bpp"); -const u32 gMapObjectPic_Wallace_0[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/0.4bpp"); -const u32 gMapObjectPic_Wallace_1[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/1.4bpp"); -const u32 gMapObjectPic_Wallace_2[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/2.4bpp"); -const u32 gMapObjectPic_Wallace_3[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/3.4bpp"); -const u32 gMapObjectPic_Wallace_4[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/4.4bpp"); -const u32 gMapObjectPic_Wallace_5[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/5.4bpp"); -const u32 gMapObjectPic_Wallace_6[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/6.4bpp"); -const u32 gMapObjectPic_Wallace_7[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/7.4bpp"); -const u32 gMapObjectPic_Wallace_8[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/8.4bpp"); -const u32 gMapObjectPic_Steven_0[] = INCBIN_U32("graphics/map_objects/pics/people/steven/0.4bpp"); -const u32 gMapObjectPic_Steven_1[] = INCBIN_U32("graphics/map_objects/pics/people/steven/1.4bpp"); -const u32 gMapObjectPic_Steven_2[] = INCBIN_U32("graphics/map_objects/pics/people/steven/2.4bpp"); -const u32 gMapObjectPic_Steven_3[] = INCBIN_U32("graphics/map_objects/pics/people/steven/3.4bpp"); -const u32 gMapObjectPic_Steven_4[] = INCBIN_U32("graphics/map_objects/pics/people/steven/4.4bpp"); -const u32 gMapObjectPic_Steven_5[] = INCBIN_U32("graphics/map_objects/pics/people/steven/5.4bpp"); -const u32 gMapObjectPic_Steven_6[] = INCBIN_U32("graphics/map_objects/pics/people/steven/6.4bpp"); -const u32 gMapObjectPic_Steven_7[] = INCBIN_U32("graphics/map_objects/pics/people/steven/7.4bpp"); -const u32 gMapObjectPic_Steven_8[] = INCBIN_U32("graphics/map_objects/pics/people/steven/8.4bpp"); -const u32 gMapObjectPic_Wally_0[] = INCBIN_U32("graphics/map_objects/pics/people/wally/0.4bpp"); -const u32 gMapObjectPic_Wally_1[] = INCBIN_U32("graphics/map_objects/pics/people/wally/1.4bpp"); -const u32 gMapObjectPic_Wally_2[] = INCBIN_U32("graphics/map_objects/pics/people/wally/2.4bpp"); -const u32 gMapObjectPic_Wally_3[] = INCBIN_U32("graphics/map_objects/pics/people/wally/3.4bpp"); -const u32 gMapObjectPic_Wally_4[] = INCBIN_U32("graphics/map_objects/pics/people/wally/4.4bpp"); -const u32 gMapObjectPic_Wally_5[] = INCBIN_U32("graphics/map_objects/pics/people/wally/5.4bpp"); -const u32 gMapObjectPic_Wally_6[] = INCBIN_U32("graphics/map_objects/pics/people/wally/6.4bpp"); -const u32 gMapObjectPic_Wally_7[] = INCBIN_U32("graphics/map_objects/pics/people/wally/7.4bpp"); -const u32 gMapObjectPic_Wally_8[] = INCBIN_U32("graphics/map_objects/pics/people/wally/8.4bpp"); -const u32 gMapObjectPic_LittleBoy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/0.4bpp"); -const u32 gMapObjectPic_LittleBoy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/1.4bpp"); -const u32 gMapObjectPic_LittleBoy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/2.4bpp"); -const u32 gMapObjectPic_LittleBoy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/3.4bpp"); -const u32 gMapObjectPic_LittleBoy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/4.4bpp"); -const u32 gMapObjectPic_LittleBoy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/5.4bpp"); -const u32 gMapObjectPic_LittleBoy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/6.4bpp"); -const u32 gMapObjectPic_LittleBoy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/7.4bpp"); -const u32 gMapObjectPic_LittleBoy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/8.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/0.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/1.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/2.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/3.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/4.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/5.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/6.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/7.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/8.4bpp"); -const u32 gMapObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/0.4bpp"); -const u32 gMapObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/1.4bpp"); -const u32 gMapObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/2.4bpp"); -const u32 gMapObjectPic_Boy5_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/0.4bpp"); -const u32 gMapObjectPic_Boy5_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/1.4bpp"); -const u32 gMapObjectPic_Boy5_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/2.4bpp"); -const u32 gMapObjectPic_ContestJudge_0[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/0.4bpp"); -const u32 gMapObjectPic_ContestJudge_1[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/1.4bpp"); -const u32 gMapObjectPic_ContestJudge_2[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/2.4bpp"); -const u32 gMapObjectPic_ContestJudge_3[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/3.4bpp"); -const u32 gMapObjectPic_ContestJudge_4[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/4.4bpp"); -const u32 gMapObjectPic_ContestJudge_5[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/5.4bpp"); -const u32 gMapObjectPic_ContestJudge_6[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/6.4bpp"); -const u32 gMapObjectPic_ContestJudge_7[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/7.4bpp"); -const u32 gMapObjectPic_ContestJudge_8[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/8.4bpp"); -const u32 gMapObjectPic_Archie_0[] = INCBIN_U32("graphics/map_objects/pics/people/archie/0.4bpp"); -const u32 gMapObjectPic_Archie_1[] = INCBIN_U32("graphics/map_objects/pics/people/archie/1.4bpp"); -const u32 gMapObjectPic_Archie_2[] = INCBIN_U32("graphics/map_objects/pics/people/archie/2.4bpp"); -const u32 gMapObjectPic_Archie_3[] = INCBIN_U32("graphics/map_objects/pics/people/archie/3.4bpp"); -const u32 gMapObjectPic_Archie_4[] = INCBIN_U32("graphics/map_objects/pics/people/archie/4.4bpp"); -const u32 gMapObjectPic_Archie_5[] = INCBIN_U32("graphics/map_objects/pics/people/archie/5.4bpp"); -const u32 gMapObjectPic_Archie_6[] = INCBIN_U32("graphics/map_objects/pics/people/archie/6.4bpp"); -const u32 gMapObjectPic_Archie_7[] = INCBIN_U32("graphics/map_objects/pics/people/archie/7.4bpp"); -const u32 gMapObjectPic_Archie_8[] = INCBIN_U32("graphics/map_objects/pics/people/archie/8.4bpp"); -const u32 gMapObjectPic_Maxie_0[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/0.4bpp"); -const u32 gMapObjectPic_Maxie_1[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/1.4bpp"); -const u32 gMapObjectPic_Maxie_2[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/2.4bpp"); -const u32 gMapObjectPic_Maxie_3[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/3.4bpp"); -const u32 gMapObjectPic_Maxie_4[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/4.4bpp"); -const u32 gMapObjectPic_Maxie_5[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/5.4bpp"); -const u32 gMapObjectPic_Maxie_6[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/6.4bpp"); -const u32 gMapObjectPic_Maxie_7[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/7.4bpp"); -const u32 gMapObjectPic_Maxie_8[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/8.4bpp"); -const u32 gMapObjectPic_Kyogre_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/0.4bpp"); -const u32 gMapObjectPic_Kyogre_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/1.4bpp"); -const u32 gMapObjectPic_Groudon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/0.4bpp"); -const u32 gMapObjectPic_Groudon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/1.4bpp"); -const u32 gMapObjectPic_Regi[] = INCBIN_U32("graphics/map_objects/pics/pokemon/regi.4bpp"); -const u32 gMapObjectPic_Skitty_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/0.4bpp"); -const u32 gMapObjectPic_Skitty_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/1.4bpp"); -const u32 gMapObjectPic_Skitty_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/2.4bpp"); -const u32 gMapObjectPic_Kecleon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/0.4bpp"); -const u32 gMapObjectPic_Kecleon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/1.4bpp"); -const u32 gMapObjectPic_Kecleon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/2.4bpp"); -const u32 gMapObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/0.4bpp"); -const u32 gMapObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/1.4bpp"); -const u32 gMapObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/0.4bpp"); -const u32 gMapObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/1.4bpp"); -const u32 gMapObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/2.4bpp"); -const u32 gMapObjectPic_Pikachu_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/0.4bpp"); -const u32 gMapObjectPic_Pikachu_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/1.4bpp"); -const u32 gMapObjectPic_Pikachu_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/2.4bpp"); -const u32 gMapObjectPic_Azumarill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/0.4bpp"); -const u32 gMapObjectPic_Azumarill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/1.4bpp"); -const u32 gMapObjectPic_Azumarill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/2.4bpp"); -const u32 gMapObjectPic_Wingull_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/0.4bpp"); -const u32 gMapObjectPic_Wingull_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/3.4bpp"); -const u32 gMapObjectPic_Wingull_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/1.4bpp"); -const u32 gMapObjectPic_Wingull_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/4.4bpp"); -const u32 gMapObjectPic_Wingull_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/2.4bpp"); -const u32 gMapObjectPic_Wingull_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/5.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/0.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/1.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/2.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/3.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/4.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/5.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/6.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/7.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/8.4bpp"); -const u32 gMapObjectPic_Azurill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/0.4bpp"); -const u32 gMapObjectPic_Azurill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/1.4bpp"); -const u32 gMapObjectPic_Azurill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/2.4bpp"); -const u32 gMapObjectPic_Mom_0[] = INCBIN_U32("graphics/map_objects/pics/people/mom/0.4bpp"); -const u32 gMapObjectPic_Mom_1[] = INCBIN_U32("graphics/map_objects/pics/people/mom/1.4bpp"); -const u32 gMapObjectPic_Mom_2[] = INCBIN_U32("graphics/map_objects/pics/people/mom/2.4bpp"); -const u32 gMapObjectPic_Mom_3[] = INCBIN_U32("graphics/map_objects/pics/people/mom/3.4bpp"); -const u32 gMapObjectPic_Mom_4[] = INCBIN_U32("graphics/map_objects/pics/people/mom/4.4bpp"); -const u32 gMapObjectPic_Mom_5[] = INCBIN_U32("graphics/map_objects/pics/people/mom/5.4bpp"); -const u32 gMapObjectPic_Mom_6[] = INCBIN_U32("graphics/map_objects/pics/people/mom/6.4bpp"); -const u32 gMapObjectPic_Mom_7[] = INCBIN_U32("graphics/map_objects/pics/people/mom/7.4bpp"); -const u32 gMapObjectPic_Mom_8[] = INCBIN_U32("graphics/map_objects/pics/people/mom/8.4bpp"); -const u16 gMapObjectPalette22[] = INCBIN_U16("graphics/map_objects/palettes/22.gbapal"); -const u16 gMapObjectPalette23[] = INCBIN_U16("graphics/map_objects/palettes/23.gbapal"); -const u16 gMapObjectPalette24[] = INCBIN_U16("graphics/map_objects/palettes/24.gbapal"); -const u16 gMapObjectPalette25[] = INCBIN_U16("graphics/map_objects/palettes/25.gbapal"); -const u32 gMapObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_natu_doll.4bpp"); -const u32 gMapObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_magnemite_doll.4bpp"); -const u32 gMapObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_squirtle_doll.4bpp"); -const u32 gMapObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_wooper_doll.4bpp"); -const u32 gMapObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_pikachu_doll.4bpp"); -const u32 gMapObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_porygon2_doll.4bpp"); -const u32 gMapObjectPic_PichuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pichu_doll.4bpp"); -const u32 gMapObjectPic_PikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pikachu_doll.4bpp"); -const u32 gMapObjectPic_MarillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/marill_doll.4bpp"); -const u32 gMapObjectPic_TogepiDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/togepi_doll.4bpp"); -const u32 gMapObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/cyndaquil_doll.4bpp"); -const u32 gMapObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/chikorita_doll.4bpp"); -const u32 gMapObjectPic_TotodileDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/totodile_doll.4bpp"); -const u32 gMapObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/jigglypuff_doll.4bpp"); -const u32 gMapObjectPic_MeowthDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/meowth_doll.4bpp"); -const u32 gMapObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/clefairy_doll.4bpp"); -const u32 gMapObjectPic_DittoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/ditto_doll.4bpp"); -const u32 gMapObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/smoochum_doll.4bpp"); -const u32 gMapObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/treecko_doll.4bpp"); -const u32 gMapObjectPic_TorchicDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/torchic_doll.4bpp"); -const u32 gMapObjectPic_MudkipDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/mudkip_doll.4bpp"); -const u32 gMapObjectPic_DuskullDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/duskull_doll.4bpp"); -const u32 gMapObjectPic_WynautDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/wynaut_doll.4bpp"); -const u32 gMapObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/baltoy_doll.4bpp"); -const u32 gMapObjectPic_KecleonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/kecleon_doll.4bpp"); -const u32 gMapObjectPic_AzurillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/azurill_doll.4bpp"); -const u32 gMapObjectPic_SkittyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/skitty_doll.4bpp"); -const u32 gMapObjectPic_SwabluDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/swablu_doll.4bpp"); -const u32 gMapObjectPic_GulpinDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/gulpin_doll.4bpp"); -const u32 gMapObjectPic_LotadDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/lotad_doll.4bpp"); -const u32 gMapObjectPic_SeedotDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/seedot_doll.4bpp"); -const u32 gMapObjectPic_PikaCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/pika_cushion.4bpp"); -const u32 gMapObjectPic_RoundCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/round_cushion.4bpp"); -const u32 gMapObjectPic_KissCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/kiss_cushion.4bpp"); -const u32 gMapObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/zigzag_cushion.4bpp"); -const u32 gMapObjectPic_SpinCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/spin_cushion.4bpp"); -const u32 gMapObjectPic_DiamondCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/diamond_cushion.4bpp"); -const u32 gMapObjectPic_BallCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/ball_cushion.4bpp"); -const u32 gMapObjectPic_GrassCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/grass_cushion.4bpp"); -const u32 gMapObjectPic_FireCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/fire_cushion.4bpp"); -const u32 gMapObjectPic_WaterCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/water_cushion.4bpp"); -const u32 gMapObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_snorlax_doll.4bpp"); -const u32 gMapObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_rhydon_doll.4bpp"); -const u32 gMapObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_lapras_doll.4bpp"); -const u32 gMapObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_venusaur_doll.4bpp"); -const u32 gMapObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_charizard_doll.4bpp"); -const u32 gMapObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_blastoise_doll.4bpp"); -const u32 gMapObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_wailmer_doll.4bpp"); -const u32 gMapObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regirock_doll.4bpp"); -const u32 gMapObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regice_doll.4bpp"); -const u32 gMapObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_registeel_doll.4bpp"); -const u32 gMapObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/0.4bpp"); -const u32 gMapObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/1.4bpp"); -const u32 gMapObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/2.4bpp"); -const u32 gMapObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/3.4bpp"); -const u32 gMapObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/0.4bpp"); -const u32 gMapObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/1.4bpp"); -const u32 gMapObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/2.4bpp"); -const u32 gMapObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/3.4bpp"); -const u32 gMapObjectPic_PushableBoulder[] = INCBIN_U32("graphics/map_objects/pics/misc/pushable_boulder.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/0.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/1.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/2.4bpp"); -const u32 gMapObjectPic_Fossil[] = INCBIN_U32("graphics/map_objects/pics/misc/fossil.4bpp"); -const u32 gMapObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/map_objects/pics/misc/submarine_shadow.4bpp"); -const u16 gMapObjectPalette26[] = INCBIN_U16("graphics/map_objects/palettes/26.gbapal"); -const u32 gMapObjectPic_Truck[] = INCBIN_U32("graphics/map_objects/pics/misc/truck.4bpp"); -const u16 gMapObjectPalette14[] = INCBIN_U16("graphics/map_objects/palettes/14.gbapal"); -const u32 gMapObjectPic_MachokeCarryingBox_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/0.4bpp"); -const u32 gMapObjectPic_MachokeCarryingBox_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/1.4bpp"); -const u32 gMapObjectPic_MachokeCarryingBox_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/2.4bpp"); -const u32 gMapObjectPic_MachokeFacingAway_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/0.4bpp"); -const u32 gMapObjectPic_MachokeFacingAway_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/1.4bpp"); -const u16 gMapObjectPalette15[] = INCBIN_U16("graphics/map_objects/palettes/15.gbapal"); -const u32 gMapObjectPic_BirchsBag[] = INCBIN_U32("graphics/map_objects/pics/misc/birchs_bag.4bpp"); -const u32 gMapObjectPic_Poochyena_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/0.4bpp"); -const u32 gMapObjectPic_Poochyena_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/1.4bpp"); -const u32 gMapObjectPic_Poochyena_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/2.4bpp"); -const u32 gMapObjectPic_Poochyena_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/3.4bpp"); -const u32 gMapObjectPic_Poochyena_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/4.4bpp"); -const u32 gMapObjectPic_Poochyena_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/5.4bpp"); -const u32 gMapObjectPic_Poochyena_6[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/6.4bpp"); -const u32 gMapObjectPic_Poochyena_7[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/7.4bpp"); -const u32 gMapObjectPic_Poochyena_8[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/8.4bpp"); -const u16 gMapObjectPalette16[] = INCBIN_U16("graphics/map_objects/palettes/16.gbapal"); -const u32 gMapObjectPic_CableCar[] = INCBIN_U32("graphics/map_objects/pics/misc/cable_car.4bpp"); -const u16 gMapObjectPalette20[] = INCBIN_U16("graphics/map_objects/palettes/20.gbapal"); -const u32 gMapObjectPic_SSTidal[] = INCBIN_U32("graphics/map_objects/pics/misc/ss_tidal.4bpp"); -const u16 gMapObjectPalette21[] = INCBIN_U16("graphics/map_objects/palettes/21.gbapal"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/0.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/1.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/2.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/3.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/4.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/5.4bpp"); -const u32 gMapObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/dirt_pile.4bpp"); -const u32 gMapObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/0.4bpp"); -const u32 gMapObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/1.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/0.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/1.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/2.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/3.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/4.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/5.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/0.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/1.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/2.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/3.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/4.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/5.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/0.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/1.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/2.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/3.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/4.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/5.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/0.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/1.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/2.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/3.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/4.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/5.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/0.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/1.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/2.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/3.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/4.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/5.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/0.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/1.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/2.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/3.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/4.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/5.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/0.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/1.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/2.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/3.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/4.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/5.4bpp"); -const u32 gMapObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/0.4bpp"); -const u32 gMapObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/1.4bpp"); -const u32 gMapObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/2.4bpp"); -const u32 gMapObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/3.4bpp"); -const u32 gMapObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/4.4bpp"); -const u32 gMapObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/5.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/0.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/1.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/2.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/3.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/4.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/5.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/0.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/1.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/2.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/3.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/4.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/5.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/0.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/1.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/2.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/3.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/4.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/5.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/0.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/1.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/2.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/3.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/4.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/5.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/0.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/1.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/2.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/3.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/4.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/5.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/0.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/1.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/2.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/3.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/4.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/5.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/0.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/1.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/2.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/3.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/4.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/5.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/0.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/1.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/2.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/3.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/4.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/5.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/0.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/1.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/2.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/3.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/4.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/5.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/0.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/1.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/2.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/3.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/4.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/5.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/0.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/1.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/2.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/3.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/4.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/5.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/0.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/1.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/2.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/3.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/4.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/5.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/0.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/1.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/2.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/3.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/4.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/5.4bpp"); -const u32 gMapObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/0.4bpp"); -const u32 gMapObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/1.4bpp"); -const u32 gMapObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/2.4bpp"); -const u32 gMapObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/3.4bpp"); -const u32 gMapObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/4.4bpp"); -const u32 gMapObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/5.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/0.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/1.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/2.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/3.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/4.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/5.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/0.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/1.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/2.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/3.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/4.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/5.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/0.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/1.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/2.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/3.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/4.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/5.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/0.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/1.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/2.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/3.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/4.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/5.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/0.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/1.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/2.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/3.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/4.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/5.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/0.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/1.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/2.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/3.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/4.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/5.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/0.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/1.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/2.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/3.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/4.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/5.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/0.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/1.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/2.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/3.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/4.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/5.4bpp"); -const u32 gFieldEffectPic_SurfBlob_0[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/0.4bpp"); -const u32 gFieldEffectPic_SurfBlob_1[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/1.4bpp"); -const u32 gFieldEffectPic_SurfBlob_2[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/2.4bpp"); -const u32 gMapObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/0.4bpp"); -const u32 gMapObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/1.4bpp"); -const u32 gMapObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/2.4bpp"); -const u32 gMapObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/3.4bpp"); -const u32 gMapObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/4.4bpp"); -const u32 gMapObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/5.4bpp"); -const u32 gMapObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/6.4bpp"); -const u16 gMapObjectPalette12[] = INCBIN_U16("graphics/map_objects/palettes/12.gbapal"); -const u16 gMapObjectPalette13[] = INCBIN_U16("graphics/map_objects/palettes/13.gbapal"); - -const u32 gFieldEffectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_small.4bpp"); -const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_medium.4bpp"); -const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp"); -const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp"); -const u32 filler_8368A08[0x48] = {}; -const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effect_objects/pics/cut_grass.4bpp"); -const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); -const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal"); -const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp"); -const u32 gFieldEffectPic_Ripple_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/1.4bpp"); -const u32 gFieldEffectPic_Ripple_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/2.4bpp"); -const u32 gFieldEffectPic_Ripple_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/3.4bpp"); -const u32 gFieldEffectPic_Ripple_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/4.4bpp"); -const u32 gFieldEffectPic_Ash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/0.4bpp"); -const u32 gFieldEffectPic_Ash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/1.4bpp"); -const u32 gFieldEffectPic_Ash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/2.4bpp"); -const u32 gFieldEffectPic_Ash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/3.4bpp"); -const u32 gFieldEffectPic_Ash_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/4.4bpp"); -const u32 gFieldEffectPic_Arrow_0[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/0.4bpp"); -const u32 gFieldEffectPic_Arrow_1[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/1.4bpp"); -const u32 gFieldEffectPic_Arrow_2[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/2.4bpp"); -const u32 gFieldEffectPic_Arrow_3[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/3.4bpp"); -const u32 gFieldEffectPic_Arrow_4[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/4.4bpp"); -const u32 gFieldEffectPic_Arrow_5[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/5.4bpp"); -const u32 gFieldEffectPic_Arrow_6[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/6.4bpp"); -const u32 gFieldEffectPic_Arrow_7[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/7.4bpp"); -const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effect_objects/palettes/00.gbapal"); -const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effect_objects/palettes/01.gbapal"); -const u32 gFieldEffectPic_Dust_0[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/0.4bpp"); -const u32 gFieldEffectPic_Dust_1[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/1.4bpp"); -const u32 gFieldEffectPic_Dust_2[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/2.4bpp"); -const u32 unknown_8369588[] = INCBIN_U32("graphics/field_effect_objects/unknown.bin"); -const u32 gFieldEffectPic_JumpTallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/0.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/1.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/2.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/3.4bpp"); -const u32 UnusedGrass0[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/0.4bpp"); -const u32 UnusedGrass1[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/1.4bpp"); -const u32 UnusedGrass2[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/2.4bpp"); -const u32 UnusedGrass3[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/3.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/0.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/1.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/2.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/3.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/4.4bpp"); -const u32 UnusedGrassLong[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/unused.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_5[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/5.4bpp"); -const u32 gFieldEffectPic_Unknown17_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/0.4bpp"); -const u32 gFieldEffectPic_Unknown17_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/1.4bpp"); -const u32 gFieldEffectPic_Unknown17_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/2.4bpp"); -const u32 gFieldEffectPic_Unknown17_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/3.4bpp"); -const u32 gFieldEffectPic_Unknown17_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/4.4bpp"); -const u32 gFieldEffectPic_Unknown17_5[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/5.4bpp"); -const u32 gFieldEffectPic_Unknown17_6[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/6.4bpp"); -const u32 gFieldEffectPic_Unknown17_7[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/7.4bpp"); -const u32 gFieldEffectPic_Unknown18_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/0.4bpp"); -const u32 gFieldEffectPic_Unknown18_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/1.4bpp"); -const u32 gFieldEffectPic_Unknown18_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/2.4bpp"); -const u32 gFieldEffectPic_Unknown18_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/3.4bpp"); -const u32 gFieldEffectPic_LongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/0.4bpp"); -const u32 gFieldEffectPic_LongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/1.4bpp"); -const u32 gFieldEffectPic_LongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/2.4bpp"); -const u32 gFieldEffectPic_LongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/3.4bpp"); -const u32 gFieldEffectPic_TallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/0.4bpp"); -const u32 gFieldEffectPic_TallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/1.4bpp"); -const u32 gFieldEffectPic_TallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/2.4bpp"); -const u32 gFieldEffectPic_TallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/3.4bpp"); -const u32 gFieldEffectPic_TallGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/4.4bpp"); -const u32 gFieldEffectPic_ShortGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/0.4bpp"); -const u32 gFieldEffectPic_ShortGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/1.4bpp"); -const u32 gFieldEffectPic_SandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/0.4bpp"); -const u32 gFieldEffectPic_SandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/1.4bpp"); -const u32 gFieldEffectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/0.4bpp"); -const u32 gFieldEffectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/1.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/0.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/1.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/2.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/3.4bpp"); -const u32 gFieldEffectPic_Unknown19_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/0.4bpp"); -const u32 gFieldEffectPic_Unknown19_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/1.4bpp"); -const u32 gFieldEffectPic_Unknown19_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/2.4bpp"); -const u32 gFieldEffectPic_Unknown19_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/3.4bpp"); -const u32 gFieldEffectPic_SandPile_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/0.4bpp"); -const u32 gFieldEffectPic_SandPile_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/1.4bpp"); -const u32 gFieldEffectPic_SandPile_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/2.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/0.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/1.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/2.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/3.4bpp"); -const u32 gFieldEffectPic_Splash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/0.4bpp"); -const u32 gFieldEffectPic_Splash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/1.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/0.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/1.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/2.4bpp"); -const u32 gFieldEffectPic_Unknown20_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/0.4bpp"); -const u32 gFieldEffectPic_Unknown20_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/1.4bpp"); -const u32 gFieldEffectPic_Unknown20_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/2.4bpp"); -const u32 gFieldEffectPic_Unknown20_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/3.4bpp"); -const u32 gFieldEffectPic_Unknown20_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/4.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/0.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/1.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/2.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/3.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/4.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/5.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/6.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/0.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/1.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/2.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/3.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/4.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/5.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/6.4bpp"); -const u32 gFieldEffectPic_SandDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/0.4bpp"); -const u32 gFieldEffectPic_SandDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/1.4bpp"); -const u32 gFieldEffectPic_SandDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/2.4bpp"); -const u32 gFieldEffectPic_SandDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/3.4bpp"); -const u32 gFieldEffectPic_SandDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/4.4bpp"); -const u32 gFieldEffectPic_SandDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/5.4bpp"); -const u32 gFieldEffectPic_SandDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/6.4bpp"); -const u32 gFieldEffectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effect_objects/pics/hot_springs_water.4bpp"); -const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effect_objects/palettes/02.gbapal"); -const u32 gFieldEffectPic_PopOutOfAsh_0[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/0.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_1[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/1.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_2[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/2.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_3[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/3.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_4[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/4.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_0[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/0.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_1[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/1.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_2[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/2.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_3[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/3.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_4[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/4.4bpp"); -const u32 gFieldEffectPic_Bubbles_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/0.4bpp"); -const u32 gFieldEffectPic_Bubbles_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/1.4bpp"); -const u32 gFieldEffectPic_Bubbles_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/2.4bpp"); -const u32 gFieldEffectPic_Bubbles_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/3.4bpp"); -const u32 gFieldEffectPic_Bubbles_4[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/4.4bpp"); -const u32 gFieldEffectPic_Bubbles_5[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/5.4bpp"); -const u32 gFieldEffectPic_Bubbles_6[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/6.4bpp"); -const u32 gFieldEffectPic_Bubbles_7[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/7.4bpp"); -const u32 gFieldEffectPic_Sparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/0.4bpp"); -const u32 gFieldEffectPic_Sparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/1.4bpp"); -const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/field_effect_objects/palettes/03.gbapal"); -const u32 gFieldEffectPic_Bird[] = INCBIN_U32("graphics/field_effect_objects/pics/bird.4bpp"); - -void (*const gUnknown_0836DA88[])(struct Sprite *) = -{ - sub_805C884, - sub_805CDE8, - sub_805C8AC, - sub_805CF28, - sub_805CF28, - sub_805D0AC, - sub_805D0AC, - sub_805D230, - sub_805D230, - sub_805D230, - sub_805D230, - sub_80587B4, - FieldObjectCB_BerryTree, - sub_805D4F4, - sub_805D634, - sub_805D774, - sub_805D8B4, - sub_805D9F4, - sub_805DB34, - sub_805DC74, - sub_805DDB4, - sub_805DEF4, - sub_805E034, - sub_805E174, - sub_805E278, - sub_805E37C, - sub_805E37C, - sub_805E37C, - sub_805E37C, - sub_805E5DC, - sub_805E668, - sub_805E6F4, - sub_805E780, - sub_805E80C, - sub_805E898, - sub_805E924, - sub_805E9B0, - sub_805EA3C, - sub_805EAC8, - sub_805EB54, - sub_805EBE0, - sub_805EC6C, - sub_805ECF8, - sub_805ED84, - sub_805EE10, - sub_805EE9C, - sub_805EF28, - sub_805EFB4, - sub_805F040, - sub_805F0CC, - sub_805F158, - sub_805F1E4, - sub_805F270, - sub_805F2FC, - sub_805F2FC, - sub_805F2FC, - sub_805F2FC, - FieldObjectCB_TreeDisguise, - FieldObjectCB_MountainDisguise, - sub_805F8E0, - sub_805F8E0, - sub_805F8E0, - sub_805F8E0, - FieldObjectCB_Hidden1, - sub_805FB20, - sub_805FB20, - sub_805FB20, - sub_805FB20, - sub_805FB90, - sub_805FB90, - sub_805FB90, - sub_805FB90, - sub_805FC00, - sub_805FC00, - sub_805FC00, - sub_805FC00, - sub_805FC70 -}; - -const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; - -#include "../data/field_map_obj/map_object_graphics_info_pointers.h" -#include "../data/field_map_obj/field_effect_object_template_pointers.h" -#include "../data/field_map_obj/map_object_pic_tables.h" -#include "../data/field_map_obj/map_object_anims.h" -#include "../data/field_map_obj/base_oam.h" -#include "../data/field_map_obj/map_object_subsprites.h" -#include "../data/field_map_obj/map_object_graphics_info.h" - -const struct SpritePalette gUnknown_0837377C[] = { - {gMapObjectPalette0, 0x1103}, - {gMapObjectPalette1, 0x1104}, - {gMapObjectPalette2, 0x1105}, - {gMapObjectPalette3, 0x1106}, - {gMapObjectPalette4, 0x1107}, - {gMapObjectPalette5, 0x1108}, - {gMapObjectPalette6, 0x1109}, - {gMapObjectPalette7, 0x110A}, - {gMapObjectPalette8, 0x1100}, - {gMapObjectPalette9, 0x1101}, - {gMapObjectPalette10, 0x1102}, - {gMapObjectPalette11, 0x1115}, - {gMapObjectPalette12, 0x110B}, - {gMapObjectPalette13, 0x110C}, - {gMapObjectPalette14, 0x110D}, - {gMapObjectPalette15, 0x110E}, - {gMapObjectPalette16, 0x110F}, - {gMapObjectPalette17, 0x1110}, - {gMapObjectPalette18, 0x1111}, - {gMapObjectPalette19, 0x1112}, - {gMapObjectPalette20, 0x1113}, - {gMapObjectPalette21, 0x1114}, - {gMapObjectPalette22, 0x1116}, - {gMapObjectPalette23, 0x1117}, - {gMapObjectPalette24, 0x1118}, - {gMapObjectPalette25, 0x1119}, - {gMapObjectPalette26, 0x111A}, - {NULL, 0x0000} -}; - -const u16 Palettes_837385C[] = { - 0x1101, - 0x1101, - 0x1101, - 0x1101 -}; - -const u16 Palettes_8373864[] = { - 0x1111, - 0x1111, - 0x1111, - 0x1111 -}; - -const u16 Palettes_837386C[] = { - 0x1115, - 0x1115, - 0x1115, - 0x1115 -}; - -const struct PairedPalettes gUnknown_08373874[] = { - {0x1100, Palettes_837385C}, - {0x1110, Palettes_837385C}, - {0x1115, Palettes_837386C}, - {0x11FF, NULL} -}; - -const u16 Palettes_8373894[] = { - 0x110C, - 0x110C, - 0x110C, - 0x110C -}; - -const u16 Palettes_837389C[] = { - 0x110D, - 0x110D, - 0x110D, - 0x110D -}; - -const u16 Palettes_83738A4[] = { - 0x110E, - 0x110E, - 0x110E, - 0x110E -}; - -const u16 Palettes_83738AC[] = { - 0x1112, - 0x1112, - 0x1112, - 0x1112 -}; - -const u16 Palettes_83738B4[] = { - 0x1113, - 0x1113, - 0x1113, - 0x1113 -}; - -const u16 Palettes_83738BC[] = { - 0x1114, - 0x1114, - 0x1114, - 0x1114 -}; - -const u16 Palettes_83738C4[] = { - 0x111A, - 0x111A, - 0x111A, - 0x111A -}; - -const u16 Palettes_83738CC[] = { - 0x1117, - 0x1117, - 0x1117, - 0x1117 -}; - -const u16 Palettes_83738D4[] = { - 0x1119, - 0x1119, - 0x1119, - 0x1119 -}; - -const u16 Palettes_83738DC[] = { - 0x1109, - 0x1109, - 0x1109, - 0x1109 -}; - -const struct PairedPalettes gUnknown_083738E4[] = { - {0x1100, Palettes_837385C}, - {0x1110, Palettes_837385C}, - {0x110B, Palettes_8373894}, - {0x110D, Palettes_837389C}, - {0x110E, Palettes_83738A4}, - {0x1112, Palettes_83738AC}, - {0x1113, Palettes_83738B4}, - {0x1114, Palettes_83738BC}, - {0x1116, Palettes_83738CC}, - {0x1118, Palettes_83738D4}, - {0x1105, Palettes_83738DC}, - {0x111A, Palettes_83738C4}, - {0x11FF, NULL} -}; - -const u16 Unknown_837394C[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373960[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373974[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373988[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 *const gUnknown_0837399C[] = { - Unknown_837394C, - Unknown_8373960, - Unknown_8373974, - Unknown_8373988 -}; - -#include "../data/field_map_obj/berry_tree_graphics_tables.h" -#include "../data/field_map_obj/field_effect_objects.h" - -const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; -const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; -const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; - -#include "../data/field_map_obj/callback_subroutine_pointers.h" - -const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; -const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; -const u8 gUnknown_08375606[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; -const u8 gUnknown_0837560F[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D}; -const u8 gUnknown_08375618[] = {0x10, 0x10, 0x11, 0x12, 0x13, 0x10, 0x10, 0x11, 0x11}; -const u8 gUnknown_08375621[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_0837562A[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_08375633[] = {0x18, 0x18, 0x19, 0x1A, 0x1B, 0x18, 0x18, 0x19, 0x19}; -const u8 gUnknown_0837563C[] = {0x1C, 0x1C, 0x1D, 0x1E, 0x1F, 0x1C, 0x1C, 0x1D, 0x1D}; -const u8 gUnknown_08375645[] = {0x20, 0x20, 0x21, 0x22, 0x23, 0x20, 0x20, 0x21, 0x21}; -const u8 gUnknown_0837564E[] = {0x24, 0x24, 0x25, 0x26, 0x27, 0x24, 0x24, 0x25, 0x25}; -const u8 gUnknown_08375657[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; -const u8 gUnknown_08375660[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; -const u8 gUnknown_08375669[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; -const u8 gUnknown_08375672[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_0837567B[] = {0x08, 0x08, 0x07, 0x09, 0x0A, 0x08, 0x08, 0x07, 0x07}; - -bool8 (*const gUnknown_08375684[])(u8) = { - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsWestBlocked, - MetatileBehavior_IsEastBlocked -}; - -bool8 (*const gUnknown_08375694[])(u8) = { - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsEastBlocked, - MetatileBehavior_IsWestBlocked -}; - -const struct Coords16 gDirectionToVector[] = { - { 0, 0}, - { 0, 1}, - { 0, -1}, - {-1, 0}, - { 1, 0}, - {-1, 1}, - { 1, 1}, - {-1, -1}, - { 1, -1} -}; - -const u8 gUnknown_083756C8[] = {0x00, 0x00, 0x01, 0x02, 0x03}; -const u8 gUnknown_083756CD[] = {0x04, 0x04, 0x05, 0x06, 0x07}; -const u8 gUnknown_083756D2[] = {0x08, 0x08, 0x09, 0x0A, 0x0B}; -const u8 gUnknown_083756D7[] = {0x15, 0x15, 0x16, 0x17, 0x18}; -const u8 gUnknown_083756DC[] = {0x29, 0x29, 0x2A, 0x2B, 0x2C}; -const u8 gUnknown_083756E1[] = {0x2D, 0x2D, 0x2E, 0x2F, 0x30}; -const u8 gUnknown_083756E6[] = {0x31, 0x31, 0x32, 0x33, 0x34}; -const u8 gUnknown_083756EB[] = {0x35, 0x35, 0x36, 0x37, 0x38}; -const u8 gUnknown_083756F0[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F}; -const u8 gUnknown_083756F5[] = {0x46, 0x46, 0x47, 0x48, 0x49}; -const u8 gUnknown_083756FA[] = {0x4B, 0x4B, 0x4A, 0x4D, 0x4C}; -const u8 gUnknown_083756FF[] = {0x42, 0x42, 0x43, 0x44, 0x45}; -const u8 gUnknown_08375704[] = {0x3A, 0x3A, 0x3B, 0x3C, 0x3D}; -const u8 gUnknown_08375709[] = {0x19, 0x19, 0x1A, 0x1B, 0x1C}; -const u8 gUnknown_0837570E[] = {0x1D, 0x1D, 0x1E, 0x1F, 0x20}; -const u8 gUnknown_08375713[] = {0x21, 0x21, 0x22, 0x23, 0x24}; -const u8 gUnknown_08375718[] = {0x25, 0x25, 0x26, 0x27, 0x28}; -const u8 gUnknown_0837571D[] = {0x62, 0x62, 0x63, 0x64, 0x65}; -const u8 gUnknown_08375722[] = {0x66, 0x66, 0x67, 0x68, 0x69}; -const u8 gUnknown_08375727[] = {0x6A, 0x6A, 0x6B, 0x6C, 0x6D}; -const u8 gUnknown_0837572C[] = {0x6E, 0x6E, 0x6F, 0x70, 0x71}; -const u8 gUnknown_08375731[] = {0x72, 0x72, 0x73, 0x74, 0x75}; -const u8 gUnknown_08375736[] = {0x76, 0x76, 0x77, 0x78, 0x79}; -const u8 gUnknown_0837573B[] = {0x7A, 0x7A, 0x7B, 0x7C, 0x7D}; -const u8 gUnknown_08375740[] = {0x7E, 0x7E, 0x7F, 0x80, 0x81}; -const u8 gUnknown_08375745[] = {0x82, 0x82, 0x83, 0x84, 0x85}; -const u8 gUnknown_0837574A[] = {0x86, 0x86, 0x87, 0x88, 0x89}; - -const u8 gUnknown_0837574F[] = {2, 1, 4, 3, 8, 7, 6, 5}; - -const u8 gUnknown_08375757[][4] = { - {2, 1, 4, 3}, - {1, 2, 3, 4}, - {3, 4, 2, 1}, - {4, 3, 1, 2} -}; - -const u8 gUnknown_08375767[][4] = { - {2, 1, 4, 3}, - {1, 2, 3, 4}, - {4, 3, 1, 2}, - {3, 4, 2, 1} -}; - -#include "../data/field_map_obj/anim_func_ptrs.h" - -// text - -extern void strange_npc_table_clear(void); -extern void ClearPlayerAvatarInfo(void); -extern void npc_load_two_palettes__no_record(u16, u8); -extern void npc_load_two_palettes__and_record(u16, u8); -extern void sub_8060388(s16, s16, s16 *, s16 *); -void sub_80634D0(struct MapObject *, struct Sprite *); -extern void pal_patch_for_npc(u16, u16); -extern void CameraObjectReset1(void); - -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; -extern u8 gReservedSpritePaletteCount; -extern struct Camera gCamera; - -static u8 gUnknown_030005A4; -static u16 gUnknown_030005A6; - -struct MapObject gMapObjects[16]; - -void npc_clear_ids_and_state(struct MapObject *mapObj) -{ - memset(mapObj, 0, sizeof(struct MapObject)); - mapObj->localId = 0xFF; - mapObj->mapNum = 0xFF; - mapObj->mapGroup = 0xFF; - mapObj->mapobj_unk_1C = 0xFF; -} - -void npcs_clear_ids_and_state(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - npc_clear_ids_and_state(&gMapObjects[i]); -} - -void sub_805AA98(void) -{ - strange_npc_table_clear(); - npcs_clear_ids_and_state(); - ClearPlayerAvatarInfo(); - sub_805AAB0(); -} - -void sub_805AAB0(void) -{ - u8 spriteId; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); - - gSprites[spriteId].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 0); - gSprites[spriteId].invisible = 1; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); - - gSprites[spriteId].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 1); - gSprites[spriteId].invisible = 1; -} - -u8 sub_805AB54(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (!gMapObjects[i].active) - break; - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - if (localId <= 0xFE) - return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); - else - return GetFieldObjectIdByLocalId(localId); -} - -bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId) -{ - *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); - if (*mapObjectId == 16) - return TRUE; - else - return FALSE; -} - -u8 GetFieldObjectIdByXY(s16 x, s16 y) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) - break; - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) - return i; - } - return 16; -} - -u8 GetFieldObjectIdByLocalId(u8 localId) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId) - return i; - } - return 16; -} - -#ifdef NONMATCHING -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness - u8 var; - u16 r3; - u16 r2; - - //asm("nop"::"r"(b)); - if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) - return 16; - //_0805ACCE - mapObj = &gMapObjects[var]; - npc_clear_ids_and_state(mapObj); - r3 = template->x + 7; - r2 = template->y + 7; - mapObj->active = TRUE; - mapObj->mapobj_bit_2 = TRUE; - mapObj->graphicsId = template->graphicsId; - mapObj->animPattern = template->movementType; - mapObj->localId = template->localId; - mapObj->mapNum = b; - mapObj->mapGroup = c; - mapObj->coords1.x = r3; - mapObj->coords1.y = r2; - mapObj->coords2.x = r3; - mapObj->coords2.y = r2; - mapObj->coords3.x = r3; - mapObj->coords3.y = r2; - mapObj->mapobj_unk_0B_0 = template->elevation; - mapObj->elevation = template->elevation; - mapObj->range.as_nybbles.x = template->unkA_0; - mapObj->range.as_nybbles.y = template->unkA_4; - mapObj->trainerType = template->unkC; - mapObj->trainerRange_berryTreeId = template->unkE; - mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; - FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); - FieldObjectHandleDynamicGraphicsId(mapObj); - //asm("":::"r5","r6"); - if (gUnknown_0836DBBC[mapObj->animPattern] != 0) - { - if (mapObj->range.as_nybbles.x == 0) - mapObj->range.as_nybbles.x++; - if (mapObj->range.as_nybbles.y == 0) - mapObj->range.as_nybbles.y++; - } - return var; -} -#else -__attribute__((naked)) -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r6, r1, 24\n\ - lsls r2, 24\n\ - lsrs r7, r2, 24\n\ - ldrb r0, [r5]\n\ - adds r1, r6, 0\n\ - adds r2, r7, 0\n\ - mov r3, sp\n\ - bl GetAvailableFieldObjectSlot\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0805ACCE\n\ - movs r0, 0x10\n\ - b _0805ADC2\n\ -_0805ACCE:\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 3\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0805ADD0 @ =gMapObjects\n\ - adds r4, r0, r1\n\ - adds r0, r4, 0\n\ - bl npc_clear_ids_and_state\n\ - ldrh r3, [r5, 0x4]\n\ - adds r3, 0x7\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - ldrh r2, [r5, 0x6]\n\ - adds r2, 0x7\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - ldrb r0, [r4]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r4]\n\ - ldrb r0, [r5, 0x1]\n\ - strb r0, [r4, 0x5]\n\ - ldrb r0, [r5, 0x9]\n\ - strb r0, [r4, 0x6]\n\ - ldrb r0, [r5]\n\ - strb r0, [r4, 0x8]\n\ - strb r6, [r4, 0x9]\n\ - strb r7, [r4, 0xA]\n\ - strh r3, [r4, 0xC]\n\ - strh r2, [r4, 0xE]\n\ - strh r3, [r4, 0x10]\n\ - strh r2, [r4, 0x12]\n\ - strh r3, [r4, 0x14]\n\ - strh r2, [r4, 0x16]\n\ - ldrb r0, [r5, 0x8]\n\ - movs r7, 0xF\n\ - adds r1, r7, 0\n\ - ands r1, r0\n\ - ldrb r2, [r4, 0xB]\n\ - movs r0, 0x10\n\ - negs r0, r0\n\ - mov r8, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0x8]\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0xA]\n\ - lsls r1, 28\n\ - movs r0, 0xF\n\ - mov r9, r0\n\ - lsrs r1, 28\n\ - ldrb r2, [r4, 0x19]\n\ - mov r0, r8\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrb r1, [r5, 0xA]\n\ - lsrs r1, 4\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrh r0, [r5, 0xC]\n\ - strb r0, [r4, 0x7]\n\ - ldrh r0, [r5, 0xE]\n\ - strb r0, [r4, 0x1D]\n\ - ldr r1, _0805ADD4 @ =gUnknown_0836DC09\n\ - ldrb r0, [r5, 0x9]\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - strb r1, [r0]\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - bl FieldObjectSetDirection\n\ - adds r0, r4, 0\n\ - bl FieldObjectHandleDynamicGraphicsId\n\ - ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\ - ldrb r0, [r4, 0x6]\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _0805ADBE\n\ - ldrb r2, [r4, 0x19]\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADA6\n\ - lsls r0, r2, 28\n\ - lsrs r0, 28\n\ - adds r0, 0x1\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r8\n\ - ands r1, r2\n\ - orrs r1, r0\n\ - strb r1, [r4, 0x19]\n\ -_0805ADA6:\n\ - ldrb r2, [r4, 0x19]\n\ - movs r0, 0xF0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADBE\n\ - lsrs r1, r2, 4\n\ - adds r1, 0x1\n\ - lsls r1, 4\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ -_0805ADBE:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ -_0805ADC2:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0805ADD0: .4byte gMapObjects\n\ -_0805ADD4: .4byte gUnknown_0836DC09\n\ -_0805ADD8: .4byte gUnknown_0836DBBC\n\ - .syntax divided\n"); -} -#endif - -u8 sub_805ADDC(u8 localId) -{ - u8 objectCount; - u8 i; - - if (gMapHeader.events == NULL) - return 16; - objectCount = gMapHeader.events->mapObjectCount; - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; - - if (template->localId == localId && !FlagGet(template->flagId)) - return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - } - return 16; -} - -u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) -{ - u8 i = 0; - - for (i = 0; i < 16 && gMapObjects[i].active; i++) - { - if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) - return 1; - } - if (i >= 16) - return 1; - *d = i; - for (; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) - return 1; - } - return 0; -} - -void RemoveFieldObject(struct MapObject *mapObject) -{ - mapObject->active = FALSE; - RemoveFieldObjectInternal(mapObject); -} - -void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return; - FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId)); - RemoveFieldObject(&gMapObjects[mapObjectId]); -} - -void RemoveFieldObjectInternal(struct MapObject *mapObject) -{ - struct SpriteFrameImage image; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - - image.size = gfxInfo->size; - gSprites[mapObject->spriteId].images = ℑ - DestroySprite(&gSprites[mapObject->spriteId]); -} - -void npc_hide_all_but_player(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (i != gPlayerAvatar.mapObjectId) - RemoveFieldObject(&gMapObjects[i]); - } -} - -u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) -{ - u8 mapObjectId; - u8 spriteId; - const struct MapObjectGraphicsInfo *gfxInfo; - struct MapObject *mapObject; - struct Sprite *sprite; - - mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d); - if (mapObjectId == 16) - return 16; - - mapObject = &gMapObjects[mapObjectId]; - gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (gfxInfo->paletteSlot == 0) - npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - else if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (mapObject->animPattern == 0x4C) - mapObject->mapobj_bit_13 = TRUE; - -#ifdef NONMATCHING - sprTemplate->paletteTag = 0xFFFF; -#else - *(u16 *)&sprTemplate->paletteTag = 0xFFFF; -#endif - spriteId = CreateSprite(sprTemplate, 0, 0, 0); - if (spriteId == 64) - { - gMapObjects[mapObjectId].active = FALSE; - return 16; - } - sprite = &gSprites[spriteId]; - sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = mapObjectId; - mapObject->spriteId = spriteId; - mapObject->mapobj_bit_12 = gfxInfo->inanimate; - if (!mapObject->mapobj_bit_12) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - sub_80634D0(mapObject, sprite); - return mapObjectId; -} - -u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) -{ - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables = NULL; - struct SpriteFrameImage spriteFrameImage; - const struct MapObjectGraphicsInfo *gfxInfo; - u8 mapObjectId; - - gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId); - MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = gfxInfo->size; - spriteTemplate.images = &spriteFrameImage; - mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e); - if (mapObjectId == 16) - return 16; - gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images; - if (subspriteTables != NULL) - SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); - return mapObjectId; -} - -u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate) -{ - s16 x; - s16 y; - - GetFieldObjectMovingCameraOffset(&x, &y); - return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); -} - -u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f) -{ - struct MapObjectTemplate mapObjTemplate; - - d -= 7; - e -= 7; - mapObjTemplate.localId = c; - mapObjTemplate.graphicsId = a; - mapObjTemplate.unk2 = 0; - mapObjTemplate.x = d; - mapObjTemplate.y = e; - mapObjTemplate.elevation = f; - mapObjTemplate.movementType = b; - mapObjTemplate.unkA_0 = 0; - mapObjTemplate.unkA_4 = 0; - mapObjTemplate.unkC = 0; - mapObjTemplate.unkE = 0; - return SpawnSpecialFieldObject(&mapObjTemplate); -} - -u8 show_sprite(u8 a, u8 b, u8 c) -{ - struct MapObjectTemplate *r5; - s16 x; - s16 y; - - r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c); - if (r5 == NULL) - return 16; - GetFieldObjectMovingCameraOffset(&x, &y); - return SpawnFieldObject(r5, b, c, x, y); -} - -void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - - sprTemplate->tileTag = gfxInfo->tileTag; - sprTemplate->paletteTag = gfxInfo->paletteTag1; - sprTemplate->oam = gfxInfo->oam; - sprTemplate->anims = gfxInfo->anims; - sprTemplate->images = gfxInfo->images; - sprTemplate->affineAnims = gfxInfo->affineAnims; - sprTemplate->callback = callback; - *subspriteTables = gfxInfo->subspriteTables; -} - -void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables); -} - -void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); -} - -u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); - if (spriteTemplate.paletteTag != 0xFFFF) - sub_805BDF8(spriteTemplate.paletteTag); - spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); - if (spriteId != 64 && subspriteTables != NULL) - { - SetSubspriteTables(&gSprites[spriteId], subspriteTables); - gSprites[spriteId].subspriteMode = 2; - } - return spriteId; -} - -extern void sub_8064970(struct Sprite *); -extern void sub_8060470(s16 *, s16 *, s16, s16); -extern void InitObjectPriorityByZCoord(); - -u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) -{ - const struct MapObjectGraphicsInfo *gfxInfo; - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - - gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8064970, &spriteTemplate, &subspriteTables); -#ifdef NONMATCHING - spriteTemplate.paletteTag = 0xFFFF; -#else - *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; -#endif - x += 7; - y += 7; - sub_8060470(&x, &y, 8, 16); - spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); - if (spriteId != 64) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.y += sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = b; - sprite->data[1] = elevation; - if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (subspriteTables != NULL) - { - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = 2; - } - InitObjectPriorityByZCoord(sprite, elevation); - SetObjectSubpriorityByZCoord(elevation, sprite, 1); - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); - } - return spriteId; -} - -void sub_805B55C(s16 a, s16 b) -{ - u8 i; - - if (gMapHeader.events != NULL) - { - s16 r9 = gSaveBlock1.pos.x - 2; - s16 sp8 = gSaveBlock1.pos.x + 17; - s16 r10 = gSaveBlock1.pos.y; - s16 spC = gSaveBlock1.pos.y + 16; - u8 objectCount = gMapHeader.events->mapObjectCount; - - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; - s16 foo = template->x + 7; - s16 bar = template->y + 7; - - if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo - && !FlagGet(template->flagId)) - SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b); - } - } -} - -void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject); - -void RemoveFieldObjectsOutsideView(void) -{ - u8 i; - u8 j; - - for (i = 0; i < 16; i++) - { - bool8 isActiveLinkPlayer; - - for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) - { - if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) - isActiveLinkPlayer = TRUE; - } - if (!isActiveLinkPlayer) - { - struct MapObject *mapObject = &gMapObjects[i]; - - if (mapObject->active && !mapObject->mapobj_bit_16) - RemoveFieldObjectIfOutsideView(mapObject); - } - } -} - -void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) -{ - s16 r7 = gSaveBlock1.pos.x - 2; - s16 r5 = gSaveBlock1.pos.x + 17; - s16 r4 = gSaveBlock1.pos.y; - s16 r6 = gSaveBlock1.pos.y + 16; - - if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5 - && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6) - return; - if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5 - && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6) - return; - RemoveFieldObject(mapObject); -} - -void sub_805B75C(u8, s16, s16); - -void sub_805B710(u16 a, u16 b) -{ - u8 i; - - ClearPlayerAvatarInfo(); - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active) - sub_805B75C(i, a, b); - } - sub_805AAB0(); -} - -extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); -extern void sub_805B914(struct MapObject *); - -void sub_805B75C(u8 a, s16 b, s16 c) -{ - struct SpriteTemplate sp0; - struct SpriteFrameImage sp18; - const struct SubspriteTable *subspriteTables; - const struct MapObjectGraphicsInfo *gfxInfo; - struct MapObject *mapObject; - u8 spriteId; - - #define i spriteId - for (i = 0; i < 4; i++) - { - if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId) - return; - } - #undef i - - mapObject = &gMapObjects[a]; - asm("":::"r5"); - subspriteTables = NULL; - gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - sp18.size = gfxInfo->size; - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables); - sp0.images = &sp18; - *(u16 *)&sp0.paletteTag = 0xFFFF; - if (gfxInfo->paletteSlot == 0) - npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (gfxInfo->paletteSlot > 9) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - *(u16 *)&sp0.paletteTag = 0xFFFF; - spriteId = CreateSprite(&sp0, 0, 0, 0); - if (spriteId != 64) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->images = gfxInfo->images; - if (mapObject->animPattern == 11) - { - SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId); - mapObject->mapobj_unk_1B = sub_8126B54(); - } - if (subspriteTables != NULL) - SetSubspriteTables(sprite, subspriteTables); - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = a; - mapObject->spriteId = spriteId; - if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - sub_805B914(mapObject); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - } -} - -void sub_805B914(struct MapObject *mapObject) -{ - mapObject->mapobj_bit_1 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - mapObject->mapobj_bit_22 = FALSE; - mapObject->mapobj_bit_17 = FALSE; - mapObject->mapobj_bit_18 = FALSE; - mapObject->mapobj_bit_19 = FALSE; - mapObject->mapobj_bit_20 = FALSE; - mapObject->mapobj_bit_21 = FALSE; - FieldObjectClearAnim(mapObject); -} - -void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) -{ - gPlayerAvatar.mapObjectId = mapObjectId; - gPlayerAvatar.spriteId = spriteId; - gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); - SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); -} - -void sub_805B980(struct MapObject *mapObject, u8 graphicsId) -{ - const struct MapObjectGraphicsInfo *gfxInfo; - struct Sprite *sprite; - - gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - sprite = &gSprites[mapObject->spriteId]; - if (gfxInfo->paletteSlot == 0) - pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - sprite->oam.shape = gfxInfo->oam->shape; - sprite->oam.size = gfxInfo->oam->size; - sprite->images = gfxInfo->images; - sprite->anims = gfxInfo->anims; - sprite->subspriteTables = gfxInfo->subspriteTables; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - mapObject->mapobj_bit_12 = gfxInfo->inanimate; - mapObject->graphicsId = graphicsId; - sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - if (mapObject->mapobj_bit_15) - CameraObjectReset1(); -} - -void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - sub_805B980(&gMapObjects[mapObjectId], graphicsId); -} - -void FieldObjectTurn(struct MapObject *mapObject, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - if (!mapObject->mapobj_bit_12) - { - StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); - } -} - -void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - FieldObjectTurn(&gMapObjects[mapObjectId], direction); -} - -void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction) -{ - FieldObjectTurn(&gMapObjects[player->mapObjectId], direction); -} - -void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 treeStage; - u8 treeId; - - mapObject->mapobj_bit_13 = TRUE; - sprite->invisible = TRUE; - treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (treeStage != 0) - { - mapObject->mapobj_bit_13 = FALSE; - sprite->invisible = FALSE; - treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; - treeStage--; - if (treeId > 0x2B) - treeId = 0; - sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]); - sprite->images = gBerryTreePicTablePointers[treeId]; - sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage]; - StartSpriteAnim(sprite, treeStage); - } -} - -const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) -{ - if (graphicsId > 0xEF) - graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16); - if (graphicsId > 0xD9) - graphicsId = 5; - return gMapObjectGraphicsInfoPointers[graphicsId]; -} - -void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) -{ - if (mapObject->graphicsId > 0xEF) - mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16); -} - -void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - gMapObjects[mapObjectId].mapobj_bit_13 = d; -} - -void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) -{ - *(u8 *)localId = mapObject->localId; - *(u8 *)mapNum = mapObject->mapNum; - *(u8 *)mapGroup = mapObject->mapGroup; -} - -void sub_805BCC0(s16 x, s16 y) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - mapObjectId = GetFieldObjectIdByXY(x, y); - if (mapObjectId != 16) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) -{ - u8 mapObjectId; - struct MapObject *mapObject; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - mapObject->mapobj_bit_26 = TRUE; - sprite->subpriority = subpriority; - } -} - -void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_26 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; - sprite->pos2.x = x; - sprite->pos2.y = y; - } -} - -void gpu_pal_allocator_reset__manage_upper_four(void) -{ - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 12; -} - -void sub_805BDF8(u16 tag) -{ - u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag); - - if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8 - sub_805BE58(&gUnknown_0837377C[paletteIndex]); -} - -void unref_sub_805BE24(u16 *arr) -{ - u8 i; - - for (i = 0; arr[i] != 0x11FF; i++) - sub_805BDF8(arr[i]); -} - -u8 sub_805BE58(const struct SpritePalette *palette) -{ - if (IndexOfSpritePaletteTag(palette->tag) != 0xFF) - return 0xFF; - else - return LoadSpritePalette(palette); -} - -void pal_patch_for_npc(u16 a, u16 b) -{ - u8 var = b; - u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a); - - LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20); -} - -void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c) -{ - for (; b < c; arr++, b++) - pal_patch_for_npc(*arr, b); -} - -u8 FindFieldObjectPaletteIndexByTag(u16 tag) -{ - u8 i; - - for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++) - { - if (gUnknown_0837377C[i].tag == tag) - return i; - } - return 0xFF; -} - -void npc_load_two_palettes__no_record(u16 a, u8 b) -{ - u8 i; - - pal_patch_for_npc(a, b); - for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++) - { - if (gUnknown_08373874[i].tag == a) - { - pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); - break; - } - } -} - -void npc_load_two_palettes__and_record(u16 a, u8 b) -{ - u8 i; - - gUnknown_030005A6 = a; - pal_patch_for_npc(a, b); - for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) - { - if (gUnknown_083738E4[i].tag == a) - { - pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); - break; - } - } -} - -void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x += x; - mapObject->coords2.y += y; -} - -void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = x; - mapObject->coords3.y = y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void sub_805C058(struct MapObject *mapObject, s16 x, s16 y) -{ - struct Sprite *sprite = &gSprites[mapObject->spriteId]; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - - npc_coords_set(mapObject, x, y); - sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sub_805B914(mapObject); - if (mapObject->mapobj_bit_15) - CameraObjectReset1(); -} - -void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - x += 7; - y += 7; - sub_805C058(&gMapObjects[mapObjectId], x, y); - } -} - -void npc_coords_shift_still(struct MapObject *mapObject) -{ - npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); -} - -void UpdateFieldObjectCoordsForCameraUpdate(void) -{ - u8 i; - s16 deltaX; - s16 deltaY; - - if (gCamera.field_0) - { - deltaX = gCamera.x; - deltaY = gCamera.y; - for (i = 0; i < 16; i++) - { - - if (gMapObjects[i].active) - { - gMapObjects[i].coords1.x -= deltaX; - gMapObjects[i].coords1.y -= deltaY; - gMapObjects[i].coords2.x -= deltaX; - gMapObjects[i].coords2.y -= deltaY; - gMapObjects[i].coords3.x -= deltaX; - gMapObjects[i].coords3.y -= deltaY; - } - } - } -} - -bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); - -u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y - && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) - return i; - } - return 16; -} - -bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) -{ - if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 - && mapObject->mapobj_unk_0B_0 != z) - return FALSE; - else - return TRUE; -} - -void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) -{ - UpdateFieldObjectCoordsForCameraUpdate(); - sub_805B55C(x, y); - RemoveFieldObjectsOutsideView(); -} - -u8 AddCameraObject(u8 a) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4); - - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[0] = a; - return spriteId; -} - -void ObjectCB_CameraObject(struct Sprite *sprite) -{ - void (*cameraObjectFuncs[3])(struct Sprite *); - memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs); - cameraObjectFuncs[sprite->data[1]](sprite); -} - -void CameraObject_0(struct Sprite *sprite) -{ - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; - sprite->invisible = TRUE; - sprite->data[1] = 1; - CameraObject_1(sprite); -} - -void CameraObject_1(struct Sprite *sprite) -{ - s16 x = gSprites[sprite->data[0]].pos1.x; - s16 y = gSprites[sprite->data[0]].pos1.y; - - sprite->data[2] = x - sprite->pos1.x; - sprite->data[3] = y - sprite->pos1.y; - sprite->pos1.x = x; - sprite->pos1.y = y; -} - -void CameraObject_2(struct Sprite *sprite) -{ - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; - sprite->data[2] = 0; - sprite->data[3] = 0; -} - -struct Sprite *FindCameraObject(void) -{ - u8 i; - - for (i = 0; i < 64; i++) - { - if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) - return &gSprites[i]; - } - return NULL; -} - -void CameraObjectReset1(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite != NULL) - { - cameraSprite->data[1] = 0; - cameraSprite->callback(cameraSprite); - } -} - -void CameraObjectSetFollowedObjectId(u8 spriteId) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite != NULL) - { - cameraSprite->data[0] = spriteId; - CameraObjectReset1(); - } -} - -u8 CameraObjectGetFollowedObjectId(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite == NULL) - return 64; - else - return cameraSprite->data[0]; -} - -void CameraObjectReset2(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - cameraSprite->data[1] = 2; -} - -u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < 64; i++) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *src; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - break; - } - } - return i; -} - -u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority) -{ - s16 i; - - for (i = 63; i > -1; i--) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *src; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - return i; - } - } - return 64; -} - -void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) -{ - mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; - if (!mapObject->mapobj_bit_9) - { - s8 _direction = direction; //needed for the asm to match - mapObject->mapobj_unk_18 = _direction; - } - mapObject->placeholder18 = direction; -} - -u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - - return template->script; -} - -u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - - return template->flagId; -} - -u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return 0xFF; - else - return gMapObjects[mapObjectId].trainerType; -} - -u8 unref_sub_805C60C(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerType; -} - -u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return 0xFF; - else - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -u8 FieldObjectGetBerryTreeId(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8); - -struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup) - return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount); - else - { - struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); - - return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount); - } -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) -{ - u8 i; - - for (i = 0; i < count; i++) - { - if (templates[i].localId == localId) - return &templates[i]; - } - return NULL; -} - -struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject) -{ - s32 i; - - if (mapObject->mapNum != gSaveBlock1.location.mapNum - || mapObject->mapGroup != gSaveBlock1.location.mapGroup) - return NULL; - - for (i = 0; i < 64; i++) - { - if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId) - return &gSaveBlock1.mapObjectTemplates[i]; - } - return NULL; -} - -void sub_805C754(struct MapObject *mapObject) -{ - struct MapObjectTemplate *template = sub_805C700(mapObject); - - if (template != NULL) - { - template->x = mapObject->coords2.x - 7; - template->y = mapObject->coords2.y - 7; - } -} - -void sub_805C774(struct MapObject *mapObject, u8 movementType) -{ - struct MapObjectTemplate *template = sub_805C700(mapObject); - - if (template != NULL) - template->movementType = movementType; -} - -void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - sub_805C754(&gMapObjects[mapObjectId]); -} - -void sub_805C7C4(u8 a) -{ - gpu_pal_allocator_reset__manage_upper_four(); - gUnknown_030005A6 = 0x11FF; - gUnknown_030005A4 = a; - pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10); -} - -u16 npc_paltag_by_palslot(u8 a) -{ - u8 i; - - if (a < 10) - return gUnknown_0837399C[gUnknown_030005A4][a]; - - for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) - { - if (gUnknown_083738E4[i].tag == gUnknown_030005A6) - { - return gUnknown_083738E4[i].data[gUnknown_030005A4]; - } - } - return 0x11FF; -} - -fieldmap_object_null_cb(sub_805C884, sub_805C8A8); -fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224); - -u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); - -u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); -extern void sub_8064820(struct Sprite *, s16); - -u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -extern u8 sub_8064824(struct Sprite *); - -u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -extern u8 sub_805FF20(struct MapObject *, u8); - -u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - direction = directions[Random() & 3]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) -{ - s16 x; - s16 y; - s16 objx; - s16 objy; - s16 minx; - s16 maxx; - s16 miny; - s16 maxy; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0) - { - return 0; - } - if (mapObject->trainerType != 1 && mapObject->trainerType != 3) - { - return 0; - } - PlayerGetDestCoords(&x, &y); - objx = mapObject->coords2.x; - objy = mapObject->coords2.y; - minx = objx - mapObject->trainerRange_berryTreeId; - miny = objy - mapObject->trainerRange_berryTreeId; - maxx = objx + mapObject->trainerRange_berryTreeId; - maxy = objy + mapObject->trainerRange_berryTreeId; - if (minx > x || maxx < x || miny > y || maxy < y) - { - return 0; - } - return 1; -} - -u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - if (a2 > a3) - { - dirn = DIR_EAST; - if (a0 < 0) - { - dirn = DIR_WEST; - } - } - else - { - dirn = DIR_SOUTH; - if (a1 < 0) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = DIR_SOUTH; - if (a1 < 0) - { - dirn = DIR_NORTH; - } - return dirn; -} - -u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = DIR_EAST; - if (a0 < 0) - { - dirn = DIR_WEST; - } - return dirn; -} - -u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = DIR_NORTH; - } - } - else if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = DIR_NORTH; - } - } - else if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = DIR_SOUTH; - } - } - else if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = DIR_SOUTH; - } - } - return dirn; -} - -u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) { - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = DIR_SOUTH; - } - } - else if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = DIR_SOUTH; - } - } - return dirn; -} - -u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CD60(struct MapObject *mapObject, u8 a1) -{ - s16 x; - s16 y; - s16 x2; - s16 y2; - if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - return 0; - } - PlayerGetDestCoords(&x, &y); - x -= mapObject->coords2.x; - y -= mapObject->coords2.y; - x2 = x; - y2 = y; - if (x2 < 0) - { - x2 = -x2; - } - if (y2 < 0) - { - y2 = -y2; - } - return gUnknown_08375244[a1](x, y, x2, y2); -} - -fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270); - -u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284); - -u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752A0, 2); - direction = directions[Random() & 1]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4); - -u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752C0, 2); - direction = directions[Random() & 1]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4); - -u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - sprite->data[1] = 2; - return 1; - } - return 0; -} - -u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - return 0; -} - -u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite); - -void FieldObjectCB_BerryTree(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (!(sprite->data[7] & 1)) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data[7] |= 1; - } - meta_step(mapObject, sprite, sub_805D314); -} - -u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_083752D0[sprite->data[1]](mapObject, sprite); -} - -u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 berryTreeStage; - npc_reset(mapObject, sprite); - mapObject->mapobj_bit_13 = 1; - sprite->invisible = 1; - berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (!berryTreeStage) - { - if (!(sprite->data[7] & 4) && sprite->animNum == 4) - { - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - sprite->animNum = 0; - } - return 0; - } - mapObject->mapobj_bit_13 = 0; - sprite->invisible = 0; - berryTreeStage--; - if (sprite->animNum != berryTreeStage) - { - sprite->data[1] = 2; - return 1; - } - get_berry_tree_graphics(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, 0x39); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 0; - return 1; - } - return 0; -} - -u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 3; - sprite->data[2] = 0; - sprite->data[7] |= 2; - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - return 1; -} - -u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[2]++; - mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); - sprite->animPaused = 1; - if (sprite->data[2] > 64) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data[1] = 4; - sprite->data[2] = 0; - return 1; - } - return 0; -} - -u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[2]++; - mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); - sprite->animPaused = 1; - if (sprite->data[2] > 64) - { - sprite->data[1] = 0; - sprite->data[7] &= (-3); - return 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4); - -u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752A0, 2); - direction = sub_805CD60(mapObject, 1); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8); - -u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752C0, 2); - direction = sub_805CD60(mapObject, 2); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C); - -u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375320, 2); - direction = sub_805CD60(mapObject, 3); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324); - -u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375338, 2); - direction = sub_805CD60(mapObject, 4); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C); - -u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375350, 2); - direction = sub_805CD60(mapObject, 5); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354); - -u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375368, 2); - direction = sub_805CD60(mapObject, 6); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C); - -u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375380, 4); - direction = sub_805CD60(mapObject, 7); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384); - -u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375398, 4); - direction = sub_805CD60(mapObject, 8); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C); - -u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_083753B0, 4); - direction = sub_805CD60(mapObject, 9); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4); - -u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_083753C8, 4); - direction = sub_805CD60(mapObject, 10); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC); - -u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, 0x30); - sprite->data[1] = 2; - } - return 0; -} - -u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gUnknown_083753DC, 5); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 0; - return 1; -} - -fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4); - -u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, 0x30); - sprite->data[1] = 2; - } - return 0; -} - -u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gUnknown_083753F4, 5); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 0; - return 1; -} - -fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC); - -u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - direction = gUnknown_0836DC09[mapObject->animPattern]; - if (mapObject->mapobj_unk_21 != 0) - { - direction = GetOppositeDirection(direction); - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 v0; - u8 goSpeed0AnimId; - if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - } - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - if (v0 == 1) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - } - if (v0 != 0) - { - goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 3; - return 1; -} - -u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence) -{ - u8 v0; - u8 goSpeed0AnimId; - if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - } - FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - if (v0 == 1) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - } - if (v0 != 0) - { - goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C); - -u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375418, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C); - -u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375428, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C); - -u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375438, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C); - -u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375448, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - - - -fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C); - -u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375458, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C); - -u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375468, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C); - -u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478); - -u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375484, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488); - -u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375494, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498); - -u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754A4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8); - -u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754B4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8); - -u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754C4, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8); - -u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754D4, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8); - -u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754E4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8); - -u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754F4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8); - -u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375504, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508); - -u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375514, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518); - -u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375524, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528); - -u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375534, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538); - -u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375544, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548); - -u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375554, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558); - -u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375564, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568); - -u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375574, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578); - -u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375584, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -}; - -fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588); - -u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - if (mapObject->mapobj_unk_21 == 0) - { - mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); - } - sprite->data[1] = 1; - return 1; -} - -u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - { - return 0; - } - return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); -} - -u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -bool8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - return 0; -} - -bool8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2))); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -bool8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = a2; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -bool8 sub_805F4F0(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_8060744(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F5A8(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_806079C(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F660(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_80607C8(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectSetRegularAnim(mapObject, sprite, sub_806084C(direction)); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F760(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_80608A4(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - x = mapObject->coords2.x; - y = mapObject->coords2.y; - sub_8060320(direction, &x, &y, 2, 2); - FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); - -u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - { - return 0; - } - return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); -} - -u8 sub_805F9F8(struct MapObject *, struct Sprite *); - -void FieldObjectCB_TreeDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) - { - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); - mapObject->mapobj_unk_21 = 1; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); -} - -u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return 0; -} - -void FieldObjectCB_MountainDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) - { - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); - mapObject->mapobj_unk_21 = 1; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); -} - -u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite); - -void FieldObjectCB_Hidden1(struct Sprite *sprite) -{ - if (sprite->data[7] == 0) - { - gMapObjects[sprite->data[0]].mapobj_bit_26 = 1; - sprite->subspriteMode = 2; - sprite->oam.priority = 3; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805FAD8); -} - -u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_083755CC[sprite->data[1]](mapObject, sprite); -} - -u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return 0; -} - -u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 0; - } - return 0; -} - -fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0); - -u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8); - -u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0); - -u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8); - -u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - mapObject->mapobj_bit_13 = 1; - sprite->data[1] = 1; - return 1; -} - -u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 2; - return 1; - } - return 0; -} - -u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - return 0; -} - -void sub_805FC70(struct Sprite *sprite); - -void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - mapObject->mapobj_bit_6 = 0; - mapObject->mapobj_bit_7 = 0; - mapObject->mapobj_unk_1C = 0xff; - sprite->data[1] = 0; -} - -u8 FieldObjectDirectionToImageAnimId(u8 direction) -{ - return gUnknown_083755F4[direction]; -} - -u8 get_go_image_anim_num(u8 direction) -{ - return gUnknown_083755FD[direction]; -} - -u8 get_go_fast_image_anim_num(u8 direction) -{ - return gUnknown_08375606[direction]; -} - -u8 get_go_faster_image_anim_num(u8 direction) -{ - return gUnknown_0837560F[direction]; -} - -u8 sub_805FD78(u8 direction) -{ - return gUnknown_08375618[direction]; -} - -u8 sub_805FD88(u8 direction) -{ - return gUnknown_08375621[direction]; -} - -u8 sub_805FD98(u8 direction) -{ - return gUnknown_0837562A[direction]; -} - -u8 unref_sub_805FDA8(u8 direction) -{ - return gUnknown_08375633[direction]; -} - -u8 sub_805FDB8(u8 direction) -{ - return gUnknown_0837563C[direction]; -} - -u8 sub_805FDC8(u8 direction) -{ - return gUnknown_08375645[direction]; -} - -u8 sub_805FDD8(u8 direction) -{ - return gUnknown_0837564E[direction]; -} - -u8 sub_805FDE8(u8 direction) -{ - return gUnknown_08375657[direction]; -} - -u8 sub_805FDF8(u8 direction) -{ - return gUnknown_08375660[direction]; -} - -u8 sub_805FE08(u8 direction) -{ - return gUnknown_08375669[direction]; -} - -u8 get_run_image_anim_num(u8 direction) -{ - return gUnknown_08375672[direction]; -} - -void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - if (sprite->animCmdIndex == 1) - { - sprite->animCmdIndex = 2; - } else if (sprite->animCmdIndex == 3) - { - sprite->animCmdIndex = 0; - } - SeekSpriteAnim(sprite, sprite->animCmdIndex); - } -} - -void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - u8 animCmdIndex; - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - animCmdIndex = 3; - if (sprite->animCmdIndex < 2) - { - animCmdIndex = 1; - } - SeekSpriteAnim(sprite, animCmdIndex); - } -} - -u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3) -{ - if (a0 > a2) - { - return DIR_WEST; - } else if (a0 < a2) - { - return DIR_EAST; - } else if (a1 > a3) - { - return DIR_NORTH; - } else - { - return DIR_SOUTH; - } -} - -void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) -{ - mapObject->animPattern = animPattern; - mapObject->mapobj_unk_21 = 0; - mapObject->animId = 0; - gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern]; - gSprites[mapObject->spriteId].data[1] = 0; -} - -u8 npc_running_behaviour_by_direction(u8 direction) -{ - return gUnknown_0837567B[direction]; -} - -u8 sub_805FF20(struct MapObject *mapObject, u8 direction) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - MoveCoords(direction, &x, &y); - return npc_block_way(mapObject, x, y, direction); -} - -bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y); -static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y); -bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); - -u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) -{ - u8 direction; - direction = dirn; - if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) - return 1; - else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) - return 2; - else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) - return 2; - else if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - return 3; - else if (DoesObjectCollideWithObjectAt(mapObject, x, y)) - return 4; - return 0; -} - -u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - u8 flags = 0; - - if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) - flags |= 1; - if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) - flags |= 2; - if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - flags |= 4; - if (DoesObjectCollideWithObjectAt(mapObject, x, y)) - flags |= 8; - return flags; -} - -bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y) -{ - s16 minv; - s16 maxv; - - if (mapObject->range.as_nybbles.x != 0) - { - minv = mapObject->coords1.x - (mapObject->range.as_nybbles.x); - maxv = mapObject->coords1.x + (mapObject->range.as_nybbles.x); - if (minv > x || maxv < x) - return TRUE; - } - if (mapObject->range.as_nybbles.y != 0) - { - minv = mapObject->coords1.y - (mapObject->range.as_nybbles.y); - maxv = mapObject->coords1.y + (mapObject->range.as_nybbles.y); - if (minv > y || maxv < y) - return TRUE; - } - return FALSE; -} - -bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) - { - return 1; - } - return 0; -} - -static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - struct MapObject *mapObject2 = &gMapObjects[i]; - - if (mapObject2->active && mapObject2 != mapObject) - { - if (((mapObject2->coords2.x == x && mapObject2->coords2.y == y) || (mapObject2->coords3.x == x && mapObject2->coords3.y == y)) - && AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0)) - return TRUE; - } - } - return 0; -} - -// this function is only used in berry.c, but its unknown whether its intended context is the berry tree check or if its checking for the flickering. -bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - if (gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 2) - return TRUE; - - return FALSE; -} - -void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 4; - } -} - -void MoveCoords(u8 direction, s16 *x, s16 *y) -{ - *x += gDirectionToVector[direction].x; - *y += gDirectionToVector[direction].y; -} - -void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) -{ - *x += gDirectionToVector[direction].x << 4; - *y += gDirectionToVector[direction].y << 4; -} - -void sub_8060320(u32 dirn, s16 *x, s16 *y, s16 deltaX, s16 deltaY) -{ - u8 direction = dirn; - s16 dx2 = deltaX; - s16 dy2 = deltaY; - if (gDirectionToVector[direction].x > 0) - { - *x += dx2; - } - if (gDirectionToVector[direction].x < 0) - { - *x -= dx2; - } - if (gDirectionToVector[direction].y > 0) - { - *y += dy2; - } - if (gDirectionToVector[direction].y < 0) - { - *y -= dy2; - } -} - -void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2) -{ - *x2 = (x1 - gSaveBlock1.pos.x) << 4; - *y2 = (y1 - gSaveBlock1.pos.y) << 4; - *x2 -= gUnknown_0300489C; - *y2 -= gUnknown_03004898; -} - -void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2) -{ - s16 x3; - s16 y3; - x3 = -gUnknown_0300489C - gUnknown_03004880.unk10; - y3 = -gUnknown_03004898 - gUnknown_03004880.unk14; - if (gUnknown_03004880.unk10 > 0) - { - x3 += 0x10; - } - if (gUnknown_03004880.unk10 < 0) - { - x3 -= 0x10; - } - if (gUnknown_03004880.unk14 > 0) - { - y3 += 0x10; - } - if (gUnknown_03004880.unk14 < 0) - { - y3 -= 0x10; - } - *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3; - *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3; -} - -void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy) -{ - sub_80603CC(*x, *y, x, y); - *x += dx; - *y += dy; -} - -void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) -{ - *x = 0; - *y = 0; - if (gUnknown_03004880.unk10 > 0) - { - (*x)++; - } - if (gUnknown_03004880.unk10 < 0) - { - (*x)--; - } - if (gUnknown_03004880.unk14 > 0) - { - (*y)++; - } - if (gUnknown_03004880.unk14 < 0) - { - (*y)--; - } -} - -void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 direction, s16 *x, s16 *y) -{ - u8 newDirn = direction; - *x = mapObject->coords2.x; - *y = mapObject->coords2.y; - MoveCoords(newDirn, x, y); -} - -bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) - { - return TRUE; - } - UnfreezeMapObject(mapObject); - mapObject->mapobj_unk_1C = specialAnimId; - mapObject->mapobj_bit_6 = 1; - mapObject->mapobj_bit_7 = 0; - gSprites[mapObject->spriteId].data[2] = 0; - return FALSE; -} - -void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - FieldObjectSetSpecialAnim(mapObject, specialAnimId); -} - -void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - FieldObjectClearAnim(mapObject); - } -} - -void FieldObjectClearAnim(struct MapObject *mapObject) -{ - mapObject->mapobj_unk_1C = 0xFF; - mapObject->mapobj_bit_6 = 0; - mapObject->mapobj_bit_7 = 0; - gSprites[mapObject->spriteId].data[1] = 0; - gSprites[mapObject->spriteId].data[2] = 0; -} - -bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - return mapObject->mapobj_bit_7; - return 0x10; -} - -bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) -{ - u8 specialAnimStatus; - specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); - if (specialAnimStatus != 0 && specialAnimStatus != 0x10) - { - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - } - return specialAnimStatus; -} - -u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - return mapObject->mapobj_unk_1C; - } - return 0xFF; -} - -extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite); -extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite); -extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite); -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite); -void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite); - -void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *)) -{ - DoGroundEffects_OnSpawn(mapObject, sprite); - sub_80634A0(mapObject, sprite); - if (FieldObjectIsSpecialAnimActive(mapObject)) - { - FieldObjectExecSpecialAnim(mapObject, sprite); - } else - { - if (!mapObject->mapobj_bit_8) - { - while (callback(mapObject, sprite)); - } - } - DoGroundEffects_OnBeginStep(mapObject, sprite); - DoGroundEffects_OnFinishStep(mapObject, sprite); - npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); - sub_80634D0(mapObject, sprite); - FieldObjectUpdateSubpriority(mapObject, sprite); -} - -#define dirn_to_anim(name, table)\ -u8 name(u32 idx)\ -{\ - u8 direction;\ - u8 animIds[sizeof(table)];\ - direction = idx;\ - memcpy(animIds, (table), sizeof(table));\ - if (direction > DIR_EAST) direction = 0;\ - return animIds[direction];\ -} - -dirn_to_anim(GetFaceDirectionAnimId, gUnknown_083756C8) -dirn_to_anim(GetSimpleGoAnimId, gUnknown_083756CD) -dirn_to_anim(GetGoSpeed0AnimId, gUnknown_083756D2) -dirn_to_anim(sub_8060744, gUnknown_083756D7) -dirn_to_anim(d2s_08064034, gUnknown_083756DC) -dirn_to_anim(sub_806079C, gUnknown_083756E1) -dirn_to_anim(sub_80607C8, gUnknown_083756E6) -dirn_to_anim(sub_80607F4, gUnknown_083756EB) -dirn_to_anim(GetJumpLedgeAnimId, gUnknown_083756F0) -dirn_to_anim(sub_806084C, gUnknown_083756F5) -dirn_to_anim(sub_8060878, gUnknown_083756FA) -dirn_to_anim(sub_80608A4, gUnknown_083756FF) -dirn_to_anim(sub_80608D0, gUnknown_08375704) -dirn_to_anim(GetStepInPlaceDelay32AnimId, gUnknown_08375709) -dirn_to_anim(GetStepInPlaceDelay16AnimId, gUnknown_0837570E) -dirn_to_anim(GetStepInPlaceDelay8AnimId, gUnknown_08375713) -dirn_to_anim(GetStepInPlaceDelay4AnimId, gUnknown_08375718) - -u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) -{ - return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); -} - -u8 sub_80609D8(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837571D, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A04(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375722, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A30(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375727, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A5C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837572C, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A88(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375731, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060AB4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375736, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060AE0(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837573B, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B0C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375740, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B38(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375745, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B64(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837574A, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetOppositeDirection(u8 direction) -{ - u8 directions[8]; - memcpy(directions, gUnknown_0837574F, 8); - if (direction == 0 || direction > 8) - { - return direction; - } - return directions[direction - 1]; -} - -u32 zffu_offset_calc(u8 a0, u8 a1) -{ - return gUnknown_08375757[a0 - 1][a1 - 1]; -} - -u32 state_to_direction(u8 a0, u32 a1, u32 a2) -{ - u32 zffuOffset; - u8 a1_2 = a1; - u8 a2_2 = a2; - if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) - { - return 0; - } - zffuOffset = zffu_offset_calc(a1_2, a2); - return gUnknown_08375767[a0 - 1][zffuOffset - 1]; -} - -void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) - { - mapObject->mapobj_bit_7 = 1; - } -} - -bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) - { - mapObject->mapobj_unk_1C = 0xFF; - sprite->data[2] = 0; - return 1; - } - return 0; -} - -void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) -{ - mapObject->mapobj_unk_1C = animId; - sprite->data[2] = 0; -} - -void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - sprite->animPaused = 1; - sprite->data[2] = 1; -} - -u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_SOUTH); - return 1; -} - -u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_NORTH); - return 1; -} - -u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_WEST); - return 1; -} - -u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_EAST); - return 1; -} - -void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - oamt_npc_ministep_reset(sprite, direction, a3); - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - sprite->data[2] = 1; -} - -extern u8 (*const gUnknown_083759C0[5])(u8); - -void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - u8 (*const functions[5])(u8); - memcpy((void *)functions, gUnknown_083759C0, sizeof(gUnknown_083759C0)); - sub_8060D20(mapObject, sprite, direction, a3); - sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18)); -} - -void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8060D20(mapObject, sprite, direction, 1); - sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 obj_npc_ministep(struct Sprite *); - -bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (obj_npc_ministep(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - sprite->animPaused = 1; - return 1; - } - return 0; -} - -void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - sub_806467C(sprite, direction); - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - sprite->data[2] = 1; -} - -void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8060E68(mapObject, sprite, direction); - sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_806468C(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - sprite->animPaused = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060F5C(struct MapObject *, struct Sprite *); - -bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - return sub_8060F5C(mapObject, sprite); -} - -bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060F9C(struct MapObject *, struct Sprite *); - -bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_NORTH); - return sub_8060F9C(mapObject, sprite); -} - -bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060FDC(struct MapObject *, struct Sprite *); - -bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_WEST); - return sub_8060FDC(mapObject, sprite); -} - -bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806101C(struct MapObject *, struct Sprite *); - -bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_EAST); - return sub_806101C(mapObject, sprite); -} - -bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806105C(struct MapObject *, struct Sprite *); - -bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 0); - return sub_806105C(mapObject, sprite); -} - -bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806109C(struct MapObject *, struct Sprite *); - -bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 0); - return sub_806109C(mapObject, sprite); -} - -bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80610DC(struct MapObject *, struct Sprite *); - -bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 0); - return sub_80610DC(mapObject, sprite); -} - -bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806111C(struct MapObject *, struct Sprite *); - -bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 0); - return sub_806111C(mapObject, sprite); -} - -bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) -{ - s16 vSPp4[3]; - s16 x; - s16 y; - memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34); - x = 0; - y = 0; - FieldObjectSetDirection(mapObject, direction); - sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - sub_80646E4(sprite, direction, a4, a5); - sprite->data[2] = 1; - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; -} - -void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) -{ - sub_806113C(mapObject, sprite, direction, a4, a5); - sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - DoShadowFieldEffect(mapObject); -} - -u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *)) -{ - s16 vSPp4[3]; - s16 x; - s16 y; - u8 retval; - memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A); - retval = callback(sprite); - if (retval == 1 && vSPp4[sprite->data[4]] != 0) - { - x = 0; - y = 0; - sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data[4]], vSPp4[sprite->data[4]]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; - } else if (retval == 0xff) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - mapObject->mapobj_bit_5 = 1; - sprite->animPaused = 1; - } - return retval; -} - -u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_806123C(mapObject, sprite, sub_8064704); -} - -u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_806123C(mapObject, sprite, sub_806478C); -} - -bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061300(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061314(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 retval; - - retval = sub_8061300(mapObject, sprite); - if (retval != 1) - { - if (retval == 0xFF) - { - return TRUE; - } - return FALSE; - } - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - return FALSE; -} - -bool8 sub_80613D4(struct MapObject *, struct Sprite *); -bool8 sub_806142C(struct MapObject *, struct Sprite *); -bool8 sub_8061484(struct MapObject *, struct Sprite *); -bool8 sub_80614DC(struct MapObject *, struct Sprite *); - -bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0); - return sub_80613D4(mapObject, sprite); -} - -bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0); - return sub_806142C(mapObject, sprite); -} - -bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0); - return sub_8061484(mapObject, sprite); -} - -bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0); - return sub_80614DC(mapObject, sprite); -} - -bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8061508(struct Sprite *sprite, u16 duration) -{ - sprite->data[2] = 1; - sprite->data[3] = duration; -} - -bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[3]--; - if (!sprite->data[3]) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 1); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 2); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 4); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 8); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 16); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 1); - return sub_80615EC(mapObject, sprite); -} - -bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 1); - return sub_806162C(mapObject, sprite); -} - -bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 1); - return sub_806166C(mapObject, sprite); -} - -bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 1); - return sub_80616AC(mapObject, sprite); -} - -bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration) -{ - FieldObjectSetDirection(mapObject, direction); - sub_805FE28(mapObject, sprite, animId); - sprite->animPaused = 0; - sprite->data[2] = 1; - sprite->data[3] = duration; -} - -bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[3]--; - if (sprite->data[3] == 0) - { - sprite->data[2] = 2; - sprite->animPaused = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sprite->data[3] & 1) - { - sprite->animDelayCounter++; - } - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061B18(struct MapObject *, struct Sprite *); - -bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 2); - return sub_8061B18(mapObject, sprite); -} - -bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061B58(struct MapObject *, struct Sprite *); - -bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 2); - return sub_8061B58(mapObject, sprite); -} - -bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061B98(struct MapObject *, struct Sprite *); - -bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 2); - return sub_8061B98(mapObject, sprite); -} - -bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061BD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 2); - return sub_8061BD8(mapObject, sprite); -} - -bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061C18(struct MapObject *, struct Sprite *); - -bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 3); - return sub_8061C18(mapObject, sprite); -} - -bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061C58(struct MapObject *, struct Sprite *); - -bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 3); - return sub_8061C58(mapObject, sprite); -} - -bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061C98(struct MapObject *, struct Sprite *); - -bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 3); - return sub_8061C98(mapObject, sprite); -} - -bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061CD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 3); - return sub_8061CD8(mapObject, sprite); -} - -bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061D18(struct MapObject *, struct Sprite *); - -bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 4); - return sub_8061D18(mapObject, sprite); -} - -bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061D58(struct MapObject *, struct Sprite *); - -bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 4); - return sub_8061D58(mapObject, sprite); -} - -bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061D98(struct MapObject *, struct Sprite *); - -bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 4); - return sub_8061D98(mapObject, sprite); -} - -bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061DD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 4); - return sub_8061DD8(mapObject, sprite); -} - -bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E18(struct MapObject *, struct Sprite *); - -bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_SOUTH); - return sub_8061E18(mapObject, sprite); -} - -bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E58(struct MapObject *, struct Sprite *); - -bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_NORTH); - return sub_8061E58(mapObject, sprite); -} - -bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E98(struct MapObject *, struct Sprite *); - -bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_WEST); - return sub_8061E98(mapObject, sprite); -} - -bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061ED8(struct MapObject *, struct Sprite *); - -bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_EAST); - return sub_8061ED8(mapObject, sprite); -} - -bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) -{ - obj_anim_image_set_and_seek(sprite, animNum, 0); - FieldObjectSetDirection(mapObject, direction); - sprite->data[2] = 1; -} - -bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); - return FALSE; -} - -bool8 sub_8064864(struct Sprite *); - -bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_806113C(mapObject, sprite, direction, 1, 0); - StartSpriteAnim(sprite, sub_805FD88(direction)); -} - -bool8 sub_8061FB0(struct MapObject *, struct Sprite *); - -bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_SOUTH); - return sub_8061FB0(mapObject, sprite); -} - -bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061FF8(struct MapObject *, struct Sprite *); - -bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_NORTH); - return sub_8061FF8(mapObject, sprite); -} - -bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062040(struct MapObject *, struct Sprite *); - -bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_WEST); - return sub_8062040(mapObject, sprite); -} - -bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062088(struct MapObject *, struct Sprite *); - -bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_EAST); - return sub_8062088(mapObject, sprite); -} - -bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 objectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) - { - an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)); - } - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 objectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) - { - an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y))); - } - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2); - return sub_80621BC(mapObject, sprite); -} - -bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2); - return sub_8062214(mapObject, sprite); -} - -bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2); - return sub_806226C(mapObject, sprite); -} - -bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2); - return sub_80622C4(mapObject, sprite); -} - -bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0); - return sub_806231C(mapObject, sprite); -} - -bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0); - return sub_8062374(mapObject, sprite); -} - -bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0); - return sub_80623CC(mapObject, sprite); -} - -bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0); - return sub_8062424(mapObject, sprite); -} - -bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2); - return sub_806247C(mapObject, sprite); -} - -bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2); - return sub_80624D4(mapObject, sprite); -} - -bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2); - return sub_806252C(mapObject, sprite); -} - -bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2); - return sub_8062584(mapObject, sprite); -} - -bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]); - return TRUE; -} - -bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); - return FALSE; -} - -bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_HEART_ICON); - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062704(struct MapObject *, struct Sprite *); - -bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->animPattern == 0x3F) - { - sub_8084794(mapObject); - return FALSE; - } - else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) - { - sprite->data[2] = 2; - return TRUE; - } - else - { - sub_812869C(mapObject); - sprite->data[2] = 1; - return sub_8062704(mapObject, sprite); - } -} - -bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_81286C4(mapObject)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data[2] = 1; - return FALSE; -} - -bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sub_8064820(sprite, 0x20); - sprite->data[2] = 2; - } - return FALSE; -} - -bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= 1; - if (sub_8064824(sprite)) - { - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 3; - } - return FALSE; -} - -bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data[2] = 1; - return FALSE; -} - -bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sub_8064820(sprite, 0x20); - sprite->data[2] = 2; - } - return FALSE; -} - -bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= 1; - if (sub_8064824(sprite)) - { - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 3; - } - return FALSE; -} - -bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->oam.affineMode = 3; - InitSpriteAffineAnim(sprite); - sprite->affineAnimPaused = 1; - sprite->subspriteMode = 0; - return TRUE; -} - -bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = 0; - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - return TRUE; -} - -bool8 sub_80628D0(struct MapObject *, struct Sprite *); - -bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - sprite->affineAnimPaused = 0; - StartSpriteAffineAnimIfDifferent(sprite, 0); - return sub_80628D0(mapObject, sprite); -} - -bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->affineAnimPaused = 1; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062930(struct MapObject *, struct Sprite *); - -bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - sprite->affineAnimPaused = 0; - ChangeSpriteAffineAnimIfDifferent(sprite, 1); - return sub_8062930(mapObject, sprite); -} - -bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->affineAnimPaused = 1; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - sub_805FE64(mapObject, sprite, sub_805FDD8(direction)); - sprite->animPaused = 1; - sprite->data[2] = 1; -} - -bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_SOUTH); - return TRUE; -} - -bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_NORTH); - return TRUE; -} - -bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_WEST); - return TRUE; -} - -bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_EAST); - return TRUE; -} - -bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST)); - return FALSE; -} - -bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST)); - return FALSE; -} - -bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST)); - return FALSE; -} - -void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4) -{ - sub_806113C(mapObject, sprite, direction, a3, a4); - StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction)); - DoShadowFieldEffect(mapObject); -} - -bool8 sub_8062BFC(struct MapObject *, struct Sprite *); - -bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1); - return sub_8062BFC(mapObject, sprite); -} - -bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062C54(struct MapObject *, struct Sprite *); - -bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1); - return sub_8062C54(mapObject, sprite); -} - -bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062CAC(struct MapObject *, struct Sprite *); - -bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1); - return sub_8062CAC(mapObject, sprite); -} - -bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062D04(struct MapObject *, struct Sprite *); - -bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1); - return sub_8062D04(mapObject, sprite); -} - -bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062D5C(struct MapObject *, struct Sprite *); - -bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1); - return sub_8062D5C(mapObject, sprite); -} - -bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062DB4(struct MapObject *, struct Sprite *); - -bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1); - return sub_8062DB4(mapObject, sprite); -} - -bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062E0C(struct MapObject *, struct Sprite *); - -bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1); - return sub_8062E0C(mapObject, sprite); -} - -bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062E64(struct MapObject *, struct Sprite *); - -bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1); - return sub_8062E64(mapObject, sprite); -} - -bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062EBC(struct MapObject *, struct Sprite *); - -bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0); - return sub_8062EBC(mapObject, sprite); -} - -bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062F14(struct MapObject *, struct Sprite *); - -bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0); - return sub_8062F14(mapObject, sprite); -} - -bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062F6C(struct MapObject *, struct Sprite *); - -bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0); - return sub_8062F6C(mapObject, sprite); -} - -bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062FC4(struct MapObject *, struct Sprite *); - -bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0); - return sub_8062FC4(mapObject, sprite); -} - -bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8); - return sub_8061714(mapObject, sprite); -} - -void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -bool8 sub_8063128(struct MapObject *, struct Sprite *); - -bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063128(mapObject, sprite); -} - -bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063168(struct MapObject *, struct Sprite *); - -bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_NORTH, 1); - return sub_8063168(mapObject, sprite); -} - -bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80631A8(struct MapObject *, struct Sprite *); - -bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_WEST, 1); - return sub_80631A8(mapObject, sprite); -} - -bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80631E8(struct MapObject *, struct Sprite *); - -bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_EAST, 1); - return sub_80631E8(mapObject, sprite); -} - -bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18)); -} - -bool8 sub_8063258(struct MapObject *, struct Sprite *); - -bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063258(mapObject, sprite); -} - -bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063298(struct MapObject *, struct Sprite *); - -bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_NORTH, 1); - return sub_8063298(mapObject, sprite); -} - -bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80632D8(struct MapObject *, struct Sprite *); - -bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_WEST, 1); - return sub_80632D8(mapObject, sprite); -} - -bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063318(struct MapObject *, struct Sprite *); - -bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_EAST, 1); - return sub_8063318(mapObject, sprite); -} - -bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -bool8 sub_8063390(struct MapObject *, struct Sprite *); - -bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063390(mapObject, sprite); -} - -bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80633D0(struct MapObject *, struct Sprite *); - -bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_NORTH, 1); - return sub_80633D0(mapObject, sprite); -} - -bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063410(struct MapObject *, struct Sprite *); - -bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_WEST, 1); - return sub_8063410(mapObject, sprite); -} - -bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063450(struct MapObject *, struct Sprite *); - -bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_EAST, 1); - return sub_8063450(mapObject, sprite); -} - -bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite) -{ - return TRUE; -} - -bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->animPaused = 1; - return TRUE; -} - -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_10) - { - sprite->animPaused = 1; - } -} - -void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_11) - { - sprite->animPaused = 0; - mapObject->mapobj_bit_10 = 0; - mapObject->mapobj_bit_11 = 0; - } -} - -void sub_80634E8(struct MapObject *, struct Sprite *); -static void UpdateMapObjSpriteVisibility(struct MapObject *, struct Sprite *); - -void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80634E8(mapObject, sprite); - UpdateMapObjSpriteVisibility(mapObject, sprite); -} - -#ifdef NONMATCHING -void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u16 x; - u16 y; - s16 x2; - s16 y2; - const struct MapObjectGraphicsInfo *graphicsInfo; - mapObject->mapobj_bit_14 = 0; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - x2 = graphicsInfo->width + x; // offending line - y2 = graphicsInfo->height + y; // similarly offending line - if ((s16)x >= 0x100 || x2 < -0x10) - { - mapObject->mapobj_bit_14 = 1; - } - if ((s16)y >= 0xB0 || y2 < -0x10) - { - mapObject->mapobj_bit_14 = 1; - } -} -#else -__attribute__((naked)) -void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r5, r0, 0\n\ - adds r4, r1, 0\n\ - ldrb r1, [r5, 0x1]\n\ - movs r0, 0x41\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r5, 0x1]\n\ - ldrb r0, [r5, 0x5]\n\ - bl GetFieldObjectGraphicsInfo\n\ - adds r6, r0, 0\n\ - adds r0, r4, 0\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0806354C\n\ - ldrh r1, [r4, 0x24]\n\ - ldrh r0, [r4, 0x20]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\ - adds r0, r1\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r1, [r4, 0x26]\n\ - ldrh r0, [r4, 0x22]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x29\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\ - adds r0, r1\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - b _08063574\n\ - .align 2, 0\n\ -_08063544: .4byte gSpriteCoordOffsetX\n\ -_08063548: .4byte gSpriteCoordOffsetY\n\ -_0806354C:\n\ - ldrh r1, [r4, 0x24]\n\ - ldrh r0, [r4, 0x20]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r1, [r4, 0x26]\n\ - ldrh r0, [r4, 0x22]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x29\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - adds r0, r1\n\ -_08063574:\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - ldrh r0, [r6, 0x8]\n\ - adds r0, r3\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - ldrh r0, [r6, 0xA]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0xFF\n\ - bgt _0806359C\n\ - lsls r0, r1, 16\n\ - asrs r0, 16\n\ - movs r1, 0x10\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _080635A4\n\ -_0806359C:\n\ - ldrb r0, [r5, 0x1]\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ -_080635A4:\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - cmp r0, 0xAF\n\ - bgt _080635B8\n\ - lsls r0, r4, 16\n\ - asrs r0, 16\n\ - movs r1, 0x10\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _080635C0\n\ -_080635B8:\n\ - ldrb r0, [r5, 0x1]\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ -_080635C0:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ -.syntax divided\n"); -} -#endif - -void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->invisible = 0; - if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) - { - sprite->invisible = 1; - } -} diff --git a/src/field/field_map_obj_helpers.c b/src/field/field_map_obj_helpers.c deleted file mode 100644 index 328b66ed2..000000000 --- a/src/field/field_map_obj_helpers.c +++ /dev/null @@ -1,387 +0,0 @@ -#include "global.h" -#include "field_map_obj_helpers.h" -#include "field_effect.h" -#include "field_ground_effect.h" -#include "field_map_obj.h" -#include "sprite.h" - -typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); - -void Step1(struct Sprite *sprite, u8 dir); -void Step2(struct Sprite *sprite, u8 dir); -void Step3(struct Sprite *sprite, u8 dir); -void Step4(struct Sprite *sprite, u8 dir); -void Step8(struct Sprite *sprite, u8 dir); - -const SpriteStepFunc Unknown_83760F0[] = { - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1 -}; - -const SpriteStepFunc Unknown_8376130[] = { - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, - Step2 -}; - -const SpriteStepFunc Unknown_8376150[] = { - Step2, - Step3, - Step3, - Step2, - Step3, - Step3 -}; - -const SpriteStepFunc Unknown_8376168[] = { - Step4, - Step4, - Step4, - Step4 -}; - -const SpriteStepFunc Unknown_8376178[] = { - Step8, - Step8 -}; - -const SpriteStepFunc *const gUnknown_08376180[] = { - Unknown_83760F0, - Unknown_8376130, - Unknown_8376150, - Unknown_8376168, - Unknown_8376178 -}; - -const s16 gUnknown_08376194[] = { - 16, 8, 6, 4, 2 -}; - -const s8 Unknown_837619E[] = { - -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0 -}; - -const s8 Unknown_83761AE[] = { - 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0 -}; - -const s8 Unknown_83761BE[] = { - -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0 -}; - -const s8 *const gUnknown_083761D0[] = { - Unknown_837619E, - Unknown_83761AE, - Unknown_83761BE -}; - -bool8 FreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) - { - return TRUE; - } - else - { - mapObject->mapobj_bit_8 = 1; - mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; - mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; - gSprites[mapObject->spriteId].animPaused = 1; - gSprites[mapObject->spriteId].affineAnimPaused = 1; - return FALSE; - } -} - -void FreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < 16; i++) - if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void FreezeMapObjectsExceptOne(u8 a1) -{ - u8 i; - for (i = 0; i < 16; i++) - if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void UnfreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->active && mapObject->mapobj_bit_8) - { - mapObject->mapobj_bit_8 = 0; - gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; - gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; - } -} - -void UnfreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < 16; i++) - if (gMapObjects[i].active) - UnfreezeMapObject(&gMapObjects[i]); -} - -void Step1(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += gDirectionToVector[dir].x; - sprite->pos1.y += gDirectionToVector[dir].y; -} - -void Step2(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y; -} - -void Step3(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y; -} - -void Step4(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y; -} - -void Step8(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y; -} - -void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = 0; -} - -bool8 obj_npc_ministep(struct Sprite *sprite) -{ - if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]]) - return FALSE; - - gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); - - sprite->data[5]++; - - if (sprite->data[5] < gUnknown_08376194[sprite->data[4]]) - return FALSE; - - return TRUE; -} - -void sub_806467C(struct Sprite *sprite, u8 a2) -{ - sprite->data[3] = a2; - sprite->data[4] = 0; - sprite->data[5] = 0; -} - -bool8 sub_806468C(struct Sprite *sprite) -{ - if (!(sprite->data[4] & 1)) - { - Step1(sprite, sprite->data[3]); - sprite->data[5]++; - } - - sprite->data[4]++; - - if (sprite->data[5] > 15) - return TRUE; - else - return FALSE; -} - -s16 sub_80646C8(s16 a1, u8 a2) -{ - return gUnknown_083761D0[a2][a1]; -} - -void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) -{ - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = a4; - sprite->data[6] = 0; -} - -u8 sub_8064704(struct Sprite *sprite) -{ - s16 v5[3] = {0x10, 0x10, 0x20}; - u8 v6[3] = {0, 0, 1}; - u8 v2 = 0; - - if (sprite->data[4]) - Step1(sprite, sprite->data[3]); - - sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); - - sprite->data[6]++; - - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; - - if (sprite->data[6] >= v5[sprite->data[4]]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -u8 sub_806478C(struct Sprite *sprite) -{ - s16 v5[3] = {0x20, 0x20, 0x40}; - u8 v6[3] = {1, 1, 2}; - u8 v2 = 0; - - if (sprite->data[4] && !(sprite->data[6] & 1)) - Step1(sprite, sprite->data[3]); - - sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); - - sprite->data[6]++; - - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; - - if (sprite->data[6] >= v5[sprite->data[4]]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -void sub_8064820(struct Sprite *sprite, u16 a2) -{ - sprite->data[3] = a2; -} - -bool8 sub_8064824(struct Sprite *sprite) -{ - sprite->data[3]--; - - if (sprite->data[3] == 0) - return TRUE; - else - return FALSE; -} - -void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->animNum = a2; - sprite->animPaused = 0 ; - SeekSpriteAnim(sprite, a3); -} - -bool8 sub_8064864(struct Sprite *sprite) -{ - if (sprite->animEnded) - return TRUE; - else - return FALSE; -} - -void sub_806487C(struct Sprite *sprite, bool8 invisible) -{ - u16 x, y; - s16 x2, y2; - - sprite->invisible = invisible; - - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - - x2 = x - (sprite->centerToCornerVecX >> 1); - y2 = y - (sprite->centerToCornerVecY >> 1); - - if ((s16)x > 255 || x2 < -16) - sprite->invisible = 1; - if ((s16)y > 175 || y2 < -16) - sprite->invisible = 1; -} - -void sub_8064970(struct Sprite *sprite) -{ - SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); - sub_806487C(sprite, 0); -} - -void sub_8064990(u8 a1, u8 dir) -{ - u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1) - { - u8 animNum = FieldObjectDirectionToImageAnimId(dir); - StartSpriteAnim(sprite, animNum); - break; - } - } -} - -u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - return FieldEffectStart(fieldEffectId); -} - -void DoShadowFieldEffect(struct MapObject *mapObject) -{ - if (!mapObject->mapobj_bit_22) - { - mapObject->mapobj_bit_22 = 1; - oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); - } -} - -void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - gFieldEffectArguments[0] = sprite->pos1.x; - gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; - gFieldEffectArguments[2] = 151; - gFieldEffectArguments[3] = 3; - FieldEffectStart(FLDEFF_RIPPLE); -} diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index ba45e506d..573395766 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -4,9 +4,7 @@ #include "event_data.h" #include "field_effect.h" #include "field_effect_helpers.h" -#include "field_ground_effect.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" +#include "evobjmv.h" #include "fieldmap.h" #include "main.h" #include "constants/map_objects.h" diff --git a/src/field/field_special_scene.c b/src/field/field_special_scene.c index 67b652a57..f81f2e2f6 100644 --- a/src/field/field_special_scene.c +++ b/src/field/field_special_scene.c @@ -3,7 +3,7 @@ #include "event_data.h" #include "field_camera.h" #include "field_fadetransition.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_specials.h" #include "fieldmap.h" #include "main.h" diff --git a/src/field/field_specials.c b/src/field/field_specials.c index e56d9ddbb..81514c221 100644 --- a/src/field/field_specials.c +++ b/src/field/field_specials.c @@ -4,7 +4,7 @@ #include "fieldmap.h" #include "event_data.h" #include "battle_tower.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "region_map.h" #include "field_region_map.h" #include "field_message_box.h" diff --git a/src/field/field_weather.c b/src/field/field_weather.c index b6475d8ff..3053c58cb 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -1,6 +1,6 @@ #include "global.h" #include "blend_palette.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_weather.h" #include "palette.h" #include "random.h" diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c index 7406363a5..b7b5d85c7 100644 --- a/src/field/field_weather_effects.c +++ b/src/field/field_weather_effects.c @@ -1,5 +1,5 @@ #include "global.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_weather.h" #include "overworld.h" #include "random.h" diff --git a/src/field/fldeff_berrytree.c b/src/field/fldeff_berrytree.c index 0763c0314..43e29d7f0 100644 --- a/src/field/fldeff_berrytree.c +++ b/src/field/fldeff_berrytree.c @@ -1,5 +1,5 @@ #include "global.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "script.h" diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c index 513107729..32ed3c6a4 100644 --- a/src/field/fldeff_cut.c +++ b/src/field/fldeff_cut.c @@ -2,7 +2,7 @@ #include "fldeff_cut.h" #include "field_camera.h" #include "field_effect.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "map_obj_lock.h" diff --git a/src/field/fldeff_decoration.c b/src/field/fldeff_decoration.c index 37f024b9f..d6c5e6e8b 100644 --- a/src/field/fldeff_decoration.c +++ b/src/field/fldeff_decoration.c @@ -2,7 +2,7 @@ #include "event_data.h" #include "field_camera.h" #include "field_effect.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "script.h" diff --git a/src/field/fldeff_recordmixing.c b/src/field/fldeff_recordmixing.c index ec72885b5..8d5e7229d 100644 --- a/src/field/fldeff_recordmixing.c +++ b/src/field/fldeff_recordmixing.c @@ -1,5 +1,5 @@ #include "global.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "fldeff_recordmixing.h" #include "sprite.h" diff --git a/src/field/item_menu.c b/src/field/item_menu.c index 6bad9f4d6..28b360e78 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -4,7 +4,7 @@ #include "data2.h" #include "decompress.h" #include "field_effect.h" -#include "field_map_obj_helpers.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "graphics.h" #include "item.h" diff --git a/src/field/item_use.c b/src/field/item_use.c index cdad3f840..a5b091f0a 100644 --- a/src/field/item_use.c +++ b/src/field/item_use.c @@ -8,7 +8,6 @@ #include "event_data.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "field_map_obj_helpers.h" #include "field_player_avatar.h" #include "field_weather.h" #include "fieldmap.h" diff --git a/src/field/map_obj_lock.c b/src/field/map_obj_lock.c index 954fcb446..ceda005c3 100644 --- a/src/field/map_obj_lock.c +++ b/src/field/map_obj_lock.c @@ -1,7 +1,6 @@ #include "global.h" #include "map_obj_lock.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "script_movement.h" #include "task.h" diff --git a/src/field/overworld.c b/src/field/overworld.c index a6d34e103..cff67d02e 100644 --- a/src/field/overworld.c +++ b/src/field/overworld.c @@ -9,9 +9,7 @@ #include "field_control_avatar.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "field_ground_effect.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" +#include "evobjmv.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" diff --git a/src/field/rotating_gate.c b/src/field/rotating_gate.c index 00008c69c..4804ffb0e 100644 --- a/src/field/rotating_gate.c +++ b/src/field/rotating_gate.c @@ -1,7 +1,7 @@ #include "global.h" #include "bike.h" #include "event_data.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "fieldmap.h" #include "constants/maps.h" #include "constants/songs.h" diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 36edbe472..fd5620a76 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -12,8 +12,7 @@ #include "field_door.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" +#include "evobjmv.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" diff --git a/src/field/script_movement.c b/src/field/script_movement.c index c7ce55171..b509ee23c 100644 --- a/src/field/script_movement.c +++ b/src/field/script_movement.c @@ -1,7 +1,6 @@ #include "global.h" #include "script_movement.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" +#include "evobjmv.h" #include "task.h" #include "util.h" diff --git a/src/field/shop.c b/src/field/shop.c index a228ff92f..65be76b81 100644 --- a/src/field/shop.c +++ b/src/field/shop.c @@ -16,7 +16,7 @@ #include "task.h" #include "tv.h" #include "scanline_effect.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "item.h" diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 89cd404e9..43b0c29c2 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -1,7 +1,6 @@ #include "global.h" #include "start_menu.h" #include "event_data.h" -#include "field_map_obj_helpers.h" #include "field_player_avatar.h" #include "field_weather.h" #include "fieldmap.h" diff --git a/src/field/trainer_see.c b/src/field/trainer_see.c index 3034b2b65..2ff1bd372 100644 --- a/src/field/trainer_see.c +++ b/src/field/trainer_see.c @@ -2,7 +2,7 @@ #include "trainer_see.h" #include "battle_setup.h" #include "field_effect.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "script.h" #include "sprite.h" diff --git a/src/field/tv.c b/src/field/tv.c index efda4b925..79c4716cb 100644 --- a/src/field/tv.c +++ b/src/field/tv.c @@ -21,7 +21,7 @@ #include "battle.h" #include "link.h" #include "constants/easy_chat.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_specials.h" #include "item.h" #include "constants/items.h" diff --git a/src/rom6.c b/src/rom6.c index 62fbc987c..f1cd87164 100644 --- a/src/rom6.c +++ b/src/rom6.c @@ -2,7 +2,7 @@ #include "rom6.h" #include "braille_puzzles.h" #include "field_effect.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "field_player_avatar.h" #include "item_use.h" #include "pokemon_menu.h" diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index d8e099130..2e596883f 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -13,7 +13,7 @@ #include "constants/songs.h" #include "decompress.h" #include "field_weather.h" -#include "field_map_obj.h" +#include "evobjmv.h" #include "scanline_effect.h" #include "event_data.h" #include "cable_car_util.h" -- cgit v1.2.3 From 4c1e0b8b303320a173203b8ab94c2a695555ace3 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 25 Jan 2018 00:07:15 -0600 Subject: integrate debug functions in mail.c and decompile some debug code --- src/engine/sprite.c | 2 +- src/pokemon/mail.c | 1712 +++++++++++---------------------------------------- 2 files changed, 344 insertions(+), 1370 deletions(-) (limited to 'src') diff --git a/src/engine/sprite.c b/src/engine/sprite.c index df8c66750..a9d84e01a 100644 --- a/src/engine/sprite.c +++ b/src/engine/sprite.c @@ -815,7 +815,7 @@ void ProcessSpriteCopyRequests(void) } } -/*static*/ void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) +static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) { if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) { diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index 11851410b..16252af64 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -1,7 +1,10 @@ #include "global.h" #include "mail.h" +#include "data2.h" #include "easy_chat.h" #include "constants/items.h" +#include "constants/species.h" +#include "field_fadetransition.h" #include "graphics.h" #include "mail_data.h" #include "menu.h" @@ -10,6 +13,7 @@ #include "palette.h" #include "pokemon_icon.h" #include "overworld.h" +#include "script.h" #include "sprite.h" #include "string_util.h" #include "strings2.h" @@ -18,6 +22,8 @@ #include "scanline_effect.h" #include "ewram.h" +extern u8 (*gMenuCallback)(void); + struct UnkMailStruct { u8 unk_0_0:2; @@ -287,31 +293,6 @@ const u8 Str_8411608[] = _("メールをけす"); // Delete Mail // XXX: what is this? static u8 *const sSharedMemPtr = gSharedMem; -#if DEBUG - -const u8 Str_841160F[] = _("{STR_VAR_1} {STR_VAR_2}"); -const u8 Str_841161A[] = _("メール{STR_VAR_1} {STR_VAR_2}"); -const u8 Str_8411623[] = _("メール{STR_VAR_1}を だれに もたせる?"); -const u8 Str_8411634[] = _("000 {STR_VAR_1}"); -const u8 Str_841163B[] = _("せいきの データが とうろくずみ です\n" - "しんき とうろく できません"); -const u8 Str_841165E[] = _("せいきに とうろくされたメールデータは\n" - "へんこう できません"); -const u8 Str_841167D[] = _("メール{STR_VAR_1} とうろく かいじょ"); -const u8 Str_841168D[] = _("デバッグメニューから とうろくした\n" - "メール いがいは けせません"); -const u8 Str_84116AE[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); - -const struct MenuAction _84116BC[] = -{ - {Str_84115F4, NULL}, - {Str_84115FB, NULL}, - {Str_8411603, NULL}, - {Str_8411608, NULL}, -}; - -#endif - static u8 sub_80F8A28(void); /*static*/ void sub_80F8D50(void); static void sub_80F8DA0(void); @@ -322,226 +303,44 @@ static void sub_80F8F58(void); static void sub_80F8F78(void); static void sub_80F8FB4(void); +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + #if DEBUG -// some debug variable, I guess. -// TODO: where exactly is this located? -__attribute__((section(".bss"))) /*static*/ u8 gUnknown_0300074C = 0; +static u8 gUnknown_Debug_0300079C; #endif -#if DEBUG -__attribute__((naked)) -void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r0, #0\n" - " add r6, r1, #0\n" - " lsl r2, r2, #0x18\n" - " lsr r5, r2, #0x18\n" - " ldr r0, .__3\n" - " ldrb r3, [r0]\n" - " cmp r3, #0\n" - " beq .__1 @cond_branch\n" - " ldr r2, .__3 + 4\n" - " add r1, r2, #0\n" - " add r1, r1, #0xff\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " ldr r0, .__3 + 8\n" - " ldrh r1, [r0]\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x1\n" - " add r0, r2, r3\n" - " strb r1, [r0]\n" - " mov r0, #0x82\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, .__3 + 12\n" - " str r0, [r1]\n" - " add r3, r3, #0x8\n" - " add r1, r2, r3\n" - " ldr r0, .__3 + 16\n" - " str r0, [r1]\n" - " ldr r0, .__3 + 20\n" - " ldrh r1, [r0]\n" - " b .__2\n" - ".__4:\n" - " .align 2, 0\n" - ".__3:\n" - " .word gUnknown_0300074C\n" - " .word +0x2000000\n" - " .word gSpecialVar_0x8004\n" - " .word EasyChat_GetWordText+1\n" - " .word ConvertEasyChatWordsToString+1\n" - " .word gSpecialVar_0x8006\n" - ".__1:\n" - " ldr r2, .__7\n" - " add r1, r2, #0\n" - " add r1, r1, #0xff\n" - " mov r0, #0x5\n" - " strb r0, [r1]\n" - " add r0, r0, #0xfb\n" - " add r1, r2, r0\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x82\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, .__7 + 4\n" - " str r0, [r1]\n" - " mov r0, #0x84\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, r0\n" - " ldr r0, .__7 + 8\n" - " str r0, [r1]\n" - " ldrh r1, [r4, #0x20]\n" - " add r0, r1, #0\n" - " sub r0, r0, #0x79\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0xb\n" - " bhi .__5 @cond_branch\n" - " sub r1, r1, #0x79\n" - ".__2:\n" - " add r0, r2, #0\n" - " add r0, r0, #0xfa\n" - " strb r1, [r0]\n" - " b .__6\n" - ".__8:\n" - " .align 2, 0\n" - ".__7:\n" - " .word +0x2000000\n" - " .word EasyChat_GetWordText+1\n" - " .word ConvertEasyChatWordsToString+1\n" - ".__5:\n" - " add r0, r2, #0\n" - " add r0, r0, #0xfa\n" - " strb r3, [r0]\n" - " mov r5, #0x0\n" - ".__6:\n" - " ldr r1, .__12\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r0, r1, r2\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq .__9 @cond_branch\n" - " cmp r0, #0x1\n" - " beq .__10 @cond_branch\n" - ".__9:\n" - " mov r3, #0x86\n" - " lsl r3, r3, #0x1\n" - " add r2, r1, r3\n" - " add r0, r1, #0\n" - " add r0, r0, #0xfa\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r1, .__12 + 4\n" - " b .__11\n" - ".__13:\n" - " .align 2, 0\n" - ".__12:\n" - " .word +0x2000000\n" - " .word gUnknown_083E5730\n" - ".__10:\n" - " mov r0, #0x86\n" - " lsl r0, r0, #0x1\n" - " add r2, r1, r0\n" - " add r0, r1, #0\n" - " add r0, r0, #0xfa\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " ldr r1, .__18\n" - ".__11:\n" - " add r0, r0, r1\n" - " str r0, [r2]\n" - " ldrh r0, [r4, #0x1e]\n" - " mov r1, sp\n" - " bl MailSpeciesToSpecies\n" - " lsl r0, r0, #0x10\n" - " ldr r1, .__18 + 4\n" - " add r0, r0, r1\n" - " mov r1, #0xcd\n" - " lsl r1, r1, #0x11\n" - " cmp r0, r1\n" - " bhi .__14 @cond_branch\n" - " ldr r0, .__18 + 8\n" - " add r1, r0, #0\n" - " add r1, r1, #0xfa\n" - " ldrb r2, [r1]\n" - " add r1, r0, #0\n" - " cmp r2, #0x6\n" - " beq .__15 @cond_branch\n" - " cmp r2, #0x9\n" - " beq .__16 @cond_branch\n" - " b .__17\n" - ".__19:\n" - " .align 2, 0\n" - ".__18:\n" - " .word gUnknown_083E57A4\n" - " .word 0xffff0000\n" - " .word +0x2000000\n" - ".__15:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x1\n" - " b .__21\n" - ".__16:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x2\n" - " b .__21\n" - ".__14:\n" - " ldr r1, .__22\n" - ".__17:\n" - " add r2, r1, #0\n" - " add r2, r2, #0xfb\n" - " mov r0, #0x0\n" - ".__21:\n" - " strb r0, [r2]\n" - " add r0, r1, #0\n" - " add r0, r0, #0xf4\n" - " str r4, [r0]\n" - " sub r0, r0, #0x8\n" - " str r6, [r0]\n" - " add r0, r0, #0xc\n" - " strb r5, [r0]\n" - " ldr r0, .__22 + 4\n" - " bl SetMainCallback2\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - ".__23:\n" - " .align 2, 0\n" - ".__22:\n" - " .word +0x2000000\n" - " .word sub_80F8D50+1\n" - "\n" - ); -} -#else void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) { - u16 mailDesign; u16 buffer[2]; + u16 species; - ewram0_4.varFF = GAME_LANGUAGE; - ewram0_4.var100 = 1; - ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; - ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; - - mailDesign = arg0->itemId - ITEM_ORANGE_MAIL; - - if (mailDesign <= 11) +#if DEBUG + if (gUnknown_Debug_0300079C != 0) { - ewram0_4.varFA = arg0->itemId - ITEM_ORANGE_MAIL; + ewram0_4.varFF = GAME_LANGUAGE; + ewram0_4.var100 = gSpecialVar_0x8004; + ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; + ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; + ewram0_4.varFA = gSpecialVar_0x8006; } else +#endif { - ewram0_4.varFA = 0; - arg2 = FALSE; + ewram0_4.varFF = GAME_LANGUAGE; + ewram0_4.var100 = 1; + ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; + ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; + if (IS_ITEM_MAIL(arg0->itemId)) + { + ewram0_4.varFA = arg0->itemId - 0x79; + } + else + { + ewram0_4.varFA = 0; + arg2 = FALSE; + } } switch (ewram0_4.var100) @@ -550,24 +349,22 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) default: ewram0_4.var10C = &gUnknown_083E5730[ewram0_4.varFA]; break; - case 1: ewram0_4.var10C = &gUnknown_083E57A4[ewram0_4.varFA]; break; } - if (((MailSpeciesToSpecies(arg0->species, buffer) << 16) + 0xFFFF0000) <= (410 << 16)) + species = MailSpeciesToSpecies(arg0->species, buffer); + if (species >= 1 && species <= 411) { switch (ewram0_4.varFA) { case 6: ewram0_4.varFB = 1; break; - case 9: ewram0_4.varFB = 2; break; - default: ewram0_4.varFB = 0; break; @@ -578,14 +375,12 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) ewram0_4.varFB = 0; } - ewram0_4.varF4 = arg0; ewram0_4.varEC = arg1; ewram0_4.varF8 = arg2; SetMainCallback2(sub_80F8D50); } -#endif #define RETURN_UP_STATE break #define RETURN_SKIP_STATE return FALSE @@ -849,1180 +644,359 @@ static void sub_80F8F78(void) } } +static void sub_80F8FB4(void) +{ + if (!UpdatePaletteFade()) + { + SetMainCallback2(ewram0_4.varEC); + switch (ewram0_4.varFB) + { + case 2: + case 1: + sub_809D608(sub_809D4A8(ewram0_4.varF4->species)); + sub_809D510(&gSprites[ewram0_4.varFC]); + break; + } +#if !DEBUG + memset(&ewram0_4, 0, 0x110); +#endif + ResetPaletteFade(); + } +} + #if DEBUG -__attribute__((naked)) -void sub_80F8FB4() + +void debug_sub_810CA7C(u8); +void debug_sub_810CE1C(u8); +void debug_sub_810D388(void); +void debug_sub_810D340(void); + +void debug_sub_810C910(u8 taskId) { - asm( - " push {r4, lr}\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._135 @cond_branch\n" - " ldr r4, ._138\n" - " add r0, r4, #0\n" - " add r0, r0, #0xec\n" - " ldr r0, [r0]\n" - " bl SetMainCallback2\n" - " add r0, r4, #0\n" - " add r0, r0, #0xfb\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x2\n" - " bgt ._137 @cond_branch\n" - " cmp r0, #0x1\n" - " blt ._137 @cond_branch\n" - " add r0, r4, #0\n" - " add r0, r0, #0xf4\n" - " ldr r0, [r0]\n" - " ldrh r0, [r0, #0x1e]\n" - " bl sub_809D4A8\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " bl sub_809D608\n" - " add r0, r4, #0\n" - " add r0, r0, #0xfc\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._138 + 4\n" - " add r0, r0, r1\n" - " bl sub_809D510\n" - "._137:\n" - " bl ResetPaletteFade\n" - "._135:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._139:\n" - " .align 2, 0\n" - "._138:\n" - " .word +0x2000000\n" - " .word gSprites\n" - "\n" - ); + if (!gPaletteFade.active) + { + gUnknown_Debug_0300079C = 1; + Menu_EraseScreen(); + DestroyTask(taskId); + if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId == 0) + HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 0); + else + HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 1); + } } -#else -static void sub_80F8FB4(void) + +void debug_sub_810C990(u8 taskId) { - u16 local1; + if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN)) + { + gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 11) % 12; + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + } + else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT)) + { + gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 1) % 12; + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + } + else if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = debug_sub_810C910; + } + else if (gMain.newKeys & B_BUTTON) + { + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411540, 4, 15); + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + gTasks[taskId].func = debug_sub_810CA7C; + } +} - if (UpdatePaletteFade()) +void debug_sub_810CA7C(u8 taskId) +{ + if (gMain.newKeys & 0xF0) { - return; + gSpecialVar_0x8004 ^= 1; + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + } + else if (gMain.newKeys & A_BUTTON) + { + if (gMain.watchedKeysPressed) + { + gMain.watchedKeysPressed = FALSE; + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411540, 4, 15); + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + } + else + { + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411568, 4, 15); + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + gTasks[taskId].func = debug_sub_810C990; + } } +} + +void debug_sub_810CB50(u8 taskId) +{ + u8 sp0[] = _("{STR_VAR_1} {STR_VAR_2}"); + u8 sp8[] = _("メール{STR_VAR_1} {STR_VAR_2}"); + bool8 r2 = FALSE; - SetMainCallback2(ewram0_4.varEC); - switch (ewram0_4.varFB) + if (gMain.newKeys & A_BUTTON) { - case 2: - case 1: - local1 = sub_809D4A8(ewram0_4.varF4->species); - sub_809D608(local1); + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 2, 1); + StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]); + gSaveBlock1.mail[gSpecialVar_0x8005].species = gTasks[taskId].data[0]; + StringExpandPlaceholders(gStringVar4, sp8); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + DestroyTask(taskId); + CreateTask(debug_sub_810CE1C, 0); + debug_sub_810D340(); + return; + } + else if (gMain.newKeys & B_BUTTON) + { + DestroyTask(taskId); + Menu_EraseScreen(); + CreateTask(debug_sub_810CE1C, 0); + debug_sub_810D340(); + return; + } + else if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN)) + { + gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 0x19B) % 0x19C; + r2 = TRUE; + } + else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT)) + { + gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 1) % 0x19C; + r2 = TRUE; + } - sub_809D510(&gSprites[ewram0_4.varFC]); - break; + if (r2) + { + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[0], 2, 3); + StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]); + StringExpandPlaceholders(gStringVar4, sp0); + Menu_DrawStdWindowFrame(0, 0, 12, 3); + Menu_PrintText(gStringVar4, 1, 1); } +} + +void debug_sub_810CCEC(u8 taskId) +{ + u8 string1[] = _("メール{STR_VAR_1}を だれに もたせる?"); + u8 string2[] = _("000 {STR_VAR_1}"); + + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1); + StringExpandPlaceholders(gStringVar4, string1); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + + StringCopy(gStringVar1, gSpeciesNames[0]); + StringExpandPlaceholders(gStringVar4, string2); + Menu_DrawStdWindowFrame(0, 0, 12, 3); + Menu_PrintText(string2, 1, 1); // This probably should have been gStringVar4 - memset(&ewram0_4, 0, 0x110); - ResetPaletteFade(); + gTasks[taskId].func = debug_sub_810CB50; } -#endif -#if DEBUG -__attribute__((naked)) -void debug_sub_810C910() +u8 debug_sub_810CD9C(void) { - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r0, ._143\n" - " ldrb r1, [r0, #0x7]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._142 @cond_branch\n" - " ldr r1, ._143 + 4\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " bl Menu_EraseScreen\n" - " add r0, r4, #0\n" - " bl DestroyTask\n" - " ldr r2, ._143 + 8\n" - " ldr r0, ._143 + 12\n" - " ldrh r1, [r0]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r1, r0, #0x2\n" - " add r0, r1, r2\n" - " ldr r3, ._143 + 16\n" - " add r0, r0, r3\n" - " ldrh r0, [r0]\n" - " cmp r0, #0\n" - " bne ._141 @cond_branch\n" - " sub r3, r3, #0x20\n" - " add r0, r2, r3\n" - " add r0, r1, r0\n" - " ldr r1, ._143 + 20\n" - " mov r2, #0x0\n" - " bl HandleReadMail\n" - " b ._142\n" - "._144:\n" - " .align 2, 0\n" - "._143:\n" - " .word gPaletteFade\n" - " .word gUnknown_0300074C\n" - " .word gSaveBlock1\n" - " .word gSpecialVar_0x8005\n" - " .word 0x2b6c\n" - " .word debug_sub_810D388+1\n" - "._141:\n" - " ldr r3, ._145\n" - " add r0, r2, r3\n" - " add r0, r1, r0\n" - " ldr r1, ._145 + 4\n" - " mov r2, #0x1\n" - " bl HandleReadMail\n" - "._142:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._146:\n" - " .align 2, 0\n" - "._145:\n" - " .word 0x2b4c\n" - " .word debug_sub_810D388+1\n" - "\n" - ); + CloseMenu(); + ScriptContext1_Stop(); + ScriptContext2_Enable(); + gUnknown_Debug_0300079C = 0; + gSpecialVar_0x8004 = gSpecialVar_0x8005 = gSpecialVar_0x8006 = 0; + SetMainCallback2(debug_sub_810D388); + return 1; } -__attribute__((naked)) -void debug_sub_810C990() +void debug_sub_810CDE0(void) { - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " add r5, r4, #0\n" - " ldr r0, ._149\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0xa0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._147 @cond_branch\n" - " ldr r4, ._149 + 4\n" - " ldrh r0, [r4]\n" - " add r0, r0, #0xb\n" - " b ._148\n" - "._150:\n" - " .align 2, 0\n" - "._149:\n" - " .word gMain\n" - " .word gSpecialVar_0x8006\n" - "._147:\n" - " mov r2, #0x50\n" - " and r2, r2, r1\n" - " cmp r2, #0\n" - " beq ._151 @cond_branch\n" - " ldr r4, ._153\n" - " ldrh r0, [r4]\n" - " add r0, r0, #0x1\n" - "._148:\n" - " mov r1, #0xc\n" - " bl __modsi3\n" - " strh r0, [r4]\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0xa\n" - " mov r3, #0x4\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r1, ._153 + 4\n" - " ldrh r0, [r4]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0x2\n" - " mov r2, #0x2\n" - " bl Menu_PrintText\n" - " b ._159\n" - "._154:\n" - " .align 2, 0\n" - "._153:\n" - " .word gSpecialVar_0x8006\n" - " .word _84115C4\n" - "._151:\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._155 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " str r2, [sp]\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._157\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._157 + 4\n" - " b ._156\n" - "._158:\n" - " .align 2, 0\n" - "._157:\n" - " .word gTasks\n" - " .word debug_sub_810C910+1\n" - "._155:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._159 @cond_branch\n" - " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._160\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " ldr r1, ._160 + 4\n" - " ldr r0, ._160 + 8\n" - " ldrh r0, [r0]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0x2\n" - " mov r2, #0x2\n" - " bl Menu_PrintText\n" - " ldr r1, ._160 + 12\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._160 + 16\n" - "._156:\n" - " str r1, [r0]\n" - "._159:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._161:\n" - " .align 2, 0\n" - "._160:\n" - " .word Str_8411540\n" - " .word _8411560\n" - " .word gSpecialVar_0x8004\n" - " .word gTasks\n" - " .word debug_sub_810CA7C+1\n" - "\n" - ); + UpdatePaletteFade(); + RunTasks(); } -__attribute__((naked)) -void debug_sub_810CA7C() +void debug_sub_810CDF0(void) { - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r3, ._164\n" - " ldrh r1, [r3, #0x2e]\n" - " mov r2, #0xf0\n" - " and r2, r2, r1\n" - " cmp r2, #0\n" - " beq ._162 @cond_branch\n" - " ldr r2, ._164 + 4\n" - " ldrh r0, [r2]\n" - " mov r1, #0x1\n" - " eor r0, r0, r1\n" - " strh r0, [r2]\n" - " ldr r1, ._164 + 8\n" - " ldrh r0, [r2]\n" - " b ._163\n" - "._165:\n" - " .align 2, 0\n" - "._164:\n" - " .word gMain\n" - " .word gSpecialVar_0x8004\n" - " .word _8411560\n" - "._162:\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._168 @cond_branch\n" - " ldrh r0, [r3, #0x34]\n" - " cmp r0, #0\n" - " beq ._167 @cond_branch\n" - " strh r2, [r3, #0x34]\n" - " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._169\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0xa\n" - " mov r3, #0x4\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r1, ._169 + 4\n" - " ldr r0, ._169 + 8\n" - " ldrh r0, [r0]\n" - "._163:\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0x2\n" - " mov r2, #0x2\n" - " bl Menu_PrintText\n" - " b ._168\n" - "._170:\n" - " .align 2, 0\n" - "._169:\n" - " .word Str_8411540\n" - " .word _8411560\n" - " .word gSpecialVar_0x8004\n" - "._167:\n" - " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._171\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " mov r2, #0xa\n" - " mov r3, #0x4\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r1, ._171 + 4\n" - " ldr r0, ._171 + 8\n" - " ldrh r0, [r0]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0x2\n" - " mov r2, #0x2\n" - " bl Menu_PrintText\n" - " ldr r1, ._171 + 12\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._171 + 16\n" - " str r1, [r0]\n" - "._168:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._172:\n" - " .align 2, 0\n" - "._171:\n" - " .word Str_8411568\n" - " .word _84115C4\n" - " .word gSpecialVar_0x8006\n" - " .word gTasks\n" - " .word debug_sub_810C990+1\n" - "\n" - ); + gMain.watchedKeysPressed = 0; + gMain.watchedKeysMask = 0; + gFieldCallback = mapldr_default; + SetMainCallback2(c2_exit_to_overworld_2_switch); } -__attribute__((naked)) -void debug_sub_810CB50() +void debug_sub_810CE1C(u8 taskId) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xffffffec\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " ldr r1, ._175\n" - " mov r0, sp\n" - " mov r2, #0x6\n" - " bl memcpy\n" - " add r7, sp, #0x8\n" - " ldr r1, ._175 + 4\n" - " add r0, r7, #0\n" - " mov r2, #0x9\n" - " bl memcpy\n" - " mov r2, #0x0\n" - " ldr r0, ._175 + 8\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._173 @cond_branch\n" - " ldr r0, ._175 + 12\n" - " ldr r5, ._175 + 16\n" - " ldrh r1, [r5]\n" - " mov r2, #0x2\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " ldr r0, ._175 + 20\n" - " ldr r1, ._175 + 24\n" - " lsl r4, r6, #0x2\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r1\n" - " mov r1, #0x8\n" - " ldsh r2, [r4, r1]\n" - " mov r1, #0xb\n" - " mul r1, r1, r2\n" - " ldr r2, ._175 + 28\n" - " add r1, r1, r2\n" - " bl StringCopy\n" - " ldr r2, ._175 + 32\n" - " ldrh r1, [r5]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r2\n" - " ldrh r1, [r4, #0x8]\n" - " ldr r2, ._175 + 36\n" - " add r0, r0, r2\n" - " strh r1, [r0]\n" - " ldr r4, ._175 + 40\n" - " add r0, r4, #0\n" - " add r1, r7, #0\n" - " bl StringExpandPlaceholders\n" - " bl Menu_DisplayDialogueFrame\n" - " add r0, r4, #0\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " add r0, r6, #0\n" - " bl DestroyTask\n" - " b ._174\n" - "._176:\n" - " .align 2, 0\n" - "._175:\n" - " .word Str_841160F\n" - " .word Str_841161A\n" - " .word gMain\n" - " .word gStringVar1\n" - " .word gSpecialVar_0x8005\n" - " .word gStringVar2\n" - " .word gTasks\n" - " .word gSpeciesNames\n" - " .word gSaveBlock1\n" - " .word 0x2b6a\n" - " .word gStringVar4\n" - "._173:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._177 @cond_branch\n" - " add r0, r6, #0\n" - " bl DestroyTask\n" - " bl Menu_EraseScreen\n" - "._174:\n" - " ldr r0, ._179\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " bl debug_sub_810D340\n" - " b ._186\n" - "._180:\n" - " .align 2, 0\n" - "._179:\n" - " .word debug_sub_810CE1C+1\n" - "._177:\n" - " mov r0, #0xa0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._181 @cond_branch\n" - " ldr r0, ._183\n" - " lsl r4, r6, #0x2\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " mov r1, #0x8\n" - " ldsh r0, [r4, r1]\n" - " ldr r2, ._183 + 4\n" - " add r0, r0, r2\n" - " mov r1, #0xce\n" - " lsl r1, r1, #0x1\n" - " bl __modsi3\n" - " strh r0, [r4, #0x8]\n" - " b ._182\n" - "._184:\n" - " .align 2, 0\n" - "._183:\n" - " .word gTasks\n" - " .word 0x19b\n" - "._181:\n" - " mov r0, #0x50\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._185 @cond_branch\n" - " ldr r0, ._187\n" - " lsl r4, r6, #0x2\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " mov r1, #0x8\n" - " ldsh r0, [r4, r1]\n" - " add r0, r0, #0x1\n" - " mov r1, #0xce\n" - " lsl r1, r1, #0x1\n" - " bl __modsi3\n" - " strh r0, [r4, #0x8]\n" - " mov r2, #0x1\n" - "._185:\n" - " cmp r2, #0\n" - " beq ._186 @cond_branch\n" - "._182:\n" - " ldr r0, ._187 + 4\n" - " ldr r1, ._187\n" - " lsl r4, r6, #0x2\n" - " add r4, r4, r6\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r1\n" - " mov r2, #0x8\n" - " ldsh r1, [r4, r2]\n" - " mov r2, #0x2\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " ldr r0, ._187 + 8\n" - " mov r1, #0x8\n" - " ldsh r2, [r4, r1]\n" - " mov r1, #0xb\n" - " mul r1, r1, r2\n" - " ldr r2, ._187 + 12\n" - " add r1, r1, r2\n" - " bl StringCopy\n" - " ldr r4, ._187 + 16\n" - " add r0, r4, #0\n" - " mov r1, sp\n" - " bl StringExpandPlaceholders\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xc\n" - " mov r3, #0x3\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, r4, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - "._186:\n" - " add sp, sp, #0x14\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._188:\n" - " .align 2, 0\n" - "._187:\n" - " .word gTasks\n" - " .word gStringVar1\n" - " .word gStringVar2\n" - " .word gSpeciesNames\n" - " .word gStringVar4\n" - "\n" - ); + if (gMenuCallback() == TRUE) + { + CloseMenu(); + DestroyTask(taskId); + } } -__attribute__((naked)) -void debug_sub_810CCEC() +u8 debug_sub_810CE48(void) { - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add sp, sp, #0xffffffe4\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " ldr r1, ._189\n" - " mov r0, sp\n" - " mov r2, #0x11\n" - " bl memcpy\n" - " add r6, sp, #0x14\n" - " ldr r1, ._189 + 4\n" - " add r0, r6, #0\n" - " mov r2, #0x7\n" - " bl memcpy\n" - " ldr r0, ._189 + 8\n" - " mov r8, r0\n" - " ldr r0, ._189 + 12\n" - " ldrh r1, [r0]\n" - " mov r0, r8\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " ldr r4, ._189 + 16\n" - " add r0, r4, #0\n" - " mov r1, sp\n" - " bl StringExpandPlaceholders\n" - " bl Menu_DisplayDialogueFrame\n" - " add r0, r4, #0\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " ldr r1, ._189 + 20\n" - " mov r0, r8\n" - " bl StringCopy\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " bl StringExpandPlaceholders\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xc\n" - " mov r3, #0x3\n" - " bl Menu_DrawStdWindowFrame\n" - " add r0, r6, #0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r1, ._189 + 24\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r1, ._189 + 28\n" - " str r1, [r0]\n" - " add sp, sp, #0x1c\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._190:\n" - " .align 2, 0\n" - "._189:\n" - " .word Str_8411623\n" - " .word Str_8411634\n" - " .word gStringVar1\n" - " .word gSpecialVar_0x8005\n" - " .word gStringVar4\n" - " .word gSpeciesNames\n" - " .word gTasks\n" - " .word debug_sub_810CB50+1\n" - "\n" - ); -} + s8 input = Menu_ProcessInput(); -__attribute__((naked)) -void debug_sub_810CD9C() -{ - asm( - " push {lr}\n" - " bl CloseMenu\n" - " bl ScriptContext1_Stop\n" - " bl ScriptContext2_Enable\n" - " ldr r1, ._191\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " ldr r3, ._191 + 4\n" - " ldr r2, ._191 + 8\n" - " ldr r1, ._191 + 12\n" - " mov r0, #0x0\n" - " strh r0, [r1]\n" - " strh r0, [r2]\n" - " strh r0, [r3]\n" - " ldr r0, ._191 + 16\n" - " bl SetMainCallback2\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._192:\n" - " .align 2, 0\n" - "._191:\n" - " .word gUnknown_0300074C\n" - " .word gSpecialVar_0x8004\n" - " .word gSpecialVar_0x8005\n" - " .word gSpecialVar_0x8006\n" - " .word debug_sub_810D388+1\n" - "\n" - ); + switch (input) + { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + gSpecialVar_0x8006 %= 12; + CreateTask(debug_sub_810CA7C, 0); + gMain.watchedKeysPressed = TRUE; // huh? + gMain.watchedKeysMask = 0; + return 1; + } } -__attribute__((naked)) -void debug_sub_810CDE0() +u8 debug_sub_810CEA4(void) { - asm( - " push {lr}\n" - " bl UpdatePaletteFade\n" - " bl RunTasks\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + if (!gPaletteFade.active) + { + gSpecialVar_0x8004 = 4; + sub_80E60D8(); + return 1; + } + return 0; } -__attribute__((naked)) -void debug_sub_810CDF0() +u8 debug_sub_810CED0(void) { - asm( - " push {lr}\n" - " ldr r1, ._193\n" - " mov r0, #0x0\n" - " strh r0, [r1, #0x34]\n" - " strh r0, [r1, #0x36]\n" - " ldr r1, ._193 + 4\n" - " ldr r0, ._193 + 8\n" - " str r0, [r1]\n" - " ldr r0, ._193 + 12\n" - " bl SetMainCallback2\n" - " pop {r0}\n" - " bx r0\n" - "._194:\n" - " .align 2, 0\n" - "._193:\n" - " .word gMain\n" - " .word gFieldCallback\n" - " .word mapldr_default+1\n" - " .word c2_exit_to_overworld_2_switch+1\n" - "\n" - ); -} + u8 text[] = _("せいきの データが とうろくずみ です\n" + "しんき とうろく できません"); + s8 input = Menu_ProcessInput(); -__attribute__((naked)) -void debug_sub_810CE1C() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r0, ._196\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._195 @cond_branch\n" - " bl CloseMenu\n" - " add r0, r4, #0\n" - " bl DestroyTask\n" - "._195:\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._197:\n" - " .align 2, 0\n" - "._196:\n" - " .word gMenuCallback\n" - "\n" - ); + switch (input) + { + case -1: + Menu_EraseScreen(); + break; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId)) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text, 4, 15); + } + else + { + gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0xFFFF; + StringCopy(gSaveBlock1.mail[gSpecialVar_0x8005].playerName, gSaveBlock2.playerName); + *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = *(u32 *)gSaveBlock2.playerTrainerId; + gMenuCallback = debug_sub_810CEA4; + return 0; + } + break; + } + debug_sub_810D340(); + return 0; } -__attribute__((naked)) -void debug_sub_810CE48() +u8 debug_sub_810CFA4(void) { - asm( - " push {r4, lr}\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._198 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " bne ._199 @cond_branch\n" - " bl Menu_EraseScreen\n" - " bl debug_sub_810D340\n" - "._198:\n" - " mov r0, #0x0\n" - " b ._200\n" - "._199:\n" - " ldr r0, ._201\n" - " strh r1, [r0]\n" - " ldr r4, ._201 + 4\n" - " ldrh r0, [r4]\n" - " mov r1, #0xc\n" - " bl __umodsi3\n" - " strh r0, [r4]\n" - " ldr r0, ._201 + 8\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " ldr r1, ._201 + 12\n" - " mov r2, #0x0\n" - " mov r0, #0x1\n" - " strh r0, [r1, #0x34]\n" - " strh r2, [r1, #0x36]\n" - "._200:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._202:\n" - " .align 2, 0\n" - "._201:\n" - " .word gSpecialVar_0x8005\n" - " .word gSpecialVar_0x8006\n" - " .word debug_sub_810CA7C+1\n" - " .word gMain\n" - "\n" - ); -} + u8 text[] = _("せいきに とうろくされたメールデータは\n" + "へんこう できません"); + s8 input = Menu_ProcessInput(); -__attribute__((naked)) -void debug_sub_810CEA4() -{ - asm( - " push {lr}\n" - " ldr r0, ._205\n" - " ldrb r1, [r0, #0x7]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._203 @cond_branch\n" - " mov r0, #0x0\n" - " b ._204\n" - "._206:\n" - " .align 2, 0\n" - "._205:\n" - " .word gPaletteFade\n" - "._203:\n" - " ldr r1, ._207\n" - " mov r0, #0x4\n" - " strh r0, [r1]\n" - " bl sub_80E60D8\n" - " mov r0, #0x1\n" - "._204:\n" - " pop {r1}\n" - " bx r1\n" - "._208:\n" - " .align 2, 0\n" - "._207:\n" - " .word gSpecialVar_0x8004\n" - "\n" - ); + switch (input) + { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId)) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text, 4, 15); + debug_sub_810D340(); + return 0; + } + else + { + CreateTask(debug_sub_810CCEC, 0); + return 1; + } + } } -__attribute__((naked)) -void debug_sub_810CED0() +u8 debug_sub_810D030(void) { - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xffffffdc\n" - " ldr r1, ._212\n" - " mov r0, sp\n" - " mov r2, #0x23\n" - " bl memcpy\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._215 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " bne ._210 @cond_branch\n" - " bl Menu_EraseScreen\n" - " b ._211\n" - "._213:\n" - " .align 2, 0\n" - "._212:\n" - " .word Str_841163B\n" - "._210:\n" - " ldr r5, ._216\n" - " strh r1, [r5]\n" - " ldr r6, ._216 + 4\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldr r1, ._216 + 8\n" - " add r0, r0, r1\n" - " ldrh r0, [r0]\n" - " sub r0, r0, #0x79\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0xb\n" - " bls ._214 @cond_branch\n" - " ldrh r1, [r5]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldr r2, ._216 + 8\n" - " add r0, r0, r2\n" - " ldr r1, ._216 + 12\n" - " strh r1, [r0]\n" - " ldrh r1, [r5]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " sub r2, r2, #0xe\n" - " add r1, r6, r2\n" - " add r0, r0, r1\n" - " ldr r4, ._216 + 16\n" - " add r1, r4, #0\n" - " bl StringCopy\n" - " ldrh r1, [r5]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r2, ._216 + 20\n" - " add r1, r6, r2\n" - " add r0, r0, r1\n" - " add r4, r4, #0xa\n" - " ldr r1, [r4]\n" - " str r1, [r0]\n" - " ldr r1, ._216 + 24\n" - " ldr r0, ._216 + 28\n" - " str r0, [r1]\n" - " b ._215\n" - "._217:\n" - " .align 2, 0\n" - "._216:\n" - " .word gSpecialVar_0x8005\n" - " .word gSaveBlock1\n" - " .word 0x2b6c\n" - " .word 0xffff\n" - " .word gSaveBlock2\n" - " .word 0x2b66\n" - " .word gMenuCallback\n" - " .word debug_sub_810CEA4+1\n" - "._214:\n" - " bl Menu_EraseScreen\n" - " bl Menu_DisplayDialogueFrame\n" - " mov r0, sp\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - "._211:\n" - " bl debug_sub_810D340\n" - "._215:\n" - " mov r0, #0x0\n" - " add sp, sp, #0x24\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} + const u8 text1[] = _("メール{STR_VAR_1} とうろく かいじょ"); + const u8 text2[] = _("デバッグメニューから とうろくした\n" + "メール いがいは けせません"); + s8 input = Menu_ProcessInput(); -__attribute__((naked)) -void debug_sub_810CFA4() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xffffffe0\n" - " ldr r1, ._221\n" - " mov r0, sp\n" - " mov r2, #0x1f\n" - " bl memcpy\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r2, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r2, r0\n" - " beq ._218 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r2, r0\n" - " bne ._219 @cond_branch\n" - " bl Menu_EraseScreen\n" - " b ._220\n" - "._222:\n" - " .align 2, 0\n" - "._221:\n" - " .word Str_841165E\n" - "._219:\n" - " ldr r0, ._225\n" - " strh r2, [r0]\n" - " ldr r1, ._225 + 4\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldr r1, ._225 + 8\n" - " add r0, r0, r1\n" - " ldrh r0, [r0]\n" - " sub r0, r0, #0x79\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0xb\n" - " bls ._223 @cond_branch\n" - " ldr r0, ._225 + 12\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " mov r0, #0x1\n" - " b ._224\n" - "._226:\n" - " .align 2, 0\n" - "._225:\n" - " .word gSpecialVar_0x8005\n" - " .word gSaveBlock1\n" - " .word 0x2b6c\n" - " .word debug_sub_810CCEC+1\n" - "._223:\n" - " bl Menu_EraseScreen\n" - " bl Menu_DisplayDialogueFrame\n" - " mov r0, sp\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - "._220:\n" - " bl debug_sub_810D340\n" - "._218:\n" - " mov r0, #0x0\n" - "._224:\n" - " add sp, sp, #0x20\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + switch (input) + { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0xFFFF + && gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text2, 4, 15); + debug_sub_810D340(); + return 0; + } + else + { + s8 i; + + gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0; + gSaveBlock1.mail[gSpecialVar_0x8005].species = 0; + gSaveBlock1.mail[gSpecialVar_0x8005].playerName[0] = EOS; + *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = 0; + for (i = 0; i < 9; i++) + gSaveBlock1.mail[gSpecialVar_0x8005].words[i] = 0xFFFF; + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1); + StringExpandPlaceholders(gStringVar4, text1); + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + debug_sub_810D340(); + return 0; + } + } } -__attribute__((naked)) -void debug_sub_810D030() +const u8 Str_84116AE[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); + +const struct MenuAction _84116BC[] = { - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xffffffcc\n" - " ldr r1, ._230\n" - " mov r0, sp\n" - " mov r2, #0x10\n" - " bl memcpy\n" - " add r5, sp, #0x10\n" - " ldr r1, ._230 + 4\n" - " add r0, r5, #0\n" - " mov r2, #0x21\n" - " bl memcpy\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r1, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._227 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " bne ._228 @cond_branch\n" - " bl Menu_EraseScreen\n" - " b ._229\n" - "._231:\n" - " .align 2, 0\n" - "._230:\n" - " .word Str_841167D\n" - " .word Str_841168D\n" - "._228:\n" - " ldr r2, ._235\n" - " strh r1, [r2]\n" - " ldr r3, ._235 + 4\n" - " ldrh r1, [r2]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r3\n" - " ldr r1, ._235 + 8\n" - " add r0, r0, r1\n" - " ldrh r1, [r0]\n" - " ldr r0, ._235 + 12\n" - " add r4, r2, #0\n" - " cmp r1, r0\n" - " beq ._233 @cond_branch\n" - " cmp r1, #0\n" - " beq ._233 @cond_branch\n" - " bl Menu_EraseScreen\n" - " bl Menu_DisplayDialogueFrame\n" - " add r0, r5, #0\n" - " b ._234\n" - "._236:\n" - " .align 2, 0\n" - "._235:\n" - " .word gSpecialVar_0x8005\n" - " .word gSaveBlock1\n" - " .word 0x2b6c\n" - " .word 0xffff\n" - "._233:\n" - " ldrh r1, [r4]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r3\n" - " ldr r5, ._238\n" - " add r0, r0, r5\n" - " mov r2, #0x0\n" - " strh r2, [r0]\n" - " ldrh r1, [r4]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r3\n" - " ldr r1, ._238 + 4\n" - " add r0, r0, r1\n" - " strh r2, [r0]\n" - " ldrh r1, [r4]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r3\n" - " sub r5, r5, #0xe\n" - " add r0, r0, r5\n" - " mov r1, #0xff\n" - " strb r1, [r0]\n" - " ldrh r1, [r4]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r5, r5, #0x8\n" - " add r1, r3, r5\n" - " add r0, r0, r1\n" - " str r2, [r0]\n" - " mov r0, #0x0\n" - " ldr r1, ._238 + 8\n" - " mov ip, r1\n" - " sub r5, r5, #0x1a\n" - " add r7, r3, r5\n" - " add r6, r4, #0\n" - " ldr r1, ._238 + 12\n" - " add r5, r1, #0\n" - "._237:\n" - " lsl r1, r0, #0x18\n" - " asr r1, r1, #0x18\n" - " lsl r3, r1, #0x1\n" - " ldrh r2, [r6]\n" - " lsl r0, r2, #0x3\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x2\n" - " add r3, r3, r0\n" - " add r3, r3, r7\n" - " ldrh r0, [r3]\n" - " orr r0, r0, r5\n" - " strh r0, [r3]\n" - " add r1, r1, #0x1\n" - " lsl r1, r1, #0x18\n" - " lsr r0, r1, #0x18\n" - " asr r1, r1, #0x18\n" - " cmp r1, #0x8\n" - " ble ._237 @cond_branch\n" - " ldrh r1, [r4]\n" - " mov r0, ip\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " ldr r4, ._238 + 16\n" - " add r0, r4, #0\n" - " mov r1, sp\n" - " bl StringExpandPlaceholders\n" - " bl Menu_EraseScreen\n" - " bl Menu_DisplayDialogueFrame\n" - " add r0, r4, #0\n" - "._234:\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - "._229:\n" - " bl debug_sub_810D340\n" - "._227:\n" - " mov r0, #0x0\n" - " add sp, sp, #0x34\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._239:\n" - " .align 2, 0\n" - "._238:\n" - " .word 0x2b6c\n" - " .word 0x2b6a\n" - " .word gStringVar1\n" - " .word 0xffff\n" - " .word gStringVar4\n" - "\n" - ); -} + {Str_84115F4, NULL}, + {Str_84115FB, NULL}, + {Str_8411603, NULL}, + {Str_8411608, NULL}, +}; __attribute__((naked)) void debug_sub_810D174() @@ -2367,7 +1341,7 @@ void debug_sub_810D388() "._300:\n" " .align 2, 0\n" "._299:\n" - " .word gUnknown_0300074C\n" + " .word gUnknown_Debug_0300079C\n" " .word 0x43c\n" "._297:\n" " bl ScanlineEffect_Stop\n" -- cgit v1.2.3 From aa3c9d1d357f858baad3065fa2939eba695d5731 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 25 Jan 2018 15:19:46 -0600 Subject: finish decompiling all debug code in mail.c --- src/pokemon/mail.c | 664 +++++++++++++---------------------------------------- 1 file changed, 156 insertions(+), 508 deletions(-) (limited to 'src') diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c index 16252af64..4497c98fb 100644 --- a/src/pokemon/mail.c +++ b/src/pokemon/mail.c @@ -294,7 +294,7 @@ const u8 Str_8411608[] = _("メールをけす"); // Delete Mail static u8 *const sSharedMemPtr = gSharedMem; static u8 sub_80F8A28(void); -/*static*/ void sub_80F8D50(void); +static void sub_80F8D50(void); static void sub_80F8DA0(void); static void sub_80F8E80(void); static void sub_80F8F18(void); @@ -527,7 +527,7 @@ static u8 sub_80F8A28(void) return FALSE; } -/*static*/ void sub_80F8D50(void) +static void sub_80F8D50(void) { do { @@ -988,7 +988,85 @@ u8 debug_sub_810D030(void) } } -const u8 Str_84116AE[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); +void debug_sub_810D174(u8 a) +{ + u8 string[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); + u8 buffer[9][20]; + struct MenuAction menuActions[9]; + u8 i; + + for (i = 0; i < 9; i++) + { + ConvertIntToDecimalStringN(gStringVar1, i, 1, 1); + if (gSaveBlock1.mail[i].itemId == 0xFFFF) + { + ConvertIntToDecimalStringN(gStringVar2, 1, 1, 1); + } + else if (IS_ITEM_MAIL(gSaveBlock1.mail[i].itemId)) + { + ConvertIntToDecimalStringN(gStringVar2, 2, 1, 1); + } + else + { + ConvertIntToDecimalStringN(gStringVar2, 0, 1, 1); + gSaveBlock1.mail[i].itemId = 0; + } + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.mail[i].species]); + StringExpandPlaceholders(buffer[i], string); + menuActions[i].text = buffer[i]; + menuActions[i].func = NULL; + } + Menu_DrawStdWindowFrame(0, 0, 16, 19); + Menu_PrintItems(2, 1, 9, menuActions); + InitMenu(0, 1, 1, 9, 0, 15); + switch (a) + { + case 0: + gMenuCallback = debug_sub_810CE48; + break; + case 1: + gMenuCallback = debug_sub_810CED0; + break; + case 2: + gMenuCallback = debug_sub_810CFA4; + break; + case 3: + gMenuCallback = debug_sub_810D030; + break; + } +} + +u8 debug_sub_810D2F4(void) +{ + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + SetMainCallback2(debug_sub_810CDF0); + return 1; + case -2: + return 0; + } + + switch (input) + { + case 0: + debug_sub_810D174(input); + return 0; + case 1: + debug_sub_810D174(input); + return 0; + case 2: + debug_sub_810D174(input); + return 0; + case 3: + debug_sub_810D174(input); + return 0; + } + + return 1; +} const struct MenuAction _84116BC[] = { @@ -998,514 +1076,84 @@ const struct MenuAction _84116BC[] = {Str_8411608, NULL}, }; -__attribute__((naked)) -void debug_sub_810D174() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffeec\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " ldr r1, ._242\n" - " add r0, sp, #0x8\n" - " mov r2, #0xc\n" - " bl memcpy\n" - " mov r5, #0x0\n" - " mov r0, sp\n" - " add r0, r0, #0x14\n" - " str r0, [sp, #0x110]\n" - " add r1, sp, #0xc8\n" - " mov r8, r1\n" - " add r2, sp, #0xcc\n" - " mov sl, r2\n" - " ldr r0, ._242 + 4\n" - " mov r9, r0\n" - "._248:\n" - " ldr r0, ._242 + 8\n" - " add r1, r5, #0\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " lsl r1, r5, #0x3\n" - " add r0, r1, r5\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r9\n" - " ldr r2, ._242 + 12\n" - " add r4, r0, r2\n" - " ldrh r0, [r4]\n" - " add r6, r1, #0\n" - " ldr r1, ._242 + 16\n" - " cmp r0, r1\n" - " bne ._240 @cond_branch\n" - " ldr r0, ._242 + 20\n" - " mov r1, #0x1\n" - " b ._241\n" - "._243:\n" - " .align 2, 0\n" - "._242:\n" - " .word Str_84116AE\n" - " .word gSaveBlock1\n" - " .word gStringVar1\n" - " .word 0x2b6c\n" - " .word 0xffff\n" - " .word gStringVar2\n" - "._240:\n" - " sub r0, r0, #0x79\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0xb\n" - " bhi ._244 @cond_branch\n" - " ldr r0, ._246\n" - " mov r1, #0x2\n" - "._241:\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " b ._245\n" - "._247:\n" - " .align 2, 0\n" - "._246:\n" - " .word gStringVar2\n" - "._244:\n" - " ldr r0, ._253\n" - " mov r1, #0x0\n" - " mov r2, #0x1\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0x0\n" - " strh r0, [r4]\n" - "._245:\n" - " add r0, r6, r5\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r9\n" - " ldr r2, ._253 + 4\n" - " add r0, r0, r2\n" - " ldrh r1, [r0]\n" - " mov r0, #0xb\n" - " mul r1, r1, r0\n" - " ldr r0, ._253 + 8\n" - " add r1, r1, r0\n" - " ldr r0, ._253 + 12\n" - " bl StringCopy\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x2\n" - " ldr r0, [sp, #0x110]\n" - " add r4, r0, r4\n" - " add r0, r4, #0\n" - " add r1, sp, #0x8\n" - " bl StringExpandPlaceholders\n" - " mov r1, r8\n" - " add r0, r1, r6\n" - " str r4, [r0]\n" - " mov r2, sl\n" - " add r0, r2, r6\n" - " mov r4, #0x0\n" - " str r4, [r0]\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x8\n" - " bls ._248 @cond_branch\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x10\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " mov r3, r8\n" - " bl Menu_PrintItems\n" - " str r4, [sp]\n" - " mov r0, #0xf\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x9\n" - " bl InitMenu\n" - " cmp r7, #0x1\n" - " beq ._249 @cond_branch\n" - " cmp r7, #0x1\n" - " bgt ._250 @cond_branch\n" - " cmp r7, #0\n" - " beq ._251 @cond_branch\n" - " b ._257\n" - "._254:\n" - " .align 2, 0\n" - "._253:\n" - " .word gStringVar2\n" - " .word 0x2b6a\n" - " .word gSpeciesNames\n" - " .word gStringVar3\n" - "._250:\n" - " cmp r7, #0x2\n" - " beq ._255 @cond_branch\n" - " cmp r7, #0x3\n" - " beq ._256 @cond_branch\n" - " b ._257\n" - "._251:\n" - " ldr r1, ._259\n" - " ldr r0, ._259 + 4\n" - " b ._264\n" - "._260:\n" - " .align 2, 0\n" - "._259:\n" - " .word gMenuCallback\n" - " .word debug_sub_810CE48+1\n" - "._249:\n" - " ldr r1, ._262\n" - " ldr r0, ._262 + 4\n" - " b ._264\n" - "._263:\n" - " .align 2, 0\n" - "._262:\n" - " .word gMenuCallback\n" - " .word debug_sub_810CED0+1\n" - "._255:\n" - " ldr r1, ._265\n" - " ldr r0, ._265 + 4\n" - " b ._264\n" - "._266:\n" - " .align 2, 0\n" - "._265:\n" - " .word gMenuCallback\n" - " .word debug_sub_810CFA4+1\n" - "._256:\n" - " ldr r1, ._267\n" - " ldr r0, ._267 + 4\n" - "._264:\n" - " str r0, [r1]\n" - "._257:\n" - " add sp, sp, #0x114\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._268:\n" - " .align 2, 0\n" - "._267:\n" - " .word gMenuCallback\n" - " .word debug_sub_810D030+1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_810D2F4() +void debug_sub_810D340(void) { - asm( - " push {lr}\n" - " bl Menu_ProcessInput\n" - " lsl r2, r0, #0x18\n" - " asr r1, r2, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r1, r0\n" - " beq ._269 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r1, r0\n" - " bne ._270 @cond_branch\n" - " ldr r0, ._272\n" - " bl SetMainCallback2\n" - " b ._279\n" - "._273:\n" - " .align 2, 0\n" - "._272:\n" - " .word debug_sub_810CDF0+1\n" - "._270:\n" - " cmp r1, #0x1\n" - " beq ._278 @cond_branch\n" - " cmp r1, #0x1\n" - " bgt ._275 @cond_branch\n" - " cmp r1, #0\n" - " beq ._278 @cond_branch\n" - " b ._279\n" - "._275:\n" - " cmp r1, #0x2\n" - " beq ._278 @cond_branch\n" - " cmp r1, #0x3\n" - " bne ._279 @cond_branch\n" - "._278:\n" - " lsr r0, r2, #0x18\n" - " bl debug_sub_810D174\n" - "._269:\n" - " mov r0, #0x0\n" - " b ._280\n" - "._279:\n" - " mov r0, #0x1\n" - "._280:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + Menu_DrawStdWindowFrame(0, 0, 9, 9); + Menu_PrintItems(2, 1, 4, _84116BC); + InitMenu(0, 1, 1, 4, 0, 8); + gMenuCallback = debug_sub_810D2F4; } -__attribute__((naked)) -void debug_sub_810D340() +void debug_sub_810D388(void) { - asm( - " push {lr}\n" - " add sp, sp, #0xfffffff8\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x9\n" - " mov r3, #0x9\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._281\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " mov r2, #0x4\n" - " bl Menu_PrintItems\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x8\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " mov r3, #0x4\n" - " bl InitMenu\n" - " ldr r1, ._281 + 4\n" - " ldr r0, ._281 + 8\n" - " str r0, [r1]\n" - " add sp, sp, #0x8\n" - " pop {r0}\n" - " bx r0\n" - "._282:\n" - " .align 2, 0\n" - "._281:\n" - " .word _84116BC\n" - " .word gMenuCallback\n" - " .word debug_sub_810D2F4+1\n" - "\n" - ); + switch (gMain.state) + { + case 0: + if (gUnknown_Debug_0300079C != 0) + { + gMain.state = 2; + gUnknown_Debug_0300079C = 0; + return; + } + else + { + ScanlineEffect_Stop(); + ResetPaletteFade(); + SetVBlankCallback(sub_80F8F18); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + } + break; + case 1: + if (UpdatePaletteFade()) + return; + break; + case 2: + SetVBlankCallback(NULL); + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + break; + case 3: + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + break; + case 4: + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + break; + case 5: + LoadPalette(gMailGraphicsTable[0].palette, 0, 32); + LZ77UnCompVram(gMailGraphicsTable[0].tiles, (void *)VRAM); + DmaFill16(3, 1, (void *)(VRAM + 0x4000), 0x500); + break; + case 6: + REG_BG0CNT = 0x9F08; + REG_BG1CNT = 0x0801; + REG_BLDCNT = 0; + REG_DISPCNT = 0x0340; + debug_sub_810D340(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + SetVBlankCallback(sub_80F8F18); + break; + case 7: + if (!UpdatePaletteFade()) + return; + break; + case 8: + CreateTask(debug_sub_810CE1C, 0); + SetMainCallback2(debug_sub_810CDE0); + break; + default: + return; + } + gMain.state++; } -__attribute__((naked)) -void debug_sub_810D388() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " ldr r1, ._285\n" - " ldr r2, ._285 + 4\n" - " add r0, r1, r2\n" - " ldrb r0, [r0]\n" - " add r2, r1, #0\n" - " cmp r0, #0x8\n" - " bls ._283 @cond_branch\n" - " b ._320\n" - "._283:\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._285 + 8\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._286:\n" - " .align 2, 0\n" - "._285:\n" - " .word gMain\n" - " .word 0x43c\n" - " .word ._287\n" - "._287:\n" - " .word ._288\n" - " .word ._289\n" - " .word ._290\n" - " .word ._291\n" - " .word ._292\n" - " .word ._293\n" - " .word ._294\n" - " .word ._295\n" - " .word ._296\n" - "._288:\n" - " ldr r3, ._299\n" - " ldrb r4, [r3]\n" - " cmp r4, #0\n" - " beq ._297 @cond_branch\n" - " ldr r1, ._299 + 4\n" - " add r0, r2, r1\n" - " mov r2, #0x0\n" - " mov r1, #0x2\n" - " strb r1, [r0]\n" - " strb r2, [r3]\n" - " b ._320\n" - "._300:\n" - " .align 2, 0\n" - "._299:\n" - " .word gUnknown_Debug_0300079C\n" - " .word 0x43c\n" - "._297:\n" - " bl ScanlineEffect_Stop\n" - " bl ResetPaletteFade\n" - " ldr r0, ._302\n" - " bl SetVBlankCallback\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " str r4, [sp]\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " b ._321\n" - "._303:\n" - " .align 2, 0\n" - "._302:\n" - " .word sub_80F8F18+1\n" - "._289:\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._304 @cond_branch\n" - " b ._320\n" - "._304:\n" - " b ._321\n" - "._290:\n" - " mov r0, #0x0\n" - " bl SetVBlankCallback\n" - " ldr r0, ._308\n" - " mov r1, #0x0\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " add r0, r0, #0x4\n" - " strh r1, [r0]\n" - " sub r0, r0, #0x2\n" - " strh r1, [r0]\n" - " add r0, r0, #0x4\n" - " strh r1, [r0]\n" - " add r0, r0, #0x2\n" - " strh r1, [r0]\n" - " b ._321\n" - "._309:\n" - " .align 2, 0\n" - "._308:\n" - " .word 0x4000010\n" - "._291:\n" - " bl ResetSpriteData\n" - " bl ResetTasks\n" - " bl FreeAllSpritePalettes\n" - " b ._321\n" - "._292:\n" - " ldr r4, ._312\n" - " add r0, r4, #0\n" - " bl Text_LoadWindowTemplate\n" - " add r0, r4, #0\n" - " bl InitMenuWindow\n" - " bl Menu_EraseScreen\n" - " b ._321\n" - "._313:\n" - " .align 2, 0\n" - "._312:\n" - " .word gWindowTemplate_81E6CE4\n" - "._293:\n" - " ldr r4, ._315\n" - " ldr r0, [r4]\n" - " mov r1, #0x0\n" - " mov r2, #0x20\n" - " bl LoadPalette\n" - " ldr r0, [r4, #0x4]\n" - " mov r1, #0xc0\n" - " lsl r1, r1, #0x13\n" - " bl LZ77UnCompVram\n" - " add r1, sp, #0x4\n" - " mov r0, #0x1\n" - " strh r0, [r1]\n" - " ldr r1, ._315 + 4\n" - " add r2, sp, #0x4\n" - " str r2, [r1]\n" - " ldr r0, ._315 + 8\n" - " str r0, [r1, #0x4]\n" - " ldr r0, ._315 + 12\n" - " str r0, [r1, #0x8]\n" - " ldr r0, [r1, #0x8]\n" - " b ._321\n" - "._316:\n" - " .align 2, 0\n" - "._315:\n" - " .word gMailGraphicsTable\n" - " .word 0x40000d4\n" - " .word 0x6004000\n" - " .word 0x81000280\n" - "._294:\n" - " ldr r1, ._318\n" - " ldr r2, ._318 + 4\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r2, ._318 + 8\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " add r1, r1, #0x46\n" - " mov r0, #0x0\n" - " strh r0, [r1]\n" - " sub r1, r1, #0x50\n" - " mov r2, #0xd0\n" - " lsl r2, r2, #0x2\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " bl debug_sub_810D340\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x10\n" - " mov r3, #0x0\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._318 + 12\n" - " bl SetVBlankCallback\n" - " b ._321\n" - "._319:\n" - " .align 2, 0\n" - "._318:\n" - " .word 0x4000008\n" - " .word 0x9f08\n" - " .word 0x801\n" - " .word sub_80F8F18+1\n" - "._295:\n" - " bl UpdatePaletteFade\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._320 @cond_branch\n" - " b ._321\n" - "._296:\n" - " ldr r0, ._322\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " ldr r0, ._322 + 4\n" - " bl SetMainCallback2\n" - "._321:\n" - " ldr r1, ._322 + 8\n" - " ldr r0, ._322 + 12\n" - " add r1, r1, r0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._320:\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._323:\n" - " .align 2, 0\n" - "._322:\n" - " .word debug_sub_810CE1C+1\n" - " .word debug_sub_810CDE0+1\n" - " .word gMain\n" - " .word 0x43c\n" - "\n" - ); -} -#endif \ No newline at end of file +#endif -- cgit v1.2.3 From 092eba3155abf78bfdde1dbe3f140fdbfa9f5081 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 25 Jan 2018 16:50:16 -0600 Subject: integrate debug functions in contest.c --- src/contest.c | 1022 +++++++++++---------------------------------------------- 1 file changed, 187 insertions(+), 835 deletions(-) (limited to 'src') diff --git a/src/contest.c b/src/contest.c index 950b26d0c..2f988b9e4 100644 --- a/src/contest.c +++ b/src/contest.c @@ -33,6 +33,8 @@ #include "util.h" #include "contest_ai.h" +extern u8 gUnknown_020297ED; + extern u8 AreMovesContestCombo(u16, u16); // I don't think this is a bool extern void sub_80C8A38(u8); extern void sub_80C8AD0(u8); @@ -238,6 +240,7 @@ void sub_80B0BC4(u8, bool8); void sub_80B0C5C(struct Sprite *); void sub_80B0CB0(struct Sprite *); void sub_80B0CDC(u8, int); +void unref_sub_80B0CF4(void); void sub_80B0D7C(void); void sub_80B1118(void); void sub_80B114C(u8); @@ -611,43 +614,17 @@ void sub_80AB9A0(u8 taskId) } } -#if DEBUG -__attribute__((naked)) -void ContestMainCallback2(void) -{ - asm("\ - push {lr}\n\ - ldr r0, ._122\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._121 @cond_branch\n\ - ldr r0, ._122 + 4\n\ - ldrh r0, [r0, #0x2e]\n\ - cmp r0, #0x4\n\ - bne ._121 @cond_branch\n\ - bl unref_sub_80B0CF4\n\ -._121:\n\ - bl AnimateSprites\n\ - bl RunTasks\n\ - bl BuildOamBuffer\n\ - bl UpdatePaletteFade\n\ - pop {r0}\n\ - bx r0\n\ -._123:\n\ - .align 2, 0\n\ -._122:\n\ - .word gUnknown_020297ED\n\ - .word gMain"); -} -#else void ContestMainCallback2(void) { +#if DEBUG + if (gUnknown_020297ED == 1 && gMain.newKeys == 4) + unref_sub_80B0CF4(); +#endif AnimateSprites(); RunTasks(); BuildOamBuffer(); UpdatePaletteFade(); } -#endif void ContestVBlankCallback(void) { @@ -762,273 +739,9 @@ void sub_80ABCDC(u8 taskId) gTasks[taskId].func = sub_80ABEA0; } +void debug_sub_80B9EBC(u8); + // Handle move selection input -#if DEBUG -__attribute__((naked)) -void sub_80ABEA0(u8 taskId) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - add sp, sp, #0xfffffff8\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - mov r6, #0x0\n\ - ldr r0, ._161\n\ - mov ip, r0\n\ - ldr r4, ._161 + 4\n\ - ldr r3, ._161 + 8\n\ - ldrb r0, [r4]\n\ - lsl r0, r0, #0x6\n\ - mov r1, ip\n\ - add r1, r1, #0x1e\n\ - add r1, r0, r1\n\ - mov r2, #0x3\n\ -._158:\n\ - ldrh r0, [r1]\n\ - cmp r0, #0\n\ - beq ._157 @cond_branch\n\ - add r0, r6, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r6, r0, #0x18\n\ -._157:\n\ - add r1, r1, #0x2\n\ - sub r2, r2, #0x1\n\ - cmp r2, #0\n\ - bge ._158 @cond_branch\n\ - ldrh r0, [r3, #0x2e]\n\ - mov r5, #0x1\n\ - and r5, r5, r0\n\ - cmp r5, #0\n\ - beq ._159 @cond_branch\n\ - bl DestroyMenuCursor\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._161 + 12\n\ - lsl r1, r7, #0x2\n\ - add r1, r1, r7\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r0\n\ - ldr r0, ._161 + 16\n\ - b ._160\n\ -._162:\n\ - .align 2, 0\n\ -._161:\n\ - .word gContestMons\n\ - .word gContestPlayerMonIndex\n\ - .word gMain\n\ - .word gTasks\n\ - .word sub_80AC0C8+1\n\ -._159:\n\ - ldrh r0, [r3, #0x30]\n\ - cmp r0, #0x10\n\ - bne ._163 @cond_branch\n\ - b ._196\n\ -._163:\n\ - cmp r0, #0x10\n\ - bgt ._165 @cond_branch\n\ - cmp r0, #0x2\n\ - beq ._166 @cond_branch\n\ - cmp r0, #0x8\n\ - bne ._167 @cond_branch\n\ - b ._168\n\ -._167:\n\ - b ._196\n\ -._165:\n\ - cmp r0, #0x40\n\ - beq ._170 @cond_branch\n\ - cmp r0, #0x40\n\ - bgt ._171 @cond_branch\n\ - b ._196\n\ -._171:\n\ - cmp r0, #0x80\n\ - beq ._173 @cond_branch\n\ - b ._196\n\ -._166:\n\ - bl sub_814A904\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - mov r0, #0x0\n\ - bl sub_80AFFE0\n\ - ldr r0, ._177\n\ - ldr r1, ._177 + 4\n\ - ldrb r2, [r1]\n\ - ldrb r3, [r1, #0x1]\n\ - ldrb r4, [r1, #0x2]\n\ - str r4, [sp]\n\ - ldrb r1, [r1, #0x3]\n\ - str r1, [sp, #0x4]\n\ - mov r1, #0x0\n\ - bl Text_FillWindowRectDefPalette\n\ - ldr r0, ._177 + 8\n\ - ldrb r0, [r0]\n\ - bl Contest_IsMonsTurnDisabled\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._175 @cond_branch\n\ - ldr r0, ._177 + 12\n\ - ldr r1, ._177 + 16\n\ - bl StringCopy\n\ - b ._176\n\ -._178:\n\ - .align 2, 0\n\ -._177:\n\ - .word gUnknown_03004210\n\ - .word gUnknown_083CA340\n\ - .word gContestPlayerMonIndex\n\ - .word gDisplayedStringBattle\n\ - .word gText_Contest_WhichMoveWillBePlayed\n\ -._175:\n\ - ldr r0, ._180\n\ - ldr r1, ._180 + 4\n\ - bl StringCopy\n\ -._176:\n\ - ldr r5, ._180\n\ - ldr r0, ._180 + 8\n\ - ldrb r1, [r0, #0x1]\n\ - add r1, r1, #0x1\n\ - add r0, r5, #0\n\ - bl InsertStringDigit\n\ - bl sub_80AF138\n\ - ldr r4, ._180 + 12\n\ - add r0, r4, #0\n\ - add r1, r5, #0\n\ - bl StringExpandPlaceholders\n\ - ldr r0, ._180 + 16\n\ - mov r2, #0xc2\n\ - lsl r2, r2, #0x2\n\ - mov r1, #0xf\n\ - str r1, [sp]\n\ - add r1, r4, #0\n\ - mov r3, #0x1\n\ - bl Text_InitWindowAndPrintText\n\ - ldr r0, ._180 + 20\n\ - mov r1, #0x0\n\ - strh r1, [r0]\n\ - ldr r0, ._180 + 24\n\ - strh r1, [r0]\n\ - ldr r1, ._180 + 28\n\ - lsl r0, r7, #0x2\n\ - add r0, r0, r7\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r1\n\ - ldr r1, ._180 + 32\n\ - str r1, [r0]\n\ - b ._196\n\ -._181:\n\ - .align 2, 0\n\ -._180:\n\ - .word gDisplayedStringBattle\n\ - .word gText_Contest_ButItCantParticipate\n\ - .word gSharedMem+0x19204\n\ - .word gStringVar4\n\ - .word gMenuWindow\n\ - .word gBattle_BG0_Y\n\ - .word gBattle_BG2_Y\n\ - .word gTasks\n\ - .word sub_80ABC70+1\n\ -._170:\n\ - ldr r4, ._184\n\ - mov r0, #0x0\n\ - ldsb r0, [r4, r0]\n\ - bl nullsub_17\n\ - ldrb r0, [r4]\n\ - cmp r0, #0\n\ - bne ._182 @cond_branch\n\ - sub r0, r6, #1\n\ - b ._186\n\ -._185:\n\ - .align 2, 0\n\ -._184:\n\ - .word gSharedMem+0x19204\n\ -._182:\n\ - sub r0, r0, #0x1\n\ - b ._186\n\ -._173:\n\ - ldr r4, ._189\n\ - mov r0, #0x0\n\ - ldsb r0, [r4, r0]\n\ - bl nullsub_17\n\ - ldrb r1, [r4]\n\ - sub r0, r6, #1\n\ - cmp r1, r0\n\ - bne ._187 @cond_branch\n\ - strb r5, [r4]\n\ - b ._188\n\ -._190:\n\ - .align 2, 0\n\ -._189:\n\ - .word gSharedMem+0x19204\n\ -._187:\n\ - add r0, r1, #1\n\ -._186:\n\ - strb r0, [r4]\n\ -._188:\n\ - ldr r4, ._193\n\ - mov r0, #0x0\n\ - ldsb r0, [r4, r0]\n\ - bl sub_80AC0AC\n\ - bl sub_80AED58\n\ - ldr r2, ._193 + 4\n\ - ldrb r1, [r4]\n\ - lsl r1, r1, #0x1\n\ - ldr r0, ._193 + 8\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x6\n\ - add r1, r1, r0\n\ - add r2, r2, #0x1e\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - bl sub_80AEBEC\n\ - cmp r6, #0x1\n\ - bls ._196 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - b ._196\n\ -._194:\n\ - .align 2, 0\n\ -._193:\n\ - .word gSharedMem+0x19204\n\ - .word gContestMons\n\ - .word gContestPlayerMonIndex\n\ -._168:\n\ - ldr r0, ._197\n\ - ldrb r1, [r0]\n\ - cmp r1, #0x1\n\ - bne ._196 @cond_branch\n\ - ldr r0, ._197 + 4\n\ - ldrb r0, [r0]\n\ - add r2, r0, #0\n\ - and r2, r2, r1\n\ - cmp r2, #0\n\ - bne ._196 @cond_branch\n\ - ldr r0, ._197 + 8\n\ - lsl r1, r7, #0x2\n\ - add r1, r1, r7\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r0\n\ - strh r2, [r1, #0x8]\n\ - ldrb r0, [r4]\n\ - lsl r0, r0, #0x6\n\ - add r0, r0, ip\n\ - ldrh r0, [r0, #0x1e]\n\ - strh r0, [r1, #0xa]\n\ - ldr r0, ._197 + 12\n\ -._160:\n\ - str r0, [r1]\n\ -._196:\n\ - add sp, sp, #0x8\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._198:\n\ - .align 2, 0\n\ -._197:\n\ - .word gUnknown_020297ED\n\ - .word gIsLinkContest\n\ - .word gTasks\n\ - .word debug_sub_80B9EBC+1"); -} -#else void sub_80ABEA0(u8 taskId) { u8 numMoves = 0; @@ -1100,552 +813,191 @@ void sub_80ABEA0(u8 taskId) if (numMoves > 1) PlaySE(SE_SELECT); break; +#if DEBUG + case START_BUTTON: + if (gUnknown_020297ED == 1 && !(gIsLinkContest & 1)) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = gContestMons[gContestPlayerMonIndex].moves[0]; + gTasks[taskId].func = debug_sub_80B9EBC; + } + break; +#endif } } } -#endif #if DEBUG -__attribute__((naked)) -void debug_sub_80B9EBC() -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - add sp, sp, #0xffffff94\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - ldr r1, ._202\n\ - lsl r0, r4, #0x2\n\ - add r0, r0, r4\n\ - lsl r0, r0, #0x3\n\ - add r7, r0, r1\n\ - mov r0, #0x8\n\ - ldsh r2, [r7, r0]\n\ - cmp r2, #0\n\ - beq ._199 @cond_branch\n\ - cmp r2, #0x1\n\ - beq ._200 @cond_branch\n\ - b ._229\n\ -._203:\n\ - .align 2, 0\n\ -._202:\n\ - .word gTasks\n\ -._199:\n\ - ldr r5, ._205\n\ - ldr r4, ._205 + 4\n\ - ldrb r0, [r4]\n\ - mov r8, r0\n\ - ldrb r6, [r4, #0x1]\n\ - ldrb r0, [r4, #0x2]\n\ - str r0, [sp]\n\ - ldrb r0, [r4, #0x3]\n\ - str r0, [sp, #0x4]\n\ - add r0, r5, #0\n\ - mov r1, #0x0\n\ - mov r2, r8\n\ - add r3, r6, #0\n\ - bl Text_FillWindowRectDefPalette\n\ - mov r0, #0xa\n\ - ldsh r1, [r7, r0]\n\ - mov r0, #0xd\n\ - mul r1, r1, r0\n\ - ldr r0, ._205 + 8\n\ - add r1, r1, r0\n\ - mov r2, #0xc2\n\ - lsl r2, r2, #0x2\n\ - str r6, [sp]\n\ - add r0, r5, #0\n\ - mov r3, r8\n\ - bl Text_InitWindowAndPrintText\n\ - mov r0, #0xa\n\ - ldsh r1, [r7, r0]\n\ - add r0, sp, #0x8\n\ - mov r2, #0x2\n\ - mov r3, #0x3\n\ - bl ConvertIntToDecimalStringN\n\ - mov r2, #0xc7\n\ - lsl r2, r2, #0x2\n\ - ldrb r3, [r4, #0x4]\n\ - ldrb r0, [r4, #0x5]\n\ - str r0, [sp]\n\ - add r0, r5, #0\n\ - add r1, sp, #0x8\n\ - bl Text_InitWindowAndPrintText\n\ - bl sub_80AED58\n\ - ldrh r0, [r7, #0xa]\n\ - bl sub_80AEBEC\n\ - ldrh r0, [r7, #0x8]\n\ - add r0, r0, #0x1\n\ - strh r0, [r7, #0x8]\n\ - b ._229\n\ -._206:\n\ - .align 2, 0\n\ -._205:\n\ - .word gUnknown_03004210\n\ - .word gUnknown_083CA340\n\ - .word gMoveNames\n\ -._200:\n\ - ldr r0, ._213\n\ - ldrh r1, [r0, #0x30]\n\ - cmp r1, #0x10\n\ - beq ._207 @cond_branch\n\ - cmp r1, #0x10\n\ - bgt ._208 @cond_branch\n\ - cmp r1, #0x4\n\ - beq ._215 @cond_branch\n\ - cmp r1, #0x4\n\ - bgt ._210 @cond_branch\n\ - cmp r1, #0x2\n\ - beq ._211 @cond_branch\n\ - b ._229\n\ -._214:\n\ - .align 2, 0\n\ -._213:\n\ - .word gMain\n\ -._210:\n\ - cmp r1, #0x8\n\ - beq ._215 @cond_branch\n\ - b ._229\n\ -._208:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x1\n\ - cmp r1, r0\n\ - beq ._217 @cond_branch\n\ - cmp r1, r0\n\ - bgt ._218 @cond_branch\n\ - cmp r1, #0x20\n\ - beq ._219 @cond_branch\n\ - b ._229\n\ -._218:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x2\n\ - cmp r1, r0\n\ - beq ._221 @cond_branch\n\ - b ._229\n\ -._219:\n\ - ldrh r0, [r7, #0xa]\n\ - sub r0, r0, #0x1\n\ - b ._223\n\ -._221:\n\ - ldrh r0, [r7, #0xa]\n\ - sub r0, r0, #0xa\n\ -._223:\n\ - strh r0, [r7, #0xa]\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - bgt ._227 @cond_branch\n\ - mov r0, #0xb1\n\ - lsl r0, r0, #0x1\n\ - strh r0, [r7, #0xa]\n\ - b ._227\n\ -._207:\n\ - ldrh r0, [r7, #0xa]\n\ - add r0, r0, #0x1\n\ - b ._226\n\ -._217:\n\ - ldrh r0, [r7, #0xa]\n\ - add r0, r0, #0xa\n\ -._226:\n\ - strh r0, [r7, #0xa]\n\ - lsl r0, r0, #0x10\n\ - mov r1, #0xb1\n\ - lsl r1, r1, #0x11\n\ - cmp r0, r1\n\ - ble ._227 @cond_branch\n\ - strh r2, [r7, #0xa]\n\ -._227:\n\ - ldrh r0, [r7, #0x8]\n\ - sub r0, r0, #0x1\n\ - strh r0, [r7, #0x8]\n\ - b ._229\n\ -._215:\n\ - ldr r0, ._230\n\ - mov r1, #0x0\n\ - strh r1, [r0]\n\ - ldr r0, ._230 + 4\n\ - strh r1, [r0]\n\ - bl sub_80B1BDC\n\ - ldr r1, ._230 + 8\n\ - lsl r0, r4, #0x2\n\ - add r0, r0, r4\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r1\n\ - mov r1, #0x0\n\ - strh r1, [r0, #0x8]\n\ - ldr r1, ._230 + 12\n\ - str r1, [r0]\n\ - b ._229\n\ -._231:\n\ - .align 2, 0\n\ -._230:\n\ - .word gBattle_BG0_Y\n\ - .word gBattle_BG2_Y\n\ - .word gTasks\n\ - .word debug_sub_80BA054+1\n\ -._211:\n\ - ldr r0, ._232\n\ - mov r1, #0xa0\n\ - strh r1, [r0]\n\ - ldr r0, ._232 + 4\n\ - strh r1, [r0]\n\ - ldr r1, ._232 + 8\n\ - ldr r0, ._232 + 12\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x6\n\ - add r0, r0, r1\n\ - ldrh r2, [r7, #0xa]\n\ - mov r1, #0x0\n\ - strh r2, [r0, #0x1e]\n\ - strh r1, [r7, #0x8]\n\ - strh r1, [r7, #0xa]\n\ - strh r1, [r7, #0xc]\n\ - strh r1, [r7, #0xe]\n\ - ldr r0, ._232 + 16\n\ - str r0, [r7]\n\ -._229:\n\ - add sp, sp, #0x6c\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._233:\n\ - .align 2, 0\n\ -._232:\n\ - .word gBattle_BG0_Y\n\ - .word gBattle_BG2_Y\n\ - .word gContestMons\n\ - .word gContestPlayerMonIndex\n\ - .word sub_80ABCDC+1"); -} -__attribute__((naked)) -void debug_sub_80BA054() -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6, r7}\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - ldr r1, ._236\n\ - lsl r0, r7, #0x2\n\ - add r0, r0, r7\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r1\n\ - mov r2, #0x8\n\ - ldsh r0, [r0, r2]\n\ - add r2, r1, #0\n\ - cmp r0, #0x14\n\ - bls ._234 @cond_branch\n\ - b ._286\n\ -._234:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._236 + 4\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._237:\n\ - .align 2, 0\n\ -._236:\n\ - .word gTasks\n\ - .word ._238\n\ -._238:\n\ - .word ._239\n\ - .word ._240\n\ - .word ._241\n\ - .word ._242\n\ - .word ._243\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._286\n\ - .word ._259\n\ -._239:\n\ - lsl r0, r7, #0x2\n\ - mov r8, r0\n\ - ldr r2, ._262\n\ - mov r9, r2\n\ - ldr r1, ._262 + 4\n\ - mov r2, #0x0\n\ - add r0, r1, #3\n\ -._260:\n\ - strb r2, [r0]\n\ - sub r0, r0, #0x1\n\ - cmp r0, r1\n\ - bge ._260 @cond_branch\n\ - mov r5, #0x0\n\ - mov r0, r9\n\ - mov r1, #0x0\n\ - mov r2, #0x14\n\ - bl memset\n\ - ldr r4, ._262 + 8\n\ - ldrb r0, [r4]\n\ - bl sub_80B28F0\n\ - ldr r3, ._262 + 12\n\ - ldrb r2, [r4]\n\ - lsl r2, r2, #0x6\n\ - add r0, r2, r3\n\ - ldrh r0, [r0]\n\ - add r1, r3, #0\n\ - add r1, r1, #0x3c\n\ - add r1, r2, r1\n\ - ldr r1, [r1]\n\ - add r3, r3, #0x38\n\ - add r2, r2, r3\n\ - ldr r2, [r2]\n\ - bl sub_80AE9FC\n\ - lsl r0, r0, #0x18\n\ - lsr r6, r0, #0x18\n\ - ldr r2, ._262 + 16\n\ - lsl r0, r6, #0x4\n\ - add r0, r0, r6\n\ - lsl r0, r0, #0x2\n\ - add r3, r0, r2\n\ - mov r4, #0x0\n\ - mov r1, #0x78\n\ - strh r1, [r3, #0x24]\n\ - add r2, r2, #0x1c\n\ - add r0, r0, r2\n\ - ldr r1, ._262 + 20\n\ - str r1, [r0]\n\ - ldr r0, ._262 + 24\n\ - mov r2, r8\n\ - add r1, r2, r7\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r0\n\ - strh r6, [r1, #0xc]\n\ - ldr r2, ._262 + 28\n\ - ldr r0, ._262 + 32\n\ - ldrb r0, [r0]\n\ - add r0, r0, r2\n\ - strb r6, [r0]\n\ - strh r5, [r1, #0xe]\n\ - ldrh r0, [r1, #0x8]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1, #0x8]\n\ - mov r0, r9\n\ - sub r0, r0, #0xea\n\ - strb r4, [r0]\n\ - b ._286\n\ -._263:\n\ - .align 2, 0\n\ -._262:\n\ - .word gSharedMem+0x19348\n\ - .word gBattleMonForms\n\ - .word gContestPlayerMonIndex\n\ - .word gContestMons\n\ - .word gSprites\n\ - .word sub_80AD8FC+1\n\ - .word gTasks\n\ - .word gObjectBankIDs\n\ - .word gBankAttacker\n\ -._240:\n\ - lsl r0, r7, #0x2\n\ - add r0, r0, r7\n\ - lsl r0, r0, #0x3\n\ - add r7, r0, r2\n\ - ldrb r6, [r7, #0xc]\n\ - ldr r1, ._267\n\ - lsl r0, r6, #0x4\n\ - add r0, r0, r6\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, #0x1c\n\ - add r0, r0, r1\n\ - ldr r1, [r0]\n\ - ldr r0, ._267 + 4\n\ - cmp r1, r0\n\ - beq ._264 @cond_branch\n\ - b ._286\n\ -._264:\n\ - ldr r4, ._267 + 8\n\ - ldrb r1, [r4]\n\ - lsl r0, r1, #0x3\n\ - sub r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._267 + 12\n\ - add r0, r0, r1\n\ - ldrh r1, [r7, #0xa]\n\ - mov r5, #0x0\n\ - strh r1, [r0, #0x6]\n\ - ldrb r0, [r4]\n\ - bl sub_80B2790\n\ - ldrb r0, [r4]\n\ - bl sub_80B28F0\n\ - ldrh r0, [r7, #0xa]\n\ - bl SelectContestMoveBankTarget\n\ - ldrh r0, [r7, #0xa]\n\ - bl DoMoveAnim\n\ - strh r5, [r7, #0xe]\n\ - ldrh r0, [r7, #0x8]\n\ - add r0, r0, #0x1\n\ - strh r0, [r7, #0x8]\n\ - b ._286\n\ -._268:\n\ - .align 2, 0\n\ -._267:\n\ - .word gSprites\n\ - .word SpriteCallbackDummy+1\n\ - .word gContestPlayerMonIndex\n\ - .word gSharedMem+0x19260\n\ -._241:\n\ - ldr r0, ._273\n\ - ldr r0, [r0]\n\ - bl _call_via_r0\n\ - ldr r0, ._273 + 4\n\ - ldrb r4, [r0]\n\ - cmp r4, #0\n\ - beq ._269 @cond_branch\n\ - b ._286\n\ -._269:\n\ - ldr r0, ._273 + 8\n\ - ldrb r0, [r0]\n\ - bl sub_80B28CC\n\ - ldr r0, ._273 + 12\n\ - add r0, r0, #0x5a\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._271 @cond_branch\n\ - ldr r0, ._273 + 16\n\ - lsl r1, r7, #0x2\n\ - add r1, r1, r7\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r0\n\ - strh r4, [r1, #0x1c]\n\ - mov r0, #0x14\n\ - strh r0, [r1, #0x8]\n\ - b ._286\n\ -._274:\n\ - .align 2, 0\n\ -._273:\n\ - .word gAnimScriptCallback\n\ - .word gAnimScriptActive\n\ - .word gContestPlayerMonIndex\n\ - .word gSharedMem+0x19204\n\ - .word gTasks\n\ -._271:\n\ - ldr r0, ._276\n\ - lsl r1, r7, #0x2\n\ - add r1, r1, r7\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r0\n\ - ldrh r0, [r1, #0x8]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1, #0x8]\n\ - b ._286\n\ -._277:\n\ - .align 2, 0\n\ -._276:\n\ - .word gTasks\n\ -._242:\n\ - lsl r0, r7, #0x2\n\ - add r0, r0, r7\n\ - lsl r0, r0, #0x3\n\ - add r4, r0, r2\n\ - ldrh r0, [r4, #0xe]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4, #0xe]\n\ - lsl r0, r0, #0x10\n\ - asr r0, r0, #0x10\n\ - cmp r0, #0x15\n\ - bne ._286 @cond_branch\n\ - ldrb r6, [r4, #0xc]\n\ - ldr r1, ._280\n\ - lsl r0, r6, #0x4\n\ - add r0, r0, r6\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, #0x1c\n\ - add r0, r0, r1\n\ - ldr r1, ._280 + 4\n\ - str r1, [r0]\n\ - bl sub_80B1B14\n\ - mov r0, #0x0\n\ - strh r0, [r4, #0xe]\n\ - ldrh r0, [r4, #0x8]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4, #0x8]\n\ - b ._286\n\ -._281:\n\ - .align 2, 0\n\ -._280:\n\ - .word gSprites\n\ - .word sub_80AD92C+1\n\ -._243:\n\ - lsl r0, r7, #0x2\n\ - add r0, r0, r7\n\ - lsl r0, r0, #0x3\n\ - add r5, r0, r2\n\ - ldrb r6, [r5, #0xc]\n\ - ldr r1, ._284\n\ - lsl r0, r6, #0x4\n\ - add r0, r0, r6\n\ - lsl r0, r0, #0x2\n\ - add r4, r0, r1\n\ - add r0, r4, #0\n\ - add r0, r0, #0x3e\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x1d\n\ - cmp r0, #0\n\ - bge ._286 @cond_branch\n\ - add r0, r4, #0\n\ - bl FreeSpriteOamMatrix\n\ - add r0, r4, #0\n\ - bl DestroySprite\n\ - mov r0, #0x0\n\ - strh r0, [r5, #0x8]\n\ - ldr r0, ._284 + 4\n\ - str r0, [r5]\n\ - ldr r0, ._284 + 8\n\ - mov r1, #0xa0\n\ - strh r1, [r0]\n\ - ldr r0, ._284 + 12\n\ - strh r1, [r0]\n\ - b ._286\n\ -._285:\n\ - .align 2, 0\n\ -._284:\n\ - .word gSprites\n\ - .word debug_sub_80B9EBC+1\n\ - .word gBattle_BG0_Y\n\ - .word gBattle_BG2_Y\n\ -._259:\n\ - lsl r0, r7, #0x2\n\ - add r0, r0, r7\n\ - lsl r0, r0, #0x3\n\ - add r2, r0, r2\n\ - ldrh r0, [r2, #0x1c]\n\ - add r1, r0, #1\n\ - strh r1, [r2, #0x1c]\n\ - lsl r0, r0, #0x10\n\ - asr r0, r0, #0x10\n\ - cmp r0, #0x1e\n\ - ble ._286 @cond_branch\n\ - mov r0, #0x0\n\ - strh r0, [r2, #0x1c]\n\ - mov r0, #0x1\n\ - strh r0, [r2, #0x8]\n\ -._286:\n\ - pop {r3, r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0"); +void debug_sub_80BA054(u8); + +void debug_sub_80B9EBC(u8 taskId) +{ + u8 text[100]; + + switch (gTasks[taskId].data[0]) + { + case 0: + Text_FillWindowRectDefPalette( + &gUnknown_03004210, + 0, + gUnknown_083CA340[0][0], + gUnknown_083CA340[0][1], + gUnknown_083CA340[0][2], + gUnknown_083CA340[0][3]); + Text_InitWindowAndPrintText( + &gUnknown_03004210, + gMoveNames[gTasks[taskId].data[1]], + 776, + gUnknown_083CA340[0][0], + gUnknown_083CA340[0][1]); + ConvertIntToDecimalStringN(text, gTasks[taskId].data[1], 2, 3); + Text_InitWindowAndPrintText( + &gUnknown_03004210, + text, + 796, + gUnknown_083CA340[1][0], + gUnknown_083CA340[1][1]); + sub_80AED58(); + sub_80AEBEC(gTasks[taskId].data[1]); + gTasks[taskId].data[0]++; + break; + case 1: + switch (gMain.newAndRepeatedKeys) + { + case 0x20: + gTasks[taskId].data[1] -= 1; + if (gTasks[taskId].data[1] < 1) + gTasks[taskId].data[1] = 354; + gTasks[taskId].data[0]--; + break; + case 0x200: + gTasks[taskId].data[1] -= 10; + if (gTasks[taskId].data[1] < 1) + gTasks[taskId].data[1] = 354; + gTasks[taskId].data[0]--; + break; + case 0x10: + gTasks[taskId].data[1] += 1; + if (gTasks[taskId].data[1] > 354) + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[0]--; + break; + case 0x100: + gTasks[taskId].data[1] += 10; + if (gTasks[taskId].data[1] > 354) + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[0]--; + break; + case 4: + case 8: + gBattle_BG0_Y = 0; + gBattle_BG2_Y = 0; + sub_80B1BDC(); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = debug_sub_80BA054; + break; + case 2: + gBattle_BG0_Y = DISPLAY_HEIGHT; + gBattle_BG2_Y = DISPLAY_HEIGHT; + gContestMons[gContestPlayerMonIndex].moves[0] = gTasks[taskId].data[1]; + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].func = sub_80ABCDC; + break; + } + break; + } +} + +void debug_sub_80BA054(u8 taskId) +{ + s32 i; + u8 r6; + + switch (gTasks[taskId].data[0]) + { + case 0: + for (i = 0; i < 4; i++) + gBattleMonForms[i] = 0; + memset(&shared19348, 0, sizeof(shared19348)); + sub_80B28F0(gContestPlayerMonIndex); + r6 = sub_80AE9FC( + gContestMons[gContestPlayerMonIndex].species, + gContestMons[gContestPlayerMonIndex].otId, + gContestMons[gContestPlayerMonIndex].personality); + gSprites[r6].pos2.x = 120; + gSprites[r6].callback = sub_80AD8FC; + gTasks[taskId].data[2] = r6; + gObjectBankIDs[gBankAttacker] = r6; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[0]++; + sContest.unk1925E = 0; + break; + case 1: + r6 = gTasks[taskId].data[2]; + if (gSprites[r6].callback == SpriteCallbackDummy) + { + sContestantStatus[gContestPlayerMonIndex].currMove = gTasks[taskId].data[1]; + sub_80B2790(gContestPlayerMonIndex); + sub_80B28F0(gContestPlayerMonIndex); + SelectContestMoveBankTarget(gTasks[taskId].data[1]); + DoMoveAnim(gTasks[taskId].data[1]); + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[0]++; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80B28CC(gContestPlayerMonIndex); + if (sContest.unk1925E != 0) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 20; + } + else + { + gTasks[taskId].data[0]++; + } + } + break; + case 3: + gTasks[taskId].data[3]++; + if (gTasks[taskId].data[3] == 21) + { + r6 = gTasks[taskId].data[2]; + gSprites[r6].callback = sub_80AD92C; + sub_80B1B14(); + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[0]++; + } + break; + case 4: + r6 = gTasks[taskId].data[2]; + if (gSprites[r6].invisible) + { + FreeSpriteOamMatrix(&gSprites[r6]); + DestroySprite(&gSprites[r6]); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = debug_sub_80B9EBC; + gBattle_BG0_Y = DISPLAY_HEIGHT; + gBattle_BG2_Y = DISPLAY_HEIGHT; + } + break; + case 20: + if (gTasks[taskId].data[10]++ > 30) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 1; + } + break; + } } + #endif void sub_80AC0AC(s8 a) -- cgit v1.2.3 From 9f7fa5781e8de8e23faea3785e8b3aebde79c8c6 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 25 Jan 2018 17:15:37 -0600 Subject: decompile sub_813B79C --- src/engine/save.c | 98 ++++++++++++++----------------------------------------- 1 file changed, 25 insertions(+), 73 deletions(-) (limited to 'src') diff --git a/src/engine/save.c b/src/engine/save.c index 0eb93eb1d..0b7a3dd79 100644 --- a/src/engine/save.c +++ b/src/engine/save.c @@ -664,79 +664,31 @@ static u16 CalculateChecksum(void *data, u16 size) } #if DEBUG -__attribute__((naked)) -void sub_813B79C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " ldr r4, ._163\n" - " ldr r6, ._163 + 4\n" - " mov r5, #0x0\n" - "._161:\n" - " lsl r0, r5, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r1, r4, #0\n" - " bl DoReadFlashWholeSection\n" - " ldr r1, ._163 + 8\n" - " add r0, r4, r1\n" - " ldrh r0, [r0]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r6\n" - " ldrh r1, [r0, #0x4]\n" - " add r0, r4, #0\n" - " bl CalculateChecksum\n" - " ldr r2, ._163 + 12\n" - " add r1, r4, r2\n" - " strh r0, [r1]\n" - " add r0, r5, #0\n" - " add r1, r4, #0\n" - " bl ProgramFlashSectorAndVerify\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " cmp r5, #0x1b\n" - " bls ._161 @cond_branch\n" - " ldr r6, ._163\n" - " ldr r7, ._163 + 16\n" - " mov r5, #0x0\n" - "._162:\n" - " add r4, r5, #0\n" - " add r4, r4, #0x1c\n" - " lsl r0, r4, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r1, r6, #0\n" - " bl DoReadFlashWholeSection\n" - " lsl r0, r5, #0x3\n" - " add r0, r0, r7\n" - " ldrh r1, [r0, #0x4]\n" - " add r0, r6, #0\n" - " bl CalculateChecksum\n" - " ldr r2, ._163 + 8\n" - " add r1, r6, r2\n" - " strh r0, [r1]\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " bl ProgramFlashSectorAndVerify\n" - " add r0, r5, #1\n" - " lsl r0, r0, #0x10\n" - " lsr r5, r0, #0x10\n" - " cmp r5, #0x1\n" - " bls ._162 @cond_branch\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._164:\n" - " .align 2, 0\n" - "._163:\n" - " .word +0x2000000\n" - " .word sSaveBlockChunks\n" - " .word 0xff4\n" - " .word 0xff6\n" - " .word sHallOfFameChunks\n" - "\n" - ); +void sub_813B79C(void) +{ + struct SaveSector *sbSector; + struct SaveSector *hofSector; + const struct SaveBlockChunk *sbChunks; + const struct SaveBlockChunk *hofChunks; + u16 i; + + sbSector = eSaveSection; + sbChunks = sSaveBlockChunks; + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT * 2; i++) + { + DoReadFlashWholeSection(i, sbSector); + sbSector->checksum = CalculateChecksum(sbSector, sbChunks[sbSector->id].size); + ProgramFlashSectorAndVerify(i, sbSector->data); + } + + hofSector = eSaveSection; + hofChunks = sHallOfFameChunks; + for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++) + { + DoReadFlashWholeSection(HALL_OF_FAME_SECTOR + i, hofSector); + hofSector->id = CalculateChecksum(hofSector, hofChunks[i].size); // why id? + ProgramFlashSectorAndVerify(HALL_OF_FAME_SECTOR + i, hofSector->data); + } } #endif -- cgit v1.2.3 From e50f5e906776a799ec69418168f032880e16384c Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 25 Jan 2018 19:36:54 -0600 Subject: more debug integrations --- src/battle/battle_controller_opponent.c | 262 +---------- src/battle/battle_controller_player.c | 764 ++------------------------------ src/battle/battle_controller_safari.c | 243 +--------- src/battle/battle_interface.c | 668 +--------------------------- src/pokemon/pokemon_1.c | 359 ++------------- src/pokemon/pokemon_menu.c | 151 +------ 6 files changed, 149 insertions(+), 2298 deletions(-) (limited to 'src') diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index d2045b6c4..5382738f7 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -30,6 +30,7 @@ struct MovePpInfo u8 ppBonuses; }; +extern u8 gUnknown_02023A14_50; extern u8 gActiveBank; extern u8 gBattleBufferA[][0x200]; extern u16 gBattlePartyID[]; @@ -1209,255 +1210,27 @@ void sub_8034B74(void) } } -#if DEBUG -__attribute__((naked)) -void OpponentHandleTrainerThrow(void) -{ - asm("\ - push {r4, r5, r6, lr}\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6}\n\ - ldr r0, ._480\n\ - ldrb r1, [r0]\n\ - mov r0, #0x10\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._478 @cond_branch\n\ - ldr r0, ._480 + 4\n\ - ldr r1, ._480 + 8\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - b ._491\n\ -._481:\n\ - .align 2, 0\n\ -._480:\n\ - .word gUnknown_02023A14_50\n\ - .word +0x2000000\n\ - .word 0x160a3\n\ -._478:\n\ - ldr r3, ._484\n\ - ldrh r1, [r3]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x3\n\ - cmp r1, r0\n\ - bne ._482 @cond_branch\n\ - bl GetSecretBaseTrainerPicIndex\n\ - b ._487\n\ -._485:\n\ - .align 2, 0\n\ -._484:\n\ - .word gTrainerBattleOpponent\n\ -._482:\n\ - ldr r0, ._488\n\ - ldrh r1, [r0]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._486 @cond_branch\n\ - bl get_trainer_class_pic_index\n\ - b ._487\n\ -._489:\n\ - .align 2, 0\n\ -._488:\n\ - .word gBattleTypeFlags\n\ -._486:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._490 @cond_branch\n\ - bl GetEReaderTrainerPicIndex\n\ -._487:\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - b ._491\n\ -._490:\n\ - ldr r2, ._492\n\ - ldrh r1, [r3]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r2\n\ - ldrb r0, [r0, #0x3]\n\ -._491:\n\ - mov r9, r0\n\ - ldr r2, ._492 + 4\n\ - mov r8, r2\n\ - ldrb r1, [r2]\n\ - bl sub_8031A6C\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - bl GetBankIdentity\n\ - add r1, r0, #0\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x18\n\ - mov r0, r9\n\ - bl GetMonSpriteTemplate_803C5A0\n\ - ldr r5, ._492 + 8\n\ - ldr r1, ._492 + 12\n\ - mov r2, r9\n\ - lsl r0, r2, #0x2\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r4, #0x8\n\ - sub r4, r4, r0\n\ - lsl r4, r4, #0x12\n\ - mov r0, #0xa0\n\ - lsl r0, r0, #0xe\n\ - add r4, r4, r0\n\ - asr r4, r4, #0x10\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - bl sub_8079E90\n\ - add r3, r0, #0\n\ - lsl r3, r3, #0x18\n\ - lsr r3, r3, #0x18\n\ - add r0, r5, #0\n\ - mov r1, #0xb0\n\ - add r2, r4, #0\n\ - bl CreateSprite\n\ - ldr r5, ._492 + 16\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - add r1, r1, r5\n\ - strb r0, [r1]\n\ - ldr r4, ._492 + 20\n\ - ldrb r0, [r2]\n\ - add r0, r0, r5\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x4\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r4\n\ - ldr r1, ._492 + 24\n\ - strh r1, [r0, #0x24]\n\ - ldrb r0, [r2]\n\ - add r0, r0, r5\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x4\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r4\n\ - mov r1, #0x2\n\ - strh r1, [r0, #0x2e]\n\ - ldr r0, ._492 + 28\n\ - mov r1, r9\n\ - lsl r6, r1, #0x3\n\ - add r0, r6, r0\n\ - ldrh r0, [r0, #0x4]\n\ - bl IndexOfSpritePaletteTag\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - add r1, r1, r5\n\ - ldrb r1, [r1]\n\ - lsl r2, r1, #0x4\n\ - add r2, r2, r1\n\ - lsl r2, r2, #0x2\n\ - add r2, r2, r4\n\ - lsl r0, r0, #0x4\n\ - ldrb r3, [r2, #0x5]\n\ - mov r1, #0xf\n\ - and r1, r1, r3\n\ - orr r1, r1, r0\n\ - strb r1, [r2, #0x5]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - add r0, r0, r5\n\ - ldrb r0, [r0]\n\ - lsl r1, r0, #0x4\n\ - add r1, r1, r0\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r4\n\ - ldrh r0, [r1, #0x4]\n\ - lsl r0, r0, #0x16\n\ - lsr r0, r0, #0x16\n\ - strh r0, [r1, #0x38]\n\ - ldr r0, ._492 + 32\n\ - add r6, r6, r0\n\ - ldrh r0, [r6, #0x6]\n\ - bl GetSpriteTileStartByTag\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - add r1, r1, r5\n\ - ldrb r2, [r1]\n\ - lsl r1, r2, #0x4\n\ - add r1, r1, r2\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r4\n\ - ldr r2, ._492 + 36\n\ - and r2, r2, r0\n\ - ldrh r3, [r1, #0x4]\n\ - ldr r0, ._492 + 40\n\ - and r0, r0, r3\n\ - orr r0, r0, r2\n\ - strh r0, [r1, #0x4]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - add r0, r0, r5\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x4\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r4\n\ - mov r2, r9\n\ - strh r2, [r0, #0x6]\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - add r0, r0, r5\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x4\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r4, r4, #0x1c\n\ - add r0, r0, r4\n\ - ldr r1, ._492 + 44\n\ - str r1, [r0]\n\ - ldr r1, ._492 + 48\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, ._492 + 52\n\ - str r1, [r0]\n\ - pop {r3, r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4, r5, r6}\n\ - pop {r0}\n\ - bx r0\n\ -._493:\n\ - .align 2, 0\n\ -._492:\n\ - .word gTrainers\n\ - .word gActiveBank\n\ - .word gUnknown_02024E8C\n\ - .word gTrainerFrontPicCoords\n\ - .word gObjectBankIDs\n\ - .word gSprites\n\ - .word 0xff10\n\ - .word gTrainerFrontPicPaletteTable\n\ - .word gTrainerFrontPicTable\n\ - .word 0x3ff\n\ - .word 0xfffffc00\n\ - .word sub_80313A0+1\n\ - .word gBattleBankFunc\n\ - .word sub_8032B4C+1"); -} -#else void OpponentHandleTrainerThrow(void) { u32 trainerPicIndex; - if (gTrainerBattleOpponent == 0x400) - trainerPicIndex = GetSecretBaseTrainerPicIndex(); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - trainerPicIndex = get_trainer_class_pic_index(); - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = GetEReaderTrainerPicIndex(); +#if DEBUG + if (gUnknown_02023A14_50 & 0x10) + { + trainerPicIndex = gSharedMem[0x160A3]; + } else - trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; +#endif + { + if (gTrainerBattleOpponent == 0x400) + trainerPicIndex = GetSecretBaseTrainerPicIndex(); + else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + trainerPicIndex = get_trainer_class_pic_index(); + else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) + trainerPicIndex = GetEReaderTrainerPicIndex(); + else + trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; + } sub_8031A6C(trainerPicIndex, gActiveBank); GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank)); @@ -1475,7 +1248,6 @@ void OpponentHandleTrainerThrow(void) gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_8032B4C; } -#endif void OpponentHandleTrainerSlide(void) { diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 8875d5148..d4b4da6f2 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -42,6 +42,8 @@ extern struct Window gUnknown_03004210; extern void (*gBattleBankFunc[])(void); +extern u32 gOamMatrixAllocBitmap; +extern u8 gUnknown_020297ED; extern u8 gActiveBank; extern u8 gActionSelectionCursor[]; extern u8 gDisplayedStringBattle[]; @@ -617,728 +619,14 @@ struct ChooseMoveStruct const u8 gUnknown_081FAE80[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW WHITE LIGHT_BLUE WHITE2}"); -#if DEBUG -__attribute__((naked)) -void sub_802C68C(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - add sp, sp, #0xfffffff8\n\ - mov r0, #0x0\n\ - mov r8, r0\n\ - mov r7, #0x0\n\ - ldr r1, ._131\n\ - ldrb r2, [r1]\n\ - lsl r1, r2, #0x9\n\ - ldr r0, ._131 + 4\n\ - add r6, r1, r0\n\ - ldr r0, ._131 + 8\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r5, #0x1\n\ - add r0, r5, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._126 @cond_branch\n\ - b ._127\n\ -._126:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r1, ._131 + 12\n\ - ldr r2, ._131\n\ - ldrb r0, [r2]\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x1\n\ - add r1, r6, r0\n\ - ldrh r0, [r1]\n\ - cmp r0, #0xae\n\ - bne ._128 @cond_branch\n\ - ldrb r0, [r6, #0x12]\n\ - mov r4, #0x0\n\ - cmp r0, #0x7\n\ - beq ._130 @cond_branch\n\ - ldrb r1, [r6, #0x13]\n\ - mov r0, #0x7\n\ - eor r1, r1, r0\n\ - neg r0, r1\n\ - orr r0, r0, r1\n\ - asr r4, r0, #0x1f\n\ - mov r0, #0x10\n\ - and r4, r4, r0\n\ - b ._130\n\ -._132:\n\ - .align 2, 0\n\ -._131:\n\ - .word gActiveBank\n\ - .word gBattleBufferA+4\n\ - .word gMain\n\ - .word gMoveSelectionCursor\n\ -._128:\n\ - ldr r2, ._135\n\ - ldrh r1, [r1]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r2\n\ - ldrb r4, [r0, #0x6]\n\ -._130:\n\ - mov r0, #0x10\n\ - and r0, r0, r4\n\ - cmp r0, #0\n\ - beq ._133 @cond_branch\n\ - ldr r0, ._135 + 4\n\ - ldr r1, ._135 + 8\n\ - ldrb r1, [r1]\n\ - strb r1, [r0]\n\ - b ._134\n\ -._136:\n\ - .align 2, 0\n\ -._135:\n\ - .word gBattleMoves\n\ - .word gUnknown_03004344\n\ - .word gActiveBank\n\ -._133:\n\ - ldr r0, ._141\n\ - ldrb r0, [r0]\n\ - bl GetBankIdentity\n\ - add r1, r0, #0\n\ - mov r2, #0x1\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - eor r0, r0, r2\n\ - bl GetBankByIdentity\n\ - ldr r1, ._141 + 4\n\ - strb r0, [r1]\n\ -._134:\n\ - ldr r3, ._141 + 8\n\ - ldr r5, ._141\n\ - ldrb r2, [r5]\n\ - lsl r1, r2, #0x9\n\ - add r0, r3, #1\n\ - add r0, r1, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._137 @cond_branch\n\ - mov r0, #0x2\n\ - and r0, r0, r4\n\ - cmp r0, #0\n\ - beq ._146 @cond_branch\n\ - add r0, r3, #2\n\ - add r0, r1, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._146 @cond_branch\n\ - mov r0, #0x1\n\ - add r8, r8, r0\n\ - b ._146\n\ -._142:\n\ - .align 2, 0\n\ -._141:\n\ - .word gActiveBank\n\ - .word gUnknown_03004344\n\ - .word gBattleBufferA\n\ -._137:\n\ - mov r0, #0x7d\n\ - and r0, r0, r4\n\ - cmp r0, #0\n\ - bne ._143 @cond_branch\n\ - mov r1, #0x1\n\ - add r8, r8, r1\n\ -._143:\n\ - ldr r0, ._149\n\ - add r0, r2, r0\n\ - add r1, r6, #0\n\ - add r1, r1, #0x8\n\ - ldrb r0, [r0]\n\ - add r1, r1, r0\n\ - ldrb r0, [r1]\n\ - cmp r0, #0\n\ - beq ._144 @cond_branch\n\ - mov r0, #0x12\n\ - and r0, r0, r4\n\ - cmp r0, #0\n\ - bne ._146 @cond_branch\n\ - mov r0, #0x0\n\ - bl CountAliveMons\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bhi ._146 @cond_branch\n\ - ldrb r0, [r5]\n\ - bl sub_803C434\n\ - ldr r1, ._149 + 4\n\ - strb r0, [r1]\n\ - mov r2, #0x0\n\ - mov r8, r2\n\ -._146:\n\ - mov r0, r8\n\ - cmp r0, #0\n\ - bne ._147 @cond_branch\n\ -._144:\n\ - bl DestroyMenuCursor\n\ - ldr r1, ._149\n\ - ldr r0, ._149 + 8\n\ - ldrb r0, [r0]\n\ - add r0, r0, r1\n\ - ldrb r2, [r0]\n\ - ldr r0, ._149 + 4\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x8\n\ - orr r2, r2, r0\n\ - b ._148\n\ -._150:\n\ - .align 2, 0\n\ -._149:\n\ - .word gMoveSelectionCursor\n\ - .word gUnknown_03004344\n\ - .word gActiveBank\n\ -._147:\n\ - ldr r1, ._153\n\ - ldr r2, ._153 + 4\n\ - ldrb r0, [r2]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, ._153 + 8\n\ - str r1, [r0]\n\ - mov r0, #0x12\n\ - and r4, r4, r0\n\ - cmp r4, #0\n\ - beq ._151 @cond_branch\n\ - ldr r1, ._153 + 12\n\ - ldrb r0, [r2]\n\ - b ._152\n\ -._154:\n\ - .align 2, 0\n\ -._153:\n\ - .word gBattleBankFunc\n\ - .word gActiveBank\n\ - .word sub_802C2EC+1\n\ - .word gUnknown_03004344\n\ -._151:\n\ - mov r0, #0x1\n\ - bl GetBankByIdentity\n\ - ldr r1, ._157\n\ - ldrb r1, [r1]\n\ - ldr r2, ._157 + 4\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x16\n\ - add r0, r0, r2\n\ - ldr r0, [r0]\n\ - and r1, r1, r0\n\ - cmp r1, #0\n\ - beq ._155 @cond_branch\n\ - mov r0, #0x3\n\ - b ._156\n\ -._158:\n\ - .align 2, 0\n\ -._157:\n\ - .word gAbsentBankFlags\n\ - .word gBitTable\n\ -._155:\n\ - mov r0, #0x1\n\ -._156:\n\ - bl GetBankByIdentity\n\ - ldr r1, ._160\n\ -._152:\n\ - strb r0, [r1]\n\ - ldr r2, ._160 + 4\n\ - ldr r1, ._160 + 8\n\ - ldr r0, ._160\n\ - ldrb r0, [r0]\n\ - add r0, r0, r1\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x4\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r2, r2, #0x1c\n\ - add r0, r0, r2\n\ - ldr r1, ._160 + 12\n\ - b ._203\n\ -._161:\n\ - .align 2, 0\n\ -._160:\n\ - .word gUnknown_03004344\n\ - .word gSprites\n\ - .word gObjectBankIDs\n\ - .word sub_8010520+1\n\ -._127:\n\ - mov r6, #0x2\n\ - add r0, r6, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._162 @cond_branch\n\ - bl DestroyMenuCursor\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._164\n\ - strh r7, [r0]\n\ - ldr r1, ._164 + 4\n\ - mov r2, #0xa0\n\ - lsl r2, r2, #0x1\n\ - add r0, r2, #0\n\ - strh r0, [r1]\n\ - ldr r2, ._164 + 8\n\ -._148:\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ - bl Emitcmd33\n\ - bl PlayerBufferExecCompleted\n\ - b ._209\n\ -._165:\n\ - .align 2, 0\n\ -._164:\n\ - .word gBattle_BG0_X\n\ - .word gBattle_BG0_Y\n\ - .word 0xffff\n\ -._162:\n\ - mov r0, #0x20\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._166 @cond_branch\n\ - ldr r4, ._170\n\ - add r2, r2, r4\n\ - ldrb r1, [r2]\n\ - add r0, r5, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._167 @cond_branch\n\ - b ._209\n\ -._167:\n\ - ldrb r0, [r2]\n\ - bl nullsub_7\n\ - ldr r0, ._170 + 4\n\ - ldrb r1, [r0]\n\ - add r1, r1, r4\n\ - ldrb r0, [r1]\n\ - mov r2, #0x1\n\ - eor r0, r0, r2\n\ - b ._183\n\ -._171:\n\ - .align 2, 0\n\ -._170:\n\ - .word gMoveSelectionCursor\n\ - .word gActiveBank\n\ -._166:\n\ - mov r3, #0x10\n\ - add r0, r3, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._172 @cond_branch\n\ - ldr r4, ._178\n\ - add r3, r2, r4\n\ - ldrb r2, [r3]\n\ - mov r6, #0x1\n\ - add r0, r5, #0\n\ - and r0, r0, r2\n\ - cmp r0, #0\n\ - beq ._173 @cond_branch\n\ - b ._209\n\ -._173:\n\ - ldr r1, ._178 + 4\n\ - add r0, r6, #0\n\ - eor r0, r0, r2\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc ._175 @cond_branch\n\ - b ._209\n\ -._175:\n\ - ldrb r0, [r3]\n\ - bl nullsub_7\n\ - ldr r2, ._178 + 8\n\ - ldrb r1, [r2]\n\ - add r1, r1, r4\n\ - ldrb r0, [r1]\n\ - eor r0, r0, r6\n\ - b ._183\n\ -._179:\n\ - .align 2, 0\n\ -._178:\n\ - .word gMoveSelectionCursor\n\ - .word gUnknown_03004348\n\ - .word gActiveBank\n\ -._172:\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._180 @cond_branch\n\ - ldr r4, ._184\n\ - add r2, r2, r4\n\ - ldrb r1, [r2]\n\ - add r0, r6, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._181 @cond_branch\n\ - b ._209\n\ -._181:\n\ - ldrb r0, [r2]\n\ - bl nullsub_7\n\ - ldr r2, ._184 + 4\n\ - ldrb r1, [r2]\n\ - add r1, r1, r4\n\ - ldrb r0, [r1]\n\ - mov r2, #0x2\n\ - eor r0, r0, r2\n\ - b ._183\n\ -._185:\n\ - .align 2, 0\n\ -._184:\n\ - .word gMoveSelectionCursor\n\ - .word gActiveBank\n\ -._180:\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._186 @cond_branch\n\ - ldr r4, ._192\n\ - add r3, r2, r4\n\ - ldrb r2, [r3]\n\ - mov r5, #0x2\n\ - add r0, r6, #0\n\ - and r0, r0, r2\n\ - cmp r0, #0\n\ - beq ._187 @cond_branch\n\ - b ._209\n\ -._187:\n\ - ldr r1, ._192 + 4\n\ - add r0, r5, #0\n\ - eor r0, r0, r2\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc ._189 @cond_branch\n\ - b ._209\n\ -._189:\n\ - ldrb r0, [r3]\n\ - bl nullsub_7\n\ - ldr r2, ._192 + 8\n\ - ldrb r1, [r2]\n\ - add r1, r1, r4\n\ - ldrb r0, [r1]\n\ - eor r0, r0, r5\n\ -._183:\n\ - strb r0, [r1]\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r1, ._192 + 8\n\ - ldrb r0, [r1]\n\ - add r0, r0, r4\n\ - ldrb r0, [r0]\n\ - mov r1, #0x0\n\ - bl sub_802E3B4\n\ - bl sub_802E220\n\ - bl sub_802E2D4\n\ - b ._209\n\ -._193:\n\ - .align 2, 0\n\ -._192:\n\ - .word gMoveSelectionCursor\n\ - .word gUnknown_03004348\n\ - .word gActiveBank\n\ -._186:\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._194 @cond_branch\n\ - ldr r0, ._201\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bhi ._195 @cond_branch\n\ - b ._209\n\ -._195:\n\ - ldr r0, ._201 + 4\n\ - ldrh r1, [r0]\n\ - add r0, r6, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._197 @cond_branch\n\ - b ._209\n\ -._197:\n\ - ldr r4, ._201 + 8\n\ - add r0, r2, r4\n\ - ldrb r0, [r0]\n\ - ldr r1, ._201 + 12\n\ - bl sub_802E12C\n\ - ldr r2, ._201 + 16\n\ - ldrb r0, [r2]\n\ - add r0, r0, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._199 @cond_branch\n\ - ldr r0, ._201 + 20\n\ - strb r7, [r0]\n\ - b ._200\n\ -._202:\n\ - .align 2, 0\n\ -._201:\n\ - .word gUnknown_03004348\n\ - .word gBattleTypeFlags\n\ - .word gMoveSelectionCursor\n\ - .word gUnknown_081FAE80\n\ - .word gActiveBank\n\ - .word gUnknown_03004344\n\ -._199:\n\ - ldr r1, ._204\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - add r0, r1, #0\n\ -._200:\n\ - ldrb r0, [r0]\n\ - mov r1, #0x1b\n\ - bl sub_802E3B4\n\ - ldr r4, ._204 + 4\n\ - ldr r1, ._204 + 8\n\ - mov r0, #0x1c\n\ - str r0, [sp]\n\ - mov r0, #0x3a\n\ - str r0, [sp, #0x4]\n\ - add r0, r4, #0\n\ - mov r2, #0x17\n\ - mov r3, #0x37\n\ - bl Text_FillWindowRect\n\ - ldr r1, ._204 + 12\n\ - mov r2, #0xa4\n\ - lsl r2, r2, #0x2\n\ - mov r0, #0x37\n\ - str r0, [sp]\n\ - add r0, r4, #0\n\ - mov r3, #0x17\n\ - bl Text_InitWindow\n\ - add r0, r4, #0\n\ - bl Text_PrintWindow8002F44\n\ - ldr r1, ._204 + 16\n\ - ldr r0, ._204 + 20\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, ._204 + 24\n\ - b ._203\n\ -._205:\n\ - .align 2, 0\n\ -._204:\n\ - .word gUnknown_03004344\n\ - .word gUnknown_03004210\n\ - .word 0x1016\n\ - .word BattleText_SwitchWhich\n\ - .word gBattleBankFunc\n\ - .word gActiveBank\n\ - .word sub_802CA60+1\n\ -._194:\n\ - ldr r0, ._214\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - beq ._206 @cond_branch\n\ - b ._209\n\ -._206:\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._208 @cond_branch\n\ - b ._209\n\ -._208:\n\ - ldr r6, ._214 + 4\n\ - ldr r1, ._214 + 8\n\ - str r3, [sp]\n\ - mov r0, #0x3a\n\ - str r0, [sp, #0x4]\n\ - add r0, r6, #0\n\ - mov r2, #0x1\n\ - mov r3, #0x37\n\ - bl Text_FillWindowRect\n\ - ldr r0, ._214 + 12\n\ - mov sl, r0\n\ - ldr r1, ._214 + 16\n\ - ldrb r0, [r1]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, sl\n\ - ldrh r0, [r0]\n\ - mov r2, #0x64\n\ - mov r9, r2\n\ - mov r1, r9\n\ - mul r1, r1, r0\n\ - add r0, r1, #0\n\ - ldr r5, ._214 + 20\n\ - add r0, r0, r5\n\ - mov r1, #0xd\n\ - bl GetMonData\n\ - mov r1, #0xd\n\ - mul r1, r1, r0\n\ - ldr r0, ._214 + 24\n\ - add r1, r1, r0\n\ - mov r2, #0x80\n\ - lsl r2, r2, #0x1\n\ - mov r0, #0x37\n\ - mov r8, r0\n\ - str r0, [sp]\n\ - add r0, r6, #0\n\ - mov r3, #0x2\n\ - bl Text_InitWindowAndPrintText\n\ - ldr r4, ._214 + 28\n\ - ldr r1, ._214 + 16\n\ - ldrb r0, [r1]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, sl\n\ - ldrh r0, [r0]\n\ - mov r2, r9\n\ - mul r2, r2, r0\n\ - add r0, r2, #0\n\ - add r0, r0, r5\n\ - mov r1, #0xd\n\ - bl GetMonData\n\ - add r1, r0, #0\n\ - add r0, r4, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x3\n\ - bl ConvertIntToDecimalStringN\n\ - mov r2, #0x88\n\ - lsl r2, r2, #0x1\n\ - mov r0, r8\n\ - str r0, [sp]\n\ - add r0, r6, #0\n\ - add r1, r4, #0\n\ - mov r3, #0xa\n\ - bl Text_InitWindowAndPrintText\n\ - ldr r1, ._214 + 32\n\ - mov r2, #0x8b\n\ - lsl r2, r2, #0x1\n\ - mov r5, #0x39\n\ - str r5, [sp]\n\ - add r0, r6, #0\n\ - mov r3, #0x1\n\ - bl Text_InitWindowAndPrintText\n\ - ldr r0, ._214 + 36\n\ - ldrb r1, [r0]\n\ - add r0, r4, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x3\n\ - bl ConvertIntToDecimalStringN\n\ - mov r2, #0x8e\n\ - lsl r2, r2, #0x1\n\ - str r5, [sp]\n\ - add r0, r6, #0\n\ - add r1, r4, #0\n\ - mov r3, #0x4\n\ - bl Text_InitWindowAndPrintText\n\ - ldr r0, ._214 + 40\n\ - add r2, r0, #0\n\ - add r2, r2, #0x3e\n\ - mov r1, #0x3f\n\ -._211:\n\ - ldrb r0, [r2]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._210 @cond_branch\n\ - add r0, r7, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ -._210:\n\ - add r2, r2, #0x44\n\ - sub r1, r1, #0x1\n\ - cmp r1, #0\n\ - bge ._211 @cond_branch\n\ - ldr r4, ._214 + 28\n\ - add r0, r4, #0\n\ - add r1, r7, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x2\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r6, ._214 + 4\n\ - mov r2, #0x91\n\ - lsl r2, r2, #0x1\n\ - mov r5, #0x39\n\ - str r5, [sp]\n\ - add r0, r6, #0\n\ - add r1, r4, #0\n\ - mov r3, #0x8\n\ - bl Text_InitWindowAndPrintText\n\ - bl GetTaskCount\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - add r0, r4, #0\n\ - add r1, r7, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x2\n\ - bl ConvertIntToDecimalStringN\n\ - mov r2, #0x93\n\ - lsl r2, r2, #0x1\n\ - str r5, [sp]\n\ - add r0, r6, #0\n\ - add r1, r4, #0\n\ - mov r3, #0xb\n\ - bl Text_InitWindowAndPrintText\n\ - mov r1, #0x0\n\ - mov r7, #0x0\n\ - ldr r0, ._214 + 44\n\ - mov r3, #0x1\n\ - ldr r2, [r0]\n\ -._213:\n\ - add r0, r3, #0\n\ - LSL r0, r1\n\ - and r0, r0, r2\n\ - cmp r0, #0\n\ - beq ._212 @cond_branch\n\ - add r0, r7, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ -._212:\n\ - add r1, r1, #0x1\n\ - cmp r1, #0x1f\n\ - ble ._213 @cond_branch\n\ - ldr r4, ._214 + 28\n\ - add r0, r4, #0\n\ - add r1, r7, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x2\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r0, ._214 + 4\n\ - mov r2, #0x95\n\ - lsl r2, r2, #0x1\n\ - mov r1, #0x39\n\ - str r1, [sp]\n\ - add r1, r4, #0\n\ - mov r3, #0xe\n\ - bl Text_InitWindowAndPrintText\n\ - ldr r1, ._214 + 48\n\ - ldr r0, ._214 + 16\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, ._214 + 52\n\ -._203:\n\ - str r1, [r0]\n\ -._209:\n\ - add sp, sp, #0x8\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._215:\n\ - .align 2, 0\n\ -._214:\n\ - .word gUnknown_020297ED\n\ - .word gUnknown_03004210\n\ - .word 0x1016\n\ - .word gBattlePartyID\n\ - .word gActiveBank\n\ - .word gPlayerParty\n\ - .word gMoveNames\n\ - .word gDisplayedStringBattle\n\ - .word gString_TurnJP\n\ - .word gAnimMoveTurn\n\ - .word gSprites\n\ - .word gOamMatrixAllocBitmap\n\ - .word gBattleBankFunc\n\ - .word debug_sub_8030C24+1"); -} -#else +void debug_sub_8030C24(void); + void sub_802C68C(void) { u32 r8 = 0; +#if DEBUG + u8 count = 0; +#endif struct ChooseMoveStruct *r6 = (struct ChooseMoveStruct *)(gBattleBufferA[gActiveBank] + 4); if (gMain.newKeys & A_BUTTON) @@ -1469,8 +757,44 @@ void sub_802C68C(void) gBattleBankFunc[gActiveBank] = sub_802CA60; } } -} +#if DEBUG + else if (gUnknown_020297ED == 1 && (gMain.newKeys & START_BUTTON)) + { + const u8 *moveName; + s32 i; + + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x3A); + moveName = gMoveNames[GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1)]; + Text_InitWindowAndPrintText(&gUnknown_03004210, moveName, 0x100, 2, 0x37); + ConvertIntToDecimalStringN( + gDisplayedStringBattle, + GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1), + 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x110, 10, 0x37); + Text_InitWindowAndPrintText(&gUnknown_03004210, gString_TurnJP, 0x116, 1, 0x39); + ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x11C, 4, 0x39); + for (i = 0; i < 64; i++) + { + if (gSprites[i].inUse) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x122, 8, 0x39); + count = GetTaskCount(); + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x126, 11, 0x39); + for (i = 0, count = 0; i < 32; i++) + { + if (gOamMatrixAllocBitmap & (1 << i)) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x12A, 14, 0x39); + gBattleBankFunc[gActiveBank] = debug_sub_8030C24; + } #endif +} extern const u8 BattleText_Format[]; diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c index 4af8adbbb..5896e5e18 100644 --- a/src/battle/battle_controller_safari.c +++ b/src/battle/battle_controller_safari.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle_anim_81258BC.h" #include "battle.h" +#include "battle_interface.h" #include "battle_message.h" #include "data2.h" #include "link.h" @@ -207,236 +208,6 @@ void SafariBufferRunCommand(void) } } -#if DEBUG -__attribute__((naked)) -void bx_battle_menu_t6_2(void) -{ - asm("\ - push {r4, r5, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._94\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r2, #0x1\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._89 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl DestroyMenuCursor\n\ - ldr r1, ._94 + 4\n\ - ldr r0, ._94 + 8\n\ - ldrb r0, [r0]\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - beq ._90 @cond_branch\n\ - cmp r0, #0x1\n\ - bgt ._91 @cond_branch\n\ - cmp r0, #0\n\ - beq ._92 @cond_branch\n\ - b ._101\n\ -._95:\n\ - .align 2, 0\n\ -._94:\n\ - .word gMain\n\ - .word gActionSelectionCursor\n\ - .word gActiveBank\n\ -._91:\n\ - cmp r0, #0x2\n\ - beq ._96 @cond_branch\n\ - cmp r0, #0x3\n\ - beq ._97 @cond_branch\n\ - b ._101\n\ -._92:\n\ - mov r0, #0x1\n\ - mov r1, #0x5\n\ - b ._100\n\ -._90:\n\ - mov r0, #0x1\n\ - mov r1, #0x6\n\ - b ._100\n\ -._96:\n\ - mov r0, #0x1\n\ - mov r1, #0x7\n\ -._100:\n\ - mov r2, #0x0\n\ - bl Emitcmd33\n\ - b ._101\n\ -._97:\n\ - mov r0, #0x1\n\ - mov r1, #0x8\n\ - mov r2, #0x0\n\ - bl Emitcmd33\n\ -._101:\n\ - bl SafariBufferExecCompleted\n\ - b ._129\n\ -._89:\n\ - mov r3, #0x20\n\ - add r0, r3, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._103 @cond_branch\n\ - ldr r5, ._107\n\ - ldr r4, ._107 + 4\n\ - ldrb r0, [r4]\n\ - add r0, r0, r5\n\ - ldrb r1, [r0]\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._104 @cond_branch\n\ - b ._129\n\ -._104:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldrb r0, [r4]\n\ - add r0, r0, r5\n\ - ldrb r0, [r0]\n\ - bl nullsub_8\n\ - ldrb r1, [r4]\n\ - add r1, r1, r5\n\ - ldrb r0, [r1]\n\ - mov r2, #0x1\n\ - b ._111\n\ -._108:\n\ - .align 2, 0\n\ -._107:\n\ - .word gActionSelectionCursor\n\ - .word gActiveBank\n\ -._103:\n\ - mov r0, #0x10\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._109 @cond_branch\n\ - ldr r5, ._112\n\ - ldr r4, ._112 + 4\n\ - ldrb r0, [r4]\n\ - add r0, r0, r5\n\ - ldrb r1, [r0]\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._129 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldrb r0, [r4]\n\ - add r0, r0, r5\n\ - ldrb r0, [r0]\n\ - bl nullsub_8\n\ - ldrb r1, [r4]\n\ - add r1, r1, r5\n\ - ldrb r0, [r1]\n\ - mov r2, #0x1\n\ - b ._111\n\ -._113:\n\ - .align 2, 0\n\ -._112:\n\ - .word gActionSelectionCursor\n\ - .word gActiveBank\n\ -._109:\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._114 @cond_branch\n\ - ldr r5, ._117\n\ - ldr r4, ._117 + 4\n\ - ldrb r0, [r4]\n\ - add r0, r0, r5\n\ - ldrb r1, [r0]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._129 @cond_branch\n\ - b ._116\n\ -._118:\n\ - .align 2, 0\n\ -._117:\n\ - .word gActionSelectionCursor\n\ - .word gActiveBank\n\ -._114:\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._119 @cond_branch\n\ - ldr r5, ._122\n\ - ldr r4, ._122 + 4\n\ - ldrb r0, [r4]\n\ - add r0, r0, r5\n\ - ldrb r1, [r0]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._129 @cond_branch\n\ -._116:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldrb r0, [r4]\n\ - add r0, r0, r5\n\ - ldrb r0, [r0]\n\ - bl nullsub_8\n\ - ldrb r1, [r4]\n\ - add r1, r1, r5\n\ - ldrb r0, [r1]\n\ - mov r2, #0x2\n\ -._111:\n\ - eor r0, r0, r2\n\ - strb r0, [r1]\n\ - ldrb r0, [r4]\n\ - add r0, r0, r5\n\ - ldrb r0, [r0]\n\ - mov r1, #0x0\n\ - bl sub_802E3E4\n\ - b ._129\n\ -._123:\n\ - .align 2, 0\n\ -._122:\n\ - .word gActionSelectionCursor\n\ - .word gActiveBank\n\ -._119:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._124 @cond_branch\n\ - ldr r0, ._127\n\ - ldrb r2, [r0]\n\ - lsl r0, r2, #0x1\n\ - add r0, r0, r2\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._127 + 4\n\ - add r0, r0, r1\n\ - ldrb r1, [r0]\n\ - add r0, r3, #0\n\ - and r0, r0, r1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._129 @cond_branch\n\ - str r0, [sp]\n\ - add r0, r2, #0\n\ - add r1, r2, #0\n\ - mov r3, #0x4\n\ - bl move_anim_start_t3\n\ - b ._129\n\ -._128:\n\ - .align 2, 0\n\ -._127:\n\ - .word gActiveBank\n\ - .word +0x2017810\n\ -._124:\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._129 @cond_branch\n\ - bl sub_804454C\n\ -._129:\n\ - add sp, sp, #0x4\n\ - pop {r4, r5}\n\ - pop {r0}\n\ - bx r0"); -} -#else void bx_battle_menu_t6_2(void) { if (gMain.newKeys & A_BUTTON) @@ -502,8 +273,18 @@ void bx_battle_menu_t6_2(void) sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); } } -} +#if DEBUG + else if (gMain.newKeys & R_BUTTON) + { + if (!ewram17810[gActiveBank].unk0_5) + move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, 4, 0); + } + else if (gMain.newKeys & START_BUTTON) + { + sub_804454C(); + } #endif +} void sub_812B65C(void) { diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c index b703bc7b8..9be026d53 100644 --- a/src/battle/battle_interface.c +++ b/src/battle/battle_interface.c @@ -1277,353 +1277,8 @@ _08044548: .4byte 0x04000008\n\ } #endif -#if DEBUG -__attribute__((naked)) -void sub_804454C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x0\n" - " mov r8, r0\n" - " ldr r0, ._150\n" - " ldrb r0, [r0]\n" - " cmp r8, r0\n" - " blt ._133 @cond_branch\n" - " b ._164\n" - "._133:\n" - " ldr r1, ._150 + 4\n" - " mov r9, r1\n" - " mov r2, #0x64\n" - " mov sl, r2\n" - " ldr r7, ._150 + 8\n" - "._165:\n" - " ldr r0, ._150 + 12\n" - " mov r6, r8\n" - " add r5, r6, r0\n" - " ldrb r1, [r5]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " mov r1, r9\n" - " add r1, r1, #0x1c\n" - " add r0, r0, r1\n" - " ldr r1, [r0]\n" - " ldr r0, ._150 + 16\n" - " cmp r1, r0\n" - " beq ._135 @cond_branch\n" - " b ._147\n" - "._135:\n" - " ldr r0, ._150 + 20\n" - " ldrb r0, [r0]\n" - " lsl r4, r6, #0x18\n" - " cmp r0, #0\n" - " bne ._138 @cond_branch\n" - " lsr r0, r4, #0x18\n" - " bl GetBankSide\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._138 @cond_branch\n" - " b ._147\n" - "._138:\n" - " bl IsDoubleBattle\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._141 @cond_branch\n" - " lsr r0, r4, #0x18\n" - " bl GetBankSide\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._141 @cond_branch\n" - " b ._147\n" - "._141:\n" - " mov r0, r8\n" - " lsl r3, r0, #0x2\n" - " ldr r0, ._150 + 24\n" - " add r3, r3, r0\n" - " ldr r0, [r3]\n" - " lsl r0, r0, #0x1b\n" - " lsr r0, r0, #0x1f\n" - " mov r2, #0x1\n" - " eor r2, r2, r0\n" - " lsl r2, r2, #0x4\n" - " ldrb r0, [r3]\n" - " mov r6, #0x11\n" - " neg r6, r6\n" - " add r1, r6, #0\n" - " and r0, r0, r1\n" - " orr r0, r0, r2\n" - " strb r0, [r3]\n" - " ldr r0, [r3]\n" - " lsl r0, r0, #0x1b\n" - " lsr r6, r0, #0x1f\n" - " lsr r0, r4, #0x18\n" - " bl GetBankSide\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._143 @cond_branch\n" - " bl IsDoubleBattle\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._144 @cond_branch\n" - " b ._147\n" - "._144:\n" - " ldr r0, ._150 + 28\n" - " ldrh r1, [r0]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r2, r0, #0x10\n" - " cmp r2, #0\n" - " beq ._146 @cond_branch\n" - " b ._147\n" - "._146:\n" - " cmp r6, #0x1\n" - " bne ._148 @cond_branch\n" - " ldrb r1, [r5]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r9\n" - " ldrh r0, [r0, #0x38]\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " str r2, [sp]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r9\n" - " ldrh r1, [r0, #0x4]\n" - " lsl r1, r1, #0x16\n" - " lsr r1, r1, #0x11\n" - " ldr r0, ._150 + 32\n" - " add r1, r1, r0\n" - " mov r0, sp\n" - " ldr r2, ._150 + 36\n" - " bl CpuSet\n" - " ldrb r4, [r5]\n" - " ldrh r0, [r7]\n" - " mov r1, sl\n" - " mul r1, r1, r0\n" - " add r0, r1, #0\n" - " ldr r2, ._150 + 40\n" - " add r0, r0, r2\n" - " mov r1, #0x39\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " mov r2, #0x0\n" - " bl sub_8044210\n" - " ldrb r4, [r5]\n" - " ldrh r0, [r7]\n" - " mov r6, sl\n" - " mul r6, r6, r0\n" - " add r0, r6, #0\n" - " ldr r1, ._150 + 40\n" - " b ._149\n" - "._151:\n" - " .align 2, 0\n" - "._150:\n" - " .word gNoOfAllBanks\n" - " .word gSprites\n" - " .word gBattlePartyID\n" - " .word gHealthboxIDs\n" - " .word SpriteCallbackDummy+1\n" - " .word gUnknown_020297ED\n" - " .word +0x2017800\n" - " .word gBattleTypeFlags\n" - " .word 0x6010000\n" - " .word 0x5000040\n" - " .word gPlayerParty\n" - "._148:\n" - " ldrb r0, [r5]\n" - " bl draw_status_ailment_maybe\n" - " ldrb r0, [r5]\n" - " ldrh r1, [r7]\n" - " mov r2, sl\n" - " mul r2, r2, r1\n" - " add r1, r2, #0\n" - " ldr r6, ._153\n" - " add r1, r1, r6\n" - " mov r2, #0x5\n" - " bl sub_8045A5C\n" - " mov r0, #0x75\n" - " bl sub_8043CDC\n" - " ldrb r2, [r5]\n" - " lsl r1, r2, #0x4\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r9\n" - " ldrh r1, [r1, #0x4]\n" - " lsl r1, r1, #0x16\n" - " lsr r1, r1, #0x11\n" - " ldr r2, ._153 + 4\n" - " add r1, r1, r2\n" - " ldr r2, ._153 + 8\n" - " bl CpuSet\n" - " b ._163\n" - "._154:\n" - " .align 2, 0\n" - "._153:\n" - " .word gPlayerParty\n" - " .word 0x6010680\n" - " .word 0x4000008\n" - "._143:\n" - " cmp r6, #0x1\n" - " bne ._155 @cond_branch\n" - " ldr r0, ._158\n" - " ldrh r1, [r0]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x10\n" - " lsr r2, r0, #0x10\n" - " cmp r2, #0\n" - " beq ._156 @cond_branch\n" - " ldrb r0, [r5]\n" - " ldrh r1, [r7]\n" - " mov r6, sl\n" - " mul r6, r6, r1\n" - " add r1, r6, #0\n" - " ldr r2, ._158 + 4\n" - " add r1, r1, r2\n" - " bl sub_8044338\n" - " b ._163\n" - "._159:\n" - " .align 2, 0\n" - "._158:\n" - " .word gBattleTypeFlags\n" - " .word gEnemyParty\n" - "._156:\n" - " ldrb r1, [r5]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r9\n" - " ldrh r0, [r0, #0x38]\n" - " lsl r0, r0, #0x18\n" - " lsr r1, r0, #0x18\n" - " str r2, [sp]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r9\n" - " ldrh r1, [r0, #0x4]\n" - " lsl r1, r1, #0x16\n" - " lsr r1, r1, #0x11\n" - " ldr r6, ._161\n" - " add r1, r1, r6\n" - " mov r0, sp\n" - " ldr r2, ._161 + 4\n" - " bl CpuSet\n" - " ldrb r4, [r5]\n" - " ldrh r0, [r7]\n" - " mov r1, sl\n" - " mul r1, r1, r0\n" - " add r0, r1, #0\n" - " ldr r2, ._161 + 8\n" - " add r0, r0, r2\n" - " mov r1, #0x39\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " mov r2, #0x0\n" - " bl sub_8044210\n" - " ldrb r4, [r5]\n" - " ldrh r0, [r7]\n" - " mov r6, sl\n" - " mul r6, r6, r0\n" - " add r0, r6, #0\n" - " ldr r1, ._161 + 8\n" - "._149:\n" - " add r0, r0, r1\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " add r0, r4, #0\n" - " mov r2, #0x1\n" - " bl sub_8044210\n" - " b ._163\n" - "._162:\n" - " .align 2, 0\n" - "._161:\n" - " .word 0x6010000\n" - " .word 0x5000040\n" - " .word gEnemyParty\n" - "._155:\n" - " ldrb r0, [r5]\n" - " bl draw_status_ailment_maybe\n" - " ldrb r0, [r5]\n" - " ldrh r1, [r7]\n" - " mov r6, #0x64\n" - " mul r1, r1, r6\n" - " ldr r4, ._166\n" - " add r1, r1, r4\n" - " mov r2, #0x5\n" - " bl sub_8045A5C\n" - " ldr r0, ._166 + 4\n" - " ldrh r1, [r0]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._163 @cond_branch\n" - " ldrb r0, [r5]\n" - " ldrh r1, [r7]\n" - " mul r1, r1, r6\n" - " add r1, r1, r4\n" - " mov r2, #0x4\n" - " bl sub_8045A5C\n" - "._163:\n" - " ldr r0, ._166 + 8\n" - " add r0, r0, r8\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r9\n" - " ldrh r1, [r0, #0x3c]\n" - " mov r2, #0x1\n" - " eor r1, r1, r2\n" - " strh r1, [r0, #0x3c]\n" - "._147:\n" - " add r7, r7, #0x2\n" - " mov r2, #0x1\n" - " add r8, r8, r2\n" - " ldr r0, ._166 + 12\n" - " ldrb r0, [r0]\n" - " cmp r8, r0\n" - " bge ._164 @cond_branch\n" - " b ._165\n" - "._164:\n" - " add sp, sp, #0x4\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._167:\n" - " .align 2, 0\n" - "._166:\n" - " .word gEnemyParty\n" - " .word gBattleTypeFlags\n" - " .word gHealthboxIDs\n" - " .word gNoOfAllBanks\n" - "\n" - ); -} -#else +extern u8 gUnknown_020297ED; + void sub_804454C(void) { s32 i; @@ -1632,7 +1287,11 @@ void sub_804454C(void) for (i = 0; i < gNoOfAllBanks; i++) { if (gSprites[gHealthboxIDs[i]].callback == SpriteCallbackDummy +#if DEBUG + && (gUnknown_020297ED != 0 || GetBankSide(i) != 1) +#else && GetBankSide(i) != 1 +#endif && (IsDoubleBattle() || GetBankSide(i) != 0)) { u8 r6; @@ -1691,7 +1350,6 @@ void sub_804454C(void) } } } -#endif // This function almost matches except for just two instructions around 0x08044B52 that are swapped. #ifdef NONMATCHING @@ -3045,310 +2703,6 @@ static u8 sub_80457E8(u8 a, u8 b) } } -#if DEBUG -__attribute__((naked)) -void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffff8\n" - " mov r9, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - " lsl r2, r2, #0x18\n" - " lsr r7, r2, #0x18\n" - " ldr r1, ._429\n" - " lsl r0, r0, #0x4\n" - " add r0, r0, r8\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldrh r0, [r0, #0x3a]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov sl, r0\n" - " bl GetBankSide\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._410 @cond_branch\n" - " b ._411\n" - "._410:\n" - " cmp r7, #0x3\n" - " beq ._412 @cond_branch\n" - " cmp r7, #0\n" - " bne ._413 @cond_branch\n" - "._412:\n" - " mov r0, r9\n" - " mov r1, #0x38\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " mov r0, r8\n" - " bl sub_8043FC0\n" - "._413:\n" - " cmp r7, #0x1\n" - " bhi ._414 @cond_branch\n" - " mov r0, r9\n" - " mov r1, #0x39\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " mov r0, r8\n" - " mov r2, #0x0\n" - " bl sub_80440EC\n" - "._414:\n" - " cmp r7, #0x2\n" - " beq ._415 @cond_branch\n" - " cmp r7, #0\n" - " bne ._416 @cond_branch\n" - "._415:\n" - " mov r0, r9\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " mov r0, r8\n" - " mov r2, #0x1\n" - " bl sub_80440EC\n" - "._416:\n" - " cmp r7, #0x5\n" - " beq ._417 @cond_branch\n" - " cmp r7, #0\n" - " bne ._418 @cond_branch\n" - "._417:\n" - " mov r0, #0x0\n" - " bl load_gfxc_health_bar\n" - " mov r0, r9\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " add r4, r0, #0\n" - " mov r0, r9\n" - " mov r1, #0x39\n" - " bl GetMonData\n" - " add r3, r0, #0\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, sl\n" - " mov r1, r8\n" - " add r2, r4, #0\n" - " bl sub_8043D84\n" - " mov r0, sl\n" - " mov r1, r8\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " bl sub_8045C78\n" - "._418:\n" - " bl IsDoubleBattle\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " str r0, [sp, #0x4]\n" - " cmp r0, #0\n" - " bne ._421 @cond_branch\n" - " cmp r7, #0x6\n" - " beq ._420 @cond_branch\n" - " cmp r7, #0\n" - " bne ._421 @cond_branch\n" - "._420:\n" - " mov r0, #0x3\n" - " bl load_gfxc_health_bar\n" - " mov r0, r9\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x10\n" - " lsr r5, r5, #0x10\n" - " mov r0, r9\n" - " mov r1, #0x38\n" - " bl GetMonData\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " mov r0, r9\n" - " mov r1, #0x19\n" - " bl GetMonData\n" - " add r3, r0, #0\n" - " ldr r6, ._429 + 4\n" - " lsl r1, r4, #0x2\n" - " ldr r2, ._429 + 8\n" - " lsl r0, r5, #0x3\n" - " sub r0, r0, r5\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r2\n" - " ldrb r2, [r0, #0x13]\n" - " mov r0, #0xca\n" - " lsl r0, r0, #0x1\n" - " mul r0, r0, r2\n" - " add r1, r1, r0\n" - " add r1, r1, r6\n" - " ldr r1, [r1]\n" - " sub r3, r3, r1\n" - " add r4, r4, #0x1\n" - " lsl r4, r4, #0x2\n" - " add r4, r4, r0\n" - " add r4, r4, r6\n" - " ldr r2, [r4]\n" - " sub r2, r2, r1\n" - " ldr r0, [sp, #0x4]\n" - " str r0, [sp]\n" - " mov r0, sl\n" - " mov r1, r8\n" - " bl sub_8043D84\n" - " mov r0, sl\n" - " mov r1, r8\n" - " mov r2, #0x1\n" - " mov r3, #0x0\n" - " bl sub_8045C78\n" - "._421:\n" - " cmp r7, #0x4\n" - " beq ._422 @cond_branch\n" - " cmp r7, #0\n" - " bne ._423 @cond_branch\n" - "._422:\n" - " mov r0, r8\n" - " mov r1, r9\n" - " bl sub_80451A0\n" - "._423:\n" - " cmp r7, #0x9\n" - " beq ._424 @cond_branch\n" - " cmp r7, #0\n" - " bne ._425 @cond_branch\n" - "._424:\n" - " mov r0, r8\n" - " bl draw_status_ailment_maybe\n" - "._425:\n" - " cmp r7, #0xa\n" - " bne ._426 @cond_branch\n" - " mov r0, r8\n" - " bl sub_80458B0\n" - "._426:\n" - " add r0, r7, #0\n" - " sub r0, r0, #0xa\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bhi ._442 @cond_branch\n" - " mov r0, r8\n" - " bl sub_8045998\n" - " b ._442\n" - "._430:\n" - " .align 2, 0\n" - "._429:\n" - " .word gSprites\n" - " .word gExperienceTables\n" - " .word gBaseStats\n" - "._411:\n" - " cmp r7, #0x3\n" - " beq ._431 @cond_branch\n" - " cmp r7, #0\n" - " bne ._432 @cond_branch\n" - "._431:\n" - " mov r0, r9\n" - " mov r1, #0x38\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " mov r0, r8\n" - " bl sub_8043FC0\n" - "._432:\n" - " ldr r0, ._443\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x1\n" - " bne ._436 @cond_branch\n" - " cmp r7, #0x1\n" - " bhi ._434 @cond_branch\n" - " mov r0, r9\n" - " mov r1, #0x39\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " mov r0, r8\n" - " mov r2, #0x0\n" - " bl sub_80440EC\n" - "._434:\n" - " cmp r7, #0x2\n" - " beq ._435 @cond_branch\n" - " cmp r7, #0\n" - " bne ._436 @cond_branch\n" - "._435:\n" - " mov r0, r9\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " mov r0, r8\n" - " mov r2, #0x1\n" - " bl sub_80440EC\n" - "._436:\n" - " cmp r7, #0x5\n" - " beq ._437 @cond_branch\n" - " cmp r7, #0\n" - " bne ._438 @cond_branch\n" - "._437:\n" - " mov r0, #0x0\n" - " bl load_gfxc_health_bar\n" - " mov r0, r9\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " add r4, r0, #0\n" - " mov r0, r9\n" - " mov r1, #0x39\n" - " bl GetMonData\n" - " add r3, r0, #0\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, sl\n" - " mov r1, r8\n" - " add r2, r4, #0\n" - " bl sub_8043D84\n" - " mov r0, sl\n" - " mov r1, r8\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " bl sub_8045C78\n" - "._438:\n" - " cmp r7, #0x4\n" - " beq ._439 @cond_branch\n" - " cmp r7, #0\n" - " bne ._440 @cond_branch\n" - "._439:\n" - " mov r0, r8\n" - " mov r1, r9\n" - " bl sub_80451A0\n" - "._440:\n" - " cmp r7, #0x9\n" - " beq ._441 @cond_branch\n" - " cmp r7, #0\n" - " bne ._442 @cond_branch\n" - "._441:\n" - " mov r0, r8\n" - " bl draw_status_ailment_maybe\n" - "._442:\n" - " add sp, sp, #0x8\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._444:\n" - " .align 2, 0\n" - "._443:\n" - " .word gUnknown_020297ED\n" - "\n" - ); -} -#else void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) { u8 r10; @@ -3404,6 +2758,15 @@ void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) { if (c == 3 || c == 0) sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL)); +#if DEBUG + if (gUnknown_020297ED == 1) + { + if (c == 1 || c == 0) + sub_80440EC(a, GetMonData(pkmn, MON_DATA_HP), 0); + if (c == 2 || c == 0) + sub_80440EC(a, GetMonData(pkmn, MON_DATA_MAX_HP), 1); + } +#endif if (c == 5 || c == 0) { load_gfxc_health_bar(0); @@ -3418,7 +2781,6 @@ void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c) draw_status_ailment_maybe(a); } } -#endif s32 sub_8045C78(u8 a, u8 unused1, u8 c, u8 unused2) { diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c index 6f187ad71..41579fa28 100644 --- a/src/pokemon/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -525,324 +525,49 @@ void CalculateMonStats(struct Pokemon *mon) } #if DEBUG -__attribute__((naked)) -void debug_sub_803F55C() +void debug_sub_803F55C(struct Pokemon *mon) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xffffffc4\n" - " add r5, r0, #0\n" - " mov r1, #0x39\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " str r0, [sp, #0x1c]\n" - " add r0, r5, #0\n" - " mov r1, #0x27\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " add r7, r0, #0\n" - " add r0, r5, #0\n" - " mov r1, #0x1a\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " add r4, r0, #0\n" - " add r0, r5, #0\n" - " mov r1, #0x28\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " mov r9, r0\n" - " add r0, r5, #0\n" - " mov r1, #0x1b\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " mov r8, r0\n" - " add r0, r5, #0\n" - " mov r1, #0x29\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " str r0, [sp, #0x20]\n" - " add r0, r5, #0\n" - " mov r1, #0x1c\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " mov sl, r0\n" - " add r0, r5, #0\n" - " mov r1, #0x2a\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " str r0, [sp, #0x24]\n" - " add r0, r5, #0\n" - " mov r1, #0x1d\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " str r0, [sp, #0x28]\n" - " add r0, r5, #0\n" - " mov r1, #0x2b\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " str r0, [sp, #0x2c]\n" - " add r0, r5, #0\n" - " mov r1, #0x1e\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " str r0, [sp, #0x30]\n" - " add r0, r5, #0\n" - " mov r1, #0x2c\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " str r0, [sp, #0x34]\n" - " add r0, r5, #0\n" - " mov r1, #0x1f\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " str r0, [sp, #0x38]\n" - " add r0, r5, #0\n" - " mov r1, #0xb\n" - " mov r2, #0x0\n" - " bl GetMonData\n" - " lsl r0, r0, #0x10\n" - " lsr r6, r0, #0x10\n" - " add r0, r5, #0\n" - " bl GetLevelFromMonExp\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " mov r1, #0x38\n" - " mov r2, sp\n" - " bl SetMonData\n" - " ldr r0, ._71\n" - " cmp r6, r0\n" - " bne ._69 @cond_branch\n" - " mov r0, #0x1\n" - " str r0, [sp, #0x4]\n" - " lsl r7, r6, #0x3\n" - " b ._70\n" - "._72:\n" - " .align 2, 0\n" - "._71:\n" - " .word 0x12f\n" - "._69:\n" - " ldr r1, ._80\n" - " lsl r2, r6, #0x3\n" - " sub r0, r2, r6\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x1\n" - " add r1, r0, r7\n" - " add r0, r4, #0\n" - " add r7, r2, #0\n" - " cmp r0, #0\n" - " bge ._73 @cond_branch\n" - " add r0, r0, #0x3\n" - "._73:\n" - " asr r0, r0, #0x2\n" - " add r0, r1, r0\n" - " ldr r4, [sp]\n" - " mul r0, r0, r4\n" - " mov r1, #0x64\n" - " bl __divsi3\n" - " add r0, r0, r4\n" - " add r0, r0, #0xa\n" - " str r0, [sp, #0x4]\n" - "._70:\n" - " add r2, sp, #0x4\n" - " add r0, r5, #0\n" - " mov r1, #0x3a\n" - " bl SetMonData\n" - " ldr r1, ._80\n" - " sub r0, r7, r6\n" - " lsl r0, r0, #0x2\n" - " add r6, r0, r1\n" - " ldrb r0, [r6, #0x1]\n" - " lsl r0, r0, #0x1\n" - " mov r2, r9\n" - " add r1, r0, r2\n" - " mov r0, r8\n" - " cmp r0, #0\n" - " bge ._74 @cond_branch\n" - " add r0, r0, #0x3\n" - "._74:\n" - " asr r0, r0, #0x2\n" - " add r0, r1, r0\n" - " ldr r1, [sp]\n" - " mul r0, r0, r1\n" - " mov r1, #0x64\n" - " bl __divsi3\n" - " add r0, r0, #0x5\n" - " str r0, [sp, #0x8]\n" - " add r0, r5, #0\n" - " bl GetNature\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r4, sp, #0x8\n" - " ldrh r1, [r4]\n" - " mov r2, #0x1\n" - " bl nature_stat_mod\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " str r0, [sp, #0x8]\n" - " add r0, r5, #0\n" - " mov r1, #0x3b\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " ldrb r0, [r6, #0x2]\n" - " lsl r0, r0, #0x1\n" - " ldr r2, [sp, #0x20]\n" - " add r1, r0, r2\n" - " mov r0, sl\n" - " cmp r0, #0\n" - " bge ._75 @cond_branch\n" - " add r0, r0, #0x3\n" - "._75:\n" - " asr r0, r0, #0x2\n" - " add r0, r1, r0\n" - " ldr r1, [sp]\n" - " mul r0, r0, r1\n" - " mov r1, #0x64\n" - " bl __divsi3\n" - " add r0, r0, #0x5\n" - " str r0, [sp, #0xc]\n" - " add r0, r5, #0\n" - " bl GetNature\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r4, sp, #0xc\n" - " ldrh r1, [r4]\n" - " mov r2, #0x2\n" - " bl nature_stat_mod\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " str r0, [sp, #0xc]\n" - " add r0, r5, #0\n" - " mov r1, #0x3c\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " ldrb r0, [r6, #0x3]\n" - " lsl r0, r0, #0x1\n" - " ldr r2, [sp, #0x24]\n" - " add r1, r0, r2\n" - " ldr r0, [sp, #0x28]\n" - " cmp r0, #0\n" - " bge ._76 @cond_branch\n" - " add r0, r0, #0x3\n" - "._76:\n" - " asr r0, r0, #0x2\n" - " add r0, r1, r0\n" - " ldr r1, [sp]\n" - " mul r0, r0, r1\n" - " mov r1, #0x64\n" - " bl __divsi3\n" - " add r0, r0, #0x5\n" - " str r0, [sp, #0x10]\n" - " add r0, r5, #0\n" - " bl GetNature\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r4, sp, #0x10\n" - " ldrh r1, [r4]\n" - " mov r2, #0x3\n" - " bl nature_stat_mod\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " str r0, [sp, #0x10]\n" - " add r0, r5, #0\n" - " mov r1, #0x3d\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " ldrb r0, [r6, #0x4]\n" - " lsl r0, r0, #0x1\n" - " ldr r2, [sp, #0x2c]\n" - " add r1, r0, r2\n" - " ldr r0, [sp, #0x30]\n" - " cmp r0, #0\n" - " bge ._77 @cond_branch\n" - " add r0, r0, #0x3\n" - "._77:\n" - " asr r0, r0, #0x2\n" - " add r0, r1, r0\n" - " ldr r1, [sp]\n" - " mul r0, r0, r1\n" - " mov r1, #0x64\n" - " bl __divsi3\n" - " add r0, r0, #0x5\n" - " str r0, [sp, #0x14]\n" - " add r0, r5, #0\n" - " bl GetNature\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r4, sp, #0x14\n" - " ldrh r1, [r4]\n" - " mov r2, #0x4\n" - " bl nature_stat_mod\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " str r0, [sp, #0x14]\n" - " add r0, r5, #0\n" - " mov r1, #0x3e\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " ldrb r0, [r6, #0x5]\n" - " lsl r0, r0, #0x1\n" - " ldr r1, [sp, #0x34]\n" - " add r2, r0, r1\n" - " ldr r0, [sp, #0x38]\n" - " cmp r0, #0\n" - " bge ._78 @cond_branch\n" - " add r0, r0, #0x3\n" - "._78:\n" - " asr r0, r0, #0x2\n" - " add r0, r2, r0\n" - " ldr r1, [sp]\n" - " mul r0, r0, r1\n" - " mov r1, #0x64\n" - " bl __divsi3\n" - " add r0, r0, #0x5\n" - " str r0, [sp, #0x18]\n" - " add r0, r5, #0\n" - " bl GetNature\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " add r4, sp, #0x18\n" - " ldrh r1, [r4]\n" - " mov r2, #0x5\n" - " bl nature_stat_mod\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " str r0, [sp, #0x18]\n" - " add r0, r5, #0\n" - " mov r1, #0x3f\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " ldr r1, [sp, #0x4]\n" - " ldr r0, [sp, #0x1c]\n" - " cmp r1, r0\n" - " bge ._79 @cond_branch\n" - " str r1, [sp, #0x1c]\n" - "._79:\n" - " add r2, sp, #0x1c\n" - " add r0, r5, #0\n" - " mov r1, #0x39\n" - " bl SetMonData\n" - " add sp, sp, #0x3c\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._81:\n" - " .align 2, 0\n" - "._80:\n" - " .word gBaseStats\n" - "\n" - ); + s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); + s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); + s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); + s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); + s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); + s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); + s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); + s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); + s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); + s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); + s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); + s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); + s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + s32 level = GetLevelFromMonExp(mon); + s32 newMaxHP; + + SetMonData(mon, MON_DATA_LEVEL, &level); + + if (species == SPECIES_SHEDINJA) + { + newMaxHP = 1; + } + else + { + s32 n = 2 * gBaseStats[species].baseHP + hpIV; + newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; + } + + SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); + + CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) + CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) + CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED) + CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) + CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) + + if (newMaxHP < currentHP) + currentHP = newMaxHP; + + SetMonData(mon, MON_DATA_HP, ¤tHP); } #endif diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c index 8e1bd1671..532340ce4 100644 --- a/src/pokemon/pokemon_menu.c +++ b/src/pokemon/pokemon_menu.c @@ -31,6 +31,7 @@ #include "item_menu.h" #include "player_pc.h" #include "ewram.h" +#include "script.h" /* Pokemon menu: @@ -45,6 +46,7 @@ struct PokeMenuFieldMoveFunc u8 field_1; }; +extern u8 gUnknown_020297ED; extern u8 gUnknown_020384F0; extern u8 gUnknown_0202E8F4; extern u8 gUnknown_0202E8F5; @@ -900,9 +902,10 @@ static void sub_808AE08(void) static bool8 SetUpFieldMove_Waterfall(void) { s16 x, y; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE - && IsPlayerSurfingNorth() == TRUE) + && IsPlayerSurfingNorth() == TRUE) { gFieldCallback = FieldCallback_Teleport; gUnknown_03005CE4 = sub_808AE08; @@ -913,138 +916,19 @@ static bool8 SetUpFieldMove_Waterfall(void) } #if DEBUG -__attribute__((naked)) -void debug_sub_80986AC() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - mov r4, sp\n\ - add r4, r4, #0x2\n\ - mov r0, sp\n\ - add r1, r4, #0\n\ - bl GetXYCoordsOneStepInFrontOfPlayer\n\ - mov r0, sp\n\ - mov r1, #0x0\n\ - ldsh r0, [r0, r1]\n\ - mov r2, #0x0\n\ - ldsh r1, [r4, r2]\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl MetatileBehavior_IsWaterfall\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bne ._274 @cond_branch\n\ - bl IsPlayerSurfingNorth\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bne ._274 @cond_branch\n\ - bl sub_808AE08\n\ - b ._275\n\ -._274:\n\ - bl ScriptContext2_Disable\n\ -._275:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0"); +void debug_sub_80986AC(void) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE + && IsPlayerSurfingNorth() == TRUE) + sub_808AE08(); + else + ScriptContext2_Disable(); } #endif -#if DEBUG -__attribute__((naked)) -static void sub_808AE8C(void) -{ - asm("\ - push {r4, r5, r6, lr}\n\ - ldr r0, ._281\n\ - ldrb r0, [r0]\n\ - sub r0, r0, #0x21\n\ - lsl r0, r0, #0x18\n\ - lsr r6, r0, #0x18\n\ - mov r5, #0x0\n\ -._287:\n\ - mov r0, #0x64\n\ - add r1, r5, #0\n\ - mul r1, r1, r0\n\ - ldr r0, ._281 + 4\n\ - add r4, r1, r0\n\ - add r0, r4, #0\n\ - mov r1, #0xb\n\ - bl GetMonData\n\ - cmp r0, #0\n\ - beq ._284 @cond_branch\n\ - add r0, r5, #0\n\ - bl sub_806D668\n\ - ldr r0, ._281 + 8\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._279 @cond_branch\n\ - add r0, r4, #0\n\ - mov r1, #0x2d\n\ - bl GetMonData\n\ - cmp r0, #0\n\ - bne ._278 @cond_branch\n\ - add r0, r4, #0\n\ - add r1, r6, #0\n\ - bl CanMonLearnTMHM\n\ - cmp r0, #0\n\ - bne ._279 @cond_branch\n\ -._278:\n\ - add r0, r5, #0\n\ - mov r1, #0x9a\n\ - bl sub_806BC3C\n\ - b ._284\n\ -._282:\n\ - .align 2, 0\n\ -._281:\n\ - .word gSpecialVar_ItemId\n\ - .word gPlayerParty\n\ - .word gUnknown_020297ED\n\ -._279:\n\ - mov r0, #0x64\n\ - add r4, r5, #0\n\ - mul r4, r4, r0\n\ - ldr r0, ._285\n\ - add r4, r4, r0\n\ - ldr r0, ._285 + 4\n\ - ldrh r0, [r0]\n\ - bl ItemIdToBattleMoveId\n\ - add r1, r0, #0\n\ - lsl r1, r1, #0x10\n\ - lsr r1, r1, #0x10\n\ - add r0, r4, #0\n\ - bl pokemon_has_move\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._283 @cond_branch\n\ - add r0, r5, #0\n\ - mov r1, #0xa8\n\ - bl sub_806BC3C\n\ - b ._284\n\ -._286:\n\ - .align 2, 0\n\ -._285:\n\ - .word gPlayerParty\n\ - .word gSpecialVar_ItemId\n\ -._283:\n\ - add r0, r5, #0\n\ - mov r1, #0x8c\n\ - bl sub_806BC3C\n\ -._284:\n\ - add r0, r5, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r5, r0, #0x18\n\ - cmp r5, #0x5\n\ - bls ._287 @cond_branch\n\ - pop {r4, r5, r6}\n\ - pop {r0}\n\ - bx r0"); -} -#else static void sub_808AE8C(void) { u8 i; @@ -1054,7 +938,11 @@ static void sub_808AE8C(void) if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) { sub_806D668(i); - if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg)) + if ( +#if DEBUG + gUnknown_020297ED == 0 && +#endif + (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg))) sub_806BC3C(i, 0x9A); else if (pokemon_has_move(&gPlayerParty[i], ItemIdToBattleMoveId(gSpecialVar_ItemId))) sub_806BC3C(i, 0xA8); @@ -1063,7 +951,6 @@ static void sub_808AE8C(void) } } } -#endif static void sub_808AF20(void) { -- cgit v1.2.3 From 33d2d51906bbde1c62cee3470a9b3706571d551c Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 25 Jan 2018 21:33:46 -0600 Subject: decompile more debug functions --- src/battle/battle_2.c | 237 +++++++++++++------------------------------------ src/battle/battle_ai.c | 217 ++------------------------------------------ 2 files changed, 69 insertions(+), 385 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index f9756db29..e72a875fb 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -6,6 +6,7 @@ #include "constants/moves.h" #include "constants/songs.h" #include "constants/species.h" +#include "gba/flash_internal.h" #include "battle.h" #include "battle_ai.h" #include "battle_interface.h" @@ -1500,6 +1501,17 @@ void debug_sub_80108B8(void) } } +// This function matches, but it somehow affects registers in SetActionsAndBanksTurnOrder. +#ifdef NONMATCHING +void debug_sub_8010A7C(u8 a, u8 b) +{ + s32 i; + + for (i = 0; i < b; i++) + gBattleTextBuff1[i] = a; + gBattleTextBuff1[i] = EOS; +} +#else __attribute__((naked)) void debug_sub_8010A7C() { @@ -1534,6 +1546,14 @@ void debug_sub_8010A7C() "\n" ); } +#endif + +/* +void debug_sub_8010AAC(u8 a) +{ + u32 r7 = gUnknown_Debug_030043A4 * 5; +} +*/ __attribute__((naked)) void debug_sub_8010AAC() @@ -3898,72 +3918,19 @@ void debug_sub_801174C() ); } -__attribute__((naked)) -void debug_sub_8011D40() +void debug_sub_8011D40(void) { - asm( - " push {lr}\n" - " ldr r1, ._774\n" - " ldr r0, ._774 + 4\n" - " str r0, [r1]\n" - " ldr r0, ._774 + 8\n" - " str r0, [r1, #0x4]\n" - " ldr r0, ._774 + 12\n" - " str r0, [r1, #0x8]\n" - " ldr r0, [r1, #0x8]\n" - " sub r1, r1, #0xc4\n" - " ldr r0, ._774 + 16\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._774 + 20\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._774 + 24\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._774 + 28\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._774 + 32\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._774 + 36\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._774 + 40\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " add r1, r1, #0x2\n" - " ldr r0, ._774 + 44\n" - " ldrh r0, [r0]\n" - " strh r0, [r1]\n" - " bl LoadOam\n" - " bl ProcessSpriteCopyRequests\n" - " pop {r0}\n" - " bx r0\n" - "._775:\n" - " .align 2, 0\n" - "._774:\n" - " .word 0x40000d4\n" - " .word gSharedMem\n" - " .word 0x6004000\n" - " .word 0x80000800\n" - " .word gBattle_BG0_X\n" - " .word gBattle_BG0_Y\n" - " .word gBattle_BG1_X\n" - " .word gBattle_BG1_Y\n" - " .word gBattle_BG2_X\n" - " .word gBattle_BG2_Y\n" - " .word gBattle_BG3_X\n" - " .word gBattle_BG3_Y\n" - "\n" - ); + DmaCopy16(3, gSharedMem, (void *)(VRAM + 0x4000), 0x1000); + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; + REG_BG1HOFS = gBattle_BG1_X; + REG_BG1VOFS = gBattle_BG1_Y; + REG_BG2HOFS = gBattle_BG2_X; + REG_BG2VOFS = gBattle_BG2_Y; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; + LoadOam(); + ProcessSpriteCopyRequests(); } void debug_nullsub_45() @@ -6517,125 +6484,45 @@ void debug_sub_8012D10() ); } -__attribute__((naked)) -void debug_sub_8013240() +u8 debug_sub_8013240(void) { - asm( - " push {lr}\n" - " bl IdentifyFlash\n" - " lsl r0, r0, #0x10\n" - " cmp r0, #0\n" - " beq ._1068 @cond_branch\n" - " mov r0, #0x1\n" - " b ._1069\n" - "._1068:\n" - " mov r0, #0x0\n" - "._1069:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + if (IdentifyFlash() == 0) + return 0; + else + return 1; } -__attribute__((naked)) -void debug_sub_8013258() +u32 debug_sub_8013258(u16 sectorNum, u8 *data, u32 size) { - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r1, #0\n" - " add r5, r2, #0\n" - " b ._1070\n" - "._1072:\n" - " ldr r0, ._1074\n" - " add r5, r5, r0\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x5\n" - " add r6, r6, r0\n" - " add r0, r4, #1\n" - "._1070:\n" - " lsl r0, r0, #0x10\n" - " lsr r4, r0, #0x10\n" - " add r0, r4, #0\n" - " add r1, r6, #0\n" - " bl ProgramFlashSectorAndVerify\n" - " cmp r0, #0\n" - " bne ._1071 @cond_branch\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x5\n" - " cmp r5, r0\n" - " bhi ._1072 @cond_branch\n" - " mov r0, #0x1\n" - " b ._1073\n" - "._1075:\n" - " .align 2, 0\n" - "._1074:\n" - " .word 0xfffff000\n" - "._1071:\n" - " mov r0, #0x0\n" - "._1073:\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + while (1) + { + if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) + return 0; + if (size <= 0x1000) + break; + size -= 0x1000; + data += 0x1000; + sectorNum++; + } + return 1; } -__attribute__((naked)) -void debug_sub_8013294() +u32 debug_sub_8013294(u8 sectorNum, void *data, u32 size) { - asm( - " push {r4, r5, r6, lr}\n" - " add r5, r1, #0\n" - " add r6, r2, #0\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " bl debug_sub_8013240\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._1076 @cond_branch\n" - " bl m4aSoundVSyncOff\n" - " add r0, r4, #0\n" - " add r1, r5, #0\n" - " add r2, r6, #0\n" - " bl debug_sub_8013258\n" - " add r4, r0, #0\n" - " bl m4aSoundVSyncOn\n" - " add r0, r4, #0\n" - " b ._1077\n" - "._1076:\n" - " mov r0, #0x0\n" - "._1077:\n" - " pop {r4, r5, r6}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + u32 result; + + if (debug_sub_8013240() != 0) + return 0; + m4aSoundVSyncOff(); + result = debug_sub_8013258(sectorNum, data, size); + m4aSoundVSyncOn(); + return result; } -__attribute__((naked)) -void debug_sub_80132C8() +void debug_sub_80132C8(u8 a, void *b, u32 c) { - asm( - " push {r4, r5, r6, lr}\n" - " add r5, r1, #0\n" - " add r6, r2, #0\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " bl debug_sub_8013240\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._1078 @cond_branch\n" - " add r0, r4, #0\n" - " mov r1, #0x0\n" - " add r2, r5, #0\n" - " add r3, r6, #0\n" - " bl ReadFlash\n" - "._1078:\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + if (debug_sub_8013240() == 0) + ReadFlash(a, 0, b, c); } #endif @@ -10146,7 +10033,7 @@ void SetActionsAndBanksTurnOrder(void) // And doing this seems to fix it. #if DEBUG asm("");asm("");asm("");asm("");asm("");asm("");asm("");asm("");asm(""); - asm("");asm("");asm("");asm("");asm("");asm("");asm("");asm(""); + asm("");asm("");asm("");asm("");asm("");asm("");asm(""); #endif gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; eFocusPunchBank = 0; diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c index 87a66c2c7..629a57d25 100644 --- a/src/battle/battle_ai.c +++ b/src/battle/battle_ai.c @@ -13,6 +13,8 @@ #include "util.h" #include "ewram.h" +extern u8 gUnknown_02023A14_50; +extern u32 gUnknown_02023A14_4C; extern u16 gBattleTypeFlags; extern u16 gBattleWeather; extern u8 gActiveBank; @@ -289,214 +291,6 @@ void BattleAI_HandleItemUseBeforeAISetup(void) BattleAI_SetupAIData(); } -#if DEBUG -__attribute__((naked)) -void BattleAI_SetupAIData() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " ldr r2, ._16\n" - " mov r4, #0x0\n" - " ldr r3, ._16 + 4\n" - " mov r1, #0x0\n" - "._9:\n" - " add r0, r2, r4\n" - " strb r1, [r0]\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x1b\n" - " bls ._9 @cond_branch\n" - " ldr r0, ._16\n" - " mov r1, #0x64\n" - " mov r4, #0x3\n" - " add r0, r0, #0x7\n" - "._10:\n" - " strb r1, [r0]\n" - " sub r0, r0, #0x1\n" - " sub r4, r4, #0x1\n" - " cmp r4, #0\n" - " bge ._10 @cond_branch\n" - " ldrb r0, [r3]\n" - " mov r1, #0x0\n" - " mov r2, #0xff\n" - " bl CheckMoveLimitations\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " mov r4, #0x0\n" - " ldr r0, ._16\n" - " add r5, r0, #4\n" - " ldr r6, ._16 + 8\n" - "._12:\n" - " ldr r0, [r6]\n" - " and r0, r0, r7\n" - " cmp r0, #0\n" - " beq ._11 @cond_branch\n" - " mov r0, #0x0\n" - " strb r0, [r5]\n" - "._11:\n" - " bl Random\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " mov r1, #0xf\n" - " and r0, r0, r1\n" - " mov r1, #0x64\n" - " sub r1, r1, r0\n" - " strb r1, [r5, #0x14]\n" - " add r5, r5, #0x1\n" - " add r6, r6, #0x4\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x3\n" - " ble ._12 @cond_branch\n" - " ldr r0, ._16 + 12\n" - " add r0, r0, #0x20\n" - " mov r1, #0x0\n" - " strb r1, [r0]\n" - " ldr r1, ._16 + 16\n" - " ldr r0, ._16 + 4\n" - " ldrb r2, [r0]\n" - " strb r2, [r1]\n" - " ldr r0, ._16 + 20\n" - " ldrh r1, [r0]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._13 @cond_branch\n" - " ldr r4, ._16 + 24\n" - " bl Random\n" - " mov r5, #0x2\n" - " and r0, r0, r5\n" - " strb r0, [r4]\n" - " ldr r0, ._16 + 28\n" - " ldrb r1, [r0]\n" - " ldr r2, ._16 + 8\n" - " ldrb r3, [r4]\n" - " lsl r0, r3, #0x2\n" - " add r0, r0, r2\n" - " ldr r0, [r0]\n" - " and r1, r1, r0\n" - " cmp r1, #0\n" - " beq ._15 @cond_branch\n" - " eor r3, r3, r5\n" - " strb r3, [r4]\n" - " b ._15\n" - "._17:\n" - " .align 2, 0\n" - "._16:\n" - " .word gSharedMem+0x16800\n" - " .word gActiveBank\n" - " .word gBitTable\n" - " .word +0x2016c00\n" - " .word gBankAttacker\n" - " .word gBattleTypeFlags\n" - " .word gBankTarget\n" - " .word gAbsentBankFlags\n" - "._13:\n" - " ldr r0, ._20\n" - " mov r1, #0x1\n" - " eor r1, r1, r2\n" - " strb r1, [r0]\n" - "._15:\n" - " ldr r0, ._20 + 4\n" - " ldrh r1, [r0]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._18 @cond_branch\n" - " ldr r1, ._20 + 8\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x17\n" - " b ._27\n" - "._21:\n" - " .align 2, 0\n" - "._20:\n" - " .word gBankTarget\n" - " .word gBattleTypeFlags\n" - " .word gSharedMem+0x16800\n" - "._18:\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x3\n" - " add r0, r2, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._22 @cond_branch\n" - " ldr r1, ._24\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x16\n" - " b ._27\n" - "._25:\n" - " .align 2, 0\n" - "._24:\n" - " .word gSharedMem+0x16800\n" - "._22:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._26 @cond_branch\n" - " ldr r1, ._28\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x18\n" - " b ._27\n" - "._29:\n" - " .align 2, 0\n" - "._28:\n" - " .word gSharedMem+0x16800\n" - "._26:\n" - " mov r0, #0x90\n" - " lsl r0, r0, #0x4\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._30 @cond_branch\n" - " ldr r1, ._33\n" - " ldrh r0, [r1]\n" - " cmp r0, r2\n" - " bne ._31 @cond_branch\n" - "._30:\n" - " ldr r1, ._33 + 4\n" - " mov r0, #0x7\n" - "._27:\n" - " str r0, [r1, #0xc]\n" - " add r3, r1, #0\n" - " b ._32\n" - "._34:\n" - " .align 2, 0\n" - "._33:\n" - " .word gTrainerBattleOpponent\n" - " .word gSharedMem+0x16800\n" - "._31:\n" - " ldr r3, ._36\n" - " ldr r2, ._36 + 4\n" - " ldrh r1, [r1]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x3\n" - " add r2, r2, #0x1c\n" - " add r0, r0, r2\n" - " ldr r0, [r0]\n" - " str r0, [r3, #0xc]\n" - "._32:\n" - " ldr r0, ._36 + 8\n" - " ldrb r1, [r0]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._35 @cond_branch\n" - " ldr r0, ._36 + 12\n" - " ldr r0, [r0]\n" - " str r0, [r3, #0xc]\n" - "._35:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._37:\n" - " .align 2, 0\n" - "._36:\n" - " .word gSharedMem+0x16800\n" - " .word gTrainers\n" - " .word gUnknown_02023A14_50\n" - " .word gUnknown_02023A14_4C\n" - "\n" - ); -} -#else void BattleAI_SetupAIData(void) { s32 i; @@ -544,13 +338,16 @@ void BattleAI_SetupAIData(void) else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) AI_THINKING_STRUCT->aiFlags = 0x80000000; #ifdef GERMAN - else if (gBattleTypeFlags & 0x900 || gTrainerBattleOpponent == 0x400) + else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER) || gTrainerBattleOpponent == 0x400) AI_THINKING_STRUCT->aiFlags = 7; #endif else // otherwise, just set aiFlags to whatever flags the trainer has set in their data. AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags; -} +#if DEBUG + if (gUnknown_02023A14_50 & 1) + AI_THINKING_STRUCT->aiFlags = gUnknown_02023A14_4C; #endif +} u8 BattleAI_GetAIActionToUse(void) { -- cgit v1.2.3 From e8bddb83db39e4352fd2f44d21e761de1174451d Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Fri, 26 Jan 2018 22:10:05 -0800 Subject: fix build --- src/battle/anim/guard.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c index 01cf07e39..254160109 100644 --- a/src/battle/anim/guard.c +++ b/src/battle/anim/guard.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "battle_anim.h" #include "rom_8077ABC.h" -- cgit v1.2.3 From 8aae2583eb851d1442b85e28d7bcb13a15c1818d Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sat, 27 Jan 2018 16:41:07 -0600 Subject: add comments for pool loads --- src/roulette.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index 5a8d35647..ffdbc2c26 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -607,7 +607,7 @@ void sub_8115384(void) .align 2, 0\n\ ._35:\n\ .word gUnknown_Debug_03005FB8\n\ - .word +0x2019000\n\ + .word 0x2019000\n\ .word gMain\n\ .word 0x43c\n\ .word ._37\n\ @@ -718,7 +718,7 @@ void sub_8115384(void) .align 2, 0\n\ ._56:\n\ .word gUnknown_083F88BC\n\ - .word +0x2018800\n\ + .word 0x2018800\n\ .word gUnknown_083F8A60\n\ .word 0x6003000\n\ .word gMain\n\ @@ -870,7 +870,7 @@ void sub_8115384(void) .word 0x4000004\n\ .word sub_8115124+1\n\ .word sub_81156BC+1\n\ - .word +0x2019000\n\ + .word 0x2019000\n\ .word gTasks\n\ .word gSaveBlock1\n\ .word 0x494\n\ @@ -1063,7 +1063,7 @@ void sub_8115634(u8 unused) ._76:\n\ .align 2, 0\n\ ._75:\n\ - .word +0x2019000\n\ + .word 0x2019000\n\ .word unk_203955C\n\ .word gMain\n\ .word gTasks\n\ @@ -2067,7 +2067,7 @@ void sub_8116B40(u8 taskid) // end roulette ? ._382:\n\ .align 2, 0\n\ ._381:\n\ - .word +0x2019000\n\ + .word 0x2019000\n\ .word gSpriteCoordOffsetX\n\ .word gSpriteCoordOffsetY\n\ .word 0x4000050\n\ @@ -4499,7 +4499,7 @@ void debug_sub_812E698() ._840:\n\ .align 2, 0\n\ ._839:\n\ - .word +0x2019000\n\ + .word 0x2019000\n\ .word 0x0\n\ .word gUnknown_083F8DF4\n\ ._837:\n\ @@ -4546,7 +4546,7 @@ void debug_sub_812E698() ._842:\n\ .align 2, 0\n\ ._841:\n\ - .word +0x2019000\n\ + .word 0x2019000\n\ .word gUnknown_083F8DF4\n\ .word 0x3dae147b\n\ .word sub_8118D2C+1"); @@ -4902,7 +4902,7 @@ void sub_8118F8C(struct Sprite *sprite) ._869:\n\ .align 2, 0\n\ ._868:\n\ - .word +0x2019000\n\ + .word 0x2019000\n\ .word 0x3f000000\n\ .word 0x0\n\ .word gUnknown_083F8DF4\n\ -- cgit v1.2.3 From 2d5fdddf69bbbe524a32b6b6f104aeb60bb1cebd Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sat, 27 Jan 2018 17:00:08 -0600 Subject: fix undefined references after merge --- src/engine/cable_club.c | 2 +- src/engine/mystery_event_menu.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index 8f79944de..c656b2203 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -321,7 +321,7 @@ void debug_sub_808A55C() mov r2, #0xc\n\ mov r3, #0x1\n\ bl PrintHex\n\ - bl sub_8007ECC\n\ + bl IsLinkTaskFinished\n\ lsl r0, r0, #0x18\n\ lsr r0, r0, #0x18\n\ mov r1, #0xf\n\ diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index 2e526bb4a..116b60477 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -697,7 +697,7 @@ void debug_sub_815D1D8() " .word 0x43c\n" "._149:\n" " bl Menu_UpdateWindowText\n" - " bl sub_8007ECC\n" + " bl IsLinkTaskFinished\n" " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " beq ._196 @cond_branch\n" -- cgit v1.2.3 From fe400f60b6609d37d2b8a0c2aec75321adc3e95f Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sat, 27 Jan 2018 17:03:40 -0600 Subject: add comments for pool loads in C files --- src/battle/battle_2.c | 942 ++++++++++++++++---------------- src/battle/battle_4.c | 76 +-- src/battle/battle_controller_opponent.c | 36 +- src/battle/battle_controller_player.c | 128 ++--- src/battle/battle_records.c | 10 +- src/debug/start_menu_debug.c | 586 ++++++++++---------- src/engine/cable_club.c | 56 +- src/engine/link.c | 8 +- src/engine/mystery_event_menu.c | 92 ++-- src/engine/reset_rtc_screen.c | 34 +- src/engine/save_failed_screen.c | 34 +- src/field/berry.c | 100 ++-- src/field/choose_party.c | 4 +- src/field/field_map_obj.c | 28 +- src/field/field_player_avatar.c | 20 +- src/field/field_weather.c | 26 +- src/field/fldeff_cut.c | 10 +- src/field/fldeff_flash.c | 4 +- src/field/fldeff_secretpower.c | 10 +- src/field/item_menu.c | 102 ++-- src/field/mauville_man.c | 6 +- src/field/party_menu.c | 106 ++-- src/field/secret_base.c | 14 +- src/field/shop.c | 2 +- src/field/slot_machine.c | 108 ++-- src/field/start_menu.c | 54 +- src/pokemon/pokemon_summary_screen.c | 126 ++--- src/pokenav_before.c | 766 +++++++++++++------------- src/roulette.c | 262 ++++----- src/scene/cable_car.c | 28 +- src/scene/cute_sketch.c | 42 +- 31 files changed, 1910 insertions(+), 1910 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 2171c6ef6..b9b4290b5 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1521,7 +1521,7 @@ void debug_sub_8010A7C() " lsl r1, r1, #0x18\n" " lsr r2, r1, #0x18\n" " mov r1, #0x0\n" - " ldr r5, ._514\n" + " ldr r5, ._514 @ gBattleTextBuff1\n" " cmp r1, r2\n" " bge ._512 @cond_branch\n" " add r3, r5, #0\n" @@ -1562,14 +1562,14 @@ void debug_sub_8010AAC() " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " mov ip, r0\n" - " ldr r6, ._520\n" - " ldr r4, ._520 + 4\n" - " ldr r5, ._520 + 8\n" + " ldr r6, ._520 @ gBaseStats\n" + " ldr r4, ._520 + 4 @ gUnknown_Debug_2023A76\n" + " ldr r5, ._520 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r5]\n" " lsl r0, r1, #0x2\n" " add r7, r0, r1\n" " lsl r1, r7, #0x1\n" - " ldr r3, ._520 + 12\n" + " ldr r3, ._520 + 12 @ gUnknown_Debug_03004360\n" " ldrb r2, [r3]\n" " mov r0, #0x46\n" " mul r2, r2, r0\n" @@ -1685,10 +1685,10 @@ void debug_sub_8010B80() " lsr r6, r0, #0x18\n" " mov r0, #0x0\n" " mov ip, r0\n" - " ldr r4, ._534\n" - " ldr r1, ._534 + 4\n" + " ldr r4, ._534 @ gUnknown_Debug_2023A76\n" + " ldr r1, ._534 + 4 @ gUnknown_Debug_030043A0\n" " mov r8, r1\n" - " ldr r5, ._534 + 8\n" + " ldr r5, ._534 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r5]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -1696,7 +1696,7 @@ void debug_sub_8010B80() " ldrb r2, [r2]\n" " add r0, r0, r2\n" " lsl r0, r0, #0x1\n" - " ldr r3, ._534 + 12\n" + " ldr r3, ._534 + 12 @ gUnknown_Debug_03004360\n" " ldrb r2, [r3]\n" " mov r1, #0x46\n" " mul r1, r1, r2\n" @@ -1847,7 +1847,7 @@ void debug_sub_8010CAC() " mov r7, r8\n" " push {r7}\n" " add sp, sp, #0xfffffff0\n" - " ldr r4, ._553\n" + " ldr r4, ._553 @ gMain\n" " ldrh r1, [r4, #0x28]\n" " mov r0, #0x81\n" " lsl r0, r0, #0x2\n" @@ -1860,19 +1860,19 @@ void debug_sub_8010CAC() " beq ._544 @cond_branch\n" " b ._559\n" "._544:\n" - " ldr r0, ._553 + 4\n" + " ldr r0, ._553 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " mov r8, r0\n" " cmp r1, #0x5\n" " bhi ._546 @cond_branch\n" - " ldr r0, ._553 + 8\n" + " ldr r0, ._553 + 8 @ gUnknown_Debug_030043A8\n" " mov r1, #0x0\n" " strb r1, [r0]\n" " bl debug_sub_8012628\n" - " ldr r0, ._553 + 12\n" + " ldr r0, ._553 + 12 @ debug_sub_8011498\n" " bl SetMainCallback2\n" "._546:\n" - " ldr r0, ._553 + 16\n" + " ldr r0, ._553 + 16 @ gUnknown_Debug_030043A0\n" " ldrb r3, [r0]\n" " cmp r3, #0\n" " bne ._555 @cond_branch\n" @@ -1880,10 +1880,10 @@ void debug_sub_8010CAC() " ldrb r0, [r1]\n" " cmp r0, #0x6\n" " bne ._555 @cond_branch\n" - " ldr r0, ._553 + 20\n" + " ldr r0, ._553 + 20 @ debug_sub_80108B8\n" " str r0, [r4, #0x8]\n" - " ldr r4, ._553 + 24\n" - " ldr r0, ._553 + 28\n" + " ldr r4, ._553 + 24 @ gPlayerParty\n" + " ldr r0, ._553 + 28 @ gUnknown_Debug_2023A76\n" " ldrh r1, [r0]\n" " ldrb r2, [r0, #0x2]\n" " str r3, [sp]\n" @@ -1899,7 +1899,7 @@ void debug_sub_8010CAC() " add r1, r5, #0\n" " add r1, r1, #0xd\n" " lsl r4, r5, #0x1\n" - " ldr r0, ._553 + 32\n" + " ldr r0, ._553 + 32 @ gUnknown_Debug_2023B02\n" " add r4, r4, r0\n" " add r0, r6, #0\n" " add r2, r4, #0\n" @@ -1911,14 +1911,14 @@ void debug_sub_8010CAC() " lsl r2, r0, #0x1\n" " add r2, r2, r0\n" " lsl r2, r2, #0x2\n" - " ldr r0, ._553 + 36\n" + " ldr r0, ._553 + 36 @ gBattleMoves\n" " add r2, r2, r0\n" " add r0, r6, #0\n" " bl SetMonData\n" " add r5, r5, #0x1\n" " cmp r5, #0x3\n" " ble ._549 @cond_branch\n" - " ldr r2, ._553 + 28\n" + " ldr r2, ._553 + 28 @ gUnknown_Debug_2023A76\n" " mov r4, #0x3c\n" " ldsh r0, [r2, r4]\n" " cmp r0, #0x1\n" @@ -1940,10 +1940,10 @@ void debug_sub_8010CAC() " .word gUnknown_Debug_2023B02\n" " .word gBattleMoves+0x4\n" "._550:\n" - " ldr r1, ._556\n" - " ldr r0, ._556 + 4\n" + " ldr r1, ._556 @ gCB2_AfterEvolution\n" + " ldr r0, ._556 + 4 @ debug_sub_80108B8\n" " str r0, [r1]\n" - " ldr r0, ._556 + 8\n" + " ldr r0, ._556 + 8 @ gPlayerParty\n" " ldrh r1, [r2, #0xa]\n" " mov r2, #0x1\n" " mov r3, #0x0\n" @@ -1958,15 +1958,15 @@ void debug_sub_8010CAC() "._551:\n" " bl debug_sub_8012688\n" "._555:\n" - " ldr r0, ._565\n" + " ldr r0, ._565 @ gUnknown_Debug_030043A0\n" " ldrb r0, [r0]\n" " cmp r0, #0x1\n" " bne ._559 @cond_branch\n" - " ldr r0, ._565 + 4\n" + " ldr r0, ._565 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r0, [r0]\n" " cmp r0, #0x6\n" " bne ._559 @cond_branch\n" - " ldr r3, ._565 + 8\n" + " ldr r3, ._565 + 8 @ gSaveBlock2\n" " ldrb r2, [r3, #0x15]\n" " lsl r0, r2, #0x1d\n" " lsr r5, r0, #0x1f\n" @@ -1999,7 +1999,7 @@ void debug_sub_8010CAC() " bl SetPokemonCryStereo\n" " bl debug_nullsub_3\n" "._559:\n" - " ldr r4, ._565 + 12\n" + " ldr r4, ._565 + 12 @ gMain\n" " ldrh r0, [r4, #0x2a]\n" " cmp r0, #0x8\n" " bne ._561 @cond_branch\n" @@ -2009,7 +2009,7 @@ void debug_sub_8010CAC() " cmp r0, #0x40\n" " bne ._562 @cond_branch\n" " bl debug_sub_80125E4\n" - " ldr r1, ._565 + 4\n" + " ldr r1, ._565 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r0, [r1]\n" " cmp r0, #0\n" " beq ._563 @cond_branch\n" @@ -2027,7 +2027,7 @@ void debug_sub_8010CAC() "._564:\n" " strb r0, [r1]\n" " bl debug_sub_8011E74\n" - " ldr r0, ._570\n" + " ldr r0, ._570 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2036,12 +2036,12 @@ void debug_sub_8010CAC() " bl debug_sub_80123D8\n" " bl debug_sub_80125A0\n" "._562:\n" - " ldr r0, ._570 + 4\n" + " ldr r0, ._570 + 4 @ gMain\n" " ldrh r0, [r0, #0x2a]\n" " cmp r0, #0x80\n" " bne ._567 @cond_branch\n" " bl debug_sub_80125E4\n" - " ldr r1, ._570\n" + " ldr r1, ._570 @ gUnknown_Debug_030043A4\n" " ldrb r0, [r1]\n" " cmp r0, #0x6\n" " bne ._568 @cond_branch\n" @@ -2057,7 +2057,7 @@ void debug_sub_8010CAC() "._569:\n" " strb r0, [r1]\n" " bl debug_sub_8011E74\n" - " ldr r0, ._575\n" + " ldr r0, ._575 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2066,12 +2066,12 @@ void debug_sub_8010CAC() " bl debug_sub_80123D8\n" " bl debug_sub_80125A0\n" "._567:\n" - " ldr r0, ._575 + 4\n" + " ldr r0, ._575 + 4 @ gMain\n" " ldrh r0, [r0, #0x2a]\n" " cmp r0, #0x20\n" " bne ._572 @cond_branch\n" " bl debug_sub_80125E4\n" - " ldr r2, ._575 + 8\n" + " ldr r2, ._575 + 8 @ gUnknown_Debug_030043A0\n" " ldrb r0, [r2]\n" " add r1, r0, #0\n" " cmp r1, #0\n" @@ -2086,18 +2086,18 @@ void debug_sub_8010CAC() " .word gMain\n" " .word gUnknown_Debug_030043A0\n" "._573:\n" - " ldr r3, ._581\n" + " ldr r3, ._581 @ gUnknown_Debug_03004360\n" " ldrb r0, [r3]\n" " cmp r0, #0\n" " beq ._577 @cond_branch\n" " strb r1, [r3]\n" " mov r0, #0x4\n" " strb r0, [r2]\n" - " ldr r0, ._581 + 4\n" + " ldr r0, ._581 + 4 @ gBattle_BG1_X\n" " strh r1, [r0]\n" " bl debug_sub_8011E5C\n" " bl debug_sub_8011E74\n" - " ldr r0, ._581 + 8\n" + " ldr r0, ._581 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2107,12 +2107,12 @@ void debug_sub_8010CAC() "._577:\n" " bl debug_sub_80125A0\n" "._572:\n" - " ldr r0, ._581 + 12\n" + " ldr r0, ._581 + 12 @ gMain\n" " ldrh r0, [r0, #0x2a]\n" " cmp r0, #0x10\n" " bne ._578 @cond_branch\n" " bl debug_sub_80125E4\n" - " ldr r2, ._581 + 16\n" + " ldr r2, ._581 + 16 @ gUnknown_Debug_030043A0\n" " ldrb r0, [r2]\n" " cmp r0, #0x4\n" " beq ._579 @cond_branch\n" @@ -2128,21 +2128,21 @@ void debug_sub_8010CAC() " .word gMain\n" " .word gUnknown_Debug_030043A0\n" "._579:\n" - " ldr r3, ._587\n" + " ldr r3, ._587 @ gUnknown_Debug_03004360\n" " ldrb r1, [r3]\n" " cmp r1, #0\n" " bne ._583 @cond_branch\n" " mov r0, #0x1\n" " strb r0, [r3]\n" " strb r1, [r2]\n" - " ldr r1, ._587 + 4\n" + " ldr r1, ._587 + 4 @ gBattle_BG1_X\n" " mov r2, #0x80\n" " lsl r2, r2, #0x1\n" " add r0, r2, #0\n" " strh r0, [r1]\n" " bl debug_sub_8011E5C\n" " bl debug_sub_8011E74\n" - " ldr r0, ._587 + 8\n" + " ldr r0, ._587 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2152,7 +2152,7 @@ void debug_sub_8010CAC() "._583:\n" " bl debug_sub_80125A0\n" "._578:\n" - " ldr r0, ._587 + 12\n" + " ldr r0, ._587 + 12 @ gMain\n" " ldrh r1, [r0, #0x30]\n" " mov r0, #0x2\n" " and r0, r0, r1\n" @@ -2160,9 +2160,9 @@ void debug_sub_8010CAC() " bne ._584 @cond_branch\n" " b ._607\n" "._584:\n" - " ldr r0, ._587 + 16\n" + " ldr r0, ._587 + 16 @ gUnknown_Debug_030043A0\n" " ldrb r2, [r0]\n" - " ldr r0, ._587 + 8\n" + " ldr r0, ._587 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2171,7 +2171,7 @@ void debug_sub_8010CAC() " cmp r0, #0x4\n" " bhi ._586 @cond_branch\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._587 + 20\n" + " ldr r1, ._587 + 20 @ \n" " add r0, r0, r1\n" " ldr r0, [r0]\n" " mov pc, r0\n" @@ -2194,7 +2194,7 @@ void debug_sub_8010CAC() " bl debug_sub_8010818\n" " b ._595\n" "._592:\n" - " ldr r1, ._597\n" + " ldr r1, ._597 @ gUnknown_Debug_2023A76\n" " mov r0, #0x1f\n" " mov r2, #0xec\n" " bl debug_sub_80132C8\n" @@ -2203,7 +2203,7 @@ void debug_sub_8010CAC() " bl debug_sub_8011E74\n" " bl debug_sub_8012540\n" " bl debug_nullsub_3\n" - " ldr r0, ._597 + 4\n" + " ldr r0, ._597 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2217,7 +2217,7 @@ void debug_sub_8010CAC() " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_030043A4\n" "._593:\n" - " ldr r1, ._600\n" + " ldr r1, ._600 @ gUnknown_Debug_2023A76\n" " mov r0, #0x1f\n" " mov r2, #0xec\n" " bl debug_sub_8013294\n" @@ -2227,7 +2227,7 @@ void debug_sub_8010CAC() "._600:\n" " .word gUnknown_Debug_2023A76\n" "._594:\n" - " ldr r3, ._604\n" + " ldr r3, ._604 @ gUnknown_Debug_2023A76\n" " add r2, r3, #0\n" " add r2, r2, #0x44\n" " ldrh r1, [r2]\n" @@ -2259,8 +2259,8 @@ void debug_sub_8010CAC() "._590:\n" " mov r0, #0x0\n" " bl debug_sub_8010B80\n" - " ldr r2, ._608\n" - " ldr r0, ._608 + 4\n" + " ldr r2, ._608 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._608 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2284,16 +2284,16 @@ void debug_sub_8010CAC() " bl debug_sub_8010AAC\n" " b ._613\n" "._611:\n" - " ldr r6, ._618\n" - " ldr r5, ._618 + 4\n" - " ldr r4, ._618 + 8\n" + " ldr r6, ._618 @ gUnknown_Debug_2023A76\n" + " ldr r5, ._618 + 4 @ gUnknown_Debug_030043A0\n" + " ldr r4, ._618 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r0, [r4]\n" " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " ldrb r0, [r5]\n" " add r1, r1, r0\n" " lsl r1, r1, #0x1\n" - " ldr r2, ._618 + 12\n" + " ldr r2, ._618 + 12 @ gUnknown_Debug_03004360\n" " ldrb r0, [r2]\n" " mov r3, #0x46\n" " mul r0, r0, r3\n" @@ -2314,7 +2314,7 @@ void debug_sub_8010CAC() " add r3, r0, r6\n" " mov r4, #0x0\n" " ldsh r2, [r3, r4]\n" - " ldr r4, ._618 + 16\n" + " ldr r4, ._618 + 16 @ gUnknown_Debug_821F424\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" " lsl r1, r0, #0x1\n" @@ -2329,13 +2329,13 @@ void debug_sub_8010CAC() " ldrh r0, [r0]\n" " strh r0, [r3]\n" "._613:\n" - " ldr r5, ._618 + 4\n" + " ldr r5, ._618 + 4 @ gUnknown_Debug_030043A0\n" " ldrb r0, [r5]\n" " cmp r0, #0\n" " bne ._614 @cond_branch\n" " mov r0, #0x0\n" " bl debug_sub_8010AAC\n" - " ldr r0, ._618 + 8\n" + " ldr r0, ._618 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2344,7 +2344,7 @@ void debug_sub_8010CAC() " lsr r0, r0, #0x18\n" " bl debug_sub_8011EA0\n" "._614:\n" - " ldr r4, ._618 + 8\n" + " ldr r4, ._618 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r4]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2360,7 +2360,7 @@ void debug_sub_8010CAC() " lsr r0, r0, #0x18\n" " bl debug_sub_80123D8\n" "._607:\n" - " ldr r0, ._618 + 20\n" + " ldr r0, ._618 + 20 @ gMain\n" " ldrh r1, [r0, #0x30]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -2368,9 +2368,9 @@ void debug_sub_8010CAC() " bne ._615 @cond_branch\n" " b ._638\n" "._615:\n" - " ldr r0, ._618 + 4\n" + " ldr r0, ._618 + 4 @ gUnknown_Debug_030043A0\n" " ldrb r2, [r0]\n" - " ldr r0, ._618 + 8\n" + " ldr r0, ._618 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2379,7 +2379,7 @@ void debug_sub_8010CAC() " cmp r0, #0x4\n" " bhi ._617 @cond_branch\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._618 + 24\n" + " ldr r1, ._618 + 24 @ \n" " add r0, r0, r1\n" " ldr r0, [r0]\n" " mov pc, r0\n" @@ -2403,7 +2403,7 @@ void debug_sub_8010CAC() " bl debug_sub_8010818\n" " b ._626\n" "._623:\n" - " ldr r1, ._628\n" + " ldr r1, ._628 @ gUnknown_Debug_2023A76\n" " mov r0, #0x1f\n" " mov r2, #0xec\n" " bl debug_sub_80132C8\n" @@ -2412,7 +2412,7 @@ void debug_sub_8010CAC() " bl debug_sub_8011E74\n" " bl debug_sub_8012540\n" " bl debug_nullsub_3\n" - " ldr r0, ._628 + 4\n" + " ldr r0, ._628 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2426,7 +2426,7 @@ void debug_sub_8010CAC() " .word gUnknown_Debug_2023A76\n" " .word gUnknown_Debug_030043A4\n" "._624:\n" - " ldr r1, ._631\n" + " ldr r1, ._631 @ gUnknown_Debug_2023A76\n" " mov r0, #0x1f\n" " mov r2, #0xec\n" " bl debug_sub_8013294\n" @@ -2436,7 +2436,7 @@ void debug_sub_8010CAC() "._631:\n" " .word gUnknown_Debug_2023A76\n" "._625:\n" - " ldr r3, ._635\n" + " ldr r3, ._635 @ gUnknown_Debug_2023A76\n" " add r2, r3, #0\n" " add r2, r2, #0x44\n" " ldrh r1, [r2]\n" @@ -2468,8 +2468,8 @@ void debug_sub_8010CAC() "._621:\n" " mov r0, #0x1\n" " bl debug_sub_8010B80\n" - " ldr r2, ._639\n" - " ldr r0, ._639 + 4\n" + " ldr r2, ._639 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._639 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2493,16 +2493,16 @@ void debug_sub_8010CAC() " bl debug_sub_8010AAC\n" " b ._644\n" "._642:\n" - " ldr r6, ._650\n" - " ldr r5, ._650 + 4\n" - " ldr r4, ._650 + 8\n" + " ldr r6, ._650 @ gUnknown_Debug_2023A76\n" + " ldr r5, ._650 + 4 @ gUnknown_Debug_030043A0\n" + " ldr r4, ._650 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r0, [r4]\n" " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " ldrb r0, [r5]\n" " add r1, r1, r0\n" " lsl r1, r1, #0x1\n" - " ldr r2, ._650 + 12\n" + " ldr r2, ._650 + 12 @ gUnknown_Debug_03004360\n" " ldrb r0, [r2]\n" " mov r3, #0x46\n" " mul r0, r0, r3\n" @@ -2523,7 +2523,7 @@ void debug_sub_8010CAC() " add r3, r0, r6\n" " mov r4, #0x0\n" " ldsh r2, [r3, r4]\n" - " ldr r4, ._650 + 16\n" + " ldr r4, ._650 + 16 @ gUnknown_Debug_821F424\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" " lsl r1, r0, #0x1\n" @@ -2538,13 +2538,13 @@ void debug_sub_8010CAC() " ldrh r0, [r0]\n" " strh r0, [r3]\n" "._644:\n" - " ldr r5, ._650 + 4\n" + " ldr r5, ._650 + 4 @ gUnknown_Debug_030043A0\n" " ldrb r0, [r5]\n" " cmp r0, #0\n" " bne ._645 @cond_branch\n" " mov r0, #0x0\n" " bl debug_sub_8010AAC\n" - " ldr r0, ._650 + 8\n" + " ldr r0, ._650 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2553,7 +2553,7 @@ void debug_sub_8010CAC() " lsr r0, r0, #0x18\n" " bl debug_sub_8011EA0\n" "._645:\n" - " ldr r4, ._650 + 8\n" + " ldr r4, ._650 + 8 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r4]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2569,16 +2569,16 @@ void debug_sub_8010CAC() " lsr r0, r0, #0x18\n" " bl debug_sub_80123D8\n" "._638:\n" - " ldr r0, ._650 + 20\n" + " ldr r0, ._650 + 20 @ gMain\n" " ldrh r1, [r0, #0x30]\n" " mov r0, #0x80\n" " lsl r0, r0, #0x2\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._646 @cond_branch\n" - " ldr r0, ._650 + 4\n" + " ldr r0, ._650 + 4 @ gUnknown_Debug_030043A0\n" " ldrb r1, [r0]\n" - " ldr r2, ._650 + 8\n" + " ldr r2, ._650 + 8 @ gUnknown_Debug_030043A4\n" " mov r8, r2\n" " add r7, r0, #0\n" " cmp r1, #0x4\n" @@ -2611,9 +2611,9 @@ void debug_sub_8010CAC() " bl debug_sub_8010B80\n" " b ._653\n" "._652:\n" - " ldr r4, ._655\n" + " ldr r4, ._655 @ gUnknown_Debug_2023A76\n" " lsl r1, r0, #0x1\n" - " ldr r3, ._655 + 4\n" + " ldr r3, ._655 + 4 @ gUnknown_Debug_03004360\n" " ldrb r2, [r3]\n" " mov r0, #0x46\n" " mul r0, r0, r2\n" @@ -2623,7 +2623,7 @@ void debug_sub_8010CAC() " sub r0, r0, #0xa\n" " strh r0, [r1]\n" " add r6, r3, #0\n" - " ldr r5, ._655 + 8\n" + " ldr r5, ._655 + 8 @ gUnknown_Debug_821F424\n" " b ._654\n" "._656:\n" " .align 2, 0\n" @@ -2663,13 +2663,13 @@ void debug_sub_8010CAC() " cmp r2, r0\n" " blt ._657 @cond_branch\n" "._653:\n" - " ldr r5, ._663\n" + " ldr r5, ._663 @ gUnknown_Debug_030043A0\n" " ldrb r0, [r5]\n" " cmp r0, #0\n" " bne ._658 @cond_branch\n" " mov r0, #0x0\n" " bl debug_sub_8010AAC\n" - " ldr r0, ._663 + 4\n" + " ldr r0, ._663 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2678,7 +2678,7 @@ void debug_sub_8010CAC() " lsr r0, r0, #0x18\n" " bl debug_sub_8011EA0\n" "._658:\n" - " ldr r4, ._663 + 4\n" + " ldr r4, ._663 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r4]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2694,16 +2694,16 @@ void debug_sub_8010CAC() " lsr r0, r0, #0x18\n" " bl debug_sub_80123D8\n" "._646:\n" - " ldr r0, ._663 + 8\n" + " ldr r0, ._663 + 8 @ gMain\n" " ldrh r1, [r0, #0x30]\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._659 @cond_branch\n" - " ldr r0, ._663\n" + " ldr r0, ._663 @ gUnknown_Debug_030043A0\n" " ldrb r1, [r0]\n" - " ldr r2, ._663 + 4\n" + " ldr r2, ._663 + 4 @ gUnknown_Debug_030043A4\n" " mov r8, r2\n" " add r7, r0, #0\n" " cmp r1, #0x4\n" @@ -2733,9 +2733,9 @@ void debug_sub_8010CAC() " bl debug_sub_8010B80\n" " b ._666\n" "._665:\n" - " ldr r4, ._668\n" + " ldr r4, ._668 @ gUnknown_Debug_2023A76\n" " lsl r1, r0, #0x1\n" - " ldr r3, ._668 + 4\n" + " ldr r3, ._668 + 4 @ gUnknown_Debug_03004360\n" " ldrb r2, [r3]\n" " mov r0, #0x46\n" " mul r0, r0, r2\n" @@ -2745,7 +2745,7 @@ void debug_sub_8010CAC() " add r0, r0, #0xa\n" " strh r0, [r1]\n" " add r6, r3, #0\n" - " ldr r5, ._668 + 8\n" + " ldr r5, ._668 + 8 @ gUnknown_Debug_821F424\n" " b ._667\n" "._669:\n" " .align 2, 0\n" @@ -2781,13 +2781,13 @@ void debug_sub_8010CAC() " cmp r2, r1\n" " bgt ._670 @cond_branch\n" "._666:\n" - " ldr r5, ._672\n" + " ldr r5, ._672 @ gUnknown_Debug_030043A0\n" " ldrb r0, [r5]\n" " cmp r0, #0\n" " bne ._671 @cond_branch\n" " mov r0, #0x0\n" " bl debug_sub_8010AAC\n" - " ldr r0, ._672 + 4\n" + " ldr r0, ._672 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2796,7 +2796,7 @@ void debug_sub_8010CAC() " lsr r0, r0, #0x18\n" " bl debug_sub_8011EA0\n" "._671:\n" - " ldr r4, ._672 + 4\n" + " ldr r4, ._672 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r4]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2838,8 +2838,8 @@ void debug_sub_8011498() " mov r6, r9\n" " mov r5, r8\n" " push {r5, r6, r7}\n" - " ldr r2, ._687\n" - " ldr r0, ._687 + 4\n" + " ldr r2, ._687 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._687 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -2848,7 +2848,7 @@ void debug_sub_8011498() " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " mov r9, r0\n" - " ldr r4, ._687 + 8\n" + " ldr r4, ._687 + 8 @ gMain\n" " ldrh r1, [r4, #0x28]\n" " mov r0, #0x81\n" " lsl r0, r0, #0x2\n" @@ -2860,7 +2860,7 @@ void debug_sub_8011498() " cmp r0, #0x4\n" " bne ._675 @cond_branch\n" " bl debug_sub_8012658\n" - " ldr r0, ._687 + 12\n" + " ldr r0, ._687 + 12 @ debug_sub_8010CAC\n" " bl SetMainCallback2\n" "._675:\n" " ldrh r0, [r4, #0x2a]\n" @@ -2875,14 +2875,14 @@ void debug_sub_8011498() " bne ._678 @cond_branch\n" "._677:\n" " bl debug_sub_8012658\n" - " ldr r0, ._687 + 16\n" + " ldr r0, ._687 + 16 @ gUnknown_Debug_030043A8\n" " ldrb r1, [r0]\n" " mov r2, #0x2\n" " eor r1, r1, r2\n" " strb r1, [r0]\n" " bl debug_sub_8012628\n" "._678:\n" - " ldr r0, ._687 + 8\n" + " ldr r0, ._687 + 8 @ gMain\n" " ldrh r0, [r0, #0x2a]\n" " cmp r0, #0x20\n" " beq ._679 @cond_branch\n" @@ -2890,22 +2890,22 @@ void debug_sub_8011498() " bne ._680 @cond_branch\n" "._679:\n" " bl debug_sub_8012658\n" - " ldr r0, ._687 + 16\n" + " ldr r0, ._687 + 16 @ gUnknown_Debug_030043A8\n" " ldrb r1, [r0]\n" " mov r2, #0x1\n" " eor r1, r1, r2\n" " strb r1, [r0]\n" " bl debug_sub_8012628\n" "._680:\n" - " ldr r0, ._687 + 8\n" + " ldr r0, ._687 + 8 @ gMain\n" " ldrh r1, [r0, #0x30]\n" " mov r0, #0x2\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._681 @cond_branch\n" - " ldr r0, ._687 + 20\n" + " ldr r0, ._687 + 20 @ gUnknown_Debug_2023B02\n" " mov r8, r0\n" - " ldr r6, ._687 + 16\n" + " ldr r6, ._687 + 16 @ gUnknown_Debug_030043A8\n" " ldrb r4, [r6]\n" " lsl r4, r4, #0x1\n" " mov r0, r9\n" @@ -2914,7 +2914,7 @@ void debug_sub_8011498() " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" - " ldr r5, ._687 + 24\n" + " ldr r5, ._687 + 24 @ gUnknown_Debug_03004360\n" " ldrb r2, [r5]\n" " lsl r1, r2, #0x1\n" " add r1, r1, r2\n" @@ -2936,7 +2936,7 @@ void debug_sub_8011498() " add r4, r1, r0\n" " mov r0, #0x0\n" " ldsh r1, [r4, r0]\n" - " ldr r5, ._687 + 28\n" + " ldr r5, ._687 + 28 @ gUnknown_Debug_821F564\n" " lsl r0, r3, #0x2\n" " add r0, r0, r3\n" " lsl r2, r0, #0x1\n" @@ -2953,15 +2953,15 @@ void debug_sub_8011498() "._682:\n" " bl debug_sub_8012294\n" "._681:\n" - " ldr r0, ._687 + 8\n" + " ldr r0, ._687 + 8 @ gMain\n" " ldrh r1, [r0, #0x30]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._683 @cond_branch\n" - " ldr r1, ._687 + 20\n" + " ldr r1, ._687 + 20 @ gUnknown_Debug_2023B02\n" " mov r8, r1\n" - " ldr r6, ._687 + 16\n" + " ldr r6, ._687 + 16 @ gUnknown_Debug_030043A8\n" " ldrb r4, [r6]\n" " lsl r4, r4, #0x1\n" " mov r0, r9\n" @@ -2970,7 +2970,7 @@ void debug_sub_8011498() " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" - " ldr r5, ._687 + 24\n" + " ldr r5, ._687 + 24 @ gUnknown_Debug_03004360\n" " ldrb r2, [r5]\n" " lsl r1, r2, #0x1\n" " add r1, r1, r2\n" @@ -2992,7 +2992,7 @@ void debug_sub_8011498() " add r4, r1, r0\n" " mov r0, #0x0\n" " ldsh r1, [r4, r0]\n" - " ldr r5, ._687 + 28\n" + " ldr r5, ._687 + 28 @ gUnknown_Debug_821F564\n" " lsl r0, r3, #0x2\n" " add r0, r0, r3\n" " lsl r2, r0, #0x1\n" @@ -3009,15 +3009,15 @@ void debug_sub_8011498() "._684:\n" " bl debug_sub_8012294\n" "._683:\n" - " ldr r0, ._687 + 8\n" + " ldr r0, ._687 + 8 @ gMain\n" " ldrh r1, [r0, #0x30]\n" " mov r0, #0x80\n" " lsl r0, r0, #0x2\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._685 @cond_branch\n" - " ldr r6, ._687 + 20\n" - " ldr r5, ._687 + 16\n" + " ldr r6, ._687 + 20 @ gUnknown_Debug_2023B02\n" + " ldr r5, ._687 + 16 @ gUnknown_Debug_030043A8\n" " ldrb r4, [r5]\n" " lsl r4, r4, #0x1\n" " mov r0, r9\n" @@ -3026,7 +3026,7 @@ void debug_sub_8011498() " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" - " ldr r2, ._687 + 24\n" + " ldr r2, ._687 + 24 @ gUnknown_Debug_03004360\n" " ldrb r1, [r2]\n" " lsl r0, r1, #0x1\n" " add r0, r0, r1\n" @@ -3039,7 +3039,7 @@ void debug_sub_8011498() " mov sl, r5\n" " mov r8, r6\n" " add r7, r2, #0\n" - " ldr r6, ._687 + 28\n" + " ldr r6, ._687 + 28 @ gUnknown_Debug_821F564\n" " b ._686\n" "._688:\n" " .align 2, 0\n" @@ -3088,15 +3088,15 @@ void debug_sub_8011498() " blt ._689 @cond_branch\n" " bl debug_sub_8012294\n" "._685:\n" - " ldr r0, ._692\n" + " ldr r0, ._692 @ gMain\n" " ldrh r1, [r0, #0x30]\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._690 @cond_branch\n" - " ldr r6, ._692 + 4\n" - " ldr r5, ._692 + 8\n" + " ldr r6, ._692 + 4 @ gUnknown_Debug_2023B02\n" + " ldr r5, ._692 + 8 @ gUnknown_Debug_030043A8\n" " ldrb r4, [r5]\n" " lsl r4, r4, #0x1\n" " mov r0, r9\n" @@ -3105,7 +3105,7 @@ void debug_sub_8011498() " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x15\n" " add r4, r4, r0\n" - " ldr r2, ._692 + 12\n" + " ldr r2, ._692 + 12 @ gUnknown_Debug_03004360\n" " ldrb r1, [r2]\n" " lsl r0, r1, #0x1\n" " add r0, r0, r1\n" @@ -3118,7 +3118,7 @@ void debug_sub_8011498() " mov sl, r5\n" " mov r8, r6\n" " add r7, r2, #0\n" - " ldr r6, ._692 + 16\n" + " ldr r6, ._692 + 16 @ gUnknown_Debug_821F564\n" " b ._691\n" "._693:\n" " .align 2, 0\n" @@ -3185,7 +3185,7 @@ void debug_sub_801174C() " add sp, sp, #0xffffffe8\n" " mov r0, #0x0\n" " mov r9, r0\n" - " ldr r1, ._704\n" + " ldr r1, ._704 @ gUnknown_020297ED\n" " mov r0, #0x1\n" " strb r0, [r1]\n" " bl Random\n" @@ -3196,11 +3196,11 @@ void debug_sub_801174C() " and r4, r4, r0\n" " lsl r4, r4, #0x18\n" " lsr r6, r4, #0x18\n" - " ldr r5, ._704 + 4\n" + " ldr r5, ._704 + 4 @ gSaveBlock2\n" " lsl r1, r6, #0x1\n" " add r1, r1, r6\n" " lsl r1, r1, #0x1\n" - " ldr r0, ._704 + 8\n" + " ldr r0, ._704 + 8 @ str_821F631\n" " add r1, r1, r0\n" " add r0, r5, #0\n" " bl StringCopy\n" @@ -3208,7 +3208,7 @@ void debug_sub_801174C() " strb r4, [r5, #0x8]\n" " bl ZeroPlayerPartyMons\n" " bl ZeroEnemyPartyMons\n" - " ldr r0, ._704 + 12\n" + " ldr r0, ._704 + 12 @ gUnknown_Debug_2023A76\n" " mov r1, #0x3c\n" " ldsh r7, [r0, r1]\n" " mov r2, r9\n" @@ -3223,17 +3223,17 @@ void debug_sub_801174C() " bgt ._696 @cond_branch\n" " str r0, [sp, #0xc]\n" "._695:\n" - " ldr r2, ._704 + 16\n" - " ldr r1, ._704 + 20\n" + " ldr r2, ._704 + 16 @ gBattleTypeFlags\n" + " ldr r1, ._704 + 20 @ gUnknown_Debug_821F598\n" " sub r0, r7, #1\n" " lsl r0, r0, #0x1\n" " add r0, r0, r1\n" " ldrh r3, [r0]\n" " strh r3, [r2]\n" - " ldr r1, ._704 + 24\n" + " ldr r1, ._704 + 24 @ gUnknown_02023A14_50\n" " mov r0, #0x8\n" " strb r0, [r1]\n" - " ldr r1, ._704 + 28\n" + " ldr r1, ._704 + 28 @ gBattleTerrain\n" " add r0, sp, #0xc\n" " ldrb r0, [r0]\n" " strb r0, [r1]\n" @@ -3243,27 +3243,27 @@ void debug_sub_801174C() " beq ._697 @cond_branch\n" " bl EnterSafariMode\n" "._697:\n" - " ldr r5, ._704 + 12\n" + " ldr r5, ._704 + 12 @ gUnknown_Debug_2023A76\n" " ldrh r0, [r5, #0x3c]\n" " sub r0, r0, #0x2\n" " lsl r0, r0, #0x10\n" " lsr r0, r0, #0x10\n" " cmp r0, #0x2\n" " bhi ._698 @cond_branch\n" - " ldr r4, ._704 + 32\n" + " ldr r4, ._704 + 32 @ gTrainerBattleOpponent\n" " bl Random\n" " mov r1, #0x7\n" " and r1, r1, r0\n" " add r1, r1, #0x1\n" " strh r1, [r4]\n" "._698:\n" - " ldr r1, ._704 + 36\n" + " ldr r1, ._704 + 36 @ gPlayerPartyCount\n" " mov r0, #0x0\n" " strb r0, [r1]\n" " mov r7, #0x0\n" "._745:\n" " lsl r0, r7, #0x1\n" - " ldr r3, ._704 + 12\n" + " ldr r3, ._704 + 12 @ gUnknown_Debug_2023A76\n" " add r1, r0, r3\n" " mov r2, #0x0\n" " ldsh r1, [r1, r2]\n" @@ -3339,14 +3339,14 @@ void debug_sub_801174C() " bl __divsi3\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" - " ldr r1, ._719\n" + " ldr r1, ._719 @ gEnemyParty\n" " add r0, r0, r1\n" - " ldr r1, ._719 + 4\n" + " ldr r1, ._719 + 4 @ gUnknown_Debug_2023A76\n" " add r1, r1, r8\n" " ldrh r1, [r1]\n" " add r2, r7, #1\n" " lsl r2, r2, #0x1\n" - " ldr r3, ._719 + 4\n" + " ldr r3, ._719 + 4 @ gUnknown_Debug_2023A76\n" " add r2, r2, r3\n" " ldrb r2, [r2]\n" " str r6, [sp]\n" @@ -3363,9 +3363,9 @@ void debug_sub_801174C() " mov r2, #0x64\n" " add r1, r0, #0\n" " mul r1, r1, r2\n" - " ldr r0, ._719\n" + " ldr r0, ._719 @ gEnemyParty\n" " add r5, r1, r0\n" - " ldr r4, ._719 + 8\n" + " ldr r4, ._719 + 8 @ gUnknown_Debug_2023A7A\n" " mov r3, r8\n" " add r6, r3, r4\n" " add r0, r5, #0\n" @@ -3421,19 +3421,19 @@ void debug_sub_801174C() " bl __divsi3\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" - " ldr r1, ._726\n" + " ldr r1, ._726 @ gEnemyParty\n" " add r0, r0, r1\n" " mov r1, #0x2e\n" " add r2, sp, #0xc\n" " bl SetMonData\n" "._716:\n" - " ldr r1, ._726 + 4\n" + " ldr r1, ._726 + 4 @ gUnknown_Debug_2023A76\n" " add r1, r1, #0x46\n" " mov r2, r8\n" " add r0, r2, r1\n" " mov r3, #0x0\n" " ldsh r0, [r0, r3]\n" - " ldr r2, ._726 + 4\n" + " ldr r2, ._726 + 4 @ gUnknown_Debug_2023A76\n" " cmp r0, #0\n" " beq ._721 @cond_branch\n" " add r0, r7, #4\n" @@ -3494,14 +3494,14 @@ void debug_sub_801174C() " bl __divsi3\n" " mov r2, #0x64\n" " mul r0, r0, r2\n" - " ldr r1, ._741\n" + " ldr r1, ._741 @ gPlayerParty\n" " add r0, r0, r1\n" - " ldr r1, ._741 + 4\n" + " ldr r1, ._741 + 4 @ gUnknown_Debug_2023ABC\n" " add r1, r1, r8\n" " ldrh r1, [r1]\n" " add r2, r7, #1\n" " lsl r2, r2, #0x1\n" - " ldr r3, ._741 + 4\n" + " ldr r3, ._741 + 4 @ gUnknown_Debug_2023ABC\n" " add r2, r2, r3\n" " ldrb r2, [r2]\n" " str r6, [sp]\n" @@ -3511,7 +3511,7 @@ void debug_sub_801174C() " str r3, [sp, #0x8]\n" " mov r3, #0x0\n" " bl CreateMonWithGenderNatureLetter\n" - " ldr r1, ._741 + 8\n" + " ldr r1, ._741 + 8 @ gPlayerPartyCount\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" " strb r0, [r1]\n" @@ -3522,9 +3522,9 @@ void debug_sub_801174C() " mov r2, #0x64\n" " add r1, r0, #0\n" " mul r1, r1, r2\n" - " ldr r0, ._741\n" + " ldr r0, ._741 @ gPlayerParty\n" " add r4, r1, r0\n" - " ldr r0, ._741 + 12\n" + " ldr r0, ._741 + 12 @ gUnknown_Debug_2023AC0\n" " mov r3, r8\n" " add r5, r3, r0\n" " add r0, r4, #0\n" @@ -3533,7 +3533,7 @@ void debug_sub_801174C() " bl SetMonData\n" " ldr r1, [sp, #0x10]\n" " lsl r0, r1, #0x1\n" - " ldr r2, ._741 + 16\n" + " ldr r2, ._741 + 16 @ gUnknown_Debug_2023A76\n" " add r0, r0, r2\n" " ldrh r0, [r0]\n" " sub r0, r0, #0x1\n" @@ -3548,7 +3548,7 @@ void debug_sub_801174C() "._736:\n" " ldr r3, [sp, #0x14]\n" " lsl r0, r3, #0x1\n" - " ldr r1, ._741 + 4\n" + " ldr r1, ._741 + 4 @ gUnknown_Debug_2023ABC\n" " add r0, r0, r1\n" " mov r2, #0x0\n" " ldsh r1, [r0, r2]\n" @@ -3580,7 +3580,7 @@ void debug_sub_801174C() " bl __divsi3\n" " mov r2, #0x64\n" " mul r0, r0, r2\n" - " ldr r1, ._750\n" + " ldr r1, ._750 @ gPlayerParty\n" " add r0, r0, r1\n" " mov r1, #0x2e\n" " add r2, sp, #0xc\n" @@ -3588,7 +3588,7 @@ void debug_sub_801174C() "._738:\n" " ldr r3, [sp, #0x14]\n" " lsl r0, r3, #0x1\n" - " ldr r1, ._750 + 4\n" + " ldr r1, ._750 + 4 @ gUnknown_Debug_2023ABC\n" " add r0, r0, r1\n" " mov r2, #0x0\n" " ldsh r0, [r0, r2]\n" @@ -3599,12 +3599,12 @@ void debug_sub_801174C() " bl __divsi3\n" " mov r3, #0x64\n" " mul r0, r0, r3\n" - " ldr r1, ._750\n" + " ldr r1, ._750 @ gPlayerParty\n" " add r0, r0, r1\n" " mov r1, #0x7\n" - " ldr r2, ._750 + 8\n" + " ldr r2, ._750 + 8 @ Str_821F649\n" " bl SetMonData\n" - " ldr r2, ._750 + 12\n" + " ldr r2, ._750 + 12 @ gUnknown_02023A14_50\n" " ldrb r0, [r2]\n" " mov r1, #0x40\n" " orr r0, r0, r1\n" @@ -3619,9 +3619,9 @@ void debug_sub_801174C() " str r0, [sp, #0xc]\n" " mov r0, #0x64\n" " mov r8, r0\n" - " ldr r1, ._750 + 16\n" + " ldr r1, ._750 + 16 @ gUnknown_Debug_2023B02\n" " mov r9, r1\n" - " ldr r2, ._750\n" + " ldr r2, ._750 @ gPlayerParty\n" " mov sl, r2\n" "._747:\n" " mov r7, #0x0\n" @@ -3629,7 +3629,7 @@ void debug_sub_801174C() " ldr r2, [sp, #0xc]\n" " mov r0, r8\n" " mul r0, r0, r2\n" - " ldr r3, ._750 + 20\n" + " ldr r3, ._750 + 20 @ gEnemyParty\n" " add r0, r0, r3\n" " add r5, r7, #0\n" " add r5, r5, #0xd\n" @@ -3643,7 +3643,7 @@ void debug_sub_801174C() " ldr r1, [sp, #0xc]\n" " mov r0, r8\n" " mul r0, r0, r1\n" - " ldr r2, ._750 + 20\n" + " ldr r2, ._750 + 20 @ gEnemyParty\n" " add r0, r0, r2\n" " add r6, r7, #0\n" " add r6, r6, #0x11\n" @@ -3655,7 +3655,7 @@ void debug_sub_801174C() " lsl r2, r1, #0x1\n" " add r2, r2, r1\n" " lsl r2, r2, #0x2\n" - " ldr r1, ._750 + 24\n" + " ldr r1, ._750 + 24 @ gBattleMoves\n" " add r2, r2, r1\n" " add r1, r6, #0\n" " bl SetMonData\n" @@ -3664,7 +3664,7 @@ void debug_sub_801174C() " mul r0, r0, r2\n" " add r0, r0, sl\n" " lsl r2, r2, #0x3\n" - " ldr r3, ._750 + 28\n" + " ldr r3, ._750 + 28 @ gUnknown_Debug_2023B32\n" " add r1, r4, r3\n" " add r2, r2, r1\n" " add r1, r5, #0\n" @@ -3675,14 +3675,14 @@ void debug_sub_801174C() " add r0, r0, sl\n" " lsl r1, r1, #0x3\n" " add r4, r4, r1\n" - " ldr r1, ._750 + 28\n" + " ldr r1, ._750 + 28 @ gUnknown_Debug_2023B32\n" " add r4, r4, r1\n" " mov r2, #0x0\n" " ldsh r1, [r4, r2]\n" " lsl r2, r1, #0x1\n" " add r2, r2, r1\n" " lsl r2, r2, #0x2\n" - " ldr r3, ._750 + 24\n" + " ldr r3, ._750 + 24 @ gBattleMoves\n" " add r2, r2, r3\n" " add r1, r6, #0\n" " bl SetMonData\n" @@ -3694,7 +3694,7 @@ void debug_sub_801174C() " str r0, [sp, #0xc]\n" " cmp r0, #0x5\n" " ble ._747 @cond_branch\n" - " ldr r3, ._750 + 32\n" + " ldr r3, ._750 + 32 @ gUnknown_Debug_2023A76\n" " add r4, r3, #0\n" " add r4, r4, #0x44\n" " ldrh r1, [r4]\n" @@ -3702,7 +3702,7 @@ void debug_sub_801174C() " ldsh r0, [r4, r2]\n" " cmp r0, #0x8\n" " bne ._748 @cond_branch\n" - " ldr r0, ._750 + 12\n" + " ldr r0, ._750 + 12 @ gUnknown_02023A14_50\n" " ldrb r1, [r0]\n" " mov r2, #0x80\n" " b ._753\n" @@ -3721,7 +3721,7 @@ void debug_sub_801174C() "._748:\n" " cmp r0, #0x7\n" " bne ._752 @cond_branch\n" - " ldr r0, ._754\n" + " ldr r0, ._754 @ gUnknown_02023A14_50\n" " ldrb r1, [r0]\n" " mov r2, #0x20\n" " b ._753\n" @@ -3732,7 +3732,7 @@ void debug_sub_801174C() "._752:\n" " cmp r0, #0x6\n" " bne ._756 @cond_branch\n" - " ldr r2, ._759\n" + " ldr r2, ._759 @ gUnknown_02023A14_50\n" " ldrb r0, [r2]\n" " mov r1, #0x10\n" " orr r0, r0, r1\n" @@ -3742,9 +3742,9 @@ void debug_sub_801174C() " ldsh r0, [r3, r2]\n" " cmp r0, #0x5\n" " ble ._757 @cond_branch\n" - " ldr r0, ._759 + 4\n" + " ldr r0, ._759 + 4 @ gSharedMem\n" " sub r1, r1, #0x2\n" - " ldr r3, ._759 + 8\n" + " ldr r3, ._759 + 8 @ 0x160a3\n" " add r0, r0, r3\n" " b ._761\n" "._760:\n" @@ -3754,8 +3754,8 @@ void debug_sub_801174C() " .word gSharedMem\n" " .word 0x160a3\n" "._757:\n" - " ldr r0, ._762\n" - " ldr r2, ._762 + 4\n" + " ldr r0, ._762 @ gSharedMem\n" + " ldr r2, ._762 + 4 @ 0x160a3\n" " add r0, r0, r2\n" " b ._761\n" "._763:\n" @@ -3766,7 +3766,7 @@ void debug_sub_801174C() "._756:\n" " cmp r0, #0x5\n" " bne ._764 @cond_branch\n" - " ldr r0, ._766\n" + " ldr r0, ._766 @ gUnknown_02023A14_50\n" " ldrb r1, [r0]\n" " mov r2, #0x21\n" "._753:\n" @@ -3791,7 +3791,7 @@ void debug_sub_801174C() " and r0, r0, r3\n" " cmp r0, #0\n" " beq ._769 @cond_branch\n" - " ldr r0, ._772\n" + " ldr r0, ._772 @ gUnknown_02023A14_50\n" " ldrb r1, [r0]\n" " mov r2, #0x4\n" " orr r1, r1, r2\n" @@ -3801,16 +3801,16 @@ void debug_sub_801174C() " and r0, r0, r3\n" " cmp r0, #0\n" " beq ._770 @cond_branch\n" - " ldr r0, ._772\n" + " ldr r0, ._772 @ gUnknown_02023A14_50\n" " ldrb r1, [r0]\n" " mov r2, #0x6\n" " orr r1, r1, r2\n" " strb r1, [r0]\n" "._770:\n" - " ldr r0, ._772 + 4\n" - " ldr r1, ._772 + 8\n" + " ldr r0, ._772 + 4 @ gMain\n" + " ldr r1, ._772 + 8 @ debug_sub_80108B8\n" " str r1, [r0, #0x8]\n" - " ldr r0, ._772 + 12\n" + " ldr r0, ._772 + 12 @ unref_sub_800D684\n" " bl SetMainCallback2\n" " bl ClearBag\n" " mov r0, #0x1\n" @@ -3888,7 +3888,7 @@ void debug_sub_801174C() " mov r0, #0x50\n" " mov r1, #0x63\n" " bl AddBagItem\n" - " ldr r4, ._772 + 16\n" + " ldr r4, ._772 + 16 @ gUnknown_Debug_821F5AC\n" " mov r7, #0xe\n" "._771:\n" " add r0, r4, #0\n" @@ -3995,7 +3995,7 @@ void debug_sub_8011EA0(u8 a) " b ._815\n" "._782:\n" " lsl r0, r7, #0x2\n" - " ldr r1, ._785\n" + " ldr r1, ._785 @ \n" " add r1, r0, r1\n" " ldr r1, [r1]\n" " str r0, [sp, #0x8]\n" @@ -4044,8 +4044,8 @@ void debug_sub_8011EA0(u8 a) " mov r0, #0x0\n" " mov r1, #0x14\n" " bl debug_sub_8010A7C\n" - " ldr r6, ._823\n" - " ldr r2, ._823 + 4\n" + " ldr r6, ._823 @ gBattleTextBuff1\n" + " ldr r2, ._823 + 4 @ gUnknown_Debug_821F424\n" " ldr r0, [sp, #0x8]\n" " add r1, r0, r7\n" " lsl r1, r1, #0x1\n" @@ -4061,17 +4061,17 @@ void debug_sub_8011EA0(u8 a) " ldrb r1, [r1]\n" " mov r9, r1\n" " str r1, [sp]\n" - " ldr r0, ._823 + 8\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" " add r1, r6, #0\n" " ldr r2, [sp, #0x4]\n" " mov r3, r8\n" " bl Text_InitWindow\n" - " ldr r0, ._823 + 8\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" " bl Text_PrintWindow8002F44\n" - " ldr r1, ._823 + 12\n" + " ldr r1, ._823 + 12 @ gUnknown_Debug_2023A76\n" " mov sl, r1\n" " lsl r4, r7, #0x1\n" - " ldr r5, ._823 + 16\n" + " ldr r5, ._823 + 16 @ gUnknown_Debug_03004360\n" " ldrb r0, [r5]\n" " mov r7, #0x46\n" " mul r0, r0, r7\n" @@ -4092,10 +4092,10 @@ void debug_sub_8011EA0(u8 a) " lsr r3, r3, #0x18\n" " mov r0, #0x0\n" " str r0, [sp]\n" - " ldr r0, ._823 + 8\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" " add r1, r6, #0\n" " bl Text_InitWindow\n" - " ldr r0, ._823 + 8\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" " bl Text_PrintWindow8002F44\n" " mov r0, #0xff\n" " strb r0, [r6]\n" @@ -4107,18 +4107,18 @@ void debug_sub_8011EA0(u8 a) " ldsh r1, [r4, r0]\n" " mov r0, #0xb\n" " mul r1, r1, r0\n" - " ldr r0, ._823 + 20\n" + " ldr r0, ._823 + 20 @ gSpeciesNames\n" " add r1, r1, r0\n" " add r0, r6, #0\n" " bl StringAppend\n" " mov r1, r9\n" " str r1, [sp]\n" - " ldr r0, ._823 + 8\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" " add r1, r6, #0\n" " ldr r2, [sp, #0x4]\n" " mov r3, r8\n" " bl Text_InitWindow\n" - " ldr r0, ._823 + 8\n" + " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" " bl Text_PrintWindow8002F44\n" " b ._848\n" "._824:\n" @@ -4131,10 +4131,10 @@ void debug_sub_8011EA0(u8 a) " .word gUnknown_Debug_03004360\n" " .word gSpeciesNames\n" "._817:\n" - " ldr r6, ._826\n" - " ldr r3, ._826 + 4\n" + " ldr r6, ._826 @ gBattleTextBuff1\n" + " ldr r3, ._826 + 4 @ gUnknown_Debug_2023A76\n" " lsl r1, r7, #0x1\n" - " ldr r0, ._826 + 8\n" + " ldr r0, ._826 + 8 @ gUnknown_Debug_03004360\n" " ldrb r2, [r0]\n" " mov r0, #0x46\n" " mul r0, r0, r2\n" @@ -4157,10 +4157,10 @@ void debug_sub_8011EA0(u8 a) " mov r0, #0x0\n" " mov r1, #0x18\n" " bl debug_sub_8010A7C\n" - " ldr r6, ._830\n" - " ldr r1, ._830 + 4\n" + " ldr r6, ._830 @ gUnknown_Debug_03004370\n" + " ldr r1, ._830 + 4 @ gBattleTextBuff1\n" " mov sl, r1\n" - " ldr r4, ._830 + 8\n" + " ldr r4, ._830 + 8 @ gUnknown_Debug_821F424\n" " ldr r2, [sp, #0x8]\n" " add r1, r2, r7\n" " lsl r1, r1, #0x1\n" @@ -4179,12 +4179,12 @@ void debug_sub_8011EA0(u8 a) " add r0, r6, #0\n" " bl Text_PrintWindow8002F44\n" " lsl r4, r7, #0x1\n" - " ldr r5, ._830 + 12\n" + " ldr r5, ._830 + 12 @ gUnknown_Debug_03004360\n" " ldrb r0, [r5]\n" " mov r1, #0x46\n" " mul r0, r0, r1\n" " add r0, r4, r0\n" - " ldr r2, ._830 + 16\n" + " ldr r2, ._830 + 16 @ gUnknown_Debug_2023A76\n" " add r0, r0, r2\n" " mov r2, #0x0\n" " ldsh r1, [r0, r2]\n" @@ -4213,7 +4213,7 @@ void debug_sub_8011EA0(u8 a) " mov r2, #0x46\n" " mul r0, r0, r2\n" " add r4, r4, r0\n" - " ldr r0, ._830 + 16\n" + " ldr r0, ._830 + 16 @ gUnknown_Debug_2023A76\n" " add r4, r4, r0\n" " mov r1, #0x0\n" " ldsh r0, [r4, r1]\n" @@ -4234,13 +4234,13 @@ void debug_sub_8011EA0(u8 a) " .word gUnknown_Debug_03004360\n" " .word gUnknown_Debug_2023A76\n" "._828:\n" - " ldr r1, ._833\n" + " ldr r1, ._833 @ Str_821F624\n" " mov r0, sl\n" " bl StringAppend\n" "._829:\n" - " ldr r6, ._833 + 4\n" - " ldr r1, ._833 + 8\n" - " ldr r5, ._833 + 12\n" + " ldr r6, ._833 + 4 @ gUnknown_Debug_03004370\n" + " ldr r1, ._833 + 8 @ gBattleTextBuff1\n" + " ldr r5, ._833 + 12 @ gUnknown_Debug_821F424\n" " ldr r2, [sp, #0x8]\n" " add r4, r2, r7\n" " lsl r4, r4, #0x1\n" @@ -4269,9 +4269,9 @@ void debug_sub_8011EA0(u8 a) " mov r0, #0x0\n" " mov r1, #0x4\n" " bl debug_sub_8010A7C\n" - " ldr r5, ._839\n" - " ldr r6, ._839 + 4\n" - " ldr r4, ._839 + 8\n" + " ldr r5, ._839 @ gUnknown_Debug_03004370\n" + " ldr r6, ._839 + 4 @ gBattleTextBuff1\n" + " ldr r4, ._839 + 8 @ gUnknown_Debug_821F424\n" " ldr r0, [sp, #0x8]\n" " add r1, r0, r7\n" " lsl r1, r1, #0x1\n" @@ -4290,9 +4290,9 @@ void debug_sub_8011EA0(u8 a) " add r0, r5, #0\n" " bl Text_PrintWindow8002F44\n" " mov r4, #0x0\n" - " ldr r3, ._839 + 12\n" + " ldr r3, ._839 + 12 @ gUnknown_Debug_2023A76\n" " lsl r1, r7, #0x1\n" - " ldr r0, ._839 + 16\n" + " ldr r0, ._839 + 16 @ gUnknown_Debug_03004360\n" " ldrb r2, [r0]\n" " mov r0, #0x46\n" " mul r0, r0, r2\n" @@ -4341,7 +4341,7 @@ void debug_sub_8011EA0(u8 a) " mov r4, #0x2\n" " b ._847\n" "._843:\n" - " ldr r2, ._849\n" + " ldr r2, ._849 @ gBattleTextBuff1\n" " add r1, r4, r2\n" " mov r0, #0xac\n" " strb r0, [r1]\n" @@ -4352,8 +4352,8 @@ void debug_sub_8011EA0(u8 a) " mov r0, #0xff\n" " strb r0, [r1]\n" "._825:\n" - " ldr r5, ._849 + 4\n" - " ldr r4, ._849 + 8\n" + " ldr r5, ._849 + 4 @ gUnknown_Debug_03004370\n" + " ldr r4, ._849 + 8 @ gUnknown_Debug_821F424\n" " ldr r0, [sp, #0x8]\n" " add r1, r0, r7\n" " lsl r1, r1, #0x1\n" @@ -4379,10 +4379,10 @@ void debug_sub_8011EA0(u8 a) " .word gUnknown_Debug_03004370\n" " .word gUnknown_Debug_821F424\n" "._815:\n" - " ldr r6, ._851\n" - " ldr r3, ._851 + 4\n" + " ldr r6, ._851 @ gBattleTextBuff1\n" + " ldr r3, ._851 + 4 @ gUnknown_Debug_2023A76\n" " lsl r1, r7, #0x1\n" - " ldr r0, ._851 + 8\n" + " ldr r0, ._851 + 8 @ gUnknown_Debug_03004360\n" " ldrb r2, [r0]\n" " mov r0, #0x46\n" " mul r0, r0, r2\n" @@ -4394,8 +4394,8 @@ void debug_sub_8011EA0(u8 a) " mov r2, #0x2\n" " mov r3, #0x1\n" " bl ConvertIntToDecimalStringN\n" - " ldr r5, ._851 + 12\n" - " ldr r4, ._851 + 16\n" + " ldr r5, ._851 + 12 @ gUnknown_Debug_03004370\n" + " ldr r4, ._851 + 16 @ gUnknown_Debug_821F424\n" " lsl r1, r7, #0x2\n" " add r1, r1, r7\n" " lsl r1, r1, #0x1\n" @@ -4444,8 +4444,8 @@ void debug_sub_8012294() " mov r5, r8\n" " push {r5, r6, r7}\n" " add sp, sp, #0xfffffffc\n" - " ldr r2, ._854\n" - " ldr r0, ._854 + 4\n" + " ldr r2, ._854 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._854 + 4 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" @@ -4458,23 +4458,23 @@ void debug_sub_8012294() " mov r0, #0x0\n" " mov r1, #0x18\n" " bl debug_sub_8010A7C\n" - " ldr r0, ._854 + 8\n" + " ldr r0, ._854 + 8 @ gUnknown_Debug_03004370\n" " mov sl, r0\n" - " ldr r1, ._854 + 12\n" + " ldr r1, ._854 + 12 @ gBattleTextBuff1\n" " mov r9, r1\n" - " ldr r2, ._854 + 16\n" + " ldr r2, ._854 + 16 @ gUnknown_Debug_821F564\n" " mov r8, r2\n" - " ldr r7, ._854 + 20\n" + " ldr r7, ._854 + 20 @ gUnknown_Debug_030043A8\n" " ldrb r1, [r7]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" " lsl r0, r0, #0x1\n" " add r1, r0, r2\n" " ldrh r2, [r1]\n" - " ldr r3, ._854 + 24\n" + " ldr r3, ._854 + 24 @ gUnknown_Debug_821F566\n" " add r1, r0, r3\n" " ldrb r3, [r1]\n" - " ldr r1, ._854 + 28\n" + " ldr r1, ._854 + 28 @ gUnknown_Debug_821F568\n" " add r0, r0, r1\n" " ldrb r0, [r0]\n" " str r0, [sp]\n" @@ -4492,13 +4492,13 @@ void debug_sub_8012294() " lsl r5, r5, #0x18\n" " lsr r5, r5, #0x15\n" " add r4, r4, r5\n" - " ldr r6, ._854 + 32\n" + " ldr r6, ._854 + 32 @ gUnknown_Debug_03004360\n" " ldrb r1, [r6]\n" " lsl r0, r1, #0x1\n" " add r0, r0, r1\n" " lsl r0, r0, #0x4\n" " add r4, r4, r0\n" - " ldr r2, ._854 + 36\n" + " ldr r2, ._854 + 36 @ gUnknown_Debug_2023B02\n" " add r4, r4, r2\n" " mov r3, #0x0\n" " ldsh r1, [r4, r3]\n" @@ -4531,13 +4531,13 @@ void debug_sub_8012294() " add r0, r0, r2\n" " lsl r0, r0, #0x4\n" " add r1, r1, r0\n" - " ldr r2, ._854 + 36\n" + " ldr r2, ._854 + 36 @ gUnknown_Debug_2023B02\n" " add r1, r1, r2\n" " mov r3, #0x0\n" " ldsh r1, [r1, r3]\n" " mov r0, #0xd\n" " mul r1, r1, r0\n" - " ldr r0, ._854 + 40\n" + " ldr r0, ._854 + 40 @ gMoveNames\n" " add r1, r1, r0\n" " mov r0, r9\n" " bl StringAppend\n" @@ -4548,10 +4548,10 @@ void debug_sub_8012294() " add r8, r8, r0\n" " mov r1, r8\n" " ldrh r2, [r1]\n" - " ldr r3, ._854 + 24\n" + " ldr r3, ._854 + 24 @ gUnknown_Debug_821F566\n" " add r1, r0, r3\n" " ldrb r3, [r1]\n" - " ldr r1, ._854 + 28\n" + " ldr r1, ._854 + 28 @ gUnknown_Debug_821F568\n" " add r0, r0, r1\n" " ldrb r0, [r0]\n" " str r0, [sp]\n" @@ -4604,10 +4604,10 @@ void debug_sub_80123D8(u8 a) " mov r0, #0x0\n" " mov r1, #0x12\n" " bl debug_sub_8010A7C\n" - " ldr r4, ._858\n" - " ldr r0, ._858 + 4\n" + " ldr r4, ._858 @ gUnknown_Debug_03004370\n" + " ldr r0, ._858 + 4 @ gBattleTextBuff1\n" " mov r8, r0\n" - " ldr r6, ._858 + 8\n" + " ldr r6, ._858 + 8 @ gUnknown_Debug_821F58C\n" " ldrh r1, [r6]\n" " mov sl, r1\n" " ldrb r7, [r6, #0x2]\n" @@ -4622,25 +4622,25 @@ void debug_sub_80123D8(u8 a) " add r0, r4, #0\n" " bl Text_PrintWindow8002F44\n" " lsl r5, r5, #0x1\n" - " ldr r1, ._858 + 12\n" + " ldr r1, ._858 + 12 @ gUnknown_Debug_03004360\n" " ldrb r0, [r1]\n" " mov r2, #0x46\n" " mul r0, r0, r2\n" " add r0, r5, r0\n" - " ldr r1, ._858 + 16\n" + " ldr r1, ._858 + 16 @ gUnknown_Debug_2023A76\n" " add r0, r0, r1\n" " mov r2, #0x0\n" " ldsh r1, [r0, r2]\n" " lsl r0, r1, #0x3\n" " sub r0, r0, r1\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._858 + 20\n" + " ldr r1, ._858 + 20 @ gBaseStats\n" " add r0, r0, r1\n" " ldrb r0, [r0, #0x16]\n" " mov r2, #0xd\n" " add r1, r0, #0\n" " mul r1, r1, r2\n" - " ldr r0, ._858 + 24\n" + " ldr r0, ._858 + 24 @ gAbilityNames\n" " add r1, r1, r0\n" " mov r0, r8\n" " bl StringCopy\n" @@ -4668,25 +4668,25 @@ void debug_sub_80123D8(u8 a) " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl Text_PrintWindow8002F44\n" - " ldr r1, ._858 + 12\n" + " ldr r1, ._858 + 12 @ gUnknown_Debug_03004360\n" " ldrb r0, [r1]\n" " mov r2, #0x46\n" " mul r0, r0, r2\n" " add r5, r5, r0\n" - " ldr r0, ._858 + 16\n" + " ldr r0, ._858 + 16 @ gUnknown_Debug_2023A76\n" " add r5, r5, r0\n" " mov r2, #0x0\n" " ldsh r1, [r5, r2]\n" " lsl r0, r1, #0x3\n" " sub r0, r0, r1\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._858 + 20\n" + " ldr r1, ._858 + 20 @ gBaseStats\n" " add r0, r0, r1\n" " ldrb r0, [r0, #0x17]\n" " mov r2, #0xd\n" " add r1, r0, #0\n" " mul r1, r1, r2\n" - " ldr r0, ._858 + 24\n" + " ldr r0, ._858 + 24 @ gAbilityNames\n" " add r1, r1, r0\n" " mov r0, r8\n" " bl StringCopy\n" @@ -4710,12 +4710,12 @@ void debug_sub_80123D8(u8 a) " .word gBaseStats\n" " .word gAbilityNames\n" "._856:\n" - " ldr r6, ._860\n" - " ldr r1, ._860 + 4\n" + " ldr r6, ._860 @ gBattleTextBuff1\n" + " ldr r1, ._860 + 4 @ gAbilityNames\n" " add r0, r6, #0\n" " bl StringCopy\n" - " ldr r5, ._860 + 8\n" - " ldr r4, ._860 + 12\n" + " ldr r5, ._860 + 8 @ gUnknown_Debug_03004370\n" + " ldr r4, ._860 + 12 @ gUnknown_Debug_821F58C\n" " ldrh r2, [r4]\n" " ldrb r3, [r4, #0x2]\n" " ldrb r0, [r4, #0x4]\n" @@ -4760,8 +4760,8 @@ void debug_sub_8012540() asm( " push {r4, r5, r6, lr}\n" " add sp, sp, #0xfffffffc\n" - " ldr r5, ._862\n" - " ldr r0, ._862 + 4\n" + " ldr r5, ._862 @ gBattleTextBuff1\n" + " ldr r0, ._862 + 4 @ gUnknown_Debug_2023A76\n" " add r0, r0, #0x44\n" " mov r2, #0x0\n" " ldsh r1, [r0, r2]\n" @@ -4769,8 +4769,8 @@ void debug_sub_8012540() " mov r2, #0x0\n" " mov r3, #0x1\n" " bl ConvertIntToDecimalStringN\n" - " ldr r4, ._862 + 8\n" - " ldr r1, ._862 + 12\n" + " ldr r4, ._862 + 8 @ gUnknown_Debug_03004370\n" + " ldr r1, ._862 + 12 @ gUnknown_Debug_821F424\n" " mov r3, #0x9b\n" " lsl r3, r3, #0x1\n" " add r0, r1, r3\n" @@ -4817,17 +4817,17 @@ void debug_sub_80125A0() { asm( " push {r4, lr}\n" - " ldr r4, ._864\n" - " ldr r3, ._864 + 4\n" - " ldr r2, ._864 + 8\n" - " ldr r0, ._864 + 12\n" + " ldr r4, ._864 @ gSharedMem\n" + " ldr r3, ._864 + 4 @ gUnknown_Debug_821F680\n" + " ldr r2, ._864 + 8 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._864 + 12 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" " ldrb r2, [r2]\n" " add r0, r0, r2\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._864 + 16\n" + " ldr r1, ._864 + 16 @ gUnknown_Debug_03004360\n" " ldrb r2, [r1]\n" " mov r1, #0x8c\n" " mul r1, r1, r2\n" @@ -4857,17 +4857,17 @@ void debug_sub_80125E4() { asm( " push {r4, lr}\n" - " ldr r4, ._866\n" - " ldr r3, ._866 + 4\n" - " ldr r2, ._866 + 8\n" - " ldr r0, ._866 + 12\n" + " ldr r4, ._866 @ gSharedMem\n" + " ldr r3, ._866 + 4 @ gUnknown_Debug_821F680\n" + " ldr r2, ._866 + 8 @ gUnknown_Debug_030043A0\n" + " ldr r0, ._866 + 12 @ gUnknown_Debug_030043A4\n" " ldrb r1, [r0]\n" " lsl r0, r1, #0x2\n" " add r0, r0, r1\n" " ldrb r2, [r2]\n" " add r0, r0, r2\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._866 + 16\n" + " ldr r1, ._866 + 16 @ gUnknown_Debug_03004360\n" " ldrb r2, [r1]\n" " mov r1, #0x8c\n" " mul r1, r1, r2\n" @@ -4896,12 +4896,12 @@ __attribute__((naked)) void debug_sub_8012628() { asm( - " ldr r3, ._868\n" - " ldr r2, ._868 + 4\n" - " ldr r0, ._868 + 8\n" + " ldr r3, ._868 @ gSharedMem\n" + " ldr r2, ._868 + 4 @ gUnknown_Debug_821F798\n" + " ldr r0, ._868 + 8 @ gUnknown_Debug_030043A8\n" " ldrb r1, [r0]\n" " lsl r1, r1, #0x2\n" - " ldr r0, ._868 + 12\n" + " ldr r0, ._868 + 12 @ gUnknown_Debug_03004360\n" " ldrb r0, [r0]\n" " lsl r0, r0, #0x4\n" " add r1, r1, r0\n" @@ -4926,12 +4926,12 @@ __attribute__((naked)) void debug_sub_8012658() { asm( - " ldr r3, ._870\n" - " ldr r2, ._870 + 4\n" - " ldr r0, ._870 + 8\n" + " ldr r3, ._870 @ gSharedMem\n" + " ldr r2, ._870 + 4 @ gUnknown_Debug_821F798\n" + " ldr r0, ._870 + 8 @ gUnknown_Debug_030043A8\n" " ldrb r1, [r0]\n" " lsl r1, r1, #0x2\n" - " ldr r0, ._870 + 12\n" + " ldr r0, ._870 + 12 @ gUnknown_Debug_03004360\n" " ldrb r0, [r0]\n" " lsl r0, r0, #0x4\n" " add r1, r1, r0\n" @@ -4963,7 +4963,7 @@ void debug_sub_8012688() " mov r1, #0x0\n" " mov r4, #0xcd\n" " lsl r4, r4, #0x1\n" - " ldr r3, ._873\n" + " ldr r3, ._873 @ gUnknown_Debug_2023B62\n" " mov r2, #0x0\n" "._872:\n" " add r0, r1, r3\n" @@ -4977,16 +4977,16 @@ void debug_sub_8012688() " bl SetVBlankCallback\n" " mov r5, #0x0\n" " str r5, [sp, #0x8]\n" - " ldr r1, ._873 + 4\n" + " ldr r1, ._873 + 4 @ 0x40000d4\n" " add r0, sp, #0x8\n" " str r0, [r1]\n" " mov r0, #0xc0\n" " lsl r0, r0, #0x13\n" " str r0, [r1, #0x4]\n" - " ldr r0, ._873 + 8\n" + " ldr r0, ._873 + 8 @ 0x85006000\n" " str r0, [r1, #0x8]\n" " ldr r0, [r1, #0x8]\n" - " ldr r0, ._873 + 12\n" + " ldr r0, ._873 + 12 @ 0x400004c\n" " strh r5, [r0]\n" " sub r0, r0, #0xc\n" " strh r5, [r0]\n" @@ -5000,28 +5000,28 @@ void debug_sub_8012688() " strh r5, [r0]\n" " add r0, r0, #0x2\n" " strh r5, [r0]\n" - " ldr r4, ._873 + 16\n" + " ldr r4, ._873 + 16 @ gWindowTemplate_81E6C58\n" " add r0, r4, #0\n" " bl Text_LoadWindowTemplate\n" " bl ResetPaletteFade\n" - " ldr r0, ._873 + 20\n" + " ldr r0, ._873 + 20 @ gBattle_BG0_X\n" " strh r5, [r0]\n" - " ldr r1, ._873 + 24\n" + " ldr r1, ._873 + 24 @ gBattle_BG0_Y\n" " mov r0, #0xa0\n" " strh r0, [r1]\n" - " ldr r0, ._873 + 28\n" + " ldr r0, ._873 + 28 @ gBattle_BG1_X\n" " strh r5, [r0]\n" - " ldr r0, ._873 + 32\n" + " ldr r0, ._873 + 32 @ gBattle_BG1_Y\n" " strh r5, [r0]\n" - " ldr r0, ._873 + 36\n" + " ldr r0, ._873 + 36 @ gBattle_BG2_X\n" " strh r5, [r0]\n" - " ldr r0, ._873 + 40\n" + " ldr r0, ._873 + 40 @ gBattle_BG2_Y\n" " strh r5, [r0]\n" - " ldr r0, ._873 + 44\n" + " ldr r0, ._873 + 44 @ gBattle_BG3_X\n" " strh r5, [r0]\n" - " ldr r0, ._873 + 48\n" + " ldr r0, ._873 + 48 @ gBattle_BG3_Y\n" " strh r5, [r0]\n" - " ldr r1, ._873 + 52\n" + " ldr r1, ._873 + 52 @ gBattleTerrain\n" " mov r0, #0x9\n" " strb r0, [r1]\n" " bl sub_800D6D4\n" @@ -5029,20 +5029,20 @@ void debug_sub_8012688() " bl ResetSpriteData\n" " bl ResetTasks\n" " bl FreeAllSpritePalettes\n" - " ldr r1, ._873 + 56\n" + " ldr r1, ._873 + 56 @ gReservedSpritePaletteCount\n" " mov r0, #0x4\n" " strb r0, [r1]\n" - " ldr r6, ._873 + 60\n" + " ldr r6, ._873 + 60 @ gCurrentMove\n" " mov r0, #0x1\n" " strh r0, [r6]\n" - " ldr r0, ._873 + 64\n" + " ldr r0, ._873 + 64 @ gUnknown_03004210\n" " add r1, r4, #0\n" " bl Text_InitWindowWithTemplate\n" " ldrh r2, [r6]\n" " lsl r0, r2, #0x3\n" - " ldr r1, ._873 + 68\n" + " ldr r1, ._873 + 68 @ gMonFrontPicTable\n" " add r0, r0, r1\n" - " ldr r1, ._873 + 72\n" + " ldr r1, ._873 + 72 @ gMonFrontPicCoords\n" " mov r8, r1\n" " lsl r2, r2, #0x2\n" " add r2, r2, r8\n" @@ -5050,13 +5050,13 @@ void debug_sub_8012688() " ldrb r2, [r2, #0x1]\n" " mov r3, #0x80\n" " lsl r3, r3, #0x12\n" - " ldr r4, ._873 + 76\n" + " ldr r4, ._873 + 76 @ gUnknown_081FAF4C\n" " ldr r4, [r4, #0x4]\n" " str r4, [sp]\n" " ldrh r4, [r6]\n" " str r4, [sp, #0x4]\n" " bl DecompressPicFromTable_2\n" - " ldr r1, ._873 + 80\n" + " ldr r1, ._873 + 80 @ gMonPaletteTable\n" " ldrh r0, [r6]\n" " lsl r0, r0, #0x3\n" " add r0, r0, r1\n" @@ -5068,7 +5068,7 @@ void debug_sub_8012688() " ldrh r0, [r6]\n" " mov r1, #0x1\n" " bl GetMonSpriteTemplate_803C56C\n" - " ldr r0, ._873 + 84\n" + " ldr r0, ._873 + 84 @ gUnknown_02024E8C\n" " ldrh r1, [r6]\n" " lsl r1, r1, #0x2\n" " add r1, r1, r8\n" @@ -5080,14 +5080,14 @@ void debug_sub_8012688() " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " ldr r3, ._873 + 88\n" + " ldr r3, ._873 + 88 @ gSprites\n" " lsl r1, r4, #0x4\n" " add r1, r1, r4\n" " lsl r1, r1, #0x2\n" " add r0, r3, #0\n" " add r0, r0, #0x1c\n" " add r0, r1, r0\n" - " ldr r2, ._873 + 92\n" + " ldr r2, ._873 + 92 @ nullsub_37\n" " str r2, [r0]\n" " add r1, r1, r3\n" " ldrb r2, [r1, #0x5]\n" @@ -5102,24 +5102,24 @@ void debug_sub_8012688() " lsl r2, r2, #0x5\n" " add r0, r2, #0\n" " strh r0, [r1]\n" - " ldr r0, ._873 + 96\n" + " ldr r0, ._873 + 96 @ debug_nullsub_45\n" " bl SetHBlankCallback\n" - " ldr r0, ._873 + 100\n" + " ldr r0, ._873 + 100 @ debug_sub_8011DD4\n" " bl SetVBlankCallback\n" " bl m4aMPlayAllStop\n" - " ldr r0, ._873 + 104\n" + " ldr r0, ._873 + 104 @ debug_sub_8012D10\n" " mov r1, #0x0\n" " bl CreateTask\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" - " ldr r2, ._873 + 108\n" + " ldr r2, ._873 + 108 @ gTasks\n" " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r1, r1, #0x3\n" " add r1, r1, r2\n" " strh r5, [r1, #0x8]\n" " strh r4, [r1, #0xa]\n" - " ldr r0, ._873 + 112\n" + " ldr r0, ._873 + 112 @ debug_sub_8012878\n" " bl SetMainCallback2\n" " add sp, sp, #0xc\n" " pop {r3}\n" @@ -5170,17 +5170,17 @@ void debug_sub_8012878() " push {lr}\n" " bl AnimateSprites\n" " bl BuildOamBuffer\n" - " ldr r0, ._876\n" + " ldr r0, ._876 @ gUnknown_03004210\n" " bl Text_UpdateWindowInBattle\n" " bl UpdatePaletteFade\n" " bl RunTasks\n" - " ldr r0, ._876 + 4\n" + " ldr r0, ._876 + 4 @ gMain\n" " ldrh r1, [r0, #0x2c]\n" " mov r0, #0x82\n" " lsl r0, r0, #0x1\n" " cmp r1, r0\n" " bne ._875 @cond_branch\n" - " ldr r0, ._876 + 8\n" + " ldr r0, ._876 + 8 @ debug_sub_80108B8\n" " bl SetMainCallback2\n" "._875:\n" " pop {r0}\n" @@ -5206,8 +5206,8 @@ void debug_sub_80128B4() " mov r0, #0x0\n" " mov r1, #0x9\n" " bl debug_sub_8010A7C\n" - " ldr r5, ._878\n" - " ldr r4, ._878 + 4\n" + " ldr r5, ._878 @ gUnknown_03004210\n" + " ldr r4, ._878 + 4 @ gBattleTextBuff1\n" " mov r0, #0x23\n" " mov r8, r0\n" " str r0, [sp]\n" @@ -5218,7 +5218,7 @@ void debug_sub_80128B4() " bl Text_InitWindow\n" " add r0, r5, #0\n" " bl Text_PrintWindow8002F44\n" - " ldr r6, ._878 + 8\n" + " ldr r6, ._878 + 8 @ gCurrentMove\n" " ldrh r1, [r6]\n" " add r0, r4, #0\n" " mov r2, #0x2\n" @@ -5231,7 +5231,7 @@ void debug_sub_80128B4() " ldrh r1, [r6]\n" " mov r0, #0xb\n" " mul r1, r1, r0\n" - " ldr r0, ._878 + 12\n" + " ldr r0, ._878 + 12 @ gSpeciesNames\n" " add r1, r1, r0\n" " add r0, r4, #0\n" " bl StringAppend\n" @@ -5277,8 +5277,8 @@ void debug_sub_8012938() " mov r0, #0x0\n" " mov r1, #0x7\n" " bl debug_sub_8010A7C\n" - " ldr r6, ._880\n" - " ldr r4, ._880 + 4\n" + " ldr r6, ._880 @ gUnknown_03004210\n" + " ldr r4, ._880 + 4 @ gBattleTextBuff1\n" " mov r0, #0x25\n" " mov r8, r0\n" " str r0, [sp]\n" @@ -5289,13 +5289,13 @@ void debug_sub_8012938() " bl Text_InitWindow\n" " add r0, r6, #0\n" " bl Text_PrintWindow8002F44\n" - " ldr r1, ._880 + 8\n" + " ldr r1, ._880 + 8 @ Str_821F7B8\n" " add r0, r4, #0\n" " bl StringCopy\n" " add r0, r4, #4\n" - " ldr r1, ._880 + 12\n" + " ldr r1, ._880 + 12 @ gUnknown_Debug_2023B62\n" " mov sl, r1\n" - " ldr r2, ._880 + 16\n" + " ldr r2, ._880 + 16 @ gCurrentMove\n" " mov r9, r2\n" " ldrh r1, [r2]\n" " sub r1, r1, #0x1\n" @@ -5313,8 +5313,8 @@ void debug_sub_8012938() " bl Text_InitWindow\n" " add r0, r6, #0\n" " bl Text_PrintWindow8002F44\n" - " ldr r2, ._880 + 20\n" - " ldr r1, ._880 + 24\n" + " ldr r2, ._880 + 20 @ gSprites\n" + " ldr r1, ._880 + 24 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -5365,12 +5365,12 @@ void debug_sub_80129F8() " add r5, r0, #0\n" " lsl r5, r5, #0x18\n" " lsr r5, r5, #0x18\n" - " ldr r6, ._882\n" + " ldr r6, ._882 @ gCurrentMove\n" " ldrh r2, [r6]\n" " lsl r0, r2, #0x3\n" - " ldr r1, ._882 + 4\n" + " ldr r1, ._882 + 4 @ gMonFrontPicTable\n" " add r0, r0, r1\n" - " ldr r1, ._882 + 8\n" + " ldr r1, ._882 + 8 @ gMonFrontPicCoords\n" " mov r8, r1\n" " lsl r2, r2, #0x2\n" " add r2, r2, r8\n" @@ -5378,13 +5378,13 @@ void debug_sub_80129F8() " ldrb r2, [r2, #0x1]\n" " mov r3, #0x80\n" " lsl r3, r3, #0x12\n" - " ldr r4, ._882 + 12\n" + " ldr r4, ._882 + 12 @ gUnknown_081FAF4C\n" " ldr r4, [r4, #0x4]\n" " str r4, [sp]\n" " ldrh r4, [r6]\n" " str r4, [sp, #0x4]\n" " bl DecompressPicFromTable_2\n" - " ldr r1, ._882 + 16\n" + " ldr r1, ._882 + 16 @ gMonPaletteTable\n" " ldrh r0, [r6]\n" " lsl r0, r0, #0x3\n" " add r0, r0, r1\n" @@ -5393,8 +5393,8 @@ void debug_sub_80129F8() " lsl r1, r1, #0x1\n" " mov r2, #0x20\n" " bl LoadCompressedPalette\n" - " ldr r4, ._882 + 20\n" - " ldr r0, ._882 + 24\n" + " ldr r4, ._882 + 20 @ gSprites\n" + " ldr r0, ._882 + 24 @ gTasks\n" " lsl r2, r5, #0x2\n" " add r2, r2, r5\n" " lsl r2, r2, #0x3\n" @@ -5417,7 +5417,7 @@ void debug_sub_80129F8() " add r1, r1, r0\n" " lsl r1, r1, #0x2\n" " add r1, r1, r4\n" - " ldr r3, ._882 + 28\n" + " ldr r3, ._882 + 28 @ gUnknown_Debug_2023B62\n" " ldrh r0, [r6]\n" " sub r0, r0, #0x1\n" " add r0, r0, r3\n" @@ -5462,8 +5462,8 @@ void debug_sub_8012AC0() " lsr r5, r0, #0x18\n" " lsl r1, r1, #0x18\n" " lsr r6, r1, #0x18\n" - " ldr r3, ._885\n" - " ldr r4, ._885 + 4\n" + " ldr r3, ._885 @ gCurrentMove\n" + " ldr r4, ._885 + 4 @ gBaseStats\n" " b ._884\n" "._886:\n" " .align 2, 0\n" @@ -5484,12 +5484,12 @@ void debug_sub_8012AC0() " lsl r0, r0, #0x10\n" " cmp r0, #0\n" " bne ._888 @cond_branch\n" - " ldr r1, ._891\n" + " ldr r1, ._891 @ 0x19b\n" " add r0, r1, #0\n" " strh r0, [r2]\n" "._888:\n" " ldrh r1, [r2]\n" - " ldr r0, ._891\n" + " ldr r0, ._891 @ 0x19b\n" " cmp r1, r0\n" " bne ._889 @cond_branch\n" " mov r0, #0x1\n" @@ -5526,11 +5526,11 @@ void debug_sub_8012B2C() asm( " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x11\n" - " ldr r1, ._893\n" + " ldr r1, ._893 @ 0x600c772\n" " add r2, r0, r1\n" " mov r1, #0x1\n" " strh r1, [r2]\n" - " ldr r1, ._893 + 4\n" + " ldr r1, ._893 + 4 @ 0x600c7b2\n" " add r0, r0, r1\n" " mov r1, #0x2\n" " strh r1, [r0]\n" @@ -5550,12 +5550,12 @@ void debug_sub_8012B4C() asm( " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x11\n" - " ldr r2, ._895\n" + " ldr r2, ._895 @ 0x600c772\n" " add r1, r0, r2\n" - " ldr r3, ._895 + 4\n" + " ldr r3, ._895 + 4 @ 0x1016\n" " add r2, r3, #0\n" " strh r2, [r1]\n" - " ldr r1, ._895 + 8\n" + " ldr r1, ._895 + 8 @ 0x600c7b2\n" " add r0, r0, r1\n" " strh r2, [r0]\n" " bx lr\n" @@ -5593,7 +5593,7 @@ void debug_sub_8012B70() " bl debug_sub_8012938\n" " add r0, r5, #0\n" " bl debug_sub_80129F8\n" - " ldr r1, ._899\n" + " ldr r1, ._899 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -5611,15 +5611,15 @@ void debug_sub_8012B70() " mov r2, #0x1d\n" " mov r3, #0x21\n" " bl sub_802BBD4\n" - " ldr r0, ._901\n" + " ldr r0, ._901 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" " add r4, r4, r0\n" " mov r0, #0x2\n" " strh r0, [r4, #0x8]\n" - " ldr r5, ._901 + 4\n" - " ldr r1, ._901 + 8\n" + " ldr r5, ._901 + 4 @ gUnknown_03004210\n" + " ldr r1, ._901 + 8 @ Str_821F7DA\n" " mov r2, #0xa4\n" " lsl r2, r2, #0x2\n" " mov r0, #0x1d\n" @@ -5663,8 +5663,8 @@ void debug_sub_8012C08() " mov r0, #0x0\n" " mov r1, #0x9\n" " bl debug_sub_8010A7C\n" - " ldr r7, ._905\n" - " ldr r5, ._905 + 4\n" + " ldr r7, ._905 @ gUnknown_03004210\n" + " ldr r5, ._905 + 4 @ gBattleTextBuff1\n" " mov r0, #0x23\n" " mov r8, r0\n" " str r0, [sp]\n" @@ -5696,14 +5696,14 @@ void debug_sub_8012C08() " bl sub_802BBD4\n" " cmp r4, #0\n" " beq ._903 @cond_branch\n" - " ldr r1, ._905 + 8\n" + " ldr r1, ._905 + 8 @ gTasks\n" " lsl r4, r6, #0x2\n" " add r0, r4, r6\n" " lsl r0, r0, #0x3\n" " add r0, r0, r1\n" " mov r1, #0x4\n" " strh r1, [r0, #0x8]\n" - " ldr r1, ._905 + 12\n" + " ldr r1, ._905 + 12 @ gUnknown_Debug_821F7F3\n" " mov r0, r8\n" " str r0, [sp]\n" " add r0, r7, #0\n" @@ -5719,14 +5719,14 @@ void debug_sub_8012C08() " .word gTasks\n" " .word gUnknown_Debug_821F7F3\n" "._903:\n" - " ldr r1, ._907\n" + " ldr r1, ._907 @ gTasks\n" " lsl r4, r6, #0x2\n" " add r0, r4, r6\n" " lsl r0, r0, #0x3\n" " add r0, r0, r1\n" " mov r1, #0x3\n" " strh r1, [r0, #0x8]\n" - " ldr r1, ._907 + 4\n" + " ldr r1, ._907 + 4 @ Str_821F7EA\n" " mov r0, r8\n" " str r0, [sp]\n" " add r0, r7, #0\n" @@ -5735,10 +5735,10 @@ void debug_sub_8012C08() " bl Text_InitWindow\n" "._904:\n" " add r5, r4, #0\n" - " ldr r4, ._907 + 8\n" + " ldr r4, ._907 + 8 @ gUnknown_03004210\n" " add r0, r4, #0\n" " bl Text_PrintWindow8002F44\n" - " ldr r1, ._907 + 12\n" + " ldr r1, ._907 + 12 @ BattleText_YesNo\n" " mov r2, #0xa4\n" " lsl r2, r2, #0x2\n" " mov r0, #0x1d\n" @@ -5748,7 +5748,7 @@ void debug_sub_8012C08() " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl Text_PrintWindow8002F44\n" - " ldr r1, ._907\n" + " ldr r1, ._907 @ gTasks\n" " add r0, r5, r6\n" " lsl r0, r0, #0x3\n" " add r0, r0, r1\n" @@ -5781,7 +5781,7 @@ void debug_sub_8012D10() " add sp, sp, #0xfffffffc\n" " lsl r0, r0, #0x18\n" " lsr r5, r0, #0x18\n" - " ldr r1, ._911\n" + " ldr r1, ._911 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -5793,7 +5793,7 @@ void debug_sub_8012D10() " b ._1067\n" "._909:\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._911 + 4\n" + " ldr r1, ._911 + 4 @ \n" " add r0, r0, r1\n" " ldr r0, [r0]\n" " mov pc, r0\n" @@ -5812,8 +5812,8 @@ void debug_sub_8012D10() " bl debug_sub_80128B4\n" " add r0, r5, #0\n" " bl debug_sub_8012938\n" - " ldr r4, ._920\n" - " ldr r1, ._920 + 4\n" + " ldr r4, ._920 @ gUnknown_03004210\n" + " ldr r1, ._920 + 4 @ Str_821F7BD\n" " mov r2, #0xc8\n" " lsl r2, r2, #0x1\n" " mov r0, #0x23\n" @@ -5823,7 +5823,7 @@ void debug_sub_8012D10() " bl Text_InitWindow\n" " add r0, r4, #0\n" " bl Text_PrintWindow8002F44\n" - " ldr r1, ._920 + 8\n" + " ldr r1, ._920 + 8 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -5840,7 +5840,7 @@ void debug_sub_8012D10() " .word Str_821F7BD\n" " .word gTasks\n" "._915:\n" - " ldr r2, ._924\n" + " ldr r2, ._924 @ gMain\n" " ldrh r1, [r2, #0x2e]\n" " mov r0, #0x40\n" " and r0, r0, r1\n" @@ -5848,7 +5848,7 @@ void debug_sub_8012D10() " beq ._922 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._924 + 4\n" + " ldr r0, ._924 + 4 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" @@ -5872,7 +5872,7 @@ void debug_sub_8012D10() " beq ._926 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._928\n" + " ldr r0, ._928 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" @@ -5893,7 +5893,7 @@ void debug_sub_8012D10() " beq ._930 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._932\n" + " ldr r0, ._932 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" @@ -5916,7 +5916,7 @@ void debug_sub_8012D10() " beq ._934 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._936\n" + " ldr r0, ._936 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" @@ -5948,7 +5948,7 @@ void debug_sub_8012D10() " beq ._938 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r1, ._943\n" + " ldr r1, ._943 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -5976,8 +5976,8 @@ void debug_sub_8012D10() "._946:\n" " b ._1067\n" "._941:\n" - " ldr r1, ._952\n" - " ldr r0, ._952 + 4\n" + " ldr r1, ._952 @ gUnknown_Debug_2023B62\n" + " ldr r0, ._952 + 4 @ gCurrentMove\n" " ldrh r0, [r0]\n" " sub r0, r0, #0x1\n" " add r1, r0, r1\n" @@ -5998,7 +5998,7 @@ void debug_sub_8012D10() " mov r0, #0x1\n" " b ._997\n" "._945:\n" - " ldr r1, ._957\n" + " ldr r1, ._957 @ gCurrentMove\n" " ldrh r2, [r1]\n" " mov r0, #0xcd\n" " lsl r0, r0, #0x1\n" @@ -6022,7 +6022,7 @@ void debug_sub_8012D10() " beq ._960 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r1, ._966\n" + " ldr r1, ._966 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -6047,8 +6047,8 @@ void debug_sub_8012D10() " beq ._968 @cond_branch\n" " b ._990\n" "._964:\n" - " ldr r1, ._973\n" - " ldr r0, ._973 + 4\n" + " ldr r1, ._973 @ gUnknown_Debug_2023B62\n" + " ldr r0, ._973 + 4 @ gCurrentMove\n" " ldrh r0, [r0]\n" " sub r0, r0, #0x1\n" " add r1, r0, r1\n" @@ -6066,7 +6066,7 @@ void debug_sub_8012D10() " .word gUnknown_Debug_2023B62\n" " .word gCurrentMove\n" "._968:\n" - " ldr r1, ._977\n" + " ldr r1, ._977 @ gCurrentMove\n" " ldrh r0, [r1]\n" " cmp r0, #0x1\n" " bls ._975 @cond_branch\n" @@ -6077,7 +6077,7 @@ void debug_sub_8012D10() "._977:\n" " .word gCurrentMove\n" "._975:\n" - " ldr r2, ._980\n" + " ldr r2, ._980 @ 0x19b\n" " add r0, r2, #0\n" " b ._979\n" "._981:\n" @@ -6092,7 +6092,7 @@ void debug_sub_8012D10() " beq ._982 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r1, ._987\n" + " ldr r1, ._987 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -6115,8 +6115,8 @@ void debug_sub_8012D10() " beq ._989 @cond_branch\n" " b ._990\n" "._985:\n" - " ldr r3, ._995\n" - " ldr r2, ._995 + 4\n" + " ldr r3, ._995 @ gUnknown_Debug_2023B62\n" + " ldr r2, ._995 + 4 @ gCurrentMove\n" " ldrh r0, [r2]\n" " sub r0, r0, #0x1\n" " add r1, r0, r3\n" @@ -6145,11 +6145,11 @@ void debug_sub_8012D10() " mov r0, #0x1\n" " b ._997\n" "._989:\n" - " ldr r3, ._1000\n" + " ldr r3, ._1000 @ gCurrentMove\n" " ldrh r2, [r3]\n" " add r1, r2, #0\n" " add r1, r1, #0xa\n" - " ldr r0, ._1000 + 4\n" + " ldr r0, ._1000 + 4 @ 0x19b\n" " cmp r1, r0\n" " bgt ._998 @cond_branch\n" " strh r1, [r3]\n" @@ -6160,7 +6160,7 @@ void debug_sub_8012D10() " .word gCurrentMove\n" " .word 0x19b\n" "._998:\n" - " ldr r1, ._1003\n" + " ldr r1, ._1003 @ 0xfffffe70\n" " add r0, r2, r1\n" " strh r0, [r3]\n" " b ._1025\n" @@ -6178,7 +6178,7 @@ void debug_sub_8012D10() "._1005:\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r1, ._1011\n" + " ldr r1, ._1011 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -6203,8 +6203,8 @@ void debug_sub_8012D10() " beq ._1014 @cond_branch\n" " b ._1067\n" "._1009:\n" - " ldr r1, ._1020\n" - " ldr r0, ._1020 + 4\n" + " ldr r1, ._1020 @ gUnknown_Debug_2023B62\n" + " ldr r0, ._1020 + 4 @ gCurrentMove\n" " ldrh r0, [r0]\n" " sub r0, r0, #0x1\n" " add r2, r0, r1\n" @@ -6238,7 +6238,7 @@ void debug_sub_8012D10() " bl debug_sub_8012AC0\n" " b ._1067\n" "._1013:\n" - " ldr r2, ._1026\n" + " ldr r2, ._1026 @ gCurrentMove\n" " ldrh r0, [r2]\n" " add r1, r0, #0\n" " sub r1, r1, #0xa\n" @@ -6268,7 +6268,7 @@ void debug_sub_8012D10() " bl debug_sub_8012B70\n" " b ._1067\n" "._916:\n" - " ldr r0, ._1032\n" + " ldr r0, ._1032 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x40\n" " and r0, r0, r1\n" @@ -6276,7 +6276,7 @@ void debug_sub_8012D10() " beq ._1030 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._1032 + 4\n" + " ldr r0, ._1032 + 4 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" @@ -6301,7 +6301,7 @@ void debug_sub_8012D10() " beq ._1035 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._1037\n" + " ldr r0, ._1037 @ gTasks\n" " lsl r1, r5, #0x2\n" " add r1, r1, r5\n" " lsl r1, r1, #0x3\n" @@ -6325,7 +6325,7 @@ void debug_sub_8012D10() " bl PlaySE\n" " b ._1063\n" "._917:\n" - " ldr r0, ._1044\n" + " ldr r0, ._1044 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x40\n" " and r0, r0, r1\n" @@ -6333,7 +6333,7 @@ void debug_sub_8012D10() " beq ._1042 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._1044 + 4\n" + " ldr r0, ._1044 + 4 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" @@ -6358,7 +6358,7 @@ void debug_sub_8012D10() " beq ._1047 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._1050\n" + " ldr r0, ._1050 @ gTasks\n" " lsl r1, r5, #0x2\n" " add r1, r1, r5\n" " lsl r1, r1, #0x3\n" @@ -6367,8 +6367,8 @@ void debug_sub_8012D10() " ldsh r0, [r1, r2]\n" " cmp r0, #0\n" " bne ._1063 @cond_branch\n" - " ldr r1, ._1050 + 4\n" - " ldr r2, ._1050 + 8\n" + " ldr r1, ._1050 + 4 @ gUnknown_Debug_2023B62\n" + " ldr r2, ._1050 + 8 @ 0x19b\n" " mov r0, #0x1f\n" " bl debug_sub_80132C8\n" " b ._1063\n" @@ -6387,7 +6387,7 @@ void debug_sub_8012D10() " bl PlaySE\n" " b ._1063\n" "._918:\n" - " ldr r0, ._1056\n" + " ldr r0, ._1056 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x40\n" " and r0, r0, r1\n" @@ -6395,7 +6395,7 @@ void debug_sub_8012D10() " beq ._1054 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._1056 + 4\n" + " ldr r0, ._1056 + 4 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" @@ -6417,7 +6417,7 @@ void debug_sub_8012D10() "._1046:\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._1060\n" + " ldr r0, ._1060 @ gTasks\n" " lsl r4, r5, #0x2\n" " add r4, r4, r5\n" " lsl r4, r4, #0x3\n" @@ -6440,7 +6440,7 @@ void debug_sub_8012D10() " beq ._1062 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r0, ._1065\n" + " ldr r0, ._1065 @ gTasks\n" " lsl r1, r5, #0x2\n" " add r1, r1, r5\n" " lsl r1, r1, #0x3\n" @@ -6449,8 +6449,8 @@ void debug_sub_8012D10() " ldsh r0, [r1, r2]\n" " cmp r0, #0\n" " bne ._1063 @cond_branch\n" - " ldr r1, ._1065 + 4\n" - " ldr r2, ._1065 + 8\n" + " ldr r1, ._1065 + 4 @ gUnknown_Debug_2023B62\n" + " ldr r2, ._1065 + 8 @ 0x19b\n" " mov r0, #0x1f\n" " bl debug_sub_8013294\n" "._1063:\n" @@ -6810,7 +6810,7 @@ void debug_sub_80138CC() { asm( " push {lr}\n" - " ldr r0, ._1167\n" + " ldr r0, ._1167 @ gActiveBank\n" " ldrb r0, [r0]\n" " bl GetBankSide\n" " lsl r0, r0, #0x18\n" @@ -6818,8 +6818,8 @@ void debug_sub_80138CC() " beq ._1163 @cond_branch\n" " b ._1186\n" "._1163:\n" - " ldr r1, ._1167 + 4\n" - " ldr r2, ._1167 + 8\n" + " ldr r1, ._1167 + 4 @ gSharedMem\n" + " ldr r2, ._1167 + 8 @ 0x160fd\n" " add r0, r1, r2\n" " ldrb r0, [r0]\n" " add r2, r1, #0\n" @@ -6828,7 +6828,7 @@ void debug_sub_80138CC() " b ._1186\n" "._1165:\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._1167 + 12\n" + " ldr r1, ._1167 + 12 @ \n" " add r0, r0, r1\n" " ldr r0, [r0]\n" " mov pc, r0\n" @@ -6846,16 +6846,16 @@ void debug_sub_80138CC() " .word ._1173\n" " .word ._1174\n" "._1170:\n" - " ldr r1, ._1177\n" - " ldr r0, ._1177 + 4\n" + " ldr r1, ._1177 @ gBattleBankFunc\n" + " ldr r0, ._1177 + 4 @ gActiveBank\n" " ldrb r0, [r0]\n" " lsl r0, r0, #0x2\n" " add r0, r0, r1\n" " ldr r1, [r0]\n" - " ldr r0, ._1177 + 8\n" + " ldr r0, ._1177 + 8 @ sub_802C098\n" " cmp r1, r0\n" " bne ._1186 @cond_branch\n" - " ldr r0, ._1177 + 12\n" + " ldr r0, ._1177 + 12 @ 0x160fd\n" " add r1, r2, r0\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" @@ -6868,16 +6868,16 @@ void debug_sub_80138CC() " .word sub_802C098+1\n" " .word 0x160fd\n" "._1171:\n" - " ldr r1, ._1180\n" + " ldr r1, ._1180 @ gMain\n" " mov r0, #0x1\n" " strh r0, [r1, #0x2c]\n" " strh r0, [r1, #0x2e]\n" - " ldr r0, ._1180 + 4\n" + " ldr r0, ._1180 + 4 @ 0x160fd\n" " add r1, r2, r0\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" " strb r0, [r1]\n" - " ldr r0, ._1180 + 8\n" + " ldr r0, ._1180 + 8 @ 0x160fe\n" " add r1, r2, r0\n" " mov r0, #0x80\n" " b ._1187\n" @@ -6888,7 +6888,7 @@ void debug_sub_80138CC() " .word 0x160fd\n" " .word 0x160fe\n" "._1172:\n" - " ldr r0, ._1184\n" + " ldr r0, ._1184 @ 0x160fe\n" " add r3, r2, r0\n" " ldrb r0, [r3]\n" " sub r0, r0, #0x1\n" @@ -6896,11 +6896,11 @@ void debug_sub_80138CC() " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " bne ._1186 @cond_branch\n" - " ldr r1, ._1184 + 4\n" + " ldr r1, ._1184 + 4 @ gMain\n" " mov r0, #0x1\n" " strh r0, [r1, #0x2c]\n" " strh r0, [r1, #0x2e]\n" - " ldr r0, ._1184 + 8\n" + " ldr r0, ._1184 + 8 @ 0x160fd\n" " add r1, r2, r0\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" @@ -6915,7 +6915,7 @@ void debug_sub_80138CC() " .word gMain\n" " .word 0x160fd\n" "._1173:\n" - " ldr r0, ._1188\n" + " ldr r0, ._1188 @ 0x160fe\n" " add r1, r2, r0\n" " ldrb r0, [r1]\n" " sub r0, r0, #0x1\n" @@ -6923,11 +6923,11 @@ void debug_sub_80138CC() " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " bne ._1186 @cond_branch\n" - " ldr r1, ._1188 + 4\n" + " ldr r1, ._1188 + 4 @ gMain\n" " mov r0, #0x1\n" " strh r0, [r1, #0x2c]\n" " strh r0, [r1, #0x2e]\n" - " ldr r0, ._1188 + 8\n" + " ldr r0, ._1188 + 8 @ 0x160fd\n" " add r1, r2, r0\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" @@ -6939,7 +6939,7 @@ void debug_sub_80138CC() " .word gMain\n" " .word 0x160fd\n" "._1174:\n" - " ldr r0, ._1190\n" + " ldr r0, ._1190 @ 0x160fd\n" " add r1, r2, r0\n" " mov r0, #0x0\n" "._1187:\n" @@ -6960,7 +6960,7 @@ void debug_sub_80139E4() { asm( " push {r4, r5, lr}\n" - " ldr r0, ._1198\n" + " ldr r0, ._1198 @ gUnknown_02023A14_50\n" " ldrb r1, [r0]\n" " mov r0, #0x80\n" " and r0, r0, r1\n" @@ -6968,10 +6968,10 @@ void debug_sub_80139E4() " lsr r4, r0, #0x18\n" " cmp r4, #0\n" " beq ._1192 @cond_branch\n" - " ldr r2, ._1198 + 4\n" + " ldr r2, ._1198 + 4 @ gActiveBank\n" " mov r0, #0x0\n" " strb r0, [r2]\n" - " ldr r1, ._1198 + 8\n" + " ldr r1, ._1198 + 8 @ gNoOfAllBanks\n" " ldrb r0, [r1]\n" " cmp r0, #0\n" " beq ._1193 @cond_branch\n" @@ -6988,17 +6988,17 @@ void debug_sub_80139E4() " cmp r0, r1\n" " bcc ._1194 @cond_branch\n" "._1193:\n" - " ldr r0, ._1198 + 12\n" + " ldr r0, ._1198 + 12 @ gBattleMainFunc\n" " ldr r0, [r0]\n" " bl _call_via_r0\n" - " ldr r1, ._1198 + 4\n" + " ldr r1, ._1198 + 4 @ gActiveBank\n" " mov r0, #0x0\n" " strb r0, [r1]\n" - " ldr r0, ._1198 + 8\n" + " ldr r0, ._1198 + 8 @ gNoOfAllBanks\n" " ldrb r0, [r0]\n" " cmp r0, #0\n" " beq ._1200 @cond_branch\n" - " ldr r5, ._1198 + 16\n" + " ldr r5, ._1198 + 16 @ gBattleBankFunc\n" " add r4, r1, #0\n" "._1196:\n" " ldrb r0, [r4]\n" @@ -7009,7 +7009,7 @@ void debug_sub_80139E4() " ldrb r0, [r4]\n" " add r0, r0, #0x1\n" " strb r0, [r4]\n" - " ldr r1, ._1198 + 8\n" + " ldr r1, ._1198 + 8 @ gNoOfAllBanks\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " ldrb r1, [r1]\n" @@ -7025,16 +7025,16 @@ void debug_sub_80139E4() " .word gBattleMainFunc\n" " .word gBattleBankFunc\n" "._1192:\n" - " ldr r0, ._1202\n" + " ldr r0, ._1202 @ gBattleMainFunc\n" " ldr r0, [r0]\n" " bl _call_via_r0\n" - " ldr r1, ._1202 + 4\n" + " ldr r1, ._1202 + 4 @ gActiveBank\n" " strb r4, [r1]\n" - " ldr r0, ._1202 + 8\n" + " ldr r0, ._1202 + 8 @ gNoOfAllBanks\n" " ldrb r0, [r0]\n" " cmp r4, r0\n" " bcs ._1200 @cond_branch\n" - " ldr r5, ._1202 + 12\n" + " ldr r5, ._1202 + 12 @ gBattleBankFunc\n" " add r4, r1, #0\n" "._1201:\n" " ldrb r0, [r4]\n" @@ -7045,7 +7045,7 @@ void debug_sub_80139E4() " ldrb r0, [r4]\n" " add r0, r0, #0x1\n" " strb r0, [r4]\n" - " ldr r1, ._1202 + 8\n" + " ldr r1, ._1202 + 8 @ gNoOfAllBanks\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " ldrb r1, [r1]\n" @@ -7080,20 +7080,20 @@ void sub_8010874() " bl SpecialStatusesClear\n" " mov r2, #0x0\n" " mov r3, #0x0\n" - " ldr r0, ._1215\n" + " ldr r0, ._1215 @ gUnknown_02024C4C\n" " mov sl, r0\n" - " ldr r1, ._1215 + 4\n" + " ldr r1, ._1215 + 4 @ gLastHitByType\n" " mov r9, r1\n" - " ldr r4, ._1215 + 8\n" + " ldr r4, ._1215 + 8 @ gLastLandedMoves\n" " mov r8, r4\n" - " ldr r0, ._1215 + 12\n" + " ldr r0, ._1215 + 12 @ gLastUsedMove\n" " mov ip, r0\n" - " ldr r4, ._1215 + 16\n" + " ldr r4, ._1215 + 16 @ gDisableStructs\n" " mov r5, #0x0\n" - " ldr r7, ._1215 + 20\n" - " ldr r6, ._1215 + 24\n" + " ldr r7, ._1215 + 20 @ gUnknown_02024C2C\n" + " ldr r6, ._1215 + 24 @ gLockedMoves\n" "._1205:\n" - " ldr r0, ._1215 + 28\n" + " ldr r0, ._1215 + 28 @ gStatuses3\n" " add r0, r5, r0\n" " str r3, [r0]\n" " mov r1, #0x0\n" @@ -7105,7 +7105,7 @@ void sub_8010874() " bls ._1204 @cond_branch\n" " mov r0, #0x2\n" " strb r0, [r4, #0x16]\n" - " ldr r1, ._1215 + 32\n" + " ldr r1, ._1215 + 32 @ gUnknown_02024C70\n" " add r0, r2, r1\n" " strb r3, [r0]\n" " mov r0, ip\n" @@ -7116,13 +7116,13 @@ void sub_8010874() " strh r3, [r0]\n" " mov r1, sl\n" " strh r3, [r1]\n" - " ldr r0, ._1215 + 36\n" + " ldr r0, ._1215 + 36 @ gUnknown_02024C5C\n" " add r1, r2, r0\n" " mov r0, #0xff\n" " strb r0, [r1]\n" " strh r3, [r6]\n" " strh r3, [r7]\n" - " ldr r1, ._1215 + 40\n" + " ldr r1, ._1215 + 40 @ gSharedMem\n" " add r0, r5, r1\n" " str r3, [r0]\n" " mov r0, #0x2\n" @@ -7138,8 +7138,8 @@ void sub_8010874() " cmp r2, #0x3\n" " ble ._1205 @cond_branch\n" " mov r5, #0x0\n" - " ldr r3, ._1215 + 44\n" - " ldr r4, ._1215 + 48\n" + " ldr r3, ._1215 + 44 @ gSideTimers\n" + " ldr r4, ._1215 + 48 @ gSideAffecting\n" " mov r2, #0x1\n" "._1207:\n" " strh r5, [r4]\n" @@ -7156,13 +7156,13 @@ void sub_8010874() " cmp r2, #0\n" " bge ._1207 @cond_branch\n" " mov r1, #0x0\n" - " ldr r2, ._1215 + 52\n" + " ldr r2, ._1215 + 52 @ gBankAttacker\n" " strb r1, [r2]\n" - " ldr r3, ._1215 + 56\n" + " ldr r3, ._1215 + 56 @ gBankTarget\n" " strb r1, [r3]\n" - " ldr r4, ._1215 + 60\n" + " ldr r4, ._1215 + 60 @ gBattleWeather\n" " strh r1, [r4]\n" - " ldr r1, ._1215 + 64\n" + " ldr r1, ._1215 + 64 @ gWishFutureKnock\n" " mov r2, #0x0\n" " mov r3, #0x0\n" "._1208:\n" @@ -7172,50 +7172,50 @@ void sub_8010874() " cmp r2, #0x2b\n" " bls ._1208 @cond_branch\n" " mov r0, #0x0\n" - " ldr r1, ._1215 + 68\n" + " ldr r1, ._1215 + 68 @ gHitMarker\n" " str r0, [r1]\n" - " ldr r2, ._1215 + 72\n" + " ldr r2, ._1215 + 72 @ gBattleTypeFlags\n" " ldrh r1, [r2]\n" " mov r0, #0x2\n" " and r0, r0, r1\n" " cmp r0, #0\n" " bne ._1210 @cond_branch\n" - " ldr r3, ._1215 + 76\n" + " ldr r3, ._1215 + 76 @ gSaveBlock2\n" " ldrb r1, [r3, #0x15]\n" " mov r0, #0x4\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._1210 @cond_branch\n" " mov r0, #0x80\n" - " ldr r4, ._1215 + 68\n" + " ldr r4, ._1215 + 68 @ gHitMarker\n" " str r0, [r4]\n" "._1210:\n" - " ldr r1, ._1215 + 76\n" + " ldr r1, ._1215 + 76 @ gSaveBlock2\n" " ldrb r0, [r1, #0x15]\n" " lsl r0, r0, #0x1e\n" " lsr r0, r0, #0x1f\n" - " ldr r3, ._1215 + 80\n" - " ldr r4, ._1215 + 84\n" + " ldr r3, ._1215 + 80 @ gSharedMem\n" + " ldr r4, ._1215 + 84 @ 0x16084\n" " add r2, r3, r4\n" " mov r1, #0x0\n" " strb r0, [r2]\n" - " ldr r0, ._1215 + 88\n" + " ldr r0, ._1215 + 88 @ gMultiHitCounter\n" " strb r1, [r0]\n" - " ldr r2, ._1215 + 92\n" + " ldr r2, ._1215 + 92 @ gBattleOutcome\n" " strb r1, [r2]\n" - " ldr r3, ._1215 + 96\n" + " ldr r3, ._1215 + 96 @ gBattleExecBuffer\n" " str r1, [r3]\n" " mov r2, #0x0\n" - " ldr r4, ._1215 + 100\n" + " ldr r4, ._1215 + 100@ gPaydayMoney\n" " strh r1, [r4]\n" - " ldr r1, ._1215 + 80\n" - " ldr r3, ._1215 + 104\n" + " ldr r1, ._1215 + 80 @ gSharedMem\n" + " ldr r3, ._1215 + 104@ 0x17130\n" " add r0, r1, r3\n" " strb r2, [r0]\n" - " ldr r4, ._1215 + 108\n" + " ldr r4, ._1215 + 108@ 0x17160\n" " add r0, r1, r4\n" " strb r2, [r0]\n" - " ldr r1, ._1215 + 112\n" + " ldr r1, ._1215 + 112@ gBattleCommunication\n" " mov r2, #0x0\n" " add r0, r1, #7\n" "._1211:\n" @@ -7224,37 +7224,37 @@ void sub_8010874() " cmp r0, r1\n" " bge ._1211 @cond_branch\n" " mov r5, #0x0\n" - " ldr r0, ._1215 + 116\n" + " ldr r0, ._1215 + 116@ gPauseCounterBattle\n" " strh r5, [r0]\n" " mov r0, #0x0\n" - " ldr r1, ._1215 + 120\n" + " ldr r1, ._1215 + 120@ gBattleMoveDamage\n" " str r0, [r1]\n" - " ldr r2, ._1215 + 124\n" + " ldr r2, ._1215 + 124@ gUnknown_02024DE8\n" " strh r0, [r2]\n" - " ldr r4, ._1215 + 80\n" - " ldr r3, ._1215 + 128\n" + " ldr r4, ._1215 + 80 @ gSharedMem\n" + " ldr r3, ._1215 + 128@ 0x16002\n" " add r0, r4, r3\n" " strb r5, [r0]\n" - " ldr r1, ._1215 + 132\n" + " ldr r1, ._1215 + 132@ 0x160a1\n" " add r0, r4, r1\n" " strb r5, [r0]\n" - " ldr r2, ._1215 + 136\n" + " ldr r2, ._1215 + 136@ gLeveledUpInBattle\n" " strb r5, [r2]\n" - " ldr r3, ._1215 + 140\n" + " ldr r3, ._1215 + 140@ gAbsentBankFlags\n" " strb r5, [r3]\n" " sub r1, r1, #0x29\n" " add r0, r4, r1\n" " strb r5, [r0]\n" - " ldr r2, ._1215 + 144\n" + " ldr r2, ._1215 + 144@ 0x16086\n" " add r0, r4, r2\n" " strb r5, [r0]\n" - " ldr r3, ._1215 + 148\n" + " ldr r3, ._1215 + 148@ 0x16087\n" " add r0, r4, r3\n" " strb r5, [r0]\n" - " ldr r0, ._1215 + 152\n" + " ldr r0, ._1215 + 152@ gEnemyParty\n" " mov r1, #0xb\n" " bl GetMonData\n" - " ldr r2, ._1215 + 156\n" + " ldr r2, ._1215 + 156@ gBaseStats\n" " lsl r1, r0, #0x3\n" " sub r1, r1, r0\n" " lsl r1, r1, #0x2\n" @@ -7262,16 +7262,16 @@ void sub_8010874() " ldrb r1, [r1, #0x8]\n" " mov r0, #0x64\n" " mul r0, r0, r1\n" - " ldr r1, ._1215 + 160\n" + " ldr r1, ._1215 + 160@ 0x4fb\n" " bl __divsi3\n" - " ldr r2, ._1215 + 164\n" + " ldr r2, ._1215 + 164@ 0x16089\n" " add r1, r4, r2\n" " strb r0, [r1]\n" - " ldr r3, ._1215 + 168\n" + " ldr r3, ._1215 + 168@ 0x16088\n" " add r1, r4, r3\n" " mov r0, #0x3\n" " strb r0, [r1]\n" - " ldr r1, ._1215 + 172\n" + " ldr r1, ._1215 + 172@ 0x1601b\n" " add r0, r4, r1\n" " strb r5, [r0]\n" " sub r2, r2, #0x33\n" @@ -7281,7 +7281,7 @@ void sub_8010874() " mov r2, #0x0\n" " mov r1, #0x0\n" "._1212:\n" - " ldr r3, ._1215 + 176\n" + " ldr r3, ._1215 + 176@ 0x160ac\n" " add r0, r2, r3\n" " add r0, r0, r4\n" " strb r1, [r0]\n" @@ -7308,8 +7308,8 @@ void sub_8010874() " add r2, r2, #0x1\n" " cmp r2, #0x7\n" " ble ._1212 @cond_branch\n" - " ldr r4, ._1215 + 80\n" - " ldr r1, ._1215 + 180\n" + " ldr r4, ._1215 + 80 @ gSharedMem\n" + " ldr r1, ._1215 + 180@ 0x160c8\n" " add r0, r4, r1\n" " mov r2, #0x0\n" " mov r1, #0x6\n" @@ -7317,10 +7317,10 @@ void sub_8010874() " sub r3, r3, #0x3f\n" " add r0, r4, r3\n" " strb r1, [r0]\n" - " ldr r1, ._1215 + 184\n" + " ldr r1, ._1215 + 184@ 0x16113\n" " add r0, r4, r1\n" " strb r2, [r0]\n" - " ldr r3, ._1215 + 188\n" + " ldr r3, ._1215 + 188@ gBattleResults\n" " mov r1, #0x0\n" " mov r2, #0xa\n" " add r0, r3, #0\n" @@ -7367,12 +7367,12 @@ void sub_8010874() " add r2, r2, #0x1\n" " cmp r2, #0x9\n" " ble ._1214 @cond_branch\n" - " ldr r2, ._1215 + 80\n" - " ldr r3, ._1215 + 192\n" + " ldr r2, ._1215 + 80 @ gSharedMem\n" + " ldr r3, ._1215 + 192@ 0x1609e\n" " add r0, r2, r3\n" " mov r1, #0x0\n" " strb r1, [r0]\n" - " ldr r4, ._1215 + 196\n" + " ldr r4, ._1215 + 196@ 0x1609f\n" " add r0, r2, r4\n" " strb r1, [r0]\n" " pop {r3, r4, r5}\n" diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 9fe1f6cb0..8b81139fb 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -5024,8 +5024,8 @@ static void atk15_seteffectwithchance(void) { asm("\ push {r4, lr}\n\ - ldr r2, ._1037\n\ - ldr r0, ._1037 + 4\n\ + ldr r2, ._1037 @ gBattleMons\n\ + ldr r0, ._1037 + 4 @ gBankAttacker\n\ ldrb r1, [r0]\n\ mov r0, #0x58\n\ mul r0, r0, r1\n\ @@ -5034,8 +5034,8 @@ static void atk15_seteffectwithchance(void) ldrb r0, [r0]\n\ cmp r0, #0x20\n\ bne ._1035 @cond_branch\n\ - ldr r2, ._1037 + 8\n\ - ldr r0, ._1037 + 12\n\ + ldr r2, ._1037 + 8 @ gBattleMoves\n\ + ldr r0, ._1037 + 12 @ gCurrentMove\n\ ldrh r1, [r0]\n\ lsl r0, r1, #0x1\n\ add r0, r0, r1\n\ @@ -5052,8 +5052,8 @@ static void atk15_seteffectwithchance(void) .word gBattleMoves\n\ .word gCurrentMove\n\ ._1035:\n\ - ldr r2, ._1045\n\ - ldr r0, ._1045 + 4\n\ + ldr r2, ._1045 @ gBattleMoves\n\ + ldr r0, ._1045 + 4 @ gCurrentMove\n\ ldrh r1, [r0]\n\ lsl r0, r1, #0x1\n\ add r0, r0, r1\n\ @@ -5061,11 +5061,11 @@ static void atk15_seteffectwithchance(void) add r0, r0, r2\n\ ldrb r4, [r0, #0x5]\n\ ._1036:\n\ - ldr r0, ._1045 + 8\n\ + ldr r0, ._1045 + 8 @ gUnknown_02023A14_50\n\ ldrb r1, [r0]\n\ mov r0, #0x4\n\ and r0, r0, r1\n\ - ldr r2, ._1045 + 12\n\ + ldr r2, ._1045 + 12 @ gBattleCommunication\n\ cmp r0, #0\n\ beq ._1039 @cond_branch\n\ ldrb r1, [r2, #0x3]\n\ @@ -5073,7 +5073,7 @@ static void atk15_seteffectwithchance(void) and r0, r0, r1\n\ cmp r0, #0\n\ bne ._1040 @cond_branch\n\ - ldr r0, ._1045 + 16\n\ + ldr r0, ._1045 + 16 @ gBattleMoveFlags\n\ ldrb r1, [r0]\n\ mov r0, #0x29\n\ and r0, r0, r1\n\ @@ -5086,13 +5086,13 @@ static void atk15_seteffectwithchance(void) cmp r0, #0\n\ beq ._1043 @cond_branch\n\ ._1040:\n\ - ldr r0, ._1045 + 16\n\ + ldr r0, ._1045 + 16 @ gBattleMoveFlags\n\ ldrb r1, [r0]\n\ mov r0, #0x29\n\ and r0, r0, r1\n\ cmp r0, #0\n\ bne ._1043 @cond_branch\n\ - ldr r2, ._1045 + 12\n\ + ldr r2, ._1045 + 12 @ gBattleCommunication\n\ ldrb r1, [r2, #0x3]\n\ mov r0, #0x7f\n\ and r0, r0, r1\n\ @@ -5116,11 +5116,11 @@ static void atk15_seteffectwithchance(void) lsr r0, r0, #0x10\n\ cmp r0, r4\n\ bhi ._1049 @cond_branch\n\ - ldr r0, ._1052\n\ + ldr r0, ._1052 @ gBattleCommunication\n\ ldrb r0, [r0, #0x3]\n\ cmp r0, #0\n\ beq ._1049 @cond_branch\n\ - ldr r0, ._1052 + 4\n\ + ldr r0, ._1052 + 4 @ gBattleMoveFlags\n\ ldrb r1, [r0]\n\ mov r0, #0x29\n\ and r0, r0, r1\n\ @@ -5144,16 +5144,16 @@ static void atk15_seteffectwithchance(void) bl SetMoveEffect\n\ b ._1054\n\ ._1049:\n\ - ldr r1, ._1055\n\ + ldr r1, ._1055 @ gBattlescriptCurrInstr\n\ ldr r0, [r1]\n\ add r0, r0, #0x1\n\ str r0, [r1]\n\ ._1054:\n\ - ldr r0, ._1055 + 4\n\ + ldr r0, ._1055 + 4 @ gBattleCommunication\n\ mov r1, #0x0\n\ strb r1, [r0, #0x3]\n\ - ldr r0, ._1055 + 8\n\ - ldr r2, ._1055 + 12\n\ + ldr r0, ._1055 + 8 @ \n\ + ldr r2, ._1055 + 12 @ \n\ add r0, r0, r2\n\ strb r1, [r0]\n\ pop {r4}\n\ @@ -12778,12 +12778,12 @@ static void atk9E_metronome(void) push {r4, r5, r6, r7, lr}\n\ mov r7, r8\n\ push {r7}\n\ - ldr r6, ._3076\n\ + ldr r6, ._3076 @ gBankAttacker\n\ ldrb r2, [r6]\n\ lsl r1, r2, #0x1\n\ - ldr r0, ._3076 + 4\n\ + ldr r0, ._3076 + 4 @ \n\ add r3, r1, r0\n\ - ldr r5, ._3076 + 8\n\ + ldr r5, ._3076 + 8 @ \n\ mov r4, #0x58\n\ add r0, r2, #0\n\ mul r0, r0, r4\n\ @@ -12802,7 +12802,7 @@ static void atk9E_metronome(void) bne ._3072 @cond_branch\n\ strh r2, [r3]\n\ ._3072:\n\ - ldr r1, ._3076 + 12\n\ + ldr r1, ._3076 + 12 @ \n\ ldrh r0, [r3]\n\ strh r0, [r1]\n\ ldrb r0, [r6]\n\ @@ -12845,14 +12845,14 @@ static void atk9E_metronome(void) ._3079:\n\ strh r0, [r3]\n\ ._3081:\n\ - ldr r4, ._3083\n\ + ldr r4, ._3083 @ gHitMarker\n\ ldr r2, [r4]\n\ - ldr r0, ._3083 + 4\n\ + ldr r0, ._3083 + 4 @ 0xfffffbff\n\ and r2, r2, r0\n\ str r2, [r4]\n\ - ldr r6, ._3083 + 8\n\ - ldr r5, ._3083 + 12\n\ - ldr r3, ._3083 + 16\n\ + ldr r6, ._3083 + 8 @ gBattlescriptCurrInstr\n\ + ldr r5, ._3083 + 12 @ gBattleScriptsForMoveEffects\n\ + ldr r3, ._3083 + 16 @ gBattleMoves\n\ ldrh r1, [r7]\n\ lsl r0, r1, #0x1\n\ add r0, r0, r1\n\ @@ -12878,15 +12878,15 @@ static void atk9E_metronome(void) .word gBattleScriptsForMoveEffects\n\ .word gBattleMoves\n\ ._3071:\n\ - ldr r7, ._3090\n\ + ldr r7, ._3090 @ gCurrentMove\n\ mov r6, #0xb1\n\ lsl r6, r6, #0x1\n\ - ldr r5, ._3090 + 4\n\ - ldr r0, ._3090 + 8\n\ + ldr r5, ._3090 + 4 @ sMovesForbiddenToCopy\n\ + ldr r0, ._3090 + 8 @ gBattlescriptCurrInstr\n\ mov r8, r0\n\ ._3089:\n\ bl Random\n\ - ldr r2, ._3090 + 12\n\ + ldr r2, ._3090 + 12 @ 0x1ff\n\ add r1, r2, #0\n\ and r0, r0, r1\n\ add r0, r0, #0x1\n\ @@ -12898,9 +12898,9 @@ static void atk9E_metronome(void) sub r0, r0, #0x1\n\ cmp r0, #0\n\ bge ._3086 @cond_branch\n\ - ldr r4, ._3090\n\ + ldr r4, ._3090 @ gCurrentMove\n\ ldrh r2, [r4]\n\ - ldr r3, ._3090 + 16\n\ + ldr r3, ._3090 + 16 @ 0xffff\n\ sub r0, r5, #2\n\ ._3088:\n\ add r0, r0, #0x2\n\ @@ -12910,16 +12910,16 @@ static void atk9E_metronome(void) cmp r1, r3\n\ bne ._3088 @cond_branch\n\ ._3087:\n\ - ldr r0, ._3090 + 16\n\ + ldr r0, ._3090 + 16 @ 0xffff\n\ cmp r1, r0\n\ bne ._3089 @cond_branch\n\ - ldr r2, ._3090 + 20\n\ + ldr r2, ._3090 + 20 @ gHitMarker\n\ ldr r0, [r2]\n\ - ldr r1, ._3090 + 24\n\ + ldr r1, ._3090 + 24 @ 0xfffffbff\n\ and r0, r0, r1\n\ str r0, [r2]\n\ - ldr r3, ._3090 + 28\n\ - ldr r2, ._3090 + 32\n\ + ldr r3, ._3090 + 28 @ gBattleScriptsForMoveEffects\n\ + ldr r2, ._3090 + 32 @ gBattleMoves\n\ ldrh r1, [r4]\n\ lsl r0, r1, #0x1\n\ add r0, r0, r1\n\ @@ -12935,7 +12935,7 @@ static void atk9E_metronome(void) ._3082:\n\ mov r1, #0x0\n\ bl GetMoveTarget\n\ - ldr r1, ._3090 + 36\n\ + ldr r1, ._3090 + 36 @ gBankTarget\n\ strb r0, [r1]\n\ pop {r3}\n\ mov r8, r3\n\ diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index 5382738f7..338f8d418 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -1447,26 +1447,26 @@ void OpponentHandlecmd20(void) mov r6, r9\n\ mov r5, r8\n\ push {r5, r6, r7}\n\ - ldr r6, ._549\n\ + ldr r6, ._549 @ gActiveBank\n\ ldrb r0, [r6]\n\ lsl r0, r0, #0x9\n\ - ldr r1, ._549 + 4\n\ + ldr r1, ._549 + 4 @ gBattleBufferA\n\ add r5, r0, r1\n\ - ldr r2, ._549 + 8\n\ + ldr r2, ._549 + 8 @ gUnknown_02023A14_50\n\ ldrb r1, [r2]\n\ mov r0, #0x4\n\ and r0, r0, r1\n\ mov sl, r6\n\ cmp r0, #0\n\ beq ._546 @cond_branch\n\ - ldr r0, ._549 + 12\n\ + ldr r0, ._549 + 12 @ gBattleMoves\n\ mov r9, r0\n\ - ldr r1, ._549 + 16\n\ + ldr r1, ._549 + 16 @ \n\ mov ip, r1\n\ add r7, r6, #0\n\ mov r0, #0x2\n\ mov r8, r0\n\ - ldr r6, ._549 + 20\n\ + ldr r6, ._549 + 20 @ \n\ ._552:\n\ ldrb r1, [r7]\n\ mov r0, r8\n\ @@ -1526,13 +1526,13 @@ void OpponentHandlecmd20(void) ldrb r0, [r1]\n\ b ._561\n\ ._553:\n\ - ldr r0, ._559\n\ + ldr r0, ._559 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._557 @cond_branch\n\ - ldr r0, ._559 + 4\n\ + ldr r0, ._559 + 4 @ gUnknown_02023A14_50\n\ ldrb r1, [r0]\n\ mov r5, #0x2\n\ add r0, r5, #0\n\ @@ -1578,7 +1578,7 @@ void OpponentHandlecmd20(void) bl OpponentBufferExecCompleted\n\ b ._562\n\ ._546:\n\ - ldr r0, ._567\n\ + ldr r0, ._567 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ mov r0, #0x93\n\ lsl r0, r0, #0x3\n\ @@ -1607,7 +1607,7 @@ void OpponentHandlecmd20(void) mov r2, #0x0\n\ b ._569\n\ ._565:\n\ - ldr r3, ._574\n\ + ldr r3, ._574 @ gBattleMoves\n\ lsl r0, r4, #0x1\n\ add r2, r5, r0\n\ ldrh r1, [r2]\n\ @@ -1620,7 +1620,7 @@ void OpponentHandlecmd20(void) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._570 @cond_branch\n\ - ldr r1, ._574 + 4\n\ + ldr r1, ._574 + 4 @ gBankTarget\n\ ldrb r0, [r6]\n\ strb r0, [r1]\n\ ._570:\n\ @@ -1636,11 +1636,11 @@ void OpponentHandlecmd20(void) beq ._572 @cond_branch\n\ mov r0, #0x0\n\ bl GetBankByIdentity\n\ - ldr r5, ._574 + 4\n\ + ldr r5, ._574 + 4 @ gBankTarget\n\ strb r0, [r5]\n\ - ldr r0, ._574 + 8\n\ + ldr r0, ._574 + 8 @ gAbsentBankFlags\n\ ldrb r1, [r0]\n\ - ldr r2, ._574 + 12\n\ + ldr r2, ._574 + 12 @ gBitTable\n\ ldrb r0, [r5]\n\ lsl r0, r0, #0x2\n\ add r0, r0, r2\n\ @@ -1652,7 +1652,7 @@ void OpponentHandlecmd20(void) bl GetBankByIdentity\n\ strb r0, [r5]\n\ ._572:\n\ - ldr r0, ._574 + 4\n\ + ldr r0, ._574 + 4 @ gBankTarget\n\ ldrb r2, [r0]\n\ lsl r2, r2, #0x8\n\ orr r2, r2, r4\n\ @@ -1678,7 +1678,7 @@ void OpponentHandlecmd20(void) ldrh r2, [r0]\n\ cmp r2, #0\n\ beq ._576 @cond_branch\n\ - ldr r1, ._579\n\ + ldr r1, ._579 @ gBattleMoves\n\ lsl r0, r2, #0x1\n\ add r0, r0, r2\n\ lsl r0, r0, #0x2\n\ @@ -1688,7 +1688,7 @@ void OpponentHandlecmd20(void) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._577 @cond_branch\n\ - ldr r0, ._579 + 4\n\ + ldr r0, ._579 + 4 @ gActiveBank\n\ ldrb r2, [r0]\n\ lsl r2, r2, #0x8\n\ b ._578\n\ @@ -1698,7 +1698,7 @@ void OpponentHandlecmd20(void) .word gBattleMoves\n\ .word gActiveBank\n\ ._577:\n\ - ldr r0, ._583\n\ + ldr r0, ._583 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index d4b4da6f2..e03e21849 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -1007,21 +1007,21 @@ void debug_sub_8030C24(void) asm("\ push {r4, r5, r6, lr}\n\ add sp, sp, #0xfffffff4\n\ - ldr r1, ._293\n\ - ldr r4, ._293 + 4\n\ + ldr r1, ._293 @ gBattlePartyID\n\ + ldr r4, ._293 + 4 @ gActiveBank\n\ ldrb r0, [r4]\n\ lsl r0, r0, #0x1\n\ add r0, r0, r1\n\ ldrh r1, [r0]\n\ mov r0, #0x64\n\ mul r0, r0, r1\n\ - ldr r1, ._293 + 8\n\ + ldr r1, ._293 + 8 @ gPlayerParty\n\ add r0, r0, r1\n\ mov r1, #0xd\n\ bl GetMonData\n\ add r1, sp, #0x8\n\ strh r0, [r1]\n\ - ldr r5, ._293 + 12\n\ + ldr r5, ._293 + 12 @ gMain\n\ ldrh r1, [r5, #0x30]\n\ cmp r1, #0x20\n\ bne ._286 @cond_branch\n\ @@ -1082,7 +1082,7 @@ void debug_sub_8030C24(void) ldrb r0, [r4]\n\ mov r1, #0x0\n\ bl dp11b_obj_free\n\ - ldr r0, ._312\n\ + ldr r0, ._312 @ gBankAttacker\n\ ldrb r2, [r4]\n\ strb r2, [r0]\n\ ldrh r1, [r5, #0x28]\n\ @@ -1090,13 +1090,13 @@ void debug_sub_8030C24(void) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._310 @cond_branch\n\ - ldr r0, ._312 + 4\n\ + ldr r0, ._312 + 4 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._310 @cond_branch\n\ - ldr r0, ._312 + 8\n\ + ldr r0, ._312 + 8 @ gBankTarget\n\ mov r1, #0x2\n\ eor r1, r1, r2\n\ strb r1, [r0]\n\ @@ -1108,14 +1108,14 @@ void debug_sub_8030C24(void) .word gBattleTypeFlags\n\ .word gBankTarget\n\ ._310:\n\ - ldr r0, ._317\n\ + ldr r0, ._317 @ gMain\n\ ldrh r1, [r0, #0x28]\n\ mov r2, #0x1\n\ add r0, r2, #0\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._315 @cond_branch\n\ - ldr r0, ._317 + 4\n\ + ldr r0, ._317 + 4 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ add r0, r2, #0\n\ and r0, r0, r1\n\ @@ -1132,7 +1132,7 @@ void debug_sub_8030C24(void) mov r0, #0x1\n\ ._316:\n\ bl GetBankByIdentity\n\ - ldr r1, ._320\n\ + ldr r1, ._320 @ gBankTarget\n\ strb r0, [r1]\n\ ._311:\n\ mov r0, #0x0\n\ @@ -1140,8 +1140,8 @@ void debug_sub_8030C24(void) add r0, sp, #0x8\n\ ldrh r0, [r0]\n\ bl DoMoveAnim\n\ - ldr r1, ._320 + 4\n\ - ldr r0, ._320 + 8\n\ + ldr r1, ._320 + 4 @ gBattleBankFunc\n\ + ldr r0, ._320 + 8 @ gActiveBank\n\ ldrb r0, [r0]\n\ b ._332\n\ ._321:\n\ @@ -1157,7 +1157,7 @@ void debug_sub_8030C24(void) ldrb r0, [r4]\n\ mov r1, #0x0\n\ bl dp11b_obj_free\n\ - ldr r0, ._325\n\ + ldr r0, ._325 @ gBankTarget\n\ ldrb r2, [r4]\n\ strb r2, [r0]\n\ ldrh r1, [r5, #0x28]\n\ @@ -1165,13 +1165,13 @@ void debug_sub_8030C24(void) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._323 @cond_branch\n\ - ldr r0, ._325 + 4\n\ + ldr r0, ._325 + 4 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._323 @cond_branch\n\ - ldr r0, ._325 + 8\n\ + ldr r0, ._325 + 8 @ gBankAttacker\n\ mov r1, #0x2\n\ eor r1, r1, r2\n\ strb r1, [r0]\n\ @@ -1183,14 +1183,14 @@ void debug_sub_8030C24(void) .word gBattleTypeFlags\n\ .word gBankAttacker\n\ ._323:\n\ - ldr r0, ._330\n\ + ldr r0, ._330 @ gMain\n\ ldrh r1, [r0, #0x28]\n\ mov r2, #0x1\n\ add r0, r2, #0\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._328 @cond_branch\n\ - ldr r0, ._330 + 4\n\ + ldr r0, ._330 + 4 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ add r0, r2, #0\n\ and r0, r0, r1\n\ @@ -1207,7 +1207,7 @@ void debug_sub_8030C24(void) mov r0, #0x1\n\ ._329:\n\ bl GetBankByIdentity\n\ - ldr r1, ._333\n\ + ldr r1, ._333 @ gBankAttacker\n\ strb r0, [r1]\n\ ._324:\n\ mov r0, #0x0\n\ @@ -1215,8 +1215,8 @@ void debug_sub_8030C24(void) add r0, sp, #0x8\n\ ldrh r0, [r0]\n\ bl DoMoveAnim\n\ - ldr r1, ._333 + 4\n\ - ldr r0, ._333 + 8\n\ + ldr r1, ._333 + 4 @ gBattleBankFunc\n\ + ldr r0, ._333 + 8 @ gActiveBank\n\ ldrb r0, [r0]\n\ b ._332\n\ ._334:\n\ @@ -1231,7 +1231,7 @@ void debug_sub_8030C24(void) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._336 @cond_branch\n\ - ldr r0, ._338\n\ + ldr r0, ._338 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -1245,7 +1245,7 @@ void debug_sub_8030C24(void) bl dp11b_obj_free\n\ mov r0, #0x3\n\ bl GetBankByIdentity\n\ - ldr r1, ._338 + 4\n\ + ldr r1, ._338 + 4 @ gBankAttacker\n\ strb r0, [r1]\n\ mov r0, #0x1\n\ b ._337\n\ @@ -1283,7 +1283,7 @@ void debug_sub_8030C24(void) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._343 @cond_branch\n\ - ldr r0, ._345\n\ + ldr r0, ._345 @ gBattleTypeFlags\n\ ldrh r1, [r0]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -1297,24 +1297,24 @@ void debug_sub_8030C24(void) bl dp11b_obj_free\n\ mov r0, #0x1\n\ bl GetBankByIdentity\n\ - ldr r1, ._345 + 4\n\ + ldr r1, ._345 + 4 @ gBankAttacker\n\ strb r0, [r1]\n\ mov r0, #0x3\n\ ._337:\n\ bl GetBankByIdentity\n\ - ldr r1, ._345 + 8\n\ + ldr r1, ._345 + 8 @ gBankTarget\n\ strb r0, [r1]\n\ mov r0, #0x0\n\ bl sub_80326EC\n\ add r0, sp, #0x8\n\ ldrh r0, [r0]\n\ bl DoMoveAnim\n\ - ldr r1, ._345 + 12\n\ + ldr r1, ._345 + 12 @ gBattleBankFunc\n\ ldrb r0, [r4]\n\ ._332:\n\ lsl r0, r0, #0x2\n\ add r0, r0, r1\n\ - ldr r1, ._345 + 16\n\ + ldr r1, ._345 + 16 @ debug_sub_803107C\n\ str r1, [r0]\n\ b ._348\n\ ._346:\n\ @@ -1345,20 +1345,20 @@ void debug_sub_8030C24(void) add r0, r2, #0\n\ strh r0, [r1]\n\ ._347:\n\ - ldr r1, ._349\n\ - ldr r4, ._349 + 4\n\ + ldr r1, ._349 @ gBattlePartyID\n\ + ldr r4, ._349 + 4 @ gActiveBank\n\ ldrb r0, [r4]\n\ lsl r0, r0, #0x1\n\ add r0, r0, r1\n\ ldrh r1, [r0]\n\ mov r0, #0x64\n\ mul r0, r0, r1\n\ - ldr r1, ._349 + 8\n\ + ldr r1, ._349 + 8 @ gPlayerParty\n\ add r0, r0, r1\n\ mov r1, #0xd\n\ add r2, sp, #0x8\n\ bl SetMonData\n\ - ldr r2, ._349 + 12\n\ + ldr r2, ._349 + 12 @ gBattleMons\n\ ldrb r1, [r4]\n\ mov r0, #0x58\n\ mul r0, r0, r1\n\ @@ -1366,8 +1366,8 @@ void debug_sub_8030C24(void) add r1, sp, #0x8\n\ ldrh r1, [r1]\n\ strh r1, [r0, #0xc]\n\ - ldr r5, ._349 + 16\n\ - ldr r1, ._349 + 20\n\ + ldr r5, ._349 + 16 @ gUnknown_03004210\n\ + ldr r1, ._349 + 20 @ 0x1016\n\ mov r0, #0x10\n\ str r0, [sp]\n\ mov r0, #0x38\n\ @@ -1381,7 +1381,7 @@ void debug_sub_8030C24(void) ldsh r1, [r0, r2]\n\ mov r0, #0xd\n\ mul r1, r1, r0\n\ - ldr r0, ._349 + 24\n\ + ldr r0, ._349 + 24 @ gMoveNames\n\ add r1, r1, r0\n\ mov r2, #0x80\n\ lsl r2, r2, #0x1\n\ @@ -1390,7 +1390,7 @@ void debug_sub_8030C24(void) add r0, r5, #0\n\ mov r3, #0x2\n\ bl Text_InitWindowAndPrintText\n\ - ldr r4, ._349 + 28\n\ + ldr r4, ._349 + 28 @ gDisplayedStringBattle\n\ add r0, sp, #0x8\n\ mov r2, #0x0\n\ ldsh r1, [r0, r2]\n\ @@ -1418,11 +1418,11 @@ void debug_sub_8030C24(void) .word gMoveNames\n\ .word gDisplayedStringBattle\n\ ._302:\n\ - ldr r0, ._353\n\ + ldr r0, ._353 @ gMain\n\ ldrh r0, [r0, #0x30]\n\ cmp r0, #0x40\n\ bne ._351 @cond_branch\n\ - ldr r1, ._353 + 4\n\ + ldr r1, ._353 + 4 @ gAnimMoveTurn\n\ ldrb r0, [r1]\n\ sub r0, r0, #0x1\n\ b ._352\n\ @@ -1432,18 +1432,18 @@ void debug_sub_8030C24(void) .word gMain\n\ .word gAnimMoveTurn\n\ ._351:\n\ - ldr r1, ._359\n\ + ldr r1, ._359 @ gAnimMoveTurn\n\ ldrb r0, [r1]\n\ add r0, r0, #0x1\n\ ._352:\n\ strb r0, [r1]\n\ - ldr r4, ._359 + 4\n\ + ldr r4, ._359 + 4 @ gDisplayedStringBattle\n\ ldrb r1, [r1]\n\ add r0, r4, #0\n\ mov r2, #0x2\n\ mov r3, #0x3\n\ bl ConvertIntToDecimalStringN\n\ - ldr r0, ._359 + 8\n\ + ldr r0, ._359 + 8 @ gUnknown_03004210\n\ mov r2, #0x8e\n\ lsl r2, r2, #0x1\n\ mov r1, #0x39\n\ @@ -1452,7 +1452,7 @@ void debug_sub_8030C24(void) mov r3, #0x4\n\ bl Text_InitWindowAndPrintText\n\ ._348:\n\ - ldr r0, ._359 + 12\n\ + ldr r0, ._359 + 12 @ gMain\n\ ldrh r2, [r0, #0x28]\n\ mov r1, #0xc0\n\ lsl r1, r1, #0x2\n\ @@ -1461,28 +1461,28 @@ void debug_sub_8030C24(void) cmp r0, r1\n\ bne ._355 @cond_branch\n\ mov r4, #0x0\n\ - ldr r5, ._359 + 4\n\ - ldr r6, ._359 + 8\n\ + ldr r5, ._359 + 4 @ gDisplayedStringBattle\n\ + ldr r6, ._359 + 8 @ gUnknown_03004210\n\ ._361:\n\ add r0, r5, #0\n\ - ldr r1, ._359 + 16\n\ + ldr r1, ._359 + 16 @ BattleText_Format\n\ bl StringCopy\n\ - ldr r1, ._359 + 20\n\ - ldr r0, ._359 + 24\n\ + ldr r1, ._359 + 20 @ gBattlePartyID\n\ + ldr r0, ._359 + 24 @ gActiveBank\n\ ldrb r0, [r0]\n\ lsl r0, r0, #0x1\n\ add r0, r0, r1\n\ ldrh r1, [r0]\n\ mov r0, #0x64\n\ mul r0, r0, r1\n\ - ldr r1, ._359 + 28\n\ + ldr r1, ._359 + 28 @ gPlayerParty\n\ add r0, r0, r1\n\ add r1, r4, #0\n\ add r1, r1, #0xd\n\ bl GetMonData\n\ mov r1, #0xd\n\ mul r1, r1, r0\n\ - ldr r0, ._359 + 32\n\ + ldr r0, ._359 + 32 @ gMoveNames\n\ add r1, r1, r0\n\ add r0, r5, #0\n\ bl StringAppend\n\ @@ -1521,19 +1521,19 @@ void debug_sub_8030C24(void) add r0, r6, #0\n\ add r1, r5, #0\n\ bl Text_InitWindow\n\ - ldr r0, ._362\n\ + ldr r0, ._362 @ gUnknown_03004210\n\ bl Text_PrintWindow8002F44\n\ add r0, r4, #1\n\ lsl r0, r0, #0x18\n\ lsr r4, r0, #0x18\n\ cmp r4, #0x3\n\ bls ._361 @cond_branch\n\ - ldr r1, ._362 + 4\n\ - ldr r0, ._362 + 8\n\ + ldr r1, ._362 + 4 @ gBattleBankFunc\n\ + ldr r0, ._362 + 8 @ gActiveBank\n\ ldrb r0, [r0]\n\ lsl r0, r0, #0x2\n\ add r0, r0, r1\n\ - ldr r1, ._362 + 12\n\ + ldr r1, ._362 + 12 @ sub_802C68C\n\ str r1, [r0]\n\ ._355:\n\ add sp, sp, #0xc\n\ @@ -1556,16 +1556,16 @@ void debug_sub_803107C(void) push {r4, r5, r6, r7, lr}\n\ add sp, sp, #0xfffffffc\n\ mov r7, #0x0\n\ - ldr r0, ._369\n\ + ldr r0, ._369 @ gAnimScriptCallback\n\ ldr r0, [r0]\n\ bl _call_via_r0\n\ - ldr r0, ._369 + 4\n\ + ldr r0, ._369 + 4 @ gAnimScriptActive\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ bne ._364 @cond_branch\n\ mov r0, #0x1\n\ bl sub_80326EC\n\ - ldr r4, ._369 + 8\n\ + ldr r4, ._369 + 8 @ gActiveBank\n\ ldrb r0, [r4]\n\ mov r1, #0x1\n\ mov r2, #0x7\n\ @@ -1576,7 +1576,7 @@ void debug_sub_803107C(void) mov r2, #0x7\n\ mov r3, #0x1\n\ bl dp11b_obj_instanciate\n\ - ldr r0, ._369 + 12\n\ + ldr r0, ._369 + 12 @ gSprites\n\ add r2, r0, #0\n\ add r2, r2, #0x3e\n\ mov r1, #0x3f\n\ @@ -1593,13 +1593,13 @@ void debug_sub_803107C(void) sub r1, r1, #0x1\n\ cmp r1, #0\n\ bge ._366 @cond_branch\n\ - ldr r4, ._369 + 16\n\ + ldr r4, ._369 + 16 @ gDisplayedStringBattle\n\ add r0, r4, #0\n\ add r1, r7, #0\n\ mov r2, #0x2\n\ mov r3, #0x2\n\ bl ConvertIntToDecimalStringN\n\ - ldr r6, ._369 + 20\n\ + ldr r6, ._369 + 20 @ gUnknown_03004210\n\ mov r2, #0x91\n\ lsl r2, r2, #0x1\n\ mov r5, #0x39\n\ @@ -1625,7 +1625,7 @@ void debug_sub_803107C(void) bl Text_InitWindowAndPrintText\n\ mov r1, #0x0\n\ mov r7, #0x0\n\ - ldr r0, ._369 + 24\n\ + ldr r0, ._369 + 24 @ gOamMatrixAllocBitmap\n\ mov r3, #0x1\n\ ldr r2, [r0]\n\ ._368:\n\ @@ -1641,13 +1641,13 @@ void debug_sub_803107C(void) add r1, r1, #0x1\n\ cmp r1, #0x1f\n\ ble ._368 @cond_branch\n\ - ldr r4, ._369 + 16\n\ + ldr r4, ._369 + 16 @ gDisplayedStringBattle\n\ add r0, r4, #0\n\ add r1, r7, #0\n\ mov r2, #0x2\n\ mov r3, #0x2\n\ bl ConvertIntToDecimalStringN\n\ - ldr r0, ._369 + 20\n\ + ldr r0, ._369 + 20 @ gUnknown_03004210\n\ mov r2, #0x95\n\ lsl r2, r2, #0x1\n\ mov r1, #0x39\n\ @@ -1655,12 +1655,12 @@ void debug_sub_803107C(void) add r1, r4, #0\n\ mov r3, #0xe\n\ bl Text_InitWindowAndPrintText\n\ - ldr r1, ._369 + 28\n\ - ldr r0, ._369 + 8\n\ + ldr r1, ._369 + 28 @ gBattleBankFunc\n\ + ldr r0, ._369 + 8 @ gActiveBank\n\ ldrb r0, [r0]\n\ lsl r0, r0, #0x2\n\ add r0, r0, r1\n\ - ldr r1, ._369 + 32\n\ + ldr r1, ._369 + 32 @ debug_sub_8030C24\n\ str r1, [r0]\n\ ._364:\n\ add sp, sp, #0x4\n\ diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c index 9dd1d7b53..1532a0b2f 100644 --- a/src/battle/battle_records.c +++ b/src/battle/battle_records.c @@ -234,12 +234,12 @@ void debug_sub_81257E0(void) add sp, sp, #0xfffffffc\n\ bl InitLinkBattleRecords\n\ mov r5, #0x0\n\ - ldr r6, ._62\n\ + ldr r6, ._62 @ gUnknown_Debug_4245CC\n\ sub r0, r6, #2\n\ mov r8, r0\n\ - ldr r7, ._62 + 4\n\ + ldr r7, ._62 + 4 @ gLinkPlayers\n\ ._61:\n\ - ldr r0, ._62 + 8\n\ + ldr r0, ._62 + 8 @ gUnknown_Debug_8424620\n\ lsl r3, r5, #0x2\n\ add r3, r3, r0\n\ ldrb r4, [r3]\n\ @@ -251,7 +251,7 @@ void debug_sub_81257E0(void) add r0, r0, r8\n\ ldrh r2, [r0]\n\ ldrb r3, [r3, #0x1]\n\ - ldr r0, ._62 + 12\n\ + ldr r0, ._62 + 12 @ gLinkPlayerMapObjects\n\ lsl r4, r4, #0x2\n\ add r4, r4, r0\n\ ldrb r4, [r4, #0x1]\n\ @@ -261,7 +261,7 @@ void debug_sub_81257E0(void) add r0, r0, r7\n\ ldrb r0, [r0, #0x1a]\n\ str r0, [sp]\n\ - ldr r0, ._62 + 16\n\ + ldr r0, ._62 + 16 @ gSaveBlock1\n\ bl UpdateLinkBattleRecords_\n\ add r5, r5, #0x1\n\ cmp r5, #0x2\n\ diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 2bc536d6c..4690368d8 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -491,7 +491,7 @@ u8 DebugMenu_8076E18() asm( " push {lr}\n" " bl debug_sub_8076B4C\n" - " ldr r0, ._67\n" + " ldr r0, ._67 @ DebugMenu_8076D6C\n" " mov r1, #0xa\n" " bl CreateTask\n" " mov r0, #0x0\n" @@ -515,7 +515,7 @@ void DebugMenu_8076E30() " lsl r0, r3, #0x2\n" " add r0, r0, r3\n" " lsl r0, r0, #0x3\n" - " ldr r1, ._73\n" + " ldr r1, ._73 @ gTasks\n" " add r4, r0, r1\n" " mov r0, #0x0\n" " ldsh r1, [r4, r0]\n" @@ -536,7 +536,7 @@ void DebugMenu_8076E30() " b ._86\n" "._71:\n" " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._78\n" + " ldr r0, ._78 @ Str_839BD5A\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" @@ -546,14 +546,14 @@ void DebugMenu_8076E30() "._78:\n" " .word Str_839BD5A\n" "._69:\n" - " ldr r0, ._82\n" + " ldr r0, ._82 @ gMain\n" " ldrh r2, [r0, #0x2e]\n" " and r1, r1, r2\n" " cmp r1, #0\n" " beq ._80 @cond_branch\n" " bl Menu_DisplayDialogueFrame\n" " bl sub_813B79C\n" - " ldr r0, ._82 + 4\n" + " ldr r0, ._82 + 4 @ Str_839BD7D\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" @@ -579,7 +579,7 @@ void DebugMenu_8076E30() " bl DoSoftReset\n" " b ._86\n" "._75:\n" - " ldr r0, ._87\n" + " ldr r0, ._87 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -606,7 +606,7 @@ u8 DebugMenu_8076EDC() asm( " push {lr}\n" " bl debug_sub_8076B4C\n" - " ldr r0, ._89\n" + " ldr r0, ._89 @ DebugMenu_8076E30\n" " mov r1, #0xa\n" " bl CreateTask\n" " mov r0, #0x0\n" @@ -631,7 +631,7 @@ void DebugMenu_8076EF4() " mov r2, #0xb\n" " mov r3, #0x11\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r4, ._93\n" + " ldr r4, ._93 @ gUnknown_Debug_839BDC4\n" " mov r0, #0x2\n" " mov r1, #0x1\n" " mov r2, #0x8\n" @@ -711,13 +711,13 @@ void DebugMenu_8076F60() " bl DestroyTask\n" " b ._97\n" "._96:\n" - " ldr r3, ._100\n" + " ldr r3, ._100 @ gUnknown_Debug_839BDC4\n" " lsl r2, r2, #0x18\n" " asr r2, r2, #0x15\n" " add r0, r3, #4\n" " add r0, r2, r0\n" " ldrb r4, [r0]\n" - " ldr r0, ._100 + 4\n" + " ldr r0, ._100 + 4 @ gSaveBlock2\n" " mov r1, #0x1\n" " and r1, r1, r4\n" " strb r1, [r0, #0x8]\n" @@ -742,7 +742,7 @@ void DebugMenu_8076F60() "._99:\n" " add r0, r5, #0\n" " bl DestroyTask\n" - " ldr r0, ._102\n" + " ldr r0, ._102 @ debug_sub_8058C00\n" " bl SetMainCallback2\n" "._97:\n" " pop {r4, r5}\n" @@ -762,7 +762,7 @@ void DebugMenu_8076FEC() asm( " push {lr}\n" " bl DebugMenu_8076EF4\n" - " ldr r0, ._104\n" + " ldr r0, ._104 @ DebugMenu_8076F60\n" " mov r1, #0xa\n" " bl CreateTask\n" " pop {r0}\n" @@ -779,11 +779,11 @@ __attribute__((naked)) void DebugMenu_8077004() { asm( - " ldr r2, ._106\n" - " ldr r0, ._106 + 4\n" + " ldr r2, ._106 @ gUnknown_030006C4\n" + " ldr r0, ._106 + 4 @ gUnknown_030006C1\n" " ldrb r0, [r0]\n" " lsl r0, r0, #0x3\n" - " ldr r1, ._106 + 8\n" + " ldr r1, ._106 + 8 @ gUnknown_Debug_839BB64\n" " add r0, r0, r1\n" " str r0, [r2]\n" " bx lr\n" @@ -804,7 +804,7 @@ void DebugMenu_8077020() " push {r4, lr}\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" - " ldr r0, ._109\n" + " ldr r0, ._109 @ gMenuCallback\n" " ldr r0, [r0]\n" " bl _call_via_r0\n" " lsl r0, r0, #0x18\n" @@ -830,11 +830,11 @@ void DebugMenu_8077048() { asm( " push {lr}\n" - " ldr r0, ._111\n" - " ldr r1, ._111 + 4\n" + " ldr r0, ._111 @ gMenuCallback\n" + " ldr r1, ._111 + 4 @ DebugMenu_807706C\n" " str r1, [r0]\n" " bl ScriptContext2_Enable\n" - " ldr r0, ._111 + 8\n" + " ldr r0, ._111 + 8 @ DebugMenu_8077020\n" " mov r1, #0x50\n" " bl CreateTask\n" " pop {r0}\n" @@ -854,14 +854,14 @@ void DebugMenu_807706C() { asm( " push {lr}\n" - " ldr r0, ._113\n" + " ldr r0, ._113 @ gWindowTemplate_81E6CE4\n" " bl InitMenuWindow\n" " bl DebugMenu_8077004\n" " bl DebugMenu_807719C\n" " bl DebugMenu_80771EC\n" " bl DebugMenu_8077238\n" - " ldr r1, ._113 + 4\n" - " ldr r0, ._113 + 8\n" + " ldr r1, ._113 + 4 @ gMenuCallback\n" + " ldr r0, ._113 + 8 @ DebugMenu_807709C\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -881,7 +881,7 @@ void DebugMenu_807709C() { asm( " push {r4, lr}\n" - " ldr r4, ._120\n" + " ldr r4, ._120 @ gMain\n" " ldrh r1, [r4, #0x2e]\n" " mov r0, #0x40\n" " and r0, r0, r1\n" @@ -892,7 +892,7 @@ void DebugMenu_807709C() " mov r0, #0x1\n" " neg r0, r0\n" " bl Menu_MoveCursor\n" - " ldr r1, ._120 + 4\n" + " ldr r1, ._120 + 4 @ gUnknown_030006C0\n" " strb r0, [r1]\n" "._115:\n" " ldrh r1, [r4, #0x2e]\n" @@ -904,7 +904,7 @@ void DebugMenu_807709C() " bl PlaySE\n" " mov r0, #0x1\n" " bl Menu_MoveCursor\n" - " ldr r1, ._120 + 4\n" + " ldr r1, ._120 + 4 @ gUnknown_030006C0\n" " strb r0, [r1]\n" "._116:\n" " ldrh r1, [r4, #0x2e]\n" @@ -914,7 +914,7 @@ void DebugMenu_807709C() " beq ._117 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r1, ._120 + 8\n" + " ldr r1, ._120 + 8 @ gUnknown_030006C1\n" " ldrb r0, [r1]\n" " cmp r0, #0\n" " bne ._118 @cond_branch\n" @@ -933,7 +933,7 @@ void DebugMenu_807709C() " bl DebugMenu_8077004\n" " bl DebugMenu_807719C\n" "._117:\n" - " ldr r0, ._125\n" + " ldr r0, ._125 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x10\n" " and r0, r0, r1\n" @@ -941,7 +941,7 @@ void DebugMenu_807709C() " beq ._122 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r1, ._125 + 4\n" + " ldr r1, ._125 + 4 @ gUnknown_030006C1\n" " ldrb r0, [r1]\n" " cmp r0, #0x7\n" " bne ._123 @cond_branch\n" @@ -959,7 +959,7 @@ void DebugMenu_807709C() " bl DebugMenu_8077004\n" " bl DebugMenu_807719C\n" "._122:\n" - " ldr r0, ._129\n" + " ldr r0, ._129 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -967,10 +967,10 @@ void DebugMenu_807709C() " beq ._127 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r1, ._129 + 4\n" - " ldr r0, ._129 + 8\n" + " ldr r1, ._129 + 4 @ gDebug0x839B9BC\n" + " ldr r0, ._129 + 8 @ gUnknown_030006C0\n" " ldrb r2, [r0]\n" - " ldr r0, ._129 + 12\n" + " ldr r0, ._129 + 12 @ gUnknown_030006C4\n" " ldr r0, [r0]\n" " add r0, r0, r2\n" " ldrb r0, [r0]\n" @@ -1018,15 +1018,15 @@ void DebugMenu_807719C() " mov r2, #0xe\n" " mov r3, #0x11\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r3, ._133\n" - " ldr r0, ._133 + 4\n" + " ldr r3, ._133 @ gDebug0x839B9BC\n" + " ldr r0, ._133 + 4 @ gUnknown_030006C4\n" " ldr r0, [r0]\n" " str r0, [sp]\n" " mov r0, #0x1\n" " mov r1, #0x1\n" " mov r2, #0x8\n" " bl Menu_PrintItemsReordered\n" - " ldr r4, ._133 + 8\n" + " ldr r4, ._133 + 8 @ gUnknown_030006C0\n" " ldrb r0, [r4]\n" " str r0, [sp]\n" " mov r0, #0xd\n" @@ -1056,10 +1056,10 @@ void DebugMenu_80771EC() { asm( " push {r4, lr}\n" - " ldr r0, ._135\n" - " ldr r1, ._135 + 4\n" + " ldr r0, ._135 @ gStringVar4\n" + " ldr r1, ._135 + 4 @ Str_839BE04\n" " bl StringCopy\n" - " ldr r4, ._135 + 8\n" + " ldr r4, ._135 + 8 @ gSaveBlock1\n" " mov r1, #0x4\n" " ldsb r1, [r4, r1]\n" " mov r2, #0x1\n" @@ -1075,7 +1075,7 @@ void DebugMenu_80771EC() " mov r2, #0x1d\n" " mov r3, #0xf\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._135\n" + " ldr r0, ._135 @ gStringVar4\n" " mov r1, #0x14\n" " mov r2, #0xd\n" " bl Menu_PrintText\n" @@ -1102,18 +1102,18 @@ void DebugMenu_8077238() " mov r5, r8\n" " push {r5, r6, r7}\n" " add sp, sp, #0xffffffe8\n" - " ldr r1, ._139\n" + " ldr r1, ._139 @ Str_839BE07\n" " mov r0, sp\n" " mov r2, #0x2\n" " bl memcpy\n" " add r0, sp, #0x4\n" " mov r9, r0\n" - " ldr r1, ._139 + 4\n" + " ldr r1, ._139 + 4 @ Str_839BE09\n" " mov r2, #0x3\n" " bl memcpy\n" " add r1, sp, #0x8\n" " mov sl, r1\n" - " ldr r1, ._139 + 8\n" + " ldr r1, ._139 + 8 @ Str_839BE0C\n" " mov r0, sl\n" " mov r2, #0x3\n" " bl memcpy\n" @@ -1141,7 +1141,7 @@ void DebugMenu_8077238() " ldrh r0, [r6]\n" " sub r0, r0, #0x7\n" " strh r0, [r6]\n" - " ldr r7, ._139 + 12\n" + " ldr r7, ._139 + 12 @ gStringVar4\n" " add r0, r7, #0\n" " mov r1, sp\n" " bl StringCopy\n" @@ -1202,7 +1202,7 @@ void DebugMenu_8077238() " mov r2, #0x1d\n" " mov r3, #0x13\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._139 + 12\n" + " ldr r0, ._139 + 12 @ gStringVar4\n" " mov r1, #0x1d\n" " ldr r2, [sp, #0x14]\n" " sub r1, r1, r2\n" @@ -1318,7 +1318,7 @@ u8 DebugMenu_OpenWatanabe() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._141\n" + " ldr r0, ._141 @ InitWatanabeDebugMenu\n" " bl SetMainCallback2\n" " bl ScriptContext2_Enable\n" " mov r0, #0x1\n" @@ -1338,7 +1338,7 @@ u8 DebugMenu_EndSequenceDemo() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._143\n" + " ldr r0, ._143 @ sub_81439D0\n" " bl SetMainCallback2\n" " bl ScriptContext2_Enable\n" " mov r0, #0x1\n" @@ -1415,7 +1415,7 @@ u8 DebugMenu_8077434() " cmp r0, #0x4\n" " bhi ._165 @cond_branch\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._149\n" + " ldr r1, ._149 @ \n" " add r0, r0, r1\n" " ldr r0, [r0]\n" " mov pc, r0\n" @@ -1430,7 +1430,7 @@ u8 DebugMenu_8077434() " .word ._154\n" " .word ._155\n" "._151:\n" - " ldr r0, ._157\n" + " ldr r0, ._157 @ Str_839BE0F\n" " mov r1, #0x1\n" " mov r2, #0x4\n" " bl GetEnigmaBerryChecksum\n" @@ -1447,7 +1447,7 @@ u8 DebugMenu_8077434() "._157:\n" " .word Str_839BE0F\n" "._152:\n" - " ldr r0, ._160\n" + " ldr r0, ._160 @ Str_839BE12\n" " mov r1, #0x2\n" " mov r2, #0x0\n" " bl GetEnigmaBerryChecksum\n" @@ -1462,7 +1462,7 @@ u8 DebugMenu_8077434() "._160:\n" " .word Str_839BE12\n" "._153:\n" - " ldr r0, ._163\n" + " ldr r0, ._163 @ Str_839BE16\n" " mov r1, #0x3\n" " mov r2, #0x0\n" " bl GetEnigmaBerryChecksum\n" @@ -1476,7 +1476,7 @@ u8 DebugMenu_8077434() "._163:\n" " .word Str_839BE16\n" "._154:\n" - " ldr r0, ._166\n" + " ldr r0, ._166 @ Str_839BE1A\n" " mov r1, #0x4\n" " mov r2, #0x0\n" " bl GetEnigmaBerryChecksum\n" @@ -1496,7 +1496,7 @@ u8 DebugMenu_8077434() "._166:\n" " .word Str_839BE1A\n" "._155:\n" - " ldr r0, ._168\n" + " ldr r0, ._168 @ Str_839BE1E\n" " mov r1, #0x4\n" " mov r2, #0x0\n" " bl GetEnigmaBerryChecksum\n" @@ -1526,7 +1526,7 @@ u8 DebugMenu_807750C() { asm( " push {lr}\n" - " ldr r0, ._170\n" + " ldr r0, ._170 @ gUnknown_Debug_839BE24\n" " bl DebugMenu_8077D78\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -1545,12 +1545,12 @@ u8 DebugMenu_SetRamBerry() { asm( " push {lr}\n" - " ldr r0, ._172\n" + " ldr r0, ._172 @ gUnknown_Debug_839BE24\n" " mov r1, #0xc\n" " mov r2, #0x5\n" " bl DebugMenu_8077D24\n" - " ldr r1, ._172 + 4\n" - " ldr r0, ._172 + 8\n" + " ldr r1, ._172 + 4 @ gMenuCallback\n" + " ldr r0, ._172 + 8 @ DebugMenu_807750C\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -1570,7 +1570,7 @@ u8 DebugMenu_ToggleBGM() { asm( " push {lr}\n" - " ldr r2, ._175\n" + " ldr r2, ._175 @ gDisableMusic\n" " mov r1, #0x0\n" " ldrb r0, [r2]\n" " cmp r0, #0\n" @@ -1611,7 +1611,7 @@ u8 DebugMenu_NationalDex() asm( " push {r4, r5, lr}\n" " mov r4, #0x0\n" - " ldr r5, ._178\n" + " ldr r5, ._178 @ 0x181\n" "._177:\n" " add r4, r4, #0x1\n" " lsl r4, r4, #0x10\n" @@ -1624,7 +1624,7 @@ u8 DebugMenu_NationalDex() " bl GetSetPokedexFlag\n" " cmp r4, r5\n" " bls ._177 @cond_branch\n" - " ldr r1, ._178 + 4\n" + " ldr r1, ._178 + 4 @ gUnknown_03005CE8\n" " mov r0, #0x1\n" " strb r0, [r1]\n" " bl CloseMenu\n" @@ -1664,7 +1664,7 @@ u8 DebugMenu_HoennDex() " bl GetSetPokedexFlag\n" " cmp r5, #0xc9\n" " bls ._180 @cond_branch\n" - " ldr r1, ._181\n" + " ldr r1, ._181 @ gUnknown_03005CE8\n" " mov r0, #0x1\n" " strb r0, [r1]\n" " bl CloseMenu\n" @@ -1847,7 +1847,7 @@ void DebugMenu_80776B4() " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " ldr r1, ._183\n" + " ldr r1, ._183 @ Str_839BE4C\n" " mov r0, sp\n" " mov r2, #0x7\n" " bl memcpy\n" @@ -1861,7 +1861,7 @@ void DebugMenu_80776B4() " add r1, r5, #0\n" " mov r2, #0x1d\n" " bl Menu_BlankWindowRect\n" - " ldr r0, ._183 + 4\n" + " ldr r0, ._183 + 4 @ gUnknown_030006C8\n" " ldrb r0, [r0]\n" " ASR r0, r4\n" " mov r1, #0x1\n" @@ -1890,7 +1890,7 @@ void DebugMenu_8077704() asm( " push {lr}\n" " add sp, sp, #0xffffffec\n" - " ldr r1, ._185\n" + " ldr r1, ._185 @ Str_839BE53\n" " mov r0, sp\n" " mov r2, #0x11\n" " bl memcpy\n" @@ -1903,7 +1903,7 @@ void DebugMenu_8077704() " mov r1, #0x15\n" " mov r2, #0x0\n" " bl Menu_PrintText\n" - " ldr r2, ._185 + 4\n" + " ldr r2, ._185 + 4 @ gUnknown_030006C8\n" " mov r0, #0x80\n" " lsl r0, r0, #0x13\n" " ldrh r0, [r0]\n" @@ -1936,7 +1936,7 @@ u8 DebugMenu_8077760() { asm( " push {r4, r5, lr}\n" - " ldr r2, ._190\n" + " ldr r2, ._190 @ gMain\n" " ldrh r1, [r2, #0x2e]\n" " mov r0, #0x40\n" " and r0, r0, r1\n" @@ -1948,7 +1948,7 @@ u8 DebugMenu_8077760() " mov r0, #0x1\n" " neg r0, r0\n" " bl Menu_MoveCursor\n" - " ldr r1, ._190 + 4\n" + " ldr r1, ._190 + 4 @ gUnknown_030006B8\n" " ldrb r0, [r1]\n" " cmp r0, #0\n" " beq ._188 @cond_branch\n" @@ -1973,7 +1973,7 @@ u8 DebugMenu_8077760() " bl PlaySE\n" " mov r0, #0x1\n" " bl Menu_MoveCursor\n" - " ldr r1, ._195\n" + " ldr r1, ._195 @ gUnknown_030006B8\n" " ldrb r0, [r1]\n" " cmp r0, #0x3\n" " beq ._193 @cond_branch\n" @@ -1995,7 +1995,7 @@ u8 DebugMenu_8077760() " beq ._197 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r4, ._201\n" + " ldr r4, ._201 @ gUnknown_030006C8\n" " bl Menu_GetCursorPos\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -2022,9 +2022,9 @@ u8 DebugMenu_8077760() " mov r2, #0x80\n" " lsl r2, r2, #0x13\n" " ldrh r0, [r2]\n" - " ldr r1, ._201 + 4\n" + " ldr r1, ._201 + 4 @ 0xf0ff\n" " and r1, r1, r0\n" - " ldr r0, ._201\n" + " ldr r0, ._201 @ gUnknown_030006C8\n" " ldrb r0, [r0]\n" " lsl r0, r0, #0x8\n" " add r1, r1, r0\n" @@ -2064,8 +2064,8 @@ u8 DebugMenu_SwitchBG() " mov r2, #0x0\n" " mov r3, #0x4\n" " bl InitMenu\n" - " ldr r1, ._203\n" - " ldr r0, ._203 + 4\n" + " ldr r1, ._203 @ gMenuCallback\n" + " ldr r0, ._203 + 4 @ DebugMenu_8077760\n" " str r0, [r1]\n" " mov r0, #0x0\n" " add sp, sp, #0x8\n" @@ -2089,7 +2089,7 @@ void DebugMenu_807786C() " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" - " ldr r1, ._205\n" + " ldr r1, ._205 @ Str_839BE64\n" " mov r0, sp\n" " mov r2, #0x7\n" " bl memcpy\n" @@ -2121,7 +2121,7 @@ void DebugMenu_80778A8() { asm( " push {r4, lr}\n" - " ldr r4, ._211\n" + " ldr r4, ._211 @ gMain\n" " ldrh r1, [r4, #0x2e]\n" " mov r0, #0x30\n" " and r0, r0, r1\n" @@ -2129,7 +2129,7 @@ void DebugMenu_80778A8() " beq ._207 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r2, ._211 + 4\n" + " ldr r2, ._211 + 4 @ sWildEncountersDisabled\n" " ldrb r0, [r2]\n" " mov r1, #0x1\n" " eor r0, r0, r1\n" @@ -2171,11 +2171,11 @@ u8 DebugMenu_ControlEncounter() asm( " push {lr}\n" " bl Menu_EraseScreen\n" - " ldr r0, ._213\n" + " ldr r0, ._213 @ sWildEncountersDisabled\n" " ldrb r0, [r0]\n" " bl DebugMenu_807786C\n" - " ldr r1, ._213 + 4\n" - " ldr r0, ._213 + 8\n" + " ldr r1, ._213 + 4 @ gMenuCallback\n" + " ldr r0, ._213 + 8 @ DebugMenu_80778A8\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -2194,8 +2194,8 @@ __attribute__((naked)) u8 DebugMenu_UseHM() { asm( - " ldr r1, ._215\n" - " ldr r0, ._215 + 4\n" + " ldr r1, ._215 @ gMenuCallback\n" + " ldr r0, ._215 + 4 @ DebugMenu_8077C14\n" " str r0, [r1]\n" " mov r0, #0x0\n" " bx lr\n" @@ -2214,7 +2214,7 @@ void DebugMenu_8077934() asm( " push {lr}\n" " mov r1, #0x0\n" - " ldr r3, ._218\n" + " ldr r3, ._218 @ gSaveBlock1\n" " mov r2, #0x1\n" "._217:\n" " add r0, r1, r3\n" @@ -2240,7 +2240,7 @@ void DebugMenu_8077954() asm( " push {lr}\n" " mov r1, #0x0\n" - " ldr r3, ._222\n" + " ldr r3, ._222 @ gSaveBlock1\n" " mov r2, #0x0\n" "._221:\n" " add r0, r1, r3\n" @@ -2266,7 +2266,7 @@ void DebugMenu_8077974() asm( " push {lr}\n" " bl Menu_EraseScreen\n" - " ldr r1, ._226\n" + " ldr r1, ._226 @ gSaveBlock1\n" " mov r0, #0x4\n" " ldsb r0, [r1, r0]\n" " lsl r0, r0, #0x10\n" @@ -2279,8 +2279,8 @@ void DebugMenu_8077974() " bl IsRematchTrainerIn\n" " cmp r0, #0\n" " beq ._224 @cond_branch\n" - " ldr r0, ._226 + 4\n" - " ldr r1, ._226 + 8\n" + " ldr r0, ._226 + 4 @ gStringVar1\n" + " ldr r1, ._226 + 8 @ Str_839BE8D\n" " bl StringCopy\n" " b ._225\n" "._227:\n" @@ -2290,11 +2290,11 @@ void DebugMenu_8077974() " .word gStringVar1\n" " .word Str_839BE8D\n" "._224:\n" - " ldr r0, ._230\n" - " ldr r1, ._230 + 4\n" + " ldr r0, ._230 @ gStringVar1\n" + " ldr r1, ._230 + 4 @ Str_839BE90\n" " bl StringCopy\n" "._225:\n" - " ldr r1, ._230 + 8\n" + " ldr r1, ._230 + 8 @ gSaveBlock1\n" " mov r0, #0x4\n" " ldsb r0, [r1, r0]\n" " lsl r0, r0, #0x10\n" @@ -2307,8 +2307,8 @@ void DebugMenu_8077974() " bl DoesSomeoneWantRematchIn\n" " cmp r0, #0\n" " beq ._228 @cond_branch\n" - " ldr r0, ._230 + 12\n" - " ldr r1, ._230 + 16\n" + " ldr r0, ._230 + 12 @ gStringVar2\n" + " ldr r1, ._230 + 16 @ Str_839BE8D\n" " bl StringCopy\n" " b ._229\n" "._231:\n" @@ -2320,14 +2320,14 @@ void DebugMenu_8077974() " .word gStringVar2\n" " .word Str_839BE8D\n" "._228:\n" - " ldr r0, ._232\n" - " ldr r1, ._232 + 4\n" + " ldr r0, ._232 @ gStringVar2\n" + " ldr r1, ._232 + 4 @ Str_839BE90\n" " bl StringCopy\n" "._229:\n" - " ldr r0, ._232 + 8\n" + " ldr r0, ._232 + 8 @ Str_839BE6B\n" " bl sub_8071F40\n" - " ldr r1, ._232 + 12\n" - " ldr r0, ._232 + 16\n" + " ldr r1, ._232 + 12 @ gMenuCallback\n" + " ldr r0, ._232 + 16 @ DebugMenu_8077DB4\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -2349,8 +2349,8 @@ void DebugMenu_8077A20() { asm( " push {lr}\n" - " ldr r0, ._234\n" - " ldr r1, ._234 + 4\n" + " ldr r0, ._234 @ gSaveBlock1\n" + " ldr r1, ._234 + 4 @ 0x978\n" " add r0, r0, r1\n" " mov r1, #0xff\n" " strh r1, [r0]\n" @@ -2372,8 +2372,8 @@ void DebugMenu_8077A40() { asm( " push {lr}\n" - " ldr r0, ._236\n" - " ldr r1, ._236 + 4\n" + " ldr r0, ._236 @ gSaveBlock1\n" + " ldr r1, ._236 + 4 @ 0x978\n" " add r0, r0, r1\n" " mov r1, #0x0\n" " strh r1, [r0]\n" @@ -2395,7 +2395,7 @@ void DebugMenu_8077A60() { asm( " push {lr}\n" - " ldr r0, ._238\n" + " ldr r0, ._238 @ gUnknown_Debug_839BEE4\n" " bl DebugMenu_8077D78\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -2415,12 +2415,12 @@ u8 DebugMenu_RematchTrainers() asm( " push {lr}\n" " bl Menu_EraseScreen\n" - " ldr r0, ._240\n" + " ldr r0, ._240 @ gUnknown_Debug_839BEE4\n" " mov r1, #0xd\n" " mov r2, #0x5\n" " bl DebugMenu_8077D24\n" - " ldr r1, ._240 + 4\n" - " ldr r0, ._240 + 8\n" + " ldr r1, ._240 + 4 @ gMenuCallback\n" + " ldr r0, ._240 + 8 @ DebugMenu_8077A60\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -2440,7 +2440,7 @@ void DebugMenu_8077A9C() { asm( " push {lr}\n" - " ldr r1, ._242\n" + " ldr r1, ._242 @ gNumSafariBalls\n" " mov r0, #0x1e\n" " strb r0, [r1]\n" " bl CloseMenu\n" @@ -2460,7 +2460,7 @@ void DebugMenu_8077AB4() { asm( " push {lr}\n" - " ldr r1, ._244\n" + " ldr r1, ._244 @ gNumSafariBalls\n" " mov r0, #0x1\n" " strb r0, [r1]\n" " bl CloseMenu\n" @@ -2480,7 +2480,7 @@ void DebugMenu_8077ACC() { asm( " push {lr}\n" - " ldr r1, ._246\n" + " ldr r1, ._246 @ gSafariZoneStepCounter\n" " mov r2, #0xfa\n" " lsl r2, r2, #0x1\n" " add r0, r2, #0\n" @@ -2502,7 +2502,7 @@ void DebugMenu_8077AE8() { asm( " push {lr}\n" - " ldr r1, ._248\n" + " ldr r1, ._248 @ gSafariZoneStepCounter\n" " mov r0, #0x1\n" " strh r0, [r1]\n" " bl CloseMenu\n" @@ -2526,7 +2526,7 @@ void DebugMenu_8077B00() " bl unref_sub_80C853C\n" " cmp r0, #0\n" " beq ._250 @cond_branch\n" - " ldr r0, ._252\n" + " ldr r0, ._252 @ Str_839BF14\n" " bl sub_8071F40\n" " b ._251\n" "._253:\n" @@ -2534,11 +2534,11 @@ void DebugMenu_8077B00() "._252:\n" " .word Str_839BF14\n" "._250:\n" - " ldr r0, ._254\n" + " ldr r0, ._254 @ Str_839BF1F\n" " bl sub_8071F40\n" "._251:\n" - " ldr r1, ._254 + 4\n" - " ldr r0, ._254 + 8\n" + " ldr r1, ._254 + 4 @ gMenuCallback\n" + " ldr r0, ._254 + 8 @ DebugMenu_8077DB4\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -2558,7 +2558,7 @@ void DebugMenu_8077B3C() { asm( " push {lr}\n" - " ldr r0, ._256\n" + " ldr r0, ._256 @ gUnknown_Debug_839BF6C\n" " bl DebugMenu_8077D78\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -2581,20 +2581,20 @@ u8 DebugMenu_Safari() " cmp r0, #0\n" " beq ._258 @cond_branch\n" " bl Menu_EraseScreen\n" - " ldr r0, ._260\n" + " ldr r0, ._260 @ gUnknown_Debug_839BF6C\n" " mov r1, #0xe\n" " mov r2, #0x5\n" " bl DebugMenu_8077D24\n" - " ldr r0, ._260 + 4\n" - " ldr r1, ._260 + 8\n" + " ldr r0, ._260 + 4 @ gStringVar1\n" + " ldr r1, ._260 + 8 @ gSafariZoneStepCounter\n" " ldrh r1, [r1]\n" " mov r2, #0x1\n" " mov r3, #0x3\n" " bl ConvertIntToDecimalStringN\n" - " ldr r0, ._260 + 12\n" + " ldr r0, ._260 + 12 @ Str_839BF0C\n" " bl sub_8071F40\n" - " ldr r1, ._260 + 16\n" - " ldr r0, ._260 + 20\n" + " ldr r1, ._260 + 16 @ gMenuCallback\n" + " ldr r0, ._260 + 20 @ DebugMenu_8077B3C\n" " str r0, [r1]\n" " bl ScriptContext2_Enable\n" " mov r0, #0x0\n" @@ -2704,7 +2704,7 @@ void DebugMenu_8077C00() { asm( " push {lr}\n" - " ldr r0, ._262\n" + " ldr r0, ._262 @ gUnknown_Debug_839BF94\n" " bl DebugMenu_8077D78\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -2724,12 +2724,12 @@ void DebugMenu_8077C14() asm( " push {lr}\n" " bl Menu_EraseScreen\n" - " ldr r0, ._264\n" + " ldr r0, ._264 @ gUnknown_Debug_839BF94\n" " mov r1, #0xa\n" " mov r2, #0x9\n" " bl DebugMenu_8077D24\n" - " ldr r1, ._264 + 4\n" - " ldr r0, ._264 + 8\n" + " ldr r1, ._264 + 4 @ gMenuCallback\n" + " ldr r0, ._264 + 8 @ DebugMenu_8077C00\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -2756,8 +2756,8 @@ void DebugMenu_8077C3C() " add sp, sp, #0xfffffffc\n" " mov sl, r0\n" " add r7, r1, #0\n" - " ldr r0, ._271\n" - " ldr r1, ._271 + 4\n" + " ldr r0, ._271 @ gUnknown_030006BC\n" + " ldr r1, ._271 + 4 @ gUnknown_Debug_839BFE8\n" " str r1, [r0]\n" " mov r1, #0x0\n" " strb r1, [r7]\n" @@ -2768,7 +2768,7 @@ void DebugMenu_8077C3C() " mov r8, r0\n" "._269:\n" " mov r5, #0x0\n" - " ldr r1, ._271\n" + " ldr r1, ._271 @ gUnknown_030006BC\n" " ldr r0, [r1]\n" " ldr r2, [r0, #0x4]\n" " mov r4, #0x0\n" @@ -2858,8 +2858,8 @@ void debug_sub_8077CF4() " lsr r4, r4, #0x18\n" " lsl r5, r5, #0x18\n" " lsr r5, r5, #0x18\n" - " ldr r0, ._273\n" - " ldr r6, ._273 + 4\n" + " ldr r0, ._273 @ BuildDateTime\n" + " ldr r6, ._273 + 4 @ gStringVar4\n" " add r1, r6, #0\n" " bl DebugMenu_8077C3C\n" " add r0, r6, #0\n" @@ -2940,7 +2940,7 @@ void DebugMenu_8077D78() " cmp r4, r0\n" " beq ._276 @cond_branch\n" " bl Menu_EraseScreen\n" - " ldr r0, ._278\n" + " ldr r0, ._278 @ gMenuCallback\n" " lsl r1, r4, #0x3\n" " add r1, r1, r5\n" " ldr r1, [r1, #0x4]\n" @@ -2968,7 +2968,7 @@ void DebugMenu_8077DB4() { asm( " push {lr}\n" - " ldr r0, ._282\n" + " ldr r0, ._282 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -3063,7 +3063,7 @@ void DebugMenu_8077E40() asm( " push {r4, lr}\n" " add r4, r0, #0\n" - " ldr r0, ._297\n" + " ldr r0, ._297 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -3130,14 +3130,14 @@ void DebugMenu_8077EAC() { asm( " push {r4, lr}\n" - " ldr r0, ._303\n" + " ldr r0, ._303 @ DebugMenu_8077F40\n" " mov r1, #0x50\n" " bl CreateTask\n" " add r4, r0, #0\n" " lsl r4, r4, #0x18\n" " lsr r4, r4, #0x18\n" " bl Menu_EraseScreen\n" - " ldr r1, ._303 + 4\n" + " ldr r1, ._303 + 4 @ gTasks\n" " lsl r0, r4, #0x2\n" " add r0, r0, r4\n" " lsl r0, r0, #0x3\n" @@ -3173,7 +3173,7 @@ void DebugMenu_8077EE0() " mov r2, #0x16\n" " mov r3, #0x12\n" " bl Menu_BlankWindowRect\n" - " ldr r5, ._305\n" + " ldr r5, ._305 @ gStringVar1\n" " add r0, r5, #0\n" " add r1, r4, #0\n" " mov r2, #0x1\n" @@ -3218,17 +3218,17 @@ void DebugMenu_8077F40() " lsl r4, r0, #0x2\n" " add r4, r4, r0\n" " lsl r4, r4, #0x3\n" - " ldr r0, ._307\n" + " ldr r0, ._307 @ gTasks\n" " add r4, r4, r0\n" " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._307 + 4\n" + " ldr r0, ._307 + 4 @ gDebug0x839C008\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" " ldrh r0, [r4, #0xa]\n" " ldrh r1, [r4, #0xc]\n" " bl DebugMenu_8077EE0\n" - " ldr r0, ._307 + 8\n" + " ldr r0, ._307 + 8 @ DebugMenu_8077F7C\n" " str r0, [r4]\n" " pop {r4}\n" " pop {r0}\n" @@ -3253,23 +3253,23 @@ void DebugMenu_8077F7C() " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r1, r1, #0x3\n" - " ldr r0, ._311\n" + " ldr r0, ._311 @ gTasks\n" " add r4, r1, r0\n" - " ldr r3, ._311 + 4\n" + " ldr r3, ._311 + 4 @ gMain\n" " ldrh r1, [r3, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._309 @cond_branch\n" " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._311 + 8\n" + " ldr r0, ._311 + 8 @ Str_839C014\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" " ldrh r0, [r4, #0xa]\n" " ldrh r1, [r4, #0xc]\n" " bl DebugMenu_8077EE0\n" - " ldr r0, ._311 + 12\n" + " ldr r0, ._311 + 12 @ DebugMenu_8077FFC\n" " str r0, [r4]\n" " b ._317\n" "._312:\n" @@ -3284,7 +3284,7 @@ void DebugMenu_8077F7C() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._313 @cond_branch\n" - " ldr r0, ._315\n" + " ldr r0, ._315 @ DebugMenu_807806C\n" " str r0, [r4]\n" " b ._317\n" "._316:\n" @@ -3322,9 +3322,9 @@ void DebugMenu_8077FFC() " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r1, r1, #0x3\n" - " ldr r0, ._321\n" + " ldr r0, ._321 @ gTasks\n" " add r4, r1, r0\n" - " ldr r2, ._321 + 4\n" + " ldr r2, ._321 + 4 @ gMain\n" " ldrh r1, [r2, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -3351,7 +3351,7 @@ void DebugMenu_8077FFC() " cmp r0, #0\n" " beq ._323 @cond_branch\n" "._320:\n" - " ldr r0, ._325\n" + " ldr r0, ._325 @ DebugMenu_8077F40\n" " str r0, [r4]\n" " b ._327\n" "._326:\n" @@ -3411,7 +3411,7 @@ void DebugMenu_807808C() " mov r4, #0x1\n" "._328:\n" " lsl r1, r4, #0x5\n" - " ldr r0, ._331\n" + " ldr r0, ._331 @ gSaveBlock1\n" " add r5, r1, r0\n" " bl Menu_EraseScreen\n" " mov r0, #0x0\n" @@ -3419,7 +3419,7 @@ void DebugMenu_807808C() " mov r2, #0x13\n" " mov r3, #0x11\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._331 + 4\n" + " ldr r0, ._331 + 4 @ Str_839C01E\n" " mov r1, #0x2\n" " mov r2, #0x2\n" " bl Menu_PrintText\n" @@ -3460,7 +3460,7 @@ void DebugMenu_807808C() " .word gSaveBlock1+0x2ddc\n" " .word Str_839C01E\n" "._329:\n" - " ldr r0, ._335\n" + " ldr r0, ._335 @ Str_839C04D\n" " mov r1, #0xb\n" " mov r2, #0x6\n" " bl Menu_PrintText\n" @@ -3483,7 +3483,7 @@ void DebugMenu_807808C() "._335:\n" " .word Str_839C04D\n" "._333:\n" - " ldr r0, ._337\n" + " ldr r0, ._337 @ Str_839C04D\n" " mov r1, #0xb\n" " mov r2, #0x8\n" " bl Menu_PrintText\n" @@ -3525,7 +3525,7 @@ void DebugMenu_807817C() " push {r4, lr}\n" " lsl r0, r0, #0x18\n" " lsr r4, r0, #0x18\n" - " ldr r0, ._340\n" + " ldr r0, ._340 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -3557,7 +3557,7 @@ void DebugMenu_80781A8() " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r1, r1, #0x3\n" - " ldr r0, ._344\n" + " ldr r0, ._344 @ gTasks\n" " add r5, r1, r0\n" " ldrh r1, [r5, #0x8]\n" " mov r2, #0x8\n" @@ -3572,7 +3572,7 @@ void DebugMenu_80781A8() "._344:\n" " .word gTasks\n" "._342:\n" - " ldr r2, ._348\n" + " ldr r2, ._348 @ gMain\n" " ldrh r1, [r2, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -3581,7 +3581,7 @@ void DebugMenu_80781A8() " mov r1, #0x8\n" " ldsh r0, [r5, r1]\n" " bl DebugMenu_807808C\n" - " ldr r0, ._348 + 4\n" + " ldr r0, ._348 + 4 @ DebugMenu_807817C\n" " str r0, [r5]\n" " b ._350\n" "._349:\n" @@ -3606,7 +3606,7 @@ void DebugMenu_80781A8() " mov r2, #0x16\n" " mov r3, #0x12\n" " bl Menu_BlankWindowRect\n" - " ldr r4, ._351\n" + " ldr r4, ._351 @ gStringVar1\n" " mov r2, #0x8\n" " ldsh r1, [r5, r2]\n" " add r0, r4, #0\n" @@ -3635,7 +3635,7 @@ u8 DebugMenu_ViewPortraits() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._353\n" + " ldr r0, ._353 @ DebugMenu_80781A8\n" " mov r1, #0x50\n" " bl CreateTask\n" " bl ScriptContext2_Enable\n" @@ -3667,21 +3667,21 @@ u8 DebugMenu_AllBadges() { asm( " push {lr}\n" - " ldr r0, ._355\n" + " ldr r0, ._355 @ 0x807\n" " bl FlagSet\n" - " ldr r0, ._355 + 4\n" + " ldr r0, ._355 + 4 @ 0x808\n" " bl FlagSet\n" - " ldr r0, ._355 + 8\n" + " ldr r0, ._355 + 8 @ 0x809\n" " bl FlagSet\n" - " ldr r0, ._355 + 12\n" + " ldr r0, ._355 + 12 @ 0x80a\n" " bl FlagSet\n" - " ldr r0, ._355 + 16\n" + " ldr r0, ._355 + 16 @ 0x80b\n" " bl FlagSet\n" - " ldr r0, ._355 + 20\n" + " ldr r0, ._355 + 20 @ 0x80c\n" " bl FlagSet\n" - " ldr r0, ._355 + 24\n" + " ldr r0, ._355 + 24 @ 0x80d\n" " bl FlagSet\n" - " ldr r0, ._355 + 28\n" + " ldr r0, ._355 + 28 @ 0x80e\n" " bl FlagSet\n" " bl CloseMenu\n" " mov r0, #0x1\n" @@ -3708,7 +3708,7 @@ u8 DebugMenu_TimeRecords() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._357\n" + " ldr r0, ._357 @ debug_sub_806F9E4\n" " mov r1, #0x50\n" " bl CreateTask\n" " bl ScriptContext2_Enable\n" @@ -3746,11 +3746,11 @@ void DebugMenu_80782EC() " add r1, r0, #0\n" " lsl r1, r1, #0x10\n" " lsr r1, r1, #0x10\n" - " ldr r0, ._359\n" + " ldr r0, ._359 @ gStringVar1\n" " mov r2, #0x0\n" " mov r3, #0x4\n" " bl ConvertIntToHexStringN\n" - " ldr r0, ._359 + 4\n" + " ldr r0, ._359 + 4 @ Str_839C053\n" " bl sub_8071F40\n" " pop {r0}\n" " bx r0\n" @@ -3773,7 +3773,7 @@ void DebugMenu_8078310() " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" - " ldr r1, ._364\n" + " ldr r1, ._364 @ gTasks\n" " add r4, r0, r1\n" " mov r1, #0x0\n" " ldsh r0, [r4, r1]\n" @@ -3787,7 +3787,7 @@ void DebugMenu_8078310() "._364:\n" " .word gTasks+0x8\n" "._361:\n" - " ldr r0, ._367\n" + " ldr r0, ._367 @ 0x4024\n" " bl VarGet\n" " strh r0, [r4, #0x2]\n" " ldrh r0, [r4, #0x2]\n" @@ -3801,14 +3801,14 @@ void DebugMenu_8078310() "._367:\n" " .word 0x4024\n" "._362:\n" - " ldr r3, ._371\n" + " ldr r3, ._371 @ gMain\n" " ldrh r1, [r3, #0x2e]\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._369 @cond_branch\n" " mov r0, #0x49\n" " bl PlaySE\n" - " ldr r0, ._371 + 4\n" + " ldr r0, ._371 + 4 @ 0x4024\n" " bl GetVarPointer\n" " ldrh r1, [r4, #0x2]\n" " strh r1, [r0]\n" @@ -3831,7 +3831,7 @@ void DebugMenu_8078310() " b ._375\n" "._373:\n" " add r0, r4, #2\n" - " ldr r2, ._376\n" + " ldr r2, ._376 @ 0xffff\n" " ldrh r3, [r3, #0x30]\n" " mov r1, #0x0\n" " bl DebugMenu_8077DD8\n" @@ -3857,7 +3857,7 @@ u8 DebugMenu_MiragaIslandRND() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._378\n" + " ldr r0, ._378 @ DebugMenu_8078310\n" " mov r1, #0x50\n" " bl CreateTask\n" " bl ScriptContext2_Enable\n" @@ -3877,7 +3877,7 @@ void DebugMenu_80783C8() { asm( " push {r4, lr}\n" - " ldr r0, ._383\n" + " ldr r0, ._383 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x30\n" " and r0, r0, r1\n" @@ -3885,7 +3885,7 @@ void DebugMenu_80783C8() " beq ._382 @cond_branch\n" " mov r0, #0x5\n" " bl PlaySE\n" - " ldr r4, ._383 + 4\n" + " ldr r4, ._383 + 4 @ 0x804\n" " add r0, r4, #0\n" " bl FlagGet\n" " lsl r0, r0, #0x18\n" @@ -3907,7 +3907,7 @@ void DebugMenu_80783C8() " mov r0, #0x1\n" " bl DebugMenu_807786C\n" "._382:\n" - " ldr r0, ._388\n" + " ldr r0, ._388 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -3941,15 +3941,15 @@ u8 DebugMenu_ToggleClearFlag() asm( " push {lr}\n" " bl Menu_EraseScreen\n" - " ldr r0, ._390\n" + " ldr r0, ._390 @ 0x804\n" " bl FlagGet\n" " mov r1, #0x1\n" " eor r0, r0, r1\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " bl DebugMenu_807786C\n" - " ldr r1, ._390 + 4\n" - " ldr r0, ._390 + 8\n" + " ldr r1, ._390 + 4 @ gMenuCallback\n" + " ldr r0, ._390 + 8 @ DebugMenu_80783C8\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -3969,7 +3969,7 @@ void DebugMenu_8078464() { asm( " push {r4, lr}\n" - " ldr r4, ._396\n" + " ldr r4, ._396 @ 0x82a\n" " add r0, r4, #0\n" " bl FlagGet\n" " lsl r0, r0, #0x18\n" @@ -4020,7 +4020,7 @@ u8 DebugMenu_OpenWeatherEvents() asm( " push {lr}\n" " bl Menu_EraseScreen\n" - " ldr r0, ._404\n" + " ldr r0, ._404 @ 0x82a\n" " bl FlagGet\n" " mov r1, #0x0\n" " lsl r0, r0, #0x18\n" @@ -4030,8 +4030,8 @@ u8 DebugMenu_OpenWeatherEvents() "._403:\n" " add r0, r1, #0\n" " bl DebugMenu_807786C\n" - " ldr r1, ._404 + 4\n" - " ldr r0, ._404 + 8\n" + " ldr r1, ._404 + 4 @ gMenuCallback\n" + " ldr r0, ._404 + 8 @ DebugMenu_8078464\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -4099,8 +4099,8 @@ u8 DebugMenu_OpenMysteryEvent() "._415:\n" " add r0, r1, #0\n" " bl DebugMenu_807786C\n" - " ldr r1, ._416\n" - " ldr r0, ._416 + 4\n" + " ldr r1, ._416 @ gMenuCallback\n" + " ldr r0, ._416 + 4 @ DebugMenu_80784E8\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -4125,13 +4125,13 @@ void DebugMenu_8078550() " lsr r0, r0, #0x18\n" " bl GetGameStat\n" " add r7, r0, #0\n" - " ldr r0, ._420\n" + " ldr r0, ._420 @ gStringVar1\n" " add r1, r6, #0\n" " mov r2, #0x2\n" " mov r3, #0x2\n" " bl ConvertIntToDecimalStringN\n" - " ldr r0, ._420 + 4\n" - " ldr r5, ._420 + 8\n" + " ldr r0, ._420 + 4 @ gStringVar2\n" + " ldr r5, ._420 + 8 @ gUnknown_Debug_839C26C\n" " lsl r4, r6, #0x3\n" " add r1, r5, #4\n" " add r1, r4, r1\n" @@ -4141,8 +4141,8 @@ void DebugMenu_8078550() " ldr r0, [r4]\n" " cmp r0, #0\n" " bne ._418 @cond_branch\n" - " ldr r0, ._420 + 12\n" - " ldr r1, ._420 + 16\n" + " ldr r0, ._420 + 12 @ gStringVar3\n" + " ldr r1, ._420 + 16 @ Str_839C085\n" " bl StringCopy\n" " b ._423\n" "._421:\n" @@ -4156,7 +4156,7 @@ void DebugMenu_8078550() "._418:\n" " cmp r6, #0x1\n" " beq ._422 @cond_branch\n" - " ldr r0, ._424\n" + " ldr r0, ._424 @ gStringVar3\n" " add r1, r7, #0\n" " mov r2, #0x1\n" " mov r3, #0xa\n" @@ -4167,7 +4167,7 @@ void DebugMenu_8078550() "._424:\n" " .word gStringVar3\n" "._422:\n" - " ldr r4, ._426\n" + " ldr r4, ._426 @ gStringVar3\n" " lsr r1, r7, #0x10\n" " add r0, r4, #0\n" " mov r2, #0x1\n" @@ -4192,7 +4192,7 @@ void DebugMenu_8078550() " bl ConvertIntToDecimalStringN\n" "._423:\n" " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._426 + 4\n" + " ldr r0, ._426 + 4 @ Str_839C07C\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" @@ -4218,7 +4218,7 @@ void DebugMenu_807860C() " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" - " ldr r1, ._432\n" + " ldr r1, ._432 @ gTasks\n" " add r4, r0, r1\n" " mov r1, #0x0\n" " ldsh r0, [r4, r1]\n" @@ -4246,7 +4246,7 @@ void DebugMenu_807860C() " strh r0, [r4]\n" " b ._447\n" "._428:\n" - " ldr r3, ._439\n" + " ldr r3, ._439 @ gMain\n" " ldrh r1, [r3, #0x2e]\n" " and r0, r0, r1\n" " cmp r0, #0\n" @@ -4338,13 +4338,13 @@ void DebugMenu_80786D0() " bl DebugMenu_807860C\n" " cmp r0, #0\n" " beq ._449 @cond_branch\n" - " ldr r1, ._450\n" + " ldr r1, ._450 @ gTasks\n" " lsl r0, r4, #0x2\n" " add r0, r0, r4\n" " lsl r0, r0, #0x3\n" " add r0, r0, r1\n" " ldrb r2, [r0, #0xa]\n" - " ldr r1, ._450 + 4\n" + " ldr r1, ._450 + 4 @ gUnknown_Debug_839C26C\n" " lsl r0, r2, #0x3\n" " add r0, r0, r1\n" " ldr r0, [r0]\n" @@ -4379,13 +4379,13 @@ void DebugMenu_8078714() " bl DebugMenu_807860C\n" " cmp r0, #0\n" " beq ._453 @cond_branch\n" - " ldr r1, ._454\n" + " ldr r1, ._454 @ gTasks\n" " lsl r0, r4, #0x2\n" " add r0, r0, r4\n" " lsl r0, r0, #0x3\n" " add r0, r0, r1\n" " ldrb r2, [r0, #0xa]\n" - " ldr r1, ._454 + 4\n" + " ldr r1, ._454 + 4 @ gUnknown_Debug_839C26C\n" " lsl r0, r2, #0x3\n" " add r0, r0, r1\n" " ldr r0, [r0]\n" @@ -4433,7 +4433,7 @@ void DebugMenu_8078774() { asm( " push {lr}\n" - " ldr r0, ._456\n" + " ldr r0, ._456 @ DebugMenu_80786C0\n" " bl DebugMenu_8078758\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -4452,7 +4452,7 @@ void DebugMenu_8078788() { asm( " push {lr}\n" - " ldr r0, ._458\n" + " ldr r0, ._458 @ DebugMenu_80786D0\n" " bl DebugMenu_8078758\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -4471,7 +4471,7 @@ void DebugMenu_807879C() { asm( " push {lr}\n" - " ldr r0, ._460\n" + " ldr r0, ._460 @ DebugMenu_8078714\n" " bl DebugMenu_8078758\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -4490,7 +4490,7 @@ void DebugMenu_80787B0() { asm( " push {lr}\n" - " ldr r0, ._462\n" + " ldr r0, ._462 @ gUnknown_Debug_839C3FC\n" " bl DebugMenu_8077D78\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -4510,12 +4510,12 @@ u8 DebugMenu_OpenLegendsRecord() asm( " push {lr}\n" " bl Menu_EraseScreen\n" - " ldr r0, ._464\n" + " ldr r0, ._464 @ gUnknown_Debug_839C3FC\n" " mov r1, #0xc\n" " mov r2, #0x3\n" " bl DebugMenu_8077D24\n" - " ldr r1, ._464 + 4\n" - " ldr r0, ._464 + 8\n" + " ldr r1, ._464 + 4 @ gMenuCallback\n" + " ldr r0, ._464 + 8 @ DebugMenu_80787B0\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -4541,7 +4541,7 @@ void DebugMenu_80787EC() " mov r0, sp\n" " add r1, r5, #0\n" " bl GetXYCoordsOneStepInFrontOfPlayer\n" - " ldr r4, ._466\n" + " ldr r4, ._466 @ gSpecialVar_Result\n" " mov r0, sp\n" " mov r1, #0x0\n" " ldsh r0, [r0, r1]\n" @@ -4549,7 +4549,7 @@ void DebugMenu_80787EC() " ldsh r1, [r5, r2]\n" " bl MapGridGetMetatileBehaviorAt\n" " strh r0, [r4]\n" - " ldr r0, ._466 + 4\n" + " ldr r0, ._466 + 4 @ gStringVar1\n" " ldrh r1, [r4]\n" " mov r2, #0x2\n" " mov r3, #0x4\n" @@ -4561,7 +4561,7 @@ void DebugMenu_80787EC() " ldsh r1, [r5, r2]\n" " bl MapGridGetMetatileIdAt\n" " strh r0, [r4]\n" - " ldr r0, ._466 + 8\n" + " ldr r0, ._466 + 8 @ gStringVar2\n" " ldrh r1, [r4]\n" " mov r2, #0x2\n" " mov r3, #0x4\n" @@ -4575,13 +4575,13 @@ void DebugMenu_80787EC() " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" " strh r0, [r4]\n" - " ldr r0, ._466 + 12\n" + " ldr r0, ._466 + 12 @ gStringVar3\n" " ldrh r1, [r4]\n" " mov r2, #0x2\n" " mov r3, #0x4\n" " bl ConvertIntToHexStringN\n" - " ldr r0, ._466 + 16\n" - " ldr r1, ._466 + 20\n" + " ldr r0, ._466 + 16 @ gStringVar4\n" + " ldr r1, ._466 + 20 @ Str_839C414\n" " bl StringExpandPlaceholders\n" " add sp, sp, #0x4\n" " pop {r4, r5}\n" @@ -4607,7 +4607,7 @@ void DebugMenu_8078880() " push {r4, r5, lr}\n" " lsl r0, r0, #0x18\n" " lsr r5, r0, #0x18\n" - " ldr r1, ._472\n" + " ldr r1, ._472 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -4633,7 +4633,7 @@ void DebugMenu_8078880() " bl Menu_DisplayDialogueFrame\n" " b ._476\n" "._468:\n" - " ldr r0, ._478\n" + " ldr r0, ._478 @ gStringVar4\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" @@ -4647,7 +4647,7 @@ void DebugMenu_8078880() "._478:\n" " .word gStringVar4\n" "._474:\n" - " ldr r0, ._481\n" + " ldr r0, ._481 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -4675,7 +4675,7 @@ u8 DebugMenu_CellInfo() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._483\n" + " ldr r0, ._483 @ DebugMenu_8078880\n" " mov r1, #0x50\n" " bl CreateTask\n" " bl DebugMenu_80787EC\n" @@ -4713,8 +4713,8 @@ u8 DebugMenu_OpenBerryInfo() " mov r1, #0x1\n" " mov r2, #0x1\n" " bl Menu_PrintText\n" - " ldr r1, ._487\n" - " ldr r0, ._487 + 4\n" + " ldr r1, ._487 @ gMenuCallback\n" + " ldr r0, ._487 + 4 @ DebugMenu_8077DB4\n" " str r0, [r1]\n" " mov r0, #0x0\n" "._486:\n" @@ -4736,7 +4736,7 @@ void DebugMenu_8078950() asm( " push {lr}\n" " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._489\n" + " ldr r0, ._489 @ Str_839C42E\n" " mov r1, #0x4\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" @@ -4758,7 +4758,7 @@ void DebugMenu_8078968() " lsl r0, r0, #0x10\n" " cmp r0, #0\n" " bne ._491 @cond_branch\n" - " ldr r0, ._493\n" + " ldr r0, ._493 @ gStringVar1\n" " mov r1, #0x32\n" " mov r2, #0x2\n" " mov r3, #0x3\n" @@ -4769,13 +4769,13 @@ void DebugMenu_8078968() "._493:\n" " .word gStringVar1\n" "._491:\n" - " ldr r0, ._495\n" + " ldr r0, ._495 @ gStringVar1\n" " mov r1, #0x64\n" " mov r2, #0x2\n" " mov r3, #0x3\n" " bl ConvertIntToDecimalStringN\n" "._492:\n" - " ldr r0, ._495\n" + " ldr r0, ._495 @ gStringVar1\n" " mov r1, #0x4\n" " mov r2, #0x11\n" " bl Menu_PrintText\n" @@ -4797,7 +4797,7 @@ void DebugMenu_80789A4() " add r1, r0, #0\n" " lsl r1, r1, #0x10\n" " lsr r1, r1, #0x10\n" - " ldr r4, ._497\n" + " ldr r4, ._497 @ gStringVar1\n" " add r0, r4, #0\n" " mov r2, #0x2\n" " mov r3, #0x4\n" @@ -4827,12 +4827,12 @@ void DebugMenu_80789CC() " lsl r4, r0, #0x2\n" " add r4, r4, r0\n" " lsl r4, r4, #0x3\n" - " ldr r6, ._499\n" + " ldr r6, ._499 @ gTasks\n" " add r5, r4, r6\n" " mov r0, #0x0\n" " strh r0, [r5]\n" - " ldr r0, ._499 + 4\n" - " ldr r1, ._499 + 8\n" + " ldr r0, ._499 + 4 @ gSaveBlock2\n" + " ldr r1, ._499 + 8 @ 0x55c\n" " add r0, r0, r1\n" " ldrh r0, [r0]\n" " strh r0, [r5, #0x2]\n" @@ -4841,7 +4841,7 @@ void DebugMenu_80789CC() " bl DebugMenu_8078968\n" " sub r6, r6, #0x8\n" " add r4, r4, r6\n" - " ldr r0, ._499 + 12\n" + " ldr r0, ._499 + 12 @ DebugMenu_8078A14\n" " str r0, [r4]\n" " pop {r4, r5, r6}\n" " pop {r0}\n" @@ -4867,9 +4867,9 @@ void DebugMenu_8078A14() " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r4, r1, #0x3\n" - " ldr r5, ._504\n" + " ldr r5, ._504 @ gTasks\n" " add r2, r4, r5\n" - " ldr r0, ._504 + 4\n" + " ldr r0, ._504 + 4 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0xc0\n" " and r0, r0, r1\n" @@ -4896,11 +4896,11 @@ void DebugMenu_8078A14() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._506 @cond_branch\n" - " ldr r1, ._508\n" + " ldr r1, ._508 @ gSaveBlock2\n" " mov r3, #0x0\n" " ldsh r0, [r2, r3]\n" " lsl r0, r0, #0x1\n" - " ldr r3, ._508 + 4\n" + " ldr r3, ._508 + 4 @ 0x55c\n" " add r1, r1, r3\n" " add r0, r0, r1\n" " ldrh r0, [r0]\n" @@ -4910,7 +4910,7 @@ void DebugMenu_8078A14() " add r0, r5, #0\n" " sub r0, r0, #0x8\n" " add r0, r4, r0\n" - " ldr r1, ._508 + 8\n" + " ldr r1, ._508 + 8 @ DebugMenu_8078AA4\n" " b ._507\n" "._509:\n" " .align 2, 0\n" @@ -4926,7 +4926,7 @@ void DebugMenu_8078A14() " add r0, r5, #0\n" " sub r0, r0, #0x8\n" " add r0, r4, r0\n" - " ldr r1, ._511\n" + " ldr r1, ._511 @ DebugMenu_8078B38\n" "._507:\n" " str r1, [r0]\n" "._510:\n" @@ -4951,12 +4951,12 @@ void DebugMenu_8078AA4() " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r5, r1, #0x3\n" - " ldr r7, ._515\n" + " ldr r7, ._515 @ gTasks\n" " add r4, r5, r7\n" " add r0, r4, #2\n" " mov r2, #0xfa\n" " lsl r2, r2, #0x3\n" - " ldr r6, ._515 + 4\n" + " ldr r6, ._515 + 4 @ gMain\n" " ldrh r3, [r6, #0x30]\n" " mov r1, #0x0\n" " bl DebugMenu_8077DD8\n" @@ -4976,11 +4976,11 @@ void DebugMenu_8078AA4() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._517 @cond_branch\n" - " ldr r1, ._519\n" + " ldr r1, ._519 @ gSaveBlock2\n" " mov r2, #0x0\n" " ldsh r0, [r4, r2]\n" " lsl r0, r0, #0x1\n" - " ldr r2, ._519 + 4\n" + " ldr r2, ._519 + 4 @ 0x55c\n" " add r1, r1, r2\n" " add r0, r0, r1\n" " ldrh r1, [r4, #0x2]\n" @@ -4990,7 +4990,7 @@ void DebugMenu_8078AA4() " add r0, r7, #0\n" " sub r0, r0, #0x8\n" " add r0, r5, r0\n" - " ldr r1, ._519 + 8\n" + " ldr r1, ._519 + 8 @ DebugMenu_8078B38\n" " b ._518\n" "._520:\n" " .align 2, 0\n" @@ -5009,7 +5009,7 @@ void DebugMenu_8078AA4() " add r0, r7, #0\n" " sub r0, r0, #0x8\n" " add r0, r5, r0\n" - " ldr r1, ._522\n" + " ldr r1, ._522 @ DebugMenu_8078A14\n" "._518:\n" " str r1, [r0]\n" "._521:\n" @@ -5050,7 +5050,7 @@ u8 DebugMenu_BattleTowerStages() " push {lr}\n" " bl CloseMenu\n" " bl ScriptContext2_Enable\n" - " ldr r0, ._524\n" + " ldr r0, ._524 @ DebugMenu_80789CC\n" " mov r1, #0x50\n" " bl CreateTask\n" " mov r0, #0x1\n" @@ -5072,11 +5072,11 @@ void DebugMenu_8078B70() " add r1, r0, #0\n" " lsl r1, r1, #0x10\n" " lsr r1, r1, #0x10\n" - " ldr r0, ._526\n" + " ldr r0, ._526 @ gStringVar1\n" " mov r2, #0x0\n" " mov r3, #0x1\n" " bl ConvertIntToHexStringN\n" - " ldr r0, ._526 + 4\n" + " ldr r0, ._526 + 4 @ Str_839C438\n" " bl sub_8071F40\n" " pop {r0}\n" " bx r0\n" @@ -5095,11 +5095,11 @@ void DebugMenu_8078B94() asm( " push {r4, r5, lr}\n" " mov r3, #0x0\n" - " ldr r1, ._531\n" + " ldr r1, ._531 @ gUnknown_Debug_839C444\n" " ldrb r0, [r1]\n" " cmp r0, #0\n" " beq ._529 @cond_branch\n" - " ldr r5, ._531 + 4\n" + " ldr r5, ._531 + 4 @ gSaveBlock1\n" " add r4, r1, #0\n" "._530:\n" " lsl r0, r3, #0x3\n" @@ -5142,7 +5142,7 @@ void DebugMenu_8078BD4() " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" - " ldr r1, ._536\n" + " ldr r1, ._536 @ gTasks\n" " add r4, r0, r1\n" " mov r1, #0x0\n" " ldsh r0, [r4, r1]\n" @@ -5163,7 +5163,7 @@ void DebugMenu_8078BD4() " strh r0, [r4]\n" " b ._545\n" "._534:\n" - " ldr r2, ._541\n" + " ldr r2, ._541 @ gMain\n" " ldrh r1, [r2, #0x2e]\n" " and r0, r0, r1\n" " cmp r0, #0\n" @@ -5214,7 +5214,7 @@ u8 DebugMenu_CheckPKBLCK() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._546\n" + " ldr r0, ._546 @ DebugMenu_8078BD4\n" " mov r1, #0x50\n" " bl CreateTask\n" " bl ScriptContext2_Enable\n" @@ -5235,12 +5235,12 @@ void DebugMenu_8078C80() asm( " push {lr}\n" " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._548\n" + " ldr r0, ._548 @ Str_839C5A4\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" - " ldr r1, ._548 + 4\n" - " ldr r0, ._548 + 8\n" + " ldr r1, ._548 + 4 @ gMenuCallback\n" + " ldr r0, ._548 + 8 @ DebugMenu_8078CA8\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -5260,14 +5260,14 @@ void DebugMenu_8078CA8() { asm( " push {lr}\n" - " ldr r0, ._552\n" + " ldr r0, ._552 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._550 @cond_branch\n" - " ldr r1, ._552 + 4\n" - " ldr r0, ._552 + 8\n" + " ldr r1, ._552 + 4 @ gMenuCallback\n" + " ldr r0, ._552 + 8 @ DebugMenu_8078CE4\n" " str r0, [r1]\n" " mov r0, #0x0\n" " b ._555\n" @@ -5299,15 +5299,15 @@ void DebugMenu_8078CE4() { asm( " push {lr}\n" - " ldr r1, ._558\n" + " ldr r1, ._558 @ \n" " mov r2, #0x80\n" " lsl r2, r2, #0xa\n" " mov r0, #0x0\n" " bl DebugMenu_8078E40\n" " cmp r0, #0x1\n" " bne ._556 @cond_branch\n" - " ldr r0, ._558 + 4\n" - " ldr r1, ._558 + 8\n" + " ldr r0, ._558 + 4 @ \n" + " ldr r1, ._558 + 8 @ \n" " bl StringCopy\n" " b ._557\n" "._559:\n" @@ -5317,12 +5317,12 @@ void DebugMenu_8078CE4() " .word gStringVar4\n" " .word Str_839C5CC\n" "._556:\n" - " ldr r0, ._560\n" - " ldr r1, ._560 + 4\n" + " ldr r0, ._560 @ gStringVar4\n" + " ldr r1, ._560 + 4 @ Str_839C5DF\n" " bl StringCopy\n" "._557:\n" - " ldr r1, ._560 + 8\n" - " ldr r0, ._560 + 12\n" + " ldr r1, ._560 + 8 @ gMenuCallback\n" + " ldr r0, ._560 + 12 @ DebugMenu_8078D7C\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -5343,7 +5343,7 @@ void DebugMenu_8078D30() { asm( " push {r4, r5, r6, lr}\n" - " ldr r5, ._563\n" + " ldr r5, ._563 @ \n" " mov r4, #0x0\n" " mov r6, #0x80\n" " lsl r6, r6, #0x5\n" @@ -5358,11 +5358,11 @@ void DebugMenu_8078D30() " lsr r4, r0, #0x18\n" " cmp r4, #0x1f\n" " bls ._562 @cond_branch\n" - " ldr r0, ._563 + 4\n" - " ldr r1, ._563 + 8\n" + " ldr r0, ._563 + 4 @ \n" + " ldr r1, ._563 + 8 @ \n" " bl StringCopy\n" - " ldr r1, ._563 + 12\n" - " ldr r0, ._563 + 16\n" + " ldr r1, ._563 + 12 @ \n" + " ldr r0, ._563 + 16 @ \n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r4, r5, r6}\n" @@ -5386,12 +5386,12 @@ void DebugMenu_8078D7C() asm( " push {lr}\n" " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._565\n" + " ldr r0, ._565 @ gStringVar4\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" - " ldr r1, ._565 + 4\n" - " ldr r0, ._565 + 8\n" + " ldr r1, ._565 + 4 @ gMenuCallback\n" + " ldr r0, ._565 + 8 @ DebugMenu_8078DA4\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -5411,7 +5411,7 @@ void DebugMenu_8078DA4() { asm( " push {lr}\n" - " ldr r0, ._569\n" + " ldr r0, ._569 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -5439,12 +5439,12 @@ u8 DebugMenu_MeTooBackupMan() asm( " push {lr}\n" " bl Menu_EraseScreen\n" - " ldr r0, ._571\n" + " ldr r0, ._571 @ gUnknown_Debug_839C594\n" " mov r1, #0xc\n" " mov r2, #0x2\n" " bl DebugMenu_8077D24\n" - " ldr r1, ._571 + 4\n" - " ldr r0, ._571 + 8\n" + " ldr r1, ._571 + 4 @ gMenuCallback\n" + " ldr r0, ._571 + 8 @ DebugMenu_8078DF0\n" " str r0, [r1]\n" " mov r0, #0x0\n" " pop {r1}\n" @@ -5464,7 +5464,7 @@ void DebugMenu_8078DF0() { asm( " push {lr}\n" - " ldr r0, ._573\n" + " ldr r0, ._573 @ gUnknown_Debug_839C594\n" " bl DebugMenu_8077D78\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" @@ -5487,7 +5487,7 @@ void DebugMenu_8078E04() " add r5, r2, #0\n" " b ._575\n" "._577:\n" - " ldr r0, ._579\n" + " ldr r0, ._579 @ 0xfffff000\n" " add r5, r5, r0\n" " mov r0, #0x80\n" " lsl r0, r0, #0x5\n" @@ -5576,7 +5576,7 @@ void DebugMenu_8078E80() " mov r2, #0x16\n" " mov r3, #0x10\n" " bl Menu_BlankWindowRect\n" - " ldr r1, ._581\n" + " ldr r1, ._581 @ gUnknown_Debug_839C5F4\n" " mov r2, #0x0\n" " ldsh r0, [r4, r2]\n" " lsl r0, r0, #0x3\n" @@ -5602,7 +5602,7 @@ void DebugMenu_8078EB0() asm( " push {r4, r5, lr}\n" " add r5, r0, #0\n" - " ldr r4, ._583\n" + " ldr r4, ._583 @ gStringVar1\n" " mov r0, #0x2\n" " ldsh r1, [r5, r0]\n" " add r0, r4, #0\n" @@ -5662,11 +5662,11 @@ void DebugMenu_8078F1C() " lsl r4, r0, #0x2\n" " add r4, r4, r0\n" " lsl r4, r4, #0x3\n" - " ldr r6, ._585\n" + " ldr r6, ._585 @ gTasks\n" " add r5, r4, r6\n" " mov r0, #0x0\n" " strh r0, [r5]\n" - " ldr r1, ._585 + 4\n" + " ldr r1, ._585 + 4 @ gSaveBlock2\n" " ldrh r0, [r1, #0xe]\n" " strh r0, [r5, #0x2]\n" " ldrb r0, [r1, #0x10]\n" @@ -5680,7 +5680,7 @@ void DebugMenu_8078F1C() " bl DebugMenu_8078E80\n" " sub r6, r6, #0x8\n" " add r4, r4, r6\n" - " ldr r0, ._585 + 8\n" + " ldr r0, ._585 + 8 @ DebugMenu_8078F68\n" " str r0, [r4]\n" " pop {r4, r5, r6}\n" " pop {r0}\n" @@ -5705,15 +5705,15 @@ void DebugMenu_8078F68() " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r5, r1, #0x3\n" - " ldr r6, ._589\n" + " ldr r6, ._589 @ gTasks\n" " add r4, r5, r6\n" - " ldr r3, ._589 + 4\n" + " ldr r3, ._589 + 4 @ gMain\n" " ldrh r1, [r3, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._587 @cond_branch\n" - " ldr r1, ._589 + 8\n" + " ldr r1, ._589 + 8 @ gSaveBlock2\n" " ldrh r0, [r4, #0x2]\n" " strh r0, [r1, #0xe]\n" " ldrh r0, [r4, #0x4]\n" @@ -5738,7 +5738,7 @@ void DebugMenu_8078F68() " add r0, r6, #0\n" " sub r0, r0, #0x8\n" " add r0, r5, r0\n" - " ldr r1, ._593\n" + " ldr r1, ._593 @ DebugMenu_8079020\n" " str r1, [r0]\n" " b ._601\n" "._594:\n" @@ -5775,7 +5775,7 @@ void DebugMenu_8078F68() " mov r0, #0x0\n" " ldsh r2, [r4, r0]\n" " lsl r2, r2, #0x3\n" - " ldr r0, ._602\n" + " ldr r0, ._602 @ gUnknown_Debug_839C5F4\n" " add r2, r2, r0\n" " ldrb r0, [r2, #0x5]\n" " lsl r0, r0, #0x1\n" @@ -5825,7 +5825,7 @@ u8 DebugMenu_PTime() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._604\n" + " ldr r0, ._604 @ DebugMenu_8078F1C\n" " mov r1, #0x50\n" " bl CreateTask\n" " bl ScriptContext2_Enable\n" @@ -5847,7 +5847,7 @@ void DebugMenu_8079058() " push {r4, r5, lr}\n" " lsl r0, r0, #0x18\n" " lsr r5, r0, #0x18\n" - " ldr r1, ._610\n" + " ldr r1, ._610 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -5870,7 +5870,7 @@ void DebugMenu_8079058() " beq ._612 @cond_branch\n" " b ._620\n" "._608:\n" - " ldr r0, ._615\n" + " ldr r0, ._615 @ gUnknown_Debug_03004BD0\n" " str r1, [r0]\n" " bl Menu_DisplayDialogueFrame\n" " b ._614\n" @@ -5879,7 +5879,7 @@ void DebugMenu_8079058() "._615:\n" " .word gUnknown_Debug_03004BD0\n" "._606:\n" - " ldr r0, ._618\n" + " ldr r0, ._618 @ gDebug0x839C60C\n" " mov r1, #0x4\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" @@ -5906,7 +5906,7 @@ void DebugMenu_8079058() " beq ._620 @cond_branch\n" " cmp r1, #0\n" " bne ._621 @cond_branch\n" - " ldr r1, ._623\n" + " ldr r1, ._623 @ gUnknown_Debug_03004BD0\n" " mov r0, #0x1\n" " b ._622\n" "._624:\n" @@ -5914,7 +5914,7 @@ void DebugMenu_8079058() "._623:\n" " .word gUnknown_Debug_03004BD0\n" "._621:\n" - " ldr r1, ._625\n" + " ldr r1, ._625 @ gUnknown_Debug_03004BD0\n" " mov r0, #0x0\n" "._622:\n" " str r0, [r1]\n" @@ -5940,7 +5940,7 @@ u8 DebugMenu_OpenMurakawa() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._627\n" + " ldr r0, ._627 @ DebugMenu_8079058\n" " mov r1, #0x50\n" " bl CreateTask\n" " bl ScriptContext2_Enable\n" @@ -5962,7 +5962,7 @@ void DebugMenu_8079110() " push {r4, r5, lr}\n" " lsl r0, r0, #0x18\n" " lsr r5, r0, #0x18\n" - " ldr r1, ._633\n" + " ldr r1, ._633 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -5988,7 +5988,7 @@ void DebugMenu_8079110() " bl Menu_DisplayDialogueFrame\n" " b ._637\n" "._629:\n" - " ldr r0, ._639\n" + " ldr r0, ._639 @ Str_839C61A\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl MenuPrintMessage\n" @@ -6006,7 +6006,7 @@ void DebugMenu_8079110() " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " beq ._642 @cond_branch\n" - " ldr r0, ._643\n" + " ldr r0, ._643 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -6034,7 +6034,7 @@ u8 DebugMenu_OpenKiwa() asm( " push {lr}\n" " bl CloseMenu\n" - " ldr r0, ._645\n" + " ldr r0, ._645 @ DebugMenu_8079110\n" " mov r1, #0x50\n" " bl CreateTask\n" " bl ScriptContext2_Enable\n" diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index c656b2203..ff73e638e 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -104,7 +104,7 @@ int debug_sub_808A4D0() asm("\ push {lr}\n\ add r1, r0, #0\n\ - ldr r0, ._3\n\ + ldr r0, ._3 @ sub_8082F68\n\ cmp r1, r0\n\ bne ._1 @cond_branch\n\ mov r0, #0x1\n\ @@ -114,7 +114,7 @@ int debug_sub_808A4D0() ._3:\n\ .word sub_8082F68+1\n\ ._1:\n\ - ldr r0, ._7\n\ + ldr r0, ._7 @ sub_8082FEC\n\ cmp r1, r0\n\ bne ._5 @cond_branch\n\ mov r0, #0x11\n\ @@ -124,7 +124,7 @@ int debug_sub_808A4D0() ._7:\n\ .word sub_8082FEC+1\n\ ._5:\n\ - ldr r0, ._11\n\ + ldr r0, ._11 @ sub_808303C\n\ cmp r1, r0\n\ bne ._9 @cond_branch\n\ mov r0, #0x12\n\ @@ -134,7 +134,7 @@ int debug_sub_808A4D0() ._11:\n\ .word sub_808303C+1\n\ ._9:\n\ - ldr r0, ._15\n\ + ldr r0, ._15 @ sub_8083188\n\ cmp r1, r0\n\ bne ._13 @cond_branch\n\ mov r0, #0x13\n\ @@ -144,7 +144,7 @@ int debug_sub_808A4D0() ._15:\n\ .word sub_8083188+1\n\ ._13:\n\ - ldr r0, ._19\n\ + ldr r0, ._19 @ sub_80830E4\n\ cmp r1, r0\n\ bne ._17 @cond_branch\n\ mov r0, #0x14\n\ @@ -154,7 +154,7 @@ int debug_sub_808A4D0() ._19:\n\ .word sub_80830E4+1\n\ ._17:\n\ - ldr r0, ._23\n\ + ldr r0, ._23 @ sub_80831F8\n\ cmp r1, r0\n\ bne ._21 @cond_branch\n\ mov r0, #0x21\n\ @@ -164,7 +164,7 @@ int debug_sub_808A4D0() ._23:\n\ .word sub_80831F8+1\n\ ._21:\n\ - ldr r0, ._27\n\ + ldr r0, ._27 @ sub_8083314\n\ cmp r1, r0\n\ bne ._25 @cond_branch\n\ mov r0, #0x2\n\ @@ -174,7 +174,7 @@ int debug_sub_808A4D0() ._27:\n\ .word sub_8083314+1\n\ ._25:\n\ - ldr r0, ._31\n\ + ldr r0, ._31 @ sub_80833C4\n\ cmp r1, r0\n\ beq ._29 @cond_branch\n\ mov r0, #0x0\n\ @@ -199,7 +199,7 @@ void debug_sub_808A55C() push {r7}\n\ lsl r0, r0, #0x18\n\ lsr r7, r0, #0x18\n\ - ldr r2, ._37\n\ + ldr r2, ._37 @ gTasks\n\ lsl r0, r7, #0x2\n\ add r0, r0, r7\n\ lsl r0, r0, #0x3\n\ @@ -224,13 +224,13 @@ void debug_sub_808A55C() add r0, r0, #0x1\n\ strh r0, [r4, #0xa]\n\ ._33:\n\ - ldr r0, ._37 + 4\n\ + ldr r0, ._37 + 4 @ gShouldAdvanceLinkState\n\ ldrb r0, [r0]\n\ mov r1, #0x2\n\ mov r2, #0x0\n\ mov r3, #0x2\n\ bl PrintHex\n\ - ldr r0, ._37 + 8\n\ + ldr r0, ._37 + 8 @ gBlockSendBuffer\n\ ldrb r0, [r0]\n\ mov r1, #0x16\n\ mov r2, #0x5\n\ @@ -244,14 +244,14 @@ void debug_sub_808A55C() mov r5, #0xa0\n\ lsl r5, r5, #0x13\n\ ._35:\n\ - ldr r0, ._37 + 12\n\ + ldr r0, ._37 + 12 @ gLinkPlayerPending\n\ add r0, r4, r0\n\ ldrb r0, [r0]\n\ lsr r1, r5, #0x18\n\ mov r2, #0x0\n\ mov r3, #0x1\n\ bl PrintHex\n\ - ldr r1, ._37 + 16\n\ + ldr r1, ._37 + 16 @ gBlockRecvBuffer\n\ lsl r0, r4, #0x8\n\ add r0, r0, r1\n\ ldrh r0, [r0]\n\ @@ -268,13 +268,13 @@ void debug_sub_808A55C() add r4, r4, #0x1\n\ cmp r4, #0x3\n\ ble ._35 @cond_branch\n\ - ldr r4, ._37 + 20\n\ + ldr r4, ._37 + 20 @ gLinkStatus\n\ ldr r0, [r4]\n\ mov r1, #0xf\n\ mov r2, #0x0\n\ mov r3, #0x8\n\ bl PrintHex\n\ - ldr r0, ._37 + 24\n\ + ldr r0, ._37 + 24 @ gLink\n\ ldrb r0, [r0, #0x1]\n\ mov r1, #0x2\n\ mov r2, #0xa\n\ @@ -294,13 +294,13 @@ void debug_sub_808A55C() mov r2, #0xa\n\ mov r3, #0x2\n\ bl PrintHex\n\ - ldr r0, ._37 + 28\n\ + ldr r0, ._37 + 28 @ gReceivedRemoteLinkPlayers\n\ ldrb r0, [r0]\n\ mov r1, #0x2\n\ mov r2, #0xc\n\ mov r3, #0x1\n\ bl PrintHex\n\ - ldr r0, ._37 + 32\n\ + ldr r0, ._37 + 32 @ gSpecialVar_Result\n\ ldrh r0, [r0]\n\ mov r1, #0xb\n\ mov r2, #0x8\n\ @@ -328,7 +328,7 @@ void debug_sub_808A55C() mov r2, #0xa\n\ mov r3, #0x1\n\ bl PrintHex\n\ - ldr r2, ._37\n\ + ldr r2, ._37 @ gTasks\n\ mov r3, r8\n\ add r0, r3, r7\n\ lsl r0, r0, #0x3\n\ @@ -347,7 +347,7 @@ void debug_sub_808A55C() mov r2, #0xc\n\ mov r3, #0x2\n\ bl PrintHex\n\ - ldr r0, ._37 + 36\n\ + ldr r0, ._37 + 36 @ gLinkCallback\n\ ldr r0, [r0]\n\ mov r1, #0x2\n\ mov r2, #0xd\n\ @@ -360,7 +360,7 @@ void debug_sub_808A55C() mov r2, #0x2\n\ mov r3, #0x1\n\ bl PrintHex\n\ - ldr r0, ._37 + 40\n\ + ldr r0, ._37 + 40 @ gLinkPlayers\n\ mov r6, #0x80\n\ lsl r6, r6, #0x12\n\ add r5, r0, #0\n\ @@ -379,7 +379,7 @@ void debug_sub_808A55C() sub r4, r4, #0x1\n\ cmp r4, #0\n\ bge ._36 @cond_branch\n\ - ldr r0, ._37 + 44\n\ + ldr r0, ._37 + 44 @ 0x4000128\n\ ldrh r0, [r0]\n\ mov r1, #0x2\n\ mov r2, #0x6\n\ @@ -430,7 +430,7 @@ static void sub_8082CD4(u8 arg0, u8 arg1) mov r2, #0x1f\n\ mov r3, #0x2\n\ bl InitLinkTestBG_Unused\n\ - ldr r4, ._40\n\ + ldr r4, ._40 @ sub_8082F20\n\ add r0, r4, #0\n\ bl FindTaskIdByFunc\n\ lsl r0, r0, #0x18\n\ @@ -443,14 +443,14 @@ static void sub_8082CD4(u8 arg0, u8 arg1) add r4, r0, #0\n\ lsl r4, r4, #0x18\n\ lsr r4, r4, #0x18\n\ - ldr r5, ._40 + 4\n\ + ldr r5, ._40 + 4 @ gTasks\n\ lsl r0, r4, #0x2\n\ add r0, r0, r4\n\ lsl r0, r0, #0x3\n\ add r0, r0, r5\n\ strh r7, [r0, #0xa]\n\ strh r6, [r0, #0xc]\n\ - ldr r0, ._40 + 8\n\ + ldr r0, ._40 + 8 @ debug_sub_808A55C\n\ mov r1, #0x50\n\ bl CreateTask\n\ lsl r0, r0, #0x18\n\ @@ -1297,7 +1297,7 @@ void debug_sub_808B778() { asm("\ push {r4, lr}\n\ - ldr r4, ._390\n\ + ldr r4, ._390 @ debug_sub_808B7A8\n\ add r0, r4, #0\n\ bl FuncIsActiveTask\n\ lsl r0, r0, #0x18\n\ @@ -1307,7 +1307,7 @@ void debug_sub_808B778() mov r1, #0x50\n\ bl CreateTask\n\ ._389:\n\ - ldr r1, ._390 + 4\n\ + ldr r1, ._390 + 4 @ unk_3004E98\n\ ldr r0, [r1]\n\ add r0, r0, #0x1\n\ str r0, [r1]\n\ @@ -1328,7 +1328,7 @@ void debug_sub_808B7A8() push {lr}\n\ lsl r0, r0, #0x18\n\ lsr r0, r0, #0x18\n\ - ldr r2, ._393\n\ + ldr r2, ._393 @ gTasks\n\ lsl r1, r0, #0x2\n\ add r1, r1, r0\n\ lsl r1, r1, #0x3\n\ @@ -1342,7 +1342,7 @@ void debug_sub_808B7A8() bne ._392 @cond_branch\n\ mov r0, #0x0\n\ strh r0, [r1, #0x8]\n\ - ldr r2, ._393 + 4\n\ + ldr r2, ._393 + 4 @ unk_3004E94\n\ ldrh r0, [r2]\n\ mov r1, #0x1\n\ orr r0, r0, r1\n\ diff --git a/src/engine/link.c b/src/engine/link.c index 8888f22f5..00c084069 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -1050,7 +1050,7 @@ void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) " add r6, r1, #0\n" " add r4, r3, #0\n" " ldr r0, [sp, #0x38]\n" - " ldr r1, ._347\n" + " ldr r1, ._347 @ unk_20238D0\n" " ldr r1, [r1]\n" " cmp r1, r0\n" " bne ._345 @cond_branch\n" @@ -1059,7 +1059,7 @@ void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) " mov r4, #0x8\n" "._342:\n" " mov r3, sp\n" - " ldr r0, ._347 + 4\n" + " ldr r0, ._347 + 4 @ debugTileMap\n" " mov r8, r0\n" " lsl r2, r2, #0x6\n" " mov ip, r2\n" @@ -1087,8 +1087,8 @@ void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) " sub r3, r0, #4\n" " cmp r4, #0\n" " ble ._345 @cond_branch\n" - " ldr r7, ._347 + 8\n" - " ldr r6, ._347 + 12\n" + " ldr r7, ._347 + 8 @ debugCharacterBase\n" + " ldr r6, ._347 + 12 @ unk_20238C8\n" " add r2, r4, #0\n" "._346:\n" " ldr r1, [r7]\n" diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index 116b60477..bc14c760d 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -350,7 +350,7 @@ void debug_sub_815D04C() " push {r4, r5, r6, lr}\n" " lsl r0, r0, #0x18\n" " lsr r5, r0, #0x18\n" - " ldr r1, ._125\n" + " ldr r1, ._125 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -364,7 +364,7 @@ void debug_sub_815D04C() " mov r2, #0xd\n" " mov r3, #0x7\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r1, ._125 + 4\n" + " ldr r1, ._125 + 4 @ gUnknown_Debug_842E2D0\n" " mov r2, #0xa\n" " ldsh r0, [r4, r2]\n" " lsl r0, r0, #0x3\n" @@ -377,7 +377,7 @@ void debug_sub_815D04C() " add r0, r0, #0x1\n" " strh r0, [r4, #0x8]\n" "._121:\n" - " ldr r2, ._125 + 8\n" + " ldr r2, ._125 + 8 @ gMain\n" " ldrh r1, [r2, #0x2e]\n" " mov r0, #0x20\n" " and r0, r0, r1\n" @@ -389,7 +389,7 @@ void debug_sub_815D04C() " ldsh r0, [r4, r2]\n" " cmp r0, #0\n" " bne ._123 @cond_branch\n" - " ldr r0, ._125 + 12\n" + " ldr r0, ._125 + 12 @ gUnknown_Debug_842E350\n" " ldrb r0, [r0]\n" " sub r0, r0, #0x1\n" " b ._124\n" @@ -404,7 +404,7 @@ void debug_sub_815D04C() " sub r0, r1, #1\n" "._124:\n" " strh r0, [r4, #0xa]\n" - " ldr r0, ._130\n" + " ldr r0, ._130 @ gTasks\n" " lsl r1, r5, #0x2\n" " add r1, r1, r5\n" " lsl r1, r1, #0x3\n" @@ -417,14 +417,14 @@ void debug_sub_815D04C() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._127 @cond_branch\n" - " ldr r1, ._130\n" + " ldr r1, ._130 @ gTasks\n" " lsl r2, r5, #0x2\n" " add r0, r2, r5\n" " lsl r0, r0, #0x3\n" " add r4, r0, r1\n" " mov r0, #0xa\n" " ldsh r3, [r4, r0]\n" - " ldr r0, ._130 + 4\n" + " ldr r0, ._130 + 4 @ gUnknown_Debug_842E350\n" " ldrb r0, [r0]\n" " sub r0, r0, #0x1\n" " cmp r3, r0\n" @@ -452,7 +452,7 @@ void debug_sub_815D04C() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._132 @cond_branch\n" - " ldr r1, ._133\n" + " ldr r1, ._133 @ gTasks\n" " lsl r0, r5, #0x2\n" " add r0, r0, r5\n" " lsl r0, r0, #0x3\n" @@ -460,13 +460,13 @@ void debug_sub_815D04C() " mov r2, #0xa\n" " ldsh r1, [r0, r2]\n" " lsl r1, r1, #0x3\n" - " ldr r0, ._133 + 4\n" + " ldr r0, ._133 + 4 @ gUnknown_Debug_842E2D0\n" " add r0, r0, #0x4\n" " add r1, r1, r0\n" - " ldr r0, ._133 + 8\n" + " ldr r0, ._133 + 8 @ \n" " ldr r1, [r1]\n" " bl _call_via_r1\n" - " ldr r0, ._133 + 12\n" + " ldr r0, ._133 + 12 @ \n" " add r1, r6, r0\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" @@ -516,8 +516,8 @@ void debug_sub_815D1D8() asm( " push {r4, lr}\n" " add sp, sp, #0xfffffffc\n" - " ldr r1, ._139\n" - " ldr r2, ._139 + 4\n" + " ldr r1, ._139 @ gMain\n" + " ldr r2, ._139 + 4 @ 0x43c\n" " add r0, r1, r2\n" " ldrb r0, [r0]\n" " add r4, r1, #0\n" @@ -526,7 +526,7 @@ void debug_sub_815D1D8() " b ._196\n" "._137:\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._139 + 8\n" + " ldr r1, ._139 + 8 @ \n" " add r0, r0, r1\n" " ldr r0, [r0]\n" " mov pc, r0\n" @@ -562,8 +562,8 @@ void debug_sub_815D1D8() " mov r2, #0x10\n" " mov r3, #0x0\n" " bl BeginNormalPaletteFade\n" - " ldr r1, ._155\n" - " ldr r0, ._155 + 4\n" + " ldr r1, ._155 @ gMain\n" + " ldr r0, ._155 + 4 @ 0x43c\n" " add r1, r1, r0\n" " b ._189\n" "._156:\n" @@ -572,7 +572,7 @@ void debug_sub_815D1D8() " .word gMain\n" " .word 0x43c\n" "._143:\n" - " ldr r0, ._161\n" + " ldr r0, ._161 @ gPaletteFade\n" " ldrb r1, [r0, #0x7]\n" " mov r0, #0x80\n" " and r0, r0, r1\n" @@ -586,16 +586,16 @@ void debug_sub_815D1D8() " and r0, r0, r1\n" " cmp r0, #0\n" " beq ._159 @cond_branch\n" - " ldr r1, ._161 + 4\n" + " ldr r1, ._161 + 4 @ gUnknown_Debug_30030E0\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" " strb r0, [r1]\n" "._159:\n" - " ldr r0, ._161 + 8\n" + " ldr r0, ._161 + 8 @ Str_843DA70\n" " mov r1, #0x4\n" " mov r2, #0xf\n" " bl MenuPrintMessage\n" - " ldr r2, ._161 + 12\n" + " ldr r2, ._161 + 12 @ 0x43c\n" " add r1, r4, r2\n" " b ._189\n" "._162:\n" @@ -612,14 +612,14 @@ void debug_sub_815D1D8() " bne ._163 @cond_branch\n" " b ._196\n" "._163:\n" - " ldr r1, ._166\n" - " ldr r0, ._166 + 4\n" + " ldr r1, ._166 @ gMain\n" + " ldr r0, ._166 + 4 @ 0x43c\n" " add r1, r1, r0\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" " strb r0, [r1]\n" - " ldr r1, ._166 + 8\n" - " ldr r2, ._166 + 12\n" + " ldr r1, ._166 + 8 @ gLinkType\n" + " ldr r2, ._166 + 12 @ 0x5501\n" " add r0, r2, #0\n" " strh r0, [r1]\n" " bl OpenLink\n" @@ -632,18 +632,18 @@ void debug_sub_815D1D8() " .word gLinkType\n" " .word 0x5501\n" "._145:\n" - " ldr r0, ._171\n" + " ldr r0, ._171 @ gReceivedRemoteLinkPlayers\n" " ldrb r0, [r0]\n" " cmp r0, #0\n" " bne ._168 @cond_branch\n" " b ._196\n" "._168:\n" - " ldr r1, ._171 + 4\n" + " ldr r1, ._171 + 4 @ 0x43c\n" " add r0, r4, r1\n" " ldrb r1, [r0]\n" " add r1, r1, #0x1\n" " strb r1, [r0]\n" - " ldr r0, ._171 + 8\n" + " ldr r0, ._171 + 8 @ Str_843DA84\n" " mov r1, #0x4\n" " mov r2, #0xf\n" " bl MenuPrintMessage\n" @@ -661,11 +661,11 @@ void debug_sub_815D1D8() " bne ._173 @cond_branch\n" " b ._196\n" "._173:\n" - " ldr r0, ._176\n" + " ldr r0, ._176 @ debug_sub_815D04C\n" " mov r1, #0xa\n" " bl CreateTask\n" - " ldr r1, ._176 + 4\n" - " ldr r2, ._176 + 8\n" + " ldr r1, ._176 + 4 @ gMain\n" + " ldr r2, ._176 + 8 @ 0x43c\n" " add r1, r1, r2\n" " b ._189\n" "._177:\n" @@ -675,16 +675,16 @@ void debug_sub_815D1D8() " .word gMain\n" " .word 0x43c\n" "._148:\n" - " ldr r0, ._179\n" + " ldr r0, ._179 @ Str_843DA98\n" " mov r1, #0x4\n" " mov r2, #0xf\n" " bl MenuPrintMessage\n" - " ldr r1, ._179 + 4\n" - " ldr r2, ._179 + 8\n" + " ldr r1, ._179 + 4 @ 0x2004000\n" + " ldr r2, ._179 + 8 @ 0x2004\n" " mov r0, #0x0\n" " bl SendBlock\n" - " ldr r1, ._179 + 12\n" - " ldr r0, ._179 + 16\n" + " ldr r1, ._179 + 12 @ gMain\n" + " ldr r0, ._179 + 16 @ 0x43c\n" " add r1, r1, r0\n" " b ._189\n" "._180:\n" @@ -701,8 +701,8 @@ void debug_sub_815D1D8() " lsl r0, r0, #0x18\n" " cmp r0, #0\n" " beq ._196 @cond_branch\n" - " ldr r1, ._183\n" - " ldr r2, ._183 + 4\n" + " ldr r1, ._183 @ gMain\n" + " ldr r2, ._183 + 4 @ 0x43c\n" " add r1, r1, r2\n" " b ._189\n" "._184:\n" @@ -712,8 +712,8 @@ void debug_sub_815D1D8() " .word 0x43c\n" "._150:\n" " bl sub_800832C\n" - " ldr r1, ._186\n" - " ldr r0, ._186 + 4\n" + " ldr r1, ._186 @ gMain\n" + " ldr r0, ._186 + 4 @ 0x43c\n" " add r1, r1, r0\n" " b ._189\n" "._187:\n" @@ -722,7 +722,7 @@ void debug_sub_815D1D8() " .word gMain\n" " .word 0x43c\n" "._151:\n" - " ldr r0, ._190\n" + " ldr r0, ._190 @ gReceivedRemoteLinkPlayers\n" " ldrb r0, [r0]\n" " cmp r0, #0\n" " bne ._196 @cond_branch\n" @@ -731,12 +731,12 @@ void debug_sub_815D1D8() " mov r2, #0x1a\n" " mov r3, #0x12\n" " bl Menu_BlankWindowRect\n" - " ldr r0, ._190 + 4\n" + " ldr r0, ._190 + 4 @ Str_843DAA3\n" " mov r1, #0x4\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" - " ldr r1, ._190 + 8\n" - " ldr r2, ._190 + 12\n" + " ldr r1, ._190 + 8 @ gMain\n" + " ldr r2, ._190 + 12 @ 0x43c\n" " add r1, r1, r2\n" " b ._189\n" "._191:\n" @@ -759,7 +759,7 @@ void debug_sub_815D1D8() " mov r2, #0x0\n" " mov r3, #0x10\n" " bl BeginNormalPaletteFade\n" - " ldr r0, ._194\n" + " ldr r0, ._194 @ 0x43c\n" " add r1, r4, r0\n" "._189:\n" " ldrb r0, [r1]\n" @@ -771,13 +771,13 @@ void debug_sub_815D1D8() "._194:\n" " .word 0x43c\n" "._153:\n" - " ldr r0, ._197\n" + " ldr r0, ._197 @ gPaletteFade\n" " ldrb r1, [r0, #0x7]\n" " mov r0, #0x80\n" " and r0, r0, r1\n" " cmp r0, #0\n" " bne ._196 @cond_branch\n" - " ldr r0, ._197 + 4\n" + " ldr r0, ._197 + 4 @ CB2_InitTitleScreen\n" " bl SetMainCallback2\n" "._196:\n" " bl RunTasks\n" diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index 9324ea1c1..8b67f39a5 100644 --- a/src/engine/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c @@ -602,7 +602,7 @@ void debug_sub_806F8F8(void) { asm("\ push {lr}\n\ - ldr r0, ._131\n\ + ldr r0, ._131 @ CB2_InitResetRtcScreen\n\ bl SetMainCallback2\n\ pop {r0}\n\ bx r0\n\ @@ -622,7 +622,7 @@ void debug_sub_806F908(u8 a) lsl r0, r5, #0x2\n\ add r0, r0, r5\n\ lsl r0, r0, #0x3\n\ - ldr r2, ._136\n\ + ldr r2, ._136 @ gTasks\n\ add r4, r0, r2\n\ mov r1, #0x0\n\ ldsh r0, [r4, r1]\n\ @@ -636,7 +636,7 @@ void debug_sub_806F908(u8 a) ._136:\n\ .word gTasks+0x8\n\ ._133:\n\ - ldr r0, ._139\n\ + ldr r0, ._139 @ Task_ResetRtc_0\n\ mov r1, #0x50\n\ bl CreateTask\n\ lsl r0, r0, #0x18\n\ @@ -666,7 +666,7 @@ void debug_sub_806F908(u8 a) ldsh r0, [r2, r1]\n\ cmp r0, #0x1\n\ bne ._142 @cond_branch\n\ - ldr r3, ._143\n\ + ldr r3, ._143 @ gLocalTime\n\ mov r1, #0x0\n\ ldsh r0, [r3, r1]\n\ mov r1, #0x2\n\ @@ -700,7 +700,7 @@ void debug_sub_806F99C() asm("\ push {lr}\n\ bl RtcCalcLocalTime\n\ - ldr r0, ._145\n\ + ldr r0, ._145 @ debug_sub_806F908\n\ mov r1, #0x50\n\ bl CreateTask\n\ bl ScriptContext2_Enable\n\ @@ -717,14 +717,14 @@ void debug_sub_806F9B8() { asm("\ push {lr}\n\ - ldr r2, ._147\n\ - ldr r0, ._147 + 4\n\ + ldr r2, ._147 @ gLocalTime\n\ + ldr r0, ._147 + 4 @ gSaveBlock2\n\ add r0, r0, #0xa0\n\ ldr r1, [r0, #0x4]\n\ ldr r0, [r0]\n\ str r0, [r2]\n\ str r1, [r2, #0x4]\n\ - ldr r0, ._147 + 8\n\ + ldr r0, ._147 + 8 @ debug_sub_806F908\n\ mov r1, #0x50\n\ bl CreateTask\n\ bl ScriptContext2_Enable\n\ @@ -752,9 +752,9 @@ void debug_sub_806F9E4() lsl r0, r7, #0x2\n\ add r0, r0, r7\n\ lsl r0, r0, #0x3\n\ - ldr r1, ._153\n\ + ldr r1, ._153 @ gTasks\n\ add r5, r0, r1\n\ - ldr r6, ._153 + 4\n\ + ldr r6, ._153 + 4 @ gStringVar4\n\ mov r1, #0x0\n\ ldsh r0, [r5, r1]\n\ cmp r0, #0x1\n\ @@ -793,19 +793,19 @@ void debug_sub_806F9E4() mov r1, #0x2\n\ mov r2, #0xa\n\ bl Menu_PrintText\n\ - ldr r0, ._158\n\ + ldr r0, ._158 @ gUnknown_Debug_0839AE94\n\ mov r1, #0xc\n\ mov r2, #0xc\n\ bl Menu_PrintText\n\ - ldr r0, ._158 + 4\n\ + ldr r0, ._158 + 4 @ gUnknown_Debug_0839AE99\n\ mov r1, #0x14\n\ mov r2, #0xc\n\ bl Menu_PrintText\n\ - ldr r0, ._158 + 8\n\ + ldr r0, ._158 + 8 @ gUnknown_Debug_0839AEA7\n\ mov r1, #0x1\n\ mov r2, #0xe\n\ bl Menu_PrintText\n\ - ldr r0, ._158 + 12\n\ + ldr r0, ._158 + 12 @ gUnknown_Debug_0839AE9D\n\ mov r1, #0x1\n\ mov r2, #0x10\n\ bl Menu_PrintText\n\ @@ -833,7 +833,7 @@ void debug_sub_806F9E4() mov r0, #0x28\n\ add r0, r0, r6\n\ mov sl, r0\n\ - ldr r4, ._163\n\ + ldr r4, ._163 @ gLocalTime\n\ mov r1, #0x2\n\ ldsb r1, [r4, r1]\n\ mov r2, #0x3\n\ @@ -850,7 +850,7 @@ void debug_sub_806F9E4() mov r2, #0x1\n\ mov r3, #0x4\n\ bl ConvertIntToDecimalStringN\n\ - ldr r0, ._163 + 4\n\ + ldr r0, ._163 + 4 @ gSaveBlock2\n\ ldrb r0, [r0, #0x12]\n\ cmp r0, #0\n\ bne ._160 @cond_branch\n\ @@ -885,7 +885,7 @@ void debug_sub_806F9E4() .word gLocalTime\n\ .word gSaveBlock2\n\ ._161:\n\ - ldr r0, ._166\n\ + ldr r0, ._166 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c index 7902427e0..49cf166d4 100644 --- a/src/engine/save_failed_screen.c +++ b/src/engine/save_failed_screen.c @@ -157,12 +157,12 @@ void CB2_WipeSave() asm( " push {r4, r5, lr}\n" " mov r4, #0x0\n" - " ldr r0, ._20\n" + " ldr r0, ._20 @ gSaveFailedClockInfo\n" " mov r2, #0x1\n" " strh r2, [r0]\n" - " ldr r0, ._20 + 4\n" + " ldr r0, ._20 + 4 @ gUnknown_Debug_03004BD0\n" " ldr r0, [r0]\n" - " ldr r1, ._20 + 8\n" + " ldr r1, ._20 + 8 @ gDamagedSaveSectors\n" " cmp r0, #0\n" " beq ._12 @cond_branch\n" " str r2, [r1]\n" @@ -182,11 +182,11 @@ void CB2_WipeSave() " mov r2, #0x1c\n" " mov r3, #0x13\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._20 + 12\n" + " ldr r0, ._20 + 12 @ gSystemText_CheckCompleteSaveAttempt\n" " mov r1, #0x2\n" " mov r2, #0xb\n" " bl Menu_PrintText\n" - " ldr r0, ._20 + 16\n" + " ldr r0, ._20 + 16 @ gSaveFailedType\n" " ldrb r0, [r0]\n" " bl Save_WriteDataInternal\n" " ldr r0, [r5]\n" @@ -197,7 +197,7 @@ void CB2_WipeSave() " mov r2, #0x1c\n" " mov r3, #0x13\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._20 + 20\n" + " ldr r0, ._20 + 20 @ gSystemText_SaveFailedBackupCheck\n" " mov r1, #0x2\n" " mov r2, #0xb\n" " bl Menu_PrintText\n" @@ -218,11 +218,11 @@ void CB2_WipeSave() " mov r2, #0x1c\n" " mov r3, #0x13\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._20 + 24\n" + " ldr r0, ._20 + 24 @ gSystemText_BackupDamagedGameContinue\n" " mov r1, #0x2\n" " mov r2, #0xb\n" " bl Menu_PrintText\n" - " ldr r0, ._20 + 28\n" + " ldr r0, ._20 + 28 @ CB2_FadeAndReturnToTitleScreen\n" " bl SetMainCallback2\n" " b ._23\n" "._21:\n" @@ -242,11 +242,11 @@ void CB2_WipeSave() " mov r2, #0x1c\n" " mov r3, #0x13\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._24\n" + " ldr r0, ._24 @ gGameContinueCallback\n" " ldr r0, [r0]\n" " cmp r0, #0\n" " bne ._22 @cond_branch\n" - " ldr r0, ._24 + 4\n" + " ldr r0, ._24 + 4 @ gSystemText_SaveCompletedGameEnd\n" " mov r1, #0x2\n" " mov r2, #0xb\n" " bl Menu_PrintText\n" @@ -262,11 +262,11 @@ void CB2_WipeSave() " mov r2, #0x1c\n" " mov r3, #0x13\n" " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._27\n" + " ldr r0, ._27 @ gSystemText_BackupDamagedGameContinue\n" " mov r1, #0x2\n" " mov r2, #0xb\n" " bl Menu_PrintText\n" - " ldr r0, ._27 + 4\n" + " ldr r0, ._27 + 4 @ CB2_GameplayCannotBeContinued\n" " bl SetMainCallback2\n" " b ._26\n" "._28:\n" @@ -275,12 +275,12 @@ void CB2_WipeSave() " .word gSystemText_BackupDamagedGameContinue\n" " .word CB2_GameplayCannotBeContinued+1\n" "._22:\n" - " ldr r0, ._29\n" + " ldr r0, ._29 @ gSystemText_SaveCompletedPressA\n" " mov r1, #0x2\n" " mov r2, #0xb\n" " bl Menu_PrintText\n" "._23:\n" - " ldr r0, ._29 + 4\n" + " ldr r0, ._29 + 4 @ CB2_FadeAndReturnToTitleScreen\n" " bl SetMainCallback2\n" "._26:\n" " pop {r4, r5}\n" @@ -420,20 +420,20 @@ bool8 VerifySectorWipe(u16 sector) " push {lr}\n" " lsl r0, r0, #0x10\n" " lsr r0, r0, #0x10\n" - " ldr r2, ._50\n" + " ldr r2, ._50 @ \n" " mov r3, #0x80\n" " lsl r3, r3, #0x5\n" " mov r1, #0x0\n" " bl ReadFlash\n" " mov r0, #0x0\n" - " ldr r1, ._50 + 4\n" + " ldr r1, ._50 + 4 @ \n" "._49:\n" " add r0, r0, #0x1\n" " lsl r0, r0, #0x10\n" " lsr r0, r0, #0x10\n" " cmp r0, r1\n" " bls ._49 @cond_branch\n" - " ldr r0, ._50 + 8\n" + " ldr r0, ._50 + 8 @ \n" " ldrb r0, [r0]\n" " pop {r1}\n" " bx r1\n" diff --git a/src/field/berry.c b/src/field/berry.c index 5c1ecd699..588807755 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -1009,7 +1009,7 @@ void debug_sub_80C2B04() " bl sub_80B47D8\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" - " ldr r2, ._1\n" + " ldr r2, ._1 @ gTasks\n" " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r1, r1, #0x3\n" @@ -1038,7 +1038,7 @@ void debug_sub_80C2B30() " bl sub_80B47D8\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x18\n" - " ldr r2, ._3\n" + " ldr r2, ._3 @ gTasks\n" " lsl r1, r0, #0x2\n" " add r1, r1, r0\n" " lsl r1, r1, #0x3\n" @@ -1088,8 +1088,8 @@ void debug_sub_80C2BD0() { asm( " push {r4, r5, r6, r7, lr}\n" - " ldr r3, ._11\n" - " ldr r1, ._11 + 4\n" + " ldr r3, ._11 @ gSaveBlock1\n" + " ldr r1, ._11 + 4 @ 0x316c\n" " add r4, r3, r1\n" " ldr r6, [r4]\n" " add r1, r1, #0x4\n" @@ -1100,7 +1100,7 @@ void debug_sub_80C2BD0() " str r1, [r2]\n" " add r4, r0, #0\n" " mov r2, #0x0\n" - " ldr r5, ._11 + 8\n" + " ldr r5, ._11 + 8 @ 0x52b\n" "._10:\n" " add r0, r4, r1\n" " ldrb r0, [r0]\n" @@ -1108,7 +1108,7 @@ void debug_sub_80C2BD0() " add r1, r1, #0x1\n" " cmp r1, r5\n" " bls ._10 @cond_branch\n" - " ldr r1, ._11 + 4\n" + " ldr r1, ._11 + 4 @ 0x316c\n" " add r0, r3, r1\n" " str r6, [r0]\n" " add r1, r1, #0x4\n" @@ -1145,11 +1145,11 @@ u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) " lsl r2, r2, #0x18\n" " lsr r2, r2, #0x18\n" " mov r8, r2\n" - " ldr r4, ._16\n" - " ldr r1, ._16 + 4\n" + " ldr r4, ._16 @ gSaveBlock1\n" + " ldr r1, ._16 + 4 @ 0x3160\n" " add r0, r4, r1\n" " add r2, r0, #0\n" - " ldr r1, ._16 + 8\n" + " ldr r1, ._16 + 8 @ gBerries\n" " ldmia r1!, {r5, r6, r7}\n" " stmia r2!, {r5, r6, r7}\n" " ldmia r1!, {r5, r6, r7}\n" @@ -1158,27 +1158,27 @@ u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) " str r1, [r2]\n" " add r1, r3, #0\n" " bl StringCopy\n" - " ldr r0, ._16 + 12\n" + " ldr r0, ._16 + 12 @ 0x361c\n" " add r6, r4, r0\n" - " ldr r1, ._16 + 16\n" + " ldr r1, ._16 + 16 @ gUnknown_Debug_083F7F84\n" " add r0, r6, #0\n" " bl StringCopy\n" - " ldr r1, ._16 + 20\n" + " ldr r1, ._16 + 20 @ 0x3649\n" " add r5, r4, r1\n" - " ldr r1, ._16 + 24\n" + " ldr r1, ._16 + 24 @ gUnknown_Debug_083F7F90\n" " add r0, r5, #0\n" " bl StringCopy\n" - " ldr r2, ._16 + 28\n" + " ldr r2, ._16 + 28 @ 0x316c\n" " add r0, r4, r2\n" " str r6, [r0]\n" - " ldr r6, ._16 + 32\n" + " ldr r6, ._16 + 32 @ 0x3170\n" " add r0, r4, r6\n" " str r5, [r0]\n" " mov r2, #0x0\n" - " ldr r6, ._16 + 36\n" - " ldr r7, ._16 + 40\n" + " ldr r6, ._16 + 36 @ 0x47f\n" + " ldr r7, ._16 + 40 @ 0x317c\n" " add r5, r4, r7\n" - " ldr r3, ._16 + 44\n" + " ldr r3, ._16 + 44 @ gSpriteImage_UnusedCherry\n" "._13:\n" " add r0, r2, r5\n" " add r1, r2, r3\n" @@ -1187,9 +1187,9 @@ u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) " add r2, r2, #0x1\n" " cmp r2, r6\n" " ble ._13 @cond_branch\n" - " ldr r0, ._16\n" - " ldr r3, ._16 + 48\n" - " ldr r2, ._16 + 52\n" + " ldr r0, ._16 @ gSaveBlock1\n" + " ldr r3, ._16 + 48 @ gSpritePalette_UnusedCherry\n" + " ldr r2, ._16 + 52 @ 0x35fc\n" " add r1, r0, r2\n" " mov r2, #0xf\n" "._14:\n" @@ -1201,8 +1201,8 @@ u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) " cmp r2, #0\n" " bge ._14 @cond_branch\n" " mov r2, #0x0\n" - " ldr r5, ._16 + 56\n" - " ldr r3, ._16 + 60\n" + " ldr r5, ._16 + 56 @ gSaveBlock1\n" + " ldr r3, ._16 + 60 @ gUnknown_Debug_839B6CE\n" "._15:\n" " add r0, r2, r5\n" " add r1, r2, r3\n" @@ -1211,15 +1211,15 @@ u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) " add r2, r2, #0x1\n" " cmp r2, #0x11\n" " ble ._15 @cond_branch\n" - " ldr r5, ._16 + 64\n" + " ldr r5, ._16 + 64 @ 0x3688\n" " add r0, r4, r5\n" " mov r6, r9\n" " strb r6, [r0]\n" - " ldr r7, ._16 + 68\n" + " ldr r7, ._16 + 68 @ 0x3689\n" " add r0, r4, r7\n" " mov r1, r8\n" " strb r1, [r0]\n" - " ldr r2, ._16 + 4\n" + " ldr r2, ._16 + 4 @ 0x3160\n" " add r0, r4, r2\n" " bl debug_sub_80C2BD0\n" " add r5, r5, #0x4\n" @@ -1298,17 +1298,17 @@ void debug_sub_80C2D24() " ldr r6, [sp, #0x18]\n" " ldr r4, [sp, #0x1c]\n" " mov r8, r4\n" - " ldr r5, ._18\n" - " ldr r7, ._18 + 4\n" + " ldr r5, ._18 @ gSaveBlock1\n" + " ldr r7, ._18 + 4 @ 0x3175\n" " add r4, r5, r7\n" " strb r0, [r4]\n" - " ldr r4, ._18 + 8\n" + " ldr r4, ._18 + 8 @ 0x3176\n" " add r0, r5, r4\n" " strb r1, [r0]\n" " add r7, r7, #0x2\n" " add r0, r5, r7\n" " strb r2, [r0]\n" - " ldr r1, ._18 + 12\n" + " ldr r1, ._18 + 12 @ 0x3178\n" " add r0, r5, r1\n" " strb r3, [r0]\n" " add r4, r4, #0x3\n" @@ -1321,7 +1321,7 @@ void debug_sub_80C2D24() " sub r4, r4, #0x19\n" " add r0, r5, r4\n" " bl debug_sub_80C2BD0\n" - " ldr r7, ._18 + 16\n" + " ldr r7, ._18 + 16 @ 0x368c\n" " add r5, r5, r7\n" " str r0, [r5]\n" " pop {r3}\n" @@ -1350,21 +1350,21 @@ bool32 IsEnigmaBerryValid() { asm( " push {r4, lr}\n" - " ldr r4, ._24\n" - " ldr r1, ._24 + 4\n" + " ldr r4, ._24 @ gSaveBlock1\n" + " ldr r1, ._24 + 4 @ 0x3174\n" " add r0, r4, r1\n" " ldrb r0, [r0]\n" " cmp r0, #0\n" " beq ._22 @cond_branch\n" - " ldr r2, ._24 + 8\n" + " ldr r2, ._24 + 8 @ 0x316a\n" " add r0, r4, r2\n" " ldrb r0, [r0]\n" " cmp r0, #0\n" " beq ._22 @cond_branch\n" - " ldr r1, ._24 + 12\n" + " ldr r1, ._24 + 12 @ 0x3160\n" " add r0, r4, r1\n" " bl debug_sub_80C2BD0\n" - " ldr r2, ._24 + 16\n" + " ldr r2, ._24 + 16 @ 0x368c\n" " add r1, r4, r2\n" " ldr r1, [r1]\n" " cmp r0, r1\n" @@ -1810,7 +1810,7 @@ void DebugOpenBerryInfo() asm( " push {r4, r5, r6, r7, lr}\n" " bl GetFieldObjectScriptPointerPlayerFacing\n" - " ldr r1, ._138\n" + " ldr r1, ._138 @ S_BerryTree\n" " cmp r0, r1\n" " beq ._136 @cond_branch\n" " mov r0, #0x0\n" @@ -1820,7 +1820,7 @@ void DebugOpenBerryInfo() "._138:\n" " .word S_BerryTree\n" "._136:\n" - " ldr r0, ._141\n" + " ldr r0, ._141 @ gSelectedMapObject\n" " ldrb r0, [r0]\n" " bl FieldObjectGetBerryTreeId\n" " lsl r0, r0, #0x18\n" @@ -1829,8 +1829,8 @@ void DebugOpenBerryInfo() " bl GetBerryTreeInfo\n" " add r5, r0, #0\n" " mov r2, #0x0\n" - " ldr r7, ._141 + 4\n" - " ldr r4, ._141 + 8\n" + " ldr r7, ._141 + 4 @ 0x1f3\n" + " ldr r4, ._141 + 8 @ gStringVar4\n" " mov r3, #0xff\n" "._140:\n" " add r1, r2, r4\n" @@ -1840,46 +1840,46 @@ void DebugOpenBerryInfo() " add r2, r2, #0x1\n" " cmp r2, r7\n" " ble ._140 @cond_branch\n" - " ldr r0, ._141 + 12\n" + " ldr r0, ._141 + 12 @ gUnknown_Debug_083F7F9D\n" " add r1, r6, #0\n" " mov r2, #0x3\n" " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 16\n" + " ldr r0, ._141 + 16 @ gUnknown_Debug_083F7FA2\n" " ldrb r1, [r5]\n" " mov r2, #0x2\n" " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 20\n" + " ldr r0, ._141 + 20 @ gUnknown_Debug_083F7FA9\n" " ldrb r1, [r5, #0x1]\n" " lsl r1, r1, #0x19\n" " lsr r1, r1, #0x19\n" " mov r2, #0x2\n" " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 24\n" + " ldr r0, ._141 + 24 @ gUnknown_Debug_083F7FB0\n" " ldrh r1, [r5, #0x2]\n" " mov r2, #0x5\n" " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 28\n" + " ldr r0, ._141 + 28 @ gUnknown_Debug_083F7FB7\n" " ldrb r1, [r5, #0x4]\n" " mov r2, #0x2\n" " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 32\n" + " ldr r0, ._141 + 32 @ gUnknown_Debug_083F7FBE\n" " ldrb r1, [r5, #0x5]\n" " lsl r1, r1, #0x1c\n" " lsr r1, r1, #0x1c\n" " mov r2, #0x3\n" " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 36\n" + " ldr r0, ._141 + 36 @ gUnknown_Debug_083F7FC5\n" " ldrb r1, [r5, #0x1]\n" " lsr r1, r1, #0x7\n" " mov r2, #0x1\n" " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 40\n" + " ldr r0, ._141 + 40 @ gUnknown_Debug_083F7FCC\n" " ldrb r1, [r5, #0x5]\n" " lsl r1, r1, #0x1b\n" " lsr r1, r1, #0x1f\n" " mov r2, #0x1\n" " bl debug_sub_80C33FC\n" - " ldr r4, ._141 + 44\n" + " ldr r4, ._141 + 44 @ gUnknown_Debug_083F7FD3\n" " ldrb r1, [r5, #0x5]\n" " lsl r1, r1, #0x1a\n" " lsr r1, r1, #0x1f\n" @@ -1897,7 +1897,7 @@ void DebugOpenBerryInfo() " add r0, r4, #0\n" " mov r2, #0x1\n" " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 8\n" + " ldr r0, ._141 + 8 @ gStringVar4\n" "._137:\n" " pop {r4, r5, r6, r7}\n" " pop {r1}\n" diff --git a/src/field/choose_party.c b/src/field/choose_party.c index b2d950e35..696f7cf4f 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -536,7 +536,7 @@ void debug_sub_81381B4() " mov r7, r9\n" " mov r6, r8\n" " push {r6, r7}\n" - " ldr r4, ._189\n" + " ldr r4, ._189 @ gUnknown_02023A00\n" " add r0, r4, #0\n" " mov r1, #0x0\n" " mov r2, #0x60\n" @@ -550,7 +550,7 @@ void debug_sub_81381B4() " mov r0, #0x64\n" " add r1, r7, #0\n" " mul r1, r1, r0\n" - " ldr r0, ._189 + 4\n" + " ldr r0, ._189 + 4 @ gPlayerParty\n" " add r5, r1, r0\n" " add r0, r5, #0\n" " mov r1, #0x41\n" diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index c255d3013..13d8ebb5b 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1927,7 +1927,7 @@ void npcs_clear_ids_and_state() asm( " push {r4, r5, lr}\n" " mov r4, #0x0\n" - " ldr r5, ._2\n" + " ldr r5, ._2 @ gMapObjects\n" "._1:\n" " lsl r0, r4, #0x3\n" " add r0, r0, r4\n" @@ -1939,7 +1939,7 @@ void npcs_clear_ids_and_state() " lsr r4, r0, #0x18\n" " cmp r4, #0xf\n" " bls ._1 @cond_branch\n" - " ldr r1, ._2 + 4\n" + " ldr r1, ._2 + 4 @ gUnknown_Debug_03004BC0\n" " mov r0, #0x0\n" " strb r0, [r1]\n" " pop {r4, r5}\n" @@ -2086,7 +2086,7 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 " lsl r0, r1, #0x3\n" " add r0, r0, r1\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._40\n" + " ldr r1, ._40 @ gMapObjects\n" " add r4, r0, r1\n" " add r0, r4, #0\n" " bl npc_clear_ids_and_state\n" @@ -2154,7 +2154,7 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 " strb r0, [r4, #0x7]\n" " ldrh r0, [r5, #0xe]\n" " strb r0, [r4, #0x1d]\n" - " ldr r1, ._40 + 4\n" + " ldr r1, ._40 + 4 @ gUnknown_0836DC09\n" " ldrb r0, [r5, #0x9]\n" " add r0, r0, r1\n" " ldrb r1, [r0]\n" @@ -2166,7 +2166,7 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 " bl FieldObjectSetDirection\n" " add r0, r4, #0\n" " bl FieldObjectHandleDynamicGraphicsId\n" - " ldr r1, ._40 + 8\n" + " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n" " ldrb r0, [r4, #0x6]\n" " add r0, r0, r1\n" " ldrb r0, [r0]\n" @@ -2200,7 +2200,7 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 " orr r0, r0, r1\n" " strb r0, [r4, #0x19]\n" "._39:\n" - " ldr r1, ._40 + 12\n" + " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n" " ldrb r0, [r1]\n" " add r0, r0, #0x1\n" " strb r0, [r1]\n" @@ -2487,7 +2487,7 @@ void RemoveFieldObject(struct MapObject *mapObject) " and r1, r1, r2\n" " strb r1, [r0]\n" " bl RemoveFieldObjectInternal\n" - " ldr r1, ._72\n" + " ldr r1, ._72 @ gUnknown_Debug_03004BC0\n" " ldrb r0, [r1]\n" " sub r0, r0, #0x1\n" " strb r0, [r1]\n" @@ -2577,7 +2577,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * " lsl r4, r0, #0x3\n" " add r0, r4, r0\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._87\n" + " ldr r1, ._87 @ gMapObjects\n" " add r5, r0, r1\n" " ldrb r0, [r5, #0x5]\n" " bl GetFieldObjectGraphicsInfo\n" @@ -2612,7 +2612,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * " orr r0, r0, r1\n" " strb r0, [r5, #0x1]\n" "._90:\n" - " ldr r1, ._93\n" + " ldr r1, ._93 @ 0xffff\n" " add r0, r1, #0\n" " strh r0, [r7, #0x2]\n" " add r0, r7, #0\n" @@ -2624,11 +2624,11 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * " lsr r7, r0, #0x18\n" " cmp r7, #0x40\n" " bne ._91 @cond_branch\n" - " ldr r1, ._93 + 4\n" + " ldr r1, ._93 + 4 @ gUnknown_Debug_03004BC0\n" " ldrb r0, [r1]\n" " sub r0, r0, #0x1\n" " strb r0, [r1]\n" - " ldr r0, ._93 + 8\n" + " ldr r0, ._93 + 8 @ gMapObjects\n" " mov r2, r8\n" " add r1, r4, r2\n" " lsl r1, r1, #0x2\n" @@ -2650,7 +2650,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * " lsl r0, r7, #0x4\n" " add r0, r0, r7\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._96\n" + " ldr r1, ._96 @ gSprites\n" " add r4, r0, r1\n" " mov r1, r9\n" " lsl r0, r1, #0x10\n" @@ -3045,12 +3045,12 @@ void sub_805B710(u16 u161, u16 u162) " lsr r4, r4, #0x10\n" " lsl r5, r5, #0x10\n" " lsr r5, r5, #0x10\n" - " ldr r6, ._153\n" + " ldr r6, ._153 @ gUnknown_Debug_03004BC0\n" " mov r0, #0x0\n" " strb r0, [r6]\n" " bl ClearPlayerAvatarInfo\n" " mov r7, #0x0\n" - " ldr r0, ._153 + 4\n" + " ldr r0, ._153 + 4 @ gMapObjects\n" " mov r8, r0\n" " lsl r4, r4, #0x10\n" " lsl r5, r5, #0x10\n" diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index c382db19f..a7594372d 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -266,11 +266,11 @@ u8 TryDoMetatileBehaviorForcedMovement() { asm( " push {r4, lr}\n" - " ldr r0, ._27\n" + " ldr r0, ._27 @ gUnknown_020297ED\n" " ldrb r0, [r0]\n" " cmp r0, #0\n" " beq ._25 @cond_branch\n" - " ldr r0, ._27 + 4\n" + " ldr r0, ._27 + 4 @ gMain\n" " ldrh r1, [r0, #0x2c]\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" @@ -285,7 +285,7 @@ u8 TryDoMetatileBehaviorForcedMovement() " .word gUnknown_020297ED\n" " .word gMain\n" "._25:\n" - " ldr r4, ._29\n" + " ldr r4, ._29 @ gUnknown_0830FBA0\n" " bl GetForcedMovementByMetatileBehavior\n" " lsl r0, r0, #0x18\n" " lsr r0, r0, #0x16\n" @@ -494,7 +494,7 @@ void MovePlayerNotOnBike(u8 u81, u16 u161) " add r5, r2, #0\n" " lsl r1, r1, #0x10\n" " lsr r6, r1, #0x10\n" - " ldr r0, ._84\n" + " ldr r0, ._84 @ gUnknown_020297ED\n" " ldrb r0, [r0]\n" " cmp r0, #0\n" " beq ._82 @cond_branch\n" @@ -504,7 +504,7 @@ void MovePlayerNotOnBike(u8 u81, u16 u161) " cmp r0, #0\n" " bne ._83 @cond_branch\n" "._82:\n" - " ldr r4, ._84 + 4\n" + " ldr r4, ._84 + 4 @ gUnknown_0830FBEC\n" " add r0, r5, #0\n" " bl CheckMovementInputNotOnBike\n" " lsl r0, r0, #0x18\n" @@ -1864,7 +1864,7 @@ void debug_sub_805F2B0() " push {lr}\n" " lsl r0, r0, #0x18\n" " lsr r2, r0, #0x18\n" - " ldr r0, ._422\n" + " ldr r0, ._422 @ gMain\n" " ldrh r1, [r0, #0x2c]\n" " mov r0, #0x80\n" " lsl r0, r0, #0x1\n" @@ -1898,8 +1898,8 @@ void debug_sub_805F2DC() " lsr r4, r0, #0x18\n" " cmp r4, #0\n" " bne ._424 @cond_branch\n" - " ldr r2, ._426\n" - " ldr r0, ._426 + 4\n" + " ldr r2, ._426 @ gMapObjects\n" + " ldr r0, ._426 + 4 @ gPlayerAvatar\n" " ldrb r1, [r0, #0x5]\n" " lsl r0, r1, #0x3\n" " add r0, r0, r1\n" @@ -1915,8 +1915,8 @@ void debug_sub_805F2DC() " .word gMapObjects\n" " .word gPlayerAvatar\n" "._424:\n" - " ldr r2, ._431\n" - " ldr r0, ._431 + 4\n" + " ldr r2, ._431 @ gMapObjects\n" + " ldr r0, ._431 + 4 @ gPlayerAvatar\n" " ldrb r1, [r0, #0x5]\n" " lsl r0, r1, #0x3\n" " add r0, r0, r1\n" diff --git a/src/field/field_weather.c b/src/field/field_weather.c index c411bf20b..fbc5431ae 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -1264,14 +1264,14 @@ u8 debug_sub_8085564(void) asm("\ push {lr}\n\ mov r2, #0x0\n\ - ldr r0, ._375\n\ + ldr r0, ._375 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x80\n\ lsl r0, r0, #0x1\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._370 @cond_branch\n\ - ldr r1, ._375 + 4\n\ + ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\ ldrb r0, [r1]\n\ add r0, r0, #0x1\n\ strb r0, [r1]\n\ @@ -1283,14 +1283,14 @@ u8 debug_sub_8085564(void) ._371:\n\ mov r2, #0x1\n\ ._370:\n\ - ldr r0, ._375\n\ + ldr r0, ._375 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x80\n\ lsl r0, r0, #0x2\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._372 @cond_branch\n\ - ldr r1, ._375 + 4\n\ + ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\ ldrb r0, [r1]\n\ cmp r0, #0\n\ beq ._373 @cond_branch\n\ @@ -1314,8 +1314,8 @@ u8 debug_sub_8085564(void) mov r2, #0x1c\n\ mov r3, #0x2\n\ bl Menu_BlankWindowRect\n\ - ldr r1, ._380\n\ - ldr r0, ._380 + 4\n\ + ldr r1, ._380 @ gDebugText_Weather\n\ + ldr r0, ._380 + 4 @ gUnknown_Debug_20301FE\n\ ldrb r0, [r0]\n\ lsl r0, r0, #0x2\n\ add r0, r0, r1\n\ @@ -1324,7 +1324,7 @@ u8 debug_sub_8085564(void) mov r2, #0x1\n\ bl Menu_PrintText\n\ ._377:\n\ - ldr r0, ._380 + 8\n\ + ldr r0, ._380 + 8 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -1339,7 +1339,7 @@ u8 debug_sub_8085564(void) .word gUnknown_Debug_20301FE\n\ .word gMain\n\ ._378:\n\ - ldr r0, ._382\n\ + ldr r0, ._382 @ gUnknown_Debug_20301FE\n\ ldrb r0, [r0]\n\ bl ChangeWeather\n\ bl CloseMenu\n\ @@ -1358,8 +1358,8 @@ u8 debug_sub_808560C(void) { asm("\ push {r4, lr}\n\ - ldr r4, ._384\n\ - ldr r0, ._384 + 4\n\ + ldr r4, ._384 @ gUnknown_Debug_20301FE\n\ + ldr r0, ._384 + 4 @ gWeather\n\ mov r1, #0xda\n\ lsl r1, r1, #0x3\n\ add r0, r0, r1\n\ @@ -1371,7 +1371,7 @@ u8 debug_sub_808560C(void) mov r2, #0x1c\n\ mov r3, #0x2\n\ bl Menu_BlankWindowRect\n\ - ldr r1, ._384 + 8\n\ + ldr r1, ._384 + 8 @ gDebugText_Weather\n\ ldrb r0, [r4]\n\ lsl r0, r0, #0x2\n\ add r0, r0, r1\n\ @@ -1379,8 +1379,8 @@ u8 debug_sub_808560C(void) mov r1, #0x17\n\ mov r2, #0x1\n\ bl Menu_PrintText\n\ - ldr r1, ._384 + 12\n\ - ldr r0, ._384 + 16\n\ + ldr r1, ._384 + 12 @ gMenuCallback\n\ + ldr r0, ._384 + 16 @ debug_sub_8085564\n\ str r0, [r1]\n\ mov r0, #0x0\n\ pop {r4}\n\ diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c index 522fb01d6..5d39b87a9 100644 --- a/src/field/fldeff_cut.c +++ b/src/field/fldeff_cut.c @@ -86,7 +86,7 @@ void debug_sub_80AFEE4() " lsr r0, r0, #0x18\n" " cmp r0, #0x1\n" " bne ._1 @cond_branch\n" - " ldr r1, ._3\n" + " ldr r1, ._3 @ gLastFieldPokeMenuOpened\n" " mov r0, #0x0\n" " strb r0, [r1]\n" " bl sub_80A2634\n" @@ -96,14 +96,14 @@ void debug_sub_80AFEE4() "._3:\n" " .word gLastFieldPokeMenuOpened\n" "._1:\n" - " ldr r4, ._9\n" + " ldr r4, ._9 @ gUnknown_0203923C\n" " add r1, r4, #2\n" " add r0, r4, #0\n" " bl PlayerGetDestCoords\n" " mov r7, #0x0\n" " mov r8, r4\n" "._12:\n" - " ldr r1, ._9 + 4\n" + " ldr r1, ._9 + 4 @ 0xffff\n" " add r0, r7, r1\n" " mov r2, r8\n" " ldrh r2, [r2, #0x2]\n" @@ -112,7 +112,7 @@ void debug_sub_80AFEE4() " lsl r0, r0, #0x10\n" " asr r5, r0, #0x10\n" "._11:\n" - " ldr r1, ._9 + 4\n" + " ldr r1, ._9 + 4 @ 0xffff\n" " add r0, r6, r1\n" " mov r2, r8\n" " ldrh r2, [r2]\n" @@ -147,7 +147,7 @@ void debug_sub_80AFEE4() " cmp r0, #0x1\n" " bne ._7 @cond_branch\n" "._6:\n" - " ldr r1, ._9 + 8\n" + " ldr r1, ._9 + 8 @ gLastFieldPokeMenuOpened\n" " mov r0, #0x0\n" " strb r0, [r1]\n" " bl sub_80A25E8\n" diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c index d8f70200c..8c0f09bd9 100644 --- a/src/field/fldeff_flash.c +++ b/src/field/fldeff_flash.c @@ -77,11 +77,11 @@ void debug_sub_8122080(void) { asm("\ push {lr}\n\ - ldr r0, ._4\n\ + ldr r0, ._4 @ gMapHeader\n\ ldrb r0, [r0, #0x15]\n\ cmp r0, #0x1\n\ bne ._2 @cond_branch\n\ - ldr r0, ._4 + 4\n\ + ldr r0, ._4 + 4 @ 0x828\n\ bl FlagGet\n\ lsl r0, r0, #0x18\n\ cmp r0, #0\n\ diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c index 3f539fc6e..0e91bb55c 100644 --- a/src/field/fldeff_secretpower.c +++ b/src/field/fldeff_secretpower.c @@ -251,7 +251,7 @@ void debug_sub_80D93F4() asm("\ push {r4, lr}\n\ bl sub_80BB63C\n\ - ldr r0, ._98\n\ + ldr r0, ._98 @ gSpecialVar_Result\n\ ldrh r0, [r0]\n\ cmp r0, #0x1\n\ beq ._95 @cond_branch\n\ @@ -268,7 +268,7 @@ void debug_sub_80D93F4() ._98:\n\ .word gSpecialVar_Result\n\ ._96:\n\ - ldr r4, ._102\n\ + ldr r4, ._102 @ gUnknown_0203923C\n\ add r1, r4, #2\n\ add r0, r4, #0\n\ bl GetXYCoordsOneStepInFrontOfPlayer\n\ @@ -286,7 +286,7 @@ void debug_sub_80D93F4() cmp r0, #0x1\n\ bne ._100 @cond_branch\n\ bl sub_80C6264\n\ - ldr r1, ._102 + 4\n\ + ldr r1, ._102 + 4 @ gLastFieldPokeMenuOpened\n\ mov r0, #0x0\n\ strb r0, [r1]\n\ bl sub_80C639C\n\ @@ -304,7 +304,7 @@ void debug_sub_80D93F4() cmp r0, #0x1\n\ bne ._104 @cond_branch\n\ bl sub_80C6264\n\ - ldr r1, ._106\n\ + ldr r1, ._106 @ gLastFieldPokeMenuOpened\n\ mov r0, #0x0\n\ strb r0, [r1]\n\ bl sub_80C64A8\n\ @@ -321,7 +321,7 @@ void debug_sub_80D93F4() cmp r0, #0x1\n\ bne ._108 @cond_branch\n\ bl sub_80C6264\n\ - ldr r1, ._110\n\ + ldr r1, ._110 @ gLastFieldPokeMenuOpened\n\ mov r0, #0x0\n\ strb r0, [r1]\n\ bl sub_80C660C\n\ diff --git a/src/field/item_menu.c b/src/field/item_menu.c index cf3c7ca4b..ae1465fbd 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -400,8 +400,8 @@ static bool8 SetupBagMultistep(void) asm("\ push {r4, r5, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._5\n\ - ldr r1, ._5 + 4\n\ + ldr r0, ._5 @ gMain\n\ + ldr r1, ._5 + 4 @ 0x43c\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ cmp r0, #0x10\n\ @@ -409,7 +409,7 @@ static bool8 SetupBagMultistep(void) b ._66\n\ ._3:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._5 + 8\n\ + ldr r1, ._5 + 8 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -443,8 +443,8 @@ static bool8 SetupBagMultistep(void) b ._61\n\ ._9:\n\ bl ScanlineEffect_Stop\n\ - ldr r1, ._27\n\ - ldr r0, ._27 + 4\n\ + ldr r1, ._27 @ gMain\n\ + ldr r0, ._27 + 4 @ 0x43c\n\ add r1, r1, r0\n\ b ._62\n\ ._28:\n\ @@ -457,8 +457,8 @@ static bool8 SetupBagMultistep(void) b ._61\n\ ._11:\n\ bl ClearBGTilemapBuffers\n\ - ldr r0, ._31\n\ - ldr r1, ._31 + 4\n\ + ldr r0, ._31 @ \n\ + ldr r1, ._31 + 4 @ \n\ add r0, r0, r1\n\ mov r1, #0x0\n\ strb r1, [r0]\n\ @@ -470,13 +470,13 @@ static bool8 SetupBagMultistep(void) .word 0x1ffff\n\ ._12:\n\ bl ResetPaletteFade\n\ - ldr r2, ._34\n\ + ldr r2, ._34 @ gPaletteFade\n\ ldrb r0, [r2, #0x8]\n\ mov r1, #0x80\n\ orr r0, r0, r1\n\ strb r0, [r2, #0x8]\n\ - ldr r1, ._34 + 4\n\ - ldr r0, ._34 + 8\n\ + ldr r1, ._34 + 4 @ gMain\n\ + ldr r0, ._34 + 8 @ 0x43c\n\ add r1, r1, r0\n\ b ._62\n\ ._35:\n\ @@ -495,8 +495,8 @@ static bool8 SetupBagMultistep(void) bne ._37 @cond_branch\n\ b ._66\n\ ._37:\n\ - ldr r1, ._40\n\ - ldr r0, ._40 + 4\n\ + ldr r1, ._40 @ gMain\n\ + ldr r0, ._40 + 4 @ 0x43c\n\ add r1, r1, r0\n\ b ._62\n\ ._41:\n\ @@ -505,7 +505,7 @@ static bool8 SetupBagMultistep(void) .word gMain\n\ .word 0x43c\n\ ._15:\n\ - ldr r0, ._43\n\ + ldr r0, ._43 @ gWindowTemplate_81E6DFC\n\ bl Text_LoadWindowTemplate\n\ b ._61\n\ ._44:\n\ @@ -513,10 +513,10 @@ static bool8 SetupBagMultistep(void) ._43:\n\ .word gWindowTemplate_81E6DFC\n\ ._16:\n\ - ldr r0, ._46\n\ + ldr r0, ._46 @ gWindowTemplate_81E6DFC\n\ bl MultistepInitMenuWindowBegin\n\ - ldr r1, ._46 + 4\n\ - ldr r0, ._46 + 8\n\ + ldr r1, ._46 + 4 @ gMain\n\ + ldr r0, ._46 + 8 @ 0x43c\n\ add r1, r1, r0\n\ b ._62\n\ ._47:\n\ @@ -563,7 +563,7 @@ static bool8 SetupBagMultistep(void) mov r0, #0x3\n\ mov r1, #0x2\n\ bl SetVerticalScrollIndicatorPriority\n\ - ldr r0, ._53\n\ + ldr r0, ._53 @ sReturnLocation\n\ ldrb r0, [r0]\n\ sub r0, r0, #0x4\n\ lsl r0, r0, #0x18\n\ @@ -577,8 +577,8 @@ static bool8 SetupBagMultistep(void) mov r1, #0x1\n\ bl SetVerticalScrollIndicators\n\ ._51:\n\ - ldr r1, ._53 + 4\n\ - ldr r0, ._53 + 8\n\ + ldr r1, ._53 + 4 @ gMain\n\ + ldr r0, ._53 + 8 @ 0x43c\n\ add r1, r1, r0\n\ b ._62\n\ ._54:\n\ @@ -588,11 +588,11 @@ static bool8 SetupBagMultistep(void) .word gMain\n\ .word 0x43c\n\ ._19:\n\ - ldr r1, ._56\n\ + ldr r1, ._56 @ gUnknown_0203855A\n\ mov r0, #0x10\n\ strb r0, [r1]\n\ - ldr r4, ._56 + 4\n\ - ldr r5, ._56 + 8\n\ + ldr r4, ._56 + 4 @ gBGTilemapBuffers\n\ + ldr r5, ._56 + 8 @ sCurrentBagPocket\n\ ldrb r1, [r5]\n\ add r1, r1, #0x1\n\ lsl r1, r1, #0x18\n\ @@ -603,7 +603,7 @@ static bool8 SetupBagMultistep(void) add r0, r4, #0\n\ bl DrawPocketIndicatorDots\n\ bl UpdateAllBagPockets\n\ - ldr r4, ._56 + 12\n\ + ldr r4, ._56 + 12 @ gBagPockets\n\ ldr r0, [r4, #0x10]\n\ ldr r1, [r4, #0x14]\n\ bl SortItemSlots\n\ @@ -611,7 +611,7 @@ static bool8 SetupBagMultistep(void) ldr r1, [r4, #0x1c]\n\ bl SortItemSlots\n\ bl sub_80A3D40\n\ - ldr r1, ._56 + 16\n\ + ldr r1, ._56 + 16 @ gCurrentBagPocketItemSlots\n\ mov r0, #0x0\n\ ldsb r0, [r5, r0]\n\ lsl r0, r0, #0x3\n\ @@ -629,12 +629,12 @@ static bool8 SetupBagMultistep(void) .word gBagPockets\n\ .word gCurrentBagPocketItemSlots\n\ ._20:\n\ - ldr r0, ._59\n\ + ldr r0, ._59 @ 0xffff\n\ mov r1, #0x0\n\ mov r2, #0x7\n\ bl sub_80A48E8\n\ - ldr r1, ._59 + 4\n\ - ldr r4, ._59 + 8\n\ + ldr r1, ._59 + 4 @ gBagPocketScrollStates\n\ + ldr r4, ._59 + 8 @ sCurrentBagPocket\n\ mov r0, #0x0\n\ ldsb r0, [r4, r0]\n\ lsl r0, r0, #0x2\n\ @@ -642,7 +642,7 @@ static bool8 SetupBagMultistep(void) ldrb r1, [r0, #0x1]\n\ ldrb r0, [r0]\n\ add r1, r1, r0\n\ - ldr r0, ._59 + 12\n\ + ldr r0, ._59 + 12 @ gCurrentBagPocketItemSlots\n\ ldr r0, [r0]\n\ lsl r1, r1, #0x2\n\ add r1, r1, r0\n\ @@ -650,15 +650,15 @@ static bool8 SetupBagMultistep(void) ldsh r0, [r1, r2]\n\ bl ItemListMenu_InitDescription\n\ bl ItemListMenu_InitMenu\n\ - ldr r1, ._59 + 16\n\ + ldr r1, ._59 + 16 @ gUnknown_0203855B\n\ ldrb r0, [r4]\n\ add r0, r0, #0x1\n\ strb r0, [r1]\n\ - ldr r1, ._59 + 20\n\ + ldr r1, ._59 + 20 @ gUnknown_0203855C\n\ mov r0, #0x0\n\ strb r0, [r1]\n\ - ldr r1, ._59 + 24\n\ - ldr r0, ._59 + 28\n\ + ldr r1, ._59 + 24 @ gMain\n\ + ldr r0, ._59 + 28 @ 0x43c\n\ add r1, r1, r0\n\ b ._62\n\ ._60:\n\ @@ -679,17 +679,17 @@ static bool8 SetupBagMultistep(void) bl sub_80A3740\n\ b ._61\n\ ._22:\n\ - ldr r3, ._63\n\ + ldr r3, ._63 @ 0x4000208\n\ ldrh r2, [r3]\n\ mov r0, #0x0\n\ strh r0, [r3]\n\ - ldr r4, ._63 + 4\n\ + ldr r4, ._63 + 4 @ 0x4000200\n\ ldrh r0, [r4]\n\ mov r1, #0x1\n\ orr r0, r0, r1\n\ strh r0, [r4]\n\ strh r2, [r3]\n\ - ldr r2, ._63 + 8\n\ + ldr r2, ._63 + 8 @ 0x4000004\n\ ldrh r0, [r2]\n\ mov r1, #0x8\n\ orr r0, r0, r1\n\ @@ -701,13 +701,13 @@ static bool8 SetupBagMultistep(void) mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r2, ._63 + 12\n\ + ldr r2, ._63 + 12 @ gPaletteFade\n\ ldrb r1, [r2, #0x8]\n\ mov r0, #0x7f\n\ and r0, r0, r1\n\ strb r0, [r2, #0x8]\n\ - ldr r1, ._63 + 16\n\ - ldr r0, ._63 + 20\n\ + ldr r1, ._63 + 16 @ gMain\n\ + ldr r0, ._63 + 20 @ 0x43c\n\ add r1, r1, r0\n\ b ._62\n\ ._64:\n\ @@ -724,8 +724,8 @@ static bool8 SetupBagMultistep(void) cmp r0, #0x1\n\ beq ._66 @cond_branch\n\ ._61:\n\ - ldr r1, ._67\n\ - ldr r2, ._67 + 4\n\ + ldr r1, ._67 @ gMain\n\ + ldr r2, ._67 + 4 @ 0x43c\n\ add r1, r1, r2\n\ ._62:\n\ ldrb r0, [r1]\n\ @@ -738,23 +738,23 @@ static bool8 SetupBagMultistep(void) .word gMain\n\ .word 0x43c\n\ ._24:\n\ - ldr r0, ._71\n\ + ldr r0, ._71 @ sub_80A3134\n\ bl SetVBlankCallback\n\ - ldr r0, ._71 + 4\n\ + ldr r0, ._71 + 4 @ sub_80A3118\n\ bl SetMainCallback2\n\ bl sub_80A751C\n\ bl sub_80A7630\n\ bl sub_80A770C\n\ bl sub_80A7828\n\ bl sub_80A78B8\n\ - ldr r0, ._71 + 8\n\ + ldr r0, ._71 + 8 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._69 @cond_branch\n\ - ldr r0, ._71 + 12\n\ + ldr r0, ._71 + 12 @ 0x600f5e0\n\ mov r1, #0x80\n\ lsl r1, r1, #0x8\n\ - ldr r2, ._71 + 16\n\ + ldr r2, ._71 + 16 @ 0x600f800\n\ mov r3, #0x0\n\ bl debug_sub_8008218\n\ ._69:\n\ @@ -1036,7 +1036,7 @@ void debug_sub_80A3714() push {r4, r5, r6, lr}\n\ add sp, sp, #0xfffffff4\n\ mov r5, #0x0\n\ - ldr r2, ._138\n\ + ldr r2, ._138 @ gUnknown_Debug_083EBC68\n\ mov r1, #0x0\n\ ._134:\n\ lsl r0, r5, #0x1\n\ @@ -1059,10 +1059,10 @@ void debug_sub_80A3714() bl ItemId_GetPocket\n\ lsl r0, r0, #0x18\n\ lsr r0, r0, #0x8\n\ - ldr r1, ._138 + 4\n\ + ldr r1, ._138 + 4 @ 0xffff0000\n\ add r0, r0, r1\n\ lsr r0, r0, #0x10\n\ - ldr r1, ._138 + 8\n\ + ldr r1, ._138 + 8 @ gBagPockets\n\ lsl r2, r0, #0x3\n\ add r2, r2, r1\n\ lsl r0, r0, #0x1\n\ @@ -4050,12 +4050,12 @@ static void sub_80A740C(void) bl sub_80A75E4\n\ bl sub_80A7768\n\ bl sub_80A7420\n\ - ldr r0, ._931\n\ + ldr r0, ._931 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._930 @cond_branch\n\ - ldr r0, ._931 + 4\n\ - ldr r1, ._931 + 8\n\ + ldr r0, ._931 + 4 @ gLink\n\ + ldr r1, ._931 + 8 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x0\n\ diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index e41ea1628..b42c50513 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -262,7 +262,7 @@ void debug_sub_810B32C() " cmp r0, #0x4\n" " bhi ._37 @cond_branch\n" " lsl r0, r0, #0x2\n" - " ldr r1, ._23\n" + " ldr r1, ._23 @ \n" " add r0, r0, r1\n" " ldr r0, [r0]\n" " mov pc, r0\n" @@ -281,7 +281,7 @@ void debug_sub_810B32C() " b ._37\n" "._26:\n" " mov r2, #0x0\n" - " ldr r3, ._34\n" + " ldr r3, ._34 @ gSaveBlock1\n" "._31:\n" " mov r0, sp\n" " add r1, r0, r2\n" @@ -295,7 +295,7 @@ void debug_sub_810B32C() " bls ._31 @cond_branch\n" " bl SetupHipster\n" " mov r2, #0x0\n" - " ldr r3, ._34\n" + " ldr r3, ._34 @ gSaveBlock1\n" "._32:\n" " add r1, r2, r3\n" " mov r4, sp\n" diff --git a/src/field/party_menu.c b/src/field/party_menu.c index 4108145c1..66e7e2319 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -502,12 +502,12 @@ void CB2_PartyMenuMain(void) add sp, sp, #0xfffffffc\n\ bl AnimateSprites\n\ bl BuildOamBuffer\n\ - ldr r0, ._3\n\ + ldr r0, ._3 @ gPartyMenuType\n\ ldrb r1, [r0]\n\ lsl r0, r1, #0x1\n\ add r0, r0, r1\n\ lsl r0, r0, #0x4\n\ - ldr r1, ._3 + 4\n\ + ldr r1, ._3 + 4 @ PartyMonTextSettings\n\ add r5, r0, r1\n\ mov r6, #0x0\n\ ._1:\n\ @@ -529,12 +529,12 @@ void CB2_PartyMenuMain(void) ble ._1 @cond_branch\n\ bl RunTasks\n\ bl UpdatePaletteFade\n\ - ldr r0, ._3 + 8\n\ + ldr r0, ._3 + 8 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._2 @cond_branch\n\ - ldr r0, ._3 + 12\n\ - ldr r1, ._3 + 16\n\ + ldr r0, ._3 + 12 @ gLink\n\ + ldr r1, ._3 + 16 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x2\n\ @@ -696,8 +696,8 @@ bool8 InitPartyMenu(void) mov r7, r8\n\ push {r7}\n\ add sp, sp, #0xfffffff4\n\ - ldr r0, ._55\n\ - ldr r1, ._55 + 4\n\ + ldr r0, ._55 @ gMain\n\ + ldr r1, ._55 + 4 @ 0x43c\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ cmp r0, #0x11\n\ @@ -705,7 +705,7 @@ bool8 InitPartyMenu(void) b ._125\n\ ._53:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._55 + 8\n\ + ldr r1, ._55 + 8 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -745,10 +745,10 @@ bool8 InitPartyMenu(void) mov r8, r2\n\ add r2, sp, #0x4\n\ mov r6, #0x0\n\ - ldr r1, ._78\n\ + ldr r1, ._78 @ 0x40000d4\n\ mov r5, #0x80\n\ lsl r5, r5, #0x5\n\ - ldr r7, ._78 + 4\n\ + ldr r7, ._78 + 4 @ 0x81000800\n\ mov r0, #0x81\n\ lsl r0, r0, #0x18\n\ mov ip, r0\n\ @@ -778,7 +778,7 @@ bool8 InitPartyMenu(void) lsl r3, r3, #0x3\n\ mov r4, #0x0\n\ str r4, [sp, #0x8]\n\ - ldr r2, ._78\n\ + ldr r2, ._78 @ 0x40000d4\n\ mov r1, r8\n\ str r1, [r2]\n\ str r0, [r2, #0x4]\n\ @@ -800,13 +800,13 @@ bool8 InitPartyMenu(void) orr r3, r3, r0\n\ str r3, [r2, #0x8]\n\ ldr r0, [r2, #0x8]\n\ - ldr r2, ._78 + 8\n\ + ldr r2, ._78 + 8 @ gPaletteFade\n\ ldrb r0, [r2, #0x8]\n\ mov r1, #0x80\n\ orr r0, r0, r1\n\ strb r0, [r2, #0x8]\n\ - ldr r1, ._78 + 12\n\ - ldr r2, ._78 + 16\n\ + ldr r1, ._78 + 12 @ gMain\n\ + ldr r2, ._78 + 16 @ 0x43c\n\ add r1, r1, r2\n\ b ._122\n\ ._79:\n\ @@ -822,21 +822,21 @@ bool8 InitPartyMenu(void) b ._115\n\ ._60:\n\ bl sub_806B4A8\n\ - ldr r1, ._82\n\ + ldr r1, ._82 @ \n\ mov r2, #0x99\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ mov r2, #0x0\n\ strh r2, [r0]\n\ - ldr r3, ._82 + 4\n\ + ldr r3, ._82 + 4 @ \n\ add r0, r1, r3\n\ strh r2, [r0]\n\ mov r0, #0x9a\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ strh r2, [r1]\n\ - ldr r1, ._82 + 8\n\ - ldr r2, ._82 + 12\n\ + ldr r1, ._82 + 8 @ \n\ + ldr r2, ._82 + 12 @ \n\ add r1, r1, r2\n\ b ._122\n\ ._83:\n\ @@ -850,7 +850,7 @@ bool8 InitPartyMenu(void) bl ResetSpriteData\n\ b ._115\n\ ._62:\n\ - ldr r0, ._88\n\ + ldr r0, ._88 @ \n\ mov r1, #0x96\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -861,8 +861,8 @@ bool8 InitPartyMenu(void) beq ._86 @cond_branch\n\ bl ResetTasks\n\ ._86:\n\ - ldr r1, ._88 + 4\n\ - ldr r2, ._88 + 8\n\ + ldr r1, ._88 + 4 @ \n\ + ldr r2, ._88 + 8 @ \n\ add r1, r1, r2\n\ b ._122\n\ ._89:\n\ @@ -875,7 +875,7 @@ bool8 InitPartyMenu(void) bl FreeAllSpritePalettes\n\ b ._115\n\ ._64:\n\ - ldr r4, ._92\n\ + ldr r4, ._92 @ \n\ mov r1, #0x97\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -892,10 +892,10 @@ bool8 InitPartyMenu(void) ._92:\n\ .word +0x201b000\n\ ._65:\n\ - ldr r0, ._95\n\ + ldr r0, ._95 @ gWindowTemplate_81E6C90\n\ bl Text_LoadWindowTemplate\n\ - ldr r1, ._95 + 4\n\ - ldr r0, ._95 + 8\n\ + ldr r1, ._95 + 4 @ gMain\n\ + ldr r0, ._95 + 8 @ 0x43c\n\ add r1, r1, r0\n\ b ._122\n\ ._96:\n\ @@ -905,15 +905,15 @@ bool8 InitPartyMenu(void) .word gMain\n\ .word 0x43c\n\ ._66:\n\ - ldr r4, ._98\n\ - ldr r1, ._98 + 4\n\ + ldr r4, ._98 @ gUnknown_03004210\n\ + ldr r1, ._98 + 4 @ gWindowTemplate_81E6C90\n\ add r0, r4, #0\n\ bl Text_InitWindowWithTemplate\n\ add r0, r4, #0\n\ mov r1, #0x1\n\ bl MultistepInitWindowTileData\n\ - ldr r1, ._98 + 8\n\ - ldr r2, ._98 + 12\n\ + ldr r1, ._98 + 8 @ gMain\n\ + ldr r2, ._98 + 12 @ 0x43c\n\ add r1, r1, r2\n\ b ._122\n\ ._99:\n\ @@ -929,14 +929,14 @@ bool8 InitPartyMenu(void) bne ._100 @cond_branch\n\ b ._125\n\ ._100:\n\ - ldr r0, ._103\n\ + ldr r0, ._103 @ \n\ mov r3, #0x99\n\ lsl r3, r3, #0x2\n\ add r0, r0, r3\n\ mov r1, #0x1\n\ strh r1, [r0]\n\ - ldr r1, ._103 + 4\n\ - ldr r0, ._103 + 8\n\ + ldr r1, ._103 + 4 @ \n\ + ldr r0, ._103 + 8 @ \n\ add r1, r1, r0\n\ b ._122\n\ ._104:\n\ @@ -946,7 +946,7 @@ bool8 InitPartyMenu(void) .word gMain\n\ .word 0x43c\n\ ._68:\n\ - ldr r0, ._107\n\ + ldr r0, ._107 @ \n\ mov r1, #0x99\n\ lsl r1, r1, #0x2\n\ add r4, r0, r1\n\ @@ -958,8 +958,8 @@ bool8 InitPartyMenu(void) bne ._105 @cond_branch\n\ mov r0, #0x0\n\ strh r0, [r4]\n\ - ldr r1, ._107 + 4\n\ - ldr r2, ._107 + 8\n\ + ldr r1, ._107 + 4 @ \n\ + ldr r2, ._107 + 8 @ \n\ add r1, r1, r2\n\ b ._122\n\ ._108:\n\ @@ -977,8 +977,8 @@ bool8 InitPartyMenu(void) bl sub_809D51C\n\ b ._115\n\ ._70:\n\ - ldr r2, ._113\n\ - ldr r0, ._113 + 4\n\ + ldr r2, ._113 @ PartyMenuHandlers\n\ + ldr r0, ._113 + 4 @ \n\ mov r1, #0x96\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -994,8 +994,8 @@ bool8 InitPartyMenu(void) lsr r0, r0, #0x18\n\ cmp r0, #0x1\n\ bne ._125 @cond_branch\n\ - ldr r1, ._113 + 8\n\ - ldr r2, ._113 + 12\n\ + ldr r1, ._113 + 8 @ \n\ + ldr r2, ._113 + 12 @ \n\ add r1, r1, r2\n\ b ._122\n\ ._114:\n\ @@ -1006,7 +1006,7 @@ bool8 InitPartyMenu(void) .word gMain\n\ .word 0x43c\n\ ._71:\n\ - ldr r0, ._116\n\ + ldr r0, ._116 @ gWindowTemplate_81E6CC8\n\ bl MultistepInitMenuWindowBegin\n\ b ._115\n\ ._117:\n\ @@ -1017,8 +1017,8 @@ bool8 InitPartyMenu(void) bl MultistepInitMenuWindowContinue\n\ cmp r0, #0\n\ beq ._125 @cond_branch\n\ - ldr r1, ._120\n\ - ldr r0, ._120 + 4\n\ + ldr r1, ._120 @ gMain\n\ + ldr r0, ._120 + 4 @ 0x43c\n\ add r1, r1, r0\n\ b ._122\n\ ._121:\n\ @@ -1027,14 +1027,14 @@ bool8 InitPartyMenu(void) .word gMain\n\ .word 0x43c\n\ ._73:\n\ - ldr r0, ._123\n\ - ldr r1, ._123 + 4\n\ + ldr r0, ._123 @ \n\ + ldr r1, ._123 + 4 @ \n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x0\n\ bl PrintPartyMenuPromptText\n\ - ldr r1, ._123 + 8\n\ - ldr r2, ._123 + 12\n\ + ldr r1, ._123 + 8 @ \n\ + ldr r2, ._123 + 12 @ \n\ add r1, r1, r2\n\ b ._122\n\ ._124:\n\ @@ -1052,14 +1052,14 @@ bool8 InitPartyMenu(void) mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r2, ._126\n\ + ldr r2, ._126 @ gPaletteFade\n\ ldrb r1, [r2, #0x8]\n\ mov r0, #0x7f\n\ and r0, r0, r1\n\ strb r0, [r2, #0x8]\n\ ._115:\n\ - ldr r1, ._126 + 4\n\ - ldr r3, ._126 + 8\n\ + ldr r1, ._126 + 4 @ gMain\n\ + ldr r3, ._126 + 8 @ 0x43c\n\ add r1, r1, r3\n\ ._122:\n\ ldrb r0, [r1]\n\ @@ -1073,16 +1073,16 @@ bool8 InitPartyMenu(void) .word gMain\n\ .word 0x43c\n\ ._75:\n\ - ldr r0, ._130\n\ + ldr r0, ._130 @ VBlankCB_PartyMenu\n\ bl SetVBlankCallback\n\ - ldr r0, ._130 + 4\n\ + ldr r0, ._130 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._128 @cond_branch\n\ - ldr r0, ._130 + 8\n\ + ldr r0, ._130 + 8 @ 0x600e5e0\n\ mov r1, #0x80\n\ lsl r1, r1, #0x8\n\ - ldr r2, ._130 + 12\n\ + ldr r2, ._130 + 12 @ 0x6007800\n\ mov r3, #0x2\n\ bl debug_sub_8008218\n\ ._128:\n\ diff --git a/src/field/secret_base.c b/src/field/secret_base.c index 01e9711dc..8b67a2cd9 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -1658,7 +1658,7 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) add r5, r1, #0\n\ lsl r2, r2, #0x18\n\ lsr r7, r2, #0x18\n\ - ldr r0, ._503\n\ + ldr r0, ._503 @ gUnknown_020297ED\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ bne ._498 @cond_branch\n\ @@ -1747,10 +1747,10 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) bl sub_80BD610\n\ ._515:\n\ mov r3, #0x1\n\ - ldr r6, ._521\n\ + ldr r6, ._521 @ gSaveBlock1\n\ mov r5, #0x10\n\ neg r5, r5\n\ - ldr r4, ._521 + 4\n\ + ldr r4, ._521 + 4 @ 0x1a09\n\ ._517:\n\ lsl r0, r3, #0x2\n\ add r0, r0, r3\n\ @@ -1776,8 +1776,8 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) bls ._517 @cond_branch\n\ bl sub_80BD280\n\ mov r3, #0x1\n\ - ldr r4, ._521\n\ - ldr r6, ._521 + 4\n\ + ldr r4, ._521 @ gSaveBlock1\n\ + ldr r6, ._521 + 4 @ 0x1a09\n\ add r7, r4, #0\n\ mov r5, #0x3f\n\ ._519:\n\ @@ -1799,10 +1799,10 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) lsr r3, r0, #0x10\n\ cmp r3, #0x13\n\ bls ._519 @cond_branch\n\ - ldr r0, ._521 + 8\n\ + ldr r0, ._521 + 8 @ 0x1a16\n\ add r2, r7, r0\n\ ldrh r1, [r2]\n\ - ldr r0, ._521 + 12\n\ + ldr r0, ._521 + 12 @ 0xffff\n\ cmp r1, r0\n\ beq ._520 @cond_branch\n\ add r0, r1, #1\n\ diff --git a/src/field/shop.c b/src/field/shop.c index 852ccddda..fdee31178 100644 --- a/src/field/shop.c +++ b/src/field/shop.c @@ -1247,7 +1247,7 @@ void debug_sub_80C2818(void) push {lr}\n\ mov r0, #0x0\n\ bl CreateShopMenu\n\ - ldr r0, ._290\n\ + ldr r0, ._290 @ gMartBuyNoSellOptionList\n\ bl SetShopItemsForSale\n\ mov r0, #0x0\n\ bl SetShopMenuCallback\n\ diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 0d4ebe3f0..2c97c146d 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -402,7 +402,7 @@ static void SlotMachineSetup_0_1(void) mov r5, r8\n\ push {r5, r6, r7}\n\ bl sub_81019EC\n\ - ldr r5, ._43\n\ + ldr r5, ._43 @ \n\ mov r4, #0x0\n\ strb r4, [r5]\n\ strb r4, [r5, #0x2]\n\ @@ -415,8 +415,8 @@ static void SlotMachineSetup_0_1(void) strh r4, [r5, #0x8]\n\ strb r0, [r5, #0xa]\n\ strb r0, [r5, #0xb]\n\ - ldr r0, ._43 + 4\n\ - ldr r1, ._43 + 8\n\ + ldr r0, ._43 + 4 @ \n\ + ldr r1, ._43 + 8 @ \n\ add r0, r0, r1\n\ ldrh r0, [r0]\n\ strh r0, [r5, #0xc]\n\ @@ -445,7 +445,7 @@ static void SlotMachineSetup_0_1(void) strh r0, [r1]\n\ mov r7, #0x0\n\ add r6, r5, #0\n\ - ldr r2, ._43 + 12\n\ + ldr r2, ._43 + 12 @ \n\ mov sl, r2\n\ mov r0, #0x1c\n\ add r0, r0, r6\n\ @@ -493,7 +493,7 @@ static void SlotMachineSetup_0_1(void) cmp r7, #0x2\n\ bls ._41 @cond_branch\n\ bl debug_sub_811B5D0\n\ - ldr r0, ._43 + 16\n\ + ldr r0, ._43 + 16 @ \n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._42 @cond_branch\n\ @@ -690,21 +690,21 @@ static bool8 sub_8101E10(struct Task *task) push {lr}\n\ mov r0, #0x0\n\ bl sub_8104CAC\n\ - ldr r2, ._70\n\ + ldr r2, ._70 @ \n\ mov r0, #0x5\n\ strb r0, [r2]\n\ - ldr r0, ._70 + 4\n\ + ldr r0, ._70 + 4 @ \n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._67 @cond_branch\n\ - ldr r0, ._70 + 8\n\ + ldr r0, ._70 + 8 @ \n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ bne ._69 @cond_branch\n\ ._67:\n\ mov r0, #0xc\n\ ldsh r1, [r2, r0]\n\ - ldr r0, ._70 + 12\n\ + ldr r0, ._70 + 12 @ \n\ cmp r1, r0\n\ ble ._69 @cond_branch\n\ mov r0, #0x17\n\ @@ -740,17 +740,17 @@ static bool8 sub_8101E3C(struct Task *task) { asm("\ push {r4, r5, lr}\n\ - ldr r0, ._77\n\ + ldr r0, ._77 @ unk_debug_bss_1_1\n\ ldrb r1, [r0]\n\ add r3, r0, #0\n\ - ldr r5, ._77 + 4\n\ + ldr r5, ._77 + 4 @ gMain\n\ cmp r1, #0\n\ beq ._76 @cond_branch\n\ - ldr r2, ._77 + 8\n\ + ldr r2, ._77 + 8 @ unk_debug_bss_1_4\n\ ldrb r0, [r2]\n\ cmp r0, #0\n\ beq ._76 @cond_branch\n\ - ldr r4, ._77 + 12\n\ + ldr r4, ._77 + 12 @ \n\ mov r1, #0xc\n\ ldsh r0, [r4, r1]\n\ cmp r0, #0x3\n\ @@ -796,7 +796,7 @@ static bool8 sub_8101E3C(struct Task *task) cmp r0, #0\n\ beq ._81 @cond_branch\n\ bl debug_sub_811B620\n\ - ldr r1, ._83\n\ + ldr r1, ._83 @ \n\ mov r0, #0x1d\n\ strb r0, [r1]\n\ b ._102\n\ @@ -812,7 +812,7 @@ static bool8 sub_8101E3C(struct Task *task) beq ._85 @cond_branch\n\ mov r0, #0x0\n\ bl sub_8104AB8\n\ - ldr r1, ._87\n\ + ldr r1, ._87 @ \n\ mov r0, #0x8\n\ strb r0, [r1]\n\ b ._102\n\ @@ -826,7 +826,7 @@ static bool8 sub_8101E3C(struct Task *task) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._89 @cond_branch\n\ - ldr r2, ._94\n\ + ldr r2, ._94 @ \n\ mov r3, #0xc\n\ ldsh r0, [r2, r3]\n\ sub r0, r0, #0x3\n\ @@ -852,7 +852,7 @@ static bool8 sub_8101E3C(struct Task *task) cmp r0, #0x2\n\ ble ._92 @cond_branch\n\ ._91:\n\ - ldr r1, ._94\n\ + ldr r1, ._94 @ \n\ ldrh r0, [r1, #0xc]\n\ sub r0, r0, #0x3\n\ ldrh r3, [r1, #0x12]\n\ @@ -877,7 +877,7 @@ static bool8 sub_8101E3C(struct Task *task) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._98 @cond_branch\n\ - ldr r4, ._103\n\ + ldr r4, ._103 @ \n\ mov r1, #0xc\n\ ldsh r0, [r4, r1]\n\ cmp r0, #0\n\ @@ -893,11 +893,11 @@ static bool8 sub_8101E3C(struct Task *task) add r0, r0, #0x1\n\ strh r0, [r4, #0x12]\n\ ._98:\n\ - ldr r0, ._103\n\ + ldr r0, ._103 @ \n\ mov r2, #0x12\n\ ldsh r1, [r0, r2]\n\ add r2, r0, #0\n\ - ldr r5, ._103 + 4\n\ + ldr r5, ._103 + 4 @ \n\ cmp r1, #0x2\n\ bgt ._99 @cond_branch\n\ cmp r1, #0\n\ @@ -1029,7 +1029,7 @@ static bool8 sub_8101FA4(struct Task *task) bl sub_8102DEC\n\ mov r0, #0x0\n\ strh r0, [r4, #0x8]\n\ - ldr r4, ._115\n\ + ldr r4, ._115 @ \n\ ldrb r1, [r4, #0x4]\n\ mov r0, #0x20\n\ and r0, r0, r1\n\ @@ -1048,7 +1048,7 @@ static bool8 sub_8101FA4(struct Task *task) mov r0, #0xb\n\ ._114:\n\ strb r0, [r4]\n\ - ldr r4, ._119\n\ + ldr r4, ._119 @ \n\ mov r0, #0x8\n\ strh r0, [r4, #0x1a]\n\ ldrb r0, [r4, #0xa]\n\ @@ -1057,7 +1057,7 @@ static bool8 sub_8101FA4(struct Task *task) bl dp15_jump_random_unknown\n\ strh r0, [r4, #0x1a]\n\ ._117:\n\ - ldr r0, ._119 + 4\n\ + ldr r0, ._119 + 4 @ \n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._118 @cond_branch\n\ @@ -1128,15 +1128,15 @@ static bool8 sub_8102034(struct Task *task) asr r1, r1, #0x10\n\ cmp r1, #0x1d\n\ ble ._124 @cond_branch\n\ - ldr r0, ._127\n\ + ldr r0, ._127 @ unk_debug_bss_1_1\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._126 @cond_branch\n\ - ldr r0, ._127 + 4\n\ + ldr r0, ._127 + 4 @ unk_debug_bss_1_4\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._126 @cond_branch\n\ - ldr r4, ._127 + 8\n\ + ldr r4, ._127 + 8 @ unk_debug_bss_1_8\n\ bl Random\n\ mov r1, #0x1f\n\ and r1, r1, r0\n\ @@ -1144,7 +1144,7 @@ static bool8 sub_8102034(struct Task *task) str r1, [r4]\n\ ._126:\n\ bl sub_81024F0\n\ - ldr r1, ._127 + 12\n\ + ldr r1, ._127 + 12 @ \n\ mov r0, #0xc\n\ strb r0, [r1]\n\ ._124:\n\ @@ -1178,15 +1178,15 @@ static bool8 sub_8102058(struct Task *task) { asm("\ push {r4, r5, lr}\n\ - ldr r0, ._133\n\ + ldr r0, ._133 @ unk_debug_bss_1_1\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._130 @cond_branch\n\ - ldr r0, ._133 + 4\n\ + ldr r0, ._133 + 4 @ unk_debug_bss_1_4\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._130 @cond_branch\n\ - ldr r5, ._133 + 8\n\ + ldr r5, ._133 + 8 @ unk_debug_bss_1_8\n\ ldr r0, [r5]\n\ sub r0, r0, #0x1\n\ str r0, [r5]\n\ @@ -1194,7 +1194,7 @@ static bool8 sub_8102058(struct Task *task) bne ._135 @cond_branch\n\ mov r0, #0x18\n\ bl PlaySE\n\ - ldr r4, ._133 + 12\n\ + ldr r4, ._133 + 12 @ \n\ ldrb r0, [r4, #0x18]\n\ bl sub_8102E1C\n\ ldrb r0, [r4, #0x18]\n\ @@ -1213,7 +1213,7 @@ static bool8 sub_8102058(struct Task *task) .word unk_debug_bss_1_8\n\ .word +0x2000000\n\ ._130:\n\ - ldr r0, ._136\n\ + ldr r0, ._136 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -1221,7 +1221,7 @@ static bool8 sub_8102058(struct Task *task) beq ._135 @cond_branch\n\ mov r0, #0x18\n\ bl PlaySE\n\ - ldr r4, ._136 + 4\n\ + ldr r4, ._136 + 4 @ \n\ ldrb r0, [r4, #0x18]\n\ bl sub_8102E1C\n\ ldrb r0, [r4, #0x18]\n\ @@ -1260,7 +1260,7 @@ static bool8 sub_8102090(struct Task *task) { asm("\ push {r4, lr}\n\ - ldr r4, ._146\n\ + ldr r4, ._146 @ \n\ ldrb r0, [r4, #0x18]\n\ bl sub_8102E40\n\ lsl r0, r0, #0x18\n\ @@ -1278,7 +1278,7 @@ static bool8 sub_8102090(struct Task *task) ble ._161 @cond_branch\n\ mov r0, #0xe\n\ strb r0, [r4]\n\ - ldr r0, ._146 + 4\n\ + ldr r0, ._146 + 4 @ \n\ ldrb r0, [r0]\n\ cmp r0, #0x8\n\ beq ._140 @cond_branch\n\ @@ -1389,7 +1389,7 @@ bool8 sub_81020C8(struct Task *task) { asm("\ push {r4, lr}\n\ - ldr r4, ._165\n\ + ldr r4, ._165 @ \n\ ldrb r1, [r4, #0x4]\n\ mov r0, #0xc0\n\ and r0, r0, r1\n\ @@ -1411,7 +1411,7 @@ bool8 sub_81020C8(struct Task *task) ._163:\n\ bl debug_sub_811B894\n\ ._164:\n\ - ldr r4, ._171\n\ + ldr r4, ._171 @ \n\ ldrh r0, [r4, #0x8]\n\ cmp r0, #0\n\ beq ._167 @cond_branch\n\ @@ -1440,7 +1440,7 @@ bool8 sub_81020C8(struct Task *task) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._169 @cond_branch\n\ - ldr r0, ._171 + 4\n\ + ldr r0, ._171 + 4 @ \n\ bl PlayFanfare\n\ mov r0, #0x6\n\ bl sub_8104CAC\n\ @@ -1455,7 +1455,7 @@ bool8 sub_81020C8(struct Task *task) and r0, r0, r1\n\ cmp r0, #0\n\ beq ._173 @cond_branch\n\ - ldr r0, ._175\n\ + ldr r0, ._175 @ 0x185\n\ bl PlayFanfare\n\ mov r0, #0x5\n\ bl sub_8104CAC\n\ @@ -1471,7 +1471,7 @@ bool8 sub_81020C8(struct Task *task) mov r0, #0x2\n\ bl sub_8104CAC\n\ ._174:\n\ - ldr r1, ._183\n\ + ldr r1, ._183 @ \n\ ldrh r3, [r1, #0x8]\n\ mov r0, #0xe0\n\ lsl r0, r0, #0x1\n\ @@ -1528,7 +1528,7 @@ bool8 sub_81020C8(struct Task *task) strh r0, [r4, #0x10]\n\ lsl r0, r0, #0x10\n\ asr r0, r0, #0x10\n\ - ldr r1, ._186\n\ + ldr r1, ._186 @ 0x270f\n\ cmp r0, r1\n\ ble ._185 @cond_branch\n\ strh r1, [r4, #0x10]\n\ @@ -1765,14 +1765,14 @@ static bool8 sub_8102424(struct Task *task) asm("\ push {lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._234\n\ + ldr r0, ._234 @ unk_debug_bss_1_1\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ bne ._233 @cond_branch\n\ - ldr r0, ._234 + 4\n\ - ldr r1, ._234 + 8\n\ + ldr r0, ._234 + 4 @ gSaveBlock1\n\ + ldr r1, ._234 + 8 @ \n\ ldrh r1, [r1, #0xc]\n\ - ldr r2, ._234 + 12\n\ + ldr r2, ._234 + 12 @ \n\ add r0, r0, r2\n\ strh r1, [r0]\n\ ._233:\n\ @@ -1783,7 +1783,7 @@ static bool8 sub_8102424(struct Task *task) mov r2, #0x0\n\ mov r3, #0x10\n\ bl BeginNormalPaletteFade\n\ - ldr r1, ._234 + 8\n\ + ldr r1, ._234 + 8 @ \n\ ldrb r0, [r1]\n\ add r0, r0, #0x1\n\ strb r0, [r1]\n\ @@ -1828,7 +1828,7 @@ static bool8 debug_sub_8116E74(struct Task *task) lsl r0, r0, #0x18\n\ cmp r0, #0\n\ beq ._239 @cond_branch\n\ - ldr r1, ._240\n\ + ldr r1, ._240 @ \n\ mov r0, #0x5\n\ strb r0, [r1]\n\ ._239:\n\ @@ -1848,22 +1848,22 @@ static void sub_8102484(void) { asm("\ push {r4, r5, r6, lr}\n\ - ldr r0, ._256\n\ + ldr r0, ._256 @ \n\ ldrb r2, [r0, #0xa]\n\ add r4, r0, #0\n\ cmp r2, #0\n\ beq ._242 @cond_branch\n\ b ._270\n\ ._242:\n\ - ldr r0, ._256 + 4\n\ + ldr r0, ._256 + 4 @ \n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._245 @cond_branch\n\ - ldr r3, ._256 + 8\n\ + ldr r3, ._256 + 8 @ \n\ ldrb r0, [r3]\n\ cmp r0, #0\n\ beq ._245 @cond_branch\n\ - ldr r0, ._256 + 12\n\ + ldr r0, ._256 + 12 @ \n\ ldrb r1, [r0]\n\ strb r1, [r4, #0x4]\n\ strb r2, [r3]\n\ @@ -1972,7 +1972,7 @@ static void sub_8102484(void) lsr r6, r0, #0x18\n\ cmp r6, #0x3\n\ beq ._260 @cond_branch\n\ - ldr r1, ._271\n\ + ldr r1, ._271 @ gUnknown_083ECE42\n\ lsl r0, r6, #0x1\n\ add r0, r0, r1\n\ ldrb r1, [r0]\n\ @@ -2016,8 +2016,8 @@ static void sub_8102484(void) lsr r6, r0, #0x18\n\ cmp r6, #0x5\n\ beq ._270 @cond_branch\n\ - ldr r4, ._271 + 4\n\ - ldr r1, ._271 + 8\n\ + ldr r4, ._271 + 4 @ \n\ + ldr r1, ._271 + 8 @ \n\ lsl r0, r6, #0x1\n\ add r0, r0, r1\n\ ldrb r1, [r0]\n\ diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 1b01bf7a8..4904f4a80 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -166,7 +166,7 @@ void debug_sub_8075C40() " lsl r0, r4, #0x2\n" " add r0, r0, r4\n" " lsl r0, r0, #0x3\n" - " ldr r1, ._5\n" + " ldr r1, ._5 @ gTasks\n" " add r5, r0, r1\n" " mov r1, #0x0\n" " ldsh r0, [r5, r1]\n" @@ -191,28 +191,28 @@ void debug_sub_8075C40() " bl m4aSoundVSyncOff\n" " b ._12\n" "._1:\n" - " ldr r1, ._13\n" + " ldr r1, ._13 @ 0x4000208\n" " ldrh r0, [r1]\n" " mov sl, r0\n" " mov r0, #0x0\n" " strh r0, [r1]\n" - " ldr r1, ._13 + 4\n" + " ldr r1, ._13 + 4 @ 0x4000108\n" " strh r0, [r1]\n" " mov r0, #0x83\n" " lsl r0, r0, #0x10\n" " str r0, [r1]\n" - " ldr r4, ._13 + 8\n" + " ldr r4, ._13 + 8 @ 0xc34f\n" " mov r9, r4\n" - " ldr r2, ._13 + 12\n" - " ldr r0, ._13 + 16\n" + " ldr r2, ._13 + 12 @ 0x40000b0\n" + " ldr r0, ._13 + 16 @ gScanlineEffectRegBuffers\n" " mov ip, r0\n" - " ldr r1, ._13 + 20\n" + " ldr r1, ._13 + 20 @ 0xc5ff\n" " mov r8, r1\n" - " ldr r7, ._13 + 24\n" + " ldr r7, ._13 + 24 @ 0x7fff\n" " mov r3, r9\n" " add r3, r3, #0x1\n" - " ldr r6, ._13 + 28\n" - " ldr r4, ._13 + 32\n" + " ldr r6, ._13 + 28 @ 0x4000040\n" + " ldr r4, ._13 + 32 @ 0xa2600001\n" "._11:\n" " mov r0, ip\n" " str r0, [r2]\n" @@ -233,18 +233,18 @@ void debug_sub_8075C40() " bne ._11 @cond_branch\n" " mov r3, r9\n" " add r3, r3, #0x1\n" - " ldr r0, ._13 + 36\n" + " ldr r0, ._13 + 36 @ 0x400010a\n" " mov r2, #0x0\n" " strh r2, [r0]\n" - " ldr r1, ._13 + 4\n" + " ldr r1, ._13 + 4 @ 0x4000108\n" " ldrh r0, [r1]\n" - " ldr r4, ._13 + 40\n" + " ldr r4, ._13 + 40 @ _debugStartMenu_0\n" " str r0, [r4]\n" " strh r2, [r1]\n" - " ldr r0, ._13\n" + " ldr r0, ._13 @ 0x4000208\n" " mov r1, sl\n" " strh r1, [r0]\n" - " ldr r4, ._13 + 44\n" + " ldr r4, ._13 + 44 @ _debugStartMenu_1\n" " str r3, [r4]\n" " bl m4aSoundVSyncOn\n" " b ._12\n" @@ -266,20 +266,20 @@ void debug_sub_8075C40() "._7:\n" " mov r0, #0x15\n" " bl PlaySE\n" - " ldr r0, ._16\n" - " ldr r1, ._16 + 4\n" + " ldr r0, ._16 @ gStringVar1\n" + " ldr r1, ._16 + 4 @ _debugStartMenu_1\n" " ldr r1, [r1]\n" " mov r2, #0x1\n" " mov r3, #0x8\n" " bl ConvertIntToDecimalStringN\n" - " ldr r0, ._16 + 8\n" - " ldr r1, ._16 + 12\n" + " ldr r0, ._16 + 8 @ gStringVar2\n" + " ldr r1, ._16 + 12 @ _debugStartMenu_0\n" " ldr r1, [r1]\n" " mov r2, #0x1\n" " mov r3, #0x8\n" " bl ConvertIntToDecimalStringN\n" " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._16 + 16\n" + " ldr r0, ._16 + 16 @ gUnknown_Debug_839B6D8\n" " mov r1, #0x2\n" " mov r2, #0xf\n" " bl Menu_PrintText\n" @@ -297,7 +297,7 @@ void debug_sub_8075C40() " .word _debugStartMenu_0\n" " .word gUnknown_Debug_839B6D8\n" "._8:\n" - " ldr r0, ._19\n" + " ldr r0, ._19 @ gMain\n" " ldrh r1, [r0, #0x2e]\n" " mov r0, #0x1\n" " and r0, r0, r1\n" @@ -328,7 +328,7 @@ void debug_sub_8075D9C() { asm( " push {lr}\n" - " ldr r0, ._21\n" + " ldr r0, ._21 @ debug_sub_8075C40\n" " mov r1, #0xa\n" " bl CreateTask\n" " bl ScriptContext2_Enable\n" @@ -363,8 +363,8 @@ void debug_sub_8075DB4() " bl StringCopy8\n" " mov r3, #0x7\n" " mov r4, #0x0\n" - " ldr r0, ._25\n" - " ldr r1, ._25 + 4\n" + " ldr r0, ._25 @ gSaveBlock1\n" + " ldr r1, ._25 + 4 @ 0x2b28\n" " add r5, r0, r1\n" " add r2, r6, #0\n" " add r2, r2, #0x10\n" @@ -387,7 +387,7 @@ void debug_sub_8075DB4() "._24:\n" " mov r0, #0x64\n" " mul r0, r0, r4\n" - " ldr r1, ._25 + 8\n" + " ldr r1, ._25 + 8 @ gPlayerParty\n" " add r0, r0, r1\n" " mov r1, #0x2c\n" " mul r1, r1, r4\n" @@ -417,12 +417,12 @@ void unref_sub_8070F90() { asm( " push {lr}\n" - " ldr r0, ._27\n" + " ldr r0, ._27 @ 0x801\n" " bl FlagSet\n" " mov r0, #0x80\n" " lsl r0, r0, #0x4\n" " bl FlagSet\n" - " ldr r0, ._27 + 4\n" + " ldr r0, ._27 + 4 @ 0x802\n" " bl FlagSet\n" " pop {r0}\n" " bx r0\n" diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index f1bded592..fcbfe122f 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -583,12 +583,12 @@ void sub_809D844(void) bl AnimateSprites\n\ bl BuildOamBuffer\n\ bl UpdatePaletteFade\n\ - ldr r0, ._2\n\ + ldr r0, ._2 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1 @cond_branch\n\ - ldr r0, ._2 + 4\n\ - ldr r1, ._2 + 8\n\ + ldr r0, ._2 + 4 @ gLink\n\ + ldr r1, ._2 + 8 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x3\n\ @@ -733,8 +733,8 @@ bool8 sub_809DA84(void) asm("\ push {r4, r5, r6, r7, lr}\n\ add sp, sp, #0xfffffff8\n\ - ldr r1, ._52\n\ - ldr r2, ._52 + 4\n\ + ldr r1, ._52 @ gMain\n\ + ldr r2, ._52 + 4 @ 0x43c\n\ add r0, r1, r2\n\ ldrb r0, [r0]\n\ mov ip, r1\n\ @@ -743,7 +743,7 @@ bool8 sub_809DA84(void) b ._51\n\ ._50:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._52 + 8\n\ + ldr r1, ._52 + 8 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -784,8 +784,8 @@ bool8 sub_809DA84(void) b ._146\n\ ._56:\n\ bl ScanlineEffect_Stop\n\ - ldr r1, ._80\n\ - ldr r2, ._80 + 4\n\ + ldr r1, ._80 @ gMain\n\ + ldr r2, ._80 + 4 @ 0x43c\n\ add r1, r1, r2\n\ b ._153\n\ ._81:\n\ @@ -802,10 +802,10 @@ bool8 sub_809DA84(void) mov r3, #0x80\n\ lsl r3, r3, #0x9\n\ mov r5, #0x0\n\ - ldr r1, ._85\n\ + ldr r1, ._85 @ 0x40000d4\n\ mov r4, #0x80\n\ lsl r4, r4, #0x5\n\ - ldr r6, ._85 + 4\n\ + ldr r6, ._85 + 4 @ 0x85000400\n\ mov r7, #0x85\n\ lsl r7, r7, #0x18\n\ ._83:\n\ @@ -827,7 +827,7 @@ bool8 sub_809DA84(void) orr r0, r0, r7\n\ str r0, [r1, #0x8]\n\ ldr r0, [r1, #0x8]\n\ - ldr r1, ._85 + 8\n\ + ldr r1, ._85 + 8 @ 0x43c\n\ add r1, r1, ip\n\ b ._153\n\ ._86:\n\ @@ -838,8 +838,8 @@ bool8 sub_809DA84(void) .word 0x43c\n\ ._59:\n\ bl sub_809DE64\n\ - ldr r1, ._88\n\ - ldr r2, ._88 + 4\n\ + ldr r1, ._88 @ gMain\n\ + ldr r2, ._88 + 4 @ 0x43c\n\ add r1, r1, r2\n\ b ._153\n\ ._89:\n\ @@ -848,7 +848,7 @@ bool8 sub_809DA84(void) .word gMain\n\ .word 0x43c\n\ ._60:\n\ - ldr r0, ._91\n\ + ldr r0, ._91 @ gWindowTemplate_81E6E6C\n\ bl Text_LoadWindowTemplate\n\ b ._146\n\ ._92:\n\ @@ -856,10 +856,10 @@ bool8 sub_809DA84(void) ._91:\n\ .word gWindowTemplate_81E6E6C\n\ ._61:\n\ - ldr r0, ._94\n\ + ldr r0, ._94 @ gWindowTemplate_81E6E6C\n\ bl MultistepInitMenuWindowBegin\n\ - ldr r1, ._94 + 4\n\ - ldr r2, ._94 + 8\n\ + ldr r1, ._94 + 4 @ gMain\n\ + ldr r2, ._94 + 8 @ 0x43c\n\ add r1, r1, r2\n\ b ._153\n\ ._95:\n\ @@ -877,8 +877,8 @@ bool8 sub_809DA84(void) b ._146\n\ ._63:\n\ bl sub_809DA1C\n\ - ldr r1, ._100\n\ - ldr r2, ._100 + 4\n\ + ldr r1, ._100 @ gMain\n\ + ldr r2, ._100 + 4 @ 0x43c\n\ add r1, r1, r2\n\ b ._153\n\ ._101:\n\ @@ -887,26 +887,26 @@ bool8 sub_809DA84(void) .word gMain\n\ .word 0x43c\n\ ._64:\n\ - ldr r1, ._103\n\ - ldr r2, ._103 + 4\n\ - ldr r0, ._103 + 8\n\ + ldr r1, ._103 @ gSummaryScreenTextTiles\n\ + ldr r2, ._103 + 4 @ 0x600d000\n\ + ldr r0, ._103 + 8 @ 0x40000d4\n\ str r1, [r0]\n\ str r2, [r0, #0x4]\n\ - ldr r1, ._103 + 12\n\ + ldr r1, ._103 + 12 @ 0x800000a0\n\ str r1, [r0, #0x8]\n\ ldr r1, [r0, #0x8]\n\ - ldr r1, ._103 + 16\n\ - ldr r2, ._103 + 20\n\ + ldr r1, ._103 + 16 @ sSummaryScreenButtonTiles\n\ + ldr r2, ._103 + 20 @ 0x600d140\n\ str r1, [r0]\n\ str r2, [r0, #0x4]\n\ - ldr r1, ._103 + 24\n\ + ldr r1, ._103 + 24 @ 0x80000080\n\ str r1, [r0, #0x8]\n\ ldr r0, [r0, #0x8]\n\ - ldr r0, ._103 + 28\n\ + ldr r0, ._103 + 28 @ \n\ add r0, r0, #0x74\n\ mov r1, #0x0\n\ strb r1, [r0]\n\ - ldr r1, ._103 + 32\n\ + ldr r1, ._103 + 32 @ \n\ add r1, r1, ip\n\ b ._153\n\ ._104:\n\ @@ -928,7 +928,7 @@ bool8 sub_809DA84(void) bne ._105 @cond_branch\n\ b ._157\n\ ._105:\n\ - ldr r0, ._108\n\ + ldr r0, ._108 @ \n\ add r0, r0, #0x74\n\ mov r1, #0x0\n\ strb r1, [r0]\n\ @@ -939,8 +939,8 @@ bool8 sub_809DA84(void) .word +0x2018000\n\ ._66:\n\ bl sub_80A18C4\n\ - ldr r1, ._111\n\ - ldr r2, ._111 + 4\n\ + ldr r1, ._111 @ gMain\n\ + ldr r2, ._111 + 4 @ 0x43c\n\ add r1, r1, r2\n\ b ._153\n\ ._112:\n\ @@ -949,7 +949,7 @@ bool8 sub_809DA84(void) .word gMain\n\ .word 0x43c\n\ ._67:\n\ - ldr r4, ._115\n\ + ldr r4, ._115 @ \n\ add r0, r4, #0\n\ bl sub_809F678\n\ add r0, r4, #0\n\ @@ -968,7 +968,7 @@ bool8 sub_809DA84(void) mov r0, #0xa\n\ bl sub_80A12D0\n\ ._114:\n\ - ldr r0, ._118\n\ + ldr r0, ._118 @ \n\ bl DrawPokerusSurvivorDot\n\ b ._146\n\ ._119:\n\ @@ -977,10 +977,10 @@ bool8 sub_809DA84(void) .word +0x2018010\n\ ._68:\n\ bl sub_80A1950\n\ - ldr r0, ._121\n\ + ldr r0, ._121 @ \n\ bl sub_80A1D84\n\ - ldr r1, ._121 + 4\n\ - ldr r2, ._121 + 8\n\ + ldr r1, ._121 + 4 @ \n\ + ldr r2, ._121 + 8 @ \n\ add r1, r1, r2\n\ b ._153\n\ ._122:\n\ @@ -990,7 +990,7 @@ bool8 sub_809DA84(void) .word gMain\n\ .word 0x43c\n\ ._69:\n\ - ldr r4, ._124\n\ + ldr r4, ._124 @ \n\ add r0, r4, #0\n\ bl sub_80A1DE8\n\ add r4, r4, #0x64\n\ @@ -1002,7 +1002,7 @@ bool8 sub_809DA84(void) ._124:\n\ .word +0x2018010\n\ ._70:\n\ - ldr r4, ._129\n\ + ldr r4, ._129 @ \n\ add r5, r4, #0\n\ add r5, r5, #0x64\n\ add r0, r4, #0\n\ @@ -1018,8 +1018,8 @@ bool8 sub_809DA84(void) ._126:\n\ mov r0, #0x0\n\ strb r0, [r5]\n\ - ldr r1, ._129 + 4\n\ - ldr r2, ._129 + 8\n\ + ldr r1, ._129 + 4 @ \n\ + ldr r2, ._129 + 8 @ \n\ add r1, r1, r2\n\ b ._153\n\ ._130:\n\ @@ -1033,19 +1033,19 @@ bool8 sub_809DA84(void) bl DrawSummaryScreenNavigationDots\n\ b ._146\n\ ._72:\n\ - ldr r1, ._134\n\ + ldr r1, ._134 @ \n\ ldrb r0, [r1, #0xb]\n\ cmp r0, #0x1\n\ bhi ._132 @cond_branch\n\ - ldr r0, ._134 + 4\n\ + ldr r0, ._134 + 4 @ \n\ ldrb r1, [r1, #0xb]\n\ lsl r1, r1, #0x2\n\ add r1, r1, r0\n\ ldr r0, [r1]\n\ bl _call_via_r0\n\ ._132:\n\ - ldr r1, ._134 + 8\n\ - ldr r2, ._134 + 12\n\ + ldr r1, ._134 + 8 @ \n\ + ldr r2, ._134 + 12 @ \n\ add r1, r1, r2\n\ b ._153\n\ ._135:\n\ @@ -1056,7 +1056,7 @@ bool8 sub_809DA84(void) .word gMain\n\ .word 0x43c\n\ ._73:\n\ - ldr r0, ._137\n\ + ldr r0, ._137 @ \n\ bl sub_809FAC8\n\ b ._146\n\ ._138:\n\ @@ -1064,16 +1064,16 @@ bool8 sub_809DA84(void) ._137:\n\ .word +0x2018010\n\ ._74:\n\ - ldr r2, ._140\n\ - ldr r0, ._140 + 4\n\ + ldr r2, ._140 @ sUnknown_083C1598\n\ + ldr r0, ._140 + 4 @ \n\ ldrb r1, [r0, #0xb]\n\ lsl r1, r1, #0x2\n\ add r1, r1, r2\n\ add r0, r0, #0x10\n\ ldr r1, [r1]\n\ bl _call_via_r1\n\ - ldr r1, ._140 + 8\n\ - ldr r2, ._140 + 12\n\ + ldr r1, ._140 + 8 @ \n\ + ldr r2, ._140 + 12 @ \n\ add r1, r1, r2\n\ b ._153\n\ ._141:\n\ @@ -1084,13 +1084,13 @@ bool8 sub_809DA84(void) .word gMain\n\ .word 0x43c\n\ ._75:\n\ - ldr r0, ._144\n\ + ldr r0, ._144 @ \n\ mov r1, #0x2d\n\ bl GetMonData\n\ add r1, r0, #0\n\ cmp r1, #0\n\ beq ._142 @cond_branch\n\ - ldr r1, ._144 + 4\n\ + ldr r1, ._144 + 4 @ \n\ mov r2, #0x80\n\ lsl r2, r2, #0x1\n\ add r0, r2, #0\n\ @@ -1102,7 +1102,7 @@ bool8 sub_809DA84(void) .word +0x2018010\n\ .word gBattle_BG3_X\n\ ._142:\n\ - ldr r0, ._147\n\ + ldr r0, ._147 @ gBattle_BG3_X\n\ strh r1, [r0]\n\ b ._146\n\ ._148:\n\ @@ -1111,7 +1111,7 @@ bool8 sub_809DA84(void) .word gBattle_BG3_X\n\ ._76:\n\ bl sub_809EBC4\n\ - ldr r0, ._151\n\ + ldr r0, ._151 @ \n\ add r0, r0, #0x79\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ @@ -1136,8 +1136,8 @@ bool8 sub_809DA84(void) bl sub_80A1654\n\ ._150:\n\ bl PrintSummaryWindowHeaderText\n\ - ldr r1, ._154\n\ - ldr r2, ._154 + 4\n\ + ldr r1, ._154 @ gMain\n\ + ldr r2, ._154 + 4 @ 0x43c\n\ add r1, r1, r2\n\ b ._153\n\ ._155:\n\ @@ -1150,8 +1150,8 @@ bool8 sub_809DA84(void) cmp r0, #0x1\n\ beq ._157 @cond_branch\n\ ._146:\n\ - ldr r1, ._158\n\ - ldr r0, ._158 + 4\n\ + ldr r1, ._158 @ gMain\n\ + ldr r0, ._158 + 4 @ 0x43c\n\ add r1, r1, r0\n\ ._153:\n\ ldrb r0, [r1]\n\ @@ -1164,7 +1164,7 @@ bool8 sub_809DA84(void) .word gMain\n\ .word 0x43c\n\ ._51:\n\ - ldr r0, ._162\n\ + ldr r0, ._162 @ sub_809D85C\n\ bl SetVBlankCallback\n\ mov r0, #0x1\n\ str r0, [sp]\n\ @@ -1173,21 +1173,21 @@ bool8 sub_809DA84(void) mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginHardwarePaletteFade\n\ - ldr r0, ._162 + 4\n\ + ldr r0, ._162 + 4 @ sub_809D844\n\ bl SetMainCallback2\n\ - ldr r2, ._162 + 8\n\ + ldr r2, ._162 + 8 @ gPaletteFade\n\ ldrb r1, [r2, #0x8]\n\ mov r0, #0x7f\n\ and r0, r0, r1\n\ strb r0, [r2, #0x8]\n\ - ldr r0, ._162 + 12\n\ + ldr r0, ._162 + 12 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._160 @cond_branch\n\ - ldr r0, ._162 + 16\n\ + ldr r0, ._162 + 16 @ 0x600dde0\n\ mov r1, #0x80\n\ lsl r1, r1, #0x8\n\ - ldr r2, ._162 + 20\n\ + ldr r2, ._162 + 20 @ 0x600f000\n\ mov r3, #0x3\n\ bl debug_sub_8008218\n\ ._160:\n\ diff --git a/src/pokenav_before.c b/src/pokenav_before.c index b292e80c4..b645136dc 100644 --- a/src/pokenav_before.c +++ b/src/pokenav_before.c @@ -479,7 +479,7 @@ void sub_80EBDD8() asm("\ push {lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._64\n\ + ldr r1, ._64 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -490,7 +490,7 @@ void sub_80EBDD8() b ._131\n\ ._62:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._64 + 4\n\ + ldr r1, ._64 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -525,14 +525,14 @@ void sub_80EBDD8() lsl r1, r1, #0x13\n\ mov r0, #0x0\n\ strh r0, [r1]\n\ - ldr r1, ._86\n\ - ldr r3, ._86 + 4\n\ + ldr r1, ._86 @ gSharedMem\n\ + ldr r3, ._86 + 4 @ 0x6ddc\n\ add r0, r1, r3\n\ ldrb r2, [r0]\n\ sub r3, r3, #0x2f\n\ add r0, r1, r3\n\ strb r2, [r0]\n\ - ldr r0, ._86 + 8\n\ + ldr r0, ._86 + 8 @ 0x6dae\n\ add r2, r1, r0\n\ mov r0, #0x5\n\ strb r0, [r2]\n\ @@ -548,7 +548,7 @@ void sub_80EBDD8() .word 0x6dae\n\ ._68:\n\ bl sub_80F3FF0\n\ - ldr r1, ._91\n\ + ldr r1, ._91 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -562,7 +562,7 @@ void sub_80EBDD8() beq ._88 @cond_branch\n\ b ._131\n\ ._88:\n\ - ldr r1, ._91\n\ + ldr r1, ._91 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -573,7 +573,7 @@ void sub_80EBDD8() .word gSharedMem\n\ ._70:\n\ bl sub_80F2598\n\ - ldr r1, ._94\n\ + ldr r1, ._94 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -584,7 +584,7 @@ void sub_80EBDD8() .word gSharedMem\n\ ._71:\n\ bl sub_80EEE20\n\ - ldr r1, ._99\n\ + ldr r1, ._99 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -599,7 +599,7 @@ void sub_80EBDD8() b ._131\n\ ._96:\n\ bl sub_80EEE08\n\ - ldr r1, ._99\n\ + ldr r1, ._99 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -611,7 +611,7 @@ void sub_80EBDD8() ._73:\n\ mov r0, #0x0\n\ bl sub_80EF248\n\ - ldr r1, ._104\n\ + ldr r1, ._104 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -634,7 +634,7 @@ void sub_80EBDD8() ._75:\n\ mov r0, #0x0\n\ bl sub_80F1B8C\n\ - ldr r1, ._108\n\ + ldr r1, ._108 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -647,7 +647,7 @@ void sub_80EBDD8() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._131 @cond_branch\n\ - ldr r1, ._108\n\ + ldr r1, ._108 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -657,7 +657,7 @@ void sub_80EBDD8() ._108:\n\ .word gSharedMem\n\ ._77:\n\ - ldr r0, ._111\n\ + ldr r0, ._111 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ b ._110\n\ ._112:\n\ @@ -672,7 +672,7 @@ void sub_80EBDD8() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r1, ._114\n\ + ldr r1, ._114 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -684,7 +684,7 @@ void sub_80EBDD8() ._79:\n\ mov r0, #0x0\n\ bl sub_80EED2C\n\ - ldr r1, ._117\n\ + ldr r1, ._117 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -694,7 +694,7 @@ void sub_80EBDD8() ._117:\n\ .word gSharedMem\n\ ._80:\n\ - ldr r0, ._121\n\ + ldr r0, ._121 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -711,7 +711,7 @@ void sub_80EBDD8() ._81:\n\ mov r0, #0x0\n\ bl sub_80F2C80\n\ - ldr r1, ._125\n\ + ldr r1, ._125 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -724,7 +724,7 @@ void sub_80EBDD8() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._131 @cond_branch\n\ - ldr r1, ._125\n\ + ldr r1, ._125 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -736,7 +736,7 @@ void sub_80EBDD8() ._83:\n\ bl sub_80F1DF0\n\ ._110:\n\ - ldr r1, ._128\n\ + ldr r1, ._128 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -757,14 +757,14 @@ void sub_80EBDD8() mov r0, #0x0\n\ mov r1, #0x0\n\ bl sub_80EF428\n\ - ldr r0, ._132\n\ + ldr r0, ._132 @ sub_80EC268\n\ bl sub_80EBDBC\n\ - ldr r0, ._132 + 4\n\ + ldr r0, ._132 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._131 @cond_branch\n\ - ldr r0, ._132 + 8\n\ - ldr r2, ._132 + 12\n\ + ldr r0, ._132 + 8 @ 0x6007de0\n\ + ldr r2, ._132 + 12 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -877,7 +877,7 @@ void sub_80EC00C() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._136\n\ + ldr r1, ._136 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -888,7 +888,7 @@ void sub_80EC00C() b ._191\n\ ._134:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._136 + 4\n\ + ldr r1, ._136 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -919,17 +919,17 @@ void sub_80EC00C() beq ._153 @cond_branch\n\ b ._191\n\ ._153:\n\ - ldr r0, ._156\n\ + ldr r0, ._156 @ sub_80EBD80\n\ bl SetVBlankCallback\n\ bl sub_80EED1C\n\ - ldr r4, ._156 + 4\n\ - ldr r1, ._156 + 8\n\ + ldr r4, ._156 + 4 @ gSharedMem\n\ + ldr r1, ._156 + 8 @ 0x6ddc\n\ add r0, r4, r1\n\ ldrb r1, [r0]\n\ - ldr r2, ._156 + 12\n\ + ldr r2, ._156 + 12 @ 0x6dad\n\ add r0, r4, r2\n\ strb r1, [r0]\n\ - ldr r0, ._156 + 16\n\ + ldr r0, ._156 + 16 @ 0x6dae\n\ add r1, r4, r0\n\ mov r0, #0x5\n\ strb r0, [r1]\n\ @@ -952,7 +952,7 @@ void sub_80EC00C() ._140:\n\ mov r0, #0x0\n\ bl sub_80EF248\n\ - ldr r1, ._161\n\ + ldr r1, ._161 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -967,7 +967,7 @@ void sub_80EC00C() beq ._158 @cond_branch\n\ b ._191\n\ ._158:\n\ - ldr r1, ._161\n\ + ldr r1, ._161 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -979,7 +979,7 @@ void sub_80EC00C() ._142:\n\ mov r0, #0x0\n\ bl sub_80F1B8C\n\ - ldr r1, ._166\n\ + ldr r1, ._166 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -994,7 +994,7 @@ void sub_80EC00C() beq ._163 @cond_branch\n\ b ._191\n\ ._163:\n\ - ldr r1, ._166\n\ + ldr r1, ._166 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -1020,7 +1020,7 @@ void sub_80EC00C() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._171\n\ + ldr r0, ._171 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ @@ -1033,7 +1033,7 @@ void sub_80EC00C() ._146:\n\ mov r0, #0x0\n\ bl sub_80EED2C\n\ - ldr r1, ._174\n\ + ldr r1, ._174 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -1043,7 +1043,7 @@ void sub_80EC00C() ._174:\n\ .word gSharedMem\n\ ._147:\n\ - ldr r0, ._178\n\ + ldr r0, ._178 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -1059,7 +1059,7 @@ void sub_80EC00C() .word gPaletteFade\n\ ._148:\n\ bl sub_80F2598\n\ - ldr r1, ._181\n\ + ldr r1, ._181 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -1071,7 +1071,7 @@ void sub_80EC00C() ._149:\n\ mov r0, #0x0\n\ bl sub_80F2C80\n\ - ldr r1, ._185\n\ + ldr r1, ._185 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -1084,7 +1084,7 @@ void sub_80EC00C() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._191 @cond_branch\n\ - ldr r1, ._185\n\ + ldr r1, ._185 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -1096,7 +1096,7 @@ void sub_80EC00C() ._151:\n\ bl sub_80F1DF0\n\ ._169:\n\ - ldr r1, ._188\n\ + ldr r1, ._188 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -1114,20 +1114,20 @@ void sub_80EC00C() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._191 @cond_branch\n\ - ldr r0, ._192\n\ - ldr r1, ._192 + 4\n\ + ldr r0, ._192 @ gSharedMem\n\ + ldr r1, ._192 + 4 @ 0x6dad\n\ add r0, r0, r1\n\ ldrb r1, [r0]\n\ mov r0, #0x0\n\ bl sub_80EF428\n\ - ldr r0, ._192 + 8\n\ + ldr r0, ._192 + 8 @ sub_80EC268\n\ bl sub_80EBDBC\n\ - ldr r0, ._192 + 12\n\ + ldr r0, ._192 + 12 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._191 @cond_branch\n\ - ldr r0, ._192 + 16\n\ - ldr r2, ._192 + 20\n\ + ldr r0, ._192 + 16 @ 0x6007de0\n\ + ldr r2, ._192 + 20 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -1349,7 +1349,7 @@ void sub_80EC4A0() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._285\n\ + ldr r1, ._285 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -1360,7 +1360,7 @@ void sub_80EC4A0() b ._340\n\ ._283:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._285 + 4\n\ + ldr r1, ._285 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -1397,7 +1397,7 @@ void sub_80EC4A0() beq ._304 @cond_branch\n\ b ._340\n\ ._304:\n\ - ldr r0, ._308\n\ + ldr r0, ._308 @ gSaveBlock2\n\ ldrb r1, [r0, #0x15]\n\ mov r0, #0x8\n\ and r0, r0, r1\n\ @@ -1408,7 +1408,7 @@ void sub_80EC4A0() ._306:\n\ add r0, r1, #0\n\ bl sub_80EEFBC\n\ - ldr r1, ._308 + 4\n\ + ldr r1, ._308 + 4 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -1426,7 +1426,7 @@ void sub_80EC4A0() beq ._310 @cond_branch\n\ b ._340\n\ ._310:\n\ - ldr r4, ._313\n\ + ldr r4, ._313 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -1446,7 +1446,7 @@ void sub_80EC4A0() ._313:\n\ .word gSharedMem\n\ ._291:\n\ - ldr r0, ._318\n\ + ldr r0, ._318 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -1464,7 +1464,7 @@ void sub_80EC4A0() .word gPaletteFade\n\ ._292:\n\ bl sub_80F2620\n\ - ldr r1, ._321\n\ + ldr r1, ._321 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -1478,7 +1478,7 @@ void sub_80EC4A0() b ._336\n\ ._294:\n\ bl sub_80EF840\n\ - ldr r1, ._326\n\ + ldr r1, ._326 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -1500,7 +1500,7 @@ void sub_80EC4A0() ._296:\n\ mov r0, #0x4\n\ bl sub_80F2C80\n\ - ldr r1, ._329\n\ + ldr r1, ._329 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -1517,9 +1517,9 @@ void sub_80EC4A0() .word gSharedMem\n\ ._298:\n\ bl sub_80F2DD8\n\ - ldr r0, ._332\n\ + ldr r0, ._332 @ sub_80EBD30\n\ bl SetVBlankCallback\n\ - ldr r1, ._332 + 4\n\ + ldr r1, ._332 + 4 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -1551,17 +1551,17 @@ void sub_80EC4A0() ._301:\n\ mov r0, #0x1\n\ bl sub_80EED2C\n\ - ldr r0, ._338\n\ + ldr r0, ._338 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._336 @cond_branch\n\ - ldr r0, ._338 + 4\n\ - ldr r2, ._338 + 8\n\ + ldr r0, ._338 + 4 @ 0x60075e0\n\ + ldr r2, ._338 + 8 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ ._336:\n\ - ldr r1, ._338 + 12\n\ + ldr r1, ._338 + 12 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -1578,13 +1578,13 @@ void sub_80EC4A0() .word 0x600f800\n\ .word gSharedMem\n\ ._302:\n\ - ldr r0, ._341\n\ + ldr r0, ._341 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ cmp r0, #0\n\ bne ._340 @cond_branch\n\ - ldr r0, ._341 + 4\n\ + ldr r0, ._341 + 4 @ sub_80EC67C\n\ bl sub_80EBDBC\n\ ._340:\n\ add sp, sp, #0x4\n\ @@ -1691,7 +1691,7 @@ void sub_80EC67C() asm("\ push {r4, r5, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._345\n\ + ldr r1, ._345 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -1702,7 +1702,7 @@ void sub_80EC67C() b ._386\n\ ._343:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._345 + 4\n\ + ldr r1, ._345 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -1744,7 +1744,7 @@ void sub_80EC67C() ._358:\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._364\n\ + ldr r0, ._364 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -1758,7 +1758,7 @@ void sub_80EC67C() ._359:\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._367\n\ + ldr r0, ._367 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r0, r2\n\ @@ -1770,7 +1770,7 @@ void sub_80EC67C() ._367:\n\ .word gSharedMem\n\ ._349:\n\ - ldr r1, ._371\n\ + ldr r1, ._371 @ 0x6e90\n\ add r0, r4, r1\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ @@ -1797,8 +1797,8 @@ void sub_80EC67C() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._386 @cond_branch\n\ - ldr r5, ._378\n\ - ldr r1, ._378 + 4\n\ + ldr r5, ._378 @ gSharedMem\n\ + ldr r1, ._378 + 4 @ 0x6e90\n\ add r0, r5, r1\n\ ldrb r4, [r0]\n\ cmp r4, #0\n\ @@ -1827,7 +1827,7 @@ void sub_80EC67C() cmp r4, #0\n\ bne ._386 @cond_branch\n\ bl sub_80EFBB0\n\ - ldr r0, ._383\n\ + ldr r0, ._383 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -1858,7 +1858,7 @@ void sub_80EC67C() strh r0, [r1]\n\ b ._386\n\ ._353:\n\ - ldr r0, ._389\n\ + ldr r0, ._389 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -1867,10 +1867,10 @@ void sub_80EC67C() bl sub_80F2DF4\n\ mov r0, #0x4\n\ bl sub_80F2D04\n\ - ldr r3, ._389 + 4\n\ + ldr r3, ._389 + 4 @ gSaveBlock2\n\ mov r2, #0x0\n\ - ldr r0, ._389 + 8\n\ - ldr r1, ._389 + 12\n\ + ldr r0, ._389 + 8 @ gSharedMem\n\ + ldr r1, ._389 + 12 @ 0x6e90\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ @@ -1884,15 +1884,15 @@ void sub_80EC67C() and r0, r0, r1\n\ orr r0, r0, r2\n\ strb r0, [r3, #0x15]\n\ - ldr r0, ._389 + 16\n\ + ldr r0, ._389 + 16 @ sub_80EC00C\n\ bl sub_80EBDBC\n\ ._386:\n\ - ldr r0, ._389 + 20\n\ + ldr r0, ._389 + 20 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._388 @cond_branch\n\ - ldr r0, ._389 + 24\n\ - ldr r2, ._389 + 28\n\ + ldr r0, ._389 + 24 @ gLink\n\ + ldr r2, ._389 + 28 @ 0xfbd\n\ add r0, r0, r2\n\ ldrb r0, [r0]\n\ mov r1, #0x4\n\ @@ -2092,7 +2092,7 @@ void sub_80ECA10() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._456\n\ + ldr r1, ._456 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -2103,7 +2103,7 @@ void sub_80ECA10() b ._509\n\ ._454:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._456 + 4\n\ + ldr r1, ._456 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -2134,17 +2134,17 @@ void sub_80ECA10() beq ._473 @cond_branch\n\ b ._509\n\ ._473:\n\ - ldr r0, ._476\n\ + ldr r0, ._476 @ sub_80EBD80\n\ bl SetVBlankCallback\n\ bl sub_80EED1C\n\ - ldr r4, ._476 + 4\n\ - ldr r1, ._476 + 8\n\ + ldr r4, ._476 + 4 @ gSharedMem\n\ + ldr r1, ._476 + 8 @ 0x6df0\n\ add r0, r4, r1\n\ ldrb r1, [r0]\n\ - ldr r2, ._476 + 12\n\ + ldr r2, ._476 + 12 @ 0x6dad\n\ add r0, r4, r2\n\ strb r1, [r0]\n\ - ldr r0, ._476 + 16\n\ + ldr r0, ._476 + 16 @ 0x6dae\n\ add r1, r4, r0\n\ mov r0, #0x3\n\ strb r0, [r1]\n\ @@ -2167,7 +2167,7 @@ void sub_80ECA10() ._460:\n\ mov r0, #0x1\n\ bl sub_80EF248\n\ - ldr r1, ._481\n\ + ldr r1, ._481 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -2182,7 +2182,7 @@ void sub_80ECA10() beq ._478 @cond_branch\n\ b ._509\n\ ._478:\n\ - ldr r1, ._481\n\ + ldr r1, ._481 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -2194,7 +2194,7 @@ void sub_80ECA10() ._462:\n\ mov r0, #0x1\n\ bl sub_80F1B8C\n\ - ldr r1, ._486\n\ + ldr r1, ._486 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -2209,7 +2209,7 @@ void sub_80ECA10() beq ._483 @cond_branch\n\ b ._509\n\ ._483:\n\ - ldr r1, ._486\n\ + ldr r1, ._486 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -2235,7 +2235,7 @@ void sub_80ECA10() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._491\n\ + ldr r0, ._491 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ @@ -2248,7 +2248,7 @@ void sub_80ECA10() ._466:\n\ mov r0, #0x0\n\ bl sub_80EED2C\n\ - ldr r1, ._494\n\ + ldr r1, ._494 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -2261,7 +2261,7 @@ void sub_80ECA10() bl sub_80F2598\n\ b ._496\n\ ._468:\n\ - ldr r0, ._499\n\ + ldr r0, ._499 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -2278,7 +2278,7 @@ void sub_80ECA10() ._469:\n\ mov r0, #0x1\n\ bl sub_80F2C80\n\ - ldr r1, ._503\n\ + ldr r1, ._503 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -2291,7 +2291,7 @@ void sub_80ECA10() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._509 @cond_branch\n\ - ldr r1, ._503\n\ + ldr r1, ._503 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -2303,7 +2303,7 @@ void sub_80ECA10() ._471:\n\ bl sub_80F1DF0\n\ ._496:\n\ - ldr r1, ._506\n\ + ldr r1, ._506 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -2321,20 +2321,20 @@ void sub_80ECA10() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._509 @cond_branch\n\ - ldr r0, ._510\n\ - ldr r1, ._510 + 4\n\ + ldr r0, ._510 @ gSharedMem\n\ + ldr r1, ._510 + 4 @ 0x6dad\n\ add r0, r0, r1\n\ ldrb r1, [r0]\n\ mov r0, #0x1\n\ bl sub_80EF428\n\ - ldr r0, ._510 + 8\n\ + ldr r0, ._510 + 8 @ sub_80EC86C\n\ bl sub_80EBDBC\n\ - ldr r0, ._510 + 12\n\ + ldr r0, ._510 + 12 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._509 @cond_branch\n\ - ldr r0, ._510 + 16\n\ - ldr r2, ._510 + 20\n\ + ldr r0, ._510 + 16 @ 0x6007de0\n\ + ldr r2, ._510 + 20 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -2488,7 +2488,7 @@ void sub_80ECD80() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._564\n\ + ldr r1, ._564 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -2499,7 +2499,7 @@ void sub_80ECD80() b ._642\n\ ._562:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._564 + 4\n\ + ldr r1, ._564 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -2546,7 +2546,7 @@ void sub_80ECD80() add r1, r4, r0\n\ b ._630\n\ ._568:\n\ - ldr r0, ._592\n\ + ldr r0, ._592 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -2569,7 +2569,7 @@ void sub_80ECD80() beq ._594 @cond_branch\n\ b ._642\n\ ._594:\n\ - ldr r0, ._597\n\ + ldr r0, ._597 @ sub_80EBD80\n\ bl SetVBlankCallback\n\ b ._625\n\ ._598:\n\ @@ -2579,7 +2579,7 @@ void sub_80ECD80() ._570:\n\ bl sub_80EED1C\n\ bl sub_80F3130\n\ - ldr r1, ._600\n\ + ldr r1, ._600 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -2591,7 +2591,7 @@ void sub_80ECD80() ._571:\n\ mov r0, #0x1\n\ bl sub_80F2D6C\n\ - ldr r1, ._603\n\ + ldr r1, ._603 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -2605,13 +2605,13 @@ void sub_80ECD80() bl sub_80F2D6C\n\ b ._625\n\ ._573:\n\ - ldr r1, ._607\n\ + ldr r1, ._607 @ 0x6dfc\n\ add r0, r4, r1\n\ ldrb r1, [r0]\n\ - ldr r2, ._607 + 4\n\ + ldr r2, ._607 + 4 @ 0x6dad\n\ add r0, r4, r2\n\ strb r1, [r0]\n\ - ldr r3, ._607 + 8\n\ + ldr r3, ._607 + 8 @ 0x6dae\n\ add r1, r4, r3\n\ mov r0, #0x6\n\ strb r0, [r1]\n\ @@ -2629,7 +2629,7 @@ void sub_80ECD80() ._574:\n\ mov r0, #0x2\n\ bl sub_80EF248\n\ - ldr r1, ._612\n\ + ldr r1, ._612 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -2652,7 +2652,7 @@ void sub_80ECD80() ._576:\n\ mov r0, #0x2\n\ bl sub_80F1B8C\n\ - ldr r1, ._617\n\ + ldr r1, ._617 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -2667,7 +2667,7 @@ void sub_80ECD80() beq ._614 @cond_branch\n\ b ._642\n\ ._614:\n\ - ldr r1, ._617\n\ + ldr r1, ._617 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -2695,7 +2695,7 @@ void sub_80ECD80() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._623\n\ + ldr r0, ._623 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ @@ -2711,7 +2711,7 @@ void sub_80ECD80() b ._625\n\ ._581:\n\ bl sub_80F2598\n\ - ldr r1, ._627\n\ + ldr r1, ._627 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -2721,7 +2721,7 @@ void sub_80ECD80() ._627:\n\ .word gSharedMem\n\ ._582:\n\ - ldr r0, ._631\n\ + ldr r0, ._631 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -2738,7 +2738,7 @@ void sub_80ECD80() ._583:\n\ mov r0, #0x1\n\ bl sub_80F2C80\n\ - ldr r1, ._635\n\ + ldr r1, ._635 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -2752,8 +2752,8 @@ void sub_80ECD80() lsr r2, r0, #0x18\n\ cmp r2, #0\n\ bne ._642 @cond_branch\n\ - ldr r0, ._635\n\ - ldr r3, ._635 + 4\n\ + ldr r0, ._635 @ gSharedMem\n\ + ldr r3, ._635 + 4 @ 0x306\n\ add r1, r0, r3\n\ strh r2, [r1]\n\ mov r1, #0xc1\n\ @@ -2771,7 +2771,7 @@ void sub_80ECD80() ._585:\n\ mov r0, #0x5\n\ bl sub_80F2C80\n\ - ldr r1, ._639\n\ + ldr r1, ._639 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -2786,7 +2786,7 @@ void sub_80ECD80() bne ._642 @cond_branch\n\ bl sub_80F1DF0\n\ ._625:\n\ - ldr r1, ._639\n\ + ldr r1, ._639 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -2804,20 +2804,20 @@ void sub_80ECD80() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._642 @cond_branch\n\ - ldr r0, ._643\n\ - ldr r1, ._643 + 4\n\ + ldr r0, ._643 @ gSharedMem\n\ + ldr r1, ._643 + 4 @ 0x6dad\n\ add r0, r0, r1\n\ ldrb r1, [r0]\n\ mov r0, #0x2\n\ bl sub_80EF428\n\ - ldr r0, ._643 + 8\n\ + ldr r0, ._643 + 8 @ sub_80ECC08\n\ bl sub_80EBDBC\n\ - ldr r0, ._643 + 12\n\ + ldr r0, ._643 + 12 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._642 @cond_branch\n\ - ldr r0, ._643 + 16\n\ - ldr r2, ._643 + 20\n\ + ldr r0, ._643 + 16 @ 0x6007de0\n\ + ldr r2, ._643 + 20 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -2952,7 +2952,7 @@ void sub_80ED01C() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._647\n\ + ldr r1, ._647 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -2963,7 +2963,7 @@ void sub_80ED01C() b ._736\n\ ._645:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._647 + 4\n\ + ldr r1, ._647 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -2999,7 +2999,7 @@ void sub_80ED01C() bl sub_80F2D04\n\ mov r0, #0x5\n\ bl sub_80F2D04\n\ - ldr r1, ._671\n\ + ldr r1, ._671 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -3017,7 +3017,7 @@ void sub_80ED01C() ._673:\n\ mov r0, #0x0\n\ bl sub_80EEFBC\n\ - ldr r1, ._676\n\ + ldr r1, ._676 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3034,7 +3034,7 @@ void sub_80ED01C() beq ._678 @cond_branch\n\ b ._736\n\ ._678:\n\ - ldr r4, ._681\n\ + ldr r4, ._681 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -3054,7 +3054,7 @@ void sub_80ED01C() ._681:\n\ .word gSharedMem\n\ ._653:\n\ - ldr r0, ._686\n\ + ldr r0, ._686 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -3066,7 +3066,7 @@ void sub_80ED01C() bl SetVBlankCallback\n\ bl sub_80EED0C\n\ bl sub_80EF814\n\ - ldr r1, ._686 + 4\n\ + ldr r1, ._686 + 4 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -3078,7 +3078,7 @@ void sub_80ED01C() .word gSharedMem\n\ ._654:\n\ bl sub_80F2620\n\ - ldr r1, ._689\n\ + ldr r1, ._689 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3089,7 +3089,7 @@ void sub_80ED01C() .word gSharedMem\n\ ._655:\n\ bl sub_80F4D44\n\ - ldr r1, ._693\n\ + ldr r1, ._693 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -3101,7 +3101,7 @@ void sub_80ED01C() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._691 @cond_branch\n\ - ldr r1, ._693\n\ + ldr r1, ._693 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -3114,7 +3114,7 @@ void sub_80ED01C() ._693:\n\ .word gSharedMem\n\ ._691:\n\ - ldr r1, ._696\n\ + ldr r1, ._696 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3129,7 +3129,7 @@ void sub_80ED01C() beq ._698 @cond_branch\n\ b ._736\n\ ._698:\n\ - ldr r1, ._701\n\ + ldr r1, ._701 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -3147,7 +3147,7 @@ void sub_80ED01C() beq ._703 @cond_branch\n\ b ._736\n\ ._703:\n\ - ldr r1, ._706\n\ + ldr r1, ._706 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -3159,7 +3159,7 @@ void sub_80ED01C() ._659:\n\ mov r0, #0x0\n\ bl sub_80F0264\n\ - ldr r1, ._711\n\ + ldr r1, ._711 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3173,7 +3173,7 @@ void sub_80ED01C() beq ._708 @cond_branch\n\ b ._736\n\ ._708:\n\ - ldr r1, ._711\n\ + ldr r1, ._711 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -3185,7 +3185,7 @@ void sub_80ED01C() ._661:\n\ mov r0, #0x0\n\ bl sub_80F3008\n\ - ldr r1, ._714\n\ + ldr r1, ._714 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -3200,7 +3200,7 @@ void sub_80ED01C() beq ._716 @cond_branch\n\ b ._736\n\ ._716:\n\ - ldr r1, ._719\n\ + ldr r1, ._719 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3221,7 +3221,7 @@ void sub_80ED01C() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._722\n\ + ldr r0, ._722 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ @@ -3234,7 +3234,7 @@ void sub_80ED01C() ._664:\n\ mov r0, #0x4\n\ bl sub_80EED2C\n\ - ldr r1, ._725\n\ + ldr r1, ._725 @ gSharedMem\n\ mov r3, #0xc1\n\ lsl r3, r3, #0x2\n\ add r1, r1, r3\n\ @@ -3244,7 +3244,7 @@ void sub_80ED01C() ._725:\n\ .word gSharedMem\n\ ._665:\n\ - ldr r0, ._729\n\ + ldr r0, ._729 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -3252,7 +3252,7 @@ void sub_80ED01C() lsr r1, r0, #0x18\n\ cmp r1, #0\n\ bne ._736 @cond_branch\n\ - ldr r2, ._729 + 4\n\ + ldr r2, ._729 + 4 @ 0x306\n\ add r0, r4, r2\n\ strh r1, [r0]\n\ mov r3, #0xc1\n\ @@ -3271,7 +3271,7 @@ void sub_80ED01C() ._666:\n\ mov r0, #0x1\n\ bl sub_80F2C80\n\ - ldr r1, ._733\n\ + ldr r1, ._733 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3285,8 +3285,8 @@ void sub_80ED01C() lsr r2, r0, #0x18\n\ cmp r2, #0\n\ bne ._736 @cond_branch\n\ - ldr r0, ._733\n\ - ldr r3, ._733 + 4\n\ + ldr r0, ._733 @ gSharedMem\n\ + ldr r3, ._733 + 4 @ 0x306\n\ add r1, r0, r3\n\ strh r2, [r1]\n\ mov r1, #0xc1\n\ @@ -3302,8 +3302,8 @@ void sub_80ED01C() .word gSharedMem\n\ .word 0x306\n\ ._668:\n\ - ldr r4, ._737\n\ - ldr r2, ._737 + 4\n\ + ldr r4, ._737 @ gSharedMem\n\ + ldr r2, ._737 + 4 @ 0x6dfc\n\ add r0, r4, r2\n\ ldrb r0, [r0]\n\ add r0, r0, #0x7\n\ @@ -3317,8 +3317,8 @@ void sub_80ED01C() add r0, r0, #0x1\n\ strh r0, [r4]\n\ ._669:\n\ - ldr r0, ._737\n\ - ldr r1, ._737 + 4\n\ + ldr r0, ._737 @ gSharedMem\n\ + ldr r1, ._737 + 4 @ 0x6dfc\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ add r0, r0, #0x7\n\ @@ -3328,14 +3328,14 @@ void sub_80ED01C() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._736 @cond_branch\n\ - ldr r0, ._737 + 8\n\ + ldr r0, ._737 + 8 @ sub_80ED31C\n\ bl sub_80EBDBC\n\ - ldr r0, ._737 + 12\n\ + ldr r0, ._737 + 12 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._736 @cond_branch\n\ - ldr r0, ._737 + 16\n\ - ldr r2, ._737 + 20\n\ + ldr r0, ._737 + 16 @ 0x6007de0\n\ + ldr r2, ._737 + 20 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -3472,7 +3472,7 @@ void sub_80ED31C() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._743\n\ + ldr r0, ._743 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r4, r0, r1\n\ @@ -3500,7 +3500,7 @@ void sub_80ED31C() beq ._747 @cond_branch\n\ cmp r0, #0x2\n\ beq ._748 @cond_branch\n\ - ldr r0, ._751\n\ + ldr r0, ._751 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -3508,7 +3508,7 @@ void sub_80ED31C() beq ._749 @cond_branch\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._751 + 4\n\ + ldr r0, ._751 + 4 @ sub_80ED4D8\n\ bl sub_80EBDBC\n\ b ._762\n\ ._752:\n\ @@ -3535,7 +3535,7 @@ void sub_80ED31C() beq ._761 @cond_branch\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._757\n\ + ldr r0, ._757 @ sub_80ECD80\n\ bl sub_80EBDBC\n\ b ._762\n\ ._758:\n\ @@ -3559,12 +3559,12 @@ void sub_80ED31C() ._760:\n\ strh r0, [r4]\n\ ._761:\n\ - ldr r0, ._763\n\ + ldr r0, ._763 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._762 @cond_branch\n\ - ldr r0, ._763 + 4\n\ - ldr r1, ._763 + 8\n\ + ldr r0, ._763 + 4 @ gLink\n\ + ldr r1, ._763 + 8 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x4\n\ @@ -3638,7 +3638,7 @@ void sub_80ED3D0() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._767\n\ + ldr r0, ._767 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -3648,7 +3648,7 @@ void sub_80ED3D0() b ._803\n\ ._765:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._767 + 4\n\ + ldr r1, ._767 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -3670,7 +3670,7 @@ void sub_80ED3D0() ._770:\n\ mov r0, #0x0\n\ bl SetVBlankCallback\n\ - ldr r1, ._780\n\ + ldr r1, ._780 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3682,7 +3682,7 @@ void sub_80ED3D0() ._771:\n\ bl sub_80EED0C\n\ bl sub_80F6134\n\ - ldr r1, ._783\n\ + ldr r1, ._783 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3694,7 +3694,7 @@ void sub_80ED3D0() ._772:\n\ mov r0, #0x0\n\ bl sub_80EEFBC\n\ - ldr r1, ._786\n\ + ldr r1, ._786 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3706,7 +3706,7 @@ void sub_80ED3D0() ._773:\n\ mov r0, #0x0\n\ bl sub_80F0264\n\ - ldr r1, ._790\n\ + ldr r1, ._790 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3718,7 +3718,7 @@ void sub_80ED3D0() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._803 @cond_branch\n\ - ldr r1, ._790\n\ + ldr r1, ._790 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3731,7 +3731,7 @@ void sub_80ED3D0() bl sub_8055870\n\ cmp r0, #0\n\ bne ._803 @cond_branch\n\ - ldr r1, ._794\n\ + ldr r1, ._794 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3743,7 +3743,7 @@ void sub_80ED3D0() ._776:\n\ mov r0, #0x0\n\ bl sub_80F3008\n\ - ldr r4, ._797\n\ + ldr r4, ._797 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -3755,7 +3755,7 @@ void sub_80ED3D0() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._797 + 4\n\ + ldr r0, ._797 + 4 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ @@ -3773,19 +3773,19 @@ void sub_80ED3D0() ._777:\n\ mov r0, #0x4\n\ bl sub_80EED2C\n\ - ldr r1, ._801\n\ + ldr r1, ._801 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ ldrh r0, [r1]\n\ add r0, r0, #0x1\n\ strh r0, [r1]\n\ - ldr r0, ._801 + 4\n\ + ldr r0, ._801 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._803 @cond_branch\n\ - ldr r0, ._801 + 8\n\ - ldr r2, ._801 + 12\n\ + ldr r0, ._801 + 8 @ 0x6007de0\n\ + ldr r2, ._801 + 12 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -3798,13 +3798,13 @@ void sub_80ED3D0() .word 0x6007de0\n\ .word 0x600f800\n\ ._778:\n\ - ldr r0, ._804\n\ + ldr r0, ._804 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ cmp r0, #0\n\ bne ._803 @cond_branch\n\ - ldr r0, ._804 + 4\n\ + ldr r0, ._804 + 4 @ sub_80ED31C\n\ bl sub_80EBDBC\n\ ._803:\n\ add sp, sp, #0x4\n\ @@ -3872,7 +3872,7 @@ void sub_80ED4D8() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._808\n\ + ldr r1, ._808 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -3883,7 +3883,7 @@ void sub_80ED4D8() b ._844\n\ ._806:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._808 + 4\n\ + ldr r1, ._808 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -3915,7 +3915,7 @@ void sub_80ED4D8() bl BeginNormalPaletteFade\n\ b ._820\n\ ._812:\n\ - ldr r0, ._824\n\ + ldr r0, ._824 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -3927,7 +3927,7 @@ void sub_80ED4D8() bl SetVBlankCallback\n\ bl sub_80EED0C\n\ bl sub_80F3130\n\ - ldr r1, ._824 + 4\n\ + ldr r1, ._824 + 4 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3941,7 +3941,7 @@ void sub_80ED4D8() bl sub_8055870\n\ cmp r0, #0\n\ bne ._844 @cond_branch\n\ - ldr r1, ._828\n\ + ldr r1, ._828 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -3952,7 +3952,7 @@ void sub_80ED4D8() .word gSharedMem\n\ ._814:\n\ bl sub_80F4CF0\n\ - ldr r1, ._831\n\ + ldr r1, ._831 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3963,7 +3963,7 @@ void sub_80ED4D8() .word gSharedMem\n\ ._815:\n\ bl sub_80EFF34\n\ - ldr r1, ._835\n\ + ldr r1, ._835 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -3975,7 +3975,7 @@ void sub_80ED4D8() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._844 @cond_branch\n\ - ldr r1, ._835\n\ + ldr r1, ._835 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -3988,7 +3988,7 @@ void sub_80ED4D8() bl sub_80F35B4\n\ mov r0, #0x2\n\ bl sub_80EEFBC\n\ - ldr r4, ._838\n\ + ldr r4, ._838 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -4000,7 +4000,7 @@ void sub_80ED4D8() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._838 + 4\n\ + ldr r0, ._838 + 4 @ sub_80EBD4C\n\ bl SetVBlankCallback\n\ ._820:\n\ mov r2, #0xc1\n\ @@ -4019,19 +4019,19 @@ void sub_80ED4D8() ._818:\n\ mov r0, #0x2\n\ bl sub_80EED2C\n\ - ldr r1, ._842\n\ + ldr r1, ._842 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ ldrh r0, [r1]\n\ add r0, r0, #0x1\n\ strh r0, [r1]\n\ - ldr r0, ._842 + 4\n\ + ldr r0, ._842 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._844 @cond_branch\n\ - ldr r0, ._842 + 8\n\ - ldr r2, ._842 + 12\n\ + ldr r0, ._842 + 8 @ 0x6007de0\n\ + ldr r2, ._842 + 12 @ 0x600f000\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -4044,13 +4044,13 @@ void sub_80ED4D8() .word 0x6007de0\n\ .word 0x600f000\n\ ._819:\n\ - ldr r0, ._845\n\ + ldr r0, ._845 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ cmp r0, #0\n\ bne ._844 @cond_branch\n\ - ldr r0, ._845 + 4\n\ + ldr r0, ._845 + 4 @ sub_80ED858\n\ bl sub_80EBDBC\n\ ._844:\n\ add sp, sp, #0x4\n\ @@ -4123,7 +4123,7 @@ void sub_80ED620() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._849\n\ + ldr r1, ._849 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -4134,7 +4134,7 @@ void sub_80ED620() b ._912\n\ ._847:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._849 + 4\n\ + ldr r1, ._849 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -4165,7 +4165,7 @@ void sub_80ED620() bl sub_80F1E84\n\ mov r0, #0x1\n\ bl sub_80F2D04\n\ - ldr r1, ._870\n\ + ldr r1, ._870 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -4192,7 +4192,7 @@ void sub_80ED620() beq ._875 @cond_branch\n\ b ._912\n\ ._875:\n\ - ldr r4, ._878\n\ + ldr r4, ._878 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -4212,7 +4212,7 @@ void sub_80ED620() ._878:\n\ .word gSharedMem\n\ ._855:\n\ - ldr r0, ._883\n\ + ldr r0, ._883 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -4226,8 +4226,8 @@ void sub_80ED620() bl SetVBlankCallback\n\ bl sub_80EED0C\n\ bl sub_80EF814\n\ - ldr r0, ._883 + 4\n\ - ldr r2, ._883 + 8\n\ + ldr r0, ._883 + 4 @ gSharedMem\n\ + ldr r2, ._883 + 8 @ 0x76aa\n\ add r1, r0, r2\n\ strb r4, [r1]\n\ mov r1, #0xc1\n\ @@ -4247,7 +4247,7 @@ void sub_80ED620() bl sub_80F2620\n\ b ._885\n\ ._857:\n\ - ldr r0, ._887\n\ + ldr r0, ._887 @ 0xd162\n\ add r1, r4, r0\n\ mov r0, #0x2\n\ strb r0, [r1]\n\ @@ -4262,7 +4262,7 @@ void sub_80ED620() .word 0xd162\n\ ._858:\n\ bl sub_80EFF34\n\ - ldr r1, ._890\n\ + ldr r1, ._890 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -4280,7 +4280,7 @@ void sub_80ED620() bl sub_8055870\n\ cmp r0, #0\n\ bne ._912 @cond_branch\n\ - ldr r1, ._894\n\ + ldr r1, ._894 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -4294,7 +4294,7 @@ void sub_80ED620() b ._896\n\ ._862:\n\ bl sub_80F33A8\n\ - ldr r4, ._898\n\ + ldr r4, ._898 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -4306,7 +4306,7 @@ void sub_80ED620() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._898 + 4\n\ + ldr r0, ._898 + 4 @ sub_80EBD4C\n\ bl SetVBlankCallback\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ @@ -4320,7 +4320,7 @@ void sub_80ED620() ._863:\n\ mov r0, #0x2\n\ bl sub_80EED2C\n\ - ldr r1, ._901\n\ + ldr r1, ._901 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -4330,7 +4330,7 @@ void sub_80ED620() ._901:\n\ .word gSharedMem\n\ ._864:\n\ - ldr r0, ._905\n\ + ldr r0, ._905 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -4347,7 +4347,7 @@ void sub_80ED620() ._865:\n\ mov r0, #0x1\n\ bl sub_80F2C80\n\ - ldr r1, ._909\n\ + ldr r1, ._909 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -4363,7 +4363,7 @@ void sub_80ED620() cmp r0, #0\n\ bne ._912 @cond_branch\n\ ._885:\n\ - ldr r1, ._909\n\ + ldr r1, ._909 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -4379,7 +4379,7 @@ void sub_80ED620() ._867:\n\ mov r0, #0x6\n\ bl sub_80F2C80\n\ - ldr r1, ._913\n\ + ldr r1, ._913 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -4392,14 +4392,14 @@ void sub_80ED620() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._912 @cond_branch\n\ - ldr r0, ._913 + 4\n\ + ldr r0, ._913 + 4 @ sub_80ED858\n\ bl sub_80EBDBC\n\ - ldr r0, ._913 + 8\n\ + ldr r0, ._913 + 8 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._912 @cond_branch\n\ - ldr r0, ._913 + 12\n\ - ldr r2, ._913 + 16\n\ + ldr r0, ._913 + 12 @ 0x6007de0\n\ + ldr r2, ._913 + 16 @ 0x600f000\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -4684,7 +4684,7 @@ void sub_80ED858() asm("\ push {r4, r5, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._917\n\ + ldr r1, ._917 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -4695,7 +4695,7 @@ void sub_80ED858() b ._999\n\ ._915:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._917 + 4\n\ + ldr r1, ._917 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -4720,7 +4720,7 @@ void sub_80ED858() ._920:\n\ bl sub_80F4F78\n\ bl sub_80F5B38\n\ - ldr r0, ._933\n\ + ldr r0, ._933 @ gSharedMem\n\ mov r4, #0xc1\n\ lsl r4, r4, #0x2\n\ add r0, r0, r4\n\ @@ -4738,7 +4738,7 @@ void sub_80ED858() beq ._935 @cond_branch\n\ b ._999\n\ ._935:\n\ - ldr r0, ._938\n\ + ldr r0, ._938 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -4752,7 +4752,7 @@ void sub_80ED858() ._922:\n\ mov r0, #0x1\n\ bl sub_80F0174\n\ - ldr r0, ._941\n\ + ldr r0, ._941 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r0, r2\n\ @@ -4774,24 +4774,24 @@ void sub_80ED858() bl sub_80F3D00\n\ b ._945\n\ ._924:\n\ - ldr r2, ._951\n\ + ldr r2, ._951 @ gMain\n\ ldrh r1, [r2, #0x2c]\n\ mov r0, #0x40\n\ and r0, r0, r1\n\ add r3, r2, #0\n\ cmp r0, #0\n\ beq ._949 @cond_branch\n\ - ldr r1, ._951 + 4\n\ + ldr r1, ._951 + 4 @ 0x87cb\n\ add r0, r5, r1\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._949 @cond_branch\n\ - ldr r2, ._951 + 8\n\ + ldr r2, ._951 + 8 @ 0x76aa\n\ add r0, r5, r2\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._948 @cond_branch\n\ - ldr r4, ._951 + 12\n\ + ldr r4, ._951 + 12 @ 0x87dc\n\ add r0, r5, r4\n\ mov r1, #0x0\n\ ldsh r0, [r0, r1]\n\ @@ -4820,17 +4820,17 @@ void sub_80ED858() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._956 @cond_branch\n\ - ldr r4, ._958\n\ + ldr r4, ._958 @ 0x87cb\n\ add r0, r5, r4\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._956 @cond_branch\n\ - ldr r1, ._958 + 4\n\ + ldr r1, ._958 + 4 @ 0x76aa\n\ add r0, r5, r1\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._955 @cond_branch\n\ - ldr r2, ._958 + 8\n\ + ldr r2, ._958 + 8 @ 0x87dc\n\ add r0, r5, r2\n\ sub r4, r4, #0x57\n\ add r1, r5, r4\n\ @@ -4869,7 +4869,7 @@ void sub_80ED858() bl PlaySE\n\ bl sub_80F4FDC\n\ bl move_anim_execute\n\ - ldr r0, ._962\n\ + ldr r0, ._962 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -4888,16 +4888,16 @@ void sub_80ED858() b ._999\n\ ._964:\n\ add r4, r5, #0\n\ - ldr r2, ._970\n\ + ldr r2, ._970 @ 0x76aa\n\ add r0, r4, r2\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ bne ._966 @cond_branch\n\ - ldr r1, ._970 + 4\n\ + ldr r1, ._970 + 4 @ 0x87dc\n\ add r0, r4, r1\n\ mov r2, #0x0\n\ ldsh r1, [r0, r2]\n\ - ldr r2, ._970 + 8\n\ + ldr r2, ._970 + 8 @ 0x87da\n\ add r0, r4, r2\n\ mov r2, #0x0\n\ ldsh r0, [r0, r2]\n\ @@ -4921,7 +4921,7 @@ void sub_80ED858() .word 0x87dc\n\ .word 0x87da\n\ ._966:\n\ - ldr r1, ._975\n\ + ldr r1, ._975 @ 0x6dac\n\ add r0, r5, r1\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ @@ -4948,7 +4948,7 @@ void sub_80ED858() b ._999\n\ ._977:\n\ bl sub_80F3D00\n\ - ldr r0, ._980\n\ + ldr r0, ._980 @ gSharedMem\n\ mov r4, #0xc1\n\ lsl r4, r4, #0x2\n\ add r0, r0, r4\n\ @@ -4963,7 +4963,7 @@ void sub_80ED858() bl sub_8055870\n\ cmp r0, #0\n\ bne ._999 @cond_branch\n\ - ldr r0, ._984\n\ + ldr r0, ._984 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -4976,7 +4976,7 @@ void sub_80ED858() mov r0, #0x3\n\ bl sub_80EEFBC\n\ bl sub_80F3668\n\ - ldr r0, ._987\n\ + ldr r0, ._987 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r0, r2\n\ @@ -4996,7 +4996,7 @@ void sub_80ED858() bl sub_80EEFBC\n\ bl sub_80F3698\n\ ._945:\n\ - ldr r0, ._991\n\ + ldr r0, ._991 @ gSharedMem\n\ mov r4, #0xc1\n\ lsl r4, r4, #0x2\n\ add r0, r0, r4\n\ @@ -5017,7 +5017,7 @@ void sub_80ED858() mov r0, #0x0\n\ bl sub_80F0174\n\ bl sub_80F2F48\n\ - ldr r5, ._995\n\ + ldr r5, ._995 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r5, r1\n\ @@ -5039,7 +5039,7 @@ void sub_80ED858() ._995:\n\ .word gSharedMem\n\ ._931:\n\ - ldr r0, ._1000\n\ + ldr r0, ._1000 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -5047,8 +5047,8 @@ void sub_80ED858() bne ._999 @cond_branch\n\ bl sub_80F3CE8\n\ bl sub_80F5BDC\n\ - ldr r0, ._1000 + 4\n\ - ldr r4, ._1000 + 8\n\ + ldr r0, ._1000 + 4 @ gSharedMem\n\ + ldr r4, ._1000 + 8 @ 0x76aa\n\ add r0, r0, r4\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ @@ -5058,7 +5058,7 @@ void sub_80ED858() bl sub_80F2D6C\n\ mov r0, #0x6\n\ bl sub_80F2D6C\n\ - ldr r0, ._1000 + 12\n\ + ldr r0, ._1000 + 12 @ sub_80ECA10\n\ bl sub_80EBDBC\n\ b ._999\n\ ._1001:\n\ @@ -5070,15 +5070,15 @@ void sub_80ED858() .word sub_80ECA10+1\n\ ._998:\n\ bl sub_80F3614\n\ - ldr r0, ._1003\n\ + ldr r0, ._1003 @ sub_80ED3D0\n\ bl sub_80EBDBC\n\ ._999:\n\ - ldr r0, ._1003 + 4\n\ + ldr r0, ._1003 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1002 @cond_branch\n\ - ldr r0, ._1003 + 8\n\ - ldr r1, ._1003 + 12\n\ + ldr r0, ._1003 + 8 @ gLink\n\ + ldr r1, ._1003 + 12 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x4\n\ @@ -5483,7 +5483,7 @@ void sub_80EDB88() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._1007\n\ + ldr r1, ._1007 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -5494,7 +5494,7 @@ void sub_80EDB88() b ._1088\n\ ._1005:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._1007 + 4\n\ + ldr r1, ._1007 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -5526,7 +5526,7 @@ void sub_80EDB88() bl sub_80F1E84\n\ mov r0, #0x0\n\ bl sub_80F2D04\n\ - ldr r1, ._1029\n\ + ldr r1, ._1029 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -5544,7 +5544,7 @@ void sub_80EDB88() ._1031:\n\ mov r0, #0x4\n\ bl sub_80EEFBC\n\ - ldr r1, ._1034\n\ + ldr r1, ._1034 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -5561,7 +5561,7 @@ void sub_80EDB88() beq ._1036 @cond_branch\n\ b ._1088\n\ ._1036:\n\ - ldr r4, ._1039\n\ + ldr r4, ._1039 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -5578,7 +5578,7 @@ void sub_80EDB88() ._1039:\n\ .word gSharedMem\n\ ._1013:\n\ - ldr r0, ._1044\n\ + ldr r0, ._1044 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -5590,7 +5590,7 @@ void sub_80EDB88() bl SetVBlankCallback\n\ bl sub_80EED0C\n\ bl sub_80EF814\n\ - ldr r1, ._1044 + 4\n\ + ldr r1, ._1044 + 4 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -5602,7 +5602,7 @@ void sub_80EDB88() .word gSharedMem\n\ ._1014:\n\ bl sub_80F2620\n\ - ldr r1, ._1047\n\ + ldr r1, ._1047 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -5613,7 +5613,7 @@ void sub_80EDB88() .word gSharedMem\n\ ._1015:\n\ bl sub_80F638C\n\ - ldr r1, ._1051\n\ + ldr r1, ._1051 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -5625,7 +5625,7 @@ void sub_80EDB88() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1049 @cond_branch\n\ - ldr r1, ._1051\n\ + ldr r1, ._1051 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -5638,7 +5638,7 @@ void sub_80EDB88() ._1051:\n\ .word gSharedMem\n\ ._1049:\n\ - ldr r1, ._1054\n\ + ldr r1, ._1054 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -5653,7 +5653,7 @@ void sub_80EDB88() beq ._1056 @cond_branch\n\ b ._1088\n\ ._1056:\n\ - ldr r1, ._1059\n\ + ldr r1, ._1059 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -5671,7 +5671,7 @@ void sub_80EDB88() beq ._1061 @cond_branch\n\ b ._1088\n\ ._1061:\n\ - ldr r1, ._1064\n\ + ldr r1, ._1064 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -5683,7 +5683,7 @@ void sub_80EDB88() ._1019:\n\ mov r0, #0x1\n\ bl sub_80F0264\n\ - ldr r1, ._1068\n\ + ldr r1, ._1068 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -5695,7 +5695,7 @@ void sub_80EDB88() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1088 @cond_branch\n\ - ldr r1, ._1068\n\ + ldr r1, ._1068 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -5707,7 +5707,7 @@ void sub_80EDB88() ._1021:\n\ mov r0, #0x2\n\ bl sub_80F2C80\n\ - ldr r1, ._1072\n\ + ldr r1, ._1072 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -5720,7 +5720,7 @@ void sub_80EDB88() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1088 @cond_branch\n\ - ldr r1, ._1072\n\ + ldr r1, ._1072 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -5732,7 +5732,7 @@ void sub_80EDB88() ._1023:\n\ mov r0, #0x1\n\ bl sub_80F3008\n\ - ldr r1, ._1075\n\ + ldr r1, ._1075 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -5745,7 +5745,7 @@ void sub_80EDB88() bl sub_8055870\n\ cmp r0, #0\n\ bne ._1088 @cond_branch\n\ - ldr r1, ._1079\n\ + ldr r1, ._1079 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -5766,7 +5766,7 @@ void sub_80EDB88() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._1082\n\ + ldr r0, ._1082 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ ._1038:\n\ mov r2, #0xc1\n\ @@ -5784,19 +5784,19 @@ void sub_80EDB88() ._1026:\n\ mov r0, #0x4\n\ bl sub_80EED2C\n\ - ldr r1, ._1086\n\ + ldr r1, ._1086 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ ldrh r0, [r1]\n\ add r0, r0, #0x1\n\ strh r0, [r1]\n\ - ldr r0, ._1086 + 4\n\ + ldr r0, ._1086 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1088 @cond_branch\n\ - ldr r0, ._1086 + 8\n\ - ldr r2, ._1086 + 12\n\ + ldr r0, ._1086 + 8 @ 0x6007de0\n\ + ldr r2, ._1086 + 12 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -5809,13 +5809,13 @@ void sub_80EDB88() .word 0x6007de0\n\ .word 0x600f800\n\ ._1027:\n\ - ldr r0, ._1089\n\ + ldr r0, ._1089 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ cmp r0, #0\n\ bne ._1088 @cond_branch\n\ - ldr r0, ._1089 + 4\n\ + ldr r0, ._1089 + 4 @ sub_80EDDBC\n\ bl sub_80EBDBC\n\ ._1088:\n\ add sp, sp, #0x4\n\ @@ -5928,7 +5928,7 @@ void sub_80EDDBC() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._1095\n\ + ldr r0, ._1095 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r4, r0, r1\n\ @@ -5956,7 +5956,7 @@ void sub_80EDDBC() beq ._1099 @cond_branch\n\ cmp r0, #0x2\n\ beq ._1100 @cond_branch\n\ - ldr r0, ._1103\n\ + ldr r0, ._1103 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -5964,7 +5964,7 @@ void sub_80EDDBC() beq ._1101 @cond_branch\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._1103 + 4\n\ + ldr r0, ._1103 + 4 @ sub_80EDEE4\n\ bl sub_80EBDBC\n\ b ._1114\n\ ._1104:\n\ @@ -5991,7 +5991,7 @@ void sub_80EDDBC() beq ._1113 @cond_branch\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._1109\n\ + ldr r0, ._1109 @ sub_80EDE70\n\ bl sub_80EBDBC\n\ b ._1114\n\ ._1110:\n\ @@ -6015,12 +6015,12 @@ void sub_80EDDBC() ._1112:\n\ strh r0, [r4]\n\ ._1113:\n\ - ldr r0, ._1115\n\ + ldr r0, ._1115 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1114 @cond_branch\n\ - ldr r0, ._1115 + 4\n\ - ldr r1, ._1115 + 8\n\ + ldr r0, ._1115 + 4 @ gLink\n\ + ldr r1, ._1115 + 8 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x4\n\ @@ -6118,7 +6118,7 @@ void sub_80EDEE4() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._1134\n\ + ldr r1, ._1134 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -6129,7 +6129,7 @@ void sub_80EDEE4() b ._1180\n\ ._1132:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._1134 + 4\n\ + ldr r1, ._1134 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -6163,7 +6163,7 @@ void sub_80EDEE4() bl BeginNormalPaletteFade\n\ b ._1169\n\ ._1138:\n\ - ldr r0, ._1152\n\ + ldr r0, ._1152 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -6175,7 +6175,7 @@ void sub_80EDEE4() bl SetVBlankCallback\n\ bl sub_80EED0C\n\ bl sub_80F3130\n\ - ldr r1, ._1152 + 4\n\ + ldr r1, ._1152 + 4 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -6188,7 +6188,7 @@ void sub_80EDEE4() ._1139:\n\ bl sub_80F66E0\n\ bl sub_80EEE08\n\ - ldr r1, ._1155\n\ + ldr r1, ._1155 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -6202,7 +6202,7 @@ void sub_80EDEE4() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1180 @cond_branch\n\ - ldr r1, ._1159\n\ + ldr r1, ._1159 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -6215,7 +6215,7 @@ void sub_80EDEE4() mov r0, #0x5\n\ bl sub_80EEFBC\n\ bl sub_80F38B8\n\ - ldr r1, ._1163\n\ + ldr r1, ._1163 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -6227,7 +6227,7 @@ void sub_80EDEE4() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1180 @cond_branch\n\ - ldr r1, ._1163\n\ + ldr r1, ._1163 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -6240,7 +6240,7 @@ void sub_80EDEE4() bl sub_8055870\n\ cmp r0, #0\n\ bne ._1180 @cond_branch\n\ - ldr r1, ._1167\n\ + ldr r1, ._1167 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -6261,7 +6261,7 @@ void sub_80EDEE4() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._1170\n\ + ldr r0, ._1170 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ b ._1169\n\ ._1171:\n\ @@ -6271,19 +6271,19 @@ void sub_80EDEE4() ._1145:\n\ mov r0, #0x3\n\ bl sub_80EED2C\n\ - ldr r1, ._1174\n\ + ldr r1, ._1174 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ ldrh r0, [r1]\n\ add r0, r0, #0x1\n\ strh r0, [r1]\n\ - ldr r0, ._1174 + 4\n\ + ldr r0, ._1174 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1180 @cond_branch\n\ - ldr r0, ._1174 + 8\n\ - ldr r2, ._1174 + 12\n\ + ldr r0, ._1174 + 8 @ 0x6007de0\n\ + ldr r2, ._1174 + 12 @ 0x600f000\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -6296,7 +6296,7 @@ void sub_80EDEE4() .word 0x6007de0\n\ .word 0x600f000\n\ ._1146:\n\ - ldr r0, ._1178\n\ + ldr r0, ._1178 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -6320,7 +6320,7 @@ void sub_80EDEE4() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1180 @cond_branch\n\ - ldr r0, ._1181\n\ + ldr r0, ._1181 @ sub_80EE06C\n\ bl sub_80EBDBC\n\ ._1180:\n\ add sp, sp, #0x4\n\ @@ -6399,7 +6399,7 @@ void sub_80EE06C() asm("\ push {r4, r5, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._1185\n\ + ldr r1, ._1185 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -6410,7 +6410,7 @@ void sub_80EE06C() b ._1248\n\ ._1183:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._1185 + 4\n\ + ldr r1, ._1185 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -6431,7 +6431,7 @@ void sub_80EE06C() .word ._1196\n\ ._1188:\n\ bl sub_80F15A8\n\ - ldr r1, ._1198\n\ + ldr r1, ._1198 @ gSharedMem\n\ mov r5, #0xc1\n\ lsl r5, r5, #0x2\n\ add r1, r1, r5\n\ @@ -6441,14 +6441,14 @@ void sub_80EE06C() ._1198:\n\ .word gSharedMem\n\ ._1189:\n\ - ldr r2, ._1203\n\ + ldr r2, ._1203 @ gMain\n\ ldrh r1, [r2, #0x30]\n\ mov r0, #0x40\n\ and r0, r0, r1\n\ add r3, r2, #0\n\ cmp r0, #0\n\ beq ._1201 @cond_branch\n\ - ldr r1, ._1203 + 4\n\ + ldr r1, ._1203 + 4 @ 0x87dc\n\ add r0, r4, r1\n\ mov r2, #0x0\n\ ldsh r0, [r0, r2]\n\ @@ -6474,9 +6474,9 @@ void sub_80EE06C() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._1206 @cond_branch\n\ - ldr r1, ._1208\n\ + ldr r1, ._1208 @ 0x87dc\n\ add r0, r4, r1\n\ - ldr r2, ._1208 + 4\n\ + ldr r2, ._1208 + 4 @ 0x8774\n\ add r1, r4, r2\n\ mov r5, #0x0\n\ ldsh r2, [r0, r5]\n\ @@ -6507,7 +6507,7 @@ void sub_80EE06C() bl PlaySE\n\ mov r0, #0xb\n\ bl sub_80EEFBC\n\ - ldr r0, ._1212\n\ + ldr r0, ._1212 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -6525,7 +6525,7 @@ void sub_80EE06C() ._1214:\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._1217\n\ + ldr r0, ._1217 @ sub_80EE294\n\ bl sub_80EBDBC\n\ b ._1248\n\ ._1218:\n\ @@ -6539,7 +6539,7 @@ void sub_80EE06C() beq ._1219 @cond_branch\n\ b ._1248\n\ ._1219:\n\ - ldr r1, ._1222\n\ + ldr r1, ._1222 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -6553,7 +6553,7 @@ void sub_80EE06C() add r1, r0, #0\n\ cmp r1, #0\n\ bne ._1248 @cond_branch\n\ - ldr r0, ._1226\n\ + ldr r0, ._1226 @ gSharedMem\n\ mov r5, #0xc1\n\ lsl r5, r5, #0x2\n\ add r0, r0, r5\n\ @@ -6565,7 +6565,7 @@ void sub_80EE06C() .word gSharedMem\n\ ._1192:\n\ bl sub_80F3B00\n\ - ldr r1, ._1229\n\ + ldr r1, ._1229 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -6584,7 +6584,7 @@ void sub_80EE06C() cmp r0, #0\n\ bne ._1248 @cond_branch\n\ bl sub_80F1494\n\ - ldr r1, ._1233\n\ + ldr r1, ._1233 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -6608,7 +6608,7 @@ void sub_80EE06C() mov r0, #0x5\n\ bl PlaySE\n\ bl sub_80F3B94\n\ - ldr r0, ._1238\n\ + ldr r0, ._1238 @ gSharedMem\n\ mov r5, #0xc1\n\ lsl r5, r5, #0x2\n\ add r0, r0, r5\n\ @@ -6620,7 +6620,7 @@ void sub_80EE06C() ._1238:\n\ .word gSharedMem\n\ ._1236:\n\ - ldr r0, ._1242\n\ + ldr r0, ._1242 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x2\n\ and r0, r0, r1\n\ @@ -6629,7 +6629,7 @@ void sub_80EE06C() mov r0, #0x5\n\ bl PlaySE\n\ bl sub_80F3B94\n\ - ldr r0, ._1242 + 4\n\ + ldr r0, ._1242 + 4 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -6646,7 +6646,7 @@ void sub_80EE06C() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1248 @cond_branch\n\ - ldr r0, ._1246\n\ + ldr r0, ._1246 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r0, r2\n\ @@ -6666,18 +6666,18 @@ void sub_80EE06C() bne ._1248 @cond_branch\n\ mov r0, #0x5\n\ bl sub_80EEFBC\n\ - ldr r0, ._1250\n\ + ldr r0, ._1250 @ gSharedMem\n\ mov r5, #0xc1\n\ lsl r5, r5, #0x2\n\ add r0, r0, r5\n\ strh r4, [r0]\n\ ._1248:\n\ - ldr r0, ._1250 + 4\n\ + ldr r0, ._1250 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1249 @cond_branch\n\ - ldr r0, ._1250 + 8\n\ - ldr r1, ._1250 + 12\n\ + ldr r0, ._1250 + 8 @ gLink\n\ + ldr r1, ._1250 + 12 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x4\n\ @@ -6794,7 +6794,7 @@ void sub_80EE294() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._1254\n\ + ldr r1, ._1254 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r0, r1, r2\n\ @@ -6805,7 +6805,7 @@ void sub_80EE294() b ._1288\n\ ._1252:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._1254 + 4\n\ + ldr r1, ._1254 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -6836,7 +6836,7 @@ void sub_80EE294() mov r3, #0x10\n\ b ._1266\n\ ._1258:\n\ - ldr r0, ._1270\n\ + ldr r0, ._1270 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -6849,7 +6849,7 @@ void sub_80EE294() bl sub_80EED0C\n\ bl sub_80F3C2C\n\ bl sub_80EEE08\n\ - ldr r1, ._1270 + 4\n\ + ldr r1, ._1270 + 4 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -6863,7 +6863,7 @@ void sub_80EE294() bl sub_80F6134\n\ mov r0, #0x1\n\ bl sub_80F0264\n\ - ldr r1, ._1274\n\ + ldr r1, ._1274 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -6875,7 +6875,7 @@ void sub_80EE294() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1288 @cond_branch\n\ - ldr r1, ._1274\n\ + ldr r1, ._1274 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -6889,9 +6889,9 @@ void sub_80EE294() bl sub_80EEFBC\n\ mov r0, #0x1\n\ bl sub_80F3008\n\ - ldr r0, ._1277\n\ + ldr r0, ._1277 @ sub_80EBD18\n\ bl SetVBlankCallback\n\ - ldr r1, ._1277 + 4\n\ + ldr r1, ._1277 + 4 @ gSharedMem\n\ mov r2, #0xc1\n\ lsl r2, r2, #0x2\n\ add r1, r1, r2\n\ @@ -6905,7 +6905,7 @@ void sub_80EE294() bl sub_8055870\n\ cmp r0, #0\n\ bne ._1288 @cond_branch\n\ - ldr r1, ._1281\n\ + ldr r1, ._1281 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -6938,19 +6938,19 @@ void sub_80EE294() ._1264:\n\ mov r0, #0x4\n\ bl sub_80EED2C\n\ - ldr r1, ._1286\n\ + ldr r1, ._1286 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ ldrh r0, [r1]\n\ add r0, r0, #0x1\n\ strh r0, [r1]\n\ - ldr r0, ._1286 + 4\n\ + ldr r0, ._1286 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1288 @cond_branch\n\ - ldr r0, ._1286 + 8\n\ - ldr r2, ._1286 + 12\n\ + ldr r0, ._1286 + 8 @ 0x6007de0\n\ + ldr r2, ._1286 + 12 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -6963,13 +6963,13 @@ void sub_80EE294() .word 0x6007de0\n\ .word 0x600f800\n\ ._1265:\n\ - ldr r0, ._1289\n\ + ldr r0, ._1289 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ cmp r0, #0\n\ bne ._1288 @cond_branch\n\ - ldr r0, ._1289 + 4\n\ + ldr r0, ._1289 + 4 @ sub_80EDDBC\n\ bl sub_80EBDBC\n\ ._1288:\n\ add sp, sp, #0x4\n\ @@ -7042,7 +7042,7 @@ void sub_80EE3D8() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._1293\n\ + ldr r0, ._1293 @ gSharedMem\n\ mov r1, #0xc1\n\ lsl r1, r1, #0x2\n\ add r0, r0, r1\n\ @@ -7052,7 +7052,7 @@ void sub_80EE3D8() b ._1354\n\ ._1291:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._1293 + 4\n\ + ldr r1, ._1293 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -7080,7 +7080,7 @@ void sub_80EE3D8() bl sub_80F1E84\n\ mov r0, #0x0\n\ bl sub_80F2D04\n\ - ldr r1, ._1311\n\ + ldr r1, ._1311 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7098,7 +7098,7 @@ void sub_80EE3D8() ._1313:\n\ mov r0, #0x9\n\ bl sub_80EEFBC\n\ - ldr r1, ._1316\n\ + ldr r1, ._1316 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7115,7 +7115,7 @@ void sub_80EE3D8() beq ._1318 @cond_branch\n\ b ._1354\n\ ._1318:\n\ - ldr r4, ._1321\n\ + ldr r4, ._1321 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -7132,7 +7132,7 @@ void sub_80EE3D8() ._1321:\n\ .word gSharedMem\n\ ._1299:\n\ - ldr r0, ._1326\n\ + ldr r0, ._1326 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ @@ -7145,7 +7145,7 @@ void sub_80EE3D8() bl sub_80EED0C\n\ bl sub_80EF814\n\ bl sub_80EEE08\n\ - ldr r1, ._1326 + 4\n\ + ldr r1, ._1326 + 4 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7157,7 +7157,7 @@ void sub_80EE3D8() .word gSharedMem\n\ ._1300:\n\ bl sub_80F2620\n\ - ldr r1, ._1329\n\ + ldr r1, ._1329 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7169,7 +7169,7 @@ void sub_80EE3D8() ._1301:\n\ mov r0, #0x2\n\ bl sub_80F0264\n\ - ldr r1, ._1334\n\ + ldr r1, ._1334 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7183,7 +7183,7 @@ void sub_80EE3D8() beq ._1331 @cond_branch\n\ b ._1354\n\ ._1331:\n\ - ldr r1, ._1334\n\ + ldr r1, ._1334 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7195,7 +7195,7 @@ void sub_80EE3D8() ._1303:\n\ mov r0, #0x3\n\ bl sub_80F2C80\n\ - ldr r1, ._1338\n\ + ldr r1, ._1338 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7208,7 +7208,7 @@ void sub_80EE3D8() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1354 @cond_branch\n\ - ldr r1, ._1338\n\ + ldr r1, ._1338 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7220,7 +7220,7 @@ void sub_80EE3D8() ._1305:\n\ mov r0, #0x2\n\ bl sub_80F3008\n\ - ldr r1, ._1341\n\ + ldr r1, ._1341 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7233,7 +7233,7 @@ void sub_80EE3D8() bl sub_8055870\n\ cmp r0, #0\n\ bne ._1354 @cond_branch\n\ - ldr r1, ._1345\n\ + ldr r1, ._1345 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ @@ -7244,7 +7244,7 @@ void sub_80EE3D8() .word gSharedMem\n\ ._1307:\n\ bl sub_80F6F10\n\ - ldr r4, ._1348\n\ + ldr r4, ._1348 @ gSharedMem\n\ mov r1, #0xc2\n\ lsl r1, r1, #0x2\n\ add r0, r4, r1\n\ @@ -7256,7 +7256,7 @@ void sub_80EE3D8() mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r0, ._1348 + 4\n\ + ldr r0, ._1348 + 4 @ sub_80EBD68\n\ bl SetVBlankCallback\n\ ._1320:\n\ mov r0, #0xc1\n\ @@ -7275,19 +7275,19 @@ void sub_80EE3D8() ._1308:\n\ mov r0, #0x5\n\ bl sub_80EED2C\n\ - ldr r1, ._1352\n\ + ldr r1, ._1352 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r1, r1, r0\n\ ldrh r0, [r1]\n\ add r0, r0, #0x1\n\ strh r0, [r1]\n\ - ldr r0, ._1352 + 4\n\ + ldr r0, ._1352 + 4 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1354 @cond_branch\n\ - ldr r0, ._1352 + 8\n\ - ldr r2, ._1352 + 12\n\ + ldr r0, ._1352 + 8 @ 0x6007de0\n\ + ldr r2, ._1352 + 12 @ 0x600f800\n\ mov r1, #0x0\n\ mov r3, #0x4\n\ bl debug_sub_8008218\n\ @@ -7300,13 +7300,13 @@ void sub_80EE3D8() .word 0x6007de0\n\ .word 0x600f800\n\ ._1309:\n\ - ldr r0, ._1355\n\ + ldr r0, ._1355 @ gPaletteFade\n\ ldrb r1, [r0, #0x7]\n\ mov r0, #0x80\n\ and r0, r0, r1\n\ cmp r0, #0\n\ bne ._1354 @cond_branch\n\ - ldr r0, ._1355 + 4\n\ + ldr r0, ._1355 + 4 @ sub_80EE58C\n\ bl sub_80EBDBC\n\ ._1354:\n\ add sp, sp, #0x4\n\ @@ -7404,7 +7404,7 @@ void sub_80EE58C() asm("\ push {r4, r5, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r5, ._1361\n\ + ldr r5, ._1361 @ gSharedMem\n\ mov r0, #0xc1\n\ lsl r0, r0, #0x2\n\ add r4, r5, r0\n\ @@ -7432,7 +7432,7 @@ void sub_80EE58C() beq ._1365 @cond_branch\n\ cmp r0, #0x2\n\ beq ._1366 @cond_branch\n\ - ldr r0, ._1369\n\ + ldr r0, ._1369 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -7440,7 +7440,7 @@ void sub_80EE58C() beq ._1367 @cond_branch\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._1369 + 4\n\ + ldr r0, ._1369 + 4 @ sub_80EE658\n\ bl sub_80EBDBC\n\ b ._1384\n\ ._1370:\n\ @@ -7451,7 +7451,7 @@ void sub_80EE58C() ._1365:\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r1, ._1372\n\ + ldr r1, ._1372 @ 0x876e\n\ add r0, r5, r1\n\ ldrb r0, [r0]\n\ bl sub_80F0FFC\n\ @@ -7474,7 +7474,7 @@ void sub_80EE58C() beq ._1383 @cond_branch\n\ mov r0, #0x5\n\ bl PlaySE\n\ - ldr r0, ._1377\n\ + ldr r0, ._1377 @ sub_80EE8F4\n\ bl sub_80EBDBC\n\ b ._1384\n\ ._1378:\n\ @@ -7486,7 +7486,7 @@ void sub_80EE58C() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._1383 @cond_branch\n\ - ldr r1, ._1381\n\ + ldr r1, ._1381 @ 0x876e\n\ add r0, r5, r1\n\ ldrb r0, [r0]\n\ bl sub_80F0FFC\n\ @@ -7505,12 +7505,12 @@ void sub_80EE58C() ._1380:\n\ strh r0, [r4]\n\ ._1383:\n\ - ldr r0, ._1385\n\ + ldr r0, ._1385 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1384 @cond_branch\n\ - ldr r0, ._1385 + 4\n\ - ldr r1, ._1385 + 8\n\ + ldr r0, ._1385 + 4 @ gLink\n\ + ldr r1, ._1385 + 8 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x4\n\ @@ -8013,13 +8013,13 @@ bool8 sub_80EEC10() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._1563\n\ + ldr r0, ._1563 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x40\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._1559 @cond_branch\n\ - ldr r1, ._1563 + 4\n\ + ldr r1, ._1563 + 4 @ gSharedMem\n\ add r3, r1, #1\n\ add r2, r1, #5\n\ ._1561:\n\ @@ -8051,7 +8051,7 @@ bool8 sub_80EEC10() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._1565 @cond_branch\n\ - ldr r1, ._1569\n\ + ldr r1, ._1569 @ gSharedMem\n\ mov r4, #0x0\n\ mov r2, #0x1\n\ ldsb r2, [r1, r2]\n\ @@ -8079,12 +8079,12 @@ bool8 sub_80EEC10() ._1569:\n\ .word gSharedMem+0x6dad\n\ ._1565:\n\ - ldr r0, ._1572\n\ + ldr r0, ._1572 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1571 @cond_branch\n\ - ldr r0, ._1572 + 4\n\ - ldr r1, ._1572 + 8\n\ + ldr r0, ._1572 + 4 @ gLink\n\ + ldr r1, ._1572 + 8 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x4\n\ @@ -8139,7 +8139,7 @@ bool8 sub_80EEC90() asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._1577\n\ + ldr r0, ._1577 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x40\n\ and r0, r0, r1\n\ @@ -8147,8 +8147,8 @@ bool8 sub_80EEC90() lsr r3, r0, #0x10\n\ cmp r3, #0\n\ beq ._1574 @cond_branch\n\ - ldr r2, ._1577 + 4\n\ - ldr r0, ._1577 + 8\n\ + ldr r2, ._1577 + 4 @ gSharedMem\n\ + ldr r0, ._1577 + 8 @ 0x6dad\n\ add r1, r2, r0\n\ ldrb r0, [r1]\n\ sub r0, r0, #0x1\n\ @@ -8156,7 +8156,7 @@ bool8 sub_80EEC90() lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bge ._1580 @cond_branch\n\ - ldr r3, ._1577 + 12\n\ + ldr r3, ._1577 + 12 @ 0x6dae\n\ add r0, r2, r3\n\ ldrb r0, [r0]\n\ sub r0, r0, #0x1\n\ @@ -8174,8 +8174,8 @@ bool8 sub_80EEC90() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._1579 @cond_branch\n\ - ldr r0, ._1582\n\ - ldr r4, ._1582 + 4\n\ + ldr r0, ._1582 @ gSharedMem\n\ + ldr r4, ._1582 + 4 @ 0x6dad\n\ add r2, r0, r4\n\ ldrb r1, [r2]\n\ add r1, r1, #0x1\n\ @@ -8199,12 +8199,12 @@ bool8 sub_80EEC90() .word gSharedMem\n\ .word 0x6dad\n\ ._1579:\n\ - ldr r0, ._1585\n\ + ldr r0, ._1585 @ gLinkOpen\n\ ldrb r0, [r0]\n\ cmp r0, #0x1\n\ bne ._1584 @cond_branch\n\ - ldr r0, ._1585 + 4\n\ - ldr r1, ._1585 + 8\n\ + ldr r0, ._1585 + 4 @ gLink\n\ + ldr r1, ._1585 + 8 @ 0xfbd\n\ add r0, r0, r1\n\ ldrb r0, [r0]\n\ mov r1, #0x4\n\ diff --git a/src/roulette.c b/src/roulette.c index ffdbc2c26..838ce94f8 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -586,11 +586,11 @@ void sub_8115384(void) asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r1, ._35\n\ - ldr r0, ._35 + 4\n\ + ldr r1, ._35 @ gUnknown_Debug_03005FB8\n\ + ldr r0, ._35 + 4 @ 0x2019000\n\ str r0, [r1]\n\ - ldr r1, ._35 + 8\n\ - ldr r2, ._35 + 12\n\ + ldr r1, ._35 + 8 @ gMain\n\ + ldr r2, ._35 + 12 @ 0x43c\n\ add r0, r1, r2\n\ ldrb r0, [r0]\n\ add r2, r1, #0\n\ @@ -599,7 +599,7 @@ void sub_8115384(void) b ._64\n\ ._33:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._35 + 16\n\ + ldr r1, ._35 + 16 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -626,12 +626,12 @@ void sub_8115384(void) bl ScanlineEffect_Stop\n\ bl ClearVideoCallbacks\n\ bl sub_80F9368\n\ - ldr r1, ._47\n\ - ldr r3, ._47 + 4\n\ + ldr r1, ._47 @ 0x400000c\n\ + ldr r3, ._47 + 4 @ 0x4686\n\ add r0, r3, #0\n\ strh r0, [r1]\n\ sub r1, r1, #0x2\n\ - ldr r2, ._47 + 8\n\ + ldr r2, ._47 + 8 @ 0x4401\n\ add r0, r2, #0\n\ strh r0, [r1]\n\ add r1, r1, #0x46\n\ @@ -640,18 +640,18 @@ void sub_8115384(void) add r0, r3, #0\n\ strh r0, [r1]\n\ add r1, r1, #0x2\n\ - ldr r2, ._47 + 12\n\ + ldr r2, ._47 + 12 @ 0x60a\n\ add r0, r2, #0\n\ strh r0, [r1]\n\ - ldr r0, ._47 + 16\n\ + ldr r0, ._47 + 16 @ gUnknown_08E8096C\n\ mov r1, #0xc0\n\ lsl r1, r1, #0x13\n\ bl LZ77UnCompVram\n\ - ldr r0, ._47 + 20\n\ - ldr r1, ._47 + 24\n\ + ldr r0, ._47 + 20 @ gRouletteWheelTiles\n\ + ldr r1, ._47 + 24 @ 0x6004000\n\ bl LZ77UnCompVram\n\ - ldr r1, ._47 + 28\n\ - ldr r3, ._47 + 32\n\ + ldr r1, ._47 + 28 @ gMain\n\ + ldr r3, ._47 + 32 @ 0x43c\n\ add r1, r1, r3\n\ b ._61\n\ ._48:\n\ @@ -670,8 +670,8 @@ void sub_8115384(void) bl ResetPaletteFade\n\ bl ResetSpriteData\n\ bl ResetTasks\n\ - ldr r1, ._50\n\ - ldr r0, ._50 + 4\n\ + ldr r1, ._50 @ gMain\n\ + ldr r0, ._50 + 4 @ 0x43c\n\ add r1, r1, r0\n\ b ._61\n\ ._51:\n\ @@ -680,17 +680,17 @@ void sub_8115384(void) .word gMain\n\ .word 0x43c\n\ ._40:\n\ - ldr r0, ._53\n\ + ldr r0, ._53 @ gWindowTemplate_81E6C3C\n\ bl Text_LoadWindowTemplate\n\ - ldr r0, ._53 + 4\n\ + ldr r0, ._53 + 4 @ gWindowTemplate_81E6CE4\n\ bl InitMenuWindow\n\ - ldr r0, ._53 + 8\n\ + ldr r0, ._53 + 8 @ gUnknown_083F86BC\n\ mov r2, #0xe0\n\ lsl r2, r2, #0x1\n\ mov r1, #0x0\n\ bl LoadPalette\n\ - ldr r1, ._53 + 12\n\ - ldr r2, ._53 + 16\n\ + ldr r1, ._53 + 12 @ gMain\n\ + ldr r2, ._53 + 16 @ 0x43c\n\ add r1, r1, r2\n\ b ._61\n\ ._54:\n\ @@ -704,14 +704,14 @@ void sub_8115384(void) ._41:\n\ bl sub_8115238\n\ bl ClearBGTilemapBuffers\n\ - ldr r0, ._56\n\ - ldr r1, ._56 + 4\n\ + ldr r0, ._56 @ gUnknown_083F88BC\n\ + ldr r1, ._56 + 4 @ 0x2018800\n\ bl LZ77UnCompWram\n\ - ldr r0, ._56 + 8\n\ - ldr r1, ._56 + 12\n\ + ldr r0, ._56 + 8 @ gUnknown_083F8A60\n\ + ldr r1, ._56 + 12 @ 0x6003000\n\ bl LZ77UnCompVram\n\ - ldr r1, ._56 + 16\n\ - ldr r3, ._56 + 20\n\ + ldr r1, ._56 + 16 @ gMain\n\ + ldr r3, ._56 + 20 @ 0x43c\n\ add r1, r1, r3\n\ b ._61\n\ ._57:\n\ @@ -732,8 +732,8 @@ void sub_8115384(void) bl sub_8117900\n\ bl sub_8117BBC\n\ bl sub_8117DF4\n\ - ldr r1, ._59\n\ - ldr r0, ._59 + 4\n\ + ldr r1, ._59 @ gMain\n\ + ldr r0, ._59 + 4 @ 0x43c\n\ add r1, r1, r0\n\ b ._61\n\ ._60:\n\ @@ -744,8 +744,8 @@ void sub_8115384(void) ._43:\n\ bl AnimateSprites\n\ bl BuildOamBuffer\n\ - ldr r0, ._62\n\ - ldr r1, ._62 + 4\n\ + ldr r0, ._62 @ gSaveBlock1\n\ + ldr r1, ._62 + 4 @ 0x494\n\ add r0, r0, r1\n\ ldrh r0, [r0]\n\ bl sub_81180F4\n\ @@ -760,20 +760,20 @@ void sub_8115384(void) mov r2, #0x1d\n\ mov r3, #0x13\n\ bl Menu_DrawStdWindowFrame\n\ - ldr r0, ._62 + 8\n\ + ldr r0, ._62 + 8 @ gUnknown_081C4157\n\ mov r1, #0x1\n\ mov r2, #0xf\n\ bl Menu_PrintText\n\ - ldr r1, ._62 + 12\n\ + ldr r1, ._62 + 12 @ gSpriteCoordOffsetX\n\ mov r2, #0x3c\n\ neg r2, r2\n\ add r0, r2, #0\n\ strh r0, [r1]\n\ - ldr r1, ._62 + 16\n\ + ldr r1, ._62 + 16 @ gSpriteCoordOffsetY\n\ mov r0, #0x0\n\ strh r0, [r1]\n\ - ldr r1, ._62 + 20\n\ - ldr r3, ._62 + 24\n\ + ldr r1, ._62 + 20 @ gMain\n\ + ldr r3, ._62 + 24 @ 0x43c\n\ add r1, r1, r3\n\ b ._61\n\ ._63:\n\ @@ -789,10 +789,10 @@ void sub_8115384(void) ._44:\n\ mov r1, #0x80\n\ lsl r1, r1, #0x13\n\ - ldr r3, ._65\n\ + ldr r3, ._65 @ 0x1741\n\ add r0, r3, #0\n\ strh r0, [r1]\n\ - ldr r0, ._65 + 4\n\ + ldr r0, ._65 + 4 @ 0x43c\n\ add r1, r2, r0\n\ ._61:\n\ ldrb r0, [r1]\n\ @@ -805,22 +805,22 @@ void sub_8115384(void) .word 0x1741\n\ .word 0x43c\n\ ._45:\n\ - ldr r3, ._67\n\ + ldr r3, ._67 @ 0x4000208\n\ ldrh r2, [r3]\n\ mov r0, #0x0\n\ strh r0, [r3]\n\ - ldr r4, ._67 + 4\n\ + ldr r4, ._67 + 4 @ 0x4000200\n\ ldrh r0, [r4]\n\ mov r1, #0x1\n\ orr r0, r0, r1\n\ strh r0, [r4]\n\ strh r2, [r3]\n\ - ldr r2, ._67 + 8\n\ + ldr r2, ._67 + 8 @ 0x4000004\n\ ldrh r0, [r2]\n\ mov r1, #0x8\n\ orr r0, r0, r1\n\ strh r0, [r2]\n\ - ldr r0, ._67 + 12\n\ + ldr r0, ._67 + 12 @ sub_8115124\n\ bl SetVBlankCallback\n\ mov r0, #0x1\n\ str r0, [sp]\n\ @@ -829,33 +829,33 @@ void sub_8115384(void) mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginHardwarePaletteFade\n\ - ldr r0, ._67 + 16\n\ + ldr r0, ._67 + 16 @ sub_81156BC\n\ mov r1, #0x0\n\ bl CreateTask\n\ - ldr r4, ._67 + 20\n\ + ldr r4, ._67 + 20 @ 0x2019000\n\ add r1, r4, #0\n\ add r1, r1, #0xa4\n\ strb r0, [r1]\n\ lsl r0, r0, #0x18\n\ lsr r0, r0, #0x18\n\ - ldr r2, ._67 + 24\n\ + ldr r2, ._67 + 24 @ gTasks\n\ lsl r1, r0, #0x2\n\ add r1, r1, r0\n\ lsl r1, r1, #0x3\n\ add r1, r1, r2\n\ mov r0, #0x6\n\ strh r0, [r1, #0x14]\n\ - ldr r0, ._67 + 28\n\ - ldr r2, ._67 + 32\n\ + ldr r0, ._67 + 28 @ gSaveBlock1\n\ + ldr r2, ._67 + 32 @ 0x494\n\ add r0, r0, r2\n\ ldrh r0, [r0]\n\ strh r0, [r1, #0x22]\n\ - ldr r0, ._67 + 36\n\ + ldr r0, ._67 + 36 @ sub_8115634\n\ mov r1, #0x1\n\ bl CreateTask\n\ add r4, r4, #0xa5\n\ strb r0, [r4]\n\ - ldr r0, ._67 + 40\n\ + ldr r0, ._67 + 40 @ sub_81150FC\n\ bl SetMainCallback2\n\ ._64:\n\ add sp, sp, #0x4\n\ @@ -967,7 +967,7 @@ void sub_8115634(u8 unused) { asm("\ push {r4, r5, r6, lr}\n\ - ldr r0, ._75\n\ + ldr r0, ._75 @ 0x2019000\n\ add r3, r0, #0\n\ add r3, r3, #0x21\n\ ldrb r1, [r3]\n\ @@ -1030,17 +1030,17 @@ void sub_8115634(u8 unused) asr r0, r0, #0x10\n\ neg r0, r0\n\ strh r0, [r6, #0x30]\n\ - ldr r0, ._75 + 4\n\ + ldr r0, ._75 + 4 @ unk_203955C\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._74 @cond_branch\n\ - ldr r0, ._75 + 8\n\ + ldr r0, ._75 + 8 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x8\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._74 @cond_branch\n\ - ldr r2, ._75 + 12\n\ + ldr r2, ._75 + 12 @ gTasks\n\ add r0, r6, #0\n\ add r0, r0, #0xa4\n\ ldrb r1, [r0]\n\ @@ -1048,13 +1048,13 @@ void sub_8115634(u8 unused) add r0, r0, r1\n\ lsl r0, r0, #0x3\n\ add r0, r0, r2\n\ - ldr r1, ._75 + 16\n\ + ldr r1, ._75 + 16 @ sub_81157AC\n\ str r1, [r0]\n\ - ldr r0, ._75 + 20\n\ + ldr r0, ._75 + 20 @ gMPlay_SE1\n\ bl m4aMPlayStop\n\ - ldr r0, ._75 + 24\n\ + ldr r0, ._75 + 24 @ gMPlay_SE2\n\ bl m4aMPlayStop\n\ - ldr r0, ._75 + 28\n\ + ldr r0, ._75 + 28 @ gMPlay_SE3\n\ bl m4aMPlayStop\n\ ._74:\n\ pop {r4, r5, r6}\n\ @@ -2030,13 +2030,13 @@ void sub_8116B40(u8 taskid) // end roulette ? bne ._380 @cond_branch\n\ mov r0, #0x0\n\ bl SetVBlankCallback\n\ - ldr r0, ._381\n\ + ldr r0, ._381 @ 0x2019000\n\ mov r2, #0xbe\n\ lsl r2, r2, #0x1\n\ mov r1, #0x0\n\ bl memset\n\ - ldr r1, ._381 + 4\n\ - ldr r0, ._381 + 8\n\ + ldr r1, ._381 + 4 @ gSpriteCoordOffsetX\n\ + ldr r0, ._381 + 8 @ gSpriteCoordOffsetY\n\ mov r4, #0x0\n\ strh r5, [r0]\n\ strh r5, [r1]\n\ @@ -2045,20 +2045,20 @@ void sub_8116B40(u8 taskid) // end roulette ? bl ResetPaletteFade\n\ bl ResetSpriteData\n\ bl ClearBGTilemapBuffers\n\ - ldr r0, ._381 + 12\n\ + ldr r0, ._381 + 12 @ 0x4000050\n\ strh r5, [r0]\n\ add r0, r0, #0x2\n\ strh r5, [r0]\n\ add r0, r0, #0x2\n\ strh r5, [r0]\n\ - ldr r1, ._381 + 16\n\ - ldr r0, ._381 + 20\n\ + ldr r1, ._381 + 16 @ gFieldCallback\n\ + ldr r0, ._381 + 20 @ sub_8080990\n\ str r0, [r1]\n\ - ldr r0, ._381 + 24\n\ + ldr r0, ._381 + 24 @ c2_exit_to_overworld_2_switch\n\ bl SetMainCallback2\n\ add r0, r6, #0\n\ bl DestroyTask\n\ - ldr r0, ._381 + 28\n\ + ldr r0, ._381 + 28 @ unk_203955C\n\ strb r4, [r0]\n\ ._380:\n\ pop {r4, r5, r6}\n\ @@ -3189,13 +3189,13 @@ void debug_sub_812CDE4() lsl r0, r0, #0x18\n\ lsr r3, r0, #0x18\n\ add r4, r3, #0\n\ - ldr r0, ._575\n\ + ldr r0, ._575 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ cmp r0, #0\n\ beq ._572 @cond_branch\n\ - ldr r1, ._575 + 4\n\ + ldr r1, ._575 + 4 @ gTasks\n\ lsl r0, r3, #0x2\n\ add r0, r0, r3\n\ lsl r0, r0, #0x3\n\ @@ -3204,13 +3204,13 @@ void debug_sub_812CDE4() add r0, r0, #0x1\n\ strh r0, [r2, #0x22]\n\ lsl r0, r0, #0x10\n\ - ldr r1, ._575 + 8\n\ + ldr r1, ._575 + 8 @ 0x27100000\n\ cmp r0, r1\n\ bne ._573 @cond_branch\n\ mov r0, #0x0\n\ strh r0, [r2, #0x22]\n\ ._573:\n\ - ldr r0, ._575 + 12\n\ + ldr r0, ._575 + 12 @ gStringVar1\n\ mov r3, #0x22\n\ ldsh r1, [r2, r3]\n\ b ._584\n\ @@ -3226,7 +3226,7 @@ void debug_sub_812CDE4() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._577 @cond_branch\n\ - ldr r1, ._580\n\ + ldr r1, ._580 @ gTasks\n\ lsl r0, r3, #0x2\n\ add r0, r0, r3\n\ lsl r0, r0, #0x3\n\ @@ -3240,10 +3240,10 @@ void debug_sub_812CDE4() neg r1, r1\n\ cmp r0, r1\n\ bne ._578 @cond_branch\n\ - ldr r0, ._580 + 4\n\ + ldr r0, ._580 + 4 @ 0x270f\n\ strh r0, [r2, #0x22]\n\ ._578:\n\ - ldr r0, ._580 + 8\n\ + ldr r0, ._580 + 8 @ gStringVar1\n\ mov r3, #0x22\n\ ldsh r1, [r2, r3]\n\ b ._584\n\ @@ -3259,7 +3259,7 @@ void debug_sub_812CDE4() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._582 @cond_branch\n\ - ldr r1, ._585\n\ + ldr r1, ._585 @ gTasks\n\ lsl r0, r3, #0x2\n\ add r0, r0, r3\n\ lsl r0, r0, #0x3\n\ @@ -3269,14 +3269,14 @@ void debug_sub_812CDE4() add r0, r0, #0xa\n\ strh r0, [r2, #0x22]\n\ lsl r0, r0, #0x10\n\ - ldr r1, ._585 + 4\n\ + ldr r1, ._585 + 4 @ 0x270f0000\n\ cmp r0, r1\n\ ble ._583 @cond_branch\n\ - ldr r1, ._585 + 8\n\ + ldr r1, ._585 + 8 @ 0xffffd8fb\n\ add r0, r3, r1\n\ strh r0, [r2, #0x22]\n\ ._583:\n\ - ldr r0, ._585 + 12\n\ + ldr r0, ._585 + 12 @ gStringVar1\n\ mov r3, #0x22\n\ ldsh r1, [r2, r3]\n\ b ._584\n\ @@ -3293,7 +3293,7 @@ void debug_sub_812CDE4() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._587 @cond_branch\n\ - ldr r0, ._590\n\ + ldr r0, ._590 @ gTasks\n\ lsl r1, r3, #0x2\n\ add r1, r1, r3\n\ lsl r1, r1, #0x3\n\ @@ -3305,19 +3305,19 @@ void debug_sub_812CDE4() lsl r0, r0, #0x10\n\ cmp r0, #0\n\ bge ._588 @cond_branch\n\ - ldr r3, ._590 + 4\n\ + ldr r3, ._590 + 4 @ 0x2705\n\ add r0, r2, r3\n\ strh r0, [r1, #0x22]\n\ ._588:\n\ - ldr r0, ._590 + 8\n\ + ldr r0, ._590 + 8 @ gStringVar1\n\ mov r2, #0x22\n\ ldsh r1, [r1, r2]\n\ ._584:\n\ mov r2, #0x1\n\ mov r3, #0x4\n\ bl ConvertIntToDecimalStringN\n\ - ldr r4, ._590 + 12\n\ - ldr r1, ._590 + 16\n\ + ldr r4, ._590 + 12 @ gStringVar4\n\ + ldr r1, ._590 + 16 @ gOtherText_Coins\n\ add r0, r4, #0\n\ bl StringExpandPlaceholders\n\ add r0, r4, #0\n\ @@ -3338,34 +3338,34 @@ void debug_sub_812CDE4() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._592 @cond_branch\n\ - ldr r0, ._594\n\ - ldr r2, ._594 + 4\n\ + ldr r0, ._594 @ gSaveBlock1\n\ + ldr r2, ._594 + 4 @ gTasks\n\ lsl r1, r3, #0x2\n\ add r1, r1, r3\n\ lsl r1, r1, #0x3\n\ add r1, r1, r2\n\ ldrh r2, [r1, #0x22]\n\ - ldr r3, ._594 + 8\n\ + ldr r3, ._594 + 8 @ 0x494\n\ add r0, r0, r3\n\ mov r5, #0x0\n\ strh r2, [r0]\n\ - ldr r0, ._594 + 12\n\ + ldr r0, ._594 + 12 @ Task_Roulette_0\n\ str r0, [r1]\n\ - ldr r0, ._594 + 16\n\ + ldr r0, ._594 + 16 @ gStringVar1\n\ mov r2, #0x22\n\ ldsh r1, [r1, r2]\n\ mov r2, #0x1\n\ mov r3, #0x4\n\ bl ConvertIntToDecimalStringN\n\ - ldr r4, ._594 + 20\n\ - ldr r1, ._594 + 24\n\ + ldr r4, ._594 + 20 @ gStringVar4\n\ + ldr r1, ._594 + 24 @ gOtherText_Coins\n\ add r0, r4, #0\n\ bl StringExpandPlaceholders\n\ add r0, r4, #0\n\ mov r1, #0x9\n\ mov r2, #0x1\n\ bl MenuPrint_RightAligned\n\ - ldr r0, ._594 + 28\n\ + ldr r0, ._594 + 28 @ unk_2039560\n\ strb r5, [r0]\n\ b ._596\n\ ._595:\n\ @@ -3384,33 +3384,33 @@ void debug_sub_812CDE4() and r0, r0, r1\n\ cmp r0, #0\n\ beq ._596 @cond_branch\n\ - ldr r0, ._597\n\ - ldr r2, ._597 + 4\n\ + ldr r0, ._597 @ gSaveBlock1\n\ + ldr r2, ._597 + 4 @ gTasks\n\ lsl r1, r4, #0x2\n\ add r1, r1, r4\n\ lsl r1, r1, #0x3\n\ add r1, r1, r2\n\ ldrh r2, [r1, #0x22]\n\ - ldr r3, ._597 + 8\n\ + ldr r3, ._597 + 8 @ 0x494\n\ add r0, r0, r3\n\ strh r2, [r0]\n\ - ldr r0, ._597 + 12\n\ + ldr r0, ._597 + 12 @ Task_Roulette_0\n\ str r0, [r1]\n\ - ldr r0, ._597 + 16\n\ + ldr r0, ._597 + 16 @ gStringVar1\n\ mov r2, #0x22\n\ ldsh r1, [r1, r2]\n\ mov r2, #0x1\n\ mov r3, #0x4\n\ bl ConvertIntToDecimalStringN\n\ - ldr r4, ._597 + 20\n\ - ldr r1, ._597 + 24\n\ + ldr r4, ._597 + 20 @ gStringVar4\n\ + ldr r1, ._597 + 24 @ gOtherText_Coins\n\ add r0, r4, #0\n\ bl StringExpandPlaceholders\n\ add r0, r4, #0\n\ mov r1, #0x9\n\ mov r2, #0x1\n\ bl MenuPrint_RightAligned\n\ - ldr r1, ._597 + 28\n\ + ldr r1, ._597 + 28 @ unk_2039560\n\ mov r0, #0x1\n\ strb r0, [r1]\n\ ._596:\n\ @@ -3437,13 +3437,13 @@ void debug_sub_812CFE8() push {r4, r5, lr}\n\ lsl r0, r0, #0x18\n\ lsr r0, r0, #0x18\n\ - ldr r2, ._600\n\ + ldr r2, ._600 @ gTasks\n\ lsl r1, r0, #0x2\n\ add r1, r1, r0\n\ lsl r1, r1, #0x3\n\ add r5, r1, r2\n\ - ldr r0, ._600 + 4\n\ - ldr r1, ._600 + 8\n\ + ldr r0, ._600 + 4 @ gSaveBlock1\n\ + ldr r1, ._600 + 8 @ 0x494\n\ add r0, r0, r1\n\ ldrh r0, [r0]\n\ strh r0, [r5, #0x22]\n\ @@ -3452,20 +3452,20 @@ void debug_sub_812CFE8() and r1, r1, r0\n\ cmp r1, #0\n\ beq ._599 @cond_branch\n\ - ldr r0, ._600 + 12\n\ + ldr r0, ._600 + 12 @ gSpecialVar_0x8004\n\ ldrh r1, [r0]\n\ mov r2, #0x80\n\ orr r1, r1, r2\n\ strh r1, [r0]\n\ ._599:\n\ - ldr r0, ._600 + 16\n\ + ldr r0, ._600 + 16 @ gStringVar1\n\ mov r2, #0x22\n\ ldsh r1, [r5, r2]\n\ mov r2, #0x1\n\ mov r3, #0x4\n\ bl ConvertIntToDecimalStringN\n\ - ldr r4, ._600 + 20\n\ - ldr r1, ._600 + 24\n\ + ldr r4, ._600 + 20 @ gStringVar4\n\ + ldr r1, ._600 + 24 @ gOtherText_Coins\n\ add r0, r4, #0\n\ bl StringExpandPlaceholders\n\ mov r0, #0x0\n\ @@ -3482,11 +3482,11 @@ void debug_sub_812CFE8() mov r2, #0x1d\n\ mov r3, #0x13\n\ bl Menu_DrawStdWindowFrame\n\ - ldr r0, ._600 + 28\n\ + ldr r0, ._600 + 28 @ gUnknown_Debug_0842510D\n\ mov r1, #0x1\n\ mov r2, #0xf\n\ bl Menu_PrintText\n\ - ldr r0, ._600 + 32\n\ + ldr r0, ._600 + 32 @ debug_sub_812CDE4\n\ str r0, [r5]\n\ pop {r4, r5}\n\ pop {r0}\n\ @@ -3514,14 +3514,14 @@ void PlayRoulette(void) asm("\ push {lr}\n\ bl ScriptContext2_Enable\n\ - ldr r1, ._604\n\ + ldr r1, ._604 @ unk_2039560\n\ mov r0, #0x0\n\ strb r0, [r1]\n\ - ldr r0, ._604 + 4\n\ + ldr r0, ._604 + 4 @ unk_203955C\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._602 @cond_branch\n\ - ldr r0, ._604 + 8\n\ + ldr r0, ._604 + 8 @ debug_sub_812CFE8\n\ mov r1, #0x0\n\ bl CreateTask\n\ b ._603\n\ @@ -3532,18 +3532,18 @@ void PlayRoulette(void) .word unk_203955C\n\ .word debug_sub_812CFE8+1\n\ ._602:\n\ - ldr r0, ._606\n\ + ldr r0, ._606 @ Task_Roulette_0\n\ mov r1, #0x0\n\ bl CreateTask\n\ lsl r0, r0, #0x18\n\ lsr r0, r0, #0x18\n\ - ldr r2, ._606 + 4\n\ + ldr r2, ._606 + 4 @ gTasks\n\ lsl r1, r0, #0x2\n\ add r1, r1, r0\n\ lsl r1, r1, #0x3\n\ add r1, r1, r2\n\ - ldr r0, ._606 + 8\n\ - ldr r2, ._606 + 12\n\ + ldr r0, ._606 + 8 @ gSaveBlock1\n\ + ldr r2, ._606 + 12 @ 0x494\n\ add r0, r0, r2\n\ ldrh r0, [r0]\n\ strh r0, [r1, #0x22]\n\ @@ -4479,10 +4479,10 @@ void debug_sub_812E698() and r1, r1, r0\n\ cmp r1, #0\n\ beq ._837 @cond_branch\n\ - ldr r4, ._839\n\ + ldr r4, ._839 @ 0x2019000\n\ add r1, r4, #0\n\ add r1, r1, #0x8c\n\ - ldr r0, ._839 + 4\n\ + ldr r0, ._839 + 4 @ 0x0\n\ str r0, [r1]\n\ add r0, r4, #0\n\ add r0, r0, #0x7e\n\ @@ -4494,7 +4494,7 @@ void debug_sub_812E698() add r1, r1, #0x7f\n\ strb r0, [r1]\n\ add r1, r4, #0\n\ - ldr r4, ._839 + 8\n\ + ldr r4, ._839 + 8 @ gUnknown_083F8DF4\n\ b ._838\n\ ._840:\n\ .align 2, 0\n\ @@ -4503,10 +4503,10 @@ void debug_sub_812E698() .word 0x0\n\ .word gUnknown_083F8DF4\n\ ._837:\n\ - ldr r6, ._841\n\ + ldr r6, ._841 @ 0x2019000\n\ add r5, r6, #0\n\ add r5, r5, #0x8c\n\ - ldr r4, ._841 + 4\n\ + ldr r4, ._841 + 4 @ gUnknown_083F8DF4\n\ ldrb r0, [r6, #0x4]\n\ lsl r0, r0, #0x1e\n\ lsr r0, r0, #0x19\n\ @@ -4534,9 +4534,9 @@ void debug_sub_812E698() ldrb r0, [r0, #0x2]\n\ strh r0, [r7, #0x32]\n\ add r1, r1, #0x98\n\ - ldr r0, ._841 + 8\n\ + ldr r0, ._841 + 8 @ 0x3dae147b\n\ str r0, [r1]\n\ - ldr r0, ._841 + 12\n\ + ldr r0, ._841 + 12 @ sub_8118D2C\n\ str r0, [r7, #0x1c]\n\ mov r0, #0x5\n\ strh r0, [r7, #0x30]\n\ @@ -4839,12 +4839,12 @@ void sub_8118F8C(struct Sprite *sprite) push {r6, r7}\n\ add r6, r0, #0\n\ bl sub_8118724\n\ - ldr r5, ._868\n\ + ldr r5, ._868 @ 0x2019000\n\ mov r0, #0x8c\n\ add r0, r0, r5\n\ mov r8, r0\n\ ldr r0, [r0]\n\ - ldr r1, ._868 + 4\n\ + ldr r1, ._868 + 4 @ 0x3f000000\n\ bl __gtsf2\n\ cmp r0, #0\n\ bgt ._874 @cond_branch\n\ @@ -4857,9 +4857,9 @@ void sub_8118F8C(struct Sprite *sprite) bne ._864 @cond_branch\n\ add r1, r5, #0\n\ add r1, r1, #0x90\n\ - ldr r0, ._868 + 8\n\ + ldr r0, ._868 + 8 @ 0x0\n\ str r0, [r1]\n\ - ldr r1, ._868 + 12\n\ + ldr r1, ._868 + 12 @ gUnknown_083F8DF4\n\ mov r9, r1\n\ ldrb r0, [r5, #0x4]\n\ lsl r7, r0, #0x1e\n\ @@ -4872,7 +4872,7 @@ void sub_8118F8C(struct Sprite *sprite) add r5, r0, #0\n\ cmp r4, #0\n\ bge ._865 @cond_branch\n\ - ldr r1, ._868 + 16\n\ + ldr r1, ._868 + 16 @ 0x43800000\n\ bl __addsf3\n\ add r5, r0, #0\n\ ._865:\n\ @@ -4892,11 +4892,11 @@ void sub_8118F8C(struct Sprite *sprite) str r0, [r1]\n\ mov r0, #0x4\n\ strh r0, [r6, #0x30]\n\ - ldr r0, ._868 + 20\n\ + ldr r0, ._868 + 20 @ unk_2039560\n\ ldrb r0, [r0]\n\ cmp r0, #0\n\ beq ._866 @cond_branch\n\ - ldr r0, ._868 + 24\n\ + ldr r0, ._868 + 24 @ debug_sub_812E698\n\ str r0, [r6, #0x1c]\n\ b ._874\n\ ._869:\n\ @@ -4910,7 +4910,7 @@ void sub_8118F8C(struct Sprite *sprite) .word unk_2039560\n\ .word debug_sub_812E698+1\n\ ._866:\n\ - ldr r0, ._871\n\ + ldr r0, ._871 @ sub_8118DE4\n\ str r0, [r6, #0x1c]\n\ b ._874\n\ ._872:\n\ @@ -4921,7 +4921,7 @@ void sub_8118F8C(struct Sprite *sprite) add r6, r5, #0\n\ add r6, r6, #0x90\n\ ldr r0, [r6]\n\ - ldr r4, ._875\n\ + ldr r4, ._875 @ 0x0\n\ add r1, r4, #0\n\ bl __nesf2\n\ cmp r0, #0\n\ @@ -4939,8 +4939,8 @@ void sub_8118F8C(struct Sprite *sprite) add r4, r4, #0x98\n\ ldr r0, [r4]\n\ bl __extendsfdf2\n\ - ldr r2, ._875 + 4\n\ - ldr r3, ._875 + 8\n\ + ldr r2, ._875 + 4 @ 0x3ff33333\n\ + ldr r3, ._875 + 8 @ 0x33333333\n\ bl __divdf3\n\ bl __truncdfsf2\n\ str r0, [r4]\n\ diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index d81263f87..114505e4d 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -216,10 +216,10 @@ u8 debug_sub_8138C14(void) { asm("\n\ push {lr}\n\ - ldr r0, ._1\n\ + ldr r0, ._1 @ unk_203955C\n\ mov r1, #0x1\n\ strb r1, [r0]\n\ - ldr r0, ._1 + 4\n\ + ldr r0, ._1 + 4 @ MauvilleCity_GameCorner_EventScript_1C407E\n\ bl ScriptContext1_SetupScript\n\ bl CloseMenu\n\ mov r0, #0x1\n\ @@ -237,10 +237,10 @@ u8 debug_sub_8138C34(void) { asm("\n\ push {lr}\n\ - ldr r0, ._3\n\ + ldr r0, ._3 @ unk_203955C\n\ mov r1, #0x1\n\ strb r1, [r0]\n\ - ldr r0, ._3 + 4\n\ + ldr r0, ._3 + 4 @ MauvilleCity_GameCorner_EventScript_1C40AC\n\ bl ScriptContext1_SetupScript\n\ bl CloseMenu\n\ mov r0, #0x1\n\ @@ -258,7 +258,7 @@ u8 debug_sub_8138C54(void) { asm("\n\ push {r4, lr}\n\ - ldr r4, ._10\n\ + ldr r4, ._10 @ gMain\n\ ldrh r0, [r4, #0x2e]\n\ cmp r0, #0x40\n\ bne ._5 @cond_branch\n\ @@ -275,14 +275,14 @@ u8 debug_sub_8138C54(void) ldrh r1, [r4, #0x2e]\n\ cmp r1, #0x1\n\ beq ._7 @cond_branch\n\ - ldr r0, ._10 + 4\n\ + ldr r0, ._10 + 4 @ 0x101\n\ cmp r1, r0\n\ bne ._8 @cond_branch\n\ - ldr r1, ._10 + 8\n\ + ldr r1, ._10 + 8 @ gSpecialVar_0x8004\n\ mov r0, #0x1\n\ strh r0, [r1]\n\ ._7:\n\ - ldr r4, ._10 + 12\n\ + ldr r4, ._10 + 12 @ gUnkDebug4Menu\n\ bl Menu_GetCursorPos\n\ lsl r0, r0, #0x18\n\ lsr r0, r0, #0x15\n\ @@ -320,7 +320,7 @@ u8 debug_sub_8138CC4(void) asm("\n\ push {lr}\n\ add sp, sp, #0xfffffff8\n\ - ldr r1, ._14\n\ + ldr r1, ._14 @ gSpecialVar_0x8004\n\ mov r0, #0x0\n\ strh r0, [r1]\n\ bl Menu_EraseScreen\n\ @@ -329,7 +329,7 @@ u8 debug_sub_8138CC4(void) mov r2, #0x1d\n\ mov r3, #0xc\n\ bl Menu_DrawStdWindowFrame\n\ - ldr r3, ._14 + 4\n\ + ldr r3, ._14 + 4 @ gUnkDebug4Menu\n\ mov r0, #0x14\n\ mov r1, #0x1\n\ mov r2, #0x5\n\ @@ -343,8 +343,8 @@ u8 debug_sub_8138CC4(void) mov r2, #0x1\n\ mov r3, #0x5\n\ bl InitMenu\n\ - ldr r1, ._14 + 8\n\ - ldr r0, ._14 + 12\n\ + ldr r1, ._14 + 8 @ gMenuCallback\n\ + ldr r0, ._14 + 12 @ debug_sub_8138C54\n\ str r0, [r1]\n\ mov r0, #0x0\n\ add sp, sp, #0x8\n\ @@ -384,7 +384,7 @@ u8 debug_sub_8138D74(void) { asm("\n\ push {lr}\n\ - ldr r1, ._21\n\ + ldr r1, ._21 @ gSpecialVar_0x8004\n\ mov r0, #0x0\n\ strh r0, [r1]\n\ bl CloseMenu\n\ @@ -402,7 +402,7 @@ u8 debug_sub_8138D8C(void) { asm("\n\ push {lr}\n\ - ldr r1, ._23\n\ + ldr r1, ._23 @ gSpecialVar_0x8004\n\ mov r0, #0x1\n\ strh r0, [r1]\n\ bl CloseMenu\n\ diff --git a/src/scene/cute_sketch.c b/src/scene/cute_sketch.c index 848249528..2af990290 100644 --- a/src/scene/cute_sketch.c +++ b/src/scene/cute_sketch.c @@ -38,8 +38,8 @@ void debug_sub_8110CCC(void) push {r4, r5, r6, r7, lr}\n\ mov r7, #0x0\n\ mov r1, #0x0\n\ - ldr r2, ._5\n\ - ldr r6, ._5 + 4\n\ + ldr r2, ._5 @ gUnknown_083E79C0\n\ + ldr r6, ._5 + 4 @ \n\ ._7:\n\ lsl r0, r1, #0x3\n\ add r4, r0, r2\n\ @@ -108,7 +108,7 @@ void debug_sub_8110CCC(void) mov r2, #0x1d\n\ mov r3, #0x13\n\ bl Menu_DrawStdWindowFrame\n\ - ldr r0, ._9\n\ + ldr r0, ._9 @ \n\ mov r1, #0x11\n\ mov r2, #0x11\n\ bl Menu_PrintText\n\ @@ -133,14 +133,14 @@ void debug_sub_8110D84(void) asm("\ push {r4, lr}\n\ add sp, sp, #0xfffffffc\n\ - ldr r0, ._13\n\ + ldr r0, ._13 @ \n\ ldrh r0, [r0, #0x4]\n\ cmp r0, #0x7\n\ bls ._11 @cond_branch\n\ b ._65\n\ ._11:\n\ lsl r0, r0, #0x2\n\ - ldr r1, ._13 + 4\n\ + ldr r1, ._13 + 4 @ \n\ add r0, r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ @@ -166,7 +166,7 @@ void debug_sub_8110D84(void) mov r2, #0x10\n\ mov r3, #0x0\n\ bl BeginNormalPaletteFade\n\ - ldr r1, ._25\n\ + ldr r1, ._25 @ \n\ ldrh r0, [r1, #0x4]\n\ add r0, r0, #0x1\n\ b ._62\n\ @@ -181,7 +181,7 @@ void debug_sub_8110D84(void) beq ._27 @cond_branch\n\ b ._65\n\ ._27:\n\ - ldr r1, ._30\n\ + ldr r1, ._30 @ \n\ ldrh r0, [r1, #0x4]\n\ add r0, r0, #0x1\n\ b ._62\n\ @@ -205,7 +205,7 @@ void debug_sub_8110D84(void) beq ._36 @cond_branch\n\ b ._65\n\ ._35:\n\ - ldr r4, ._41\n\ + ldr r4, ._41 @ \n\ ldrb r0, [r4, #0x1e]\n\ cmp r0, #0\n\ bne ._38 @cond_branch\n\ @@ -213,11 +213,11 @@ void debug_sub_8110D84(void) ._38:\n\ mov r0, #0x5\n\ bl m4aSongNumStart\n\ - ldr r1, ._41 + 4\n\ + ldr r1, ._41 + 4 @ \n\ add r0, r4, r1\n\ mov r1, #0x1\n\ strb r1, [r0]\n\ - ldr r0, ._41 + 8\n\ + ldr r0, ._41 + 8 @ \n\ bl sub_80FC244\n\ b ._65\n\ ._42:\n\ @@ -236,7 +236,7 @@ void debug_sub_8110D84(void) mov r2, #0x0\n\ mov r3, #0x10\n\ bl BeginNormalPaletteFade\n\ - ldr r1, ._44\n\ + ldr r1, ._44 @ \n\ ldrh r0, [r1, #0x4]\n\ add r0, r0, #0x1\n\ b ._62\n\ @@ -249,7 +249,7 @@ void debug_sub_8110D84(void) lsl r0, r0, #0x18\n\ cmp r0, #0\n\ bne ._65 @cond_branch\n\ - ldr r0, ._48\n\ + ldr r0, ._48 @ sub_805469C\n\ bl SetMainCallback2\n\ b ._65\n\ ._49:\n\ @@ -265,7 +265,7 @@ void debug_sub_8110D84(void) bl debug_sub_8110CCC\n\ b ._65\n\ ._50:\n\ - ldr r0, ._54\n\ + ldr r0, ._54 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -273,7 +273,7 @@ void debug_sub_8110D84(void) beq ._65 @cond_branch\n\ bl sub_80FBCA0\n\ bl sub_80FAEC4\n\ - ldr r1, ._54 + 4\n\ + ldr r1, ._54 + 4 @ \n\ ldrh r0, [r1, #0x4]\n\ add r0, r0, #0x1\n\ b ._62\n\ @@ -290,7 +290,7 @@ void debug_sub_8110D84(void) mov r0, #0x0\n\ mov r1, #0x0\n\ bl CreateRegionMapCursor\n\ - ldr r1, ._58\n\ + ldr r1, ._58 @ \n\ ldrh r0, [r1, #0x4]\n\ add r0, r0, #0x1\n\ b ._62\n\ @@ -305,7 +305,7 @@ void debug_sub_8110D84(void) beq ._60 @cond_branch\n\ bl debug_sub_8110CCC\n\ ._60:\n\ - ldr r0, ._63\n\ + ldr r0, ._63 @ gMain\n\ ldrh r1, [r0, #0x2e]\n\ mov r0, #0x1\n\ and r0, r0, r1\n\ @@ -313,7 +313,7 @@ void debug_sub_8110D84(void) beq ._65 @cond_branch\n\ bl sub_80FBCA0\n\ bl sub_80FAEC4\n\ - ldr r1, ._63 + 4\n\ + ldr r1, ._63 + 4 @ \n\ ldrh r0, [r1, #0x4]\n\ add r0, r0, #0x1\n\ b ._62\n\ @@ -330,7 +330,7 @@ void debug_sub_8110D84(void) mov r0, #0x0\n\ mov r1, #0x0\n\ bl CreateRegionMapCursor\n\ - ldr r1, ._66\n\ + ldr r1, ._66 @ \n\ mov r0, #0x3\n\ ._62:\n\ strh r0, [r1, #0x4]\n\ @@ -351,13 +351,13 @@ void debug_sub_8110F28(void) asm("\ push {lr}\n\ bl CB2_InitFlyRegionMap\n\ - ldr r0, ._69\n\ + ldr r0, ._69 @ gMain\n\ ldr r1, [r0, #0x4]\n\ - ldr r0, ._69 + 4\n\ + ldr r0, ._69 + 4 @ CB2_FlyRegionMap\n\ cmp r1, r0\n\ bne ._68 @cond_branch\n\ bl sub_80FBF94\n\ - ldr r0, ._69 + 8\n\ + ldr r0, ._69 + 8 @ debug_sub_8110D84\n\ bl sub_80FC244\n\ bl debug_sub_8110CCC\n\ ._68:\n\ -- cgit v1.2.3 From f87bd7328ce26deddc53b62e53827089bfacd30a Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 27 Jan 2018 20:34:43 -0600 Subject: decompile more debug functions in battle_2.c --- src/battle/battle_2.c | 2737 +++++++++++++++---------------------------------- 1 file changed, 800 insertions(+), 1937 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index b9b4290b5..a400257dd 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -67,12 +67,15 @@ struct UnknownStruct12 u8 filler4[0x54]; }; -void debug_sub_80139E4(void); -extern u8 gUnknown_02023A14_50; +extern void sub_802BBD4(); +extern const u8 Str_821F7B8[]; +extern u8 gUnknown_02023A14_50; extern const u16 gUnknown_08D004E0[]; extern const struct MonCoords gCastformFrontSpriteCoords[]; - +extern const u8 Str_821F7EA[]; +extern const u8 gUnknown_Debug_821F7F3[]; +extern const u8 BattleText_YesNo[]; extern u8 gStatStageRatios[][2]; extern u8 gActionsByTurnOrder[4]; extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; @@ -85,7 +88,7 @@ extern u8 gCurrentActionFuncId; extern u8 gBanksByTurnOrder[]; extern struct UnknownStruct12 gUnknown_02024AD0[]; extern u8 gObjectBankIDs[]; -extern u16 gCurrentMove; +extern u16 gCurrentMove; // This is mis-named. It is a species, not a move ID. extern u8 gLastUsedAbility; extern u8 gStringBank; extern u8 gAbsentBankFlags; @@ -182,7 +185,7 @@ extern u8 gUnknown_081FA70C[][3]; extern u8 gUnknown_081FA71B[]; extern u8 gUnknown_081FA71F[]; - +void sub_8010824(void); static void BattlePrepIntroSlide(void); void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); void SetActionsAndBanksTurnOrder(void); @@ -551,11 +554,7 @@ void sub_800EC9C(void) if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) { gPreBattleCallback1 = gMain.callback1; -#if DEBUG - gMain.callback1 = debug_sub_80139E4; -#else gMain.callback1 = sub_8010824; -#endif SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -940,11 +939,7 @@ void sub_800F298(void) if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) { gPreBattleCallback1 = gMain.callback1; -#if DEBUG - gMain.callback1 = debug_sub_80139E4; -#else gMain.callback1 = sub_8010824; -#endif SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -1363,6 +1358,10 @@ void c2_081284E0(void) // A LOT of debug code! #if DEBUG +extern u8 gUnknown_Debug_2023B62[]; +extern const u8 Str_821F7BD[]; +extern const u8 Str_821F7DA[]; + void debug_sub_8010818(void); void debug_sub_80108B8(void); void debug_sub_8010CAC(void); @@ -1372,8 +1371,10 @@ void debug_sub_8011EA0(u8); void debug_sub_8012294(void); void debug_sub_80123D8(u8); void debug_sub_8012540(void); -void debug_sub_80125A0(void); void debug_nullsub_3(void); +void debug_sub_80125A0(void); +u32 debug_sub_8013294(u8, void *, u32); +void debug_sub_80132C8(u8, void *, u32); struct UnknownStruct2023A76 { @@ -1500,8 +1501,6 @@ void debug_sub_80108B8(void) } } -// This function matches, but it somehow affects registers in SetActionsAndBanksTurnOrder. -#ifdef NONMATCHING void debug_sub_8010A7C(u8 a, u8 b) { s32 i; @@ -1510,49 +1509,6 @@ void debug_sub_8010A7C(u8 a, u8 b) gBattleTextBuff1[i] = a; gBattleTextBuff1[i] = EOS; } -#else -__attribute__((naked)) -void debug_sub_8010A7C() -{ - asm( - " push {r4, r5, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r2, r1, #0x18\n" - " mov r1, #0x0\n" - " ldr r5, ._514 @ gBattleTextBuff1\n" - " cmp r1, r2\n" - " bge ._512 @cond_branch\n" - " add r3, r5, #0\n" - "._513:\n" - " add r0, r1, r3\n" - " strb r4, [r0]\n" - " add r1, r1, #0x1\n" - " cmp r1, r2\n" - " blt ._513 @cond_branch\n" - "._512:\n" - " add r1, r1, r5\n" - " mov r0, #0xff\n" - " strb r0, [r1]\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._515:\n" - " .align 2, 0\n" - "._514:\n" - " .word gBattleTextBuff1\n" - "\n" - ); -} -#endif - -/* -void debug_sub_8010AAC(u8 a) -{ - u32 r7 = gUnknown_Debug_030043A4 * 5; -} -*/ __attribute__((naked)) void debug_sub_8010AAC() @@ -5195,6 +5151,21 @@ void debug_sub_8012878() ); } +/* +void debug_sub_80128B4(void) +{ + debug_sub_8010A7C(0, 9); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + ConvertIntToDecimalStringN(gBattleTextBuff1, gCurrentMove, 2, 3); + gBattleTextBuff1[3] = CHAR_SPACE; + gBattleTextBuff1[4] = EOS; + StringAppend(gBattleTextBuff1, gSpeciesNames[gCurrentMove]); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); +} +*/ + __attribute__((naked)) void debug_sub_80128B4() { @@ -5261,1226 +5232,354 @@ void debug_sub_80128B4() ); } -__attribute__((naked)) -void debug_sub_8012938() +void debug_sub_8012938(u8 taskId) { - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, sl\n" - " mov r5, r9\n" - " mov r4, r8\n" - " push {r4, r5, r6}\n" - " add sp, sp, #0xfffffffc\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " mov r0, #0x0\n" - " mov r1, #0x7\n" - " bl debug_sub_8010A7C\n" - " ldr r6, ._880 @ gUnknown_03004210\n" - " ldr r4, ._880 + 4 @ gBattleTextBuff1\n" - " mov r0, #0x25\n" - " mov r8, r0\n" - " str r0, [sp]\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " mov r2, #0xa2\n" - " mov r3, #0x2\n" - " bl Text_InitWindow\n" - " add r0, r6, #0\n" - " bl Text_PrintWindow8002F44\n" - " ldr r1, ._880 + 8 @ Str_821F7B8\n" - " add r0, r4, #0\n" - " bl StringCopy\n" - " add r0, r4, #4\n" - " ldr r1, ._880 + 12 @ gUnknown_Debug_2023B62\n" - " mov sl, r1\n" - " ldr r2, ._880 + 16 @ gCurrentMove\n" - " mov r9, r2\n" - " ldrh r1, [r2]\n" - " sub r1, r1, #0x1\n" - " add r1, r1, sl\n" - " ldrb r1, [r1]\n" - " mov r2, #0x2\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, r8\n" - " str r0, [sp]\n" - " add r0, r6, #0\n" - " add r1, r4, #0\n" - " mov r2, #0xa2\n" - " mov r3, #0x2\n" - " bl Text_InitWindow\n" - " add r0, r6, #0\n" - " bl Text_PrintWindow8002F44\n" - " ldr r2, ._880 + 20 @ gSprites\n" - " ldr r1, ._880 + 24 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r1, #0xa\n" - " ldsh r0, [r0, r1]\n" - " lsl r1, r0, #0x4\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r2\n" - " mov r2, r9\n" - " ldrh r0, [r2]\n" - " sub r0, r0, #0x1\n" - " add r0, r0, sl\n" - " ldrb r0, [r0]\n" - " neg r0, r0\n" - " strh r0, [r1, #0x26]\n" - " add sp, sp, #0x4\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._881:\n" - " .align 2, 0\n" - "._880:\n" - " .word gUnknown_03004210\n" - " .word gBattleTextBuff1\n" - " .word Str_821F7B8\n" - " .word gUnknown_Debug_2023B62\n" - " .word gCurrentMove\n" - " .word gSprites\n" - " .word gTasks\n" - "\n" - ); + debug_sub_8010A7C(0, 7); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); + Text_PrintWindow8002F44(&gUnknown_03004210); + StringCopy(gBattleTextBuff1, Str_821F7B8); + ConvertIntToDecimalStringN(gBattleTextBuff1 + 4, gUnknown_Debug_2023B62[gCurrentMove - 1], 2, 3); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); + Text_PrintWindow8002F44(&gUnknown_03004210); + gSprites[gTasks[taskId].data[1]].pos2.y = -gUnknown_Debug_2023B62[gCurrentMove - 1]; } -__attribute__((naked)) -void debug_sub_80129F8() +void debug_sub_80129F8(u8 taskId) { - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add sp, sp, #0xfffffff8\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x18\n" - " ldr r6, ._882 @ gCurrentMove\n" - " ldrh r2, [r6]\n" - " lsl r0, r2, #0x3\n" - " ldr r1, ._882 + 4 @ gMonFrontPicTable\n" - " add r0, r0, r1\n" - " ldr r1, ._882 + 8 @ gMonFrontPicCoords\n" - " mov r8, r1\n" - " lsl r2, r2, #0x2\n" - " add r2, r2, r8\n" - " ldrb r1, [r2]\n" - " ldrb r2, [r2, #0x1]\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x12\n" - " ldr r4, ._882 + 12 @ gUnknown_081FAF4C\n" - " ldr r4, [r4, #0x4]\n" - " str r4, [sp]\n" - " ldrh r4, [r6]\n" - " str r4, [sp, #0x4]\n" - " bl DecompressPicFromTable_2\n" - " ldr r1, ._882 + 16 @ gMonPaletteTable\n" - " ldrh r0, [r6]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0x88\n" - " lsl r1, r1, #0x1\n" - " mov r2, #0x20\n" - " bl LoadCompressedPalette\n" - " ldr r4, ._882 + 20 @ gSprites\n" - " ldr r0, ._882 + 24 @ gTasks\n" - " lsl r2, r5, #0x2\n" - " add r2, r2, r5\n" - " lsl r2, r2, #0x3\n" - " add r2, r2, r0\n" - " mov r1, #0xa\n" - " ldsh r0, [r2, r1]\n" - " lsl r1, r0, #0x4\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r4\n" - " ldrh r0, [r6]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r8\n" - " ldrb r0, [r0, #0x1]\n" - " add r0, r0, #0x28\n" - " strh r0, [r1, #0x22]\n" - " mov r1, #0xa\n" - " ldsh r0, [r2, r1]\n" - " lsl r1, r0, #0x4\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r4\n" - " ldr r3, ._882 + 28 @ gUnknown_Debug_2023B62\n" - " ldrh r0, [r6]\n" - " sub r0, r0, #0x1\n" - " add r0, r0, r3\n" - " ldrb r0, [r0]\n" - " neg r0, r0\n" - " strh r0, [r1, #0x26]\n" - " mov r0, #0xa\n" - " ldsh r1, [r2, r0]\n" - " lsl r0, r1, #0x4\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r4\n" - " mov r1, #0x0\n" - " bl StartSpriteAnim\n" - " add sp, sp, #0x8\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._883:\n" - " .align 2, 0\n" - "._882:\n" - " .word gCurrentMove\n" - " .word gMonFrontPicTable\n" - " .word gMonFrontPicCoords\n" - " .word gUnknown_081FAF4C\n" - " .word gMonPaletteTable\n" - " .word gSprites\n" - " .word gTasks\n" - " .word gUnknown_Debug_2023B62\n" - "\n" - ); + DecompressPicFromTable_2( + &gMonFrontPicTable[gCurrentMove], + gMonFrontPicCoords[gCurrentMove].coords, + gMonFrontPicCoords[gCurrentMove].y_offset, + (void *)0x02000000, + gUnknown_081FAF4C[1], + gCurrentMove); + LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32); + gSprites[gTasks[taskId].data[1]].pos1.y = gMonFrontPicCoords[gCurrentMove].y_offset + 40; + gSprites[gTasks[taskId].data[1]].pos2.y = -gUnknown_Debug_2023B62[gCurrentMove - 1]; + StartSpriteAnim(&gSprites[gTasks[taskId].data[1]], 0); } -__attribute__((naked)) -void debug_sub_8012AC0() +void debug_sub_8012AC0(s8 a, u8 taskId) { - asm( - " push {r4, r5, r6, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r6, r1, #0x18\n" - " ldr r3, ._885 @ gCurrentMove\n" - " ldr r4, ._885 + 4 @ gBaseStats\n" - " b ._884\n" - "._886:\n" - " .align 2, 0\n" - "._885:\n" - " .word gCurrentMove\n" - " .word gBaseStats\n" - "._890:\n" - " ldrb r0, [r1, #0x7]\n" - " cmp r0, #0x2\n" - " beq ._887 @cond_branch\n" - "._884:\n" - " add r2, r3, #0\n" - " lsl r0, r5, #0x18\n" - " asr r0, r0, #0x18\n" - " ldrh r1, [r2]\n" - " add r0, r0, r1\n" - " strh r0, [r2]\n" - " lsl r0, r0, #0x10\n" - " cmp r0, #0\n" - " bne ._888 @cond_branch\n" - " ldr r1, ._891 @ 0x19b\n" - " add r0, r1, #0\n" - " strh r0, [r2]\n" - "._888:\n" - " ldrh r1, [r2]\n" - " ldr r0, ._891 @ 0x19b\n" - " cmp r1, r0\n" - " bne ._889 @cond_branch\n" - " mov r0, #0x1\n" - " strh r0, [r2]\n" - "._889:\n" - " ldrh r0, [r3]\n" - " lsl r1, r0, #0x3\n" - " sub r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r4\n" - " ldrb r0, [r1, #0x6]\n" - " cmp r0, #0x2\n" - " bne ._890 @cond_branch\n" - "._887:\n" - " bl debug_sub_80128B4\n" - " add r0, r6, #0\n" - " bl debug_sub_8012938\n" - " add r0, r6, #0\n" - " bl debug_sub_80129F8\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._892:\n" - " .align 2, 0\n" - "._891:\n" - " .word 0x19b\n" - "\n" - ); + do + { + gCurrentMove += a; + if (gCurrentMove == 0) + gCurrentMove = 411; + if (gCurrentMove == 411) + gCurrentMove = 1; + } while (gBaseStats[gCurrentMove].type1 != 2 && gBaseStats[gCurrentMove].type2 != 2); + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); } -__attribute__((naked)) -void debug_sub_8012B2C() +void debug_sub_8012B2C(u8 a) { - asm( - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x11\n" - " ldr r1, ._893 @ 0x600c772\n" - " add r2, r0, r1\n" - " mov r1, #0x1\n" - " strh r1, [r2]\n" - " ldr r1, ._893 + 4 @ 0x600c7b2\n" - " add r0, r0, r1\n" - " mov r1, #0x2\n" - " strh r1, [r0]\n" - " bx lr\n" - "._894:\n" - " .align 2, 0\n" - "._893:\n" - " .word 0x600c772\n" - " .word 0x600c7b2\n" - "\n" - ); + *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 0) * 0x20) = 1; + *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 2) * 0x20) = 2; } -__attribute__((naked)) -void debug_sub_8012B4C() +void debug_sub_8012B4C(u8 a) { - asm( - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x11\n" - " ldr r2, ._895 @ 0x600c772\n" - " add r1, r0, r2\n" - " ldr r3, ._895 + 4 @ 0x1016\n" - " add r2, r3, #0\n" - " strh r2, [r1]\n" - " ldr r1, ._895 + 8 @ 0x600c7b2\n" - " add r0, r0, r1\n" - " strh r2, [r0]\n" - " bx lr\n" - "._896:\n" - " .align 2, 0\n" - "._895:\n" - " .word 0x600c772\n" - " .word 0x1016\n" - " .word 0x600c7b2\n" - "\n" - ); + *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 0) * 0x20) = 0x1016; + *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 2) * 0x20) = 0x1016; } -__attribute__((naked)) -void debug_sub_8012B70() +void debug_sub_8012B70(u8 taskId, u8 b) { - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " lsl r1, r1, #0x18\n" - " lsr r6, r1, #0x18\n" - " cmp r6, #0\n" - " beq ._897 @cond_branch\n" - " mov r4, #0x1\n" - " str r4, [sp]\n" - " mov r0, #0x18\n" - " mov r1, #0x1c\n" - " mov r2, #0x1d\n" - " mov r3, #0x21\n" - " bl sub_802BBD4\n" - " bl debug_sub_80128B4\n" - " add r0, r5, #0\n" - " bl debug_sub_8012938\n" - " add r0, r5, #0\n" - " bl debug_sub_80129F8\n" - " ldr r1, ._899 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " strh r4, [r0, #0x8]\n" - " b ._898\n" - "._900:\n" - " .align 2, 0\n" - "._899:\n" - " .word gTasks\n" - "._897:\n" - " str r6, [sp]\n" - " mov r0, #0x18\n" - " mov r1, #0x1c\n" - " mov r2, #0x1d\n" - " mov r3, #0x21\n" - " bl sub_802BBD4\n" - " ldr r0, ._901 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " mov r0, #0x2\n" - " strh r0, [r4, #0x8]\n" - " ldr r5, ._901 + 4 @ gUnknown_03004210\n" - " ldr r1, ._901 + 8 @ Str_821F7DA\n" - " mov r2, #0xa4\n" - " lsl r2, r2, #0x2\n" - " mov r0, #0x1d\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " mov r3, #0x1a\n" - " bl Text_InitWindow\n" - " add r0, r5, #0\n" - " bl Text_PrintWindow8002F44\n" - " strh r6, [r4, #0xe]\n" - " mov r0, #0x0\n" - " bl debug_sub_8012B2C\n" - "._898:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._902:\n" - " .align 2, 0\n" - "._901:\n" - " .word gTasks\n" - " .word gUnknown_03004210\n" - " .word Str_821F7DA\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8012C08() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xfffffffc\n" - " add r4, r1, #0\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " mov r0, #0x0\n" - " mov r1, #0x9\n" - " bl debug_sub_8010A7C\n" - " ldr r7, ._905 @ gUnknown_03004210\n" - " ldr r5, ._905 + 4 @ gBattleTextBuff1\n" - " mov r0, #0x23\n" - " mov r8, r0\n" - " str r0, [sp]\n" - " add r0, r7, #0\n" - " add r1, r5, #0\n" - " mov r2, #0x90\n" - " mov r3, #0x2\n" - " bl Text_InitWindow\n" - " add r0, r7, #0\n" - " bl Text_PrintWindow8002F44\n" - " mov r0, #0x0\n" - " mov r1, #0x7\n" - " bl debug_sub_8010A7C\n" - " mov r0, #0x25\n" - " str r0, [sp]\n" - " add r0, r7, #0\n" - " add r1, r5, #0\n" - " mov r2, #0xa2\n" - " mov r3, #0x2\n" - " bl Text_InitWindow\n" - " add r0, r7, #0\n" - " bl Text_PrintWindow8002F44\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, #0x18\n" - " mov r1, #0x1c\n" - " mov r2, #0x1d\n" - " mov r3, #0x21\n" - " bl sub_802BBD4\n" - " cmp r4, #0\n" - " beq ._903 @cond_branch\n" - " ldr r1, ._905 + 8 @ gTasks\n" - " lsl r4, r6, #0x2\n" - " add r0, r4, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r1, #0x4\n" - " strh r1, [r0, #0x8]\n" - " ldr r1, ._905 + 12 @ gUnknown_Debug_821F7F3\n" - " mov r0, r8\n" - " str r0, [sp]\n" - " add r0, r7, #0\n" - " mov r2, #0x90\n" - " mov r3, #0x2\n" - " bl Text_InitWindow\n" - " b ._904\n" - "._906:\n" - " .align 2, 0\n" - "._905:\n" - " .word gUnknown_03004210\n" - " .word gBattleTextBuff1\n" - " .word gTasks\n" - " .word gUnknown_Debug_821F7F3\n" - "._903:\n" - " ldr r1, ._907 @ gTasks\n" - " lsl r4, r6, #0x2\n" - " add r0, r4, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r1, #0x3\n" - " strh r1, [r0, #0x8]\n" - " ldr r1, ._907 + 4 @ Str_821F7EA\n" - " mov r0, r8\n" - " str r0, [sp]\n" - " add r0, r7, #0\n" - " mov r2, #0x90\n" - " mov r3, #0x2\n" - " bl Text_InitWindow\n" - "._904:\n" - " add r5, r4, #0\n" - " ldr r4, ._907 + 8 @ gUnknown_03004210\n" - " add r0, r4, #0\n" - " bl Text_PrintWindow8002F44\n" - " ldr r1, ._907 + 12 @ BattleText_YesNo\n" - " mov r2, #0xa4\n" - " lsl r2, r2, #0x2\n" - " mov r0, #0x1d\n" - " str r0, [sp]\n" - " add r0, r4, #0\n" - " mov r3, #0x1a\n" - " bl Text_InitWindow\n" - " add r0, r4, #0\n" - " bl Text_PrintWindow8002F44\n" - " ldr r1, ._907 @ gTasks\n" - " add r0, r5, r6\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r1, #0x1\n" - " strh r1, [r0, #0xe]\n" - " mov r0, #0x1\n" - " bl debug_sub_8012B2C\n" - " add sp, sp, #0x4\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._908:\n" - " .align 2, 0\n" - "._907:\n" - " .word gTasks\n" - " .word Str_821F7EA\n" - " .word gUnknown_03004210\n" - " .word BattleText_YesNo\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_8012D10() -{ - asm( - " push {r4, r5, lr}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " ldr r1, ._911 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r1, #0x8\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0x4\n" - " bls ._909 @cond_branch\n" - " b ._1067\n" - "._909:\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._911 + 4 @ \n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._912:\n" - " .align 2, 0\n" - "._911:\n" - " .word gTasks\n" - " .word ._913\n" - "._913:\n" - " .word ._914\n" - " .word ._915\n" - " .word ._916\n" - " .word ._917\n" - " .word ._918\n" - "._914:\n" - " bl debug_sub_80128B4\n" - " add r0, r5, #0\n" - " bl debug_sub_8012938\n" - " ldr r4, ._920 @ gUnknown_03004210\n" - " ldr r1, ._920 + 4 @ Str_821F7BD\n" - " mov r2, #0xc8\n" - " lsl r2, r2, #0x1\n" - " mov r0, #0x23\n" - " str r0, [sp]\n" - " add r0, r4, #0\n" - " mov r3, #0x13\n" - " bl Text_InitWindow\n" - " add r0, r4, #0\n" - " bl Text_PrintWindow8002F44\n" - " ldr r1, ._920 + 8 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldrh r1, [r0, #0x8]\n" - " add r1, r1, #0x1\n" - " strh r1, [r0, #0x8]\n" - " ldrb r0, [r0, #0xc]\n" - " b ._919\n" - "._921:\n" - " .align 2, 0\n" - "._920:\n" - " .word gUnknown_03004210\n" - " .word Str_821F7BD\n" - " .word gTasks\n" - "._915:\n" - " ldr r2, ._924 @ gMain\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._922 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._924 + 4 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " ldrb r0, [r4, #0xc]\n" - " bl nullsub_8\n" - " ldrh r1, [r4, #0xc]\n" - " mov r0, #0x3\n" - " neg r0, r0\n" - " and r0, r0, r1\n" - " b ._931\n" - "._925:\n" - " .align 2, 0\n" - "._924:\n" - " .word gMain\n" - " .word gTasks\n" - "._922:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._926 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._928 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " ldrb r0, [r4, #0xc]\n" - " bl nullsub_8\n" - " ldrh r1, [r4, #0xc]\n" - " mov r0, #0x2\n" - " b ._927\n" - "._929:\n" - " .align 2, 0\n" - "._928:\n" - " .word gTasks\n" - "._926:\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._930 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._932 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " ldrb r0, [r4, #0xc]\n" - " bl nullsub_8\n" - " ldrh r1, [r4, #0xc]\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " and r0, r0, r1\n" - " b ._931\n" - "._933:\n" - " .align 2, 0\n" - "._932:\n" - " .word gTasks\n" - "._930:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._934 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._936 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " ldrb r0, [r4, #0xc]\n" - " bl nullsub_8\n" - " ldrh r1, [r4, #0xc]\n" - " mov r0, #0x1\n" - "._927:\n" - " orr r0, r0, r1\n" - "._931:\n" - " strh r0, [r4, #0xc]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - "._919:\n" - " mov r1, #0x0\n" - " bl sub_802E3E4\n" - " b ._1067\n" - "._937:\n" - " .align 2, 0\n" - "._936:\n" - " .word gTasks\n" - "._934:\n" - " ldrh r1, [r2, #0x30]\n" - " mov r4, #0x1\n" - " add r0, r4, #0\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._938 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._943 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r2, #0xc\n" - " ldsh r0, [r0, r2]\n" - " cmp r0, #0x1\n" - " beq ._939 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._940 @cond_branch\n" - " cmp r0, #0\n" - " beq ._941 @cond_branch\n" - " b ._1067\n" - "._944:\n" - " .align 2, 0\n" - "._943:\n" - " .word gTasks\n" - "._940:\n" - " cmp r0, #0x2\n" - " beq ._945 @cond_branch\n" - "._990:\n" - " cmp r0, #0x3\n" - " bne ._946 @cond_branch\n" - " b ._1014\n" - "._946:\n" - " b ._1067\n" - "._941:\n" - " ldr r1, ._952 @ gUnknown_Debug_2023B62\n" - " ldr r0, ._952 + 4 @ gCurrentMove\n" - " ldrh r0, [r0]\n" - " sub r0, r0, #0x1\n" - " add r1, r0, r1\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x3f\n" - " bls ._949 @cond_branch\n" - " b ._1067\n" - "._949:\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " b ._1019\n" - "._953:\n" - " .align 2, 0\n" - "._952:\n" - " .word gUnknown_Debug_2023B62\n" - " .word gCurrentMove\n" - "._939:\n" - " mov r0, #0x1\n" - " b ._997\n" - "._945:\n" - " ldr r1, ._957 @ gCurrentMove\n" - " ldrh r2, [r1]\n" - " mov r0, #0xcd\n" - " lsl r0, r0, #0x1\n" - " cmp r2, r0\n" - " bhi ._955 @cond_branch\n" - " add r0, r2, #1\n" - "._979:\n" - " strh r0, [r1]\n" - " b ._1025\n" - "._958:\n" - " .align 2, 0\n" - "._957:\n" - " .word gCurrentMove\n" - "._955:\n" - " strh r4, [r1]\n" - " b ._1025\n" - "._938:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._960 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._966 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r1, #0xc\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0x1\n" - " bne ._961 @cond_branch\n" - " b ._1007\n" - "._961:\n" - " cmp r0, #0x1\n" - " bgt ._963 @cond_branch\n" - " cmp r0, #0\n" - " beq ._964 @cond_branch\n" - " b ._1067\n" - "._967:\n" - " .align 2, 0\n" - "._966:\n" - " .word gTasks\n" - "._963:\n" - " cmp r0, #0x2\n" - " beq ._968 @cond_branch\n" - " b ._990\n" - "._964:\n" - " ldr r1, ._973 @ gUnknown_Debug_2023B62\n" - " ldr r0, ._973 + 4 @ gCurrentMove\n" - " ldrh r0, [r0]\n" - " sub r0, r0, #0x1\n" - " add r1, r0, r1\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " bne ._970 @cond_branch\n" - " b ._1067\n" - "._970:\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " b ._1019\n" - "._974:\n" - " .align 2, 0\n" - "._973:\n" - " .word gUnknown_Debug_2023B62\n" - " .word gCurrentMove\n" - "._968:\n" - " ldr r1, ._977 @ gCurrentMove\n" - " ldrh r0, [r1]\n" - " cmp r0, #0x1\n" - " bls ._975 @cond_branch\n" - " sub r0, r0, #0x1\n" - " b ._979\n" - "._978:\n" - " .align 2, 0\n" - "._977:\n" - " .word gCurrentMove\n" - "._975:\n" - " ldr r2, ._980 @ 0x19b\n" - " add r0, r2, #0\n" - " b ._979\n" - "._981:\n" - " .align 2, 0\n" - "._980:\n" - " .word 0x19b\n" - "._960:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._982 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._987 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r1, #0xc\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0x1\n" - " beq ._983 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._984 @cond_branch\n" - " cmp r0, #0\n" - " beq ._985 @cond_branch\n" - " b ._1067\n" - "._988:\n" - " .align 2, 0\n" - "._987:\n" - " .word gTasks\n" - "._984:\n" - " cmp r0, #0x2\n" - " beq ._989 @cond_branch\n" - " b ._990\n" - "._985:\n" - " ldr r3, ._995 @ gUnknown_Debug_2023B62\n" - " ldr r2, ._995 + 4 @ gCurrentMove\n" - " ldrh r0, [r2]\n" - " sub r0, r0, #0x1\n" - " add r1, r0, r3\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x3f\n" - " bls ._991 @cond_branch\n" - " b ._1067\n" - "._991:\n" - " add r0, r0, #0x8\n" - " strb r0, [r1]\n" - " ldrh r0, [r2]\n" - " sub r0, r0, #0x1\n" - " add r1, r0, r3\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x40\n" - " bls ._1019 @cond_branch\n" - " mov r0, #0x40\n" - " strb r0, [r1]\n" - " b ._1019\n" - "._996:\n" - " .align 2, 0\n" - "._995:\n" - " .word gUnknown_Debug_2023B62\n" - " .word gCurrentMove\n" - "._983:\n" - " mov r0, #0x1\n" - " b ._997\n" - "._989:\n" - " ldr r3, ._1000 @ gCurrentMove\n" - " ldrh r2, [r3]\n" - " add r1, r2, #0\n" - " add r1, r1, #0xa\n" - " ldr r0, ._1000 + 4 @ 0x19b\n" - " cmp r1, r0\n" - " bgt ._998 @cond_branch\n" - " strh r1, [r3]\n" - " b ._1025\n" - "._1001:\n" - " .align 2, 0\n" - "._1000:\n" - " .word gCurrentMove\n" - " .word 0x19b\n" - "._998:\n" - " ldr r1, ._1003 @ 0xfffffe70\n" - " add r0, r2, r1\n" - " strh r0, [r3]\n" - " b ._1025\n" - "._1004:\n" - " .align 2, 0\n" - "._1003:\n" - " .word 0xfffffe70\n" - "._982:\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._1005 @cond_branch\n" - " b ._1067\n" - "._1005:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r1, ._1011 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r2, #0xc\n" - " ldsh r3, [r0, r2]\n" - " cmp r3, #0x1\n" - " beq ._1007 @cond_branch\n" - " cmp r3, #0x1\n" - " bgt ._1008 @cond_branch\n" - " cmp r3, #0\n" - " beq ._1009 @cond_branch\n" - " b ._1067\n" - "._1012:\n" - " .align 2, 0\n" - "._1011:\n" - " .word gTasks\n" - "._1008:\n" - " cmp r3, #0x2\n" - " beq ._1013 @cond_branch\n" - " cmp r3, #0x3\n" - " beq ._1014 @cond_branch\n" - " b ._1067\n" - "._1009:\n" - " ldr r1, ._1020 @ gUnknown_Debug_2023B62\n" - " ldr r0, ._1020 + 4 @ gCurrentMove\n" - " ldrh r0, [r0]\n" - " sub r0, r0, #0x1\n" - " add r2, r0, r1\n" - " ldrb r0, [r2]\n" - " add r1, r0, #0\n" - " cmp r1, #0\n" - " bne ._1016 @cond_branch\n" - " b ._1067\n" - "._1016:\n" - " cmp r1, #0x8\n" - " bls ._1018 @cond_branch\n" - " sub r0, r0, #0x8\n" - " strb r0, [r2]\n" - " b ._1019\n" - "._1021:\n" - " .align 2, 0\n" - "._1020:\n" - " .word gUnknown_Debug_2023B62\n" - " .word gCurrentMove\n" - "._1018:\n" - " strb r3, [r2]\n" - "._1019:\n" - " add r0, r5, #0\n" - " bl debug_sub_8012938\n" - " b ._1067\n" - "._1007:\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - "._997:\n" - " add r1, r5, #0\n" - " bl debug_sub_8012AC0\n" - " b ._1067\n" - "._1013:\n" - " ldr r2, ._1026 @ gCurrentMove\n" - " ldrh r0, [r2]\n" - " add r1, r0, #0\n" - " sub r1, r1, #0xa\n" - " cmp r1, #0x1\n" - " ble ._1024 @cond_branch\n" - " strh r1, [r2]\n" - " b ._1025\n" - "._1027:\n" - " .align 2, 0\n" - "._1026:\n" - " .word gCurrentMove\n" - "._1024:\n" - " mov r1, #0xc8\n" - " lsl r1, r1, #0x1\n" - " add r0, r0, r1\n" - " strh r0, [r2]\n" - "._1025:\n" - " bl debug_sub_80128B4\n" - " add r0, r5, #0\n" - " bl debug_sub_8012938\n" - " add r0, r5, #0\n" - " bl debug_sub_80129F8\n" - " b ._1067\n" - "._1014:\n" - " add r0, r5, #0\n" - " mov r1, #0x0\n" - " bl debug_sub_8012B70\n" - " b ._1067\n" - "._916:\n" - " ldr r0, ._1032 @ gMain\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1030 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._1032 + 4 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " ldrb r0, [r4, #0xe]\n" - " bl debug_sub_8012B4C\n" - " mov r0, #0x0\n" - " b ._1055\n" - "._1033:\n" - " .align 2, 0\n" - "._1032:\n" - " .word gMain\n" - " .word gTasks\n" - "._1030:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._1046 @cond_branch\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1035 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._1037 @ gTasks\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " ldrb r1, [r1, #0xe]\n" - " add r0, r5, #0\n" - " bl debug_sub_8012C08\n" - " b ._1067\n" - "._1038:\n" - " .align 2, 0\n" - "._1037:\n" - " .word gTasks\n" - "._1035:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._1039 @cond_branch\n" - " b ._1067\n" - "._1039:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " b ._1063\n" - "._917:\n" - " ldr r0, ._1044 @ gMain\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1042 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._1044 + 4 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " ldrb r0, [r4, #0xe]\n" - " bl debug_sub_8012B4C\n" - " mov r0, #0x0\n" - " b ._1055\n" - "._1045:\n" - " .align 2, 0\n" - "._1044:\n" - " .word gMain\n" - " .word gTasks\n" - "._1042:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._1046 @cond_branch\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1047 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._1050 @ gTasks\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " mov r2, #0xe\n" - " ldsh r0, [r1, r2]\n" - " cmp r0, #0\n" - " bne ._1063 @cond_branch\n" - " ldr r1, ._1050 + 4 @ gUnknown_Debug_2023B62\n" - " ldr r2, ._1050 + 8 @ 0x19b\n" - " mov r0, #0x1f\n" - " bl debug_sub_80132C8\n" - " b ._1063\n" - "._1051:\n" - " .align 2, 0\n" - "._1050:\n" - " .word gTasks\n" - " .word gUnknown_Debug_2023B62\n" - " .word 0x19b\n" - "._1047:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1067 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " b ._1063\n" - "._918:\n" - " ldr r0, ._1056 @ gMain\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1054 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._1056 + 4 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " ldrb r0, [r4, #0xe]\n" - " bl debug_sub_8012B4C\n" - " mov r0, #0x0\n" - " b ._1055\n" - "._1057:\n" - " .align 2, 0\n" - "._1056:\n" - " .word gMain\n" - " .word gTasks\n" - "._1054:\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1058 @cond_branch\n" - "._1046:\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._1060 @ gTasks\n" - " lsl r4, r5, #0x2\n" - " add r4, r4, r5\n" - " lsl r4, r4, #0x3\n" - " add r4, r4, r0\n" - " ldrb r0, [r4, #0xe]\n" - " bl debug_sub_8012B4C\n" - " mov r0, #0x1\n" - "._1055:\n" - " strh r0, [r4, #0xe]\n" - " bl debug_sub_8012B2C\n" - " b ._1067\n" - "._1061:\n" - " .align 2, 0\n" - "._1060:\n" - " .word gTasks\n" - "._1058:\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1062 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " ldr r0, ._1065 @ gTasks\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " mov r2, #0xe\n" - " ldsh r0, [r1, r2]\n" - " cmp r0, #0\n" - " bne ._1063 @cond_branch\n" - " ldr r1, ._1065 + 4 @ gUnknown_Debug_2023B62\n" - " ldr r2, ._1065 + 8 @ 0x19b\n" - " mov r0, #0x1f\n" - " bl debug_sub_8013294\n" - "._1063:\n" - " add r0, r5, #0\n" - " mov r1, #0x1\n" - " bl debug_sub_8012B70\n" - " b ._1067\n" - "._1066:\n" - " .align 2, 0\n" - "._1065:\n" - " .word gTasks\n" - " .word gUnknown_Debug_2023B62\n" - " .word 0x19b\n" - "._1062:\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1067 @cond_branch\n" - " mov r0, #0x5\n" - " bl PlaySE\n" - " add r0, r5, #0\n" - " mov r1, #0x1\n" - " bl debug_sub_8012B70\n" - "._1067:\n" - " add sp, sp, #0x4\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + if (b != 0) + { + sub_802BBD4(24, 28, 29, 33, 1); + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + gTasks[taskId].data[0] = 1; + } + else + { + sub_802BBD4(24, 28, 29, 33, 0); + gTasks[taskId].data[0] = 2; + Text_InitWindow(&gUnknown_03004210, Str_821F7DA, 656, 26, 29); + Text_PrintWindow8002F44(&gUnknown_03004210); + gTasks[taskId].data[3] = 0; + debug_sub_8012B2C(0); + } +} + +void debug_sub_8012C08(u8 taskId, u8 b) +{ + debug_sub_8010A7C(0, 9); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + debug_sub_8010A7C(0, 7); + Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37); + Text_PrintWindow8002F44(&gUnknown_03004210); + sub_802BBD4(24, 28, 29, 33, 0); + if (b != 0) + { + gTasks[taskId].data[0] = 4; + Text_InitWindow(&gUnknown_03004210, gUnknown_Debug_821F7F3, 144, 2, 35); + } + else + { + gTasks[taskId].data[0] = 3; + Text_InitWindow(&gUnknown_03004210, Str_821F7EA, 144, 2, 35); + } + Text_PrintWindow8002F44(&gUnknown_03004210); + Text_InitWindow(&gUnknown_03004210, BattleText_YesNo, 656, 26, 29); + Text_PrintWindow8002F44(&gUnknown_03004210); + gTasks[taskId].data[3] = 1; + debug_sub_8012B2C(1); +} + +void debug_sub_8012D10(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + debug_sub_80128B4(); + debug_sub_8012938(taskId); + Text_InitWindow(&gUnknown_03004210, Str_821F7BD, 400, 19, 35); + Text_PrintWindow8002F44(&gUnknown_03004210); + gTasks[taskId].data[0]++; + sub_802E3E4(gTasks[taskId].data[2], 0); + break; + case 1: + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + nullsub_8(gTasks[taskId].data[2]); + gTasks[taskId].data[2] &= ~2; + sub_802E3E4(gTasks[taskId].data[2], 0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + nullsub_8(gTasks[taskId].data[2]); + gTasks[taskId].data[2] |= 2; + sub_802E3E4(gTasks[taskId].data[2], 0); + } + else if (gMain.newKeys & DPAD_LEFT) + { + PlaySE(SE_SELECT); + nullsub_8(gTasks[taskId].data[2]); + gTasks[taskId].data[2] &= ~1; + sub_802E3E4(gTasks[taskId].data[2], 0); + } + else if (gMain.newKeys & DPAD_RIGHT) + { + PlaySE(SE_SELECT); + nullsub_8(gTasks[taskId].data[2]); + gTasks[taskId].data[2] |= 1; + sub_802E3E4(gTasks[taskId].data[2], 0); + } + else if (gMain.newAndRepeatedKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + switch (gTasks[taskId].data[2]) + { + case 0: + if (gUnknown_Debug_2023B62[gCurrentMove - 1] < 64) + { + gUnknown_Debug_2023B62[gCurrentMove - 1] += 1; + debug_sub_8012938(taskId); + } + break; + case 1: + debug_sub_8012AC0(1, taskId); + break; + case 2: + if (gCurrentMove < 411) + gCurrentMove++; + else + gCurrentMove = 1; + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + break; + case 3: + debug_sub_8012B70(taskId, 0); + break; + } + } + else if (gMain.newAndRepeatedKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + switch (gTasks[taskId].data[2]) + { + case 0: + if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 0) + { + gUnknown_Debug_2023B62[gCurrentMove - 1] -= 1; + debug_sub_8012938(taskId); + } + break; + case 1: + debug_sub_8012AC0(-1, taskId); + break; + case 2: + if (gCurrentMove > 1) + gCurrentMove--; + else + gCurrentMove = 411; + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + break; + case 3: + debug_sub_8012B70(taskId, 0); + break; + } + } + else if (gMain.newAndRepeatedKeys & R_BUTTON) + { + PlaySE(SE_SELECT); + switch (gTasks[taskId].data[2]) + { + case 0: + if (gUnknown_Debug_2023B62[gCurrentMove - 1] < 64) + { + gUnknown_Debug_2023B62[gCurrentMove - 1] += 8; + if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 64) + gUnknown_Debug_2023B62[gCurrentMove - 1] = 64; + debug_sub_8012938(taskId); + } + break; + case 1: + debug_sub_8012AC0(1, taskId); + break; + case 2: + if (gCurrentMove + 10 < 412) + gCurrentMove += 10; + else + gCurrentMove -= 400; + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + break; + case 3: + debug_sub_8012B70(taskId, 0); + break; + } + } + else if (gMain.newAndRepeatedKeys & L_BUTTON) + { + PlaySE(SE_SELECT); + switch (gTasks[taskId].data[2]) + { + case 0: + if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 0) + { + if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 8) + gUnknown_Debug_2023B62[gCurrentMove - 1] -= 8; + else + gUnknown_Debug_2023B62[gCurrentMove - 1] = 0; + debug_sub_8012938(taskId); + } + break; + case 1: + debug_sub_8012AC0(-1, taskId); + break; + case 2: + if (gCurrentMove - 10 > 1) + gCurrentMove -= 10; + else + gCurrentMove += 400; + debug_sub_80128B4(); + debug_sub_8012938(taskId); + debug_sub_80129F8(taskId); + break; + case 3: + debug_sub_8012B70(taskId, 0); + break; + } + } + break; + case 2: + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 0; + debug_sub_8012B2C(0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 1; + debug_sub_8012B2C(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + debug_sub_8012C08(taskId, gTasks[taskId].data[3]); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + asm(""); + debug_sub_8012B70(taskId, 1); + } + return; + case 3: + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 0; + debug_sub_8012B2C(0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 1; + debug_sub_8012B2C(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gTasks[taskId].data[3] == 0) + debug_sub_80132C8(31, gUnknown_Debug_2023B62, 411); + debug_sub_8012B70(taskId, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + debug_sub_8012B70(taskId, 1); + } + break; + case 4: + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 0; + debug_sub_8012B2C(0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + debug_sub_8012B4C(gTasks[taskId].data[3]); + gTasks[taskId].data[3] = 1; + debug_sub_8012B2C(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gTasks[taskId].data[3] == 0) + debug_sub_8013294(31, gUnknown_Debug_2023B62, 411); + debug_sub_8012B70(taskId, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + debug_sub_8012B70(taskId, 1); + } + break; + } } u8 debug_sub_8013240(void) @@ -6769,683 +5868,103 @@ void dp11b_obj_free(u8 a, u8 b) } else { - if (!ewram17810[a].unk0_2) - return; - r4 = gSprites[ewram17810[a].unk3].data[3]; - DestroySprite(&gSprites[ewram17810[a].unk3]); - ewram17810[a].unk0_2 = 0; - } - gSprites[r4].pos2.x = 0; - gSprites[r4].pos2.y = 0; -} - -void objc_dp11b_pingpong(struct Sprite *sprite) -{ - u8 spriteId = sprite->data[3]; - s32 var; - - if (sprite->data[4] == 1) - var = sprite->data[0]; - else - var = sprite->data[0]; - - gSprites[spriteId].pos2.y = Sin(var, sprite->data[2]) + sprite->data[2]; - sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; -} - -void nullsub_41(void) -{ -} - -void sub_8010800(void) -{ - sub_8010874(); - gBattleCommunication[1] = 0; - gBattleMainFunc = bc_8012FAC; -} - -#if DEBUG -__attribute__((naked)) -void debug_sub_80138CC() -{ - asm( - " push {lr}\n" - " ldr r0, ._1167 @ gActiveBank\n" - " ldrb r0, [r0]\n" - " bl GetBankSide\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._1163 @cond_branch\n" - " b ._1186\n" - "._1163:\n" - " ldr r1, ._1167 + 4 @ gSharedMem\n" - " ldr r2, ._1167 + 8 @ 0x160fd\n" - " add r0, r1, r2\n" - " ldrb r0, [r0]\n" - " add r2, r1, #0\n" - " cmp r0, #0x4\n" - " bls ._1165 @cond_branch\n" - " b ._1186\n" - "._1165:\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._1167 + 12 @ \n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._1168:\n" - " .align 2, 0\n" - "._1167:\n" - " .word gActiveBank\n" - " .word gSharedMem\n" - " .word 0x160fd\n" - " .word ._1169\n" - "._1169:\n" - " .word ._1170\n" - " .word ._1171\n" - " .word ._1172\n" - " .word ._1173\n" - " .word ._1174\n" - "._1170:\n" - " ldr r1, ._1177 @ gBattleBankFunc\n" - " ldr r0, ._1177 + 4 @ gActiveBank\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r1\n" - " ldr r1, [r0]\n" - " ldr r0, ._1177 + 8 @ sub_802C098\n" - " cmp r1, r0\n" - " bne ._1186 @cond_branch\n" - " ldr r0, ._1177 + 12 @ 0x160fd\n" - " add r1, r2, r0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " b ._1187\n" - "._1178:\n" - " .align 2, 0\n" - "._1177:\n" - " .word gBattleBankFunc\n" - " .word gActiveBank\n" - " .word sub_802C098+1\n" - " .word 0x160fd\n" - "._1171:\n" - " ldr r1, ._1180 @ gMain\n" - " mov r0, #0x1\n" - " strh r0, [r1, #0x2c]\n" - " strh r0, [r1, #0x2e]\n" - " ldr r0, ._1180 + 4 @ 0x160fd\n" - " add r1, r2, r0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r0, ._1180 + 8 @ 0x160fe\n" - " add r1, r2, r0\n" - " mov r0, #0x80\n" - " b ._1187\n" - "._1181:\n" - " .align 2, 0\n" - "._1180:\n" - " .word gMain\n" - " .word 0x160fd\n" - " .word 0x160fe\n" - "._1172:\n" - " ldr r0, ._1184 @ 0x160fe\n" - " add r3, r2, r0\n" - " ldrb r0, [r3]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r3]\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._1186 @cond_branch\n" - " ldr r1, ._1184 + 4 @ gMain\n" - " mov r0, #0x1\n" - " strh r0, [r1, #0x2c]\n" - " strh r0, [r1, #0x2e]\n" - " ldr r0, ._1184 + 8 @ 0x160fd\n" - " add r1, r2, r0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, #0x80\n" - " strb r0, [r3]\n" - " b ._1186\n" - "._1185:\n" - " .align 2, 0\n" - "._1184:\n" - " .word 0x160fe\n" - " .word gMain\n" - " .word 0x160fd\n" - "._1173:\n" - " ldr r0, ._1188 @ 0x160fe\n" - " add r1, r2, r0\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._1186 @cond_branch\n" - " ldr r1, ._1188 + 4 @ gMain\n" - " mov r0, #0x1\n" - " strh r0, [r1, #0x2c]\n" - " strh r0, [r1, #0x2e]\n" - " ldr r0, ._1188 + 8 @ 0x160fd\n" - " add r1, r2, r0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " b ._1187\n" - "._1189:\n" - " .align 2, 0\n" - "._1188:\n" - " .word 0x160fe\n" - " .word gMain\n" - " .word 0x160fd\n" - "._1174:\n" - " ldr r0, ._1190 @ 0x160fd\n" - " add r1, r2, r0\n" - " mov r0, #0x0\n" - "._1187:\n" - " strb r0, [r1]\n" - "._1186:\n" - " pop {r0}\n" - " bx r0\n" - "._1191:\n" - " .align 2, 0\n" - "._1190:\n" - " .word 0x160fd\n" - "\n" - ); + if (!ewram17810[a].unk0_2) + return; + r4 = gSprites[ewram17810[a].unk3].data[3]; + DestroySprite(&gSprites[ewram17810[a].unk3]); + ewram17810[a].unk0_2 = 0; + } + gSprites[r4].pos2.x = 0; + gSprites[r4].pos2.y = 0; } -__attribute__((naked)) -void debug_sub_80139E4() +void objc_dp11b_pingpong(struct Sprite *sprite) { - asm( - " push {r4, r5, lr}\n" - " ldr r0, ._1198 @ gUnknown_02023A14_50\n" - " ldrb r1, [r0]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0\n" - " beq ._1192 @cond_branch\n" - " ldr r2, ._1198 + 4 @ gActiveBank\n" - " mov r0, #0x0\n" - " strb r0, [r2]\n" - " ldr r1, ._1198 + 8 @ gNoOfAllBanks\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._1193 @cond_branch\n" - " add r4, r2, #0\n" - " add r5, r1, #0\n" - "._1194:\n" - " bl debug_sub_80138CC\n" - " ldrb r0, [r4]\n" - " add r0, r0, #0x1\n" - " strb r0, [r4]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldrb r1, [r5]\n" - " cmp r0, r1\n" - " bcc ._1194 @cond_branch\n" - "._1193:\n" - " ldr r0, ._1198 + 12 @ gBattleMainFunc\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " ldr r1, ._1198 + 4 @ gActiveBank\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " ldr r0, ._1198 + 8 @ gNoOfAllBanks\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._1200 @cond_branch\n" - " ldr r5, ._1198 + 16 @ gBattleBankFunc\n" - " add r4, r1, #0\n" - "._1196:\n" - " ldrb r0, [r4]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r5\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " ldrb r0, [r4]\n" - " add r0, r0, #0x1\n" - " strb r0, [r4]\n" - " ldr r1, ._1198 + 8 @ gNoOfAllBanks\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldrb r1, [r1]\n" - " cmp r0, r1\n" - " bcc ._1196 @cond_branch\n" - " b ._1200\n" - "._1199:\n" - " .align 2, 0\n" - "._1198:\n" - " .word gUnknown_02023A14_50\n" - " .word gActiveBank\n" - " .word gNoOfAllBanks\n" - " .word gBattleMainFunc\n" - " .word gBattleBankFunc\n" - "._1192:\n" - " ldr r0, ._1202 @ gBattleMainFunc\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " ldr r1, ._1202 + 4 @ gActiveBank\n" - " strb r4, [r1]\n" - " ldr r0, ._1202 + 8 @ gNoOfAllBanks\n" - " ldrb r0, [r0]\n" - " cmp r4, r0\n" - " bcs ._1200 @cond_branch\n" - " ldr r5, ._1202 + 12 @ gBattleBankFunc\n" - " add r4, r1, #0\n" - "._1201:\n" - " ldrb r0, [r4]\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r5\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " ldrb r0, [r4]\n" - " add r0, r0, #0x1\n" - " strb r0, [r4]\n" - " ldr r1, ._1202 + 8 @ gNoOfAllBanks\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldrb r1, [r1]\n" - " cmp r0, r1\n" - " bcc ._1201 @cond_branch\n" - "._1200:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._1203:\n" - " .align 2, 0\n" - "._1202:\n" - " .word gBattleMainFunc\n" - " .word gActiveBank\n" - " .word gNoOfAllBanks\n" - " .word gBattleBankFunc\n" - "\n" - ); + u8 spriteId = sprite->data[3]; + s32 var; + + if (sprite->data[4] == 1) + var = sprite->data[0]; + else + var = sprite->data[0]; + + gSprites[spriteId].pos2.y = Sin(var, sprite->data[2]) + sprite->data[2]; + sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; } -__attribute__((naked)) -void sub_8010874() +void nullsub_41(void) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " mov r0, #0x0\n" - " bl TurnValuesCleanUp\n" - " bl SpecialStatusesClear\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " ldr r0, ._1215 @ gUnknown_02024C4C\n" - " mov sl, r0\n" - " ldr r1, ._1215 + 4 @ gLastHitByType\n" - " mov r9, r1\n" - " ldr r4, ._1215 + 8 @ gLastLandedMoves\n" - " mov r8, r4\n" - " ldr r0, ._1215 + 12 @ gLastUsedMove\n" - " mov ip, r0\n" - " ldr r4, ._1215 + 16 @ gDisableStructs\n" - " mov r5, #0x0\n" - " ldr r7, ._1215 + 20 @ gUnknown_02024C2C\n" - " ldr r6, ._1215 + 24 @ gLockedMoves\n" - "._1205:\n" - " ldr r0, ._1215 + 28 @ gStatuses3\n" - " add r0, r5, r0\n" - " str r3, [r0]\n" - " mov r1, #0x0\n" - "._1204:\n" - " add r0, r4, r1\n" - " strb r3, [r0]\n" - " add r1, r1, #0x1\n" - " cmp r1, #0x1b\n" - " bls ._1204 @cond_branch\n" - " mov r0, #0x2\n" - " strb r0, [r4, #0x16]\n" - " ldr r1, ._1215 + 32 @ gUnknown_02024C70\n" - " add r0, r2, r1\n" - " strb r3, [r0]\n" - " mov r0, ip\n" - " strh r3, [r0]\n" - " mov r1, r8\n" - " strh r3, [r1]\n" - " mov r0, r9\n" - " strh r3, [r0]\n" - " mov r1, sl\n" - " strh r3, [r1]\n" - " ldr r0, ._1215 + 36 @ gUnknown_02024C5C\n" - " add r1, r2, r0\n" - " mov r0, #0xff\n" - " strb r0, [r1]\n" - " strh r3, [r6]\n" - " strh r3, [r7]\n" - " ldr r1, ._1215 + 40 @ gSharedMem\n" - " add r0, r5, r1\n" - " str r3, [r0]\n" - " mov r0, #0x2\n" - " add sl, sl, r0\n" - " add r9, r9, r0\n" - " add r8, r8, r0\n" - " add ip, ip, r0\n" - " add r4, r4, #0x1c\n" - " add r5, r5, #0x4\n" - " add r7, r7, #0x2\n" - " add r6, r6, #0x2\n" - " add r2, r2, #0x1\n" - " cmp r2, #0x3\n" - " ble ._1205 @cond_branch\n" - " mov r5, #0x0\n" - " ldr r3, ._1215 + 44 @ gSideTimers\n" - " ldr r4, ._1215 + 48 @ gSideAffecting\n" - " mov r2, #0x1\n" - "._1207:\n" - " strh r5, [r4]\n" - " mov r1, #0x0\n" - "._1206:\n" - " add r0, r3, r1\n" - " strb r5, [r0]\n" - " add r1, r1, #0x1\n" - " cmp r1, #0xb\n" - " bls ._1206 @cond_branch\n" - " add r3, r3, #0xc\n" - " add r4, r4, #0x2\n" - " sub r2, r2, #0x1\n" - " cmp r2, #0\n" - " bge ._1207 @cond_branch\n" - " mov r1, #0x0\n" - " ldr r2, ._1215 + 52 @ gBankAttacker\n" - " strb r1, [r2]\n" - " ldr r3, ._1215 + 56 @ gBankTarget\n" - " strb r1, [r3]\n" - " ldr r4, ._1215 + 60 @ gBattleWeather\n" - " strh r1, [r4]\n" - " ldr r1, ._1215 + 64 @ gWishFutureKnock\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - "._1208:\n" - " add r0, r1, r2\n" - " strb r3, [r0]\n" - " add r2, r2, #0x1\n" - " cmp r2, #0x2b\n" - " bls ._1208 @cond_branch\n" - " mov r0, #0x0\n" - " ldr r1, ._1215 + 68 @ gHitMarker\n" - " str r0, [r1]\n" - " ldr r2, ._1215 + 72 @ gBattleTypeFlags\n" - " ldrh r1, [r2]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._1210 @cond_branch\n" - " ldr r3, ._1215 + 76 @ gSaveBlock2\n" - " ldrb r1, [r3, #0x15]\n" - " mov r0, #0x4\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._1210 @cond_branch\n" - " mov r0, #0x80\n" - " ldr r4, ._1215 + 68 @ gHitMarker\n" - " str r0, [r4]\n" - "._1210:\n" - " ldr r1, ._1215 + 76 @ gSaveBlock2\n" - " ldrb r0, [r1, #0x15]\n" - " lsl r0, r0, #0x1e\n" - " lsr r0, r0, #0x1f\n" - " ldr r3, ._1215 + 80 @ gSharedMem\n" - " ldr r4, ._1215 + 84 @ 0x16084\n" - " add r2, r3, r4\n" - " mov r1, #0x0\n" - " strb r0, [r2]\n" - " ldr r0, ._1215 + 88 @ gMultiHitCounter\n" - " strb r1, [r0]\n" - " ldr r2, ._1215 + 92 @ gBattleOutcome\n" - " strb r1, [r2]\n" - " ldr r3, ._1215 + 96 @ gBattleExecBuffer\n" - " str r1, [r3]\n" - " mov r2, #0x0\n" - " ldr r4, ._1215 + 100@ gPaydayMoney\n" - " strh r1, [r4]\n" - " ldr r1, ._1215 + 80 @ gSharedMem\n" - " ldr r3, ._1215 + 104@ 0x17130\n" - " add r0, r1, r3\n" - " strb r2, [r0]\n" - " ldr r4, ._1215 + 108@ 0x17160\n" - " add r0, r1, r4\n" - " strb r2, [r0]\n" - " ldr r1, ._1215 + 112@ gBattleCommunication\n" - " mov r2, #0x0\n" - " add r0, r1, #7\n" - "._1211:\n" - " strb r2, [r0]\n" - " sub r0, r0, #0x1\n" - " cmp r0, r1\n" - " bge ._1211 @cond_branch\n" - " mov r5, #0x0\n" - " ldr r0, ._1215 + 116@ gPauseCounterBattle\n" - " strh r5, [r0]\n" - " mov r0, #0x0\n" - " ldr r1, ._1215 + 120@ gBattleMoveDamage\n" - " str r0, [r1]\n" - " ldr r2, ._1215 + 124@ gUnknown_02024DE8\n" - " strh r0, [r2]\n" - " ldr r4, ._1215 + 80 @ gSharedMem\n" - " ldr r3, ._1215 + 128@ 0x16002\n" - " add r0, r4, r3\n" - " strb r5, [r0]\n" - " ldr r1, ._1215 + 132@ 0x160a1\n" - " add r0, r4, r1\n" - " strb r5, [r0]\n" - " ldr r2, ._1215 + 136@ gLeveledUpInBattle\n" - " strb r5, [r2]\n" - " ldr r3, ._1215 + 140@ gAbsentBankFlags\n" - " strb r5, [r3]\n" - " sub r1, r1, #0x29\n" - " add r0, r4, r1\n" - " strb r5, [r0]\n" - " ldr r2, ._1215 + 144@ 0x16086\n" - " add r0, r4, r2\n" - " strb r5, [r0]\n" - " ldr r3, ._1215 + 148@ 0x16087\n" - " add r0, r4, r3\n" - " strb r5, [r0]\n" - " ldr r0, ._1215 + 152@ gEnemyParty\n" - " mov r1, #0xb\n" - " bl GetMonData\n" - " ldr r2, ._1215 + 156@ gBaseStats\n" - " lsl r1, r0, #0x3\n" - " sub r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r2\n" - " ldrb r1, [r1, #0x8]\n" - " mov r0, #0x64\n" - " mul r0, r0, r1\n" - " ldr r1, ._1215 + 160@ 0x4fb\n" - " bl __divsi3\n" - " ldr r2, ._1215 + 164@ 0x16089\n" - " add r1, r4, r2\n" - " strb r0, [r1]\n" - " ldr r3, ._1215 + 168@ 0x16088\n" - " add r1, r4, r3\n" - " mov r0, #0x3\n" - " strb r0, [r1]\n" - " ldr r1, ._1215 + 172@ 0x1601b\n" - " add r0, r4, r1\n" - " strb r5, [r0]\n" - " sub r2, r2, #0x33\n" - " add r1, r4, r2\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " mov r2, #0x0\n" - " mov r1, #0x0\n" - "._1212:\n" - " ldr r3, ._1215 + 176@ 0x160ac\n" - " add r0, r2, r3\n" - " add r0, r0, r4\n" - " strb r1, [r0]\n" - " add r3, r3, #0x20\n" - " add r0, r2, r3\n" - " add r0, r0, r4\n" - " strb r1, [r0]\n" - " add r3, r3, #0x1c\n" - " add r0, r2, r3\n" - " add r0, r0, r4\n" - " strb r1, [r0]\n" - " add r3, r3, #0x8\n" - " add r0, r2, r3\n" - " add r0, r0, r4\n" - " strb r1, [r0]\n" - " add r3, r3, #0x10\n" - " add r0, r2, r3\n" - " add r0, r0, r4\n" - " strb r1, [r0]\n" - " add r3, r3, #0x8\n" - " add r0, r2, r3\n" - " add r0, r0, r4\n" - " strb r1, [r0]\n" - " add r2, r2, #0x1\n" - " cmp r2, #0x7\n" - " ble ._1212 @cond_branch\n" - " ldr r4, ._1215 + 80 @ gSharedMem\n" - " ldr r1, ._1215 + 180@ 0x160c8\n" - " add r0, r4, r1\n" - " mov r2, #0x0\n" - " mov r1, #0x6\n" - " strb r1, [r0]\n" - " sub r3, r3, #0x3f\n" - " add r0, r4, r3\n" - " strb r1, [r0]\n" - " ldr r1, ._1215 + 184@ 0x16113\n" - " add r0, r4, r1\n" - " strb r2, [r0]\n" - " ldr r3, ._1215 + 188@ gBattleResults\n" - " mov r1, #0x0\n" - " mov r2, #0xa\n" - " add r0, r3, #0\n" - " add r0, r0, #0x40\n" - "._1213:\n" - " strb r1, [r0]\n" - " sub r0, r0, #0x1\n" - " sub r2, r2, #0x1\n" - " cmp r2, #0\n" - " bge ._1213 @cond_branch\n" - " mov r1, #0x0\n" - " strb r1, [r3, #0x13]\n" - " strb r1, [r3]\n" - " strb r1, [r3, #0x1]\n" - " strb r1, [r3, #0x2]\n" - " strb r1, [r3, #0x3]\n" - " strb r1, [r3, #0x4]\n" - " ldrb r2, [r3, #0x5]\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " mov r2, #0x3\n" - " neg r2, r2\n" - " and r0, r0, r2\n" - " strb r0, [r3, #0x5]\n" - " strh r1, [r3, #0x20]\n" - " strh r1, [r3, #0x22]\n" - " strh r1, [r3, #0x24]\n" - " strh r1, [r3, #0x6]\n" - " strh r1, [r3, #0x26]\n" - " strh r1, [r3, #0x28]\n" - " mov r2, #0x0\n" - " add r5, r3, #0\n" - " add r5, r5, #0x8\n" - " mov r4, #0x0\n" - " add r1, r3, #0\n" - " add r1, r1, #0x14\n" - "._1214:\n" - " add r0, r2, r5\n" - " strb r4, [r0]\n" - " strb r4, [r1]\n" - " strb r4, [r1, #0x16]\n" - " add r1, r1, #0x1\n" - " add r2, r2, #0x1\n" - " cmp r2, #0x9\n" - " ble ._1214 @cond_branch\n" - " ldr r2, ._1215 + 80 @ gSharedMem\n" - " ldr r3, ._1215 + 192@ 0x1609e\n" - " add r0, r2, r3\n" - " mov r1, #0x0\n" - " strb r1, [r0]\n" - " ldr r4, ._1215 + 196@ 0x1609f\n" - " add r0, r2, r4\n" - " strb r1, [r0]\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._1216:\n" - " .align 2, 0\n" - "._1215:\n" - " .word gUnknown_02024C4C\n" - " .word gLastHitByType\n" - " .word gLastLandedMoves\n" - " .word gLastUsedMove\n" - " .word gDisableStructs\n" - " .word gUnknown_02024C2C\n" - " .word gLockedMoves\n" - " .word gStatuses3\n" - " .word gUnknown_02024C70\n" - " .word gUnknown_02024C5C\n" - " .word gSharedMem+0x17100\n" - " .word gSideTimers\n" - " .word gSideAffecting\n" - " .word gBankAttacker\n" - " .word gBankTarget\n" - " .word gBattleWeather\n" - " .word gWishFutureKnock\n" - " .word gHitMarker\n" - " .word gBattleTypeFlags\n" - " .word gSaveBlock2\n" - " .word gSharedMem\n" - " .word 0x16084\n" - " .word gMultiHitCounter\n" - " .word gBattleOutcome\n" - " .word gBattleExecBuffer\n" - " .word gPaydayMoney\n" - " .word 0x17130\n" - " .word 0x17160\n" - " .word gBattleCommunication\n" - " .word gPauseCounterBattle\n" - " .word gBattleMoveDamage\n" - " .word gUnknown_02024DE8\n" - " .word 0x16002\n" - " .word 0x160a1\n" - " .word gLeveledUpInBattle\n" - " .word gAbsentBankFlags\n" - " .word 0x16086\n" - " .word 0x16087\n" - " .word gEnemyParty\n" - " .word gBaseStats\n" - " .word 0x4fb\n" - " .word 0x16089\n" - " .word 0x16088\n" - " .word 0x1601b\n" - " .word 0x160ac\n" - " .word 0x160c8\n" - " .word 0x16113\n" - " .word gBattleResults\n" - " .word 0x1609e\n" - " .word 0x1609f\n" - "\n" - ); } -#else -void sub_8010824(void) +void sub_8010800(void) { - gBattleMainFunc(); + sub_8010874(); + gBattleCommunication[1] = 0; + gBattleMainFunc = bc_8012FAC; +} - for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) - gBattleBankFunc[gActiveBank](); +#if DEBUG +void debug_sub_80138CC(void) +{ + if (GetBankSide(gActiveBank) == 0) + { + switch (gSharedMem[0x160FD]) + { + case 0: + if (gBattleBankFunc[gActiveBank] == sub_802C098) + gSharedMem[0x160FD]++; + break; + case 1: + gMain.heldKeys = A_BUTTON; + gMain.newKeys = A_BUTTON; + gSharedMem[0x160FD]++; + gSharedMem[0x160FE] = 0x80; + break; + case 2: + gSharedMem[0x160FE]--; + if (gSharedMem[0x160FE] == 0) + { + gMain.heldKeys = A_BUTTON; + gMain.newKeys = A_BUTTON; + gSharedMem[0x160FD]++; + gSharedMem[0x160FE] = 0x80; + } + break; + case 3: + gSharedMem[0x160FE]--; + if (gSharedMem[0x160FE] == 0) + { + gMain.heldKeys = A_BUTTON; + gMain.newKeys = A_BUTTON; + gSharedMem[0x160FD]++; + } + break; + case 4: + gSharedMem[0x160FD] = 0; + break; + } + } +} +#endif + +void sub_8010824(void) +{ +#if DEBUG + if (gUnknown_02023A14_50 & 0x80) + { + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + debug_sub_80138CC(); + gBattleMainFunc(); + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + gBattleBankFunc[gActiveBank](); + } + else +#endif + { + gBattleMainFunc(); + for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++) + gBattleBankFunc[gActiveBank](); + } } void sub_8010874(void) @@ -7548,8 +6067,11 @@ void sub_8010874(void) gBattleResults.pokeString2[i] = 0; gBattleResults.caughtNick[i] = 0; } -} +#if DEBUG + gSharedMem[0x1609E] = 0; + gSharedMem[0x1609F] = 0; #endif +} void SwitchInClearSetData(void) { @@ -9936,6 +8458,351 @@ u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreMovePriorities) return strikesFirst; } +// The debug version should be identical, but has a strange register swap, and +// seems to be affected by other functions, which is bizarre. +#if DEBUG +__attribute__((naked)) +void SetActionsAndBanksTurnOrder(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + mov r3, #0x0\n\ + ldr r0, ._L1550\n\ + ldrh r1, [r0]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._L1499 @cond_branch\n\ + ldr r0, ._L1550+0x4\n\ + strb r3, [r0]\n\ + ldr r4, ._L1550+0x8\n\ + mov r8, r0\n\ + ldrb r0, [r4]\n\ + cmp r3, r0\n\ + bcc ._LCB12758\n\ + b ._L1505 @long jump\n\ +._LCB12758:\n\ + ldr r7, ._L1550+0xc\n\ + ldr r6, ._L1550+0x10\n\ + mov r2, r8\n\ + ldr r5, ._L1550+0x14\n\ +._L1503:\n\ + add r1, r3, r7\n\ + ldrb r0, [r2]\n\ + add r0, r0, r6\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + add r1, r3, r5\n\ + ldrb r0, [r2]\n\ + strb r0, [r1]\n\ + add r3, r3, #0x1\n\ + ldrb r0, [r2]\n\ + add r0, r0, #0x1\n\ + strb r0, [r2]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldrb r1, [r4]\n\ + cmp r0, r1\n\ + bcc ._L1503 @cond_branch\n\ + b ._L1505\n\ +._L1551:\n\ + .align 2, 0\n\ +._L1550:\n\ + .word gBattleTypeFlags\n\ + .word gActiveBank\n\ + .word gNoOfAllBanks\n\ + .word gActionsByTurnOrder\n\ + .word gActionForBanks\n\ + .word gBanksByTurnOrder\n\ +._L1499:\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._L1506 @cond_branch\n\ + ldr r0, ._L1552\n\ + strb r3, [r0]\n\ + ldr r1, ._L1552+0x4\n\ + mov r8, r0\n\ + add r2, r1, #0\n\ + ldrb r2, [r2]\n\ + cmp r3, r2\n\ + bcs ._L1513 @cond_branch\n\ + ldr r0, ._L1552+0x8\n\ + ldrb r1, [r0]\n\ + add r4, r0, #0\n\ + cmp r1, #0x3\n\ + beq ._L1548 @cond_branch\n\ +._L1509:\n\ + mov r7, r8\n\ + ldrb r0, [r7]\n\ + add r0, r0, #0x1\n\ + strb r0, [r7]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r1, ._L1552+0x4\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcs ._L1513 @cond_branch\n\ + ldrb r0, [r7]\n\ + add r0, r0, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x3\n\ + bne ._L1509 @cond_branch\n\ + b ._L1548\n\ +._L1553:\n\ + .align 2, 0\n\ +._L1552:\n\ + .word gActiveBank\n\ + .word gNoOfAllBanks\n\ + .word gActionForBanks\n\ +._L1506:\n\ + ldr r0, ._L1554\n\ + ldrb r0, [r0]\n\ + ldr r2, ._L1554+0x4\n\ + mov r8, r2\n\ + cmp r0, #0x3\n\ + bne ._L1513 @cond_branch\n\ + strb r3, [r2]\n\ +._L1548:\n\ + mov r3, #0x5\n\ +._L1513:\n\ + cmp r3, #0x5\n\ + bne ._L1515 @cond_branch\n\ + ldr r6, ._L1554+0x8\n\ + ldr r1, ._L1554\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r6]\n\ + ldr r2, ._L1554+0xc\n\ + ldrb r0, [r3]\n\ + strb r0, [r2]\n\ + mov r3, #0x1\n\ + mov r5, #0x0\n\ + add r4, r1, #0\n\ + ldr r7, ._L1554+0x10\n\ + mov r9, r7\n\ + ldr r0, ._L1554+0x14\n\ + mov ip, r0\n\ + ldr r1, ._L1554+0x18\n\ + mov sl, r1\n\ + ldr r7, ._L1554+0x1c\n\ + ldrb r7, [r7]\n\ + cmp r5, r7\n\ + bge ._L1517 @cond_branch\n\ + add r7, r6, #0\n\ + add r6, r4, #0\n\ + add r4, r2, #0\n\ + ldr r2, ._L1554+0x1c\n\ +._L1519:\n\ + mov r0, r8\n\ + ldrb r0, [r0]\n\ + cmp r5, r0\n\ + beq ._L1518 @cond_branch\n\ + add r1, r3, r7\n\ + add r0, r5, r6\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + add r0, r3, r4\n\ + strb r5, [r0]\n\ + add r3, r3, #0x1\n\ +._L1518:\n\ + add r5, r5, #0x1\n\ + ldrb r1, [r2]\n\ + cmp r5, r1\n\ + blt ._L1519 @cond_branch\n\ +._L1517:\n\ + mov r2, ip\n\ + mov r3, r9\n\ + str r2, [r3]\n\ + ldr r1, ._L1554+0x20\n\ + add r1, r1, sl\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + b ._L1498\n\ +._L1555:\n\ + .align 2, 0\n\ +._L1554:\n\ + .word gActionForBanks\n\ + .word gActiveBank\n\ + .word gActionsByTurnOrder\n\ + .word gBanksByTurnOrder\n\ + .word gBattleMainFunc\n\ + .word CheckFocusPunch_ClearVarsBeforeTurnStarts\n\ + .word gSharedMem\n\ + .word gNoOfAllBanks\n\ + .word 0x1601d\n\ +._L1515:\n\ + mov r0, #0x0\n\ + mov r7, r8\n\ + strb r0, [r7]\n\ + ldr r1, ._L1556\n\ + ldrb r0, [r1]\n\ + cmp r0, #0\n\ + beq ._L1524 @cond_branch\n\ + ldr r6, ._L1556+0x4\n\ + mov r2, r8\n\ + ldr r5, ._L1556+0x8\n\ + ldr r4, ._L1556+0xc\n\ +._L1526:\n\ + ldrb r0, [r2]\n\ + add r0, r0, r6\n\ + ldrb r1, [r0]\n\ + sub r0, r1, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bhi ._L1525 @cond_branch\n\ + add r0, r3, r5\n\ + strb r1, [r0]\n\ + add r1, r3, r4\n\ + mov r7, r8\n\ + ldrb r0, [r7]\n\ + strb r0, [r1]\n\ + add r3, r3, #0x1\n\ +._L1525:\n\ + ldrb r0, [r2]\n\ + add r0, r0, #0x1\n\ + strb r0, [r2]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r1, ._L1556\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc ._L1526 @cond_branch\n\ +._L1524:\n\ + mov r0, #0x0\n\ + mov r2, r8\n\ + strb r0, [r2]\n\ + ldr r7, ._L1556\n\ + ldrb r0, [r7]\n\ + cmp r0, #0\n\ + beq ._L1530 @cond_branch\n\ + ldr r6, ._L1556+0x4\n\ + ldr r5, ._L1556+0x8\n\ + ldr r4, ._L1556+0xc\n\ +._L1532:\n\ + ldrb r0, [r2]\n\ + add r0, r0, r6\n\ + ldrb r1, [r0]\n\ + sub r0, r1, #0x1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bls ._L1531 @cond_branch\n\ + add r0, r3, r5\n\ + strb r1, [r0]\n\ + add r1, r3, r4\n\ + mov r7, r8\n\ + ldrb r0, [r7]\n\ + strb r0, [r1]\n\ + add r3, r3, #0x1\n\ +._L1531:\n\ + ldrb r0, [r2]\n\ + add r0, r0, #0x1\n\ + strb r0, [r2]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + ldr r1, ._L1556\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc ._L1532 @cond_branch\n\ +._L1530:\n\ + mov r5, #0x0\n\ + b ._L1549\n\ +._L1557:\n\ + .align 2, 0\n\ +._L1556:\n\ + .word gNoOfAllBanks\n\ + .word gActionForBanks\n\ + .word gActionsByTurnOrder\n\ + .word gBanksByTurnOrder\n\ +._L1538:\n\ + add r4, r5, #0x1\n\ + add r7, r4, #0\n\ + ldrb r1, [r1]\n\ + cmp r7, r1\n\ + bge ._L1537 @cond_branch\n\ + ldr r6, ._L1558\n\ + lsl r2, r5, #0x18\n\ + mov r8, r2\n\ +._L1542:\n\ + ldr r0, ._L1558+0x4\n\ + add r1, r5, r0\n\ + ldrb r3, [r1]\n\ + add r0, r4, r0\n\ + ldrb r1, [r0]\n\ + add r0, r5, r6\n\ + ldrb r2, [r0]\n\ + cmp r2, #0x1\n\ + beq ._L1541 @cond_branch\n\ + add r0, r4, r6\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._L1541 @cond_branch\n\ + cmp r2, #0x2\n\ + beq ._L1541 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._L1541 @cond_branch\n\ + add r0, r3, #0\n\ + mov r2, #0x0\n\ + bl GetWhoStrikesFirst\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._L1541 @cond_branch\n\ + lsl r1, r4, #0x18\n\ + lsr r1, r1, #0x18\n\ + mov r3, r8\n\ + lsr r0, r3, #0x18\n\ + bl SwapTurnOrder\n\ +._L1541:\n\ + add r4, r4, #0x1\n\ + ldr r0, ._L1558+0x8\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + blt ._L1542 @cond_branch\n\ +._L1537:\n\ + add r5, r7, #0\n\ +._L1549:\n\ + ldr r1, ._L1558+0x8\n\ + ldrb r0, [r1]\n\ + sub r0, r0, #0x1\n\ + cmp r5, r0\n\ + blt ._L1538 @cond_branch\n\ +._L1505:\n\ + ldr r1, ._L1558+0xc\n\ + ldr r0, ._L1558+0x10\n\ + str r0, [r1]\n\ + ldr r0, ._L1558+0x14\n\ + ldr r7, ._L1558+0x18\n\ + add r0, r0, r7\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ +._L1498:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._L1559:\n\ + .align 2, 0\n\ +._L1558:\n\ + .word gActionsByTurnOrder\n\ + .word gBanksByTurnOrder\n\ + .word gNoOfAllBanks\n\ + .word gBattleMainFunc\n\ + .word CheckFocusPunch_ClearVarsBeforeTurnStarts\n\ + .word gSharedMem\n\ + .word 0x1601d"); +} +#else void SetActionsAndBanksTurnOrder(void) { s32 var = 0; @@ -10028,15 +8895,11 @@ void SetActionsAndBanksTurnOrder(void) } } } - // Debug ROM has a register swap from the retail ROM. - // And doing this seems to fix it. -#if DEBUG - asm("");asm("");asm("");asm("");asm("");asm("");asm("");asm("");asm(""); - asm("");asm("");asm("");asm("");asm("");asm("");asm(""); -#endif + gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; eFocusPunchBank = 0; } +#endif static void TurnValuesCleanUp(bool8 var0) { -- cgit v1.2.3 From 48ef425d46b5879940fdad6641a5040cba900ca0 Mon Sep 17 00:00:00 2001 From: yenatch Date: Sun, 28 Jan 2018 14:31:39 -0500 Subject: try to match trailing battle_1 section --- src/rom_800D42C.c | 913 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 913 insertions(+) (limited to 'src') diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c index a1b0f5ecb..032d979b8 100644 --- a/src/rom_800D42C.c +++ b/src/rom_800D42C.c @@ -117,3 +117,916 @@ void PrintLinkBattleWinLossTie(void) } } } + + +#include "global.h" +#include "decompress.h" +#include "palette.h" +#include "battle.h" +#include "text.h" +#include "trig.h" +#include "sound.h" +#include "constants/songs.h" +#include "task.h" +#include "link.h" + + +#define gBattle gBattleStruct + +extern const u8 gGameVersion; +extern u8 gUnknown_08D00000[]; +extern u16 gUnknown_08D00524[]; +extern u16 gUnknown_08D004E0[]; +extern u16 gBattleTypeFlags; +extern struct Trainer gTrainers[]; +extern u16 gTrainerBattleOpponent; + +extern void *gBattleTerrainTable[][5]; +extern u8 gBattleTerrain; + +extern u8 gBattleTerrainTiles_Cave[]; +extern u8 gBattleTerrainTiles_Water[]; +extern u8 gBattleTerrainTiles_Building[]; +extern u8 gBattleTerrainTiles_Stadium[]; + +extern u16 gBattleTerrainTilemap_Cave[]; +extern u16 gBattleTerrainTilemap_Water[]; +extern u16 gBattleTerrainTilemap_Building[]; +extern u16 gBattleTerrainTilemap_Stadium[]; + +extern u16 gBattleTerrainPalette_Groudon[]; +extern u16 gBattleTerrainPalette_Kyogre[]; +extern u16 gBattleTerrainPalette_BuildingLeader[]; +extern u16 gBattleTerrainPalette_StadiumSteven[]; +extern u16 gBattleTerrainPalette_BuildingGym[]; +extern u16 gBattleTerrainPalette_StadiumMagma[]; +extern u16 gBattleTerrainPalette_StadiumAqua[]; +extern u16 gBattleTerrainPalette_StadiumSidney[]; +extern u16 gBattleTerrainPalette_StadiumPhoebe[]; +extern u16 gBattleTerrainPalette_StadiumGlacia[]; +extern u16 gBattleTerrainPalette_StadiumDrake[]; +extern u16 gBattleTerrainPalette_BattleTower[]; + +extern u8 gBattleTerrainAnimTiles_Building[]; +extern u16 gBattleTerrainAnimTilemap_Building[]; +extern u8 gBattleTerrainAnimTiles_Cave[]; +extern u16 gBattleTerrainAnimTilemap_Cave[]; +extern u8 gBattleTerrainAnimTiles_Underwater[]; +extern u16 gBattleTerrainAnimTilemap_Underwater[]; +extern u8 gVersusFrameGfx[]; +extern u16 gVersusFrameTilemap[]; +extern u8 gUnknown_08E5DC2C[]; +extern u16 gVersusFramePal[]; + +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_Y; +extern struct CompressedSpriteSheet gUnknown_081F95A4; + +extern u8 sav1_map_get_battletype(void); +extern void sub_800D74C(void); + +struct Struct_081F9680 { + struct Window *window; + u16 offset; + u8 left; + u8 top; + u8 *field_8; +}; + +extern struct Struct_081F9680 gUnknown_081F9680[]; +extern void PrintLinkBattleWinLossTie(void); +extern void sub_800DAF8(u8, u8, u8 *); + +extern struct SpriteTemplate gSpriteTemplate_81F9574; +extern struct SpriteTemplate gSpriteTemplate_81F958C; + +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG2_X; + + + + +#ifdef NONMATCHING + +void sub_800DE30(u8 taskId) +{ + int palette; + int i; + + switch (gTasks[taskId].data[0]) { + + case 0: + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { + for (i = 0; i < 4; i++) { + u8 sp8 = (gLinkPlayers[i].lp_field_18 & 3); + struct Window *window; + Text_InitWindow8002E4C( + window = gUnknown_081F9680[sp8].window, + gLinkPlayers[i].name, + gUnknown_081F9680[sp8].offset, + gUnknown_081F9680[sp8].left, + gUnknown_081F9680[sp8].top, + 1); + Text_PrintWindow8002F44(window); + sub_800DAF8(taskId, sp8, gUnknown_081F9680[sp8].field_8); + } + } else { + int r7 = gBattle->linkPlayerIndex; + int r6 = gBattle->linkPlayerIndex ^ 1; + int r1 = r6; + if (gLinkPlayers[r7].lp_field_18) { + r6 = r7; + r7 = r1; + } + + i = 4; + Text_InitWindow8002E4C( + gUnknown_081F9680[i].window, + gLinkPlayers[r7].name, + gUnknown_081F9680[i].offset, + gUnknown_081F9680[i].left, + gUnknown_081F9680[i].top, + 1); + Text_PrintWindow8002F44(gUnknown_081F9680[i].window); + sub_800DAF8(taskId, r7, gUnknown_081F9680[i].field_8); + + i = 5; + Text_InitWindow8002E4C( + gUnknown_081F9680[i].window, + gLinkPlayers[r6].name, + gUnknown_081F9680[i].offset, + gUnknown_081F9680[i].left, + gUnknown_081F9680[i].top, + 1); + Text_PrintWindow8002F44(gUnknown_081F9680[i].window); + sub_800DAF8(taskId, r6, gUnknown_081F9680[i].field_8); + } + gTasks[taskId].data[0]++; + break; + + case 1: + palette = AllocSpritePalette(10000); + gPlttBufferUnfaded[palette * 16 + 0x10f] = gPlttBufferFaded[palette * 16 + 0x10f] = 0x7fff; + gBattle->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0); + gBattle->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0); + gSprites[gBattle->unk1608A].invisible = TRUE; + gSprites[gBattle->unk1608B].invisible = TRUE; + gTasks[taskId].data[0]++; + break; + + case 2: + if (gTasks[taskId].data[5]) { + gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); + gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); + gBattle_BG1_Y = -36; + gBattle_BG2_Y = -36; + } else { + gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); + gBattle_BG1_Y = (-164) + (Cos2(gTasks[taskId].data[1]) / 32); + gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); + gBattle_BG2_Y = (-164) + (Cos2(gTasks[taskId].data[2]) / 32); + } + if (gTasks[taskId].data[2]) { + gTasks[taskId].data[2] -= 2; + gTasks[taskId].data[1] += 2; + } else { + if (gTasks[taskId].data[5]) { + PrintLinkBattleWinLossTie(); + } + PlaySE(SE_W231); + DestroyTask(taskId); + gSprites[gBattle->unk1608B].invisible = gSprites[gBattle->unk1608A].invisible = FALSE; + gSprites[gBattle->unk1608B].oam.tileNum += 0x40; + gSprites[gBattle->unk1608A].data[0] = 0; + gSprites[gBattle->unk1608B].data[0] = 1; + gSprites[gBattle->unk1608A].data[1] = gSprites[gBattle->unk1608A].pos1.x; + gSprites[gBattle->unk1608B].data[1] = gSprites[gBattle->unk1608B].pos1.x; + gSprites[gBattle->unk1608A].data[2] = 0; + gSprites[gBattle->unk1608B].data[2] = 0; + } + break; + } +} + +#else + +asm_unified( +".include \"macros.inc\"\n" +" thumb_func_start sub_800DE30\n" +"sub_800DE30: @ 800DE30\n" +" push {r4-r7,lr}\n" +" mov r7, r10\n" +" mov r6, r9\n" +" mov r5, r8\n" +" push {r5-r7}\n" +" sub sp, 0x10\n" +" lsls r0, 24\n" +" lsrs r0, 24\n" +" mov r9, r0\n" +" ldr r1, _0800DE64 @ =gTasks\n" +" lsls r0, 2\n" +" mov r10, r0\n" +" add r0, r9\n" +" lsls r0, 3\n" +" adds r6, r0, r1\n" +" movs r1, 0x8\n" +" ldrsh r0, [r6, r1]\n" +" cmp r0, 0x1\n" +" bne _0800DE58\n" +" b _0800DF9C\n" +"_0800DE58:\n" +" cmp r0, 0x1\n" +" bgt _0800DE68\n" +" cmp r0, 0\n" +" beq _0800DE70\n" +" b _0800E212\n" +" .align 2, 0\n" +"_0800DE64: .4byte gTasks\n" +"_0800DE68:\n" +" cmp r0, 0x2\n" +" bne _0800DE6E\n" +" b _0800E03C\n" +"_0800DE6E:\n" +" b _0800E212\n" +"_0800DE70:\n" +" ldr r0, _0800DED0 @ =gBattleTypeFlags\n" +" ldrh r1, [r0]\n" +" movs r0, 0x40\n" +" ands r0, r1\n" +" cmp r0, 0\n" +" beq _0800DEE0\n" +" ldr r0, _0800DED4 @ =gLinkPlayers\n" +" ldr r2, _0800DED8 @ =gUnknown_081F9680\n" +" mov r8, r2\n" +" adds r7, r0, 0\n" +" adds r7, 0x8\n" +" movs r5, 0x3\n" +"_0800DE88:\n" +" ldrb r0, [r7, 0x10]\n" +" movs r1, 0x3\n" +" ands r1, r0\n" +" str r1, [sp, 0x8]\n" +" lsls r4, r1, 1\n" +" adds r4, r1\n" +" lsls r4, 2\n" +" mov r2, r8\n" +" adds r0, r4, r2\n" +" ldr r1, [r0]\n" +" str r1, [sp, 0xC]\n" +" ldrh r2, [r0, 0x4]\n" +" ldrb r3, [r0, 0x6]\n" +" ldrb r0, [r0, 0x7]\n" +" str r0, [sp]\n" +" movs r0, 0x1\n" +" str r0, [sp, 0x4]\n" +" adds r0, r1, 0\n" +" adds r1, r7, 0\n" +" bl Text_InitWindow8002E4C\n" +" ldr r0, [sp, 0xC]\n" +" bl Text_PrintWindow8002F44\n" +" ldr r2, _0800DEDC @ =gUnknown_081F9680 + 0x8\n" +" adds r4, r2\n" +" ldr r2, [r4]\n" +" mov r0, r9\n" +" ldr r1, [sp, 0x8]\n" +" bl sub_800DAF8\n" +" adds r7, 0x1C\n" +" subs r5, 0x1\n" +" cmp r5, 0\n" +" bge _0800DE88\n" +" b _0800DF70\n" +" .align 2, 0\n" +"_0800DED0: .4byte gBattleTypeFlags\n" +"_0800DED4: .4byte gLinkPlayers\n" +"_0800DED8: .4byte gUnknown_081F9680\n" +"_0800DEDC: .4byte gUnknown_081F9680 + 0x8\n" +"_0800DEE0:\n" +" ldr r0, _0800DF84 @ =0x02000000\n" +" ldr r5, _0800DF88 @ =0x000160cb\n" +" adds r0, r5\n" +" ldrb r7, [r0]\n" +" movs r0, 0x1\n" +" adds r6, r7, 0\n" +" eors r6, r0\n" +" adds r1, r6, 0\n" +" ldr r2, _0800DF8C @ =gLinkPlayers\n" +" lsls r0, r7, 3\n" +" subs r0, r7\n" +" lsls r0, 2\n" +" adds r0, r2\n" +" ldrh r0, [r0, 0x18]\n" +" cmp r0, 0\n" +" beq _0800DF04\n" +" adds r6, r7, 0\n" +" adds r7, r1, 0\n" +"_0800DF04:\n" +" ldr r0, _0800DF90 @ =gUnknown_081F9680\n" +" mov r8, r0\n" +" adds r0, 0x30\n" +" mov r1, r8\n" +" ldr r4, [r1, 0x30]\n" +" lsls r1, r7, 3\n" +" subs r1, r7\n" +" lsls r1, 2\n" +" ldr r2, _0800DF94 @ =gLinkPlayers + 0x8\n" +" adds r1, r2\n" +" ldrh r2, [r0, 0x4]\n" +" ldrb r3, [r0, 0x6]\n" +" ldrb r0, [r0, 0x7]\n" +" str r0, [sp]\n" +" movs r5, 0x1\n" +" str r5, [sp, 0x4]\n" +" adds r0, r4, 0\n" +" bl Text_InitWindow8002E4C\n" +" adds r0, r4, 0\n" +" bl Text_PrintWindow8002F44\n" +" mov r0, r8\n" +" ldr r2, [r0, 0x38]\n" +" mov r0, r9\n" +" adds r1, r7, 0\n" +" bl sub_800DAF8\n" +" mov r0, r8\n" +" adds r0, 0x3C\n" +" mov r1, r8\n" +" ldr r4, [r1, 0x3C]\n" +" lsls r1, r6, 3\n" +" subs r1, r6\n" +" lsls r1, 2\n" +" ldr r2, _0800DF94 @ =gLinkPlayers + 0x8\n" +" adds r1, r2\n" +" ldrh r2, [r0, 0x4]\n" +" ldrb r3, [r0, 0x6]\n" +" ldrb r0, [r0, 0x7]\n" +" str r0, [sp]\n" +" str r5, [sp, 0x4]\n" +" adds r0, r4, 0\n" +" bl Text_InitWindow8002E4C\n" +" adds r0, r4, 0\n" +" bl Text_PrintWindow8002F44\n" +" mov r5, r8\n" +" ldr r2, [r5, 0x44]\n" +" mov r0, r9\n" +" adds r1, r6, 0\n" +" bl sub_800DAF8\n" +"_0800DF70:\n" +" ldr r0, _0800DF98 @ =gTasks\n" +" mov r1, r10\n" +" add r1, r9\n" +" lsls r1, 3\n" +" adds r1, r0\n" +" ldrh r0, [r1, 0x8]\n" +" adds r0, 0x1\n" +" strh r0, [r1, 0x8]\n" +" b _0800E212\n" +" .align 2, 0\n" +"_0800DF84: .4byte 0x02000000\n" +"_0800DF88: .4byte 0x000160cb\n" +"_0800DF8C: .4byte gLinkPlayers\n" +"_0800DF90: .4byte gUnknown_081F9680\n" +"_0800DF94: .4byte gLinkPlayers + 0x8\n" +"_0800DF98: .4byte gTasks\n" +"_0800DF9C:\n" +" ldr r0, _0800E010 @ =0x00002710\n" +" bl AllocSpritePalette\n" +" lsls r0, 24\n" +" ldr r2, _0800E014 @ =gPlttBufferUnfaded\n" +" lsrs r0, 19\n" +" ldr r1, _0800E018 @ =0x0000021e\n" +" adds r0, r1\n" +" adds r2, r0, r2\n" +" ldr r1, _0800E01C @ =gPlttBufferFaded\n" +" adds r0, r1\n" +" ldr r1, _0800E020 @ =0x00007fff\n" +" strh r1, [r0]\n" +" strh r1, [r2]\n" +" ldr r0, _0800E024 @ =gSpriteTemplate_81F9574\n" +" movs r1, 0x6C\n" +" movs r2, 0x50\n" +" movs r3, 0\n" +" bl CreateSprite\n" +" ldr r4, _0800E028 @ =0x02000000\n" +" ldr r2, _0800E02C @ =0x0001608a\n" +" adds r7, r4, r2\n" +" strb r0, [r7]\n" +" ldr r0, _0800E030 @ =gSpriteTemplate_81F958C\n" +" movs r1, 0x84\n" +" movs r2, 0x50\n" +" movs r3, 0\n" +" bl CreateSprite\n" +" ldr r5, _0800E034 @ =0x0001608b\n" +" adds r4, r5\n" +" strb r0, [r4]\n" +" ldr r3, _0800E038 @ =gSprites\n" +" ldrb r1, [r7]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r3\n" +" adds r0, 0x3E\n" +" ldrb r1, [r0]\n" +" movs r2, 0x4\n" +" orrs r1, r2\n" +" strb r1, [r0]\n" +" ldrb r1, [r4]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r3\n" +" adds r0, 0x3E\n" +" ldrb r1, [r0]\n" +" orrs r1, r2\n" +" strb r1, [r0]\n" +" ldrh r0, [r6, 0x8]\n" +" adds r0, 0x1\n" +" strh r0, [r6, 0x8]\n" +" b _0800E212\n" +" .align 2, 0\n" +"_0800E010: .4byte 0x00002710\n" +"_0800E014: .4byte gPlttBufferUnfaded\n" +"_0800E018: .4byte 0x0000021e\n" +"_0800E01C: .4byte gPlttBufferFaded\n" +"_0800E020: .4byte 0x00007fff\n" +"_0800E024: .4byte gSpriteTemplate_81F9574\n" +"_0800E028: .4byte 0x02000000\n" +"_0800E02C: .4byte 0x0001608a\n" +"_0800E030: .4byte gSpriteTemplate_81F958C\n" +"_0800E034: .4byte 0x0001608b\n" +"_0800E038: .4byte gSprites\n" +"_0800E03C:\n" +" movs r1, 0x12\n" +" ldrsh r0, [r6, r1]\n" +" cmp r0, 0\n" +" beq _0800E0A4\n" +" ldr r4, _0800E090 @ =gBattle_BG1_X\n" +" ldrh r0, [r6, 0xA]\n" +" bl Sin2\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" cmp r0, 0\n" +" bge _0800E056\n" +" adds r0, 0x1F\n" +"_0800E056:\n" +" asrs r1, r0, 5\n" +" movs r2, 0x14\n" +" negs r2, r2\n" +" adds r0, r2, 0\n" +" subs r0, r1\n" +" strh r0, [r4]\n" +" ldr r4, _0800E094 @ =gBattle_BG2_X\n" +" ldrh r0, [r6, 0xC]\n" +" bl Sin2\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" cmp r0, 0\n" +" bge _0800E074\n" +" adds r0, 0x1F\n" +"_0800E074:\n" +" asrs r1, r0, 5\n" +" movs r5, 0x8C\n" +" negs r5, r5\n" +" adds r0, r5, 0\n" +" subs r0, r1\n" +" strh r0, [r4]\n" +" ldr r0, _0800E098 @ =gBattle_BG1_Y\n" +" ldr r2, _0800E09C @ =0x0000ffdc\n" +" adds r1, r2, 0\n" +" strh r1, [r0]\n" +" ldr r0, _0800E0A0 @ =gBattle_BG2_Y\n" +" strh r1, [r0]\n" +" b _0800E110\n" +" .align 2, 0\n" +"_0800E090: .4byte gBattle_BG1_X\n" +"_0800E094: .4byte gBattle_BG2_X\n" +"_0800E098: .4byte gBattle_BG1_Y\n" +"_0800E09C: .4byte 0x0000ffdc\n" +"_0800E0A0: .4byte gBattle_BG2_Y\n" +"_0800E0A4:\n" +" ldr r4, _0800E134 @ =gBattle_BG1_X\n" +" ldrh r0, [r6, 0xA]\n" +" bl Sin2\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" cmp r0, 0\n" +" bge _0800E0B6\n" +" adds r0, 0x1F\n" +"_0800E0B6:\n" +" asrs r1, r0, 5\n" +" movs r5, 0x14\n" +" negs r5, r5\n" +" adds r0, r5, 0\n" +" subs r0, r1\n" +" strh r0, [r4]\n" +" ldr r4, _0800E138 @ =gBattle_BG1_Y\n" +" ldrh r0, [r6, 0xA]\n" +" bl Cos2\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" cmp r0, 0\n" +" bge _0800E0D4\n" +" adds r0, 0x1F\n" +"_0800E0D4:\n" +" asrs r0, 5\n" +" subs r0, 0xA4\n" +" strh r0, [r4]\n" +" ldr r4, _0800E13C @ =gBattle_BG2_X\n" +" ldrh r0, [r6, 0xC]\n" +" bl Sin2\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" cmp r0, 0\n" +" bge _0800E0EC\n" +" adds r0, 0x1F\n" +"_0800E0EC:\n" +" asrs r1, r0, 5\n" +" movs r2, 0x8C\n" +" negs r2, r2\n" +" adds r0, r2, 0\n" +" subs r0, r1\n" +" strh r0, [r4]\n" +" ldr r4, _0800E140 @ =gBattle_BG2_Y\n" +" ldrh r0, [r6, 0xC]\n" +" bl Cos2\n" +" lsls r0, 16\n" +" asrs r0, 16\n" +" cmp r0, 0\n" +" bge _0800E10A\n" +" adds r0, 0x1F\n" +"_0800E10A:\n" +" asrs r0, 5\n" +" subs r0, 0xA4\n" +" strh r0, [r4]\n" +"_0800E110:\n" +" ldr r1, _0800E144 @ =gTasks\n" +" mov r5, r9\n" +" lsls r0, r5, 2\n" +" add r0, r9\n" +" lsls r0, 3\n" +" adds r1, r0, r1\n" +" ldrh r0, [r1, 0xC]\n" +" movs r2, 0xC\n" +" ldrsh r7, [r1, r2]\n" +" cmp r7, 0\n" +" beq _0800E148\n" +" subs r0, 0x2\n" +" strh r0, [r1, 0xC]\n" +" ldrh r0, [r1, 0xA]\n" +" adds r0, 0x2\n" +" strh r0, [r1, 0xA]\n" +" b _0800E212\n" +" .align 2, 0\n" +"_0800E134: .4byte gBattle_BG1_X\n" +"_0800E138: .4byte gBattle_BG1_Y\n" +"_0800E13C: .4byte gBattle_BG2_X\n" +"_0800E140: .4byte gBattle_BG2_Y\n" +"_0800E144: .4byte gTasks\n" +"_0800E148:\n" +" movs r5, 0x12\n" +" ldrsh r0, [r1, r5]\n" +" cmp r0, 0\n" +" beq _0800E154\n" +" bl PrintLinkBattleWinLossTie\n" +"_0800E154:\n" +" movs r0, 0x78\n" +" bl PlaySE\n" +" mov r0, r9\n" +" bl DestroyTask\n" +" ldr r4, _0800E224 @ =gSprites\n" +" ldr r0, _0800E228 @ =0x02000000\n" +" mov r8, r0\n" +" ldr r1, _0800E22C @ =0x0001608a\n" +" add r1, r8\n" +" mov r9, r1\n" +" ldrb r0, [r1]\n" +" lsls r1, r0, 4\n" +" adds r1, r0\n" +" lsls r1, 2\n" +" adds r1, r4\n" +" adds r1, 0x3E\n" +" ldrb r3, [r1]\n" +" movs r2, 0x5\n" +" negs r2, r2\n" +" adds r0, r2, 0\n" +" ands r0, r3\n" +" strb r0, [r1]\n" +" ldr r5, _0800E230 @ =0x0001608b\n" +" add r8, r5\n" +" mov r0, r8\n" +" ldrb r1, [r0]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r4\n" +" adds r0, 0x3E\n" +" ldrb r1, [r0]\n" +" ands r2, r1\n" +" strb r2, [r0]\n" +" mov r1, r8\n" +" ldrb r0, [r1]\n" +" lsls r2, r0, 4\n" +" adds r2, r0\n" +" lsls r2, 2\n" +" adds r2, r4\n" +" ldrh r3, [r2, 0x4]\n" +" lsls r1, r3, 22\n" +" lsrs r1, 22\n" +" adds r1, 0x40\n" +" ldr r5, _0800E234 @ =0x000003ff\n" +" adds r0, r5, 0\n" +" ands r1, r0\n" +" ldr r0, _0800E238 @ =0xfffffc00\n" +" ands r0, r3\n" +" orrs r0, r1\n" +" strh r0, [r2, 0x4]\n" +" mov r0, r9\n" +" ldrb r1, [r0]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r4\n" +" strh r7, [r0, 0x2E]\n" +" mov r2, r8\n" +" ldrb r1, [r2]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r4\n" +" movs r1, 0x1\n" +" strh r1, [r0, 0x2E]\n" +" mov r5, r9\n" +" ldrb r1, [r5]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r4\n" +" ldrh r1, [r0, 0x20]\n" +" strh r1, [r0, 0x30]\n" +" ldrb r1, [r2]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r4\n" +" ldrh r1, [r0, 0x20]\n" +" strh r1, [r0, 0x30]\n" +" ldrb r1, [r5]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r4\n" +" strh r7, [r0, 0x32]\n" +" ldrb r1, [r2]\n" +" lsls r0, r1, 4\n" +" adds r0, r1\n" +" lsls r0, 2\n" +" adds r0, r4\n" +" strh r7, [r0, 0x32]\n" +"_0800E212:\n" +" add sp, 0x10\n" +" pop {r3-r5}\n" +" mov r8, r3\n" +" mov r9, r4\n" +" mov r10, r5\n" +" pop {r4-r7}\n" +" pop {r0}\n" +" bx r0\n" +" .align 2, 0\n" +"_0800E224: .4byte gSprites\n" +"_0800E228: .4byte 0x02000000\n" +"_0800E22C: .4byte 0x0001608a\n" +"_0800E230: .4byte 0x0001608b\n" +"_0800E234: .4byte 0x000003ff\n" +"_0800E238: .4byte 0xfffffc00\n" +" thumb_func_end sub_800DE30\n" +); + +#endif // NONMATCHING + + +void sub_800E23C(void) { + if (gBattleTypeFlags & BATTLE_TYPE_LINK) { + LZDecompressVram(gVersusFrameGfx, (void *)0x6004000); + LZDecompressVram(gVersusFrameTilemap, (void *)0x600e000); + LZDecompressVram(gVersusFrameTilemap, (void *)0x600f000); + LZDecompressVram(gUnknown_08E5DC2C, (void *)0x6010000); + LoadCompressedPalette(gVersusFramePal, 0x60, 0x20); + REG_BG1CNT = 0x5c04; + REG_WININ = 0x36; + REG_WINOUT = 0x36; + gBattle_BG1_Y = 0xff5c; + gBattle_BG2_Y = 0xff5c; + LoadCompressedObjectPic(&gUnknown_081F95A4); + return; + } else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == VERSION_RUBY) { + LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void *)0x600e000); + return; + } else { + LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void *)0x600e000); + return; + } + } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } + } + if (sav1_map_get_battletype() == 0) { + LZDecompressVram(gBattleTerrainTable[gBattleTerrain][2], (void *)0x6004000); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain][3], (void *)0x600e000); + return; + } + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); +} + +int sub_800E414(u8 a1) { + int ret = 0; + switch (a1) { + case 0: + LZDecompressVram(&gUnknown_08D00000, (void *)0x6000000); + break; + case 1: + CpuCopy16(gUnknown_08D00524, (void *)0x600c000, 0x1000); + break; + case 2: + LoadCompressedPalette(gUnknown_08D004E0, 0, 0x40); + break; + case 3: // tiles + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == VERSION_RUBY) { + LZDecompressVram(gBattleTerrainTiles_Cave, (void *)0x6008000); + break; + } else { + LZDecompressVram(gBattleTerrainTiles_Water, (void *)0x6008000); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LZDecompressVram(gBattleTerrainTable[gBattleTerrain][0], (void *)0x6008000); + break; + case 2: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 3: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 4: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 5: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 6: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 7: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 1: + case 8: + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } + break; + } + } else { + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } + case 4: // tilemap + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == 2) { + LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)0x600d000); + break; + } else { + LZDecompressVram(gBattleTerrainTilemap_Water, (void *)0x600d000); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LZDecompressVram(gBattleTerrainTable[gBattleTerrain][1], (void *)0x600d000); + break; + case 2: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 3: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 4: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 5: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 6: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 7: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 1: + case 8: + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } + break; + } + } else { + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } + case 5: // palette + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == 2) { + LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); + break; + } else { + LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain][4], 0x20, 0x60); + break; + case 1: + LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); + break; + case 2: + LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); + break; + case 3: + LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); + break; + case 4: + LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); + break; + case 5: + LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); + break; + case 6: + LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); + break; + case 7: + LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); + break; + case 8: + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + break; + } + break; + } + } else { + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + break; + } + case 6: + sub_800D74C(); + break; + default: + ret = 1; + } + return ret; +} -- cgit v1.2.3 From d1f5ea0c0b74e821d1585195cffd69ba23adc74f Mon Sep 17 00:00:00 2001 From: yenatch Date: Sun, 28 Jan 2018 22:34:45 -0500 Subject: match sub_800DE30 (thanks cam) --- src/rom_800D42C.c | 543 +++--------------------------------------------------- 1 file changed, 23 insertions(+), 520 deletions(-) (limited to 'src') diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c index 032d979b8..55986fed3 100644 --- a/src/rom_800D42C.c +++ b/src/rom_800D42C.c @@ -193,7 +193,7 @@ struct Struct_081F9680 { u8 *field_8; }; -extern struct Struct_081F9680 gUnknown_081F9680[]; +extern const struct Struct_081F9680 gUnknown_081F9680[]; extern void PrintLinkBattleWinLossTie(void); extern void sub_800DAF8(u8, u8, u8 *); @@ -204,10 +204,6 @@ extern u16 gBattle_BG1_X; extern u16 gBattle_BG2_X; - - -#ifdef NONMATCHING - void sub_800DE30(u8 taskId) { int palette; @@ -219,47 +215,45 @@ void sub_800DE30(u8 taskId) if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { for (i = 0; i < 4; i++) { u8 sp8 = (gLinkPlayers[i].lp_field_18 & 3); - struct Window *window; Text_InitWindow8002E4C( - window = gUnknown_081F9680[sp8].window, + gUnknown_081F9680[sp8].window, gLinkPlayers[i].name, gUnknown_081F9680[sp8].offset, gUnknown_081F9680[sp8].left, gUnknown_081F9680[sp8].top, 1); - Text_PrintWindow8002F44(window); + Text_PrintWindow8002F44(gUnknown_081F9680[sp8].window); sub_800DAF8(taskId, sp8, gUnknown_081F9680[sp8].field_8); } } else { - int r7 = gBattle->linkPlayerIndex; - int r6 = gBattle->linkPlayerIndex ^ 1; - int r1 = r6; + u8 sp8 = 4; + + u8 r7 = gBattle->linkPlayerIndex; + u8 r6 = gBattle->linkPlayerIndex ^ 1; if (gLinkPlayers[r7].lp_field_18) { - r6 = r7; - r7 = r1; + r6 = gBattle->linkPlayerIndex; + r7 = gBattle->linkPlayerIndex ^ 1; } - i = 4; Text_InitWindow8002E4C( - gUnknown_081F9680[i].window, + gUnknown_081F9680[sp8].window, gLinkPlayers[r7].name, - gUnknown_081F9680[i].offset, - gUnknown_081F9680[i].left, - gUnknown_081F9680[i].top, + gUnknown_081F9680[sp8].offset, + gUnknown_081F9680[sp8].left, + gUnknown_081F9680[sp8].top, 1); - Text_PrintWindow8002F44(gUnknown_081F9680[i].window); - sub_800DAF8(taskId, r7, gUnknown_081F9680[i].field_8); + Text_PrintWindow8002F44(gUnknown_081F9680[sp8].window); + sub_800DAF8(taskId, r7, gUnknown_081F9680[sp8].field_8); - i = 5; Text_InitWindow8002E4C( - gUnknown_081F9680[i].window, + gUnknown_081F9680[sp8 + 1].window, gLinkPlayers[r6].name, - gUnknown_081F9680[i].offset, - gUnknown_081F9680[i].left, - gUnknown_081F9680[i].top, + gUnknown_081F9680[sp8 + 1].offset, + gUnknown_081F9680[sp8 + 1].left, + gUnknown_081F9680[sp8 + 1].top, 1); - Text_PrintWindow8002F44(gUnknown_081F9680[i].window); - sub_800DAF8(taskId, r6, gUnknown_081F9680[i].field_8); + Text_PrintWindow8002F44(gUnknown_081F9680[sp8 + 1].window); + sub_800DAF8(taskId, r6, gUnknown_081F9680[sp8 + 1].field_8); } gTasks[taskId].data[0]++; break; @@ -295,7 +289,8 @@ void sub_800DE30(u8 taskId) } PlaySE(SE_W231); DestroyTask(taskId); - gSprites[gBattle->unk1608B].invisible = gSprites[gBattle->unk1608A].invisible = FALSE; + gSprites[gBattle->unk1608A].invisible = FALSE; + gSprites[gBattle->unk1608B].invisible = FALSE; gSprites[gBattle->unk1608B].oam.tileNum += 0x40; gSprites[gBattle->unk1608A].data[0] = 0; gSprites[gBattle->unk1608B].data[0] = 1; @@ -308,498 +303,6 @@ void sub_800DE30(u8 taskId) } } -#else - -asm_unified( -".include \"macros.inc\"\n" -" thumb_func_start sub_800DE30\n" -"sub_800DE30: @ 800DE30\n" -" push {r4-r7,lr}\n" -" mov r7, r10\n" -" mov r6, r9\n" -" mov r5, r8\n" -" push {r5-r7}\n" -" sub sp, 0x10\n" -" lsls r0, 24\n" -" lsrs r0, 24\n" -" mov r9, r0\n" -" ldr r1, _0800DE64 @ =gTasks\n" -" lsls r0, 2\n" -" mov r10, r0\n" -" add r0, r9\n" -" lsls r0, 3\n" -" adds r6, r0, r1\n" -" movs r1, 0x8\n" -" ldrsh r0, [r6, r1]\n" -" cmp r0, 0x1\n" -" bne _0800DE58\n" -" b _0800DF9C\n" -"_0800DE58:\n" -" cmp r0, 0x1\n" -" bgt _0800DE68\n" -" cmp r0, 0\n" -" beq _0800DE70\n" -" b _0800E212\n" -" .align 2, 0\n" -"_0800DE64: .4byte gTasks\n" -"_0800DE68:\n" -" cmp r0, 0x2\n" -" bne _0800DE6E\n" -" b _0800E03C\n" -"_0800DE6E:\n" -" b _0800E212\n" -"_0800DE70:\n" -" ldr r0, _0800DED0 @ =gBattleTypeFlags\n" -" ldrh r1, [r0]\n" -" movs r0, 0x40\n" -" ands r0, r1\n" -" cmp r0, 0\n" -" beq _0800DEE0\n" -" ldr r0, _0800DED4 @ =gLinkPlayers\n" -" ldr r2, _0800DED8 @ =gUnknown_081F9680\n" -" mov r8, r2\n" -" adds r7, r0, 0\n" -" adds r7, 0x8\n" -" movs r5, 0x3\n" -"_0800DE88:\n" -" ldrb r0, [r7, 0x10]\n" -" movs r1, 0x3\n" -" ands r1, r0\n" -" str r1, [sp, 0x8]\n" -" lsls r4, r1, 1\n" -" adds r4, r1\n" -" lsls r4, 2\n" -" mov r2, r8\n" -" adds r0, r4, r2\n" -" ldr r1, [r0]\n" -" str r1, [sp, 0xC]\n" -" ldrh r2, [r0, 0x4]\n" -" ldrb r3, [r0, 0x6]\n" -" ldrb r0, [r0, 0x7]\n" -" str r0, [sp]\n" -" movs r0, 0x1\n" -" str r0, [sp, 0x4]\n" -" adds r0, r1, 0\n" -" adds r1, r7, 0\n" -" bl Text_InitWindow8002E4C\n" -" ldr r0, [sp, 0xC]\n" -" bl Text_PrintWindow8002F44\n" -" ldr r2, _0800DEDC @ =gUnknown_081F9680 + 0x8\n" -" adds r4, r2\n" -" ldr r2, [r4]\n" -" mov r0, r9\n" -" ldr r1, [sp, 0x8]\n" -" bl sub_800DAF8\n" -" adds r7, 0x1C\n" -" subs r5, 0x1\n" -" cmp r5, 0\n" -" bge _0800DE88\n" -" b _0800DF70\n" -" .align 2, 0\n" -"_0800DED0: .4byte gBattleTypeFlags\n" -"_0800DED4: .4byte gLinkPlayers\n" -"_0800DED8: .4byte gUnknown_081F9680\n" -"_0800DEDC: .4byte gUnknown_081F9680 + 0x8\n" -"_0800DEE0:\n" -" ldr r0, _0800DF84 @ =0x02000000\n" -" ldr r5, _0800DF88 @ =0x000160cb\n" -" adds r0, r5\n" -" ldrb r7, [r0]\n" -" movs r0, 0x1\n" -" adds r6, r7, 0\n" -" eors r6, r0\n" -" adds r1, r6, 0\n" -" ldr r2, _0800DF8C @ =gLinkPlayers\n" -" lsls r0, r7, 3\n" -" subs r0, r7\n" -" lsls r0, 2\n" -" adds r0, r2\n" -" ldrh r0, [r0, 0x18]\n" -" cmp r0, 0\n" -" beq _0800DF04\n" -" adds r6, r7, 0\n" -" adds r7, r1, 0\n" -"_0800DF04:\n" -" ldr r0, _0800DF90 @ =gUnknown_081F9680\n" -" mov r8, r0\n" -" adds r0, 0x30\n" -" mov r1, r8\n" -" ldr r4, [r1, 0x30]\n" -" lsls r1, r7, 3\n" -" subs r1, r7\n" -" lsls r1, 2\n" -" ldr r2, _0800DF94 @ =gLinkPlayers + 0x8\n" -" adds r1, r2\n" -" ldrh r2, [r0, 0x4]\n" -" ldrb r3, [r0, 0x6]\n" -" ldrb r0, [r0, 0x7]\n" -" str r0, [sp]\n" -" movs r5, 0x1\n" -" str r5, [sp, 0x4]\n" -" adds r0, r4, 0\n" -" bl Text_InitWindow8002E4C\n" -" adds r0, r4, 0\n" -" bl Text_PrintWindow8002F44\n" -" mov r0, r8\n" -" ldr r2, [r0, 0x38]\n" -" mov r0, r9\n" -" adds r1, r7, 0\n" -" bl sub_800DAF8\n" -" mov r0, r8\n" -" adds r0, 0x3C\n" -" mov r1, r8\n" -" ldr r4, [r1, 0x3C]\n" -" lsls r1, r6, 3\n" -" subs r1, r6\n" -" lsls r1, 2\n" -" ldr r2, _0800DF94 @ =gLinkPlayers + 0x8\n" -" adds r1, r2\n" -" ldrh r2, [r0, 0x4]\n" -" ldrb r3, [r0, 0x6]\n" -" ldrb r0, [r0, 0x7]\n" -" str r0, [sp]\n" -" str r5, [sp, 0x4]\n" -" adds r0, r4, 0\n" -" bl Text_InitWindow8002E4C\n" -" adds r0, r4, 0\n" -" bl Text_PrintWindow8002F44\n" -" mov r5, r8\n" -" ldr r2, [r5, 0x44]\n" -" mov r0, r9\n" -" adds r1, r6, 0\n" -" bl sub_800DAF8\n" -"_0800DF70:\n" -" ldr r0, _0800DF98 @ =gTasks\n" -" mov r1, r10\n" -" add r1, r9\n" -" lsls r1, 3\n" -" adds r1, r0\n" -" ldrh r0, [r1, 0x8]\n" -" adds r0, 0x1\n" -" strh r0, [r1, 0x8]\n" -" b _0800E212\n" -" .align 2, 0\n" -"_0800DF84: .4byte 0x02000000\n" -"_0800DF88: .4byte 0x000160cb\n" -"_0800DF8C: .4byte gLinkPlayers\n" -"_0800DF90: .4byte gUnknown_081F9680\n" -"_0800DF94: .4byte gLinkPlayers + 0x8\n" -"_0800DF98: .4byte gTasks\n" -"_0800DF9C:\n" -" ldr r0, _0800E010 @ =0x00002710\n" -" bl AllocSpritePalette\n" -" lsls r0, 24\n" -" ldr r2, _0800E014 @ =gPlttBufferUnfaded\n" -" lsrs r0, 19\n" -" ldr r1, _0800E018 @ =0x0000021e\n" -" adds r0, r1\n" -" adds r2, r0, r2\n" -" ldr r1, _0800E01C @ =gPlttBufferFaded\n" -" adds r0, r1\n" -" ldr r1, _0800E020 @ =0x00007fff\n" -" strh r1, [r0]\n" -" strh r1, [r2]\n" -" ldr r0, _0800E024 @ =gSpriteTemplate_81F9574\n" -" movs r1, 0x6C\n" -" movs r2, 0x50\n" -" movs r3, 0\n" -" bl CreateSprite\n" -" ldr r4, _0800E028 @ =0x02000000\n" -" ldr r2, _0800E02C @ =0x0001608a\n" -" adds r7, r4, r2\n" -" strb r0, [r7]\n" -" ldr r0, _0800E030 @ =gSpriteTemplate_81F958C\n" -" movs r1, 0x84\n" -" movs r2, 0x50\n" -" movs r3, 0\n" -" bl CreateSprite\n" -" ldr r5, _0800E034 @ =0x0001608b\n" -" adds r4, r5\n" -" strb r0, [r4]\n" -" ldr r3, _0800E038 @ =gSprites\n" -" ldrb r1, [r7]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r3\n" -" adds r0, 0x3E\n" -" ldrb r1, [r0]\n" -" movs r2, 0x4\n" -" orrs r1, r2\n" -" strb r1, [r0]\n" -" ldrb r1, [r4]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r3\n" -" adds r0, 0x3E\n" -" ldrb r1, [r0]\n" -" orrs r1, r2\n" -" strb r1, [r0]\n" -" ldrh r0, [r6, 0x8]\n" -" adds r0, 0x1\n" -" strh r0, [r6, 0x8]\n" -" b _0800E212\n" -" .align 2, 0\n" -"_0800E010: .4byte 0x00002710\n" -"_0800E014: .4byte gPlttBufferUnfaded\n" -"_0800E018: .4byte 0x0000021e\n" -"_0800E01C: .4byte gPlttBufferFaded\n" -"_0800E020: .4byte 0x00007fff\n" -"_0800E024: .4byte gSpriteTemplate_81F9574\n" -"_0800E028: .4byte 0x02000000\n" -"_0800E02C: .4byte 0x0001608a\n" -"_0800E030: .4byte gSpriteTemplate_81F958C\n" -"_0800E034: .4byte 0x0001608b\n" -"_0800E038: .4byte gSprites\n" -"_0800E03C:\n" -" movs r1, 0x12\n" -" ldrsh r0, [r6, r1]\n" -" cmp r0, 0\n" -" beq _0800E0A4\n" -" ldr r4, _0800E090 @ =gBattle_BG1_X\n" -" ldrh r0, [r6, 0xA]\n" -" bl Sin2\n" -" lsls r0, 16\n" -" asrs r0, 16\n" -" cmp r0, 0\n" -" bge _0800E056\n" -" adds r0, 0x1F\n" -"_0800E056:\n" -" asrs r1, r0, 5\n" -" movs r2, 0x14\n" -" negs r2, r2\n" -" adds r0, r2, 0\n" -" subs r0, r1\n" -" strh r0, [r4]\n" -" ldr r4, _0800E094 @ =gBattle_BG2_X\n" -" ldrh r0, [r6, 0xC]\n" -" bl Sin2\n" -" lsls r0, 16\n" -" asrs r0, 16\n" -" cmp r0, 0\n" -" bge _0800E074\n" -" adds r0, 0x1F\n" -"_0800E074:\n" -" asrs r1, r0, 5\n" -" movs r5, 0x8C\n" -" negs r5, r5\n" -" adds r0, r5, 0\n" -" subs r0, r1\n" -" strh r0, [r4]\n" -" ldr r0, _0800E098 @ =gBattle_BG1_Y\n" -" ldr r2, _0800E09C @ =0x0000ffdc\n" -" adds r1, r2, 0\n" -" strh r1, [r0]\n" -" ldr r0, _0800E0A0 @ =gBattle_BG2_Y\n" -" strh r1, [r0]\n" -" b _0800E110\n" -" .align 2, 0\n" -"_0800E090: .4byte gBattle_BG1_X\n" -"_0800E094: .4byte gBattle_BG2_X\n" -"_0800E098: .4byte gBattle_BG1_Y\n" -"_0800E09C: .4byte 0x0000ffdc\n" -"_0800E0A0: .4byte gBattle_BG2_Y\n" -"_0800E0A4:\n" -" ldr r4, _0800E134 @ =gBattle_BG1_X\n" -" ldrh r0, [r6, 0xA]\n" -" bl Sin2\n" -" lsls r0, 16\n" -" asrs r0, 16\n" -" cmp r0, 0\n" -" bge _0800E0B6\n" -" adds r0, 0x1F\n" -"_0800E0B6:\n" -" asrs r1, r0, 5\n" -" movs r5, 0x14\n" -" negs r5, r5\n" -" adds r0, r5, 0\n" -" subs r0, r1\n" -" strh r0, [r4]\n" -" ldr r4, _0800E138 @ =gBattle_BG1_Y\n" -" ldrh r0, [r6, 0xA]\n" -" bl Cos2\n" -" lsls r0, 16\n" -" asrs r0, 16\n" -" cmp r0, 0\n" -" bge _0800E0D4\n" -" adds r0, 0x1F\n" -"_0800E0D4:\n" -" asrs r0, 5\n" -" subs r0, 0xA4\n" -" strh r0, [r4]\n" -" ldr r4, _0800E13C @ =gBattle_BG2_X\n" -" ldrh r0, [r6, 0xC]\n" -" bl Sin2\n" -" lsls r0, 16\n" -" asrs r0, 16\n" -" cmp r0, 0\n" -" bge _0800E0EC\n" -" adds r0, 0x1F\n" -"_0800E0EC:\n" -" asrs r1, r0, 5\n" -" movs r2, 0x8C\n" -" negs r2, r2\n" -" adds r0, r2, 0\n" -" subs r0, r1\n" -" strh r0, [r4]\n" -" ldr r4, _0800E140 @ =gBattle_BG2_Y\n" -" ldrh r0, [r6, 0xC]\n" -" bl Cos2\n" -" lsls r0, 16\n" -" asrs r0, 16\n" -" cmp r0, 0\n" -" bge _0800E10A\n" -" adds r0, 0x1F\n" -"_0800E10A:\n" -" asrs r0, 5\n" -" subs r0, 0xA4\n" -" strh r0, [r4]\n" -"_0800E110:\n" -" ldr r1, _0800E144 @ =gTasks\n" -" mov r5, r9\n" -" lsls r0, r5, 2\n" -" add r0, r9\n" -" lsls r0, 3\n" -" adds r1, r0, r1\n" -" ldrh r0, [r1, 0xC]\n" -" movs r2, 0xC\n" -" ldrsh r7, [r1, r2]\n" -" cmp r7, 0\n" -" beq _0800E148\n" -" subs r0, 0x2\n" -" strh r0, [r1, 0xC]\n" -" ldrh r0, [r1, 0xA]\n" -" adds r0, 0x2\n" -" strh r0, [r1, 0xA]\n" -" b _0800E212\n" -" .align 2, 0\n" -"_0800E134: .4byte gBattle_BG1_X\n" -"_0800E138: .4byte gBattle_BG1_Y\n" -"_0800E13C: .4byte gBattle_BG2_X\n" -"_0800E140: .4byte gBattle_BG2_Y\n" -"_0800E144: .4byte gTasks\n" -"_0800E148:\n" -" movs r5, 0x12\n" -" ldrsh r0, [r1, r5]\n" -" cmp r0, 0\n" -" beq _0800E154\n" -" bl PrintLinkBattleWinLossTie\n" -"_0800E154:\n" -" movs r0, 0x78\n" -" bl PlaySE\n" -" mov r0, r9\n" -" bl DestroyTask\n" -" ldr r4, _0800E224 @ =gSprites\n" -" ldr r0, _0800E228 @ =0x02000000\n" -" mov r8, r0\n" -" ldr r1, _0800E22C @ =0x0001608a\n" -" add r1, r8\n" -" mov r9, r1\n" -" ldrb r0, [r1]\n" -" lsls r1, r0, 4\n" -" adds r1, r0\n" -" lsls r1, 2\n" -" adds r1, r4\n" -" adds r1, 0x3E\n" -" ldrb r3, [r1]\n" -" movs r2, 0x5\n" -" negs r2, r2\n" -" adds r0, r2, 0\n" -" ands r0, r3\n" -" strb r0, [r1]\n" -" ldr r5, _0800E230 @ =0x0001608b\n" -" add r8, r5\n" -" mov r0, r8\n" -" ldrb r1, [r0]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r4\n" -" adds r0, 0x3E\n" -" ldrb r1, [r0]\n" -" ands r2, r1\n" -" strb r2, [r0]\n" -" mov r1, r8\n" -" ldrb r0, [r1]\n" -" lsls r2, r0, 4\n" -" adds r2, r0\n" -" lsls r2, 2\n" -" adds r2, r4\n" -" ldrh r3, [r2, 0x4]\n" -" lsls r1, r3, 22\n" -" lsrs r1, 22\n" -" adds r1, 0x40\n" -" ldr r5, _0800E234 @ =0x000003ff\n" -" adds r0, r5, 0\n" -" ands r1, r0\n" -" ldr r0, _0800E238 @ =0xfffffc00\n" -" ands r0, r3\n" -" orrs r0, r1\n" -" strh r0, [r2, 0x4]\n" -" mov r0, r9\n" -" ldrb r1, [r0]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r4\n" -" strh r7, [r0, 0x2E]\n" -" mov r2, r8\n" -" ldrb r1, [r2]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r4\n" -" movs r1, 0x1\n" -" strh r1, [r0, 0x2E]\n" -" mov r5, r9\n" -" ldrb r1, [r5]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r4\n" -" ldrh r1, [r0, 0x20]\n" -" strh r1, [r0, 0x30]\n" -" ldrb r1, [r2]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r4\n" -" ldrh r1, [r0, 0x20]\n" -" strh r1, [r0, 0x30]\n" -" ldrb r1, [r5]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r4\n" -" strh r7, [r0, 0x32]\n" -" ldrb r1, [r2]\n" -" lsls r0, r1, 4\n" -" adds r0, r1\n" -" lsls r0, 2\n" -" adds r0, r4\n" -" strh r7, [r0, 0x32]\n" -"_0800E212:\n" -" add sp, 0x10\n" -" pop {r3-r5}\n" -" mov r8, r3\n" -" mov r9, r4\n" -" mov r10, r5\n" -" pop {r4-r7}\n" -" pop {r0}\n" -" bx r0\n" -" .align 2, 0\n" -"_0800E224: .4byte gSprites\n" -"_0800E228: .4byte 0x02000000\n" -"_0800E22C: .4byte 0x0001608a\n" -"_0800E230: .4byte 0x0001608b\n" -"_0800E234: .4byte 0x000003ff\n" -"_0800E238: .4byte 0xfffffc00\n" -" thumb_func_end sub_800DE30\n" -); - -#endif // NONMATCHING - void sub_800E23C(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { -- cgit v1.2.3 From 07a2892bec1356ea7b1ddcec3b95c04360258cbb Mon Sep 17 00:00:00 2001 From: yenatch Date: Sun, 28 Jan 2018 23:10:31 -0500 Subject: name some battle_bg variables --- src/rom_800D42C.c | 253 ++++++++++++++++++++++++++---------------------------- 1 file changed, 123 insertions(+), 130 deletions(-) (limited to 'src') diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c index 55986fed3..54886c1f9 100644 --- a/src/rom_800D42C.c +++ b/src/rom_800D42C.c @@ -1,8 +1,15 @@ #include "global.h" #include "battle.h" +#include "constants/songs.h" +#include "decompress.h" +#include "ewram.h" #include "link.h" +#include "palette.h" +#include "task.h" #include "text.h" -#include "ewram.h" +#include "trig.h" +#include "sound.h" + extern u16 gBattleTypeFlags; extern u8 gBattleOutcome; @@ -13,6 +20,78 @@ extern u8 BattleText_Win[]; extern u8 BattleText_Loss[]; extern u8 BattleText_Tie[]; +extern const u8 gGameVersion; +extern u8 gUnknown_08D00000[]; +extern u16 gUnknown_08D00524[]; +extern u16 gUnknown_08D004E0[]; +extern u16 gBattleTypeFlags; +extern struct Trainer gTrainers[]; +extern u16 gTrainerBattleOpponent; + +extern void *gBattleTerrainTable[][5]; +extern u8 gBattleTerrain; + +extern u8 gBattleTerrainTiles_Cave[]; +extern u8 gBattleTerrainTiles_Water[]; +extern u8 gBattleTerrainTiles_Building[]; +extern u8 gBattleTerrainTiles_Stadium[]; + +extern u16 gBattleTerrainTilemap_Cave[]; +extern u16 gBattleTerrainTilemap_Water[]; +extern u16 gBattleTerrainTilemap_Building[]; +extern u16 gBattleTerrainTilemap_Stadium[]; + +extern u16 gBattleTerrainPalette_Groudon[]; +extern u16 gBattleTerrainPalette_Kyogre[]; +extern u16 gBattleTerrainPalette_BuildingLeader[]; +extern u16 gBattleTerrainPalette_StadiumSteven[]; +extern u16 gBattleTerrainPalette_BuildingGym[]; +extern u16 gBattleTerrainPalette_StadiumMagma[]; +extern u16 gBattleTerrainPalette_StadiumAqua[]; +extern u16 gBattleTerrainPalette_StadiumSidney[]; +extern u16 gBattleTerrainPalette_StadiumPhoebe[]; +extern u16 gBattleTerrainPalette_StadiumGlacia[]; +extern u16 gBattleTerrainPalette_StadiumDrake[]; +extern u16 gBattleTerrainPalette_BattleTower[]; + +extern u8 gBattleTerrainAnimTiles_Building[]; +extern u16 gBattleTerrainAnimTilemap_Building[]; +extern u8 gBattleTerrainAnimTiles_Cave[]; +extern u16 gBattleTerrainAnimTilemap_Cave[]; +extern u8 gBattleTerrainAnimTiles_Underwater[]; +extern u16 gBattleTerrainAnimTilemap_Underwater[]; +extern u8 gVersusFrameGfx[]; +extern u16 gVersusFrameTilemap[]; +extern u8 gUnknown_08E5DC2C[]; +extern u16 gVersusFramePal[]; + +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_Y; +extern struct CompressedSpriteSheet gUnknown_081F95A4; + +extern u8 sav1_map_get_battletype(void); +extern void sub_800D74C(void); + +struct LinkResultWindow { + struct Window *window; + u16 offset; + u8 left; + u8 top; + u8 *dest; +}; + +#define gLinkResultWindows gUnknown_081F9680 +extern const struct LinkResultWindow gLinkResultWindows[]; +extern void PrintLinkBattleWinLossTie(void); +extern void sub_800DAF8(u8, u8, u8 *); + +extern struct SpriteTemplate gSpriteTemplate_81F9574; +extern struct SpriteTemplate gSpriteTemplate_81F958C; + +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG2_X; + + #if ENGLISH #define LEFT_MESSAGE_X 6 #define RIGHT_MESSAGE_X 21 @@ -119,94 +198,9 @@ void PrintLinkBattleWinLossTie(void) } -#include "global.h" -#include "decompress.h" -#include "palette.h" -#include "battle.h" -#include "text.h" -#include "trig.h" -#include "sound.h" -#include "constants/songs.h" -#include "task.h" -#include "link.h" - - -#define gBattle gBattleStruct - -extern const u8 gGameVersion; -extern u8 gUnknown_08D00000[]; -extern u16 gUnknown_08D00524[]; -extern u16 gUnknown_08D004E0[]; -extern u16 gBattleTypeFlags; -extern struct Trainer gTrainers[]; -extern u16 gTrainerBattleOpponent; - -extern void *gBattleTerrainTable[][5]; -extern u8 gBattleTerrain; - -extern u8 gBattleTerrainTiles_Cave[]; -extern u8 gBattleTerrainTiles_Water[]; -extern u8 gBattleTerrainTiles_Building[]; -extern u8 gBattleTerrainTiles_Stadium[]; - -extern u16 gBattleTerrainTilemap_Cave[]; -extern u16 gBattleTerrainTilemap_Water[]; -extern u16 gBattleTerrainTilemap_Building[]; -extern u16 gBattleTerrainTilemap_Stadium[]; - -extern u16 gBattleTerrainPalette_Groudon[]; -extern u16 gBattleTerrainPalette_Kyogre[]; -extern u16 gBattleTerrainPalette_BuildingLeader[]; -extern u16 gBattleTerrainPalette_StadiumSteven[]; -extern u16 gBattleTerrainPalette_BuildingGym[]; -extern u16 gBattleTerrainPalette_StadiumMagma[]; -extern u16 gBattleTerrainPalette_StadiumAqua[]; -extern u16 gBattleTerrainPalette_StadiumSidney[]; -extern u16 gBattleTerrainPalette_StadiumPhoebe[]; -extern u16 gBattleTerrainPalette_StadiumGlacia[]; -extern u16 gBattleTerrainPalette_StadiumDrake[]; -extern u16 gBattleTerrainPalette_BattleTower[]; - -extern u8 gBattleTerrainAnimTiles_Building[]; -extern u16 gBattleTerrainAnimTilemap_Building[]; -extern u8 gBattleTerrainAnimTiles_Cave[]; -extern u16 gBattleTerrainAnimTilemap_Cave[]; -extern u8 gBattleTerrainAnimTiles_Underwater[]; -extern u16 gBattleTerrainAnimTilemap_Underwater[]; -extern u8 gVersusFrameGfx[]; -extern u16 gVersusFrameTilemap[]; -extern u8 gUnknown_08E5DC2C[]; -extern u16 gVersusFramePal[]; - -extern u16 gBattle_BG1_Y; -extern u16 gBattle_BG2_Y; -extern struct CompressedSpriteSheet gUnknown_081F95A4; - -extern u8 sav1_map_get_battletype(void); -extern void sub_800D74C(void); - -struct Struct_081F9680 { - struct Window *window; - u16 offset; - u8 left; - u8 top; - u8 *field_8; -}; - -extern const struct Struct_081F9680 gUnknown_081F9680[]; -extern void PrintLinkBattleWinLossTie(void); -extern void sub_800DAF8(u8, u8, u8 *); - -extern struct SpriteTemplate gSpriteTemplate_81F9574; -extern struct SpriteTemplate gSpriteTemplate_81F958C; - -extern u16 gBattle_BG1_X; -extern u16 gBattle_BG2_X; - - void sub_800DE30(u8 taskId) { - int palette; + u8 palette; int i; switch (gTasks[taskId].data[0]) { @@ -214,46 +208,46 @@ void sub_800DE30(u8 taskId) case 0: if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { for (i = 0; i < 4; i++) { - u8 sp8 = (gLinkPlayers[i].lp_field_18 & 3); + u8 windowId = (gLinkPlayers[i].lp_field_18 & 3); Text_InitWindow8002E4C( - gUnknown_081F9680[sp8].window, + gLinkResultWindows[windowId].window, gLinkPlayers[i].name, - gUnknown_081F9680[sp8].offset, - gUnknown_081F9680[sp8].left, - gUnknown_081F9680[sp8].top, + gLinkResultWindows[windowId].offset, + gLinkResultWindows[windowId].left, + gLinkResultWindows[windowId].top, 1); - Text_PrintWindow8002F44(gUnknown_081F9680[sp8].window); - sub_800DAF8(taskId, sp8, gUnknown_081F9680[sp8].field_8); + Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); + sub_800DAF8(taskId, windowId, gLinkResultWindows[windowId].dest); } } else { - u8 sp8 = 4; + u8 windowId = 4; - u8 r7 = gBattle->linkPlayerIndex; - u8 r6 = gBattle->linkPlayerIndex ^ 1; - if (gLinkPlayers[r7].lp_field_18) { - r6 = gBattle->linkPlayerIndex; - r7 = gBattle->linkPlayerIndex ^ 1; + u8 playerId = gBattleStruct->linkPlayerIndex; + u8 opponentId = gBattleStruct->linkPlayerIndex ^ 1; + if (gLinkPlayers[playerId].lp_field_18) { + opponentId = gBattleStruct->linkPlayerIndex; + playerId = gBattleStruct->linkPlayerIndex ^ 1; } Text_InitWindow8002E4C( - gUnknown_081F9680[sp8].window, - gLinkPlayers[r7].name, - gUnknown_081F9680[sp8].offset, - gUnknown_081F9680[sp8].left, - gUnknown_081F9680[sp8].top, + gLinkResultWindows[windowId].window, + gLinkPlayers[playerId].name, + gLinkResultWindows[windowId].offset, + gLinkResultWindows[windowId].left, + gLinkResultWindows[windowId].top, 1); - Text_PrintWindow8002F44(gUnknown_081F9680[sp8].window); - sub_800DAF8(taskId, r7, gUnknown_081F9680[sp8].field_8); + Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); + sub_800DAF8(taskId, playerId, gLinkResultWindows[windowId].dest); Text_InitWindow8002E4C( - gUnknown_081F9680[sp8 + 1].window, - gLinkPlayers[r6].name, - gUnknown_081F9680[sp8 + 1].offset, - gUnknown_081F9680[sp8 + 1].left, - gUnknown_081F9680[sp8 + 1].top, + gLinkResultWindows[windowId + 1].window, + gLinkPlayers[opponentId].name, + gLinkResultWindows[windowId + 1].offset, + gLinkResultWindows[windowId + 1].left, + gLinkResultWindows[windowId + 1].top, 1); - Text_PrintWindow8002F44(gUnknown_081F9680[sp8 + 1].window); - sub_800DAF8(taskId, r6, gUnknown_081F9680[sp8 + 1].field_8); + Text_PrintWindow8002F44(gLinkResultWindows[windowId + 1].window); + sub_800DAF8(taskId, opponentId, gLinkResultWindows[windowId + 1].dest); } gTasks[taskId].data[0]++; break; @@ -261,10 +255,10 @@ void sub_800DE30(u8 taskId) case 1: palette = AllocSpritePalette(10000); gPlttBufferUnfaded[palette * 16 + 0x10f] = gPlttBufferFaded[palette * 16 + 0x10f] = 0x7fff; - gBattle->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0); - gBattle->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0); - gSprites[gBattle->unk1608A].invisible = TRUE; - gSprites[gBattle->unk1608B].invisible = TRUE; + gBattleStruct->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0); + gBattleStruct->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0); + gSprites[gBattleStruct->unk1608A].invisible = TRUE; + gSprites[gBattleStruct->unk1608B].invisible = TRUE; gTasks[taskId].data[0]++; break; @@ -289,21 +283,20 @@ void sub_800DE30(u8 taskId) } PlaySE(SE_W231); DestroyTask(taskId); - gSprites[gBattle->unk1608A].invisible = FALSE; - gSprites[gBattle->unk1608B].invisible = FALSE; - gSprites[gBattle->unk1608B].oam.tileNum += 0x40; - gSprites[gBattle->unk1608A].data[0] = 0; - gSprites[gBattle->unk1608B].data[0] = 1; - gSprites[gBattle->unk1608A].data[1] = gSprites[gBattle->unk1608A].pos1.x; - gSprites[gBattle->unk1608B].data[1] = gSprites[gBattle->unk1608B].pos1.x; - gSprites[gBattle->unk1608A].data[2] = 0; - gSprites[gBattle->unk1608B].data[2] = 0; + gSprites[gBattleStruct->unk1608A].invisible = FALSE; + gSprites[gBattleStruct->unk1608B].invisible = FALSE; + gSprites[gBattleStruct->unk1608B].oam.tileNum += 0x40; + gSprites[gBattleStruct->unk1608A].data[0] = 0; + gSprites[gBattleStruct->unk1608B].data[0] = 1; + gSprites[gBattleStruct->unk1608A].data[1] = gSprites[gBattleStruct->unk1608A].pos1.x; + gSprites[gBattleStruct->unk1608B].data[1] = gSprites[gBattleStruct->unk1608B].pos1.x; + gSprites[gBattleStruct->unk1608A].data[2] = 0; + gSprites[gBattleStruct->unk1608B].data[2] = 0; } break; } } - void sub_800E23C(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { LZDecompressVram(gVersusFrameGfx, (void *)0x6004000); @@ -352,9 +345,9 @@ void sub_800E23C(void) { LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); } -int sub_800E414(u8 a1) { +int sub_800E414(u8 type) { int ret = 0; - switch (a1) { + switch (type) { case 0: LZDecompressVram(&gUnknown_08D00000, (void *)0x6000000); break; -- cgit v1.2.3 From e71789d6773c72e314d7b21684eaa9a48c704cd1 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 28 Jan 2018 22:19:49 -0600 Subject: remove unused file pokemon_data.c and clean up roulette_util.c --- src/pokemon/pokemon_data.c | 12 ---- src/roulette_util.c | 162 +++++++++++++++++---------------------------- 2 files changed, 62 insertions(+), 112 deletions(-) delete mode 100644 src/pokemon/pokemon_data.c (limited to 'src') diff --git a/src/pokemon/pokemon_data.c b/src/pokemon/pokemon_data.c deleted file mode 100644 index 3473b58c8..000000000 --- a/src/pokemon/pokemon_data.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "global.h" -#include "pokemon.h" -#include "constants/species.h" -#include "trainer.h" -#include "constants/abilities.h" -#include "constants/moves.h" -#include "constants/hold_effects.h" -#include "constants/items.h" -#include "sprite.h" -#include "data2.h" - - diff --git a/src/roulette_util.c b/src/roulette_util.c index 3d5b03a5c..f3eae5518 100644 --- a/src/roulette_util.c +++ b/src/roulette_util.c @@ -13,12 +13,12 @@ void sub_8124918(struct UnkStruct0 *r0) { r0->var00 = 0; r0->var02 = 0; - memset((&r0->var04), 0, 0xC0); + memset(&r0->var04, 0, sizeof(r0->var04)); } u8 sub_812492C(struct UnkStruct0 *r0, u8 r1, struct UnkStruct1 *r2) { - if (!(r1 < 0x10) || (r0->var04[r1].var00_7)) + if (!(r1 < 16) || (r0->var04[r1].var00_7)) return 0xFF; r0->var04[r1].var04.var00 = r2->var00; @@ -29,123 +29,82 @@ u8 sub_812492C(struct UnkStruct0 *r0, u8 r1, struct UnkStruct1 *r2) r0->var04[r1].var04.var07_0 = r2->var07_0; r0->var04[r1].var04.var07_5 = r2->var07_5; r0->var04[r1].var04.var07_7 = r2->var07_7; - - - r0->var04[r1].var00_0 = 0x0; - r0->var04[r1].var00_7 = 0x1; - - r0->var04[r1].var02 = 0x0; - r0->var04[r1].var01 = 0x0; + r0->var04[r1].var00_0 = 0; + r0->var04[r1].var00_7 = 1; + r0->var04[r1].var02 = 0; + r0->var04[r1].var01 = 0; if (r0->var04[r1].var04.var07_7 < 0) r0->var04[r1].var03 = 0xFF; else - r0->var04[r1].var03 = 0x1; + r0->var04[r1].var03 = 1; return r1; } -#ifdef NONMATCHING u8 unref_sub_81249B0(struct UnkStruct0 *r0, u8 r1) { - if (r1 < 0x10) - { - if (r0->var04[r1].var00_7) - { - r0->var04[r1] = (struct UnkStruct3){0}; - return r1; - } - } - return 0xFF; -} -#else -__attribute__((naked)) -u8 unref_sub_81249B0(struct UnkStruct0 *r0 , u8 r1) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - adds r2, r0, 0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r4, r1, 0\n\ - cmp r4, 0xF\n\ - bhi _081249DC\n\ - lsls r0, r4, 1\n\ - adds r0, r4\n\ - lsls r0, 2\n\ - adds r1, r2, r0\n\ - ldrb r0, [r1, 0x4]\n\ - lsrs r0, 7\n\ - cmp r0, 0\n\ - beq _081249DC\n\ - adds r0, r1, 0x4\n\ - movs r1, 0\n\ - movs r2, 0xC\n\ - bl memset\n\ - adds r0, r4, 0\n\ - b _081249DE\n\ - _081249DC:\n\ - movs r0, 0xFF\n\ - _081249DE:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); + if (r1 >= 16) + return 0xFF; + if (!r0->var04[r1].var00_7) + return 0xFF; + memset(&r0->var04[r1], 0, sizeof(r0->var04[r1])); + return r1; } -#endif u8 sub_81249E4(struct UnkStruct3 *r0) { u8 i; u8 returnval; + for (i = 0; i < r0->var04.var04; i++) { - u32 offset = r0->var04.var02 + i; - struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[offset]; - struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[offset]; - switch(r0->var00_0) + struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[r0->var04.var02 + i]; + struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[r0->var04.var02 + i]; + + switch (r0->var00_0) { - case 0x1: - if ((u32)(faded->r + r0->var03) < 0x20) + case 1: + if (faded->r + r0->var03 >= 0 && faded->r + r0->var03 < 32) faded->r += r0->var03; - if ((u32)(faded->g + r0->var03) < 0x20) + if (faded->g + r0->var03 >= 0 && faded->g + r0->var03 < 32) faded->g += r0->var03; - if ((u32)(faded->b + r0->var03) < 0x20) + if (faded->b + r0->var03 >= 0 && faded->b + r0->var03 < 32) faded->b += r0->var03; - break; - case 0x2: + break; + case 2: if (r0->var03 < 0) { - if (!(faded->r + r0->var03 < unfaded->r)) + if (faded->r + r0->var03 >= unfaded->r) faded->r += r0->var03; - if (!(faded->g + r0->var03 < unfaded->g)) + if (faded->g + r0->var03 >= unfaded->g) faded->g += r0->var03; - if (!(faded->b + r0->var03 < unfaded->b)) + if (faded->b + r0->var03 >= unfaded->b) faded->b += r0->var03; } else { - if (!(faded->r + r0->var03 > unfaded->r)) + if (faded->r + r0->var03 <= unfaded->r) faded->r += r0->var03; - if (!(faded->g + r0->var03 > unfaded->g)) + if (faded->g + r0->var03 <= unfaded->g) faded->g += r0->var03; - if (!(faded->b + r0->var03 > unfaded->b)) + if (faded->b + r0->var03 <= unfaded->b) faded->b += r0->var03; } - break; + break; } } - if (((u32)r0->var02++) != r0->var04.var07_0) + if ((u32)r0->var02++ != r0->var04.var07_0) { - returnval = 0x0; + returnval = 0; } else { - r0->var02 = 0x0; - r0->var03 = r0->var03 * -1; - if (r0->var00_0 == 0x1) + r0->var02 = 0; + r0->var03 *= -1; + if (r0->var00_0 == 1) r0->var00_0++; else r0->var00_0--; - returnval = 0x1; + returnval = 1; } return returnval; } @@ -153,34 +112,36 @@ u8 sub_81249E4(struct UnkStruct3 *r0) u8 sub_8124BEC(struct UnkStruct3 *r0) { u8 rg2 = 0; + switch (r0->var00_0) { - case 0x1: + case 1: for (rg2 = 0; rg2 < r0->var04.var04; rg2++) gPlttBufferFaded[r0->var04.var02 + rg2] = r0->var04.var00; r0->var00_0++; break; - case 0x2: + case 2: for (rg2 = 0; rg2 < r0->var04.var04; rg2++) gPlttBufferFaded[r0->var04.var02 + rg2] = gPlttBufferUnfaded[r0->var04.var02 + rg2]; r0->var00_0--; break; } - return 0x1; + return 1; } void task_tutorial_controls_fadein(struct UnkStruct0 *r0) { u8 i = 0; + if (r0->var00) { - for (i = 0; i < 0x10; i++) + for (i = 0; i < 16; i++) { - if ((r0->var02 >> i) & 0x1) + if ((r0->var02 >> i) & 1) { - if (((u8)--r0->var04[i].var01) == 0xFF) // if underflow ? + if (--r0->var04[i].var01 == 0xFF) // if underflow ? { - if (r0->var04[i].var04.var00 & (0x80 << 8)) // PlttData->unused_15 ? + if (r0->var04[i].var04.var00 & 0x8000) // PlttData->unused_15 ? sub_81249E4(&r0->var04[i]); else sub_8124BEC(&r0->var04[i]); @@ -194,15 +155,16 @@ void task_tutorial_controls_fadein(struct UnkStruct0 *r0) void sub_8124CE8(struct UnkStruct0 *r0, u16 r1) { u8 i = 0; + r0->var00++; - for (i = 0; i < 0x10; i++) + for (i = 0; i < 16; i++) { - if ((r1 >> i) & 0x1) + if ((r1 >> i) & 1) { if (r0->var04[i].var00_7) { - r0->var02 |= 0x1 << i; - r0->var04[i].var00_0 = 0x1; + r0->var02 |= 1 << i; + r0->var04[i].var00_0 = 1; } } } @@ -211,21 +173,22 @@ void sub_8124CE8(struct UnkStruct0 *r0, u16 r1) void sub_8124D3C(struct UnkStruct0 *r0, u16 r1) { u8 i; - for (i = 0; i < 0x10; i++) + + for (i = 0; i < 16; i++) { - if ((r0->var02 >> i) & 0x1) + if ((r0->var02 >> i) & 1) { if (r0->var04[i].var00_7) { - if ((r1 >> i) & 0x1) + if ((r1 >> i) & 1) { u32 offset = r0->var04[i].var04.var02; u16 *faded = &gPlttBufferFaded[offset]; u16 *unfaded = &gPlttBufferUnfaded[offset]; memcpy(faded, unfaded, r0->var04[i].var04.var04 * 2); - r0->var04[i].var00_0 = 0x0; - r0->var04[i].var02 = 0x0; - r0->var04[i].var01 = 0x0; + r0->var04[i].var00_0 = 0; + r0->var04[i].var02 = 0; + r0->var04[i].var01 = 0; if (r0->var04[i].var04.var07_7 < 0) r0->var04[i].var03 = 0xFF; else @@ -236,8 +199,8 @@ void sub_8124D3C(struct UnkStruct0 *r0, u16 r1) } if (r1 == 0xFFFF) { - r0->var00 = 0x0; - r0->var02 = 0x0; + r0->var00 = 0; + r0->var02 = 0; } else { @@ -246,11 +209,10 @@ void sub_8124D3C(struct UnkStruct0 *r0, u16 r1) } void sub_8124DDC(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height) { - u16 *_dest; u8 i; u8 j; - i = 0x0; + i = 0; dest = &dest[top * 32 + left]; for (; i < height; i++) { @@ -267,7 +229,7 @@ void sub_8124E2C(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height) u16 *_src = src; u8 i; u8 j; - i = 0x0; + i = 0; dest = &dest[top * 32 + left]; for (; i < height; i++) { -- cgit v1.2.3 From 1416a4c4efe8b926c809664eb63dd2c3d0f86728 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 28 Jan 2018 23:10:53 -0600 Subject: clean up option_menu.c and field_poison.c a bit --- src/battle/battle_setup.c | 2 +- src/engine/option_menu.c | 170 +++++++++++++++++++-------------------- src/field/field_control_avatar.c | 2 +- src/field/field_poison.c | 47 ++++++----- src/field/fldeff_poison.c | 4 +- 5 files changed, 112 insertions(+), 113 deletions(-) (limited to 'src') diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c index 892be1029..15555f833 100644 --- a/src/battle/battle_setup.c +++ b/src/battle/battle_setup.c @@ -475,7 +475,7 @@ static void Task_BattleStart(u8 taskId) switch (tState) { case 0: - if (!FieldPoisonEffectIsRunning()) // is poison not active? + if (!FldeffPoison_IsActive()) // is poison not active? { BattleTransition_StartOnField(tTransition); tState++; // go to case 1. diff --git a/src/engine/option_menu.c b/src/engine/option_menu.c index d4e921a0e..a2d32ffb6 100644 --- a/src/engine/option_menu.c +++ b/src/engine/option_menu.c @@ -10,19 +10,9 @@ extern void SetPokemonCryStereo(u32 val); -//Task data -enum { - TD_MENUSELECTION, - TD_TEXTSPEED, - TD_BATTLESCENE, - TD_BATTLESTYLE, - TD_SOUND, - TD_BUTTONMODE, - TD_FRAMETYPE, -}; - -//Menu items -enum { +// Menu items +enum +{ MENUITEM_TEXTSPEED, MENUITEM_BATTLESCENE, MENUITEM_BATTLESTYLE, @@ -32,6 +22,15 @@ enum { MENUITEM_CANCEL, }; +// Task data +#define tMenuSelection data[0] +#define tOptTextSpeed data[1] +#define tOptBattleScene data[2] +#define tOptBattleStyle data[3] +#define tOptSound data[4] +#define tOptButtonMode data[5] +#define tOptFrameType data[6] + const u16 gUnknown_0839F5FC[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal"); // note: this is only used in the Japanese release const u8 gUnknown_0839F63C[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp"); @@ -75,7 +74,6 @@ void CB2_InitOptionMenu(void) { default: case 0: - { SetVBlankCallback(NULL); REG_DISPCNT = 0; REG_BG2CNT = 0; @@ -92,7 +90,6 @@ void CB2_InitOptionMenu(void) DmaClear16(3, PLTT, PLTT_SIZE); gMain.state++; break; - } case 1: ResetPaletteFade(); ScanlineEffect_Stop(); @@ -150,37 +147,38 @@ void CB2_InitOptionMenu(void) { u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0); - gTasks[taskId].data[TD_MENUSELECTION] = 0; - gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed; - gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff; - gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle; - gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound; - gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode; - gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType; - - Menu_DrawStdWindowFrame(2, 0, 27, 3); - Menu_DrawStdWindowFrame(2, 4, 27, 19); - - Menu_PrintText(gSystemText_OptionMenu, 4, 1); - Menu_PrintText(gSystemText_TextSpeed, 4, 5); - Menu_PrintText(gSystemText_BattleScene, 4, 7); - Menu_PrintText(gSystemText_BattleStyle, 4, 9); - Menu_PrintText(gSystemText_Sound, 4, 11); - Menu_PrintText(gSystemText_ButtonMode, 4, 13); - Menu_PrintText(gSystemText_Frame, 4, 15); - Menu_PrintText(gSystemText_Cancel, 4, 17); - - TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); - BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); - BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); - Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); - ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); - FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); + gTasks[taskId].tMenuSelection = 0; + gTasks[taskId].tOptTextSpeed = gSaveBlock2.optionsTextSpeed; + gTasks[taskId].tOptBattleScene = gSaveBlock2.optionsBattleSceneOff; + gTasks[taskId].tOptBattleStyle = gSaveBlock2.optionsBattleStyle; + gTasks[taskId].tOptSound = gSaveBlock2.optionsSound; + gTasks[taskId].tOptButtonMode = gSaveBlock2.optionsButtonMode; + gTasks[taskId].tOptFrameType = gSaveBlock2.optionsWindowFrameType; + + Menu_DrawStdWindowFrame(2, 0, 27, 3); // title box + Menu_DrawStdWindowFrame(2, 4, 27, 19); // options list box + + Menu_PrintText(gSystemText_OptionMenu, 4, 1); + + Menu_PrintText(gSystemText_TextSpeed, 4, 5); + Menu_PrintText(gSystemText_BattleScene, 4, 7); + Menu_PrintText(gSystemText_BattleStyle, 4, 9); + Menu_PrintText(gSystemText_Sound, 4, 11); + Menu_PrintText(gSystemText_ButtonMode, 4, 13); + Menu_PrintText(gSystemText_Frame, 4, 15); + Menu_PrintText(gSystemText_Cancel, 4, 17); + + TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed); + BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene); + BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle); + Sound_DrawChoices(gTasks[taskId].tOptSound); + ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode); + FrameType_DrawChoices(gTasks[taskId].tOptFrameType); REG_WIN0H = WIN_RANGE(17, 223); REG_WIN0V = WIN_RANGE(1, 31); - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); gMain.state++; break; } @@ -193,16 +191,14 @@ void CB2_InitOptionMenu(void) static void Task_OptionMenuFadeIn(u8 taskId) { if (!gPaletteFade.active) - { gTasks[taskId].func = Task_OptionMenuProcessInput; - } } static void Task_OptionMenuProcessInput(u8 taskId) { if (gMain.newKeys & A_BUTTON) { - if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL) + if (gTasks[taskId].tMenuSelection == MENUITEM_CANCEL) gTasks[taskId].func = Task_OptionMenuSave; } else if (gMain.newKeys & B_BUTTON) @@ -211,47 +207,47 @@ static void Task_OptionMenuProcessInput(u8 taskId) } else if (gMain.newKeys & DPAD_UP) { - if (gTasks[taskId].data[TD_MENUSELECTION] > 0) - gTasks[taskId].data[TD_MENUSELECTION]--; + if (gTasks[taskId].tMenuSelection > 0) + gTasks[taskId].tMenuSelection--; else - gTasks[taskId].data[TD_MENUSELECTION] = 6; - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + gTasks[taskId].tMenuSelection = 6; + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); } else if (gMain.newKeys & DPAD_DOWN) { - if (gTasks[taskId].data[TD_MENUSELECTION] <= 5) - gTasks[taskId].data[TD_MENUSELECTION]++; + if (gTasks[taskId].tMenuSelection < 6) + gTasks[taskId].tMenuSelection++; else - gTasks[taskId].data[TD_MENUSELECTION] = 0; - HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + gTasks[taskId].tMenuSelection = 0; + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); } else { - switch (gTasks[taskId].data[TD_MENUSELECTION]) + switch (gTasks[taskId].tMenuSelection) { case MENUITEM_TEXTSPEED: - gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]); - TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); + gTasks[taskId].tOptTextSpeed = TextSpeed_ProcessInput(gTasks[taskId].tOptTextSpeed); + TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed); break; case MENUITEM_BATTLESCENE: - gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]); - BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); + gTasks[taskId].tOptBattleScene = BattleScene_ProcessInput(gTasks[taskId].tOptBattleScene); + BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene); break; case MENUITEM_BATTLESTYLE: - gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]); - BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); + gTasks[taskId].tOptBattleStyle = BattleStyle_ProcessInput(gTasks[taskId].tOptBattleStyle); + BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle); break; case MENUITEM_SOUND: - gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]); - Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); + gTasks[taskId].tOptSound = Sound_ProcessInput(gTasks[taskId].tOptSound); + Sound_DrawChoices(gTasks[taskId].tOptSound); break; case MENUITEM_BUTTONMODE: - gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]); - ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); + gTasks[taskId].tOptButtonMode = ButtonMode_ProcessInput(gTasks[taskId].tOptButtonMode); + ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode); break; case MENUITEM_FRAMETYPE: - gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]); - FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); + gTasks[taskId].tOptFrameType = FrameType_ProcessInput(gTasks[taskId].tOptFrameType); + FrameType_DrawChoices(gTasks[taskId].tOptFrameType); break; } } @@ -259,12 +255,12 @@ static void Task_OptionMenuProcessInput(u8 taskId) static void Task_OptionMenuSave(u8 taskId) { - gSaveBlock2.optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED]; - gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE]; - gSaveBlock2.optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE]; - gSaveBlock2.optionsSound = gTasks[taskId].data[TD_SOUND]; - gSaveBlock2.optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE]; - gSaveBlock2.optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE]; + gSaveBlock2.optionsTextSpeed = gTasks[taskId].tOptTextSpeed; + gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].tOptBattleScene; + gSaveBlock2.optionsBattleStyle = gTasks[taskId].tOptBattleStyle; + gSaveBlock2.optionsSound = gTasks[taskId].tOptSound; + gSaveBlock2.optionsButtonMode = gTasks[taskId].tOptButtonMode; + gSaveBlock2.optionsWindowFrameType = gTasks[taskId].tOptFrameType; BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); gTasks[taskId].func = Task_OptionMenuFadeOut; @@ -290,10 +286,10 @@ static void HighlightOptionMenuItem(u8 index) static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style) { - u8 dst[16]; + u8 dst[15]; u16 i; - for (i = 0; *text != EOS && i <= 14; i++) + for (i = 0; *text != EOS && i < 15; i++) dst[i] = *(text++); dst[2] = style; @@ -305,14 +301,14 @@ static u8 TextSpeed_ProcessInput(u8 selection) { if (gMain.newKeys & DPAD_RIGHT) { - if (selection <= 1) + if (selection < 2) selection++; else selection = 0; } if (gMain.newKeys & DPAD_LEFT) { - if (selection != 0) + if (selection > 0) selection--; else selection = 2; @@ -341,7 +337,7 @@ static void TextSpeed_DrawChoices(u8 selection) styles[selection] = 0x8; DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]); - DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); + DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]); } @@ -360,7 +356,7 @@ static void BattleScene_DrawChoices(u8 selection) styles[1] = 0xF; styles[selection] = 0x8; - DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); + DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]); } @@ -388,7 +384,7 @@ static void BattleStyle_DrawChoices(u8 selection) styles[selection] = 0x8; DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]); - DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); + DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); } static u8 Sound_ProcessInput(u8 selection) @@ -409,7 +405,7 @@ static void Sound_DrawChoices(u8 selection) styles[1] = 0xF; styles[selection] = 0x8; - DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); + DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]); } @@ -425,7 +421,7 @@ static u8 FrameType_ProcessInput(u8 selection) } if (gMain.newKeys & DPAD_LEFT) { - if (selection != 0) + if (selection > 0) selection--; else selection = 19; @@ -439,11 +435,11 @@ static u8 FrameType_ProcessInput(u8 selection) #if ENGLISH static void FrameType_DrawChoices(u8 selection) { - u8 text[8]; + u8 text[6]; u8 n = selection + 1; u16 i; - for (i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++) + for (i = 0; gSystemText_Terminator[i] != EOS && i < 6; i++) text[i] = gSystemText_Terminator[i]; //Convert number to decimal string @@ -534,14 +530,14 @@ static u8 ButtonMode_ProcessInput(u8 selection) { if (gMain.newKeys & DPAD_RIGHT) { - if (selection <= 1) + if (selection < 2) selection++; else selection = 0; } if (gMain.newKeys & DPAD_LEFT) { - if (selection != 0) + if (selection > 0) selection--; else selection = 2; @@ -559,6 +555,6 @@ static void ButtonMode_DrawChoices(u8 selection) styles[selection] = 0x8; DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]); - DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); - DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); + DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); + DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); } diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c index bf96c724f..83924b384 100644 --- a/src/field/field_control_avatar.c +++ b/src/field/field_control_avatar.c @@ -532,7 +532,7 @@ static void happiness_algorithm_step(void) { struct Pokemon *pkmn = gPlayerParty; - for (i = 5; i >= 0; i--) + for (i = 0; i < 6; i++) { AdjustFriendship(pkmn, 5); pkmn++; diff --git a/src/field/field_poison.c b/src/field/field_poison.c index 49678f269..8365351f9 100644 --- a/src/field/field_poison.c +++ b/src/field/field_poison.c @@ -43,7 +43,7 @@ void MonFaintFromPoisonOnField(u8 partyMember) u32 val = 0; AdjustFriendship(pkmn, 7); - SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val); + SetMonData(pkmn, MON_DATA_STATUS, &val); GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1); StringGetEnd10(gStringVar1); } @@ -60,38 +60,36 @@ bool32 CheckMonFaintedFromPoison(u8 partyMember) return FALSE; } -//Task data -enum -{ - TD_STATE, - TD_PARTY_MEMBER, -}; +#define tState data[0] +#define tPartyMember data[1] void Task_WhiteOut(u8 taskId) { - s16 *taskData = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; - switch (taskData[TD_STATE]) + switch (tState) { - case 0: //Check if Pokemon have fainted due to poison - while (taskData[TD_PARTY_MEMBER] < 6) + case 0: + // Check if any Pokemon have fainted due to poison + while (tPartyMember < 6) { - if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER])) + if (CheckMonFaintedFromPoison(tPartyMember)) { - MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]); + // Show message about fainted mon + MonFaintFromPoisonOnField(tPartyMember); ShowFieldMessage(fieldPoisonText_PokemonFainted); - taskData[TD_STATE]++; + tState++; return; } - taskData[TD_PARTY_MEMBER]++; + tPartyMember++; } - taskData[TD_STATE] = 2; + tState = 2; break; - case 1: //Wait for message box to disappear + case 1: // Wait for message box to disappear if (IsFieldMessageBoxHidden()) - taskData[TD_STATE]--; //Check next party member + tState--; // Go to previous step and check next party member break; - case 2: //Done checking Pokemon + case 2: // done checking all mons if (AllMonsFainted()) gSpecialVar_Result = 1; else @@ -102,6 +100,9 @@ void Task_WhiteOut(u8 taskId) } } +#undef tState +#undef tPartyMember + void ExecuteWhiteOut(void) { CreateTask(Task_WhiteOut, 0x50); @@ -115,26 +116,28 @@ s32 DoPoisonFieldEffect(void) u32 numFainting = 0; int i; + // count the number of mons that are poisoned and fainting from poison, + // and decrement HP of all poisoned mons for (i = 0; i < 6; i++) { u32 hp; - // UB: Too few arguments for function 'GetMonData' if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0 && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) { + // decrement HP of poisoned mon hp = GetMonData(pkmn, MON_DATA_HP); if (hp != 0) hp--; if (hp == 0) - numFainting++; //Pokemon will now faint due to poison + numFainting++; SetMonData(pkmn, MON_DATA_HP, &hp); numPoisoned++; } pkmn++; } if (numFainting != 0 || numPoisoned != 0) - DoFieldPoisonEffect(); + FldeffPoison_Start(); if (numFainting != 0) return 2; if (numPoisoned != 0) diff --git a/src/field/fldeff_poison.c b/src/field/fldeff_poison.c index b0052d59d..52afc2516 100644 --- a/src/field/fldeff_poison.c +++ b/src/field/fldeff_poison.c @@ -32,13 +32,13 @@ static void Task_FieldPoisonEffect(u8 taskId) REG_MOSAIC = (data[1] << 4) | data[1]; } -void DoFieldPoisonEffect(void) +void FldeffPoison_Start(void) { PlaySE(SE_DOKU); CreateTask(Task_FieldPoisonEffect, 80); } -bool32 FieldPoisonEffectIsRunning(void) +bool32 FldeffPoison_IsActive(void) { return FuncIsActiveTask(Task_FieldPoisonEffect); } -- cgit v1.2.3 From 9af005dfd0a84692fb1e632589df99b1e53ba802 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 28 Jan 2018 20:40:11 -0800 Subject: Start decompiling rock.s --- src/battle/anim/rock.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/battle/anim/rock.c (limited to 'src') diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c new file mode 100644 index 000000000..d4307e7c1 --- /dev/null +++ b/src/battle/anim/rock.c @@ -0,0 +1,149 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "decompress.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "task.h" +#include "trig.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; + +extern const u8 gBattleAnimBackgroundTilemap_SandstormBrew[]; +extern const u8 gBattleAnimBackgroundImage_SandstormBrew[]; +extern const u16 gBattleAnimSpritePalette_261[]; + +static void sub_80DCF1C(struct Sprite *sprite); +static void sub_80DD02C(struct Sprite *sprite); +void sub_80DD190(u8 taskId); + + +void sub_80DCE9C(struct Sprite *sprite) +{ + if (gBattleAnimArgs[3] != 0) + sub_807A3FC(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += 14; + + StartSpriteAnim(sprite, gBattleAnimArgs[1]); + AnimateSprite(sprite); + + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = 4; + sprite->data[3] = 16; + sprite->data[4] = -70; + sprite->data[5] = gBattleAnimArgs[2]; + + StoreSpriteCallbackInData(sprite, sub_80DCF1C); + sprite->callback = sub_8078278; + sprite->callback(sprite); +} + +static void sub_80DCF1C(struct Sprite *sprite) +{ + sprite->pos1.x += sprite->data[5]; + + sprite->data[0] = 192; + sprite->data[1] = sprite->data[5]; + sprite->data[2] = 4; + sprite->data[3] = 32; + sprite->data[4] = -24; + + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); + sprite->callback = sub_8078278; + sprite->callback(sprite); +} + +void sub_80DCF60(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[5]); + AnimateSprite(sprite); + + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3]; + + sub_8078A5C(sprite); + sprite->data[3] = 0; + sprite->data[4] = 0; + + sprite->callback = sub_8078394; + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); +} + +void sub_80DCFE4(struct Sprite *sprite) +{ + if (gBattleAnimArgs[6] == 0) + sub_80787B0(sprite, 0); + else + sub_8078764(sprite, 0); + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = gBattleAnimArgs[2]; + sprite->data[2] = gBattleAnimArgs[4]; + sprite->data[3] = gBattleAnimArgs[5]; + + sprite->callback = sub_80DD02C; +} + +static void sub_80DD02C(struct Sprite *sprite) +{ + sprite->data[4] += sprite->data[1]; + sprite->pos2.y = -(sprite->data[4] >> 8); + sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]); + sprite->data[5] = (sprite->data[5] + sprite->data[2]) & 0xFF; + + if (--sprite->data[0] == -1) + { + DestroyAnimSprite(sprite); + } +} + +void do_boulder_dust(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + int var0 = 0; + + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x1000; + REG_BG1CNT_BITFIELD.priority = 1; + REG_BG1CNT_BITFIELD.screenSize = 0; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + + sub_8078914(&subStruct); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); + LZDecompressVram(&gBattleAnimBackgroundTilemap_SandstormBrew, subStruct.field_4); + LZDecompressVram(&gBattleAnimBackgroundImage_SandstormBrew, subStruct.field_0); + LoadCompressedPalette(&gBattleAnimSpritePalette_261, subStruct.field_8 << 4, 32); + + if (IsContest()) + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); + + if (gBattleAnimArgs[0] != 0 && GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + var0 = 1; + + gTasks[taskId].data[0] = var0; + gTasks[taskId].func = sub_80DD190; +} -- cgit v1.2.3 From cb9aec12785894d727583d13b0152c6d32948553 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Mon, 29 Jan 2018 15:08:10 -0600 Subject: integrate debug code in pokenav_before.c --- src/pokenav_before.c | 5048 ++------------------------------------------------ 1 file changed, 188 insertions(+), 4860 deletions(-) (limited to 'src') diff --git a/src/pokenav_before.c b/src/pokenav_before.c index b645136dc..4c55a5673 100644 --- a/src/pokenav_before.c +++ b/src/pokenav_before.c @@ -20,8 +20,6 @@ #include "text.h" #include "scanline_effect.h" -extern u8 ewram[]; - struct UnknownPokenav0 { /* 0x0000 */ u8 var0[0x0300]; @@ -472,315 +470,6 @@ void sub_80EBDBC(void (*func)(void)) ewram0_10.var304 = 0; } -#if DEBUG -__attribute__((naked)) -void sub_80EBDD8() -{ - asm("\ - push {lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._64 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r2, r1, #0\n\ - cmp r0, #0x11\n\ - bls ._62 @cond_branch\n\ - b ._131\n\ -._62:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._64 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._65:\n\ - .align 2, 0\n\ -._64:\n\ - .word gSharedMem\n\ - .word ._66\n\ -._66:\n\ - .word ._67\n\ - .word ._68\n\ - .word ._69\n\ - .word ._70\n\ - .word ._71\n\ - .word ._72\n\ - .word ._73\n\ - .word ._74\n\ - .word ._75\n\ - .word ._76\n\ - .word ._77\n\ - .word ._78\n\ - .word ._79\n\ - .word ._80\n\ - .word ._81\n\ - .word ._82\n\ - .word ._83\n\ - .word ._84\n\ -._67:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x13\n\ - mov r0, #0x0\n\ - strh r0, [r1]\n\ - ldr r1, ._86 @ gSharedMem\n\ - ldr r3, ._86 + 4 @ 0x6ddc\n\ - add r0, r1, r3\n\ - ldrb r2, [r0]\n\ - sub r3, r3, #0x2f\n\ - add r0, r1, r3\n\ - strb r2, [r0]\n\ - ldr r0, ._86 + 8 @ 0x6dae\n\ - add r2, r1, r0\n\ - mov r0, #0x5\n\ - strb r0, [r2]\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._124\n\ -._87:\n\ - .align 2, 0\n\ -._86:\n\ - .word gSharedMem\n\ - .word 0x6ddc\n\ - .word 0x6dae\n\ -._68:\n\ - bl sub_80F3FF0\n\ - ldr r1, ._91 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._69:\n\ - bl sub_80F4024\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._88 @cond_branch\n\ - b ._131\n\ -._88:\n\ - ldr r1, ._91 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._124\n\ -._92:\n\ - .align 2, 0\n\ -._91:\n\ - .word gSharedMem\n\ -._70:\n\ - bl sub_80F2598\n\ - ldr r1, ._94 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._124\n\ -._95:\n\ - .align 2, 0\n\ -._94:\n\ - .word gSharedMem\n\ -._71:\n\ - bl sub_80EEE20\n\ - ldr r1, ._99 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._72:\n\ - bl sub_80EEE54\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._96 @cond_branch\n\ - b ._131\n\ -._96:\n\ - bl sub_80EEE08\n\ - ldr r1, ._99 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._124\n\ -._100:\n\ - .align 2, 0\n\ -._99:\n\ - .word gSharedMem\n\ -._73:\n\ - mov r0, #0x0\n\ - bl sub_80EF248\n\ - ldr r1, ._104 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._74:\n\ - mov r0, #0x0\n\ - bl sub_80EF284\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._101 @cond_branch\n\ - b ._131\n\ -._101:\n\ - b ._110\n\ -._105:\n\ - .align 2, 0\n\ -._104:\n\ - .word gSharedMem\n\ -._75:\n\ - mov r0, #0x0\n\ - bl sub_80F1B8C\n\ - ldr r1, ._108 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._76:\n\ - mov r0, #0x0\n\ - bl sub_80F1BC8\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._131 @cond_branch\n\ - ldr r1, ._108 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._124\n\ -._109:\n\ - .align 2, 0\n\ -._108:\n\ - .word gSharedMem\n\ -._77:\n\ - ldr r0, ._111 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ - b ._110\n\ -._112:\n\ - .align 2, 0\n\ -._111:\n\ - .word sub_80EBD18+1\n\ -._78:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - mov r1, #0x0\n\ - str r1, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r1, ._114 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._124\n\ -._115:\n\ - .align 2, 0\n\ -._114:\n\ - .word gSharedMem\n\ -._79:\n\ - mov r0, #0x0\n\ - bl sub_80EED2C\n\ - ldr r1, ._117 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._124\n\ -._118:\n\ - .align 2, 0\n\ -._117:\n\ - .word gSharedMem\n\ -._80:\n\ - ldr r0, ._121 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._131 @cond_branch\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r2, r3\n\ - b ._124\n\ -._122:\n\ - .align 2, 0\n\ -._121:\n\ - .word gPaletteFade\n\ -._81:\n\ - mov r0, #0x0\n\ - bl sub_80F2C80\n\ - ldr r1, ._125 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._82:\n\ - mov r0, #0x0\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._131 @cond_branch\n\ - ldr r1, ._125 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._124\n\ -._126:\n\ - .align 2, 0\n\ -._125:\n\ - .word gSharedMem\n\ -._83:\n\ - bl sub_80F1DF0\n\ -._110:\n\ - ldr r1, ._128 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ -._124:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._131\n\ -._129:\n\ - .align 2, 0\n\ -._128:\n\ - .word gSharedMem\n\ -._84:\n\ - bl sub_80F1E50\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._131 @cond_branch\n\ - mov r0, #0x0\n\ - mov r1, #0x0\n\ - bl sub_80EF428\n\ - ldr r0, ._132 @ sub_80EC268\n\ - bl sub_80EBDBC\n\ - ldr r0, ._132 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._131 @cond_branch\n\ - ldr r0, ._132 + 8 @ 0x6007de0\n\ - ldr r2, ._132 + 12 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ -._131:\n\ - add sp, sp, #0x4\n\ - pop {r0}\n\ - bx r0\n\ -._133:\n\ - .align 2, 0\n\ -._132:\n\ - .word sub_80EC268+1\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800"); -} -#else void sub_80EBDD8() { switch (ewram0_10.var304) @@ -864,289 +553,15 @@ void sub_80EBDD8() { sub_80EF428(0, 0); sub_80EBDBC(&sub_80EC268); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif } break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80EC00C() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._136 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0xd\n\ - bls ._134 @cond_branch\n\ - b ._191\n\ -._134:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._136 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._137:\n\ - .align 2, 0\n\ -._136:\n\ - .word gSharedMem\n\ - .word ._138\n\ -._138:\n\ - .word ._139\n\ - .word ._140\n\ - .word ._141\n\ - .word ._142\n\ - .word ._143\n\ - .word ._144\n\ - .word ._145\n\ - .word ._146\n\ - .word ._147\n\ - .word ._148\n\ - .word ._149\n\ - .word ._150\n\ - .word ._151\n\ - .word ._152\n\ -._139:\n\ - bl sub_80EEF78\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._153 @cond_branch\n\ - b ._191\n\ -._153:\n\ - ldr r0, ._156 @ sub_80EBD80\n\ - bl SetVBlankCallback\n\ - bl sub_80EED1C\n\ - ldr r4, ._156 + 4 @ gSharedMem\n\ - ldr r1, ._156 + 8 @ 0x6ddc\n\ - add r0, r4, r1\n\ - ldrb r1, [r0]\n\ - ldr r2, ._156 + 12 @ 0x6dad\n\ - add r0, r4, r2\n\ - strb r1, [r0]\n\ - ldr r0, ._156 + 16 @ 0x6dae\n\ - add r1, r4, r0\n\ - mov r0, #0x5\n\ - strb r0, [r1]\n\ - bl sub_80EEE08\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r4, r4, r1\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4]\n\ - b ._191\n\ -._157:\n\ - .align 2, 0\n\ -._156:\n\ - .word sub_80EBD80+1\n\ - .word gSharedMem\n\ - .word 0x6ddc\n\ - .word 0x6dad\n\ - .word 0x6dae\n\ -._140:\n\ - mov r0, #0x0\n\ - bl sub_80EF248\n\ - ldr r1, ._161 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._141:\n\ - mov r0, #0x0\n\ - bl sub_80EF284\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._158 @cond_branch\n\ - b ._191\n\ -._158:\n\ - ldr r1, ._161 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._184\n\ -._162:\n\ - .align 2, 0\n\ -._161:\n\ - .word gSharedMem\n\ -._142:\n\ - mov r0, #0x0\n\ - bl sub_80F1B8C\n\ - ldr r1, ._166 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._143:\n\ - mov r0, #0x0\n\ - bl sub_80F1BC8\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._163 @cond_branch\n\ - b ._191\n\ -._163:\n\ - ldr r1, ._166 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._184\n\ -._167:\n\ - .align 2, 0\n\ -._166:\n\ - .word gSharedMem\n\ -._144:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._191 @cond_branch\n\ - b ._169\n\ -._145:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._171 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._184\n\ -._172:\n\ - .align 2, 0\n\ -._171:\n\ - .word sub_80EBD18+1\n\ -._146:\n\ - mov r0, #0x0\n\ - bl sub_80EED2C\n\ - ldr r1, ._174 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._184\n\ -._175:\n\ - .align 2, 0\n\ -._174:\n\ - .word gSharedMem\n\ -._147:\n\ - ldr r0, ._178 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._191 @cond_branch\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._184\n\ -._179:\n\ - .align 2, 0\n\ -._178:\n\ - .word gPaletteFade\n\ -._148:\n\ - bl sub_80F2598\n\ - ldr r1, ._181 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._184\n\ -._182:\n\ - .align 2, 0\n\ -._181:\n\ - .word gSharedMem\n\ -._149:\n\ - mov r0, #0x0\n\ - bl sub_80F2C80\n\ - ldr r1, ._185 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._150:\n\ - mov r0, #0x0\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._191 @cond_branch\n\ - ldr r1, ._185 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._184\n\ -._186:\n\ - .align 2, 0\n\ -._185:\n\ - .word gSharedMem\n\ -._151:\n\ - bl sub_80F1DF0\n\ -._169:\n\ - ldr r1, ._188 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ -._184:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._191\n\ -._189:\n\ - .align 2, 0\n\ -._188:\n\ - .word gSharedMem\n\ -._152:\n\ - bl sub_80F1E50\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._191 @cond_branch\n\ - ldr r0, ._192 @ gSharedMem\n\ - ldr r1, ._192 + 4 @ 0x6dad\n\ - add r0, r0, r1\n\ - ldrb r1, [r0]\n\ - mov r0, #0x0\n\ - bl sub_80EF428\n\ - ldr r0, ._192 + 8 @ sub_80EC268\n\ - bl sub_80EBDBC\n\ - ldr r0, ._192 + 12 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._191 @cond_branch\n\ - ldr r0, ._192 + 16 @ 0x6007de0\n\ - ldr r2, ._192 + 20 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ -._191:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._193:\n\ - .align 2, 0\n\ -._192:\n\ - .word gSharedMem\n\ - .word 0x6dad\n\ - .word sub_80EC268+1\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800"); -} -#else void sub_80EC00C() { switch (ewram0_10.var304) @@ -1216,11 +631,14 @@ void sub_80EC00C() { sub_80EF428(0, ewram0_10.var6dad); sub_80EBDBC(&sub_80EC268); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif } break; } } -#endif void sub_80EC210() { @@ -1342,262 +760,6 @@ void sub_80EC268() } } -#if DEBUG -__attribute__((naked)) -void sub_80EC4A0() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._285 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0xe\n\ - bls ._283 @cond_branch\n\ - b ._340\n\ -._283:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._285 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._286:\n\ - .align 2, 0\n\ -._285:\n\ - .word gSharedMem\n\ - .word ._287\n\ -._287:\n\ - .word ._288\n\ - .word ._289\n\ - .word ._290\n\ - .word ._291\n\ - .word ._292\n\ - .word ._293\n\ - .word ._294\n\ - .word ._295\n\ - .word ._296\n\ - .word ._297\n\ - .word ._298\n\ - .word ._299\n\ - .word ._300\n\ - .word ._301\n\ - .word ._302\n\ -._288:\n\ - bl sub_80F1E84\n\ - mov r0, #0x0\n\ - bl sub_80F2D04\n\ - b ._336\n\ -._289:\n\ - bl sub_80F1F10\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._304 @cond_branch\n\ - b ._340\n\ -._304:\n\ - ldr r0, ._308 @ gSaveBlock2\n\ - ldrb r1, [r0, #0x15]\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - mov r1, #0x8\n\ - cmp r0, #0\n\ - beq ._306 @cond_branch\n\ - mov r1, #0x7\n\ -._306:\n\ - add r0, r1, #0\n\ - bl sub_80EEFBC\n\ - ldr r1, ._308 + 4 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._335\n\ -._309:\n\ - .align 2, 0\n\ -._308:\n\ - .word gSaveBlock2\n\ - .word gSharedMem\n\ -._290:\n\ - bl sub_80EEF34\n\ - lsl r0, r0, #0x18\n\ - lsr r2, r0, #0x18\n\ - cmp r2, #0\n\ - beq ._310 @cond_branch\n\ - b ._340\n\ -._310:\n\ - ldr r4, ._313 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - str r2, [sp]\n\ - mov r2, #0x0\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._335\n\ -._314:\n\ - .align 2, 0\n\ -._313:\n\ - .word gSharedMem\n\ -._291:\n\ - ldr r0, ._318 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._315 @cond_branch\n\ - b ._340\n\ -._315:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl sub_80EED0C\n\ - b ._336\n\ -._319:\n\ - .align 2, 0\n\ -._318:\n\ - .word gPaletteFade\n\ -._292:\n\ - bl sub_80F2620\n\ - ldr r1, ._321 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._335\n\ -._322:\n\ - .align 2, 0\n\ -._321:\n\ - .word gSharedMem\n\ -._293:\n\ - bl sub_80EF814\n\ - b ._336\n\ -._294:\n\ - bl sub_80EF840\n\ - ldr r1, ._326 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._295:\n\ - bl sub_80EF874\n\ -._328:\n\ - lsl r0, r0, #0x18\n\ -._334:\n\ - cmp r0, #0\n\ - bne ._340 @cond_branch\n\ - b ._336\n\ -._327:\n\ - .align 2, 0\n\ -._326:\n\ - .word gSharedMem\n\ -._296:\n\ - mov r0, #0x4\n\ - bl sub_80F2C80\n\ - ldr r1, ._329 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._297:\n\ - mov r0, #0x4\n\ - bl sub_80F2CBC\n\ - b ._328\n\ -._330:\n\ - .align 2, 0\n\ -._329:\n\ - .word gSharedMem\n\ -._298:\n\ - bl sub_80F2DD8\n\ - ldr r0, ._332 @ sub_80EBD30\n\ - bl SetVBlankCallback\n\ - ldr r1, ._332 + 4 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._335\n\ -._333:\n\ - .align 2, 0\n\ -._332:\n\ - .word sub_80EBD30+1\n\ - .word gSharedMem\n\ -._299:\n\ - bl sub_8055870\n\ - b ._334\n\ -._300:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._335\n\ -._301:\n\ - mov r0, #0x1\n\ - bl sub_80EED2C\n\ - ldr r0, ._338 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._336 @cond_branch\n\ - ldr r0, ._338 + 4 @ 0x60075e0\n\ - ldr r2, ._338 + 8 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ -._336:\n\ - ldr r1, ._338 + 12 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ -._335:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._340\n\ -._339:\n\ - .align 2, 0\n\ -._338:\n\ - .word gLinkOpen\n\ - .word 0x60075e0\n\ - .word 0x600f800\n\ - .word gSharedMem\n\ -._302:\n\ - ldr r0, ._341 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._340 @cond_branch\n\ - ldr r0, ._341 + 4 @ sub_80EC67C\n\ - bl sub_80EBDBC\n\ -._340:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._342:\n\ - .align 2, 0\n\ -._341:\n\ - .word gPaletteFade\n\ - .word sub_80EC67C+1"); -} -#else void sub_80EC4A0() { u32 var1; @@ -1674,6 +836,10 @@ void sub_80EC4A0() break; case 0xD: sub_80EED2C(0x1); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x75E0), 0, (void *)(VRAM + 0xF800), 4); +#endif ewram0_10.var304++; break; case 0xE: @@ -1682,243 +848,7 @@ void sub_80EC4A0() break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80EC67C() -{ - asm("\ - push {r4, r5, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._345 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0x5\n\ - bls ._343 @cond_branch\n\ - b ._386\n\ -._343:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._345 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._346:\n\ - .align 2, 0\n\ -._345:\n\ - .word gSharedMem\n\ - .word ._347\n\ -._347:\n\ - .word ._348\n\ - .word ._349\n\ - .word ._350\n\ - .word ._351\n\ - .word ._352\n\ - .word ._353\n\ -._348:\n\ - bl sub_80FAB60\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x3\n\ - beq ._354 @cond_branch\n\ - cmp r0, #0x3\n\ - bgt ._355 @cond_branch\n\ - cmp r0, #0x1\n\ - beq ._356 @cond_branch\n\ - b ._386\n\ -._355:\n\ - cmp r0, #0x4\n\ - beq ._358 @cond_branch\n\ - cmp r0, #0x5\n\ - beq ._359 @cond_branch\n\ - b ._386\n\ -._356:\n\ - bl sub_80EED9C\n\ - b ._386\n\ -._354:\n\ - bl sub_80EF9F8\n\ - b ._386\n\ -._358:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._364 @ gSharedMem\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - mov r1, #0x1\n\ - strh r1, [r0]\n\ - b ._386\n\ -._365:\n\ - .align 2, 0\n\ -._364:\n\ - .word gSharedMem\n\ -._359:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._367 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r0, r2\n\ - mov r1, #0x4\n\ - strh r1, [r0]\n\ - b ._386\n\ -._368:\n\ - .align 2, 0\n\ -._367:\n\ - .word gSharedMem\n\ -._349:\n\ - ldr r1, ._371 @ 0x6e90\n\ - add r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._369 @cond_branch\n\ - bl sub_80FAEC4\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._380\n\ -._372:\n\ - .align 2, 0\n\ -._371:\n\ - .word 0x6e90\n\ -._369:\n\ - mov r0, #0x1\n\ - bl sub_80EFBDC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._386 @cond_branch\n\ - bl sub_80FAEC4\n\ - b ._374\n\ -._350:\n\ - bl sub_80FAFC0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._386 @cond_branch\n\ - ldr r5, ._378 @ gSharedMem\n\ - ldr r1, ._378 + 4 @ 0x6e90\n\ - add r0, r5, r1\n\ - ldrb r4, [r0]\n\ - cmp r4, #0\n\ - bne ._376 @cond_branch\n\ - bl sub_80EFBB0\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r5, r2\n\ - strh r4, [r0]\n\ - b ._386\n\ -._379:\n\ - .align 2, 0\n\ -._378:\n\ - .word gSharedMem\n\ - .word 0x6e90\n\ -._376:\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r5, r0\n\ - b ._380\n\ -._351:\n\ - mov r0, #0x0\n\ - bl sub_80EFBDC\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - cmp r4, #0\n\ - bne ._386 @cond_branch\n\ - bl sub_80EFBB0\n\ - ldr r0, ._383 @ gSharedMem\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - strh r4, [r0]\n\ - b ._386\n\ -._384:\n\ - .align 2, 0\n\ -._383:\n\ - .word gSharedMem\n\ -._352:\n\ - mov r2, #0xc2\n\ - lsl r2, r2, #0x2\n\ - add r0, r4, r2\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ -._374:\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r4, r0\n\ -._380:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._386\n\ -._353:\n\ - ldr r0, ._389 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._386 @cond_branch\n\ - bl sub_80F2DF4\n\ - mov r0, #0x4\n\ - bl sub_80F2D04\n\ - ldr r3, ._389 + 4 @ gSaveBlock2\n\ - mov r2, #0x0\n\ - ldr r0, ._389 + 8 @ gSharedMem\n\ - ldr r1, ._389 + 12 @ 0x6e90\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._387 @cond_branch\n\ - mov r2, #0x1\n\ -._387:\n\ - lsl r2, r2, #0x3\n\ - ldrb r1, [r3, #0x15]\n\ - mov r0, #0x9\n\ - neg r0, r0\n\ - and r0, r0, r1\n\ - orr r0, r0, r2\n\ - strb r0, [r3, #0x15]\n\ - ldr r0, ._389 + 16 @ sub_80EC00C\n\ - bl sub_80EBDBC\n\ -._386:\n\ - ldr r0, ._389 + 20 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._388 @cond_branch\n\ - ldr r0, ._389 + 24 @ gLink\n\ - ldr r2, ._389 + 28 @ 0xfbd\n\ - add r0, r0, r2\n\ - ldrb r0, [r0]\n\ - mov r1, #0x4\n\ - str r1, [sp]\n\ - mov r1, #0x1\n\ - mov r2, #0x1\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._388:\n\ - add sp, sp, #0x4\n\ - pop {r4, r5}\n\ - pop {r0}\n\ - bx r0\n\ -._390:\n\ - .align 2, 0\n\ -._389:\n\ - .word gPaletteFade\n\ - .word gSaveBlock2\n\ - .word gSharedMem\n\ - .word 0x6e90\n\ - .word sub_80EC00C+1\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else void sub_80EC67C() { switch (ewram0_10.var304) @@ -1989,8 +919,11 @@ void sub_80EC67C() } break; } -} +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 4); #endif +} void sub_80EC81C() { @@ -2085,275 +1018,6 @@ void sub_80EC9A8() } } -#if DEBUG -__attribute__((naked)) -void sub_80ECA10() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._456 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0xd\n\ - bls ._454 @cond_branch\n\ - b ._509\n\ -._454:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._456 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._457:\n\ - .align 2, 0\n\ -._456:\n\ - .word gSharedMem\n\ - .word ._458\n\ -._458:\n\ - .word ._459\n\ - .word ._460\n\ - .word ._461\n\ - .word ._462\n\ - .word ._463\n\ - .word ._464\n\ - .word ._465\n\ - .word ._466\n\ - .word ._467\n\ - .word ._468\n\ - .word ._469\n\ - .word ._470\n\ - .word ._471\n\ - .word ._472\n\ -._459:\n\ - bl sub_80EEF78\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._473 @cond_branch\n\ - b ._509\n\ -._473:\n\ - ldr r0, ._476 @ sub_80EBD80\n\ - bl SetVBlankCallback\n\ - bl sub_80EED1C\n\ - ldr r4, ._476 + 4 @ gSharedMem\n\ - ldr r1, ._476 + 8 @ 0x6df0\n\ - add r0, r4, r1\n\ - ldrb r1, [r0]\n\ - ldr r2, ._476 + 12 @ 0x6dad\n\ - add r0, r4, r2\n\ - strb r1, [r0]\n\ - ldr r0, ._476 + 16 @ 0x6dae\n\ - add r1, r4, r0\n\ - mov r0, #0x3\n\ - strb r0, [r1]\n\ - bl sub_80EEE08\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r4, r4, r1\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4]\n\ - b ._509\n\ -._477:\n\ - .align 2, 0\n\ -._476:\n\ - .word sub_80EBD80+1\n\ - .word gSharedMem\n\ - .word 0x6df0\n\ - .word 0x6dad\n\ - .word 0x6dae\n\ -._460:\n\ - mov r0, #0x1\n\ - bl sub_80EF248\n\ - ldr r1, ._481 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._461:\n\ - mov r0, #0x1\n\ - bl sub_80EF284\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._478 @cond_branch\n\ - b ._509\n\ -._478:\n\ - ldr r1, ._481 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._502\n\ -._482:\n\ - .align 2, 0\n\ -._481:\n\ - .word gSharedMem\n\ -._462:\n\ - mov r0, #0x1\n\ - bl sub_80F1B8C\n\ - ldr r1, ._486 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._463:\n\ - mov r0, #0x1\n\ - bl sub_80F1BC8\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._483 @cond_branch\n\ - b ._509\n\ -._483:\n\ - ldr r1, ._486 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._502\n\ -._487:\n\ - .align 2, 0\n\ -._486:\n\ - .word gSharedMem\n\ -._464:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._509 @cond_branch\n\ - b ._496\n\ -._465:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._491 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._502\n\ -._492:\n\ - .align 2, 0\n\ -._491:\n\ - .word sub_80EBD18+1\n\ -._466:\n\ - mov r0, #0x0\n\ - bl sub_80EED2C\n\ - ldr r1, ._494 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._502\n\ -._495:\n\ - .align 2, 0\n\ -._494:\n\ - .word gSharedMem\n\ -._467:\n\ - bl sub_80F2598\n\ - b ._496\n\ -._468:\n\ - ldr r0, ._499 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._509 @cond_branch\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r4, r0\n\ - b ._502\n\ -._500:\n\ - .align 2, 0\n\ -._499:\n\ - .word gPaletteFade\n\ -._469:\n\ - mov r0, #0x1\n\ - bl sub_80F2C80\n\ - ldr r1, ._503 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._470:\n\ - mov r0, #0x1\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._509 @cond_branch\n\ - ldr r1, ._503 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._502\n\ -._504:\n\ - .align 2, 0\n\ -._503:\n\ - .word gSharedMem\n\ -._471:\n\ - bl sub_80F1DF0\n\ -._496:\n\ - ldr r1, ._506 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ -._502:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._509\n\ -._507:\n\ - .align 2, 0\n\ -._506:\n\ - .word gSharedMem\n\ -._472:\n\ - bl sub_80F1E50\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._509 @cond_branch\n\ - ldr r0, ._510 @ gSharedMem\n\ - ldr r1, ._510 + 4 @ 0x6dad\n\ - add r0, r0, r1\n\ - ldrb r1, [r0]\n\ - mov r0, #0x1\n\ - bl sub_80EF428\n\ - ldr r0, ._510 + 8 @ sub_80EC86C\n\ - bl sub_80EBDBC\n\ - ldr r0, ._510 + 12 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._509 @cond_branch\n\ - ldr r0, ._510 + 16 @ 0x6007de0\n\ - ldr r2, ._510 + 20 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ -._509:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._511:\n\ - .align 2, 0\n\ -._510:\n\ - .word gSharedMem\n\ - .word 0x6dad\n\ - .word sub_80EC86C+1\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800"); -} -#else void sub_80ECA10() { switch (ewram0_10.var304) @@ -2364,23 +1028,23 @@ void sub_80ECA10() SetVBlankCallback(&sub_80EBD80); sub_80EED1C(); ewram0_10.var6dad = ewram0_10.var6df0; - ewram0_10.var6dae = 0x3; + ewram0_10.var6dae = 3; sub_80EEE08(); ewram0_10.var304++; } break; case 1: - sub_80EF248(0x1); + sub_80EF248(1); ewram0_10.var304++; case 2: - if (!sub_80EF284(0x1)) + if (!sub_80EF284(1)) ewram0_10.var304++; break; case 3: - sub_80F1B8C(0x1); + sub_80F1B8C(1); ewram0_10.var304++; case 4: - if (!sub_80F1BC8(0x1)) + if (!sub_80F1BC8(1)) ewram0_10.var304++; break; case 5: @@ -2404,28 +1068,31 @@ void sub_80ECA10() if (!gPaletteFade.active) ewram0_10.var304++; break; - case 0xA: - sub_80F2C80(0x1); + case 10: + sub_80F2C80(1); ewram0_10.var304++; // fall through - case 0xB: - if (!sub_80F2CBC(0x1)) + case 11: + if (!sub_80F2CBC(1)) ewram0_10.var304++; break; - case 0xC: + case 12: sub_80F1DF0(); ewram0_10.var304++; break; - case 0xD: + case 13: if (!sub_80F1E50()) { sub_80EF428(1, ewram0_10.var6dad); sub_80EBDBC(&sub_80EC86C); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif } break; } } -#endif void sub_80ECC08() { @@ -2481,362 +1148,6 @@ void sub_80ECC08() } } -#if DEBUG -__attribute__((naked)) -void sub_80ECD80() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._564 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0x14\n\ - bls ._562 @cond_branch\n\ - b ._642\n\ -._562:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._564 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._565:\n\ - .align 2, 0\n\ -._564:\n\ - .word gSharedMem\n\ - .word ._566\n\ -._566:\n\ - .word ._567\n\ - .word ._568\n\ - .word ._569\n\ - .word ._570\n\ - .word ._571\n\ - .word ._572\n\ - .word ._573\n\ - .word ._574\n\ - .word ._575\n\ - .word ._576\n\ - .word ._577\n\ - .word ._578\n\ - .word ._579\n\ - .word ._580\n\ - .word ._581\n\ - .word ._582\n\ - .word ._583\n\ - .word ._584\n\ - .word ._585\n\ - .word ._586\n\ - .word ._587\n\ -._567:\n\ - mov r3, #0xc2\n\ - lsl r3, r3, #0x2\n\ - add r0, r4, r3\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r4, r0\n\ - b ._630\n\ -._568:\n\ - ldr r0, ._592 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._589 @cond_branch\n\ - b ._642\n\ -._589:\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._630\n\ -._593:\n\ - .align 2, 0\n\ -._592:\n\ - .word gPaletteFade\n\ -._569:\n\ - bl sub_80EEF78\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._594 @cond_branch\n\ - b ._642\n\ -._594:\n\ - ldr r0, ._597 @ sub_80EBD80\n\ - bl SetVBlankCallback\n\ - b ._625\n\ -._598:\n\ - .align 2, 0\n\ -._597:\n\ - .word sub_80EBD80+1\n\ -._570:\n\ - bl sub_80EED1C\n\ - bl sub_80F3130\n\ - ldr r1, ._600 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._630\n\ -._601:\n\ - .align 2, 0\n\ -._600:\n\ - .word gSharedMem\n\ -._571:\n\ - mov r0, #0x1\n\ - bl sub_80F2D6C\n\ - ldr r1, ._603 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._630\n\ -._604:\n\ - .align 2, 0\n\ -._603:\n\ - .word gSharedMem\n\ -._572:\n\ - mov r0, #0x5\n\ - bl sub_80F2D6C\n\ - b ._625\n\ -._573:\n\ - ldr r1, ._607 @ 0x6dfc\n\ - add r0, r4, r1\n\ - ldrb r1, [r0]\n\ - ldr r2, ._607 + 4 @ 0x6dad\n\ - add r0, r4, r2\n\ - strb r1, [r0]\n\ - ldr r3, ._607 + 8 @ 0x6dae\n\ - add r1, r4, r3\n\ - mov r0, #0x6\n\ - strb r0, [r1]\n\ - bl sub_80EEE08\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r4, r0\n\ - b ._630\n\ -._608:\n\ - .align 2, 0\n\ -._607:\n\ - .word 0x6dfc\n\ - .word 0x6dad\n\ - .word 0x6dae\n\ -._574:\n\ - mov r0, #0x2\n\ - bl sub_80EF248\n\ - ldr r1, ._612 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._575:\n\ - mov r0, #0x2\n\ - bl sub_80EF284\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._609 @cond_branch\n\ - b ._642\n\ -._609:\n\ - b ._625\n\ -._613:\n\ - .align 2, 0\n\ -._612:\n\ - .word gSharedMem\n\ -._576:\n\ - mov r0, #0x2\n\ - bl sub_80F1B8C\n\ - ldr r1, ._617 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._577:\n\ - mov r0, #0x2\n\ - bl sub_80F1BC8\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._614 @cond_branch\n\ - b ._642\n\ -._614:\n\ - ldr r1, ._617 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._630\n\ -._618:\n\ - .align 2, 0\n\ -._617:\n\ - .word gSharedMem\n\ -._578:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - beq ._619 @cond_branch\n\ - b ._642\n\ -._619:\n\ - b ._625\n\ -._579:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._623 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._630\n\ -._624:\n\ - .align 2, 0\n\ -._623:\n\ - .word sub_80EBD18+1\n\ -._580:\n\ - mov r0, #0x0\n\ - bl sub_80EED2C\n\ - b ._625\n\ -._581:\n\ - bl sub_80F2598\n\ - ldr r1, ._627 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._630\n\ -._628:\n\ - .align 2, 0\n\ -._627:\n\ - .word gSharedMem\n\ -._582:\n\ - ldr r0, ._631 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._642 @cond_branch\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._630\n\ -._632:\n\ - .align 2, 0\n\ -._631:\n\ - .word gPaletteFade\n\ -._583:\n\ - mov r0, #0x1\n\ - bl sub_80F2C80\n\ - ldr r1, ._635 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._584:\n\ - mov r0, #0x1\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - lsr r2, r0, #0x18\n\ - cmp r2, #0\n\ - bne ._642 @cond_branch\n\ - ldr r0, ._635 @ gSharedMem\n\ - ldr r3, ._635 + 4 @ 0x306\n\ - add r1, r0, r3\n\ - strh r2, [r1]\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - add r1, r1, #0x1\n\ - strh r1, [r0]\n\ - b ._642\n\ -._636:\n\ - .align 2, 0\n\ -._635:\n\ - .word gSharedMem\n\ - .word 0x306\n\ -._585:\n\ - mov r0, #0x5\n\ - bl sub_80F2C80\n\ - ldr r1, ._639 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._586:\n\ - mov r0, #0x5\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._642 @cond_branch\n\ - bl sub_80F1DF0\n\ -._625:\n\ - ldr r1, ._639 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ -._630:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._642\n\ -._640:\n\ - .align 2, 0\n\ -._639:\n\ - .word gSharedMem\n\ -._587:\n\ - bl sub_80F1E50\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._642 @cond_branch\n\ - ldr r0, ._643 @ gSharedMem\n\ - ldr r1, ._643 + 4 @ 0x6dad\n\ - add r0, r0, r1\n\ - ldrb r1, [r0]\n\ - mov r0, #0x2\n\ - bl sub_80EF428\n\ - ldr r0, ._643 + 8 @ sub_80ECC08\n\ - bl sub_80EBDBC\n\ - ldr r0, ._643 + 12 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._642 @cond_branch\n\ - ldr r0, ._643 + 16 @ 0x6007de0\n\ - ldr r2, ._643 + 20 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ -._642:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._644:\n\ - .align 2, 0\n\ -._643:\n\ - .word gSharedMem\n\ - .word 0x6dad\n\ - .word sub_80ECC08+1\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800"); -} -#else void sub_80ECD80() { switch (ewram0_10.var304) @@ -2939,422 +1250,15 @@ void sub_80ECD80() { sub_80EF428(2, ewram0_10.var6dad); sub_80EBDBC(&sub_80ECC08); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif } break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80ED01C() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._647 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0x13\n\ - bls ._645 @cond_branch\n\ - b ._736\n\ -._645:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._647 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._648:\n\ - .align 2, 0\n\ -._647:\n\ - .word gSharedMem\n\ - .word ._649\n\ -._649:\n\ - .word ._650\n\ - .word ._651\n\ - .word ._652\n\ - .word ._653\n\ - .word ._654\n\ - .word ._655\n\ - .word ._656\n\ - .word ._657\n\ - .word ._658\n\ - .word ._659\n\ - .word ._660\n\ - .word ._661\n\ - .word ._662\n\ - .word ._663\n\ - .word ._664\n\ - .word ._665\n\ - .word ._666\n\ - .word ._667\n\ - .word ._668\n\ - .word ._669\n\ -._650:\n\ - bl sub_80F1E84\n\ - mov r0, #0x1\n\ - bl sub_80F2D04\n\ - mov r0, #0x5\n\ - bl sub_80F2D04\n\ - ldr r1, ._671 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - b ._724\n\ -._672:\n\ - .align 2, 0\n\ -._671:\n\ - .word gSharedMem\n\ -._651:\n\ - bl sub_80F1F10\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._673 @cond_branch\n\ - b ._736\n\ -._673:\n\ - mov r0, #0x0\n\ - bl sub_80EEFBC\n\ - ldr r1, ._676 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._724\n\ -._677:\n\ - .align 2, 0\n\ -._676:\n\ - .word gSharedMem\n\ -._652:\n\ - bl sub_80EEF34\n\ - lsl r0, r0, #0x18\n\ - lsr r2, r0, #0x18\n\ - cmp r2, #0\n\ - beq ._678 @cond_branch\n\ - b ._736\n\ -._678:\n\ - ldr r4, ._681 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - str r2, [sp]\n\ - mov r2, #0x0\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._724\n\ -._682:\n\ - .align 2, 0\n\ -._681:\n\ - .word gSharedMem\n\ -._653:\n\ - ldr r0, ._686 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._683 @cond_branch\n\ - b ._736\n\ -._683:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl sub_80EED0C\n\ - bl sub_80EF814\n\ - ldr r1, ._686 + 4 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - b ._724\n\ -._687:\n\ - .align 2, 0\n\ -._686:\n\ - .word gPaletteFade\n\ - .word gSharedMem\n\ -._654:\n\ - bl sub_80F2620\n\ - ldr r1, ._689 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._724\n\ -._690:\n\ - .align 2, 0\n\ -._689:\n\ - .word gSharedMem\n\ -._655:\n\ - bl sub_80F4D44\n\ - ldr r1, ._693 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._656:\n\ - bl sub_80F4D88\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._691 @cond_branch\n\ - ldr r1, ._693 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x2\n\ - strh r0, [r1]\n\ - b ._736\n\ -._694:\n\ - .align 2, 0\n\ -._693:\n\ - .word gSharedMem\n\ -._691:\n\ - ldr r1, ._696 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._724\n\ -._697:\n\ - .align 2, 0\n\ -._696:\n\ - .word gSharedMem\n\ -._657:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - beq ._698 @cond_branch\n\ - b ._736\n\ -._698:\n\ - ldr r1, ._701 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - sub r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._736\n\ -._702:\n\ - .align 2, 0\n\ -._701:\n\ - .word gSharedMem\n\ -._658:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - beq ._703 @cond_branch\n\ - b ._736\n\ -._703:\n\ - ldr r1, ._706 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - b ._724\n\ -._707:\n\ - .align 2, 0\n\ -._706:\n\ - .word gSharedMem\n\ -._659:\n\ - mov r0, #0x0\n\ - bl sub_80F0264\n\ - ldr r1, ._711 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._660:\n\ - bl sub_80F02A0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._708 @cond_branch\n\ - b ._736\n\ -._708:\n\ - ldr r1, ._711 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._724\n\ -._712:\n\ - .align 2, 0\n\ -._711:\n\ - .word gSharedMem\n\ -._661:\n\ - mov r0, #0x0\n\ - bl sub_80F3008\n\ - ldr r1, ._714 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - b ._724\n\ -._715:\n\ - .align 2, 0\n\ -._714:\n\ - .word gSharedMem\n\ -._662:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - beq ._716 @cond_branch\n\ - b ._736\n\ -._716:\n\ - ldr r1, ._719 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._724\n\ -._720:\n\ - .align 2, 0\n\ -._719:\n\ - .word gSharedMem\n\ -._663:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._722 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._724\n\ -._723:\n\ - .align 2, 0\n\ -._722:\n\ - .word sub_80EBD18+1\n\ -._664:\n\ - mov r0, #0x4\n\ - bl sub_80EED2C\n\ - ldr r1, ._725 @ gSharedMem\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r1, r3\n\ - b ._724\n\ -._726:\n\ - .align 2, 0\n\ -._725:\n\ - .word gSharedMem\n\ -._665:\n\ - ldr r0, ._729 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - lsl r0, r0, #0x18\n\ - lsr r1, r0, #0x18\n\ - cmp r1, #0\n\ - bne ._736 @cond_branch\n\ - ldr r2, ._729 + 4 @ 0x306\n\ - add r0, r4, r2\n\ - strh r1, [r0]\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r1, r4, r3\n\ -._724:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._736\n\ -._730:\n\ - .align 2, 0\n\ -._729:\n\ - .word gPaletteFade\n\ - .word 0x306\n\ -._666:\n\ - mov r0, #0x1\n\ - bl sub_80F2C80\n\ - ldr r1, ._733 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._667:\n\ - mov r0, #0x1\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - lsr r2, r0, #0x18\n\ - cmp r2, #0\n\ - bne ._736 @cond_branch\n\ - ldr r0, ._733 @ gSharedMem\n\ - ldr r3, ._733 + 4 @ 0x306\n\ - add r1, r0, r3\n\ - strh r2, [r1]\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - add r1, r1, #0x1\n\ - strh r1, [r0]\n\ - b ._736\n\ -._734:\n\ - .align 2, 0\n\ -._733:\n\ - .word gSharedMem\n\ - .word 0x306\n\ -._668:\n\ - ldr r4, ._737 @ gSharedMem\n\ - ldr r2, ._737 + 4 @ 0x6dfc\n\ - add r0, r4, r2\n\ - ldrb r0, [r0]\n\ - add r0, r0, #0x7\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl sub_80F2C80\n\ - mov r3, #0xc1\n\ - lsl r3, r3, #0x2\n\ - add r4, r4, r3\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4]\n\ -._669:\n\ - ldr r0, ._737 @ gSharedMem\n\ - ldr r1, ._737 + 4 @ 0x6dfc\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - add r0, r0, #0x7\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._736 @cond_branch\n\ - ldr r0, ._737 + 8 @ sub_80ED31C\n\ - bl sub_80EBDBC\n\ - ldr r0, ._737 + 12 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._736 @cond_branch\n\ - ldr r0, ._737 + 16 @ 0x6007de0\n\ - ldr r2, ._737 + 20 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ -._736:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._738:\n\ - .align 2, 0\n\ -._737:\n\ - .word gSharedMem\n\ - .word 0x6dfc\n\ - .word sub_80ED31C+1\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800"); -} -#else void sub_80ED01C() { switch (ewram0_10.var304) @@ -3459,133 +1363,17 @@ void sub_80ED01C() // fall through case 19: if (!sub_80F2CBC(ewram0_10.var6dfc + 7)) + { sub_80EBDBC(&sub_80ED31C); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + } break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80ED31C() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._743 @ gSharedMem\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r4, r0, r1\n\ - ldrh r0, [r4]\n\ - cmp r0, #0x1\n\ - beq ._739 @cond_branch\n\ - cmp r0, #0x1\n\ - bgt ._740 @cond_branch\n\ - cmp r0, #0\n\ - beq ._741 @cond_branch\n\ - b ._761\n\ -._744:\n\ - .align 2, 0\n\ -._743:\n\ - .word gSharedMem\n\ -._740:\n\ - cmp r0, #0x2\n\ - beq ._745 @cond_branch\n\ - b ._761\n\ -._741:\n\ - bl sub_80F5DD4\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - beq ._747 @cond_branch\n\ - cmp r0, #0x2\n\ - beq ._748 @cond_branch\n\ - ldr r0, ._751 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._749 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._751 + 4 @ sub_80ED4D8\n\ - bl sub_80EBDBC\n\ - b ._762\n\ -._752:\n\ - .align 2, 0\n\ -._751:\n\ - .word gMain\n\ - .word sub_80ED4D8+1\n\ -._747:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl ShowMapNamePopUpWindow\n\ - b ._762\n\ -._748:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4]\n\ - b ._762\n\ -._749:\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._761 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._757 @ sub_80ECD80\n\ - bl sub_80EBDBC\n\ - b ._762\n\ -._758:\n\ - .align 2, 0\n\ -._757:\n\ - .word sub_80ECD80+1\n\ -._739:\n\ - bl sub_80F0718\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._761 @cond_branch\n\ - bl ShowMapNamePopUpWindow\n\ - bl sub_80F3264\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - b ._760\n\ -._745:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._761 @cond_branch\n\ -._760:\n\ - strh r0, [r4]\n\ -._761:\n\ - ldr r0, ._763 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._762 @cond_branch\n\ - ldr r0, ._763 + 4 @ gLink\n\ - ldr r1, ._763 + 8 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x4\n\ - str r1, [sp]\n\ - mov r1, #0x1\n\ - mov r2, #0x8\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._762:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._764:\n\ - .align 2, 0\n\ -._763:\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else void sub_80ED31C() { switch (ewram0_10.var304) @@ -3596,21 +1384,23 @@ void sub_80ED31C() case 1: PlaySE(SE_SELECT); ShowMapNamePopUpWindow(); - break; + return; case 2: PlaySE(SE_SELECT); ewram0_10.var304++; - break; + return; default: if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); sub_80EBDBC(&sub_80ED4D8); + return; } else if (gMain.newKeys & B_BUTTON) { PlaySE(SE_SELECT); sub_80EBDBC(&sub_80ECD80); + return; } break; } @@ -3628,196 +1418,12 @@ void sub_80ED31C() ewram0_10.var304 = 0; break; } -} -#endif - #if DEBUG -__attribute__((naked)) -void sub_80ED3D0() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._767 @ gSharedMem\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0]\n\ - cmp r0, #0x8\n\ - bls ._765 @cond_branch\n\ - b ._803\n\ -._765:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._767 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._768:\n\ - .align 2, 0\n\ -._767:\n\ - .word gSharedMem\n\ - .word ._769\n\ -._769:\n\ - .word ._770\n\ - .word ._771\n\ - .word ._772\n\ - .word ._773\n\ - .word ._774\n\ - .word ._775\n\ - .word ._776\n\ - .word ._777\n\ - .word ._778\n\ -._770:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - ldr r1, ._780 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._793\n\ -._781:\n\ - .align 2, 0\n\ -._780:\n\ - .word gSharedMem\n\ -._771:\n\ - bl sub_80EED0C\n\ - bl sub_80F6134\n\ - ldr r1, ._783 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._793\n\ -._784:\n\ - .align 2, 0\n\ -._783:\n\ - .word gSharedMem\n\ -._772:\n\ - mov r0, #0x0\n\ - bl sub_80EEFBC\n\ - ldr r1, ._786 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._793\n\ -._787:\n\ - .align 2, 0\n\ -._786:\n\ - .word gSharedMem\n\ -._773:\n\ - mov r0, #0x0\n\ - bl sub_80F0264\n\ - ldr r1, ._790 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._774:\n\ - bl sub_80F02A0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._803 @cond_branch\n\ - ldr r1, ._790 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._793\n\ -._791:\n\ - .align 2, 0\n\ -._790:\n\ - .word gSharedMem\n\ -._775:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._803 @cond_branch\n\ - ldr r1, ._794 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._793\n\ -._795:\n\ - .align 2, 0\n\ -._794:\n\ - .word gSharedMem\n\ -._776:\n\ - mov r0, #0x0\n\ - bl sub_80F3008\n\ - ldr r4, ._797 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._797 + 4 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r4, r0\n\ -._793:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._803\n\ -._798:\n\ - .align 2, 0\n\ -._797:\n\ - .word gSharedMem\n\ - .word sub_80EBD18+1\n\ -._777:\n\ - mov r0, #0x4\n\ - bl sub_80EED2C\n\ - ldr r1, ._801 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - ldr r0, ._801 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._803 @cond_branch\n\ - ldr r0, ._801 + 8 @ 0x6007de0\n\ - ldr r2, ._801 + 12 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ - b ._803\n\ -._802:\n\ - .align 2, 0\n\ -._801:\n\ - .word gSharedMem\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800\n\ -._778:\n\ - ldr r0, ._804 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._803 @cond_branch\n\ - ldr r0, ._804 + 4 @ sub_80ED31C\n\ - bl sub_80EBDBC\n\ -._803:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._805:\n\ - .align 2, 0\n\ -._804:\n\ - .word gPaletteFade\n\ - .word sub_80ED31C+1"); + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 8, 2, 4); +#endif } -#else + void sub_80ED3D0() { switch (ewram0_10.var304) @@ -3856,6 +1462,10 @@ void sub_80ED3D0() case 7: sub_80EED2C(0x4); ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif break; case 8: if (!gPaletteFade.active) @@ -3863,207 +1473,7 @@ void sub_80ED3D0() break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80ED4D8() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._808 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0x8\n\ - bls ._806 @cond_branch\n\ - b ._844\n\ -._806:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._808 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._809:\n\ - .align 2, 0\n\ -._808:\n\ - .word gSharedMem\n\ - .word ._810\n\ -._810:\n\ - .word ._811\n\ - .word ._812\n\ - .word ._813\n\ - .word ._814\n\ - .word ._815\n\ - .word ._816\n\ - .word ._817\n\ - .word ._818\n\ - .word ._819\n\ -._811:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - b ._820\n\ -._812:\n\ - ldr r0, ._824 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._821 @cond_branch\n\ - b ._844\n\ -._821:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl sub_80EED0C\n\ - bl sub_80F3130\n\ - ldr r1, ._824 + 4 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._834\n\ -._825:\n\ - .align 2, 0\n\ -._824:\n\ - .word gPaletteFade\n\ - .word gSharedMem\n\ -._813:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._844 @cond_branch\n\ - ldr r1, ._828 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._834\n\ -._829:\n\ - .align 2, 0\n\ -._828:\n\ - .word gSharedMem\n\ -._814:\n\ - bl sub_80F4CF0\n\ - ldr r1, ._831 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._834\n\ -._832:\n\ - .align 2, 0\n\ -._831:\n\ - .word gSharedMem\n\ -._815:\n\ - bl sub_80EFF34\n\ - ldr r1, ._835 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._816:\n\ - bl sub_80EFF68\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._844 @cond_branch\n\ - ldr r1, ._835 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._834\n\ -._836:\n\ - .align 2, 0\n\ -._835:\n\ - .word gSharedMem\n\ -._817:\n\ - bl sub_80F35B4\n\ - mov r0, #0x2\n\ - bl sub_80EEFBC\n\ - ldr r4, ._838 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._838 + 4 @ sub_80EBD4C\n\ - bl SetVBlankCallback\n\ -._820:\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ -._834:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._844\n\ -._839:\n\ - .align 2, 0\n\ -._838:\n\ - .word gSharedMem\n\ - .word sub_80EBD4C+1\n\ -._818:\n\ - mov r0, #0x2\n\ - bl sub_80EED2C\n\ - ldr r1, ._842 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - ldr r0, ._842 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._844 @cond_branch\n\ - ldr r0, ._842 + 8 @ 0x6007de0\n\ - ldr r2, ._842 + 12 @ 0x600f000\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ - b ._844\n\ -._843:\n\ - .align 2, 0\n\ -._842:\n\ - .word gSharedMem\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f000\n\ -._819:\n\ - ldr r0, ._845 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._844 @cond_branch\n\ - ldr r0, ._845 + 4 @ sub_80ED858\n\ - bl sub_80EBDBC\n\ -._844:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._846:\n\ - .align 2, 0\n\ -._845:\n\ - .word gPaletteFade\n\ - .word sub_80ED858+1"); -} -#else void sub_80ED4D8() { switch (ewram0_10.var304) @@ -4107,6 +1517,10 @@ void sub_80ED4D8() case 7: sub_80EED2C(0x2); ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4); +#endif break; case 8: if (!gPaletteFade.active) @@ -4114,310 +1528,7 @@ void sub_80ED4D8() break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80ED620() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._849 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0x10\n\ - bls ._847 @cond_branch\n\ - b ._912\n\ -._847:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._849 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._850:\n\ - .align 2, 0\n\ -._849:\n\ - .word gSharedMem\n\ - .word ._851\n\ -._851:\n\ - .word ._852\n\ - .word ._853\n\ - .word ._854\n\ - .word ._855\n\ - .word ._856\n\ - .word ._857\n\ - .word ._858\n\ - .word ._859\n\ - .word ._860\n\ - .word ._861\n\ - .word ._862\n\ - .word ._863\n\ - .word ._864\n\ - .word ._865\n\ - .word ._866\n\ - .word ._867\n\ - .word ._868\n\ -._852:\n\ - bl sub_80F1E84\n\ - mov r0, #0x1\n\ - bl sub_80F2D04\n\ - ldr r1, ._870 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._904\n\ -._871:\n\ - .align 2, 0\n\ -._870:\n\ - .word gSharedMem\n\ -._853:\n\ - bl sub_80F1F10\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._872 @cond_branch\n\ - b ._912\n\ -._872:\n\ - mov r0, #0x1\n\ - bl sub_80EEFBC\n\ - b ._885\n\ -._854:\n\ - bl sub_80EEF34\n\ - lsl r0, r0, #0x18\n\ - lsr r2, r0, #0x18\n\ - cmp r2, #0\n\ - beq ._875 @cond_branch\n\ - b ._912\n\ -._875:\n\ - ldr r4, ._878 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - str r2, [sp]\n\ - mov r2, #0x0\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._904\n\ -._879:\n\ - .align 2, 0\n\ -._878:\n\ - .word gSharedMem\n\ -._855:\n\ - ldr r0, ._883 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - cmp r4, #0\n\ - beq ._880 @cond_branch\n\ - b ._912\n\ -._880:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl sub_80EED0C\n\ - bl sub_80EF814\n\ - ldr r0, ._883 + 4 @ gSharedMem\n\ - ldr r2, ._883 + 8 @ 0x76aa\n\ - add r1, r0, r2\n\ - strb r4, [r1]\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - add r1, r1, #0x1\n\ - strh r1, [r0]\n\ - b ._912\n\ -._884:\n\ - .align 2, 0\n\ -._883:\n\ - .word gPaletteFade\n\ - .word gSharedMem\n\ - .word 0x76aa\n\ -._856:\n\ - bl sub_80F2620\n\ - b ._885\n\ -._857:\n\ - ldr r0, ._887 @ 0xd162\n\ - add r1, r4, r0\n\ - mov r0, #0x2\n\ - strb r0, [r1]\n\ - bl sub_80F4BD0\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._904\n\ -._888:\n\ - .align 2, 0\n\ -._887:\n\ - .word 0xd162\n\ -._858:\n\ - bl sub_80EFF34\n\ - ldr r1, ._890 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._859:\n\ - bl sub_80EFF68\n\ - b ._889\n\ -._891:\n\ - .align 2, 0\n\ -._890:\n\ - .word gSharedMem\n\ -._860:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._912 @cond_branch\n\ - ldr r1, ._894 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._904\n\ -._895:\n\ - .align 2, 0\n\ -._894:\n\ - .word gSharedMem\n\ -._861:\n\ - bl sub_8055870\n\ - b ._896\n\ -._862:\n\ - bl sub_80F33A8\n\ - ldr r4, ._898 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._898 + 4 @ sub_80EBD4C\n\ - bl SetVBlankCallback\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._904\n\ -._899:\n\ - .align 2, 0\n\ -._898:\n\ - .word gSharedMem\n\ - .word sub_80EBD4C+1\n\ -._863:\n\ - mov r0, #0x2\n\ - bl sub_80EED2C\n\ - ldr r1, ._901 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._904\n\ -._902:\n\ - .align 2, 0\n\ -._901:\n\ - .word gSharedMem\n\ -._864:\n\ - ldr r0, ._905 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._912 @cond_branch\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - b ._904\n\ -._906:\n\ - .align 2, 0\n\ -._905:\n\ - .word gPaletteFade\n\ -._865:\n\ - mov r0, #0x1\n\ - bl sub_80F2C80\n\ - ldr r1, ._909 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._866:\n\ - mov r0, #0x1\n\ - bl sub_80F2CBC\n\ -._889:\n\ - lsl r0, r0, #0x18\n\ -._896:\n\ - cmp r0, #0\n\ - bne ._912 @cond_branch\n\ -._885:\n\ - ldr r1, ._909 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ -._904:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._912\n\ -._910:\n\ - .align 2, 0\n\ -._909:\n\ - .word gSharedMem\n\ -._867:\n\ - mov r0, #0x6\n\ - bl sub_80F2C80\n\ - ldr r1, ._913 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._868:\n\ - mov r0, #0x6\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._912 @cond_branch\n\ - ldr r0, ._913 + 4 @ sub_80ED858\n\ - bl sub_80EBDBC\n\ - ldr r0, ._913 + 8 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._912 @cond_branch\n\ - ldr r0, ._913 + 12 @ 0x6007de0\n\ - ldr r2, ._913 + 16 @ 0x600f000\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ -._912:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._914:\n\ - .align 2, 0\n\ -._913:\n\ - .word gSharedMem\n\ - .word sub_80ED858+1\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f000"); -} -#else void sub_80ED620() { switch (ewram0_10.var304) @@ -4503,11 +1614,16 @@ void sub_80ED620() // fall through case 16: if (!sub_80F2CBC(0x6)) + { sub_80EBDBC(&sub_80ED858); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4); +#endif + } break; } } -#endif #if 0 void sub_80F4F78(); @@ -5476,359 +2592,6 @@ _080EDB84: .4byte sub_80ED3D0\n"); #endif #endif -#if DEBUG -__attribute__((naked)) -void sub_80EDB88() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._1007 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0x11\n\ - bls ._1005 @cond_branch\n\ - b ._1088\n\ -._1005:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._1007 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._1008:\n\ - .align 2, 0\n\ -._1007:\n\ - .word gSharedMem\n\ - .word ._1009\n\ -._1009:\n\ - .word ._1010\n\ - .word ._1011\n\ - .word ._1012\n\ - .word ._1013\n\ - .word ._1014\n\ - .word ._1015\n\ - .word ._1016\n\ - .word ._1017\n\ - .word ._1018\n\ - .word ._1019\n\ - .word ._1020\n\ - .word ._1021\n\ - .word ._1022\n\ - .word ._1023\n\ - .word ._1024\n\ - .word ._1025\n\ - .word ._1026\n\ - .word ._1027\n\ -._1010:\n\ - bl sub_80F1E84\n\ - mov r0, #0x0\n\ - bl sub_80F2D04\n\ - ldr r1, ._1029 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1078\n\ -._1030:\n\ - .align 2, 0\n\ -._1029:\n\ - .word gSharedMem\n\ -._1011:\n\ - bl sub_80F1F10\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1031 @cond_branch\n\ - b ._1088\n\ -._1031:\n\ - mov r0, #0x4\n\ - bl sub_80EEFBC\n\ - ldr r1, ._1034 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._1078\n\ -._1035:\n\ - .align 2, 0\n\ -._1034:\n\ - .word gSharedMem\n\ -._1012:\n\ - bl sub_80EEF34\n\ - lsl r0, r0, #0x18\n\ - lsr r2, r0, #0x18\n\ - cmp r2, #0\n\ - beq ._1036 @cond_branch\n\ - b ._1088\n\ -._1036:\n\ - ldr r4, ._1039 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - str r2, [sp]\n\ - mov r2, #0x0\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - b ._1038\n\ -._1040:\n\ - .align 2, 0\n\ -._1039:\n\ - .word gSharedMem\n\ -._1013:\n\ - ldr r0, ._1044 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1041 @cond_branch\n\ - b ._1088\n\ -._1041:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl sub_80EED0C\n\ - bl sub_80EF814\n\ - ldr r1, ._1044 + 4 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1078\n\ -._1045:\n\ - .align 2, 0\n\ -._1044:\n\ - .word gPaletteFade\n\ - .word gSharedMem\n\ -._1014:\n\ - bl sub_80F2620\n\ - ldr r1, ._1047 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._1078\n\ -._1048:\n\ - .align 2, 0\n\ -._1047:\n\ - .word gSharedMem\n\ -._1015:\n\ - bl sub_80F638C\n\ - ldr r1, ._1051 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._1016:\n\ - bl sub_80F63D0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1049 @cond_branch\n\ - ldr r1, ._1051 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x2\n\ - strh r0, [r1]\n\ - b ._1088\n\ -._1052:\n\ - .align 2, 0\n\ -._1051:\n\ - .word gSharedMem\n\ -._1049:\n\ - ldr r1, ._1054 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1078\n\ -._1055:\n\ - .align 2, 0\n\ -._1054:\n\ - .word gSharedMem\n\ -._1017:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - beq ._1056 @cond_branch\n\ - b ._1088\n\ -._1056:\n\ - ldr r1, ._1059 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - sub r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._1088\n\ -._1060:\n\ - .align 2, 0\n\ -._1059:\n\ - .word gSharedMem\n\ -._1018:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - beq ._1061 @cond_branch\n\ - b ._1088\n\ -._1061:\n\ - ldr r1, ._1064 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1078\n\ -._1065:\n\ - .align 2, 0\n\ -._1064:\n\ - .word gSharedMem\n\ -._1019:\n\ - mov r0, #0x1\n\ - bl sub_80F0264\n\ - ldr r1, ._1068 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._1020:\n\ - bl sub_80F02A0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1088 @cond_branch\n\ - ldr r1, ._1068 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1078\n\ -._1069:\n\ - .align 2, 0\n\ -._1068:\n\ - .word gSharedMem\n\ -._1021:\n\ - mov r0, #0x2\n\ - bl sub_80F2C80\n\ - ldr r1, ._1072 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._1022:\n\ - mov r0, #0x2\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1088 @cond_branch\n\ - ldr r1, ._1072 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1078\n\ -._1073:\n\ - .align 2, 0\n\ -._1072:\n\ - .word gSharedMem\n\ -._1023:\n\ - mov r0, #0x1\n\ - bl sub_80F3008\n\ - ldr r1, ._1075 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._1078\n\ -._1076:\n\ - .align 2, 0\n\ -._1075:\n\ - .word gSharedMem\n\ -._1024:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._1088 @cond_branch\n\ - ldr r1, ._1079 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1078\n\ -._1080:\n\ - .align 2, 0\n\ -._1079:\n\ - .word gSharedMem\n\ -._1025:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._1082 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ -._1038:\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ -._1078:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._1088\n\ -._1083:\n\ - .align 2, 0\n\ -._1082:\n\ - .word sub_80EBD18+1\n\ -._1026:\n\ - mov r0, #0x4\n\ - bl sub_80EED2C\n\ - ldr r1, ._1086 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - ldr r0, ._1086 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1088 @cond_branch\n\ - ldr r0, ._1086 + 8 @ 0x6007de0\n\ - ldr r2, ._1086 + 12 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ - b ._1088\n\ -._1087:\n\ - .align 2, 0\n\ -._1086:\n\ - .word gSharedMem\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800\n\ -._1027:\n\ - ldr r0, ._1089 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1088 @cond_branch\n\ - ldr r0, ._1089 + 4 @ sub_80EDDBC\n\ - bl sub_80EBDBC\n\ -._1088:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._1090:\n\ - .align 2, 0\n\ -._1089:\n\ - .word gPaletteFade\n\ - .word sub_80EDDBC+1"); -} -#else void sub_80EDB88() { switch (ewram0_10.var304) @@ -5912,6 +2675,10 @@ void sub_80EDB88() case 16: sub_80EED2C(0x4); ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif break; case 17: if (!gPaletteFade.active) @@ -5919,129 +2686,7 @@ void sub_80EDB88() break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80EDDBC() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._1095 @ gSharedMem\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r4, r0, r1\n\ - ldrh r0, [r4]\n\ - cmp r0, #0x1\n\ - beq ._1091 @cond_branch\n\ - cmp r0, #0x1\n\ - bgt ._1092 @cond_branch\n\ - cmp r0, #0\n\ - beq ._1093 @cond_branch\n\ - b ._1113\n\ -._1096:\n\ - .align 2, 0\n\ -._1095:\n\ - .word gSharedMem\n\ -._1092:\n\ - cmp r0, #0x2\n\ - beq ._1097 @cond_branch\n\ - b ._1113\n\ -._1093:\n\ - bl sub_80F5DD4\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - beq ._1099 @cond_branch\n\ - cmp r0, #0x2\n\ - beq ._1100 @cond_branch\n\ - ldr r0, ._1103 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1101 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._1103 + 4 @ sub_80EDEE4\n\ - bl sub_80EBDBC\n\ - b ._1114\n\ -._1104:\n\ - .align 2, 0\n\ -._1103:\n\ - .word gMain\n\ - .word sub_80EDEE4+1\n\ -._1099:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl ShowMapNamePopUpWindow\n\ - b ._1114\n\ -._1100:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4]\n\ - b ._1114\n\ -._1101:\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1113 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._1109 @ sub_80EDE70\n\ - bl sub_80EBDBC\n\ - b ._1114\n\ -._1110:\n\ - .align 2, 0\n\ -._1109:\n\ - .word sub_80EDE70+1\n\ -._1091:\n\ - bl sub_80F0718\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1113 @cond_branch\n\ - bl ShowMapNamePopUpWindow\n\ - bl sub_80F3264\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - b ._1112\n\ -._1097:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._1113 @cond_branch\n\ -._1112:\n\ - strh r0, [r4]\n\ -._1113:\n\ - ldr r0, ._1115 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1114 @cond_branch\n\ - ldr r0, ._1115 + 4 @ gLink\n\ - ldr r1, ._1115 + 8 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x4\n\ - str r1, [sp]\n\ - mov r1, #0x1\n\ - mov r2, #0x8\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._1114:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._1116:\n\ - .align 2, 0\n\ -._1115:\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else void sub_80EDDBC() { switch (ewram0_10.var304) @@ -6052,21 +2697,23 @@ void sub_80EDDBC() case 1: PlaySE(SE_SELECT); ShowMapNamePopUpWindow(); - break; + return; case 2: PlaySE(SE_SELECT); ewram0_10.var304++; - break; + return; default: if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); sub_80EBDBC(&sub_80EDEE4); + return; } else if (gMain.newKeys & B_BUTTON) { PlaySE(SE_SELECT); sub_80EBDBC(&sub_80EDE70); + return; } break; } @@ -6083,10 +2730,12 @@ void sub_80EDDBC() if (!sub_8055870()) ewram0_10.var304 = 0; break; - } -} +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 8, 2, 4); #endif +} void sub_80EDE70() { @@ -6111,228 +2760,6 @@ void sub_80EDE70() } -#if DEBUG -__attribute__((naked)) -void sub_80EDEE4() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._1134 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0xa\n\ - bls ._1132 @cond_branch\n\ - b ._1180\n\ -._1132:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._1134 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._1135:\n\ - .align 2, 0\n\ -._1134:\n\ - .word gSharedMem\n\ - .word ._1136\n\ -._1136:\n\ - .word ._1137\n\ - .word ._1138\n\ - .word ._1139\n\ - .word ._1140\n\ - .word ._1141\n\ - .word ._1142\n\ - .word ._1143\n\ - .word ._1144\n\ - .word ._1145\n\ - .word ._1146\n\ - .word ._1147\n\ -._1137:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - b ._1169\n\ -._1138:\n\ - ldr r0, ._1152 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1149 @cond_branch\n\ - b ._1180\n\ -._1149:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl sub_80EED0C\n\ - bl sub_80F3130\n\ - ldr r1, ._1152 + 4 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1166\n\ -._1153:\n\ - .align 2, 0\n\ -._1152:\n\ - .word gPaletteFade\n\ - .word gSharedMem\n\ -._1139:\n\ - bl sub_80F66E0\n\ - bl sub_80EEE08\n\ - ldr r1, ._1155 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._1166\n\ -._1156:\n\ - .align 2, 0\n\ -._1155:\n\ - .word gSharedMem\n\ -._1140:\n\ - bl sub_80F1080\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1180 @cond_branch\n\ - ldr r1, ._1159 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1166\n\ -._1160:\n\ - .align 2, 0\n\ -._1159:\n\ - .word gSharedMem\n\ -._1141:\n\ - mov r0, #0x5\n\ - bl sub_80EEFBC\n\ - bl sub_80F38B8\n\ - ldr r1, ._1163 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._1142:\n\ - bl sub_80F38EC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1180 @cond_branch\n\ - ldr r1, ._1163 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1166\n\ -._1164:\n\ - .align 2, 0\n\ -._1163:\n\ - .word gSharedMem\n\ -._1143:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._1180 @cond_branch\n\ - ldr r1, ._1167 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._1166\n\ -._1168:\n\ - .align 2, 0\n\ -._1167:\n\ - .word gSharedMem\n\ -._1144:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._1170 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ - b ._1169\n\ -._1171:\n\ - .align 2, 0\n\ -._1170:\n\ - .word sub_80EBD18+1\n\ -._1145:\n\ - mov r0, #0x3\n\ - bl sub_80EED2C\n\ - ldr r1, ._1174 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - ldr r0, ._1174 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1180 @cond_branch\n\ - ldr r0, ._1174 + 8 @ 0x6007de0\n\ - ldr r2, ._1174 + 12 @ 0x600f000\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ - b ._1180\n\ -._1175:\n\ - .align 2, 0\n\ -._1174:\n\ - .word gSharedMem\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f000\n\ -._1146:\n\ - ldr r0, ._1178 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1180 @cond_branch\n\ -._1169:\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ -._1166:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._1180\n\ -._1179:\n\ - .align 2, 0\n\ -._1178:\n\ - .word gPaletteFade\n\ -._1147:\n\ - bl sub_80F170C\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1180 @cond_branch\n\ - ldr r0, ._1181 @ sub_80EE06C\n\ - bl sub_80EBDBC\n\ -._1180:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._1182:\n\ - .align 2, 0\n\ -._1181:\n\ - .word sub_80EE06C+1"); -} -#else void sub_80EDEE4() { switch (ewram0_10.var304) @@ -6379,6 +2806,10 @@ void sub_80EDEE4() case 8: sub_80EED2C(0x3); ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4); +#endif break; case 9: if (!gPaletteFade.active) @@ -6390,316 +2821,7 @@ void sub_80EDEE4() break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80EE06C() -{ - asm("\ - push {r4, r5, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._1185 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0x8\n\ - bls ._1183 @cond_branch\n\ - b ._1248\n\ -._1183:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._1185 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._1186:\n\ - .align 2, 0\n\ -._1185:\n\ - .word gSharedMem\n\ - .word ._1187\n\ -._1187:\n\ - .word ._1188\n\ - .word ._1189\n\ - .word ._1190\n\ - .word ._1191\n\ - .word ._1192\n\ - .word ._1193\n\ - .word ._1194\n\ - .word ._1195\n\ - .word ._1196\n\ -._1188:\n\ - bl sub_80F15A8\n\ - ldr r1, ._1198 @ gSharedMem\n\ - mov r5, #0xc1\n\ - lsl r5, r5, #0x2\n\ - add r1, r1, r5\n\ - b ._1221\n\ -._1199:\n\ - .align 2, 0\n\ -._1198:\n\ - .word gSharedMem\n\ -._1189:\n\ - ldr r2, ._1203 @ gMain\n\ - ldrh r1, [r2, #0x30]\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - add r3, r2, #0\n\ - cmp r0, #0\n\ - beq ._1201 @cond_branch\n\ - ldr r1, ._1203 + 4 @ 0x87dc\n\ - add r0, r4, r1\n\ - mov r2, #0x0\n\ - ldsh r0, [r0, r2]\n\ - cmp r0, #0\n\ - beq ._1201 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - bl sub_80F6A4C\n\ - mov r5, #0xc1\n\ - lsl r5, r5, #0x2\n\ - add r1, r4, r5\n\ - b ._1221\n\ -._1204:\n\ - .align 2, 0\n\ -._1203:\n\ - .word gMain\n\ - .word 0x87dc\n\ -._1201:\n\ - ldrh r1, [r3, #0x30]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1206 @cond_branch\n\ - ldr r1, ._1208 @ 0x87dc\n\ - add r0, r4, r1\n\ - ldr r2, ._1208 + 4 @ 0x8774\n\ - add r1, r4, r2\n\ - mov r5, #0x0\n\ - ldsh r2, [r0, r5]\n\ - mov r5, #0x0\n\ - ldsh r0, [r1, r5]\n\ - cmp r2, r0\n\ - bge ._1206 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - mov r0, #0x1\n\ - bl sub_80F6A4C\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r4, r0\n\ - b ._1221\n\ -._1209:\n\ - .align 2, 0\n\ -._1208:\n\ - .word 0x87dc\n\ - .word 0x8774\n\ -._1206:\n\ - ldrh r2, [r3, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r2\n\ - cmp r0, #0\n\ - beq ._1210 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - mov r0, #0xb\n\ - bl sub_80EEFBC\n\ - ldr r0, ._1212 @ gSharedMem\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - b ._1211\n\ -._1213:\n\ - .align 2, 0\n\ -._1212:\n\ - .word gSharedMem\n\ -._1210:\n\ - mov r0, #0x2\n\ - and r0, r0, r2\n\ - cmp r0, #0\n\ - bne ._1214 @cond_branch\n\ - b ._1248\n\ -._1214:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._1217 @ sub_80EE294\n\ - bl sub_80EBDBC\n\ - b ._1248\n\ -._1218:\n\ - .align 2, 0\n\ -._1217:\n\ - .word sub_80EE294+1\n\ -._1190:\n\ - bl sub_80F6AF0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1219 @cond_branch\n\ - b ._1248\n\ -._1219:\n\ - ldr r1, ._1222 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._1221\n\ -._1223:\n\ - .align 2, 0\n\ -._1222:\n\ - .word gSharedMem\n\ -._1191:\n\ - bl sub_8055870\n\ - add r1, r0, #0\n\ - cmp r1, #0\n\ - bne ._1248 @cond_branch\n\ - ldr r0, ._1226 @ gSharedMem\n\ - mov r5, #0xc1\n\ - lsl r5, r5, #0x2\n\ - add r0, r0, r5\n\ - strh r1, [r0]\n\ - b ._1248\n\ -._1227:\n\ - .align 2, 0\n\ -._1226:\n\ - .word gSharedMem\n\ -._1192:\n\ - bl sub_80F3B00\n\ - ldr r1, ._1229 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ -._1221:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._1248\n\ -._1230:\n\ - .align 2, 0\n\ -._1229:\n\ - .word gSharedMem\n\ -._1193:\n\ - bl sub_80F3B58\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1248 @cond_branch\n\ - bl sub_80F1494\n\ - ldr r1, ._1233 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - bl sub_80EED9C\n\ - b ._1248\n\ -._1234:\n\ - .align 2, 0\n\ -._1233:\n\ - .word gSharedMem\n\ -._1194:\n\ - bl sub_80F68E8\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1236 @cond_branch\n\ - cmp r0, #0x1\n\ - bne ._1236 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl sub_80F3B94\n\ - ldr r0, ._1238 @ gSharedMem\n\ - mov r5, #0xc1\n\ - lsl r5, r5, #0x2\n\ - add r0, r0, r5\n\ - mov r1, #0x7\n\ - strh r1, [r0]\n\ - b ._1249\n\ -._1239:\n\ - .align 2, 0\n\ -._1238:\n\ - .word gSharedMem\n\ -._1236:\n\ - ldr r0, ._1242 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1248 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl sub_80F3B94\n\ - ldr r0, ._1242 + 4 @ gSharedMem\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - mov r1, #0x8\n\ - strh r1, [r0]\n\ - b ._1248\n\ -._1243:\n\ - .align 2, 0\n\ -._1242:\n\ - .word gMain\n\ - .word gSharedMem\n\ -._1195:\n\ - bl sub_80F3BD4\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1248 @cond_branch\n\ - ldr r0, ._1246 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r0, r2\n\ -._1211:\n\ - mov r1, #0x4\n\ - strh r1, [r0]\n\ - b ._1248\n\ -._1247:\n\ - .align 2, 0\n\ -._1246:\n\ - .word gSharedMem\n\ -._1196:\n\ - bl sub_80F3BD4\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - cmp r4, #0\n\ - bne ._1248 @cond_branch\n\ - mov r0, #0x5\n\ - bl sub_80EEFBC\n\ - ldr r0, ._1250 @ gSharedMem\n\ - mov r5, #0xc1\n\ - lsl r5, r5, #0x2\n\ - add r0, r0, r5\n\ - strh r4, [r0]\n\ -._1248:\n\ - ldr r0, ._1250 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1249 @cond_branch\n\ - ldr r0, ._1250 + 8 @ gLink\n\ - ldr r1, ._1250 + 12 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x4\n\ - str r1, [sp]\n\ - mov r1, #0x1\n\ - mov r2, #0x4\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._1249:\n\ - add sp, sp, #0x4\n\ - pop {r4, r5}\n\ - pop {r0}\n\ - bx r0\n\ -._1251:\n\ - .align 2, 0\n\ -._1250:\n\ - .word gSharedMem\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else void sub_80EE06C() { switch (ewram0_10.var304) @@ -6755,571 +2877,96 @@ void sub_80EE06C() break; case 6: switch (sub_80F68E8()) - { - case 1: - PlaySE(SE_SELECT); - sub_80F3B94(); - ewram0_10.var304 = 0x7; - break; - default: - case 0: - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_80F3B94(); - ewram0_10.var304 = 0x8; - } - break; - } - break; - case 7: - if (!sub_80F3BD4()) - ewram0_10.var304 = 0x4; - break; - case 8: - if (!sub_80F3BD4()) - { - sub_80EEFBC(0x5); - ewram0_10.var304 = 0; - } - break; - } -} -#endif - -#if DEBUG -__attribute__((naked)) -void sub_80EE294() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._1254 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - ldrh r0, [r0]\n\ - add r4, r1, #0\n\ - cmp r0, #0x8\n\ - bls ._1252 @cond_branch\n\ - b ._1288\n\ -._1252:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._1254 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._1255:\n\ - .align 2, 0\n\ -._1254:\n\ - .word gSharedMem\n\ - .word ._1256\n\ -._1256:\n\ - .word ._1257\n\ - .word ._1258\n\ - .word ._1259\n\ - .word ._1260\n\ - .word ._1261\n\ - .word ._1262\n\ - .word ._1263\n\ - .word ._1264\n\ - .word ._1265\n\ -._1257:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r3, #0x10\n\ - b ._1266\n\ -._1258:\n\ - ldr r0, ._1270 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1267 @cond_branch\n\ - b ._1288\n\ -._1267:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl sub_80EED0C\n\ - bl sub_80F3C2C\n\ - bl sub_80EEE08\n\ - ldr r1, ._1270 + 4 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1280\n\ -._1271:\n\ - .align 2, 0\n\ -._1270:\n\ - .word gPaletteFade\n\ - .word gSharedMem\n\ -._1259:\n\ - bl sub_80F6134\n\ - mov r0, #0x1\n\ - bl sub_80F0264\n\ - ldr r1, ._1274 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._1260:\n\ - bl sub_80F02A0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1288 @cond_branch\n\ - ldr r1, ._1274 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1280\n\ -._1275:\n\ - .align 2, 0\n\ -._1274:\n\ - .word gSharedMem\n\ -._1261:\n\ - mov r0, #0x4\n\ - bl sub_80EEFBC\n\ - mov r0, #0x1\n\ - bl sub_80F3008\n\ - ldr r0, ._1277 @ sub_80EBD18\n\ - bl SetVBlankCallback\n\ - ldr r1, ._1277 + 4 @ gSharedMem\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r1, r2\n\ - b ._1280\n\ -._1278:\n\ - .align 2, 0\n\ -._1277:\n\ - .word sub_80EBD18+1\n\ - .word gSharedMem\n\ -._1262:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._1288 @cond_branch\n\ - ldr r1, ._1281 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1280\n\ -._1282:\n\ - .align 2, 0\n\ -._1281:\n\ - .word gSharedMem\n\ -._1263:\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ -._1266:\n\ - bl BeginNormalPaletteFade\n\ - mov r2, #0xc1\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ -._1280:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._1288\n\ -._1264:\n\ - mov r0, #0x4\n\ - bl sub_80EED2C\n\ - ldr r1, ._1286 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - ldr r0, ._1286 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1288 @cond_branch\n\ - ldr r0, ._1286 + 8 @ 0x6007de0\n\ - ldr r2, ._1286 + 12 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ - b ._1288\n\ -._1287:\n\ - .align 2, 0\n\ -._1286:\n\ - .word gSharedMem\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800\n\ -._1265:\n\ - ldr r0, ._1289 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1288 @cond_branch\n\ - ldr r0, ._1289 + 4 @ sub_80EDDBC\n\ - bl sub_80EBDBC\n\ -._1288:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._1290:\n\ - .align 2, 0\n\ -._1289:\n\ - .word gPaletteFade\n\ - .word sub_80EDDBC+1"); -} -#else -void sub_80EE294() -{ - switch (ewram0_10.var304) - { - case 0: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); - ewram0_10.var304++; - break; - case 1: - if (!gPaletteFade.active) - { - SetVBlankCallback(NULL); - sub_80EED0C(); - sub_80F3C2C(); - sub_80EEE08(); - ewram0_10.var304++; - } - break; - case 2: - sub_80F6134(); - sub_80F0264(0x1); - ewram0_10.var304++; - case 3: - if (!sub_80F02A0()) - ewram0_10.var304++; - break; - case 4: - sub_80EEFBC(0x4); - sub_80F3008(0x1); - SetVBlankCallback(&sub_80EBD18); - ewram0_10.var304++; - break; - case 5: - if (!sub_8055870()) - ewram0_10.var304++; - break; - case 6: - BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); - ewram0_10.var304++; - break; - case 7: - sub_80EED2C(0x4); - ewram0_10.var304++; - break; - case 8: - if (!gPaletteFade.active) - sub_80EBDBC(&sub_80EDDBC); - break; - } -} -#endif - -#if DEBUG -__attribute__((naked)) -void sub_80EE3D8() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._1293 @ gSharedMem\n\ - mov r1, #0xc1\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - ldrh r0, [r0]\n\ - cmp r0, #0xd\n\ - bls ._1291 @cond_branch\n\ - b ._1354\n\ -._1291:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._1293 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._1294:\n\ - .align 2, 0\n\ -._1293:\n\ - .word gSharedMem\n\ - .word ._1295\n\ -._1295:\n\ - .word ._1296\n\ - .word ._1297\n\ - .word ._1298\n\ - .word ._1299\n\ - .word ._1300\n\ - .word ._1301\n\ - .word ._1302\n\ - .word ._1303\n\ - .word ._1304\n\ - .word ._1305\n\ - .word ._1306\n\ - .word ._1307\n\ - .word ._1308\n\ - .word ._1309\n\ -._1296:\n\ - bl sub_80F1E84\n\ - mov r0, #0x0\n\ - bl sub_80F2D04\n\ - ldr r1, ._1311 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1344\n\ -._1312:\n\ - .align 2, 0\n\ -._1311:\n\ - .word gSharedMem\n\ -._1297:\n\ - bl sub_80F1F10\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1313 @cond_branch\n\ - b ._1354\n\ -._1313:\n\ - mov r0, #0x9\n\ - bl sub_80EEFBC\n\ - ldr r1, ._1316 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1344\n\ -._1317:\n\ - .align 2, 0\n\ -._1316:\n\ - .word gSharedMem\n\ -._1298:\n\ - bl sub_80EEF34\n\ - lsl r0, r0, #0x18\n\ - lsr r2, r0, #0x18\n\ - cmp r2, #0\n\ - beq ._1318 @cond_branch\n\ - b ._1354\n\ -._1318:\n\ - ldr r4, ._1321 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - str r2, [sp]\n\ - mov r2, #0x0\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - b ._1320\n\ -._1322:\n\ - .align 2, 0\n\ -._1321:\n\ - .word gSharedMem\n\ -._1299:\n\ - ldr r0, ._1326 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1323 @cond_branch\n\ - b ._1354\n\ -._1323:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl sub_80EED0C\n\ - bl sub_80EF814\n\ - bl sub_80EEE08\n\ - ldr r1, ._1326 + 4 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1344\n\ -._1327:\n\ - .align 2, 0\n\ -._1326:\n\ - .word gPaletteFade\n\ - .word gSharedMem\n\ -._1300:\n\ - bl sub_80F2620\n\ - ldr r1, ._1329 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1344\n\ -._1330:\n\ - .align 2, 0\n\ -._1329:\n\ - .word gSharedMem\n\ -._1301:\n\ - mov r0, #0x2\n\ - bl sub_80F0264\n\ - ldr r1, ._1334 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._1302:\n\ - bl sub_80F02A0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._1331 @cond_branch\n\ - b ._1354\n\ -._1331:\n\ - ldr r1, ._1334 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1344\n\ -._1335:\n\ - .align 2, 0\n\ -._1334:\n\ - .word gSharedMem\n\ -._1303:\n\ - mov r0, #0x3\n\ - bl sub_80F2C80\n\ - ldr r1, ._1338 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ -._1304:\n\ - mov r0, #0x3\n\ - bl sub_80F2CBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1354 @cond_branch\n\ - ldr r1, ._1338 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1344\n\ -._1339:\n\ - .align 2, 0\n\ -._1338:\n\ - .word gSharedMem\n\ -._1305:\n\ - mov r0, #0x2\n\ - bl sub_80F3008\n\ - ldr r1, ._1341 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1344\n\ -._1342:\n\ - .align 2, 0\n\ -._1341:\n\ - .word gSharedMem\n\ -._1306:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._1354 @cond_branch\n\ - ldr r1, ._1345 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - b ._1344\n\ -._1346:\n\ - .align 2, 0\n\ -._1345:\n\ - .word gSharedMem\n\ -._1307:\n\ - bl sub_80F6F10\n\ - ldr r4, ._1348 @ gSharedMem\n\ - mov r1, #0xc2\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - mov r2, #0x0\n\ - str r2, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, ._1348 + 4 @ sub_80EBD68\n\ - bl SetVBlankCallback\n\ -._1320:\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r4, r0\n\ -._1344:\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - b ._1354\n\ -._1349:\n\ - .align 2, 0\n\ -._1348:\n\ - .word gSharedMem\n\ - .word sub_80EBD68+1\n\ -._1308:\n\ - mov r0, #0x5\n\ - bl sub_80EED2C\n\ - ldr r1, ._1352 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - ldrh r0, [r1]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1]\n\ - ldr r0, ._1352 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1354 @cond_branch\n\ - ldr r0, ._1352 + 8 @ 0x6007de0\n\ - ldr r2, ._1352 + 12 @ 0x600f800\n\ - mov r1, #0x0\n\ - mov r3, #0x4\n\ - bl debug_sub_8008218\n\ - b ._1354\n\ -._1353:\n\ - .align 2, 0\n\ -._1352:\n\ - .word gSharedMem\n\ - .word gLinkOpen\n\ - .word 0x6007de0\n\ - .word 0x600f800\n\ -._1309:\n\ - ldr r0, ._1355 @ gPaletteFade\n\ - ldrb r1, [r0, #0x7]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1354 @cond_branch\n\ - ldr r0, ._1355 + 4 @ sub_80EE58C\n\ - bl sub_80EBDBC\n\ -._1354:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._1356:\n\ - .align 2, 0\n\ -._1355:\n\ - .word gPaletteFade\n\ - .word sub_80EE58C+1"); + { + case 1: + PlaySE(SE_SELECT); + sub_80F3B94(); + ewram0_10.var304 = 0x7; + return; + default: + case 0: + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80F3B94(); + ewram0_10.var304 = 0x8; + } + break; + } + break; + case 7: + if (!sub_80F3BD4()) + ewram0_10.var304 = 0x4; + break; + case 8: + if (!sub_80F3BD4()) + { + sub_80EEFBC(0x5); + ewram0_10.var304 = 0; + } + break; + } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 4, 2, 4); +#endif } -#else + +void sub_80EE294() +{ + switch (ewram0_10.var304) + { + case 0: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0); + ewram0_10.var304++; + break; + case 1: + if (!gPaletteFade.active) + { + SetVBlankCallback(NULL); + sub_80EED0C(); + sub_80F3C2C(); + sub_80EEE08(); + ewram0_10.var304++; + } + break; + case 2: + sub_80F6134(); + sub_80F0264(0x1); + ewram0_10.var304++; + case 3: + if (!sub_80F02A0()) + ewram0_10.var304++; + break; + case 4: + sub_80EEFBC(0x4); + sub_80F3008(0x1); + SetVBlankCallback(&sub_80EBD18); + ewram0_10.var304++; + break; + case 5: + if (!sub_8055870()) + ewram0_10.var304++; + break; + case 6: + BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0); + ewram0_10.var304++; + break; + case 7: + sub_80EED2C(0x4); + ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif + break; + case 8: + if (!gPaletteFade.active) + sub_80EBDBC(&sub_80EDDBC); + break; + } +} + void sub_80EE3D8() { switch (ewram0_10.var304) @@ -7388,6 +3035,10 @@ void sub_80EE3D8() case 12: sub_80EED2C(0x5); ewram0_10.var304++; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4); +#endif break; case 13: if (!gPaletteFade.active) @@ -7395,143 +3046,7 @@ void sub_80EE3D8() break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_80EE58C() -{ - asm("\ - push {r4, r5, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r5, ._1361 @ gSharedMem\n\ - mov r0, #0xc1\n\ - lsl r0, r0, #0x2\n\ - add r4, r5, r0\n\ - ldrh r0, [r4]\n\ - cmp r0, #0x1\n\ - beq ._1357 @cond_branch\n\ - cmp r0, #0x1\n\ - bgt ._1358 @cond_branch\n\ - cmp r0, #0\n\ - beq ._1359 @cond_branch\n\ - b ._1383\n\ -._1362:\n\ - .align 2, 0\n\ -._1361:\n\ - .word gSharedMem\n\ -._1358:\n\ - cmp r0, #0x2\n\ - beq ._1363 @cond_branch\n\ - b ._1383\n\ -._1359:\n\ - bl sub_80F5DD4\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - beq ._1365 @cond_branch\n\ - cmp r0, #0x2\n\ - beq ._1366 @cond_branch\n\ - ldr r0, ._1369 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1367 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._1369 + 4 @ sub_80EE658\n\ - bl sub_80EBDBC\n\ - b ._1384\n\ -._1370:\n\ - .align 2, 0\n\ -._1369:\n\ - .word gMain\n\ - .word sub_80EE658+1\n\ -._1365:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r1, ._1372 @ 0x876e\n\ - add r0, r5, r1\n\ - ldrb r0, [r0]\n\ - bl sub_80F0FFC\n\ - b ._1384\n\ -._1373:\n\ - .align 2, 0\n\ -._1372:\n\ - .word 0x876e\n\ -._1366:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4]\n\ - b ._1384\n\ -._1367:\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1383 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._1377 @ sub_80EE8F4\n\ - bl sub_80EBDBC\n\ - b ._1384\n\ -._1378:\n\ - .align 2, 0\n\ -._1377:\n\ - .word sub_80EE8F4+1\n\ -._1357:\n\ - bl sub_80F0718\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._1383 @cond_branch\n\ - ldr r1, ._1381 @ 0x876e\n\ - add r0, r5, r1\n\ - ldrb r0, [r0]\n\ - bl sub_80F0FFC\n\ - bl sub_80F3264\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - b ._1380\n\ -._1382:\n\ - .align 2, 0\n\ -._1381:\n\ - .word 0x876e\n\ -._1363:\n\ - bl sub_8055870\n\ - cmp r0, #0\n\ - bne ._1383 @cond_branch\n\ -._1380:\n\ - strh r0, [r4]\n\ -._1383:\n\ - ldr r0, ._1385 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1384 @cond_branch\n\ - ldr r0, ._1385 + 4 @ gLink\n\ - ldr r1, ._1385 + 8 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x4\n\ - str r1, [sp]\n\ - mov r1, #0x1\n\ - mov r2, #0x3\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._1384:\n\ - add sp, sp, #0x4\n\ - pop {r4, r5}\n\ - pop {r0}\n\ - bx r0\n\ -._1386:\n\ - .align 2, 0\n\ -._1385:\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else void sub_80EE58C() { switch (ewram0_10.var304) @@ -7542,21 +3057,23 @@ void sub_80EE58C() case 1: PlaySE(SE_SELECT); sub_80F0FFC(ewram0_10.var876E); - break; + return; case 2: PlaySE(SE_SELECT); ewram0_10.var304++; - break; + return; default: if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); sub_80EBDBC(&sub_80EE658); + return; } else if (gMain.newKeys & B_BUTTON) { PlaySE(SE_SELECT); sub_80EBDBC(&sub_80EE8F4); + return; } break; } @@ -7574,8 +3091,11 @@ void sub_80EE58C() ewram0_10.var304 = 0; break; } -} +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 3, 2, 4); #endif +} void sub_80EE658() { @@ -8006,108 +3526,6 @@ _080EEC0A:\n\ #endif // var6dad and var6dae must be s8 in this func -#if DEBUG -__attribute__((naked)) -bool8 sub_80EEC10() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._1563 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1559 @cond_branch\n\ - ldr r1, ._1563 + 4 @ gSharedMem\n\ - add r3, r1, #1\n\ - add r2, r1, #5\n\ -._1561:\n\ - ldrb r0, [r1]\n\ - sub r0, r0, #0x1\n\ - strb r0, [r1]\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bge ._1560 @cond_branch\n\ - ldrb r0, [r3]\n\ - sub r0, r0, #0x1\n\ - strb r0, [r1]\n\ -._1560:\n\ - mov r0, #0x0\n\ - ldsb r0, [r1, r0]\n\ - add r0, r0, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._1561 @cond_branch\n\ - mov r0, #0x1\n\ - b ._1568\n\ -._1564:\n\ - .align 2, 0\n\ -._1563:\n\ - .word gMain\n\ - .word gSharedMem+0x6dad\n\ -._1559:\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1565 @cond_branch\n\ - ldr r1, ._1569 @ gSharedMem\n\ - mov r4, #0x0\n\ - mov r2, #0x1\n\ - ldsb r2, [r1, r2]\n\ - add r3, r1, #5\n\ -._1567:\n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - lsl r0, r0, #0x18\n\ - asr r0, r0, #0x18\n\ - cmp r0, r2\n\ - blt ._1566 @cond_branch\n\ - strb r4, [r1]\n\ -._1566:\n\ - mov r0, #0x0\n\ - ldsb r0, [r1, r0]\n\ - add r0, r0, r3\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._1567 @cond_branch\n\ - mov r0, #0x1\n\ - b ._1568\n\ -._1570:\n\ - .align 2, 0\n\ -._1569:\n\ - .word gSharedMem+0x6dad\n\ -._1565:\n\ - ldr r0, ._1572 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1571 @cond_branch\n\ - ldr r0, ._1572 + 4 @ gLink\n\ - ldr r1, ._1572 + 8 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x4\n\ - str r1, [sp]\n\ - mov r1, #0x6\n\ - mov r2, #0xa\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._1571:\n\ - mov r0, #0x0\n\ -._1568:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ -._1573:\n\ - .align 2, 0\n\ -._1572:\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else bool8 sub_80EEC10() { if (gMain.newKeys & 0x40) @@ -8128,106 +3546,13 @@ bool8 sub_80EEC10() } while (!ewram0_10.var6db2[ewram0_11.var6dad]); return TRUE; } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 6, 10, 2, 4); +#endif return FALSE; } -#endif -#if DEBUG -__attribute__((naked)) -bool8 sub_80EEC90() -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._1577 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - lsl r0, r0, #0x10\n\ - lsr r3, r0, #0x10\n\ - cmp r3, #0\n\ - beq ._1574 @cond_branch\n\ - ldr r2, ._1577 + 4 @ gSharedMem\n\ - ldr r0, ._1577 + 8 @ 0x6dad\n\ - add r1, r2, r0\n\ - ldrb r0, [r1]\n\ - sub r0, r0, #0x1\n\ - strb r0, [r1]\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bge ._1580 @cond_branch\n\ - ldr r3, ._1577 + 12 @ 0x6dae\n\ - add r0, r2, r3\n\ - ldrb r0, [r0]\n\ - sub r0, r0, #0x1\n\ - strb r0, [r1]\n\ - b ._1580\n\ -._1578:\n\ - .align 2, 0\n\ -._1577:\n\ - .word gMain\n\ - .word gSharedMem\n\ - .word 0x6dad\n\ - .word 0x6dae\n\ -._1574:\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1579 @cond_branch\n\ - ldr r0, ._1582 @ gSharedMem\n\ - ldr r4, ._1582 + 4 @ 0x6dad\n\ - add r2, r0, r4\n\ - ldrb r1, [r2]\n\ - add r1, r1, #0x1\n\ - strb r1, [r2]\n\ - add r4, r4, #0x1\n\ - add r0, r0, r4\n\ - lsl r1, r1, #0x18\n\ - asr r1, r1, #0x18\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x18\n\ - asr r0, r0, #0x18\n\ - cmp r1, r0\n\ - blt ._1580 @cond_branch\n\ - strb r3, [r2]\n\ -._1580:\n\ - mov r0, #0x1\n\ - b ._1581\n\ -._1583:\n\ - .align 2, 0\n\ -._1582:\n\ - .word gSharedMem\n\ - .word 0x6dad\n\ -._1579:\n\ - ldr r0, ._1585 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1584 @cond_branch\n\ - ldr r0, ._1585 + 4 @ gLink\n\ - ldr r1, ._1585 + 8 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x4\n\ - str r1, [sp]\n\ - mov r1, #0x6\n\ - mov r2, #0xa\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._1584:\n\ - mov r0, #0x0\n\ -._1581:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ -._1586:\n\ - .align 2, 0\n\ -._1585:\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else bool8 sub_80EEC90() { if (gMain.newKeys & 0x40) @@ -8242,9 +3567,12 @@ bool8 sub_80EEC90() ewram0_11.var6dad = 0; return TRUE; } +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 6, 10, 2, 4); +#endif return FALSE; } -#endif void sub_80EED0C() { -- cgit v1.2.3 From 5911f59a7dc71c92ea52ff62fcb18e4a8ffa8e69 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Mon, 29 Jan 2018 20:15:27 -0800 Subject: More rock.s decompilation --- src/battle/anim/rock.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) (limited to 'src') diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c index d4307e7c1..26ac78053 100644 --- a/src/battle/anim/rock.c +++ b/src/battle/anim/rock.c @@ -17,6 +17,8 @@ extern const u8 gBattleAnimBackgroundTilemap_SandstormBrew[]; extern const u8 gBattleAnimBackgroundImage_SandstormBrew[]; extern const u16 gBattleAnimSpritePalette_261[]; +extern const struct SubspriteTable gUnknown_083DAD10; + static void sub_80DCF1C(struct Sprite *sprite); static void sub_80DD02C(struct Sprite *sprite); void sub_80DD190(u8 taskId); @@ -147,3 +149,127 @@ void do_boulder_dust(u8 taskId) gTasks[taskId].data[0] = var0; gTasks[taskId].func = sub_80DD190; } + +void sub_80DD190(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + + if (gTasks[taskId].data[0] == 0) + gBattle_BG1_X += 0xFFFA; + else + gBattle_BG1_X += 6; + + gBattle_BG1_Y += -1; + + switch (gTasks[taskId].data[12]) + { + case 0: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11]++; + REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8); + if (gTasks[taskId].data[11] == 7) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 1: + if (++gTasks[taskId].data[11] == 101) + { + gTasks[taskId].data[11] = 7; + gTasks[taskId].data[12]++; + } + break; + case 2: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11]--; + REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8); + if (gTasks[taskId].data[11] == 0) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 3: + sub_8078914(&subStruct); + DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000); + DmaClear32(3, subStruct.field_4, 0x800); + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + gTasks[taskId].data[12]++; + // fall through + case 4: + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BG1CNT_BITFIELD.priority = 1; + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80DD3AC(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (gBattleAnimArgs[3] != 0 && GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + { + sprite->pos1.x = 304; + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + sprite->data[5] = 1; + sprite->oam.matrixNum = 8; + } + else + { + sprite->pos1.x = -64; + } + + sprite->pos1.y = gBattleAnimArgs[0]; + SetSubspriteTables(sprite, &gUnknown_083DAD10); + sprite->data[1] = gBattleAnimArgs[1]; + sprite->data[2] = gBattleAnimArgs[2]; + sprite->data[0]++; + } + else + { + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + sprite->pos2.x += (sprite->data[3] >> 8); + sprite->pos2.y += (sprite->data[4] >> 8); + sprite->data[3] &= 0xFF; + sprite->data[4] &= 0xFF; + + if (sprite->data[5] == 0) + { + if (sprite->pos1.x + sprite->pos2.x > 272) + { + sprite->callback = DestroyAnimSprite; + } + } + else if (sprite->pos1.x + sprite->pos2.x < -32) + { + sprite->callback = DestroyAnimSprite; + } + } +} + +void sub_80DD490(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[4]); + sub_80787B0(sprite, 0); + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[2] = sprite->pos1.x; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2]; + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} -- cgit v1.2.3 From 3ed97d94be70bee91b581517311c01cf20c917de Mon Sep 17 00:00:00 2001 From: yenatch Date: Mon, 29 Jan 2018 23:51:07 -0500 Subject: more battle_1 functions --- src/rom_800D42C.c | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 235 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c index 54886c1f9..243945360 100644 --- a/src/rom_800D42C.c +++ b/src/rom_800D42C.c @@ -4,9 +4,12 @@ #include "decompress.h" #include "ewram.h" #include "link.h" +#include "main.h" #include "palette.h" #include "task.h" #include "text.h" +#include "text_window.h" +#include "trainer.h" #include "trig.h" #include "sound.h" @@ -20,6 +23,11 @@ extern u8 BattleText_Win[]; extern u8 BattleText_Loss[]; extern u8 BattleText_Tie[]; +extern void sub_8032A38(void); + +#define GetCurrentMapBattleScene sav1_map_get_battletype +//extern u8 GetCurrentMapBattleScene(void); + extern const u8 gGameVersion; extern u8 gUnknown_08D00000[]; extern u16 gUnknown_08D00524[]; @@ -28,7 +36,15 @@ extern u16 gBattleTypeFlags; extern struct Trainer gTrainers[]; extern u16 gTrainerBattleOpponent; -extern void *gBattleTerrainTable[][5]; +struct BattleBackground { + void *tileset; + void *tilemap; + void *entryTiles; + void *entryTilemap; + void *palette; +}; +extern struct BattleBackground gBattleTerrainTable[]; + extern u8 gBattleTerrain; extern u8 gBattleTerrainTiles_Cave[]; @@ -87,11 +103,224 @@ extern void sub_800DAF8(u8, u8, u8 *); extern struct SpriteTemplate gSpriteTemplate_81F9574; extern struct SpriteTemplate gSpriteTemplate_81F958C; +extern struct SpriteTemplate gSpriteTemplate_81F96D0; extern u16 gBattle_BG1_X; extern u16 gBattle_BG2_X; +void sub_800D6C4(void); + + +void unref_sub_800D684(void) +{ + u8 spriteId; + ResetSpriteData(); + spriteId = CreateSprite(&gSpriteTemplate_81F96D0, 0, 0, 0); + gSprites[spriteId].invisible = TRUE; + SetMainCallback2(sub_800D6C4); +} + +void sub_800D6C4(void) +{ + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_800D6D4(void) +{ + u16 ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT = DISPSTAT_VBLANK_INTR; + REG_BG0CNT = 0x9800; + REG_BG1CNT = 0x9c04; + REG_BG2CNT = 0x5e05; + REG_BG3CNT = 0x5a0b; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_DISPCNT = 0xbf40; +} + +// ApplyPlayerChosenFrameToBattleMenu +void sub_800D74C(void) +{ + TextWindow_SetBaseTileNum(0x12); + TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1); + TextWindow_SetBaseTileNum(0x22); + TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1); + gPlttBufferUnfaded[92] = 0x7fe0; + gPlttBufferUnfaded[93] = 0x2529; + gPlttBufferUnfaded[94] = 0x7fff; + gPlttBufferUnfaded[95] = 0x675a; + CpuSet(&gPlttBufferUnfaded[92], &gPlttBufferFaded[92], 4); + sub_8032A38(); +} + +void DrawMainBattleBackground(void) +{ + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER /*| BATTLE_TYPE_x2000000*/)) + { + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + } + else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) + { + if (gGameVersion == VERSION_RUBY) + { + LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); + } + else + { + LZDecompressVram(gBattleTerrainTiles_Water, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); + } + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u8 trainerClass = gTrainers[gTrainerBattleOpponent].trainerClass; + if (trainerClass == TRAINER_CLASS_LEADER) + { + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); + return; + } + else if (trainerClass == TRAINER_CLASS_CHAMPION) + { + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); + return; + } + } + + switch (GetCurrentMapBattleScene()) + { + case MAP_BATTLE_SCENE_NORMAL: + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_GYM: + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_MAGMA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_AQUA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_SIDNEY: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_PHOEBE: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_GLACIA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_DRAKE: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_BATTLE_TOWER: + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + break; + } + } +} + + + +void sub_800DAB8(void) +{ + LZDecompressVram(gUnknown_08D00000, (void *)0x6000000); + CpuSet(gUnknown_08D00524, (void *)0x600c000, 0x800); + LoadCompressedPalette(gUnknown_08D004E0, 0, 0x40); + sub_800D74C(); + DrawMainBattleBackground(); +} + +void sub_800DAF8(u8 taskId, u8 windowId, u8 *dest) +{ + int i; + u16 r4 = 0; + u16 src[6]; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { + if (gTasks[taskId].data[5]) { + switch (windowId) { + case 0: + r4 = gTasks[taskId].data[3] & 0x3f; + break; + case 1: + r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; + break; + case 2: + r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; + break; + case 3: + r4 = gTasks[taskId].data[4] & 0x3f; + break; + } + } else { + switch (windowId) { + case 0: + r4 = gTasks[taskId].data[3] & 0x3f; + break; + case 1: + r4 = gTasks[taskId].data[4] & 0x3f; + break; + case 2: + r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; + break; + case 3: + r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; + break; + } + } + for (i = 0; i < 3; i++) { + src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; + } + CpuSet(src, dest, 3); + } else { + if (windowId == gBattleStruct->linkPlayerIndex) { + r4 = gTasks[taskId].data[3]; + } else { + r4 = gTasks[taskId].data[4]; + } + for (i = 0; i < 6; i++) { + src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; + } + CpuSet(src, dest, 6); + } +} + + #if ENGLISH #define LEFT_MESSAGE_X 6 #define RIGHT_MESSAGE_X 21 @@ -337,8 +566,8 @@ void sub_800E23C(void) { } } if (sav1_map_get_battletype() == 0) { - LZDecompressVram(gBattleTerrainTable[gBattleTerrain][2], (void *)0x6004000); - LZDecompressVram(gBattleTerrainTable[gBattleTerrain][3], (void *)0x600e000); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTiles, (void *)0x6004000); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void *)0x600e000); return; } LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); @@ -379,7 +608,7 @@ int sub_800E414(u8 type) { } switch (sav1_map_get_battletype()) { case 0: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain][0], (void *)0x6008000); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void *)0x6008000); break; case 2: LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); @@ -432,7 +661,7 @@ int sub_800E414(u8 type) { } switch (sav1_map_get_battletype()) { case 0: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain][1], (void *)0x600d000); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void *)0x600d000); break; case 2: LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); @@ -485,7 +714,7 @@ int sub_800E414(u8 type) { } switch (sav1_map_get_battletype()) { case 0: - LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain][4], 0x20, 0x60); + LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); break; case 1: LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); -- cgit v1.2.3 From 7921805f0a096b9651588f731e4c0124e04f307d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 08:28:44 -0500 Subject: sub_80D0D68 --- src/battle/anim/draw.c | 116 +------------------------------------------------ 1 file changed, 1 insertion(+), 115 deletions(-) (limited to 'src') diff --git a/src/battle/anim/draw.c b/src/battle/anim/draw.c index f9e505bf2..be3a280af 100644 --- a/src/battle/anim/draw.c +++ b/src/battle/anim/draw.c @@ -59,7 +59,6 @@ void sub_80D0C88(u8 taskId) task->func = sub_80D0D68; } -#ifdef NONMATCHING void sub_80D0D68(u8 taskId) { struct Task* task = &gTasks[taskId]; @@ -99,126 +98,13 @@ void sub_80D0D68(u8 taskId) if (++task->data[3] >= task->data[15]) { - gScanlineEffect.unk15 = 3; + gScanlineEffect.state = 3; DestroyAnimVisualTask(taskId); } } break; } } -#else -__attribute__((naked)) -void sub_80D0D68(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - ldr r1, _080D0D88 @ =gTasks\n\ - adds r3, r0, r1\n\ - movs r1, 0x10\n\ - ldrsh r0, [r3, r1]\n\ - cmp r0, 0\n\ - beq _080D0D8C\n\ - cmp r0, 0x1\n\ - beq _080D0DA2\n\ - b _080D0E22\n\ - .align 2, 0\n\ -_080D0D88: .4byte gTasks\n\ -_080D0D8C:\n\ - ldrh r0, [r3, 0x12]\n\ - adds r0, 0x1\n\ - strh r0, [r3, 0x12]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x14\n\ - ble _080D0E22\n\ - ldrh r0, [r3, 0x10]\n\ - adds r0, 0x1\n\ - strh r0, [r3, 0x10]\n\ - b _080D0E22\n\ -_080D0DA2:\n\ - ldrh r0, [r3, 0xA]\n\ - adds r0, 0x1\n\ - strh r0, [r3, 0xA]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x3\n\ - ble _080D0E22\n\ - movs r0, 0\n\ - strh r0, [r3, 0xA]\n\ - ldrh r1, [r3, 0xE]\n\ - movs r0, 0x3\n\ - ands r0, r1\n\ - strh r0, [r3, 0xC]\n\ - ldrh r0, [r3, 0x8]\n\ - subs r0, r1\n\ - strh r0, [r3, 0x12]\n\ - movs r2, 0xC\n\ - ldrsh r1, [r3, r2]\n\ - cmp r1, 0x1\n\ - beq _080D0DD8\n\ - cmp r1, 0x1\n\ - ble _080D0DE0\n\ - cmp r1, 0x2\n\ - beq _080D0DDC\n\ - cmp r1, 0x3\n\ - beq _080D0DDC\n\ - b _080D0DE0\n\ -_080D0DD8:\n\ - subs r0, 0x2\n\ - b _080D0DDE\n\ -_080D0DDC:\n\ - adds r0, 0x1\n\ -_080D0DDE:\n\ - strh r0, [r3, 0x12]\n\ -_080D0DE0:\n\ - movs r1, 0x12\n\ - ldrsh r0, [r3, r1]\n\ - cmp r0, 0\n\ - blt _080D0E04\n\ - ldr r2, _080D0E28 @ =gScanlineEffectRegBuffers\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r1, [r3, 0x14]\n\ - strh r1, [r0]\n\ - movs r1, 0x12\n\ - ldrsh r0, [r3, r1]\n\ - lsls r0, 1\n\ - movs r1, 0xF0\n\ - lsls r1, 3\n\ - adds r2, r1\n\ - adds r0, r2\n\ - ldrh r1, [r3, 0x14]\n\ - strh r1, [r0]\n\ -_080D0E04:\n\ - ldrh r0, [r3, 0xE]\n\ - adds r0, 0x1\n\ - strh r0, [r3, 0xE]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - movs r2, 0x26\n\ - ldrsh r1, [r3, r2]\n\ - cmp r0, r1\n\ - blt _080D0E22\n\ - ldr r1, _080D0E2C @ =gScanlineEffect\n\ - movs r0, 0x3\n\ - strb r0, [r1, 0x15]\n\ - adds r0, r4, 0\n\ - bl DestroyAnimVisualTask\n\ -_080D0E22:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080D0E28: .4byte gScanlineEffectRegBuffers\n\ -_080D0E2C: .4byte gScanlineEffect\n\ -.syntax divided\n"); -} -#endif void sub_80D0E30(struct Sprite* sprite) { -- cgit v1.2.3 From 6325909a74b7f6fa201f6b7d9c9e2cec1ec6aa2e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 08:44:46 -0500 Subject: sub_80D59B0 --- src/battle/anim/heated_rock.c | 92 ++++--------------------------------------- 1 file changed, 8 insertions(+), 84 deletions(-) (limited to 'src') diff --git a/src/battle/anim/heated_rock.c b/src/battle/anim/heated_rock.c index 51cfbd007..055960f40 100644 --- a/src/battle/anim/heated_rock.c +++ b/src/battle/anim/heated_rock.c @@ -50,101 +50,25 @@ void sub_80D5994(struct Sprite *sprite, s16 x, s16 y) sprite->data[5] = y * 8; } -#ifdef NONMATCHING void sub_80D59B0(struct Sprite *sprite) { int var1; - int var2; - if (++sprite->data[0] > 2) { sprite->data[0] = 0; ++sprite->data[1]; - sprite->data[3] += ((u16)sprite->data[1] * (u16)sprite->data[1]); + var1 = (u16)sprite->data[1] * (u16)sprite->data[1]; + sprite->data[3] += var1; } - var1 = (u16)sprite->data[4] + (u16)sprite->data[2]; - sprite->data[2] = var1; - var1 = (s16)var1 >> 3; - sprite->pos1.x = var1; - - var2 = (u16)sprite->data[5] + (u16)sprite->data[3]; - sprite->data[3] = var2; - var2 = (s16)var2 >> 3; - sprite->pos1.y = var2; + sprite->data[2] += sprite->data[4]; + sprite->pos1.x = sprite->data[2] >> 3; + sprite->data[3] += sprite->data[5]; + sprite->pos1.y = sprite->data[3] >> 3; - if ((u32)((var1 + 8) << 16) > 0x1000000 || var2 < -8 || var2 > 120) - { - sprite->invisible = 1; - } -} -#else -__attribute__((naked)) -void sub_80D59B0(struct Sprite *sprite) -{ - asm(".syntax unified\n\ - push {lr}\n\ - adds r2, r0, 0\n\ - ldrh r0, [r2, 0x2E]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x2E]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x2\n\ - ble _080D59DA\n\ - movs r0, 0\n\ - strh r0, [r2, 0x2E]\n\ - ldrh r0, [r2, 0x30]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x30]\n\ - ldrh r0, [r2, 0x30]\n\ - adds r1, r0, 0\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - ldrh r3, [r2, 0x34]\n\ - adds r0, r3\n\ - strh r0, [r2, 0x34]\n\ -_080D59DA:\n\ - ldrh r0, [r2, 0x36]\n\ - ldrh r1, [r2, 0x32]\n\ - adds r0, r1\n\ - strh r0, [r2, 0x32]\n\ - lsls r0, 16\n\ - asrs r0, 19\n\ - strh r0, [r2, 0x20]\n\ - ldrh r1, [r2, 0x38]\n\ - ldrh r3, [r2, 0x34]\n\ - adds r1, r3\n\ - strh r1, [r2, 0x34]\n\ - lsls r1, 16\n\ - asrs r3, r1, 19\n\ - strh r3, [r2, 0x22]\n\ - adds r0, 0x8\n\ - lsls r0, 16\n\ - movs r1, 0x80\n\ - lsls r1, 17\n\ - cmp r0, r1\n\ - bhi _080D5A10\n\ - adds r1, r3, 0\n\ - movs r0, 0x8\n\ - negs r0, r0\n\ - cmp r1, r0\n\ - blt _080D5A10\n\ - cmp r1, 0x78\n\ - ble _080D5A1C\n\ -_080D5A10:\n\ - adds r0, r2, 0\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r2, 0x4\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ -_080D5A1C:\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); + if (sprite->pos1.x < -8 || sprite->pos1.x > 0xf8 || sprite->pos1.y < -8 || sprite->pos1.y > 120) + sprite->invisible = TRUE; } -#endif // NONMATCHING void sub_80D5A20(struct Sprite *sprite) { -- cgit v1.2.3 From 333c41515030a525f55a01fbf64ee5e621361cc4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 13:17:23 -0500 Subject: failed attempt to match sub_80D0614 --- src/battle/anim/shadow_minimize.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/battle/anim/shadow_minimize.c b/src/battle/anim/shadow_minimize.c index 94069374f..61645bc59 100644 --- a/src/battle/anim/shadow_minimize.c +++ b/src/battle/anim/shadow_minimize.c @@ -93,7 +93,7 @@ void sub_80D04E0(u8 taskId) sub_8078F40(task->data[0]); gSprites[task->data[15]].pos2.y = 0; DestroyAnimVisualTask(taskId); - break; + break; } } @@ -110,10 +110,11 @@ void sub_80D0614(struct Task* task, u8 taskId) } else { - gSprites[r8].oam.objMode = 1; - gSprites[r8].oam.affineMode = 3; - gSprites[r8].affineAnimPaused = 1; - gSprites[r8].oam.matrixNum = r6; + gSprites[r8].oam.objMode = ST_OAM_OBJ_BLEND; + gSprites[r8].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + gSprites[r8].affineAnimPaused = TRUE; + r6 &= 0x1f; + gSprites[r8].oam.matrixNum = r6; // need to inhibit optimizing out the mov r0, 0x3f / neg r0, r0 gSprites[r8].subpriority = task->data[7] - task->data[3]; task->data[3]++; task->data[6]++; @@ -132,7 +133,7 @@ __attribute__((naked)) void sub_80D0614(struct Task* task, u8 taskId) { asm(".syntax unified\n\ - push {r4-r7,lr}\n\ + push {r4-r7,lr}\n\ mov r7, r9\n\ mov r6, r8\n\ push {r6,r7}\n\ -- cgit v1.2.3 From 98075d9ba76a83a16a9182639c33b0e89d1864d6 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 15:49:00 -0500 Subject: failed attempt to match sub_80CFE2C --- src/battle/anim/unused_9.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/battle/anim/unused_9.c b/src/battle/anim/unused_9.c index cf3ccb0d4..0efd40c02 100644 --- a/src/battle/anim/unused_9.c +++ b/src/battle/anim/unused_9.c @@ -3,6 +3,7 @@ #include "trig.h" #include "battle_anim.h" #include "sound.h" +#include "palette.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; @@ -26,23 +27,19 @@ void sub_80CFDFC(struct Sprite* sprite) void sub_80CFE2C(struct Sprite* sprite) { u16 r7; - u16* r1; - u16* r2; + u16 r5; int i; if (++sprite->data[1] == 2) { sprite->data[1] = 0; - r7 = gPlttBufferFaded[sprite->data[0] + 8]; - r2 = &gPlttBufferFaded[0x10]; - r1 = &gPlttBufferFaded[sprite->data[0] + 9]; - for (i = 7; i >= 0; i--) + r5 = sprite->data[0]; + r7 = gPlttBufferFaded[r5 + 8]; + for (i = 0; i < 8; i++) { - *r2 = *r1; - r1++; - r2++; + gPlttBufferFaded[r5 + i + 8] = gPlttBufferFaded[r5 + i + 9]; } + gPlttBufferFaded[r5 + 15] = r7; - gPlttBufferFaded[sprite->data[0] + 15] = r7; if (++sprite->data[2] == 0x18) DestroyAnimSprite(sprite); } -- cgit v1.2.3 From 6ecfa94ffb3d8c9ed8548c573a2ec1c1ef9357a4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 16:30:08 -0500 Subject: Remove some explicit calls to memcpy in matsuda_debug_menu; label fields in ContestPokemon --- src/battle/battle_2.c | 3 +- src/contest.c | 16 +- src/debug/matsuda_debug_menu.c | 326 ++++++++++++++++++++--------------------- 3 files changed, 171 insertions(+), 174 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 2ad2adb04..ea8c39066 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -4721,9 +4721,8 @@ void HandleAction_UseItem(void) } else { - ewram16003 = gBankAttacker; - switch (ewram160D8(gBankAttacker)) + switch (ewram160D8((ewram16003 = gBankAttacker))) { case AI_ITEM_FULL_RESTORE: case AI_ITEM_HEAL_HP: diff --git a/src/contest.c b/src/contest.c index ce29d80b0..ef16f0129 100644 --- a/src/contest.c +++ b/src/contest.c @@ -1955,7 +1955,7 @@ void Contest_CreatePlayerMon(u8 partyIndex) else gContestMons[gContestPlayerMonIndex].trainerGfxId = MAP_OBJ_GFX_LINK_MAY; gContestMons[gContestPlayerMonIndex].flags = 0; - gContestMons[gContestPlayerMonIndex].unk2C = 0; + gContestMons[gContestPlayerMonIndex].unk2C[0] = 0; gContestMons[gContestPlayerMonIndex].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES); GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, name); StringGetEnd10(name); @@ -2022,7 +2022,7 @@ void Contest_CreatePlayerMon(u8 partyIndex) gContestMons[gContestPlayerMonIndex].tough = tough; } -void Contest_InitAllPokemon(u8 a, u8 b) +void Contest_InitAllPokemon(u8 contestType, u8 rank) { s32 i; u8 opponentsCount = 0; @@ -2033,17 +2033,17 @@ void Contest_InitAllPokemon(u8 a, u8 b) // Find all suitable opponents for (i = 0; i < 60; i++) { - if (b == gContestOpponents[i].unk1C_0) + if (rank == gContestOpponents[i].whichRank) { - if (a == 0 && gContestOpponents[i].unk1C_2) + if (contestType == 0 && gContestOpponents[i].aiPool_Cool) opponents[opponentsCount++] = i; - else if (a == 1 && gContestOpponents[i].unk1C_3) + else if (contestType == 1 && gContestOpponents[i].aiPool_Beauty) opponents[opponentsCount++] = i; - else if (a == 2 && gContestOpponents[i].unk1C_4) + else if (contestType == 2 && gContestOpponents[i].aiPool_Cute) opponents[opponentsCount++] = i; - else if (a == 3 && gContestOpponents[i].unk1C_5) + else if (contestType == 3 && gContestOpponents[i].aiPool_Smart) opponents[opponentsCount++] = i; - else if (a == 4 && gContestOpponents[i].unk1C_6) + else if (contestType == 4 && gContestOpponents[i].aiPool_Tough) opponents[opponentsCount++] = i; } } diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c index efd952ef7..c8f80eb50 100644 --- a/src/debug/matsuda_debug_menu.c +++ b/src/debug/matsuda_debug_menu.c @@ -76,166 +76,6 @@ const struct MenuAction gMatsudaDebugMenuActions[] = {gMatsudaDebugMenu_ActionSetAllArtMuseumText, MatsudaDebugMenu_SetArtMuseumItems}, }; -const u8 gMatsudaDebugMenu_UnknownByteArray[] = {0xFC, 0x02, 0x0F, 0x00, 0xFF}; -const u8 Unknown_083C922D[] = INCBIN_U8("graphics/unknown/ball.4bpp"); -const u16 Unknown_083C924E[] = INCBIN_U16("graphics/unknown/ball.gbapal"); - -const u8 gUnknown_083C926E[][2] = -{ - {2, 0}, - {17, 0}, - {2, 2}, - {17, 2}, -}; - -const u8 gMatsudaDebugMenuContestTopLeft[][2] = -{ - {0, 6}, - {15, 6}, - {0, 8}, - {15, 8}, - {0, 10}, - {15, 10}, -}; - -const u8 gUnknown_083C9282[] = -{ - // TODO: 2d array? - 7, 6, - 22, 6, - 7, 8, - 22, 8, - 7, 10, - 22, 10, -}; - -const u8 gUnknown_083C928E[][2] = -{ - {2, 14}, - {17, 14}, - {2, 16}, - {17, 16}, -}; - -const u8 gUnknown_083C9296[] = {0x08, 0x80, 0x08, 0x80, 0x10, 0x10, 0x30, 0xA8, 0x30, 0xA8, 0x30, 0xA8, 0x08, 0x80, 0x08, 0x80, 0x10, 0x88}; -const u8 gUnknown_083C92A8[] = {0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x78, 0x88, 0x98}; - -const struct SpriteSheet gUnknown_083C92B4[] = {Unknown_083C922D, 32, 0x4B0}; -const struct SpritePalette gUnknown_083C92BC[] = {Unknown_083C924E, 0x4B0}; - -const struct OamData gOamData_83C92C4 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const struct SpriteTemplate gSpriteTemplate_83C92CC = -{ - .tileTag = 1200, - .paletteTag = 1200, - .oam = &gOamData_83C92C4, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80AA754, -}; - -static void (* const gUnknown_083C92E4[][2])(struct Sprite *, s8) = -{ - {sub_80AA8C8, sub_80AA8D8}, - {sub_80AA8E8, sub_80AA8F8}, - {sub_80AAC5C, sub_80AAC5C}, - {sub_80AA930, sub_80AA974}, - {sub_80AA9B8, sub_80AA9FC}, - {sub_80AAA40, sub_80AAA84}, - {sub_80AAAF0, sub_80AAB30}, - {sub_80AAB70, sub_80AABB0}, - {sub_80AABF0, sub_80AAD44}, -}; - -static const u8 gMatsudaDebugMenu_StartText[] = _("{COLOR CYAN}{HIGHLIGHT RED}"); -static const u8 gMatsudaDebugMenu_StartJapText[] = _("かいし"); // because StartText is only called by StringCopy, this part appears to be unused. -static const u8 gMatsudaDebugMenu_GoBackText[] = _("もどる"); - -#ifdef GERMAN -static const u8 gMatsudaDebugMenu_BattlePointsText[] = _("{COLOR MAGENTA}BP,"); -#else -static const u8 gMatsudaDebugMenu_BattlePointsText[] = _("{COLOR MAGENTA}BP."); -#endif - -static const u8 MatsudaDebugMenuText_Cool[] = _("かっこよさ"); // cool -static const u8 MatsudaDebugMenuText_Cute[] = _("かわいさ"); // cute -static const u8 MatsudaDebugMenuText_Beauty[] = _("うつくしさ"); // beauty -static const u8 MatsudaDebugMenuText_Smart[] = _("かしこさ"); // smart -static const u8 MatsudaDebugMenuText_Tough[] = _("たくましさ"); // tough -static const u8 MatsudaDebugMenuText_Sheen[] = _("けづや"); // sheen - -static const u8 *const gMatsudaDebugMenuTextList1[] = -{ - MatsudaDebugMenuText_Cool, - MatsudaDebugMenuText_Cute, - MatsudaDebugMenuText_Beauty, - MatsudaDebugMenuText_Smart, - MatsudaDebugMenuText_Tough, - MatsudaDebugMenuText_Sheen, -}; - -static const u8 MatsudaDebugMenuText_CoolContest[] = _("かっこよさコンテスト"); -static const u8 MatsudaDebugMenuText_BeautyContest[] = _("うつくしさコンテスト"); -static const u8 MatsudaDebugMenuText_CuteContest[] = _("かわいさコンテスト "); -static const u8 MatsudaDebugMenuText_SmartContest[] = _("かしこさコンテスト "); -static const u8 MatsudaDebugMenuText_ToughContest[] = _("たくましさコンテスト"); - -static const u8 *const gMatsudaDebugMenuTextList2[] = -{ - MatsudaDebugMenuText_CoolContest, - MatsudaDebugMenuText_BeautyContest, - MatsudaDebugMenuText_CuteContest, - MatsudaDebugMenuText_SmartContest, - MatsudaDebugMenuText_ToughContest, -}; - -static const u8 MatsudaDebugMenuText_Fallarbor[] = _("ハジツゲ/ノーマル"); // Fallarbor / Normal -static const u8 MatsudaDebugMenuText_Verdanturf[] = _("シダケ/スーパー "); // Verdanturf / Super -static const u8 MatsudaDebugMenuText_Slateport[] = _("カイナ/ハイパー "); // Slateport / Hyper -static const u8 MatsudaDebugMenuText_Lilycove[] = _("ミナモ/マスター "); // Lilycove / Master - -static const u8 *const gMatsudaDebugMenuTextList3[] = -{ - MatsudaDebugMenuText_Fallarbor, - MatsudaDebugMenuText_Verdanturf, - MatsudaDebugMenuText_Slateport, - MatsudaDebugMenuText_Lilycove, -}; - -static const struct OamData gUnknown_083C9400 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 1023, - .priority = 0, - .paletteNum = 15, - .affineParam = 0, -}; - u8 unref_sub_80A9B28(void) { Menu_EraseScreen(); @@ -460,14 +300,172 @@ static void sub_80A9F50(void) static void sub_80A9FE4(void) { - u8 ptr[5]; - - memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5); + u8 ptr[] = _("{HIGHLIGHT WHITE2} "); DmaFill32Large(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); sub_80034D4((void *)VRAM, ptr); LoadFontDefaultPalette(&gWindowTemplate_81E6C3C); } +//const u8 gMatsudaDebugMenu_UnknownByteArray[] = {0xFC, 0x02, 0x0F, 0x00, 0xFF}; +const u8 Unknown_083C922D[] = INCBIN_U8("graphics/unknown/ball.4bpp"); +const u16 Unknown_083C924E[] = INCBIN_U16("graphics/unknown/ball.gbapal"); + +const u8 gUnknown_083C926E[][2] = + { + {2, 0}, + {17, 0}, + {2, 2}, + {17, 2}, + }; + +const u8 gMatsudaDebugMenuContestTopLeft[][2] = + { + {0, 6}, + {15, 6}, + {0, 8}, + {15, 8}, + {0, 10}, + {15, 10}, + }; + +const u8 gUnknown_083C9282[] = + { + // TODO: 2d array? + 7, 6, + 22, 6, + 7, 8, + 22, 8, + 7, 10, + 22, 10, + }; + +const u8 gUnknown_083C928E[][2] = + { + {2, 14}, + {17, 14}, + {2, 16}, + {17, 16}, + }; + +const u8 gUnknown_083C9296[] = {0x08, 0x80, 0x08, 0x80, 0x10, 0x10, 0x30, 0xA8, 0x30, 0xA8, 0x30, 0xA8, 0x08, 0x80, 0x08, 0x80, 0x10, 0x88}; +const u8 gUnknown_083C92A8[] = {0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x78, 0x88, 0x98}; + +const struct SpriteSheet gUnknown_083C92B4[] = {Unknown_083C922D, 32, 0x4B0}; +const struct SpritePalette gUnknown_083C92BC[] = {Unknown_083C924E, 0x4B0}; + +const struct OamData gOamData_83C92C4 = + { + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, + }; + +const struct SpriteTemplate gSpriteTemplate_83C92CC = + { + .tileTag = 1200, + .paletteTag = 1200, + .oam = &gOamData_83C92C4, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80AA754, + }; + +static void (* const gUnknown_083C92E4[][2])(struct Sprite *, s8) = + { + {sub_80AA8C8, sub_80AA8D8}, + {sub_80AA8E8, sub_80AA8F8}, + {sub_80AAC5C, sub_80AAC5C}, + {sub_80AA930, sub_80AA974}, + {sub_80AA9B8, sub_80AA9FC}, + {sub_80AAA40, sub_80AAA84}, + {sub_80AAAF0, sub_80AAB30}, + {sub_80AAB70, sub_80AABB0}, + {sub_80AABF0, sub_80AAD44}, + }; + +static const u8 gMatsudaDebugMenu_StartText[] = _("{COLOR CYAN}{HIGHLIGHT RED}"); +static const u8 gMatsudaDebugMenu_StartJapText[] = _("かいし"); // because StartText is only called by StringCopy, this part appears to be unused. +static const u8 gMatsudaDebugMenu_GoBackText[] = _("もどる"); + +#ifdef GERMAN +static const u8 gMatsudaDebugMenu_BattlePointsText[] = _("{COLOR MAGENTA}BP,"); +#else +static const u8 gMatsudaDebugMenu_BattlePointsText[] = _("{COLOR MAGENTA}BP."); +#endif + +static const u8 MatsudaDebugMenuText_Cool[] = _("かっこよさ"); // cool +static const u8 MatsudaDebugMenuText_Cute[] = _("かわいさ"); // cute +static const u8 MatsudaDebugMenuText_Beauty[] = _("うつくしさ"); // beauty +static const u8 MatsudaDebugMenuText_Smart[] = _("かしこさ"); // smart +static const u8 MatsudaDebugMenuText_Tough[] = _("たくましさ"); // tough +static const u8 MatsudaDebugMenuText_Sheen[] = _("けづや"); // sheen + +static const u8 *const gMatsudaDebugMenuTextList1[] = + { + MatsudaDebugMenuText_Cool, + MatsudaDebugMenuText_Cute, + MatsudaDebugMenuText_Beauty, + MatsudaDebugMenuText_Smart, + MatsudaDebugMenuText_Tough, + MatsudaDebugMenuText_Sheen, + }; + +static const u8 MatsudaDebugMenuText_CoolContest[] = _("かっこよさコンテスト"); +static const u8 MatsudaDebugMenuText_BeautyContest[] = _("うつくしさコンテスト"); +static const u8 MatsudaDebugMenuText_CuteContest[] = _("かわいさコンテスト "); +static const u8 MatsudaDebugMenuText_SmartContest[] = _("かしこさコンテスト "); +static const u8 MatsudaDebugMenuText_ToughContest[] = _("たくましさコンテスト"); + +static const u8 *const gMatsudaDebugMenuTextList2[] = + { + MatsudaDebugMenuText_CoolContest, + MatsudaDebugMenuText_BeautyContest, + MatsudaDebugMenuText_CuteContest, + MatsudaDebugMenuText_SmartContest, + MatsudaDebugMenuText_ToughContest, + }; + +static const u8 MatsudaDebugMenuText_Fallarbor[] = _("ハジツゲ/ノーマル"); // Fallarbor / Normal +static const u8 MatsudaDebugMenuText_Verdanturf[] = _("シダケ/スーパー "); // Verdanturf / Super +static const u8 MatsudaDebugMenuText_Slateport[] = _("カイナ/ハイパー "); // Slateport / Hyper +static const u8 MatsudaDebugMenuText_Lilycove[] = _("ミナモ/マスター "); // Lilycove / Master + +static const u8 *const gMatsudaDebugMenuTextList3[] = + { + MatsudaDebugMenuText_Fallarbor, + MatsudaDebugMenuText_Verdanturf, + MatsudaDebugMenuText_Slateport, + MatsudaDebugMenuText_Lilycove, + }; + +static const struct OamData gUnknown_083C9400 = + { + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 1023, + .priority = 0, + .paletteNum = 15, + .affineParam = 0, + }; + static void sub_80AA064(void) { AnimateSprites(); @@ -963,7 +961,7 @@ void sub_80AAF30(void) gUnknown_02038670[i] = 0; gUnknown_02038680[i] = 0; gUnknown_02038678[i] = 0; - memcpy(&gContestMons[i], &gContestMons[3], sizeof(struct ContestPokemon)); + gContestMons[i] = gContestMons[3]; } gUnknown_02038670[3] = 0x12C; -- cgit v1.2.3 From 6237099104e25f606a5ebde108d2d41ae8646869 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 17:10:13 -0500 Subject: match sub_8115238 --- src/roulette.c | 203 ++++----------------------------------------------------- 1 file changed, 13 insertions(+), 190 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index 41e8ef77f..d5c4d4433 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -348,22 +348,20 @@ void sub_8115124(void) REG_BG0CNT = 0x1F08; DmaFill16(3, 0x0, (void *)(VRAM + 0xF9C0), 0x340); eRoulette->var28 = 0x0; - break; case 0x0: + break; } } -#ifdef NONMATCHING void sub_8115238(void) { u8 i; u32 temp; - struct PlttData t; - struct PlttData *unfaded; - struct PlttData *faded; struct StructgUnknown_083F8DF4 *s0; - struct PlttData arr[0x3]; // the third is never used ? - memcpy(&arr, &gUnknown_083F8EC4, 0x6); + u16 arr[0x3]; // the third is never used ? + + memcpy(arr, &gUnknown_083F8EC4, 0x6); + // u16 arr[] = {RGB(24, 4, 10), RGB(10, 19, 6), RGB(24, 4, 10)}; memset(eRoulette, 0x0, 0x17C); eRoulette->var04_0 = (gSpecialVar_0x8004 & 0x1); if (gSpecialVar_0x8004 & 0x80) @@ -371,25 +369,12 @@ void sub_8115238(void) s0 = &gUnknown_083F8DF4[0]; eRoulette->var22 = s0[eRoulette->var04_0].var03; eRoulette->var23 = s0[eRoulette->var04_0].var04; - temp = gUnknown_083F8DF0[eRoulette->var04_0 + eRoulette->var04_7 * 2]; - eRoulette->var19 = temp; + eRoulette->var19 = temp = gUnknown_083F8DF0[eRoulette->var04_0 + eRoulette->var04_7 * 2]; eRoulette->var1A_4 = 0x1; if (temp == 0x1) - { - unfaded = (struct PlttData *)&gPlttBufferUnfaded[0]; - faded = (struct PlttData *)&gPlttBufferFaded[0]; - t = arr[0]; - } + gPlttBufferUnfaded[0] = gPlttBufferUnfaded[0x51] = gPlttBufferFaded[0] = gPlttBufferFaded[0x51] = arr[0]; else - { - unfaded = (struct PlttData *)&gPlttBufferUnfaded[0]; - faded = (struct PlttData *)&gPlttBufferFaded[0]; - t = arr[1]; - } - faded[0x51] = t; - faded[0x0] = faded[0x51]; - unfaded[0x51] = t; - unfaded[0x0] = t; + gPlttBufferUnfaded[0] = gPlttBufferUnfaded[0x51] = gPlttBufferFaded[0] = gPlttBufferFaded[0x51] = arr[1]; sub_8124918((&eRoulette->varB8)); for (i = 0; i < 0xD; i++) sub_812492C((&eRoulette->varB8), i, (struct UnkStruct1 *)&gUnknown_083F8E34[i * 8]); @@ -397,178 +382,16 @@ void sub_8115238(void) { switch (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2)) { - case SPECIES_TAILLOW: - eRoulette->var02 |= 0x2; - break; case SPECIES_SHROOMISH: - eRoulette->var02 |= 0x1; - break; + eRoulette->var02 |= 0x1; + break; + case SPECIES_TAILLOW: + eRoulette->var02 |= 0x2; + break; } } RtcCalcLocalTime(); } -#else -__attribute__((naked)) -void sub_8115238(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x8\n\ - ldr r1, _081152C0 @ =gUnknown_083F8EC4\n\ - mov r0, sp\n\ - movs r2, 0x6\n\ - bl memcpy\n\ - ldr r5, _081152C4 @ =0x02019000\n\ - movs r2, 0xBE\n\ - lsls r2, 1\n\ - adds r0, r5, 0\n\ - movs r1, 0\n\ - bl memset\n\ - ldr r0, _081152C8 @ =gSpecialVar_0x8004\n\ - ldrh r2, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r2\n\ - ldrb r1, [r5, 0x4]\n\ - movs r3, 0x4\n\ - negs r3, r3\n\ - ands r3, r1\n\ - orrs r3, r0\n\ - strb r3, [r5, 0x4]\n\ - movs r0, 0x80\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08115276\n\ - movs r0, 0x80\n\ - orrs r3, r0\n\ - strb r3, [r5, 0x4]\n\ - _08115276:\n\ - ldr r3, _081152CC @ =gUnknown_083F8DF4\n\ - ldrb r2, [r5, 0x4]\n\ - lsls r1, r2, 30\n\ - lsrs r0, r1, 25\n\ - adds r0, r3\n\ - ldrb r0, [r0, 0x3]\n\ - adds r4, r5, 0\n\ - adds r4, 0x22\n\ - strb r0, [r4]\n\ - lsrs r0, r1, 25\n\ - adds r0, r3\n\ - ldrb r0, [r0, 0x4]\n\ - adds r3, r5, 0\n\ - adds r3, 0x23\n\ - strb r0, [r3]\n\ - ldr r0, _081152D0 @ =gUnknown_083F8DF0\n\ - lsrs r1, 30\n\ - lsls r2, 24\n\ - lsrs r2, 31\n\ - lsls r2, 1\n\ - adds r1, r2\n\ - adds r1, r0\n\ - ldrb r2, [r1]\n\ - strb r2, [r5, 0x19]\n\ - ldrb r1, [r5, 0x1A]\n\ - movs r0, 0xF\n\ - ands r0, r1\n\ - movs r1, 0x10\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1A]\n\ - cmp r2, 0x1\n\ - bne _081152DC\n\ - ldr r4, _081152D4 @ =gPlttBufferUnfaded\n\ - ldr r3, _081152D8 @ =gPlttBufferFaded\n\ - mov r0, sp\n\ - ldrh r2, [r0]\n\ - b _081152E4\n\ - .align 2, 0\n\ - _081152C0: .4byte gUnknown_083F8EC4\n\ - _081152C4: .4byte 0x02019000\n\ - _081152C8: .4byte gSpecialVar_0x8004\n\ - _081152CC: .4byte gUnknown_083F8DF4\n\ - _081152D0: .4byte gUnknown_083F8DF0\n\ - _081152D4: .4byte gPlttBufferUnfaded\n\ - _081152D8: .4byte gPlttBufferFaded\n\ - _081152DC:\n\ - ldr r4, _08115348 @ =gPlttBufferUnfaded\n\ - ldr r3, _0811534C @ =gPlttBufferFaded\n\ - mov r0, sp\n\ - ldrh r2, [r0, 0x2]\n\ - _081152E4:\n\ - adds r0, r3, 0\n\ - adds r0, 0xA2\n\ - strh r2, [r0]\n\ - ldr r1, _08115350 @ =0x0000ffff\n\ - adds r0, r1, 0\n\ - ands r0, r2\n\ - strh r0, [r3]\n\ - ands r0, r1\n\ - adds r2, r4, 0\n\ - adds r2, 0xA2\n\ - strh r0, [r2]\n\ - ands r0, r1\n\ - strh r0, [r4]\n\ - ldr r0, _08115354 @ =0x020190b8\n\ - bl sub_8124918\n\ - movs r4, 0\n\ - ldr r5, _08115358 @ =gUnknown_083F8E34\n\ - _08115308:\n\ - lsls r2, r4, 3\n\ - adds r2, r5\n\ - ldr r0, _08115354 @ =0x020190b8\n\ - adds r1, r4, 0\n\ - bl sub_812492C\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0xC\n\ - bls _08115308\n\ - movs r4, 0\n\ - ldr r5, _0811535C @ =0x02019000\n\ - _08115322:\n\ - movs r0, 0x64\n\ - muls r0, r4\n\ - ldr r1, _08115360 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - adds r1, r0, 0\n\ - movs r0, 0x98\n\ - lsls r0, 1\n\ - cmp r1, r0\n\ - beq _08115364\n\ - adds r0, 0x2\n\ - cmp r1, r0\n\ - bne _0811536C\n\ - ldrb r0, [r5, 0x2]\n\ - movs r1, 0x1\n\ - b _08115368\n\ - .align 2, 0\n\ - _08115348: .4byte gPlttBufferUnfaded\n\ - _0811534C: .4byte gPlttBufferFaded\n\ - _08115350: .4byte 0x0000ffff\n\ - _08115354: .4byte 0x020190b8\n\ - _08115358: .4byte gUnknown_083F8E34\n\ - _0811535C: .4byte 0x02019000\n\ - _08115360: .4byte gPlayerParty\n\ - _08115364:\n\ - ldrb r0, [r5, 0x2]\n\ - movs r1, 0x2\n\ - _08115368:\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x2]\n\ - _0811536C:\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x5\n\ - bls _08115322\n\ - bl RtcCalcLocalTime\n\ - add sp, 0x8\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif void sub_8115384(void) { -- cgit v1.2.3 From cce651aabe5d00d45ca0a11055e278f40eb774cc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 17:54:25 -0500 Subject: match sub_8116100 --- src/roulette.c | 293 +++++--------------------------------------------- src/scene/cable_car.c | 9 -- 2 files changed, 26 insertions(+), 276 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index d5c4d4433..fa8fcf37c 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -1,4 +1,5 @@ #include "global.h" +#include "random.h" #include "ewram.h" #include "field_fadetransition.h" #include "constants/game_stat.h" @@ -657,9 +658,9 @@ void sub_8115B58(u8 r0) gTasks[r0].data[0x1] = z; PlaySE(SE_SELECT); sub_8124D3C((&eRoulette->varB8), 0xFFFF); - (&eRoulette->varB8)->var04[0xF].var00_7 = 0x0; - (&eRoulette->varB8)->var04[0xE].var00_7 = 0x0; - (&eRoulette->varB8)->var04[0xD].var00_7 = 0x0; + eRoulette->varB8.var04[0xF].var00_7 = 0x0; + eRoulette->varB8.var04[0xE].var00_7 = 0x0; + eRoulette->varB8.var04[0xD].var00_7 = 0x0; sub_8116EF8(gTasks[r0].data[0x4]); for (i = 0; i < 0x4; i++) { @@ -855,7 +856,6 @@ u8 sub_8115F58(u16 r0, u16 r1) } } -#ifdef NONMATCHING void sub_8116100(u8 taskid) { u8 randf; @@ -865,14 +865,14 @@ void sub_8116100(u8 taskid) u16 rand; u16 randmod; u16 angles[0x4]; // angles in 90 degree steps - u8 zero = 0x0; + g = 0x0; memcpy(angles, &gUnknown_083F8ECE, 0x8); rand = Random(); randmod = rand % 0x64; eRoulette->var7C = gTasks[taskid].data[0x6]; - eRoulette->var7F = zero; - eRoulette->var7E = zero; - eRoulette->var7D = zero; + eRoulette->var7F = g; + eRoulette->var7E = g; + eRoulette->var7D = g; randf = sub_8115F58(gTasks[taskid].data[0x8], rand); randfinal = (rand % randf) - (randf / 2); if (gLocalTime.hours < 0xD) @@ -883,263 +883,22 @@ void sub_8116100(u8 taskid) r5 *= 2; else r5 = (1 - r5) * 2; - g = (&gUnknown_083F8DF4[eRoulette->var04_0])->var1A; - eRoulette->var80 = (g + randfinal); + eRoulette->var80 = g = gUnknown_083F8DF4[eRoulette->var04_0].var1A + randfinal; // - g = ((float)(u16)(g + randfinal)) / 5.0f; + g = S16TOPOSFLOAT(g) / 5.0f; eRoulette->var82 = g * 3; eRoulette->var84 = g; eRoulette->var86 = g; // - eRoulette->var88 = (float)(angles[(rand & 0x1) + r5]); - eRoulette->var8C = (float)((&gUnknown_083F8DF4[eRoulette->var04_0])->var18); - eRoulette->var90 = ((eRoulette->var8C * 0.5f) - eRoulette->var8C) / (float)(u16)(g * 3); + eRoulette->var88 = S16TOPOSFLOAT(angles[(rand & 0x1) + r5]); + eRoulette->var8C = S16TOPOSFLOAT(gUnknown_083F8DF4[eRoulette->var04_0].var18); + eRoulette->var90 = ((eRoulette->var8C * 0.5f) - eRoulette->var8C) / S16TOPOSFLOAT(g * 3); eRoulette->var94 = 68.0f; eRoulette->var9C = 0.0f; - eRoulette->var98 = -(8.0f / (float)(u16)(g * 3)); + eRoulette->var98 = -(8.0f / S16TOPOSFLOAT(g * 3)); eRoulette->varA0 = 36.0f; - gTasks[taskid].func = &sub_8116308; -} -#else -__attribute__((naked)) -void sub_8116100(u8 taskid) -{ -asm(".syntax unified\n\ -push {r4-r7,lr}\n\ -mov r7, r10\n\ -mov r6, r9\n\ -mov r5, r8\n\ -push {r5-r7}\n\ -sub sp, 0x8\n\ -lsls r0, 24\n\ -lsrs r0, 24\n\ -mov r9, r0\n\ -movs r4, 0\n\ -ldr r1, _08116188 @ =gUnknown_083F8ECE\n\ -mov r0, sp\n\ -movs r2, 0x8\n\ -bl memcpy\n\ -bl Random\n\ -lsls r0, 16\n\ -lsrs r7, r0, 16\n\ -adds r0, r7, 0\n\ -movs r1, 0x64\n\ -bl __umodsi3\n\ -lsls r0, 16\n\ -lsrs r6, r0, 16\n\ -ldr r3, _0811618C @ =0x02019000\n\ -ldr r1, _08116190 @ =gTasks\n\ -mov r2, r9\n\ -lsls r0, r2, 2\n\ -add r0, r9\n\ -lsls r0, 3\n\ -adds r0, r1\n\ -ldrh r2, [r0, 0x14]\n\ -adds r1, r3, 0\n\ -adds r1, 0x7C\n\ -strb r2, [r1]\n\ -adds r1, 0x3\n\ -strb r4, [r1]\n\ -subs r1, 0x1\n\ -strb r4, [r1]\n\ -subs r1, 0x1\n\ -strb r4, [r1]\n\ -ldrh r0, [r0, 0x18]\n\ -adds r1, r7, 0\n\ -bl sub_8115F58\n\ -adds r4, r0, 0\n\ -lsls r4, 24\n\ -lsrs r1, r4, 24\n\ -adds r0, r7, 0\n\ -bl __modsi3\n\ -lsrs r4, 25\n\ -subs r0, r4\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -ldr r0, _08116194 @ =gLocalTime\n\ -ldrb r0, [r0, 0x2]\n\ -lsls r0, 24\n\ -asrs r0, 24\n\ -movs r5, 0x1\n\ -cmp r0, 0xC\n\ -bgt _08116180\n\ -movs r5, 0\n\ -_08116180:\n\ -cmp r6, 0x4F\n\ -bhi _08116198\n\ -lsls r0, r5, 25\n\ -b _081161A2\n\ -.align 2, 0\n\ -_08116188: .4byte gUnknown_083F8ECE\n\ -_0811618C: .4byte 0x02019000\n\ -_08116190: .4byte gTasks\n\ -_08116194: .4byte gLocalTime\n\ -_08116198:\n\ -lsls r1, r5, 24\n\ -asrs r1, 24\n\ -movs r0, 0x1\n\ -subs r0, r1\n\ -lsls r0, 25\n\ -_081161A2:\n\ -lsrs r5, r0, 24\n\ -ldr r6, _081162D8 @ =0x02019000\n\ -ldrb r0, [r6, 0x4]\n\ -lsls r0, 30\n\ -mov r10, r0\n\ -lsrs r0, 25\n\ -ldr r1, _081162DC @ =gUnknown_083F8DF4\n\ -adds r0, r1\n\ -lsls r4, 24\n\ -asrs r4, 24\n\ -ldrh r0, [r0, 0x1A]\n\ -adds r4, r0\n\ -adds r0, r6, 0\n\ -adds r0, 0x80\n\ -strh r4, [r0]\n\ -lsls r4, 16\n\ -asrs r4, 16\n\ -adds r0, r4, 0\n\ -bl __floatsisf\n\ -cmp r4, 0\n\ -bge _081161D4\n\ -ldr r1, _081162E0 @ =0x47800000\n\ -bl __addsf3\n\ -_081161D4:\n\ -ldr r1, _081162E4 @ =0x40a00000\n\ -bl __divsf3\n\ -bl __fixunssfsi\n\ -lsls r0, 16\n\ -lsrs r4, r0, 16\n\ -lsls r0, r4, 1\n\ -adds r0, r4\n\ -mov r8, r0\n\ -adds r0, r6, 0\n\ -adds r0, 0x82\n\ -mov r2, r8\n\ -strh r2, [r0]\n\ -adds r0, 0x2\n\ -strh r4, [r0]\n\ -adds r0, 0x2\n\ -strh r4, [r0]\n\ -movs r0, 0x1\n\ -ands r0, r7\n\ -lsls r1, r5, 24\n\ -asrs r1, 24\n\ -adds r0, r1\n\ -lsls r0, 1\n\ -add r0, sp\n\ -movs r1, 0\n\ -ldrsh r4, [r0, r1]\n\ -adds r0, r4, 0\n\ -bl __floatsisf\n\ -cmp r4, 0\n\ -bge _0811621A\n\ -ldr r1, _081162E0 @ =0x47800000\n\ -bl __addsf3\n\ -_0811621A:\n\ -ldr r2, _081162E8 @ =0x02019088\n\ -str r0, [r2]\n\ -adds r7, r6, 0\n\ -adds r7, 0x8C\n\ -mov r1, r10\n\ -lsrs r0, r1, 25\n\ -ldr r2, _081162DC @ =gUnknown_083F8DF4\n\ -adds r0, r2\n\ -movs r1, 0x18\n\ -ldrsh r4, [r0, r1]\n\ -adds r0, r4, 0\n\ -bl __floatsisf\n\ -adds r5, r0, 0\n\ -cmp r4, 0\n\ -bge _08116242\n\ -ldr r1, _081162E0 @ =0x47800000\n\ -bl __addsf3\n\ -adds r5, r0, 0\n\ -_08116242:\n\ -str r5, [r7]\n\ -adds r7, r6, 0\n\ -adds r7, 0x90\n\ -ldr r1, _081162EC @ =0x3f000000\n\ -adds r0, r5, 0\n\ -bl __mulsf3\n\ -adds r1, r5, 0\n\ -bl __subsf3\n\ -adds r5, r0, 0\n\ -mov r2, r8\n\ -lsls r0, r2, 16\n\ -asrs r4, r0, 16\n\ -adds r0, r4, 0\n\ -bl __floatsisf\n\ -adds r2, r0, 0\n\ -cmp r4, 0\n\ -bge _08116272\n\ -ldr r1, _081162E0 @ =0x47800000\n\ -bl __addsf3\n\ -adds r2, r0, 0\n\ -_08116272:\n\ -adds r0, r5, 0\n\ -adds r1, r2, 0\n\ -bl __divsf3\n\ -str r0, [r7]\n\ -adds r1, r6, 0\n\ -adds r1, 0x94\n\ -ldr r0, _081162F0 @ =0x42880000\n\ -str r0, [r1]\n\ -adds r1, 0x8\n\ -ldr r0, _081162F4 @ =0x00000000\n\ -str r0, [r1]\n\ -adds r5, r6, 0\n\ -adds r5, 0x98\n\ -adds r0, r4, 0\n\ -bl __floatsisf\n\ -adds r2, r0, 0\n\ -cmp r4, 0\n\ -bge _081162A2\n\ -ldr r1, _081162E0 @ =0x47800000\n\ -bl __addsf3\n\ -adds r2, r0, 0\n\ -_081162A2:\n\ -ldr r0, _081162F8 @ =0x41000000\n\ -adds r1, r2, 0\n\ -bl __divsf3\n\ -bl __negsf2\n\ -str r0, [r5]\n\ -adds r1, r6, 0\n\ -adds r1, 0xA0\n\ -ldr r0, _081162FC @ =0x42100000\n\ -str r0, [r1]\n\ -ldr r1, _08116300 @ =gTasks\n\ -mov r2, r9\n\ -lsls r0, r2, 2\n\ -add r0, r9\n\ -lsls r0, 3\n\ -adds r0, r1\n\ -ldr r1, _08116304 @ =sub_8116308\n\ -str r1, [r0]\n\ -add sp, 0x8\n\ -pop {r3-r5}\n\ -mov r8, r3\n\ -mov r9, r4\n\ -mov r10, r5\n\ -pop {r4-r7}\n\ -pop {r0}\n\ -bx r0\n\ -.align 2, 0\n\ -_081162D8: .4byte 0x02019000\n\ -_081162DC: .4byte gUnknown_083F8DF4\n\ -_081162E0: .4byte 0x47800000\n\ -_081162E4: .4byte 0x40a00000\n\ -_081162E8: .4byte 0x02019088\n\ -_081162EC: .4byte 0x3f000000\n\ -_081162F0: .4byte 0x42880000\n\ -_081162F4: .4byte 0x00000000\n\ -_081162F8: .4byte 0x41000000\n\ -_081162FC: .4byte 0x42100000\n\ -_08116300: .4byte gTasks\n\ -_08116304: .4byte sub_8116308\n\ -.syntax divided\n"); + gTasks[taskid].func = sub_8116308; } -#endif void sub_8116308(u8 taskid) { @@ -1147,7 +906,7 @@ void sub_8116308(u8 taskid) eRoulette->var03_7 = 1; index = eRoulette->var3C[eRoulette->var7C]; eRoulette->var38 = &gSprites[index]; - (&gSprites[index])->callback = &sub_81191F4; + eRoulette->var38->callback = sub_81191F4; gTasks[taskid].data[0x6]++; gTasks[taskid].data[0x8]++; sub_81182F8(0x6 - gTasks[taskid].data[0x6]); @@ -1333,9 +1092,9 @@ void sub_811677C(u8 taskid) void sub_81167F4(u8 taskid) { sub_8124D3C((&eRoulette->varB8), 0xFFFF); - (&eRoulette->varB8)->var04[0xF].var00_7 = 0x0; - (&eRoulette->varB8)->var04[0xE].var00_7 = 0x0; - (&eRoulette->varB8)->var04[0xD].var00_7 = 0x0; + eRoulette->varB8.var04[0xF].var00_7 = 0x0; + eRoulette->varB8.var04[0xE].var00_7 = 0x0; + eRoulette->varB8.var04[0xD].var00_7 = 0x0; gSprites[eRoulette->var3C[0x7 + gUnknown_083F8C00[gTasks[taskid].data[0xC]].var00]].invisible = TRUE; gTasks[taskid].func = &sub_8116880; } @@ -3454,18 +3213,18 @@ void sub_8118DE4(struct Sprite *sprite) if (gUnknown_083F8D90[t].var04 & eRoulette->var08) { sprite->data[0x0] = 0x1; - sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var02; + sprite->data[0x2] = gUnknown_083F8DF4[eRoulette->var04_0].var02; } else { sprite->data[0x0] = gUnknown_083F8D90[t].var04 & eRoulette->var08; if (eRoulette->var04_0) { - sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var01; + sprite->data[0x2] = gUnknown_083F8DF4[eRoulette->var04_0].var01; } else { - sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var02; + sprite->data[0x2] = gUnknown_083F8DF4[eRoulette->var04_0].var02; if (z) { eRoulette->var8C = 1.5f; @@ -3701,7 +3460,7 @@ void sub_8118F8C(struct Sprite *sprite) eRoulette->var90 = 0.0f; p = &gUnknown_083F8DF4[0]; eRoulette->var8C -= ((float)p[eRoulette->var04_0].var03) - / ((float)(s16)((&p[eRoulette->var04_0])->var04 + 0x1)); + / ((float)(s16)(p[eRoulette->var04_0].var04 + 0x1)); sprite->data[0x1] = 0x4; sprite->callback = &sub_8118DE4; } @@ -3783,8 +3542,8 @@ void sub_8119224(struct Sprite *sprite) gSprites[eRoulette->var3C[0x37 + i]].data[0x5] = eRoulette->var3C[0x38]; gSprites[eRoulette->var3C[0x37 + i]].data[0x6] = eRoulette->var3C[0x39]; gSprites[eRoulette->var3C[0x37 + i]].data[0x2] = t; - gSprites[eRoulette->var3C[0x37 + i]].data[0x3] = (sprite->data[0x7] * (&gUnknown_083F8DF4[eRoulette->var04_0])->var01) + - ((&gUnknown_083F8DF4[eRoulette->var04_0])->var02 + 0xFFFF); + gSprites[eRoulette->var3C[0x37 + i]].data[0x3] = (sprite->data[0x7] * gUnknown_083F8DF4[eRoulette->var04_0].var01) + + (gUnknown_083F8DF4[eRoulette->var04_0].var02 + 0xFFFF); } gSprites[eRoulette->var3C[0x38]].coordOffsetEnabled = TRUE; eRoulette->var38 = sprite; @@ -3832,7 +3591,7 @@ void sub_811952C(struct Sprite *sprite) eRoulette->var7E = 0xFF; eRoulette->var88 = sprite->data[0x3]; eRoulette->var98 = 0.0f; - eRoulette->var8C = (&gUnknown_083F8DF4[eRoulette->var04_0])->var1C; //couldn't replicate load, same as sub_8118DE4 + eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C; //couldn't replicate load, same as sub_8118DE4 o = (eRoulette->var04_0 * 30 + 33) + (0x1 - eRoulette->var03_0) * 15; for (i = 0x0; i < 0x4; i++) { diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index 7faa8d844..ea2a9f9e2 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -22,15 +22,6 @@ // Static type declarations -// Credits to Made (dolphin emoji) -#define S16TOPOSFLOAT(val) \ -({ \ - s16 v = (val); \ - float f = (float)v; \ - if(v < 0) f += 65536.0f; \ - f; \ -}) - struct CableCarEwramStruct1 { u8 unk_0000; u8 unk_0001; -- cgit v1.2.3 From 06f1fd1766f795bd938280aef062d3e07b94da8c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 18:07:13 -0500 Subject: match sub_8117380 --- src/roulette.c | 146 +++++++++------------------------------------------------ 1 file changed, 23 insertions(+), 123 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index fa8fcf37c..3fc7b08c2 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -614,6 +614,7 @@ u8 sub_8115A94(s16 *r0, u8 r1) s8 arr[0x4]; s8 t; memcpy(&arr, gUnknown_083F8ECA, 0x4); + // char arr[] = {-5, 5, -1, 1}; t = (u8)*r0; switch (r1) { @@ -861,12 +862,12 @@ void sub_8116100(u8 taskid) u8 randf; s8 randfinal; s8 r5; - u16 g; + u16 g = 0; u16 rand; u16 randmod; u16 angles[0x4]; // angles in 90 degree steps - g = 0x0; memcpy(angles, &gUnknown_083F8ECE, 0x8); + // u16 angles[] = {0, 180, 90, 270}; rand = Random(); randmod = rand % 0x64; eRoulette->var7C = gTasks[taskid].data[0x6]; @@ -1258,6 +1259,8 @@ u8 sub_8116D54(u8 taskid, u8 r1) u32 t1[0x3]; memcpy(t0, gUnknown_083F8ED8, 0x10); memcpy(t1, gUnknown_083F8EE8, 0xC); + // u32 t0[] = {67650, 135300, 270600, 541200}; + // u32 t1[] = {0x3e0, 0x7c00, 0xf8000}; if (r1 > 0xB) { return 0x0; @@ -2021,135 +2024,32 @@ _0811737C: .4byte 0x020189a4\n\ } #endif -#ifdef NONMATCHING u8 sub_8117380(u8 r0) { - u8 var0[0x5]; - u8 t; - u8 z; - memcpy(var0, gUnknown_083F8EF4, 0x5); - if (r0 > 0x13) - r0 = 0x0; + u8 var0[5]; + memcpy(var0, gUnknown_083F8EF4, 5); + // u8 var0[] = {0, 3, 4, 6, 12}; + if (r0 > 19) + r0 = 0; switch (gUnknown_083F8C00[r0].var01_0) { - case 0x3: - z = r0 / 0x5 - 0x1; - if (eRoulette->var16[z] > 0x3) + case 3: + r0 = r0 / 5 - 1; + if (eRoulette->var16[r0] > 3) return 0x0; - return var0[eRoulette->var16[z] + 0x1]; - case 0x4: - t = r0 - 0x1; - if (eRoulette->var12[t] > 0x2) - return 0x0; - return var0[eRoulette->var12[t] + 0x2]; - case 0xC: + return var0[eRoulette->var16[r0] + 1]; + case 4: + r0--; + if (eRoulette->var12[r0] > 2) + return 0; + return var0[eRoulette->var12[r0] + 2]; + case 12: if (eRoulette->var08 & gUnknown_083F8C00[r0].var08) - return 0x0; - return var0[0x4]; - default: + return 0; + return var0[4]; } - return 0x0; -} -#else -__attribute__((naked)) -u8 sub_8117380(u8 r0) -{ -asm(".syntax unified\n\ -push {r4,lr}\n\ -sub sp, 0x8\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -ldr r1, _081173B8 @ =gUnknown_083F8EF4\n\ -mov r0, sp\n\ -movs r2, 0x5\n\ -bl memcpy\n\ -cmp r4, 0x13\n\ -bls _08117398\n\ -movs r4, 0\n\ -_08117398:\n\ -ldr r3, _081173BC @ =gUnknown_083F8C00\n\ -lsls r0, r4, 2\n\ -adds r0, r4\n\ -lsls r2, r0, 2\n\ -adds r0, r2, r3\n\ -ldrb r0, [r0, 0x1]\n\ -lsls r0, 28\n\ -lsrs r0, 28\n\ -cmp r0, 0x4\n\ -beq _081173EC\n\ -cmp r0, 0x4\n\ -bgt _081173C0\n\ -cmp r0, 0x3\n\ -beq _081173C6\n\ -b _08117428\n\ -.align 2, 0\n\ -_081173B8: .4byte gUnknown_083F8EF4\n\ -_081173BC: .4byte gUnknown_083F8C00\n\ -_081173C0:\n\ -cmp r0, 0xC\n\ -beq _0811740C\n\ -b _08117428\n\ -_081173C6:\n\ -adds r0, r4, 0\n\ -movs r1, 0x5\n\ -bl __udivsi3\n\ -subs r0, 0x1\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -ldr r0, _081173E8 @ =0x02019000\n\ -adds r0, 0x16\n\ -adds r1, r4, r0\n\ -ldrb r0, [r1]\n\ -cmp r0, 0x3\n\ -bhi _08117428\n\ -ldrb r0, [r1]\n\ -adds r0, 0x1\n\ -b _08117402\n\ -.align 2, 0\n\ -_081173E8: .4byte 0x02019000\n\ -_081173EC:\n\ -subs r0, r4, 0x1\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -ldr r0, _08117408 @ =0x02019000\n\ -adds r0, 0x12\n\ -adds r1, r4, r0\n\ -ldrb r0, [r1]\n\ -cmp r0, 0x2\n\ -bhi _08117428\n\ -ldrb r0, [r1]\n\ -adds r0, 0x2\n\ -_08117402:\n\ -add r0, sp\n\ -ldrb r0, [r0]\n\ -b _0811742A\n\ -.align 2, 0\n\ -_08117408: .4byte 0x02019000\n\ -_0811740C:\n\ -ldr r1, _08117424 @ =0x02019000\n\ -adds r0, r3, 0\n\ -adds r0, 0x8\n\ -adds r0, r2, r0\n\ -ldr r1, [r1, 0x8]\n\ -ldr r0, [r0]\n\ -ands r1, r0\n\ -cmp r1, 0\n\ -bne _08117428\n\ -mov r0, sp\n\ -ldrb r0, [r0, 0x4]\n\ -b _0811742A\n\ -.align 2, 0\n\ -_08117424: .4byte 0x02019000\n\ -_08117428:\n\ -movs r0, 0\n\ -_0811742A:\n\ -add sp, 0x8\n\ -pop {r4}\n\ -pop {r1}\n\ -bx r1\n\ -.syntax divided\n"); + return 0; } -#endif void sub_8117434(void) { -- cgit v1.2.3 From 37c959432205d9c97a2dd8784132085d00bc50bb Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 22:28:39 -0500 Subject: match sub_8116EF8 --- src/roulette.c | 387 ++++++--------------------------------------------------- 1 file changed, 38 insertions(+), 349 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index 3fc7b08c2..3a0328d1c 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -1318,15 +1318,12 @@ u8 sub_8116E5C(u8 r0, u8 r1) return 0x0; } -#ifdef NONMATCHING // stack variable switched with a register variable void sub_8116EF8(u8 r0) { - u32 var0 = 0x0; - struct UnkStruct1 var1[0x3]; - u32 var2; + u16 var0 = 0x0; + u8 var2; u16 var3; - u32 var4; u8 i; switch(r0) { @@ -1336,373 +1333,65 @@ void sub_8116EF8(u8 r0) for (i = (r0 + 0x1); i < (r0 + 0x5); i++) if (!(eRoulette->var08 & gUnknown_083F8C00[i].var08)) var0 |= gUnknown_083F8C00[i].var10; - var0 &= 0xDFFF; - sub_8124CE8(&eRoulette->varB8, var0); + sub_8124CE8(&eRoulette->varB8, var0 &= 0xDFFF); break; default: - memcpy(var1, gUnknown_083F8E9C, 0x18); - if ((u8)(r0 - 0x1) < 0x4) - var2 = 0x3; + { + struct UnkStruct1 var1[0x3]; + memcpy(var1, gUnknown_083F8E9C, sizeof var1); + if (r0 > 0 && r0 < 5) + var2 = 3; else - var2 = 0x1; - var3 = ((r0 / 0x5) - 0x1); - switch((u8)r0 % 0x5) + var2 = 1; + var3 = r0 / 5 - 1; + switch (r0 % 5) { - case 0x1: - var3 = gSprites[eRoulette->var3C[0x7 + 0x0]].oam.paletteNum * 0x10; - break; - case 0x2: - var3 = gSprites[eRoulette->var3C[0x7 + 0x1]].oam.paletteNum * 0x10; - break; - case 0x3: - var3 = gSprites[eRoulette->var3C[0x7 + 0x2]].oam.paletteNum * 0x10; - break; - case 0x4: - var3 = gSprites[eRoulette->var3C[0x7 + 0x3]].oam.paletteNum * 0x10; - break; + case 0x1: + var3 = gSprites[eRoulette->var3C[7 + 0]].oam.paletteNum * 0x10; + break; + case 0x2: + var3 = gSprites[eRoulette->var3C[7 + 1]].oam.paletteNum * 0x10; + break; + case 0x3: + var3 = gSprites[eRoulette->var3C[7 + 2]].oam.paletteNum * 0x10; + break; + case 0x4: + var3 = gSprites[eRoulette->var3C[7 + 3]].oam.paletteNum * 0x10; + break; } - if (var2 == 0x1) + if (var2 == 1) { if (!(eRoulette->var08 & gUnknown_083F8C00[r0].var08)) { - var4 = (r0 / 0x5); - var1[var4 - 0x1].var02 += var3; - sub_812492C(&eRoulette->varB8, 0xD, &var1[var4 - 0x2]); - sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10); + var1[r0 / 5 - 1].var02 += var3; + sub_812492C(&eRoulette->varB8, 13, &var1[r0 / 5 - 1]); } + else + return; } else { - for (i = 0; i < 0x3; i++) + for (i = 0; i < 3; i++) { - u8 var4 = i * 0x5 + r0 + 0x5; + u8 var4 = i * 5 + r0 + 5; if (!(eRoulette->var08 & gUnknown_083F8C00[var4].var08)) { - u8 var5 = (var4 / 0x5); - var1[var5 - 0x1].var02 += var3; - sub_812492C(&eRoulette->varB8, (u8)(0xD + i), &var1[var5 - 0x2]); - if (var2 == 0x3) + var1[var4 / 5 - 1].var02 += var3; + sub_812492C(&eRoulette->varB8, i + 13, &var1[var4 / 5 - 1]); + if (var2 == 3) var0 = gUnknown_083F8C00[var4].var10; var2--; } } - if (var2 != 0x2) - var0 = 0x0; - sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10); + if (var2 != 2) + var0 = 0; } + sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10); + break; + } } } -#else -__attribute__((naked)) -void sub_8116EF8(u8 r0) -{ -asm(".syntax unified\n\ -push {r4-r7,lr}\n\ -mov r7, r10\n\ -mov r6, r9\n\ -mov r5, r8\n\ -push {r5-r7}\n\ -sub sp, 0x20\n\ -lsls r0, 24\n\ -lsrs r6, r0, 24\n\ -movs r0, 0\n\ -str r0, [sp, 0x18]\n\ -cmp r6, 0xA\n\ -beq _08116F1E\n\ -cmp r6, 0xA\n\ -bgt _08116F1A\n\ -cmp r6, 0x5\n\ -beq _08116F1E\n\ -b _08116F7C\n\ -_08116F1A:\n\ -cmp r6, 0xF\n\ -bne _08116F7C\n\ -_08116F1E:\n\ -adds r0, r6, 0x1\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -adds r0, r6, 0x5\n\ -ldr r7, _08116F70 @ =0x020190b8\n\ -cmp r4, r0\n\ -bge _08116F5E\n\ -adds r1, r7, 0\n\ -subs r1, 0xB8\n\ -ldr r3, _08116F74 @ =gUnknown_083F8C00\n\ -ldr r5, [r1, 0x8]\n\ -adds r6, r3, 0\n\ -adds r6, 0x8\n\ -adds r2, r0, 0\n\ -_08116F3A:\n\ -lsls r0, r4, 2\n\ -adds r0, r4\n\ -lsls r1, r0, 2\n\ -adds r0, r1, r6\n\ -ldr r0, [r0]\n\ -ands r0, r5\n\ -cmp r0, 0\n\ -bne _08116F54\n\ -adds r0, r1, r3\n\ -ldrh r0, [r0, 0x10]\n\ -ldr r1, [sp, 0x18]\n\ -orrs r1, r0\n\ -str r1, [sp, 0x18]\n\ -_08116F54:\n\ -adds r0, r4, 0x1\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -cmp r4, r2\n\ -blt _08116F3A\n\ -_08116F5E:\n\ -ldr r0, _08116F78 @ =0x0000dfff\n\ -ldr r2, [sp, 0x18]\n\ -ands r2, r0\n\ -str r2, [sp, 0x18]\n\ -adds r0, r7, 0\n\ -adds r1, r2, 0\n\ -bl sub_8124CE8\n\ -b _0811713C\n\ -.align 2, 0\n\ -_08116F70: .4byte 0x020190b8\n\ -_08116F74: .4byte gUnknown_083F8C00\n\ -_08116F78: .4byte 0x0000dfff\n\ -_08116F7C:\n\ -mov r0, sp\n\ -ldr r1, _08116FC8 @ =gUnknown_083F8E9C\n\ -ldm r1!, {r2-r4}\n\ -stm r0!, {r2-r4}\n\ -ldm r1!, {r2-r4}\n\ -stm r0!, {r2-r4}\n\ -subs r0, r6, 0x1\n\ -lsls r0, 24\n\ -lsrs r0, 24\n\ -movs r3, 0x1\n\ -mov r10, r3\n\ -cmp r0, 0x3\n\ -bhi _08116F9A\n\ -movs r4, 0x3\n\ -mov r10, r4\n\ -_08116F9A:\n\ -adds r0, r6, 0\n\ -movs r1, 0x5\n\ -bl __udivsi3\n\ -lsls r0, 24\n\ -lsrs r0, 8\n\ -ldr r1, _08116FCC @ =0xffff0000\n\ -adds r0, r1\n\ -lsrs r7, r0, 16\n\ -adds r0, r6, 0\n\ -movs r1, 0x5\n\ -bl __umodsi3\n\ -lsls r0, 24\n\ -lsrs r0, 24\n\ -cmp r0, 0x2\n\ -beq _08116FF8\n\ -cmp r0, 0x2\n\ -bgt _08116FD4\n\ -cmp r0, 0x1\n\ -beq _08116FE4\n\ -ldr r4, _08116FD0 @ =0x02019000\n\ -b _0811703A\n\ -.align 2, 0\n\ -_08116FC8: .4byte gUnknown_083F8E9C\n\ -_08116FCC: .4byte 0xffff0000\n\ -_08116FD0: .4byte 0x02019000\n\ -_08116FD4:\n\ -cmp r0, 0x3\n\ -beq _0811700C\n\ -cmp r0, 0x4\n\ -beq _08117020\n\ -ldr r4, _08116FE0 @ =0x02019000\n\ -b _0811703A\n\ -.align 2, 0\n\ -_08116FE0: .4byte 0x02019000\n\ -_08116FE4:\n\ -ldr r3, _08116FF0 @ =gSprites\n\ -ldr r2, _08116FF4 @ =0x02019000\n\ -adds r0, r2, 0\n\ -adds r0, 0x43\n\ -b _08117028\n\ -.align 2, 0\n\ -_08116FF0: .4byte gSprites\n\ -_08116FF4: .4byte 0x02019000\n\ -_08116FF8:\n\ -ldr r3, _08117004 @ =gSprites\n\ -ldr r2, _08117008 @ =0x02019000\n\ -adds r0, r2, 0\n\ -adds r0, 0x44\n\ -b _08117028\n\ -.align 2, 0\n\ -_08117004: .4byte gSprites\n\ -_08117008: .4byte 0x02019000\n\ -_0811700C:\n\ -ldr r3, _08117018 @ =gSprites\n\ -ldr r2, _0811701C @ =0x02019000\n\ -adds r0, r2, 0\n\ -adds r0, 0x45\n\ -b _08117028\n\ -.align 2, 0\n\ -_08117018: .4byte gSprites\n\ -_0811701C: .4byte 0x02019000\n\ -_08117020:\n\ -ldr r3, _08117088 @ =gSprites\n\ -ldr r2, _0811708C @ =0x02019000\n\ -adds r0, r2, 0\n\ -adds r0, 0x46\n\ -_08117028:\n\ -ldrb r1, [r0]\n\ -lsls r0, r1, 4\n\ -adds r0, r1\n\ -lsls r0, 2\n\ -adds r0, r3\n\ -ldrb r0, [r0, 0x5]\n\ -lsrs r0, 4\n\ -lsls r7, r0, 4\n\ -adds r4, r2, 0\n\ -_0811703A:\n\ -mov r2, r10\n\ -cmp r2, 0x1\n\ -bne _08117094\n\ -ldr r1, _08117090 @ =gUnknown_083F8C00\n\ -lsls r2, r6, 2\n\ -adds r0, r2, r6\n\ -lsls r0, 2\n\ -adds r1, 0x8\n\ -adds r0, r1\n\ -ldr r1, [r4, 0x8]\n\ -ldr r0, [r0]\n\ -ands r1, r0\n\ -str r2, [sp, 0x1C]\n\ -cmp r1, 0\n\ -bne _0811713C\n\ -adds r0, r6, 0\n\ -movs r1, 0x5\n\ -bl __udivsi3\n\ -lsls r0, 24\n\ -lsrs r0, 24\n\ -subs r1, r0, 0x1\n\ -lsls r1, 3\n\ -mov r3, sp\n\ -adds r2, r3, r1\n\ -ldrh r1, [r2, 0x2]\n\ -adds r1, r7, r1\n\ -strh r1, [r2, 0x2]\n\ -adds r1, r4, 0\n\ -adds r1, 0xB8\n\ -lsls r0, 3\n\ -subs r0, 0x8\n\ -adds r2, r3, r0\n\ -adds r0, r1, 0\n\ -movs r1, 0xD\n\ -bl sub_812492C\n\ -b _08117122\n\ -.align 2, 0\n\ -_08117088: .4byte gSprites\n\ -_0811708C: .4byte 0x02019000\n\ -_08117090: .4byte gUnknown_083F8C00\n\ -_08117094:\n\ -movs r4, 0\n\ -lsls r0, r6, 2\n\ -str r0, [sp, 0x1C]\n\ -ldr r1, _0811714C @ =0x02019000\n\ -mov r8, r1\n\ -ldr r2, _08117150 @ =gUnknown_083F8C00\n\ -mov r9, r2\n\ -_081170A2:\n\ -lsls r0, r4, 2\n\ -adds r0, r4\n\ -adds r0, r6, r0\n\ -adds r0, 0x5\n\ -lsls r0, 24\n\ -lsrs r2, r0, 24\n\ -lsls r0, r2, 2\n\ -adds r0, r2\n\ -lsls r5, r0, 2\n\ -mov r0, r9\n\ -adds r0, 0x8\n\ -adds r0, r5, r0\n\ -mov r3, r8\n\ -ldr r1, [r3, 0x8]\n\ -ldr r0, [r0]\n\ -ands r1, r0\n\ -cmp r1, 0\n\ -bne _0811710E\n\ -adds r0, r2, 0\n\ -movs r1, 0x5\n\ -bl __udivsi3\n\ -lsls r0, 24\n\ -lsrs r0, 24\n\ -subs r1, r0, 0x1\n\ -lsls r1, 3\n\ -mov r3, sp\n\ -adds r2, r3, r1\n\ -ldrh r1, [r2, 0x2]\n\ -adds r1, r7, r1\n\ -strh r1, [r2, 0x2]\n\ -adds r1, r4, 0\n\ -adds r1, 0xD\n\ -lsls r1, 24\n\ -lsrs r1, 24\n\ -lsls r0, 3\n\ -subs r0, 0x8\n\ -adds r2, r3, r0\n\ -mov r0, r8\n\ -adds r0, 0xB8\n\ -bl sub_812492C\n\ -mov r0, r10\n\ -cmp r0, 0x3\n\ -bne _08117104\n\ -mov r1, r9\n\ -adds r0, r5, r1\n\ -ldrh r0, [r0, 0x10]\n\ -str r0, [sp, 0x18]\n\ -_08117104:\n\ -mov r0, r10\n\ -subs r0, 0x1\n\ -lsls r0, 24\n\ -lsrs r0, 24\n\ -mov r10, r0\n\ -_0811710E:\n\ -adds r0, r4, 0x1\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -cmp r4, 0x2\n\ -bls _081170A2\n\ -mov r2, r10\n\ -cmp r2, 0x2\n\ -beq _08117122\n\ -movs r3, 0\n\ -str r3, [sp, 0x18]\n\ -_08117122:\n\ -ldr r0, _08117154 @ =0x020190b8\n\ -ldr r2, _08117150 @ =gUnknown_083F8C00\n\ -ldr r4, [sp, 0x1C]\n\ -adds r1, r4, r6\n\ -lsls r1, 2\n\ -adds r1, r2\n\ -ldrh r1, [r1, 0x10]\n\ -ldr r2, [sp, 0x18]\n\ -orrs r2, r1\n\ -str r2, [sp, 0x18]\n\ -adds r1, r2, 0\n\ -bl sub_8124CE8\n\ -_0811713C:\n\ -add sp, 0x20\n\ -pop {r3-r5}\n\ -mov r8, r3\n\ -mov r9, r4\n\ -mov r10, r5\n\ -pop {r4-r7}\n\ -pop {r0}\n\ -bx r0\n\ -.align 2, 0\n\ -_0811714C: .4byte 0x02019000\n\ -_08117150: .4byte gUnknown_083F8C00\n\ -_08117154: .4byte 0x020190b8\n\ -.syntax divided\n"); -} -#endif - #ifdef NONMATCHING //not enough stack usage void sub_8117158(u8 r0) { -- cgit v1.2.3 From d9bd118cb5ac2cdc4c89e0105d4961263fe8d1b3 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 22:53:44 -0500 Subject: match sub_8117158 --- src/roulette.c | 295 ++------------------------------------------------------- 1 file changed, 10 insertions(+), 285 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index 3a0328d1c..7d88192e1 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -1392,19 +1392,18 @@ void sub_8116EF8(u8 r0) } } -#ifdef NONMATCHING //not enough stack usage void sub_8117158(u8 r0) { - u8 i; - u8 l; + vu8 i; + vu8 z; + vu16 var1; + vu16 var2; + vu8 var0; u8 v[0x5]; - u8 z; - u8 var0; - u8 var1; - u16 var2; + u8 l; eRoulette->var2A = 0x1; sub_8117AA8(0x0, 0x0); - sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18800, 0xE, 0x7, 0x10, 0xD); + sub_8124E2C(gBGTilemapBuffers[1], (u16 *)ewram18800, 0xE, 0x7, 0x10, 0xD); switch(r0) { case 0x0: @@ -1427,291 +1426,17 @@ void sub_8117158(u8 r0) } for (i = 0x0; i < l; i++) { - //_0811727C var0 = gUnknown_083F8C00[v[i]].var06; var1 = gUnknown_083F8C00[v[i]].var03; for (z = 0; z < 0x3; z++) { var2 = (gUnknown_083F8C00[v[i]].var04 + z) * 0x20; - gBGTilemapBuffers[2][var2 + var1 + 0x0] = ewram189a0[(var0 + z) * 0x3 + 0x0]; - gBGTilemapBuffers[2][var2 + var1 + 0x1] = ewram189a0[(var0 + z) * 0x3 + 0x1]; - gBGTilemapBuffers[2][var2 + var1 + 0x2] = ewram189a0[(var0 + z) * 0x3 + 0x2]; + gBGTilemapBuffers[1][var1 + var2 + 0x0] = ewram189a0[(var0 + z) * 0x3 + 0x0]; + gBGTilemapBuffers[1][var1 + var2 + 0x1] = ewram189a0[(var0 + z) * 0x3 + 0x1]; + gBGTilemapBuffers[1][var1 + var2 + 0x2] = ewram189a0[(var0 + z) * 0x3 + 0x2]; } - //_08117350 } } -#else -__attribute__((naked)) -void sub_8117158(u8 r0) -{ -asm(".syntax unified\n\ -push {r4-r7,lr}\n\ -mov r7, r10\n\ -mov r6, r9\n\ -mov r5, r8\n\ -push {r5-r7}\n\ -sub sp, 0x24\n\ -lsls r0, 24\n\ -lsrs r5, r0, 24\n\ -ldr r4, _0811719C @ =0x02019000\n\ -movs r0, 0x1\n\ -strh r0, [r4, 0x2A]\n\ -movs r0, 0\n\ -movs r1, 0\n\ -bl sub_8117AA8\n\ -ldr r0, _081171A0 @ =gBGTilemapBuffers + 0x800\n\ -ldr r1, _081171A4 @ =0xfffff800\n\ -adds r4, r1\n\ -movs r1, 0x10\n\ -str r1, [sp]\n\ -movs r1, 0xD\n\ -str r1, [sp, 0x4]\n\ -adds r1, r4, 0\n\ -movs r2, 0xE\n\ -movs r3, 0x7\n\ -bl sub_8124E2C\n\ -cmp r5, 0xF\n\ -bhi _08117250\n\ -lsls r0, r5, 2\n\ -ldr r1, _081171A8 @ =_081171AC\n\ -adds r0, r1\n\ -ldr r0, [r0]\n\ -mov pc, r0\n\ -.align 2, 0\n\ -_0811719C: .4byte 0x02019000\n\ -_081171A0: .4byte gBGTilemapBuffers + 0x800\n\ -_081171A4: .4byte 0xfffff800\n\ -_081171A8: .4byte _081171AC\n\ -.align 2, 0\n\ -_081171AC:\n\ -.4byte _08117360\n\ -.4byte _081171EC\n\ -.4byte _081171EC\n\ -.4byte _081171EC\n\ -.4byte _081171EC\n\ -.4byte _08117220\n\ -.4byte _08117250\n\ -.4byte _08117250\n\ -.4byte _08117250\n\ -.4byte _08117250\n\ -.4byte _08117220\n\ -.4byte _08117250\n\ -.4byte _08117250\n\ -.4byte _08117250\n\ -.4byte _08117250\n\ -.4byte _08117220\n\ -_081171EC:\n\ -movs r0, 0x4\n\ -str r0, [sp, 0x18]\n\ -add r1, sp, 0x8\n\ -movs r0, 0\n\ -strb r0, [r1]\n\ -adds r0, r1, 0\n\ -ldrb r0, [r0]\n\ -cmp r0, 0x3\n\ -bhi _08117258\n\ -add r4, sp, 0x10\n\ -adds r3, r1, 0\n\ -_08117202:\n\ -ldrb r2, [r3]\n\ -adds r2, r4\n\ -ldrb r1, [r3]\n\ -lsls r0, r1, 2\n\ -adds r0, r1\n\ -adds r0, r5, r0\n\ -strb r0, [r2]\n\ -ldrb r0, [r3]\n\ -adds r0, 0x1\n\ -strb r0, [r3]\n\ -ldrb r0, [r3]\n\ -ldr r1, [sp, 0x18]\n\ -cmp r0, r1\n\ -bcc _08117202\n\ -b _08117258\n\ -_08117220:\n\ -movs r0, 0x5\n\ -str r0, [sp, 0x18]\n\ -add r1, sp, 0x8\n\ -movs r0, 0\n\ -strb r0, [r1]\n\ -adds r0, r1, 0\n\ -ldrb r0, [r0]\n\ -cmp r0, 0x4\n\ -bhi _08117258\n\ -add r3, sp, 0x10\n\ -adds r2, r1, 0\n\ -_08117236:\n\ -ldrb r1, [r2]\n\ -adds r1, r3\n\ -ldrb r0, [r2]\n\ -adds r0, r5, r0\n\ -strb r0, [r1]\n\ -ldrb r0, [r2]\n\ -adds r0, 0x1\n\ -strb r0, [r2]\n\ -ldrb r0, [r2]\n\ -ldr r1, [sp, 0x18]\n\ -cmp r0, r1\n\ -bcc _08117236\n\ -b _08117258\n\ -_08117250:\n\ -movs r0, 0x1\n\ -str r0, [sp, 0x18]\n\ -add r0, sp, 0x10\n\ -strb r5, [r0]\n\ -_08117258:\n\ -add r1, sp, 0x8\n\ -movs r0, 0\n\ -strb r0, [r1]\n\ -adds r0, r1, 0\n\ -ldrb r0, [r0]\n\ -ldr r1, [sp, 0x18]\n\ -cmp r0, r1\n\ -bcs _08117360\n\ -mov r0, sp\n\ -adds r0, 0xE\n\ -str r0, [sp, 0x1C]\n\ -add r1, sp, 0x10\n\ -mov r9, r1\n\ -add r0, sp, 0x8\n\ -mov r12, r0\n\ -mov r1, sp\n\ -adds r1, 0xA\n\ -str r1, [sp, 0x20]\n\ -_0811727C:\n\ -mov r1, r12\n\ -ldrb r0, [r1]\n\ -add r0, r9\n\ -ldrb r1, [r0]\n\ -lsls r0, r1, 2\n\ -adds r0, r1\n\ -lsls r0, 2\n\ -ldr r1, _08117370 @ =gUnknown_083F8C00\n\ -adds r0, r1\n\ -ldrb r0, [r0, 0x6]\n\ -ldr r1, [sp, 0x1C]\n\ -strb r0, [r1]\n\ -mov r1, r12\n\ -ldrb r0, [r1]\n\ -add r0, r9\n\ -ldrb r1, [r0]\n\ -lsls r0, r1, 2\n\ -adds r0, r1\n\ -lsls r0, 2\n\ -ldr r1, _08117370 @ =gUnknown_083F8C00\n\ -adds r0, r1\n\ -ldrb r0, [r0, 0x3]\n\ -ldr r1, [sp, 0x20]\n\ -strh r0, [r1]\n\ -mov r4, sp\n\ -adds r4, 0x9\n\ -movs r0, 0\n\ -strb r0, [r4]\n\ -ldrb r0, [r4]\n\ -cmp r0, 0x2\n\ -bhi _08117350\n\ -add r5, sp, 0xC\n\ -ldr r7, [sp, 0x20]\n\ -ldr r0, _08117374 @ =gBGTilemapBuffers + 0x800\n\ -mov r8, r0\n\ -ldr r6, [sp, 0x1C]\n\ -ldr r1, _08117378 @ =0x020189a0\n\ -mov r10, r1\n\ -_081172C8:\n\ -mov r1, r12\n\ -ldrb r0, [r1]\n\ -add r0, r9\n\ -ldrb r0, [r0]\n\ -lsls r1, r0, 2\n\ -adds r1, r0\n\ -lsls r1, 2\n\ -ldr r0, _08117370 @ =gUnknown_083F8C00\n\ -adds r1, r0\n\ -adds r3, r4, 0\n\ -ldrb r0, [r4]\n\ -ldrb r1, [r1, 0x4]\n\ -adds r0, r1\n\ -lsls r0, 5\n\ -strh r0, [r5]\n\ -ldrh r0, [r7]\n\ -ldrh r2, [r5]\n\ -adds r2, r0\n\ -lsls r2, 1\n\ -add r2, r8\n\ -ldrb r0, [r6]\n\ -ldrb r1, [r4]\n\ -adds r1, r0\n\ -lsls r0, r1, 1\n\ -adds r0, r1\n\ -lsls r0, 1\n\ -add r0, r10\n\ -ldrh r0, [r0]\n\ -strh r0, [r2]\n\ -ldrh r0, [r7]\n\ -ldrh r2, [r5]\n\ -adds r2, r0\n\ -adds r2, 0x1\n\ -lsls r2, 1\n\ -add r2, r8\n\ -ldrb r0, [r6]\n\ -ldrb r1, [r4]\n\ -adds r1, r0\n\ -lsls r0, r1, 1\n\ -adds r0, r1\n\ -lsls r0, 1\n\ -mov r1, r10\n\ -adds r1, 0x2\n\ -adds r0, r1\n\ -ldrh r0, [r0]\n\ -strh r0, [r2]\n\ -ldrh r0, [r7]\n\ -ldrh r2, [r5]\n\ -adds r2, r0\n\ -adds r2, 0x2\n\ -lsls r2, 1\n\ -add r2, r8\n\ -ldrb r0, [r6]\n\ -ldrb r1, [r4]\n\ -adds r1, r0\n\ -lsls r0, r1, 1\n\ -adds r0, r1\n\ -lsls r0, 1\n\ -ldr r1, _0811737C @ =0x020189a4\n\ -adds r0, r1\n\ -ldrh r0, [r0]\n\ -strh r0, [r2]\n\ -ldrb r0, [r4]\n\ -adds r0, 0x1\n\ -strb r0, [r4]\n\ -ldrb r0, [r3]\n\ -cmp r0, 0x2\n\ -bls _081172C8\n\ -_08117350:\n\ -mov r1, r12\n\ -ldrb r0, [r1]\n\ -adds r0, 0x1\n\ -strb r0, [r1]\n\ -ldrb r0, [r1]\n\ -ldr r1, [sp, 0x18]\n\ -cmp r0, r1\n\ -bcc _0811727C\n\ -_08117360:\n\ -add sp, 0x24\n\ -pop {r3-r5}\n\ -mov r8, r3\n\ -mov r9, r4\n\ -mov r10, r5\n\ -pop {r4-r7}\n\ -pop {r0}\n\ -bx r0\n\ -.align 2, 0\n\ -_08117370: .4byte gUnknown_083F8C00\n\ -_08117374: .4byte gBGTilemapBuffers + 0x800\n\ -_08117378: .4byte 0x020189a0\n\ -_0811737C: .4byte 0x020189a4\n\ -.syntax divided\n"); -} -#endif u8 sub_8117380(u8 r0) { -- cgit v1.2.3 From 2df648dc4b9dee51503d319c677456c008b438fb Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Tue, 30 Jan 2018 19:56:12 -0800 Subject: Finish decompiling rock.s --- src/battle/anim/rock.c | 331 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 329 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c index 26ac78053..b113ce040 100644 --- a/src/battle/anim/rock.c +++ b/src/battle/anim/rock.c @@ -4,24 +4,35 @@ #include "decompress.h" #include "palette.h" #include "rom_8077ABC.h" +#include "sound.h" #include "task.h" #include "trig.h" +#include "constants/songs.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +extern u32 gAnimMoveDmg; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG3_Y; extern const u8 gBattleAnimBackgroundTilemap_SandstormBrew[]; extern const u8 gBattleAnimBackgroundImage_SandstormBrew[]; extern const u16 gBattleAnimSpritePalette_261[]; +extern const struct SpriteTemplate gSpriteTemplate_83DAD78; +extern const struct SpriteTemplate gSpriteTemplate_83DAD90; extern const struct SubspriteTable gUnknown_083DAD10; static void sub_80DCF1C(struct Sprite *sprite); static void sub_80DD02C(struct Sprite *sprite); -void sub_80DD190(u8 taskId); +static void sub_80DD190(u8 taskId); +static void sub_80DD604(u8 taskId); +static void sub_80DD774(struct Task *task); +static u8 sub_80DD8BC(void); +static void sub_80DD928(struct Sprite *sprite); +static void sub_80DD9FC(struct Sprite *sprite); void sub_80DCE9C(struct Sprite *sprite) @@ -150,7 +161,7 @@ void do_boulder_dust(u8 taskId) gTasks[taskId].func = sub_80DD190; } -void sub_80DD190(u8 taskId) +static void sub_80DD190(u8 taskId) { struct Struct_sub_8078914 subStruct; @@ -273,3 +284,319 @@ void sub_80DD490(struct Sprite *sprite) sprite->callback = sub_8078B34; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } + +void sub_80DD4D4(u8 taskId) +{ + u16 var0, var1, var2, var3; + u8 var4; + int var5; + s16 pan1, pan2; + struct Task *task; + + task = &gTasks[taskId]; + + var0 = GetBankPosition(gAnimBankAttacker, 2); + var1 = GetBankPosition(gAnimBankAttacker, 1) + 24; + var2 = GetBankPosition(gAnimBankTarget, 2); + var3 = GetBankPosition(gAnimBankTarget, 1) + 24; + + if ((gAnimBankAttacker ^ 2) == gAnimBankTarget) + var3 = var1; + + var4 = sub_80DD8BC(); + if (var4 == 1) + task->data[8] = 32; + else + task->data[8] = 48 - (var4 * 8); + + task->data[0] = 0; + task->data[11] = 0; + task->data[9] = 0; + task->data[12] = 1; + + var5 = task->data[8]; + if (var5 < 0) + var5 += 7; + + task->data[10] = (var5 >> 3) - 1; + + task->data[2] = var0 * 8; + task->data[3] = var1 * 8; + task->data[4] = ((var2 - var0) * 8) / task->data[8]; + task->data[5] = ((var3 - var1) * 8) / task->data[8]; + task->data[6] = 0; + task->data[7] = 0; + + pan1 = BattleAnimAdjustPanning(-64); + pan2 = BattleAnimAdjustPanning(63); + + task->data[13] = pan1; + task->data[14] = (pan2 - pan1) / task->data[8]; + task->data[1] = var4; + task->data[15] = GetAnimBankSpriteId(0); + + task->func = sub_80DD604; +} + +static void sub_80DD604(u8 taskId) +{ + struct Task *task; + + task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[6] -= task->data[4]; + task->data[7] -= task->data[5]; + gSprites[task->data[15]].pos2.x = task->data[6] >> 3; + gSprites[task->data[15]].pos2.y = task->data[7] >> 3; + + if (++task->data[9] == 10) + { + task->data[11] = 20; + task->data[0]++; + } + + PlaySE12WithPanning(SE_W029, task->data[13]); + break; + case 1: + if (--task->data[11] == 0) + task->data[0]++; + break; + case 2: + if (--task->data[9] != 0) + { + task->data[6] += task->data[4]; + task->data[7] += task->data[5]; + } + else + { + task->data[6] = 0; + task->data[7] = 0; + task->data[0]++; + } + + gSprites[task->data[15]].pos2.x = task->data[6] >> 3; + gSprites[task->data[15]].pos2.y = task->data[7] >> 3; + break; + case 3: + task->data[2] += task->data[4]; + task->data[3] += task->data[5]; + if (++task->data[9] >= task->data[10]) + { + task->data[9] = 0; + sub_80DD774(task); + task->data[13] += task->data[14]; + PlaySE12WithPanning(SE_W091, task->data[13]); + } + + if (--task->data[8] == 0) + { + task->data[0]++; + } + break; + case 4: + if (task->data[11] == 0) + DestroyAnimVisualTask(taskId); + break; + } +} + +static void sub_80DD774(struct Task *task) +{ + const struct SpriteTemplate *spriteTemplate; + int var0; + u16 x, y; + u8 spriteId; + + switch (task->data[1]) + { + case 1: + spriteTemplate = &gSpriteTemplate_83DAD78; + var0 = 0; + break; + case 2: + case 3: + spriteTemplate = &gSpriteTemplate_83DAD90; + var0 = 80; + break; + case 4: + spriteTemplate = &gSpriteTemplate_83DAD90; + var0 = 64; + break; + case 5: + spriteTemplate = &gSpriteTemplate_83DAD90; + var0 = 48; + break; + default: + return; + } + + x = task->data[2] >> 3; + y = task->data[3] >> 3; + x += (task->data[12] * 4); + + spriteId = CreateSprite(spriteTemplate, x, y, 35); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = 18; + gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3); + gSprites[spriteId].data[4] = y; + gSprites[spriteId].data[5] = -16 - (task->data[1] * 2); + gSprites[spriteId].oam.tileNum += var0; + + sub_80786EC(&gSprites[spriteId]); + task->data[11]++; + } + + task->data[12] *= -1; +} + +void sub_80DD87C(struct Sprite *sprite) +{ + if (sub_8078718(sprite)) + { + u8 taskId = FindTaskIdByFunc(sub_80DD604); + if (taskId != 0xFF) + gTasks[taskId].data[11]--; + + DestroySprite(sprite); + } +} + +u8 sub_80DD8BC(void) +{ + u8 retVal = gAnimDisableStructPtr->rolloutTimer2 - gAnimDisableStructPtr->rolloutTimer1; + u8 var0 = retVal - 1; + if (var0 > 4) + { + retVal = 1; + } + + return retVal; +} + +void sub_80DD8E8(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[4]); + + sprite->pos2.x = gBattleAnimArgs[0]; + sprite->data[2] = gBattleAnimArgs[1]; + sprite->data[3] -= gBattleAnimArgs[2]; + sprite->data[0] = 3; + sprite->data[1] = gBattleAnimArgs[3]; + sprite->callback = sub_80DD928; + sprite->invisible = 1; +} + +static void sub_80DD928(struct Sprite *sprite) +{ + sprite->invisible = 0; + if (sprite->data[3] != 0) + { + sprite->pos2.y = sprite->data[2] + sprite->data[3]; + sprite->data[3] += sprite->data[0]; + sprite->data[0]++; + if (sprite->data[3] > 0) + { + sprite->data[3] = 0; + } + } + else + { + if (--sprite->data[1] == 0) + { + DestroyAnimSprite(sprite); + } + } +} + +void sub_80DD978(struct Sprite *sprite) +{ + if (GetBankSide(gAnimBankAttacker) == SIDE_OPPONENT) + StartSpriteAffineAnim(sprite, 1); + + sub_807941C(sprite); +} + +void sub_80DD9A4(struct Sprite *sprite) +{ + sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0); + sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1); + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + + sprite->data[1] = gBattleAnimArgs[0]; + sprite->data[2] = gBattleAnimArgs[1]; + sprite->data[5] = gBattleAnimArgs[2]; + + StartSpriteAnim(sprite, gBattleAnimArgs[3]); + sprite->callback = sub_80DD9FC; +} + +static void sub_80DD9FC(struct Sprite *sprite) +{ + sprite->data[0] += 8; + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + + sprite->pos2.x += sprite->data[3] / 40; + sprite->pos2.y -= Sin(sprite->data[0], sprite->data[5]); + + if (sprite->data[0] > 140) + DestroyAnimSprite(sprite); +} + +void sub_80DDA4C(u8 taskId) +{ + if ((s32)gAnimMoveDmg < 33) + gBattleAnimArgs[7] = 0; + if (gAnimMoveDmg - 33 < 33) + gBattleAnimArgs[7] = 1; + if ((s32)gAnimMoveDmg > 65) + gBattleAnimArgs[7] = 2; + + DestroyAnimVisualTask(taskId); +} + +void sub_80DDA8C(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + sub_80789D4(0); + gTasks[taskId].data[1] = 200; + } + + gBattle_BG3_Y += gTasks[taskId].data[1] / 10; + gTasks[taskId].data[1] -= 3; + + if (gTasks[taskId].data[0] == 120) + { + sub_80789D4(1); + DestroyAnimVisualTask(taskId); + } + + gTasks[taskId].data[0]++; +} + +void sub_80DDAF0(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + sub_80789D4(0); + gTasks[taskId].data[0]++; + gTasks[taskId].data[2] = gBattle_BG3_Y; + } + + gTasks[taskId].data[1] += 80; + gTasks[taskId].data[1] &= 0xFF; + gBattle_BG3_Y = gTasks[taskId].data[2] + Cos(4, gTasks[taskId].data[1]); + + if (gBattleAnimArgs[7] == 0xFFF) + { + gBattle_BG3_Y = 0; + sub_80789D4(1); + DestroyAnimVisualTask(taskId); + } +} -- cgit v1.2.3 From 262d7db3073e1d0a6c56354d5ec9e4626338396d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 30 Jan 2018 23:24:05 -0500 Subject: match sub_8117E98 --- src/roulette.c | 114 +++++++-------------------------------------------------- 1 file changed, 14 insertions(+), 100 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index 7d88192e1..b84b74e3e 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -1779,111 +1779,25 @@ void sub_8117DF4(void) } } -#ifdef NONMATCHING void sub_8117E98(struct Sprite *sprite) { - struct OamMatrix *m; - u8 p; - u16 angle; - s16 cos, sin, z; - u32 cos32; - angle = eRoulette->var24 + sprite->data[0x0]; - z = angle; - if (z > 359) - angle = z - 360; + s16 cos; + s16 sin; + u32 matrixNum; + s16 angle = eRoulette->var24 + sprite->data[0]; + if (angle >= 360) + angle -= 360; sin = Sin2(angle); cos = Cos2(angle); - sprite->pos2.x = sin * sprite->data[0x1] >> 0xC; - sprite->pos2.y = -cos * sprite->data[0x1] >> 0xC; - p = sprite->oam.matrixNum; - sin = sin / 0x10; - m = &gOamMatrices[p]; - cos32 = cos / 0x10; - - m->d = cos32; - m->a = cos32; - m->b = sin; - m->c = -sin; -} -#else -__attribute__((naked)) -void sub_8117E98(struct Sprite *r0) -{ -asm(".syntax unified\n\ -push {r4-r6,lr}\n\ -adds r6, r0, 0\n\ -ldr r0, _08117F1C @ =0x02019000\n\ -ldrh r1, [r6, 0x2E]\n\ -ldrh r0, [r0, 0x24]\n\ -adds r1, r0\n\ -lsls r1, 16\n\ -lsrs r4, r1, 16\n\ -asrs r1, 16\n\ -ldr r0, _08117F20 @ =0x00000167\n\ -cmp r1, r0\n\ -ble _08117EB8\n\ -ldr r2, _08117F24 @ =0xfffffe98\n\ -adds r0, r1, r2\n\ -lsls r0, 16\n\ -lsrs r4, r0, 16\n\ -_08117EB8:\n\ -adds r0, r4, 0\n\ -bl Sin2\n\ -lsls r0, 16\n\ -lsrs r5, r0, 16\n\ -adds r0, r4, 0\n\ -bl Cos2\n\ -lsls r2, r5, 16\n\ -asrs r2, 16\n\ -movs r3, 0x30\n\ -ldrsh r1, [r6, r3]\n\ -muls r1, r2\n\ -asrs r1, 12\n\ -strh r1, [r6, 0x24]\n\ -lsls r0, 16\n\ -asrs r4, r0, 16\n\ -negs r1, r4\n\ -movs r3, 0x30\n\ -ldrsh r0, [r6, r3]\n\ -muls r0, r1\n\ -asrs r0, 12\n\ -strh r0, [r6, 0x26]\n\ -ldrb r0, [r6, 0x3]\n\ -lsls r0, 26\n\ -lsrs r3, r0, 27\n\ -cmp r2, 0\n\ -bge _08117EF2\n\ -adds r2, 0xF\n\ -_08117EF2:\n\ -lsls r0, r2, 12\n\ -lsrs r5, r0, 16\n\ -ldr r1, _08117F28 @ =gOamMatrices\n\ -lsls r0, r3, 3\n\ -adds r1, r0, r1\n\ -adds r0, r4, 0\n\ -cmp r0, 0\n\ -bge _08117F04\n\ -adds r0, 0xF\n\ -_08117F04:\n\ -asrs r0, 4\n\ -strh r0, [r1, 0x6]\n\ -strh r0, [r1]\n\ -strh r5, [r1, 0x2]\n\ -lsls r0, r5, 16\n\ -asrs r0, 16\n\ -negs r0, r0\n\ -strh r0, [r1, 0x4]\n\ -pop {r4-r6}\n\ -pop {r0}\n\ -bx r0\n\ -.align 2, 0\n\ -_08117F1C: .4byte 0x02019000\n\ -_08117F20: .4byte 0x00000167\n\ -_08117F24: .4byte 0xfffffe98\n\ -_08117F28: .4byte gOamMatrices\n\ -.syntax divided\n"); + sprite->pos2.x = sin * sprite->data[1] >> 0xC; + sprite->pos2.y = -cos * sprite->data[1] >> 0xC; + matrixNum = sprite->oam.matrixNum; + sin /= 16; + gOamMatrices[matrixNum].d = cos /= 16; + gOamMatrices[matrixNum].a = cos; + gOamMatrices[matrixNum].b = sin; + gOamMatrices[matrixNum].c = -sin; } -#endif void sub_8117F2C(void) { -- cgit v1.2.3 From 4d9d458b8020f3ef1d8336d7c54c8f75ff0c0af5 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 31 Jan 2018 08:33:40 -0500 Subject: match sub_81181E8 --- src/roulette.c | 126 ++++++--------------------------------------------------- 1 file changed, 13 insertions(+), 113 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index b84b74e3e..ebe2e8f56 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -1855,132 +1855,32 @@ void sub_81180F4(u16 r0) } } -#ifdef NONMATCHING u8 sub_81181E8(u8 r0) { - u8 t[0x5]; - memcpy(&t, &gUnknown_083FA608, 0x5); - if (r0 > 0x13) - r0 = 0x0; + u8 t[5]; + memcpy(t, gUnknown_083FA608, sizeof t); + // u8 t = {0, 1, 2, 3, 4}; + if (r0 >= 20) + r0 = 0; switch(gUnknown_083F8C00[r0].var01_0) { case 0x3: - r0 = r0 / 0x5 - 0x1; - if ((u32)eRoulette->var16[r0] < 0x4) - return t[0x1 + eRoulette->var16[r0]]; // couldn't recreate redundant loads + r0 = r0 / 5 - 1; + if (eRoulette->var16[r0] < 4) + return t[((vu8 *)eRoulette->var16)[r0] + 1]; // couldn't recreate redundant loads break; case 0x4: - r0 = r0 - 0x1; - if (eRoulette->var12[r0] < 0x3) - return t[0x2 + eRoulette->var12[r0]]; + r0--; + if (eRoulette->var12[r0] < 3) + return t[((vu8 *)eRoulette->var12)[r0] + 2]; break; case 0xC: if (!(eRoulette->var08 & gUnknown_083F8C00[r0].var08)) - return t[0x4]; + return t[4]; break; } - return 0x0; -} -#else -__attribute__((naked)) -u8 sub_81181E8(u8 r0) -{ -asm(".syntax unified\n\ -push {r4,lr}\n\ -sub sp, 0x8\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -ldr r1, _08118220 @ =gUnknown_083FA608\n\ -mov r0, sp\n\ -movs r2, 0x5\n\ -bl memcpy\n\ -cmp r4, 0x13\n\ -bls _08118200\n\ -movs r4, 0\n\ -_08118200:\n\ -ldr r3, _08118224 @ =gUnknown_083F8C00\n\ -lsls r0, r4, 2\n\ -adds r0, r4\n\ -lsls r2, r0, 2\n\ -adds r0, r2, r3\n\ -ldrb r0, [r0, 0x1]\n\ -lsls r0, 28\n\ -lsrs r0, 28\n\ -cmp r0, 0x4\n\ -beq _08118254\n\ -cmp r0, 0x4\n\ -bgt _08118228\n\ -cmp r0, 0x3\n\ -beq _0811822E\n\ -b _08118290\n\ -.align 2, 0\n\ -_08118220: .4byte gUnknown_083FA608\n\ -_08118224: .4byte gUnknown_083F8C00\n\ -_08118228:\n\ -cmp r0, 0xC\n\ -beq _08118274\n\ -b _08118290\n\ -_0811822E:\n\ -adds r0, r4, 0\n\ -movs r1, 0x5\n\ -bl __udivsi3\n\ -subs r0, 0x1\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -ldr r0, _08118250 @ =0x02019000\n\ -adds r0, 0x16\n\ -adds r1, r4, r0\n\ -ldrb r0, [r1]\n\ -cmp r0, 0x3\n\ -bhi _08118290\n\ -ldrb r0, [r1]\n\ -adds r0, 0x1\n\ -b _0811826A\n\ -.align 2, 0\n\ -_08118250: .4byte 0x02019000\n\ -_08118254:\n\ -subs r0, r4, 0x1\n\ -lsls r0, 24\n\ -lsrs r4, r0, 24\n\ -ldr r0, _08118270 @ =0x02019000\n\ -adds r0, 0x12\n\ -adds r1, r4, r0\n\ -ldrb r0, [r1]\n\ -cmp r0, 0x2\n\ -bhi _08118290\n\ -ldrb r0, [r1]\n\ -adds r0, 0x2\n\ -_0811826A:\n\ -add r0, sp\n\ -ldrb r0, [r0]\n\ -b _08118292\n\ -.align 2, 0\n\ -_08118270: .4byte 0x02019000\n\ -_08118274:\n\ -ldr r1, _0811828C @ =0x02019000\n\ -adds r0, r3, 0\n\ -adds r0, 0x8\n\ -adds r0, r2, r0\n\ -ldr r1, [r1, 0x8]\n\ -ldr r0, [r0]\n\ -ands r1, r0\n\ -cmp r1, 0\n\ -bne _08118290\n\ -mov r0, sp\n\ -ldrb r0, [r0, 0x4]\n\ -b _08118292\n\ -.align 2, 0\n\ -_0811828C: .4byte 0x02019000\n\ -_08118290:\n\ -movs r0, 0\n\ -_08118292:\n\ -add sp, 0x8\n\ -pop {r4}\n\ -pop {r1}\n\ -bx r1\n\ -.syntax divided\n"); + return 0; } -#endif void sub_811829C(u8 r0) { -- cgit v1.2.3 From 4376a3f64ca11bbe3e4c100b0c2b806ebfb9547f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 31 Jan 2018 08:42:29 -0500 Subject: match sub_8118DE4 --- src/roulette.c | 216 ++------------------------------------------------------- 1 file changed, 4 insertions(+), 212 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index ebe2e8f56..01c222d24 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -2301,7 +2301,6 @@ void sub_8118D2C(struct Sprite *sprite) } } -#ifdef NONMATCHING void sub_8118DE4(struct Sprite *sprite) { sub_8118724(sprite); @@ -2317,13 +2316,13 @@ void sub_8118DE4(struct Sprite *sprite) sub_811866C(sprite); sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 15; sprite->callback = &sub_8118834; - m4aSongNumStartOrChange(0x47); + m4aSongNumStartOrChange(SE_HASHI); } else { u8 t; u32 z; - m4aSongNumStart(0x38); + m4aSongNumStart(SE_KON); if ((z = (Random() & 0x1))) { u32 o; @@ -2355,7 +2354,7 @@ void sub_8118DE4(struct Sprite *sprite) sprite->data[0x2] = gUnknown_083F8DF4[eRoulette->var04_0].var02; if (z) { - eRoulette->var8C = 1.5f; + eRoulette->var8C = 0.5f; } else { @@ -2364,217 +2363,10 @@ void sub_8118DE4(struct Sprite *sprite) } } eRoulette->var98 = 0.085f; - sprite->callback = &sub_8118D2C; + sprite->callback = sub_8118D2C; sprite->data[0x1] = 0x5; } } -#else -__attribute__((naked)) -void sub_8118DE4(struct Sprite *sprite) -{ -asm(".syntax unified\n\ -push {r4-r7,lr}\n\ -mov r7, r9\n\ -mov r6, r8\n\ -push {r6,r7}\n\ -adds r7, r0, 0\n\ -bl sub_8118724\n\ -movs r0, 0\n\ -strh r0, [r7, 0x32]\n\ -adds r0, r7, 0\n\ -bl sub_81186B8\n\ -ldr r1, _08118E70 @ =gUnknown_083F8D90\n\ -ldr r6, _08118E74 @ =gSharedMem + 0x19000\n\ -movs r0, 0x7E\n\ -adds r0, r6\n\ -mov r8, r0\n\ -ldrb r0, [r0]\n\ -lsls r0, 3\n\ -adds r1, 0x4\n\ -adds r0, r1\n\ -ldr r0, [r0]\n\ -ldr r1, [r6, 0x8]\n\ -ands r0, r1\n\ -cmp r0, 0\n\ -bne _08118E7C\n\ -adds r1, r6, 0\n\ -adds r1, 0x7D\n\ -movs r0, 0xFF\n\ -strb r0, [r1]\n\ -ldrb r1, [r6, 0x3]\n\ -movs r0, 0x7F\n\ -ands r0, r1\n\ -strb r0, [r6, 0x3]\n\ -adds r0, r7, 0\n\ -adds r0, 0x2B\n\ -ldrb r1, [r0]\n\ -adds r1, 0x3\n\ -lsls r1, 24\n\ -lsrs r1, 24\n\ -adds r0, r7, 0\n\ -bl StartSpriteAnim\n\ -adds r0, r7, 0\n\ -bl sub_81186B8\n\ -movs r0, 0x1E\n\ -strh r0, [r7, 0x36]\n\ -adds r0, r7, 0\n\ -bl sub_811866C\n\ -movs r1, 0x3A\n\ -ldrsh r0, [r7, r1]\n\ -movs r1, 0x1E\n\ -bl __divsi3\n\ -lsls r0, 16\n\ -asrs r0, 16\n\ -lsls r1, r0, 4\n\ -subs r1, r0\n\ -lsls r1, 1\n\ -adds r1, 0xF\n\ -strh r1, [r7, 0x3A]\n\ -ldr r0, _08118E78 @ =sub_8118834\n\ -str r0, [r7, 0x1C]\n\ -movs r0, 0x47\n\ -bl m4aSongNumStartOrChange\n\ -b _08118F74\n\ -.align 2, 0\n\ -_08118E70: .4byte gUnknown_083F8D90\n\ -_08118E74: .4byte gSharedMem + 0x19000\n\ -_08118E78: .4byte sub_8118834\n\ -_08118E7C:\n\ -movs r0, 0x38\n\ -bl m4aSongNumStart\n\ -bl Random\n\ -movs r2, 0x1\n\ -mov r9, r2\n\ -mov r1, r9\n\ -ands r1, r0\n\ -mov r9, r1\n\ -cmp r1, 0\n\ -beq _08118EC0\n\ -adds r1, r6, 0\n\ -adds r1, 0x8C\n\ -ldr r0, _08118EB8 @ =0x00000000\n\ -str r0, [r1]\n\ -mov r2, r8\n\ -ldrb r0, [r2]\n\ -adds r0, 0x1\n\ -movs r1, 0xC\n\ -bl __modsi3\n\ -lsls r1, r0, 24\n\ -lsrs r2, r1, 24\n\ -adds r1, r6, 0\n\ -adds r1, 0x7F\n\ -strb r0, [r1]\n\ -ldr r5, _08118EBC @ =gUnknown_083F8DF4\n\ -b _08118EF4\n\ -.align 2, 0\n\ -_08118EB8: .4byte 0x00000000\n\ -_08118EBC: .4byte gUnknown_083F8DF4\n\ -_08118EC0:\n\ -adds r4, r6, 0\n\ -adds r4, 0x8C\n\ -ldr r5, _08118F1C @ =gUnknown_083F8DF4\n\ -ldrb r0, [r6, 0x4]\n\ -lsls r0, 30\n\ -lsrs r0, 25\n\ -adds r1, r5, 0\n\ -adds r1, 0x1C\n\ -adds r0, r1\n\ -ldr r1, [r0]\n\ -adds r0, r1, 0\n\ -bl __addsf3\n\ -str r0, [r4]\n\ -mov r0, r8\n\ -ldrb r4, [r0]\n\ -adds r0, r4, 0\n\ -adds r0, 0xB\n\ -movs r1, 0xC\n\ -bl __modsi3\n\ -lsls r0, 24\n\ -lsrs r2, r0, 24\n\ -adds r0, r6, 0\n\ -adds r0, 0x7F\n\ -strb r4, [r0]\n\ -_08118EF4:\n\ -ldr r0, _08118F20 @ =gUnknown_083F8D90\n\ -lsls r1, r2, 3\n\ -adds r0, 0x4\n\ -adds r1, r0\n\ -ldr r2, _08118F24 @ =gSharedMem + 0x19000\n\ -ldr r1, [r1]\n\ -ldr r0, [r2, 0x8]\n\ -ands r1, r0\n\ -cmp r1, 0\n\ -beq _08118F28\n\ -movs r0, 0x1\n\ -strh r0, [r7, 0x2E]\n\ -ldrb r0, [r2, 0x4]\n\ -lsls r0, 30\n\ -lsrs r0, 25\n\ -adds r0, r5\n\ -ldrb r0, [r0, 0x2]\n\ -strh r0, [r7, 0x32]\n\ -b _08118F64\n\ -.align 2, 0\n\ -_08118F1C: .4byte gUnknown_083F8DF4\n\ -_08118F20: .4byte gUnknown_083F8D90\n\ -_08118F24: .4byte gSharedMem + 0x19000\n\ -_08118F28:\n\ -strh r1, [r7, 0x2E]\n\ -ldrb r1, [r2, 0x4]\n\ -movs r0, 0x3\n\ -ands r0, r1\n\ -cmp r0, 0\n\ -beq _08118F40\n\ -lsls r0, r1, 30\n\ -lsrs r0, 25\n\ -adds r0, r5\n\ -ldrb r0, [r0, 0x1]\n\ -strh r0, [r7, 0x32]\n\ -b _08118F64\n\ -_08118F40:\n\ -lsls r0, r1, 30\n\ -lsrs r0, 25\n\ -adds r0, r5\n\ -ldrb r0, [r0, 0x2]\n\ -strh r0, [r7, 0x32]\n\ -mov r1, r9\n\ -cmp r1, 0\n\ -beq _08118F5C\n\ -adds r1, r2, 0\n\ -adds r1, 0x8C\n\ -ldr r0, _08118F58 @ =0x3f000000\n\ -b _08118F62\n\ -.align 2, 0\n\ -_08118F58: .4byte 0x3f000000\n\ -_08118F5C:\n\ -adds r1, r2, 0\n\ -adds r1, 0x8C\n\ -ldr r0, _08118F80 @ =0xbfc00000\n\ -_08118F62:\n\ -str r0, [r1]\n\ -_08118F64:\n\ -adds r1, r2, 0\n\ -adds r1, 0x98\n\ -ldr r0, _08118F84 @ =0x3dae147b\n\ -str r0, [r1]\n\ -ldr r0, _08118F88 @ =sub_8118D2C\n\ -str r0, [r7, 0x1C]\n\ -movs r0, 0x5\n\ -strh r0, [r7, 0x30]\n\ -_08118F74:\n\ -pop {r3,r4}\n\ -mov r8, r3\n\ -mov r9, r4\n\ -pop {r4-r7}\n\ -pop {r0}\n\ -bx r0\n\ -.align 2, 0\n\ -_08118F80: .4byte 0xbfc00000\n\ -_08118F84: .4byte 0x3dae147b\n\ -_08118F88: .4byte sub_8118D2C\n\ -.syntax divided\n"); -} -#endif void sub_8118F8C(struct Sprite *sprite) { -- cgit v1.2.3 From cb674ce14dc43f99dd76f456e69ab8a90cc3d506 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 31 Jan 2018 15:45:28 -0600 Subject: fix and decompile more battle_2.c debug code --- src/battle/battle_2.c | 511 ++++++++++---------------------------------------- 1 file changed, 101 insertions(+), 410 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index a400257dd..b8ad21869 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1376,30 +1376,9 @@ void debug_sub_80125A0(void); u32 debug_sub_8013294(u8, void *, u32); void debug_sub_80132C8(u8, void *, u32); -struct UnknownStruct2023A76 -{ - u16 unk0; - u16 unk2[(0x44-2)/2]; - s16 unk44; - u16 unk46; - u16 unk48[1]; -}; - -struct UnknownStruct2023B02 -{ - u16 unk0[4][4]; - u8 filler20[0x10]; - u16 unk30[4][4]; -}; - -struct UnknownStruct821F424 -{ - u8 filler0[0x12]; - u16 unk12[1][5]; // unknown length -}; - -extern struct UnknownStruct2023A76 gUnknown_Debug_2023A76; -extern struct UnknownStruct2023B02 gUnknown_Debug_2023B02; +extern s16 gUnknown_Debug_2023A76[][0x23]; +extern s16 gUnknown_Debug_2023A76_[][7][5]; +extern s16 gUnknown_Debug_2023B02[][6][4]; extern u8 gUnknown_Debug_03004360; extern struct Window gUnknown_Debug_03004370; extern u8 gUnknown_Debug_030043A0; @@ -1407,7 +1386,7 @@ extern u8 gUnknown_Debug_030043A4; extern u8 gUnknown_Debug_030043A8; extern u8 gBattleBuffersTransferData[]; -extern const struct UnknownStruct821F424 gUnknown_Debug_821F424; +extern const s16 gUnknown_Debug_821F424[][5]; extern const u16 gUnknown_Debug_821F56C[][5]; extern const u8 gUnusedOldCharmap_Gfx_lz[]; @@ -1421,25 +1400,24 @@ void debug_sub_8010800(void) *(u32 *)(gBattleBuffersTransferData + 0x100) = 0; } - void debug_sub_8010818(void) { s32 i; - gUnknown_Debug_2023A76.unk0 = 0x115; - gUnknown_Debug_2023A76.unk46 = 0x115; - for (i = 0; i < 30; i++) + gUnknown_Debug_2023A76[0][0] = 0x115; + gUnknown_Debug_2023A76[1][0] = 0x115; + for (i = 1; i < 31; i++) { - gUnknown_Debug_2023A76.unk2[i] = gUnknown_Debug_821F424.unk12[i][0]; - gUnknown_Debug_2023A76.unk48[i] = gUnknown_Debug_821F424.unk12[i][0]; + gUnknown_Debug_2023A76[0][i] = gUnknown_Debug_821F424[i][4]; + gUnknown_Debug_2023A76[1][i] = gUnknown_Debug_821F424[i][4]; } for (i = 0; i < 6; i++) { for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++) { - gUnknown_Debug_2023B02.unk0[i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; - gUnknown_Debug_2023B02.unk30[i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; + gUnknown_Debug_2023B02[0][i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; + gUnknown_Debug_2023B02[1][i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0]; } } } @@ -1490,7 +1468,7 @@ void debug_sub_80108B8(void) debug_nullsub_3(); gUnknown_Debug_030043A8 = 0; debug_sub_80125A0(); - if (gUnknown_Debug_2023A76.unk44 == 8) + if (gUnknown_Debug_2023A76[0][0x22] == 8) { debug_sub_801174C(); } @@ -1510,289 +1488,91 @@ void debug_sub_8010A7C(u8 a, u8 b) gBattleTextBuff1[i] = EOS; } -__attribute__((naked)) -void debug_sub_8010AAC() +// gUnknown_Debug_2023A76_ seems like a 3D array, but this function refuses to match when I do that. +#ifdef NONMATCHING +void debug_sub_8010AAC(u8 a) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov ip, r0\n" - " ldr r6, ._520 @ gBaseStats\n" - " ldr r4, ._520 + 4 @ gUnknown_Debug_2023A76\n" - " ldr r5, ._520 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r5]\n" - " lsl r0, r1, #0x2\n" - " add r7, r0, r1\n" - " lsl r1, r7, #0x1\n" - " ldr r3, ._520 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r3]\n" - " mov r0, #0x46\n" - " mul r2, r2, r0\n" - " add r1, r1, r2\n" - " add r1, r1, r4\n" - " mov r0, #0x0\n" - " ldsh r1, [r1, r0]\n" - " lsl r0, r1, #0x3\n" - " sub r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r6\n" - " ldrb r0, [r0, #0x10]\n" - " add r6, r3, #0\n" - " cmp r0, #0xfe\n" - " beq ._516 @cond_branch\n" - " cmp r0, #0xfe\n" - " bgt ._517 @cond_branch\n" - " cmp r0, #0\n" - " beq ._518 @cond_branch\n" - " b ._523\n" - "._521:\n" - " .align 2, 0\n" - "._520:\n" - " .word gBaseStats\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_03004360\n" - "._517:\n" - " cmp r0, #0xff\n" - " beq ._522 @cond_branch\n" - " b ._523\n" - "._518:\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r2\n" - " add r0, r0, r4\n" - " mov r1, #0x2\n" - " b ._528\n" - "._516:\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r2\n" - " add r0, r0, r4\n" - " mov r1, #0x3\n" - " b ._528\n" - "._522:\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r2\n" - " add r0, r0, r4\n" - " mov r1, #0x4\n" - " b ._528\n" - "._523:\n" - " ldrb r0, [r5]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " add r1, r1, #0x4\n" - " lsl r1, r1, #0x1\n" - " ldrb r0, [r6]\n" - " mov r3, #0x46\n" - " mul r0, r0, r3\n" - " add r1, r1, r0\n" - " add r1, r1, r4\n" - " ldrh r2, [r1]\n" - " mov r0, #0x1\n" - " and r0, r0, r2\n" - " strh r0, [r1]\n" - " mov r1, ip\n" - " cmp r1, #0\n" - " beq ._527 @cond_branch\n" - " ldrb r1, [r5]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " add r0, r0, #0x4\n" - " lsl r0, r0, #0x1\n" - " ldrb r1, [r6]\n" - " mul r1, r1, r3\n" - " add r0, r0, r1\n" - " add r0, r0, r4\n" - " ldrh r1, [r0]\n" - " mov r2, #0x1\n" - " eor r1, r1, r2\n" - " b ._528\n" - "._527:\n" - " ldrb r1, [r5]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " add r0, r0, #0x4\n" - " lsl r0, r0, #0x1\n" - " ldrb r1, [r6]\n" - " mul r1, r1, r3\n" - " add r0, r0, r1\n" - " add r0, r0, r4\n" - " mov r1, ip\n" - "._528:\n" - " strh r1, [r0]\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + switch (gBaseStats[gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][0]].genderRatio) + { + case 0: + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 2; + break; + case 0xFE: + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 3; + break; + case 0xFF: + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 4; + break; + default: + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] &= 1; + if (a != 0) + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] ^= 1; + else + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 0; + break; + } } +#else +void debug_sub_8010AAC(u8 a) +{ + switch (gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5]].genderRatio) + { + case 0: + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 2; + break; + case 0xFE: + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 3; + break; + case 0xFF: + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 4; + break; + default: + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] &= 1; + if (a != 0) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] ^= 1; + else + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 0; + break; + } +} +#endif -__attribute__((naked)) -void debug_sub_8010B80() +void debug_sub_8010B80(u8 a) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " mov r0, #0x0\n" - " mov ip, r0\n" - " ldr r4, ._534 @ gUnknown_Debug_2023A76\n" - " ldr r1, ._534 + 4 @ gUnknown_Debug_030043A0\n" - " mov r8, r1\n" - " ldr r5, ._534 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r5]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " mov r2, r8\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x1\n" - " ldr r3, ._534 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r3]\n" - " mov r1, #0x46\n" - " mul r1, r1, r2\n" - " add r0, r0, r1\n" - " add r0, r0, r4\n" - " ldrb r7, [r0]\n" - " lsl r1, r7, #0x18\n" - " asr r0, r1, #0x18\n" - " mov r9, r4\n" - " add r2, r5, #0\n" - " add r4, r3, #0\n" - " cmp r0, #0x9\n" - " ble ._529 @cond_branch\n" - "._530:\n" - " mov r3, #0xf6\n" - " lsl r3, r3, #0x18\n" - " add r0, r1, r3\n" - " lsr r7, r0, #0x18\n" - " mov r1, ip\n" - " lsl r0, r1, #0x18\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x11\n" - " add r0, r0, r3\n" - " lsr r0, r0, #0x18\n" - " mov ip, r0\n" - " lsl r1, r7, #0x18\n" - " asr r0, r1, #0x18\n" - " cmp r0, #0x9\n" - " bgt ._530 @cond_branch\n" - "._529:\n" - " mov r0, #0x2\n" - " and r0, r0, r6\n" - " cmp r0, #0\n" - " beq ._531 @cond_branch\n" - " mov r0, #0x1\n" - " and r0, r0, r6\n" - " cmp r0, #0\n" - " beq ._532 @cond_branch\n" - " mov r1, ip\n" - " lsl r0, r1, #0x18\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x11\n" - " b ._533\n" - "._535:\n" - " .align 2, 0\n" - "._534:\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_03004360\n" - "._532:\n" - " mov r1, ip\n" - " lsl r0, r1, #0x18\n" - " mov r3, #0xff\n" - " lsl r3, r3, #0x18\n" - "._533:\n" - " add r0, r0, r3\n" - " lsr r0, r0, #0x18\n" - " mov ip, r0\n" - " mov r1, ip\n" - " lsl r0, r1, #0x18\n" - " cmp r0, #0\n" - " bge ._536 @cond_branch\n" - " mov r3, #0x9\n" - " mov ip, r3\n" - "._536:\n" - " mov r1, ip\n" - " lsl r0, r1, #0x18\n" - " asr r0, r0, #0x18\n" - " cmp r0, #0x9\n" - " ble ._542 @cond_branch\n" - " mov r3, #0x0\n" - " mov ip, r3\n" - " b ._542\n" - "._531:\n" - " mov r0, #0x1\n" - " and r0, r0, r6\n" - " cmp r0, #0\n" - " beq ._539 @cond_branch\n" - " lsl r0, r7, #0x18\n" - " mov r1, #0x80\n" - " lsl r1, r1, #0x11\n" - " add r0, r0, r1\n" - " b ._540\n" - "._539:\n" - " lsl r0, r7, #0x18\n" - " mov r3, #0xff\n" - " lsl r3, r3, #0x18\n" - " add r0, r0, r3\n" - "._540:\n" - " lsr r7, r0, #0x18\n" - " lsl r0, r7, #0x18\n" - " cmp r0, #0\n" - " bgt ._541 @cond_branch\n" - " mov r7, #0x9\n" - "._541:\n" - " lsl r0, r7, #0x18\n" - " asr r0, r0, #0x18\n" - " cmp r0, #0x9\n" - " ble ._542 @cond_branch\n" - " mov r7, #0x1\n" - "._542:\n" - " ldrb r0, [r2]\n" - " lsl r2, r0, #0x2\n" - " add r2, r2, r0\n" - " mov r0, r8\n" - " ldrb r0, [r0]\n" - " add r2, r2, r0\n" - " lsl r2, r2, #0x1\n" - " ldrb r1, [r4]\n" - " mov r0, #0x1\n" - " eor r0, r0, r1\n" - " mov r1, #0x46\n" - " add r3, r0, #0\n" - " mul r3, r3, r1\n" - " add r3, r2, r3\n" - " add r3, r3, r9\n" - " ldrb r0, [r4]\n" - " mul r0, r0, r1\n" - " add r2, r2, r0\n" - " add r2, r2, r9\n" - " mov r1, ip\n" - " lsl r0, r1, #0x18\n" - " asr r0, r0, #0x18\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x1\n" - " lsl r0, r7, #0x18\n" - " asr r0, r0, #0x18\n" - " add r0, r0, r1\n" - " strh r0, [r2]\n" - " strh r0, [r3]\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + s8 r12 = 0; + s8 r7 = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0]; + + while (r7 >= 10) + { + r7 -= 10; + r12++; + } + + if (a & 2) + { + if (a & 1) + r12++; + else + r12--; + if (r12 < 0) + r12 = 9; + if (r12 > 9) + r12 = 0; + } + else + { + if (a & 1) + r7++; + else + r7--; + if (r7 < 1) + r7 = 9; + if (r7 > 9) + r7 = 1; + } + gUnknown_Debug_2023A76_[gUnknown_Debug_03004360 ^ 1][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0] + = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0] + = r12 * 10 + r7; } __attribute__((naked)) @@ -5119,39 +4899,17 @@ void debug_sub_8012688() ); } -__attribute__((naked)) -void debug_sub_8012878() +void debug_sub_8012878(void) { - asm( - " push {lr}\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " ldr r0, ._876 @ gUnknown_03004210\n" - " bl Text_UpdateWindowInBattle\n" - " bl UpdatePaletteFade\n" - " bl RunTasks\n" - " ldr r0, ._876 + 4 @ gMain\n" - " ldrh r1, [r0, #0x2c]\n" - " mov r0, #0x82\n" - " lsl r0, r0, #0x1\n" - " cmp r1, r0\n" - " bne ._875 @cond_branch\n" - " ldr r0, ._876 + 8 @ debug_sub_80108B8\n" - " bl SetMainCallback2\n" - "._875:\n" - " pop {r0}\n" - " bx r0\n" - "._877:\n" - " .align 2, 0\n" - "._876:\n" - " .word gUnknown_03004210\n" - " .word gMain\n" - " .word debug_sub_80108B8+1\n" - "\n" - ); + AnimateSprites(); + BuildOamBuffer(); + Text_UpdateWindowInBattle(&gUnknown_03004210); + UpdatePaletteFade(); + RunTasks(); + if (gMain.heldKeys == (SELECT_BUTTON | R_BUTTON)) + SetMainCallback2(debug_sub_80108B8); } -/* void debug_sub_80128B4(void) { debug_sub_8010A7C(0, 9); @@ -5164,73 +4922,6 @@ void debug_sub_80128B4(void) Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35); Text_PrintWindow8002F44(&gUnknown_03004210); } -*/ - -__attribute__((naked)) -void debug_sub_80128B4() -{ - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add sp, sp, #0xfffffffc\n" - " mov r0, #0x0\n" - " mov r1, #0x9\n" - " bl debug_sub_8010A7C\n" - " ldr r5, ._878 @ gUnknown_03004210\n" - " ldr r4, ._878 + 4 @ gBattleTextBuff1\n" - " mov r0, #0x23\n" - " mov r8, r0\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " add r1, r4, #0\n" - " mov r2, #0x90\n" - " mov r3, #0x2\n" - " bl Text_InitWindow\n" - " add r0, r5, #0\n" - " bl Text_PrintWindow8002F44\n" - " ldr r6, ._878 + 8 @ gCurrentMove\n" - " ldrh r1, [r6]\n" - " add r0, r4, #0\n" - " mov r2, #0x2\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, #0x0\n" - " strb r0, [r4, #0x3]\n" - " mov r0, #0xff\n" - " strb r0, [r4, #0x4]\n" - " ldrh r1, [r6]\n" - " mov r0, #0xb\n" - " mul r1, r1, r0\n" - " ldr r0, ._878 + 12 @ gSpeciesNames\n" - " add r1, r1, r0\n" - " add r0, r4, #0\n" - " bl StringAppend\n" - " mov r0, r8\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " add r1, r4, #0\n" - " mov r2, #0x90\n" - " mov r3, #0x2\n" - " bl Text_InitWindow\n" - " add r0, r5, #0\n" - " bl Text_PrintWindow8002F44\n" - " add sp, sp, #0x4\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._879:\n" - " .align 2, 0\n" - "._878:\n" - " .word gUnknown_03004210\n" - " .word gBattleTextBuff1\n" - " .word gCurrentMove\n" - " .word gSpeciesNames\n" - "\n" - ); -} void debug_sub_8012938(u8 taskId) { -- cgit v1.2.3 From 449d5cd95bbd1a3ad291e6ebe0654f47f2f3b6e4 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 31 Jan 2018 18:19:25 -0600 Subject: decompile more battle_2.c debug functions --- src/battle/battle_2.c | 326 ++++++++++---------------------------------------- 1 file changed, 64 insertions(+), 262 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index b8ad21869..d3ddc5960 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -69,6 +69,7 @@ struct UnknownStruct12 extern void sub_802BBD4(); +extern struct SpriteTemplate gUnknown_02024E8C; extern const u8 Str_821F7B8[]; extern u8 gUnknown_02023A14_50; extern const u16 gUnknown_08D004E0[]; @@ -1362,6 +1363,8 @@ extern u8 gUnknown_Debug_2023B62[]; extern const u8 Str_821F7BD[]; extern const u8 Str_821F7DA[]; +void debug_sub_8012878(void); +void debug_sub_8012D10(u8); void debug_sub_8010818(void); void debug_sub_80108B8(void); void debug_sub_8010CAC(void); @@ -1388,6 +1391,7 @@ extern u8 gBattleBuffersTransferData[]; extern const s16 gUnknown_Debug_821F424[][5]; extern const u16 gUnknown_Debug_821F56C[][5]; +extern const u32 gUnknown_Debug_821F798[][4]; extern const u8 gUnusedOldCharmap_Gfx_lz[]; extern const u8 gUnusedOldCharmap_Tilemap_lz[]; @@ -4628,275 +4632,73 @@ void debug_sub_80125E4() ); } -__attribute__((naked)) -void debug_sub_8012628() +void debug_sub_8012628(void) { - asm( - " ldr r3, ._868 @ gSharedMem\n" - " ldr r2, ._868 + 4 @ gUnknown_Debug_821F798\n" - " ldr r0, ._868 + 8 @ gUnknown_Debug_030043A8\n" - " ldrb r1, [r0]\n" - " lsl r1, r1, #0x2\n" - " ldr r0, ._868 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x4\n" - " add r1, r1, r0\n" - " add r1, r1, r2\n" - " ldr r0, [r1]\n" - " add r0, r0, r3\n" - " mov r1, #0x6d\n" - " strb r1, [r0]\n" - " bx lr\n" - "._869:\n" - " .align 2, 0\n" - "._868:\n" - " .word gSharedMem\n" - " .word gUnknown_Debug_821F798\n" - " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_Debug_03004360\n" - "\n" - ); + gSharedMem[gUnknown_Debug_821F798[gUnknown_Debug_03004360][gUnknown_Debug_030043A8]] = 0x6D; } -__attribute__((naked)) -void debug_sub_8012658() +void debug_sub_8012658(void) { - asm( - " ldr r3, ._870 @ gSharedMem\n" - " ldr r2, ._870 + 4 @ gUnknown_Debug_821F798\n" - " ldr r0, ._870 + 8 @ gUnknown_Debug_030043A8\n" - " ldrb r1, [r0]\n" - " lsl r1, r1, #0x2\n" - " ldr r0, ._870 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x4\n" - " add r1, r1, r0\n" - " add r1, r1, r2\n" - " ldr r0, [r1]\n" - " add r0, r0, r3\n" - " mov r1, #0x81\n" - " strb r1, [r0]\n" - " bx lr\n" - "._871:\n" - " .align 2, 0\n" - "._870:\n" - " .word gSharedMem\n" - " .word gUnknown_Debug_821F798\n" - " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_Debug_03004360\n" - "\n" - ); + gSharedMem[gUnknown_Debug_821F798[gUnknown_Debug_03004360][gUnknown_Debug_030043A8]] = 0x81; } -__attribute__((naked)) -void debug_sub_8012688() +void debug_sub_8012688(void) { - asm( - " push {r4, r5, r6, lr}\n" - " mov r6, r8\n" - " push {r6}\n" - " add sp, sp, #0xfffffff4\n" - " mov r1, #0x0\n" - " mov r4, #0xcd\n" - " lsl r4, r4, #0x1\n" - " ldr r3, ._873 @ gUnknown_Debug_2023B62\n" - " mov r2, #0x0\n" - "._872:\n" - " add r0, r1, r3\n" - " strb r2, [r0]\n" - " add r1, r1, #0x1\n" - " cmp r1, r4\n" - " ble ._872 @cond_branch\n" - " mov r0, #0x0\n" - " bl SetHBlankCallback\n" - " mov r0, #0x0\n" - " bl SetVBlankCallback\n" - " mov r5, #0x0\n" - " str r5, [sp, #0x8]\n" - " ldr r1, ._873 + 4 @ 0x40000d4\n" - " add r0, sp, #0x8\n" - " str r0, [r1]\n" - " mov r0, #0xc0\n" - " lsl r0, r0, #0x13\n" - " str r0, [r1, #0x4]\n" - " ldr r0, ._873 + 8 @ 0x85006000\n" - " str r0, [r1, #0x8]\n" - " ldr r0, [r1, #0x8]\n" - " ldr r0, ._873 + 12 @ 0x400004c\n" - " strh r5, [r0]\n" - " sub r0, r0, #0xc\n" - " strh r5, [r0]\n" - " add r0, r0, #0x4\n" - " strh r5, [r0]\n" - " sub r0, r0, #0x2\n" - " strh r5, [r0]\n" - " add r0, r0, #0x4\n" - " strh r5, [r0]\n" - " add r0, r0, #0x2\n" - " strh r5, [r0]\n" - " add r0, r0, #0x2\n" - " strh r5, [r0]\n" - " ldr r4, ._873 + 16 @ gWindowTemplate_81E6C58\n" - " add r0, r4, #0\n" - " bl Text_LoadWindowTemplate\n" - " bl ResetPaletteFade\n" - " ldr r0, ._873 + 20 @ gBattle_BG0_X\n" - " strh r5, [r0]\n" - " ldr r1, ._873 + 24 @ gBattle_BG0_Y\n" - " mov r0, #0xa0\n" - " strh r0, [r1]\n" - " ldr r0, ._873 + 28 @ gBattle_BG1_X\n" - " strh r5, [r0]\n" - " ldr r0, ._873 + 32 @ gBattle_BG1_Y\n" - " strh r5, [r0]\n" - " ldr r0, ._873 + 36 @ gBattle_BG2_X\n" - " strh r5, [r0]\n" - " ldr r0, ._873 + 40 @ gBattle_BG2_Y\n" - " strh r5, [r0]\n" - " ldr r0, ._873 + 44 @ gBattle_BG3_X\n" - " strh r5, [r0]\n" - " ldr r0, ._873 + 48 @ gBattle_BG3_Y\n" - " strh r5, [r0]\n" - " ldr r1, ._873 + 52 @ gBattleTerrain\n" - " mov r0, #0x9\n" - " strb r0, [r1]\n" - " bl sub_800D6D4\n" - " bl sub_800DAB8\n" - " bl ResetSpriteData\n" - " bl ResetTasks\n" - " bl FreeAllSpritePalettes\n" - " ldr r1, ._873 + 56 @ gReservedSpritePaletteCount\n" - " mov r0, #0x4\n" - " strb r0, [r1]\n" - " ldr r6, ._873 + 60 @ gCurrentMove\n" - " mov r0, #0x1\n" - " strh r0, [r6]\n" - " ldr r0, ._873 + 64 @ gUnknown_03004210\n" - " add r1, r4, #0\n" - " bl Text_InitWindowWithTemplate\n" - " ldrh r2, [r6]\n" - " lsl r0, r2, #0x3\n" - " ldr r1, ._873 + 68 @ gMonFrontPicTable\n" - " add r0, r0, r1\n" - " ldr r1, ._873 + 72 @ gMonFrontPicCoords\n" - " mov r8, r1\n" - " lsl r2, r2, #0x2\n" - " add r2, r2, r8\n" - " ldrb r1, [r2]\n" - " ldrb r2, [r2, #0x1]\n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x12\n" - " ldr r4, ._873 + 76 @ gUnknown_081FAF4C\n" - " ldr r4, [r4, #0x4]\n" - " str r4, [sp]\n" - " ldrh r4, [r6]\n" - " str r4, [sp, #0x4]\n" - " bl DecompressPicFromTable_2\n" - " ldr r1, ._873 + 80 @ gMonPaletteTable\n" - " ldrh r0, [r6]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0x88\n" - " lsl r1, r1, #0x1\n" - " mov r2, #0x20\n" - " bl LoadCompressedPalette\n" - " ldrh r0, [r6]\n" - " mov r1, #0x1\n" - " bl GetMonSpriteTemplate_803C56C\n" - " ldr r0, ._873 + 84 @ gUnknown_02024E8C\n" - " ldrh r1, [r6]\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r8\n" - " ldrb r2, [r1, #0x1]\n" - " add r2, r2, #0x28\n" - " mov r1, #0xb0\n" - " mov r3, #0x28\n" - " bl CreateSprite\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x18\n" - " lsr r4, r4, #0x18\n" - " ldr r3, ._873 + 88 @ gSprites\n" - " lsl r1, r4, #0x4\n" - " add r1, r1, r4\n" - " lsl r1, r1, #0x2\n" - " add r0, r3, #0\n" - " add r0, r0, #0x1c\n" - " add r0, r1, r0\n" - " ldr r2, ._873 + 92 @ nullsub_37\n" - " str r2, [r0]\n" - " add r1, r1, r3\n" - " ldrb r2, [r1, #0x5]\n" - " mov r0, #0xf\n" - " and r0, r0, r2\n" - " mov r2, #0x10\n" - " orr r0, r0, r2\n" - " strb r0, [r1, #0x5]\n" - " mov r1, #0x80\n" - " lsl r1, r1, #0x13\n" - " mov r2, #0xfa\n" - " lsl r2, r2, #0x5\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " ldr r0, ._873 + 96 @ debug_nullsub_45\n" - " bl SetHBlankCallback\n" - " ldr r0, ._873 + 100 @ debug_sub_8011DD4\n" - " bl SetVBlankCallback\n" - " bl m4aMPlayAllStop\n" - " ldr r0, ._873 + 104 @ debug_sub_8012D10\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._873 + 108 @ gTasks\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " strh r5, [r1, #0x8]\n" - " strh r4, [r1, #0xa]\n" - " ldr r0, ._873 + 112 @ debug_sub_8012878\n" - " bl SetMainCallback2\n" - " add sp, sp, #0xc\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._874:\n" - " .align 2, 0\n" - "._873:\n" - " .word gUnknown_Debug_2023B62\n" - " .word 0x40000d4\n" - " .word 0x85006000\n" - " .word 0x400004c\n" - " .word gWindowTemplate_81E6C58\n" - " .word gBattle_BG0_X\n" - " .word gBattle_BG0_Y\n" - " .word gBattle_BG1_X\n" - " .word gBattle_BG1_Y\n" - " .word gBattle_BG2_X\n" - " .word gBattle_BG2_Y\n" - " .word gBattle_BG3_X\n" - " .word gBattle_BG3_Y\n" - " .word gBattleTerrain\n" - " .word gReservedSpritePaletteCount\n" - " .word gCurrentMove\n" - " .word gUnknown_03004210\n" - " .word gMonFrontPicTable\n" - " .word gMonFrontPicCoords\n" - " .word gUnknown_081FAF4C\n" - " .word gMonPaletteTable\n" - " .word gUnknown_02024E8C\n" - " .word gSprites\n" - " .word nullsub_37+1\n" - " .word debug_nullsub_45+1\n" - " .word debug_sub_8011DD4+1\n" - " .word debug_sub_8012D10+1\n" - " .word gTasks\n" - " .word debug_sub_8012878+1\n" - "\n" - ); + s32 i; + u8 spriteId; + u8 taskId; + + for (i = 0; i < 411; i++) + gUnknown_Debug_2023B62[i] = 0; + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE); + REG_MOSAIC = 0; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); + ResetPaletteFade(); + gBattle_BG0_X = 0; + gBattle_BG0_Y = DISPLAY_HEIGHT; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + gBattleTerrain = 9; + sub_800D6D4(); + sub_800DAB8(); + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + gCurrentMove = 1; + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); + DecompressPicFromTable_2( + &gMonFrontPicTable[gCurrentMove], + gMonFrontPicCoords[gCurrentMove].coords, + gMonFrontPicCoords[gCurrentMove].y_offset, + (void *)0x02000000, + gUnknown_081FAF4C[1], + gCurrentMove); + LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32); + GetMonSpriteTemplate_803C56C(gCurrentMove, 1); + spriteId = CreateSprite(&gUnknown_02024E8C, 176, 40 + gMonFrontPicCoords[gCurrentMove].y_offset, 40); + gSprites[spriteId].callback = nullsub_37; + gSprites[spriteId].oam.paletteNum = 1; + REG_DISPCNT = 0x1F40; + SetHBlankCallback(debug_nullsub_45); + SetVBlankCallback(debug_sub_8011DD4); + m4aMPlayAllStop(); + taskId = CreateTask(debug_sub_8012D10, 0); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = spriteId; + SetMainCallback2(debug_sub_8012878); } void debug_sub_8012878(void) -- cgit v1.2.3 From c410df510012f7a6ccfc342b398cd5d407fb0bf6 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 31 Jan 2018 18:33:01 -0800 Subject: Start decompiling psychic.s --- src/battle/anim/psychic.c | 356 ++++++++++++++++++++++++++++++++++++++++++++++ src/rom_8077ABC.c | 2 +- 2 files changed, 357 insertions(+), 1 deletion(-) create mode 100644 src/battle/anim/psychic.c (limited to 'src') diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c new file mode 100644 index 000000000..19bfdfdb6 --- /dev/null +++ b/src/battle/anim/psychic.c @@ -0,0 +1,356 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "sound.h" +#include "task.h" +#include "trig.h" +#include "constants/songs.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG2_X; +extern u8 gObjectBankIDs[]; + +extern const union AffineAnimCmd *const gUnknown_083DA888[]; +extern struct AffineAnimFrameCmd gUnknown_083DA8A4; +extern struct AffineAnimFrameCmd gUnknown_083DA8C4; + +static void sub_80DB88C(struct Sprite *sprite); +static void sub_80DB8C0(struct Sprite *sprite); +static void sub_80DB92C(struct Sprite *sprite); +static void sub_80DB9E4(struct Sprite *sprite); +static void sub_80DBC00(struct Sprite *sprite); +static void sub_80DBC34(struct Sprite *sprite); +static void sub_80DBCD0(u8 taskId); +static void sub_80DBD58(u8 taskId); +void sub_80DBE98(u8 taskId); + + +void sub_80DB74C(struct Sprite *sprite) +{ + if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER || IsContest()) + { + sprite->oam.priority = 2; + sprite->subpriority = 200; + } + + if (!IsContest()) + { + u8 bankCopy; + u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + u8 identity = GetBankIdentity_permutated(bank); + int var0 = 1; + u8 toBG_2 = (identity ^ var0) != 0; + + if (IsAnimBankSpriteVisible(bank)) + sub_8076034(bank, toBG_2); + + bank = bankCopy ^ 2; + if (IsAnimBankSpriteVisible(bank)) + sub_8076034(bank, toBG_2 ^ var0); + } + + if (!IsContest() && IsDoubleBattle()) + { + if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) + { + sprite->pos1.x = 72; + sprite->pos1.y = 80; + } + else + { + sprite->pos1.x = 176; + sprite->pos1.y = 40; + } + } + else + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[0]; + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[1]; + } + + if (IsContest()) + sprite->pos1.y += 9; + + sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16; + sprite->callback = sub_80DB88C; + sprite->callback(sprite); +} + +static void sub_80DB88C(struct Sprite *sprite) +{ + REG_BLDALPHA = ((16 - sprite->data[3]) << 8) | sprite->data[3]; + + if (sprite->data[3] == 13) + sprite->callback = sub_80DB8C0; + else + sprite->data[3]++; +} + +static void sub_80DB8C0(struct Sprite *sprite) +{ + u16 color; + u16 startOffset; + int i; + + if (++sprite->data[1] == 2) + { + sprite->data[1] = 0; + startOffset = sprite->data[0]; + color = gPlttBufferFaded[startOffset + 8]; + + for (i = 8; i > 0; i--) + gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1]; + + gPlttBufferFaded[startOffset + 1] = color; + + if (++sprite->data[2] == 16) + sprite->callback = sub_80DB92C; + } +} + +static void sub_80DB92C(struct Sprite *sprite) +{ + REG_BLDALPHA = ((16 - sprite->data[3]) << 8) | sprite->data[3]; + + if (--sprite->data[3] == -1) + { + if (!IsContest()) + { + u8 bankCopy; + u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + + if (IsAnimBankSpriteVisible(bank)) + gSprites[gObjectBankIDs[bank]].invisible = 0; + + bank = bankCopy ^ 2; + if (IsAnimBankSpriteVisible(bank)) + gSprites[gObjectBankIDs[bank]].invisible = 0; + } + + sprite->invisible = 1; + sprite->callback = sub_80DB9E4; + } +} + +static void sub_80DB9E4(struct Sprite *sprite) +{ + if (!IsContest()) + { + u8 bankCopy; + u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + u8 identity = GetBankIdentity_permutated(bank); + int var0 = 1; + u8 toBG_2 = (identity ^ var0) != 0; + + if (IsAnimBankSpriteVisible(bank)) + sub_8076464(toBG_2); + + bank = bankCopy ^ 2; + if (IsAnimBankSpriteVisible(bank)) + sub_8076464(toBG_2 ^ var0); + } + + sprite->callback = DestroyAnimSprite; +} + +void sub_80DBA4C(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + int arg3 = gBattleAnimArgs[3]; + u8 var0 = 0; + if (arg3 == 0) + var0 = 1; + + if (!IsContest() && IsDoubleBattle()) + { + if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) + { + sprite->pos1.x = 72 - gBattleAnimArgs[0]; + sprite->pos1.y = gBattleAnimArgs[1] + 80; + } + else + { + sprite->pos1.x = gBattleAnimArgs[0] + 176; + sprite->pos1.y = gBattleAnimArgs[1] + 40; + } + } + else + { + if (gBattleAnimArgs[2] == 0) + sub_80787B0(sprite, var0); + else + sub_8078764(sprite, var0); + } + + sprite->data[0]++; + } + else + { + if (sprite->animEnded || sprite->affineAnimEnded) + move_anim_8074EE0(sprite); + } +} + +void sub_80DBAF4(struct Sprite *sprite) +{ + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); + + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + { + StartSpriteAnim(sprite, 1); + sprite->pos1.x -= 40; + sprite->pos1.y += 10; + sprite->data[1] = -1; + } + else + { + sprite->pos1.x += 40; + sprite->pos1.y -= 10; + sprite->data[1] = 1; + } + + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); + sprite->callback = sub_8078600; +} + +void sub_80DBB70(struct Sprite *sprite) +{ + s16 x = sub_807A100(gAnimBankAttacker, 1) / 2; + s16 y = sub_807A100(gAnimBankAttacker, 0) / -2; + + if (GetBankSide(gAnimBankAttacker) == SIDE_OPPONENT) + { + x = -x; + } + + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + x; + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + y; + + if (sprite->pos1.y < 16) + { + sprite->pos1.y = 16; + } + + StoreSpriteCallbackInData(sprite, sub_80DBC00); + sprite->callback = sub_8078600; +} + +static void sub_80DBC00(struct Sprite *sprite) +{ + sprite->oam.affineMode = 1; + sprite->affineAnims = gUnknown_083DA888; + sprite->data[0] = 0; + InitSpriteAffineAnim(sprite); + sprite->callback = sub_80DBC34; +} + +static void sub_80DBC34(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (sprite->affineAnimEnded) + { + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + sprite->data[1] = 18; + sprite->data[0]++; + } + break; + case 1: + if (--sprite->data[1] == -1) + { + DestroyAnimSprite(sprite); + } + break; + } +} + +void sub_80DBC94(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 spriteId = GetAnimBankSpriteId(0); + task->data[0] = spriteId; + sub_80798F4(task, spriteId, &gUnknown_083DA8A4); + task->func = sub_80DBCD0; +} + +static void sub_80DBCD0(u8 taskId) +{ + if (!sub_807992C(&gTasks[taskId])) + { + DestroyAnimVisualTask(taskId); + } +} + +void sub_80DBCFC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 spriteId = GetAnimBankSpriteId(0); + task->data[0] = spriteId; + task->data[1] = 0; + task->data[2] = 0; + task->data[3] = GetBankSide(gAnimBankAttacker) != SIDE_PLAYER ? 4 : 8; + + sub_80798F4(task, task->data[0], &gUnknown_083DA8C4); + task->func = sub_80DBD58; +} + +static void sub_80DBD58(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[1]) + { + case 0: + sub_807992C(task); + if (++task->data[2] > 19) + task->data[1]++; + break; + case 1: + if (task->data[3] != 0) + { + gSprites[task->data[0]].pos2.y -= 8; + task->data[3]--; + } + else + { + gSprites[task->data[0]].invisible = 1; + gSprites[task->data[0]].pos1.x = 272; + sub_8078F40(task->data[0]); + DestroyAnimVisualTask(taskId); + } + break; + } +} + +void sub_80DBE00(u8 taskId) +{ + u16 var0, var1; + + struct Task *task = &gTasks[taskId]; + + task->data[3] = 16; + task->data[4] = 0; + task->data[13] = GetBankPosition(gAnimBankAttacker, 2); + task->data[14] = GetBankPosition(gAnimBankAttacker, 3); + + var0 = sub_807A100(gAnimBankAttacker, 1) / 3; + var1 = sub_807A100(gAnimBankAttacker, 0) / 3; + task->data[12] = var0 > var1 ? var0 : var1; + + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x10; + + task->func = sub_80DBE98; +} diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 11a71155d..b84c431f7 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -1970,7 +1970,7 @@ void sub_807A0F4(struct Sprite *sprite) DestroySpriteAndFreeResources(sprite); } -int sub_807A100(u8 slot, u8 a2) +s16 sub_807A100(u8 slot, u8 a2) { u16 species; u32 personality; -- cgit v1.2.3 From 2d89da39c172c80a8d1ca6ad63e16a8d8e29d39d Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 31 Jan 2018 20:59:31 -0800 Subject: More psychic.s decompilation --- src/battle/anim/psychic.c | 254 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 253 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c index 19bfdfdb6..a00b0ba3a 100644 --- a/src/battle/anim/psychic.c +++ b/src/battle/anim/psychic.c @@ -3,6 +3,7 @@ #include "battle_anim.h" #include "palette.h" #include "rom_8077ABC.h" +#include "scanline_effect.h" #include "sound.h" #include "task.h" #include "trig.h" @@ -18,6 +19,8 @@ extern u8 gObjectBankIDs[]; extern const union AffineAnimCmd *const gUnknown_083DA888[]; extern struct AffineAnimFrameCmd gUnknown_083DA8A4; extern struct AffineAnimFrameCmd gUnknown_083DA8C4; +extern const struct SpriteTemplate gSpriteTemplate_83DA8DC; +extern const struct SpriteTemplate gSpriteTemplate_83DA9AC; static void sub_80DB88C(struct Sprite *sprite); static void sub_80DB8C0(struct Sprite *sprite); @@ -27,7 +30,9 @@ static void sub_80DBC00(struct Sprite *sprite); static void sub_80DBC34(struct Sprite *sprite); static void sub_80DBCD0(u8 taskId); static void sub_80DBD58(u8 taskId); -void sub_80DBE98(u8 taskId); +static void sub_80DBE98(u8 taskId); +static void sub_80DC1FC(u8 taskId); +void sub_80DC3F4(u8 taskId); void sub_80DB74C(struct Sprite *sprite) @@ -354,3 +359,250 @@ void sub_80DBE00(u8 taskId) task->func = sub_80DBE98; } + +static void sub_80DBE98(u8 taskId) +{ + u16 i; + u8 spriteId; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 8) + { + task->data[1] = 0; + spriteId = CreateSprite(&gSpriteTemplate_83DA8DC, task->data[13], task->data[14], 0); + task->data[task->data[2] + 8] = spriteId; + + if (spriteId != 64) + { + switch (task->data[2]) + { + case 0: + gSprites[spriteId].pos2.x = task->data[12]; + gSprites[spriteId].pos2.y = -task->data[12]; + break; + case 1: + gSprites[spriteId].pos2.x = -task->data[12]; + gSprites[spriteId].pos2.y = task->data[12]; + break; + case 2: + gSprites[spriteId].pos2.x = task->data[12]; + gSprites[spriteId].pos2.y = task->data[12]; + break; + case 3: + gSprites[spriteId].pos2.x = -task->data[12]; + gSprites[spriteId].pos2.y = -task->data[12]; + break; + } + } + + if (++task->data[2] == 5) + task->data[0]++; + } + break; + case 1: + if (task->data[1] & 1) + task->data[3]--; + else + task->data[4]++; + + REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; + + if (++task->data[1] == 32) + { + for (i = 8; i < 13; i++) + { + if (task->data[i] != 64) + DestroySprite(&gSprites[task->data[i]]); + } + + task->data[0]++; + } + break; + case 2: + task->data[0]++; + break; + case 3: + REG_BLDALPHA = 0; + REG_BLDCNT = 0; + DestroyAnimVisualTask(taskId); + break; + } +} + +static void sub_80DC020(struct Sprite *sprite) +{ + if (sprite->data[1] > sprite->data[0] - 10) + sprite->invisible = sprite->data[1] & 1; + + if (sprite->data[1] == sprite->data[0]) + DestroyAnimSprite(sprite); + + sprite->data[1]++; +} + +void sub_80DC068(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); + } + + sprite->data[0] = gBattleAnimArgs[1]; + sprite->callback = sub_80DC020; +} + +void sub_80DC0B0(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (IsContest()) + { + if (gBattleAnimArgs[0] == 1) + { + task->data[10] = -10; + task->data[11] = sub_807A100(gAnimBankTarget, 5) - 8; + task->data[12] = sub_807A100(gAnimBankTarget, 2) + 8; + task->data[13] = sub_807A100(gAnimBankAttacker, 5) - 8; + task->data[14] = sub_807A100(gAnimBankAttacker, 2) + 8; + } + else + { + task->data[10] = 10; + task->data[11] = sub_807A100(gAnimBankAttacker, 4) + 8; + task->data[12] = sub_807A100(gAnimBankAttacker, 3) - 8; + task->data[13] = sub_807A100(gAnimBankTarget, 4) + 8; + task->data[14] = sub_807A100(gAnimBankTarget, 3) - 8; + } + } + else + { + if (gBattleAnimArgs[0] == 1) + { + task->data[10] = -10; + task->data[11] = sub_807A100(gAnimBankTarget, 4) + 8; + task->data[12] = sub_807A100(gAnimBankTarget, 2) + 8; + task->data[13] = sub_807A100(gAnimBankAttacker, 4) + 8; + task->data[14] = sub_807A100(gAnimBankAttacker, 2) + 8; + } + else + { + task->data[10] = 10; + task->data[11] = sub_807A100(gAnimBankAttacker, 5) - 8; + task->data[12] = sub_807A100(gAnimBankAttacker, 3) - 8; + task->data[13] = sub_807A100(gAnimBankTarget, 5) - 8; + task->data[14] = sub_807A100(gAnimBankTarget, 3) - 8; + } + } + + task->data[1] = 6; + task->func = sub_80DC1FC; +} + +static void sub_80DC1FC(u8 taskId) +{ + u8 spriteId; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 6) + { + task->data[1] = 0; + spriteId = CreateSprite(&gSpriteTemplate_83DA9AC, task->data[11], task->data[12], 0); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = 16; + gSprites[spriteId].data[2] = task->data[13]; + gSprites[spriteId].data[4] = task->data[14]; + gSprites[spriteId].data[5] = task->data[10]; + + sub_80786EC(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3); + } + + if (++task->data[2] == 12) + task->data[0]++; + } + break; + case 1: + if (++task->data[1] > 17) + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80DC2B0(struct Sprite *sprite) +{ + if (sub_8078718(sprite)) + { + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } +} + +void sub_80DC2D4(u8 taskId) +{ + s16 i; + u8 var1; + struct ScanlineEffectParams scanlineParams; + struct Task *task = &gTasks[taskId]; + + var1 = sub_8077FC0(gAnimBankTarget); + task->data[14] = var1 - 32; + + switch (gBattleAnimArgs[0]) + { + case 0: + task->data[11] = 2; + task->data[12] = 5; + task->data[13] = 64; + task->data[15] = var1 + 32; + break; + case 1: + task->data[11] = 2; + task->data[12] = 5; + task->data[13] = 192; + task->data[15] = var1 + 32; + break; + case 2: + task->data[11] = 4; + task->data[12] = 4; + task->data[13] = 0; + task->data[15] = var1 + 32; + break; + } + + if (task->data[14] < 0) + task->data[14] = 0; + + if (GetBankIdentity_permutated(gAnimBankTarget) == 1) + { + task->data[10] = gBattle_BG1_X; + scanlineParams.dmaDest = ®_BG1HOFS; + } + else + { + task->data[10] = gBattle_BG2_X; + scanlineParams.dmaDest = ®_BG2HOFS; + } + + i = task->data[14]; + while (i <= task->data[14] + 64) + { + gScanlineEffectRegBuffers[0][i] = task->data[10]; + gScanlineEffectRegBuffers[1][i] = task->data[10]; + i++; + } + + scanlineParams.dmaControl = 0XA2600001; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + ScanlineEffect_SetParams(scanlineParams); + + task->func = sub_80DC3F4; +} -- cgit v1.2.3 From 513d85e2df9cdb288df6345107130c4bd144148d Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Thu, 1 Feb 2018 12:20:37 -0800 Subject: Finish decompiling psychic.s --- src/battle/anim/psychic.c | 294 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 293 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c index a00b0ba3a..6617183cb 100644 --- a/src/battle/anim/psychic.c +++ b/src/battle/anim/psychic.c @@ -32,7 +32,8 @@ static void sub_80DBCD0(u8 taskId); static void sub_80DBD58(u8 taskId); static void sub_80DBE98(u8 taskId); static void sub_80DC1FC(u8 taskId); -void sub_80DC3F4(u8 taskId); +static void sub_80DC3F4(u8 taskId); +void sub_80DC5F4(u8 taskId); void sub_80DB74C(struct Sprite *sprite) @@ -606,3 +607,294 @@ void sub_80DC2D4(u8 taskId) task->func = sub_80DC3F4; } + +static void sub_80DC3F4(u8 taskId) +{ + s16 sineIndex, i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + sineIndex = task->data[13]; + i = task->data[14]; + while (i <= task->data[15]) + { + s16 var2 = (gSineTable[sineIndex] >> task->data[12]); + if (var2 > 0) + { + var2 += (task->data[1] & 3); + } + else if (var2 < 0) + { + var2 -= (task->data[1] & 3); + } + + gScanlineEffectRegBuffers[0][i] = task->data[10] + var2; + gScanlineEffectRegBuffers[1][i] = task->data[10] + var2; + + sineIndex += task->data[11]; + i++; + } + + if (++task->data[1] > 23) + { + task->data[0]++; + } + break; + case 1: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 2: + DestroyAnimVisualTask(taskId); + break; + } +} + +#ifdef NONMATCHING +void sub_80DC4F4(u8 taskId) +{ + s16 spriteId; + u8 matrixNum; + register u8 matrixNum2 asm("r6"); + struct Task *task = &gTasks[taskId]; + + matrixNum = AllocOamMatrix(); + matrixNum2 = matrixNum; + if (matrixNum2 == 0xFF) + { + DestroyAnimVisualTask(taskId); + return; + } + + spriteId = duplicate_obj_of_side_rel2move_in_transparent_mode(gBattleAnimArgs[0]); + if (spriteId < 0) + { + FreeOamMatrix(matrixNum); + DestroyAnimVisualTask(taskId); + return; + } + + gSprites[spriteId].callback = SpriteCallbackDummy; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + gSprites[spriteId].oam.matrixNum = matrixNum2; + gSprites[spriteId].affineAnimPaused = 1; + gSprites[spriteId].subpriority++; + obj_id_set_rotscale(spriteId, 256, 256, 0); + CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); + + task->data[13] = GetAnimBankSpriteId(gBattleAnimArgs[0]); + task->data[14] = matrixNum; + task->data[15] = spriteId; + task->func = sub_80DC5F4; +} +#else +__attribute__((naked)) +void sub_80DC4F4(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + mov r8, r4\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + ldr r1, _080DC528 @ =gTasks\n\ + adds r7, r0, r1\n\ + bl AllocOamMatrix\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + mov r10, r5\n\ + adds r6, r5, 0\n\ + cmp r6, 0xFF\n\ + bne _080DC52C\n\ + adds r0, r4, 0\n\ + bl DestroyAnimVisualTask\n\ + b _080DC5D6\n\ + .align 2, 0\n\ +_080DC528: .4byte gTasks\n\ +_080DC52C:\n\ + ldr r1, _080DC550 @ =gBattleAnimArgs\n\ + ldrb r0, [r1]\n\ + bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + mov r9, r1\n\ + asrs r0, 16\n\ + cmp r0, 0\n\ + bge _080DC554\n\ + adds r0, r5, 0\n\ + bl FreeOamMatrix\n\ + mov r0, r8\n\ + bl DestroyAnimVisualTask\n\ + b _080DC5D6\n\ + .align 2, 0\n\ +_080DC550: .4byte gBattleAnimArgs\n\ +_080DC554:\n\ + ldr r2, _080DC5E4 @ =gSprites\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + adds r0, r2, 0\n\ + adds r0, 0x1C\n\ + adds r0, r4, r0\n\ + ldr r1, _080DC5E8 @ =SpriteCallbackDummy\n\ + str r1, [r0]\n\ + adds r4, r2\n\ + ldrb r0, [r4, 0x1]\n\ + movs r1, 0x3\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x1]\n\ + movs r0, 0x1F\n\ + ands r6, r0\n\ + lsls r2, r6, 1\n\ + ldrb r1, [r4, 0x3]\n\ + movs r0, 0x3F\n\ + negs r0, r0\n\ + ands r0, r1\n\ + orrs r0, r2\n\ + strb r0, [r4, 0x3]\n\ + adds r2, r4, 0\n\ + adds r2, 0x2C\n\ + ldrb r0, [r2]\n\ + movs r1, 0x80\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + adds r1, r4, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + mov r1, r9\n\ + lsls r0, r1, 24\n\ + lsrs r0, 24\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + adds r1, r2, 0\n\ + movs r3, 0\n\ + bl obj_id_set_rotscale\n\ + ldrb r3, [r4, 0x1]\n\ + lsrs r1, r3, 6\n\ + ldrb r2, [r4, 0x3]\n\ + lsrs r2, 6\n\ + lsls r3, 30\n\ + lsrs r3, 30\n\ + adds r0, r4, 0\n\ + bl CalcCenterToCornerVec\n\ + ldr r1, _080DC5EC @ =gBattleAnimArgs\n\ + ldrb r0, [r1]\n\ + bl GetAnimBankSpriteId\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + strh r0, [r7, 0x22]\n\ + mov r0, r10\n\ + strh r0, [r7, 0x24]\n\ + mov r1, r9\n\ + strh r1, [r7, 0x26]\n\ + ldr r0, _080DC5F0 @ =sub_80DC5F4\n\ + str r0, [r7]\n\ +_080DC5D6:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080DC5E4: .4byte gSprites\n\ +_080DC5E8: .4byte SpriteCallbackDummy\n\ +_080DC5EC: .4byte gBattleAnimArgs\n\ +_080DC5F0: .4byte sub_80DC5F4\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_80DC5F4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[1] += 4; + task->data[2] = 256 - (gSineTable[task->data[1]] >> 1); + obj_id_set_rotscale(task->data[15], task->data[2], task->data[2], 0); + sub_8079AB8(task->data[15], task->data[13]); + if (task->data[1] == 48) + task->data[0]++; + break; + case 1: + task->data[1] -= 4; + task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);; + obj_id_set_rotscale(task->data[15], task->data[2], task->data[2], 0); + sub_8079AB8(task->data[15], task->data[13]); + if (task->data[1] == 0) + task->data[0]++; + break; + case 2: + obj_delete_but_dont_free_vram(&gSprites[task->data[15]]); + task->data[0]++; + break; + case 3: + FreeOamMatrix(task->data[14]); + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80DC700(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1); + + if (IsContest()) + sprite->pos1.y += 12; + + sprite->data[1] = 8; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = ((16 - sprite->data[1]) << 8) | sprite->data[1]; + sprite->data[0]++; + break; + case 1: + if (sprite->affineAnimEnded) + { + PlaySE12WithPanning(SE_W100, BattleAnimAdjustPanning(-64)); + ChangeSpriteAffineAnim(sprite, 1); + sprite->data[0]++; + } + break; + case 2: + if (sprite->data[2]++ > 1) + { + sprite->data[2] = 0; + sprite->data[1]--; + REG_BLDALPHA = ((16 - sprite->data[1]) << 8) | sprite->data[1]; + + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->invisible = 1; + } + } + + sprite->data[3] += 896; + sprite->pos2.y -= sprite->data[3] >> 8; + sprite->data[3] &= 0xFF; + break; + case 3: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimSprite(sprite); + break; + } +} -- cgit v1.2.3 From 932cc8dba24ed1173a66497006401415c6594a53 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 1 Feb 2018 22:12:23 -0500 Subject: Fail to match sub_811952C --- src/roulette.c | 661 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 330 insertions(+), 331 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index 01c222d24..6cfaa7317 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -2497,57 +2497,58 @@ void sub_81193D4(struct Sprite *sprite) #ifdef NONMATCHING void sub_811952C(struct Sprite *sprite) { + u8 i; u8 z; - register u8 h asm("r10") = 0x0; - u8 j = 0x5; - u32 p = 0x0; u16 o; - u8 i; - u8 s[0xA] = (u8[]){0,0,0,0,0,0,0,0,0,0}; - u16 t = Random(); - eRoulette->var7D = 0x1; + u8 h = 0; // r10 (sp+0xc) + u8 j = 5; // r9 (r9) + u8 p = 0; // sp+0xc (sp+0x10) + u8 s[10] = {}; // sp+0 (sp+0) + u16 t = Random(); // sp+0x10 (r10) + + eRoulette->var7D = 1; eRoulette->var03_5 = TRUE; eRoulette->var03_6 = FALSE; eRoulette->var7E = 0xFF; - eRoulette->var88 = sprite->data[0x3]; + eRoulette->var88 = sprite->data[3]; eRoulette->var98 = 0.0f; - eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C; //couldn't replicate load, same as sub_8118DE4 + eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C; o = (eRoulette->var04_0 * 30 + 33) + (0x1 - eRoulette->var03_0) * 15; - for (i = 0x0; i < 0x4; i++) + for (i = 0; i < 4; i++) { - if (o < sprite->data[0x3] && !(sprite->data[0x3] > o + 90)) + if (o < sprite->data[3] && sprite->data[3] <= o + 90) { - sprite->data[0x0] = i * 0x2; - eRoulette->var03_0 = 0x1 & i; + sprite->data[0] = i << 1; + eRoulette->var03_0 = i & 1; break; } - if (i == 0x3) + if (i == 3) { - sprite->data[0x0] = 0x1; - eRoulette->var03_0 = 0x1; + sprite->data[0] = 1; + eRoulette->var03_0 = 1; break; } o += 90; } if (eRoulette->var03_0) { - if (sprite->data[0x0]) + if (sprite->data[0]) { - PlayCry1(0x130, -0x3F); + PlayCry1(SPECIES_TAILLOW, -0x3F); } else { - PlayCry1(0x130, 0x3F); + PlayCry1(SPECIES_TAILLOW, 0x3F); } } else { - PlayCry1(0x132, -0x3F); + PlayCry1(SPECIES_SHROOMISH, -0x3F); } - i = 0x2; - z = (eRoulette->var7F + 0x2) % 0xC; - if (eRoulette->var03_0 == 0x1 && eRoulette->var04_0 == 0x1) - j += 0x6; + i = 2; + z = (eRoulette->var7F + 2) % 12; + if (eRoulette->var03_0 == 1 && eRoulette->var04_0 == 1) + j += 6; else j += i; for (; i < j; i++) @@ -2560,327 +2561,325 @@ void sub_811952C(struct Sprite *sprite) p = i; } } - z = (z + 0x1) % 0xC; + z = (z + 1) % 0xC; } - if ((eRoulette->var03_0 + 0x1) & eRoulette->var02) + if ((eRoulette->var03_0 + 1) & eRoulette->var02) { - if (p && (t & 0xFF) <= 0xBF) + if (p && (t & 0xFF) < 0xc0) { - sprite->data[0x7] = p; + sprite->data[7] = p; } else { - sprite->data[0x7] = s[t % h]; + sprite->data[7] = s[t % h]; } } else { - sprite->data[0x7] = s[t % h]; + sprite->data[7] = s[t % h]; } - sprite->callback = &sub_8118CEC; + sprite->callback = sub_8118CEC; } #else __attribute__((naked)) void sub_811952C(struct Sprite *sprite) { -asm(".syntax unified\n\ -push {r4-r7,lr}\n\ -mov r7, r10\n\ -mov r6, r9\n\ -mov r5, r8\n\ -push {r5-r7}\n\ -sub sp, 0x14\n\ -mov r8, r0\n\ -movs r0, 0\n\ -mov r10, r0\n\ -movs r1, 0x5\n\ -mov r9, r1\n\ -movs r2, 0\n\ -str r2, [sp, 0xC]\n\ -mov r0, sp\n\ -movs r1, 0\n\ -movs r2, 0xA\n\ -bl memset\n\ -bl Random\n\ -lsls r0, 16\n\ -lsrs r0, 16\n\ -str r0, [sp, 0x10]\n\ -ldr r7, _08119610 @ =gSharedMem + 0x19000\n\ -adds r0, r7, 0\n\ -adds r0, 0x7D\n\ -movs r6, 0x1\n\ -strb r6, [r0]\n\ -ldrb r4, [r7, 0x3]\n\ -movs r0, 0x20\n\ -orrs r4, r0\n\ -movs r0, 0x41\n\ -negs r0, r0\n\ -ands r4, r0\n\ -strb r4, [r7, 0x3]\n\ -adds r1, r7, 0\n\ -adds r1, 0x7E\n\ -movs r0, 0xFF\n\ -strb r0, [r1]\n\ -adds r5, r7, 0\n\ -adds r5, 0x88\n\ -mov r3, r8\n\ -movs r1, 0x34\n\ -ldrsh r0, [r3, r1]\n\ -bl __floatsisf\n\ -str r0, [r5]\n\ -adds r1, r7, 0\n\ -adds r1, 0x98\n\ -ldr r0, _08119614 @ =0x00000000\n\ -str r0, [r1]\n\ -adds r3, r7, 0\n\ -adds r3, 0x8C\n\ -ldr r2, _08119618 @ =gUnknown_083F8DF4\n\ -ldrb r0, [r7, 0x4]\n\ -lsls r0, 30\n\ -lsrs r1, r0, 25\n\ -adds r2, 0x1C\n\ -adds r1, r2\n\ -ldr r1, [r1]\n\ -str r1, [r3]\n\ -lsrs r0, 30\n\ -lsls r1, r0, 4\n\ -subs r1, r0\n\ -lsls r1, 1\n\ -adds r1, 0x21\n\ -lsls r4, 27\n\ -lsrs r4, 27\n\ -subs r6, r4\n\ -lsls r0, r6, 4\n\ -subs r0, r6\n\ -adds r1, r0\n\ -lsls r1, 16\n\ -lsrs r1, 16\n\ -mov r5, r10\n\ -mov r3, r8\n\ -movs r0, 0x34\n\ -ldrsh r2, [r3, r0]\n\ -_081195C8:\n\ -cmp r1, r2\n\ -bge _081195D4\n\ -adds r0, r1, 0\n\ -adds r0, 0x5A\n\ -cmp r2, r0\n\ -ble _08119638\n\ -_081195D4:\n\ -cmp r5, 0x3\n\ -beq _0811961C\n\ -adds r0, r1, 0\n\ -adds r0, 0x5A\n\ -lsls r0, 16\n\ -lsrs r1, r0, 16\n\ -adds r0, r5, 0x1\n\ -lsls r0, 24\n\ -lsrs r5, r0, 24\n\ -cmp r5, 0x3\n\ -bls _081195C8\n\ -_081195EA:\n\ -ldr r0, _08119610 @ =gSharedMem + 0x19000\n\ -ldrb r1, [r0, 0x3]\n\ -movs r0, 0x1F\n\ -ands r0, r1\n\ -cmp r0, 0\n\ -beq _08119664\n\ -mov r1, r8\n\ -movs r2, 0x2E\n\ -ldrsh r0, [r1, r2]\n\ -cmp r0, 0\n\ -beq _08119658\n\ -movs r0, 0x98\n\ -lsls r0, 1\n\ -movs r1, 0x3F\n\ -negs r1, r1\n\ -bl PlayCry1\n\ -b _08119670\n\ -.align 2, 0\n\ -_08119610: .4byte gSharedMem + 0x19000\n\ -_08119614: .4byte 0x00000000\n\ -_08119618: .4byte gUnknown_083F8DF4\n\ -_0811961C:\n\ -movs r0, 0x1\n\ -mov r3, r8\n\ -strh r0, [r3, 0x2E]\n\ -ldr r2, _08119634 @ =gSharedMem + 0x19000\n\ -ldrb r1, [r2, 0x3]\n\ -subs r0, 0x21\n\ -ands r0, r1\n\ -movs r1, 0x1\n\ -orrs r0, r1\n\ -strb r0, [r2, 0x3]\n\ -b _081195EA\n\ -.align 2, 0\n\ -_08119634: .4byte gSharedMem + 0x19000\n\ -_08119638:\n\ -lsrs r0, r5, 1\n\ -mov r1, r8\n\ -strh r0, [r1, 0x2E]\n\ -ldr r3, _08119654 @ =gSharedMem + 0x19000\n\ -movs r1, 0x1\n\ -ands r1, r5\n\ -ldrb r2, [r3, 0x3]\n\ -movs r0, 0x20\n\ -negs r0, r0\n\ -ands r0, r2\n\ -orrs r0, r1\n\ -strb r0, [r3, 0x3]\n\ -b _081195EA\n\ -.align 2, 0\n\ -_08119654: .4byte gSharedMem + 0x19000\n\ -_08119658:\n\ -movs r0, 0x98\n\ -lsls r0, 1\n\ -movs r1, 0x3F\n\ -bl PlayCry1\n\ -b _08119670\n\ -_08119664:\n\ -movs r0, 0x99\n\ -lsls r0, 1\n\ -movs r1, 0x3F\n\ -negs r1, r1\n\ -bl PlayCry1\n\ -_08119670:\n\ -movs r5, 0x2\n\ -ldr r4, _081196A0 @ =gSharedMem + 0x19000\n\ -adds r0, r4, 0\n\ -adds r0, 0x7F\n\ -ldrb r0, [r0]\n\ -adds r0, 0x2\n\ -movs r1, 0xC\n\ -bl __modsi3\n\ -lsls r0, 24\n\ -lsrs r3, r0, 24\n\ -ldrb r1, [r4, 0x3]\n\ -movs r0, 0x1F\n\ -ands r0, r1\n\ -cmp r0, 0x1\n\ -bne _081196A4\n\ -ldrb r1, [r4, 0x4]\n\ -movs r0, 0x3\n\ -ands r0, r1\n\ -cmp r0, 0x1\n\ -bne _081196A4\n\ -mov r0, r9\n\ -adds r0, 0x6\n\ -b _081196A8\n\ -.align 2, 0\n\ -_081196A0: .4byte gSharedMem + 0x19000\n\ -_081196A4:\n\ -mov r2, r9\n\ -adds r0, r2, r5\n\ -_081196A8:\n\ -lsls r0, 24\n\ -lsrs r0, 24\n\ -mov r9, r0\n\ -cmp r5, r9\n\ -bcs _0811970E\n\ -ldr r6, _08119734 @ =gSharedMem + 0x19000\n\ -ldr r7, _08119738 @ =gUnknown_083F8C00 + 0xC\n\ -_081196B6:\n\ -lsls r0, r3, 3\n\ -ldr r1, _0811973C @ =gUnknown_083F8D90 + 0x4\n\ -adds r0, r1\n\ -ldr r1, [r6, 0x8]\n\ -ldr r2, [r0]\n\ -ands r1, r2\n\ -cmp r1, 0\n\ -bne _081196F8\n\ -mov r0, r10\n\ -adds r1, r0, 0x1\n\ -lsls r1, 24\n\ -lsrs r1, 24\n\ -mov r10, r1\n\ -add r0, sp\n\ -strb r5, [r0]\n\ -ldr r0, [sp, 0xC]\n\ -cmp r0, 0\n\ -bne _081196F8\n\ -ldrb r0, [r6, 0x1A]\n\ -lsls r0, 28\n\ -lsrs r0, 28\n\ -ldr r1, _08119740 @ =gSharedMem + 0x1901B\n\ -adds r0, r1\n\ -ldrb r1, [r0]\n\ -lsls r0, r1, 2\n\ -adds r0, r1\n\ -lsls r0, 2\n\ -adds r0, r7\n\ -ldr r0, [r0]\n\ -ands r2, r0\n\ -cmp r2, 0\n\ -beq _081196F8\n\ -str r5, [sp, 0xC]\n\ -_081196F8:\n\ -adds r0, r3, 0x1\n\ -movs r1, 0xC\n\ -bl __modsi3\n\ -lsls r0, 24\n\ -lsrs r3, r0, 24\n\ -adds r0, r5, 0x1\n\ -lsls r0, 24\n\ -lsrs r5, r0, 24\n\ -cmp r5, r9\n\ -bcc _081196B6\n\ -_0811970E:\n\ -ldrb r0, [r4, 0x3]\n\ -lsls r0, 27\n\ -lsrs r0, 27\n\ -adds r0, 0x1\n\ -ldrb r1, [r4, 0x2]\n\ -ands r0, r1\n\ -cmp r0, 0\n\ -beq _08119756\n\ -ldr r2, [sp, 0xC]\n\ -cmp r2, 0\n\ -beq _08119744\n\ -movs r0, 0xFF\n\ -ldr r3, [sp, 0x10]\n\ -ands r0, r3\n\ -cmp r0, 0xBF\n\ -bhi _08119744\n\ -mov r0, r8\n\ -strh r2, [r0, 0x3C]\n\ -b _08119766\n\ -.align 2, 0\n\ -_08119734: .4byte gSharedMem + 0x19000\n\ -_08119738: .4byte gUnknown_083F8C00 + 0xC\n\ -_0811973C: .4byte gUnknown_083F8D90 + 0x4\n\ -_08119740: .4byte gSharedMem + 0x1901B\n\ -_08119744:\n\ -ldr r0, [sp, 0x10]\n\ -mov r1, r10\n\ -bl __modsi3\n\ -add r0, sp\n\ -ldrb r0, [r0]\n\ -mov r1, r8\n\ -strh r0, [r1, 0x3C]\n\ -b _08119766\n\ -_08119756:\n\ -ldr r0, [sp, 0x10]\n\ -mov r1, r10\n\ -bl __modsi3\n\ -add r0, sp\n\ -ldrb r0, [r0]\n\ -mov r2, r8\n\ -strh r0, [r2, 0x3C]\n\ -_08119766:\n\ -ldr r3, _0811977C @ =sub_8118CEC\n\ -mov r0, r8\n\ -str r3, [r0, 0x1C]\n\ -add sp, 0x14\n\ -pop {r3-r5}\n\ -mov r8, r3\n\ -mov r9, r4\n\ -mov r10, r5\n\ -pop {r4-r7}\n\ -pop {r0}\n\ -bx r0\n\ -.align 2, 0\n\ -_0811977C: .4byte sub_8118CEC\n\ -.syntax divided\n"); + asm_unified("push {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x14\n" + "\tmov r8, r0\n" + "\tmovs r0, 0\n" + "\tmov r10, r0\n" + "\tmovs r1, 0x5\n" + "\tmov r9, r1\n" + "\tmovs r2, 0\n" + "\tstr r2, [sp, 0xC]\n" + "\tmov r0, sp\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0xA\n" + "\tbl memset\n" + "\tbl Random\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tstr r0, [sp, 0x10]\n" + "\tldr r7, _08119610 @ =gSharedMem + 0x19000\n" + "\tadds r0, r7, 0\n" + "\tadds r0, 0x7D\n" + "\tmovs r6, 0x1\n" + "\tstrb r6, [r0]\n" + "\tldrb r4, [r7, 0x3]\n" + "\tmovs r0, 0x20\n" + "\torrs r4, r0\n" + "\tmovs r0, 0x41\n" + "\tnegs r0, r0\n" + "\tands r4, r0\n" + "\tstrb r4, [r7, 0x3]\n" + "\tadds r1, r7, 0\n" + "\tadds r1, 0x7E\n" + "\tmovs r0, 0xFF\n" + "\tstrb r0, [r1]\n" + "\tadds r5, r7, 0\n" + "\tadds r5, 0x88\n" + "\tmov r3, r8\n" + "\tmovs r1, 0x34\n" + "\tldrsh r0, [r3, r1]\n" + "\tbl __floatsisf\n" + "\tstr r0, [r5]\n" + "\tadds r1, r7, 0\n" + "\tadds r1, 0x98\n" + "\tldr r0, _08119614 @ =0x00000000\n" + "\tstr r0, [r1]\n" + "\tadds r3, r7, 0\n" + "\tadds r3, 0x8C\n" + "\tldr r2, _08119618 @ =gUnknown_083F8DF4\n" + "\tldrb r0, [r7, 0x4]\n" + "\tlsls r0, 30\n" + "\tlsrs r1, r0, 25\n" + "\tadds r2, 0x1C\n" + "\tadds r1, r2\n" + "\tldr r1, [r1]\n" + "\tstr r1, [r3]\n" + "\tlsrs r0, 30\n" + "\tlsls r1, r0, 4\n" + "\tsubs r1, r0\n" + "\tlsls r1, 1\n" + "\tadds r1, 0x21\n" + "\tlsls r4, 27\n" + "\tlsrs r4, 27\n" + "\tsubs r6, r4\n" + "\tlsls r0, r6, 4\n" + "\tsubs r0, r6\n" + "\tadds r1, r0\n" + "\tlsls r1, 16\n" + "\tlsrs r1, 16\n" + "\tmov r5, r10\n" + "\tmov r3, r8\n" + "\tmovs r0, 0x34\n" + "\tldrsh r2, [r3, r0]\n" + "_081195C8:\n" + "\tcmp r1, r2\n" + "\tbge _081195D4\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x5A\n" + "\tcmp r2, r0\n" + "\tble _08119638\n" + "_081195D4:\n" + "\tcmp r5, 0x3\n" + "\tbeq _0811961C\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x5A\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tcmp r5, 0x3\n" + "\tbls _081195C8\n" + "_081195EA:\n" + "\tldr r0, _08119610 @ =gSharedMem + 0x19000\n" + "\tldrb r1, [r0, 0x3]\n" + "\tmovs r0, 0x1F\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _08119664\n" + "\tmov r1, r8\n" + "\tmovs r2, 0x2E\n" + "\tldrsh r0, [r1, r2]\n" + "\tcmp r0, 0\n" + "\tbeq _08119658\n" + "\tmovs r0, 0x98\n" + "\tlsls r0, 1\n" + "\tmovs r1, 0x3F\n" + "\tnegs r1, r1\n" + "\tbl PlayCry1\n" + "\tb _08119670\n" + "\t.align 2, 0\n" + "_08119610: .4byte gSharedMem + 0x19000\n" + "_08119614: .4byte 0x00000000\n" + "_08119618: .4byte gUnknown_083F8DF4\n" + "_0811961C:\n" + "\tmovs r0, 0x1\n" + "\tmov r3, r8\n" + "\tstrh r0, [r3, 0x2E]\n" + "\tldr r2, _08119634 @ =gSharedMem + 0x19000\n" + "\tldrb r1, [r2, 0x3]\n" + "\tsubs r0, 0x21\n" + "\tands r0, r1\n" + "\tmovs r1, 0x1\n" + "\torrs r0, r1\n" + "\tstrb r0, [r2, 0x3]\n" + "\tb _081195EA\n" + "\t.align 2, 0\n" + "_08119634: .4byte gSharedMem + 0x19000\n" + "_08119638:\n" + "\tlsrs r0, r5, 1\n" + "\tmov r1, r8\n" + "\tstrh r0, [r1, 0x2E]\n" + "\tldr r3, _08119654 @ =gSharedMem + 0x19000\n" + "\tmovs r1, 0x1\n" + "\tands r1, r5\n" + "\tldrb r2, [r3, 0x3]\n" + "\tmovs r0, 0x20\n" + "\tnegs r0, r0\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstrb r0, [r3, 0x3]\n" + "\tb _081195EA\n" + "\t.align 2, 0\n" + "_08119654: .4byte gSharedMem + 0x19000\n" + "_08119658:\n" + "\tmovs r0, 0x98\n" + "\tlsls r0, 1\n" + "\tmovs r1, 0x3F\n" + "\tbl PlayCry1\n" + "\tb _08119670\n" + "_08119664:\n" + "\tmovs r0, 0x99\n" + "\tlsls r0, 1\n" + "\tmovs r1, 0x3F\n" + "\tnegs r1, r1\n" + "\tbl PlayCry1\n" + "_08119670:\n" + "\tmovs r5, 0x2\n" + "\tldr r4, _081196A0 @ =gSharedMem + 0x19000\n" + "\tadds r0, r4, 0\n" + "\tadds r0, 0x7F\n" + "\tldrb r0, [r0]\n" + "\tadds r0, 0x2\n" + "\tmovs r1, 0xC\n" + "\tbl __modsi3\n" + "\tlsls r0, 24\n" + "\tlsrs r3, r0, 24\n" + "\tldrb r1, [r4, 0x3]\n" + "\tmovs r0, 0x1F\n" + "\tands r0, r1\n" + "\tcmp r0, 0x1\n" + "\tbne _081196A4\n" + "\tldrb r1, [r4, 0x4]\n" + "\tmovs r0, 0x3\n" + "\tands r0, r1\n" + "\tcmp r0, 0x1\n" + "\tbne _081196A4\n" + "\tmov r0, r9\n" + "\tadds r0, 0x6\n" + "\tb _081196A8\n" + "\t.align 2, 0\n" + "_081196A0: .4byte gSharedMem + 0x19000\n" + "_081196A4:\n" + "\tmov r2, r9\n" + "\tadds r0, r2, r5\n" + "_081196A8:\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r9, r0\n" + "\tcmp r5, r9\n" + "\tbcs _0811970E\n" + "\tldr r6, _08119734 @ =gSharedMem + 0x19000\n" + "\tldr r7, _08119738 @ =gUnknown_083F8C00 + 0xC\n" + "_081196B6:\n" + "\tlsls r0, r3, 3\n" + "\tldr r1, _0811973C @ =gUnknown_083F8D90 + 0x4\n" + "\tadds r0, r1\n" + "\tldr r1, [r6, 0x8]\n" + "\tldr r2, [r0]\n" + "\tands r1, r2\n" + "\tcmp r1, 0\n" + "\tbne _081196F8\n" + "\tmov r0, r10\n" + "\tadds r1, r0, 0x1\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tmov r10, r1\n" + "\tadd r0, sp\n" + "\tstrb r5, [r0]\n" + "\tldr r0, [sp, 0xC]\n" + "\tcmp r0, 0\n" + "\tbne _081196F8\n" + "\tldrb r0, [r6, 0x1A]\n" + "\tlsls r0, 28\n" + "\tlsrs r0, 28\n" + "\tldr r1, _08119740 @ =gSharedMem + 0x1901B\n" + "\tadds r0, r1\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 2\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tldr r0, [r0]\n" + "\tands r2, r0\n" + "\tcmp r2, 0\n" + "\tbeq _081196F8\n" + "\tstr r5, [sp, 0xC]\n" + "_081196F8:\n" + "\tadds r0, r3, 0x1\n" + "\tmovs r1, 0xC\n" + "\tbl __modsi3\n" + "\tlsls r0, 24\n" + "\tlsrs r3, r0, 24\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tcmp r5, r9\n" + "\tbcc _081196B6\n" + "_0811970E:\n" + "\tldrb r0, [r4, 0x3]\n" + "\tlsls r0, 27\n" + "\tlsrs r0, 27\n" + "\tadds r0, 0x1\n" + "\tldrb r1, [r4, 0x2]\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _08119756\n" + "\tldr r2, [sp, 0xC]\n" + "\tcmp r2, 0\n" + "\tbeq _08119744\n" + "\tmovs r0, 0xFF\n" + "\tldr r3, [sp, 0x10]\n" + "\tands r0, r3\n" + "\tcmp r0, 0xBF\n" + "\tbhi _08119744\n" + "\tmov r0, r8\n" + "\tstrh r2, [r0, 0x3C]\n" + "\tb _08119766\n" + "\t.align 2, 0\n" + "_08119734: .4byte gSharedMem + 0x19000\n" + "_08119738: .4byte gUnknown_083F8C00 + 0xC\n" + "_0811973C: .4byte gUnknown_083F8D90 + 0x4\n" + "_08119740: .4byte gSharedMem + 0x1901B\n" + "_08119744:\n" + "\tldr r0, [sp, 0x10]\n" + "\tmov r1, r10\n" + "\tbl __modsi3\n" + "\tadd r0, sp\n" + "\tldrb r0, [r0]\n" + "\tmov r1, r8\n" + "\tstrh r0, [r1, 0x3C]\n" + "\tb _08119766\n" + "_08119756:\n" + "\tldr r0, [sp, 0x10]\n" + "\tmov r1, r10\n" + "\tbl __modsi3\n" + "\tadd r0, sp\n" + "\tldrb r0, [r0]\n" + "\tmov r2, r8\n" + "\tstrh r0, [r2, 0x3C]\n" + "_08119766:\n" + "\tldr r3, _0811977C @ =sub_8118CEC\n" + "\tmov r0, r8\n" + "\tstr r3, [r0, 0x1C]\n" + "\tadd sp, 0x14\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0811977C: .4byte sub_8118CEC"); } #endif @@ -3082,9 +3081,9 @@ void sub_8119BCC(struct Sprite *sprite) { m4aSongNumStartOrChange(0x5E); if(eRoulette->var38->data[0x0] == 0x0) - PlayCry1(0x130, 0x3F); + PlayCry1(SPECIES_TAILLOW, 0x3F); else - PlayCry1(0x130, -0x3F); + PlayCry1(SPECIES_TAILLOW, -0x3F); StartSpriteAnim(sprite, eRoulette->var38->data[0x0] + 0x2); sprite->data[0x1] = 45; sprite->callback = &sub_8119B24; -- cgit v1.2.3 From c53d1ab55bf990186513f0ed8c115d05b7b873d7 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 1 Feb 2018 22:31:58 -0500 Subject: match NameHasGenderSymbol --- src/field/daycare.c | 82 +---------------------------------------------------- 1 file changed, 1 insertion(+), 81 deletions(-) (limited to 'src') diff --git a/src/field/daycare.c b/src/field/daycare.c index 36dd7ec03..019b19093 100644 --- a/src/field/daycare.c +++ b/src/field/daycare.c @@ -1574,17 +1574,13 @@ void SetDaycareCompatibilityString(void) StringCopy(gStringVar4, sCompatibilityMessages[whichString]); } -#ifdef NONMATCHING bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) { u8 i; u8 flags[2]; - // This portion is nonmatching - flags[1] = 0; - flags[0] = 0; + flags[0] = flags[1] = 0; for (i = 0; name[i] != EOS; i++) - // End nonmatching portion { if (name[i] == CHAR_MALE) flags[0]++; @@ -1594,82 +1590,6 @@ bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) if (genderRatio == MON_FEMALE && flags[1] && !flags[0]) return TRUE; return FALSE; } -#else -__attribute__((naked)) -bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) -{ - asm_unified("\n" - "\tpush {r4,r5,lr}\n" - "\tsub sp, 0x4\n" - "\tadds r4, r0, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r5, r1, 24\n" - "\tmov r2, sp\n" - "\tmov r1, sp\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r1, 0x1]\n" - "\tstrb r0, [r2]\n" - "\tmovs r3, 0\n" - "\tldrb r0, [r4]\n" - "\tcmp r0, 0xFF\n" - "\tbeq _0804258C\n" - "_08042564:\n" - "\tadds r1, r4, r3\n" - "\tldrb r0, [r1]\n" - "\tcmp r0, 0xB5\n" - "\tbne _08042572\n" - "\tldrb r0, [r2]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r2]\n" - "_08042572:\n" - "\tldrb r0, [r1]\n" - "\tcmp r0, 0xB6\n" - "\tbne _0804257E\n" - "\tldrb r0, [r2, 0x1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r2, 0x1]\n" - "_0804257E:\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tadds r0, r4, r3\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0xFF\n" - "\tbne _08042564\n" - "_0804258C:\n" - "\tcmp r5, 0\n" - "\tbne _080425A0\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbeq _080425A0\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0, 0x1]\n" - "\tcmp r0, 0\n" - "\tbeq _080425B4\n" - "_080425A0:\n" - "\tcmp r5, 0xFE\n" - "\tbne _080425B8\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0, 0x1]\n" - "\tcmp r0, 0\n" - "\tbeq _080425B8\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080425B8\n" - "_080425B4:\n" - "\tmovs r0, 0x1\n" - "\tb _080425BA\n" - "_080425B8:\n" - "\tmovs r0, 0\n" - "_080425BA:\n" - "\tadd sp, 0x4\n" - "\tpop {r4,r5}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif static u8 *AppendGenderSymbol(u8 *name, u8 gender) { -- cgit v1.2.3 From 9776f51f0643a8d988fcd5fc2ac404a7ea285235 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 3 Feb 2018 09:18:12 -0500 Subject: Declare gBagPockets as non-const in item.c for the sake of getting AddBagItem to match without the NONMATCHING define --- src/field/daycare.c | 7 +- src/field/item.c | 308 ++++++++++++++++++++++++++-------------------------- 2 files changed, 159 insertions(+), 156 deletions(-) (limited to 'src') diff --git a/src/field/daycare.c b/src/field/daycare.c index 019b19093..b80a0f69d 100644 --- a/src/field/daycare.c +++ b/src/field/daycare.c @@ -1581,13 +1581,14 @@ bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) flags[0] = flags[1] = 0; for (i = 0; name[i] != EOS; i++) - { if (name[i] == CHAR_MALE) flags[0]++; if (name[i] == CHAR_FEMALE) flags[1]++; } - if (genderRatio == MON_MALE && flags[0] && !flags[1]) return TRUE; - if (genderRatio == MON_FEMALE && flags[1] && !flags[0]) return TRUE; + if (genderRatio == MON_MALE && flags[0] && !flags[1]) + return TRUE; + if (genderRatio == MON_FEMALE && flags[1] && !flags[0]) + return TRUE; return FALSE; } diff --git a/src/field/item.c b/src/field/item.c index 6ff7a7cbe..78f5ce12d 100644 --- a/src/field/item.c +++ b/src/field/item.c @@ -2,12 +2,14 @@ #include "constants/hold_effects.h" #include "item.h" #include "constants/items.h" +#include "item_menu.h" #include "item_use.h" #include "berry.h" #include "string_util.h" #include "strings.h" extern u8 gUnknown_02038560; +extern struct BagPocket gBagPockets[NUM_BAG_POCKETS]; // These constants are used in gItems enum @@ -151,7 +153,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count) // This function matches if gBagPockets is declared non-const, // but it should be fixed anyway. -#ifdef NONMATCHING +//#ifdef NONMATCHING bool8 AddBagItem(u16 itemId, u16 count) { u8 i; @@ -216,158 +218,158 @@ bool8 AddBagItem(u16 itemId, u16 count) memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); return TRUE; } -#else -__attribute__((naked)) -bool8 AddBagItem(u16 itemId, u16 count) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x100\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ - lsls r1, 16\n\ - lsrs r4, r1, 16\n\ - bl ItemId_GetPocket\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080A9510\n\ - mov r0, r8\n\ - bl ItemId_GetPocket\n\ - subs r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r1, _080A94F8 @ =gBagPockets\n\ - lsls r0, r6, 3\n\ - adds r5, r0, r1\n\ - ldr r1, [r5]\n\ - ldrb r2, [r5, 0x4]\n\ - lsls r2, 2\n\ - mov r0, sp\n\ - bl memcpy\n\ - ldr r7, _080A94FC @ =0x000003e7\n\ - cmp r6, 0x3\n\ - beq _080A9468\n\ - movs r7, 0x63\n\ -_080A9468:\n\ - movs r1, 0\n\ - ldrb r0, [r5, 0x4]\n\ - cmp r1, r0\n\ - bcs _080A94B2\n\ - subs r0, r6, 0x2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r12, r0\n\ -_080A9478:\n\ - lsls r0, r1, 2\n\ - mov r2, sp\n\ - adds r3, r2, r0\n\ - ldrh r0, [r3]\n\ - cmp r0, r8\n\ - bne _080A94A6\n\ - ldrh r2, [r3, 0x2]\n\ - adds r0, r2, r4\n\ - cmp r0, r7\n\ - ble _080A9500\n\ - mov r0, r12\n\ - cmp r0, 0x1\n\ - bls _080A9510\n\ - subs r0, r7, r2\n\ - subs r0, r4, r0\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - strh r7, [r3, 0x2]\n\ - ldr r2, _080A94F8 @ =gBagPockets\n\ - mov r9, r2\n\ - lsls r3, r6, 3\n\ - cmp r4, 0\n\ - beq _080A9516\n\ -_080A94A6:\n\ - adds r0, r1, 0x1\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldrb r0, [r5, 0x4]\n\ - cmp r1, r0\n\ - bcc _080A9478\n\ -_080A94B2:\n\ - ldr r2, _080A94F8 @ =gBagPockets\n\ - mov r9, r2\n\ - lsls r3, r6, 3\n\ - cmp r4, 0\n\ - beq _080A9516\n\ - movs r1, 0\n\ - adds r0, r3, r2\n\ - ldrb r0, [r0, 0x4]\n\ - cmp r1, r0\n\ - bcs _080A94F2\n\ - mov r6, r9\n\ - adds r5, r3, r6\n\ -_080A94CA:\n\ - lsls r0, r1, 2\n\ - mov r6, sp\n\ - adds r2, r6, r0\n\ - ldrh r0, [r2]\n\ - cmp r0, 0\n\ - bne _080A94E6\n\ - mov r0, r8\n\ - strh r0, [r2]\n\ - cmp r4, r7\n\ - bls _080A9514\n\ - subs r0, r4, r7\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - strh r7, [r2, 0x2]\n\ -_080A94E6:\n\ - adds r0, r1, 0x1\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldrb r2, [r5, 0x4]\n\ - cmp r1, r2\n\ - bcc _080A94CA\n\ -_080A94F2:\n\ - cmp r4, 0\n\ - beq _080A9516\n\ - b _080A9510\n\ - .align 2, 0\n\ -_080A94F8: .4byte gBagPockets\n\ -_080A94FC: .4byte 0x000003e7\n\ -_080A9500:\n\ - strh r0, [r3, 0x2]\n\ - ldr r0, _080A950C @ =gBagPockets\n\ - lsls r1, r6, 3\n\ - adds r1, r0\n\ - b _080A951A\n\ - .align 2, 0\n\ -_080A950C: .4byte gBagPockets\n\ -_080A9510:\n\ - movs r0, 0\n\ - b _080A9528\n\ -_080A9514:\n\ - strh r4, [r2, 0x2]\n\ -_080A9516:\n\ - mov r6, r9\n\ - adds r1, r3, r6\n\ -_080A951A:\n\ - ldr r0, [r1]\n\ - ldrb r2, [r1, 0x4]\n\ - lsls r2, 2\n\ - mov r1, sp\n\ - bl memcpy\n\ - movs r0, 0x1\n\ -_080A9528:\n\ - add sp, 0x100\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif +//#else +//__attribute__((naked)) +//bool8 AddBagItem(u16 itemId, u16 count) +//{ +// asm(".syntax unified\n\ +// push {r4-r7,lr}\n\ +// mov r7, r9\n\ +// mov r6, r8\n\ +// push {r6,r7}\n\ +// sub sp, 0x100\n\ +// lsls r0, 16\n\ +// lsrs r0, 16\n\ +// mov r8, r0\n\ +// lsls r1, 16\n\ +// lsrs r4, r1, 16\n\ +// bl ItemId_GetPocket\n\ +// lsls r0, 24\n\ +// cmp r0, 0\n\ +// beq _080A9510\n\ +// mov r0, r8\n\ +// bl ItemId_GetPocket\n\ +// subs r0, 0x1\n\ +// lsls r0, 24\n\ +// lsrs r6, r0, 24\n\ +// ldr r1, _080A94F8 @ =gBagPockets\n\ +// lsls r0, r6, 3\n\ +// adds r5, r0, r1\n\ +// ldr r1, [r5]\n\ +// ldrb r2, [r5, 0x4]\n\ +// lsls r2, 2\n\ +// mov r0, sp\n\ +// bl memcpy\n\ +// ldr r7, _080A94FC @ =0x000003e7\n\ +// cmp r6, 0x3\n\ +// beq _080A9468\n\ +// movs r7, 0x63\n\ +//_080A9468:\n\ +// movs r1, 0\n\ +// ldrb r0, [r5, 0x4]\n\ +// cmp r1, r0\n\ +// bcs _080A94B2\n\ +// subs r0, r6, 0x2\n\ +// lsls r0, 24\n\ +// lsrs r0, 24\n\ +// mov r12, r0\n\ +//_080A9478:\n\ +// lsls r0, r1, 2\n\ +// mov r2, sp\n\ +// adds r3, r2, r0\n\ +// ldrh r0, [r3]\n\ +// cmp r0, r8\n\ +// bne _080A94A6\n\ +// ldrh r2, [r3, 0x2]\n\ +// adds r0, r2, r4\n\ +// cmp r0, r7\n\ +// ble _080A9500\n\ +// mov r0, r12\n\ +// cmp r0, 0x1\n\ +// bls _080A9510\n\ +// subs r0, r7, r2\n\ +// subs r0, r4, r0\n\ +// lsls r0, 16\n\ +// lsrs r4, r0, 16\n\ +// strh r7, [r3, 0x2]\n\ +// ldr r2, _080A94F8 @ =gBagPockets\n\ +// mov r9, r2\n\ +// lsls r3, r6, 3\n\ +// cmp r4, 0\n\ +// beq _080A9516\n\ +//_080A94A6:\n\ +// adds r0, r1, 0x1\n\ +// lsls r0, 24\n\ +// lsrs r1, r0, 24\n\ +// ldrb r0, [r5, 0x4]\n\ +// cmp r1, r0\n\ +// bcc _080A9478\n\ +//_080A94B2:\n\ +// ldr r2, _080A94F8 @ =gBagPockets\n\ +// mov r9, r2\n\ +// lsls r3, r6, 3\n\ +// cmp r4, 0\n\ +// beq _080A9516\n\ +// movs r1, 0\n\ +// adds r0, r3, r2\n\ +// ldrb r0, [r0, 0x4]\n\ +// cmp r1, r0\n\ +// bcs _080A94F2\n\ +// mov r6, r9\n\ +// adds r5, r3, r6\n\ +//_080A94CA:\n\ +// lsls r0, r1, 2\n\ +// mov r6, sp\n\ +// adds r2, r6, r0\n\ +// ldrh r0, [r2]\n\ +// cmp r0, 0\n\ +// bne _080A94E6\n\ +// mov r0, r8\n\ +// strh r0, [r2]\n\ +// cmp r4, r7\n\ +// bls _080A9514\n\ +// subs r0, r4, r7\n\ +// lsls r0, 16\n\ +// lsrs r4, r0, 16\n\ +// strh r7, [r2, 0x2]\n\ +//_080A94E6:\n\ +// adds r0, r1, 0x1\n\ +// lsls r0, 24\n\ +// lsrs r1, r0, 24\n\ +// ldrb r2, [r5, 0x4]\n\ +// cmp r1, r2\n\ +// bcc _080A94CA\n\ +//_080A94F2:\n\ +// cmp r4, 0\n\ +// beq _080A9516\n\ +// b _080A9510\n\ +// .align 2, 0\n\ +//_080A94F8: .4byte gBagPockets\n\ +//_080A94FC: .4byte 0x000003e7\n\ +//_080A9500:\n\ +// strh r0, [r3, 0x2]\n\ +// ldr r0, _080A950C @ =gBagPockets\n\ +// lsls r1, r6, 3\n\ +// adds r1, r0\n\ +// b _080A951A\n\ +// .align 2, 0\n\ +//_080A950C: .4byte gBagPockets\n\ +//_080A9510:\n\ +// movs r0, 0\n\ +// b _080A9528\n\ +//_080A9514:\n\ +// strh r4, [r2, 0x2]\n\ +//_080A9516:\n\ +// mov r6, r9\n\ +// adds r1, r3, r6\n\ +//_080A951A:\n\ +// ldr r0, [r1]\n\ +// ldrb r2, [r1, 0x4]\n\ +// lsls r2, 2\n\ +// mov r1, sp\n\ +// bl memcpy\n\ +// movs r0, 0x1\n\ +//_080A9528:\n\ +// add sp, 0x100\n\ +// pop {r3,r4}\n\ +// mov r8, r3\n\ +// mov r9, r4\n\ +// pop {r4-r7}\n\ +// pop {r1}\n\ +// bx r1\n\ +// .syntax divided\n"); +//} +//#endif bool8 RemoveBagItem(u16 itemId, u16 count) { -- cgit v1.2.3 From b07c9d88326dc5b1383a2179a24b4c5ba954474a Mon Sep 17 00:00:00 2001 From: yenatch Date: Sat, 3 Feb 2018 13:39:04 -0500 Subject: fix a goto in battle_2 --- src/battle/battle_2.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 2ad2adb04..6f885b20e 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -727,16 +727,14 @@ void sub_800F298(void) ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); gBattleCommunication[0]++; - goto step_2; - } - break; + // fallthrough case 2: - step_2: - if (IsLinkTaskFinished()) - { - SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); - gBattleCommunication[0]++; - } + if (IsLinkTaskFinished()) + { + SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); + gBattleCommunication[0]++; + } + } break; case 3: if ((GetBlockReceivedStatus() & 0xF) == 0xF) -- cgit v1.2.3 From 2c4d7844e48864d962573eb66fe4b9e68b9631f0 Mon Sep 17 00:00:00 2001 From: yenatch Date: Sat, 3 Feb 2018 13:41:36 -0500 Subject: trainer constants in battle_setup and pokemon_2 --- src/battle/battle_setup.c | 18 +++++++++--------- src/pokemon/pokemon_2.c | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c index 15555f833..83283b9e2 100644 --- a/src/battle/battle_setup.c +++ b/src/battle/battle_setup.c @@ -802,25 +802,25 @@ static u8 GetTrainerBattleTransition(void) u8 enemyLevel; u8 playerLevel; - if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) // link battle? + if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) return B_TRANSITION_STEVEN; trainer = gTrainers; - if (trainer[gTrainerBattleOpponent].trainerClass == 24) // league? + if (trainer[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_ELITE_FOUR) { - if (gTrainerBattleOpponent == 261) + if (gTrainerBattleOpponent == OPPONENT_SIDNEY) return B_TRANSITION_SYDNEY; - if (gTrainerBattleOpponent == 262) + if (gTrainerBattleOpponent == OPPONENT_PHOEBE) return B_TRANSITION_PHOEBE; - if (gTrainerBattleOpponent == 263) + if (gTrainerBattleOpponent == OPPONENT_GLACIA) return B_TRANSITION_GLACIA; - if (gTrainerBattleOpponent == 264) + if (gTrainerBattleOpponent == OPPONENT_DRAKE) return B_TRANSITION_DRAKE; return B_TRANSITION_STEVEN; } - if (trainer[gTrainerBattleOpponent].trainerClass == 32) // team leader? + if (trainer[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_CHAMPION) return B_TRANSITION_STEVEN; if (trainer[gTrainerBattleOpponent].doubleBattle == TRUE) @@ -1096,7 +1096,7 @@ void CB2_EndTrainerBattle(void) { if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle? + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { @@ -1113,7 +1113,7 @@ void CB2_EndTrainerEyeRematchBattle(void) { if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) { - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle? + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c index 7fd1aa7b2..17f073815 100644 --- a/src/pokemon/pokemon_2.c +++ b/src/pokemon/pokemon_2.c @@ -1102,8 +1102,8 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) } } - gBattleTypeFlags = 8; - gTrainerBattleOpponent = 1024; + gBattleTypeFlags = BATTLE_TYPE_TRAINER; + gTrainerBattleOpponent = SECRET_BASE_OPPONENT; } const u8 gSecretBaseTrainerClasses[][5] = { -- cgit v1.2.3 From 07a44e30ff530d5018f870aba4c5710d1e83059b Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sat, 3 Feb 2018 11:58:21 -0800 Subject: Decompile more of dark.s --- src/battle/anim/dark.c | 440 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 429 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index 8ceb00298..14988ac71 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -1,22 +1,36 @@ #include "global.h" -#include "rom_8077ABC.h" -#include "trig.h" #include "battle_anim.h" -#include "sound.h" +#include "palette.h" +#include "rom_8077ABC.h" #include "scanline_effect.h" - -void sub_80DFE90(struct Sprite *sprite); - -void sub_80DFC9C(u8 taskId); -void sub_80DFD58(u8 taskId); +#include "sound.h" +#include "trig.h" +#include "constants/battle_constants.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; extern u8 gObjectBankIDs[]; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattle_WIN0H; +extern u16 gBattle_WIN0V; + +static void sub_80DFE90(struct Sprite *sprite); +static void sub_80DFC9C(u8 taskId); +static void sub_80DFD58(u8 taskId); +static void sub_80DFF58(struct Sprite *sprite); +static void sub_80DFF98(struct Sprite *sprite); +static void sub_80E00D0(struct Sprite *sprite); +static void sub_80E02A4(u8 taskId); +static void sub_80E0620(u8 taskId); +void sub_80E08CC(u8 a); +void sub_80E079C(struct Task *task); -// used in Smoke Ball escape, Sky Attack, Feint Attack and Camouflage +// used in Smoke Ball escape, Sky Attack, Feint Attack and Camouflage void sub_80DFC24(u8 taskId) { int bank; @@ -31,7 +45,7 @@ void sub_80DFC24(u8 taskId) gTasks[taskId].func = sub_80DFC9C; } -void sub_80DFC9C(u8 taskId) +static void sub_80DFC9C(u8 taskId) { u8 r2 = gTasks[taskId].data[1] >> 8; u8 r1 = gTasks[taskId].data[1]; @@ -111,7 +125,7 @@ void sub_80DFE14(struct Sprite *sprite) sub_80DFE90(sprite); } -void sub_80DFE90(struct Sprite *sprite) +static void sub_80DFE90(struct Sprite *sprite) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; @@ -136,3 +150,407 @@ void sub_80DFE90(struct Sprite *sprite) if (--sprite->data[0] == 0) DestroyAnimSprite(sprite); } + +void sub_80DFF1C(struct Sprite *sprite) +{ + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = gBattleAnimArgs[4]; + sprite->data[2] = gBattleAnimArgs[5]; + sprite->callback = sub_80DFF58; +} + +static void sub_80DFF58(struct Sprite *sprite) +{ + sprite->data[4] += sprite->data[0]; + sprite->data[5] += sprite->data[1]; + sprite->pos2.x = sprite->data[4] >> 8; + sprite->pos2.y = sprite->data[5] >> 8; + + if (++sprite->data[3] == sprite->data[2]) + sprite->callback = sub_80DFF98; +} + +static void sub_80DFF98(struct Sprite *sprite) +{ + sprite->data[4] -= sprite->data[0]; + sprite->data[5] -= sprite->data[1]; + sprite->pos2.x = sprite->data[4] >> 8; + sprite->pos2.y = sprite->data[5] >> 8; + + if (--sprite->data[3] == 0) + move_anim_8074EE0(sprite); +} + +void sub_80DFFD0(struct Sprite *sprite) +{ + u8 bank; + s8 xOffset; + + if (gBattleAnimArgs[0] == 0) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + xOffset = 20; + sprite->oam.tileNum += 4; + + switch (gBattleAnimArgs[1]) + { + case 0: + sprite->pos1.x = sub_807A100(bank, 5) - 8; + sprite->pos1.y = sub_807A100(bank, 2) + 8; + break; + case 1: + sprite->pos1.x = sub_807A100(bank, 5) - 14; + sprite->pos1.y = sub_807A100(bank, 2) + 16; + break; + case 2: + sprite->pos1.x = sub_807A100(bank, 4) + 8; + sprite->pos1.y = sub_807A100(bank, 2) + 8; + StartSpriteAffineAnim(sprite, 1); + xOffset = -20; + break; + case 3: + sprite->pos1.x = sub_807A100(bank, 4) + 14; + sprite->pos1.y = sub_807A100(bank, 2) + 16; + StartSpriteAffineAnim(sprite, 1); + xOffset = -20; + break; + } + + sprite->data[0] = 32; + sprite->data[2] = sprite->pos1.x + xOffset; + sprite->data[4] = sprite->pos1.y + 12; + sprite->data[5] = -12; + + sub_80786EC(sprite); + sprite->callback = sub_80E00D0; +} + +static void sub_80E00D0(struct Sprite *sprite) +{ + if (sub_8078718(sprite)) + move_anim_8074EE0(sprite); +} + +void sub_80E00EC(u8 taskId) +{ + struct ScanlineEffectParams scanlineParams; + struct Struct_sub_8078914 subStruct; + u16 i; + u8 pos; + int var0; + struct Task *task = &gTasks[taskId]; + + task->data[7] = GetBankPosition(gAnimBankAttacker, 1) + 31; + task->data[6] = sub_807A100(gAnimBankAttacker, 2) - 7; + task->data[5] = task->data[7]; + task->data[4] = task->data[6]; + task->data[13] = (task->data[7] - task->data[6]) << 8; + + pos = GetBankPosition(gAnimBankAttacker, 0); + task->data[14] = pos - 32; + task->data[15] = pos + 32; + + if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) + task->data[8] = -12; + else + task->data[8] = -64; + + task->data[3] = GetBankIdentity_permutated(gAnimBankAttacker); + if (task->data[3] == 1) + { + sub_8078914(&subStruct); + task->data[10] = gBattle_BG1_Y; + REG_BLDCNT = 0x3F42; + FillPalette(0, subStruct.field_8 << 4, 32); + scanlineParams.dmaDest = ®_BG1VOFS; + var0 = 2; + + if (!IsContest()) + gBattle_BG2_X += 240; + } + else + { + task->data[10] = gBattle_BG2_Y; + REG_BLDCNT = 0x3F44; + FillPalette(0, 144, 32); + scanlineParams.dmaDest = ®_BG2VOFS; + var0 = 4; + + if (!IsContest()) + gBattle_BG1_X += 240; + } + + scanlineParams.dmaControl = 0xA2600001; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + task->data[11] = 0; + task->data[12] = 16; + task->data[0] = 0; + task->data[1] = 0; + task->data[2] = 0; + + sub_80E08CC(3); + + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = task->data[10]; + gScanlineEffectRegBuffers[1][i] = task->data[10]; + } + + ScanlineEffect_SetParams(scanlineParams); + + REG_WINOUT = 0x3F00 | (var0 ^ 0x3F); + REG_WININ = 0x3F3F; + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + gBattle_WIN0V = 160; + + task->func = sub_80E02A4; +} + +static void sub_80E02A4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 1) + { + task->data[1] = 0; + if (++task->data[2] & 1) + { + if (task->data[11] != 12) + task->data[11]++; + } + else + { + if (task->data[12] != 8) + task->data[12]--; + } + + REG_BLDALPHA = (task->data[12] << 8) | task->data[11]; + + if (task->data[11] == 12 && task->data[12] == 8) + task->data[0]++; + } + break; + case 1: + task->data[4] -= 8; + sub_80E079C(task); + + if (task->data[4] < task->data[8]) + task->data[0]++; + break; + case 2: + task->data[4] -= 8; + sub_80E079C(task); + task->data[14] += 4; + task->data[15] -= 4; + + if (task->data[14] >= task->data[15]) + task->data[14] = task->data[15]; + + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + + if (task->data[14] == task->data[15]) + task->data[0]++; + break; + case 3: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 4: + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80E03BC(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + struct ScanlineEffectParams scanlineParams; + u8 pos; + u16 i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (IsContest() == TRUE) + { + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + DestroyAnimVisualTask(taskId); + } + else + { + task->data[3] = GetBankIdentity_permutated(gAnimBankTarget); + if (task->data[3] == 1) + { + REG_BLDCNT = 0x3F42; + gBattle_BG2_X += 240; + } + else + { + REG_BLDCNT = 0x3F44; + gBattle_BG1_X += 240; + } + + task->data[0]++; + } + break; + case 1: + if (task->data[3] == 1) + { + sub_8078914(&subStruct); + task->data[10] = gBattle_BG1_Y; + FillPalette(0, subStruct.field_8 << 4, 32); + } + else + { + task->data[10] = gBattle_BG2_Y; + FillPalette(0, 144, 32); + } + + sub_80E08CC(3); + task->data[0]++; + break; + case 2: + task->data[7] = GetBankPosition(gAnimBankTarget, 1) + 31; + task->data[6] = sub_807A100(gAnimBankTarget, 2) - 7; + task->data[13] = (task->data[7] - task->data[6]) << 8; + pos = GetBankPosition(gAnimBankTarget, 0); + task->data[14] = pos - 4; + task->data[15] = pos + 4; + + if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) + task->data[8] = -12; + else + task->data[8] = -64; + + task->data[4] = task->data[8]; + task->data[5] = task->data[8]; + task->data[11] = 12; + task->data[12] = 8; + task->data[0]++; + break; + case 3: + if (task->data[3] == 1) + scanlineParams.dmaDest = ®_BG1VOFS; + else + scanlineParams.dmaDest = ®_BG2VOFS; + + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i); + gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i); + } + + scanlineParams.dmaControl = 0xA2600001; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + ScanlineEffect_SetParams(scanlineParams); + task->data[0]++; + break; + case 4: + if (task->data[3] == 1) + REG_WINOUT = 0x3F3D; + else + REG_WINOUT = 0x3F3B; + + REG_WININ = 0x3F3F; + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + gBattle_WIN0V = 160; + + task->data[0] = 0; + task->data[1] = 0; + task->data[2] = 0; + REG_BLDALPHA = 0x80C; + task->func = sub_80E0620; + break; + } +} + +static void sub_80E0620(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[5] += 8; + if (task->data[5] >= task->data[7]) + task->data[5] = task->data[7]; + + sub_80E079C(task); + + if (task->data[5] == task->data[7]) + task->data[0]++; + break; + case 1: + if (task->data[15] - task->data[14] < 64) + { + task->data[14] -= 4; + task->data[15] += 4; + } + else + { + task->data[1] = 1; + } + + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + task->data[4] += 8; + + if (task->data[4] >= task->data[6]) + task->data[4] = task->data[6]; + + sub_80E079C(task); + + if (task->data[4] == task->data[6] && task->data[1] != 0) + { + task->data[1] = 0; + task->data[0]++; + } + break; + case 2: + if (++task->data[1] > 1) + { + task->data[1] = 0; + if ((++task->data[2] & 1) != 0) + { + if (task->data[11] != 0) + task->data[11]--; + } + else + { + if (task->data[12] < 16) + task->data[12]++; + } + + REG_BLDALPHA = (task->data[12] << 8) | task->data[11]; + + if (task->data[11] == 0 && task->data[12] == 16) + task->data[0]++; + } + break; + case 3: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 4: + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + DestroyAnimVisualTask(taskId); + break; + } +} -- cgit v1.2.3 From f1f6c7337f4f2f002b456468b0ccc327fc494d02 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sat, 3 Feb 2018 22:15:54 -0600 Subject: get rid of raw addresses in music_player_table.inc --- src/libs/m4a_1.s | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/libs/m4a_1.s b/src/libs/m4a_1.s index be8b44488..8dbcf7efd 100644 --- a/src/libs/m4a_1.s +++ b/src/libs/m4a_1.s @@ -4,7 +4,11 @@ .syntax unified - .lcomm gUnknown_030007B8, 0x770 + .bss + + .global gUnknown_030007B8 +gUnknown_030007B8: + .space 0x770 .text -- cgit v1.2.3 From 338d2b0b1897899a6fa787f8baa4cf392f81b718 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 4 Feb 2018 12:34:18 -0800 Subject: Finish decompiling dark.s except one function --- src/battle/anim/dark.c | 456 ++++++++++++++++++++++++++++++++++++++++++++++++- src/rom_8077ABC.c | 2 +- 2 files changed, 455 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index 14988ac71..1c88dc23e 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -1,9 +1,13 @@ #include "global.h" #include "battle_anim.h" +#include "blend_palette.h" +#include "decompress.h" +#include "ewram.h" #include "palette.h" #include "rom_8077ABC.h" #include "scanline_effect.h" #include "sound.h" +#include "sprite.h" #include "trig.h" #include "constants/battle_constants.h" @@ -17,6 +21,12 @@ extern u16 gBattle_BG2_X; extern u16 gBattle_BG2_Y; extern u16 gBattle_WIN0H; extern u16 gBattle_WIN0V; +extern u16 gBattlePartyID[]; +extern u8 gAnimMoveTurn; + +extern const u8 gUnknown_08D1D574[]; +extern const u8 gUnknown_08D1D410[]; +extern const u16 gUnknown_08D1D54C[]; static void sub_80DFE90(struct Sprite *sprite); static void sub_80DFC9C(u8 taskId); @@ -26,8 +36,9 @@ static void sub_80DFF98(struct Sprite *sprite); static void sub_80E00D0(struct Sprite *sprite); static void sub_80E02A4(u8 taskId); static void sub_80E0620(u8 taskId); -void sub_80E08CC(u8 a); -void sub_80E079C(struct Task *task); +static void sub_80E08CC(u8 priority); +static void sub_80E079C(struct Task *task); +static void sub_80E0CD0(u8 taskId); // used in Smoke Ball escape, Sky Attack, Feint Attack and Camouflage @@ -554,3 +565,444 @@ static void sub_80E0620(u8 taskId) break; } } + +// static void sub_80E079C(struct Task *task) +// { +// int var0, var1; +// s16 var2; +// s16 i, j; + +// var2 = task->data[5] - task->data[4]; +// if (var2 != 0) +// { +// var0 = task->data[13] / var2; +// var1 = task->data[6]; + +// for (i = 0; i < task->data[4]; i++) +// { +// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159); +// } + +// for (i = task->data[4]; i <= task->data[5]; i++) +// { +// if (i >= 0) +// { +// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = (var1 - i) + task->data[10]; +// } + +// var1 += var0; +// } + +// for (j = i; j < task->data[7]; j++) +// { +// if (j >= 0) +// { +// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][j] = (task->data[10] + 159) - j; +// } +// } +// } +// else +// { +// for (i = 0; i < 112; i++) +// { +// gScanlineEffectRegBuffers[0][i] = task->data[10] + 159 - i; +// gScanlineEffectRegBuffers[1][i] = task->data[10] + 159 - i; +// } +// } +// } + +__attribute__((naked)) +static void sub_80E079C(struct Task *task) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + adds r6, r0, 0\n\ + ldrh r0, [r6, 0x12]\n\ + ldrh r4, [r6, 0x10]\n\ + subs r0, r4\n\ + lsls r0, 16\n\ + asrs r1, r0, 16\n\ + cmp r1, 0\n\ + beq _080E0890\n\ + movs r2, 0x22\n\ + ldrsh r0, [r6, r2]\n\ + bl __divsi3\n\ + mov r8, r0\n\ + movs r3, 0x14\n\ + ldrsh r0, [r6, r3]\n\ + lsls r5, r0, 8\n\ + lsls r0, r4, 16\n\ + movs r4, 0\n\ + cmp r0, 0\n\ + ble _080E07FC\n\ + ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\ + mov r12, r0\n\ + ldr r7, _080E088C @ =gScanlineEffect\n\ +_080E07D0:\n\ + lsls r2, r4, 16\n\ + asrs r2, 16\n\ + lsls r3, r2, 1\n\ + ldrb r1, [r7, 0x14]\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r0, 7\n\ + adds r3, r0\n\ + add r3, r12\n\ + adds r1, r2, 0\n\ + subs r1, 0x9F\n\ + ldrh r0, [r6, 0x1C]\n\ + subs r0, r1\n\ + strh r0, [r3]\n\ + adds r2, 0x1\n\ + lsls r2, 16\n\ + lsrs r4, r2, 16\n\ + asrs r2, 16\n\ + movs r1, 0x10\n\ + ldrsh r0, [r6, r1]\n\ + cmp r2, r0\n\ + blt _080E07D0\n\ +_080E07FC:\n\ + ldrh r4, [r6, 0x10]\n\ + lsls r3, r4, 16\n\ + asrs r1, r3, 16\n\ + movs r2, 0x12\n\ + ldrsh r0, [r6, r2]\n\ + cmp r1, r0\n\ + bgt _080E0846\n\ + ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\ + mov r12, r0\n\ + ldr r7, _080E088C @ =gScanlineEffect\n\ +_080E0810:\n\ + asrs r4, r3, 16\n\ + cmp r4, 0\n\ + blt _080E0832\n\ + asrs r1, r5, 8\n\ + subs r1, r4\n\ + lsls r3, r4, 1\n\ + ldrb r2, [r7, 0x14]\n\ + lsls r0, r2, 4\n\ + subs r0, r2\n\ + lsls r0, 7\n\ + adds r3, r0\n\ + add r3, r12\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + ldrh r2, [r6, 0x1C]\n\ + adds r1, r2\n\ + strh r1, [r3]\n\ +_080E0832:\n\ + add r5, r8\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r3, r4, 16\n\ + asrs r1, r3, 16\n\ + movs r2, 0x12\n\ + ldrsh r0, [r6, r2]\n\ + cmp r1, r0\n\ + ble _080E0810\n\ +_080E0846:\n\ + movs r3, 0x1C\n\ + ldrsh r0, [r6, r3]\n\ + adds r0, 0x9F\n\ + lsls r2, r4, 16\n\ + asrs r1, r2, 16\n\ + subs r5, r0, r1\n\ + movs r3, 0x16\n\ + ldrsh r0, [r6, r3]\n\ + cmp r1, r0\n\ + bge _080E08BE\n\ + ldr r7, _080E0888 @ =gScanlineEffectRegBuffers\n\ + ldr r4, _080E088C @ =gScanlineEffect\n\ +_080E085E:\n\ + asrs r3, r2, 16\n\ + cmp r3, 0\n\ + blt _080E0876\n\ + lsls r2, r3, 1\n\ + ldrb r1, [r4, 0x14]\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r0, 7\n\ + adds r2, r0\n\ + adds r2, r7\n\ + strh r5, [r2]\n\ + subs r5, 0x1\n\ +_080E0876:\n\ + adds r0, r3, 0x1\n\ + lsls r2, r0, 16\n\ + asrs r1, r2, 16\n\ + movs r3, 0x16\n\ + ldrsh r0, [r6, r3]\n\ + cmp r1, r0\n\ + blt _080E085E\n\ + b _080E08BE\n\ + .align 2, 0\n\ +_080E0888: .4byte gScanlineEffectRegBuffers\n\ +_080E088C: .4byte gScanlineEffect\n\ +_080E0890:\n\ + movs r1, 0x1C\n\ + ldrsh r0, [r6, r1]\n\ + adds r5, r0, 0\n\ + adds r5, 0x9F\n\ + movs r4, 0\n\ + ldr r3, _080E08C8 @ =gScanlineEffectRegBuffers\n\ + movs r2, 0xF0\n\ + lsls r2, 3\n\ + adds r6, r3, r2\n\ +_080E08A2:\n\ + lsls r0, r4, 16\n\ + asrs r0, 16\n\ + lsls r2, r0, 1\n\ + adds r1, r2, r3\n\ + strh r5, [r1]\n\ + adds r2, r6\n\ + strh r5, [r2]\n\ + subs r5, 0x1\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x6F\n\ + ble _080E08A2\n\ +_080E08BE:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080E08C8: .4byte gScanlineEffectRegBuffers\n\ + .syntax divided\n"); +} + +static void sub_80E08CC(u8 priority) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + u8 spriteId = GetAnimBankSpriteId(i); + if (spriteId != 0xFF) + gSprites[spriteId].oam.priority = priority; + } +} + +void sub_80E0918(u8 taskId) +{ + u8 toBG2 = GetBankIdentity_permutated(gAnimBankAttacker) ^ 1 ? 1 : 0; + sub_8076034(gAnimBankAttacker, toBG2); + gSprites[gObjectBankIDs[gAnimBankAttacker]].invisible = 0; + + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) + { + sub_8076034(gAnimBankAttacker ^ 2, toBG2 ^ 1); + gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].invisible = 0; + } + + DestroyAnimVisualTask(taskId); +} + +void sub_80E09C4(u8 taskId) +{ + u8 toBG2 = GetBankIdentity_permutated(gAnimBankAttacker) ^ 1 ? 1 : 0; + sub_8076464(toBG2); + + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) + sub_8076464(toBG2 ^ 1); + + DestroyAnimVisualTask(taskId); +} + +void sub_80E0A10(struct Sprite *sprite) +{ + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->callback = sub_8078600; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80E0A4C(u8 taskId) +{ + u16 species; + u8 spriteId; + u8 newSpriteId; + u16 paletteNum; + struct Struct_sub_8078914 subStruct; + int var0 = 0; + + gBattle_WIN0H = var0; + gBattle_WIN0V = var0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3D; + REG_DISPCNT |= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0xC08; + REG_BG1CNT_BITFIELD.priority = 0; + REG_BG1CNT_BITFIELD.screenSize = 0; + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + if (IsDoubleBattle() && !IsContest()) + { + if (GetBankIdentity(gAnimBankAttacker) == 3 || GetBankIdentity(gAnimBankAttacker) == 0) + { + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2) == TRUE) + { + gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].oam.priority--; + REG_BG1CNT_BITFIELD.priority = 1; + var0 = 1; + } + } + } + + if (IsContest()) + { + species = EWRAM_19348; + } + else + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlePartyID[gAnimBankAttacker]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlePartyID[gAnimBankAttacker]], MON_DATA_SPECIES); + } + + spriteId = GetAnimBankSpriteId(0); + newSpriteId = sub_807A4A0(gAnimBankAttacker, spriteId, species); + + sub_8078914(&subStruct); + DmaClear32(3, subStruct.field_4, 0x1000); + LZDecompressVram(&gUnknown_08D1D574, subStruct.field_4); + LZDecompressVram(&gUnknown_08D1D410, subStruct.field_0); + LoadCompressedPalette(&gUnknown_08D1D54C, subStruct.field_8 << 4, 32); + + gBattle_BG1_X = -gSprites[spriteId].pos1.x + 96; + gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32; + paletteNum = 16 + gSprites[spriteId].oam.paletteNum; + + if (gBattleAnimArgs[1] == 0) + sub_8079108(paletteNum, FALSE); + else + BlendPalette(paletteNum * 16, 16, 11, gBattleAnimArgs[2]); + + gTasks[taskId].data[0] = newSpriteId; + gTasks[taskId].data[1] = gBattleAnimArgs[0]; + gTasks[taskId].data[2] = gBattleAnimArgs[1]; + gTasks[taskId].data[3] = gBattleAnimArgs[2]; + gTasks[taskId].data[6] = var0; + gTasks[taskId].func = sub_80E0CD0; +} + +static void sub_80E0CD0(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + u16 paletteNum; + u8 spriteId; + u8 taskIdCopy = taskId; + + gTasks[taskIdCopy].data[10] += 4; + gBattle_BG1_X -= 4; + + if (gTasks[taskIdCopy].data[10] == 128) + { + gTasks[taskIdCopy].data[10] = 0; + gBattle_BG1_X += 128; + + if (++gTasks[taskIdCopy].data[11] == 2) + { + sub_8076464(0); + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + REG_DISPCNT ^= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + + spriteId = GetAnimBankSpriteId(0); + paletteNum = 16 + gSprites[spriteId].oam.paletteNum; + if (gTasks[taskIdCopy].data[1] == 0) + sub_8079108(paletteNum, 1); + + DestroySprite(&gSprites[gTasks[taskIdCopy].data[0]]); + sub_8078914(&subStruct); + DmaClear32(3, subStruct.field_4, 0x800); + + if (gTasks[taskIdCopy].data[6] == 1) + { + gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].oam.priority++; + } + + DestroyAnimVisualTask(taskIdCopy); + } + } +} + +void sub_80E0E24(u8 taskId) +{ + u8 spriteId; + u8 bank; + bool8 calcSpriteId = FALSE; + u8 identity = 0; + + switch (gBattleAnimArgs[0]) + { + case 0: + case 1: + case 2: + case 3: + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); + break; + case 4: + identity = IDENTITY_PLAYER_MON1; + calcSpriteId = TRUE; + break; + case 5: + identity = IDENTITY_PLAYER_MON2; + calcSpriteId = TRUE; + break; + case 6: + identity = IDENTITY_OPPONENT_MON1; + calcSpriteId = TRUE; + break; + case 7: + identity = IDENTITY_OPPONENT_MON2; + calcSpriteId = TRUE; + break; + default: + spriteId = 0xFF; + break; + } + + if (calcSpriteId) + { + bank = GetBankByIdentity(identity); + if (IsAnimBankSpriteVisible(bank)) + spriteId = gObjectBankIDs[bank]; + else + spriteId = 0xFF; + } + + if (spriteId != 0xFF) + sub_8079108(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); + + DestroyAnimVisualTask(taskId); +} + +void sub_80E0EE8(u8 taskId) +{ + if (gAnimMoveTurn < 2) + gBattleAnimArgs[7] = 0; + + if (gAnimMoveTurn == 2) + gBattleAnimArgs[7] = 1; + + DestroyAnimVisualTask(taskId); +} diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index b84c431f7..4a580eb41 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -2138,7 +2138,7 @@ void sub_807A3FC(u8 slot, bool8 a2, s16 *a3, s16 *a4) *a4 = (v4 + v6) / 2; } -u8 sub_807A4A0(int a1, u8 sprite, int a3) +u8 sub_807A4A0(int bank, u8 sprite, int species) { u8 new_sprite = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); gSprites[new_sprite] = gSprites[sprite]; -- cgit v1.2.3 From ad13f21d2e672b6f3cf000987670b4cf84e3feff Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 4 Feb 2018 14:40:14 -0800 Subject: Start decompiling fight.s --- src/battle/anim/fight.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/battle/anim/fight.c (limited to 'src') diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c new file mode 100644 index 000000000..4c3a6cb75 --- /dev/null +++ b/src/battle/anim/fight.c @@ -0,0 +1,72 @@ +#include "global.h" +#include "battle_anim.h" +#include "blend_palette.h" +#include "decompress.h" +#include "ewram.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "scanline_effect.h" +#include "sound.h" +#include "sprite.h" +#include "trig.h" +#include "constants/battle_constants.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u8 gObjectBankIDs[]; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattle_WIN0H; +extern u16 gBattle_WIN0V; +extern u16 gBattlePartyID[]; +extern u8 gAnimMoveTurn; + +void sub_080B08A0(struct Sprite *sprite) +{ + sub_807867C(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[0] = 15; + sprite->callback = sub_80782D8; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80D902C(struct Sprite *sprite) +{ + if (gBattleAnimArgs[7] == 1 && GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + } + + StartSpriteAnim(sprite, gBattleAnimArgs[6]); + gBattleAnimArgs[6] = 0; + sub_8079534(sprite); +} + +void sub_80D9078(struct Sprite *sprite) +{ + if (IsContest()) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + } + + sub_80D902C(sprite); +} + +void sub_80D90A4(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[4]); + + if (gBattleAnimArgs[3] == 0) + sub_80787B0(sprite, 1); + else + sub_8078764(sprite, 1); + + sprite->data[0] = gBattleAnimArgs[2]; + sprite->callback = sub_80782D8; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} -- cgit v1.2.3 From e0000f779e3ece21d96c76528a71a66f096bea7f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 5 Feb 2018 08:43:52 -0500 Subject: match sub_813CCE8 --- src/scene/intro.c | 206 +++--------------------------------------------------- 1 file changed, 11 insertions(+), 195 deletions(-) (limited to 'src') diff --git a/src/scene/intro.c b/src/scene/intro.c index 4da341744..3e4bd5bf4 100644 --- a/src/scene/intro.c +++ b/src/scene/intro.c @@ -1501,7 +1501,6 @@ static void intro_reset_and_hide_bgs(void) REG_BLDY = 0; } -#ifdef NONMATCHING static void sub_813CCE8(u8 taskId) { switch (gTasks[taskId].data[0]) @@ -1513,18 +1512,15 @@ static void sub_813CCE8(u8 taskId) REG_BLDY = 0; gTasks[taskId].data[1] = 0x40; gTasks[taskId].data[0] = 1; - return; + break; case 1: if (gTasks[taskId].data[1] != 0) { - u32 foo; - u32 bar asm("r2"); + u8 foo; gTasks[taskId].data[1]--; - //tail merge at _0813CDC2 - foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0); - bar = 0x1FE; - REG_BLDALPHA = gUnknown_08393E64[(foo & bar) / 2]; + foo = gTasks[taskId].data[1] / 2; + REG_BLDALPHA = gUnknown_08393E64[foo]; } else { @@ -1532,7 +1528,7 @@ static void sub_813CCE8(u8 taskId) gTasks[taskId].data[1] = 0x80; gTasks[taskId].data[0]++; } - return; + break; case 2: if (gTasks[taskId].data[1] != 0) { @@ -1544,18 +1540,15 @@ static void sub_813CCE8(u8 taskId) gTasks[taskId].data[1] = 0; //redundant? gTasks[taskId].data[0]++; } - return; + break; case 3: if (gTasks[taskId].data[1] <= 0x3D) { - u32 foo; - u32 bar asm("r2"); + u8 foo; gTasks[taskId].data[1]++; - //_0813CDC2 - foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0); - bar = 0x1FE; - REG_BLDALPHA = gUnknown_08393E64[(foo & bar) / 2]; + foo = gTasks[taskId].data[1] / 2; + REG_BLDALPHA = gUnknown_08393E64[foo]; } else { @@ -1564,7 +1557,7 @@ static void sub_813CCE8(u8 taskId) gTasks[taskId].data[1] = 0x10; gTasks[taskId].data[0]++; } - return; + break; case 4: if (gTasks[taskId].data[1] != 0) { @@ -1577,186 +1570,9 @@ static void sub_813CCE8(u8 taskId) REG_BLDY = 0; DestroyTask(taskId); } - return; + break; } } -#else -__attribute__((naked)) -static void sub_813CCE8(u8 taskId) -{ - asm("\n\ - .equ REG_BLDCNT, 0x4000050\n\ - .equ REG_BLDALPHA, 0x4000052\n\ - .syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - ldr r1, _0813CD0C @ =gTasks\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r2, 0x8\n\ - ldrsh r0, [r0, r2]\n\ - adds r2, r1, 0\n\ - cmp r0, 0x4\n\ - bhi _0813CD28\n\ - lsls r0, 2\n\ - ldr r1, _0813CD10 @ =_0813CD14\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0813CD0C: .4byte gTasks\n\ -_0813CD10: .4byte _0813CD14\n\ - .align 2, 0\n\ -_0813CD14:\n\ - .4byte _0813CD28\n\ - .4byte _0813CD5C\n\ - .4byte _0813CD8C\n\ - .4byte _0813CDA8\n\ - .4byte _0813CDFC\n\ -_0813CD28:\n\ - ldr r1, _0813CD54 @ =REG_BLDCNT\n\ - ldr r4, _0813CD58 @ =0x00003f50\n\ - adds r0, r4, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - movs r4, 0x80\n\ - lsls r4, 5\n\ - adds r0, r4, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - movs r0, 0\n\ - strh r0, [r1]\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - movs r1, 0x40\n\ - strh r1, [r0, 0xA]\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x8]\n\ - b _0813CE26\n\ - .align 2, 0\n\ -_0813CD54: .4byte REG_BLDCNT\n\ -_0813CD58: .4byte 0x00003f50\n\ -_0813CD5C:\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r2, r0, r2\n\ - ldrh r1, [r2, 0xA]\n\ - movs r3, 0xA\n\ - ldrsh r0, [r2, r3]\n\ - cmp r0, 0\n\ - beq _0813CD78\n\ - subs r0, r1, 0x1\n\ - strh r0, [r2, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r2, r4]\n\ - b _0813CDC2\n\ -_0813CD78:\n\ - ldr r1, _0813CD84 @ =REG_BLDALPHA\n\ - ldr r0, _0813CD88 @ =gUnknown_08393E64\n\ - ldrh r0, [r0]\n\ - strh r0, [r1]\n\ - movs r0, 0x80\n\ - b _0813CDEA\n\ - .align 2, 0\n\ -_0813CD84: .4byte REG_BLDALPHA\n\ -_0813CD88: .4byte gUnknown_08393E64\n\ -_0813CD8C:\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r1, r0, r2\n\ - ldrh r0, [r1, 0xA]\n\ - movs r3, 0xA\n\ - ldrsh r2, [r1, r3]\n\ - cmp r2, 0\n\ - bne _0813CE0E\n\ - strh r2, [r1, 0xA]\n\ - ldrh r0, [r1, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r1, 0x8]\n\ - b _0813CE26\n\ -_0813CDA8:\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r2, r0, r2\n\ - ldrh r1, [r2, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r2, r4]\n\ - cmp r0, 0x3D\n\ - bgt _0813CDE0\n\ - adds r0, r1, 0x1\n\ - strh r0, [r2, 0xA]\n\ - movs r1, 0xA\n\ - ldrsh r0, [r2, r1]\n\ -_0813CDC2:\n\ - lsrs r1, r0, 31\n\ - adds r0, r1\n\ - movs r2, 0xFF\n\ - lsls r2, 1\n\ - ldr r3, _0813CDD8 @ =REG_BLDALPHA\n\ - ldr r1, _0813CDDC @ =gUnknown_08393E64\n\ - ands r0, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r3]\n\ - b _0813CE26\n\ - .align 2, 0\n\ -_0813CDD8: .4byte REG_BLDALPHA\n\ -_0813CDDC: .4byte gUnknown_08393E64\n\ -_0813CDE0:\n\ - ldr r1, _0813CDF4 @ =REG_BLDALPHA\n\ - ldr r0, _0813CDF8 @ =gUnknown_08393E64\n\ - ldrh r0, [r0, 0x3E]\n\ - strh r0, [r1]\n\ - movs r0, 0x10\n\ -_0813CDEA:\n\ - strh r0, [r2, 0xA]\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ - b _0813CE26\n\ - .align 2, 0\n\ -_0813CDF4: .4byte REG_BLDALPHA\n\ -_0813CDF8: .4byte gUnknown_08393E64\n\ -_0813CDFC:\n\ - lsls r0, r3, 2\n\ - adds r0, r3\n\ - lsls r0, 3\n\ - adds r1, r0, r2\n\ - ldrh r0, [r1, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r2, [r1, r4]\n\ - cmp r2, 0\n\ - beq _0813CE14\n\ -_0813CE0E:\n\ - subs r0, 0x1\n\ - strh r0, [r1, 0xA]\n\ - b _0813CE26\n\ -_0813CE14:\n\ - ldr r0, _0813CE2C @ =REG_BLDCNT\n\ - strh r2, [r0]\n\ - adds r0, 0x2\n\ - strh r2, [r0]\n\ - adds r0, 0x2\n\ - strh r2, [r0]\n\ - adds r0, r3, 0\n\ - bl DestroyTask\n\ -_0813CE26:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0813CE2C: .4byte REG_BLDCNT\n\ - .syntax divided\n"); -} -#endif void sub_813CE30(u16 scrX, u16 scrY, u16 zoom, u16 alpha) { -- cgit v1.2.3 From 088e23007aa07e2ef0fcb5900664d2e6cec0853d Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Mon, 5 Feb 2018 20:10:31 -0800 Subject: Decompile more of fight.s --- src/battle/anim/fight.c | 223 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) (limited to 'src') diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c index 4c3a6cb75..fcce044ae 100644 --- a/src/battle/anim/fight.c +++ b/src/battle/anim/fight.c @@ -4,6 +4,7 @@ #include "decompress.h" #include "ewram.h" #include "palette.h" +#include "random.h" #include "rom_8077ABC.h" #include "scanline_effect.h" #include "sound.h" @@ -15,6 +16,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; extern u8 gObjectBankIDs[]; +extern u8 gBanksBySide[]; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; @@ -24,6 +26,15 @@ extern u16 gBattle_WIN0V; extern u16 gBattlePartyID[]; extern u8 gAnimMoveTurn; +extern struct SpriteTemplate gBattleAnimSpriteTemplate_83DB4A8; + +static void sub_80D927C(struct Sprite *sprite); +static void sub_80D9328(struct Sprite *sprite); +static void sub_80D9404(struct Sprite *sprite); +static void sub_80D9474(struct Sprite *sprite); +static void sub_80D94CC(struct Sprite *sprite); +static void sub_80D9524(struct Sprite *sprite); + void sub_080B08A0(struct Sprite *sprite) { sub_807867C(sprite, gBattleAnimArgs[0]); @@ -70,3 +81,215 @@ void sub_80D90A4(struct Sprite *sprite) sprite->callback = sub_80782D8; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } + +void sub_80D90F4(struct Sprite *sprite) +{ + u8 bank; + s16 xMod, yMod; + s16 x, y; + + if (gBattleAnimArgs[0] == 0) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + if (gBattleAnimArgs[2] < 0) + gBattleAnimArgs[2] = Random() % 5; + + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->pos1.x = GetBankPosition(bank, 2); + sprite->pos1.y = GetBankPosition(bank, 3); + + xMod = sub_807A100(bank, 1) / 2; + yMod = sub_807A100(bank, 0) / 4; + + x = Random() % xMod; + y = Random() % yMod; + + if (Random() & 1) + x *= -1; + if (Random() & 1) + y *= -1; + + if ((gBanksBySide[bank] & 1) == 0) + y += 0xFFF0; + + sprite->pos1.x += x; + sprite->pos1.y += y; + + sprite->data[0] = gBattleAnimArgs[1]; + sprite->data[7] = CreateSprite(&gBattleAnimSpriteTemplate_83DB4A8, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1); + if (sprite->data[7] != 64) + { + StartSpriteAffineAnim(&gSprites[sprite->data[7]], 0); + gSprites[sprite->data[7]].callback = SpriteCallbackDummy; + } + + sprite->callback = sub_80D927C; +} + +static void sub_80D927C(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (sprite->data[7] != 64) + { + FreeOamMatrix(gSprites[sprite->data[7]].oam.matrixNum); + DestroySprite(&gSprites[sprite->data[7]]); + } + + DestroyAnimSprite(sprite); + } + else + { + sprite->data[0]--; + } +} + +void sub_80D92D0(struct Sprite *sprite) +{ + sub_8078764(sprite, 1); + sprite->data[0] = 30; + + if (gBattleAnimArgs[2] == 0) + { + sprite->data[2] = sprite->pos1.x - 20; + } + else + { + sprite->data[2] = sprite->pos1.x + 20; + sprite->hFlip = 1; + } + + sprite->data[4] = sprite->pos1.y - 20; + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, sub_80D9328); +} + +static void sub_80D9328(struct Sprite *sprite) +{ + if (++sprite->data[5] == 11) + { + sprite->data[2] = sprite->pos1.x - sprite->pos2.x; + sprite->data[4] = sprite->pos1.y - sprite->pos2.y; + sprite->data[0] = 8; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); + } +} + +void sub_80D9378(struct Sprite *sprite) +{ + if ((gAnimBankAttacker ^ 2) == gAnimBankTarget && GetBankIdentity(gAnimBankTarget) < 2) + gBattleAnimArgs[0] *= -1; + + sub_8078764(sprite, 1); + + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y; + + obj_translate_based_on_private_1_2_3_4(sprite); + + sprite->data[5] = gBattleAnimArgs[5]; + sprite->data[6] = gBattleAnimArgs[4]; + sprite->data[7] = 0; + + sprite->callback = sub_80D9404; +} + +static void sub_80D9404(struct Sprite *sprite) +{ + if (!sub_8078B5C(sprite)) + { + sprite->pos2.y += Sin(sprite->data[7] >> 8, sprite->data[5]); + sprite->data[7] += sprite->data[6]; + } + else + { + DestroyAnimSprite(sprite); + } +} + +void sub_80D943C(struct Sprite *sprite) +{ + sub_8078764(sprite, 1); + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->data[0] = gBattleAnimArgs[3]; + + sprite->callback = sub_80782D8; + StoreSpriteCallbackInData(sprite, sub_80D9474); +} + +static void sub_80D9474(struct Sprite *sprite) +{ + StartSpriteAffineAnim(sprite, 0); + sprite->affineAnimPaused = 1; + sprite->data[0] = 20; + + sprite->callback = sub_80782D8; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80D94A8(struct Sprite *sprite) +{ + sub_8078764(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + + sprite->callback = sub_80D94CC; +} + +static void sub_80D94CC(struct Sprite *sprite) +{ + if (--sprite->data[0] == -1) + { + sprite->data[0] = 6; + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, sub_80D9524); + } +} + +static void sub_80D9524(struct Sprite *sprite) +{ + sprite->data[0] = 15; + + sprite->callback = sub_80782D8; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80D9540(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + sub_8078764(sprite, 1); + sprite->data[1] = gBattleAnimArgs[2]; + sprite->data[2] = gBattleAnimArgs[3]; + sprite->data[0]++; + } + else + { + sprite->data[4] += sprite->data[1]; + sprite->pos2.x = sprite->data[4] >> 8; + sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]); + sprite->data[3] = (sprite->data[3] + 3) & 0xFF; + + if (sprite->data[3] > 100) + sprite->invisible = sprite->data[3] % 2; + + if (sprite->data[3] > 120) + DestroyAnimSprite(sprite); + } +} -- cgit v1.2.3 From 19b0a0f3e05c73b84e5afaffb83080474774e918 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 6 Feb 2018 09:05:27 -0500 Subject: Match sub_8148F3C --- src/scene/intro_credits_graphics.c | 140 ++++--------------------------------- 1 file changed, 13 insertions(+), 127 deletions(-) (limited to 'src') diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c index 7f6765ef6..6aadafc58 100644 --- a/src/scene/intro_credits_graphics.c +++ b/src/scene/intro_credits_graphics.c @@ -436,161 +436,47 @@ u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d) return taskId; } -#ifdef NONMATCHING void sub_8148F3C(u8 taskId) { - register u32 r4 asm("r4"); + s16 r4; s32 r2; - r4 = (u16)gTasks[taskId].data[1] << 16; + r4 = gTasks[taskId].data[1]; if (r4 != 0) { - r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3] - (r4 >> 12); + r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3]; + r2 -= 16 * (u16)r4; gTasks[taskId].data[2] = r2 >> 16; gTasks[taskId].data[3] = r2; REG_BG1HOFS = gTasks[taskId].data[2]; - REG_BG1VOFS = gUnknown_0203935A + gUnknown_02039358; + REG_BG1VOFS = gUnknown_02039358 + gUnknown_0203935A; } - r4 = (u16)gTasks[taskId].data[4] << 16; + r4 = gTasks[taskId].data[4]; if (r4 != 0) { - r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - (r4 >> 12); + r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; + r2 -= 16 * (u16)r4; gTasks[taskId].data[5] = r2 >> 16; - gTasks[taskId].data[3] = r2; + gTasks[taskId].data[6] = r2; REG_BG2HOFS = gTasks[taskId].data[5]; if (gTasks[taskId].data[0] != 0) - REG_BG2VOFS = gUnknown_0203935A + gUnknown_02039358; + REG_BG2VOFS = gUnknown_02039358 + gUnknown_0203935A; else REG_BG2VOFS = gUnknown_02039358; } - r4 = (u16)gTasks[taskId].data[7] << 16; + r4 = gTasks[taskId].data[7]; if (r4 != 0) { - r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9] - (r4 >> 12);; + r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9]; + r2 -= 16 * (u16)r4; gTasks[taskId].data[8] = r2 >> 16; gTasks[taskId].data[9] = r2; REG_BG3HOFS = gTasks[taskId].data[8]; REG_BG3VOFS = gUnknown_02039358; } } -#else -__attribute__((naked)) -void sub_8148F3C(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - ldr r1, _08148FB4 @ =gTasks\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r3, r0, r1\n\ - ldrh r0, [r3, 0xA]\n\ - lsls r4, r0, 16\n\ - adds r6, r1, 0\n\ - cmp r4, 0\n\ - beq _08148F7C\n\ - movs r1, 0xC\n\ - ldrsh r0, [r3, r1]\n\ - lsls r0, 16\n\ - ldrh r1, [r3, 0xE]\n\ - adds r2, r0, r1\n\ - lsrs r0, r4, 12\n\ - subs r2, r0\n\ - asrs r1, r2, 16\n\ - strh r1, [r3, 0xC]\n\ - strh r2, [r3, 0xE]\n\ - ldr r0, _08148FB8 @ =REG_BG1HOFS\n\ - strh r1, [r0]\n\ - ldr r2, _08148FBC @ =REG_BG1VOFS\n\ - ldr r1, _08148FC0 @ =gUnknown_02039358\n\ - ldr r0, _08148FC4 @ =gUnknown_0203935A\n\ - ldrh r0, [r0]\n\ - ldrh r1, [r1]\n\ - adds r0, r1\n\ - strh r0, [r2]\n\ -_08148F7C:\n\ - ldrh r0, [r3, 0x10]\n\ - lsls r4, r0, 16\n\ - cmp r4, 0\n\ - beq _08148FD8\n\ - movs r1, 0x12\n\ - ldrsh r0, [r3, r1]\n\ - lsls r0, 16\n\ - ldrh r1, [r3, 0x14]\n\ - adds r2, r0, r1\n\ - lsrs r0, r4, 12\n\ - subs r2, r0\n\ - asrs r1, r2, 16\n\ - strh r1, [r3, 0x12]\n\ - strh r2, [r3, 0x14]\n\ - ldr r0, _08148FC8 @ =REG_BG2HOFS\n\ - strh r1, [r0]\n\ - movs r1, 0x8\n\ - ldrsh r0, [r3, r1]\n\ - cmp r0, 0\n\ - beq _08148FD0\n\ - ldr r2, _08148FCC @ =REG_BG2VOFS\n\ - ldr r1, _08148FC0 @ =gUnknown_02039358\n\ - ldr r0, _08148FC4 @ =gUnknown_0203935A\n\ - ldrh r0, [r0]\n\ - ldrh r1, [r1]\n\ - adds r0, r1\n\ - strh r0, [r2]\n\ - b _08148FD8\n\ - .align 2, 0\n\ -_08148FB4: .4byte gTasks\n\ -_08148FB8: .4byte REG_BG1HOFS\n\ -_08148FBC: .4byte REG_BG1VOFS\n\ -_08148FC0: .4byte gUnknown_02039358\n\ -_08148FC4: .4byte gUnknown_0203935A\n\ -_08148FC8: .4byte REG_BG2HOFS\n\ -_08148FCC: .4byte REG_BG2VOFS\n\ -_08148FD0:\n\ - ldr r0, _08149010 @ =REG_BG2VOFS\n\ - ldr r1, _08149014 @ =gUnknown_02039358\n\ - ldrh r1, [r1]\n\ - strh r1, [r0]\n\ -_08148FD8:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r3, r0, r6\n\ - ldrh r0, [r3, 0x16]\n\ - lsls r4, r0, 16\n\ - cmp r4, 0\n\ - beq _08149008\n\ - movs r1, 0x18\n\ - ldrsh r0, [r3, r1]\n\ - lsls r0, 16\n\ - ldrh r1, [r3, 0x1A]\n\ - adds r2, r0, r1\n\ - lsrs r0, r4, 12\n\ - subs r2, r0\n\ - asrs r1, r2, 16\n\ - strh r1, [r3, 0x18]\n\ - strh r2, [r3, 0x1A]\n\ - ldr r0, _08149018 @ =REG_BG3HOFS\n\ - strh r1, [r0]\n\ - ldr r1, _0814901C @ =REG_BG3VOFS\n\ - ldr r0, _08149014 @ =gUnknown_02039358\n\ - ldrh r0, [r0]\n\ - strh r0, [r1]\n\ -_08149008:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08149010: .4byte REG_BG2VOFS\n\ -_08149014: .4byte gUnknown_02039358\n\ -_08149018: .4byte REG_BG3HOFS\n\ -_0814901C: .4byte REG_BG3VOFS\n\ - .syntax divided\n"); -} -#endif void sub_8149020(u8 mode) { -- cgit v1.2.3 From 5563c78798f95130cccf7d5a5c17b02cfb06442b Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Tue, 6 Feb 2018 18:50:20 -0600 Subject: decompile debug_sub_8010CAC --- src/battle/battle_2.c | 1317 ++++++++++++------------------------------------- 1 file changed, 327 insertions(+), 990 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index d3ddc5960..b09d9ad8d 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1363,19 +1363,25 @@ extern u8 gUnknown_Debug_2023B62[]; extern const u8 Str_821F7BD[]; extern const u8 Str_821F7DA[]; -void debug_sub_8012878(void); -void debug_sub_8012D10(u8); void debug_sub_8010818(void); void debug_sub_80108B8(void); void debug_sub_8010CAC(void); +void debug_sub_8011498(void); void debug_sub_801174C(void); void debug_sub_8011D40(void); +void debug_sub_8011E5C(void); +void debug_sub_8011E74(void); void debug_sub_8011EA0(u8); void debug_sub_8012294(void); void debug_sub_80123D8(u8); void debug_sub_8012540(void); void debug_nullsub_3(void); void debug_sub_80125A0(void); +void debug_sub_80125E4(void); +void debug_sub_8012628(void); +void debug_sub_8012688(void); +void debug_sub_8012878(void); +void debug_sub_8012D10(u8); u32 debug_sub_8013294(u8, void *, u32); void debug_sub_80132C8(u8, void *, u32); @@ -1389,7 +1395,7 @@ extern u8 gUnknown_Debug_030043A4; extern u8 gUnknown_Debug_030043A8; extern u8 gBattleBuffersTransferData[]; -extern const s16 gUnknown_Debug_821F424[][5]; +extern const u16 gUnknown_Debug_821F424[][5]; extern const u16 gUnknown_Debug_821F56C[][5]; extern const u32 gUnknown_Debug_821F798[][4]; @@ -1579,994 +1585,325 @@ void debug_sub_8010B80(u8 a) = r12 * 10 + r7; } -__attribute__((naked)) -void debug_sub_8010CAC() +void debug_sub_8010CAC(void) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xfffffff0\n" - " ldr r4, ._553 @ gMain\n" - " ldrh r1, [r4, #0x28]\n" - " mov r0, #0x81\n" - " lsl r0, r0, #0x2\n" - " cmp r1, r0\n" - " bne ._543 @cond_branch\n" - " bl DoSoftReset\n" - "._543:\n" - " ldrh r0, [r4, #0x2a]\n" - " cmp r0, #0x4\n" - " beq ._544 @cond_branch\n" - " b ._559\n" - "._544:\n" - " ldr r0, ._553 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " mov r8, r0\n" - " cmp r1, #0x5\n" - " bhi ._546 @cond_branch\n" - " ldr r0, ._553 + 8 @ gUnknown_Debug_030043A8\n" - " mov r1, #0x0\n" - " strb r1, [r0]\n" - " bl debug_sub_8012628\n" - " ldr r0, ._553 + 12 @ debug_sub_8011498\n" - " bl SetMainCallback2\n" - "._546:\n" - " ldr r0, ._553 + 16 @ gUnknown_Debug_030043A0\n" - " ldrb r3, [r0]\n" - " cmp r3, #0\n" - " bne ._555 @cond_branch\n" - " mov r1, r8\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x6\n" - " bne ._555 @cond_branch\n" - " ldr r0, ._553 + 20 @ debug_sub_80108B8\n" - " str r0, [r4, #0x8]\n" - " ldr r4, ._553 + 24 @ gPlayerParty\n" - " ldr r0, ._553 + 28 @ gUnknown_Debug_2023A76\n" - " ldrh r1, [r0]\n" - " ldrb r2, [r0, #0x2]\n" - " str r3, [sp]\n" - " str r3, [sp, #0x4]\n" - " str r3, [sp, #0x8]\n" - " str r3, [sp, #0xc]\n" - " add r0, r4, #0\n" - " mov r3, #0x20\n" - " bl CreateMon\n" - " mov r5, #0x0\n" - " add r6, r4, #0\n" - "._549:\n" - " add r1, r5, #0\n" - " add r1, r1, #0xd\n" - " lsl r4, r5, #0x1\n" - " ldr r0, ._553 + 32 @ gUnknown_Debug_2023B02\n" - " add r4, r4, r0\n" - " add r0, r6, #0\n" - " add r2, r4, #0\n" - " bl SetMonData\n" - " add r1, r5, #0\n" - " add r1, r1, #0x11\n" - " mov r2, #0x0\n" - " ldsh r0, [r4, r2]\n" - " lsl r2, r0, #0x1\n" - " add r2, r2, r0\n" - " lsl r2, r2, #0x2\n" - " ldr r0, ._553 + 36 @ gBattleMoves\n" - " add r2, r2, r0\n" - " add r0, r6, #0\n" - " bl SetMonData\n" - " add r5, r5, #0x1\n" - " cmp r5, #0x3\n" - " ble ._549 @cond_branch\n" - " ldr r2, ._553 + 28 @ gUnknown_Debug_2023A76\n" - " mov r4, #0x3c\n" - " ldsh r0, [r2, r4]\n" - " cmp r0, #0x1\n" - " beq ._550 @cond_branch\n" - " cmp r0, #0x2\n" - " beq ._551 @cond_branch\n" - " b ._555\n" - "._554:\n" - " .align 2, 0\n" - "._553:\n" - " .word gMain\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_030043A8\n" - " .word debug_sub_8011498+1\n" - " .word gUnknown_Debug_030043A0\n" - " .word debug_sub_80108B8+1\n" - " .word gPlayerParty\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_2023B02\n" - " .word gBattleMoves+0x4\n" - "._550:\n" - " ldr r1, ._556 @ gCB2_AfterEvolution\n" - " ldr r0, ._556 + 4 @ debug_sub_80108B8\n" - " str r0, [r1]\n" - " ldr r0, ._556 + 8 @ gPlayerParty\n" - " ldrh r1, [r2, #0xa]\n" - " mov r2, #0x1\n" - " mov r3, #0x0\n" - " bl EvolutionScene\n" - " b ._555\n" - "._557:\n" - " .align 2, 0\n" - "._556:\n" - " .word gCB2_AfterEvolution\n" - " .word debug_sub_80108B8+1\n" - " .word gPlayerParty\n" - "._551:\n" - " bl debug_sub_8012688\n" - "._555:\n" - " ldr r0, ._565 @ gUnknown_Debug_030043A0\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x1\n" - " bne ._559 @cond_branch\n" - " ldr r0, ._565 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r0, [r0]\n" - " cmp r0, #0x6\n" - " bne ._559 @cond_branch\n" - " ldr r3, ._565 + 8 @ gSaveBlock2\n" - " ldrb r2, [r3, #0x15]\n" - " lsl r0, r2, #0x1d\n" - " lsr r5, r0, #0x1f\n" - " lsl r0, r2, #0x1f\n" - " lsr r0, r0, #0x1f\n" - " lsl r0, r0, #0x1\n" - " orr r5, r5, r0\n" - " add r5, r5, #0x1\n" - " cmp r5, #0x4\n" - " bne ._560 @cond_branch\n" - " mov r5, #0x0\n" - "._560:\n" - " mov r0, #0x1\n" - " add r1, r5, #0\n" - " and r1, r1, r0\n" - " lsl r1, r1, #0x2\n" - " mov r0, #0x5\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " mov r1, #0x2\n" - " and r5, r5, r1\n" - " lsr r2, r5, #0x1\n" - " sub r1, r1, #0x4\n" - " and r0, r0, r1\n" - " orr r0, r0, r2\n" - " strb r0, [r3, #0x15]\n" - " lsl r0, r0, #0x1f\n" - " lsr r0, r0, #0x1f\n" - " bl SetPokemonCryStereo\n" - " bl debug_nullsub_3\n" - "._559:\n" - " ldr r4, ._565 + 12 @ gMain\n" - " ldrh r0, [r4, #0x2a]\n" - " cmp r0, #0x8\n" - " bne ._561 @cond_branch\n" - " bl debug_sub_801174C\n" - "._561:\n" - " ldrh r0, [r4, #0x2a]\n" - " cmp r0, #0x40\n" - " bne ._562 @cond_branch\n" - " bl debug_sub_80125E4\n" - " ldr r1, ._565 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq ._563 @cond_branch\n" - " sub r0, r0, #0x1\n" - " b ._564\n" - "._566:\n" - " .align 2, 0\n" - "._565:\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gSaveBlock2\n" - " .word gMain\n" - "._563:\n" - " mov r0, #0x6\n" - "._564:\n" - " strb r0, [r1]\n" - " bl debug_sub_8011E74\n" - " ldr r0, ._570 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - " bl debug_sub_80125A0\n" - "._562:\n" - " ldr r0, ._570 + 4 @ gMain\n" - " ldrh r0, [r0, #0x2a]\n" - " cmp r0, #0x80\n" - " bne ._567 @cond_branch\n" - " bl debug_sub_80125E4\n" - " ldr r1, ._570 @ gUnknown_Debug_030043A4\n" - " ldrb r0, [r1]\n" - " cmp r0, #0x6\n" - " bne ._568 @cond_branch\n" - " mov r0, #0x0\n" - " b ._569\n" - "._571:\n" - " .align 2, 0\n" - "._570:\n" - " .word gUnknown_Debug_030043A4\n" - " .word gMain\n" - "._568:\n" - " add r0, r0, #0x1\n" - "._569:\n" - " strb r0, [r1]\n" - " bl debug_sub_8011E74\n" - " ldr r0, ._575 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - " bl debug_sub_80125A0\n" - "._567:\n" - " ldr r0, ._575 + 4 @ gMain\n" - " ldrh r0, [r0, #0x2a]\n" - " cmp r0, #0x20\n" - " bne ._572 @cond_branch\n" - " bl debug_sub_80125E4\n" - " ldr r2, ._575 + 8 @ gUnknown_Debug_030043A0\n" - " ldrb r0, [r2]\n" - " add r1, r0, #0\n" - " cmp r1, #0\n" - " beq ._573 @cond_branch\n" - " sub r0, r0, #0x1\n" - " strb r0, [r2]\n" - " b ._577\n" - "._576:\n" - " .align 2, 0\n" - "._575:\n" - " .word gUnknown_Debug_030043A4\n" - " .word gMain\n" - " .word gUnknown_Debug_030043A0\n" - "._573:\n" - " ldr r3, ._581 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r3]\n" - " cmp r0, #0\n" - " beq ._577 @cond_branch\n" - " strb r1, [r3]\n" - " mov r0, #0x4\n" - " strb r0, [r2]\n" - " ldr r0, ._581 + 4 @ gBattle_BG1_X\n" - " strh r1, [r0]\n" - " bl debug_sub_8011E5C\n" - " bl debug_sub_8011E74\n" - " ldr r0, ._581 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - "._577:\n" - " bl debug_sub_80125A0\n" - "._572:\n" - " ldr r0, ._581 + 12 @ gMain\n" - " ldrh r0, [r0, #0x2a]\n" - " cmp r0, #0x10\n" - " bne ._578 @cond_branch\n" - " bl debug_sub_80125E4\n" - " ldr r2, ._581 + 16 @ gUnknown_Debug_030043A0\n" - " ldrb r0, [r2]\n" - " cmp r0, #0x4\n" - " beq ._579 @cond_branch\n" - " add r0, r0, #0x1\n" - " strb r0, [r2]\n" - " b ._583\n" - "._582:\n" - " .align 2, 0\n" - "._581:\n" - " .word gUnknown_Debug_03004360\n" - " .word gBattle_BG1_X\n" - " .word gUnknown_Debug_030043A4\n" - " .word gMain\n" - " .word gUnknown_Debug_030043A0\n" - "._579:\n" - " ldr r3, ._587 @ gUnknown_Debug_03004360\n" - " ldrb r1, [r3]\n" - " cmp r1, #0\n" - " bne ._583 @cond_branch\n" - " mov r0, #0x1\n" - " strb r0, [r3]\n" - " strb r1, [r2]\n" - " ldr r1, ._587 + 4 @ gBattle_BG1_X\n" - " mov r2, #0x80\n" - " lsl r2, r2, #0x1\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " bl debug_sub_8011E5C\n" - " bl debug_sub_8011E74\n" - " ldr r0, ._587 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - "._583:\n" - " bl debug_sub_80125A0\n" - "._578:\n" - " ldr r0, ._587 + 12 @ gMain\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._584 @cond_branch\n" - " b ._607\n" - "._584:\n" - " ldr r0, ._587 + 16 @ gUnknown_Debug_030043A0\n" - " ldrb r2, [r0]\n" - " ldr r0, ._587 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " add r0, r2, r0\n" - " sub r0, r0, #0x1e\n" - " cmp r0, #0x4\n" - " bhi ._586 @cond_branch\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._587 + 20 @ \n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._588:\n" - " .align 2, 0\n" - "._587:\n" - " .word gUnknown_Debug_03004360\n" - " .word gBattle_BG1_X\n" - " .word gUnknown_Debug_030043A4\n" - " .word gMain\n" - " .word gUnknown_Debug_030043A0\n" - " .word ._589\n" - "._589:\n" - " .word ._590\n" - " .word ._591\n" - " .word ._592\n" - " .word ._593\n" - " .word ._594\n" - "._591:\n" - " bl debug_sub_8010818\n" - " b ._595\n" - "._592:\n" - " ldr r1, ._597 @ gUnknown_Debug_2023A76\n" - " mov r0, #0x1f\n" - " mov r2, #0xec\n" - " bl debug_sub_80132C8\n" - "._595:\n" - " bl debug_sub_8011E5C\n" - " bl debug_sub_8011E74\n" - " bl debug_sub_8012540\n" - " bl debug_nullsub_3\n" - " ldr r0, ._597 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - " b ._607\n" - "._598:\n" - " .align 2, 0\n" - "._597:\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_030043A4\n" - "._593:\n" - " ldr r1, ._600 @ gUnknown_Debug_2023A76\n" - " mov r0, #0x1f\n" - " mov r2, #0xec\n" - " bl debug_sub_8013294\n" - " b ._607\n" - "._601:\n" - " .align 2, 0\n" - "._600:\n" - " .word gUnknown_Debug_2023A76\n" - "._594:\n" - " ldr r3, ._604 @ gUnknown_Debug_2023A76\n" - " add r2, r3, #0\n" - " add r2, r2, #0x44\n" - " ldrh r1, [r2]\n" - " mov r4, #0x0\n" - " ldsh r0, [r2, r4]\n" - " cmp r0, #0\n" - " beq ._602 @cond_branch\n" - " sub r0, r1, #1\n" - " strh r0, [r2]\n" - " add r1, r3, #0\n" - " add r1, r1, #0x8a\n" - " ldrh r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strh r0, [r1]\n" - " b ._603\n" - "._605:\n" - " .align 2, 0\n" - "._604:\n" - " .word gUnknown_Debug_2023A76\n" - "._602:\n" - " mov r1, #0x8\n" - " strh r1, [r2]\n" - " add r0, r3, #0\n" - " add r0, r0, #0x8a\n" - " strh r1, [r0]\n" - "._603:\n" - " bl debug_sub_8012540\n" - " b ._607\n" - "._590:\n" - " mov r0, #0x0\n" - " bl debug_sub_8010B80\n" - " ldr r2, ._608 @ gUnknown_Debug_030043A0\n" - " ldr r0, ._608 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - " b ._607\n" - "._609:\n" - " .align 2, 0\n" - "._608:\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - "._586:\n" - " cmp r2, #0x4\n" - " bne ._611 @cond_branch\n" - " cmp r1, #0x5\n" - " bhi ._611 @cond_branch\n" - " mov r0, #0x1\n" - " bl debug_sub_8010AAC\n" - " b ._613\n" - "._611:\n" - " ldr r6, ._618 @ gUnknown_Debug_2023A76\n" - " ldr r5, ._618 + 4 @ gUnknown_Debug_030043A0\n" - " ldr r4, ._618 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r0, [r4]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " ldrb r0, [r5]\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x1\n" - " ldr r2, ._618 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r2]\n" - " mov r3, #0x46\n" - " mul r0, r0, r3\n" - " add r1, r1, r0\n" - " add r1, r1, r6\n" - " ldrh r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strh r0, [r1]\n" - " ldrb r0, [r4]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " ldrb r5, [r5]\n" - " add r1, r1, r5\n" - " lsl r0, r1, #0x1\n" - " ldrb r2, [r2]\n" - " mul r2, r2, r3\n" - " add r0, r0, r2\n" - " add r3, r0, r6\n" - " mov r4, #0x0\n" - " ldsh r2, [r3, r4]\n" - " ldr r4, ._618 + 16 @ gUnknown_Debug_821F424\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r1, r0, #0x1\n" - " add r0, r4, #0\n" - " add r0, r0, #0x8\n" - " add r0, r1, r0\n" - " ldrh r0, [r0]\n" - " cmp r2, r0\n" - " bge ._613 @cond_branch\n" - " add r0, r4, #6\n" - " add r0, r1, r0\n" - " ldrh r0, [r0]\n" - " strh r0, [r3]\n" - "._613:\n" - " ldr r5, ._618 + 4 @ gUnknown_Debug_030043A0\n" - " ldrb r0, [r5]\n" - " cmp r0, #0\n" - " bne ._614 @cond_branch\n" - " mov r0, #0x0\n" - " bl debug_sub_8010AAC\n" - " ldr r0, ._618 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " add r0, r0, #0x4\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - "._614:\n" - " ldr r4, ._618 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r5, [r5]\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - "._607:\n" - " ldr r0, ._618 + 20 @ gMain\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._615 @cond_branch\n" - " b ._638\n" - "._615:\n" - " ldr r0, ._618 + 4 @ gUnknown_Debug_030043A0\n" - " ldrb r2, [r0]\n" - " ldr r0, ._618 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " add r0, r2, r0\n" - " sub r0, r0, #0x1e\n" - " cmp r0, #0x4\n" - " bhi ._617 @cond_branch\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._618 + 24 @ \n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._619:\n" - " .align 2, 0\n" - "._618:\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_821F424\n" - " .word gMain\n" - " .word ._620\n" - "._620:\n" - " .word ._621\n" - " .word ._622\n" - " .word ._623\n" - " .word ._624\n" - " .word ._625\n" - "._622:\n" - " bl debug_sub_8010818\n" - " b ._626\n" - "._623:\n" - " ldr r1, ._628 @ gUnknown_Debug_2023A76\n" - " mov r0, #0x1f\n" - " mov r2, #0xec\n" - " bl debug_sub_80132C8\n" - "._626:\n" - " bl debug_sub_8011E5C\n" - " bl debug_sub_8011E74\n" - " bl debug_sub_8012540\n" - " bl debug_nullsub_3\n" - " ldr r0, ._628 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - " b ._638\n" - "._629:\n" - " .align 2, 0\n" - "._628:\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_030043A4\n" - "._624:\n" - " ldr r1, ._631 @ gUnknown_Debug_2023A76\n" - " mov r0, #0x1f\n" - " mov r2, #0xec\n" - " bl debug_sub_8013294\n" - " b ._638\n" - "._632:\n" - " .align 2, 0\n" - "._631:\n" - " .word gUnknown_Debug_2023A76\n" - "._625:\n" - " ldr r3, ._635 @ gUnknown_Debug_2023A76\n" - " add r2, r3, #0\n" - " add r2, r2, #0x44\n" - " ldrh r1, [r2]\n" - " mov r4, #0x0\n" - " ldsh r0, [r2, r4]\n" - " cmp r0, #0x7\n" - " bgt ._633 @cond_branch\n" - " add r0, r1, #1\n" - " strh r0, [r2]\n" - " add r1, r3, #0\n" - " add r1, r1, #0x8a\n" - " ldrh r0, [r1]\n" - " add r0, r0, #0x1\n" - " strh r0, [r1]\n" - " b ._634\n" - "._636:\n" - " .align 2, 0\n" - "._635:\n" - " .word gUnknown_Debug_2023A76\n" - "._633:\n" - " mov r1, #0x0\n" - " strh r1, [r2]\n" - " add r0, r3, #0\n" - " add r0, r0, #0x8a\n" - " strh r1, [r0]\n" - "._634:\n" - " bl debug_sub_8012540\n" - " b ._638\n" - "._621:\n" - " mov r0, #0x1\n" - " bl debug_sub_8010B80\n" - " ldr r2, ._639 @ gUnknown_Debug_030043A0\n" - " ldr r0, ._639 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - " b ._638\n" - "._640:\n" - " .align 2, 0\n" - "._639:\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - "._617:\n" - " cmp r2, #0x4\n" - " bne ._642 @cond_branch\n" - " cmp r1, #0x5\n" - " bhi ._642 @cond_branch\n" - " mov r0, #0x1\n" - " bl debug_sub_8010AAC\n" - " b ._644\n" - "._642:\n" - " ldr r6, ._650 @ gUnknown_Debug_2023A76\n" - " ldr r5, ._650 + 4 @ gUnknown_Debug_030043A0\n" - " ldr r4, ._650 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r0, [r4]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " ldrb r0, [r5]\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x1\n" - " ldr r2, ._650 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r2]\n" - " mov r3, #0x46\n" - " mul r0, r0, r3\n" - " add r1, r1, r0\n" - " add r1, r1, r6\n" - " ldrh r0, [r1]\n" - " add r0, r0, #0x1\n" - " strh r0, [r1]\n" - " ldrb r0, [r4]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " ldrb r5, [r5]\n" - " add r1, r1, r5\n" - " lsl r0, r1, #0x1\n" - " ldrb r2, [r2]\n" - " mul r2, r2, r3\n" - " add r0, r0, r2\n" - " add r3, r0, r6\n" - " mov r4, #0x0\n" - " ldsh r2, [r3, r4]\n" - " ldr r4, ._650 + 16 @ gUnknown_Debug_821F424\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r1, r0, #0x1\n" - " add r0, r4, #6\n" - " add r0, r1, r0\n" - " ldrh r0, [r0]\n" - " cmp r2, r0\n" - " ble ._644 @cond_branch\n" - " add r0, r4, #0\n" - " add r0, r0, #0x8\n" - " add r0, r1, r0\n" - " ldrh r0, [r0]\n" - " strh r0, [r3]\n" - "._644:\n" - " ldr r5, ._650 + 4 @ gUnknown_Debug_030043A0\n" - " ldrb r0, [r5]\n" - " cmp r0, #0\n" - " bne ._645 @cond_branch\n" - " mov r0, #0x0\n" - " bl debug_sub_8010AAC\n" - " ldr r0, ._650 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " add r0, r0, #0x4\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - "._645:\n" - " ldr r4, ._650 + 8 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r5, [r5]\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - "._638:\n" - " ldr r0, ._650 + 20 @ gMain\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._646 @cond_branch\n" - " ldr r0, ._650 + 4 @ gUnknown_Debug_030043A0\n" - " ldrb r1, [r0]\n" - " ldr r2, ._650 + 8 @ gUnknown_Debug_030043A4\n" - " mov r8, r2\n" - " add r7, r0, #0\n" - " cmp r1, #0x4\n" - " bne ._648 @cond_branch\n" - " ldrb r0, [r2]\n" - " cmp r0, #0x5\n" - " bhi ._648 @cond_branch\n" - " mov r0, #0x1\n" - " bl debug_sub_8010AAC\n" - " b ._653\n" - "._651:\n" - " .align 2, 0\n" - "._650:\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_821F424\n" - " .word gMain\n" - "._648:\n" - " mov r4, r8\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r1, [r7]\n" - " add r0, r0, r1\n" - " cmp r0, #0x1e\n" - " bne ._652 @cond_branch\n" - " mov r0, #0x2\n" - " bl debug_sub_8010B80\n" - " b ._653\n" - "._652:\n" - " ldr r4, ._655 @ gUnknown_Debug_2023A76\n" - " lsl r1, r0, #0x1\n" - " ldr r3, ._655 + 4 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r3]\n" - " mov r0, #0x46\n" - " mul r0, r0, r2\n" - " add r1, r1, r0\n" - " add r1, r1, r4\n" - " ldrh r0, [r1]\n" - " sub r0, r0, #0xa\n" - " strh r0, [r1]\n" - " add r6, r3, #0\n" - " ldr r5, ._655 + 8 @ gUnknown_Debug_821F424\n" - " b ._654\n" - "._656:\n" - " .align 2, 0\n" - "._655:\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_821F424\n" - "._657:\n" - " add r0, r5, #6\n" - " add r0, r1, r0\n" - " ldrh r0, [r0]\n" - " ldrh r2, [r3]\n" - " add r0, r0, r2\n" - " strh r0, [r3]\n" - "._654:\n" - " mov r1, r8\n" - " ldrb r0, [r1]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " ldrb r2, [r7]\n" - " add r1, r1, r2\n" - " lsl r2, r1, #0x1\n" - " ldrb r3, [r6]\n" - " mov r0, #0x46\n" - " mul r0, r0, r3\n" - " add r2, r2, r0\n" - " add r3, r2, r4\n" - " mov r0, #0x0\n" - " ldsh r2, [r3, r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r1, r0, #0x1\n" - " add r0, r5, #0\n" - " add r0, r0, #0x8\n" - " add r0, r1, r0\n" - " ldrh r0, [r0]\n" - " cmp r2, r0\n" - " blt ._657 @cond_branch\n" - "._653:\n" - " ldr r5, ._663 @ gUnknown_Debug_030043A0\n" - " ldrb r0, [r5]\n" - " cmp r0, #0\n" - " bne ._658 @cond_branch\n" - " mov r0, #0x0\n" - " bl debug_sub_8010AAC\n" - " ldr r0, ._663 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " add r0, r0, #0x4\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - "._658:\n" - " ldr r4, ._663 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r5, [r5]\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - "._646:\n" - " ldr r0, ._663 + 8 @ gMain\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._659 @cond_branch\n" - " ldr r0, ._663 @ gUnknown_Debug_030043A0\n" - " ldrb r1, [r0]\n" - " ldr r2, ._663 + 4 @ gUnknown_Debug_030043A4\n" - " mov r8, r2\n" - " add r7, r0, #0\n" - " cmp r1, #0x4\n" - " bne ._661 @cond_branch\n" - " ldrb r0, [r2]\n" - " cmp r0, #0x5\n" - " bhi ._661 @cond_branch\n" - " mov r0, #0x1\n" - " bl debug_sub_8010AAC\n" - " b ._666\n" - "._664:\n" - " .align 2, 0\n" - "._663:\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gMain\n" - "._661:\n" - " mov r4, r8\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r1, [r7]\n" - " add r0, r0, r1\n" - " cmp r0, #0x1e\n" - " bne ._665 @cond_branch\n" - " mov r0, #0x3\n" - " bl debug_sub_8010B80\n" - " b ._666\n" - "._665:\n" - " ldr r4, ._668 @ gUnknown_Debug_2023A76\n" - " lsl r1, r0, #0x1\n" - " ldr r3, ._668 + 4 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r3]\n" - " mov r0, #0x46\n" - " mul r0, r0, r2\n" - " add r1, r1, r0\n" - " add r1, r1, r4\n" - " ldrh r0, [r1]\n" - " add r0, r0, #0xa\n" - " strh r0, [r1]\n" - " add r6, r3, #0\n" - " ldr r5, ._668 + 8 @ gUnknown_Debug_821F424\n" - " b ._667\n" - "._669:\n" - " .align 2, 0\n" - "._668:\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_821F424\n" - "._670:\n" - " ldrh r0, [r3]\n" - " sub r0, r0, r1\n" - " strh r0, [r3]\n" - "._667:\n" - " mov r2, r8\n" - " ldrb r0, [r2]\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " ldrb r0, [r7]\n" - " add r1, r1, r0\n" - " lsl r2, r1, #0x1\n" - " ldrb r3, [r6]\n" - " mov r0, #0x46\n" - " mul r0, r0, r3\n" - " add r2, r2, r0\n" - " add r3, r2, r4\n" - " mov r0, #0x0\n" - " ldsh r2, [r3, r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x1\n" - " add r1, r5, #6\n" - " add r0, r0, r1\n" - " ldrh r1, [r0]\n" - " cmp r2, r1\n" - " bgt ._670 @cond_branch\n" - "._666:\n" - " ldr r5, ._672 @ gUnknown_Debug_030043A0\n" - " ldrb r0, [r5]\n" - " cmp r0, #0\n" - " bne ._671 @cond_branch\n" - " mov r0, #0x0\n" - " bl debug_sub_8010AAC\n" - " ldr r0, ._672 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " add r0, r0, #0x4\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - "._671:\n" - " ldr r4, ._672 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r5, [r5]\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_8011EA0\n" - " ldrb r1, [r4]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " bl debug_sub_80123D8\n" - "._659:\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " add sp, sp, #0x10\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._673:\n" - " .align 2, 0\n" - "._672:\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - "\n" - ); + s32 r5; + + if (gMain.heldKeysRaw == 0x204) + DoSoftReset(); + if (gMain.newKeysRaw == 4) + { + if (gUnknown_Debug_030043A4 < 6) + { + gUnknown_Debug_030043A8 = 0; + debug_sub_8012628(); + SetMainCallback2(debug_sub_8011498); + } + //_546 + if (gUnknown_Debug_030043A0 == 0 && gUnknown_Debug_030043A4 == 6) + { + gMain.savedCallback = debug_sub_80108B8; + CreateMon( + &gPlayerParty[0], + gUnknown_Debug_2023A76_[0][0][0], + gUnknown_Debug_2023A76_[0][0][1], + 32, + 0, 0, 0, 0); + for (r5 = 0; r5 < 4; r5++) + { + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1 + r5, &gUnknown_Debug_2023B02[0][0][r5]); + SetMonData(&gPlayerParty[0], MON_DATA_PP1 + r5, &gBattleMoves[gUnknown_Debug_2023B02[0][0][r5]].pp); + } + switch (gUnknown_Debug_2023A76_[0][6][0]) + { + case 1: //_550 + gCB2_AfterEvolution = debug_sub_80108B8; + EvolutionScene(&gPlayerParty[0], gUnknown_Debug_2023A76_[0][1][0], 1, 0); + break; + case 2: //_551 + debug_sub_8012688(); + break; + } + } + //_555 + if (gUnknown_Debug_030043A0 == 1 && gUnknown_Debug_030043A4 == 6) + { + // This is really weird + r5 = (gSaveBlock2.optionsBattleSceneOff | (gSaveBlock2.optionsSound << 1)); + r5++; + if (r5 == 4) + r5 = 0; + gSaveBlock2.optionsBattleSceneOff = (r5 & 1); + gSaveBlock2.optionsSound = (r5 & 2) >> 1; + SetPokemonCryStereo(gSaveBlock2.optionsSound); + debug_nullsub_3(); + } + } + //_559 + if (gMain.newKeysRaw == 8) + debug_sub_801174C(); + if (gMain.newKeysRaw == 0x40) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A4 != 0) + gUnknown_Debug_030043A4--; + else + gUnknown_Debug_030043A4 = 6; + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + debug_sub_80125A0(); + } + //_562 + if (gMain.newKeysRaw == 0x80) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A4 == 6) + gUnknown_Debug_030043A4 = 0; + else + gUnknown_Debug_030043A4++; + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + debug_sub_80125A0(); + } + //_567 + if (gMain.newKeysRaw == 0x20) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A0 != 0) + { + gUnknown_Debug_030043A0--; + } + else + { + if (gUnknown_Debug_03004360 != 0) + { + gUnknown_Debug_03004360 = 0; + gUnknown_Debug_030043A0 = 4; + gBattle_BG1_X = 0; + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + } + //_577 + debug_sub_80125A0(); + } + //_572 + if (gMain.newKeysRaw == 0x10) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A0 != 4) + { + gUnknown_Debug_030043A0++; + } + else + { + if (gUnknown_Debug_03004360 == 0) + { + gUnknown_Debug_03004360 = 1; + gUnknown_Debug_030043A0 = 0; + gBattle_BG1_X = 0x100; + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + } + debug_sub_80125A0(); + } + //_578 + if (gMain.newAndRepeatedKeys & B_BUTTON) + { + switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) + { + case 31: + debug_sub_8010818(); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 32: + debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 33: + debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC); + break; + case 34: + if (gUnknown_Debug_2023A76_[0][6][4] != 0) + { + gUnknown_Debug_2023A76_[0][6][4]--; + gUnknown_Debug_2023A76_[1][6][4]--; + } + else + { + gUnknown_Debug_2023A76_[0][6][4] = 8; + gUnknown_Debug_2023A76_[1][6][4] = 8; + } + debug_sub_8012540(); + break; + case 30: + debug_sub_8010B80(0); + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + break; + default: + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]--; + if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + //_613 + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + } + } + //_607 + if (gMain.newAndRepeatedKeys & A_BUTTON) + { + switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) + { + case 31: + debug_sub_8010818(); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 32: + debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 33: + debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC); + break; + case 34: + if (gUnknown_Debug_2023A76_[0][6][4] < 8) + { + gUnknown_Debug_2023A76_[0][6][4]++; + gUnknown_Debug_2023A76_[1][6][4]++; + } + else + { + gUnknown_Debug_2023A76_[0][6][4] = 0; + gUnknown_Debug_2023A76_[1][6][4] = 0; + } + debug_sub_8012540(); + break; + case 30: + debug_sub_8010B80(1); + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + break; + default: + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]++; + if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]; + } + //_644 + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + //_645 + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + } + } + //_638 + if (gMain.newAndRepeatedKeys & 0x200) + { + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + //_648 + else + { + if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) + { + debug_sub_8010B80(2); + } + //_652 + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= 10; + while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + } + //_653 + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + //_658 + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + //_646 + if (gMain.newAndRepeatedKeys & 0x100) + { + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + //_661 + else + { + if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) + { + debug_sub_8010B80(3); + } + //_665 + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += 10; + while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + } + //_666 + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + //_671 + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + //_659 + AnimateSprites(); + BuildOamBuffer(); } __attribute__((naked)) -- cgit v1.2.3 From 9a8ec555e68fb143ffe900c778ddb85d5bd145a5 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 6 Feb 2018 19:23:54 -0600 Subject: fix bss memory locations --- src/debug/nakamura_debug_menu.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c index b8c4ed73e..550ac7bbd 100644 --- a/src/debug/nakamura_debug_menu.c +++ b/src/debug/nakamura_debug_menu.c @@ -15,6 +15,7 @@ EWRAM_DATA u16 _nakamuraDataC = 0; __attribute__((unused)) static u8 _nakamuraStatic0[0x18]; __attribute__((unused)) static u8 _nakamuraStatic18; +__attribute__((unused)) static u8 gDebugFiller3000814[4]; asm(".global _nakamuraStatic0"); asm(".global _nakamuraStatic18"); -- cgit v1.2.3 From 377710a0cb9cd85f2d1d221c1de30f671b4286cd Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Tue, 6 Feb 2018 21:20:07 -0600 Subject: decompile debug code in cable_club.c --- src/engine/cable_club.c | 548 +++++++++--------------------------------------- src/engine/link.c | 2 - 2 files changed, 94 insertions(+), 456 deletions(-) (limited to 'src') diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index ff73e638e..0cb148d73 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -2,7 +2,9 @@ #include "battle.h" #include "battle_records.h" #include "cable_club.h" +#include "event_data.h" #include "field_message_box.h" +#include "field_specials.h" #include "field_weather.h" #include "link.h" #include "load_save.h" @@ -21,16 +23,9 @@ #include "strings2.h" #include "task.h" #include "text.h" +#include "trade.h" #include "trainer_card.h" -extern u8 unk_2030220; -extern u16 gSpecialVar_Result; -extern struct TrainerCard gTrainerCards[4]; -extern u8 gUnknown_03004860; -extern u8 gFieldLinkPlayerCount; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; extern u16 gBattleTypeFlags; extern const u8 gUnknown_081A4932[]; extern const u8 gUnknown_081A4975[]; @@ -42,12 +37,13 @@ extern struct u8 field1; } gUnknown_020297D8; -/*static*/ void sub_8082F20(u8 taskId); +static void sub_8082F20(u8 taskId); static void sub_8082F68(u8 taskId); static void sub_8082FEC(u8 taskId); static void sub_808303C(u8 taskId); static void sub_80830E4(u8 taskId); static void sub_8083188(u8 taskId); +static void sub_80831F8(u8 taskId); static void sub_8083288(u8 taskId); static void sub_8083314(u8 taskId); static void sub_80833C4(u8 taskId); @@ -66,15 +62,9 @@ static void sub_8083AAC(u8 taskId); static void sub_8083B44(u8 taskId); static void sub_8083B6C(void); static void sub_8083CA4(u8 taskId); - -extern void sub_80831F8(u8 taskId); -extern void Overworld_ResetMapMusic(void); -extern void sub_810FEFC(void); -extern void sub_8047CD8(void); -extern void sub_805559C(void); -extern void sub_8055574(void); -extern s32 sub_80554F8(void); -extern void sub_805465C(void); +#if DEBUG +static u8 debug_sub_808B850(void); +#endif #ifdef GERMAN const u8 TrainerCardColorName_Bronze[] = _("BRONZE"); @@ -97,392 +87,86 @@ const u8 *const gTrainerCardColorNames[] = }; #if DEBUG - -__attribute__((naked)) -int debug_sub_808A4D0() -{ - asm("\ - push {lr}\n\ - add r1, r0, #0\n\ - ldr r0, ._3 @ sub_8082F68\n\ - cmp r1, r0\n\ - bne ._1 @cond_branch\n\ - mov r0, #0x1\n\ - b ._30\n\ -._4:\n\ - .align 2, 0\n\ -._3:\n\ - .word sub_8082F68+1\n\ -._1:\n\ - ldr r0, ._7 @ sub_8082FEC\n\ - cmp r1, r0\n\ - bne ._5 @cond_branch\n\ - mov r0, #0x11\n\ - b ._30\n\ -._8:\n\ - .align 2, 0\n\ -._7:\n\ - .word sub_8082FEC+1\n\ -._5:\n\ - ldr r0, ._11 @ sub_808303C\n\ - cmp r1, r0\n\ - bne ._9 @cond_branch\n\ - mov r0, #0x12\n\ - b ._30\n\ -._12:\n\ - .align 2, 0\n\ -._11:\n\ - .word sub_808303C+1\n\ -._9:\n\ - ldr r0, ._15 @ sub_8083188\n\ - cmp r1, r0\n\ - bne ._13 @cond_branch\n\ - mov r0, #0x13\n\ - b ._30\n\ -._16:\n\ - .align 2, 0\n\ -._15:\n\ - .word sub_8083188+1\n\ -._13:\n\ - ldr r0, ._19 @ sub_80830E4\n\ - cmp r1, r0\n\ - bne ._17 @cond_branch\n\ - mov r0, #0x14\n\ - b ._30\n\ -._20:\n\ - .align 2, 0\n\ -._19:\n\ - .word sub_80830E4+1\n\ -._17:\n\ - ldr r0, ._23 @ sub_80831F8\n\ - cmp r1, r0\n\ - bne ._21 @cond_branch\n\ - mov r0, #0x21\n\ - b ._30\n\ -._24:\n\ - .align 2, 0\n\ -._23:\n\ - .word sub_80831F8+1\n\ -._21:\n\ - ldr r0, ._27 @ sub_8083314\n\ - cmp r1, r0\n\ - bne ._25 @cond_branch\n\ - mov r0, #0x2\n\ - b ._30\n\ -._28:\n\ - .align 2, 0\n\ -._27:\n\ - .word sub_8083314+1\n\ -._25:\n\ - ldr r0, ._31 @ sub_80833C4\n\ - cmp r1, r0\n\ - beq ._29 @cond_branch\n\ - mov r0, #0x0\n\ - b ._30\n\ -._32:\n\ - .align 2, 0\n\ -._31:\n\ - .word sub_80833C4+1\n\ -._29:\n\ - mov r0, #0x3\n\ -._30:\n\ - pop {r1}\n\ - bx r1"); +u8 debug_sub_808A4D0(TaskFunc func) +{ + if (func == sub_8082F68) + return 1; + if (func == sub_8082FEC) + return 17; + if (func == sub_808303C) + return 18; + if (func == sub_8083188) + return 19; + if (func == sub_80830E4) + return 20; + if (func == sub_80831F8) + return 33; + if (func == sub_8083314) + return 2; + if (func == sub_80833C4) + return 3; + return 0; } -__attribute__((naked)) -void debug_sub_808A55C() +void debug_sub_808A55C(u8 taskId) { - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - ldr r2, ._37 @ gTasks\n\ - lsl r0, r7, #0x2\n\ - add r0, r0, r7\n\ - lsl r0, r0, #0x3\n\ - add r4, r0, r2\n\ - mov r0, #0x8\n\ - ldsh r1, [r4, r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r2\n\ - ldrb r0, [r0, #0x4]\n\ - cmp r0, #0\n\ - bne ._33 @cond_branch\n\ - mov r1, #0xa\n\ - ldsh r0, [r4, r1]\n\ - cmp r0, #0x5\n\ - bne ._34 @cond_branch\n\ - add r0, r7, #0\n\ - bl DestroyTask\n\ -._34:\n\ - ldrh r0, [r4, #0xa]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4, #0xa]\n\ -._33:\n\ - ldr r0, ._37 + 4 @ gShouldAdvanceLinkState\n\ - ldrb r0, [r0]\n\ - mov r1, #0x2\n\ - mov r2, #0x0\n\ - mov r3, #0x2\n\ - bl PrintHex\n\ - ldr r0, ._37 + 8 @ gBlockSendBuffer\n\ - ldrb r0, [r0]\n\ - mov r1, #0x16\n\ - mov r2, #0x5\n\ - mov r3, #0x4\n\ - bl PrintHex\n\ - mov r4, #0x0\n\ - lsl r3, r7, #0x2\n\ - mov r8, r3\n\ - mov r6, #0xc0\n\ - lsl r6, r6, #0x13\n\ - mov r5, #0xa0\n\ - lsl r5, r5, #0x13\n\ -._35:\n\ - ldr r0, ._37 + 12 @ gLinkPlayerPending\n\ - add r0, r4, r0\n\ - ldrb r0, [r0]\n\ - lsr r1, r5, #0x18\n\ - mov r2, #0x0\n\ - mov r3, #0x1\n\ - bl PrintHex\n\ - ldr r1, ._37 + 16 @ gBlockRecvBuffer\n\ - lsl r0, r4, #0x8\n\ - add r0, r0, r1\n\ - ldrh r0, [r0]\n\ - lsr r2, r6, #0x18\n\ - mov r1, #0x16\n\ - mov r3, #0x4\n\ - bl PrintHex\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x11\n\ - add r6, r6, r0\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x12\n\ - add r5, r5, r1\n\ - add r4, r4, #0x1\n\ - cmp r4, #0x3\n\ - ble ._35 @cond_branch\n\ - ldr r4, ._37 + 20 @ gLinkStatus\n\ - ldr r0, [r4]\n\ - mov r1, #0xf\n\ - mov r2, #0x0\n\ - mov r3, #0x8\n\ - bl PrintHex\n\ - ldr r0, ._37 + 24 @ gLink\n\ - ldrb r0, [r0, #0x1]\n\ - mov r1, #0x2\n\ - mov r2, #0xa\n\ - mov r3, #0x2\n\ - bl PrintHex\n\ - bl GetMultiplayerId\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r1, #0x7\n\ - mov r2, #0xc\n\ - mov r3, #0x2\n\ - bl PrintHex\n\ - bl GetBlockReceivedStatus\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r1, #0x7\n\ - mov r2, #0xa\n\ - mov r3, #0x2\n\ - bl PrintHex\n\ - ldr r0, ._37 + 28 @ gReceivedRemoteLinkPlayers\n\ - ldrb r0, [r0]\n\ - mov r1, #0x2\n\ - mov r2, #0xc\n\ - mov r3, #0x1\n\ - bl PrintHex\n\ - ldr r0, ._37 + 32 @ gSpecialVar_Result\n\ - ldrh r0, [r0]\n\ - mov r1, #0xb\n\ - mov r2, #0x8\n\ - mov r3, #0x2\n\ - bl PrintHex\n\ - ldr r0, [r4]\n\ - mov r1, #0x1c\n\ - and r0, r0, r1\n\ - lsr r0, r0, #0x2\n\ - mov r1, #0xb\n\ - mov r2, #0xa\n\ - mov r3, #0x2\n\ - bl PrintHex\n\ - bl IsLinkConnectionEstablished\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r1, #0xb\n\ - mov r2, #0xc\n\ - mov r3, #0x1\n\ - bl PrintHex\n\ - bl IsLinkTaskFinished\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r1, #0xf\n\ - mov r2, #0xa\n\ - mov r3, #0x1\n\ - bl PrintHex\n\ - ldr r2, ._37 @ gTasks\n\ - mov r3, r8\n\ - add r0, r3, r7\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r2\n\ - mov r3, #0x8\n\ - ldsh r1, [r0, r3]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r2\n\ - ldr r0, [r0]\n\ - bl debug_sub_808A4D0\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r1, #0xf\n\ - mov r2, #0xc\n\ - mov r3, #0x2\n\ - bl PrintHex\n\ - ldr r0, ._37 + 36 @ gLinkCallback\n\ - ldr r0, [r0]\n\ - mov r1, #0x2\n\ - mov r2, #0xd\n\ - mov r3, #0x8\n\ - bl PrintHex\n\ - bl HasLinkErrorOccurred\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r1, #0x2\n\ - mov r2, #0x2\n\ - mov r3, #0x1\n\ - bl PrintHex\n\ - ldr r0, ._37 + 40 @ gLinkPlayers\n\ - mov r6, #0x80\n\ - lsl r6, r6, #0x12\n\ - add r5, r0, #0\n\ - add r5, r5, #0x14\n\ - mov r4, #0x3\n\ -._36:\n\ - ldr r0, [r5]\n\ - lsr r1, r6, #0x18\n\ - mov r2, #0x3\n\ - mov r3, #0x4\n\ - bl PrintHex\n\ - mov r0, #0xc0\n\ - lsl r0, r0, #0x13\n\ - add r6, r6, r0\n\ - add r5, r5, #0x1c\n\ - sub r4, r4, #0x1\n\ - cmp r4, #0\n\ - bge ._36 @cond_branch\n\ - ldr r0, ._37 + 44 @ 0x4000128\n\ - ldrh r0, [r0]\n\ - mov r1, #0x2\n\ - mov r2, #0x6\n\ - mov r3, #0x4\n\ - bl PrintHex\n\ - bl debug_sub_808B850\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - mov r1, #0x19\n\ - mov r2, #0x3\n\ - mov r3, #0x1\n\ - bl PrintHex\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._38:\n\ - .align 2, 0\n\ -._37:\n\ - .word gTasks\n\ - .word gShouldAdvanceLinkState\n\ - .word gBlockSendBuffer\n\ - .word gLinkPlayerPending\n\ - .word gBlockRecvBuffer\n\ - .word gLinkStatus\n\ - .word gLink\n\ - .word gReceivedRemoteLinkPlayers\n\ - .word gSpecialVar_Result\n\ - .word gLinkCallback\n\ - .word gLinkPlayers\n\ - .word 0x4000128"); + s32 i; + + if (!gTasks[gTasks[taskId].data[0]].isActive) + { + if (gTasks[taskId].data[1] == 5) + DestroyTask(taskId); + gTasks[taskId].data[1]++; + } + + PrintHex(gShouldAdvanceLinkState, 2, 0, 2); + PrintHex((u8)gBlockSendBuffer[0], 22, 5, 4); + for (i = 0; i < 4; i++) + { + PrintHex(gLinkPlayerPending[i], 5 + i * 2, 0, 1); + PrintHex(gBlockRecvBuffer[i][0], 22, 6 + i, 4); + } + PrintHex(gLinkStatus, 15, 0, 8); + PrintHex(gLink.state, 2, 10, 2); + PrintHex(GetMultiplayerId(), 7, 12, 2); + PrintHex(GetBlockReceivedStatus(), 7, 10, 2); + PrintHex(gReceivedRemoteLinkPlayers, 2, 12, 1); + PrintHex(gSpecialVar_Result, 11, 8, 2); + PrintHex((gLinkStatus & 0x1C) >> 2, 11, 10, 2); + PrintHex(IsLinkConnectionEstablished(), 11, 12, 1); + PrintHex(IsLinkTaskFinished(), 15, 10, 1); + PrintHex(debug_sub_808A4D0(gTasks[gTasks[taskId].data[0]].func), 15, 12, 2); + PrintHex((uintptr_t)gLinkCallback, 2, 13, 8); + PrintHex(HasLinkErrorOccurred(), 2, 2, 1); + for (i = 0; i < 4; i++) + PrintHex(gLinkPlayers[i].linkType, 2 + i * 6, 3, 4); + PrintHex(REG_SIOCNT, 2, 6, 4); + PrintHex(debug_sub_808B850(), 25, 3, 1); } #endif -#if DEBUG -__attribute__((naked)) -static void sub_8082CD4(u8 arg0, u8 arg1) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - lsl r1, r1, #0x18\n\ - lsr r6, r1, #0x18\n\ - mov r0, #0xc\n\ - mov r1, #0x0\n\ - mov r2, #0x1f\n\ - mov r3, #0x2\n\ - bl InitLinkTestBG_Unused\n\ - ldr r4, ._40 @ sub_8082F20\n\ - add r0, r4, #0\n\ - bl FindTaskIdByFunc\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0xff\n\ - bne ._39 @cond_branch\n\ - add r0, r4, #0\n\ - mov r1, #0x50\n\ - bl CreateTask\n\ - add r4, r0, #0\n\ - lsl r4, r4, #0x18\n\ - lsr r4, r4, #0x18\n\ - ldr r5, ._40 + 4 @ gTasks\n\ - lsl r0, r4, #0x2\n\ - add r0, r0, r4\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r5\n\ - strh r7, [r0, #0xa]\n\ - strh r6, [r0, #0xc]\n\ - ldr r0, ._40 + 8 @ debug_sub_808A55C\n\ - mov r1, #0x50\n\ - bl CreateTask\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - lsl r1, r0, #0x2\n\ - add r1, r1, r0\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r5\n\ - strh r4, [r1, #0x8]\n\ -._39:\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._41:\n\ - .align 2, 0\n\ -._40:\n\ - .word sub_8082F20+1\n\ - .word gTasks\n\ - .word debug_sub_808A55C+1"); -} -#else static void sub_8082CD4(u8 arg0, u8 arg1) { +#if DEBUG + InitLinkTestBG_Unused(12, 0, 31, 2); +#endif if (FindTaskIdByFunc(sub_8082F20) == 0xFF) { - u8 taskId = CreateTask(sub_8082F20, 80); + u8 taskId1; +#if DEBUG + u8 taskId2; +#endif + + taskId1 = CreateTask(sub_8082F20, 80); + gTasks[taskId1].data[1] = arg0; + gTasks[taskId1].data[2] = arg1; - gTasks[taskId].data[1] = arg0; - gTasks[taskId].data[2] = arg1; +#if DEBUG + taskId2 = CreateTask(debug_sub_808A55C, 80); + gTasks[taskId2].data[0] = taskId1; +#endif } } -#endif static void sub_8082D18(u32 value) { @@ -727,7 +411,7 @@ static void sub_8083188(u8 taskId) } } -void sub_80831F8(u8 taskId) +static void sub_80831F8(u8 taskId) { u8 local1, local2; @@ -1291,70 +975,26 @@ void sub_8083C50(u8 taskId) } #if DEBUG +extern u16 unk_3004E94; +extern u32 unk_3004E98; + +static void debug_sub_808B7A8(u8); -__attribute__((naked)) -void debug_sub_808B778() +void debug_sub_808B778(void) { - asm("\ - push {r4, lr}\n\ - ldr r4, ._390 @ debug_sub_808B7A8\n\ - add r0, r4, #0\n\ - bl FuncIsActiveTask\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._389 @cond_branch\n\ - add r0, r4, #0\n\ - mov r1, #0x50\n\ - bl CreateTask\n\ -._389:\n\ - ldr r1, ._390 + 4 @ unk_3004E98\n\ - ldr r0, [r1]\n\ - add r0, r0, #0x1\n\ - str r0, [r1]\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._391:\n\ - .align 2, 0\n\ -._390:\n\ - .word debug_sub_808B7A8+1\n\ - .word unk_3004E98"); + if (!FuncIsActiveTask(debug_sub_808B7A8)) + CreateTask(debug_sub_808B7A8, 80); + unk_3004E98++; } -__attribute__((naked)) -void debug_sub_808B7A8() +static void debug_sub_808B7A8(u8 taskId) { - asm("\ - push {lr}\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r2, ._393 @ gTasks\n\ - lsl r1, r0, #0x2\n\ - add r1, r1, r0\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r2\n\ - ldrh r0, [r1, #0x8]\n\ - add r0, r0, #0x1\n\ - strh r0, [r1, #0x8]\n\ - lsl r0, r0, #0x10\n\ - asr r0, r0, #0x10\n\ - cmp r0, #0x1e\n\ - bne ._392 @cond_branch\n\ - mov r0, #0x0\n\ - strh r0, [r1, #0x8]\n\ - ldr r2, ._393 + 4 @ unk_3004E94\n\ - ldrh r0, [r2]\n\ - mov r1, #0x1\n\ - orr r0, r0, r1\n\ - strh r0, [r2]\n\ -._392:\n\ - pop {r0}\n\ - bx r0\n\ -._394:\n\ - .align 2, 0\n\ -._393:\n\ - .word gTasks\n\ - .word unk_3004E94"); + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] == 30) + { + gTasks[taskId].data[0] = 0; + unk_3004E94 |= 1; + } } #endif @@ -1374,6 +1014,7 @@ void unref_sub_8083CC8(u8 taskId) } #if DEBUG +EWRAM_DATA static u8 unk_2030220 = 0; void debug_sub_808B82C(void) { @@ -1385,9 +1026,8 @@ void debug_sub_808B838(u8 a) unk_2030220 |= 1 << a; } -int debug_sub_808B850(void) +static u8 debug_sub_808B850(void) { return unk_2030220; } - -#endif \ No newline at end of file +#endif diff --git a/src/engine/link.c b/src/engine/link.c index 00c084069..70c2b85cc 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -45,7 +45,6 @@ extern u16 word_3004858; extern void Blender_SetBankBerryData(u8 bank, u16 itemID); static void InitLinkTestBG(u8, u8, u8, u8); -void InitLinkTestBG_Unused(u8, u8, u8, u8); void LinkTestScreen(); static void InitLocalLinkPlayer(void); static void VBlankCB_LinkTest(void); @@ -68,7 +67,6 @@ u32 sub_8007E40(void); static void SetBlockReceivedFlag(u8); static u16 LinkTestCalcBlockChecksum(void *, u16); static void PrintHexDigit(u8, u8, u8); -void PrintHex(u32, u8, u8, u8); static void LinkCB_RequestPlayerDataExchange(void); static void Task_PrintTestData(u8); bool8 sub_8008224(void); -- cgit v1.2.3 From 4ddd59b4cae97d152b08c49516641fb176095882 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Tue, 6 Feb 2018 21:35:53 -0600 Subject: fix build --- src/engine/cable_club.c | 2 +- src/field/overworld.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c index 0cb148d73..0da23c5f3 100644 --- a/src/engine/cable_club.c +++ b/src/engine/cable_club.c @@ -269,7 +269,7 @@ void unref_sub_8082EEC(u8 taskId) } } -/*static*/ void sub_8082F20(u8 taskId) +static void sub_8082F20(u8 taskId) { s16 *data = gTasks[taskId].data; diff --git a/src/field/overworld.c b/src/field/overworld.c index 07135080e..14d3101a9 100644 --- a/src/field/overworld.c +++ b/src/field/overworld.c @@ -2235,7 +2235,7 @@ u16 sub_80554E4(u32 a1) return 23; } -u32 sub_80554F8(void) +s32 sub_80554F8(void) { if (sub_8054FC0(0x83) == TRUE) return 2; -- cgit v1.2.3 From 843c7016bbfe4c3a0d93a74b17ec43da98f49b2d Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Tue, 6 Feb 2018 22:41:43 -0600 Subject: decompile debug code in reset_rtc_screen.c --- src/engine/reset_rtc_screen.c | 398 ++++++++++-------------------------------- 1 file changed, 89 insertions(+), 309 deletions(-) (limited to 'src') diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index 8b67f39a5..8c2c23569 100644 --- a/src/engine/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c @@ -5,6 +5,7 @@ #include "palette.h" #include "rtc.h" #include "save.h" +#include "script.h" #include "sprite.h" #include "constants/songs.h" #include "sound.h" @@ -147,13 +148,6 @@ const struct SpriteTemplate gSpriteTemplate_83764E8 = const u8 gUnknown_08376500[] = _(" : "); -#if DEBUG -const u8 gUnknown_Debug_0839AE94[] = _("にっすう"); -const u8 gUnknown_Debug_0839AE99[] = _("じかん"); -const u8 gUnknown_Debug_0839AE9D[] = _("ゲームない じかん"); -const u8 gUnknown_Debug_0839AEA7[] = _("RTC じかん"); -#endif - void SpriteCB_ResetRtcCusor0(struct Sprite *sprite) { int state = gTasks[sprite->data[0]].data[2]; @@ -576,6 +570,7 @@ void Task_ResetRtcScreen(u8 taskId) PlaySE(SE_BOO); } data[0] = 5; + // fall through case 5: if (gMain.newKeys & A_BUTTON) { @@ -586,6 +581,7 @@ void Task_ResetRtcScreen(u8 taskId) { break; } + // fall through case 6: if (!gPaletteFade.active) { @@ -596,317 +592,101 @@ void Task_ResetRtcScreen(u8 taskId) } #if DEBUG - -__attribute__((naked)) void debug_sub_806F8F8(void) { - asm("\ - push {lr}\n\ - ldr r0, ._131 @ CB2_InitResetRtcScreen\n\ - bl SetMainCallback2\n\ - pop {r0}\n\ - bx r0\n\ -._132:\n\ - .align 2, 0\n\ -._131:\n\ - .word CB2_InitResetRtcScreen+1"); + SetMainCallback2(CB2_InitResetRtcScreen); } -__attribute__((naked)) -void debug_sub_806F908(u8 a) -{ - asm("\ - push {r4, r5, lr}\n\ - lsl r0, r0, #0x18\n\ - lsr r5, r0, #0x18\n\ - lsl r0, r5, #0x2\n\ - add r0, r0, r5\n\ - lsl r0, r0, #0x3\n\ - ldr r2, ._136 @ gTasks\n\ - add r4, r0, r2\n\ - mov r1, #0x0\n\ - ldsh r0, [r4, r1]\n\ - cmp r0, #0\n\ - beq ._133 @cond_branch\n\ - cmp r0, #0x1\n\ - beq ._134 @cond_branch\n\ - b ._141\n\ -._137:\n\ - .align 2, 0\n\ -._136:\n\ - .word gTasks+0x8\n\ -._133:\n\ - ldr r0, ._139 @ Task_ResetRtc_0\n\ - mov r1, #0x50\n\ - bl CreateTask\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - strh r0, [r4, #0x2]\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4]\n\ - b ._141\n\ -._140:\n\ - .align 2, 0\n\ -._139:\n\ - .word Task_ResetRtc_0+1\n\ -._134:\n\ - sub r2, r2, #0x8\n\ - mov r0, #0x2\n\ - ldsh r1, [r4, r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x3\n\ - add r2, r0, r2\n\ - mov r1, #0x8\n\ - ldsh r0, [r2, r1]\n\ - cmp r0, #0\n\ - beq ._141 @cond_branch\n\ - mov r1, #0xa\n\ - ldsh r0, [r2, r1]\n\ - cmp r0, #0x1\n\ - bne ._142 @cond_branch\n\ - ldr r3, ._143 @ gLocalTime\n\ - mov r1, #0x0\n\ - ldsh r0, [r3, r1]\n\ - mov r1, #0x2\n\ - ldsb r1, [r3, r1]\n\ - mov r2, #0x3\n\ - ldsb r2, [r3, r2]\n\ - ldrb r3, [r3, #0x4]\n\ - lsl r3, r3, #0x18\n\ - asr r3, r3, #0x18\n\ - bl RtcCalcLocalTimeOffset\n\ -._142:\n\ - ldrb r0, [r4, #0x2]\n\ - bl DestroyTask\n\ - bl Menu_EraseScreen\n\ - bl ScriptContext2_Disable\n\ - add r0, r5, #0\n\ - bl DestroyTask\n\ -._141:\n\ - pop {r4, r5}\n\ - pop {r0}\n\ - bx r0\n\ -._144:\n\ - .align 2, 0\n\ -._143:\n\ - .word gLocalTime"); -} +void debug_sub_806F908(u8 taskId) +{ + s16 *data = gTasks[taskId].data; -__attribute__((naked)) -void debug_sub_806F99C() -{ - asm("\ - push {lr}\n\ - bl RtcCalcLocalTime\n\ - ldr r0, ._145 @ debug_sub_806F908\n\ - mov r1, #0x50\n\ - bl CreateTask\n\ - bl ScriptContext2_Enable\n\ - pop {r0}\n\ - bx r0\n\ -._146:\n\ - .align 2, 0\n\ -._145:\n\ - .word debug_sub_806F908+1"); + switch (data[0]) + { + case 0: + data[1] = CreateTask(Task_ResetRtc_0, 80); + data[0]++; + break; + case 1: + if (gTasks[data[1]].data[0] != 0) + { + if (gTasks[data[1]].data[1] == 1) + RtcCalcLocalTimeOffset(gLocalTime.days, gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds); + DestroyTask(data[1]); + Menu_EraseScreen(); + ScriptContext2_Disable(); + DestroyTask(taskId); + } + break; + } } -__attribute__((naked)) -void debug_sub_806F9B8() -{ - asm("\ - push {lr}\n\ - ldr r2, ._147 @ gLocalTime\n\ - ldr r0, ._147 + 4 @ gSaveBlock2\n\ - add r0, r0, #0xa0\n\ - ldr r1, [r0, #0x4]\n\ - ldr r0, [r0]\n\ - str r0, [r2]\n\ - str r1, [r2, #0x4]\n\ - ldr r0, ._147 + 8 @ debug_sub_806F908\n\ - mov r1, #0x50\n\ - bl CreateTask\n\ - bl ScriptContext2_Enable\n\ - pop {r0}\n\ - bx r0\n\ -._148:\n\ - .align 2, 0\n\ -._147:\n\ - .word gLocalTime\n\ - .word gSaveBlock2\n\ - .word debug_sub_806F908+1"); +void debug_sub_806F99C(void) +{ + RtcCalcLocalTime(); + CreateTask(debug_sub_806F908, 80); + ScriptContext2_Enable(); } -__attribute__((naked)) -void debug_sub_806F9E4() -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - lsl r0, r7, #0x2\n\ - add r0, r0, r7\n\ - lsl r0, r0, #0x3\n\ - ldr r1, ._153 @ gTasks\n\ - add r5, r0, r1\n\ - ldr r6, ._153 + 4 @ gStringVar4\n\ - mov r1, #0x0\n\ - ldsh r0, [r5, r1]\n\ - cmp r0, #0x1\n\ - beq ._149 @cond_branch\n\ - cmp r0, #0x1\n\ - bgt ._150 @cond_branch\n\ - cmp r0, #0\n\ - beq ._151 @cond_branch\n\ - b ._165\n\ -._154:\n\ - .align 2, 0\n\ -._153:\n\ - .word gTasks+0x8\n\ - .word gStringVar4\n\ -._150:\n\ - cmp r0, #0x2\n\ - beq ._155 @cond_branch\n\ - b ._165\n\ -._149:\n\ - mov r0, #0x0\n\ - mov r1, #0x9\n\ - mov r2, #0x1d\n\ - mov r3, #0x13\n\ - bl Menu_DrawStdWindowFrame\n\ - add r4, r6, #0\n\ - add r4, r4, #0x50\n\ - bl RtcGetErrorStatus\n\ - add r1, r0, #0\n\ - lsl r1, r1, #0x10\n\ - lsr r1, r1, #0x10\n\ - add r0, r4, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x4\n\ - bl ConvertIntToHexStringN\n\ - add r0, r4, #0\n\ - mov r1, #0x2\n\ - mov r2, #0xa\n\ - bl Menu_PrintText\n\ - ldr r0, ._158 @ gUnknown_Debug_0839AE94\n\ - mov r1, #0xc\n\ - mov r2, #0xc\n\ - bl Menu_PrintText\n\ - ldr r0, ._158 + 4 @ gUnknown_Debug_0839AE99\n\ - mov r1, #0x14\n\ - mov r2, #0xc\n\ - bl Menu_PrintText\n\ - ldr r0, ._158 + 8 @ gUnknown_Debug_0839AEA7\n\ - mov r1, #0x1\n\ - mov r2, #0xe\n\ - bl Menu_PrintText\n\ - ldr r0, ._158 + 12 @ gUnknown_Debug_0839AE9D\n\ - mov r1, #0x1\n\ - mov r2, #0x10\n\ - bl Menu_PrintText\n\ -._151:\n\ - ldrh r0, [r5]\n\ - add r0, r0, #0x1\n\ - strh r0, [r5]\n\ - b ._165\n\ -._159:\n\ - .align 2, 0\n\ -._158:\n\ - .word gUnknown_Debug_0839AE94\n\ - .word gUnknown_Debug_0839AE99\n\ - .word gUnknown_Debug_0839AEA7\n\ - .word gUnknown_Debug_0839AE9D\n\ -._155:\n\ - bl RtcCalcLocalTime\n\ - add r0, r6, #0\n\ - bl FormatHexRtcTime\n\ - mov r2, #0x14\n\ - add r2, r2, r6\n\ - mov r9, r2\n\ - mov r0, r9\n\ - bl debug_sub_8009894\n\ - mov r0, #0x28\n\ - add r0, r0, r6\n\ - mov sl, r0\n\ - ldr r4, ._163 @ gLocalTime\n\ - mov r1, #0x2\n\ - ldsb r1, [r4, r1]\n\ - mov r2, #0x3\n\ - ldsb r2, [r4, r2]\n\ - mov r3, #0x4\n\ - ldsb r3, [r4, r3]\n\ - bl FormatDecimalTime\n\ - mov r1, #0x3c\n\ - add r1, r1, r6\n\ - mov r8, r1\n\ - mov r2, #0x0\n\ - ldsh r1, [r4, r2]\n\ - mov r0, r8\n\ - mov r2, #0x1\n\ - mov r3, #0x4\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r0, ._163 + 4 @ gSaveBlock2\n\ - ldrb r0, [r0, #0x12]\n\ - cmp r0, #0\n\ - bne ._160 @cond_branch\n\ - add r0, r6, #0\n\ - mov r1, #0x14\n\ - mov r2, #0xe\n\ - bl Menu_PrintText\n\ - mov r0, r9\n\ - mov r1, #0xc\n\ - mov r2, #0xe\n\ - bl Menu_PrintText\n\ - mov r0, sl\n\ - mov r1, #0x14\n\ - mov r2, #0x10\n\ - bl Menu_PrintText\n\ - mov r0, r8\n\ - mov r1, #0xc\n\ - mov r2, #0x10\n\ - bl Menu_PrintText\n\ -._160:\n\ - ldrh r1, [r5, #0x2]\n\ - mov r2, #0x2\n\ - ldsh r0, [r5, r2]\n\ - cmp r0, #0x13\n\ - ble ._161 @cond_branch\n\ - add r0, r1, #1\n\ - strh r0, [r5, #0x2]\n\ - b ._165\n\ -._164:\n\ - .align 2, 0\n\ -._163:\n\ - .word gLocalTime\n\ - .word gSaveBlock2\n\ -._161:\n\ - ldr r0, ._166 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._165 @cond_branch\n\ - bl Menu_EraseScreen\n\ - add r0, r7, #0\n\ - bl DestroyTask\n\ - bl ScriptContext2_Disable\n\ -._165:\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._167:\n\ - .align 2, 0\n\ -._166:\n\ - .word gMain"); +void debug_sub_806F9B8(void) +{ + gLocalTime = gSaveBlock2.lastBerryTreeUpdate; + CreateTask(debug_sub_806F908, 80); + ScriptContext2_Enable(); } +static const u8 sDebugText_Days[] = _("にっすう"); // "days" +static const u8 sDebugText_Time[] = _("じかん"); // "time" +static const u8 sDebugText_GameTime[] = _("ゲームない じかん"); // "game time" +static const u8 sDebugText_RTCTime[] = _("RTC じかん"); // "RTC time" + +void debug_sub_806F9E4(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u8 *str = gStringVar4; + + switch (data[0]) + { + case 0: + data[0]++; + break; + case 1: + Menu_DrawStdWindowFrame(0, 9, 29, 19); + ConvertIntToHexStringN(str + 80, RtcGetErrorStatus(), 2, 4); + Menu_PrintText(str + 80, 2, 10); + Menu_PrintText(sDebugText_Days, 12, 12); + Menu_PrintText(sDebugText_Time, 20, 12); + Menu_PrintText(sDebugText_RTCTime, 1, 14); + Menu_PrintText(sDebugText_GameTime, 1, 16); + data[0]++; + break; + case 2: + RtcCalcLocalTime(); + FormatHexRtcTime(str); + debug_sub_8009894(str + 20); + FormatDecimalTime(str + 40, gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds); + ConvertIntToDecimalStringN(str + 60, gLocalTime.days, 1, 4); + if (gSaveBlock2.playTimeVBlanks == 0) + { + Menu_PrintText(str, 20, 14); + Menu_PrintText(str + 20, 12, 14); + Menu_PrintText(str + 40, 20, 16); + Menu_PrintText(str + 60, 12, 16); + } + if (data[1] > 19) // Did you mean < 19? + { + data[1]++; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + Menu_EraseScreen(); + DestroyTask(taskId); + ScriptContext2_Disable(); + } + } + break; + } +} #endif \ No newline at end of file -- cgit v1.2.3 From fbf34c79f3a9a290cdaae612d589a1b48411e41f Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Tue, 6 Feb 2018 21:30:46 -0800 Subject: Finish decompiling fight.s --- src/battle/anim/fight.c | 364 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 358 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c index fcce044ae..b20813fcb 100644 --- a/src/battle/anim/fight.c +++ b/src/battle/anim/fight.c @@ -1,18 +1,14 @@ #include "global.h" #include "battle_anim.h" -#include "blend_palette.h" -#include "decompress.h" -#include "ewram.h" -#include "palette.h" #include "random.h" #include "rom_8077ABC.h" -#include "scanline_effect.h" -#include "sound.h" #include "sprite.h" +#include "task.h" #include "trig.h" #include "constants/battle_constants.h" extern s16 gBattleAnimArgs[]; +extern u8 gBankAttacker; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; extern u8 gObjectBankIDs[]; @@ -21,6 +17,8 @@ extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; extern u16 gBattle_BG2_Y; +extern u16 gBattle_BG3_X; +extern u16 gBattle_BG3_Y; extern u16 gBattle_WIN0H; extern u16 gBattle_WIN0V; extern u16 gBattlePartyID[]; @@ -34,6 +32,12 @@ static void sub_80D9404(struct Sprite *sprite); static void sub_80D9474(struct Sprite *sprite); static void sub_80D94CC(struct Sprite *sprite); static void sub_80D9524(struct Sprite *sprite); +static void sub_80D9640(struct Sprite *sprite); +static void sub_80D97A0(struct Sprite *sprite); +static void sub_80D986C(struct Sprite *sprite); +static void sub_80D9934(struct Sprite *sprite); +static void sub_80D99F4(struct Sprite *sprite); + void sub_080B08A0(struct Sprite *sprite) { @@ -293,3 +297,351 @@ void sub_80D9540(struct Sprite *sprite) DestroyAnimSprite(sprite); } } + +void sub_80D95D0(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1); + } + else + { + sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0); + sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1); + } + + sprite->pos1.x += gBattleAnimArgs[1]; + sprite->pos1.y += gBattleAnimArgs[2]; + + sprite->data[0] = 0; + sprite->data[1] = gBattleAnimArgs[3]; + sprite->data[2] = gBattleAnimArgs[4]; + sprite->data[3] = 0; + sprite->callback = sub_80D9640; +} + +static void sub_80D9640(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (--sprite->data[1] == 0) + { + if (sprite->data[2] == 0) + DestroyAnimSprite(sprite); + else + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 1) + { + sprite->data[1] = 0; + sprite->data[3]++; + if (sprite->data[3] & 1) + sprite->pos2.x = 2; + else + sprite->pos2.x = -2; + } + + if (--sprite->data[2] == 0) + DestroyAnimSprite(sprite); + break; + } +} + +void sub_80D96B8(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[2]; + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[3]; + } + else + { + sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0) + gBattleAnimArgs[2]; + sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1) + gBattleAnimArgs[3]; + } + + sprite->oam.tileNum += gBattleAnimArgs[1] * 16; + sprite->data[0] = 0; + + switch (gBattleAnimArgs[1]) + { + case 0: + sprite->data[6] = -3; + sprite->data[7] = -3; + break; + case 1: + sprite->data[6] = 3; + sprite->data[7] = -3; + break; + case 2: + sprite->data[6] = -3; + sprite->data[7] = 3; + break; + case 3: + sprite->data[6] = 3; + sprite->data[7] = 3; + break; + default: + DestroyAnimSprite(sprite); + return; + } + + sprite->callback = sub_80D97A0; +} + +static void sub_80D97A0(struct Sprite *sprite) +{ + sprite->pos1.x += sprite->data[6]; + sprite->pos1.y += sprite->data[7]; + + if (++sprite->data[0] > 40) + DestroyAnimSprite(sprite); +} + +void sub_80D97CC(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gBankAttacker, 3); + sprite->oam.priority = sub_8079ED4(gAnimBankAttacker); + sprite->data[7] = gAnimBankTarget; + } + else + { + sprite->oam.priority = sub_8079ED4(gAnimBankTarget); + sprite->data[7] = gAnimBankAttacker; + } + + sprite->data[0] = 0; + sprite->data[1] = 12; + sprite->data[2] = 8; + sprite->callback = sub_80D986C; +} + +static void sub_80D986C(struct Sprite *sprite) +{ + if (++sprite->data[0] == 180) + { + REG_BLDCNT = 0; + + sprite->data[0] = 16; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBankPosition(sprite->data[7], 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBankPosition(sprite->data[7], 3); + + obj_translate_based_on_private_1_2_3_4(sprite); + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); + sprite->callback = sub_8078BB8; + } +} + +void sub_80D98D8(struct Sprite *sprite) +{ + sprite->pos1.x = gBattleAnimArgs[0]; + sprite->pos1.y = 120; + + sprite->data[0] = gBattleAnimArgs[3]; + sub_8079BF4(&sprite->data[4], &sprite->data[5], (void *)(sprite->pos1.y << 8)); + + sprite->data[6] = gBattleAnimArgs[1]; + sprite->oam.tileNum += gBattleAnimArgs[2] * 4; + + sprite->callback = sub_80D9934; +} + +static void sub_80D9934(struct Sprite *sprite) +{ + void *var0; + + if (sprite->data[0] != 0) + { + var0 = sub_8079BFC(sprite->data[4], sprite->data[5]); + var0 -= sprite->data[6]; + sub_8079BF4(&sprite->data[4], &sprite->data[5], var0); + + var0 = (void *)(((intptr_t)var0) >> 8); + sprite->pos1.y = (intptr_t)var0; + if (sprite->pos1.y < -8) + DestroyAnimSprite(sprite); + else + sprite->data[0]--; + } + else + { + s16 pos0 = GetBankPosition(gAnimBankAttacker, 2); + s16 pos1 = GetBankPosition(gAnimBankAttacker, 3); + s16 pos2 = GetBankPosition(gAnimBankTarget, 2); + s16 pos3 = GetBankPosition(gAnimBankTarget, 3); + + sprite->data[0] = pos2 - pos0; + sprite->data[1] = pos3 - pos1; + sprite->data[2] = sprite->pos1.x << 4; + sprite->data[3] = sprite->pos1.y << 4; + + sprite->callback = sub_80D99F4; + } +} + +static void sub_80D99F4(struct Sprite *sprite) +{ + u16 edgeX; + + sprite->data[2] += sprite->data[0]; + sprite->data[3] += sprite->data[1]; + sprite->pos1.x = sprite->data[2] >> 4; + sprite->pos1.y = sprite->data[3] >> 4; + + edgeX = sprite->pos1.x + 8; + if (edgeX > 256 || sprite->pos1.y < -8 || sprite->pos1.y > 120) + DestroyAnimSprite(sprite); +} + +void sub_80D9A38(struct Sprite *sprite) +{ + u8 bank; + + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gBankAttacker, 3); + bank = gAnimBankTarget; + sprite->oam.priority = sub_8079ED4(gAnimBankAttacker); + } + else + { + bank = gAnimBankAttacker; + sprite->oam.priority = sub_8079ED4(gAnimBankTarget); + } + + if (IsContest()) + sprite->oam.matrixNum |= 0x8; + else if (GetBankSide(bank) == SIDE_PLAYER) + sprite->oam.matrixNum |= 0x18; + + sprite->data[0] = 16; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBankPosition(bank, 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBankPosition(bank, 3); + + obj_translate_based_on_private_1_2_3_4(sprite); + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); + sprite->callback = sub_8078BB8; +} + +static void sub_80D9B24(struct Sprite *sprite) +{ + if (sprite->data[0] == sprite->data[4]) + DestroyAnimSprite(sprite); + + sprite->data[0]++; +} + +void sub_80D9B48(struct Sprite *sprite) +{ + u8 turn; + + sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2); + sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3); + sprite->data[1] = gBattleAnimArgs[3]; + sprite->data[2] = gBattleAnimArgs[0]; + sprite->data[3] = gBattleAnimArgs[1]; + sprite->data[4] = gBattleAnimArgs[2]; + + turn = gAnimMoveTurn; + if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) + turn++; + + if (turn & 1) + { + sprite->data[2] = -sprite->data[2]; + sprite->data[1]++; + } + + StartSpriteAnim(sprite, sprite->data[1]); + sprite->pos2.x = sprite->data[2]; + sprite->pos2.y = sprite->data[3]; + sprite->callback = sub_80D9B24; +} + +void sub_80D9BD4(struct Sprite *sprite) +{ + if (gBattleAnimArgs[2] == 0) + sub_80787B0(sprite, 0); + else + sub_8078764(sprite, 0); + + if (IsContest()) + { + StartSpriteAnim(sprite, 2); + } + else if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + { + StartSpriteAnim(sprite, 1); + } + + sprite->callback = sub_8078600; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80D9C40(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + sprite->data[1] = (sprite->data[1] + 40) & 0xFF; + sprite->pos2.x = Sin(sprite->data[1], 2); + + if (++sprite->data[0] > 40) + { + DestroyAnimSprite(sprite); + } + } +} + +void sub_80D9C80(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + sub_80789D4(0); + task->data[8] = gBattleAnimArgs[0]; + task->data[0]++; + break; + case 1: + if (--task->data[8] == -1) + task->data[0]++; + break; + case 2: + default: + task->data[9] += 1280; + break; + } + + task->data[10] += 2816; + + if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) + gBattle_BG3_X += task->data[9] >> 8; + else + gBattle_BG3_X -= task->data[9] >> 8; + + gBattle_BG3_Y += task->data[10] >> 8; + + task->data[9] &= 0xFF; + task->data[10] &= 0xFF; + + if (gBattleAnimArgs[7] == -1) + { + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + sub_80789D4(1); + DestroyAnimVisualTask(taskId); + } +} -- cgit v1.2.3 From 421917f49866a132a22f354bd25b6a4122508555 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 7 Feb 2018 01:12:06 -0500 Subject: resolve debug differences in sub_8118F8C --- src/roulette.c | 151 +++++---------------------------------------------------- 1 file changed, 12 insertions(+), 139 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index bff6cfc03..f447cb05e 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -3330,144 +3330,13 @@ void sub_8118DE4(struct Sprite *sprite) } } -#if DEBUG -__attribute__((naked)) -void sub_8118F8C(struct Sprite *sprite) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6, r7}\n\ - add r6, r0, #0\n\ - bl sub_8118724\n\ - ldr r5, ._868 @ 0x2019000\n\ - mov r0, #0x8c\n\ - add r0, r0, r5\n\ - mov r8, r0\n\ - ldr r0, [r0]\n\ - ldr r1, ._868 + 4 @ 0x3f000000\n\ - bl __gtsf2\n\ - cmp r0, #0\n\ - bgt ._874 @cond_branch\n\ - add r0, r6, #0\n\ - bl sub_81186B8\n\ - add r0, r6, #0\n\ - bl sub_81186E8\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - bne ._864 @cond_branch\n\ - add r1, r5, #0\n\ - add r1, r1, #0x90\n\ - ldr r0, ._868 + 8 @ 0x0\n\ - str r0, [r1]\n\ - ldr r1, ._868 + 12 @ gUnknown_083F8DF4\n\ - mov r9, r1\n\ - ldrb r0, [r5, #0x4]\n\ - lsl r7, r0, #0x1e\n\ - lsr r0, r7, #0x19\n\ - add r0, r0, r9\n\ - mov r4, #0x3\n\ - ldsb r4, [r0, r4]\n\ - add r0, r4, #0\n\ - bl __floatsisf\n\ - add r5, r0, #0\n\ - cmp r4, #0\n\ - bge ._865 @cond_branch\n\ - ldr r1, ._868 + 16 @ 0x43800000\n\ - bl __addsf3\n\ - add r5, r0, #0\n\ -._865:\n\ - lsr r0, r7, #0x19\n\ - add r0, r0, r9\n\ - ldrb r0, [r0, #0x4]\n\ - add r0, r0, #0x1\n\ - bl __floatsisf\n\ - add r1, r0, #0\n\ - add r0, r5, #0\n\ - bl __divsf3\n\ - add r1, r0, #0\n\ - mov r2, r8\n\ - ldr r0, [r2]\n\ - bl __subsf3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - mov r0, #0x4\n\ - strh r0, [r6, #0x30]\n\ - ldr r0, ._868 + 20 @ unk_2039560\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._866 @cond_branch\n\ - ldr r0, ._868 + 24 @ debug_sub_812E698\n\ - str r0, [r6, #0x1c]\n\ - b ._874\n\ -._869:\n\ - .align 2, 0\n\ -._868:\n\ - .word 0x2019000\n\ - .word 0x3f000000\n\ - .word 0x0\n\ - .word gUnknown_083F8DF4\n\ - .word 0x43800000\n\ - .word unk_2039560\n\ - .word debug_sub_812E698+1\n\ -._866:\n\ - ldr r0, ._871 @ sub_8118DE4\n\ - str r0, [r6, #0x1c]\n\ - b ._874\n\ -._872:\n\ - .align 2, 0\n\ -._871:\n\ - .word sub_8118DE4+1\n\ -._864:\n\ - add r6, r5, #0\n\ - add r6, r6, #0x90\n\ - ldr r0, [r6]\n\ - ldr r4, ._875 @ 0x0\n\ - add r1, r4, #0\n\ - bl __nesf2\n\ - cmp r0, #0\n\ - beq ._874 @cond_branch\n\ - mov r2, r8\n\ - ldr r0, [r2]\n\ - add r1, r4, #0\n\ - bl __ltsf2\n\ - cmp r0, #0\n\ - bge ._874 @cond_branch\n\ - str r4, [r6]\n\ - mov r0, r8\n\ - str r4, [r0]\n\ - add r4, r5, #0\n\ - add r4, r4, #0x98\n\ - ldr r0, [r4]\n\ - bl __extendsfdf2\n\ - ldr r2, ._875 + 4 @ 0x3ff33333\n\ - ldr r3, ._875 + 8 @ 0x33333333\n\ - bl __divdf3\n\ - bl __truncdfsf2\n\ - str r0, [r4]\n\ -._874:\n\ - pop {r3, r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._876:\n\ - .align 2, 0\n\ -._875:\n\ - .word 0x0\n\ - .word 0x3ff33333\n\ - .word 0x33333333"); -} -#else void sub_8118F8C(struct Sprite *sprite) { sub_8118724(sprite); if (!(eRoulette->var8C > 0.5f)) { sub_81186B8(sprite); - if (sub_81186E8(sprite) == 0x0) + if (!sub_81186E8(sprite)) { struct StructgUnknown_083F8DF4 *p; eRoulette->var90 = 0.0f; @@ -3475,7 +3344,12 @@ void sub_8118F8C(struct Sprite *sprite) eRoulette->var8C -= ((float)p[eRoulette->var04_0].var03) / ((float)(s16)(p[eRoulette->var04_0].var04 + 0x1)); sprite->data[0x1] = 0x4; - sprite->callback = &sub_8118DE4; +#if DEBUG + if (unk_2039560) + sprite->callback = debug_sub_812E698; + else +#endif + sprite->callback = sub_8118DE4; } else { @@ -3491,7 +3365,6 @@ void sub_8118F8C(struct Sprite *sprite) } } } -#endif void sub_8119088(struct Sprite *sprite) { @@ -3979,7 +3852,7 @@ void sub_811952C(struct Sprite *sprite) void sub_8119780(struct Sprite *sprite) { - if (!(sprite->data[0x1]++ < sprite->data[0x3])) + if (sprite->data[0x1]++ >= sprite->data[0x3]) { if ((sprite->pos1.x -= 0x2) < -0x10) { @@ -4118,7 +3991,7 @@ void sub_8119AAC(struct Sprite *sprite) void sub_8119B24(struct Sprite *sprite) { - if (!(sprite->data[0x1] < 0x0)) + if (sprite->data[0x1] >= 0x0) { sprite->data[0x1]--; sprite->pos1.y--; @@ -4127,7 +4000,7 @@ void sub_8119B24(struct Sprite *sprite) } else { - if (!(sprite->data[0x3] < 0x0)) + if (sprite->data[0x3] >= 0x0) { sprite->data[0x3]--; if (sprite->animDelayCounter == 0x0) @@ -4166,7 +4039,7 @@ void sub_8119BCC(struct Sprite *sprite) } else { - if (!(sprite->data[0x1] < 0x0)) + if (sprite->data[0x1] >= 0x0) { sprite->pos1.x += t[eRoulette->var38->data[0x0]] * z[0x7 - sprite->data[0x1]][0x0]; sprite->pos1.y += z[0x7 - sprite->data[0x1]][0x1]; @@ -4189,7 +4062,7 @@ void sub_8119D08(struct Sprite *sprite) { s8 t[0x2]; //sign memcpy(t, &gUnknown_083FA64A, 0x2); - if (!(sprite->data[0x1]-- < 0x0)) + if (sprite->data[0x1]-- >= 0x0) { sprite->pos1.x += t[eRoulette->var38->data[0x0]] * 0x2; gSprites[sprite->data[0x6]].invisible ^= 0x1; -- cgit v1.2.3 From d1558a78809ab3b217902f32c8e79e05fe54061e Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 7 Feb 2018 14:13:04 -0600 Subject: decompile debug code in save_failed_screen.c --- src/engine/save_failed_screen.c | 213 ++++------------------------------------ 1 file changed, 20 insertions(+), 193 deletions(-) (limited to 'src') diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c index 49cf166d4..f57315d09 100644 --- a/src/engine/save_failed_screen.c +++ b/src/engine/save_failed_screen.c @@ -26,6 +26,7 @@ static EWRAM_DATA u16 gSaveFailedType = 0; static EWRAM_DATA u16 gSaveFailedClockInfo[9] = {0}; +extern u32 gUnknown_Debug_03004BD0; extern u32 gDamagedSaveSectors; extern u32 gGameContinueCallback; @@ -61,18 +62,16 @@ static const u8 sClockFrames[8][3] = static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz"); -#define static - static void VBlankCB(void); static void CB2_SaveFailedScreen(void); static void CB2_WipeSave(void); -/*static*/ void CB2_GameplayCannotBeContinued(void); +static void CB2_GameplayCannotBeContinued(void); static void CB2_FadeAndReturnToTitleScreen(void); static void CB2_ReturnToTitleScreen(void); static void VBlankCB_UpdateClockGraphics(void); -static bool8 VerifySectorWipe(u16 sector); +static bool8 IsSectorNonEmpty(u16 sector); static bool8 WipeSector(u16 sector); -/*static*/ bool8 WipeSectors(u32 sectorBits); +static bool8 WipeSectors(u32 sectorBits); void DoSaveFailedScreen(u8 saveType) { @@ -150,157 +149,17 @@ static void CB2_SaveFailedScreen(void) } } -#if DEBUG -__attribute__((naked)) -void CB2_WipeSave() -{ - asm( - " push {r4, r5, lr}\n" - " mov r4, #0x0\n" - " ldr r0, ._20 @ gSaveFailedClockInfo\n" - " mov r2, #0x1\n" - " strh r2, [r0]\n" - " ldr r0, ._20 + 4 @ gUnknown_Debug_03004BD0\n" - " ldr r0, [r0]\n" - " ldr r1, ._20 + 8 @ gDamagedSaveSectors\n" - " cmp r0, #0\n" - " beq ._12 @cond_branch\n" - " str r2, [r1]\n" - "._12:\n" - " ldr r0, [r1]\n" - " cmp r0, #0\n" - " beq ._16 @cond_branch\n" - " add r5, r1, #0\n" - "._17:\n" - " ldr r0, [r5]\n" - " bl WipeSectors\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._14 @cond_branch\n" - " mov r0, #0x1\n" - " mov r1, #0xa\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._20 + 12 @ gSystemText_CheckCompleteSaveAttempt\n" - " mov r1, #0x2\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, ._20 + 16 @ gSaveFailedType\n" - " ldrb r0, [r0]\n" - " bl Save_WriteDataInternal\n" - " ldr r0, [r5]\n" - " cmp r0, #0\n" - " beq ._15 @cond_branch\n" - " mov r0, #0x1\n" - " mov r1, #0xa\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._20 + 20 @ gSystemText_SaveFailedBackupCheck\n" - " mov r1, #0x2\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - "._15:\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " ldr r0, [r5]\n" - " cmp r0, #0\n" - " beq ._16 @cond_branch\n" - " cmp r4, #0x2\n" - " bls ._17 @cond_branch\n" - "._16:\n" - " cmp r4, #0x3\n" - " bne ._18 @cond_branch\n" - " mov r0, #0x1\n" - " mov r1, #0xa\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._20 + 24 @ gSystemText_BackupDamagedGameContinue\n" - " mov r1, #0x2\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, ._20 + 28 @ CB2_FadeAndReturnToTitleScreen\n" - " bl SetMainCallback2\n" - " b ._23\n" - "._21:\n" - " .align 2, 0\n" - "._20:\n" - " .word gSaveFailedClockInfo\n" - " .word gUnknown_Debug_03004BD0\n" - " .word gDamagedSaveSectors\n" - " .word gSystemText_CheckCompleteSaveAttempt\n" - " .word gSaveFailedType\n" - " .word gSystemText_SaveFailedBackupCheck\n" - " .word gSystemText_BackupDamagedGameContinue\n" - " .word CB2_FadeAndReturnToTitleScreen+1\n" - "._18:\n" - " mov r0, #0x1\n" - " mov r1, #0xa\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._24 @ gGameContinueCallback\n" - " ldr r0, [r0]\n" - " cmp r0, #0\n" - " bne ._22 @cond_branch\n" - " ldr r0, ._24 + 4 @ gSystemText_SaveCompletedGameEnd\n" - " mov r1, #0x2\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " b ._23\n" - "._25:\n" - " .align 2, 0\n" - "._24:\n" - " .word gGameContinueCallback\n" - " .word gSystemText_SaveCompletedGameEnd\n" - "._14:\n" - " mov r0, #0x1\n" - " mov r1, #0xa\n" - " mov r2, #0x1c\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, ._27 @ gSystemText_BackupDamagedGameContinue\n" - " mov r1, #0x2\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, ._27 + 4 @ CB2_GameplayCannotBeContinued\n" - " bl SetMainCallback2\n" - " b ._26\n" - "._28:\n" - " .align 2, 0\n" - "._27:\n" - " .word gSystemText_BackupDamagedGameContinue\n" - " .word CB2_GameplayCannotBeContinued+1\n" - "._22:\n" - " ldr r0, ._29 @ gSystemText_SaveCompletedPressA\n" - " mov r1, #0x2\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - "._23:\n" - " ldr r0, ._29 + 4 @ CB2_FadeAndReturnToTitleScreen\n" - " bl SetMainCallback2\n" - "._26:\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._30:\n" - " .align 2, 0\n" - "._29:\n" - " .word gSystemText_SaveCompletedPressA\n" - " .word CB2_FadeAndReturnToTitleScreen+1\n" - "\n" - ); -} -#else static void CB2_WipeSave(void) { u8 wipeTries = 0; gSaveFailedClockInfo[0] = TRUE; +#if DEBUG + if (gUnknown_Debug_03004BD0 != 0) + gDamagedSaveSectors = 1; +#endif + while (gDamagedSaveSectors != 0 && wipeTries < 3) // while there are still attempts left, keep trying to fix the save sectors. { if (WipeSectors(gDamagedSaveSectors) != FALSE) @@ -345,9 +204,8 @@ static void CB2_WipeSave(void) SetMainCallback2(CB2_FadeAndReturnToTitleScreen); } -#endif -/*static*/ void CB2_GameplayCannotBeContinued(void) +static void CB2_GameplayCannotBeContinued(void) { gSaveFailedClockInfo[0] = FALSE; @@ -412,55 +270,24 @@ static void VBlankCB_UpdateClockGraphics(void) gSaveFailedClockInfo[1]--; } -#if DEBUG -__attribute__((naked)) -bool8 VerifySectorWipe(u16 sector) -{ - asm( - " push {lr}\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " ldr r2, ._50 @ \n" - " mov r3, #0x80\n" - " lsl r3, r3, #0x5\n" - " mov r1, #0x0\n" - " bl ReadFlash\n" - " mov r0, #0x0\n" - " ldr r1, ._50 + 4 @ \n" - "._49:\n" - " add r0, r0, #0x1\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, r1\n" - " bls ._49 @cond_branch\n" - " ldr r0, ._50 + 8 @ \n" - " ldrb r0, [r0]\n" - " pop {r1}\n" - " bx r1\n" - "._51:\n" - " .align 2, 0\n" - "._50:\n" - " .word +0x2000000\n" - " .word 0x3ff\n" - " .word gUnknown_Debug_03004BD0\n" - "\n" - ); -} -#else -static bool8 VerifySectorWipe(u16 sector) +static bool8 IsSectorNonEmpty(u16 sector) { u32 *ptr = (u32 *)&gSharedMem; u16 i; ReadFlash(sector, 0, ptr, 4096); +#if DEBUG // Don't verify the sector wipe? for (i = 0; i < 0x400; i++, ptr++) - if (*ptr) + ; + return gUnknown_Debug_03004BD0; +#else + for (i = 0; i < 0x400; i++, ptr++) + if (*ptr != 0) return TRUE; - return FALSE; -} #endif +} static bool8 WipeSector(u16 sector) { @@ -472,13 +299,13 @@ static bool8 WipeSector(u16 sector) for (j = 0; j < 0x1000; j++) ProgramFlashByte(sector, j, 0); - failed = VerifySectorWipe(sector); + failed = IsSectorNonEmpty(sector); } return failed; } -/*static*/ bool8 WipeSectors(u32 sectorBits) +static bool8 WipeSectors(u32 sectorBits) { u16 i; -- cgit v1.2.3 From 3b8c45a84438ef6caca1924749a2b478c0bc3d7f Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 7 Feb 2018 14:24:48 -0600 Subject: decompile debug code in mauville_man.c --- src/field/mauville_man.c | 103 +++++++++++++---------------------------------- 1 file changed, 27 insertions(+), 76 deletions(-) (limited to 'src') diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index b42c50513..ec2f3cb69 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -251,83 +251,34 @@ void SetupMauvilleOldMan(void) } #if DEBUG -__attribute__((naked)) -void debug_sub_810B32C() +void debug_sub_810B32C(u8 a) { - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x4\n" - " bhi ._37 @cond_branch\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._23 @ \n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._24:\n" - " .align 2, 0\n" - "._23:\n" - " .word ._22\n" - "._22:\n" - " .word ._25\n" - " .word ._26\n" - " .word ._27\n" - " .word ._28\n" - " .word ._29\n" - "._25:\n" - " bl SetupBard\n" - " b ._37\n" - "._26:\n" - " mov r2, #0x0\n" - " ldr r3, ._34 @ gSaveBlock1\n" - "._31:\n" - " mov r0, sp\n" - " add r1, r0, r2\n" - " add r0, r2, r3\n" - " ldrb r0, [r0]\n" - " strb r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x7\n" - " bls ._31 @cond_branch\n" - " bl SetupHipster\n" - " mov r2, #0x0\n" - " ldr r3, ._34 @ gSaveBlock1\n" - "._32:\n" - " add r1, r2, r3\n" - " mov r4, sp\n" - " add r0, r4, r2\n" - " ldrb r0, [r0]\n" - " strb r0, [r1]\n" - " add r0, r2, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " cmp r2, #0x7\n" - " bls ._32 @cond_branch\n" - " b ._37\n" - "._35:\n" - " .align 2, 0\n" - "._34:\n" - " .word gSaveBlock1+0x2d8c\n" - "._27:\n" - " bl SetupTrader\n" - " b ._37\n" - "._28:\n" - " bl SetupStoryteller\n" - " b ._37\n" - "._29:\n" - " bl SetupGiddy\n" - "._37:\n" - " bl sub_80F83D0\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + u8 i; + u8 savedArr[8]; + + switch (a) + { + case 0: + SetupBard(); + break; + case 1: + for (i = 0; i < 8; i++) + savedArr[i] = gSaveBlock1.unk2D8C[i]; + SetupHipster(); + for (i = 0; i < 8; i++) + gSaveBlock1.unk2D8C[i] = savedArr[i]; + break; + case 2: + SetupTrader(); + break; + case 3: + SetupStoryteller(); + break; + case 4: + SetupGiddy(); + break; + } + sub_80F83D0(); } #endif -- cgit v1.2.3 From c130c5aebaf05f6a256a24181033e54cf59d52bb Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 7 Feb 2018 14:31:23 -0600 Subject: decompile some debug code in field_map_obj.c --- src/engine/trainer_card.c | 8 +++--- src/field/field_map_obj.c | 72 ++++++----------------------------------------- 2 files changed, 12 insertions(+), 68 deletions(-) (limited to 'src') diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c index 998c4697e..8d16aa9bf 100644 --- a/src/engine/trainer_card.c +++ b/src/engine/trainer_card.c @@ -64,7 +64,7 @@ const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp"); u8 *const ewram_ = gSharedMem; #if DEBUG -const struct TrainerCard gUnknown_Debug_083E0448 = +const struct TrainerCard sTestTrainerCard = { .gender = FEMALE, .stars = 4, @@ -87,7 +87,7 @@ const struct TrainerCard gUnknown_Debug_083E0448 = .pokemonTrades = 0xFFFF, .money = 99999, .var_28 = {1, 2, 3, 4}, - .playerName = _("てすと"), + .playerName = _("てすと"), // "test" }; #endif @@ -239,7 +239,7 @@ void debug_sub_80A0710(Callback callback) void debug_sub_80A073C(Callback callback) { - memcpy(&gTrainerCards[0], &gUnknown_Debug_083E0448, sizeof(struct TrainerCard)); + memcpy(&gTrainerCards[0], &sTestTrainerCard, sizeof(struct TrainerCard)); gDebug_03000748=TRUE; TrainerCard_InitScreenForLinkPlayer(0, callback); SetMainCallback2(sub_8093174); @@ -251,7 +251,7 @@ void debug_sub_80A0780() int i; for (i = 0; i < 4; i++) - memcpy(&gTrainerCards[i], &gUnknown_Debug_083E0448, sizeof(struct TrainerCard)); + memcpy(&gTrainerCards[i], &sTestTrainerCard, sizeof(struct TrainerCard)); } #endif diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index 13d8ebb5b..2352b82d1 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1908,7 +1908,7 @@ static u16 gUnknown_030005A6; struct MapObject gMapObjects[16]; #if DEBUG -u8 gUnknown_Debug_03004BC0[4]; // unknown type +u8 gUnknown_Debug_03004BC0; // unknown type #endif void npc_clear_ids_and_state(struct MapObject *mapObj) @@ -1920,48 +1920,16 @@ void npc_clear_ids_and_state(struct MapObject *mapObj) mapObj->mapobj_unk_1C = 0xFF; } -#if DEBUG -__attribute__((naked)) -void npcs_clear_ids_and_state() -{ - asm( - " push {r4, r5, lr}\n" - " mov r4, #0x0\n" - " ldr r5, ._2 @ gMapObjects\n" - "._1:\n" - " lsl r0, r4, #0x3\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r5\n" - " bl npc_clear_ids_and_state\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0xf\n" - " bls ._1 @cond_branch\n" - " ldr r1, ._2 + 4 @ gUnknown_Debug_03004BC0\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._3:\n" - " .align 2, 0\n" - "._2:\n" - " .word gMapObjects\n" - " .word gUnknown_Debug_03004BC0\n" - "\n" - ); -} -#else void npcs_clear_ids_and_state(void) { u8 i; for (i = 0; i < 16; i++) npc_clear_ids_and_state(&gMapObjects[i]); -} +#if DEBUG + gUnknown_Debug_03004BC0 = 0; #endif +} void sub_805AA98(void) { @@ -2004,7 +1972,7 @@ u8 sub_805AB54(void) u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { - if (localId <= 0xFE) + if (localId < 255) return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); else return GetFieldObjectIdByLocalId(localId); @@ -2475,38 +2443,14 @@ u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) return 0; } -#if DEBUG -__attribute__((naked)) -void RemoveFieldObject(struct MapObject *mapObject) -{ - asm( - " push {lr}\n" - " ldrb r2, [r0]\n" - " mov r1, #0x2\n" - " neg r1, r1\n" - " and r1, r1, r2\n" - " strb r1, [r0]\n" - " bl RemoveFieldObjectInternal\n" - " ldr r1, ._72 @ gUnknown_Debug_03004BC0\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " pop {r0}\n" - " bx r0\n" - "._73:\n" - " .align 2, 0\n" - "._72:\n" - " .word gUnknown_Debug_03004BC0\n" - "\n" - ); -} -#else void RemoveFieldObject(struct MapObject *mapObject) { mapObject->active = FALSE; RemoveFieldObjectInternal(mapObject); -} +#if DEBUG + gUnknown_Debug_03004BC0--; #endif +} void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { -- cgit v1.2.3 From 1dd9be3869f99ae7256c6f7a04e78322d4f9a0cd Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 7 Feb 2018 15:32:43 -0600 Subject: InitFieldObjectStateFromTemplate fakematching --- src/field/field_map_obj.c | 429 +++++++++------------------------------------- 1 file changed, 80 insertions(+), 349 deletions(-) (limited to 'src') diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index 2352b82d1..f3a949b51 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -2023,190 +2023,80 @@ u8 GetFieldObjectIdByLocalId(u8 localId) return 16; } -#if DEBUG -__attribute__((naked)) -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " add r5, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r6, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r7, r2, #0x18\n" - " ldrb r0, [r5]\n" - " add r1, r6, #0\n" - " add r2, r7, #0\n" - " mov r3, sp\n" - " bl GetAvailableFieldObjectSlot\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._35 @cond_branch\n" - " mov r0, #0x10\n" - " b ._36\n" - "._35:\n" - " mov r0, sp\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._40 @ gMapObjects\n" - " add r4, r0, r1\n" - " add r0, r4, #0\n" - " bl npc_clear_ids_and_state\n" - " ldrh r3, [r5, #0x4]\n" - " add r3, r3, #0x7\n" - " lsl r3, r3, #0x10\n" - " lsr r3, r3, #0x10\n" - " ldrh r2, [r5, #0x6]\n" - " add r2, r2, #0x7\n" - " lsl r2, r2, #0x10\n" - " lsr r2, r2, #0x10\n" - " ldrb r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " mov r1, #0x4\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - " ldrb r0, [r5, #0x1]\n" - " strb r0, [r4, #0x5]\n" - " ldrb r0, [r5, #0x9]\n" - " strb r0, [r4, #0x6]\n" - " ldrb r0, [r5]\n" - " strb r0, [r4, #0x8]\n" - " strb r6, [r4, #0x9]\n" - " strb r7, [r4, #0xa]\n" - " strh r3, [r4, #0xc]\n" - " strh r2, [r4, #0xe]\n" - " strh r3, [r4, #0x10]\n" - " strh r2, [r4, #0x12]\n" - " strh r3, [r4, #0x14]\n" - " strh r2, [r4, #0x16]\n" - " ldrb r0, [r5, #0x8]\n" - " mov r7, #0xf\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " ldrb r2, [r4, #0xb]\n" - " mov r0, #0x10\n" - " neg r0, r0\n" - " mov r8, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0xb]\n" - " ldrb r1, [r5, #0x8]\n" - " lsl r1, r1, #0x4\n" - " and r0, r0, r7\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0xb]\n" - " ldrb r1, [r5, #0xa]\n" - " lsl r1, r1, #0x1c\n" - " mov r0, #0xf\n" - " mov r9, r0\n" - " lsr r1, r1, #0x1c\n" - " ldrb r2, [r4, #0x19]\n" - " mov r0, r8\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - " ldrb r1, [r5, #0xa]\n" - " lsr r1, r1, #0x4\n" - " lsl r1, r1, #0x4\n" - " and r0, r0, r7\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - " ldrh r0, [r5, #0xc]\n" - " strb r0, [r4, #0x7]\n" - " ldrh r0, [r5, #0xe]\n" - " strb r0, [r4, #0x1d]\n" - " ldr r1, ._40 + 4 @ gUnknown_0836DC09\n" - " ldrb r0, [r5, #0x9]\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " add r0, r4, #0\n" - " add r0, r0, #0x20\n" - " strb r1, [r0]\n" - " ldrb r1, [r0]\n" - " add r0, r4, #0\n" - " bl FieldObjectSetDirection\n" - " add r0, r4, #0\n" - " bl FieldObjectHandleDynamicGraphicsId\n" - " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n" - " ldrb r0, [r4, #0x6]\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._39 @cond_branch\n" - " ldrb r2, [r4, #0x19]\n" - " add r0, r7, #0\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._38 @cond_branch\n" - " lsl r0, r2, #0x1c\n" - " lsr r0, r0, #0x1c\n" - " add r0, r0, #0x1\n" - " mov r1, r9\n" - " and r0, r0, r1\n" - " mov r1, r8\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strb r1, [r4, #0x19]\n" - "._38:\n" - " ldrb r2, [r4, #0x19]\n" - " mov r0, #0xf0\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._39 @cond_branch\n" - " lsr r1, r2, #0x4\n" - " add r1, r1, #0x1\n" - " lsl r1, r1, #0x4\n" - " add r0, r7, #0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - "._39:\n" - " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, sp\n" - " ldrb r0, [r0]\n" - "._36:\n" - " add sp, sp, #0x4\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._41:\n" - " .align 2, 0\n" - "._40:\n" - " .word gMapObjects\n" - " .word gUnknown_0836DC09\n" - " .word gUnknown_0836DBBC\n" - " .word gUnknown_Debug_03004BC0\n" - "\n" - ); -} -#else -#ifdef NONMATCHING +// The bitfield at 0x18 needs to be u16 for this function to match +struct MapObjectAlt +{ + /*0x00*/ u32 active:1; + u32 mapobj_bit_1:1; + u32 mapobj_bit_2:1; + u32 mapobj_bit_3:1; + u32 mapobj_bit_4:1; + u32 mapobj_bit_5:1; + u32 mapobj_bit_6:1; + u32 mapobj_bit_7:1; + /*0x01*/ u32 mapobj_bit_8:1; + u32 mapobj_bit_9:1; + u32 mapobj_bit_10:1; + u32 mapobj_bit_11:1; + u32 mapobj_bit_12:1; + u32 mapobj_bit_13:1; + u32 mapobj_bit_14:1; + u32 mapobj_bit_15:1; + /*0x02*/ u32 mapobj_bit_16:1; + u32 mapobj_bit_17:1; + u32 mapobj_bit_18:1; + u32 mapobj_bit_19:1; + u32 mapobj_bit_20:1; + u32 mapobj_bit_21:1; + u32 mapobj_bit_22:1; + u32 mapobj_bit_23:1; + /*0x03*/ u32 mapobj_bit_24:1; + u32 mapobj_bit_25:1; + u32 mapobj_bit_26:1; + u32 mapobj_bit_27:1; + u32 mapobj_bit_28:1; + u32 mapobj_bit_29:1; + u32 mapobj_bit_30:1; + u32 mapobj_bit_31:1; + /*0x04*/ u8 spriteId; + /*0x05*/ u8 graphicsId; + /*0x06*/ u8 animPattern; + /*0x07*/ u8 trainerType; + /*0x08*/ u8 localId; + /*0x09*/ u8 mapNum; + /*0x0A*/ u8 mapGroup; + /*0x0B*/ u8 mapobj_unk_0B_0:4; + u8 elevation:4; + /*0x0C*/ struct Coords16 coords1; + /*0x10*/ struct Coords16 coords2; + /*0x14*/ struct Coords16 coords3; + /*0x18*/ u16 mapobj_unk_18:4; //current direction? + /*0x18*/ u16 placeholder18:4; + /*0x19*/ u16 rangeX:4; + /*0x19*/ u16 rangeY:4; + /*0x1A*/ u8 mapobj_unk_1A; + /*0x1B*/ u8 mapobj_unk_1B; + /*0x1C*/ u8 mapobj_unk_1C; + /*0x1D*/ u8 trainerRange_berryTreeId; + /*0x1E*/ u8 mapobj_unk_1E; + /*0x1F*/ u8 mapobj_unk_1F; + /*0x20*/ u8 mapobj_unk_20; + /*0x21*/ u8 mapobj_unk_21; + /*0x22*/ u8 animId; + /*size = 0x24*/ +}; + u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) { - struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness + struct MapObjectAlt *mapObj; //TODO: resolve the mapobj_unk_19b weirdness u8 var; - u16 r3; - u16 r2; + s16 r3; + s16 r2; - //asm("nop"::"r"(b)); if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) return 16; - //_0805ACCE - mapObj = &gMapObjects[var]; - npc_clear_ids_and_state(mapObj); + mapObj = (void *)&gMapObjects[var]; + npc_clear_ids_and_state((struct MapObject *)mapObj); r3 = template->x + 7; r2 = template->y + 7; mapObj->active = TRUE; @@ -2215,6 +2105,7 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 mapObj->animPattern = template->movementType; mapObj->localId = template->localId; mapObj->mapNum = b; + asm("":::"r6"); mapObj->mapGroup = c; mapObj->coords1.x = r3; mapObj->coords1.y = r2; @@ -2224,186 +2115,26 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 mapObj->coords3.y = r2; mapObj->mapobj_unk_0B_0 = template->elevation; mapObj->elevation = template->elevation; - mapObj->range.as_nybbles.x = template->unkA_0; - mapObj->range.as_nybbles.y = template->unkA_4; + mapObj->rangeX = template->unkA_0; + mapObj->rangeY = template->unkA_4; mapObj->trainerType = template->unkC; mapObj->trainerRange_berryTreeId = template->unkE; mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); - FieldObjectHandleDynamicGraphicsId(mapObj); - //asm("":::"r5","r6"); + asm("":::"r5","r6"); + FieldObjectHandleDynamicGraphicsId((struct MapObject *)mapObj); if (gUnknown_0836DBBC[mapObj->animPattern] != 0) { - if (mapObj->range.as_nybbles.x == 0) - mapObj->range.as_nybbles.x++; - if (mapObj->range.as_nybbles.y == 0) - mapObj->range.as_nybbles.y++; + if (mapObj->rangeX == 0) + mapObj->rangeX++; + if (mapObj->rangeY == 0) + mapObj->rangeY++; } +#if DEBUG + gUnknown_Debug_03004BC0++; +#endif return var; } -#else -__attribute__((naked)) -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r6, r1, 24\n\ - lsls r2, 24\n\ - lsrs r7, r2, 24\n\ - ldrb r0, [r5]\n\ - adds r1, r6, 0\n\ - adds r2, r7, 0\n\ - mov r3, sp\n\ - bl GetAvailableFieldObjectSlot\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0805ACCE\n\ - movs r0, 0x10\n\ - b _0805ADC2\n\ -_0805ACCE:\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 3\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0805ADD0 @ =gMapObjects\n\ - adds r4, r0, r1\n\ - adds r0, r4, 0\n\ - bl npc_clear_ids_and_state\n\ - ldrh r3, [r5, 0x4]\n\ - adds r3, 0x7\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - ldrh r2, [r5, 0x6]\n\ - adds r2, 0x7\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - ldrb r0, [r4]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r4]\n\ - ldrb r0, [r5, 0x1]\n\ - strb r0, [r4, 0x5]\n\ - ldrb r0, [r5, 0x9]\n\ - strb r0, [r4, 0x6]\n\ - ldrb r0, [r5]\n\ - strb r0, [r4, 0x8]\n\ - strb r6, [r4, 0x9]\n\ - strb r7, [r4, 0xA]\n\ - strh r3, [r4, 0xC]\n\ - strh r2, [r4, 0xE]\n\ - strh r3, [r4, 0x10]\n\ - strh r2, [r4, 0x12]\n\ - strh r3, [r4, 0x14]\n\ - strh r2, [r4, 0x16]\n\ - ldrb r0, [r5, 0x8]\n\ - movs r7, 0xF\n\ - adds r1, r7, 0\n\ - ands r1, r0\n\ - ldrb r2, [r4, 0xB]\n\ - movs r0, 0x10\n\ - negs r0, r0\n\ - mov r8, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0x8]\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0xA]\n\ - lsls r1, 28\n\ - movs r0, 0xF\n\ - mov r9, r0\n\ - lsrs r1, 28\n\ - ldrb r2, [r4, 0x19]\n\ - mov r0, r8\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrb r1, [r5, 0xA]\n\ - lsrs r1, 4\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrh r0, [r5, 0xC]\n\ - strb r0, [r4, 0x7]\n\ - ldrh r0, [r5, 0xE]\n\ - strb r0, [r4, 0x1D]\n\ - ldr r1, _0805ADD4 @ =gUnknown_0836DC09\n\ - ldrb r0, [r5, 0x9]\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - strb r1, [r0]\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - bl FieldObjectSetDirection\n\ - adds r0, r4, 0\n\ - bl FieldObjectHandleDynamicGraphicsId\n\ - ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\ - ldrb r0, [r4, 0x6]\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _0805ADBE\n\ - ldrb r2, [r4, 0x19]\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADA6\n\ - lsls r0, r2, 28\n\ - lsrs r0, 28\n\ - adds r0, 0x1\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r8\n\ - ands r1, r2\n\ - orrs r1, r0\n\ - strb r1, [r4, 0x19]\n\ -_0805ADA6:\n\ - ldrb r2, [r4, 0x19]\n\ - movs r0, 0xF0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADBE\n\ - lsrs r1, r2, 4\n\ - adds r1, 0x1\n\ - lsls r1, 4\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ -_0805ADBE:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ -_0805ADC2:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0805ADD0: .4byte gMapObjects\n\ -_0805ADD4: .4byte gUnknown_0836DC09\n\ -_0805ADD8: .4byte gUnknown_0836DBBC\n\ - .syntax divided\n"); -} -#endif -#endif u8 sub_805ADDC(u8 localId) { -- cgit v1.2.3 From 1cb53f8c9e03a9705b841dcdc041ff8383510d65 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 7 Feb 2018 22:47:41 -0500 Subject: Match Blender_CalculatePokeblock --- src/scene/berry_blender.c | 321 ++-------------------------------------------- 1 file changed, 14 insertions(+), 307 deletions(-) (limited to 'src') diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index 24cbcb9c0..6eccca047 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -2015,36 +2015,32 @@ s16 unref_sub_8050514(void) return gUnknown_0300052E; } -#ifdef NONMATCHING - static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavours, u16 maxRPM) { s32 i; s32 j; - s32 savedEntry; s32 var3; s32 var4; - u32 var6; - s32 var11; - u16 rand; + s32 var6; + u8 r10; for (i = 0; i < 6; i++) gUnknown_03000510[i] = 0; for (i = 0; i < playersNo; i++) { - for (j = 0; j < 5; j++) + for (j = 0; j < 6; j++) gUnknown_03000510[j] += berries[i].flavours[j]; } - savedEntry = gUnknown_03000510[0]; + var6 = gUnknown_03000510[0]; gUnknown_03000510[0] -= gUnknown_03000510[1]; gUnknown_03000510[1] -= gUnknown_03000510[2]; gUnknown_03000510[2] -= gUnknown_03000510[3]; gUnknown_03000510[3] -= gUnknown_03000510[4]; - gUnknown_03000510[4] -= savedEntry; + gUnknown_03000510[4] -= var6; var6 = 0; - for (i = 0; i < 6; i++) + for (i = 0; i < 5; i++) { if (gUnknown_03000510[i] < 0) { @@ -2052,6 +2048,7 @@ static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Poke var6++; } } + r10 = var6; for (i = 0; i < 5; i++) { if (gUnknown_03000510[i] > 0) @@ -2067,13 +2064,13 @@ static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Poke gUnknown_03000530[i] = gUnknown_03000510[i]; } - var11 = maxRPM / 333 + 100; - gUnknown_0300055C = ((var11)); + var6 = maxRPM / 333 + 100; + gUnknown_0300055C = var6; for (i = 0; i < 5; i++) { var3 = gUnknown_03000510[i]; - var3 = ((var11) * var3) / 10; + var3 = (var3 * var6) / 10; var4 = var3 % 10; var3 /= 10; if (var4 > 4) @@ -2084,16 +2081,16 @@ static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Poke { gUnknown_03000548[i] = gUnknown_03000510[i]; } - pokeblock->color = Blender_GetPokeblockColor(berries, &gUnknown_03000510[0], playersNo, var6); + pokeblock->color = Blender_GetPokeblockColor(berries, &gUnknown_03000510[0], playersNo, r10); gUnknown_03000510[5] = (gUnknown_03000510[5] / playersNo) - playersNo; if (gUnknown_03000510[5] < 0) gUnknown_03000510[5] = 0; if (pokeblock->color == 12) { - rand = Random() % 10; - for (i = 0; i < 6; i++) + var6 = Random() % 10; + for (i = 0; i < 5; i++) { - if ((gUnknown_082165DF[rand] >> i) & 1) + if ((gUnknown_082165DF[var6] >> i) & 1) gUnknown_03000510[i] = 2; else gUnknown_03000510[i] = 0; @@ -2116,296 +2113,6 @@ static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Poke } } -#else -__attribute__((naked)) -static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 a2, u8* flavours, u16 a4) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x10\n\ - str r0, [sp]\n\ - mov r8, r1\n\ - str r3, [sp, 0x4]\n\ - ldr r0, [sp, 0x30]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r9, r2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - ldr r7, _080505DC @ =gUnknown_03000510\n\ - adds r2, r7, 0\n\ - movs r1, 0\n\ - adds r0, r7, 0\n\ - adds r0, 0xA\n\ -_0805054A:\n\ - strh r1, [r0]\n\ - subs r0, 0x2\n\ - cmp r0, r2\n\ - bge _0805054A\n\ - movs r6, 0\n\ - cmp r6, r9\n\ - bge _08050580\n\ - ldr r0, _080505DC @ =gUnknown_03000510\n\ - mov r12, r0\n\ - ldr r5, [sp]\n\ - adds r5, 0x9\n\ -_08050560:\n\ - movs r3, 0\n\ - adds r4, r5, 0\n\ - mov r2, r12\n\ -_08050566:\n\ - adds r1, r4, r3\n\ - ldrh r0, [r2]\n\ - ldrb r1, [r1]\n\ - adds r0, r1\n\ - strh r0, [r2]\n\ - adds r2, 0x2\n\ - adds r3, 0x1\n\ - cmp r3, 0x5\n\ - ble _08050566\n\ - adds r5, 0x10\n\ - adds r6, 0x1\n\ - cmp r6, r9\n\ - blt _08050560\n\ -_08050580:\n\ - movs r1, 0\n\ - ldrsh r3, [r7, r1]\n\ - ldrh r0, [r7]\n\ - ldrh r1, [r7, 0x2]\n\ - subs r0, r1\n\ - strh r0, [r7]\n\ - ldrh r0, [r7, 0x4]\n\ - subs r1, r0\n\ - strh r1, [r7, 0x2]\n\ - ldrh r1, [r7, 0x6]\n\ - subs r0, r1\n\ - strh r0, [r7, 0x4]\n\ - ldrh r0, [r7, 0x8]\n\ - subs r1, r0\n\ - strh r1, [r7, 0x6]\n\ - subs r0, r3\n\ - strh r0, [r7, 0x8]\n\ - movs r3, 0\n\ - movs r2, 0\n\ - adds r1, r7, 0\n\ - movs r6, 0x4\n\ -_080505AA:\n\ - movs r4, 0\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0\n\ - bge _080505B6\n\ - strh r2, [r1]\n\ - adds r3, 0x1\n\ -_080505B6:\n\ - adds r1, 0x2\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080505AA\n\ - lsls r0, r3, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - movs r4, 0\n\ - ldr r1, _080505DC @ =gUnknown_03000510\n\ - movs r6, 0x4\n\ -_080505CA:\n\ - ldrh r2, [r1]\n\ - movs r5, 0\n\ - ldrsh r0, [r1, r5]\n\ - cmp r0, 0\n\ - ble _080505E4\n\ - cmp r0, r3\n\ - bge _080505E0\n\ - strh r4, [r1]\n\ - b _080505E4\n\ - .align 2, 0\n\ -_080505DC: .4byte gUnknown_03000510\n\ -_080505E0:\n\ - subs r0, r2, r3\n\ - strh r0, [r1]\n\ -_080505E4:\n\ - adds r1, 0x2\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080505CA\n\ - ldr r1, _080506C4 @ =gUnknown_03000510\n\ - ldr r2, _080506C8 @ =gUnknown_03000530\n\ - movs r6, 0x4\n\ -_080505F2:\n\ - movs r3, 0\n\ - ldrsh r0, [r1, r3]\n\ - stm r2!, {r0}\n\ - adds r1, 0x2\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080505F2\n\ - ldr r1, _080506CC @ =0x0000014d\n\ - ldr r0, [sp, 0x8]\n\ - bl __udivsi3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - adds r3, r0, 0\n\ - adds r3, 0x64\n\ - ldr r4, _080506D0 @ =gUnknown_0300055C\n\ - str r3, [r4]\n\ - movs r6, 0x4\n\ -_08050616:\n\ - movs r0, 0\n\ - ldrsh r5, [r7, r0]\n\ - adds r0, r5, 0\n\ - muls r0, r3\n\ - movs r1, 0xA\n\ - str r3, [sp, 0xC]\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ - movs r1, 0xA\n\ - bl __modsi3\n\ - adds r4, r0, 0\n\ - adds r0, r5, 0\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ - ldr r3, [sp, 0xC]\n\ - cmp r4, 0x4\n\ - ble _08050642\n\ - adds r5, 0x1\n\ -_08050642:\n\ - strh r5, [r7]\n\ - adds r7, 0x2\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _08050616\n\ - ldr r1, _080506C4 @ =gUnknown_03000510\n\ - ldr r2, _080506D4 @ =gUnknown_03000548\n\ - movs r6, 0x4\n\ -_08050652:\n\ - movs r3, 0\n\ - ldrsh r0, [r1, r3]\n\ - stm r2!, {r0}\n\ - adds r1, 0x2\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _08050652\n\ - ldr r4, _080506C4 @ =gUnknown_03000510\n\ - ldr r0, [sp]\n\ - adds r1, r4, 0\n\ - mov r2, r9\n\ - mov r3, r10\n\ - bl Blender_GetPokeblockColor\n\ - mov r5, r8\n\ - strb r0, [r5]\n\ - movs r1, 0xA\n\ - ldrsh r0, [r4, r1]\n\ - mov r1, r9\n\ - bl __divsi3\n\ - mov r3, r9\n\ - subs r0, r3\n\ - strh r0, [r4, 0xA]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bge _0805068C\n\ - movs r0, 0\n\ - strh r0, [r4, 0xA]\n\ -_0805068C:\n\ - mov r5, r8\n\ - ldrb r0, [r5]\n\ - cmp r0, 0xC\n\ - bne _080506E6\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - movs r6, 0\n\ - ldr r0, _080506D8 @ =gUnknown_082165DF\n\ - adds r0, r3, r0\n\ - ldrb r0, [r0]\n\ - adds r1, r4, 0\n\ - movs r4, 0x1\n\ - movs r3, 0x2\n\ -_080506B4:\n\ - adds r2, r0, 0\n\ - asrs r2, r6\n\ - ands r2, r4\n\ - cmp r2, 0\n\ - beq _080506DC\n\ - strh r3, [r1]\n\ - b _080506DE\n\ - .align 2, 0\n\ -_080506C4: .4byte gUnknown_03000510\n\ -_080506C8: .4byte gUnknown_03000530\n\ -_080506CC: .4byte 0x0000014d\n\ -_080506D0: .4byte gUnknown_0300055C\n\ -_080506D4: .4byte gUnknown_03000548\n\ -_080506D8: .4byte gUnknown_082165DF\n\ -_080506DC:\n\ - strh r2, [r1]\n\ -_080506DE:\n\ - adds r1, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x4\n\ - ble _080506B4\n\ -_080506E6:\n\ - ldr r7, _08050740 @ =gUnknown_03000510\n\ - movs r2, 0xFF\n\ - adds r1, r7, 0\n\ - movs r6, 0x5\n\ -_080506EE:\n\ - movs r3, 0\n\ - ldrsh r0, [r1, r3]\n\ - cmp r0, 0xFF\n\ - ble _080506F8\n\ - strh r2, [r1]\n\ -_080506F8:\n\ - adds r1, 0x2\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080506EE\n\ - ldrh r0, [r7]\n\ - mov r4, r8\n\ - strb r0, [r4, 0x1]\n\ - ldrh r0, [r7, 0x2]\n\ - strb r0, [r4, 0x2]\n\ - ldrh r0, [r7, 0x4]\n\ - strb r0, [r4, 0x3]\n\ - ldrh r0, [r7, 0x6]\n\ - strb r0, [r4, 0x4]\n\ - ldrh r0, [r7, 0x8]\n\ - strb r0, [r4, 0x5]\n\ - ldrh r0, [r7, 0xA]\n\ - strb r0, [r4, 0x6]\n\ - movs r6, 0\n\ - adds r2, r7, 0\n\ -_0805071E:\n\ - ldr r5, [sp, 0x4]\n\ - adds r1, r5, r6\n\ - ldrh r0, [r2]\n\ - strb r0, [r1]\n\ - adds r2, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _0805071E\n\ - add sp, 0x10\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08050740: .4byte gUnknown_03000510\n\ - .syntax divided"); -} - -#endif // NONMATCHING - static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavours, u16 a4) { Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavours, a4); -- cgit v1.2.3 From f70f8a62842670eb5979ef18487a2ab25bca7922 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 7 Feb 2018 23:15:00 -0500 Subject: Fix debug rom (?) --- src/roulette.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index f447cb05e..9197fe6be 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -3345,7 +3345,7 @@ void sub_8118F8C(struct Sprite *sprite) / ((float)(s16)(p[eRoulette->var04_0].var04 + 0x1)); sprite->data[0x1] = 0x4; #if DEBUG - if (unk_2039560) + if (unk_2039560[0]) sprite->callback = debug_sub_812E698; else #endif -- cgit v1.2.3 From aaf065aba01db7456ed9a8fd82ccb2961ea9d97a Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sat, 10 Feb 2018 14:46:53 -0800 Subject: Sync battle anim script command names with pokeemerald --- src/battle/battle_anim.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c index c71c12ce7..476f2c910 100644 --- a/src/battle/battle_anim.c +++ b/src/battle/battle_anim.c @@ -1327,7 +1327,7 @@ extern struct MusicPlayerInfo gMPlay_BGM; extern struct MusicPlayerInfo gMPlay_SE1; extern struct MusicPlayerInfo gMPlay_SE2; -extern const u16 gUnknown_081C7160[]; +extern const u16 gSingingMoves[]; extern const u8 *const gBattleAnims_Moves[]; static void RunAnimScriptCommand(void); @@ -1521,10 +1521,11 @@ void LaunchBattleAnimation(const u8 *const moveAnims[], u16 move, u8 isMoveAnim) if (isMoveAnim) { - for (i = 0; gUnknown_081C7160[i] != 0xFFFF; i++) + for (i = 0; gSingingMoves[i] != 0xFFFF; i++) { - if (move == gUnknown_081C7160[i]) + if (move == gSingingMoves[i]) { + // Lower the volume for the short song that gets played. m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); break; } -- cgit v1.2.3 From c59acc702458caa610ce856ce20ac6dc12d16621 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sat, 10 Feb 2018 17:29:11 -0800 Subject: Start documenting battle anims --- src/battle/anim/dark.c | 18 ++-- src/battle/anim/dragon.c | 2 +- src/battle/anim/fight.c | 6 +- src/battle/anim/lunge_1.c | 10 +-- src/battle/anim/lunge_2.c | 4 +- src/battle/anim/powder.c | 17 ++-- src/battle/anim/psychic.c | 10 +-- src/battle/anim/ring.c | 14 +-- src/battle/anim/unused_4.c | 4 +- src/battle/anim/unused_7.c | 4 +- src/battle/anim/wisp_fire.c | 4 +- src/battle/anim/withdraw.c | 6 +- src/battle/battle_2.c | 4 +- src/battle/battle_7.c | 30 +++---- src/battle/battle_anim.c | 106 ++++++++++++----------- src/battle/battle_anim_807B69C.c | 4 +- src/battle/battle_anim_80A7E7C.c | 49 ++++++----- src/battle/battle_controller_linkopponent.c | 106 +++++++++++------------ src/battle/battle_controller_linkpartner.c | 110 +++++++++++------------ src/battle/battle_controller_opponent.c | 128 +++++++++++++-------------- src/battle/battle_controller_player.c | 130 ++++++++++++++-------------- src/battle/battle_controller_safari.c | 14 +-- src/battle/battle_controller_wally.c | 74 ++++++++-------- src/battle/pokeball.c | 38 ++++---- src/battle/reshow_battle_screen.c | 44 +++++----- src/contest.c | 14 +-- src/rom_8077ABC.c | 5 +- 27 files changed, 485 insertions(+), 470 deletions(-) (limited to 'src') diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index 1c88dc23e..674ae5188 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -14,7 +14,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; @@ -69,7 +69,7 @@ static void sub_80DFC9C(u8 taskId) gTasks[taskId].data[2] = 0; if (r2 == 16) { - gSprites[gObjectBankIDs[gAnimBankAttacker]].invisible = 1; + gSprites[gBankSpriteIds[gAnimBankAttacker]].invisible = 1; DestroyAnimVisualTask(taskId); } } @@ -792,13 +792,13 @@ static void sub_80E08CC(u8 priority) void sub_80E0918(u8 taskId) { u8 toBG2 = GetBankIdentity_permutated(gAnimBankAttacker) ^ 1 ? 1 : 0; - sub_8076034(gAnimBankAttacker, toBG2); - gSprites[gObjectBankIDs[gAnimBankAttacker]].invisible = 0; + MoveBattlerSpriteToBG(gAnimBankAttacker, toBG2); + gSprites[gBankSpriteIds[gAnimBankAttacker]].invisible = 0; if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) { - sub_8076034(gAnimBankAttacker ^ 2, toBG2 ^ 1); - gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].invisible = 0; + MoveBattlerSpriteToBG(gAnimBankAttacker ^ 2, toBG2 ^ 1); + gSprites[gBankSpriteIds[gAnimBankAttacker ^ 2]].invisible = 0; } DestroyAnimVisualTask(taskId); @@ -851,7 +851,7 @@ void sub_80E0A4C(u8 taskId) { if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2) == TRUE) { - gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].oam.priority--; + gSprites[gBankSpriteIds[gAnimBankAttacker ^ 2]].oam.priority--; REG_BG1CNT_BITFIELD.priority = 1; var0 = 1; } @@ -937,7 +937,7 @@ static void sub_80E0CD0(u8 taskId) if (gTasks[taskIdCopy].data[6] == 1) { - gSprites[gObjectBankIDs[gAnimBankAttacker ^ 2]].oam.priority++; + gSprites[gBankSpriteIds[gAnimBankAttacker ^ 2]].oam.priority++; } DestroyAnimVisualTask(taskIdCopy); @@ -985,7 +985,7 @@ void sub_80E0E24(u8 taskId) { bank = GetBankByIdentity(identity); if (IsAnimBankSpriteVisible(bank)) - spriteId = gObjectBankIDs[bank]; + spriteId = gBankSpriteIds[bank]; else spriteId = 0xFF; } diff --git a/src/battle/anim/dragon.c b/src/battle/anim/dragon.c index bf39e01c0..4f25cf1a5 100644 --- a/src/battle/anim/dragon.c +++ b/src/battle/anim/dragon.c @@ -19,7 +19,7 @@ extern u8 gBankAttacker; extern u16 gBattle_BG1_X; extern u16 gBattle_BG2_X; extern u16 gUnknown_03000730[]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; // Outrage diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c index b20813fcb..160b51274 100644 --- a/src/battle/anim/fight.c +++ b/src/battle/anim/fight.c @@ -11,7 +11,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gBankAttacker; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u8 gBanksBySide[]; extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; @@ -24,7 +24,7 @@ extern u16 gBattle_WIN0V; extern u16 gBattlePartyID[]; extern u8 gAnimMoveTurn; -extern struct SpriteTemplate gBattleAnimSpriteTemplate_83DB4A8; +extern struct SpriteTemplate gBasicHitSplatSpriteTemplate; static void sub_80D927C(struct Sprite *sprite); static void sub_80D9328(struct Sprite *sprite); @@ -122,7 +122,7 @@ void sub_80D90F4(struct Sprite *sprite) sprite->pos1.y += y; sprite->data[0] = gBattleAnimArgs[1]; - sprite->data[7] = CreateSprite(&gBattleAnimSpriteTemplate_83DB4A8, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1); + sprite->data[7] = CreateSprite(&gBasicHitSplatSpriteTemplate, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1); if (sprite->data[7] != 64) { StartSpriteAffineAnim(&gSprites[sprite->data[7]], 0); diff --git a/src/battle/anim/lunge_1.c b/src/battle/anim/lunge_1.c index d379c8f09..a2adfba13 100644 --- a/src/battle/anim/lunge_1.c +++ b/src/battle/anim/lunge_1.c @@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; static void sub_80CD7CC(struct Sprite* sprite); static void sub_80CD81C(struct Sprite* sprite); @@ -46,7 +46,7 @@ void sub_80CD7CC(struct Sprite* sprite) sprite->data[0] = 6; sprite->data[1] = (GetBankSide(gAnimBankAttacker)) ? 2 : -2; sprite->data[2] = 0; - sprite->data[3] = gObjectBankIDs[gAnimBankAttacker]; + sprite->data[3] = gBankSpriteIds[gAnimBankAttacker]; StoreSpriteCallbackInData(sprite, sub_80CD81C); sprite->callback = sub_8078458; } @@ -55,7 +55,7 @@ void sub_80CD81C(struct Sprite* sprite) { if (sprite->data[0] == 0) { - sprite->data[3] = gObjectBankIDs[gAnimBankAttacker]; + sprite->data[3] = gBankSpriteIds[gAnimBankAttacker]; sub_8078E70(sprite->data[3], 0); sprite->data[4] = (sprite->data[6] = GetBankSide(gAnimBankAttacker)) ? 0x300 : 0xFFFFFD00; sprite->data[5] = 0; @@ -76,7 +76,7 @@ void sub_80CD8A8(struct Sprite* sprite) sprite->data[0] = 4; sprite->data[1] = (GetBankSide(gAnimBankAttacker)) ? -3 : 3; sprite->data[2] = 0; - sprite->data[3] = gObjectBankIDs[gAnimBankAttacker]; + sprite->data[3] = gBankSpriteIds[gAnimBankAttacker]; StoreSpriteCallbackInData(sprite, sub_80CD9B8); sprite->callback = sub_8078458; } @@ -94,7 +94,7 @@ void sub_80CD91C(struct Sprite* sprite) { if (sprite->data[0] == 0) { - sprite->data[3] = gObjectBankIDs[gAnimBankAttacker]; + sprite->data[3] = gBankSpriteIds[gAnimBankAttacker]; sprite->data[6] = GetBankSide(gAnimBankAttacker); if (GetBankSide(gAnimBankAttacker)) { diff --git a/src/battle/anim/lunge_2.c b/src/battle/anim/lunge_2.c index fe2470567..f222b291d 100644 --- a/src/battle/anim/lunge_2.c +++ b/src/battle/anim/lunge_2.c @@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; static void sub_80CDB60(u8 taskId); static void sub_80CDD20(u8 taskId); @@ -20,7 +20,7 @@ void sub_80CDAC8(u8 taskId) { u8 a; - gTasks[taskId].data[0] = gObjectBankIDs[gAnimBankAttacker]; + gTasks[taskId].data[0] = gBankSpriteIds[gAnimBankAttacker]; a = GetBankSide(gAnimBankAttacker); gTasks[taskId].data[1] = a; gTasks[taskId].data[2] = 0; diff --git a/src/battle/anim/powder.c b/src/battle/anim/powder.c index a0be20d6f..5d67311dc 100644 --- a/src/battle/anim/powder.c +++ b/src/battle/anim/powder.c @@ -6,12 +6,17 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; -static void sub_80CA768(struct Sprite* sprite); +static void AnimMovePowderParticleStep(struct Sprite* sprite); -// powder +// Animates the falling particles that horizontally wave back and forth. // Used by Sleep Powder, Stun Spore, and Poison Powder. - -void sub_80CA710(struct Sprite* sprite) +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: total duration in frames +// arg 3: vertical movement speed (sub-pixel value) +// arg 4: wave amplitude +// arg 5: wave speed +void AnimMovePowderParticle(struct Sprite* sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -28,10 +33,10 @@ void sub_80CA710(struct Sprite* sprite) } sprite->data[4] = gBattleAnimArgs[5]; - sprite->callback = sub_80CA768; + sprite->callback = AnimMovePowderParticleStep; } -void sub_80CA768(struct Sprite* sprite) +static void AnimMovePowderParticleStep(struct Sprite* sprite) { if (sprite->data[0] > 0) { diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c index 6617183cb..37c527183 100644 --- a/src/battle/anim/psychic.c +++ b/src/battle/anim/psychic.c @@ -14,7 +14,7 @@ extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; extern u16 gBattle_BG1_X; extern u16 gBattle_BG2_X; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern const union AffineAnimCmd *const gUnknown_083DA888[]; extern struct AffineAnimFrameCmd gUnknown_083DA8A4; @@ -53,11 +53,11 @@ void sub_80DB74C(struct Sprite *sprite) u8 toBG_2 = (identity ^ var0) != 0; if (IsAnimBankSpriteVisible(bank)) - sub_8076034(bank, toBG_2); + MoveBattlerSpriteToBG(bank, toBG_2); bank = bankCopy ^ 2; if (IsAnimBankSpriteVisible(bank)) - sub_8076034(bank, toBG_2 ^ var0); + MoveBattlerSpriteToBG(bank, toBG_2 ^ var0); } if (!IsContest() && IsDoubleBattle()) @@ -134,11 +134,11 @@ static void sub_80DB92C(struct Sprite *sprite) u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1); if (IsAnimBankSpriteVisible(bank)) - gSprites[gObjectBankIDs[bank]].invisible = 0; + gSprites[gBankSpriteIds[bank]].invisible = 0; bank = bankCopy ^ 2; if (IsAnimBankSpriteVisible(bank)) - gSprites[gObjectBankIDs[bank]].invisible = 0; + gSprites[gBankSpriteIds[bank]].invisible = 0; } sprite->invisible = 1; diff --git a/src/battle/anim/ring.c b/src/battle/anim/ring.c index 915cadcbc..759652f0c 100644 --- a/src/battle/anim/ring.c +++ b/src/battle/anim/ring.c @@ -10,7 +10,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; static void sub_80D1098(struct Sprite* sprite); @@ -94,23 +94,23 @@ void sub_80D10B8(struct Sprite* sprite) { r9 = GetBankPosition(bankr7, r10) + gBattleAnimArgs[0]; if (IsAnimBankSpriteVisible(bankr8 ^ 2)) - sprite->subpriority = gSprites[gObjectBankIDs[bankr8 ^ 2]].subpriority - 1; + sprite->subpriority = gSprites[gBankSpriteIds[bankr8 ^ 2]].subpriority - 1; else - sprite->subpriority = gSprites[gObjectBankIDs[bankr8]].subpriority - 1; + sprite->subpriority = gSprites[gBankSpriteIds[bankr8]].subpriority - 1; } else { r9 = GetBankPosition(bankr7, r10) - gBattleAnimArgs[0]; if (gMain.inBattle && IsAnimBankSpriteVisible(bankr7 ^ 2)) { - if (gSprites[gObjectBankIDs[bankr7]].pos1.x < gSprites[gObjectBankIDs[bankr7 ^ 2]].pos1.x) - sprite->subpriority = gSprites[gObjectBankIDs[bankr7 ^ 2]].subpriority + 1; + if (gSprites[gBankSpriteIds[bankr7]].pos1.x < gSprites[gBankSpriteIds[bankr7 ^ 2]].pos1.x) + sprite->subpriority = gSprites[gBankSpriteIds[bankr7 ^ 2]].subpriority + 1; else - sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1; + sprite->subpriority = gSprites[gBankSpriteIds[bankr7]].subpriority - 1; } else { - sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1; + sprite->subpriority = gSprites[gBankSpriteIds[bankr7]].subpriority - 1; } } diff --git a/src/battle/anim/unused_4.c b/src/battle/anim/unused_4.c index bda476a0a..50ffaba4a 100644 --- a/src/battle/anim/unused_4.c +++ b/src/battle/anim/unused_4.c @@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; static void sub_80CD9D4(struct Sprite* sprite); @@ -27,7 +27,7 @@ void sub_80CD9D4(struct Sprite* sprite) { case 0: sprite->data[1] = 0; - sprite->data[2] = gObjectBankIDs[gAnimBankAttacker]; + sprite->data[2] = gBankSpriteIds[gAnimBankAttacker]; sprite->data[3] = GetBankSide(gAnimBankAttacker); sprite->data[4] = (sprite->data[3] != 0) ? 0x200 : -0x200; sprite->data[5] = 0; diff --git a/src/battle/anim/unused_7.c b/src/battle/anim/unused_7.c index 2be6e7633..5a2de33c3 100644 --- a/src/battle/anim/unused_7.c +++ b/src/battle/anim/unused_7.c @@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; // unused_7 @@ -32,7 +32,7 @@ void sub_80CF3C4(struct Sprite* sprite) u8 a; sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); - a = gObjectBankIDs[gAnimBankTarget]; + a = gBankSpriteIds[gAnimBankTarget]; if (GetBankSide(gAnimBankAttacker) != 0) { sprite->pos1.x -= gBattleAnimArgs[0]; diff --git a/src/battle/anim/wisp_fire.c b/src/battle/anim/wisp_fire.c index 348ce6426..24cecb60c 100644 --- a/src/battle/anim/wisp_fire.c +++ b/src/battle/anim/wisp_fire.c @@ -10,7 +10,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankTarget; extern u8 gAnimBankAttacker; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern s8 gUnknown_083D9794[16]; extern s8 gUnknown_083D97A4[16]; @@ -175,7 +175,7 @@ void sub_80D60B4(u8 taskId) } gTasks[taskId].data[0]++; - spriteId = gObjectBankIDs[gAnimBankTarget]; + spriteId = gBankSpriteIds[gAnimBankTarget]; if (!gTasks[taskId].data[4]) unk = gUnknown_083D9794[gTasks[taskId].data[0] % 10]; diff --git a/src/battle/anim/withdraw.c b/src/battle/anim/withdraw.c index e67248b9f..933c97fa9 100644 --- a/src/battle/anim/withdraw.c +++ b/src/battle/anim/withdraw.c @@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; static void sub_80CF514(u8 taskId); @@ -17,13 +17,13 @@ static void sub_80CF514(u8 taskId); void sub_80CF4D8(u8 taskId) { - sub_8078E70(gObjectBankIDs[gAnimBankAttacker], 0); + sub_8078E70(gBankSpriteIds[gAnimBankAttacker], 0); gTasks[taskId].func = sub_80CF514; } void sub_80CF514(u8 taskId) { - u8 a = gObjectBankIDs[gAnimBankAttacker]; + u8 a = gBankSpriteIds[gAnimBankAttacker]; s16 b; if (GetBankSide(gAnimBankAttacker) == 0) { diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index b09d9ad8d..61cd583ba 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -88,7 +88,7 @@ extern u16 gBattlePartyID[]; extern u8 gCurrentActionFuncId; extern u8 gBanksByTurnOrder[]; extern struct UnknownStruct12 gUnknown_02024AD0[]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u16 gCurrentMove; // This is mis-named. It is a species, not a move ID. extern u8 gLastUsedAbility; extern u8 gStringBank; @@ -4671,7 +4671,7 @@ void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d) } else { - objectID = gObjectBankIDs[bank]; + objectID = gBankSpriteIds[bank]; ewram17810[bank].unk3 = spriteId; ewram17810[bank].unk0_2 = 1; gSprites[spriteId].data[0] = 0xC0; diff --git a/src/battle/battle_7.c b/src/battle/battle_7.c index b4c71b9c2..85c1d4aed 100644 --- a/src/battle/battle_7.c +++ b/src/battle/battle_7.c @@ -26,7 +26,7 @@ extern u8 gActiveBank; extern u8 gNoOfAllBanks; extern u16 gBattlePartyID[]; extern u8 gBanksBySide[]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u16 gUnknown_02024DE8; extern u8 gDoingBattleAnim; extern u32 gTransformedPersonalities[]; @@ -169,9 +169,9 @@ bool8 move_anim_start_t3(u8 a, u8 b, u8 c, u8 d, u16 e) } if (ewram17800[a].substituteSprite && sub_803163C(d) == 0) return TRUE; - if (ewram17800[a].substituteSprite && d == 2 && gSprites[gObjectBankIDs[a]].invisible) + if (ewram17800[a].substituteSprite && d == 2 && gSprites[gBankSpriteIds[a]].invisible) { - refresh_graphics_maybe(a, 1, gObjectBankIDs[a]); + refresh_graphics_maybe(a, 1, gBankSpriteIds[a]); sub_80324E0(a); return TRUE; } @@ -592,12 +592,12 @@ void sub_8031F24(void) s32 i; for (i = 0; i < gNoOfAllBanks; i++) - ewram17800[i].invisible = gSprites[gObjectBankIDs[i]].invisible; + ewram17800[i].invisible = gSprites[gBankSpriteIds[i]].invisible; } void sub_8031F88(u8 a) { - ewram17800[a].invisible = gSprites[gObjectBankIDs[a]].invisible; + ewram17800[a].invisible = gSprites[gBankSpriteIds[a]].invisible; } void sub_8031FC4(u8 a, u8 b, bool8 c) @@ -611,7 +611,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) if (c) { - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], ewram17840.unk0); + StartSpriteAnim(&gSprites[gBankSpriteIds[a]], ewram17840.unk0); paletteOffset = 0x100 + a * 16; LoadPalette(ewram16400 + ewram17840.unk0 * 32, paletteOffset, 32); gBattleMonForms[a] = ewram17840.unk0; @@ -620,7 +620,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) BlendPalette(paletteOffset, 16, 6, 0x7FFF); CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); } - gSprites[gObjectBankIDs[a]].pos1.y = sub_8077F68(a); + gSprites[gBankSpriteIds[a]].pos1.y = sub_8077F68(a); } else { @@ -673,7 +673,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) gTransformedPersonalities[a]); } } - DmaCopy32Defvars(3, gUnknown_081FAF4C[r10], (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32), 0x800); + DmaCopy32Defvars(3, gUnknown_081FAF4C[r10], (void *)(VRAM + 0x10000 + gSprites[gBankSpriteIds[a]].oam.tileNum * 32), 0x800); paletteOffset = 0x100 + a * 16; lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); LZDecompressWram(lzPaletteData, gSharedMem); @@ -692,8 +692,8 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) ewram17800[a].transformedSpecies = species; gBattleMonForms[a] = gBattleMonForms[b]; } - gSprites[gObjectBankIDs[a]].pos1.y = sub_8077F68(a); - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); + gSprites[gBankSpriteIds[a]].pos1.y = sub_8077F68(a); + StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]); } } @@ -833,15 +833,15 @@ void sub_80326EC(u8 a) { if (IsBankSpritePresent(i) != 0) { - gSprites[gObjectBankIDs[i]].oam.affineMode = a; + gSprites[gBankSpriteIds[i]].oam.affineMode = a; if (a == 0) { - ewram17810[i].unk6 = gSprites[gObjectBankIDs[i]].oam.matrixNum; - gSprites[gObjectBankIDs[i]].oam.matrixNum = 0; + ewram17810[i].unk6 = gSprites[gBankSpriteIds[i]].oam.matrixNum; + gSprites[gBankSpriteIds[i]].oam.matrixNum = 0; } else { - gSprites[gObjectBankIDs[i]].oam.matrixNum = ewram17810[i].unk6; + gSprites[gBankSpriteIds[i]].oam.matrixNum = ewram17810[i].unk6; } } } @@ -867,7 +867,7 @@ void sub_80328A4(struct Sprite *sprite) { bool8 invisible = FALSE; u8 r4 = sprite->data[0]; - struct Sprite *r7 = &gSprites[gObjectBankIDs[r4]]; + struct Sprite *r7 = &gSprites[gBankSpriteIds[r4]]; if (!r7->inUse || IsBankSpritePresent(r4) == 0) { diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c index 476f2c910..03ce1798f 100644 --- a/src/battle/battle_anim.c +++ b/src/battle/battle_anim.c @@ -14,6 +14,7 @@ #include "task.h" #include "ewram.h" #include "graphics.h" +#include "constants/battle_anim.h" // sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. #define GET_TRUE_SPRITE_INDEX(i) (i - 10000) @@ -1287,7 +1288,7 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] = }; extern u16 gBattlePartyID[4]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u8 gBankAttacker; extern u8 gBankTarget; EWRAM_DATA const u8 *sBattleAnimScriptPtr = NULL; @@ -1608,28 +1609,28 @@ static void RunAnimScriptCommand(void) static void ScriptCmd_loadspritegfx(void) { - u16 index; + u16 tag; sBattleAnimScriptPtr++; - index = T1_READ_16(sBattleAnimScriptPtr); - LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); - LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); + tag = T1_READ_16(sBattleAnimScriptPtr); + LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)]); + LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(tag)]); sBattleAnimScriptPtr += 2; - AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); + AddSpriteIndex(GET_TRUE_SPRITE_INDEX(tag)); gAnimFramesToWait = 1; gAnimScriptCallback = WaitAnimFrameCount; } static void ScriptCmd_unloadspritegfx(void) { - u16 index; + u16 tag; sBattleAnimScriptPtr++; - index = T1_READ_16(sBattleAnimScriptPtr); - FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); - FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); + tag = T1_READ_16(sBattleAnimScriptPtr); + FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)].tag); sBattleAnimScriptPtr += 2; - ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); + ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(tag)); } static void ScriptCmd_createsprite(void) @@ -1811,7 +1812,7 @@ static void ScriptCmd_monbg(void) u8 bank; u8 identity; bool8 toBG_2; - u16 r4; + u16 spriteId; u8 taskId; sBattleAnimScriptPtr++; @@ -1835,12 +1836,12 @@ static void ScriptCmd_monbg(void) else toBG_2 = 1; - sub_8076034(bank, toBG_2); - r4 = gObjectBankIDs[bank]; + MoveBattlerSpriteToBG(bank, toBG_2); + spriteId = gBankSpriteIds[bank]; taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); - gTasks[taskId].data[0] = r4; - gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x; - gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y; + gTasks[taskId].data[0] = spriteId; + gTasks[taskId].data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; + gTasks[taskId].data[2] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; if (toBG_2 == 0) { gTasks[taskId].data[3] = gBattle_BG1_X; @@ -1856,8 +1857,9 @@ static void ScriptCmd_monbg(void) gMonAnimTaskIdArray[0] = taskId; } + bank ^= 2; - if (animBank > 1 && IsAnimBankSpriteVisible(bank)) + if (animBank >= ANIM_BANK_ATK_PARTNER && IsAnimBankSpriteVisible(bank)) { identity = GetBankIdentity(bank); identity += 0xFF; @@ -1865,12 +1867,12 @@ static void ScriptCmd_monbg(void) toBG_2 = 0; else toBG_2 = 1; - sub_8076034(bank, toBG_2); - r4 = gObjectBankIDs[bank]; + MoveBattlerSpriteToBG(bank, toBG_2); + spriteId = gBankSpriteIds[bank]; taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); - gTasks[taskId].data[0] = r4; - gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x; - gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y; + gTasks[taskId].data[0] = spriteId; + gTasks[taskId].data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; + gTasks[taskId].data[2] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; if (toBG_2 == 0) { gTasks[taskId].data[3] = gBattle_BG1_X; @@ -1903,17 +1905,17 @@ bool8 IsAnimBankSpriteVisible(u8 bank) return FALSE; if (IsContest()) return TRUE; // this line wont ever be reached. - if (!(EWRAM_17800[bank].unk0 & 1) || !gSprites[gObjectBankIDs[bank]].invisible) + if (!(EWRAM_17800[bank].unk0 & 1) || !gSprites[gBankSpriteIds[bank]].invisible) return TRUE; return FALSE; } -void sub_8076034(u8 a, u8 b) +void MoveBattlerSpriteToBG(u8 bank, u8 toBG_2) { u8 spriteId; - if (b == 0) + if (toBG_2 == 0) { volatile u8 pointlessZero; struct UnknownStruct2 s; @@ -1929,23 +1931,23 @@ void sub_8076034(u8 a, u8 b) REG_BG1CNT_BITFIELD.screenSize = 1; REG_BG1CNT_BITFIELD.areaOverflowMode = 0; - spriteId = gObjectBankIDs[a]; + spriteId = gBankSpriteIds[bank]; gBattle_BG1_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; if (IsContest() != 0 && IsSpeciesNotUnown(EWRAM_19348) != 0) gBattle_BG1_X--; gBattle_BG1_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; - gSprites[gObjectBankIDs[a]].invisible = TRUE; + gSprites[gBankSpriteIds[bank]].invisible = TRUE; REG_BG1HOFS = gBattle_BG1_X; REG_BG1VOFS = gBattle_BG1_Y; - LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32); - DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + a * 16, (u16 *)PLTT + s.unk8 * 16, 32); + LoadPalette(gPlttBufferUnfaded + 0x100 + bank * 16, s.unk8 * 16, 32); + DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + bank * 16, (u16 *)PLTT + s.unk8 * 16, 32); if (IsContest() != 0) r2 = 0; else - r2 = GetBankIdentity(a); + r2 = GetBankIdentity(bank); sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock); if (IsContest() != 0) sub_8076380(); @@ -1963,18 +1965,18 @@ void sub_8076034(u8 a, u8 b) REG_BG2CNT_BITFIELD.screenSize = 1; REG_BG2CNT_BITFIELD.areaOverflowMode = 0; - spriteId = gObjectBankIDs[a]; + spriteId = gBankSpriteIds[bank]; gBattle_BG2_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; gBattle_BG2_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; - gSprites[gObjectBankIDs[a]].invisible = TRUE; + gSprites[gBankSpriteIds[bank]].invisible = TRUE; REG_BG2HOFS = gBattle_BG2_X; REG_BG2VOFS = gBattle_BG2_Y; - LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32); - DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + a * 16, (void *)(PLTT + 0x120), 32); + LoadPalette(gPlttBufferUnfaded + 0x100 + bank * 16, 0x90, 32); + DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + bank * 16, (void *)(PLTT + 0x120), 32); - sub_80E4EF8(0, 0, GetBankIdentity(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock); + sub_80E4EF8(0, 0, GetBankIdentity(bank), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock); } } @@ -2097,9 +2099,9 @@ static void ScriptCmd_clearmonbg(void) bank = gAnimBankTarget; if (gMonAnimTaskIdArray[0] != 0xFF) - gSprites[gObjectBankIDs[bank]].invisible = FALSE; + gSprites[gBankSpriteIds[bank]].invisible = FALSE; if (animBankId > 1 && gMonAnimTaskIdArray[1] != 0xFF) - gSprites[gObjectBankIDs[bank ^ 2]].invisible = FALSE; + gSprites[gBankSpriteIds[bank ^ 2]].invisible = FALSE; else animBankId = 0; @@ -2167,8 +2169,8 @@ static void ScriptCmd_monbg_22(void) r1 = 0; else r1 = 1; - sub_8076034(bank, r1); - gSprites[gObjectBankIDs[bank]].invisible = FALSE; + MoveBattlerSpriteToBG(bank, r1); + gSprites[gBankSpriteIds[bank]].invisible = FALSE; } bank ^= 2; @@ -2180,8 +2182,8 @@ static void ScriptCmd_monbg_22(void) r1 = 0; else r1 = 1; - sub_8076034(bank, r1); - gSprites[gObjectBankIDs[bank]].invisible = FALSE; + MoveBattlerSpriteToBG(bank, r1); + gSprites[gBankSpriteIds[bank]].invisible = FALSE; } sBattleAnimScriptPtr++; } @@ -2206,9 +2208,9 @@ static void ScriptCmd_clearmonbg_23(void) bank = gAnimBankTarget; if (IsAnimBankSpriteVisible(bank)) - gSprites[gObjectBankIDs[bank]].invisible = FALSE; + gSprites[gBankSpriteIds[bank]].invisible = FALSE; if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ 2)) - gSprites[gObjectBankIDs[bank ^ 2]].invisible = FALSE; + gSprites[gBankSpriteIds[bank ^ 2]].invisible = FALSE; else animBankId = 0; @@ -2245,13 +2247,13 @@ static void sub_80769A4(u8 taskId) static void ScriptCmd_setalpha(void) { - u16 half1, half2; + u16 spriteAlpha, bgAlpha; sBattleAnimScriptPtr++; - half1 = *(sBattleAnimScriptPtr++); - half2 = *(sBattleAnimScriptPtr++) << 8; - REG_BLDCNT = 0x3F40; - REG_BLDALPHA = half1 | half2; + spriteAlpha = *(sBattleAnimScriptPtr++); + bgAlpha = *(sBattleAnimScriptPtr++) << 8; + REG_BLDCNT = BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND; + REG_BLDALPHA = spriteAlpha | bgAlpha; } static void ScriptCmd_setbldcnt(void) @@ -2700,13 +2702,13 @@ s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan) static void ScriptCmd_playsewithpan(void) { - u16 songId; + u16 soundId; s8 pan; sBattleAnimScriptPtr++; - songId = T1_READ_16(sBattleAnimScriptPtr); + soundId = T1_READ_16(sBattleAnimScriptPtr); pan = T1_READ_8(sBattleAnimScriptPtr + 2); - PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan)); + PlaySE12WithPanning(soundId, BattleAnimAdjustPanning(pan)); sBattleAnimScriptPtr += 3; } diff --git a/src/battle/battle_anim_807B69C.c b/src/battle/battle_anim_807B69C.c index 058a45769..6043efb0c 100644 --- a/src/battle/battle_anim_807B69C.c +++ b/src/battle/battle_anim_807B69C.c @@ -15,7 +15,7 @@ extern bool8 gAnimScriptActive; extern void (*gAnimScriptCallback)(void); extern s16 gBattleAnimArgs[]; extern u8 gAnimBankTarget; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; extern const u8 *const gBattleAnims_StatusConditions[]; @@ -72,7 +72,7 @@ static void sub_807BDAC(u8); u8 unref_sub_807B69C(u8 a, u8 b) { - u8 spriteId1 = gObjectBankIDs[a]; + u8 spriteId1 = gBankSpriteIds[a]; u8 taskId = CreateTask(sub_807B7E0, 10); u8 spriteId2; u8 i; diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index f109333e3..2f10b07ae 100644 --- a/src/battle/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -9,13 +9,13 @@ extern s16 gBattleAnimArgs[8]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern s32 gAnimMoveDmg; extern u16 gAnimMovePower; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -static void sub_80A7EF0(u8 taskId); +static void AnimTask_ShakeMonStep(u8 taskId); static void sub_80A808C(u8 taskId); static void sub_80A81D8(u8 taskId); static void sub_80A8374(u8 taskId); @@ -91,28 +91,35 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C2010 = .callback = sub_80A8818, }; -void sub_80A7E7C(u8 taskId) +// Task to facilitate simple shaking of a pokemon's picture in battle. +// The shaking alternates between the original position and the target position. +// arg 0: anim battler +// arg 1: x pixel offset +// arg 2: y pixel offset +// arg 3: num times to shake +// arg 4: frame delay +void AnimTask_ShakeMon(u8 taskId) { - u8 sprite; - sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); - if (sprite == 0xff) + u8 spriteId; + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); + if (spriteId == 0xff) { DestroyAnimVisualTask(taskId); return; } - gSprites[sprite].pos2.x = gBattleAnimArgs[1]; - gSprites[sprite].pos2.y = gBattleAnimArgs[2]; - TASK.data[0] = sprite; + gSprites[spriteId].pos2.x = gBattleAnimArgs[1]; + gSprites[spriteId].pos2.y = gBattleAnimArgs[2]; + TASK.data[0] = spriteId; TASK.data[1] = gBattleAnimArgs[3]; TASK.data[2] = gBattleAnimArgs[4]; TASK.data[3] = gBattleAnimArgs[4]; TASK.data[4] = gBattleAnimArgs[1]; TASK.data[5] = gBattleAnimArgs[2]; - TASK.func = sub_80A7EF0; - sub_80A7EF0(taskId); + TASK.func = AnimTask_ShakeMonStep; + AnimTask_ShakeMonStep(taskId); } -static void sub_80A7EF0(u8 taskId) +static void AnimTask_ShakeMonStep(u8 taskId) { if (TASK.data[3] == 0) { @@ -185,11 +192,11 @@ void sub_80A7FA0(u8 taskId) { r6 = 1; } - sprite = gObjectBankIDs[side]; + sprite = gBankSpriteIds[side]; } else { - sprite = gObjectBankIDs[gAnimBankAttacker]; + sprite = gBankSpriteIds[gAnimBankAttacker]; } if (r6) { @@ -408,7 +415,7 @@ static void sub_80A8530(struct Sprite *sprite) } sprite->data[0] = gBattleAnimArgs[0]; sprite->data[2] = 0; - sprite->data[3] = gObjectBankIDs[gAnimBankAttacker]; + sprite->data[3] = gBankSpriteIds[gAnimBankAttacker]; sprite->data[4] = gBattleAnimArgs[0]; StoreSpriteCallbackInData(sprite, sub_80A85A4); sprite->callback = sub_8078458; @@ -450,11 +457,11 @@ static void sub_80A8638(struct Sprite *sprite) int spriteId; if (!gBattleAnimArgs[0]) { - spriteId = gObjectBankIDs[gAnimBankAttacker]; + spriteId = gBankSpriteIds[gAnimBankAttacker]; } else { - spriteId = gObjectBankIDs[gAnimBankTarget]; + spriteId = gBankSpriteIds[gAnimBankTarget]; } sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; @@ -523,7 +530,7 @@ static void sub_80A8764(struct Sprite *sprite) { v1 = gAnimBankTarget; } - spriteId = gObjectBankIDs[v1]; + spriteId = gBankSpriteIds[v1]; if (GetBankSide(v1)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; @@ -559,7 +566,7 @@ static void sub_80A8818(struct Sprite *sprite) { v1 = gAnimBankTarget; } - spriteId = gObjectBankIDs[v1]; + spriteId = gBankSpriteIds[v1]; if (GetBankSide(v1)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; @@ -668,7 +675,7 @@ void sub_80A8A80(u8 taskId) DestroyAnimVisualTask(taskId); return; } - spriteId = gObjectBankIDs[gAnimBankAttacker ^ 2]; + spriteId = gBankSpriteIds[gAnimBankAttacker ^ 2]; break; case 3: if (!IsAnimBankSpriteVisible(gAnimBankTarget ^ 2)) @@ -676,7 +683,7 @@ void sub_80A8A80(u8 taskId) DestroyAnimVisualTask(taskId); return; } - spriteId = gObjectBankIDs[gAnimBankTarget ^ 2]; + spriteId = gBankSpriteIds[gAnimBankTarget ^ 2]; break; default: DestroyAnimVisualTask(taskId); diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c index 40f50d7ff..604c21e6d 100644 --- a/src/battle/battle_controller_linkopponent.c +++ b/src/battle/battle_controller_linkopponent.c @@ -27,7 +27,7 @@ struct MovePpInfo extern u8 gActiveBank; extern u8 gBattleBufferA[][0x200]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u16 gBattlePartyID[]; extern u8 gHealthboxIDs[]; extern u16 gBattleTypeFlags; @@ -266,18 +266,18 @@ void sub_803752C(void) void sub_803757C(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) LinkOpponentBufferExecCompleted(); } void sub_80375B4(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) { - sub_8031B74(gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam); - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = gSprites[gObjectBankIDs[gActiveBank]].data[5]; - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8031B74(gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam); + gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = gSprites[gBankSpriteIds[gActiveBank]].data[5]; + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); LinkOpponentBufferExecCompleted(); } } @@ -381,8 +381,8 @@ void sub_8037840(void) void sub_8037A74(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].animEnded == TRUE - && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0) + if (gSprites[gBankSpriteIds[gActiveBank]].animEnded == TRUE + && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0) { if (!ewram17810[gActiveBank].unk0_7) { @@ -414,7 +414,7 @@ void sub_8037B24(void) void sub_8037B78(void) { - if (!gSprites[gObjectBankIDs[gActiveBank]].inUse) + if (!gSprites[gBankSpriteIds[gActiveBank]].inUse) { sub_8043DB0(gHealthboxIDs[gActiveBank]); LinkOpponentBufferExecCompleted(); @@ -425,8 +425,8 @@ void sub_8037BBC(void) { if (!ewram17810[gActiveBank].unk0_6) { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8032A08(gActiveBank); sub_8043DB0(gHealthboxIDs[gActiveBank]); LinkOpponentBufferExecCompleted(); @@ -441,7 +441,7 @@ void sub_8037C2C(void) void dp01t_0F_4_move_anim(void) { - u8 spriteId = gObjectBankIDs[gActiveBank]; + u8 spriteId = gBankSpriteIds[gActiveBank]; if (gSprites[spriteId].data[1] == 32) { @@ -485,7 +485,7 @@ void sub_8037D64(void) ewram17810[gActiveBank].unk1_0 = 0; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0); + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0); sub_8045A5C( gHealthboxIDs[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], @@ -1155,15 +1155,15 @@ void LinkOpponentHandleLoadPokeSprite(void) BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank); GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, GetBankPosition(gActiveBank, 2), sub_8077F68(gActiveBank), sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); gBattleBankFunc[gActiveBank] = sub_8037A74; } @@ -1185,18 +1185,18 @@ void sub_8039430(u8 a, u8 b) gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[a]], a); GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); - gObjectBankIDs[a] = CreateSprite( + gBankSpriteIds[a] = CreateSprite( &gUnknown_02024E8C, GetBankPosition(a, 2), sub_8077F68(a), sub_8079E90(a)); - gSprites[gUnknown_0300434C[a]].data[1] = gObjectBankIDs[a]; - gSprites[gObjectBankIDs[a]].data[0] = a; - gSprites[gObjectBankIDs[a]].data[2] = species; - gSprites[gObjectBankIDs[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); - gSprites[gObjectBankIDs[a]].invisible = TRUE; - gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[a]].data[1] = gBankSpriteIds[a]; + gSprites[gBankSpriteIds[a]].data[0] = a; + gSprites[gBankSpriteIds[a]].data[2] = species; + gSprites[gBankSpriteIds[a]].oam.paletteNum = a; + StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]); + gSprites[gBankSpriteIds[a]].invisible = TRUE; + gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy; gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFE); } @@ -1209,8 +1209,8 @@ void LinkOpponentHandleReturnPokeToBall(void) } else { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8032A08(gActiveBank); sub_8043DB0(gHealthboxIDs[gActiveBank]); LinkOpponentBufferExecCompleted(); @@ -1257,17 +1257,17 @@ void LinkOpponentHandleTrainerThrow(void) } sub_8031A6C(gender, gActiveBank); GetMonSpriteTemplate_803C5A0(gender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, 176 + xOffset, 40 + 4 * (8 - gTrainerFrontPicCoords[gender].coords), sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[gender].tag); - gSprites[gObjectBankIDs[gActiveBank]].data[5] = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[gender].tag); - gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = gender; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[gender].tag); + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum; + gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[gender].tag); + gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = gender; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_803757C; } @@ -1278,12 +1278,12 @@ void LinkOpponentHandleTrainerSlide(void) void LinkOpponentHandleTrainerSlideBack(void) { - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = 280; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_80375B4; } @@ -1299,7 +1299,7 @@ void LinkOpponentHandlecmd10(void) { ewram17810[gActiveBank].unk4 = 0; PlaySE12WithPanning(SE_POKE_DEAD, 63); - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8010384; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8010384; gBattleBankFunc[gActiveBank] = sub_8037B78; } } @@ -1574,14 +1574,14 @@ void LinkOpponentHandlecmd40(void) void LinkOpponentHandleHitAnimation(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE) { LinkOpponentBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; - gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; sub_8047858(gActiveBank); gBattleBankFunc[gActiveBank] = dp01t_0F_4_move_anim; } @@ -1629,12 +1629,12 @@ void LinkOpponentHandleTrainerBallThrow(void) { u8 taskId; - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = 280; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_803A3A8); taskId = CreateTask(sub_803A2C4, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -1733,7 +1733,7 @@ void LinkOpponentHandleSpriteInvisibility(void) { if (IsBankSpritePresent(gActiveBank) != 0) { - gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); } LinkOpponentBufferExecCompleted(); diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c index 3a16e12e6..e1f93ba08 100644 --- a/src/battle/battle_controller_linkpartner.c +++ b/src/battle/battle_controller_linkpartner.c @@ -35,7 +35,7 @@ extern u8 gBattleBufferA[][0x200]; extern u8 gActiveBank; extern u32 gBattleExecBuffer; extern u16 gBattlePartyID[]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u8 gBattleOutcome; extern u16 gUnknown_02024DE8; extern u8 gUnknown_02024E68[]; @@ -260,17 +260,17 @@ void LinkPartnerBufferRunCommand(void) void sub_811DAE4(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) LinkPartnerBufferExecCompleted(); } void sub_811DB1C(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) { nullsub_10(0); - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); LinkPartnerBufferExecCompleted(); } } @@ -338,8 +338,8 @@ void sub_811DCA0(void) void sub_811DDE8(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].animEnded - && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0) + if (gSprites[gBankSpriteIds[gActiveBank]].animEnded + && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0) LinkPartnerBufferExecCompleted(); } @@ -362,11 +362,11 @@ void bx_t3_healthbar_update(void) void sub_811DE98(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].pos1.y + gSprites[gObjectBankIDs[gActiveBank]].pos2.y > 160) + if (gSprites[gBankSpriteIds[gActiveBank]].pos1.y + gSprites[gBankSpriteIds[gActiveBank]].pos2.y > 160) { nullsub_9(GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); - FreeOamMatrix(gSprites[gObjectBankIDs[gActiveBank]].oam.matrixNum); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBank]].oam.matrixNum); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8043DB0(gHealthboxIDs[gActiveBank]); LinkPartnerBufferExecCompleted(); } @@ -376,8 +376,8 @@ void sub_811DF34(void) { if (!ewram17810[gActiveBank].unk0_6) { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8043DB0(gHealthboxIDs[gActiveBank]); LinkPartnerBufferExecCompleted(); } @@ -391,7 +391,7 @@ void sub_811DFA0(void) void bx_blink_t3(void) { - u8 spriteId = gObjectBankIDs[gActiveBank]; + u8 spriteId = gBankSpriteIds[gActiveBank]; if (gSprites[spriteId].data[1] == 32) { gSprites[spriteId].data[1] = 0; @@ -435,7 +435,7 @@ void sub_811E0CC(void) FreeSpritePaletteByTag(0x27F9); CreateTask(c3_0802FDF4, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0); + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0); sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); sub_804777C(gActiveBank); sub_8043DFC(gHealthboxIDs[gActiveBank]); @@ -1104,15 +1104,15 @@ void LinkPartnerHandleLoadPokeSprite(void) GetMonSpriteTemplate_803C56C( GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, GetBankPosition(gActiveBank, 2), sub_8077F68(gActiveBank), sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); gBattleBankFunc[gActiveBank] = sub_811DDE8; } @@ -1134,18 +1134,18 @@ void sub_811F864(u8 a, u8 b) species = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_SPECIES); gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); - gObjectBankIDs[a] = CreateSprite( + gBankSpriteIds[a] = CreateSprite( &gUnknown_02024E8C, GetBankPosition(a, 2), sub_8077F68(a), sub_8079E90(a)); - gSprites[gUnknown_0300434C[a]].data[1] = gObjectBankIDs[a]; - gSprites[gObjectBankIDs[a]].data[0] = a; - gSprites[gObjectBankIDs[a]].data[2] = species; - gSprites[gObjectBankIDs[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); - gSprites[gObjectBankIDs[a]].invisible = TRUE; - gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[a]].data[1] = gBankSpriteIds[a]; + gSprites[gBankSpriteIds[a]].data[0] = a; + gSprites[gBankSpriteIds[a]].data[2] = species; + gSprites[gBankSpriteIds[a]].oam.paletteNum = a; + StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]); + gSprites[gBankSpriteIds[a]].invisible = TRUE; + gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy; gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFF); } @@ -1158,8 +1158,8 @@ void LinkPartnerHandleReturnPokeToBall(void) } else { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8043DB0(gHealthboxIDs[gActiveBank]); LinkPartnerBufferExecCompleted(); } @@ -1205,14 +1205,14 @@ void LinkPartnerHandleTrainerThrow(void) } LoadPlayerTrainerBankSprite(gender, gActiveBank); GetMonSpriteTemplate_803C5A0(gender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, 80 + xOffset, 80 + 4 * (8 - gTrainerBackPicCoords[gender].coords), sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_811DAE4; } @@ -1223,12 +1223,12 @@ void LinkPartnerHandleTrainerSlide(void) void LinkPartnerHandleTrainerSlideBack(void) { - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_811DB1C; } @@ -1245,9 +1245,9 @@ void LinkPartnerHandlecmd10(void) ewram17810[gActiveBank].unk4 = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, -64); - gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = 5; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 5; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80105EC; gBattleBankFunc[gActiveBank] = sub_811DE98; } } @@ -1519,14 +1519,14 @@ void LinkPartnerHandlecmd40(void) void LinkPartnerHandleHitAnimation(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE) { LinkPartnerBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; - gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; sub_8047858(gActiveBank); gBattleBankFunc[gActiveBank] = bx_blink_t3; } @@ -1575,19 +1575,19 @@ void LinkPartnerHandleTrainerBallThrow(void) u8 r4; u8 taskId; - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 50; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - gSprites[gObjectBankIDs[gActiveBank]].data[5] = gActiveBank; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38); + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); r4 = AllocSpritePalette(0xD6F9); LoadCompressedPalette( gTrainerBackPicPaletteTable[gLinkPlayers[sub_803FC34(gActiveBank)].gender].data, 0x100 + r4 * 16, 0x20); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = r4; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = r4; taskId = CreateTask(sub_812071C, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -1673,7 +1673,7 @@ void LinkPartnerHandleSpriteInvisibility(void) { if (IsBankSpritePresent(gActiveBank) != 0) { - gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); } LinkPartnerBufferExecCompleted(); diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index 338f8d418..5fb642e0c 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -34,7 +34,7 @@ extern u8 gUnknown_02023A14_50; extern u8 gActiveBank; extern u8 gBattleBufferA[][0x200]; extern u16 gBattlePartyID[]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u8 gBattleMonForms[]; extern struct SpriteTemplate gUnknown_02024E8C; extern void (*gBattleBankFunc[])(void); @@ -280,25 +280,25 @@ void OpponentBufferRunCommand(void) void sub_8032B4C(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) OpponentBufferExecCompleted(); } // Duplicate of sub_8032B4C void sub_8032B84(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) OpponentBufferExecCompleted(); } void sub_8032BBC(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) { - sub_8031B74(gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam); - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = gSprites[gObjectBankIDs[gActiveBank]].data[5]; - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8031B74(gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam); + gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = gSprites[gBankSpriteIds[gActiveBank]].data[5]; + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); OpponentBufferExecCompleted(); } } @@ -386,8 +386,8 @@ void sub_8032E2C(void) void sub_8033018(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].animEnded == TRUE - && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0) + if (gSprites[gBankSpriteIds[gActiveBank]].animEnded == TRUE + && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0) { if (!ewram17810[gActiveBank].unk0_7) { @@ -419,7 +419,7 @@ void sub_80330C8(void) void sub_803311C(void) { - if (!gSprites[gObjectBankIDs[gActiveBank]].inUse) + if (!gSprites[gBankSpriteIds[gActiveBank]].inUse) { sub_8043DB0(gHealthboxIDs[gActiveBank]); OpponentBufferExecCompleted(); @@ -430,8 +430,8 @@ void sub_8033160(void) { if (!ewram17810[gActiveBank].unk0_6) { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8032A08(gActiveBank); sub_8043DB0(gHealthboxIDs[gActiveBank]); OpponentBufferExecCompleted(); @@ -446,7 +446,7 @@ void sub_80331D0(void) void bx_blink_t7(void) { - u8 spriteId = gObjectBankIDs[gActiveBank]; + u8 spriteId = gBankSpriteIds[gActiveBank]; if (gSprites[spriteId].data[1] == 32) { @@ -490,7 +490,7 @@ void sub_8033308(void) ewram17810[gActiveBank].unk1_0 = 0; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0); + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0); sub_8045A5C( gHealthboxIDs[gActiveBank], &gEnemyParty[gBattlePartyID[gActiveBank]], @@ -1126,16 +1126,16 @@ void OpponentHandleLoadPokeSprite(void) BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank); GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, GetBankPosition(gActiveBank, 2), sub_8077F68(gActiveBank), sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = species; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]); + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = species; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]); sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES)); gBattleBankFunc[gActiveBank] = sub_8033018; } @@ -1158,18 +1158,18 @@ void sub_803495C(u8 a, u8 b) gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[a]], a); GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a)); - gObjectBankIDs[a] = CreateSprite( + gBankSpriteIds[a] = CreateSprite( &gUnknown_02024E8C, GetBankPosition(a, 2), sub_8077F68(a), sub_8079E90(a)); - gSprites[gObjectBankIDs[a]].data[0] = a; - gSprites[gObjectBankIDs[a]].data[2] = species; - gSprites[gUnknown_0300434C[a]].data[1] = gObjectBankIDs[a]; - gSprites[gObjectBankIDs[a]].oam.paletteNum = a; - StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]); - gSprites[gObjectBankIDs[a]].invisible = TRUE; - gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[a]].data[0] = a; + gSprites[gBankSpriteIds[a]].data[2] = species; + gSprites[gUnknown_0300434C[a]].data[1] = gBankSpriteIds[a]; + gSprites[gBankSpriteIds[a]].oam.paletteNum = a; + StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]); + gSprites[gBankSpriteIds[a]].invisible = TRUE; + gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy; gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFE); } @@ -1182,8 +1182,8 @@ void OpponentHandleReturnPokeToBall(void) } else { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8032A08(gActiveBank); sub_8043DB0(gHealthboxIDs[gActiveBank]); OpponentBufferExecCompleted(); @@ -1234,18 +1234,18 @@ void OpponentHandleTrainerThrow(void) sub_8031A6C(trainerPicIndex, gActiveBank); GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, 0xB0, 40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords), sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); - gSprites[gObjectBankIDs[gActiveBank]].data[5] = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); - gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = trainerPicIndex; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum; + gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); + gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicIndex; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_8032B4C; } @@ -1264,30 +1264,30 @@ void OpponentHandleTrainerSlide(void) sub_8031A6C(trainerPicIndex, gActiveBank); GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, 0xB0, 40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords), 0x1E); - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 96; - gSprites[gObjectBankIDs[gActiveBank]].pos1.x += 32; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2; - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); - gSprites[gObjectBankIDs[gActiveBank]].data[5] = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum; - gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); - gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = trainerPicIndex; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 96; + gSprites[gBankSpriteIds[gActiveBank]].pos1.x += 32; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag); + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum; + gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag); + gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicIndex; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_8032B84; } void OpponentHandleTrainerSlideBack(void) { - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = 280; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_8032BBC; } @@ -1303,7 +1303,7 @@ void OpponentHandlecmd10(void) { ewram17810[gActiveBank].unk4 = 0; PlaySE12WithPanning(SE_POKE_DEAD, 63); - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8010384; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8010384; gBattleBankFunc[gActiveBank] = sub_803311C; } } @@ -2166,14 +2166,14 @@ void OpponentHandlecmd40(void) void OpponentHandleHitAnimation(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE) { OpponentBufferExecCompleted(); } else { gDoingBattleAnim = TRUE; - gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; sub_8047858(gActiveBank); gBattleBankFunc[gActiveBank] = bx_blink_t7; } @@ -2221,12 +2221,12 @@ void OpponentHandleTrainerBallThrow(void) { u8 taskId; - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = 280; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8035C10); taskId = CreateTask(sub_8035C44, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -2325,7 +2325,7 @@ void OpponentHandleSpriteInvisibility(void) { if (IsBankSpritePresent(gActiveBank) != 0) { - gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); } OpponentBufferExecCompleted(); diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index e03e21849..33a29c064 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -53,7 +53,7 @@ extern u8 gBankInMenu; extern u16 gBattlePartyID[]; extern u8 gHealthboxIDs[]; extern u8 gDoingBattleAnim; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u16 gBattleTypeFlags; extern u8 gBattleOutcome; extern void (*gAnimScriptCallback)(void); @@ -143,7 +143,7 @@ extern bool8 gDoingBattleAnim; extern u16 gBattleTypeFlags; extern u32 gBattleExecBuffer; extern u8 gBattleBufferA[][0x200]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u8 gActionSelectionCursor[]; extern u8 gMoveSelectionCursor[]; extern u8 gAbsentBankFlags; @@ -370,7 +370,7 @@ void PlayerBufferRunCommand(void) void bx_0802E404(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0) + if (gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0) PlayerBufferExecCompleted(); } @@ -498,7 +498,7 @@ void sub_802C2EC(void) { DestroyMenuCursor(); PlaySE(SE_SELECT); - gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010574; + gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574; Emitcmd33(1, 10, gMoveSelectionCursor[gActiveBank] | (gUnknown_03004344 << 8)); dp11b_obj_free(gUnknown_03004344, 1); PlayerBufferExecCompleted(); @@ -507,7 +507,7 @@ void sub_802C2EC(void) else if (gMain.newKeys & B_BUTTON) { PlaySE(SE_SELECT); - gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010574; + gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574; gBattleBankFunc[gActiveBank] = sub_802C68C; dp11b_obj_instanciate(gActiveBank, 1, 7, 1); dp11b_obj_instanciate(gActiveBank, 0, 7, 1); @@ -516,7 +516,7 @@ void sub_802C2EC(void) else if (gMain.newKeys & 0x60) { PlaySE(SE_SELECT); - gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010574; + gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574; do { u8 var = GetBankIdentity(gUnknown_03004344); @@ -557,13 +557,13 @@ void sub_802C2EC(void) if (gAbsentBankFlags & gBitTable[gUnknown_03004344]) i = 0; } while (i == 0); - gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520; + gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520; } //_0802C540 else if (gMain.newKeys & 0x90) { PlaySE(SE_SELECT); - gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010574; + gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574; do { u8 var = GetBankIdentity(gUnknown_03004344); @@ -603,7 +603,7 @@ void sub_802C2EC(void) if (gAbsentBankFlags & gBitTable[gUnknown_03004344]) i = 0; } while (i == 0); - gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520; + gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520; } } @@ -679,7 +679,7 @@ void sub_802C68C(void) gUnknown_03004344 = GetBankByIdentity(3); else gUnknown_03004344 = GetBankByIdentity(1); - gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520; + gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520; } } else if (gMain.newKeys & B_BUTTON) @@ -1684,24 +1684,24 @@ void debug_sub_803107C(void) void sub_802D204(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) PlayerBufferExecCompleted(); } // duplicate of sub_802D204 void sub_802D23C(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) PlayerBufferExecCompleted(); } void sub_802D274(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) { nullsub_10(gSaveBlock2.playerGender); - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); PlayerBufferExecCompleted(); } } @@ -2176,13 +2176,13 @@ void sub_802DDC4(u8 taskId) void sub_802DE10(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].pos1.y + gSprites[gObjectBankIDs[gActiveBank]].pos2.y > DISPLAY_HEIGHT) + if (gSprites[gBankSpriteIds[gActiveBank]].pos1.y + gSprites[gBankSpriteIds[gActiveBank]].pos2.y > DISPLAY_HEIGHT) { u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); nullsub_9(species); - FreeOamMatrix(gSprites[gObjectBankIDs[gActiveBank]].oam.matrixNum); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBank]].oam.matrixNum); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8043DB0(gHealthboxIDs[gActiveBank]); PlayerBufferExecCompleted(); } @@ -2192,8 +2192,8 @@ void sub_802DEAC(void) { if (!ewram17810[gActiveBank].unk0_6) { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8043DB0(gHealthboxIDs[gActiveBank]); PlayerBufferExecCompleted(); } @@ -2260,7 +2260,7 @@ void bx_wait_t1(void) void bx_blink_t1(void) { - u8 spriteId = gObjectBankIDs[gActiveBank]; + u8 spriteId = gBankSpriteIds[gActiveBank]; if (gSprites[spriteId].data[1] == 32) { @@ -3020,7 +3020,7 @@ void PlayerHandlecmd3(void) void PlayerHandleLoadPokeSprite(void) { BattleLoadPlayerMonSprite(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; gBattleBankFunc[gActiveBank] = bx_0802E404; } @@ -3044,18 +3044,18 @@ void sub_802F934(u8 bank, u8 b) species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); - gObjectBankIDs[bank] = CreateSprite( + gBankSpriteIds[bank] = CreateSprite( &gUnknown_02024E8C, GetBankPosition(bank, 2), sub_8077F68(bank), sub_8079E90(bank)); - gSprites[gUnknown_0300434C[bank]].data[1] = gObjectBankIDs[bank]; - gSprites[gObjectBankIDs[bank]].data[0] = bank; - gSprites[gObjectBankIDs[bank]].data[2] = species; - gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; - StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); - gSprites[gObjectBankIDs[bank]].invisible = TRUE; - gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); + gSprites[gBankSpriteIds[bank]].invisible = TRUE; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; gSprites[gUnknown_0300434C[bank]].data[0] = sub_8046400(0, 0xFF); } @@ -3068,8 +3068,8 @@ void PlayerHandleReturnPokeToBall(void) } else { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8043DB0(gHealthboxIDs[gActiveBank]); PlayerBufferExecCompleted(); } @@ -3111,15 +3111,15 @@ void PlayerHandleTrainerThrow(void) } LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBank); GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, r7 + 80, (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, sub_8079E90(gActiveBank)); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_802D204; } @@ -3127,27 +3127,27 @@ void PlayerHandleTrainerSlide(void) { LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBank); GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, 80, (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, 30); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -96; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_802D23C; } void PlayerHandleTrainerSlideBack(void) { - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 50; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); gBattleBankFunc[gActiveBank] = sub_802D274; } @@ -3166,9 +3166,9 @@ void PlayerHandlecmd10(void) ewram17810[gActiveBank].unk4 = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, -64); - gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = 5; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = 5; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80105EC; gBattleBankFunc[gActiveBank] = sub_802DE10; } } @@ -3540,14 +3540,14 @@ void PlayerHandlecmd40(void) void PlayerHandleHitAnimation(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE) { PlayerBufferExecCompleted(); } else { gDoingBattleAnim = 1; - gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; sub_8047858(gActiveBank); gBattleBankFunc[gActiveBank] = bx_blink_t1; } @@ -3596,17 +3596,17 @@ void PlayerHandleTrainerBallThrow(void) u8 paletteNum; u8 taskId; - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 50; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - gSprites[gObjectBankIDs[gActiveBank]].data[5] = gActiveBank; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38); + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum; taskId = CreateTask(task05_08033660, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -3623,7 +3623,7 @@ void sub_8030E38(struct Sprite *sprite) FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); DestroySprite(sprite); BattleLoadPlayerMonSprite(&gPlayerParty[gBattlePartyID[r4]], r4); - StartSpriteAnim(&gSprites[gObjectBankIDs[r4]], 0); + StartSpriteAnim(&gSprites[gBankSpriteIds[r4]], 0); } void task05_08033660(u8 taskId) @@ -3702,7 +3702,7 @@ void PlayerHandleSpriteInvisibility(void) { if (IsBankSpritePresent(gActiveBank)) { - gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); } PlayerBufferExecCompleted(); diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c index 5896e5e18..e9425e7e7 100644 --- a/src/battle/battle_controller_safari.c +++ b/src/battle/battle_controller_safari.c @@ -28,7 +28,7 @@ extern u16 gBattle_BG0_Y; extern u16 gBattle_BG0_X; extern u8 gBattleBufferA[][0x200]; extern bool8 gDoingBattleAnim; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern struct SpriteTemplate gUnknown_02024E8C; extern u16 gBattleTypeFlags; extern u32 gBattleExecBuffer; @@ -288,7 +288,7 @@ void bx_battle_menu_t6_2(void) void sub_812B65C(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) SafariBufferExecCompleted(); } @@ -399,15 +399,15 @@ void SafariHandleTrainerThrow(void) { LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBank); GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, 80, (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, 30); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_812B65C; } diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c index 49f530129..3eacaa085 100644 --- a/src/battle/battle_controller_wally.c +++ b/src/battle/battle_controller_wally.c @@ -31,7 +31,7 @@ extern u8 gActiveBank; extern void (*gBattleBankFunc[])(void); extern u32 gBattleExecBuffer; extern u8 gBattleBufferA[][0x200]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern MainCallback gPreBattleCallback1; extern bool8 gDoingBattleAnim; extern u16 gBattlePartyID[]; @@ -325,7 +325,7 @@ void sub_81372BC(void) void sub_813741C(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) WallyBufferExecCompleted(); } @@ -436,7 +436,7 @@ void sub_81377B0(void) void bx_blink_t5(void) { - u8 spriteId = gObjectBankIDs[gActiveBank]; + u8 spriteId = gBankSpriteIds[gActiveBank]; if (gSprites[spriteId].data[1] == 32) { @@ -457,8 +457,8 @@ void sub_813789C(void) { if (!ewram17810[gActiveBank].unk0_6) { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8043DB0(gHealthboxIDs[gActiveBank]); WallyBufferExecCompleted(); } @@ -467,7 +467,7 @@ void sub_813789C(void) // Duplicate of sub_813741C void sub_8137908(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy) WallyBufferExecCompleted(); } @@ -1093,8 +1093,8 @@ void WallyHandleReturnPokeToBall(void) } else { - FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); - DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); + DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); sub_8043DB0(gHealthboxIDs[gActiveBank]); WallyBufferExecCompleted(); } @@ -1104,14 +1104,14 @@ void WallyHandleTrainerThrow(void) { LoadPlayerTrainerBankSprite(2, gActiveBank); GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), 30); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_813741C; } @@ -1119,14 +1119,14 @@ void WallyHandleTrainerSlide(void) { LoadPlayerTrainerBankSprite(2, gActiveBank); GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank)); - gObjectBankIDs[gActiveBank] = CreateSprite( + gBankSpriteIds[gActiveBank] = CreateSprite( &gUnknown_02024E8C, 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), 30); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; - gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -96; + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0; gBattleBankFunc[gActiveBank] = sub_8137908; } @@ -1432,14 +1432,14 @@ void WallyHandlecmd40(void) void WallyHandleHitAnimation(void) { - if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE) { WallyBufferExecCompleted(); } else { gDoingBattleAnim = 1; - gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0; + gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0; sub_8047858(gActiveBank); gBattleBankFunc[gActiveBank] = bx_blink_t5; } @@ -1480,17 +1480,17 @@ void WallyHandleTrainerBallThrow(void) u8 paletteNum; u8 taskId; - oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); - gSprites[gObjectBankIDs[gActiveBank]].data[0] = 50; - gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40; - gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; - gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - gSprites[gObjectBankIDs[gActiveBank]].data[5] = gActiveBank; - StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); - StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]); + gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; + gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; + gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; + gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; + StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38); + StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32); - gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; + gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum; taskId = CreateTask(sub_8139A2C, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -1508,18 +1508,18 @@ void sub_81398BC(u8 bank) species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); - gObjectBankIDs[bank] = CreateSprite( + gBankSpriteIds[bank] = CreateSprite( &gUnknown_02024E8C, GetBankPosition(bank, 2), sub_8077F68(bank), sub_8079E90(bank)); - gSprites[gUnknown_0300434C[bank]].data[1] = gObjectBankIDs[bank]; - gSprites[gObjectBankIDs[bank]].data[0] = bank; - gSprites[gObjectBankIDs[bank]].data[2] = species; - gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; - StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); - gSprites[gObjectBankIDs[bank]].invisible = TRUE; - gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[bank]].data[1] = gBankSpriteIds[bank]; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = species; + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); + gSprites[gBankSpriteIds[bank]].invisible = TRUE; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; gSprites[gUnknown_0300434C[bank]].data[0] = sub_8046400(0, 0xFF); } diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c index 6f27469ce..f5b8e1c5d 100644 --- a/src/battle/pokeball.c +++ b/src/battle/pokeball.c @@ -21,7 +21,7 @@ extern u16 gBattleTypeFlags; extern u8 gBankTarget; extern u8 gActiveBank; extern u16 gBattlePartyID[]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u8 gDoingBattleAnim; extern u8 gHealthboxIDs[]; @@ -442,9 +442,9 @@ static void sub_80466F4(struct Sprite *sprite) { sprite->data[5] = 0; sprite->callback = sub_8046760; - StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data[6]]], 2); - AnimateSprite(&gSprites[gObjectBankIDs[sprite->data[6]]]); - gSprites[gObjectBankIDs[sprite->data[6]]].data[1] = 0; + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->data[6]]], 2); + AnimateSprite(&gSprites[gBankSpriteIds[sprite->data[6]]]); + gSprites[gBankSpriteIds[sprite->data[6]]].data[1] = 0; } } @@ -453,17 +453,17 @@ static void sub_8046760(struct Sprite *sprite) sprite->data[5]++; if (sprite->data[5] == 11) PlaySE(SE_SUIKOMU); - if (gSprites[gObjectBankIDs[sprite->data[6]]].affineAnimEnded) + if (gSprites[gBankSpriteIds[sprite->data[6]]].affineAnimEnded) { StartSpriteAnim(sprite, 2); - gSprites[gObjectBankIDs[sprite->data[6]]].invisible = TRUE; + gSprites[gBankSpriteIds[sprite->data[6]]].invisible = TRUE; sprite->data[5] = 0; sprite->callback = sub_80467F8; } else { - gSprites[gObjectBankIDs[sprite->data[6]]].data[1] += 0x60; - gSprites[gObjectBankIDs[sprite->data[6]]].pos2.y = -gSprites[gObjectBankIDs[sprite->data[6]]].data[1] >> 8; + gSprites[gBankSpriteIds[sprite->data[6]]].data[1] += 0x60; + gSprites[gBankSpriteIds[sprite->data[6]]].pos2.y = -gSprites[gBankSpriteIds[sprite->data[6]]].data[1] >> 8; } } @@ -747,9 +747,9 @@ static void sub_8046C78(struct Sprite *sprite) gTasks[taskId].data[2] = r4_2; gTasks[taskId].data[15] = 0; } - StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data[6]]], 1); - AnimateSprite(&gSprites[gObjectBankIDs[sprite->data[6]]]); - gSprites[gObjectBankIDs[sprite->data[6]]].data[1] = 0x1000; + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->data[6]]], 1); + AnimateSprite(&gSprites[gBankSpriteIds[sprite->data[6]]]); + gSprites[gBankSpriteIds[sprite->data[6]]].data[1] = 0x1000; } static void sub_8046E7C(struct Sprite *sprite) @@ -766,25 +766,25 @@ static void sub_8046E9C(struct Sprite *sprite) bool8 r7 = FALSE; u8 r4 = sprite->data[6]; - gSprites[gObjectBankIDs[r4]].invisible = FALSE; + gSprites[gBankSpriteIds[r4]].invisible = FALSE; if (sprite->animEnded) sprite->invisible = TRUE; - if (gSprites[gObjectBankIDs[r4]].affineAnimEnded) + if (gSprites[gBankSpriteIds[r4]].affineAnimEnded) { - StartSpriteAffineAnim(&gSprites[gObjectBankIDs[r4]], 0); + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[r4]], 0); r7 = TRUE; } else { - gSprites[gObjectBankIDs[r4]].data[1] -= 288; - gSprites[gObjectBankIDs[r4]].pos2.y = gSprites[gObjectBankIDs[r4]].data[1] >> 8; + gSprites[gBankSpriteIds[r4]].data[1] -= 288; + gSprites[gBankSpriteIds[r4]].pos2.y = gSprites[gBankSpriteIds[r4]].data[1] >> 8; } if (sprite->animEnded && r7) { s32 i; u32 r3; - gSprites[gObjectBankIDs[r4]].pos2.y = 0; + gSprites[gBankSpriteIds[r4]].pos2.y = 0; gDoingBattleAnim = 0; ewram17810[r4].unk0_3 = 0; FreeSpriteOamMatrix(sprite); @@ -819,8 +819,8 @@ static void sub_8046FBC(struct Sprite *sprite) } else if (sprite->data[4] == 315) { - FreeOamMatrix(gSprites[gObjectBankIDs[sprite->data[6]]].oam.matrixNum); - DestroySprite(&gSprites[gObjectBankIDs[sprite->data[6]]]); + FreeOamMatrix(gSprites[gBankSpriteIds[sprite->data[6]]].oam.matrixNum); + DestroySprite(&gSprites[gBankSpriteIds[sprite->data[6]]]); DestroySpriteAndFreeResources(sprite); if (gMain.inBattle) ewram17810[r7].unk0_3 = 0; diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c index a78cb20df..0da29441e 100644 --- a/src/battle/reshow_battle_screen.c +++ b/src/battle/reshow_battle_screen.c @@ -25,7 +25,7 @@ extern u8 gBankInMenu; extern u16 gBattlePartyID[4]; extern u8 gNoOfAllBanks; extern u16 gBattleTypeFlags; -extern u8 gObjectBankIDs[4]; +extern u8 gBankSpriteIds[4]; extern u8 gBattleMonForms[4]; extern u8 gHealthboxIDs[4]; @@ -243,46 +243,46 @@ static void sub_807B184(u8 bank) if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) return; GetMonSpriteTemplate_803C56C(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank)); - gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, GetBankPosition(bank, 2), posY, sub_8079E90(bank)); - gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; - gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; - gSprites[gObjectBankIDs[bank]].data[0] = bank; - gSprites[gObjectBankIDs[bank]].data[2] = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES); - StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); + gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, GetBankPosition(bank, 2), posY, sub_8079E90(bank)); + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); } else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) { GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(0)); - gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, 0x50, + gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, 0x50, (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, sub_8079E90(0)); - gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; - gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; - gSprites[gObjectBankIDs[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[bank]].data[0] = bank; } else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) { GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(0)); - gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, 0x50, + gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, 0x50, (8 - gTrainerBackPicCoords[2].coords) * 4 + 80, sub_8079E90(0)); - gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; - gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; - gSprites[gObjectBankIDs[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[bank]].data[0] = bank; } else { if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) return; GetMonSpriteTemplate_803C56C(GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank)); - gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, GetBankPosition(bank, 2), posY, sub_8079E90(bank)); - gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; - gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; - gSprites[gObjectBankIDs[bank]].data[0] = bank; - gSprites[gObjectBankIDs[bank]].data[2] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); - StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); + gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, GetBankPosition(bank, 2), posY, sub_8079E90(bank)); + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[bank]].data[0] = bank; + gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); } - gSprites[gObjectBankIDs[bank]].invisible = ewram17800[bank].invisible; + gSprites[gBankSpriteIds[bank]].invisible = ewram17800[bank].invisible; } } diff --git a/src/contest.c b/src/contest.c index e2695627e..e7740bade 100644 --- a/src/contest.c +++ b/src/contest.c @@ -47,7 +47,7 @@ extern u16 gBattleTypeFlags; extern u8 gBankAttacker; extern u8 gBankTarget; extern u8 gBanksBySide[]; -extern u8 gObjectBankIDs[]; +extern u8 gBankSpriteIds[]; extern u16 gBattle_BG3_X; extern s16 gBattle_BG1_Y; extern u16 gBattle_BG3_Y; @@ -553,7 +553,7 @@ u8 sub_80AB70C(u8 *a) gBattleTypeFlags = 0; gBankAttacker = 2; gBankTarget = 3; - gObjectBankIDs[gBankAttacker] = CreateJudgeSprite(); + gBankSpriteIds[gBankAttacker] = CreateJudgeSprite(); sub_80B292C(); break; default: @@ -931,7 +931,7 @@ void debug_sub_80BA054(u8 taskId) gSprites[r6].pos2.x = 120; gSprites[r6].callback = sub_80AD8FC; gTasks[taskId].data[2] = r6; - gObjectBankIDs[gBankAttacker] = r6; + gBankSpriteIds[gBankAttacker] = r6; gTasks[taskId].data[3] = 0; gTasks[taskId].data[0]++; sContest.unk1925E = 0; @@ -1143,7 +1143,7 @@ void sub_80AC2CC(u8 taskId) gSprites[spriteId].pos2.x = 120; gSprites[spriteId].callback = sub_80AD8FC; gTasks[taskId].data[2] = spriteId; - gObjectBankIDs[gBankAttacker] = spriteId; + gBankSpriteIds[gBankAttacker] = spriteId; sub_80B0BC4(sub_80B09E4(sContest.unk19215), FALSE); gTasks[taskId].data[0] = 4; return; @@ -5415,14 +5415,14 @@ void sub_80B28F0(u8 a) void sub_80B292C(void) { - gObjectBankIDs[3] = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - InitSpriteAffineAnim(&gSprites[gObjectBankIDs[gBankTarget]]); + gBankSpriteIds[3] = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + InitSpriteAffineAnim(&gSprites[gBankSpriteIds[gBankTarget]]); sub_80B2968(); } void sub_80B2968(void) { - struct Sprite *sprite = &gSprites[gObjectBankIDs[3]]; + struct Sprite *sprite = &gSprites[gBankSpriteIds[3]]; sprite->pos2.x = 0; sprite->pos2.y = 0; diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 4a580eb41..a60fc1078 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -1,4 +1,5 @@ #include "global.h" +#include "constants/battle_anim.h" #include "constants/species.h" #include "rom_8077ABC.h" #include "battle.h" @@ -30,7 +31,7 @@ #define gCastformElevations gUnknownCastformData_0837F5A8 #define gCastformBackSpriteYCoords gUnknown_0837F5AC #define gTransformPersonalities gTransformedPersonalities -#define gBattleMonSprites gObjectBankIDs +#define gBattleMonSprites gBankSpriteIds struct TransformStatus { @@ -850,7 +851,7 @@ bool8 IsBankSpritePresent(u8 slot) { if (gBanksBySide[slot] == 0xff) return FALSE; - if (GetBankSide(slot)) + if (GetBankSide(slot) != SIDE_PLAYER) { if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) return TRUE; -- cgit v1.2.3 From 4fe6a8bd80ff947661aea391060207a53895338e Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sat, 10 Feb 2018 23:49:54 -0800 Subject: Document battle anim things related to SWIFT and TWISTER --- src/battle/anim/aurora.c | 6 ++-- src/battle/anim/blow_kiss.c | 6 ++-- src/battle/anim/bubble.c | 4 +-- src/battle/anim/bug.c | 16 +++++------ src/battle/anim/bullet.c | 2 +- src/battle/anim/cutter.c | 58 +++++++++++++++++++++++-------------- src/battle/anim/cyclone.c | 2 +- src/battle/anim/dark.c | 2 +- src/battle/anim/egg.c | 2 +- src/battle/anim/energy_wave.c | 8 +++--- src/battle/anim/fight.c | 12 ++++---- src/battle/anim/fire_2.c | 8 +++--- src/battle/anim/flying_path.c | 14 ++++----- src/battle/anim/glitter.c | 2 +- src/battle/anim/guard.c | 2 +- src/battle/anim/guillotine.c | 6 ++-- src/battle/anim/heart_1.c | 2 +- src/battle/anim/hop.c | 2 +- src/battle/anim/money.c | 2 +- src/battle/anim/note_rain.c | 2 +- src/battle/anim/note_scatter_2.c | 4 +-- src/battle/anim/orbit.c | 12 ++++---- src/battle/anim/orbs.c | 12 ++++---- src/battle/anim/perceive.c | 2 +- src/battle/anim/poison.c | 14 ++++----- src/battle/anim/psychic.c | 4 +-- src/battle/anim/ring.c | 8 +++--- src/battle/anim/rock.c | 8 +++--- src/battle/anim/seed.c | 4 +-- src/battle/anim/sonic.c | 2 +- src/battle/anim/sonic_task.c | 2 +- src/battle/anim/sword.c | 2 +- src/battle/anim/unused_8.c | 2 +- src/battle/anim/unused_9.c | 2 +- src/battle/anim/water.c | 2 +- src/battle/anim/wisp_orb.c | 4 +-- src/battle/battle_anim_80A7E7C.c | 42 ++++++++++++++------------- src/battle/pokeball.c | 8 +++--- src/rom_8077ABC.c | 62 ++++++++++++++++++++-------------------- 39 files changed, 185 insertions(+), 169 deletions(-) (limited to 'src') diff --git a/src/battle/anim/aurora.c b/src/battle/anim/aurora.c index 90fa5c879..b24809264 100644 --- a/src/battle/anim/aurora.c +++ b/src/battle/anim/aurora.c @@ -16,7 +16,7 @@ void sub_80D33B4(struct Sprite *sprite) { s16 r6; - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); if (GetBankSide(gAnimBankAttacker) != 0) r6 = -gBattleAnimArgs[2]; else @@ -26,7 +26,7 @@ void sub_80D33B4(struct Sprite *sprite) sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + r6; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->callback = sub_80D344C; sprite->affineAnimPaused = TRUE; sprite->callback(sprite); @@ -39,7 +39,7 @@ static void sub_80D344C(struct Sprite *sprite) StartSpriteAnim(sprite, 1); sprite->affineAnimPaused = FALSE; } - if (sub_8078B5C(sprite) != 0) + if (TranslateAnimSpriteByDeltas(sprite) != 0) DestroyAnimSprite(sprite); } diff --git a/src/battle/anim/blow_kiss.c b/src/battle/anim/blow_kiss.c index e7b49471d..f585b74bc 100644 --- a/src/battle/anim/blow_kiss.c +++ b/src/battle/anim/blow_kiss.c @@ -15,19 +15,19 @@ static void sub_80D1FA4(struct Sprite* sprite); void sub_80D1F58(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = 0x5F; sprite->data[1] = sprite->pos1.x; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->callback = sub_80D1FA4; } void sub_80D1FA4(struct Sprite* sprite) { - if (sub_8078B5C(sprite) == 0) + if (TranslateAnimSpriteByDeltas(sprite) == 0) { sprite->pos2.y += Sin(sprite->data[5], 14); sprite->data[5] = (sprite->data[5] + 4) & 0xFF; diff --git a/src/battle/anim/bubble.c b/src/battle/anim/bubble.c index 403003ce3..1252c1315 100644 --- a/src/battle/anim/bubble.c +++ b/src/battle/anim/bubble.c @@ -43,7 +43,7 @@ void sub_80D31C8(struct Sprite* sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); sprite->data[5] = newSpriteId; @@ -69,7 +69,7 @@ static void sub_80D32E8(struct Sprite *sprite) u16 index = gSprites[spriteId].data[3]; sprite->data[0] = 1; - sub_8078B5C(sprite); + TranslateAnimSpriteByDeltas(sprite); sprite->pos2.x += Sin(index / 256, gSprites[spriteId].data[0]); sprite->pos2.y += Cos(index / 256, gSprites[spriteId].data[1]); diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c index dbc0f75a5..b2726d8dd 100644 --- a/src/battle/anim/bug.c +++ b/src/battle/anim/bug.c @@ -76,7 +76,7 @@ void sub_80DC9A0(struct Sprite *sprite) if (IsContest()) gBattleAnimArgs[2] /= 2; - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; @@ -88,7 +88,7 @@ void sub_80DC9A0(struct Sprite *sprite) } else { - sub_807A3FC(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); + SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); } sub_8078BD4(sprite); @@ -98,7 +98,7 @@ void sub_80DC9A0(struct Sprite *sprite) static void sub_80DCA38(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) + if (TranslateAnimSpriteByDeltas(sprite)) { DestroyAnimSprite(sprite); return; @@ -111,7 +111,7 @@ static void sub_80DCA38(struct Sprite *sprite) // used in Move_STRING_SHOT void sub_80DCA70(struct Sprite *sprite) { - sub_807A3FC(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + SetAverageBattlerPositions(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); if (GetBankSide(gAnimBankAttacker)) sprite->pos1.x -= gBattleAnimArgs[0]; else @@ -212,7 +212,7 @@ void sub_80DCBCC(struct Sprite *sprite) } } - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); lVarX = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; lVarY = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; @@ -232,7 +232,7 @@ void sub_80DCBCC(struct Sprite *sprite) // Move_PIN_MISSILE, Move_ICICLE_SPEAR void sub_80DCCFC(struct Sprite *sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; @@ -251,7 +251,7 @@ void sub_80DCD78(struct Sprite *sprite) { sprite->invisible = FALSE; - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) { DestroyAnimSprite(sprite); } @@ -271,7 +271,7 @@ void sub_80DCD78(struct Sprite *sprite) x2 += x1; y2 += y1; - if (!sub_8078718(sprite)) + if (!TranslateAnimSpriteLinearAndSine(sprite)) { u16 rot = sub_80790F0(sprite->pos1.x + sprite->pos2.x - x2, sprite->pos1.y + sprite->pos2.y - y2); diff --git a/src/battle/anim/bullet.c b/src/battle/anim/bullet.c index 90b2021f1..8fc581d47 100644 --- a/src/battle/anim/bullet.c +++ b/src/battle/anim/bullet.c @@ -17,7 +17,7 @@ static void sub_80D00B4(struct Sprite* sprite); void sub_80CFFD8(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = 20; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); diff --git a/src/battle/anim/cutter.c b/src/battle/anim/cutter.c index 2234ebacb..0f23fed82 100644 --- a/src/battle/anim/cutter.c +++ b/src/battle/anim/cutter.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "rom_8077ABC.h" #include "trig.h" #include "battle_anim.h" @@ -7,29 +8,36 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -static void sub_80CB09C(struct Sprite* sprite); -static void sub_80CB1A4(struct Sprite* sprite); +static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite); +static void AnimMoveTwisterParticleStep(struct Sprite* sprite); -// cutter (the cresent shaped leaf used in throwing projectiles for the listed moves.) +// Animates a sprite that moves linearly from one location to another, with a +// single-cycle sine wave added to the y position along the way. // Used by Razor Leaf and Magical Leaf. - -void sub_80CAFD0(struct Sprite* sprite) +// arg 0: initial x offset +// arg 1: initial y offset +// arg 2: target x offset +// arg 3: target y offset +// arg 4: translation duration +// arg 5: wave amplitude +// arg 6: target between double battle opponents (boolean) +void AnimTranslateLinearSingleSineWave(struct Sprite* sprite) { - sub_80787B0(sprite, 1); - if (GetBankSide(gAnimBankAttacker)) + InitAnimSpritePos(sprite, 1); + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sprite->data[0] = gBattleAnimArgs[4]; - if (!(gBattleAnimArgs[6])) + if (!gBattleAnimArgs[6]) { sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; } else { - sub_807A3FC(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); + SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); sprite->data[2] += gBattleAnimArgs[2]; sprite->data[4] += gBattleAnimArgs[3]; } @@ -45,18 +53,18 @@ void sub_80CAFD0(struct Sprite* sprite) sprite->data[0] = 0; } - sprite->callback = sub_80CB09C; + sprite->callback = AnimTranslateLinearSingleSineWaveStep; } -void sub_80CB09C(struct Sprite* sprite) +static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite) { - bool8 c = FALSE; + bool8 destroy = FALSE; s16 a = sprite->data[0]; s16 b = sprite->data[7]; s16 r0; sprite->data[0] = 1; - sub_8078718(sprite); + TranslateAnimSpriteLinearAndSine(sprite); r0 = sprite->data[7]; sprite->data[0] = a; if (b > 0xC8 && r0 <= 0x37 && sprite->oam.affineParam == 0) @@ -67,24 +75,30 @@ void sub_80CB09C(struct Sprite* sprite) sprite->invisible ^= 1; sprite->oam.affineParam++; if (sprite->oam.affineParam == 0x1E) - c = TRUE; + destroy = TRUE; } - if (sprite->pos1.x + sprite->pos2.x > 0x100 + if (sprite->pos1.x + sprite->pos2.x > 256 || sprite->pos1.x + sprite->pos2.x < -16 - || sprite->pos1.y + sprite->pos2.y > 0xA0 + || sprite->pos1.y + sprite->pos2.y > 160 || sprite->pos1.y + sprite->pos2.y < -16) - c = TRUE; + destroy = TRUE; - if (c) + if (destroy) DestroyAnimSprite(sprite); } -void sub_80CB144(struct Sprite* sprite) +// Animates particles in the Twister move animation. +// arg 0: duration +// arg 1: total y delta (the particles rise upward) +// arg 2: wave period (higher means faster wave) +// arg 3: wave amplitude +// arg 4: speedup frame (particles move faster at the end of the animation) +void AnimMoveTwisterParticle(struct Sprite* sprite) { if (!IsContest() && IsDoubleBattle() == TRUE) { - sub_807A3FC(gAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y); + SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y); } sprite->pos1.y += 32; @@ -93,10 +107,10 @@ void sub_80CB144(struct Sprite* sprite) sprite->data[2] = gBattleAnimArgs[2]; sprite->data[3] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[4]; - sprite->callback = sub_80CB1A4; + sprite->callback = AnimMoveTwisterParticleStep; } -void sub_80CB1A4(struct Sprite* sprite) +static void AnimMoveTwisterParticleStep(struct Sprite* sprite) { if (sprite->data[1] == 0xFF) { diff --git a/src/battle/anim/cyclone.c b/src/battle/anim/cyclone.c index 0f83df211..b1210bc54 100644 --- a/src/battle/anim/cyclone.c +++ b/src/battle/anim/cyclone.c @@ -13,7 +13,7 @@ extern u8 gAnimBankTarget; void sub_80D0118(struct Sprite* sprite) { - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); if (GetBankSide(gAnimBankAttacker) == 0) sprite->pos1.y += 16; diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index 674ae5188..83a375495 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -244,7 +244,7 @@ void sub_80DFFD0(struct Sprite *sprite) static void sub_80E00D0(struct Sprite *sprite) { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) move_anim_8074EE0(sprite); } diff --git a/src/battle/anim/egg.c b/src/battle/anim/egg.c index 8004b3bf5..b3de1dbb1 100644 --- a/src/battle/anim/egg.c +++ b/src/battle/anim/egg.c @@ -22,7 +22,7 @@ static void sub_80D158C(struct Sprite* sprite); void sub_80D1368(struct Sprite* sprite) { s16 r1; - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); r1 = (GetBankSide(gAnimBankAttacker)) ? -0xA0 : 0xA0; sprite->data[0] = 0x380; sprite->data[1] = r1; diff --git a/src/battle/anim/energy_wave.c b/src/battle/anim/energy_wave.c index 15045f5bd..acab7bf80 100644 --- a/src/battle/anim/energy_wave.c +++ b/src/battle/anim/energy_wave.c @@ -20,7 +20,7 @@ static void sub_80D370C(struct Sprite *); void sub_80D3554(struct Sprite *sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = 30; sprite->data[1] = sprite->pos1.x; @@ -28,7 +28,7 @@ void sub_80D3554(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->data[5] = 0xD200 / sprite->data[0]; sprite->data[7] = gBattleAnimArgs[3]; @@ -49,7 +49,7 @@ void sub_80D3554(struct Sprite *sprite) static void sub_80D35DC(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) + if (TranslateAnimSpriteByDeltas(sprite)) { DestroyAnimSprite(sprite); } @@ -147,7 +147,7 @@ void sub_80D3728(struct Sprite *sprite) else var2 = 1; - sub_80787B0(sprite, var1); + InitAnimSpritePos(sprite, var1); if (GetBankSide(gAnimBankAttacker) != 0) { diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c index 160b51274..f589622bd 100644 --- a/src/battle/anim/fight.c +++ b/src/battle/anim/fight.c @@ -77,7 +77,7 @@ void sub_80D90A4(struct Sprite *sprite) StartSpriteAnim(sprite, gBattleAnimArgs[4]); if (gBattleAnimArgs[3] == 0) - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); else sub_8078764(sprite, 1); @@ -203,7 +203,7 @@ void sub_80D9378(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->pos1.y; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->data[5] = gBattleAnimArgs[5]; sprite->data[6] = gBattleAnimArgs[4]; @@ -214,7 +214,7 @@ void sub_80D9378(struct Sprite *sprite) static void sub_80D9404(struct Sprite *sprite) { - if (!sub_8078B5C(sprite)) + if (!TranslateAnimSpriteByDeltas(sprite)) { sprite->pos2.y += Sin(sprite->data[7] >> 8, sprite->data[5]); sprite->data[7] += sprite->data[6]; @@ -435,7 +435,7 @@ static void sub_80D986C(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(sprite->data[7], 3); - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); StoreSpriteCallbackInData(sprite, move_anim_8074EE0); sprite->callback = sub_8078BB8; } @@ -530,7 +530,7 @@ void sub_80D9A38(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(bank, 3); - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); StoreSpriteCallbackInData(sprite, DestroyAnimSprite); sprite->callback = sub_8078BB8; } @@ -573,7 +573,7 @@ void sub_80D9B48(struct Sprite *sprite) void sub_80D9BD4(struct Sprite *sprite) { if (gBattleAnimArgs[2] == 0) - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); else sub_8078764(sprite, 0); diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c index 4d577a765..fe63fcff1 100644 --- a/src/battle/anim/fire_2.c +++ b/src/battle/anim/fire_2.c @@ -42,7 +42,7 @@ struct Sprite *sub_80D5210(struct Sprite *sprite) void sub_80D522C(struct Sprite *sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[7] = gBattleAnimArgs[2]; sprite->data[0] = 0; @@ -62,7 +62,7 @@ void sub_80D5254(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->callback = sub_80D52AC; } @@ -70,7 +70,7 @@ void sub_80D5254(struct Sprite *sprite) void sub_80D52AC(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) + if (TranslateAnimSpriteByDeltas(sprite)) { sprite->data[0] = 0; @@ -123,7 +123,7 @@ void sub_80D5374(struct Sprite *sprite) void sub_80D53B4(struct Sprite *sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[1] = gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[3]; diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c index 441ac0e6d..559f617c6 100644 --- a/src/battle/anim/flying_path.c +++ b/src/battle/anim/flying_path.c @@ -53,7 +53,7 @@ void sub_80CBF5C(u8 taskId) { case 4: sub_80CC358(task, taskId); - if (sub_8078718(sprite) == 0) + if (TranslateAnimSpriteLinearAndSine(sprite) == 0) { break; } @@ -65,7 +65,7 @@ void sub_80CBF5C(u8 taskId) break; case 8: sub_80CC358(task, taskId); - if (sub_8078718(sprite) == 0) + if (TranslateAnimSpriteLinearAndSine(sprite) == 0) { break; } @@ -77,7 +77,7 @@ void sub_80CBF5C(u8 taskId) break; case 0: sub_80CC358(task, taskId); - if (sub_8078718(sprite) == 0) + if (TranslateAnimSpriteLinearAndSine(sprite) == 0) break; task->data[15] = 1; @@ -103,7 +103,7 @@ void sub_80CBF5C(u8 taskId) break; case 2: sub_80CC358(task, taskId); - if (sub_8078718(sprite) == 0) + if (TranslateAnimSpriteLinearAndSine(sprite) == 0) break; task->data[15] = 3; @@ -146,7 +146,7 @@ void sub_80CBF5C(u8 taskId) break; case 6: sub_80CC358(task, taskId); - if (sub_8078718(sprite) == 0) + if (TranslateAnimSpriteLinearAndSine(sprite) == 0) break; task->data[15] = 7; @@ -189,7 +189,7 @@ void sub_80CBF5C(u8 taskId) break; case 10: sub_80CC358(task, taskId); - if (sub_8078718(sprite) == 0) + if (TranslateAnimSpriteLinearAndSine(sprite) == 0) { break; } @@ -221,7 +221,7 @@ void sub_80CBF5C(u8 taskId) } case 12: sub_80CC358(task, taskId); - if (sub_8078718(sprite) != 0) + if (TranslateAnimSpriteLinearAndSine(sprite) != 0) { DestroySprite(sprite); task->data[0]++; diff --git a/src/battle/anim/glitter.c b/src/battle/anim/glitter.c index e4577f1e1..e6c101de3 100644 --- a/src/battle/anim/glitter.c +++ b/src/battle/anim/glitter.c @@ -35,7 +35,7 @@ void sub_80CD190(struct Sprite* sprite) if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2)) { - sub_807A3FC(bank, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y); + SetAverageBattlerPositions(bank, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y); sub_807867C(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; } diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c index 254160109..9dcfa9f5d 100644 --- a/src/battle/anim/guard.c +++ b/src/battle/anim/guard.c @@ -15,7 +15,7 @@ void sub_80D3014(struct Sprite *sprite) { if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2)) { - sub_807A3FC(gAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y); + SetAverageBattlerPositions(gAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y); sprite->pos1.y += 40; StartSpriteAffineAnim(sprite, 1); diff --git a/src/battle/anim/guillotine.c b/src/battle/anim/guillotine.c index b3d842cdf..15279d5e2 100644 --- a/src/battle/anim/guillotine.c +++ b/src/battle/anim/guillotine.c @@ -37,7 +37,7 @@ void sub_80D0228(struct Sprite* sprite) sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + r9; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + r6; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->data[5] = gBattleAnimArgs[0]; sprite->data[6] = sprite->data[0]; sprite->callback = sub_80D02D0; @@ -45,7 +45,7 @@ void sub_80D0228(struct Sprite* sprite) void sub_80D02D0(struct Sprite* sprite) { - if (sub_8078B5C(sprite) && sprite->animEnded == 1) + if (TranslateAnimSpriteByDeltas(sprite) && sprite->animEnded == 1) { SeekSpriteAnim(sprite, 0); sprite->animPaused = 1; @@ -85,6 +85,6 @@ void sub_80D0344(struct Sprite* sprite) void sub_80D03A8(struct Sprite* sprite) { - if (sub_8078B5C(sprite) != 0) + if (TranslateAnimSpriteByDeltas(sprite) != 0) DestroyAnimSprite(sprite); } diff --git a/src/battle/anim/heart_1.c b/src/battle/anim/heart_1.c index 5df89f929..857169e62 100644 --- a/src/battle/anim/heart_1.c +++ b/src/battle/anim/heart_1.c @@ -14,7 +14,7 @@ extern u8 gAnimBankTarget; void sub_80D1C80(struct Sprite* sprite) { if (++sprite->data[0] == 1) - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); sprite->pos2.x = Sin(sprite->data[1], 8); sprite->pos2.y = sprite->data[2] >> 8; diff --git a/src/battle/anim/hop.c b/src/battle/anim/hop.c index 4006e2d43..0697e83a0 100644 --- a/src/battle/anim/hop.c +++ b/src/battle/anim/hop.c @@ -91,7 +91,7 @@ void sub_80CB94C(struct Sprite* sprite) { s16 e1; s16 e2; - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); e1 = GetBankPosition(gAnimBankTarget, 0); e2 = GetBankPosition(gAnimBankTarget, 1); if ((gAnimBankAttacker ^ 2) == gAnimBankTarget) diff --git a/src/battle/anim/money.c b/src/battle/anim/money.c index 8358d23db..0ee381e13 100644 --- a/src/battle/anim/money.c +++ b/src/battle/anim/money.c @@ -19,7 +19,7 @@ void sub_80CFE9C(struct Sprite* sprite) s16 r7; u16 var; - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); r6 = GetBankPosition(gAnimBankTarget, 2); r7 = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; if (GetBankSide(gAnimBankAttacker) != 0) diff --git a/src/battle/anim/note_rain.c b/src/battle/anim/note_rain.c index 715462d73..552329a57 100644 --- a/src/battle/anim/note_rain.c +++ b/src/battle/anim/note_rain.c @@ -24,7 +24,7 @@ void sub_80D1BA8(struct Sprite* sprite, u8 a, u8 b) void sub_80D1C08(struct Sprite* sprite) { - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); if (GetBankSide(gAnimBankAttacker) != 0) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; diff --git a/src/battle/anim/note_scatter_2.c b/src/battle/anim/note_scatter_2.c index 524c51c08..262afb8bf 100644 --- a/src/battle/anim/note_scatter_2.c +++ b/src/battle/anim/note_scatter_2.c @@ -32,14 +32,14 @@ void sub_80CEE60(struct Sprite* sprite) sprite->data[2] = a + sprite->data[1]; sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->data[3] - 40; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = sub_80CEEE8; } void sub_80CEEE8(struct Sprite* sprite) { - if (sub_8078B5C(sprite) == 0) + if (TranslateAnimSpriteByDeltas(sprite) == 0) { s16 a; a = Sin(sprite->data[5], 8); diff --git a/src/battle/anim/orbit.c b/src/battle/anim/orbit.c index c8cf339d2..e7dd0df49 100644 --- a/src/battle/anim/orbit.c +++ b/src/battle/anim/orbit.c @@ -79,13 +79,13 @@ void sub_80CACEC(u8 taskId) void sub_80CAD54(struct Sprite* sprite) { - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = sprite->pos1.x; sprite->data[2] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[2]; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->data[5] = 0x40; sprite->callback = sub_80CADA8; sub_80CADA8(sprite); @@ -93,7 +93,7 @@ void sub_80CAD54(struct Sprite* sprite) void sub_80CADA8(struct Sprite* sprite) { - if (!sub_8078B5C(sprite)) + if (!TranslateAnimSpriteByDeltas(sprite)) { sprite->pos2.x += Sin(sprite->data[5], 32); sprite->pos2.y += Cos(sprite->data[5], -5); @@ -116,13 +116,13 @@ void sub_80CADA8(struct Sprite* sprite) void sub_80CAE20(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = sprite->pos1.x; sprite->data[2] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[2]; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->data[5] = 0x40; sprite->callback = sub_80CAE74; sub_80CAE74(sprite); @@ -130,7 +130,7 @@ void sub_80CAE20(struct Sprite* sprite) void sub_80CAE74(struct Sprite* sprite) { - if (!sub_8078B5C(sprite)) + if (!TranslateAnimSpriteByDeltas(sprite)) { sprite->pos2.x += Sin(sprite->data[5], 8); if ((u16)(sprite->data[5] - 0x3B) < 5 || (u16)(sprite->data[5] - 0xBB) < 5) diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c index 6ca2fa71c..eede55695 100644 --- a/src/battle/anim/orbs.c +++ b/src/battle/anim/orbs.c @@ -19,7 +19,7 @@ extern struct SpriteTemplate gSpriteTemplate_83D631C; void sub_80CA7B0(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2); sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3); @@ -29,7 +29,7 @@ void sub_80CA7B0(struct Sprite* sprite) void sub_80CA800(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); StartSpriteAnim(sprite, gBattleAnimArgs[3]); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); @@ -40,13 +40,13 @@ void sub_80CA800(struct Sprite* sprite) void sub_80CA858(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->pos1.x; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = sub_80CA8B4; sub_80CA8B4(sprite); @@ -54,7 +54,7 @@ void sub_80CA858(struct Sprite* sprite) void sub_80CA8B4(struct Sprite* sprite) { - if (sub_8078B5C(sprite)) + if (TranslateAnimSpriteByDeltas(sprite)) { DestroySprite(sprite); } @@ -105,7 +105,7 @@ void sub_80CA9A8(struct Sprite* sprite) void sub_80CA9F8(struct Sprite* sprite) { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) DestroyAnimSprite(sprite); } diff --git a/src/battle/anim/perceive.c b/src/battle/anim/perceive.c index 3b3153428..14db096c6 100644 --- a/src/battle/anim/perceive.c +++ b/src/battle/anim/perceive.c @@ -19,6 +19,6 @@ void sub_80D2904(struct Sprite* sprite) void sub_80D2920(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->callback = sub_80D2904; } diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c index f31c441fb..656e923bc 100644 --- a/src/battle/anim/poison.c +++ b/src/battle/anim/poison.c @@ -17,7 +17,7 @@ void sub_80D9D70(struct Sprite *sprite) if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); @@ -31,7 +31,7 @@ void sub_80D9D70(struct Sprite *sprite) void sub_80D9DD4(struct Sprite *sprite) // same as sub_80D9E78 { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) DestroyAnimSprite(sprite); } @@ -41,8 +41,8 @@ void sub_80D9DF0(struct Sprite *sprite) if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); - sub_80787B0(sprite, 1); - sub_807A3FC(gAnimBankTarget, 1, &l1, &l2); + InitAnimSpritePos(sprite, 1); + SetAverageBattlerPositions(gAnimBankTarget, 1, &l1, &l2); if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[4] = -gBattleAnimArgs[4]; @@ -59,7 +59,7 @@ void sub_80D9DF0(struct Sprite *sprite) void sub_80D9E78(struct Sprite *sprite) // same as sub_80D9DD4 { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) DestroyAnimSprite(sprite); } @@ -92,7 +92,7 @@ void sub_80D9EE8(struct Sprite *sprite) void sub_80D9F14(struct Sprite *sprite) { - sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + SetAverageBattlerPositions(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; @@ -116,7 +116,7 @@ void sub_80D9F88(struct Sprite *sprite) } else { - sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + SetAverageBattlerPositions(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c index 37c527183..b108c496a 100644 --- a/src/battle/anim/psychic.c +++ b/src/battle/anim/psychic.c @@ -192,7 +192,7 @@ void sub_80DBA4C(struct Sprite *sprite) else { if (gBattleAnimArgs[2] == 0) - sub_80787B0(sprite, var0); + InitAnimSpritePos(sprite, var0); else sub_8078764(sprite, var0); } @@ -539,7 +539,7 @@ static void sub_80DC1FC(u8 taskId) void sub_80DC2B0(struct Sprite *sprite) { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) { FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); diff --git a/src/battle/anim/ring.c b/src/battle/anim/ring.c index 759652f0c..86b2c4659 100644 --- a/src/battle/anim/ring.c +++ b/src/battle/anim/ring.c @@ -32,7 +32,7 @@ void sub_80D0FD8(struct Sprite* sprite) r4 = gBattleAnimArgs[3] ^ 1; if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2)) { - sub_807A3FC(bank, r4, &sp0, &sp1); + SetAverageBattlerPositions(bank, r4, &sp0, &sp1); if (r4 == 0) r4 = GetBankPosition(bank, 0); else @@ -50,7 +50,7 @@ void sub_80D0FD8(struct Sprite* sprite) void sub_80D1098(struct Sprite* sprite) { - if (sub_8078B5C(sprite)) + if (TranslateAnimSpriteByDeltas(sprite)) { FreeSpriteOamMatrix(sprite); DestroyAnimSprite(sprite); @@ -118,7 +118,7 @@ void sub_80D10B8(struct Sprite* sprite) r6 = GetBankPosition(bankr7, sp4) + gBattleAnimArgs[1]; if (gMain.inBattle && IsAnimBankSpriteVisible(bankr8 ^ 2)) { - sub_807A3FC(bankr8, gBattleAnimArgs[6], &sp0, &sp1); + SetAverageBattlerPositions(bankr8, gBattleAnimArgs[6], &sp0, &sp1); } else { @@ -137,7 +137,7 @@ void sub_80D10B8(struct Sprite* sprite) sprite->data[2] = sp0; sprite->data[4] = sp1; sprite->data[0] = gBattleAnimArgs[0]; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->callback = sub_80D1098; sub_80D1098(sprite); } diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c index b113ce040..2df7e6642 100644 --- a/src/battle/anim/rock.c +++ b/src/battle/anim/rock.c @@ -38,7 +38,7 @@ static void sub_80DD9FC(struct Sprite *sprite); void sub_80DCE9C(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) - sub_807A3FC(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + SetAverageBattlerPositions(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += 14; @@ -102,7 +102,7 @@ void sub_80DCF60(struct Sprite *sprite) void sub_80DCFE4(struct Sprite *sprite) { if (gBattleAnimArgs[6] == 0) - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); else sub_8078764(sprite, 0); @@ -275,7 +275,7 @@ void sub_80DD3AC(struct Sprite *sprite) void sub_80DD490(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[2] = sprite->pos1.x; @@ -455,7 +455,7 @@ static void sub_80DD774(struct Task *task) void sub_80DD87C(struct Sprite *sprite) { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) { u8 taskId = FindTaskIdByFunc(sub_80DD604); if (taskId != 0xFF) diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c index be8613a74..e3d4bd3fb 100644 --- a/src/battle/anim/seed.c +++ b/src/battle/anim/seed.c @@ -15,7 +15,7 @@ static void sub_80CABC0(struct Sprite* sprite); void sub_80CAB18(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); if (GetBankSide(gAnimBankAttacker)) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; @@ -31,7 +31,7 @@ void sub_80CAB18(struct Sprite* sprite) void sub_80CAB88(struct Sprite* sprite) { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) { sprite->invisible = 1; sprite->data[0] = 10; diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c index 0897ec6e3..280943a67 100644 --- a/src/battle/anim/sonic.c +++ b/src/battle/anim/sonic.c @@ -29,7 +29,7 @@ void sub_80CF6DC(struct Sprite* sprite) gBattleAnimArgs[3] = -gBattleAnimArgs[3]; } - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); a = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; b = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; c = sub_80790F0(a - sprite->pos1.x, b - sprite->pos1.y); diff --git a/src/battle/anim/sonic_task.c b/src/battle/anim/sonic_task.c index 924b1b568..260ae544c 100644 --- a/src/battle/anim/sonic_task.c +++ b/src/battle/anim/sonic_task.c @@ -87,7 +87,7 @@ void sub_80CFB04(u8 taskId) if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsAnimBankSpriteVisible(gAnimBankTarget ^ 2)) { - sub_807A3FC(gAnimBankTarget, 0, &sp1, &sp2); + SetAverageBattlerPositions(gAnimBankTarget, 0, &sp1, &sp2); } else { diff --git a/src/battle/anim/sword.c b/src/battle/anim/sword.c index b46fe6759..ca74980ea 100644 --- a/src/battle/anim/sword.c +++ b/src/battle/anim/sword.c @@ -15,7 +15,7 @@ static void sub_80CF6B4(struct Sprite* sprite); void sub_80CF690(struct Sprite* sprite) { - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); sprite->callback = sub_80785E4; StoreSpriteCallbackInData(sprite, sub_80CF6B4); } diff --git a/src/battle/anim/unused_8.c b/src/battle/anim/unused_8.c index 03772f951..0a06d3ac8 100644 --- a/src/battle/anim/unused_8.c +++ b/src/battle/anim/unused_8.c @@ -15,7 +15,7 @@ static void sub_80CF4B8(struct Sprite* sprite); void sub_80CF458(struct Sprite* sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[4]; diff --git a/src/battle/anim/unused_9.c b/src/battle/anim/unused_9.c index 0efd40c02..6e0d0321b 100644 --- a/src/battle/anim/unused_9.c +++ b/src/battle/anim/unused_9.c @@ -18,7 +18,7 @@ static void sub_80CFE2C(struct Sprite* sprite); void sub_80CFDFC(struct Sprite* sprite) { - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(gSpriteTemplate_83D75AC.paletteTag) << 4); sprite->callback = sub_80CFE2C; } diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c index 4068cbe78..d1ed05747 100644 --- a/src/battle/anim/water.c +++ b/src/battle/anim/water.c @@ -30,7 +30,7 @@ void sub_80D3838(struct Sprite *sprite) } else { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); } sprite->data[7] = gBattleAnimArgs[2]; diff --git a/src/battle/anim/wisp_orb.c b/src/battle/anim/wisp_orb.c index 0cbe6eed7..7c22b7f13 100644 --- a/src/battle/anim/wisp_orb.c +++ b/src/battle/anim/wisp_orb.c @@ -21,7 +21,7 @@ void sub_80D5B0C(struct Sprite *sprite) switch (sprite->data[0]) { case 0: - sub_80787B0(sprite, 0); + InitAnimSpritePos(sprite, 0); StartSpriteAnim(sprite, gBattleAnimArgs[2]); sprite->data[7] = gBattleAnimArgs[2]; @@ -86,7 +86,7 @@ static void sub_80D5C5C(struct Sprite *sprite) s16 initialData5; s16 newData5; - if (!sub_8078B5C(sprite)) + if (!TranslateAnimSpriteByDeltas(sprite)) { sprite->pos2.x += Sin(sprite->data[5], 16); initialData5 = sprite->data[5]; diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index 2f10b07ae..aadeb71b0 100644 --- a/src/battle/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -16,7 +16,7 @@ extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; static void AnimTask_ShakeMonStep(u8 taskId); -static void sub_80A808C(u8 taskId); +static void AnimTask_ShakeMon2Step(u8 taskId); static void sub_80A81D8(u8 taskId); static void sub_80A8374(u8 taskId); static void sub_80A8488(u8 taskId); @@ -154,13 +154,19 @@ static void AnimTask_ShakeMonStep(u8 taskId) } } - -void sub_80A7FA0(u8 taskId) +// Task to facilitate simple shaking of a pokemon's picture in battle. +// The shaking alternates between the positive and negative versions of the specified pixel offsets. +// arg 0: anim battler +// arg 1: x pixel offset +// arg 2: y pixel offset +// arg 3: num times to shake +// arg 4: frame delay +void AnimTask_ShakeMon2(u8 taskId) { u8 sprite; - bool8 r6; + bool8 destroy; u8 side; - r6 = 0; + destroy = FALSE; if (gBattleAnimArgs[0] < 4) { sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); @@ -188,21 +194,23 @@ void sub_80A7FA0(u8 taskId) side = GetBankByIdentity(3); break; } + if (IsAnimBankSpriteVisible(side) == FALSE) - { - r6 = 1; - } + destroy = TRUE; + sprite = gBankSpriteIds[side]; } else { sprite = gBankSpriteIds[gAnimBankAttacker]; } - if (r6) + + if (destroy) { DestroyAnimVisualTask(taskId); return; } + gSprites[sprite].pos2.x = gBattleAnimArgs[1]; gSprites[sprite].pos2.y = gBattleAnimArgs[2]; TASK.data[0] = sprite; @@ -211,30 +219,24 @@ void sub_80A7FA0(u8 taskId) TASK.data[3] = gBattleAnimArgs[4]; TASK.data[4] = gBattleAnimArgs[1]; TASK.data[5] = gBattleAnimArgs[2]; - TASK.func = sub_80A808C; - sub_80A808C(taskId); + TASK.func = AnimTask_ShakeMon2Step; + TASK.func(taskId); } -static void sub_80A808C(u8 taskId) +static void AnimTask_ShakeMon2Step(u8 taskId) { if (TASK.data[3] == 0) { if (SPRITE.pos2.x == TASK.data[4]) - { SPRITE.pos2.x = -TASK.data[4]; - } else - { SPRITE.pos2.x = TASK.data[4]; - } + if (SPRITE.pos2.y == TASK.data[5]) - { SPRITE.pos2.y = -TASK.data[5]; - } else - { SPRITE.pos2.y = TASK.data[5]; - } + TASK.data[3] = TASK.data[2]; if (--TASK.data[1] == 0) { diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c index f5b8e1c5d..3a47e0204 100644 --- a/src/battle/pokeball.c +++ b/src/battle/pokeball.c @@ -298,7 +298,7 @@ const struct SpriteTemplate gBallSpriteTemplates[] = extern u32 ball_number_to_ball_processing_index(u16); // not sure of return type extern void sub_80786EC(); -extern bool8 sub_8078718(struct Sprite *); +extern bool8 TranslateAnimSpriteLinearAndSine(struct Sprite *); extern u8 sub_814086C(u8, u8, int, int, u8); extern u8 sub_8141314(u8, u8, int, u8); @@ -406,7 +406,7 @@ static void sub_8046464(u8 taskId) static void objc_0804ABD4(struct Sprite *sprite) { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) { u8 taskId = sprite->oam.affineParam; u8 r5 = gTasks[taskId].data[4]; @@ -858,7 +858,7 @@ static void sub_80470C4(struct Sprite *sprite) StartSpriteAffineAnim(sprite, 4); } r4 = sprite->data[0]; - sub_8078B5C(sprite); + TranslateAnimSpriteByDeltas(sprite); sprite->data[7] += sprite->data[6] / 3; sprite->pos2.y += Sin(HIBYTE(sprite->data[7]), sprite->data[5]); sprite->oam.affineParam += 0x100; @@ -876,7 +876,7 @@ static void sub_80470C4(struct Sprite *sprite) } else { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) { sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index a60fc1078..9119c74ef 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -766,14 +766,14 @@ void sub_80786EC(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->data[6] = 0x8000 / sprite->data[0]; sprite->data[7] = 0; } -bool8 sub_8078718(struct Sprite *sprite) +bool8 TranslateAnimSpriteLinearAndSine(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) + if (TranslateAnimSpriteByDeltas(sprite)) return TRUE; sprite->data[7] += sprite->data[6]; sprite->pos2.y += Sin((u8)(sprite->data[7] >> 8), sprite->data[5]); @@ -799,7 +799,7 @@ void sub_8078764(struct Sprite *sprite, bool8 a2) sprite->pos1.y += gBattleAnimArgs[1]; } -void sub_80787B0(struct Sprite *sprite, u8 a2) +void InitAnimSpritePos(struct Sprite *sprite, u8 a2) { if (!a2) { @@ -953,30 +953,30 @@ void sub_8078A5C(struct Sprite *sprite) sprite->data[3] = 0; } -void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite) +void InitAnimSpriteTranslationDeltas(struct Sprite *sprite) { int x = sprite->data[2] - sprite->data[1]; int y = sprite->data[4] - sprite->data[3]; - bool8 r8 = x < 0; - bool8 r9 = y < 0; - u16 x2 = abs(x) << 8; - u16 y2 = abs(y) << 8; + bool8 movingLeft = x < 0; + bool8 movingUp = y < 0; + u16 xDelta = abs(x) << 8; + u16 yDelta = abs(y) << 8; - x2 = x2 / sprite->data[0]; - y2 = y2 / sprite->data[0]; + xDelta = xDelta / sprite->data[0]; + yDelta = yDelta / sprite->data[0]; - if (r8) - x2 |= 1; + if (movingLeft) + xDelta |= 1; else - x2 &= ~1; + xDelta &= ~1; - if (r9) - y2 |= 1; + if (movingUp) + yDelta |= 1; else - y2 &= ~1; + yDelta &= ~1; - sprite->data[1] = x2; - sprite->data[2] = y2; + sprite->data[1] = xDelta; + sprite->data[2] = yDelta; sprite->data[4] = 0; sprite->data[3] = 0; } @@ -985,12 +985,12 @@ void sub_8078B34(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); sprite->callback = sub_8078BB8; sprite->callback(sprite); } -bool8 sub_8078B5C(struct Sprite *sprite) +bool8 TranslateAnimSpriteByDeltas(struct Sprite *sprite) { u16 v1, v2, x, y; @@ -1022,7 +1022,7 @@ bool8 sub_8078B5C(struct Sprite *sprite) void sub_8078BB8(struct Sprite *sprite) { - if (sub_8078B5C(sprite)) + if (TranslateAnimSpriteByDeltas(sprite)) SetCallbackToStoredInData(sprite); } @@ -1030,7 +1030,7 @@ void sub_8078BD4(struct Sprite *sprite) { int v1 = abs(sprite->data[2] - sprite->data[1]) << 8; sprite->data[0] = v1 / sprite->data[0]; - obj_translate_based_on_private_1_2_3_4(sprite); + InitAnimSpriteTranslationDeltas(sprite); } void sub_8078C00(struct Sprite *sprite) @@ -1380,7 +1380,7 @@ void sub_80793C4(struct Sprite *sprite) else var = FALSE; if (!gBattleAnimArgs[2]) - sub_80787B0(sprite, var); + InitAnimSpritePos(sprite, var); else sub_8078764(sprite, var); sprite->data[0]++; @@ -1407,7 +1407,7 @@ void sub_807941C(struct Sprite *sprite) else v2 = 1; - sub_80787B0(sprite, v1); + InitAnimSpritePos(sprite, v1); if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; @@ -1419,7 +1419,7 @@ void sub_807941C(struct Sprite *sprite) void sub_80794A8(struct Sprite *sprite) { - sub_80787B0(sprite, 1); + InitAnimSpritePos(sprite, 1); if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; @@ -1432,7 +1432,7 @@ void sub_80794A8(struct Sprite *sprite) void sub_8079518(struct Sprite *sprite) { - if (sub_8078718(sprite)) + if (TranslateAnimSpriteLinearAndSine(sprite)) DestroyAnimSprite(sprite); } @@ -1452,7 +1452,7 @@ void sub_8079534(struct Sprite *sprite) } if (!gBattleAnimArgs[5]) { - sub_80787B0(sprite, r4); + InitAnimSpritePos(sprite, r4); slot = gAnimBankAttacker; } else @@ -2107,7 +2107,7 @@ s16 sub_807A100(u8 slot, u8 a2) } } -void sub_807A3FC(u8 slot, bool8 a2, s16 *a3, s16 *a4) +void SetAverageBattlerPositions(u8 slot, bool8 a2, s16 *x, s16 *y) { u8 v1, v2; s16 v3, v4; @@ -2135,8 +2135,8 @@ void sub_807A3FC(u8 slot, bool8 a2, s16 *a3, s16 *a4) v5 = v3; v6 = v4; } - *a3 = (v3 + v5) / 2; - *a4 = (v4 + v6) / 2; + *x = (v3 + v5) / 2; + *y = (v4 + v6) / 2; } u8 sub_807A4A0(int bank, u8 sprite, int species) -- cgit v1.2.3 From c775680d716299ae74cbcfb7eeb41c8982010021 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 11 Feb 2018 12:43:48 -0800 Subject: Document battle anim things related to STRENGTH, TACKLE, BODY_SLAM, and SUPERSONIC --- src/battle/anim/bug.c | 6 +- src/battle/anim/bullet.c | 2 +- src/battle/anim/dark.c | 2 +- src/battle/anim/dragon.c | 2 +- src/battle/anim/energy_wave.c | 2 +- src/battle/anim/fight.c | 10 +- src/battle/anim/grip.c | 2 +- src/battle/anim/guard.c | 2 +- src/battle/anim/lunge_1.c | 4 +- src/battle/anim/note_rain.c | 2 +- src/battle/anim/orbs.c | 4 +- src/battle/anim/poison.c | 4 +- src/battle/anim/rock.c | 6 +- src/battle/anim/scan.c | 4 +- src/battle/anim/sonic.c | 2 +- src/battle/anim/sunlight.c | 2 +- src/battle/anim/sword.c | 2 +- src/battle/anim/tile_out.c | 2 +- src/battle/anim/unused_8.c | 2 +- src/battle/anim/water.c | 2 +- src/battle/battle_anim_80A7E7C.c | 294 ++++++++++++++++------------ src/battle/battle_controller_linkopponent.c | 6 +- src/battle/battle_controller_linkpartner.c | 6 +- src/battle/battle_controller_opponent.c | 6 +- src/battle/battle_controller_player.c | 6 +- src/battle/battle_controller_wally.c | 4 +- src/rom_8077ABC.c | 37 ++-- 27 files changed, 237 insertions(+), 186 deletions(-) (limited to 'src') diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c index b2726d8dd..e12f55a8b 100644 --- a/src/battle/anim/bug.c +++ b/src/battle/anim/bug.c @@ -40,7 +40,7 @@ void sub_80DC824(struct Sprite *sprite) sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -65,7 +65,7 @@ void sub_80DC8F4(struct Sprite *sprite) sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -224,7 +224,7 @@ void sub_80DCBCC(struct Sprite *sprite) sprite->data[2] = lVarX; sprite->data[4] = lVarY; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/bullet.c b/src/battle/anim/bullet.c index 8fc581d47..1dca0b886 100644 --- a/src/battle/anim/bullet.c +++ b/src/battle/anim/bullet.c @@ -21,7 +21,7 @@ void sub_80CFFD8(struct Sprite* sprite) sprite->data[0] = 20; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; sprite->affineAnimPaused = 1; StoreSpriteCallbackInData(sprite, sub_80D0030); } diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index 83a375495..aaf8507c6 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -128,7 +128,7 @@ void sub_80DFE14(struct Sprite *sprite) sprite->data[3] = GetBankPosition(gAnimBankTarget, 3); sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3); sprite->data[0] = 0x7E; - sub_8078A5C(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = -sprite->data[1]; sprite->data[4] = -sprite->data[2]; sprite->data[6] = 0xFFD8; diff --git a/src/battle/anim/dragon.c b/src/battle/anim/dragon.c index 4f25cf1a5..dc2c0bc50 100644 --- a/src/battle/anim/dragon.c +++ b/src/battle/anim/dragon.c @@ -68,7 +68,7 @@ void sub_80DF63C(struct Sprite *sprite) StartSpriteAnim(sprite, 1); } sprite->data[0] = gBattleAnimArgs[4]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, move_anim_8074EE0); } diff --git a/src/battle/anim/energy_wave.c b/src/battle/anim/energy_wave.c index acab7bf80..8111f70a3 100644 --- a/src/battle/anim/energy_wave.c +++ b/src/battle/anim/energy_wave.c @@ -157,6 +157,6 @@ void sub_80D3728(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, var2) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c index f589622bd..a7c25de49 100644 --- a/src/battle/anim/fight.c +++ b/src/battle/anim/fight.c @@ -166,7 +166,7 @@ void sub_80D92D0(struct Sprite *sprite) } sprite->data[4] = sprite->pos1.y - 20; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, sub_80D9328); } @@ -182,7 +182,7 @@ static void sub_80D9328(struct Sprite *sprite) sprite->pos2.y = 0; sprite->pos2.x = 0; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } } @@ -261,7 +261,7 @@ static void sub_80D94CC(struct Sprite *sprite) sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, sub_80D9524); } } @@ -437,7 +437,7 @@ static void sub_80D986C(struct Sprite *sprite) InitAnimSpriteTranslationDeltas(sprite); StoreSpriteCallbackInData(sprite, move_anim_8074EE0); - sprite->callback = sub_8078BB8; + sprite->callback = TranslateAnimSpriteByDeltasUntil; } } @@ -532,7 +532,7 @@ void sub_80D9A38(struct Sprite *sprite) InitAnimSpriteTranslationDeltas(sprite); StoreSpriteCallbackInData(sprite, DestroyAnimSprite); - sprite->callback = sub_8078BB8; + sprite->callback = TranslateAnimSpriteByDeltasUntil; } static void sub_80D9B24(struct Sprite *sprite) diff --git a/src/battle/anim/grip.c b/src/battle/anim/grip.c index c4d7b1cef..dbf7a1562 100644 --- a/src/battle/anim/grip.c +++ b/src/battle/anim/grip.c @@ -33,7 +33,7 @@ void sub_80D0178(struct Sprite* sprite) sprite->data[0] = 6; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + r8; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + r6; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, sub_80D020C); } diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c index 9dcfa9f5d..211e0e841 100644 --- a/src/battle/anim/guard.c +++ b/src/battle/anim/guard.c @@ -30,6 +30,6 @@ void sub_80D3014(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y - 72; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/lunge_1.c b/src/battle/anim/lunge_1.c index a2adfba13..a3b5f19c5 100644 --- a/src/battle/anim/lunge_1.c +++ b/src/battle/anim/lunge_1.c @@ -48,7 +48,7 @@ void sub_80CD7CC(struct Sprite* sprite) sprite->data[2] = 0; sprite->data[3] = gBankSpriteIds[gAnimBankAttacker]; StoreSpriteCallbackInData(sprite, sub_80CD81C); - sprite->callback = sub_8078458; + sprite->callback = TranslateMonBGUntil; } void sub_80CD81C(struct Sprite* sprite) @@ -78,7 +78,7 @@ void sub_80CD8A8(struct Sprite* sprite) sprite->data[2] = 0; sprite->data[3] = gBankSpriteIds[gAnimBankAttacker]; StoreSpriteCallbackInData(sprite, sub_80CD9B8); - sprite->callback = sub_8078458; + sprite->callback = TranslateMonBGUntil; } void sub_80CD8F8(struct Sprite* sprite) diff --git a/src/battle/anim/note_rain.c b/src/battle/anim/note_rain.c index 552329a57..44817b0a0 100644 --- a/src/battle/anim/note_rain.c +++ b/src/battle/anim/note_rain.c @@ -31,7 +31,7 @@ void sub_80D1C08(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); sub_80D1BA8(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]); } diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c index eede55695..b965cacb8 100644 --- a/src/battle/anim/orbs.c +++ b/src/battle/anim/orbs.c @@ -23,7 +23,7 @@ void sub_80CA7B0(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2); sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3); - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, move_anim_8074EE0); } @@ -34,7 +34,7 @@ void sub_80CA800(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c index 656e923bc..272d99e84 100644 --- a/src/battle/anim/poison.c +++ b/src/battle/anim/poison.c @@ -71,7 +71,7 @@ void sub_80D9E94(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; - sub_8078A5C(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; @@ -104,7 +104,7 @@ void sub_80D9F14(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; sprite->data[4] = sprite->pos1.y + sprite->data[0]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c index 2df7e6642..1d1772b1b 100644 --- a/src/battle/anim/rock.c +++ b/src/battle/anim/rock.c @@ -91,7 +91,7 @@ void sub_80DCF60(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3]; - sub_8078A5C(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = 0; sprite->data[4] = 0; @@ -281,7 +281,7 @@ void sub_80DD490(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -517,7 +517,7 @@ void sub_80DD978(struct Sprite *sprite) if (GetBankSide(gAnimBankAttacker) == SIDE_OPPONENT) StartSpriteAffineAnim(sprite, 1); - sub_807941C(sprite); + TranslateAnimSpriteToTargetMonLocation(sprite); } void sub_80DD9A4(struct Sprite *sprite) diff --git a/src/battle/anim/scan.c b/src/battle/anim/scan.c index 22bb26973..e6b85dd5f 100644 --- a/src/battle/anim/scan.c +++ b/src/battle/anim/scan.c @@ -47,7 +47,7 @@ void sub_80CD408(struct Sprite* sprite) sprite->data[0] = 8; sprite->data[2] = sprite->pos1.x + gUnknown_083D6DDC[sprite->data[5] >> 8][0]; sprite->data[4] = sprite->pos1.y + gUnknown_083D6DDC[sprite->data[5] >> 8][1]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, sub_80CD4B8); sprite->data[5] += 0x100; PlaySE12WithPanning(0xD2, BattleAnimAdjustPanning(0x3F)); @@ -112,7 +112,7 @@ void sub_80CD4EC(struct Sprite* sprite) sprite->data[0] = 6; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + a; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + b; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, sub_80CD654); } } diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c index 280943a67..2808c86c2 100644 --- a/src/battle/anim/sonic.c +++ b/src/battle/anim/sonic.c @@ -41,7 +41,7 @@ void sub_80CF6DC(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = a; sprite->data[4] = b; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/sunlight.c b/src/battle/anim/sunlight.c index e6fd49a11..88112c74a 100644 --- a/src/battle/anim/sunlight.c +++ b/src/battle/anim/sunlight.c @@ -12,6 +12,6 @@ void sub_80D517C(struct Sprite *sprite) sprite->data[0] = 60; sprite->data[2] = 140; sprite->data[4] = 80; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/sword.c b/src/battle/anim/sword.c index ca74980ea..3367cca07 100644 --- a/src/battle/anim/sword.c +++ b/src/battle/anim/sword.c @@ -25,6 +25,6 @@ void sub_80CF6B4(struct Sprite* sprite) sprite->data[0] = 6; sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y - 32; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/tile_out.c b/src/battle/anim/tile_out.c index 50468a440..39d4ff01f 100644 --- a/src/battle/anim/tile_out.c +++ b/src/battle/anim/tile_out.c @@ -37,7 +37,7 @@ void sub_80CE1AC(struct Sprite* sprite) sprite->data[0] = 30; sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2); sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3); - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } } diff --git a/src/battle/anim/unused_8.c b/src/battle/anim/unused_8.c index 0a06d3ac8..b5e150dd8 100644 --- a/src/battle/anim/unused_8.c +++ b/src/battle/anim/unused_8.c @@ -28,7 +28,7 @@ void sub_80CF490(struct Sprite* sprite) sprite->data[0] = sprite->data[1]; sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y + 15; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, sub_80CF4B8); } diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c index d1ed05747..e6945f9b2 100644 --- a/src/battle/anim/water.c +++ b/src/battle/anim/water.c @@ -18,7 +18,7 @@ void sub_80D37FC(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[4]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index aadeb71b0..73e606b79 100644 --- a/src/battle/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "battle_anim.h" #include "rom_8077ABC.h" #include "sprite.h" @@ -17,16 +18,16 @@ extern u8 gAnimBankTarget; static void AnimTask_ShakeMonStep(u8 taskId); static void AnimTask_ShakeMon2Step(u8 taskId); -static void sub_80A81D8(u8 taskId); -static void sub_80A8374(u8 taskId); +static void AnimTask_ShakeMonInPlaceStep(u8 taskId); +static void AnimTask_ShakeAndSinkMonStep(u8 taskId); static void sub_80A8488(u8 taskId); -static void sub_80A8530(struct Sprite *sprite); -static void sub_80A85A4(struct Sprite *sprite); -static void sub_80A85C8(struct Sprite *sprite); -static void sub_80A8614(struct Sprite* sprite); -static void sub_80A8638(struct Sprite *sprite); -static void sub_80A86F4(struct Sprite *sprite); -static void sub_80A8764(struct Sprite *sprite); +static void DoHorizontalLunge(struct Sprite *sprite); +static void ReverseHorizontalLungeDirection(struct Sprite *sprite); +static void DoVerticalDip(struct Sprite *sprite); +static void ReverseVerticalDipDirection(struct Sprite* sprite); +static void SlideMonToOriginalPos(struct Sprite *sprite); +static void SlideMonToOriginalPosStep(struct Sprite *sprite); +static void SlideMonToOffset(struct Sprite *sprite); static void sub_80A8818(struct Sprite *sprite); static void sub_80A88F0(struct Sprite *sprite); static void sub_80A89B4(u8 taskId); @@ -36,7 +37,7 @@ static void sub_80A8D8C(u8 taskId); static void sub_80A8FD8(u8 taskId); static void sub_80A913C(u8 taskId); -const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FB0 = +const struct SpriteTemplate gHorizontalLungeSpriteTemplate = { .tileTag = 0, .paletteTag = 0, @@ -44,10 +45,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FB0 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A8530, + .callback = DoHorizontalLunge, }; -const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FC8 = +const struct SpriteTemplate gVerticalDipSpriteTemplate = { .tileTag = 0, .paletteTag = 0, @@ -55,10 +56,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FC8 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A85C8, + .callback = DoVerticalDip, }; -const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FE0 = +const struct SpriteTemplate gSlideMonToOriginalPosSpriteTemplate = { .tileTag = 0, .paletteTag = 0, @@ -66,10 +67,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FE0 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A8638, + .callback = SlideMonToOriginalPos, }; -const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FF8 = +const struct SpriteTemplate gSlideMonToOffsetSpriteTemplate = { .tileTag = 0, .paletteTag = 0, @@ -77,7 +78,7 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FF8 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A8764, + .callback = SlideMonToOffset, }; const struct SpriteTemplate gBattleAnimSpriteTemplate_83C2010 = @@ -252,29 +253,37 @@ static void AnimTask_ShakeMon2Step(u8 taskId) } } -void sub_80A8154(u8 taskId) +// Task to facilitate simple shaking of a pokemon's picture in battle. +// The shaking alternates between the positive and negative versions of the specified pixel offsets +// with respect to the current location of the mon's picture. +// arg 0: battler +// arg 1: x offset +// arg 2: y offset +// arg 3: num shakes +// arg 4: delay +void AnimTask_ShakeMonInPlace(u8 taskId) { - u8 sprite; - sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); - if (sprite == 0xff) + u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); + if (spriteId == 0xff) { DestroyAnimVisualTask(taskId); return; } - gSprites[sprite].pos2.x += gBattleAnimArgs[1]; - gSprites[sprite].pos2.y += gBattleAnimArgs[2]; - TASK.data[0] = sprite; + + gSprites[spriteId].pos2.x += gBattleAnimArgs[1]; + gSprites[spriteId].pos2.y += gBattleAnimArgs[2]; + TASK.data[0] = spriteId; TASK.data[1] = 0; TASK.data[2] = gBattleAnimArgs[3]; TASK.data[3] = 0; TASK.data[4] = gBattleAnimArgs[4]; TASK.data[5] = gBattleAnimArgs[1] * 2; TASK.data[6] = gBattleAnimArgs[2] * 2; - TASK.func = sub_80A81D8; - sub_80A81D8(taskId); + TASK.func = AnimTask_ShakeMonInPlaceStep; + TASK.func(taskId); } -static void sub_80A81D8(u8 taskId) +static void AnimTask_ShakeMonInPlaceStep(u8 taskId) { if (TASK.data[3] == 0) { @@ -311,7 +320,13 @@ static void sub_80A81D8(u8 taskId) } } -void sub_80A8314(u8 taskId) +// Shakes a mon bg horizontally and moves it downward linearly. +// arg 0: battler +// arg 1: x offset +// arg 2: frame delay between each movement +// arg 3: downward speed (subpixel) +// arg 4: duration +void AnimTask_ShakeAndSinkMon(u8 taskId) { u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); gSprites[sprite].pos2.x = gBattleAnimArgs[1]; @@ -320,11 +335,11 @@ void sub_80A8314(u8 taskId) TASK.data[2] = gBattleAnimArgs[2]; TASK.data[3] = gBattleAnimArgs[3]; TASK.data[4] = gBattleAnimArgs[4]; - TASK.func = sub_80A8374; - sub_80A8374(taskId); + TASK.func = AnimTask_ShakeAndSinkMonStep; + TASK.func(taskId); } -static void sub_80A8374(u8 taskId) +static void AnimTask_ShakeAndSinkMonStep(u8 taskId) { s16 x; u8 sprite; @@ -334,11 +349,11 @@ static void sub_80A8374(u8 taskId) { TASK.data[8] = 0; if (gSprites[sprite].pos2.x == x) - { x = -x; - } + gSprites[sprite].pos2.x += x; } + TASK.data[1] = x; TASK.data[9] += TASK.data[3]; gSprites[sprite].pos2.y = TASK.data[9] >> 8; @@ -349,89 +364,109 @@ static void sub_80A8374(u8 taskId) } } -void sub_80A8408(u8 taskId) +// Moves a mon bg picture along an elliptical path that begins +// and ends at the mon's origin location. +// arg 0: battler +// arg 1: ellipse width +// arg 2: ellipse height +// arg 3: num loops +// arg 4: speed (valid values are 0-5) +void AnimTask_TranslateMonElliptical(u8 taskId) { u8 i; - u8 sprite; - u8 v1; - v1 = 1; - sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); + u8 spriteId; + u8 wavePeriod; + + wavePeriod = 1; + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (gBattleAnimArgs[4] > 5) - { gBattleAnimArgs[4] = 5; - } + for (i = 0; i < gBattleAnimArgs[4]; i++) { - v1 <<= 1; + wavePeriod <<= 1; } - TASK.data[0] = sprite; + + TASK.data[0] = spriteId; TASK.data[1] = gBattleAnimArgs[1]; TASK.data[2] = gBattleAnimArgs[2]; TASK.data[3] = gBattleAnimArgs[3]; - TASK.data[4] = v1; + TASK.data[4] = wavePeriod; TASK.func = sub_80A8488; - sub_80A8488(taskId); + TASK.func(taskId); } static void sub_80A8488(u8 taskId) { - u8 sprite; - sprite = TASK.data[0]; - gSprites[sprite].pos2.x = Sin(TASK.data[5], TASK.data[1]); - gSprites[sprite].pos2.y = -Cos(TASK.data[5], TASK.data[2]); - gSprites[sprite].pos2.y += TASK.data[2]; + u8 spriteId = TASK.data[0]; + gSprites[spriteId].pos2.x = Sin(TASK.data[5], TASK.data[1]); + gSprites[spriteId].pos2.y = -Cos(TASK.data[5], TASK.data[2]); + gSprites[spriteId].pos2.y += TASK.data[2]; TASK.data[5] += TASK.data[4]; TASK.data[5] &= 0xff; + if (TASK.data[5] == 0) - { TASK.data[3]--; - } + if (TASK.data[3] == 0) { - gSprites[sprite].pos2.x = 0; - gSprites[sprite].pos2.y = 0; + gSprites[spriteId].pos2.x = 0; + gSprites[spriteId].pos2.y = 0; DestroyAnimVisualTask(taskId); return; } } -void sub_80A8500(u8 taskId) +// Moves a mon bg picture along an elliptical path that begins +// and ends at the mon's origin location. Reverses the direction +// of the path if it's not on the player's side of the battle. +// arg 0: battler +// arg 1: ellipse width +// arg 2: ellipse height +// arg 3: num loops +// arg 4: speed (valid values are 0-5) +void AnimTask_TranslateMonEllipticalRespectSide(u8 taskId) { - if (GetBankSide(gAnimBankAttacker)) - { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - } - sub_80A8408(taskId); + + AnimTask_TranslateMonElliptical(taskId); } -static void sub_80A8530(struct Sprite *sprite) +// Performs a simple horizontal lunge, where the mon moves +// horizontally, and then moves back in the opposite direction. +// arg 0: duration of single lunge direction +// arg 1: x pixel delta that is applied each frame +static void DoHorizontalLunge(struct Sprite *sprite) { sprite->invisible = TRUE; - if (GetBankSide(gAnimBankAttacker)) - { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) sprite->data[1] = -gBattleAnimArgs[1]; - } else - { sprite->data[1] = gBattleAnimArgs[1]; - } + sprite->data[0] = gBattleAnimArgs[0]; sprite->data[2] = 0; sprite->data[3] = gBankSpriteIds[gAnimBankAttacker]; sprite->data[4] = gBattleAnimArgs[0]; - StoreSpriteCallbackInData(sprite, sub_80A85A4); - sprite->callback = sub_8078458; + StoreSpriteCallbackInData(sprite, ReverseHorizontalLungeDirection); + sprite->callback = TranslateMonBGUntil; } -static void sub_80A85A4(struct Sprite *sprite) +static void ReverseHorizontalLungeDirection(struct Sprite *sprite) { sprite->data[0] = sprite->data[4]; sprite->data[1] = -sprite->data[1]; - sprite->callback = sub_8078458; + sprite->callback = TranslateMonBGUntil; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -static void sub_80A85C8(struct Sprite *sprite) +// Performs a simple vertical dipping motion, where moves vertically, and then +// moves back in the opposite direction. +// arg 0: duration of single dip direction +// arg 1: y pixel delta that is applied each frame +// arg 2: battler +static void DoVerticalDip(struct Sprite *sprite) { u8 spriteId; sprite->invisible = TRUE; @@ -441,73 +476,72 @@ static void sub_80A85C8(struct Sprite *sprite) sprite->data[2] = gBattleAnimArgs[1]; sprite->data[3] = spriteId; sprite->data[4] = gBattleAnimArgs[0]; - StoreSpriteCallbackInData(sprite, sub_80A8614); - sprite->callback = sub_8078458; + StoreSpriteCallbackInData(sprite, ReverseVerticalDipDirection); + sprite->callback = TranslateMonBGUntil; } -static void sub_80A8614(struct Sprite *sprite) +static void ReverseVerticalDipDirection(struct Sprite *sprite) { sprite->data[0] = sprite->data[4]; sprite->data[2] = -sprite->data[2]; - sprite->callback = sub_8078458; + sprite->callback = TranslateMonBGUntil; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -static void sub_80A8638(struct Sprite *sprite) +// Linearly slides a mon's bg picture back to its original sprite position. +// The sprite parameter is a dummy sprite used for facilitating the movement with its callback. +// arg 0: 1 = target or 0 = attacker +// arg 1: direction (0 = horizontal and vertical, 1 = horizontal only, 2 = vertical only) +// arg 2: duration +static void SlideMonToOriginalPos(struct Sprite *sprite) { int something; - int spriteId; + int monSpriteId; if (!gBattleAnimArgs[0]) - { - spriteId = gBankSpriteIds[gAnimBankAttacker]; - } + monSpriteId = gBankSpriteIds[gAnimBankAttacker]; else - { - spriteId = gBankSpriteIds[gAnimBankTarget]; - } + monSpriteId = gBankSpriteIds[gAnimBankTarget]; + sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - sprite->data[2] = gSprites[spriteId].pos1.x; - sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; - sprite->data[4] = gSprites[spriteId].pos1.y; + sprite->data[1] = gSprites[monSpriteId].pos1.x + gSprites[monSpriteId].pos2.x; + sprite->data[2] = gSprites[monSpriteId].pos1.x; + sprite->data[3] = gSprites[monSpriteId].pos1.y + gSprites[monSpriteId].pos2.y; + sprite->data[4] = gSprites[monSpriteId].pos1.y; something = 0; - sub_8078A5C(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = something; sprite->data[4] = something; - sprite->data[5] = gSprites[spriteId].pos2.x; - sprite->data[6] = gSprites[spriteId].pos2.y; + sprite->data[5] = gSprites[monSpriteId].pos2.x; + sprite->data[6] = gSprites[monSpriteId].pos2.y; sprite->invisible = TRUE; + if (gBattleAnimArgs[1] == 1) - { sprite->data[2] = something; - } else if (gBattleAnimArgs[1] == 2) - { sprite->data[1] = something; - } + sprite->data[7] = gBattleAnimArgs[1]; - sprite->data[7] |= spriteId << 8; - sprite->callback = sub_80A86F4; + sprite->data[7] |= monSpriteId << 8; + sprite->callback = SlideMonToOriginalPosStep; } -static void sub_80A86F4(struct Sprite *sprite) +static void SlideMonToOriginalPosStep(struct Sprite *sprite) { - s8 spriteId; + s8 monSpriteId; u8 lo; - struct Sprite *sprite2; + struct Sprite *monSprite; + lo = sprite->data[7] & 0xff; - spriteId = sprite->data[7] >> 8; - sprite2 = &gSprites[spriteId]; + monSpriteId = sprite->data[7] >> 8; + monSprite = &gSprites[monSpriteId]; if (sprite->data[0] == 0) { if (lo < 2) - { - sprite2->pos2.x = 0; - } + monSprite->pos2.x = 0; + if (lo == 2 || lo == 0) - { - sprite2->pos2.y = 0; - } + monSprite->pos2.y = 0; + DestroyAnimSprite(sprite); } else @@ -515,25 +549,30 @@ static void sub_80A86F4(struct Sprite *sprite) sprite->data[0]--; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; - sprite2->pos2.x = (s8)(sprite->data[3] >> 8) + sprite->data[5]; - sprite2->pos2.y = (s8)(sprite->data[4] >> 8) + sprite->data[6]; + monSprite->pos2.x = (s8)(sprite->data[3] >> 8) + sprite->data[5]; + monSprite->pos2.y = (s8)(sprite->data[4] >> 8) + sprite->data[6]; } } -static void sub_80A8764(struct Sprite *sprite) +// Linearly translates a mon to a target offset. The horizontal offset +// is mirrored for the opponent's pokemon, and the vertical offset +// is only mirrored if arg 3 is set to 1. +// arg 0: 0 = attacker, 1 = target +// arg 1: target x pixel offset +// arg 2: target y pixel offset +// arg 3: mirror vertical translation for opposite battle side +// arg 4: duration +static void SlideMonToOffset(struct Sprite *sprite) { - u8 v1; - u8 spriteId; + u8 battler; + u8 monSpriteId; if (!gBattleAnimArgs[0]) - { - v1 = gAnimBankAttacker; - } + battler = gAnimBankAttacker; else - { - v1 = gAnimBankTarget; - } - spriteId = gBankSpriteIds[v1]; - if (GetBankSide(v1)) + battler = gAnimBankTarget; + + monSpriteId = gBankSpriteIds[battler]; + if (GetBankSide(battler) != SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; if (gBattleAnimArgs[3] == 1) @@ -541,18 +580,19 @@ static void sub_80A8764(struct Sprite *sprite) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } } + sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[1] = gSprites[spriteId].pos1.x; - sprite->data[2] = gSprites[spriteId].pos1.x + gBattleAnimArgs[1]; - sprite->data[3] = gSprites[spriteId].pos1.y; - sprite->data[4] = gSprites[spriteId].pos1.y + gBattleAnimArgs[2]; - sub_8078A5C(sprite); + sprite->data[1] = gSprites[monSpriteId].pos1.x; + sprite->data[2] = gSprites[monSpriteId].pos1.x + gBattleAnimArgs[1]; + sprite->data[3] = gSprites[monSpriteId].pos1.y; + sprite->data[4] = gSprites[monSpriteId].pos1.y + gBattleAnimArgs[2]; + InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = 0; sprite->data[4] = 0; - sprite->data[5] = spriteId; + sprite->data[5] = monSpriteId; sprite->invisible = TRUE; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); - sprite->callback = sub_80784A8; + sprite->callback = TranslateMonBGSubPixelUntil; } static void sub_80A8818(struct Sprite *sprite) @@ -582,7 +622,7 @@ static void sub_80A8818(struct Sprite *sprite) sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1]; sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2]; - sub_8078A5C(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = gSprites[spriteId].pos2.x << 8; sprite->data[4] = gSprites[spriteId].pos2.y << 8; sprite->data[5] = spriteId; @@ -595,7 +635,7 @@ static void sub_80A8818(struct Sprite *sprite) { StoreSpriteCallbackInData(sprite, sub_80A88F0); } - sprite->callback = sub_80784A8; + sprite->callback = TranslateMonBGSubPixelUntil; } diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c index 604c21e6d..21ac62401 100644 --- a/src/battle/battle_controller_linkopponent.c +++ b/src/battle/battle_controller_linkopponent.c @@ -73,7 +73,7 @@ extern void sub_80313A0(struct Sprite *); extern void sub_803757C(void); extern void oamt_add_pos2_onto_pos1(); extern void StoreSpriteCallbackInData(); -extern void sub_8078B34(struct Sprite *); +extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); extern void sub_80375B4(void); extern void sub_8010384(struct Sprite *); extern void sub_8037B78(void); @@ -1282,7 +1282,7 @@ void LinkOpponentHandleTrainerSlideBack(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_80375B4; } @@ -1633,7 +1633,7 @@ void LinkOpponentHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_803A3A8); taskId = CreateTask(sub_803A2C4, 5); gTasks[taskId].data[0] = gActiveBank; diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c index e1f93ba08..1d42f56c3 100644 --- a/src/battle/battle_controller_linkpartner.c +++ b/src/battle/battle_controller_linkpartner.c @@ -76,7 +76,7 @@ extern u8 sub_8031720(); extern u8 mplay_80342A4(); extern void oamt_add_pos2_onto_pos1(); extern void StoreSpriteCallbackInData(); -extern void sub_8078B34(struct Sprite *); +extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); extern void sub_80105EC(struct Sprite *); extern s32 sub_803FC34(u16); extern void LoadPlayerTrainerBankSprite(); @@ -1227,7 +1227,7 @@ void LinkPartnerHandleTrainerSlideBack(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_811DB1C; } @@ -1579,7 +1579,7 @@ void LinkPartnerHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index 5fb642e0c..8e8743dbc 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -84,7 +84,7 @@ extern void sub_80313A0(struct Sprite *); extern void sub_8032B4C(void); extern void sub_8031A6C(u16, u8); extern void sub_8032B84(void); -extern void sub_8078B34(struct Sprite *); +extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); extern void sub_8032BBC(void); extern void oamt_add_pos2_onto_pos1(); extern void StoreSpriteCallbackInData(); @@ -1286,7 +1286,7 @@ void OpponentHandleTrainerSlideBack(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_8032BBC; } @@ -2225,7 +2225,7 @@ void OpponentHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8035C10); taskId = CreateTask(sub_8035C44, 5); gTasks[taskId].data[0] = gActiveBank; diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 33a29c064..e28c058a3 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -102,7 +102,7 @@ extern void sub_8047858(); extern u8 GetBankSide(u8); extern void StartBattleIntroAnim(); extern void oamt_add_pos2_onto_pos1(); -extern void sub_8078B34(struct Sprite *); +extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); extern void StoreSpriteCallbackInData(); extern void BattleLoadPlayerMonSprite(); extern bool8 IsDoubleBattle(void); @@ -3145,7 +3145,7 @@ void PlayerHandleTrainerSlideBack(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); gBattleBankFunc[gActiveBank] = sub_802D274; @@ -3600,7 +3600,7 @@ void PlayerHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c index 3eacaa085..c590b487c 100644 --- a/src/battle/battle_controller_wally.c +++ b/src/battle/battle_controller_wally.c @@ -87,7 +87,7 @@ extern void sub_80304A8(void); extern void sub_8047858(); extern void StartBattleIntroAnim(); extern void oamt_add_pos2_onto_pos1(); -extern void sub_8078B34(struct Sprite *); +extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); extern void sub_8030E38(struct Sprite *); extern void StoreSpriteCallbackInData(); extern u8 sub_8046400(); @@ -1484,7 +1484,7 @@ void WallyHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50; gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y; - gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8078B34; + gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas; gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1); diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 9119c74ef..395736d03 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -636,7 +636,7 @@ void unref_sub_8078414(struct Sprite *sprite) sprite->callback = sub_80782F8; } -void sub_8078458(struct Sprite *sprite) +void TranslateMonBGUntil(struct Sprite *sprite) { if (sprite->data[0] > 0) { @@ -650,7 +650,9 @@ void sub_8078458(struct Sprite *sprite) } } -void sub_80784A8(struct Sprite *sprite) +// Same as TranslateMonBGUntil, but it operates on sub-pixel values +// to handle slower translations. +void TranslateMonBGSubPixelUntil(struct Sprite *sprite) { if (sprite->data[0] > 0) { @@ -938,12 +940,12 @@ void sub_8078A34(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; - sub_8078A5C(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->callback = sub_80783D0; sprite->callback(sprite); } -void sub_8078A5C(struct Sprite *sprite) +void InitSpriteDataForLinearTranslation(struct Sprite *sprite) { s16 x = (sprite->data[2] - sprite->data[1]) << 8; s16 y = (sprite->data[4] - sprite->data[3]) << 8; @@ -981,12 +983,12 @@ void InitAnimSpriteTranslationDeltas(struct Sprite *sprite) sprite->data[3] = 0; } -void sub_8078B34(struct Sprite *sprite) +void StartTranslateAnimSpriteByDeltas(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; InitAnimSpriteTranslationDeltas(sprite); - sprite->callback = sub_8078BB8; + sprite->callback = TranslateAnimSpriteByDeltasUntil; sprite->callback(sprite); } @@ -1020,7 +1022,7 @@ bool8 TranslateAnimSpriteByDeltas(struct Sprite *sprite) return FALSE; } -void sub_8078BB8(struct Sprite *sprite) +void TranslateAnimSpriteByDeltasUntil(struct Sprite *sprite) { if (TranslateAnimSpriteByDeltas(sprite)) SetCallbackToStoredInData(sprite); @@ -1038,7 +1040,7 @@ void sub_8078C00(struct Sprite *sprite) sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sub_8078BD4(sprite); - sprite->callback = sub_8078BB8; + sprite->callback = TranslateAnimSpriteByDeltasUntil; sprite->callback(sprite); } @@ -1392,7 +1394,15 @@ void sub_80793C4(struct Sprite *sprite) } } -void sub_807941C(struct Sprite *sprite) +// Linearly translates a sprite to a target position on the +// other mon's sprite. +// arg 0: initial x offset +// arg 1: initial y offset +// arg 2: target x offset +// arg 3: target y offset +// arg 4: duration +// arg 5: lower 8 bits = location on attacking mon, upper 8 bits = location on target mon pick to target +void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite) { bool8 v1; u8 v2; @@ -1408,12 +1418,13 @@ void sub_807941C(struct Sprite *sprite) v2 = 1; InitAnimSpritePos(sprite, v1); - if (GetBankSide(gAnimBankAttacker)) + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, v2) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -1466,7 +1477,7 @@ void sub_8079534(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBankPosition(slot, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(slot, r7) + gBattleAnimArgs[3]; - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -2338,6 +2349,6 @@ void sub_807A9BC(struct Sprite *sprite) sprite->pos1.x += x; sprite->pos1.y = gBattleAnimArgs[5] - 80; } - sprite->callback = sub_8078B34; + sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -- cgit v1.2.3 From fcb5b905d91232a2e991ce987ccf1c227abc0e22 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 11 Feb 2018 12:59:38 -0800 Subject: Document battle anim things related to SCREECH --- src/battle/battle_anim_80A7E7C.c | 56 +++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index 73e606b79..f339a1206 100644 --- a/src/battle/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -32,7 +32,7 @@ static void sub_80A8818(struct Sprite *sprite); static void sub_80A88F0(struct Sprite *sprite); static void sub_80A89B4(u8 taskId); static void sub_80A8A18(u8 taskId); -static void sub_80A8C0C(u8 taskId); +static void AnimTask_SwayMonStep(u8 taskId); static void sub_80A8D8C(u8 taskId); static void sub_80A8FD8(u8 taskId); static void sub_80A913C(u8 taskId); @@ -754,59 +754,67 @@ static void sub_80A8B3C(u8 taskId) } } -void sub_80A8B88(u8 taskId) +// Task that facilitates translating the mon bg picture back and forth +// in a swaying motion (uses Sine wave). It can sway either horizontally +// or vertically, but not both. +// arg 0: direction (0 = horizontal, 1 = vertical) +// arg 1: wave amplitude +// arg 2: wave period +// arg 3: num sways +// arg 4: which mon (0 = attacker, 1`= target) +void AnimTask_SwayMon(u8 taskId) { u8 spriteId; - if (GetBankSide(gAnimBankAttacker)) - { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - } + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]); TASK.data[0] = gBattleAnimArgs[0]; TASK.data[1] = gBattleAnimArgs[1]; TASK.data[2] = gBattleAnimArgs[2]; TASK.data[3] = gBattleAnimArgs[3]; TASK.data[4] = spriteId; + if (gBattleAnimArgs[4] == 0) - { TASK.data[5] = gAnimBankAttacker; - } else - { TASK.data[5] = gAnimBankTarget; - } + TASK.data[12] = 1; - TASK.func = sub_80A8C0C; + TASK.func = AnimTask_SwayMonStep; } -static void sub_80A8C0C(u8 taskId) +static void AnimTask_SwayMonStep(u8 taskId) { - s16 y; + s16 sineValue; u8 spriteId; - int index; - u16 val; + int waveIndex; + u16 sineIndex; + spriteId = TASK.data[4]; - val = TASK.data[10] + TASK.data[2]; - TASK.data[10] = val; - index = val >> 8; - y = Sin(index, TASK.data[1]); + sineIndex = TASK.data[10] + TASK.data[2]; + TASK.data[10] = sineIndex; + waveIndex = sineIndex >> 8; + sineValue = Sin(waveIndex, TASK.data[1]); + if (TASK.data[0] == 0) { - gSprites[spriteId].pos2.x = y; + gSprites[spriteId].pos2.x = sineValue; } else { - if (GetBankSide(TASK.data[5]) == 0) + if (GetBankSide(TASK.data[5]) == SIDE_PLAYER) { - gSprites[spriteId].pos2.y = (y >= 0) ? y : -y; + gSprites[spriteId].pos2.y = (sineValue >= 0) ? sineValue : -sineValue; } else { - gSprites[spriteId].pos2.y = (y >= 0) ? -y : y; + gSprites[spriteId].pos2.y = (sineValue >= 0) ? -sineValue : sineValue; } } - if (((index >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1)) - || ((index < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0))) + + if (((waveIndex >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1)) + || ((waveIndex < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0))) { TASK.data[11] ^= 1; TASK.data[12] ^= 1; -- cgit v1.2.3 From ee1cddcfe214aa733e31b27131d7cba8e7cf8c2c Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 14 Feb 2018 14:52:49 -0600 Subject: decompile debug_sub_8011498 --- src/battle/battle_2.c | 404 ++++++++------------------------------------------ 1 file changed, 60 insertions(+), 344 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index e37c33d0f..16c0f7fc2 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1379,6 +1379,7 @@ void debug_nullsub_3(void); void debug_sub_80125A0(void); void debug_sub_80125E4(void); void debug_sub_8012628(void); +void debug_sub_8012658(void); void debug_sub_8012688(void); void debug_sub_8012878(void); void debug_sub_8012D10(u8); @@ -1551,13 +1552,13 @@ void debug_sub_8010B80(u8 a) { s8 r12 = 0; s8 r7 = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0]; - + while (r7 >= 10) { r7 -= 10; r12++; } - + if (a & 2) { if (a & 1) @@ -1906,348 +1907,63 @@ void debug_sub_8010CAC(void) BuildOamBuffer(); } -__attribute__((naked)) -void debug_sub_8011498() +extern u16 gUnknown_Debug_821F564[][5]; + +void debug_sub_8011498(void) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " ldr r2, ._687 @ gUnknown_Debug_030043A0\n" - " ldr r0, ._687 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r9, r0\n" - " ldr r4, ._687 + 8 @ gMain\n" - " ldrh r1, [r4, #0x28]\n" - " mov r0, #0x81\n" - " lsl r0, r0, #0x2\n" - " cmp r1, r0\n" - " bne ._674 @cond_branch\n" - " bl DoSoftReset\n" - "._674:\n" - " ldrh r0, [r4, #0x2a]\n" - " cmp r0, #0x4\n" - " bne ._675 @cond_branch\n" - " bl debug_sub_8012658\n" - " ldr r0, ._687 + 12 @ debug_sub_8010CAC\n" - " bl SetMainCallback2\n" - "._675:\n" - " ldrh r0, [r4, #0x2a]\n" - " cmp r0, #0x8\n" - " bne ._676 @cond_branch\n" - " bl debug_sub_801174C\n" - "._676:\n" - " ldrh r0, [r4, #0x2a]\n" - " cmp r0, #0x40\n" - " beq ._677 @cond_branch\n" - " cmp r0, #0x80\n" - " bne ._678 @cond_branch\n" - "._677:\n" - " bl debug_sub_8012658\n" - " ldr r0, ._687 + 16 @ gUnknown_Debug_030043A8\n" - " ldrb r1, [r0]\n" - " mov r2, #0x2\n" - " eor r1, r1, r2\n" - " strb r1, [r0]\n" - " bl debug_sub_8012628\n" - "._678:\n" - " ldr r0, ._687 + 8 @ gMain\n" - " ldrh r0, [r0, #0x2a]\n" - " cmp r0, #0x20\n" - " beq ._679 @cond_branch\n" - " cmp r0, #0x10\n" - " bne ._680 @cond_branch\n" - "._679:\n" - " bl debug_sub_8012658\n" - " ldr r0, ._687 + 16 @ gUnknown_Debug_030043A8\n" - " ldrb r1, [r0]\n" - " mov r2, #0x1\n" - " eor r1, r1, r2\n" - " strb r1, [r0]\n" - " bl debug_sub_8012628\n" - "._680:\n" - " ldr r0, ._687 + 8 @ gMain\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._681 @cond_branch\n" - " ldr r0, ._687 + 20 @ gUnknown_Debug_2023B02\n" - " mov r8, r0\n" - " ldr r6, ._687 + 16 @ gUnknown_Debug_030043A8\n" - " ldrb r4, [r6]\n" - " lsl r4, r4, #0x1\n" - " mov r0, r9\n" - " mov r1, #0x5\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x15\n" - " add r4, r4, r0\n" - " ldr r5, ._687 + 24 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r5]\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x4\n" - " add r4, r4, r1\n" - " add r4, r4, r8\n" - " ldrh r1, [r4]\n" - " sub r1, r1, #0x1\n" - " strh r1, [r4]\n" - " ldrb r3, [r6]\n" - " lsl r1, r3, #0x1\n" - " add r1, r1, r0\n" - " ldrb r2, [r5]\n" - " lsl r0, r2, #0x1\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x4\n" - " add r1, r1, r0\n" - " mov r0, r8\n" - " add r4, r1, r0\n" - " mov r0, #0x0\n" - " ldsh r1, [r4, r0]\n" - " ldr r5, ._687 + 28 @ gUnknown_Debug_821F564\n" - " lsl r0, r3, #0x2\n" - " add r0, r0, r3\n" - " lsl r2, r0, #0x1\n" - " add r0, r5, #0\n" - " add r0, r0, #0x8\n" - " add r0, r2, r0\n" - " ldrh r0, [r0]\n" - " cmp r1, r0\n" - " bge ._682 @cond_branch\n" - " add r0, r5, #6\n" - " add r0, r2, r0\n" - " ldrh r0, [r0]\n" - " strh r0, [r4]\n" - "._682:\n" - " bl debug_sub_8012294\n" - "._681:\n" - " ldr r0, ._687 + 8 @ gMain\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._683 @cond_branch\n" - " ldr r1, ._687 + 20 @ gUnknown_Debug_2023B02\n" - " mov r8, r1\n" - " ldr r6, ._687 + 16 @ gUnknown_Debug_030043A8\n" - " ldrb r4, [r6]\n" - " lsl r4, r4, #0x1\n" - " mov r0, r9\n" - " mov r1, #0x5\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x15\n" - " add r4, r4, r0\n" - " ldr r5, ._687 + 24 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r5]\n" - " lsl r1, r2, #0x1\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x4\n" - " add r4, r4, r1\n" - " add r4, r4, r8\n" - " ldrh r1, [r4]\n" - " add r1, r1, #0x1\n" - " strh r1, [r4]\n" - " ldrb r3, [r6]\n" - " lsl r1, r3, #0x1\n" - " add r1, r1, r0\n" - " ldrb r2, [r5]\n" - " lsl r0, r2, #0x1\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x4\n" - " add r1, r1, r0\n" - " mov r0, r8\n" - " add r4, r1, r0\n" - " mov r0, #0x0\n" - " ldsh r1, [r4, r0]\n" - " ldr r5, ._687 + 28 @ gUnknown_Debug_821F564\n" - " lsl r0, r3, #0x2\n" - " add r0, r0, r3\n" - " lsl r2, r0, #0x1\n" - " add r0, r5, #6\n" - " add r0, r2, r0\n" - " ldrh r0, [r0]\n" - " cmp r1, r0\n" - " ble ._684 @cond_branch\n" - " add r0, r5, #0\n" - " add r0, r0, #0x8\n" - " add r0, r2, r0\n" - " ldrh r0, [r0]\n" - " strh r0, [r4]\n" - "._684:\n" - " bl debug_sub_8012294\n" - "._683:\n" - " ldr r0, ._687 + 8 @ gMain\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._685 @cond_branch\n" - " ldr r6, ._687 + 20 @ gUnknown_Debug_2023B02\n" - " ldr r5, ._687 + 16 @ gUnknown_Debug_030043A8\n" - " ldrb r4, [r5]\n" - " lsl r4, r4, #0x1\n" - " mov r0, r9\n" - " mov r1, #0x5\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x15\n" - " add r4, r4, r0\n" - " ldr r2, ._687 + 24 @ gUnknown_Debug_03004360\n" - " ldrb r1, [r2]\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x4\n" - " add r4, r4, r0\n" - " add r4, r4, r6\n" - " ldrh r0, [r4]\n" - " sub r0, r0, #0xa\n" - " strh r0, [r4]\n" - " mov sl, r5\n" - " mov r8, r6\n" - " add r7, r2, #0\n" - " ldr r6, ._687 + 28 @ gUnknown_Debug_821F564\n" - " b ._686\n" - "._688:\n" - " .align 2, 0\n" - "._687:\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gMain\n" - " .word debug_sub_8010CAC+1\n" - " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_Debug_2023B02\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_821F564\n" - "._689:\n" - " add r0, r6, #6\n" - " add r0, r2, r0\n" - " ldrh r0, [r0]\n" - " ldrh r1, [r4]\n" - " add r0, r0, r1\n" - " strh r0, [r4]\n" - "._686:\n" - " mov r0, sl\n" - " ldrb r5, [r0]\n" - " lsl r4, r5, #0x1\n" - " mov r0, r9\n" - " mov r1, #0x5\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x15\n" - " add r4, r4, r0\n" - " ldrb r1, [r7]\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x4\n" - " add r4, r4, r0\n" - " add r4, r4, r8\n" - " mov r0, #0x0\n" - " ldsh r1, [r4, r0]\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r2, r0, #0x1\n" - " add r0, r6, #0\n" - " add r0, r0, #0x8\n" - " add r0, r2, r0\n" - " ldrh r0, [r0]\n" - " cmp r1, r0\n" - " blt ._689 @cond_branch\n" - " bl debug_sub_8012294\n" - "._685:\n" - " ldr r0, ._692 @ gMain\n" - " ldrh r1, [r0, #0x30]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._690 @cond_branch\n" - " ldr r6, ._692 + 4 @ gUnknown_Debug_2023B02\n" - " ldr r5, ._692 + 8 @ gUnknown_Debug_030043A8\n" - " ldrb r4, [r5]\n" - " lsl r4, r4, #0x1\n" - " mov r0, r9\n" - " mov r1, #0x5\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x15\n" - " add r4, r4, r0\n" - " ldr r2, ._692 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r1, [r2]\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x4\n" - " add r4, r4, r0\n" - " add r4, r4, r6\n" - " ldrh r0, [r4]\n" - " add r0, r0, #0xa\n" - " strh r0, [r4]\n" - " mov sl, r5\n" - " mov r8, r6\n" - " add r7, r2, #0\n" - " ldr r6, ._692 + 16 @ gUnknown_Debug_821F564\n" - " b ._691\n" - "._693:\n" - " .align 2, 0\n" - "._692:\n" - " .word gMain\n" - " .word gUnknown_Debug_2023B02\n" - " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_821F564\n" - "._694:\n" - " ldrh r0, [r4]\n" - " sub r0, r0, r1\n" - " strh r0, [r4]\n" - "._691:\n" - " mov r1, sl\n" - " ldrb r5, [r1]\n" - " lsl r4, r5, #0x1\n" - " mov r0, r9\n" - " mov r1, #0x5\n" - " bl __udivsi3\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x15\n" - " add r4, r4, r0\n" - " ldrb r1, [r7]\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x4\n" - " add r4, r4, r0\n" - " add r4, r4, r8\n" - " mov r0, #0x0\n" - " ldsh r2, [r4, r0]\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x1\n" - " add r1, r6, #6\n" - " add r0, r0, r1\n" - " ldrh r1, [r0]\n" - " cmp r2, r1\n" - " bgt ._694 @cond_branch\n" - " bl debug_sub_8012294\n" - "._690:\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + u8 r9 = gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5; + + if (gMain.heldKeysRaw == 0x204) + DoSoftReset(); + if (gMain.newKeysRaw == 4) + { + debug_sub_8012658(); + SetMainCallback2(debug_sub_8010CAC); + } + if (gMain.newKeysRaw == 8) + debug_sub_801174C(); + if (gMain.newKeysRaw == 0x40 || gMain.newKeysRaw == 0x80) + { + debug_sub_8012658(); + gUnknown_Debug_030043A8 ^= 2; + debug_sub_8012628(); + } + if (gMain.newKeysRaw == 0x20 || gMain.newKeysRaw == 0x10) + { + debug_sub_8012658(); + gUnknown_Debug_030043A8 ^= 1; + debug_sub_8012628(); + } + if (gMain.newAndRepeatedKeys & B_BUTTON) + { + gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8]--; + if (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] < gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4]) + gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] = gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]; + debug_sub_8012294(); + } + if (gMain.newAndRepeatedKeys & A_BUTTON) + { + gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8]++; + if (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] > gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]) + gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] = gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4]; + debug_sub_8012294(); + } + if (gMain.newAndRepeatedKeys & 0x200) + { + gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] -= 10; + while (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] < gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4]) + gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] += gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]; + debug_sub_8012294(); + } + if (gMain.newAndRepeatedKeys & 0x100) + { + gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] += 10; + while (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] > gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]) + gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] -= gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]; + debug_sub_8012294(); + } + AnimateSprites(); + BuildOamBuffer(); } __attribute__((naked)) @@ -3984,7 +3700,7 @@ void debug_sub_8012688(void) s32 i; u8 spriteId; u8 taskId; - + for (i = 0; i < 411; i++) gUnknown_Debug_2023B62[i] = 0; SetHBlankCallback(NULL); -- cgit v1.2.3 From 8b3e65e81c3417f97004ec9d955b5acb51711134 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Wed, 14 Feb 2018 15:39:10 -0600 Subject: start decompiling debug_sub_801174C --- src/battle/battle_2.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 16c0f7fc2..222d498e6 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -33,6 +33,7 @@ #include "rom3.h" #include "rom_8077ABC.h" #include "rom_8094928.h" +#include "safari_zone.h" #include "sound.h" #include "sprite.h" #include "string_util.h" @@ -1966,6 +1967,166 @@ void debug_sub_8011498(void) BuildOamBuffer(); } +extern const u16 gUnknown_Debug_821F598[]; +extern const u8 str_821F631[][6]; +extern const u8 Str_821F649[]; + +extern u8 gUnknown_020297ED; + +#if 0 +void debug_sub_801174C(void) +{ + u32 r9 = 0; + u8 r6; + s32 r7; + s32 spC; + u16 sp10; + + gUnknown_020297ED = 1; + r6 = Random() % 4; + StringCopy(gSaveBlock2.playerName, str_821F631[r6]); + gSaveBlock2.playerGender = r6 >> 1; + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + r7 = gUnknown_Debug_2023A76[0][30]; + spC = r9; + if (r7 > 9) + { + spC = 0; + while (r7 > 9) + { + r7 -= 10; + spC++; + } + } + //_695 + gBattleTypeFlags = gUnknown_Debug_821F598[r7 - 1]; + gUnknown_02023A14_50 = 8; + gBattleTerrain = spC; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + EnterSafariMode(); + //_697 + if ((u16)(gUnknown_Debug_2023A76 - 2) <= 2) + { + gTrainerBattleOpponent = Random() % 8 + 1; + } + + gPlayerPartyCount = 0; + for (r7 = 0; r7 < 30; r7 += 5) + { + if (gUnknown_Debug_2023A76[0][r7] != 0) + { + switch (gUnknown_Debug_2023A76[0][r7 + 4]) + { + case 0: + case 2: + r6 = 0; + break; + case 1: + r6 = 0xFE; + break; + default: + r6 = 0xFF; + break; + } + if (gUnknown_Debug_2023A76[0][r7] == 0xC9 && r7 + 5 < 30) + r9 = gUnknown_Debug_2023A76[0][r7 + 7]; + else + r9 = 0; + CreateMonWithGenderNatureLetter( + &gEnemyParty[r7 / 5], + gUnknown_Debug_2023A76[0][r7], + gUnknown_Debug_2023A76[0][r7 + 1], + 0, + r6, + 0, + r9); + } + //_699 + SetMonData(&gEnemyParty[r7 / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[0][r7 + 2]); + sp10 = gUnknown_Debug_2023A76[0][r7 + 2] - 1; + if (sp10 <= 11) + SetMonData(&gEnemyParty[r7 / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[0][r7 + 2]); + //_714 + /* + switch (gUnknown_Debug_2023A76[r7 + 3]) + { + case 1: + case 2: + spC = gUnknown_Debug_2023A76[r7 + 3] - 1; + SetMonData(&gEnemyParty[r7 / 5], MON_DATA_ALT_ABILITY, &spC); + break; + } + */ + if (gUnknown_Debug_2023A76[0][r7 + 3] != 0 && gUnknown_Debug_2023A76[0][r7 + 3] != 3) + { + if (gUnknown_Debug_2023A76[0][r7 + 3] <= 2) + spC = gUnknown_Debug_2023A76[0][r7 + 3] - 1; + else + spC = gUnknown_Debug_2023A76[0][r7 + 3] - 4; + SetMonData(&gEnemyParty[r7 / 5], MON_DATA_ALT_ABILITY, &spC); + } + + //_716 + if (gUnknown_Debug_2023A76[1][r7] != 0) + { + switch (gUnknown_Debug_2023A76[1][r7 + 4]) + { + case 0: + case 2: + r6 = 0; + break; + case 1: + r6 = 0xFE; + break; + default: + r6 = 0xFF; + break; + } + if (gUnknown_Debug_2023A76[1][r7] == 0xC9 && r7 + 5 < 30) + r9 = gUnknown_Debug_2023A76[1][r7 + 7]; + else + r9 = 0; + CreateMonWithGenderNatureLetter( + &gPlayerParty[r7 / 5], + gUnknown_Debug_2023A76[1][r7], + gUnknown_Debug_2023A76[1][r7 + 1], + 0, + r6, + 0, + r9); + gPlayerPartyCount++; + } + SetMonData(&gPlayerParty[r7 / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[1][r7 + 2]); + sp10 = gUnknown_Debug_2023A76[1][r7 + 2] - 1; + if (sp10 <= 11) + SetMonData(&gPlayerParty[r7 / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[1][r7 + 2]); + if (gUnknown_Debug_2023A76[1][r7 + 3] != 0 && gUnknown_Debug_2023A76[1][r7 + 3] != 3) + { + if (gUnknown_Debug_2023A76[1][r7 + 3] <= 2) + spC = gUnknown_Debug_2023A76[1][r7 + 3] - 1; + else + spC = gUnknown_Debug_2023A76[1][r7 + 3] - 4; + SetMonData(&gPlayerParty[r7 / 5], MON_DATA_ALT_ABILITY, &spC); + } + //_738 + if (gUnknown_Debug_2023A76[1][r7 + 3] > 2) + { + SetMonData(&gPlayerParty[r7 / 5], MON_DATA_OT_NAME, Str_821F649); + gUnknown_02023A14_50 |= 0x40; + } + } + //_744 + spC = 0; + for (r7 = 0; r7 < 4; r7++) + { + SetMonData(&gEnemyParty[spC], MON_DATA_MOVE1 + r7, &gUnknown_Debug_2023B02[0][spC][r7]); + SetMonData(&gEnemyParty[spC], MON_DATA_PP1 + r7, &gBattleMoves[gUnknown_Debug_2023B02[0][spC][r7]].pp); + SetMonData(&gEnemyParty[ + } +} +#endif + __attribute__((naked)) void debug_sub_801174C() { -- cgit v1.2.3 From b4e5099c7623f2fd19f6670da0d20ccd6f202e6b Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Wed, 14 Feb 2018 23:19:37 -0600 Subject: decompile debug_sub_801174C --- src/battle/battle_2.c | 1010 ++++++++----------------------------------------- 1 file changed, 152 insertions(+), 858 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 222d498e6..af90bdccd 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -18,6 +18,7 @@ #include "event_data.h" #include "evolution_scene.h" #include "item.h" +#include "item_menu.h" #include "link.h" #include "main.h" #include "m4a.h" @@ -26,6 +27,7 @@ #include "palette.h" #include "party_menu.h" #include "pokeball.h" +#include "pokeblock.h" #include "pokedex.h" #include "pokemon.h" #include "random.h" @@ -1591,9 +1593,9 @@ void debug_sub_8010CAC(void) { s32 r5; - if (gMain.heldKeysRaw == 0x204) + if (gMain.heldKeysRaw == (L_BUTTON | SELECT_BUTTON)) DoSoftReset(); - if (gMain.newKeysRaw == 4) + if (gMain.newKeysRaw == SELECT_BUTTON) { if (gUnknown_Debug_030043A4 < 6) { @@ -1601,7 +1603,6 @@ void debug_sub_8010CAC(void) debug_sub_8012628(); SetMainCallback2(debug_sub_8011498); } - //_546 if (gUnknown_Debug_030043A0 == 0 && gUnknown_Debug_030043A4 == 6) { gMain.savedCallback = debug_sub_80108B8; @@ -1618,16 +1619,15 @@ void debug_sub_8010CAC(void) } switch (gUnknown_Debug_2023A76_[0][6][0]) { - case 1: //_550 + case 1: gCB2_AfterEvolution = debug_sub_80108B8; EvolutionScene(&gPlayerParty[0], gUnknown_Debug_2023A76_[0][1][0], 1, 0); break; - case 2: //_551 + case 2: debug_sub_8012688(); break; } } - //_555 if (gUnknown_Debug_030043A0 == 1 && gUnknown_Debug_030043A4 == 6) { // This is really weird @@ -1641,10 +1641,9 @@ void debug_sub_8010CAC(void) debug_nullsub_3(); } } - //_559 - if (gMain.newKeysRaw == 8) + if (gMain.newKeysRaw == START_BUTTON) debug_sub_801174C(); - if (gMain.newKeysRaw == 0x40) + if (gMain.newKeysRaw == DPAD_UP) { debug_sub_80125E4(); if (gUnknown_Debug_030043A4 != 0) @@ -1655,8 +1654,7 @@ void debug_sub_8010CAC(void) debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); debug_sub_80125A0(); } - //_562 - if (gMain.newKeysRaw == 0x80) + if (gMain.newKeysRaw == DPAD_DOWN) { debug_sub_80125E4(); if (gUnknown_Debug_030043A4 == 6) @@ -1667,8 +1665,7 @@ void debug_sub_8010CAC(void) debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); debug_sub_80125A0(); } - //_567 - if (gMain.newKeysRaw == 0x20) + if (gMain.newKeysRaw == DPAD_LEFT) { debug_sub_80125E4(); if (gUnknown_Debug_030043A0 != 0) @@ -1687,11 +1684,9 @@ void debug_sub_8010CAC(void) debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); } } - //_577 debug_sub_80125A0(); } - //_572 - if (gMain.newKeysRaw == 0x10) + if (gMain.newKeysRaw == DPAD_RIGHT) { debug_sub_80125E4(); if (gUnknown_Debug_030043A0 != 4) @@ -1712,7 +1707,6 @@ void debug_sub_8010CAC(void) } debug_sub_80125A0(); } - //_578 if (gMain.newAndRepeatedKeys & B_BUTTON) { switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) @@ -1764,7 +1758,6 @@ void debug_sub_8010CAC(void) if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; } - //_613 if (gUnknown_Debug_030043A0 == 0) { debug_sub_8010AAC(0); @@ -1775,7 +1768,6 @@ void debug_sub_8010CAC(void) break; } } - //_607 if (gMain.newAndRepeatedKeys & A_BUTTON) { switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) @@ -1827,33 +1819,28 @@ void debug_sub_8010CAC(void) if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]; } - //_644 if (gUnknown_Debug_030043A0 == 0) { debug_sub_8010AAC(0); debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); } - //_645 debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); break; } } - //_638 - if (gMain.newAndRepeatedKeys & 0x200) + if (gMain.newAndRepeatedKeys & L_BUTTON) { if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) { debug_sub_8010AAC(1); } - //_648 else { if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) { debug_sub_8010B80(2); } - //_652 else { gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= 10; @@ -1861,31 +1848,26 @@ void debug_sub_8010CAC(void) gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; } } - //_653 if (gUnknown_Debug_030043A0 == 0) { debug_sub_8010AAC(0); debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); } - //_658 debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); } - //_646 - if (gMain.newAndRepeatedKeys & 0x100) + if (gMain.newAndRepeatedKeys & R_BUTTON) { if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) { debug_sub_8010AAC(1); } - //_661 else { if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) { debug_sub_8010B80(3); } - //_665 else { gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += 10; @@ -1893,17 +1875,14 @@ void debug_sub_8010CAC(void) gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; } } - //_666 if (gUnknown_Debug_030043A0 == 0) { debug_sub_8010AAC(0); debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); } - //_671 debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); } - //_659 AnimateSprites(); BuildOamBuffer(); } @@ -1914,22 +1893,22 @@ void debug_sub_8011498(void) { u8 r9 = gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5; - if (gMain.heldKeysRaw == 0x204) + if (gMain.heldKeysRaw == (L_BUTTON | SELECT_BUTTON)) DoSoftReset(); - if (gMain.newKeysRaw == 4) + if (gMain.newKeysRaw == SELECT_BUTTON) { debug_sub_8012658(); SetMainCallback2(debug_sub_8010CAC); } - if (gMain.newKeysRaw == 8) + if (gMain.newKeysRaw == START_BUTTON) debug_sub_801174C(); - if (gMain.newKeysRaw == 0x40 || gMain.newKeysRaw == 0x80) + if (gMain.newKeysRaw == DPAD_UP || gMain.newKeysRaw == DPAD_DOWN) { debug_sub_8012658(); gUnknown_Debug_030043A8 ^= 2; debug_sub_8012628(); } - if (gMain.newKeysRaw == 0x20 || gMain.newKeysRaw == 0x10) + if (gMain.newKeysRaw == DPAD_LEFT || gMain.newKeysRaw == DPAD_RIGHT) { debug_sub_8012658(); gUnknown_Debug_030043A8 ^= 1; @@ -1949,14 +1928,14 @@ void debug_sub_8011498(void) gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] = gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4]; debug_sub_8012294(); } - if (gMain.newAndRepeatedKeys & 0x200) + if (gMain.newAndRepeatedKeys & L_BUTTON) { gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] -= 10; while (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] < gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4]) gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] += gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]; debug_sub_8012294(); } - if (gMain.newAndRepeatedKeys & 0x100) + if (gMain.newAndRepeatedKeys & R_BUTTON) { gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] += 10; while (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] > gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3]) @@ -1970,905 +1949,220 @@ void debug_sub_8011498(void) extern const u16 gUnknown_Debug_821F598[]; extern const u8 str_821F631[][6]; extern const u8 Str_821F649[]; +extern /*const*/ struct Pokeblock gUnknown_Debug_821F5AC[]; extern u8 gUnknown_020297ED; -#if 0 +extern void unref_sub_800D684(void); + void debug_sub_801174C(void) { - u32 r9 = 0; + u8 r9 = 0; u8 r6; - s32 r7; + s32 i; s32 spC; u16 sp10; - + gUnknown_020297ED = 1; r6 = Random() % 4; StringCopy(gSaveBlock2.playerName, str_821F631[r6]); gSaveBlock2.playerGender = r6 >> 1; ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); - r7 = gUnknown_Debug_2023A76[0][30]; - spC = r9; - if (r7 > 9) + i = gUnknown_Debug_2023A76[0][30]; + spC = 0; + if (i >= 10) { spC = 0; - while (r7 > 9) + while (i >= 10) { - r7 -= 10; + i -= 10; spC++; } } - //_695 - gBattleTypeFlags = gUnknown_Debug_821F598[r7 - 1]; + gBattleTypeFlags = gUnknown_Debug_821F598[i - 1]; gUnknown_02023A14_50 = 8; gBattleTerrain = spC; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) EnterSafariMode(); - //_697 - if ((u16)(gUnknown_Debug_2023A76 - 2) <= 2) - { - gTrainerBattleOpponent = Random() % 8 + 1; - } - + if (gUnknown_Debug_2023A76[0][30] >= 2 && gUnknown_Debug_2023A76[0][30] <= 4) + gTrainerBattleOpponent = (Random() & 7) + 1; + gPlayerPartyCount = 0; - for (r7 = 0; r7 < 30; r7 += 5) + for (i = 0; i < 30; i += 5) { - if (gUnknown_Debug_2023A76[0][r7] != 0) + if (gUnknown_Debug_2023A76[0][i] != 0) { - switch (gUnknown_Debug_2023A76[0][r7 + 4]) + switch (gUnknown_Debug_2023A76[0][i + 4]) { case 0: case 2: r6 = 0; break; case 1: + case 3: r6 = 0xFE; break; default: r6 = 0xFF; break; } - if (gUnknown_Debug_2023A76[0][r7] == 0xC9 && r7 + 5 < 30) - r9 = gUnknown_Debug_2023A76[0][r7 + 7]; + if (gUnknown_Debug_2023A76[0][i] == 0xC9 && i + 5 < 30) + r9 = gUnknown_Debug_2023A76[0][i + 7]; else r9 = 0; CreateMonWithGenderNatureLetter( - &gEnemyParty[r7 / 5], - gUnknown_Debug_2023A76[0][r7], - gUnknown_Debug_2023A76[0][r7 + 1], + &gEnemyParty[i / 5], + gUnknown_Debug_2023A76[0][i], + gUnknown_Debug_2023A76[0][i + 1], 0, r6, 0, r9); } - //_699 - SetMonData(&gEnemyParty[r7 / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[0][r7 + 2]); - sp10 = gUnknown_Debug_2023A76[0][r7 + 2] - 1; + SetMonData(&gEnemyParty[i / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[0][i + 2]); + sp10 = gUnknown_Debug_2023A76[0][i + 2] - 1; if (sp10 <= 11) - SetMonData(&gEnemyParty[r7 / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[0][r7 + 2]); - //_714 - /* - switch (gUnknown_Debug_2023A76[r7 + 3]) + SetMonData(&gEnemyParty[i / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[0][i + 2]); + if (gUnknown_Debug_2023A76[0][i + 3] != 0 && gUnknown_Debug_2023A76[0][i + 3] != 3) { - case 1: - case 2: - spC = gUnknown_Debug_2023A76[r7 + 3] - 1; - SetMonData(&gEnemyParty[r7 / 5], MON_DATA_ALT_ABILITY, &spC); - break; - } - */ - if (gUnknown_Debug_2023A76[0][r7 + 3] != 0 && gUnknown_Debug_2023A76[0][r7 + 3] != 3) - { - if (gUnknown_Debug_2023A76[0][r7 + 3] <= 2) - spC = gUnknown_Debug_2023A76[0][r7 + 3] - 1; + if (gUnknown_Debug_2023A76[0][i + 3] <= 2) + spC = gUnknown_Debug_2023A76[0][i + 3] - 1; else - spC = gUnknown_Debug_2023A76[0][r7 + 3] - 4; - SetMonData(&gEnemyParty[r7 / 5], MON_DATA_ALT_ABILITY, &spC); + spC = gUnknown_Debug_2023A76[0][i + 3] - 4; + SetMonData(&gEnemyParty[i / 5], MON_DATA_ALT_ABILITY, &spC); } - - //_716 - if (gUnknown_Debug_2023A76[1][r7] != 0) + + if (gUnknown_Debug_2023A76[1][i] != 0) { - switch (gUnknown_Debug_2023A76[1][r7 + 4]) + switch (gUnknown_Debug_2023A76[1][i + 4]) { case 0: case 2: r6 = 0; break; case 1: + case 3: r6 = 0xFE; break; default: r6 = 0xFF; break; } - if (gUnknown_Debug_2023A76[1][r7] == 0xC9 && r7 + 5 < 30) - r9 = gUnknown_Debug_2023A76[1][r7 + 7]; + if (gUnknown_Debug_2023A76[1][i] == 0xC9 && i + 5 < 30) + r9 = gUnknown_Debug_2023A76[1][i + 7]; else r9 = 0; CreateMonWithGenderNatureLetter( - &gPlayerParty[r7 / 5], - gUnknown_Debug_2023A76[1][r7], - gUnknown_Debug_2023A76[1][r7 + 1], + &gPlayerParty[i / 5], + gUnknown_Debug_2023A76[1][i], + gUnknown_Debug_2023A76[1][i + 1], 0, r6, 0, r9); gPlayerPartyCount++; } - SetMonData(&gPlayerParty[r7 / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[1][r7 + 2]); - sp10 = gUnknown_Debug_2023A76[1][r7 + 2] - 1; + SetMonData(&gPlayerParty[i / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[1][i + 2]); + sp10 = gUnknown_Debug_2023A76[0][i + 2] - 1; if (sp10 <= 11) - SetMonData(&gPlayerParty[r7 / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[1][r7 + 2]); - if (gUnknown_Debug_2023A76[1][r7 + 3] != 0 && gUnknown_Debug_2023A76[1][r7 + 3] != 3) + SetMonData(&gPlayerParty[i / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[1][i + 2]); + if (gUnknown_Debug_2023A76[1][i + 3] != 0 && gUnknown_Debug_2023A76[1][i + 3] != 3) { - if (gUnknown_Debug_2023A76[1][r7 + 3] <= 2) - spC = gUnknown_Debug_2023A76[1][r7 + 3] - 1; + if (gUnknown_Debug_2023A76[1][i + 3] <= 2) + spC = gUnknown_Debug_2023A76[1][i + 3] - 1; else - spC = gUnknown_Debug_2023A76[1][r7 + 3] - 4; - SetMonData(&gPlayerParty[r7 / 5], MON_DATA_ALT_ABILITY, &spC); + spC = gUnknown_Debug_2023A76[1][i + 3] - 4; + SetMonData(&gPlayerParty[i / 5], MON_DATA_ALT_ABILITY, &spC); } - //_738 - if (gUnknown_Debug_2023A76[1][r7 + 3] > 2) + if (gUnknown_Debug_2023A76[1][i + 3] > 2) { - SetMonData(&gPlayerParty[r7 / 5], MON_DATA_OT_NAME, Str_821F649); + SetMonData(&gPlayerParty[i / 5], MON_DATA_OT_NAME, Str_821F649); gUnknown_02023A14_50 |= 0x40; } } - //_744 - spC = 0; - for (r7 = 0; r7 < 4; r7++) - { - SetMonData(&gEnemyParty[spC], MON_DATA_MOVE1 + r7, &gUnknown_Debug_2023B02[0][spC][r7]); - SetMonData(&gEnemyParty[spC], MON_DATA_PP1 + r7, &gBattleMoves[gUnknown_Debug_2023B02[0][spC][r7]].pp); - SetMonData(&gEnemyParty[ - } -} -#endif -__attribute__((naked)) -void debug_sub_801174C() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xffffffe8\n" - " mov r0, #0x0\n" - " mov r9, r0\n" - " ldr r1, ._704 @ gUnknown_020297ED\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " bl Random\n" - " add r4, r0, #0\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " mov r0, #0x3\n" - " and r4, r4, r0\n" - " lsl r4, r4, #0x18\n" - " lsr r6, r4, #0x18\n" - " ldr r5, ._704 + 4 @ gSaveBlock2\n" - " lsl r1, r6, #0x1\n" - " add r1, r1, r6\n" - " lsl r1, r1, #0x1\n" - " ldr r0, ._704 + 8 @ str_821F631\n" - " add r1, r1, r0\n" - " add r0, r5, #0\n" - " bl StringCopy\n" - " lsr r4, r4, #0x19\n" - " strb r4, [r5, #0x8]\n" - " bl ZeroPlayerPartyMons\n" - " bl ZeroEnemyPartyMons\n" - " ldr r0, ._704 + 12 @ gUnknown_Debug_2023A76\n" - " mov r1, #0x3c\n" - " ldsh r7, [r0, r1]\n" - " mov r2, r9\n" - " str r2, [sp, #0xc]\n" - " cmp r7, #0x9\n" - " ble ._695 @cond_branch\n" - " mov r0, #0x0\n" - "._696:\n" - " sub r7, r7, #0xa\n" - " add r0, r0, #0x1\n" - " cmp r7, #0x9\n" - " bgt ._696 @cond_branch\n" - " str r0, [sp, #0xc]\n" - "._695:\n" - " ldr r2, ._704 + 16 @ gBattleTypeFlags\n" - " ldr r1, ._704 + 20 @ gUnknown_Debug_821F598\n" - " sub r0, r7, #1\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r1\n" - " ldrh r3, [r0]\n" - " strh r3, [r2]\n" - " ldr r1, ._704 + 24 @ gUnknown_02023A14_50\n" - " mov r0, #0x8\n" - " strb r0, [r1]\n" - " ldr r1, ._704 + 28 @ gBattleTerrain\n" - " add r0, sp, #0xc\n" - " ldrb r0, [r0]\n" - " strb r0, [r1]\n" - " mov r0, #0x80\n" - " and r0, r0, r3\n" - " cmp r0, #0\n" - " beq ._697 @cond_branch\n" - " bl EnterSafariMode\n" - "._697:\n" - " ldr r5, ._704 + 12 @ gUnknown_Debug_2023A76\n" - " ldrh r0, [r5, #0x3c]\n" - " sub r0, r0, #0x2\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0x2\n" - " bhi ._698 @cond_branch\n" - " ldr r4, ._704 + 32 @ gTrainerBattleOpponent\n" - " bl Random\n" - " mov r1, #0x7\n" - " and r1, r1, r0\n" - " add r1, r1, #0x1\n" - " strh r1, [r4]\n" - "._698:\n" - " ldr r1, ._704 + 36 @ gPlayerPartyCount\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " mov r7, #0x0\n" - "._745:\n" - " lsl r0, r7, #0x1\n" - " ldr r3, ._704 + 12 @ gUnknown_Debug_2023A76\n" - " add r1, r0, r3\n" - " mov r2, #0x0\n" - " ldsh r1, [r1, r2]\n" - " add r2, r3, #0\n" - " mov r8, r0\n" - " add r3, r7, #5\n" - " mov sl, r3\n" - " cmp r1, #0\n" - " beq ._699 @cond_branch\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x1\n" - " add r1, r2, #0\n" - " add r0, r0, r1\n" - " mov r3, #0x0\n" - " ldsh r0, [r0, r3]\n" - " cmp r0, #0x1\n" - " beq ._707 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._701 @cond_branch\n" - " cmp r0, #0\n" - " beq ._706 @cond_branch\n" - " b ._708\n" - "._705:\n" - " .align 2, 0\n" - "._704:\n" - " .word gUnknown_020297ED\n" - " .word gSaveBlock2\n" - " .word str_821F631\n" - " .word gUnknown_Debug_2023A76\n" - " .word gBattleTypeFlags\n" - " .word gUnknown_Debug_821F598\n" - " .word gUnknown_02023A14_50\n" - " .word gBattleTerrain\n" - " .word gTrainerBattleOpponent\n" - " .word gPlayerPartyCount\n" - "._701:\n" - " cmp r0, #0x2\n" - " beq ._706 @cond_branch\n" - " cmp r0, #0x3\n" - " beq ._707 @cond_branch\n" - " b ._708\n" - "._706:\n" - " mov r6, #0x0\n" - " b ._710\n" - "._707:\n" - " mov r6, #0xfe\n" - " b ._710\n" - "._708:\n" - " mov r6, #0xff\n" - "._710:\n" - " mov r1, r8\n" - " add r0, r1, r2\n" - " mov r3, #0x0\n" - " ldsh r0, [r0, r3]\n" - " add r1, r7, #5\n" - " mov sl, r1\n" - " cmp r0, #0xc9\n" - " bne ._712 @cond_branch\n" - " cmp r1, #0x1d\n" - " bgt ._712 @cond_branch\n" - " add r0, r7, #7\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r2\n" - " ldrb r0, [r0]\n" - " mov r9, r0\n" - " b ._713\n" - "._712:\n" - " mov r2, #0x0\n" - " mov r9, r2\n" - "._713:\n" - " add r0, r7, #0\n" - " mov r1, #0x5\n" - " bl __divsi3\n" - " mov r3, #0x64\n" - " mul r0, r0, r3\n" - " ldr r1, ._719 @ gEnemyParty\n" - " add r0, r0, r1\n" - " ldr r1, ._719 + 4 @ gUnknown_Debug_2023A76\n" - " add r1, r1, r8\n" - " ldrh r1, [r1]\n" - " add r2, r7, #1\n" - " lsl r2, r2, #0x1\n" - " ldr r3, ._719 + 4 @ gUnknown_Debug_2023A76\n" - " add r2, r2, r3\n" - " ldrb r2, [r2]\n" - " str r6, [sp]\n" - " mov r3, #0x0\n" - " str r3, [sp, #0x4]\n" - " mov r3, r9\n" - " str r3, [sp, #0x8]\n" - " mov r3, #0x0\n" - " bl CreateMonWithGenderNatureLetter\n" - "._699:\n" - " add r0, r7, #0\n" - " mov r1, #0x5\n" - " bl __divsi3\n" - " mov r2, #0x64\n" - " add r1, r0, #0\n" - " mul r1, r1, r2\n" - " ldr r0, ._719 @ gEnemyParty\n" - " add r5, r1, r0\n" - " ldr r4, ._719 + 8 @ gUnknown_Debug_2023A7A\n" - " mov r3, r8\n" - " add r6, r3, r4\n" - " add r0, r5, #0\n" - " mov r1, #0xc\n" - " add r2, r6, #0\n" - " bl SetMonData\n" - " sub r4, r4, #0x4\n" - " add r1, r7, #2\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r4\n" - " ldrh r0, [r0]\n" - " sub r0, r0, #0x1\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " str r1, [sp, #0x10]\n" - " cmp r0, #0xb\n" - " bhi ._714 @cond_branch\n" - " add r0, r5, #0\n" - " mov r1, #0x26\n" - " add r2, r6, #0\n" - " bl SetMonData\n" - "._714:\n" - " add r1, r7, #3\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r4\n" - " mov r3, #0x0\n" - " ldsh r2, [r0, r3]\n" - " str r1, [sp, #0x14]\n" - " cmp r2, #0\n" - " beq ._716 @cond_branch\n" - " cmp r2, #0x3\n" - " beq ._716 @cond_branch\n" - " cmp r2, #0x2\n" - " bgt ._717 @cond_branch\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " sub r0, r0, #0x1\n" - " b ._718\n" - "._720:\n" - " .align 2, 0\n" - "._719:\n" - " .word gEnemyParty\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_2023A7A\n" - "._717:\n" - " mov r2, #0x0\n" - " ldsh r0, [r0, r2]\n" - " sub r0, r0, #0x4\n" - "._718:\n" - " str r0, [sp, #0xc]\n" - " add r0, r7, #0\n" - " mov r1, #0x5\n" - " bl __divsi3\n" - " mov r3, #0x64\n" - " mul r0, r0, r3\n" - " ldr r1, ._726 @ gEnemyParty\n" - " add r0, r0, r1\n" - " mov r1, #0x2e\n" - " add r2, sp, #0xc\n" - " bl SetMonData\n" - "._716:\n" - " ldr r1, ._726 + 4 @ gUnknown_Debug_2023A76\n" - " add r1, r1, #0x46\n" - " mov r2, r8\n" - " add r0, r2, r1\n" - " mov r3, #0x0\n" - " ldsh r0, [r0, r3]\n" - " ldr r2, ._726 + 4 @ gUnknown_Debug_2023A76\n" - " cmp r0, #0\n" - " beq ._721 @cond_branch\n" - " add r0, r7, #4\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r1\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " cmp r0, #0x1\n" - " beq ._729 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._723 @cond_branch\n" - " cmp r0, #0\n" - " beq ._728 @cond_branch\n" - " b ._730\n" - "._727:\n" - " .align 2, 0\n" - "._726:\n" - " .word gEnemyParty\n" - " .word gUnknown_Debug_2023A76\n" - "._723:\n" - " cmp r0, #0x2\n" - " beq ._728 @cond_branch\n" - " cmp r0, #0x3\n" - " beq ._729 @cond_branch\n" - " b ._730\n" - "._728:\n" - " mov r6, #0x0\n" - " b ._732\n" - "._729:\n" - " mov r6, #0xfe\n" - " b ._732\n" - "._730:\n" - " mov r6, #0xff\n" - "._732:\n" - " add r1, r2, #0\n" - " add r1, r1, #0x46\n" - " mov r2, r8\n" - " add r0, r2, r1\n" - " mov r3, #0x0\n" - " ldsh r0, [r0, r3]\n" - " cmp r0, #0xc9\n" - " bne ._734 @cond_branch\n" - " mov r0, sl\n" - " cmp r0, #0x1d\n" - " bgt ._734 @cond_branch\n" - " add r0, r7, #7\n" - " lsl r0, r0, #0x1\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " mov r9, r0\n" - " b ._735\n" - "._734:\n" - " mov r1, #0x0\n" - " mov r9, r1\n" - "._735:\n" - " add r0, r7, #0\n" - " mov r1, #0x5\n" - " bl __divsi3\n" - " mov r2, #0x64\n" - " mul r0, r0, r2\n" - " ldr r1, ._741 @ gPlayerParty\n" - " add r0, r0, r1\n" - " ldr r1, ._741 + 4 @ gUnknown_Debug_2023ABC\n" - " add r1, r1, r8\n" - " ldrh r1, [r1]\n" - " add r2, r7, #1\n" - " lsl r2, r2, #0x1\n" - " ldr r3, ._741 + 4 @ gUnknown_Debug_2023ABC\n" - " add r2, r2, r3\n" - " ldrb r2, [r2]\n" - " str r6, [sp]\n" - " mov r3, #0x0\n" - " str r3, [sp, #0x4]\n" - " mov r3, r9\n" - " str r3, [sp, #0x8]\n" - " mov r3, #0x0\n" - " bl CreateMonWithGenderNatureLetter\n" - " ldr r1, ._741 + 8 @ gPlayerPartyCount\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._721:\n" - " add r0, r7, #0\n" - " mov r1, #0x5\n" - " bl __divsi3\n" - " mov r2, #0x64\n" - " add r1, r0, #0\n" - " mul r1, r1, r2\n" - " ldr r0, ._741 @ gPlayerParty\n" - " add r4, r1, r0\n" - " ldr r0, ._741 + 12 @ gUnknown_Debug_2023AC0\n" - " mov r3, r8\n" - " add r5, r3, r0\n" - " add r0, r4, #0\n" - " mov r1, #0xc\n" - " add r2, r5, #0\n" - " bl SetMonData\n" - " ldr r1, [sp, #0x10]\n" - " lsl r0, r1, #0x1\n" - " ldr r2, ._741 + 16 @ gUnknown_Debug_2023A76\n" - " add r0, r0, r2\n" - " ldrh r0, [r0]\n" - " sub r0, r0, #0x1\n" - " lsl r0, r0, #0x10\n" - " lsr r0, r0, #0x10\n" - " cmp r0, #0xb\n" - " bhi ._736 @cond_branch\n" - " add r0, r4, #0\n" - " mov r1, #0x26\n" - " add r2, r5, #0\n" - " bl SetMonData\n" - "._736:\n" - " ldr r3, [sp, #0x14]\n" - " lsl r0, r3, #0x1\n" - " ldr r1, ._741 + 4 @ gUnknown_Debug_2023ABC\n" - " add r0, r0, r1\n" - " mov r2, #0x0\n" - " ldsh r1, [r0, r2]\n" - " cmp r1, #0\n" - " beq ._738 @cond_branch\n" - " cmp r1, #0x3\n" - " beq ._738 @cond_branch\n" - " cmp r1, #0x2\n" - " bgt ._739 @cond_branch\n" - " add r0, r1, #0\n" - " sub r0, r0, #0x1\n" - " b ._740\n" - "._742:\n" - " .align 2, 0\n" - "._741:\n" - " .word gPlayerParty\n" - " .word gUnknown_Debug_2023ABC\n" - " .word gPlayerPartyCount\n" - " .word gUnknown_Debug_2023AC0\n" - " .word gUnknown_Debug_2023A76\n" - "._739:\n" - " mov r1, #0x0\n" - " ldsh r0, [r0, r1]\n" - " sub r0, r0, #0x4\n" - "._740:\n" - " str r0, [sp, #0xc]\n" - " add r0, r7, #0\n" - " mov r1, #0x5\n" - " bl __divsi3\n" - " mov r2, #0x64\n" - " mul r0, r0, r2\n" - " ldr r1, ._750 @ gPlayerParty\n" - " add r0, r0, r1\n" - " mov r1, #0x2e\n" - " add r2, sp, #0xc\n" - " bl SetMonData\n" - "._738:\n" - " ldr r3, [sp, #0x14]\n" - " lsl r0, r3, #0x1\n" - " ldr r1, ._750 + 4 @ gUnknown_Debug_2023ABC\n" - " add r0, r0, r1\n" - " mov r2, #0x0\n" - " ldsh r0, [r0, r2]\n" - " cmp r0, #0x2\n" - " ble ._743 @cond_branch\n" - " add r0, r7, #0\n" - " mov r1, #0x5\n" - " bl __divsi3\n" - " mov r3, #0x64\n" - " mul r0, r0, r3\n" - " ldr r1, ._750 @ gPlayerParty\n" - " add r0, r0, r1\n" - " mov r1, #0x7\n" - " ldr r2, ._750 + 8 @ Str_821F649\n" - " bl SetMonData\n" - " ldr r2, ._750 + 12 @ gUnknown_02023A14_50\n" - " ldrb r0, [r2]\n" - " mov r1, #0x40\n" - " orr r0, r0, r1\n" - " strb r0, [r2]\n" - "._743:\n" - " mov r7, sl\n" - " cmp r7, #0x1d\n" - " bgt ._744 @cond_branch\n" - " b ._745\n" - "._744:\n" - " mov r0, #0x0\n" - " str r0, [sp, #0xc]\n" - " mov r0, #0x64\n" - " mov r8, r0\n" - " ldr r1, ._750 + 16 @ gUnknown_Debug_2023B02\n" - " mov r9, r1\n" - " ldr r2, ._750 @ gPlayerParty\n" - " mov sl, r2\n" - "._747:\n" - " mov r7, #0x0\n" - "._746:\n" - " ldr r2, [sp, #0xc]\n" - " mov r0, r8\n" - " mul r0, r0, r2\n" - " ldr r3, ._750 + 20 @ gEnemyParty\n" - " add r0, r0, r3\n" - " add r5, r7, #0\n" - " add r5, r5, #0xd\n" - " lsl r2, r2, #0x3\n" - " lsl r4, r7, #0x1\n" - " mov r3, r9\n" - " add r1, r4, r3\n" - " add r2, r2, r1\n" - " add r1, r5, #0\n" - " bl SetMonData\n" - " ldr r1, [sp, #0xc]\n" - " mov r0, r8\n" - " mul r0, r0, r1\n" - " ldr r2, ._750 + 20 @ gEnemyParty\n" - " add r0, r0, r2\n" - " add r6, r7, #0\n" - " add r6, r6, #0x11\n" - " lsl r1, r1, #0x3\n" - " add r1, r4, r1\n" - " add r1, r1, r9\n" - " mov r3, #0x0\n" - " ldsh r1, [r1, r3]\n" - " lsl r2, r1, #0x1\n" - " add r2, r2, r1\n" - " lsl r2, r2, #0x2\n" - " ldr r1, ._750 + 24 @ gBattleMoves\n" - " add r2, r2, r1\n" - " add r1, r6, #0\n" - " bl SetMonData\n" - " ldr r2, [sp, #0xc]\n" - " mov r0, r8\n" - " mul r0, r0, r2\n" - " add r0, r0, sl\n" - " lsl r2, r2, #0x3\n" - " ldr r3, ._750 + 28 @ gUnknown_Debug_2023B32\n" - " add r1, r4, r3\n" - " add r2, r2, r1\n" - " add r1, r5, #0\n" - " bl SetMonData\n" - " ldr r1, [sp, #0xc]\n" - " mov r0, r8\n" - " mul r0, r0, r1\n" - " add r0, r0, sl\n" - " lsl r1, r1, #0x3\n" - " add r4, r4, r1\n" - " ldr r1, ._750 + 28 @ gUnknown_Debug_2023B32\n" - " add r4, r4, r1\n" - " mov r2, #0x0\n" - " ldsh r1, [r4, r2]\n" - " lsl r2, r1, #0x1\n" - " add r2, r2, r1\n" - " lsl r2, r2, #0x2\n" - " ldr r3, ._750 + 24 @ gBattleMoves\n" - " add r2, r2, r3\n" - " add r1, r6, #0\n" - " bl SetMonData\n" - " add r7, r7, #0x1\n" - " cmp r7, #0x3\n" - " ble ._746 @cond_branch\n" - " ldr r0, [sp, #0xc]\n" - " add r0, r0, #0x1\n" - " str r0, [sp, #0xc]\n" - " cmp r0, #0x5\n" - " ble ._747 @cond_branch\n" - " ldr r3, ._750 + 32 @ gUnknown_Debug_2023A76\n" - " add r4, r3, #0\n" - " add r4, r4, #0x44\n" - " ldrh r1, [r4]\n" - " mov r2, #0x0\n" - " ldsh r0, [r4, r2]\n" - " cmp r0, #0x8\n" - " bne ._748 @cond_branch\n" - " ldr r0, ._750 + 12 @ gUnknown_02023A14_50\n" - " ldrb r1, [r0]\n" - " mov r2, #0x80\n" - " b ._753\n" - "._751:\n" - " .align 2, 0\n" - "._750:\n" - " .word gPlayerParty\n" - " .word gUnknown_Debug_2023ABC\n" - " .word Str_821F649\n" - " .word gUnknown_02023A14_50\n" - " .word gUnknown_Debug_2023B02\n" - " .word gEnemyParty\n" - " .word gBattleMoves+0x4\n" - " .word gUnknown_Debug_2023B32\n" - " .word gUnknown_Debug_2023A76\n" - "._748:\n" - " cmp r0, #0x7\n" - " bne ._752 @cond_branch\n" - " ldr r0, ._754 @ gUnknown_02023A14_50\n" - " ldrb r1, [r0]\n" - " mov r2, #0x20\n" - " b ._753\n" - "._755:\n" - " .align 2, 0\n" - "._754:\n" - " .word gUnknown_02023A14_50\n" - "._752:\n" - " cmp r0, #0x6\n" - " bne ._756 @cond_branch\n" - " ldr r2, ._759 @ gUnknown_02023A14_50\n" - " ldrb r0, [r2]\n" - " mov r1, #0x10\n" - " orr r0, r0, r1\n" - " strb r0, [r2]\n" - " ldrh r1, [r3, #0x4]\n" - " mov r2, #0x4\n" - " ldsh r0, [r3, r2]\n" - " cmp r0, #0x5\n" - " ble ._757 @cond_branch\n" - " ldr r0, ._759 + 4 @ gSharedMem\n" - " sub r1, r1, #0x2\n" - " ldr r3, ._759 + 8 @ 0x160a3\n" - " add r0, r0, r3\n" - " b ._761\n" - "._760:\n" - " .align 2, 0\n" - "._759:\n" - " .word gUnknown_02023A14_50\n" - " .word gSharedMem\n" - " .word 0x160a3\n" - "._757:\n" - " ldr r0, ._762 @ gSharedMem\n" - " ldr r2, ._762 + 4 @ 0x160a3\n" - " add r0, r0, r2\n" - " b ._761\n" - "._763:\n" - " .align 2, 0\n" - "._762:\n" - " .word gSharedMem\n" - " .word 0x160a3\n" - "._756:\n" - " cmp r0, #0x5\n" - " bne ._764 @cond_branch\n" - " ldr r0, ._766 @ gUnknown_02023A14_50\n" - " ldrb r1, [r0]\n" - " mov r2, #0x21\n" - "._753:\n" - " orr r1, r1, r2\n" - "._761:\n" - " strb r1, [r0]\n" - " bl sub_80408BC\n" - " b ._770\n" - "._767:\n" - " .align 2, 0\n" - "._766:\n" - " .word gUnknown_02023A14_50\n" - "._764:\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._768 @cond_branch\n" - " bl sub_80408BC\n" - "._768:\n" - " ldrh r3, [r4]\n" - " mov r0, #0x2\n" - " and r0, r0, r3\n" - " cmp r0, #0\n" - " beq ._769 @cond_branch\n" - " ldr r0, ._772 @ gUnknown_02023A14_50\n" - " ldrb r1, [r0]\n" - " mov r2, #0x4\n" - " orr r1, r1, r2\n" - " strb r1, [r0]\n" - "._769:\n" - " mov r0, #0x4\n" - " and r0, r0, r3\n" - " cmp r0, #0\n" - " beq ._770 @cond_branch\n" - " ldr r0, ._772 @ gUnknown_02023A14_50\n" - " ldrb r1, [r0]\n" - " mov r2, #0x6\n" - " orr r1, r1, r2\n" - " strb r1, [r0]\n" - "._770:\n" - " ldr r0, ._772 + 4 @ gMain\n" - " ldr r1, ._772 + 8 @ debug_sub_80108B8\n" - " str r1, [r0, #0x8]\n" - " ldr r0, ._772 + 12 @ unref_sub_800D684\n" - " bl SetMainCallback2\n" - " bl ClearBag\n" - " mov r0, #0x1\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x2\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x3\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x4\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x5\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x6\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x7\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x8\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x9\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0xa\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0xb\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0xc\n" - " mov r1, #0xa\n" - " bl AddBagItem\n" - " mov r0, #0x13\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x14\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x19\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x22\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x23\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x25\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x49\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x4a\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x4b\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x4c\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x4d\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x4e\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " mov r0, #0x50\n" - " mov r1, #0x63\n" - " bl AddBagItem\n" - " ldr r4, ._772 + 16 @ gUnknown_Debug_821F5AC\n" - " mov r7, #0xe\n" - "._771:\n" - " add r0, r4, #0\n" - " bl sub_810CA34\n" - " add r4, r4, #0x8\n" - " sub r7, r7, #0x1\n" - " cmp r7, #0\n" - " bge ._771 @cond_branch\n" - " add sp, sp, #0x18\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._773:\n" - " .align 2, 0\n" - "._772:\n" - " .word gUnknown_02023A14_50\n" - " .word gMain\n" - " .word debug_sub_80108B8+1\n" - " .word unref_sub_800D684+1\n" - " .word gUnknown_Debug_821F5AC\n" - "\n" - ); + for (spC = 0; spC < 6; spC++) + { + for (i = 0; i < 4; i++) + { + SetMonData(&gEnemyParty[spC], MON_DATA_MOVE1 + i, &gUnknown_Debug_2023B02[0][spC][i]); + SetMonData(&gEnemyParty[spC], MON_DATA_PP1 + i, &gBattleMoves[gUnknown_Debug_2023B02[0][spC][i]].pp); + SetMonData(&gPlayerParty[spC], MON_DATA_MOVE1 + i, &gUnknown_Debug_2023B02[1][spC][i]); + SetMonData(&gPlayerParty[spC], MON_DATA_PP1 + i, &gBattleMoves[gUnknown_Debug_2023B02[1][spC][i]].pp); + } + } + + if (gUnknown_Debug_2023A76[0][0x22] == 8) + { + gUnknown_02023A14_50 |= 0x80; + sub_80408BC(); + } + else if (gUnknown_Debug_2023A76[0][0x22] == 7) + { + gUnknown_02023A14_50 |= 0x20; + sub_80408BC(); + } + else if (gUnknown_Debug_2023A76[0][0x22] == 6) + { + gUnknown_02023A14_50 |= 0x10; + if (gUnknown_Debug_2023A76[0][2] > 5) + gSharedMem[0x160A3] = gUnknown_Debug_2023A76[0][2] - 2; + else + gSharedMem[0x160A3] = gUnknown_Debug_2023A76[0][2]; + sub_80408BC(); + } + else if (gUnknown_Debug_2023A76[0][0x22] == 5) + { + gUnknown_02023A14_50 |= 0x21; + sub_80408BC(); + } + else + { + if (!(gUnknown_Debug_2023A76[0][0x22] & 1)) + sub_80408BC(); + if (gUnknown_Debug_2023A76[0][0x22] & 2) + gUnknown_02023A14_50 |= 4; + if (gUnknown_Debug_2023A76[0][0x22] & 4) + gUnknown_02023A14_50 |= 6; + } + + gMain.savedCallback = debug_sub_80108B8; + SetMainCallback2(unref_sub_800D684); + + ClearBag(); + + AddBagItem(ITEM_MASTER_BALL, 10); + AddBagItem(ITEM_ULTRA_BALL, 10); + AddBagItem(ITEM_GREAT_BALL, 10); + AddBagItem(ITEM_POKE_BALL, 10); + AddBagItem(ITEM_SAFARI_BALL, 10); + AddBagItem(ITEM_NET_BALL, 10); + AddBagItem(ITEM_DIVE_BALL, 10); + AddBagItem(ITEM_NEST_BALL, 10); + AddBagItem(ITEM_REPEAT_BALL, 10); + AddBagItem(ITEM_TIMER_BALL, 10); + AddBagItem(ITEM_LUXURY_BALL, 10); + AddBagItem(ITEM_PREMIER_BALL, 10); + + AddBagItem(ITEM_FULL_RESTORE, 99); + AddBagItem(ITEM_MAX_POTION, 99); + AddBagItem(ITEM_MAX_REVIVE, 99); + AddBagItem(ITEM_ETHER, 99); + AddBagItem(ITEM_MAX_ETHER, 99); + AddBagItem(ITEM_MAX_ELIXIR, 99); + + AddBagItem(ITEM_GUARD_SPEC, 99); + AddBagItem(ITEM_DIRE_HIT, 99); + AddBagItem(ITEM_X_ATTACK, 99); + AddBagItem(ITEM_X_DEFEND, 99); + AddBagItem(ITEM_X_SPEED, 99); + AddBagItem(ITEM_X_ACCURACY, 99); + // hmm... no X Special? Why do we need Poke Doll? + AddBagItem(ITEM_POKE_DOLL, 99); + + for (i = 0; i < 15; i++) + sub_810CA34(&gUnknown_Debug_821F5AC[i]); } void debug_sub_8011D40(void) -- cgit v1.2.3 From aaa67d9f274611bc0a1eb1a28409e36756417c24 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 15 Feb 2018 01:19:14 -0600 Subject: decompile debug_sub_8011EA0 and debug_sub_8012294 --- src/battle/battle_2.c | 804 ++++++++++++-------------------------------------- src/field/pokeblock.c | 2 +- 2 files changed, 195 insertions(+), 611 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index af90bdccd..75d66ae9b 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1949,7 +1949,7 @@ void debug_sub_8011498(void) extern const u16 gUnknown_Debug_821F598[]; extern const u8 str_821F631[][6]; extern const u8 Str_821F649[]; -extern /*const*/ struct Pokeblock gUnknown_Debug_821F5AC[]; +extern const struct Pokeblock gUnknown_Debug_821F5AC[]; extern u8 gUnknown_020297ED; @@ -2226,613 +2226,202 @@ void debug_sub_8011E74(void) gUnknown_Debug_030043A8 = r5; } -__attribute__((naked)) +extern const u8 Str_821F624[]; + void debug_sub_8011EA0(u8 a) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffff4\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r7, #0x22\n" - " bls ._782 @cond_branch\n" - " b ._815\n" - "._782:\n" - " lsl r0, r7, #0x2\n" - " ldr r1, ._785 @ \n" - " add r1, r0, r1\n" - " ldr r1, [r1]\n" - " str r0, [sp, #0x8]\n" - " mov pc, r1\n" - "._786:\n" - " .align 2, 0\n" - "._785:\n" - " .word ._784\n" - "._784:\n" - " .word ._812\n" - " .word ._817\n" - " .word ._814\n" - " .word ._815\n" - " .word ._816\n" - " .word ._812\n" - " .word ._817\n" - " .word ._814\n" - " .word ._815\n" - " .word ._816\n" - " .word ._812\n" - " .word ._817\n" - " .word ._814\n" - " .word ._815\n" - " .word ._816\n" - " .word ._812\n" - " .word ._817\n" - " .word ._814\n" - " .word ._815\n" - " .word ._816\n" - " .word ._812\n" - " .word ._817\n" - " .word ._814\n" - " .word ._815\n" - " .word ._816\n" - " .word ._812\n" - " .word ._817\n" - " .word ._814\n" - " .word ._815\n" - " .word ._816\n" - " .word ._817\n" - " .word ._848\n" - " .word ._848\n" - " .word ._848\n" - " .word ._848\n" - "._812:\n" - " mov r0, #0x0\n" - " mov r1, #0x14\n" - " bl debug_sub_8010A7C\n" - " ldr r6, ._823 @ gBattleTextBuff1\n" - " ldr r2, ._823 + 4 @ gUnknown_Debug_821F424\n" - " ldr r0, [sp, #0x8]\n" - " add r1, r0, r7\n" - " lsl r1, r1, #0x1\n" - " add r0, r1, r2\n" - " ldrh r0, [r0]\n" - " str r0, [sp, #0x4]\n" - " add r0, r2, #2\n" - " add r0, r1, r0\n" - " ldrb r0, [r0]\n" - " mov r8, r0\n" - " add r2, r2, #0x4\n" - " add r1, r1, r2\n" - " ldrb r1, [r1]\n" - " mov r9, r1\n" - " str r1, [sp]\n" - " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" - " add r1, r6, #0\n" - " ldr r2, [sp, #0x4]\n" - " mov r3, r8\n" - " bl Text_InitWindow\n" - " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" - " bl Text_PrintWindow8002F44\n" - " ldr r1, ._823 + 12 @ gUnknown_Debug_2023A76\n" - " mov sl, r1\n" - " lsl r4, r7, #0x1\n" - " ldr r5, ._823 + 16 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r5]\n" - " mov r7, #0x46\n" - " mul r0, r0, r7\n" - " add r0, r4, r0\n" - " add r0, r0, sl\n" - " mov r2, #0x0\n" - " ldsh r1, [r0, r2]\n" - " add r0, r6, #0\n" - " mov r2, #0x2\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " mov r2, #0xd3\n" - " lsl r2, r2, #0x1\n" - " ldrb r3, [r5]\n" - " lsl r3, r3, #0x5\n" - " add r3, r3, #0x19\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" - " add r1, r6, #0\n" - " bl Text_InitWindow\n" - " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" - " bl Text_PrintWindow8002F44\n" - " mov r0, #0xff\n" - " strb r0, [r6]\n" - " ldrb r0, [r5]\n" - " mul r0, r0, r7\n" - " add r4, r4, r0\n" - " add r4, r4, sl\n" - " mov r0, #0x0\n" - " ldsh r1, [r4, r0]\n" - " mov r0, #0xb\n" - " mul r1, r1, r0\n" - " ldr r0, ._823 + 20 @ gSpeciesNames\n" - " add r1, r1, r0\n" - " add r0, r6, #0\n" - " bl StringAppend\n" - " mov r1, r9\n" - " str r1, [sp]\n" - " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" - " add r1, r6, #0\n" - " ldr r2, [sp, #0x4]\n" - " mov r3, r8\n" - " bl Text_InitWindow\n" - " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n" - " bl Text_PrintWindow8002F44\n" - " b ._848\n" - "._824:\n" - " .align 2, 0\n" - "._823:\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_821F424\n" - " .word gUnknown_Debug_03004370\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_03004360\n" - " .word gSpeciesNames\n" - "._817:\n" - " ldr r6, ._826 @ gBattleTextBuff1\n" - " ldr r3, ._826 + 4 @ gUnknown_Debug_2023A76\n" - " lsl r1, r7, #0x1\n" - " ldr r0, ._826 + 8 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r0]\n" - " mov r0, #0x46\n" - " mul r0, r0, r2\n" - " add r1, r1, r0\n" - " add r1, r1, r3\n" - " mov r2, #0x0\n" - " ldsh r1, [r1, r2]\n" - " add r0, r6, #0\n" - " mov r2, #0x2\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " b ._825\n" - "._827:\n" - " .align 2, 0\n" - "._826:\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_03004360\n" - "._814:\n" - " mov r0, #0x0\n" - " mov r1, #0x18\n" - " bl debug_sub_8010A7C\n" - " ldr r6, ._830 @ gUnknown_Debug_03004370\n" - " ldr r1, ._830 + 4 @ gBattleTextBuff1\n" - " mov sl, r1\n" - " ldr r4, ._830 + 8 @ gUnknown_Debug_821F424\n" - " ldr r2, [sp, #0x8]\n" - " add r1, r2, r7\n" - " lsl r1, r1, #0x1\n" - " add r0, r1, r4\n" - " ldrh r2, [r0]\n" - " add r0, r4, #2\n" - " add r0, r1, r0\n" - " ldrb r3, [r0]\n" - " add r4, r4, #0x4\n" - " add r1, r1, r4\n" - " ldrb r0, [r1]\n" - " str r0, [sp]\n" - " add r0, r6, #0\n" - " mov r1, sl\n" - " bl Text_InitWindow\n" - " add r0, r6, #0\n" - " bl Text_PrintWindow8002F44\n" - " lsl r4, r7, #0x1\n" - " ldr r5, ._830 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r5]\n" - " mov r1, #0x46\n" - " mul r0, r0, r1\n" - " add r0, r4, r0\n" - " ldr r2, ._830 + 16 @ gUnknown_Debug_2023A76\n" - " add r0, r0, r2\n" - " mov r2, #0x0\n" - " ldsh r1, [r0, r2]\n" - " mov r0, sl\n" - " mov r2, #0x2\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " mov r2, #0xd3\n" - " lsl r2, r2, #0x1\n" - " ldrb r3, [r5]\n" - " lsl r3, r3, #0x5\n" - " add r3, r3, #0x19\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " add r0, r6, #0\n" - " mov r1, sl\n" - " bl Text_InitWindow\n" - " add r0, r6, #0\n" - " bl Text_PrintWindow8002F44\n" - " mov r0, #0xff\n" - " mov r1, sl\n" - " strb r0, [r1]\n" - " ldrb r0, [r5]\n" - " mov r2, #0x46\n" - " mul r0, r0, r2\n" - " add r4, r4, r0\n" - " ldr r0, ._830 + 16 @ gUnknown_Debug_2023A76\n" - " add r4, r4, r0\n" - " mov r1, #0x0\n" - " ldsh r0, [r4, r1]\n" - " cmp r0, #0\n" - " beq ._828 @cond_branch\n" - " ldrh r0, [r4]\n" - " bl ItemId_GetItem\n" - " add r1, r0, #0\n" - " mov r0, sl\n" - " bl StringAppend\n" - " b ._829\n" - "._831:\n" - " .align 2, 0\n" - "._830:\n" - " .word gUnknown_Debug_03004370\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_821F424\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_2023A76\n" - "._828:\n" - " ldr r1, ._833 @ Str_821F624\n" - " mov r0, sl\n" - " bl StringAppend\n" - "._829:\n" - " ldr r6, ._833 + 4 @ gUnknown_Debug_03004370\n" - " ldr r1, ._833 + 8 @ gBattleTextBuff1\n" - " ldr r5, ._833 + 12 @ gUnknown_Debug_821F424\n" - " ldr r2, [sp, #0x8]\n" - " add r4, r2, r7\n" - " lsl r4, r4, #0x1\n" - " add r0, r4, r5\n" - " ldrh r2, [r0]\n" - " add r0, r5, #2\n" - " add r0, r4, r0\n" - " ldrb r3, [r0]\n" - " add r5, r5, #0x4\n" - " add r4, r4, r5\n" - " ldrb r0, [r4]\n" - " str r0, [sp]\n" - " add r0, r6, #0\n" - " bl Text_InitWindow\n" - " add r0, r6, #0\n" - " bl Text_PrintWindow8002F44\n" - " b ._848\n" - "._834:\n" - " .align 2, 0\n" - "._833:\n" - " .word Str_821F624\n" - " .word gUnknown_Debug_03004370\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_821F424\n" - "._816:\n" - " mov r0, #0x0\n" - " mov r1, #0x4\n" - " bl debug_sub_8010A7C\n" - " ldr r5, ._839 @ gUnknown_Debug_03004370\n" - " ldr r6, ._839 + 4 @ gBattleTextBuff1\n" - " ldr r4, ._839 + 8 @ gUnknown_Debug_821F424\n" - " ldr r0, [sp, #0x8]\n" - " add r1, r0, r7\n" - " lsl r1, r1, #0x1\n" - " add r0, r1, r4\n" - " ldrh r2, [r0]\n" - " add r0, r4, #2\n" - " add r0, r1, r0\n" - " ldrb r3, [r0]\n" - " add r4, r4, #0x4\n" - " add r1, r1, r4\n" - " ldrb r0, [r1]\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " add r1, r6, #0\n" - " bl Text_InitWindow\n" - " add r0, r5, #0\n" - " bl Text_PrintWindow8002F44\n" - " mov r4, #0x0\n" - " ldr r3, ._839 + 12 @ gUnknown_Debug_2023A76\n" - " lsl r1, r7, #0x1\n" - " ldr r0, ._839 + 16 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r0]\n" - " mov r0, #0x46\n" - " mul r0, r0, r2\n" - " add r1, r1, r0\n" - " add r1, r1, r3\n" - " mov r2, #0x0\n" - " ldsh r0, [r1, r2]\n" - " cmp r0, #0x1\n" - " beq ._835 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._836 @cond_branch\n" - " cmp r0, #0\n" - " beq ._837 @cond_branch\n" - " b ._843\n" - "._840:\n" - " .align 2, 0\n" - "._839:\n" - " .word gUnknown_Debug_03004370\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_821F424\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_03004360\n" - "._836:\n" - " cmp r0, #0x2\n" - " beq ._841 @cond_branch\n" - " cmp r0, #0x3\n" - " beq ._842 @cond_branch\n" - " b ._843\n" - "._837:\n" - " mov r0, #0xb5\n" - " b ._844\n" - "._835:\n" - " mov r0, #0xb6\n" - "._844:\n" - " strb r0, [r6]\n" - " mov r4, #0x1\n" - " b ._847\n" - "._841:\n" - " mov r0, #0xb5\n" - " b ._846\n" - "._842:\n" - " mov r0, #0xb6\n" - "._846:\n" - " strb r0, [r6]\n" - " strb r0, [r6, #0x1]\n" - " mov r4, #0x2\n" - " b ._847\n" - "._843:\n" - " ldr r2, ._849 @ gBattleTextBuff1\n" - " add r1, r4, r2\n" - " mov r0, #0xac\n" - " strb r0, [r1]\n" - " add r4, r4, #0x1\n" - " add r6, r2, #0\n" - "._847:\n" - " add r1, r4, r6\n" - " mov r0, #0xff\n" - " strb r0, [r1]\n" - "._825:\n" - " ldr r5, ._849 + 4 @ gUnknown_Debug_03004370\n" - " ldr r4, ._849 + 8 @ gUnknown_Debug_821F424\n" - " ldr r0, [sp, #0x8]\n" - " add r1, r0, r7\n" - " lsl r1, r1, #0x1\n" - " add r0, r1, r4\n" - " ldrh r2, [r0]\n" - " add r0, r4, #2\n" - " add r0, r1, r0\n" - " ldrb r3, [r0]\n" - " add r4, r4, #0x4\n" - " add r1, r1, r4\n" - " ldrb r0, [r1]\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " add r1, r6, #0\n" - " bl Text_InitWindow\n" - " add r0, r5, #0\n" - " bl Text_PrintWindow8002F44\n" - " b ._848\n" - "._850:\n" - " .align 2, 0\n" - "._849:\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_03004370\n" - " .word gUnknown_Debug_821F424\n" - "._815:\n" - " ldr r6, ._851 @ gBattleTextBuff1\n" - " ldr r3, ._851 + 4 @ gUnknown_Debug_2023A76\n" - " lsl r1, r7, #0x1\n" - " ldr r0, ._851 + 8 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r0]\n" - " mov r0, #0x46\n" - " mul r0, r0, r2\n" - " add r1, r1, r0\n" - " add r1, r1, r3\n" - " mov r2, #0x0\n" - " ldsh r1, [r1, r2]\n" - " add r0, r6, #0\n" - " mov r2, #0x2\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " ldr r5, ._851 + 12 @ gUnknown_Debug_03004370\n" - " ldr r4, ._851 + 16 @ gUnknown_Debug_821F424\n" - " lsl r1, r7, #0x2\n" - " add r1, r1, r7\n" - " lsl r1, r1, #0x1\n" - " add r0, r1, r4\n" - " ldrh r2, [r0]\n" - " add r0, r4, #2\n" - " add r0, r1, r0\n" - " ldrb r3, [r0]\n" - " add r4, r4, #0x4\n" - " add r1, r1, r4\n" - " ldrb r0, [r1]\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " add r1, r6, #0\n" - " bl Text_InitWindow\n" - " add r0, r5, #0\n" - " bl Text_PrintWindow8002F44\n" - "._848:\n" - " add sp, sp, #0xc\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._852:\n" - " .align 2, 0\n" - "._851:\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_03004370\n" - " .word gUnknown_Debug_821F424\n" - "\n" - ); + u32 length; + + switch (a) + { + case 0: + case 5: + case 10: + case 15: + case 20: + case 25: + debug_sub_8010A7C(0, 20); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[a][0], + gUnknown_Debug_821F424[a][1], + gUnknown_Debug_821F424[a][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + 422, + gUnknown_Debug_03004360 * 32 + 25, + 0); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + gBattleTextBuff1[0] = EOS; + StringAppend(gBattleTextBuff1, gSpeciesNames[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]]); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[a][0], + gUnknown_Debug_821F424[a][1], + gUnknown_Debug_821F424[a][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + break; + case 1: + case 6: + case 11: + case 16: + case 21: + case 26: + case 30: + ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[a][0], + gUnknown_Debug_821F424[a][1], + gUnknown_Debug_821F424[a][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + break; + case 2: + case 7: + case 12: + case 17: + case 22: + case 27: + debug_sub_8010A7C(0, 24); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[a][0], + gUnknown_Debug_821F424[a][1], + gUnknown_Debug_821F424[a][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + 422, + gUnknown_Debug_03004360 * 32 + 25, + 0); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + gBattleTextBuff1[0] = EOS; + if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a] != 0) + StringAppend(gBattleTextBuff1, ItemId_GetItem(gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a])->name); + else + StringAppend(gBattleTextBuff1, Str_821F624); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[a][0], + gUnknown_Debug_821F424[a][1], + gUnknown_Debug_821F424[a][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + break; + case 4: + case 9: + case 14: + case 19: + case 24: + case 29: + debug_sub_8010A7C(0, 4); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[a][0], + gUnknown_Debug_821F424[a][1], + gUnknown_Debug_821F424[a][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + length = 0; + switch (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]) + { + case 0: + gBattleTextBuff1[0] = CHAR_MALE; + length = 1; + break; + case 1: + gBattleTextBuff1[0] = CHAR_FEMALE; + length = 1; + break; + case 2: + gBattleTextBuff1[0] = CHAR_MALE; + gBattleTextBuff1[1] = CHAR_MALE; + length = 2; + break; + case 3: + gBattleTextBuff1[0] = CHAR_FEMALE; + gBattleTextBuff1[1] = CHAR_FEMALE; + length = 2; + break; + default: + gBattleTextBuff1[length] = CHAR_QUESTION_MARK; + length++; + break; + } + gBattleTextBuff1[length] = EOS; + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[a][0], + gUnknown_Debug_821F424[a][1], + gUnknown_Debug_821F424[a][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + break; + case 3: + case 8: + case 13: + case 18: + case 23: + case 28: + default: + ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 1); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[a][0], + gUnknown_Debug_821F424[a][1], + gUnknown_Debug_821F424[a][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + break; + case 31: + case 32: + case 33: + case 34: + break; + } } -__attribute__((naked)) -void debug_sub_8012294() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " ldr r2, ._854 @ gUnknown_Debug_030043A0\n" - " ldr r0, ._854 + 4 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x1d\n" - " bhi ._853 @cond_branch\n" - " mov r0, #0x0\n" - " mov r1, #0x18\n" - " bl debug_sub_8010A7C\n" - " ldr r0, ._854 + 8 @ gUnknown_Debug_03004370\n" - " mov sl, r0\n" - " ldr r1, ._854 + 12 @ gBattleTextBuff1\n" - " mov r9, r1\n" - " ldr r2, ._854 + 16 @ gUnknown_Debug_821F564\n" - " mov r8, r2\n" - " ldr r7, ._854 + 20 @ gUnknown_Debug_030043A8\n" - " ldrb r1, [r7]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x1\n" - " add r1, r0, r2\n" - " ldrh r2, [r1]\n" - " ldr r3, ._854 + 24 @ gUnknown_Debug_821F566\n" - " add r1, r0, r3\n" - " ldrb r3, [r1]\n" - " ldr r1, ._854 + 28 @ gUnknown_Debug_821F568\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " str r0, [sp]\n" - " mov r0, sl\n" - " mov r1, r9\n" - " bl Text_InitWindow\n" - " mov r0, sl\n" - " bl Text_PrintWindow8002F44\n" - " ldrb r4, [r7]\n" - " lsl r4, r4, #0x1\n" - " add r0, r5, #0\n" - " mov r1, #0x5\n" - " bl __udivsi3\n" - " add r5, r0, #0\n" - " lsl r5, r5, #0x18\n" - " lsr r5, r5, #0x15\n" - " add r4, r4, r5\n" - " ldr r6, ._854 + 32 @ gUnknown_Debug_03004360\n" - " ldrb r1, [r6]\n" - " lsl r0, r1, #0x1\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x4\n" - " add r4, r4, r0\n" - " ldr r2, ._854 + 36 @ gUnknown_Debug_2023B02\n" - " add r4, r4, r2\n" - " mov r3, #0x0\n" - " ldsh r1, [r4, r3]\n" - " mov r0, r9\n" - " mov r2, #0x2\n" - " mov r3, #0x3\n" - " bl ConvertIntToDecimalStringN\n" - " mov r2, #0xd3\n" - " lsl r2, r2, #0x1\n" - " ldrb r3, [r6]\n" - " lsl r3, r3, #0x5\n" - " add r3, r3, #0x19\n" - " lsl r3, r3, #0x18\n" - " lsr r3, r3, #0x18\n" - " mov r0, #0x0\n" - " str r0, [sp]\n" - " mov r0, sl\n" - " mov r1, r9\n" - " bl Text_InitWindow\n" - " mov r0, sl\n" - " bl Text_PrintWindow8002F44\n" - " mov r0, #0xff\n" - " mov r1, r9\n" - " strb r0, [r1]\n" - " ldrb r1, [r7]\n" - " lsl r1, r1, #0x1\n" - " add r1, r1, r5\n" - " ldrb r2, [r6]\n" - " lsl r0, r2, #0x1\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r2, ._854 + 36 @ gUnknown_Debug_2023B02\n" - " add r1, r1, r2\n" - " mov r3, #0x0\n" - " ldsh r1, [r1, r3]\n" - " mov r0, #0xd\n" - " mul r1, r1, r0\n" - " ldr r0, ._854 + 40 @ gMoveNames\n" - " add r1, r1, r0\n" - " mov r0, r9\n" - " bl StringAppend\n" - " ldrb r1, [r7]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x1\n" - " add r8, r8, r0\n" - " mov r1, r8\n" - " ldrh r2, [r1]\n" - " ldr r3, ._854 + 24 @ gUnknown_Debug_821F566\n" - " add r1, r0, r3\n" - " ldrb r3, [r1]\n" - " ldr r1, ._854 + 28 @ gUnknown_Debug_821F568\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " str r0, [sp]\n" - " mov r0, sl\n" - " mov r1, r9\n" - " bl Text_InitWindow\n" - " mov r0, sl\n" - " bl Text_PrintWindow8002F44\n" - "._853:\n" - " add sp, sp, #0x4\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._855:\n" - " .align 2, 0\n" - "._854:\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_03004370\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_821F564\n" - " .word gUnknown_Debug_030043A8\n" - " .word gUnknown_Debug_821F566\n" - " .word gUnknown_Debug_821F568\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_2023B02\n" - " .word gMoveNames\n" - "\n" - ); +void debug_sub_8012294(void) +{ + u8 r5 = gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5; + + if (r5 < 30) + { + debug_sub_8010A7C(0, 24); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F564[gUnknown_Debug_030043A8][0], + gUnknown_Debug_821F564[gUnknown_Debug_030043A8][1], + gUnknown_Debug_821F564[gUnknown_Debug_030043A8][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8], 2, 3); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + 422, + gUnknown_Debug_03004360 * 32 + 25, + 0); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + gBattleTextBuff1[0] = EOS; + StringAppend(gBattleTextBuff1, gMoveNames[gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8]]); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F564[gUnknown_Debug_030043A8][0], + gUnknown_Debug_821F564[gUnknown_Debug_030043A8][1], + gUnknown_Debug_821F564[gUnknown_Debug_030043A8][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + } } __attribute__((naked)) @@ -3051,13 +2640,8 @@ void debug_sub_8012540() ); } -__attribute__((naked)) -void debug_nullsub_3() +void debug_nullsub_3(void) { - asm( - " bx lr\n" - "\n" - ); } __attribute__((naked)) diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c index b4be44aa2..aa6539e91 100644 --- a/src/field/pokeblock.c +++ b/src/field/pokeblock.c @@ -1070,7 +1070,7 @@ s8 GetFirstFreePokeblockSlot(void) return -1; } -bool8 sub_810CA34(struct Pokeblock *pokeblock) +bool8 sub_810CA34(const struct Pokeblock *pokeblock) { s8 idx = GetFirstFreePokeblockSlot(); if (idx == -1) -- cgit v1.2.3 From e58c4ac922c10a2e7c06e1c3d27a95cf51361cb5 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 15 Feb 2018 01:36:03 -0600 Subject: ItemId_GetItem -> ItemId_GetName --- src/battle/battle_2.c | 2 +- src/debug/start_menu_debug.c | 2 +- src/field/item.c | 26 +++++++++++++++++++++++--- src/field/item_menu.c | 6 +++--- src/field/pokeblock.c | 4 ++-- src/field/tv.c | 10 +++++----- src/pokemon/pokemon_storage_system_4.c | 2 +- src/pokemon/pokemon_summary_screen.c | 2 +- src/scene/berry_blender.c | 1 - 9 files changed, 37 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 75d66ae9b..d28ef6713 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -2306,7 +2306,7 @@ void debug_sub_8011EA0(u8 a) Text_PrintWindow8002F44(&gUnknown_Debug_03004370); gBattleTextBuff1[0] = EOS; if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a] != 0) - StringAppend(gBattleTextBuff1, ItemId_GetItem(gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a])->name); + StringAppend(gBattleTextBuff1, ItemId_GetName(gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a])); else StringAppend(gBattleTextBuff1, Str_821F624); Text_InitWindow( diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 4690368d8..04bfb30d1 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -3184,7 +3184,7 @@ void DebugMenu_8077EE0() " mov r2, #0x11\n" " bl Menu_PrintText\n" " add r0, r4, #0\n" - " bl ItemId_GetItem\n" + " bl ItemId_GetName\n" " mov r1, #0x8\n" " mov r2, #0x11\n" " bl Menu_PrintText\n" diff --git a/src/field/item.c b/src/field/item.c index 78f5ce12d..ba294a1ca 100644 --- a/src/field/item.c +++ b/src/field/item.c @@ -8,6 +8,24 @@ #include "string_util.h" #include "strings.h" +struct Item +{ + u8 name[14]; + u16 itemId; + u16 price; + u8 holdEffect; + u8 holdEffectParam; + const u8 *description; + u8 importance; + u8 unk19; + u8 pocket; + u8 type; + ItemUseFunc fieldUseFunc; + u8 battleUsage; + ItemUseFunc battleUseFunc; + u8 secondaryId; +}; + extern u8 gUnknown_02038560; extern struct BagPocket gBagPockets[NUM_BAG_POCKETS]; @@ -49,7 +67,9 @@ void CopyItemName(u16 itemId, u8 *string) StringAppend(string, gOtherText_Berry2); } else - StringCopy(string, ItemId_GetItem(itemId)->name); + { + StringCopy(string, ItemId_GetName(itemId)); + } } //Unreferenced @@ -579,9 +599,9 @@ static u16 SanitizeItemId(u16 itemId) return itemId; } -const struct Item *ItemId_GetItem(u16 itemId) +const u8 *ItemId_GetName(u16 itemId) { - return &gItems[SanitizeItemId(itemId)]; + return gItems[SanitizeItemId(itemId)].name; } u16 ItemId_GetId(u16 itemId) diff --git a/src/field/item_menu.c b/src/field/item_menu.c index ae1465fbd..9fa3fd6cb 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -1612,7 +1612,7 @@ static void sub_80A4380(u16 a, int b, int c, int d) r5 = i * 2 + 2; text = gStringVar1; text = sub_80A425C(a, text, i); - text = sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x66, 0); + text = sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x66, 0); *text++ = CHAR_MULT_SIGN; sub_8072C14(text, gCurrentBagPocketItemSlots[r4].quantity, 0x78, 1); Menu_PrintText(gStringVar1, 14, r5); @@ -1636,9 +1636,9 @@ static void sub_80A444C(u16 a, int b, int c, int d) text = gStringVar1; text = sub_80A425C(a, text, i); #if ENGLISH - sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x60, 0); + sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x60, 0); #else - sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x63, 0); + sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x63, 0); #endif Menu_PrintText(gStringVar1, 14, r5); if (gUnknown_02038558 != 0) diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c index aa6539e91..6804f55d6 100644 --- a/src/field/pokeblock.c +++ b/src/field/pokeblock.c @@ -462,7 +462,7 @@ void debug_sub_8120F98(void) static void sub_810BB0C(void) { BasicInitMenuWindow(&gWindowTemplate_81E6E34); - sub_8072BD8(ItemId_GetItem(ITEM_POKEBLOCK_CASE)->name, 2, 1, 0x48); + sub_8072BD8(ItemId_GetName(ITEM_POKEBLOCK_CASE), 2, 1, 0x48); } static void sub_810BB30(void) @@ -481,7 +481,7 @@ static void sub_810BB88(u8 a0) u8 y; u8 *buf; BasicInitMenuWindow(&gWindowTemplate_81E6E34); - for (i=a0; i<=a0+8; i++) + for (i = a0; i <= a0 + 8; i++) { y = (i - a0) << 1; if (i == gUnknown_02039248.unk2) diff --git a/src/field/tv.c b/src/field/tv.c index 8bd36bb9c..405422dd7 100644 --- a/src/field/tv.c +++ b/src/field/tv.c @@ -3050,7 +3050,7 @@ void DoTVShowTodaysSmartShopper(void) break; case 1: TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name); + StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[0])); sub_80BF088(2, smartShopper->itemAmounts[0]); sTVShowState += (Random() % 4) + 1; break; @@ -3070,7 +3070,7 @@ void DoTVShowTodaysSmartShopper(void) sTVShowState = 10; break; case 6: - StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[1])->name); + StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[1])); sub_80BF088(2, smartShopper->itemAmounts[1]); if (smartShopper->itemIds[2] != 0) sTVShowState = 7; @@ -3080,7 +3080,7 @@ void DoTVShowTodaysSmartShopper(void) sTVShowState = 9; break; case 7: - StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[2])->name); + StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[2])); sub_80BF088(2, smartShopper->itemAmounts[2]); if (smartShopper->priceReduced == 1) sTVShowState = 8; @@ -3105,7 +3105,7 @@ void DoTVShowTodaysSmartShopper(void) break; case 11: TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name); + StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[0])); if (smartShopper->priceReduced == 1) sTVShowState = 8; else @@ -3237,7 +3237,7 @@ void DoTVShowPokemonTodaySuccessfulCapture(void) sTVShowState = 2; break; case 2: - StringCopy(gStringVar2, ItemId_GetItem(pokemonToday->ball)->name); + StringCopy(gStringVar2, ItemId_GetName(pokemonToday->ball)); sub_80BF088(2, pokemonToday->var12); if (pokemonToday->var12 < 4) sTVShowState = 3; diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c index 19fddc0f7..2f9f79a54 100644 --- a/src/pokemon/pokemon_storage_system_4.c +++ b/src/pokemon/pokemon_storage_system_4.c @@ -2101,7 +2101,7 @@ void sub_809C04C(void *pokemon, u8 a1) buf[1] = 0x06; // size buf[2] = 0x04; buf = gPokemonStorageSystemPtr->unk_127a + 8; - buf = StringCopy(buf, ItemId_GetItem(gPokemonStorageSystemPtr->unk_11f2)->name); + buf = StringCopy(buf, ItemId_GetName(gPokemonStorageSystemPtr->unk_11f2)); buf[0] = EXT_CTRL_CODE_BEGIN; buf[1] = 0x07; // UNKNOWN_7; buf += 2; diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 9c621780a..6ff912a20 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -3930,7 +3930,7 @@ static void PrintHeldItemName(u16 itemId, u8 left, u8 top) && IsLinkDoubleBattle() == TRUE && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5)) { - StringCopy(gStringVar1, ItemId_GetItem(itemId)->name); + StringCopy(gStringVar1, ItemId_GetName(itemId)); } else if (itemId == 0) { diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index 6eccca047..ef9dd5ab7 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -201,7 +201,6 @@ u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate); void MenuCursor_SetPos814A880(u8 a1, u8 a2); u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); s8 GetFirstFreePokeblockSlot(void); -bool8 sub_810CA34(struct Pokeblock *pokeblock); #ifdef GERMAN extern void de_sub_8073110(); #endif -- cgit v1.2.3 From a7591f1ab902e69e2c985a32a5be675d413d2c8a Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 15 Feb 2018 17:20:54 -0600 Subject: decompile the rest of the debug code in battle_2.c --- src/battle/battle_2.c | 1049 ++++++++++++++++++------------------------------- src/field/item.c | 1 + 2 files changed, 387 insertions(+), 663 deletions(-) (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index d28ef6713..2bbae20dc 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -1359,7 +1359,6 @@ void c2_081284E0(void) } } -// A LOT of debug code! #if DEBUG extern u8 gUnknown_Debug_2023B62[]; @@ -1390,7 +1389,6 @@ u32 debug_sub_8013294(u8, void *, u32); void debug_sub_80132C8(u8, void *, u32); extern s16 gUnknown_Debug_2023A76[][0x23]; -extern s16 gUnknown_Debug_2023A76_[][7][5]; extern s16 gUnknown_Debug_2023B02[][6][4]; extern u8 gUnknown_Debug_03004360; extern struct Window gUnknown_Debug_03004370; @@ -1502,31 +1500,6 @@ void debug_sub_8010A7C(u8 a, u8 b) gBattleTextBuff1[i] = EOS; } -// gUnknown_Debug_2023A76_ seems like a 3D array, but this function refuses to match when I do that. -#ifdef NONMATCHING -void debug_sub_8010AAC(u8 a) -{ - switch (gBaseStats[gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][0]].genderRatio) - { - case 0: - gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 2; - break; - case 0xFE: - gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 3; - break; - case 0xFF: - gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 4; - break; - default: - gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] &= 1; - if (a != 0) - gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] ^= 1; - else - gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 0; - break; - } -} -#else void debug_sub_8010AAC(u8 a) { switch (gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5]].genderRatio) @@ -1549,12 +1522,12 @@ void debug_sub_8010AAC(u8 a) break; } } -#endif +// gUnknown_Debug_2023A76 2D array void debug_sub_8010B80(u8 a) { s8 r12 = 0; - s8 r7 = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0]; + s8 r7 = gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]; while (r7 >= 10) { @@ -1584,11 +1557,319 @@ void debug_sub_8010B80(u8 a) if (r7 > 9) r7 = 1; } - gUnknown_Debug_2023A76_[gUnknown_Debug_03004360 ^ 1][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0] - = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0] + gUnknown_Debug_2023A76[gUnknown_Debug_03004360 ^ 1][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] + = gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] = r12 * 10 + r7; } +// For some unexplainable reason, code in various functions will cause SetActionsAndBanksTurnOrder, +// a completely separate and unrelated function, to use different registers. I have +// absolutely no clue as to why this phenomenon occurs. For example, +// I have to make debug_sub_8010CAC access gUnknown_Debug_2023A76 as a 3D array. +// If I use a 2D array, SetActionsAndBanksTurnOrder will no longer match. +#ifdef NONMATCHING +void debug_sub_8010CAC(void) +{ + s32 r5; + + if (gMain.heldKeysRaw == (L_BUTTON | SELECT_BUTTON)) + DoSoftReset(); + if (gMain.newKeysRaw == SELECT_BUTTON) + { + if (gUnknown_Debug_030043A4 < 6) + { + gUnknown_Debug_030043A8 = 0; + debug_sub_8012628(); + SetMainCallback2(debug_sub_8011498); + } + if (gUnknown_Debug_030043A0 == 0 && gUnknown_Debug_030043A4 == 6) + { + gMain.savedCallback = debug_sub_80108B8; + CreateMon( + &gPlayerParty[0], + gUnknown_Debug_2023A76[0][0 * 5 + 0], + gUnknown_Debug_2023A76[0][0 * 5 + 1], + 32, + 0, 0, 0, 0); + for (r5 = 0; r5 < 4; r5++) + { + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1 + r5, &gUnknown_Debug_2023B02[0][0][r5]); + SetMonData(&gPlayerParty[0], MON_DATA_PP1 + r5, &gBattleMoves[gUnknown_Debug_2023B02[0][0][r5]].pp); + } + switch (gUnknown_Debug_2023A76[0][6 * 5 + 0]) + { + case 1: + gCB2_AfterEvolution = debug_sub_80108B8; + EvolutionScene(&gPlayerParty[0], gUnknown_Debug_2023A76[0][1 * 5 + 0], 1, 0); + break; + case 2: + debug_sub_8012688(); + break; + } + } + if (gUnknown_Debug_030043A0 == 1 && gUnknown_Debug_030043A4 == 6) + { + // This is really weird + r5 = (gSaveBlock2.optionsBattleSceneOff | (gSaveBlock2.optionsSound << 1)); + r5++; + if (r5 == 4) + r5 = 0; + gSaveBlock2.optionsBattleSceneOff = (r5 & 1); + gSaveBlock2.optionsSound = (r5 & 2) >> 1; + SetPokemonCryStereo(gSaveBlock2.optionsSound); + debug_nullsub_3(); + } + } + if (gMain.newKeysRaw == START_BUTTON) + debug_sub_801174C(); + if (gMain.newKeysRaw == DPAD_UP) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A4 != 0) + gUnknown_Debug_030043A4--; + else + gUnknown_Debug_030043A4 = 6; + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + debug_sub_80125A0(); + } + if (gMain.newKeysRaw == DPAD_DOWN) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A4 == 6) + gUnknown_Debug_030043A4 = 0; + else + gUnknown_Debug_030043A4++; + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + debug_sub_80125A0(); + } + if (gMain.newKeysRaw == DPAD_LEFT) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A0 != 0) + { + gUnknown_Debug_030043A0--; + } + else + { + if (gUnknown_Debug_03004360 != 0) + { + gUnknown_Debug_03004360 = 0; + gUnknown_Debug_030043A0 = 4; + gBattle_BG1_X = 0; + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + } + debug_sub_80125A0(); + } + if (gMain.newKeysRaw == DPAD_RIGHT) + { + debug_sub_80125E4(); + if (gUnknown_Debug_030043A0 != 4) + { + gUnknown_Debug_030043A0++; + } + else + { + if (gUnknown_Debug_03004360 == 0) + { + gUnknown_Debug_03004360 = 1; + gUnknown_Debug_030043A0 = 0; + gBattle_BG1_X = 0x100; + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + } + debug_sub_80125A0(); + } + if (gMain.newAndRepeatedKeys & B_BUTTON) + { + switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) + { + case 31: + debug_sub_8010818(); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 32: + debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 33: + debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC); + break; + case 34: + if (gUnknown_Debug_2023A76[0][6 * 5 + 4] != 0) + { + gUnknown_Debug_2023A76[0][6 * 5 + 4]--; + gUnknown_Debug_2023A76[1][6 * 5 + 4]--; + } + else + { + gUnknown_Debug_2023A76[0][6 * 5 + 4] = 8; + gUnknown_Debug_2023A76[1][6 * 5 + 4] = 8; + } + debug_sub_8012540(); + break; + case 30: + debug_sub_8010B80(0); + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + break; + default: + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]--; + if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + } + } + if (gMain.newAndRepeatedKeys & A_BUTTON) + { + switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5) + { + case 31: + debug_sub_8010818(); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 32: + debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC); + debug_sub_8011E5C(); + debug_sub_8011E74(); + debug_sub_8012540(); + debug_nullsub_3(); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + case 33: + debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC); + break; + case 34: + if (gUnknown_Debug_2023A76[0][6 * 5 + 4] < 8) + { + gUnknown_Debug_2023A76[0][6 * 5 + 4]++; + gUnknown_Debug_2023A76[1][6 * 5 + 4]++; + } + else + { + gUnknown_Debug_2023A76[0][6 * 5 + 4] = 0; + gUnknown_Debug_2023A76[1][6 * 5 + 4] = 0; + } + debug_sub_8012540(); + break; + case 30: + debug_sub_8010B80(1); + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + break; + default: + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]++; + if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]; + } + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + break; + } + } + if (gMain.newAndRepeatedKeys & L_BUTTON) + { + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + else + { + if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) + { + debug_sub_8010B80(2); + } + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= 10; + while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + } + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + if (gMain.newAndRepeatedKeys & R_BUTTON) + { + if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6) + { + debug_sub_8010AAC(1); + } + else + { + if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30) + { + debug_sub_8010B80(3); + } + else + { + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += 10; + while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]) + gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3]; + } + } + if (gUnknown_Debug_030043A0 == 0) + { + debug_sub_8010AAC(0); + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4); + } + debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0); + debug_sub_80123D8(gUnknown_Debug_030043A4 * 5); + } + AnimateSprites(); + BuildOamBuffer(); +} +#else + +// 3D array +extern s16 gUnknown_Debug_2023A76_[][7][5]; + void debug_sub_8010CAC(void) { s32 r5; @@ -1886,6 +2167,7 @@ void debug_sub_8010CAC(void) AnimateSprites(); BuildOamBuffer(); } +#endif extern u16 gUnknown_Debug_821F564[][5]; @@ -2424,304 +2706,91 @@ void debug_sub_8012294(void) } } -__attribute__((naked)) +extern const u16 gUnknown_Debug_821F58C[]; + void debug_sub_80123D8(u8 a) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " cmp r5, #0x1d\n" - " bhi ._856 @cond_branch\n" - " mov r0, #0x0\n" - " mov r1, #0x12\n" - " bl debug_sub_8010A7C\n" - " ldr r4, ._858 @ gUnknown_Debug_03004370\n" - " ldr r0, ._858 + 4 @ gBattleTextBuff1\n" - " mov r8, r0\n" - " ldr r6, ._858 + 8 @ gUnknown_Debug_821F58C\n" - " ldrh r1, [r6]\n" - " mov sl, r1\n" - " ldrb r7, [r6, #0x2]\n" - " ldrb r2, [r6, #0x4]\n" - " mov r9, r2\n" - " str r2, [sp]\n" - " add r0, r4, #0\n" - " mov r1, r8\n" - " mov r2, sl\n" - " add r3, r7, #0\n" - " bl Text_InitWindow\n" - " add r0, r4, #0\n" - " bl Text_PrintWindow8002F44\n" - " lsl r5, r5, #0x1\n" - " ldr r1, ._858 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r1]\n" - " mov r2, #0x46\n" - " mul r0, r0, r2\n" - " add r0, r5, r0\n" - " ldr r1, ._858 + 16 @ gUnknown_Debug_2023A76\n" - " add r0, r0, r1\n" - " mov r2, #0x0\n" - " ldsh r1, [r0, r2]\n" - " lsl r0, r1, #0x3\n" - " sub r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._858 + 20 @ gBaseStats\n" - " add r0, r0, r1\n" - " ldrb r0, [r0, #0x16]\n" - " mov r2, #0xd\n" - " add r1, r0, #0\n" - " mul r1, r1, r2\n" - " ldr r0, ._858 + 24 @ gAbilityNames\n" - " add r1, r1, r0\n" - " mov r0, r8\n" - " bl StringCopy\n" - " mov r1, r9\n" - " str r1, [sp]\n" - " add r0, r4, #0\n" - " mov r1, r8\n" - " mov r2, sl\n" - " add r3, r7, #0\n" - " bl Text_InitWindow\n" - " add r0, r4, #0\n" - " bl Text_PrintWindow8002F44\n" - " mov r0, #0x0\n" - " mov r1, #0x12\n" - " bl debug_sub_8010A7C\n" - " ldrh r2, [r6, #0x6]\n" - " mov r9, r2\n" - " ldrb r0, [r6, #0x8]\n" - " mov sl, r0\n" - " ldrb r6, [r6, #0xa]\n" - " str r6, [sp]\n" - " add r0, r4, #0\n" - " mov r1, r8\n" - " mov r3, sl\n" - " bl Text_InitWindow\n" - " add r0, r4, #0\n" - " bl Text_PrintWindow8002F44\n" - " ldr r1, ._858 + 12 @ gUnknown_Debug_03004360\n" - " ldrb r0, [r1]\n" - " mov r2, #0x46\n" - " mul r0, r0, r2\n" - " add r5, r5, r0\n" - " ldr r0, ._858 + 16 @ gUnknown_Debug_2023A76\n" - " add r5, r5, r0\n" - " mov r2, #0x0\n" - " ldsh r1, [r5, r2]\n" - " lsl r0, r1, #0x3\n" - " sub r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._858 + 20 @ gBaseStats\n" - " add r0, r0, r1\n" - " ldrb r0, [r0, #0x17]\n" - " mov r2, #0xd\n" - " add r1, r0, #0\n" - " mul r1, r1, r2\n" - " ldr r0, ._858 + 24 @ gAbilityNames\n" - " add r1, r1, r0\n" - " mov r0, r8\n" - " bl StringCopy\n" - " str r6, [sp]\n" - " add r0, r4, #0\n" - " mov r1, r8\n" - " mov r2, r9\n" - " mov r3, sl\n" - " bl Text_InitWindow\n" - " add r0, r4, #0\n" - " bl Text_PrintWindow8002F44\n" - " b ._857\n" - "._859:\n" - " .align 2, 0\n" - "._858:\n" - " .word gUnknown_Debug_03004370\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_821F58C\n" - " .word gUnknown_Debug_03004360\n" - " .word gUnknown_Debug_2023A76\n" - " .word gBaseStats\n" - " .word gAbilityNames\n" - "._856:\n" - " ldr r6, ._860 @ gBattleTextBuff1\n" - " ldr r1, ._860 + 4 @ gAbilityNames\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " ldr r5, ._860 + 8 @ gUnknown_Debug_03004370\n" - " ldr r4, ._860 + 12 @ gUnknown_Debug_821F58C\n" - " ldrh r2, [r4]\n" - " ldrb r3, [r4, #0x2]\n" - " ldrb r0, [r4, #0x4]\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " add r1, r6, #0\n" - " bl Text_InitWindow\n" - " add r0, r5, #0\n" - " bl Text_PrintWindow8002F44\n" - " ldrh r2, [r4, #0x6]\n" - " ldrb r3, [r4, #0x8]\n" - " ldrb r0, [r4, #0xa]\n" - " str r0, [sp]\n" - " add r0, r5, #0\n" - " add r1, r6, #0\n" - " bl Text_InitWindow\n" - " add r0, r5, #0\n" - " bl Text_PrintWindow8002F44\n" - "._857:\n" - " add sp, sp, #0x4\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._861:\n" - " .align 2, 0\n" - "._860:\n" - " .word gBattleTextBuff1\n" - " .word gAbilityNames\n" - " .word gUnknown_Debug_03004370\n" - " .word gUnknown_Debug_821F58C\n" - "\n" - ); + if (a < 30) + { + debug_sub_8010A7C(0, 18); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F58C[0], + gUnknown_Debug_821F58C[1], + gUnknown_Debug_821F58C[2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + StringCopy(gBattleTextBuff1, gAbilityNames[gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]].ability1]); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F58C[0], + gUnknown_Debug_821F58C[1], + gUnknown_Debug_821F58C[2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + debug_sub_8010A7C(0, 18); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F58C[3], + gUnknown_Debug_821F58C[4], + gUnknown_Debug_821F58C[5]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + StringCopy(gBattleTextBuff1, gAbilityNames[gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]].ability2]); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F58C[3], + gUnknown_Debug_821F58C[4], + gUnknown_Debug_821F58C[5]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + } + else + { + StringCopy(gBattleTextBuff1, gAbilityNames[0]); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F58C[0], + gUnknown_Debug_821F58C[1], + gUnknown_Debug_821F58C[2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F58C[3], + gUnknown_Debug_821F58C[4], + gUnknown_Debug_821F58C[5]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); + } } -__attribute__((naked)) -void debug_sub_8012540() -{ - asm( - " push {r4, r5, r6, lr}\n" - " add sp, sp, #0xfffffffc\n" - " ldr r5, ._862 @ gBattleTextBuff1\n" - " ldr r0, ._862 + 4 @ gUnknown_Debug_2023A76\n" - " add r0, r0, #0x44\n" - " mov r2, #0x0\n" - " ldsh r1, [r0, r2]\n" - " add r0, r5, #0\n" - " mov r2, #0x0\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " ldr r4, ._862 + 8 @ gUnknown_Debug_03004370\n" - " ldr r1, ._862 + 12 @ gUnknown_Debug_821F424\n" - " mov r3, #0x9b\n" - " lsl r3, r3, #0x1\n" - " add r0, r1, r3\n" - " ldrh r2, [r0]\n" - " mov r6, #0x9c\n" - " lsl r6, r6, #0x1\n" - " add r0, r1, r6\n" - " ldrb r3, [r0]\n" - " add r6, r6, #0x2\n" - " add r0, r1, r6\n" - " ldrb r0, [r0]\n" - " str r0, [sp]\n" - " add r0, r4, #0\n" - " add r1, r5, #0\n" - " bl Text_InitWindow\n" - " add r0, r4, #0\n" - " bl Text_PrintWindow8002F44\n" - " add sp, sp, #0x4\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._863:\n" - " .align 2, 0\n" - "._862:\n" - " .word gBattleTextBuff1\n" - " .word gUnknown_Debug_2023A76\n" - " .word gUnknown_Debug_03004370\n" - " .word gUnknown_Debug_821F424\n" - "\n" - ); +void debug_sub_8012540(void) +{ + ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[0][0x22], 0, 1); + Text_InitWindow( + &gUnknown_Debug_03004370, + gBattleTextBuff1, + gUnknown_Debug_821F424[31][0], + gUnknown_Debug_821F424[31][1], + gUnknown_Debug_821F424[31][2]); + Text_PrintWindow8002F44(&gUnknown_Debug_03004370); } void debug_nullsub_3(void) { } -__attribute__((naked)) -void debug_sub_80125A0() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._864 @ gSharedMem\n" - " ldr r3, ._864 + 4 @ gUnknown_Debug_821F680\n" - " ldr r2, ._864 + 8 @ gUnknown_Debug_030043A0\n" - " ldr r0, ._864 + 12 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._864 + 16 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r1]\n" - " mov r1, #0x8c\n" - " mul r1, r1, r2\n" - " add r0, r0, r1\n" - " add r0, r0, r3\n" - " ldr r0, [r0]\n" - " add r0, r0, r4\n" - " mov r1, #0x6d\n" - " strb r1, [r0]\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._865:\n" - " .align 2, 0\n" - "._864:\n" - " .word gSharedMem\n" - " .word gUnknown_Debug_821F680\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_03004360\n" - "\n" - ); +extern const u32 gUnknown_Debug_821F680[][0x23]; + +void debug_sub_80125A0(void) +{ + gSharedMem[gUnknown_Debug_821F680[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]] = 0x6D; } -__attribute__((naked)) -void debug_sub_80125E4() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._866 @ gSharedMem\n" - " ldr r3, ._866 + 4 @ gUnknown_Debug_821F680\n" - " ldr r2, ._866 + 8 @ gUnknown_Debug_030043A0\n" - " ldr r0, ._866 + 12 @ gUnknown_Debug_030043A4\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x2\n" - " add r0, r0, r1\n" - " ldrb r2, [r2]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._866 + 16 @ gUnknown_Debug_03004360\n" - " ldrb r2, [r1]\n" - " mov r1, #0x8c\n" - " mul r1, r1, r2\n" - " add r0, r0, r1\n" - " add r0, r0, r3\n" - " ldr r0, [r0]\n" - " add r0, r0, r4\n" - " mov r1, #0x81\n" - " strb r1, [r0]\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._867:\n" - " .align 2, 0\n" - "._866:\n" - " .word gSharedMem\n" - " .word gUnknown_Debug_821F680\n" - " .word gUnknown_Debug_030043A0\n" - " .word gUnknown_Debug_030043A4\n" - " .word gUnknown_Debug_03004360\n" - "\n" - ); +void debug_sub_80125E4(void) +{ + gSharedMem[gUnknown_Debug_821F680[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]] = 0x81; } void debug_sub_8012628(void) @@ -6043,351 +6112,6 @@ u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreMovePriorities) return strikesFirst; } -// The debug version should be identical, but has a strange register swap, and -// seems to be affected by other functions, which is bizarre. -#if DEBUG -__attribute__((naked)) -void SetActionsAndBanksTurnOrder(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - mov r3, #0x0\n\ - ldr r0, ._L1550\n\ - ldrh r1, [r0]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._L1499 @cond_branch\n\ - ldr r0, ._L1550+0x4\n\ - strb r3, [r0]\n\ - ldr r4, ._L1550+0x8\n\ - mov r8, r0\n\ - ldrb r0, [r4]\n\ - cmp r3, r0\n\ - bcc ._LCB12758\n\ - b ._L1505 @long jump\n\ -._LCB12758:\n\ - ldr r7, ._L1550+0xc\n\ - ldr r6, ._L1550+0x10\n\ - mov r2, r8\n\ - ldr r5, ._L1550+0x14\n\ -._L1503:\n\ - add r1, r3, r7\n\ - ldrb r0, [r2]\n\ - add r0, r0, r6\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - add r1, r3, r5\n\ - ldrb r0, [r2]\n\ - strb r0, [r1]\n\ - add r3, r3, #0x1\n\ - ldrb r0, [r2]\n\ - add r0, r0, #0x1\n\ - strb r0, [r2]\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldrb r1, [r4]\n\ - cmp r0, r1\n\ - bcc ._L1503 @cond_branch\n\ - b ._L1505\n\ -._L1551:\n\ - .align 2, 0\n\ -._L1550:\n\ - .word gBattleTypeFlags\n\ - .word gActiveBank\n\ - .word gNoOfAllBanks\n\ - .word gActionsByTurnOrder\n\ - .word gActionForBanks\n\ - .word gBanksByTurnOrder\n\ -._L1499:\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._L1506 @cond_branch\n\ - ldr r0, ._L1552\n\ - strb r3, [r0]\n\ - ldr r1, ._L1552+0x4\n\ - mov r8, r0\n\ - add r2, r1, #0\n\ - ldrb r2, [r2]\n\ - cmp r3, r2\n\ - bcs ._L1513 @cond_branch\n\ - ldr r0, ._L1552+0x8\n\ - ldrb r1, [r0]\n\ - add r4, r0, #0\n\ - cmp r1, #0x3\n\ - beq ._L1548 @cond_branch\n\ -._L1509:\n\ - mov r7, r8\n\ - ldrb r0, [r7]\n\ - add r0, r0, #0x1\n\ - strb r0, [r7]\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r1, ._L1552+0x4\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcs ._L1513 @cond_branch\n\ - ldrb r0, [r7]\n\ - add r0, r0, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x3\n\ - bne ._L1509 @cond_branch\n\ - b ._L1548\n\ -._L1553:\n\ - .align 2, 0\n\ -._L1552:\n\ - .word gActiveBank\n\ - .word gNoOfAllBanks\n\ - .word gActionForBanks\n\ -._L1506:\n\ - ldr r0, ._L1554\n\ - ldrb r0, [r0]\n\ - ldr r2, ._L1554+0x4\n\ - mov r8, r2\n\ - cmp r0, #0x3\n\ - bne ._L1513 @cond_branch\n\ - strb r3, [r2]\n\ -._L1548:\n\ - mov r3, #0x5\n\ -._L1513:\n\ - cmp r3, #0x5\n\ - bne ._L1515 @cond_branch\n\ - ldr r6, ._L1554+0x8\n\ - ldr r1, ._L1554\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - strb r0, [r6]\n\ - ldr r2, ._L1554+0xc\n\ - ldrb r0, [r3]\n\ - strb r0, [r2]\n\ - mov r3, #0x1\n\ - mov r5, #0x0\n\ - add r4, r1, #0\n\ - ldr r7, ._L1554+0x10\n\ - mov r9, r7\n\ - ldr r0, ._L1554+0x14\n\ - mov ip, r0\n\ - ldr r1, ._L1554+0x18\n\ - mov sl, r1\n\ - ldr r7, ._L1554+0x1c\n\ - ldrb r7, [r7]\n\ - cmp r5, r7\n\ - bge ._L1517 @cond_branch\n\ - add r7, r6, #0\n\ - add r6, r4, #0\n\ - add r4, r2, #0\n\ - ldr r2, ._L1554+0x1c\n\ -._L1519:\n\ - mov r0, r8\n\ - ldrb r0, [r0]\n\ - cmp r5, r0\n\ - beq ._L1518 @cond_branch\n\ - add r1, r3, r7\n\ - add r0, r5, r6\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - add r0, r3, r4\n\ - strb r5, [r0]\n\ - add r3, r3, #0x1\n\ -._L1518:\n\ - add r5, r5, #0x1\n\ - ldrb r1, [r2]\n\ - cmp r5, r1\n\ - blt ._L1519 @cond_branch\n\ -._L1517:\n\ - mov r2, ip\n\ - mov r3, r9\n\ - str r2, [r3]\n\ - ldr r1, ._L1554+0x20\n\ - add r1, r1, sl\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ - b ._L1498\n\ -._L1555:\n\ - .align 2, 0\n\ -._L1554:\n\ - .word gActionForBanks\n\ - .word gActiveBank\n\ - .word gActionsByTurnOrder\n\ - .word gBanksByTurnOrder\n\ - .word gBattleMainFunc\n\ - .word CheckFocusPunch_ClearVarsBeforeTurnStarts\n\ - .word gSharedMem\n\ - .word gNoOfAllBanks\n\ - .word 0x1601d\n\ -._L1515:\n\ - mov r0, #0x0\n\ - mov r7, r8\n\ - strb r0, [r7]\n\ - ldr r1, ._L1556\n\ - ldrb r0, [r1]\n\ - cmp r0, #0\n\ - beq ._L1524 @cond_branch\n\ - ldr r6, ._L1556+0x4\n\ - mov r2, r8\n\ - ldr r5, ._L1556+0x8\n\ - ldr r4, ._L1556+0xc\n\ -._L1526:\n\ - ldrb r0, [r2]\n\ - add r0, r0, r6\n\ - ldrb r1, [r0]\n\ - sub r0, r1, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bhi ._L1525 @cond_branch\n\ - add r0, r3, r5\n\ - strb r1, [r0]\n\ - add r1, r3, r4\n\ - mov r7, r8\n\ - ldrb r0, [r7]\n\ - strb r0, [r1]\n\ - add r3, r3, #0x1\n\ -._L1525:\n\ - ldrb r0, [r2]\n\ - add r0, r0, #0x1\n\ - strb r0, [r2]\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r1, ._L1556\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc ._L1526 @cond_branch\n\ -._L1524:\n\ - mov r0, #0x0\n\ - mov r2, r8\n\ - strb r0, [r2]\n\ - ldr r7, ._L1556\n\ - ldrb r0, [r7]\n\ - cmp r0, #0\n\ - beq ._L1530 @cond_branch\n\ - ldr r6, ._L1556+0x4\n\ - ldr r5, ._L1556+0x8\n\ - ldr r4, ._L1556+0xc\n\ -._L1532:\n\ - ldrb r0, [r2]\n\ - add r0, r0, r6\n\ - ldrb r1, [r0]\n\ - sub r0, r1, #0x1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bls ._L1531 @cond_branch\n\ - add r0, r3, r5\n\ - strb r1, [r0]\n\ - add r1, r3, r4\n\ - mov r7, r8\n\ - ldrb r0, [r7]\n\ - strb r0, [r1]\n\ - add r3, r3, #0x1\n\ -._L1531:\n\ - ldrb r0, [r2]\n\ - add r0, r0, #0x1\n\ - strb r0, [r2]\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r1, ._L1556\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc ._L1532 @cond_branch\n\ -._L1530:\n\ - mov r5, #0x0\n\ - b ._L1549\n\ -._L1557:\n\ - .align 2, 0\n\ -._L1556:\n\ - .word gNoOfAllBanks\n\ - .word gActionForBanks\n\ - .word gActionsByTurnOrder\n\ - .word gBanksByTurnOrder\n\ -._L1538:\n\ - add r4, r5, #0x1\n\ - add r7, r4, #0\n\ - ldrb r1, [r1]\n\ - cmp r7, r1\n\ - bge ._L1537 @cond_branch\n\ - ldr r6, ._L1558\n\ - lsl r2, r5, #0x18\n\ - mov r8, r2\n\ -._L1542:\n\ - ldr r0, ._L1558+0x4\n\ - add r1, r5, r0\n\ - ldrb r3, [r1]\n\ - add r0, r4, r0\n\ - ldrb r1, [r0]\n\ - add r0, r5, r6\n\ - ldrb r2, [r0]\n\ - cmp r2, #0x1\n\ - beq ._L1541 @cond_branch\n\ - add r0, r4, r6\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - beq ._L1541 @cond_branch\n\ - cmp r2, #0x2\n\ - beq ._L1541 @cond_branch\n\ - cmp r0, #0x2\n\ - beq ._L1541 @cond_branch\n\ - add r0, r3, #0\n\ - mov r2, #0x0\n\ - bl GetWhoStrikesFirst\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._L1541 @cond_branch\n\ - lsl r1, r4, #0x18\n\ - lsr r1, r1, #0x18\n\ - mov r3, r8\n\ - lsr r0, r3, #0x18\n\ - bl SwapTurnOrder\n\ -._L1541:\n\ - add r4, r4, #0x1\n\ - ldr r0, ._L1558+0x8\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt ._L1542 @cond_branch\n\ -._L1537:\n\ - add r5, r7, #0\n\ -._L1549:\n\ - ldr r1, ._L1558+0x8\n\ - ldrb r0, [r1]\n\ - sub r0, r0, #0x1\n\ - cmp r5, r0\n\ - blt ._L1538 @cond_branch\n\ -._L1505:\n\ - ldr r1, ._L1558+0xc\n\ - ldr r0, ._L1558+0x10\n\ - str r0, [r1]\n\ - ldr r0, ._L1558+0x14\n\ - ldr r7, ._L1558+0x18\n\ - add r0, r0, r7\n\ - mov r1, #0x0\n\ - strb r1, [r0]\n\ -._L1498:\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._L1559:\n\ - .align 2, 0\n\ -._L1558:\n\ - .word gActionsByTurnOrder\n\ - .word gBanksByTurnOrder\n\ - .word gNoOfAllBanks\n\ - .word gBattleMainFunc\n\ - .word CheckFocusPunch_ClearVarsBeforeTurnStarts\n\ - .word gSharedMem\n\ - .word 0x1601d"); -} -#else void SetActionsAndBanksTurnOrder(void) { s32 var = 0; @@ -6484,7 +6208,6 @@ void SetActionsAndBanksTurnOrder(void) gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; eFocusPunchBank = 0; } -#endif static void TurnValuesCleanUp(bool8 var0) { diff --git a/src/field/item.c b/src/field/item.c index ba294a1ca..af05c0a21 100644 --- a/src/field/item.c +++ b/src/field/item.c @@ -660,6 +660,7 @@ u8 ItemId_GetImportance(u16 itemId) return gItems[SanitizeItemId(itemId)].importance; } +// unused u8 ItemId_GetUnknownValue(u16 itemId) { return gItems[SanitizeItemId(itemId)].unk19; -- cgit v1.2.3 From a785995c71cd56ed5e87e976cac7a91395f69230 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 15 Feb 2018 17:41:56 -0600 Subject: atk15_seteffectwithchance debug code --- src/battle/battle_4.c | 166 ++++---------------------------------------------- 1 file changed, 13 insertions(+), 153 deletions(-) (limited to 'src') diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 8b81139fb..f10cd2506 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -95,6 +95,7 @@ enum }; //extern needed variables +extern u8 gUnknown_02023A14_50; extern u8 gCritMultiplier; extern s32 gBattleMoveDamage; extern u32 gStatuses3[BATTLE_BANKS_COUNT]; @@ -5018,169 +5019,26 @@ _0801F610: .4byte BattleScript_SAtkDown2\n\ } #endif // NONMATCHING -#if DEBUG -__attribute__((naked)) -static void atk15_seteffectwithchance(void) -{ - asm("\ - push {r4, lr}\n\ - ldr r2, ._1037 @ gBattleMons\n\ - ldr r0, ._1037 + 4 @ gBankAttacker\n\ - ldrb r1, [r0]\n\ - mov r0, #0x58\n\ - mul r0, r0, r1\n\ - add r0, r0, r2\n\ - add r0, r0, #0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x20\n\ - bne ._1035 @cond_branch\n\ - ldr r2, ._1037 + 8 @ gBattleMoves\n\ - ldr r0, ._1037 + 12 @ gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r2\n\ - ldrb r0, [r0, #0x5]\n\ - lsl r4, r0, #0x1\n\ - b ._1036\n\ -._1038:\n\ - .align 2, 0\n\ -._1037:\n\ - .word gBattleMons\n\ - .word gBankAttacker\n\ - .word gBattleMoves\n\ - .word gCurrentMove\n\ -._1035:\n\ - ldr r2, ._1045 @ gBattleMoves\n\ - ldr r0, ._1045 + 4 @ gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r2\n\ - ldrb r4, [r0, #0x5]\n\ -._1036:\n\ - ldr r0, ._1045 + 8 @ gUnknown_02023A14_50\n\ - ldrb r1, [r0]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - ldr r2, ._1045 + 12 @ gBattleCommunication\n\ - cmp r0, #0\n\ - beq ._1039 @cond_branch\n\ - ldrb r1, [r2, #0x3]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1040 @cond_branch\n\ - ldr r0, ._1045 + 16 @ gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1050 @cond_branch\n\ -._1039:\n\ - ldrb r1, [r2, #0x3]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._1043 @cond_branch\n\ -._1040:\n\ - ldr r0, ._1045 + 16 @ gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1043 @cond_branch\n\ - ldr r2, ._1045 + 12 @ gBattleCommunication\n\ - ldrb r1, [r2, #0x3]\n\ - mov r0, #0x7f\n\ - and r0, r0, r1\n\ - strb r0, [r2, #0x3]\n\ - b ._1044\n\ -._1046:\n\ - .align 2, 0\n\ -._1045:\n\ - .word gBattleMoves\n\ - .word gCurrentMove\n\ - .word gUnknown_02023A14_50\n\ - .word gBattleCommunication\n\ - .word gBattleMoveFlags\n\ -._1043:\n\ - bl Random\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - mov r1, #0x64\n\ - bl __umodsi3\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - cmp r0, r4\n\ - bhi ._1049 @cond_branch\n\ - ldr r0, ._1052 @ gBattleCommunication\n\ - ldrb r0, [r0, #0x3]\n\ - cmp r0, #0\n\ - beq ._1049 @cond_branch\n\ - ldr r0, ._1052 + 4 @ gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - mov r0, #0x29\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._1049 @cond_branch\n\ - cmp r4, #0x63\n\ - bls ._1050 @cond_branch\n\ -._1044:\n\ - mov r0, #0x0\n\ - mov r1, #0x80\n\ - bl SetMoveEffect\n\ - b ._1054\n\ -._1053:\n\ - .align 2, 0\n\ -._1052:\n\ - .word gBattleCommunication\n\ - .word gBattleMoveFlags\n\ -._1050:\n\ - mov r0, #0x0\n\ - mov r1, #0x0\n\ - bl SetMoveEffect\n\ - b ._1054\n\ -._1049:\n\ - ldr r1, ._1055 @ gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - add r0, r0, #0x1\n\ - str r0, [r1]\n\ -._1054:\n\ - ldr r0, ._1055 + 4 @ gBattleCommunication\n\ - mov r1, #0x0\n\ - strb r1, [r0, #0x3]\n\ - ldr r0, ._1055 + 8 @ \n\ - ldr r2, ._1055 + 12 @ \n\ - add r0, r0, r2\n\ - strb r1, [r0]\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._1056:\n\ - .align 2, 0\n\ -._1055:\n\ - .word gBattlescriptCurrInstr\n\ - .word gBattleCommunication\n\ - .word +0x2000000\n\ - .word 0x16112"); -} -#else static void atk15_seteffectwithchance(void) { u32 PercentChance; + if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE) PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2; else PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; - if (gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + + if (DEBUG && (gUnknown_02023A14_50 & 4) + && !(gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + { + SetMoveEffect(0, 0); + } + else if ((gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) { gBattleCommunication[MOVE_EFFECT_BYTE] &= 0x7F; SetMoveEffect(0, 0x80); } - else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) + else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] != 0 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) { if (PercentChance >= 100) SetMoveEffect(0, 0x80); @@ -5188,11 +5046,13 @@ static void atk15_seteffectwithchance(void) SetMoveEffect(0, 0); } else + { gBattlescriptCurrInstr++; + } + gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleStruct->unk16112 = 0; } -#endif static void atk16_seteffectprimary(void) { -- cgit v1.2.3 From 85b1f82d2c0626f533a9e29234328b91ade55c2c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 15 Feb 2018 21:25:29 -0500 Subject: Match sub_813DA64 --- src/scene/intro.c | 202 ++++-------------------------------------------------- 1 file changed, 13 insertions(+), 189 deletions(-) (limited to 'src') diff --git a/src/scene/intro.c b/src/scene/intro.c index 3e4bd5bf4..5c0e7a67d 100644 --- a/src/scene/intro.c +++ b/src/scene/intro.c @@ -2002,7 +2002,6 @@ static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c) return spriteId; } -#ifdef NONMATCHING static void sub_813DA64(struct Sprite *sprite) { sprite->data[7]++; @@ -2022,14 +2021,13 @@ static void sub_813DA64(struct Sprite *sprite) break; case 1: { - s16 r3; - s16 sin1; - s16 r6; - s16 foo; - s16 r5; - s16 r2; + s16 sin; + s16 cos; + s16 a; + s16 b; + s16 c; + s16 d; - //_0813DAC0 if (sprite->data[3] < 0x50) { sprite->pos2.y = -Sin((u8)sprite->data[3], 0x78); @@ -2037,15 +2035,14 @@ static void sub_813DA64(struct Sprite *sprite) if (sprite->data[3] > 64) sprite->oam.priority = 3; } - //_0813DAF8 - r3 = gSineTable[(u8)sprite->data[2]]; - sin1 = gSineTable[(u8)(sprite->data[2] + 64)]; - r6 = sin1 * sprite->data[1] / 256; - foo = sin1 * sprite->data[1] / 256; - r5 = -r3 * sprite->data[1] / 256; - r2 = r3 * sprite->data[1] / 256; + sin = gSineTable[(u8)sprite->data[2]]; + cos = gSineTable[(u8)(sprite->data[2] + 64)]; + d = cos * sprite->data[1] / 256; + c = -sin * sprite->data[1] / 256; + b = sin * sprite->data[1] / 256; + a = cos * sprite->data[1] / 256; - SetOamMatrix(1, r6, r2, r5, foo); + SetOamMatrix(1, a, b, c, d); if (sprite->data[1] < 0x100) sprite->data[1] += 8; @@ -2060,180 +2057,7 @@ static void sub_813DA64(struct Sprite *sprite) break; } } - //_0813DB92 } -#else -__attribute__((naked)) -static void sub_813DA64(struct Sprite *sprite) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x4\n\ - adds r4, r0, 0\n\ - ldrh r0, [r4, 0x3C]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x3C]\n\ - movs r1, 0x2E\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0\n\ - beq _0813DA7C\n\ - cmp r0, 0x1\n\ - beq _0813DAC0\n\ -_0813DA7C:\n\ - ldrb r0, [r4, 0x1]\n\ - movs r1, 0x3\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x1]\n\ - ldrb r1, [r4, 0x3]\n\ - movs r0, 0x3F\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x3]\n\ - adds r0, r4, 0\n\ - movs r1, 0x1\n\ - movs r2, 0x3\n\ - movs r3, 0x3\n\ - bl CalcCenterToCornerVec\n\ - adds r2, r4, 0\n\ - adds r2, 0x3E\n\ - ldrb r1, [r2]\n\ - movs r0, 0x5\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ - movs r0, 0x1\n\ - strh r0, [r4, 0x2E]\n\ - movs r0, 0x80\n\ - strh r0, [r4, 0x30]\n\ - ldr r0, _0813DABC @ =0x0000ffe8\n\ - strh r0, [r4, 0x32]\n\ - movs r0, 0\n\ - b _0813DB92\n\ - .align 2, 0\n\ -_0813DABC: .4byte 0x0000ffe8\n\ -_0813DAC0:\n\ - ldrh r1, [r4, 0x34]\n\ - movs r2, 0x34\n\ - ldrsh r0, [r4, r2]\n\ - cmp r0, 0x4F\n\ - bgt _0813DAF8\n\ - lsls r0, r1, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x78\n\ - bl Sin\n\ - negs r0, r0\n\ - strh r0, [r4, 0x26]\n\ - ldrh r0, [r4, 0x34]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x8C\n\ - bl Sin\n\ - negs r0, r0\n\ - strh r0, [r4, 0x24]\n\ - movs r1, 0x34\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0x40\n\ - ble _0813DAF8\n\ - ldrb r0, [r4, 0x5]\n\ - movs r1, 0xC\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x5]\n\ -_0813DAF8:\n\ - ldr r2, _0813DB60 @ =gSineTable\n\ - ldrh r1, [r4, 0x32]\n\ - lsls r0, r1, 24\n\ - lsrs r0, 23\n\ - adds r0, r2\n\ - ldrh r3, [r0]\n\ - adds r1, 0x40\n\ - lsls r1, 24\n\ - lsrs r1, 23\n\ - adds r1, r2\n\ - movs r2, 0\n\ - ldrsh r0, [r1, r2]\n\ - movs r1, 0x30\n\ - ldrsh r2, [r4, r1]\n\ - adds r1, r0, 0\n\ - muls r1, r2\n\ - adds r0, r1, 0\n\ - cmp r1, 0\n\ - bge _0813DB20\n\ - adds r0, 0xFF\n\ -_0813DB20:\n\ - lsls r0, 8\n\ - lsrs r6, r0, 16\n\ - lsls r0, r3, 16\n\ - asrs r3, r0, 16\n\ - negs r0, r3\n\ - muls r0, r2\n\ - cmp r0, 0\n\ - bge _0813DB32\n\ - adds r0, 0xFF\n\ -_0813DB32:\n\ - lsls r0, 8\n\ - lsrs r5, r0, 16\n\ - adds r0, r3, 0\n\ - muls r0, r2\n\ - cmp r0, 0\n\ - bge _0813DB40\n\ - adds r0, 0xFF\n\ -_0813DB40:\n\ - lsls r0, 8\n\ - lsrs r2, r0, 16\n\ - adds r1, r6, 0\n\ - adds r3, r5, 0\n\ - str r1, [sp]\n\ - movs r0, 0x1\n\ - bl SetOamMatrix\n\ - ldrh r1, [r4, 0x30]\n\ - movs r2, 0x30\n\ - ldrsh r0, [r4, r2]\n\ - cmp r0, 0xFF\n\ - bgt _0813DB64\n\ - adds r0, r1, 0\n\ - adds r0, 0x8\n\ - b _0813DB68\n\ - .align 2, 0\n\ -_0813DB60: .4byte gSineTable\n\ -_0813DB64:\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ -_0813DB68:\n\ - strh r0, [r4, 0x30]\n\ - ldrh r1, [r4, 0x32]\n\ - movs r2, 0x32\n\ - ldrsh r0, [r4, r2]\n\ - cmp r0, 0x17\n\ - bgt _0813DB78\n\ - adds r0, r1, 0x1\n\ - strh r0, [r4, 0x32]\n\ -_0813DB78:\n\ - ldrh r2, [r4, 0x34]\n\ - movs r1, 0x34\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0x3F\n\ - bgt _0813DB86\n\ - adds r0, r2, 0x2\n\ - b _0813DB92\n\ -_0813DB86:\n\ - ldrh r1, [r4, 0x3C]\n\ - movs r0, 0x3\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0813DB94\n\ - adds r0, r2, 0x1\n\ -_0813DB92:\n\ - strh r0, [r4, 0x34]\n\ -_0813DB94:\n\ - add sp, 0x4\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif static void sub_813DB9C(struct Sprite *sprite) { -- cgit v1.2.3 From 900f5739be2ea39a9f37494948fb09d5bb3969b4 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 15 Feb 2018 21:27:31 -0600 Subject: decompile various debug functions --- src/battle/battle_controller_opponent.c | 550 ++++++++++----------- src/battle/battle_controller_player.c | 825 ++++++-------------------------- src/battle/battle_controller_safari.c | 6 +- src/battle/battle_records.c | 80 +--- src/field/region_map.c | 148 +++++- src/scene/cute_sketch.c | 344 ------------- 6 files changed, 587 insertions(+), 1366 deletions(-) (limited to 'src') diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index 8e8743dbc..e986eb38d 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -1217,19 +1217,19 @@ void OpponentHandleTrainerThrow(void) #if DEBUG if (gUnknown_02023A14_50 & 0x10) { - trainerPicIndex = gSharedMem[0x160A3]; + trainerPicIndex = gSharedMem[0x160A3]; } else #endif { - if (gTrainerBattleOpponent == 0x400) - trainerPicIndex = GetSecretBaseTrainerPicIndex(); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - trainerPicIndex = get_trainer_class_pic_index(); - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = GetEReaderTrainerPicIndex(); - else - trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; + if (gTrainerBattleOpponent == 0x400) + trainerPicIndex = GetSecretBaseTrainerPicIndex(); + else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + trainerPicIndex = get_trainer_class_pic_index(); + else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) + trainerPicIndex = GetEReaderTrainerPicIndex(); + else + trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; } sub_8031A6C(trainerPicIndex, gActiveBank); @@ -1442,308 +1442,308 @@ __attribute__((naked)) void OpponentHandlecmd20(void) { asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - ldr r6, ._549 @ gActiveBank\n\ - ldrb r0, [r6]\n\ - lsl r0, r0, #0x9\n\ - ldr r1, ._549 + 4 @ gBattleBufferA\n\ - add r5, r0, r1\n\ - ldr r2, ._549 + 8 @ gUnknown_02023A14_50\n\ - ldrb r1, [r2]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - mov sl, r6\n\ - cmp r0, #0\n\ - beq ._546 @cond_branch\n\ - ldr r0, ._549 + 12 @ gBattleMoves\n\ - mov r9, r0\n\ - ldr r1, ._549 + 16 @ \n\ - mov ip, r1\n\ - add r7, r6, #0\n\ - mov r0, #0x2\n\ - mov r8, r0\n\ - ldr r6, ._549 + 20 @ \n\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + ldr r6, ._549 @ gActiveBank\n\ + ldrb r0, [r6]\n\ + lsl r0, r0, #0x9\n\ + ldr r1, ._549 + 4 @ gBattleBufferA\n\ + add r5, r0, r1\n\ + ldr r2, ._549 + 8 @ gUnknown_02023A14_50\n\ + ldrb r1, [r2]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + mov sl, r6\n\ + cmp r0, #0\n\ + beq ._546 @cond_branch\n\ + ldr r0, ._549 + 12 @ gBattleMoves\n\ + mov r9, r0\n\ + ldr r1, ._549 + 16 @ \n\ + mov ip, r1\n\ + add r7, r6, #0\n\ + mov r0, #0x2\n\ + mov r8, r0\n\ + ldr r6, ._549 + 20 @ \n\ ._552:\n\ - ldrb r1, [r7]\n\ - mov r0, r8\n\ - and r0, r0, r1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x19\n\ - add r0, r0, r6\n\ - mov r1, ip\n\ - add r3, r0, r1\n\ - ldrb r1, [r3]\n\ - lsl r0, r1, #0x1\n\ - add r0, r5, r0\n\ - ldrh r2, [r0]\n\ - add r4, r1, #0\n\ - cmp r2, #0\n\ - beq ._547 @cond_branch\n\ - add r0, r4, #1\n\ - strb r0, [r3]\n\ - b ._548\n\ + ldrb r1, [r7]\n\ + mov r0, r8\n\ + and r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x19\n\ + add r0, r0, r6\n\ + mov r1, ip\n\ + add r3, r0, r1\n\ + ldrb r1, [r3]\n\ + lsl r0, r1, #0x1\n\ + add r0, r5, r0\n\ + ldrh r2, [r0]\n\ + add r4, r1, #0\n\ + cmp r2, #0\n\ + beq ._547 @cond_branch\n\ + add r0, r4, #1\n\ + strb r0, [r3]\n\ + b ._548\n\ ._550:\n\ - .align 2, 0\n\ + .align 2, 0\n\ ._549:\n\ - .word gActiveBank\n\ - .word gBattleBufferA+4\n\ - .word gUnknown_02023A14_50\n\ - .word gBattleMoves\n\ - .word +0x2000000\n\ - .word 0x1609e\n\ + .word gActiveBank\n\ + .word gBattleBufferA+4\n\ + .word gUnknown_02023A14_50\n\ + .word gBattleMoves\n\ + .word +0x2000000\n\ + .word 0x1609e\n\ ._547:\n\ - strb r2, [r3]\n\ + strb r2, [r3]\n\ ._548:\n\ - ldrb r0, [r7]\n\ - mov r1, r8\n\ - and r1, r1, r0\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x19\n\ - add r1, r1, r6\n\ - add r1, r1, ip\n\ - ldrb r0, [r1]\n\ - cmp r0, #0x3\n\ - bls ._551 @cond_branch\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ + ldrb r0, [r7]\n\ + mov r1, r8\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x19\n\ + add r1, r1, r6\n\ + add r1, r1, ip\n\ + ldrb r0, [r1]\n\ + cmp r0, #0x3\n\ + bls ._551 @cond_branch\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ ._551:\n\ - cmp r2, #0\n\ - beq ._552 @cond_branch\n\ - lsl r0, r2, #0x1\n\ - add r0, r0, r2\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r9\n\ - ldrb r3, [r0, #0x6]\n\ - mov r0, #0x12\n\ - and r0, r0, r3\n\ - cmp r0, #0\n\ - beq ._553 @cond_branch\n\ - mov r1, sl\n\ - ldrb r0, [r1]\n\ - b ._561\n\ + cmp r2, #0\n\ + beq ._552 @cond_branch\n\ + lsl r0, r2, #0x1\n\ + add r0, r0, r2\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r9\n\ + ldrb r3, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._553 @cond_branch\n\ + mov r1, sl\n\ + ldrb r0, [r1]\n\ + b ._561\n\ ._553:\n\ - ldr r0, ._559 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._557 @cond_branch\n\ - ldr r0, ._559 + 4 @ gUnknown_02023A14_50\n\ - ldrb r1, [r0]\n\ - mov r5, #0x2\n\ - add r0, r5, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._556 @cond_branch\n\ - cmp r3, #0\n\ - bne ._557 @cond_branch\n\ - mov r1, sl\n\ - ldrb r0, [r1]\n\ - bl GetBankIdentity\n\ - mov r1, #0x2\n\ - eor r0, r0, r1\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - b ._558\n\ + ldr r0, ._559 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._557 @cond_branch\n\ + ldr r0, ._559 + 4 @ gUnknown_02023A14_50\n\ + ldrb r1, [r0]\n\ + mov r5, #0x2\n\ + add r0, r5, #0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._556 @cond_branch\n\ + cmp r3, #0\n\ + bne ._557 @cond_branch\n\ + mov r1, sl\n\ + ldrb r0, [r1]\n\ + bl GetBankIdentity\n\ + mov r1, #0x2\n\ + eor r0, r0, r1\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + b ._558\n\ ._560:\n\ - .align 2, 0\n\ + .align 2, 0\n\ ._559:\n\ - .word gBattleTypeFlags\n\ - .word gUnknown_02023A14_50\n\ + .word gBattleTypeFlags\n\ + .word gUnknown_02023A14_50\n\ ._556:\n\ - bl Random\n\ - add r1, r5, #0\n\ - and r1, r1, r0\n\ - lsl r1, r1, #0x10\n\ - lsr r0, r1, #0x10\n\ - b ._561\n\ + bl Random\n\ + add r1, r5, #0\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x10\n\ + lsr r0, r1, #0x10\n\ + b ._561\n\ ._557:\n\ - mov r0, #0x0\n\ + mov r0, #0x0\n\ ._558:\n\ - bl GetBankByIdentity\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ + bl GetBankByIdentity\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ ._561:\n\ - lsl r2, r0, #0x8\n\ - orr r2, r2, r4\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ + lsl r2, r0, #0x8\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ ._569:\n\ - bl Emitcmd33\n\ + bl Emitcmd33\n\ ._573:\n\ - bl OpponentBufferExecCompleted\n\ - b ._562\n\ + bl OpponentBufferExecCompleted\n\ + b ._562\n\ ._546:\n\ - ldr r0, ._567 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x93\n\ - lsl r0, r0, #0x3\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._563 @cond_branch\n\ - bl BattleAI_SetupAIData\n\ - bl BattleAI_GetAIActionToUse\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - cmp r4, #0x4\n\ - beq ._564 @cond_branch\n\ - cmp r4, #0x5\n\ - bne ._565 @cond_branch\n\ - mov r0, #0x1\n\ - mov r1, #0x4\n\ - b ._566\n\ + ldr r0, ._567 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x93\n\ + lsl r0, r0, #0x3\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._563 @cond_branch\n\ + bl BattleAI_SetupAIData\n\ + bl BattleAI_GetAIActionToUse\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + cmp r4, #0x4\n\ + beq ._564 @cond_branch\n\ + cmp r4, #0x5\n\ + bne ._565 @cond_branch\n\ + mov r0, #0x1\n\ + mov r1, #0x4\n\ + b ._566\n\ ._568:\n\ - .align 2, 0\n\ + .align 2, 0\n\ ._567:\n\ - .word gBattleTypeFlags\n\ + .word gBattleTypeFlags\n\ ._564:\n\ - mov r0, #0x1\n\ - mov r1, #0x3\n\ + mov r0, #0x1\n\ + mov r1, #0x3\n\ ._566:\n\ - mov r2, #0x0\n\ - b ._569\n\ + mov r2, #0x0\n\ + b ._569\n\ ._565:\n\ - ldr r3, ._574 @ gBattleMoves\n\ - lsl r0, r4, #0x1\n\ - add r2, r5, r0\n\ - ldrh r1, [r2]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r3\n\ - ldrb r1, [r0, #0x6]\n\ - mov r0, #0x12\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._570 @cond_branch\n\ - ldr r1, ._574 + 4 @ gBankTarget\n\ - ldrb r0, [r6]\n\ - strb r0, [r1]\n\ + ldr r3, ._574 @ gBattleMoves\n\ + lsl r0, r4, #0x1\n\ + add r2, r5, r0\n\ + ldrh r1, [r2]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._570 @cond_branch\n\ + ldr r1, ._574 + 4 @ gBankTarget\n\ + ldrb r0, [r6]\n\ + strb r0, [r1]\n\ ._570:\n\ - ldrh r1, [r2]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r3\n\ - ldrb r1, [r0, #0x6]\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._572 @cond_branch\n\ - mov r0, #0x0\n\ - bl GetBankByIdentity\n\ - ldr r5, ._574 + 4 @ gBankTarget\n\ - strb r0, [r5]\n\ - ldr r0, ._574 + 8 @ gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r2, ._574 + 12 @ gBitTable\n\ - ldrb r0, [r5]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r2\n\ - ldr r0, [r0]\n\ - and r1, r1, r0\n\ - cmp r1, #0\n\ - beq ._572 @cond_branch\n\ - mov r0, #0x2\n\ - bl GetBankByIdentity\n\ - strb r0, [r5]\n\ + ldrh r1, [r2]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r3\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._572 @cond_branch\n\ + mov r0, #0x0\n\ + bl GetBankByIdentity\n\ + ldr r5, ._574 + 4 @ gBankTarget\n\ + strb r0, [r5]\n\ + ldr r0, ._574 + 8 @ gAbsentBankFlags\n\ + ldrb r1, [r0]\n\ + ldr r2, ._574 + 12 @ gBitTable\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + and r1, r1, r0\n\ + cmp r1, #0\n\ + beq ._572 @cond_branch\n\ + mov r0, #0x2\n\ + bl GetBankByIdentity\n\ + strb r0, [r5]\n\ ._572:\n\ - ldr r0, ._574 + 4 @ gBankTarget\n\ - ldrb r2, [r0]\n\ - lsl r2, r2, #0x8\n\ - orr r2, r2, r4\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ - bl Emitcmd33\n\ - b ._573\n\ + ldr r0, ._574 + 4 @ gBankTarget\n\ + ldrb r2, [r0]\n\ + lsl r2, r2, #0x8\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ + b ._573\n\ ._575:\n\ - .align 2, 0\n\ + .align 2, 0\n\ ._574:\n\ - .word gBattleMoves\n\ - .word gBankTarget\n\ - .word gAbsentBankFlags\n\ - .word gBitTable\n\ + .word gBattleMoves\n\ + .word gBankTarget\n\ + .word gAbsentBankFlags\n\ + .word gBitTable\n\ ._563:\n\ - mov r6, #0x3\n\ + mov r6, #0x3\n\ ._576:\n\ - bl Random\n\ - add r4, r0, #0\n\ - and r4, r4, r6\n\ - lsl r0, r4, #0x1\n\ - add r0, r5, r0\n\ - ldrh r2, [r0]\n\ - cmp r2, #0\n\ - beq ._576 @cond_branch\n\ - ldr r1, ._579 @ gBattleMoves\n\ - lsl r0, r2, #0x1\n\ - add r0, r0, r2\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x6]\n\ - mov r0, #0x12\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._577 @cond_branch\n\ - ldr r0, ._579 + 4 @ gActiveBank\n\ - ldrb r2, [r0]\n\ - lsl r2, r2, #0x8\n\ - b ._578\n\ + bl Random\n\ + add r4, r0, #0\n\ + and r4, r4, r6\n\ + lsl r0, r4, #0x1\n\ + add r0, r5, r0\n\ + ldrh r2, [r0]\n\ + cmp r2, #0\n\ + beq ._576 @cond_branch\n\ + ldr r1, ._579 @ gBattleMoves\n\ + lsl r0, r2, #0x1\n\ + add r0, r0, r2\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x6]\n\ + mov r0, #0x12\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._577 @cond_branch\n\ + ldr r0, ._579 + 4 @ gActiveBank\n\ + ldrb r2, [r0]\n\ + lsl r2, r2, #0x8\n\ + b ._578\n\ ._580:\n\ - .align 2, 0\n\ + .align 2, 0\n\ ._579:\n\ - .word gBattleMoves\n\ - .word gActiveBank\n\ + .word gBattleMoves\n\ + .word gActiveBank\n\ ._577:\n\ - ldr r0, ._583 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._581 @cond_branch\n\ - bl Random\n\ - mov r1, #0x2\n\ - and r1, r1, r0\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x18\n\ - add r0, r1, #0\n\ - bl GetBankByIdentity\n\ - add r2, r0, #0\n\ - lsl r2, r2, #0x18\n\ - lsr r2, r2, #0x10\n\ + ldr r0, ._583 @ gBattleTypeFlags\n\ + ldrh r1, [r0]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._581 @cond_branch\n\ + bl Random\n\ + mov r1, #0x2\n\ + and r1, r1, r0\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + add r0, r1, #0\n\ + bl GetBankByIdentity\n\ + add r2, r0, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r2, r2, #0x10\n\ ._578:\n\ - orr r2, r2, r4\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ - bl Emitcmd33\n\ - b ._582\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ + b ._582\n\ ._584:\n\ - .align 2, 0\n\ + .align 2, 0\n\ ._583:\n\ - .word gBattleTypeFlags\n\ + .word gBattleTypeFlags\n\ ._581:\n\ - mov r0, #0x0\n\ - bl GetBankByIdentity\n\ - add r2, r0, #0\n\ - lsl r2, r2, #0x18\n\ - lsr r2, r2, #0x10\n\ - orr r2, r2, r4\n\ - mov r0, #0x1\n\ - mov r1, #0xa\n\ - bl Emitcmd33\n\ + mov r0, #0x0\n\ + bl GetBankByIdentity\n\ + add r2, r0, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r2, r2, #0x10\n\ + orr r2, r2, r4\n\ + mov r0, #0x1\n\ + mov r1, #0xa\n\ + bl Emitcmd33\n\ ._582:\n\ - bl OpponentBufferExecCompleted\n\ + bl OpponentBufferExecCompleted\n\ ._562:\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0"); + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0"); } #else #ifdef NONMATCHING diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index e28c058a3..fb2c5ed51 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -42,6 +42,8 @@ extern struct Window gUnknown_03004210; extern void (*gBattleBankFunc[])(void); +extern u8 gBankAttacker; +extern u8 gBankTarget; extern u32 gOamMatrixAllocBitmap; extern u8 gUnknown_020297ED; extern u8 gActiveBank; @@ -115,7 +117,6 @@ extern void sub_802D18C(void); extern void sub_802DF18(void); extern void BufferStringBattle(); extern void sub_80326EC(); -extern void DoMoveAnim(); extern void sub_8031F24(void); extern void sub_80324BC(); extern u8 sub_8031720(); @@ -1001,685 +1002,163 @@ void sub_802D18C(void) } #if DEBUG -__attribute__((naked)) + +void debug_sub_803107C(void); + void debug_sub_8030C24(void) { - asm("\ - push {r4, r5, r6, lr}\n\ - add sp, sp, #0xfffffff4\n\ - ldr r1, ._293 @ gBattlePartyID\n\ - ldr r4, ._293 + 4 @ gActiveBank\n\ - ldrb r0, [r4]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - mov r0, #0x64\n\ - mul r0, r0, r1\n\ - ldr r1, ._293 + 8 @ gPlayerParty\n\ - add r0, r0, r1\n\ - mov r1, #0xd\n\ - bl GetMonData\n\ - add r1, sp, #0x8\n\ - strh r0, [r1]\n\ - ldr r5, ._293 + 12 @ gMain\n\ - ldrh r1, [r5, #0x30]\n\ - cmp r1, #0x20\n\ - bne ._286 @cond_branch\n\ - b ._287\n\ -._286:\n\ - cmp r1, #0x20\n\ - bgt ._288 @cond_branch\n\ - cmp r1, #0x8\n\ - beq ._289 @cond_branch\n\ - cmp r1, #0x8\n\ - bgt ._290 @cond_branch\n\ - cmp r1, #0x4\n\ - beq ._291 @cond_branch\n\ - b ._348\n\ -._294:\n\ - .align 2, 0\n\ -._293:\n\ - .word gBattlePartyID\n\ - .word gActiveBank\n\ - .word gPlayerParty\n\ - .word gMain\n\ -._290:\n\ - cmp r1, #0x10\n\ - bne ._295 @cond_branch\n\ - b ._296\n\ -._295:\n\ - b ._348\n\ -._288:\n\ - cmp r1, #0x80\n\ - bne ._298 @cond_branch\n\ - b ._302\n\ -._298:\n\ - cmp r1, #0x80\n\ - bgt ._300 @cond_branch\n\ - cmp r1, #0x40\n\ - bne ._301 @cond_branch\n\ - b ._302\n\ -._301:\n\ - b ._348\n\ -._300:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x1\n\ - cmp r1, r0\n\ - bne ._304 @cond_branch\n\ - b ._305\n\ -._304:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x2\n\ - cmp r1, r0\n\ - bne ._306 @cond_branch\n\ - b ._307\n\ -._306:\n\ - b ._348\n\ -._289:\n\ - ldrb r0, [r4]\n\ - mov r1, #0x1\n\ - bl dp11b_obj_free\n\ - ldrb r0, [r4]\n\ - mov r1, #0x0\n\ - bl dp11b_obj_free\n\ - ldr r0, ._312 @ gBankAttacker\n\ - ldrb r2, [r4]\n\ - strb r2, [r0]\n\ - ldrh r1, [r5, #0x28]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._310 @cond_branch\n\ - ldr r0, ._312 + 4 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._310 @cond_branch\n\ - ldr r0, ._312 + 8 @ gBankTarget\n\ - mov r1, #0x2\n\ - eor r1, r1, r2\n\ - strb r1, [r0]\n\ - b ._311\n\ -._313:\n\ - .align 2, 0\n\ -._312:\n\ - .word gBankAttacker\n\ - .word gBattleTypeFlags\n\ - .word gBankTarget\n\ -._310:\n\ - ldr r0, ._317 @ gMain\n\ - ldrh r1, [r0, #0x28]\n\ - mov r2, #0x1\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._315 @cond_branch\n\ - ldr r0, ._317 + 4 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._315 @cond_branch\n\ - mov r0, #0x3\n\ - b ._316\n\ -._318:\n\ - .align 2, 0\n\ -._317:\n\ - .word gMain\n\ - .word gBattleTypeFlags\n\ -._315:\n\ - mov r0, #0x1\n\ -._316:\n\ - bl GetBankByIdentity\n\ - ldr r1, ._320 @ gBankTarget\n\ - strb r0, [r1]\n\ -._311:\n\ - mov r0, #0x0\n\ - bl sub_80326EC\n\ - add r0, sp, #0x8\n\ - ldrh r0, [r0]\n\ - bl DoMoveAnim\n\ - ldr r1, ._320 + 4 @ gBattleBankFunc\n\ - ldr r0, ._320 + 8 @ gActiveBank\n\ - ldrb r0, [r0]\n\ - b ._332\n\ -._321:\n\ - .align 2, 0\n\ -._320:\n\ - .word gBankTarget\n\ - .word gBattleBankFunc\n\ - .word gActiveBank\n\ -._291:\n\ - ldrb r0, [r4]\n\ - mov r1, #0x1\n\ - bl dp11b_obj_free\n\ - ldrb r0, [r4]\n\ - mov r1, #0x0\n\ - bl dp11b_obj_free\n\ - ldr r0, ._325 @ gBankTarget\n\ - ldrb r2, [r4]\n\ - strb r2, [r0]\n\ - ldrh r1, [r5, #0x28]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._323 @cond_branch\n\ - ldr r0, ._325 + 4 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._323 @cond_branch\n\ - ldr r0, ._325 + 8 @ gBankAttacker\n\ - mov r1, #0x2\n\ - eor r1, r1, r2\n\ - strb r1, [r0]\n\ - b ._324\n\ -._326:\n\ - .align 2, 0\n\ -._325:\n\ - .word gBankTarget\n\ - .word gBattleTypeFlags\n\ - .word gBankAttacker\n\ -._323:\n\ - ldr r0, ._330 @ gMain\n\ - ldrh r1, [r0, #0x28]\n\ - mov r2, #0x1\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._328 @cond_branch\n\ - ldr r0, ._330 + 4 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - add r0, r2, #0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._328 @cond_branch\n\ - mov r0, #0x3\n\ - b ._329\n\ -._331:\n\ - .align 2, 0\n\ -._330:\n\ - .word gMain\n\ - .word gBattleTypeFlags\n\ -._328:\n\ - mov r0, #0x1\n\ -._329:\n\ - bl GetBankByIdentity\n\ - ldr r1, ._333 @ gBankAttacker\n\ - strb r0, [r1]\n\ -._324:\n\ - mov r0, #0x0\n\ - bl sub_80326EC\n\ - add r0, sp, #0x8\n\ - ldrh r0, [r0]\n\ - bl DoMoveAnim\n\ - ldr r1, ._333 + 4 @ gBattleBankFunc\n\ - ldr r0, ._333 + 8 @ gActiveBank\n\ - ldrb r0, [r0]\n\ - b ._332\n\ -._334:\n\ - .align 2, 0\n\ -._333:\n\ - .word gBankAttacker\n\ - .word gBattleBankFunc\n\ - .word gActiveBank\n\ -._305:\n\ - ldrh r1, [r5, #0x28]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._336 @cond_branch\n\ - ldr r0, ._338 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._336 @cond_branch\n\ - ldrb r0, [r4]\n\ - mov r1, #0x1\n\ - bl dp11b_obj_free\n\ - ldrb r0, [r4]\n\ - mov r1, #0x0\n\ - bl dp11b_obj_free\n\ - mov r0, #0x3\n\ - bl GetBankByIdentity\n\ - ldr r1, ._338 + 4 @ gBankAttacker\n\ - strb r0, [r1]\n\ - mov r0, #0x1\n\ - b ._337\n\ -._339:\n\ - .align 2, 0\n\ -._338:\n\ - .word gBattleTypeFlags\n\ - .word gBankAttacker\n\ -._336:\n\ - add r0, sp, #0x8\n\ - mov r1, #0x0\n\ - ldsh r0, [r0, r1]\n\ - add r0, r0, #0x9\n\ - add r1, sp, #0x8\n\ - strh r0, [r1]\n\ -._296:\n\ - add r0, sp, #0x8\n\ - mov r2, #0x0\n\ - ldsh r0, [r0, r2]\n\ - add r0, r0, #0x1\n\ - lsl r2, r0, #0x10\n\ - add r1, sp, #0x8\n\ - strh r0, [r1]\n\ - mov r0, #0xb1\n\ - lsl r0, r0, #0x11\n\ - cmp r2, r0\n\ - ble ._347 @cond_branch\n\ - mov r1, #0x1\n\ - add r0, sp, #0x8\n\ - strh r1, [r0]\n\ - b ._347\n\ -._307:\n\ - ldrh r1, [r5, #0x28]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._343 @cond_branch\n\ - ldr r0, ._345 @ gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._343 @cond_branch\n\ - ldrb r0, [r4]\n\ - mov r1, #0x1\n\ - bl dp11b_obj_free\n\ - ldrb r0, [r4]\n\ - mov r1, #0x0\n\ - bl dp11b_obj_free\n\ - mov r0, #0x1\n\ - bl GetBankByIdentity\n\ - ldr r1, ._345 + 4 @ gBankAttacker\n\ - strb r0, [r1]\n\ - mov r0, #0x3\n\ -._337:\n\ - bl GetBankByIdentity\n\ - ldr r1, ._345 + 8 @ gBankTarget\n\ - strb r0, [r1]\n\ - mov r0, #0x0\n\ - bl sub_80326EC\n\ - add r0, sp, #0x8\n\ - ldrh r0, [r0]\n\ - bl DoMoveAnim\n\ - ldr r1, ._345 + 12 @ gBattleBankFunc\n\ - ldrb r0, [r4]\n\ -._332:\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, ._345 + 16 @ debug_sub_803107C\n\ - str r1, [r0]\n\ - b ._348\n\ -._346:\n\ - .align 2, 0\n\ -._345:\n\ - .word gBattleTypeFlags\n\ - .word gBankAttacker\n\ - .word gBankTarget\n\ - .word gBattleBankFunc\n\ - .word debug_sub_803107C+1\n\ -._343:\n\ - add r1, sp, #0x8\n\ - add r0, r1, #0\n\ - ldrh r0, [r0]\n\ - sub r0, r0, #0x9\n\ - strh r0, [r1]\n\ -._287:\n\ - add r1, sp, #0x8\n\ - add r0, r1, #0\n\ - ldrh r0, [r0]\n\ - sub r0, r0, #0x1\n\ - strh r0, [r1]\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - bgt ._347 @cond_branch\n\ - mov r2, #0xb1\n\ - lsl r2, r2, #0x1\n\ - add r0, r2, #0\n\ - strh r0, [r1]\n\ -._347:\n\ - ldr r1, ._349 @ gBattlePartyID\n\ - ldr r4, ._349 + 4 @ gActiveBank\n\ - ldrb r0, [r4]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - mov r0, #0x64\n\ - mul r0, r0, r1\n\ - ldr r1, ._349 + 8 @ gPlayerParty\n\ - add r0, r0, r1\n\ - mov r1, #0xd\n\ - add r2, sp, #0x8\n\ - bl SetMonData\n\ - ldr r2, ._349 + 12 @ gBattleMons\n\ - ldrb r1, [r4]\n\ - mov r0, #0x58\n\ - mul r0, r0, r1\n\ - add r0, r0, r2\n\ - add r1, sp, #0x8\n\ - ldrh r1, [r1]\n\ - strh r1, [r0, #0xc]\n\ - ldr r5, ._349 + 16 @ gUnknown_03004210\n\ - ldr r1, ._349 + 20 @ 0x1016\n\ - mov r0, #0x10\n\ - str r0, [sp]\n\ - mov r0, #0x38\n\ - str r0, [sp, #0x4]\n\ - add r0, r5, #0\n\ - mov r2, #0x1\n\ - mov r3, #0x37\n\ - bl Text_FillWindowRect\n\ - add r0, sp, #0x8\n\ - mov r2, #0x0\n\ - ldsh r1, [r0, r2]\n\ - mov r0, #0xd\n\ - mul r1, r1, r0\n\ - ldr r0, ._349 + 24 @ gMoveNames\n\ - add r1, r1, r0\n\ - mov r2, #0x80\n\ - lsl r2, r2, #0x1\n\ - mov r6, #0x37\n\ - str r6, [sp]\n\ - add r0, r5, #0\n\ - mov r3, #0x2\n\ - bl Text_InitWindowAndPrintText\n\ - ldr r4, ._349 + 28 @ gDisplayedStringBattle\n\ - add r0, sp, #0x8\n\ - mov r2, #0x0\n\ - ldsh r1, [r0, r2]\n\ - add r0, r4, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x3\n\ - bl ConvertIntToDecimalStringN\n\ - mov r2, #0x88\n\ - lsl r2, r2, #0x1\n\ - str r6, [sp]\n\ - add r0, r5, #0\n\ - add r1, r4, #0\n\ - mov r3, #0xa\n\ - bl Text_InitWindowAndPrintText\n\ - b ._348\n\ -._350:\n\ - .align 2, 0\n\ -._349:\n\ - .word gBattlePartyID\n\ - .word gActiveBank\n\ - .word gPlayerParty\n\ - .word gBattleMons\n\ - .word gUnknown_03004210\n\ - .word 0x1016\n\ - .word gMoveNames\n\ - .word gDisplayedStringBattle\n\ -._302:\n\ - ldr r0, ._353 @ gMain\n\ - ldrh r0, [r0, #0x30]\n\ - cmp r0, #0x40\n\ - bne ._351 @cond_branch\n\ - ldr r1, ._353 + 4 @ gAnimMoveTurn\n\ - ldrb r0, [r1]\n\ - sub r0, r0, #0x1\n\ - b ._352\n\ -._354:\n\ - .align 2, 0\n\ -._353:\n\ - .word gMain\n\ - .word gAnimMoveTurn\n\ -._351:\n\ - ldr r1, ._359 @ gAnimMoveTurn\n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ -._352:\n\ - strb r0, [r1]\n\ - ldr r4, ._359 + 4 @ gDisplayedStringBattle\n\ - ldrb r1, [r1]\n\ - add r0, r4, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x3\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r0, ._359 + 8 @ gUnknown_03004210\n\ - mov r2, #0x8e\n\ - lsl r2, r2, #0x1\n\ - mov r1, #0x39\n\ - str r1, [sp]\n\ - add r1, r4, #0\n\ - mov r3, #0x4\n\ - bl Text_InitWindowAndPrintText\n\ -._348:\n\ - ldr r0, ._359 + 12 @ gMain\n\ - ldrh r2, [r0, #0x28]\n\ - mov r1, #0xc0\n\ - lsl r1, r1, #0x2\n\ - add r0, r1, #0\n\ - and r0, r0, r2\n\ - cmp r0, r1\n\ - bne ._355 @cond_branch\n\ - mov r4, #0x0\n\ - ldr r5, ._359 + 4 @ gDisplayedStringBattle\n\ - ldr r6, ._359 + 8 @ gUnknown_03004210\n\ -._361:\n\ - add r0, r5, #0\n\ - ldr r1, ._359 + 16 @ BattleText_Format\n\ - bl StringCopy\n\ - ldr r1, ._359 + 20 @ gBattlePartyID\n\ - ldr r0, ._359 + 24 @ gActiveBank\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x1\n\ - add r0, r0, r1\n\ - ldrh r1, [r0]\n\ - mov r0, #0x64\n\ - mul r0, r0, r1\n\ - ldr r1, ._359 + 28 @ gPlayerParty\n\ - add r0, r0, r1\n\ - add r1, r4, #0\n\ - add r1, r1, #0xd\n\ - bl GetMonData\n\ - mov r1, #0xd\n\ - mul r1, r1, r0\n\ - ldr r0, ._359 + 32 @ gMoveNames\n\ - add r1, r1, r0\n\ - add r0, r5, #0\n\ - bl StringAppend\n\ - lsl r0, r4, #0x14\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x11\n\ - add r0, r0, r1\n\ - lsr r2, r0, #0x10\n\ - mov r0, #0x1\n\ - and r0, r0, r4\n\ - mov r3, #0x2\n\ - cmp r0, #0\n\ - beq ._356 @cond_branch\n\ - mov r3, #0xa\n\ -._356:\n\ - cmp r4, #0x1\n\ - bhi ._357 @cond_branch\n\ - mov r0, #0x37\n\ - b ._358\n\ -._360:\n\ - .align 2, 0\n\ -._359:\n\ - .word gAnimMoveTurn\n\ - .word gDisplayedStringBattle\n\ - .word gUnknown_03004210\n\ - .word gMain\n\ - .word BattleText_Format\n\ - .word gBattlePartyID\n\ - .word gActiveBank\n\ - .word gPlayerParty\n\ - .word gMoveNames\n\ -._357:\n\ - mov r0, #0x39\n\ -._358:\n\ - str r0, [sp]\n\ - add r0, r6, #0\n\ - add r1, r5, #0\n\ - bl Text_InitWindow\n\ - ldr r0, ._362 @ gUnknown_03004210\n\ - bl Text_PrintWindow8002F44\n\ - add r0, r4, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - cmp r4, #0x3\n\ - bls ._361 @cond_branch\n\ - ldr r1, ._362 + 4 @ gBattleBankFunc\n\ - ldr r0, ._362 + 8 @ gActiveBank\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, ._362 + 12 @ sub_802C68C\n\ - str r1, [r0]\n\ -._355:\n\ - add sp, sp, #0xc\n\ - pop {r4, r5, r6}\n\ - pop {r0}\n\ - bx r0\n\ -._363:\n\ - .align 2, 0\n\ -._362:\n\ - .word gUnknown_03004210\n\ - .word gBattleBankFunc\n\ - .word gActiveBank\n\ - .word sub_802C68C+1"); + s16 move = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1); + + switch (gMain.newAndRepeatedKeys) + { + case START_BUTTON: + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + gBankAttacker = gActiveBank; + if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + gBankTarget = gBankAttacker ^ 2; + else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + gBankTarget = GetBankByIdentity(3); + else + gBankTarget = GetBankByIdentity(1); + sub_80326EC(0); + DoMoveAnim(move); + gBattleBankFunc[gActiveBank] = debug_sub_803107C; + break; + case SELECT_BUTTON: + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + gBankTarget = gActiveBank; + if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + gBankAttacker = gBankTarget ^ 2; + else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + gBankAttacker = GetBankByIdentity(3); + else + gBankAttacker = GetBankByIdentity(1); + sub_80326EC(0); + DoMoveAnim(move); + gBattleBankFunc[gActiveBank] = debug_sub_803107C; + break; + case R_BUTTON: + if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + gBankAttacker = GetBankByIdentity(3); + gBankTarget = GetBankByIdentity(1); + sub_80326EC(0); + DoMoveAnim(move); + gBattleBankFunc[gActiveBank] = debug_sub_803107C; + } + else + { + move += 9; + case DPAD_RIGHT: + if (++move > 354) + move = 1; + SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move); + gBattleMons[gActiveBank].moves[0] = move; + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); + Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37); + ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37); + } + break; + case L_BUTTON: + if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + gBankAttacker = GetBankByIdentity(1); + gBankTarget = GetBankByIdentity(3); + sub_80326EC(0); + DoMoveAnim(move); + gBattleBankFunc[gActiveBank] = debug_sub_803107C; + } + else + { + move -= 9; + case DPAD_LEFT: + if (--move <= 0) + move = 354; + SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move); + gBattleMons[gActiveBank].moves[0] = move; + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); + Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37); + ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37); + } + break; + case DPAD_UP: + case DPAD_DOWN: + if (gMain.newAndRepeatedKeys == DPAD_UP) + gAnimMoveTurn--; + else + gAnimMoveTurn++; + ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 284, 4, 0x39); + break; + } + + if ((gMain.heldKeysRaw & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON)) + { + u8 i; + u32 move; + + for (i = 0; i < 4; i++) + { + StringCopy(gDisplayedStringBattle, BattleText_Format); + move = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i); + StringAppend(gDisplayedStringBattle, gMoveNames[move]); + Text_InitWindow( + &gUnknown_03004210, + gDisplayedStringBattle, + 0x100 + i * 16, + (i & 1) ? 10 : 2, + (i < 2) ? 0x37 : 0x39); + Text_PrintWindow8002F44(&gUnknown_03004210); + } + gBattleBankFunc[gActiveBank] = sub_802C68C; + } } -__attribute__((naked)) void debug_sub_803107C(void) { - asm("\ - push {r4, r5, r6, r7, lr}\n\ - add sp, sp, #0xfffffffc\n\ - mov r7, #0x0\n\ - ldr r0, ._369 @ gAnimScriptCallback\n\ - ldr r0, [r0]\n\ - bl _call_via_r0\n\ - ldr r0, ._369 + 4 @ gAnimScriptActive\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._364 @cond_branch\n\ - mov r0, #0x1\n\ - bl sub_80326EC\n\ - ldr r4, ._369 + 8 @ gActiveBank\n\ - ldrb r0, [r4]\n\ - mov r1, #0x1\n\ - mov r2, #0x7\n\ - mov r3, #0x1\n\ - bl dp11b_obj_instanciate\n\ - ldrb r0, [r4]\n\ - mov r1, #0x0\n\ - mov r2, #0x7\n\ - mov r3, #0x1\n\ - bl dp11b_obj_instanciate\n\ - ldr r0, ._369 + 12 @ gSprites\n\ - add r2, r0, #0\n\ - add r2, r2, #0x3e\n\ - mov r1, #0x3f\n\ -._366:\n\ - ldrb r0, [r2]\n\ - lsl r0, r0, #0x1f\n\ - cmp r0, #0\n\ - beq ._365 @cond_branch\n\ - add r0, r7, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ -._365:\n\ - add r2, r2, #0x44\n\ - sub r1, r1, #0x1\n\ - cmp r1, #0\n\ - bge ._366 @cond_branch\n\ - ldr r4, ._369 + 16 @ gDisplayedStringBattle\n\ - add r0, r4, #0\n\ - add r1, r7, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x2\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r6, ._369 + 20 @ gUnknown_03004210\n\ - mov r2, #0x91\n\ - lsl r2, r2, #0x1\n\ - mov r5, #0x39\n\ - str r5, [sp]\n\ - add r0, r6, #0\n\ - add r1, r4, #0\n\ - mov r3, #0x8\n\ - bl Text_InitWindowAndPrintText\n\ - bl GetTaskCount\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - add r0, r4, #0\n\ - add r1, r7, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x2\n\ - bl ConvertIntToDecimalStringN\n\ - mov r2, #0x93\n\ - lsl r2, r2, #0x1\n\ - str r5, [sp]\n\ - add r0, r6, #0\n\ - add r1, r4, #0\n\ - mov r3, #0xb\n\ - bl Text_InitWindowAndPrintText\n\ - mov r1, #0x0\n\ - mov r7, #0x0\n\ - ldr r0, ._369 + 24 @ gOamMatrixAllocBitmap\n\ - mov r3, #0x1\n\ - ldr r2, [r0]\n\ -._368:\n\ - add r0, r3, #0\n\ - LSL r0, r1\n\ - and r0, r0, r2\n\ - cmp r0, #0\n\ - beq ._367 @cond_branch\n\ - add r0, r7, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ -._367:\n\ - add r1, r1, #0x1\n\ - cmp r1, #0x1f\n\ - ble ._368 @cond_branch\n\ - ldr r4, ._369 + 16 @ gDisplayedStringBattle\n\ - add r0, r4, #0\n\ - add r1, r7, #0\n\ - mov r2, #0x2\n\ - mov r3, #0x2\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r0, ._369 + 20 @ gUnknown_03004210\n\ - mov r2, #0x95\n\ - lsl r2, r2, #0x1\n\ - mov r1, #0x39\n\ - str r1, [sp]\n\ - add r1, r4, #0\n\ - mov r3, #0xe\n\ - bl Text_InitWindowAndPrintText\n\ - ldr r1, ._369 + 28 @ gBattleBankFunc\n\ - ldr r0, ._369 + 8 @ gActiveBank\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r1, ._369 + 32 @ debug_sub_8030C24\n\ - str r1, [r0]\n\ -._364:\n\ - add sp, sp, #0x4\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._370:\n\ - .align 2, 0\n\ -._369:\n\ - .word gAnimScriptCallback\n\ - .word gAnimScriptActive\n\ - .word gActiveBank\n\ - .word gSprites\n\ - .word gDisplayedStringBattle\n\ - .word gUnknown_03004210\n\ - .word gOamMatrixAllocBitmap\n\ - .word gBattleBankFunc\n\ - .word debug_sub_8030C24+1"); + u8 count = 0; + + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + s32 i; + + sub_80326EC(1); + dp11b_obj_instanciate(gActiveBank, 1, 7, 1); + dp11b_obj_instanciate(gActiveBank, 0, 7, 1); + + for (i = 0, count = 0; i < MAX_SPRITES; i++) + { + if (gSprites[i].inUse) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 290, 8, 0x39); + + count = GetTaskCount(); + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 294, 11, 0x39); + + for (i = 0, count = 0; i < 32; i++) + { + if (gOamMatrixAllocBitmap & (1 << i)) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 298, 14, 0x39); + + gBattleBankFunc[gActiveBank] = debug_sub_8030C24; + } } + #endif void sub_802D204(void) diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c index e9425e7e7..03cf8759d 100644 --- a/src/battle/battle_controller_safari.c +++ b/src/battle/battle_controller_safari.c @@ -276,12 +276,12 @@ void bx_battle_menu_t6_2(void) #if DEBUG else if (gMain.newKeys & R_BUTTON) { - if (!ewram17810[gActiveBank].unk0_5) - move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, 4, 0); + if (!ewram17810[gActiveBank].unk0_5) + move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, 4, 0); } else if (gMain.newKeys & START_BUTTON) { - sub_804454C(); + sub_804454C(); } #endif } diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c index 1532a0b2f..8b9cf9ea0 100644 --- a/src/battle/battle_records.c +++ b/src/battle/battle_records.c @@ -29,11 +29,11 @@ const struct DebugStruct1 gUnknown_Debug_4245CC[] = { 7, _("ナンバー7") }, }; -const u8 gUnknown_Debug_8424620[][4] = +const struct {u8 unk0; u8 unk1;} gUnknown_Debug_8424620[] = { - { 1, 1, 0, 0 }, - { 2, 1, 0, 0 }, - { 3, 1, 0, 0 }, + { 1, 1 }, + { 2, 1 }, + { 3, 1 }, }; #endif @@ -64,7 +64,7 @@ static int GetLinkBattleRecordTotalBattles(struct LinkBattleRecord *record) return record->wins + record->losses + record->draws; } -static int FindLinkBattleRecord(struct LinkBattleRecord *records, u8 *name, u16 trainerId) +static int FindLinkBattleRecord(struct LinkBattleRecord *records, const u8 *name, u16 trainerId) { int i; @@ -145,7 +145,7 @@ static void UpdateLinkBattleGameStats(int battleOutcome) IncrementGameStat(stat); } -static void UpdateLinkBattleRecords_(struct LinkBattleRecord *records, u8 *name, u16 trainerId, int battleOutcome, u8 language) +static void UpdateLinkBattleRecords_(struct LinkBattleRecord *records, const u8 *name, u16 trainerId, int battleOutcome, u8 language) { int index; UpdateLinkBattleGameStats(battleOutcome); @@ -224,62 +224,22 @@ void UpdateLinkBattleRecords(int id) } #if DEBUG -__attribute__((naked)) void debug_sub_81257E0(void) { - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - add sp, sp, #0xfffffffc\n\ - bl InitLinkBattleRecords\n\ - mov r5, #0x0\n\ - ldr r6, ._62 @ gUnknown_Debug_4245CC\n\ - sub r0, r6, #2\n\ - mov r8, r0\n\ - ldr r7, ._62 + 4 @ gLinkPlayers\n\ -._61:\n\ - ldr r0, ._62 + 8 @ gUnknown_Debug_8424620\n\ - lsl r3, r5, #0x2\n\ - add r3, r3, r0\n\ - ldrb r4, [r3]\n\ - sub r4, r4, #0x1\n\ - lsl r0, r4, #0x1\n\ - add r0, r0, r4\n\ - lsl r0, r0, #0x2\n\ - add r1, r0, r6\n\ - add r0, r0, r8\n\ - ldrh r2, [r0]\n\ - ldrb r3, [r3, #0x1]\n\ - ldr r0, ._62 + 12 @ gLinkPlayerMapObjects\n\ - lsl r4, r4, #0x2\n\ - add r4, r4, r0\n\ - ldrb r4, [r4, #0x1]\n\ - lsl r0, r4, #0x3\n\ - sub r0, r0, r4\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r7\n\ - ldrb r0, [r0, #0x1a]\n\ - str r0, [sp]\n\ - ldr r0, ._62 + 16 @ gSaveBlock1\n\ - bl UpdateLinkBattleRecords_\n\ - add r5, r5, #0x1\n\ - cmp r5, #0x2\n\ - bls ._61 @cond_branch\n\ - add sp, sp, #0x4\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._63:\n\ - .align 2, 0\n\ -._62:\n\ - .word gUnknown_Debug_4245CC+2\n\ - .word gLinkPlayers\n\ - .word gUnknown_Debug_8424620\n\ - .word gLinkPlayerMapObjects\n\ - .word gSaveBlock1+0x30b8"); + u32 i; + + InitLinkBattleRecords(); + for (i = 0; i < 3; i++) + { + u32 id = gUnknown_Debug_8424620[i].unk0 - 1; + + UpdateLinkBattleRecords_( + gSaveBlock1.linkBattleRecords, + gUnknown_Debug_4245CC[id].var1, + gUnknown_Debug_4245CC[id].var0, + gUnknown_Debug_8424620[i].unk1, + gLinkPlayers[gLinkPlayerMapObjects[id].linkPlayerId].language); + } } #endif diff --git a/src/field/region_map.c b/src/field/region_map.c index 7bfda1a81..bd625402b 100644 --- a/src/field/region_map.c +++ b/src/field/region_map.c @@ -1413,14 +1413,14 @@ static const u8 sUnknown_083E7920[][3] = struct UnknownStruct4 { - const u8 *const *unk0; + const u8 *const *partNames; u16 mapSectionId; - u16 flag; + u16 requiredFlag; }; static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter}; -const struct UnknownStruct4 gUnknown_083E79C0[1] = +static const struct UnknownStruct4 sMultiPartMapSections[1] = { {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY}, }; @@ -1608,21 +1608,19 @@ static void PrintFlyTargetName(void) { if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4) { + bool8 drawFrameDisabled = FALSE; u16 i; - bool32 drawFrameDisabled = FALSE; - for (i = 0; i < ARRAY_COUNT(gUnknown_083E79C0); i++) + for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++) { - const struct UnknownStruct4 *r4 = &gUnknown_083E79C0[i]; - - if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId) + if (ewram0_3.regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) { - if (FlagGet(r4->flag)) + if (FlagGet(sMultiPartMapSections[i].requiredFlag)) { Menu_DrawStdWindowFrame(16, 14, 29, 19); Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15); - MenuPrint_RightAligned(r4->unk0[ewram0_3.regionMap.everGrandeCityArea], 29, 17); - return; + MenuPrint_RightAligned(sMultiPartMapSections[i].partNames[ewram0_3.regionMap.everGrandeCityArea], 29, 17); + drawFrameDisabled = TRUE; } break; } @@ -1839,3 +1837,131 @@ void sub_80FC69C(void) break; } } + +#if DEBUG + +void debug_sub_8110CCC(void) +{ + bool8 r7 = FALSE; + u16 i; + s16 indent; + + for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++) + { + if (ewram0_3.regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) + { + if (FlagGet(sMultiPartMapSections[i].requiredFlag)) + { + indent = 12 - StringLength(sMultiPartMapSections[i].partNames[ewram0_3.regionMap.everGrandeCityArea]); + if (indent < 0) + indent = 0; + r7 = TRUE; + Menu_DrawStdWindowFrame(16, 14, 29, 19); + Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15); + Menu_PrintText(sMultiPartMapSections[i].partNames[ewram0_3.regionMap.everGrandeCityArea], 17 + indent, 17); + } + break; + } + } + if (!r7) + { + Menu_DrawStdWindowFrame(16, 16, 29, 19); + Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 17); + Menu_EraseWindowRect(16, 14, 29, 15); + } +} + +void debug_sub_8110D84(void) +{ + switch (ewram0_3.unk4) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + ewram0_3.unk4++; + break; + case 1: + if (!UpdatePaletteFade()) + ewram0_3.unk4++; + break; + case 2: + switch (sub_80FAB60()) + { + case 0: + break; + case 3: + debug_sub_8110CCC(); + break; + case 4: + if (ewram0_3.regionMap.unk16 != 0) + { + m4aSongNumStart(SE_SELECT); + gSharedMem[0xA6E] = 1; // TODO: what is this? + sub_80FC244(sub_80FC69C); + } + break; + case 5: + m4aSongNumStart(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + ewram0_3.unk4++; + break; + } + break; + case 3: + if (!UpdatePaletteFade()) + SetMainCallback2(sub_805469C); + break; + case 4: + if (sub_80FAB60() != 0) + { + debug_sub_8110CCC(); + } + else if (gMain.newKeys & A_BUTTON) + { + sub_80FBCA0(); + sub_80FAEC4(); + ewram0_3.unk4++; + } + break; + case 5: + if (sub_80FAFC0() == 0) + { + CreateRegionMapCursor(0, 0); + ewram0_3.unk4++; + } + break; + case 6: + if (sub_80FAB60() != 0) + { + debug_sub_8110CCC(); + } + if (gMain.newKeys & A_BUTTON) // no "else if" like above? + { + sub_80FBCA0(); + sub_80FAEC4(); + ewram0_3.unk4++; + } + break; + case 7: + if (sub_80FAFC0() == 0) + { + CreateRegionMapCursor(0, 0); + ewram0_3.unk4 = 3; + } + break; + } +} + +void debug_sub_8110F28(void) +{ + CB2_InitFlyRegionMap(); + + if (gMain.callback2 == CB2_FlyRegionMap) + { + sub_80FBF94(); + sub_80FC244(debug_sub_8110D84); + debug_sub_8110CCC(); + } +} + +#endif + diff --git a/src/scene/cute_sketch.c b/src/scene/cute_sketch.c index 2af990290..5317bc334 100644 --- a/src/scene/cute_sketch.c +++ b/src/scene/cute_sketch.c @@ -29,350 +29,6 @@ void sub_80FD1C8(u16); u16 sub_80FD39C(u16*); u16 sub_80FD68C(u16*, u16*, u16*); -#if DEBUG - -__attribute__((naked)) -void debug_sub_8110CCC(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, #0x0\n\ - mov r1, #0x0\n\ - ldr r2, ._5 @ gUnknown_083E79C0\n\ - ldr r6, ._5 + 4 @ \n\ -._7:\n\ - lsl r0, r1, #0x3\n\ - add r4, r0, r2\n\ - ldrh r0, [r6, #0x1c]\n\ - ldrh r3, [r4, #0x4]\n\ - cmp r0, r3\n\ - bne ._1 @cond_branch\n\ - ldrh r0, [r4, #0x6]\n\ - bl FlagGet\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._4 @cond_branch\n\ - ldrb r0, [r6, #0x1f]\n\ - ldr r1, [r4]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - bl StringLength\n\ - mov r1, #0xc\n\ - sub r1, r1, r0\n\ - lsl r1, r1, #0x10\n\ - lsr r5, r1, #0x10\n\ - cmp r1, #0\n\ - bge ._3 @cond_branch\n\ - mov r5, #0x0\n\ -._3:\n\ - mov r7, #0x1\n\ - mov r0, #0x10\n\ - mov r1, #0xe\n\ - mov r2, #0x1d\n\ - mov r3, #0x13\n\ - bl Menu_DrawStdWindowFrame\n\ - add r0, r6, #0\n\ - add r0, r0, #0x8\n\ - mov r1, #0x11\n\ - mov r2, #0xf\n\ - bl Menu_PrintText\n\ - ldrb r0, [r6, #0x1f]\n\ - ldr r1, [r4]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - add r1, r5, #0\n\ - add r1, r1, #0x11\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x18\n\ - mov r2, #0x11\n\ - bl Menu_PrintText\n\ - b ._4\n\ -._6:\n\ - .align 2, 0\n\ -._5:\n\ - .word gUnknown_083E79C0\n\ - .word +0x2000000\n\ -._1:\n\ - add r0, r1, #1\n\ - lsl r0, r0, #0x10\n\ - lsr r1, r0, #0x10\n\ - cmp r1, #0\n\ - beq ._7 @cond_branch\n\ -._4:\n\ - cmp r7, #0\n\ - bne ._8 @cond_branch\n\ - mov r0, #0x10\n\ - mov r1, #0x10\n\ - mov r2, #0x1d\n\ - mov r3, #0x13\n\ - bl Menu_DrawStdWindowFrame\n\ - ldr r0, ._9 @ \n\ - mov r1, #0x11\n\ - mov r2, #0x11\n\ - bl Menu_PrintText\n\ - mov r0, #0x10\n\ - mov r1, #0xe\n\ - mov r2, #0x1d\n\ - mov r3, #0xf\n\ - bl Menu_EraseWindowRect\n\ -._8:\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._10:\n\ - .align 2, 0\n\ -._9:\n\ - .word +0x2000008"); -} - -__attribute__((naked)) -void debug_sub_8110D84(void) -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._13 @ \n\ - ldrh r0, [r0, #0x4]\n\ - cmp r0, #0x7\n\ - bls ._11 @cond_branch\n\ - b ._65\n\ -._11:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._13 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._14:\n\ - .align 2, 0\n\ -._13:\n\ - .word +0x2000000\n\ - .word ._15\n\ -._15:\n\ - .word ._16\n\ - .word ._17\n\ - .word ._18\n\ - .word ._19\n\ - .word ._20\n\ - .word ._21\n\ - .word ._22\n\ - .word ._23\n\ -._16:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - mov r1, #0x0\n\ - str r1, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r1, ._25 @ \n\ - ldrh r0, [r1, #0x4]\n\ - add r0, r0, #0x1\n\ - b ._62\n\ -._26:\n\ - .align 2, 0\n\ -._25:\n\ - .word +0x2000000\n\ -._17:\n\ - bl UpdatePaletteFade\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._27 @cond_branch\n\ - b ._65\n\ -._27:\n\ - ldr r1, ._30 @ \n\ - ldrh r0, [r1, #0x4]\n\ - add r0, r0, #0x1\n\ - b ._62\n\ -._31:\n\ - .align 2, 0\n\ -._30:\n\ - .word +0x2000000\n\ -._18:\n\ - bl sub_80FAB60\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x3\n\ - beq ._32 @cond_branch\n\ - cmp r0, #0x3\n\ - bgt ._33 @cond_branch\n\ - b ._65\n\ -._33:\n\ - cmp r0, #0x4\n\ - beq ._35 @cond_branch\n\ - cmp r0, #0x5\n\ - beq ._36 @cond_branch\n\ - b ._65\n\ -._35:\n\ - ldr r4, ._41 @ \n\ - ldrb r0, [r4, #0x1e]\n\ - cmp r0, #0\n\ - bne ._38 @cond_branch\n\ - b ._65\n\ -._38:\n\ - mov r0, #0x5\n\ - bl m4aSongNumStart\n\ - ldr r1, ._41 + 4 @ \n\ - add r0, r4, r1\n\ - mov r1, #0x1\n\ - strb r1, [r0]\n\ - ldr r0, ._41 + 8 @ \n\ - bl sub_80FC244\n\ - b ._65\n\ -._42:\n\ - .align 2, 0\n\ -._41:\n\ - .word +0x2000000\n\ - .word 0xa6e\n\ - .word sub_80FC69C+1\n\ -._36:\n\ - mov r0, #0x5\n\ - bl m4aSongNumStart\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - mov r1, #0x0\n\ - str r1, [sp]\n\ - mov r2, #0x0\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - ldr r1, ._44 @ \n\ - ldrh r0, [r1, #0x4]\n\ - add r0, r0, #0x1\n\ - b ._62\n\ -._45:\n\ - .align 2, 0\n\ -._44:\n\ - .word +0x2000000\n\ -._19:\n\ - bl UpdatePaletteFade\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._65 @cond_branch\n\ - ldr r0, ._48 @ sub_805469C\n\ - bl SetMainCallback2\n\ - b ._65\n\ -._49:\n\ - .align 2, 0\n\ -._48:\n\ - .word sub_805469C+1\n\ -._20:\n\ - bl sub_80FAB60\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._50 @cond_branch\n\ -._32:\n\ - bl debug_sub_8110CCC\n\ - b ._65\n\ -._50:\n\ - ldr r0, ._54 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._65 @cond_branch\n\ - bl sub_80FBCA0\n\ - bl sub_80FAEC4\n\ - ldr r1, ._54 + 4 @ \n\ - ldrh r0, [r1, #0x4]\n\ - add r0, r0, #0x1\n\ - b ._62\n\ -._55:\n\ - .align 2, 0\n\ -._54:\n\ - .word gMain\n\ - .word +0x2000000\n\ -._21:\n\ - bl sub_80FAFC0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._65 @cond_branch\n\ - mov r0, #0x0\n\ - mov r1, #0x0\n\ - bl CreateRegionMapCursor\n\ - ldr r1, ._58 @ \n\ - ldrh r0, [r1, #0x4]\n\ - add r0, r0, #0x1\n\ - b ._62\n\ -._59:\n\ - .align 2, 0\n\ -._58:\n\ - .word +0x2000000\n\ -._22:\n\ - bl sub_80FAB60\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._60 @cond_branch\n\ - bl debug_sub_8110CCC\n\ -._60:\n\ - ldr r0, ._63 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._65 @cond_branch\n\ - bl sub_80FBCA0\n\ - bl sub_80FAEC4\n\ - ldr r1, ._63 + 4 @ \n\ - ldrh r0, [r1, #0x4]\n\ - add r0, r0, #0x1\n\ - b ._62\n\ -._64:\n\ - .align 2, 0\n\ -._63:\n\ - .word gMain\n\ - .word +0x2000000\n\ -._23:\n\ - bl sub_80FAFC0\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._65 @cond_branch\n\ - mov r0, #0x0\n\ - mov r1, #0x0\n\ - bl CreateRegionMapCursor\n\ - ldr r1, ._66 @ \n\ - mov r0, #0x3\n\ -._62:\n\ - strh r0, [r1, #0x4]\n\ -._65:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._67:\n\ - .align 2, 0\n\ -._66:\n\ - .word +0x2000000"); -} - -__attribute__((naked)) -void debug_sub_8110F28(void) -{ - asm("\ - push {lr}\n\ - bl CB2_InitFlyRegionMap\n\ - ldr r0, ._69 @ gMain\n\ - ldr r1, [r0, #0x4]\n\ - ldr r0, ._69 + 4 @ CB2_FlyRegionMap\n\ - cmp r1, r0\n\ - bne ._68 @cond_branch\n\ - bl sub_80FBF94\n\ - ldr r0, ._69 + 8 @ debug_sub_8110D84\n\ - bl sub_80FC244\n\ - bl debug_sub_8110CCC\n\ -._68:\n\ - pop {r0}\n\ - bx r0\n\ -._70:\n\ - .align 2, 0\n\ -._69:\n\ - .word gMain\n\ - .word CB2_FlyRegionMap+1\n\ - .word debug_sub_8110D84+1"); -} - -#endif - void sub_80FC7A0(struct Unk03005E20* info) { gUnknown_03005DEC = info->var_4; -- cgit v1.2.3 From abd9ab75e831d66dc30d27091251d1ad37334bdf Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 15 Feb 2018 22:24:05 -0600 Subject: decompile region_map.c and cable_car.c debug functions --- src/field/mauville_man.c | 52 ++++----- src/field/region_map.c | 88 ++++++++------- src/scene/berry_blender.c | 8 +- src/scene/cable_car.c | 276 ++++++++++++++-------------------------------- 4 files changed, 158 insertions(+), 266 deletions(-) (limited to 'src') diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index ec2f3cb69..a68d5071d 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -253,32 +253,32 @@ void SetupMauvilleOldMan(void) #if DEBUG void debug_sub_810B32C(u8 a) { - u8 i; - u8 savedArr[8]; - - switch (a) - { - case 0: - SetupBard(); - break; - case 1: - for (i = 0; i < 8; i++) - savedArr[i] = gSaveBlock1.unk2D8C[i]; - SetupHipster(); - for (i = 0; i < 8; i++) - gSaveBlock1.unk2D8C[i] = savedArr[i]; - break; - case 2: - SetupTrader(); - break; - case 3: - SetupStoryteller(); - break; - case 4: - SetupGiddy(); - break; - } - sub_80F83D0(); + u8 i; + u8 savedArr[8]; + + switch (a) + { + case 0: + SetupBard(); + break; + case 1: + for (i = 0; i < 8; i++) + savedArr[i] = gSaveBlock1.unk2D8C[i]; + SetupHipster(); + for (i = 0; i < 8; i++) + gSaveBlock1.unk2D8C[i] = savedArr[i]; + break; + case 2: + SetupTrader(); + break; + case 3: + SetupStoryteller(); + break; + case 4: + SetupGiddy(); + break; + } + sub_80F83D0(); } #endif diff --git a/src/field/region_map.c b/src/field/region_map.c index bd625402b..6d50701d6 100644 --- a/src/field/region_map.c +++ b/src/field/region_map.c @@ -1411,22 +1411,26 @@ static const u8 sUnknown_083E7920[][3] = {0, 49, 0}, }; -struct UnknownStruct4 +static const u8 *const sEverGrandeCityAreaNames[] = +{ + OtherText_PokeLeague, + OtherText_PokeCenter, +}; + +struct MultiPartMapSection { const u8 *const *partNames; u16 mapSectionId; u16 requiredFlag; }; -static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter}; - -static const struct UnknownStruct4 sMultiPartMapSections[1] = +// Map sections that are divided into multiple parts. Ever Grande City is the only one. +static const struct MultiPartMapSection sMultiPartMapSections[1] = { {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY}, }; -// XXX: what is this? -static u8 *const ewram_ = gSharedMem; +static struct UnknownStruct3 *const sFlyDataPtr = (struct UnknownStruct3 *)gSharedMem; static const struct SpritePalette sFlyTargetIconSpritePalette = {sFlyTargetIcons_Pal, 2}; @@ -1547,10 +1551,10 @@ void CB2_InitFlyRegionMap(void) Menu_EraseScreen(); break; case 3: - InitRegionMap(&ewram0_3.regionMap, 0); + InitRegionMap(&sFlyDataPtr->regionMap, 0); CreateRegionMapCursor(0, 0); CreateRegionMapPlayerIcon(1, 1); - ewram0_3.unk6 = ewram0_3.regionMap.mapSectionId; + sFlyDataPtr->unk6 = sFlyDataPtr->regionMap.mapSectionId; StringFill(ewramBlankMapName, CHAR_SPACE, 12); PrintFlyTargetName(); break; @@ -1593,33 +1597,33 @@ static void VBlankCB_FlyRegionMap(void) void CB2_FlyRegionMap(void) { - ewram0_3.unk0(); + sFlyDataPtr->unk0(); AnimateSprites(); BuildOamBuffer(); } void sub_80FC244(void (*func)(void)) { - ewram0_3.unk0 = func; - ewram0_3.unk4 = 0; + sFlyDataPtr->unk0 = func; + sFlyDataPtr->unk4 = 0; } static void PrintFlyTargetName(void) { - if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4) + if (sFlyDataPtr->regionMap.unk16 == 2 || sFlyDataPtr->regionMap.unk16 == 4) { bool8 drawFrameDisabled = FALSE; u16 i; for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++) { - if (ewram0_3.regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) + if (sFlyDataPtr->regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) { if (FlagGet(sMultiPartMapSections[i].requiredFlag)) { Menu_DrawStdWindowFrame(16, 14, 29, 19); - Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15); - MenuPrint_RightAligned(sMultiPartMapSections[i].partNames[ewram0_3.regionMap.everGrandeCityArea], 29, 17); + Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 15); + MenuPrint_RightAligned(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea], 29, 17); drawFrameDisabled = TRUE; } break; @@ -1629,7 +1633,7 @@ static void PrintFlyTargetName(void) if (!drawFrameDisabled) { Menu_DrawStdWindowFrame(16, 16, 29, 19); - Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 17); + Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 17); Menu_EraseWindowRect(16, 14, 29, 15); } } @@ -1730,7 +1734,7 @@ static void CreateSpecialAreaFlyTargetIcons(void) static void SpriteCB_FlyTargetIcons(struct Sprite *sprite) { // Blink if our mapSectionId is the one selected on the map - if (ewram0_3.regionMap.mapSectionId == sprite->data[0]) + if (sFlyDataPtr->regionMap.mapSectionId == sprite->data[0]) { // Toggle visibility every 16 frames sprite->data[1]++; @@ -1749,11 +1753,11 @@ static void SpriteCB_FlyTargetIcons(struct Sprite *sprite) static void sub_80FC5B4(void) { - switch (ewram0_3.unk4) + switch (sFlyDataPtr->unk4) { case 0: BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - ewram0_3.unk4++; + sFlyDataPtr->unk4++; break; case 1: if (UpdatePaletteFade() != 0) @@ -1765,7 +1769,7 @@ static void sub_80FC5B4(void) static void sub_80FC600(void) { - if (ewram0_3.unk4 == 0) + if (sFlyDataPtr->unk4 == 0) { switch (sub_80FAB60()) { @@ -1777,7 +1781,7 @@ static void sub_80FC600(void) PrintFlyTargetName(); break; case INPUT_EVENT_A_BUTTON: - if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4) + if (sFlyDataPtr->regionMap.unk16 == 2 || sFlyDataPtr->regionMap.unk16 == 4) { m4aSongNumStart(SE_SELECT); ewramA6E = 1; @@ -1795,11 +1799,11 @@ static void sub_80FC600(void) void sub_80FC69C(void) { - switch (ewram0_3.unk4) + switch (sFlyDataPtr->unk4) { case 0: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - ewram0_3.unk4++; + sFlyDataPtr->unk4++; break; case 1: if (UpdatePaletteFade() != 0) @@ -1807,7 +1811,7 @@ void sub_80FC69C(void) FreeRegionMapIconResources(); if (ewramA6E != 0) { - switch (ewram0_3.regionMap.mapSectionId) + switch (sFlyDataPtr->regionMap.mapSectionId) { case MAPSEC_SOUTHERN_ISLAND: sub_8053538(22); @@ -1819,13 +1823,13 @@ void sub_80FC69C(void) sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13); break; case MAPSEC_EVER_GRANDE_CITY: - sub_8053538((FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && ewram0_3.regionMap.everGrandeCityArea == 0) ? 20 : 11); + sub_8053538((FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && sFlyDataPtr->regionMap.everGrandeCityArea == 0) ? 20 : 11); break; default: - if (sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][2] != 0) - sub_8053538(sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][2]); + if (sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][2] != 0) + sub_8053538(sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][2]); else - warp1_set_2(sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][0], sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][1], -1); + warp1_set_2(sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][0], sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][1], -1); break; } sub_80865BC(); @@ -1848,17 +1852,17 @@ void debug_sub_8110CCC(void) for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++) { - if (ewram0_3.regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) + if (sFlyDataPtr->regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) { if (FlagGet(sMultiPartMapSections[i].requiredFlag)) { - indent = 12 - StringLength(sMultiPartMapSections[i].partNames[ewram0_3.regionMap.everGrandeCityArea]); + indent = 12 - StringLength(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea]); if (indent < 0) indent = 0; r7 = TRUE; Menu_DrawStdWindowFrame(16, 14, 29, 19); - Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15); - Menu_PrintText(sMultiPartMapSections[i].partNames[ewram0_3.regionMap.everGrandeCityArea], 17 + indent, 17); + Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 15); + Menu_PrintText(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea], 17 + indent, 17); } break; } @@ -1866,22 +1870,22 @@ void debug_sub_8110CCC(void) if (!r7) { Menu_DrawStdWindowFrame(16, 16, 29, 19); - Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 17); + Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 17); Menu_EraseWindowRect(16, 14, 29, 15); } } void debug_sub_8110D84(void) { - switch (ewram0_3.unk4) + switch (sFlyDataPtr->unk4) { case 0: BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - ewram0_3.unk4++; + sFlyDataPtr->unk4++; break; case 1: if (!UpdatePaletteFade()) - ewram0_3.unk4++; + sFlyDataPtr->unk4++; break; case 2: switch (sub_80FAB60()) @@ -1892,7 +1896,7 @@ void debug_sub_8110D84(void) debug_sub_8110CCC(); break; case 4: - if (ewram0_3.regionMap.unk16 != 0) + if (sFlyDataPtr->regionMap.unk16 != 0) { m4aSongNumStart(SE_SELECT); gSharedMem[0xA6E] = 1; // TODO: what is this? @@ -1902,7 +1906,7 @@ void debug_sub_8110D84(void) case 5: m4aSongNumStart(SE_SELECT); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - ewram0_3.unk4++; + sFlyDataPtr->unk4++; break; } break; @@ -1919,14 +1923,14 @@ void debug_sub_8110D84(void) { sub_80FBCA0(); sub_80FAEC4(); - ewram0_3.unk4++; + sFlyDataPtr->unk4++; } break; case 5: if (sub_80FAFC0() == 0) { CreateRegionMapCursor(0, 0); - ewram0_3.unk4++; + sFlyDataPtr->unk4++; } break; case 6: @@ -1938,14 +1942,14 @@ void debug_sub_8110D84(void) { sub_80FBCA0(); sub_80FAEC4(); - ewram0_3.unk4++; + sFlyDataPtr->unk4++; } break; case 7: if (sub_80FAFC0() == 0) { CreateRegionMapCursor(0, 0); - ewram0_3.unk4 = 3; + sFlyDataPtr->unk4 = 3; } break; } diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c index ef9dd5ab7..bf634a49f 100644 --- a/src/scene/berry_blender.c +++ b/src/scene/berry_blender.c @@ -277,8 +277,8 @@ bool8 Blender_PrintBlendingResults(void); static void sub_80510E8(void); static void sub_8050E30(void); static void sub_805197C(u16 a0, u16 a1); -/*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst); -/*static*/ void sub_8052BD0(u8 taskID); +static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst); +static void sub_8052BD0(u8 taskID); static void sub_8052AF8(void); static void sub_804F8C8(u8 taskID); static void sub_804F9F4(u8 taskID); @@ -3122,7 +3122,7 @@ bool8 Blender_PrintBlendingResults(void) return FALSE; } -/*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) +static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) { u8 text[12]; u8 flavourLvl, feel; @@ -3545,7 +3545,7 @@ void ShowBerryBlenderRecordWindow(void) } } -/*static*/ void sub_8052BD0(u8 taskID) +static void sub_8052BD0(u8 taskID) { if (gTasks[taskID].data[0] == 0) { diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index 60efee67d..65fd37fb2 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -21,9 +21,12 @@ #include "constants/map_objects.h" #include "constants/weather.h" +extern u8 (*gMenuCallback)(void); + // Static type declarations -struct CableCarEwramStruct1 { +struct CableCarEwramStruct1 +{ u8 unk_0000; u8 unk_0001; u8 unk_0002; @@ -55,7 +58,8 @@ struct CableCarEwramStruct1 { u16 unk_08fc[0x20][0x20]; }; // size 0x10FC -struct CableCarEwramStruct2 { +struct CableCarEwramStruct2 +{ /* 0x000 */ u16 mtChimneyTilemap[0xb4]; /* 0x168 */ u16 treeTilemap[0x1e0]; /* 0x528 */ u16 mountainTilemap[0x258]; @@ -97,8 +101,8 @@ static void sub_81248AC(u8); #if DEBUG -u8 debug_sub_8138D74(void); -u8 debug_sub_8138D8C(void); +void debug_sub_8138D74(void); +void debug_sub_8138D8C(void); u8 debug_sub_8138C14(void); u8 debug_sub_8138C34(void); u8 debug_sub_810CD9C(void); @@ -111,8 +115,8 @@ const u8 Str_842DBFC[] = _("View a MAIL"); const struct MenuAction gUnkDebug4Menu[] = { - {Str_842DBD0, debug_sub_8138D74}, - {Str_842DBDC, debug_sub_8138D8C}, + {Str_842DBD0, (u8 (*)(void))debug_sub_8138D74}, // why do these two functions have a different prototype? + {Str_842DBDC, (u8 (*)(void))debug_sub_8138D8C}, {Str_842DBE8, debug_sub_8138C14}, {Str_842DBF2, debug_sub_8138C34}, {Str_842DBFC, debug_sub_810CD9C}, @@ -170,184 +174,90 @@ static const struct OamData gOamData_8401D38 = { .priority = 2 }; -static const struct SpriteTemplate gSpriteTemplate_8401D40[] = { +static const struct SpriteTemplate gSpriteTemplate_8401D40[] = +{ { - 1, - 1, - &gOamData_8401D28, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - sub_8123CB8 - }, { - 2, - 1, - &gOamData_8401D30, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - sub_8123CB8 - }, { - 3, - 1, - &gOamData_8401D38, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - nullsub_76 + .tileTag = 1, + .paletteTag = 1, + .oam = &gOamData_8401D28, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8123CB8, + }, + { + .tileTag = 2, + .paletteTag = 1, + .oam = &gOamData_8401D30, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8123CB8, + }, + { + .tileTag = 3, + .paletteTag = 1, + .oam = &gOamData_8401D38, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = nullsub_76, } }; -// .text - #if DEBUG -__attribute__((naked)) +extern u8 unk_203955C; + +extern const u8 MauvilleCity_GameCorner_EventScript_1C407E[]; +extern const u8 MauvilleCity_GameCorner_EventScript_1C40AC[]; + u8 debug_sub_8138C14(void) { - asm("\n\ - push {lr}\n\ - ldr r0, ._1 @ unk_203955C\n\ - mov r1, #0x1\n\ - strb r1, [r0]\n\ - ldr r0, ._1 + 4 @ MauvilleCity_GameCorner_EventScript_1C407E\n\ - bl ScriptContext1_SetupScript\n\ - bl CloseMenu\n\ - mov r0, #0x1\n\ - pop {r1}\n\ - bx r1\n\ -._2:\n\ - .align 2, 0\n\ -._1:\n\ - .word unk_203955C\n\ - .word MauvilleCity_GameCorner_EventScript_1C407E"); + unk_203955C = 1; + ScriptContext1_SetupScript(MauvilleCity_GameCorner_EventScript_1C407E); + CloseMenu(); + return 1; } -__attribute__((naked)) u8 debug_sub_8138C34(void) { - asm("\n\ - push {lr}\n\ - ldr r0, ._3 @ unk_203955C\n\ - mov r1, #0x1\n\ - strb r1, [r0]\n\ - ldr r0, ._3 + 4 @ MauvilleCity_GameCorner_EventScript_1C40AC\n\ - bl ScriptContext1_SetupScript\n\ - bl CloseMenu\n\ - mov r0, #0x1\n\ - pop {r1}\n\ - bx r1\n\ -._4:\n\ - .align 2, 0\n\ -._3:\n\ - .word unk_203955C\n\ - .word MauvilleCity_GameCorner_EventScript_1C40AC"); + unk_203955C = 1; + ScriptContext1_SetupScript(MauvilleCity_GameCorner_EventScript_1C40AC); + CloseMenu(); + return 1; } -__attribute__((naked)) u8 debug_sub_8138C54(void) { - asm("\n\ - push {r4, lr}\n\ - ldr r4, ._10 @ gMain\n\ - ldrh r0, [r4, #0x2e]\n\ - cmp r0, #0x40\n\ - bne ._5 @cond_branch\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - bl Menu_MoveCursor\n\ -._5:\n\ - ldrh r0, [r4, #0x2e]\n\ - cmp r0, #0x80\n\ - bne ._6 @cond_branch\n\ - mov r0, #0x1\n\ - bl Menu_MoveCursor\n\ -._6:\n\ - ldrh r1, [r4, #0x2e]\n\ - cmp r1, #0x1\n\ - beq ._7 @cond_branch\n\ - ldr r0, ._10 + 4 @ 0x101\n\ - cmp r1, r0\n\ - bne ._8 @cond_branch\n\ - ldr r1, ._10 + 8 @ gSpecialVar_0x8004\n\ - mov r0, #0x1\n\ - strh r0, [r1]\n\ -._7:\n\ - ldr r4, ._10 + 12 @ gUnkDebug4Menu\n\ - bl Menu_GetCursorPos\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x15\n\ - add r4, r4, #0x4\n\ - add r0, r0, r4\n\ - ldr r0, [r0]\n\ - bl _call_via_r0\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - b ._13\n\ -._11:\n\ - .align 2, 0\n\ -._10:\n\ - .word gMain\n\ - .word 0x101\n\ - .word gSpecialVar_0x8004\n\ - .word gUnkDebug4Menu\n\ -._8:\n\ - cmp r1, #0x2\n\ - beq ._12 @cond_branch\n\ - mov r0, #0x0\n\ - b ._13\n\ -._12:\n\ - bl CloseMenu\n\ - mov r0, #0x1\n\ -._13:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1"); + if (gMain.newKeys == DPAD_UP) + Menu_MoveCursor(-1); + if (gMain.newKeys == DPAD_DOWN) + Menu_MoveCursor(1); + if (gMain.newKeys == A_BUTTON) + return gUnkDebug4Menu[Menu_GetCursorPos()].func(); + if (gMain.newKeys == (R_BUTTON | A_BUTTON)) + { + gSpecialVar_0x8004 = 1; + return gUnkDebug4Menu[Menu_GetCursorPos()].func(); + } + if (gMain.newKeys == B_BUTTON) + { + CloseMenu(); + return 1; + } + return 0; } -__attribute__((naked)) u8 debug_sub_8138CC4(void) { - asm("\n\ - push {lr}\n\ - add sp, sp, #0xfffffff8\n\ - ldr r1, ._14 @ gSpecialVar_0x8004\n\ - mov r0, #0x0\n\ - strh r0, [r1]\n\ - bl Menu_EraseScreen\n\ - mov r0, #0x13\n\ - mov r1, #0x0\n\ - mov r2, #0x1d\n\ - mov r3, #0xc\n\ - bl Menu_DrawStdWindowFrame\n\ - ldr r3, ._14 + 4 @ gUnkDebug4Menu\n\ - mov r0, #0x14\n\ - mov r1, #0x1\n\ - mov r2, #0x5\n\ - bl Menu_PrintItems\n\ - mov r0, #0x0\n\ - str r0, [sp]\n\ - mov r0, #0x8\n\ - str r0, [sp, #0x4]\n\ - mov r0, #0x0\n\ - mov r1, #0x14\n\ - mov r2, #0x1\n\ - mov r3, #0x5\n\ - bl InitMenu\n\ - ldr r1, ._14 + 8 @ gMenuCallback\n\ - ldr r0, ._14 + 12 @ debug_sub_8138C54\n\ - str r0, [r1]\n\ - mov r0, #0x0\n\ - add sp, sp, #0x8\n\ - pop {r1}\n\ - bx r1\n\ -._15:\n\ - .align 2, 0\n\ -._14:\n\ - .word gSpecialVar_0x8004\n\ - .word gUnkDebug4Menu\n\ - .word gMenuCallback\n\ - .word debug_sub_8138C54+1"); + gSpecialVar_0x8004 = 0; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(19, 0, 29, 12); + Menu_PrintItems(20, 1, 5, gUnkDebug4Menu); + InitMenu(0, 20, 1, 5, 0, 8); + gMenuCallback = debug_sub_8138C54; + return 0; } #endif @@ -370,40 +280,18 @@ void CableCar(void) #if DEBUG -__attribute__((naked)) -u8 debug_sub_8138D74(void) +void debug_sub_8138D74(void) { - asm("\n\ - push {lr}\n\ - ldr r1, ._21 @ gSpecialVar_0x8004\n\ - mov r0, #0x0\n\ - strh r0, [r1]\n\ - bl CloseMenu\n\ - bl CableCar\n\ - pop {r0}\n\ - bx r0\n\ -._22:\n\ - .align 2, 0\n\ -._21:\n\ - .word gSpecialVar_0x8004"); + gSpecialVar_0x8004 = 0; + CloseMenu(); + CableCar(); } -__attribute__((naked)) -u8 debug_sub_8138D8C(void) +void debug_sub_8138D8C(void) { - asm("\n\ - push {lr}\n\ - ldr r1, ._23 @ gSpecialVar_0x8004\n\ - mov r0, #0x1\n\ - strh r0, [r1]\n\ - bl CloseMenu\n\ - bl CableCar\n\ - pop {r0}\n\ - bx r0\n\ -._24:\n\ - .align 2, 0\n\ -._23:\n\ - .word gSpecialVar_0x8004"); + gSpecialVar_0x8004 = 1; + CloseMenu(); + CableCar(); } #endif -- cgit v1.2.3 From 18837b385535975044c14ed9a735833dc7d02126 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Fri, 16 Feb 2018 00:57:15 -0600 Subject: decompile some debug code in slot_machine.c --- src/battle/battle_controller_player.c | 316 +++++----- src/field/choose_party.c | 121 +--- src/field/slot_machine.c | 1047 ++++----------------------------- 3 files changed, 312 insertions(+), 1172 deletions(-) (limited to 'src') diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index fb2c5ed51..16735018a 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -761,38 +761,38 @@ void sub_802C68C(void) #if DEBUG else if (gUnknown_020297ED == 1 && (gMain.newKeys & START_BUTTON)) { - const u8 *moveName; - s32 i; - - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x3A); - moveName = gMoveNames[GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1)]; - Text_InitWindowAndPrintText(&gUnknown_03004210, moveName, 0x100, 2, 0x37); - ConvertIntToDecimalStringN( - gDisplayedStringBattle, - GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1), - 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x110, 10, 0x37); - Text_InitWindowAndPrintText(&gUnknown_03004210, gString_TurnJP, 0x116, 1, 0x39); - ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x11C, 4, 0x39); - for (i = 0; i < 64; i++) - { - if (gSprites[i].inUse) - count++; - } - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x122, 8, 0x39); - count = GetTaskCount(); - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x126, 11, 0x39); - for (i = 0, count = 0; i < 32; i++) - { - if (gOamMatrixAllocBitmap & (1 << i)) - count++; - } - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x12A, 14, 0x39); - gBattleBankFunc[gActiveBank] = debug_sub_8030C24; + const u8 *moveName; + s32 i; + + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x3A); + moveName = gMoveNames[GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1)]; + Text_InitWindowAndPrintText(&gUnknown_03004210, moveName, 0x100, 2, 0x37); + ConvertIntToDecimalStringN( + gDisplayedStringBattle, + GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1), + 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x110, 10, 0x37); + Text_InitWindowAndPrintText(&gUnknown_03004210, gString_TurnJP, 0x116, 1, 0x39); + ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x11C, 4, 0x39); + for (i = 0; i < 64; i++) + { + if (gSprites[i].inUse) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x122, 8, 0x39); + count = GetTaskCount(); + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x126, 11, 0x39); + for (i = 0, count = 0; i < 32; i++) + { + if (gOamMatrixAllocBitmap & (1 << i)) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x12A, 14, 0x39); + gBattleBankFunc[gActiveBank] = debug_sub_8030C24; } #endif } @@ -1008,117 +1008,117 @@ void debug_sub_803107C(void); void debug_sub_8030C24(void) { s16 move = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1); - + switch (gMain.newAndRepeatedKeys) { case START_BUTTON: - dp11b_obj_free(gActiveBank, 1); - dp11b_obj_free(gActiveBank, 0); - gBankAttacker = gActiveBank; - if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - gBankTarget = gBankAttacker ^ 2; - else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - gBankTarget = GetBankByIdentity(3); - else - gBankTarget = GetBankByIdentity(1); - sub_80326EC(0); - DoMoveAnim(move); - gBattleBankFunc[gActiveBank] = debug_sub_803107C; - break; + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + gBankAttacker = gActiveBank; + if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + gBankTarget = gBankAttacker ^ 2; + else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + gBankTarget = GetBankByIdentity(3); + else + gBankTarget = GetBankByIdentity(1); + sub_80326EC(0); + DoMoveAnim(move); + gBattleBankFunc[gActiveBank] = debug_sub_803107C; + break; case SELECT_BUTTON: - dp11b_obj_free(gActiveBank, 1); - dp11b_obj_free(gActiveBank, 0); - gBankTarget = gActiveBank; - if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - gBankAttacker = gBankTarget ^ 2; - else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - gBankAttacker = GetBankByIdentity(3); - else - gBankAttacker = GetBankByIdentity(1); - sub_80326EC(0); - DoMoveAnim(move); - gBattleBankFunc[gActiveBank] = debug_sub_803107C; - break; + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + gBankTarget = gActiveBank; + if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + gBankAttacker = gBankTarget ^ 2; + else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + gBankAttacker = GetBankByIdentity(3); + else + gBankAttacker = GetBankByIdentity(1); + sub_80326EC(0); + DoMoveAnim(move); + gBattleBankFunc[gActiveBank] = debug_sub_803107C; + break; case R_BUTTON: - if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - dp11b_obj_free(gActiveBank, 1); - dp11b_obj_free(gActiveBank, 0); - gBankAttacker = GetBankByIdentity(3); - gBankTarget = GetBankByIdentity(1); - sub_80326EC(0); - DoMoveAnim(move); - gBattleBankFunc[gActiveBank] = debug_sub_803107C; - } - else - { - move += 9; + if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + gBankAttacker = GetBankByIdentity(3); + gBankTarget = GetBankByIdentity(1); + sub_80326EC(0); + DoMoveAnim(move); + gBattleBankFunc[gActiveBank] = debug_sub_803107C; + } + else + { + move += 9; case DPAD_RIGHT: - if (++move > 354) - move = 1; - SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move); - gBattleMons[gActiveBank].moves[0] = move; - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); - Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37); - ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37); - } - break; + if (++move > 354) + move = 1; + SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move); + gBattleMons[gActiveBank].moves[0] = move; + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); + Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37); + ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37); + } + break; case L_BUTTON: - if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - { - dp11b_obj_free(gActiveBank, 1); - dp11b_obj_free(gActiveBank, 0); - gBankAttacker = GetBankByIdentity(1); - gBankTarget = GetBankByIdentity(3); - sub_80326EC(0); - DoMoveAnim(move); - gBattleBankFunc[gActiveBank] = debug_sub_803107C; - } - else - { - move -= 9; + if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + gBankAttacker = GetBankByIdentity(1); + gBankTarget = GetBankByIdentity(3); + sub_80326EC(0); + DoMoveAnim(move); + gBattleBankFunc[gActiveBank] = debug_sub_803107C; + } + else + { + move -= 9; case DPAD_LEFT: - if (--move <= 0) - move = 354; - SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move); - gBattleMons[gActiveBank].moves[0] = move; - Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); - Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37); - ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37); - } - break; + if (--move <= 0) + move = 354; + SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move); + gBattleMons[gActiveBank].moves[0] = move; + Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); + Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37); + ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37); + } + break; case DPAD_UP: case DPAD_DOWN: - if (gMain.newAndRepeatedKeys == DPAD_UP) - gAnimMoveTurn--; - else - gAnimMoveTurn++; - ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 284, 4, 0x39); - break; - } - + if (gMain.newAndRepeatedKeys == DPAD_UP) + gAnimMoveTurn--; + else + gAnimMoveTurn++; + ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 284, 4, 0x39); + break; + } + if ((gMain.heldKeysRaw & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON)) { - u8 i; - u32 move; + u8 i; + u32 move; - for (i = 0; i < 4; i++) - { - StringCopy(gDisplayedStringBattle, BattleText_Format); - move = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i); - StringAppend(gDisplayedStringBattle, gMoveNames[move]); - Text_InitWindow( - &gUnknown_03004210, - gDisplayedStringBattle, - 0x100 + i * 16, - (i & 1) ? 10 : 2, - (i < 2) ? 0x37 : 0x39); - Text_PrintWindow8002F44(&gUnknown_03004210); - } - gBattleBankFunc[gActiveBank] = sub_802C68C; + for (i = 0; i < 4; i++) + { + StringCopy(gDisplayedStringBattle, BattleText_Format); + move = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i); + StringAppend(gDisplayedStringBattle, gMoveNames[move]); + Text_InitWindow( + &gUnknown_03004210, + gDisplayedStringBattle, + 0x100 + i * 16, + (i & 1) ? 10 : 2, + (i < 2) ? 0x37 : 0x39); + Text_PrintWindow8002F44(&gUnknown_03004210); + } + gBattleBankFunc[gActiveBank] = sub_802C68C; } } @@ -1129,33 +1129,33 @@ void debug_sub_803107C(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - s32 i; - - sub_80326EC(1); - dp11b_obj_instanciate(gActiveBank, 1, 7, 1); - dp11b_obj_instanciate(gActiveBank, 0, 7, 1); - - for (i = 0, count = 0; i < MAX_SPRITES; i++) - { - if (gSprites[i].inUse) - count++; - } - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 290, 8, 0x39); - - count = GetTaskCount(); - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 294, 11, 0x39); - - for (i = 0, count = 0; i < 32; i++) - { - if (gOamMatrixAllocBitmap & (1 << i)) - count++; - } - ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); - Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 298, 14, 0x39); - - gBattleBankFunc[gActiveBank] = debug_sub_8030C24; + s32 i; + + sub_80326EC(1); + dp11b_obj_instanciate(gActiveBank, 1, 7, 1); + dp11b_obj_instanciate(gActiveBank, 0, 7, 1); + + for (i = 0, count = 0; i < MAX_SPRITES; i++) + { + if (gSprites[i].inUse) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 290, 8, 0x39); + + count = GetTaskCount(); + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 294, 11, 0x39); + + for (i = 0, count = 0; i < 32; i++) + { + if (gOamMatrixAllocBitmap & (1 << i)) + count++; + } + ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); + Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 298, 14, 0x39); + + gBattleBankFunc[gActiveBank] = debug_sub_8030C24; } } @@ -2491,7 +2491,7 @@ void PlayerHandlecmd3(void) u8 i; u8 *dst; - MEMSET_ALT(&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][3 + i], + MEMSET_ALT(&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][3 + i], gBattleBufferA[gActiveBank][2], i, dst); PlayerBufferExecCompleted(); } diff --git a/src/field/choose_party.c b/src/field/choose_party.c index 7529c4271..4766b2fbb 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -23,7 +23,7 @@ extern u8 gPlayerPartyCount; extern u8 gLastFieldPokeMenuOpened; extern u8 gUnknown_020384F0; -extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; +extern struct UnknownPokemonStruct2 gUnknown_02023A00[3]; extern u8 gUnknown_0202E8F6; extern struct Pokemon gUnknown_030042FC[]; extern const u16 gBattleTowerBannedSpecies[]; @@ -529,104 +529,31 @@ static void BattleTowerEntryMenuCallback_Exit(u8 taskId) } #if DEBUG -__attribute__((naked)) -void debug_sub_81381B4() + +void debug_sub_81381B4(void) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " ldr r4, ._189 @ gUnknown_02023A00\n" - " add r0, r4, #0\n" - " mov r1, #0x0\n" - " mov r2, #0x60\n" - " bl memset\n" - " mov r7, #0x0\n" - " mov r8, r4\n" - " mov r0, #0x4\n" - " add r0, r0, r8\n" - " mov r9, r0\n" - "._188:\n" - " mov r0, #0x64\n" - " add r1, r7, #0\n" - " mul r1, r1, r0\n" - " ldr r0, ._189 + 4 @ gPlayerParty\n" - " add r5, r1, r0\n" - " add r0, r5, #0\n" - " mov r1, #0x41\n" - " bl GetMonData\n" - " lsl r4, r7, #0x5\n" - " mov r1, r8\n" - " add r6, r4, r1\n" - " strh r0, [r6]\n" - " lsl r0, r0, #0x10\n" - " cmp r0, #0\n" - " beq ._187 @cond_branch\n" - " add r0, r5, #0\n" - " mov r1, #0x38\n" - " bl GetMonData\n" - " strb r0, [r6, #0xf]\n" - " add r0, r5, #0\n" - " mov r1, #0x39\n" - " bl GetMonData\n" - " strh r0, [r6, #0x10]\n" - " add r0, r5, #0\n" - " mov r1, #0x3a\n" - " bl GetMonData\n" - " strh r0, [r6, #0x12]\n" - " add r0, r5, #0\n" - " mov r1, #0x37\n" - " bl GetMonData\n" - " mov r1, r8\n" - " add r1, r1, #0x14\n" - " add r1, r4, r1\n" - " str r0, [r1]\n" - " add r0, r5, #0\n" - " mov r1, #0xc\n" - " bl GetMonData\n" - " strh r0, [r6, #0x2]\n" - " add r0, r5, #0\n" - " mov r1, #0x0\n" - " bl GetMonData\n" - " mov r1, r8\n" - " add r1, r1, #0x18\n" - " add r1, r4, r1\n" - " str r0, [r1]\n" - " add r0, r5, #0\n" - " bl GetMonGender\n" - " strb r0, [r6, #0x1c]\n" - " add r4, r4, r9\n" - " add r0, r5, #0\n" - " mov r1, #0x2\n" - " add r2, r4, #0\n" - " bl GetMonData\n" - " add r0, r4, #0\n" - " bl Text_StripExtCtrlCodes\n" - " add r0, r5, #0\n" - " mov r1, #0x3\n" - " bl GetMonData\n" - " strb r0, [r6, #0x1d]\n" - "._187:\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r7, #0x2\n" - " bls ._188 @cond_branch\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._190:\n" - " .align 2, 0\n" - "._189:\n" - " .word gUnknown_02023A00\n" - " .word gPlayerParty+0x12c\n" - "\n" - ); + u8 i; + + memset(gUnknown_02023A00, 0, sizeof(gUnknown_02023A00)); + for (i = 0; i < 3; i++) + { + gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[3 + i], MON_DATA_SPECIES2); + if (gUnknown_02023A00[i].species != 0) + { + gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[3 + i], MON_DATA_LEVEL); + gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[3 + i], MON_DATA_HP); + gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[3 + i], MON_DATA_MAX_HP); + gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[3 + i], MON_DATA_STATUS); + gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM); + gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[3 + i], MON_DATA_PERSONALITY); + gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[3 + i]); + GetMonData(&gPlayerParty[3 + i], MON_DATA_NICKNAME, gUnknown_02023A00[i].nickname); + Text_StripExtCtrlCodes(gUnknown_02023A00[i].nickname); + gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[3 + i], MON_DATA_LANGUAGE); + } + } } + #endif bool8 SetupLinkMultiBattlePartyMenu(void) diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 2c97c146d..9cc78bd44 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -226,6 +226,12 @@ static void sub_81064B8(void); static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4); static void sub_81065DC(void); +static void debug_sub_811B5D0(void); +static void debug_sub_811B620(void); +static void debug_sub_811B5B4(); +static void debug_sub_811B894(void); +static u8 debug_sub_811B634(void); + #if DEBUG __attribute__((section(".bss"))) u8 unk_debug_bss_1_0 = 0; __attribute__((section(".bss"))) u8 unk_debug_bss_1_1 = 0; @@ -391,135 +397,6 @@ static void SlotMachineSetup_2_1(void) static const s16 gUnknown_083ECCF8[][2]; -#if DEBUG -__attribute__((naked)) -static void SlotMachineSetup_0_1(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - bl sub_81019EC\n\ - ldr r5, ._43 @ \n\ - mov r4, #0x0\n\ - strb r4, [r5]\n\ - strb r4, [r5, #0x2]\n\ - bl Random\n\ - mov r1, #0x1\n\ - and r1, r1, r0\n\ - strb r1, [r5, #0x3]\n\ - strb r4, [r5, #0x4]\n\ - mov r0, #0x0\n\ - strh r4, [r5, #0x8]\n\ - strb r0, [r5, #0xa]\n\ - strb r0, [r5, #0xb]\n\ - ldr r0, ._43 + 4 @ \n\ - ldr r1, ._43 + 8 @ \n\ - add r0, r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r5, #0xc]\n\ - strh r4, [r5, #0xe]\n\ - strh r4, [r5, #0x10]\n\ - strh r4, [r5, #0x12]\n\ - strh r4, [r5, #0x18]\n\ - mov r0, #0x8\n\ - strh r0, [r5, #0x1a]\n\ - add r1, r5, #0\n\ - add r1, r1, #0x58\n\ - mov r0, #0xf0\n\ - strh r0, [r1]\n\ - add r1, r1, #0x2\n\ - mov r0, #0xa0\n\ - strh r0, [r1]\n\ - add r0, r5, #0\n\ - add r0, r0, #0x5c\n\ - mov r1, #0x3f\n\ - strh r1, [r0]\n\ - add r0, r0, #0x2\n\ - strh r1, [r0]\n\ - bl GetCurrentMapMusic\n\ - add r1, r5, #0\n\ - add r1, r1, #0x60\n\ - strh r0, [r1]\n\ - mov r7, #0x0\n\ - add r6, r5, #0\n\ - ldr r2, ._43 + 12 @ \n\ - mov sl, r2\n\ - mov r0, #0x1c\n\ - add r0, r0, r6\n\ - mov r9, r0\n\ -._41:\n\ - lsl r5, r7, #0x1\n\ - mov r1, #0x22\n\ - add r1, r1, r6\n\ - mov r8, r1\n\ - add r1, r5, r1\n\ - mov r0, #0x0\n\ - strh r0, [r1]\n\ - add r4, r6, #0\n\ - add r4, r4, #0x28\n\ - add r4, r5, r4\n\ - ldrb r0, [r6, #0x3]\n\ - lsl r0, r0, #0x1\n\ - lsl r1, r7, #0x2\n\ - add r0, r0, r1\n\ - add r0, r0, sl\n\ - mov r2, #0x0\n\ - ldsh r0, [r0, r2]\n\ - mov r1, #0x15\n\ - bl __modsi3\n\ - strh r0, [r4]\n\ - add r5, r5, r9\n\ - mov r1, #0x0\n\ - ldsh r0, [r4, r1]\n\ - lsl r1, r0, #0x1\n\ - add r1, r1, r0\n\ - lsl r1, r1, #0x3\n\ - mov r2, #0xfc\n\ - lsl r2, r2, #0x1\n\ - add r0, r2, #0\n\ - sub r0, r0, r1\n\ - strh r0, [r5]\n\ - mov r1, #0x0\n\ - ldsh r0, [r5, r1]\n\ - add r1, r2, #0\n\ - bl __modsi3\n\ - strh r0, [r5]\n\ - add r0, r7, #1\n\ - lsl r0, r0, #0x18\n\ - lsr r7, r0, #0x18\n\ - cmp r7, #0x2\n\ - bls ._41 @cond_branch\n\ - bl debug_sub_811B5D0\n\ - ldr r0, ._43 + 16 @ \n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._42 @cond_branch\n\ - mov r1, r8\n\ - sub r1, r1, #0x22\n\ - mov r0, #0xfa\n\ - lsl r0, r0, #0x2\n\ - strh r0, [r1, #0xc]\n\ -._42:\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._44:\n\ - .align 2, 0\n\ -._43:\n\ - .word +0x2000000\n\ - .word gSaveBlock1\n\ - .word 0x494\n\ - .word gUnknown_083ECCF8\n\ - .word unk_debug_bss_1_1"); -} -#else static void SlotMachineSetup_0_1(void) { u8 i; @@ -550,8 +427,12 @@ static void SlotMachineSetup_0_1(void) eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->reelPositions[i] * 24; eSlotMachine->unk1C[i] %= 0x1f8; } -} +#if DEBUG + debug_sub_811B5D0(); + if (unk_debug_bss_1_1 != 0) + eSlotMachine->coins = 1000; #endif +} static void SlotMachineSetup_3_0(void) { @@ -676,265 +557,53 @@ static bool8 sub_8101DB0(struct Task *task) static bool8 sub_8101DF4(struct Task *task) { if (sub_8104E18()) - { eSlotMachine->state = 4; - } return FALSE; } -#if DEBUG -__attribute__((naked)) -static bool8 sub_8101E10(struct Task *task) -{ - asm("\ - push {lr}\n\ - mov r0, #0x0\n\ - bl sub_8104CAC\n\ - ldr r2, ._70 @ \n\ - mov r0, #0x5\n\ - strb r0, [r2]\n\ - ldr r0, ._70 + 4 @ \n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._67 @cond_branch\n\ - ldr r0, ._70 + 8 @ \n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._69 @cond_branch\n\ -._67:\n\ - mov r0, #0xc\n\ - ldsh r1, [r2, r0]\n\ - ldr r0, ._70 + 12 @ \n\ - cmp r1, r0\n\ - ble ._69 @cond_branch\n\ - mov r0, #0x17\n\ - strb r0, [r2]\n\ -._69:\n\ - mov r0, #0x1\n\ - pop {r1}\n\ - bx r1\n\ -._71:\n\ - .align 2, 0\n\ -._70:\n\ - .word +0x2000000\n\ - .word unk_debug_bss_1_1\n\ - .word unk_debug_bss_1_4\n\ - .word 0x270e"); -} -#else static bool8 sub_8101E10(struct Task *task) { sub_8104CAC(0); eSlotMachine->state = 5; - if (eSlotMachine->coins >= 9999) - { + if ( +#if DEBUG + (unk_debug_bss_1_1 == 0 || unk_debug_bss_1_4 == 0) && +#endif + eSlotMachine->coins >= 9999) eSlotMachine->state = 23; - } return TRUE; } -#endif -#if DEBUG -__attribute__((naked)) -static bool8 sub_8101E3C(struct Task *task) -{ - asm("\ - push {r4, r5, lr}\n\ - ldr r0, ._77 @ unk_debug_bss_1_1\n\ - ldrb r1, [r0]\n\ - add r3, r0, #0\n\ - ldr r5, ._77 + 4 @ gMain\n\ - cmp r1, #0\n\ - beq ._76 @cond_branch\n\ - ldr r2, ._77 + 8 @ unk_debug_bss_1_4\n\ - ldrb r0, [r2]\n\ - cmp r0, #0\n\ - beq ._76 @cond_branch\n\ - ldr r4, ._77 + 12 @ \n\ - mov r1, #0xc\n\ - ldsh r0, [r4, r1]\n\ - cmp r0, #0x3\n\ - ble ._74 @cond_branch\n\ - ldrh r1, [r5, #0x2c]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._75 @cond_branch\n\ -._74:\n\ - mov r0, #0x0\n\ - strb r0, [r2]\n\ - b ._76\n\ -._78:\n\ - .align 2, 0\n\ -._77:\n\ - .word unk_debug_bss_1_1\n\ - .word gMain\n\ - .word unk_debug_bss_1_4\n\ - .word +0x2000000\n\ -._75:\n\ - mov r0, #0x0\n\ - bl sub_8103D50\n\ - mov r0, #0x1\n\ - bl sub_8103D50\n\ - mov r0, #0x2\n\ - bl sub_8103D50\n\ - ldrh r0, [r4, #0xc]\n\ - sub r0, r0, #0x3\n\ - strh r0, [r4, #0xc]\n\ - mov r0, #0x3\n\ - strh r0, [r4, #0x12]\n\ - mov r0, #0x9\n\ - strb r0, [r4]\n\ - b ._102\n\ -._76:\n\ - ldrb r0, [r3]\n\ - cmp r0, #0\n\ - beq ._81 @cond_branch\n\ - ldrh r1, [r5, #0x2e]\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._81 @cond_branch\n\ - bl debug_sub_811B620\n\ - ldr r1, ._83 @ \n\ - mov r0, #0x1d\n\ - strb r0, [r1]\n\ - b ._102\n\ -._84:\n\ - .align 2, 0\n\ -._83:\n\ - .word +0x2000000\n\ -._81:\n\ - ldrh r1, [r5, #0x2e]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._85 @cond_branch\n\ - mov r0, #0x0\n\ - bl sub_8104AB8\n\ - ldr r1, ._87 @ \n\ - mov r0, #0x8\n\ - strb r0, [r1]\n\ - b ._102\n\ -._88:\n\ - .align 2, 0\n\ -._87:\n\ - .word +0x2000000\n\ -._85:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._89 @cond_branch\n\ - ldr r2, ._94 @ \n\ - mov r3, #0xc\n\ - ldsh r0, [r2, r3]\n\ - sub r0, r0, #0x3\n\ - mov r3, #0x12\n\ - ldsh r1, [r2, r3]\n\ - add r0, r0, r1\n\ - cmp r0, #0\n\ - blt ._90 @cond_branch\n\ - ldrh r4, [r2, #0x12]\n\ - add r0, r1, #0\n\ - cmp r0, #0x2\n\ - bgt ._91 @cond_branch\n\ -._92:\n\ - lsl r0, r4, #0x18\n\ - lsr r0, r0, #0x18\n\ - bl sub_8103D50\n\ - lsl r0, r4, #0x10\n\ - mov r2, #0x80\n\ - lsl r2, r2, #0x9\n\ - add r0, r0, r2\n\ - lsr r4, r0, #0x10\n\ - asr r0, r0, #0x10\n\ - cmp r0, #0x2\n\ - ble ._92 @cond_branch\n\ -._91:\n\ - ldr r1, ._94 @ \n\ - ldrh r0, [r1, #0xc]\n\ - sub r0, r0, #0x3\n\ - ldrh r3, [r1, #0x12]\n\ - add r0, r0, r3\n\ - strh r0, [r1, #0xc]\n\ - mov r0, #0x3\n\ - strh r0, [r1, #0x12]\n\ - mov r0, #0x9\n\ - strb r0, [r1]\n\ - mov r0, #0x5f\n\ - bl PlaySE\n\ - b ._102\n\ -._95:\n\ - .align 2, 0\n\ -._94:\n\ - .word +0x2000000\n\ -._90:\n\ - mov r0, #0x6\n\ - b ._96\n\ -._89:\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._98 @cond_branch\n\ - ldr r4, ._103 @ \n\ - mov r1, #0xc\n\ - ldsh r0, [r4, r1]\n\ - cmp r0, #0\n\ - beq ._98 @cond_branch\n\ - mov r0, #0x5f\n\ - bl PlaySE\n\ - ldrb r0, [r4, #0x12]\n\ - bl sub_8103D50\n\ - ldrh r0, [r4, #0xc]\n\ - sub r0, r0, #0x1\n\ - strh r0, [r4, #0xc]\n\ - ldrh r0, [r4, #0x12]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4, #0x12]\n\ -._98:\n\ - ldr r0, ._103 @ \n\ - mov r2, #0x12\n\ - ldsh r1, [r0, r2]\n\ - add r2, r0, #0\n\ - ldr r5, ._103 + 4 @ \n\ - cmp r1, #0x2\n\ - bgt ._99 @cond_branch\n\ - cmp r1, #0\n\ - beq ._101 @cond_branch\n\ - ldrh r1, [r5, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._101 @cond_branch\n\ -._99:\n\ - mov r0, #0x9\n\ - strb r0, [r2]\n\ -._101:\n\ - ldrh r1, [r5, #0x2e]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._102 @cond_branch\n\ - mov r0, #0x15\n\ -._96:\n\ - strb r0, [r2]\n\ -._102:\n\ - mov r0, #0x0\n\ - pop {r4, r5}\n\ - pop {r1}\n\ - bx r1\n\ -._104:\n\ - .align 2, 0\n\ -._103:\n\ - .word +0x2000000\n\ - .word gMain"); -} -#else static bool8 sub_8101E3C(struct Task *task) { s16 i; +#if DEBUG + if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) + { + if (eSlotMachine->coins <= 3 || (gMain.heldKeys & B_BUTTON)) + { + unk_debug_bss_1_4 = 0; + } + else + { + sub_8103D50(0); + sub_8103D50(1); + sub_8103D50(2); + eSlotMachine->coins -= 3; + eSlotMachine->bet = 3; + eSlotMachine->state = 9; + return 0; + } + } + if (unk_debug_bss_1_1 != 0 && (gMain.newKeys & 8)) + { + debug_sub_811B620(); + eSlotMachine->state = 29; + return 0; + } +#endif + if (gMain.newKeys & SELECT_BUTTON) { sub_8104AB8(0); @@ -945,9 +614,7 @@ static bool8 sub_8101E3C(struct Task *task) if (eSlotMachine->coins - (3 - eSlotMachine->bet) >= 0) { for (i = eSlotMachine->bet; i < 3; i++) - { sub_8103D50(i); - } eSlotMachine->coins -= (3 - eSlotMachine->bet); eSlotMachine->bet = 3; eSlotMachine->state = 9; @@ -968,17 +635,12 @@ static bool8 sub_8101E3C(struct Task *task) eSlotMachine->bet++; } if (eSlotMachine->bet >= 3 || (eSlotMachine->bet != 0 && gMain.newKeys & A_BUTTON)) - { eSlotMachine->state = 9; - } if (gMain.newKeys & B_BUTTON) - { eSlotMachine->state = 21; - } } return FALSE; } -#endif static void sub_8101F2C(const u8 *str) { @@ -1006,77 +668,10 @@ static bool8 sub_8101F60(struct Task *task) static bool8 sub_8101F88(struct Task *task) { if (sub_8104AEC()) - { eSlotMachine->state = 5; - } return FALSE; } -#if DEBUG -__attribute__((naked)) -static bool8 sub_8101FA4(struct Task *task) -{ - asm("\ - push {r4, lr}\n\ - add r4, r0, #0\n\ - bl sub_8102484\n\ - bl sub_8104DA4\n\ - mov r0, #0x0\n\ - bl sub_8102DEC\n\ - mov r0, #0x1\n\ - bl sub_8102DEC\n\ - mov r0, #0x2\n\ - bl sub_8102DEC\n\ - mov r0, #0x0\n\ - strh r0, [r4, #0x8]\n\ - ldr r4, ._115 @ \n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x20\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._113 @cond_branch\n\ - bl sub_810430C\n\ - mov r0, #0xa\n\ - b ._114\n\ -._116:\n\ - .align 2, 0\n\ -._115:\n\ - .word +0x2000000\n\ -._113:\n\ - mov r0, #0x1\n\ - bl sub_8104CAC\n\ - mov r0, #0xb\n\ -._114:\n\ - strb r0, [r4]\n\ - ldr r4, ._119 @ \n\ - mov r0, #0x8\n\ - strh r0, [r4, #0x1a]\n\ - ldrb r0, [r4, #0xa]\n\ - cmp r0, #0\n\ - beq ._117 @cond_branch\n\ - bl dp15_jump_random_unknown\n\ - strh r0, [r4, #0x1a]\n\ -._117:\n\ - ldr r0, ._119 + 4 @ \n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._118 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x68\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._118:\n\ - mov r0, #0x0\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ -._120:\n\ - .align 2, 0\n\ -._119:\n\ - .word +0x2000000\n\ - .word unk_debug_bss_1_1"); -} -#else static bool8 sub_8101FA4(struct Task *task) { sub_8102484(); @@ -1097,12 +692,13 @@ static bool8 sub_8101FA4(struct Task *task) } eSlotMachine->unk1A = 8; if (eSlotMachine->unk0A) - { eSlotMachine->unk1A = dp15_jump_random_unknown(); - } +#if DEBUG + if (unk_debug_bss_1_1 != 0) + debug_sub_811B5B4(eSlotMachine->unk68, 1); +#endif return FALSE; } -#endif static bool8 sub_8102008(struct Task *task) { @@ -1115,134 +711,38 @@ static bool8 sub_8102008(struct Task *task) return FALSE; } -#if DEBUG -__attribute__((naked)) -static bool8 sub_8102034(struct Task *task) -{ - asm("\ - push {r4, lr}\n\ - ldrh r1, [r0, #0x8]\n\ - add r1, r1, #0x1\n\ - strh r1, [r0, #0x8]\n\ - lsl r1, r1, #0x10\n\ - asr r1, r1, #0x10\n\ - cmp r1, #0x1d\n\ - ble ._124 @cond_branch\n\ - ldr r0, ._127 @ unk_debug_bss_1_1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._126 @cond_branch\n\ - ldr r0, ._127 + 4 @ unk_debug_bss_1_4\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._126 @cond_branch\n\ - ldr r4, ._127 + 8 @ unk_debug_bss_1_8\n\ - bl Random\n\ - mov r1, #0x1f\n\ - and r1, r1, r0\n\ - add r1, r1, #0x1\n\ - str r1, [r4]\n\ -._126:\n\ - bl sub_81024F0\n\ - ldr r1, ._127 + 12 @ \n\ - mov r0, #0xc\n\ - strb r0, [r1]\n\ -._124:\n\ - mov r0, #0x0\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ -._128:\n\ - .align 2, 0\n\ -._127:\n\ - .word unk_debug_bss_1_1\n\ - .word unk_debug_bss_1_4\n\ - .word unk_debug_bss_1_8\n\ - .word +0x2000000"); -} -#else static bool8 sub_8102034(struct Task *task) { if (++task->data[0] >= 30) { +#if DEBUG + if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) + unk_debug_bss_1_8 = (Random() & 0x1F) + 1; +#endif sub_81024F0(); eSlotMachine->state = 12; } return FALSE; } -#endif -#if DEBUG -__attribute__((naked)) -static bool8 sub_8102058(struct Task *task) -{ - asm("\ - push {r4, r5, lr}\n\ - ldr r0, ._133 @ unk_debug_bss_1_1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._130 @cond_branch\n\ - ldr r0, ._133 + 4 @ unk_debug_bss_1_4\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._130 @cond_branch\n\ - ldr r5, ._133 + 8 @ unk_debug_bss_1_8\n\ - ldr r0, [r5]\n\ - sub r0, r0, #0x1\n\ - str r0, [r5]\n\ - cmp r0, #0\n\ - bne ._135 @cond_branch\n\ - mov r0, #0x18\n\ - bl PlaySE\n\ - ldr r4, ._133 + 12 @ \n\ - ldrb r0, [r4, #0x18]\n\ - bl sub_8102E1C\n\ - ldrb r0, [r4, #0x18]\n\ - bl sub_8103C14\n\ - bl Random\n\ - mov r1, #0x1f\n\ - and r1, r1, r0\n\ - add r1, r1, #0x1\n\ - str r1, [r5]\n\ - b ._132\n\ -._134:\n\ - .align 2, 0\n\ -._133:\n\ - .word unk_debug_bss_1_1\n\ - .word unk_debug_bss_1_4\n\ - .word unk_debug_bss_1_8\n\ - .word +0x2000000\n\ -._130:\n\ - ldr r0, ._136 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._135 @cond_branch\n\ - mov r0, #0x18\n\ - bl PlaySE\n\ - ldr r4, ._136 + 4 @ \n\ - ldrb r0, [r4, #0x18]\n\ - bl sub_8102E1C\n\ - ldrb r0, [r4, #0x18]\n\ - bl sub_8103C14\n\ -._132:\n\ - mov r0, #0xd\n\ - strb r0, [r4]\n\ -._135:\n\ - mov r0, #0x0\n\ - pop {r4, r5}\n\ - pop {r1}\n\ - bx r1\n\ -._137:\n\ - .align 2, 0\n\ -._136:\n\ - .word gMain\n\ - .word +0x2000000"); -} -#else static bool8 sub_8102058(struct Task *task) { +#if DEBUG + if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) + { + unk_debug_bss_1_8--; + if (unk_debug_bss_1_8 == 0) + { + PlaySE(0x18); + sub_8102E1C(eSlotMachine->unk18); + sub_8103C14(eSlotMachine->unk18); + unk_debug_bss_1_8 = (Random() & 0x1F) + 1; + eSlotMachine->state = 13; + } + return FALSE; + } +#endif + if (gMain.newKeys & A_BUTTON) { PlaySE(SE_JYUNI); @@ -1252,121 +752,7 @@ static bool8 sub_8102058(struct Task *task) } return FALSE; } -#endif -#if DEBUG -__attribute__((naked)) -static bool8 sub_8102090(struct Task *task) -{ - asm("\ - push {r4, lr}\n\ - ldr r4, ._146 @ \n\ - ldrb r0, [r4, #0x18]\n\ - bl sub_8102E40\n\ - lsl r0, r0, #0x18\n\ - lsr r2, r0, #0x18\n\ - cmp r2, #0\n\ - bne ._138 @cond_branch\n\ - ldrh r0, [r4, #0x18]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4, #0x18]\n\ - mov r1, #0xc\n\ - strb r1, [r4]\n\ - lsl r0, r0, #0x10\n\ - asr r0, r0, #0x10\n\ - cmp r0, #0x2\n\ - ble ._161 @cond_branch\n\ - mov r0, #0xe\n\ - strb r0, [r4]\n\ - ldr r0, ._146 + 4 @ \n\ - ldrb r0, [r0]\n\ - cmp r0, #0x8\n\ - beq ._140 @cond_branch\n\ - cmp r0, #0x8\n\ - bgt ._141 @cond_branch\n\ - cmp r0, #0x2\n\ - beq ._142 @cond_branch\n\ - cmp r0, #0x2\n\ - bgt ._143 @cond_branch\n\ - cmp r0, #0x1\n\ - beq ._144 @cond_branch\n\ - b ._161\n\ -._147:\n\ - .align 2, 0\n\ -._146:\n\ - .word +0x2000000\n\ - .word unk_debug_bss_1_0\n\ -._143:\n\ - cmp r0, #0x4\n\ - beq ._148 @cond_branch\n\ - b ._161\n\ -._141:\n\ - cmp r0, #0x40\n\ - beq ._150 @cond_branch\n\ - cmp r0, #0x40\n\ - bgt ._151 @cond_branch\n\ - cmp r0, #0x10\n\ - beq ._152 @cond_branch\n\ - b ._161\n\ -._151:\n\ - cmp r0, #0x80\n\ - beq ._154 @cond_branch\n\ - b ._161\n\ -._142:\n\ - mov r0, #0x14\n\ - strh r0, [r4, #0x28]\n\ - strh r0, [r4, #0x2a]\n\ - mov r0, #0x12\n\ - b ._160\n\ -._144:\n\ - mov r0, #0x14\n\ - strh r0, [r4, #0x28]\n\ - strh r0, [r4, #0x2a]\n\ - mov r0, #0x12\n\ - b ._160\n\ -._148:\n\ - mov r0, #0x3\n\ - strh r0, [r4, #0x28]\n\ - mov r0, #0x1\n\ - strh r0, [r4, #0x2a]\n\ - mov r0, #0x2\n\ - b ._160\n\ -._140:\n\ - strh r2, [r4, #0x28]\n\ - mov r0, #0x2\n\ - strh r0, [r4, #0x2a]\n\ - mov r0, #0x3\n\ - b ._160\n\ -._152:\n\ - mov r0, #0x2\n\ - strh r0, [r4, #0x28]\n\ - mov r0, #0x5\n\ - strh r0, [r4, #0x2a]\n\ - mov r0, #0x14\n\ - b ._160\n\ -._150:\n\ - mov r0, #0x13\n\ - strh r0, [r4, #0x28]\n\ - strh r0, [r4, #0x2a]\n\ - strh r2, [r4, #0x2c]\n\ - b ._161\n\ -._154:\n\ - mov r0, #0x13\n\ - strh r0, [r4, #0x28]\n\ - strh r0, [r4, #0x2a]\n\ -._160:\n\ - strh r0, [r4, #0x2c]\n\ -._161:\n\ - mov r0, #0x1\n\ - b ._162\n\ -._138:\n\ - mov r0, #0x0\n\ -._162:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1"); -} -#else static bool8 sub_8102090(struct Task *task) { if (!sub_8102E40(eSlotMachine->unk18)) @@ -1376,173 +762,52 @@ static bool8 sub_8102090(struct Task *task) if (eSlotMachine->unk18 > 2) { eSlotMachine->state = 14; +#if DEBUG + switch (unk_debug_bss_1_0) + { + case 2: + eSlotMachine->reelPositions[0] = 20; + eSlotMachine->reelPositions[1] = 20; + eSlotMachine->reelPositions[2] = 18; + break; + case 1: + eSlotMachine->reelPositions[0] = 20; + eSlotMachine->reelPositions[1] = 20; + eSlotMachine->reelPositions[2] = 18; + break; + case 4: + eSlotMachine->reelPositions[0] = 3; + eSlotMachine->reelPositions[1] = 1; + eSlotMachine->reelPositions[2] = 2; + break; + case 8: + eSlotMachine->reelPositions[0] = 0; + eSlotMachine->reelPositions[1] = 2; + eSlotMachine->reelPositions[2] = 3; + break; + case 0x10: + eSlotMachine->reelPositions[0] = 2; + eSlotMachine->reelPositions[1] = 5; + eSlotMachine->reelPositions[2] = 20; + break; + case 0x40: + eSlotMachine->reelPositions[0] = 19; + eSlotMachine->reelPositions[1] = 19; + eSlotMachine->reelPositions[2] = 0; + break; + case 0x80: + eSlotMachine->reelPositions[0] = 19; + eSlotMachine->reelPositions[1] = 19; + eSlotMachine->reelPositions[2] = 19; + break; + } +#endif } return TRUE; } return FALSE; } -#endif -#if DEBUG -__attribute__((naked)) -bool8 sub_81020C8(struct Task *task) -{ - asm("\ - push {r4, lr}\n\ - ldr r4, ._165 @ \n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0xc0\n\ - and r0, r0, r1\n\ - strb r0, [r4, #0x4]\n\ - bl CheckMatch\n\ - ldrb r0, [r4, #0xa]\n\ - cmp r0, #0\n\ - beq ._163 @cond_branch\n\ - sub r0, r0, #0x1\n\ - strb r0, [r4, #0xa]\n\ - ldrb r0, [r4, #0xb]\n\ - add r0, r0, #0x1\n\ - strb r0, [r4, #0xb]\n\ - b ._164\n\ -._166:\n\ - .align 2, 0\n\ -._165:\n\ - .word +0x2000000\n\ -._163:\n\ - bl debug_sub_811B894\n\ -._164:\n\ - ldr r4, ._171 @ \n\ - ldrh r0, [r4, #0x8]\n\ - cmp r0, #0\n\ - beq ._167 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x6c\n\ - mov r2, #0xe\n\ - ldsh r1, [r4, r2]\n\ - bl debug_sub_811B5B4\n\ - mov r0, #0xf\n\ - strb r0, [r4]\n\ - bl sub_8102A24\n\ - bl sub_8103F70\n\ - ldrh r0, [r4, #0x10]\n\ - ldrh r1, [r4, #0xe]\n\ - sub r0, r0, r1\n\ - strh r0, [r4, #0x10]\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - bge ._168 @cond_branch\n\ - mov r0, #0x0\n\ - strh r0, [r4, #0x10]\n\ -._168:\n\ - ldrh r1, [r4, #0x8]\n\ - mov r0, #0xc0\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._169 @cond_branch\n\ - ldr r0, ._171 + 4 @ \n\ - bl PlayFanfare\n\ - mov r0, #0x6\n\ - bl sub_8104CAC\n\ - b ._174\n\ -._172:\n\ - .align 2, 0\n\ -._171:\n\ - .word +0x2000000\n\ - .word 0x185\n\ -._169:\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._173 @cond_branch\n\ - ldr r0, ._175 @ 0x185\n\ - bl PlayFanfare\n\ - mov r0, #0x5\n\ - bl sub_8104CAC\n\ - b ._174\n\ -._176:\n\ - .align 2, 0\n\ -._175:\n\ - .word 0x185\n\ -._173:\n\ - mov r0, #0xc3\n\ - lsl r0, r0, #0x1\n\ - bl PlayFanfare\n\ - mov r0, #0x2\n\ - bl sub_8104CAC\n\ -._174:\n\ - ldr r1, ._183 @ \n\ - ldrh r3, [r1, #0x8]\n\ - mov r0, #0xe0\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r3\n\ - add r2, r1, #0\n\ - cmp r0, #0\n\ - beq ._179 @cond_branch\n\ - ldrb r1, [r2, #0x4]\n\ - mov r0, #0x3f\n\ - and r0, r0, r1\n\ - mov r1, #0x0\n\ - strb r0, [r2, #0x4]\n\ - mov r0, #0xc0\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r3\n\ - cmp r0, #0\n\ - beq ._179 @cond_branch\n\ - strb r1, [r2, #0xa]\n\ - strb r1, [r2, #0xb]\n\ - strb r1, [r2, #0x3]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r3\n\ - cmp r0, #0\n\ - beq ._179 @cond_branch\n\ - mov r0, #0x1\n\ - strb r0, [r2, #0x3]\n\ -._179:\n\ - ldrh r1, [r2, #0x8]\n\ - mov r0, #0x20\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._185 @cond_branch\n\ - ldrb r0, [r2, #0x2]\n\ - cmp r0, #0xf\n\ - bhi ._185 @cond_branch\n\ - add r0, r0, #0x1\n\ - strb r0, [r2, #0x2]\n\ - ldrb r0, [r2, #0x2]\n\ - bl sub_8104064\n\ - b ._185\n\ -._184:\n\ - .align 2, 0\n\ -._183:\n\ - .word +0x2000000\n\ -._167:\n\ - mov r0, #0x3\n\ - bl sub_8104CAC\n\ - mov r0, #0x14\n\ - strb r0, [r4]\n\ - ldrh r0, [r4, #0x12]\n\ - ldrh r1, [r4, #0x10]\n\ - add r0, r0, r1\n\ - strh r0, [r4, #0x10]\n\ - lsl r0, r0, #0x10\n\ - asr r0, r0, #0x10\n\ - ldr r1, ._186 @ 0x270f\n\ - cmp r0, r1\n\ - ble ._185 @cond_branch\n\ - strh r1, [r4, #0x10]\n\ -._185:\n\ - mov r0, #0x0\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ -._187:\n\ - .align 2, 0\n\ -._186:\n\ - .word 0x270f"); -} -#else bool8 sub_81020C8(struct Task *task) { eSlotMachine->unk04 &= 0xc0; @@ -1552,8 +817,18 @@ bool8 sub_81020C8(struct Task *task) eSlotMachine->unk0A--; eSlotMachine->unk0B++; } +#if DEBUG + else + { + debug_sub_811B894(); + } +#endif + if (eSlotMachine->matchedSymbols) { +#if DEBUG + debug_sub_811B5B4(eSlotMachine->unk6C, eSlotMachine->payout); +#endif eSlotMachine->state = 15; sub_8102A24(); sub_8103F70(); @@ -1585,9 +860,7 @@ bool8 sub_81020C8(struct Task *task) eSlotMachine->unk0B = 0; eSlotMachine->unk03 = 0; if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_BLUE)) - { eSlotMachine->unk03 = 1; - } } } if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER) && eSlotMachine->pikaPower < 16) @@ -1601,20 +874,15 @@ bool8 sub_81020C8(struct Task *task) sub_8104CAC(3); eSlotMachine->state = 20; if ((eSlotMachine->unk10 += eSlotMachine->bet) > 9999) - { eSlotMachine->unk10 = 9999; - } } return FALSE; } -#endif static bool8 sub_81021E0(struct Task *task) { if (sub_8102A44()) - { eSlotMachine->state = 16; - } return FALSE; } @@ -1624,18 +892,14 @@ static bool8 sub_81021FC(struct Task *task) { eSlotMachine->state = 19; if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_RED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE))) - { IncrementGameStat(GAME_STAT_SLOT_JACKPOTS); - } if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) { eSlotMachine->unk18 = 0; eSlotMachine->state = 9; } if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER)) - { eSlotMachine->state = 17; - } if (eSlotMachine->unk0A && eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) { sub_8104CAC(4); @@ -1758,56 +1022,18 @@ static bool8 sub_81023FC(struct Task *task) return FALSE; } -#if DEBUG -__attribute__((naked)) static bool8 sub_8102424(struct Task *task) { - asm("\ - push {lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._234 @ unk_debug_bss_1_1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._233 @cond_branch\n\ - ldr r0, ._234 + 4 @ gSaveBlock1\n\ - ldr r1, ._234 + 8 @ \n\ - ldrh r1, [r1, #0xc]\n\ - ldr r2, ._234 + 12 @ \n\ - add r0, r0, r2\n\ - strh r1, [r0]\n\ -._233:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - mov r1, #0x0\n\ - str r1, [sp]\n\ - mov r2, #0x0\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - ldr r1, ._234 + 8 @ \n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - mov r0, #0x0\n\ - add sp, sp, #0x4\n\ - pop {r1}\n\ - bx r1\n\ -._235:\n\ - .align 2, 0\n\ -._234:\n\ - .word unk_debug_bss_1_1\n\ - .word gSaveBlock1\n\ - .word +0x2000000\n\ - .word 0x494"); -} +#if DEBUG + if (unk_debug_bss_1_1 == 0) + gSaveBlock1.coins = eSlotMachine->coins; #else -static bool8 sub_8102424(struct Task *task) -{ gSaveBlock1.coins = eSlotMachine->coins; +#endif BeginNormalPaletteFade(-1, 0, 0, 16, 0); eSlotMachine->state++; return FALSE; } -#endif static bool8 sub_8102460(struct Task *task) { @@ -1819,27 +1045,14 @@ static bool8 sub_8102460(struct Task *task) } #if DEBUG -__attribute__((naked)) + static bool8 debug_sub_8116E74(struct Task *task) { - asm("\ - push {lr}\n\ - bl debug_sub_811B634\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._239 @cond_branch\n\ - ldr r1, ._240 @ \n\ - mov r0, #0x5\n\ - strb r0, [r1]\n\ -._239:\n\ - mov r0, #0x0\n\ - pop {r1}\n\ - bx r1\n\ -._241:\n\ - .align 2, 0\n\ -._240:\n\ - .word +0x2000000"); + if (debug_sub_811B634() != 0) + eSlotMachine->state = 5; + return FALSE; } + #endif #if DEBUG @@ -5674,7 +4887,7 @@ void debug_sub_811B310() } __attribute__((naked)) -void debug_sub_811B5B4() +static void debug_sub_811B5B4() { asm( " push {lr}\n" @@ -5698,7 +4911,7 @@ void debug_sub_811B5B4() } __attribute__((naked)) -void debug_sub_811B5D0() +static void debug_sub_811B5D0(void) { asm( " ldr r0, .__51\n" @@ -5743,7 +4956,7 @@ void debug_sub_811B5D0() } __attribute__((naked)) -void debug_sub_811B620() +static void debug_sub_811B620(void) { asm( " push {lr}\n" @@ -5761,7 +4974,7 @@ void debug_sub_811B620() } __attribute__((naked)) -void debug_sub_811B634() +static u8 debug_sub_811B634() { asm( " push {lr}\n" @@ -6094,7 +5307,7 @@ void debug_sub_811B654() } __attribute__((naked)) -void debug_sub_811B894() +static void debug_sub_811B894() { asm( " push {r4, r5, r6, r7, lr}\n" -- cgit v1.2.3 From edc214732e28e264a3d54afc01a44c2307604703 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Fri, 16 Feb 2018 18:41:05 -0600 Subject: finish decompiling debug code in slot_machine.c --- src/battle/battle_controller_player.c | 4 +- src/field/slot_machine.c | 2639 ++++++++++----------------------- 2 files changed, 757 insertions(+), 1886 deletions(-) (limited to 'src') diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 16735018a..1824f9182 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -778,7 +778,7 @@ void sub_802C68C(void) for (i = 0; i < 64; i++) { if (gSprites[i].inUse) - count++; + count++; } ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x122, 8, 0x39); @@ -788,7 +788,7 @@ void sub_802C68C(void) for (i = 0, count = 0; i < 32; i++) { if (gOamMatrixAllocBitmap & (1 << i)) - count++; + count++; } ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2); Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x12A, 14, 0x39); diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 9cc78bd44..6111cb27f 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -8,6 +8,7 @@ #include "sound.h" #include "main.h" #include "slot_machine.h" +#include "string_util.h" #include "decompress.h" #include "trig.h" #include "graphics.h" @@ -228,9 +229,10 @@ static void sub_81065DC(void); static void debug_sub_811B5D0(void); static void debug_sub_811B620(void); -static void debug_sub_811B5B4(); +static void debug_sub_811B5B4(s32 *, s32); static void debug_sub_811B894(void); static u8 debug_sub_811B634(void); +static void debug_sub_811B654(u8 taskId); #if DEBUG __attribute__((section(".bss"))) u8 unk_debug_bss_1_0 = 0; @@ -695,7 +697,7 @@ static bool8 sub_8101FA4(struct Task *task) eSlotMachine->unk1A = dp15_jump_random_unknown(); #if DEBUG if (unk_debug_bss_1_1 != 0) - debug_sub_811B5B4(eSlotMachine->unk68, 1); + debug_sub_811B5B4(&eSlotMachine->unk68, 1); #endif return FALSE; } @@ -827,7 +829,7 @@ bool8 sub_81020C8(struct Task *task) if (eSlotMachine->matchedSymbols) { #if DEBUG - debug_sub_811B5B4(eSlotMachine->unk6C, eSlotMachine->payout); + debug_sub_811B5B4(&eSlotMachine->unk6C, eSlotMachine->payout); #endif eSlotMachine->state = 15; sub_8102A24(); @@ -1055,248 +1057,81 @@ static bool8 debug_sub_8116E74(struct Task *task) #endif -#if DEBUG -__attribute__((naked)) static void sub_8102484(void) { - asm("\ - push {r4, r5, r6, lr}\n\ - ldr r0, ._256 @ \n\ - ldrb r2, [r0, #0xa]\n\ - add r4, r0, #0\n\ - cmp r2, #0\n\ - beq ._242 @cond_branch\n\ - b ._270\n\ -._242:\n\ - ldr r0, ._256 + 4 @ \n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._245 @cond_branch\n\ - ldr r3, ._256 + 8 @ \n\ - ldrb r0, [r3]\n\ - cmp r0, #0\n\ - beq ._245 @cond_branch\n\ - ldr r0, ._256 + 12 @ \n\ - ldrb r1, [r0]\n\ - strb r1, [r4, #0x4]\n\ - strb r2, [r3]\n\ - strb r2, [r0]\n\ - mov r0, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._246 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x88\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._246:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._247 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x84\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._247:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x20\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._248 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x8c\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._248:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x10\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._249 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x80\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._249:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._250 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x7c\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._250:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._251 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x78\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._251:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._252 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x74\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._252:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._253 @cond_branch\n\ - b ._270\n\ -._253:\n\ - add r0, r4, #0\n\ - add r0, r0, #0x70\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ - b ._270\n\ -._257:\n\ - .align 2, 0\n\ -._256:\n\ - .word +0x2000000\n\ - .word unk_debug_bss_1_1\n\ - .word unk_debug_bss_1_2\n\ - .word unk_debug_bss_1_3\n\ -._245:\n\ - add r5, r4, #0\n\ - ldrb r1, [r5, #0x4]\n\ - mov r0, #0xc0\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._270 @cond_branch\n\ - bl sub_8102540\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._260 @cond_branch\n\ - bl sub_8102578\n\ - lsl r0, r0, #0x18\n\ - lsr r6, r0, #0x18\n\ - cmp r6, #0x3\n\ - beq ._260 @cond_branch\n\ - ldr r1, ._271 @ gUnknown_083ECE42\n\ - lsl r0, r6, #0x1\n\ - add r0, r0, r1\n\ - ldrb r1, [r0]\n\ - ldrb r0, [r5, #0x4]\n\ - orr r0, r0, r1\n\ - strb r0, [r5, #0x4]\n\ - mov r1, #0x80\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._261 @cond_branch\n\ - add r0, r5, #0\n\ - add r0, r0, #0x88\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._261:\n\ - ldrb r1, [r5, #0x4]\n\ - mov r0, #0x40\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._262 @cond_branch\n\ - add r0, r5, #0\n\ - add r0, r0, #0x84\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._262:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x20\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._263 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x8c\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._263:\n\ - cmp r6, #0x1\n\ - bne ._270 @cond_branch\n\ -._260:\n\ - bl sub_81025BC\n\ - lsl r0, r0, #0x18\n\ - lsr r6, r0, #0x18\n\ - cmp r6, #0x5\n\ - beq ._270 @cond_branch\n\ - ldr r4, ._271 + 4 @ \n\ - ldr r1, ._271 + 8 @ \n\ - lsl r0, r6, #0x1\n\ - add r0, r0, r1\n\ - ldrb r1, [r0]\n\ - ldrb r0, [r4, #0x4]\n\ - orr r0, r0, r1\n\ - strb r0, [r4, #0x4]\n\ - mov r1, #0x10\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._266 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x80\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._266:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._267 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x7c\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._267:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._268 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x78\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._268:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._269 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x74\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._269:\n\ - ldrb r1, [r4, #0x4]\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._270 @cond_branch\n\ - add r0, r4, #0\n\ - add r0, r0, #0x70\n\ - mov r1, #0x1\n\ - bl debug_sub_811B5B4\n\ -._270:\n\ - pop {r4, r5, r6}\n\ - pop {r0}\n\ - bx r0\n\ -._272:\n\ - .align 2, 0\n\ -._271:\n\ - .word gUnknown_083ECE42\n\ - .word +0x2000000\n\ - .word gUnknown_083ECE48"); + u8 r3; + + if (eSlotMachine->unk0A == 0) + { +#if DEBUG + if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_2 != 0) + { + eSlotMachine->unk04 = unk_debug_bss_1_3; + unk_debug_bss_1_2 = 0; + unk_debug_bss_1_3 = 0; + if (eSlotMachine->unk04 & 0x80) + debug_sub_811B5B4(&eSlotMachine->unk88, 1); + if (eSlotMachine->unk04 & 0x40) + debug_sub_811B5B4(&eSlotMachine->unk84, 1); + if (eSlotMachine->unk04 & 0x20) + debug_sub_811B5B4(&eSlotMachine->unk8C, 1); + if (eSlotMachine->unk04 & 0x10) + debug_sub_811B5B4(&eSlotMachine->unk80, 1); + if (eSlotMachine->unk04 & 8) + debug_sub_811B5B4(&eSlotMachine->unk7C, 1); + if (eSlotMachine->unk04 & 4) + debug_sub_811B5B4(&eSlotMachine->unk78, 1); + if (eSlotMachine->unk04 & 1) + debug_sub_811B5B4(&eSlotMachine->unk74, 1); + if (eSlotMachine->unk04 & 2) + debug_sub_811B5B4(&eSlotMachine->unk70, 1); + return; + } +#endif + if (!(eSlotMachine->unk04 & 0xc0)) + { + if (sub_8102540()) + { + r3 = sub_8102578(); + if (r3 != 3) + { + eSlotMachine->unk04 |= gUnknown_083ECE42[r3]; +#if DEBUG + if (eSlotMachine->unk04 & 0x80) + debug_sub_811B5B4(&eSlotMachine->unk88, 1); + if (eSlotMachine->unk04 & 0x40) + debug_sub_811B5B4(&eSlotMachine->unk84, 1); + if (eSlotMachine->unk04 & 0x20) + debug_sub_811B5B4(&eSlotMachine->unk8C, 1); +#endif + if (r3 != 1) + { + return; + } + } + } + r3 = sub_81025BC(); + if (r3 != 5) + { + eSlotMachine->unk04 |= gUnknown_083ECE48[r3]; +#if DEBUG + if (eSlotMachine->unk04 & 0x10) + debug_sub_811B5B4(&eSlotMachine->unk80, 1); + if (eSlotMachine->unk04 & 8) + debug_sub_811B5B4(&eSlotMachine->unk7C, 1); + if (eSlotMachine->unk04 & 4) + debug_sub_811B5B4(&eSlotMachine->unk78, 1); + if (eSlotMachine->unk04 & 1) + debug_sub_811B5B4(&eSlotMachine->unk74, 1); + if (eSlotMachine->unk04 & 2) + debug_sub_811B5B4(&eSlotMachine->unk70, 1); +#endif + } + } + } } -#else + +/* static void sub_8102484(void) { u8 r3; @@ -1322,15 +1157,13 @@ static void sub_8102484(void) } } } -#endif +*/ static void sub_81024F0(void) { eSlotMachine->unk06 = 0; if (eSlotMachine->unk04) - { eSlotMachine->unk06 = 1; - } } static u8 sub_810250C(u8 a0) @@ -1340,9 +1173,7 @@ static u8 sub_810250C(u8 a0) for (i = 0; i < 8; i++) { if (a0 & 1) - { return gUnknown_083ECE3A[i]; - } a0 >>= 1; } return 0; @@ -1352,9 +1183,7 @@ static bool8 sub_8102540(void) { u8 rval = Random(); if (gUnknown_083ECD04[eSlotMachine->unk01][eSlotMachine->bet - 1] > rval) - { return TRUE; - } return FALSE; } @@ -1369,9 +1198,7 @@ static u8 sub_8102578(void) s16 rval = Random() & 0xff; s16 value = gUnknown_083ECD16[i][eSlotMachine->unk01]; if (value > rval) - { break; - } } return i; } @@ -1390,22 +1217,16 @@ static u8 sub_81025BC(void) { r3 += 10; if (r3 > 0x100) - { r3 = 0x100; - } } else if (i == 4 && eSlotMachine->unk03 == 1) { r3 -= 10; if (r3 < 0) - { r3 = 0; - } } if (r3 > rval) - { break; - } } return i; } @@ -1416,10 +1237,9 @@ static const u8 gUnknown_083ECDAC[][17]; static u8 sub_810264C(u8 a0) { if (eSlotMachine->unk03 == 0) - { return gUnknown_083ECD46[a0][eSlotMachine->pikaPower]; - } - return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower]; + else + return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower]; } static void sub_8102680(void) @@ -1430,16 +1250,12 @@ static void sub_8102680(void) eSlotMachine->unk05 = 0; rval = Random(); if (rval < sub_810264C(0)) - { return; - } for (i = 5; i > 0; i--) { rval = Random(); if (rval < sub_810264C(i)) - { break; - } } eSlotMachine->unk05 = i; } @@ -1450,10 +1266,9 @@ static bool8 sub_81026DC(u16 a0) { u16 rval = Random() & 0xff; if (rval < gUnknown_083ECE12[a0]) - { return TRUE; - } - return FALSE; + else + return FALSE; } static const u16 gUnknown_083ECE1C[][2]; @@ -1465,33 +1280,21 @@ static u16 dp15_jump_random_unknown(void) u8 rval; u8 value; if (eSlotMachine->unk10 >= 300) - { r4 = 4; - } else if (eSlotMachine->unk10 >= 250) - { r4 = 3; - } else if (eSlotMachine->unk10 >= 200) - { r4 = 2; - } else if (eSlotMachine->unk10 >= 150) - { r4 = 1; - } rval = Random() % 100; value = gUnknown_083ECE1C[r4][0]; if (rval < value) - { return 4; - } rval = Random() % 100; value = gUnknown_083ECE1C[r4][1] + gUnknown_083ECE30[eSlotMachine->unk0B]; if (rval < value) - { return 2; - } return 8; } @@ -1500,13 +1303,9 @@ static void CheckMatch(void) eSlotMachine->matchedSymbols = 0; CheckMatch_CenterRow(); if (eSlotMachine->bet > 1) - { CheckMatch_TopAndBottom(); - } if (eSlotMachine->bet > 2) - { CheckMatch_Diagonals(); - } } static const u16 sSlotMatchFlags[]; @@ -1539,9 +1338,7 @@ static void CheckMatch_TopAndBottom(void) if (match != SLOT_MACHINE_MATCHED_NONE) { if (match == SLOT_MACHINE_MATCHED_1CHERRY) - { match = SLOT_MACHINE_MATCHED_2CHERRY; - } eSlotMachine->payout += sSlotPayouts[match]; eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; sub_8103E04(1); @@ -1553,9 +1350,7 @@ static void CheckMatch_TopAndBottom(void) if (match != SLOT_MACHINE_MATCHED_NONE) { if (match == SLOT_MACHINE_MATCHED_1CHERRY) - { match = SLOT_MACHINE_MATCHED_2CHERRY; - } eSlotMachine->payout += sSlotPayouts[match]; eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; sub_8103E04(2); @@ -1599,21 +1394,13 @@ static const u8 sSym2Match[]; static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3) { if (c1 == c2 && c1 == c3) - { return sSym2Match[c1]; - } if (c1 == SLOT_MACHINE_TAG_7_RED && c2 == SLOT_MACHINE_TAG_7_RED && c3 == SLOT_MACHINE_TAG_7_BLUE) - { return SLOT_MACHINE_MATCHED_777_MIXED; - } if (c1 == SLOT_MACHINE_TAG_7_BLUE && c2 == SLOT_MACHINE_TAG_7_BLUE && c3 == SLOT_MACHINE_TAG_7_RED) - { return SLOT_MACHINE_MATCHED_777_MIXED; - } if (c1 == SLOT_MACHINE_TAG_CHERRY) - { return SLOT_MACHINE_MATCHED_1CHERRY; - } return SLOT_MACHINE_MATCHED_NONE; } @@ -1625,13 +1412,13 @@ static void sub_8102A24(void) static bool8 sub_8102A44(void) { if (FindTaskIdByFunc(sub_8102A64) == 0xff) - { return TRUE; - } - return FALSE; + else + return FALSE; } -static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = { +static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = +{ sub_8102A9C, sub_8102AD0, sub_8102B80 @@ -1639,7 +1426,8 @@ static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = { static void sub_8102A64(u8 taskId) { - while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId)); + while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId)) + ; } static bool8 sub_8102A9C(struct Task *task) @@ -1661,43 +1449,31 @@ static bool8 sub_8102AD0(struct Task *task) if (!task->data[1]--) { if (IsFanfareTaskInactive()) - { PlaySE(SE_PIN); - } eSlotMachine->payout--; if (eSlotMachine->coins < 9999) - { eSlotMachine->coins++; - } task->data[1] = 8; if (gMain.heldKeys & A_BUTTON) - { task->data[1] = 4; - } } if (IsFanfareTaskInactive() && gMain.newKeys & START_BUTTON) { PlaySE(SE_PIN); eSlotMachine->coins += eSlotMachine->payout; if (eSlotMachine->coins > 9999) - { eSlotMachine->coins = 9999; - } eSlotMachine->payout = 0; } if (eSlotMachine->payout == 0) - { task->data[0]++; - } return FALSE; } static bool8 sub_8102B80(struct Task *task) { if (sub_8103E7C()) - { DestroyTask(FindTaskIdByFunc(sub_8102A64)); - } return FALSE; } @@ -1707,9 +1483,7 @@ static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y) { s16 offset = (eSlotMachine->reelPositions[x] + y) % 21; if (offset < 0) - { offset += 21; - } return sReelSymbols[x][offset]; } @@ -1799,7 +1573,8 @@ static bool8 sub_8102E40(u8 a0) return gTasks[eSlotMachine->reelTasks[a0]].data[14]; } -static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = { +static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = +{ sub_8102EA0, sub_8102EA4, sub_8102EC0, @@ -1809,7 +1584,8 @@ static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = { static void sub_8102E68(u8 taskId) { - while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId)); + while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId)) + ; } static bool8 sub_8102EA0(struct Task *task) @@ -1823,12 +1599,15 @@ static bool8 sub_8102EA4(struct Task *task) return FALSE; } -static bool8 (*const gUnknown_083ECB40[])(void) = { +static bool8 (*const gUnknown_083ECB40[])(void) = +{ sub_810305C, sub_81032C0, sub_81033DC }; -static void (*const gUnknown_083ECB4C[])(void) = { + +static void (*const gUnknown_083ECB4C[])(void) = +{ sub_81034F4, sub_8103540, sub_810380C @@ -1853,9 +1632,7 @@ static bool8 sub_8102F4C(struct Task *task) u16 sp[] = {2, 4, 4, 4, 8}; s16 r2 = eSlotMachine->unk1C[task->data[15]] % 24; if (r2 != 0) - { r2 = sub_8102CCC(task->data[15], eSlotMachine->unk1A); - } else if (eSlotMachine->unk2E[task->data[15]]) { eSlotMachine->unk2E[task->data[15]]--; @@ -1877,9 +1654,7 @@ static bool8 sub_8103008(struct Task *task) task->data[1] = -task->data[1]; task->data[2]++; if ((task->data[2] & 0x3) == 0) - { task->data[1] >>= 1; - } if (task->data[1] == 0) { task->data[0] = 0; @@ -1889,7 +1664,8 @@ static bool8 sub_8103008(struct Task *task) return FALSE; } -static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = { +static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = +{ sub_8103154, sub_81031B4, sub_81031B4 @@ -1921,19 +1697,17 @@ static bool8 sub_81030A4(s16 y, u8 tag1, u8 tag2) static bool8 sub_81030E0(s16 y) { if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - y) == 4) - { return TRUE; - } - return FALSE; + else + return FALSE; } static bool8 sub_8103134(void) { if (eSlotMachine->unk04 & 0xc2) - { return TRUE; - } - return FALSE; + else + return FALSE; } static bool8 sub_8103154(u8 a0, u8 a1) @@ -1996,7 +1770,8 @@ static bool8 sub_81031B4(u8 tag1, u8 tag2) return FALSE; } -static bool8 (*const gUnknown_083ECB70[])(void) = { +static bool8 (*const gUnknown_083ECB70[])(void) = +{ sub_81032E8, sub_81032E8, sub_810333C @@ -2058,7 +1833,8 @@ static bool8 sub_810333C(void) return FALSE; } -static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = { +static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = +{ sub_810341C, sub_810341C, sub_810347C @@ -2100,14 +1876,11 @@ static bool8 sub_810347C(u8 a0) s16 i; s16 r8; if (eSlotMachine->unk34[0] == eSlotMachine->unk34[1]) - { return sub_810341C(a0); - } - r8 = 1; if (eSlotMachine->unk34[0] == 1) - { r8 = 3; - } + else + r8 = 1; for (i = 0; i < 5; i++) { if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - i) == a0) @@ -2122,8 +1895,10 @@ static bool8 sub_810347C(u8 a0) static void sub_81034F4(void) { - s16 i; - for (i = 0; sub_81030E0(i); i++); + s16 i = 0; + + while (sub_81030E0(i) != 0) + i++; eSlotMachine->unk2E[0] = i; } @@ -2142,7 +1917,8 @@ static bool8 sub_8103520(u8 *a0) return FALSE; } -static void (*const gUnknown_083ECB88[])(void) = { +static void (*const gUnknown_083ECB88[])(void) = +{ sub_8103564, j5_08111E84, sub_8103668 @@ -2263,19 +2039,17 @@ static void sub_8103668(void) static bool8 sub_8103764(u8 a0, u8 a1) { if ((a0 == 0 && a1 == 1) || (a0 == 1 && a1 == 0)) - { return TRUE; - } - return FALSE; + else + return FALSE; } static bool8 sub_810378C(u8 a0, u8 a1, u8 a2) { if ((a0 == 0 && a1 == 1 && a2 == 0) || (a0 == 1 && a1 == 0 && a2 == 1)) - { return TRUE; - } - return FALSE; + else + return FALSE; } static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2) @@ -2291,7 +2065,8 @@ static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2) return TRUE; } -static void (*const gUnknown_083ECB94[])(void) = { +static void (*const gUnknown_083ECB94[])(void) = +{ sub_8103830, sub_8103910, sub_8103A78 @@ -2313,9 +2088,7 @@ static void sub_8103830(void) { u8 r0; if (!(r5 == (r0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) || (r5 == 0 && r0 == 1) || (r5 == 1 && r0 == 0))) - { break; - } i++; } } @@ -2336,9 +2109,7 @@ static void sub_8103830(void) while (1) { if (r5 != GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) - { break; - } i++; } } @@ -2385,9 +2156,7 @@ static void sub_8103910(void) } } if (r8 == 0) - { break; - } sp0++; } eSlotMachine->unk2E[2] = sp0; @@ -2449,7 +2218,8 @@ static void sub_8103C14(u8 a0) sub_8103C48(taskId); } -static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = { +static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = +{ sub_8103C78, sub_8103CAC, sub_8103CC8 @@ -2501,18 +2271,14 @@ static void sub_8103D50(u8 a0) { u8 i; for (i = 0; i < gUnknown_083EDD3B[a0]; i++) - { sub_8103D00(gUnknown_083EDD35[a0][i]); - } } static void sub_8103D8C(u8 a0) { u8 i; for (i = 0; i < gUnknown_083EDD3B[a0]; i++) - { sub_8103D28(gUnknown_083EDD35[a0][i]); - } } static void sub_8103DC8(void) @@ -2542,7 +2308,7 @@ static bool8 sub_8103E38(void) u8 i; for (i = 0; i < 5; i++) { - struct Sprite *sprite = gSprites + eSlotMachine->unk44[i]; + struct Sprite *sprite = &gSprites[eSlotMachine->unk44[i]]; if (sprite->data[1] && sprite->data[2]) return FALSE; } @@ -2629,9 +2395,7 @@ static void sub_8103FE8(u8 taskId) task->data[1] = 4; task->data[2] += task->data[3]; if (task->data[2] == 0 || task->data[2] == 2) - { task->data[3] = -task->data[3]; - } } LoadPalette(gUnknown_083EDDA0[task->data[2]], 0x10, 0x20); } @@ -2663,7 +2427,8 @@ static bool8 sub_81040C8(void) return gTasks[eSlotMachine->unk3E].data[15]; } -static void (*const gUnknown_083ECBB4[])(struct Task *task) = { +static void (*const gUnknown_083ECBB4[])(struct Task *task) = +{ nullsub_68, sub_810411C, sub_8104144, @@ -2677,7 +2442,6 @@ static void sub_81040E8(u8 taskId) static void nullsub_68(struct Task *task) { - } static void sub_810411C(struct Task *task) @@ -2686,10 +2450,11 @@ static void sub_810411C(struct Task *task) task->data[0]++; } -static const u16 gUnknown_083ECBC4[][2] = { +static const u16 gUnknown_083ECBC4[][2] = +{ {0x9e, 0x6e}, {0x9f, 0x6f}, - {0xaf, 0x7f} + {0xaf, 0x7f}, }; static void sub_8104144(struct Task *task) @@ -2781,7 +2546,8 @@ static bool8 sub_810432C(void) return FALSE; } -static void (*const gUnknown_083ECBD0[])(struct Task *task) = { +static void (*const gUnknown_083ECBD0[])(struct Task *task) = +{ sub_810437C, sub_81043EC, sub_8104468, @@ -2918,9 +2684,7 @@ static void sub_81045CC(struct Task *task) if (eSlotMachine->unk05) { if (eSlotMachine->unk0A <= task->data[6]) - { task->data[0]++; - } } else if (task->data[6] > 3) { @@ -2987,9 +2751,7 @@ static void sub_81046C0(struct Task *task) static void sub_8104764(struct Task *task) { if ((task->data[4] == 0 || --task->data[4] == 0) && !sub_81040C8()) - { task->data[0]++; - } } static void sub_8104794(struct Task *task) @@ -3001,13 +2763,9 @@ static void sub_8104794(struct Task *task) r4 = ((task->data[1] - 8) & 0xff) >> 3; REG_BG1HOFS = task->data[1] & 0x1ff; if (task->data[3] >> 3 <= 25) - { sub_8104A88(r4); - } else - { task->data[0]++; - } } static void sub_81047EC(struct Task *task) @@ -3038,21 +2796,15 @@ static void sub_81047EC(struct Task *task) static void sub_8104860(struct Task *task) { if (eSlotMachine->unk1A == task->data[1]) - { task->data[0]++; - } else if (eSlotMachine->unk1C[0] % 24 == 0 && (++task->data[2]& 0x07) == 0) - { eSlotMachine->unk1A >>= 1; - } } static void sub_81048A8(struct Task *task) { if (sub_8104E18()) - { DestroyTask(FindTaskIdByFunc(sub_810434C)); - } } static void sub_81048CC(struct Task *task) @@ -3148,10 +2900,12 @@ static bool8 sub_8104AEC(void) { if (FindTaskIdByFunc(sub_8104B0C) == 0xFF) return TRUE; - return FALSE; + else + return FALSE; } -static void (*const gUnknown_083ECC30[])(struct Task *task) = { +static void (*const gUnknown_083ECC30[])(struct Task *task) = +{ sub_8104B3C, sub_8104B60, sub_8104B80, @@ -3177,9 +2931,7 @@ static void sub_8104B3C(struct Task *task) static void sub_8104B60(struct Task *task) { if (!gPaletteFade.active) - { task->data[0]++; - } } static void sub_8104B80(struct Task *task) @@ -3226,9 +2978,7 @@ static void sub_8104C5C(void) task = gTasks + i; task->data[1] = -1; for (i = 4; i < 16; i++) - { task->data[i] = MAX_SPRITES; - } } static void LoadSlotMachineWheelOverlay(void); @@ -3307,8 +3057,9 @@ static bool8 sub_8104E18(void) return TRUE; } -static void (*const gUnknown_083ECC54[])(struct Task *task) = { - nullsub_69 +static void (*const gUnknown_083ECC54[])(struct Task *task) = +{ + nullsub_69, }; static void sub_8104E74(u8 taskId) @@ -3318,7 +3069,6 @@ static void sub_8104E74(u8 taskId) static void nullsub_69(struct Task *task) { - } static const struct SpriteTemplate gSpriteTemplate_83ED414; @@ -3354,14 +3104,11 @@ static void sub_8104F8C(void) { s16 i; s16 x; + for (x = 203, i = 1; i < 10000; i *= 10, x -= 7) - { sub_8104FF4(x, 23, 0, i); - } for (x = 235, i = 1; i < 10000; i *= 10, x -= 7) - { sub_8104FF4(x, 23, 1, i); - } } static const struct SpriteTemplate gSpriteTemplate_83ED42C; @@ -3424,9 +3171,7 @@ static void sub_8105170(struct Sprite *sprite) { sprite->pos2.y = sprite->pos2.x = 8; if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0)) - { sprite->pos2.y = -8; - } } } @@ -3438,14 +3183,14 @@ static const struct SubspriteTable gSubspriteTables_83ED75C[]; static void sub_81051C0(void) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED474, 0x170, 0x34, 7); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; SetSubspriteTables(sprite, gSubspriteTables_83ED73C); eSlotMachine->unk49[0] = spriteId; spriteId = CreateSprite(&gSpriteTemplate_83ED48C, 0x170, 0x54, 7); - sprite = gSprites + spriteId; + sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; SetSubspriteTables(sprite, gSubspriteTables_83ED75C); @@ -3458,7 +3203,7 @@ static const struct SubspriteTable gSubspriteTables_83ED78C[]; static void sub_8105284(void) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4A4, 0xa8 - gSpriteCoordOffsetX, 0x50, 7); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; SetSubspriteTables(sprite, gSubspriteTables_83ED78C); @@ -3474,7 +3219,7 @@ static void sub_81052EC(void) for (i = 0, r5 = 0; i < 3; i++, r5 += 20) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4BC, 0x170, 0x00, 10); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; sprite->data[7] = r5; @@ -3496,14 +3241,14 @@ static const struct SubspriteTable gSubspriteTables_83ED7B4[]; static void sub_81053A0(void) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x170, 0x64, 9); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = 1; SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); eSlotMachine->unk4E[0] = spriteId; spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x120, 0x68, 4); - sprite = gSprites + spriteId; + sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = 1; SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); @@ -3516,7 +3261,7 @@ static const struct SubspriteTable gSubspriteTables_83ED7D4[]; static void sub_810545C(void) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4EC, 0x170, 0x4c, 11); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = 1; SetSubspriteTables(sprite, gSubspriteTables_83ED7D4); @@ -3527,29 +3272,24 @@ static void sub_81054B8(void) { u8 i; - DestroySprite(gSprites + eSlotMachine->unk40); + DestroySprite(&gSprites[eSlotMachine->unk40]); for (i = 0; i < 2; i++) - { - DestroySprite(gSprites + eSlotMachine->unk49[i]); - } + DestroySprite(&gSprites[eSlotMachine->unk49[i]]); for (i = 0; i < 3; i++) - { - DestroySprite(gSprites + eSlotMachine->unk4B[i]); - } + DestroySprite(&gSprites[eSlotMachine->unk4B[i]]); } static void sub_8105524(void) { u8 i; + for (i = 0; i < 2; i++) - { - DestroySprite(gSprites + eSlotMachine->unk4E[i]); - } + DestroySprite(&gSprites[eSlotMachine->unk4E[i]]); } static void sub_8105554(void) { - DestroySprite(gSprites + eSlotMachine->unk42); + DestroySprite(&gSprites[eSlotMachine->unk42]); } static const struct SpriteTemplate gSpriteTemplate_83ED504; @@ -3557,7 +3297,7 @@ static const struct SpriteTemplate gSpriteTemplate_83ED504; static void sub_8105578(void) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0x98, 0x20, 5); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->hFlip = TRUE; eSlotMachine->unk50[0] = spriteId; @@ -3567,7 +3307,7 @@ static void sub_8105578(void) sprite->data[7] = 0x20; spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0xb8, 0x20, 5); - sprite = gSprites + spriteId; + sprite = &gSprites[spriteId]; sprite->oam.priority = 1; eSlotMachine->unk50[1] = spriteId; sprite->data[1] = 1; @@ -3608,9 +3348,7 @@ static void sub_81056C0(void) u8 i; for (i = 0; i < 2; i++) - { - DestroySprite(gSprites + eSlotMachine->unk50[i]); - } + DestroySprite(&gSprites[eSlotMachine->unk50[i]]); } static const struct SpriteTemplate gSpriteTemplate_83ED51C; @@ -3655,9 +3393,7 @@ static void sub_8105804(void) u8 i; MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, 0, 0, 0); for (i = 0; i < 2; i++) - { - DestroySprite(gSprites + eSlotMachine->unk52[i]); - } + DestroySprite(&gSprites[eSlotMachine->unk52[i]]); } static const struct SpriteTemplate gSpriteTemplate_83ED534; @@ -3676,7 +3412,7 @@ static void sub_8105894(struct Sprite *sprite) static void sub_81058A0(void) { - DestroySprite(gSprites + eSlotMachine->unk41); + DestroySprite(&gSprites[eSlotMachine->unk41]); } static const struct SpriteTemplate gSpriteTemplate_83ED54C; @@ -3688,7 +3424,7 @@ static void sub_81058C4(void) for (i = 0; i < 4; i++) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED54C, 0x50 - gSpriteCoordOffsetX, 0x44, 0); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = sp[i]; @@ -3719,7 +3455,7 @@ static void sub_81059B8(void) u8 i; for (i = 0; i < 4; i++) { - DestroySprite(gSprites + eSlotMachine->unk54[i]); + DestroySprite(&gSprites[eSlotMachine->unk54[i]]); } } @@ -3728,7 +3464,7 @@ static const struct SpriteTemplate gSpriteTemplate_83ED564; static void sub_81059E8(void) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED564, 0xa8, 0x3c, 8); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 1; sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; InitSpriteAffineAnim(sprite); @@ -3769,7 +3505,7 @@ u8 sub_8105ACC(void) static void sub_8105AEC(void) { - struct Sprite *sprite = gSprites + eSlotMachine->unk43; + struct Sprite *sprite = &gSprites[eSlotMachine->unk43]; FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } @@ -3779,7 +3515,7 @@ static const struct SpriteTemplate gSpriteTemplate_83ED6CC; static u8 sub_8105B1C(s16 x, s16 y) { u8 spriteId = CreateSprite(&gSpriteTemplate_83ED6CC, x, y, 12); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 2; sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; InitSpriteAffineAnim(sprite); @@ -3794,7 +3530,7 @@ static void sub_8105B70(struct Sprite *sprite) static void sub_8105B88(u8 spriteId) { - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } @@ -3813,7 +3549,7 @@ static const struct SubspriteTable *const gUnknown_083EDBC4[]; static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4) { u8 spriteId = CreateSprite(gUnknown_083EDB5C[templateIdx], x, y, 16); - struct Sprite *sprite = gSprites + spriteId; + struct Sprite *sprite = &gSprites[spriteId]; sprite->oam.priority = 3; sprite->callback = callback; sprite->data[6] = a4; @@ -3870,30 +3606,26 @@ static void sub_8105D3C(struct Sprite *sprite) { switch (sprite->data[0]) { - case 0: - sprite->pos1.x += 4; - if (sprite->pos1.x >= 0xd0) - { - sprite->pos1.x = 0xd0; - sprite->data[0]++; - } - break; - case 1: - if (++sprite->data[1] > 90) - { - sprite->data[0]++; - } - break; - case 2: - sprite->pos1.x += 4; - if (sprite->pos1.x >= 0x110) - { - sprite->data[0]++; - } - break; - case 3: - sprite->data[7] = 0; - break; + case 0: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 90) + sprite->data[0]++; + break; + case 2: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0x110) + sprite->data[0]++; + break; + case 3: + sprite->data[7] = 0; + break; } } @@ -3901,72 +3633,64 @@ static void sub_8105DA4(struct Sprite *sprite) { switch (sprite->data[0]) { - case 0: - sprite->pos1.x -= 4; - if (sprite->pos1.x <= 0xd0) - { - sprite->pos1.x = 0xd0; - sprite->data[0]++; - } - break; - case 1: - if (++sprite->data[1] > 90) - { - sprite->data[0]++; - } - break; - case 2: - sprite->pos1.x -= 4; - if (sprite->pos1.x <= 0x90) - { - sprite->data[0]++; - } - break; - case 3: - sprite->data[7] = 0; - break; - } -} - -static void sub_8105E08(struct Sprite *sprite) + case 0: + sprite->pos1.x -= 4; + if (sprite->pos1.x <= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 90) + sprite->data[0]++; + break; + case 2: + sprite->pos1.x -= 4; + if (sprite->pos1.x <= 0x90) + sprite->data[0]++; + break; + case 3: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105E08(struct Sprite *sprite) { switch (sprite->data[0]) { - case 0: - StartSpriteAnim(sprite, eSlotMachine->unk0A - 1); + case 0: + StartSpriteAnim(sprite, eSlotMachine->unk0A - 1); + sprite->data[0]++; + // fallthrough + case 1: + if (++sprite->data[1] >= 4) + { sprite->data[0]++; - // fallthrough - case 1: - if (++sprite->data[1] >= 4) - { - sprite->data[0]++; - sprite->data[1] = 0; - } - break; - case 2: - sprite->pos1.x += 4; - if (sprite->pos1.x >= 0xd0) - { - sprite->pos1.x = 0xd0; - sprite->data[0]++; - } - break; - case 3: - if (++sprite->data[1] > 90) - { - sprite->data[0]++; - } - break; - case 4: - sprite->pos1.x += 4; - if (sprite->pos1.x >= 0xf8) - { - sprite->data[0]++; - } - break; - case 5: - sprite->data[7] = 0; - break; + sprite->data[1] = 0; + } + break; + case 2: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 3: + if (++sprite->data[1] > 90) + sprite->data[0]++; + break; + case 4: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xf8) + sprite->data[0]++; + break; + case 5: + sprite->data[7] = 0; + break; } } @@ -3974,39 +3698,39 @@ static void sub_8105EB4(struct Sprite *sprite) { switch (sprite->data[0]) { - case 0: - sprite->animPaused = TRUE; + case 0: + sprite->animPaused = TRUE; + sprite->data[0]++; + // fallthrough + case 1: + sprite->pos1.y += 8; + if (sprite->pos1.y >= 0x70) + { + sprite->pos1.y = 0x70; + sprite->data[1] = 16; sprite->data[0]++; - // fallthrough - case 1: - sprite->pos1.y += 8; - if (sprite->pos1.y >= 0x70) - { - sprite->pos1.y = 0x70; - sprite->data[1] = 16; - sprite->data[0]++; - } - break; - case 2: - if (sprite->data[2] == 0) + } + break; + case 2: + if (sprite->data[2] == 0) + { + sprite->pos1.y -= sprite->data[1]; + sprite->data[1] = -sprite->data[1]; + if (++sprite->data[3] >= 2) { - sprite->pos1.y -= sprite->data[1]; - sprite->data[1] = -sprite->data[1]; - if (++sprite->data[3] >= 2) + sprite->data[1] >>= 2; + sprite->data[3] = 0; + if (sprite->data[1] == 0) { - sprite->data[1] >>= 2; - sprite->data[3] = 0; - if (sprite->data[1] == 0) - { - sprite->data[0]++; - sprite->data[7] = 0; - sprite->animPaused = FALSE; - } + sprite->data[0]++; + sprite->data[7] = 0; + sprite->animPaused = FALSE; } } - sprite->data[2]++; - sprite->data[2] &= 0x07; - break; + } + sprite->data[2]++; + sprite->data[2] &= 0x07; + break; } } @@ -4014,21 +3738,19 @@ static void sub_8105F54(struct Sprite *sprite) { switch (sprite->data[0]) { - case 0: - if (++sprite->data[1] > 8) - { - sprite->data[0]++; - } - break; - case 1: - sprite->pos1.y += 2; - if (sprite->pos1.y >= 0x30) - { - sprite->pos1.y = 0x30; - sprite->data[0]++; - sprite->data[7] = 0; - } - break; + case 0: + if (++sprite->data[1] > 8) + sprite->data[0]++; + break; + case 1: + sprite->pos1.y += 2; + if (sprite->pos1.y >= 0x30) + { + sprite->pos1.y = 0x30; + sprite->data[0]++; + sprite->data[7] = 0; + } + break; } } @@ -4036,35 +3758,33 @@ static void sub_8105F9C(struct Sprite *sprite) { switch (sprite->data[0]) { - case 0: - sprite->invisible = TRUE; - if (++sprite->data[1] > 0x20) - { - sprite->data[0]++; - sprite->data[1] = 5; - sprite->oam.mosaic = TRUE; - sprite->invisible = FALSE; - StartSpriteAnim(sprite, 1); - REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; - } - break; - case 1: - sprite->data[1] -= (sprite->data[2] >> 8); - if (sprite->data[1] < 0) - { - sprite->data[1] = 0; - } + case 0: + sprite->invisible = TRUE; + if (++sprite->data[1] > 0x20) + { + sprite->data[0]++; + sprite->data[1] = 5; + sprite->oam.mosaic = TRUE; + sprite->invisible = FALSE; + StartSpriteAnim(sprite, 1); REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; - sprite->data[2] &= 0xff; - sprite->data[2] += 0x80; - if (sprite->data[1] == 0) - { - sprite->data[0]++; - sprite->data[7] = 0; - sprite->oam.mosaic = FALSE; - StartSpriteAnim(sprite, 0); - } - break; + } + break; + case 1: + sprite->data[1] -= (sprite->data[2] >> 8); + if (sprite->data[1] < 0) + sprite->data[1] = 0; + REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; + sprite->data[2] &= 0xff; + sprite->data[2] += 0x80; + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->data[7] = 0; + sprite->oam.mosaic = FALSE; + StartSpriteAnim(sprite, 0); + } + break; } } @@ -4102,40 +3822,30 @@ static void sub_81060FC(struct Sprite *sprite) switch (sprite->data[0]) { - case 0: - sprite->pos2.x = sp00[sprite->data[6]]; - sprite->pos2.y = sp10[sprite->data[6]]; - sprite->data[1] = sp20[sprite->data[6]]; + case 0: + sprite->pos2.x = sp00[sprite->data[6]]; + sprite->pos2.y = sp10[sprite->data[6]]; + sprite->data[1] = sp20[sprite->data[6]]; + sprite->data[0]++; + // fallthrough + case 1: + if (sprite->data[1]-- == 0) sprite->data[0]++; - // fallthrough - case 1: - if (sprite->data[1]-- == 0) - { - sprite->data[0]++; - } - break; - case 2: - if (sprite->pos2.x > 0) - { - sprite->pos2.x -= 4; - } - else if (sprite->pos2.x < 0) - { - sprite->pos2.x += 4; - } - if (sprite->pos2.y > 0) - { - sprite->pos2.y -= 4; - } - else if (sprite->pos2.y < 0) - { - sprite->pos2.y += 4; - } - if (sprite->pos2.x == 0 && sprite->pos2.y == 0) - { - sprite->data[0]++; - } - break; + break; + case 2: + if (sprite->pos2.x > 0) + sprite->pos2.x -= 4; + else if (sprite->pos2.x < 0) + sprite->pos2.x += 4; + + if (sprite->pos2.y > 0) + sprite->pos2.y -= 4; + else if (sprite->pos2.y < 0) + sprite->pos2.y += 4; + + if (sprite->pos2.x == 0 && sprite->pos2.y == 0) + sprite->data[0]++; + break; } } @@ -4150,10 +3860,8 @@ static void sub_81061C8(struct Sprite *sprite) } sprite->pos2.x = Cos(sp0[sprite->data[6]], sprite->data[1]); sprite->pos2.y = Sin(sp0[sprite->data[6]], sprite->data[1]); - if (sprite->data[1]) - { + if (sprite->data[1] != 0) sprite->data[1]--; - } } static void sub_8106230(struct Sprite *sprite) @@ -4172,13 +3880,9 @@ static void sub_8106230(struct Sprite *sprite) sprite->data[2] = sprite->data[1] + 0xb0; sprite->data[3] = 0xf0 - sprite->data[1]; if (sprite->data[2] > 0xd0) - { sprite->data[2] = 0xd0; - } if (sprite->data[3] < 0xd0) - { sprite->data[3] = 0xd0; - } eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; if (sprite->data[1] > 0x33) { @@ -4188,9 +3892,7 @@ static void sub_8106230(struct Sprite *sprite) break; case 2: if (eSlotMachine->bet == 0) - { break; - } sub_8104D30(5, SpriteCallbackDummy, 0xd0, 0x74, 0); eSlotMachine->win0h = 0xc0e0; eSlotMachine->win0v = 0x6880; @@ -4203,13 +3905,9 @@ static void sub_8106230(struct Sprite *sprite) sprite->data[2] = sprite->data[1] + 0xc0; sprite->data[3] = 0xe0 - sprite->data[1]; if (sprite->data[2] > 0xd0) - { sprite->data[2] = 0xd0; - } if (sprite->data[3] < 0xd0) - { sprite->data[3] = 0xd0; - } eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; if (sprite->data[1] > 0x0f) { @@ -4222,7 +3920,6 @@ static void sub_8106230(struct Sprite *sprite) static void nullsub_70(void) { - } static void sub_8106364(void) @@ -4271,14 +3968,13 @@ static void sub_8106404(void) { u8 j; for (j = 0; j < 0x20; j++, dest++) - { *dest = src[j]; - } } LoadSpriteSheet(sheet); } -static void sub_8106448(void) { +static void sub_8106448(void) +{ LZDecompressWram(gSlotMachine_Gfx, eSlotMachineGfxBuffer); DmaCopyLarge16(3, eSlotMachineGfxBuffer, BG_VRAM, SLOTMACHINE_GFX_TILES * 32, 0x1000); @@ -4287,12 +3983,14 @@ static void sub_8106448(void) { LoadPalette(gPalette_83EDE24, 208, 32); } -static void sub_81064B8(void) { +static void sub_81064B8(void) +{ CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); LoadSlotMachineWheelOverlay(); } -static void LoadSlotMachineWheelOverlay(void) { +static void LoadSlotMachineWheelOverlay(void) +{ s16 x, y, dx; u16 *screen; @@ -4312,13 +4010,12 @@ static void LoadSlotMachineWheelOverlay(void) { screen[12 * 32 + x] = 0x28BE; for (y = 7; y <= 11; y++) - { screen[y * 32 + x] = 0x20BF; - } } } -static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { +static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) +{ u16 *vram = BG_SCREEN_ADDR(29); vram[15 * 32 + arg0] = arg1; @@ -4338,1228 +4035,391 @@ static void sub_81065DC(void) for (y = 0; y < 20; y++) { for (x = 0; x < 30; x++) - { screen[x + y * 32] = 0; - } } } +struct UnknownMenuAction +{ + const u8 *text; + void (*func)(); +}; + #if DEBUG -__attribute__((naked)) -void debug_sub_811B1C4() -{ - asm( - " ldr r1, .__1_\n" - " ldrb r0, [r1]\n" - " mov r3, #0x2\n" - " orr r0, r0, r3\n" - " strb r0, [r1]\n" - " ldr r2, .__1_ + 4\n" - " ldrb r1, [r2]\n" - " mov r0, #0x2\n" - " eor r1, r1, r0\n" - " neg r0, r1\n" - " orr r0, r0, r1\n" - " asr r0, r0, #0x1f\n" - " and r0, r0, r3\n" - " strb r0, [r2]\n" - " bx lr\n" - ".__2_:\n" - " .align 2, 0\n" - ".__1_:\n" - " .word unk_debug_bss_1_3\n" - " .word unk_debug_bss_1_0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B1EC() -{ - asm( - " ldr r2, .__3\n" - " ldrb r0, [r2]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " strb r0, [r2]\n" - " ldr r2, .__3 + 4\n" - " ldrb r0, [r2]\n" - " mov r1, #0x1\n" - " eor r0, r0, r1\n" - " neg r0, r0\n" - " lsr r0, r0, #0x1f\n" - " strb r0, [r2]\n" - " bx lr\n" - ".__4:\n" - " .align 2, 0\n" - ".__3:\n" - " .word unk_debug_bss_1_3\n" - " .word unk_debug_bss_1_0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B210() -{ - asm( - " ldr r1, .__5\n" - " ldrb r0, [r1]\n" - " mov r3, #0x4\n" - " orr r0, r0, r3\n" - " strb r0, [r1]\n" - " ldr r2, .__5 + 4\n" - " ldrb r1, [r2]\n" - " mov r0, #0x4\n" - " eor r1, r1, r0\n" - " neg r0, r1\n" - " orr r0, r0, r1\n" - " asr r0, r0, #0x1f\n" - " and r0, r0, r3\n" - " strb r0, [r2]\n" - " bx lr\n" - ".__6:\n" - " .align 2, 0\n" - ".__5:\n" - " .word unk_debug_bss_1_3\n" - " .word unk_debug_bss_1_0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B238() -{ - asm( - " ldr r1, .__7\n" - " ldrb r0, [r1]\n" - " mov r3, #0x8\n" - " orr r0, r0, r3\n" - " strb r0, [r1]\n" - " ldr r2, .__7 + 4\n" - " ldrb r1, [r2]\n" - " mov r0, #0x8\n" - " eor r1, r1, r0\n" - " neg r0, r1\n" - " orr r0, r0, r1\n" - " asr r0, r0, #0x1f\n" - " and r0, r0, r3\n" - " strb r0, [r2]\n" - " bx lr\n" - ".__8:\n" - " .align 2, 0\n" - ".__7:\n" - " .word unk_debug_bss_1_3\n" - " .word unk_debug_bss_1_0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B260() -{ - asm( - " ldr r1, .__9\n" - " ldrb r0, [r1]\n" - " mov r3, #0x10\n" - " orr r0, r0, r3\n" - " strb r0, [r1]\n" - " ldr r2, .__9 + 4\n" - " ldrb r1, [r2]\n" - " mov r0, #0x10\n" - " eor r1, r1, r0\n" - " neg r0, r1\n" - " orr r0, r0, r1\n" - " asr r0, r0, #0x1f\n" - " and r0, r0, r3\n" - " strb r0, [r2]\n" - " bx lr\n" - ".__10:\n" - " .align 2, 0\n" - ".__9:\n" - " .word unk_debug_bss_1_3\n" - " .word unk_debug_bss_1_0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B288() -{ - asm( - " ldr r1, .__11\n" - " ldrb r0, [r1]\n" - " mov r3, #0x40\n" - " orr r0, r0, r3\n" - " strb r0, [r1]\n" - " ldr r2, .__11 + 4\n" - " ldrb r1, [r2]\n" - " mov r0, #0x40\n" - " eor r1, r1, r0\n" - " neg r0, r1\n" - " orr r0, r0, r1\n" - " asr r0, r0, #0x1f\n" - " and r0, r0, r3\n" - " strb r0, [r2]\n" - " bx lr\n" - ".__12:\n" - " .align 2, 0\n" - ".__11:\n" - " .word unk_debug_bss_1_3\n" - " .word unk_debug_bss_1_0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B2B0() -{ - asm( - " ldr r1, .__13\n" - " ldrb r0, [r1]\n" - " mov r3, #0x80\n" - " orr r0, r0, r3\n" - " strb r0, [r1]\n" - " ldr r2, .__13 + 4\n" - " ldrb r1, [r2]\n" - " mov r0, #0x80\n" - " eor r1, r1, r0\n" - " neg r0, r1\n" - " orr r0, r0, r1\n" - " asr r0, r0, #0x1f\n" - " and r0, r0, r3\n" - " strb r0, [r2]\n" - " bx lr\n" - ".__14:\n" - " .align 2, 0\n" - ".__13:\n" - " .word unk_debug_bss_1_3\n" - " .word unk_debug_bss_1_0\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B2D8() -{ - asm( - " ldr r0, .__15\n" - " ldrb r1, [r0]\n" - " mov r2, #0x20\n" - " orr r1, r1, r2\n" - " strb r1, [r0]\n" - " bx lr\n" - ".__16:\n" - " .align 2, 0\n" - ".__15:\n" - " .word unk_debug_bss_1_3\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B2E8() -{ - asm( - " push {lr}\n" - " add sp, sp, #0xfffffffc\n" - " ldr r0, .__17\n" - " ldrb r1, [r0, #0x1]\n" - " add r1, r1, #0x1\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x1\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x6\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " add sp, sp, #0x4\n" - " pop {r0}\n" - " bx r0\n" - ".__18:\n" - " .align 2, 0\n" - ".__17:\n" - " .word +0x2000000\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B310() -{ - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffff8\n" - " ldr r0, .__21\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 4\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 8\n" - " mov r1, #0x1\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 12\n" - " mov r1, #0x1\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 16\n" - " mov r1, #0x1\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 20\n" - " mov r1, #0x1\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 24\n" - " mov r1, #0x1\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 28\n" - " mov r1, #0x1\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 32\n" - " mov r1, #0x1\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 36\n" - " mov r1, #0xf\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 40\n" - " mov r1, #0xf\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 44\n" - " mov r1, #0xf\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 48\n" - " mov r1, #0xf\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 52\n" - " mov r1, #0xf\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 56\n" - " mov r1, #0xf\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 60\n" - " mov r1, #0xf\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 64\n" - " mov r1, #0xf\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 68\n" - " mov r1, #0xf\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " ldr r0, .__21 + 72\n" - " ldrb r0, [r0, #0x3]\n" - " cmp r0, #0\n" - " bne .__19 @cond_branch\n" - " ldr r0, .__21 + 76\n" - " mov r1, #0xa\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " b .__20\n" - ".__22:\n" - " .align 2, 0\n" - ".__21:\n" - " .word Str_841B1C4\n" - " .word Str_841B1CB\n" - " .word Str_841B1D4\n" - " .word Str_841B1DB\n" - " .word Str_841B1E2\n" - " .word Str_841B1E8\n" - " .word Str_841B1F3\n" - " .word Str_841B202\n" - " .word Str_841B24C\n" - " .word Str_841B211\n" - " .word Str_841B219\n" - " .word Str_841B220\n" - " .word Str_841B227\n" - " .word Str_841B22E\n" - " .word Str_841B235\n" - " .word Str_841B23B\n" - " .word Str_841B23F\n" - " .word Str_841B243\n" - " .word +0x2000000\n" - " .word Str_841B246\n" - ".__19:\n" - " ldr r0, .__30\n" - " mov r1, #0xa\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - ".__20:\n" - " ldr r4, .__30 + 4\n" - " ldr r1, [r4, #0x68]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0xa\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r1, [r4, #0x6c]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0xa\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " mov r0, #0x10\n" - " ldsh r1, [r4, r0]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0xa\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r1, [r4, #0x70]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x14\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " ldr r1, [r4, #0x74]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x14\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " ldr r1, [r4, #0x78]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x14\n" - " mov r2, #0x7\n" - " bl Menu_PrintText\n" - " ldr r1, [r4, #0x7c]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x14\n" - " mov r2, #0x9\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " add r0, r0, #0x80\n" - " ldr r1, [r0]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x14\n" - " mov r2, #0xb\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " add r0, r0, #0x84\n" - " ldr r1, [r0]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x14\n" - " mov r2, #0xd\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " add r0, r0, #0x88\n" - " ldr r1, [r0]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x14\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " add r0, r4, #0\n" - " add r0, r0, #0x8c\n" - " ldr r1, [r0]\n" - " mov r0, sp\n" - " mov r2, #0x2\n" - " mov r3, #0x4\n" - " bl ConvertIntToDecimalStringN\n" - " mov r0, sp\n" - " mov r1, #0x14\n" - " mov r2, #0x11\n" - " bl Menu_PrintText\n" - " ldr r1, .__30 + 8\n" - " ldrb r0, [r1]\n" - " cmp r0, #0\n" - " beq .__23 @cond_branch\n" - " mov r2, #0x0\n" - " cmp r0, #0x8\n" - " beq .__24 @cond_branch\n" - " cmp r0, #0x8\n" - " bgt .__25 @cond_branch\n" - " cmp r0, #0x2\n" - " beq .__26 @cond_branch\n" - " cmp r0, #0x2\n" - " bgt .__27 @cond_branch\n" - " cmp r0, #0x1\n" - " beq .__28 @cond_branch\n" - " b .__45\n" - ".__31:\n" - " .align 2, 0\n" - ".__30:\n" - " .word Str_841B249\n" - " .word +0x2000000\n" - " .word unk_debug_bss_1_0\n" - ".__27:\n" - " cmp r0, #0x4\n" - " beq .__32 @cond_branch\n" - " b .__45\n" - ".__25:\n" - " cmp r0, #0x40\n" - " beq .__34 @cond_branch\n" - " cmp r0, #0x40\n" - " bgt .__35 @cond_branch\n" - " cmp r0, #0x10\n" - " beq .__36 @cond_branch\n" - " b .__45\n" - ".__35:\n" - " cmp r0, #0x80\n" - " beq .__38 @cond_branch\n" - " b .__45\n" - ".__26:\n" - " mov r2, #0x3\n" - " b .__45\n" - ".__28:\n" - " mov r2, #0x5\n" - " b .__45\n" - ".__32:\n" - " mov r2, #0x7\n" - " b .__45\n" - ".__24:\n" - " mov r2, #0x9\n" - " b .__45\n" - ".__36:\n" - " mov r2, #0xb\n" - " b .__45\n" - ".__34:\n" - " mov r2, #0xd\n" - " b .__45\n" - ".__38:\n" - " mov r2, #0xf\n" - ".__45:\n" - " ldr r0, .__46\n" - " mov r1, #0x17\n" - " bl Menu_PrintText\n" - ".__23:\n" - " bl debug_sub_811B2E8\n" - " add sp, sp, #0x8\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - ".__47:\n" - " .align 2, 0\n" - ".__46:\n" - " .word Str_841B26D\n" - "\n" - ); -} - -__attribute__((naked)) -static void debug_sub_811B5B4() -{ - asm( - " push {lr}\n" - " add r2, r0, #0\n" - " ldr r0, [r2]\n" - " add r0, r0, r1\n" - " str r0, [r2]\n" - " ldr r1, .__49\n" - " cmp r0, r1\n" - " ble .__48 @cond_branch\n" - " str r1, [r2]\n" - ".__48:\n" - " pop {r0}\n" - " bx r0\n" - ".__50:\n" - " .align 2, 0\n" - ".__49:\n" - " .word 0x270f\n" - "\n" - ); -} - -__attribute__((naked)) + +void debug_sub_811B1C4(void) +{ + unk_debug_bss_1_3 |= 2; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 2) ? 0 : 2; +} + +void debug_sub_811B1EC(void) +{ + unk_debug_bss_1_3 |= 1; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 1) ? 0 : 1; +} + +void debug_sub_811B210(void) +{ + unk_debug_bss_1_3 |= 4; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 4) ? 0 : 4; +} + +void debug_sub_811B238(void) +{ + unk_debug_bss_1_3 |= 8; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 8) ? 0 : 8; +} + +void debug_sub_811B260(void) +{ + unk_debug_bss_1_3 |= 0x10; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x10) ? 0 : 0x10; +} + +void debug_sub_811B288(void) +{ + unk_debug_bss_1_3 |= 0x40; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x40) ? 0 : 0x40; +} + +void debug_sub_811B2B0(void) +{ + unk_debug_bss_1_3 |= 0x80; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x80) ? 0 : 0x80; +} + +void debug_sub_811B2D8(void) +{ + unk_debug_bss_1_3 |= 0x20; +} + +void debug_sub_811B2E8(void) +{ + u8 text[2]; + + ConvertIntToDecimalStringN(text, eSlotMachine->unk01 + 1, 2, 1); + Menu_PrintText(text, 6, 1); +} + +static const u8 Str_841B1C4[]; +static const u8 Str_841B1CB[]; +static const u8 Str_841B1D4[]; +static const u8 Str_841B1DB[]; +static const u8 Str_841B1E2[]; +static const u8 Str_841B1E8[]; +static const u8 Str_841B1F3[]; +static const u8 Str_841B202[]; +static const u8 Str_841B211[]; +static const u8 Str_841B219[]; +static const u8 Str_841B220[]; +static const u8 Str_841B227[]; +static const u8 Str_841B22E[]; +static const u8 Str_841B235[]; +static const u8 Str_841B23B[]; +static const u8 Str_841B23F[]; +static const u8 Str_841B243[]; +static const u8 Str_841B246[]; +static const u8 Str_841B249[]; +static const u8 Str_841B24C[]; +static const u8 Str_841B254[]; +static const u8 Str_841B25C[]; +static const u8 Str_841B264[]; +static const u8 Str_841B26D[]; + +void debug_sub_811B310(void) +{ + u8 text[5]; + + Menu_PrintText(Str_841B1C4, 1, 1); + Menu_PrintText(Str_841B1CB, 1, 3); + Menu_PrintText(Str_841B1D4, 1, 5); + Menu_PrintText(Str_841B1DB, 1, 7); + Menu_PrintText(Str_841B1E2, 1, 9); + Menu_PrintText(Str_841B1E8, 1, 11); + Menu_PrintText(Str_841B1F3, 1, 13); + Menu_PrintText(Str_841B202, 1, 15); + Menu_PrintText(Str_841B24C, 1, 17); + Menu_PrintText(Str_841B211, 15, 1); + Menu_PrintText(Str_841B219, 15, 3); + Menu_PrintText(Str_841B220, 15, 5); + Menu_PrintText(Str_841B227, 15, 7); + Menu_PrintText(Str_841B22E, 15, 9); + Menu_PrintText(Str_841B235, 15, 11); + Menu_PrintText(Str_841B23B, 15, 13); + Menu_PrintText(Str_841B23F, 15, 15); + Menu_PrintText(Str_841B243, 15, 17); + if (eSlotMachine->unk03 == 0) + Menu_PrintText(Str_841B246, 10, 9); + else + Menu_PrintText(Str_841B249, 10, 9); + +#define PRINT_NUMBER(n, x, y) \ + ConvertIntToDecimalStringN(text, n, 2, 4); \ + Menu_PrintText(text, x, y); + + PRINT_NUMBER(eSlotMachine->unk68, 10, 3); + PRINT_NUMBER(eSlotMachine->unk6C, 10, 5); + PRINT_NUMBER(eSlotMachine->unk10, 10, 7); + PRINT_NUMBER(eSlotMachine->unk70, 20, 3); + PRINT_NUMBER(eSlotMachine->unk74, 20, 5); + PRINT_NUMBER(eSlotMachine->unk78, 20, 7); + PRINT_NUMBER(eSlotMachine->unk7C, 20, 9); + PRINT_NUMBER(eSlotMachine->unk80, 20, 11); + PRINT_NUMBER(eSlotMachine->unk84, 20, 13); + PRINT_NUMBER(eSlotMachine->unk88, 20, 15); + PRINT_NUMBER(eSlotMachine->unk8C, 20, 17); + +#undef PRINT_NUMBER + + if (unk_debug_bss_1_0 != 0) + { + u8 y = 0; + + switch (unk_debug_bss_1_0) + { + case 2: + y = 3; + break; + case 1: + y = 5; + break; + case 4: + y = 7; + break; + case 8: + y = 9; + break; + case 16: + y = 11; + break; + case 64: + y = 13; + break; + case 128: + y = 15; + break; + } + Menu_PrintText(Str_841B26D, 23, y); + } + debug_sub_811B2E8(); +} + +static void debug_sub_811B5B4(s32 *a, s32 b) +{ + *a += b; + if (*a > 9999) + *a = 9999; +} + static void debug_sub_811B5D0(void) { - asm( - " ldr r0, .__51\n" - " mov r1, #0x0\n" - " strb r1, [r0]\n" - " ldr r0, .__51 + 4\n" - " strb r1, [r0]\n" - " ldr r0, .__51 + 8\n" - " strb r1, [r0]\n" - " ldr r0, .__51 + 12\n" - " strb r1, [r0]\n" - " ldr r2, .__51 + 16\n" - " mov r0, #0x0\n" - " str r0, [r2, #0x68]\n" - " str r0, [r2, #0x6c]\n" - " str r0, [r2, #0x70]\n" - " str r0, [r2, #0x74]\n" - " str r0, [r2, #0x78]\n" - " str r0, [r2, #0x7c]\n" - " add r1, r2, #0\n" - " add r1, r1, #0x80\n" - " str r0, [r1]\n" - " add r1, r1, #0x4\n" - " str r0, [r1]\n" - " add r1, r1, #0x4\n" - " str r0, [r1]\n" - " add r1, r1, #0x4\n" - " str r0, [r1]\n" - " add r1, r1, #0x4\n" - " str r0, [r1]\n" - " bx lr\n" - ".__52:\n" - " .align 2, 0\n" - ".__51:\n" - " .word unk_debug_bss_1_0\n" - " .word unk_debug_bss_1_2\n" - " .word unk_debug_bss_1_3\n" - " .word unk_debug_bss_1_4\n" - " .word +0x2000000\n" - "\n" - ); -} - -__attribute__((naked)) + unk_debug_bss_1_0 = 0; + unk_debug_bss_1_2 = 0; + unk_debug_bss_1_3 = 0; + unk_debug_bss_1_4 = 0; + eSlotMachine->unk68 = 0; + eSlotMachine->unk6C = 0; + eSlotMachine->unk70 = 0; + eSlotMachine->unk74 = 0; + eSlotMachine->unk78 = 0; + eSlotMachine->unk7C = 0; + eSlotMachine->unk80 = 0; + eSlotMachine->unk84 = 0; + eSlotMachine->unk88 = 0; + eSlotMachine->unk8C = 0; + eSlotMachine->unk90 = 0; +} + static void debug_sub_811B620(void) { - asm( - " push {lr}\n" - " ldr r0, .__53\n" - " mov r1, #0x0\n" - " bl CreateTask\n" - " pop {r0}\n" - " bx r0\n" - ".__54:\n" - " .align 2, 0\n" - ".__53:\n" - " .word debug_sub_811B654+1\n" - "\n" - ); -} - -__attribute__((naked)) -static u8 debug_sub_811B634() -{ - asm( - " push {lr}\n" - " ldr r0, .__57\n" - " bl FindTaskIdByFunc\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0xff\n" - " beq .__55 @cond_branch\n" - " mov r0, #0x0\n" - " b .__56\n" - ".__58:\n" - " .align 2, 0\n" - ".__57:\n" - " .word debug_sub_811B654+1\n" - ".__55:\n" - " mov r0, #0x1\n" - ".__56:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_811B654() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " add sp, sp, #0xfffffff8\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " lsl r0, r6, #0x2\n" - " add r0, r0, r6\n" - " lsl r0, r0, #0x3\n" - " ldr r1, .__63\n" - " add r5, r0, r1\n" - " mov r0, #0x8\n" - " ldsh r1, [r5, r0]\n" - " cmp r1, #0x1\n" - " beq .__59 @cond_branch\n" - " cmp r1, #0x1\n" - " bgt .__60 @cond_branch\n" - " cmp r1, #0\n" - " beq .__61 @cond_branch\n" - " b .__116\n" - ".__64:\n" - " .align 2, 0\n" - ".__63:\n" - " .word gTasks\n" - ".__60:\n" - " cmp r1, #0x2\n" - " bne .__65 @cond_branch\n" - " b .__66\n" - ".__65:\n" - " cmp r1, #0x3\n" - " bne .__67 @cond_branch\n" - " b .__68\n" - ".__67:\n" - " b .__116\n" - ".__61:\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x18\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " bl debug_sub_811B310\n" - " ldrh r0, [r5, #0x8]\n" - " add r0, r0, #0x1\n" - " strh r0, [r5, #0x8]\n" - " b .__116\n" - ".__59:\n" - " ldr r7, .__76\n" - " ldrh r2, [r7, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq .__71 @cond_branch\n" - " b .__94\n" - ".__71:\n" - " mov r0, #0x20\n" - " and r0, r0, r2\n" - " lsl r0, r0, #0x10\n" - " lsr r3, r0, #0x10\n" - " cmp r3, #0\n" - " beq .__73 @cond_branch\n" - " ldr r1, .__76 + 4\n" - " ldrb r0, [r1, #0x1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1, #0x1]\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bge .__79 @cond_branch\n" - " mov r0, #0x5\n" - " strb r0, [r1, #0x1]\n" - " b .__79\n" - ".__77:\n" - " .align 2, 0\n" - ".__76:\n" - " .word gMain\n" - " .word +0x2000000\n" - ".__73:\n" - " mov r0, #0x10\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq .__78 @cond_branch\n" - " ldr r1, .__81\n" - " ldrb r0, [r1, #0x1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1, #0x1]\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x5\n" - " bls .__79 @cond_branch\n" - " strb r3, [r1, #0x1]\n" - ".__79:\n" - " bl debug_sub_811B2E8\n" - " b .__116\n" - ".__82:\n" - " .align 2, 0\n" - ".__81:\n" - " .word +0x2000000\n" - ".__78:\n" - " and r1, r1, r2\n" - " lsl r0, r1, #0x10\n" - " lsr r4, r0, #0x10\n" - " cmp r4, #0\n" - " beq .__83 @cond_branch\n" - " mov r0, #0x3\n" - " strh r0, [r5, #0x8]\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0x9\n" - " mov r3, #0x5\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, .__85\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r0, .__85 + 4\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " bl Menu_PrintText\n" - " b .__116\n" - ".__86:\n" - " .align 2, 0\n" - ".__85:\n" - " .word Str_841B25C\n" - " .word Str_841B264\n" - ".__83:\n" - " mov r0, #0x4\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " beq .__87 @cond_branch\n" - " ldr r0, .__91\n" - " strb r4, [r0]\n" - " ldr r0, .__91 + 4\n" - " strb r4, [r0]\n" - " bl Menu_EraseScreen\n" - " mov r0, #0x0\n" - " mov r1, #0x0\n" - " mov r2, #0xa\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r0, .__91 + 8\n" - " mov r1, #0x1\n" - " mov r2, #0x1\n" - " bl Menu_PrintText\n" - " ldr r3, .__91 + 12\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " mov r2, #0x8\n" - " bl Menu_PrintItems\n" - " str r4, [sp]\n" - " mov r0, #0x9\n" - " str r0, [sp, #0x4]\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " mov r2, #0x3\n" - " mov r3, #0x8\n" - " bl InitMenu\n" - " ldrh r0, [r5, #0x8]\n" - " add r0, r0, #0x1\n" - " strh r0, [r5, #0x8]\n" - ".__87:\n" - " ldrh r1, [r7, #0x2e]\n" - " mov r0, #0x8\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne .__88 @cond_branch\n" - " b .__116\n" - ".__88:\n" - " ldr r1, .__91 + 16\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " b .__94\n" - ".__92:\n" - " .align 2, 0\n" - ".__91:\n" - " .word unk_debug_bss_1_2\n" - " .word unk_debug_bss_1_3\n" - " .word Str_841B254\n" - " .word _841B270\n" - " .word unk_debug_bss_1_4\n" - ".__66:\n" - " bl Menu_ProcessInput\n" - " lsl r0, r0, #0x18\n" - " asr r2, r0, #0x18\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " cmp r2, r0\n" - " beq .__116 @cond_branch\n" - " add r0, r0, #0x1\n" - " cmp r2, r0\n" - " beq .__94 @cond_branch\n" - " ldr r1, .__96\n" - " mov r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r0, .__96 + 4\n" - " lsl r1, r2, #0x3\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, [r1]\n" - " bl _call_via_r0\n" - ".__94:\n" - " bl Menu_EraseScreen\n" - " add r0, r6, #0\n" - " bl DestroyTask\n" - " b .__116\n" - ".__97:\n" - " .align 2, 0\n" - ".__96:\n" - " .word unk_debug_bss_1_2\n" - " .word _841B270\n" - ".__68:\n" - " ldr r2, .__100\n" - " ldrh r1, [r2, #0x30]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq .__98 @cond_branch\n" - " ldr r2, .__100 + 4\n" - " ldrh r0, [r2, #0xc]\n" - " add r0, r0, #0x64\n" - " b .__99\n" - ".__101:\n" - " .align 2, 0\n" - ".__100:\n" - " .word gMain\n" - " .word +0x2000000\n" - ".__98:\n" - " mov r0, #0x40\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq .__102 @cond_branch\n" - " ldr r1, .__104\n" - " ldrh r0, [r1, #0xc]\n" - " sub r0, r0, #0x64\n" - " b .__103\n" - ".__105:\n" - " .align 2, 0\n" - ".__104:\n" - " .word +0x2000000\n" - ".__102:\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq .__106 @cond_branch\n" - " ldr r1, .__109\n" - " ldr r2, .__109 + 4\n" - " add r0, r2, #0\n" - " ldrh r2, [r1, #0xc]\n" - " add r0, r0, r2\n" - ".__103:\n" - " strh r0, [r1, #0xc]\n" - " lsl r0, r0, #0x10\n" - " cmp r0, #0\n" - " bgt .__116 @cond_branch\n" - " ldr r0, .__109 + 8\n" - " strh r0, [r1, #0xc]\n" - " b .__116\n" - ".__110:\n" - " .align 2, 0\n" - ".__109:\n" - " .word +0x2000000\n" - " .word 0xfffffc18\n" - " .word 0x270f\n" - ".__106:\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq .__111 @cond_branch\n" - " ldr r2, .__114\n" - " mov r1, #0xfa\n" - " lsl r1, r1, #0x2\n" - " add r0, r1, #0\n" - " ldrh r1, [r2, #0xc]\n" - " add r0, r0, r1\n" - ".__99:\n" - " strh r0, [r2, #0xc]\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x10\n" - " ldr r1, .__114 + 4\n" - " cmp r0, r1\n" - " ble .__116 @cond_branch\n" - " strh r1, [r2, #0xc]\n" - " b .__116\n" - ".__115:\n" - " .align 2, 0\n" - ".__114:\n" - " .word +0x2000000\n" - " .word 0x270f\n" - ".__111:\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x2\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq .__116 @cond_branch\n" - " bl Menu_EraseScreen\n" - " add r0, r6, #0\n" - " bl DestroyTask\n" - ".__116:\n" - " add sp, sp, #0x8\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); -} - -__attribute__((naked)) -static void debug_sub_811B894() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " ldr r1, .__122\n" - " ldrh r2, [r1, #0x8]\n" - " mov r0, #0xc0\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r2\n" - " add r4, r1, #0\n" - " cmp r0, #0\n" - " beq .__117 @cond_branch\n" - " add r1, r1, #0x90\n" - " ldr r0, [r1]\n" - " add r0, r0, #0x1\n" - " str r0, [r1]\n" - " ldr r2, .__122 + 4\n" - " cmp r0, r2\n" - " ble .__118 @cond_branch\n" - " str r2, [r1]\n" - ".__118:\n" - " add r0, r4, #0\n" - " add r0, r0, #0x88\n" - " ldr r1, [r1]\n" - " ldr r0, [r0]\n" - " cmp r1, r0\n" - " beq .__119 @cond_branch\n" - " ldr r0, .__122 + 8\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " ldr r1, .__122 + 12\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - ".__119:\n" - " ldrb r1, [r4, #0x4]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0\n" - " bne .__126 @cond_branch\n" - " ldr r0, .__122 + 16\n" - " mov r1, #0x4\n" - " mov r2, #0x11\n" - " b .__121\n" - ".__123:\n" - " .align 2, 0\n" - ".__122:\n" - " .word +0x2000000\n" - " .word 0x270f\n" - " .word Str_841B2B0\n" - " .word unk_debug_bss_1_4\n" - " .word Str_841B2D3\n" - ".__117:\n" - " lsl r0, r2, #0x10\n" - " cmp r0, #0\n" - " beq .__127 @cond_branch\n" - " ldrb r1, [r4, #0x4]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq .__126 @cond_branch\n" - " mov r4, #0x3\n" - " and r4, r4, r2\n" - " cmp r4, #0\n" - " bne .__126 @cond_branch\n" - " ldr r0, .__163\n" - " mov r1, #0x4\n" - " mov r2, #0x2\n" - ".__121:\n" - " bl Menu_PrintText\n" - " ldr r0, .__163 + 4\n" - " strb r4, [r0]\n" - ".__126:\n" - " ldr r0, .__163 + 8\n" - " ldrh r1, [r0, #0x8]\n" - " add r4, r0, #0\n" - " cmp r1, #0\n" - " beq .__127 @cond_branch\n" - " b .__162\n" - ".__127:\n" - " mov r1, #0x12\n" - " ldsh r0, [r4, r1]\n" - " cmp r0, #0x3\n" - " beq .__129 @cond_branch\n" - " b .__162\n" - ".__129:\n" - " ldrb r1, [r4, #0x4]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq .__131 @cond_branch\n" - " b .__162\n" - ".__131:\n" - " mov r0, #0x0\n" - " mov r1, #0x1\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " mov r0, #0x0\n" - " mov r1, #0x2\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " str r0, [sp]\n" - " mov r0, #0x0\n" - " mov r1, #0x3\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " mov r0, #0x1\n" - " mov r1, #0x1\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r9, r0\n" - " mov r0, #0x1\n" - " mov r1, #0x2\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " mov r0, #0x1\n" - " mov r1, #0x3\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov sl, r0\n" - " mov r0, #0x2\n" - " mov r1, #0x1\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " mov r0, #0x2\n" - " mov r1, #0x2\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - " mov r0, #0x2\n" - " mov r1, #0x3\n" - " bl GetTagOfReelSymbolOnScreenAtPos\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r7, #0\n" - " bne .__134 @cond_branch\n" - " mov r1, r9\n" - " cmp r1, #0x1\n" - " bne .__134 @cond_branch\n" - " cmp r5, #0\n" - " beq .__159 @cond_branch\n" - ".__134:\n" - " ldr r1, [sp]\n" - " cmp r1, #0\n" - " bne .__137 @cond_branch\n" - " cmp r4, #0x1\n" - " bne .__137 @cond_branch\n" - " mov r1, r8\n" - " cmp r1, #0\n" - " beq .__159 @cond_branch\n" - ".__137:\n" - " cmp r6, #0\n" - " bne .__140 @cond_branch\n" - " mov r1, sl\n" - " cmp r1, #0x1\n" - " bne .__140 @cond_branch\n" - " cmp r0, #0\n" - " beq .__159 @cond_branch\n" - ".__140:\n" - " cmp r7, #0\n" - " bne .__143 @cond_branch\n" - " cmp r4, #0x1\n" - " bne .__143 @cond_branch\n" - " cmp r0, #0\n" - " beq .__159 @cond_branch\n" - ".__143:\n" - " cmp r6, #0\n" - " bne .__146 @cond_branch\n" - " cmp r4, #0x1\n" - " bne .__146 @cond_branch\n" - " cmp r5, #0\n" - " beq .__159 @cond_branch\n" - ".__146:\n" - " cmp r7, #0x1\n" - " bne .__149 @cond_branch\n" - " mov r1, r9\n" - " cmp r1, #0\n" - " bne .__149 @cond_branch\n" - " cmp r5, #0x1\n" - " beq .__159 @cond_branch\n" - ".__149:\n" - " ldr r1, [sp]\n" - " cmp r1, #0x1\n" - " bne .__152 @cond_branch\n" - " cmp r4, #0\n" - " bne .__152 @cond_branch\n" - " mov r1, r8\n" - " cmp r1, #0x1\n" - " beq .__159 @cond_branch\n" - ".__152:\n" - " cmp r6, #0x1\n" - " bne .__155 @cond_branch\n" - " mov r1, sl\n" - " cmp r1, #0\n" - " bne .__155 @cond_branch\n" - " cmp r0, #0x1\n" - " beq .__159 @cond_branch\n" - ".__155:\n" - " cmp r7, #0x1\n" - " bne .__158 @cond_branch\n" - " cmp r4, #0\n" - " bne .__158 @cond_branch\n" - " cmp r0, #0x1\n" - " beq .__159 @cond_branch\n" - ".__158:\n" - " cmp r6, #0x1\n" - " bne .__162 @cond_branch\n" - " cmp r4, #0\n" - " bne .__162 @cond_branch\n" - " cmp r5, #0x1\n" - " bne .__162 @cond_branch\n" - ".__159:\n" - " ldr r0, .__163 + 12\n" - " mov r1, #0x4\n" - " mov r2, #0x0\n" - " bl Menu_PrintText\n" - " ldr r1, .__163 + 4\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - ".__162:\n" - " add sp, sp, #0x4\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - ".__164:\n" - " .align 2, 0\n" - ".__163:\n" - " .word Str_841B2E4\n" - " .word unk_debug_bss_1_4\n" - " .word +0x2000000\n" - " .word Str_841B2BF\n" - "\n" - ); + CreateTask(debug_sub_811B654, 0); +} + +static u8 debug_sub_811B634(void) +{ + if (FindTaskIdByFunc(debug_sub_811B654) == 0xFF) + return 1; + else + return 0; +} + +static const struct UnknownMenuAction _841B270[]; + +static void debug_sub_811B654(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s8 selection; + + switch (task->data[0]) + { + case 0: + Menu_DrawStdWindowFrame(0, 0, 24, 19); + debug_sub_811B310(); + task->data[0]++; + break; + case 1: + if (gMain.newKeys & B_BUTTON) + { + Menu_EraseScreen(); + DestroyTask(taskId); + break; + } + if (gMain.newKeys & 0x20) + { + eSlotMachine->unk01--; + if ((s8)eSlotMachine->unk01 < 0) // Why? It's unsigned + eSlotMachine->unk01 = 5; + debug_sub_811B2E8(); + break; + } + if (gMain.newKeys & 0x10) + { + eSlotMachine->unk01++; + if (eSlotMachine->unk01 > 5) + eSlotMachine->unk01 = 0; + debug_sub_811B2E8(); + break; + } + if (gMain.newKeys & A_BUTTON) + { + task->data[0] = 3; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 9, 5); + Menu_PrintText(Str_841B25C, 1, 1); + Menu_PrintText(Str_841B264, 1, 3); + break; + } + if (gMain.newKeys & 4) + { + unk_debug_bss_1_2 = 0; + unk_debug_bss_1_3 = 0; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 10, 19); + Menu_PrintText(Str_841B254, 1, 1); + Menu_PrintItems(2, 3, 8, (void *)_841B270); + InitMenu(0, 1, 3, 8, 0, 9); + task->data[0]++; + } + if (gMain.newKeys & 8) + { + unk_debug_bss_1_4 = 1; + Menu_EraseScreen(); + DestroyTask(taskId); + } + break; + case 2: + selection = Menu_ProcessInput(); + if (selection == -2) + break; + if (selection != -1) + { + unk_debug_bss_1_2 = 1; + _841B270[selection].func(); + } + Menu_EraseScreen(); + DestroyTask(taskId); + break; + case 3: + if (gMain.newAndRepeatedKeys & 0x80) + { + eSlotMachine->coins += 100; + if (eSlotMachine->coins > 9999) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x40) + { + eSlotMachine->coins -= 100; + if (eSlotMachine->coins <= 0) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x20) + { + eSlotMachine->coins -= 1000; + if (eSlotMachine->coins <= 0) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x10) + { + eSlotMachine->coins += 1000; + if (eSlotMachine->coins > 9999) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newKeys & B_BUTTON) + { + Menu_EraseScreen(); + DestroyTask(taskId); + } + break; + } +} + +static const u8 Str_841B2B0[]; +static const u8 Str_841B2BF[]; +static const u8 Str_841B2D3[]; +static const u8 Str_841B2E4[]; + +static void debug_sub_811B894(void) +{ + if (eSlotMachine->matchedSymbols & 0x180) + { + eSlotMachine->unk90++; + if (eSlotMachine->unk90 > 9999) + eSlotMachine->unk90 = 9999; + if (eSlotMachine->unk90 != eSlotMachine->unk88) + { + Menu_PrintText(Str_841B2B0, 4, 15); + unk_debug_bss_1_4 = 0; + } + if (!(eSlotMachine->unk04 & 0x80)) + { + Menu_PrintText(Str_841B2D3, 4, 17); + unk_debug_bss_1_4 = 0; + } + } + else if (eSlotMachine->matchedSymbols != 0) + { + if ((eSlotMachine->unk04 & 0x80) && !(eSlotMachine->matchedSymbols & 3)) + { + Menu_PrintText(Str_841B2E4, 4, 2); + unk_debug_bss_1_4 = 0; + } + } + if (eSlotMachine->matchedSymbols == 0 && eSlotMachine->bet == 3 && !(eSlotMachine->unk04 & 0x80)) + { + u8 sym_0_1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + u8 sym_0_2 = GetTagOfReelSymbolOnScreenAtPos(0, 2); + u8 sym_0_3 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + + u8 sym_1_1 = GetTagOfReelSymbolOnScreenAtPos(1, 1); + u8 sym_1_2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + u8 sym_1_3 = GetTagOfReelSymbolOnScreenAtPos(1, 3); + + u8 sym_2_1 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + u8 sym_2_2 = GetTagOfReelSymbolOnScreenAtPos(2, 2); + u8 sym_2_3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + + if ((sym_0_1 == 0 && sym_1_1 == 1 && sym_2_1 == 0) + || (sym_0_2 == 0 && sym_1_2 == 1 && sym_2_2 == 0) + || (sym_0_3 == 0 && sym_1_3 == 1 && sym_2_3 == 0) + || (sym_0_1 == 0 && sym_1_2 == 1 && sym_2_3 == 0) + || (sym_0_3 == 0 && sym_1_2 == 1 && sym_2_1 == 0) + || (sym_0_1 == 1 && sym_1_1 == 0 && sym_2_1 == 1) + || (sym_0_2 == 1 && sym_1_2 == 0 && sym_2_2 == 1) + || (sym_0_3 == 1 && sym_1_3 == 0 && sym_2_3 == 1) + || (sym_0_1 == 1 && sym_1_2 == 0 && sym_2_3 == 1) + || (sym_0_3 == 1 && sym_1_2 == 0 && sym_2_1 == 1)) + { + Menu_PrintText(Str_841B2BF, 4, 0); + unk_debug_bss_1_4 = 0; + } + } } + #endif static const u8 sReelSymbols[][21] = @@ -5586,7 +4446,8 @@ static const u8 sReelSymbols[][21] = SLOT_MACHINE_TAG_POWER, SLOT_MACHINE_TAG_LOTAD, SLOT_MACHINE_TAG_REPLAY - }, { + }, + { SLOT_MACHINE_TAG_7_RED, SLOT_MACHINE_TAG_CHERRY, SLOT_MACHINE_TAG_REPLAY, @@ -5608,7 +4469,8 @@ static const u8 sReelSymbols[][21] = SLOT_MACHINE_TAG_LOTAD, SLOT_MACHINE_TAG_REPLAY, SLOT_MACHINE_TAG_CHERRY - }, { + }, + { SLOT_MACHINE_TAG_7_RED, SLOT_MACHINE_TAG_POWER, SLOT_MACHINE_TAG_7_BLUE, @@ -5630,7 +4492,7 @@ static const u8 sReelSymbols[][21] = SLOT_MACHINE_TAG_REPLAY, SLOT_MACHINE_TAG_LOTAD, SLOT_MACHINE_TAG_CHERRY - } + }, }; static const u8 gUnknown_083ECCF1[] = { @@ -6995,33 +5857,42 @@ static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/re #if DEBUG -const u8 Str_841B1C4[] = _("SETTEI"); -const u8 Str_841B1CB[] = _("MAWASITA"); -const u8 Str_841B1D4[] = _("MODOSI"); -const u8 Str_841B1DB[] = _("NOMARE"); -const u8 Str_841B1E2[] = _("MAE 7"); -const u8 Str_841B1E8[] = _("LR  HENKOU"); -const u8 Str_841B1F3[] = _("START  JIDOUSU"); -const u8 Str_841B202[] = _("SELECT  SETTEI"); -const u8 Str_841B211[] = _("TYUHSEN"); -const u8 Str_841B219[] = _("CHERRY"); -const u8 Str_841B220[] = _("REPLAY"); -const u8 Str_841B227[] = _("HASUBO"); -const u8 Str_841B22E[] = _("RURIRI"); -const u8 Str_841B235[] = _("INAZU"); -const u8 Str_841B23B[] = _("REG"); -const u8 Str_841B23F[] = _("BIG"); -const u8 Str_841B243[] = _("BD"); -const u8 Str_841B246[] = _("R7"); -const u8 Str_841B249[] = _("B7"); -const u8 Str_841B24C[] = _("A  COIN"); -const u8 Str_841B254[] = _("TYUHSEN"); -const u8 Str_841B25C[] = _("UD  100"); -const u8 Str_841B264[] = _("LR  1000"); -const u8 Str_841B26D[] = _("×"); +static void debug_sub_811B1C4(void); +static void debug_sub_811B1EC(void); +static void debug_sub_811B210(void); +static void debug_sub_811B238(void); +static void debug_sub_811B260(void); +static void debug_sub_811B288(void); +static void debug_sub_811B2B0(void); +static void debug_sub_811B2D8(void); + +static const u8 Str_841B1C4[] = _("SETTEI"); +static const u8 Str_841B1CB[] = _("MAWASITA"); +static const u8 Str_841B1D4[] = _("MODOSI"); +static const u8 Str_841B1DB[] = _("NOMARE"); +static const u8 Str_841B1E2[] = _("MAE 7"); +static const u8 Str_841B1E8[] = _("LR  HENKOU"); +static const u8 Str_841B1F3[] = _("START  JIDOUSU"); +static const u8 Str_841B202[] = _("SELECT  SETTEI"); +static const u8 Str_841B211[] = _("TYUHSEN"); +static const u8 Str_841B219[] = _("CHERRY"); +static const u8 Str_841B220[] = _("REPLAY"); +static const u8 Str_841B227[] = _("HASUBO"); +static const u8 Str_841B22E[] = _("RURIRI"); +static const u8 Str_841B235[] = _("INAZU"); +static const u8 Str_841B23B[] = _("REG"); +static const u8 Str_841B23F[] = _("BIG"); +static const u8 Str_841B243[] = _("BD"); +static const u8 Str_841B246[] = _("R7"); +static const u8 Str_841B249[] = _("B7"); +static const u8 Str_841B24C[] = _("A  COIN"); +static const u8 Str_841B254[] = _("TYUHSEN"); +static const u8 Str_841B25C[] = _("UD  100"); +static const u8 Str_841B264[] = _("LR  1000"); +static const u8 Str_841B26D[] = _("×"); // Is this MenuAction2? I'm not sure. -const struct {const u8 *text; void (*func)();} _841B270[] = +static const struct UnknownMenuAction _841B270[] = { {Str_841B219, debug_sub_811B1C4}, {Str_841B220, debug_sub_811B1EC}, @@ -7033,9 +5904,9 @@ const struct {const u8 *text; void (*func)();} _841B270[] = {Str_841B243, debug_sub_811B2D8}, }; -const u8 Str_841B2B0[] = _("·カウントエラーがおきました"); -const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました"); -const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました"); -const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました"); +static const u8 Str_841B2B0[] = _("·カウントエラーがおきました"); +static const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました"); +static const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました"); +static const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました"); #endif -- cgit v1.2.3 From 0c189f3efb02f9d8e485c55b36c1ed86883ea1fe Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Fri, 16 Feb 2018 18:51:32 -0600 Subject: reorganize slot machine data --- src/field/slot_machine.c | 1205 ++++++++++++++++++++++++---------------------- 1 file changed, 618 insertions(+), 587 deletions(-) (limited to 'src') diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 6111cb27f..4958c2a0c 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -18,6 +18,93 @@ #include "menu.h" #include "ewram.h" +enum +{ + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY +}; + +enum +{ + SLOT_MACHINE_MATCHED_1CHERRY, + SLOT_MACHINE_MATCHED_2CHERRY, + SLOT_MACHINE_MATCHED_REPLAY, + SLOT_MACHINE_MATCHED_LOTAD, + SLOT_MACHINE_MATCHED_AZURILL, + SLOT_MACHINE_MATCHED_POWER, + SLOT_MACHINE_MATCHED_777_MIXED, + SLOT_MACHINE_MATCHED_777_RED, + SLOT_MACHINE_MATCHED_777_BLUE, + SLOT_MACHINE_MATCHED_NONE +}; + +struct SlotMachineEwramStruct +{ + /*0x00*/ u8 state; + /*0x01*/ u8 unk01; + /*0x02*/ u8 pikaPower; + /*0x03*/ u8 unk03; + /*0x04*/ u8 unk04; + /*0x05*/ u8 unk05; + /*0x06*/ u8 unk06; + /*0x07*/ u8 unk07; + /*0x08*/ u16 matchedSymbols; + /*0x0A*/ u8 unk0A; + /*0x0B*/ u8 unk0B; + /*0x0C*/ s16 coins; + /*0x0E*/ s16 payout; + /*0x10*/ s16 unk10; + /*0x12*/ s16 bet; + /*0x14*/ s16 unk14; + /*0x16*/ s16 unk16; + /*0x18*/ s16 unk18; + /*0x1A*/ s16 unk1A; + /*0x1C*/ s16 unk1C[3]; + /*0x22*/ u16 unk22[3]; + /*0x28*/ s16 reelPositions[3]; + /*0x2E*/ s16 unk2E[3]; + /*0x34*/ s16 unk34[3]; + /*0x3A*/ u8 reelTasks[3]; + /*0x3D*/ u8 unk3D; + /*0x3E*/ u8 unk3E; + /*0x3F*/ u8 unk3F; + /*0x40*/ u8 unk40; + /*0x41*/ u8 unk41; + /*0x42*/ u8 unk42; + /*0x43*/ u8 unk43; + /*0x44*/ u8 unk44[5]; + /*0x49*/ u8 unk49[2]; + /*0x49*/ u8 unk4B[3]; + /*0x4E*/ u8 unk4E[2]; + /*0x50*/ u8 unk50[2]; + /*0x52*/ u8 unk52[2]; + /*0x54*/ u8 unk54[4]; + /*0x58*/ u16 win0h; + /*0x5a*/ u16 win0v; + /*0x5c*/ u16 winIn; + /*0x5e*/ u16 winOut; + /*0x60*/ u16 backupMapMusic; + /*0x64*/ MainCallback prevMainCb; +#if DEBUG + u32 unk68; + u32 unk6C; + u32 unk70; + u32 unk74; + u32 unk78; + u32 unk7C; + u32 unk80; + u32 unk84; + u32 unk88; + u32 unk8C; + s32 unk90; +#endif +}; + struct UnkStruct1 { /*0x00*/ u8 unk00; @@ -31,9 +118,6 @@ struct UnkStruct1 #define SLOTMACHINE_GFX_TILES 236 #endif -// TODO: figure out which functions are static and which are not. -#define static - static void CB2_SlotMachineSetup(void); static void CB2_SlotMachineLoop(void); static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb); @@ -235,12 +319,12 @@ static u8 debug_sub_811B634(void); static void debug_sub_811B654(u8 taskId); #if DEBUG -__attribute__((section(".bss"))) u8 unk_debug_bss_1_0 = 0; -__attribute__((section(".bss"))) u8 unk_debug_bss_1_1 = 0; -__attribute__((section(".bss"))) u8 unk_debug_bss_1_2 = 0; -__attribute__((section(".bss"))) u8 unk_debug_bss_1_3 = 0; -__attribute__((section(".bss"))) u8 unk_debug_bss_1_4 = 0; -__attribute__((section(".bss"))) u32 unk_debug_bss_1_8 = 0; +static u8 unk_debug_bss_1_0; +static u8 unk_debug_bss_1_1; +static u8 unk_debug_bss_1_2; +static u8 unk_debug_bss_1_3; +static u8 unk_debug_bss_1_4; +static u32 unk_debug_bss_1_8; #endif static const struct UnkStruct1 *const gUnknown_083ED048[]; @@ -517,7 +601,8 @@ static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = static void sub_8101D24(u8 taskId) { - while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId)); + while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId)) + ; } static bool8 sub_8101D5C(struct Task *task) @@ -531,9 +616,7 @@ static bool8 sub_8101D5C(struct Task *task) static bool8 sub_8101D8C(struct Task *task) { if (!gPaletteFade.active) - { eSlotMachine->state++; - } return FALSE; } @@ -4039,563 +4122,180 @@ static void sub_81065DC(void) } } -struct UnknownMenuAction +static const u8 sReelSymbols[][21] = { - const u8 *text; - void (*func)(); + { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY + }, + { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY + }, + { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY + }, }; -#if DEBUG - -void debug_sub_811B1C4(void) -{ - unk_debug_bss_1_3 |= 2; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 2) ? 0 : 2; -} +static const u8 gUnknown_083ECCF1[] = { + 1, 0, 5, 4, 3, 2 +}; -void debug_sub_811B1EC(void) -{ - unk_debug_bss_1_3 |= 1; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 1) ? 0 : 1; -} +static const s16 gUnknown_083ECCF8[][2] = { + {0, 6}, + {0, 10}, + {0, 2} +}; -void debug_sub_811B210(void) -{ - unk_debug_bss_1_3 |= 4; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 4) ? 0 : 4; -} +static const u8 gUnknown_083ECD04[][3] = { + {1, 1, 12}, + {1, 1, 14}, + {2, 2, 14}, + {2, 2, 14}, + {2, 3, 16}, + {3, 3, 16} +}; -void debug_sub_811B238(void) -{ - unk_debug_bss_1_3 |= 8; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 8) ? 0 : 8; -} +static const u8 gUnknown_083ECD16[][6] = { + {25, 25, 30, 40, 40, 50}, + {25, 25, 30, 30, 35, 35}, + {25, 25, 30, 25, 25, 30} +}; -void debug_sub_811B260(void) -{ - unk_debug_bss_1_3 |= 0x10; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x10) ? 0 : 0x10; -} +static const u8 gUnknown_083ECD28[][6] = { + {20, 25, 25, 20, 25, 25}, + {12, 15, 15, 18, 19, 22}, + {25, 25, 25, 30, 30, 40}, + {25, 25, 20, 20, 15, 15}, + {40, 40, 35, 35, 40, 40} +}; -void debug_sub_811B288(void) -{ - unk_debug_bss_1_3 |= 0x40; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x40) ? 0 : 0x40; -} +static const u8 gUnknown_083ECD46[][17] = { + {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5}, + { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5}, + { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40}, + { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100}, + { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6} +}; -void debug_sub_811B2B0(void) -{ - unk_debug_bss_1_3 |= 0x80; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x80) ? 0 : 0x80; -} +static const u8 gUnknown_083ECDAC[][17] = { + { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5}, + { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6}, + { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35}, + { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50}, + { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60} +}; -void debug_sub_811B2D8(void) -{ - unk_debug_bss_1_3 |= 0x20; -} +static const u16 gUnknown_083ECE12[] = { + 0x80, 0xaf, 0xc8, 0xe1, 0x100 +}; -void debug_sub_811B2E8(void) -{ - u8 text[2]; +static const u16 gUnknown_083ECE1C[][2] = { + {10, 5}, + {10, 10}, + {10, 15}, + {10, 25}, + {10, 35} +}; - ConvertIntToDecimalStringN(text, eSlotMachine->unk01 + 1, 2, 1); - Menu_PrintText(text, 6, 1); -} +static const u16 gUnknown_083ECE30[] = { + 0, 5, 10, 15, 20 +}; -static const u8 Str_841B1C4[]; -static const u8 Str_841B1CB[]; -static const u8 Str_841B1D4[]; -static const u8 Str_841B1DB[]; -static const u8 Str_841B1E2[]; -static const u8 Str_841B1E8[]; -static const u8 Str_841B1F3[]; -static const u8 Str_841B202[]; -static const u8 Str_841B211[]; -static const u8 Str_841B219[]; -static const u8 Str_841B220[]; -static const u8 Str_841B227[]; -static const u8 Str_841B22E[]; -static const u8 Str_841B235[]; -static const u8 Str_841B23B[]; -static const u8 Str_841B23F[]; -static const u8 Str_841B243[]; -static const u8 Str_841B246[]; -static const u8 Str_841B249[]; -static const u8 Str_841B24C[]; -static const u8 Str_841B254[]; -static const u8 Str_841B25C[]; -static const u8 Str_841B264[]; -static const u8 Str_841B26D[]; -void debug_sub_811B310(void) -{ - u8 text[5]; +static const u8 gUnknown_083ECE3A[] = { + 6, 4, 3, 2, 5, 0, 0, 0 +}; - Menu_PrintText(Str_841B1C4, 1, 1); - Menu_PrintText(Str_841B1CB, 1, 3); - Menu_PrintText(Str_841B1D4, 1, 5); - Menu_PrintText(Str_841B1DB, 1, 7); - Menu_PrintText(Str_841B1E2, 1, 9); - Menu_PrintText(Str_841B1E8, 1, 11); - Menu_PrintText(Str_841B1F3, 1, 13); - Menu_PrintText(Str_841B202, 1, 15); - Menu_PrintText(Str_841B24C, 1, 17); - Menu_PrintText(Str_841B211, 15, 1); - Menu_PrintText(Str_841B219, 15, 3); - Menu_PrintText(Str_841B220, 15, 5); - Menu_PrintText(Str_841B227, 15, 7); - Menu_PrintText(Str_841B22E, 15, 9); - Menu_PrintText(Str_841B235, 15, 11); - Menu_PrintText(Str_841B23B, 15, 13); - Menu_PrintText(Str_841B23F, 15, 15); - Menu_PrintText(Str_841B243, 15, 17); - if (eSlotMachine->unk03 == 0) - Menu_PrintText(Str_841B246, 10, 9); - else - Menu_PrintText(Str_841B249, 10, 9); +static const u16 gUnknown_083ECE42[] = { + 0x80, 0x20, 0x40 +}; -#define PRINT_NUMBER(n, x, y) \ - ConvertIntToDecimalStringN(text, n, 2, 4); \ - Menu_PrintText(text, x, y); +static const u16 gUnknown_083ECE48[] = { + 0x10, 0x08, 0x04, 0x02, 0x01 +}; - PRINT_NUMBER(eSlotMachine->unk68, 10, 3); - PRINT_NUMBER(eSlotMachine->unk6C, 10, 5); - PRINT_NUMBER(eSlotMachine->unk10, 10, 7); - PRINT_NUMBER(eSlotMachine->unk70, 20, 3); - PRINT_NUMBER(eSlotMachine->unk74, 20, 5); - PRINT_NUMBER(eSlotMachine->unk78, 20, 7); - PRINT_NUMBER(eSlotMachine->unk7C, 20, 9); - PRINT_NUMBER(eSlotMachine->unk80, 20, 11); - PRINT_NUMBER(eSlotMachine->unk84, 20, 13); - PRINT_NUMBER(eSlotMachine->unk88, 20, 15); - PRINT_NUMBER(eSlotMachine->unk8C, 20, 17); +static const u8 sSym2Match[] = { + SLOT_MACHINE_MATCHED_777_RED, + SLOT_MACHINE_MATCHED_777_BLUE, + SLOT_MACHINE_MATCHED_AZURILL, + SLOT_MACHINE_MATCHED_LOTAD, + SLOT_MACHINE_MATCHED_1CHERRY, + SLOT_MACHINE_MATCHED_POWER, + SLOT_MACHINE_MATCHED_REPLAY +}; -#undef PRINT_NUMBER - - if (unk_debug_bss_1_0 != 0) - { - u8 y = 0; - - switch (unk_debug_bss_1_0) - { - case 2: - y = 3; - break; - case 1: - y = 5; - break; - case 4: - y = 7; - break; - case 8: - y = 9; - break; - case 16: - y = 11; - break; - case 64: - y = 13; - break; - case 128: - y = 15; - break; - } - Menu_PrintText(Str_841B26D, 23, y); - } - debug_sub_811B2E8(); -} - -static void debug_sub_811B5B4(s32 *a, s32 b) -{ - *a += b; - if (*a > 9999) - *a = 9999; -} - -static void debug_sub_811B5D0(void) -{ - unk_debug_bss_1_0 = 0; - unk_debug_bss_1_2 = 0; - unk_debug_bss_1_3 = 0; - unk_debug_bss_1_4 = 0; - eSlotMachine->unk68 = 0; - eSlotMachine->unk6C = 0; - eSlotMachine->unk70 = 0; - eSlotMachine->unk74 = 0; - eSlotMachine->unk78 = 0; - eSlotMachine->unk7C = 0; - eSlotMachine->unk80 = 0; - eSlotMachine->unk84 = 0; - eSlotMachine->unk88 = 0; - eSlotMachine->unk8C = 0; - eSlotMachine->unk90 = 0; -} - -static void debug_sub_811B620(void) -{ - CreateTask(debug_sub_811B654, 0); -} - -static u8 debug_sub_811B634(void) -{ - if (FindTaskIdByFunc(debug_sub_811B654) == 0xFF) - return 1; - else - return 0; -} - -static const struct UnknownMenuAction _841B270[]; - -static void debug_sub_811B654(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s8 selection; - - switch (task->data[0]) - { - case 0: - Menu_DrawStdWindowFrame(0, 0, 24, 19); - debug_sub_811B310(); - task->data[0]++; - break; - case 1: - if (gMain.newKeys & B_BUTTON) - { - Menu_EraseScreen(); - DestroyTask(taskId); - break; - } - if (gMain.newKeys & 0x20) - { - eSlotMachine->unk01--; - if ((s8)eSlotMachine->unk01 < 0) // Why? It's unsigned - eSlotMachine->unk01 = 5; - debug_sub_811B2E8(); - break; - } - if (gMain.newKeys & 0x10) - { - eSlotMachine->unk01++; - if (eSlotMachine->unk01 > 5) - eSlotMachine->unk01 = 0; - debug_sub_811B2E8(); - break; - } - if (gMain.newKeys & A_BUTTON) - { - task->data[0] = 3; - Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 9, 5); - Menu_PrintText(Str_841B25C, 1, 1); - Menu_PrintText(Str_841B264, 1, 3); - break; - } - if (gMain.newKeys & 4) - { - unk_debug_bss_1_2 = 0; - unk_debug_bss_1_3 = 0; - Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 10, 19); - Menu_PrintText(Str_841B254, 1, 1); - Menu_PrintItems(2, 3, 8, (void *)_841B270); - InitMenu(0, 1, 3, 8, 0, 9); - task->data[0]++; - } - if (gMain.newKeys & 8) - { - unk_debug_bss_1_4 = 1; - Menu_EraseScreen(); - DestroyTask(taskId); - } - break; - case 2: - selection = Menu_ProcessInput(); - if (selection == -2) - break; - if (selection != -1) - { - unk_debug_bss_1_2 = 1; - _841B270[selection].func(); - } - Menu_EraseScreen(); - DestroyTask(taskId); - break; - case 3: - if (gMain.newAndRepeatedKeys & 0x80) - { - eSlotMachine->coins += 100; - if (eSlotMachine->coins > 9999) - eSlotMachine->coins = 9999; - break; - } - if (gMain.newAndRepeatedKeys & 0x40) - { - eSlotMachine->coins -= 100; - if (eSlotMachine->coins <= 0) - eSlotMachine->coins = 9999; - break; - } - if (gMain.newAndRepeatedKeys & 0x20) - { - eSlotMachine->coins -= 1000; - if (eSlotMachine->coins <= 0) - eSlotMachine->coins = 9999; - break; - } - if (gMain.newAndRepeatedKeys & 0x10) - { - eSlotMachine->coins += 1000; - if (eSlotMachine->coins > 9999) - eSlotMachine->coins = 9999; - break; - } - if (gMain.newKeys & B_BUTTON) - { - Menu_EraseScreen(); - DestroyTask(taskId); - } - break; - } -} - -static const u8 Str_841B2B0[]; -static const u8 Str_841B2BF[]; -static const u8 Str_841B2D3[]; -static const u8 Str_841B2E4[]; - -static void debug_sub_811B894(void) -{ - if (eSlotMachine->matchedSymbols & 0x180) - { - eSlotMachine->unk90++; - if (eSlotMachine->unk90 > 9999) - eSlotMachine->unk90 = 9999; - if (eSlotMachine->unk90 != eSlotMachine->unk88) - { - Menu_PrintText(Str_841B2B0, 4, 15); - unk_debug_bss_1_4 = 0; - } - if (!(eSlotMachine->unk04 & 0x80)) - { - Menu_PrintText(Str_841B2D3, 4, 17); - unk_debug_bss_1_4 = 0; - } - } - else if (eSlotMachine->matchedSymbols != 0) - { - if ((eSlotMachine->unk04 & 0x80) && !(eSlotMachine->matchedSymbols & 3)) - { - Menu_PrintText(Str_841B2E4, 4, 2); - unk_debug_bss_1_4 = 0; - } - } - if (eSlotMachine->matchedSymbols == 0 && eSlotMachine->bet == 3 && !(eSlotMachine->unk04 & 0x80)) - { - u8 sym_0_1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); - u8 sym_0_2 = GetTagOfReelSymbolOnScreenAtPos(0, 2); - u8 sym_0_3 = GetTagOfReelSymbolOnScreenAtPos(0, 3); - - u8 sym_1_1 = GetTagOfReelSymbolOnScreenAtPos(1, 1); - u8 sym_1_2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); - u8 sym_1_3 = GetTagOfReelSymbolOnScreenAtPos(1, 3); - - u8 sym_2_1 = GetTagOfReelSymbolOnScreenAtPos(2, 1); - u8 sym_2_2 = GetTagOfReelSymbolOnScreenAtPos(2, 2); - u8 sym_2_3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); - - if ((sym_0_1 == 0 && sym_1_1 == 1 && sym_2_1 == 0) - || (sym_0_2 == 0 && sym_1_2 == 1 && sym_2_2 == 0) - || (sym_0_3 == 0 && sym_1_3 == 1 && sym_2_3 == 0) - || (sym_0_1 == 0 && sym_1_2 == 1 && sym_2_3 == 0) - || (sym_0_3 == 0 && sym_1_2 == 1 && sym_2_1 == 0) - || (sym_0_1 == 1 && sym_1_1 == 0 && sym_2_1 == 1) - || (sym_0_2 == 1 && sym_1_2 == 0 && sym_2_2 == 1) - || (sym_0_3 == 1 && sym_1_3 == 0 && sym_2_3 == 1) - || (sym_0_1 == 1 && sym_1_2 == 0 && sym_2_3 == 1) - || (sym_0_3 == 1 && sym_1_2 == 0 && sym_2_1 == 1)) - { - Menu_PrintText(Str_841B2BF, 4, 0); - unk_debug_bss_1_4 = 0; - } - } -} - -#endif - -static const u8 sReelSymbols[][21] = -{ - { - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY - }, - { - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_CHERRY - }, - { - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_CHERRY - }, -}; - -static const u8 gUnknown_083ECCF1[] = { - 1, 0, 5, 4, 3, 2 -}; - -static const s16 gUnknown_083ECCF8[][2] = { - {0, 6}, - {0, 10}, - {0, 2} -}; - -static const u8 gUnknown_083ECD04[][3] = { - {1, 1, 12}, - {1, 1, 14}, - {2, 2, 14}, - {2, 2, 14}, - {2, 3, 16}, - {3, 3, 16} -}; - -static const u8 gUnknown_083ECD16[][6] = { - {25, 25, 30, 40, 40, 50}, - {25, 25, 30, 30, 35, 35}, - {25, 25, 30, 25, 25, 30} -}; - -static const u8 gUnknown_083ECD28[][6] = { - {20, 25, 25, 20, 25, 25}, - {12, 15, 15, 18, 19, 22}, - {25, 25, 25, 30, 30, 40}, - {25, 25, 20, 20, 15, 15}, - {40, 40, 35, 35, 40, 40} -}; - -static const u8 gUnknown_083ECD46[][17] = { - {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5}, - { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5}, - { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40}, - { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100}, - { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6} -}; - -static const u8 gUnknown_083ECDAC[][17] = { - { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5}, - { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6}, - { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35}, - { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50}, - { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60} -}; - -static const u16 gUnknown_083ECE12[] = { - 0x80, 0xaf, 0xc8, 0xe1, 0x100 -}; - -static const u16 gUnknown_083ECE1C[][2] = { - {10, 5}, - {10, 10}, - {10, 15}, - {10, 25}, - {10, 35} -}; - -static const u16 gUnknown_083ECE30[] = { - 0, 5, 10, 15, 20 -}; - - -static const u8 gUnknown_083ECE3A[] = { - 6, 4, 3, 2, 5, 0, 0, 0 -}; - -static const u16 gUnknown_083ECE42[] = { - 0x80, 0x20, 0x40 -}; - -static const u16 gUnknown_083ECE48[] = { - 0x10, 0x08, 0x04, 0x02, 0x01 -}; - -static const u8 sSym2Match[] = { - SLOT_MACHINE_MATCHED_777_RED, - SLOT_MACHINE_MATCHED_777_BLUE, - SLOT_MACHINE_MATCHED_AZURILL, - SLOT_MACHINE_MATCHED_LOTAD, - SLOT_MACHINE_MATCHED_1CHERRY, - SLOT_MACHINE_MATCHED_POWER, - SLOT_MACHINE_MATCHED_REPLAY -}; - -static const u16 sSlotMatchFlags[] = { - 1 << SLOT_MACHINE_MATCHED_1CHERRY, - 1 << SLOT_MACHINE_MATCHED_2CHERRY, - 1 << SLOT_MACHINE_MATCHED_REPLAY, - 1 << SLOT_MACHINE_MATCHED_LOTAD, - 1 << SLOT_MACHINE_MATCHED_AZURILL, - 1 << SLOT_MACHINE_MATCHED_POWER, - 1 << SLOT_MACHINE_MATCHED_777_MIXED, - 1 << SLOT_MACHINE_MATCHED_777_RED, - 1 << SLOT_MACHINE_MATCHED_777_BLUE -}; +static const u16 sSlotMatchFlags[] = { + 1 << SLOT_MACHINE_MATCHED_1CHERRY, + 1 << SLOT_MACHINE_MATCHED_2CHERRY, + 1 << SLOT_MACHINE_MATCHED_REPLAY, + 1 << SLOT_MACHINE_MATCHED_LOTAD, + 1 << SLOT_MACHINE_MATCHED_AZURILL, + 1 << SLOT_MACHINE_MATCHED_POWER, + 1 << SLOT_MACHINE_MATCHED_777_MIXED, + 1 << SLOT_MACHINE_MATCHED_777_RED, + 1 << SLOT_MACHINE_MATCHED_777_BLUE +}; static const u16 sSlotPayouts[] = { 2, 4, 0, 6, 12, 3, 90, 300, 300 @@ -5853,46 +5553,208 @@ static const struct SpritePalette gSlotMachineSpritePalettes[] = { static const u8 sReelTimeGfx[] = INCBIN_U8("graphics/slot_machine/reel_time.4bpp.lz"); -static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin"); +static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin"); + +#if DEBUG + +static void debug_sub_811B1C4(void) +{ + unk_debug_bss_1_3 |= 2; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 2) ? 0 : 2; +} + +static void debug_sub_811B1EC(void) +{ + unk_debug_bss_1_3 |= 1; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 1) ? 0 : 1; +} + +static void debug_sub_811B210(void) +{ + unk_debug_bss_1_3 |= 4; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 4) ? 0 : 4; +} + +static void debug_sub_811B238(void) +{ + unk_debug_bss_1_3 |= 8; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 8) ? 0 : 8; +} + +static void debug_sub_811B260(void) +{ + unk_debug_bss_1_3 |= 0x10; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x10) ? 0 : 0x10; +} + +static void debug_sub_811B288(void) +{ + unk_debug_bss_1_3 |= 0x40; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x40) ? 0 : 0x40; +} + +static void debug_sub_811B2B0(void) +{ + unk_debug_bss_1_3 |= 0x80; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x80) ? 0 : 0x80; +} + +static void debug_sub_811B2D8(void) +{ + unk_debug_bss_1_3 |= 0x20; +} + +static void debug_sub_811B2E8(void) +{ + u8 text[2]; + + ConvertIntToDecimalStringN(text, eSlotMachine->unk01 + 1, 2, 1); + Menu_PrintText(text, 6, 1); +} + +static const u8 Str_841B1C4[] = _("SETTEI"); +static const u8 Str_841B1CB[] = _("MAWASITA"); +static const u8 Str_841B1D4[] = _("MODOSI"); +static const u8 Str_841B1DB[] = _("NOMARE"); +static const u8 Str_841B1E2[] = _("MAE 7"); +static const u8 Str_841B1E8[] = _("LR  HENKOU"); +static const u8 Str_841B1F3[] = _("START  JIDOUSU"); +static const u8 Str_841B202[] = _("SELECT  SETTEI"); +static const u8 Str_841B211[] = _("TYUHSEN"); +static const u8 Str_841B219[] = _("CHERRY"); +static const u8 Str_841B220[] = _("REPLAY"); +static const u8 Str_841B227[] = _("HASUBO"); +static const u8 Str_841B22E[] = _("RURIRI"); +static const u8 Str_841B235[] = _("INAZU"); +static const u8 Str_841B23B[] = _("REG"); +static const u8 Str_841B23F[] = _("BIG"); +static const u8 Str_841B243[] = _("BD"); +static const u8 Str_841B246[] = _("R7"); +static const u8 Str_841B249[] = _("B7"); +static const u8 Str_841B24C[] = _("A  COIN"); +static const u8 Str_841B254[] = _("TYUHSEN"); +static const u8 Str_841B25C[] = _("UD  100"); +static const u8 Str_841B264[] = _("LR  1000"); +static const u8 Str_841B26D[] = _("×"); + +void debug_sub_811B310(void) +{ + u8 text[5]; + + Menu_PrintText(Str_841B1C4, 1, 1); + Menu_PrintText(Str_841B1CB, 1, 3); + Menu_PrintText(Str_841B1D4, 1, 5); + Menu_PrintText(Str_841B1DB, 1, 7); + Menu_PrintText(Str_841B1E2, 1, 9); + Menu_PrintText(Str_841B1E8, 1, 11); + Menu_PrintText(Str_841B1F3, 1, 13); + Menu_PrintText(Str_841B202, 1, 15); + Menu_PrintText(Str_841B24C, 1, 17); + Menu_PrintText(Str_841B211, 15, 1); + Menu_PrintText(Str_841B219, 15, 3); + Menu_PrintText(Str_841B220, 15, 5); + Menu_PrintText(Str_841B227, 15, 7); + Menu_PrintText(Str_841B22E, 15, 9); + Menu_PrintText(Str_841B235, 15, 11); + Menu_PrintText(Str_841B23B, 15, 13); + Menu_PrintText(Str_841B23F, 15, 15); + Menu_PrintText(Str_841B243, 15, 17); + if (eSlotMachine->unk03 == 0) + Menu_PrintText(Str_841B246, 10, 9); + else + Menu_PrintText(Str_841B249, 10, 9); + +#define PRINT_NUMBER(n, x, y) \ + ConvertIntToDecimalStringN(text, n, 2, 4); \ + Menu_PrintText(text, x, y); + + PRINT_NUMBER(eSlotMachine->unk68, 10, 3); + PRINT_NUMBER(eSlotMachine->unk6C, 10, 5); + PRINT_NUMBER(eSlotMachine->unk10, 10, 7); + PRINT_NUMBER(eSlotMachine->unk70, 20, 3); + PRINT_NUMBER(eSlotMachine->unk74, 20, 5); + PRINT_NUMBER(eSlotMachine->unk78, 20, 7); + PRINT_NUMBER(eSlotMachine->unk7C, 20, 9); + PRINT_NUMBER(eSlotMachine->unk80, 20, 11); + PRINT_NUMBER(eSlotMachine->unk84, 20, 13); + PRINT_NUMBER(eSlotMachine->unk88, 20, 15); + PRINT_NUMBER(eSlotMachine->unk8C, 20, 17); + +#undef PRINT_NUMBER + + if (unk_debug_bss_1_0 != 0) + { + u8 y = 0; + + switch (unk_debug_bss_1_0) + { + case 2: + y = 3; + break; + case 1: + y = 5; + break; + case 4: + y = 7; + break; + case 8: + y = 9; + break; + case 16: + y = 11; + break; + case 64: + y = 13; + break; + case 128: + y = 15; + break; + } + Menu_PrintText(Str_841B26D, 23, y); + } + debug_sub_811B2E8(); +} + +static void debug_sub_811B5B4(s32 *a, s32 b) +{ + *a += b; + if (*a > 9999) + *a = 9999; +} -#if DEBUG +static void debug_sub_811B5D0(void) +{ + unk_debug_bss_1_0 = 0; + unk_debug_bss_1_2 = 0; + unk_debug_bss_1_3 = 0; + unk_debug_bss_1_4 = 0; + eSlotMachine->unk68 = 0; + eSlotMachine->unk6C = 0; + eSlotMachine->unk70 = 0; + eSlotMachine->unk74 = 0; + eSlotMachine->unk78 = 0; + eSlotMachine->unk7C = 0; + eSlotMachine->unk80 = 0; + eSlotMachine->unk84 = 0; + eSlotMachine->unk88 = 0; + eSlotMachine->unk8C = 0; + eSlotMachine->unk90 = 0; +} -static void debug_sub_811B1C4(void); -static void debug_sub_811B1EC(void); -static void debug_sub_811B210(void); -static void debug_sub_811B238(void); -static void debug_sub_811B260(void); -static void debug_sub_811B288(void); -static void debug_sub_811B2B0(void); -static void debug_sub_811B2D8(void); +static void debug_sub_811B620(void) +{ + CreateTask(debug_sub_811B654, 0); +} -static const u8 Str_841B1C4[] = _("SETTEI"); -static const u8 Str_841B1CB[] = _("MAWASITA"); -static const u8 Str_841B1D4[] = _("MODOSI"); -static const u8 Str_841B1DB[] = _("NOMARE"); -static const u8 Str_841B1E2[] = _("MAE 7"); -static const u8 Str_841B1E8[] = _("LR  HENKOU"); -static const u8 Str_841B1F3[] = _("START  JIDOUSU"); -static const u8 Str_841B202[] = _("SELECT  SETTEI"); -static const u8 Str_841B211[] = _("TYUHSEN"); -static const u8 Str_841B219[] = _("CHERRY"); -static const u8 Str_841B220[] = _("REPLAY"); -static const u8 Str_841B227[] = _("HASUBO"); -static const u8 Str_841B22E[] = _("RURIRI"); -static const u8 Str_841B235[] = _("INAZU"); -static const u8 Str_841B23B[] = _("REG"); -static const u8 Str_841B23F[] = _("BIG"); -static const u8 Str_841B243[] = _("BD"); -static const u8 Str_841B246[] = _("R7"); -static const u8 Str_841B249[] = _("B7"); -static const u8 Str_841B24C[] = _("A  COIN"); -static const u8 Str_841B254[] = _("TYUHSEN"); -static const u8 Str_841B25C[] = _("UD  100"); -static const u8 Str_841B264[] = _("LR  1000"); -static const u8 Str_841B26D[] = _("×"); +static u8 debug_sub_811B634(void) +{ + if (FindTaskIdByFunc(debug_sub_811B654) == 0xFF) + return 1; + else + return 0; +} -// Is this MenuAction2? I'm not sure. -static const struct UnknownMenuAction _841B270[] = +static const struct {const u8 *text; void (*func)();} _841B270[] = { {Str_841B219, debug_sub_811B1C4}, {Str_841B220, debug_sub_811B1EC}, @@ -5904,9 +5766,178 @@ static const struct UnknownMenuAction _841B270[] = {Str_841B243, debug_sub_811B2D8}, }; +static void debug_sub_811B654(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s8 selection; + + switch (task->data[0]) + { + case 0: + Menu_DrawStdWindowFrame(0, 0, 24, 19); + debug_sub_811B310(); + task->data[0]++; + break; + case 1: + if (gMain.newKeys & B_BUTTON) + { + Menu_EraseScreen(); + DestroyTask(taskId); + break; + } + if (gMain.newKeys & 0x20) + { + eSlotMachine->unk01--; + if ((s8)eSlotMachine->unk01 < 0) // Why? It's unsigned + eSlotMachine->unk01 = 5; + debug_sub_811B2E8(); + break; + } + if (gMain.newKeys & 0x10) + { + eSlotMachine->unk01++; + if (eSlotMachine->unk01 > 5) + eSlotMachine->unk01 = 0; + debug_sub_811B2E8(); + break; + } + if (gMain.newKeys & A_BUTTON) + { + task->data[0] = 3; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 9, 5); + Menu_PrintText(Str_841B25C, 1, 1); + Menu_PrintText(Str_841B264, 1, 3); + break; + } + if (gMain.newKeys & 4) + { + unk_debug_bss_1_2 = 0; + unk_debug_bss_1_3 = 0; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 10, 19); + Menu_PrintText(Str_841B254, 1, 1); + Menu_PrintItems(2, 3, 8, (void *)_841B270); + InitMenu(0, 1, 3, 8, 0, 9); + task->data[0]++; + } + if (gMain.newKeys & 8) + { + unk_debug_bss_1_4 = 1; + Menu_EraseScreen(); + DestroyTask(taskId); + } + break; + case 2: + selection = Menu_ProcessInput(); + if (selection == -2) + break; + if (selection != -1) + { + unk_debug_bss_1_2 = 1; + _841B270[selection].func(); + } + Menu_EraseScreen(); + DestroyTask(taskId); + break; + case 3: + if (gMain.newAndRepeatedKeys & 0x80) + { + eSlotMachine->coins += 100; + if (eSlotMachine->coins > 9999) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x40) + { + eSlotMachine->coins -= 100; + if (eSlotMachine->coins <= 0) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x20) + { + eSlotMachine->coins -= 1000; + if (eSlotMachine->coins <= 0) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x10) + { + eSlotMachine->coins += 1000; + if (eSlotMachine->coins > 9999) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newKeys & B_BUTTON) + { + Menu_EraseScreen(); + DestroyTask(taskId); + } + break; + } +} + static const u8 Str_841B2B0[] = _("·カウントエラーがおきました"); static const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました"); static const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました"); static const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました"); +static void debug_sub_811B894(void) +{ + if (eSlotMachine->matchedSymbols & 0x180) + { + eSlotMachine->unk90++; + if (eSlotMachine->unk90 > 9999) + eSlotMachine->unk90 = 9999; + if (eSlotMachine->unk90 != eSlotMachine->unk88) + { + Menu_PrintText(Str_841B2B0, 4, 15); + unk_debug_bss_1_4 = 0; + } + if (!(eSlotMachine->unk04 & 0x80)) + { + Menu_PrintText(Str_841B2D3, 4, 17); + unk_debug_bss_1_4 = 0; + } + } + else if (eSlotMachine->matchedSymbols != 0) + { + if ((eSlotMachine->unk04 & 0x80) && !(eSlotMachine->matchedSymbols & 3)) + { + Menu_PrintText(Str_841B2E4, 4, 2); + unk_debug_bss_1_4 = 0; + } + } + if (eSlotMachine->matchedSymbols == 0 && eSlotMachine->bet == 3 && !(eSlotMachine->unk04 & 0x80)) + { + u8 sym_0_1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + u8 sym_0_2 = GetTagOfReelSymbolOnScreenAtPos(0, 2); + u8 sym_0_3 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + + u8 sym_1_1 = GetTagOfReelSymbolOnScreenAtPos(1, 1); + u8 sym_1_2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + u8 sym_1_3 = GetTagOfReelSymbolOnScreenAtPos(1, 3); + + u8 sym_2_1 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + u8 sym_2_2 = GetTagOfReelSymbolOnScreenAtPos(2, 2); + u8 sym_2_3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + + if ((sym_0_1 == 0 && sym_1_1 == 1 && sym_2_1 == 0) + || (sym_0_2 == 0 && sym_1_2 == 1 && sym_2_2 == 0) + || (sym_0_3 == 0 && sym_1_3 == 1 && sym_2_3 == 0) + || (sym_0_1 == 0 && sym_1_2 == 1 && sym_2_3 == 0) + || (sym_0_3 == 0 && sym_1_2 == 1 && sym_2_1 == 0) + || (sym_0_1 == 1 && sym_1_1 == 0 && sym_2_1 == 1) + || (sym_0_2 == 1 && sym_1_2 == 0 && sym_2_2 == 1) + || (sym_0_3 == 1 && sym_1_3 == 0 && sym_2_3 == 1) + || (sym_0_1 == 1 && sym_1_2 == 0 && sym_2_3 == 1) + || (sym_0_3 == 1 && sym_1_2 == 0 && sym_2_1 == 1)) + { + Menu_PrintText(Str_841B2BF, 4, 0); + unk_debug_bss_1_4 = 0; + } + } +} + #endif -- cgit v1.2.3 From 051af13fe7f92644f2bacc9c225dd7ff52b6cc56 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Fri, 16 Feb 2018 22:51:19 -0600 Subject: decompile more debug code --- src/field/field_player_avatar.c | 221 +----- src/field/fldeff_flash.c | 30 +- src/field/fldeff_secretpower.c | 128 +--- src/field/party_menu.c | 1531 +++++++++++---------------------------- src/field/secret_base.c | 511 +++++-------- 5 files changed, 667 insertions(+), 1754 deletions(-) (limited to 'src') diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index a7594372d..079fe38d7 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -12,6 +12,7 @@ #include "constants/map_objects.h" #include "menu.h" #include "metatile_behavior.h" +#include "new_game.h" #include "party_menu.h" #include "random.h" #include "overworld.h" @@ -32,9 +33,9 @@ static void npc_clear_strange_bits(struct MapObject *a); static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); static void PlayerAllowForcedMovementIfMovingSameDirection(void); static bool8 TryDoMetatileBehaviorForcedMovement(void); -/*static*/ u8 GetForcedMovementByMetatileBehavior(void); +static u8 GetForcedMovementByMetatileBehavior(void); static void MovePlayerNotOnBike(u8 a, u16 b); -/*static*/ u8 CheckMovementInputNotOnBike(u8 a); +static u8 CheckMovementInputNotOnBike(u8 a); static u8 CheckForPlayerAvatarCollision(u8 a); static u8 sub_8058EF0(s16 a, s16 b, u8 c); static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c); @@ -51,6 +52,8 @@ static void sub_8059D60(struct MapObject *a); static void StartStrengthAnim(u8 a, u8 b); static void DoPlayerMatJump(void); static void sub_805A06C(void); +u8 debug_sub_805F2B0(u8); +u8 debug_sub_805F2DC(u8); static bool8 (*const gUnknown_0830FB58[])(u8) = { @@ -260,59 +263,16 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void) gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; } -#if DEBUG -__attribute__((naked)) -u8 TryDoMetatileBehaviorForcedMovement() -{ - asm( - " push {r4, lr}\n" - " ldr r0, ._27 @ gUnknown_020297ED\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._25 @cond_branch\n" - " ldr r0, ._27 + 4 @ gMain\n" - " ldrh r1, [r0, #0x2c]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._25 @cond_branch\n" - " mov r0, #0x0\n" - " b ._26\n" - "._28:\n" - " .align 2, 0\n" - "._27:\n" - " .word gUnknown_020297ED\n" - " .word gMain\n" - "._25:\n" - " ldr r4, ._29 @ gUnknown_0830FBA0\n" - " bl GetForcedMovementByMetatileBehavior\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x16\n" - " add r0, r0, r4\n" - " ldr r0, [r0]\n" - " bl _call_via_r0\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - "._26:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "._30:\n" - " .align 2, 0\n" - "._29:\n" - " .word gUnknown_0830FBA0\n" - "\n" - ); -} -#else static bool8 TryDoMetatileBehaviorForcedMovement(void) { +#if DEBUG + if (gUnknown_020297ED != 0 && (gMain.heldKeys & 0x100)) + return 0; +#endif return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); } -#endif -/*static*/ u8 GetForcedMovementByMetatileBehavior(void) +static u8 GetForcedMovementByMetatileBehavior(void) { u8 i; @@ -483,57 +443,16 @@ bool8 ForcedMovement_MuddySlope(void) } } -#if DEBUG -__attribute__((naked)) -void MovePlayerNotOnBike(u8 u81, u16 u161) -{ - asm( - " push {r4, r5, r6, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " add r5, r2, #0\n" - " lsl r1, r1, #0x10\n" - " lsr r6, r1, #0x10\n" - " ldr r0, ._84 @ gUnknown_020297ED\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._82 @cond_branch\n" - " add r0, r2, #0\n" - " bl debug_sub_805F2B0\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._83 @cond_branch\n" - "._82:\n" - " ldr r4, ._84 + 4 @ gUnknown_0830FBEC\n" - " add r0, r5, #0\n" - " bl CheckMovementInputNotOnBike\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x16\n" - " add r0, r0, r4\n" - " ldr r2, [r0]\n" - " add r0, r5, #0\n" - " add r1, r6, #0\n" - " bl _call_via_r2\n" - "._83:\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._85:\n" - " .align 2, 0\n" - "._84:\n" - " .word gUnknown_020297ED\n" - " .word gUnknown_0830FBEC\n" - "\n" - ); -} -#else static void MovePlayerNotOnBike(u8 direction, u16 heldKeys) { +#if DEBUG + if (gUnknown_020297ED != 0 && debug_sub_805F2B0(direction) != 0) + return; +#endif gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys); } -#endif -/*static*/ u8 CheckMovementInputNotOnBike(u8 direction) +static u8 CheckMovementInputNotOnBike(u8 direction) { if (direction == DIR_NONE) { @@ -1857,96 +1776,24 @@ static void sub_805A954(void) } #if DEBUG -__attribute__((naked)) -void debug_sub_805F2B0() -{ - asm( - " push {lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r2, r0, #0x18\n" - " ldr r0, ._422 @ gMain\n" - " ldrh r1, [r0, #0x2c]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._420 @cond_branch\n" - " mov r0, #0x0\n" - " b ._421\n" - "._423:\n" - " .align 2, 0\n" - "._422:\n" - " .word gMain\n" - "._420:\n" - " add r0, r2, #0\n" - " bl debug_sub_805F2DC\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - "._421:\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} - -__attribute__((naked)) -void debug_sub_805F2DC() -{ - asm( - " push {r4, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0\n" - " bne ._424 @cond_branch\n" - " ldr r2, ._426 @ gMapObjects\n" - " ldr r0, ._426 + 4 @ gPlayerAvatar\n" - " ldrb r1, [r0, #0x5]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r2\n" - " ldrb r0, [r0, #0x18]\n" - " lsr r0, r0, #0x4\n" - " bl PlayerFaceDirection\n" - " b ._430\n" - "._427:\n" - " .align 2, 0\n" - "._426:\n" - " .word gMapObjects\n" - " .word gPlayerAvatar\n" - "._424:\n" - " ldr r2, ._431 @ gMapObjects\n" - " ldr r0, ._431 + 4 @ gPlayerAvatar\n" - " ldrb r1, [r0, #0x5]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r2\n" - " ldrb r0, [r0, #0x1]\n" - " lsr r0, r0, #0x7\n" - " cmp r0, #0\n" - " beq ._429 @cond_branch\n" - " add r0, r4, #0\n" - " bl CanCameraMoveInDirection\n" - " cmp r0, #0\n" - " bne ._429 @cond_branch\n" - " add r0, r4, #0\n" - " bl PlayerOnBikeCollide\n" - " b ._430\n" - "._432:\n" - " .align 2, 0\n" - "._431:\n" - " .word gMapObjects\n" - " .word gPlayerAvatar\n" - "._429:\n" - " add r0, r4, #0\n" - " bl PlayerGoSpeed4\n" - "._430:\n" - " mov r0, #0x1\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + +u8 debug_sub_805F2B0(u8 a) +{ + if (gMain.heldKeys & 0x100) + return debug_sub_805F2DC(a); + else + return 0; } + +u8 debug_sub_805F2DC(u8 a) +{ + if (a == 0) + PlayerFaceDirection(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18); + else if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 && !CanCameraMoveInDirection(a)) + PlayerOnBikeCollide(a); + else + PlayerGoSpeed4(a); + return 1; +} + #endif diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c index 8c0f09bd9..30ddd0f6c 100644 --- a/src/field/fldeff_flash.c +++ b/src/field/fldeff_flash.c @@ -72,33 +72,15 @@ static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_trans static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz"); #if DEBUG -__attribute__((naked)) + void debug_sub_8122080(void) { - asm("\ - push {lr}\n\ - ldr r0, ._4 @ gMapHeader\n\ - ldrb r0, [r0, #0x15]\n\ - cmp r0, #0x1\n\ - bne ._2 @cond_branch\n\ - ldr r0, ._4 + 4 @ 0x828\n\ - bl FlagGet\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._2 @cond_branch\n\ - bl sub_810CBFC\n\ - b ._3\n\ -._5:\n\ - .align 2, 0\n\ -._4:\n\ - .word gMapHeader\n\ - .word 0x828\n\ -._2:\n\ - bl ScriptContext2_Disable\n\ -._3:\n\ - pop {r0}\n\ - bx r0"); + if (gMapHeader.cave == 1 && !FlagGet(FLAG_SYS_USE_FLASH)) + sub_810CBFC(); + else + ScriptContext2_Disable(); } + #endif bool8 SetUpFieldMove_Flash(void) diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c index 0e91bb55c..c998448a4 100644 --- a/src/field/fldeff_secretpower.c +++ b/src/field/fldeff_secretpower.c @@ -245,98 +245,44 @@ void sub_80C6280(void) #if DEBUG -__attribute__((naked)) -void debug_sub_80D93F4() -{ - asm("\ - push {r4, lr}\n\ - bl sub_80BB63C\n\ - ldr r0, ._98 @ gSpecialVar_Result\n\ - ldrh r0, [r0]\n\ - cmp r0, #0x1\n\ - beq ._95 @cond_branch\n\ - bl player_get_direction_lower_nybble\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x2\n\ - beq ._96 @cond_branch\n\ -._95:\n\ - bl ScriptContext2_Disable\n\ - b ._109\n\ -._99:\n\ - .align 2, 0\n\ -._98:\n\ - .word gSpecialVar_Result\n\ -._96:\n\ - ldr r4, ._102 @ gUnknown_0203923C\n\ - add r1, r4, #2\n\ - add r0, r4, #0\n\ - bl GetXYCoordsOneStepInFrontOfPlayer\n\ - mov r1, #0x0\n\ - ldsh r0, [r4, r1]\n\ - mov r2, #0x2\n\ - ldsh r1, [r4, r2]\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsl r0, r0, #0x18\n\ - lsr r4, r0, #0x18\n\ - add r0, r4, #0\n\ - bl MetatileBehavior_IsSecretBaseCave\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bne ._100 @cond_branch\n\ - bl sub_80C6264\n\ - ldr r1, ._102 + 4 @ gLastFieldPokeMenuOpened\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ - bl sub_80C639C\n\ - b ._109\n\ -._103:\n\ - .align 2, 0\n\ -._102:\n\ - .word gUnknown_0203923C\n\ - .word gLastFieldPokeMenuOpened\n\ -._100:\n\ - add r0, r4, #0\n\ - bl MetatileBehavior_IsSecretBaseTree\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bne ._104 @cond_branch\n\ - bl sub_80C6264\n\ - ldr r1, ._106 @ gLastFieldPokeMenuOpened\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ - bl sub_80C64A8\n\ - b ._109\n\ -._107:\n\ - .align 2, 0\n\ -._106:\n\ - .word gLastFieldPokeMenuOpened\n\ -._104:\n\ - add r0, r4, #0\n\ - bl MetatileBehavior_IsSecretBaseShrub\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bne ._108 @cond_branch\n\ - bl sub_80C6264\n\ - ldr r1, ._110 @ gLastFieldPokeMenuOpened\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ - bl sub_80C660C\n\ - b ._109\n\ -._111:\n\ - .align 2, 0\n\ -._110:\n\ - .word gLastFieldPokeMenuOpened\n\ -._108:\n\ - bl ScriptContext2_Disable\n\ -._109:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0"); +void debug_sub_80D93F4(void) +{ + u8 metatile; + + sub_80BB63C(); + + if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != 2) + { + ScriptContext2_Disable(); + return; + } + + GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + metatile = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y); + if (MetatileBehavior_IsSecretBaseCave(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C639C(); + } + else if (MetatileBehavior_IsSecretBaseTree(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C64A8(); + } + else if (MetatileBehavior_IsSecretBaseShrub(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C660C(); + } + else + { + ScriptContext2_Disable(); + } } + #endif bool8 SetUpFieldMove_SecretPower(void) diff --git a/src/field/party_menu.c b/src/field/party_menu.c index 66e7e2319..c492307d3 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -1,4 +1,8 @@ #include "global.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/songs.h" +#include "constants/species.h" #include "party_menu.h" #include "battle.h" #include "battle_interface.h" @@ -11,12 +15,11 @@ #include "item.h" #include "item_use.h" #include "item_menu.h" -#include "constants/items.h" +#include "link.h" #include "mail_data.h" #include "main.h" #include "menu.h" #include "menu_helpers.h" -#include "constants/moves.h" #include "palette.h" #include "pokemon.h" #include "pokemon_icon.h" @@ -25,9 +28,7 @@ #include "pokemon_summary_screen.h" #include "rom_8077ABC.h" #include "rom_8094928.h" -#include "constants/songs.h" #include "sound.h" -#include "constants/species.h" #include "sprite.h" #include "string_util.h" #include "strings.h" @@ -397,7 +398,8 @@ static const u16 PartyMonOAMSettings_RightColumn[] = { }; // Controls where and how the mons' text appears in the party menu screen (nickname, HP, and level). -static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = { +static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = +{ { // PARTY_MENU_LAYOUT_STANDARD { 1, 4, PartyMonOAMSettings_LeftColumn}, {12, 1, PartyMonOAMSettings_RightColumn}, @@ -432,7 +434,8 @@ static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = { }, }; -static const struct PartyMenuHandlersStruct PartyMenuHandlers[] = { +static const struct PartyMenuHandlersStruct PartyMenuHandlers[] = +{ {HandleDefaultPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_STANDARD {HandleBattlePartyMenu, SetUpBattlePartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE {HandleSelectPartyMenu, SetupContestPartyMenu, 0}, // PARTY_MENU_TYPE_CONTEST @@ -493,71 +496,6 @@ extern const u8 gStatusPal_Icons[]; #define WINDOW_RIGHT (29) #endif -#if DEBUG -__attribute__((naked)) -void CB2_PartyMenuMain(void) -{ - asm("\ - push {r4, r5, r6, lr}\n\ - add sp, sp, #0xfffffffc\n\ - bl AnimateSprites\n\ - bl BuildOamBuffer\n\ - ldr r0, ._3 @ gPartyMenuType\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x4\n\ - ldr r1, ._3 + 4 @ PartyMonTextSettings\n\ - add r5, r0, r1\n\ - mov r6, #0x0\n\ -._1:\n\ - ldrb r0, [r5]\n\ - lsl r0, r0, #0x3\n\ - ldrb r1, [r5, #0x1]\n\ - lsl r1, r1, #0x3\n\ - ldr r2, [r5, #0x4]\n\ - lsl r3, r6, #0x5\n\ - mov r4, #0x80\n\ - lsl r4, r4, #0x2\n\ - orr r3, r3, r4\n\ - str r3, [sp]\n\ - mov r3, #0x0\n\ - bl DrawPartyMenuMonText\n\ - add r5, r5, #0x8\n\ - add r6, r6, #0x1\n\ - cmp r6, #0x5\n\ - ble ._1 @cond_branch\n\ - bl RunTasks\n\ - bl UpdatePaletteFade\n\ - ldr r0, ._3 + 8 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._2 @cond_branch\n\ - ldr r0, ._3 + 12 @ gLink\n\ - ldr r1, ._3 + 16 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x2\n\ - str r1, [sp]\n\ - mov r1, #0x1\n\ - mov r2, #0x1\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._2:\n\ - add sp, sp, #0x4\n\ - pop {r4, r5, r6}\n\ - pop {r0}\n\ - bx r0\n\ -._4:\n\ - .align 2, 0\n\ -._3:\n\ - .word gPartyMenuType\n\ - .word PartyMonTextSettings\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else void CB2_PartyMenuMain(void) { const struct PartyMonTextSettingsStruct *textSettings; @@ -581,8 +519,12 @@ void CB2_PartyMenuMain(void) RunTasks(); UpdatePaletteFade(); -} + +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 2); #endif +} void VBlankCB_PartyMenu(void) { @@ -621,14 +563,16 @@ bool8 SetupDefaultPartyMenu(void) switch (ewram1B000_alt.setupState) { case 0: - if (ewram1B000_alt.monIndex < gPlayerPartyCount) { + if (ewram1B000_alt.monIndex < gPlayerPartyCount) + { TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); ewram1B000_alt.monIndex++; - } else { + } + else + { ewram1B000_alt.monIndex = 0; ewram1B000_alt.setupState++; } - break; case 1: LoadHeldItemIconGraphics(); @@ -648,7 +592,6 @@ bool8 SetupDefaultPartyMenu(void) ewram1B000_alt.monIndex = 0; ewram1B000_alt.setupState++; } - break; case 4: PartyMenuPrintMonsLevelOrStatus(); @@ -687,425 +630,6 @@ bool8 SetupDefaultPartyMenu(void) return FALSE; } -#if DEBUG -__attribute__((naked)) -bool8 InitPartyMenu(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - add sp, sp, #0xfffffff4\n\ - ldr r0, ._55 @ gMain\n\ - ldr r1, ._55 + 4 @ 0x43c\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x11\n\ - bls ._53 @cond_branch\n\ - b ._125\n\ -._53:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._55 + 8 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._56:\n\ - .align 2, 0\n\ -._55:\n\ - .word gMain\n\ - .word 0x43c\n\ - .word ._57\n\ -._57:\n\ - .word ._58\n\ - .word ._59\n\ - .word ._60\n\ - .word ._61\n\ - .word ._62\n\ - .word ._63\n\ - .word ._64\n\ - .word ._65\n\ - .word ._66\n\ - .word ._67\n\ - .word ._68\n\ - .word ._69\n\ - .word ._70\n\ - .word ._71\n\ - .word ._72\n\ - .word ._73\n\ - .word ._74\n\ - .word ._75\n\ -._58:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - mov r3, #0xc0\n\ - lsl r3, r3, #0x13\n\ - mov r4, #0xc0\n\ - lsl r4, r4, #0x9\n\ - add r2, sp, #0x8\n\ - mov r8, r2\n\ - add r2, sp, #0x4\n\ - mov r6, #0x0\n\ - ldr r1, ._78 @ 0x40000d4\n\ - mov r5, #0x80\n\ - lsl r5, r5, #0x5\n\ - ldr r7, ._78 + 4 @ 0x81000800\n\ - mov r0, #0x81\n\ - lsl r0, r0, #0x18\n\ - mov ip, r0\n\ -._76:\n\ - strh r6, [r2]\n\ - add r0, sp, #0x4\n\ - str r0, [r1]\n\ - str r3, [r1, #0x4]\n\ - str r7, [r1, #0x8]\n\ - ldr r0, [r1, #0x8]\n\ - add r3, r3, r5\n\ - sub r4, r4, r5\n\ - cmp r4, r5\n\ - bhi ._76 @cond_branch\n\ - strh r6, [r2]\n\ - add r2, sp, #0x4\n\ - str r2, [r1]\n\ - str r3, [r1, #0x4]\n\ - lsr r0, r4, #0x1\n\ - mov r3, ip\n\ - orr r0, r0, r3\n\ - str r0, [r1, #0x8]\n\ - ldr r0, [r1, #0x8]\n\ - mov r0, #0xe0\n\ - lsl r0, r0, #0x13\n\ - mov r3, #0x80\n\ - lsl r3, r3, #0x3\n\ - mov r4, #0x0\n\ - str r4, [sp, #0x8]\n\ - ldr r2, ._78 @ 0x40000d4\n\ - mov r1, r8\n\ - str r1, [r2]\n\ - str r0, [r2, #0x4]\n\ - lsr r0, r3, #0x2\n\ - mov r1, #0x85\n\ - lsl r1, r1, #0x18\n\ - orr r0, r0, r1\n\ - str r0, [r2, #0x8]\n\ - ldr r0, [r2, #0x8]\n\ - mov r1, #0xa0\n\ - lsl r1, r1, #0x13\n\ - add r0, sp, #0x4\n\ - strh r4, [r0]\n\ - str r0, [r2]\n\ - str r1, [r2, #0x4]\n\ - lsr r3, r3, #0x1\n\ - mov r0, #0x81\n\ - lsl r0, r0, #0x18\n\ - orr r3, r3, r0\n\ - str r3, [r2, #0x8]\n\ - ldr r0, [r2, #0x8]\n\ - ldr r2, ._78 + 8 @ gPaletteFade\n\ - ldrb r0, [r2, #0x8]\n\ - mov r1, #0x80\n\ - orr r0, r0, r1\n\ - strb r0, [r2, #0x8]\n\ - ldr r1, ._78 + 12 @ gMain\n\ - ldr r2, ._78 + 16 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._122\n\ -._79:\n\ - .align 2, 0\n\ -._78:\n\ - .word 0x40000d4\n\ - .word 0x81000800\n\ - .word gPaletteFade\n\ - .word gMain\n\ - .word 0x43c\n\ -._59:\n\ - bl ScanlineEffect_Stop\n\ - b ._115\n\ -._60:\n\ - bl sub_806B4A8\n\ - ldr r1, ._82 @ \n\ - mov r2, #0x99\n\ - lsl r2, r2, #0x2\n\ - add r0, r1, r2\n\ - mov r2, #0x0\n\ - strh r2, [r0]\n\ - ldr r3, ._82 + 4 @ \n\ - add r0, r1, r3\n\ - strh r2, [r0]\n\ - mov r0, #0x9a\n\ - lsl r0, r0, #0x2\n\ - add r1, r1, r0\n\ - strh r2, [r1]\n\ - ldr r1, ._82 + 8 @ \n\ - ldr r2, ._82 + 12 @ \n\ - add r1, r1, r2\n\ - b ._122\n\ -._83:\n\ - .align 2, 0\n\ -._82:\n\ - .word +0x201b000\n\ - .word 0x266\n\ - .word gMain\n\ - .word 0x43c\n\ -._61:\n\ - bl ResetSpriteData\n\ - b ._115\n\ -._62:\n\ - ldr r0, ._88 @ \n\ - mov r1, #0x96\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - beq ._86 @cond_branch\n\ - cmp r0, #0x5\n\ - beq ._86 @cond_branch\n\ - bl ResetTasks\n\ -._86:\n\ - ldr r1, ._88 + 4 @ \n\ - ldr r2, ._88 + 8 @ \n\ - add r1, r1, r2\n\ - b ._122\n\ -._89:\n\ - .align 2, 0\n\ -._88:\n\ - .word +0x201b000\n\ - .word gMain\n\ - .word 0x43c\n\ -._63:\n\ - bl FreeAllSpritePalettes\n\ - b ._115\n\ -._64:\n\ - ldr r4, ._92 @ \n\ - mov r1, #0x97\n\ - lsl r1, r1, #0x2\n\ - add r0, r4, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x0\n\ - bl CreateTask\n\ - mov r2, #0x98\n\ - lsl r2, r2, #0x2\n\ - add r1, r4, r2\n\ - strb r0, [r1]\n\ - b ._115\n\ -._93:\n\ - .align 2, 0\n\ -._92:\n\ - .word +0x201b000\n\ -._65:\n\ - ldr r0, ._95 @ gWindowTemplate_81E6C90\n\ - bl Text_LoadWindowTemplate\n\ - ldr r1, ._95 + 4 @ gMain\n\ - ldr r0, ._95 + 8 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._122\n\ -._96:\n\ - .align 2, 0\n\ -._95:\n\ - .word gWindowTemplate_81E6C90\n\ - .word gMain\n\ - .word 0x43c\n\ -._66:\n\ - ldr r4, ._98 @ gUnknown_03004210\n\ - ldr r1, ._98 + 4 @ gWindowTemplate_81E6C90\n\ - add r0, r4, #0\n\ - bl Text_InitWindowWithTemplate\n\ - add r0, r4, #0\n\ - mov r1, #0x1\n\ - bl MultistepInitWindowTileData\n\ - ldr r1, ._98 + 8 @ gMain\n\ - ldr r2, ._98 + 12 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._122\n\ -._99:\n\ - .align 2, 0\n\ -._98:\n\ - .word gUnknown_03004210\n\ - .word gWindowTemplate_81E6C90\n\ - .word gMain\n\ - .word 0x43c\n\ -._67:\n\ - bl MultistepLoadFont\n\ - cmp r0, #0\n\ - bne ._100 @cond_branch\n\ - b ._125\n\ -._100:\n\ - ldr r0, ._103 @ \n\ - mov r3, #0x99\n\ - lsl r3, r3, #0x2\n\ - add r0, r0, r3\n\ - mov r1, #0x1\n\ - strh r1, [r0]\n\ - ldr r1, ._103 + 4 @ \n\ - ldr r0, ._103 + 8 @ \n\ - add r1, r1, r0\n\ - b ._122\n\ -._104:\n\ - .align 2, 0\n\ -._103:\n\ - .word +0x201b000\n\ - .word gMain\n\ - .word 0x43c\n\ -._68:\n\ - ldr r0, ._107 @ \n\ - mov r1, #0x99\n\ - lsl r1, r1, #0x2\n\ - add r4, r0, r1\n\ - ldrb r0, [r4]\n\ - bl LoadPartyMenuGraphics\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bne ._105 @cond_branch\n\ - mov r0, #0x0\n\ - strh r0, [r4]\n\ - ldr r1, ._107 + 4 @ \n\ - ldr r2, ._107 + 8 @ \n\ - add r1, r1, r2\n\ - b ._122\n\ -._108:\n\ - .align 2, 0\n\ -._107:\n\ - .word +0x201b000\n\ - .word gMain\n\ - .word 0x43c\n\ -._105:\n\ - ldrh r0, [r4]\n\ - add r0, r0, #0x1\n\ - strh r0, [r4]\n\ - b ._125\n\ -._69:\n\ - bl sub_809D51C\n\ - b ._115\n\ -._70:\n\ - ldr r2, ._113 @ PartyMenuHandlers\n\ - ldr r0, ._113 + 4 @ \n\ - mov r1, #0x96\n\ - lsl r1, r1, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x1\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x2\n\ - add r2, r2, #0x4\n\ - add r0, r0, r2\n\ - ldr r0, [r0]\n\ - bl _call_via_r0\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bne ._125 @cond_branch\n\ - ldr r1, ._113 + 8 @ \n\ - ldr r2, ._113 + 12 @ \n\ - add r1, r1, r2\n\ - b ._122\n\ -._114:\n\ - .align 2, 0\n\ -._113:\n\ - .word PartyMenuHandlers\n\ - .word +0x201b000\n\ - .word gMain\n\ - .word 0x43c\n\ -._71:\n\ - ldr r0, ._116 @ gWindowTemplate_81E6CC8\n\ - bl MultistepInitMenuWindowBegin\n\ - b ._115\n\ -._117:\n\ - .align 2, 0\n\ -._116:\n\ - .word gWindowTemplate_81E6CC8\n\ -._72:\n\ - bl MultistepInitMenuWindowContinue\n\ - cmp r0, #0\n\ - beq ._125 @cond_branch\n\ - ldr r1, ._120 @ gMain\n\ - ldr r0, ._120 + 4 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._122\n\ -._121:\n\ - .align 2, 0\n\ -._120:\n\ - .word gMain\n\ - .word 0x43c\n\ -._73:\n\ - ldr r0, ._123 @ \n\ - ldr r1, ._123 + 4 @ \n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x0\n\ - bl PrintPartyMenuPromptText\n\ - ldr r1, ._123 + 8 @ \n\ - ldr r2, ._123 + 12 @ \n\ - add r1, r1, r2\n\ - b ._122\n\ -._124:\n\ - .align 2, 0\n\ -._123:\n\ - .word +0x201b000\n\ - .word 0x259\n\ - .word gMain\n\ - .word 0x43c\n\ -._74:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - mov r1, #0x0\n\ - str r1, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r2, ._126 @ gPaletteFade\n\ - ldrb r1, [r2, #0x8]\n\ - mov r0, #0x7f\n\ - and r0, r0, r1\n\ - strb r0, [r2, #0x8]\n\ -._115:\n\ - ldr r1, ._126 + 4 @ gMain\n\ - ldr r3, ._126 + 8 @ 0x43c\n\ - add r1, r1, r3\n\ -._122:\n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - b ._125\n\ -._127:\n\ - .align 2, 0\n\ -._126:\n\ - .word gPaletteFade\n\ - .word gMain\n\ - .word 0x43c\n\ -._75:\n\ - ldr r0, ._130 @ VBlankCB_PartyMenu\n\ - bl SetVBlankCallback\n\ - ldr r0, ._130 + 4 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._128 @cond_branch\n\ - ldr r0, ._130 + 8 @ 0x600e5e0\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x8\n\ - ldr r2, ._130 + 12 @ 0x6007800\n\ - mov r3, #0x2\n\ - bl debug_sub_8008218\n\ -._128:\n\ - mov r0, #0x1\n\ - b ._129\n\ -._131:\n\ - .align 2, 0\n\ -._130:\n\ - .word VBlankCB_PartyMenu+1\n\ - .word gLinkOpen\n\ - .word 0x600e5e0\n\ - .word 0x6007800\n\ -._125:\n\ - mov r0, #0x0\n\ -._129:\n\ - add sp, sp, #0xc\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4, r5, r6, r7}\n\ - pop {r1}\n\ - bx r1"); -} -#else bool8 InitPartyMenu(void) { switch (gMain.state) @@ -1115,7 +639,6 @@ bool8 InitPartyMenu(void) DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); - gPaletteFade.bufferTransferDisabled = 1; gMain.state++; break; @@ -1136,10 +659,7 @@ bool8 InitPartyMenu(void) break; case 4: if (ewram1B000.menuType != PARTY_MENU_TYPE_BATTLE && ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) - { ResetTasks(); - } - gMain.state++; break; case 5: @@ -1183,9 +703,7 @@ bool8 InitPartyMenu(void) break; case 12: if (PartyMenuHandlers[ewram1B000.menuType].menuSetup() == TRUE) - { gMain.state++; - } break; case 13: MultistepInitMenuWindowBegin(&gWindowTemplate_81E6CC8); @@ -1193,9 +711,7 @@ bool8 InitPartyMenu(void) break; case 14: if (MultistepInitMenuWindowContinue()) - { gMain.state++; - } break; case 15: PrintPartyMenuPromptText(ewram1B000.promptTextId, 0); @@ -1208,27 +724,26 @@ bool8 InitPartyMenu(void) break; case 17: SetVBlankCallback(VBlankCB_PartyMenu); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0xE5E0), (void *)0x8000, (void *)(VRAM + 0x7800), 2); +#endif return TRUE; } return FALSE; } -#endif void CB2_InitPartyMenu(void) { while (InitPartyMenu() != TRUE) { if (sub_80F9344() == TRUE) - { return; - } } if (ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) - { ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); - } SetMainCallback2(CB2_PartyMenuMain); } @@ -1269,9 +784,7 @@ void ReDrawPartyMonBackgrounds(void) DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(BG_VRAM + 0x3000), 0x800); if (ewram1B000.unk261 == 2) - { ewram1B000.unk261 = 0; - } } } @@ -1298,119 +811,172 @@ bool8 DrawPartyMonBackground(u8 monIndex) sub_806BF24(&arr[0], 0, 3, 0); break; case 2: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 1) { + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 1) + { sub_806BA94(arr[2], arr[3], 0, 3); sub_806BF24(&arr[2], 1, 3, 0); - } else { + } + else + { sub_806BA94(arr[2], arr[3], 1, 3); } - } else if (IsLinkDoubleBattle() == TRUE) { + } + else if (IsLinkDoubleBattle() == TRUE) + { sub_806B9A4(arr[2], arr[3], 4); sub_806BF24(&arr[2], 1, 4, 0); - } else { + } + else + { sub_806B9A4(arr[2], arr[3], 3); sub_806BF24(&arr[2], 1, 3, 0); } - break; case 3: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 2) { + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 2) + { sub_806BA94(arr[4], arr[5], 0, 3); sub_806BF24(&arr[4], 2, 3, 0); - } else { + } + else + { sub_806BA94(arr[4], arr[5], 1, 3); } - } else if (IsLinkDoubleBattle() == TRUE) { - if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) { + } + else if (IsLinkDoubleBattle() == TRUE) + { + if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) + { sub_806BA94(arr[4], arr[5], 0, 3); sub_806BF24(&arr[4], 2, 3, 0); - } else { + } + else + { sub_806BA94(arr[4], arr[5], 1, 3); } - } else if (gPlayerPartyCount > 2) { + } + else if (gPlayerPartyCount > 2) + { sub_806BA94(arr[4], arr[5], 0, 3); sub_806BF24(&arr[4], 2, 3, 0); - } else { + } + else + { sub_806BA94(arr[4], arr[5], 1, 3); } - break; case 4: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 3) { + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 3) + { sub_806BA94(arr[6], arr[7], 0, 3); sub_806BF24(&arr[6], 3, 3, 0); - } else { + } + else + { sub_806BA94(arr[6], arr[7], 1, 3); } - } else if (IsLinkDoubleBattle() == TRUE) { - if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) { + } + else if (IsLinkDoubleBattle() == TRUE) + { + if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) + { sub_806BA94(arr[6], arr[7], 0, 3); sub_806BF24(&arr[6], 3, 3, 0); - } else { + } + else + { sub_806BA94(arr[6], arr[7], 1, 3); } - } else if (gPlayerPartyCount > 3) { + } + else if (gPlayerPartyCount > 3) + { sub_806BA94(arr[6], arr[7], 0, 3); sub_806BF24(&arr[6], 3, 3, 0); - } else { + } + else + { sub_806BA94(arr[6], arr[7], 1, 3); } - break; case 5: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 4) { + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 4) + { sub_806BA94(arr[8], arr[9], 0, 3); sub_806BF24(&arr[8], 4, 3, 0); - } else { + } + else + { sub_806BA94(arr[8], arr[9], 1, 3); } - } else if (IsLinkDoubleBattle() == TRUE) { - if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) { + } + else if (IsLinkDoubleBattle() == TRUE) + { + if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) + { sub_806BA94(arr[8], arr[9], 0, 4); sub_806BF24(&arr[8], 4, 4, 0); - } else { + } + else + { sub_806BA94(arr[8], arr[9], 1, 4); } - } else if (gPlayerPartyCount > 4) { + } + else if (gPlayerPartyCount > 4) + { sub_806BA94(arr[8], arr[9], 0, 3); sub_806BF24(&arr[8], 4, 3, 0); - } else { + } + else + { sub_806BA94(arr[8], arr[9], 1, 3); } - break; case 6: - if (!IsDoubleBattle()) { - if (gPlayerPartyCount > 5) { + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 5) + { sub_806BA94(arr[10], arr[11], 0, 3); sub_806BF24(&arr[10], 5, 3, 0); - } else { + } + else + { sub_806BA94(arr[10], arr[11], 1, 3); } - } else if (IsLinkDoubleBattle() == TRUE) { - if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) { + } + else if (IsLinkDoubleBattle() == TRUE) + { + if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) + { sub_806BA94(arr[10], arr[11], 0, 4); sub_806BF24(&arr[10], 5, 4, 0); - } else { + } + else + { sub_806BA94(arr[10], arr[11], 1, 4); } - } else if (gPlayerPartyCount > 5) { + } + else if (gPlayerPartyCount > 5) + { sub_806BA94(arr[10], arr[11], 0, 3); sub_806BF24(&arr[10], 5, 3, 0); - } else { + } + else + { sub_806BA94(arr[10], arr[11], 1, 3); } - break; case 7: - if (ewram1B000.menuType == PARTY_MENU_TYPE_BATTLE_TOWER) { + if (ewram1B000.menuType == PARTY_MENU_TYPE_BATTLE_TOWER) sub_806BB9C(1); - } - sub_806BBEC(1); break; case 8: @@ -1533,9 +1099,7 @@ void sub_806B9A4(s16 a, u16 b, u8 c) for (; j <= 10 && a + j <= 0x1F; j++) { if (a + j >= 0) - { gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (c << 12) | gUnknown_083769D8[i * 11 + j]; - } } } } @@ -1555,9 +1119,7 @@ void sub_806BA34(s16 a, u16 b) for (; j <= 10 && a + j <= 0x1F; j++) { if (a + j >= 0) - { gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; - } } } } @@ -1569,15 +1131,13 @@ void sub_806BA94(s16 a, u16 b, u8 c, u8 d) const u8 *arr; u16 var1; - arr = gUnknown_08376A5E; if (c == 0) - { arr = gUnknown_08376A25; - } + else + arr = gUnknown_08376A5E; var1 = b * 32; - for (i = 0; i < 3; i++) { u8 j = 0; @@ -1622,11 +1182,13 @@ void sub_806BB3C(s16 a, u16 b) void sub_806BB9C(u8 a) { u8 i; - u16 arr[12] = { + u16 arr[12] = + { 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, }; u16 *vramPtr = (u16 *)(BG_VRAM + 0x3C30); + for (i = 0; i < PARTY_SIZE; i++) { vramPtr[i] = arr[i] + (a << 12); @@ -1637,11 +1199,13 @@ void sub_806BB9C(u8 a) void sub_806BBEC(u8 a) { u8 i; - u16 arr[12] = { + u16 arr[12] = + { 0x2A, 0x0B, 0x0C, 0x0D, 0x0E, 0x2F, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, }; u16 *vramPtr = (u16 *)(BG_VRAM + 0x3CB0); + for (i = 0; i < PARTY_SIZE; i++) { vramPtr[i] = arr[i] + (a << 12); @@ -1671,9 +1235,7 @@ void unref_sub_806BCB8(u8 a) u8 i; for (i = 0; i < gPlayerPartyCount; i++) - { sub_806BC3C(i, a); - } } // This is ultimately unreferenced, since it's caller is unreferenced. @@ -1685,8 +1247,7 @@ void sub_806BCE8() { if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) { - u8 gender = GetMonGender(&gPlayerParty[i]); - switch (gender) + switch (GetMonGender(&gPlayerParty[i])) { case MON_MALE: sub_806BC3C(i, 0x54); @@ -1893,8 +1454,7 @@ u16 HandleBattleTowerPartyMenuInput(u8 taskId) if (menuDirectionPressed == 0) { - u8 var1 = sub_80F92BC(); - switch (var1) + switch (sub_80F92BC()) { case 1: menuDirectionPressed = 0xFF; @@ -1923,9 +1483,7 @@ u16 HandleBattleTowerPartyMenuInput(u8 taskId) if (gMain.newKeys & A_BUTTON) { if (gSprites[sub_806CA00(taskId)].data[0] == 7) - { return B_BUTTON; - } } } } @@ -1989,31 +1547,19 @@ void ChangePartyMenuSelection(u8 taskId, s8 directionPressed) u8 isDoubleBattle = IsDoubleBattle(); if (menuIndex < PARTY_SIZE) - { sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + menuIndex * 2], menuIndex, 3, 0); - } else - { sub_806BBEC(1); - } if (!isDoubleBattle) - { ChangeDefaultPartyMenuSelection(spriteId, menuIndex, directionPressed); - } else - { ChangeDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); - } if (gSprites[spriteId].data[0] < PARTY_SIZE) - { sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1); - } else - { sub_806BBEC(2); - } ewram1B000.unk261 = 2; @@ -2024,9 +1570,7 @@ void ChangePartyMenuSelection(u8 taskId, s8 directionPressed) UpdateMonIconFrame_806DA44(taskId, gSprites[spriteId].data[0], 1); if (menuIndex != gSprites[spriteId].data[0]) - { - PlaySE(5); - } + PlaySE(SE_SELECT); } void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) @@ -2040,27 +1584,35 @@ void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPres gSprites[spriteId].data[1] = 0; break; case 1: // moving up - if (menuIndex == 0) { + if (menuIndex == 0) + { gSprites[spriteId].data[0] = 7; - } else if (menuIndex == 7) { + } + else if (menuIndex == 7) + { gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - } else { + } + else + { s8 diff = directionPressed; gSprites[spriteId].data[0] += diff; } - gSprites[spriteId].data[1] = 0; break; case 3: // moving down - if (menuIndex == gPlayerPartyCount - 1) { + if (menuIndex == gPlayerPartyCount - 1) + { gSprites[spriteId].data[0] = 7; - } else if (menuIndex == 7) { + } + else if (menuIndex == 7) + { gSprites[spriteId].data[0] = 0; - } else { + } + else + { s8 diff = directionPressed; gSprites[spriteId].data[0] += diff; } - gSprites[spriteId].data[1] = 0; break; case 4: // moving right @@ -2068,14 +1620,14 @@ void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPres { if (gSprites[spriteId].data[1] == 0) gSprites[spriteId].data[1] = 1; - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; } break; case 0: // moving left // Only move the selection to the left side if one of the mons in the right-hand column are currently selected nextIndex = menuIndex - 1; - if (nextIndex <= 4) { + if (nextIndex <= 4) + { gSprites[spriteId].data[0] = 0; gSprites[spriteId].data[1] = menuIndex; } @@ -2094,32 +1646,42 @@ void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directio gSprites[spriteId].data[1] = 0; break; case 3: // moving down - if (menuIndex == 7) { + if (menuIndex == 7) + { gSprites[spriteId].data[0] = 0; - } else if (menuIndex == gPlayerPartyCount - 1) { + } + else if (menuIndex == gPlayerPartyCount - 1) + { gSprites[spriteId].data[0] = 7; - } else { + } + else + { s8 diff = directionPressed; gSprites[spriteId].data[0] += diff; } - gSprites[spriteId].data[1] = 0; break; case 1: // moving up - if (menuIndex == 0) { + if (menuIndex == 0) + { gSprites[spriteId].data[0] = 7; - } else if (menuIndex == 7) { + } + else if (menuIndex == 7) + { gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - } else { + } + else + { s8 diff = directionPressed; gSprites[spriteId].data[0] += diff; } - gSprites[spriteId].data[1] = 0; break; case 4: // moving right - if (menuIndex == 0) { - if (gPlayerPartyCount > 2) { + if (menuIndex == 0) + { + if (gPlayerPartyCount > 2) + { u16 var1 = gSprites[spriteId].data[1] - 2; if (var1 > 1) gSprites[spriteId].data[0] = 2; @@ -2127,8 +1689,10 @@ void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directio gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; } } - else if (menuIndex == 1) { - if (gPlayerPartyCount > 4) { + else if (menuIndex == 1) + { + if (gPlayerPartyCount > 4) + { u16 var1 = gSprites[spriteId].data[1] - 4; if (var1 <= 1) gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; @@ -2139,12 +1703,16 @@ void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directio break; case 0: // moving left var1 = menuIndex - 2; - if (var1 <= 1) { + if (var1 <= 1) + { gSprites[spriteId].data[0] = 0; gSprites[spriteId].data[1] = menuIndex; - } else { + } + else + { u8 var2 = menuIndex - 4; - if (var2 <= 1) { + if (var2 <= 1) + { gSprites[spriteId].data[0] = 1; gSprites[spriteId].data[1] = menuIndex; } @@ -2497,54 +2065,41 @@ void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed) UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); if (menuIndex < PARTY_SIZE) - { sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); - } else if (menuIndex == PARTY_SIZE) - { sub_806BB9C(1); - } else - { sub_806BBEC(1); - } menuMovement = directionPressed + 2; - switch (menuMovement) { case 2: // no movement gSprites[spriteId].data[1] = 0; break; case 1: // moving up - if (menuIndex == 0) { + if (menuIndex == 0) gSprites[spriteId].data[0] = 7; - } else if (menuIndex == PARTY_SIZE) { + else if (menuIndex == PARTY_SIZE) gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - } else { + else gSprites[spriteId].data[0] += directionPressed; - } - gSprites[spriteId].data[1] = 0; break; case 3: // moving down - if (menuIndex == gPlayerPartyCount - 1) { + if (menuIndex == gPlayerPartyCount - 1) gSprites[spriteId].data[0] = 6; - } else if (menuIndex == 7) { + else if (menuIndex == 7) gSprites[spriteId].data[0] = 0; - } else { + else gSprites[spriteId].data[0] += directionPressed; - } - gSprites[spriteId].data[1] = 0; break; case 4: // moving right if (gPlayerPartyCount > 1 && menuIndex == 0) { - if (gSprites[spriteId].data[1] == 0) { + if (gSprites[spriteId].data[1] == 0) gSprites[spriteId].data[1] = 1; - } - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; } break; @@ -2564,17 +2119,11 @@ void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed) newMenuIndex = gSprites[spriteId].data[0]; if (gSprites[spriteId].data[0] < PARTY_SIZE) - { sub_806BF24(&gUnknown_083769A8[gSprites[spriteId].data[0] * 2], newMenuIndex, 3, 1); - } else if (gSprites[spriteId].data[0] == PARTY_SIZE) - { sub_806BB9C(2); - } else - { sub_806BBEC(2); - } ewram1B000.unk261 = 2; @@ -2582,9 +2131,7 @@ void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed) UpdateMonIconFrame_806DA44(taskId, newMenuIndex2, 1); if (menuIndex != gSprites[spriteId].data[0]) - { - PlaySE(5); - } + PlaySE(SE_SELECT); } // Selects the "OK" button in the Battle Tower party menu. @@ -2598,13 +2145,9 @@ void SelectBattleTowerOKButton(u8 taskId) UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); if (menuIndex < PARTY_SIZE) - { sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); - } else - { sub_806BBEC(1); - } gSprites[spriteId].data[1] = 0; gSprites[spriteId].data[0] = 6; @@ -2614,7 +2157,7 @@ void SelectBattleTowerOKButton(u8 taskId) sub_806BB9C(2); ewram1B000.unk261 = 2; - PlaySE(5); + PlaySE(SE_SELECT); } } @@ -2625,24 +2168,28 @@ void sub_806C92C(u8 spriteId) if (!IsDoubleBattle()) { - if (menuIndex1 < 1) { - if (menuIndex2 < 1) { + if (menuIndex1 < 1) + { + if (menuIndex2 < 1) menuIndex2 = 1; - } - } else { - if (menuIndex2 >= 1) { + } + else + { + if (menuIndex2 >= 1) menuIndex2 = 0; - } } - } else { - if (menuIndex1 < 2) { - if (menuIndex2 < 2) { + } + else + { + if (menuIndex1 < 2) + { + if (menuIndex2 < 2) menuIndex2 = 2; - } - } else { - if (menuIndex2 >= 2) { + } + else + { + if (menuIndex2 >= 2) menuIndex2 = 0; - } } } @@ -2709,13 +2256,9 @@ void ChangePartyMenuSwitchPokemonSelection(u8 taskId, s16 menuDirectionPressed) ChangePartyMenuSelection(taskId, menuDirectionPressed); if (sprite1->data[0] != sprite2->data[0]) - { sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 1); - } else - { sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 0); - } } void HandlePartyMenuSwitchPokemonInput(u8 taskId) @@ -2772,14 +2315,9 @@ void sub_806CCE4() u8 monIndex2 = gSprites[ewram01000.unk2].data[0]; if (monIndex1 <= 5) - { sub_806BF24(&gUnknown_083769A8[monIndex1 * 2], monIndex1, 3, 0); - } - if (monIndex2 <= 5) - { sub_806BF24(&gUnknown_083769A8[monIndex2 * 2], monIndex2, 3, 1); - } } void sub_806CD44(u8 taskId) @@ -2988,9 +2526,7 @@ void sub_806D05C(u8 taskId) sub_806CFA0(taskId, 1); if (ewram01000.unk8 == 0 && ewram01000.unkA == 11) - { gTasks[taskId].func = sub_806D198; - } } void sub_806D098(u8 a, u8 b) @@ -3032,9 +2568,7 @@ void sub_806D15C(u8 taskId) sub_806D098(taskId, 1); if (ewram01000.unk8 == 11 && ewram01000.unkA == 11) - { gTasks[taskId].func = sub_806D198; - } } void sub_806D198(u8 taskId) @@ -3104,22 +2638,14 @@ void sub_806D3B4(u8 taskId, u16 species1, u16 species2) sub_806B9A4(var1[2] + gTasks[taskId].data[0], var1[3], 4); if (species1) - { sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 0, 4); - } else - { sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 1, 4); - } if (species2) - { sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 0, 4); - } else - { sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 1, 4); - } } void sub_806D4AC(u8 taskId, u16 species, u8 c) @@ -3203,19 +2729,13 @@ bool8 LoadPartyMenuGraphics(u8 a) bool8 retVal = FALSE; if (a < 2) - { LZDecompressVram(gPartyMenuMisc_Gfx, (void *)BG_VRAM); - } if (a == 2 || a == 0) - { LZDecompressVram(gPartyMenuMisc_Tilemap, (void *)(BG_VRAM + 0x3800)); - } if (a == 3 || a == 0) - { LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160); - } if (a == 4 || a == 0) { @@ -3224,19 +2744,13 @@ bool8 LoadPartyMenuGraphics(u8 a) } if (a == 5 || a == 0) - { LZDecompressVram(gPartyMenuHpBar_Gfx, (void *)(BG_VRAM + 0x6000)); - } if (a == 6 || a == 0) - { LZDecompressVram(gPartyMenuOrderText_Gfx, (void *)(BG_VRAM + 0x6180)); - } if (a == 7 || a == 0) - { LZDecompressVram(gStatusGfx_Icons, (void *)(BG_VRAM + 0x7180)); - } if (a == 8 || a == 0) { @@ -3255,21 +2769,13 @@ void SetMonIconAnimByHP(u8 spriteId, u16 currentHP, u16 maxHP) if (currentHP != maxHP) { if (hpBarLevel == 3) - { animNum = 1; - } else if (hpBarLevel == 2) - { animNum = 2; - } else if (hpBarLevel == 1) - { animNum = 3; - } else - { animNum = 4; - } } sub_809D824(&gSprites[spriteId], animNum); @@ -3300,25 +2806,19 @@ void TryCreatePartyMenuMonIcon(u8 taskId, u8 monIndex, struct Pokemon *pokemon) { if (GetMonData(pokemon, MON_DATA_SPECIES)) { - bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { + if (IsLinkDoubleBattle() == TRUE) CreatePartyMenuMonIcon(taskId, monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - } else - { CreatePartyMenuMonIcon(taskId, monIndex, IsDoubleBattle(), pokemon); - } } } void unref_sub_806D964(u8 taskId) { u8 i; + for (i = 0; i < gPlayerPartyCount; i++) - { TryCreatePartyMenuMonIcon(taskId, i, &gPlayerParty[i]); - } } void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct UnknownPokemonStruct2 *pokemon) @@ -3333,19 +2833,14 @@ void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct U void UpdateMonIconFrame_806DA0C(struct Sprite *sprite) { - u8 var1; + u8 var1 = UpdateMonIconFrame(sprite); - var1 = UpdateMonIconFrame(sprite); if (var1) { if (var1 & 1) - { sprite->pos2.y = -3; - } else - { sprite->pos2.y = 1; - } } } @@ -3365,13 +2860,9 @@ void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c) gSprites[spriteId].data[0] = 0; if (!c) - { gSprites[spriteId].callback = UpdateMonIconFrame_806DA38; - } else - { gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; - } } } @@ -3383,8 +2874,8 @@ void LoadHeldItemIconGraphics(void) void SpriteCB_HeldItemIcon(struct Sprite *sprite) { - u8 data7 = sprite->data[7]; + if (gSprites[data7].invisible) { sprite->invisible = 1; @@ -3422,29 +2913,19 @@ void CreateHeldItemIcons(u8 *a, u8 *b, u8 c) switch (c) { case 0: - i = 0; - while (i < a[0]) + for (i = 0; i < a[0]; i++) { heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); if (heldItem) - { CreateHeldItemIcon(b[i], ItemIsMail(heldItem)); - } - - i++; } break; case 1: - i = 0; - while (i < a[1]) + for (i = 0; i < a[1]; i++) { heldItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); if (heldItem) - { CreateHeldItemIcon(b[i + 6], ItemIsMail(heldItem)); - } - - i++; } break; } @@ -3495,13 +2976,9 @@ void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) else { if (ItemIsMail(item)) - { StartSpriteAnim(&gSprites[heldItemSpriteId], 1); - } else - { StartSpriteAnim(&gSprites[heldItemSpriteId], 0); - } gSprites[heldItemSpriteId].invisible = 0; } @@ -3611,25 +3088,25 @@ u8 GetMonIconSpriteId(u8 taskId, u8 monIndex) { switch (monIndex) { - case 1: - return gTasks[taskId].data[0]; - break; - case 2: - return gTasks[taskId].data[1] >> 8; - break; - case 3: - return gTasks[taskId].data[1]; - break; - case 4: - return gTasks[taskId].data[2] >> 8; - break; - case 5: - return gTasks[taskId].data[2]; - break; - case 0: - default: - return gTasks[taskId].data[0] >> 8; - break; + case 1: + return gTasks[taskId].data[0]; + break; + case 2: + return gTasks[taskId].data[1] >> 8; + break; + case 3: + return gTasks[taskId].data[1]; + break; + case 4: + return gTasks[taskId].data[2] >> 8; + break; + case 5: + return gTasks[taskId].data[2]; + break; + case 0: + default: + return gTasks[taskId].data[0] >> 8; + break; } } @@ -3637,24 +3114,24 @@ void SetMonIconSpriteId(u8 taskId, u8 monIndex, u8 spriteId) { switch (monIndex) { - case 0: - gTasks[taskId].data[0] = (u8)gTasks[taskId].data[0] | (spriteId << 8); - break; - case 1: - gTasks[taskId].data[0] = (gTasks[taskId].data[0] & -0x100) | spriteId; - break; - case 2: - gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1] | (spriteId << 8); - break; - case 3: - gTasks[taskId].data[1] = (gTasks[taskId].data[1] & -0x100) | spriteId; - break; - case 4: - gTasks[taskId].data[2] = (u8)gTasks[taskId].data[2] | (spriteId << 8); - break; - case 5: - gTasks[taskId].data[2] = (gTasks[taskId].data[2] & -0x100) | spriteId; - break; + case 0: + gTasks[taskId].data[0] = (u8)gTasks[taskId].data[0] | (spriteId << 8); + break; + case 1: + gTasks[taskId].data[0] = (gTasks[taskId].data[0] & -0x100) | spriteId; + break; + case 2: + gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1] | (spriteId << 8); + break; + case 3: + gTasks[taskId].data[1] = (gTasks[taskId].data[1] & -0x100) | spriteId; + break; + case 4: + gTasks[taskId].data[2] = (u8)gTasks[taskId].data[2] | (spriteId << 8); + break; + case 5: + gTasks[taskId].data[2] = (gTasks[taskId].data[2] & -0x100) | spriteId; + break; } } @@ -3799,15 +3276,10 @@ void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon) { if (GetMonData(pokemon, MON_DATA_SPECIES)) { - bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { + if (IsLinkDoubleBattle() == TRUE) PrintPartyMenuMonNickname(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - } else - { PrintPartyMenuMonNickname(monIndex, IsDoubleBattle(), pokemon); - } } } @@ -3816,9 +3288,7 @@ void PrintPartyMenuMonNicknames(void) u8 i; for (i = 0; i < PARTY_SIZE; i++) - { TryPrintPartyMenuMonNickname(i, &gPlayerParty[i]); - } } u8 *GetMonNickname(struct Pokemon *pokemon, u8 *stringBuffer) @@ -3836,38 +3306,28 @@ void PartyMenuPutStatusTilemap(u8 monIndex, u8 menuLayout, u8 status) u8 var1 = status * 4; for (i = 0; i < 4; i++) - { vramPtr[i] = (0x18C + var1 + i) | -0x5000; - } } static void PartyMenuClearLevelStatusTilemap(u8 monIndex) { - bool8 isLinkDoubleBattle; u8 menuLayout; u8 x; u8 y; u16 *vramPtr; u8 i; - isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { + if (IsLinkDoubleBattle() == TRUE) menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; - } else - { menuLayout = IsDoubleBattle(); - } x = gUnknown_08376738[menuLayout][monIndex].x - 1; y = gUnknown_08376738[menuLayout][monIndex].y + 1; vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); for (i = 0; i < 4; i++) - { vramPtr[i] = 0; - } } static void PartyMenuWriteTilemap(u8 a, u8 x, u8 y) @@ -3908,30 +3368,18 @@ void PartyMenuPrintMonLevelOrStatus(u8 monIndex, struct Pokemon *pokemon) { if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) { - u8 statusAndPkrs; - bool8 isLinkDoubleBattle; + u8 statusAndPkrs = GetMonStatusAndPokerus(pokemon); u8 menuLayout; - statusAndPkrs = GetMonStatusAndPokerus(pokemon); - - isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { + if (IsLinkDoubleBattle() == TRUE) menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; - } else - { menuLayout = IsDoubleBattle(); - } if (statusAndPkrs != 0 && statusAndPkrs != 6) - { PartyMenuPutStatusTilemap(monIndex, menuLayout, statusAndPkrs - 1); - } else - { PartyMenuPrintLevel(monIndex, menuLayout, pokemon); - } PartyMenuPrintGenderIcon(monIndex, menuLayout, pokemon); } @@ -3942,9 +3390,7 @@ void PartyMenuPrintMonsLevelOrStatus(void) u8 i; for (i = 0; i < PARTY_SIZE; i++) - { PartyMenuPrintMonLevelOrStatus(i, &gPlayerParty[i]); - } } void PartyMenuDoPrintGenderIcon(u16 species, u8 gender, u8 menuLayout, u8 monIndex, u8 *nickname) @@ -3956,12 +3402,12 @@ void PartyMenuDoPrintGenderIcon(u16 species, u8 gender, u8 menuLayout, u8 monInd switch (gender) { - case MON_MALE: - PartyMenuWriteTilemap(0x42, x, y); - break; - case MON_FEMALE: - PartyMenuWriteTilemap(0x44, x, y); - break; + case MON_MALE: + PartyMenuWriteTilemap(0x42, x, y); + break; + case MON_FEMALE: + PartyMenuWriteTilemap(0x44, x, y); + break; } } } @@ -3994,11 +3440,8 @@ void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP) void PartyMenuPrintHP(u8 monIndex, u8 b, struct Pokemon *pokemon) { - u16 currentHP; - u16 maxHP; - - currentHP = GetMonData(pokemon, MON_DATA_HP); - maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); + u16 currentHP = GetMonData(pokemon, MON_DATA_HP); + u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); PartyMenuDoPrintHP(monIndex, b, currentHP, maxHP); } @@ -4007,15 +3450,10 @@ void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon) { if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) { - bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == TRUE) - { + if (IsLinkDoubleBattle() == TRUE) PartyMenuPrintHP(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - } else - { PartyMenuPrintHP(monIndex, IsDoubleBattle(), pokemon); - } } } @@ -4024,9 +3462,7 @@ void PartyMenuTryPrintMonsHP(void) u8 i; for (i = 0; i < PARTY_SIZE; i++) - { PartyMenuTryPrintHP(i, &gPlayerParty[i]); - } } void unref_sub_806E564(void) { } @@ -4046,17 +3482,11 @@ void PartyMenuDoDrawHPBar(u8 monIndex, u8 menuLayout, u16 currentHP, u16 maxHP) hpBarLevel = GetHPBarLevel(currentHP, maxHP); if (hpBarLevel > 2) - { battleInterface.unkC_0 = 4; - } if (hpBarLevel == 2) - { battleInterface.unkC_0 = 5; - } if (hpBarLevel < 2) - { battleInterface.unkC_0 = 6; - } battleInterface.unk10 = 0x100; @@ -4082,15 +3512,10 @@ void PartyMenuTryDrawHPBar(u8 monIndex, struct Pokemon *pokemon) { if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) { - bool8 isDoubleBattle = IsLinkDoubleBattle(); - if (isDoubleBattle == TRUE) - { + if (IsLinkDoubleBattle() == TRUE) PartyMenuDrawHPBar(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - } else - { PartyMenuDrawHPBar(monIndex, IsDoubleBattle(), pokemon); - } } } @@ -4099,9 +3524,7 @@ void PartyMenuDrawHPBars(void) u8 i; for (i = 0; i < PARTY_SIZE; i++) - { PartyMenuTryDrawHPBar(i, &gPlayerParty[i]); - } } void SwapPokemon(struct Pokemon *a, struct Pokemon *b) @@ -4871,64 +4294,64 @@ void GetMedicineItemEffectMessage(u16 item) { switch (GetItemEffectType(item)) { - case 3: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); - break; - case 4: - StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); - break; - case 5: - StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); - break; - case 6: - StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); - break; - case 7: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); - break; - case 8: - StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); - break; - case 9: - StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); - break; - case 11: - StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); - break; - case 13: - StringCopy(gStringVar2, gOtherText_Hp2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 12: - StringCopy(gStringVar2, gOtherText_Attack); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 17: - StringCopy(gStringVar2, gOtherText_Defense); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 16: - StringCopy(gStringVar2, gOtherText_Speed); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 14: - StringCopy(gStringVar2, gOtherText_SpAtk2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 15: - StringCopy(gStringVar2, gOtherText_SpDef2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 19: - case 20: - StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); - break; - case 21: - StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); - break; - default: - StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); - break; + case 3: + StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); + break; + case 4: + StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); + break; + case 5: + StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); + break; + case 6: + StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); + break; + case 7: + StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); + break; + case 8: + StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); + break; + case 9: + StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); + break; + case 11: + StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); + break; + case 13: + StringCopy(gStringVar2, gOtherText_Hp2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 12: + StringCopy(gStringVar2, gOtherText_Attack); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 17: + StringCopy(gStringVar2, gOtherText_Defense); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 16: + StringCopy(gStringVar2, gOtherText_Speed); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 14: + StringCopy(gStringVar2, gOtherText_SpAtk2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 15: + StringCopy(gStringVar2, gOtherText_SpDef2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 19: + case 20: + StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); + break; + case 21: + StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); + break; + default: + StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); + break; } } @@ -5025,9 +4448,9 @@ void UseMedicine(u8 taskId, u16 item, TaskFunc func) bool8 IsBlueYellowRedFlute(u16 item) { - if (item == 0x27 - || item == 0x29 - || item == 0x28) + if (item == ITEM_BLUE_FLUTE + || item == ITEM_RED_FLUTE + || item == ITEM_YELLOW_FLUTE) return TRUE; else return FALSE; @@ -5339,7 +4762,6 @@ void Task_RareCandy2(u8 taskId) } } -#if ENGLISH void PrintStatGrowthsInLevelUpWindow(u8 taskId) { u8 i; @@ -5351,6 +4773,9 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) u8 x; u8 y; u32 stat; +#if GERMAN + u8 *ptr; +#endif stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); @@ -5360,142 +4785,31 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) x = (i / 3) * 9 + 11; y = ((i % 3) << 1) + 1; +#if GERMAN + ptr = StringCopy(gStringVar1, StatNames[i]); + *ptr++ = EXT_CTRL_CODE_BEGIN; + *ptr++ = 0x13; + *ptr++ = 0x2E; + ptr = StringCopy(ptr, gOtherText_TallPlusAndRightArrow); + *ptr++ = EXT_CTRL_CODE_BEGIN; + *ptr++ = 0x13; + *ptr++ = 0x34; + ConvertIntToDecimalStringN(ptr, ewram1B000.statGrowths[i], 1, 2); + Menu_PrintText(gStringVar1, x + 1, y); +#else Menu_PrintTextPixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); - if (i == 2) Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); else Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; gStringVar1[1] = 0x14; gStringVar1[2] = 0x06; - ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[i], 1, 2); - Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); +#endif } } -#elif GERMAN -__attribute__((naked)) -void PrintStatGrowthsInLevelUpWindow(u8 taskId) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl Menu_DrawStdWindowFrame\n\ - movs r7, 0\n\ - ldr r0, _0807092C @ =gStringVar1\n\ - mov r10, r0\n\ - movs r1, 0xFC\n\ - mov r9, r1\n\ - movs r2, 0x13\n\ - mov r8, r2\n\ -_0807086C:\n\ - ldr r1, _08070930 @ =gSharedMem + 0x1C000\n\ - ldr r0, [r1]\n\ - ldr r1, _08070934 @ =StatDataTypes\n\ - adds r1, r7, r1\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - adds r1, r7, 0x6\n\ - lsls r1, 1\n\ - ldr r2, _08070938 @ =gSharedMem + 0x1B264\n\ - adds r1, r2, r1\n\ - strh r0, [r1]\n\ - lsls r6, r7, 1\n\ - adds r6, r2, r6\n\ - ldrh r1, [r6]\n\ - subs r0, r1\n\ - strh r0, [r6]\n\ - adds r0, r7, 0\n\ - movs r1, 0x3\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 3\n\ - adds r4, r0\n\ - adds r4, 0xB\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r7, 0\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - adds r5, r0, 0\n\ - lsls r5, 1\n\ - adds r5, 0x1\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - ldr r1, _0807093C @ =StatNames\n\ - lsls r0, r7, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - mov r0, r10\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - mov r0, r9\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - mov r1, r8\n\ - strb r1, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0x2E\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - adds r0, r2, 0\n\ - ldr r1, _08070940 @ =gOtherText_TallPlusAndRightArrow\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - mov r0, r9\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - mov r1, r8\n\ - strb r1, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0x34\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0\n\ - ldrsh r1, [r6, r0]\n\ - adds r0, r2, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - adds r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r0, r10\n\ - adds r1, r4, 0\n\ - adds r2, r5, 0\n\ - bl Menu_PrintText\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - cmp r7, 0x5\n\ - bls _0807086C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0807092C: .4byte gStringVar1\n\ -_08070930: .4byte gSharedMem + 0x1C000\n\ -_08070934: .4byte StatDataTypes\n\ -_08070938: .4byte gSharedMem + 0x1B264\n\ -_0807093C: .4byte StatNames\n\ -_08070940: .4byte gOtherText_TallPlusAndRightArrow\n\ - .syntax divided\n"); -} -#endif void PrintNewStatsInLevelUpWindow(u8 taskId) { @@ -5526,24 +4840,13 @@ void PrintNewStatsInLevelUpWindow(u8 taskId) void RedrawPokemonInfoInMenu(u8 monIndex, struct Pokemon *pokemon) { - u8 statusAndPkrs; - bool8 isDoubleBattle; - u16 currentHP; - u16 maxHP; + u8 statusAndPkrs = GetMonStatusAndPokerus(pokemon); u8 icon; - statusAndPkrs = GetMonStatusAndPokerus(pokemon); if (statusAndPkrs == 0 || statusAndPkrs == 6) - { PartyMenuUpdateLevelOrStatus(pokemon, monIndex); - } - - isDoubleBattle = IsDoubleBattle(); - currentHP = GetMonData(pokemon, MON_DATA_HP); - maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); - - PartyMenuDoPrintHP(monIndex, isDoubleBattle, currentHP, maxHP); + PartyMenuDoPrintHP(monIndex, IsDoubleBattle(), GetMonData(pokemon, MON_DATA_HP), GetMonData(pokemon, MON_DATA_MAX_HP)); PartyMenuTryDrawHPBar(monIndex, pokemon); icon = GetMonIconSpriteId(ewram1C000.unk4, monIndex); @@ -5569,45 +4872,45 @@ void Task_RareCandy3(u8 taskId) switch (learnedMove) { - case 0: - // No move is learned. - evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); - if (evolutionSpecies != 0) - { - gCB2_AfterEvolution = sub_80A53F8; - BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); - DestroyTask(taskId); - } - else - { - sub_8070D90(taskId); - } - break; - case 0xFFFF: - // Mon already knows 4 moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); - - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - - ewram1C000.unk8 = gMoveToLearn; - gTasks[taskId].func = sub_806F358; - break; - case 0xFFFE: - // Move was already known by the mon. - gTasks[taskId].func = TeachMonMoveInPartyMenu; - break; - default: - // Mon automatically learned a move because it knew less than four moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[learnedMove]); - - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - - gTasks[taskId].func = Task_TeamMonTMMove3; - break; + case 0: + // No move is learned. + evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); + if (evolutionSpecies != 0) + { + gCB2_AfterEvolution = sub_80A53F8; + BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); + DestroyTask(taskId); + } + else + { + sub_8070D90(taskId); + } + break; + case 0xFFFF: + // Mon already knows 4 moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); + + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + + ewram1C000.unk8 = gMoveToLearn; + gTasks[taskId].func = sub_806F358; + break; + case 0xFFFE: + // Move was already known by the mon. + gTasks[taskId].func = TeachMonMoveInPartyMenu; + break; + default: + // Mon automatically learned a move because it knew less than four moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[learnedMove]); + + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); + + gTasks[taskId].func = Task_TeamMonTMMove3; + break; } } } @@ -5621,45 +4924,45 @@ void TeachMonMoveInPartyMenu(u8 taskId) learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, FALSE); switch (learnedMove) { - case 0: - // No move is learned. - evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); - if (evolutionSpecies != 0) - { - gCB2_AfterEvolution = sub_80A53F8; - BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); - DestroyTask(taskId); - } - else - { - sub_8070D90(taskId); - } - break; - case 0xFFFF: - // Mon already knows 4 moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); + case 0: + // No move is learned. + evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); + if (evolutionSpecies != 0) + { + gCB2_AfterEvolution = sub_80A53F8; + BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); + DestroyTask(taskId); + } + else + { + sub_8070D90(taskId); + } + break; + case 0xFFFF: + // Mon already knows 4 moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); - ewram1C000.unk8 = gMoveToLearn; - gTasks[taskId].func = sub_806F358; - break; - case 0xFFFE: - // Move was already known by the mon. Go on the the next move to be learned. - TeachMonMoveInPartyMenu(taskId); - break; - default: - // Mon automatically learned a move because it knew less than four moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[learnedMove]); + ewram1C000.unk8 = gMoveToLearn; + gTasks[taskId].func = sub_806F358; + break; + case 0xFFFE: + // Move was already known by the mon. Go on the the next move to be learned. + TeachMonMoveInPartyMenu(taskId); + break; + default: + // Mon automatically learned a move because it knew less than four moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[learnedMove]); - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); - gTasks[taskId].func = Task_TeamMonTMMove3; - break; + gTasks[taskId].func = Task_TeamMonTMMove3; + break; } } diff --git a/src/field/secret_base.c b/src/field/secret_base.c index 8b67a2cd9..210d49835 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -23,6 +23,7 @@ #include "menu.h" #include "menu_helpers.h" #include "metatile_behavior.h" +#include "new_game.h" #include "palette.h" #include "pokemon.h" #include "overworld.h" @@ -127,10 +128,11 @@ void ClearSecretBase(struct SecretBaseRecord *record) { u16 i; u16 j; + record->secretBaseId = 0; - for (i=0; iplayerName[i] = 0xff; - for (i=0; i<4; i++) + for (i = 0; i < 4; i++) record->trainerId[i] = 0x00; record->sbr_field_e = 0; record->sbr_field_10 = 0; @@ -139,14 +141,15 @@ void ClearSecretBase(struct SecretBaseRecord *record) record->gender = 0; record->sbr_field_1_5 = 0; record->sbr_field_1_6 = 0; - for (i=0; i<16; i++) { + for (i = 0; i < 16; i++) + { record->decorations[i] = 0; record->decorationPos[i] = 0; } - for (i=0; i<6; i++) { - for (j=0; j<4; j++) { + for (i = 0; i < 6; i++) + { + for (j = 0; j < 4; j++) record->partyMoves[i * 4 + j] = 0; - } record->partyPersonality[i] = 0; record->partyEVs[i] = 0; record->partySpecies[i] = 0; @@ -175,17 +178,20 @@ void sub_80BB5D0(void) void sub_80BB5E4(void) { u16 i; + gSpecialVar_Result = 0; - for (i = 0; i < MAX_SECRET_BASES; i++) { - if (gUnknown_020387DC != gSaveBlock1.secretBases[i].secretBaseId) - continue; - gSpecialVar_Result = 1; - VarSet(VAR_CURRENT_SECRET_BASE, i); - break; + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (gUnknown_020387DC == gSaveBlock1.secretBases[i].secretBaseId) + { + gSpecialVar_Result = 1; + VarSet(VAR_CURRENT_SECRET_BASE, i); + break; + } } } -void sub_80BB63C(void) // 80bb63c +void sub_80BB63C(void) { if (gSaveBlock1.secretBases[0].secretBaseId) gSpecialVar_Result = 1; @@ -193,7 +199,7 @@ void sub_80BB63C(void) // 80bb63c gSpecialVar_Result = 0; } -u8 sub_80BB66C(void) // 80bb66c +u8 sub_80BB66C(void) { s16 x, y; s16 v0; @@ -214,7 +220,7 @@ u8 sub_80BB66C(void) // 80bb66c return 0; } -void sub_80BB70C(void) // 80bb70c +void sub_80BB70C(void) { gSpecialVar_0x8007 = sub_80BB66C(); } @@ -222,9 +228,11 @@ void sub_80BB70C(void) // 80bb70c s16 unref_sub_80BB724(u16 *a0, u8 a1) { u16 v2; - for (v2=0; v2<0x200; v2++) { + + for (v2 = 0; v2 < 0x200; v2++) + { if ((a0[v2] & 0xFFF) == a1) - return (s16)v2; + return v2; } return -1; } @@ -232,9 +240,13 @@ s16 unref_sub_80BB724(u16 *a0, u8 a1) void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) { s16 x, y; - for (y=0; yheight; y++) { - for (x=0; xwidth; x++) { - if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) { + + for (y=0; yheight; y++) + { + for (x=0; xwidth; x++) + { + if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) + { *arg1 = x; *arg2 = y; return; @@ -248,17 +260,22 @@ void sub_80BB800(void) s16 x, y; s16 tile_id; u16 idx; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); tile_id = MapGridGetMetatileIdAt(x, y); - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { + for (idx = 0; idx < 7; idx++) + { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) + { MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); CurrentMapDrawMetatileAt(x, y); return; } } - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) { + for (idx = 0; idx < 7; idx++) + { + if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) + { MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); CurrentMapDrawMetatileAt(x, y); return; @@ -269,7 +286,9 @@ void sub_80BB800(void) u8 sub_80BB8A8(u8 *arg1) { u8 idx; - for (idx=0; idx<7; idx++) { + + for (idx=0; idx<7; idx++) + { if (arg1[idx] == EOS) return idx; } @@ -280,10 +299,10 @@ void sub_80BB8CC(void) { u8 nameLength; u16 idx; + gSaveBlock1.secretBases[0].secretBaseId = gUnknown_020387DC; - for (idx=0; idx<4; idx++) { + for (idx=0; idx<4; idx++) gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; - } VarSet(VAR_CURRENT_SECRET_BASE, 0); nameLength = sub_80BB8A8(gSaveBlock2.playerName); memset(gSaveBlock1.secretBases[0].playerName, 0xFF, OT_NAME_LENGTH); @@ -296,13 +315,20 @@ void sub_80BB970(struct MapEvents *events) { u16 bgevidx, idx, jdx; s16 tile_id; - for (bgevidx=0; bgevidxbgEventCount; bgevidx++) { - if (events->bgEvents[bgevidx].kind == 8) { - for (jdx=0; jdxbgEvents[bgevidx].bgUnion.secretBaseId) { + + for (bgevidx = 0; bgevidx < events->bgEventCount; bgevidx++) + { + if (events->bgEvents[bgevidx].kind == 8) + { + for (jdx = 0; jdx < MAX_SECRET_BASES; jdx++) + { + if (gSaveBlock1.secretBases[jdx].secretBaseId == events->bgEvents[bgevidx].bgUnion.secretBaseId) + { tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { + for (idx = 0; idx < 7; idx++) + { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) + { MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); break; } @@ -323,14 +349,14 @@ void sub_80BBA14(void) void sub_80BBA48(u8 taskid) { u16 curbaseid; - switch (gTasks[taskid].data[0]) { + switch (gTasks[taskid].data[0]) + { case 0: gTasks[taskid].data[0] = 1; break; case 1: - if (!gPaletteFade.active) { + if (!gPaletteFade.active) gTasks[taskid].data[0] = 2; - } break; case 2: curbaseid = VarGet(VAR_CURRENT_SECRET_BASE); @@ -362,7 +388,8 @@ bool8 sub_80BBB24(void) void sub_80BBB50(u8 taskid) { FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); - if (IsWeatherNotFadingIn() == 1) { + if (IsWeatherNotFadingIn() == 1) + { EnableBothScriptContexts(); DestroyTask(taskid); } @@ -371,6 +398,7 @@ void sub_80BBB50(u8 taskid) void sub_80BBB90(void) { s16 x, y; + ScriptContext2_Enable(); HideMapNamePopup(); sub_80BB764(&x, &y, 0x220); @@ -383,7 +411,9 @@ void sub_80BBB90(void) void sub_80BBBEC(u8 taskid) { s8 idx; - if (!gPaletteFade.active) { + + if (!gPaletteFade.active) + { idx = 4 * (gUnknown_020387DC / 10); Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); warp_in(); @@ -411,17 +441,29 @@ void sub_80BBCCC(u8 flagIn) { u16 curBaseId; u16 x, y; - if (CurrentMapIsSecretBase()) { + + if (CurrentMapIsSecretBase()) + { curBaseId = VarGet(VAR_CURRENT_SECRET_BASE); - for (x=0; x<16; x++) { - if (gSaveBlock1.secretBases[curBaseId].decorations[x] > 0 && gSaveBlock1.secretBases[curBaseId].decorations[x] <= 0x78 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].permission != DECORPERM_SOLID_MAT) { - sub_80FF394((gSaveBlock1.secretBases[curBaseId].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[curBaseId].decorationPos[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]); + for (x = 0; x < 16; x++) + { + if (gSaveBlock1.secretBases[curBaseId].decorations[x] > 0 + && gSaveBlock1.secretBases[curBaseId].decorations[x] <= 0x78 + && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].permission != DECORPERM_SOLID_MAT) + { + sub_80FF394( + (gSaveBlock1.secretBases[curBaseId].decorationPos[x] >> 4) + 7, + (gSaveBlock1.secretBases[curBaseId].decorationPos[x] & 0xF) + 7, + gSaveBlock1.secretBases[curBaseId].decorations[x]); } } - if (curBaseId != 0) { + if (curBaseId != 0) + { sub_80BB764(&x, &y, 0x220); MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); - } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) { + } + else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) + { sub_80BB764(&x, &y, 0x220); MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); } @@ -438,38 +480,47 @@ void sub_80BBDD0(void) u8 permission; u8 ndecor; u16 curBase = VarGet(VAR_CURRENT_SECRET_BASE); - if (!CurrentMapIsSecretBase()) { + + if (!CurrentMapIsSecretBase()) + { roomdecor = gSaveBlock1.playerRoomDecor; roomdecorpos = gSaveBlock1.playerRoomDecorPos; ndecor = 12; - } else { + } + else + { roomdecor = gSaveBlock1.secretBases[curBase].decorations; roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; ndecor = 16; } - for (decidx=0; decidxmapObjectCount; objid++) { + for (objid = 0; objid < gMapHeader.events->mapObjectCount; objid++) + { if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) break; } - if (objid == gMapHeader.events->mapObjectCount) - continue; - gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; - gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; - metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); - if (sub_80572D8(metatile) == TRUE || sub_80572EC(metatile) == TRUE) { - gSpecialVar_Result = gMapHeader.events->mapObjects[objid].graphicsId + VAR_0x3F20; - VarSet(gSpecialVar_Result, gDecorations[roomdecor[decidx]].tiles[0]); - gSpecialVar_Result = gMapHeader.events->mapObjects[objid].localId; - FlagClear(gSpecialVar_0x8004 + 0xAE); - show_sprite(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - sub_805C0F8(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); - sub_805C78C(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - gSpecialVar_0x8004 ++; + if (objid != gMapHeader.events->mapObjectCount) + { + gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; + gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; + metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); + if (sub_80572D8(metatile) == TRUE || sub_80572EC(metatile) == TRUE) + { + gSpecialVar_Result = gMapHeader.events->mapObjects[objid].graphicsId + VAR_0x3F20; + VarSet(gSpecialVar_Result, gDecorations[roomdecor[decidx]].tiles[0]); + gSpecialVar_Result = gMapHeader.events->mapObjects[objid].localId; + FlagClear(gSpecialVar_0x8004 + 0xAE); + show_sprite(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + sub_805C0F8(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); + sub_805C78C(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + gSpecialVar_0x8004 ++; + } } } } @@ -485,8 +536,12 @@ void sub_80BBFA4(void) void sub_80BBFD8(struct MapPosition *position, struct MapEvents *events) { s16 bgevtidx; - for (bgevtidx=0; bgevtidxbgEventCount; bgevtidx++) { - if (events->bgEvents[bgevtidx].kind == 8 && position->x == events->bgEvents[bgevtidx].x + 7 && position->y == events->bgEvents[bgevtidx].y + 7) { + + for (bgevtidx = 0; bgevtidx < events->bgEventCount; bgevtidx++) + { + if (events->bgEvents[bgevtidx].kind == 8 && position->x == events->bgEvents[bgevtidx].x + 7 + && position->y == events->bgEvents[bgevtidx].y + 7) + { gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; break; } @@ -511,15 +566,15 @@ bool8 sub_80BC050(void) void sub_80BC074(u8 taskid) { - switch (gTasks[taskid].data[0]) { + switch (gTasks[taskid].data[0]) + { case 0: ScriptContext2_Enable(); gTasks[taskid].data[0] = 1; break; case 1: - if (!gPaletteFade.active) { + if (!gPaletteFade.active) gTasks[taskid].data[0] = 2; - } break; case 2: copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); @@ -532,12 +587,14 @@ void sub_80BC074(u8 taskid) } } -void sub_80BC0F8(void) { +void sub_80BC0F8(void) +{ CreateTask(sub_80BC074, 0); FadeScreen(1, 0); } -void sub_80BC114(void) { +void sub_80BC114(void) +{ if (gSaveBlock1.secretBases[0].secretBaseId != gUnknown_020387DC) gSpecialVar_Result = 1; else @@ -547,14 +604,17 @@ void sub_80BC114(void) { u8 sub_80BC14C(u8 sbid) { s16 idx; - for (idx=0; idxbgEventCount; eventId++) { if (mapEvents->bgEvents[eventId].kind == 8 - && gSaveBlock1.secretBases[0].secretBaseId == mapEvents->bgEvents[eventId].bgUnion.secretBaseId) + && gSaveBlock1.secretBases[0].secretBaseId == mapEvents->bgEvents[eventId].bgUnion.secretBaseId) { u16 i; s16 tileId = MapGridGetMetatileIdAt(mapEvents->bgEvents[eventId].x + 7, mapEvents->bgEvents[eventId].y + 7); @@ -845,33 +911,23 @@ u8 sub_80BC538(void) { s16 secretBaseIndex; u8 retVal = 0; - + for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) { if (sub_80BC268(secretBaseIndex) == TRUE) - { retVal++; - } } - return retVal; } void sub_80BC56C(void) { - u8 secretBaseIndex = sub_80BC14C(gUnknown_020387DC); - if (sub_80BC268(secretBaseIndex) == TRUE) - { + if (sub_80BC268(sub_80BC14C(gUnknown_020387DC)) == TRUE) gSpecialVar_Result = 1; - } else if (sub_80BC538() > 9) - { gSpecialVar_Result = 2; - } else - { gSpecialVar_Result = 0; - } } void sub_80BC5BC(void) @@ -897,18 +953,15 @@ void Task_SecretBasePC_Registry(u8 taskId) ScriptContext2_Enable(); ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); - + taskData = gTasks[taskId].data; taskData[0] = sub_80BC538(); if (taskData[0] != 0) { - if (taskData[0] > 7) { + if (taskData[0] > 7) taskData[3] = 7; - } else - { taskData[3] = taskData[0]; - } taskData[1] = 0; taskData[2] = 0; @@ -964,7 +1017,9 @@ void sub_80BC6B0(u8 taskId) Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match } else + { CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xbc, 0x98); + } if (taskData[2] == 0) DestroyVerticalScrollIndicator(TOP_ARROW); @@ -989,12 +1044,12 @@ void sub_80BC824(u8 taskId) { if (taskData[1]) { - PlaySE(5); + PlaySE(SE_SELECT); taskData[1] = Menu_MoveCursor(-1); } else if (taskData[2]) { - PlaySE(5); + PlaySE(SE_SELECT); taskData[2]--; sub_80BC6B0(taskId); } @@ -1005,20 +1060,20 @@ void sub_80BC824(u8 taskId) { if (taskData[2] + taskData[1] != taskData[0]) { - PlaySE(5); + PlaySE(SE_SELECT); taskData[2]++; sub_80BC6B0(taskId); } } else { - PlaySE(5); + PlaySE(SE_SELECT); taskData[1] = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) { - PlaySE(5); + PlaySE(SE_SELECT); if (taskData[1] + taskData[2] == taskData[0]) { Menu_DestroyCursor(); @@ -1034,7 +1089,7 @@ void sub_80BC824(u8 taskId) } else if (gMain.newKeys & B_BUTTON) { - PlaySE(5); + PlaySE(SE_SELECT); Menu_DestroyCursor(); Menu_EraseWindowRect(0, 0, 29, 19); sub_80BCC54(taskId); @@ -1078,7 +1133,7 @@ void sub_80BC9E4(u8 taskId) { if (Menu_GetCursorPos()) { - PlaySE(5); + PlaySE(SE_SELECT); Menu_MoveCursor(-1); } } @@ -1086,18 +1141,18 @@ void sub_80BC9E4(u8 taskId) { if (Menu_GetCursorPos() != 1) { - PlaySE(5); + PlaySE(SE_SELECT); Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) { - PlaySE(5); + PlaySE(SE_SELECT); gUnknown_083D13D4[Menu_GetCursorPos()].func(taskId); } else if (gMain.newKeys & B_BUTTON) { - PlaySE(5); + PlaySE(SE_SELECT); sub_80BCBF8(taskId); } } @@ -1132,14 +1187,10 @@ void sub_80BCB10(u8 taskId) taskData[0]--; if (taskData[2] > 0) - { taskData[2]--; - } if (taskData[0] < 8) - { taskData[3]--; - } sub_80BC7D8(taskId); gTasks[taskId].func = sub_80BC824; @@ -1180,13 +1231,9 @@ void sub_80BCC54(u8 taskId) DestroyVerticalScrollIndicator(BOTTOM_ARROW); if (curBaseIndex == 0) - { ScriptContext1_SetupScript(gUnknown_0815F399); - } else - { ScriptContext1_SetupScript(gUnknown_0815F49A); - } DestroyTask(taskId); } @@ -1216,7 +1263,8 @@ const u8 *GetSecretBaseTrainerLoseText(void) void unref_sub_80BCD7C(u8 secretBaseIndex) { u16 i; - for (i = 0; i == 0; i++) + + for (i = 0; i < 1; i++) { gSaveBlock1.secretBases[secretBaseIndex].partyPersonality[i] = i + 1; gSaveBlock1.secretBases[secretBaseIndex].partyMoves[i * 4] = i + 1; @@ -1230,8 +1278,8 @@ void unref_sub_80BCD7C(u8 secretBaseIndex) void sub_80BCE1C(void) { u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); - sub_810FB10(1); + sub_810FB10(1); CreateSecretBaseEnemyParty(&gSaveBlock1.secretBases[curBaseIndex]); } @@ -1249,9 +1297,7 @@ void sub_80BCE90() u8 i; for (i = 0; i < MAX_SECRET_BASES; i++) - { gSaveBlock1.secretBases[i].sbr_field_1_5 = 0; - } FlagSet(FLAG_DAILY_UNKNOWN_8C2); } @@ -1281,28 +1327,18 @@ void sub_80BCF1C(u8 taskId) behavior = MapGridGetMetatileBehaviorAt(x, y); if (sub_8057350(behavior) == TRUE) - { DoYellowCave4Sparkle(); - } else if (sub_8057314(behavior) == TRUE) - { sub_80C68A4(MapGridGetMetatileIdAt(x, y), x, y); - } else if (sub_8057328(behavior) == TRUE) - { sub_80C6A54(x, y); - } else if (sub_805733C(behavior) == TRUE) - { DoDecorationSoundEffect(MapGridGetMetatileIdAt(x, y)); - } } break; case 2: if (!FieldEffectActiveListContains(taskData[4])) - { taskData[1] = 1; - } break; } } @@ -1320,9 +1356,7 @@ bool8 sub_80BD070(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB for (i = 0; i < 4; i++) { if (baseA->trainerId[i] != baseB->trainerId[i]) - { return FALSE; - } } return TRUE; @@ -1335,9 +1369,7 @@ bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB for (i = 0; i < OT_NAME_LENGTH && (baseA->playerName[i] != 0xFF || baseB->playerName[i] != 0xFF); i++) { if (baseA->playerName[i] != baseB->playerName[i]) - { return FALSE; - } } return TRUE; @@ -1346,12 +1378,9 @@ bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB bool8 sub_80BD0EC(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) { if (baseA->gender == baseB->gender && sub_80BD070(baseA, baseB) && sub_80BD0A0(baseA, baseB)) - { return TRUE; - } - - - return FALSE; + else + return FALSE; } s16 sub_80BD12C(u8 secretBaseId) @@ -1361,9 +1390,7 @@ s16 sub_80BD12C(u8 secretBaseId) for (i = 0; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].secretBaseId == secretBaseId) - { return i; - } } return -1; @@ -1376,9 +1403,7 @@ u8 sub_80BD170(void) for (i = 1; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].secretBaseId == 0) - { return i; - } } return 0; @@ -1391,9 +1416,7 @@ u8 sub_80BD1B0(void) for (i = 1; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 0 && gSaveBlock1.secretBases[i].sbr_field_1_0 == 0) - { return i; - } } return 0; @@ -1404,9 +1427,7 @@ u8 sub_80BD1FC(struct SecretBaseRecord *secretBase) s16 secretBaseIndex; if (secretBase->secretBaseId == 0) - { return 0; - } secretBaseIndex = sub_80BD12C(secretBase->secretBaseId); if (secretBaseIndex != 0) @@ -1414,11 +1435,9 @@ u8 sub_80BD1FC(struct SecretBaseRecord *secretBase) if (secretBaseIndex != -1) { if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_0 == 1) - { return 0; - } if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_6 != 2 - || secretBase->sbr_field_1_0 == 1) + || secretBase->sbr_field_1_0 == 1) { sub_80BD034(secretBaseIndex, secretBase); return secretBaseIndex; @@ -1456,7 +1475,7 @@ void sub_80BD280(void) for (j = i + 1; j < MAX_SECRET_BASES; j++) { if ((!secretBases[i].sbr_field_1_6 && secretBases[j].sbr_field_1_6 == 1) - || (secretBases[i].sbr_field_1_6 == 2 && secretBases[j].sbr_field_1_6 != 2)) + || (secretBases[i].sbr_field_1_6 == 2 && secretBases[j].sbr_field_1_6 != 2)) { temp = secretBases[i]; secretBases[i] = secretBases[j]; @@ -1473,9 +1492,7 @@ void sub_80BD328(struct SecretBaseRecord *secretBases, u8 b) for (i = 1; i < MAX_SECRET_BASES; i++) { if (secretBases[i].sbr_field_1_6 == b) - { sub_80BD1FC(&secretBases[i]); - } } } @@ -1540,9 +1557,7 @@ void sub_80BD3DC(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases } if (var1 == 7) - { break; - } } } @@ -1588,16 +1603,12 @@ void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases if (basesA[i].secretBaseId) { if (basesA[i].sbr_field_1_6 == 1) - { basesA[i].sbr_field_1_0 = 1; - } if (!sub_80BD494(&basesA[i], basesB, i)) { if (!sub_80BD494(&basesA[i], basesC, i)) - { sub_80BD494(&basesA[i], basesD, i); - } } } } @@ -1609,9 +1620,7 @@ void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases basesB[i].sbr_field_1_5 = 0; if (!sub_80BD494(&basesB[i], basesC, i)) - { sub_80BD494(&basesB[i], basesD, i); - } } } @@ -1624,9 +1633,7 @@ void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases } if (basesD[i].secretBaseId) - { basesD[i].sbr_field_1_5 = 0; - } } } @@ -1648,183 +1655,16 @@ void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases sub_80BD328(basesC, 0); } -#if DEBUG -__attribute__((naked)) -void sub_80BD674(void *playerRecords, u32 size, u8 c) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - add r6, r0, #0\n\ - add r5, r1, #0\n\ - lsl r2, r2, #0x18\n\ - lsr r7, r2, #0x18\n\ - ldr r0, ._503 @ gUnknown_020297ED\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._498 @cond_branch\n\ - mov r0, #0x60\n\ - bl FlagGet\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._498 @cond_branch\n\ - b ._520\n\ -._498:\n\ - bl GetLinkPlayerCount\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x2\n\ - beq ._500 @cond_branch\n\ - cmp r0, #0x3\n\ - beq ._501 @cond_branch\n\ - b ._505\n\ -._504:\n\ - .align 2, 0\n\ -._503:\n\ - .word gUnknown_020297ED\n\ -._500:\n\ - lsl r4, r5, #0x1\n\ - add r0, r6, r4\n\ - mov r1, #0x0\n\ - add r2, r5, #0\n\ - bl memset\n\ - add r4, r4, r5\n\ - add r4, r6, r4\n\ - add r0, r4, #0\n\ - mov r1, #0x0\n\ - add r2, r5, #0\n\ - bl memset\n\ - b ._505\n\ -._501:\n\ - lsl r0, r5, #0x1\n\ - add r0, r0, r5\n\ - add r0, r6, r0\n\ - mov r1, #0x0\n\ - add r2, r5, #0\n\ - bl memset\n\ -._505:\n\ - cmp r7, #0x1\n\ - beq ._506 @cond_branch\n\ - cmp r7, #0x1\n\ - bgt ._507 @cond_branch\n\ - cmp r7, #0\n\ - beq ._508 @cond_branch\n\ - b ._515\n\ -._507:\n\ - cmp r7, #0x2\n\ - beq ._510 @cond_branch\n\ - cmp r7, #0x3\n\ - beq ._511 @cond_branch\n\ - b ._515\n\ -._508:\n\ - add r0, r6, r5\n\ - lsl r2, r5, #0x1\n\ - add r1, r6, r2\n\ - add r2, r2, r5\n\ - add r2, r6, r2\n\ - bl sub_80BD610\n\ - b ._515\n\ -._506:\n\ - lsl r1, r5, #0x1\n\ - add r0, r6, r1\n\ - add r1, r1, r5\n\ - add r1, r6, r1\n\ - add r2, r6, #0\n\ - bl sub_80BD610\n\ - b ._515\n\ -._510:\n\ - lsl r0, r5, #0x1\n\ - add r0, r0, r5\n\ - add r0, r6, r0\n\ - add r2, r6, r5\n\ - add r1, r6, #0\n\ - bl sub_80BD610\n\ - b ._515\n\ -._511:\n\ - add r1, r6, r5\n\ - lsl r2, r5, #0x1\n\ - add r2, r6, r2\n\ - add r0, r6, #0\n\ - bl sub_80BD610\n\ -._515:\n\ - mov r3, #0x1\n\ - ldr r6, ._521 @ gSaveBlock1\n\ - mov r5, #0x10\n\ - neg r5, r5\n\ - ldr r4, ._521 + 4 @ 0x1a09\n\ -._517:\n\ - lsl r0, r3, #0x2\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x5\n\ - add r0, r0, r6\n\ - add r2, r0, r4\n\ - ldrb r1, [r2]\n\ - lsl r0, r1, #0x1c\n\ - lsr r0, r0, #0x1c\n\ - cmp r0, #0x1\n\ - bne ._516 @cond_branch\n\ - mov r0, #0x3f\n\ - and r0, r0, r1\n\ - mov r1, #0x40\n\ - orr r0, r0, r1\n\ - and r0, r0, r5\n\ - strb r0, [r2]\n\ -._516:\n\ - add r0, r3, #1\n\ - lsl r0, r0, #0x10\n\ - lsr r3, r0, #0x10\n\ - cmp r3, #0x13\n\ - bls ._517 @cond_branch\n\ - bl sub_80BD280\n\ - mov r3, #0x1\n\ - ldr r4, ._521 @ gSaveBlock1\n\ - ldr r6, ._521 + 4 @ 0x1a09\n\ - add r7, r4, #0\n\ - mov r5, #0x3f\n\ -._519:\n\ - lsl r0, r3, #0x2\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x5\n\ - add r0, r0, r4\n\ - add r2, r0, r6\n\ - ldrb r1, [r2]\n\ - lsr r0, r1, #0x6\n\ - cmp r0, #0x2\n\ - bne ._518 @cond_branch\n\ - add r0, r5, #0\n\ - and r0, r0, r1\n\ - strb r0, [r2]\n\ -._518:\n\ - add r0, r3, #1\n\ - lsl r0, r0, #0x10\n\ - lsr r3, r0, #0x10\n\ - cmp r3, #0x13\n\ - bls ._519 @cond_branch\n\ - ldr r0, ._521 + 8 @ 0x1a16\n\ - add r2, r7, r0\n\ - ldrh r1, [r2]\n\ - ldr r0, ._521 + 12 @ 0xffff\n\ - cmp r1, r0\n\ - beq ._520 @cond_branch\n\ - add r0, r1, #1\n\ - strh r0, [r2]\n\ -._520:\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._522:\n\ - .align 2, 0\n\ -._521:\n\ - .word gSaveBlock1\n\ - .word 0x1a09\n\ - .word 0x1a16\n\ - .word 0xffff"); -} -#else void sub_80BD674(void *playerRecords, u32 size, u8 c) { - if (FlagGet(FLAG_RECEIVED_SECRET_POWER)) + if ( +#if DEBUG + gUnknown_020297ED != 0 || +#endif + FlagGet(FLAG_RECEIVED_SECRET_POWER)) { u16 i; + u8 numLinkedPlayers = GetLinkPlayerCount(); switch (numLinkedPlayers) { @@ -1867,15 +1707,10 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) for (i = 1; i < MAX_SECRET_BASES; i++) { if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 2) - { gSaveBlock1.secretBases[i].sbr_field_1_6 = 0; - } } if (gSaveBlock1.secretBases[0].sbr_field_e != 0xFFFF) - { gSaveBlock1.secretBases[0].sbr_field_e++; - } } } -#endif -- cgit v1.2.3 From 0687469f88a3eeac097cf440f3d12a4b3f2986f3 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Fri, 16 Feb 2018 23:03:39 -0600 Subject: fix build --- src/field/slot_machine.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 4958c2a0c..8075f24e4 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -164,7 +164,9 @@ static bool8 sub_81023E0(struct Task *task); static bool8 sub_81023FC(struct Task *task); static bool8 sub_8102424(struct Task *task); static bool8 sub_8102460(struct Task *task); +#if DEBUG static bool8 debug_sub_8116E74(struct Task *); +#endif static void sub_8102484(void); static void sub_81024F0(void); static bool8 sub_8102540(void); @@ -311,12 +313,14 @@ static void sub_81064B8(void); static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4); static void sub_81065DC(void); +#if DEBUG static void debug_sub_811B5D0(void); static void debug_sub_811B620(void); static void debug_sub_811B5B4(s32 *, s32); static void debug_sub_811B894(void); static u8 debug_sub_811B634(void); static void debug_sub_811B654(u8 taskId); +#endif #if DEBUG static u8 unk_debug_bss_1_0; -- cgit v1.2.3 From b9f8d43825463363a67be0ce9fcd00b23d264e05 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sat, 17 Feb 2018 15:32:57 -0600 Subject: decompile more debug code --- src/debug/start_menu_debug.c | 10 +- src/field/battle_tower.c | 104 +------ src/field/berry.c | 601 +++++++---------------------------------- src/field/field_weather.c | 251 ++++++----------- src/field/fldeff_cut.c | 141 +++------- src/field/fldeff_secretpower.c | 24 +- src/field/shop.c | 52 ++-- src/field/start_menu.c | 370 ++++++------------------- 8 files changed, 355 insertions(+), 1198 deletions(-) (limited to 'src') diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index 04bfb30d1..9b12c1cc1 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -1433,7 +1433,7 @@ u8 DebugMenu_8077434() " ldr r0, ._157 @ Str_839BE0F\n" " mov r1, #0x1\n" " mov r2, #0x4\n" - " bl GetEnigmaBerryChecksum\n" + " bl debug_sub_80C2C18\n" " mov r0, #0xff\n" " str r0, [sp]\n" " str r0, [sp, #0x4]\n" @@ -1450,7 +1450,7 @@ u8 DebugMenu_8077434() " ldr r0, ._160 @ Str_839BE12\n" " mov r1, #0x2\n" " mov r2, #0x0\n" - " bl GetEnigmaBerryChecksum\n" + " bl debug_sub_80C2C18\n" " mov r0, #0xff\n" " str r0, [sp]\n" " str r0, [sp, #0x4]\n" @@ -1465,7 +1465,7 @@ u8 DebugMenu_8077434() " ldr r0, ._163 @ Str_839BE16\n" " mov r1, #0x3\n" " mov r2, #0x0\n" - " bl GetEnigmaBerryChecksum\n" + " bl debug_sub_80C2C18\n" " mov r0, #0xff\n" " str r0, [sp]\n" " str r0, [sp, #0x4]\n" @@ -1479,7 +1479,7 @@ u8 DebugMenu_8077434() " ldr r0, ._166 @ Str_839BE1A\n" " mov r1, #0x4\n" " mov r2, #0x0\n" - " bl GetEnigmaBerryChecksum\n" + " bl debug_sub_80C2C18\n" " mov r0, #0xff\n" " str r0, [sp]\n" " str r0, [sp, #0x4]\n" @@ -1499,7 +1499,7 @@ u8 DebugMenu_8077434() " ldr r0, ._168 @ Str_839BE1E\n" " mov r1, #0x4\n" " mov r2, #0x0\n" - " bl GetEnigmaBerryChecksum\n" + " bl debug_sub_80C2C18\n" " mov r0, #0xff\n" " str r0, [sp]\n" " str r0, [sp, #0x4]\n" diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c index 41d5ae9d1..1853abbee 100644 --- a/src/field/battle_tower.c +++ b/src/field/battle_tower.c @@ -259,7 +259,6 @@ static void SaveCurrentWinStreak(void); static void sub_8135CFC(void); static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *); static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); -void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *); static void ClearBattleTowerRecord(struct BattleTowerRecord *); @@ -1561,17 +1560,11 @@ void PrintBattleTowerTrainerMessage(u16 *easyChat) void PrintBattleTowerTrainerGreeting(void) { if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting.easyChat); - } + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting); else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting.easyChat); - } else - { PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting.easyChat); - } } void sub_81354CC(void) @@ -1643,9 +1636,7 @@ void StartSpecialBattle(void) ZeroEnemyPartyMons(); for (i = 0; i < 3; i++) - { sub_803ADE8(&gEnemyParty[i], &gSaveBlock2.battleTower.ereaderTrainer.party[i]); - } gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER); gTrainerBattleOpponent = 0; @@ -1683,34 +1674,22 @@ void SetBattleTowerProperty(void) break; case 5: for (i = 0; i < 3; i++) - { gSaveBlock2.battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i]; - } break; case 6: if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { ClearEReaderTrainer(&gSaveBlock2.battleTower.ereaderTrainer); - } - if (gSaveBlock2.battleTower.totalBattleTowerWins < 9999) - { gSaveBlock2.battleTower.totalBattleTowerWins++; - } - gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]++; SaveCurrentWinStreak(); gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; - gStringVar1[0] = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1; gStringVar1[1] = 0xFF; break; case 7: if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] < 1430) - { gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]++; - } - SaveCurrentWinStreak(); gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; break; @@ -1724,9 +1703,7 @@ void SetBattleTowerProperty(void) break; case 11: if (gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] != 3) - { ResetBattleTowerStreak(battleTowerLevelType); - } break; case 12: gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; @@ -1794,9 +1771,7 @@ void SetBattleTowerParty(void) s32 i; for (i = 0; i < 3; i++) - { gSelectedOrderFromParty[i] = gSaveBlock2.battleTower.selectedPartyMons[i]; - } ReducePlayerPartyToThree(); } @@ -1858,14 +1833,10 @@ void sub_8135AC4(void) playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); for (i = 0; i < 6; i++) - { playerRecord->greeting.easyChat[i] = gSaveBlock1.easyChats.unk2B28[i]; - } for (i = 0; i < 3; i++) - { sub_803AF78(&gUnknown_030042FC[gSaveBlock2.battleTower.selectedPartyMons[i]], &playerRecord->party[i]); - } SetBattleTowerRecordChecksum(&gSaveBlock2.battleTower.playerRecord); SaveCurrentWinStreak(); @@ -1878,10 +1849,8 @@ void SaveBattleTowerProgress(void) if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0) { if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] > 1 - || gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] > 1) - { + || gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] > 1) sub_8135AC4(); - } } sub_8135CFC(); @@ -1889,9 +1858,7 @@ void SaveBattleTowerProgress(void) gSaveBlock2.battleTower.battleOutcome = gBattleOutcome; if (gSpecialVar_0x8004 != 3) - { gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004; - } VarSet(VAR_TEMP_0, 0); gSaveBlock2.battleTower.unk_554 = 1; @@ -1912,28 +1879,20 @@ void ValidateBattleTowerRecordChecksums(void) checksum = 0; for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) - { checksum += ((u32 *)&gSaveBlock2.battleTower.playerRecord)[i]; - } if (gSaveBlock2.battleTower.playerRecord.checksum != checksum) - { ClearBattleTowerRecord(&gSaveBlock2.battleTower.playerRecord); - } for (recordIndex = 0; recordIndex < 5; recordIndex++) { record = &gSaveBlock2.battleTower.records[recordIndex]; checksum = 0; for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) - { checksum += ((u32 *)record)[i]; - } if (gSaveBlock2.battleTower.records[recordIndex].checksum != checksum) - { ClearBattleTowerRecord(&gSaveBlock2.battleTower.records[recordIndex]); - } } } @@ -1943,9 +1902,7 @@ void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record) record->checksum = 0; for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) - { record->checksum += ((u32 *)record)[i]; - } } void ClearBattleTowerRecord(struct BattleTowerRecord *record) @@ -1953,9 +1910,7 @@ void ClearBattleTowerRecord(struct BattleTowerRecord *record) u32 i; for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32); i++) - { ((u32 *)record)[i] = 0; - } } void sub_8135CFC(void) @@ -1967,9 +1922,7 @@ void sub_8135CFC(void) gSaveBlock2.battleTower.firstMonSpecies = gBattleMons[0].species; for (i = 0; i < POKEMON_NAME_LENGTH; i++) - { gSaveBlock2.battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i]; - } } u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) @@ -1978,11 +1931,9 @@ u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; if (winStreak > 9999) - { return 9999; - } - - return winStreak; + else + return winStreak; } void DetermineBattleTowerPrize(void) @@ -2019,11 +1970,10 @@ void AwardBattleTowerRibbons(void) u8 ribbonType; u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - ribbonType = MON_DATA_WINNING_RIBBON; if (battleTowerLevelType != 0) - { ribbonType = MON_DATA_VICTORY_RIBBON; - } + else + ribbonType = MON_DATA_WINNING_RIBBON; gSpecialVar_Result = 0; @@ -2042,9 +1992,7 @@ void AwardBattleTowerRibbons(void) } if (gSpecialVar_Result != 0) - { IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); - } } // This is a leftover debugging function that is used to populate the E-Reader @@ -2076,16 +2024,14 @@ void Debug_FillEReaderTrainerWithPlayerData(void) j = 7; for (i = 0; i < 6; i++) { - ereaderTrainer->greeting.easyChat[i] = gSaveBlock1.easyChats.unk2B28[i]; - ereaderTrainer->farewellPlayerLost.easyChat[i] = j; - ereaderTrainer->farewellPlayerWon.easyChat[i] = j + 6; + ereaderTrainer->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; + ereaderTrainer->farewellPlayerLost[i] = j; + ereaderTrainer->farewellPlayerWon[i] = j + 6; j++; } for (i = 0; i < 3; i++) - { sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]); - } SetEReaderTrainerChecksum(ereaderTrainer); } @@ -2105,9 +2051,7 @@ void SetEReaderTrainerName(u8 *trainerName) s32 i; for (i = 0; i < 7; i++) - { trainerName[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; - } trainerName[i] = 0xFF; } @@ -2124,9 +2068,7 @@ void ValidateEReaderTrainer(void) checksum = 0; for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) - { checksum |= ((u32 *)ereaderTrainer)[i]; - } if (checksum == 0) { @@ -2136,9 +2078,7 @@ void ValidateEReaderTrainer(void) checksum = 0; for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) - { checksum += ((u32 *)ereaderTrainer)[i]; - } if (gSaveBlock2.battleTower.ereaderTrainer.checksum != checksum) { @@ -2153,9 +2093,7 @@ void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer) ereaderTrainer->checksum = 0; for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) - { ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i]; - } } void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer) @@ -2163,30 +2101,22 @@ void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer) u32 i; for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32); i++) - { ((u32 *)ereaderTrainer)[i] = 0; - } } void PrintEReaderTrainerGreeting(void) { - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting.easyChat); + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting); } void PrintEReaderTrainerFarewellMessage(void) { if (gBattleOutcome == BATTLE_DREW) - { - gStringVar4[0] = 0xFF; - } + gStringVar4[0] = EOS; else if (gBattleOutcome == BATTLE_WON) - { - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerWon.easyChat); - } + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerWon); else - { - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerLost.easyChat); - } + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerLost); } void TryEnableBravoTrainerBattleTower(void) @@ -2196,9 +2126,7 @@ void TryEnableBravoTrainerBattleTower(void) for (i = 0; i < 2; i++) { if (gSaveBlock2.battleTower.var_4AE[i] == 1) - { sub_80BFD20(); - } } } @@ -2206,17 +2134,11 @@ void TryEnableBravoTrainerBattleTower(void) u8 de_sub_81364AC(void) { if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; - } else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { return gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; - } else - { return gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass; - } } u8 de_sub_81364F8(void) diff --git a/src/field/berry.c b/src/field/berry.c index 588807755..a0ec9836a 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -8,7 +8,9 @@ #include "item_use.h" #include "constants/items.h" #include "main.h" +#include "menu.h" #include "random.h" +#include "task.h" #include "text.h" #define BERRY_NAME_LENGTH 6 @@ -1000,63 +1002,27 @@ static u8 CalcBerryYield(struct BerryTree *tree); static u16 GetStageDurationByBerryType(u8 berry); #if DEBUG -__attribute__((naked)) -void debug_sub_80C2B04() + +extern u8 sub_80B47D8(u16 var); + +u8 debug_sub_80C2B04(void) { - asm( - " push {lr}\n" - " mov r0, #0x0\n" - " bl sub_80B47D8\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._1 @ gTasks\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldrh r0, [r1, #0x10]\n" - " sub r0, r0, #0x1\n" - " strh r0, [r1, #0x10]\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._2:\n" - " .align 2, 0\n" - "._1:\n" - " .word gTasks\n" - "\n" - ); + u8 taskId = sub_80B47D8(0); + + gTasks[taskId].data[4]--; + CloseMenu(); + return 1; } -__attribute__((naked)) -void debug_sub_80C2B30() +u8 debug_sub_80C2B30(void) { - asm( - " push {lr}\n" - " mov r0, #0x1\n" - " bl sub_80B47D8\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " ldr r2, ._3 @ gTasks\n" - " lsl r1, r0, #0x2\n" - " add r1, r1, r0\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r2\n" - " ldrh r0, [r1, #0x10]\n" - " sub r0, r0, #0x1\n" - " strh r0, [r1, #0x10]\n" - " bl CloseMenu\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "._4:\n" - " .align 2, 0\n" - "._3:\n" - " .word gTasks\n" - "\n" - ); + u8 taskId = sub_80B47D8(1); + + gTasks[taskId].data[4]--; + CloseMenu(); + return 1; } + #endif // unused @@ -1082,180 +1048,6 @@ void SetEnigmaBerry(u8 *src) gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; } -#if DEBUG -__attribute__((naked)) -void debug_sub_80C2BD0() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " ldr r3, ._11 @ gSaveBlock1\n" - " ldr r1, ._11 + 4 @ 0x316c\n" - " add r4, r3, r1\n" - " ldr r6, [r4]\n" - " add r1, r1, #0x4\n" - " add r2, r3, r1\n" - " ldr r7, [r2]\n" - " mov r1, #0x0\n" - " str r1, [r4]\n" - " str r1, [r2]\n" - " add r4, r0, #0\n" - " mov r2, #0x0\n" - " ldr r5, ._11 + 8 @ 0x52b\n" - "._10:\n" - " add r0, r4, r1\n" - " ldrb r0, [r0]\n" - " add r2, r2, r0\n" - " add r1, r1, #0x1\n" - " cmp r1, r5\n" - " bls ._10 @cond_branch\n" - " ldr r1, ._11 + 4 @ 0x316c\n" - " add r0, r3, r1\n" - " str r6, [r0]\n" - " add r1, r1, #0x4\n" - " add r0, r3, r1\n" - " str r7, [r0]\n" - " add r0, r2, #0\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._12:\n" - " .align 2, 0\n" - "._11:\n" - " .word gSaveBlock1\n" - " .word 0x316c\n" - " .word 0x52b\n" - "\n" - ); -} -#endif - -#if DEBUG -__attribute__((naked)) -u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add r3, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " mov r9, r1\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " mov r8, r2\n" - " ldr r4, ._16 @ gSaveBlock1\n" - " ldr r1, ._16 + 4 @ 0x3160\n" - " add r0, r4, r1\n" - " add r2, r0, #0\n" - " ldr r1, ._16 + 8 @ gBerries\n" - " ldmia r1!, {r5, r6, r7}\n" - " stmia r2!, {r5, r6, r7}\n" - " ldmia r1!, {r5, r6, r7}\n" - " stmia r2!, {r5, r6, r7}\n" - " ldr r1, [r1]\n" - " str r1, [r2]\n" - " add r1, r3, #0\n" - " bl StringCopy\n" - " ldr r0, ._16 + 12 @ 0x361c\n" - " add r6, r4, r0\n" - " ldr r1, ._16 + 16 @ gUnknown_Debug_083F7F84\n" - " add r0, r6, #0\n" - " bl StringCopy\n" - " ldr r1, ._16 + 20 @ 0x3649\n" - " add r5, r4, r1\n" - " ldr r1, ._16 + 24 @ gUnknown_Debug_083F7F90\n" - " add r0, r5, #0\n" - " bl StringCopy\n" - " ldr r2, ._16 + 28 @ 0x316c\n" - " add r0, r4, r2\n" - " str r6, [r0]\n" - " ldr r6, ._16 + 32 @ 0x3170\n" - " add r0, r4, r6\n" - " str r5, [r0]\n" - " mov r2, #0x0\n" - " ldr r6, ._16 + 36 @ 0x47f\n" - " ldr r7, ._16 + 40 @ 0x317c\n" - " add r5, r4, r7\n" - " ldr r3, ._16 + 44 @ gSpriteImage_UnusedCherry\n" - "._13:\n" - " add r0, r2, r5\n" - " add r1, r2, r3\n" - " ldrb r1, [r1]\n" - " strb r1, [r0]\n" - " add r2, r2, #0x1\n" - " cmp r2, r6\n" - " ble ._13 @cond_branch\n" - " ldr r0, ._16 @ gSaveBlock1\n" - " ldr r3, ._16 + 48 @ gSpritePalette_UnusedCherry\n" - " ldr r2, ._16 + 52 @ 0x35fc\n" - " add r1, r0, r2\n" - " mov r2, #0xf\n" - "._14:\n" - " ldrh r0, [r3]\n" - " strh r0, [r1]\n" - " add r3, r3, #0x2\n" - " add r1, r1, #0x2\n" - " sub r2, r2, #0x1\n" - " cmp r2, #0\n" - " bge ._14 @cond_branch\n" - " mov r2, #0x0\n" - " ldr r5, ._16 + 56 @ gSaveBlock1\n" - " ldr r3, ._16 + 60 @ gUnknown_Debug_839B6CE\n" - "._15:\n" - " add r0, r2, r5\n" - " add r1, r2, r3\n" - " ldrb r1, [r1]\n" - " strb r1, [r0]\n" - " add r2, r2, #0x1\n" - " cmp r2, #0x11\n" - " ble ._15 @cond_branch\n" - " ldr r5, ._16 + 64 @ 0x3688\n" - " add r0, r4, r5\n" - " mov r6, r9\n" - " strb r6, [r0]\n" - " ldr r7, ._16 + 68 @ 0x3689\n" - " add r0, r4, r7\n" - " mov r1, r8\n" - " strb r1, [r0]\n" - " ldr r2, ._16 + 4 @ 0x3160\n" - " add r0, r4, r2\n" - " bl debug_sub_80C2BD0\n" - " add r5, r5, #0x4\n" - " add r1, r4, r5\n" - " str r0, [r1]\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._17:\n" - " .align 2, 0\n" - "._16:\n" - " .word gSaveBlock1\n" - " .word 0x3160\n" - " .word gBerries\n" - " .word 0x361c\n" - " .word gUnknown_Debug_083F7F84\n" - " .word 0x3649\n" - " .word gUnknown_Debug_083F7F90\n" - " .word 0x316c\n" - " .word 0x3170\n" - " .word 0x47f\n" - " .word 0x317c\n" - " .word gSpriteImage_UnusedCherry\n" - " .word gSpritePalette_UnusedCherry\n" - " .word 0x35fc\n" - " .word gSaveBlock1+0x3676\n" - " .word gUnknown_Debug_839B6CE\n" - " .word 0x3688\n" - " .word 0x3689\n" - "\n" - ); -} -#else static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) { const u8 *description1; @@ -1275,9 +1067,7 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) dest = (u8*)enigmaBerry; checksum = 0; for (i = 0; i < ((u32)&gSaveBlock1.enigmaBerry.checksum - (u32)&gSaveBlock1.enigmaBerry); i++) - { checksum += dest[i]; - } // the checksum is calculated: the descriptions are safe to restore now. gSaveBlock1.enigmaBerry.berry.description1 = description1; @@ -1285,110 +1075,52 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) return checksum; } -#endif #if DEBUG -__attribute__((naked)) -void debug_sub_80C2D24() + +extern const u8 gSpriteImage_UnusedCherry[]; +extern const u16 gSpritePalette_UnusedCherry[]; +extern u8 gUnknown_Debug_839B6CE[]; + +static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ"); +static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう"); + +void debug_sub_80C2C18(u8 *name, u8 holdEffect, u8 holdEffectParam) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " ldr r6, [sp, #0x18]\n" - " ldr r4, [sp, #0x1c]\n" - " mov r8, r4\n" - " ldr r5, ._18 @ gSaveBlock1\n" - " ldr r7, ._18 + 4 @ 0x3175\n" - " add r4, r5, r7\n" - " strb r0, [r4]\n" - " ldr r4, ._18 + 8 @ 0x3176\n" - " add r0, r5, r4\n" - " strb r1, [r0]\n" - " add r7, r7, #0x2\n" - " add r0, r5, r7\n" - " strb r2, [r0]\n" - " ldr r1, ._18 + 12 @ 0x3178\n" - " add r0, r5, r1\n" - " strb r3, [r0]\n" - " add r4, r4, #0x3\n" - " add r0, r5, r4\n" - " strb r6, [r0]\n" - " add r7, r7, #0x3\n" - " add r0, r5, r7\n" - " mov r1, r8\n" - " strb r1, [r0]\n" - " sub r4, r4, #0x19\n" - " add r0, r5, r4\n" - " bl debug_sub_80C2BD0\n" - " ldr r7, ._18 + 16 @ 0x368c\n" - " add r5, r5, r7\n" - " str r0, [r5]\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._19:\n" - " .align 2, 0\n" - "._18:\n" - " .word gSaveBlock1\n" - " .word 0x3175\n" - " .word 0x3176\n" - " .word 0x3178\n" - " .word 0x368c\n" - "\n" - ); + s32 i; + + gSaveBlock1.enigmaBerry.berry = gBerries[0]; + StringCopy(gSaveBlock1.enigmaBerry.berry.name, name); + StringCopy(gSaveBlock1.enigmaBerry.description1, gUnknown_Debug_083F7F84); + StringCopy(gSaveBlock1.enigmaBerry.description2, gUnknown_Debug_083F7F90); + gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1; + gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; + for (i = 0; i < 0x480; i++) + gSaveBlock1.enigmaBerry.pic[i] = gSpriteImage_UnusedCherry[i]; + for (i = 0; i < 16; i++) + gSaveBlock1.enigmaBerry.palette[i] = gSpritePalette_UnusedCherry[i]; + for (i = 0; i < 18; i++) + gSaveBlock1.enigmaBerry.itemEffect[i] = gUnknown_Debug_839B6CE[i]; + gSaveBlock1.enigmaBerry.holdEffect = holdEffect; + gSaveBlock1.enigmaBerry.holdEffectParam = holdEffectParam; + gSaveBlock1.enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry); } + +void debug_sub_80C2D24(u8 spicy, u8 dry, u8 sweet, u8 bitter, u8 sour, u8 smoothness) +{ + gSaveBlock1.enigmaBerry.berry.spicy = spicy; + gSaveBlock1.enigmaBerry.berry.dry = dry; + gSaveBlock1.enigmaBerry.berry.sweet = sweet; + gSaveBlock1.enigmaBerry.berry.bitter = bitter; + gSaveBlock1.enigmaBerry.berry.sour = sour; + gSaveBlock1.enigmaBerry.berry.smoothness = smoothness; + gSaveBlock1.enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry); +} + #endif // due to e-reader scans being particularly volatile to failure, it is a requirement to check for // their integrity here due to scans possibly failing to produce the correct result. -#if DEBUG -__attribute__((naked)) -bool32 IsEnigmaBerryValid() -{ - asm( - " push {r4, lr}\n" - " ldr r4, ._24 @ gSaveBlock1\n" - " ldr r1, ._24 + 4 @ 0x3174\n" - " add r0, r4, r1\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._22 @cond_branch\n" - " ldr r2, ._24 + 8 @ 0x316a\n" - " add r0, r4, r2\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._22 @cond_branch\n" - " ldr r1, ._24 + 12 @ 0x3160\n" - " add r0, r4, r1\n" - " bl debug_sub_80C2BD0\n" - " ldr r2, ._24 + 16 @ 0x368c\n" - " add r1, r4, r2\n" - " ldr r1, [r1]\n" - " cmp r0, r1\n" - " bne ._22 @cond_branch\n" - " mov r0, #0x1\n" - " b ._23\n" - "._25:\n" - " .align 2, 0\n" - "._24:\n" - " .word gSaveBlock1\n" - " .word 0x3174\n" - " .word 0x316a\n" - " .word 0x3160\n" - " .word 0x368c\n" - "._22:\n" - " mov r0, #0x0\n" - "._23:\n" - " pop {r4}\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); -} -#else bool32 IsEnigmaBerryValid(void) { if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0) @@ -1399,7 +1131,6 @@ bool32 IsEnigmaBerryValid(void) return FALSE; return TRUE; } -#endif const struct Berry *GetBerryInfo(u8 berry) { @@ -1410,9 +1141,9 @@ const struct Berry *GetBerryInfo(u8 berry) return &gSaveBlock1.enigmaBerry.berry; else { - // invalid berries will be flattened into a cheri berry. Interestingly, if your berry was + // invalid berries will be flattened into a cheri berry. Interestingly, if your berry was // an enigma berry whos checksum failed, the game will use the Enigma Berry information - // for this: meaning if you see the Enigma Berry information, its actually because the + // for this: meaning if you see the Enigma Berry information, its actually because the // checksum failed. if (berry == BERRY_NONE || berry > GETBERRYID(LAST_BERRY)) berry = GETBERRYID(FIRST_BERRY); @@ -1526,8 +1257,8 @@ void BerryTreeTimeUpdate(s32 minutesPassed) if (tree->berry != BERRY_NONE && tree->stage != BERRY_STAGE_NO_BERRY && tree->growthSparkle == FALSE) { // the player has waited too long to water the berry. Reset the tree. This is because - // if the berry state is not in the unwatered state, the tree will grow anyway despite this - // check, which means BerryTreeGrow will handle the regrow process for this, removing the + // if the berry state is not in the unwatered state, the tree will grow anyway despite this + // check, which means BerryTreeGrow will handle the regrow process for this, removing the // need for this check. This only handles the unwatered soil state. if (minutesPassed >= GetStageDurationByBerryType(tree->berry) * 71) { @@ -1546,7 +1277,7 @@ void BerryTreeTimeUpdate(s32 minutesPassed) // its been X minutes since the last berry update, so update // minutesUntilNextStage appropriately to match the time offset // that has passed since the update. - tree->minutesUntilNextStage -= time; + tree->minutesUntilNextStage -= time; break; } // perform the subtraction the other way around to get the number of minutes since @@ -1712,7 +1443,7 @@ void FieldObjectInteractionGetBerryTreeData(void) // we cannot allow the player to grow/interact with the tree while the tree // is undergoing the sparkling effect, so set the special var to the sparkling // state and let the event script process the flag. - gSpecialVar_0x8004 = BERRY_STAGE_SPARKLING; + gSpecialVar_0x8004 = BERRY_STAGE_SPARKLING; } else gSpecialVar_0x8004 = GetStageByBerryTreeId(id); @@ -1754,173 +1485,53 @@ bool8 PlayerHasBerries(void) } #if DEBUG -void debug_sub_80C33FC(u8 *buffer, s32 value, u8 n) +void debug_sub_80C33FC(const u8 *buffer, s32 value, u8 n) { StringAppend(gStringVar4, buffer); ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n); StringAppend(gStringVar4, gStringVar1); } -extern const u8 gUnknown_Debug_083F7F9D[]; -extern const u8 gUnknown_Debug_083F7FA2[]; -extern const u8 gUnknown_Debug_083F7FA9[]; -extern const u8 gUnknown_Debug_083F7FB0[]; -extern const u8 gUnknown_Debug_083F7FB7[]; -extern const u8 gUnknown_Debug_083F7FBE[]; -extern const u8 gUnknown_Debug_083F7FC5[]; -extern const u8 gUnknown_Debug_083F7FCC[]; -extern const u8 gUnknown_Debug_083F7FD3[]; -extern const u8 gUnknown_Debug_083F7FD3[]; -extern const u8 gUnknown_Debug_083F7FD3[]; - -#ifdef NONMATCHING +static const u8 gUnknown_Debug_083F7F9D[] = _("POS:"); +static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:"); +static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:"); +static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:"); +static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:"); +static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:"); +static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:"); +static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:"); +static const u8 gUnknown_Debug_083F7FD3[] = _(""); + u8* DebugOpenBerryInfo(void) { - s32 i; - u8 berryTreeId; - struct BerryTree *berryTree; - - if (GetFieldObjectScriptPointerPlayerFacing() != &S_BerryTree) + if (GetFieldObjectScriptPointerPlayerFacing() != S_BerryTree) + { return NULL; - - berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject); - berryTree = GetBerryTreeInfo(berryTreeId); - - for (i = 0; i < 500; i++) - gStringVar4[i] |= 0xFF; - - debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3); - debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2); - debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2); - debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->secondsUntilNextStage, 5); - debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2); - debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3); - debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1); - debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1); - debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1); - debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1); - debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1); - - return gStringVar4; -} -#else -__attribute__((naked)) -void DebugOpenBerryInfo() -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " bl GetFieldObjectScriptPointerPlayerFacing\n" - " ldr r1, ._138 @ S_BerryTree\n" - " cmp r0, r1\n" - " beq ._136 @cond_branch\n" - " mov r0, #0x0\n" - " b ._137\n" - "._139:\n" - " .align 2, 0\n" - "._138:\n" - " .word S_BerryTree\n" - "._136:\n" - " ldr r0, ._141 @ gSelectedMapObject\n" - " ldrb r0, [r0]\n" - " bl FieldObjectGetBerryTreeId\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " add r0, r6, #0\n" - " bl GetBerryTreeInfo\n" - " add r5, r0, #0\n" - " mov r2, #0x0\n" - " ldr r7, ._141 + 4 @ 0x1f3\n" - " ldr r4, ._141 + 8 @ gStringVar4\n" - " mov r3, #0xff\n" - "._140:\n" - " add r1, r2, r4\n" - " ldrb r0, [r1]\n" - " orr r0, r0, r3\n" - " strb r0, [r1]\n" - " add r2, r2, #0x1\n" - " cmp r2, r7\n" - " ble ._140 @cond_branch\n" - " ldr r0, ._141 + 12 @ gUnknown_Debug_083F7F9D\n" - " add r1, r6, #0\n" - " mov r2, #0x3\n" - " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 16 @ gUnknown_Debug_083F7FA2\n" - " ldrb r1, [r5]\n" - " mov r2, #0x2\n" - " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 20 @ gUnknown_Debug_083F7FA9\n" - " ldrb r1, [r5, #0x1]\n" - " lsl r1, r1, #0x19\n" - " lsr r1, r1, #0x19\n" - " mov r2, #0x2\n" - " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 24 @ gUnknown_Debug_083F7FB0\n" - " ldrh r1, [r5, #0x2]\n" - " mov r2, #0x5\n" - " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 28 @ gUnknown_Debug_083F7FB7\n" - " ldrb r1, [r5, #0x4]\n" - " mov r2, #0x2\n" - " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 32 @ gUnknown_Debug_083F7FBE\n" - " ldrb r1, [r5, #0x5]\n" - " lsl r1, r1, #0x1c\n" - " lsr r1, r1, #0x1c\n" - " mov r2, #0x3\n" - " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 36 @ gUnknown_Debug_083F7FC5\n" - " ldrb r1, [r5, #0x1]\n" - " lsr r1, r1, #0x7\n" - " mov r2, #0x1\n" - " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 40 @ gUnknown_Debug_083F7FCC\n" - " ldrb r1, [r5, #0x5]\n" - " lsl r1, r1, #0x1b\n" - " lsr r1, r1, #0x1f\n" - " mov r2, #0x1\n" - " bl debug_sub_80C33FC\n" - " ldr r4, ._141 + 44 @ gUnknown_Debug_083F7FD3\n" - " ldrb r1, [r5, #0x5]\n" - " lsl r1, r1, #0x1a\n" - " lsr r1, r1, #0x1f\n" - " add r0, r4, #0\n" - " mov r2, #0x1\n" - " bl debug_sub_80C33FC\n" - " ldrb r1, [r5, #0x5]\n" - " lsl r1, r1, #0x19\n" - " lsr r1, r1, #0x1f\n" - " add r0, r4, #0\n" - " mov r2, #0x1\n" - " bl debug_sub_80C33FC\n" - " ldrb r1, [r5, #0x5]\n" - " lsr r1, r1, #0x7\n" - " add r0, r4, #0\n" - " mov r2, #0x1\n" - " bl debug_sub_80C33FC\n" - " ldr r0, ._141 + 8 @ gStringVar4\n" - "._137:\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._142:\n" - " .align 2, 0\n" - "._141:\n" - " .word gSelectedMapObject\n" - " .word 0x1f3\n" - " .word gStringVar4\n" - " .word gUnknown_Debug_083F7F9D\n" - " .word gUnknown_Debug_083F7FA2\n" - " .word gUnknown_Debug_083F7FA9\n" - " .word gUnknown_Debug_083F7FB0\n" - " .word gUnknown_Debug_083F7FB7\n" - " .word gUnknown_Debug_083F7FBE\n" - " .word gUnknown_Debug_083F7FC5\n" - " .word gUnknown_Debug_083F7FCC\n" - " .word gUnknown_Debug_083F7FD3\n" - "\n" - ); + } + else + { + u32 berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject); + struct BerryTree *berryTree = GetBerryTreeInfo(berryTreeId); + s32 i; + + for (i = 0; i < 500; i++) + gStringVar4[i] = EOS; + + debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->minutesUntilNextStage, 5); + debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1); + + return gStringVar4; + } } -#endif #endif @@ -1952,17 +1563,3 @@ void ResetBerryTreeSparkleFlags(void) } } } - -#if DEBUG -static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ"); -static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう"); -static const u8 gUnknown_Debug_083F7F9D[] = _("POS:"); -static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:"); -static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:"); -static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:"); -static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:"); -static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:"); -static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:"); -static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:"); -static const u8 gUnknown_Debug_083F7FD3[] = _(""); -#endif diff --git a/src/field/field_weather.c b/src/field/field_weather.c index fbc5431ae..b125ff7da 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -1,12 +1,15 @@ #include "global.h" +#include "constants/songs.h" +#include "constants/weather.h" #include "blend_palette.h" #include "field_map_obj.h" #include "field_weather.h" +#include "main.h" +#include "menu.h" #include "palette.h" #include "random.h" #include "script.h" -#include "constants/weather.h" -#include "constants/songs.h" +#include "start_menu.h" #include "sound.h" #include "sprite.h" #include "task.h" @@ -15,7 +18,8 @@ #define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) -enum { +enum +{ GAMMA_NONE, GAMMA_NORMAL, GAMMA_ALT, @@ -44,9 +48,6 @@ struct WeatherCallbacks EWRAM_DATA struct Weather gWeather = {0}; EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0}; EWRAM_DATA u16 gUnknown_0202FF58 = 0; -#if DEBUG -EWRAM_DATA u16 gUnknown_Debug_20301FE = 0; -#endif static const u8 *sPaletteGammaTypes; @@ -215,39 +216,39 @@ static const u8 sBasePaletteGammaTypes[32] = #if DEBUG -const u8 gDebugText_Weather_0[] = _("なし   "); -const u8 gDebugText_Weather_1[] = _("はれ   "); -const u8 gDebugText_Weather_2[] = _("はれ2  "); -const u8 gDebugText_Weather_3[] = _("あめ   "); -const u8 gDebugText_Weather_4[] = _("ゆき   "); -const u8 gDebugText_Weather_5[] = _("かみなり "); -const u8 gDebugText_Weather_6[] = _("きり   "); -const u8 gDebugText_Weather_7[] = _("かざんばい"); -const u8 gDebugText_Weather_8[] = _("すなあらし"); -const u8 gDebugText_Weather_9[] = _("きり2  "); -const u8 gDebugText_Weather_10[] = _("かいてい "); -const u8 gDebugText_Weather_11[] = _("くもり  "); -const u8 gDebugText_Weather_12[] = _("はれ3  "); -const u8 gDebugText_Weather_13[] = _("おおあめ"); -const u8 gDebugText_Weather_14[] = _("かいてい2"); - -const u8 *const gDebugText_Weather[] = +static const u8 sDebugText_Weather_None[] = _("なし   "); // "none" +static const u8 sDebugText_Weather_Clear[] = _("はれ   "); // "clear" +static const u8 sDebugText_Weather_Clear2[] = _("はれ2  "); // "clear2" +static const u8 sDebugText_Weather_Rain[] = _("あめ   "); // "rain" +static const u8 sDebugText_Weather_Snow[] = _("ゆき   "); // "snow" +static const u8 sDebugText_Weather_Lightning[] = _("かみなり "); // "lightning" +static const u8 sDebugText_Weather_Fog[] = _("きり   "); // "fog" +static const u8 sDebugText_Weather_VolcanicAsh[] = _("かざんばい"); // "volcanic ash" +static const u8 sDebugText_Weather_Sandstorm[] = _("すなあらし"); // "sandstorm +static const u8 sDebugText_Weather_Fog2[] = _("きり2  "); // "fog2" +static const u8 sDebugText_Weather_Underwater[] = _("かいてい "); // "undersea" +static const u8 sDebugText_Weather_Cloudy[] = _("くもり  "); // "cloudy" +static const u8 sDebugText_Weather_Clear3[] = _("はれ3  "); // "clear3" +static const u8 sDebugText_Weather_HeavyRain[] = _("おおあめ"); // "heavy rain" +static const u8 sDebugText_Weather_Underwater2[] = _("かいてい2"); // "undersea2" + +static const u8 *const sDebugText_Weather[] = { - gDebugText_Weather_0, - gDebugText_Weather_1, - gDebugText_Weather_2, - gDebugText_Weather_3, - gDebugText_Weather_4, - gDebugText_Weather_5, - gDebugText_Weather_6, - gDebugText_Weather_7, - gDebugText_Weather_8, - gDebugText_Weather_9, - gDebugText_Weather_10, - gDebugText_Weather_11, - gDebugText_Weather_12, - gDebugText_Weather_13, - gDebugText_Weather_14, + [WEATHER_NONE] = sDebugText_Weather_None, + [WEATHER_CLOUDS] = sDebugText_Weather_Clear, + [WEATHER_SUNNY] = sDebugText_Weather_Clear2, + [WEATHER_RAIN_LIGHT] = sDebugText_Weather_Rain, + [WEATHER_SNOW] = sDebugText_Weather_Snow, + [WEATHER_RAIN_MED] = sDebugText_Weather_Lightning, + [WEATHER_FOG_1] = sDebugText_Weather_Fog, + [WEATHER_ASH] = sDebugText_Weather_VolcanicAsh, + [WEATHER_SANDSTORM] = sDebugText_Weather_Sandstorm, + [WEATHER_FOG_2] = sDebugText_Weather_Fog2, + [WEATHER_FOG_3] = sDebugText_Weather_Underwater, + [WEATHER_SHADE] = sDebugText_Weather_Cloudy, + [WEATHER_DROUGHT] = sDebugText_Weather_Clear3, + [WEATHER_RAIN_HEAVY] = sDebugText_Weather_HeavyRain, + [WEATHER_BUBBLES] = sDebugText_Weather_Underwater2, }; #endif @@ -1258,142 +1259,52 @@ void ResetPreservedPalettesInWeather(void) #if DEBUG -__attribute__((naked)) -u8 debug_sub_8085564(void) +EWRAM_DATA static u8 sSelectedDebugWeather = 0; + +bool8 debug_sub_8085564(void) { - asm("\ - push {lr}\n\ - mov r2, #0x0\n\ - ldr r0, ._375 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._370 @cond_branch\n\ - ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0xf\n\ - bne ._371 @cond_branch\n\ - strb r2, [r1]\n\ -._371:\n\ - mov r2, #0x1\n\ -._370:\n\ - ldr r0, ._375 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._372 @cond_branch\n\ - ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\ - ldrb r0, [r1]\n\ - cmp r0, #0\n\ - beq ._373 @cond_branch\n\ - sub r0, r0, #0x1\n\ - b ._374\n\ -._376:\n\ - .align 2, 0\n\ -._375:\n\ - .word gMain\n\ - .word gUnknown_Debug_20301FE\n\ -._373:\n\ - mov r0, #0xe\n\ -._374:\n\ - strb r0, [r1]\n\ - mov r2, #0x1\n\ -._372:\n\ - cmp r2, #0\n\ - beq ._377 @cond_branch\n\ - mov r0, #0x16\n\ - mov r1, #0x1\n\ - mov r2, #0x1c\n\ - mov r3, #0x2\n\ - bl Menu_BlankWindowRect\n\ - ldr r1, ._380 @ gDebugText_Weather\n\ - ldr r0, ._380 + 4 @ gUnknown_Debug_20301FE\n\ - ldrb r0, [r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x17\n\ - mov r2, #0x1\n\ - bl Menu_PrintText\n\ -._377:\n\ - ldr r0, ._380 + 8 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - bne ._378 @cond_branch\n\ - mov r0, #0x0\n\ - b ._379\n\ -._381:\n\ - .align 2, 0\n\ -._380:\n\ - .word gDebugText_Weather\n\ - .word gUnknown_Debug_20301FE\n\ - .word gMain\n\ -._378:\n\ - ldr r0, ._382 @ gUnknown_Debug_20301FE\n\ - ldrb r0, [r0]\n\ - bl ChangeWeather\n\ - bl CloseMenu\n\ - mov r0, #0x1\n\ -._379:\n\ - pop {r1}\n\ - bx r1\n\ -._383:\n\ - .align 2, 0\n\ -._382:\n\ - .word gUnknown_Debug_20301FE"); + bool8 changed = FALSE; + + if (gMain.newKeys & R_BUTTON) + { + sSelectedDebugWeather++; + if (sSelectedDebugWeather == 15) + sSelectedDebugWeather = 0; + changed = TRUE; + } + if (gMain.newKeys & L_BUTTON) + { + if (sSelectedDebugWeather != 0) + sSelectedDebugWeather--; + else + sSelectedDebugWeather = 14; + changed = TRUE; + } + + if (changed) + { + Menu_BlankWindowRect(22, 1, 28, 2); + Menu_PrintText(sDebugText_Weather[sSelectedDebugWeather], 23, 1); + } + + if (gMain.newKeys & A_BUTTON) + { + ChangeWeather(sSelectedDebugWeather); + CloseMenu(); + return TRUE; + } + + return FALSE; } -__attribute__((naked)) -u8 debug_sub_808560C(void) +bool8 debug_sub_808560C(void) { - asm("\ - push {r4, lr}\n\ - ldr r4, ._384 @ gUnknown_Debug_20301FE\n\ - ldr r0, ._384 + 4 @ gWeather\n\ - mov r1, #0xda\n\ - lsl r1, r1, #0x3\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - strb r0, [r4]\n\ - bl Menu_EraseScreen\n\ - mov r0, #0x16\n\ - mov r1, #0x1\n\ - mov r2, #0x1c\n\ - mov r3, #0x2\n\ - bl Menu_BlankWindowRect\n\ - ldr r1, ._384 + 8 @ gDebugText_Weather\n\ - ldrb r0, [r4]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov r1, #0x17\n\ - mov r2, #0x1\n\ - bl Menu_PrintText\n\ - ldr r1, ._384 + 12 @ gMenuCallback\n\ - ldr r0, ._384 + 16 @ debug_sub_8085564\n\ - str r0, [r1]\n\ - mov r0, #0x0\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ -._385:\n\ - .align 2, 0\n\ -._384:\n\ - .word gUnknown_Debug_20301FE\n\ - .word gWeather\n\ - .word gDebugText_Weather\n\ - .word gMenuCallback\n\ - .word debug_sub_8085564+1"); + sSelectedDebugWeather = gWeather.currWeather; + Menu_EraseScreen(); + Menu_BlankWindowRect(22, 1, 28, 2); + Menu_PrintText(sDebugText_Weather[sSelectedDebugWeather], 23, 1); + gMenuCallback = debug_sub_8085564; + return FALSE; } #endif diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c index 5d39b87a9..84914b444 100644 --- a/src/field/fldeff_cut.c +++ b/src/field/fldeff_cut.c @@ -73,112 +73,43 @@ static const struct SpriteTemplate gSpriteTemplate_CutGrass = }; #if DEBUG -__attribute__((naked)) -void debug_sub_80AFEE4() + +void debug_sub_80AFEE4(void) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " mov r0, #0x52\n" - " bl npc_before_player_of_type\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._1 @cond_branch\n" - " ldr r1, ._3 @ gLastFieldPokeMenuOpened\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " bl sub_80A2634\n" - " b ._8\n" - "._4:\n" - " .align 2, 0\n" - "._3:\n" - " .word gLastFieldPokeMenuOpened\n" - "._1:\n" - " ldr r4, ._9 @ gUnknown_0203923C\n" - " add r1, r4, #2\n" - " add r0, r4, #0\n" - " bl PlayerGetDestCoords\n" - " mov r7, #0x0\n" - " mov r8, r4\n" - "._12:\n" - " ldr r1, ._9 + 4 @ 0xffff\n" - " add r0, r7, r1\n" - " mov r2, r8\n" - " ldrh r2, [r2, #0x2]\n" - " add r0, r0, r2\n" - " mov r6, #0x0\n" - " lsl r0, r0, #0x10\n" - " asr r5, r0, #0x10\n" - "._11:\n" - " ldr r1, ._9 + 4 @ 0xffff\n" - " add r0, r6, r1\n" - " mov r2, r8\n" - " ldrh r2, [r2]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x10\n" - " asr r4, r0, #0x10\n" - " add r0, r4, #0\n" - " add r1, r5, #0\n" - " bl MapGridGetZCoordAt\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r2, r8\n" - " mov r1, #0x4\n" - " ldsb r1, [r2, r1]\n" - " cmp r0, r1\n" - " bne ._7 @cond_branch\n" - " add r0, r4, #0\n" - " add r1, r5, #0\n" - " bl MapGridGetMetatileBehaviorAt\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " add r0, r4, #0\n" - " bl MetatileBehavior_IsPokeGrass\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " beq ._6 @cond_branch\n" - " add r0, r4, #0\n" - " bl MetatileBehavior_IsAshGrass\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " cmp r0, #0x1\n" - " bne ._7 @cond_branch\n" - "._6:\n" - " ldr r1, ._9 + 8 @ gLastFieldPokeMenuOpened\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " bl sub_80A25E8\n" - " b ._8\n" - "._10:\n" - " .align 2, 0\n" - "._9:\n" - " .word gUnknown_0203923C\n" - " .word 0xffff\n" - " .word gLastFieldPokeMenuOpened\n" - "._7:\n" - " add r0, r6, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r6, r0, #0x18\n" - " cmp r6, #0x2\n" - " bls ._11 @cond_branch\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r7, #0x2\n" - " bls ._12 @cond_branch\n" - " bl ScriptContext2_Disable\n" - "._8:\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "\n" - ); + s16 x, y; + u8 i, j; + u8 metatile; + + if (npc_before_player_of_type(0x52) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + sub_80A2634(); + return; + } + + PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + for (i = 0; i < 3; i++) + { + y = i - 1 + gUnknown_0203923C.y; + for (j = 0; j < 3; j++) + { + x = j - 1 + gUnknown_0203923C.x; + if (MapGridGetZCoordAt(x, y) == gUnknown_0203923C.height) + { + metatile = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsPokeGrass(metatile) == TRUE + || MetatileBehavior_IsAshGrass(metatile) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + sub_80A25E8(); + return; + } + } + } + } + ScriptContext2_Disable(); } + #endif bool8 SetUpFieldMove_Cut(void) @@ -202,7 +133,7 @@ bool8 SetUpFieldMove_Cut(void) for(j = 0; j < 3; j++) { x = j - 1 + gUnknown_0203923C.x; - if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height) + if(MapGridGetZCoordAt(x, y) == gUnknown_0203923C.height) { tileBehavior = MapGridGetMetatileBehaviorAt(x, y); if(MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c index c998448a4..d1df03d84 100644 --- a/src/field/fldeff_secretpower.c +++ b/src/field/fldeff_secretpower.c @@ -253,33 +253,33 @@ void debug_sub_80D93F4(void) if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != 2) { - ScriptContext2_Disable(); - return; + ScriptContext2_Disable(); + return; } GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); metatile = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y); if (MetatileBehavior_IsSecretBaseCave(metatile) == TRUE) { - sub_80C6264(); - gLastFieldPokeMenuOpened = 0; - sub_80C639C(); + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C639C(); } else if (MetatileBehavior_IsSecretBaseTree(metatile) == TRUE) { - sub_80C6264(); - gLastFieldPokeMenuOpened = 0; - sub_80C64A8(); + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C64A8(); } else if (MetatileBehavior_IsSecretBaseShrub(metatile) == TRUE) { - sub_80C6264(); - gLastFieldPokeMenuOpened = 0; - sub_80C660C(); + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C660C(); } else { - ScriptContext2_Disable(); + ScriptContext2_Disable(); } } diff --git a/src/field/shop.c b/src/field/shop.c index fdee31178..7cd69e62d 100644 --- a/src/field/shop.c +++ b/src/field/shop.c @@ -115,7 +115,7 @@ static void SetShopMenuCallback(void *callbackPtr) gMartInfo.callback = callbackPtr; } -static void SetShopItemsForSale(u16 *items) +static void SetShopItemsForSale(const u16 *items) { u16 i = 0; @@ -153,13 +153,9 @@ static void Task_DoBuySellMenu(u8 taskId) { PlaySE(SE_SELECT); if (gMartInfo.martType == MART_TYPE_0) - { sBuySellQuitMenuActions[gMartBuySellOptionList[gMartInfo.cursor]].func(taskIdConst); - } else - { sBuySellQuitMenuActions[gMartBuyNoSellOptionList[gMartInfo.cursor]].func(taskIdConst); - } } else if (gMain.newKeys & B_BUTTON) { @@ -366,15 +362,15 @@ static void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) switch (tempVar4) { - case 0: // _080B335C + case 0: BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3); BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); break; - case 1: // _080B3364 + case 1: BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); break; - case 2: // _080B3398 + case 2: BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); break; @@ -550,7 +546,7 @@ static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControl { u8 *stringPtr = gStringVar1; - if (hasControlCode != FALSE) + if (hasControlCode) { stringPtr[0] = EXT_CTRL_CODE_BEGIN; stringPtr[1] = 0x1; @@ -563,7 +559,7 @@ static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControl sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); stringPtr = gStringVar1; - if (hasControlCode != FALSE) + if (hasControlCode) stringPtr = &gStringVar1[3]; GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4); @@ -574,7 +570,7 @@ static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasCon { u8 *stringPtr = gStringVar1; - if (hasControlCode != FALSE) + if (hasControlCode) { stringPtr[0] = EXT_CTRL_CODE_BEGIN; stringPtr[1] = 0x1; @@ -586,7 +582,7 @@ static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasCon sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); stringPtr = gStringVar1; - if (hasControlCode != FALSE) + if (hasControlCode) stringPtr = &gStringVar1[3]; // some names are the maximum string length for a shop item. Because there is no room for @@ -632,8 +628,10 @@ static void Shop_PrintItemDescText(void) 0x4, 0x68, 0x68, 0x30, 0); } else + { sub_8072AB0(gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].description, 0x4, 0x68, 0x68, 0x30, 0); + } } else { @@ -687,7 +685,9 @@ static void Task_DoItemPurchase(u8 taskId) Task_UpdatePurchaseHistory(taskId); } else + { DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); + } } else // a normal mart is only type 0, so types 1 and 2 are decoration marts. { @@ -706,7 +706,9 @@ static void Task_DoItemPurchase(u8 taskId) } } else + { DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); + } } static void Shop_DoYesNoPurchase(u8 taskId) @@ -1129,19 +1131,17 @@ static void Shop_DoCursorAction(u8 taskId) ConvertIntToDecimalStringN(gStringVar2, gMartTotalCost, 0, 0x8); if (gMartInfo.martType == MART_TYPE_1) - { StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe2); - } else - { StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe3); - } DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); } } } else + { Task_ExitBuyMenu(taskId); + } } else if (gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu { @@ -1240,22 +1240,12 @@ void Shop_CreateDecorationShop2Menu(u16 *itemList) } #if DEBUG -__attribute__((naked)) + void debug_sub_80C2818(void) { - asm("\ - push {lr}\n\ - mov r0, #0x0\n\ - bl CreateShopMenu\n\ - ldr r0, ._290 @ gMartBuyNoSellOptionList\n\ - bl SetShopItemsForSale\n\ - mov r0, #0x0\n\ - bl SetShopMenuCallback\n\ - pop {r0}\n\ - bx r0\n\ -._291:\n\ - .align 2, 0\n\ -._290:\n\ - .word gMartBuyNoSellOptionList+0x3"); + CreateShopMenu(MART_TYPE_0); + SetShopItemsForSale(gUnusedMartArray); + SetShopMenuCallback(NULL); } + #endif diff --git a/src/field/start_menu.c b/src/field/start_menu.c index 4904f4a80..8a182aaf4 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle_tower.h" #include "start_menu.h" #include "event_data.h" #include "field_map_obj_helpers.h" @@ -7,9 +8,11 @@ #include "fieldmap.h" #include "item_menu.h" #include "load_save.h" +#include "m4a.h" #include "main.h" #include "map_obj_lock.h" #include "menu.h" +#include "new_game.h" #include "option_menu.h" #include "palette.h" #include "pokedex.h" @@ -138,302 +141,105 @@ static void sub_8071B54(void); static void Task_8071B64(u8 taskId); #if DEBUG -__attribute__((naked)) -void debug_sub_8075C30() + +void debug_sub_8075D9C(void); + +u8 debug_sub_8075C30(void) { - asm( - " push {lr}\n" - " bl CloseMenu\n" - " bl debug_sub_8075D9C\n" - " mov r0, #0x1\n" - " pop {r1}\n" - " bx r1\n" - "\n" - ); + CloseMenu(); + debug_sub_8075D9C(); + return 1; } -__attribute__((naked)) -void debug_sub_8075C40() +extern const u8 gUnknown_Debug_839B6D8[]; + +void debug_sub_8075C40(u8 taskId) { - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " lsl r0, r4, #0x2\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x3\n" - " ldr r1, ._5 @ gTasks\n" - " add r5, r0, r1\n" - " mov r1, #0x0\n" - " ldsh r0, [r5, r1]\n" - " cmp r0, #0x1\n" - " beq ._1 @cond_branch\n" - " cmp r0, #0x1\n" - " bgt ._2 @cond_branch\n" - " cmp r0, #0\n" - " beq ._3 @cond_branch\n" - " b ._18\n" - "._6:\n" - " .align 2, 0\n" - "._5:\n" - " .word gTasks+0x8\n" - "._2:\n" - " cmp r0, #0x2\n" - " beq ._7 @cond_branch\n" - " cmp r0, #0x3\n" - " beq ._8 @cond_branch\n" - " b ._18\n" - "._3:\n" - " bl m4aSoundVSyncOff\n" - " b ._12\n" - "._1:\n" - " ldr r1, ._13 @ 0x4000208\n" - " ldrh r0, [r1]\n" - " mov sl, r0\n" - " mov r0, #0x0\n" - " strh r0, [r1]\n" - " ldr r1, ._13 + 4 @ 0x4000108\n" - " strh r0, [r1]\n" - " mov r0, #0x83\n" - " lsl r0, r0, #0x10\n" - " str r0, [r1]\n" - " ldr r4, ._13 + 8 @ 0xc34f\n" - " mov r9, r4\n" - " ldr r2, ._13 + 12 @ 0x40000b0\n" - " ldr r0, ._13 + 16 @ gScanlineEffectRegBuffers\n" - " mov ip, r0\n" - " ldr r1, ._13 + 20 @ 0xc5ff\n" - " mov r8, r1\n" - " ldr r7, ._13 + 24 @ 0x7fff\n" - " mov r3, r9\n" - " add r3, r3, #0x1\n" - " ldr r6, ._13 + 28 @ 0x4000040\n" - " ldr r4, ._13 + 32 @ 0xa2600001\n" - "._11:\n" - " mov r0, ip\n" - " str r0, [r2]\n" - " str r6, [r2, #0x4]\n" - " str r4, [r2, #0x8]\n" - " ldr r0, [r2, #0x8]\n" - " ldrh r1, [r2, #0xa]\n" - " mov r0, r8\n" - " and r0, r0, r1\n" - " strh r0, [r2, #0xa]\n" - " ldrh r1, [r2, #0xa]\n" - " add r0, r7, #0\n" - " and r0, r0, r1\n" - " strh r0, [r2, #0xa]\n" - " ldrh r0, [r2, #0xa]\n" - " sub r3, r3, #0x1\n" - " cmp r3, #0\n" - " bne ._11 @cond_branch\n" - " mov r3, r9\n" - " add r3, r3, #0x1\n" - " ldr r0, ._13 + 36 @ 0x400010a\n" - " mov r2, #0x0\n" - " strh r2, [r0]\n" - " ldr r1, ._13 + 4 @ 0x4000108\n" - " ldrh r0, [r1]\n" - " ldr r4, ._13 + 40 @ _debugStartMenu_0\n" - " str r0, [r4]\n" - " strh r2, [r1]\n" - " ldr r0, ._13 @ 0x4000208\n" - " mov r1, sl\n" - " strh r1, [r0]\n" - " ldr r4, ._13 + 44 @ _debugStartMenu_1\n" - " str r3, [r4]\n" - " bl m4aSoundVSyncOn\n" - " b ._12\n" - "._14:\n" - " .align 2, 0\n" - "._13:\n" - " .word 0x4000208\n" - " .word 0x4000108\n" - " .word 0xc34f\n" - " .word 0x40000b0\n" - " .word gScanlineEffectRegBuffers\n" - " .word 0xc5ff\n" - " .word 0x7fff\n" - " .word 0x4000040\n" - " .word 0xa2600001\n" - " .word 0x400010a\n" - " .word _debugStartMenu_0\n" - " .word _debugStartMenu_1\n" - "._7:\n" - " mov r0, #0x15\n" - " bl PlaySE\n" - " ldr r0, ._16 @ gStringVar1\n" - " ldr r1, ._16 + 4 @ _debugStartMenu_1\n" - " ldr r1, [r1]\n" - " mov r2, #0x1\n" - " mov r3, #0x8\n" - " bl ConvertIntToDecimalStringN\n" - " ldr r0, ._16 + 8 @ gStringVar2\n" - " ldr r1, ._16 + 12 @ _debugStartMenu_0\n" - " ldr r1, [r1]\n" - " mov r2, #0x1\n" - " mov r3, #0x8\n" - " bl ConvertIntToDecimalStringN\n" - " bl Menu_DisplayDialogueFrame\n" - " ldr r0, ._16 + 16 @ gUnknown_Debug_839B6D8\n" - " mov r1, #0x2\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - "._12:\n" - " ldrh r0, [r5]\n" - " add r0, r0, #0x1\n" - " strh r0, [r5]\n" - " b ._18\n" - "._17:\n" - " .align 2, 0\n" - "._16:\n" - " .word gStringVar1\n" - " .word _debugStartMenu_1\n" - " .word gStringVar2\n" - " .word _debugStartMenu_0\n" - " .word gUnknown_Debug_839B6D8\n" - "._8:\n" - " ldr r0, ._19 @ gMain\n" - " ldrh r1, [r0, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._18 @cond_branch\n" - " bl Menu_EraseScreen\n" - " bl ScriptContext2_Disable\n" - " add r0, r4, #0\n" - " bl DestroyTask\n" - "._18:\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._20:\n" - " .align 2, 0\n" - "._19:\n" - " .word gMain\n" - "\n" - ); + s16 *data = gTasks[taskId].data; + u16 savedIme; + s32 i; + + switch (data[0]) + { + case 0: + m4aSoundVSyncOff(); + data[0]++; + break; + case 1: + savedIme = REG_IME; + REG_IME = 0; + REG_TM2CNT_L = 0; + REG_TM2CNT = 0x830000; + for (i = 0; i < 0xC350; i++) + { + DmaSet( + 0, + gScanlineEffectRegBuffers, + ®_WIN0H, + ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) | 1); + DmaStop(0); + } + REG_TM2CNT_H = 0; + _debugStartMenu_0 = REG_TM2CNT_L; + REG_TM2CNT_L = 0; + REG_IME = savedIme; + _debugStartMenu_1 = i; + m4aSoundVSyncOn(); + data[0]++; + break; + case 2: + PlaySE(0x15); + ConvertIntToDecimalStringN(gStringVar1, _debugStartMenu_1, 1, 8); + ConvertIntToDecimalStringN(gStringVar2, _debugStartMenu_0, 1, 8); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gUnknown_Debug_839B6D8, 2, 15); + data[0]++; + break; + case 3: + if (gMain.newKeys & A_BUTTON) + { + Menu_EraseScreen(); + ScriptContext2_Disable(); + DestroyTask(taskId); + } + break; + } } -__attribute__((naked)) -void debug_sub_8075D9C() +void debug_sub_8075D9C(void) { - asm( - " push {lr}\n" - " ldr r0, ._21 @ debug_sub_8075C40\n" - " mov r1, #0xa\n" - " bl CreateTask\n" - " bl ScriptContext2_Enable\n" - " pop {r0}\n" - " bx r0\n" - "._22:\n" - " .align 2, 0\n" - "._21:\n" - " .word debug_sub_8075C40+1\n" - "\n" - ); + CreateTask(debug_sub_8075C40, 10); + ScriptContext2_Enable(); } -__attribute__((naked)) -void debug_sub_8075DB4() +void debug_sub_8075DB4(struct BattleTowerEReaderTrainer *ereaderTrainer, const u8 *b, u32 trainerId) { - asm( - " push {r4, r5, r6, lr}\n" - " add r6, r0, #0\n" - " add r5, r1, #0\n" - " add r4, r2, #0\n" - " add r0, r4, #0\n" - " mov r1, #0x4d\n" - " bl __umodsi3\n" - " strb r0, [r6, #0x1]\n" - " add r1, r6, #0\n" - " add r1, r1, #0xc\n" - " add r0, r4, #0\n" - " bl write_word_to_mem\n" - " add r0, r6, #4\n" - " add r1, r5, #0\n" - " bl StringCopy8\n" - " mov r3, #0x7\n" - " mov r4, #0x0\n" - " ldr r0, ._25 @ gSaveBlock1\n" - " ldr r1, ._25 + 4 @ 0x2b28\n" - " add r5, r0, r1\n" - " add r2, r6, #0\n" - " add r2, r2, #0x10\n" - " add r1, r6, #0\n" - " add r1, r1, #0x1c\n" - "._23:\n" - " ldrh r0, [r5]\n" - " strh r0, [r2]\n" - " strh r3, [r1]\n" - " add r0, r3, #6\n" - " strh r0, [r1, #0xc]\n" - " add r3, r3, #0x1\n" - " add r5, r5, #0x2\n" - " add r2, r2, #0x2\n" - " add r1, r1, #0x2\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x5\n" - " ble ._23 @cond_branch\n" - " mov r4, #0x0\n" - "._24:\n" - " mov r0, #0x64\n" - " mul r0, r0, r4\n" - " ldr r1, ._25 + 8 @ gPlayerParty\n" - " add r0, r0, r1\n" - " mov r1, #0x2c\n" - " mul r1, r1, r4\n" - " add r1, r1, #0x34\n" - " add r1, r6, r1\n" - " bl sub_803AF78\n" - " add r4, r4, #0x1\n" - " cmp r4, #0x2\n" - " ble ._24 @cond_branch\n" - " add r0, r6, #0\n" - " bl SetEReaderTrainerChecksum\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._26:\n" - " .align 2, 0\n" - "._25:\n" - " .word gSaveBlock1\n" - " .word 0x2b28\n" - " .word gPlayerParty\n" - "\n" - ); + s32 i; + s32 r3; + + ereaderTrainer->trainerClass = trainerId % 77; + write_word_to_mem(trainerId, ereaderTrainer->trainerId); + StringCopy8(ereaderTrainer->name, b); + r3 = 7; + for (i = 0; i < 6; i++) + { + ereaderTrainer->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; + ereaderTrainer->farewellPlayerLost[i] = r3; + ereaderTrainer->farewellPlayerWon[i] = r3 + 6; + r3++; + } + for (i = 0; i < 3; i++) + sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]); + SetEReaderTrainerChecksum(ereaderTrainer); } -__attribute__((naked)) -void unref_sub_8070F90() +void unref_sub_8070F90(void) { - asm( - " push {lr}\n" - " ldr r0, ._27 @ 0x801\n" - " bl FlagSet\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x4\n" - " bl FlagSet\n" - " ldr r0, ._27 + 4 @ 0x802\n" - " bl FlagSet\n" - " pop {r0}\n" - " bx r0\n" - "._28:\n" - " .align 2, 0\n" - "._27:\n" - " .word 0x801\n" - " .word 0x802\n" - "\n" - ); + FlagSet(FLAG_SYS_POKEDEX_GET); + FlagSet(FLAG_SYS_POKEMON_GET); + FlagSet(FLAG_SYS_POKENAV_GET); } + #endif static void BuildStartMenuActions(void) -- cgit v1.2.3 From 17a5968adbc1dfb6586641729b39eeb3873481df Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sat, 17 Feb 2018 17:30:31 -0600 Subject: decompile more debug code --- src/engine/mystery_event_menu.c | 546 +++++++++------------------------------ src/field/battle_tower.c | 129 ++++------ src/field/item_menu.c | 552 ++++------------------------------------ 3 files changed, 207 insertions(+), 1020 deletions(-) (limited to 'src') diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c index bc14c760d..56801ff53 100644 --- a/src/engine/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c @@ -13,6 +13,7 @@ #include "strings2.h" #include "task.h" #include "text.h" +#include "title_screen.h" #include "ewram.h" static EWRAM_DATA u8 gUnknown_02039338 = 0; @@ -341,151 +342,51 @@ static void CB2_MysteryEventMenu(void) #if DEBUG +static const u8 Str_843DA70[] = _("CARDーE emulation。。。"); +static const u8 Str_843DA84[] = _("LR: select A: send。"); +static const u8 Str_843DA98[] = _("sending。。。"); +static const u8 Str_843DAA3[] = _("completed。"); + +extern const struct {const u8 *text; void (*func)();} gUnknown_Debug_842E2D0[]; +extern const u8 gUnknown_Debug_842E350; + void debug_sub_815D1D8(); -__attribute__((naked)) -void debug_sub_815D04C() +void debug_sub_815D04C(u8 taskId) { - asm( - " push {r4, r5, r6, lr}\n" - " lsl r0, r0, #0x18\n" - " lsr r5, r0, #0x18\n" - " ldr r1, ._125 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r4, r0, r1\n" - " mov r1, #0x8\n" - " ldsh r0, [r4, r1]\n" - " cmp r0, #0\n" - " bne ._121 @cond_branch\n" - " mov r0, #0x4\n" - " mov r1, #0x4\n" - " mov r2, #0xd\n" - " mov r3, #0x7\n" - " bl Menu_DrawStdWindowFrame\n" - " ldr r1, ._125 + 4 @ gUnknown_Debug_842E2D0\n" - " mov r2, #0xa\n" - " ldsh r0, [r4, r2]\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov r1, #0x5\n" - " mov r2, #0x5\n" - " bl Menu_PrintText\n" - " ldrh r0, [r4, #0x8]\n" - " add r0, r0, #0x1\n" - " strh r0, [r4, #0x8]\n" - "._121:\n" - " ldr r2, ._125 + 8 @ gMain\n" - " ldrh r1, [r2, #0x2e]\n" - " mov r0, #0x20\n" - " and r0, r0, r1\n" - " add r6, r2, #0\n" - " cmp r0, #0\n" - " beq ._122 @cond_branch\n" - " ldrh r1, [r4, #0xa]\n" - " mov r2, #0xa\n" - " ldsh r0, [r4, r2]\n" - " cmp r0, #0\n" - " bne ._123 @cond_branch\n" - " ldr r0, ._125 + 12 @ gUnknown_Debug_842E350\n" - " ldrb r0, [r0]\n" - " sub r0, r0, #0x1\n" - " b ._124\n" - "._126:\n" - " .align 2, 0\n" - "._125:\n" - " .word gTasks\n" - " .word gUnknown_Debug_842E2D0\n" - " .word gMain\n" - " .word gUnknown_Debug_842E350\n" - "._123:\n" - " sub r0, r1, #1\n" - "._124:\n" - " strh r0, [r4, #0xa]\n" - " ldr r0, ._130 @ gTasks\n" - " lsl r1, r5, #0x2\n" - " add r1, r1, r5\n" - " lsl r1, r1, #0x3\n" - " add r1, r1, r0\n" - " mov r0, #0x0\n" - " strh r0, [r1, #0x8]\n" - "._122:\n" - " ldrh r1, [r6, #0x2e]\n" - " mov r0, #0x10\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._127 @cond_branch\n" - " ldr r1, ._130 @ gTasks\n" - " lsl r2, r5, #0x2\n" - " add r0, r2, r5\n" - " lsl r0, r0, #0x3\n" - " add r4, r0, r1\n" - " mov r0, #0xa\n" - " ldsh r3, [r4, r0]\n" - " ldr r0, ._130 + 4 @ gUnknown_Debug_842E350\n" - " ldrb r0, [r0]\n" - " sub r0, r0, #0x1\n" - " cmp r3, r0\n" - " bne ._128 @cond_branch\n" - " mov r0, #0x0\n" - " b ._129\n" - "._131:\n" - " .align 2, 0\n" - "._130:\n" - " .word gTasks\n" - " .word gUnknown_Debug_842E350\n" - "._128:\n" - " ldrh r0, [r4, #0xa]\n" - " add r0, r0, #0x1\n" - "._129:\n" - " strh r0, [r4, #0xa]\n" - " add r0, r2, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r1, #0x0\n" - " strh r1, [r0, #0x8]\n" - "._127:\n" - " ldrh r1, [r6, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._132 @cond_branch\n" - " ldr r1, ._133 @ gTasks\n" - " lsl r0, r5, #0x2\n" - " add r0, r0, r5\n" - " lsl r0, r0, #0x3\n" - " add r0, r0, r1\n" - " mov r2, #0xa\n" - " ldsh r1, [r0, r2]\n" - " lsl r1, r1, #0x3\n" - " ldr r0, ._133 + 4 @ gUnknown_Debug_842E2D0\n" - " add r0, r0, #0x4\n" - " add r1, r1, r0\n" - " ldr r0, ._133 + 8 @ \n" - " ldr r1, [r1]\n" - " bl _call_via_r1\n" - " ldr r0, ._133 + 12 @ \n" - " add r1, r6, r0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " add r0, r5, #0\n" - " bl DestroyTask\n" - "._132:\n" - " pop {r4, r5, r6}\n" - " pop {r0}\n" - " bx r0\n" - "._134:\n" - " .align 2, 0\n" - "._133:\n" - " .word gTasks\n" - " .word gUnknown_Debug_842E2D0\n" - " .word +0x2004000\n" - " .word 0x43c\n" - "\n" - ); + if (gTasks[taskId].data[0] == 0) + { + Menu_DrawStdWindowFrame(4, 4, 13, 7); + Menu_PrintText(gUnknown_Debug_842E2D0[gTasks[taskId].data[1]].text, 5, 5); + gTasks[taskId].data[0]++; + } + + if (gMain.newKeys & 0x20) + { + if (gTasks[taskId].data[1] == 0) + gTasks[taskId].data[1] = gUnknown_Debug_842E350 - 1; + else + gTasks[taskId].data[1]--; + gTasks[taskId].data[0] = 0; + } + if (gMain.newKeys & 0x10) + { + if (gTasks[taskId].data[1] == gUnknown_Debug_842E350 - 1) + gTasks[taskId].data[1] = 0; + else + gTasks[taskId].data[1]++; + gTasks[taskId].data[0] = 0; + } + if (gMain.newKeys & A_BUTTON) + { + // TODO: fix this + s32 var = gTasks[taskId].data[1]; + asm(""::"r"(var * 8)); + gUnknown_Debug_842E2D0[var].func(gSharedMem + 0x4000); + + gMain.state++; + DestroyTask(taskId); + } } void debug_sub_815D15C(void) @@ -510,291 +411,84 @@ void debug_sub_815D15C(void) SetMainCallback2(debug_sub_815D1D8); } -__attribute__((naked)) -void debug_sub_815D1D8() +void debug_sub_815D1D8(void) { - asm( - " push {r4, lr}\n" - " add sp, sp, #0xfffffffc\n" - " ldr r1, ._139 @ gMain\n" - " ldr r2, ._139 + 4 @ 0x43c\n" - " add r0, r1, r2\n" - " ldrb r0, [r0]\n" - " add r4, r1, #0\n" - " cmp r0, #0xb\n" - " bls ._137 @cond_branch\n" - " b ._196\n" - "._137:\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._139 + 8 @ \n" - " add r0, r0, r1\n" - " ldr r0, [r0]\n" - " mov pc, r0\n" - "._140:\n" - " .align 2, 0\n" - "._139:\n" - " .word gMain\n" - " .word 0x43c\n" - " .word ._141\n" - "._141:\n" - " .word ._142\n" - " .word ._143\n" - " .word ._144\n" - " .word ._145\n" - " .word ._146\n" - " .word ._196\n" - " .word ._148\n" - " .word ._149\n" - " .word ._150\n" - " .word ._151\n" - " .word ._152\n" - " .word ._153\n" - "._142:\n" - " mov r0, #0x3\n" - " mov r1, #0xe\n" - " mov r2, #0x1b\n" - " mov r3, #0x13\n" - " bl Menu_DrawStdWindowFrame\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x10\n" - " mov r3, #0x0\n" - " bl BeginNormalPaletteFade\n" - " ldr r1, ._155 @ gMain\n" - " ldr r0, ._155 + 4 @ 0x43c\n" - " add r1, r1, r0\n" - " b ._189\n" - "._156:\n" - " .align 2, 0\n" - "._155:\n" - " .word gMain\n" - " .word 0x43c\n" - "._143:\n" - " ldr r0, ._161 @ gPaletteFade\n" - " ldrb r1, [r0, #0x7]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._157 @cond_branch\n" - " b ._196\n" - "._157:\n" - " ldrh r1, [r4, #0x2c]\n" - " mov r0, #0x80\n" - " lsl r0, r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._159 @cond_branch\n" - " ldr r1, ._161 + 4 @ gUnknown_Debug_30030E0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - "._159:\n" - " ldr r0, ._161 + 8 @ Str_843DA70\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl MenuPrintMessage\n" - " ldr r2, ._161 + 12 @ 0x43c\n" - " add r1, r4, r2\n" - " b ._189\n" - "._162:\n" - " .align 2, 0\n" - "._161:\n" - " .word gPaletteFade\n" - " .word gUnknown_Debug_30030E0\n" - " .word Str_843DA70\n" - " .word 0x43c\n" - "._144:\n" - " bl Menu_UpdateWindowText\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._163 @cond_branch\n" - " b ._196\n" - "._163:\n" - " ldr r1, ._166 @ gMain\n" - " ldr r0, ._166 + 4 @ 0x43c\n" - " add r1, r1, r0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r1, ._166 + 8 @ gLinkType\n" - " ldr r2, ._166 + 12 @ 0x5501\n" - " add r0, r2, #0\n" - " strh r0, [r1]\n" - " bl OpenLink\n" - " b ._196\n" - "._167:\n" - " .align 2, 0\n" - "._166:\n" - " .word gMain\n" - " .word 0x43c\n" - " .word gLinkType\n" - " .word 0x5501\n" - "._145:\n" - " ldr r0, ._171 @ gReceivedRemoteLinkPlayers\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " bne ._168 @cond_branch\n" - " b ._196\n" - "._168:\n" - " ldr r1, ._171 + 4 @ 0x43c\n" - " add r0, r4, r1\n" - " ldrb r1, [r0]\n" - " add r1, r1, #0x1\n" - " strb r1, [r0]\n" - " ldr r0, ._171 + 8 @ Str_843DA84\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl MenuPrintMessage\n" - " b ._196\n" - "._172:\n" - " .align 2, 0\n" - "._171:\n" - " .word gReceivedRemoteLinkPlayers\n" - " .word 0x43c\n" - " .word Str_843DA84\n" - "._146:\n" - " bl Menu_UpdateWindowText\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " bne ._173 @cond_branch\n" - " b ._196\n" - "._173:\n" - " ldr r0, ._176 @ debug_sub_815D04C\n" - " mov r1, #0xa\n" - " bl CreateTask\n" - " ldr r1, ._176 + 4 @ gMain\n" - " ldr r2, ._176 + 8 @ 0x43c\n" - " add r1, r1, r2\n" - " b ._189\n" - "._177:\n" - " .align 2, 0\n" - "._176:\n" - " .word debug_sub_815D04C+1\n" - " .word gMain\n" - " .word 0x43c\n" - "._148:\n" - " ldr r0, ._179 @ Str_843DA98\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl MenuPrintMessage\n" - " ldr r1, ._179 + 4 @ 0x2004000\n" - " ldr r2, ._179 + 8 @ 0x2004\n" - " mov r0, #0x0\n" - " bl SendBlock\n" - " ldr r1, ._179 + 12 @ gMain\n" - " ldr r0, ._179 + 16 @ 0x43c\n" - " add r1, r1, r0\n" - " b ._189\n" - "._180:\n" - " .align 2, 0\n" - "._179:\n" - " .word Str_843DA98\n" - " .word 0x2004000\n" - " .word 0x2004\n" - " .word gMain\n" - " .word 0x43c\n" - "._149:\n" - " bl Menu_UpdateWindowText\n" - " bl IsLinkTaskFinished\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._196 @cond_branch\n" - " ldr r1, ._183 @ gMain\n" - " ldr r2, ._183 + 4 @ 0x43c\n" - " add r1, r1, r2\n" - " b ._189\n" - "._184:\n" - " .align 2, 0\n" - "._183:\n" - " .word gMain\n" - " .word 0x43c\n" - "._150:\n" - " bl sub_800832C\n" - " ldr r1, ._186 @ gMain\n" - " ldr r0, ._186 + 4 @ 0x43c\n" - " add r1, r1, r0\n" - " b ._189\n" - "._187:\n" - " .align 2, 0\n" - "._186:\n" - " .word gMain\n" - " .word 0x43c\n" - "._151:\n" - " ldr r0, ._190 @ gReceivedRemoteLinkPlayers\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " bne ._196 @cond_branch\n" - " mov r0, #0x4\n" - " mov r1, #0xf\n" - " mov r2, #0x1a\n" - " mov r3, #0x12\n" - " bl Menu_BlankWindowRect\n" - " ldr r0, ._190 + 4 @ Str_843DAA3\n" - " mov r1, #0x4\n" - " mov r2, #0xf\n" - " bl Menu_PrintText\n" - " ldr r1, ._190 + 8 @ gMain\n" - " ldr r2, ._190 + 12 @ 0x43c\n" - " add r1, r1, r2\n" - " b ._189\n" - "._191:\n" - " .align 2, 0\n" - "._190:\n" - " .word gReceivedRemoteLinkPlayers\n" - " .word Str_843DAA3\n" - " .word gMain\n" - " .word 0x43c\n" - "._152:\n" - " ldrh r1, [r4, #0x2e]\n" - " mov r0, #0x1\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " beq ._196 @cond_branch\n" - " mov r0, #0x1\n" - " neg r0, r0\n" - " mov r1, #0x0\n" - " str r1, [sp]\n" - " mov r2, #0x0\n" - " mov r3, #0x10\n" - " bl BeginNormalPaletteFade\n" - " ldr r0, ._194 @ 0x43c\n" - " add r1, r4, r0\n" - "._189:\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " b ._196\n" - "._195:\n" - " .align 2, 0\n" - "._194:\n" - " .word 0x43c\n" - "._153:\n" - " ldr r0, ._197 @ gPaletteFade\n" - " ldrb r1, [r0, #0x7]\n" - " mov r0, #0x80\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._196 @cond_branch\n" - " ldr r0, ._197 + 4 @ CB2_InitTitleScreen\n" - " bl SetMainCallback2\n" - "._196:\n" - " bl RunTasks\n" - " bl AnimateSprites\n" - " bl BuildOamBuffer\n" - " bl UpdatePaletteFade\n" - " add sp, sp, #0x4\n" - " pop {r4}\n" - " pop {r0}\n" - " bx r0\n" - "._198:\n" - " .align 2, 0\n" - "._197:\n" - " .word gPaletteFade\n" - " .word CB2_InitTitleScreen+1\n" - "\n" - ); + switch (gMain.state) + { + case 0: + Menu_DrawStdWindowFrame(3, 14, 27, 19); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + gMain.state++; + break; + case 1: + if (!gPaletteFade.active) + { + if (gMain.heldKeys & 0x100) + gUnknown_Debug_30030E0++; + MenuPrintMessage(Str_843DA70, 4, 15); + gMain.state++; + } + break; + case 2: + if (Menu_UpdateWindowText()) + { + gMain.state++; + gLinkType = 0x5501; + OpenLink(); + } + break; + case 3: + if (gReceivedRemoteLinkPlayers != 0) + { + gMain.state++; + MenuPrintMessage(Str_843DA84, 4, 15); + } + break; + case 4: + if (Menu_UpdateWindowText()) + { + CreateTask(debug_sub_815D04C, 10); + gMain.state++; + } + break; + case 6: + MenuPrintMessage(Str_843DA98, 4, 15); + SendBlock(0, gSharedMem + 0x4000, 0x2004); + gMain.state++; + break; + case 7: + Menu_UpdateWindowText(); + if (IsLinkTaskFinished()) + gMain.state++; + break; + case 8: + sub_800832C(); + gMain.state++; + break; + case 9: + if (gReceivedRemoteLinkPlayers == 0) + { + Menu_BlankWindowRect(4, 15, 26, 18); + Menu_PrintText(Str_843DAA3, 4, 15); + gMain.state++; + } + break; + case 10: + if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMain.state++; + } + break; + case 11: + if (!gPaletteFade.active) + SetMainCallback2(CB2_InitTitleScreen); + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); } #endif diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c index 1853abbee..8d8498d45 100644 --- a/src/field/battle_tower.c +++ b/src/field/battle_tower.c @@ -33,7 +33,8 @@ #include "../data/battle_tower/trainers_de.h" #endif -static const u16 sBattleTowerHeldItems[] = { +static const u16 sBattleTowerHeldItems[] = +{ ITEM_NONE, ITEM_KINGS_ROCK, ITEM_SITRUS_BERRY, @@ -102,7 +103,8 @@ static const u16 sBattleTowerHeldItems[] = { #include "../data/battle_tower/level_50_mons.h" #include "../data/battle_tower/level_100_mons.h" -static const u8 sMaleTrainerClasses[] = { +static const u8 sMaleTrainerClasses[] = +{ FACILITY_CLASS_RUIN_MANIAC, FACILITY_CLASS_TUBER_M, FACILITY_CLASS_COOL_TRAINER_M, @@ -135,7 +137,8 @@ static const u8 sMaleTrainerClasses[] = { FACILITY_CLASS_HIKER, }; -static const u8 sFemaleTrainerClasses[] = { +static const u8 sFemaleTrainerClasses[] = +{ FACILITY_CLASS_AROMA_LADY, FACILITY_CLASS_TUBER_F, FACILITY_CLASS_COOL_TRAINER_F, @@ -158,7 +161,8 @@ static const u8 sFemaleTrainerClasses[] = { FACILITY_CLASS_LASS, }; -static const u8 sMaleTrainerGfxIds[] = { +static const u8 sMaleTrainerGfxIds[] = +{ MAP_OBJ_GFX_HIKER, MAP_OBJ_GFX_TUBER_M, MAP_OBJ_GFX_MAN_4, @@ -191,7 +195,8 @@ static const u8 sMaleTrainerGfxIds[] = { MAP_OBJ_GFX_HIKER, }; -static const u8 sFemaleTrainerGfxIds[] = { +static const u8 sFemaleTrainerGfxIds[] = +{ MAP_OBJ_GFX_WOMAN_3, MAP_OBJ_GFX_TUBER_F, MAP_OBJ_GFX_WOMAN_7, @@ -214,7 +219,8 @@ static const u8 sFemaleTrainerGfxIds[] = { MAP_OBJ_GFX_LASS, }; -const u16 gBattleTowerBannedSpecies[] = { +const u16 gBattleTowerBannedSpecies[] = +{ SPECIES_MEW, SPECIES_MEWTWO, SPECIES_HO_OH, @@ -229,7 +235,8 @@ const u16 gBattleTowerBannedSpecies[] = { }; // Item prizes for battle tower streaks of 5 or fewer sets. -/*static*/ const u16 sShortStreakPrizes[] = { +static const u16 sShortStreakPrizes[] = +{ ITEM_HP_UP, ITEM_PROTEIN, ITEM_IRON, @@ -239,7 +246,8 @@ const u16 gBattleTowerBannedSpecies[] = { }; // Item prizes for battle tower streaks of greater than 5 sets. -/*static*/ const u16 sLongStreakPrizes[] = { +static const u16 sLongStreakPrizes[] = +{ ITEM_BRIGHT_POWDER, ITEM_WHITE_HERB, ITEM_QUICK_CLAW, @@ -292,9 +300,7 @@ void sub_8134548(void) default: ResetBattleTowerStreak(levelType); if (!var1) - { VarSet(VAR_TEMP_0, 5); - } break; case 1: ResetBattleTowerStreak(levelType); @@ -320,10 +326,8 @@ void sub_8134548(void) } if ((gSaveBlock2.battleTower.var_4AE[0] == 3 || gSaveBlock2.battleTower.var_4AE[0] == 6) - && (gSaveBlock2.battleTower.var_4AE[1] == 3 || gSaveBlock2.battleTower.var_4AE[1] == 6)) - { + && (gSaveBlock2.battleTower.var_4AE[1] == 3 || gSaveBlock2.battleTower.var_4AE[1] == 6)) VarSet(VAR_TEMP_0, 5); - } ValidateBattleTowerRecordChecksums(); } @@ -350,23 +354,18 @@ bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak) ValidateEReaderTrainer(); if (gSpecialVar_Result != 0 || gSaveBlock2.battleTower.ereaderTrainer.winStreak != winStreak) - { return FALSE; - } - trainerTeamLevel = 50; if (levelType != 0) - { trainerTeamLevel = 100; - } + else + trainerTeamLevel = 50; for (i = 0; i < 3; i++) { monLevel = gSaveBlock2.battleTower.ereaderTrainer.party[i].level; if (gSaveBlock2.battleTower.ereaderTrainer.party[i].level != trainerTeamLevel) - { return FALSE; - } CheckMonBattleTowerBanlist( gSaveBlock2.battleTower.ereaderTrainer.party[i].species, @@ -379,7 +378,7 @@ bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak) &numValid); } - return numValid == 3; + return (numValid == 3); } bool8 sub_81346F4(void) @@ -408,6 +407,7 @@ bool8 sub_81346F4(void) struct BattleTowerRecord *record = &gSaveBlock2.battleTower.records[recordIndex]; u32 recordHasData = 0; u32 checksum = 0; + for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32) - 1; i++) { recordHasData |= ((u32 *)record)[i]; @@ -415,9 +415,9 @@ bool8 sub_81346F4(void) } if (gSaveBlock2.battleTower.records[recordIndex].winStreak == winStreak - && gSaveBlock2.battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType - && recordHasData - && gSaveBlock2.battleTower.records[recordIndex].checksum == checksum) + && gSaveBlock2.battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType + && recordHasData + && gSaveBlock2.battleTower.records[recordIndex].checksum == checksum) { trainerIds[numCandidates] = recordIndex; numCandidates++; @@ -784,19 +784,17 @@ void SetBattleTowerTrainerGfxId(u8 trainerIndex) u8 trainerClass; if (trainerIndex < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { trainerClass = gBattleTowerTrainers[trainerIndex].trainerClass; - } else if (trainerIndex < BATTLE_TOWER_EREADER_TRAINER_ID) - { trainerClass = gSaveBlock2.battleTower.records[trainerIndex - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; - } else - { trainerClass = gSaveBlock2.battleTower.ereaderTrainer.trainerClass; - } - for (i = 0; i < 30 && sMaleTrainerClasses[i] != trainerClass; i++); + for (i = 0; i < 30; i++) + { + if (sMaleTrainerClasses[i] == trainerClass) + break; + } if (i != 30) { u8 trainerObjectGfxId = sMaleTrainerGfxIds[i]; @@ -804,7 +802,11 @@ void SetBattleTowerTrainerGfxId(u8 trainerIndex) return; } - for (i = 0; i < 20 && sFemaleTrainerClasses[i] != trainerClass; i++); + for (i = 0; i < 20; i++) + { + if (sFemaleTrainerClasses[i] == trainerClass) + break; + } if (i != 20) { u8 trainerObjectGfxId = sFemaleTrainerGfxIds[i]; @@ -1143,33 +1145,21 @@ _08134C70: .4byte gSaveBlock2\n\ u8 get_trainer_class_pic_index(void) { if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; - } else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { return gTrainerClassToPicIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; - } else - { return gTrainerClassToPicIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; - } } u8 get_trainer_class_name_index(void) { if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; - } else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { return gTrainerClassToNameIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; - } else - { return gTrainerClassToNameIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; - } } void get_trainer_name(u8* dest) @@ -1179,26 +1169,20 @@ void get_trainer_name(u8* dest) if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) { for (i = 0; i < 7; i++) - { dest[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; - } } else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) { for (i = 0; i < 7; i++) - { dest[i] = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].name[i]; - } } else { for (i = 0; i < 7; i++) - { dest[i] = gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].name[i]; - } } - dest[i] = 0xFF; + dest[i] = EOS; } void FillBattleTowerTrainerParty(void) @@ -1266,10 +1250,7 @@ void FillBattleTowerTrainerParty(void) { // Load E-Reader trainer's party. for (partyIndex = 0; partyIndex < 3; partyIndex++) - { sub_803ADE8(&gEnemyParty[partyIndex], &gSaveBlock2.battleTower.ereaderTrainer.party[partyIndex]); - } - return; } else @@ -1281,7 +1262,6 @@ void FillBattleTowerTrainerParty(void) &gEnemyParty[partyIndex], &gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); } - return; } @@ -1329,10 +1309,8 @@ void FillBattleTowerTrainerParty(void) for (i = 0; i < partyIndex; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != 0 - && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) - { + && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) break; - } } if (i != partyIndex) @@ -1341,7 +1319,12 @@ void FillBattleTowerTrainerParty(void) // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary // because the species and held items were already checked directly above. Perhaps this // is leftover code before the logic for duplicate species and held items was added. - for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); + //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); + for (i = 0; i < partyIndex; i++) + { + if (chosenMonIndices[i] == battleMonIndex) + break; + } if (i != partyIndex) continue; @@ -1361,10 +1344,7 @@ void FillBattleTowerTrainerParty(void) { SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) - { - // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. - friendship = 0; - } + friendship = 0; // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. } SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); @@ -1385,9 +1365,7 @@ u32 CountBattleTowerBanlistCaught(void) for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) { if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleTowerBannedSpecies[i]), FLAG_GET_CAUGHT)) - { numCaught++; - } } return numCaught; @@ -1398,7 +1376,6 @@ u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numT if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { curIndexToAppend++; - switch (curIndexToAppend - 1) { case 0: @@ -1408,24 +1385,15 @@ u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numT case 8: case 10: if (numToAppend == curIndexToAppend) - { StringAppend(gStringVar1, BattleText_Format3); - } else if (numToAppend > curIndexToAppend) - { StringAppend(gStringVar1, BattleText_Format4); - } break; case 1: if (curIndexToAppend == numToAppend) - { StringAppend(gStringVar1, BattleText_Format3); - } else - { StringAppend(gStringVar1, BattleText_Format4); - } - StringAppend(gStringVar1, BattleText_Format7); break; case 3: @@ -1434,18 +1402,12 @@ u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numT case 9: default: if (curIndexToAppend == numToAppend) - { StringAppend(gStringVar1, BattleText_Format3); - } else - { StringAppend(gStringVar1, BattleText_Format4); - } - StringAppend(gStringVar1, BattleText_Format6); break; } - StringAppend(gStringVar1, gSpeciesNames[species]); } @@ -1463,7 +1425,7 @@ void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowe while (1) { if (gBattleTowerBannedSpecies[counter] == 0xFFFF) - goto EXIT2; // Couldn't get the code to match without this GOTO + break; if (gBattleTowerBannedSpecies[counter] == species) break; @@ -1474,7 +1436,6 @@ void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowe if (gBattleTowerBannedSpecies[counter] != 0xFFFF) return; - EXIT2: if (battleTowerLevelType == 0 && monLevel > 50) return; @@ -1527,9 +1488,7 @@ void CheckPartyBattleTowerBanlist(void) numBanlistCaught = CountBattleTowerBanlistCaught(); for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) - { counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter, numBanlistCaught); - } if (counter == 0) { diff --git a/src/field/item_menu.c b/src/field/item_menu.c index 9fa3fd6cb..05fd3be53 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -289,24 +289,6 @@ static void sub_80A6618(u8); const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618}; -#if DEBUG -const struct {u16 item; u8 unk;} gUnknown_Debug_083EBC68[12+48] = -{ - {ITEM_POKE_BALL, 10}, - {ITEM_ULTRA_BALL, 15}, - {ITEM_GREAT_BALL, 20}, - {ITEM_MASTER_BALL, 25}, - {ITEM_ACRO_BIKE, 1 }, - {ITEM_OLD_ROD, 1 }, - {ITEM_GOOD_ROD, 1 }, - {ITEM_SUPER_ROD, 1 }, - {ITEM_POKEBLOCK_CASE, 1 }, - {ITEM_WAILMER_PAIL, 1 }, - {ITEM_ITEMFINDER, 1 }, - {ITEM_NONE, 1 }, -}; -#endif - void sub_80A34E8(void); static bool8 LoadBagGraphicsMultistep(void); static void sub_80A362C(void); @@ -393,390 +375,6 @@ static void sub_80A3134(void) DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x6000), 0x800); } -#if DEBUG -__attribute__((naked)) -static bool8 SetupBagMultistep(void) -{ - asm("\ - push {r4, r5, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r0, ._5 @ gMain\n\ - ldr r1, ._5 + 4 @ 0x43c\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x10\n\ - bls ._3 @cond_branch\n\ - b ._66\n\ -._3:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._5 + 8 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._6:\n\ - .align 2, 0\n\ -._5:\n\ - .word gMain\n\ - .word 0x43c\n\ - .word ._7\n\ -._7:\n\ - .word ._8\n\ - .word ._9\n\ - .word ._10\n\ - .word ._11\n\ - .word ._12\n\ - .word ._13\n\ - .word ._14\n\ - .word ._15\n\ - .word ._16\n\ - .word ._17\n\ - .word ._18\n\ - .word ._19\n\ - .word ._20\n\ - .word ._21\n\ - .word ._22\n\ - .word ._23\n\ - .word ._24\n\ -._8:\n\ - bl ClearVideoCallbacks\n\ - bl sub_80A34E8\n\ - b ._61\n\ -._9:\n\ - bl ScanlineEffect_Stop\n\ - ldr r1, ._27 @ gMain\n\ - ldr r0, ._27 + 4 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._62\n\ -._28:\n\ - .align 2, 0\n\ -._27:\n\ - .word gMain\n\ - .word 0x43c\n\ -._10:\n\ - bl gpu_pal_allocator_reset__manage_upper_four\n\ - b ._61\n\ -._11:\n\ - bl ClearBGTilemapBuffers\n\ - ldr r0, ._31 @ \n\ - ldr r1, ._31 + 4 @ \n\ - add r0, r0, r1\n\ - mov r1, #0x0\n\ - strb r1, [r0]\n\ - b ._61\n\ -._32:\n\ - .align 2, 0\n\ -._31:\n\ - .word +0x2000000\n\ - .word 0x1ffff\n\ -._12:\n\ - bl ResetPaletteFade\n\ - ldr r2, ._34 @ gPaletteFade\n\ - ldrb r0, [r2, #0x8]\n\ - mov r1, #0x80\n\ - orr r0, r0, r1\n\ - strb r0, [r2, #0x8]\n\ - ldr r1, ._34 + 4 @ gMain\n\ - ldr r0, ._34 + 8 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._62\n\ -._35:\n\ - .align 2, 0\n\ -._34:\n\ - .word gPaletteFade\n\ - .word gMain\n\ - .word 0x43c\n\ -._13:\n\ - bl ResetSpriteData\n\ - b ._61\n\ -._14:\n\ - bl LoadBagGraphicsMultistep\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._37 @cond_branch\n\ - b ._66\n\ -._37:\n\ - ldr r1, ._40 @ gMain\n\ - ldr r0, ._40 + 4 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._62\n\ -._41:\n\ - .align 2, 0\n\ -._40:\n\ - .word gMain\n\ - .word 0x43c\n\ -._15:\n\ - ldr r0, ._43 @ gWindowTemplate_81E6DFC\n\ - bl Text_LoadWindowTemplate\n\ - b ._61\n\ -._44:\n\ - .align 2, 0\n\ -._43:\n\ - .word gWindowTemplate_81E6DFC\n\ -._16:\n\ - ldr r0, ._46 @ gWindowTemplate_81E6DFC\n\ - bl MultistepInitMenuWindowBegin\n\ - ldr r1, ._46 + 4 @ gMain\n\ - ldr r0, ._46 + 8 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._62\n\ -._47:\n\ - .align 2, 0\n\ -._46:\n\ - .word gWindowTemplate_81E6DFC\n\ - .word gMain\n\ - .word 0x43c\n\ -._17:\n\ - bl MultistepInitMenuWindowContinue\n\ - cmp r0, #0\n\ - bne ._48 @cond_branch\n\ - b ._66\n\ -._48:\n\ - b ._61\n\ -._18:\n\ - bl ClearVerticalScrollIndicatorPalettes\n\ - bl LoadScrollIndicatorPalette\n\ - mov r0, #0x0\n\ - mov r1, #0xac\n\ - mov r2, #0xc\n\ - bl CreateVerticalScrollIndicators\n\ - mov r0, #0x1\n\ - mov r1, #0xac\n\ - mov r2, #0x94\n\ - bl CreateVerticalScrollIndicators\n\ - mov r0, #0x2\n\ - mov r1, #0x1c\n\ - mov r2, #0x58\n\ - bl CreateVerticalScrollIndicators\n\ - mov r0, #0x3\n\ - mov r1, #0x64\n\ - mov r2, #0x58\n\ - bl CreateVerticalScrollIndicators\n\ - mov r0, #0x0\n\ - mov r1, #0x2\n\ - bl SetVerticalScrollIndicatorPriority\n\ - mov r0, #0x1\n\ - mov r1, #0x2\n\ - bl SetVerticalScrollIndicatorPriority\n\ - mov r0, #0x2\n\ - mov r1, #0x2\n\ - bl SetVerticalScrollIndicatorPriority\n\ - mov r0, #0x3\n\ - mov r1, #0x2\n\ - bl SetVerticalScrollIndicatorPriority\n\ - ldr r0, ._53 @ sReturnLocation\n\ - ldrb r0, [r0]\n\ - sub r0, r0, #0x4\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0x1\n\ - bhi ._51 @cond_branch\n\ - mov r0, #0x2\n\ - mov r1, #0x1\n\ - bl SetVerticalScrollIndicators\n\ - mov r0, #0x3\n\ - mov r1, #0x1\n\ - bl SetVerticalScrollIndicators\n\ -._51:\n\ - ldr r1, ._53 + 4 @ gMain\n\ - ldr r0, ._53 + 8 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._62\n\ -._54:\n\ - .align 2, 0\n\ -._53:\n\ - .word sReturnLocation\n\ - .word gMain\n\ - .word 0x43c\n\ -._19:\n\ - ldr r1, ._56 @ gUnknown_0203855A\n\ - mov r0, #0x10\n\ - strb r0, [r1]\n\ - ldr r4, ._56 + 4 @ gBGTilemapBuffers\n\ - ldr r5, ._56 + 8 @ sCurrentBagPocket\n\ - ldrb r1, [r5]\n\ - add r1, r1, #0x1\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x18\n\ - add r0, r4, #0\n\ - bl sub_80A39B8\n\ - ldrb r1, [r5]\n\ - add r0, r4, #0\n\ - bl DrawPocketIndicatorDots\n\ - bl UpdateAllBagPockets\n\ - ldr r4, ._56 + 12 @ gBagPockets\n\ - ldr r0, [r4, #0x10]\n\ - ldr r1, [r4, #0x14]\n\ - bl SortItemSlots\n\ - ldr r0, [r4, #0x18]\n\ - ldr r1, [r4, #0x1c]\n\ - bl SortItemSlots\n\ - bl sub_80A3D40\n\ - ldr r1, ._56 + 16 @ gCurrentBagPocketItemSlots\n\ - mov r0, #0x0\n\ - ldsb r0, [r5, r0]\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r4\n\ - ldr r0, [r0]\n\ - str r0, [r1]\n\ - bl sub_80A362C\n\ - b ._61\n\ -._57:\n\ - .align 2, 0\n\ -._56:\n\ - .word gUnknown_0203855A\n\ - .word gBGTilemapBuffers+0x1000\n\ - .word sCurrentBagPocket\n\ - .word gBagPockets\n\ - .word gCurrentBagPocketItemSlots\n\ -._20:\n\ - ldr r0, ._59 @ 0xffff\n\ - mov r1, #0x0\n\ - mov r2, #0x7\n\ - bl sub_80A48E8\n\ - ldr r1, ._59 + 4 @ gBagPocketScrollStates\n\ - ldr r4, ._59 + 8 @ sCurrentBagPocket\n\ - mov r0, #0x0\n\ - ldsb r0, [r4, r0]\n\ - lsl r0, r0, #0x2\n\ - add r0, r0, r1\n\ - ldrb r1, [r0, #0x1]\n\ - ldrb r0, [r0]\n\ - add r1, r1, r0\n\ - ldr r0, ._59 + 12 @ gCurrentBagPocketItemSlots\n\ - ldr r0, [r0]\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r0\n\ - mov r2, #0x0\n\ - ldsh r0, [r1, r2]\n\ - bl ItemListMenu_InitDescription\n\ - bl ItemListMenu_InitMenu\n\ - ldr r1, ._59 + 16 @ gUnknown_0203855B\n\ - ldrb r0, [r4]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - ldr r1, ._59 + 20 @ gUnknown_0203855C\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ - ldr r1, ._59 + 24 @ gMain\n\ - ldr r0, ._59 + 28 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._62\n\ -._60:\n\ - .align 2, 0\n\ -._59:\n\ - .word 0xffff\n\ - .word gBagPocketScrollStates\n\ - .word sCurrentBagPocket\n\ - .word gCurrentBagPocketItemSlots\n\ - .word gUnknown_0203855B\n\ - .word gUnknown_0203855C\n\ - .word gMain\n\ - .word 0x43c\n\ -._21:\n\ - bl CreateBagSprite\n\ - mov r0, #0x0\n\ - bl CreateBagPokeballSprite\n\ - bl sub_80A3740\n\ - b ._61\n\ -._22:\n\ - ldr r3, ._63 @ 0x4000208\n\ - ldrh r2, [r3]\n\ - mov r0, #0x0\n\ - strh r0, [r3]\n\ - ldr r4, ._63 + 4 @ 0x4000200\n\ - ldrh r0, [r4]\n\ - mov r1, #0x1\n\ - orr r0, r0, r1\n\ - strh r0, [r4]\n\ - strh r2, [r3]\n\ - ldr r2, ._63 + 8 @ 0x4000004\n\ - ldrh r0, [r2]\n\ - mov r1, #0x8\n\ - orr r0, r0, r1\n\ - strh r0, [r2]\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - mov r1, #0x0\n\ - str r1, [sp]\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginNormalPaletteFade\n\ - ldr r2, ._63 + 12 @ gPaletteFade\n\ - ldrb r1, [r2, #0x8]\n\ - mov r0, #0x7f\n\ - and r0, r0, r1\n\ - strb r0, [r2, #0x8]\n\ - ldr r1, ._63 + 16 @ gMain\n\ - ldr r0, ._63 + 20 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._62\n\ -._64:\n\ - .align 2, 0\n\ -._63:\n\ - .word 0x4000208\n\ - .word 0x4000200\n\ - .word 0x4000004\n\ - .word gPaletteFade\n\ - .word gMain\n\ - .word 0x43c\n\ -._23:\n\ - bl sub_8055870\n\ - cmp r0, #0x1\n\ - beq ._66 @cond_branch\n\ -._61:\n\ - ldr r1, ._67 @ gMain\n\ - ldr r2, ._67 + 4 @ 0x43c\n\ - add r1, r1, r2\n\ -._62:\n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - b ._66\n\ -._68:\n\ - .align 2, 0\n\ -._67:\n\ - .word gMain\n\ - .word 0x43c\n\ -._24:\n\ - ldr r0, ._71 @ sub_80A3134\n\ - bl SetVBlankCallback\n\ - ldr r0, ._71 + 4 @ sub_80A3118\n\ - bl SetMainCallback2\n\ - bl sub_80A751C\n\ - bl sub_80A7630\n\ - bl sub_80A770C\n\ - bl sub_80A7828\n\ - bl sub_80A78B8\n\ - ldr r0, ._71 + 8 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._69 @cond_branch\n\ - ldr r0, ._71 + 12 @ 0x600f5e0\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x8\n\ - ldr r2, ._71 + 16 @ 0x600f800\n\ - mov r3, #0x0\n\ - bl debug_sub_8008218\n\ -._69:\n\ - mov r0, #0x1\n\ - b ._70\n\ -._72:\n\ - .align 2, 0\n\ -._71:\n\ - .word sub_80A3134+1\n\ - .word sub_80A3118+1\n\ - .word gLinkOpen\n\ - .word 0x600f5e0\n\ - .word 0x600f800\n\ -._66:\n\ - mov r0, #0x0\n\ -._70:\n\ - add sp, sp, #0x4\n\ - pop {r4, r5}\n\ - pop {r1}\n\ - bx r1"); -} -#else static bool8 SetupBagMultistep(void) { u32 index; @@ -897,11 +495,14 @@ static bool8 SetupBagMultistep(void) sub_80A770C(); sub_80A7828(); sub_80A78B8(); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0xF5E0), (void *)0x8000, (void *)(VRAM + 0xF800), 0); +#endif return TRUE; } return FALSE; } -#endif static bool8 sub_80A34B4(void) { @@ -1029,76 +630,42 @@ void ClearBag(void) } #if DEBUG -__attribute__((naked)) -void debug_sub_80A3714() -{ - asm("\ - push {r4, r5, r6, lr}\n\ - add sp, sp, #0xfffffff4\n\ - mov r5, #0x0\n\ - ldr r2, ._138 @ gUnknown_Debug_083EBC68\n\ - mov r1, #0x0\n\ -._134:\n\ - lsl r0, r5, #0x1\n\ - add r0, r0, sp\n\ - strh r1, [r0]\n\ - add r0, r5, #1\n\ - lsl r0, r0, #0x10\n\ - lsr r5, r0, #0x10\n\ - cmp r5, #0x4\n\ - bls ._134 @cond_branch\n\ - mov r5, #0x0\n\ - ldrh r0, [r2]\n\ - cmp r0, #0\n\ - beq ._136 @cond_branch\n\ - add r6, r2, #0\n\ -._137:\n\ - lsl r4, r5, #0x2\n\ - add r4, r4, r6\n\ - ldrh r0, [r4]\n\ - bl ItemId_GetPocket\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x8\n\ - ldr r1, ._138 + 4 @ 0xffff0000\n\ - add r0, r0, r1\n\ - lsr r0, r0, #0x10\n\ - ldr r1, ._138 + 8 @ gBagPockets\n\ - lsl r2, r0, #0x3\n\ - add r2, r2, r1\n\ - lsl r0, r0, #0x1\n\ - mov r1, sp\n\ - add r3, r1, r0\n\ - ldrh r1, [r3]\n\ - ldr r0, [r2]\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r0\n\ - ldr r0, [r4]\n\ - str r0, [r1]\n\ - ldrh r0, [r3]\n\ - add r0, r0, #0x1\n\ - strh r0, [r3]\n\ - add r0, r5, #1\n\ - lsl r0, r0, #0x10\n\ - lsr r5, r0, #0x10\n\ - cmp r5, #0x3b\n\ - bhi ._136 @cond_branch\n\ - lsl r0, r5, #0x2\n\ - add r0, r0, r6\n\ - ldrh r0, [r0]\n\ - cmp r0, #0\n\ - bne ._137 @cond_branch\n\ -._136:\n\ - add sp, sp, #0xc\n\ - pop {r4, r5, r6}\n\ - pop {r0}\n\ - bx r0\n\ -._139:\n\ - .align 2, 0\n\ -._138:\n\ - .word gUnknown_Debug_083EBC68\n\ - .word 0xffff0000\n\ - .word gBagPockets"); + +const struct ItemSlot gUnknown_Debug_083EBC68[60] = +{ + {ITEM_POKE_BALL, 10}, + {ITEM_ULTRA_BALL, 15}, + {ITEM_GREAT_BALL, 20}, + {ITEM_MASTER_BALL, 25}, + {ITEM_ACRO_BIKE, 1 }, + {ITEM_OLD_ROD, 1 }, + {ITEM_GOOD_ROD, 1 }, + {ITEM_SUPER_ROD, 1 }, + {ITEM_POKEBLOCK_CASE, 1 }, + {ITEM_WAILMER_PAIL, 1 }, + {ITEM_ITEMFINDER, 1 }, + {ITEM_NONE, 1 }, +}; + +void debug_sub_80A3714(void) +{ + u16 arr[5]; + u16 i; + + for (i = 0; i < 5; i++) + arr[i] = 0; + for (i = 0; i < ARRAY_COUNT(gUnknown_Debug_083EBC68); i++) + { + u16 pocket; + + if (gUnknown_Debug_083EBC68[i].itemId == ITEM_NONE) + break; + pocket = ItemId_GetPocket(gUnknown_Debug_083EBC68[i].itemId) - 1; + gBagPockets[pocket].itemSlots[arr[pocket]] = gUnknown_Debug_083EBC68[i]; + arr[pocket]++; + } } + #endif static void sub_80A3740(void) @@ -4040,49 +3607,16 @@ static void sub_80A73FC(void) MenuCursor_Destroy814AD44(); } -#if DEBUG -__attribute__((naked)) -static void sub_80A740C(void) -{ - asm("\ - push {lr}\n\ - add sp, sp, #0xfffffffc\n\ - bl sub_80A75E4\n\ - bl sub_80A7768\n\ - bl sub_80A7420\n\ - ldr r0, ._931 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._930 @cond_branch\n\ - ldr r0, ._931 + 4 @ gLink\n\ - ldr r1, ._931 + 8 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x0\n\ - str r1, [sp]\n\ - mov r1, #0x1\n\ - mov r2, #0x1\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._930:\n\ - add sp, sp, #0x4\n\ - pop {r0}\n\ - bx r0\n\ -._932:\n\ - .align 2, 0\n\ -._931:\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else static void sub_80A740C(void) { sub_80A75E4(); sub_80A7768(); sub_80A7420(); -} +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 0); #endif +} static void sub_80A7420(void) { -- cgit v1.2.3 From 99befda409870bedc2120f3af0b84f3d6d55806b Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sat, 17 Feb 2018 17:54:53 -0600 Subject: remove unnecessary struct in battle tower data --- src/data/battle_tower/trainers.h | 2800 ++++++++++++++++------------------- src/data/battle_tower/trainers_de.h | 2800 ++++++++++++++++------------------- src/field/battle_tower.c | 6 +- 3 files changed, 2603 insertions(+), 3003 deletions(-) (limited to 'src') diff --git a/src/data/battle_tower/trainers.h b/src/data/battle_tower/trainers.h index ae204f8ea..4d555fbb0 100644 --- a/src/data/battle_tower/trainers.h +++ b/src/data/battle_tower/trainers.h @@ -1,1503 +1,1303 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = { - { - .trainerClass = FACILITY_CLASS_YOUNGSTER, - .name = _("ALVIN"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_READY, - EC_WORD_QUES, - EC_WORD_HERE_I_COME, - EC_WORD_EXCL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BIRD_KEEPER, - .name = _("DIRK"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_OKAY, - EC_WORD_I_AM, - EC_WORD_GOING, - EC_WORD_FOR, - EC_WORD_IT, - EC_WORD_EXCL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_LADY, - .name = _("CYBIL"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_YOU_RE, - EC_WORD_A, - EC_WORD_PUSHOVER, - EC_WORD_LET_S, - EC_WORD_GET, - EC_WORD_GOING, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BLACK_BELT, - .name = _("CHEN"), - .teamFlags = 0x05, - .greeting = { - .easyChat = { - EC_WORD_MY, - EC_WORD_SPIRIT, - EC_WORD_IS, - EC_WORD_ENOUGH, - EC_WORD_SNORT, - EC_WORD_ARRGH, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_NINJA_BOY, - .name = _("YOSHI"), - .teamFlags = 0x05, - .greeting = { - .easyChat = { - EC_WORD_GO, - EC_WORD_MY, - EC_WORD_POKEMON, - EC_WORD_FIGHT, - EC_WORD_THE, - EC_WORD_BATTLE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, - .name = _("TINA"), - .teamFlags = 0x0A, - .greeting = { - .easyChat = { - EC_WORD_STUDY, - EC_WORD_IS, - EC_WORD_BORING, - EC_WORD_LET_S, - EC_WORD_BATTLE, - EC_WORD_NOW, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BUG_MANIAC, - .name = _("COREY"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_HEY, - EC_WORD_I, - EC_WORD_WILL, - EC_MOVE2(TRANSFORM), - EC_WORD_FOR, - EC_MOVE(STRENGTH), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_FISHERMAN, - .name = _("GORDON"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_NEED, - EC_WORD_A, - EC_WORD_VACATION, - EC_WORD_RIGHT, - EC_WORD_NOW, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_TUBER_F, - .name = _("ANN"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_WE, - EC_WORD_ALL, - EC_WORD_ADORE, - EC_WORD_POKEMON, - EC_WORD_ABSOLUTELY, - EC_WORD_TRULY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEFAN_F, - .name = _("JULIA"), - .teamFlags = 0x42, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_A, - EC_WORD_CUTE, - EC_WORD_LADY, - EC_WORD_YES, - EC_WORD_I_AM, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GENTLEMAN, - .name = _("GREGORY"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_THINK, - EC_WORD_WE, - EC_WORD_SHOULD, - EC_WORD_START, - EC_WORD_TODAY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CAMPER, - .name = _("KEITH"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_YOU_RE, - EC_WORD_MY, - EC_WORD_FRIEND, - EC_WORD_FROM, - EC_WORD_NOW, - EC_WORD_ON, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, - .name = _("KENDRA"), - .teamFlags = 0x0A, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_MOVE(SWIFT), - EC_WORD_HOW, - EC_WORD_ABOUT, - EC_WORD_YOU, - EC_WORD_QUES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_HIKER, - .name = _("DEV"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_WAHAHAHA, - EC_WORD_I_AM, - EC_WORD_FEELING, - EC_WORD_LIKE, - EC_WORD_IT_S, - EC_MOVE2(PAY_DAY), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BATTLE_GIRL, - .name = _("CASSIE"), - .teamFlags = 0x0A, - .greeting = { - .easyChat = { - EC_WORD_YOU_RE, - EC_WORD_STRONG, - EC_WORD_AREN_T, - 0xFFFF, - EC_WORD_YOU, - EC_WORD_QUES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PSYCHIC_M, - .name = _("JULIAN"), - .teamFlags = 0x05, - .greeting = { - .easyChat = { - EC_WORD_FUFUFU, - 0xFFFF, - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_WORD_WIN, - EC_WORD_KID, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_LASS, - .name = _("JOYCE"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_BE, - EC_WORD_KIND, - EC_WORD_TO, - EC_WORD_THE, - EC_WORD_DIGITAL, - EC_WORD_IDOL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GUITARIST, - .name = _("LES"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_GREAT, - EC_WORD_YOU_RE, - EC_WORD_JUST, - EC_WORD_RATHER, - EC_WORD_OKAY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RICH_BOY, - .name = _("CLINTON"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_HAVE, - EC_WORD_ROUGH_SKIN, - EC_WORD_I, - EC_WORD_NEED, - EC_WORD_NATURAL_CURE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BUG_CATCHER, - .name = _("LEWIS"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_THIS, - EC_WORD_IS, - EC_WORD_EXCITING, - EC_WORD_CAN, - EC_WORD_I, - EC_WORD_WIN, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PICNICKER, - .name = _("RACHAEL"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_LIKE, - EC_WORD_WALKING, - EC_WORD_WITH, - EC_WORD_MY, - EC_WORD_POKEMON, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COLLECTOR, - .name = _("HAROLD"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_HERE, - EC_WORD_THEY, - EC_WORD_COME, - EC_WORD_MY, - EC_MOVE2(SUPERPOWER), - EC_WORD_POKEMON, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_TUBER_M, - .name = _("KIPP"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_A, - EC_WORD_GENIUS, - EC_WORD_I, - EC_WORD_SHOULD, - EC_WORD_WIN, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_KINDLER, - .name = _("IRWIN"), - .teamFlags = 0x05, - .greeting = { - .easyChat = { - EC_WORD_YOU, - EC_WORD_WILL, - EC_WORD_BE, - EC_WORD_FEELING, - EC_WORD_MY, - EC_WORD_FIRE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PSYCHIC_F, - .name = _("EILEEN"), - .teamFlags = 0x0A, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_WILL, - EC_MOVE(ASTONISH), - EC_WORD_YOU, - EC_WORD_IN, - EC_WORD_BATTLE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMER_F, - .name = _("ANNE"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_SORRY, - EC_WORD_BUT, - EC_WORD_YOU, - EC_WORD_WILL, - EC_WORD_NOT, - EC_WORD_WIN, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, - .name = _("RUTH"), - .teamFlags = 0x06, - .greeting = { - .easyChat = { - EC_WORD_A, - EC_WORD_STRONG, - EC_WORD_GIRL, - EC_WORD_WANTS, - EC_WORD_TOUGH, - EC_WORD_POKEMON, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMANIAC, - .name = _("JEREMY"), - .teamFlags = 0x40, - .greeting = { - .easyChat = { - EC_WORD_MY, - EC_WORD_POKEMON, - EC_WORD_ARE, - EC_WORD_COOL, - EC_WORD_YOURS, - EC_WORD_CAN_T_WIN, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SAILOR, - .name = _("TREVOR"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_MY, - EC_WORD_OPPONENT, - EC_WORD_IS, - EC_WORD_FINALLY, - EC_WORD_HERE, - EC_WORD_EXCELLENT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, - .name = _("COLETTE"), - .teamFlags = 0x06, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_AM, - EC_WORD_HUNGRY, - EC_MOVE2(POUND), - EC_WORD_MY, - EC_MOVE2(BELLY_DRUM), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_HEX_MANIAC, - .name = _("PAULA"), - .teamFlags = 0x42, - .greeting = { - .easyChat = { - EC_WORD_IT_S, - EC_WORD_HARD, - EC_WORD_TO, - EC_WORD_TAKE, - EC_WORD_UGLY, - EC_MOVE(SPITE), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUIN_MANIAC, - .name = _("STANLY"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_ADVENTURE, - EC_WORD_AND, - EC_WORD_BATTLE, - EC_WORD_ARE, - EC_WORD_MY, - EC_WORD_LIKES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, - .name = _("TROY"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_WORD_LOSE, - EC_WORD_TO, - EC_WORD_A, - EC_WORD_KID, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SCHOOL_KID_M, - .name = _("ED"), - .teamFlags = 0x08, - .greeting = { - .easyChat = { - EC_WORD_POKEMON, - EC_WORD_DAILY, - EC_WORD_AT, - EC_WORD_SCHOOL, - EC_WORD_IT_S, - EC_WORD_AWESOME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, - .name = _("ELLEN"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_KIND, - EC_WORD_TO, - EC_WORD_YOUR, - EC_WORD_POKEMON, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMER_M, - .name = _("ARNIE"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_BATTLE, - EC_WORD_SERIOUSLY, - EC_WORD_BEAUTIFUL, - EC_WORD_YOU, - EC_MOVE(DIG), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, - .name = _("HAL"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_BOY, - EC_WORD_I_AM, - EC_WORD_TIRED, - EC_WORD_READY, - EC_WORD_FOR, - EC_WORD_SLEEP, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BEAUTY, - .name = _("LAUREN"), - .teamFlags = 0x06, - .greeting = { - .easyChat = { - EC_WORD_A, - EC_WORD_TRAINER, - EC_WORD_LIKE, - EC_WORD_YOU, - EC_WORD_IS, - EC_WORD_EXCITING, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_AROMA_LADY, - .name = _("STACY"), - .teamFlags = 0x06, - .greeting = { - .easyChat = { - EC_WORD_HAVE, - EC_WORD_YOU, - EC_WORD_A, - EC_WORD_STENCH, - EC_WORD_OR, - EC_MOVE(SWEET_SCENT), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COLLECTOR, - .name = _("DARYL"), - .teamFlags = 0x81, - .greeting = { - .easyChat = { - EC_WORD_YOUR, - EC_WORD_POKEMON, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_I, - EC_WORD_WANT, - EC_WORD_IT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, - .name = _("KATHY"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_WILL, - EC_WORD_TRY, - EC_WORD_MY, - EC_WORD_BEST, - EC_WORD_TODAY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, - .name = _("HARRIS"), - .teamFlags = 0x0C, - .greeting = { - .easyChat = { - EC_WORD_WAAAH, - EC_WORD_WAAAH, - EC_WORD_WAAAH, - EC_WORD_WAAAH, - EC_WORD_EHEHE, - EC_MOVE(FAKE_TEARS), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEFAN_M, - .name = _("GLENN"), - .teamFlags = 0x80, - .greeting = { - .easyChat = { - EC_WORD_LISTEN, - EC_WORD_TO, - EC_WORD_MY, - EC_WORD_LOUSY, - EC_WORD_ANIME, - EC_WORD_SONG, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, - .name = _("NICO"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_DON_T, - EC_WORD_JUST, - EC_WORD_BATTLE, - EC_WORD_DO, - EC_WORD_SOMETHING, - EC_WORD_ELSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, - .name = _("BAILEY"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_BUSY, - EC_WORD_GET, - EC_WORD_WITH, - EC_WORD_IT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PARASOL_LADY, - .name = _("ABBIE"), - .teamFlags = 0x08, - .greeting = { - .easyChat = { - EC_WORD_THE, - EC_MOVE(MORNING_SUN), - EC_WORD_HAS, - EC_WORD_SO, - EC_WORD_MUCH, - EC_MOVE(COSMIC_POWER), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CAMPER, - .name = _("AL"), - .teamFlags = 0x0C, - .greeting = { - .easyChat = { - EC_WORD_LET_S, - EC_WORD_HAVE, - EC_WORD_AN, - EC_WORD_EXCITING, - EC_WORD_BATTLE, - EC_WORD_YEEHAW_EXCL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, - .name = _("PEGGY"), - .teamFlags = 0x42, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_WANT, - EC_WORD_TO, - EC_WORD_SEE, - EC_WORD_SOME, - EC_MOVE(GROWTH), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BEAUTY, - .name = _("NAOMI"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_IT, - EC_WORD_WAS, - EC_WORD_GREAT, - EC_WORD_TO, - EC_WORD_BE, - EC_WORD_YOUNG, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_NINJA_BOY, - .name = _("KENJI"), - .teamFlags = 0x0C, - .greeting = { - .easyChat = { - EC_WORD_PLEASE, - 0xFFFF, - EC_WORD_DON_T, - EC_WORD_BE, - EC_WORD_MEAN, - EC_WORD_TO_ME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, - .name = _("ROSS"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_WAKE_UP, - EC_WORD_MY, - EC_MOVE2(HIDDEN_POWER), - EC_WORD_AND, - EC_MOVE(ASTONISH), - EC_WORD_ME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, - .name = _("EDNA"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_BATTLE_TOWER, - EC_WORD_IS, - EC_WORD_SO, - EC_WORD_ENTERTAINING, - EC_WORD_IT_S, - EC_WORD_AWESOME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUIN_MANIAC, - .name = _("ANTON"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_BLEND, - EC_WORD_THICK_FAT, - EC_WORD_AND, - EC_WORD_CHLOROPHYLL, - EC_WORD_IT_S, - EC_WORD_TASTY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMER_M, - .name = _("MITCH"), - .teamFlags = 0x81, - .greeting = { - .easyChat = { - EC_WORD_NEXT, - EC_WORD_A, - EC_WORD_GIRL, - EC_WORD_WITH, - EC_WORD_A, - EC_MOVE(SCARY_FACE), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_HEX_MANIAC, - .name = _("ROD"), - .teamFlags = 0x42, - .greeting = { - .easyChat = { - EC_WORD_GIMME, - EC_WORD_A, - EC_WORD_TOUGH, - EC_WORD_BATTLE, - EC_WORD_NOT, - EC_WORD_WIMPY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, - .name = _("RICH"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_TASTY, - EC_WORD_WATER, - EC_WORD_IS, - EC_WORD_HIP_AND, - EC_WORD_HAPPENING, - EC_WORD_YES_SIR_EXCL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEFAN_M, - .name = _("DANIEL"), - .teamFlags = 0x80, - .greeting = { - .easyChat = { - EC_WORD_GO, - EC_WORD_FOR, - EC_WORD_IT, - EC_WORD_MY, - EC_WORD_LOVEY_DOVEY, - EC_WORD_POKEMON, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PSYCHIC_F, - .name = _("GLORIA"), - .teamFlags = 0x82, - .greeting = { - .easyChat = { - EC_WORD_LET_S, - EC_WORD_GET, - EC_WORD_THIS, - EC_WORD_FIERY, - EC_WORD_BATTLE, - EC_WORD_HAPPENING, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GUITARIST, - .name = _("NELSON"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_MUSIC, - EC_WORD_IS, - EC_WORD_MY, - EC_WORD_ALL, - EC_WORD_MY, - EC_WORD_DESTINY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_KINDLER, - .name = _("FERRIS"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_GOOD, - EC_WORD_IT, - EC_WORD_IS, - EC_WORD_SO, - EC_WORD_VERY, - EC_WORD_GOOD, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_AROMA_LADY, - .name = _("AMANDA"), - .teamFlags = 0x82, - .greeting = { - .easyChat = { - EC_WORD_WHAT, - EC_WORD_KIND, - EC_WORD_OF, - EC_WORD_TRAINER, - EC_WORD_ARE, - EC_WORD_YOU, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, - .name = _("MASON"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_DON_T, - EC_WORD_KNOW, - EC_WORD_HOW, - EC_WORD_TO, - EC_WORD_LOSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_DRAGON_TAMER, - .name = _("NATE"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_DRAGON, - EC_WORD_POKEMON, - EC_WORD_ARE, - EC_WORD_ALL, - EC_WORD_THE, - EC_MOVE(RAGE), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_LASS, - .name = _("MIRIAM"), - .teamFlags = 0x82, - .greeting = { - .easyChat = { - EC_WORD_YOU_RE, - EC_WORD_TOO_STRONG, - EC_WORD_SERIOUSLY, - EC_WORD_IT_S, - EC_WORD_BAD, - EC_WORD_NEWS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMANIAC, - .name = _("THEO"), - .teamFlags = 0x40, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_ADORE, - EC_WORD_MY, - EC_WORD_MEGA, - EC_WORD_CUTE, - EC_WORD_PLUSH_DOLL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, - .name = _("PAMELA"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_HERE_I_COME, - EC_WORD_I_AM, - EC_WORD_THE, - EC_WORD_CUTE, - EC_MOVE2(WATER_SPORT), - EC_WORD_IDOL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEFAN_F, - .name = _("ALISSA"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_IT_S, - EC_WORD_A, - EC_WORD_PREPOSTEROUS, - EC_WORD_MATCH, - EC_WORD_I_AM, - EC_WORD_SHOCKED, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GENTLEMAN, - .name = _("ARTHUR"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_PLEASE, - EC_WORD_GIVE, - EC_WORD_ME, - EC_WORD_A, - EC_WORD_GOOD, - EC_WORD_BATTLE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMER_F, - .name = _("MARCY"), - .teamFlags = 0x82, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_BEAUTIFUL, - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_WORD_BEAT, - EC_WORD_ME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, - .name = _("MILLER"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_BATTLE, - EC_WORD_DAILY, - EC_WORD_I, - EC_WORD_WON_T, - EC_WORD_LOSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BIRD_KEEPER, - .name = _("OLIVER"), - .teamFlags = 0x11, - .greeting = { - .easyChat = { - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_GIGGLE, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - 0xFFFF, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, - .name = _("MOLLY"), - .teamFlags = 0x12, - .greeting = { - .easyChat = { - EC_WORD_HOW, - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_ON, - EC_WORD_MONDAY, - EC_WORD_MORNING, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BUG_MANIAC, - .name = _("JASON"), - .teamFlags = 0x40, - .greeting = { - .easyChat = { - EC_WORD_WATER, - EC_WORD_AND, - EC_WORD_BUG, - EC_WORD_POKEMON, - EC_WORD_ARE, - EC_WORD_GREAT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BATTLE_GIRL, - .name = _("AVA"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_WHAT, - EC_WORD_IS, - EC_WORD_THIS, - EC_WORD_PRESSURE, - EC_WORD_ELLIPSIS, - EC_WORD_STATIC, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_FISHERMAN, - .name = _("HANK"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_YOU_RE, - EC_WORD_A, - EC_WORD_KID, - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_WORD_WIN, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SAILOR, - .name = _("PETER"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_IT_S, - EC_WORD_SERIOUSLY, - EC_WORD_TERRIBLE, - EC_WORD_I, - EC_WORD_REALLY, - EC_WORD_THINK, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_EXPERT_F, - .name = _("MINDY"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_YOU, - EC_WORD_APPEAR, - EC_WORD_TO, - EC_WORD_TRAIN, - EC_WORD_VERY, - EC_WORD_WELL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BUG_MANIAC, - .name = _("DWIGHT"), - .teamFlags = 0x11, - .greeting = { - .easyChat = { - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_STRONG, - EC_WORD_YOU, - EC_WORD_ARE, - EC_WORD_SCARY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, - .name = _("REENA"), - .teamFlags = 0x12, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_ALWAYS, - EC_WORD_LOSE, - EC_WORD_MAYBE, - EC_WORD_TODAY, - EC_WORD_ELLIPSIS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PARASOL_LADY, - .name = _("MEGAN"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_DON_T, - EC_WORD_MAKE, - EC_WORD_THAT, - EC_MOVE(SCARY_FACE), - EC_WORD_AT, - EC_WORD_ME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, - .name = _("SIERRA"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_I_VE, - EC_WORD_RUN, - EC_WORD_A_LOT, - EC_WORD_SO, - EC_WORD_I_AM, - EC_WORD_HEALTHY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, - .name = _("ARNOLD"), - .teamFlags = 0x08, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_FEELING, - EC_WORD_AWESOME, - EC_WORD_MY, - EC_WORD_POKEMON, - EC_WORD_ROCK, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BLACK_BELT, - .name = _("XIN"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_HOO_HAH, - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_READY, - EC_WORD_TO, - EC_WORD_ROCK, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, - .name = _("KELLY"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_YOU, - EC_WORD_COULDN_T, - EC_WORD_BEAT, - EC_WORD_ME, - EC_WORD_EVER, - EC_WORD_KID, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COLLECTOR, - .name = _("VANCE"), - .teamFlags = 0x80, - .greeting = { - .easyChat = { - EC_WORD_POKEMON, - EC_WORD_ALL, - EC_WORD_OVER, - EC_WORD_THE, - EC_WORD_PLACE, - EC_WORD_WOWEE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, - .name = _("TOBY"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_THIS, - EC_WORD_ISN_T, - EC_WORD_SPORTS, - EC_WORD_IT_S, - EC_WORD_A, - EC_WORD_BATTLE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GENTLEMAN, - .name = _("NORTON"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_HAVE, - EC_WORD_TO, - EC_WORD_WIN, - EC_WORD_PLEASE, - EC_WORD_LOSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BATTLE_GIRL, - .name = _("ZOE"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_THIS, - EC_WORD_IS, - EC_WORD_SCARY, - EC_WORD_PLEASE, - EC_WORD_BE, - EC_WORD_NICE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BEAUTY, - .name = _("EMMA"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_DON_T, - EC_WORD_YOU, - EC_MOVE(FLAIL), - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_MOVE(WITHDRAW), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_HIKER, - .name = _("VINCE"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_YAHOO, - EC_WORD_YAHOO, - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_LISTENING, - EC_WORD_QUES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_EXPERT_M, - .name = _("MARV"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_LEARN, - EC_WORD_TO, - EC_WORD_BATTLE, - EC_WORD_THE, - EC_WORD_CORRECT, - EC_WORD_WAY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, - .name = _("TODD"), - .teamFlags = 0x40, - .greeting = { - .easyChat = { - EC_WORD_THE, - EC_WORD_WAY, - EC_WORD_YOU, - EC_WORD_BATTLE, - EC_WORD_IT_S, - EC_WORD_CHILD_S_PLAY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GUITARIST, - .name = _("GAVIN"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_BABY, - EC_WORD_BABY, - EC_WORD_BABY, - EC_WORD_ROCK, - EC_WORD_ME, - EC_WORD_HARD, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PSYCHIC_M, - .name = _("QUINN"), - .teamFlags = 0x08, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_HAVE, - EC_WORD_A, - EC_WORD_STICKY_HOLD, - EC_WORD_ON, - EC_WORD_YOU, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, - .name = _("JENN"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_ON, - EC_WORD_A, - EC_WORD_TOUGH, - EC_WORD_TRAINER, - EC_WORD_SEARCH, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_EXPERT_M, - .name = _("JOEL"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_BELIEVE, - EC_WORD_IN, - EC_WORD_YOUR, - EC_WORD_POKEMON, - EC_WORD_AND, - EC_WORD_WIN, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_DRAGON_TAMER, - .name = _("KYLE"), - .teamFlags = 0x0C, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_LIKE, - EC_WORD_A, - EC_WORD_GIRL, - EC_WORD_WITH, - EC_MOVE2(FORESIGHT), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, - .name = _("BRET"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_TAKE, - EC_WORD_MY, - EC_WORD_OVERWHELMING, - EC_WORD_POWER, - EC_WORD_AND, - EC_WORD_DISAPPEAR, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_EXPERT_F, - .name = _("CARRIE"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_TRAINER, - EC_WORD_I, - EC_WORD_SEE, - EC_WORD_YOU, - EC_WORD_ARE, - EC_WORD_CAPABLE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_LADY, - .name = _("GILLIAN"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_COME_ON, - EC_WORD_SHOW, - EC_WORD_ME, - EC_WORD_AN, - EC_WORD_EXCELLENT, - EC_WORD_TIME, - }, - }, - }, + { + .trainerClass = FACILITY_CLASS_YOUNGSTER, + .name = _("ALVIN"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_QUES, + EC_WORD_HERE_I_COME, + EC_WORD_EXCL, + }, + }, + { + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, + .name = _("DIRK"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_OKAY, + EC_WORD_I_AM, + EC_WORD_GOING, + EC_WORD_FOR, + EC_WORD_IT, + EC_WORD_EXCL, + }, + }, + { + .trainerClass = FACILITY_CLASS_LADY, + .name = _("CYBIL"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_YOU_RE, + EC_WORD_A, + EC_WORD_PUSHOVER, + EC_WORD_LET_S, + EC_WORD_GET, + EC_WORD_GOING, + }, + }, + { + .trainerClass = FACILITY_CLASS_BLACK_BELT, + .name = _("CHEN"), + .teamFlags = 0x05, + .greeting = { + EC_WORD_MY, + EC_WORD_SPIRIT, + EC_WORD_IS, + EC_WORD_ENOUGH, + EC_WORD_SNORT, + EC_WORD_ARRGH, + }, + }, + { + .trainerClass = FACILITY_CLASS_NINJA_BOY, + .name = _("YOSHI"), + .teamFlags = 0x05, + .greeting = { + EC_WORD_GO, + EC_WORD_MY, + EC_WORD_POKEMON, + EC_WORD_FIGHT, + EC_WORD_THE, + EC_WORD_BATTLE, + }, + }, + { + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, + .name = _("TINA"), + .teamFlags = 0x0A, + .greeting = { + EC_WORD_STUDY, + EC_WORD_IS, + EC_WORD_BORING, + EC_WORD_LET_S, + EC_WORD_BATTLE, + EC_WORD_NOW, + }, + }, + { + .trainerClass = FACILITY_CLASS_BUG_MANIAC, + .name = _("COREY"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_HEY, + EC_WORD_I, + EC_WORD_WILL, + EC_MOVE2(TRANSFORM), + EC_WORD_FOR, + EC_MOVE(STRENGTH), + }, + }, + { + .trainerClass = FACILITY_CLASS_FISHERMAN, + .name = _("GORDON"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_I, + EC_WORD_NEED, + EC_WORD_A, + EC_WORD_VACATION, + EC_WORD_RIGHT, + EC_WORD_NOW, + }, + }, + { + .trainerClass = FACILITY_CLASS_TUBER_F, + .name = _("ANN"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_WE, + EC_WORD_ALL, + EC_WORD_ADORE, + EC_WORD_POKEMON, + EC_WORD_ABSOLUTELY, + EC_WORD_TRULY, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEFAN_F, + .name = _("JULIA"), + .teamFlags = 0x42, + .greeting = { + EC_WORD_I_AM, + EC_WORD_A, + EC_WORD_CUTE, + EC_WORD_LADY, + EC_WORD_YES, + EC_WORD_I_AM, + }, + }, + { + .trainerClass = FACILITY_CLASS_GENTLEMAN, + .name = _("GREGORY"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_I, + EC_WORD_THINK, + EC_WORD_WE, + EC_WORD_SHOULD, + EC_WORD_START, + EC_WORD_TODAY, + }, + }, + { + .trainerClass = FACILITY_CLASS_CAMPER, + .name = _("KEITH"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_YOU_RE, + EC_WORD_MY, + EC_WORD_FRIEND, + EC_WORD_FROM, + EC_WORD_NOW, + EC_WORD_ON, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, + .name = _("KENDRA"), + .teamFlags = 0x0A, + .greeting = { + EC_WORD_I_AM, + EC_MOVE(SWIFT), + EC_WORD_HOW, + EC_WORD_ABOUT, + EC_WORD_YOU, + EC_WORD_QUES, + }, + }, + { + .trainerClass = FACILITY_CLASS_HIKER, + .name = _("DEV"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_WAHAHAHA, + EC_WORD_I_AM, + EC_WORD_FEELING, + EC_WORD_LIKE, + EC_WORD_IT_S, + EC_MOVE2(PAY_DAY), + }, + }, + { + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, + .name = _("CASSIE"), + .teamFlags = 0x0A, + .greeting = { + EC_WORD_YOU_RE, + EC_WORD_STRONG, + EC_WORD_AREN_T, + 0xFFFF, + EC_WORD_YOU, + EC_WORD_QUES, + }, + }, + { + .trainerClass = FACILITY_CLASS_PSYCHIC_M, + .name = _("JULIAN"), + .teamFlags = 0x05, + .greeting = { + EC_WORD_FUFUFU, + 0xFFFF, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_WIN, + EC_WORD_KID, + }, + }, + { + .trainerClass = FACILITY_CLASS_LASS, + .name = _("JOYCE"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_BE, + EC_WORD_KIND, + EC_WORD_TO, + EC_WORD_THE, + EC_WORD_DIGITAL, + EC_WORD_IDOL, + }, + }, + { + .trainerClass = FACILITY_CLASS_GUITARIST, + .name = _("LES"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_I_AM, + EC_WORD_GREAT, + EC_WORD_YOU_RE, + EC_WORD_JUST, + EC_WORD_RATHER, + EC_WORD_OKAY, + }, + }, + { + .trainerClass = FACILITY_CLASS_RICH_BOY, + .name = _("CLINTON"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_I, + EC_WORD_HAVE, + EC_WORD_ROUGH_SKIN, + EC_WORD_I, + EC_WORD_NEED, + EC_WORD_NATURAL_CURE, + }, + }, + { + .trainerClass = FACILITY_CLASS_BUG_CATCHER, + .name = _("LEWIS"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_THIS, + EC_WORD_IS, + EC_WORD_EXCITING, + EC_WORD_CAN, + EC_WORD_I, + EC_WORD_WIN, + }, + }, + { + .trainerClass = FACILITY_CLASS_PICNICKER, + .name = _("RACHAEL"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_I, + EC_WORD_LIKE, + EC_WORD_WALKING, + EC_WORD_WITH, + EC_WORD_MY, + EC_WORD_POKEMON, + }, + }, + { + .trainerClass = FACILITY_CLASS_COLLECTOR, + .name = _("HAROLD"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_HERE, + EC_WORD_THEY, + EC_WORD_COME, + EC_WORD_MY, + EC_MOVE2(SUPERPOWER), + EC_WORD_POKEMON, + }, + }, + { + .trainerClass = FACILITY_CLASS_TUBER_M, + .name = _("KIPP"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_I_AM, + EC_WORD_A, + EC_WORD_GENIUS, + EC_WORD_I, + EC_WORD_SHOULD, + EC_WORD_WIN, + }, + }, + { + .trainerClass = FACILITY_CLASS_KINDLER, + .name = _("IRWIN"), + .teamFlags = 0x05, + .greeting = { + EC_WORD_YOU, + EC_WORD_WILL, + EC_WORD_BE, + EC_WORD_FEELING, + EC_WORD_MY, + EC_WORD_FIRE, + }, + }, + { + .trainerClass = FACILITY_CLASS_PSYCHIC_F, + .name = _("EILEEN"), + .teamFlags = 0x0A, + .greeting = { + EC_WORD_I, + EC_WORD_WILL, + EC_MOVE(ASTONISH), + EC_WORD_YOU, + EC_WORD_IN, + EC_WORD_BATTLE, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMER_F, + .name = _("ANNE"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_SORRY, + EC_WORD_BUT, + EC_WORD_YOU, + EC_WORD_WILL, + EC_WORD_NOT, + EC_WORD_WIN, + }, + }, + { + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, + .name = _("RUTH"), + .teamFlags = 0x06, + .greeting = { + EC_WORD_A, + EC_WORD_STRONG, + EC_WORD_GIRL, + EC_WORD_WANTS, + EC_WORD_TOUGH, + EC_WORD_POKEMON, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMANIAC, + .name = _("JEREMY"), + .teamFlags = 0x40, + .greeting = { + EC_WORD_MY, + EC_WORD_POKEMON, + EC_WORD_ARE, + EC_WORD_COOL, + EC_WORD_YOURS, + EC_WORD_CAN_T_WIN, + }, + }, + { + .trainerClass = FACILITY_CLASS_SAILOR, + .name = _("TREVOR"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_MY, + EC_WORD_OPPONENT, + EC_WORD_IS, + EC_WORD_FINALLY, + EC_WORD_HERE, + EC_WORD_EXCELLENT, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, + .name = _("COLETTE"), + .teamFlags = 0x06, + .greeting = { + EC_WORD_I, + EC_WORD_AM, + EC_WORD_HUNGRY, + EC_MOVE2(POUND), + EC_WORD_MY, + EC_MOVE2(BELLY_DRUM), + }, + }, + { + .trainerClass = FACILITY_CLASS_HEX_MANIAC, + .name = _("PAULA"), + .teamFlags = 0x42, + .greeting = { + EC_WORD_IT_S, + EC_WORD_HARD, + EC_WORD_TO, + EC_WORD_TAKE, + EC_WORD_UGLY, + EC_MOVE(SPITE), + }, + }, + { + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, + .name = _("STANLY"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_ADVENTURE, + EC_WORD_AND, + EC_WORD_BATTLE, + EC_WORD_ARE, + EC_WORD_MY, + EC_WORD_LIKES, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("TROY"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_LOSE, + EC_WORD_TO, + EC_WORD_A, + EC_WORD_KID, + }, + }, + { + .trainerClass = FACILITY_CLASS_SCHOOL_KID_M, + .name = _("ED"), + .teamFlags = 0x08, + .greeting = { + EC_WORD_POKEMON, + EC_WORD_DAILY, + EC_WORD_AT, + EC_WORD_SCHOOL, + EC_WORD_IT_S, + EC_WORD_AWESOME, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, + .name = _("ELLEN"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_KIND, + EC_WORD_TO, + EC_WORD_YOUR, + EC_WORD_POKEMON, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMER_M, + .name = _("ARNIE"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_I, + EC_WORD_BATTLE, + EC_WORD_SERIOUSLY, + EC_WORD_BEAUTIFUL, + EC_WORD_YOU, + EC_MOVE(DIG), + }, + }, + { + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, + .name = _("HAL"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_BOY, + EC_WORD_I_AM, + EC_WORD_TIRED, + EC_WORD_READY, + EC_WORD_FOR, + EC_WORD_SLEEP, + }, + }, + { + .trainerClass = FACILITY_CLASS_BEAUTY, + .name = _("LAUREN"), + .teamFlags = 0x06, + .greeting = { + EC_WORD_A, + EC_WORD_TRAINER, + EC_WORD_LIKE, + EC_WORD_YOU, + EC_WORD_IS, + EC_WORD_EXCITING, + }, + }, + { + .trainerClass = FACILITY_CLASS_AROMA_LADY, + .name = _("STACY"), + .teamFlags = 0x06, + .greeting = { + EC_WORD_HAVE, + EC_WORD_YOU, + EC_WORD_A, + EC_WORD_STENCH, + EC_WORD_OR, + EC_MOVE(SWEET_SCENT), + }, + }, + { + .trainerClass = FACILITY_CLASS_COLLECTOR, + .name = _("DARYL"), + .teamFlags = 0x81, + .greeting = { + EC_WORD_YOUR, + EC_WORD_POKEMON, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_I, + EC_WORD_WANT, + EC_WORD_IT, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, + .name = _("KATHY"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_I, + EC_WORD_WILL, + EC_WORD_TRY, + EC_WORD_MY, + EC_WORD_BEST, + EC_WORD_TODAY, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, + .name = _("HARRIS"), + .teamFlags = 0x0C, + .greeting = { + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_EHEHE, + EC_MOVE(FAKE_TEARS), + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEFAN_M, + .name = _("GLENN"), + .teamFlags = 0x80, + .greeting = { + EC_WORD_LISTEN, + EC_WORD_TO, + EC_WORD_MY, + EC_WORD_LOUSY, + EC_WORD_ANIME, + EC_WORD_SONG, + }, + }, + { + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, + .name = _("NICO"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_DON_T, + EC_WORD_JUST, + EC_WORD_BATTLE, + EC_WORD_DO, + EC_WORD_SOMETHING, + EC_WORD_ELSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, + .name = _("BAILEY"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_BUSY, + EC_WORD_GET, + EC_WORD_WITH, + EC_WORD_IT, + }, + }, + { + .trainerClass = FACILITY_CLASS_PARASOL_LADY, + .name = _("ABBIE"), + .teamFlags = 0x08, + .greeting = { + EC_WORD_THE, + EC_MOVE(MORNING_SUN), + EC_WORD_HAS, + EC_WORD_SO, + EC_WORD_MUCH, + EC_MOVE(COSMIC_POWER), + }, + }, + { + .trainerClass = FACILITY_CLASS_CAMPER, + .name = _("AL"), + .teamFlags = 0x0C, + .greeting = { + EC_WORD_LET_S, + EC_WORD_HAVE, + EC_WORD_AN, + EC_WORD_EXCITING, + EC_WORD_BATTLE, + EC_WORD_YEEHAW_EXCL, + }, + }, + { + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, + .name = _("PEGGY"), + .teamFlags = 0x42, + .greeting = { + EC_WORD_I, + EC_WORD_WANT, + EC_WORD_TO, + EC_WORD_SEE, + EC_WORD_SOME, + EC_MOVE(GROWTH), + }, + }, + { + .trainerClass = FACILITY_CLASS_BEAUTY, + .name = _("NAOMI"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_IT, + EC_WORD_WAS, + EC_WORD_GREAT, + EC_WORD_TO, + EC_WORD_BE, + EC_WORD_YOUNG, + }, + }, + { + .trainerClass = FACILITY_CLASS_NINJA_BOY, + .name = _("KENJI"), + .teamFlags = 0x0C, + .greeting = { + EC_WORD_PLEASE, + 0xFFFF, + EC_WORD_DON_T, + EC_WORD_BE, + EC_WORD_MEAN, + EC_WORD_TO_ME, + }, + }, + { + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, + .name = _("ROSS"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_WAKE_UP, + EC_WORD_MY, + EC_MOVE2(HIDDEN_POWER), + EC_WORD_AND, + EC_MOVE(ASTONISH), + EC_WORD_ME, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, + .name = _("EDNA"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_BATTLE_TOWER, + EC_WORD_IS, + EC_WORD_SO, + EC_WORD_ENTERTAINING, + EC_WORD_IT_S, + EC_WORD_AWESOME, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, + .name = _("ANTON"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_BLEND, + EC_WORD_THICK_FAT, + EC_WORD_AND, + EC_WORD_CHLOROPHYLL, + EC_WORD_IT_S, + EC_WORD_TASTY, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMER_M, + .name = _("MITCH"), + .teamFlags = 0x81, + .greeting = { + EC_WORD_NEXT, + EC_WORD_A, + EC_WORD_GIRL, + EC_WORD_WITH, + EC_WORD_A, + EC_MOVE(SCARY_FACE), + }, + }, + { + .trainerClass = FACILITY_CLASS_HEX_MANIAC, + .name = _("ROD"), + .teamFlags = 0x42, + .greeting = { + EC_WORD_GIMME, + EC_WORD_A, + EC_WORD_TOUGH, + EC_WORD_BATTLE, + EC_WORD_NOT, + EC_WORD_WIMPY, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, + .name = _("RICH"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_TASTY, + EC_WORD_WATER, + EC_WORD_IS, + EC_WORD_HIP_AND, + EC_WORD_HAPPENING, + EC_WORD_YES_SIR_EXCL, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEFAN_M, + .name = _("DANIEL"), + .teamFlags = 0x80, + .greeting = { + EC_WORD_GO, + EC_WORD_FOR, + EC_WORD_IT, + EC_WORD_MY, + EC_WORD_LOVEY_DOVEY, + EC_WORD_POKEMON, + }, + }, + { + .trainerClass = FACILITY_CLASS_PSYCHIC_F, + .name = _("GLORIA"), + .teamFlags = 0x82, + .greeting = { + EC_WORD_LET_S, + EC_WORD_GET, + EC_WORD_THIS, + EC_WORD_FIERY, + EC_WORD_BATTLE, + EC_WORD_HAPPENING, + }, + }, + { + .trainerClass = FACILITY_CLASS_GUITARIST, + .name = _("NELSON"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_MUSIC, + EC_WORD_IS, + EC_WORD_MY, + EC_WORD_ALL, + EC_WORD_MY, + EC_WORD_DESTINY, + }, + }, + { + .trainerClass = FACILITY_CLASS_KINDLER, + .name = _("FERRIS"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_GOOD, + EC_WORD_IT, + EC_WORD_IS, + EC_WORD_SO, + EC_WORD_VERY, + EC_WORD_GOOD, + }, + }, + { + .trainerClass = FACILITY_CLASS_AROMA_LADY, + .name = _("AMANDA"), + .teamFlags = 0x82, + .greeting = { + EC_WORD_WHAT, + EC_WORD_KIND, + EC_WORD_OF, + EC_WORD_TRAINER, + EC_WORD_ARE, + EC_WORD_YOU, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("MASON"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_I, + EC_WORD_DON_T, + EC_WORD_KNOW, + EC_WORD_HOW, + EC_WORD_TO, + EC_WORD_LOSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, + .name = _("NATE"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_DRAGON, + EC_WORD_POKEMON, + EC_WORD_ARE, + EC_WORD_ALL, + EC_WORD_THE, + EC_MOVE(RAGE), + }, + }, + { + .trainerClass = FACILITY_CLASS_LASS, + .name = _("MIRIAM"), + .teamFlags = 0x82, + .greeting = { + EC_WORD_YOU_RE, + EC_WORD_TOO_STRONG, + EC_WORD_SERIOUSLY, + EC_WORD_IT_S, + EC_WORD_BAD, + EC_WORD_NEWS, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMANIAC, + .name = _("THEO"), + .teamFlags = 0x40, + .greeting = { + EC_WORD_I, + EC_WORD_ADORE, + EC_WORD_MY, + EC_WORD_MEGA, + EC_WORD_CUTE, + EC_WORD_PLUSH_DOLL, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, + .name = _("PAMELA"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_HERE_I_COME, + EC_WORD_I_AM, + EC_WORD_THE, + EC_WORD_CUTE, + EC_MOVE2(WATER_SPORT), + EC_WORD_IDOL, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEFAN_F, + .name = _("ALISSA"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_IT_S, + EC_WORD_A, + EC_WORD_PREPOSTEROUS, + EC_WORD_MATCH, + EC_WORD_I_AM, + EC_WORD_SHOCKED, + }, + }, + { + .trainerClass = FACILITY_CLASS_GENTLEMAN, + .name = _("ARTHUR"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_PLEASE, + EC_WORD_GIVE, + EC_WORD_ME, + EC_WORD_A, + EC_WORD_GOOD, + EC_WORD_BATTLE, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMER_F, + .name = _("MARCY"), + .teamFlags = 0x82, + .greeting = { + EC_WORD_I_AM, + EC_WORD_BEAUTIFUL, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_BEAT, + EC_WORD_ME, + }, + }, + { + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, + .name = _("MILLER"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_I, + EC_WORD_BATTLE, + EC_WORD_DAILY, + EC_WORD_I, + EC_WORD_WON_T, + EC_WORD_LOSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, + .name = _("OLIVER"), + .teamFlags = 0x11, + .greeting = { + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_GIGGLE, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, + .name = _("MOLLY"), + .teamFlags = 0x12, + .greeting = { + EC_WORD_HOW, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_ON, + EC_WORD_MONDAY, + EC_WORD_MORNING, + }, + }, + { + .trainerClass = FACILITY_CLASS_BUG_MANIAC, + .name = _("JASON"), + .teamFlags = 0x40, + .greeting = { + EC_WORD_WATER, + EC_WORD_AND, + EC_WORD_BUG, + EC_WORD_POKEMON, + EC_WORD_ARE, + EC_WORD_GREAT, + }, + }, + { + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, + .name = _("AVA"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_WHAT, + EC_WORD_IS, + EC_WORD_THIS, + EC_WORD_PRESSURE, + EC_WORD_ELLIPSIS, + EC_WORD_STATIC, + }, + }, + { + .trainerClass = FACILITY_CLASS_FISHERMAN, + .name = _("HANK"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_YOU_RE, + EC_WORD_A, + EC_WORD_KID, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_WIN, + }, + }, + { + .trainerClass = FACILITY_CLASS_SAILOR, + .name = _("PETER"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_IT_S, + EC_WORD_SERIOUSLY, + EC_WORD_TERRIBLE, + EC_WORD_I, + EC_WORD_REALLY, + EC_WORD_THINK, + }, + }, + { + .trainerClass = FACILITY_CLASS_EXPERT_F, + .name = _("MINDY"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_YOU, + EC_WORD_APPEAR, + EC_WORD_TO, + EC_WORD_TRAIN, + EC_WORD_VERY, + EC_WORD_WELL, + }, + }, + { + .trainerClass = FACILITY_CLASS_BUG_MANIAC, + .name = _("DWIGHT"), + .teamFlags = 0x11, + .greeting = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_STRONG, + EC_WORD_YOU, + EC_WORD_ARE, + EC_WORD_SCARY, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, + .name = _("REENA"), + .teamFlags = 0x12, + .greeting = { + EC_WORD_I, + EC_WORD_ALWAYS, + EC_WORD_LOSE, + EC_WORD_MAYBE, + EC_WORD_TODAY, + EC_WORD_ELLIPSIS, + }, + }, + { + .trainerClass = FACILITY_CLASS_PARASOL_LADY, + .name = _("MEGAN"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_DON_T, + EC_WORD_MAKE, + EC_WORD_THAT, + EC_MOVE(SCARY_FACE), + EC_WORD_AT, + EC_WORD_ME, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, + .name = _("SIERRA"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_I_VE, + EC_WORD_RUN, + EC_WORD_A_LOT, + EC_WORD_SO, + EC_WORD_I_AM, + EC_WORD_HEALTHY, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, + .name = _("ARNOLD"), + .teamFlags = 0x08, + .greeting = { + EC_WORD_I_AM, + EC_WORD_FEELING, + EC_WORD_AWESOME, + EC_WORD_MY, + EC_WORD_POKEMON, + EC_WORD_ROCK, + }, + }, + { + .trainerClass = FACILITY_CLASS_BLACK_BELT, + .name = _("XIN"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_HOO_HAH, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_TO, + EC_WORD_ROCK, + }, + }, + { + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, + .name = _("KELLY"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_YOU, + EC_WORD_COULDN_T, + EC_WORD_BEAT, + EC_WORD_ME, + EC_WORD_EVER, + EC_WORD_KID, + }, + }, + { + .trainerClass = FACILITY_CLASS_COLLECTOR, + .name = _("VANCE"), + .teamFlags = 0x80, + .greeting = { + EC_WORD_POKEMON, + EC_WORD_ALL, + EC_WORD_OVER, + EC_WORD_THE, + EC_WORD_PLACE, + EC_WORD_WOWEE, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("TOBY"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_THIS, + EC_WORD_ISN_T, + EC_WORD_SPORTS, + EC_WORD_IT_S, + EC_WORD_A, + EC_WORD_BATTLE, + }, + }, + { + .trainerClass = FACILITY_CLASS_GENTLEMAN, + .name = _("NORTON"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_I, + EC_WORD_HAVE, + EC_WORD_TO, + EC_WORD_WIN, + EC_WORD_PLEASE, + EC_WORD_LOSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, + .name = _("ZOE"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_THIS, + EC_WORD_IS, + EC_WORD_SCARY, + EC_WORD_PLEASE, + EC_WORD_BE, + EC_WORD_NICE, + }, + }, + { + .trainerClass = FACILITY_CLASS_BEAUTY, + .name = _("EMMA"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_DON_T, + EC_WORD_YOU, + EC_MOVE(FLAIL), + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_MOVE(WITHDRAW), + }, + }, + { + .trainerClass = FACILITY_CLASS_HIKER, + .name = _("VINCE"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_YAHOO, + EC_WORD_YAHOO, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_LISTENING, + EC_WORD_QUES, + }, + }, + { + .trainerClass = FACILITY_CLASS_EXPERT_M, + .name = _("MARV"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_LEARN, + EC_WORD_TO, + EC_WORD_BATTLE, + EC_WORD_THE, + EC_WORD_CORRECT, + EC_WORD_WAY, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, + .name = _("TODD"), + .teamFlags = 0x40, + .greeting = { + EC_WORD_THE, + EC_WORD_WAY, + EC_WORD_YOU, + EC_WORD_BATTLE, + EC_WORD_IT_S, + EC_WORD_CHILD_S_PLAY, + }, + }, + { + .trainerClass = FACILITY_CLASS_GUITARIST, + .name = _("GAVIN"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_BABY, + EC_WORD_BABY, + EC_WORD_BABY, + EC_WORD_ROCK, + EC_WORD_ME, + EC_WORD_HARD, + }, + }, + { + .trainerClass = FACILITY_CLASS_PSYCHIC_M, + .name = _("QUINN"), + .teamFlags = 0x08, + .greeting = { + EC_WORD_I, + EC_WORD_HAVE, + EC_WORD_A, + EC_WORD_STICKY_HOLD, + EC_WORD_ON, + EC_WORD_YOU, + }, + }, + { + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, + .name = _("JENN"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_I_AM, + EC_WORD_ON, + EC_WORD_A, + EC_WORD_TOUGH, + EC_WORD_TRAINER, + EC_WORD_SEARCH, + }, + }, + { + .trainerClass = FACILITY_CLASS_EXPERT_M, + .name = _("JOEL"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_BELIEVE, + EC_WORD_IN, + EC_WORD_YOUR, + EC_WORD_POKEMON, + EC_WORD_AND, + EC_WORD_WIN, + }, + }, + { + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, + .name = _("KYLE"), + .teamFlags = 0x0C, + .greeting = { + EC_WORD_I, + EC_WORD_LIKE, + EC_WORD_A, + EC_WORD_GIRL, + EC_WORD_WITH, + EC_MOVE2(FORESIGHT), + }, + }, + { + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, + .name = _("BRET"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_TAKE, + EC_WORD_MY, + EC_WORD_OVERWHELMING, + EC_WORD_POWER, + EC_WORD_AND, + EC_WORD_DISAPPEAR, + }, + }, + { + .trainerClass = FACILITY_CLASS_EXPERT_F, + .name = _("CARRIE"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_TRAINER, + EC_WORD_I, + EC_WORD_SEE, + EC_WORD_YOU, + EC_WORD_ARE, + EC_WORD_CAPABLE, + }, + }, + { + .trainerClass = FACILITY_CLASS_LADY, + .name = _("GILLIAN"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_COME_ON, + EC_WORD_SHOW, + EC_WORD_ME, + EC_WORD_AN, + EC_WORD_EXCELLENT, + EC_WORD_TIME, + }, + }, }; diff --git a/src/data/battle_tower/trainers_de.h b/src/data/battle_tower/trainers_de.h index db226c6a6..71f301975 100644 --- a/src/data/battle_tower/trainers_de.h +++ b/src/data/battle_tower/trainers_de.h @@ -1,1503 +1,1303 @@ const struct BattleTowerTrainer gBattleTowerTrainers[] = { - { - .trainerClass = FACILITY_CLASS_YOUNGSTER, - .name = _("ALWIN"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_READY, - EC_WORD_QUES, - EC_WORD_HERE_I_COME, - EC_WORD_EXCL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BIRD_KEEPER, - .name = _("DIRK"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_OH_KAY, - EC_WORD_I_AM, - EC_WORD_READY, - EC_WORD_EXCL, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_LADY, - .name = _("SIBILLE"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_THAT, - EC_WORD_BECOMES, - EC_WORD_A, - EC_WORD_CHILD_S_PLAY, - EC_WORD_GO, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BLACK_BELT, - .name = _("OLAF"), - .teamFlags = 0x05, - .greeting = { - .easyChat = { - EC_WORD_MY, - EC_WORD_GHOST, - EC_WORD_IS, - EC_WORD_FULL, - EC_WORD_TOUGHNESS, - EC_WORD_SNORT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_NINJA_BOY, - .name = _("JOST"), - .teamFlags = 0x05, - .greeting = { - .easyChat = { - EC_WORD_GO, - EC_WORD_WHO_WAS, - EC_WORD_POKEMON, - EC_WORD_FIGHT, - EC_WORD_FIGHT, - EC_WORD_FIGHT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, - .name = _("TINA"), - .teamFlags = 0x0A, - .greeting = { - .easyChat = { - EC_WORD_STUDY, - EC_WORD_IS, - EC_WORD_BORING, - EC_WORD_LET_S, - EC_WORD_BETTER, - EC_WORD_FIGHT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BUG_MANIAC, - .name = _("HAJO"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_TOUGHNESS, - EC_WORD_AND, - EC_MOVE2(TRANSFORM), - EC_WORD_WILL, - EC_WORD_BABE, - EC_WORD_FAINT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_FISHERMAN, - .name = _("GEORG"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_IT, - EC_WORD_GOES, - EC_WORD_NOTHING, - EC_WORD_OVER, - EC_WORD_FISHING, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_TUBER_F, - .name = _("ANNE"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_POKEMON, - EC_WORD_MUST_BE, - EC_WORD_MAN, - EC_WORD_SIMPLE, - EC_WORD_ADORE, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEFAN_F, - .name = _("JULIA"), - .teamFlags = 0x42, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_CUTE, - EC_WORD_I_AM, - EC_WORD_QUITE, - EC_WORD_AN, - EC_WORD_LADY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GENTLEMAN, - .name = _("JOHANN"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_THE, - EC_WORD_DAY, - EC_WORD_IS, - EC_WORD_PERFECT, - EC_WORD_FOR, - EC_WORD_BATTLE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CAMPER, - .name = _("KARL"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_NOW, - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_MY, - EC_WORD_FRIEND, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, - .name = _("KENDRA"), - .teamFlags = 0x0A, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_SMART, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_AND, - EC_WORD_YOU, - EC_WORD_QUES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_HIKER, - .name = _("DAVID"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_WAHAHAHA, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_TODAY, - EC_WORD_IS, - EC_MOVE2(PAY_DAY), - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BATTLE_GIRL, - .name = _("KEA"), - .teamFlags = 0x0A, - .greeting = { - .easyChat = { - EC_WORD_YOU_RE, - EC_WORD_TOUGH, - EC_WORD_OR, - EC_WORD_QUES, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PSYCHIC_M, - .name = _("JULIAN"), - .teamFlags = 0x05, - .greeting = { - .easyChat = { - EC_WORD_FUFUFU, - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_WORD_DON_T, - EC_WORD_WINS, - EC_WORD_KID, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_LASS, - .name = _("JOSI"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_BE, - EC_WORD_KIND, - EC_WORD_TO, - EC_WORD_GIRL, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GUITARIST, - .name = _("LEIF"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_GREAT, - EC_WORD_YOU_RE, - EC_WORD_RATHER, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_OKAY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RICH_BOY, - .name = _("INGO"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_HAVE, - EC_WORD_ROUGH_SKIN, - EC_WORD_NATURAL_CURE, - EC_WORD_IS, - EC_WORD_ALL_RIGHT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BUG_CATCHER, - .name = _("LUDWIG"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_IF_I_WIN, - EC_WORD_IS, - EC_WORD_THAT, - EC_WORD_EXCITING, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PICNICKER, - .name = _("RAJA"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_WITH, - EC_WORD_POKEMON, - EC_WORD_TO, - EC_WORD_WALKING, - EC_WORD_IS, - EC_WORD_GREAT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COLLECTOR, - .name = _("HARALD"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_HERE_GOES, - EC_WORD_MY, - EC_WORD_HUGE_POWER, - 0xFFFF, - EC_WORD_POKEMON, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_TUBER_M, - .name = _("KIM"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_A, - EC_WORD_GENIUS, - EC_WORD_WE, - EC_WORD_WILL, - EC_WORD_WINS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_KINDLER, - .name = _("ERWIN"), - .teamFlags = 0x05, - .greeting = { - .easyChat = { - EC_WORD_MY, - EC_WORD_FIRE, - EC_WORD_IS, - EC_WORD_VERY, - EC_WORD_HOT, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PSYCHIC_F, - .name = _("EIKA"), - .teamFlags = 0x0A, - .greeting = { - .easyChat = { - EC_WORD_FIGHTING, - EC_MOVE(ASTONISH), - EC_WORD_AND, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMER_F, - .name = _("ANNINA"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_SORRY, - EC_WORD_YOURS, - EC_WORD_POKEMON, - EC_WORD_WILL, - EC_WORD_DON_T, - EC_WORD_WINS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, - .name = _("RUTH"), - .teamFlags = 0x06, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_TOUGH, - EC_WORD_WHO_WAS, - EC_WORD_POKEMON, - EC_WORD_TOO, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMANIAC, - .name = _("JENS"), - .teamFlags = 0x40, - .greeting = { - .easyChat = { - EC_WORD_WHO_WAS, - EC_WORD_POKEMON, - EC_WORD_THOSE, - EC_WORD_COOL, - EC_WORD_YOURS, - EC_WORD_LOSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SAILOR, - .name = _("TITUS"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_MY, - EC_WORD_FOE, - EC_WORD_IS, - EC_WORD_FINALLY, - EC_WORD_HERE, - EC_WORD_EXCELLENT, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, - .name = _("NICOLA"), - .teamFlags = 0x06, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_VORACIOUS, - EC_MOVE2(POUND), - EC_WORD_AND, - EC_MOVE2(BELLY_DRUM), - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_HEX_MANIAC, - .name = _("PAULA"), - .teamFlags = 0x42, - .greeting = { - .easyChat = { - EC_WORD_IS_IT_QUES, - EC_WORD_THOSE_ARE, - EC_WORD_UGLY, - EC_MOVE(SPITE), - EC_WORD_TO, - EC_WORD_TAKE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUIN_MANIAC, - .name = _("SÖREN"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_ADVENTURE, - EC_WORD_AND, - EC_WORD_BATTLE, - EC_WORD_THOSE, - EC_WORD_WHO_WAS, - EC_WORD_LIKES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, - .name = _("RAINER"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_WE, - EC_WORD_CAN, - EC_WORD_VERSUS, - EC_WORD_CHILDREN, - EC_WORD_DON_T, - EC_WORD_LOSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SCHOOL_KID_M, - .name = _("FABIAN"), - .teamFlags = 0x08, - .greeting = { - .easyChat = { - EC_WORD_DAILY, - EC_WORD_POKEMON, - EC_WORD_IN, - EC_WORD_THE, - EC_WORD_SCHOOL, - EC_WORD_AWESOME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, - .name = _("ELLEN"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_ALL_RIGHT, - EC_WORD_TO, - EC_WORD_POKEMON, - EC_WORD_QUES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMER_M, - .name = _("ARNIE"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_MY, - EC_WORD_FIGHTING, - EC_WORD_IS, - EC_WORD_PERFECTION, - EC_WORD_YOUR, - EC_WORD_USELESS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, - .name = _("HARDI"), - .teamFlags = 0x09, - .greeting = { - .easyChat = { - EC_WORD_BOY, - EC_WORD_I_AM, - EC_WORD_MAYBE, - EC_WORD_TIRED, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BEAUTY, - .name = _("LINA"), - .teamFlags = 0x06, - .greeting = { - .easyChat = { - EC_WORD_A, - EC_WORD_TRAINER, - EC_WORD_HOW_DO, - EC_WORD_YOU, - EC_WORD_IS, - EC_WORD_EXCITING, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_AROMA_LADY, - .name = _("SELINA"), - .teamFlags = 0x06, - .greeting = { - .easyChat = { - EC_WORD_YOU_VE, - EC_WORD_STENCH, - EC_WORD_OR, - EC_MOVE(SWEET_SCENT), - EC_WORD_QUES, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COLLECTOR, - .name = _("DANTE"), - .teamFlags = 0x81, - .greeting = { - .easyChat = { - EC_WORD_YOURS, - EC_WORD_POKEMON, - EC_WORD_I, - EC_WORD_WANTS, - EC_WORD_SHE, - EC_WORD_EXCL_EXCL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, - .name = _("KATJA"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_TODAY, - EC_WORD_WANTS, - EC_WORD_I, - EC_WORD_MY, - EC_WORD_BEST, - EC_WORD_GIVE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, - .name = _("HORST"), - .teamFlags = 0x0C, - .greeting = { - .easyChat = { - EC_WORD_WAAAH, - EC_WORD_WAAAH, - EC_WORD_WAAAH, - EC_WORD_WAAAH, - EC_WORD_EHEHE, - EC_MOVE(FAKE_TEARS), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEFAN_M, - .name = _("GERRIT"), - .teamFlags = 0x80, - .greeting = { - .easyChat = { - EC_WORD_MY, - EC_WORD_ANIME, - EC_WORD_SONG, - EC_WORD_IS, - EC_WORD_DON_T, - EC_WORD_LOUSY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, - .name = _("NIKO"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_BATTLE, - EC_WORD_DON_T, - EC_WORD_JUST, - EC_WORD_DO, - EC_WORD_SOMETHING, - EC_WORD_ELSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, - .name = _("BALDO"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_BUSY, - EC_WORD_HAS, - EC_WORD_THAT, - EC_WORD_TIME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PARASOL_LADY, - .name = _("ALMA"), - .teamFlags = 0x08, - .greeting = { - .easyChat = { - EC_WORD_THAT, - EC_MOVE(MORNING_SUN), - EC_WORD_HAS, - EC_WORD_SO, - EC_WORD_A_LOT, - EC_MOVE(COSMIC_POWER), - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CAMPER, - .name = _("ADAM"), - .teamFlags = 0x0C, - .greeting = { - .easyChat = { - EC_WORD_EXCITING, - EC_WORD_BATTLE, - EC_WORD_THOSE, - EC_WORD_GREAT, - EC_WORD_YEEHAW_EXCL, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, - .name = _("GRETE"), - .teamFlags = 0x42, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_WANTS, - EC_WORD_SOMETHING, - EC_MOVE(GROWTH), - EC_WORD_WORKS, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BEAUTY, - .name = _("NAOMI"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_IT, - EC_WORD_WAS, - EC_WORD_GREAT, - EC_WORD_YOUNG, - EC_WORD_TO, - EC_WORD_HIS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_NINJA_BOY, - .name = _("KENO"), - .teamFlags = 0x0C, - .greeting = { - .easyChat = { - EC_WORD_PLEASE, - EC_WORD_BE, - EC_WORD_DON_T, - EC_WORD_SO, - EC_WORD_MEAN, - EC_WORD_TO_ME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, - .name = _("REMUS"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_WAKES_UP, - EC_MOVE2(HIDDEN_POWER), - EC_WORD_AND, - EC_MOVE(ASTONISH), - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, - .name = _("EDITH"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_THE, - EC_WORD_BATTLE_TOWER, - EC_WORD_IS, - EC_WORD_SO, - EC_WORD_ENTERTAINING, - EC_WORD_AWESOME, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUIN_MANIAC, - .name = _("ANTON"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_THICK_FAT, - EC_WORD_AND, - EC_WORD_CHLOROPHYLL, - EC_WORD_BLEND, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_TASTY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMER_M, - .name = _("MALTE"), - .teamFlags = 0x81, - .greeting = { - .easyChat = { - EC_WORD_AN, - EC_MOVE(SCARY_FACE), - EC_WORD_IS, - EC_WORD_DON_T, - EC_WORD_QUITE, - EC_WORD_TERRIBLE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_HEX_MANIAC, - .name = _("RAOUL"), - .teamFlags = 0x42, - .greeting = { - .easyChat = { - EC_WORD_RUN_AWAY, - EC_WORD_GIVE_ME, - EC_WORD_SON, - EC_WORD_BEST, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, - .name = _("RICK"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_WATER, - EC_WORD_IS, - EC_WORD_TASTY, - EC_WORD_HIP_AND, - EC_WORD_REFRESHING, - EC_WORD_YES_SIR_EXCL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEFAN_M, - .name = _("DENNIS"), - .teamFlags = 0x80, - .greeting = { - .easyChat = { - EC_WORD_GO, - EC_WORD_WHO_WAS, - EC_WORD_POKEMON, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PSYCHIC_F, - .name = _("GLORIA"), - .teamFlags = 0x82, - .greeting = { - .easyChat = { - EC_WORD_THE, - EC_WORD_FIGHTING, - EC_WORD_MUST_BE, - EC_WORD_HOT, - EC_WORD_HIS, - EC_WORD_FIERY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GUITARIST, - .name = _("NINO"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_MUSIC, - EC_WORD_IS, - EC_WORD_MY, - EC_WORD_EVERY, - EC_WORD_MY, - EC_WORD_DESTINY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_KINDLER, - .name = _("FIETE"), - .teamFlags = 0x41, - .greeting = { - .easyChat = { - EC_WORD_IT_S, - EC_WORD_ALL_RIGHT, - EC_WORD_VERY, - EC_WORD_ALL_RIGHT, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_AROMA_LADY, - .name = _("AMANDA"), - .teamFlags = 0x82, - .greeting = { - .easyChat = { - EC_WORD_WHAT, - EC_WORD_FOR, - EC_WORD_A, - EC_WORD_TRAINER, - EC_WORD_ARE, - EC_WORD_YOU, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, - .name = _("MAREK"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_WE_VE, - EC_WORD_UNTIL, - EC_WORD_NOW, - EC_WORD_TOTALLY, - EC_WORD_NEVER, - EC_WORD_LOST, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_DRAGON_TAMER, - .name = _("NATHAN"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_DRAGON, - 0xFFFF, - EC_WORD_POKEMON, - EC_WORD_THOSE, - EC_WORD_FANTASTIC, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_LASS, - .name = _("MIRIAM"), - .teamFlags = 0x82, - .greeting = { - .easyChat = { - EC_WORD_YOU_RE, - EC_WORD_QUITE, - EC_WORD_TOO_STRONG, - EC_WORD_AM, - EC_WORD_BAD, - EC_WORD_NEWS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMANIAC, - .name = _("THEO"), - .teamFlags = 0x40, - .greeting = { - .easyChat = { - EC_WORD_PLUSH_DOLL, - EC_WORD_MUST_BE, - EC_WORD_MAN, - EC_WORD_SIMPLE, - EC_WORD_ADORE, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, - .name = _("PIA"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_HERE_I_COME, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_CUTE, - EC_WORD_A, - EC_WORD_CHANNEL, - EC_WORD_IDOL, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEFAN_F, - .name = _("ALISSA"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_YOURS, - EC_WORD_POKEMON, - EC_WORD_THOSE, - EC_WORD_PREPOSTEROUS, - EC_WORD_I_AM, - EC_WORD_SHOCKED, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GENTLEMAN, - .name = _("ARTUR"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_PLEASE, - EC_WORD_ALL, - EC_WORD_BATTLE, - EC_WORD_WEREN_T, - EC_WORD_GREAT, - EC_WORD_HIS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMER_F, - .name = _("MAJA"), - .teamFlags = 0x82, - .greeting = { - .easyChat = { - EC_WORD_I_AM, - EC_WORD_PRETTY, - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_WORD_DON_T, - EC_WORD_WINS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, - .name = _("MARIUS"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_BATTLE, - EC_WORD_DAILY, - EC_WORD_I, - EC_WORD_WON_T, - EC_WORD_LOSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BIRD_KEEPER, - .name = _("OLIVER"), - .teamFlags = 0x11, - .greeting = { - .easyChat = { - EC_WORD_GIGGLE, - EC_WORD_GIGGLE, - EC_WORD_SNORT, - EC_WORD_HAPPILY, - EC_WORD_GIGGLE, - EC_WORD_MUFUFU, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, - .name = _("MOLLY"), - .teamFlags = 0x12, - .greeting = { - .easyChat = { - EC_WORD_IS, - EC_WORD_TODAY, - EC_WORD_MONDAY, - EC_WORD_QUES, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BUG_MANIAC, - .name = _("JÖRG"), - .teamFlags = 0x40, - .greeting = { - .easyChat = { - EC_WORD_WATER, - 0xFFFF, - EC_WORD_AND, - EC_WORD_BUG, - 0xFFFF, - EC_WORD_POKEMON, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BATTLE_GIRL, - .name = _("ANKE"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_WHAT, - EC_WORD_IS, - EC_WORD_PRESSURE, - EC_WORD_STATIC, - EC_WORD_IS, - EC_WORD_SUPER, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_FISHERMAN, - .name = _("HANS"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_KID, - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_WORD_DON_T, - EC_WORD_WINS, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SAILOR, - .name = _("PETER"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_IT_S, - EC_WORD_QUITE, - EC_WORD_TERRIBLE, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_MODE, - EC_WORD_I, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_EXPERT_F, - .name = _("MARA"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_YOU_RE, - EC_WORD_VERY, - EC_WORD_ALL_RIGHT, - EC_WORD_TRAINS, - EC_WORD_OR, - EC_WORD_QUES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BUG_MANIAC, - .name = _("DARIUS"), - .teamFlags = 0x11, - .greeting = { - .easyChat = { - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_TOUGH, - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_SCARY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, - .name = _("REGINA"), - .teamFlags = 0x12, - .greeting = { - .easyChat = { - EC_WORD_TODAY, - EC_WORD_WIN, - EC_WORD_I, - EC_WORD_MAYBE, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PARASOL_LADY, - .name = _("MAIKE"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_SO, - EC_WORD_AN, - EC_MOVE(SCARY_FACE), - EC_WORD_IS, - EC_WORD_NOT_VERY, - EC_WORD_KIND, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, - .name = _("SANDRA"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_SPORTS, - EC_WORD_IS, - EC_WORD_HEALTHY, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_SPIRALING, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, - .name = _("ARNOLD"), - .teamFlags = 0x08, - .greeting = { - .easyChat = { - EC_WORD_AWESOME, - EC_WORD_WHO_WAS, - EC_WORD_POKEMON, - EC_WORD_THOSE, - EC_WORD_ROCK_SOLID, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BLACK_BELT, - .name = _("XENO"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_HOO_HAH, - EC_WORD_ARE, - EC_WORD_YOU, - EC_WORD_READY, - EC_WORD_FOR, - EC_WORD_SHADY, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, - .name = _("KARLA"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_YOU, - EC_WORD_CAN_T, - EC_WORD_ME, - EC_WORD_NEVER, - EC_WORD_SMITE, - EC_WORD_KID, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COLLECTOR, - .name = _("VOLKER"), - .teamFlags = 0x80, - .greeting = { - .easyChat = { - EC_WORD_FROM, - EC_WORD_PLACE, - EC_WORD_TO, - EC_WORD_PLACE, - EC_WORD_POKEMON, - EC_WORD_WOWEE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, - .name = _("TOBIAS"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_THAT, - EC_WORD_ISN_T, - EC_WORD_SPORTS, - EC_WORD_IT_S, - EC_WORD_A, - EC_WORD_FIGHTING, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GENTLEMAN, - .name = _("NORBERT"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_MUST_BE, - EC_WORD_WINS, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_PLEASE, - EC_WORD_PLEASE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BATTLE_GIRL, - .name = _("ZITA"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_THAT, - EC_WORD_IS, - EC_WORD_SCARY, - EC_WORD_PLEASE, - EC_WORD_BE, - EC_WORD_NICE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_BEAUTY, - .name = _("ELKE"), - .teamFlags = 0x20, - .greeting = { - .easyChat = { - EC_WORD_WITHOUT, - EC_MOVE(FLAIL), - EC_WORD_NONE, - EC_MOVE(WITHDRAW), - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_HIKER, - .name = _("VITUS"), - .teamFlags = 0x04, - .greeting = { - .easyChat = { - EC_WORD_YAHOO, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - EC_WORD_LISTENS, - EC_WORD_HER, - EC_WORD_TO, - EC_WORD_QUES, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_EXPERT_M, - .name = _("MALTE"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_LEARN, - EC_WORD_CORRECT, - EC_WORD_TO, - EC_WORD_FIGHT, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, - .name = _("TIM"), - .teamFlags = 0x40, - .greeting = { - .easyChat = { - EC_WORD_IT_S, - EC_WORD_A, - EC_WORD_FIGHTING, - EC_WORD_NONE, - EC_WORD_CHILD_S_PLAY, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_GUITARIST, - .name = _("GAVIN"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_SHADY, - EC_WORD_BABY, - EC_WORD_BABY, - EC_WORD_BABY, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_PSYCHIC_M, - .name = _("RALF"), - .teamFlags = 0x08, - .greeting = { - .easyChat = { - EC_WORD_STICKY_HOLD, - EC_WORD_THOSE, - EC_WORD_IMPORTANT, - EC_WORD_ISN_T_IT_QUES, - 0xFFFF, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, - .name = _("JENNY"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_I, - EC_WORD_SEARCH, - EC_WORD_TRAINER, - EC_WORD_ABSOLUTELY, - EC_WORD_TOUGH, - EC_WORD_THOSE, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_EXPERT_M, - .name = _("JOEL"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_BELIEVE, - EC_WORD_ON, - EC_WORD_YOURS, - EC_WORD_POKEMON, - EC_WORD_AND, - EC_WORD_WIN, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_DRAGON_TAMER, - .name = _("KOLJA"), - .teamFlags = 0x0C, - .greeting = { - .easyChat = { - EC_WORD_GIRL, - EC_WORD_WITH, - EC_MOVE2(FORESIGHT), - EC_WORD_THOSE, - EC_WORD_NICE, - 0xFFFF, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, - .name = _("BILL"), - .teamFlags = 0x01, - .greeting = { - .easyChat = { - EC_WORD_WHO_WAS, - EC_WORD_POWER, - EC_WORD_IS, - EC_WORD_OVERWHELMING, - EC_WORD_DISAPPEAR, - EC_WORD_BETTER, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_EXPERT_F, - .name = _("CALLA"), - .teamFlags = 0x10, - .greeting = { - .easyChat = { - EC_WORD_TRAINER, - EC_WORD_YOU, - EC_WORD_ARE, - EC_WORD_SEEMS, - EC_WORD_CAPABLE, - EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, - }, - }, - }, - { - .trainerClass = FACILITY_CLASS_LADY, - .name = _("GESA"), - .teamFlags = 0x02, - .greeting = { - .easyChat = { - EC_WORD_COME_ON, - EC_WORD_ABSOLUTELY, - EC_WORD_TIME, - EC_WORD_BECOMES, - EC_WORD_EXCELLENT, - 0xFFFF, - }, - }, - }, + { + .trainerClass = FACILITY_CLASS_YOUNGSTER, + .name = _("ALWIN"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_QUES, + EC_WORD_HERE_I_COME, + EC_WORD_EXCL, + }, + }, + { + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, + .name = _("DIRK"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_OH_KAY, + EC_WORD_I_AM, + EC_WORD_READY, + EC_WORD_EXCL, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_LADY, + .name = _("SIBILLE"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_THAT, + EC_WORD_BECOMES, + EC_WORD_A, + EC_WORD_CHILD_S_PLAY, + EC_WORD_GO, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_BLACK_BELT, + .name = _("OLAF"), + .teamFlags = 0x05, + .greeting = { + EC_WORD_MY, + EC_WORD_GHOST, + EC_WORD_IS, + EC_WORD_FULL, + EC_WORD_TOUGHNESS, + EC_WORD_SNORT, + }, + }, + { + .trainerClass = FACILITY_CLASS_NINJA_BOY, + .name = _("JOST"), + .teamFlags = 0x05, + .greeting = { + EC_WORD_GO, + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_FIGHT, + EC_WORD_FIGHT, + EC_WORD_FIGHT, + }, + }, + { + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, + .name = _("TINA"), + .teamFlags = 0x0A, + .greeting = { + EC_WORD_STUDY, + EC_WORD_IS, + EC_WORD_BORING, + EC_WORD_LET_S, + EC_WORD_BETTER, + EC_WORD_FIGHT, + }, + }, + { + .trainerClass = FACILITY_CLASS_BUG_MANIAC, + .name = _("HAJO"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_TOUGHNESS, + EC_WORD_AND, + EC_MOVE2(TRANSFORM), + EC_WORD_WILL, + EC_WORD_BABE, + EC_WORD_FAINT, + }, + }, + { + .trainerClass = FACILITY_CLASS_FISHERMAN, + .name = _("GEORG"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_IT, + EC_WORD_GOES, + EC_WORD_NOTHING, + EC_WORD_OVER, + EC_WORD_FISHING, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_TUBER_F, + .name = _("ANNE"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_POKEMON, + EC_WORD_MUST_BE, + EC_WORD_MAN, + EC_WORD_SIMPLE, + EC_WORD_ADORE, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEFAN_F, + .name = _("JULIA"), + .teamFlags = 0x42, + .greeting = { + EC_WORD_I_AM, + EC_WORD_CUTE, + EC_WORD_I_AM, + EC_WORD_QUITE, + EC_WORD_AN, + EC_WORD_LADY, + }, + }, + { + .trainerClass = FACILITY_CLASS_GENTLEMAN, + .name = _("JOHANN"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_THE, + EC_WORD_DAY, + EC_WORD_IS, + EC_WORD_PERFECT, + EC_WORD_FOR, + EC_WORD_BATTLE, + }, + }, + { + .trainerClass = FACILITY_CLASS_CAMPER, + .name = _("KARL"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_NOW, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_MY, + EC_WORD_FRIEND, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, + .name = _("KENDRA"), + .teamFlags = 0x0A, + .greeting = { + EC_WORD_I_AM, + EC_WORD_SMART, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_AND, + EC_WORD_YOU, + EC_WORD_QUES, + }, + }, + { + .trainerClass = FACILITY_CLASS_HIKER, + .name = _("DAVID"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_WAHAHAHA, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_TODAY, + EC_WORD_IS, + EC_MOVE2(PAY_DAY), + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, + .name = _("KEA"), + .teamFlags = 0x0A, + .greeting = { + EC_WORD_YOU_RE, + EC_WORD_TOUGH, + EC_WORD_OR, + EC_WORD_QUES, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_PSYCHIC_M, + .name = _("JULIAN"), + .teamFlags = 0x05, + .greeting = { + EC_WORD_FUFUFU, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_DON_T, + EC_WORD_WINS, + EC_WORD_KID, + }, + }, + { + .trainerClass = FACILITY_CLASS_LASS, + .name = _("JOSI"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_BE, + EC_WORD_KIND, + EC_WORD_TO, + EC_WORD_GIRL, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_GUITARIST, + .name = _("LEIF"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_I_AM, + EC_WORD_GREAT, + EC_WORD_YOU_RE, + EC_WORD_RATHER, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_OKAY, + }, + }, + { + .trainerClass = FACILITY_CLASS_RICH_BOY, + .name = _("INGO"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_I, + EC_WORD_HAVE, + EC_WORD_ROUGH_SKIN, + EC_WORD_NATURAL_CURE, + EC_WORD_IS, + EC_WORD_ALL_RIGHT, + }, + }, + { + .trainerClass = FACILITY_CLASS_BUG_CATCHER, + .name = _("LUDWIG"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_IF_I_WIN, + EC_WORD_IS, + EC_WORD_THAT, + EC_WORD_EXCITING, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_PICNICKER, + .name = _("RAJA"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_WITH, + EC_WORD_POKEMON, + EC_WORD_TO, + EC_WORD_WALKING, + EC_WORD_IS, + EC_WORD_GREAT, + }, + }, + { + .trainerClass = FACILITY_CLASS_COLLECTOR, + .name = _("HARALD"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_HERE_GOES, + EC_WORD_MY, + EC_WORD_HUGE_POWER, + 0xFFFF, + EC_WORD_POKEMON, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_TUBER_M, + .name = _("KIM"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_I_AM, + EC_WORD_A, + EC_WORD_GENIUS, + EC_WORD_WE, + EC_WORD_WILL, + EC_WORD_WINS, + }, + }, + { + .trainerClass = FACILITY_CLASS_KINDLER, + .name = _("ERWIN"), + .teamFlags = 0x05, + .greeting = { + EC_WORD_MY, + EC_WORD_FIRE, + EC_WORD_IS, + EC_WORD_VERY, + EC_WORD_HOT, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_PSYCHIC_F, + .name = _("EIKA"), + .teamFlags = 0x0A, + .greeting = { + EC_WORD_FIGHTING, + EC_MOVE(ASTONISH), + EC_WORD_AND, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMER_F, + .name = _("ANNINA"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_SORRY, + EC_WORD_YOURS, + EC_WORD_POKEMON, + EC_WORD_WILL, + EC_WORD_DON_T, + EC_WORD_WINS, + }, + }, + { + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, + .name = _("RUTH"), + .teamFlags = 0x06, + .greeting = { + EC_WORD_I_AM, + EC_WORD_TOUGH, + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_TOO, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMANIAC, + .name = _("JENS"), + .teamFlags = 0x40, + .greeting = { + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_THOSE, + EC_WORD_COOL, + EC_WORD_YOURS, + EC_WORD_LOSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_SAILOR, + .name = _("TITUS"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_MY, + EC_WORD_FOE, + EC_WORD_IS, + EC_WORD_FINALLY, + EC_WORD_HERE, + EC_WORD_EXCELLENT, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, + .name = _("NICOLA"), + .teamFlags = 0x06, + .greeting = { + EC_WORD_I_AM, + EC_WORD_VORACIOUS, + EC_MOVE2(POUND), + EC_WORD_AND, + EC_MOVE2(BELLY_DRUM), + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_HEX_MANIAC, + .name = _("PAULA"), + .teamFlags = 0x42, + .greeting = { + EC_WORD_IS_IT_QUES, + EC_WORD_THOSE_ARE, + EC_WORD_UGLY, + EC_MOVE(SPITE), + EC_WORD_TO, + EC_WORD_TAKE, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, + .name = _("SÖREN"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_ADVENTURE, + EC_WORD_AND, + EC_WORD_BATTLE, + EC_WORD_THOSE, + EC_WORD_WHO_WAS, + EC_WORD_LIKES, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("RAINER"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_WE, + EC_WORD_CAN, + EC_WORD_VERSUS, + EC_WORD_CHILDREN, + EC_WORD_DON_T, + EC_WORD_LOSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_SCHOOL_KID_M, + .name = _("FABIAN"), + .teamFlags = 0x08, + .greeting = { + EC_WORD_DAILY, + EC_WORD_POKEMON, + EC_WORD_IN, + EC_WORD_THE, + EC_WORD_SCHOOL, + EC_WORD_AWESOME, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, + .name = _("ELLEN"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_ALL_RIGHT, + EC_WORD_TO, + EC_WORD_POKEMON, + EC_WORD_QUES, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMER_M, + .name = _("ARNIE"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_MY, + EC_WORD_FIGHTING, + EC_WORD_IS, + EC_WORD_PERFECTION, + EC_WORD_YOUR, + EC_WORD_USELESS, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, + .name = _("HARDI"), + .teamFlags = 0x09, + .greeting = { + EC_WORD_BOY, + EC_WORD_I_AM, + EC_WORD_MAYBE, + EC_WORD_TIRED, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_BEAUTY, + .name = _("LINA"), + .teamFlags = 0x06, + .greeting = { + EC_WORD_A, + EC_WORD_TRAINER, + EC_WORD_HOW_DO, + EC_WORD_YOU, + EC_WORD_IS, + EC_WORD_EXCITING, + }, + }, + { + .trainerClass = FACILITY_CLASS_AROMA_LADY, + .name = _("SELINA"), + .teamFlags = 0x06, + .greeting = { + EC_WORD_YOU_VE, + EC_WORD_STENCH, + EC_WORD_OR, + EC_MOVE(SWEET_SCENT), + EC_WORD_QUES, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_COLLECTOR, + .name = _("DANTE"), + .teamFlags = 0x81, + .greeting = { + EC_WORD_YOURS, + EC_WORD_POKEMON, + EC_WORD_I, + EC_WORD_WANTS, + EC_WORD_SHE, + EC_WORD_EXCL_EXCL, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, + .name = _("KATJA"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_TODAY, + EC_WORD_WANTS, + EC_WORD_I, + EC_WORD_MY, + EC_WORD_BEST, + EC_WORD_GIVE, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, + .name = _("HORST"), + .teamFlags = 0x0C, + .greeting = { + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_EHEHE, + EC_MOVE(FAKE_TEARS), + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEFAN_M, + .name = _("GERRIT"), + .teamFlags = 0x80, + .greeting = { + EC_WORD_MY, + EC_WORD_ANIME, + EC_WORD_SONG, + EC_WORD_IS, + EC_WORD_DON_T, + EC_WORD_LOUSY, + }, + }, + { + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, + .name = _("NIKO"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_BATTLE, + EC_WORD_DON_T, + EC_WORD_JUST, + EC_WORD_DO, + EC_WORD_SOMETHING, + EC_WORD_ELSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, + .name = _("BALDO"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_BUSY, + EC_WORD_HAS, + EC_WORD_THAT, + EC_WORD_TIME, + }, + }, + { + .trainerClass = FACILITY_CLASS_PARASOL_LADY, + .name = _("ALMA"), + .teamFlags = 0x08, + .greeting = { + EC_WORD_THAT, + EC_MOVE(MORNING_SUN), + EC_WORD_HAS, + EC_WORD_SO, + EC_WORD_A_LOT, + EC_MOVE(COSMIC_POWER), + }, + }, + { + .trainerClass = FACILITY_CLASS_CAMPER, + .name = _("ADAM"), + .teamFlags = 0x0C, + .greeting = { + EC_WORD_EXCITING, + EC_WORD_BATTLE, + EC_WORD_THOSE, + EC_WORD_GREAT, + EC_WORD_YEEHAW_EXCL, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_SCHOOL_KID_F, + .name = _("GRETE"), + .teamFlags = 0x42, + .greeting = { + EC_WORD_I, + EC_WORD_WANTS, + EC_WORD_SOMETHING, + EC_MOVE(GROWTH), + EC_WORD_WORKS, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_BEAUTY, + .name = _("NAOMI"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_IT, + EC_WORD_WAS, + EC_WORD_GREAT, + EC_WORD_YOUNG, + EC_WORD_TO, + EC_WORD_HIS, + }, + }, + { + .trainerClass = FACILITY_CLASS_NINJA_BOY, + .name = _("KENO"), + .teamFlags = 0x0C, + .greeting = { + EC_WORD_PLEASE, + EC_WORD_BE, + EC_WORD_DON_T, + EC_WORD_SO, + EC_WORD_MEAN, + EC_WORD_TO_ME, + }, + }, + { + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, + .name = _("REMUS"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_WAKES_UP, + EC_MOVE2(HIDDEN_POWER), + EC_WORD_AND, + EC_MOVE(ASTONISH), + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_F, + .name = _("EDITH"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_THE, + EC_WORD_BATTLE_TOWER, + EC_WORD_IS, + EC_WORD_SO, + EC_WORD_ENTERTAINING, + EC_WORD_AWESOME, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUIN_MANIAC, + .name = _("ANTON"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_THICK_FAT, + EC_WORD_AND, + EC_WORD_CHLOROPHYLL, + EC_WORD_BLEND, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_TASTY, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMER_M, + .name = _("MALTE"), + .teamFlags = 0x81, + .greeting = { + EC_WORD_AN, + EC_MOVE(SCARY_FACE), + EC_WORD_IS, + EC_WORD_DON_T, + EC_WORD_QUITE, + EC_WORD_TERRIBLE, + }, + }, + { + .trainerClass = FACILITY_CLASS_HEX_MANIAC, + .name = _("RAOUL"), + .teamFlags = 0x42, + .greeting = { + EC_WORD_RUN_AWAY, + EC_WORD_GIVE_ME, + EC_WORD_SON, + EC_WORD_BEST, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, + .name = _("RICK"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_WATER, + EC_WORD_IS, + EC_WORD_TASTY, + EC_WORD_HIP_AND, + EC_WORD_REFRESHING, + EC_WORD_YES_SIR_EXCL, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEFAN_M, + .name = _("DENNIS"), + .teamFlags = 0x80, + .greeting = { + EC_WORD_GO, + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_PSYCHIC_F, + .name = _("GLORIA"), + .teamFlags = 0x82, + .greeting = { + EC_WORD_THE, + EC_WORD_FIGHTING, + EC_WORD_MUST_BE, + EC_WORD_HOT, + EC_WORD_HIS, + EC_WORD_FIERY, + }, + }, + { + .trainerClass = FACILITY_CLASS_GUITARIST, + .name = _("NINO"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_MUSIC, + EC_WORD_IS, + EC_WORD_MY, + EC_WORD_EVERY, + EC_WORD_MY, + EC_WORD_DESTINY, + }, + }, + { + .trainerClass = FACILITY_CLASS_KINDLER, + .name = _("FIETE"), + .teamFlags = 0x41, + .greeting = { + EC_WORD_IT_S, + EC_WORD_ALL_RIGHT, + EC_WORD_VERY, + EC_WORD_ALL_RIGHT, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_AROMA_LADY, + .name = _("AMANDA"), + .teamFlags = 0x82, + .greeting = { + EC_WORD_WHAT, + EC_WORD_FOR, + EC_WORD_A, + EC_WORD_TRAINER, + EC_WORD_ARE, + EC_WORD_YOU, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("MAREK"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_WE_VE, + EC_WORD_UNTIL, + EC_WORD_NOW, + EC_WORD_TOTALLY, + EC_WORD_NEVER, + EC_WORD_LOST, + }, + }, + { + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, + .name = _("NATHAN"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_DRAGON, + 0xFFFF, + EC_WORD_POKEMON, + EC_WORD_THOSE, + EC_WORD_FANTASTIC, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_LASS, + .name = _("MIRIAM"), + .teamFlags = 0x82, + .greeting = { + EC_WORD_YOU_RE, + EC_WORD_QUITE, + EC_WORD_TOO_STRONG, + EC_WORD_AM, + EC_WORD_BAD, + EC_WORD_NEWS, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMANIAC, + .name = _("THEO"), + .teamFlags = 0x40, + .greeting = { + EC_WORD_PLUSH_DOLL, + EC_WORD_MUST_BE, + EC_WORD_MAN, + EC_WORD_SIMPLE, + EC_WORD_ADORE, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_F, + .name = _("PIA"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_HERE_I_COME, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_CUTE, + EC_WORD_A, + EC_WORD_CHANNEL, + EC_WORD_IDOL, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEFAN_F, + .name = _("ALISSA"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_YOURS, + EC_WORD_POKEMON, + EC_WORD_THOSE, + EC_WORD_PREPOSTEROUS, + EC_WORD_I_AM, + EC_WORD_SHOCKED, + }, + }, + { + .trainerClass = FACILITY_CLASS_GENTLEMAN, + .name = _("ARTUR"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_PLEASE, + EC_WORD_ALL, + EC_WORD_BATTLE, + EC_WORD_WEREN_T, + EC_WORD_GREAT, + EC_WORD_HIS, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMER_F, + .name = _("MAJA"), + .teamFlags = 0x82, + .greeting = { + EC_WORD_I_AM, + EC_WORD_PRETTY, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_DON_T, + EC_WORD_WINS, + }, + }, + { + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, + .name = _("MARIUS"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_I, + EC_WORD_BATTLE, + EC_WORD_DAILY, + EC_WORD_I, + EC_WORD_WON_T, + EC_WORD_LOSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_BIRD_KEEPER, + .name = _("OLIVER"), + .teamFlags = 0x11, + .greeting = { + EC_WORD_GIGGLE, + EC_WORD_GIGGLE, + EC_WORD_SNORT, + EC_WORD_HAPPILY, + EC_WORD_GIGGLE, + EC_WORD_MUFUFU, + }, + }, + { + .trainerClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, + .name = _("MOLLY"), + .teamFlags = 0x12, + .greeting = { + EC_WORD_IS, + EC_WORD_TODAY, + EC_WORD_MONDAY, + EC_WORD_QUES, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_BUG_MANIAC, + .name = _("JÖRG"), + .teamFlags = 0x40, + .greeting = { + EC_WORD_WATER, + 0xFFFF, + EC_WORD_AND, + EC_WORD_BUG, + 0xFFFF, + EC_WORD_POKEMON, + }, + }, + { + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, + .name = _("ANKE"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_WHAT, + EC_WORD_IS, + EC_WORD_PRESSURE, + EC_WORD_STATIC, + EC_WORD_IS, + EC_WORD_SUPER, + }, + }, + { + .trainerClass = FACILITY_CLASS_FISHERMAN, + .name = _("HANS"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_KID, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_DON_T, + EC_WORD_WINS, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_SAILOR, + .name = _("PETER"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_IT_S, + EC_WORD_QUITE, + EC_WORD_TERRIBLE, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_MODE, + EC_WORD_I, + }, + }, + { + .trainerClass = FACILITY_CLASS_EXPERT_F, + .name = _("MARA"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_YOU_RE, + EC_WORD_VERY, + EC_WORD_ALL_RIGHT, + EC_WORD_TRAINS, + EC_WORD_OR, + EC_WORD_QUES, + }, + }, + { + .trainerClass = FACILITY_CLASS_BUG_MANIAC, + .name = _("DARIUS"), + .teamFlags = 0x11, + .greeting = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_TOUGH, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_SCARY, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_F, + .name = _("REGINA"), + .teamFlags = 0x12, + .greeting = { + EC_WORD_TODAY, + EC_WORD_WIN, + EC_WORD_I, + EC_WORD_MAYBE, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_PARASOL_LADY, + .name = _("MAIKE"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_SO, + EC_WORD_AN, + EC_MOVE(SCARY_FACE), + EC_WORD_IS, + EC_WORD_NOT_VERY, + EC_WORD_KIND, + }, + }, + { + .trainerClass = FACILITY_CLASS_RUNNING_TRIATHLETE_F, + .name = _("SANDRA"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_SPORTS, + EC_WORD_IS, + EC_WORD_HEALTHY, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_SPIRALING, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_RANGER_M, + .name = _("ARNOLD"), + .teamFlags = 0x08, + .greeting = { + EC_WORD_AWESOME, + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_THOSE, + EC_WORD_ROCK_SOLID, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_BLACK_BELT, + .name = _("XENO"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_HOO_HAH, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_FOR, + EC_WORD_SHADY, + }, + }, + { + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, + .name = _("KARLA"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_ME, + EC_WORD_NEVER, + EC_WORD_SMITE, + EC_WORD_KID, + }, + }, + { + .trainerClass = FACILITY_CLASS_COLLECTOR, + .name = _("VOLKER"), + .teamFlags = 0x80, + .greeting = { + EC_WORD_FROM, + EC_WORD_PLACE, + EC_WORD_TO, + EC_WORD_PLACE, + EC_WORD_POKEMON, + EC_WORD_WOWEE, + }, + }, + { + .trainerClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("TOBIAS"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_THAT, + EC_WORD_ISN_T, + EC_WORD_SPORTS, + EC_WORD_IT_S, + EC_WORD_A, + EC_WORD_FIGHTING, + }, + }, + { + .trainerClass = FACILITY_CLASS_GENTLEMAN, + .name = _("NORBERT"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_I, + EC_WORD_MUST_BE, + EC_WORD_WINS, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_PLEASE, + EC_WORD_PLEASE, + }, + }, + { + .trainerClass = FACILITY_CLASS_BATTLE_GIRL, + .name = _("ZITA"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_THAT, + EC_WORD_IS, + EC_WORD_SCARY, + EC_WORD_PLEASE, + EC_WORD_BE, + EC_WORD_NICE, + }, + }, + { + .trainerClass = FACILITY_CLASS_BEAUTY, + .name = _("ELKE"), + .teamFlags = 0x20, + .greeting = { + EC_WORD_WITHOUT, + EC_MOVE(FLAIL), + EC_WORD_NONE, + EC_MOVE(WITHDRAW), + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_HIKER, + .name = _("VITUS"), + .teamFlags = 0x04, + .greeting = { + EC_WORD_YAHOO, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_LISTENS, + EC_WORD_HER, + EC_WORD_TO, + EC_WORD_QUES, + }, + }, + { + .trainerClass = FACILITY_CLASS_EXPERT_M, + .name = _("MALTE"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_LEARN, + EC_WORD_CORRECT, + EC_WORD_TO, + EC_WORD_FIGHT, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_POKEMON_BREEDER_M, + .name = _("TIM"), + .teamFlags = 0x40, + .greeting = { + EC_WORD_IT_S, + EC_WORD_A, + EC_WORD_FIGHTING, + EC_WORD_NONE, + EC_WORD_CHILD_S_PLAY, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + }, + }, + { + .trainerClass = FACILITY_CLASS_GUITARIST, + .name = _("GAVIN"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_SHADY, + EC_WORD_BABY, + EC_WORD_BABY, + EC_WORD_BABY, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_PSYCHIC_M, + .name = _("RALF"), + .teamFlags = 0x08, + .greeting = { + EC_WORD_STICKY_HOLD, + EC_WORD_THOSE, + EC_WORD_IMPORTANT, + EC_WORD_ISN_T_IT_QUES, + 0xFFFF, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_COOL_TRAINER_F, + .name = _("JENNY"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_I, + EC_WORD_SEARCH, + EC_WORD_TRAINER, + EC_WORD_ABSOLUTELY, + EC_WORD_TOUGH, + EC_WORD_THOSE, + }, + }, + { + .trainerClass = FACILITY_CLASS_EXPERT_M, + .name = _("JOEL"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_BELIEVE, + EC_WORD_ON, + EC_WORD_YOURS, + EC_WORD_POKEMON, + EC_WORD_AND, + EC_WORD_WIN, + }, + }, + { + .trainerClass = FACILITY_CLASS_DRAGON_TAMER, + .name = _("KOLJA"), + .teamFlags = 0x0C, + .greeting = { + EC_WORD_GIRL, + EC_WORD_WITH, + EC_MOVE2(FORESIGHT), + EC_WORD_THOSE, + EC_WORD_NICE, + 0xFFFF, + }, + }, + { + .trainerClass = FACILITY_CLASS_COOL_TRAINER_M, + .name = _("BILL"), + .teamFlags = 0x01, + .greeting = { + EC_WORD_WHO_WAS, + EC_WORD_POWER, + EC_WORD_IS, + EC_WORD_OVERWHELMING, + EC_WORD_DISAPPEAR, + EC_WORD_BETTER, + }, + }, + { + .trainerClass = FACILITY_CLASS_EXPERT_F, + .name = _("CALLA"), + .teamFlags = 0x10, + .greeting = { + EC_WORD_TRAINER, + EC_WORD_YOU, + EC_WORD_ARE, + EC_WORD_SEEMS, + EC_WORD_CAPABLE, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + }, + }, + { + .trainerClass = FACILITY_CLASS_LADY, + .name = _("GESA"), + .teamFlags = 0x02, + .greeting = { + EC_WORD_COME_ON, + EC_WORD_ABSOLUTELY, + EC_WORD_TIME, + EC_WORD_BECOMES, + EC_WORD_EXCELLENT, + 0xFFFF, + }, + }, }; diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c index 8d8498d45..d4dbba120 100644 --- a/src/field/battle_tower.c +++ b/src/field/battle_tower.c @@ -1521,9 +1521,9 @@ void PrintBattleTowerTrainerGreeting(void) if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting); else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting.easyChat); + PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting); else - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting.easyChat); + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting); } void sub_81354CC(void) @@ -1792,7 +1792,7 @@ void sub_8135AC4(void) playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); for (i = 0; i < 6; i++) - playerRecord->greeting.easyChat[i] = gSaveBlock1.easyChats.unk2B28[i]; + playerRecord->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; for (i = 0; i < 3; i++) sub_803AF78(&gUnknown_030042FC[gSaveBlock2.battleTower.selectedPartyMons[i]], &playerRecord->party[i]); -- cgit v1.2.3 From e74b0c6e51796d2c8c7fab6ef22f75d15a6c8786 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 17 Feb 2018 22:14:41 -0500 Subject: take your stupid fucking politically correct names since you dont care about authenticity --- src/easy_chat_2.c | 2 +- src/engine/naming_screen.c | 2 +- src/field/berry.c | 2 +- src/field/berry_tag_screen.c | 2 +- src/field/bike.c | 2 +- src/field/event_object_movement.c | 10019 ++++++++++++++++++++++++++++++++++++ src/field/evobjmv.c | 10017 ----------------------------------- src/field/field_effect.c | 2 +- src/field/field_effect_helpers.c | 2 +- src/field/field_fadetransition.c | 2 +- src/field/field_player_avatar.c | 2 +- src/field/field_special_scene.c | 2 +- src/field/field_specials.c | 2 +- src/field/field_weather.c | 2 +- src/field/field_weather_effects.c | 2 +- src/field/fldeff_berrytree.c | 2 +- src/field/fldeff_cut.c | 2 +- src/field/fldeff_decoration.c | 2 +- src/field/fldeff_recordmixing.c | 2 +- src/field/item_menu.c | 2 +- src/field/map_obj_lock.c | 2 +- src/field/overworld.c | 2 +- src/field/rotating_gate.c | 2 +- src/field/scrcmd.c | 2 +- src/field/script_movement.c | 2 +- src/field/shop.c | 2 +- src/field/trainer_see.c | 2 +- src/field/tv.c | 2 +- src/rom6.c | 2 +- src/scene/cable_car.c | 2 +- 30 files changed, 10047 insertions(+), 10045 deletions(-) create mode 100644 src/field/event_object_movement.c delete mode 100644 src/field/evobjmv.c (limited to 'src') diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c index 481bc66c5..ed6a97ba2 100644 --- a/src/easy_chat_2.c +++ b/src/easy_chat_2.c @@ -5,7 +5,7 @@ #include "decompress.h" #include "easy_chat.h" #include "event_data.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_message_box.h" #include "graphics.h" #include "menu.h" diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c index 5cb06d56f..59b9b4d84 100644 --- a/src/engine/naming_screen.c +++ b/src/engine/naming_screen.c @@ -3,7 +3,7 @@ #include "data2.h" #include "graphics.h" #include "field_effect.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "main.h" #include "menu.h" diff --git a/src/field/berry.c b/src/field/berry.c index cdfeb57af..33effb4ce 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -1,7 +1,7 @@ #include "global.h" #include "berry.h" #include "field_control_avatar.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "fieldmap.h" #include "item.h" #include "item_menu.h" diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c index ea4a3df05..9fbfd0681 100644 --- a/src/field/berry_tag_screen.c +++ b/src/field/berry_tag_screen.c @@ -2,7 +2,7 @@ #include "berry_tag_screen.h" #include "berry.h" #include "decompress.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "item_menu.h" #include "constants/items.h" #include "item_use.h" diff --git a/src/field/bike.c b/src/field/bike.c index a81aa395b..28439e6bb 100644 --- a/src/field/bike.c +++ b/src/field/bike.c @@ -1,6 +1,6 @@ #include "global.h" #include "bike.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "constants/flags.h" diff --git a/src/field/event_object_movement.c b/src/field/event_object_movement.c new file mode 100644 index 000000000..1236cd9b6 --- /dev/null +++ b/src/field/event_object_movement.c @@ -0,0 +1,10019 @@ +#include "global.h" +#include "event_object_movement.h" +#include "berry.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "palette.h" +#include "random.h" +#include "overworld.h" +#include "sprite.h" +#include "metatile_behavior.h" +#include "constants/maps.h" +#include "constants/map_objects.h" +#include "trainer_see.h" + +// this file was known as evobjmv.c in Game Freak's original source + +// rodata + +const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; + +void ObjectCB_CameraObject(struct Sprite *sprite); +const struct SpriteTemplate gSpriteTemplate_830FD24 = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; + +void CameraObject_0(struct Sprite *); +void CameraObject_1(struct Sprite *); +void CameraObject_2(struct Sprite *); +void (*const gCameraObjectFuncs[])(struct Sprite *) = { + CameraObject_0, + CameraObject_1, + CameraObject_2, +}; + +const u32 gMapObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/00.4bpp"); +const u32 gMapObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/01.4bpp"); +const u32 gMapObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/02.4bpp"); +const u32 gMapObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/03.4bpp"); +const u32 gMapObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/04.4bpp"); +const u32 gMapObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/05.4bpp"); +const u32 gMapObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/06.4bpp"); +const u32 gMapObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/07.4bpp"); +const u32 gMapObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/08.4bpp"); +const u32 gMapObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/09.4bpp"); +const u32 gMapObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/10.4bpp"); +const u32 gMapObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/11.4bpp"); +const u32 gMapObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/12.4bpp"); +const u32 gMapObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/13.4bpp"); +const u32 gMapObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/14.4bpp"); +const u32 gMapObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/15.4bpp"); +const u32 gMapObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/16.4bpp"); +const u32 gMapObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/17.4bpp"); +const u16 gMapObjectPalette8[] = INCBIN_U16("graphics/map_objects/palettes/08.gbapal"); +const u16 NullPalette_8310F68[16] = {}; +const u16 NullPalette_8310F88[16] = {}; +const u16 NullPalette_8310FA8[16] = {}; +const u16 NullPalette_8310FC8[16] = {}; +const u16 NullPalette_8310FE8[16] = {}; +const u16 NullPalette_8311008[16] = {}; +const u16 NullPalette_8311028[16] = {}; +const u16 NullPalette_8311048[16] = {}; +const u16 NullPalette_8311068[16] = {}; +const u16 NullPalette_8311088[16] = {}; +const u16 NullPalette_83110A8[16] = {}; +const u16 NullPalette_83110C8[16] = {}; +const u16 NullPalette_83110E8[16] = {}; +const u16 NullPalette_8311108[16] = {}; +const u16 NullPalette_8311128[16] = {}; +const u16 gMapObjectPalette9[] = INCBIN_U16("graphics/map_objects/palettes/09.gbapal"); +const u16 gMapObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/10.gbapal"); +const u32 gMapObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/0.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/1.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/2.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/3.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/4.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/0.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/3.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/1.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/4.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/2.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/5.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/0.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/1.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/2.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/3.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/4.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/5.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/6.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/7.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/8.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/00.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/01.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/02.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/03.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/04.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/05.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/06.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/07.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/08.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/09.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/10.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/11.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/12.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/13.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/14.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/15.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/16.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/17.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/18.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/19.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/20.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/21.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/22.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/23.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/24.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/25.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/26.4bpp"); +const u32 gMapObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/00.4bpp"); +const u32 gMapObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/01.4bpp"); +const u32 gMapObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/02.4bpp"); +const u32 gMapObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/03.4bpp"); +const u32 gMapObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/04.4bpp"); +const u32 gMapObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/05.4bpp"); +const u32 gMapObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/06.4bpp"); +const u32 gMapObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/07.4bpp"); +const u32 gMapObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/08.4bpp"); +const u32 gMapObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/09.4bpp"); +const u32 gMapObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/10.4bpp"); +const u32 gMapObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/11.4bpp"); +const u32 gMapObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/0.4bpp"); +const u32 gMapObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/3.4bpp"); +const u32 gMapObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/1.4bpp"); +const u32 gMapObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/4.4bpp"); +const u32 gMapObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/2.4bpp"); +const u32 gMapObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/5.4bpp"); +const u32 gMapObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/decorating.4bpp"); +const u32 gMapObjectPic_MayDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/may/decorating.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/0.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/1.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/2.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/3.4bpp"); +const u32 gMapObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/0.4bpp"); +const u32 gMapObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/1.4bpp"); +const u32 gMapObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/2.4bpp"); +const u32 gMapObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/3.4bpp"); +const u16 gMapObjectPalette11[] = INCBIN_U16("graphics/map_objects/palettes/11.gbapal"); +const u32 gMapObjectPic_MayNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/00.4bpp"); +const u32 gMapObjectPic_MayNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/01.4bpp"); +const u32 gMapObjectPic_MayNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/02.4bpp"); +const u32 gMapObjectPic_MayNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/03.4bpp"); +const u32 gMapObjectPic_MayNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/04.4bpp"); +const u32 gMapObjectPic_MayNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/05.4bpp"); +const u32 gMapObjectPic_MayNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/06.4bpp"); +const u32 gMapObjectPic_MayNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/07.4bpp"); +const u32 gMapObjectPic_MayNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/08.4bpp"); +const u32 gMapObjectPic_MayNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/09.4bpp"); +const u32 gMapObjectPic_MayNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/10.4bpp"); +const u32 gMapObjectPic_MayNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/11.4bpp"); +const u32 gMapObjectPic_MayNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/12.4bpp"); +const u32 gMapObjectPic_MayNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/13.4bpp"); +const u32 gMapObjectPic_MayNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/14.4bpp"); +const u32 gMapObjectPic_MayNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/15.4bpp"); +const u32 gMapObjectPic_MayNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/16.4bpp"); +const u32 gMapObjectPic_MayNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/17.4bpp"); +const u16 gMapObjectPalette17[] = INCBIN_U16("graphics/map_objects/palettes/17.gbapal"); +const u16 gMapObjectPalette18[] = INCBIN_U16("graphics/map_objects/palettes/18.gbapal"); +const u16 NullPalette_831B7E8[16] = {}; +const u16 NullPalette_831B808[16] = {}; +const u16 NullPalette_831B828[16] = {}; +const u16 NullPalette_831B848[16] = {}; +const u16 NullPalette_831B868[16] = {}; +const u16 NullPalette_831B888[16] = {}; +const u16 NullPalette_831B8A8[16] = {}; +const u16 NullPalette_831B8C8[16] = {}; +const u16 NullPalette_831B8E8[16] = {}; +const u16 NullPalette_831B908[16] = {}; +const u16 NullPalette_831B928[16] = {}; +const u16 NullPalette_831B948[16] = {}; +const u16 NullPalette_831B968[16] = {}; +const u16 NullPalette_831B988[16] = {}; +const u32 gMapObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/0.4bpp"); +const u32 gMapObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/1.4bpp"); +const u32 gMapObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/2.4bpp"); +const u32 gMapObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/3.4bpp"); +const u32 gMapObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/4.4bpp"); +const u32 gMapObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/5.4bpp"); +const u32 gMapObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/6.4bpp"); +const u32 gMapObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/7.4bpp"); +const u32 gMapObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/8.4bpp"); +const u32 gMapObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/00.4bpp"); +const u32 gMapObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/01.4bpp"); +const u32 gMapObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/02.4bpp"); +const u32 gMapObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/03.4bpp"); +const u32 gMapObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/04.4bpp"); +const u32 gMapObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/05.4bpp"); +const u32 gMapObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/06.4bpp"); +const u32 gMapObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/07.4bpp"); +const u32 gMapObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/08.4bpp"); +const u32 gMapObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/09.4bpp"); +const u32 gMapObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/10.4bpp"); +const u32 gMapObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/11.4bpp"); +const u32 gMapObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/12.4bpp"); +const u32 gMapObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/13.4bpp"); +const u32 gMapObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/14.4bpp"); +const u32 gMapObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/15.4bpp"); +const u32 gMapObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/16.4bpp"); +const u32 gMapObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/17.4bpp"); +const u32 gMapObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/18.4bpp"); +const u32 gMapObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/19.4bpp"); +const u32 gMapObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/20.4bpp"); +const u32 gMapObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/21.4bpp"); +const u32 gMapObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/22.4bpp"); +const u32 gMapObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/23.4bpp"); +const u32 gMapObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/24.4bpp"); +const u32 gMapObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/25.4bpp"); +const u32 gMapObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/26.4bpp"); +const u32 gMapObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/0.4bpp"); +const u32 gMapObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/3.4bpp"); +const u32 gMapObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/1.4bpp"); +const u32 gMapObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/4.4bpp"); +const u32 gMapObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/2.4bpp"); +const u32 gMapObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/5.4bpp"); +const u32 gMapObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/0.4bpp"); +const u32 gMapObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/1.4bpp"); +const u32 gMapObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/2.4bpp"); +const u32 gMapObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/3.4bpp"); +const u32 gMapObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/4.4bpp"); +const u32 gMapObjectPic_MayFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/00.4bpp"); +const u32 gMapObjectPic_MayFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/01.4bpp"); +const u32 gMapObjectPic_MayFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/02.4bpp"); +const u32 gMapObjectPic_MayFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/03.4bpp"); +const u32 gMapObjectPic_MayFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/04.4bpp"); +const u32 gMapObjectPic_MayFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/05.4bpp"); +const u32 gMapObjectPic_MayFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/06.4bpp"); +const u32 gMapObjectPic_MayFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/07.4bpp"); +const u32 gMapObjectPic_MayFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/08.4bpp"); +const u32 gMapObjectPic_MayFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/09.4bpp"); +const u32 gMapObjectPic_MayFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/10.4bpp"); +const u32 gMapObjectPic_MayFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/11.4bpp"); +const u32 gMapObjectPic_MayWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/0.4bpp"); +const u32 gMapObjectPic_MayWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/3.4bpp"); +const u32 gMapObjectPic_MayWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/1.4bpp"); +const u32 gMapObjectPic_MayWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/4.4bpp"); +const u32 gMapObjectPic_MayWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/2.4bpp"); +const u32 gMapObjectPic_MayWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/5.4bpp"); +const u16 gMapObjectPalette0[] = INCBIN_U16("graphics/map_objects/palettes/00.gbapal"); +const u16 gMapObjectPalette1[] = INCBIN_U16("graphics/map_objects/palettes/01.gbapal"); +const u16 gMapObjectPalette2[] = INCBIN_U16("graphics/map_objects/palettes/02.gbapal"); +const u16 gMapObjectPalette3[] = INCBIN_U16("graphics/map_objects/palettes/03.gbapal"); +const u16 gMapObjectPalette4[] = INCBIN_U16("graphics/map_objects/palettes/04.gbapal"); +const u16 gMapObjectPalette5[] = INCBIN_U16("graphics/map_objects/palettes/05.gbapal"); +const u16 gMapObjectPalette6[] = INCBIN_U16("graphics/map_objects/palettes/06.gbapal"); +const u16 gMapObjectPalette7[] = INCBIN_U16("graphics/map_objects/palettes/07.gbapal"); +const u32 gMapObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/0.4bpp"); +const u32 gMapObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/1.4bpp"); +const u32 gMapObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/2.4bpp"); +const u32 gMapObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/3.4bpp"); +const u32 gMapObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/4.4bpp"); +const u32 gMapObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/5.4bpp"); +const u32 gMapObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/6.4bpp"); +const u32 gMapObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/7.4bpp"); +const u32 gMapObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/8.4bpp"); +const u32 gMapObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/0.4bpp"); +const u32 gMapObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/1.4bpp"); +const u32 gMapObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/2.4bpp"); +const u32 gMapObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/3.4bpp"); +const u32 gMapObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/4.4bpp"); +const u32 gMapObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/5.4bpp"); +const u32 gMapObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/6.4bpp"); +const u32 gMapObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/7.4bpp"); +const u32 gMapObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/8.4bpp"); +const u32 gMapObjectPic_Boy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/0.4bpp"); +const u32 gMapObjectPic_Boy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/1.4bpp"); +const u32 gMapObjectPic_Boy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/2.4bpp"); +const u32 gMapObjectPic_Boy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/3.4bpp"); +const u32 gMapObjectPic_Boy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/4.4bpp"); +const u32 gMapObjectPic_Boy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/5.4bpp"); +const u32 gMapObjectPic_Boy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/6.4bpp"); +const u32 gMapObjectPic_Boy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/7.4bpp"); +const u32 gMapObjectPic_Boy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/8.4bpp"); +const u32 gMapObjectPic_Girl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/0.4bpp"); +const u32 gMapObjectPic_Girl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/1.4bpp"); +const u32 gMapObjectPic_Girl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/2.4bpp"); +const u32 gMapObjectPic_Girl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/3.4bpp"); +const u32 gMapObjectPic_Girl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/4.4bpp"); +const u32 gMapObjectPic_Girl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/5.4bpp"); +const u32 gMapObjectPic_Girl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/6.4bpp"); +const u32 gMapObjectPic_Girl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/7.4bpp"); +const u32 gMapObjectPic_Girl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/8.4bpp"); +const u32 gMapObjectPic_Boy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/0.4bpp"); +const u32 gMapObjectPic_Boy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/1.4bpp"); +const u32 gMapObjectPic_Boy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/2.4bpp"); +const u32 gMapObjectPic_Boy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/3.4bpp"); +const u32 gMapObjectPic_Boy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/4.4bpp"); +const u32 gMapObjectPic_Boy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/5.4bpp"); +const u32 gMapObjectPic_Boy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/6.4bpp"); +const u32 gMapObjectPic_Boy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/7.4bpp"); +const u32 gMapObjectPic_Boy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/8.4bpp"); +const u32 gMapObjectPic_Girl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/0.4bpp"); +const u32 gMapObjectPic_Girl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/1.4bpp"); +const u32 gMapObjectPic_Girl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/2.4bpp"); +const u32 gMapObjectPic_Girl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/3.4bpp"); +const u32 gMapObjectPic_Girl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/4.4bpp"); +const u32 gMapObjectPic_Girl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/5.4bpp"); +const u32 gMapObjectPic_Girl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/6.4bpp"); +const u32 gMapObjectPic_Girl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/7.4bpp"); +const u32 gMapObjectPic_Girl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/8.4bpp"); +const u32 gMapObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/0.4bpp"); +const u32 gMapObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/1.4bpp"); +const u32 gMapObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/2.4bpp"); +const u32 gMapObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/3.4bpp"); +const u32 gMapObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/4.4bpp"); +const u32 gMapObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/5.4bpp"); +const u32 gMapObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/6.4bpp"); +const u32 gMapObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/7.4bpp"); +const u32 gMapObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/8.4bpp"); +const u32 gMapObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/0.4bpp"); +const u32 gMapObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/1.4bpp"); +const u32 gMapObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/2.4bpp"); +const u32 gMapObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/3.4bpp"); +const u32 gMapObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/4.4bpp"); +const u32 gMapObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/5.4bpp"); +const u32 gMapObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/6.4bpp"); +const u32 gMapObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/7.4bpp"); +const u32 gMapObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/8.4bpp"); +const u32 gMapObjectPic_Boy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/0.4bpp"); +const u32 gMapObjectPic_Boy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/1.4bpp"); +const u32 gMapObjectPic_Boy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/2.4bpp"); +const u32 gMapObjectPic_Boy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/3.4bpp"); +const u32 gMapObjectPic_Boy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/4.4bpp"); +const u32 gMapObjectPic_Boy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/5.4bpp"); +const u32 gMapObjectPic_Boy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/6.4bpp"); +const u32 gMapObjectPic_Boy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/7.4bpp"); +const u32 gMapObjectPic_Boy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/8.4bpp"); +const u32 gMapObjectPic_Girl3_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/0.4bpp"); +const u32 gMapObjectPic_Girl3_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/1.4bpp"); +const u32 gMapObjectPic_Girl3_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/2.4bpp"); +const u32 gMapObjectPic_Girl3_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/3.4bpp"); +const u32 gMapObjectPic_Girl3_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/4.4bpp"); +const u32 gMapObjectPic_Girl3_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/5.4bpp"); +const u32 gMapObjectPic_Girl3_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/6.4bpp"); +const u32 gMapObjectPic_Girl3_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/7.4bpp"); +const u32 gMapObjectPic_Girl3_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/8.4bpp"); +const u32 gMapObjectPic_Boy4_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/0.4bpp"); +const u32 gMapObjectPic_Boy4_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/1.4bpp"); +const u32 gMapObjectPic_Boy4_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/2.4bpp"); +const u32 gMapObjectPic_Boy4_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/3.4bpp"); +const u32 gMapObjectPic_Boy4_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/4.4bpp"); +const u32 gMapObjectPic_Boy4_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/5.4bpp"); +const u32 gMapObjectPic_Boy4_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/6.4bpp"); +const u32 gMapObjectPic_Boy4_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/7.4bpp"); +const u32 gMapObjectPic_Boy4_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/8.4bpp"); +const u32 gMapObjectPic_Woman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/0.4bpp"); +const u32 gMapObjectPic_Woman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/1.4bpp"); +const u32 gMapObjectPic_Woman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/2.4bpp"); +const u32 gMapObjectPic_Woman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/3.4bpp"); +const u32 gMapObjectPic_Woman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/4.4bpp"); +const u32 gMapObjectPic_Woman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/5.4bpp"); +const u32 gMapObjectPic_Woman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/6.4bpp"); +const u32 gMapObjectPic_Woman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/7.4bpp"); +const u32 gMapObjectPic_Woman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/8.4bpp"); +const u32 gMapObjectPic_FatMan_0[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/0.4bpp"); +const u32 gMapObjectPic_FatMan_1[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/1.4bpp"); +const u32 gMapObjectPic_FatMan_2[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/2.4bpp"); +const u32 gMapObjectPic_FatMan_3[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/3.4bpp"); +const u32 gMapObjectPic_FatMan_4[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/4.4bpp"); +const u32 gMapObjectPic_FatMan_5[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/5.4bpp"); +const u32 gMapObjectPic_FatMan_6[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/6.4bpp"); +const u32 gMapObjectPic_FatMan_7[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/7.4bpp"); +const u32 gMapObjectPic_FatMan_8[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/8.4bpp"); +const u32 gMapObjectPic_Woman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/0.4bpp"); +const u32 gMapObjectPic_Woman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/1.4bpp"); +const u32 gMapObjectPic_Woman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/2.4bpp"); +const u32 gMapObjectPic_Woman2_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/3.4bpp"); +const u32 gMapObjectPic_Woman2_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/4.4bpp"); +const u32 gMapObjectPic_Woman2_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/5.4bpp"); +const u32 gMapObjectPic_Woman2_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/6.4bpp"); +const u32 gMapObjectPic_Woman2_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/7.4bpp"); +const u32 gMapObjectPic_Woman2_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/8.4bpp"); +const u32 gMapObjectPic_Man1_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/0.4bpp"); +const u32 gMapObjectPic_Man1_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/1.4bpp"); +const u32 gMapObjectPic_Man1_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/2.4bpp"); +const u32 gMapObjectPic_Man1_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/3.4bpp"); +const u32 gMapObjectPic_Man1_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/4.4bpp"); +const u32 gMapObjectPic_Man1_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/5.4bpp"); +const u32 gMapObjectPic_Man1_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/6.4bpp"); +const u32 gMapObjectPic_Man1_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/7.4bpp"); +const u32 gMapObjectPic_Man1_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/8.4bpp"); +const u32 gMapObjectPic_Woman3_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/0.4bpp"); +const u32 gMapObjectPic_Woman3_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/1.4bpp"); +const u32 gMapObjectPic_Woman3_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/2.4bpp"); +const u32 gMapObjectPic_Woman3_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/3.4bpp"); +const u32 gMapObjectPic_Woman3_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/4.4bpp"); +const u32 gMapObjectPic_Woman3_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/5.4bpp"); +const u32 gMapObjectPic_Woman3_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/6.4bpp"); +const u32 gMapObjectPic_Woman3_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/7.4bpp"); +const u32 gMapObjectPic_Woman3_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/8.4bpp"); +const u32 gMapObjectPic_OldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/0.4bpp"); +const u32 gMapObjectPic_OldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/1.4bpp"); +const u32 gMapObjectPic_OldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/2.4bpp"); +const u32 gMapObjectPic_OldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/3.4bpp"); +const u32 gMapObjectPic_OldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/4.4bpp"); +const u32 gMapObjectPic_OldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/5.4bpp"); +const u32 gMapObjectPic_OldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/6.4bpp"); +const u32 gMapObjectPic_OldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/7.4bpp"); +const u32 gMapObjectPic_OldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/8.4bpp"); +const u32 gMapObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/0.4bpp"); +const u32 gMapObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/1.4bpp"); +const u32 gMapObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/2.4bpp"); +const u32 gMapObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/3.4bpp"); +const u32 gMapObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/4.4bpp"); +const u32 gMapObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/5.4bpp"); +const u32 gMapObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/6.4bpp"); +const u32 gMapObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/7.4bpp"); +const u32 gMapObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/8.4bpp"); +const u32 gMapObjectPic_Man2_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/0.4bpp"); +const u32 gMapObjectPic_Man2_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/1.4bpp"); +const u32 gMapObjectPic_Man2_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/2.4bpp"); +const u32 gMapObjectPic_Man2_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/3.4bpp"); +const u32 gMapObjectPic_Man2_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/4.4bpp"); +const u32 gMapObjectPic_Man2_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/5.4bpp"); +const u32 gMapObjectPic_Man2_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/6.4bpp"); +const u32 gMapObjectPic_Man2_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/7.4bpp"); +const u32 gMapObjectPic_Man2_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/8.4bpp"); +const u32 gMapObjectPic_Woman4_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/0.4bpp"); +const u32 gMapObjectPic_Woman4_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/1.4bpp"); +const u32 gMapObjectPic_Woman4_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/2.4bpp"); +const u32 gMapObjectPic_Woman4_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/3.4bpp"); +const u32 gMapObjectPic_Woman4_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/4.4bpp"); +const u32 gMapObjectPic_Woman4_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/5.4bpp"); +const u32 gMapObjectPic_Woman4_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/6.4bpp"); +const u32 gMapObjectPic_Woman4_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/7.4bpp"); +const u32 gMapObjectPic_Woman4_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/8.4bpp"); +const u32 gMapObjectPic_Man3_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/0.4bpp"); +const u32 gMapObjectPic_Man3_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/1.4bpp"); +const u32 gMapObjectPic_Man3_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/2.4bpp"); +const u32 gMapObjectPic_Man3_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/3.4bpp"); +const u32 gMapObjectPic_Man3_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/4.4bpp"); +const u32 gMapObjectPic_Man3_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/5.4bpp"); +const u32 gMapObjectPic_Man3_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/6.4bpp"); +const u32 gMapObjectPic_Man3_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/7.4bpp"); +const u32 gMapObjectPic_Man3_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/8.4bpp"); +const u32 gMapObjectPic_Woman5_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/0.4bpp"); +const u32 gMapObjectPic_Woman5_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/1.4bpp"); +const u32 gMapObjectPic_Woman5_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/2.4bpp"); +const u32 gMapObjectPic_Woman5_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/3.4bpp"); +const u32 gMapObjectPic_Woman5_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/4.4bpp"); +const u32 gMapObjectPic_Woman5_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/5.4bpp"); +const u32 gMapObjectPic_Woman5_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/6.4bpp"); +const u32 gMapObjectPic_Woman5_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/7.4bpp"); +const u32 gMapObjectPic_Woman5_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/8.4bpp"); +const u32 gMapObjectPic_Cook_0[] = INCBIN_U32("graphics/map_objects/pics/people/cook/0.4bpp"); +const u32 gMapObjectPic_Cook_1[] = INCBIN_U32("graphics/map_objects/pics/people/cook/1.4bpp"); +const u32 gMapObjectPic_Cook_2[] = INCBIN_U32("graphics/map_objects/pics/people/cook/2.4bpp"); +const u32 gMapObjectPic_Woman6_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/0.4bpp"); +const u32 gMapObjectPic_Woman6_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/1.4bpp"); +const u32 gMapObjectPic_Woman6_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/2.4bpp"); +const u32 gMapObjectPic_Woman6_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/3.4bpp"); +const u32 gMapObjectPic_Woman6_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/4.4bpp"); +const u32 gMapObjectPic_Woman6_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/5.4bpp"); +const u32 gMapObjectPic_Woman6_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/6.4bpp"); +const u32 gMapObjectPic_Woman6_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/7.4bpp"); +const u32 gMapObjectPic_Woman6_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/8.4bpp"); +const u32 gMapObjectPic_OldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/0.4bpp"); +const u32 gMapObjectPic_OldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/1.4bpp"); +const u32 gMapObjectPic_OldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/2.4bpp"); +const u32 gMapObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/0.4bpp"); +const u32 gMapObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/1.4bpp"); +const u32 gMapObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/2.4bpp"); +const u32 gMapObjectPic_Camper_0[] = INCBIN_U32("graphics/map_objects/pics/people/camper/0.4bpp"); +const u32 gMapObjectPic_Camper_1[] = INCBIN_U32("graphics/map_objects/pics/people/camper/1.4bpp"); +const u32 gMapObjectPic_Camper_2[] = INCBIN_U32("graphics/map_objects/pics/people/camper/2.4bpp"); +const u32 gMapObjectPic_Camper_3[] = INCBIN_U32("graphics/map_objects/pics/people/camper/3.4bpp"); +const u32 gMapObjectPic_Camper_4[] = INCBIN_U32("graphics/map_objects/pics/people/camper/4.4bpp"); +const u32 gMapObjectPic_Camper_5[] = INCBIN_U32("graphics/map_objects/pics/people/camper/5.4bpp"); +const u32 gMapObjectPic_Camper_6[] = INCBIN_U32("graphics/map_objects/pics/people/camper/6.4bpp"); +const u32 gMapObjectPic_Camper_7[] = INCBIN_U32("graphics/map_objects/pics/people/camper/7.4bpp"); +const u32 gMapObjectPic_Camper_8[] = INCBIN_U32("graphics/map_objects/pics/people/camper/8.4bpp"); +const u32 gMapObjectPic_Picnicker_0[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/0.4bpp"); +const u32 gMapObjectPic_Picnicker_1[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/1.4bpp"); +const u32 gMapObjectPic_Picnicker_2[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/2.4bpp"); +const u32 gMapObjectPic_Picnicker_3[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/3.4bpp"); +const u32 gMapObjectPic_Picnicker_4[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/4.4bpp"); +const u32 gMapObjectPic_Picnicker_5[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/5.4bpp"); +const u32 gMapObjectPic_Picnicker_6[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/6.4bpp"); +const u32 gMapObjectPic_Picnicker_7[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/7.4bpp"); +const u32 gMapObjectPic_Picnicker_8[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/8.4bpp"); +const u32 gMapObjectPic_Man4_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/0.4bpp"); +const u32 gMapObjectPic_Man4_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/1.4bpp"); +const u32 gMapObjectPic_Man4_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/2.4bpp"); +const u32 gMapObjectPic_Man4_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/3.4bpp"); +const u32 gMapObjectPic_Man4_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/4.4bpp"); +const u32 gMapObjectPic_Man4_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/5.4bpp"); +const u32 gMapObjectPic_Man4_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/6.4bpp"); +const u32 gMapObjectPic_Man4_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/7.4bpp"); +const u32 gMapObjectPic_Man4_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/8.4bpp"); +const u32 gMapObjectPic_Woman7_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/0.4bpp"); +const u32 gMapObjectPic_Woman7_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/1.4bpp"); +const u32 gMapObjectPic_Woman7_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/2.4bpp"); +const u32 gMapObjectPic_Woman7_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/3.4bpp"); +const u32 gMapObjectPic_Woman7_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/4.4bpp"); +const u32 gMapObjectPic_Woman7_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/5.4bpp"); +const u32 gMapObjectPic_Woman7_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/6.4bpp"); +const u32 gMapObjectPic_Woman7_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/7.4bpp"); +const u32 gMapObjectPic_Woman7_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/8.4bpp"); +const u32 gMapObjectPic_Youngster_0[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/0.4bpp"); +const u32 gMapObjectPic_Youngster_1[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/1.4bpp"); +const u32 gMapObjectPic_Youngster_2[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/2.4bpp"); +const u32 gMapObjectPic_Youngster_3[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/3.4bpp"); +const u32 gMapObjectPic_Youngster_4[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/4.4bpp"); +const u32 gMapObjectPic_Youngster_5[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/5.4bpp"); +const u32 gMapObjectPic_Youngster_6[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/6.4bpp"); +const u32 gMapObjectPic_Youngster_7[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/7.4bpp"); +const u32 gMapObjectPic_Youngster_8[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/8.4bpp"); +const u32 gMapObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/0.4bpp"); +const u32 gMapObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/1.4bpp"); +const u32 gMapObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/2.4bpp"); +const u32 gMapObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/3.4bpp"); +const u32 gMapObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/4.4bpp"); +const u32 gMapObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/5.4bpp"); +const u32 gMapObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/6.4bpp"); +const u32 gMapObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/7.4bpp"); +const u32 gMapObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/8.4bpp"); +const u32 gMapObjectPic_PsychicM_0[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/0.4bpp"); +const u32 gMapObjectPic_PsychicM_1[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/1.4bpp"); +const u32 gMapObjectPic_PsychicM_2[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/2.4bpp"); +const u32 gMapObjectPic_PsychicM_3[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/3.4bpp"); +const u32 gMapObjectPic_PsychicM_4[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/4.4bpp"); +const u32 gMapObjectPic_PsychicM_5[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/5.4bpp"); +const u32 gMapObjectPic_PsychicM_6[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/6.4bpp"); +const u32 gMapObjectPic_PsychicM_7[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/7.4bpp"); +const u32 gMapObjectPic_PsychicM_8[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/8.4bpp"); +const u32 gMapObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/0.4bpp"); +const u32 gMapObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/1.4bpp"); +const u32 gMapObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/2.4bpp"); +const u32 gMapObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/3.4bpp"); +const u32 gMapObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/4.4bpp"); +const u32 gMapObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/5.4bpp"); +const u32 gMapObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/6.4bpp"); +const u32 gMapObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/7.4bpp"); +const u32 gMapObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/8.4bpp"); +const u32 gMapObjectPic_Maniac_0[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/0.4bpp"); +const u32 gMapObjectPic_Maniac_1[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/1.4bpp"); +const u32 gMapObjectPic_Maniac_2[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/2.4bpp"); +const u32 gMapObjectPic_Maniac_3[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/3.4bpp"); +const u32 gMapObjectPic_Maniac_4[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/4.4bpp"); +const u32 gMapObjectPic_Maniac_5[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/5.4bpp"); +const u32 gMapObjectPic_Maniac_6[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/6.4bpp"); +const u32 gMapObjectPic_Maniac_7[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/7.4bpp"); +const u32 gMapObjectPic_Maniac_8[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/8.4bpp"); +const u32 gMapObjectPic_HexManiac_0[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/0.4bpp"); +const u32 gMapObjectPic_HexManiac_1[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/1.4bpp"); +const u32 gMapObjectPic_HexManiac_2[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/2.4bpp"); +const u32 gMapObjectPic_HexManiac_3[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/3.4bpp"); +const u32 gMapObjectPic_HexManiac_4[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/4.4bpp"); +const u32 gMapObjectPic_HexManiac_5[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/5.4bpp"); +const u32 gMapObjectPic_HexManiac_6[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/6.4bpp"); +const u32 gMapObjectPic_HexManiac_7[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/7.4bpp"); +const u32 gMapObjectPic_HexManiac_8[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/8.4bpp"); +const u32 gMapObjectPic_Woman8_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/0.4bpp"); +const u32 gMapObjectPic_Woman8_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/1.4bpp"); +const u32 gMapObjectPic_Woman8_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/2.4bpp"); +const u32 gMapObjectPic_Woman8_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/3.4bpp"); +const u32 gMapObjectPic_Woman8_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/4.4bpp"); +const u32 gMapObjectPic_Woman8_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/5.4bpp"); +const u32 gMapObjectPic_Woman8_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/6.4bpp"); +const u32 gMapObjectPic_Woman8_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/7.4bpp"); +const u32 gMapObjectPic_Woman8_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/8.4bpp"); +const u32 gMapObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/0.4bpp"); +const u32 gMapObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/1.4bpp"); +const u32 gMapObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/2.4bpp"); +const u32 gMapObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/3.4bpp"); +const u32 gMapObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/4.4bpp"); +const u32 gMapObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/5.4bpp"); +const u32 gMapObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/6.4bpp"); +const u32 gMapObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/7.4bpp"); +const u32 gMapObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/8.4bpp"); +const u32 gMapObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/0.4bpp"); +const u32 gMapObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/1.4bpp"); +const u32 gMapObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/2.4bpp"); +const u32 gMapObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/3.4bpp"); +const u32 gMapObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/4.4bpp"); +const u32 gMapObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/5.4bpp"); +const u32 gMapObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/6.4bpp"); +const u32 gMapObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/7.4bpp"); +const u32 gMapObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/8.4bpp"); +const u32 gMapObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/0.4bpp"); +const u32 gMapObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/1.4bpp"); +const u32 gMapObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/2.4bpp"); +const u32 gMapObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/3.4bpp"); +const u32 gMapObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/4.4bpp"); +const u32 gMapObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/5.4bpp"); +const u32 gMapObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/6.4bpp"); +const u32 gMapObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/7.4bpp"); +const u32 gMapObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/8.4bpp"); +const u32 gMapObjectPic_Beauty_0[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/0.4bpp"); +const u32 gMapObjectPic_Beauty_1[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/1.4bpp"); +const u32 gMapObjectPic_Beauty_2[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/2.4bpp"); +const u32 gMapObjectPic_Beauty_3[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/3.4bpp"); +const u32 gMapObjectPic_Beauty_4[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/4.4bpp"); +const u32 gMapObjectPic_Beauty_5[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/5.4bpp"); +const u32 gMapObjectPic_Beauty_6[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/6.4bpp"); +const u32 gMapObjectPic_Beauty_7[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/7.4bpp"); +const u32 gMapObjectPic_Beauty_8[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/8.4bpp"); +const u32 gMapObjectPic_Scientist1_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/0.4bpp"); +const u32 gMapObjectPic_Scientist1_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/1.4bpp"); +const u32 gMapObjectPic_Scientist1_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/2.4bpp"); +const u32 gMapObjectPic_Scientist1_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/3.4bpp"); +const u32 gMapObjectPic_Scientist1_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/4.4bpp"); +const u32 gMapObjectPic_Scientist1_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/5.4bpp"); +const u32 gMapObjectPic_Scientist1_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/6.4bpp"); +const u32 gMapObjectPic_Scientist1_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/7.4bpp"); +const u32 gMapObjectPic_Scientist1_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/8.4bpp"); +const u32 gMapObjectPic_Lass_0[] = INCBIN_U32("graphics/map_objects/pics/people/lass/0.4bpp"); +const u32 gMapObjectPic_Lass_1[] = INCBIN_U32("graphics/map_objects/pics/people/lass/1.4bpp"); +const u32 gMapObjectPic_Lass_2[] = INCBIN_U32("graphics/map_objects/pics/people/lass/2.4bpp"); +const u32 gMapObjectPic_Lass_3[] = INCBIN_U32("graphics/map_objects/pics/people/lass/3.4bpp"); +const u32 gMapObjectPic_Lass_4[] = INCBIN_U32("graphics/map_objects/pics/people/lass/4.4bpp"); +const u32 gMapObjectPic_Lass_5[] = INCBIN_U32("graphics/map_objects/pics/people/lass/5.4bpp"); +const u32 gMapObjectPic_Lass_6[] = INCBIN_U32("graphics/map_objects/pics/people/lass/6.4bpp"); +const u32 gMapObjectPic_Lass_7[] = INCBIN_U32("graphics/map_objects/pics/people/lass/7.4bpp"); +const u32 gMapObjectPic_Lass_8[] = INCBIN_U32("graphics/map_objects/pics/people/lass/8.4bpp"); +const u32 gMapObjectPic_Gentleman_0[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/0.4bpp"); +const u32 gMapObjectPic_Gentleman_1[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/1.4bpp"); +const u32 gMapObjectPic_Gentleman_2[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/2.4bpp"); +const u32 gMapObjectPic_Gentleman_3[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/3.4bpp"); +const u32 gMapObjectPic_Gentleman_4[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/4.4bpp"); +const u32 gMapObjectPic_Gentleman_5[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/5.4bpp"); +const u32 gMapObjectPic_Gentleman_6[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/6.4bpp"); +const u32 gMapObjectPic_Gentleman_7[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/7.4bpp"); +const u32 gMapObjectPic_Gentleman_8[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/8.4bpp"); +const u32 gMapObjectPic_Sailor_0[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/0.4bpp"); +const u32 gMapObjectPic_Sailor_1[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/1.4bpp"); +const u32 gMapObjectPic_Sailor_2[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/2.4bpp"); +const u32 gMapObjectPic_Sailor_3[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/3.4bpp"); +const u32 gMapObjectPic_Sailor_4[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/4.4bpp"); +const u32 gMapObjectPic_Sailor_5[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/5.4bpp"); +const u32 gMapObjectPic_Sailor_6[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/6.4bpp"); +const u32 gMapObjectPic_Sailor_7[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/7.4bpp"); +const u32 gMapObjectPic_Sailor_8[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/8.4bpp"); +const u32 gMapObjectPic_Fisherman_0[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/0.4bpp"); +const u32 gMapObjectPic_Fisherman_1[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/1.4bpp"); +const u32 gMapObjectPic_Fisherman_2[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/2.4bpp"); +const u32 gMapObjectPic_Fisherman_3[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/3.4bpp"); +const u32 gMapObjectPic_Fisherman_4[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/4.4bpp"); +const u32 gMapObjectPic_Fisherman_5[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/5.4bpp"); +const u32 gMapObjectPic_Fisherman_6[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/6.4bpp"); +const u32 gMapObjectPic_Fisherman_7[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/7.4bpp"); +const u32 gMapObjectPic_Fisherman_8[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/8.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/0.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/1.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/2.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/3.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/4.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/5.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/6.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/7.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/8.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/0.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/1.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/2.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/3.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/4.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/5.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/6.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/7.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/8.4bpp"); +const u32 gMapObjectPic_TuberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/0.4bpp"); +const u32 gMapObjectPic_TuberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/1.4bpp"); +const u32 gMapObjectPic_TuberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/2.4bpp"); +const u32 gMapObjectPic_TuberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/3.4bpp"); +const u32 gMapObjectPic_TuberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/4.4bpp"); +const u32 gMapObjectPic_TuberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/5.4bpp"); +const u32 gMapObjectPic_TuberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/6.4bpp"); +const u32 gMapObjectPic_TuberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/7.4bpp"); +const u32 gMapObjectPic_TuberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/8.4bpp"); +const u32 gMapObjectPic_TuberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/0.4bpp"); +const u32 gMapObjectPic_TuberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/1.4bpp"); +const u32 gMapObjectPic_TuberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/2.4bpp"); +const u32 gMapObjectPic_TuberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/3.4bpp"); +const u32 gMapObjectPic_TuberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/4.4bpp"); +const u32 gMapObjectPic_TuberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/5.4bpp"); +const u32 gMapObjectPic_TuberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/6.4bpp"); +const u32 gMapObjectPic_TuberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/7.4bpp"); +const u32 gMapObjectPic_TuberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/8.4bpp"); +const u32 gMapObjectPic_Hiker_0[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/0.4bpp"); +const u32 gMapObjectPic_Hiker_1[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/1.4bpp"); +const u32 gMapObjectPic_Hiker_2[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/2.4bpp"); +const u32 gMapObjectPic_Hiker_3[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/3.4bpp"); +const u32 gMapObjectPic_Hiker_4[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/4.4bpp"); +const u32 gMapObjectPic_Hiker_5[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/5.4bpp"); +const u32 gMapObjectPic_Hiker_6[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/6.4bpp"); +const u32 gMapObjectPic_Hiker_7[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/7.4bpp"); +const u32 gMapObjectPic_Hiker_8[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/8.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/0.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/1.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/2.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/3.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/4.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/5.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/6.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/7.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/8.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/0.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/1.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/2.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/3.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/4.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/5.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/6.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/7.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/8.4bpp"); +const u32 gMapObjectPic_Man5_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/0.4bpp"); +const u32 gMapObjectPic_Man5_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/1.4bpp"); +const u32 gMapObjectPic_Man5_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/2.4bpp"); +const u32 gMapObjectPic_Man5_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/3.4bpp"); +const u32 gMapObjectPic_Man5_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/4.4bpp"); +const u32 gMapObjectPic_Man5_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/5.4bpp"); +const u32 gMapObjectPic_Man5_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/6.4bpp"); +const u32 gMapObjectPic_Man5_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/7.4bpp"); +const u32 gMapObjectPic_Man5_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/8.4bpp"); +const u32 gMapObjectPic_Man6_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/0.4bpp"); +const u32 gMapObjectPic_Man6_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/1.4bpp"); +const u32 gMapObjectPic_Man6_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/2.4bpp"); +const u32 gMapObjectPic_Man6_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/3.4bpp"); +const u32 gMapObjectPic_Man6_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/4.4bpp"); +const u32 gMapObjectPic_Man6_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/5.4bpp"); +const u32 gMapObjectPic_Man6_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/6.4bpp"); +const u32 gMapObjectPic_Man6_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/7.4bpp"); +const u32 gMapObjectPic_Man6_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/8.4bpp"); +const u32 gMapObjectPic_Nurse_0[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/0.4bpp"); +const u32 gMapObjectPic_Nurse_1[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/1.4bpp"); +const u32 gMapObjectPic_Nurse_2[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/2.4bpp"); +const u32 gMapObjectPic_Nurse_3[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/3.4bpp"); +const u32 gMapObjectPic_Nurse_4[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/4.4bpp"); +const u32 gMapObjectPic_Nurse_5[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/5.4bpp"); +const u32 gMapObjectPic_Nurse_6[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/6.4bpp"); +const u32 gMapObjectPic_Nurse_7[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/7.4bpp"); +const u32 gMapObjectPic_Nurse_8[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/8.4bpp"); +const u32 gMapObjectPic_Nurse_9[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/9.4bpp"); +const u32 gMapObjectPic_ItemBall[] = INCBIN_U32("graphics/map_objects/pics/misc/item_ball.4bpp"); +const u32 gMapObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/0.4bpp"); +const u32 gMapObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/1.4bpp"); +const u32 gMapObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/2.4bpp"); +const u32 gMapObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/3.4bpp"); +const u32 gMapObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/4.4bpp"); +const u32 gMapObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/5.4bpp"); +const u32 gMapObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/6.4bpp"); +const u32 gMapObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/7.4bpp"); +const u32 gMapObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/8.4bpp"); +const u32 gMapObjectPic_ReporterM_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/0.4bpp"); +const u32 gMapObjectPic_ReporterM_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/1.4bpp"); +const u32 gMapObjectPic_ReporterM_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/2.4bpp"); +const u32 gMapObjectPic_ReporterM_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/3.4bpp"); +const u32 gMapObjectPic_ReporterM_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/4.4bpp"); +const u32 gMapObjectPic_ReporterM_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/5.4bpp"); +const u32 gMapObjectPic_ReporterM_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/6.4bpp"); +const u32 gMapObjectPic_ReporterM_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/7.4bpp"); +const u32 gMapObjectPic_ReporterM_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/8.4bpp"); +const u32 gMapObjectPic_ReporterF_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/0.4bpp"); +const u32 gMapObjectPic_ReporterF_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/1.4bpp"); +const u32 gMapObjectPic_ReporterF_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/2.4bpp"); +const u32 gMapObjectPic_ReporterF_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/3.4bpp"); +const u32 gMapObjectPic_ReporterF_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/4.4bpp"); +const u32 gMapObjectPic_ReporterF_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/5.4bpp"); +const u32 gMapObjectPic_ReporterF_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/6.4bpp"); +const u32 gMapObjectPic_ReporterF_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/7.4bpp"); +const u32 gMapObjectPic_ReporterF_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/8.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/0.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/1.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/2.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/3.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/4.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/5.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/6.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/7.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/8.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/0.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/1.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/2.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/3.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/4.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/5.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/6.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/7.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/8.4bpp"); +const u32 gMapObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/0.4bpp"); +const u32 gMapObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/1.4bpp"); +const u32 gMapObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/2.4bpp"); +const u32 gMapObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/3.4bpp"); +const u32 gMapObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/4.4bpp"); +const u32 gMapObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/5.4bpp"); +const u32 gMapObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/6.4bpp"); +const u32 gMapObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/7.4bpp"); +const u32 gMapObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/8.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/0.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/1.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/2.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/3.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/4.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/5.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/6.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/7.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/8.4bpp"); +const u32 gMapObjectPic_Teala_0[] = INCBIN_U32("graphics/map_objects/pics/people/teala/0.4bpp"); +const u32 gMapObjectPic_Teala_1[] = INCBIN_U32("graphics/map_objects/pics/people/teala/1.4bpp"); +const u32 gMapObjectPic_Teala_2[] = INCBIN_U32("graphics/map_objects/pics/people/teala/2.4bpp"); +const u32 gMapObjectPic_Teala_3[] = INCBIN_U32("graphics/map_objects/pics/people/teala/3.4bpp"); +const u32 gMapObjectPic_Teala_4[] = INCBIN_U32("graphics/map_objects/pics/people/teala/4.4bpp"); +const u32 gMapObjectPic_Teala_5[] = INCBIN_U32("graphics/map_objects/pics/people/teala/5.4bpp"); +const u32 gMapObjectPic_Teala_6[] = INCBIN_U32("graphics/map_objects/pics/people/teala/6.4bpp"); +const u32 gMapObjectPic_Teala_7[] = INCBIN_U32("graphics/map_objects/pics/people/teala/7.4bpp"); +const u32 gMapObjectPic_Teala_8[] = INCBIN_U32("graphics/map_objects/pics/people/teala/8.4bpp"); +const u32 gMapObjectPic_Artist_0[] = INCBIN_U32("graphics/map_objects/pics/people/artist/0.4bpp"); +const u32 gMapObjectPic_Artist_1[] = INCBIN_U32("graphics/map_objects/pics/people/artist/1.4bpp"); +const u32 gMapObjectPic_Artist_2[] = INCBIN_U32("graphics/map_objects/pics/people/artist/2.4bpp"); +const u32 gMapObjectPic_Artist_3[] = INCBIN_U32("graphics/map_objects/pics/people/artist/3.4bpp"); +const u32 gMapObjectPic_Artist_4[] = INCBIN_U32("graphics/map_objects/pics/people/artist/4.4bpp"); +const u32 gMapObjectPic_Artist_5[] = INCBIN_U32("graphics/map_objects/pics/people/artist/5.4bpp"); +const u32 gMapObjectPic_Artist_6[] = INCBIN_U32("graphics/map_objects/pics/people/artist/6.4bpp"); +const u32 gMapObjectPic_Artist_7[] = INCBIN_U32("graphics/map_objects/pics/people/artist/7.4bpp"); +const u32 gMapObjectPic_Artist_8[] = INCBIN_U32("graphics/map_objects/pics/people/artist/8.4bpp"); +const u32 gMapObjectPic_Cameraman_0[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/0.4bpp"); +const u32 gMapObjectPic_Cameraman_1[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/1.4bpp"); +const u32 gMapObjectPic_Cameraman_2[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/2.4bpp"); +const u32 gMapObjectPic_Cameraman_3[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/3.4bpp"); +const u32 gMapObjectPic_Cameraman_4[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/4.4bpp"); +const u32 gMapObjectPic_Cameraman_5[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/5.4bpp"); +const u32 gMapObjectPic_Cameraman_6[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/6.4bpp"); +const u32 gMapObjectPic_Cameraman_7[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/7.4bpp"); +const u32 gMapObjectPic_Cameraman_8[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/8.4bpp"); +const u32 gMapObjectPic_Scientist2_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/0.4bpp"); +const u32 gMapObjectPic_Scientist2_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/1.4bpp"); +const u32 gMapObjectPic_Scientist2_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/2.4bpp"); +const u32 gMapObjectPic_Scientist2_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/3.4bpp"); +const u32 gMapObjectPic_Scientist2_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/4.4bpp"); +const u32 gMapObjectPic_Scientist2_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/5.4bpp"); +const u32 gMapObjectPic_Scientist2_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/6.4bpp"); +const u32 gMapObjectPic_Scientist2_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/7.4bpp"); +const u32 gMapObjectPic_Scientist2_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/8.4bpp"); +const u32 gMapObjectPic_Man7_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/0.4bpp"); +const u32 gMapObjectPic_Man7_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/1.4bpp"); +const u32 gMapObjectPic_Man7_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/2.4bpp"); +const u32 gMapObjectPic_Man7_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/3.4bpp"); +const u32 gMapObjectPic_Man7_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/4.4bpp"); +const u32 gMapObjectPic_Man7_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/5.4bpp"); +const u32 gMapObjectPic_Man7_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/6.4bpp"); +const u32 gMapObjectPic_Man7_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/7.4bpp"); +const u32 gMapObjectPic_Man7_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/8.4bpp"); +const u32 gMapObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/0.4bpp"); +const u32 gMapObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/1.4bpp"); +const u32 gMapObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/2.4bpp"); +const u32 gMapObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/3.4bpp"); +const u32 gMapObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/4.4bpp"); +const u32 gMapObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/5.4bpp"); +const u32 gMapObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/6.4bpp"); +const u32 gMapObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/7.4bpp"); +const u32 gMapObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/8.4bpp"); +const u32 gMapObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/0.4bpp"); +const u32 gMapObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/1.4bpp"); +const u32 gMapObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/2.4bpp"); +const u32 gMapObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/3.4bpp"); +const u32 gMapObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/4.4bpp"); +const u32 gMapObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/5.4bpp"); +const u32 gMapObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/6.4bpp"); +const u32 gMapObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/7.4bpp"); +const u32 gMapObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/8.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/0.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/1.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/2.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/3.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/4.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/5.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/6.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/7.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/8.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/0.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/1.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/2.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/3.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/4.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/5.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/6.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/7.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/8.4bpp"); +const u32 gMapObjectPic_Sidney_0[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/0.4bpp"); +const u32 gMapObjectPic_Sidney_1[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/1.4bpp"); +const u32 gMapObjectPic_Sidney_2[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/2.4bpp"); +const u32 gMapObjectPic_Phoebe_0[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/0.4bpp"); +const u32 gMapObjectPic_Phoebe_1[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/1.4bpp"); +const u32 gMapObjectPic_Phoebe_2[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/2.4bpp"); +const u32 gMapObjectPic_Glacia_0[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/0.4bpp"); +const u32 gMapObjectPic_Glacia_1[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/1.4bpp"); +const u32 gMapObjectPic_Glacia_2[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/2.4bpp"); +const u32 gMapObjectPic_Drake_0[] = INCBIN_U32("graphics/map_objects/pics/people/drake/0.4bpp"); +const u32 gMapObjectPic_Drake_1[] = INCBIN_U32("graphics/map_objects/pics/people/drake/1.4bpp"); +const u32 gMapObjectPic_Drake_2[] = INCBIN_U32("graphics/map_objects/pics/people/drake/2.4bpp"); +const u32 gMapObjectPic_Roxanne_0[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/0.4bpp"); +const u32 gMapObjectPic_Roxanne_1[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/1.4bpp"); +const u32 gMapObjectPic_Roxanne_2[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/2.4bpp"); +const u32 gMapObjectPic_Brawly_0[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/0.4bpp"); +const u32 gMapObjectPic_Brawly_1[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/1.4bpp"); +const u32 gMapObjectPic_Brawly_2[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/2.4bpp"); +const u32 gMapObjectPic_Wattson_0[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/0.4bpp"); +const u32 gMapObjectPic_Wattson_1[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/1.4bpp"); +const u32 gMapObjectPic_Wattson_2[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/2.4bpp"); +const u32 gMapObjectPic_Flannery_0[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/0.4bpp"); +const u32 gMapObjectPic_Flannery_1[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/1.4bpp"); +const u32 gMapObjectPic_Flannery_2[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/2.4bpp"); +const u32 gMapObjectPic_Norman_0[] = INCBIN_U32("graphics/map_objects/pics/people/norman/0.4bpp"); +const u32 gMapObjectPic_Norman_1[] = INCBIN_U32("graphics/map_objects/pics/people/norman/1.4bpp"); +const u32 gMapObjectPic_Norman_2[] = INCBIN_U32("graphics/map_objects/pics/people/norman/2.4bpp"); +const u32 gMapObjectPic_Norman_3[] = INCBIN_U32("graphics/map_objects/pics/people/norman/3.4bpp"); +const u32 gMapObjectPic_Norman_4[] = INCBIN_U32("graphics/map_objects/pics/people/norman/4.4bpp"); +const u32 gMapObjectPic_Norman_5[] = INCBIN_U32("graphics/map_objects/pics/people/norman/5.4bpp"); +const u32 gMapObjectPic_Norman_6[] = INCBIN_U32("graphics/map_objects/pics/people/norman/6.4bpp"); +const u32 gMapObjectPic_Norman_7[] = INCBIN_U32("graphics/map_objects/pics/people/norman/7.4bpp"); +const u32 gMapObjectPic_Norman_8[] = INCBIN_U32("graphics/map_objects/pics/people/norman/8.4bpp"); +const u32 gMapObjectPic_Winona_0[] = INCBIN_U32("graphics/map_objects/pics/people/winona/0.4bpp"); +const u32 gMapObjectPic_Winona_1[] = INCBIN_U32("graphics/map_objects/pics/people/winona/1.4bpp"); +const u32 gMapObjectPic_Winona_2[] = INCBIN_U32("graphics/map_objects/pics/people/winona/2.4bpp"); +const u32 gMapObjectPic_Liza_0[] = INCBIN_U32("graphics/map_objects/pics/people/liza/0.4bpp"); +const u32 gMapObjectPic_Liza_1[] = INCBIN_U32("graphics/map_objects/pics/people/liza/1.4bpp"); +const u32 gMapObjectPic_Liza_2[] = INCBIN_U32("graphics/map_objects/pics/people/liza/2.4bpp"); +const u32 gMapObjectPic_Tate_0[] = INCBIN_U32("graphics/map_objects/pics/people/tate/0.4bpp"); +const u32 gMapObjectPic_Tate_1[] = INCBIN_U32("graphics/map_objects/pics/people/tate/1.4bpp"); +const u32 gMapObjectPic_Tate_2[] = INCBIN_U32("graphics/map_objects/pics/people/tate/2.4bpp"); +const u32 gMapObjectPic_Wallace_0[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/0.4bpp"); +const u32 gMapObjectPic_Wallace_1[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/1.4bpp"); +const u32 gMapObjectPic_Wallace_2[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/2.4bpp"); +const u32 gMapObjectPic_Wallace_3[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/3.4bpp"); +const u32 gMapObjectPic_Wallace_4[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/4.4bpp"); +const u32 gMapObjectPic_Wallace_5[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/5.4bpp"); +const u32 gMapObjectPic_Wallace_6[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/6.4bpp"); +const u32 gMapObjectPic_Wallace_7[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/7.4bpp"); +const u32 gMapObjectPic_Wallace_8[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/8.4bpp"); +const u32 gMapObjectPic_Steven_0[] = INCBIN_U32("graphics/map_objects/pics/people/steven/0.4bpp"); +const u32 gMapObjectPic_Steven_1[] = INCBIN_U32("graphics/map_objects/pics/people/steven/1.4bpp"); +const u32 gMapObjectPic_Steven_2[] = INCBIN_U32("graphics/map_objects/pics/people/steven/2.4bpp"); +const u32 gMapObjectPic_Steven_3[] = INCBIN_U32("graphics/map_objects/pics/people/steven/3.4bpp"); +const u32 gMapObjectPic_Steven_4[] = INCBIN_U32("graphics/map_objects/pics/people/steven/4.4bpp"); +const u32 gMapObjectPic_Steven_5[] = INCBIN_U32("graphics/map_objects/pics/people/steven/5.4bpp"); +const u32 gMapObjectPic_Steven_6[] = INCBIN_U32("graphics/map_objects/pics/people/steven/6.4bpp"); +const u32 gMapObjectPic_Steven_7[] = INCBIN_U32("graphics/map_objects/pics/people/steven/7.4bpp"); +const u32 gMapObjectPic_Steven_8[] = INCBIN_U32("graphics/map_objects/pics/people/steven/8.4bpp"); +const u32 gMapObjectPic_Wally_0[] = INCBIN_U32("graphics/map_objects/pics/people/wally/0.4bpp"); +const u32 gMapObjectPic_Wally_1[] = INCBIN_U32("graphics/map_objects/pics/people/wally/1.4bpp"); +const u32 gMapObjectPic_Wally_2[] = INCBIN_U32("graphics/map_objects/pics/people/wally/2.4bpp"); +const u32 gMapObjectPic_Wally_3[] = INCBIN_U32("graphics/map_objects/pics/people/wally/3.4bpp"); +const u32 gMapObjectPic_Wally_4[] = INCBIN_U32("graphics/map_objects/pics/people/wally/4.4bpp"); +const u32 gMapObjectPic_Wally_5[] = INCBIN_U32("graphics/map_objects/pics/people/wally/5.4bpp"); +const u32 gMapObjectPic_Wally_6[] = INCBIN_U32("graphics/map_objects/pics/people/wally/6.4bpp"); +const u32 gMapObjectPic_Wally_7[] = INCBIN_U32("graphics/map_objects/pics/people/wally/7.4bpp"); +const u32 gMapObjectPic_Wally_8[] = INCBIN_U32("graphics/map_objects/pics/people/wally/8.4bpp"); +const u32 gMapObjectPic_LittleBoy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/0.4bpp"); +const u32 gMapObjectPic_LittleBoy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/1.4bpp"); +const u32 gMapObjectPic_LittleBoy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/2.4bpp"); +const u32 gMapObjectPic_LittleBoy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/3.4bpp"); +const u32 gMapObjectPic_LittleBoy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/4.4bpp"); +const u32 gMapObjectPic_LittleBoy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/5.4bpp"); +const u32 gMapObjectPic_LittleBoy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/6.4bpp"); +const u32 gMapObjectPic_LittleBoy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/7.4bpp"); +const u32 gMapObjectPic_LittleBoy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/8.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/0.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/1.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/2.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/3.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/4.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/5.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/6.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/7.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/8.4bpp"); +const u32 gMapObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/0.4bpp"); +const u32 gMapObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/1.4bpp"); +const u32 gMapObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/2.4bpp"); +const u32 gMapObjectPic_Boy5_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/0.4bpp"); +const u32 gMapObjectPic_Boy5_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/1.4bpp"); +const u32 gMapObjectPic_Boy5_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/2.4bpp"); +const u32 gMapObjectPic_ContestJudge_0[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/0.4bpp"); +const u32 gMapObjectPic_ContestJudge_1[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/1.4bpp"); +const u32 gMapObjectPic_ContestJudge_2[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/2.4bpp"); +const u32 gMapObjectPic_ContestJudge_3[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/3.4bpp"); +const u32 gMapObjectPic_ContestJudge_4[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/4.4bpp"); +const u32 gMapObjectPic_ContestJudge_5[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/5.4bpp"); +const u32 gMapObjectPic_ContestJudge_6[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/6.4bpp"); +const u32 gMapObjectPic_ContestJudge_7[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/7.4bpp"); +const u32 gMapObjectPic_ContestJudge_8[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/8.4bpp"); +const u32 gMapObjectPic_Archie_0[] = INCBIN_U32("graphics/map_objects/pics/people/archie/0.4bpp"); +const u32 gMapObjectPic_Archie_1[] = INCBIN_U32("graphics/map_objects/pics/people/archie/1.4bpp"); +const u32 gMapObjectPic_Archie_2[] = INCBIN_U32("graphics/map_objects/pics/people/archie/2.4bpp"); +const u32 gMapObjectPic_Archie_3[] = INCBIN_U32("graphics/map_objects/pics/people/archie/3.4bpp"); +const u32 gMapObjectPic_Archie_4[] = INCBIN_U32("graphics/map_objects/pics/people/archie/4.4bpp"); +const u32 gMapObjectPic_Archie_5[] = INCBIN_U32("graphics/map_objects/pics/people/archie/5.4bpp"); +const u32 gMapObjectPic_Archie_6[] = INCBIN_U32("graphics/map_objects/pics/people/archie/6.4bpp"); +const u32 gMapObjectPic_Archie_7[] = INCBIN_U32("graphics/map_objects/pics/people/archie/7.4bpp"); +const u32 gMapObjectPic_Archie_8[] = INCBIN_U32("graphics/map_objects/pics/people/archie/8.4bpp"); +const u32 gMapObjectPic_Maxie_0[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/0.4bpp"); +const u32 gMapObjectPic_Maxie_1[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/1.4bpp"); +const u32 gMapObjectPic_Maxie_2[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/2.4bpp"); +const u32 gMapObjectPic_Maxie_3[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/3.4bpp"); +const u32 gMapObjectPic_Maxie_4[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/4.4bpp"); +const u32 gMapObjectPic_Maxie_5[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/5.4bpp"); +const u32 gMapObjectPic_Maxie_6[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/6.4bpp"); +const u32 gMapObjectPic_Maxie_7[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/7.4bpp"); +const u32 gMapObjectPic_Maxie_8[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/8.4bpp"); +const u32 gMapObjectPic_Kyogre_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/0.4bpp"); +const u32 gMapObjectPic_Kyogre_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/1.4bpp"); +const u32 gMapObjectPic_Groudon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/0.4bpp"); +const u32 gMapObjectPic_Groudon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/1.4bpp"); +const u32 gMapObjectPic_Regi[] = INCBIN_U32("graphics/map_objects/pics/pokemon/regi.4bpp"); +const u32 gMapObjectPic_Skitty_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/0.4bpp"); +const u32 gMapObjectPic_Skitty_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/1.4bpp"); +const u32 gMapObjectPic_Skitty_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/2.4bpp"); +const u32 gMapObjectPic_Kecleon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/0.4bpp"); +const u32 gMapObjectPic_Kecleon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/1.4bpp"); +const u32 gMapObjectPic_Kecleon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/2.4bpp"); +const u32 gMapObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/0.4bpp"); +const u32 gMapObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/1.4bpp"); +const u32 gMapObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/0.4bpp"); +const u32 gMapObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/1.4bpp"); +const u32 gMapObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/2.4bpp"); +const u32 gMapObjectPic_Pikachu_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/0.4bpp"); +const u32 gMapObjectPic_Pikachu_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/1.4bpp"); +const u32 gMapObjectPic_Pikachu_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/2.4bpp"); +const u32 gMapObjectPic_Azumarill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/0.4bpp"); +const u32 gMapObjectPic_Azumarill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/1.4bpp"); +const u32 gMapObjectPic_Azumarill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/2.4bpp"); +const u32 gMapObjectPic_Wingull_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/0.4bpp"); +const u32 gMapObjectPic_Wingull_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/3.4bpp"); +const u32 gMapObjectPic_Wingull_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/1.4bpp"); +const u32 gMapObjectPic_Wingull_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/4.4bpp"); +const u32 gMapObjectPic_Wingull_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/2.4bpp"); +const u32 gMapObjectPic_Wingull_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/5.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/0.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/1.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/2.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/3.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/4.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/5.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/6.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/7.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/8.4bpp"); +const u32 gMapObjectPic_Azurill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/0.4bpp"); +const u32 gMapObjectPic_Azurill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/1.4bpp"); +const u32 gMapObjectPic_Azurill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/2.4bpp"); +const u32 gMapObjectPic_Mom_0[] = INCBIN_U32("graphics/map_objects/pics/people/mom/0.4bpp"); +const u32 gMapObjectPic_Mom_1[] = INCBIN_U32("graphics/map_objects/pics/people/mom/1.4bpp"); +const u32 gMapObjectPic_Mom_2[] = INCBIN_U32("graphics/map_objects/pics/people/mom/2.4bpp"); +const u32 gMapObjectPic_Mom_3[] = INCBIN_U32("graphics/map_objects/pics/people/mom/3.4bpp"); +const u32 gMapObjectPic_Mom_4[] = INCBIN_U32("graphics/map_objects/pics/people/mom/4.4bpp"); +const u32 gMapObjectPic_Mom_5[] = INCBIN_U32("graphics/map_objects/pics/people/mom/5.4bpp"); +const u32 gMapObjectPic_Mom_6[] = INCBIN_U32("graphics/map_objects/pics/people/mom/6.4bpp"); +const u32 gMapObjectPic_Mom_7[] = INCBIN_U32("graphics/map_objects/pics/people/mom/7.4bpp"); +const u32 gMapObjectPic_Mom_8[] = INCBIN_U32("graphics/map_objects/pics/people/mom/8.4bpp"); +const u16 gMapObjectPalette22[] = INCBIN_U16("graphics/map_objects/palettes/22.gbapal"); +const u16 gMapObjectPalette23[] = INCBIN_U16("graphics/map_objects/palettes/23.gbapal"); +const u16 gMapObjectPalette24[] = INCBIN_U16("graphics/map_objects/palettes/24.gbapal"); +const u16 gMapObjectPalette25[] = INCBIN_U16("graphics/map_objects/palettes/25.gbapal"); +const u32 gMapObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_natu_doll.4bpp"); +const u32 gMapObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_magnemite_doll.4bpp"); +const u32 gMapObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_squirtle_doll.4bpp"); +const u32 gMapObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_wooper_doll.4bpp"); +const u32 gMapObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_pikachu_doll.4bpp"); +const u32 gMapObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_porygon2_doll.4bpp"); +const u32 gMapObjectPic_PichuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pichu_doll.4bpp"); +const u32 gMapObjectPic_PikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pikachu_doll.4bpp"); +const u32 gMapObjectPic_MarillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/marill_doll.4bpp"); +const u32 gMapObjectPic_TogepiDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/togepi_doll.4bpp"); +const u32 gMapObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/cyndaquil_doll.4bpp"); +const u32 gMapObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/chikorita_doll.4bpp"); +const u32 gMapObjectPic_TotodileDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/totodile_doll.4bpp"); +const u32 gMapObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/jigglypuff_doll.4bpp"); +const u32 gMapObjectPic_MeowthDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/meowth_doll.4bpp"); +const u32 gMapObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/clefairy_doll.4bpp"); +const u32 gMapObjectPic_DittoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/ditto_doll.4bpp"); +const u32 gMapObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/smoochum_doll.4bpp"); +const u32 gMapObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/treecko_doll.4bpp"); +const u32 gMapObjectPic_TorchicDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/torchic_doll.4bpp"); +const u32 gMapObjectPic_MudkipDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/mudkip_doll.4bpp"); +const u32 gMapObjectPic_DuskullDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/duskull_doll.4bpp"); +const u32 gMapObjectPic_WynautDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/wynaut_doll.4bpp"); +const u32 gMapObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/baltoy_doll.4bpp"); +const u32 gMapObjectPic_KecleonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/kecleon_doll.4bpp"); +const u32 gMapObjectPic_AzurillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/azurill_doll.4bpp"); +const u32 gMapObjectPic_SkittyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/skitty_doll.4bpp"); +const u32 gMapObjectPic_SwabluDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/swablu_doll.4bpp"); +const u32 gMapObjectPic_GulpinDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/gulpin_doll.4bpp"); +const u32 gMapObjectPic_LotadDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/lotad_doll.4bpp"); +const u32 gMapObjectPic_SeedotDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/seedot_doll.4bpp"); +const u32 gMapObjectPic_PikaCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/pika_cushion.4bpp"); +const u32 gMapObjectPic_RoundCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/round_cushion.4bpp"); +const u32 gMapObjectPic_KissCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/kiss_cushion.4bpp"); +const u32 gMapObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/zigzag_cushion.4bpp"); +const u32 gMapObjectPic_SpinCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/spin_cushion.4bpp"); +const u32 gMapObjectPic_DiamondCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/diamond_cushion.4bpp"); +const u32 gMapObjectPic_BallCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/ball_cushion.4bpp"); +const u32 gMapObjectPic_GrassCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/grass_cushion.4bpp"); +const u32 gMapObjectPic_FireCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/fire_cushion.4bpp"); +const u32 gMapObjectPic_WaterCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/water_cushion.4bpp"); +const u32 gMapObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_snorlax_doll.4bpp"); +const u32 gMapObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_rhydon_doll.4bpp"); +const u32 gMapObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_lapras_doll.4bpp"); +const u32 gMapObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_venusaur_doll.4bpp"); +const u32 gMapObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_charizard_doll.4bpp"); +const u32 gMapObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_blastoise_doll.4bpp"); +const u32 gMapObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_wailmer_doll.4bpp"); +const u32 gMapObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regirock_doll.4bpp"); +const u32 gMapObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regice_doll.4bpp"); +const u32 gMapObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_registeel_doll.4bpp"); +const u32 gMapObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/0.4bpp"); +const u32 gMapObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/1.4bpp"); +const u32 gMapObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/2.4bpp"); +const u32 gMapObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/3.4bpp"); +const u32 gMapObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/0.4bpp"); +const u32 gMapObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/1.4bpp"); +const u32 gMapObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/2.4bpp"); +const u32 gMapObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/3.4bpp"); +const u32 gMapObjectPic_PushableBoulder[] = INCBIN_U32("graphics/map_objects/pics/misc/pushable_boulder.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/0.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/1.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/2.4bpp"); +const u32 gMapObjectPic_Fossil[] = INCBIN_U32("graphics/map_objects/pics/misc/fossil.4bpp"); +const u32 gMapObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/map_objects/pics/misc/submarine_shadow.4bpp"); +const u16 gMapObjectPalette26[] = INCBIN_U16("graphics/map_objects/palettes/26.gbapal"); +const u32 gMapObjectPic_Truck[] = INCBIN_U32("graphics/map_objects/pics/misc/truck.4bpp"); +const u16 gMapObjectPalette14[] = INCBIN_U16("graphics/map_objects/palettes/14.gbapal"); +const u32 gMapObjectPic_MachokeCarryingBox_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/0.4bpp"); +const u32 gMapObjectPic_MachokeCarryingBox_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/1.4bpp"); +const u32 gMapObjectPic_MachokeCarryingBox_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/2.4bpp"); +const u32 gMapObjectPic_MachokeFacingAway_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/0.4bpp"); +const u32 gMapObjectPic_MachokeFacingAway_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/1.4bpp"); +const u16 gMapObjectPalette15[] = INCBIN_U16("graphics/map_objects/palettes/15.gbapal"); +const u32 gMapObjectPic_BirchsBag[] = INCBIN_U32("graphics/map_objects/pics/misc/birchs_bag.4bpp"); +const u32 gMapObjectPic_Poochyena_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/0.4bpp"); +const u32 gMapObjectPic_Poochyena_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/1.4bpp"); +const u32 gMapObjectPic_Poochyena_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/2.4bpp"); +const u32 gMapObjectPic_Poochyena_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/3.4bpp"); +const u32 gMapObjectPic_Poochyena_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/4.4bpp"); +const u32 gMapObjectPic_Poochyena_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/5.4bpp"); +const u32 gMapObjectPic_Poochyena_6[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/6.4bpp"); +const u32 gMapObjectPic_Poochyena_7[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/7.4bpp"); +const u32 gMapObjectPic_Poochyena_8[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/8.4bpp"); +const u16 gMapObjectPalette16[] = INCBIN_U16("graphics/map_objects/palettes/16.gbapal"); +const u32 gMapObjectPic_CableCar[] = INCBIN_U32("graphics/map_objects/pics/misc/cable_car.4bpp"); +const u16 gMapObjectPalette20[] = INCBIN_U16("graphics/map_objects/palettes/20.gbapal"); +const u32 gMapObjectPic_SSTidal[] = INCBIN_U32("graphics/map_objects/pics/misc/ss_tidal.4bpp"); +const u16 gMapObjectPalette21[] = INCBIN_U16("graphics/map_objects/palettes/21.gbapal"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/0.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/1.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/2.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/3.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/4.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/5.4bpp"); +const u32 gMapObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/dirt_pile.4bpp"); +const u32 gMapObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/0.4bpp"); +const u32 gMapObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/1.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/0.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/1.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/2.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/3.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/4.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/5.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/0.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/1.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/2.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/3.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/4.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/5.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/0.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/1.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/2.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/3.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/4.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/5.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/0.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/1.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/2.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/3.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/4.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/5.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/0.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/1.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/2.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/3.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/4.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/5.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/0.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/1.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/2.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/3.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/4.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/5.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/0.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/1.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/2.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/3.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/4.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/5.4bpp"); +const u32 gMapObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/0.4bpp"); +const u32 gMapObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/1.4bpp"); +const u32 gMapObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/2.4bpp"); +const u32 gMapObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/3.4bpp"); +const u32 gMapObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/4.4bpp"); +const u32 gMapObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/5.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/0.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/1.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/2.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/3.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/4.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/5.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/0.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/1.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/2.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/3.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/4.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/5.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/0.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/1.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/2.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/3.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/4.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/5.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/0.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/1.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/2.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/3.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/4.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/5.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/0.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/1.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/2.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/3.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/4.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/5.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/0.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/1.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/2.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/3.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/4.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/5.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/0.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/1.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/2.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/3.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/4.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/5.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/0.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/1.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/2.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/3.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/4.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/5.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/0.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/1.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/2.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/3.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/4.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/5.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/0.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/1.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/2.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/3.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/4.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/5.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/0.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/1.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/2.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/3.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/4.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/5.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/0.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/1.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/2.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/3.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/4.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/5.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/0.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/1.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/2.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/3.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/4.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/5.4bpp"); +const u32 gMapObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/0.4bpp"); +const u32 gMapObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/1.4bpp"); +const u32 gMapObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/2.4bpp"); +const u32 gMapObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/3.4bpp"); +const u32 gMapObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/4.4bpp"); +const u32 gMapObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/5.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/0.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/1.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/2.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/3.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/4.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/5.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/0.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/1.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/2.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/3.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/4.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/5.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/0.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/1.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/2.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/3.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/4.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/5.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/0.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/1.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/2.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/3.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/4.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/5.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/0.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/1.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/2.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/3.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/4.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/5.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/0.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/1.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/2.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/3.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/4.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/5.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/0.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/1.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/2.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/3.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/4.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/5.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/0.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/1.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/2.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/3.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/4.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/5.4bpp"); +const u32 gFieldEffectPic_SurfBlob_0[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/0.4bpp"); +const u32 gFieldEffectPic_SurfBlob_1[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/1.4bpp"); +const u32 gFieldEffectPic_SurfBlob_2[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/2.4bpp"); +const u32 gMapObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/0.4bpp"); +const u32 gMapObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/1.4bpp"); +const u32 gMapObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/2.4bpp"); +const u32 gMapObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/3.4bpp"); +const u32 gMapObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/4.4bpp"); +const u32 gMapObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/5.4bpp"); +const u32 gMapObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/6.4bpp"); +const u16 gMapObjectPalette12[] = INCBIN_U16("graphics/map_objects/palettes/12.gbapal"); +const u16 gMapObjectPalette13[] = INCBIN_U16("graphics/map_objects/palettes/13.gbapal"); + +const u32 gFieldEffectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_small.4bpp"); +const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_medium.4bpp"); +const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp"); +const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp"); +const u32 filler_8368A08[0x48] = {}; +const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effect_objects/pics/cut_grass.4bpp"); +const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); +const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal"); +const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp"); +const u32 gFieldEffectPic_Ripple_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/1.4bpp"); +const u32 gFieldEffectPic_Ripple_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/2.4bpp"); +const u32 gFieldEffectPic_Ripple_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/3.4bpp"); +const u32 gFieldEffectPic_Ripple_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/4.4bpp"); +const u32 gFieldEffectPic_Ash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/0.4bpp"); +const u32 gFieldEffectPic_Ash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/1.4bpp"); +const u32 gFieldEffectPic_Ash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/2.4bpp"); +const u32 gFieldEffectPic_Ash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/3.4bpp"); +const u32 gFieldEffectPic_Ash_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/4.4bpp"); +const u32 gFieldEffectPic_Arrow_0[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/0.4bpp"); +const u32 gFieldEffectPic_Arrow_1[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/1.4bpp"); +const u32 gFieldEffectPic_Arrow_2[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/2.4bpp"); +const u32 gFieldEffectPic_Arrow_3[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/3.4bpp"); +const u32 gFieldEffectPic_Arrow_4[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/4.4bpp"); +const u32 gFieldEffectPic_Arrow_5[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/5.4bpp"); +const u32 gFieldEffectPic_Arrow_6[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/6.4bpp"); +const u32 gFieldEffectPic_Arrow_7[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/7.4bpp"); +const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effect_objects/palettes/00.gbapal"); +const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effect_objects/palettes/01.gbapal"); +const u32 gFieldEffectPic_Dust_0[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/0.4bpp"); +const u32 gFieldEffectPic_Dust_1[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/1.4bpp"); +const u32 gFieldEffectPic_Dust_2[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/2.4bpp"); +const u32 unknown_8369588[] = INCBIN_U32("graphics/field_effect_objects/unknown.bin"); +const u32 gFieldEffectPic_JumpTallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/0.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/1.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/2.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/3.4bpp"); +const u32 UnusedGrass0[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/0.4bpp"); +const u32 UnusedGrass1[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/1.4bpp"); +const u32 UnusedGrass2[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/2.4bpp"); +const u32 UnusedGrass3[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/3.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/0.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/1.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/2.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/3.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/4.4bpp"); +const u32 UnusedGrassLong[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/unused.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_5[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/5.4bpp"); +const u32 gFieldEffectPic_Unknown17_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/0.4bpp"); +const u32 gFieldEffectPic_Unknown17_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/1.4bpp"); +const u32 gFieldEffectPic_Unknown17_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/2.4bpp"); +const u32 gFieldEffectPic_Unknown17_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/3.4bpp"); +const u32 gFieldEffectPic_Unknown17_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/4.4bpp"); +const u32 gFieldEffectPic_Unknown17_5[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/5.4bpp"); +const u32 gFieldEffectPic_Unknown17_6[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/6.4bpp"); +const u32 gFieldEffectPic_Unknown17_7[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/7.4bpp"); +const u32 gFieldEffectPic_Unknown18_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/0.4bpp"); +const u32 gFieldEffectPic_Unknown18_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/1.4bpp"); +const u32 gFieldEffectPic_Unknown18_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/2.4bpp"); +const u32 gFieldEffectPic_Unknown18_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/3.4bpp"); +const u32 gFieldEffectPic_LongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/0.4bpp"); +const u32 gFieldEffectPic_LongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/1.4bpp"); +const u32 gFieldEffectPic_LongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/2.4bpp"); +const u32 gFieldEffectPic_LongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/3.4bpp"); +const u32 gFieldEffectPic_TallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/0.4bpp"); +const u32 gFieldEffectPic_TallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/1.4bpp"); +const u32 gFieldEffectPic_TallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/2.4bpp"); +const u32 gFieldEffectPic_TallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/3.4bpp"); +const u32 gFieldEffectPic_TallGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/4.4bpp"); +const u32 gFieldEffectPic_ShortGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/0.4bpp"); +const u32 gFieldEffectPic_ShortGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/1.4bpp"); +const u32 gFieldEffectPic_SandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/0.4bpp"); +const u32 gFieldEffectPic_SandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/1.4bpp"); +const u32 gFieldEffectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/0.4bpp"); +const u32 gFieldEffectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/1.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/0.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/1.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/2.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/3.4bpp"); +const u32 gFieldEffectPic_Unknown19_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/0.4bpp"); +const u32 gFieldEffectPic_Unknown19_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/1.4bpp"); +const u32 gFieldEffectPic_Unknown19_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/2.4bpp"); +const u32 gFieldEffectPic_Unknown19_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/3.4bpp"); +const u32 gFieldEffectPic_SandPile_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/0.4bpp"); +const u32 gFieldEffectPic_SandPile_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/1.4bpp"); +const u32 gFieldEffectPic_SandPile_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/2.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/0.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/1.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/2.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/3.4bpp"); +const u32 gFieldEffectPic_Splash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/0.4bpp"); +const u32 gFieldEffectPic_Splash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/1.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/0.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/1.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/2.4bpp"); +const u32 gFieldEffectPic_Unknown20_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/0.4bpp"); +const u32 gFieldEffectPic_Unknown20_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/1.4bpp"); +const u32 gFieldEffectPic_Unknown20_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/2.4bpp"); +const u32 gFieldEffectPic_Unknown20_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/3.4bpp"); +const u32 gFieldEffectPic_Unknown20_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/4.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/0.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/1.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/2.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/3.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/4.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/5.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/6.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/0.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/1.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/2.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/3.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/4.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/5.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/6.4bpp"); +const u32 gFieldEffectPic_SandDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/0.4bpp"); +const u32 gFieldEffectPic_SandDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/1.4bpp"); +const u32 gFieldEffectPic_SandDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/2.4bpp"); +const u32 gFieldEffectPic_SandDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/3.4bpp"); +const u32 gFieldEffectPic_SandDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/4.4bpp"); +const u32 gFieldEffectPic_SandDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/5.4bpp"); +const u32 gFieldEffectPic_SandDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/6.4bpp"); +const u32 gFieldEffectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effect_objects/pics/hot_springs_water.4bpp"); +const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effect_objects/palettes/02.gbapal"); +const u32 gFieldEffectPic_PopOutOfAsh_0[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/0.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_1[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/1.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_2[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/2.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_3[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/3.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_4[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/4.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_0[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/0.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_1[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/1.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_2[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/2.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_3[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/3.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_4[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/4.4bpp"); +const u32 gFieldEffectPic_Bubbles_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/0.4bpp"); +const u32 gFieldEffectPic_Bubbles_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/1.4bpp"); +const u32 gFieldEffectPic_Bubbles_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/2.4bpp"); +const u32 gFieldEffectPic_Bubbles_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/3.4bpp"); +const u32 gFieldEffectPic_Bubbles_4[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/4.4bpp"); +const u32 gFieldEffectPic_Bubbles_5[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/5.4bpp"); +const u32 gFieldEffectPic_Bubbles_6[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/6.4bpp"); +const u32 gFieldEffectPic_Bubbles_7[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/7.4bpp"); +const u32 gFieldEffectPic_Sparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/0.4bpp"); +const u32 gFieldEffectPic_Sparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/1.4bpp"); +const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/field_effect_objects/palettes/03.gbapal"); +const u32 gFieldEffectPic_Bird[] = INCBIN_U32("graphics/field_effect_objects/pics/bird.4bpp"); + +void (*const gUnknown_0836DA88[])(struct Sprite *) = +{ + sub_805C884, + sub_805CDE8, + sub_805C8AC, + sub_805CF28, + sub_805CF28, + sub_805D0AC, + sub_805D0AC, + sub_805D230, + sub_805D230, + sub_805D230, + sub_805D230, + sub_80587B4, + FieldObjectCB_BerryTree, + sub_805D4F4, + sub_805D634, + sub_805D774, + sub_805D8B4, + sub_805D9F4, + sub_805DB34, + sub_805DC74, + sub_805DDB4, + sub_805DEF4, + sub_805E034, + sub_805E174, + sub_805E278, + sub_805E37C, + sub_805E37C, + sub_805E37C, + sub_805E37C, + sub_805E5DC, + sub_805E668, + sub_805E6F4, + sub_805E780, + sub_805E80C, + sub_805E898, + sub_805E924, + sub_805E9B0, + sub_805EA3C, + sub_805EAC8, + sub_805EB54, + sub_805EBE0, + sub_805EC6C, + sub_805ECF8, + sub_805ED84, + sub_805EE10, + sub_805EE9C, + sub_805EF28, + sub_805EFB4, + sub_805F040, + sub_805F0CC, + sub_805F158, + sub_805F1E4, + sub_805F270, + sub_805F2FC, + sub_805F2FC, + sub_805F2FC, + sub_805F2FC, + FieldObjectCB_TreeDisguise, + FieldObjectCB_MountainDisguise, + sub_805F8E0, + sub_805F8E0, + sub_805F8E0, + sub_805F8E0, + FieldObjectCB_Hidden1, + sub_805FB20, + sub_805FB20, + sub_805FB20, + sub_805FB20, + sub_805FB90, + sub_805FB90, + sub_805FB90, + sub_805FB90, + sub_805FC00, + sub_805FC00, + sub_805FC00, + sub_805FC00, + sub_805FC70 +}; + +const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; + +#include "../data/field_map_obj/map_object_graphics_info_pointers.h" +#include "../data/field_map_obj/field_effect_object_template_pointers.h" +#include "../data/field_map_obj/map_object_pic_tables.h" +#include "../data/field_map_obj/map_object_anims.h" +#include "../data/field_map_obj/base_oam.h" +#include "../data/field_map_obj/map_object_subsprites.h" +#include "../data/field_map_obj/map_object_graphics_info.h" + +const struct SpritePalette gUnknown_0837377C[] = { + {gMapObjectPalette0, 0x1103}, + {gMapObjectPalette1, 0x1104}, + {gMapObjectPalette2, 0x1105}, + {gMapObjectPalette3, 0x1106}, + {gMapObjectPalette4, 0x1107}, + {gMapObjectPalette5, 0x1108}, + {gMapObjectPalette6, 0x1109}, + {gMapObjectPalette7, 0x110A}, + {gMapObjectPalette8, 0x1100}, + {gMapObjectPalette9, 0x1101}, + {gMapObjectPalette10, 0x1102}, + {gMapObjectPalette11, 0x1115}, + {gMapObjectPalette12, 0x110B}, + {gMapObjectPalette13, 0x110C}, + {gMapObjectPalette14, 0x110D}, + {gMapObjectPalette15, 0x110E}, + {gMapObjectPalette16, 0x110F}, + {gMapObjectPalette17, 0x1110}, + {gMapObjectPalette18, 0x1111}, + {gMapObjectPalette19, 0x1112}, + {gMapObjectPalette20, 0x1113}, + {gMapObjectPalette21, 0x1114}, + {gMapObjectPalette22, 0x1116}, + {gMapObjectPalette23, 0x1117}, + {gMapObjectPalette24, 0x1118}, + {gMapObjectPalette25, 0x1119}, + {gMapObjectPalette26, 0x111A}, + {NULL, 0x0000} +}; + +const u16 Palettes_837385C[] = { + 0x1101, + 0x1101, + 0x1101, + 0x1101 +}; + +const u16 Palettes_8373864[] = { + 0x1111, + 0x1111, + 0x1111, + 0x1111 +}; + +const u16 Palettes_837386C[] = { + 0x1115, + 0x1115, + 0x1115, + 0x1115 +}; + +const struct PairedPalettes gUnknown_08373874[] = { + {0x1100, Palettes_837385C}, + {0x1110, Palettes_837385C}, + {0x1115, Palettes_837386C}, + {0x11FF, NULL} +}; + +const u16 Palettes_8373894[] = { + 0x110C, + 0x110C, + 0x110C, + 0x110C +}; + +const u16 Palettes_837389C[] = { + 0x110D, + 0x110D, + 0x110D, + 0x110D +}; + +const u16 Palettes_83738A4[] = { + 0x110E, + 0x110E, + 0x110E, + 0x110E +}; + +const u16 Palettes_83738AC[] = { + 0x1112, + 0x1112, + 0x1112, + 0x1112 +}; + +const u16 Palettes_83738B4[] = { + 0x1113, + 0x1113, + 0x1113, + 0x1113 +}; + +const u16 Palettes_83738BC[] = { + 0x1114, + 0x1114, + 0x1114, + 0x1114 +}; + +const u16 Palettes_83738C4[] = { + 0x111A, + 0x111A, + 0x111A, + 0x111A +}; + +const u16 Palettes_83738CC[] = { + 0x1117, + 0x1117, + 0x1117, + 0x1117 +}; + +const u16 Palettes_83738D4[] = { + 0x1119, + 0x1119, + 0x1119, + 0x1119 +}; + +const u16 Palettes_83738DC[] = { + 0x1109, + 0x1109, + 0x1109, + 0x1109 +}; + +const struct PairedPalettes gUnknown_083738E4[] = { + {0x1100, Palettes_837385C}, + {0x1110, Palettes_837385C}, + {0x110B, Palettes_8373894}, + {0x110D, Palettes_837389C}, + {0x110E, Palettes_83738A4}, + {0x1112, Palettes_83738AC}, + {0x1113, Palettes_83738B4}, + {0x1114, Palettes_83738BC}, + {0x1116, Palettes_83738CC}, + {0x1118, Palettes_83738D4}, + {0x1105, Palettes_83738DC}, + {0x111A, Palettes_83738C4}, + {0x11FF, NULL} +}; + +const u16 Unknown_837394C[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373960[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373974[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373988[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 *const gUnknown_0837399C[] = { + Unknown_837394C, + Unknown_8373960, + Unknown_8373974, + Unknown_8373988 +}; + +#include "../data/field_map_obj/berry_tree_graphics_tables.h" +#include "../data/field_map_obj/field_effect_objects.h" + +const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; +const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; +const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; + +#include "../data/field_map_obj/callback_subroutine_pointers.h" + +const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; +const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; +const u8 gUnknown_08375606[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; +const u8 gUnknown_0837560F[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D}; +const u8 gUnknown_08375618[] = {0x10, 0x10, 0x11, 0x12, 0x13, 0x10, 0x10, 0x11, 0x11}; +const u8 gUnknown_08375621[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_0837562A[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_08375633[] = {0x18, 0x18, 0x19, 0x1A, 0x1B, 0x18, 0x18, 0x19, 0x19}; +const u8 gUnknown_0837563C[] = {0x1C, 0x1C, 0x1D, 0x1E, 0x1F, 0x1C, 0x1C, 0x1D, 0x1D}; +const u8 gUnknown_08375645[] = {0x20, 0x20, 0x21, 0x22, 0x23, 0x20, 0x20, 0x21, 0x21}; +const u8 gUnknown_0837564E[] = {0x24, 0x24, 0x25, 0x26, 0x27, 0x24, 0x24, 0x25, 0x25}; +const u8 gUnknown_08375657[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; +const u8 gUnknown_08375660[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; +const u8 gUnknown_08375669[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; +const u8 gUnknown_08375672[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_0837567B[] = {0x08, 0x08, 0x07, 0x09, 0x0A, 0x08, 0x08, 0x07, 0x07}; + +bool8 (*const gUnknown_08375684[])(u8) = { + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsWestBlocked, + MetatileBehavior_IsEastBlocked +}; + +bool8 (*const gUnknown_08375694[])(u8) = { + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsEastBlocked, + MetatileBehavior_IsWestBlocked +}; + +const struct Coords16 gDirectionToVector[] = { + { 0, 0}, + { 0, 1}, + { 0, -1}, + {-1, 0}, + { 1, 0}, + {-1, 1}, + { 1, 1}, + {-1, -1}, + { 1, -1} +}; + +const u8 gUnknown_083756C8[] = {0x00, 0x00, 0x01, 0x02, 0x03}; +const u8 gUnknown_083756CD[] = {0x04, 0x04, 0x05, 0x06, 0x07}; +const u8 gUnknown_083756D2[] = {0x08, 0x08, 0x09, 0x0A, 0x0B}; +const u8 gUnknown_083756D7[] = {0x15, 0x15, 0x16, 0x17, 0x18}; +const u8 gUnknown_083756DC[] = {0x29, 0x29, 0x2A, 0x2B, 0x2C}; +const u8 gUnknown_083756E1[] = {0x2D, 0x2D, 0x2E, 0x2F, 0x30}; +const u8 gUnknown_083756E6[] = {0x31, 0x31, 0x32, 0x33, 0x34}; +const u8 gUnknown_083756EB[] = {0x35, 0x35, 0x36, 0x37, 0x38}; +const u8 gUnknown_083756F0[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F}; +const u8 gUnknown_083756F5[] = {0x46, 0x46, 0x47, 0x48, 0x49}; +const u8 gUnknown_083756FA[] = {0x4B, 0x4B, 0x4A, 0x4D, 0x4C}; +const u8 gUnknown_083756FF[] = {0x42, 0x42, 0x43, 0x44, 0x45}; +const u8 gUnknown_08375704[] = {0x3A, 0x3A, 0x3B, 0x3C, 0x3D}; +const u8 gUnknown_08375709[] = {0x19, 0x19, 0x1A, 0x1B, 0x1C}; +const u8 gUnknown_0837570E[] = {0x1D, 0x1D, 0x1E, 0x1F, 0x20}; +const u8 gUnknown_08375713[] = {0x21, 0x21, 0x22, 0x23, 0x24}; +const u8 gUnknown_08375718[] = {0x25, 0x25, 0x26, 0x27, 0x28}; +const u8 gUnknown_0837571D[] = {0x62, 0x62, 0x63, 0x64, 0x65}; +const u8 gUnknown_08375722[] = {0x66, 0x66, 0x67, 0x68, 0x69}; +const u8 gUnknown_08375727[] = {0x6A, 0x6A, 0x6B, 0x6C, 0x6D}; +const u8 gUnknown_0837572C[] = {0x6E, 0x6E, 0x6F, 0x70, 0x71}; +const u8 gUnknown_08375731[] = {0x72, 0x72, 0x73, 0x74, 0x75}; +const u8 gUnknown_08375736[] = {0x76, 0x76, 0x77, 0x78, 0x79}; +const u8 gUnknown_0837573B[] = {0x7A, 0x7A, 0x7B, 0x7C, 0x7D}; +const u8 gUnknown_08375740[] = {0x7E, 0x7E, 0x7F, 0x80, 0x81}; +const u8 gUnknown_08375745[] = {0x82, 0x82, 0x83, 0x84, 0x85}; +const u8 gUnknown_0837574A[] = {0x86, 0x86, 0x87, 0x88, 0x89}; + +const u8 gUnknown_0837574F[] = {2, 1, 4, 3, 8, 7, 6, 5}; + +const u8 gUnknown_08375757[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {3, 4, 2, 1}, + {4, 3, 1, 2} +}; + +const u8 gUnknown_08375767[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {4, 3, 1, 2}, + {3, 4, 2, 1} +}; + +#include "../data/field_map_obj/anim_func_ptrs.h" + +// text + +extern void strange_npc_table_clear(void); +extern void ClearPlayerAvatarInfo(void); +extern void npc_load_two_palettes__no_record(u16, u8); +extern void npc_load_two_palettes__and_record(u16, u8); +extern void sub_8060388(s16, s16, s16 *, s16 *); +void sub_80634D0(struct MapObject *, struct Sprite *); +extern void pal_patch_for_npc(u16, u16); +extern void CameraObjectReset1(void); + +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; +extern u8 gReservedSpritePaletteCount; +extern struct Camera gCamera; + +static u8 gUnknown_030005A4; +static u16 gUnknown_030005A6; + +struct MapObject gMapObjects[16]; +#if DEBUG +u8 gUnknown_Debug_03004BC0[4]; // unknown type +#endif + +void npc_clear_ids_and_state(struct MapObject *mapObj) +{ + memset(mapObj, 0, sizeof(struct MapObject)); + mapObj->localId = 0xFF; + mapObj->mapNum = 0xFF; + mapObj->mapGroup = 0xFF; + mapObj->mapobj_unk_1C = 0xFF; +} + +#if DEBUG +__attribute__((naked)) +void npcs_clear_ids_and_state() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._2 @ gMapObjects\n" + "._1:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r5\n" + " bl npc_clear_ids_and_state\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0xf\n" + " bls ._1 @cond_branch\n" + " ldr r1, ._2 + 4 @ gUnknown_Debug_03004BC0\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._3:\n" + " .align 2, 0\n" + "._2:\n" + " .word gMapObjects\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else +void npcs_clear_ids_and_state(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + npc_clear_ids_and_state(&gMapObjects[i]); +} +#endif + +void sub_805AA98(void) +{ + strange_npc_table_clear(); + npcs_clear_ids_and_state(); + ClearPlayerAvatarInfo(); + sub_805AAB0(); +} + +void sub_805AAB0(void) +{ + u8 spriteId; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); + + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 0); + gSprites[spriteId].invisible = 1; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); + + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 1); + gSprites[spriteId].invisible = 1; +} + +u8 sub_805AB54(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (!gMapObjects[i].active) + break; + } + return i; +} + +u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + if (localId <= 0xFE) + return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); + else + return GetFieldObjectIdByLocalId(localId); +} + +bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId) +{ + *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); + if (*mapObjectId == 16) + return TRUE; + else + return FALSE; +} + +u8 GetFieldObjectIdByXY(s16 x, s16 y) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) + break; + } + return i; +} + +u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) + return i; + } + return 16; +} + +u8 GetFieldObjectIdByLocalId(u8 localId) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == localId) + return i; + } + return 16; +} + +#if DEBUG +__attribute__((naked)) +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " add r5, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r6, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r7, r2, #0x18\n" + " ldrb r0, [r5]\n" + " add r1, r6, #0\n" + " add r2, r7, #0\n" + " mov r3, sp\n" + " bl GetAvailableFieldObjectSlot\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._35 @cond_branch\n" + " mov r0, #0x10\n" + " b ._36\n" + "._35:\n" + " mov r0, sp\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._40 @ gMapObjects\n" + " add r4, r0, r1\n" + " add r0, r4, #0\n" + " bl npc_clear_ids_and_state\n" + " ldrh r3, [r5, #0x4]\n" + " add r3, r3, #0x7\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " ldrh r2, [r5, #0x6]\n" + " add r2, r2, #0x7\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " ldrb r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " mov r1, #0x4\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + " ldrb r0, [r5, #0x1]\n" + " strb r0, [r4, #0x5]\n" + " ldrb r0, [r5, #0x9]\n" + " strb r0, [r4, #0x6]\n" + " ldrb r0, [r5]\n" + " strb r0, [r4, #0x8]\n" + " strb r6, [r4, #0x9]\n" + " strb r7, [r4, #0xa]\n" + " strh r3, [r4, #0xc]\n" + " strh r2, [r4, #0xe]\n" + " strh r3, [r4, #0x10]\n" + " strh r2, [r4, #0x12]\n" + " strh r3, [r4, #0x14]\n" + " strh r2, [r4, #0x16]\n" + " ldrb r0, [r5, #0x8]\n" + " mov r7, #0xf\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " ldrb r2, [r4, #0xb]\n" + " mov r0, #0x10\n" + " neg r0, r0\n" + " mov r8, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0xb]\n" + " ldrb r1, [r5, #0x8]\n" + " lsl r1, r1, #0x4\n" + " and r0, r0, r7\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0xb]\n" + " ldrb r1, [r5, #0xa]\n" + " lsl r1, r1, #0x1c\n" + " mov r0, #0xf\n" + " mov r9, r0\n" + " lsr r1, r1, #0x1c\n" + " ldrb r2, [r4, #0x19]\n" + " mov r0, r8\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + " ldrb r1, [r5, #0xa]\n" + " lsr r1, r1, #0x4\n" + " lsl r1, r1, #0x4\n" + " and r0, r0, r7\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + " ldrh r0, [r5, #0xc]\n" + " strb r0, [r4, #0x7]\n" + " ldrh r0, [r5, #0xe]\n" + " strb r0, [r4, #0x1d]\n" + " ldr r1, ._40 + 4 @ gUnknown_0836DC09\n" + " ldrb r0, [r5, #0x9]\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x20\n" + " strb r1, [r0]\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " bl FieldObjectSetDirection\n" + " add r0, r4, #0\n" + " bl FieldObjectHandleDynamicGraphicsId\n" + " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n" + " ldrb r0, [r4, #0x6]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._39 @cond_branch\n" + " ldrb r2, [r4, #0x19]\n" + " add r0, r7, #0\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._38 @cond_branch\n" + " lsl r0, r2, #0x1c\n" + " lsr r0, r0, #0x1c\n" + " add r0, r0, #0x1\n" + " mov r1, r9\n" + " and r0, r0, r1\n" + " mov r1, r8\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r4, #0x19]\n" + "._38:\n" + " ldrb r2, [r4, #0x19]\n" + " mov r0, #0xf0\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._39 @cond_branch\n" + " lsr r1, r2, #0x4\n" + " add r1, r1, #0x1\n" + " lsl r1, r1, #0x4\n" + " add r0, r7, #0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + "._39:\n" + " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, sp\n" + " ldrb r0, [r0]\n" + "._36:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._41:\n" + " .align 2, 0\n" + "._40:\n" + " .word gMapObjects\n" + " .word gUnknown_0836DC09\n" + " .word gUnknown_0836DBBC\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else +#ifdef NONMATCHING +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness + u8 var; + u16 r3; + u16 r2; + + //asm("nop"::"r"(b)); + if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) + return 16; + //_0805ACCE + mapObj = &gMapObjects[var]; + npc_clear_ids_and_state(mapObj); + r3 = template->x + 7; + r2 = template->y + 7; + mapObj->active = TRUE; + mapObj->mapobj_bit_2 = TRUE; + mapObj->graphicsId = template->graphicsId; + mapObj->animPattern = template->movementType; + mapObj->localId = template->localId; + mapObj->mapNum = b; + mapObj->mapGroup = c; + mapObj->coords1.x = r3; + mapObj->coords1.y = r2; + mapObj->coords2.x = r3; + mapObj->coords2.y = r2; + mapObj->coords3.x = r3; + mapObj->coords3.y = r2; + mapObj->mapobj_unk_0B_0 = template->elevation; + mapObj->elevation = template->elevation; + mapObj->range.as_nybbles.x = template->unkA_0; + mapObj->range.as_nybbles.y = template->unkA_4; + mapObj->trainerType = template->unkC; + mapObj->trainerRange_berryTreeId = template->unkE; + mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; + FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); + FieldObjectHandleDynamicGraphicsId(mapObj); + //asm("":::"r5","r6"); + if (gUnknown_0836DBBC[mapObj->animPattern] != 0) + { + if (mapObj->range.as_nybbles.x == 0) + mapObj->range.as_nybbles.x++; + if (mapObj->range.as_nybbles.y == 0) + mapObj->range.as_nybbles.y++; + } + return var; +} +#else +__attribute__((naked)) +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x4\n\ + adds r5, r0, 0\n\ + lsls r1, 24\n\ + lsrs r6, r1, 24\n\ + lsls r2, 24\n\ + lsrs r7, r2, 24\n\ + ldrb r0, [r5]\n\ + adds r1, r6, 0\n\ + adds r2, r7, 0\n\ + mov r3, sp\n\ + bl GetAvailableFieldObjectSlot\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0805ACCE\n\ + movs r0, 0x10\n\ + b _0805ADC2\n\ +_0805ACCE:\n\ + mov r0, sp\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 3\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0805ADD0 @ =gMapObjects\n\ + adds r4, r0, r1\n\ + adds r0, r4, 0\n\ + bl npc_clear_ids_and_state\n\ + ldrh r3, [r5, 0x4]\n\ + adds r3, 0x7\n\ + lsls r3, 16\n\ + lsrs r3, 16\n\ + ldrh r2, [r5, 0x6]\n\ + adds r2, 0x7\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + ldrb r0, [r4]\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + strb r0, [r4]\n\ + ldrb r0, [r5, 0x1]\n\ + strb r0, [r4, 0x5]\n\ + ldrb r0, [r5, 0x9]\n\ + strb r0, [r4, 0x6]\n\ + ldrb r0, [r5]\n\ + strb r0, [r4, 0x8]\n\ + strb r6, [r4, 0x9]\n\ + strb r7, [r4, 0xA]\n\ + strh r3, [r4, 0xC]\n\ + strh r2, [r4, 0xE]\n\ + strh r3, [r4, 0x10]\n\ + strh r2, [r4, 0x12]\n\ + strh r3, [r4, 0x14]\n\ + strh r2, [r4, 0x16]\n\ + ldrb r0, [r5, 0x8]\n\ + movs r7, 0xF\n\ + adds r1, r7, 0\n\ + ands r1, r0\n\ + ldrb r2, [r4, 0xB]\n\ + movs r0, 0x10\n\ + negs r0, r0\n\ + mov r8, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0xB]\n\ + ldrb r1, [r5, 0x8]\n\ + lsls r1, 4\n\ + ands r0, r7\n\ + orrs r0, r1\n\ + strb r0, [r4, 0xB]\n\ + ldrb r1, [r5, 0xA]\n\ + lsls r1, 28\n\ + movs r0, 0xF\n\ + mov r9, r0\n\ + lsrs r1, 28\n\ + ldrb r2, [r4, 0x19]\n\ + mov r0, r8\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x19]\n\ + ldrb r1, [r5, 0xA]\n\ + lsrs r1, 4\n\ + lsls r1, 4\n\ + ands r0, r7\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x19]\n\ + ldrh r0, [r5, 0xC]\n\ + strb r0, [r4, 0x7]\n\ + ldrh r0, [r5, 0xE]\n\ + strb r0, [r4, 0x1D]\n\ + ldr r1, _0805ADD4 @ =gUnknown_0836DC09\n\ + ldrb r0, [r5, 0x9]\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + adds r0, r4, 0\n\ + adds r0, 0x20\n\ + strb r1, [r0]\n\ + ldrb r1, [r0]\n\ + adds r0, r4, 0\n\ + bl FieldObjectSetDirection\n\ + adds r0, r4, 0\n\ + bl FieldObjectHandleDynamicGraphicsId\n\ + ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\ + ldrb r0, [r4, 0x6]\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _0805ADBE\n\ + ldrb r2, [r4, 0x19]\n\ + adds r0, r7, 0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0805ADA6\n\ + lsls r0, r2, 28\n\ + lsrs r0, 28\n\ + adds r0, 0x1\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r8\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + strb r1, [r4, 0x19]\n\ +_0805ADA6:\n\ + ldrb r2, [r4, 0x19]\n\ + movs r0, 0xF0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _0805ADBE\n\ + lsrs r1, r2, 4\n\ + adds r1, 0x1\n\ + lsls r1, 4\n\ + adds r0, r7, 0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r4, 0x19]\n\ +_0805ADBE:\n\ + mov r0, sp\n\ + ldrb r0, [r0]\n\ +_0805ADC2:\n\ + add sp, 0x4\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_0805ADD0: .4byte gMapObjects\n\ +_0805ADD4: .4byte gUnknown_0836DC09\n\ +_0805ADD8: .4byte gUnknown_0836DBBC\n\ + .syntax divided\n"); +} +#endif +#endif + +u8 sub_805ADDC(u8 localId) +{ + u8 objectCount; + u8 i; + + if (gMapHeader.events == NULL) + return 16; + objectCount = gMapHeader.events->mapObjectCount; + for (i = 0; i < objectCount; i++) + { + struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; + + if (template->localId == localId && !FlagGet(template->flagId)) + return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + } + return 16; +} + +u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) +{ + u8 i = 0; + + for (i = 0; i < 16 && gMapObjects[i].active; i++) + { + if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) + return 1; + } + if (i >= 16) + return 1; + *d = i; + for (; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) + return 1; + } + return 0; +} + +#if DEBUG +__attribute__((naked)) +void RemoveFieldObject(struct MapObject *mapObject) +{ + asm( + " push {lr}\n" + " ldrb r2, [r0]\n" + " mov r1, #0x2\n" + " neg r1, r1\n" + " and r1, r1, r2\n" + " strb r1, [r0]\n" + " bl RemoveFieldObjectInternal\n" + " ldr r1, ._72 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " pop {r0}\n" + " bx r0\n" + "._73:\n" + " .align 2, 0\n" + "._72:\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else +void RemoveFieldObject(struct MapObject *mapObject) +{ + mapObject->active = FALSE; + RemoveFieldObjectInternal(mapObject); +} +#endif + +void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return; + FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId)); + RemoveFieldObject(&gMapObjects[mapObjectId]); +} + +void RemoveFieldObjectInternal(struct MapObject *mapObject) +{ + struct SpriteFrameImage image; + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + + image.size = gfxInfo->size; + gSprites[mapObject->spriteId].images = ℑ + DestroySprite(&gSprites[mapObject->spriteId]); +} + +void npc_hide_all_but_player(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (i != gPlayerAvatar.mapObjectId) + RemoveFieldObject(&gMapObjects[i]); + } +} + +#if DEBUG +__attribute__((naked)) +u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add r7, r1, #0\n" + " add r1, r2, #0\n" + " add r2, r3, #0\n" + " ldr r3, [sp, #0x20]\n" + " ldr r4, [sp, #0x24]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " mov r9, r3\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " mov sl, r4\n" + " bl InitFieldObjectStateFromTemplate\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " cmp r0, #0x10\n" + " bne ._83 @cond_branch\n" + " mov r0, #0x10\n" + " b ._92\n" + "._83:\n" + " mov r0, r8\n" + " lsl r4, r0, #0x3\n" + " add r0, r4, r0\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._87 @ gMapObjects\n" + " add r5, r0, r1\n" + " ldrb r0, [r5, #0x5]\n" + " bl GetFieldObjectGraphicsInfo\n" + " add r6, r0, #0\n" + " ldrb r1, [r6, #0xc]\n" + " mov r0, #0xf\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._85 @cond_branch\n" + " ldrh r0, [r6, #0x2]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " bl npc_load_two_palettes__no_record\n" + " b ._89\n" + "._88:\n" + " .align 2, 0\n" + "._87:\n" + " .word gMapObjects\n" + "._85:\n" + " cmp r0, #0xa\n" + " bne ._89 @cond_branch\n" + " ldrh r0, [r6, #0x2]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " bl npc_load_two_palettes__and_record\n" + "._89:\n" + " ldrb r0, [r5, #0x6]\n" + " cmp r0, #0x4c\n" + " bne ._90 @cond_branch\n" + " ldrb r0, [r5, #0x1]\n" + " mov r1, #0x20\n" + " orr r0, r0, r1\n" + " strb r0, [r5, #0x1]\n" + "._90:\n" + " ldr r1, ._93 @ 0xffff\n" + " add r0, r1, #0\n" + " strh r0, [r7, #0x2]\n" + " add r0, r7, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x40\n" + " bne ._91 @cond_branch\n" + " ldr r1, ._93 + 4 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, ._93 + 8 @ gMapObjects\n" + " mov r2, r8\n" + " add r1, r4, r2\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r0\n" + " ldrb r2, [r1]\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " strb r0, [r1]\n" + " mov r0, #0x10\n" + " b ._92\n" + "._94:\n" + " .align 2, 0\n" + "._93:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_03004BC0\n" + " .word gMapObjects\n" + "._91:\n" + " lsl r0, r7, #0x4\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._96 @ gSprites\n" + " add r4, r0, r1\n" + " mov r1, r9\n" + " lsl r0, r1, #0x10\n" + " asr r0, r0, #0x10\n" + " ldrh r2, [r5, #0x10]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " mov r2, sl\n" + " lsl r1, r2, #0x10\n" + " asr r1, r1, #0x10\n" + " ldrh r2, [r5, #0x12]\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " add r2, r4, #0\n" + " add r2, r2, #0x20\n" + " add r3, r4, #0\n" + " add r3, r3, #0x22\n" + " bl sub_8060388\n" + " ldrh r0, [r6, #0x8]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x11\n" + " neg r0, r0\n" + " add r1, r4, #0\n" + " add r1, r1, #0x28\n" + " strb r0, [r1]\n" + " ldrh r0, [r6, #0xa]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x11\n" + " neg r0, r0\n" + " add r2, r4, #0\n" + " add r2, r2, #0x29\n" + " strb r0, [r2]\n" + " ldrh r0, [r4, #0x20]\n" + " add r0, r0, #0x8\n" + " strh r0, [r4, #0x20]\n" + " ldrh r1, [r4, #0x22]\n" + " add r1, r1, #0x10\n" + " mov r0, #0x0\n" + " ldsb r0, [r2, r0]\n" + " add r0, r0, r1\n" + " strh r0, [r4, #0x22]\n" + " ldrb r1, [r6, #0xc]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x18\n" + " ldrb r2, [r4, #0x5]\n" + " mov r0, #0xf\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x5]\n" + " add r2, r4, #0\n" + " add r2, r2, #0x3e\n" + " ldrb r0, [r2]\n" + " mov r1, #0x2\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " mov r0, r8\n" + " strh r0, [r4, #0x2e]\n" + " strb r7, [r5, #0x4]\n" + " ldrb r1, [r6, #0xc]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1f\n" + " lsl r1, r1, #0x4\n" + " ldrb r2, [r5, #0x1]\n" + " mov r0, #0x11\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r5, #0x1]\n" + " lsl r0, r0, #0x1b\n" + " cmp r0, #0\n" + " blt ._95 @cond_branch\n" + " ldrb r0, [r5, #0x18]\n" + " lsl r0, r0, #0x1c\n" + " lsr r0, r0, #0x1c\n" + " bl FieldObjectDirectionToImageAnimId\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " bl StartSpriteAnim\n" + "._95:\n" + " ldrb r0, [r5, #0xb]\n" + " lsr r0, r0, #0x4\n" + " add r1, r4, #0\n" + " mov r2, #0x1\n" + " bl SetObjectSubpriorityByZCoord\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " bl sub_80634D0\n" + " mov r0, r8\n" + "._92:\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._97:\n" + " .align 2, 0\n" + "._96:\n" + " .word gSprites\n" + "\n" + ); +} +#else +u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) +{ + u8 mapObjectId; + u8 spriteId; + const struct MapObjectGraphicsInfo *gfxInfo; + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d); + if (mapObjectId == 16) + return 16; + + mapObject = &gMapObjects[mapObjectId]; + gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (gfxInfo->paletteSlot == 0) + npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + else if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (mapObject->animPattern == 0x4C) + mapObject->mapobj_bit_13 = TRUE; + +#ifdef NONMATCHING + sprTemplate->paletteTag = 0xFFFF; +#else + *(u16 *)&sprTemplate->paletteTag = 0xFFFF; +#endif + spriteId = CreateSprite(sprTemplate, 0, 0, 0); + if (spriteId == 64) + { + gMapObjects[mapObjectId].active = FALSE; + return 16; + } + sprite = &gSprites[spriteId]; + sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = mapObjectId; + mapObject->spriteId = spriteId; + mapObject->mapobj_bit_12 = gfxInfo->inanimate; + if (!mapObject->mapobj_bit_12) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); + sub_80634D0(mapObject, sprite); + return mapObjectId; +} +#endif + +u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) +{ + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables = NULL; + struct SpriteFrameImage spriteFrameImage; + const struct MapObjectGraphicsInfo *gfxInfo; + u8 mapObjectId; + + gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId); + MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = gfxInfo->size; + spriteTemplate.images = &spriteFrameImage; + mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e); + if (mapObjectId == 16) + return 16; + gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images; + if (subspriteTables != NULL) + SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); + return mapObjectId; +} + +u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate) +{ + s16 x; + s16 y; + + GetFieldObjectMovingCameraOffset(&x, &y); + return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); +} + +u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f) +{ + struct MapObjectTemplate mapObjTemplate; + + d -= 7; + e -= 7; + mapObjTemplate.localId = c; + mapObjTemplate.graphicsId = a; + mapObjTemplate.unk2 = 0; + mapObjTemplate.x = d; + mapObjTemplate.y = e; + mapObjTemplate.elevation = f; + mapObjTemplate.movementType = b; + mapObjTemplate.unkA_0 = 0; + mapObjTemplate.unkA_4 = 0; + mapObjTemplate.unkC = 0; + mapObjTemplate.unkE = 0; + return SpawnSpecialFieldObject(&mapObjTemplate); +} + +u8 show_sprite(u8 a, u8 b, u8 c) +{ + struct MapObjectTemplate *r5; + s16 x; + s16 y; + + r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c); + if (r5 == NULL) + return 16; + GetFieldObjectMovingCameraOffset(&x, &y); + return SpawnFieldObject(r5, b, c, x, y); +} + +void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + + sprTemplate->tileTag = gfxInfo->tileTag; + sprTemplate->paletteTag = gfxInfo->paletteTag1; + sprTemplate->oam = gfxInfo->oam; + sprTemplate->anims = gfxInfo->anims; + sprTemplate->images = gfxInfo->images; + sprTemplate->affineAnims = gfxInfo->affineAnims; + sprTemplate->callback = callback; + *subspriteTables = gfxInfo->subspriteTables; +} + +void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables); +} + +void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); +} + +u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); + if (spriteTemplate.paletteTag != 0xFFFF) + sub_805BDF8(spriteTemplate.paletteTag); + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); + if (spriteId != 64 && subspriteTables != NULL) + { + SetSubspriteTables(&gSprites[spriteId], subspriteTables); + gSprites[spriteId].subspriteMode = 2; + } + return spriteId; +} + +extern void sub_8064970(struct Sprite *); +extern void sub_8060470(s16 *, s16 *, s16, s16); +void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z); + +u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) +{ + const struct MapObjectGraphicsInfo *gfxInfo; + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8064970, &spriteTemplate, &subspriteTables); +#ifdef NONMATCHING + spriteTemplate.paletteTag = 0xFFFF; +#else + *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; +#endif + x += 7; + y += 7; + sub_8060470(&x, &y, 8, 16); + spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); + if (spriteId != 64) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.y += sprite->centerToCornerVecY; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = b; + sprite->data[1] = elevation; + if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (subspriteTables != NULL) + { + SetSubspriteTables(sprite, subspriteTables); + sprite->subspriteMode = 2; + } + InitObjectPriorityByZCoord(sprite, elevation); + SetObjectSubpriorityByZCoord(elevation, sprite, 1); + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); + } + return spriteId; +} + +void sub_805B55C(s16 a, s16 b) +{ + u8 i; + + if (gMapHeader.events != NULL) + { + s16 r9 = gSaveBlock1.pos.x - 2; + s16 sp8 = gSaveBlock1.pos.x + 17; + s16 r10 = gSaveBlock1.pos.y; + s16 spC = gSaveBlock1.pos.y + 16; + u8 objectCount = gMapHeader.events->mapObjectCount; + + for (i = 0; i < objectCount; i++) + { + struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; + s16 foo = template->x + 7; + s16 bar = template->y + 7; + + if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo + && !FlagGet(template->flagId)) + SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b); + } + } +} + +void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject); + +void RemoveFieldObjectsOutsideView(void) +{ + u8 i; + u8 j; + + for (i = 0; i < 16; i++) + { + bool8 isActiveLinkPlayer; + + for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) + { + if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) + isActiveLinkPlayer = TRUE; + } + if (!isActiveLinkPlayer) + { + struct MapObject *mapObject = &gMapObjects[i]; + + if (mapObject->active && !mapObject->mapobj_bit_16) + RemoveFieldObjectIfOutsideView(mapObject); + } + } +} + +void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) +{ + s16 r7 = gSaveBlock1.pos.x - 2; + s16 r5 = gSaveBlock1.pos.x + 17; + s16 r4 = gSaveBlock1.pos.y; + s16 r6 = gSaveBlock1.pos.y + 16; + + if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5 + && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6) + return; + if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5 + && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6) + return; + RemoveFieldObject(mapObject); +} + +void sub_805B75C(u8, s16, s16); + +#if DEBUG +__attribute__((naked)) +void sub_805B710(u16 u161, u16 u162) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " lsl r5, r5, #0x10\n" + " lsr r5, r5, #0x10\n" + " ldr r6, ._153 @ gUnknown_Debug_03004BC0\n" + " mov r0, #0x0\n" + " strb r0, [r6]\n" + " bl ClearPlayerAvatarInfo\n" + " mov r7, #0x0\n" + " ldr r0, ._153 + 4 @ gMapObjects\n" + " mov r8, r0\n" + " lsl r4, r4, #0x10\n" + " lsl r5, r5, #0x10\n" + "._152:\n" + " lsl r0, r7, #0x3\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r8\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x1f\n" + " cmp r0, #0\n" + " beq ._151 @cond_branch\n" + " add r0, r7, #0\n" + " asr r1, r4, #0x10\n" + " asr r2, r5, #0x10\n" + " bl sub_805B75C\n" + " ldrb r0, [r6]\n" + " add r0, r0, #0x1\n" + " strb r0, [r6]\n" + "._151:\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0xf\n" + " bls ._152 @cond_branch\n" + " bl sub_805AAB0\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._154:\n" + " .align 2, 0\n" + "._153:\n" + " .word gUnknown_Debug_03004BC0\n" + " .word gMapObjects\n" + "\n" + ); +} +#else +void sub_805B710(u16 a, u16 b) +{ + u8 i; + + ClearPlayerAvatarInfo(); + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active) + sub_805B75C(i, a, b); + } + sub_805AAB0(); +} +#endif + +extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); +extern void sub_805B914(struct MapObject *); + +void sub_805B75C(u8 a, s16 b, s16 c) +{ + struct SpriteTemplate sp0; + struct SpriteFrameImage sp18; + const struct SubspriteTable *subspriteTables; + const struct MapObjectGraphicsInfo *gfxInfo; + struct MapObject *mapObject; + u8 spriteId; + + #define i spriteId + for (i = 0; i < 4; i++) + { + if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId) + return; + } + #undef i + + mapObject = &gMapObjects[a]; + asm("":::"r5"); + subspriteTables = NULL; + gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sp18.size = gfxInfo->size; + MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables); + sp0.images = &sp18; + *(u16 *)&sp0.paletteTag = 0xFFFF; + if (gfxInfo->paletteSlot == 0) + npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (gfxInfo->paletteSlot > 9) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + *(u16 *)&sp0.paletteTag = 0xFFFF; + spriteId = CreateSprite(&sp0, 0, 0, 0); + if (spriteId != 64) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sprite->images = gfxInfo->images; + if (mapObject->animPattern == 11) + { + SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId); + mapObject->mapobj_unk_1B = sub_8126B54(); + } + if (subspriteTables != NULL) + SetSubspriteTables(sprite, subspriteTables); + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = a; + mapObject->spriteId = spriteId; + if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + sub_805B914(mapObject); + SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); + } +} + +void sub_805B914(struct MapObject *mapObject) +{ + mapObject->mapobj_bit_1 = FALSE; + mapObject->mapobj_bit_2 = TRUE; + mapObject->mapobj_bit_22 = FALSE; + mapObject->mapobj_bit_17 = FALSE; + mapObject->mapobj_bit_18 = FALSE; + mapObject->mapobj_bit_19 = FALSE; + mapObject->mapobj_bit_20 = FALSE; + mapObject->mapobj_bit_21 = FALSE; + FieldObjectClearAnim(mapObject); +} + +void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) +{ + gPlayerAvatar.mapObjectId = mapObjectId; + gPlayerAvatar.spriteId = spriteId; + gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); + SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); +} + +void sub_805B980(struct MapObject *mapObject, u8 graphicsId) +{ + const struct MapObjectGraphicsInfo *gfxInfo; + struct Sprite *sprite; + + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + sprite = &gSprites[mapObject->spriteId]; + if (gfxInfo->paletteSlot == 0) + pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + sprite->oam.shape = gfxInfo->oam->shape; + sprite->oam.size = gfxInfo->oam->size; + sprite->images = gfxInfo->images; + sprite->anims = gfxInfo->anims; + sprite->subspriteTables = gfxInfo->subspriteTables; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + mapObject->mapobj_bit_12 = gfxInfo->inanimate; + mapObject->graphicsId = graphicsId; + sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + if (mapObject->mapobj_bit_15) + CameraObjectReset1(); +} + +void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + sub_805B980(&gMapObjects[mapObjectId], graphicsId); +} + +void FieldObjectTurn(struct MapObject *mapObject, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + if (!mapObject->mapobj_bit_12) + { + StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); + } +} + +void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + FieldObjectTurn(&gMapObjects[mapObjectId], direction); +} + +void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction) +{ + FieldObjectTurn(&gMapObjects[player->mapObjectId], direction); +} + +void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 treeStage; + u8 treeId; + + mapObject->mapobj_bit_13 = TRUE; + sprite->invisible = TRUE; + treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); + if (treeStage != 0) + { + mapObject->mapobj_bit_13 = FALSE; + sprite->invisible = FALSE; + treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; + treeStage--; + if (treeId > 0x2B) + treeId = 0; + sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]); + sprite->images = gBerryTreePicTablePointers[treeId]; + sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage]; + StartSpriteAnim(sprite, treeStage); + } +} + +const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) +{ + if (graphicsId > 0xEF) + graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16); + if (graphicsId > 0xD9) + graphicsId = 5; + return gMapObjectGraphicsInfoPointers[graphicsId]; +} + +void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) +{ + if (mapObject->graphicsId > 0xEF) + mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16); +} + +void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + gMapObjects[mapObjectId].mapobj_bit_13 = d; +} + +void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) +{ + *(u8 *)localId = mapObject->localId; + *(u8 *)mapNum = mapObject->mapNum; + *(u8 *)mapGroup = mapObject->mapGroup; +} + +void sub_805BCC0(s16 x, s16 y) +{ + u8 mapObjectId; + struct MapObject *mapObject; + + mapObjectId = GetFieldObjectIdByXY(x, y); + if (mapObjectId != 16) + { + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_2 = TRUE; + } +} + +void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) +{ + u8 mapObjectId; + struct MapObject *mapObject; + struct Sprite *sprite; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + mapObject = &gMapObjects[mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + mapObject->mapobj_bit_26 = TRUE; + sprite->subpriority = subpriority; + } +} + +void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + struct MapObject *mapObject; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_26 = FALSE; + mapObject->mapobj_bit_2 = TRUE; + } +} + +void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 mapObjectId; + struct Sprite *sprite; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + } +} + +void gpu_pal_allocator_reset__manage_upper_four(void) +{ + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 12; +} + +void sub_805BDF8(u16 tag) +{ + u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag); + + if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8 + sub_805BE58(&gUnknown_0837377C[paletteIndex]); +} + +void unref_sub_805BE24(u16 *arr) +{ + u8 i; + + for (i = 0; arr[i] != 0x11FF; i++) + sub_805BDF8(arr[i]); +} + +u8 sub_805BE58(const struct SpritePalette *palette) +{ + if (IndexOfSpritePaletteTag(palette->tag) != 0xFF) + return 0xFF; + else + return LoadSpritePalette(palette); +} + +void pal_patch_for_npc(u16 a, u16 b) +{ + u8 var = b; + u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a); + + LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20); +} + +void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c) +{ + for (; b < c; arr++, b++) + pal_patch_for_npc(*arr, b); +} + +u8 FindFieldObjectPaletteIndexByTag(u16 tag) +{ + u8 i; + + for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++) + { + if (gUnknown_0837377C[i].tag == tag) + return i; + } + return 0xFF; +} + +void npc_load_two_palettes__no_record(u16 a, u8 b) +{ + u8 i; + + pal_patch_for_npc(a, b); + for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++) + { + if (gUnknown_08373874[i].tag == a) + { + pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); + break; + } + } +} + +void npc_load_two_palettes__and_record(u16 a, u8 b) +{ + u8 i; + + gUnknown_030005A6 = a; + pal_patch_for_npc(a, b); + for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) + { + if (gUnknown_083738E4[i].tag == a) + { + pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); + break; + } + } +} + +void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = mapObject->coords2.x; + mapObject->coords3.y = mapObject->coords2.y; + mapObject->coords2.x += x; + mapObject->coords2.y += y; +} + +void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = mapObject->coords2.x; + mapObject->coords3.y = mapObject->coords2.y; + mapObject->coords2.x = x; + mapObject->coords2.y = y; +} + +void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = x; + mapObject->coords3.y = y; + mapObject->coords2.x = x; + mapObject->coords2.y = y; +} + +void sub_805C058(struct MapObject *mapObject, s16 x, s16 y) +{ + struct Sprite *sprite = &gSprites[mapObject->spriteId]; + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + + npc_coords_set(mapObject, x, y); + sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sub_805B914(mapObject); + if (mapObject->mapobj_bit_15) + CameraObjectReset1(); +} + +void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + x += 7; + y += 7; + sub_805C058(&gMapObjects[mapObjectId], x, y); + } +} + +void npc_coords_shift_still(struct MapObject *mapObject) +{ + npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); +} + +void UpdateFieldObjectCoordsForCameraUpdate(void) +{ + u8 i; + s16 deltaX; + s16 deltaY; + + if (gCamera.field_0) + { + deltaX = gCamera.x; + deltaY = gCamera.y; + for (i = 0; i < 16; i++) + { + + if (gMapObjects[i].active) + { + gMapObjects[i].coords1.x -= deltaX; + gMapObjects[i].coords1.y -= deltaY; + gMapObjects[i].coords2.x -= deltaX; + gMapObjects[i].coords2.y -= deltaY; + gMapObjects[i].coords3.x -= deltaX; + gMapObjects[i].coords3.y -= deltaY; + } + } + } +} + +bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); + +u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y + && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) + return i; + } + return 16; +} + +bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) +{ + if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 + && mapObject->mapobj_unk_0B_0 != z) + return FALSE; + else + return TRUE; +} + +void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) +{ + UpdateFieldObjectCoordsForCameraUpdate(); + sub_805B55C(x, y); + RemoveFieldObjectsOutsideView(); +} + +u8 AddCameraObject(u8 a) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4); + + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[0] = a; + return spriteId; +} + +void ObjectCB_CameraObject(struct Sprite *sprite) +{ + void (*cameraObjectFuncs[3])(struct Sprite *); + memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs); + cameraObjectFuncs[sprite->data[1]](sprite); +} + +void CameraObject_0(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->invisible = TRUE; + sprite->data[1] = 1; + CameraObject_1(sprite); +} + +void CameraObject_1(struct Sprite *sprite) +{ + s16 x = gSprites[sprite->data[0]].pos1.x; + s16 y = gSprites[sprite->data[0]].pos1.y; + + sprite->data[2] = x - sprite->pos1.x; + sprite->data[3] = y - sprite->pos1.y; + sprite->pos1.x = x; + sprite->pos1.y = y; +} + +void CameraObject_2(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->data[2] = 0; + sprite->data[3] = 0; +} + +struct Sprite *FindCameraObject(void) +{ + u8 i; + + for (i = 0; i < 64; i++) + { + if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) + return &gSprites[i]; + } + return NULL; +} + +void CameraObjectReset1(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite != NULL) + { + cameraSprite->data[1] = 0; + cameraSprite->callback(cameraSprite); + } +} + +void CameraObjectSetFollowedObjectId(u8 spriteId) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite != NULL) + { + cameraSprite->data[0] = spriteId; + CameraObjectReset1(); + } +} + +u8 CameraObjectGetFollowedObjectId(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite == NULL) + return 64; + else + return cameraSprite->data[0]; +} + +void CameraObjectReset2(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + cameraSprite->data[1] = 2; +} + +u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < 64; i++) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *src; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + break; + } + } + return i; +} + +u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority) +{ + s16 i; + + for (i = 63; i > -1; i--) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *src; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + return i; + } + } + return 64; +} + +void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) +{ + mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; + if (!mapObject->mapobj_bit_9) + { + s8 _direction = direction; //needed for the asm to match + mapObject->mapobj_unk_18 = _direction; + } + mapObject->placeholder18 = direction; +} + +u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + + return template->script; +} + +u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) +{ + return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); +} + +u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + + return template->flagId; +} + +u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) +{ + return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); +} + +u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return 0xFF; + else + return gMapObjects[mapObjectId].trainerType; +} + +u8 unref_sub_805C60C(u8 mapObjectId) +{ + return gMapObjects[mapObjectId].trainerType; +} + +u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return 0xFF; + else + return gMapObjects[mapObjectId].trainerRange_berryTreeId; +} + +u8 FieldObjectGetBerryTreeId(u8 mapObjectId) +{ + return gMapObjects[mapObjectId].trainerRange_berryTreeId; +} + +struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8); + +struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup) + return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount); + else + { + struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); + + return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount); + } +} + +struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) +{ + u8 i; + + for (i = 0; i < count; i++) + { + if (templates[i].localId == localId) + return &templates[i]; + } + return NULL; +} + +struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject) +{ + s32 i; + + if (mapObject->mapNum != gSaveBlock1.location.mapNum + || mapObject->mapGroup != gSaveBlock1.location.mapGroup) + return NULL; + + for (i = 0; i < 64; i++) + { + if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId) + return &gSaveBlock1.mapObjectTemplates[i]; + } + return NULL; +} + +void sub_805C754(struct MapObject *mapObject) +{ + struct MapObjectTemplate *template = sub_805C700(mapObject); + + if (template != NULL) + { + template->x = mapObject->coords2.x - 7; + template->y = mapObject->coords2.y - 7; + } +} + +void sub_805C774(struct MapObject *mapObject, u8 movementType) +{ + struct MapObjectTemplate *template = sub_805C700(mapObject); + + if (template != NULL) + template->movementType = movementType; +} + +void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + sub_805C754(&gMapObjects[mapObjectId]); +} + +void sub_805C7C4(u8 a) +{ + gpu_pal_allocator_reset__manage_upper_four(); + gUnknown_030005A6 = 0x11FF; + gUnknown_030005A4 = a; + pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10); +} + +u16 npc_paltag_by_palslot(u8 a) +{ + u8 i; + + if (a < 10) + return gUnknown_0837399C[gUnknown_030005A4][a]; + + for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) + { + if (gUnknown_083738E4[i].tag == gUnknown_030005A6) + { + return gUnknown_083738E4[i].data[gUnknown_030005A4]; + } + } + return 0x11FF; +} + +fieldmap_object_null_cb(sub_805C884, sub_805C8A8); +fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224); + +u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); + +u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); +void sub_8064820(struct Sprite *, s16); + +u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +extern u8 sub_8064824(struct Sprite *); + +u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +extern u8 sub_805FF20(struct MapObject *, u8); + +u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + direction = directions[Random() & 3]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) +{ + s16 x; + s16 y; + s16 objx; + s16 objy; + s16 minx; + s16 maxx; + s16 miny; + s16 maxy; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0) + { + return 0; + } + if (mapObject->trainerType != 1 && mapObject->trainerType != 3) + { + return 0; + } + PlayerGetDestCoords(&x, &y); + objx = mapObject->coords2.x; + objy = mapObject->coords2.y; + minx = objx - mapObject->trainerRange_berryTreeId; + miny = objy - mapObject->trainerRange_berryTreeId; + maxx = objx + mapObject->trainerRange_berryTreeId; + maxy = objy + mapObject->trainerRange_berryTreeId; + if (minx > x || maxx < x || miny > y || maxy < y) + { + return 0; + } + return 1; +} + +u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + if (a2 > a3) + { + dirn = DIR_EAST; + if (a0 < 0) + { + dirn = DIR_WEST; + } + } + else + { + dirn = DIR_SOUTH; + if (a1 < 0) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = DIR_SOUTH; + if (a1 < 0) + { + dirn = DIR_NORTH; + } + return dirn; +} + +u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = DIR_EAST; + if (a0 < 0) + { + dirn = DIR_WEST; + } + return dirn; +} + +u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = DIR_NORTH; + } + } + else if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = DIR_NORTH; + } + } + else if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = DIR_SOUTH; + } + } + else if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = DIR_SOUTH; + } + } + return dirn; +} + +u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) { + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = DIR_SOUTH; + } + } + else if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = DIR_SOUTH; + } + } + return dirn; +} + +u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CD60(struct MapObject *mapObject, u8 a1) +{ + s16 x; + s16 y; + s16 x2; + s16 y2; + if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + return 0; + } + PlayerGetDestCoords(&x, &y); + x -= mapObject->coords2.x; + y -= mapObject->coords2.y; + x2 = x; + y2 = y; + if (x2 < 0) + { + x2 = -x2; + } + if (y2 < 0) + { + y2 = -y2; + } + return gUnknown_08375244[a1](x, y, x2, y2); +} + +fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270); + +u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284); + +u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752A0, 2); + direction = directions[Random() & 1]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4); + +u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752C0, 2); + direction = directions[Random() & 1]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4); + +u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + sprite->data[1] = 2; + return 1; + } + return 0; +} + +u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + return 0; +} + +u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite); + +void FieldObjectCB_BerryTree(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (!(sprite->data[7] & 1)) + { + get_berry_tree_graphics(mapObject, sprite); + sprite->data[7] |= 1; + } + meta_step(mapObject, sprite, sub_805D314); +} + +u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite) +{ + return gUnknown_083752D0[sprite->data[1]](mapObject, sprite); +} + +u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 berryTreeStage; + npc_reset(mapObject, sprite); + mapObject->mapobj_bit_13 = 1; + sprite->invisible = 1; + berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); + if (!berryTreeStage) + { + if (!(sprite->data[7] & 4) && sprite->animNum == 4) + { + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); + sprite->animNum = 0; + } + return 0; + } + mapObject->mapobj_bit_13 = 0; + sprite->invisible = 0; + berryTreeStage--; + if (sprite->animNum != berryTreeStage) + { + sprite->data[1] = 2; + return 1; + } + get_berry_tree_graphics(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, 0x39); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 0; + return 1; + } + return 0; +} + +u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 3; + sprite->data[2] = 0; + sprite->data[7] |= 2; + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); + return 1; +} + +u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[2]++; + mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); + sprite->animPaused = 1; + if (sprite->data[2] > 64) + { + get_berry_tree_graphics(mapObject, sprite); + sprite->data[1] = 4; + sprite->data[2] = 0; + return 1; + } + return 0; +} + +u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[2]++; + mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); + sprite->animPaused = 1; + if (sprite->data[2] > 64) + { + sprite->data[1] = 0; + sprite->data[7] &= (-3); + return 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4); + +u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752A0, 2); + direction = sub_805CD60(mapObject, 1); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8); + +u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752C0, 2); + direction = sub_805CD60(mapObject, 2); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C); + +u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375320, 2); + direction = sub_805CD60(mapObject, 3); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324); + +u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375338, 2); + direction = sub_805CD60(mapObject, 4); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C); + +u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375350, 2); + direction = sub_805CD60(mapObject, 5); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354); + +u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375368, 2); + direction = sub_805CD60(mapObject, 6); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C); + +u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375380, 4); + direction = sub_805CD60(mapObject, 7); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384); + +u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375398, 4); + direction = sub_805CD60(mapObject, 8); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C); + +u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_083753B0, 4); + direction = sub_805CD60(mapObject, 9); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4); + +u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_083753C8, 4); + direction = sub_805CD60(mapObject, 10); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC); + +u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, 0x30); + sprite->data[1] = 2; + } + return 0; +} + +u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gUnknown_083753DC, 5); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[mapObject->mapobj_unk_18]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 0; + return 1; +} + +fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4); + +u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, 0x30); + sprite->data[1] = 2; + } + return 0; +} + +u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gUnknown_083753F4, 5); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[mapObject->mapobj_unk_18]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 0; + return 1; +} + +fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC); + +u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + direction = gUnknown_0836DC09[mapObject->animPattern]; + if (mapObject->mapobj_unk_21 != 0) + { + direction = GetOppositeDirection(direction); + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 v0; + u8 goSpeed0AnimId; + if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 0; + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + } + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + if (v0 == 1) + { + mapObject->mapobj_unk_21 ++; + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + } + if (v0 != 0) + { + goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); + } + FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 3; + return 1; +} + +u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence) +{ + u8 v0; + u8 goSpeed0AnimId; + if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 0; + } + FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + if (v0 == 1) + { + mapObject->mapobj_unk_21 ++; + FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + } + if (v0 != 0) + { + goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); + } + FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C); + +u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375418, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C); + +u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375428, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C); + +u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375438, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C); + +u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375448, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + + + +fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C); + +u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375458, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C); + +u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375468, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C); + +u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478); + +u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375484, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488); + +u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375494, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498); + +u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754A4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8); + +u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754B4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8); + +u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754C4, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8); + +u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754D4, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8); + +u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754E4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8); + +u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754F4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8); + +u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375504, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508); + +u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375514, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518); + +u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375524, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528); + +u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375534, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538); + +u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375544, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548); + +u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375554, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558); + +u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375564, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568); + +u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375574, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578); + +u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375584, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +}; + +fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588); + +u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + if (mapObject->mapobj_unk_21 == 0) + { + mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); + } + sprite->data[1] = 1; + return 1; +} + +u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + { + return 0; + } + return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); +} + +u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +bool8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + return 0; +} + +bool8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2))); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +bool8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = a2; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); + if (npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +bool8 sub_805F4F0(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_8060744(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F5A8(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806079C(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F660(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80607C8(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806084C(direction)); + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F760(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80608A4(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + x = mapObject->coords2.x; + y = mapObject->coords2.y; + sub_8060320(direction, &x, &y, 2, 2); + FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); + +u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + { + return 0; + } + return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); +} + +u8 sub_805F9F8(struct MapObject *, struct Sprite *); + +void FieldObjectCB_TreeDisguise(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) + { + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); + mapObject->mapobj_unk_21 = 1; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); +} + +u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + return 0; +} + +void FieldObjectCB_MountainDisguise(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) + { + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); + mapObject->mapobj_unk_21 = 1; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); +} + +u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite); + +void FieldObjectCB_Hidden1(struct Sprite *sprite) +{ + if (sprite->data[7] == 0) + { + gMapObjects[sprite->data[0]].mapobj_bit_26 = 1; + sprite->subspriteMode = 2; + sprite->oam.priority = 3; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805FAD8); +} + +u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + return gUnknown_083755CC[sprite->data[1]](mapObject, sprite); +} + +u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + return 0; +} + +u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 0; + } + return 0; +} + +fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0); + +u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8); + +u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0); + +u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8); + +u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + mapObject->mapobj_bit_13 = 1; + sprite->data[1] = 1; + return 1; +} + +u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 2; + return 1; + } + return 0; +} + +u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + return 0; +} + +void sub_805FC70(struct Sprite *sprite); + +void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + mapObject->mapobj_bit_6 = 0; + mapObject->mapobj_bit_7 = 0; + mapObject->mapobj_unk_1C = 0xff; + sprite->data[1] = 0; +} + +u8 FieldObjectDirectionToImageAnimId(u8 direction) +{ + return gUnknown_083755F4[direction]; +} + +u8 get_go_image_anim_num(u8 direction) +{ + return gUnknown_083755FD[direction]; +} + +u8 get_go_fast_image_anim_num(u8 direction) +{ + return gUnknown_08375606[direction]; +} + +u8 get_go_faster_image_anim_num(u8 direction) +{ + return gUnknown_0837560F[direction]; +} + +u8 sub_805FD78(u8 direction) +{ + return gUnknown_08375618[direction]; +} + +u8 sub_805FD88(u8 direction) +{ + return gUnknown_08375621[direction]; +} + +u8 sub_805FD98(u8 direction) +{ + return gUnknown_0837562A[direction]; +} + +u8 unref_sub_805FDA8(u8 direction) +{ + return gUnknown_08375633[direction]; +} + +u8 sub_805FDB8(u8 direction) +{ + return gUnknown_0837563C[direction]; +} + +u8 sub_805FDC8(u8 direction) +{ + return gUnknown_08375645[direction]; +} + +u8 sub_805FDD8(u8 direction) +{ + return gUnknown_0837564E[direction]; +} + +u8 sub_805FDE8(u8 direction) +{ + return gUnknown_08375657[direction]; +} + +u8 sub_805FDF8(u8 direction) +{ + return gUnknown_08375660[direction]; +} + +u8 sub_805FE08(u8 direction) +{ + return gUnknown_08375669[direction]; +} + +u8 get_run_image_anim_num(u8 direction) +{ + return gUnknown_08375672[direction]; +} + +void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) +{ + if (!mapObject->mapobj_bit_12) + { + sprite->animNum = animNum; + if (sprite->animCmdIndex == 1) + { + sprite->animCmdIndex = 2; + } else if (sprite->animCmdIndex == 3) + { + sprite->animCmdIndex = 0; + } + SeekSpriteAnim(sprite, sprite->animCmdIndex); + } +} + +void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) +{ + u8 animCmdIndex; + if (!mapObject->mapobj_bit_12) + { + sprite->animNum = animNum; + animCmdIndex = 3; + if (sprite->animCmdIndex < 2) + { + animCmdIndex = 1; + } + SeekSpriteAnim(sprite, animCmdIndex); + } +} + +u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3) +{ + if (a0 > a2) + { + return DIR_WEST; + } else if (a0 < a2) + { + return DIR_EAST; + } else if (a1 > a3) + { + return DIR_NORTH; + } else + { + return DIR_SOUTH; + } +} + +void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) +{ + mapObject->animPattern = animPattern; + mapObject->mapobj_unk_21 = 0; + mapObject->animId = 0; + gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern]; + gSprites[mapObject->spriteId].data[1] = 0; +} + +u8 npc_running_behaviour_by_direction(u8 direction) +{ + return gUnknown_0837567B[direction]; +} + +u8 sub_805FF20(struct MapObject *mapObject, u8 direction) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + MoveCoords(direction, &x, &y); + return npc_block_way(mapObject, x, y, direction); +} + +bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y); +static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y); +bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); + +u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) +{ + u8 direction; + direction = dirn; + if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) + return 1; + else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) + return 2; + else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) + return 2; + else if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) + return 3; + else if (DoesObjectCollideWithObjectAt(mapObject, x, y)) + return 4; + return 0; +} + +u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + u8 flags = 0; + + if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) + flags |= 1; + if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) + flags |= 2; + if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) + flags |= 4; + if (DoesObjectCollideWithObjectAt(mapObject, x, y)) + flags |= 8; + return flags; +} + +bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y) +{ + s16 minv; + s16 maxv; + + if (mapObject->range.as_nybbles.x != 0) + { + minv = mapObject->coords1.x - (mapObject->range.as_nybbles.x); + maxv = mapObject->coords1.x + (mapObject->range.as_nybbles.x); + if (minv > x || maxv < x) + return TRUE; + } + if (mapObject->range.as_nybbles.y != 0) + { + minv = mapObject->coords1.y - (mapObject->range.as_nybbles.y); + maxv = mapObject->coords1.y + (mapObject->range.as_nybbles.y); + if (minv > y || maxv < y) + return TRUE; + } + return FALSE; +} + +bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) + { + return 1; + } + return 0; +} + +static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + struct MapObject *mapObject2 = &gMapObjects[i]; + + if (mapObject2->active && mapObject2 != mapObject) + { + if (((mapObject2->coords2.x == x && mapObject2->coords2.y == y) || (mapObject2->coords3.x == x && mapObject2->coords3.y == y)) + && AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0)) + return TRUE; + } + } + return 0; +} + +// this function is only used in berry.c, but its unknown whether its intended context is the berry tree check or if its checking for the flickering. +bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + if (gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 2) + return TRUE; + + return FALSE; +} + +void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 4; + } +} + +void MoveCoords(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVector[direction].x; + *y += gDirectionToVector[direction].y; +} + +void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVector[direction].x << 4; + *y += gDirectionToVector[direction].y << 4; +} + +void sub_8060320(u32 dirn, s16 *x, s16 *y, s16 deltaX, s16 deltaY) +{ + u8 direction = dirn; + s16 dx2 = deltaX; + s16 dy2 = deltaY; + if (gDirectionToVector[direction].x > 0) + { + *x += dx2; + } + if (gDirectionToVector[direction].x < 0) + { + *x -= dx2; + } + if (gDirectionToVector[direction].y > 0) + { + *y += dy2; + } + if (gDirectionToVector[direction].y < 0) + { + *y -= dy2; + } +} + +void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2) +{ + *x2 = (x1 - gSaveBlock1.pos.x) << 4; + *y2 = (y1 - gSaveBlock1.pos.y) << 4; + *x2 -= gUnknown_0300489C; + *y2 -= gUnknown_03004898; +} + +void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2) +{ + s16 x3; + s16 y3; + x3 = -gUnknown_0300489C - gUnknown_03004880.unk10; + y3 = -gUnknown_03004898 - gUnknown_03004880.unk14; + if (gUnknown_03004880.unk10 > 0) + { + x3 += 0x10; + } + if (gUnknown_03004880.unk10 < 0) + { + x3 -= 0x10; + } + if (gUnknown_03004880.unk14 > 0) + { + y3 += 0x10; + } + if (gUnknown_03004880.unk14 < 0) + { + y3 -= 0x10; + } + *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3; + *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3; +} + +void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy) +{ + sub_80603CC(*x, *y, x, y); + *x += dx; + *y += dy; +} + +void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) +{ + *x = 0; + *y = 0; + if (gUnknown_03004880.unk10 > 0) + { + (*x)++; + } + if (gUnknown_03004880.unk10 < 0) + { + (*x)--; + } + if (gUnknown_03004880.unk14 > 0) + { + (*y)++; + } + if (gUnknown_03004880.unk14 < 0) + { + (*y)--; + } +} + +void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 direction, s16 *x, s16 *y) +{ + u8 newDirn = direction; + *x = mapObject->coords2.x; + *y = mapObject->coords2.y; + MoveCoords(newDirn, x, y); +} + +bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) + { + return TRUE; + } + return FALSE; +} + +bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff) + { + return TRUE; + } + return FALSE; +} + +bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) +{ + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) + { + return TRUE; + } + UnfreezeMapObject(mapObject); + mapObject->mapobj_unk_1C = specialAnimId; + mapObject->mapobj_bit_6 = 1; + mapObject->mapobj_bit_7 = 0; + gSprites[mapObject->spriteId].data[2] = 0; + return FALSE; +} + +void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) +{ + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + FieldObjectSetSpecialAnim(mapObject, specialAnimId); +} + +void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + { + FieldObjectClearAnim(mapObject); + } +} + +void FieldObjectClearAnim(struct MapObject *mapObject) +{ + mapObject->mapobj_unk_1C = 0xFF; + mapObject->mapobj_bit_6 = 0; + mapObject->mapobj_bit_7 = 0; + gSprites[mapObject->spriteId].data[1] = 0; + gSprites[mapObject->spriteId].data[2] = 0; +} + +bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + return mapObject->mapobj_bit_7; + return 0x10; +} + +bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) +{ + u8 specialAnimStatus; + specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); + if (specialAnimStatus != 0 && specialAnimStatus != 0x10) + { + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + } + return specialAnimStatus; +} + +u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + { + return mapObject->mapobj_unk_1C; + } + return 0xFF; +} + +extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite); +extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite); +extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite); +void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite); +void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite); +void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite); +void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite); + +void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *)) +{ + DoGroundEffects_OnSpawn(mapObject, sprite); + sub_80634A0(mapObject, sprite); + if (FieldObjectIsSpecialAnimActive(mapObject)) + { + FieldObjectExecSpecialAnim(mapObject, sprite); + } else + { + if (!mapObject->mapobj_bit_8) + { + while (callback(mapObject, sprite)); + } + } + DoGroundEffects_OnBeginStep(mapObject, sprite); + DoGroundEffects_OnFinishStep(mapObject, sprite); + npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); + sub_80634D0(mapObject, sprite); + FieldObjectUpdateSubpriority(mapObject, sprite); +} + +#define dirn_to_anim(name, table)\ +u8 name(u32 idx)\ +{\ + u8 direction;\ + u8 animIds[sizeof(table)];\ + direction = idx;\ + memcpy(animIds, (table), sizeof(table));\ + if (direction > DIR_EAST) direction = 0;\ + return animIds[direction];\ +} + +dirn_to_anim(GetFaceDirectionAnimId, gUnknown_083756C8) +dirn_to_anim(GetSimpleGoAnimId, gUnknown_083756CD) +dirn_to_anim(GetGoSpeed0AnimId, gUnknown_083756D2) +dirn_to_anim(sub_8060744, gUnknown_083756D7) +dirn_to_anim(d2s_08064034, gUnknown_083756DC) +dirn_to_anim(sub_806079C, gUnknown_083756E1) +dirn_to_anim(sub_80607C8, gUnknown_083756E6) +dirn_to_anim(sub_80607F4, gUnknown_083756EB) +dirn_to_anim(GetJumpLedgeAnimId, gUnknown_083756F0) +dirn_to_anim(sub_806084C, gUnknown_083756F5) +dirn_to_anim(sub_8060878, gUnknown_083756FA) +dirn_to_anim(sub_80608A4, gUnknown_083756FF) +dirn_to_anim(sub_80608D0, gUnknown_08375704) +dirn_to_anim(GetStepInPlaceDelay32AnimId, gUnknown_08375709) +dirn_to_anim(GetStepInPlaceDelay16AnimId, gUnknown_0837570E) +dirn_to_anim(GetStepInPlaceDelay8AnimId, gUnknown_08375713) +dirn_to_anim(GetStepInPlaceDelay4AnimId, gUnknown_08375718) + +u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) +{ + return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); +} + +u8 sub_80609D8(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837571D, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A04(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375722, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A30(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375727, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A5C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837572C, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A88(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375731, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060AB4(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375736, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060AE0(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837573B, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B0C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375740, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B38(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375745, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B64(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837574A, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetOppositeDirection(u8 direction) +{ + u8 directions[8]; + memcpy(directions, gUnknown_0837574F, 8); + if (direction == 0 || direction > 8) + { + return direction; + } + return directions[direction - 1]; +} + +u32 zffu_offset_calc(u8 a0, u8 a1) +{ + return gUnknown_08375757[a0 - 1][a1 - 1]; +} + +u32 state_to_direction(u8 a0, u32 a1, u32 a2) +{ + u32 zffuOffset; + u8 a1_2 = a1; + u8 a2_2 = a2; + if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) + { + return 0; + } + zffuOffset = zffu_offset_calc(a1_2, a2); + return gUnknown_08375767[a0 - 1][zffuOffset - 1]; +} + +void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) + { + mapObject->mapobj_bit_7 = 1; + } +} + +bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) + { + mapObject->mapobj_unk_1C = 0xFF; + sprite->data[2] = 0; + return 1; + } + return 0; +} + +void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) +{ + mapObject->mapobj_unk_1C = animId; + sprite->data[2] = 0; +} + +void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + npc_coords_shift_still(mapObject); + sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + sprite->animPaused = 1; + sprite->data[2] = 1; +} + +u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_SOUTH); + return 1; +} + +u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_NORTH); + return 1; +} + +u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_WEST); + return 1; +} + +u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_EAST); + return 1; +} + +void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + FieldObjectSetDirection(mapObject, direction); + MoveCoords(direction, &x, &y); + npc_coords_shift(mapObject, x, y); + oamt_npc_ministep_reset(sprite, direction, a3); + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + sprite->data[2] = 1; +} + +extern u8 (*const gUnknown_083759C0[5])(u8); + +void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + u8 (*const functions[5])(u8); + memcpy((void *)functions, gUnknown_083759C0, sizeof(gUnknown_083759C0)); + sub_8060D20(mapObject, sprite, direction, a3); + sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18)); +} + +void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_8060D20(mapObject, sprite, direction, 1); + sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); +} + +bool8 obj_npc_ministep(struct Sprite *); + +bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (obj_npc_ministep(sprite)) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + sprite->animPaused = 1; + return 1; + } + return 0; +} + +void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + FieldObjectSetDirection(mapObject, direction); + MoveCoords(direction, &x, &y); + npc_coords_shift(mapObject, x, y); + sub_806467C(sprite, direction); + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + sprite->data[2] = 1; +} + +void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_8060E68(mapObject, sprite, direction); + sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); +} + +bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_806468C(sprite)) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + sprite->animPaused = 1; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060F5C(struct MapObject *, struct Sprite *); + +bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + return sub_8060F5C(mapObject, sprite); +} + +bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060F9C(struct MapObject *, struct Sprite *); + +bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_NORTH); + return sub_8060F9C(mapObject, sprite); +} + +bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060FDC(struct MapObject *, struct Sprite *); + +bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_WEST); + return sub_8060FDC(mapObject, sprite); +} + +bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806101C(struct MapObject *, struct Sprite *); + +bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_EAST); + return sub_806101C(mapObject, sprite); +} + +bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806105C(struct MapObject *, struct Sprite *); + +bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 0); + return sub_806105C(mapObject, sprite); +} + +bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806109C(struct MapObject *, struct Sprite *); + +bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 0); + return sub_806109C(mapObject, sprite); +} + +bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80610DC(struct MapObject *, struct Sprite *); + +bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 0); + return sub_80610DC(mapObject, sprite); +} + +bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806111C(struct MapObject *, struct Sprite *); + +bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 0); + return sub_806111C(mapObject, sprite); +} + +bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) +{ + s16 vSPp4[3]; + s16 x; + s16 y; + memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34); + x = 0; + y = 0; + FieldObjectSetDirection(mapObject, direction); + sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]); + npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); + sub_80646E4(sprite, direction, a4, a5); + sprite->data[2] = 1; + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + mapObject->mapobj_bit_4 = 1; +} + +void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) +{ + sub_806113C(mapObject, sprite, direction, a4, a5); + sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + DoShadowFieldEffect(mapObject); +} + +u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *)) +{ + s16 vSPp4[3]; + s16 x; + s16 y; + u8 retval; + memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A); + retval = callback(sprite); + if (retval == 1 && vSPp4[sprite->data[4]] != 0) + { + x = 0; + y = 0; + sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data[4]], vSPp4[sprite->data[4]]); + npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); + mapObject->mapobj_bit_2 = 1; + mapObject->mapobj_bit_4 = 1; + } else if (retval == 0xff) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->animPaused = 1; + } + return retval; +} + +u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite) +{ + return sub_806123C(mapObject, sprite, sub_8064704); +} + +u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite) +{ + return sub_806123C(mapObject, sprite, sub_806478C); +} + +bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061300(mapObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061314(mapObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 retval; + + retval = sub_8061300(mapObject, sprite); + if (retval != 1) + { + if (retval == 0xFF) + { + return TRUE; + } + return FALSE; + } + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + return FALSE; +} + +bool8 sub_80613D4(struct MapObject *, struct Sprite *); +bool8 sub_806142C(struct MapObject *, struct Sprite *); +bool8 sub_8061484(struct MapObject *, struct Sprite *); +bool8 sub_80614DC(struct MapObject *, struct Sprite *); + +bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0); + return sub_80613D4(mapObject, sprite); +} + +bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0); + return sub_806142C(mapObject, sprite); +} + +bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0); + return sub_8061484(mapObject, sprite); +} + +bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0); + return sub_80614DC(mapObject, sprite); +} + +bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8061508(struct Sprite *sprite, u16 duration) +{ + sprite->data[2] = 1; + sprite->data[3] = duration; +} + +bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[3]--; + if (!sprite->data[3]) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 1); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 2); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 4); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 8); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 16); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 1); + return sub_80615EC(mapObject, sprite); +} + +bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 1); + return sub_806162C(mapObject, sprite); +} + +bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 1); + return sub_806166C(mapObject, sprite); +} + +bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 1); + return sub_80616AC(mapObject, sprite); +} + +bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration) +{ + FieldObjectSetDirection(mapObject, direction); + sub_805FE28(mapObject, sprite, animId); + sprite->animPaused = 0; + sprite->data[2] = 1; + sprite->data[3] = duration; +} + +bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[3]--; + if (sprite->data[3] == 0) + { + sprite->data[2] = 2; + sprite->animPaused = 1; + return TRUE; + } + return FALSE; +} + +bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sprite->data[3] & 1) + { + sprite->animDelayCounter++; + } + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061B18(struct MapObject *, struct Sprite *); + +bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 2); + return sub_8061B18(mapObject, sprite); +} + +bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061B58(struct MapObject *, struct Sprite *); + +bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 2); + return sub_8061B58(mapObject, sprite); +} + +bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061B98(struct MapObject *, struct Sprite *); + +bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 2); + return sub_8061B98(mapObject, sprite); +} + +bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061BD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 2); + return sub_8061BD8(mapObject, sprite); +} + +bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061C18(struct MapObject *, struct Sprite *); + +bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 3); + return sub_8061C18(mapObject, sprite); +} + +bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061C58(struct MapObject *, struct Sprite *); + +bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 3); + return sub_8061C58(mapObject, sprite); +} + +bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061C98(struct MapObject *, struct Sprite *); + +bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 3); + return sub_8061C98(mapObject, sprite); +} + +bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061CD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 3); + return sub_8061CD8(mapObject, sprite); +} + +bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061D18(struct MapObject *, struct Sprite *); + +bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 4); + return sub_8061D18(mapObject, sprite); +} + +bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061D58(struct MapObject *, struct Sprite *); + +bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 4); + return sub_8061D58(mapObject, sprite); +} + +bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061D98(struct MapObject *, struct Sprite *); + +bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 4); + return sub_8061D98(mapObject, sprite); +} + +bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061DD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 4); + return sub_8061DD8(mapObject, sprite); +} + +bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E18(struct MapObject *, struct Sprite *); + +bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_SOUTH); + return sub_8061E18(mapObject, sprite); +} + +bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E58(struct MapObject *, struct Sprite *); + +bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_NORTH); + return sub_8061E58(mapObject, sprite); +} + +bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E98(struct MapObject *, struct Sprite *); + +bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_WEST); + return sub_8061E98(mapObject, sprite); +} + +bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061ED8(struct MapObject *, struct Sprite *); + +bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_EAST); + return sub_8061ED8(mapObject, sprite); +} + +bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) +{ + obj_anim_image_set_and_seek(sprite, animNum, 0); + FieldObjectSetDirection(mapObject, direction); + sprite->data[2] = 1; +} + +bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); + return FALSE; +} + +bool8 sub_8064864(struct Sprite *); + +bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_806113C(mapObject, sprite, direction, 1, 0); + StartSpriteAnim(sprite, sub_805FD88(direction)); +} + +bool8 sub_8061FB0(struct MapObject *, struct Sprite *); + +bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_SOUTH); + return sub_8061FB0(mapObject, sprite); +} + +bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061FF8(struct MapObject *, struct Sprite *); + +bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_NORTH); + return sub_8061FF8(mapObject, sprite); +} + +bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062040(struct MapObject *, struct Sprite *); + +bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_WEST); + return sub_8062040(mapObject, sprite); +} + +bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062088(struct MapObject *, struct Sprite *); + +bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_EAST); + return sub_8062088(mapObject, sprite); +} + +bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 objectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) + { + an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)); + } + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 objectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) + { + an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y))); + } + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_9 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_9 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2); + return sub_80621BC(mapObject, sprite); +} + +bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2); + return sub_8062214(mapObject, sprite); +} + +bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2); + return sub_806226C(mapObject, sprite); +} + +bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2); + return sub_80622C4(mapObject, sprite); +} + +bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0); + return sub_806231C(mapObject, sprite); +} + +bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0); + return sub_8062374(mapObject, sprite); +} + +bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0); + return sub_80623CC(mapObject, sprite); +} + +bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0); + return sub_8062424(mapObject, sprite); +} + +bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2); + return sub_806247C(mapObject, sprite); +} + +bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2); + return sub_80624D4(mapObject, sprite); +} + +bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2); + return sub_806252C(mapObject, sprite); +} + +bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2); + return sub_8062584(mapObject, sprite); +} + +bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]); + return TRUE; +} + +bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); + return FALSE; +} + +bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_25 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_25 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_12 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_HEART_ICON); + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062704(struct MapObject *, struct Sprite *); + +bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->animPattern == 0x3F) + { + sub_8084794(mapObject); + return FALSE; + } + else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) + { + sprite->data[2] = 2; + return TRUE; + } + else + { + sub_812869C(mapObject); + sprite->data[2] = 1; + return sub_8062704(mapObject, sprite); + } +} + +bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_81286C4(mapObject)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite) +{ + obj_anim_image_set_and_seek(sprite, 1, 0); + sprite->data[2] = 1; + return FALSE; +} + +bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sub_8064820(sprite, 0x20); + sprite->data[2] = 2; + } + return FALSE; +} + +bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 ^= 1; + if (sub_8064824(sprite)) + { + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 3; + } + return FALSE; +} + +bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + obj_anim_image_set_and_seek(sprite, 1, 0); + sprite->data[2] = 1; + return FALSE; +} + +bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sub_8064820(sprite, 0x20); + sprite->data[2] = 2; + } + return FALSE; +} + +bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 ^= 1; + if (sub_8064824(sprite)) + { + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 3; + } + return FALSE; +} + +bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_26 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_26 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->oam.affineMode = 3; + InitSpriteAffineAnim(sprite); + sprite->affineAnimPaused = 1; + sprite->subspriteMode = 0; + return TRUE; +} + +bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + return TRUE; +} + +bool8 sub_80628D0(struct MapObject *, struct Sprite *); + +bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = 0; + StartSpriteAffineAnimIfDifferent(sprite, 0); + return sub_80628D0(mapObject, sprite); +} + +bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->affineAnimPaused = 1; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062930(struct MapObject *, struct Sprite *); + +bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = 0; + ChangeSpriteAffineAnimIfDifferent(sprite, 1); + return sub_8062930(mapObject, sprite); +} + +bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->affineAnimPaused = 1; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + npc_coords_shift_still(mapObject); + sub_805FE64(mapObject, sprite, sub_805FDD8(direction)); + sprite->animPaused = 1; + sprite->data[2] = 1; +} + +bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_SOUTH); + return TRUE; +} + +bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_NORTH); + return TRUE; +} + +bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_WEST); + return TRUE; +} + +bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_EAST); + return TRUE; +} + +bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST)); + return FALSE; +} + +bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST)); + return FALSE; +} + +bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST)); + return FALSE; +} + +void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4) +{ + sub_806113C(mapObject, sprite, direction, a3, a4); + StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction)); + DoShadowFieldEffect(mapObject); +} + +bool8 sub_8062BFC(struct MapObject *, struct Sprite *); + +bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1); + return sub_8062BFC(mapObject, sprite); +} + +bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062C54(struct MapObject *, struct Sprite *); + +bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1); + return sub_8062C54(mapObject, sprite); +} + +bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062CAC(struct MapObject *, struct Sprite *); + +bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1); + return sub_8062CAC(mapObject, sprite); +} + +bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062D04(struct MapObject *, struct Sprite *); + +bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1); + return sub_8062D04(mapObject, sprite); +} + +bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062D5C(struct MapObject *, struct Sprite *); + +bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1); + return sub_8062D5C(mapObject, sprite); +} + +bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062DB4(struct MapObject *, struct Sprite *); + +bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1); + return sub_8062DB4(mapObject, sprite); +} + +bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062E0C(struct MapObject *, struct Sprite *); + +bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1); + return sub_8062E0C(mapObject, sprite); +} + +bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062E64(struct MapObject *, struct Sprite *); + +bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1); + return sub_8062E64(mapObject, sprite); +} + +bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062EBC(struct MapObject *, struct Sprite *); + +bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0); + return sub_8062EBC(mapObject, sprite); +} + +bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062F14(struct MapObject *, struct Sprite *); + +bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0); + return sub_8062F14(mapObject, sprite); +} + +bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062F6C(struct MapObject *, struct Sprite *); + +bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0); + return sub_8062F6C(mapObject, sprite); +} + +bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062FC4(struct MapObject *, struct Sprite *); + +bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0); + return sub_8062FC4(mapObject, sprite); +} + +bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8); + return sub_8061714(mapObject, sprite); +} + +void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18)); + SeekSpriteAnim(sprite, 0); +} + +bool8 sub_8063128(struct MapObject *, struct Sprite *); + +bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063128(mapObject, sprite); +} + +bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063168(struct MapObject *, struct Sprite *); + +bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_NORTH, 1); + return sub_8063168(mapObject, sprite); +} + +bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80631A8(struct MapObject *, struct Sprite *); + +bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_WEST, 1); + return sub_80631A8(mapObject, sprite); +} + +bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80631E8(struct MapObject *, struct Sprite *); + +bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_EAST, 1); + return sub_80631E8(mapObject, sprite); +} + +bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18)); +} + +bool8 sub_8063258(struct MapObject *, struct Sprite *); + +bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063258(mapObject, sprite); +} + +bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063298(struct MapObject *, struct Sprite *); + +bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_NORTH, 1); + return sub_8063298(mapObject, sprite); +} + +bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80632D8(struct MapObject *, struct Sprite *); + +bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_WEST, 1); + return sub_80632D8(mapObject, sprite); +} + +bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063318(struct MapObject *, struct Sprite *); + +bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_EAST, 1); + return sub_8063318(mapObject, sprite); +} + +bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18)); + SeekSpriteAnim(sprite, 0); +} + +bool8 sub_8063390(struct MapObject *, struct Sprite *); + +bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063390(mapObject, sprite); +} + +bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80633D0(struct MapObject *, struct Sprite *); + +bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_NORTH, 1); + return sub_80633D0(mapObject, sprite); +} + +bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063410(struct MapObject *, struct Sprite *); + +bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_WEST, 1); + return sub_8063410(mapObject, sprite); +} + +bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063450(struct MapObject *, struct Sprite *); + +bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_EAST, 1); + return sub_8063450(mapObject, sprite); +} + +bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite) +{ + return TRUE; +} + +bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->animPaused = 1; + return TRUE; +} + +void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->mapobj_bit_10) + { + sprite->animPaused = 1; + } +} + +void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->mapobj_bit_11) + { + sprite->animPaused = 0; + mapObject->mapobj_bit_10 = 0; + mapObject->mapobj_bit_11 = 0; + } +} + +void sub_80634E8(struct MapObject *, struct Sprite *); +static void UpdateMapObjSpriteVisibility(struct MapObject *, struct Sprite *); + +void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80634E8(mapObject, sprite); + UpdateMapObjSpriteVisibility(mapObject, sprite); +} + +#ifdef NONMATCHING +void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u16 x; + u16 y; + s16 x2; + s16 y2; + const struct MapObjectGraphicsInfo *graphicsInfo; + mapObject->mapobj_bit_14 = 0; + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + x2 = graphicsInfo->width + x; // offending line + y2 = graphicsInfo->height + y; // similarly offending line + if ((s16)x >= 0x100 || x2 < -0x10) + { + mapObject->mapobj_bit_14 = 1; + } + if ((s16)y >= 0xB0 || y2 < -0x10) + { + mapObject->mapobj_bit_14 = 1; + } +} +#else +__attribute__((naked)) +void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r5, r0, 0\n\ + adds r4, r1, 0\n\ + ldrb r1, [r5, 0x1]\n\ + movs r0, 0x41\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r5, 0x1]\n\ + ldrb r0, [r5, 0x5]\n\ + bl GetFieldObjectGraphicsInfo\n\ + adds r6, r0, 0\n\ + adds r0, r4, 0\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0806354C\n\ + ldrh r1, [r4, 0x24]\n\ + ldrh r0, [r4, 0x20]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\ + adds r0, r1\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r0, [r4, 0x22]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x29\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\ + adds r0, r1\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + b _08063574\n\ + .align 2, 0\n\ +_08063544: .4byte gSpriteCoordOffsetX\n\ +_08063548: .4byte gSpriteCoordOffsetY\n\ +_0806354C:\n\ + ldrh r1, [r4, 0x24]\n\ + ldrh r0, [r4, 0x20]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + adds r0, r1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r0, [r4, 0x22]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x29\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + adds r0, r1\n\ +_08063574:\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + ldrh r0, [r6, 0x8]\n\ + adds r0, r3\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + ldrh r0, [r6, 0xA]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + cmp r0, 0xFF\n\ + bgt _0806359C\n\ + lsls r0, r1, 16\n\ + asrs r0, 16\n\ + movs r1, 0x10\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _080635A4\n\ +_0806359C:\n\ + ldrb r0, [r5, 0x1]\n\ + movs r1, 0x40\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ +_080635A4:\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + cmp r0, 0xAF\n\ + bgt _080635B8\n\ + lsls r0, r4, 16\n\ + asrs r0, 16\n\ + movs r1, 0x10\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _080635C0\n\ +_080635B8:\n\ + ldrb r0, [r5, 0x1]\n\ + movs r1, 0x40\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ +_080635C0:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ +.syntax divided\n"); +} +#endif + +void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->invisible = 0; + if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) + { + sprite->invisible = 1; + } +} + +static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void DoTracksGroundEffect_BikeTireTracks( +struct MapObject *mapObj, struct Sprite *sprite, u8); +void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); +u8 GetReflectionTypeByMetatileBehavior(u32 behavior); + +static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_Reflection(mapObj, flags); + GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags); + GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); +} + +static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_Reflection(mapObj, flags); + GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags); + GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags); + GetGroundEffectFlags_Tracks(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_Puddle(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); +} + +static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_Puddle(mapObj, flags); + GetGroundEffectFlags_Ripple(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); + GetGroundEffectFlags_Seaweed(mapObj, flags); + GetGroundEffectFlags_JumpLanding(mapObj, flags); +} + +void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) +{ + mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y); + mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y); +} + +void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) +{ + u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; + u8 type = FieldObjectCheckForReflectiveSurface(mapObj); + + if (type) + { + if (!mapObj->mapobj_bit_17) + { + mapObj->mapobj_bit_17 = 0; + mapObj->mapobj_bit_17 = 1; + *flags |= reflectionFlags[type - 1]; + } + } + else + { + mapObj->mapobj_bit_17 = 0; + } +} + +void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x1; +} + +void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x2; +} + +void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x4; +} + +void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x8; +} + +void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + { + *flags |= 0x100; + } + else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) + || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) + { + *flags |= 0x80; + } +} + +void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_20) + { + mapObj->mapobj_bit_20 = 0; + mapObj->mapobj_bit_20 = 1; + *flags |= 0x800; + } + } + else + { + mapObj->mapobj_bit_20 = 0; + } +} + +void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) +{ + if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) + || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) + { + if (!mapObj->mapobj_bit_19) + { + mapObj->mapobj_bit_19 = 0; + mapObj->mapobj_bit_19 = 1; + *flags |= 0x40; + } + } + else + { + mapObj->mapobj_bit_19 = 0; + } +} + +void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) + { + *flags |= 0x400; + } +} + +void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E)) + *flags |= 0x200; +} + +void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_18) + { + mapObj->mapobj_bit_18 = 0; + mapObj->mapobj_bit_18 = 1; + *flags |= 0x20000; + } + } + else + { + mapObj->mapobj_bit_18 = 0; + } +} + +void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_21) + { + mapObj->mapobj_bit_21 = 0; + mapObj->mapobj_bit_21 = 1; + *flags |= 0x40000; + } + } + else + { + mapObj->mapobj_bit_21 = 0; + } +} + +void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E)) + *flags |= 0x80000; +} + +void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) +{ + typedef bool8 (*MetatileFunc)(u8); + + static const MetatileFunc metatileFuncs[] = { + MetatileBehavior_IsTallGrass, + MetatileBehavior_IsLongGrass, + MetatileBehavior_IsPuddle, + MetatileBehavior_IsSurfableWaterOrUnderwater, + MetatileBehavior_IsShallowFlowingWater, + MetatileBehavior_IsATile, + }; + + static const u32 jumpLandingFlags[] = { + 0x00001000, // Landing in tall grass + 0x00002000, // Landing in long grass + 0x00004000, // Landing on puddle + 0x00008000, // Landing on surfable water or underwater + 0x00004000, // Landing on shallow flowing water + 0x00010000, // Landing on any other type of ground + }; + + if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) + { + u8 i; + + for (i = 0; i < 6; i++) + { + if (metatileFuncs[i](mapObj->mapobj_unk_1E)) + { + *flags |= jumpLandingFlags[i]; + return; + } + } + } +} + +u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + + // ceil div by tile width? + s16 width = (info->width + 8) >> 4; + s16 height = (info->height + 8) >> 4; + s16 i; + s16 j; + u8 result; + u8 b; + s16 one; + +#define RETURN_REFLECTION_TYPE_AT(x, y) \ + b = MapGridGetMetatileBehaviorAt(x, y); \ + result = GetReflectionTypeByMetatileBehavior(b); \ + if (result != 0) \ + return result; + + for (i = 0, one = 1; i < height; i++) + { + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i) + for (j = 1; j < width; j++) + { + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i) + } + } + return 0; + +#undef RETURN_REFLECTION_TYPE_AT +} + +u8 GetReflectionTypeByMetatileBehavior(u32 behavior) +{ + if (MetatileBehavior_IsIce(behavior)) + return 1; + else if (MetatileBehavior_IsReflective(behavior)) + return 2; + else + return 0; +} + +u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) +{ + static bool8 (*const unknown_08376040[])(u8) = { + MetatileBehavior_IsJumpSouth, + MetatileBehavior_IsJumpNorth, + MetatileBehavior_IsJumpWest, + MetatileBehavior_IsJumpEast, + }; + + u8 b; + u8 index = z; + + if (index == 0) + return 0; + else if (index > 4) + index -= 4; + + index--; + b = MapGridGetMetatileBehaviorAt(x, y); + + if (unknown_08376040[index](b) == 1) + return index + 1; + + return 0; +} + +void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_4) + return; + + if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + return; + + if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F)) + return; + + sprite->subspriteTableNum = 4; + + if (ZCoordToPriority(mapObj->elevation) == 1) + sprite->subspriteTableNum = 5; +} + +bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) +{ + u8 mapZ; + + if (z == 0) + return FALSE; + + mapZ = MapGridGetZCoordAt(x, y); + + if (mapZ == 0 || mapZ == 0xF) + return FALSE; + + if (mapZ != z) + return TRUE; + + return FALSE; +} + +static const u8 sUnknown_08376050[] = { + 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is directly the inverse of gFieldObjectPriorities_08376070. +static const u8 sFieldObjectPriorities_08376060[] = { + 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is the inverse of gFieldObjectPriorities_08376060. +// 1 = Above player sprite +// 2 = Below player sprite +static const u8 sFieldObjectPriorities_08376070[] = { + 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, +}; + +void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_26) + return; + + FieldObjectUpdateZCoord(mapObj); + + sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation]; + sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation]; +} + +void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) +{ + sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z]; + sprite->oam.priority = sFieldObjectPriorities_08376060[z]; +} + +u8 ZCoordToPriority(u8 z) +{ + return sFieldObjectPriorities_08376060[z]; +} + +void FieldObjectUpdateZCoord(struct MapObject *mapObj) +{ + u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y); + u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y); + + if (z == 0xF || z2 == 0xF) + return; + + mapObj->mapobj_unk_0B_0 = z; + + if (z != 0 && z != 0xF) + mapObj->elevation = z; +} + +void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) +{ + s32 tmp = sprite->centerToCornerVecY; + u32 tmpa = *(u16 *)&sprite->pos1.y; + u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; + s32 tmp2 = (tmpa - tmp) + tmpb; + u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; + sprite->subpriority = tmp3 + sUnknown_08376050[a] + b; +} + +void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_26) + return; + + SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); +} + +bool8 AreZCoordsCompatible(u8 a, u8 b) +{ + if (a == 0 || b == 0) + return TRUE; + + if (a != b) + return FALSE; + + return TRUE; +} + +void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 1; + FieldEffectStart(FLDEFF_TALL_GRASS); +} + +void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 0; + FieldEffectStart(FLDEFF_TALL_GRASS); +} + +void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 1; + FieldEffectStart(FLDEFF_LONG_GRASS); +} + +void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 0; + FieldEffectStart(FLDEFF_LONG_GRASS); +} + +void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) +{ + SetUpReflection(mapObj, sprite, 0); +} + +void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite) +{ + SetUpReflection(mapObj, sprite, 1); +} + +void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); +} + +static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { + nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, +}; + +void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + gUnknown_08376080[info->tracks](mapObj, sprite, 0); +} + +void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + gUnknown_08376080[info->tracks](mapObj, sprite, 1); +} + +static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ +} + +static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ + // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) + u16 sandFootprints_FieldEffectData[2] = { + FLDEFF_SAND_FOOTPRINTS, + FLDEFF_DEEP_SAND_FOOTPRINTS + }; + + gFieldEffectArguments[0] = mapObj->coords3.x; + gFieldEffectArguments[1] = mapObj->coords3.y; + gFieldEffectArguments[2] = 149; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->mapobj_unk_18; + FieldEffectStart(sandFootprints_FieldEffectData[a]); +} + +static void DoTracksGroundEffect_BikeTireTracks( + struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ + // Specifies which bike track shape to show next. + // For example, when the bike turns from up to right, it will show + // a track that curves to the right. + // Each 4-byte row corresponds to the initial direction of the bike, and + // each byte in that row is for the next direction of the bike in the order + // of down, up, left, right. + static const u8 bikeTireTracks_Transitions[4][4] = { + 1, 2, 7, 8, + 1, 2, 6, 5, + 5, 8, 3, 4, + 6, 7, 3, 4, + }; + + if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) + { + gFieldEffectArguments[0] = mapObj->coords3.x; + gFieldEffectArguments[1] = mapObj->coords3.y; + gFieldEffectArguments[2] = 149; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = + bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; + FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); + } +} + +void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite) +{ + DoRippleFieldEffect(mapObj, sprite); +} + +void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj); +} + +void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj); +} + +void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + u8 spriteId; + + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); + + spriteId = sub_8126FF0( + mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y); + + if (spriteId == MAX_SPRITES) + GroundEffect_SpawnOnTallGrass(mapObj, sprite); +} + +void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); +} + +void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); +} + +void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); +} + +void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_DUST); +} + +void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj); +} + +void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj); +} + +void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + FieldEffectStart(FLDEFF_BUBBLES); +} + +static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { + GroundEffect_SpawnOnTallGrass, + sub_8063E94, + sub_8063EE0, + sub_8063F2C, + GroundEffect_WaterReflection, + GroundEffect_IceReflection, + GroundEffect_FlowingWater, + sub_8063FA0, + sub_8063FCC, + GroundEffect_Ripple, + GroundEffect_StepOnPuddle, + GroundEffect_SandPile, + GroundEffect_JumpOnTallGrass, + GroundEffect_JumpOnLongGrass, + GroundEffect_JumpOnShallowWater, + GroundEffect_JumpOnWater, + GroundEffect_JumpLandingDust, + GroundEffect_ShortGrass, + GroundEffect_HotSprings, + GroundEffect_Seaweed +}; + +void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1) + if (flags & 1) + gUnknown_083760A0[i](mapObj, sprite); +} + +void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags) +{ + if (mapObj->mapobj_bit_4) + { + mapObj->mapobj_bit_18 = 0; + mapObj->mapobj_bit_20 = 0; + mapObj->mapobj_bit_19 = 0; + mapObj->mapobj_bit_21 = 0; + *flags &= 0xFFF9F7BD; + } +} + +void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags) +{ + if (mapObj->mapobj_bit_5) + *flags &= 0xFFFFFBFF; +} + +void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_2) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnSpawn(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_2 = 0; + mapObj->mapobj_bit_4 = 0; + } +} + +void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_2) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + filters_out_some_ground_effects(mapObj, &flags); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_2 = 0; + mapObj->mapobj_bit_4 = 0; + } +} + +void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_3) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_3 = 0; + mapObj->mapobj_bit_5 = 0; + } +} + +typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); + +void Step1(struct Sprite *sprite, u8 dir); +void Step2(struct Sprite *sprite, u8 dir); +void Step3(struct Sprite *sprite, u8 dir); +void Step4(struct Sprite *sprite, u8 dir); +void Step8(struct Sprite *sprite, u8 dir); + +const SpriteStepFunc Unknown_83760F0[] = { + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1 +}; + +const SpriteStepFunc Unknown_8376130[] = { + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, + Step2 +}; + +const SpriteStepFunc Unknown_8376150[] = { + Step2, + Step3, + Step3, + Step2, + Step3, + Step3 +}; + +const SpriteStepFunc Unknown_8376168[] = { + Step4, + Step4, + Step4, + Step4 +}; + +const SpriteStepFunc Unknown_8376178[] = { + Step8, + Step8 +}; + +const SpriteStepFunc *const gUnknown_08376180[] = { + Unknown_83760F0, + Unknown_8376130, + Unknown_8376150, + Unknown_8376168, + Unknown_8376178 +}; + +const s16 gUnknown_08376194[] = { + 16, 8, 6, 4, 2 +}; + +const s8 Unknown_837619E[] = { + -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0 +}; + +const s8 Unknown_83761AE[] = { + 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0 +}; + +const s8 Unknown_83761BE[] = { + -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0 +}; + +const s8 *const gUnknown_083761D0[] = { + Unknown_837619E, + Unknown_83761AE, + Unknown_83761BE +}; + +bool8 FreezeMapObject(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) + { + return TRUE; + } + else + { + mapObject->mapobj_bit_8 = 1; + mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; + mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; + gSprites[mapObject->spriteId].animPaused = 1; + gSprites[mapObject->spriteId].affineAnimPaused = 1; + return FALSE; + } +} + +void FreezeMapObjects(void) +{ + u8 i; + for (i = 0; i < 16; i++) + if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) + FreezeMapObject(&gMapObjects[i]); +} + +void FreezeMapObjectsExceptOne(u8 a1) +{ + u8 i; + for (i = 0; i < 16; i++) + if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) + FreezeMapObject(&gMapObjects[i]); +} + +void UnfreezeMapObject(struct MapObject *mapObject) +{ + if (mapObject->active && mapObject->mapobj_bit_8) + { + mapObject->mapobj_bit_8 = 0; + gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; + gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; + } +} + +void UnfreezeMapObjects(void) +{ + u8 i; + for (i = 0; i < 16; i++) + if (gMapObjects[i].active) + UnfreezeMapObject(&gMapObjects[i]); +} + +void Step1(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += gDirectionToVector[dir].x; + sprite->pos1.y += gDirectionToVector[dir].y; +} + +void Step2(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y; +} + +void Step3(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y; +} + +void Step4(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y; +} + +void Step8(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y; +} + +void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->data[3] = a2; + sprite->data[4] = a3; + sprite->data[5] = 0; +} + +bool8 obj_npc_ministep(struct Sprite *sprite) +{ + if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]]) + return FALSE; + + gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); + + sprite->data[5]++; + + if (sprite->data[5] < gUnknown_08376194[sprite->data[4]]) + return FALSE; + + return TRUE; +} + +void sub_806467C(struct Sprite *sprite, u8 a2) +{ + sprite->data[3] = a2; + sprite->data[4] = 0; + sprite->data[5] = 0; +} + +bool8 sub_806468C(struct Sprite *sprite) +{ + if (!(sprite->data[4] & 1)) + { + Step1(sprite, sprite->data[3]); + sprite->data[5]++; + } + + sprite->data[4]++; + + if (sprite->data[5] > 15) + return TRUE; + else + return FALSE; +} + +s16 sub_80646C8(s16 a1, u8 a2) +{ + return gUnknown_083761D0[a2][a1]; +} + +void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) +{ + sprite->data[3] = a2; + sprite->data[4] = a3; + sprite->data[5] = a4; + sprite->data[6] = 0; +} + +u8 sub_8064704(struct Sprite *sprite) +{ + s16 v5[3] = {0x10, 0x10, 0x20}; + u8 v6[3] = {0, 0, 1}; + u8 v2 = 0; + + if (sprite->data[4]) + Step1(sprite, sprite->data[3]); + + sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + + sprite->data[6]++; + + if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) + v2 = 1; + + if (sprite->data[6] >= v5[sprite->data[4]]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +u8 sub_806478C(struct Sprite *sprite) +{ + s16 v5[3] = {0x20, 0x20, 0x40}; + u8 v6[3] = {1, 1, 2}; + u8 v2 = 0; + + if (sprite->data[4] && !(sprite->data[6] & 1)) + Step1(sprite, sprite->data[3]); + + sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + + sprite->data[6]++; + + if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) + v2 = 1; + + if (sprite->data[6] >= v5[sprite->data[4]]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +void sub_8064820(struct Sprite *sprite, s16 a2) +{ + sprite->data[3] = a2; +} + +bool8 sub_8064824(struct Sprite *sprite) +{ + sprite->data[3]--; + + if (sprite->data[3] == 0) + return TRUE; + else + return FALSE; +} + +void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->animNum = a2; + sprite->animPaused = 0 ; + SeekSpriteAnim(sprite, a3); +} + +bool8 sub_8064864(struct Sprite *sprite) +{ + if (sprite->animEnded) + return TRUE; + else + return FALSE; +} + +void sub_806487C(struct Sprite *sprite, bool8 invisible) +{ + u16 x, y; + s16 x2, y2; + + sprite->invisible = invisible; + + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + + x2 = x - (sprite->centerToCornerVecX >> 1); + y2 = y - (sprite->centerToCornerVecY >> 1); + + if ((s16)x > 255 || x2 < -16) + sprite->invisible = 1; + if ((s16)y > 175 || y2 < -16) + sprite->invisible = 1; +} + +void sub_8064970(struct Sprite *sprite) +{ + SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); + sub_806487C(sprite, 0); +} + +void sub_8064990(u8 a1, u8 dir) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1) + { + u8 animNum = FieldObjectDirectionToImageAnimId(dir); + StartSpriteAnim(sprite, animNum); + break; + } + } +} + +u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + return FieldEffectStart(fieldEffectId); +} + +void DoShadowFieldEffect(struct MapObject *mapObject) +{ + if (!mapObject->mapobj_bit_22) + { + mapObject->mapobj_bit_22 = 1; + oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); + } +} + +void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + gFieldEffectArguments[0] = sprite->pos1.x; + gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; + gFieldEffectArguments[2] = 151; + gFieldEffectArguments[3] = 3; + FieldEffectStart(FLDEFF_RIPPLE); +} diff --git a/src/field/evobjmv.c b/src/field/evobjmv.c deleted file mode 100644 index 6b38df2ad..000000000 --- a/src/field/evobjmv.c +++ /dev/null @@ -1,10017 +0,0 @@ -#include "global.h" -#include "evobjmv.h" -#include "berry.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "palette.h" -#include "random.h" -#include "overworld.h" -#include "sprite.h" -#include "metatile_behavior.h" -#include "constants/maps.h" -#include "constants/map_objects.h" -#include "trainer_see.h" - -// rodata - -const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; - -void ObjectCB_CameraObject(struct Sprite *sprite); -const struct SpriteTemplate gSpriteTemplate_830FD24 = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; - -void CameraObject_0(struct Sprite *); -void CameraObject_1(struct Sprite *); -void CameraObject_2(struct Sprite *); -void (*const gCameraObjectFuncs[])(struct Sprite *) = { - CameraObject_0, - CameraObject_1, - CameraObject_2, -}; - -const u32 gMapObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/00.4bpp"); -const u32 gMapObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/01.4bpp"); -const u32 gMapObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/02.4bpp"); -const u32 gMapObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/03.4bpp"); -const u32 gMapObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/04.4bpp"); -const u32 gMapObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/05.4bpp"); -const u32 gMapObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/06.4bpp"); -const u32 gMapObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/07.4bpp"); -const u32 gMapObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/08.4bpp"); -const u32 gMapObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/09.4bpp"); -const u32 gMapObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/10.4bpp"); -const u32 gMapObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/11.4bpp"); -const u32 gMapObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/12.4bpp"); -const u32 gMapObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/13.4bpp"); -const u32 gMapObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/14.4bpp"); -const u32 gMapObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/15.4bpp"); -const u32 gMapObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/16.4bpp"); -const u32 gMapObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/17.4bpp"); -const u16 gMapObjectPalette8[] = INCBIN_U16("graphics/map_objects/palettes/08.gbapal"); -const u16 NullPalette_8310F68[16] = {}; -const u16 NullPalette_8310F88[16] = {}; -const u16 NullPalette_8310FA8[16] = {}; -const u16 NullPalette_8310FC8[16] = {}; -const u16 NullPalette_8310FE8[16] = {}; -const u16 NullPalette_8311008[16] = {}; -const u16 NullPalette_8311028[16] = {}; -const u16 NullPalette_8311048[16] = {}; -const u16 NullPalette_8311068[16] = {}; -const u16 NullPalette_8311088[16] = {}; -const u16 NullPalette_83110A8[16] = {}; -const u16 NullPalette_83110C8[16] = {}; -const u16 NullPalette_83110E8[16] = {}; -const u16 NullPalette_8311108[16] = {}; -const u16 NullPalette_8311128[16] = {}; -const u16 gMapObjectPalette9[] = INCBIN_U16("graphics/map_objects/palettes/09.gbapal"); -const u16 gMapObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/10.gbapal"); -const u32 gMapObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/0.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/1.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/2.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/3.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/4.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/0.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/3.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/1.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/4.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/2.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/5.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/0.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/1.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/2.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/3.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/4.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/5.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/6.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/7.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/8.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/00.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/01.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/02.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/03.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/04.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/05.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/06.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/07.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/08.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/09.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/10.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/11.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/12.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/13.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/14.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/15.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/16.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/17.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/18.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/19.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/20.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/21.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/22.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/23.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/24.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/25.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/26.4bpp"); -const u32 gMapObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/00.4bpp"); -const u32 gMapObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/01.4bpp"); -const u32 gMapObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/02.4bpp"); -const u32 gMapObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/03.4bpp"); -const u32 gMapObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/04.4bpp"); -const u32 gMapObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/05.4bpp"); -const u32 gMapObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/06.4bpp"); -const u32 gMapObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/07.4bpp"); -const u32 gMapObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/08.4bpp"); -const u32 gMapObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/09.4bpp"); -const u32 gMapObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/10.4bpp"); -const u32 gMapObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/11.4bpp"); -const u32 gMapObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/0.4bpp"); -const u32 gMapObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/3.4bpp"); -const u32 gMapObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/1.4bpp"); -const u32 gMapObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/4.4bpp"); -const u32 gMapObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/2.4bpp"); -const u32 gMapObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/5.4bpp"); -const u32 gMapObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/decorating.4bpp"); -const u32 gMapObjectPic_MayDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/may/decorating.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/0.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/1.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/2.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/3.4bpp"); -const u32 gMapObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/0.4bpp"); -const u32 gMapObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/1.4bpp"); -const u32 gMapObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/2.4bpp"); -const u32 gMapObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/3.4bpp"); -const u16 gMapObjectPalette11[] = INCBIN_U16("graphics/map_objects/palettes/11.gbapal"); -const u32 gMapObjectPic_MayNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/00.4bpp"); -const u32 gMapObjectPic_MayNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/01.4bpp"); -const u32 gMapObjectPic_MayNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/02.4bpp"); -const u32 gMapObjectPic_MayNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/03.4bpp"); -const u32 gMapObjectPic_MayNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/04.4bpp"); -const u32 gMapObjectPic_MayNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/05.4bpp"); -const u32 gMapObjectPic_MayNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/06.4bpp"); -const u32 gMapObjectPic_MayNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/07.4bpp"); -const u32 gMapObjectPic_MayNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/08.4bpp"); -const u32 gMapObjectPic_MayNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/09.4bpp"); -const u32 gMapObjectPic_MayNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/10.4bpp"); -const u32 gMapObjectPic_MayNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/11.4bpp"); -const u32 gMapObjectPic_MayNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/12.4bpp"); -const u32 gMapObjectPic_MayNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/13.4bpp"); -const u32 gMapObjectPic_MayNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/14.4bpp"); -const u32 gMapObjectPic_MayNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/15.4bpp"); -const u32 gMapObjectPic_MayNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/16.4bpp"); -const u32 gMapObjectPic_MayNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/17.4bpp"); -const u16 gMapObjectPalette17[] = INCBIN_U16("graphics/map_objects/palettes/17.gbapal"); -const u16 gMapObjectPalette18[] = INCBIN_U16("graphics/map_objects/palettes/18.gbapal"); -const u16 NullPalette_831B7E8[16] = {}; -const u16 NullPalette_831B808[16] = {}; -const u16 NullPalette_831B828[16] = {}; -const u16 NullPalette_831B848[16] = {}; -const u16 NullPalette_831B868[16] = {}; -const u16 NullPalette_831B888[16] = {}; -const u16 NullPalette_831B8A8[16] = {}; -const u16 NullPalette_831B8C8[16] = {}; -const u16 NullPalette_831B8E8[16] = {}; -const u16 NullPalette_831B908[16] = {}; -const u16 NullPalette_831B928[16] = {}; -const u16 NullPalette_831B948[16] = {}; -const u16 NullPalette_831B968[16] = {}; -const u16 NullPalette_831B988[16] = {}; -const u32 gMapObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/0.4bpp"); -const u32 gMapObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/1.4bpp"); -const u32 gMapObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/2.4bpp"); -const u32 gMapObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/3.4bpp"); -const u32 gMapObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/4.4bpp"); -const u32 gMapObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/5.4bpp"); -const u32 gMapObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/6.4bpp"); -const u32 gMapObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/7.4bpp"); -const u32 gMapObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/8.4bpp"); -const u32 gMapObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/00.4bpp"); -const u32 gMapObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/01.4bpp"); -const u32 gMapObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/02.4bpp"); -const u32 gMapObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/03.4bpp"); -const u32 gMapObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/04.4bpp"); -const u32 gMapObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/05.4bpp"); -const u32 gMapObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/06.4bpp"); -const u32 gMapObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/07.4bpp"); -const u32 gMapObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/08.4bpp"); -const u32 gMapObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/09.4bpp"); -const u32 gMapObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/10.4bpp"); -const u32 gMapObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/11.4bpp"); -const u32 gMapObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/12.4bpp"); -const u32 gMapObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/13.4bpp"); -const u32 gMapObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/14.4bpp"); -const u32 gMapObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/15.4bpp"); -const u32 gMapObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/16.4bpp"); -const u32 gMapObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/17.4bpp"); -const u32 gMapObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/18.4bpp"); -const u32 gMapObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/19.4bpp"); -const u32 gMapObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/20.4bpp"); -const u32 gMapObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/21.4bpp"); -const u32 gMapObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/22.4bpp"); -const u32 gMapObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/23.4bpp"); -const u32 gMapObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/24.4bpp"); -const u32 gMapObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/25.4bpp"); -const u32 gMapObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/26.4bpp"); -const u32 gMapObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/0.4bpp"); -const u32 gMapObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/3.4bpp"); -const u32 gMapObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/1.4bpp"); -const u32 gMapObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/4.4bpp"); -const u32 gMapObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/2.4bpp"); -const u32 gMapObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/5.4bpp"); -const u32 gMapObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/0.4bpp"); -const u32 gMapObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/1.4bpp"); -const u32 gMapObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/2.4bpp"); -const u32 gMapObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/3.4bpp"); -const u32 gMapObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/4.4bpp"); -const u32 gMapObjectPic_MayFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/00.4bpp"); -const u32 gMapObjectPic_MayFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/01.4bpp"); -const u32 gMapObjectPic_MayFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/02.4bpp"); -const u32 gMapObjectPic_MayFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/03.4bpp"); -const u32 gMapObjectPic_MayFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/04.4bpp"); -const u32 gMapObjectPic_MayFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/05.4bpp"); -const u32 gMapObjectPic_MayFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/06.4bpp"); -const u32 gMapObjectPic_MayFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/07.4bpp"); -const u32 gMapObjectPic_MayFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/08.4bpp"); -const u32 gMapObjectPic_MayFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/09.4bpp"); -const u32 gMapObjectPic_MayFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/10.4bpp"); -const u32 gMapObjectPic_MayFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/11.4bpp"); -const u32 gMapObjectPic_MayWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/0.4bpp"); -const u32 gMapObjectPic_MayWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/3.4bpp"); -const u32 gMapObjectPic_MayWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/1.4bpp"); -const u32 gMapObjectPic_MayWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/4.4bpp"); -const u32 gMapObjectPic_MayWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/2.4bpp"); -const u32 gMapObjectPic_MayWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/5.4bpp"); -const u16 gMapObjectPalette0[] = INCBIN_U16("graphics/map_objects/palettes/00.gbapal"); -const u16 gMapObjectPalette1[] = INCBIN_U16("graphics/map_objects/palettes/01.gbapal"); -const u16 gMapObjectPalette2[] = INCBIN_U16("graphics/map_objects/palettes/02.gbapal"); -const u16 gMapObjectPalette3[] = INCBIN_U16("graphics/map_objects/palettes/03.gbapal"); -const u16 gMapObjectPalette4[] = INCBIN_U16("graphics/map_objects/palettes/04.gbapal"); -const u16 gMapObjectPalette5[] = INCBIN_U16("graphics/map_objects/palettes/05.gbapal"); -const u16 gMapObjectPalette6[] = INCBIN_U16("graphics/map_objects/palettes/06.gbapal"); -const u16 gMapObjectPalette7[] = INCBIN_U16("graphics/map_objects/palettes/07.gbapal"); -const u32 gMapObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/0.4bpp"); -const u32 gMapObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/1.4bpp"); -const u32 gMapObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/2.4bpp"); -const u32 gMapObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/3.4bpp"); -const u32 gMapObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/4.4bpp"); -const u32 gMapObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/5.4bpp"); -const u32 gMapObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/6.4bpp"); -const u32 gMapObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/7.4bpp"); -const u32 gMapObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/8.4bpp"); -const u32 gMapObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/0.4bpp"); -const u32 gMapObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/1.4bpp"); -const u32 gMapObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/2.4bpp"); -const u32 gMapObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/3.4bpp"); -const u32 gMapObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/4.4bpp"); -const u32 gMapObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/5.4bpp"); -const u32 gMapObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/6.4bpp"); -const u32 gMapObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/7.4bpp"); -const u32 gMapObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/8.4bpp"); -const u32 gMapObjectPic_Boy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/0.4bpp"); -const u32 gMapObjectPic_Boy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/1.4bpp"); -const u32 gMapObjectPic_Boy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/2.4bpp"); -const u32 gMapObjectPic_Boy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/3.4bpp"); -const u32 gMapObjectPic_Boy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/4.4bpp"); -const u32 gMapObjectPic_Boy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/5.4bpp"); -const u32 gMapObjectPic_Boy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/6.4bpp"); -const u32 gMapObjectPic_Boy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/7.4bpp"); -const u32 gMapObjectPic_Boy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/8.4bpp"); -const u32 gMapObjectPic_Girl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/0.4bpp"); -const u32 gMapObjectPic_Girl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/1.4bpp"); -const u32 gMapObjectPic_Girl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/2.4bpp"); -const u32 gMapObjectPic_Girl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/3.4bpp"); -const u32 gMapObjectPic_Girl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/4.4bpp"); -const u32 gMapObjectPic_Girl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/5.4bpp"); -const u32 gMapObjectPic_Girl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/6.4bpp"); -const u32 gMapObjectPic_Girl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/7.4bpp"); -const u32 gMapObjectPic_Girl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/8.4bpp"); -const u32 gMapObjectPic_Boy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/0.4bpp"); -const u32 gMapObjectPic_Boy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/1.4bpp"); -const u32 gMapObjectPic_Boy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/2.4bpp"); -const u32 gMapObjectPic_Boy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/3.4bpp"); -const u32 gMapObjectPic_Boy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/4.4bpp"); -const u32 gMapObjectPic_Boy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/5.4bpp"); -const u32 gMapObjectPic_Boy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/6.4bpp"); -const u32 gMapObjectPic_Boy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/7.4bpp"); -const u32 gMapObjectPic_Boy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/8.4bpp"); -const u32 gMapObjectPic_Girl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/0.4bpp"); -const u32 gMapObjectPic_Girl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/1.4bpp"); -const u32 gMapObjectPic_Girl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/2.4bpp"); -const u32 gMapObjectPic_Girl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/3.4bpp"); -const u32 gMapObjectPic_Girl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/4.4bpp"); -const u32 gMapObjectPic_Girl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/5.4bpp"); -const u32 gMapObjectPic_Girl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/6.4bpp"); -const u32 gMapObjectPic_Girl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/7.4bpp"); -const u32 gMapObjectPic_Girl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/8.4bpp"); -const u32 gMapObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/0.4bpp"); -const u32 gMapObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/1.4bpp"); -const u32 gMapObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/2.4bpp"); -const u32 gMapObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/3.4bpp"); -const u32 gMapObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/4.4bpp"); -const u32 gMapObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/5.4bpp"); -const u32 gMapObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/6.4bpp"); -const u32 gMapObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/7.4bpp"); -const u32 gMapObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/8.4bpp"); -const u32 gMapObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/0.4bpp"); -const u32 gMapObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/1.4bpp"); -const u32 gMapObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/2.4bpp"); -const u32 gMapObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/3.4bpp"); -const u32 gMapObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/4.4bpp"); -const u32 gMapObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/5.4bpp"); -const u32 gMapObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/6.4bpp"); -const u32 gMapObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/7.4bpp"); -const u32 gMapObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/8.4bpp"); -const u32 gMapObjectPic_Boy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/0.4bpp"); -const u32 gMapObjectPic_Boy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/1.4bpp"); -const u32 gMapObjectPic_Boy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/2.4bpp"); -const u32 gMapObjectPic_Boy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/3.4bpp"); -const u32 gMapObjectPic_Boy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/4.4bpp"); -const u32 gMapObjectPic_Boy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/5.4bpp"); -const u32 gMapObjectPic_Boy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/6.4bpp"); -const u32 gMapObjectPic_Boy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/7.4bpp"); -const u32 gMapObjectPic_Boy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/8.4bpp"); -const u32 gMapObjectPic_Girl3_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/0.4bpp"); -const u32 gMapObjectPic_Girl3_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/1.4bpp"); -const u32 gMapObjectPic_Girl3_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/2.4bpp"); -const u32 gMapObjectPic_Girl3_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/3.4bpp"); -const u32 gMapObjectPic_Girl3_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/4.4bpp"); -const u32 gMapObjectPic_Girl3_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/5.4bpp"); -const u32 gMapObjectPic_Girl3_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/6.4bpp"); -const u32 gMapObjectPic_Girl3_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/7.4bpp"); -const u32 gMapObjectPic_Girl3_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/8.4bpp"); -const u32 gMapObjectPic_Boy4_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/0.4bpp"); -const u32 gMapObjectPic_Boy4_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/1.4bpp"); -const u32 gMapObjectPic_Boy4_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/2.4bpp"); -const u32 gMapObjectPic_Boy4_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/3.4bpp"); -const u32 gMapObjectPic_Boy4_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/4.4bpp"); -const u32 gMapObjectPic_Boy4_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/5.4bpp"); -const u32 gMapObjectPic_Boy4_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/6.4bpp"); -const u32 gMapObjectPic_Boy4_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/7.4bpp"); -const u32 gMapObjectPic_Boy4_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/8.4bpp"); -const u32 gMapObjectPic_Woman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/0.4bpp"); -const u32 gMapObjectPic_Woman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/1.4bpp"); -const u32 gMapObjectPic_Woman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/2.4bpp"); -const u32 gMapObjectPic_Woman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/3.4bpp"); -const u32 gMapObjectPic_Woman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/4.4bpp"); -const u32 gMapObjectPic_Woman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/5.4bpp"); -const u32 gMapObjectPic_Woman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/6.4bpp"); -const u32 gMapObjectPic_Woman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/7.4bpp"); -const u32 gMapObjectPic_Woman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/8.4bpp"); -const u32 gMapObjectPic_FatMan_0[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/0.4bpp"); -const u32 gMapObjectPic_FatMan_1[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/1.4bpp"); -const u32 gMapObjectPic_FatMan_2[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/2.4bpp"); -const u32 gMapObjectPic_FatMan_3[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/3.4bpp"); -const u32 gMapObjectPic_FatMan_4[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/4.4bpp"); -const u32 gMapObjectPic_FatMan_5[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/5.4bpp"); -const u32 gMapObjectPic_FatMan_6[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/6.4bpp"); -const u32 gMapObjectPic_FatMan_7[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/7.4bpp"); -const u32 gMapObjectPic_FatMan_8[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/8.4bpp"); -const u32 gMapObjectPic_Woman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/0.4bpp"); -const u32 gMapObjectPic_Woman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/1.4bpp"); -const u32 gMapObjectPic_Woman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/2.4bpp"); -const u32 gMapObjectPic_Woman2_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/3.4bpp"); -const u32 gMapObjectPic_Woman2_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/4.4bpp"); -const u32 gMapObjectPic_Woman2_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/5.4bpp"); -const u32 gMapObjectPic_Woman2_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/6.4bpp"); -const u32 gMapObjectPic_Woman2_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/7.4bpp"); -const u32 gMapObjectPic_Woman2_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/8.4bpp"); -const u32 gMapObjectPic_Man1_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/0.4bpp"); -const u32 gMapObjectPic_Man1_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/1.4bpp"); -const u32 gMapObjectPic_Man1_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/2.4bpp"); -const u32 gMapObjectPic_Man1_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/3.4bpp"); -const u32 gMapObjectPic_Man1_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/4.4bpp"); -const u32 gMapObjectPic_Man1_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/5.4bpp"); -const u32 gMapObjectPic_Man1_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/6.4bpp"); -const u32 gMapObjectPic_Man1_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/7.4bpp"); -const u32 gMapObjectPic_Man1_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/8.4bpp"); -const u32 gMapObjectPic_Woman3_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/0.4bpp"); -const u32 gMapObjectPic_Woman3_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/1.4bpp"); -const u32 gMapObjectPic_Woman3_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/2.4bpp"); -const u32 gMapObjectPic_Woman3_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/3.4bpp"); -const u32 gMapObjectPic_Woman3_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/4.4bpp"); -const u32 gMapObjectPic_Woman3_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/5.4bpp"); -const u32 gMapObjectPic_Woman3_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/6.4bpp"); -const u32 gMapObjectPic_Woman3_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/7.4bpp"); -const u32 gMapObjectPic_Woman3_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/8.4bpp"); -const u32 gMapObjectPic_OldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/0.4bpp"); -const u32 gMapObjectPic_OldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/1.4bpp"); -const u32 gMapObjectPic_OldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/2.4bpp"); -const u32 gMapObjectPic_OldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/3.4bpp"); -const u32 gMapObjectPic_OldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/4.4bpp"); -const u32 gMapObjectPic_OldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/5.4bpp"); -const u32 gMapObjectPic_OldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/6.4bpp"); -const u32 gMapObjectPic_OldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/7.4bpp"); -const u32 gMapObjectPic_OldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/8.4bpp"); -const u32 gMapObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/0.4bpp"); -const u32 gMapObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/1.4bpp"); -const u32 gMapObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/2.4bpp"); -const u32 gMapObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/3.4bpp"); -const u32 gMapObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/4.4bpp"); -const u32 gMapObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/5.4bpp"); -const u32 gMapObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/6.4bpp"); -const u32 gMapObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/7.4bpp"); -const u32 gMapObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/8.4bpp"); -const u32 gMapObjectPic_Man2_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/0.4bpp"); -const u32 gMapObjectPic_Man2_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/1.4bpp"); -const u32 gMapObjectPic_Man2_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/2.4bpp"); -const u32 gMapObjectPic_Man2_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/3.4bpp"); -const u32 gMapObjectPic_Man2_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/4.4bpp"); -const u32 gMapObjectPic_Man2_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/5.4bpp"); -const u32 gMapObjectPic_Man2_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/6.4bpp"); -const u32 gMapObjectPic_Man2_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/7.4bpp"); -const u32 gMapObjectPic_Man2_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/8.4bpp"); -const u32 gMapObjectPic_Woman4_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/0.4bpp"); -const u32 gMapObjectPic_Woman4_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/1.4bpp"); -const u32 gMapObjectPic_Woman4_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/2.4bpp"); -const u32 gMapObjectPic_Woman4_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/3.4bpp"); -const u32 gMapObjectPic_Woman4_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/4.4bpp"); -const u32 gMapObjectPic_Woman4_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/5.4bpp"); -const u32 gMapObjectPic_Woman4_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/6.4bpp"); -const u32 gMapObjectPic_Woman4_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/7.4bpp"); -const u32 gMapObjectPic_Woman4_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/8.4bpp"); -const u32 gMapObjectPic_Man3_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/0.4bpp"); -const u32 gMapObjectPic_Man3_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/1.4bpp"); -const u32 gMapObjectPic_Man3_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/2.4bpp"); -const u32 gMapObjectPic_Man3_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/3.4bpp"); -const u32 gMapObjectPic_Man3_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/4.4bpp"); -const u32 gMapObjectPic_Man3_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/5.4bpp"); -const u32 gMapObjectPic_Man3_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/6.4bpp"); -const u32 gMapObjectPic_Man3_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/7.4bpp"); -const u32 gMapObjectPic_Man3_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/8.4bpp"); -const u32 gMapObjectPic_Woman5_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/0.4bpp"); -const u32 gMapObjectPic_Woman5_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/1.4bpp"); -const u32 gMapObjectPic_Woman5_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/2.4bpp"); -const u32 gMapObjectPic_Woman5_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/3.4bpp"); -const u32 gMapObjectPic_Woman5_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/4.4bpp"); -const u32 gMapObjectPic_Woman5_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/5.4bpp"); -const u32 gMapObjectPic_Woman5_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/6.4bpp"); -const u32 gMapObjectPic_Woman5_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/7.4bpp"); -const u32 gMapObjectPic_Woman5_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/8.4bpp"); -const u32 gMapObjectPic_Cook_0[] = INCBIN_U32("graphics/map_objects/pics/people/cook/0.4bpp"); -const u32 gMapObjectPic_Cook_1[] = INCBIN_U32("graphics/map_objects/pics/people/cook/1.4bpp"); -const u32 gMapObjectPic_Cook_2[] = INCBIN_U32("graphics/map_objects/pics/people/cook/2.4bpp"); -const u32 gMapObjectPic_Woman6_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/0.4bpp"); -const u32 gMapObjectPic_Woman6_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/1.4bpp"); -const u32 gMapObjectPic_Woman6_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/2.4bpp"); -const u32 gMapObjectPic_Woman6_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/3.4bpp"); -const u32 gMapObjectPic_Woman6_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/4.4bpp"); -const u32 gMapObjectPic_Woman6_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/5.4bpp"); -const u32 gMapObjectPic_Woman6_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/6.4bpp"); -const u32 gMapObjectPic_Woman6_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/7.4bpp"); -const u32 gMapObjectPic_Woman6_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/8.4bpp"); -const u32 gMapObjectPic_OldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/0.4bpp"); -const u32 gMapObjectPic_OldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/1.4bpp"); -const u32 gMapObjectPic_OldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/2.4bpp"); -const u32 gMapObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/0.4bpp"); -const u32 gMapObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/1.4bpp"); -const u32 gMapObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/2.4bpp"); -const u32 gMapObjectPic_Camper_0[] = INCBIN_U32("graphics/map_objects/pics/people/camper/0.4bpp"); -const u32 gMapObjectPic_Camper_1[] = INCBIN_U32("graphics/map_objects/pics/people/camper/1.4bpp"); -const u32 gMapObjectPic_Camper_2[] = INCBIN_U32("graphics/map_objects/pics/people/camper/2.4bpp"); -const u32 gMapObjectPic_Camper_3[] = INCBIN_U32("graphics/map_objects/pics/people/camper/3.4bpp"); -const u32 gMapObjectPic_Camper_4[] = INCBIN_U32("graphics/map_objects/pics/people/camper/4.4bpp"); -const u32 gMapObjectPic_Camper_5[] = INCBIN_U32("graphics/map_objects/pics/people/camper/5.4bpp"); -const u32 gMapObjectPic_Camper_6[] = INCBIN_U32("graphics/map_objects/pics/people/camper/6.4bpp"); -const u32 gMapObjectPic_Camper_7[] = INCBIN_U32("graphics/map_objects/pics/people/camper/7.4bpp"); -const u32 gMapObjectPic_Camper_8[] = INCBIN_U32("graphics/map_objects/pics/people/camper/8.4bpp"); -const u32 gMapObjectPic_Picnicker_0[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/0.4bpp"); -const u32 gMapObjectPic_Picnicker_1[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/1.4bpp"); -const u32 gMapObjectPic_Picnicker_2[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/2.4bpp"); -const u32 gMapObjectPic_Picnicker_3[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/3.4bpp"); -const u32 gMapObjectPic_Picnicker_4[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/4.4bpp"); -const u32 gMapObjectPic_Picnicker_5[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/5.4bpp"); -const u32 gMapObjectPic_Picnicker_6[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/6.4bpp"); -const u32 gMapObjectPic_Picnicker_7[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/7.4bpp"); -const u32 gMapObjectPic_Picnicker_8[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/8.4bpp"); -const u32 gMapObjectPic_Man4_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/0.4bpp"); -const u32 gMapObjectPic_Man4_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/1.4bpp"); -const u32 gMapObjectPic_Man4_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/2.4bpp"); -const u32 gMapObjectPic_Man4_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/3.4bpp"); -const u32 gMapObjectPic_Man4_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/4.4bpp"); -const u32 gMapObjectPic_Man4_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/5.4bpp"); -const u32 gMapObjectPic_Man4_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/6.4bpp"); -const u32 gMapObjectPic_Man4_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/7.4bpp"); -const u32 gMapObjectPic_Man4_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/8.4bpp"); -const u32 gMapObjectPic_Woman7_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/0.4bpp"); -const u32 gMapObjectPic_Woman7_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/1.4bpp"); -const u32 gMapObjectPic_Woman7_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/2.4bpp"); -const u32 gMapObjectPic_Woman7_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/3.4bpp"); -const u32 gMapObjectPic_Woman7_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/4.4bpp"); -const u32 gMapObjectPic_Woman7_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/5.4bpp"); -const u32 gMapObjectPic_Woman7_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/6.4bpp"); -const u32 gMapObjectPic_Woman7_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/7.4bpp"); -const u32 gMapObjectPic_Woman7_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/8.4bpp"); -const u32 gMapObjectPic_Youngster_0[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/0.4bpp"); -const u32 gMapObjectPic_Youngster_1[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/1.4bpp"); -const u32 gMapObjectPic_Youngster_2[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/2.4bpp"); -const u32 gMapObjectPic_Youngster_3[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/3.4bpp"); -const u32 gMapObjectPic_Youngster_4[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/4.4bpp"); -const u32 gMapObjectPic_Youngster_5[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/5.4bpp"); -const u32 gMapObjectPic_Youngster_6[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/6.4bpp"); -const u32 gMapObjectPic_Youngster_7[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/7.4bpp"); -const u32 gMapObjectPic_Youngster_8[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/8.4bpp"); -const u32 gMapObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/0.4bpp"); -const u32 gMapObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/1.4bpp"); -const u32 gMapObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/2.4bpp"); -const u32 gMapObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/3.4bpp"); -const u32 gMapObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/4.4bpp"); -const u32 gMapObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/5.4bpp"); -const u32 gMapObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/6.4bpp"); -const u32 gMapObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/7.4bpp"); -const u32 gMapObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/8.4bpp"); -const u32 gMapObjectPic_PsychicM_0[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/0.4bpp"); -const u32 gMapObjectPic_PsychicM_1[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/1.4bpp"); -const u32 gMapObjectPic_PsychicM_2[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/2.4bpp"); -const u32 gMapObjectPic_PsychicM_3[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/3.4bpp"); -const u32 gMapObjectPic_PsychicM_4[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/4.4bpp"); -const u32 gMapObjectPic_PsychicM_5[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/5.4bpp"); -const u32 gMapObjectPic_PsychicM_6[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/6.4bpp"); -const u32 gMapObjectPic_PsychicM_7[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/7.4bpp"); -const u32 gMapObjectPic_PsychicM_8[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/8.4bpp"); -const u32 gMapObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/0.4bpp"); -const u32 gMapObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/1.4bpp"); -const u32 gMapObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/2.4bpp"); -const u32 gMapObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/3.4bpp"); -const u32 gMapObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/4.4bpp"); -const u32 gMapObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/5.4bpp"); -const u32 gMapObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/6.4bpp"); -const u32 gMapObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/7.4bpp"); -const u32 gMapObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/8.4bpp"); -const u32 gMapObjectPic_Maniac_0[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/0.4bpp"); -const u32 gMapObjectPic_Maniac_1[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/1.4bpp"); -const u32 gMapObjectPic_Maniac_2[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/2.4bpp"); -const u32 gMapObjectPic_Maniac_3[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/3.4bpp"); -const u32 gMapObjectPic_Maniac_4[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/4.4bpp"); -const u32 gMapObjectPic_Maniac_5[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/5.4bpp"); -const u32 gMapObjectPic_Maniac_6[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/6.4bpp"); -const u32 gMapObjectPic_Maniac_7[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/7.4bpp"); -const u32 gMapObjectPic_Maniac_8[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/8.4bpp"); -const u32 gMapObjectPic_HexManiac_0[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/0.4bpp"); -const u32 gMapObjectPic_HexManiac_1[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/1.4bpp"); -const u32 gMapObjectPic_HexManiac_2[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/2.4bpp"); -const u32 gMapObjectPic_HexManiac_3[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/3.4bpp"); -const u32 gMapObjectPic_HexManiac_4[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/4.4bpp"); -const u32 gMapObjectPic_HexManiac_5[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/5.4bpp"); -const u32 gMapObjectPic_HexManiac_6[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/6.4bpp"); -const u32 gMapObjectPic_HexManiac_7[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/7.4bpp"); -const u32 gMapObjectPic_HexManiac_8[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/8.4bpp"); -const u32 gMapObjectPic_Woman8_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/0.4bpp"); -const u32 gMapObjectPic_Woman8_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/1.4bpp"); -const u32 gMapObjectPic_Woman8_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/2.4bpp"); -const u32 gMapObjectPic_Woman8_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/3.4bpp"); -const u32 gMapObjectPic_Woman8_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/4.4bpp"); -const u32 gMapObjectPic_Woman8_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/5.4bpp"); -const u32 gMapObjectPic_Woman8_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/6.4bpp"); -const u32 gMapObjectPic_Woman8_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/7.4bpp"); -const u32 gMapObjectPic_Woman8_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/8.4bpp"); -const u32 gMapObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/0.4bpp"); -const u32 gMapObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/1.4bpp"); -const u32 gMapObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/2.4bpp"); -const u32 gMapObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/3.4bpp"); -const u32 gMapObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/4.4bpp"); -const u32 gMapObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/5.4bpp"); -const u32 gMapObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/6.4bpp"); -const u32 gMapObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/7.4bpp"); -const u32 gMapObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/8.4bpp"); -const u32 gMapObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/0.4bpp"); -const u32 gMapObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/1.4bpp"); -const u32 gMapObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/2.4bpp"); -const u32 gMapObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/3.4bpp"); -const u32 gMapObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/4.4bpp"); -const u32 gMapObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/5.4bpp"); -const u32 gMapObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/6.4bpp"); -const u32 gMapObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/7.4bpp"); -const u32 gMapObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/8.4bpp"); -const u32 gMapObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/0.4bpp"); -const u32 gMapObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/1.4bpp"); -const u32 gMapObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/2.4bpp"); -const u32 gMapObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/3.4bpp"); -const u32 gMapObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/4.4bpp"); -const u32 gMapObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/5.4bpp"); -const u32 gMapObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/6.4bpp"); -const u32 gMapObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/7.4bpp"); -const u32 gMapObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/8.4bpp"); -const u32 gMapObjectPic_Beauty_0[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/0.4bpp"); -const u32 gMapObjectPic_Beauty_1[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/1.4bpp"); -const u32 gMapObjectPic_Beauty_2[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/2.4bpp"); -const u32 gMapObjectPic_Beauty_3[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/3.4bpp"); -const u32 gMapObjectPic_Beauty_4[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/4.4bpp"); -const u32 gMapObjectPic_Beauty_5[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/5.4bpp"); -const u32 gMapObjectPic_Beauty_6[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/6.4bpp"); -const u32 gMapObjectPic_Beauty_7[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/7.4bpp"); -const u32 gMapObjectPic_Beauty_8[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/8.4bpp"); -const u32 gMapObjectPic_Scientist1_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/0.4bpp"); -const u32 gMapObjectPic_Scientist1_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/1.4bpp"); -const u32 gMapObjectPic_Scientist1_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/2.4bpp"); -const u32 gMapObjectPic_Scientist1_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/3.4bpp"); -const u32 gMapObjectPic_Scientist1_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/4.4bpp"); -const u32 gMapObjectPic_Scientist1_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/5.4bpp"); -const u32 gMapObjectPic_Scientist1_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/6.4bpp"); -const u32 gMapObjectPic_Scientist1_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/7.4bpp"); -const u32 gMapObjectPic_Scientist1_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/8.4bpp"); -const u32 gMapObjectPic_Lass_0[] = INCBIN_U32("graphics/map_objects/pics/people/lass/0.4bpp"); -const u32 gMapObjectPic_Lass_1[] = INCBIN_U32("graphics/map_objects/pics/people/lass/1.4bpp"); -const u32 gMapObjectPic_Lass_2[] = INCBIN_U32("graphics/map_objects/pics/people/lass/2.4bpp"); -const u32 gMapObjectPic_Lass_3[] = INCBIN_U32("graphics/map_objects/pics/people/lass/3.4bpp"); -const u32 gMapObjectPic_Lass_4[] = INCBIN_U32("graphics/map_objects/pics/people/lass/4.4bpp"); -const u32 gMapObjectPic_Lass_5[] = INCBIN_U32("graphics/map_objects/pics/people/lass/5.4bpp"); -const u32 gMapObjectPic_Lass_6[] = INCBIN_U32("graphics/map_objects/pics/people/lass/6.4bpp"); -const u32 gMapObjectPic_Lass_7[] = INCBIN_U32("graphics/map_objects/pics/people/lass/7.4bpp"); -const u32 gMapObjectPic_Lass_8[] = INCBIN_U32("graphics/map_objects/pics/people/lass/8.4bpp"); -const u32 gMapObjectPic_Gentleman_0[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/0.4bpp"); -const u32 gMapObjectPic_Gentleman_1[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/1.4bpp"); -const u32 gMapObjectPic_Gentleman_2[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/2.4bpp"); -const u32 gMapObjectPic_Gentleman_3[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/3.4bpp"); -const u32 gMapObjectPic_Gentleman_4[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/4.4bpp"); -const u32 gMapObjectPic_Gentleman_5[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/5.4bpp"); -const u32 gMapObjectPic_Gentleman_6[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/6.4bpp"); -const u32 gMapObjectPic_Gentleman_7[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/7.4bpp"); -const u32 gMapObjectPic_Gentleman_8[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/8.4bpp"); -const u32 gMapObjectPic_Sailor_0[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/0.4bpp"); -const u32 gMapObjectPic_Sailor_1[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/1.4bpp"); -const u32 gMapObjectPic_Sailor_2[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/2.4bpp"); -const u32 gMapObjectPic_Sailor_3[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/3.4bpp"); -const u32 gMapObjectPic_Sailor_4[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/4.4bpp"); -const u32 gMapObjectPic_Sailor_5[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/5.4bpp"); -const u32 gMapObjectPic_Sailor_6[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/6.4bpp"); -const u32 gMapObjectPic_Sailor_7[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/7.4bpp"); -const u32 gMapObjectPic_Sailor_8[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/8.4bpp"); -const u32 gMapObjectPic_Fisherman_0[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/0.4bpp"); -const u32 gMapObjectPic_Fisherman_1[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/1.4bpp"); -const u32 gMapObjectPic_Fisherman_2[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/2.4bpp"); -const u32 gMapObjectPic_Fisherman_3[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/3.4bpp"); -const u32 gMapObjectPic_Fisherman_4[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/4.4bpp"); -const u32 gMapObjectPic_Fisherman_5[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/5.4bpp"); -const u32 gMapObjectPic_Fisherman_6[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/6.4bpp"); -const u32 gMapObjectPic_Fisherman_7[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/7.4bpp"); -const u32 gMapObjectPic_Fisherman_8[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/8.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/0.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/1.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/2.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/3.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/4.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/5.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/6.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/7.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/8.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/0.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/1.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/2.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/3.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/4.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/5.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/6.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/7.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/8.4bpp"); -const u32 gMapObjectPic_TuberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/0.4bpp"); -const u32 gMapObjectPic_TuberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/1.4bpp"); -const u32 gMapObjectPic_TuberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/2.4bpp"); -const u32 gMapObjectPic_TuberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/3.4bpp"); -const u32 gMapObjectPic_TuberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/4.4bpp"); -const u32 gMapObjectPic_TuberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/5.4bpp"); -const u32 gMapObjectPic_TuberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/6.4bpp"); -const u32 gMapObjectPic_TuberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/7.4bpp"); -const u32 gMapObjectPic_TuberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/8.4bpp"); -const u32 gMapObjectPic_TuberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/0.4bpp"); -const u32 gMapObjectPic_TuberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/1.4bpp"); -const u32 gMapObjectPic_TuberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/2.4bpp"); -const u32 gMapObjectPic_TuberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/3.4bpp"); -const u32 gMapObjectPic_TuberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/4.4bpp"); -const u32 gMapObjectPic_TuberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/5.4bpp"); -const u32 gMapObjectPic_TuberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/6.4bpp"); -const u32 gMapObjectPic_TuberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/7.4bpp"); -const u32 gMapObjectPic_TuberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/8.4bpp"); -const u32 gMapObjectPic_Hiker_0[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/0.4bpp"); -const u32 gMapObjectPic_Hiker_1[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/1.4bpp"); -const u32 gMapObjectPic_Hiker_2[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/2.4bpp"); -const u32 gMapObjectPic_Hiker_3[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/3.4bpp"); -const u32 gMapObjectPic_Hiker_4[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/4.4bpp"); -const u32 gMapObjectPic_Hiker_5[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/5.4bpp"); -const u32 gMapObjectPic_Hiker_6[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/6.4bpp"); -const u32 gMapObjectPic_Hiker_7[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/7.4bpp"); -const u32 gMapObjectPic_Hiker_8[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/8.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/0.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/1.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/2.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/3.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/4.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/5.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/6.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/7.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/8.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/0.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/1.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/2.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/3.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/4.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/5.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/6.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/7.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/8.4bpp"); -const u32 gMapObjectPic_Man5_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/0.4bpp"); -const u32 gMapObjectPic_Man5_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/1.4bpp"); -const u32 gMapObjectPic_Man5_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/2.4bpp"); -const u32 gMapObjectPic_Man5_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/3.4bpp"); -const u32 gMapObjectPic_Man5_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/4.4bpp"); -const u32 gMapObjectPic_Man5_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/5.4bpp"); -const u32 gMapObjectPic_Man5_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/6.4bpp"); -const u32 gMapObjectPic_Man5_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/7.4bpp"); -const u32 gMapObjectPic_Man5_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/8.4bpp"); -const u32 gMapObjectPic_Man6_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/0.4bpp"); -const u32 gMapObjectPic_Man6_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/1.4bpp"); -const u32 gMapObjectPic_Man6_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/2.4bpp"); -const u32 gMapObjectPic_Man6_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/3.4bpp"); -const u32 gMapObjectPic_Man6_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/4.4bpp"); -const u32 gMapObjectPic_Man6_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/5.4bpp"); -const u32 gMapObjectPic_Man6_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/6.4bpp"); -const u32 gMapObjectPic_Man6_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/7.4bpp"); -const u32 gMapObjectPic_Man6_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/8.4bpp"); -const u32 gMapObjectPic_Nurse_0[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/0.4bpp"); -const u32 gMapObjectPic_Nurse_1[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/1.4bpp"); -const u32 gMapObjectPic_Nurse_2[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/2.4bpp"); -const u32 gMapObjectPic_Nurse_3[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/3.4bpp"); -const u32 gMapObjectPic_Nurse_4[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/4.4bpp"); -const u32 gMapObjectPic_Nurse_5[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/5.4bpp"); -const u32 gMapObjectPic_Nurse_6[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/6.4bpp"); -const u32 gMapObjectPic_Nurse_7[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/7.4bpp"); -const u32 gMapObjectPic_Nurse_8[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/8.4bpp"); -const u32 gMapObjectPic_Nurse_9[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/9.4bpp"); -const u32 gMapObjectPic_ItemBall[] = INCBIN_U32("graphics/map_objects/pics/misc/item_ball.4bpp"); -const u32 gMapObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/0.4bpp"); -const u32 gMapObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/1.4bpp"); -const u32 gMapObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/2.4bpp"); -const u32 gMapObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/3.4bpp"); -const u32 gMapObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/4.4bpp"); -const u32 gMapObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/5.4bpp"); -const u32 gMapObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/6.4bpp"); -const u32 gMapObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/7.4bpp"); -const u32 gMapObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/8.4bpp"); -const u32 gMapObjectPic_ReporterM_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/0.4bpp"); -const u32 gMapObjectPic_ReporterM_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/1.4bpp"); -const u32 gMapObjectPic_ReporterM_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/2.4bpp"); -const u32 gMapObjectPic_ReporterM_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/3.4bpp"); -const u32 gMapObjectPic_ReporterM_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/4.4bpp"); -const u32 gMapObjectPic_ReporterM_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/5.4bpp"); -const u32 gMapObjectPic_ReporterM_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/6.4bpp"); -const u32 gMapObjectPic_ReporterM_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/7.4bpp"); -const u32 gMapObjectPic_ReporterM_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/8.4bpp"); -const u32 gMapObjectPic_ReporterF_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/0.4bpp"); -const u32 gMapObjectPic_ReporterF_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/1.4bpp"); -const u32 gMapObjectPic_ReporterF_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/2.4bpp"); -const u32 gMapObjectPic_ReporterF_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/3.4bpp"); -const u32 gMapObjectPic_ReporterF_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/4.4bpp"); -const u32 gMapObjectPic_ReporterF_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/5.4bpp"); -const u32 gMapObjectPic_ReporterF_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/6.4bpp"); -const u32 gMapObjectPic_ReporterF_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/7.4bpp"); -const u32 gMapObjectPic_ReporterF_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/8.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/0.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/1.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/2.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/3.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/4.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/5.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/6.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/7.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/8.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/0.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/1.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/2.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/3.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/4.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/5.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/6.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/7.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/8.4bpp"); -const u32 gMapObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/0.4bpp"); -const u32 gMapObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/1.4bpp"); -const u32 gMapObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/2.4bpp"); -const u32 gMapObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/3.4bpp"); -const u32 gMapObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/4.4bpp"); -const u32 gMapObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/5.4bpp"); -const u32 gMapObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/6.4bpp"); -const u32 gMapObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/7.4bpp"); -const u32 gMapObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/8.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/0.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/1.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/2.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/3.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/4.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/5.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/6.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/7.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/8.4bpp"); -const u32 gMapObjectPic_Teala_0[] = INCBIN_U32("graphics/map_objects/pics/people/teala/0.4bpp"); -const u32 gMapObjectPic_Teala_1[] = INCBIN_U32("graphics/map_objects/pics/people/teala/1.4bpp"); -const u32 gMapObjectPic_Teala_2[] = INCBIN_U32("graphics/map_objects/pics/people/teala/2.4bpp"); -const u32 gMapObjectPic_Teala_3[] = INCBIN_U32("graphics/map_objects/pics/people/teala/3.4bpp"); -const u32 gMapObjectPic_Teala_4[] = INCBIN_U32("graphics/map_objects/pics/people/teala/4.4bpp"); -const u32 gMapObjectPic_Teala_5[] = INCBIN_U32("graphics/map_objects/pics/people/teala/5.4bpp"); -const u32 gMapObjectPic_Teala_6[] = INCBIN_U32("graphics/map_objects/pics/people/teala/6.4bpp"); -const u32 gMapObjectPic_Teala_7[] = INCBIN_U32("graphics/map_objects/pics/people/teala/7.4bpp"); -const u32 gMapObjectPic_Teala_8[] = INCBIN_U32("graphics/map_objects/pics/people/teala/8.4bpp"); -const u32 gMapObjectPic_Artist_0[] = INCBIN_U32("graphics/map_objects/pics/people/artist/0.4bpp"); -const u32 gMapObjectPic_Artist_1[] = INCBIN_U32("graphics/map_objects/pics/people/artist/1.4bpp"); -const u32 gMapObjectPic_Artist_2[] = INCBIN_U32("graphics/map_objects/pics/people/artist/2.4bpp"); -const u32 gMapObjectPic_Artist_3[] = INCBIN_U32("graphics/map_objects/pics/people/artist/3.4bpp"); -const u32 gMapObjectPic_Artist_4[] = INCBIN_U32("graphics/map_objects/pics/people/artist/4.4bpp"); -const u32 gMapObjectPic_Artist_5[] = INCBIN_U32("graphics/map_objects/pics/people/artist/5.4bpp"); -const u32 gMapObjectPic_Artist_6[] = INCBIN_U32("graphics/map_objects/pics/people/artist/6.4bpp"); -const u32 gMapObjectPic_Artist_7[] = INCBIN_U32("graphics/map_objects/pics/people/artist/7.4bpp"); -const u32 gMapObjectPic_Artist_8[] = INCBIN_U32("graphics/map_objects/pics/people/artist/8.4bpp"); -const u32 gMapObjectPic_Cameraman_0[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/0.4bpp"); -const u32 gMapObjectPic_Cameraman_1[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/1.4bpp"); -const u32 gMapObjectPic_Cameraman_2[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/2.4bpp"); -const u32 gMapObjectPic_Cameraman_3[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/3.4bpp"); -const u32 gMapObjectPic_Cameraman_4[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/4.4bpp"); -const u32 gMapObjectPic_Cameraman_5[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/5.4bpp"); -const u32 gMapObjectPic_Cameraman_6[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/6.4bpp"); -const u32 gMapObjectPic_Cameraman_7[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/7.4bpp"); -const u32 gMapObjectPic_Cameraman_8[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/8.4bpp"); -const u32 gMapObjectPic_Scientist2_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/0.4bpp"); -const u32 gMapObjectPic_Scientist2_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/1.4bpp"); -const u32 gMapObjectPic_Scientist2_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/2.4bpp"); -const u32 gMapObjectPic_Scientist2_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/3.4bpp"); -const u32 gMapObjectPic_Scientist2_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/4.4bpp"); -const u32 gMapObjectPic_Scientist2_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/5.4bpp"); -const u32 gMapObjectPic_Scientist2_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/6.4bpp"); -const u32 gMapObjectPic_Scientist2_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/7.4bpp"); -const u32 gMapObjectPic_Scientist2_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/8.4bpp"); -const u32 gMapObjectPic_Man7_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/0.4bpp"); -const u32 gMapObjectPic_Man7_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/1.4bpp"); -const u32 gMapObjectPic_Man7_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/2.4bpp"); -const u32 gMapObjectPic_Man7_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/3.4bpp"); -const u32 gMapObjectPic_Man7_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/4.4bpp"); -const u32 gMapObjectPic_Man7_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/5.4bpp"); -const u32 gMapObjectPic_Man7_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/6.4bpp"); -const u32 gMapObjectPic_Man7_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/7.4bpp"); -const u32 gMapObjectPic_Man7_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/8.4bpp"); -const u32 gMapObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/0.4bpp"); -const u32 gMapObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/1.4bpp"); -const u32 gMapObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/2.4bpp"); -const u32 gMapObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/3.4bpp"); -const u32 gMapObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/4.4bpp"); -const u32 gMapObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/5.4bpp"); -const u32 gMapObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/6.4bpp"); -const u32 gMapObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/7.4bpp"); -const u32 gMapObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/8.4bpp"); -const u32 gMapObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/0.4bpp"); -const u32 gMapObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/1.4bpp"); -const u32 gMapObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/2.4bpp"); -const u32 gMapObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/3.4bpp"); -const u32 gMapObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/4.4bpp"); -const u32 gMapObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/5.4bpp"); -const u32 gMapObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/6.4bpp"); -const u32 gMapObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/7.4bpp"); -const u32 gMapObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/8.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/0.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/1.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/2.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/3.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/4.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/5.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/6.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/7.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/8.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/0.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/1.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/2.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/3.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/4.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/5.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/6.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/7.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/8.4bpp"); -const u32 gMapObjectPic_Sidney_0[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/0.4bpp"); -const u32 gMapObjectPic_Sidney_1[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/1.4bpp"); -const u32 gMapObjectPic_Sidney_2[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/2.4bpp"); -const u32 gMapObjectPic_Phoebe_0[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/0.4bpp"); -const u32 gMapObjectPic_Phoebe_1[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/1.4bpp"); -const u32 gMapObjectPic_Phoebe_2[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/2.4bpp"); -const u32 gMapObjectPic_Glacia_0[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/0.4bpp"); -const u32 gMapObjectPic_Glacia_1[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/1.4bpp"); -const u32 gMapObjectPic_Glacia_2[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/2.4bpp"); -const u32 gMapObjectPic_Drake_0[] = INCBIN_U32("graphics/map_objects/pics/people/drake/0.4bpp"); -const u32 gMapObjectPic_Drake_1[] = INCBIN_U32("graphics/map_objects/pics/people/drake/1.4bpp"); -const u32 gMapObjectPic_Drake_2[] = INCBIN_U32("graphics/map_objects/pics/people/drake/2.4bpp"); -const u32 gMapObjectPic_Roxanne_0[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/0.4bpp"); -const u32 gMapObjectPic_Roxanne_1[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/1.4bpp"); -const u32 gMapObjectPic_Roxanne_2[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/2.4bpp"); -const u32 gMapObjectPic_Brawly_0[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/0.4bpp"); -const u32 gMapObjectPic_Brawly_1[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/1.4bpp"); -const u32 gMapObjectPic_Brawly_2[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/2.4bpp"); -const u32 gMapObjectPic_Wattson_0[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/0.4bpp"); -const u32 gMapObjectPic_Wattson_1[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/1.4bpp"); -const u32 gMapObjectPic_Wattson_2[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/2.4bpp"); -const u32 gMapObjectPic_Flannery_0[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/0.4bpp"); -const u32 gMapObjectPic_Flannery_1[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/1.4bpp"); -const u32 gMapObjectPic_Flannery_2[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/2.4bpp"); -const u32 gMapObjectPic_Norman_0[] = INCBIN_U32("graphics/map_objects/pics/people/norman/0.4bpp"); -const u32 gMapObjectPic_Norman_1[] = INCBIN_U32("graphics/map_objects/pics/people/norman/1.4bpp"); -const u32 gMapObjectPic_Norman_2[] = INCBIN_U32("graphics/map_objects/pics/people/norman/2.4bpp"); -const u32 gMapObjectPic_Norman_3[] = INCBIN_U32("graphics/map_objects/pics/people/norman/3.4bpp"); -const u32 gMapObjectPic_Norman_4[] = INCBIN_U32("graphics/map_objects/pics/people/norman/4.4bpp"); -const u32 gMapObjectPic_Norman_5[] = INCBIN_U32("graphics/map_objects/pics/people/norman/5.4bpp"); -const u32 gMapObjectPic_Norman_6[] = INCBIN_U32("graphics/map_objects/pics/people/norman/6.4bpp"); -const u32 gMapObjectPic_Norman_7[] = INCBIN_U32("graphics/map_objects/pics/people/norman/7.4bpp"); -const u32 gMapObjectPic_Norman_8[] = INCBIN_U32("graphics/map_objects/pics/people/norman/8.4bpp"); -const u32 gMapObjectPic_Winona_0[] = INCBIN_U32("graphics/map_objects/pics/people/winona/0.4bpp"); -const u32 gMapObjectPic_Winona_1[] = INCBIN_U32("graphics/map_objects/pics/people/winona/1.4bpp"); -const u32 gMapObjectPic_Winona_2[] = INCBIN_U32("graphics/map_objects/pics/people/winona/2.4bpp"); -const u32 gMapObjectPic_Liza_0[] = INCBIN_U32("graphics/map_objects/pics/people/liza/0.4bpp"); -const u32 gMapObjectPic_Liza_1[] = INCBIN_U32("graphics/map_objects/pics/people/liza/1.4bpp"); -const u32 gMapObjectPic_Liza_2[] = INCBIN_U32("graphics/map_objects/pics/people/liza/2.4bpp"); -const u32 gMapObjectPic_Tate_0[] = INCBIN_U32("graphics/map_objects/pics/people/tate/0.4bpp"); -const u32 gMapObjectPic_Tate_1[] = INCBIN_U32("graphics/map_objects/pics/people/tate/1.4bpp"); -const u32 gMapObjectPic_Tate_2[] = INCBIN_U32("graphics/map_objects/pics/people/tate/2.4bpp"); -const u32 gMapObjectPic_Wallace_0[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/0.4bpp"); -const u32 gMapObjectPic_Wallace_1[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/1.4bpp"); -const u32 gMapObjectPic_Wallace_2[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/2.4bpp"); -const u32 gMapObjectPic_Wallace_3[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/3.4bpp"); -const u32 gMapObjectPic_Wallace_4[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/4.4bpp"); -const u32 gMapObjectPic_Wallace_5[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/5.4bpp"); -const u32 gMapObjectPic_Wallace_6[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/6.4bpp"); -const u32 gMapObjectPic_Wallace_7[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/7.4bpp"); -const u32 gMapObjectPic_Wallace_8[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/8.4bpp"); -const u32 gMapObjectPic_Steven_0[] = INCBIN_U32("graphics/map_objects/pics/people/steven/0.4bpp"); -const u32 gMapObjectPic_Steven_1[] = INCBIN_U32("graphics/map_objects/pics/people/steven/1.4bpp"); -const u32 gMapObjectPic_Steven_2[] = INCBIN_U32("graphics/map_objects/pics/people/steven/2.4bpp"); -const u32 gMapObjectPic_Steven_3[] = INCBIN_U32("graphics/map_objects/pics/people/steven/3.4bpp"); -const u32 gMapObjectPic_Steven_4[] = INCBIN_U32("graphics/map_objects/pics/people/steven/4.4bpp"); -const u32 gMapObjectPic_Steven_5[] = INCBIN_U32("graphics/map_objects/pics/people/steven/5.4bpp"); -const u32 gMapObjectPic_Steven_6[] = INCBIN_U32("graphics/map_objects/pics/people/steven/6.4bpp"); -const u32 gMapObjectPic_Steven_7[] = INCBIN_U32("graphics/map_objects/pics/people/steven/7.4bpp"); -const u32 gMapObjectPic_Steven_8[] = INCBIN_U32("graphics/map_objects/pics/people/steven/8.4bpp"); -const u32 gMapObjectPic_Wally_0[] = INCBIN_U32("graphics/map_objects/pics/people/wally/0.4bpp"); -const u32 gMapObjectPic_Wally_1[] = INCBIN_U32("graphics/map_objects/pics/people/wally/1.4bpp"); -const u32 gMapObjectPic_Wally_2[] = INCBIN_U32("graphics/map_objects/pics/people/wally/2.4bpp"); -const u32 gMapObjectPic_Wally_3[] = INCBIN_U32("graphics/map_objects/pics/people/wally/3.4bpp"); -const u32 gMapObjectPic_Wally_4[] = INCBIN_U32("graphics/map_objects/pics/people/wally/4.4bpp"); -const u32 gMapObjectPic_Wally_5[] = INCBIN_U32("graphics/map_objects/pics/people/wally/5.4bpp"); -const u32 gMapObjectPic_Wally_6[] = INCBIN_U32("graphics/map_objects/pics/people/wally/6.4bpp"); -const u32 gMapObjectPic_Wally_7[] = INCBIN_U32("graphics/map_objects/pics/people/wally/7.4bpp"); -const u32 gMapObjectPic_Wally_8[] = INCBIN_U32("graphics/map_objects/pics/people/wally/8.4bpp"); -const u32 gMapObjectPic_LittleBoy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/0.4bpp"); -const u32 gMapObjectPic_LittleBoy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/1.4bpp"); -const u32 gMapObjectPic_LittleBoy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/2.4bpp"); -const u32 gMapObjectPic_LittleBoy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/3.4bpp"); -const u32 gMapObjectPic_LittleBoy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/4.4bpp"); -const u32 gMapObjectPic_LittleBoy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/5.4bpp"); -const u32 gMapObjectPic_LittleBoy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/6.4bpp"); -const u32 gMapObjectPic_LittleBoy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/7.4bpp"); -const u32 gMapObjectPic_LittleBoy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/8.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/0.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/1.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/2.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/3.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/4.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/5.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/6.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/7.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/8.4bpp"); -const u32 gMapObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/0.4bpp"); -const u32 gMapObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/1.4bpp"); -const u32 gMapObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/2.4bpp"); -const u32 gMapObjectPic_Boy5_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/0.4bpp"); -const u32 gMapObjectPic_Boy5_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/1.4bpp"); -const u32 gMapObjectPic_Boy5_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/2.4bpp"); -const u32 gMapObjectPic_ContestJudge_0[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/0.4bpp"); -const u32 gMapObjectPic_ContestJudge_1[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/1.4bpp"); -const u32 gMapObjectPic_ContestJudge_2[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/2.4bpp"); -const u32 gMapObjectPic_ContestJudge_3[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/3.4bpp"); -const u32 gMapObjectPic_ContestJudge_4[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/4.4bpp"); -const u32 gMapObjectPic_ContestJudge_5[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/5.4bpp"); -const u32 gMapObjectPic_ContestJudge_6[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/6.4bpp"); -const u32 gMapObjectPic_ContestJudge_7[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/7.4bpp"); -const u32 gMapObjectPic_ContestJudge_8[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/8.4bpp"); -const u32 gMapObjectPic_Archie_0[] = INCBIN_U32("graphics/map_objects/pics/people/archie/0.4bpp"); -const u32 gMapObjectPic_Archie_1[] = INCBIN_U32("graphics/map_objects/pics/people/archie/1.4bpp"); -const u32 gMapObjectPic_Archie_2[] = INCBIN_U32("graphics/map_objects/pics/people/archie/2.4bpp"); -const u32 gMapObjectPic_Archie_3[] = INCBIN_U32("graphics/map_objects/pics/people/archie/3.4bpp"); -const u32 gMapObjectPic_Archie_4[] = INCBIN_U32("graphics/map_objects/pics/people/archie/4.4bpp"); -const u32 gMapObjectPic_Archie_5[] = INCBIN_U32("graphics/map_objects/pics/people/archie/5.4bpp"); -const u32 gMapObjectPic_Archie_6[] = INCBIN_U32("graphics/map_objects/pics/people/archie/6.4bpp"); -const u32 gMapObjectPic_Archie_7[] = INCBIN_U32("graphics/map_objects/pics/people/archie/7.4bpp"); -const u32 gMapObjectPic_Archie_8[] = INCBIN_U32("graphics/map_objects/pics/people/archie/8.4bpp"); -const u32 gMapObjectPic_Maxie_0[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/0.4bpp"); -const u32 gMapObjectPic_Maxie_1[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/1.4bpp"); -const u32 gMapObjectPic_Maxie_2[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/2.4bpp"); -const u32 gMapObjectPic_Maxie_3[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/3.4bpp"); -const u32 gMapObjectPic_Maxie_4[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/4.4bpp"); -const u32 gMapObjectPic_Maxie_5[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/5.4bpp"); -const u32 gMapObjectPic_Maxie_6[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/6.4bpp"); -const u32 gMapObjectPic_Maxie_7[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/7.4bpp"); -const u32 gMapObjectPic_Maxie_8[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/8.4bpp"); -const u32 gMapObjectPic_Kyogre_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/0.4bpp"); -const u32 gMapObjectPic_Kyogre_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/1.4bpp"); -const u32 gMapObjectPic_Groudon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/0.4bpp"); -const u32 gMapObjectPic_Groudon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/1.4bpp"); -const u32 gMapObjectPic_Regi[] = INCBIN_U32("graphics/map_objects/pics/pokemon/regi.4bpp"); -const u32 gMapObjectPic_Skitty_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/0.4bpp"); -const u32 gMapObjectPic_Skitty_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/1.4bpp"); -const u32 gMapObjectPic_Skitty_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/2.4bpp"); -const u32 gMapObjectPic_Kecleon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/0.4bpp"); -const u32 gMapObjectPic_Kecleon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/1.4bpp"); -const u32 gMapObjectPic_Kecleon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/2.4bpp"); -const u32 gMapObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/0.4bpp"); -const u32 gMapObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/1.4bpp"); -const u32 gMapObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/0.4bpp"); -const u32 gMapObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/1.4bpp"); -const u32 gMapObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/2.4bpp"); -const u32 gMapObjectPic_Pikachu_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/0.4bpp"); -const u32 gMapObjectPic_Pikachu_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/1.4bpp"); -const u32 gMapObjectPic_Pikachu_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/2.4bpp"); -const u32 gMapObjectPic_Azumarill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/0.4bpp"); -const u32 gMapObjectPic_Azumarill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/1.4bpp"); -const u32 gMapObjectPic_Azumarill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/2.4bpp"); -const u32 gMapObjectPic_Wingull_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/0.4bpp"); -const u32 gMapObjectPic_Wingull_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/3.4bpp"); -const u32 gMapObjectPic_Wingull_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/1.4bpp"); -const u32 gMapObjectPic_Wingull_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/4.4bpp"); -const u32 gMapObjectPic_Wingull_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/2.4bpp"); -const u32 gMapObjectPic_Wingull_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/5.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/0.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/1.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/2.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/3.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/4.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/5.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/6.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/7.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/8.4bpp"); -const u32 gMapObjectPic_Azurill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/0.4bpp"); -const u32 gMapObjectPic_Azurill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/1.4bpp"); -const u32 gMapObjectPic_Azurill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/2.4bpp"); -const u32 gMapObjectPic_Mom_0[] = INCBIN_U32("graphics/map_objects/pics/people/mom/0.4bpp"); -const u32 gMapObjectPic_Mom_1[] = INCBIN_U32("graphics/map_objects/pics/people/mom/1.4bpp"); -const u32 gMapObjectPic_Mom_2[] = INCBIN_U32("graphics/map_objects/pics/people/mom/2.4bpp"); -const u32 gMapObjectPic_Mom_3[] = INCBIN_U32("graphics/map_objects/pics/people/mom/3.4bpp"); -const u32 gMapObjectPic_Mom_4[] = INCBIN_U32("graphics/map_objects/pics/people/mom/4.4bpp"); -const u32 gMapObjectPic_Mom_5[] = INCBIN_U32("graphics/map_objects/pics/people/mom/5.4bpp"); -const u32 gMapObjectPic_Mom_6[] = INCBIN_U32("graphics/map_objects/pics/people/mom/6.4bpp"); -const u32 gMapObjectPic_Mom_7[] = INCBIN_U32("graphics/map_objects/pics/people/mom/7.4bpp"); -const u32 gMapObjectPic_Mom_8[] = INCBIN_U32("graphics/map_objects/pics/people/mom/8.4bpp"); -const u16 gMapObjectPalette22[] = INCBIN_U16("graphics/map_objects/palettes/22.gbapal"); -const u16 gMapObjectPalette23[] = INCBIN_U16("graphics/map_objects/palettes/23.gbapal"); -const u16 gMapObjectPalette24[] = INCBIN_U16("graphics/map_objects/palettes/24.gbapal"); -const u16 gMapObjectPalette25[] = INCBIN_U16("graphics/map_objects/palettes/25.gbapal"); -const u32 gMapObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_natu_doll.4bpp"); -const u32 gMapObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_magnemite_doll.4bpp"); -const u32 gMapObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_squirtle_doll.4bpp"); -const u32 gMapObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_wooper_doll.4bpp"); -const u32 gMapObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_pikachu_doll.4bpp"); -const u32 gMapObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_porygon2_doll.4bpp"); -const u32 gMapObjectPic_PichuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pichu_doll.4bpp"); -const u32 gMapObjectPic_PikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pikachu_doll.4bpp"); -const u32 gMapObjectPic_MarillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/marill_doll.4bpp"); -const u32 gMapObjectPic_TogepiDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/togepi_doll.4bpp"); -const u32 gMapObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/cyndaquil_doll.4bpp"); -const u32 gMapObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/chikorita_doll.4bpp"); -const u32 gMapObjectPic_TotodileDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/totodile_doll.4bpp"); -const u32 gMapObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/jigglypuff_doll.4bpp"); -const u32 gMapObjectPic_MeowthDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/meowth_doll.4bpp"); -const u32 gMapObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/clefairy_doll.4bpp"); -const u32 gMapObjectPic_DittoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/ditto_doll.4bpp"); -const u32 gMapObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/smoochum_doll.4bpp"); -const u32 gMapObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/treecko_doll.4bpp"); -const u32 gMapObjectPic_TorchicDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/torchic_doll.4bpp"); -const u32 gMapObjectPic_MudkipDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/mudkip_doll.4bpp"); -const u32 gMapObjectPic_DuskullDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/duskull_doll.4bpp"); -const u32 gMapObjectPic_WynautDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/wynaut_doll.4bpp"); -const u32 gMapObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/baltoy_doll.4bpp"); -const u32 gMapObjectPic_KecleonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/kecleon_doll.4bpp"); -const u32 gMapObjectPic_AzurillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/azurill_doll.4bpp"); -const u32 gMapObjectPic_SkittyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/skitty_doll.4bpp"); -const u32 gMapObjectPic_SwabluDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/swablu_doll.4bpp"); -const u32 gMapObjectPic_GulpinDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/gulpin_doll.4bpp"); -const u32 gMapObjectPic_LotadDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/lotad_doll.4bpp"); -const u32 gMapObjectPic_SeedotDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/seedot_doll.4bpp"); -const u32 gMapObjectPic_PikaCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/pika_cushion.4bpp"); -const u32 gMapObjectPic_RoundCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/round_cushion.4bpp"); -const u32 gMapObjectPic_KissCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/kiss_cushion.4bpp"); -const u32 gMapObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/zigzag_cushion.4bpp"); -const u32 gMapObjectPic_SpinCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/spin_cushion.4bpp"); -const u32 gMapObjectPic_DiamondCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/diamond_cushion.4bpp"); -const u32 gMapObjectPic_BallCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/ball_cushion.4bpp"); -const u32 gMapObjectPic_GrassCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/grass_cushion.4bpp"); -const u32 gMapObjectPic_FireCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/fire_cushion.4bpp"); -const u32 gMapObjectPic_WaterCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/water_cushion.4bpp"); -const u32 gMapObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_snorlax_doll.4bpp"); -const u32 gMapObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_rhydon_doll.4bpp"); -const u32 gMapObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_lapras_doll.4bpp"); -const u32 gMapObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_venusaur_doll.4bpp"); -const u32 gMapObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_charizard_doll.4bpp"); -const u32 gMapObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_blastoise_doll.4bpp"); -const u32 gMapObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_wailmer_doll.4bpp"); -const u32 gMapObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regirock_doll.4bpp"); -const u32 gMapObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regice_doll.4bpp"); -const u32 gMapObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_registeel_doll.4bpp"); -const u32 gMapObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/0.4bpp"); -const u32 gMapObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/1.4bpp"); -const u32 gMapObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/2.4bpp"); -const u32 gMapObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/3.4bpp"); -const u32 gMapObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/0.4bpp"); -const u32 gMapObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/1.4bpp"); -const u32 gMapObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/2.4bpp"); -const u32 gMapObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/3.4bpp"); -const u32 gMapObjectPic_PushableBoulder[] = INCBIN_U32("graphics/map_objects/pics/misc/pushable_boulder.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/0.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/1.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/2.4bpp"); -const u32 gMapObjectPic_Fossil[] = INCBIN_U32("graphics/map_objects/pics/misc/fossil.4bpp"); -const u32 gMapObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/map_objects/pics/misc/submarine_shadow.4bpp"); -const u16 gMapObjectPalette26[] = INCBIN_U16("graphics/map_objects/palettes/26.gbapal"); -const u32 gMapObjectPic_Truck[] = INCBIN_U32("graphics/map_objects/pics/misc/truck.4bpp"); -const u16 gMapObjectPalette14[] = INCBIN_U16("graphics/map_objects/palettes/14.gbapal"); -const u32 gMapObjectPic_MachokeCarryingBox_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/0.4bpp"); -const u32 gMapObjectPic_MachokeCarryingBox_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/1.4bpp"); -const u32 gMapObjectPic_MachokeCarryingBox_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/2.4bpp"); -const u32 gMapObjectPic_MachokeFacingAway_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/0.4bpp"); -const u32 gMapObjectPic_MachokeFacingAway_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/1.4bpp"); -const u16 gMapObjectPalette15[] = INCBIN_U16("graphics/map_objects/palettes/15.gbapal"); -const u32 gMapObjectPic_BirchsBag[] = INCBIN_U32("graphics/map_objects/pics/misc/birchs_bag.4bpp"); -const u32 gMapObjectPic_Poochyena_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/0.4bpp"); -const u32 gMapObjectPic_Poochyena_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/1.4bpp"); -const u32 gMapObjectPic_Poochyena_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/2.4bpp"); -const u32 gMapObjectPic_Poochyena_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/3.4bpp"); -const u32 gMapObjectPic_Poochyena_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/4.4bpp"); -const u32 gMapObjectPic_Poochyena_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/5.4bpp"); -const u32 gMapObjectPic_Poochyena_6[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/6.4bpp"); -const u32 gMapObjectPic_Poochyena_7[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/7.4bpp"); -const u32 gMapObjectPic_Poochyena_8[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/8.4bpp"); -const u16 gMapObjectPalette16[] = INCBIN_U16("graphics/map_objects/palettes/16.gbapal"); -const u32 gMapObjectPic_CableCar[] = INCBIN_U32("graphics/map_objects/pics/misc/cable_car.4bpp"); -const u16 gMapObjectPalette20[] = INCBIN_U16("graphics/map_objects/palettes/20.gbapal"); -const u32 gMapObjectPic_SSTidal[] = INCBIN_U32("graphics/map_objects/pics/misc/ss_tidal.4bpp"); -const u16 gMapObjectPalette21[] = INCBIN_U16("graphics/map_objects/palettes/21.gbapal"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/0.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/1.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/2.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/3.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/4.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/5.4bpp"); -const u32 gMapObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/dirt_pile.4bpp"); -const u32 gMapObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/0.4bpp"); -const u32 gMapObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/1.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/0.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/1.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/2.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/3.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/4.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/5.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/0.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/1.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/2.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/3.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/4.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/5.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/0.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/1.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/2.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/3.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/4.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/5.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/0.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/1.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/2.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/3.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/4.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/5.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/0.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/1.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/2.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/3.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/4.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/5.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/0.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/1.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/2.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/3.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/4.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/5.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/0.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/1.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/2.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/3.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/4.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/5.4bpp"); -const u32 gMapObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/0.4bpp"); -const u32 gMapObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/1.4bpp"); -const u32 gMapObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/2.4bpp"); -const u32 gMapObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/3.4bpp"); -const u32 gMapObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/4.4bpp"); -const u32 gMapObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/5.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/0.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/1.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/2.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/3.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/4.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/5.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/0.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/1.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/2.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/3.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/4.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/5.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/0.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/1.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/2.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/3.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/4.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/5.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/0.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/1.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/2.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/3.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/4.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/5.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/0.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/1.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/2.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/3.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/4.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/5.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/0.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/1.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/2.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/3.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/4.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/5.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/0.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/1.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/2.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/3.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/4.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/5.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/0.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/1.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/2.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/3.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/4.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/5.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/0.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/1.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/2.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/3.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/4.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/5.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/0.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/1.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/2.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/3.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/4.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/5.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/0.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/1.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/2.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/3.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/4.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/5.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/0.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/1.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/2.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/3.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/4.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/5.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/0.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/1.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/2.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/3.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/4.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/5.4bpp"); -const u32 gMapObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/0.4bpp"); -const u32 gMapObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/1.4bpp"); -const u32 gMapObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/2.4bpp"); -const u32 gMapObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/3.4bpp"); -const u32 gMapObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/4.4bpp"); -const u32 gMapObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/5.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/0.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/1.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/2.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/3.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/4.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/5.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/0.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/1.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/2.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/3.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/4.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/5.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/0.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/1.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/2.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/3.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/4.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/5.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/0.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/1.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/2.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/3.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/4.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/5.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/0.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/1.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/2.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/3.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/4.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/5.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/0.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/1.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/2.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/3.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/4.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/5.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/0.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/1.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/2.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/3.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/4.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/5.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/0.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/1.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/2.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/3.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/4.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/5.4bpp"); -const u32 gFieldEffectPic_SurfBlob_0[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/0.4bpp"); -const u32 gFieldEffectPic_SurfBlob_1[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/1.4bpp"); -const u32 gFieldEffectPic_SurfBlob_2[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/2.4bpp"); -const u32 gMapObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/0.4bpp"); -const u32 gMapObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/1.4bpp"); -const u32 gMapObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/2.4bpp"); -const u32 gMapObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/3.4bpp"); -const u32 gMapObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/4.4bpp"); -const u32 gMapObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/5.4bpp"); -const u32 gMapObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/6.4bpp"); -const u16 gMapObjectPalette12[] = INCBIN_U16("graphics/map_objects/palettes/12.gbapal"); -const u16 gMapObjectPalette13[] = INCBIN_U16("graphics/map_objects/palettes/13.gbapal"); - -const u32 gFieldEffectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_small.4bpp"); -const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_medium.4bpp"); -const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp"); -const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp"); -const u32 filler_8368A08[0x48] = {}; -const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effect_objects/pics/cut_grass.4bpp"); -const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); -const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal"); -const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp"); -const u32 gFieldEffectPic_Ripple_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/1.4bpp"); -const u32 gFieldEffectPic_Ripple_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/2.4bpp"); -const u32 gFieldEffectPic_Ripple_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/3.4bpp"); -const u32 gFieldEffectPic_Ripple_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/4.4bpp"); -const u32 gFieldEffectPic_Ash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/0.4bpp"); -const u32 gFieldEffectPic_Ash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/1.4bpp"); -const u32 gFieldEffectPic_Ash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/2.4bpp"); -const u32 gFieldEffectPic_Ash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/3.4bpp"); -const u32 gFieldEffectPic_Ash_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/4.4bpp"); -const u32 gFieldEffectPic_Arrow_0[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/0.4bpp"); -const u32 gFieldEffectPic_Arrow_1[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/1.4bpp"); -const u32 gFieldEffectPic_Arrow_2[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/2.4bpp"); -const u32 gFieldEffectPic_Arrow_3[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/3.4bpp"); -const u32 gFieldEffectPic_Arrow_4[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/4.4bpp"); -const u32 gFieldEffectPic_Arrow_5[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/5.4bpp"); -const u32 gFieldEffectPic_Arrow_6[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/6.4bpp"); -const u32 gFieldEffectPic_Arrow_7[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/7.4bpp"); -const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effect_objects/palettes/00.gbapal"); -const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effect_objects/palettes/01.gbapal"); -const u32 gFieldEffectPic_Dust_0[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/0.4bpp"); -const u32 gFieldEffectPic_Dust_1[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/1.4bpp"); -const u32 gFieldEffectPic_Dust_2[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/2.4bpp"); -const u32 unknown_8369588[] = INCBIN_U32("graphics/field_effect_objects/unknown.bin"); -const u32 gFieldEffectPic_JumpTallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/0.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/1.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/2.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/3.4bpp"); -const u32 UnusedGrass0[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/0.4bpp"); -const u32 UnusedGrass1[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/1.4bpp"); -const u32 UnusedGrass2[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/2.4bpp"); -const u32 UnusedGrass3[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/3.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/0.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/1.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/2.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/3.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/4.4bpp"); -const u32 UnusedGrassLong[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/unused.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_5[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/5.4bpp"); -const u32 gFieldEffectPic_Unknown17_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/0.4bpp"); -const u32 gFieldEffectPic_Unknown17_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/1.4bpp"); -const u32 gFieldEffectPic_Unknown17_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/2.4bpp"); -const u32 gFieldEffectPic_Unknown17_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/3.4bpp"); -const u32 gFieldEffectPic_Unknown17_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/4.4bpp"); -const u32 gFieldEffectPic_Unknown17_5[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/5.4bpp"); -const u32 gFieldEffectPic_Unknown17_6[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/6.4bpp"); -const u32 gFieldEffectPic_Unknown17_7[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/7.4bpp"); -const u32 gFieldEffectPic_Unknown18_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/0.4bpp"); -const u32 gFieldEffectPic_Unknown18_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/1.4bpp"); -const u32 gFieldEffectPic_Unknown18_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/2.4bpp"); -const u32 gFieldEffectPic_Unknown18_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/3.4bpp"); -const u32 gFieldEffectPic_LongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/0.4bpp"); -const u32 gFieldEffectPic_LongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/1.4bpp"); -const u32 gFieldEffectPic_LongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/2.4bpp"); -const u32 gFieldEffectPic_LongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/3.4bpp"); -const u32 gFieldEffectPic_TallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/0.4bpp"); -const u32 gFieldEffectPic_TallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/1.4bpp"); -const u32 gFieldEffectPic_TallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/2.4bpp"); -const u32 gFieldEffectPic_TallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/3.4bpp"); -const u32 gFieldEffectPic_TallGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/4.4bpp"); -const u32 gFieldEffectPic_ShortGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/0.4bpp"); -const u32 gFieldEffectPic_ShortGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/1.4bpp"); -const u32 gFieldEffectPic_SandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/0.4bpp"); -const u32 gFieldEffectPic_SandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/1.4bpp"); -const u32 gFieldEffectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/0.4bpp"); -const u32 gFieldEffectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/1.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/0.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/1.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/2.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/3.4bpp"); -const u32 gFieldEffectPic_Unknown19_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/0.4bpp"); -const u32 gFieldEffectPic_Unknown19_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/1.4bpp"); -const u32 gFieldEffectPic_Unknown19_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/2.4bpp"); -const u32 gFieldEffectPic_Unknown19_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/3.4bpp"); -const u32 gFieldEffectPic_SandPile_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/0.4bpp"); -const u32 gFieldEffectPic_SandPile_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/1.4bpp"); -const u32 gFieldEffectPic_SandPile_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/2.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/0.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/1.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/2.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/3.4bpp"); -const u32 gFieldEffectPic_Splash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/0.4bpp"); -const u32 gFieldEffectPic_Splash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/1.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/0.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/1.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/2.4bpp"); -const u32 gFieldEffectPic_Unknown20_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/0.4bpp"); -const u32 gFieldEffectPic_Unknown20_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/1.4bpp"); -const u32 gFieldEffectPic_Unknown20_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/2.4bpp"); -const u32 gFieldEffectPic_Unknown20_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/3.4bpp"); -const u32 gFieldEffectPic_Unknown20_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/4.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/0.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/1.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/2.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/3.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/4.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/5.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/6.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/0.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/1.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/2.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/3.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/4.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/5.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/6.4bpp"); -const u32 gFieldEffectPic_SandDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/0.4bpp"); -const u32 gFieldEffectPic_SandDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/1.4bpp"); -const u32 gFieldEffectPic_SandDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/2.4bpp"); -const u32 gFieldEffectPic_SandDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/3.4bpp"); -const u32 gFieldEffectPic_SandDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/4.4bpp"); -const u32 gFieldEffectPic_SandDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/5.4bpp"); -const u32 gFieldEffectPic_SandDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/6.4bpp"); -const u32 gFieldEffectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effect_objects/pics/hot_springs_water.4bpp"); -const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effect_objects/palettes/02.gbapal"); -const u32 gFieldEffectPic_PopOutOfAsh_0[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/0.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_1[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/1.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_2[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/2.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_3[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/3.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_4[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/4.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_0[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/0.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_1[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/1.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_2[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/2.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_3[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/3.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_4[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/4.4bpp"); -const u32 gFieldEffectPic_Bubbles_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/0.4bpp"); -const u32 gFieldEffectPic_Bubbles_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/1.4bpp"); -const u32 gFieldEffectPic_Bubbles_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/2.4bpp"); -const u32 gFieldEffectPic_Bubbles_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/3.4bpp"); -const u32 gFieldEffectPic_Bubbles_4[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/4.4bpp"); -const u32 gFieldEffectPic_Bubbles_5[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/5.4bpp"); -const u32 gFieldEffectPic_Bubbles_6[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/6.4bpp"); -const u32 gFieldEffectPic_Bubbles_7[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/7.4bpp"); -const u32 gFieldEffectPic_Sparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/0.4bpp"); -const u32 gFieldEffectPic_Sparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/1.4bpp"); -const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/field_effect_objects/palettes/03.gbapal"); -const u32 gFieldEffectPic_Bird[] = INCBIN_U32("graphics/field_effect_objects/pics/bird.4bpp"); - -void (*const gUnknown_0836DA88[])(struct Sprite *) = -{ - sub_805C884, - sub_805CDE8, - sub_805C8AC, - sub_805CF28, - sub_805CF28, - sub_805D0AC, - sub_805D0AC, - sub_805D230, - sub_805D230, - sub_805D230, - sub_805D230, - sub_80587B4, - FieldObjectCB_BerryTree, - sub_805D4F4, - sub_805D634, - sub_805D774, - sub_805D8B4, - sub_805D9F4, - sub_805DB34, - sub_805DC74, - sub_805DDB4, - sub_805DEF4, - sub_805E034, - sub_805E174, - sub_805E278, - sub_805E37C, - sub_805E37C, - sub_805E37C, - sub_805E37C, - sub_805E5DC, - sub_805E668, - sub_805E6F4, - sub_805E780, - sub_805E80C, - sub_805E898, - sub_805E924, - sub_805E9B0, - sub_805EA3C, - sub_805EAC8, - sub_805EB54, - sub_805EBE0, - sub_805EC6C, - sub_805ECF8, - sub_805ED84, - sub_805EE10, - sub_805EE9C, - sub_805EF28, - sub_805EFB4, - sub_805F040, - sub_805F0CC, - sub_805F158, - sub_805F1E4, - sub_805F270, - sub_805F2FC, - sub_805F2FC, - sub_805F2FC, - sub_805F2FC, - FieldObjectCB_TreeDisguise, - FieldObjectCB_MountainDisguise, - sub_805F8E0, - sub_805F8E0, - sub_805F8E0, - sub_805F8E0, - FieldObjectCB_Hidden1, - sub_805FB20, - sub_805FB20, - sub_805FB20, - sub_805FB20, - sub_805FB90, - sub_805FB90, - sub_805FB90, - sub_805FB90, - sub_805FC00, - sub_805FC00, - sub_805FC00, - sub_805FC00, - sub_805FC70 -}; - -const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; - -#include "../data/field_map_obj/map_object_graphics_info_pointers.h" -#include "../data/field_map_obj/field_effect_object_template_pointers.h" -#include "../data/field_map_obj/map_object_pic_tables.h" -#include "../data/field_map_obj/map_object_anims.h" -#include "../data/field_map_obj/base_oam.h" -#include "../data/field_map_obj/map_object_subsprites.h" -#include "../data/field_map_obj/map_object_graphics_info.h" - -const struct SpritePalette gUnknown_0837377C[] = { - {gMapObjectPalette0, 0x1103}, - {gMapObjectPalette1, 0x1104}, - {gMapObjectPalette2, 0x1105}, - {gMapObjectPalette3, 0x1106}, - {gMapObjectPalette4, 0x1107}, - {gMapObjectPalette5, 0x1108}, - {gMapObjectPalette6, 0x1109}, - {gMapObjectPalette7, 0x110A}, - {gMapObjectPalette8, 0x1100}, - {gMapObjectPalette9, 0x1101}, - {gMapObjectPalette10, 0x1102}, - {gMapObjectPalette11, 0x1115}, - {gMapObjectPalette12, 0x110B}, - {gMapObjectPalette13, 0x110C}, - {gMapObjectPalette14, 0x110D}, - {gMapObjectPalette15, 0x110E}, - {gMapObjectPalette16, 0x110F}, - {gMapObjectPalette17, 0x1110}, - {gMapObjectPalette18, 0x1111}, - {gMapObjectPalette19, 0x1112}, - {gMapObjectPalette20, 0x1113}, - {gMapObjectPalette21, 0x1114}, - {gMapObjectPalette22, 0x1116}, - {gMapObjectPalette23, 0x1117}, - {gMapObjectPalette24, 0x1118}, - {gMapObjectPalette25, 0x1119}, - {gMapObjectPalette26, 0x111A}, - {NULL, 0x0000} -}; - -const u16 Palettes_837385C[] = { - 0x1101, - 0x1101, - 0x1101, - 0x1101 -}; - -const u16 Palettes_8373864[] = { - 0x1111, - 0x1111, - 0x1111, - 0x1111 -}; - -const u16 Palettes_837386C[] = { - 0x1115, - 0x1115, - 0x1115, - 0x1115 -}; - -const struct PairedPalettes gUnknown_08373874[] = { - {0x1100, Palettes_837385C}, - {0x1110, Palettes_837385C}, - {0x1115, Palettes_837386C}, - {0x11FF, NULL} -}; - -const u16 Palettes_8373894[] = { - 0x110C, - 0x110C, - 0x110C, - 0x110C -}; - -const u16 Palettes_837389C[] = { - 0x110D, - 0x110D, - 0x110D, - 0x110D -}; - -const u16 Palettes_83738A4[] = { - 0x110E, - 0x110E, - 0x110E, - 0x110E -}; - -const u16 Palettes_83738AC[] = { - 0x1112, - 0x1112, - 0x1112, - 0x1112 -}; - -const u16 Palettes_83738B4[] = { - 0x1113, - 0x1113, - 0x1113, - 0x1113 -}; - -const u16 Palettes_83738BC[] = { - 0x1114, - 0x1114, - 0x1114, - 0x1114 -}; - -const u16 Palettes_83738C4[] = { - 0x111A, - 0x111A, - 0x111A, - 0x111A -}; - -const u16 Palettes_83738CC[] = { - 0x1117, - 0x1117, - 0x1117, - 0x1117 -}; - -const u16 Palettes_83738D4[] = { - 0x1119, - 0x1119, - 0x1119, - 0x1119 -}; - -const u16 Palettes_83738DC[] = { - 0x1109, - 0x1109, - 0x1109, - 0x1109 -}; - -const struct PairedPalettes gUnknown_083738E4[] = { - {0x1100, Palettes_837385C}, - {0x1110, Palettes_837385C}, - {0x110B, Palettes_8373894}, - {0x110D, Palettes_837389C}, - {0x110E, Palettes_83738A4}, - {0x1112, Palettes_83738AC}, - {0x1113, Palettes_83738B4}, - {0x1114, Palettes_83738BC}, - {0x1116, Palettes_83738CC}, - {0x1118, Palettes_83738D4}, - {0x1105, Palettes_83738DC}, - {0x111A, Palettes_83738C4}, - {0x11FF, NULL} -}; - -const u16 Unknown_837394C[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373960[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373974[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373988[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 *const gUnknown_0837399C[] = { - Unknown_837394C, - Unknown_8373960, - Unknown_8373974, - Unknown_8373988 -}; - -#include "../data/field_map_obj/berry_tree_graphics_tables.h" -#include "../data/field_map_obj/field_effect_objects.h" - -const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; -const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; -const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; - -#include "../data/field_map_obj/callback_subroutine_pointers.h" - -const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; -const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; -const u8 gUnknown_08375606[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; -const u8 gUnknown_0837560F[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D}; -const u8 gUnknown_08375618[] = {0x10, 0x10, 0x11, 0x12, 0x13, 0x10, 0x10, 0x11, 0x11}; -const u8 gUnknown_08375621[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_0837562A[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_08375633[] = {0x18, 0x18, 0x19, 0x1A, 0x1B, 0x18, 0x18, 0x19, 0x19}; -const u8 gUnknown_0837563C[] = {0x1C, 0x1C, 0x1D, 0x1E, 0x1F, 0x1C, 0x1C, 0x1D, 0x1D}; -const u8 gUnknown_08375645[] = {0x20, 0x20, 0x21, 0x22, 0x23, 0x20, 0x20, 0x21, 0x21}; -const u8 gUnknown_0837564E[] = {0x24, 0x24, 0x25, 0x26, 0x27, 0x24, 0x24, 0x25, 0x25}; -const u8 gUnknown_08375657[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; -const u8 gUnknown_08375660[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; -const u8 gUnknown_08375669[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; -const u8 gUnknown_08375672[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_0837567B[] = {0x08, 0x08, 0x07, 0x09, 0x0A, 0x08, 0x08, 0x07, 0x07}; - -bool8 (*const gUnknown_08375684[])(u8) = { - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsWestBlocked, - MetatileBehavior_IsEastBlocked -}; - -bool8 (*const gUnknown_08375694[])(u8) = { - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsEastBlocked, - MetatileBehavior_IsWestBlocked -}; - -const struct Coords16 gDirectionToVector[] = { - { 0, 0}, - { 0, 1}, - { 0, -1}, - {-1, 0}, - { 1, 0}, - {-1, 1}, - { 1, 1}, - {-1, -1}, - { 1, -1} -}; - -const u8 gUnknown_083756C8[] = {0x00, 0x00, 0x01, 0x02, 0x03}; -const u8 gUnknown_083756CD[] = {0x04, 0x04, 0x05, 0x06, 0x07}; -const u8 gUnknown_083756D2[] = {0x08, 0x08, 0x09, 0x0A, 0x0B}; -const u8 gUnknown_083756D7[] = {0x15, 0x15, 0x16, 0x17, 0x18}; -const u8 gUnknown_083756DC[] = {0x29, 0x29, 0x2A, 0x2B, 0x2C}; -const u8 gUnknown_083756E1[] = {0x2D, 0x2D, 0x2E, 0x2F, 0x30}; -const u8 gUnknown_083756E6[] = {0x31, 0x31, 0x32, 0x33, 0x34}; -const u8 gUnknown_083756EB[] = {0x35, 0x35, 0x36, 0x37, 0x38}; -const u8 gUnknown_083756F0[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F}; -const u8 gUnknown_083756F5[] = {0x46, 0x46, 0x47, 0x48, 0x49}; -const u8 gUnknown_083756FA[] = {0x4B, 0x4B, 0x4A, 0x4D, 0x4C}; -const u8 gUnknown_083756FF[] = {0x42, 0x42, 0x43, 0x44, 0x45}; -const u8 gUnknown_08375704[] = {0x3A, 0x3A, 0x3B, 0x3C, 0x3D}; -const u8 gUnknown_08375709[] = {0x19, 0x19, 0x1A, 0x1B, 0x1C}; -const u8 gUnknown_0837570E[] = {0x1D, 0x1D, 0x1E, 0x1F, 0x20}; -const u8 gUnknown_08375713[] = {0x21, 0x21, 0x22, 0x23, 0x24}; -const u8 gUnknown_08375718[] = {0x25, 0x25, 0x26, 0x27, 0x28}; -const u8 gUnknown_0837571D[] = {0x62, 0x62, 0x63, 0x64, 0x65}; -const u8 gUnknown_08375722[] = {0x66, 0x66, 0x67, 0x68, 0x69}; -const u8 gUnknown_08375727[] = {0x6A, 0x6A, 0x6B, 0x6C, 0x6D}; -const u8 gUnknown_0837572C[] = {0x6E, 0x6E, 0x6F, 0x70, 0x71}; -const u8 gUnknown_08375731[] = {0x72, 0x72, 0x73, 0x74, 0x75}; -const u8 gUnknown_08375736[] = {0x76, 0x76, 0x77, 0x78, 0x79}; -const u8 gUnknown_0837573B[] = {0x7A, 0x7A, 0x7B, 0x7C, 0x7D}; -const u8 gUnknown_08375740[] = {0x7E, 0x7E, 0x7F, 0x80, 0x81}; -const u8 gUnknown_08375745[] = {0x82, 0x82, 0x83, 0x84, 0x85}; -const u8 gUnknown_0837574A[] = {0x86, 0x86, 0x87, 0x88, 0x89}; - -const u8 gUnknown_0837574F[] = {2, 1, 4, 3, 8, 7, 6, 5}; - -const u8 gUnknown_08375757[][4] = { - {2, 1, 4, 3}, - {1, 2, 3, 4}, - {3, 4, 2, 1}, - {4, 3, 1, 2} -}; - -const u8 gUnknown_08375767[][4] = { - {2, 1, 4, 3}, - {1, 2, 3, 4}, - {4, 3, 1, 2}, - {3, 4, 2, 1} -}; - -#include "../data/field_map_obj/anim_func_ptrs.h" - -// text - -extern void strange_npc_table_clear(void); -extern void ClearPlayerAvatarInfo(void); -extern void npc_load_two_palettes__no_record(u16, u8); -extern void npc_load_two_palettes__and_record(u16, u8); -extern void sub_8060388(s16, s16, s16 *, s16 *); -void sub_80634D0(struct MapObject *, struct Sprite *); -extern void pal_patch_for_npc(u16, u16); -extern void CameraObjectReset1(void); - -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; -extern u8 gReservedSpritePaletteCount; -extern struct Camera gCamera; - -static u8 gUnknown_030005A4; -static u16 gUnknown_030005A6; - -struct MapObject gMapObjects[16]; -#if DEBUG -u8 gUnknown_Debug_03004BC0[4]; // unknown type -#endif - -void npc_clear_ids_and_state(struct MapObject *mapObj) -{ - memset(mapObj, 0, sizeof(struct MapObject)); - mapObj->localId = 0xFF; - mapObj->mapNum = 0xFF; - mapObj->mapGroup = 0xFF; - mapObj->mapobj_unk_1C = 0xFF; -} - -#if DEBUG -__attribute__((naked)) -void npcs_clear_ids_and_state() -{ - asm( - " push {r4, r5, lr}\n" - " mov r4, #0x0\n" - " ldr r5, ._2 @ gMapObjects\n" - "._1:\n" - " lsl r0, r4, #0x3\n" - " add r0, r0, r4\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r5\n" - " bl npc_clear_ids_and_state\n" - " add r0, r4, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r4, r0, #0x18\n" - " cmp r4, #0xf\n" - " bls ._1 @cond_branch\n" - " ldr r1, ._2 + 4 @ gUnknown_Debug_03004BC0\n" - " mov r0, #0x0\n" - " strb r0, [r1]\n" - " pop {r4, r5}\n" - " pop {r0}\n" - " bx r0\n" - "._3:\n" - " .align 2, 0\n" - "._2:\n" - " .word gMapObjects\n" - " .word gUnknown_Debug_03004BC0\n" - "\n" - ); -} -#else -void npcs_clear_ids_and_state(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - npc_clear_ids_and_state(&gMapObjects[i]); -} -#endif - -void sub_805AA98(void) -{ - strange_npc_table_clear(); - npcs_clear_ids_and_state(); - ClearPlayerAvatarInfo(); - sub_805AAB0(); -} - -void sub_805AAB0(void) -{ - u8 spriteId; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); - - gSprites[spriteId].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 0); - gSprites[spriteId].invisible = 1; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); - - gSprites[spriteId].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 1); - gSprites[spriteId].invisible = 1; -} - -u8 sub_805AB54(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (!gMapObjects[i].active) - break; - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - if (localId <= 0xFE) - return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); - else - return GetFieldObjectIdByLocalId(localId); -} - -bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId) -{ - *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); - if (*mapObjectId == 16) - return TRUE; - else - return FALSE; -} - -u8 GetFieldObjectIdByXY(s16 x, s16 y) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) - break; - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) - return i; - } - return 16; -} - -u8 GetFieldObjectIdByLocalId(u8 localId) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId) - return i; - } - return 16; -} - -#if DEBUG -__attribute__((naked)) -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " add r5, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r6, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r7, r2, #0x18\n" - " ldrb r0, [r5]\n" - " add r1, r6, #0\n" - " add r2, r7, #0\n" - " mov r3, sp\n" - " bl GetAvailableFieldObjectSlot\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._35 @cond_branch\n" - " mov r0, #0x10\n" - " b ._36\n" - "._35:\n" - " mov r0, sp\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._40 @ gMapObjects\n" - " add r4, r0, r1\n" - " add r0, r4, #0\n" - " bl npc_clear_ids_and_state\n" - " ldrh r3, [r5, #0x4]\n" - " add r3, r3, #0x7\n" - " lsl r3, r3, #0x10\n" - " lsr r3, r3, #0x10\n" - " ldrh r2, [r5, #0x6]\n" - " add r2, r2, #0x7\n" - " lsl r2, r2, #0x10\n" - " lsr r2, r2, #0x10\n" - " ldrb r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " mov r1, #0x4\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - " ldrb r0, [r5, #0x1]\n" - " strb r0, [r4, #0x5]\n" - " ldrb r0, [r5, #0x9]\n" - " strb r0, [r4, #0x6]\n" - " ldrb r0, [r5]\n" - " strb r0, [r4, #0x8]\n" - " strb r6, [r4, #0x9]\n" - " strb r7, [r4, #0xa]\n" - " strh r3, [r4, #0xc]\n" - " strh r2, [r4, #0xe]\n" - " strh r3, [r4, #0x10]\n" - " strh r2, [r4, #0x12]\n" - " strh r3, [r4, #0x14]\n" - " strh r2, [r4, #0x16]\n" - " ldrb r0, [r5, #0x8]\n" - " mov r7, #0xf\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " ldrb r2, [r4, #0xb]\n" - " mov r0, #0x10\n" - " neg r0, r0\n" - " mov r8, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0xb]\n" - " ldrb r1, [r5, #0x8]\n" - " lsl r1, r1, #0x4\n" - " and r0, r0, r7\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0xb]\n" - " ldrb r1, [r5, #0xa]\n" - " lsl r1, r1, #0x1c\n" - " mov r0, #0xf\n" - " mov r9, r0\n" - " lsr r1, r1, #0x1c\n" - " ldrb r2, [r4, #0x19]\n" - " mov r0, r8\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - " ldrb r1, [r5, #0xa]\n" - " lsr r1, r1, #0x4\n" - " lsl r1, r1, #0x4\n" - " and r0, r0, r7\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - " ldrh r0, [r5, #0xc]\n" - " strb r0, [r4, #0x7]\n" - " ldrh r0, [r5, #0xe]\n" - " strb r0, [r4, #0x1d]\n" - " ldr r1, ._40 + 4 @ gUnknown_0836DC09\n" - " ldrb r0, [r5, #0x9]\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " add r0, r4, #0\n" - " add r0, r0, #0x20\n" - " strb r1, [r0]\n" - " ldrb r1, [r0]\n" - " add r0, r4, #0\n" - " bl FieldObjectSetDirection\n" - " add r0, r4, #0\n" - " bl FieldObjectHandleDynamicGraphicsId\n" - " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n" - " ldrb r0, [r4, #0x6]\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._39 @cond_branch\n" - " ldrb r2, [r4, #0x19]\n" - " add r0, r7, #0\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._38 @cond_branch\n" - " lsl r0, r2, #0x1c\n" - " lsr r0, r0, #0x1c\n" - " add r0, r0, #0x1\n" - " mov r1, r9\n" - " and r0, r0, r1\n" - " mov r1, r8\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strb r1, [r4, #0x19]\n" - "._38:\n" - " ldrb r2, [r4, #0x19]\n" - " mov r0, #0xf0\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._39 @cond_branch\n" - " lsr r1, r2, #0x4\n" - " add r1, r1, #0x1\n" - " lsl r1, r1, #0x4\n" - " add r0, r7, #0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - "._39:\n" - " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, sp\n" - " ldrb r0, [r0]\n" - "._36:\n" - " add sp, sp, #0x4\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._41:\n" - " .align 2, 0\n" - "._40:\n" - " .word gMapObjects\n" - " .word gUnknown_0836DC09\n" - " .word gUnknown_0836DBBC\n" - " .word gUnknown_Debug_03004BC0\n" - "\n" - ); -} -#else -#ifdef NONMATCHING -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness - u8 var; - u16 r3; - u16 r2; - - //asm("nop"::"r"(b)); - if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) - return 16; - //_0805ACCE - mapObj = &gMapObjects[var]; - npc_clear_ids_and_state(mapObj); - r3 = template->x + 7; - r2 = template->y + 7; - mapObj->active = TRUE; - mapObj->mapobj_bit_2 = TRUE; - mapObj->graphicsId = template->graphicsId; - mapObj->animPattern = template->movementType; - mapObj->localId = template->localId; - mapObj->mapNum = b; - mapObj->mapGroup = c; - mapObj->coords1.x = r3; - mapObj->coords1.y = r2; - mapObj->coords2.x = r3; - mapObj->coords2.y = r2; - mapObj->coords3.x = r3; - mapObj->coords3.y = r2; - mapObj->mapobj_unk_0B_0 = template->elevation; - mapObj->elevation = template->elevation; - mapObj->range.as_nybbles.x = template->unkA_0; - mapObj->range.as_nybbles.y = template->unkA_4; - mapObj->trainerType = template->unkC; - mapObj->trainerRange_berryTreeId = template->unkE; - mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; - FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); - FieldObjectHandleDynamicGraphicsId(mapObj); - //asm("":::"r5","r6"); - if (gUnknown_0836DBBC[mapObj->animPattern] != 0) - { - if (mapObj->range.as_nybbles.x == 0) - mapObj->range.as_nybbles.x++; - if (mapObj->range.as_nybbles.y == 0) - mapObj->range.as_nybbles.y++; - } - return var; -} -#else -__attribute__((naked)) -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r6, r1, 24\n\ - lsls r2, 24\n\ - lsrs r7, r2, 24\n\ - ldrb r0, [r5]\n\ - adds r1, r6, 0\n\ - adds r2, r7, 0\n\ - mov r3, sp\n\ - bl GetAvailableFieldObjectSlot\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0805ACCE\n\ - movs r0, 0x10\n\ - b _0805ADC2\n\ -_0805ACCE:\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 3\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0805ADD0 @ =gMapObjects\n\ - adds r4, r0, r1\n\ - adds r0, r4, 0\n\ - bl npc_clear_ids_and_state\n\ - ldrh r3, [r5, 0x4]\n\ - adds r3, 0x7\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - ldrh r2, [r5, 0x6]\n\ - adds r2, 0x7\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - ldrb r0, [r4]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r4]\n\ - ldrb r0, [r5, 0x1]\n\ - strb r0, [r4, 0x5]\n\ - ldrb r0, [r5, 0x9]\n\ - strb r0, [r4, 0x6]\n\ - ldrb r0, [r5]\n\ - strb r0, [r4, 0x8]\n\ - strb r6, [r4, 0x9]\n\ - strb r7, [r4, 0xA]\n\ - strh r3, [r4, 0xC]\n\ - strh r2, [r4, 0xE]\n\ - strh r3, [r4, 0x10]\n\ - strh r2, [r4, 0x12]\n\ - strh r3, [r4, 0x14]\n\ - strh r2, [r4, 0x16]\n\ - ldrb r0, [r5, 0x8]\n\ - movs r7, 0xF\n\ - adds r1, r7, 0\n\ - ands r1, r0\n\ - ldrb r2, [r4, 0xB]\n\ - movs r0, 0x10\n\ - negs r0, r0\n\ - mov r8, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0x8]\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0xA]\n\ - lsls r1, 28\n\ - movs r0, 0xF\n\ - mov r9, r0\n\ - lsrs r1, 28\n\ - ldrb r2, [r4, 0x19]\n\ - mov r0, r8\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrb r1, [r5, 0xA]\n\ - lsrs r1, 4\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrh r0, [r5, 0xC]\n\ - strb r0, [r4, 0x7]\n\ - ldrh r0, [r5, 0xE]\n\ - strb r0, [r4, 0x1D]\n\ - ldr r1, _0805ADD4 @ =gUnknown_0836DC09\n\ - ldrb r0, [r5, 0x9]\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - strb r1, [r0]\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - bl FieldObjectSetDirection\n\ - adds r0, r4, 0\n\ - bl FieldObjectHandleDynamicGraphicsId\n\ - ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\ - ldrb r0, [r4, 0x6]\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _0805ADBE\n\ - ldrb r2, [r4, 0x19]\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADA6\n\ - lsls r0, r2, 28\n\ - lsrs r0, 28\n\ - adds r0, 0x1\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r8\n\ - ands r1, r2\n\ - orrs r1, r0\n\ - strb r1, [r4, 0x19]\n\ -_0805ADA6:\n\ - ldrb r2, [r4, 0x19]\n\ - movs r0, 0xF0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADBE\n\ - lsrs r1, r2, 4\n\ - adds r1, 0x1\n\ - lsls r1, 4\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ -_0805ADBE:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ -_0805ADC2:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0805ADD0: .4byte gMapObjects\n\ -_0805ADD4: .4byte gUnknown_0836DC09\n\ -_0805ADD8: .4byte gUnknown_0836DBBC\n\ - .syntax divided\n"); -} -#endif -#endif - -u8 sub_805ADDC(u8 localId) -{ - u8 objectCount; - u8 i; - - if (gMapHeader.events == NULL) - return 16; - objectCount = gMapHeader.events->mapObjectCount; - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; - - if (template->localId == localId && !FlagGet(template->flagId)) - return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - } - return 16; -} - -u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) -{ - u8 i = 0; - - for (i = 0; i < 16 && gMapObjects[i].active; i++) - { - if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) - return 1; - } - if (i >= 16) - return 1; - *d = i; - for (; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) - return 1; - } - return 0; -} - -#if DEBUG -__attribute__((naked)) -void RemoveFieldObject(struct MapObject *mapObject) -{ - asm( - " push {lr}\n" - " ldrb r2, [r0]\n" - " mov r1, #0x2\n" - " neg r1, r1\n" - " and r1, r1, r2\n" - " strb r1, [r0]\n" - " bl RemoveFieldObjectInternal\n" - " ldr r1, ._72 @ gUnknown_Debug_03004BC0\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " pop {r0}\n" - " bx r0\n" - "._73:\n" - " .align 2, 0\n" - "._72:\n" - " .word gUnknown_Debug_03004BC0\n" - "\n" - ); -} -#else -void RemoveFieldObject(struct MapObject *mapObject) -{ - mapObject->active = FALSE; - RemoveFieldObjectInternal(mapObject); -} -#endif - -void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return; - FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId)); - RemoveFieldObject(&gMapObjects[mapObjectId]); -} - -void RemoveFieldObjectInternal(struct MapObject *mapObject) -{ - struct SpriteFrameImage image; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - - image.size = gfxInfo->size; - gSprites[mapObject->spriteId].images = ℑ - DestroySprite(&gSprites[mapObject->spriteId]); -} - -void npc_hide_all_but_player(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (i != gPlayerAvatar.mapObjectId) - RemoveFieldObject(&gMapObjects[i]); - } -} - -#if DEBUG -__attribute__((naked)) -u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add r7, r1, #0\n" - " add r1, r2, #0\n" - " add r2, r3, #0\n" - " ldr r3, [sp, #0x20]\n" - " ldr r4, [sp, #0x24]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " lsl r3, r3, #0x10\n" - " lsr r3, r3, #0x10\n" - " mov r9, r3\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " mov sl, r4\n" - " bl InitFieldObjectStateFromTemplate\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - " cmp r0, #0x10\n" - " bne ._83 @cond_branch\n" - " mov r0, #0x10\n" - " b ._92\n" - "._83:\n" - " mov r0, r8\n" - " lsl r4, r0, #0x3\n" - " add r0, r4, r0\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._87 @ gMapObjects\n" - " add r5, r0, r1\n" - " ldrb r0, [r5, #0x5]\n" - " bl GetFieldObjectGraphicsInfo\n" - " add r6, r0, #0\n" - " ldrb r1, [r6, #0xc]\n" - " mov r0, #0xf\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._85 @cond_branch\n" - " ldrh r0, [r6, #0x2]\n" - " lsl r1, r1, #0x1c\n" - " lsr r1, r1, #0x1c\n" - " bl npc_load_two_palettes__no_record\n" - " b ._89\n" - "._88:\n" - " .align 2, 0\n" - "._87:\n" - " .word gMapObjects\n" - "._85:\n" - " cmp r0, #0xa\n" - " bne ._89 @cond_branch\n" - " ldrh r0, [r6, #0x2]\n" - " lsl r1, r1, #0x1c\n" - " lsr r1, r1, #0x1c\n" - " bl npc_load_two_palettes__and_record\n" - "._89:\n" - " ldrb r0, [r5, #0x6]\n" - " cmp r0, #0x4c\n" - " bne ._90 @cond_branch\n" - " ldrb r0, [r5, #0x1]\n" - " mov r1, #0x20\n" - " orr r0, r0, r1\n" - " strb r0, [r5, #0x1]\n" - "._90:\n" - " ldr r1, ._93 @ 0xffff\n" - " add r0, r1, #0\n" - " strh r0, [r7, #0x2]\n" - " add r0, r7, #0\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r7, #0x40\n" - " bne ._91 @cond_branch\n" - " ldr r1, ._93 + 4 @ gUnknown_Debug_03004BC0\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r0, ._93 + 8 @ gMapObjects\n" - " mov r2, r8\n" - " add r1, r4, r2\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r0\n" - " ldrb r2, [r1]\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " strb r0, [r1]\n" - " mov r0, #0x10\n" - " b ._92\n" - "._94:\n" - " .align 2, 0\n" - "._93:\n" - " .word 0xffff\n" - " .word gUnknown_Debug_03004BC0\n" - " .word gMapObjects\n" - "._91:\n" - " lsl r0, r7, #0x4\n" - " add r0, r0, r7\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._96 @ gSprites\n" - " add r4, r0, r1\n" - " mov r1, r9\n" - " lsl r0, r1, #0x10\n" - " asr r0, r0, #0x10\n" - " ldrh r2, [r5, #0x10]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x10\n" - " mov r2, sl\n" - " lsl r1, r2, #0x10\n" - " asr r1, r1, #0x10\n" - " ldrh r2, [r5, #0x12]\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " add r2, r4, #0\n" - " add r2, r2, #0x20\n" - " add r3, r4, #0\n" - " add r3, r3, #0x22\n" - " bl sub_8060388\n" - " ldrh r0, [r6, #0x8]\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x11\n" - " neg r0, r0\n" - " add r1, r4, #0\n" - " add r1, r1, #0x28\n" - " strb r0, [r1]\n" - " ldrh r0, [r6, #0xa]\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x11\n" - " neg r0, r0\n" - " add r2, r4, #0\n" - " add r2, r2, #0x29\n" - " strb r0, [r2]\n" - " ldrh r0, [r4, #0x20]\n" - " add r0, r0, #0x8\n" - " strh r0, [r4, #0x20]\n" - " ldrh r1, [r4, #0x22]\n" - " add r1, r1, #0x10\n" - " mov r0, #0x0\n" - " ldsb r0, [r2, r0]\n" - " add r0, r0, r1\n" - " strh r0, [r4, #0x22]\n" - " ldrb r1, [r6, #0xc]\n" - " lsl r1, r1, #0x1c\n" - " lsr r1, r1, #0x18\n" - " ldrb r2, [r4, #0x5]\n" - " mov r0, #0xf\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x5]\n" - " add r2, r4, #0\n" - " add r2, r2, #0x3e\n" - " ldrb r0, [r2]\n" - " mov r1, #0x2\n" - " orr r0, r0, r1\n" - " strb r0, [r2]\n" - " mov r0, r8\n" - " strh r0, [r4, #0x2e]\n" - " strb r7, [r5, #0x4]\n" - " ldrb r1, [r6, #0xc]\n" - " lsl r1, r1, #0x19\n" - " lsr r1, r1, #0x1f\n" - " lsl r1, r1, #0x4\n" - " ldrb r2, [r5, #0x1]\n" - " mov r0, #0x11\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r5, #0x1]\n" - " lsl r0, r0, #0x1b\n" - " cmp r0, #0\n" - " blt ._95 @cond_branch\n" - " ldrb r0, [r5, #0x18]\n" - " lsl r0, r0, #0x1c\n" - " lsr r0, r0, #0x1c\n" - " bl FieldObjectDirectionToImageAnimId\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " bl StartSpriteAnim\n" - "._95:\n" - " ldrb r0, [r5, #0xb]\n" - " lsr r0, r0, #0x4\n" - " add r1, r4, #0\n" - " mov r2, #0x1\n" - " bl SetObjectSubpriorityByZCoord\n" - " add r0, r5, #0\n" - " add r1, r4, #0\n" - " bl sub_80634D0\n" - " mov r0, r8\n" - "._92:\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._97:\n" - " .align 2, 0\n" - "._96:\n" - " .word gSprites\n" - "\n" - ); -} -#else -u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) -{ - u8 mapObjectId; - u8 spriteId; - const struct MapObjectGraphicsInfo *gfxInfo; - struct MapObject *mapObject; - struct Sprite *sprite; - - mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d); - if (mapObjectId == 16) - return 16; - - mapObject = &gMapObjects[mapObjectId]; - gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (gfxInfo->paletteSlot == 0) - npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - else if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (mapObject->animPattern == 0x4C) - mapObject->mapobj_bit_13 = TRUE; - -#ifdef NONMATCHING - sprTemplate->paletteTag = 0xFFFF; -#else - *(u16 *)&sprTemplate->paletteTag = 0xFFFF; -#endif - spriteId = CreateSprite(sprTemplate, 0, 0, 0); - if (spriteId == 64) - { - gMapObjects[mapObjectId].active = FALSE; - return 16; - } - sprite = &gSprites[spriteId]; - sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = mapObjectId; - mapObject->spriteId = spriteId; - mapObject->mapobj_bit_12 = gfxInfo->inanimate; - if (!mapObject->mapobj_bit_12) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - sub_80634D0(mapObject, sprite); - return mapObjectId; -} -#endif - -u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) -{ - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables = NULL; - struct SpriteFrameImage spriteFrameImage; - const struct MapObjectGraphicsInfo *gfxInfo; - u8 mapObjectId; - - gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId); - MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = gfxInfo->size; - spriteTemplate.images = &spriteFrameImage; - mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e); - if (mapObjectId == 16) - return 16; - gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images; - if (subspriteTables != NULL) - SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); - return mapObjectId; -} - -u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate) -{ - s16 x; - s16 y; - - GetFieldObjectMovingCameraOffset(&x, &y); - return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); -} - -u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f) -{ - struct MapObjectTemplate mapObjTemplate; - - d -= 7; - e -= 7; - mapObjTemplate.localId = c; - mapObjTemplate.graphicsId = a; - mapObjTemplate.unk2 = 0; - mapObjTemplate.x = d; - mapObjTemplate.y = e; - mapObjTemplate.elevation = f; - mapObjTemplate.movementType = b; - mapObjTemplate.unkA_0 = 0; - mapObjTemplate.unkA_4 = 0; - mapObjTemplate.unkC = 0; - mapObjTemplate.unkE = 0; - return SpawnSpecialFieldObject(&mapObjTemplate); -} - -u8 show_sprite(u8 a, u8 b, u8 c) -{ - struct MapObjectTemplate *r5; - s16 x; - s16 y; - - r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c); - if (r5 == NULL) - return 16; - GetFieldObjectMovingCameraOffset(&x, &y); - return SpawnFieldObject(r5, b, c, x, y); -} - -void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - - sprTemplate->tileTag = gfxInfo->tileTag; - sprTemplate->paletteTag = gfxInfo->paletteTag1; - sprTemplate->oam = gfxInfo->oam; - sprTemplate->anims = gfxInfo->anims; - sprTemplate->images = gfxInfo->images; - sprTemplate->affineAnims = gfxInfo->affineAnims; - sprTemplate->callback = callback; - *subspriteTables = gfxInfo->subspriteTables; -} - -void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables); -} - -void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); -} - -u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); - if (spriteTemplate.paletteTag != 0xFFFF) - sub_805BDF8(spriteTemplate.paletteTag); - spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); - if (spriteId != 64 && subspriteTables != NULL) - { - SetSubspriteTables(&gSprites[spriteId], subspriteTables); - gSprites[spriteId].subspriteMode = 2; - } - return spriteId; -} - -extern void sub_8064970(struct Sprite *); -extern void sub_8060470(s16 *, s16 *, s16, s16); -void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z); - -u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) -{ - const struct MapObjectGraphicsInfo *gfxInfo; - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - - gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8064970, &spriteTemplate, &subspriteTables); -#ifdef NONMATCHING - spriteTemplate.paletteTag = 0xFFFF; -#else - *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; -#endif - x += 7; - y += 7; - sub_8060470(&x, &y, 8, 16); - spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); - if (spriteId != 64) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.y += sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = b; - sprite->data[1] = elevation; - if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (subspriteTables != NULL) - { - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = 2; - } - InitObjectPriorityByZCoord(sprite, elevation); - SetObjectSubpriorityByZCoord(elevation, sprite, 1); - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); - } - return spriteId; -} - -void sub_805B55C(s16 a, s16 b) -{ - u8 i; - - if (gMapHeader.events != NULL) - { - s16 r9 = gSaveBlock1.pos.x - 2; - s16 sp8 = gSaveBlock1.pos.x + 17; - s16 r10 = gSaveBlock1.pos.y; - s16 spC = gSaveBlock1.pos.y + 16; - u8 objectCount = gMapHeader.events->mapObjectCount; - - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; - s16 foo = template->x + 7; - s16 bar = template->y + 7; - - if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo - && !FlagGet(template->flagId)) - SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b); - } - } -} - -void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject); - -void RemoveFieldObjectsOutsideView(void) -{ - u8 i; - u8 j; - - for (i = 0; i < 16; i++) - { - bool8 isActiveLinkPlayer; - - for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) - { - if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) - isActiveLinkPlayer = TRUE; - } - if (!isActiveLinkPlayer) - { - struct MapObject *mapObject = &gMapObjects[i]; - - if (mapObject->active && !mapObject->mapobj_bit_16) - RemoveFieldObjectIfOutsideView(mapObject); - } - } -} - -void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) -{ - s16 r7 = gSaveBlock1.pos.x - 2; - s16 r5 = gSaveBlock1.pos.x + 17; - s16 r4 = gSaveBlock1.pos.y; - s16 r6 = gSaveBlock1.pos.y + 16; - - if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5 - && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6) - return; - if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5 - && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6) - return; - RemoveFieldObject(mapObject); -} - -void sub_805B75C(u8, s16, s16); - -#if DEBUG -__attribute__((naked)) -void sub_805B710(u16 u161, u16 u162) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add r4, r0, #0\n" - " add r5, r1, #0\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " lsl r5, r5, #0x10\n" - " lsr r5, r5, #0x10\n" - " ldr r6, ._153 @ gUnknown_Debug_03004BC0\n" - " mov r0, #0x0\n" - " strb r0, [r6]\n" - " bl ClearPlayerAvatarInfo\n" - " mov r7, #0x0\n" - " ldr r0, ._153 + 4 @ gMapObjects\n" - " mov r8, r0\n" - " lsl r4, r4, #0x10\n" - " lsl r5, r5, #0x10\n" - "._152:\n" - " lsl r0, r7, #0x3\n" - " add r0, r0, r7\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r8\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x1f\n" - " cmp r0, #0\n" - " beq ._151 @cond_branch\n" - " add r0, r7, #0\n" - " asr r1, r4, #0x10\n" - " asr r2, r5, #0x10\n" - " bl sub_805B75C\n" - " ldrb r0, [r6]\n" - " add r0, r0, #0x1\n" - " strb r0, [r6]\n" - "._151:\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r7, #0xf\n" - " bls ._152 @cond_branch\n" - " bl sub_805AAB0\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._154:\n" - " .align 2, 0\n" - "._153:\n" - " .word gUnknown_Debug_03004BC0\n" - " .word gMapObjects\n" - "\n" - ); -} -#else -void sub_805B710(u16 a, u16 b) -{ - u8 i; - - ClearPlayerAvatarInfo(); - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active) - sub_805B75C(i, a, b); - } - sub_805AAB0(); -} -#endif - -extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); -extern void sub_805B914(struct MapObject *); - -void sub_805B75C(u8 a, s16 b, s16 c) -{ - struct SpriteTemplate sp0; - struct SpriteFrameImage sp18; - const struct SubspriteTable *subspriteTables; - const struct MapObjectGraphicsInfo *gfxInfo; - struct MapObject *mapObject; - u8 spriteId; - - #define i spriteId - for (i = 0; i < 4; i++) - { - if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId) - return; - } - #undef i - - mapObject = &gMapObjects[a]; - asm("":::"r5"); - subspriteTables = NULL; - gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - sp18.size = gfxInfo->size; - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables); - sp0.images = &sp18; - *(u16 *)&sp0.paletteTag = 0xFFFF; - if (gfxInfo->paletteSlot == 0) - npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (gfxInfo->paletteSlot > 9) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - *(u16 *)&sp0.paletteTag = 0xFFFF; - spriteId = CreateSprite(&sp0, 0, 0, 0); - if (spriteId != 64) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->images = gfxInfo->images; - if (mapObject->animPattern == 11) - { - SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId); - mapObject->mapobj_unk_1B = sub_8126B54(); - } - if (subspriteTables != NULL) - SetSubspriteTables(sprite, subspriteTables); - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = a; - mapObject->spriteId = spriteId; - if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - sub_805B914(mapObject); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - } -} - -void sub_805B914(struct MapObject *mapObject) -{ - mapObject->mapobj_bit_1 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - mapObject->mapobj_bit_22 = FALSE; - mapObject->mapobj_bit_17 = FALSE; - mapObject->mapobj_bit_18 = FALSE; - mapObject->mapobj_bit_19 = FALSE; - mapObject->mapobj_bit_20 = FALSE; - mapObject->mapobj_bit_21 = FALSE; - FieldObjectClearAnim(mapObject); -} - -void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) -{ - gPlayerAvatar.mapObjectId = mapObjectId; - gPlayerAvatar.spriteId = spriteId; - gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); - SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); -} - -void sub_805B980(struct MapObject *mapObject, u8 graphicsId) -{ - const struct MapObjectGraphicsInfo *gfxInfo; - struct Sprite *sprite; - - gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - sprite = &gSprites[mapObject->spriteId]; - if (gfxInfo->paletteSlot == 0) - pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - sprite->oam.shape = gfxInfo->oam->shape; - sprite->oam.size = gfxInfo->oam->size; - sprite->images = gfxInfo->images; - sprite->anims = gfxInfo->anims; - sprite->subspriteTables = gfxInfo->subspriteTables; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - mapObject->mapobj_bit_12 = gfxInfo->inanimate; - mapObject->graphicsId = graphicsId; - sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - if (mapObject->mapobj_bit_15) - CameraObjectReset1(); -} - -void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - sub_805B980(&gMapObjects[mapObjectId], graphicsId); -} - -void FieldObjectTurn(struct MapObject *mapObject, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - if (!mapObject->mapobj_bit_12) - { - StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); - } -} - -void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - FieldObjectTurn(&gMapObjects[mapObjectId], direction); -} - -void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction) -{ - FieldObjectTurn(&gMapObjects[player->mapObjectId], direction); -} - -void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 treeStage; - u8 treeId; - - mapObject->mapobj_bit_13 = TRUE; - sprite->invisible = TRUE; - treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (treeStage != 0) - { - mapObject->mapobj_bit_13 = FALSE; - sprite->invisible = FALSE; - treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; - treeStage--; - if (treeId > 0x2B) - treeId = 0; - sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]); - sprite->images = gBerryTreePicTablePointers[treeId]; - sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage]; - StartSpriteAnim(sprite, treeStage); - } -} - -const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) -{ - if (graphicsId > 0xEF) - graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16); - if (graphicsId > 0xD9) - graphicsId = 5; - return gMapObjectGraphicsInfoPointers[graphicsId]; -} - -void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) -{ - if (mapObject->graphicsId > 0xEF) - mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16); -} - -void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - gMapObjects[mapObjectId].mapobj_bit_13 = d; -} - -void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) -{ - *(u8 *)localId = mapObject->localId; - *(u8 *)mapNum = mapObject->mapNum; - *(u8 *)mapGroup = mapObject->mapGroup; -} - -void sub_805BCC0(s16 x, s16 y) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - mapObjectId = GetFieldObjectIdByXY(x, y); - if (mapObjectId != 16) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) -{ - u8 mapObjectId; - struct MapObject *mapObject; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - mapObject->mapobj_bit_26 = TRUE; - sprite->subpriority = subpriority; - } -} - -void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_26 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; - sprite->pos2.x = x; - sprite->pos2.y = y; - } -} - -void gpu_pal_allocator_reset__manage_upper_four(void) -{ - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 12; -} - -void sub_805BDF8(u16 tag) -{ - u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag); - - if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8 - sub_805BE58(&gUnknown_0837377C[paletteIndex]); -} - -void unref_sub_805BE24(u16 *arr) -{ - u8 i; - - for (i = 0; arr[i] != 0x11FF; i++) - sub_805BDF8(arr[i]); -} - -u8 sub_805BE58(const struct SpritePalette *palette) -{ - if (IndexOfSpritePaletteTag(palette->tag) != 0xFF) - return 0xFF; - else - return LoadSpritePalette(palette); -} - -void pal_patch_for_npc(u16 a, u16 b) -{ - u8 var = b; - u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a); - - LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20); -} - -void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c) -{ - for (; b < c; arr++, b++) - pal_patch_for_npc(*arr, b); -} - -u8 FindFieldObjectPaletteIndexByTag(u16 tag) -{ - u8 i; - - for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++) - { - if (gUnknown_0837377C[i].tag == tag) - return i; - } - return 0xFF; -} - -void npc_load_two_palettes__no_record(u16 a, u8 b) -{ - u8 i; - - pal_patch_for_npc(a, b); - for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++) - { - if (gUnknown_08373874[i].tag == a) - { - pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); - break; - } - } -} - -void npc_load_two_palettes__and_record(u16 a, u8 b) -{ - u8 i; - - gUnknown_030005A6 = a; - pal_patch_for_npc(a, b); - for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) - { - if (gUnknown_083738E4[i].tag == a) - { - pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); - break; - } - } -} - -void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x += x; - mapObject->coords2.y += y; -} - -void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = x; - mapObject->coords3.y = y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void sub_805C058(struct MapObject *mapObject, s16 x, s16 y) -{ - struct Sprite *sprite = &gSprites[mapObject->spriteId]; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - - npc_coords_set(mapObject, x, y); - sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sub_805B914(mapObject); - if (mapObject->mapobj_bit_15) - CameraObjectReset1(); -} - -void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - x += 7; - y += 7; - sub_805C058(&gMapObjects[mapObjectId], x, y); - } -} - -void npc_coords_shift_still(struct MapObject *mapObject) -{ - npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); -} - -void UpdateFieldObjectCoordsForCameraUpdate(void) -{ - u8 i; - s16 deltaX; - s16 deltaY; - - if (gCamera.field_0) - { - deltaX = gCamera.x; - deltaY = gCamera.y; - for (i = 0; i < 16; i++) - { - - if (gMapObjects[i].active) - { - gMapObjects[i].coords1.x -= deltaX; - gMapObjects[i].coords1.y -= deltaY; - gMapObjects[i].coords2.x -= deltaX; - gMapObjects[i].coords2.y -= deltaY; - gMapObjects[i].coords3.x -= deltaX; - gMapObjects[i].coords3.y -= deltaY; - } - } - } -} - -bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); - -u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y - && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) - return i; - } - return 16; -} - -bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) -{ - if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 - && mapObject->mapobj_unk_0B_0 != z) - return FALSE; - else - return TRUE; -} - -void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) -{ - UpdateFieldObjectCoordsForCameraUpdate(); - sub_805B55C(x, y); - RemoveFieldObjectsOutsideView(); -} - -u8 AddCameraObject(u8 a) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4); - - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[0] = a; - return spriteId; -} - -void ObjectCB_CameraObject(struct Sprite *sprite) -{ - void (*cameraObjectFuncs[3])(struct Sprite *); - memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs); - cameraObjectFuncs[sprite->data[1]](sprite); -} - -void CameraObject_0(struct Sprite *sprite) -{ - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; - sprite->invisible = TRUE; - sprite->data[1] = 1; - CameraObject_1(sprite); -} - -void CameraObject_1(struct Sprite *sprite) -{ - s16 x = gSprites[sprite->data[0]].pos1.x; - s16 y = gSprites[sprite->data[0]].pos1.y; - - sprite->data[2] = x - sprite->pos1.x; - sprite->data[3] = y - sprite->pos1.y; - sprite->pos1.x = x; - sprite->pos1.y = y; -} - -void CameraObject_2(struct Sprite *sprite) -{ - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; - sprite->data[2] = 0; - sprite->data[3] = 0; -} - -struct Sprite *FindCameraObject(void) -{ - u8 i; - - for (i = 0; i < 64; i++) - { - if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) - return &gSprites[i]; - } - return NULL; -} - -void CameraObjectReset1(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite != NULL) - { - cameraSprite->data[1] = 0; - cameraSprite->callback(cameraSprite); - } -} - -void CameraObjectSetFollowedObjectId(u8 spriteId) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite != NULL) - { - cameraSprite->data[0] = spriteId; - CameraObjectReset1(); - } -} - -u8 CameraObjectGetFollowedObjectId(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite == NULL) - return 64; - else - return cameraSprite->data[0]; -} - -void CameraObjectReset2(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - cameraSprite->data[1] = 2; -} - -u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < 64; i++) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *src; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - break; - } - } - return i; -} - -u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority) -{ - s16 i; - - for (i = 63; i > -1; i--) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *src; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - return i; - } - } - return 64; -} - -void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) -{ - mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; - if (!mapObject->mapobj_bit_9) - { - s8 _direction = direction; //needed for the asm to match - mapObject->mapobj_unk_18 = _direction; - } - mapObject->placeholder18 = direction; -} - -u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - - return template->script; -} - -u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - - return template->flagId; -} - -u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return 0xFF; - else - return gMapObjects[mapObjectId].trainerType; -} - -u8 unref_sub_805C60C(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerType; -} - -u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return 0xFF; - else - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -u8 FieldObjectGetBerryTreeId(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8); - -struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup) - return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount); - else - { - struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); - - return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount); - } -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) -{ - u8 i; - - for (i = 0; i < count; i++) - { - if (templates[i].localId == localId) - return &templates[i]; - } - return NULL; -} - -struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject) -{ - s32 i; - - if (mapObject->mapNum != gSaveBlock1.location.mapNum - || mapObject->mapGroup != gSaveBlock1.location.mapGroup) - return NULL; - - for (i = 0; i < 64; i++) - { - if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId) - return &gSaveBlock1.mapObjectTemplates[i]; - } - return NULL; -} - -void sub_805C754(struct MapObject *mapObject) -{ - struct MapObjectTemplate *template = sub_805C700(mapObject); - - if (template != NULL) - { - template->x = mapObject->coords2.x - 7; - template->y = mapObject->coords2.y - 7; - } -} - -void sub_805C774(struct MapObject *mapObject, u8 movementType) -{ - struct MapObjectTemplate *template = sub_805C700(mapObject); - - if (template != NULL) - template->movementType = movementType; -} - -void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - sub_805C754(&gMapObjects[mapObjectId]); -} - -void sub_805C7C4(u8 a) -{ - gpu_pal_allocator_reset__manage_upper_four(); - gUnknown_030005A6 = 0x11FF; - gUnknown_030005A4 = a; - pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10); -} - -u16 npc_paltag_by_palslot(u8 a) -{ - u8 i; - - if (a < 10) - return gUnknown_0837399C[gUnknown_030005A4][a]; - - for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) - { - if (gUnknown_083738E4[i].tag == gUnknown_030005A6) - { - return gUnknown_083738E4[i].data[gUnknown_030005A4]; - } - } - return 0x11FF; -} - -fieldmap_object_null_cb(sub_805C884, sub_805C8A8); -fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224); - -u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); - -u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); -void sub_8064820(struct Sprite *, s16); - -u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -extern u8 sub_8064824(struct Sprite *); - -u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -extern u8 sub_805FF20(struct MapObject *, u8); - -u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - direction = directions[Random() & 3]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) -{ - s16 x; - s16 y; - s16 objx; - s16 objy; - s16 minx; - s16 maxx; - s16 miny; - s16 maxy; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0) - { - return 0; - } - if (mapObject->trainerType != 1 && mapObject->trainerType != 3) - { - return 0; - } - PlayerGetDestCoords(&x, &y); - objx = mapObject->coords2.x; - objy = mapObject->coords2.y; - minx = objx - mapObject->trainerRange_berryTreeId; - miny = objy - mapObject->trainerRange_berryTreeId; - maxx = objx + mapObject->trainerRange_berryTreeId; - maxy = objy + mapObject->trainerRange_berryTreeId; - if (minx > x || maxx < x || miny > y || maxy < y) - { - return 0; - } - return 1; -} - -u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - if (a2 > a3) - { - dirn = DIR_EAST; - if (a0 < 0) - { - dirn = DIR_WEST; - } - } - else - { - dirn = DIR_SOUTH; - if (a1 < 0) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = DIR_SOUTH; - if (a1 < 0) - { - dirn = DIR_NORTH; - } - return dirn; -} - -u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = DIR_EAST; - if (a0 < 0) - { - dirn = DIR_WEST; - } - return dirn; -} - -u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = DIR_NORTH; - } - } - else if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = DIR_NORTH; - } - } - else if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = DIR_SOUTH; - } - } - else if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = DIR_SOUTH; - } - } - return dirn; -} - -u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) { - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = DIR_SOUTH; - } - } - else if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = DIR_SOUTH; - } - } - return dirn; -} - -u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CD60(struct MapObject *mapObject, u8 a1) -{ - s16 x; - s16 y; - s16 x2; - s16 y2; - if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - return 0; - } - PlayerGetDestCoords(&x, &y); - x -= mapObject->coords2.x; - y -= mapObject->coords2.y; - x2 = x; - y2 = y; - if (x2 < 0) - { - x2 = -x2; - } - if (y2 < 0) - { - y2 = -y2; - } - return gUnknown_08375244[a1](x, y, x2, y2); -} - -fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270); - -u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284); - -u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752A0, 2); - direction = directions[Random() & 1]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4); - -u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752C0, 2); - direction = directions[Random() & 1]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4); - -u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - sprite->data[1] = 2; - return 1; - } - return 0; -} - -u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - return 0; -} - -u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite); - -void FieldObjectCB_BerryTree(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (!(sprite->data[7] & 1)) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data[7] |= 1; - } - meta_step(mapObject, sprite, sub_805D314); -} - -u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_083752D0[sprite->data[1]](mapObject, sprite); -} - -u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 berryTreeStage; - npc_reset(mapObject, sprite); - mapObject->mapobj_bit_13 = 1; - sprite->invisible = 1; - berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (!berryTreeStage) - { - if (!(sprite->data[7] & 4) && sprite->animNum == 4) - { - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - sprite->animNum = 0; - } - return 0; - } - mapObject->mapobj_bit_13 = 0; - sprite->invisible = 0; - berryTreeStage--; - if (sprite->animNum != berryTreeStage) - { - sprite->data[1] = 2; - return 1; - } - get_berry_tree_graphics(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, 0x39); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 0; - return 1; - } - return 0; -} - -u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 3; - sprite->data[2] = 0; - sprite->data[7] |= 2; - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - return 1; -} - -u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[2]++; - mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); - sprite->animPaused = 1; - if (sprite->data[2] > 64) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data[1] = 4; - sprite->data[2] = 0; - return 1; - } - return 0; -} - -u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[2]++; - mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); - sprite->animPaused = 1; - if (sprite->data[2] > 64) - { - sprite->data[1] = 0; - sprite->data[7] &= (-3); - return 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4); - -u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752A0, 2); - direction = sub_805CD60(mapObject, 1); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8); - -u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752C0, 2); - direction = sub_805CD60(mapObject, 2); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C); - -u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375320, 2); - direction = sub_805CD60(mapObject, 3); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324); - -u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375338, 2); - direction = sub_805CD60(mapObject, 4); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C); - -u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375350, 2); - direction = sub_805CD60(mapObject, 5); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354); - -u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375368, 2); - direction = sub_805CD60(mapObject, 6); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C); - -u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375380, 4); - direction = sub_805CD60(mapObject, 7); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384); - -u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375398, 4); - direction = sub_805CD60(mapObject, 8); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C); - -u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_083753B0, 4); - direction = sub_805CD60(mapObject, 9); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4); - -u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_083753C8, 4); - direction = sub_805CD60(mapObject, 10); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC); - -u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, 0x30); - sprite->data[1] = 2; - } - return 0; -} - -u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gUnknown_083753DC, 5); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 0; - return 1; -} - -fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4); - -u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, 0x30); - sprite->data[1] = 2; - } - return 0; -} - -u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gUnknown_083753F4, 5); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 0; - return 1; -} - -fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC); - -u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - direction = gUnknown_0836DC09[mapObject->animPattern]; - if (mapObject->mapobj_unk_21 != 0) - { - direction = GetOppositeDirection(direction); - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 v0; - u8 goSpeed0AnimId; - if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - } - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - if (v0 == 1) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - } - if (v0 != 0) - { - goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 3; - return 1; -} - -u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence) -{ - u8 v0; - u8 goSpeed0AnimId; - if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - } - FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - if (v0 == 1) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - } - if (v0 != 0) - { - goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C); - -u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375418, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C); - -u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375428, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C); - -u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375438, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C); - -u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375448, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - - - -fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C); - -u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375458, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C); - -u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375468, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C); - -u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478); - -u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375484, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488); - -u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375494, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498); - -u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754A4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8); - -u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754B4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8); - -u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754C4, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8); - -u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754D4, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8); - -u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754E4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8); - -u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754F4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8); - -u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375504, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508); - -u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375514, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518); - -u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375524, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528); - -u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375534, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538); - -u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375544, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548); - -u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375554, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558); - -u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375564, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568); - -u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375574, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578); - -u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375584, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -}; - -fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588); - -u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - if (mapObject->mapobj_unk_21 == 0) - { - mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); - } - sprite->data[1] = 1; - return 1; -} - -u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - { - return 0; - } - return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); -} - -u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -bool8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - return 0; -} - -bool8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2))); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -bool8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = a2; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -bool8 sub_805F4F0(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_8060744(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F5A8(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_806079C(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F660(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_80607C8(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectSetRegularAnim(mapObject, sprite, sub_806084C(direction)); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F760(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_80608A4(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - x = mapObject->coords2.x; - y = mapObject->coords2.y; - sub_8060320(direction, &x, &y, 2, 2); - FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); - -u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - { - return 0; - } - return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); -} - -u8 sub_805F9F8(struct MapObject *, struct Sprite *); - -void FieldObjectCB_TreeDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) - { - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); - mapObject->mapobj_unk_21 = 1; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); -} - -u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return 0; -} - -void FieldObjectCB_MountainDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) - { - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); - mapObject->mapobj_unk_21 = 1; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); -} - -u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite); - -void FieldObjectCB_Hidden1(struct Sprite *sprite) -{ - if (sprite->data[7] == 0) - { - gMapObjects[sprite->data[0]].mapobj_bit_26 = 1; - sprite->subspriteMode = 2; - sprite->oam.priority = 3; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805FAD8); -} - -u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_083755CC[sprite->data[1]](mapObject, sprite); -} - -u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return 0; -} - -u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 0; - } - return 0; -} - -fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0); - -u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8); - -u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0); - -u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8); - -u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - mapObject->mapobj_bit_13 = 1; - sprite->data[1] = 1; - return 1; -} - -u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 2; - return 1; - } - return 0; -} - -u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - return 0; -} - -void sub_805FC70(struct Sprite *sprite); - -void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - mapObject->mapobj_bit_6 = 0; - mapObject->mapobj_bit_7 = 0; - mapObject->mapobj_unk_1C = 0xff; - sprite->data[1] = 0; -} - -u8 FieldObjectDirectionToImageAnimId(u8 direction) -{ - return gUnknown_083755F4[direction]; -} - -u8 get_go_image_anim_num(u8 direction) -{ - return gUnknown_083755FD[direction]; -} - -u8 get_go_fast_image_anim_num(u8 direction) -{ - return gUnknown_08375606[direction]; -} - -u8 get_go_faster_image_anim_num(u8 direction) -{ - return gUnknown_0837560F[direction]; -} - -u8 sub_805FD78(u8 direction) -{ - return gUnknown_08375618[direction]; -} - -u8 sub_805FD88(u8 direction) -{ - return gUnknown_08375621[direction]; -} - -u8 sub_805FD98(u8 direction) -{ - return gUnknown_0837562A[direction]; -} - -u8 unref_sub_805FDA8(u8 direction) -{ - return gUnknown_08375633[direction]; -} - -u8 sub_805FDB8(u8 direction) -{ - return gUnknown_0837563C[direction]; -} - -u8 sub_805FDC8(u8 direction) -{ - return gUnknown_08375645[direction]; -} - -u8 sub_805FDD8(u8 direction) -{ - return gUnknown_0837564E[direction]; -} - -u8 sub_805FDE8(u8 direction) -{ - return gUnknown_08375657[direction]; -} - -u8 sub_805FDF8(u8 direction) -{ - return gUnknown_08375660[direction]; -} - -u8 sub_805FE08(u8 direction) -{ - return gUnknown_08375669[direction]; -} - -u8 get_run_image_anim_num(u8 direction) -{ - return gUnknown_08375672[direction]; -} - -void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - if (sprite->animCmdIndex == 1) - { - sprite->animCmdIndex = 2; - } else if (sprite->animCmdIndex == 3) - { - sprite->animCmdIndex = 0; - } - SeekSpriteAnim(sprite, sprite->animCmdIndex); - } -} - -void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - u8 animCmdIndex; - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - animCmdIndex = 3; - if (sprite->animCmdIndex < 2) - { - animCmdIndex = 1; - } - SeekSpriteAnim(sprite, animCmdIndex); - } -} - -u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3) -{ - if (a0 > a2) - { - return DIR_WEST; - } else if (a0 < a2) - { - return DIR_EAST; - } else if (a1 > a3) - { - return DIR_NORTH; - } else - { - return DIR_SOUTH; - } -} - -void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) -{ - mapObject->animPattern = animPattern; - mapObject->mapobj_unk_21 = 0; - mapObject->animId = 0; - gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern]; - gSprites[mapObject->spriteId].data[1] = 0; -} - -u8 npc_running_behaviour_by_direction(u8 direction) -{ - return gUnknown_0837567B[direction]; -} - -u8 sub_805FF20(struct MapObject *mapObject, u8 direction) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - MoveCoords(direction, &x, &y); - return npc_block_way(mapObject, x, y, direction); -} - -bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y); -static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y); -bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); - -u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) -{ - u8 direction; - direction = dirn; - if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) - return 1; - else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) - return 2; - else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) - return 2; - else if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - return 3; - else if (DoesObjectCollideWithObjectAt(mapObject, x, y)) - return 4; - return 0; -} - -u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - u8 flags = 0; - - if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) - flags |= 1; - if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) - flags |= 2; - if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - flags |= 4; - if (DoesObjectCollideWithObjectAt(mapObject, x, y)) - flags |= 8; - return flags; -} - -bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y) -{ - s16 minv; - s16 maxv; - - if (mapObject->range.as_nybbles.x != 0) - { - minv = mapObject->coords1.x - (mapObject->range.as_nybbles.x); - maxv = mapObject->coords1.x + (mapObject->range.as_nybbles.x); - if (minv > x || maxv < x) - return TRUE; - } - if (mapObject->range.as_nybbles.y != 0) - { - minv = mapObject->coords1.y - (mapObject->range.as_nybbles.y); - maxv = mapObject->coords1.y + (mapObject->range.as_nybbles.y); - if (minv > y || maxv < y) - return TRUE; - } - return FALSE; -} - -bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) - { - return 1; - } - return 0; -} - -static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - struct MapObject *mapObject2 = &gMapObjects[i]; - - if (mapObject2->active && mapObject2 != mapObject) - { - if (((mapObject2->coords2.x == x && mapObject2->coords2.y == y) || (mapObject2->coords3.x == x && mapObject2->coords3.y == y)) - && AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0)) - return TRUE; - } - } - return 0; -} - -// this function is only used in berry.c, but its unknown whether its intended context is the berry tree check or if its checking for the flickering. -bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - if (gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 2) - return TRUE; - - return FALSE; -} - -void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 4; - } -} - -void MoveCoords(u8 direction, s16 *x, s16 *y) -{ - *x += gDirectionToVector[direction].x; - *y += gDirectionToVector[direction].y; -} - -void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) -{ - *x += gDirectionToVector[direction].x << 4; - *y += gDirectionToVector[direction].y << 4; -} - -void sub_8060320(u32 dirn, s16 *x, s16 *y, s16 deltaX, s16 deltaY) -{ - u8 direction = dirn; - s16 dx2 = deltaX; - s16 dy2 = deltaY; - if (gDirectionToVector[direction].x > 0) - { - *x += dx2; - } - if (gDirectionToVector[direction].x < 0) - { - *x -= dx2; - } - if (gDirectionToVector[direction].y > 0) - { - *y += dy2; - } - if (gDirectionToVector[direction].y < 0) - { - *y -= dy2; - } -} - -void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2) -{ - *x2 = (x1 - gSaveBlock1.pos.x) << 4; - *y2 = (y1 - gSaveBlock1.pos.y) << 4; - *x2 -= gUnknown_0300489C; - *y2 -= gUnknown_03004898; -} - -void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2) -{ - s16 x3; - s16 y3; - x3 = -gUnknown_0300489C - gUnknown_03004880.unk10; - y3 = -gUnknown_03004898 - gUnknown_03004880.unk14; - if (gUnknown_03004880.unk10 > 0) - { - x3 += 0x10; - } - if (gUnknown_03004880.unk10 < 0) - { - x3 -= 0x10; - } - if (gUnknown_03004880.unk14 > 0) - { - y3 += 0x10; - } - if (gUnknown_03004880.unk14 < 0) - { - y3 -= 0x10; - } - *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3; - *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3; -} - -void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy) -{ - sub_80603CC(*x, *y, x, y); - *x += dx; - *y += dy; -} - -void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) -{ - *x = 0; - *y = 0; - if (gUnknown_03004880.unk10 > 0) - { - (*x)++; - } - if (gUnknown_03004880.unk10 < 0) - { - (*x)--; - } - if (gUnknown_03004880.unk14 > 0) - { - (*y)++; - } - if (gUnknown_03004880.unk14 < 0) - { - (*y)--; - } -} - -void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 direction, s16 *x, s16 *y) -{ - u8 newDirn = direction; - *x = mapObject->coords2.x; - *y = mapObject->coords2.y; - MoveCoords(newDirn, x, y); -} - -bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) - { - return TRUE; - } - UnfreezeMapObject(mapObject); - mapObject->mapobj_unk_1C = specialAnimId; - mapObject->mapobj_bit_6 = 1; - mapObject->mapobj_bit_7 = 0; - gSprites[mapObject->spriteId].data[2] = 0; - return FALSE; -} - -void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - FieldObjectSetSpecialAnim(mapObject, specialAnimId); -} - -void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - FieldObjectClearAnim(mapObject); - } -} - -void FieldObjectClearAnim(struct MapObject *mapObject) -{ - mapObject->mapobj_unk_1C = 0xFF; - mapObject->mapobj_bit_6 = 0; - mapObject->mapobj_bit_7 = 0; - gSprites[mapObject->spriteId].data[1] = 0; - gSprites[mapObject->spriteId].data[2] = 0; -} - -bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - return mapObject->mapobj_bit_7; - return 0x10; -} - -bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) -{ - u8 specialAnimStatus; - specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); - if (specialAnimStatus != 0 && specialAnimStatus != 0x10) - { - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - } - return specialAnimStatus; -} - -u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - return mapObject->mapobj_unk_1C; - } - return 0xFF; -} - -extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite); -extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite); -extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite); -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite); -void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite); - -void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *)) -{ - DoGroundEffects_OnSpawn(mapObject, sprite); - sub_80634A0(mapObject, sprite); - if (FieldObjectIsSpecialAnimActive(mapObject)) - { - FieldObjectExecSpecialAnim(mapObject, sprite); - } else - { - if (!mapObject->mapobj_bit_8) - { - while (callback(mapObject, sprite)); - } - } - DoGroundEffects_OnBeginStep(mapObject, sprite); - DoGroundEffects_OnFinishStep(mapObject, sprite); - npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); - sub_80634D0(mapObject, sprite); - FieldObjectUpdateSubpriority(mapObject, sprite); -} - -#define dirn_to_anim(name, table)\ -u8 name(u32 idx)\ -{\ - u8 direction;\ - u8 animIds[sizeof(table)];\ - direction = idx;\ - memcpy(animIds, (table), sizeof(table));\ - if (direction > DIR_EAST) direction = 0;\ - return animIds[direction];\ -} - -dirn_to_anim(GetFaceDirectionAnimId, gUnknown_083756C8) -dirn_to_anim(GetSimpleGoAnimId, gUnknown_083756CD) -dirn_to_anim(GetGoSpeed0AnimId, gUnknown_083756D2) -dirn_to_anim(sub_8060744, gUnknown_083756D7) -dirn_to_anim(d2s_08064034, gUnknown_083756DC) -dirn_to_anim(sub_806079C, gUnknown_083756E1) -dirn_to_anim(sub_80607C8, gUnknown_083756E6) -dirn_to_anim(sub_80607F4, gUnknown_083756EB) -dirn_to_anim(GetJumpLedgeAnimId, gUnknown_083756F0) -dirn_to_anim(sub_806084C, gUnknown_083756F5) -dirn_to_anim(sub_8060878, gUnknown_083756FA) -dirn_to_anim(sub_80608A4, gUnknown_083756FF) -dirn_to_anim(sub_80608D0, gUnknown_08375704) -dirn_to_anim(GetStepInPlaceDelay32AnimId, gUnknown_08375709) -dirn_to_anim(GetStepInPlaceDelay16AnimId, gUnknown_0837570E) -dirn_to_anim(GetStepInPlaceDelay8AnimId, gUnknown_08375713) -dirn_to_anim(GetStepInPlaceDelay4AnimId, gUnknown_08375718) - -u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) -{ - return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); -} - -u8 sub_80609D8(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837571D, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A04(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375722, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A30(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375727, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A5C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837572C, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A88(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375731, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060AB4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375736, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060AE0(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837573B, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B0C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375740, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B38(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375745, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B64(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837574A, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetOppositeDirection(u8 direction) -{ - u8 directions[8]; - memcpy(directions, gUnknown_0837574F, 8); - if (direction == 0 || direction > 8) - { - return direction; - } - return directions[direction - 1]; -} - -u32 zffu_offset_calc(u8 a0, u8 a1) -{ - return gUnknown_08375757[a0 - 1][a1 - 1]; -} - -u32 state_to_direction(u8 a0, u32 a1, u32 a2) -{ - u32 zffuOffset; - u8 a1_2 = a1; - u8 a2_2 = a2; - if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) - { - return 0; - } - zffuOffset = zffu_offset_calc(a1_2, a2); - return gUnknown_08375767[a0 - 1][zffuOffset - 1]; -} - -void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) - { - mapObject->mapobj_bit_7 = 1; - } -} - -bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) - { - mapObject->mapobj_unk_1C = 0xFF; - sprite->data[2] = 0; - return 1; - } - return 0; -} - -void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) -{ - mapObject->mapobj_unk_1C = animId; - sprite->data[2] = 0; -} - -void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - sprite->animPaused = 1; - sprite->data[2] = 1; -} - -u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_SOUTH); - return 1; -} - -u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_NORTH); - return 1; -} - -u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_WEST); - return 1; -} - -u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_EAST); - return 1; -} - -void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - oamt_npc_ministep_reset(sprite, direction, a3); - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - sprite->data[2] = 1; -} - -extern u8 (*const gUnknown_083759C0[5])(u8); - -void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - u8 (*const functions[5])(u8); - memcpy((void *)functions, gUnknown_083759C0, sizeof(gUnknown_083759C0)); - sub_8060D20(mapObject, sprite, direction, a3); - sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18)); -} - -void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8060D20(mapObject, sprite, direction, 1); - sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 obj_npc_ministep(struct Sprite *); - -bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (obj_npc_ministep(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - sprite->animPaused = 1; - return 1; - } - return 0; -} - -void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - sub_806467C(sprite, direction); - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - sprite->data[2] = 1; -} - -void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8060E68(mapObject, sprite, direction); - sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_806468C(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - sprite->animPaused = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060F5C(struct MapObject *, struct Sprite *); - -bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - return sub_8060F5C(mapObject, sprite); -} - -bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060F9C(struct MapObject *, struct Sprite *); - -bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_NORTH); - return sub_8060F9C(mapObject, sprite); -} - -bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060FDC(struct MapObject *, struct Sprite *); - -bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_WEST); - return sub_8060FDC(mapObject, sprite); -} - -bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806101C(struct MapObject *, struct Sprite *); - -bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_EAST); - return sub_806101C(mapObject, sprite); -} - -bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806105C(struct MapObject *, struct Sprite *); - -bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 0); - return sub_806105C(mapObject, sprite); -} - -bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806109C(struct MapObject *, struct Sprite *); - -bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 0); - return sub_806109C(mapObject, sprite); -} - -bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80610DC(struct MapObject *, struct Sprite *); - -bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 0); - return sub_80610DC(mapObject, sprite); -} - -bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806111C(struct MapObject *, struct Sprite *); - -bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 0); - return sub_806111C(mapObject, sprite); -} - -bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) -{ - s16 vSPp4[3]; - s16 x; - s16 y; - memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34); - x = 0; - y = 0; - FieldObjectSetDirection(mapObject, direction); - sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - sub_80646E4(sprite, direction, a4, a5); - sprite->data[2] = 1; - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; -} - -void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) -{ - sub_806113C(mapObject, sprite, direction, a4, a5); - sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - DoShadowFieldEffect(mapObject); -} - -u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *)) -{ - s16 vSPp4[3]; - s16 x; - s16 y; - u8 retval; - memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A); - retval = callback(sprite); - if (retval == 1 && vSPp4[sprite->data[4]] != 0) - { - x = 0; - y = 0; - sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data[4]], vSPp4[sprite->data[4]]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; - } else if (retval == 0xff) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - mapObject->mapobj_bit_5 = 1; - sprite->animPaused = 1; - } - return retval; -} - -u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_806123C(mapObject, sprite, sub_8064704); -} - -u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_806123C(mapObject, sprite, sub_806478C); -} - -bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061300(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061314(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 retval; - - retval = sub_8061300(mapObject, sprite); - if (retval != 1) - { - if (retval == 0xFF) - { - return TRUE; - } - return FALSE; - } - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - return FALSE; -} - -bool8 sub_80613D4(struct MapObject *, struct Sprite *); -bool8 sub_806142C(struct MapObject *, struct Sprite *); -bool8 sub_8061484(struct MapObject *, struct Sprite *); -bool8 sub_80614DC(struct MapObject *, struct Sprite *); - -bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0); - return sub_80613D4(mapObject, sprite); -} - -bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0); - return sub_806142C(mapObject, sprite); -} - -bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0); - return sub_8061484(mapObject, sprite); -} - -bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0); - return sub_80614DC(mapObject, sprite); -} - -bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8061508(struct Sprite *sprite, u16 duration) -{ - sprite->data[2] = 1; - sprite->data[3] = duration; -} - -bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[3]--; - if (!sprite->data[3]) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 1); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 2); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 4); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 8); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 16); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 1); - return sub_80615EC(mapObject, sprite); -} - -bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 1); - return sub_806162C(mapObject, sprite); -} - -bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 1); - return sub_806166C(mapObject, sprite); -} - -bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 1); - return sub_80616AC(mapObject, sprite); -} - -bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration) -{ - FieldObjectSetDirection(mapObject, direction); - sub_805FE28(mapObject, sprite, animId); - sprite->animPaused = 0; - sprite->data[2] = 1; - sprite->data[3] = duration; -} - -bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[3]--; - if (sprite->data[3] == 0) - { - sprite->data[2] = 2; - sprite->animPaused = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sprite->data[3] & 1) - { - sprite->animDelayCounter++; - } - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061B18(struct MapObject *, struct Sprite *); - -bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 2); - return sub_8061B18(mapObject, sprite); -} - -bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061B58(struct MapObject *, struct Sprite *); - -bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 2); - return sub_8061B58(mapObject, sprite); -} - -bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061B98(struct MapObject *, struct Sprite *); - -bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 2); - return sub_8061B98(mapObject, sprite); -} - -bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061BD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 2); - return sub_8061BD8(mapObject, sprite); -} - -bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061C18(struct MapObject *, struct Sprite *); - -bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 3); - return sub_8061C18(mapObject, sprite); -} - -bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061C58(struct MapObject *, struct Sprite *); - -bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 3); - return sub_8061C58(mapObject, sprite); -} - -bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061C98(struct MapObject *, struct Sprite *); - -bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 3); - return sub_8061C98(mapObject, sprite); -} - -bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061CD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 3); - return sub_8061CD8(mapObject, sprite); -} - -bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061D18(struct MapObject *, struct Sprite *); - -bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 4); - return sub_8061D18(mapObject, sprite); -} - -bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061D58(struct MapObject *, struct Sprite *); - -bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 4); - return sub_8061D58(mapObject, sprite); -} - -bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061D98(struct MapObject *, struct Sprite *); - -bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 4); - return sub_8061D98(mapObject, sprite); -} - -bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061DD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 4); - return sub_8061DD8(mapObject, sprite); -} - -bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E18(struct MapObject *, struct Sprite *); - -bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_SOUTH); - return sub_8061E18(mapObject, sprite); -} - -bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E58(struct MapObject *, struct Sprite *); - -bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_NORTH); - return sub_8061E58(mapObject, sprite); -} - -bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E98(struct MapObject *, struct Sprite *); - -bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_WEST); - return sub_8061E98(mapObject, sprite); -} - -bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061ED8(struct MapObject *, struct Sprite *); - -bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_EAST); - return sub_8061ED8(mapObject, sprite); -} - -bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) -{ - obj_anim_image_set_and_seek(sprite, animNum, 0); - FieldObjectSetDirection(mapObject, direction); - sprite->data[2] = 1; -} - -bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); - return FALSE; -} - -bool8 sub_8064864(struct Sprite *); - -bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_806113C(mapObject, sprite, direction, 1, 0); - StartSpriteAnim(sprite, sub_805FD88(direction)); -} - -bool8 sub_8061FB0(struct MapObject *, struct Sprite *); - -bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_SOUTH); - return sub_8061FB0(mapObject, sprite); -} - -bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061FF8(struct MapObject *, struct Sprite *); - -bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_NORTH); - return sub_8061FF8(mapObject, sprite); -} - -bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062040(struct MapObject *, struct Sprite *); - -bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_WEST); - return sub_8062040(mapObject, sprite); -} - -bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062088(struct MapObject *, struct Sprite *); - -bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_EAST); - return sub_8062088(mapObject, sprite); -} - -bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 objectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) - { - an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)); - } - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 objectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) - { - an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y))); - } - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2); - return sub_80621BC(mapObject, sprite); -} - -bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2); - return sub_8062214(mapObject, sprite); -} - -bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2); - return sub_806226C(mapObject, sprite); -} - -bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2); - return sub_80622C4(mapObject, sprite); -} - -bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0); - return sub_806231C(mapObject, sprite); -} - -bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0); - return sub_8062374(mapObject, sprite); -} - -bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0); - return sub_80623CC(mapObject, sprite); -} - -bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0); - return sub_8062424(mapObject, sprite); -} - -bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2); - return sub_806247C(mapObject, sprite); -} - -bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2); - return sub_80624D4(mapObject, sprite); -} - -bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2); - return sub_806252C(mapObject, sprite); -} - -bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2); - return sub_8062584(mapObject, sprite); -} - -bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]); - return TRUE; -} - -bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); - return FALSE; -} - -bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_HEART_ICON); - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062704(struct MapObject *, struct Sprite *); - -bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->animPattern == 0x3F) - { - sub_8084794(mapObject); - return FALSE; - } - else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) - { - sprite->data[2] = 2; - return TRUE; - } - else - { - sub_812869C(mapObject); - sprite->data[2] = 1; - return sub_8062704(mapObject, sprite); - } -} - -bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_81286C4(mapObject)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data[2] = 1; - return FALSE; -} - -bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sub_8064820(sprite, 0x20); - sprite->data[2] = 2; - } - return FALSE; -} - -bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= 1; - if (sub_8064824(sprite)) - { - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 3; - } - return FALSE; -} - -bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data[2] = 1; - return FALSE; -} - -bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sub_8064820(sprite, 0x20); - sprite->data[2] = 2; - } - return FALSE; -} - -bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= 1; - if (sub_8064824(sprite)) - { - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 3; - } - return FALSE; -} - -bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->oam.affineMode = 3; - InitSpriteAffineAnim(sprite); - sprite->affineAnimPaused = 1; - sprite->subspriteMode = 0; - return TRUE; -} - -bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = 0; - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - return TRUE; -} - -bool8 sub_80628D0(struct MapObject *, struct Sprite *); - -bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - sprite->affineAnimPaused = 0; - StartSpriteAffineAnimIfDifferent(sprite, 0); - return sub_80628D0(mapObject, sprite); -} - -bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->affineAnimPaused = 1; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062930(struct MapObject *, struct Sprite *); - -bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - sprite->affineAnimPaused = 0; - ChangeSpriteAffineAnimIfDifferent(sprite, 1); - return sub_8062930(mapObject, sprite); -} - -bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->affineAnimPaused = 1; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - sub_805FE64(mapObject, sprite, sub_805FDD8(direction)); - sprite->animPaused = 1; - sprite->data[2] = 1; -} - -bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_SOUTH); - return TRUE; -} - -bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_NORTH); - return TRUE; -} - -bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_WEST); - return TRUE; -} - -bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_EAST); - return TRUE; -} - -bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST)); - return FALSE; -} - -bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST)); - return FALSE; -} - -bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST)); - return FALSE; -} - -void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4) -{ - sub_806113C(mapObject, sprite, direction, a3, a4); - StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction)); - DoShadowFieldEffect(mapObject); -} - -bool8 sub_8062BFC(struct MapObject *, struct Sprite *); - -bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1); - return sub_8062BFC(mapObject, sprite); -} - -bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062C54(struct MapObject *, struct Sprite *); - -bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1); - return sub_8062C54(mapObject, sprite); -} - -bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062CAC(struct MapObject *, struct Sprite *); - -bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1); - return sub_8062CAC(mapObject, sprite); -} - -bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062D04(struct MapObject *, struct Sprite *); - -bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1); - return sub_8062D04(mapObject, sprite); -} - -bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062D5C(struct MapObject *, struct Sprite *); - -bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1); - return sub_8062D5C(mapObject, sprite); -} - -bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062DB4(struct MapObject *, struct Sprite *); - -bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1); - return sub_8062DB4(mapObject, sprite); -} - -bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062E0C(struct MapObject *, struct Sprite *); - -bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1); - return sub_8062E0C(mapObject, sprite); -} - -bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062E64(struct MapObject *, struct Sprite *); - -bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1); - return sub_8062E64(mapObject, sprite); -} - -bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062EBC(struct MapObject *, struct Sprite *); - -bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0); - return sub_8062EBC(mapObject, sprite); -} - -bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062F14(struct MapObject *, struct Sprite *); - -bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0); - return sub_8062F14(mapObject, sprite); -} - -bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062F6C(struct MapObject *, struct Sprite *); - -bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0); - return sub_8062F6C(mapObject, sprite); -} - -bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062FC4(struct MapObject *, struct Sprite *); - -bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0); - return sub_8062FC4(mapObject, sprite); -} - -bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8); - return sub_8061714(mapObject, sprite); -} - -void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -bool8 sub_8063128(struct MapObject *, struct Sprite *); - -bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063128(mapObject, sprite); -} - -bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063168(struct MapObject *, struct Sprite *); - -bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_NORTH, 1); - return sub_8063168(mapObject, sprite); -} - -bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80631A8(struct MapObject *, struct Sprite *); - -bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_WEST, 1); - return sub_80631A8(mapObject, sprite); -} - -bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80631E8(struct MapObject *, struct Sprite *); - -bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_EAST, 1); - return sub_80631E8(mapObject, sprite); -} - -bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18)); -} - -bool8 sub_8063258(struct MapObject *, struct Sprite *); - -bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063258(mapObject, sprite); -} - -bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063298(struct MapObject *, struct Sprite *); - -bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_NORTH, 1); - return sub_8063298(mapObject, sprite); -} - -bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80632D8(struct MapObject *, struct Sprite *); - -bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_WEST, 1); - return sub_80632D8(mapObject, sprite); -} - -bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063318(struct MapObject *, struct Sprite *); - -bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_EAST, 1); - return sub_8063318(mapObject, sprite); -} - -bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -bool8 sub_8063390(struct MapObject *, struct Sprite *); - -bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063390(mapObject, sprite); -} - -bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80633D0(struct MapObject *, struct Sprite *); - -bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_NORTH, 1); - return sub_80633D0(mapObject, sprite); -} - -bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063410(struct MapObject *, struct Sprite *); - -bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_WEST, 1); - return sub_8063410(mapObject, sprite); -} - -bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063450(struct MapObject *, struct Sprite *); - -bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_EAST, 1); - return sub_8063450(mapObject, sprite); -} - -bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite) -{ - return TRUE; -} - -bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->animPaused = 1; - return TRUE; -} - -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_10) - { - sprite->animPaused = 1; - } -} - -void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_11) - { - sprite->animPaused = 0; - mapObject->mapobj_bit_10 = 0; - mapObject->mapobj_bit_11 = 0; - } -} - -void sub_80634E8(struct MapObject *, struct Sprite *); -static void UpdateMapObjSpriteVisibility(struct MapObject *, struct Sprite *); - -void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80634E8(mapObject, sprite); - UpdateMapObjSpriteVisibility(mapObject, sprite); -} - -#ifdef NONMATCHING -void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u16 x; - u16 y; - s16 x2; - s16 y2; - const struct MapObjectGraphicsInfo *graphicsInfo; - mapObject->mapobj_bit_14 = 0; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - x2 = graphicsInfo->width + x; // offending line - y2 = graphicsInfo->height + y; // similarly offending line - if ((s16)x >= 0x100 || x2 < -0x10) - { - mapObject->mapobj_bit_14 = 1; - } - if ((s16)y >= 0xB0 || y2 < -0x10) - { - mapObject->mapobj_bit_14 = 1; - } -} -#else -__attribute__((naked)) -void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r5, r0, 0\n\ - adds r4, r1, 0\n\ - ldrb r1, [r5, 0x1]\n\ - movs r0, 0x41\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r5, 0x1]\n\ - ldrb r0, [r5, 0x5]\n\ - bl GetFieldObjectGraphicsInfo\n\ - adds r6, r0, 0\n\ - adds r0, r4, 0\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0806354C\n\ - ldrh r1, [r4, 0x24]\n\ - ldrh r0, [r4, 0x20]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\ - adds r0, r1\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r1, [r4, 0x26]\n\ - ldrh r0, [r4, 0x22]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x29\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\ - adds r0, r1\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - b _08063574\n\ - .align 2, 0\n\ -_08063544: .4byte gSpriteCoordOffsetX\n\ -_08063548: .4byte gSpriteCoordOffsetY\n\ -_0806354C:\n\ - ldrh r1, [r4, 0x24]\n\ - ldrh r0, [r4, 0x20]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r1, [r4, 0x26]\n\ - ldrh r0, [r4, 0x22]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x29\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - adds r0, r1\n\ -_08063574:\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - ldrh r0, [r6, 0x8]\n\ - adds r0, r3\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - ldrh r0, [r6, 0xA]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0xFF\n\ - bgt _0806359C\n\ - lsls r0, r1, 16\n\ - asrs r0, 16\n\ - movs r1, 0x10\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _080635A4\n\ -_0806359C:\n\ - ldrb r0, [r5, 0x1]\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ -_080635A4:\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - cmp r0, 0xAF\n\ - bgt _080635B8\n\ - lsls r0, r4, 16\n\ - asrs r0, 16\n\ - movs r1, 0x10\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _080635C0\n\ -_080635B8:\n\ - ldrb r0, [r5, 0x1]\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ -_080635C0:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ -.syntax divided\n"); -} -#endif - -void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->invisible = 0; - if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) - { - sprite->invisible = 1; - } -} - -static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8); -static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); -static void DoTracksGroundEffect_BikeTireTracks( -struct MapObject *mapObj, struct Sprite *sprite, u8); -void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); -u8 GetReflectionTypeByMetatileBehavior(u32 behavior); - -static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_Reflection(mapObj, flags); - GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags); - GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); -} - -static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_Reflection(mapObj, flags); - GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags); - GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags); - GetGroundEffectFlags_Tracks(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_Puddle(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); -} - -static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_Puddle(mapObj, flags); - GetGroundEffectFlags_Ripple(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); - GetGroundEffectFlags_Seaweed(mapObj, flags); - GetGroundEffectFlags_JumpLanding(mapObj, flags); -} - -void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) -{ - mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y); - mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y); -} - -void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) -{ - u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; - u8 type = FieldObjectCheckForReflectiveSurface(mapObj); - - if (type) - { - if (!mapObj->mapobj_bit_17) - { - mapObj->mapobj_bit_17 = 0; - mapObj->mapobj_bit_17 = 1; - *flags |= reflectionFlags[type - 1]; - } - } - else - { - mapObj->mapobj_bit_17 = 0; - } -} - -void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x1; -} - -void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x2; -} - -void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x4; -} - -void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x8; -} - -void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) - { - *flags |= 0x100; - } - else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) - || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) - { - *flags |= 0x80; - } -} - -void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_20) - { - mapObj->mapobj_bit_20 = 0; - mapObj->mapobj_bit_20 = 1; - *flags |= 0x800; - } - } - else - { - mapObj->mapobj_bit_20 = 0; - } -} - -void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) -{ - if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) - || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) - { - if (!mapObj->mapobj_bit_19) - { - mapObj->mapobj_bit_19 = 0; - mapObj->mapobj_bit_19 = 1; - *flags |= 0x40; - } - } - else - { - mapObj->mapobj_bit_19 = 0; - } -} - -void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) - { - *flags |= 0x400; - } -} - -void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E)) - *flags |= 0x200; -} - -void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_18) - { - mapObj->mapobj_bit_18 = 0; - mapObj->mapobj_bit_18 = 1; - *flags |= 0x20000; - } - } - else - { - mapObj->mapobj_bit_18 = 0; - } -} - -void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_21) - { - mapObj->mapobj_bit_21 = 0; - mapObj->mapobj_bit_21 = 1; - *flags |= 0x40000; - } - } - else - { - mapObj->mapobj_bit_21 = 0; - } -} - -void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E)) - *flags |= 0x80000; -} - -void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) -{ - typedef bool8 (*MetatileFunc)(u8); - - static const MetatileFunc metatileFuncs[] = { - MetatileBehavior_IsTallGrass, - MetatileBehavior_IsLongGrass, - MetatileBehavior_IsPuddle, - MetatileBehavior_IsSurfableWaterOrUnderwater, - MetatileBehavior_IsShallowFlowingWater, - MetatileBehavior_IsATile, - }; - - static const u32 jumpLandingFlags[] = { - 0x00001000, // Landing in tall grass - 0x00002000, // Landing in long grass - 0x00004000, // Landing on puddle - 0x00008000, // Landing on surfable water or underwater - 0x00004000, // Landing on shallow flowing water - 0x00010000, // Landing on any other type of ground - }; - - if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) - { - u8 i; - - for (i = 0; i < 6; i++) - { - if (metatileFuncs[i](mapObj->mapobj_unk_1E)) - { - *flags |= jumpLandingFlags[i]; - return; - } - } - } -} - -u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - - // ceil div by tile width? - s16 width = (info->width + 8) >> 4; - s16 height = (info->height + 8) >> 4; - s16 i; - s16 j; - u8 result; - u8 b; - s16 one; - -#define RETURN_REFLECTION_TYPE_AT(x, y) \ - b = MapGridGetMetatileBehaviorAt(x, y); \ - result = GetReflectionTypeByMetatileBehavior(b); \ - if (result != 0) \ - return result; - - for (i = 0, one = 1; i < height; i++) - { - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i) - for (j = 1; j < width; j++) - { - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i) - } - } - return 0; - -#undef RETURN_REFLECTION_TYPE_AT -} - -u8 GetReflectionTypeByMetatileBehavior(u32 behavior) -{ - if (MetatileBehavior_IsIce(behavior)) - return 1; - else if (MetatileBehavior_IsReflective(behavior)) - return 2; - else - return 0; -} - -u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) -{ - static bool8 (*const unknown_08376040[])(u8) = { - MetatileBehavior_IsJumpSouth, - MetatileBehavior_IsJumpNorth, - MetatileBehavior_IsJumpWest, - MetatileBehavior_IsJumpEast, - }; - - u8 b; - u8 index = z; - - if (index == 0) - return 0; - else if (index > 4) - index -= 4; - - index--; - b = MapGridGetMetatileBehaviorAt(x, y); - - if (unknown_08376040[index](b) == 1) - return index + 1; - - return 0; -} - -void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_4) - return; - - if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - return; - - if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F)) - return; - - sprite->subspriteTableNum = 4; - - if (ZCoordToPriority(mapObj->elevation) == 1) - sprite->subspriteTableNum = 5; -} - -bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) -{ - u8 mapZ; - - if (z == 0) - return FALSE; - - mapZ = MapGridGetZCoordAt(x, y); - - if (mapZ == 0 || mapZ == 0xF) - return FALSE; - - if (mapZ != z) - return TRUE; - - return FALSE; -} - -static const u8 sUnknown_08376050[] = { - 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 -}; - -// Each byte corresponds to a sprite priority for a field object. -// This is directly the inverse of gFieldObjectPriorities_08376070. -static const u8 sFieldObjectPriorities_08376060[] = { - 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 -}; - -// Each byte corresponds to a sprite priority for a field object. -// This is the inverse of gFieldObjectPriorities_08376060. -// 1 = Above player sprite -// 2 = Below player sprite -static const u8 sFieldObjectPriorities_08376070[] = { - 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, -}; - -void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_26) - return; - - FieldObjectUpdateZCoord(mapObj); - - sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation]; - sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation]; -} - -void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) -{ - sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z]; - sprite->oam.priority = sFieldObjectPriorities_08376060[z]; -} - -u8 ZCoordToPriority(u8 z) -{ - return sFieldObjectPriorities_08376060[z]; -} - -void FieldObjectUpdateZCoord(struct MapObject *mapObj) -{ - u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y); - u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y); - - if (z == 0xF || z2 == 0xF) - return; - - mapObj->mapobj_unk_0B_0 = z; - - if (z != 0 && z != 0xF) - mapObj->elevation = z; -} - -void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) -{ - s32 tmp = sprite->centerToCornerVecY; - u32 tmpa = *(u16 *)&sprite->pos1.y; - u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; - s32 tmp2 = (tmpa - tmp) + tmpb; - u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; - sprite->subpriority = tmp3 + sUnknown_08376050[a] + b; -} - -void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_26) - return; - - SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); -} - -bool8 AreZCoordsCompatible(u8 a, u8 b) -{ - if (a == 0 || b == 0) - return TRUE; - - if (a != b) - return FALSE; - - return TRUE; -} - -void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 1; - FieldEffectStart(FLDEFF_TALL_GRASS); -} - -void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 0; - FieldEffectStart(FLDEFF_TALL_GRASS); -} - -void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 1; - FieldEffectStart(FLDEFF_LONG_GRASS); -} - -void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 0; - FieldEffectStart(FLDEFF_LONG_GRASS); -} - -void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) -{ - SetUpReflection(mapObj, sprite, 0); -} - -void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite) -{ - SetUpReflection(mapObj, sprite, 1); -} - -void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); -} - -static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { - nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, -}; - -void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - gUnknown_08376080[info->tracks](mapObj, sprite, 0); -} - -void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - gUnknown_08376080[info->tracks](mapObj, sprite, 1); -} - -static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ -} - -static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ - // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) - u16 sandFootprints_FieldEffectData[2] = { - FLDEFF_SAND_FOOTPRINTS, - FLDEFF_DEEP_SAND_FOOTPRINTS - }; - - gFieldEffectArguments[0] = mapObj->coords3.x; - gFieldEffectArguments[1] = mapObj->coords3.y; - gFieldEffectArguments[2] = 149; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->mapobj_unk_18; - FieldEffectStart(sandFootprints_FieldEffectData[a]); -} - -static void DoTracksGroundEffect_BikeTireTracks( - struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ - // Specifies which bike track shape to show next. - // For example, when the bike turns from up to right, it will show - // a track that curves to the right. - // Each 4-byte row corresponds to the initial direction of the bike, and - // each byte in that row is for the next direction of the bike in the order - // of down, up, left, right. - static const u8 bikeTireTracks_Transitions[4][4] = { - 1, 2, 7, 8, - 1, 2, 6, 5, - 5, 8, 3, 4, - 6, 7, 3, 4, - }; - - if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) - { - gFieldEffectArguments[0] = mapObj->coords3.x; - gFieldEffectArguments[1] = mapObj->coords3.y; - gFieldEffectArguments[2] = 149; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = - bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; - FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); - } -} - -void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite) -{ - DoRippleFieldEffect(mapObj, sprite); -} - -void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj); -} - -void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj); -} - -void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - u8 spriteId; - - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); - - spriteId = sub_8126FF0( - mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y); - - if (spriteId == MAX_SPRITES) - GroundEffect_SpawnOnTallGrass(mapObj, sprite); -} - -void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); -} - -void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); -} - -void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); -} - -void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_DUST); -} - -void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj); -} - -void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj); -} - -void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - FieldEffectStart(FLDEFF_BUBBLES); -} - -static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { - GroundEffect_SpawnOnTallGrass, - sub_8063E94, - sub_8063EE0, - sub_8063F2C, - GroundEffect_WaterReflection, - GroundEffect_IceReflection, - GroundEffect_FlowingWater, - sub_8063FA0, - sub_8063FCC, - GroundEffect_Ripple, - GroundEffect_StepOnPuddle, - GroundEffect_SandPile, - GroundEffect_JumpOnTallGrass, - GroundEffect_JumpOnLongGrass, - GroundEffect_JumpOnShallowWater, - GroundEffect_JumpOnWater, - GroundEffect_JumpLandingDust, - GroundEffect_ShortGrass, - GroundEffect_HotSprings, - GroundEffect_Seaweed -}; - -void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1) - if (flags & 1) - gUnknown_083760A0[i](mapObj, sprite); -} - -void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags) -{ - if (mapObj->mapobj_bit_4) - { - mapObj->mapobj_bit_18 = 0; - mapObj->mapobj_bit_20 = 0; - mapObj->mapobj_bit_19 = 0; - mapObj->mapobj_bit_21 = 0; - *flags &= 0xFFF9F7BD; - } -} - -void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags) -{ - if (mapObj->mapobj_bit_5) - *flags &= 0xFFFFFBFF; -} - -void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_2) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnSpawn(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_2 = 0; - mapObj->mapobj_bit_4 = 0; - } -} - -void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_2) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - filters_out_some_ground_effects(mapObj, &flags); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_2 = 0; - mapObj->mapobj_bit_4 = 0; - } -} - -void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_3) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_3 = 0; - mapObj->mapobj_bit_5 = 0; - } -} - -typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); - -void Step1(struct Sprite *sprite, u8 dir); -void Step2(struct Sprite *sprite, u8 dir); -void Step3(struct Sprite *sprite, u8 dir); -void Step4(struct Sprite *sprite, u8 dir); -void Step8(struct Sprite *sprite, u8 dir); - -const SpriteStepFunc Unknown_83760F0[] = { - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1 -}; - -const SpriteStepFunc Unknown_8376130[] = { - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, - Step2 -}; - -const SpriteStepFunc Unknown_8376150[] = { - Step2, - Step3, - Step3, - Step2, - Step3, - Step3 -}; - -const SpriteStepFunc Unknown_8376168[] = { - Step4, - Step4, - Step4, - Step4 -}; - -const SpriteStepFunc Unknown_8376178[] = { - Step8, - Step8 -}; - -const SpriteStepFunc *const gUnknown_08376180[] = { - Unknown_83760F0, - Unknown_8376130, - Unknown_8376150, - Unknown_8376168, - Unknown_8376178 -}; - -const s16 gUnknown_08376194[] = { - 16, 8, 6, 4, 2 -}; - -const s8 Unknown_837619E[] = { - -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0 -}; - -const s8 Unknown_83761AE[] = { - 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0 -}; - -const s8 Unknown_83761BE[] = { - -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0 -}; - -const s8 *const gUnknown_083761D0[] = { - Unknown_837619E, - Unknown_83761AE, - Unknown_83761BE -}; - -bool8 FreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) - { - return TRUE; - } - else - { - mapObject->mapobj_bit_8 = 1; - mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; - mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; - gSprites[mapObject->spriteId].animPaused = 1; - gSprites[mapObject->spriteId].affineAnimPaused = 1; - return FALSE; - } -} - -void FreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < 16; i++) - if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void FreezeMapObjectsExceptOne(u8 a1) -{ - u8 i; - for (i = 0; i < 16; i++) - if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void UnfreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->active && mapObject->mapobj_bit_8) - { - mapObject->mapobj_bit_8 = 0; - gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; - gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; - } -} - -void UnfreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < 16; i++) - if (gMapObjects[i].active) - UnfreezeMapObject(&gMapObjects[i]); -} - -void Step1(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += gDirectionToVector[dir].x; - sprite->pos1.y += gDirectionToVector[dir].y; -} - -void Step2(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y; -} - -void Step3(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y; -} - -void Step4(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y; -} - -void Step8(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y; -} - -void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = 0; -} - -bool8 obj_npc_ministep(struct Sprite *sprite) -{ - if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]]) - return FALSE; - - gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); - - sprite->data[5]++; - - if (sprite->data[5] < gUnknown_08376194[sprite->data[4]]) - return FALSE; - - return TRUE; -} - -void sub_806467C(struct Sprite *sprite, u8 a2) -{ - sprite->data[3] = a2; - sprite->data[4] = 0; - sprite->data[5] = 0; -} - -bool8 sub_806468C(struct Sprite *sprite) -{ - if (!(sprite->data[4] & 1)) - { - Step1(sprite, sprite->data[3]); - sprite->data[5]++; - } - - sprite->data[4]++; - - if (sprite->data[5] > 15) - return TRUE; - else - return FALSE; -} - -s16 sub_80646C8(s16 a1, u8 a2) -{ - return gUnknown_083761D0[a2][a1]; -} - -void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) -{ - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = a4; - sprite->data[6] = 0; -} - -u8 sub_8064704(struct Sprite *sprite) -{ - s16 v5[3] = {0x10, 0x10, 0x20}; - u8 v6[3] = {0, 0, 1}; - u8 v2 = 0; - - if (sprite->data[4]) - Step1(sprite, sprite->data[3]); - - sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); - - sprite->data[6]++; - - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; - - if (sprite->data[6] >= v5[sprite->data[4]]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -u8 sub_806478C(struct Sprite *sprite) -{ - s16 v5[3] = {0x20, 0x20, 0x40}; - u8 v6[3] = {1, 1, 2}; - u8 v2 = 0; - - if (sprite->data[4] && !(sprite->data[6] & 1)) - Step1(sprite, sprite->data[3]); - - sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); - - sprite->data[6]++; - - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; - - if (sprite->data[6] >= v5[sprite->data[4]]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -void sub_8064820(struct Sprite *sprite, s16 a2) -{ - sprite->data[3] = a2; -} - -bool8 sub_8064824(struct Sprite *sprite) -{ - sprite->data[3]--; - - if (sprite->data[3] == 0) - return TRUE; - else - return FALSE; -} - -void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->animNum = a2; - sprite->animPaused = 0 ; - SeekSpriteAnim(sprite, a3); -} - -bool8 sub_8064864(struct Sprite *sprite) -{ - if (sprite->animEnded) - return TRUE; - else - return FALSE; -} - -void sub_806487C(struct Sprite *sprite, bool8 invisible) -{ - u16 x, y; - s16 x2, y2; - - sprite->invisible = invisible; - - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - - x2 = x - (sprite->centerToCornerVecX >> 1); - y2 = y - (sprite->centerToCornerVecY >> 1); - - if ((s16)x > 255 || x2 < -16) - sprite->invisible = 1; - if ((s16)y > 175 || y2 < -16) - sprite->invisible = 1; -} - -void sub_8064970(struct Sprite *sprite) -{ - SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); - sub_806487C(sprite, 0); -} - -void sub_8064990(u8 a1, u8 dir) -{ - u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1) - { - u8 animNum = FieldObjectDirectionToImageAnimId(dir); - StartSpriteAnim(sprite, animNum); - break; - } - } -} - -u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - return FieldEffectStart(fieldEffectId); -} - -void DoShadowFieldEffect(struct MapObject *mapObject) -{ - if (!mapObject->mapobj_bit_22) - { - mapObject->mapobj_bit_22 = 1; - oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); - } -} - -void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - gFieldEffectArguments[0] = sprite->pos1.x; - gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; - gFieldEffectArguments[2] = 151; - gFieldEffectArguments[3] = 3; - FieldEffectStart(FLDEFF_RIPPLE); -} diff --git a/src/field/field_effect.c b/src/field/field_effect.c index dff5c7e63..f85bc520e 100644 --- a/src/field/field_effect.c +++ b/src/field/field_effect.c @@ -15,7 +15,7 @@ #include "constants/songs.h" #include "decoration.h" #include "field_player_avatar.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "metatile_behavior.h" #include "field_camera.h" #include "field_effect.h" diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c index c760d9aae..bc4a1770e 100644 --- a/src/field/field_effect_helpers.c +++ b/src/field/field_effect_helpers.c @@ -4,7 +4,7 @@ #include "metatile_behavior.h" #include "constants/songs.h" #include "sound.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_camera.h" #include "field_weather.h" #include "field_effect.h" diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c index 492c96fdd..35ea3952a 100644 --- a/src/field/field_fadetransition.c +++ b/src/field/field_fadetransition.c @@ -4,7 +4,7 @@ #include "field_door.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "field_special_scene.h" #include "field_weather.h" diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index 41e999719..c4ba8902e 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -4,7 +4,7 @@ #include "event_data.h" #include "field_effect.h" #include "field_effect_helpers.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "fieldmap.h" #include "main.h" #include "constants/map_objects.h" diff --git a/src/field/field_special_scene.c b/src/field/field_special_scene.c index f81f2e2f6..2010ebcf4 100644 --- a/src/field/field_special_scene.c +++ b/src/field/field_special_scene.c @@ -3,7 +3,7 @@ #include "event_data.h" #include "field_camera.h" #include "field_fadetransition.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_specials.h" #include "fieldmap.h" #include "main.h" diff --git a/src/field/field_specials.c b/src/field/field_specials.c index 81514c221..715086f00 100644 --- a/src/field/field_specials.c +++ b/src/field/field_specials.c @@ -4,7 +4,7 @@ #include "fieldmap.h" #include "event_data.h" #include "battle_tower.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "region_map.h" #include "field_region_map.h" #include "field_message_box.h" diff --git a/src/field/field_weather.c b/src/field/field_weather.c index 838df6508..3f500ba50 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -1,6 +1,6 @@ #include "global.h" #include "blend_palette.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_weather.h" #include "palette.h" #include "random.h" diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c index 09d98b7b1..386925531 100644 --- a/src/field/field_weather_effects.c +++ b/src/field/field_weather_effects.c @@ -1,5 +1,5 @@ #include "global.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_weather.h" #include "overworld.h" #include "random.h" diff --git a/src/field/fldeff_berrytree.c b/src/field/fldeff_berrytree.c index 43e29d7f0..6b03e9952 100644 --- a/src/field/fldeff_berrytree.c +++ b/src/field/fldeff_berrytree.c @@ -1,5 +1,5 @@ #include "global.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "script.h" diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c index 2043c5688..5bf2c5c43 100644 --- a/src/field/fldeff_cut.c +++ b/src/field/fldeff_cut.c @@ -2,7 +2,7 @@ #include "fldeff_cut.h" #include "field_camera.h" #include "field_effect.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "map_obj_lock.h" diff --git a/src/field/fldeff_decoration.c b/src/field/fldeff_decoration.c index d6c5e6e8b..1859fc00b 100644 --- a/src/field/fldeff_decoration.c +++ b/src/field/fldeff_decoration.c @@ -2,7 +2,7 @@ #include "event_data.h" #include "field_camera.h" #include "field_effect.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "script.h" diff --git a/src/field/fldeff_recordmixing.c b/src/field/fldeff_recordmixing.c index 8d5e7229d..716447f9c 100644 --- a/src/field/fldeff_recordmixing.c +++ b/src/field/fldeff_recordmixing.c @@ -1,5 +1,5 @@ #include "global.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "fldeff_recordmixing.h" #include "sprite.h" diff --git a/src/field/item_menu.c b/src/field/item_menu.c index 7aaf650b2..774fdf4b2 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -4,7 +4,7 @@ #include "data2.h" #include "decompress.h" #include "field_effect.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "graphics.h" #include "item.h" diff --git a/src/field/map_obj_lock.c b/src/field/map_obj_lock.c index ceda005c3..3bd25dbdf 100644 --- a/src/field/map_obj_lock.c +++ b/src/field/map_obj_lock.c @@ -1,6 +1,6 @@ #include "global.h" #include "map_obj_lock.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "script_movement.h" #include "task.h" diff --git a/src/field/overworld.c b/src/field/overworld.c index 397a28436..8ca8aeea9 100644 --- a/src/field/overworld.c +++ b/src/field/overworld.c @@ -9,7 +9,7 @@ #include "field_control_avatar.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" diff --git a/src/field/rotating_gate.c b/src/field/rotating_gate.c index 4804ffb0e..69f655a65 100644 --- a/src/field/rotating_gate.c +++ b/src/field/rotating_gate.c @@ -1,7 +1,7 @@ #include "global.h" #include "bike.h" #include "event_data.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "fieldmap.h" #include "constants/maps.h" #include "constants/songs.h" diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 44863edb2..e5272bc9c 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -12,7 +12,7 @@ #include "field_door.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" diff --git a/src/field/script_movement.c b/src/field/script_movement.c index b509ee23c..653dffcbf 100644 --- a/src/field/script_movement.c +++ b/src/field/script_movement.c @@ -1,6 +1,6 @@ #include "global.h" #include "script_movement.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "task.h" #include "util.h" diff --git a/src/field/shop.c b/src/field/shop.c index a197ca13d..0f53eef17 100644 --- a/src/field/shop.c +++ b/src/field/shop.c @@ -16,7 +16,7 @@ #include "task.h" #include "tv.h" #include "scanline_effect.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "item.h" diff --git a/src/field/trainer_see.c b/src/field/trainer_see.c index 2ff1bd372..2913a0a5a 100644 --- a/src/field/trainer_see.c +++ b/src/field/trainer_see.c @@ -2,7 +2,7 @@ #include "trainer_see.h" #include "battle_setup.h" #include "field_effect.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "script.h" #include "sprite.h" diff --git a/src/field/tv.c b/src/field/tv.c index 786320eba..ebf304a6e 100644 --- a/src/field/tv.c +++ b/src/field/tv.c @@ -21,7 +21,7 @@ #include "battle.h" #include "link.h" #include "constants/easy_chat.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_specials.h" #include "item.h" #include "constants/items.h" diff --git a/src/rom6.c b/src/rom6.c index 09f6faac2..ffd01fdb9 100644 --- a/src/rom6.c +++ b/src/rom6.c @@ -4,7 +4,7 @@ #include "rom6.h" #include "braille_puzzles.h" #include "field_effect.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "item_use.h" #include "pokemon_menu.h" diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c index f52f4524d..57cb17c58 100644 --- a/src/scene/cable_car.c +++ b/src/scene/cable_car.c @@ -14,7 +14,7 @@ #include "constants/songs.h" #include "decompress.h" #include "field_weather.h" -#include "evobjmv.h" +#include "event_object_movement.h" #include "scanline_effect.h" #include "event_data.h" #include "cable_car_util.h" -- cgit v1.2.3 From 605c4b66f0d53198413a3ebe69171eefa193f3b0 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sun, 18 Feb 2018 16:14:49 -0600 Subject: decompile more debug code --- src/battle/battle_controller_player.c | 14 +- src/engine/link.c | 158 ++++-------------- src/field/field_map_obj.c | 295 ++-------------------------------- src/roulette.c | 256 +++++++++-------------------- 4 files changed, 122 insertions(+), 601 deletions(-) (limited to 'src') diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index 1824f9182..3e259a21b 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -1055,7 +1055,7 @@ void debug_sub_8030C24(void) move += 9; case DPAD_RIGHT: if (++move > 354) - move = 1; + move = 1; SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move); gBattleMons[gActiveBank].moves[0] = move; Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); @@ -1080,7 +1080,7 @@ void debug_sub_8030C24(void) move -= 9; case DPAD_LEFT: if (--move <= 0) - move = 354; + move = 354; SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move); gBattleMons[gActiveBank].moves[0] = move; Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38); @@ -1111,11 +1111,11 @@ void debug_sub_8030C24(void) move = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i); StringAppend(gDisplayedStringBattle, gMoveNames[move]); Text_InitWindow( - &gUnknown_03004210, - gDisplayedStringBattle, - 0x100 + i * 16, - (i & 1) ? 10 : 2, - (i < 2) ? 0x37 : 0x39); + &gUnknown_03004210, + gDisplayedStringBattle, + 0x100 + i * 16, + (i & 1) ? 10 : 2, + (i < 2) ? 0x37 : 0x39); Text_PrintWindow8002F44(&gUnknown_03004210); } gBattleBankFunc[gActiveBank] = sub_802C68C; diff --git a/src/engine/link.c b/src/engine/link.c index 70c2b85cc..db5d0d935 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -192,19 +192,9 @@ const struct BlockRequest sBlockRequestLookupTable[5] = static const u8 sTestString[] = _("テストな"); -// TODO: fix the alignment here +const u8 sMagic[] = "GameFreak inc."; -ALIGNED(4) const u8 sMagic[] = "GameFreak inc."; - -#if DEBUG const u8 sEmptyString[] = _(" "); -#else -ALIGNED(4) const u8 sEmptyString[] = _(""); -#endif - -#if DEBUG -const u8 linkDebugFillerPleaseRemove[2] = {0}; -#endif void Task_DestroySelf(u8 taskId) { @@ -988,138 +978,50 @@ void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) #if DEBUG -EWRAM_DATA u16 *debugCharacterBase = NULL; -EWRAM_DATA void *unk_20238C8 = NULL; -EWRAM_DATA u16 (*debugTileMap)[] = NULL; +//EWRAM_DATA u16 *debugCharacterBase = NULL; +EWRAM_DATA uintptr_t debugCharacterBase = 0; +EWRAM_DATA uintptr_t unk_20238C8 = 0; +EWRAM_DATA u16 *debugTileMap = NULL; EWRAM_DATA u32 unk_20238D0 = 0; -void debug_sub_8008218(u16 *buffer, void *arg1, u16 (*arg2)[], u32 arg3) +void debug_sub_8008218(u16 *buffer, void *arg1, u16 *arg2, u32 arg3) { CpuSet(sLinkTestDigitTiles, buffer, 272); - debugCharacterBase = buffer; - unk_20238C8 = arg1; + debugCharacterBase = (uintptr_t)buffer; + unk_20238C8 = (uintptr_t)arg1; debugTileMap = arg2; unk_20238D0 = arg3; } -#ifdef NONMATCHING -void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) +void debug_sub_8008264(u32 value, int left, int top, int d, int e) { + s32 i; u32 buffer[8]; - u32 *ptr; - - u16 *dest; - - int i; - - if (unk_20238D0 != sp0) - return; - - r3 = max(r3, 8); - ptr = &buffer[0]; - dest = &(*debugTileMap)[left + top * 32]; - - for (i = r3; i != 0; i--) + if (unk_20238D0 == e) { - *(ptr++) = value & 0xF; - value = value >> 4; - } + u32 *ptr; + u16 *tilemapDest; - ptr = &buffer[8 - r3]; - for (i = r3; i != 0; i--) - { - int charOffset = (((uintptr_t) debugCharacterBase) - ((uintptr_t) unk_20238C8)) / 32; - *dest = *ptr + charOffset + 1; - ptr--; - dest++; + if (d > 8) + d = 8; + ptr = buffer; + for (i = 0; i < d; i++) + { + *ptr++ = value & 0xF; + value >>= 4; + } + + tilemapDest = (u16 *)debugTileMap + top * 0x20 + left; + ptr = buffer + d - 1; + for (i = 0; i < d; i++) + { + *tilemapDest = (debugCharacterBase - unk_20238C8) / 32 + *ptr + 1; + ptr--; + tilemapDest++; + } } } -#else -__attribute__((naked)) -void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add sp, sp, #0xffffffe0\n" - " add r5, r0, #0\n" - " add r6, r1, #0\n" - " add r4, r3, #0\n" - " ldr r0, [sp, #0x38]\n" - " ldr r1, ._347 @ unk_20238D0\n" - " ldr r1, [r1]\n" - " cmp r1, r0\n" - " bne ._345 @cond_branch\n" - " cmp r4, #0x8\n" - " ble ._342 @cond_branch\n" - " mov r4, #0x8\n" - "._342:\n" - " mov r3, sp\n" - " ldr r0, ._347 + 4 @ debugTileMap\n" - " mov r8, r0\n" - " lsl r2, r2, #0x6\n" - " mov ip, r2\n" - " lsl r6, r6, #0x1\n" - " lsl r7, r4, #0x2\n" - " cmp r4, #0\n" - " ble ._343 @cond_branch\n" - " mov r1, #0xf\n" - " add r2, r4, #0\n" - "._344:\n" - " add r0, r5, #0\n" - " and r0, r0, r1\n" - " stmia r3!, {r0}\n" - " lsr r5, r5, #0x4\n" - " sub r2, r2, #0x1\n" - " cmp r2, #0\n" - " bne ._344 @cond_branch\n" - "._343:\n" - " mov r1, r8\n" - " ldr r0, [r1]\n" - " add r0, r0, ip\n" - " add r5, r0, r6\n" - " mov r1, sp\n" - " add r0, r1, r7\n" - " sub r3, r0, #4\n" - " cmp r4, #0\n" - " ble ._345 @cond_branch\n" - " ldr r7, ._347 + 8 @ debugCharacterBase\n" - " ldr r6, ._347 + 12 @ unk_20238C8\n" - " add r2, r4, #0\n" - "._346:\n" - " ldr r1, [r7]\n" - " ldr r0, [r6]\n" - " sub r1, r1, r0\n" - " lsr r1, r1, #0x5\n" - " ldr r0, [r3]\n" - " add r0, r0, r1\n" - " add r0, r0, #0x1\n" - " strh r0, [r5]\n" - " sub r3, r3, #0x4\n" - " add r5, r5, #0x2\n" - " sub r2, r2, #0x1\n" - " cmp r2, #0\n" - " bne ._346 @cond_branch\n" - "._345:\n" - " add sp, sp, #0x20\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._348:\n" - " .align 2, 0\n" - "._347:\n" - " .word unk_20238D0\n" - " .word debugTileMap\n" - " .word debugCharacterBase\n" - " .word unk_20238C8\n" - "\n" - ); -} -#endif #endif diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index f3a949b51..99f9f1ef3 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1908,7 +1908,7 @@ static u16 gUnknown_030005A6; struct MapObject gMapObjects[16]; #if DEBUG -u8 gUnknown_Debug_03004BC0; // unknown type +u8 gUnknown_Debug_03004BC0; #endif void npc_clear_ids_and_state(struct MapObject *mapObj) @@ -2214,226 +2214,6 @@ void npc_hide_all_but_player(void) } } -#if DEBUG -__attribute__((naked)) -u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, sl\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5, r6, r7}\n" - " add r7, r1, #0\n" - " add r1, r2, #0\n" - " add r2, r3, #0\n" - " ldr r3, [sp, #0x20]\n" - " ldr r4, [sp, #0x24]\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r2, r2, #0x18\n" - " lsl r3, r3, #0x10\n" - " lsr r3, r3, #0x10\n" - " mov r9, r3\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " mov sl, r4\n" - " bl InitFieldObjectStateFromTemplate\n" - " lsl r0, r0, #0x18\n" - " lsr r0, r0, #0x18\n" - " mov r8, r0\n" - " cmp r0, #0x10\n" - " bne ._83 @cond_branch\n" - " mov r0, #0x10\n" - " b ._92\n" - "._83:\n" - " mov r0, r8\n" - " lsl r4, r0, #0x3\n" - " add r0, r4, r0\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._87 @ gMapObjects\n" - " add r5, r0, r1\n" - " ldrb r0, [r5, #0x5]\n" - " bl GetFieldObjectGraphicsInfo\n" - " add r6, r0, #0\n" - " ldrb r1, [r6, #0xc]\n" - " mov r0, #0xf\n" - " and r0, r0, r1\n" - " cmp r0, #0\n" - " bne ._85 @cond_branch\n" - " ldrh r0, [r6, #0x2]\n" - " lsl r1, r1, #0x1c\n" - " lsr r1, r1, #0x1c\n" - " bl npc_load_two_palettes__no_record\n" - " b ._89\n" - "._88:\n" - " .align 2, 0\n" - "._87:\n" - " .word gMapObjects\n" - "._85:\n" - " cmp r0, #0xa\n" - " bne ._89 @cond_branch\n" - " ldrh r0, [r6, #0x2]\n" - " lsl r1, r1, #0x1c\n" - " lsr r1, r1, #0x1c\n" - " bl npc_load_two_palettes__and_record\n" - "._89:\n" - " ldrb r0, [r5, #0x6]\n" - " cmp r0, #0x4c\n" - " bne ._90 @cond_branch\n" - " ldrb r0, [r5, #0x1]\n" - " mov r1, #0x20\n" - " orr r0, r0, r1\n" - " strb r0, [r5, #0x1]\n" - "._90:\n" - " ldr r1, ._93 @ 0xffff\n" - " add r0, r1, #0\n" - " strh r0, [r7, #0x2]\n" - " add r0, r7, #0\n" - " mov r1, #0x0\n" - " mov r2, #0x0\n" - " mov r3, #0x0\n" - " bl CreateSprite\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r7, #0x40\n" - " bne ._91 @cond_branch\n" - " ldr r1, ._93 + 4 @ gUnknown_Debug_03004BC0\n" - " ldrb r0, [r1]\n" - " sub r0, r0, #0x1\n" - " strb r0, [r1]\n" - " ldr r0, ._93 + 8 @ gMapObjects\n" - " mov r2, r8\n" - " add r1, r4, r2\n" - " lsl r1, r1, #0x2\n" - " add r1, r1, r0\n" - " ldrb r2, [r1]\n" - " mov r0, #0x2\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " strb r0, [r1]\n" - " mov r0, #0x10\n" - " b ._92\n" - "._94:\n" - " .align 2, 0\n" - "._93:\n" - " .word 0xffff\n" - " .word gUnknown_Debug_03004BC0\n" - " .word gMapObjects\n" - "._91:\n" - " lsl r0, r7, #0x4\n" - " add r0, r0, r7\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._96 @ gSprites\n" - " add r4, r0, r1\n" - " mov r1, r9\n" - " lsl r0, r1, #0x10\n" - " asr r0, r0, #0x10\n" - " ldrh r2, [r5, #0x10]\n" - " add r0, r0, r2\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x10\n" - " mov r2, sl\n" - " lsl r1, r2, #0x10\n" - " asr r1, r1, #0x10\n" - " ldrh r2, [r5, #0x12]\n" - " add r1, r1, r2\n" - " lsl r1, r1, #0x10\n" - " asr r1, r1, #0x10\n" - " add r2, r4, #0\n" - " add r2, r2, #0x20\n" - " add r3, r4, #0\n" - " add r3, r3, #0x22\n" - " bl sub_8060388\n" - " ldrh r0, [r6, #0x8]\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x11\n" - " neg r0, r0\n" - " add r1, r4, #0\n" - " add r1, r1, #0x28\n" - " strb r0, [r1]\n" - " ldrh r0, [r6, #0xa]\n" - " lsl r0, r0, #0x10\n" - " asr r0, r0, #0x11\n" - " neg r0, r0\n" - " add r2, r4, #0\n" - " add r2, r2, #0x29\n" - " strb r0, [r2]\n" - " ldrh r0, [r4, #0x20]\n" - " add r0, r0, #0x8\n" - " strh r0, [r4, #0x20]\n" - " ldrh r1, [r4, #0x22]\n" - " add r1, r1, #0x10\n" - " mov r0, #0x0\n" - " ldsb r0, [r2, r0]\n" - " add r0, r0, r1\n" - " strh r0, [r4, #0x22]\n" - " ldrb r1, [r6, #0xc]\n" - " lsl r1, r1, #0x1c\n" - " lsr r1, r1, #0x18\n" - " ldrb r2, [r4, #0x5]\n" - " mov r0, #0xf\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x5]\n" - " add r2, r4, #0\n" - " add r2, r2, #0x3e\n" - " ldrb r0, [r2]\n" - " mov r1, #0x2\n" - " orr r0, r0, r1\n" - " strb r0, [r2]\n" - " mov r0, r8\n" - " strh r0, [r4, #0x2e]\n" - " strb r7, [r5, #0x4]\n" - " ldrb r1, [r6, #0xc]\n" - " lsl r1, r1, #0x19\n" - " lsr r1, r1, #0x1f\n" - " lsl r1, r1, #0x4\n" - " ldrb r2, [r5, #0x1]\n" - " mov r0, #0x11\n" - " neg r0, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r5, #0x1]\n" - " lsl r0, r0, #0x1b\n" - " cmp r0, #0\n" - " blt ._95 @cond_branch\n" - " ldrb r0, [r5, #0x18]\n" - " lsl r0, r0, #0x1c\n" - " lsr r0, r0, #0x1c\n" - " bl FieldObjectDirectionToImageAnimId\n" - " add r1, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r1, r1, #0x18\n" - " add r0, r4, #0\n" - " bl StartSpriteAnim\n" - "._95:\n" - " ldrb r0, [r5, #0xb]\n" - " lsr r0, r0, #0x4\n" - " add r1, r4, #0\n" - " mov r2, #0x1\n" - " bl SetObjectSubpriorityByZCoord\n" - " add r0, r5, #0\n" - " add r1, r4, #0\n" - " bl sub_80634D0\n" - " mov r0, r8\n" - "._92:\n" - " pop {r3, r4, r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov sl, r5\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._97:\n" - " .align 2, 0\n" - "._96:\n" - " .word gSprites\n" - "\n" - ); -} -#else u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) { u8 mapObjectId; @@ -2463,6 +2243,9 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * spriteId = CreateSprite(sprTemplate, 0, 0, 0); if (spriteId == 64) { +#if DEBUG + gUnknown_Debug_03004BC0--; +#endif gMapObjects[mapObjectId].active = FALSE; return 16; } @@ -2483,7 +2266,6 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * sub_80634D0(mapObject, sprite); return mapObjectId; } -#endif u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) { @@ -2706,79 +2488,26 @@ void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) void sub_805B75C(u8, s16, s16); -#if DEBUG -__attribute__((naked)) -void sub_805B710(u16 u161, u16 u162) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r8\n" - " push {r7}\n" - " add r4, r0, #0\n" - " add r5, r1, #0\n" - " lsl r4, r4, #0x10\n" - " lsr r4, r4, #0x10\n" - " lsl r5, r5, #0x10\n" - " lsr r5, r5, #0x10\n" - " ldr r6, ._153 @ gUnknown_Debug_03004BC0\n" - " mov r0, #0x0\n" - " strb r0, [r6]\n" - " bl ClearPlayerAvatarInfo\n" - " mov r7, #0x0\n" - " ldr r0, ._153 + 4 @ gMapObjects\n" - " mov r8, r0\n" - " lsl r4, r4, #0x10\n" - " lsl r5, r5, #0x10\n" - "._152:\n" - " lsl r0, r7, #0x3\n" - " add r0, r0, r7\n" - " lsl r0, r0, #0x2\n" - " add r0, r0, r8\n" - " ldrb r0, [r0]\n" - " lsl r0, r0, #0x1f\n" - " cmp r0, #0\n" - " beq ._151 @cond_branch\n" - " add r0, r7, #0\n" - " asr r1, r4, #0x10\n" - " asr r2, r5, #0x10\n" - " bl sub_805B75C\n" - " ldrb r0, [r6]\n" - " add r0, r0, #0x1\n" - " strb r0, [r6]\n" - "._151:\n" - " add r0, r7, #1\n" - " lsl r0, r0, #0x18\n" - " lsr r7, r0, #0x18\n" - " cmp r7, #0xf\n" - " bls ._152 @cond_branch\n" - " bl sub_805AAB0\n" - " pop {r3}\n" - " mov r8, r3\n" - " pop {r4, r5, r6, r7}\n" - " pop {r0}\n" - " bx r0\n" - "._154:\n" - " .align 2, 0\n" - "._153:\n" - " .word gUnknown_Debug_03004BC0\n" - " .word gMapObjects\n" - "\n" - ); -} -#else void sub_805B710(u16 a, u16 b) { u8 i; +#if DEBUG + gUnknown_Debug_03004BC0 = 0; +#endif ClearPlayerAvatarInfo(); for (i = 0; i < 16; i++) { if (gMapObjects[i].active) + { sub_805B75C(i, a, b); +#if DEBUG + gUnknown_Debug_03004BC0++; +#endif + } } sub_805AAB0(); } -#endif extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); extern void sub_805B914(struct MapObject *); diff --git a/src/roulette.c b/src/roulette.c index 9197fe6be..85b1c053b 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -317,7 +317,7 @@ extern const s8 gUnknown_083FA64C[0x8][0x2]; #if DEBUG EWRAM_DATA u8 unk_203955C[4] = { 0 }; -EWRAM_DATA u8 unk_2039560[4] = { 0 }; +EWRAM_DATA u8 unk_2039560 = 0; #endif @@ -1008,7 +1008,7 @@ void sub_811597C(u8 taskid) void sub_81159BC(u8 taskid) { s16 i; - if(eRoulette->var08 & 0x20) + if (eRoulette->var08 & 0x20) { for (i = 0xB; (i < 0xE); i++) if ((eRoulette->var08 & gUnknown_083F8C00[i].var08) == 0) @@ -1380,9 +1380,9 @@ void sub_8116474(u8 taskid) { if (gTasks[taskid].data[0x1]-- > 0x0) { - if(gTasks[taskid].data[0x1] > 0x2) + if (gTasks[taskid].data[0x1] > 0x2) gSpriteCoordOffsetX -= 0x2; - if((eRoulette->var26 -= 0x4) == 0x68) + if ((eRoulette->var26 -= 0x4) == 0x68) gSprites[eRoulette->var3C[0x19]].callback = &sub_81184CC; } else @@ -1400,7 +1400,7 @@ void sub_8116514(u8 taskid) { if (gTasks[taskid].data[0x1]-- > 0x1) { - switch(gTasks[taskid].data[0x1] % 0x10) + switch (gTasks[taskid].data[0x1] % 0x10) { case 0x8: sub_8117AA8(0x0, 0xFF); @@ -1420,14 +1420,14 @@ void sub_8116514(u8 taskid) void sub_811659C(u8 taskid) { - switch(gTasks[taskid].data[0x5]) + switch (gTasks[taskid].data[0x5]) { case 0x1: case 0x2: if (IsFanfareTaskInactive()) { u32 wins = GetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS); - if(wins < ++gTasks[taskid].data[0xB]) + if (wins < ++gTasks[taskid].data[0xB]) SetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS, gTasks[taskid].data[0xB]); sub_8116C34(taskid, &sub_811677C, 0xFFFF, 0x3); } @@ -1444,7 +1444,7 @@ void sub_811659C(u8 taskid) void sub_8116638(u8 taskid) { - switch(gTasks[taskid].data[0x5]) + switch (gTasks[taskid].data[0x5]) { case 0x1: case 0x2: @@ -1474,7 +1474,7 @@ void sub_8116638(u8 taskid) void sub_81166E8(u8 taskid) { s32 r0 = gTasks[taskid].data[0x7]; - switch(r0) + switch (r0) { case 0x0: gTasks[taskid].data[0xD]++; @@ -1684,7 +1684,7 @@ void sub_8116B40(u8 taskid) // end roulette ? void sub_8116BC0(u8 taskid) { - if(eRoulette->varA8 == 0 || gMain.newKeys & eRoulette->varAA) + if (eRoulette->varA8 == 0 || gMain.newKeys & eRoulette->varAA) { gTasks[taskid].func = eRoulette->varAC; if (eRoulette->varAA > 0) @@ -1700,7 +1700,7 @@ void sub_8116BC0(u8 taskid) void sub_8116C34(u8 taskid, TaskFunc r1, u16 r2, u16 r3) { eRoulette->varB4 = gTasks[taskid].func; - if(r1 == NULL) + if (r1 == NULL) r1 = eRoulette->varB4; eRoulette->varAC = r1; eRoulette->varA8 = r2; @@ -1780,7 +1780,7 @@ u8 sub_8116E5C(u8 r0, u8 r1) u8 t = r0; if (--r0 < 0x13) { - switch(r1) + switch (r1) { case 0x0: return 0x3; @@ -1810,7 +1810,7 @@ void sub_8116EF8(u8 r0) u8 var2; u16 var3; u8 i; - switch(r0) + switch (r0) { case 0x5: case 0xA: @@ -1889,7 +1889,7 @@ void sub_8117158(u8 r0) eRoulette->var2A = 0x1; sub_8117AA8(0x0, 0x0); sub_8124E2C(gBGTilemapBuffers[1], (u16 *)ewram18800, 0xE, 0x7, 0x10, 0xD); - switch(r0) + switch (r0) { case 0x0: return; @@ -2327,7 +2327,7 @@ void debug_sub_812CDE4() } __attribute__((naked)) -void debug_sub_812CFE8() +void debug_sub_812CFE8(u8 taskId) { asm("\ push {r4, r5, lr}\n\ @@ -2403,66 +2403,22 @@ void debug_sub_812CFE8() #endif -#if DEBUG -__attribute__((naked)) -void PlayRoulette(void) -{ - asm("\ - push {lr}\n\ - bl ScriptContext2_Enable\n\ - ldr r1, ._604 @ unk_2039560\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ - ldr r0, ._604 + 4 @ unk_203955C\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._602 @cond_branch\n\ - ldr r0, ._604 + 8 @ debug_sub_812CFE8\n\ - mov r1, #0x0\n\ - bl CreateTask\n\ - b ._603\n\ -._605:\n\ - .align 2, 0\n\ -._604:\n\ - .word unk_2039560\n\ - .word unk_203955C\n\ - .word debug_sub_812CFE8+1\n\ -._602:\n\ - ldr r0, ._606 @ Task_Roulette_0\n\ - mov r1, #0x0\n\ - bl CreateTask\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r2, ._606 + 4 @ gTasks\n\ - lsl r1, r0, #0x2\n\ - add r1, r1, r0\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r2\n\ - ldr r0, ._606 + 8 @ gSaveBlock1\n\ - ldr r2, ._606 + 12 @ 0x494\n\ - add r0, r0, r2\n\ - ldrh r0, [r0]\n\ - strh r0, [r1, #0x22]\n\ -._603:\n\ - pop {r0}\n\ - bx r0\n\ -._607:\n\ - .align 2, 0\n\ -._606:\n\ - .word Task_Roulette_0+1\n\ - .word gTasks\n\ - .word gSaveBlock1\n\ - .word 0x494"); -} -#else void PlayRoulette(void) { u8 taskid; + ScriptContext2_Enable(); - taskid = CreateTask(&Task_Roulette_0, 0x0); +#if DEBUG + unk_2039560 = 0; + if (unk_203955C[0] != 0) + { + taskid = CreateTask(debug_sub_812CFE8, 0); + return; + } +#endif + taskid = CreateTask(Task_Roulette_0, 0); gTasks[taskid].data[0xD] = gSaveBlock1.coins; } -#endif void sub_8117838(u8 r0) { @@ -2548,7 +2504,7 @@ void unref_sub_8117A74(void) //destroy all sprites at 0x1D void sub_8117AA8(u8 r0, u8 r1) { u8 i; - switch(r0) + switch (r0) { case 0x1: for (i = 0x0; i < 0x13; i++) @@ -2564,7 +2520,7 @@ void sub_8117AA8(u8 r0, u8 r1) else gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE; } - for ( ; i < 0x13; i++) + for (; i < 0x13; i++) gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE; break; } @@ -2577,7 +2533,7 @@ void sub_8117BBC(void) { eRoulette->var3C[0x31 + i] = CreateSprite(&gSpriteTemplate_83FA40C, 0x74, 0x14, 0xA); gSprites[eRoulette->var3C[0x31 + i]].invisible = TRUE; - gSprites[eRoulette->var3C[0x31 + i]].data[0] = 0x1; + gSprites[eRoulette->var3C[0x31 + i]].data[0] = 0x1; gSprites[eRoulette->var3C[0x31 + i]].callback = &sub_81184CC; gSprites[eRoulette->var3C[0x31 + i]].oam.priority = 0x1; StartSpriteAnim(&gSprites[eRoulette->var3C[0x31 + i]], 0x8); @@ -2731,7 +2687,7 @@ u8 sub_81181E8(u8 r0) // u8 t = {0, 1, 2, 3, 4}; if (r0 >= 20) r0 = 0; - switch(gUnknown_083F8C00[r0].var01_0) + switch (gUnknown_083F8C00[r0].var01_0) { case 0x3: r0 = r0 / 5 - 1; @@ -2766,7 +2722,7 @@ void sub_81182F8(u8 r0) u8 t = 0x0; if (eRoulette->var19 == 0x1) t = 0x2; - switch(r0) + switch (r0) { case 0x6: for (i = 0x0; i < 0x3; i++) @@ -3006,7 +2962,7 @@ void sub_81189A8(struct Sprite *sprite) float f0, f1, f2; struct StructgUnknown_083F8DF4 *p; sub_8118724(sprite); - switch(sprite->data[0x3]) + switch (sprite->data[0x3]) { case 0: if (sprite->data[0x0] != 0x1) @@ -3072,7 +3028,7 @@ void sub_8118BD8(struct Sprite *sprite) if (sprite->data[0x2]++ < 45) { sprite->pos2.y--; - if(sprite->data[0x2] == 45) + if (sprite->data[0x2] == 45) { if (gSprites[eRoulette->var3C[0x37]].animCmdIndex == 0x1) sprite->pos2.y++; @@ -3106,7 +3062,7 @@ void sub_8118BD8(struct Sprite *sprite) void sub_8118CAC(struct Sprite *sprite) { sub_8118724(sprite); - switch(sprite->data[0x3]) + switch (sprite->data[0x3]) { case 90: if (sprite->data[0x0] != 0x1) @@ -3128,7 +3084,7 @@ void sub_8118CAC(struct Sprite *sprite) void sub_8118CEC(struct Sprite *sprite) { sub_8118724(sprite); - switch(eRoulette->var03_0) + switch (eRoulette->var03_0) { default: case 0x0: @@ -3171,96 +3127,30 @@ void sub_8118D2C(struct Sprite *sprite) } #if DEBUG -__attribute__((naked)) -void debug_sub_812E698() + +void debug_sub_812E698(struct Sprite *sprite) { - asm("\ - push {r4, r5, r6, r7, lr}\n\ - add r7, r0, #0\n\ - bl sub_8118724\n\ - mov r0, #0x0\n\ - strh r0, [r7, #0x32]\n\ - add r0, r7, #0\n\ - bl sub_81186B8\n\ - mov r0, #0x38\n\ - bl m4aSongNumStart\n\ - bl Random\n\ - mov r1, #0x1\n\ - and r1, r1, r0\n\ - cmp r1, #0\n\ - beq ._837 @cond_branch\n\ - ldr r4, ._839 @ 0x2019000\n\ - add r1, r4, #0\n\ - add r1, r1, #0x8c\n\ - ldr r0, ._839 + 4 @ 0x0\n\ - str r0, [r1]\n\ - add r0, r4, #0\n\ - add r0, r0, #0x7e\n\ - ldrb r0, [r0]\n\ - add r0, r0, #0x1\n\ - mov r1, #0xc\n\ - bl __modsi3\n\ - add r1, r4, #0\n\ - add r1, r1, #0x7f\n\ - strb r0, [r1]\n\ - add r1, r4, #0\n\ - ldr r4, ._839 + 8 @ gUnknown_083F8DF4\n\ - b ._838\n\ -._840:\n\ - .align 2, 0\n\ -._839:\n\ - .word 0x2019000\n\ - .word 0x0\n\ - .word gUnknown_083F8DF4\n\ -._837:\n\ - ldr r6, ._841 @ 0x2019000\n\ - add r5, r6, #0\n\ - add r5, r5, #0x8c\n\ - ldr r4, ._841 + 4 @ gUnknown_083F8DF4\n\ - ldrb r0, [r6, #0x4]\n\ - lsl r0, r0, #0x1e\n\ - lsr r0, r0, #0x19\n\ - add r1, r4, #0\n\ - add r1, r1, #0x1c\n\ - add r0, r0, r1\n\ - ldr r1, [r0]\n\ - add r0, r1, #0\n\ - bl __addsf3\n\ - str r0, [r5]\n\ - add r0, r6, #0\n\ - add r0, r0, #0x7e\n\ - ldrb r0, [r0]\n\ - add r1, r6, #0\n\ - add r1, r1, #0x7f\n\ - strb r0, [r1]\n\ - add r1, r6, #0\n\ -._838:\n\ - mov r0, #0x1\n\ - strh r0, [r7, #0x2e]\n\ - ldrb r0, [r1, #0x4]\n\ - lsl r0, r0, #0x1e\n\ - lsr r0, r0, #0x19\n\ - add r0, r0, r4\n\ - ldrb r0, [r0, #0x2]\n\ - strh r0, [r7, #0x32]\n\ - add r1, r1, #0x98\n\ - ldr r0, ._841 + 8 @ 0x3dae147b\n\ - str r0, [r1]\n\ - ldr r0, ._841 + 12 @ sub_8118D2C\n\ - str r0, [r7, #0x1c]\n\ - mov r0, #0x5\n\ - strh r0, [r7, #0x30]\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._842:\n\ - .align 2, 0\n\ -._841:\n\ - .word 0x2019000\n\ - .word gUnknown_083F8DF4\n\ - .word 0x3dae147b\n\ - .word sub_8118D2C+1"); + sub_8118724(sprite); + sprite->data[2] = 0; + sub_81186B8(sprite); + m4aSongNumStart(0x38); + if (Random() & 1) + { + eRoulette->var8C = 0; + eRoulette->var7F = (eRoulette->var7E + 1) % 12; + } + else + { + eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C * 2; + eRoulette->var7F = eRoulette->var7E; + } + sprite->data[0] = 1; + sprite->data[2] = gUnknown_083F8DF4[eRoulette->var04_0].var02; + eRoulette->var98 = 0.085; + sprite->callback = sub_8118D2C; + sprite->data[1] = 5; } + #endif void sub_8118DE4(struct Sprite *sprite) @@ -3345,7 +3235,7 @@ void sub_8118F8C(struct Sprite *sprite) / ((float)(s16)(p[eRoulette->var04_0].var04 + 0x1)); sprite->data[0x1] = 0x4; #if DEBUG - if (unk_2039560[0]) + if (unk_2039560 != 0) sprite->callback = debug_sub_812E698; else #endif @@ -3852,17 +3742,16 @@ void sub_811952C(struct Sprite *sprite) void sub_8119780(struct Sprite *sprite) { - if (sprite->data[0x1]++ >= sprite->data[0x3]) + if (sprite->data[1]++ >= sprite->data[3]) { - if ((sprite->pos1.x -= 0x2) < -0x10) + sprite->pos1.x -= 2; + if (sprite->pos1.x < -16) { if (!eRoulette->var03_6) - { eRoulette->var03_6 = TRUE; - } DestroySprite(sprite); - eRoulette->var01 = 0x0; - eRoulette->var34 = gUnknown_083FA61E[0x0]; + eRoulette->var01 = 0; + eRoulette->var34 = gUnknown_083FA61E[0]; } } } @@ -3871,18 +3760,19 @@ void sub_81197D8(struct Sprite *sprite) { u16 t[0x3][0x4]; s32 p, z; - memcpy(t, &gUnknown_083FA632, 0x18); - if (sprite->data[0x1]++ < sprite->data[0x3]) + + memcpy(t, &gUnknown_083FA632, 24); + if (sprite->data[1]++ < sprite->data[3]) { - if(sprite->data[0x1] & 0x1) + if (sprite->data[1] & 1) { - gSpriteCoordOffsetY = t[sprite->data[0x2] / 0x2][sprite->data[0x7]]; - p = z = sprite->data[0x7] + 0x1; + gSpriteCoordOffsetY = t[sprite->data[2] / 2][sprite->data[7]]; + p = z = sprite->data[7] + 1; if (z < 0) - p += 0x3; - sprite->data[0x7] = z - ((p >> 2) * 4); + p += 3; + sprite->data[7] = z - ((p >> 2) * 4); } - sprite->invisible ^= 0x1; + sprite->invisible ^= 1; } else { @@ -3915,7 +3805,7 @@ void sub_8119898(struct Sprite *sprite) void sub_8119964(struct Sprite *sprite) { - if(sprite->data[0x7] == 0x0) + if (sprite->data[0x7] == 0x0) { register u32 t asm("r2"); u32 z ; @@ -4047,7 +3937,7 @@ void sub_8119BCC(struct Sprite *sprite) else { m4aSongNumStartOrChange(0x5E); - if(eRoulette->var38->data[0x0] == 0x0) + if (eRoulette->var38->data[0x0] == 0x0) PlayCry1(SPECIES_TAILLOW, 0x3F); else PlayCry1(SPECIES_TAILLOW, -0x3F); -- cgit v1.2.3 From 5388d28bf33b38bb8dbb825564491feaa89c1787 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sun, 18 Feb 2018 17:37:29 -0600 Subject: decompile more debug code --- src/engine/link.c | 3 +- src/field/item_menu.c | 2 +- src/field/party_menu.c | 2 +- src/pokemon/pokemon_summary_screen.c | 955 +++-------------------------------- src/roulette.c | 509 +------------------ 5 files changed, 113 insertions(+), 1358 deletions(-) (limited to 'src') diff --git a/src/engine/link.c b/src/engine/link.c index db5d0d935..45807830a 100644 --- a/src/engine/link.c +++ b/src/engine/link.c @@ -978,13 +978,12 @@ void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) #if DEBUG -//EWRAM_DATA u16 *debugCharacterBase = NULL; EWRAM_DATA uintptr_t debugCharacterBase = 0; EWRAM_DATA uintptr_t unk_20238C8 = 0; EWRAM_DATA u16 *debugTileMap = NULL; EWRAM_DATA u32 unk_20238D0 = 0; -void debug_sub_8008218(u16 *buffer, void *arg1, u16 *arg2, u32 arg3) +void debug_sub_8008218(u16 *buffer, u32 arg1, u16 *arg2, u32 arg3) { CpuSet(sLinkTestDigitTiles, buffer, 272); debugCharacterBase = (uintptr_t)buffer; diff --git a/src/field/item_menu.c b/src/field/item_menu.c index 05fd3be53..54419643d 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -497,7 +497,7 @@ static bool8 SetupBagMultistep(void) sub_80A78B8(); #if DEBUG if (gLinkOpen == TRUE) - debug_sub_8008218((void *)(VRAM + 0xF5E0), (void *)0x8000, (void *)(VRAM + 0xF800), 0); + debug_sub_8008218((void *)(VRAM + 0xF5E0), 0x8000, (void *)(VRAM + 0xF800), 0); #endif return TRUE; } diff --git a/src/field/party_menu.c b/src/field/party_menu.c index c492307d3..9caaa05b9 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -726,7 +726,7 @@ bool8 InitPartyMenu(void) SetVBlankCallback(VBlankCB_PartyMenu); #if DEBUG if (gLinkOpen == TRUE) - debug_sub_8008218((void *)(VRAM + 0xE5E0), (void *)0x8000, (void *)(VRAM + 0x7800), 2); + debug_sub_8008218((void *)(VRAM + 0xE5E0), 0x8000, (void *)(VRAM + 0x7800), 2); #endif return TRUE; } diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 6ff912a20..0acf465f6 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -41,11 +41,11 @@ static void sub_80A0090(struct Pokemon *); static void sub_80A015C(struct Pokemon *); static void sub_809DE44(void); static void sub_809EB40(u8); -/*static*/ void sub_809EBC4(void); -/*static*/ void sub_809E044(void); +static void sub_809EBC4(void); +static void sub_809E044(void); static void sub_80A1D84(struct Pokemon *); -/*static*/ void sub_80A18C4(void); -/*static*/ bool8 LoadPokemonSummaryScreenGraphics(void); +static void sub_80A18C4(void); +static bool8 LoadPokemonSummaryScreenGraphics(void); static bool8 MonKnowsMultipleMoves(struct Pokemon *); static void PrintSummaryWindowHeaderText(void); static void sub_80A1DCC(struct Pokemon *); @@ -63,8 +63,8 @@ static void PrintHeldItemName(u16, u8, u8); static void PrintNumRibbons(struct Pokemon *); static void DrawExperienceProgressBar(struct Pokemon *, u8, u8); static void sub_809E13C(u8 taskId); -/*static*/ void sub_80A1950(void); -/*static*/ void sub_809DE64(void); +static void sub_80A1950(void); +static void sub_809DE64(void); static void SummaryScreenHandleAButton(u8); static void SummaryScreenHandleUpDownInput(u8, s8); static bool8 sub_809F7D0(u8); @@ -571,51 +571,17 @@ static const u8 sUnknown_083C15BC[] = { -1, 15, 0, 10, }; -#if DEBUG -__attribute__((naked)) -void sub_809D844(void) -{ - asm("\ - push {lr}\n\ - add sp, sp, #0xfffffffc\n\ - bl RunTasks\n\ - bl AnimateSprites\n\ - bl BuildOamBuffer\n\ - bl UpdatePaletteFade\n\ - ldr r0, ._2 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._1 @cond_branch\n\ - ldr r0, ._2 + 4 @ gLink\n\ - ldr r1, ._2 + 8 @ 0xfbd\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - mov r1, #0x3\n\ - str r1, [sp]\n\ - mov r1, #0x14\n\ - mov r2, #0x1\n\ - mov r3, #0x2\n\ - bl debug_sub_8008264\n\ -._1:\n\ - add sp, sp, #0x4\n\ - pop {r0}\n\ - bx r0\n\ -._3:\n\ - .align 2, 0\n\ -._2:\n\ - .word gLinkOpen\n\ - .word gLink\n\ - .word 0xfbd"); -} -#else void sub_809D844(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); -} +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 20, 1, 2, 3); #endif +} void sub_809D85C(void) { @@ -647,13 +613,9 @@ void ShowPokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex pssData.disableMoveOrderEditing = FALSE; if (mode >= PSS_MODE_PC_NORMAL) - { pssData.usingPC = TRUE; - } else - { pssData.usingPC = FALSE; - } switch (mode) { @@ -725,491 +687,6 @@ void sub_809DA1C(void) } } -#if DEBUG -__attribute__((naked)) -bool8 sub_809DA84(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - add sp, sp, #0xfffffff8\n\ - ldr r1, ._52 @ gMain\n\ - ldr r2, ._52 + 4 @ 0x43c\n\ - add r0, r1, r2\n\ - ldrb r0, [r0]\n\ - mov ip, r1\n\ - cmp r0, #0x16\n\ - bls ._50 @cond_branch\n\ - b ._51\n\ -._50:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._52 + 8 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._53:\n\ - .align 2, 0\n\ -._52:\n\ - .word gMain\n\ - .word 0x43c\n\ - .word ._54\n\ -._54:\n\ - .word ._55\n\ - .word ._56\n\ - .word ._57\n\ - .word ._58\n\ - .word ._59\n\ - .word ._60\n\ - .word ._61\n\ - .word ._62\n\ - .word ._63\n\ - .word ._64\n\ - .word ._65\n\ - .word ._66\n\ - .word ._67\n\ - .word ._68\n\ - .word ._69\n\ - .word ._70\n\ - .word ._71\n\ - .word ._72\n\ - .word ._73\n\ - .word ._74\n\ - .word ._75\n\ - .word ._76\n\ - .word ._77\n\ -._55:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl ResetSpriteData\n\ - b ._146\n\ -._56:\n\ - bl ScanlineEffect_Stop\n\ - ldr r1, ._80 @ gMain\n\ - ldr r2, ._80 + 4 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._153\n\ -._81:\n\ - .align 2, 0\n\ -._80:\n\ - .word gMain\n\ - .word 0x43c\n\ -._57:\n\ - bl FreeAllSpritePalettes\n\ - b ._146\n\ -._58:\n\ - mov r2, #0xc0\n\ - lsl r2, r2, #0x13\n\ - mov r3, #0x80\n\ - lsl r3, r3, #0x9\n\ - mov r5, #0x0\n\ - ldr r1, ._85 @ 0x40000d4\n\ - mov r4, #0x80\n\ - lsl r4, r4, #0x5\n\ - ldr r6, ._85 + 4 @ 0x85000400\n\ - mov r7, #0x85\n\ - lsl r7, r7, #0x18\n\ -._83:\n\ - str r5, [sp, #0x4]\n\ - add r0, sp, #0x4\n\ - str r0, [r1]\n\ - str r2, [r1, #0x4]\n\ - str r6, [r1, #0x8]\n\ - ldr r0, [r1, #0x8]\n\ - add r2, r2, r4\n\ - sub r3, r3, r4\n\ - cmp r3, r4\n\ - bhi ._83 @cond_branch\n\ - str r5, [sp, #0x4]\n\ - add r0, sp, #0x4\n\ - str r0, [r1]\n\ - str r2, [r1, #0x4]\n\ - lsr r0, r3, #0x2\n\ - orr r0, r0, r7\n\ - str r0, [r1, #0x8]\n\ - ldr r0, [r1, #0x8]\n\ - ldr r1, ._85 + 8 @ 0x43c\n\ - add r1, r1, ip\n\ - b ._153\n\ -._86:\n\ - .align 2, 0\n\ -._85:\n\ - .word 0x40000d4\n\ - .word 0x85000400\n\ - .word 0x43c\n\ -._59:\n\ - bl sub_809DE64\n\ - ldr r1, ._88 @ gMain\n\ - ldr r2, ._88 + 4 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._153\n\ -._89:\n\ - .align 2, 0\n\ -._88:\n\ - .word gMain\n\ - .word 0x43c\n\ -._60:\n\ - ldr r0, ._91 @ gWindowTemplate_81E6E6C\n\ - bl Text_LoadWindowTemplate\n\ - b ._146\n\ -._92:\n\ - .align 2, 0\n\ -._91:\n\ - .word gWindowTemplate_81E6E6C\n\ -._61:\n\ - ldr r0, ._94 @ gWindowTemplate_81E6E6C\n\ - bl MultistepInitMenuWindowBegin\n\ - ldr r1, ._94 + 4 @ gMain\n\ - ldr r2, ._94 + 8 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._153\n\ -._95:\n\ - .align 2, 0\n\ -._94:\n\ - .word gWindowTemplate_81E6E6C\n\ - .word gMain\n\ - .word 0x43c\n\ -._62:\n\ - bl MultistepInitMenuWindowContinue\n\ - cmp r0, #0\n\ - bne ._96 @cond_branch\n\ - b ._157\n\ -._96:\n\ - b ._146\n\ -._63:\n\ - bl sub_809DA1C\n\ - ldr r1, ._100 @ gMain\n\ - ldr r2, ._100 + 4 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._153\n\ -._101:\n\ - .align 2, 0\n\ -._100:\n\ - .word gMain\n\ - .word 0x43c\n\ -._64:\n\ - ldr r1, ._103 @ gSummaryScreenTextTiles\n\ - ldr r2, ._103 + 4 @ 0x600d000\n\ - ldr r0, ._103 + 8 @ 0x40000d4\n\ - str r1, [r0]\n\ - str r2, [r0, #0x4]\n\ - ldr r1, ._103 + 12 @ 0x800000a0\n\ - str r1, [r0, #0x8]\n\ - ldr r1, [r0, #0x8]\n\ - ldr r1, ._103 + 16 @ sSummaryScreenButtonTiles\n\ - ldr r2, ._103 + 20 @ 0x600d140\n\ - str r1, [r0]\n\ - str r2, [r0, #0x4]\n\ - ldr r1, ._103 + 24 @ 0x80000080\n\ - str r1, [r0, #0x8]\n\ - ldr r0, [r0, #0x8]\n\ - ldr r0, ._103 + 28 @ \n\ - add r0, r0, #0x74\n\ - mov r1, #0x0\n\ - strb r1, [r0]\n\ - ldr r1, ._103 + 32 @ \n\ - add r1, r1, ip\n\ - b ._153\n\ -._104:\n\ - .align 2, 0\n\ -._103:\n\ - .word gSummaryScreenTextTiles\n\ - .word 0x600d000\n\ - .word 0x40000d4\n\ - .word 0x800000a0\n\ - .word sSummaryScreenButtonTiles\n\ - .word 0x600d140\n\ - .word 0x80000080\n\ - .word +0x2018000\n\ - .word 0x43c\n\ -._65:\n\ - bl LoadPokemonSummaryScreenGraphics\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._105 @cond_branch\n\ - b ._157\n\ -._105:\n\ - ldr r0, ._108 @ \n\ - add r0, r0, #0x74\n\ - mov r1, #0x0\n\ - strb r1, [r0]\n\ - b ._146\n\ -._109:\n\ - .align 2, 0\n\ -._108:\n\ - .word +0x2018000\n\ -._66:\n\ - bl sub_80A18C4\n\ - ldr r1, ._111 @ gMain\n\ - ldr r2, ._111 + 4 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._153\n\ -._112:\n\ - .align 2, 0\n\ -._111:\n\ - .word gMain\n\ - .word 0x43c\n\ -._67:\n\ - ldr r4, ._115 @ \n\ - add r0, r4, #0\n\ - bl sub_809F678\n\ - add r0, r4, #0\n\ - bl GetMonStatusAndPokerus\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._113 @cond_branch\n\ - mov r0, #0x0\n\ - bl sub_80A12D0\n\ - b ._114\n\ -._116:\n\ - .align 2, 0\n\ -._115:\n\ - .word +0x2018010\n\ -._113:\n\ - mov r0, #0xa\n\ - bl sub_80A12D0\n\ -._114:\n\ - ldr r0, ._118 @ \n\ - bl DrawPokerusSurvivorDot\n\ - b ._146\n\ -._119:\n\ - .align 2, 0\n\ -._118:\n\ - .word +0x2018010\n\ -._68:\n\ - bl sub_80A1950\n\ - ldr r0, ._121 @ \n\ - bl sub_80A1D84\n\ - ldr r1, ._121 + 4 @ \n\ - ldr r2, ._121 + 8 @ \n\ - add r1, r1, r2\n\ - b ._153\n\ -._122:\n\ - .align 2, 0\n\ -._121:\n\ - .word +0x2018010\n\ - .word gMain\n\ - .word 0x43c\n\ -._69:\n\ - ldr r4, ._124 @ \n\ - add r0, r4, #0\n\ - bl sub_80A1DE8\n\ - add r4, r4, #0x64\n\ - mov r0, #0x0\n\ - strb r0, [r4]\n\ - b ._146\n\ -._125:\n\ - .align 2, 0\n\ -._124:\n\ - .word +0x2018010\n\ -._70:\n\ - ldr r4, ._129 @ \n\ - add r5, r4, #0\n\ - add r5, r5, #0x64\n\ - add r0, r4, #0\n\ - add r1, r5, #0\n\ - bl sub_809F6B4\n\ - sub r4, r4, #0x10\n\ - strb r0, [r4, #0xc]\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - cmp r0, #0xff\n\ - bne ._126 @cond_branch\n\ - b ._157\n\ -._126:\n\ - mov r0, #0x0\n\ - strb r0, [r5]\n\ - ldr r1, ._129 + 4 @ \n\ - ldr r2, ._129 + 8 @ \n\ - add r1, r1, r2\n\ - b ._153\n\ -._130:\n\ - .align 2, 0\n\ -._129:\n\ - .word +0x2018010\n\ - .word gMain\n\ - .word 0x43c\n\ -._71:\n\ - bl sub_809E044\n\ - bl DrawSummaryScreenNavigationDots\n\ - b ._146\n\ -._72:\n\ - ldr r1, ._134 @ \n\ - ldrb r0, [r1, #0xb]\n\ - cmp r0, #0x1\n\ - bhi ._132 @cond_branch\n\ - ldr r0, ._134 + 4 @ \n\ - ldrb r1, [r1, #0xb]\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r0\n\ - ldr r0, [r1]\n\ - bl _call_via_r0\n\ -._132:\n\ - ldr r1, ._134 + 8 @ \n\ - ldr r2, ._134 + 12 @ \n\ - add r1, r1, r2\n\ - b ._153\n\ -._135:\n\ - .align 2, 0\n\ -._134:\n\ - .word +0x2018000\n\ - .word sUnknown_083C1580\n\ - .word gMain\n\ - .word 0x43c\n\ -._73:\n\ - ldr r0, ._137 @ \n\ - bl sub_809FAC8\n\ - b ._146\n\ -._138:\n\ - .align 2, 0\n\ -._137:\n\ - .word +0x2018010\n\ -._74:\n\ - ldr r2, ._140 @ sUnknown_083C1598\n\ - ldr r0, ._140 + 4 @ \n\ - ldrb r1, [r0, #0xb]\n\ - lsl r1, r1, #0x2\n\ - add r1, r1, r2\n\ - add r0, r0, #0x10\n\ - ldr r1, [r1]\n\ - bl _call_via_r1\n\ - ldr r1, ._140 + 8 @ \n\ - ldr r2, ._140 + 12 @ \n\ - add r1, r1, r2\n\ - b ._153\n\ -._141:\n\ - .align 2, 0\n\ -._140:\n\ - .word sUnknown_083C1598\n\ - .word +0x2018000\n\ - .word gMain\n\ - .word 0x43c\n\ -._75:\n\ - ldr r0, ._144 @ \n\ - mov r1, #0x2d\n\ - bl GetMonData\n\ - add r1, r0, #0\n\ - cmp r1, #0\n\ - beq ._142 @cond_branch\n\ - ldr r1, ._144 + 4 @ \n\ - mov r2, #0x80\n\ - lsl r2, r2, #0x1\n\ - add r0, r2, #0\n\ - strh r0, [r1]\n\ - b ._146\n\ -._145:\n\ - .align 2, 0\n\ -._144:\n\ - .word +0x2018010\n\ - .word gBattle_BG3_X\n\ -._142:\n\ - ldr r0, ._147 @ gBattle_BG3_X\n\ - strh r1, [r0]\n\ - b ._146\n\ -._148:\n\ - .align 2, 0\n\ -._147:\n\ - .word gBattle_BG3_X\n\ -._76:\n\ - bl sub_809EBC4\n\ - ldr r0, ._151 @ \n\ - add r0, r0, #0x79\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._149 @cond_branch\n\ - mov r0, #0x0\n\ - mov r1, #0x0\n\ - bl sub_80A1488\n\ - mov r0, #0x0\n\ - mov r1, #0x0\n\ - bl sub_80A1654\n\ - b ._150\n\ -._152:\n\ - .align 2, 0\n\ -._151:\n\ - .word +0x2018000\n\ -._149:\n\ - mov r0, #0xa\n\ - mov r1, #0x0\n\ - bl sub_80A1488\n\ - mov r0, #0xa\n\ - mov r1, #0x0\n\ - bl sub_80A1654\n\ -._150:\n\ - bl PrintSummaryWindowHeaderText\n\ - ldr r1, ._154 @ gMain\n\ - ldr r2, ._154 + 4 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._153\n\ -._155:\n\ - .align 2, 0\n\ -._154:\n\ - .word gMain\n\ - .word 0x43c\n\ -._77:\n\ - bl sub_8055870\n\ - cmp r0, #0x1\n\ - beq ._157 @cond_branch\n\ -._146:\n\ - ldr r1, ._158 @ gMain\n\ - ldr r0, ._158 + 4 @ 0x43c\n\ - add r1, r1, r0\n\ -._153:\n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - b ._157\n\ -._159:\n\ - .align 2, 0\n\ -._158:\n\ - .word gMain\n\ - .word 0x43c\n\ -._51:\n\ - ldr r0, ._162 @ sub_809D85C\n\ - bl SetVBlankCallback\n\ - mov r0, #0x1\n\ - str r0, [sp]\n\ - mov r0, #0xff\n\ - mov r1, #0x0\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginHardwarePaletteFade\n\ - ldr r0, ._162 + 4 @ sub_809D844\n\ - bl SetMainCallback2\n\ - ldr r2, ._162 + 8 @ gPaletteFade\n\ - ldrb r1, [r2, #0x8]\n\ - mov r0, #0x7f\n\ - and r0, r0, r1\n\ - strb r0, [r2, #0x8]\n\ - ldr r0, ._162 + 12 @ gLinkOpen\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x1\n\ - bne ._160 @cond_branch\n\ - ldr r0, ._162 + 16 @ 0x600dde0\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x8\n\ - ldr r2, ._162 + 20 @ 0x600f000\n\ - mov r3, #0x3\n\ - bl debug_sub_8008218\n\ -._160:\n\ - mov r0, #0x1\n\ - b ._161\n\ -._163:\n\ - .align 2, 0\n\ -._162:\n\ - .word sub_809D85C+1\n\ - .word sub_809D844+1\n\ - .word gPaletteFade\n\ - .word gLinkOpen\n\ - .word 0x600dde0\n\ - .word 0x600f000\n\ -._157:\n\ - mov r0, #0x0\n\ -._161:\n\ - add sp, sp, #0x8\n\ - pop {r4, r5, r6, r7}\n\ - pop {r1}\n\ - bx r1"); -} -#else bool8 sub_809DA84(void) { switch (gMain.state) @@ -1245,9 +722,7 @@ bool8 sub_809DA84(void) break; case 7: if (MultistepInitMenuWindowContinue()) - { gMain.state++; - } break; case 8: sub_809DA1C(); @@ -1273,14 +748,9 @@ bool8 sub_809DA84(void) case 12: sub_809F678(&pssData.loadedMon); if (!GetMonStatusAndPokerus(&pssData.loadedMon)) - { sub_80A12D0(0); - } else - { sub_80A12D0(10); - } - DrawPokerusSurvivorDot(&pssData.loadedMon); gMain.state++; break; @@ -1308,10 +778,7 @@ bool8 sub_809DA84(void) break; case 17: if (pssData.page <= PSS_PAGE_SKILLS) - { sUnknown_083C1580[pssData.page](); - } - gMain.state++; break; case 18: @@ -1324,14 +791,9 @@ bool8 sub_809DA84(void) break; case 20: if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) - { gBattle_BG3_X = 256; - } else - { gBattle_BG3_X = 0; - } - gMain.state++; break; case 21: @@ -1346,28 +808,27 @@ bool8 sub_809DA84(void) sub_80A1488(10, 0); sub_80A1654(10, 0); } - PrintSummaryWindowHeaderText(); gMain.state++; break; case 22: if (sub_8055870() != TRUE) - { gMain.state++; - } break; default: SetVBlankCallback(sub_809D85C); BeginHardwarePaletteFade(0xFF, 0, 16, 0, 1); SetMainCallback2(sub_809D844); gPaletteFade.bufferTransferDisabled = 0; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0xDDE0), 0x8000, (void *)(VRAM + 0xF000), 3); +#endif return TRUE; - break; } return FALSE; } -#endif static void sub_809DE44(void) { @@ -1375,7 +836,7 @@ static void sub_809DE44(void) ; } -/*static*/ void sub_809DE64(void) +static void sub_809DE64(void) { REG_BG0CNT = 0x1E08; REG_BG1CNT = 0x4801; @@ -1402,7 +863,7 @@ static void sub_809DE44(void) REG_DISPCNT = 0x1F40; } -/*static*/ bool8 LoadPokemonSummaryScreenGraphics(void) +static bool8 LoadPokemonSummaryScreenGraphics(void) { switch (pssData.loadGfxState) { @@ -1452,7 +913,7 @@ static void sub_809DE44(void) return FALSE; } -/*static*/ void sub_809E044(void) +static void sub_809E044(void) { LoadPalette(gUnknownPalette_81E6692 + 14, 129, 2); LoadPalette(gUnknownPalette_81E6692 + 15, 136, 2); @@ -1517,14 +978,9 @@ static void SummaryScreenHandleKeyInput(u8 taskId) else if (gMain.newKeys & A_BUTTON) { if (pssData.page >= PSS_PAGE_BATTLE_MOVES) - { SummaryScreenHandleAButton(taskId); - } - if (pssData.page == PSS_PAGE_INFO) - { SummaryScreenExit(taskId); - } } else if (gMain.newKeys & B_BUTTON) { @@ -1550,10 +1006,7 @@ static void sub_809E260(u8 taskId) else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) { if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) - { Menu_EraseWindowRect(0, 14, 9, 18); - } - SummaryScreenHandleLeftRightInput(taskId, -1); } else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) @@ -1561,10 +1014,7 @@ static void sub_809E260(u8 taskId) if (pssData.page != pssData.lastPage) { if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) - { Menu_EraseWindowRect(0, 14, 9, 18); - } - SummaryScreenHandleLeftRightInput(taskId, 1); } } @@ -1645,9 +1095,7 @@ static bool8 MonKnowsMultipleMoves(struct Pokemon *mon) for (i = 1; i < 4; i++) { if (GetMonMove(mon, i)) - { return TRUE; - } } return FALSE; @@ -1758,13 +1206,9 @@ static void sub_809E83C(u8 taskId, s8 b) if (pssData.selectedMoveIndex != pssData.switchMoveIndex) { if (pssData.usingPC == FALSE) - { sub_809E5C4(); - } else - { sub_809E6D8(); - } pssData.selectedMoveIndex = pssData.switchMoveIndex; sub_809F678(&pssData.loadedMon); @@ -2031,7 +1475,7 @@ static void sub_809EB40(u8 taskId) } } -/*static*/ void sub_809EBC4(void) +static void sub_809EBC4(void) { if (pssData.page != PSS_PAGE_INFO) { @@ -2060,36 +1504,24 @@ void sub_809EC38(u8 taskId) if (pssData.bgToggle == 0) { if (pssData.page != PSS_PAGE_INFO) - { gBattle_BG2_X = 0x100; - } if (pssData.page == PSS_PAGE_SKILLS) - { REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0x800; - } if (pssData.page == PSS_PAGE_BATTLE_MOVES) - { REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0xA00; - } } else { if (pssData.page != PSS_PAGE_INFO) - { gBattle_BG1_X = 0x100; - } if (pssData.page == PSS_PAGE_SKILLS) - { REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; - } if (pssData.page == PSS_PAGE_BATTLE_MOVES) - { REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; - } } taskData[0]++; @@ -2131,19 +1563,12 @@ void sub_809EC38(u8 taskId) else { if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT)) - { pssData.headerActionTextId = 6; - } else if (pssData.page == PSS_PAGE_INFO) - { pssData.headerActionTextId = 7; - } else - { pssData.headerActionTextId = 0; - } } - taskData[0]++; break; case 3: @@ -2158,26 +1583,21 @@ void sub_809EC38(u8 taskId) break; case 5: if (sub_8055870() != TRUE) - { gTasks[taskId].func = gUnknown_03005CF0; - } break; } } void sub_809EE74(u8 taskId) { - int var1; - u8 minus2; s16 *taskData = gTasks[taskId].data; switch (taskData[0]) { case 0: - var1 = pssData.bgToggle; - if (var1 == 0) + if (pssData.bgToggle == 0) { - gBattle_BG2_X = pssData.bgToggle; + gBattle_BG2_X = 0; taskData[0]++; } else @@ -2219,27 +1639,20 @@ void sub_809EE74(u8 taskId) case 2: if (pssData.bgToggle == 0) { - int var2 = gBattle_BG2_X + 0x20; - gBattle_BG2_X = var2; - if ((var2 << 16) == 0x1000000) - { + gBattle_BG2_X += 32; + if (gBattle_BG2_X == 0x100) taskData[0]++; - } } else { - int var2 = gBattle_BG1_X + 0x20; - gBattle_BG1_X = var2; - if ((var2 << 16) == 0x1000000) - { + gBattle_BG1_X += 32; + if (gBattle_BG1_X == 0x100) taskData[0]++; - } } break; case 3: pssData.headerTextId = pssData.page + 1; - minus2 = pssData.mode - 2; - if (minus2 < 2) + if (pssData.mode == 2 || pssData.mode == 3) { pssData.headerActionTextId = 0; sub_80A029C(&pssData.loadedMon); @@ -2249,19 +1662,12 @@ void sub_809EE74(u8 taskId) else { if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT)) - { pssData.headerActionTextId = 6; - } else if (pssData.page == PSS_PAGE_INFO) - { pssData.headerActionTextId = 7; - } else - { pssData.headerActionTextId = 0; - } } - taskData[0]++; break; case 4: @@ -2276,9 +1682,7 @@ void sub_809EE74(u8 taskId) break; case 6: if (sub_8055870() != TRUE) - { gTasks[taskId].func = gUnknown_03005CF0; - } break; } } @@ -2305,9 +1709,10 @@ static void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction) { if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) { - if (direction == -1 && pssData.page == pssData.firstPage) return; - if (direction == 1 && pssData.page == pssData.lastPage) return; - + if (direction == -1 && pssData.page == pssData.firstPage) + return; + if (direction == 1 && pssData.page == pssData.lastPage) + return; if (FindTaskIdByFunc(sub_80A1334) == 0xFF && FindTaskIdByFunc(sub_80A1500) == 0xFF) { PlaySE(SE_SELECT); @@ -2580,11 +1985,8 @@ bool8 sub_809F310(struct Pokemon *mon) if (GetMonData(mon, MON_DATA_SPECIES)) { if (pssData.page != PSS_PAGE_INFO || !GetMonData(mon, MON_DATA_IS_EGG)) - { return TRUE; - } } - return FALSE; } @@ -2594,14 +1996,9 @@ s8 sub_809F344(u8 partyIndex) { partyIndex++; if (partyIndex == PARTY_SIZE) - { return -1; - } - if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE) - { return sDoubleBattlePartyOrder[partyIndex]; - } } } @@ -2610,15 +2007,10 @@ s8 sub_809F388(u8 partyIndex) while (1) { if (partyIndex == 0) - { return -1; - } - partyIndex--; if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE) - { return sDoubleBattlePartyOrder[partyIndex]; - } } } @@ -2637,18 +2029,11 @@ s8 sub_809F3CC(s8 direction) } if ((direction == -1 && monIndex == 0) || (direction == 1 && monIndex == 5)) - { return -1; - } - if (direction != 1) - { return sub_809F388(monIndex); - } else if (monIndex != 5) - { return sub_809F344(monIndex); - } return -1; } @@ -2677,10 +2062,7 @@ void sub_809F43C(u8 taskId) case 4: sub_809F678(&pssData.loadedMon); if (GetMonStatusAndPokerus(&pssData.loadedMon)) - { sub_80A12D0(2); - } - DrawPokerusSurvivorDot(&pssData.loadedMon); gMain.state++; break; @@ -2689,14 +2071,9 @@ void sub_809F43C(u8 taskId) { pssData.loadGfxState = 0; if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) - { gBattle_BG3_X = 256; - } else - { gBattle_BG3_X = 0; - } - gMain.state++; } break; @@ -2848,10 +2225,7 @@ static bool8 sub_809F7D0(u8 taskId) sub_809F678(&mon); move = GetMonMove(&mon, pssData.selectedMoveIndex); if (IsHMMove(move) == TRUE && pssData.mode != PSS_MODE_UNKNOWN) - { return FALSE; - } - return TRUE; } @@ -2884,9 +2258,7 @@ void sub_809F814(u8 taskId) if (pssData.page != PSS_PAGE_BATTLE_MOVES) { if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) - { Menu_EraseWindowRect(0, 14, 9, 18); - } gTasks[taskId].func = sub_809E260; @@ -2900,9 +2272,7 @@ void sub_809F814(u8 taskId) if (pssData.page != pssData.lastPage) { if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) - { Menu_EraseWindowRect(0, 14, 9, 18); - } gTasks[taskId].func = sub_809E260; @@ -3055,9 +2425,7 @@ static void sub_809FBE4(void) u8 i; for (i = 0; i < 28; i++) - { sub_80A1918(i, 1); - } Menu_EraseWindowRect(11, 4, 29, 18); } @@ -3079,9 +2447,7 @@ static void sub_809FC34(struct Pokemon *mon) u8 ability; for (i = 0; i < 5; i++) - { sub_80A1918(i, 1); - } Menu_EraseWindowRect(11, 9, 28, 12); if (GetMonData(mon, MON_DATA_IS_EGG)) @@ -3101,21 +2467,13 @@ static void sub_809FC34(struct Pokemon *mon) friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); if (friendship < 6) - { Menu_PrintText(gOtherText_EggAbout, 11, 9); - } else if (friendship < 11) - { Menu_PrintText(gOtherText_EggSoon, 11, 9); - } else if (friendship < 41) - { Menu_PrintText(gOtherText_EggSomeTime, 11, 9); - } else - { Menu_PrintText(gOtherText_EggLongTime, 11, 9); - } PokemonSummaryScreen_PrintEggTrainerMemo(mon, 11, 14); } @@ -3130,13 +2488,9 @@ static void sub_809FC34(struct Pokemon *mon) buffer = StringCopy(buffer, gOtherText_OriginalTrainer); if (GetMonData(mon, MON_DATA_OT_GENDER) == MALE) - { buffer = sub_80A1E58(buffer, 9); - } else - { buffer = sub_80A1E58(buffer, 10); - } buffer = StringCopy(buffer, gStringVar2); buffer[0] = EXT_CTRL_CODE_BEGIN; @@ -3150,9 +2504,7 @@ static void sub_809FC34(struct Pokemon *mon) species = GetMonData(mon, MON_DATA_SPECIES); sub_80A198C(gBaseStats[species].type1, 120, 48, 0); if (gBaseStats[species].type1 != gBaseStats[species].type2) - { sub_80A198C(gBaseStats[species].type2, 160, 48, 1); - } ability = GetAbilityBySpecies(GetMonData(mon, MON_DATA_SPECIES), GetMonData(mon, MON_DATA_ALT_ABILITY)); sub_80A1FF8(gAbilityNames[ability], 13, 11, 9); @@ -3197,9 +2549,7 @@ static void sub_809FF64(struct Pokemon *mon) u8 *buffer; for (i = 0; i < 5; i++) - { sub_80A1918(i, 1); - } heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); PrintHeldItemName(heldItem, 11, 4); @@ -3289,13 +2639,9 @@ static void sub_80A015C(struct Pokemon *mon) else { if (pssData.page == PSS_PAGE_BATTLE_MOVES) - { sub_80A198C(gBattleMoves[move].type, 87, ((2 * i) + 4) * 8, i); - } else - { sub_80A198C(gContestMoves[move].contestCategory + 18, 87, ((2 * i) + 4) * 8, i); - } sub_80A1FF8(gMoveNames[move], 13, 15, (2 * i) + 4); GetStringCenterAlignXOffset(1, 24, (2 * i) + 4); @@ -3351,9 +2697,7 @@ static void sub_80A0390(void) u8 i; for (i = 0; i < MAX_MON_MOVES; i++) - { Menu_EraseWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5); - } } u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex) @@ -3367,13 +2711,9 @@ u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex) else { if (pssData.moveToLearn != 0) - { move = pssData.moveToLearn; - } else - { move = 0xFFFF; - } } return move; @@ -3400,61 +2740,56 @@ static void sub_80A0428(struct Pokemon *mon, u8 *selectedMoveIndex) Menu_EraseWindowRect(11, 15, 28, 18); if (pssData.page == PSS_PAGE_BATTLE_MOVES) - { sub_80A046C(move); - } else - { sub_80A0498(move); - } sub_80A03F0(mon, selectedMoveIndex); } static void sub_80A046C(u16 move) { - if (move == 0xFFFF) return; - - Menu_PrintText(gMoveDescriptions[move - 1], 11, 15); + if (move != 0xFFFF) + Menu_PrintText(gMoveDescriptions[move - 1], 11, 15); } static void sub_80A0498(u16 move) { - if (move == 0xFFFF) return; - - Menu_PrintText(gContestEffectStrings[gContestMoves[move].effect], 11, 15); + if (move != 0xFFFF) + Menu_PrintText(gContestEffectStrings[gContestMoves[move].effect], 11, 15); } static void sub_80A04CC(u16 move) { u8 *buffer; - if (move == 0xFFFF) return; - - if (gBattleMoves[move].power <= 1) - { - buffer = gStringVar1; - buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); - Menu_PrintText(gStringVar1, 7, 15); - } - else + if (move != 0xFFFF) { - buffer = gStringVar1; - buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1); - Menu_PrintText(gStringVar1, 7, 15); - } + if (gBattleMoves[move].power <= 1) + { + buffer = gStringVar1; + buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); + Menu_PrintText(gStringVar1, 7, 15); + } + else + { + buffer = gStringVar1; + buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1); + Menu_PrintText(gStringVar1, 7, 15); + } - if (gBattleMoves[move].accuracy == 0) - { - buffer = gStringVar1; - buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); - Menu_PrintText(gStringVar1, 7, 17); - } - else - { - buffer = gStringVar1; - buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1); - Menu_PrintText(gStringVar1, 7, 17); + if (gBattleMoves[move].accuracy == 0) + { + buffer = gStringVar1; + buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); + Menu_PrintText(gStringVar1, 7, 17); + } + else + { + buffer = gStringVar1; + buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1); + Menu_PrintText(gStringVar1, 7, 17); + } } } @@ -3470,9 +2805,7 @@ static void sub_80A057C(u16 move) appeal = gContestEffects[gContestMoves[move].effect].appeal; if (appeal != 0xFF) - { appeal = appeal / 10; - } for (i = 0; i < 8; i++) { @@ -3480,9 +2813,7 @@ static void sub_80A057C(u16 move) int and = 3; int offset = 0x3CC / 2; if (appeal != 0xFF && i < appeal) - { tile = 0x103A; - } *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile; } @@ -3706,12 +3037,8 @@ static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left, #if ENGLISH ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); - if (nature != NATURE_BOLD && nature != NATURE_GENTLE) - { ptr = StringCopy(ptr, gOtherText_Terminator4); - } - ptr = StringCopy(ptr, gOtherText_Nature); #elif GERMAN ptr = StringCopy(gStringVar4, gOtherText_Nature); @@ -3926,20 +3253,14 @@ static void PrintNumRibbons(struct Pokemon *mon) static void PrintHeldItemName(u16 itemId, u8 left, u8 top) { if (itemId == ITEM_ENIGMA_BERRY - && sub_80F9344() == TRUE - && IsLinkDoubleBattle() == TRUE - && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5)) - { + && sub_80F9344() == TRUE + && IsLinkDoubleBattle() == TRUE + && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5)) StringCopy(gStringVar1, ItemId_GetName(itemId)); - } else if (itemId == 0) - { StringCopy(gStringVar1, gOtherText_None); - } else - { CopyItemName(itemId, gStringVar1); - } Menu_PrintText(sUnknown_083C15B4, left, top); } @@ -3995,13 +3316,9 @@ static void DrawExperienceProgressBar(struct Pokemon *mon, u8 left, u8 top) u16 baseTile = 0x2062; if (numExpProgressBarTicks > 7) - { tile = 0x206A; // full exp. bar block - } else - { tile = (numExpProgressBarTicks % 8) + baseTile; - } vramAddr[i] = tile; @@ -4657,13 +3974,9 @@ static void sub_80A12D0(s8 a) gTasks[newTaskId].data[0] = a; if (a < 0) - { gTasks[newTaskId].data[1] = 10; - } else - { gTasks[newTaskId].data[1] = 0; - } gTasks[newTaskId].data[2] = 1; } @@ -4915,26 +4228,18 @@ static void sub_80A1488(s8 a, u8 b) u8 taskId; if (pssData.page == PSS_PAGE_BATTLE_MOVES) - { Menu_EraseWindowRect(0, 14, 9, 19); - } taskId = FindTaskIdByFunc(sub_80A1334); if (taskId == 0xFF) - { taskId = CreateTask(sub_80A1334, 0); - } - gTasks[taskId].data[0] = (s8)a; + gTasks[taskId].data[0] = a; - if ((s8)a < 0) - { + if (a < 0) gTasks[taskId].data[1] = 10; - } else - { gTasks[taskId].data[1] = 0; - } gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = b; @@ -5117,26 +4422,18 @@ static void sub_80A1654(s8 a, u8 b) u8 taskId; if (pssData.page == PSS_PAGE_CONTEST_MOVES) - { Menu_EraseWindowRect(0, 14, 9, 19); - } taskId = FindTaskIdByFunc(sub_80A1500); if (taskId == 0xFF) - { taskId = CreateTask(sub_80A1500, 0); - } - gTasks[taskId].data[0] = (s8)a; + gTasks[taskId].data[0] = a; - if ((s8)a < 0) - { + if (a < 0) gTasks[taskId].data[1] = 10; - } else - { gTasks[taskId].data[1] = 0; - } gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = b; @@ -5374,13 +4671,9 @@ u8 sub_80A1808(struct Pokemon *mon) gSprites[spriteId].callback = sub_80A1888; if (!IsPokeSpriteNotFlipped(species)) - { - gSprites[spriteId].hFlip = 1; - } + gSprites[spriteId].hFlip = TRUE; else - { - gSprites[spriteId].hFlip = 0; - } + gSprites[spriteId].hFlip = FALSE; return spriteId; } @@ -5392,20 +4685,16 @@ static void sub_80A1888(struct Sprite *sprite) sprite->callback = SpriteCallbackDummy; if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) - { PlayCry1(sprite->data[0], 0); - } } } -/*static*/ void sub_80A18C4(void) +static void sub_80A18C4(void) { u8 i; for (i = 0; i < 30; i++) - { ewram1A000[i] = 0xFF; - } } static void sub_80A18E4(u8 a) @@ -5422,16 +4711,14 @@ static void sub_80A1918(u8 a, u8 invisible) gSprites[ewram1A000[a]].invisible = invisible; } -/*static*/ void sub_80A1950(void) +static void sub_80A1950(void) { u8 i; for (i = 0; i < 5; i++) { if (ewram1A000[i] == 0xFF) - { ewram1A000[i] = CreateSprite(&sSpriteTemplate_83C11C0, 0, 0, 2); - } sub_80A1918(i, 1); } @@ -5457,9 +4744,7 @@ static void sub_80A1A30(u8 a) if (pssData.page >= PSS_PAGE_BATTLE_MOVES) { if (a == 9) - { subPriority = 1; - } for (i = 0; i < 10; i++) { @@ -5467,17 +4752,11 @@ static void sub_80A1A30(u8 a) ewram1A000[a + i] = CreateSprite(&sSpriteTemplate_83C1280, x, 40, subPriority); if (i == 0) - { StartSpriteAnim(&gSprites[ewram1A000[a]], 4); - } else if (i == 9) - { StartSpriteAnim(&gSprites[ewram1A000[a + i]], 5); - } else - { StartSpriteAnim(&gSprites[ewram1A000[a + i]], 6); - } gSprites[ewram1A000[a + i]].callback = sub_80A1BC0; gSprites[ewram1A000[a + i]].data[0] = a; @@ -5491,9 +4770,7 @@ static void sub_80A1B1C(u8 a) u8 i; for (i = 0; i < 10; i++) - { sub_80A18E4(a + i); - } } static void sub_80A1B40(u8 a) @@ -5504,28 +4781,21 @@ static void sub_80A1B40(u8 a) StartSpriteAnim(&gSprites[ewram1A000[9]], a + 4); for (i = 0; i < 8; i++) - { StartSpriteAnim(&gSprites[ewram1A000[10 + i]], a + 6); - } StartSpriteAnim(&gSprites[ewram1A000[18]], a + 5); } static void sub_80A1BC0(struct Sprite *sprite) { - u8 animNum = sprite->animNum - 4; - if (animNum < 3) + if (sprite->animNum == 4 || sprite->animNum == 5 || sprite->animNum == 6) { sprite->data[1] = (sprite->data[1] + 1) & 0x1F; if (sprite->data[1] > 24) - { - sprite->invisible = 1; - } + sprite->invisible = TRUE; else - { - sprite->invisible = 0; - } + sprite->invisible = FALSE; } else { @@ -5534,69 +4804,23 @@ static void sub_80A1BC0(struct Sprite *sprite) } if (sprite->data[0] == 9) - { sprite->pos2.y = pssData.selectedMoveIndex * 16; - } else - { sprite->pos2.y = pssData.switchMoveIndex * 16; - } } -__attribute__((naked)) +#define shared1A009 ((u8 *)(gSharedMem + 0x1A009)) + void sub_80A1C30(u8 a) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 25\n\ - lsrs r3, r0, 24\n\ - adds r4, r3, 0\n\ - adds r0, r3, 0\n\ - adds r0, 0xA\n\ - cmp r3, r0\n\ - bge _080A1C82\n\ - ldr r5, _080A1C88 @ =gSprites\n\ - movs r7, 0x5\n\ - negs r7, r7\n\ - ldr r6, _080A1C8C @ =gSharedMem + 0x1A009\n\ -_080A1C50:\n\ - adds r2, r3, r6\n\ - ldrb r1, [r2]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - movs r1, 0\n\ - strh r1, [r0, 0x30]\n\ - ldrb r0, [r2]\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - adds r1, 0x3E\n\ - ldrb r2, [r1]\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - strb r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - adds r0, r4, 0\n\ - adds r0, 0xA\n\ - cmp r3, r0\n\ - blt _080A1C50\n\ -_080A1C82:\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A1C88: .4byte gSprites\n\ -_080A1C8C: .4byte gSharedMem + 0x1A009\n\ - .syntax divided\n"); + u8 r3; + + a *= 10; + for (r3 = a; r3 < a + 10; r3++) + { + gSprites[shared1A009[r3]].data[1] = 0; + gSprites[shared1A009[r3]].invisible = FALSE; + } } u8 pokemon_ailments_get_primary(u32 status) @@ -5620,21 +4844,15 @@ u8 GetMonStatusAndPokerus(struct Pokemon *mon) u8 statusAilment; if (GetMonData(mon, MON_DATA_HP) == 0) - { return 7; - } statusAilment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)); if (statusAilment == 0) { if (!CheckPartyPokerus(mon, 0)) - { return 0; - } else - { return 6; - } } return statusAilment; @@ -5655,9 +4873,7 @@ void sub_80A1D18(void) statusAndPkrs2 = statusAndPkrs - 1; if (ewram1A000[29] == 0xFF) - { ewram1A000[29] = CreateSprite(&sSpriteTemplate_83C1304, 64, 152, 0); - } } else { @@ -5763,10 +4979,9 @@ static u8 *sub_80A1E58(u8 *text, u8 id) if (id != 0xFF) { const u8 *ptr = sUnknown_083C15BC; + while (*ptr != 0xFF && *ptr != id) - { ptr += 4; - } text[0] = EXT_CTRL_CODE_BEGIN; text[1] = 4; @@ -5836,9 +5051,7 @@ u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level) dest++; if (level == 0) - { level = 5; - } ConvertIntToDecimalString(buffer, level); dest = sub_80A1E9C(dest, buffer, 14); @@ -5857,7 +5070,5 @@ static void sub_80A2078(int taskId) static void sub_80A20A8(u8 taskId) { if (sub_8055870() != TRUE) - { gTasks[taskId].func = gUnknown_03005CF0; - } } diff --git a/src/roulette.c b/src/roulette.c index 85b1c053b..fe6c6dc8e 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -133,7 +133,7 @@ struct StructgUnknown_083F8D90 }; #if DEBUG -u8 gUnknown_Debug_03005FB8; +void *gUnknown_Debug_03005FB8; #endif #define static @@ -304,6 +304,7 @@ extern const struct SpriteTemplate gSpriteTemplate_83FA434; extern void (*gFieldCallback)(void); extern struct MusicPlayerInfo gMPlay_SE1; extern struct MusicPlayerInfo gMPlay_SE2; +extern struct MusicPlayerInfo gMPlay_SE3; extern const u16 gUnknown_083FA60E[0x2][0x2]; extern const struct SpriteTemplate gSpriteTemplate_83FA50C; extern const struct SpriteTemplate gSpriteTemplate_83FA5C0[]; @@ -403,309 +404,15 @@ void sub_8115238(void) RtcCalcLocalTime(); } -#if DEBUG -__attribute__((naked)) -void sub_8115384(void) -{ - asm("\ - push {r4, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r1, ._35 @ gUnknown_Debug_03005FB8\n\ - ldr r0, ._35 + 4 @ 0x2019000\n\ - str r0, [r1]\n\ - ldr r1, ._35 + 8 @ gMain\n\ - ldr r2, ._35 + 12 @ 0x43c\n\ - add r0, r1, r2\n\ - ldrb r0, [r0]\n\ - add r2, r1, #0\n\ - cmp r0, #0x7\n\ - bls ._33 @cond_branch\n\ - b ._64\n\ -._33:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._35 + 16 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._36:\n\ - .align 2, 0\n\ -._35:\n\ - .word gUnknown_Debug_03005FB8\n\ - .word 0x2019000\n\ - .word gMain\n\ - .word 0x43c\n\ - .word ._37\n\ -._37:\n\ - .word ._38\n\ - .word ._39\n\ - .word ._40\n\ - .word ._41\n\ - .word ._42\n\ - .word ._43\n\ - .word ._44\n\ - .word ._45\n\ -._38:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - bl ScanlineEffect_Stop\n\ - bl ClearVideoCallbacks\n\ - bl sub_80F9368\n\ - ldr r1, ._47 @ 0x400000c\n\ - ldr r3, ._47 + 4 @ 0x4686\n\ - add r0, r3, #0\n\ - strh r0, [r1]\n\ - sub r1, r1, #0x2\n\ - ldr r2, ._47 + 8 @ 0x4401\n\ - add r0, r2, #0\n\ - strh r0, [r1]\n\ - add r1, r1, #0x46\n\ - mov r3, #0x90\n\ - lsl r3, r3, #0x6\n\ - add r0, r3, #0\n\ - strh r0, [r1]\n\ - add r1, r1, #0x2\n\ - ldr r2, ._47 + 12 @ 0x60a\n\ - add r0, r2, #0\n\ - strh r0, [r1]\n\ - ldr r0, ._47 + 16 @ gUnknown_08E8096C\n\ - mov r1, #0xc0\n\ - lsl r1, r1, #0x13\n\ - bl LZ77UnCompVram\n\ - ldr r0, ._47 + 20 @ gRouletteWheelTiles\n\ - ldr r1, ._47 + 24 @ 0x6004000\n\ - bl LZ77UnCompVram\n\ - ldr r1, ._47 + 28 @ gMain\n\ - ldr r3, ._47 + 32 @ 0x43c\n\ - add r1, r1, r3\n\ - b ._61\n\ -._48:\n\ - .align 2, 0\n\ -._47:\n\ - .word 0x400000c\n\ - .word 0x4686\n\ - .word 0x4401\n\ - .word 0x60a\n\ - .word gUnknown_08E8096C\n\ - .word gRouletteWheelTiles\n\ - .word 0x6004000\n\ - .word gMain\n\ - .word 0x43c\n\ -._39:\n\ - bl ResetPaletteFade\n\ - bl ResetSpriteData\n\ - bl ResetTasks\n\ - ldr r1, ._50 @ gMain\n\ - ldr r0, ._50 + 4 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._61\n\ -._51:\n\ - .align 2, 0\n\ -._50:\n\ - .word gMain\n\ - .word 0x43c\n\ -._40:\n\ - ldr r0, ._53 @ gWindowTemplate_81E6C3C\n\ - bl Text_LoadWindowTemplate\n\ - ldr r0, ._53 + 4 @ gWindowTemplate_81E6CE4\n\ - bl InitMenuWindow\n\ - ldr r0, ._53 + 8 @ gUnknown_083F86BC\n\ - mov r2, #0xe0\n\ - lsl r2, r2, #0x1\n\ - mov r1, #0x0\n\ - bl LoadPalette\n\ - ldr r1, ._53 + 12 @ gMain\n\ - ldr r2, ._53 + 16 @ 0x43c\n\ - add r1, r1, r2\n\ - b ._61\n\ -._54:\n\ - .align 2, 0\n\ -._53:\n\ - .word gWindowTemplate_81E6C3C\n\ - .word gWindowTemplate_81E6CE4\n\ - .word gUnknown_083F86BC\n\ - .word gMain\n\ - .word 0x43c\n\ -._41:\n\ - bl sub_8115238\n\ - bl ClearBGTilemapBuffers\n\ - ldr r0, ._56 @ gUnknown_083F88BC\n\ - ldr r1, ._56 + 4 @ 0x2018800\n\ - bl LZ77UnCompWram\n\ - ldr r0, ._56 + 8 @ gUnknown_083F8A60\n\ - ldr r1, ._56 + 12 @ 0x6003000\n\ - bl LZ77UnCompVram\n\ - ldr r1, ._56 + 16 @ gMain\n\ - ldr r3, ._56 + 20 @ 0x43c\n\ - add r1, r1, r3\n\ - b ._61\n\ -._57:\n\ - .align 2, 0\n\ -._56:\n\ - .word gUnknown_083F88BC\n\ - .word 0x2018800\n\ - .word gUnknown_083F8A60\n\ - .word 0x6003000\n\ - .word gMain\n\ - .word 0x43c\n\ -._42:\n\ - mov r0, #0x0\n\ - bl sub_8117838\n\ - bl sub_811857C\n\ - bl sub_81184D8\n\ - bl sub_8117F2C\n\ - bl sub_8117900\n\ - bl sub_8117BBC\n\ - bl sub_8117DF4\n\ - ldr r1, ._59 @ gMain\n\ - ldr r0, ._59 + 4 @ 0x43c\n\ - add r1, r1, r0\n\ - b ._61\n\ -._60:\n\ - .align 2, 0\n\ -._59:\n\ - .word gMain\n\ - .word 0x43c\n\ -._43:\n\ - bl AnimateSprites\n\ - bl BuildOamBuffer\n\ - ldr r0, ._62 @ gSaveBlock1\n\ - ldr r1, ._62 + 4 @ 0x494\n\ - add r0, r0, r1\n\ - ldrh r0, [r0]\n\ - bl sub_81180F4\n\ - mov r0, #0x6\n\ - bl sub_81182F8\n\ - mov r0, #0x0\n\ - bl sub_811829C\n\ - mov r0, #0x0\n\ - bl sub_8117158\n\ - mov r0, #0x0\n\ - mov r1, #0xe\n\ - mov r2, #0x1d\n\ - mov r3, #0x13\n\ - bl Menu_DrawStdWindowFrame\n\ - ldr r0, ._62 + 8 @ gUnknown_081C4157\n\ - mov r1, #0x1\n\ - mov r2, #0xf\n\ - bl Menu_PrintText\n\ - ldr r1, ._62 + 12 @ gSpriteCoordOffsetX\n\ - mov r2, #0x3c\n\ - neg r2, r2\n\ - add r0, r2, #0\n\ - strh r0, [r1]\n\ - ldr r1, ._62 + 16 @ gSpriteCoordOffsetY\n\ - mov r0, #0x0\n\ - strh r0, [r1]\n\ - ldr r1, ._62 + 20 @ gMain\n\ - ldr r3, ._62 + 24 @ 0x43c\n\ - add r1, r1, r3\n\ - b ._61\n\ -._63:\n\ - .align 2, 0\n\ -._62:\n\ - .word gSaveBlock1\n\ - .word 0x494\n\ - .word gUnknown_081C4157\n\ - .word gSpriteCoordOffsetX\n\ - .word gSpriteCoordOffsetY\n\ - .word gMain\n\ - .word 0x43c\n\ -._44:\n\ - mov r1, #0x80\n\ - lsl r1, r1, #0x13\n\ - ldr r3, ._65 @ 0x1741\n\ - add r0, r3, #0\n\ - strh r0, [r1]\n\ - ldr r0, ._65 + 4 @ 0x43c\n\ - add r1, r2, r0\n\ -._61:\n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ - b ._64\n\ -._66:\n\ - .align 2, 0\n\ -._65:\n\ - .word 0x1741\n\ - .word 0x43c\n\ -._45:\n\ - ldr r3, ._67 @ 0x4000208\n\ - ldrh r2, [r3]\n\ - mov r0, #0x0\n\ - strh r0, [r3]\n\ - ldr r4, ._67 + 4 @ 0x4000200\n\ - ldrh r0, [r4]\n\ - mov r1, #0x1\n\ - orr r0, r0, r1\n\ - strh r0, [r4]\n\ - strh r2, [r3]\n\ - ldr r2, ._67 + 8 @ 0x4000004\n\ - ldrh r0, [r2]\n\ - mov r1, #0x8\n\ - orr r0, r0, r1\n\ - strh r0, [r2]\n\ - ldr r0, ._67 + 12 @ sub_8115124\n\ - bl SetVBlankCallback\n\ - mov r0, #0x1\n\ - str r0, [sp]\n\ - mov r0, #0xff\n\ - mov r1, #0x0\n\ - mov r2, #0x10\n\ - mov r3, #0x0\n\ - bl BeginHardwarePaletteFade\n\ - ldr r0, ._67 + 16 @ sub_81156BC\n\ - mov r1, #0x0\n\ - bl CreateTask\n\ - ldr r4, ._67 + 20 @ 0x2019000\n\ - add r1, r4, #0\n\ - add r1, r1, #0xa4\n\ - strb r0, [r1]\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r2, ._67 + 24 @ gTasks\n\ - lsl r1, r0, #0x2\n\ - add r1, r1, r0\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r2\n\ - mov r0, #0x6\n\ - strh r0, [r1, #0x14]\n\ - ldr r0, ._67 + 28 @ gSaveBlock1\n\ - ldr r2, ._67 + 32 @ 0x494\n\ - add r0, r0, r2\n\ - ldrh r0, [r0]\n\ - strh r0, [r1, #0x22]\n\ - ldr r0, ._67 + 36 @ sub_8115634\n\ - mov r1, #0x1\n\ - bl CreateTask\n\ - add r4, r4, #0xa5\n\ - strb r0, [r4]\n\ - ldr r0, ._67 + 40 @ sub_81150FC\n\ - bl SetMainCallback2\n\ -._64:\n\ - add sp, sp, #0x4\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._68:\n\ - .align 2, 0\n\ -._67:\n\ - .word 0x4000208\n\ - .word 0x4000200\n\ - .word 0x4000004\n\ - .word sub_8115124+1\n\ - .word sub_81156BC+1\n\ - .word 0x2019000\n\ - .word gTasks\n\ - .word gSaveBlock1\n\ - .word 0x494\n\ - .word sub_8115634+1\n\ - .word sub_81150FC+1"); -} -#else void sub_8115384(void) { u32 temp_IME; u8 taskid; + +#if DEBUG + gUnknown_Debug_03005FB8 = eRoulette; +#endif + switch (gMain.state) { case 0x0: @@ -783,125 +490,13 @@ void sub_8115384(void) break; } } -#endif -#if DEBUG -__attribute__((naked)) -void sub_8115634(u8 unused) -{ - asm("\ - push {r4, r5, r6, lr}\n\ - ldr r0, ._75 @ 0x2019000\n\ - add r3, r0, #0\n\ - add r3, r3, #0x21\n\ - ldrb r1, [r3]\n\ - add r2, r1, #1\n\ - strb r2, [r3]\n\ - add r2, r0, #0\n\ - add r2, r2, #0x23\n\ - lsl r1, r1, #0x18\n\ - lsr r1, r1, #0x18\n\ - add r6, r0, #0\n\ - ldrb r2, [r2]\n\ - cmp r1, r2\n\ - bne ._70 @cond_branch\n\ - mov r0, #0x0\n\ - strb r0, [r3]\n\ - add r2, r6, #0\n\ - add r2, r2, #0x22\n\ - ldrb r1, [r2]\n\ - ldrh r0, [r6, #0x24]\n\ - sub r0, r0, r1\n\ - strh r0, [r6, #0x24]\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - bge ._70 @cond_branch\n\ - ldrb r1, [r2]\n\ - mov r2, #0xb4\n\ - lsl r2, r2, #0x1\n\ - add r0, r2, #0\n\ - sub r0, r0, r1\n\ - strh r0, [r6, #0x24]\n\ -._70:\n\ - add r4, r6, #0\n\ - ldrh r0, [r4, #0x24]\n\ - bl Sin2\n\ - lsl r0, r0, #0x10\n\ - lsr r5, r0, #0x10\n\ - ldrh r0, [r4, #0x24]\n\ - bl Cos2\n\ - lsl r0, r0, #0x10\n\ - lsr r1, r0, #0x10\n\ - lsl r0, r5, #0x10\n\ - asr r0, r0, #0x10\n\ - cmp r0, #0\n\ - bge ._71 @cond_branch\n\ - add r0, r0, #0xf\n\ -._71:\n\ - lsl r0, r0, #0xc\n\ - lsr r5, r0, #0x10\n\ - lsl r0, r1, #0x10\n\ - asr r0, r0, #0x10\n\ - cmp r0, #0\n\ - bge ._72 @cond_branch\n\ - add r0, r0, #0xf\n\ -._72:\n\ - asr r0, r0, #0x4\n\ - strh r0, [r6, #0x32]\n\ - strh r0, [r6, #0x2c]\n\ - strh r5, [r6, #0x2e]\n\ - lsl r0, r5, #0x10\n\ - asr r0, r0, #0x10\n\ - neg r0, r0\n\ - strh r0, [r6, #0x30]\n\ - ldr r0, ._75 + 4 @ unk_203955C\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._74 @cond_branch\n\ - ldr r0, ._75 + 8 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._74 @cond_branch\n\ - ldr r2, ._75 + 12 @ gTasks\n\ - add r0, r6, #0\n\ - add r0, r0, #0xa4\n\ - ldrb r1, [r0]\n\ - lsl r0, r1, #0x2\n\ - add r0, r0, r1\n\ - lsl r0, r0, #0x3\n\ - add r0, r0, r2\n\ - ldr r1, ._75 + 16 @ sub_81157AC\n\ - str r1, [r0]\n\ - ldr r0, ._75 + 20 @ gMPlay_SE1\n\ - bl m4aMPlayStop\n\ - ldr r0, ._75 + 24 @ gMPlay_SE2\n\ - bl m4aMPlayStop\n\ - ldr r0, ._75 + 28 @ gMPlay_SE3\n\ - bl m4aMPlayStop\n\ -._74:\n\ - pop {r4, r5, r6}\n\ - pop {r0}\n\ - bx r0\n\ -._76:\n\ - .align 2, 0\n\ -._75:\n\ - .word 0x2019000\n\ - .word unk_203955C\n\ - .word gMain\n\ - .word gTasks\n\ - .word sub_81157AC+1\n\ - .word gMPlay_SE1\n\ - .word gMPlay_SE2\n\ - .word gMPlay_SE3"); -} -#else void sub_8115634(u8 unused) { s16 sin; s16 cos; s32 cos32; + if (eRoulette->var21++ == eRoulette->var23) { eRoulette->var21 = 0x0; @@ -916,8 +511,16 @@ void sub_8115634(u8 unused) eRoulette->var2C.a = cos32; eRoulette->var2C.b = sin; eRoulette->var2C.c = -sin; -} +#if DEBUG + if (unk_203955C[0] != 0 && (gMain.newKeys & 8)) + { + gTasks[eRoulette->varA4].func = sub_81157AC; + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + m4aMPlayStop(&gMPlay_SE3); + } #endif +} void sub_81156BC(u8 taskid) { @@ -984,6 +587,7 @@ void sub_81157D0(u8 r0) temp1 = ((r0 - 1) / 5 * 3 + 0x7); sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD); sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a20, temp0, temp1, 0x3, 0x3); + break; } } @@ -1008,6 +612,7 @@ void sub_811597C(u8 taskid) void sub_81159BC(u8 taskid) { s16 i; + if (eRoulette->var08 & 0x20) { for (i = 0xB; (i < 0xE); i++) @@ -1598,73 +1203,11 @@ void sub_8116AB0(u8 taskid) gTasks[taskid].func = &sub_8116B40; } -#if DEBUG -__attribute__((naked)) -void sub_8116B40(u8 taskid) // end roulette ? -{ - asm("\ - push {r4, r5, r6, lr}\n\ - lsl r0, r0, #0x18\n\ - lsr r6, r0, #0x18\n\ - bl UpdatePaletteFade\n\ - lsl r0, r0, #0x18\n\ - lsr r5, r0, #0x18\n\ - cmp r5, #0\n\ - bne ._380 @cond_branch\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - ldr r0, ._381 @ 0x2019000\n\ - mov r2, #0xbe\n\ - lsl r2, r2, #0x1\n\ - mov r1, #0x0\n\ - bl memset\n\ - ldr r1, ._381 + 4 @ gSpriteCoordOffsetX\n\ - ldr r0, ._381 + 8 @ gSpriteCoordOffsetY\n\ - mov r4, #0x0\n\ - strh r5, [r0]\n\ - strh r5, [r1]\n\ - bl sub_80F9368\n\ - bl FreeAllSpritePalettes\n\ - bl ResetPaletteFade\n\ - bl ResetSpriteData\n\ - bl ClearBGTilemapBuffers\n\ - ldr r0, ._381 + 12 @ 0x4000050\n\ - strh r5, [r0]\n\ - add r0, r0, #0x2\n\ - strh r5, [r0]\n\ - add r0, r0, #0x2\n\ - strh r5, [r0]\n\ - ldr r1, ._381 + 16 @ gFieldCallback\n\ - ldr r0, ._381 + 20 @ sub_8080990\n\ - str r0, [r1]\n\ - ldr r0, ._381 + 24 @ c2_exit_to_overworld_2_switch\n\ - bl SetMainCallback2\n\ - add r0, r6, #0\n\ - bl DestroyTask\n\ - ldr r0, ._381 + 28 @ unk_203955C\n\ - strb r4, [r0]\n\ -._380:\n\ - pop {r4, r5, r6}\n\ - pop {r0}\n\ - bx r0\n\ -._382:\n\ - .align 2, 0\n\ -._381:\n\ - .word 0x2019000\n\ - .word gSpriteCoordOffsetX\n\ - .word gSpriteCoordOffsetY\n\ - .word 0x4000050\n\ - .word gFieldCallback\n\ - .word sub_8080990+1\n\ - .word c2_exit_to_overworld_2_switch+1\n\ - .word unk_203955C"); -} -#else -void sub_8116B40(u8 taskid) // end roulette ? +void sub_8116B40(u8 taskId) // end roulette ? { if (UpdatePaletteFade() == 0) { - SetVBlankCallback(0x0); + SetVBlankCallback(NULL); memset(eRoulette, 0x0, 0x17C); gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0x0; sub_80F9368(); @@ -1677,10 +1220,12 @@ void sub_8116B40(u8 taskid) // end roulette ? REG_BLDY = 0x0; gFieldCallback = &sub_8080990; SetMainCallback2(&c2_exit_to_overworld_2_switch); - DestroyTask(taskid); + DestroyTask(taskId); +#if DEBUG + unk_203955C[0] = 0; +#endif } } -#endif void sub_8116BC0(u8 taskid) { @@ -2412,8 +1957,8 @@ void PlayRoulette(void) unk_2039560 = 0; if (unk_203955C[0] != 0) { - taskid = CreateTask(debug_sub_812CFE8, 0); - return; + CreateTask(debug_sub_812CFE8, 0); + return; } #endif taskid = CreateTask(Task_Roulette_0, 0); -- cgit v1.2.3 From efa9966f4fd49766114ca5b4abd963f874e283da Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sun, 18 Feb 2018 18:09:34 -0600 Subject: decompile debug code in roulette.c --- src/roulette.c | 394 +++++++++++---------------------------------------------- 1 file changed, 72 insertions(+), 322 deletions(-) (limited to 'src') diff --git a/src/roulette.c b/src/roulette.c index fe6c6dc8e..5e7517d79 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -1622,328 +1622,78 @@ void Task_Roulette_0(u8 taskid) #if DEBUG -__attribute__((naked)) -void debug_sub_812CDE4() -{ - asm("\ - push {r4, r5, lr}\n\ - lsl r0, r0, #0x18\n\ - lsr r3, r0, #0x18\n\ - add r4, r3, #0\n\ - ldr r0, ._575 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._572 @cond_branch\n\ - ldr r1, ._575 + 4 @ gTasks\n\ - lsl r0, r3, #0x2\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x3\n\ - add r2, r0, r1\n\ - ldrh r0, [r2, #0x22]\n\ - add r0, r0, #0x1\n\ - strh r0, [r2, #0x22]\n\ - lsl r0, r0, #0x10\n\ - ldr r1, ._575 + 8 @ 0x27100000\n\ - cmp r0, r1\n\ - bne ._573 @cond_branch\n\ - mov r0, #0x0\n\ - strh r0, [r2, #0x22]\n\ -._573:\n\ - ldr r0, ._575 + 12 @ gStringVar1\n\ - mov r3, #0x22\n\ - ldsh r1, [r2, r3]\n\ - b ._584\n\ -._576:\n\ - .align 2, 0\n\ -._575:\n\ - .word gMain\n\ - .word gTasks\n\ - .word 0x27100000\n\ - .word gStringVar1\n\ -._572:\n\ - mov r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._577 @cond_branch\n\ - ldr r1, ._580 @ gTasks\n\ - lsl r0, r3, #0x2\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x3\n\ - add r2, r0, r1\n\ - ldrh r0, [r2, #0x22]\n\ - sub r0, r0, #0x1\n\ - strh r0, [r2, #0x22]\n\ - lsl r0, r0, #0x10\n\ - asr r0, r0, #0x10\n\ - mov r1, #0x1\n\ - neg r1, r1\n\ - cmp r0, r1\n\ - bne ._578 @cond_branch\n\ - ldr r0, ._580 + 4 @ 0x270f\n\ - strh r0, [r2, #0x22]\n\ -._578:\n\ - ldr r0, ._580 + 8 @ gStringVar1\n\ - mov r3, #0x22\n\ - ldsh r1, [r2, r3]\n\ - b ._584\n\ -._581:\n\ - .align 2, 0\n\ -._580:\n\ - .word gTasks\n\ - .word 0x270f\n\ - .word gStringVar1\n\ -._577:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x1\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._582 @cond_branch\n\ - ldr r1, ._585 @ gTasks\n\ - lsl r0, r3, #0x2\n\ - add r0, r0, r3\n\ - lsl r0, r0, #0x3\n\ - add r2, r0, r1\n\ - ldrh r3, [r2, #0x22]\n\ - add r0, r3, #0\n\ - add r0, r0, #0xa\n\ - strh r0, [r2, #0x22]\n\ - lsl r0, r0, #0x10\n\ - ldr r1, ._585 + 4 @ 0x270f0000\n\ - cmp r0, r1\n\ - ble ._583 @cond_branch\n\ - ldr r1, ._585 + 8 @ 0xffffd8fb\n\ - add r0, r3, r1\n\ - strh r0, [r2, #0x22]\n\ -._583:\n\ - ldr r0, ._585 + 12 @ gStringVar1\n\ - mov r3, #0x22\n\ - ldsh r1, [r2, r3]\n\ - b ._584\n\ -._586:\n\ - .align 2, 0\n\ -._585:\n\ - .word gTasks\n\ - .word 0x270f0000\n\ - .word 0xffffd8fb\n\ - .word gStringVar1\n\ -._582:\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x2\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._587 @cond_branch\n\ - ldr r0, ._590 @ gTasks\n\ - lsl r1, r3, #0x2\n\ - add r1, r1, r3\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r0\n\ - ldrh r2, [r1, #0x22]\n\ - add r0, r2, #0\n\ - sub r0, r0, #0xa\n\ - strh r0, [r1, #0x22]\n\ - lsl r0, r0, #0x10\n\ - cmp r0, #0\n\ - bge ._588 @cond_branch\n\ - ldr r3, ._590 + 4 @ 0x2705\n\ - add r0, r2, r3\n\ - strh r0, [r1, #0x22]\n\ -._588:\n\ - ldr r0, ._590 + 8 @ gStringVar1\n\ - mov r2, #0x22\n\ - ldsh r1, [r1, r2]\n\ -._584:\n\ - mov r2, #0x1\n\ - mov r3, #0x4\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r4, ._590 + 12 @ gStringVar4\n\ - ldr r1, ._590 + 16 @ gOtherText_Coins\n\ - add r0, r4, #0\n\ - bl StringExpandPlaceholders\n\ - add r0, r4, #0\n\ - mov r1, #0x9\n\ - mov r2, #0x1\n\ - bl MenuPrint_RightAligned\n\ - b ._596\n\ -._591:\n\ - .align 2, 0\n\ -._590:\n\ - .word gTasks\n\ - .word 0x2705\n\ - .word gStringVar1\n\ - .word gStringVar4\n\ - .word gOtherText_Coins\n\ -._587:\n\ - mov r0, #0x8\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._592 @cond_branch\n\ - ldr r0, ._594 @ gSaveBlock1\n\ - ldr r2, ._594 + 4 @ gTasks\n\ - lsl r1, r3, #0x2\n\ - add r1, r1, r3\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r2\n\ - ldrh r2, [r1, #0x22]\n\ - ldr r3, ._594 + 8 @ 0x494\n\ - add r0, r0, r3\n\ - mov r5, #0x0\n\ - strh r2, [r0]\n\ - ldr r0, ._594 + 12 @ Task_Roulette_0\n\ - str r0, [r1]\n\ - ldr r0, ._594 + 16 @ gStringVar1\n\ - mov r2, #0x22\n\ - ldsh r1, [r1, r2]\n\ - mov r2, #0x1\n\ - mov r3, #0x4\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r4, ._594 + 20 @ gStringVar4\n\ - ldr r1, ._594 + 24 @ gOtherText_Coins\n\ - add r0, r4, #0\n\ - bl StringExpandPlaceholders\n\ - add r0, r4, #0\n\ - mov r1, #0x9\n\ - mov r2, #0x1\n\ - bl MenuPrint_RightAligned\n\ - ldr r0, ._594 + 28 @ unk_2039560\n\ - strb r5, [r0]\n\ - b ._596\n\ -._595:\n\ - .align 2, 0\n\ -._594:\n\ - .word gSaveBlock1\n\ - .word gTasks\n\ - .word 0x494\n\ - .word Task_Roulette_0+1\n\ - .word gStringVar1\n\ - .word gStringVar4\n\ - .word gOtherText_Coins\n\ - .word unk_2039560\n\ -._592:\n\ - mov r0, #0x4\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._596 @cond_branch\n\ - ldr r0, ._597 @ gSaveBlock1\n\ - ldr r2, ._597 + 4 @ gTasks\n\ - lsl r1, r4, #0x2\n\ - add r1, r1, r4\n\ - lsl r1, r1, #0x3\n\ - add r1, r1, r2\n\ - ldrh r2, [r1, #0x22]\n\ - ldr r3, ._597 + 8 @ 0x494\n\ - add r0, r0, r3\n\ - strh r2, [r0]\n\ - ldr r0, ._597 + 12 @ Task_Roulette_0\n\ - str r0, [r1]\n\ - ldr r0, ._597 + 16 @ gStringVar1\n\ - mov r2, #0x22\n\ - ldsh r1, [r1, r2]\n\ - mov r2, #0x1\n\ - mov r3, #0x4\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r4, ._597 + 20 @ gStringVar4\n\ - ldr r1, ._597 + 24 @ gOtherText_Coins\n\ - add r0, r4, #0\n\ - bl StringExpandPlaceholders\n\ - add r0, r4, #0\n\ - mov r1, #0x9\n\ - mov r2, #0x1\n\ - bl MenuPrint_RightAligned\n\ - ldr r1, ._597 + 28 @ unk_2039560\n\ - mov r0, #0x1\n\ - strb r0, [r1]\n\ -._596:\n\ - pop {r4, r5}\n\ - pop {r0}\n\ - bx r0\n\ -._598:\n\ - .align 2, 0\n\ -._597:\n\ - .word gSaveBlock1\n\ - .word gTasks\n\ - .word 0x494\n\ - .word Task_Roulette_0+1\n\ - .word gStringVar1\n\ - .word gStringVar4\n\ - .word gOtherText_Coins\n\ - .word unk_2039560"); +void debug_sub_812CDE4(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].data[13]++; + if (gTasks[taskId].data[13] == 10000) + gTasks[taskId].data[13] = 0; + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins); + MenuPrint_RightAligned(gStringVar4, 9, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[13]--; + if (gTasks[taskId].data[13] == -1) + gTasks[taskId].data[13] = 9999; + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins); + MenuPrint_RightAligned(gStringVar4, 9, 1); + } + else if (gMain.newKeys & 0x100) + { + gTasks[taskId].data[13] += 10; + if (gTasks[taskId].data[13] > 9999) + gTasks[taskId].data[13] -= 9999; + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins); + MenuPrint_RightAligned(gStringVar4, 9, 1); + } + else if (gMain.newKeys & 0x200) + { + gTasks[taskId].data[13] -= 10; + if (gTasks[taskId].data[13] < 0) + gTasks[taskId].data[13] += 9999; + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins); + MenuPrint_RightAligned(gStringVar4, 9, 1); + } + else if (gMain.newKeys & 8) + { + gSaveBlock1.coins = gTasks[taskId].data[13]; + gTasks[taskId].func = Task_Roulette_0; + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins); + MenuPrint_RightAligned(gStringVar4, 9, 1); + unk_2039560 = 0; + } + else if (gMain.newKeys & 4) + { + gSaveBlock1.coins = gTasks[taskId].data[13]; + gTasks[taskId].func = Task_Roulette_0; + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins); + MenuPrint_RightAligned(gStringVar4, 9, 1); + unk_2039560 = 1; + } } -__attribute__((naked)) +extern const u8 gUnknown_Debug_0842510D[]; + void debug_sub_812CFE8(u8 taskId) { - asm("\ - push {r4, r5, lr}\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - ldr r2, ._600 @ gTasks\n\ - lsl r1, r0, #0x2\n\ - add r1, r1, r0\n\ - lsl r1, r1, #0x3\n\ - add r5, r1, r2\n\ - ldr r0, ._600 + 4 @ gSaveBlock1\n\ - ldr r1, ._600 + 8 @ 0x494\n\ - add r0, r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r5, #0x22]\n\ - bl Random\n\ - mov r1, #0x1\n\ - and r1, r1, r0\n\ - cmp r1, #0\n\ - beq ._599 @cond_branch\n\ - ldr r0, ._600 + 12 @ gSpecialVar_0x8004\n\ - ldrh r1, [r0]\n\ - mov r2, #0x80\n\ - orr r1, r1, r2\n\ - strh r1, [r0]\n\ -._599:\n\ - ldr r0, ._600 + 16 @ gStringVar1\n\ - mov r2, #0x22\n\ - ldsh r1, [r5, r2]\n\ - mov r2, #0x1\n\ - mov r3, #0x4\n\ - bl ConvertIntToDecimalStringN\n\ - ldr r4, ._600 + 20 @ gStringVar4\n\ - ldr r1, ._600 + 24 @ gOtherText_Coins\n\ - add r0, r4, #0\n\ - bl StringExpandPlaceholders\n\ - mov r0, #0x0\n\ - mov r1, #0x0\n\ - mov r2, #0x9\n\ - mov r3, #0x3\n\ - bl Menu_DrawStdWindowFrame\n\ - add r0, r4, #0\n\ - mov r1, #0x9\n\ - mov r2, #0x1\n\ - bl MenuPrint_RightAligned\n\ - mov r0, #0x0\n\ - mov r1, #0xe\n\ - mov r2, #0x1d\n\ - mov r3, #0x13\n\ - bl Menu_DrawStdWindowFrame\n\ - ldr r0, ._600 + 28 @ gUnknown_Debug_0842510D\n\ - mov r1, #0x1\n\ - mov r2, #0xf\n\ - bl Menu_PrintText\n\ - ldr r0, ._600 + 32 @ debug_sub_812CDE4\n\ - str r0, [r5]\n\ - pop {r4, r5}\n\ - pop {r0}\n\ - bx r0\n\ -._601:\n\ - .align 2, 0\n\ -._600:\n\ - .word gTasks\n\ - .word gSaveBlock1\n\ - .word 0x494\n\ - .word gSpecialVar_0x8004\n\ - .word gStringVar1\n\ - .word gStringVar4\n\ - .word gOtherText_Coins\n\ - .word gUnknown_Debug_0842510D\n\ - .word debug_sub_812CDE4+1"); + gTasks[taskId].data[13] = gSaveBlock1.coins; + if (Random() & 1) + gSpecialVar_0x8004 |= 0x80; + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins); + Menu_DrawStdWindowFrame(0, 0, 9, 3); + MenuPrint_RightAligned(gStringVar4, 9, 1); + Menu_DrawStdWindowFrame(0, 14, 29, 19); + Menu_PrintText(gUnknown_Debug_0842510D, 1, 15); + gTasks[taskId].func = debug_sub_812CDE4; } #endif @@ -2681,13 +2431,13 @@ void debug_sub_812E698(struct Sprite *sprite) m4aSongNumStart(0x38); if (Random() & 1) { - eRoulette->var8C = 0; - eRoulette->var7F = (eRoulette->var7E + 1) % 12; + eRoulette->var8C = 0; + eRoulette->var7F = (eRoulette->var7E + 1) % 12; } else { - eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C * 2; - eRoulette->var7F = eRoulette->var7E; + eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C * 2; + eRoulette->var7F = eRoulette->var7E; } sprite->data[0] = 1; sprite->data[2] = gUnknown_083F8DF4[eRoulette->var04_0].var02; -- cgit v1.2.3 From b47dffc5df147adcd241df4bf11fa161d84af4f4 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Sun, 18 Feb 2018 18:53:43 -0600 Subject: decompile pokemon_storage_system_2.c debug code --- src/pokemon/pokemon_storage_system_2.c | 2935 +++++++++++--------------------- 1 file changed, 999 insertions(+), 1936 deletions(-) (limited to 'src') diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c index 2f12b6bfa..0331abf3e 100644 --- a/src/pokemon/pokemon_storage_system_2.c +++ b/src/pokemon/pokemon_storage_system_2.c @@ -189,383 +189,179 @@ void sub_8096848(void) void sub_8096874(void) { - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; } -#if DEBUG -__attribute__((naked)) -void sub_8096884(void) -{ - asm("\ - push {r4, lr}\n\ - ldr r0, ._223 @ gMain\n\ - ldr r1, ._223 + 4 @ 0x43c\n\ - add r0, r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0x9\n\ - bls ._221 @cond_branch\n\ - b ._222\n\ -._221:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._223 + 8 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._224:\n\ - .align 2, 0\n\ -._223:\n\ - .word gMain\n\ - .word 0x43c\n\ - .word ._225\n\ -._225:\n\ - .word ._226\n\ - .word ._227\n\ - .word ._228\n\ - .word ._229\n\ - .word ._230\n\ - .word ._231\n\ - .word ._232\n\ - .word ._233\n\ - .word ._234\n\ - .word ._235\n\ -._226:\n\ - mov r0, #0x0\n\ - bl SetVBlankCallback\n\ - mov r0, #0x80\n\ - lsl r0, r0, #0x13\n\ - mov r4, #0x0\n\ - strh r4, [r0]\n\ - bl sub_8096804\n\ - ldr r0, ._237 @ unk_2038790\n\ - strb r4, [r0]\n\ - b ._250\n\ -._238:\n\ - .align 2, 0\n\ -._237:\n\ - .word unk_2038790\n\ -._227:\n\ - ldr r0, ._240 @ gWindowTemplate_81E6D00\n\ - bl Text_LoadWindowTemplate\n\ - b ._250\n\ -._241:\n\ - .align 2, 0\n\ -._240:\n\ - .word gWindowTemplate_81E6D00\n\ -._228:\n\ - ldr r0, ._243 @ gWindowTemplate_81E6D00\n\ - bl InitMenuWindow\n\ - bl Menu_EraseScreen\n\ - b ._250\n\ -._244:\n\ - .align 2, 0\n\ -._243:\n\ - .word gWindowTemplate_81E6D00\n\ -._229:\n\ - bl sub_80967DC\n\ - bl sub_8096848\n\ - b ._250\n\ -._230:\n\ - bl ResetPSSMonIconSprites\n\ - bl sub_809AA24\n\ - b ._250\n\ -._231:\n\ - bl sub_8097DE0\n\ - b ._250\n\ -._232:\n\ - bl sub_8097E70\n\ - b ._250\n\ -._233:\n\ - bl sub_8098400\n\ - b ._250\n\ -._234:\n\ - ldr r0, ._251 @ gPokemonStorage\n\ - ldrb r0, [r0]\n\ - bl sub_8099BF8\n\ - ldr r2, ._251 + 4 @ 0x2000000\n\ - ldr r1, ._251 + 8 @ 0x12bc\n\ - add r0, r2, r1\n\ - mov r1, #0xa\n\ - strh r1, [r0]\n\ - ldr r1, ._251 + 12 @ 0x12be\n\ - add r2, r2, r1\n\ - ldr r1, ._251 + 16 @ 0xdacb\n\ - strh r1, [r2]\n\ - bl sub_80F727C\n\ - bl sub_80F7404\n\ - b ._250\n\ -._252:\n\ - .align 2, 0\n\ -._251:\n\ - .word gPokemonStorage\n\ - .word 0x2000000\n\ - .word 0x12bc\n\ - .word 0x12be\n\ - .word 0xdacb\n\ -._235:\n\ - bl sub_8096874\n\ - ldr r0, ._253 @ sub_8096BF0\n\ - bl SetPSSCallback\n\ - ldr r0, ._253 + 4 @ sub_8096B38\n\ - bl SetMainCallback2\n\ - ldr r0, ._253 + 8 @ sub_8096AFC\n\ - bl SetVBlankCallback\n\ -._250:\n\ - ldr r1, ._253 + 12 @ gMain\n\ - ldr r0, ._253 + 16 @ 0x43c\n\ - add r1, r1, r0\n\ - ldrb r0, [r1]\n\ - add r0, r0, #0x1\n\ - strb r0, [r1]\n\ -._222:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._254:\n\ - .align 2, 0\n\ -._253:\n\ - .word sub_8096BF0+1\n\ - .word sub_8096B38+1\n\ - .word sub_8096AFC+1\n\ - .word gMain\n\ - .word 0x43c"); -} -#else +extern u8 unk_2038790; + void sub_8096884(void) { switch (gMain.state) { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - sub_8096804(); - gMain.state++; - break; - case 1: - Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); - gMain.state++; - break; - case 2: - InitMenuWindow(&gWindowTemplate_81E6D00); - Menu_EraseScreen(); - gMain.state++; - break; - case 3: - sub_80967DC(); - sub_8096848(); - gMain.state++; - break; - case 4: - ResetPSSMonIconSprites(); - sub_809AA24(); - gMain.state++; - break; - case 5: - sub_8097DE0(); - gMain.state++; - break; - case 6: - sub_8097E70(); - gMain.state++; - break; - case 7: - sub_8098400(); - gMain.state++; - break; - case 8: - sub_8099BF8(gPokemonStorage.currentBox); - gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; - gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; - sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); - sub_80F7404(); - gMain.state++; - break; - case 9: - sub_8096874(); - SetPSSCallback(sub_8096BF0); - SetMainCallback2(sub_8096B38); - SetVBlankCallback(sub_8096AFC); - gMain.state++; - break; + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + sub_8096804(); +#if DEBUG + unk_2038790 = 0; +#endif + gMain.state++; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowTemplate_81E6D00); + Menu_EraseScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + sub_8096848(); + gMain.state++; + break; + case 4: + ResetPSSMonIconSprites(); + sub_809AA24(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; + gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + sub_8096874(); + SetPSSCallback(sub_8096BF0); + SetMainCallback2(sub_8096B38); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; } } -#endif void sub_80969A0(void) { switch (gMain.state) { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0x0000; - gPokemonStorageSystemPtr->unk_0005 = gUnknown_0203847D; - sub_8096804(); - if (gUnknown_0203847F == 1) - sub_809BBC0(); - if (gUnknown_0203847F == 0) - sub_809BD14(); - gMain.state++; - break; - case 1: - Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); - gMain.state++; - break; - case 2: - InitMenuWindow(&gWindowTemplate_81E6D00); - Menu_EraseScreen(); - gMain.state++; - break; - case 3: - sub_80967DC(); - gMain.state++; - break; - case 4: - ResetPSSMonIconSprites(); - sub_809AA98(); - gMain.state++; - break; - case 5: - sub_8097DE0(); - gMain.state++; - break; - case 6: - sub_8097E70(); - gMain.state++; - break; - case 7: - sub_8098400(); - gMain.state++; - break; - case 8: - sub_8099BF8(gPokemonStorage.currentBox); - gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; - gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; - sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); - sub_80F7404(); - gMain.state++; - break; - case 9: - BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); - SetVBlankCallback(sub_8096AFC); - gMain.state++; - break; - case 10: - sub_8096874(); - SetPSSCallback(sub_8096C68); - SetMainCallback2(sub_8096B38); - gMain.state++; - break; + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + gPokemonStorageSystemPtr->unk_0005 = gUnknown_0203847D; + sub_8096804(); + if (gUnknown_0203847F == 1) + sub_809BBC0(); + if (gUnknown_0203847F == 0) + sub_809BD14(); + gMain.state++; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowTemplate_81E6D00); + Menu_EraseScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + gMain.state++; + break; + case 4: + ResetPSSMonIconSprites(); + sub_809AA98(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; + gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + case 10: + sub_8096874(); + SetPSSCallback(sub_8096C68); + SetMainCallback2(sub_8096B38); + gMain.state++; + break; } } #if DEBUG -__attribute__((naked)) -void debug_sub_80A4300() -{ - asm("\ - push {lr}\n\ - ldr r1, ._296 @ gUnknown_0203847D\n\ - mov r0, #0x0\n\ - strb r0, [r1]\n\ - ldr r1, ._296 + 4 @ 0x2000000\n\ - mov r0, #0x0\n\ - strb r0, [r1, #0x5]\n\ - bl sub_8096884\n\ - ldr r0, ._296 + 8 @ gMain\n\ - ldr r1, [r0, #0x4]\n\ - ldr r0, ._296 + 12 @ sub_8096B38\n\ - cmp r1, r0\n\ - bne ._295 @cond_branch\n\ - ldr r1, ._296 + 16 @ unk_2038790\n\ - mov r0, #0x1\n\ - strb r0, [r1]\n\ -._295:\n\ - pop {r0}\n\ - bx r0\n\ -._297:\n\ - .align 2, 0\n\ -._296:\n\ - .word gUnknown_0203847D\n\ - .word 0x2000000\n\ - .word gMain\n\ - .word sub_8096B38+1\n\ - .word unk_2038790"); -} - -__attribute__((naked)) -void debug_sub_80A433C() -{ - asm("\ - push {lr}\n\ - ldr r2, ._298 @ unk_2038794\n\ - str r1, [r2]\n\ - ldr r1, ._298 + 4 @ unk_2038798\n\ - str r0, [r1]\n\ - ldr r0, ._298 + 8 @ debug_sub_80A4300\n\ - bl SetMainCallback2\n\ - pop {r0}\n\ - bx r0\n\ -._299:\n\ - .align 2, 0\n\ -._298:\n\ - .word unk_2038794\n\ - .word unk_2038798\n\ - .word debug_sub_80A4300+1"); -} - -__attribute__((naked)) -void debug_sub_80A435C() -{ - asm("\ - push {r4, r5, lr}\n\ - add sp, sp, #0xfffffffc\n\ - ldr r5, ._303 @ 0x2000000\n\ - ldrb r4, [r5, #0x4]\n\ - cmp r4, #0\n\ - beq ._300 @cond_branch\n\ - cmp r4, #0x1\n\ - beq ._301 @cond_branch\n\ - b ._308\n\ -._304:\n\ - .align 2, 0\n\ -._303:\n\ - .word 0x2000000\n\ -._300:\n\ - ldr r0, ._306 @ unk_2038798\n\ - ldr r0, [r0]\n\ - bl unref_sub_809CB94\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - str r4, [sp]\n\ - mov r1, #0x0\n\ - mov r2, #0x0\n\ - mov r3, #0x10\n\ - bl BeginNormalPaletteFade\n\ - ldrb r0, [r5, #0x4]\n\ - add r0, r0, #0x1\n\ - strb r0, [r5, #0x4]\n\ - b ._308\n\ -._307:\n\ - .align 2, 0\n\ -._306:\n\ - .word unk_2038798\n\ -._301:\n\ - bl UpdatePaletteFade\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._308 @cond_branch\n\ - ldr r0, ._309 @ unk_2038794\n\ - ldr r0, [r0]\n\ - bl _call_via_r0\n\ -._308:\n\ - add sp, sp, #0x4\n\ - pop {r4, r5}\n\ - pop {r0}\n\ - bx r0\n\ -._310:\n\ - .align 2, 0\n\ -._309:\n\ - .word unk_2038794"); + +void debug_sub_80A4300(void) +{ + gUnknown_0203847D = 0; + gPokemonStorageSystemPtr->unk_0005 = 0; + sub_8096884(); + if (gMain.callback2 == sub_8096B38) + unk_2038790 = 1; +} + +extern void (*unk_2038794)(void); +extern u32 unk_2038798; + +extern void unref_sub_809CB94(); + +void debug_sub_80A433C(u32 a, void (*b)(void)) +{ + unk_2038794 = b; + unk_2038798 = a; + SetMainCallback2(debug_sub_80A4300); +} + +void debug_sub_80A435C(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + unref_sub_809CB94(unk_2038798); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + unk_2038794(); + break; + } } + #endif void sub_8096AFC(void) @@ -592,12 +388,12 @@ void sub_8096B5C(void) { switch (gPokemonStorageSystemPtr->unk_0006) { - case 0: - ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690.pokemon, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e); - break; - case 1: - DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); - break; + case 0: + ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690.pokemon, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e); + break; + case 1: + DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); + break; } } @@ -611,24 +407,24 @@ void sub_8096BF0(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - BlendPalettes(0xffffffff, 16, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - PlaySE(SE_PC_LOGON); - gPokemonStorageSystemPtr->unk_000c.tileTag = 14; - gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; - gPokemonStorageSystemPtr->unk_000c.unk04 = 0; - gPokemonStorageSystemPtr->unk_000c.unk06 = 0; - sub_80C5CD4(&gPokemonStorageSystemPtr->unk_000c); - BlendPalettes(0xffffffff, 0, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 2: - if (sub_80C5DCC()) - SetPSSCallback(sub_8096C84); - break; + case 0: + BlendPalettes(0xffffffff, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + PlaySE(SE_PC_LOGON); + gPokemonStorageSystemPtr->unk_000c.tileTag = 14; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 0; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5CD4(&gPokemonStorageSystemPtr->unk_000c); + BlendPalettes(0xffffffff, 0, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 2: + if (sub_80C5DCC()) + SetPSSCallback(sub_8096C84); + break; } } @@ -638,605 +434,176 @@ void sub_8096C68(void) SetPSSCallback(sub_8096C84); } -#if DEBUG -__attribute__((naked)) -void sub_8096C84(void) -{ - asm("\ - push {r4, lr}\n\ - ldr r0, ._347 @ 0x2000000\n\ - ldrb r0, [r0, #0x4]\n\ - cmp r0, #0x6\n\ - bls ._345 @cond_branch\n\ - b ._466\n\ -._345:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._347 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._348:\n\ - .align 2, 0\n\ -._347:\n\ - .word 0x2000000\n\ - .word ._349\n\ -._349:\n\ - .word ._350\n\ - .word ._351\n\ - .word ._352\n\ - .word ._353\n\ - .word ._354\n\ - .word ._355\n\ - .word ._356\n\ -._350:\n\ - bl sub_809CA40\n\ - lsl r0, r0, #0x18\n\ - lsr r0, r0, #0x18\n\ - sub r0, r0, #0x1\n\ - cmp r0, #0xf\n\ - bls ._357 @cond_branch\n\ - b ._466\n\ -._357:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._360 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._361:\n\ - .align 2, 0\n\ -._360:\n\ - .word ._359\n\ -._359:\n\ - .word ._362\n\ - .word ._466\n\ - .word ._466\n\ - .word ._365\n\ - .word ._366\n\ - .word ._367\n\ - .word ._368\n\ - .word ._369\n\ - .word ._370\n\ - .word ._371\n\ - .word ._372\n\ - .word ._373\n\ - .word ._374\n\ - .word ._375\n\ - .word ._376\n\ - .word ._377\n\ -._362:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r1, ._379 @ 0x2000000\n\ - mov r0, #0x1\n\ - strb r0, [r1, #0x4]\n\ - b ._466\n\ -._380:\n\ - .align 2, 0\n\ -._379:\n\ - .word 0x2000000\n\ -._366:\n\ - ldr r4, ._383 @ 0x2000000\n\ - ldrb r0, [r4, #0x5]\n\ - cmp r0, #0x2\n\ - beq ._381 @cond_branch\n\ - mov r0, #0x10\n\ - bl PrintStorageActionText\n\ - mov r0, #0x3\n\ - strb r0, [r4, #0x4]\n\ - b ._466\n\ -._384:\n\ - .align 2, 0\n\ -._383:\n\ - .word 0x2000000\n\ -._381:\n\ - bl sub_809B0D4\n\ - ldr r0, ._386 @ sub_8096FC8\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._387:\n\ - .align 2, 0\n\ -._386:\n\ - .word sub_8096FC8+1\n\ -._367:\n\ - ldr r4, ._394 @ 0x2000000\n\ - ldrb r0, [r4, #0x5]\n\ - cmp r0, #0x2\n\ - beq ._388 @cond_branch\n\ - b ._466\n\ -._388:\n\ - bl sub_809BF20\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._391 @cond_branch\n\ - ldr r1, ._394 + 4 @ 0x11f2\n\ - add r0, r4, r1\n\ - ldrh r0, [r0]\n\ - bl ItemIsMail\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._391 @cond_branch\n\ - b ._392\n\ -._391:\n\ - ldr r0, ._394 + 8 @ sub_8097004\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._395:\n\ - .align 2, 0\n\ -._394:\n\ - .word 0x2000000\n\ - .word 0x11f2\n\ - .word sub_8097004+1\n\ -._365:\n\ - ldr r0, ._399 @ unk_2038790\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._396 @cond_branch\n\ - b ._466\n\ -._396:\n\ - ldr r0, ._399 + 4 @ sub_8097BA0\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._400:\n\ - .align 2, 0\n\ -._399:\n\ - .word unk_2038790\n\ - .word sub_8097BA0+1\n\ -._377:\n\ - ldr r0, ._404 @ unk_2038790\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._401 @cond_branch\n\ - b ._466\n\ -._401:\n\ - ldr r0, ._404 + 4 @ sub_8097CC0\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._405:\n\ - .align 2, 0\n\ -._404:\n\ - .word unk_2038790\n\ - .word sub_8097CC0+1\n\ -._368:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._407 @ sub_809789C\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._408:\n\ - .align 2, 0\n\ -._407:\n\ - .word sub_809789C+1\n\ -._369:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._410 @ sub_8097078\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._411:\n\ - .align 2, 0\n\ -._410:\n\ - .word sub_8097078+1\n\ -._370:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r4, ._414 @ 0x2000000\n\ - ldr r0, ._414 + 4 @ gPokemonStorage\n\ - ldrb r0, [r0]\n\ - add r0, r0, #0x1\n\ - ldr r2, ._414 + 8 @ 0x8b2\n\ - add r1, r4, r2\n\ - strh r0, [r1]\n\ - cmp r0, #0xd\n\ - ble ._416 @cond_branch\n\ - mov r0, #0x0\n\ - b ._413\n\ -._415:\n\ - .align 2, 0\n\ -._414:\n\ - .word 0x2000000\n\ - .word gPokemonStorage\n\ - .word 0x8b2\n\ -._371:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r4, ._418 @ 0x2000000\n\ - ldr r0, ._418 + 4 @ gPokemonStorage\n\ - ldrb r0, [r0]\n\ - sub r0, r0, #0x1\n\ - ldr r2, ._418 + 8 @ 0x8b2\n\ - add r1, r4, r2\n\ - strh r0, [r1]\n\ - cmp r0, #0\n\ - bge ._416 @cond_branch\n\ - mov r0, #0xd\n\ -._413:\n\ - strh r0, [r1]\n\ -._416:\n\ - ldrb r0, [r1]\n\ - bl sub_8099C70\n\ - mov r0, #0x2\n\ - strb r0, [r4, #0x4]\n\ - b ._466\n\ -._419:\n\ - .align 2, 0\n\ -._418:\n\ - .word 0x2000000\n\ - .word gPokemonStorage\n\ - .word 0x8b2\n\ -._372:\n\ - bl sub_809BE80\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._428 @cond_branch\n\ - ldr r4, ._423 @ 0x2000000\n\ - ldr r1, ._423 + 4 @ 0x11f2\n\ - add r0, r4, r1\n\ - ldrh r0, [r0]\n\ - bl ItemIsMail\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._421 @cond_branch\n\ -._392:\n\ - mov r0, #0x5\n\ - strb r0, [r4, #0x4]\n\ - b ._466\n\ -._424:\n\ - .align 2, 0\n\ -._423:\n\ - .word 0x2000000\n\ - .word 0x11f2\n\ -._421:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._426 @ sub_809746C\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._427:\n\ - .align 2, 0\n\ -._426:\n\ - .word sub_809746C+1\n\ -._374:\n\ - bl sub_809BE80\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._428 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._430 @ sub_80972A8\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._431:\n\ - .align 2, 0\n\ -._430:\n\ - .word sub_80972A8+1\n\ -._375:\n\ - bl sub_809BEBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._432 @cond_branch\n\ -._428:\n\ - ldr r1, ._434 @ 0x2000000\n\ - mov r0, #0x4\n\ - strb r0, [r1, #0x4]\n\ - b ._466\n\ -._435:\n\ - .align 2, 0\n\ -._434:\n\ - .word 0x2000000\n\ -._432:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._437 @ c3_0808DC50\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._438:\n\ - .align 2, 0\n\ -._437:\n\ - .word c3_0808DC50+1\n\ -._373:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._440 @ sub_8097390\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._441:\n\ - .align 2, 0\n\ -._440:\n\ - .word sub_8097390+1\n\ -._376:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._443 @ sub_80972FC\n\ - bl SetPSSCallback\n\ - b ._466\n\ -._444:\n\ - .align 2, 0\n\ -._443:\n\ - .word sub_80972FC+1\n\ -._351:\n\ - bl sub_809AC00\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._466 @cond_branch\n\ - bl sub_809BF48\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._446 @cond_branch\n\ - bl sub_80986E8\n\ - b ._447\n\ -._446:\n\ - bl sub_8098710\n\ -._447:\n\ - ldr r4, ._450 @ 0x2000000\n\ - ldr r2, ._450 + 4 @ 0x11f6\n\ - add r0, r4, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._448 @cond_branch\n\ - bl BoxSetMosaic\n\ -._448:\n\ - mov r0, #0x0\n\ - strb r0, [r4, #0x4]\n\ - b ._466\n\ -._451:\n\ - .align 2, 0\n\ -._450:\n\ - .word 0x2000000\n\ - .word 0x11f6\n\ -._352:\n\ - bl sub_8099D34\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._466 @cond_branch\n\ - ldr r1, ._456 @ gPokemonStorage\n\ - ldr r0, ._456 + 4 @ 0x2000000\n\ - ldr r2, ._456 + 8 @ 0x8b2\n\ - add r0, r0, r2\n\ - ldrh r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, ._456 + 12 @ gUnknown_0203847C\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - bne ._455 @cond_branch\n\ - bl sub_809BF20\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._455 @cond_branch\n\ - bl sub_809B440\n\ - bl BoxSetMosaic\n\ - b ._455\n\ -._457:\n\ - .align 2, 0\n\ -._456:\n\ - .word gPokemonStorage\n\ - .word 0x2000000\n\ - .word 0x8b2\n\ - .word gUnknown_0203847C\n\ -._353:\n\ - ldr r0, ._460 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0xf3\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._466 @cond_branch\n\ - bl sub_8098A5C\n\ -._455:\n\ - ldr r1, ._460 + 4 @ 0x2000000\n\ - mov r0, #0x0\n\ - strb r0, [r1, #0x4]\n\ - b ._466\n\ -._461:\n\ - .align 2, 0\n\ -._460:\n\ - .word gMain\n\ - .word 0x2000000\n\ -._354:\n\ - mov r0, #0x20\n\ - bl PlaySE\n\ - mov r0, #0xd\n\ - b ._462\n\ -._355:\n\ - mov r0, #0x20\n\ - bl PlaySE\n\ - mov r0, #0x16\n\ -._462:\n\ - bl PrintStorageActionText\n\ - ldr r1, ._464 @ 0x2000000\n\ - mov r0, #0x6\n\ - strb r0, [r1, #0x4]\n\ - b ._466\n\ -._465:\n\ - .align 2, 0\n\ -._464:\n\ - .word 0x2000000\n\ -._356:\n\ - ldr r0, ._467 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0xf3\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._466 @cond_branch\n\ - bl sub_8098A5C\n\ - ldr r0, ._467 + 4 @ sub_8096C84\n\ - bl SetPSSCallback\n\ -._466:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._468:\n\ - .align 2, 0\n\ -._467:\n\ - .word gMain\n\ - .word sub_8096C84+1"); -} -#else void sub_8096C84(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - switch (sub_809CA40()) + case 0: + switch (sub_809CA40()) + { + case 1: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_0004 = 1; + break; + case 5: + if (gPokemonStorageSystemPtr->unk_0005 != 2) { - case 1: - PlaySE(SE_SELECT); - gPokemonStorageSystemPtr->unk_0004 = 1; - break; - case 5: - if (gPokemonStorageSystemPtr->unk_0005 != 2) - { - PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); - gPokemonStorageSystemPtr->unk_0004 = 3; - } - else - { - sub_809B0D4(); - SetPSSCallback(sub_8096FC8); - } - break; - case 6: - if (gPokemonStorageSystemPtr->unk_0005 == 2) - { - if (sub_809BF20() && ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) - { - gPokemonStorageSystemPtr->unk_0004 = 5; - } - else - { - SetPSSCallback(sub_8097004); - } - } - break; - case 4: - SetPSSCallback(sub_8097BA0); - break; - case 16: - SetPSSCallback(sub_8097CC0); - break; - case 7: - PlaySE(SE_SELECT); - SetPSSCallback(sub_809789C); - break; - case 8: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097078); - break; - case 9: - PlaySE(SE_SELECT); - gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox + 1; - if (gPokemonStorageSystemPtr->unk_08b2 > 13) - gPokemonStorageSystemPtr->unk_08b2 = 0; - sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); - gPokemonStorageSystemPtr->unk_0004 = 2; - break; - case 10: - PlaySE(SE_SELECT); - gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox - 1; - if (gPokemonStorageSystemPtr->unk_08b2 < 0) - gPokemonStorageSystemPtr->unk_08b2 = 13; - sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); - gPokemonStorageSystemPtr->unk_0004 = 2; - break; - case 11: - if (!sub_809BE80()) - { - if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) - { - gPokemonStorageSystemPtr->unk_0004 = 5; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_809746C); - } - } - else - { - gPokemonStorageSystemPtr->unk_0004 = 4; - } - break; - case 13: - if (sub_809BE80()) - { - gPokemonStorageSystemPtr->unk_0004 = 4; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_80972A8); - } - break; - case 14: - if (!sub_809BEBC()) - { - gPokemonStorageSystemPtr->unk_0004 = 4; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(c3_0808DC50); - } - break; - case 12: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097390); - break; - case 15: - PlaySE(SE_SELECT); - SetPSSCallback(sub_80972FC); - break; + PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + sub_809B0D4(); + SetPSSCallback(sub_8096FC8); } break; - case 1: - if (!sub_809AC00()) + case 6: + if (gPokemonStorageSystemPtr->unk_0005 == 2) { - if (sub_809BF48()) - sub_80986E8(); + if (sub_809BF20() && ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + gPokemonStorageSystemPtr->unk_0004 = 5; else - sub_8098710(); - if (gPokemonStorageSystemPtr->unk_11f6) - BoxSetMosaic(); - gPokemonStorageSystemPtr->unk_0004 = 0; + SetPSSCallback(sub_8097004); } break; - case 2: - if (!sub_8099D34()) + case 4: +#if DEBUG + if (unk_2038790 != 0) + break; +#endif + SetPSSCallback(sub_8097BA0); + break; + case 16: +#if DEBUG + if (unk_2038790 != 0) + break; +#endif + SetPSSCallback(sub_8097CC0); + break; + case 7: + PlaySE(SE_SELECT); + SetPSSCallback(sub_809789C); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097078); + break; + case 9: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox + 1; + if (gPokemonStorageSystemPtr->unk_08b2 > 13) + gPokemonStorageSystemPtr->unk_08b2 = 0; + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004 = 2; + break; + case 10: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox - 1; + if (gPokemonStorageSystemPtr->unk_08b2 < 0) + gPokemonStorageSystemPtr->unk_08b2 = 13; + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004 = 2; + break; + case 11: + if (!sub_809BE80()) { - gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; - if (!gUnknown_0203847C && !sub_809BF20()) + if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) { - sub_809B440(); - BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_0004 = 5; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_809746C); } - gPokemonStorageSystemPtr->unk_0004 = 0; + } + else + { + gPokemonStorageSystemPtr->unk_0004 = 4; } break; - case 3: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + case 13: + if (sub_809BE80()) { - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0004 = 0; + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972A8); } break; - case 4: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_LAST_POKE); - gPokemonStorageSystemPtr->unk_0004 = 6; + case 14: + if (!sub_809BEBC()) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(c3_0808DC50); + } break; - case 5: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); - gPokemonStorageSystemPtr->unk_0004 = 6; + case 12: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097390); break; - case 6: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + case 15: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972FC); + break; + } + break; + case 1: + if (!sub_809AC00()) + { + if (sub_809BF48()) + sub_80986E8(); + else + sub_8098710(); + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 2: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; + if (!gUnknown_0203847C && !sub_809BF20()) { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); + sub_809B440(); + BoxSetMosaic(); } - break; + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + gPokemonStorageSystemPtr->unk_0004 = 6; + break; + case 5: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + gPokemonStorageSystemPtr->unk_0004 = 6; + break; + case 6: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; } } -#endif void sub_8096FC8(void) { @@ -1280,456 +647,151 @@ void sub_8097004(void) } } -#if DEBUG -__attribute__((naked)) -void sub_8097078(void) -{ - asm("\ - push {r4, lr}\n\ - ldr r0, ._495 @ 0x2000000\n\ - ldrb r0, [r0, #0x4]\n\ - cmp r0, #0x5\n\ - bls ._493 @cond_branch\n\ - b ._597\n\ -._493:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._495 + 4 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._496:\n\ - .align 2, 0\n\ -._495:\n\ - .word 0x2000000\n\ - .word ._497\n\ -._497:\n\ - .word ._498\n\ - .word ._499\n\ - .word ._500\n\ - .word ._501\n\ - .word ._502\n\ - .word ._503\n\ -._498:\n\ - mov r0, #0x4\n\ - bl PrintStorageActionText\n\ - bl sub_809CE84\n\ - ldr r1, ._505 @ 0x2000000\n\ - mov r0, #0x1\n\ - strb r0, [r1, #0x4]\n\ - b ._597\n\ -._506:\n\ - .align 2, 0\n\ -._505:\n\ - .word 0x2000000\n\ -._499:\n\ - bl sub_809CF30\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x10\n\ - asr r0, r0, #0x10\n\ - cmp r0, #0x21\n\ - bls ._507 @cond_branch\n\ - b ._597\n\ -._507:\n\ - lsl r0, r0, #0x2\n\ - ldr r1, ._510 @ \n\ - add r0, r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ -._511:\n\ - .align 2, 0\n\ -._510:\n\ - .word ._509\n\ -._509:\n\ - .word ._513\n\ - .word ._513\n\ - .word ._514\n\ - .word ._515\n\ - .word ._516\n\ - .word ._517\n\ - .word ._518\n\ - .word ._519\n\ - .word ._520\n\ - .word ._521\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._597\n\ - .word ._545\n\ -._513:\n\ - bl sub_8098A5C\n\ - ldr r0, ._547 @ sub_8096C84\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._548:\n\ - .align 2, 0\n\ -._547:\n\ - .word sub_8096C84+1\n\ -._516:\n\ - bl sub_809BE80\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._563 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl sub_8098A5C\n\ - ldr r0, ._551 @ sub_80972A8\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._552:\n\ - .align 2, 0\n\ -._551:\n\ - .word sub_80972A8+1\n\ -._518:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl sub_8098A5C\n\ - ldr r0, ._554 @ sub_80972FC\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._555:\n\ - .align 2, 0\n\ -._554:\n\ - .word sub_80972FC+1\n\ -._517:\n\ - bl sub_809BEBC\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._563 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl sub_8098A5C\n\ - ldr r0, ._558 @ c3_0808DC50\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._559:\n\ - .align 2, 0\n\ -._558:\n\ - .word c3_0808DC50+1\n\ -._515:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl sub_8098A5C\n\ - ldr r0, ._561 @ sub_8097390\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._562:\n\ - .align 2, 0\n\ -._561:\n\ - .word sub_8097390+1\n\ -._514:\n\ - bl sub_809BE80\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._563 @cond_branch\n\ - ldr r4, ._566 @ 0x2000000\n\ - ldr r1, ._566 + 4 @ 0x11f2\n\ - add r0, r4, r1\n\ - ldrh r0, [r0]\n\ - bl ItemIsMail\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - bne ._564 @cond_branch\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl sub_8098A5C\n\ - ldr r0, ._566 + 8 @ sub_809746C\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._567:\n\ - .align 2, 0\n\ -._566:\n\ - .word 0x2000000\n\ - .word 0x11f2\n\ - .word sub_809746C+1\n\ -._520:\n\ - bl sub_809BE80\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._568 @cond_branch\n\ -._563:\n\ - ldr r1, ._570 @ 0x2000000\n\ - mov r0, #0x2\n\ - strb r0, [r1, #0x4]\n\ - b ._597\n\ -._571:\n\ - .align 2, 0\n\ -._570:\n\ - .word 0x2000000\n\ -._568:\n\ - ldr r4, ._574 @ 0x2000000\n\ - ldr r1, ._574 + 4 @ 0x11f9\n\ - add r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, #0\n\ - beq ._572 @cond_branch\n\ - mov r0, #0x4\n\ - strb r0, [r4, #0x4]\n\ - b ._597\n\ -._575:\n\ - .align 2, 0\n\ -._574:\n\ - .word 0x2000000\n\ - .word 0x11f9\n\ -._572:\n\ - ldr r1, ._578 @ 0x11f2\n\ - add r0, r4, r1\n\ - ldrh r0, [r0]\n\ - bl ItemIsMail\n\ - lsl r0, r0, #0x18\n\ - cmp r0, #0\n\ - beq ._576 @cond_branch\n\ -._564:\n\ - mov r0, #0x3\n\ - strb r0, [r4, #0x4]\n\ - b ._597\n\ -._579:\n\ - .align 2, 0\n\ -._578:\n\ - .word 0x11f2\n\ -._576:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._581 @ sub_8097594\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._582:\n\ - .align 2, 0\n\ -._581:\n\ - .word sub_8097594+1\n\ -._519:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._584 @ sub_8097788\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._585:\n\ - .align 2, 0\n\ -._584:\n\ - .word sub_8097788+1\n\ -._521:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - ldr r0, ._587 @ sub_80977E4\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._588:\n\ - .align 2, 0\n\ -._587:\n\ - .word sub_80977E4+1\n\ -._545:\n\ - mov r0, #0x5\n\ - bl PlaySE\n\ - bl sub_8098A5C\n\ - ldr r0, ._590 @ debug_sub_80A435C\n\ - bl SetPSSCallback\n\ - b ._597\n\ -._591:\n\ - .align 2, 0\n\ -._590:\n\ - .word debug_sub_80A435C+1\n\ -._500:\n\ - mov r0, #0x20\n\ - bl PlaySE\n\ - mov r0, #0xd\n\ - b ._593\n\ -._502:\n\ - mov r0, #0x20\n\ - bl PlaySE\n\ - mov r0, #0x11\n\ - b ._593\n\ -._501:\n\ - mov r0, #0x20\n\ - bl PlaySE\n\ - mov r0, #0x16\n\ -._593:\n\ - bl PrintStorageActionText\n\ - ldr r1, ._595 @ 0x2000000\n\ - mov r0, #0x5\n\ - strb r0, [r1, #0x4]\n\ - b ._597\n\ -._596:\n\ - .align 2, 0\n\ -._595:\n\ - .word 0x2000000\n\ -._503:\n\ - ldr r0, ._598 @ gMain\n\ - ldrh r1, [r0, #0x2e]\n\ - mov r0, #0xf3\n\ - and r0, r0, r1\n\ - cmp r0, #0\n\ - beq ._597 @cond_branch\n\ - bl sub_8098A5C\n\ - ldr r0, ._598 + 4 @ sub_8096C84\n\ - bl SetPSSCallback\n\ -._597:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ -._599:\n\ - .align 2, 0\n\ -._598:\n\ - .word gMain\n\ - .word sub_8096C84+1"); -} -#else void sub_8097078(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - PrintStorageActionText(PC_TEXT_IS_SELECTED); - sub_809CE84(); - gPokemonStorageSystemPtr->unk_0004 = 1; + case 0: + PrintStorageActionText(PC_TEXT_IS_SELECTED); + sub_809CE84(); + gPokemonStorageSystemPtr->unk_0004 = 1; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); break; - case 1: - switch (sub_809CF30()) + case 3: + if (sub_809BE80()) { - case -1: - case 0: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 3: - if (sub_809BE80()) - { - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_80972A8); - } - break; - case 5: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_80972FC); - break; - case 4: - if (!sub_809BEBC()) - { - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(c3_0808DC50); - } - break; - case 2: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097390); - break; - case 1: - if (sub_809BE80()) - { - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) - { - gPokemonStorageSystemPtr->unk_0004 = 3; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_809746C); - } - break; - case 7: - if (sub_809BE80()) - { - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else if (gPokemonStorageSystemPtr->unk_11f9) - { - gPokemonStorageSystemPtr->unk_0004 = 4; - } - else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) - { - gPokemonStorageSystemPtr->unk_0004 = 3; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097594); - } - break; - case 6: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097788); - break; - case 8: - PlaySE(SE_SELECT); - SetPSSCallback(sub_80977E4); - break; + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972A8); } break; - case 2: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_LAST_POKE); - gPokemonStorageSystemPtr->unk_0004 = 5; + case 5: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972FC); break; case 4: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); - gPokemonStorageSystemPtr->unk_0004 = 5; + if (!sub_809BEBC()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(c3_0808DC50); + } break; - case 3: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); - gPokemonStorageSystemPtr->unk_0004 = 5; + case 2: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097390); break; - case 5: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + case 1: + if (sub_809BE80()) { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); sub_8098A5C(); - SetPSSCallback(sub_8096C84); + SetPSSCallback(sub_809746C); + } + break; + case 7: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else if (gPokemonStorageSystemPtr->unk_11f9) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097594); } break; + case 6: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097788); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80977E4); + break; +#if DEBUG + case 32: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(debug_sub_80A435C); + break; +#endif + } + break; + case 2: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 3: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; } } -#endif void sub_80972A8(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - sub_809B100(0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - if (gUnknown_0203847C) - SetPSSCallback(sub_8097858); - else - SetPSSCallback(sub_8096C84); - } - break; + case 0: + sub_809B100(0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; } } @@ -1737,19 +799,19 @@ void sub_80972FC(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - sub_809B100(1); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - if (gUnknown_0203847C) - SetPSSCallback(sub_8097858); - else - SetPSSCallback(sub_8096C84); - } - break; + case 0: + sub_809B100(1); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; } } @@ -1757,17 +819,17 @@ void c3_0808DC50(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - sub_809B100(2); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - BoxSetMosaic(); - SetPSSCallback(sub_8096C84); - } - break; + case 0: + sub_809B100(2); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; } } @@ -1775,50 +837,50 @@ void sub_8097390(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - if (CalculatePlayerPartyCount() == 6) - { - PrintStorageActionText(PC_TEXT_PARTY_FULL); - gPokemonStorageSystemPtr->unk_0004 = 1; - } - else - { - sub_809B0E0(); - sub_809B100(0); - gPokemonStorageSystemPtr->unk_0004 = 2; - } - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - if (!sub_809B130()) - { - sub_809880C(); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 3: - if (!sub_8098830()) - { - sub_809B100(1); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 4: - if (!sub_809B130()) - { - sub_80987DC(); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 5: - SetPSSCallback(sub_8097004); - break; + case 0: + if (CalculatePlayerPartyCount() == 6) + { + PrintStorageActionText(PC_TEXT_PARTY_FULL); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + sub_809B0E0(); + sub_809B100(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + if (!sub_809B130()) + { + sub_809880C(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 3: + if (!sub_8098830()) + { + sub_809B100(1); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 4: + if (!sub_809B130()) + { + sub_80987DC(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 5: + SetPSSCallback(sub_8097004); + break; } } @@ -1828,60 +890,60 @@ void sub_809746C(void) switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); - sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); - sub_809634C(gUnknown_0203847E); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - r4 = sub_8096368(); - if (r4 == 200); - else if (r4 == 201) + case 0: + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gUnknown_0203847E); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + r4 = sub_8096368(); + if (r4 == 200); + else if (r4 == 201) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + SetPSSCallback(sub_8096C84); + } + else + { + if (sub_809B62C(r4)) { sub_8098A5C(); sub_809635C(); sub_8096310(); - SetPSSCallback(sub_8096C84); + gPokemonStorageSystemPtr->unk_0004 = 2; } else { - if (sub_809B62C(r4)) - { - sub_8098A5C(); - sub_809635C(); - sub_8096310(); - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else - { - PrintStorageActionText(PC_TEXT_BOX_IS_FULL); - gPokemonStorageSystemPtr->unk_0004 = 4; - } - gUnknown_0203847E = r4; + PrintStorageActionText(PC_TEXT_BOX_IS_FULL); + gPokemonStorageSystemPtr->unk_0004 = 4; } - break; - case 2: - party_compaction(); - sub_8099310(); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 3: - if (sub_8099374() == 0) - { - sub_809B6BC(); - BoxSetMosaic(); - sub_80987DC(); - SetPSSCallback(sub_8096C84); - } - break; - case 4: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); - gPokemonStorageSystemPtr->unk_0004 = 1; - } - break; + gUnknown_0203847E = r4; + } + break; + case 2: + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 3: + if (sub_8099374() == 0) + { + sub_809B6BC(); + BoxSetMosaic(); + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + break; } } @@ -1889,129 +951,129 @@ void sub_8097594(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - PrintStorageActionText(PC_TEXT_RELEASE_POKE); - sub_8098A38(1); - gPokemonStorageSystemPtr->unk_0004++; - // fallthrough - case 1: - switch (Menu_ProcessInputNoWrap()) - { - case -1: - case 1: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 0: - sub_8098A5C(); - sub_809B7D4(); - sub_809B6DC(); - gPokemonStorageSystemPtr->unk_0004++; - break; - } - break; - case 2: - sub_809B960(); - if (!sub_809B734()) - { - while (1) - { - s8 r0 = sub_809B960(); - if (r0 == 1) - { - gPokemonStorageSystemPtr->unk_0004++; - break; - } - if (r0 == 0) - { - gPokemonStorageSystemPtr->unk_0004 = 8; - break; - } - } - } - break; - case 3: - sub_809B760(); - sub_809801C(); - PrintStorageActionText(PC_TEXT_WAS_RELEASED); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 4: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_BYE_BYE); + case 0: + PrintStorageActionText(PC_TEXT_RELEASE_POKE); + sub_8098A38(1); + gPokemonStorageSystemPtr->unk_0004++; + // fallthrough + case 1: + switch (Menu_ProcessInputNoWrap()) + { + case -1: + case 1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + sub_8098A5C(); + sub_809B7D4(); + sub_809B6DC(); gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 5: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + break; + } + break; + case 2: + sub_809B960(); + if (!sub_809B734()) + { + while (1) { - sub_8098A5C(); - if (gUnknown_0203847C) + s8 r0 = sub_809B960(); + if (r0 == 1) { - party_compaction(); - sub_8099310(); gPokemonStorageSystemPtr->unk_0004++; + break; } - else + if (r0 == 0) { - gPokemonStorageSystemPtr->unk_0004 = 7; + gPokemonStorageSystemPtr->unk_0004 = 8; + break; } } - break; - case 6: - if (sub_8099374() == 0) - { - sub_809B440(); - BoxSetMosaic(); - sub_80987DC(); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 7: - SetPSSCallback(sub_8096C84); - break; - case 8: - PrintStorageActionText(PC_TEXT_WAS_RELEASED); + } + break; + case 3: + sub_809B760(); + sub_809801C(); + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_BYE_BYE); gPokemonStorageSystemPtr->unk_0004++; - break; - case 9: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_SURPRISE); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 10: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8098A5C(); - sub_8099958(); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 11: - if (!sub_8099990()) - { - sub_809B7AC(); - PrintStorageActionText(PC_TEXT_CAME_BACK); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 12: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + } + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + if (gUnknown_0203847C) { - PrintStorageActionText(PC_TEXT_WORRIED); + party_compaction(); + sub_8099310(); gPokemonStorageSystemPtr->unk_0004++; } - break; - case 13: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + else { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); + gPokemonStorageSystemPtr->unk_0004 = 7; } - break; + } + break; + case 6: + if (sub_8099374() == 0) + { + sub_809B440(); + BoxSetMosaic(); + sub_80987DC(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 7: + SetPSSCallback(sub_8096C84); + break; + case 8: + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 9: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_SURPRISE); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 10: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + sub_8099958(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 11: + if (!sub_8099990()) + { + sub_809B7AC(); + PrintStorageActionText(PC_TEXT_CAME_BACK); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 12: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_WORRIED); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 13: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; } } @@ -2019,19 +1081,19 @@ void sub_8097788(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - sub_809BC18(); - BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!UpdatePaletteFade()) - { - gUnknown_0203847F = 0; - gPokemonStorageSystemPtr->unk_0006 = 0; - SetMainCallback2(sub_8096B5C); - } - break; + case 0: + sub_809BC18(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 0; + gPokemonStorageSystemPtr->unk_0006 = 0; + SetMainCallback2(sub_8096B5C); + } + break; } } @@ -2039,22 +1101,22 @@ void sub_80977E4(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - PrintStorageActionText(PC_TEXT_MARK_POKE); - gPokemonStorageSystemPtr->unk_12bc.markings = gPokemonStorageSystemPtr->unk_11f7; - sub_80F7418(gPokemonStorageSystemPtr->unk_11f7, 0xb0, 0x10); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_80F7500()) - { - sub_80F7470(); - sub_8098A5C(); - sub_809BDD8(gPokemonStorageSystemPtr->unk_12bc.markings); - sub_809801C(); - SetPSSCallback(sub_8096C84); - } - break; + case 0: + PrintStorageActionText(PC_TEXT_MARK_POKE); + gPokemonStorageSystemPtr->unk_12bc.markings = gPokemonStorageSystemPtr->unk_11f7; + sub_80F7418(gPokemonStorageSystemPtr->unk_11f7, 0xb0, 0x10); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_80F7500()) + { + sub_80F7470(); + sub_8098A5C(); + sub_809BDD8(gPokemonStorageSystemPtr->unk_12bc.markings); + sub_809801C(); + SetPSSCallback(sub_8096C84); + } + break; } } @@ -2062,18 +1124,18 @@ void sub_8097858(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - party_compaction(); - sub_8099310(); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (sub_8099374() == 0) - { - sub_80987DC(); - SetPSSCallback(sub_8096C84); - } - break; + case 0: + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (sub_8099374() == 0) + { + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; } } @@ -2081,36 +1143,36 @@ void sub_809789C(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); - sub_809CE84(); - gPokemonStorageSystemPtr->unk_0004++; + case 0: + PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); + sub_809CE84(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_809A860(TRUE); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); break; - case 1: - switch (sub_809CF30()) - { - case -1: - case 0: - sub_809A860(TRUE); - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 11: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097B44); - break; - case 10: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097974); - break; - case 9: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097A64); - break; - } + case 11: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097B44); + break; + case 10: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097974); + break; + case 9: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097A64); break; + } + break; } } @@ -2118,55 +1180,55 @@ void sub_8097974(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - sub_8098A80(); - PrintStorageActionText(PC_TEXT_PICK_A_THEME); + case 0: + sub_8098A80(); + PrintStorageActionText(PC_TEXT_PICK_A_THEME); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + gPokemonStorageSystemPtr->unk_0d5e = sub_809CF30(); + switch (gPokemonStorageSystemPtr->unk_0d5e) + { + case -1: + sub_809A860(TRUE); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 12 ... 15: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_0d5e -= 12; + sub_8098AA8(gPokemonStorageSystemPtr->unk_0d5e); + PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); gPokemonStorageSystemPtr->unk_0004++; break; - case 1: - gPokemonStorageSystemPtr->unk_0d5e = sub_809CF30(); - switch (gPokemonStorageSystemPtr->unk_0d5e) - { - case -1: - sub_809A860(TRUE); - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 12 ... 15: - PlaySE(SE_SELECT); - gPokemonStorageSystemPtr->unk_0d5e -= 12; - sub_8098AA8(gPokemonStorageSystemPtr->unk_0d5e); - PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); - gPokemonStorageSystemPtr->unk_0004++; - break; - } + } + break; + case 2: + gPokemonStorageSystemPtr->unk_0d60 = sub_809CF30(); + switch (gPokemonStorageSystemPtr->unk_0d60) + { + case -1: + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004 = 0; break; - case 2: - gPokemonStorageSystemPtr->unk_0d60 = sub_809CF30(); - switch (gPokemonStorageSystemPtr->unk_0d60) - { - case -1: - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0004 = 0; - break; - case -2: - break; - default: - PlaySE(SE_SELECT); - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0d60 -= 16; - sub_8099DCC(gPokemonStorageSystemPtr->unk_0d60); - gPokemonStorageSystemPtr->unk_0004++; - break; - } + case -2: break; - case 3: - if (!sub_8099E08()) - { - sub_809A860(TRUE); - SetPSSCallback(sub_8096C84); - } + default: + PlaySE(SE_SELECT); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0d60 -= 16; + sub_8099DCC(gPokemonStorageSystemPtr->unk_0d60); + gPokemonStorageSystemPtr->unk_0004++; break; + } + break; + case 3: + if (!sub_8099E08()) + { + sub_809A860(TRUE); + SetPSSCallback(sub_8096C84); + } + break; } } @@ -2174,45 +1236,45 @@ void sub_8097A64(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); - sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); - sub_809634C(gPokemonStorage.currentBox); - gPokemonStorageSystemPtr->unk_0004++; + case 0: + PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); + sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + gPokemonStorageSystemPtr->unk_08b2 = sub_8096368(); + switch (gPokemonStorageSystemPtr->unk_08b2) + { + case 200: break; - case 1: - gPokemonStorageSystemPtr->unk_08b2 = sub_8096368(); - switch (gPokemonStorageSystemPtr->unk_08b2) + default: + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + if (gPokemonStorageSystemPtr->unk_08b2 == 201 || gPokemonStorageSystemPtr->unk_08b2 == gPokemonStorage.currentBox) { - case 200: - break; - default: - sub_8098A5C(); - sub_809635C(); - sub_8096310(); - if (gPokemonStorageSystemPtr->unk_08b2 == 201 || gPokemonStorageSystemPtr->unk_08b2 == gPokemonStorage.currentBox) - { - sub_809A860(TRUE); - SetPSSCallback(sub_8096C84); - } - else - { - gPokemonStorageSystemPtr->unk_0004++; - } - break; + sub_809A860(TRUE); + SetPSSCallback(sub_8096C84); } - break; - case 2: - sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 3: - if (!sub_8099D34()) + else { - gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; - SetPSSCallback(sub_8096C84); + gPokemonStorageSystemPtr->unk_0004++; } break; + } + break; + case 2: + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 3: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; + SetPSSCallback(sub_8096C84); + } + break; } } @@ -2220,19 +1282,19 @@ void sub_8097B44(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - sub_809BB90(); - BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!UpdatePaletteFade()) - { - gUnknown_0203847F = 1; - gPokemonStorageSystemPtr->unk_0006 = 1; - SetMainCallback2(sub_8096B5C); - } - break; + case 0: + sub_809BB90(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 1; + gPokemonStorageSystemPtr->unk_0006 = 1; + SetMainCallback2(sub_8096B5C); + } + break; } } @@ -2240,110 +1302,117 @@ void sub_8097BA0(void) { switch (gPokemonStorageSystemPtr->unk_0004) { - case 0: - if (sub_809BF20()) - { - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_HOLDING_POKE); - gPokemonStorageSystemPtr->unk_0004 = 1; - } - else - { - PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_EXIT_BOX); - sub_8098A38(0); - gPokemonStorageSystemPtr->unk_0004 = 2; - } - break; + case 0: + if (sub_809BF20()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_EXIT_BOX); + sub_8098A38(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (Menu_ProcessInputNoWrap()) + { case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - switch (Menu_ProcessInputNoWrap()) - { - case 1: - case -1: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 0: - PlaySE(SE_PC_OFF); - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0004++; - break; - } + case -1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); break; - case 3: - gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; - gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; - gPokemonStorageSystemPtr->unk_000c.unk04 = 20; - gPokemonStorageSystemPtr->unk_000c.unk06 = 0; - sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + case 0: + PlaySE(SE_PC_OFF); + sub_8098A5C(); gPokemonStorageSystemPtr->unk_0004++; break; - case 4: - if (sub_80C5F98()) - { - gPlayerPartyCount = CalculatePlayerPartyCount(); - SetMainCallback2(sub_80961A8); - } - break; + } + break; + case 3: + gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 20; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (sub_80C5F98()) + { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; } } -void sub_8097CC0(void) { - switch (gPokemonStorageSystemPtr->unk_0004) { +void sub_8097CC0(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + if (sub_809BF20()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_CONTINUE_BOX); + sub_8098A38(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (Menu_ProcessInputNoWrap()) + { case 0: - if (sub_809BF20()) { - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_HOLDING_POKE); - gPokemonStorageSystemPtr->unk_0004 = 1; - } - else { - PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_CONTINUE_BOX); - sub_8098A38(0); - gPokemonStorageSystemPtr->unk_0004 = 2; - } + sub_8098A5C(); + SetPSSCallback(sub_8096C84); break; + case -1: case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - switch (Menu_ProcessInputNoWrap()) { - case 0: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case -1: - case 1: - PlaySE(SE_PC_OFF); - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0004++; - break; - } - break; - case 3: - gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; - gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; - gPokemonStorageSystemPtr->unk_000c.unk04 = 20; - gPokemonStorageSystemPtr->unk_000c.unk06 = 0; - sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + PlaySE(SE_PC_OFF); + sub_8098A5C(); gPokemonStorageSystemPtr->unk_0004++; break; - case 4: - if (sub_80C5F98()) { - gPlayerPartyCount = CalculatePlayerPartyCount(); - SetMainCallback2(sub_80961A8); - } - break; + } + break; + case 3: + gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 20; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (sub_80C5F98()) + { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; } } @@ -2826,28 +1895,29 @@ bool8 sub_8098830(void) { switch (gPokemonStorageSystemPtr->unk_08ae) { - case 0: - if (!sub_8098520()) - { - sub_809B068(); - gPokemonStorageSystemPtr->unk_08ae++; - } - break; - case 1: - if (!sub_809AC00()) - { - if (gPokemonStorageSystemPtr->unk_11f6) - BoxSetMosaic(); - gPokemonStorageSystemPtr->unk_08ae++; - } - break; - case 2: - return FALSE; + case 0: + if (!sub_8098520()) + { + sub_809B068(); + gPokemonStorageSystemPtr->unk_08ae++; + } + break; + case 1: + if (!sub_809AC00()) + { + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_08ae++; + } + break; + case 2: + return FALSE; } return TRUE; } -const struct StorageAction gPCStorageActionTexts[] = { +const struct StorageAction gPCStorageActionTexts[] = +{ {PCText_ExitBox, 0}, {PCText_WhatYouDo, 0}, {PCText_PickATheme, 0}, @@ -2873,41 +1943,37 @@ const struct StorageAction gPCStorageActionTexts[] = { {PCText_PleaseRemoveMail, 0} }; -void PrintStorageActionText(u8 index) { +void PrintStorageActionText(u8 index) +{ u8 *ptr; Menu_DrawStdWindowFrame(10, 16, 29, 19); switch (gPCStorageActionTexts[index].format) { - - case PC_TEXT_FMT_UNK_02: - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); - break; - - case PC_TEXT_FMT_UNK_05: - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_26e4); - break; - - case PC_TEXT_FMT_MON_NAME: - // {var} + " is selected." - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_11fa); - ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); - break; - - case PC_TEXT_FMT_MON_NAME_2: - // {var} + " was released." - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_26e4); + case PC_TEXT_FMT_UNK_02: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); + break; + case PC_TEXT_FMT_UNK_05: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_26e4); + break; + case PC_TEXT_FMT_MON_NAME: + // {var} + " is selected." + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_11fa); + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); + break; + case PC_TEXT_FMT_MON_NAME_2: + // {var} + " was released." + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_26e4); #if ENGLISH - ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); #elif GERMAN - ptr = de_sub_8073174(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = de_sub_8073174(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); #endif - break; - - case PC_TEXT_FMT_UNK_03: + break; + case PC_TEXT_FMT_UNK_03: { const u8 *stringLength; const u8 *text; @@ -2919,10 +1985,8 @@ void PrintStorageActionText(u8 index) { ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); ptr = StringCopy(ptr, stringLength); } - break; - - case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK: - // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1) + break; + case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK: { const u8 *stringLength; const u8 *text; @@ -2934,12 +1998,11 @@ void PrintStorageActionText(u8 index) { ptr = StringCopy(ptr - 1, gPokemonStorageSystemPtr->unk_26e4); ptr = StringCopy(ptr, stringLength); } - break; - - case PC_TEXT_FMT_NORMAL: - default: - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); - break; + break; + case PC_TEXT_FMT_NORMAL: + default: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + break; } while (ptr < gPokemonStorageSystemPtr->unk_26a6) @@ -3029,30 +2092,30 @@ void sub_8098AA8(u8 a0) sub_809CDCC(); switch (a0) { - case 0: - sub_809CDEC(16); - sub_809CDEC(17); - sub_809CDEC(18); - sub_809CDEC(19); - break; - case 1: - sub_809CDEC(20); - sub_809CDEC(21); - sub_809CDEC(22); - sub_809CDEC(23); - break; - case 2: - sub_809CDEC(24); - sub_809CDEC(25); - sub_809CDEC(26); - sub_809CDEC(27); - break; - case 3: - sub_809CDEC(28); - sub_809CDEC(29); - sub_809CDEC(30); - sub_809CDEC(31); - break; + case 0: + sub_809CDEC(16); + sub_809CDEC(17); + sub_809CDEC(18); + sub_809CDEC(19); + break; + case 1: + sub_809CDEC(20); + sub_809CDEC(21); + sub_809CDEC(22); + sub_809CDEC(23); + break; + case 2: + sub_809CDEC(24); + sub_809CDEC(25); + sub_809CDEC(26); + sub_809CDEC(27); + break; + case 3: + sub_809CDEC(28); + sub_809CDEC(29); + sub_809CDEC(30); + sub_809CDEC(31); + break; } sub_809CE84(); } -- cgit v1.2.3 From 18f8600ffd714f191bac2061d2e1c3c349c1d6f2 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 18 Feb 2018 20:03:17 -0500 Subject: Backport sub_8148F3C --- src/scene/intro_credits_graphics.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c index 6aadafc58..3975fc311 100644 --- a/src/scene/intro_credits_graphics.c +++ b/src/scene/intro_credits_graphics.c @@ -438,25 +438,27 @@ u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d) void sub_8148F3C(u8 taskId) { - s16 r4; + s16 data1; + s16 data4; + s16 data7; s32 r2; - r4 = gTasks[taskId].data[1]; - if (r4 != 0) + data1 = gTasks[taskId].data[1]; + if (data1 != 0) { r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3]; - r2 -= 16 * (u16)r4; + r2 -= 16 * (u16)data1; gTasks[taskId].data[2] = r2 >> 16; gTasks[taskId].data[3] = r2; REG_BG1HOFS = gTasks[taskId].data[2]; REG_BG1VOFS = gUnknown_02039358 + gUnknown_0203935A; } - r4 = gTasks[taskId].data[4]; - if (r4 != 0) + data4 = gTasks[taskId].data[4]; + if (data4 != 0) { r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; - r2 -= 16 * (u16)r4; + r2 -= 16 * (u16)data4; gTasks[taskId].data[5] = r2 >> 16; gTasks[taskId].data[6] = r2; REG_BG2HOFS = gTasks[taskId].data[5]; @@ -466,11 +468,11 @@ void sub_8148F3C(u8 taskId) REG_BG2VOFS = gUnknown_02039358; } - r4 = gTasks[taskId].data[7]; - if (r4 != 0) + data7 = gTasks[taskId].data[7]; + if (data7 != 0) { r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9]; - r2 -= 16 * (u16)r4; + r2 -= 16 * (u16)data7; gTasks[taskId].data[8] = r2 >> 16; gTasks[taskId].data[9] = r2; REG_BG3HOFS = gTasks[taskId].data[8]; -- cgit v1.2.3 From daa05c1b7c5e079ad8554e88a290e07b333bd2db Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 18 Feb 2018 19:59:51 -0600 Subject: remove subdirectories --- src/bard_music.c | 225 + src/battle_tower.c | 2107 +++++++ src/berry.c | 1565 ++++++ src/berry_blender.c | 3560 ++++++++++++ src/berry_tag_screen.c | 453 ++ src/bike.c | 1071 ++++ src/birch_pc.c | 114 + src/blend_palette.c | 20 + src/braille_puzzles.c | 262 + src/cable_car.c | 1077 ++++ src/cable_car_util.c | 47 + src/cable_club.c | 1033 ++++ src/choose_party.c | 968 ++++ src/clear_save_data_menu.c | 177 + src/clock.c | 88 + src/coins.c | 84 + src/contest_painting.c | 786 +++ src/coord_event_weather.c | 119 + src/credits.c | 1677 ++++++ src/cute_sketch.c | 164 + src/daycare.c | 1713 ++++++ src/decompress.c | 113 + src/decoration.c | 4283 +++++++++++++++ src/decoration_inventory.c | 177 + src/dewford_trend.c | 332 ++ src/diploma.c | 139 + src/egg_hatch.c | 838 +++ src/engine/blend_palette.c | 20 - src/engine/cable_car_util.c | 47 - src/engine/cable_club.c | 1033 ---- src/engine/clear_save_data_menu.c | 177 - src/engine/clock.c | 88 - src/engine/decompress.c | 113 - src/engine/link.c | 1888 ------- src/engine/load_save.c | 168 - src/engine/main.c | 376 -- src/engine/main_menu.c | 1705 ------ src/engine/menu.c | 889 --- src/engine/menu_cursor.c | 781 --- src/engine/mystery_event_menu.c | 494 -- src/engine/mystery_event_msg.c | 51 - src/engine/mystery_event_script.c | 452 -- src/engine/name_string_util.c | 40 - src/engine/naming_screen.c | 2167 -------- src/engine/option_menu.c | 560 -- src/engine/palette.c | 832 --- src/engine/play_time.c | 73 - src/engine/random.c | 18 - src/engine/record_mixing.c | 1082 ---- src/engine/reset_rtc_screen.c | 692 --- src/engine/rtc.c | 378 -- src/engine/save.c | 929 ---- src/engine/save_failed_screen.c | 320 -- src/engine/save_menu_util.c | 148 - src/engine/script.c | 376 -- src/engine/sound.c | 568 -- src/engine/sprite.c | 1803 ------ src/engine/string_util.c | 561 -- src/engine/task.c | 215 - src/engine/text.c | 4385 --------------- src/engine/text_window.c | 275 - src/engine/tileset_anim.c | 991 ---- src/engine/time_events.c | 118 - src/engine/trade.c | 5692 ------------------- src/engine/trainer_card.c | 1617 ------ src/engine/trig.c | 549 -- src/engine/util.c | 525 -- src/event_data.c | 182 + src/event_object_movement.c | 9423 ++++++++++++++++++++++++++++++++ src/evolution_graphics.c | 614 +++ src/evolution_scene.c | 3959 ++++++++++++++ src/field/bard_music.c | 225 - src/field/battle_tower.c | 2107 ------- src/field/berry.c | 1565 ------ src/field/berry_tag_screen.c | 453 -- src/field/bike.c | 1071 ---- src/field/birch_pc.c | 114 - src/field/braille_puzzles.c | 262 - src/field/choose_party.c | 968 ---- src/field/coins.c | 84 - src/field/coord_event_weather.c | 119 - src/field/daycare.c | 1713 ------ src/field/decoration.c | 4283 --------------- src/field/decoration_inventory.c | 177 - src/field/dewford_trend.c | 332 -- src/field/diploma.c | 139 - src/field/event_data.c | 182 - src/field/event_object_movement.c | 9423 -------------------------------- src/field/field_camera.c | 496 -- src/field/field_control_avatar.c | 934 ---- src/field/field_door.c | 603 -- src/field/field_effect.c | 3385 ------------ src/field/field_effect_helpers.c | 1602 ------ src/field/field_fadetransition.c | 641 --- src/field/field_message_box.c | 155 - src/field/field_player_avatar.c | 1797 ------ src/field/field_poison.c | 146 - src/field/field_region_map.c | 123 - src/field/field_screen_effect.c | 331 -- src/field/field_special_scene.c | 382 -- src/field/field_specials.c | 2381 -------- src/field/field_tasks.c | 864 --- src/field/field_weather.c | 1310 ----- src/field/field_weather_effects.c | 2381 -------- src/field/fieldmap.c | 957 ---- src/field/fldeff_berrytree.c | 56 - src/field/fldeff_cut.c | 369 -- src/field/fldeff_decoration.c | 364 -- src/field/fldeff_escalator.c | 132 - src/field/fldeff_flash.c | 342 -- src/field/fldeff_poison.c | 44 - src/field/fldeff_recordmixing.c | 83 - src/field/fldeff_secret_base_pc.c | 69 - src/field/fldeff_secretpower.c | 526 -- src/field/fldeff_softboiled.c | 148 - src/field/fldeff_strength.c | 99 - src/field/fldeff_sweetscent.c | 88 - src/field/fldeff_teleport.c | 46 - src/field/heal_location.c | 63 - src/field/hof_pc.c | 42 - src/field/item.c | 697 --- src/field/item_menu.c | 4607 ---------------- src/field/item_use.c | 1200 ---- src/field/landmark.c | 417 -- src/field/lottery_corner.c | 174 - src/field/map_name_popup.c | 107 - src/field/map_obj_lock.c | 117 - src/field/mauville_man.c | 1345 ----- src/field/menu_helpers.c | 555 -- src/field/metatile_behavior.c | 1308 ----- src/field/money.c | 304 -- src/field/overworld.c | 2750 ---------- src/field/party_menu.c | 5321 ------------------ src/field/pc_screen_effect.c | 117 - src/field/player_pc.c | 1337 ----- src/field/pokeblock.c | 1147 ---- src/field/pokedex_area_screen.c | 20 - src/field/pokenav.c | 16 - src/field/region_map.c | 1971 ------- src/field/roamer.c | 245 - src/field/rotating_gate.c | 1155 ---- src/field/safari_zone.c | 253 - src/field/scrcmd.c | 2019 ------- src/field/script_menu.c | 1178 ---- src/field/script_movement.c | 227 - src/field/secret_base.c | 1716 ------ src/field/shop.c | 1251 ----- src/field/slot_machine.c | 5947 -------------------- src/field/start_menu.c | 941 ---- src/field/starter_choose.c | 757 --- src/field/trader.c | 263 - src/field/trainer_see.c | 559 -- src/field/tv.c | 3589 ------------ src/field/use_pokeblock.c | 904 --- src/field/wallclock.c | 1046 ---- src/field/wild_encounter.c | 4398 --------------- src/field_camera.c | 496 ++ src/field_control_avatar.c | 934 ++++ src/field_door.c | 603 ++ src/field_effect.c | 3385 ++++++++++++ src/field_effect_helpers.c | 1602 ++++++ src/field_fadetransition.c | 641 +++ src/field_message_box.c | 155 + src/field_player_avatar.c | 1797 ++++++ src/field_poison.c | 146 + src/field_region_map.c | 123 + src/field_screen_effect.c | 331 ++ src/field_special_scene.c | 382 ++ src/field_specials.c | 2381 ++++++++ src/field_tasks.c | 864 +++ src/field_weather.c | 1310 +++++ src/field_weather_effects.c | 2381 ++++++++ src/fieldmap.c | 957 ++++ src/fldeff_berrytree.c | 56 + src/fldeff_cut.c | 369 ++ src/fldeff_decoration.c | 364 ++ src/fldeff_escalator.c | 132 + src/fldeff_flash.c | 342 ++ src/fldeff_poison.c | 44 + src/fldeff_recordmixing.c | 83 + src/fldeff_secret_base_pc.c | 69 + src/fldeff_secretpower.c | 526 ++ src/fldeff_softboiled.c | 148 + src/fldeff_strength.c | 99 + src/fldeff_sweetscent.c | 88 + src/fldeff_teleport.c | 46 + src/hall_of_fame.c | 1366 +++++ src/heal_location.c | 63 + src/hof_pc.c | 42 + src/intro.c | 2810 ++++++++++ src/intro_credits_graphics.c | 645 +++ src/item.c | 697 +++ src/item_menu.c | 4607 ++++++++++++++++ src/item_use.c | 1200 ++++ src/landmark.c | 417 ++ src/learn_move.c | 1066 ++++ src/link.c | 1888 +++++++ src/load_save.c | 168 + src/lottery_corner.c | 174 + src/mail.c | 1159 ++++ src/mail_data.c | 208 + src/main.c | 376 ++ src/main_menu.c | 1705 ++++++ src/map_name_popup.c | 107 + src/map_obj_lock.c | 117 + src/mauville_man.c | 1345 +++++ src/menu.c | 889 +++ src/menu_cursor.c | 781 +++ src/menu_helpers.c | 555 ++ src/metatile_behavior.c | 1308 +++++ src/mon_markings.c | 617 +++ src/money.c | 304 ++ src/mystery_event_menu.c | 494 ++ src/mystery_event_msg.c | 51 + src/mystery_event_script.c | 452 ++ src/name_string_util.c | 40 + src/naming_screen.c | 2167 ++++++++ src/new_game.c | 236 + src/option_menu.c | 560 ++ src/overworld.c | 2750 ++++++++++ src/palette.c | 832 +++ src/party_menu.c | 5321 ++++++++++++++++++ src/pc_screen_effect.c | 117 + src/play_time.c | 73 + src/player_pc.c | 1337 +++++ src/pokeblock.c | 1147 ++++ src/pokeblock_feed.c | 1012 ++++ src/pokedex.c | 5519 +++++++++++++++++++ src/pokedex_area_screen.c | 20 + src/pokedex_cry_screen.c | 82 + src/pokemon/learn_move.c | 1066 ---- src/pokemon/mail.c | 1159 ---- src/pokemon/mail_data.c | 208 - src/pokemon/mon_markings.c | 617 --- src/pokemon/pokeblock_feed.c | 1012 ---- src/pokemon/pokedex.c | 5519 ------------------- src/pokemon/pokedex_cry_screen.c | 82 - src/pokemon/pokemon_1.c | 774 --- src/pokemon/pokemon_2.c | 1237 ----- src/pokemon/pokemon_3.c | 1401 ----- src/pokemon/pokemon_icon.c | 1276 ----- src/pokemon/pokemon_item_effect.c | 550 -- src/pokemon/pokemon_menu.c | 1220 ----- src/pokemon/pokemon_size_record.c | 217 - src/pokemon/pokemon_storage_system.c | 784 --- src/pokemon/pokemon_storage_system_2.c | 2121 ------- src/pokemon/pokemon_storage_system_3.c | 655 --- src/pokemon/pokemon_storage_system_4.c | 2849 ---------- src/pokemon/pokemon_storage_system_5.c | 16 - src/pokemon/pokemon_summary_screen.c | 5074 ----------------- src/pokemon_1.c | 774 +++ src/pokemon_2.c | 1237 +++++ src/pokemon_3.c | 1401 +++++ src/pokemon_icon.c | 1276 +++++ src/pokemon_item_effect.c | 550 ++ src/pokemon_menu.c | 1220 +++++ src/pokemon_size_record.c | 217 + src/pokemon_storage_system.c | 784 +++ src/pokemon_storage_system_2.c | 2121 +++++++ src/pokemon_storage_system_3.c | 655 +++ src/pokemon_storage_system_4.c | 2849 ++++++++++ src/pokemon_storage_system_5.c | 16 + src/pokemon_summary_screen.c | 5074 +++++++++++++++++ src/pokenav.c | 16 + src/random.c | 18 + src/record_mixing.c | 1082 ++++ src/region_map.c | 1971 +++++++ src/reset_rtc_screen.c | 692 +++ src/roamer.c | 245 + src/rotating_gate.c | 1155 ++++ src/rtc.c | 378 ++ src/safari_zone.c | 253 + src/save.c | 929 ++++ src/save_failed_screen.c | 320 ++ src/save_menu_util.c | 148 + src/scene/berry_blender.c | 3560 ------------ src/scene/cable_car.c | 1077 ---- src/scene/contest_painting.c | 786 --- src/scene/credits.c | 1677 ------ src/scene/cute_sketch.c | 164 - src/scene/egg_hatch.c | 838 --- src/scene/evolution_graphics.c | 614 --- src/scene/evolution_scene.c | 3959 -------------- src/scene/hall_of_fame.c | 1366 ----- src/scene/intro.c | 2810 ---------- src/scene/intro_credits_graphics.c | 645 --- src/scene/new_game.c | 236 - src/scene/title_screen.c | 911 --- src/scrcmd.c | 2019 +++++++ src/script.c | 376 ++ src/script_menu.c | 1178 ++++ src/script_movement.c | 227 + src/secret_base.c | 1716 ++++++ src/shop.c | 1251 +++++ src/slot_machine.c | 5947 ++++++++++++++++++++ src/sound.c | 568 ++ src/sprite.c | 1803 ++++++ src/start_menu.c | 941 ++++ src/starter_choose.c | 757 +++ src/string_util.c | 561 ++ src/task.c | 215 + src/text.c | 4385 +++++++++++++++ src/text_window.c | 275 + src/tileset_anim.c | 991 ++++ src/time_events.c | 118 + src/title_screen.c | 911 +++ src/trade.c | 5692 +++++++++++++++++++ src/trader.c | 263 + src/trainer_card.c | 1617 ++++++ src/trainer_see.c | 559 ++ src/trig.c | 549 ++ src/tv.c | 3589 ++++++++++++ src/use_pokeblock.c | 904 +++ src/util.c | 525 ++ src/wallclock.c | 1046 ++++ src/wild_encounter.c | 4398 +++++++++++++++ 316 files changed, 173810 insertions(+), 173810 deletions(-) create mode 100644 src/bard_music.c create mode 100644 src/battle_tower.c create mode 100644 src/berry.c create mode 100644 src/berry_blender.c create mode 100644 src/berry_tag_screen.c create mode 100644 src/bike.c create mode 100644 src/birch_pc.c create mode 100644 src/blend_palette.c create mode 100644 src/braille_puzzles.c create mode 100644 src/cable_car.c create mode 100644 src/cable_car_util.c create mode 100644 src/cable_club.c create mode 100644 src/choose_party.c create mode 100644 src/clear_save_data_menu.c create mode 100644 src/clock.c create mode 100644 src/coins.c create mode 100644 src/contest_painting.c create mode 100644 src/coord_event_weather.c create mode 100644 src/credits.c create mode 100644 src/cute_sketch.c create mode 100644 src/daycare.c create mode 100644 src/decompress.c create mode 100644 src/decoration.c create mode 100644 src/decoration_inventory.c create mode 100644 src/dewford_trend.c create mode 100644 src/diploma.c create mode 100644 src/egg_hatch.c delete mode 100644 src/engine/blend_palette.c delete mode 100644 src/engine/cable_car_util.c delete mode 100644 src/engine/cable_club.c delete mode 100644 src/engine/clear_save_data_menu.c delete mode 100644 src/engine/clock.c delete mode 100644 src/engine/decompress.c delete mode 100644 src/engine/link.c delete mode 100644 src/engine/load_save.c delete mode 100644 src/engine/main.c delete mode 100644 src/engine/main_menu.c delete mode 100644 src/engine/menu.c delete mode 100644 src/engine/menu_cursor.c delete mode 100644 src/engine/mystery_event_menu.c delete mode 100644 src/engine/mystery_event_msg.c delete mode 100644 src/engine/mystery_event_script.c delete mode 100644 src/engine/name_string_util.c delete mode 100644 src/engine/naming_screen.c delete mode 100644 src/engine/option_menu.c delete mode 100644 src/engine/palette.c delete mode 100644 src/engine/play_time.c delete mode 100644 src/engine/random.c delete mode 100644 src/engine/record_mixing.c delete mode 100644 src/engine/reset_rtc_screen.c delete mode 100644 src/engine/rtc.c delete mode 100644 src/engine/save.c delete mode 100644 src/engine/save_failed_screen.c delete mode 100644 src/engine/save_menu_util.c delete mode 100644 src/engine/script.c delete mode 100644 src/engine/sound.c delete mode 100644 src/engine/sprite.c delete mode 100644 src/engine/string_util.c delete mode 100644 src/engine/task.c delete mode 100644 src/engine/text.c delete mode 100644 src/engine/text_window.c delete mode 100644 src/engine/tileset_anim.c delete mode 100644 src/engine/time_events.c delete mode 100644 src/engine/trade.c delete mode 100644 src/engine/trainer_card.c delete mode 100644 src/engine/trig.c delete mode 100644 src/engine/util.c create mode 100644 src/event_data.c create mode 100644 src/event_object_movement.c create mode 100644 src/evolution_graphics.c create mode 100644 src/evolution_scene.c delete mode 100644 src/field/bard_music.c delete mode 100644 src/field/battle_tower.c delete mode 100644 src/field/berry.c delete mode 100644 src/field/berry_tag_screen.c delete mode 100644 src/field/bike.c delete mode 100644 src/field/birch_pc.c delete mode 100644 src/field/braille_puzzles.c delete mode 100644 src/field/choose_party.c delete mode 100644 src/field/coins.c delete mode 100644 src/field/coord_event_weather.c delete mode 100644 src/field/daycare.c delete mode 100644 src/field/decoration.c delete mode 100644 src/field/decoration_inventory.c delete mode 100644 src/field/dewford_trend.c delete mode 100644 src/field/diploma.c delete mode 100644 src/field/event_data.c delete mode 100644 src/field/event_object_movement.c delete mode 100644 src/field/field_camera.c delete mode 100644 src/field/field_control_avatar.c delete mode 100644 src/field/field_door.c delete mode 100644 src/field/field_effect.c delete mode 100644 src/field/field_effect_helpers.c delete mode 100644 src/field/field_fadetransition.c delete mode 100644 src/field/field_message_box.c delete mode 100644 src/field/field_player_avatar.c delete mode 100644 src/field/field_poison.c delete mode 100644 src/field/field_region_map.c delete mode 100644 src/field/field_screen_effect.c delete mode 100644 src/field/field_special_scene.c delete mode 100644 src/field/field_specials.c delete mode 100644 src/field/field_tasks.c delete mode 100644 src/field/field_weather.c delete mode 100644 src/field/field_weather_effects.c delete mode 100644 src/field/fieldmap.c delete mode 100644 src/field/fldeff_berrytree.c delete mode 100644 src/field/fldeff_cut.c delete mode 100644 src/field/fldeff_decoration.c delete mode 100644 src/field/fldeff_escalator.c delete mode 100644 src/field/fldeff_flash.c delete mode 100644 src/field/fldeff_poison.c delete mode 100644 src/field/fldeff_recordmixing.c delete mode 100644 src/field/fldeff_secret_base_pc.c delete mode 100644 src/field/fldeff_secretpower.c delete mode 100644 src/field/fldeff_softboiled.c delete mode 100644 src/field/fldeff_strength.c delete mode 100644 src/field/fldeff_sweetscent.c delete mode 100644 src/field/fldeff_teleport.c delete mode 100644 src/field/heal_location.c delete mode 100644 src/field/hof_pc.c delete mode 100644 src/field/item.c delete mode 100644 src/field/item_menu.c delete mode 100644 src/field/item_use.c delete mode 100644 src/field/landmark.c delete mode 100644 src/field/lottery_corner.c delete mode 100644 src/field/map_name_popup.c delete mode 100644 src/field/map_obj_lock.c delete mode 100644 src/field/mauville_man.c delete mode 100644 src/field/menu_helpers.c delete mode 100644 src/field/metatile_behavior.c delete mode 100644 src/field/money.c delete mode 100644 src/field/overworld.c delete mode 100644 src/field/party_menu.c delete mode 100644 src/field/pc_screen_effect.c delete mode 100644 src/field/player_pc.c delete mode 100644 src/field/pokeblock.c delete mode 100644 src/field/pokedex_area_screen.c delete mode 100644 src/field/pokenav.c delete mode 100644 src/field/region_map.c delete mode 100644 src/field/roamer.c delete mode 100644 src/field/rotating_gate.c delete mode 100644 src/field/safari_zone.c delete mode 100644 src/field/scrcmd.c delete mode 100644 src/field/script_menu.c delete mode 100644 src/field/script_movement.c delete mode 100644 src/field/secret_base.c delete mode 100644 src/field/shop.c delete mode 100644 src/field/slot_machine.c delete mode 100644 src/field/start_menu.c delete mode 100644 src/field/starter_choose.c delete mode 100644 src/field/trader.c delete mode 100644 src/field/trainer_see.c delete mode 100644 src/field/tv.c delete mode 100644 src/field/use_pokeblock.c delete mode 100644 src/field/wallclock.c delete mode 100644 src/field/wild_encounter.c create mode 100644 src/field_camera.c create mode 100644 src/field_control_avatar.c create mode 100644 src/field_door.c create mode 100644 src/field_effect.c create mode 100644 src/field_effect_helpers.c create mode 100644 src/field_fadetransition.c create mode 100644 src/field_message_box.c create mode 100644 src/field_player_avatar.c create mode 100644 src/field_poison.c create mode 100644 src/field_region_map.c create mode 100644 src/field_screen_effect.c create mode 100644 src/field_special_scene.c create mode 100644 src/field_specials.c create mode 100644 src/field_tasks.c create mode 100644 src/field_weather.c create mode 100644 src/field_weather_effects.c create mode 100644 src/fieldmap.c create mode 100644 src/fldeff_berrytree.c create mode 100644 src/fldeff_cut.c create mode 100644 src/fldeff_decoration.c create mode 100644 src/fldeff_escalator.c create mode 100644 src/fldeff_flash.c create mode 100644 src/fldeff_poison.c create mode 100644 src/fldeff_recordmixing.c create mode 100644 src/fldeff_secret_base_pc.c create mode 100644 src/fldeff_secretpower.c create mode 100644 src/fldeff_softboiled.c create mode 100644 src/fldeff_strength.c create mode 100644 src/fldeff_sweetscent.c create mode 100644 src/fldeff_teleport.c create mode 100644 src/hall_of_fame.c create mode 100644 src/heal_location.c create mode 100644 src/hof_pc.c create mode 100644 src/intro.c create mode 100644 src/intro_credits_graphics.c create mode 100644 src/item.c create mode 100644 src/item_menu.c create mode 100644 src/item_use.c create mode 100644 src/landmark.c create mode 100644 src/learn_move.c create mode 100644 src/link.c create mode 100644 src/load_save.c create mode 100644 src/lottery_corner.c create mode 100644 src/mail.c create mode 100644 src/mail_data.c create mode 100644 src/main.c create mode 100644 src/main_menu.c create mode 100644 src/map_name_popup.c create mode 100644 src/map_obj_lock.c create mode 100644 src/mauville_man.c create mode 100644 src/menu.c create mode 100644 src/menu_cursor.c create mode 100644 src/menu_helpers.c create mode 100644 src/metatile_behavior.c create mode 100644 src/mon_markings.c create mode 100644 src/money.c create mode 100644 src/mystery_event_menu.c create mode 100644 src/mystery_event_msg.c create mode 100644 src/mystery_event_script.c create mode 100644 src/name_string_util.c create mode 100644 src/naming_screen.c create mode 100644 src/new_game.c create mode 100644 src/option_menu.c create mode 100644 src/overworld.c create mode 100644 src/palette.c create mode 100644 src/party_menu.c create mode 100644 src/pc_screen_effect.c create mode 100644 src/play_time.c create mode 100644 src/player_pc.c create mode 100644 src/pokeblock.c create mode 100644 src/pokeblock_feed.c create mode 100644 src/pokedex.c create mode 100644 src/pokedex_area_screen.c create mode 100644 src/pokedex_cry_screen.c delete mode 100644 src/pokemon/learn_move.c delete mode 100644 src/pokemon/mail.c delete mode 100644 src/pokemon/mail_data.c delete mode 100644 src/pokemon/mon_markings.c delete mode 100644 src/pokemon/pokeblock_feed.c delete mode 100644 src/pokemon/pokedex.c delete mode 100644 src/pokemon/pokedex_cry_screen.c delete mode 100644 src/pokemon/pokemon_1.c delete mode 100644 src/pokemon/pokemon_2.c delete mode 100644 src/pokemon/pokemon_3.c delete mode 100644 src/pokemon/pokemon_icon.c delete mode 100644 src/pokemon/pokemon_item_effect.c delete mode 100644 src/pokemon/pokemon_menu.c delete mode 100644 src/pokemon/pokemon_size_record.c delete mode 100644 src/pokemon/pokemon_storage_system.c delete mode 100644 src/pokemon/pokemon_storage_system_2.c delete mode 100644 src/pokemon/pokemon_storage_system_3.c delete mode 100644 src/pokemon/pokemon_storage_system_4.c delete mode 100644 src/pokemon/pokemon_storage_system_5.c delete mode 100644 src/pokemon/pokemon_summary_screen.c create mode 100644 src/pokemon_1.c create mode 100644 src/pokemon_2.c create mode 100644 src/pokemon_3.c create mode 100644 src/pokemon_icon.c create mode 100644 src/pokemon_item_effect.c create mode 100644 src/pokemon_menu.c create mode 100644 src/pokemon_size_record.c create mode 100644 src/pokemon_storage_system.c create mode 100644 src/pokemon_storage_system_2.c create mode 100644 src/pokemon_storage_system_3.c create mode 100644 src/pokemon_storage_system_4.c create mode 100644 src/pokemon_storage_system_5.c create mode 100644 src/pokemon_summary_screen.c create mode 100644 src/pokenav.c create mode 100644 src/random.c create mode 100644 src/record_mixing.c create mode 100644 src/region_map.c create mode 100644 src/reset_rtc_screen.c create mode 100644 src/roamer.c create mode 100644 src/rotating_gate.c create mode 100644 src/rtc.c create mode 100644 src/safari_zone.c create mode 100644 src/save.c create mode 100644 src/save_failed_screen.c create mode 100644 src/save_menu_util.c delete mode 100644 src/scene/berry_blender.c delete mode 100644 src/scene/cable_car.c delete mode 100644 src/scene/contest_painting.c delete mode 100644 src/scene/credits.c delete mode 100644 src/scene/cute_sketch.c delete mode 100644 src/scene/egg_hatch.c delete mode 100644 src/scene/evolution_graphics.c delete mode 100644 src/scene/evolution_scene.c delete mode 100644 src/scene/hall_of_fame.c delete mode 100644 src/scene/intro.c delete mode 100644 src/scene/intro_credits_graphics.c delete mode 100644 src/scene/new_game.c delete mode 100644 src/scene/title_screen.c create mode 100644 src/scrcmd.c create mode 100644 src/script.c create mode 100644 src/script_menu.c create mode 100644 src/script_movement.c create mode 100644 src/secret_base.c create mode 100644 src/shop.c create mode 100644 src/slot_machine.c create mode 100644 src/sound.c create mode 100644 src/sprite.c create mode 100644 src/start_menu.c create mode 100644 src/starter_choose.c create mode 100644 src/string_util.c create mode 100644 src/task.c create mode 100644 src/text.c create mode 100644 src/text_window.c create mode 100644 src/tileset_anim.c create mode 100644 src/time_events.c create mode 100644 src/title_screen.c create mode 100644 src/trade.c create mode 100644 src/trader.c create mode 100644 src/trainer_card.c create mode 100644 src/trainer_see.c create mode 100644 src/trig.c create mode 100644 src/tv.c create mode 100644 src/use_pokeblock.c create mode 100644 src/util.c create mode 100644 src/wallclock.c create mode 100644 src/wild_encounter.c (limited to 'src') diff --git a/src/bard_music.c b/src/bard_music.c new file mode 100644 index 000000000..4518cf09b --- /dev/null +++ b/src/bard_music.c @@ -0,0 +1,225 @@ +#include "global.h" +#include "bard_music.h" +#include "easy_chat.h" + +struct BardSound +{ + /*0x00*/ u8 var00; + /*0x01*/ s8 var01; + /*0x02*/ u16 var02; + /*0x04*/ u16 volume; + /*0x06*/ u16 var06; +}; + +static const s16 Unknown_8416F08[] = {-768, 6144}; +static const s16 Unknown_8416F0C[] = {2304, 6144}; +static const s16 Unknown_8416F10[] = {256, 6144}; +static const s16 Unknown_8416F14[] = {1024, 6144}; +static const s16 Unknown_8416F18[] = {2816, 6144}; +static const s16 Unknown_8416F1C[] = {-768, -256, 6144}; +static const s16 Unknown_8416F22[] = {-768, 512, 6144}; +static const s16 Unknown_8416F28[] = {512, 1024, 6144}; +static const s16 Unknown_8416F2E[] = {1536, 2048, 6144}; +static const s16 Unknown_8416F34[] = {2304, 2048, 6144}; +static const s16 Unknown_8416F3A[] = {-768, -256, -768, 6144}; +static const s16 Unknown_8416F42[] = {1024, -768, 1024, 6144}; +static const s16 Unknown_8416F4A[] = {2304, 2048, 1536, 6144}; +static const s16 Unknown_8416F52[] = {256, 512, 1024, 6144}; +static const s16 Unknown_8416F5A[] = {1536, 4096, 3328, 6144}; +static const s16 Unknown_8416F62[] = {1024, 2304, 1024, 2304, 6144}; +static const s16 Unknown_8416F6C[] = {2304, 1024, 3328, 1024, 6144}; +static const s16 Unknown_8416F76[] = {256, 512, 1024, 1536, 6144}; +static const s16 Unknown_8416F80[] = {2048, 1536, 1024, 512, 6144}; +static const s16 Unknown_8416F8A[] = {3840, 3328, 2816, 2560, 6144}; +static const s16 Unknown_8416F94[] = {-768, -256, 256, 512, 1024, 6144}; +static const s16 Unknown_8416FA0[] = {2304, 2048, 1536, 1024, 512, 6144}; +static const s16 Unknown_8416FAC[] = {256, 1024, 2304, 1024, 256, 6144}; +static const s16 Unknown_8416FB8[] = {2304, 1024, 2304, 1024, -768, 6144}; +static const s16 Unknown_8416FC4[] = {2816, 2048, 1024, 1024, 1536, 6144}; +static const s16 Unknown_8416FD0[] = {-768, -256, 256, 512, 1024, 1536, 6144}; +static const s16 Unknown_8416FDE[] = {2048, 1536, 1024, 512, 256, -256, 6144}; +static const s16 Unknown_8416FEC[] = {256, 512, 1024, 256, 512, 4096, 6144}; +static const s16 Unknown_8416FFA[] = {1024, -768, 2304, 1024, 2304, 1024, 6144}; +static const s16 Unknown_8417008[] = {2048, 2304, 2048, 2304, 2048, 2304, 6144}; +static const s16 Unknown_8417016[] = {512, 256, 512, 256, 512, 1024, 512, 6144}; +static const s16 Unknown_8417026[] = {256, 256, -256, -256, -768, 1024, -768, 6144}; +static const s16 Unknown_8417036[] = {2048, 2304, 2816, 3328, 3584, 3328, 2816, 6144}; +static const s16 Unknown_8417046[] = {2048, 1536, 1024, 512, 3328, 2816, 2304, 6144}; +static const s16 Unknown_8417056[] = {768, 1024, 1536, 2048, 1792, 2048, 1024, 6144}; + +static const s16 *const sWordPitches[] = { + Unknown_8416F08, + Unknown_8416F0C, + Unknown_8416F10, + Unknown_8416F14, + Unknown_8416F18, + Unknown_8416F1C, + Unknown_8416F22, + Unknown_8416F28, + Unknown_8416F2E, + Unknown_8416F34, + Unknown_8416F3A, + Unknown_8416F42, + Unknown_8416F4A, + Unknown_8416F52, + Unknown_8416F5A, + Unknown_8416F62, + Unknown_8416F6C, + Unknown_8416F76, + Unknown_8416F80, + Unknown_8416F8A, + Unknown_8416F94, + Unknown_8416FA0, + Unknown_8416FAC, + Unknown_8416FB8, + Unknown_8416FC4, + Unknown_8416FD0, + Unknown_8416FDE, + Unknown_8416FEC, + Unknown_8416FFA, + Unknown_8417008, + Unknown_8417016, + Unknown_8417026, + Unknown_8417036, + Unknown_8417046, + Unknown_8417056 +}; + +static const u32 sBardSoundLengthDeltas[] = { + 9, + 22, + 15, + 16, + 39, + 21, + 9, + 30, + 24, + 15, + 25, + 12, + 22, + 45, + 24, + 15, + 40, + 9, + 21, + 42, + 18, + 9, + 22, + 15, + 27, + 48, + 18, + 27, + 33, + 24, + 25, + 39, + 19, + 16, + 54, + 18, + 9, + 45, + 15, + 12, + 39, + 23, + 5, + 45, + 12, + 21, + 48, + 12, + 21, + 69, + 18, + 15 +}; + +#if ENGLISH +#include "data/bard_music_en.h" +#elif GERMAN +#include "data/bard_music_de.h" +#endif // ENGLISH/GERMAN + +static const struct BardSound (*const gBardMusicTable[])[6] = { + BardMusic_POKEMON, + BardMusic_TRAINER, + BardMusic_STATUS, + BardMusic_BATTLE, + BardMusic_GREETINGS, + BardMusic_PEOPLE, + BardMusic_VOICES, + BardMusic_SPEECH, + BardMusic_ENDINGS, + BardMusic_FEELINGS, + BardMusic_CONDITIONS, + BardMusic_ACTIONS, + BardMusic_LIFESTYLE, + BardMusic_HOBBIES, + BardMusic_TIME, + BardMusic_MISC, + BardMusic_ADJECTIVES, + BardMusic_EVENTS, + BardMusic_MOVE_1, + BardMusic_MOVE_2, + BardMusic_TRENDY_SAYING, + BardMusic_POKEMON_2 +}; + +static s16 CalcWordPitch(u32 arg0, u32 songPos) +{ + return sWordPitches[arg0][songPos]; +} + +#if ENGLISH +const struct BardSound *GetWordSounds(u16 group, u16 word) +{ + const struct BardSound (*sounds)[6] = gBardMusicTable[group]; + + return sounds[word]; +} +#elif GERMAN +const struct BardSound *GetWordSounds(u16 group, u16 word) +{ + const struct BardSound (*sounds)[6] = gBardMusicTable[group]; + u32 index = de_sub_80EB748(group, word); + + return sounds[index]; +} +#endif + +s32 GetWordPhonemes(struct BardSong *song, const struct BardSound *src, u16 arg2) +{ + s32 i; + s32 j; + s32 thirty; + + for (i = 0; i < 6; i++) + { + song->phonemes[i].sound = src[i].var00; + if (src[i].var00 != 0xFF) + { + s32 length = src[i].var01 + sBardSoundLengthDeltas[src[i].var00]; + + song->phonemes[i].length = length; + song->phonemes[i].volume = src[i].volume; + song->var04 += length; + } + } + + for (j = 0, thirty = 30; j < i; j++) + song->phonemes[j].pitch = CalcWordPitch(thirty + arg2, j); + + song->currWord++; + song->currPhoneme = 0; + song->phonemeTimer = 0; + song->state = 0; + song->voiceInflection = 0; + + //warning: no return statement in function returning non-void +} diff --git a/src/battle_tower.c b/src/battle_tower.c new file mode 100644 index 000000000..8c44b71a3 --- /dev/null +++ b/src/battle_tower.c @@ -0,0 +1,2107 @@ +#include "global.h" +#include "battle.h" +#include "battle_setup.h" +#include "battle_tower.h" +#include "battle_transition.h" +#include "data2.h" +#include "easy_chat.h" +#include "constants/easy_chat.h" +#include "event_data.h" +#include "item.h" +#include "constants/items.h" +#include "main.h" +#include "constants/map_objects.h" +#include "constants/moves.h" +#include "new_game.h" +#include "overworld.h" +#include "pokedex.h" +#include "random.h" +#include "save.h" +#include "script_pokemon_80C4.h" +#include "constants/species.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "trainer.h" +#include "tv.h" +#include "constants/vars.h" +#include "ewram.h" + +#if ENGLISH +#include "data/battle_tower/trainers.h" +#elif GERMAN +#include "data/battle_tower/trainers_de.h" +#endif + +static const u16 sBattleTowerHeldItems[] = +{ + ITEM_NONE, + ITEM_KINGS_ROCK, + ITEM_SITRUS_BERRY, + ITEM_ORAN_BERRY, + ITEM_CHESTO_BERRY, + ITEM_HARD_STONE, + ITEM_FOCUS_BAND, + ITEM_PERSIM_BERRY, + ITEM_MIRACLE_SEED, + ITEM_BERRY_JUICE, + ITEM_MACHO_BRACE, + ITEM_SILVER_POWDER, + ITEM_CHERI_BERRY, + ITEM_BLACK_GLASSES, + ITEM_BLACK_BELT, + ITEM_SOUL_DEW, + ITEM_CHOICE_BAND, + ITEM_MAGNET, + ITEM_SILK_SCARF, + ITEM_WHITE_HERB, + ITEM_DEEP_SEA_SCALE, + ITEM_DEEP_SEA_TOOTH, + ITEM_MYSTIC_WATER, + ITEM_SHARP_BEAK, + ITEM_QUICK_CLAW, + ITEM_LEFTOVERS, + ITEM_RAWST_BERRY, + ITEM_LIGHT_BALL, + ITEM_POISON_BARB, + ITEM_NEVER_MELT_ICE, + ITEM_ASPEAR_BERRY, + ITEM_SPELL_TAG, + ITEM_BRIGHT_POWDER, + ITEM_LEPPA_BERRY, + ITEM_SCOPE_LENS, + ITEM_TWISTED_SPOON, + ITEM_METAL_COAT, + ITEM_MENTAL_HERB, + ITEM_CHARCOAL, + ITEM_PECHA_BERRY, + ITEM_SOFT_SAND, + ITEM_LUM_BERRY, + ITEM_DRAGON_SCALE, + ITEM_DRAGON_FANG, + ITEM_IAPAPA_BERRY, + ITEM_WIKI_BERRY, + ITEM_SEA_INCENSE, + ITEM_SHELL_BELL, + ITEM_SALAC_BERRY, + ITEM_LANSAT_BERRY, + ITEM_APICOT_BERRY, + ITEM_STARF_BERRY, + ITEM_LIECHI_BERRY, + ITEM_STICK, + ITEM_LAX_INCENSE, + ITEM_AGUAV_BERRY, + ITEM_FIGY_BERRY, + ITEM_THICK_CLUB, + ITEM_MAGO_BERRY, + ITEM_METAL_POWDER, + ITEM_PETAYA_BERRY, + ITEM_LUCKY_PUNCH, + ITEM_GANLON_BERRY, +}; + +#include "data/battle_tower/level_50_mons.h" +#include "data/battle_tower/level_100_mons.h" + +static const u8 sMaleTrainerClasses[] = +{ + FACILITY_CLASS_RUIN_MANIAC, + FACILITY_CLASS_TUBER_M, + FACILITY_CLASS_COOL_TRAINER_M, + FACILITY_CLASS_RICH_BOY, + FACILITY_CLASS_POKEMANIAC, + FACILITY_CLASS_SWIMMER_M, + FACILITY_CLASS_BLACK_BELT, + FACILITY_CLASS_GUITARIST, + FACILITY_CLASS_KINDLER, + FACILITY_CLASS_CAMPER, + FACILITY_CLASS_BUG_MANIAC, + FACILITY_CLASS_PSYCHIC_M, + FACILITY_CLASS_GENTLEMAN, + FACILITY_CLASS_SCHOOL_KID_M, + FACILITY_CLASS_POKEFAN_M, + FACILITY_CLASS_EXPERT_M, + FACILITY_CLASS_YOUNGSTER, + FACILITY_CLASS_FISHERMAN, + FACILITY_CLASS_CYCLING_TRIATHLETE_M, + FACILITY_CLASS_RUNNING_TRIATHLETE_M, + FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + FACILITY_CLASS_DRAGON_TAMER, + FACILITY_CLASS_BIRD_KEEPER, + FACILITY_CLASS_NINJA_BOY, + FACILITY_CLASS_SAILOR, + FACILITY_CLASS_COLLECTOR, + FACILITY_CLASS_POKEMON_BREEDER_M, + FACILITY_CLASS_POKEMON_RANGER_M, + FACILITY_CLASS_BUG_CATCHER, + FACILITY_CLASS_HIKER, +}; + +static const u8 sFemaleTrainerClasses[] = +{ + FACILITY_CLASS_AROMA_LADY, + FACILITY_CLASS_TUBER_F, + FACILITY_CLASS_COOL_TRAINER_F, + FACILITY_CLASS_HEX_MANIAC, + FACILITY_CLASS_LADY, + FACILITY_CLASS_BEAUTY, + FACILITY_CLASS_PSYCHIC_F, + FACILITY_CLASS_SCHOOL_KID_F, + FACILITY_CLASS_POKEFAN_F, + FACILITY_CLASS_EXPERT_F, + FACILITY_CLASS_CYCLING_TRIATHLETE_F, + FACILITY_CLASS_RUNNING_TRIATHLETE_F, + FACILITY_CLASS_SWIMMING_TRIATHLETE_F, + FACILITY_CLASS_BATTLE_GIRL, + FACILITY_CLASS_PARASOL_LADY, + FACILITY_CLASS_SWIMMER_F, + FACILITY_CLASS_PICNICKER, + FACILITY_CLASS_POKEMON_BREEDER_F, + FACILITY_CLASS_POKEMON_RANGER_F, + FACILITY_CLASS_LASS, +}; + +static const u8 sMaleTrainerGfxIds[] = +{ + MAP_OBJ_GFX_HIKER, + MAP_OBJ_GFX_TUBER_M, + MAP_OBJ_GFX_MAN_4, + MAP_OBJ_GFX_BOY_4, + MAP_OBJ_GFX_MANIAC, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, + MAP_OBJ_GFX_BLACK_BELT, + MAP_OBJ_GFX_MAN_6, + MAP_OBJ_GFX_MAN_6, + MAP_OBJ_GFX_CAMPER, + MAP_OBJ_GFX_MANIAC, + MAP_OBJ_GFX_PSYCHIC_M, + MAP_OBJ_GFX_GENTLEMAN, + MAP_OBJ_GFX_SCHOOL_KID_M, + MAP_OBJ_GFX_MAN_3, + MAP_OBJ_GFX_OLD_MAN_1, + MAP_OBJ_GFX_YOUNGSTER, + MAP_OBJ_GFX_FISHERMAN, + MAP_OBJ_GFX_CYCLING_TRIATHLETE_M, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, + MAP_OBJ_GFX_MAN_4, + MAP_OBJ_GFX_MAN_6, + MAP_OBJ_GFX_LITTLE_BOY_1, + MAP_OBJ_GFX_SAILOR, + MAP_OBJ_GFX_MANIAC, + MAP_OBJ_GFX_MAN_5, + MAP_OBJ_GFX_CAMPER, + MAP_OBJ_GFX_BUG_CATCHER, + MAP_OBJ_GFX_HIKER, +}; + +static const u8 sFemaleTrainerGfxIds[] = +{ + MAP_OBJ_GFX_WOMAN_3, + MAP_OBJ_GFX_TUBER_F, + MAP_OBJ_GFX_WOMAN_7, + MAP_OBJ_GFX_WOMAN_1, + MAP_OBJ_GFX_WOMAN_3, + MAP_OBJ_GFX_BEAUTY, + MAP_OBJ_GFX_LASS, + MAP_OBJ_GFX_GIRL_3, + MAP_OBJ_GFX_WOMAN_2, + MAP_OBJ_GFX_OLD_WOMAN_1, + MAP_OBJ_GFX_CYCLING_TRIATHLETE_F, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, + MAP_OBJ_GFX_GIRL_3, + MAP_OBJ_GFX_WOMAN_7, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, + MAP_OBJ_GFX_PICNICKER, + MAP_OBJ_GFX_WOMAN_3, + MAP_OBJ_GFX_PICNICKER, + MAP_OBJ_GFX_LASS, +}; + +const u16 gBattleTowerBannedSpecies[] = +{ + SPECIES_MEW, + SPECIES_MEWTWO, + SPECIES_HO_OH, + SPECIES_LUGIA, + SPECIES_CELEBI, + SPECIES_KYOGRE, + SPECIES_GROUDON, + SPECIES_RAYQUAZA, + SPECIES_JIRACHI, + SPECIES_DEOXYS, + 0xFFFF, +}; + +// Item prizes for battle tower streaks of 5 or fewer sets. +static const u16 sShortStreakPrizes[] = +{ + ITEM_HP_UP, + ITEM_PROTEIN, + ITEM_IRON, + ITEM_CALCIUM, + ITEM_CARBOS, + ITEM_ZINC, +}; + +// Item prizes for battle tower streaks of greater than 5 sets. +static const u16 sLongStreakPrizes[] = +{ + ITEM_BRIGHT_POWDER, + ITEM_WHITE_HERB, + ITEM_QUICK_CLAW, + ITEM_LEFTOVERS, + ITEM_MENTAL_HERB, + ITEM_KINGS_ROCK, + ITEM_FOCUS_BAND, + ITEM_SCOPE_LENS, + ITEM_CHOICE_BAND, +}; + +static void ResetBattleTowerStreak(u8 levelType); +static void ValidateBattleTowerRecordChecksums(void); +static void PrintEReaderTrainerFarewellMessage(void); +extern void SetBattleTowerTrainerGfxId(u8); +static void SaveCurrentWinStreak(void); +static void sub_8135CFC(void); +static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *); +static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); +static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *); +static void ClearBattleTowerRecord(struct BattleTowerRecord *); + +extern const u8 BattleText_Format3[]; +extern const u8 BattleText_Format4[]; +extern const u8 BattleText_Format5[]; +extern const u8 BattleText_Format6[]; +extern const u8 BattleText_Format7[]; +extern const u8 BattleText_Format8[]; +extern const u8 BattleText_Format9[]; +extern u16 gSpecialVar_0x8004; +extern u8 gTrainerClassToPicIndex[]; +extern u8 gTrainerClassToNameIndex[]; +extern u16 gTrainerBattleOpponent; +extern u16 gBattleTypeFlags; +extern u8 gSelectedOrderFromParty[]; +extern u8 gBattleOutcome; +extern struct Pokemon gUnknown_030042FC[]; +extern struct BattlePokemon gBattleMons[]; + +void sub_8134548(void) +{ + u8 var1 = 0; + s32 levelType; + + for (levelType = 0; levelType < 2; levelType++) + { + switch (gSaveBlock2.battleTower.var_4AE[levelType]) + { + case 0: + default: + ResetBattleTowerStreak(levelType); + if (!var1) + VarSet(VAR_TEMP_0, 5); + break; + case 1: + ResetBattleTowerStreak(levelType); + VarSet(VAR_TEMP_0, 1); + var1++; + break; + case 4: + VarSet(VAR_TEMP_0, 2); + var1++; + break; + case 5: + VarSet(VAR_TEMP_0, 3); + var1++; + break; + case 2: + VarSet(VAR_TEMP_0, 4); + var1++; + break; + case 3: + case 6: + break; + } + } + + if ((gSaveBlock2.battleTower.var_4AE[0] == 3 || gSaveBlock2.battleTower.var_4AE[0] == 6) + && (gSaveBlock2.battleTower.var_4AE[1] == 3 || gSaveBlock2.battleTower.var_4AE[1] == 6)) + VarSet(VAR_TEMP_0, 5); + + ValidateBattleTowerRecordChecksums(); +} + +void ResetBattleTowerStreak(u8 levelType) +{ + gSaveBlock2.battleTower.var_4AE[levelType] = 0; + gSaveBlock2.battleTower.curChallengeBattleNum[levelType] = 1; + gSaveBlock2.battleTower.curStreakChallengesNum[levelType] = 1; +} + +// Checks if the next trainer in Battle Tower should be the E-Reader trainer. +bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak) +{ + u8 trainerTeamLevel; + u8 monLevel; + s32 i; + u16 validPartySpecies[6]; + u16 validPartyHeldItems[6]; + u8 numValid; + + numValid = 0; + + ValidateEReaderTrainer(); + + if (gSpecialVar_Result != 0 || gSaveBlock2.battleTower.ereaderTrainer.winStreak != winStreak) + return FALSE; + + if (levelType != 0) + trainerTeamLevel = 100; + else + trainerTeamLevel = 50; + + for (i = 0; i < 3; i++) + { + monLevel = gSaveBlock2.battleTower.ereaderTrainer.party[i].level; + if (gSaveBlock2.battleTower.ereaderTrainer.party[i].level != trainerTeamLevel) + return FALSE; + + CheckMonBattleTowerBanlist( + gSaveBlock2.battleTower.ereaderTrainer.party[i].species, + gSaveBlock2.battleTower.ereaderTrainer.party[i].heldItem, + 1, + levelType, + monLevel, + validPartySpecies, + validPartyHeldItems, + &numValid); + } + + return (numValid == 3); +} + +bool8 sub_81346F4(void) +{ + s32 recordIndex, i; + u8 battleTowerLevelType; + u16 winStreak; + bool8 retVal; + s32 numCandidates; + u32 trainerIds[5]; + + numCandidates = 0; + battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak)) + { + gSaveBlock2.battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID; + retVal = TRUE; + } + else + { + // Check if one of the battle tower trainers from record mixing should be the next trainer. + for (recordIndex = 0; recordIndex < 5; recordIndex++) + { + struct BattleTowerRecord *record = &gSaveBlock2.battleTower.records[recordIndex]; + u32 recordHasData = 0; + u32 checksum = 0; + + for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32) - 1; i++) + { + recordHasData |= ((u32 *)record)[i]; + checksum += ((u32 *)record)[i]; + } + + if (gSaveBlock2.battleTower.records[recordIndex].winStreak == winStreak + && gSaveBlock2.battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType + && recordHasData + && gSaveBlock2.battleTower.records[recordIndex].checksum == checksum) + { + trainerIds[numCandidates] = recordIndex; + numCandidates++; + } + } + + if (numCandidates == 0) + { + retVal = FALSE; + } + else + { + gSaveBlock2.battleTower.battleTowerTrainerId = trainerIds[Random() % numCandidates] + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID; + retVal = TRUE; + } + } + + return retVal; +} + +// void sub_81347F8(void) +// { +// bool8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; +// if (sub_81346F4()) +// { +// SetBattleTowerTrainerGfxId(gSaveBlock2.battleTower.battleTowerTrainerId); +// gSaveBlock2.battleTower.var_4C1[gSaveBlock2.battleTower.curChallengeBattleNum[levelType]] = gSaveBlock2.battleTower.battleTowerTrainerId; +// } +// else +// { +// u16 var1; + +// if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] > 7) +// { +// while (1) +// { +// s32 i; +// u32 temp = ((Random() & 0xFF) * 30) >> 8; +// var1 = temp + 70; +// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && var1 != gSaveBlock2.battleTower.var_4C1[i]; i++) // TODO: [i + 1]??? +// { } + +// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) +// { +// break; +// } +// } +// } +// else +// { +// if (gSaveBlock2.battleTower.curChallengeBattleNum[levelType] == 7) +// { +// while (1) +// { +// s32 i; +// u32 temp = ((Random() & 0xFF) * 5); +// u32 temp2 = (((gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1) * 10) + 20); +// var1 = temp / 128 + temp2; +// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2.battleTower.var_4C1[i] != var1; i++) // TODO: [i + 1]???? +// { } + +// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) +// { +// break; +// } +// } +// } +// else +// { +// while (1) +// { +// s32 i; +// u32 temp = ((Random() & 0xFF) * 320); +// u32 temp2 = ((gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1) * 10); +// var1 = temp + temp2; +// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2.battleTower.var_4C1[i] != var1; i++) +// { } + +// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) +// { +// break; +// } +// } +// } +// } + +// gSaveBlock2.battleTower.battleTowerTrainerId = var1; +// SetBattleTowerTrainerGfxId(gSaveBlock2.battleTower.battleTowerTrainerId); + +// if (gSaveBlock2.battleTower.curChallengeBattleNum[levelType] < 7) +// { +// gSaveBlock2.battleTower.var_4C1[gSaveBlock2.battleTower.curChallengeBattleNum[levelType]] = gSaveBlock2.battleTower.battleTowerTrainerId; +// } +// } +// } + +__attribute__((naked)) +void sub_81347F8(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r5, _08134838 @ =gSaveBlock2\n\ + ldr r1, _0813483C @ =0x00000554\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + lsls r0, 31\n\ + lsrs r6, r0, 31\n\ + bl sub_81346F4\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08134848\n\ + ldr r2, _08134840 @ =0x00000564\n\ + adds r4, r5, r2\n\ + ldrb r0, [r4]\n\ + bl SetBattleTowerTrainerGfxId\n\ + lsls r0, r6, 1\n\ + movs r3, 0xAB\n\ + lsls r3, 3\n\ + adds r1, r5, r3\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + adds r0, r5, r0\n\ + ldr r1, _08134844 @ =0x00000569\n\ + adds r0, r1\n\ + ldrb r1, [r4]\n\ + b _081349DC\n\ + .align 2, 0\n\ +_08134838: .4byte gSaveBlock2\n\ +_0813483C: .4byte 0x00000554\n\ +_08134840: .4byte 0x00000564\n\ +_08134844: .4byte 0x00000569\n\ +_08134848:\n\ + lsls r0, r6, 1\n\ + ldr r2, _081348D8 @ =0x0000055c\n\ + adds r1, r5, r2\n\ + adds r1, r0, r1\n\ + ldrh r1, [r1]\n\ + adds r7, r0, 0\n\ + cmp r1, 0x7\n\ + bls _0813485A\n\ + b _0813495C\n\ +_0813485A:\n\ + movs r3, 0xAB\n\ + lsls r3, 3\n\ + adds r0, r5, r3\n\ + adds r1, r7, r0\n\ + ldrh r0, [r1]\n\ + cmp r0, 0x7\n\ + bne _081348E4\n\ + adds r6, r5, 0\n\ + mov r9, r7\n\ + adds r5, r1, 0\n\ + ldr r0, _081348DC @ =0x0000056a\n\ + adds r0, r6\n\ + mov r10, r0\n\ + mov r8, r5\n\ +_08134876:\n\ + bl Random\n\ + movs r1, 0xFF\n\ + ands r1, r0\n\ + lsls r2, r1, 2\n\ + adds r2, r1\n\ + ldr r1, _081348D8 @ =0x0000055c\n\ + adds r4, r6, r1\n\ + mov r3, r9\n\ + adds r0, r3, r4\n\ + ldrh r1, [r0]\n\ + subs r1, 0x1\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 1\n\ + adds r0, 0x14\n\ + lsrs r2, 7\n\ + adds r2, r0\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + movs r1, 0\n\ + ldrh r0, [r5]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + bge _081348C8\n\ + mov r3, r10\n\ + ldrb r0, [r3]\n\ + cmp r0, r2\n\ + beq _081348C8\n\ + subs r0, r4, 0x4\n\ + adds r0, r7, r0\n\ + ldrh r0, [r0]\n\ + subs r3, r0, 0x1\n\ + adds r4, 0xE\n\ +_081348BA:\n\ + adds r1, 0x1\n\ + cmp r1, r3\n\ + bge _081348C8\n\ + adds r0, r1, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, r2\n\ + bne _081348BA\n\ +_081348C8:\n\ + mov r3, r8\n\ + ldrh r0, [r3]\n\ + subs r0, 0x1\n\ + ldr r4, _081348E0 @ =gSaveBlock2\n\ + cmp r1, r0\n\ + bne _08134876\n\ + b _081349B6\n\ + .align 2, 0\n\ +_081348D8: .4byte 0x0000055c\n\ +_081348DC: .4byte 0x0000056a\n\ +_081348E0: .4byte gSaveBlock2\n\ +_081348E4:\n\ + adds r6, r5, 0\n\ + mov r9, r7\n\ + adds r5, r1, 0\n\ + ldr r2, _08134950 @ =0x0000056a\n\ + adds r2, r6\n\ + mov r10, r2\n\ + mov r8, r5\n\ +_081348F2:\n\ + bl Random\n\ + movs r1, 0xFF\n\ + ands r1, r0\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsrs r2, r0, 6\n\ + ldr r3, _08134954 @ =0x0000055c\n\ + adds r4, r6, r3\n\ + mov r1, r9\n\ + adds r0, r1, r4\n\ + ldrh r1, [r0]\n\ + subs r1, 0x1\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 1\n\ + adds r0, r2, r0\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + movs r1, 0\n\ + ldrh r0, [r5]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + bge _08134942\n\ + mov r3, r10\n\ + ldrb r0, [r3]\n\ + cmp r0, r2\n\ + beq _08134942\n\ + subs r0, r4, 0x4\n\ + adds r0, r7, r0\n\ + ldrh r0, [r0]\n\ + subs r3, r0, 0x1\n\ + adds r4, 0xE\n\ +_08134934:\n\ + adds r1, 0x1\n\ + cmp r1, r3\n\ + bge _08134942\n\ + adds r0, r1, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, r2\n\ + bne _08134934\n\ +_08134942:\n\ + mov r3, r8\n\ + ldrh r0, [r3]\n\ + subs r0, 0x1\n\ + ldr r4, _08134958 @ =gSaveBlock2\n\ + cmp r1, r0\n\ + bne _081348F2\n\ + b _081349B6\n\ + .align 2, 0\n\ +_08134950: .4byte 0x0000056a\n\ +_08134954: .4byte 0x0000055c\n\ +_08134958: .4byte gSaveBlock2\n\ +_0813495C:\n\ + movs r2, 0xAB\n\ + lsls r2, 3\n\ + adds r0, r5, r2\n\ + adds r6, r7, r0\n\ + ldr r3, _081349EC @ =0x0000056a\n\ + adds r3, r5\n\ + mov r8, r3\n\ + adds r5, r6, 0\n\ +_0813496C:\n\ + bl Random\n\ + movs r1, 0xFF\n\ + ands r1, r0\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r0, 1\n\ + asrs r0, 8\n\ + adds r0, 0x46\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + movs r1, 0\n\ + ldrh r0, [r6]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + bge _081349AC\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + ldr r4, _081349F0 @ =gSaveBlock2\n\ + cmp r0, r2\n\ + beq _081349AC\n\ + ldrh r0, [r5]\n\ + subs r3, r0, 0x1\n\ + ldr r0, _081349EC @ =0x0000056a\n\ + adds r4, r0\n\ +_0813499E:\n\ + adds r1, 0x1\n\ + cmp r1, r3\n\ + bge _081349AC\n\ + adds r0, r1, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, r2\n\ + bne _0813499E\n\ +_081349AC:\n\ + ldrh r0, [r6]\n\ + subs r0, 0x1\n\ + ldr r4, _081349F0 @ =gSaveBlock2\n\ + cmp r1, r0\n\ + bne _0813496C\n\ +_081349B6:\n\ + ldr r1, _081349F4 @ =0x00000564\n\ + adds r0, r4, r1\n\ + strb r2, [r0]\n\ + ldr r2, _081349F4 @ =0x00000564\n\ + adds r5, r4, r2\n\ + ldrb r0, [r5]\n\ + bl SetBattleTowerTrainerGfxId\n\ + movs r3, 0xAB\n\ + lsls r3, 3\n\ + adds r0, r4, r3\n\ + adds r1, r7, r0\n\ + ldrh r0, [r1]\n\ + cmp r0, 0x6\n\ + bhi _081349DE\n\ + adds r0, r4, r0\n\ + ldr r1, _081349F8 @ =0x00000569\n\ + adds r0, r1\n\ + ldrb r1, [r5]\n\ +_081349DC:\n\ + strb r1, [r0]\n\ +_081349DE:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_081349EC: .4byte 0x0000056a\n\ +_081349F0: .4byte gSaveBlock2\n\ +_081349F4: .4byte 0x00000564\n\ +_081349F8: .4byte 0x00000569\n\ +.syntax divided\n"); +} + +void SetBattleTowerTrainerGfxId(u8 trainerIndex) +{ + u32 i; + u8 trainerClass; + + if (trainerIndex < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + trainerClass = gBattleTowerTrainers[trainerIndex].trainerClass; + else if (trainerIndex < BATTLE_TOWER_EREADER_TRAINER_ID) + trainerClass = gSaveBlock2.battleTower.records[trainerIndex - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; + else + trainerClass = gSaveBlock2.battleTower.ereaderTrainer.trainerClass; + + for (i = 0; i < 30; i++) + { + if (sMaleTrainerClasses[i] == trainerClass) + break; + } + if (i != 30) + { + u8 trainerObjectGfxId = sMaleTrainerGfxIds[i]; + VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId); + return; + } + + for (i = 0; i < 20; i++) + { + if (sFemaleTrainerClasses[i] == trainerClass) + break; + } + if (i != 20) + { + u8 trainerObjectGfxId = sFemaleTrainerGfxIds[i]; + VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId); + return; + } + + VarSet(VAR_OBJ_GFX_ID_0, MAP_OBJ_GFX_BOY_1); +} + +void SetEReaderTrainerGfxId(void) +{ + SetBattleTowerTrainerGfxId(BATTLE_TOWER_EREADER_TRAINER_ID); +} + +// void sub_8134AC0(struct BattleTowerRecord *record) +// { +// u16 var1[6]; +// u16 var2[6]; +// s32 i, j, k; +// s16 l = 0; + +// for (i = 0; i < 5; i++) +// { +// k = 0; +// for (j = 0; j < 4 && gSaveBlock2.battleTower.records[i].trainerId[j] == record->trainerId[j]; j++); +// if (j == 4) +// { +// for (; k < 7 && gSaveBlock2.battleTower.records[i].name[4] == record->name[4]; k++) +// { +// if (record->name[4] == 0xFF) +// { +// k = 7; +// break; +// } +// } +// } + +// if (k == 7) +// { +// break; +// } +// } + +// if (i < 5) +// { +// gSaveBlock2.battleTower.records[i] = *record; +// return; +// } + +// i = 0; +// while (i < 5) +// { +// if (gSaveBlock2.battleTower.records[i].winStreak == 0) +// { +// if (i > 4) +// { +// break; +// } + +// gSaveBlock2.battleTower.records[i] = *record; +// return; +// } + +// i++; +// } + +// var1[0] = gSaveBlock2.battleTower.records[0].winStreak; +// var2[0] = 0; +// l++; + +// for (i = 1; i < 5; i++) +// { +// j = 0; +// if (j < l) +// { +// for (; gSaveBlock2.battleTower.records[i].winStreak <= var1[j]; j++) +// { +// if (gSaveBlock2.battleTower.records[i].winStreak < var1[j]) +// { +// j = 0; +// l = 1; +// var1[0] = gSaveBlock2.battleTower.records[i].winStreak; +// var2[0] = i; +// break; +// } +// } +// } + +// if (j == l) +// { +// var1[l] = gSaveBlock2.battleTower.records[i].winStreak; +// var2[l] = i; +// l++; +// } +// } + +// gSaveBlock2.battleTower.records[var2[(Random() % l)]] = *record; +// } +__attribute__((naked)) +void sub_8134AC0(struct BattleTowerRecord *record) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x1C\n\ + movs r7, 0\n\ + mov r8, r0\n\ + movs r5, 0\n\ + ldr r0, _08134B3C @ =gSaveBlock2\n\ + mov r12, r0\n\ + mov r1, r8\n\ + ldrb r1, [r1, 0xC]\n\ + str r1, [sp, 0x18]\n\ + movs r2, 0xAA\n\ + lsls r2, 1\n\ + add r2, r12\n\ + mov r10, r2\n\ + mov r9, r5\n\ +_08134AE6:\n\ + movs r6, 0\n\ + movs r3, 0\n\ + ldr r0, _08134B40 @ =gSaveBlock2 + 0x158\n\ + add r0, r9\n\ + ldrb r0, [r0]\n\ + ldr r1, [sp, 0x18]\n\ + cmp r0, r1\n\ + bne _08134B14\n\ + movs r0, 0xA4\n\ + muls r0, r5\n\ + ldr r1, _08134B40 @ =gSaveBlock2 + 0x158\n\ + adds r2, r0, r1\n\ + mov r4, r8\n\ + adds r4, 0xC\n\ +_08134B02:\n\ + adds r2, 0x1\n\ + adds r3, 0x1\n\ + cmp r3, 0x3\n\ + bgt _08134B14\n\ + adds r1, r4, r3\n\ + ldrb r0, [r2]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + beq _08134B02\n\ +_08134B14:\n\ + cmp r3, 0x4\n\ + bne _08134B54\n\ + movs r6, 0\n\ + mov r2, r10\n\ + ldrb r0, [r2]\n\ + mov r3, r8\n\ + ldrb r3, [r3, 0x8]\n\ + cmp r0, r3\n\ + bne _08134B54\n\ + adds r1, r0, 0\n\ + movs r0, 0xA4\n\ + muls r0, r5\n\ + adds r0, 0x4\n\ + ldr r3, _08134B44 @ =gSaveBlock2 + 0x150\n\ + adds r2, r0, r3\n\ +_08134B32:\n\ + cmp r1, 0xFF\n\ + bne _08134B48\n\ + movs r6, 0x7\n\ + b _08134B54\n\ + .align 2, 0\n\ +_08134B3C: .4byte gSaveBlock2\n\ +_08134B40: .4byte gSaveBlock2 + 0x158\n\ +_08134B44: .4byte gSaveBlock2 + 0x150\n\ +_08134B48:\n\ + adds r6, 0x1\n\ + cmp r6, 0x6\n\ + bgt _08134B54\n\ + ldrb r0, [r2]\n\ + cmp r0, r1\n\ + beq _08134B32\n\ +_08134B54:\n\ + cmp r6, 0x7\n\ + beq _08134B64\n\ + movs r0, 0xA4\n\ + add r10, r0\n\ + add r9, r0\n\ + adds r5, 0x1\n\ + cmp r5, 0x4\n\ + ble _08134AE6\n\ +\n\ +_08134B64:\n\ + cmp r5, 0x4\n\ + bgt _08134B76\n\ + movs r0, 0xA4\n\ + muls r0, r5\n\ + add r0, r12\n\ + movs r1, 0xA6\n\ + lsls r1, 1\n\ + adds r0, r1\n\ + b _08134B9E\n\ +_08134B76:\n\ + movs r5, 0\n\ + movs r1, 0xA7\n\ + lsls r1, 1\n\ + add r1, r12\n\ + b _08134B88\n\ +_08134B80:\n\ + adds r1, 0xA4\n\ + adds r5, 0x1\n\ + cmp r5, 0x4\n\ + bgt _08134BA8\n\ +_08134B88:\n\ + ldrh r0, [r1]\n\ + cmp r0, 0\n\ + bne _08134B80\n\ + cmp r5, 0x4\n\ + bgt _08134BA8\n\ + movs r0, 0xA4\n\ + muls r0, r5\n\ + add r0, r12\n\ + movs r2, 0xA6\n\ + lsls r2, 1\n\ + adds r0, r2\n\ +_08134B9E:\n\ + mov r1, r8\n\ + movs r2, 0xA4\n\ + bl memcpy\n\ + b _08134C5E\n\ +\n\ +_08134BA8:\n\ + mov r2, sp\n\ + movs r3, 0xA7\n\ + lsls r3, 1\n\ + mov r1, r12\n\ + adds r0, r1, r3\n\ + ldrh r0, [r0]\n\ + movs r1, 0\n\ + strh r0, [r2]\n\ + add r0, sp, 0xC\n\ + strh r1, [r0]\n\ + adds r7, 0x1\n\ + movs r5, 0x1\n\ + add r2, sp, 0xC @var2 = r2\n\ + mov r9, r2\n\ + mov r10, r3\n\ +_08134BC6:\n\ + movs r3, 0\n\ + adds r0, r5, 0x1\n\ + mov r12, r0\n\ + cmp r3, r7\n\ + bge _08134C0A @ j < l\n\ + movs r1, 0xA4\n\ + adds r0, r5, 0\n\ + muls r0, r1\n\ + ldr r2, _08134BFC @ =gSaveBlock2\n\ + adds r0, r2\n\ + mov r1, r10\n\ + adds r4, r0, r1\n\ + mov r6, sp\n\ +_08134BE0:\n\ + lsls r0, r3, 1\n\ + add r0, sp\n\ + ldrh r2, [r4]\n\ + adds r1, r2, 0\n\ + ldrh r0, [r0]\n\ + cmp r1, r0\n\ + bcs _08134C00\n\ + movs r3, 0\n\ + movs r7, 0x1\n\ + strh r2, [r6]\n\ + mov r2, r9\n\ + strh r5, [r2]\n\ + b _08134C0A\n\ + .align 2, 0\n\ +_08134BFC: .4byte gSaveBlock2\n\ +_08134C00:\n\ + cmp r1, r0\n\ + bhi _08134C0A\n\ + adds r3, 0x1\n\ + cmp r3, r7\n\ + blt _08134BE0\n\ +_08134C0A:\n\ + cmp r3, r7\n\ + bne _08134C2A\n\ + lsls r1, r7, 1\n\ + mov r3, sp\n\ + adds r2, r3, r1\n\ + movs r3, 0xA4\n\ + adds r0, r5, 0\n\ + muls r0, r3\n\ + ldr r3, _08134C70 @ =gSaveBlock2\n\ + adds r0, r3\n\ + add r0, r10\n\ + ldrh r0, [r0]\n\ + strh r0, [r2]\n\ + add r1, r9\n\ + strh r5, [r1]\n\ + adds r7, 0x1\n\ +_08134C2A:\n\ + mov r5, r12\n\ + cmp r5, 0x4\n\ + ble _08134BC6\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + adds r1, r7, 0\n\ + bl __modsi3\n\ + adds r5, r0, 0\n\ + ldr r2, _08134C70 @ =gSaveBlock2\n\ + lsls r0, r5, 1\n\ + add r0, sp\n\ + adds r0, 0xC\n\ + ldrh r1, [r0]\n\ + movs r0, 0xA4\n\ + muls r0, r1\n\ + adds r0, r2\n\ + movs r1, 0xA6\n\ + lsls r1, 1\n\ + adds r0, r1\n\ + mov r1, r8\n\ + movs r2, 0xA4\n\ + bl memcpy\n\ +_08134C5E:\n\ + add sp, 0x1C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08134C70: .4byte gSaveBlock2\n\ + .syntax divided\n"); +} + +u8 get_trainer_class_pic_index(void) +{ + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; + else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + return gTrainerClassToPicIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; + else + return gTrainerClassToPicIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; +} + +u8 get_trainer_class_name_index(void) +{ + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; + else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + return gTrainerClassToNameIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; + else + return gTrainerClassToNameIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; +} + +void get_trainer_name(u8* dest) +{ + s32 i; + + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + for (i = 0; i < 7; i++) + dest[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + for (i = 0; i < 7; i++) + dest[i] = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].name[i]; + } + else + { + for (i = 0; i < 7; i++) + dest[i] = gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].name[i]; + } + + dest[i] = EOS; +} + +void FillBattleTowerTrainerParty(void) +{ + s32 partyIndex, i; + u16 chosenMonIndices[3]; + u8 friendship; + u8 level; + u8 fixedIV; + u8 battleMonsOffset; + u8 monPoolSize; + u8 teamFlags; + const struct BattleTowerPokemon *battleTowerMons; + + battleMonsOffset = 0; + monPoolSize = 60; + friendship = 255; + + ZeroEnemyPartyMons(); + + // Different trainers have access to different sets of pokemon to use in battle. + // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are + // stronger. Additionally, the later trainers' pokemon are granted higher IVs. + if (gSaveBlock2.battleTower.battleTowerTrainerId < 20) + { + fixedIV = 6; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 30) + { + fixedIV = 9; + battleMonsOffset = 30; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 40) + { + fixedIV = 12; + battleMonsOffset = 60; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 50) + { + fixedIV = 15; + battleMonsOffset = 90; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 60) + { + fixedIV = 18; + battleMonsOffset = 120; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 70) + { + fixedIV = 21; + battleMonsOffset = 150; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 80) + { + fixedIV = 31; + battleMonsOffset = 180; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + fixedIV = 31; + battleMonsOffset = 200; + monPoolSize = 100; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + // Load E-Reader trainer's party. + for (partyIndex = 0; partyIndex < 3; partyIndex++) + sub_803ADE8(&gEnemyParty[partyIndex], &gSaveBlock2.battleTower.ereaderTrainer.party[partyIndex]); + return; + } + else + { + // Load a battle tower record's party. (From record mixing) + for (partyIndex = 0; partyIndex < 3; partyIndex++) + { + sub_803ADE8( + &gEnemyParty[partyIndex], + &gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); + } + return; + } + + // Use the appropriate list of pokemon and level depending on the + // current challenge type. (level 50 or level 100 challenge) + if (gSaveBlock2.battleTower.battleTowerLevelType != 0) + { + battleTowerMons = gBattleTowerLevel100Mons; + level = 100; + } + else + { + battleTowerMons = gBattleTowerLevel50Mons; + level = 50; + } + + teamFlags = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].teamFlags; + + // Attempt to fill the trainer's party with random Pokemon until 3 have been + // successfully chosen. The trainer's party may not have duplicate pokemon species + // or duplicate held items. Each pokemon must have all of the trainer's team flags + // set, as well. If any of those conditions are not met, then the loop starts over + // and another pokemon is chosen at random. + partyIndex = 0; + while (partyIndex != 3) + { + // Pick a random pokemon index based on the number of pokemon available to choose from + // and the starting offset in the battle tower pokemon array. + s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset; + + // Ensure the chosen pokemon has compatible team flags with the trainer. + if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags) + { + // Ensure this pokemon species isn't a duplicate. + for (i = 0; i < partyIndex; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species) + break; + } + + if (i != partyIndex) + continue; + + // Ensure this pokemon's held item isn't a duplicate. + for (i = 0; i < partyIndex; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != 0 + && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) + break; + } + + if (i != partyIndex) + continue; + + // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary + // because the species and held items were already checked directly above. Perhaps this + // is leftover code before the logic for duplicate species and held items was added. + //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); + for (i = 0; i < partyIndex; i++) + { + if (chosenMonIndices[i] == battleMonIndex) + break; + } + + if (i != partyIndex) + continue; + + chosenMonIndices[partyIndex] = battleMonIndex; + + // Place the chosen pokemon into the trainer's party. + CreateMonWithEVSpread( + &gEnemyParty[partyIndex], + battleTowerMons[battleMonIndex].species, + level, + fixedIV, + battleTowerMons[battleMonIndex].evSpread); + + // Give the chosen pokemon its specified moves. + for (i = 0; i < 4; i++) + { + SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); + if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) + friendship = 0; // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. + } + + SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); + SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]); + + // The pokemon was successfully added to the trainer's party, so it's safe to move on to + // the next party slot. + partyIndex++; + } + } +} + +u32 CountBattleTowerBanlistCaught(void) +{ + s32 i; + u32 numCaught = 0; + + for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleTowerBannedSpecies[i]), FLAG_GET_CAUGHT)) + numCaught++; + } + + return numCaught; +} + +u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numToAppend) +{ + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + { + curIndexToAppend++; + switch (curIndexToAppend - 1) + { + case 0: + case 2: + case 4: + case 6: + case 8: + case 10: + if (numToAppend == curIndexToAppend) + StringAppend(gStringVar1, BattleText_Format3); + else if (numToAppend > curIndexToAppend) + StringAppend(gStringVar1, BattleText_Format4); + break; + case 1: + if (curIndexToAppend == numToAppend) + StringAppend(gStringVar1, BattleText_Format3); + else + StringAppend(gStringVar1, BattleText_Format4); + StringAppend(gStringVar1, BattleText_Format7); + break; + case 3: + case 5: + case 7: + case 9: + default: + if (curIndexToAppend == numToAppend) + StringAppend(gStringVar1, BattleText_Format3); + else + StringAppend(gStringVar1, BattleText_Format4); + StringAppend(gStringVar1, BattleText_Format6); + break; + } + StringAppend(gStringVar1, gSpeciesNames[species]); + } + + return curIndexToAppend; +} + +void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid) +{ + s32 i; + u32 counter = 0; + + if (species == SPECIES_EGG || species == SPECIES_NONE) + return; + + while (1) + { + if (gBattleTowerBannedSpecies[counter] == 0xFFFF) + break; + + if (gBattleTowerBannedSpecies[counter] == species) + break; + + counter++; + } + + if (gBattleTowerBannedSpecies[counter] != 0xFFFF) + return; + + if (battleTowerLevelType == 0 && monLevel > 50) + return; + + for (i = 0; i < *numValid && validPartySpecies[i] != species ; i++); + if (i != *numValid) + return; + + if (heldItem != 0) + { + for (i = 0; i < *numValid && validPartyHeldItems[i] != heldItem ; i++); + if (i != *numValid) + return; + } + + validPartySpecies[*numValid] = species; + validPartyHeldItems[*numValid] = heldItem; + *numValid = *numValid + 1; +} + +void CheckPartyBattleTowerBanlist(void) +{ + s32 i; + u16 species2; + u16 heldItem; + u8 level; + u16 hp; + u32 numBanlistCaught; + u16 validPartySpecies[6]; + u16 validPartyHeldItems[6]; + u8 counter; + + counter = 0; + + for (i = 0; i < PARTY_SIZE; i++) + { + species2 = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); + hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + + CheckMonBattleTowerBanlist(species2, heldItem, hp, gSpecialVar_Result, level, validPartySpecies, validPartyHeldItems, &counter); + } + + if (counter < 3) + { + gStringVar1[0] = 0xFF; + gSpecialVar_0x8004 = 1; + counter = 0; + + numBanlistCaught = CountBattleTowerBanlistCaught(); + + for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) + counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter, numBanlistCaught); + + if (counter == 0) + { + StringAppend(gStringVar1, BattleText_Format5); + StringAppend(gStringVar1, BattleText_Format8); + return; + } + + if (1 & counter) + StringAppend(gStringVar1, BattleText_Format6); + else + StringAppend(gStringVar1, BattleText_Format5); + + StringAppend(gStringVar1, BattleText_Format9); + } + else + { + gSpecialVar_0x8004 = 0; + gSaveBlock2.battleTower.battleTowerLevelType = gSpecialVar_Result; + } +} + +void PrintBattleTowerTrainerMessage(u16 *easyChat) +{ + sub_80EB544(gStringVar4, easyChat, 2, 3); +} + +void PrintBattleTowerTrainerGreeting(void) +{ + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting); + else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting); + else + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting); +} + +void sub_81354CC(void) +{ + s32 i; + u16 heldItem; + + switch (gSpecialVar_0x8004) + { + case 0: + break; + case 1: + for (i = 0; i < PARTY_SIZE; i++) + { + heldItem = GetMonData(&gSaveBlock1.playerParty[i], MON_DATA_HELD_ITEM); + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); + } + break; + case 2: + PrintEReaderTrainerFarewellMessage(); + break; + } + + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void sub_8135534(u8 taskId) +{ + if (IsBattleTransitionDone() == TRUE) + { + gMain.savedCallback = sub_81354CC; + SetMainCallback2(sub_800E7C4); + DestroyTask(taskId); + } +} + +void StartSpecialBattle(void) +{ + s32 i; + u16 heldItem; + u8 transition; + + switch (gSpecialVar_0x8004) + { + case 0: // battle tower battle + gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER); + gTrainerBattleOpponent = 0; + + FillBattleTowerTrainerParty(); + + CreateTask(sub_8135534, 1); + current_map_music_set__default_for_battle(0); + transition = BattleSetup_GetBattleTowerBattleTransition(); + BattleTransition_StartOnField(transition); + break; + case 1: // secret base battle + for (i = 0; i < PARTY_SIZE; i++) + { + heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + SetMonData(&gSaveBlock1.playerParty[i], MON_DATA_HELD_ITEM, &heldItem); + } + + CreateTask(sub_8135534, 1); + current_map_music_set__default_for_battle(0); + transition = BattleSetup_GetBattleTowerBattleTransition(); + BattleTransition_StartOnField(transition); + break; + case 2: // e-reader trainer battle + ZeroEnemyPartyMons(); + + for (i = 0; i < 3; i++) + sub_803ADE8(&gEnemyParty[i], &gSaveBlock2.battleTower.ereaderTrainer.party[i]); + + gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER); + gTrainerBattleOpponent = 0; + + CreateTask(sub_8135534, 1); + current_map_music_set__default_for_battle(0); + transition = BattleSetup_GetBattleTowerBattleTransition(); + BattleTransition_StartOnField(transition); + break; + } +} + +void SetBattleTowerProperty(void) +{ + s32 i; + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + switch (gSpecialVar_0x8004) + { + case 0: + ewram160FB = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType]; + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8005; + break; + case 1: + gSaveBlock2.battleTower.battleTowerLevelType = gSpecialVar_0x8005; + break; + case 2: + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] = gSpecialVar_0x8005; + break; + case 3: + gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] = gSpecialVar_0x8005; + break; + case 4: + gSaveBlock2.battleTower.battleTowerTrainerId = gSpecialVar_0x8005; + break; + case 5: + for (i = 0; i < 3; i++) + gSaveBlock2.battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i]; + break; + case 6: + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + ClearEReaderTrainer(&gSaveBlock2.battleTower.ereaderTrainer); + if (gSaveBlock2.battleTower.totalBattleTowerWins < 9999) + gSaveBlock2.battleTower.totalBattleTowerWins++; + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]++; + SaveCurrentWinStreak(); + gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; + gStringVar1[0] = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1; + gStringVar1[1] = 0xFF; + break; + case 7: + if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] < 1430) + gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]++; + SaveCurrentWinStreak(); + gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; + break; + case 8: + gSaveBlock2.battleTower.unk_554 = gSpecialVar_0x8005; + break; + case 9: + break; + case 10: + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2.battleTower.bestBattleTowerWinStreak); + break; + case 11: + if (gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] != 3) + ResetBattleTowerStreak(battleTowerLevelType); + break; + case 12: + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; + break; + case 13: + gSaveBlock2.battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + break; + case 14: + gSaveBlock2.battleTower.lastStreakLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + break; + } +} + +void BattleTowerUtil(void) +{ + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + switch (gSpecialVar_0x8004) + { + case 0: + gSpecialVar_Result = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType]; + break; + case 1: + gSpecialVar_Result = gSaveBlock2.battleTower.battleTowerLevelType; + break; + case 2: + gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; + break; + case 3: + gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; + break; + case 4: + gSpecialVar_Result = gSaveBlock2.battleTower.battleTowerTrainerId; + break; + case 5: + case 6: + case 7: + break; + case 8: + gSpecialVar_Result = gSaveBlock2.battleTower.unk_554; + break; + case 9: + gSpecialVar_Result = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + break; + case 10: + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2.battleTower.bestBattleTowerWinStreak); + break; + case 11: + ResetBattleTowerStreak(battleTowerLevelType); + break; + case 12: + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; + break; + case 13: + gSaveBlock2.battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + break; + case 14: + gSaveBlock2.battleTower.lastStreakLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + break; + } +} + +void SetBattleTowerParty(void) +{ + s32 i; + + for (i = 0; i < 3; i++) + gSelectedOrderFromParty[i] = gSaveBlock2.battleTower.selectedPartyMons[i]; + + ReducePlayerPartyToThree(); +} + +static void SaveCurrentWinStreak(void) +{ + u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; + u16 streak = GetCurrentBattleTowerWinStreak(levelType); + + if (gSaveBlock2.battleTower.recordWinStreaks[levelType] < streak) + gSaveBlock2.battleTower.recordWinStreaks[levelType] = streak; + + if (gSaveBlock2.battleTower.recordWinStreaks[0] > gSaveBlock2.battleTower.recordWinStreaks[1]) + { + streak = gSaveBlock2.battleTower.recordWinStreaks[0]; + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); + + if (streak > 9999) + gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; + else + gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; + } + else + { + streak = gSaveBlock2.battleTower.recordWinStreaks[1]; + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); + + if (streak > 9999) + gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; + else + gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; + } +} + +void sub_8135AC4(void) +{ + s32 i; + u8 trainerClass; + struct BattleTowerRecord *playerRecord = &gSaveBlock2.battleTower.playerRecord; + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + if (gSaveBlock2.playerGender != MALE) + { + trainerClass = sFemaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] + + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 20u]; + } + else + { + trainerClass = sMaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] + + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 30u]; + } + + playerRecord->battleTowerLevelType = battleTowerLevelType; + playerRecord->trainerClass = trainerClass; + + copy_word_to_mem(playerRecord->trainerId, gSaveBlock2.playerTrainerId); + StringCopy8(playerRecord->name, gSaveBlock2.playerName); + + playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + + for (i = 0; i < 6; i++) + playerRecord->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; + + for (i = 0; i < 3; i++) + sub_803AF78(&gUnknown_030042FC[gSaveBlock2.battleTower.selectedPartyMons[i]], &playerRecord->party[i]); + + SetBattleTowerRecordChecksum(&gSaveBlock2.battleTower.playerRecord); + SaveCurrentWinStreak(); +} + +void SaveBattleTowerProgress(void) +{ + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0) + { + if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] > 1 + || gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] > 1) + sub_8135AC4(); + } + + sub_8135CFC(); + + gSaveBlock2.battleTower.battleOutcome = gBattleOutcome; + + if (gSpecialVar_0x8004 != 3) + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004; + + VarSet(VAR_TEMP_0, 0); + gSaveBlock2.battleTower.unk_554 = 1; + Save_WriteData(SAVE_EREADER); +} + +void BattleTower_SoftReset(void) +{ + DoSoftReset(); +} + +void ValidateBattleTowerRecordChecksums(void) +{ + u32 i; + s32 recordIndex; + struct BattleTowerRecord *record; + u32 checksum; + + checksum = 0; + for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) + checksum += ((u32 *)&gSaveBlock2.battleTower.playerRecord)[i]; + + if (gSaveBlock2.battleTower.playerRecord.checksum != checksum) + ClearBattleTowerRecord(&gSaveBlock2.battleTower.playerRecord); + + for (recordIndex = 0; recordIndex < 5; recordIndex++) + { + record = &gSaveBlock2.battleTower.records[recordIndex]; + checksum = 0; + for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) + checksum += ((u32 *)record)[i]; + + if (gSaveBlock2.battleTower.records[recordIndex].checksum != checksum) + ClearBattleTowerRecord(&gSaveBlock2.battleTower.records[recordIndex]); + } +} + +void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record) +{ + u32 i; + + record->checksum = 0; + for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) + record->checksum += ((u32 *)record)[i]; +} + +void ClearBattleTowerRecord(struct BattleTowerRecord *record) +{ + u32 i; + + for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32); i++) + ((u32 *)record)[i] = 0; +} + +void sub_8135CFC(void) +{ + s32 i; + + get_trainer_name(gSaveBlock2.battleTower.defeatedByTrainerName); + gSaveBlock2.battleTower.defeatedBySpecies = gBattleMons[1].species; + gSaveBlock2.battleTower.firstMonSpecies = gBattleMons[0].species; + + for (i = 0; i < POKEMON_NAME_LENGTH; i++) + gSaveBlock2.battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i]; +} + +u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) +{ + u16 winStreak = ((gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] - 1) * 7 - 1) + + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; + + if (winStreak > 9999) + return 9999; + else + return winStreak; +} + +void DetermineBattleTowerPrize(void) +{ + u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; + + if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1 > 5) + gSaveBlock2.battleTower.prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)]; + else + gSaveBlock2.battleTower.prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)]; +} + +void GiveBattleTowerPrize(void) +{ + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + if (AddBagItem(gSaveBlock2.battleTower.prizeItem, 1) == TRUE) + { + CopyItemName(gSaveBlock2.battleTower.prizeItem, gStringVar1); + gSpecialVar_Result = 1; + } + else + { + gSpecialVar_Result = 0; + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = 6; + } +} + +void AwardBattleTowerRibbons(void) +{ + s32 i; + u32 partyIndex; + struct Pokemon *pokemon; + u8 ribbonType; + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + if (battleTowerLevelType != 0) + ribbonType = MON_DATA_VICTORY_RIBBON; + else + ribbonType = MON_DATA_WINNING_RIBBON; + + gSpecialVar_Result = 0; + + if (GetCurrentBattleTowerWinStreak(battleTowerLevelType) > 55) + { + for (i = 0; i < 3; i++) + { + partyIndex = gSaveBlock2.battleTower.selectedPartyMons[i] - 1; + pokemon = &gPlayerParty[partyIndex]; + if (!GetMonData(pokemon, ribbonType)) + { + gSpecialVar_Result = 1; + SetMonData(pokemon, ribbonType, &gSpecialVar_Result); + } + } + } + + if (gSpecialVar_Result != 0) + IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); +} + +// This is a leftover debugging function that is used to populate the E-Reader +// trainer with the player's current data. +void Debug_FillEReaderTrainerWithPlayerData(void) +{ + struct BattleTowerEReaderTrainer *ereaderTrainer; + s32 i; + s32 j; + + ereaderTrainer = &gSaveBlock2.battleTower.ereaderTrainer; + + if (gSaveBlock2.playerGender != MALE) + { + ereaderTrainer->trainerClass = sFemaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] + + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 20u]; + } + else + { + ereaderTrainer->trainerClass = sMaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] + + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 30u]; + } + + copy_word_to_mem(ereaderTrainer->trainerId, gSaveBlock2.playerTrainerId); + StringCopy8(ereaderTrainer->name, gSaveBlock2.playerName); + + ereaderTrainer->winStreak = 1; + + j = 7; + for (i = 0; i < 6; i++) + { + ereaderTrainer->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; + ereaderTrainer->farewellPlayerLost[i] = j; + ereaderTrainer->farewellPlayerWon[i] = j + 6; + j++; + } + + for (i = 0; i < 3; i++) + sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]); + + SetEReaderTrainerChecksum(ereaderTrainer); +} + +u8 GetEReaderTrainerPicIndex(void) +{ + return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; +} + +u8 GetEReaderTrainerClassNameIndex(void) +{ + return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; +} + +void SetEReaderTrainerName(u8 *trainerName) +{ + s32 i; + + for (i = 0; i < 7; i++) + trainerName[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; + + trainerName[i] = 0xFF; +} + +// Checks if the saved E-Reader trainer is valid. +void ValidateEReaderTrainer(void) +{ + u32 i; + u32 checksum; + struct BattleTowerEReaderTrainer *ereaderTrainer; + + gSpecialVar_Result = 0; + ereaderTrainer = &gSaveBlock2.battleTower.ereaderTrainer; + + checksum = 0; + for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) + checksum |= ((u32 *)ereaderTrainer)[i]; + + if (checksum == 0) + { + gSpecialVar_Result = 1; + return; + } + + checksum = 0; + for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) + checksum += ((u32 *)ereaderTrainer)[i]; + + if (gSaveBlock2.battleTower.ereaderTrainer.checksum != checksum) + { + ClearEReaderTrainer(&gSaveBlock2.battleTower.ereaderTrainer); + gSpecialVar_Result = 1; + } +} + +void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer) +{ + s32 i; + + ereaderTrainer->checksum = 0; + for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) + ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i]; +} + +void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer) +{ + u32 i; + + for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32); i++) + ((u32 *)ereaderTrainer)[i] = 0; +} + +void PrintEReaderTrainerGreeting(void) +{ + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting); +} + +void PrintEReaderTrainerFarewellMessage(void) +{ + if (gBattleOutcome == BATTLE_DREW) + gStringVar4[0] = EOS; + else if (gBattleOutcome == BATTLE_WON) + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerWon); + else + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerLost); +} + +void TryEnableBravoTrainerBattleTower(void) +{ + s32 i; + + for (i = 0; i < 2; i++) + { + if (gSaveBlock2.battleTower.var_4AE[i] == 1) + sub_80BFD20(); + } +} + +#if GERMAN +u8 de_sub_81364AC(void) +{ + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; + else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + return gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; + else + return gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass; +} + +u8 de_sub_81364F8(void) +{ + return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; +} +#endif diff --git a/src/berry.c b/src/berry.c new file mode 100644 index 000000000..9313c458b --- /dev/null +++ b/src/berry.c @@ -0,0 +1,1565 @@ +#include "global.h" +#include "berry.h" +#include "field_control_avatar.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "item.h" +#include "item_menu.h" +#include "item_use.h" +#include "constants/items.h" +#include "main.h" +#include "menu.h" +#include "random.h" +#include "task.h" +#include "text.h" + +#define BERRY_NAME_LENGTH 6 +#define BERRY_REGROW_LIMIT 10 +#define MAX_BERRY_TREES 128 + +#define BERRY_NONE 0 +#define FIRST_BERRY ITEM_CHERI_BERRY +#define LAST_BERRY ITEM_ENIGMA_BERRY + +#define GETBERRYID(berry) ((berry - FIRST_BERRY) + 1) +#define GETITEMID(berry) ((berry + FIRST_BERRY) - 1) + +#ifdef ENGLISH +#define NAME_CHERI_BERRY _("CHERI") +#define NAME_CHESTO_BERRY _("CHESTO") +#define NAME_PECHA_BERRY _("PECHA") +#define NAME_RAWST_BERRY _("RAWST") +#define NAME_ASPEAR_BERRY _("ASPEAR") +#define NAME_LEPPA_BERRY _("LEPPA") +#define NAME_ORAN_BERRY _("ORAN") +#define NAME_PERSIM_BERRY _("PERSIM") +#define NAME_LUM_BERRY _("LUM") +#define NAME_SITRUS_BERRY _("SITRUS") +#define NAME_FIGY_BERRY _("FIGY") +#define NAME_WIKI_BERRY _("WIKI") +#define NAME_MAGO_BERRY _("MAGO") +#define NAME_AGUAV_BERRY _("AGUAV") +#define NAME_IAPAPA_BERRY _("IAPAPA") +#define NAME_RAZZ_BERRY _("RAZZ") +#define NAME_BLUK_BERRY _("BLUK") +#define NAME_NANAB_BERRY _("NANAB") +#define NAME_WEPEAR_BERRY _("WEPEAR") +#define NAME_PINAP_BERRY _("PINAP") +#define NAME_POMEG_BERRY _("POMEG") +#define NAME_KELPSY_BERRY _("KELPSY") +#define NAME_QUALOT_BERRY _("QUALOT") +#define NAME_HONDEW_BERRY _("HONDEW") +#define NAME_GREPA_BERRY _("GREPA") +#define NAME_TAMATO_BERRY _("TAMATO") +#define NAME_CORNN_BERRY _("CORNN") +#define NAME_MAGOST_BERRY _("MAGOST") +#define NAME_RABUTA_BERRY _("RABUTA") +#define NAME_NOMEL_BERRY _("NOMEL") +#define NAME_SPELON_BERRY _("SPELON") +#define NAME_PAMTRE_BERRY _("PAMTRE") +#define NAME_WATMEL_BERRY _("WATMEL") +#define NAME_DURIN_BERRY _("DURIN") +#define NAME_BELUE_BERRY _("BELUE") +#define NAME_LIECHI_BERRY _("LIECHI") +#define NAME_GANLON_BERRY _("GANLON") +#define NAME_SALAC_BERRY _("SALAC") +#define NAME_PETAYA_BERRY _("PETAYA") +#define NAME_APICOT_BERRY _("APICOT") +#define NAME_LANSAT_BERRY _("LANSAT") +#define NAME_STARF_BERRY _("STARF") +#define NAME_ENIGMA_BERRY _("ENIGMA") + +static const u8 gBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); +static const u8 gBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy."); +static const u8 gBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are"); +static const u8 gBerryDescriptionPart2_Chesto[] = _("very tough. It is dry-tasting all over."); +static const u8 gBerryDescriptionPart1_Pecha[] = _("Very sweet and delicious."); +static const u8 gBerryDescriptionPart2_Pecha[] = _("Also very tender - handle with care."); +static const u8 gBerryDescriptionPart1_Rawst[] = _("If the leaves grow long and curly,"); +static const u8 gBerryDescriptionPart2_Rawst[] = _("the BERRY seems to grow very bitter."); +static const u8 gBerryDescriptionPart1_Aspear[] = _("The hard BERRY is dense with a rich"); +static const u8 gBerryDescriptionPart2_Aspear[] = _("juice. It is quite sour."); +static const u8 gBerryDescriptionPart1_Leppa[] = _("Grows slower than CHERI and others."); +static const u8 gBerryDescriptionPart2_Leppa[] = _("The smaller the BERRY, the tastier."); +static const u8 gBerryDescriptionPart1_Oran[] = _("A peculiar BERRY with a mix of flavors."); +static const u8 gBerryDescriptionPart2_Oran[] = _("BERRIES grow in half a day."); +static const u8 gBerryDescriptionPart1_Persim[] = _("Loves sunlight. The BERRY’s color"); +static const u8 gBerryDescriptionPart2_Persim[] = _("grows vivid when exposed to the sun."); +static const u8 gBerryDescriptionPart1_Lum[] = _("Slow to grow. If raised with loving"); +static const u8 gBerryDescriptionPart2_Lum[] = _("care, it may grow two BERRIES."); +static const u8 gBerryDescriptionPart1_Sitrus[] = _("Closely related to ORAN. The large"); +static const u8 gBerryDescriptionPart2_Sitrus[] = _("BERRY has a well-rounded flavor."); +static const u8 gBerryDescriptionPart1_Figy[] = _("The BERRY, which looks chewed up,"); +static const u8 gBerryDescriptionPart2_Figy[] = _("brims with spicy substances."); +static const u8 gBerryDescriptionPart1_Wiki[] = _("The BERRY is said to have grown lumpy"); +static const u8 gBerryDescriptionPart2_Wiki[] = _("to help POKéMON grip it."); +static const u8 gBerryDescriptionPart1_Mago[] = _("The BERRY turns curvy as it grows."); +static const u8 gBerryDescriptionPart2_Mago[] = _("The curvier, the sweeter and tastier."); +static const u8 gBerryDescriptionPart1_Aguav[] = _("The flower is dainty. It is rare in its"); +static const u8 gBerryDescriptionPart2_Aguav[] = _("ability to grow without light."); +static const u8 gBerryDescriptionPart1_Iapapa[] = _("The BERRY is very big and sour."); +static const u8 gBerryDescriptionPart2_Iapapa[] = _("It takes at least a day to grow."); +static const u8 gBerryDescriptionPart1_Razz[] = _("The red BERRY tastes slightly spicy."); +static const u8 gBerryDescriptionPart2_Razz[] = _("It grows quickly in just four hours."); +static const u8 gBerryDescriptionPart1_Bluk[] = _("The BERRY is blue on the outside, but"); +static const u8 gBerryDescriptionPart2_Bluk[] = _("it blackens the mouth when eaten."); +static const u8 gBerryDescriptionPart1_Nanab[] = _("This BERRY was the seventh"); +static const u8 gBerryDescriptionPart2_Nanab[] = _("discovered in the world. It is sweet."); +static const u8 gBerryDescriptionPart1_Wepear[] = _("The flower is small and white. It has a"); +static const u8 gBerryDescriptionPart2_Wepear[] = _("delicate balance of bitter and sour."); +static const u8 gBerryDescriptionPart1_Pinap[] = _("Weak against wind and cold."); +static const u8 gBerryDescriptionPart2_Pinap[] = _("The fruit is spicy and the skin, sour."); +static const u8 gBerryDescriptionPart1_Pomeg[] = _("However much it is watered,"); +static const u8 gBerryDescriptionPart2_Pomeg[] = _("it only grows up to six BERRIES."); +static const u8 gBerryDescriptionPart1_Kelpsy[] = _("A rare variety shaped like a root."); +static const u8 gBerryDescriptionPart2_Kelpsy[] = _("Grows a very large flower."); +static const u8 gBerryDescriptionPart1_Qualot[] = _("Loves water. Grows strong even in"); +static const u8 gBerryDescriptionPart2_Qualot[] = _("locations with constant rainfall."); +static const u8 gBerryDescriptionPart1_Hondew[] = _("A BERRY that is very valuable and"); +static const u8 gBerryDescriptionPart2_Hondew[] = _("rarely seen. It is very delicious."); +static const u8 gBerryDescriptionPart1_Grepa[] = _("Despite its tenderness and round"); +static const u8 gBerryDescriptionPart2_Grepa[] = _("shape, the BERRY is unimaginably sour."); +static const u8 gBerryDescriptionPart1_Tamato[] = _("The BERRY is lip-bendingly spicy."); +static const u8 gBerryDescriptionPart2_Tamato[] = _("It takes time to grow."); +static const u8 gBerryDescriptionPart1_Cornn[] = _("A BERRY from an ancient era. May not"); +static const u8 gBerryDescriptionPart2_Cornn[] = _("grow unless planted in quantity."); +static const u8 gBerryDescriptionPart1_Magost[] = _("A BERRY that is widely said to have"); +static const u8 gBerryDescriptionPart2_Magost[] = _("a finely balanced flavor."); +static const u8 gBerryDescriptionPart1_Rabuta[] = _("A rare variety that is overgrown with"); +static const u8 gBerryDescriptionPart2_Rabuta[] = _("hair. It is quite bitter."); +static const u8 gBerryDescriptionPart1_Nomel[] = _("Quite sour. Just one bite makes it"); +static const u8 gBerryDescriptionPart2_Nomel[] = _("impossible to taste for three days."); +static const u8 gBerryDescriptionPart1_Spelon[] = _("The vividly red BERRY is very spicy."); +static const u8 gBerryDescriptionPart2_Spelon[] = _("Its warts secrete a spicy substance."); +static const u8 gBerryDescriptionPart1_Pamtre[] = _("Drifts on the sea from somewhere."); +static const u8 gBerryDescriptionPart2_Pamtre[] = _("It is thought to grow elsewhere."); +static const u8 gBerryDescriptionPart1_Watmel[] = _("A huge BERRY, with some over 20"); +static const u8 gBerryDescriptionPart2_Watmel[] = _("inches discovered. Exceedingly sweet."); +static const u8 gBerryDescriptionPart1_Durin[] = _("Bitter to even look at. It is so"); +static const u8 gBerryDescriptionPart2_Durin[] = _("bitter, no one has ever eaten it as is."); +static const u8 gBerryDescriptionPart1_Belue[] = _("It is glossy and looks delicious, but"); +static const u8 gBerryDescriptionPart2_Belue[] = _("it is awfully sour. Takes time to grow."); +static const u8 gBerryDescriptionPart1_Liechi[] = _("A mysterious BERRY. It is rumored to"); +static const u8 gBerryDescriptionPart2_Liechi[] = _("contain the power of the sea."); +static const u8 gBerryDescriptionPart1_Ganlon[] = _("A mysterious BERRY. It is rumored to"); +static const u8 gBerryDescriptionPart2_Ganlon[] = _("contain the power of the land."); +static const u8 gBerryDescriptionPart1_Salac[] = _("A mysterious BERRY. It is rumored to"); +static const u8 gBerryDescriptionPart2_Salac[] = _("contain the power of the sky."); +static const u8 gBerryDescriptionPart1_Petaya[] = _("A mysterious BERRY. It is rumored to"); +static const u8 gBerryDescriptionPart2_Petaya[] = _("contain the power of all living things."); +static const u8 gBerryDescriptionPart1_Apicot[] = _("A very mystifying BERRY. No telling"); +static const u8 gBerryDescriptionPart2_Apicot[] = _("what may happen or how it can be used."); +static const u8 gBerryDescriptionPart1_Lansat[] = _("Said to be a legendary BERRY."); +static const u8 gBerryDescriptionPart2_Lansat[] = _("Holding it supposedly brings joy."); +static const u8 gBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the"); +static const u8 gBerryDescriptionPart2_Starf[] = _("world’s edge. Considered a mirage."); +static const u8 gBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY."); +static const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars."); +#elif defined(GERMAN) +#define NAME_CHERI_BERRY _("AMRENA") +#define NAME_CHESTO_BERRY _("MARON") +#define NAME_PECHA_BERRY _("PIRSIF") +#define NAME_RAWST_BERRY _("FRAGIA") +#define NAME_ASPEAR_BERRY _("WILBIR") +#define NAME_LEPPA_BERRY _("JONAGO") +#define NAME_ORAN_BERRY _("SINEL") +#define NAME_PERSIM_BERRY _("PERSIM") +#define NAME_LUM_BERRY _("PRUNUS") +#define NAME_SITRUS_BERRY _("TSITRU") +#define NAME_FIGY_BERRY _("GIEFE") +#define NAME_WIKI_BERRY _("WIKI") +#define NAME_MAGO_BERRY _("MAGO") +#define NAME_AGUAV_BERRY _("GAUVE") +#define NAME_IAPAPA_BERRY _("YAPA") +#define NAME_RAZZ_BERRY _("HIMMIH") +#define NAME_BLUK_BERRY _("MORB") +#define NAME_NANAB_BERRY _("NANAB") +#define NAME_WEPEAR_BERRY _("NIRBE") +#define NAME_PINAP_BERRY _("SANANA") +#define NAME_POMEG_BERRY _("GRANA") +#define NAME_KELPSY_BERRY _("SETANG") +#define NAME_QUALOT_BERRY _("QUALOT") +#define NAME_HONDEW_BERRY _("HONMEL") +#define NAME_GREPA_BERRY _("LABRUS") +#define NAME_TAMATO_BERRY _("TAMOT") +#define NAME_CORNN_BERRY _("SAIM") +#define NAME_MAGOST_BERRY _("MAGOST") +#define NAME_RABUTA_BERRY _("RABUTA") +#define NAME_NOMEL_BERRY _("TRONZI") +#define NAME_SPELON_BERRY _("KIWAN") +#define NAME_PAMTRE_BERRY _("PALLM") +#define NAME_WATMEL_BERRY _("WASMEL") +#define NAME_DURIN_BERRY _("DURIN") +#define NAME_BELUE_BERRY _("MYRTIL") +#define NAME_LIECHI_BERRY _("LYDZI") +#define NAME_GANLON_BERRY _("LINGAN") +#define NAME_SALAC_BERRY _("SALKA") +#define NAME_PETAYA_BERRY _("TAHAY") +#define NAME_APICOT_BERRY _("APIKO") +#define NAME_LANSAT_BERRY _("LANSAT") +#define NAME_STARF_BERRY _("KRAMBO") +#define NAME_ENIGMA_BERRY _("ENIGMA") + +static const u8 gBerryDescriptionPart1_Cheri[] = _("Erblüht mit hübschen, zarten Blumen."); +static const u8 gBerryDescriptionPart2_Cheri[] = _("Diese knallrote BEERE ist sehr scharf."); +static const u8 gBerryDescriptionPart1_Chesto[] = _("Diese BEERE hat eine dicke Haut und"); +static const u8 gBerryDescriptionPart2_Chesto[] = _("hartes Fruchtfleisch. Trocken!"); +static const u8 gBerryDescriptionPart1_Pecha[] = _("Sehr süß und delikat."); +static const u8 gBerryDescriptionPart2_Pecha[] = _("Sehr zart. Vorsichtig anfassen!"); +static const u8 gBerryDescriptionPart1_Rawst[] = _("Wenn die Blätter lang und wellig sind,"); +static const u8 gBerryDescriptionPart2_Rawst[] = _("wird die BEERE sehr bitter."); +static const u8 gBerryDescriptionPart1_Aspear[] = _("Diese harte BEERE ist sehr"); +static const u8 gBerryDescriptionPart2_Aspear[] = _("saftig und sauer im Geschmack!"); +static const u8 gBerryDescriptionPart1_Leppa[] = _("Wächst langsamer als AMRENA und"); +static const u8 gBerryDescriptionPart2_Leppa[] = _("andere. Je kleiner, desto delikater."); +static const u8 gBerryDescriptionPart1_Oran[] = _("Eine BEERE unterschiedlichsten Ge-"); +static const u8 gBerryDescriptionPart2_Oran[] = _("schmacks. Wächst an einem halben Tag."); +static const u8 gBerryDescriptionPart1_Persim[] = _("Liebt Sonnenlicht. Die BEERE"); +static const u8 gBerryDescriptionPart2_Persim[] = _("wächst im Sonnenlicht sehr schnell."); +static const u8 gBerryDescriptionPart1_Lum[] = _("Langsamer Wuchs. Wird sie liebevoll ge-"); +static const u8 gBerryDescriptionPart2_Lum[] = _("pflegt, kann sie 2 BEEREN tragen."); +static const u8 gBerryDescriptionPart1_Sitrus[] = _("Eng verwandt mit SINEL. Diese große"); +static const u8 gBerryDescriptionPart2_Sitrus[] = _("BEERE ist von rundem Geschmack."); +static const u8 gBerryDescriptionPart1_Figy[] = _("Die BEERE sieht angekaut aus. Sie ist"); +static const u8 gBerryDescriptionPart2_Figy[] = _("voller scharfer Substanzen."); +static const u8 gBerryDescriptionPart1_Wiki[] = _("Die BEERE wächst unförmig,"); +static const u8 gBerryDescriptionPart2_Wiki[] = _("damit PKMN sie besser greifen können."); +static const u8 gBerryDescriptionPart1_Mago[] = _("Die BEERE hat Ausbeulungen. Je mehr"); +static const u8 gBerryDescriptionPart2_Mago[] = _("Beulen, desto schmackhafter ist sie."); +static const u8 gBerryDescriptionPart1_Aguav[] = _("Die Blume ist zart. Sie ist fähig,"); +static const u8 gBerryDescriptionPart2_Aguav[] = _("ohne Licht wachsen zu können."); +static const u8 gBerryDescriptionPart1_Iapapa[] = _("Die BEERE ist groß und sauer."); +static const u8 gBerryDescriptionPart2_Iapapa[] = _("Sie braucht einen Tag zum Wachsen."); +static const u8 gBerryDescriptionPart1_Razz[] = _("Diese rote BEERE schmeckt etwas"); +static const u8 gBerryDescriptionPart2_Razz[] = _("scharf. Sie wächst in nur 4 Stunden."); +static const u8 gBerryDescriptionPart1_Bluk[] = _("Die BEERE ist außen blau, verfärbt"); +static const u8 gBerryDescriptionPart2_Bluk[] = _("sich im Mund aber schwarz."); +static const u8 gBerryDescriptionPart1_Nanab[] = _("Diese BEERE war die 7., die auf der"); +static const u8 gBerryDescriptionPart2_Nanab[] = _("Welt entdeckt wurde. Sie ist süß."); +static const u8 gBerryDescriptionPart1_Wepear[] = _("Die Blume ist klein und weiß. Angenehm"); +static const u8 gBerryDescriptionPart2_Wepear[] = _("bitter und sauer zugleich."); +static const u8 gBerryDescriptionPart1_Pinap[] = _("Wind und Kälte verträgt sie nicht."); +static const u8 gBerryDescriptionPart2_Pinap[] = _("Fruchtfleisch: Scharf. Haut: Sauer."); +static const u8 gBerryDescriptionPart1_Pomeg[] = _("Egal wie viel Wasser sie bekommt, sie"); +static const u8 gBerryDescriptionPart2_Pomeg[] = _("trägt immer bis zu 6 BEEREN."); +static const u8 gBerryDescriptionPart1_Kelpsy[] = _("Eine Seltenheit. Geformt wie eine"); +static const u8 gBerryDescriptionPart2_Kelpsy[] = _("Wurzel. Hat eine große Blume."); +static const u8 gBerryDescriptionPart1_Qualot[] = _("Liebt das Wasser. Wächst besonders"); +static const u8 gBerryDescriptionPart2_Qualot[] = _("gut in regenreichen Gegenden."); +static const u8 gBerryDescriptionPart1_Hondew[] = _("Eine wertvolle und seltene BEERE."); +static const u8 gBerryDescriptionPart2_Hondew[] = _("Sie ist sehr schmackhaft."); +static const u8 gBerryDescriptionPart1_Grepa[] = _("Die BEERE ist zart und von runder"); +static const u8 gBerryDescriptionPart2_Grepa[] = _("Form. Aber sie ist unglaublich sauer!"); +static const u8 gBerryDescriptionPart1_Tamato[] = _("Die Schärfe der BEERE verbrennt die"); +static const u8 gBerryDescriptionPart2_Tamato[] = _("Lippen. Sie braucht Zeit zum Wachsen."); +static const u8 gBerryDescriptionPart1_Cornn[] = _("Eine BEERE aus alten Zeiten. Wächst"); +static const u8 gBerryDescriptionPart2_Cornn[] = _("nur, wenn in großen Mengen gepflanzt."); +static const u8 gBerryDescriptionPart1_Magost[] = _("Eine BEERE, die für ihren feinen, aus-"); +static const u8 gBerryDescriptionPart2_Magost[] = _("gewogenen Geschmack bekannt ist."); +static const u8 gBerryDescriptionPart1_Rabuta[] = _("Eine Seltenheit, die über und über mit"); +static const u8 gBerryDescriptionPart2_Rabuta[] = _("Haaren bewachsen ist. Sehr bitter!"); +static const u8 gBerryDescriptionPart1_Nomel[] = _("Sehr sauer. Ein Biss betäubt die"); +static const u8 gBerryDescriptionPart2_Nomel[] = _("Geschmacksnerven für 3 Tage!"); +static const u8 gBerryDescriptionPart1_Spelon[] = _("Die leuchtend rote BEERE ist sehr"); +static const u8 gBerryDescriptionPart2_Spelon[] = _("scharf. Gibt scharfe Substanzen ab!"); +static const u8 gBerryDescriptionPart1_Pamtre[] = _("Wird vom Meer angespült. Sie wächst"); +static const u8 gBerryDescriptionPart2_Pamtre[] = _("an einem anderen Ort."); +static const u8 gBerryDescriptionPart1_Watmel[] = _("Eine große BEERE, 25 cm groß."); +static const u8 gBerryDescriptionPart2_Watmel[] = _("Außergewöhnlich süß."); +static const u8 gBerryDescriptionPart1_Durin[] = _("Bitter schon ihr Anblick! Sie ist so"); +static const u8 gBerryDescriptionPart2_Durin[] = _("bitter, dass niemand sie pur isst."); +static const u8 gBerryDescriptionPart1_Belue[] = _("Sie glänzt, sieht zart aus, ist extrem"); +static const u8 gBerryDescriptionPart2_Belue[] = _("sauer und braucht Zeit zum Wachsen."); +static const u8 gBerryDescriptionPart1_Liechi[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +static const u8 gBerryDescriptionPart2_Liechi[] = _("sie enthalte die Kraft des Meeres."); +static const u8 gBerryDescriptionPart1_Ganlon[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +static const u8 gBerryDescriptionPart2_Ganlon[] = _("sie enthalte die Kraft des Landes."); +static const u8 gBerryDescriptionPart1_Salac[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +static const u8 gBerryDescriptionPart2_Salac[] = _("sie enthalte die Kraft des Himmels."); +static const u8 gBerryDescriptionPart1_Petaya[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +static const u8 gBerryDescriptionPart2_Petaya[] = _("sie enthalte die Kraft allen Lebens."); +static const u8 gBerryDescriptionPart1_Apicot[] = _("Eine rätselhafte BEERE. Man kann"); +static const u8 gBerryDescriptionPart2_Apicot[] = _("nicht sagen, wie und was sie ist."); +static const u8 gBerryDescriptionPart1_Lansat[] = _("Eine legendäre BEERE. Sie zu"); +static const u8 gBerryDescriptionPart2_Lansat[] = _("tragen bringt Freude."); +static const u8 gBerryDescriptionPart1_Starf[] = _("So stark, dass sie an den Rand der"); +static const u8 gBerryDescriptionPart2_Starf[] = _("Welt verbannt wurde. Ein Märchen?"); +static const u8 gBerryDescriptionPart1_Enigma[] = _("Eine enigmatische BEERE. Sie scheint"); +static const u8 gBerryDescriptionPart2_Enigma[] = _("die Macht der Sterne zu besitzen."); +#endif + +const struct Berry gBerries[] = +{ + { + .name = NAME_CHERI_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 20, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Cheri, + .description2 = gBerryDescriptionPart2_Cheri, + .stageDuration = 3, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_CHESTO_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 80, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Chesto, + .description2 = gBerryDescriptionPart2_Chesto, + .stageDuration = 3, + .spicy = 0, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_PECHA_BERRY, + .firmness = BERRY_FIRMNESS_VERY_SOFT, + .size = 40, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Pecha, + .description2 = gBerryDescriptionPart2_Pecha, + .stageDuration = 3, + .spicy = 0, + .dry = 0, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_RAWST_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 32, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Rawst, + .description2 = gBerryDescriptionPart2_Rawst, + .stageDuration = 3, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 10, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_ASPEAR_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 50, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Aspear, + .description2 = gBerryDescriptionPart2_Aspear, + .stageDuration = 3, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 10, + .smoothness = 25, + }, + { + .name = NAME_LEPPA_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 28, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Leppa, + .description2 = gBerryDescriptionPart2_Leppa, + .stageDuration = 4, + .spicy = 10, + .dry = 0, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_ORAN_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 35, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Oran, + .description2 = gBerryDescriptionPart2_Oran, + .stageDuration = 3, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_PERSIM_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 47, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Persim, + .description2 = gBerryDescriptionPart2_Persim, + .stageDuration = 3, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_LUM_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 34, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Lum, + .description2 = gBerryDescriptionPart2_Lum, + .stageDuration = 12, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_SITRUS_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 95, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Sitrus, + .description2 = gBerryDescriptionPart2_Sitrus, + .stageDuration = 6, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_FIGY_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 100, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Figy, + .description2 = gBerryDescriptionPart2_Figy, + .stageDuration = 6, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_WIKI_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 115, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Wiki, + .description2 = gBerryDescriptionPart2_Wiki, + .stageDuration = 6, + .spicy = 0, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_MAGO_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 126, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Mago, + .description2 = gBerryDescriptionPart2_Mago, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_AGUAV_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 64, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Aguav, + .description2 = gBerryDescriptionPart2_Aguav, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 10, + .sour = 0, + .smoothness = 25, + }, + { + .name = NAME_IAPAPA_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 223, + .maxYield = 3, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Iapapa, + .description2 = gBerryDescriptionPart2_Iapapa, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 10, + .smoothness = 25, + }, + { + .name = NAME_RAZZ_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 120, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Razz, + .description2 = gBerryDescriptionPart2_Razz, + .stageDuration = 1, + .spicy = 10, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_BLUK_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 108, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Bluk, + .description2 = gBerryDescriptionPart2_Bluk, + .stageDuration = 1, + .spicy = 0, + .dry = 10, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_NANAB_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 77, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Nanab, + .description2 = gBerryDescriptionPart2_Nanab, + .stageDuration = 1, + .spicy = 0, + .dry = 0, + .sweet = 10, + .bitter = 10, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_WEPEAR_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 74, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Wepear, + .description2 = gBerryDescriptionPart2_Wepear, + .stageDuration = 1, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_PINAP_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 80, + .maxYield = 6, + .minYield = 3, + .description1 = gBerryDescriptionPart1_Pinap, + .description2 = gBerryDescriptionPart2_Pinap, + .stageDuration = 1, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_POMEG_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 135, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Pomeg, + .description2 = gBerryDescriptionPart2_Pomeg, + .stageDuration = 3, + .spicy = 10, + .dry = 0, + .sweet = 10, + .bitter = 10, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_KELPSY_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 150, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Kelpsy, + .description2 = gBerryDescriptionPart2_Kelpsy, + .stageDuration = 3, + .spicy = 0, + .dry = 10, + .sweet = 0, + .bitter = 10, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_QUALOT_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 110, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Qualot, + .description2 = gBerryDescriptionPart2_Qualot, + .stageDuration = 3, + .spicy = 10, + .dry = 0, + .sweet = 10, + .bitter = 0, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_HONDEW_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 162, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Hondew, + .description2 = gBerryDescriptionPart2_Hondew, + .stageDuration = 3, + .spicy = 10, + .dry = 10, + .sweet = 0, + .bitter = 10, + .sour = 0, + .smoothness = 20, + }, + { + .name = NAME_GREPA_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 149, + .maxYield = 6, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Grepa, + .description2 = gBerryDescriptionPart2_Grepa, + .stageDuration = 3, + .spicy = 0, + .dry = 10, + .sweet = 10, + .bitter = 0, + .sour = 10, + .smoothness = 20, + }, + { + .name = NAME_TAMATO_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 200, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Tamato, + .description2 = gBerryDescriptionPart2_Tamato, + .stageDuration = 6, + .spicy = 20, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 30, + }, + { + .name = NAME_CORNN_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 75, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Cornn, + .description2 = gBerryDescriptionPart2_Cornn, + .stageDuration = 6, + .spicy = 0, + .dry = 20, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 30, + }, + { + .name = NAME_MAGOST_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 140, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Magost, + .description2 = gBerryDescriptionPart2_Magost, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 20, + .bitter = 10, + .sour = 0, + .smoothness = 30, + }, + { + .name = NAME_RABUTA_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 226, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Rabuta, + .description2 = gBerryDescriptionPart2_Rabuta, + .stageDuration = 6, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 20, + .sour = 10, + .smoothness = 30, + }, + { + .name = NAME_NOMEL_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 285, + .maxYield = 4, + .minYield = 2, + .description1 = gBerryDescriptionPart1_Nomel, + .description2 = gBerryDescriptionPart2_Nomel, + .stageDuration = 6, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 20, + .smoothness = 30, + }, + { + .name = NAME_SPELON_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 133, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Spelon, + .description2 = gBerryDescriptionPart2_Spelon, + .stageDuration = 18, + .spicy = 40, + .dry = 10, + .sweet = 0, + .bitter = 0, + .sour = 0, + .smoothness = 70, + }, + { + .name = NAME_PAMTRE_BERRY, + .firmness = BERRY_FIRMNESS_VERY_SOFT, + .size = 244, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Pamtre, + .description2 = gBerryDescriptionPart2_Pamtre, + .stageDuration = 18, + .spicy = 0, + .dry = 40, + .sweet = 10, + .bitter = 0, + .sour = 0, + .smoothness = 70, + }, + { + .name = NAME_WATMEL_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 250, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Watmel, + .description2 = gBerryDescriptionPart2_Watmel, + .stageDuration = 18, + .spicy = 0, + .dry = 0, + .sweet = 40, + .bitter = 10, + .sour = 0, + .smoothness = 70, + }, + { + .name = NAME_DURIN_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 280, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Durin, + .description2 = gBerryDescriptionPart2_Durin, + .stageDuration = 18, + .spicy = 0, + .dry = 0, + .sweet = 0, + .bitter = 40, + .sour = 10, + .smoothness = 70, + }, + { + .name = NAME_BELUE_BERRY, + .firmness = BERRY_FIRMNESS_VERY_SOFT, + .size = 300, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Belue, + .description2 = gBerryDescriptionPart2_Belue, + .stageDuration = 18, + .spicy = 10, + .dry = 0, + .sweet = 0, + .bitter = 0, + .sour = 40, + .smoothness = 70, + }, + { + .name = NAME_LIECHI_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 111, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Liechi, + .description2 = gBerryDescriptionPart2_Liechi, + .stageDuration = 24, + .spicy = 40, + .dry = 0, + .sweet = 40, + .bitter = 0, + .sour = 10, + .smoothness = 80, + }, + { + .name = NAME_GANLON_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 33, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Ganlon, + .description2 = gBerryDescriptionPart2_Ganlon, + .stageDuration = 24, + .spicy = 0, + .dry = 40, + .sweet = 0, + .bitter = 40, + .sour = 0, + .smoothness = 80, + }, + { + .name = NAME_SALAC_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 95, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Salac, + .description2 = gBerryDescriptionPart2_Salac, + .stageDuration = 24, + .spicy = 0, + .dry = 0, + .sweet = 40, + .bitter = 0, + .sour = 40, + .smoothness = 80, + }, + { + .name = NAME_PETAYA_BERRY, + .firmness = BERRY_FIRMNESS_VERY_HARD, + .size = 237, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Petaya, + .description2 = gBerryDescriptionPart2_Petaya, + .stageDuration = 24, + .spicy = 40, + .dry = 0, + .sweet = 0, + .bitter = 40, + .sour = 0, + .smoothness = 80, + }, + { + .name = NAME_APICOT_BERRY, + .firmness = BERRY_FIRMNESS_HARD, + .size = 75, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Apicot, + .description2 = gBerryDescriptionPart2_Apicot, + .stageDuration = 24, + .spicy = 0, + .dry = 40, + .sweet = 0, + .bitter = 0, + .sour = 40, + .smoothness = 80, + }, + { + .name = NAME_LANSAT_BERRY, + .firmness = BERRY_FIRMNESS_SOFT, + .size = 97, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Lansat, + .description2 = gBerryDescriptionPart2_Lansat, + .stageDuration = 24, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 30, + }, + { + .name = NAME_STARF_BERRY, + .firmness = BERRY_FIRMNESS_SUPER_HARD, + .size = 153, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Starf, + .description2 = gBerryDescriptionPart2_Starf, + .stageDuration = 24, + .spicy = 10, + .dry = 10, + .sweet = 10, + .bitter = 10, + .sour = 10, + .smoothness = 30, + }, + { + .name = NAME_ENIGMA_BERRY, + .firmness = BERRY_FIRMNESS_UNKNOWN, + .size = 0, + .maxYield = 2, + .minYield = 1, + .description1 = gBerryDescriptionPart1_Enigma, + .description2 = gBerryDescriptionPart2_Enigma, + .stageDuration = 24, + .spicy = 40, + .dry = 40, + .sweet = 40, + .bitter = 40, + .sour = 40, + .smoothness = 40, + }, +}; + +static const struct BerryTree gBlankBerryTree = {0}; + +extern u8 S_BerryTree[]; +extern u16 gSpecialVar_LastTalked; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +/* + An enigma berry is a type of berry which functions + as though it is a custom berry. Because it behaves + like its a custom berry, it doesn't hold an identity + represented in its icons or descriptions, leaving its + information to be decided by the e-reader cards + which were intended to deliver these custom + berries. +*/ + +static u8 CalcBerryYield(struct BerryTree *tree); +static u16 GetStageDurationByBerryType(u8 berry); + +#if DEBUG + +extern u8 sub_80B47D8(u16 var); + +u8 debug_sub_80C2B04(void) +{ + u8 taskId = sub_80B47D8(0); + + gTasks[taskId].data[4]--; + CloseMenu(); + return 1; +} + +u8 debug_sub_80C2B30(void) +{ + u8 taskId = sub_80B47D8(1); + + gTasks[taskId].data[4]--; + CloseMenu(); + return 1; +} + +#endif + +// unused +// this could be static, but making it so causes a compile-time warning. +void ClearEnigmaBerries(void) +{ + CpuFill16(0, &gSaveBlock1.enigmaBerry, sizeof(gSaveBlock1.enigmaBerry)); +} + +void SetEnigmaBerry(u8 *src) +{ + // initialize the enigma berry by copying the data from the script. + u32 i; + u8 *dest = (u8*)&gSaveBlock1.enigmaBerry; + + for (i = 0; i < sizeof(gSaveBlock1.enigmaBerry); i++) + dest[i] = src[i]; + + // at this point, the description pointer is not yet initialized. we need to initialize it since + // we dont know where in memory this is going to be. set the berry desc pointers to the + // EnigmaBerry struct's description arrays since these are where the descriptions are stored. + gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1; + gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; +} + +static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) +{ + const u8 *description1; + const u8 *description2; + u32 i; + u32 checksum; + u8 *dest; + + // the description pointers could be pointing to anywhere in memory. we do not want these + // pointers to factor into the checksum as it will produce a different result every time: so + // back the pointers up and set them to null so the checksum is safe to calculate. + description1 = gSaveBlock1.enigmaBerry.berry.description1; + description2 = gSaveBlock1.enigmaBerry.berry.description2; + gSaveBlock1.enigmaBerry.berry.description1 = NULL; + gSaveBlock1.enigmaBerry.berry.description2 = NULL; + + dest = (u8*)enigmaBerry; + checksum = 0; + for (i = 0; i < ((u32)&gSaveBlock1.enigmaBerry.checksum - (u32)&gSaveBlock1.enigmaBerry); i++) + checksum += dest[i]; + + // the checksum is calculated: the descriptions are safe to restore now. + gSaveBlock1.enigmaBerry.berry.description1 = description1; + gSaveBlock1.enigmaBerry.berry.description2 = description2; + + return checksum; +} + +#if DEBUG + +extern const u8 gSpriteImage_UnusedCherry[]; +extern const u16 gSpritePalette_UnusedCherry[]; +extern u8 gUnknown_Debug_839B6CE[]; + +static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ"); +static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう"); + +void debug_sub_80C2C18(u8 *name, u8 holdEffect, u8 holdEffectParam) +{ + s32 i; + + gSaveBlock1.enigmaBerry.berry = gBerries[0]; + StringCopy(gSaveBlock1.enigmaBerry.berry.name, name); + StringCopy(gSaveBlock1.enigmaBerry.description1, gUnknown_Debug_083F7F84); + StringCopy(gSaveBlock1.enigmaBerry.description2, gUnknown_Debug_083F7F90); + gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1; + gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; + for (i = 0; i < 0x480; i++) + gSaveBlock1.enigmaBerry.pic[i] = gSpriteImage_UnusedCherry[i]; + for (i = 0; i < 16; i++) + gSaveBlock1.enigmaBerry.palette[i] = gSpritePalette_UnusedCherry[i]; + for (i = 0; i < 18; i++) + gSaveBlock1.enigmaBerry.itemEffect[i] = gUnknown_Debug_839B6CE[i]; + gSaveBlock1.enigmaBerry.holdEffect = holdEffect; + gSaveBlock1.enigmaBerry.holdEffectParam = holdEffectParam; + gSaveBlock1.enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry); +} + +void debug_sub_80C2D24(u8 spicy, u8 dry, u8 sweet, u8 bitter, u8 sour, u8 smoothness) +{ + gSaveBlock1.enigmaBerry.berry.spicy = spicy; + gSaveBlock1.enigmaBerry.berry.dry = dry; + gSaveBlock1.enigmaBerry.berry.sweet = sweet; + gSaveBlock1.enigmaBerry.berry.bitter = bitter; + gSaveBlock1.enigmaBerry.berry.sour = sour; + gSaveBlock1.enigmaBerry.berry.smoothness = smoothness; + gSaveBlock1.enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry); +} + +#endif + +// due to e-reader scans being particularly volatile to failure, it is a requirement to check for +// their integrity here due to scans possibly failing to produce the correct result. +bool32 IsEnigmaBerryValid(void) +{ + if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0) + return FALSE; + if (gSaveBlock1.enigmaBerry.berry.maxYield == 0) + return FALSE; + if (GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry) != gSaveBlock1.enigmaBerry.checksum) + return FALSE; + return TRUE; +} + +const struct Berry *GetBerryInfo(u8 berry) +{ + // when getting the pointer to the berry info, enigma berries are handled differently. if your + // berry is an Enigma Berry and its checksum is valid, fetch the pointer to its information in + // the save block. + if (berry == GETBERRYID(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid()) + return &gSaveBlock1.enigmaBerry.berry; + else + { + // invalid berries will be flattened into a cheri berry. Interestingly, if your berry was + // an enigma berry whos checksum failed, the game will use the Enigma Berry information + // for this: meaning if you see the Enigma Berry information, its actually because the + // checksum failed. + if (berry == BERRY_NONE || berry > GETBERRYID(LAST_BERRY)) + berry = GETBERRYID(FIRST_BERRY); + return &gBerries[berry - 1]; + } +} + +// the save file can handle up to a number of 128 berry trees as indicated by its definition +// in global.h. Interestingly, this function does not check that limit of 128. +static struct BerryTree *GetBerryTreeInfo(u8 id) +{ + return &gSaveBlock1.berryTrees[id]; +} + +// this was called because the berry script was successful: meaning the player chose to +// water the tree. We need to check for the current tree stage and set the appropriate +// water flag to true. +bool32 FieldObjectInteractionWaterBerryTree(void) +{ + // GetBerryTreeInfo does not sanitize the tree retrieved, but there are no known + // instances where this can cause problems. + struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject)); + + switch (tree->stage) + { + case BERRY_STAGE_PLANTED: + tree->watered1 = TRUE; + break; + case BERRY_STAGE_SPROUTED: + tree->watered2 = TRUE; + break; + case BERRY_STAGE_TALLER: + tree->watered3 = TRUE; + break; + case BERRY_STAGE_FLOWERING: + tree->watered4 = TRUE; + break; + default: + return FALSE; + } + return TRUE; +} + +bool8 IsPlayerFacingUnplantedSoil(void) +{ + if (GetFieldObjectScriptPointerPlayerFacing() == S_BerryTree + && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == BERRY_STAGE_NO_BERRY) + return TRUE; + else + return FALSE; +} + +bool8 TryToWaterBerryTree(void) +{ + if (GetFieldObjectScriptPointerPlayerFacing() != S_BerryTree) + return FALSE; + else + return FieldObjectInteractionWaterBerryTree(); +} + +void ClearBerryTrees(void) +{ + int i; + struct SaveBlock1 *saveBlock1 = &gSaveBlock1; + struct BerryTree berryTree = gBlankBerryTree; + + for (i = 0; i < MAX_BERRY_TREES; i++) + saveBlock1->berryTrees[i] = berryTree; +} + +// when the player does not interact with the tree for a period of time, this is called +// to advance the grow state. +static bool32 BerryTreeGrow(struct BerryTree *tree) +{ + if (tree->growthSparkle) + return FALSE; + switch (tree->stage) + { + case BERRY_STAGE_NO_BERRY: + return FALSE; + case BERRY_STAGE_FLOWERING: + tree->berryYield = CalcBerryYield(tree); + case BERRY_STAGE_PLANTED: + case BERRY_STAGE_SPROUTED: + case BERRY_STAGE_TALLER: + tree->stage++; + break; + case BERRY_STAGE_BERRIES: + tree->watered1 = 0; + tree->watered2 = 0; + tree->watered3 = 0; + tree->watered4 = 0; + tree->berryYield = 0; + tree->stage = BERRY_STAGE_SPROUTED; + if (++tree->regrowthCount == BERRY_REGROW_LIMIT) + *tree = gBlankBerryTree; + break; + } + return TRUE; +} + +void BerryTreeTimeUpdate(s32 minutesPassed) +{ + int i; + struct BerryTree *tree; + + for (i = 0; i < MAX_BERRY_TREES; i++) + { + tree = &gSaveBlock1.berryTrees[i]; + + if (tree->berry != BERRY_NONE && tree->stage != BERRY_STAGE_NO_BERRY && tree->growthSparkle == FALSE) + { + // the player has waited too long to water the berry. Reset the tree. This is because + // if the berry state is not in the unwatered state, the tree will grow anyway despite this + // check, which means BerryTreeGrow will handle the regrow process for this, removing the + // need for this check. This only handles the unwatered soil state. + if (minutesPassed >= GetStageDurationByBerryType(tree->berry) * 71) + { + *tree = gBlankBerryTree; + } + else + { + // because time is altered below, perhaps they thought it was unsafe to change it, even + // though that is not how passed arguments behave. + s32 time = minutesPassed; + + while (time != 0) + { + if (tree->minutesUntilNextStage > time) + { + // its been X minutes since the last berry update, so update + // minutesUntilNextStage appropriately to match the time offset + // that has passed since the update. + tree->minutesUntilNextStage -= time; + break; + } + // perform the subtraction the other way around to get the number of minutes since + // the inferred stage update that occured, since minutesUntilNextStage is <= time. + // we may need this variable to simulate multiple berry cycles in the while loop. + time -= tree->minutesUntilNextStage; + tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry); // since the tree was inferred to update, set the new minutesUntilNextStage. + if (BerryTreeGrow(tree) == FALSE) + break; + if (tree->stage == BERRY_STAGE_BERRIES) + tree->minutesUntilNextStage *= 4; + } + } + } + } +} + +void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 noSparkle) +{ + struct BerryTree *tree = GetBerryTreeInfo(id); + + *tree = gBlankBerryTree; + tree->berry = berry; + tree->minutesUntilNextStage = GetStageDurationByBerryType(berry); + tree->stage = stage; + if (stage == BERRY_STAGE_BERRIES) + { + tree->berryYield = CalcBerryYield(tree); + tree->minutesUntilNextStage *= 4; + } + if (noSparkle == FALSE) + { + tree->growthSparkle = TRUE; + } +} + +void RemoveBerryTree(u8 id) +{ + gSaveBlock1.berryTrees[id] = gBlankBerryTree; +} + +u8 GetBerryTypeByBerryTreeId(u8 id) +{ + return gSaveBlock1.berryTrees[id].berry; +} + +u8 GetStageByBerryTreeId(u8 id) +{ + return gSaveBlock1.berryTrees[id].stage; +} + +u8 ItemIdToBerryType(u16 item) +{ + u16 berry = item - FIRST_BERRY; + + if (berry > LAST_BERRY - FIRST_BERRY) + return GETBERRYID(FIRST_BERRY); + else + return GETBERRYID(item); +} + +static u16 BerryTypeToItemId(u16 berry) +{ + u16 item = berry - 1; + + if (item > LAST_BERRY - FIRST_BERRY) + return FIRST_BERRY; + else + return GETITEMID(berry); +} + +void GetBerryNameByBerryType(u8 berry, u8 *string) +{ + memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH); + string[BERRY_NAME_LENGTH] = EOS; +} + +void ResetBerryTreeSparkleFlag(u8 id) +{ + GetBerryTreeInfo(id)->growthSparkle = FALSE; +} + +static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree) +{ + u8 count = 0; + + if (tree->watered1) + count++; + if (tree->watered2) + count++; + if (tree->watered3) + count++; + if (tree->watered4) + count++; + return count; +} + +static u8 GetNumStagesWateredByBerryTreeId(u8 id) +{ + return BerryTreeGetNumStagesWatered(GetBerryTreeInfo(id)); +} + +static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) +{ + u32 randMin; + u32 randMax; + u32 rand; + u32 extraYield; + + // depending on if the player gave the tree plenty of water, berry yield will be affected proportionally. + + if (water == 0) + return min; + else + { + randMin = (max - min) * (water - 1); + randMax = (max - min) * (water); + rand = randMin + Random() % (randMax - randMin + 1); + + if ((rand % 4) > 1) + extraYield = rand / 4 + 1; + else + extraYield = rand / 4; + return extraYield + min; + } +} + +static u8 CalcBerryYield(struct BerryTree *tree) +{ + const struct Berry *berry = GetBerryInfo(tree->berry); + u8 min = berry->minYield; + u8 max = berry->maxYield; + + return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree)); +} + +static u8 GetBerryCountByBerryTreeId(u8 id) +{ + return gSaveBlock1.berryTrees[id].berryYield; +} + +static u16 GetStageDurationByBerryType(u8 berry) +{ + return GetBerryInfo(berry)->stageDuration * 60; +} + +void FieldObjectInteractionGetBerryTreeData(void) +{ + u8 id; + u8 berry; + u8 localId; + u8 group; + u8 num; + + id = FieldObjectGetBerryTreeId(gSelectedMapObject); + berry = GetBerryTypeByBerryTreeId(id); + ResetBerryTreeSparkleFlag(id); + localId = gSpecialVar_LastTalked; + num = gSaveBlock1.location.mapNum; + group = gSaveBlock1.location.mapGroup; + if (IsBerryTreeSparkling(localId, num, group)) + { + // we cannot allow the player to grow/interact with the tree while the tree + // is undergoing the sparkling effect, so set the special var to the sparkling + // state and let the event script process the flag. + gSpecialVar_0x8004 = BERRY_STAGE_SPARKLING; + } + else + gSpecialVar_0x8004 = GetStageByBerryTreeId(id); + gSpecialVar_0x8005 = GetNumStagesWateredByBerryTreeId(id); + gSpecialVar_0x8006 = GetBerryCountByBerryTreeId(id); + GetBerryNameByBerryType(berry, gStringVar1); +} + +void Berry_FadeAndGoToBerryBagMenu(void) +{ + SetMainCallback2(sub_80A68CC); +} + +void FieldObjectInteractionPlantBerryTree(void) +{ + u8 berry = ItemIdToBerryType(gSpecialVar_ItemId); + + PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE); + FieldObjectInteractionGetBerryTreeData(); +} + +void FieldObjectInteractionPickBerryTree(void) +{ + u8 id = FieldObjectGetBerryTreeId(gSelectedMapObject); + u8 berry = GetBerryTypeByBerryTreeId(id); + + gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id)); +} + +void FieldObjectInteractionRemoveBerryTree(void) +{ + RemoveBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject)); + sub_8060288(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); +} + +bool8 PlayerHasBerries(void) +{ + return IsBagPocketNonEmpty(BAG_BERRIES); +} + +#if DEBUG +void debug_sub_80C33FC(const u8 *buffer, s32 value, u8 n) +{ + StringAppend(gStringVar4, buffer); + ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n); + StringAppend(gStringVar4, gStringVar1); +} + +static const u8 gUnknown_Debug_083F7F9D[] = _("POS:"); +static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:"); +static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:"); +static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:"); +static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:"); +static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:"); +static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:"); +static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:"); +static const u8 gUnknown_Debug_083F7FD3[] = _(""); + +u8* DebugOpenBerryInfo(void) +{ + if (GetFieldObjectScriptPointerPlayerFacing() != S_BerryTree) + { + return NULL; + } + else + { + u32 berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject); + struct BerryTree *berryTree = GetBerryTreeInfo(berryTreeId); + s32 i; + + for (i = 0; i < 500; i++) + gStringVar4[i] = EOS; + + debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->minutesUntilNextStage, 5); + debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1); + + return gStringVar4; + } +} + +#endif + +// whenever the player is not within view of the berry tree during its sparkle state, the +// sparkle state will be reset. +void ResetBerryTreeSparkleFlags(void) +{ + s16 cam_left; + s16 cam_top; + s16 left; + s16 top; + s16 right; + s16 bottom; + int i; + + GetCameraCoords(&cam_left, &cam_top); + left = cam_left; + top = cam_top + 3; + right = cam_left + 14; + bottom = top + 8; + for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.mapObjects); i++) + { + if (gMapObjects[i].active && gMapObjects[i].animPattern == 12) // is the object an active berry tree? + { + cam_left = gMapObjects[i].coords2.x; + cam_top = gMapObjects[i].coords2.y; + if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom) + ResetBerryTreeSparkleFlag(gMapObjects[i].trainerRange_berryTreeId); + } + } +} diff --git a/src/berry_blender.c b/src/berry_blender.c new file mode 100644 index 000000000..bf634a49f --- /dev/null +++ b/src/berry_blender.c @@ -0,0 +1,3560 @@ +#include "global.h" +#include "decompress.h" +#include "palette.h" +#include "event_data.h" +#include "main.h" +#include "text_window.h" +#include "menu.h" +#include "strings2.h" +#include "sound.h" +#include "constants/songs.h" +#include "berry.h" +#include "string_util.h" +#include "link.h" +#include "task.h" +#include "overworld.h" +#include "item.h" +#include "constants/items.h" +#include "random.h" +#include "save.h" +#include "menu_cursor.h" +#include "trig.h" +#include "pokeblock.h" +#include "ewram.h" + +//needed to match Blender_ControlHitPitch +struct MusicPlayerInfo +{ + struct SongHeader *songHeader; + u32 status; + u8 trackCount; + u8 priority; + u8 cmd; + u8 unk_B; + u32 clock; + u8 gap[8]; + u8 *memAccArea; + u16 tempoD; + u16 tempoU; + u16 tempoI; + u16 tempoC; + u16 fadeOI; + u16 fadeOC; + u16 fadeOV; + struct MusicPlayerTrack *tracks; + struct ToneData *tone; + u32 ident; + u32 func; + u32 intp; +}; + +#define BLENDER_SCORE_BEST 0 +#define BLENDER_SCORE_GOOD 1 +#define BLENDER_SCORE_MISS 2 + +#define BLENDER_MAX_PLAYERS 4 +#define BLENDER_SCORES_NO 3 + +#define FLAVOUR_SPICY 0 +#define FLAVOUR_DRY 1 +#define FLAVOUR_SWEET 2 +#define FLAVOUR_BITTER 3 +#define FLAVOUR_SOUR 4 + +struct BlenderBerry +{ + u16 itemID; + u8 name[7]; + u8 flavours[5]; + u8 smoothness; +}; + +struct BerryBlenderData +{ + u8 field_0; + u8 field_1; + struct Window field_4; + u8 field_35; + u8 field_36; + u8 field_37; + u8 field_38; + u8 field_39; + u8 field_3A; + u8 field_3B; + u8 field_3C; + u8 field_3D; + u8 field_3E; + u8 field_3F; + u8 field_40; + u8 field_41; + u8 field_42; + u8 field_43; + u8 field_44; + u8 field_45; + u8 field_46; + u8 field_47; + u8 field_48; + u8 field_49; + u8 field_4A; + u8 field_4B; + u8 field_4C; + u8 field_4D; + u16 field_4E; + u8 scoreIconIDs[3]; + u16 arrowPos; + s16 field_56; + s16 field_58; + u16 max_RPM; + u8 SyncArrowSpriteID[BLENDER_MAX_PLAYERS]; + u8 SyncArrowSprite2ID[BLENDER_MAX_PLAYERS]; + u8 field_64; + u8 field_65; + u8 field_66; + u8 field_67; + u8 field_68; + u8 field_69; + u8 field_6A; + u8 field_6B; + u8 field_6C; + u8 field_6D; + u8 field_6E; + u8 field_6F; + u16 field_70[BLENDER_MAX_PLAYERS]; + u16 field_78; + u16 field_7A; + u16 field_7C; + u8 field_7E; + u8 field_7F; + u16 chosenItemID[BLENDER_MAX_PLAYERS]; + u8 playersNo; + u8 field_89; + u8 field_8A; + u8 field_8B; + u8 field_8C; + u8 field_8D; + u8 field_8E; + u8 field_8F; + u8 field_90; + u8 field_91; + u8 field_92; + u8 field_93; + u16 field_94; + u8 field_96; + u8 field_97; + u8 field_98; + u8 field_99; + u16 field_9A[BLENDER_MAX_PLAYERS]; + u16 field_A2[BLENDER_MAX_PLAYERS]; + u8 field_AA; + u8 stringVar[129]; + u32 gameFrameTime; + s32 framesToWait; + u32 field_134; + u8 field_138; + u8 field_139; + u8 field_13A; + u8 field_13B; + u8 field_13C; + u8 field_13D; + u16 field_13E; + u16 field_140; + u16 field_142; + s16 field_144; + s16 field_146; + u8 field_148[3]; + u8 field_14B; + u16 scores[BLENDER_MAX_PLAYERS][3]; + u8 playerPlaces[BLENDER_MAX_PLAYERS]; + struct BgAffineDstData field_168; + u16 field_178; + struct BlenderBerry blendedBerries[BLENDER_MAX_PLAYERS]; + u32 field_1BC; + u16 field_1C0; + u16 field_1C2; + u32 field_1C4; +}; + +struct BlenderDebug +{ + s8 cursorPos; + s8 berries[4]; + struct Pokeblock pokeblock; + u8 field_10; + u8 spicy; + u8 dry; + u8 sweet; + u8 bitter; + u8 sour; + u8 feel; + s8 field_17; + s8 field_18; + s8 field_19; + s16 BPM; +}; + +// other files functions +void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch); +void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo); +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); +void sub_80A6978(void); +u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate); +void MenuCursor_SetPos814A880(u8 a1, u8 a2); +u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); +s8 GetFirstFreePokeblockSlot(void); +#ifdef GERMAN +extern void de_sub_8073110(); +#endif + +extern struct MusicPlayerInfo gMPlay_SE2; +extern struct MusicPlayerInfo gMPlay_BGM; +extern u16 gSpecialVar_ItemId; +extern u8 gUnknown_020297ED; +extern u8 byte_3002A68; + +extern const u8 gUnknown_08E6C100[]; +extern const u8 gUnknown_08E6C920[]; +extern const u8 gUnknown_08E6D354[]; +extern const struct WindowTemplate gWindowTemplate_81E6F68; +extern const u8 *const gPokeblockNames[]; +extern const struct Berry gBerries[]; + +extern const u8 gBerryBlenderArrowTiles[]; +extern const u8 gBerryBlenderMarubatsuTiles[]; +extern const u8 gBerryBlenderParticlesTiles[]; +extern const u8 gBerryBlenderCountdownNumbersTiles[]; +extern const u8 gBerryBlenderStartTiles[]; +extern const u16 gBerryBlenderMiscPalette[]; +extern const u16 gBerryBlenderArrowPalette[]; + +// ewram +static EWRAM_DATA u8 gUnknown_020297DC = 0; +static EWRAM_DATA u32 gUnknown_020297E0 = 0; +static EWRAM_DATA u32 gUnknown_020297E4 = 0; +static EWRAM_DATA u8 gUnknown_020297E8 = 0; + +// iwram common +u16 gUnknown_03004830; +u8 gInGameOpponentsNo; +u16 gUnknown_03004840[10]; +struct BerryBlenderData* gBerryBlenderData; + +// iwram bss +IWRAM_DATA s16 gUnknown_03000510[8]; +IWRAM_DATA s16 gUnknown_03000520[6]; +IWRAM_DATA s16 gUnknown_0300052C; +IWRAM_DATA s16 gUnknown_0300052E; +IWRAM_DATA s32 gUnknown_03000530[6]; +IWRAM_DATA s32 gUnknown_03000548[5]; +IWRAM_DATA u32 gUnknown_0300055C; +IWRAM_DATA struct BlenderDebug sBlenderDebug; + +// this file's functions +void Blender_SetBankBerryData(u8 bank, u16 itemID); + +static void sub_80514A4(void); +static void sub_80514F0(void); +static void sub_804E56C(void); +static void Blender_SetPlayerNamesLocal(u8 NoOfOpponents); +static void sub_8051474(void); +static void sub_804E9F8(void); +static void sub_804F378(void); +static void sub_8051414(struct BgAffineDstData *dest); +static void sub_804F238(void); +static void sub_80501FC(void); +static bool8 sub_8051B8C(void); +static void sub_804F2A8(void); +static void sub_804F81C(void); +static void sub_805156C(void); +void sub_8051684(struct Sprite* sprite); +static void sub_8051AC8(s16* a0, u16 a1); +static void sub_805194C(u16 a0, u16 a1); +static void sub_8051A3C(u16 a0); +static void sub_8051B18(void); +static void sub_805123C(void); +static void sub_8050954(void); +static bool8 Blender_PrintBlendingRanking(void); +bool8 Blender_PrintBlendingResults(void); +static void sub_80510E8(void); +static void sub_8050E30(void); +static void sub_805197C(u16 a0, u16 a1); +static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst); +static void sub_8052BD0(u8 taskID); +static void sub_8052AF8(void); +static void sub_804F8C8(u8 taskID); +static void sub_804F9F4(u8 taskID); +static void sub_804FB1C(u8 taskID); +static void sub_8051C04(struct Sprite* sprite); +static void sub_8051650(struct Sprite* sprite); +static void sub_805181C(struct Sprite* sprite); +static void sub_80518CC(struct Sprite* sprite); + +// const data +static const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal"); +static const u8 sBlenderCenterMap[] = INCBIN_U8("graphics/berry_blender/center_map.bin"); +static const u16 sBlenderOuterPal[] = INCBIN_U16("graphics/berry_blender/outer.gbapal"); + +// unreferenced pals? +static const u16 sUnknownPal_0[] = INCBIN_U16("graphics/unused/unknown/821604C.gbapal"); +static const u16 sUnknownArray_1[224] = {0}; + +// unreferenced Japanese strings +static const u8 sUnknownJpnString0[] = _("▶"); +static const u8 sUnknownJpnString1[] = _(" "); +static const u8 sUnknownJpnString2[] = _("カッコイ"); // "cool" (missing an イ at the end) +static const u8 sUnknownJpnString3[] = _("カワイイ"); // "cute" +static const u8 sUnknownJpnString4[] = _("ウツクシ"); // "beautiful" (missing an イ at the end) +static const u8 sUnknownJpnString5[] = _("カシコイ"); // "smart" +static const u8 sUnknownJpnString6[] = _("タクマシ"); // "tough" (missing an イ at the end) + +static const u8 gUnknown_08216249[] = _("\p"); + +// unreferenced; These appear to be the first names of four people who worked on the game. +static const u8 sUnknownJpnString7[10] = _("てつじ"); // Tetsuji (Ohta) +static const u8 sUnknownJpnString8[10] = _("あきと"); // Akito (Mori) +static const u8 sUnknownJpnString9[10] = _("シゲル"); // Shigeru (Ohmori) +static const u8 sUnknownJpnString10[10] = _("ヨシノリ"); // Yoshinori (Matsuda) + +static const u8 sUnknownText_2Pok[] = _("2Pok"); +static const u8 sUnknownText_3Pok[] = _("3Pok"); +static const u8 sUnknownText_4Pok[] = _("4Pok"); +static const u8* const gUnknown_08216284[] = +{ + sUnknownText_2Pok, sUnknownText_3Pok, sUnknownText_4Pok +}; + +// unreferenced player strings +static const u8 sUnknown1PString[4] = _("1P"); +static const u8 sUnknown2PString[4] = _("2P"); +static const u8 sUnknown3PString[4] = _("3P"); +static const u8 sUnknown4PString[4] = _("4P"); + +#ifdef ENGLISH +static const u8 sBlenderOpponentName1[] = _("MISTER"); +static const u8 sBlenderOpponentName2[] = _("LADDIE"); +static const u8 sBlenderOpponentName3[] = _("LASSIE"); +#else // GERMAN +static const u8 sBlenderOpponentName1[] = _("OPI"); +static const u8 sBlenderOpponentName2[] = _("KUMPEL"); +static const u8 sBlenderOpponentName3[] = _("TUSSI"); +#endif // ENGLISH +static const u8* const sBlenderOpponentsNames[] = +{ + sBlenderOpponentName1, sBlenderOpponentName2, sBlenderOpponentName3 +}; + +static const u8 sRedColorString[] = _("{COLOR RED}"); +static const u8 sNewLineString_0[] = _("\n"); +static const u8 sSpaceString_0[] = _(" "); + +static const s8 gUnknown_082162CC[][2] = +{ + {-1, -1}, {1, -1}, {-1, 1}, {1, 1} +}; + +static const u8 gUnknown_082162D4[][2] = +{ + {2, 6}, {23, 6}, {2, 12}, {23, 12}, {1, 6}, {22, 6}, {1, 12}, {22, 12} +}; + +static const u8 sBlenderSyncArrowsPos[][2] = +{ + {72, 32}, {168, 32}, {72, 128}, {168, 128} +}; + +static const u8 gUnknown_082162EC[3][4] = +{ + {-1, 0, 1, -1}, {-1, 0, 1, 2}, {0, 1, 2, 3} +}; + +static const u16 gUnknown_082162F8[] = {0, 0xC000, 0x4000, 0x8000}; +static const u8 gUnknown_08216300[] = {1, 1, 0}; +static const u8 gUnknown_08216303[] = {32, 224, 96, 160, 0}; + +static const TaskFunc gUnknown_08216308[] = +{ + sub_804F8C8, sub_804F9F4, sub_804FB1C +}; + +static const struct OamData sOamData_8216314 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_821631C[] = +{ + ANIMCMD_FRAME(16, 5, 1, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216324[] = +{ + ANIMCMD_FRAME(16, 5, .vFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_821632C[] = +{ + ANIMCMD_FRAME(16, 5, .hFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216334[] = +{ + ANIMCMD_FRAME(16, 5, 0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_821633C[] = +{ + ANIMCMD_FRAME(48, 2, 1, 1), + ANIMCMD_FRAME(32, 5, 1, 1), + ANIMCMD_FRAME(48, 3, 1, 1), + ANIMCMD_FRAME(16, 5, 1, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216350[] = +{ + ANIMCMD_FRAME(48, 2, .vFlip = TRUE), + ANIMCMD_FRAME(32, 5, .vFlip = TRUE), + ANIMCMD_FRAME(48, 3, .vFlip = TRUE), + ANIMCMD_FRAME(16, 5, .vFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216364[] = +{ + ANIMCMD_FRAME(48, 2, .hFlip = TRUE), + ANIMCMD_FRAME(32, 5, .hFlip = TRUE), + ANIMCMD_FRAME(48, 3, .hFlip = TRUE), + ANIMCMD_FRAME(16, 5, .hFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216378[] = +{ + ANIMCMD_FRAME(48, 2, 0, 0), + ANIMCMD_FRAME(32, 5, 0, 0), + ANIMCMD_FRAME(48, 3, 0, 0), + ANIMCMD_FRAME(16, 5, 0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_821638C[] = +{ + ANIMCMD_FRAME(0, 5, 1, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216394[] = +{ + ANIMCMD_FRAME(0, 5, .vFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_821639C[] = +{ + ANIMCMD_FRAME(0, 5, .hFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_82163A4[] = +{ + ANIMCMD_FRAME(0, 5, 0, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_82163AC[] = +{ + sSpriteAnim_821631C, + sSpriteAnim_8216324, + sSpriteAnim_821632C, + sSpriteAnim_8216334, + sSpriteAnim_821633C, + sSpriteAnim_8216350, + sSpriteAnim_8216364, + sSpriteAnim_8216378, + sSpriteAnim_821638C, + sSpriteAnim_8216394, + sSpriteAnim_821639C, + sSpriteAnim_82163A4 +}; + +static const struct SpriteSheet gUnknown_082163DC = +{ + gBerryBlenderArrowTiles, 0x800, 46545 +}; + +static const struct SpritePalette gUnknown_082163E4 = +{ + gBerryBlenderMiscPalette, 46546 +}; + +static const struct SpritePalette gUnknown_082163EC = +{ + gBerryBlenderArrowPalette, 12312 +}; + +static const struct SpriteTemplate sBlenderSyncArrow_SpriteTemplate = +{ + .tileTag = 46545, + .paletteTag = 12312, + .oam = &sOamData_8216314, + .anims = sSpriteAnimTable_82163AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8051C04 +}; + +static const struct OamData sOamData_821640C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_8216414[] = +{ + ANIMCMD_FRAME(0, 20), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_821641C[] = +{ + ANIMCMD_FRAME(4, 20, 1, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216424[] = +{ + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(12, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(12, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_821643C[] = +{ + ANIMCMD_FRAME(8, 4), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_8216444[] = +{ + sSpriteAnim_8216414, + sSpriteAnim_821641C, + sSpriteAnim_8216424, + sSpriteAnim_821643C, +}; + +static const struct SpriteSheet gUnknown_08216454 = +{ + gBerryBlenderMarubatsuTiles, 0x200, 48888 +}; + +static const struct SpriteTemplate sSpriteTemplate_821645C = +{ + .tileTag = 48888, + .paletteTag = 46546, + .oam = &sOamData_821640C, + .anims = sSpriteAnimTable_8216444, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8051650 +}; + +static const struct OamData sOamData_8216474 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_821647C[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(3, 5), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 3), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216494[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(4, 5), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(0, 3), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_82164AC[] = +{ + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(3, 3), + ANIMCMD_FRAME(2, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_82164D0[] = +{ + ANIMCMD_FRAME(5, 5, 1, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_82164D8[] = +{ + ANIMCMD_FRAME(6, 5, 1, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_82164E0[] = +{ + sSpriteAnim_821647C, + sSpriteAnim_8216494, + sSpriteAnim_82164AC, + sSpriteAnim_82164D0, + sSpriteAnim_82164D8, +}; + +static const struct SpriteSheet gUnknown_082164F4 = +{ + gBerryBlenderParticlesTiles, 0xE0, 23456 +}; + +static const struct SpriteTemplate sSpriteTemplate_82164FC = +{ + .tileTag = 23456, + .paletteTag = 46546, + .oam = &sOamData_8216474, + .anims = sSpriteAnimTable_82164E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct OamData sOamData_8216514 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_821651C[] = +{ + ANIMCMD_FRAME(32, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8216524[] = +{ + ANIMCMD_FRAME(16, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_821652C[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_8216534[] = +{ + sSpriteAnim_821651C, + sSpriteAnim_8216524, + sSpriteAnim_821652C, +}; + +static const struct SpriteSheet gUnknown_08216540 = +{ + gBerryBlenderCountdownNumbersTiles, 0x600, 12345 +}; + +static const struct SpriteTemplate sSpriteTemplate_8216548 = +{ + .tileTag = 12345, + .paletteTag = 46546, + .oam = &sOamData_8216514, + .anims = sSpriteAnimTable_8216534, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_805181C +}; + +static const struct OamData sOamData_8216560 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_8216568[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_8216570[] = +{ + sSpriteAnim_8216568, +}; + +static const struct SpriteSheet gUnknown_08216574 = +{ + gBerryBlenderStartTiles, 0x400, 12346 +}; + +static const struct SpriteTemplate sSpriteTemplate_821657C = +{ + .tileTag = 12346, + .paletteTag = 46546, + .oam = &sOamData_8216560, + .anims = sSpriteAnimTable_8216570, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80518CC +}; + +static const s16 gUnknown_08216594[][5] = +{ + {-10, 20, 10, 2, 1}, + {250, 20, 10, -2, 1}, + {-10, 140, 10, 2, -1}, + {250, 140, 10, -2, -1}, +}; + +static const u8 gUnknown_082165BC[][3] = +{ + {4, 3, 2}, {0, 4, 3}, {1, 0, 4}, {2, 1, 0}, {3, 2, 1}, {0, 2, 3}, {1, 3, 4}, {2, 4, 0}, {3, 0, 1}, {4, 1, 2}, +}; + +static const u8 gUnknown_082165DA[] = {1, 1, 2, 3, 4}; +static const u8 gUnknown_082165DF[] = {0x1C, 0x16, 0x13, 0x1A, 0x19, 0x0E, 0x0D, 0x0B, 0x07, 0x15}; +static const u8 gUnknown_082165E9[] = {6, 6, 6, 6, 5}; +static const u8 gUnknown_082165EE[] = {3, 3, 3, 2, 2}; +static const u8 gUnknown_082165F3[] = {3, 3, 3, 3, 2}; + +static const u8 sText_Space[] = _(" "); +static const u8 sText_BPM[] = _("BPM"); +static const u8 sText_Dash[] = _("-"); +static const u8 sNewLineString_1[] = _("\n"); +static const u8 sNewLineString_2[] = _("\n"); + +static void Blender_ControlHitPitch(void) +{ + m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, (gBerryBlenderData->field_56 - 128) * 2); +} + +static void VBlankCB0_BerryBlender(void) +{ + sub_80514A4(); + sub_80514F0(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void VBlankCB1_BerryBlender(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static bool8 sub_804E2EC(void) +{ + switch (gBerryBlenderData->field_1) + { + case 0: + LZDecompressWram(gUnknown_08E6C100, ewram10000); + gBerryBlenderData->field_1++; + break; + case 1: + DmaCopy16Defvars(3, sBlenderCenterMap, (void *)(VRAM + 0x4000), 0x400); + LoadPalette(sBlenderCenterPal, 0, 0x100); + gBerryBlenderData->field_1++; + break; + case 2: + DmaCopyLarge16(3, ewram10000, (void *)(VRAM + 0x0), 0x2000, 0x1000); + gBerryBlenderData->field_1++; + break; + case 3: + LZDecompressWram(gUnknown_08E6C920, ewram10000); + gBerryBlenderData->field_1++; + break; + case 4: + LZDecompressWram(gUnknown_08E6D354, ewram13000); + gBerryBlenderData->field_1++; + break; + case 5: + DmaCopy16Defvars(3, ewram10000, (void *)(VRAM + 0xE000), 0x1000); + gBerryBlenderData->field_1++; + break; + case 6: + DmaCopy16Defvars(3, ewram11000, (void *)(VRAM + 0xF000), 0x1000); + gBerryBlenderData->field_1++; + break; + case 7: + { + u16 i; + u16* palStore = (u16*)(ewram13000); + + for (i = 0; i < 640; i++) + { + *(palStore + i) |= 0x100; + } + DmaCopy16Defvars(3, ewram13000, (void *)(VRAM + 0x6000), 0x500); + LoadPalette(sBlenderOuterPal, 0x80, 0x20); + gBerryBlenderData->field_1++; + } + break; + case 8: + LoadSpriteSheet(&gUnknown_082163DC); + LoadSpriteSheet(&gUnknown_082164F4); + LoadSpriteSheet(&gUnknown_08216454); + gBerryBlenderData->field_1++; + break; + case 9: + LoadSpriteSheet(&gUnknown_08216540); + LoadSpriteSheet(&gUnknown_08216574); + LoadSpritePalette(&gUnknown_082163EC); + LoadSpritePalette(&gUnknown_082163E4); + gBerryBlenderData->field_1 = 0; + return TRUE; + } + return FALSE; +} + +static void sub_804E4FC(void) +{ + REG_DISPCNT = 0x1341; + REG_BG2CNT = 0x4880; + REG_BG1CNT = 0xC0D; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; +} + +void DoBerryBlending(void) +{ + u8* field6F; //this temp value is needed to match + + gBerryBlenderData = eBerryBlenderData; + + field6F = &gBerryBlenderData->field_6F; + gBerryBlenderData->field_0 = 0; + *field6F = 0; + + Blender_SetPlayerNamesLocal(gSpecialVar_0x8004); + SetMainCallback2(sub_804E56C); +} + +static void sub_804E56C(void) +{ + s32 i; + switch (gBerryBlenderData->field_0) + { + case 0: + REG_DISPCNT = 0; + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(NULL); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); + InitMenuWindow(&gWindowTemplate_81E6F68); + gBerryBlenderData->field_0++; + gBerryBlenderData->field_140 = 0; + gBerryBlenderData->field_13E = 0; + gBerryBlenderData->field_142 = 0x50; + gBerryBlenderData->field_144 = 0; + gBerryBlenderData->field_146 = 0; + gBerryBlenderData->field_1 = 0; + sub_8051474(); + break; + case 1: + if (sub_804E2EC()) + { + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + gBerryBlenderData->SyncArrowSpriteID[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); + StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSpriteID[i]], i + 8); + } + SetVBlankCallback(VBlankCB0_BerryBlender); + gBerryBlenderData->field_0++; + } + break; + case 2: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + sub_8051474(); + gBerryBlenderData->field_0++; + break; + case 3: + sub_804E4FC(); + if (!gPaletteFade.active) + { + gBerryBlenderData->field_0++; + } + break; + case 4: + Menu_DrawStdWindowFrame(0, 14, 29, 19); + MenuPrintMessage(gOtherText_BlenderChooseBerry, 1, 15); + gBerryBlenderData->field_0++; + break; + case 5: + if (Menu_UpdateWindowText()) + { + gBerryBlenderData->field_0++; + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + } + break; + case 6: + if (!gPaletteFade.active) + { + sub_80A6978(); + gBerryBlenderData->field_0 = 0; + } + break; + } + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_804E738(struct Sprite* sprite) +{ + sprite->data[1] += sprite->data[6]; + sprite->data[2] -= sprite->data[4]; + sprite->data[2] += sprite->data[7]; + sprite->data[0] += sprite->data[7]; + sprite->data[4]--; + + if (sprite->data[0] < sprite->data[2]) + { + sprite->data[3] = sprite->data[4] = sprite->data[3] - 1; + if (++sprite->data[5] > 3) + DestroySprite(sprite); + else + PlaySE(SE_TB_KARA); + } + sprite->pos1.x = sprite->data[1]; + sprite->pos1.y = sprite->data[2]; +} + +void sub_804E794(struct Sprite* sprite, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6) +{ + sprite->data[0] = a3; + sprite->data[1] = a2; + sprite->data[2] = a3; + sprite->data[3] = a4; + sprite->data[4] = 10; + sprite->data[5] = 0; + sprite->data[6] = a5; + sprite->data[7] = a6; + sprite->callback = sub_804E738; +} + +static void sub_804E7C0(u16 a0, u8 a1) +{ + u8 spriteID = sub_80A7DEC(a0 + 123, 0, 80, a1 & 1); + sub_804E794(&gSprites[spriteID], gUnknown_08216594[a1][0], gUnknown_08216594[a1][1], gUnknown_08216594[a1][2], gUnknown_08216594[a1][3], gUnknown_08216594[a1][4]); +} + +static void Blender_CopyBerryData(struct BlenderBerry* berry, u16 itemID) +{ + const struct Berry *berryInfo = GetBerryInfo(itemID + 124); + berry->itemID = itemID; + StringCopy(berry->name, berryInfo->name); + berry->flavours[FLAVOUR_SPICY] = berryInfo->spicy; + berry->flavours[FLAVOUR_DRY] = berryInfo->dry; + berry->flavours[FLAVOUR_SWEET] = berryInfo->sweet; + berry->flavours[FLAVOUR_BITTER] = berryInfo->bitter; + berry->flavours[FLAVOUR_SOUR] = berryInfo->sour; + berry->smoothness = berryInfo->smoothness; +} + +static void Blender_SetPlayerNamesLocal(u8 NoOfOpponents) +{ + int i; + if (NoOfOpponents) + { + for (i = 0; i < 4; i++) + gLinkPlayers[i].language = GAME_LANGUAGE; + } + switch (NoOfOpponents) + { + case 0: + gInGameOpponentsNo = 0; + break; + case 1: + gInGameOpponentsNo = 1; + gBerryBlenderData->playersNo = 2; + StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); + StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[0]); + break; + case 2: + gInGameOpponentsNo = 2; + gBerryBlenderData->playersNo = 3; + StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); + StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[0]); + StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[1]); + break; + case 3: + gInGameOpponentsNo = 3; + gBerryBlenderData->playersNo = 4; + StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); + StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[0]); + StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[1]); + StringCopy(gLinkPlayers[3].name, sBlenderOpponentsNames[2]); + break; + } +} + +void sub_804E990(void) +{ + s32 i; + + REG_DISPCNT = 0; + gBerryBlenderData = eBerryBlenderData; + gBerryBlenderData->field_0 = 0; + gBerryBlenderData->field_134 = 0; + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + gBerryBlenderData->chosenItemID[i] = 0; + } + Blender_SetPlayerNamesLocal(gSpecialVar_0x8004); + if (gSpecialVar_0x8004 == 0) + SetMainCallback2(sub_804E9F8); + else + SetMainCallback2(sub_804F378); +} + +static void sub_804E9F8(void) +{ + int i, j; + switch (gBerryBlenderData->field_0) + { + case 0: + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB0_BerryBlender); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); + InitMenuWindow(&gWindowTemplate_81E6F68); + gLinkType = 0x4422; + gBerryBlenderData->field_0++; + gBerryBlenderData->field_4E = 0; + gBerryBlenderData->field_7E = 0; + gBerryBlenderData->field_144 = 0; + gBerryBlenderData->field_146 = 0; + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + gBerryBlenderData->field_70[i] = 0; + for (j = 0; j < 3; j++) + { + gBerryBlenderData->scores[i][j] = 0; + } + } + gBerryBlenderData->field_7C = 0; + gBerryBlenderData->field_56 = 0; + gBerryBlenderData->arrowPos = 0; + gBerryBlenderData->max_RPM = 0; + gBerryBlenderData->field_1 = 0; + break; + case 1: + if (sub_804E2EC()) + { + gBerryBlenderData->field_0++; + sub_8051474(); + } + break; + case 2: + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + gBerryBlenderData->SyncArrowSprite2ID[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); + StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSprite2ID[i]], i + 8); + } + gBerryBlenderData->field_0++; + break; + case 3: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gBerryBlenderData->field_0++; + break; + case 4: + sub_804E4FC(); + if (!gPaletteFade.active) + { + gBerryBlenderData->field_0++; + } + break; + case 5: + Menu_DrawStdWindowFrame(0, 13, 29, 19); + Menu_PrintText(gOtherText_LinkStandby3, 1, 14); + gBerryBlenderData->field_0 = 8; + gBerryBlenderData->framesToWait = 0; + break; + case 8: + gBerryBlenderData->field_0++; + gBerryBlenderData->field_13C = 0; + Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); + memcpy(gBlockSendBuffer, &gBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry)); + sub_80084A4(); + gBerryBlenderData->framesToWait = 0; + break; + case 9: + if (IsLinkTaskFinished()) + { + ResetBlockReceivedFlags(); + if (GetMultiplayerId() == 0) + sub_8007E9C(4); + gBerryBlenderData->field_0++; + } + break; + case 10: + if (++gBerryBlenderData->framesToWait > 20) + { + Menu_EraseScreen(); + if (GetBlockReceivedStatus() == sub_8008198()) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + memcpy(&gBerryBlenderData->blendedBerries[i], &gBlockRecvBuffer[i][0], sizeof(struct BlenderBerry)); + gBerryBlenderData->chosenItemID[i] = gBerryBlenderData->blendedBerries[i].itemID; + } + ResetBlockReceivedFlags(); + gBerryBlenderData->field_0++; + } + } + break; + case 11: + gBerryBlenderData->playersNo = GetLinkPlayerCount(); + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + if (gBerryBlenderData->field_13C == gUnknown_082162EC[gBerryBlenderData->playersNo - 2][i]) + { + sub_804E7C0(gBerryBlenderData->chosenItemID[gBerryBlenderData->field_13C], i); + break; + } + } + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + gBerryBlenderData->field_13C++; + break; + case 12: + if (++gBerryBlenderData->framesToWait > 60) + { + if (gBerryBlenderData->field_13C >= gBerryBlenderData->playersNo) + { + gBerryBlenderData->field_0++; + gBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[gBerryBlenderData->playersNo - 2]] - 22528; + } + else + gBerryBlenderData->field_0--; + gBerryBlenderData->framesToWait = 0; + } + break; + case 13: + if (IsLinkTaskFinished()) + { + gBerryBlenderData->field_0++; + sub_8051414(&gBerryBlenderData->field_168); + } + break; + case 14: + REG_DISPCNT |= 0x400; + gBerryBlenderData->arrowPos += 0x200; + gBerryBlenderData->field_142 += 4; + if (gBerryBlenderData->field_142 > 255) + { + gBerryBlenderData->field_0++; + gBerryBlenderData->field_142 = 256; + gBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[gBerryBlenderData->playersNo - 2]]; + REG_BG2CNT = 0x4882; + gBerryBlenderData->framesToWait = 0; + sub_804F238(); + sub_804F2A8(); + } + sub_8051414(&gBerryBlenderData->field_168); + break; + case 15: + if (sub_8051B8C()) + { + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + } + sub_8051414(&gBerryBlenderData->field_168); + break; + case 16: + CreateSprite(&sSpriteTemplate_8216548, 120, -16, 3); + gBerryBlenderData->field_0++; + break; + case 18: + gBerryBlenderData->field_0++; + break; + case 19: + sub_80084A4(); + gBerryBlenderData->field_0++; + break; + case 20: + if (IsLinkTaskFinished()) + { + sub_8007E24(); + gBerryBlenderData->field_0++; + } + break; + case 21: + gBerryBlenderData->field_56 = 128; + gBerryBlenderData->gameFrameTime = 0; + SetMainCallback2(sub_80501FC); + if (GetCurrentMapMusic() != 403) + { + gBerryBlenderData->field_178 = GetCurrentMapMusic(); + } + PlayBGM(BGM_CYCLING); + break; + case 100: + Menu_DrawStdWindowFrame(0, 13, 29, 19); + MenuPrintMessage(gOtherText_LinkNotFound, 1, 15); + gBerryBlenderData->field_0++; + break; + case 101: + if (Menu_UpdateWindowText()) + gBerryBlenderData->field_0++; + break; + case 102: + if (!gPaletteFade.active) + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804F0F4(void) +{ + REG_DISPCNT = 0; + + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + + SetVBlankCallback(VBlankCB0_BerryBlender); + + Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); + InitMenuWindow(&gWindowTemplate_81E6F68); + + gLinkType = 0x4422; + + gBerryBlenderData->field_4E = 0; + gBerryBlenderData->field_56 = 0; + gBerryBlenderData->arrowPos = 0; + gBerryBlenderData->max_RPM = 0; + gBerryBlenderData->field_144 = 0; + gBerryBlenderData->field_146 = 0; + gBerryBlenderData->field_0++; +} + +static u8 sub_804F16C(u16 arrowPos, u8 a1) +{ + u32 var1 = (arrowPos / 256) + 24; + u8 arrID = gBerryBlenderData->field_A2[a1]; + u32 var2 = gUnknown_08216303[arrID]; + + if (var1 >= var2 && var1 < var2 + 48) + { + if (var1 >= var2 + 20 && var1 < var2 + 28) + return 2; + else + return 1; + } + else + return 0; +} + +static void sub_804F1BC(u16 itemID, u8 a1, struct BlenderBerry* berry) +{ + u16 r4 = 0; + u16 i; + if (itemID == ITEM_ENIGMA_BERRY) + { + for (i = 0; i < 5; i++) + { + if (berry->flavours[r4] > berry->flavours[i]) + r4 = i; + } + r4 += 5; + } + else + { + r4 = itemID - 133; + if (r4 >= 5) + r4 = (r4 % 5) + 5; + } + for (i = 0; i < a1 - 1; i++) + { + Blender_SetBankBerryData(i + 1, gUnknown_082165BC[r4][i] + 133); + } +} + +static void sub_804F238(void) +{ + s32 i, j; + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + gBerryBlenderData->field_A2[i] = 0xFF; + gBerryBlenderData->field_9A[i] = gUnknown_082162EC[gBerryBlenderData->playersNo - 2][i]; + } + for (j = 0; j < BLENDER_MAX_PLAYERS; j++) + { + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + if (gBerryBlenderData->field_9A[i] == j) + gBerryBlenderData->field_A2[j] = i; + } + } +} + +static void sub_804F2A8(void) +{ + int i; + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + if (gBerryBlenderData->field_9A[i] != 0xFF) + { + u8* stringPtr = gStringVar1; + + gBerryBlenderData->SyncArrowSpriteID[gBerryBlenderData->field_9A[i]] = gBerryBlenderData->SyncArrowSprite2ID[i]; + StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSpriteID[gBerryBlenderData->field_9A[i]]], i); + if (GetMultiplayerId() == gBerryBlenderData->field_9A[i]) + stringPtr = StringCopy(stringPtr, sRedColorString); + StringCopy(stringPtr, gLinkPlayers[gBerryBlenderData->field_9A[i]].name); + Menu_PrintTextPixelCoords(gStringVar1, gUnknown_082162D4[i][0] * 8 + 1, gUnknown_082162D4[i][1] * 8, 1); + } + } +} + +static void sub_804F378(void) +{ + s32 i, j; + switch (gBerryBlenderData->field_0) + { + case 0: + sub_804F0F4(); + Blender_SetBankBerryData(0, gSpecialVar_ItemId); + Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); + sub_804F1BC(gSpecialVar_ItemId, gBerryBlenderData->playersNo, &gBerryBlenderData->blendedBerries[0]); + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + gBerryBlenderData->field_70[i] = 0; + for (j = 0; j < 3; j++) + { + gBerryBlenderData->scores[i][j] = 0; + } + } + gBerryBlenderData->field_7C = 0; + gBerryBlenderData->field_1 = 0; + break; + case 1: + if (sub_804E2EC()) + { + gBerryBlenderData->field_0++; + sub_8051474(); + } + break; + case 2: + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + gBerryBlenderData->SyncArrowSprite2ID[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); + StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSprite2ID[i]], i + 8); + } + gBerryBlenderData->field_0++; + break; + case 3: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gBerryBlenderData->field_0++; + gBerryBlenderData->framesToWait = 0; + break; + case 4: + if (++gBerryBlenderData->framesToWait == 2) + sub_804E4FC(); + if (!gPaletteFade.active) + gBerryBlenderData->field_0 = 8; + break; + case 8: + gBerryBlenderData->field_0 = 11; + gBerryBlenderData->field_13C = 0; + break; + case 11: + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + u32 var = gUnknown_082162EC[gBerryBlenderData->playersNo - 2][i]; + if (gBerryBlenderData->field_13C == var) + { + sub_804E7C0(gBerryBlenderData->chosenItemID[gBerryBlenderData->field_13C], i); + break; + } + } + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + gBerryBlenderData->field_13C++; + break; + case 12: + if (++gBerryBlenderData->framesToWait > 60) + { + if (gBerryBlenderData->field_13C >= gBerryBlenderData->playersNo) + { + gBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[gBerryBlenderData->playersNo - 2]] - 22528; + gBerryBlenderData->field_0++; + } + else + gBerryBlenderData->field_0--; + gBerryBlenderData->framesToWait = 0; + } + break; + case 13: + gBerryBlenderData->field_0++; + sub_804F238(); + PlaySE(SE_RU_HYUU); + sub_8051414(&gBerryBlenderData->field_168); + break; + case 14: + REG_DISPCNT |= 0x400; + gBerryBlenderData->arrowPos += 0x200; + gBerryBlenderData->field_142 += 4; + if (gBerryBlenderData->field_142 > 255) + { + gBerryBlenderData->field_0++; + gBerryBlenderData->field_142 = 256; + gBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[gBerryBlenderData->playersNo - 2]]; + REG_BG2CNT = 0x4882; + gBerryBlenderData->framesToWait = 0; + PlaySE(SE_TRACK_DOOR);; + sub_804F2A8(); + } + sub_8051414(&gBerryBlenderData->field_168); + break; + case 15: + if (sub_8051B8C()) + { + gBerryBlenderData->field_0++; + } + sub_8051414(&gBerryBlenderData->field_168); + break; + case 16: + CreateSprite(&sSpriteTemplate_8216548, 120, -16, 3); + gBerryBlenderData->field_0++; + break; + case 18: + gBerryBlenderData->field_0++; + break; + case 19: + gBerryBlenderData->field_0++; + break; + case 20: + gBerryBlenderData->field_0++; + break; + case 21: + sub_804F81C(); + gBerryBlenderData->field_56 = 128; + gBerryBlenderData->gameFrameTime = 0; + gBerryBlenderData->field_14B = 0; + gBerryBlenderData->field_7E = 0; + SetMainCallback2(sub_80501FC); + + for (i = 0; i < gSpecialVar_0x8004; i++) + { + gBerryBlenderData->field_148[i] = CreateTask(gUnknown_08216308[i], 10 + i); + } + + if (GetCurrentMapMusic() != 403) + { + gBerryBlenderData->field_178 = GetCurrentMapMusic(); + } + PlayBGM(BGM_CYCLING); + PlaySE(SE_MOTER); + Blender_ControlHitPitch(); + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804F81C(void) +{ + s32 i; + for (i = 0; i < 4; i++) + { + gSendCmd[0] = 0; + gSendCmd[2] = 0; + gRecvCmds[0][i] = 0; + gRecvCmds[2][i] = 0; + } +} + +static void sub_804F844(u8 taskID) +{ + if(++gTasks[taskID].data[0] > gTasks[taskID].data[1]) + { + gRecvCmds[2][gTasks[taskID].data[2]] = 0x2345; + DestroyTask(taskID); + } +} + +static void sub_804F890(u8 a0, u8 a1) +{ + u8 taskID = CreateTask(sub_804F844, 80); + gTasks[taskID].data[1] = a1; + gTasks[taskID].data[2] = a0; +} + +static void sub_804F8C8(u8 taskID) +{ + if (sub_804F16C(gBerryBlenderData->arrowPos, 1) == 2) + { + if (gTasks[taskID].data[0] == 0) + { + if (gBerryBlenderData->field_14B == 0) + { + u8 rand = Random() / 655; + if (gBerryBlenderData->field_56 < 500) + { + if (rand > 75) + gRecvCmds[2][1] = 0x4523; + else + gRecvCmds[2][1] = 0x5432; + gRecvCmds[2][1] = 0x5432; // ??? + } + else if (gBerryBlenderData->field_56 < 1500) + { + if (rand > 80) + gRecvCmds[2][1] = 0x4523; + else + { + u8 value = rand - 21; + if (value < 60) + gRecvCmds[2][1] = 0x5432; + else if (rand < 10) + sub_804F890(1, 5); + } + } + else if (rand <= 90) + { + u8 value = rand - 71; + if (value < 20) + gRecvCmds[2][1] = 0x5432; + else if (rand < 30) + sub_804F890(1, 5); + } + else + gRecvCmds[2][1] = 0x4523; + } + else + gRecvCmds[2][1] = 0x4523; + + gTasks[taskID].data[0] = 1; + } + } + else + gTasks[taskID].data[0] = 0; +} + +static void sub_804F9F4(u8 taskID) +{ + u32 var1 = (gBerryBlenderData->arrowPos + 0x1800) & 0xFFFF; + u32 var2 = gBerryBlenderData->field_A2[2] & 0xFF; + if ((var1 >> 8) > gUnknown_08216303[var2] + 20 && (var1 >> 8) < gUnknown_08216303[var2] + 40) + { + if (gTasks[taskID].data[0] == 0) + { + if (gBerryBlenderData->field_14B == 0) + { + u8 rand = Random() / 655; + if (gBerryBlenderData->field_56 < 500) + { + if (rand > 66) + gRecvCmds[2][2] = 0x4523; + else + gRecvCmds[2][2] = 0x5432; + } + else + { + u8 value; + if (rand > 65) + gRecvCmds[2][2] = 0x4523; + value = rand - 41; + if (value < 25) + gRecvCmds[2][2] = 0x5432; + if (rand < 10) + sub_804F890(2, 5); + } + + gTasks[taskID].data[0] = 1; + } + else + { + gRecvCmds[2][2] = 0x4523; + gTasks[taskID].data[0] = 1; + } + } + } + else + gTasks[taskID].data[0] = 0; +} + +static void sub_804FB1C(u8 taskID) +{ + u32 var1, var2; + + var1 = (gBerryBlenderData->arrowPos + 0x1800) & 0xFFFF; + var2 = gBerryBlenderData->field_A2[3] & 0xFF; + if ((var1 >> 8) > gUnknown_08216303[var2] + 20 && (var1 >> 8) < gUnknown_08216303[var2] + 40) + { + if (gTasks[taskID].data[0] == 0) + { + if (gBerryBlenderData->field_14B == 0) + { + u8 rand = (Random() / 655); + if (gBerryBlenderData->field_56 < 500) + { + if (rand > 88) + gRecvCmds[2][3] = 0x4523; + else + gRecvCmds[2][3] = 0x5432; + } + else + { + if (rand > 60) + gRecvCmds[2][3] = 0x4523; + else + { + s8 value = rand - 56; // makes me wonder what the original code was + u8 value2 = value; + if (value2 < 5) + gRecvCmds[2][3] = 0x5432; + } + if (rand < 5) + sub_804F890(3, 5); + } + gTasks[taskID].data[0] = 1; + } + else + { + gRecvCmds[2][3] = 0x4523; + gTasks[taskID].data[0] = 1; + } + } + } + else + gTasks[taskID].data[0] = 0; +} + +static void sub_804FC48(u16 a0, u8 a1) +{ + u8 spriteID; + + spriteID = CreateSprite(&sSpriteTemplate_821645C, + sBlenderSyncArrowsPos[a1][0] - (10 * gUnknown_082162CC[a1][0]), + sBlenderSyncArrowsPos[a1][1] - (10 * gUnknown_082162CC[a1][1]), + 1); + if (a0 == 0x4523) + { + StartSpriteAnim(&gSprites[spriteID], 2); + gSprites[spriteID].callback = sub_8051684; + PlaySE(SE_RU_GASHIN); + } + else if (a0 == 0x5432) + { + StartSpriteAnim(&gSprites[spriteID], 0); + PlaySE(SE_SEIKAI); + } + else if (a0 == 0x2345) + { + StartSpriteAnim(&gSprites[spriteID], 1); + PlaySE(SE_HAZURE); + } + sub_805156C(); +} + +static void sub_804FD30(u16 a0) +{ + Blender_ControlHitPitch(); + switch (a0) + { + case 0x4523: + if (gBerryBlenderData->field_56 < 1500) + gBerryBlenderData->field_56 += (384 / gUnknown_082165DA[gBerryBlenderData->playersNo]); + else + { + gBerryBlenderData->field_56 += (128 / gUnknown_082165DA[gBerryBlenderData->playersNo]); + sub_8051AC8(&gBerryBlenderData->field_144, (gBerryBlenderData->field_56 / 100) - 10); + sub_8051AC8(&gBerryBlenderData->field_146, (gBerryBlenderData->field_56 / 100) - 10); + } + break; + case 0x5432: + if (gBerryBlenderData->field_56 < 1500) + gBerryBlenderData->field_56 += (256 / gUnknown_082165DA[gBerryBlenderData->playersNo]); + break; + case 0x2345: + gBerryBlenderData->field_56 -= (256 / gUnknown_082165DA[gBerryBlenderData->playersNo]); + if (gBerryBlenderData->field_56 < 128) + gBerryBlenderData->field_56 = 128; + break; + } +} + +static void sub_804FE70(void) +{ + s32 i; + + if (gSpecialVar_0x8004 != 0) + { + if (gSendCmd[2] != 0) + { + gRecvCmds[2][0] = gSendCmd[2]; + gRecvCmds[0][0] = 0x4444; + gSendCmd[2] = 0; + } + for (i = 1; i < 4; i++) + { + if (gRecvCmds[2][i] != 0) + gRecvCmds[0][i] = 0x4444; + } + } + for (i = 0; i < gBerryBlenderData->playersNo; i++) + { + if (gRecvCmds[0][i] == 0x4444) + { + u32 var = gBerryBlenderData->field_A2[i]; + if (gRecvCmds[2][i] == 0x4523) + { + sub_804FD30(0x4523); + gBerryBlenderData->field_13E += (gBerryBlenderData->field_56 / 55); + if (gBerryBlenderData->field_13E >= 1000) + gBerryBlenderData->field_13E = 1000; + sub_804FC48(0x4523, var); + gBerryBlenderData->scores[i][BLENDER_SCORE_BEST]++; + } + else if (gRecvCmds[2][i] == 0x5432) + { + sub_804FD30(0x5432); + gBerryBlenderData->field_13E += (gBerryBlenderData->field_56 / 70); + sub_804FC48(0x5432, var); + gBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]++; + } + else if (gRecvCmds[2][i] == 0x2345) + { + sub_804FC48(0x2345, var); + sub_804FD30(0x2345); + if (gBerryBlenderData->field_4.win_field_F > 1000) + gBerryBlenderData->field_13E = 1000; + if (gBerryBlenderData->scores[i][BLENDER_SCORE_MISS] < 999) + gBerryBlenderData->scores[i][BLENDER_SCORE_MISS]++; + } + if (gRecvCmds[2][i] == 0x2345 || gRecvCmds[2][i] == 0x4523 || gRecvCmds[2][i] == 0x5432) + { + if (gBerryBlenderData->field_56 > 1500) + m4aMPlayTempoControl(&gMPlay_BGM, ((gBerryBlenderData->field_56 - 750) / 20) + 256); + else + m4aMPlayTempoControl(&gMPlay_BGM, 256); + } + } + } + if (gSpecialVar_0x8004 != 0) + { + for (i = 0; i < gBerryBlenderData->playersNo; i++) + { + gRecvCmds[0][i] = 0; + gRecvCmds[2][i] = 0; + } + } +} + +static void sub_80500A8(void) +{ + bool8 A_pressed = 0; + u8 var2 = gBerryBlenderData->field_A2[GetMultiplayerId()]; + if (gBerryBlenderData->field_6F == 0) + { + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A && gMain.newKeys & A_BUTTON) + A_pressed = ((gMain.heldKeysRaw & (A_BUTTON | L_BUTTON)) != (A_BUTTON | L_BUTTON)); + else if (gMain.newKeys & A_BUTTON) + A_pressed = 1; + if (A_pressed) + { + u8 var3; + StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSpriteID[gBerryBlenderData->field_9A[var2]]], var2 + 4); + var3 = sub_804F16C(gBerryBlenderData->arrowPos, GetMultiplayerId()); + if (var3 == 2) + gSendCmd[2] = 0x4523; + else if (var3 == 1) + gSendCmd[2] = 0x5432; + else + gSendCmd[2] = 0x2345; + } + } + if (++gBerryBlenderData->field_7E > 5) + { + if (gBerryBlenderData->field_56 > 128) + gBerryBlenderData->field_56--; + gBerryBlenderData->field_7E = 0; + } + if (gUnknown_020297ED && gMain.newKeys & L_BUTTON) + gBerryBlenderData->field_14B ^= 1; +} + +static void sub_80501FC(void) +{ + sub_8051474(); + if (gBerryBlenderData->gameFrameTime < (99 * 60 * 60) + (59 * 60)) // game time can't be longer than 99 minutes and 59 seconds, can't print 3 digits + gBerryBlenderData->gameFrameTime++; + sub_80500A8(); + SetLinkDebugValues((u16)(gBerryBlenderData->field_56), gBerryBlenderData->field_13E); + sub_804FE70(); + sub_805194C(gBerryBlenderData->field_13E, 1000); + sub_8051A3C(gBerryBlenderData->field_56); + sub_8051B18(); + sub_805123C(); + if (gBerryBlenderData->field_6F == 0 && gBerryBlenderData->field_140 >= 1000) + { + gBerryBlenderData->field_13E = 1000; + gBerryBlenderData->field_6F = 1; + SetMainCallback2(sub_8050954); + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static bool8 sub_80502A4(struct BlenderBerry* berries, u8 index1, u8 index2) +{ + if (berries[index1].itemID != berries[index2].itemID + || (StringCompare(berries[index1].name, berries[index2].name) == 0 + && (berries[index1].flavours[0] == berries[index2].flavours[0] + && berries[index1].flavours[1] == berries[index2].flavours[1] + && berries[index1].flavours[2] == berries[index2].flavours[2] + && berries[index1].flavours[3] == berries[index2].flavours[3] + && berries[index1].flavours[4] == berries[index2].flavours[4] + && berries[index1].smoothness == berries[index2].smoothness))) + return TRUE; + else + return FALSE; +} + +u32 Blender_GetPokeblockColor(struct BlenderBerry* berries, s16* a1, u8 playersNo, u8 a3) +{ + s16 vars[5]; + s32 i; + s32 r6; + u8 r2; + + for (i = 0; i <= 5; i++) // bug, writing one index too far + vars[i] = a1[i]; + r6 = 0; + for (i = 0; i < 5; i++) + { + if (vars[i] == 0) + r6++; + } + if (r6 == 5 || a3 > 3) + return 12; + for (i = 0; i < playersNo; i++) + { + for (r6 = 0; r6 < playersNo; r6++) + { + if (berries[i].itemID == berries[r6].itemID && i != r6 + && (berries[i].itemID != ITEM_ENIGMA_BERRY || sub_80502A4(berries, i, r6))) + return 12; + } + } + r2 = 0; + for (r2 = 0, i = 0; i < 5; i++) + { + if (vars[i] > 0) + r2++; + } + if (r2 > 3) + return 13; + if (r2 == 3) + return 11; + for (i = 0; i < 5; i++) + { + if (vars[i] > 50) + return 14; + } + if (r2 == 1 && vars[0] > 0) + return 1; + if (r2 == 1 && vars[1] > 0) + return 2; + if (r2 == 1 && vars[2] > 0) + return 3; + if (r2 == 1 && vars[3] > 0) + return 4; + if (r2 == 1 && vars[4] > 0) + return 5; + if (r2 == 2) + { + s32 var = 0; + for (i = 0; i < 5; i++) + { + if (vars[i] > 0) + gUnknown_03000520[var++] = i; + } + if (vars[gUnknown_03000520[0]] >= vars[gUnknown_03000520[1]]) + { + if (gUnknown_03000520[0] == 0) + return (gUnknown_03000520[1] << 16) | 6; + if (gUnknown_03000520[0] == 1) + return (gUnknown_03000520[1] << 16) | 7; + if (gUnknown_03000520[0] == 2) + return (gUnknown_03000520[1] << 16) | 8; + if (gUnknown_03000520[0] == 3) + return (gUnknown_03000520[1] << 16) | 9; + if (gUnknown_03000520[0] == 4) + return (gUnknown_03000520[1] << 16) | 10; + } + else + { + if (gUnknown_03000520[1] == 0) + return (gUnknown_03000520[0] << 16) | 6; + if (gUnknown_03000520[1] == 1) + return (gUnknown_03000520[0] << 16) | 7; + if (gUnknown_03000520[1] == 2) + return (gUnknown_03000520[0] << 16) | 8; + if (gUnknown_03000520[1] == 3) + return (gUnknown_03000520[0] << 16) | 9; + if (gUnknown_03000520[1] == 4) + return (gUnknown_03000520[0] << 16) | 10; + } + } + return 0; +} + +static void sub_80504F0(s16 value) +{ + gUnknown_0300052C = value; +} + +s16 unref_sub_80504FC(void) +{ + return gUnknown_0300052C; +} + +static void sub_8050508(s16 value) +{ + gUnknown_0300052E = value; +} + +s16 unref_sub_8050514(void) +{ + return gUnknown_0300052E; +} + +static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavours, u16 maxRPM) +{ + s32 i; + s32 j; + s32 var3; + s32 var4; + s32 var6; + u8 r10; + + for (i = 0; i < 6; i++) + gUnknown_03000510[i] = 0; + for (i = 0; i < playersNo; i++) + { + for (j = 0; j < 6; j++) + gUnknown_03000510[j] += berries[i].flavours[j]; + } + + var6 = gUnknown_03000510[0]; + gUnknown_03000510[0] -= gUnknown_03000510[1]; + gUnknown_03000510[1] -= gUnknown_03000510[2]; + gUnknown_03000510[2] -= gUnknown_03000510[3]; + gUnknown_03000510[3] -= gUnknown_03000510[4]; + gUnknown_03000510[4] -= var6; + + var6 = 0; + for (i = 0; i < 5; i++) + { + if (gUnknown_03000510[i] < 0) + { + gUnknown_03000510[i] = 0; + var6++; + } + } + r10 = var6; + for (i = 0; i < 5; i++) + { + if (gUnknown_03000510[i] > 0) + { + if (gUnknown_03000510[i] < var6) + gUnknown_03000510[i] = 0; + else + gUnknown_03000510[i] -= var6; + } + } + for (i = 0; i < 5; i++) + { + gUnknown_03000530[i] = gUnknown_03000510[i]; + } + + var6 = maxRPM / 333 + 100; + gUnknown_0300055C = var6; + + for (i = 0; i < 5; i++) + { + var3 = gUnknown_03000510[i]; + var3 = (var3 * var6) / 10; + var4 = var3 % 10; + var3 /= 10; + if (var4 > 4) + var3++; + gUnknown_03000510[i] = var3; + } + for (i = 0; i < 5; i++) + { + gUnknown_03000548[i] = gUnknown_03000510[i]; + } + pokeblock->color = Blender_GetPokeblockColor(berries, &gUnknown_03000510[0], playersNo, r10); + gUnknown_03000510[5] = (gUnknown_03000510[5] / playersNo) - playersNo; + if (gUnknown_03000510[5] < 0) + gUnknown_03000510[5] = 0; + if (pokeblock->color == 12) + { + var6 = Random() % 10; + for (i = 0; i < 5; i++) + { + if ((gUnknown_082165DF[var6] >> i) & 1) + gUnknown_03000510[i] = 2; + else + gUnknown_03000510[i] = 0; + } + } + for (i = 0; i < 6; i++) + { + if (gUnknown_03000510[i] > 255) + gUnknown_03000510[i] = 255; + } + pokeblock->spicy = gUnknown_03000510[0]; + pokeblock->dry = gUnknown_03000510[1]; + pokeblock->sweet = gUnknown_03000510[2]; + pokeblock->bitter = gUnknown_03000510[3]; + pokeblock->sour = gUnknown_03000510[4]; + pokeblock->feel = gUnknown_03000510[5]; + for (i = 0; i < 6; i++) + { + flavours[i] = gUnknown_03000510[i]; + } +} + +static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavours, u16 a4) +{ + Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavours, a4); +} + +/*static*/ void sub_8050760(void) +{ + u32 frames = (u16)(gBerryBlenderData->gameFrameTime); + u16 max_RPM = gBerryBlenderData->max_RPM; + s16 var = 0; + + if (frames < 900) + var = 5; + else if ((u16)(frames - 900) < 600) + var = 4; + else if ((u16)(frames - 1500) < 600) + var = 3; + else if ((u16)(frames - 2100) < 900) + var = 2; + else if ((u16)(frames - 3300) < 300) + var = 1; + sub_8050508(var); + + var = 0; + if (max_RPM <= 64) + { + if (max_RPM >= 50 && max_RPM < 100) + var = -1; + else if (max_RPM >= 100 && max_RPM < 150) + var = -2; + else if (max_RPM >= 150 && max_RPM < 200) + var = -3; + else if (max_RPM >= 200 && max_RPM < 250) + var = -4; + else if (max_RPM >= 250 && max_RPM < 300) + var = -5; + else if (max_RPM >= 350 && max_RPM < 400) + var = -6; + else if (max_RPM >= 400 && max_RPM < 450) + var = -7; + else if (max_RPM >= 500 && max_RPM < 550) + var = -8; + else if (max_RPM >= 550 && max_RPM < 600) + var = -9; + else if (max_RPM >= 600) + var = -10; + } + sub_80504F0(var); +} + +static void sub_80508D4(u8 value) +{ + gBerryBlenderData->field_AA = value; + MenuCursor_SetPos814A880(192, (gBerryBlenderData->field_AA * 16) + 72); +} + +static void sub_80508FC(void) +{ + gBerryBlenderData->field_AA = 0; + Menu_DrawStdWindowFrame(23, 8, 28, 13); + MenuCursor_Create814A5C0(0, -1, 12, 0x2D9F, 32); + Menu_PrintText(gOtherText_YesNoTerminating, 24, 9); + sub_80508D4(gBerryBlenderData->field_AA); +} + +static void sub_8050954(void) +{ + u8 i; + u8 multiplayerID; // unused + + sub_8051474(); + multiplayerID = GetMultiplayerId(); + switch (gBerryBlenderData->field_6F) + { + case 1: + ClearLinkCallback(); + m4aMPlayTempoControl(&gMPlay_BGM, 256); + for (i = 0; i < gSpecialVar_0x8004; i++) + { + DestroyTask(gBerryBlenderData->field_148[i]); + } + gBerryBlenderData->field_6F++; + break; + case 2: + gBerryBlenderData->field_56 -= 32; + if (gBerryBlenderData->field_56 <= 0) + { + gBerryBlenderData->field_56 = 0; + if (gReceivedRemoteLinkPlayers != 0) + gBerryBlenderData->field_6F++; + else + gBerryBlenderData->field_6F = 5; + gBerryBlenderData->field_0 = 0; + m4aMPlayStop(&gMPlay_SE2); + } + Blender_ControlHitPitch(); + break; + case 3: + if (/*multiplayerID != 0*/ GetMultiplayerId() != 0) + gBerryBlenderData->field_6F++; + else if (IsLinkTaskFinished()) + { + gBerryBlenderData->field_1BC = gBerryBlenderData->gameFrameTime; + gBerryBlenderData->field_1C0 = gBerryBlenderData->max_RPM; + SendBlock(0, &gBerryBlenderData->field_1BC, 40); + gBerryBlenderData->field_6F++; + } + break; + case 4: + if (GetBlockReceivedStatus()) + { + u32* ptr = ((u32*)(&gBlockRecvBuffer[0][0])); + gBerryBlenderData->max_RPM = gBlockRecvBuffer[0][2]; + gBerryBlenderData->gameFrameTime = *ptr; + gBerryBlenderData->field_6F++; + ResetBlockReceivedFlags(); + } + break; + case 5: + if (Blender_PrintBlendingRanking()) + gBerryBlenderData->field_6F++; + break; + case 6: + if (Blender_PrintBlendingResults()) + { + if (gInGameOpponentsNo == 0) + IncrementGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS); + else + IncrementGameStat(GAME_STAT_POKEBLOCKS); + gBerryBlenderData->field_6F++; + } + break; + case 7: + gBerryBlenderData->field_6F++; + Menu_DrawStdWindowFrame(0, 14, 29, 19); + MenuPrintMessage(gOtherText_BlendAnotherBerryPrompt, 1, 15); + break; + case 8: + if (Menu_UpdateWindowText()) + gBerryBlenderData->field_6F++; + break; + case 9: + gBerryBlenderData->field_AA = 0; + sub_80508FC(); + gBerryBlenderData->field_6F++; + break; + case 10: + if (gMain.newKeys & DPAD_UP) + { + if (gBerryBlenderData->field_AA != 0) + PlaySE(SE_SELECT); + sub_80508D4(0); + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (gBerryBlenderData->field_AA != 1) + PlaySE(SE_SELECT); + sub_80508D4(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gBerryBlenderData->field_6F++; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gBerryBlenderData->field_6F++; + sub_80508D4(1); + } + break; + case 11: + gSendCmd[0] = 0x2FFF; + if (gBerryBlenderData->field_AA == 0) + { + if (IsBagPocketNonEmpty(BAG_BERRIES) == FALSE) // is empty + { + gBerryBlenderData->field_7C = 2; + gSendCmd[1] = 0x9999; + } + else if (GetFirstFreePokeblockSlot() == -1) + { + gBerryBlenderData->field_7C = 3; + gSendCmd[1] = 0xAAAA; + } + else + { + gBerryBlenderData->field_7C = 0; + gSendCmd[1] = 0x7779; + } + gBerryBlenderData->field_6F++; + } + else + { + gBerryBlenderData->field_7C = 1; + gSendCmd[1] = 0x8888; + gBerryBlenderData->field_6F++; + } + break; + case 12: + if (gInGameOpponentsNo) + { + SetMainCallback2(sub_80510E8); + gBerryBlenderData->field_6F = 0; + gBerryBlenderData->field_0 = 0; + } + else + { + MenuPrintMessage(gOtherText_LinkStandby3, 1, 15); + gBerryBlenderData->field_6F++; + } + break; + case 13: + if (Menu_UpdateWindowText()) + { + SetMainCallback2(sub_8050E30); + gBerryBlenderData->field_6F = 0; + gBerryBlenderData->field_0 = 0; + } + break; + } + sub_8051B18(); + sub_8051A3C(gBerryBlenderData->field_56); + sub_805123C(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +bool8 sub_8050CE8(void) +{ + switch (gBerryBlenderData->field_1C4) + { + case 0: + sub_80084A4(); + gBerryBlenderData->field_1C4 = 1; + gBerryBlenderData->framesToWait = 0; + break; + case 1: + if (IsLinkTaskFinished()) + { + gBerryBlenderData->field_1C4++; + gSoftResetDisabled = TRUE; + } + break; + case 2: + sub_8125E2C(); + gBerryBlenderData->field_1C4++; + gBerryBlenderData->framesToWait = 0; + break; + case 3: + if (++gBerryBlenderData->framesToWait == 10) + { + sub_80084A4(); + gBerryBlenderData->field_1C4++; + } + break; + case 4: + if (IsLinkTaskFinished()) + { + if (sub_8125E6C()) + gBerryBlenderData->field_1C4 = 5; + else + { + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_1C4 = 3; + } + } + break; + case 5: + gBerryBlenderData->field_1C4++; + gBerryBlenderData->framesToWait = 0; + break; + case 6: + if (++gBerryBlenderData->framesToWait > 5) + { + gSoftResetDisabled = FALSE; + return TRUE; + } + break; + } + return FALSE; +} + +static void sub_8050E30(void) +{ + switch (gBerryBlenderData->field_6F) + { + case 0: + if (gBerryBlenderData->field_70[0] == 0x2222) + gBerryBlenderData->field_6F = 5; + else if (gBerryBlenderData->field_70[0] == 0x1111) + { + if (gBerryBlenderData->field_78 == 0x9999) + gBerryBlenderData->field_6F = 2; + else if (gBerryBlenderData->field_78 == 0xAAAA) + gBerryBlenderData->field_6F = 1; + else + gBerryBlenderData->field_6F = 5; + } + break; + case 1: + gBerryBlenderData->field_6F = 3; + DestroyMenuCursor(); + Menu_EraseWindowRect(23, 8, 28, 13); +#ifdef ENGLISH + StringCopy(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); + StringAppend(gStringVar4, gOtherText_OtherCaseIsFull); +#else + StringCopy(gStringVar4, gOtherText_OtherCaseIsFull); + de_sub_8073110(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); +#endif + MenuPrintMessage(gStringVar4, 1, 15); + break; + case 2: + gBerryBlenderData->field_6F++; + DestroyMenuCursor(); + Menu_EraseWindowRect(23, 8, 28, 13); +#ifdef ENGLISH + StringCopy(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); + StringAppend(gStringVar4, gOtherText_NoBerriesForBlend); +#else + StringCopy(gStringVar4, gOtherText_NoBerriesForBlend); + de_sub_8073110(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); +#endif + MenuPrintMessage(gStringVar4, 1, 15); + break; + case 3: + if (Menu_UpdateWindowText()) + { + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_6F++; + } + break; + case 4: + if (++gBerryBlenderData->framesToWait > 60) + gBerryBlenderData->field_6F = 5; + break; + case 5: + Menu_DrawStdWindowFrame(0, 14, 29, 19); + Menu_PrintText(gMultiText_Saving, 2, 15); + sub_80084A4(); + gBerryBlenderData->field_6F++; + break; + case 6: + if (IsLinkTaskFinished()) + { + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_6F++; + gBerryBlenderData->field_1C4 = 0; + } + break; + case 7: + if (sub_8050CE8()) + { + PlaySE(SE_SAVE); + gBerryBlenderData->field_6F++; + } + break; + case 8: + gBerryBlenderData->field_6F++; + sub_80084A4(); + break; + case 9: + if (IsLinkTaskFinished()) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gBerryBlenderData->field_6F++; + } + break; + case 10: + if (!gPaletteFade.active) + { + if (gBerryBlenderData->field_70[0] == 0x2222) + SetMainCallback2(DoBerryBlending); + else + { + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_6F++; + } + } + break; + case 11: + if (++gBerryBlenderData->framesToWait > 30) + { + sub_800832C(); + gBerryBlenderData->field_6F++; + } + break; + case 12: + if (gReceivedRemoteLinkPlayers == 0) + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + break; + } + + sub_805123C(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_80510E8(void) +{ + switch (gBerryBlenderData->field_6F) + { + case 0: + if (gBerryBlenderData->field_7C < 2) + gBerryBlenderData->field_6F = 9; + if (gBerryBlenderData->field_7C == 2) + gBerryBlenderData->field_6F = 2; + if (gBerryBlenderData->field_7C == 3) + gBerryBlenderData->field_6F =1; + break; + case 1: + gBerryBlenderData->field_6F = 3; + DestroyMenuCursor(); + Menu_EraseWindowRect(23, 8, 28, 13); + MenuPrintMessage(gOtherText_CaseIsFull, 1, 15); + break; + case 2: + gBerryBlenderData->field_6F++; + DestroyMenuCursor(); + Menu_EraseWindowRect(23, 8, 28, 13); + MenuPrintMessage(gOtherText_OutOfBerries, 1, 15); + break; + case 3: + if (Menu_UpdateWindowText()) + gBerryBlenderData->field_6F = 9; + break; + case 9: + BeginFastPaletteFade(3); + gBerryBlenderData->field_6F++; + break; + case 10: + if (!gPaletteFade.active) + { + if (gBerryBlenderData->field_7C == 0) + SetMainCallback2(DoBerryBlending); + else + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + } + break; + } + + sub_805123C(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_805123C(void) +{ + if (gReceivedRemoteLinkPlayers) + { + if (gRecvCmds[0][0] == 0x2FFF) + { + if (gRecvCmds[1][0] == 0x1111) + { + switch (gRecvCmds[2][0]) + { + case 0x8888: + gBerryBlenderData->field_78 = 0x8888; + gBerryBlenderData->field_7A = gRecvCmds[3][0]; + break; + case 0x9999: + gBerryBlenderData->field_78 = 0x9999; + gBerryBlenderData->field_7A = gRecvCmds[3][0]; + break; + case 0xAAAA: + gBerryBlenderData->field_78 = 0xAAAA; + gBerryBlenderData->field_7A = gRecvCmds[3][0]; + break; + } + gBerryBlenderData->field_70[0] = 0x1111; + } + else if (gRecvCmds[1][0] == 0x2222) + gBerryBlenderData->field_70[0] = 0x2222; + } + if (GetMultiplayerId() == 0 && gBerryBlenderData->field_70[0] != 0x1111 && gBerryBlenderData->field_70[0] != 0x2222) + { + u8 i; + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (gRecvCmds[0][i] == 0x2FFF) + { + switch (gRecvCmds[1][i]) + { + case 0x8888: + gBerryBlenderData->field_70[i] = 0x8888; + break; + case 0x7779: + gBerryBlenderData->field_70[i] = 0x7779; + break; + case 0x9999: + gBerryBlenderData->field_70[i] = 0x9999; + break; + case 0xAAAA: + gBerryBlenderData->field_70[i] = 0xAAAA; + break; + } + } + } + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (gBerryBlenderData->field_70[i] == 0) + break; + } + if (i == GetLinkPlayerCount()) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (gBerryBlenderData->field_70[i] != 0x7779) + break; + } + gSendCmd[0] = 0x2FFF; + if (i == GetLinkPlayerCount()) + gSendCmd[1] = 0x2222; + else + { + gSendCmd[1] = 0x1111; + gSendCmd[2] = gBerryBlenderData->field_70[i]; + gSendCmd[3] = i; + } + } + } + } +} + +static void sub_8051414(struct BgAffineDstData *dest) +{ + struct BgAffineSrcData affineSrc; + affineSrc.texX = 30720; + affineSrc.texY = 20480; + affineSrc.scrX = 120 - gBerryBlenderData->field_144; + affineSrc.scrY = 80 - gBerryBlenderData->field_146; + affineSrc.sx = gBerryBlenderData->field_142; + affineSrc.sy = gBerryBlenderData->field_142; + affineSrc.alpha = gBerryBlenderData->arrowPos; + BgAffineSet(&affineSrc, dest, 1); +} + +static void sub_8051474(void) +{ + gBerryBlenderData->field_58 = gBerryBlenderData->arrowPos; + gBerryBlenderData->arrowPos += gBerryBlenderData->field_56; + sub_8051414(&gBerryBlenderData->field_168); +} + +static void sub_80514A4(void) +{ + REG_BG2PA = gBerryBlenderData->field_168.pa; + REG_BG2PB = gBerryBlenderData->field_168.pb; + REG_BG2PC = gBerryBlenderData->field_168.pc; + REG_BG2PD = gBerryBlenderData->field_168.pd; + REG_BG2X = gBerryBlenderData->field_168.dx; + REG_BG2Y = gBerryBlenderData->field_168.dy; +} + +static void sub_80514F0(void) +{ + REG_BG1HOFS = gBerryBlenderData->field_144; + REG_BG1VOFS = gBerryBlenderData->field_146; + REG_BG0HOFS = gBerryBlenderData->field_144; + REG_BG0VOFS = gBerryBlenderData->field_146; +} + +void sub_8051524(struct Sprite* sprite) +{ + sprite->data[2] += sprite->data[0]; + sprite->data[3] += sprite->data[1]; + sprite->pos2.x = sprite->data[2] / 8; + sprite->pos2.y = sprite->data[3] / 8; + if (sprite->animEnded) + DestroySprite(sprite); +} + +static void sub_805156C(void) +{ + s32 limit = (Random() % 2) + 1; + s32 i; + + for (i = 0; i < limit; i++) + { + u16 rand; + s32 x, y; + u8 spriteID; + + rand = gBerryBlenderData->arrowPos + (Random() % 20); + + x = gSineTable[(rand & 0xFF) + 64] / 4; + y = gSineTable[(rand & 0xFF)] / 4; + + spriteID = CreateSprite(&sSpriteTemplate_82164FC, x + 120, y + 80, 1); + gSprites[spriteID].data[0] = 16 - (Random() % 32); + gSprites[spriteID].data[1] = 16 - (Random() % 32); + + gSprites[spriteID].callback = sub_8051524; + } +} + +static void sub_8051650(struct Sprite* sprite) +{ + sprite->data[0]++; + sprite->pos2.y = -(sprite->data[0] / 3); + if (sprite->animEnded) + DestroySprite(sprite); +} + +void sub_8051684(struct Sprite* sprite) +{ + sprite->data[0]++; + sprite->pos2.y = -(sprite->data[0] * 2); + if (sprite->pos2.y < -12) + sprite->pos2.y = -12; + if (sprite->animEnded) + DestroySprite(sprite); +} + +void Blender_SetBankBerryData(u8 bank, u16 itemID) +{ + gBerryBlenderData->chosenItemID[bank] = itemID; + Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[bank], itemID); +} + +void unref_sub_80516F8(u8 taskID) +{ + struct Task* task = &gTasks[taskID]; + if (gReceivedRemoteLinkPlayers) + { + s32 i; + if (GetMultiplayerId() == 0) + { + if (++task->data[0] > 120) + task->data[0] = 0; + if (task->data[0] == 100) + { + Text_EraseWindowRect(&gBerryBlenderData->field_4, 0, 0, 16, 20); + Menu_DrawStdWindowFrame(4, 4, 10, 12); + for (i = 0; i < 3; i++) + { + if (gLinkPlayers[i + 1].trainerId != 0) + Menu_PrintText(gUnknown_08216284[i], 5, (2 * i) + 5); + Menu_DrawStdWindowFrame(0, 13, 29, 19); + Menu_PrintText(gOtherText_PressAToStart, 1, 15); + } + } + if (gMain.newKeys & A_BUTTON) + { + sub_8007E4C(); + DestroyTask(taskID); + } + } + else + { + if (task->data[0] == 10) + Menu_PrintText(gOtherText_PleaseWait, 3, 10); + if (++task->data[0] > 120) + task->data[0] = 0; + if (byte_3002A68 > 4 && gReceivedRemoteLinkPlayers == 1) + DestroyTask(taskID); + } + } +} + +static void sub_805181C(struct Sprite* sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[1] += 8; + if (sprite->data[1] > 88) + { + sprite->data[1] = 88; + sprite->data[0]++; + PlaySE(SE_KON); + } + break; + case 1: + sprite->data[2] += 1; + if (sprite->data[2] > 20) + { + sprite->data[0]++; + sprite->data[2] = 0; + } + break; + case 2: + sprite->data[1] += 4; + if (sprite->data[1] > 176) + { + if (++sprite->data[3] == 3) + { + DestroySprite(sprite); + CreateSprite(&sSpriteTemplate_821657C, 120, -20, 2); + } + else + { + sprite->data[0] = 0; + sprite->data[1] = -16; + StartSpriteAnim(sprite, sprite->data[3]); + } + } + break; + } + sprite->pos2.y = sprite->data[1]; +} + +static void sub_80518CC(struct Sprite* sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[1] += 8; + if (sprite->data[1] > 92) + { + sprite->data[1] = 92; + sprite->data[0]++; + PlaySE(SE_PIN); + } + break; + case 1: + sprite->data[2] += 1; + if (sprite->data[2] > 20) + sprite->data[0]++; + break; + case 2: + sprite->data[1] += 4; + if (sprite->data[1] > 176) + { + gBerryBlenderData->field_0++; + DestroySprite(sprite); + } + break; + } + sprite->pos2.y = sprite->data[1]; +} + +static void sub_805194C(u16 a0, u16 a1) +{ + if (gBerryBlenderData->field_140 < a0) + { + gBerryBlenderData->field_140 += 2; + sub_805197C(gBerryBlenderData->field_140, a1); + } +} + +static void sub_805197C(u16 a0, u16 a1) +{ + s32 var1, var2, var3, var4; + u16* vram; + + vram = (u16*)(VRAM + 0x6000); + var1 = (a0 * 64) / a1; + var2 = var1 / 8; + for (var4 = 0; var4 < var2; var4++) + { + vram[11 + var4] = 0x81E9; + vram[43 + var4] = 0x81F9; + } + var3 = var1 % 8; + if (var3 != 0) + { + vram[11 + var4] = var3 - 32287; + vram[43 + var4] = var3 - 32271; + var4++; + } + for (; var4 < 8; var4++) + { + vram[11 + var4] = 33249; + vram[43 + var4] = 33249 + 16; + } +} + +static u32 sub_8051A1C(u16 a0) +{ + return 360000 * a0 / 0x10000; +} + +static void sub_8051A3C(u16 a0) +{ + u8 i; + u8 palAdders[5]; + + u32 var = sub_8051A1C(a0); + if (gBerryBlenderData->max_RPM < var) + gBerryBlenderData->max_RPM = var; + for (i = 0; i < 5; i++) + { + palAdders[i] = var % 10; + var /= 10; + } + *((u16*)(VRAM + 0x6458)) = palAdders[4] + 0x8172; + *((u16*)(VRAM + 0x645A)) = palAdders[3] + 0x8172; + *((u16*)(VRAM + 0x645C)) = palAdders[2] + 0x8172; + *((u16*)(VRAM + 0x6460)) = palAdders[1] + 0x8172; + *((u16*)(VRAM + 0x6462)) = palAdders[0] + 0x8172; +} + +static void sub_8051AC8(s16* a0, u16 a1) +{ + if (*a0 == 0) + *a0 = (Random() % a1) - (a1 / 2); +} + +static void sub_8051AF4(s16* a0) +{ + if (*a0 < 0 ) + (*a0)++; + if (*a0 > 0 ) + (*a0)--; +} + +static void sub_8051B18(void) +{ + sub_8051AF4(&gBerryBlenderData->field_144); + sub_8051AF4(&gBerryBlenderData->field_146); +} + +static void sub_8051B40(s16* a0, u16 a1) +{ + s32 var; + if (a1 < 10) + var = 16; + else + var = 8; + if (*a0 == 0) + *a0 = (Random() % var) - (var / 2); + else + { + if (*a0 < 0) + (*a0)++; + if (*a0 > 0) + (*a0)--; + } +} + +static bool8 sub_8051B8C(void) +{ + if (gBerryBlenderData->framesToWait == 0) + { + gBerryBlenderData->field_144 = 0; + gBerryBlenderData->field_146 = 0; + } + gBerryBlenderData->framesToWait++; + sub_8051B40(&gBerryBlenderData->field_144, gBerryBlenderData->framesToWait); + sub_8051B40(&gBerryBlenderData->field_146, gBerryBlenderData->framesToWait); + if (gBerryBlenderData->framesToWait == 20) + { + gBerryBlenderData->field_144 = 0; + gBerryBlenderData->field_146 = 0; + return TRUE; + } + else + return FALSE; +} + +static void sub_8051C04(struct Sprite* sprite) +{ + sprite->pos2.x = -(gBerryBlenderData->field_144); + sprite->pos2.y = -(gBerryBlenderData->field_146); +} + +/*static*/ void Blender_TrySettingRecord(void) +{ + if (gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] < gBerryBlenderData->max_RPM) + gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] = gBerryBlenderData->max_RPM; +} + +bool8 Blender_PrintBlendingResults(void) +{ + u16 i; + + struct Pokeblock pokeblock; + u8 flavours[6]; + u8 text[2][10]; + u16 berryIDs[4]; // unused + + switch (gBerryBlenderData->field_0) + { + case 0: + gBerryBlenderData->field_0++; + gBerryBlenderData->framesToWait = 17; + break; + case 1: + gBerryBlenderData->framesToWait -= 10; + if (gBerryBlenderData->framesToWait < 0) + { + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + } + break; + case 2: + if (++gBerryBlenderData->framesToWait > 20) + { + for (i = 0; i < 3; i++) + DestroySprite(&gSprites[gBerryBlenderData->scoreIconIDs[i]]); + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + } + break; + case 3: + { + u8* textPtr; + u16 secondsPassed, minutes, seconds; + + Menu_DrawStdWindowFrame(4, 2, 25, 17); + sub_8072BD8(gOtherText_ResultsOfBlending, 5, 3, 160); + for (i = 0; i < gBerryBlenderData->playersNo; i++) + { + u8 place = gBerryBlenderData->playerPlaces[i]; + textPtr = text[0]; + + StringCopy(textPtr, gBerryBlenderData->blendedBerries[place].name); + ConvertInternationalString(textPtr, gLinkPlayers[place].language); +#ifdef ENGLISH + StringAppend(textPtr, gOtherText_Berry); +#else + de_sub_8073174(textPtr, gOtherText_Berry); +#endif + textPtr = gBerryBlenderData->stringVar; + textPtr = ConvertIntToDecimalString(textPtr, i + 1); + textPtr[0] = CHAR_SPACE; + textPtr[1] = CHAR_PERIOD; + textPtr[2] = CHAR_SPACE; + textPtr += 3; + textPtr = sub_8072C74(textPtr, gLinkPlayers[place].name, 88, 0); + sub_8072C74(textPtr, text[0], 157, 0); + Menu_PrintText(gBerryBlenderData->stringVar, 5, gUnknown_082165E9[gBerryBlenderData->playersNo] + (i * gUnknown_082165EE[gBerryBlenderData->playersNo])); + } + ConvertIntToDecimalStringN(text[0], gBerryBlenderData->max_RPM % 100, 2, 2); + textPtr = gBerryBlenderData->stringVar; + textPtr = StringCopy(textPtr, gOtherText_MaxSpeed); + textPtr = sub_8072C14(textPtr, gBerryBlenderData->max_RPM / 100, 121, 1); + +#ifdef ENGLISH + textPtr[0] = CHAR_SPACE; + textPtr[1] = CHAR_PERIOD; + textPtr[2] = CHAR_SPACE; + textPtr += 3; + textPtr = sub_8072C74(textPtr, text[0], 142, 1); +#else + *textPtr++ = CHAR_COMMA; + textPtr = sub_8072C74(textPtr, text[0], 136, 1); +#endif + StringCopy(textPtr, gOtherText_RPM); + Menu_PrintText(gBerryBlenderData->stringVar, 5, 13); + + secondsPassed = gBerryBlenderData->gameFrameTime / 60; + seconds = secondsPassed % 60; + minutes = secondsPassed / 60; + ConvertIntToDecimalStringN(text[0], minutes, 2, 2); + ConvertIntToDecimalStringN(text[1], seconds, 2, 2); + textPtr = gBerryBlenderData->stringVar; + textPtr = StringCopy(textPtr, gOtherText_RequiredTime); + +#ifdef ENGLISH + textPtr = sub_8072C74(textPtr, text[0], 102, 1); +#else + textPtr = sub_8072C74(textPtr, text[0], 99, 1); +#endif + textPtr = StringAppend(textPtr, gOtherText_Min); + + textPtr = sub_8072C74(textPtr, text[1], 136, 1); + StringCopy(textPtr, gOtherText_Sec); + + Menu_PrintText(gBerryBlenderData->stringVar, 5, 15); + + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + } + break; + case 4: + if (gMain.newKeys & A_BUTTON) + gBerryBlenderData->field_0++; + break; + case 5: + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 14, 29, 19); + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) + { + if (gBerryBlenderData->chosenItemID[i] != 0) + berryIDs[i] = gBerryBlenderData->chosenItemID[i] - 133; + } + sub_8050760(); + Blender_CalculatePokeblock(gBerryBlenderData->blendedBerries, &pokeblock, gBerryBlenderData->playersNo, flavours, gBerryBlenderData->max_RPM); + Blender_PrintMadePokeblockString(&pokeblock, gBerryBlenderData->stringVar); + CreateTask(sub_8052BD0, 6); +#if DEBUG + ConvertIntToHexStringN(text[0], sub_8007E40(), 0, 4); + StringAppend(text[0], gUnknown_08216249); + StringAppend(gBerryBlenderData->stringVar, text[0]); +#endif + MenuPrintMessage(gBerryBlenderData->stringVar, 1, 15); + RemoveBagItem(gSpecialVar_ItemId, 1); + sub_810CA34(&pokeblock); + gBerryBlenderData->field_0++; + break; + case 6: + if (Menu_UpdateWindowText()) + { + Blender_TrySettingRecord(); + return TRUE; + } + break; + } + return FALSE; +} + +static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) +{ + u8 text[12]; + u8 flavourLvl, feel; + + dst[0] = EOS; + StringCopy(dst, gPokeblockNames[pokeblock->color]); +#ifdef ENGLISH + StringAppend(dst, gOtherText_PokeBlockMade); +#else + de_sub_8073174(dst, gOtherText_PokeBlockMade); +#endif + StringAppend(dst, sNewLineString_0); + + flavourLvl = sub_810C9B0(pokeblock); + feel = sub_810C9E8(pokeblock); + + StringAppend(dst, gOtherText_BlockLevelIs); + ConvertIntToDecimalStringN(text, flavourLvl, 0, 3); + StringAppend(dst, text); + + StringAppend(dst, gOtherText_BlockFeelIs); + ConvertIntToDecimalStringN(text, feel, 0, 3); + StringAppend(dst, text); + + StringAppend(dst, gOtherText_Period); + StringAppend(dst, gUnknown_08216249); +} + +static void Blender_SortBasedOnPoints(u8* places, u8 playersNum, u32* scores) +{ + s32 i, j; + for (i = 0; i < playersNum; i++) + { + for (j = 0; j < playersNum; j++) + { + if (scores[places[i]] > scores[places[j]]) + { + u8 temp = places[i]; + places[i] = places[j]; + places[j] = temp; + } + } + } +} + +static void Blender_SortScores(void) +{ + u8 i; + u8 places[4]; + u32 points[4]; + + for (i = 0; i < gBerryBlenderData->playersNo; i++) + places[i] = i; + for (i = 0; i < gBerryBlenderData->playersNo; i++) + { + points[i] = 1000000 * gBerryBlenderData->scores[i][BLENDER_SCORE_BEST]; + points[i] += 1000 * gBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]; + points[i] += 1000 - gBerryBlenderData->scores[i][BLENDER_SCORE_MISS]; + } + Blender_SortBasedOnPoints(places, gBerryBlenderData->playersNo, points); + for (i = 0; i < gBerryBlenderData->playersNo; i++) + gBerryBlenderData->playerPlaces[i] = places[i]; +} + +static bool8 Blender_PrintBlendingRanking(void) +{ + u16 i; + switch (gBerryBlenderData->field_0) + { + case 0: + gBerryBlenderData->field_0++; + gBerryBlenderData->framesToWait = 255; + break; + case 1: + gBerryBlenderData->framesToWait -= 10; + if (gBerryBlenderData->framesToWait < 0) + { + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + } + break; + case 2: + if (++gBerryBlenderData->framesToWait > 20) + { + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + } + break; + case 3: + Menu_DrawStdWindowFrame(4, 2, 25, 17); + sub_8072BD8(gOtherText_Ranking, 5, 3, 160); + + gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST] = CreateSprite(&sSpriteTemplate_821645C, 140, 52, 0); + gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST]].callback = SpriteCallbackDummy; + StartSpriteAnim(&gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST]], 3); + + gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_GOOD] = CreateSprite(&sSpriteTemplate_821645C, 164, 52, 0); + gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_GOOD]].callback = SpriteCallbackDummy; + + gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS] = CreateSprite(&sSpriteTemplate_821645C, 188, 52, 0); + gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS]].callback = SpriteCallbackDummy; + StartSpriteAnim(&gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS]], 1); + + Blender_SortScores(); + + for (i = 0; i < gBerryBlenderData->playersNo; i++) + { + u8 place = gBerryBlenderData->playerPlaces[i]; + u8* txtPtr = gBerryBlenderData->stringVar; + + txtPtr[0] = EXT_CTRL_CODE_BEGIN; + txtPtr[1] = 0x13; + txtPtr[2] = 4; + txtPtr += 3; + + txtPtr = ConvertIntToDecimalString(txtPtr, i + 1); + + txtPtr[0] = CHAR_SPACE; + txtPtr[1] = CHAR_PERIOD; + txtPtr[2] = CHAR_SPACE; + txtPtr += 3; + + txtPtr = StringCopy(txtPtr, gLinkPlayers[place].name); + + txtPtr = sub_8072C14(txtPtr, gBerryBlenderData->scores[place][BLENDER_SCORE_BEST], 108, 1); + txtPtr = sub_8072C14(txtPtr, gBerryBlenderData->scores[place][BLENDER_SCORE_GOOD], 132, 1); + txtPtr = sub_8072C14(txtPtr, gBerryBlenderData->scores[place][BLENDER_SCORE_MISS], 156, 1); + + Menu_PrintText(gBerryBlenderData->stringVar, 5, i * gUnknown_082165F3[gBerryBlenderData->playersNo] + 8); + } + gBerryBlenderData->framesToWait = 0; + gBerryBlenderData->field_0++; + break; + case 4: + if (++gBerryBlenderData->framesToWait > 20) + gBerryBlenderData->field_0++; + break; + case 5: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gBerryBlenderData->field_0++; + } + break; + case 6: + gBerryBlenderData->field_0 = 0; + return TRUE; + } + return FALSE; +} + +// debug menu goes here + +void unref_sub_80524BC(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB1_BerryBlender); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + SeedRng(gMain.vblankCounter1); + REG_DISPCNT = 0x1540; + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + sBlenderDebug.BPM = 8000; + sBlenderDebug.field_10++; + SetMainCallback2(sub_8052AF8); +} + +static void BlenderDebug_PrintBerryData(void) +{ + u8 text[128]; + u8 i; + + StringCopy(text, sText_BPM); + Menu_PrintText(text, 2, 0); + + ConvertIntToDecimalStringN(text, sBlenderDebug.BPM / 100, 2, 3); + Menu_PrintText(text, 6, 0); + + for (i = 0; i < 4; i++) + { + u8 var; + + if (sBlenderDebug.cursorPos == i) + { + text[0] = 0xEF; + CopyItemName(sBlenderDebug.berries[i] + 133, &text[1]); + } + else + { + CopyItemName(sBlenderDebug.berries[i] + 133, &text[0]); + text[6] = CHAR_SPACE; + text[7] = EOS; + } + var = (i * 3) + 3; + Menu_PrintText(text, 2, var); + + ConvertIntToDecimalStringN(&text[0], gBerries[sBlenderDebug.berries[i]].spicy, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToDecimalStringN(&text[3], gBerries[sBlenderDebug.berries[i]].dry, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToDecimalStringN(&text[6], gBerries[sBlenderDebug.berries[i]].sweet, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToDecimalStringN(&text[9], gBerries[sBlenderDebug.berries[i]].bitter, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToDecimalStringN(&text[12], gBerries[sBlenderDebug.berries[i]].sour, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToDecimalStringN(&text[15], gBerries[sBlenderDebug.berries[i]].smoothness, 2, 2); + + text[17] = EOS; + Menu_PrintText(text, 7, var); + } + if (sBlenderDebug.pokeblock.color != 0) + { + StringCopy(text, gPokeblockNames[sBlenderDebug.pokeblock.color]); + Menu_PrintText(text, 2, 15); + + ConvertIntToHexStringN(&text[0], sBlenderDebug.spicy, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToHexStringN(&text[3], sBlenderDebug.dry, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToHexStringN(&text[6], sBlenderDebug.sweet, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToHexStringN(&text[9], sBlenderDebug.bitter, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToHexStringN(&text[12], sBlenderDebug.sour, 2, 2); + StringAppend(text, sText_Space); + + ConvertIntToHexStringN(&text[15], sBlenderDebug.feel, 2, 2); + + text[17] = EOS; + Menu_PrintText(text, 7, 17); + } +} + +static void sub_80527BC(void) +{ + u8 text[70]; + u8 buffer[10]; + u16 i; + + if (gUnknown_020297DC == 1) + { + u16 j; + for (j = 0; j < 10; j++) + gUnknown_03004840[j] = 0; + gUnknown_03004830 = Random(); + gUnknown_020297E0 = 0; + gUnknown_020297DC = 2; + for (i = 0; i < 200; i++) + gSharedMem[i] = 0; + gUnknown_020297E8 = 0; + } + for (i = 0; i < 100; i++) + { + if (((Random() >> 15) & 1) == gUnknown_020297E8) + gUnknown_020297E0++; + else + { + u16* ewramPtr = ((u16*)(gSharedMem)); + ewramPtr[gUnknown_020297E4] = gUnknown_020297E0; + gUnknown_020297E4++; + gUnknown_020297E0 = 0; + gUnknown_020297E8 ^= 1; + } + } + text[0] = EOS; + + ConvertIntToHexStringN(buffer, gUnknown_03004830, 2, 8); + StringAppend(text, buffer); + StringAppend(text, sText_Space); + + ConvertIntToHexStringN(buffer, gUnknown_020297E0, 2, 8); + StringAppend(text, buffer); + StringAppend(text, sNewLineString_1); + + if (gUnknown_020297DC == 3) + { + ConvertIntToHexStringN(buffer, gUnknown_020297E4, 2, 16); + StringAppend(text, buffer); + gUnknown_020297DC = 0; + } + + Menu_PrintText(text, 2, 15); +} + +static void sub_8052918(void) +{ + if (gMain.newKeys & R_BUTTON) + { + sBlenderDebug.BPM += 1000; + if (sBlenderDebug.BPM > 30000) + sBlenderDebug.BPM = 1000; + sBlenderDebug.field_10++; + } + if (gMain.newKeys & L_BUTTON) + { + sBlenderDebug.BPM -= 1000; + if (sBlenderDebug.BPM < 0) + sBlenderDebug.BPM = 30000; + sBlenderDebug.field_10++; + } + if (gMain.newKeys & DPAD_UP) + { + sBlenderDebug.cursorPos -= 1; + if (sBlenderDebug.cursorPos < 0) + sBlenderDebug.cursorPos = 3; + sBlenderDebug.field_10++; + } + if (gMain.newKeys & DPAD_DOWN) + { + sBlenderDebug.cursorPos += 1; + if (sBlenderDebug.cursorPos > 3) + sBlenderDebug.cursorPos = 0; + sBlenderDebug.field_10++; + } + if (gMain.newKeys & DPAD_LEFT) + { + if (--sBlenderDebug.berries[sBlenderDebug.cursorPos] < 0) + sBlenderDebug.berries[sBlenderDebug.cursorPos] = 42; + sBlenderDebug.field_10++; + } + if (gMain.newKeys & DPAD_RIGHT) + { + if (++sBlenderDebug.berries[sBlenderDebug.cursorPos] > 42) + sBlenderDebug.berries[sBlenderDebug.cursorPos] = 0; + sBlenderDebug.field_10++; + } + if (gMain.newKeys & A_BUTTON) + { + u16 berryIDs[4]; + struct BlenderBerry berries[4]; + + u16 i, notEnigma = 0; + for (i = 0; i < 4; i++) + { + if (sBlenderDebug.berries[i] != 42) + { + notEnigma++; + berryIDs[i] = sBlenderDebug.berries[i]; + Blender_CopyBerryData(&berries[i], sBlenderDebug.berries[i] + 133); + } + else + break; + } + if (notEnigma > 1) + { + BlenderDebug_CalculatePokeblock(berries, &sBlenderDebug.pokeblock, notEnigma, &sBlenderDebug.spicy, sBlenderDebug.BPM); + sBlenderDebug.field_10++; + } + else + sBlenderDebug.pokeblock.color = 0xFF; + } + if (sBlenderDebug.field_10) + { + BlenderDebug_PrintBerryData(); + sBlenderDebug.field_10 = 0; + } + if (gMain.newKeys & SELECT_BUTTON && gUnknown_020297DC == 0) + { + gUnknown_020297DC++; + gUnknown_020297E0 = 0; + SeedRng(gMain.vblankCounter1); + } + if (gUnknown_020297DC != 0) + sub_80527BC(); +} + +static void sub_8052AF8(void) +{ + sub_8052918(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +// debug menu ends +// blender record window begins + +void ShowBerryBlenderRecordWindow(void) +{ + u8 text[30]; + s32 i; + + Menu_DrawStdWindowFrame(6, 3, 23, 16); + Menu_PrintText(gMultiText_BerryBlenderMaxSpeedRecord, 8, 4); + Menu_PrintText(gMultiText_2P3P4P, 8, 9); + + for (i = 0; i < 3; i++) + { + u32 record = gSaveBlock1.berryBlenderRecords[i]; + u8* txtPtr = sub_8072C14(text, record / 100, 18, 1); + +#ifdef ENGLISH + txtPtr[0] = CHAR_SPACE; + txtPtr[1] = CHAR_PERIOD; + txtPtr[2] = CHAR_SPACE; + txtPtr += 3; +#else + *txtPtr++ = CHAR_COMMA; +#endif + + txtPtr = ConvertIntToDecimalStringN(txtPtr, record % 100, 2, 2); + StringAppend(txtPtr, gOtherText_RPM); + Menu_PrintText(text, 15, i * 2 + 9); + } +} + +static void sub_8052BD0(u8 taskID) +{ + if (gTasks[taskID].data[0] == 0) + { + PlayFanfare(BGM_FANFA1); + gTasks[taskID].data[0]++; + } + if (IsFanfareTaskInactive()) + { + PlayBGM(gBerryBlenderData->field_178); + DestroyTask(taskID); + } +} diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c new file mode 100644 index 000000000..9fbfd0681 --- /dev/null +++ b/src/berry_tag_screen.c @@ -0,0 +1,453 @@ +#include "global.h" +#include "berry_tag_screen.h" +#include "berry.h" +#include "decompress.h" +#include "event_object_movement.h" +#include "item_menu.h" +#include "constants/items.h" +#include "item_use.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "palette.h" +#include "overworld.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" + +#define OFFSET_7B (123) +#define FIRST_BERRY ITEM_CHERI_BERRY + +struct Struct2000000 +{ + /*0x00*/ u8 filler_0[0x1FFFF]; + /*0x1FFFF*/ u8 var_1FFFF; +}; + +extern struct Struct2000000 gSharedMem; +extern u16 gBattle_BG1_Y; + +static EWRAM_DATA u8 gUnknown_0203932C = 0; +static EWRAM_DATA s16 gUnknown_0203932E[5] = {0}; + +extern const struct CompressedSpriteSheet gUnknown_083C1F74; +extern const struct CompressedSpritePalette gUnknown_083C1F7C; + +extern u8 gBerryCheck_Gfx[]; +extern u8 gBerryCheck_Pal[]; +extern u8 gUnknown_08E788E4[]; +extern u8 gUnknown_08E78A84[]; + +const u8 *const gUnknown_0841192C[] = +{ + ContestStatsText_VerySoft, + ContestStatsText_Soft, + ContestStatsText_Hard, + ContestStatsText_VeryHard, + ContestStatsText_SuperHard, +}; + +static void sub_8146014(void); +static void sub_814602C(void); +static bool8 sub_8146058(void); +static void sub_8146288(void); +static bool8 sub_81462B8(void); +static void sub_814640C(u8 taskId); +static void sub_8146440(u8 taskId); +static void sub_8146480(u8 taskid); +static void sub_81464E4(void); +static void sub_8146600(u8 berry); +static void sub_81466A0(void); +static void sub_81466E8(u8 taskId, s8 direction); +static void sub_8146798(u8 berry); +static void sub_8146810(s8 berry); +static void sub_81468BC(void); + +static void sub_8146014(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); +} + +static void sub_814602C(void) +{ + REG_BG0VOFS = gBattle_BG1_Y; + REG_BG1VOFS = gBattle_BG1_Y; + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static bool8 sub_8146058(void) +{ + u8 berry; + u16 backup; + + switch (gMain.state) + { + case 0: + ClearVideoCallbacks(); + sub_80F9368(); + sub_8146288(); + REG_BLDCNT = 0; + gMain.state += 1; + break; + case 1: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = 1; + gMain.state += 1; + break; + case 2: + ResetSpriteData(); + gMain.state += 1; + break; + case 3: + Text_LoadWindowTemplate(&gWindowTemplate_81E6E18); + gMain.state += 1; + break; + case 4: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E18); + gMain.state += 1; + break; + case 5: + if (!MultistepInitMenuWindowContinue()) + break; + gSharedMem.var_1FFFF = 0; + gMain.state += 1; + break; + case 6: + if (!sub_81462B8()) + break; + gSharedMem.var_1FFFF = 0; + gMain.state += 1; + break; + case 7: + sub_81464E4(); + gMain.state += 1; + break; + case 8: + berry = gSpecialVar_ItemId + OFFSET_7B; + gUnknown_0203932C = CreateBerrySprite(berry, 56, 64); + gMain.state += 1; + break; + case 9: + sub_8146600(gSpecialVar_ItemId + OFFSET_7B); + gMain.state += 1; + break; + case 10: + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = backup; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(sub_814602C); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; + gMain.state += 1; + break; + case 11: + if (sub_8055870() == TRUE) + break; + gMain.state += 1; + break; + case 12: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + SetMainCallback2(sub_8146014); + return TRUE; + } + + return FALSE; +} + +void BerryTagScreen_814625C(u8 taskId) +{ + do + { + if (sub_8146058() == TRUE) + { + CreateTask(sub_8146480, 0); + return; + } + } while (sub_80F9344() != TRUE); +} + +static void sub_8146288(void) +{ + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + gBattle_BG1_Y = 0; +} + +bool8 sub_81462B8(void) +{ + u16 i; + + switch (gSharedMem.var_1FFFF) + { + case 0: + LZDecompressVram(gBerryCheck_Gfx, (void *)VRAM); + gSharedMem.var_1FFFF += 1; + break; + case 1: + LZDecompressVram(gUnknown_08E788E4, (void *)VRAM + 0x2800); + gSharedMem.var_1FFFF += 1; + break; + case 2: + LZDecompressVram(gUnknown_08E78A84, (void *)VRAM + 0x3000); + gSharedMem.var_1FFFF += 1; + break; + case 3: + for (i = 0; i < 0x400; i++) + { + if (gSaveBlock2.playerGender == MALE) + gBGTilemapBuffers[2][i] = 0x4042; + else + gBGTilemapBuffers[2][i] = 0x5042; + } + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x3800), 0x800); + gSharedMem.var_1FFFF += 1; + break; + case 4: + LoadCompressedPalette(gBerryCheck_Pal, 0, 96 * 2); + gSharedMem.var_1FFFF += 1; + break; + case 5: + LoadCompressedObjectPic(&gUnknown_083C1F74); + gSharedMem.var_1FFFF += 1; + break; + case 6: + LoadCompressedObjectPalette(&gUnknown_083C1F7C); + gSharedMem.var_1FFFF = 0; + return TRUE; + } + + return FALSE; +} + +static void sub_814640C(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sub_80A5B40); + sub_80A7DD4(); + gpu_pal_allocator_reset__manage_upper_four(); + DestroyTask(taskId); + } +} + +static void sub_8146440(u8 taskId) +{ + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = sub_814640C; +} + +static void sub_8146480(u8 taskid) +{ + if (!gPaletteFade.active) + { + if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_UP) + sub_81466E8(taskid, -1); + if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_DOWN) + sub_81466E8(taskid, 1); + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + sub_8146440(taskid); + } +} + +static void sub_81464E4(void) +{ + const struct Berry *berryInfo; +#ifdef UNITS_IMPERIAL + u32 size; + s32 sizeMajor; + s32 sizeMinor; +#endif +#if GERMAN + u8 buffer[16]; +#endif + + berryInfo = GetBerryInfo(gSpecialVar_ItemId + OFFSET_7B + 1); + + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_ItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2); + Menu_PrintText(gStringVar1, 12, 4); + +#if ENGLISH + Menu_PrintText(berryInfo->name, 14, 4); +#elif GERMAN + StringCopy(buffer, berryInfo->name); + StringAppend(buffer, gOtherText_Berry2); + Menu_PrintText(buffer, 14, 4); +#endif + + Menu_PrintText(berryInfo->description1, 4, 14); + Menu_PrintText(berryInfo->description2, 4, 16); + +#ifdef UNITS_IMPERIAL + size = (berryInfo->size * 1000) / 254; + if (size % 10 >= 5) + size += 10; + sizeMinor = (size % 100) / 10; + sizeMajor = size / 100; +#endif + + Menu_PrintText(gOtherText_Size, 11, 7); + if (berryInfo->size != 0) + { +#ifdef UNITS_IMPERIAL + ConvertIntToDecimalStringN(gStringVar1, sizeMajor, STR_CONV_MODE_LEFT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar2, sizeMinor, STR_CONV_MODE_LEFT_ALIGN, 2); +#else + ConvertIntToDecimalStringN(gStringVar1, berryInfo->size / 10, STR_CONV_MODE_LEFT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar2, berryInfo->size % 10, STR_CONV_MODE_LEFT_ALIGN, 2); +#endif + Menu_PrintText(gContestStatsText_Unknown1, 16, 7); + } + else + { + Menu_PrintText(gOtherText_ThreeQuestions2, 16, 7); + } + + Menu_PrintText(gOtherText_Firm, 11, 9); + if (berryInfo->firmness != 0) + Menu_PrintText(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9); + else + Menu_PrintText(gOtherText_ThreeQuestions2, 16, 9); +} + +static void sub_8146600(u8 berry) +{ + const struct Berry *berryInfo; + u16 i; + + berryInfo = GetBerryInfo(berry + 1); + for (i = 0; i < 5; i++) + gUnknown_0203932E[i] = (u16)gUnknown_0203932E[i] | 0xFFFF; + + // argument is the center of the circle + if (berryInfo->spicy) + gUnknown_0203932E[0] = sub_80A7E5C(48); + if (berryInfo->dry) + gUnknown_0203932E[1] = sub_80A7E5C(88); + if (berryInfo->sweet) + gUnknown_0203932E[2] = sub_80A7E5C(128); + if (berryInfo->bitter) + gUnknown_0203932E[3] = sub_80A7E5C(168); + if (berryInfo->sour) + gUnknown_0203932E[4] = sub_80A7E5C(208); +} + +static void sub_81466A0(void) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (gUnknown_0203932E[i] != -1) + { + DestroySprite(&gSprites[gUnknown_0203932E[i]]); + gUnknown_0203932E[i] = -1; + } + } +} + +static void sub_81466E8(u8 taskId, s8 direction) +{ + u8 berryPocket = 3; + s16 *data = gTasks[taskId].data; + + if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos == 0 + && direction < 0) + return; + if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + 1 == gBagPocketScrollStates[berryPocket].numSlots + && direction > 0) + return; + + PlaySE(SE_SELECT); + if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + direction < 0) + data[1] = -(gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos); + else if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + direction >= gBagPocketScrollStates[berryPocket].numSlots) + data[1] = gBagPocketScrollStates[berryPocket].numSlots - gBagPocketScrollStates[berryPocket].scrollTop - gBagPocketScrollStates[berryPocket].cursorPos - 1; + else + data[1] = direction; + + gTasks[taskId].func = sub_8146798; + + if (direction < 0) + data[0] = -16; + else + data[0] = 16; + +} + +static void sub_8146798(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + gBattle_BG1_Y = (gBattle_BG1_Y + taskData[0]) & 0xFF; + if ((taskData[0] > 0 && gBattle_BG1_Y == 144) + || (taskData[0] < 0 && gBattle_BG1_Y == 112)) + { + sub_8146810(gTasks[taskId].data[1]); + sub_81468BC(); + } + if (gBattle_BG1_Y == 0) + { + gTasks[taskId].data[0] = gBattle_BG1_Y; + gTasks[taskId].data[1] = gBattle_BG1_Y; + gTasks[taskId].func = sub_8146480; + } +} + +static void sub_8146810(s8 berry) +{ + u8 berryPocket = 3; + + if (berry > 0) + { + if (gBagPocketScrollStates[berryPocket].cursorPos + berry > 7) + { + gBagPocketScrollStates[berryPocket].scrollTop += gBagPocketScrollStates[berryPocket].cursorPos - 7 + berry; + gBagPocketScrollStates[berryPocket].cursorPos = 7; + } + else + { + gBagPocketScrollStates[berryPocket].cursorPos += berry; + } + } + else + { + if (gBagPocketScrollStates[berryPocket].cursorPos + berry < 0) + { + gBagPocketScrollStates[berryPocket].scrollTop += gBagPocketScrollStates[berryPocket].cursorPos + berry; + gBagPocketScrollStates[berryPocket].cursorPos = 0; + } + else + { + gBagPocketScrollStates[berryPocket].cursorPos += berry; + } + } + gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos].itemId; + DestroySprite(&gSprites[gUnknown_0203932C]); + sub_81466A0(); + sub_80A7DD4(); +} + +static void sub_81468BC(void) +{ + Menu_EraseWindowRect(0, 4, 29, 19); + sub_81464E4(); + + // center of berry sprite + gUnknown_0203932C = CreateBerrySprite(gSpecialVar_ItemId + OFFSET_7B, 56, 64); + + sub_8146600(gSpecialVar_ItemId + OFFSET_7B); +} diff --git a/src/bike.c b/src/bike.c new file mode 100644 index 000000000..28439e6bb --- /dev/null +++ b/src/bike.c @@ -0,0 +1,1071 @@ +#include "global.h" +#include "bike.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "constants/flags.h" +#include "global.fieldmap.h" +#include "metatile_behavior.h" +#include "overworld.h" +#include "constants/songs.h" +#include "sound.h" + +extern bool8 gBikeCyclingChallenge; +extern u8 gBikeCollisions; +extern u8 gUnusedBikeCameraAheadPanback; + +#if DEBUG +extern u8 gUnknown_020297ED; +u8 debug_sub_805F2B0(u8); +#endif + +static void MovePlayerOnMachBike(u8, u16, u16); +static u8 GetMachBikeTransition(u8 *); +static void MachBikeTransition_FaceDirection(u8); +static void MachBikeTransition_TurnDirection(u8); +static void MachBikeTransition_TrySpeedUp(u8); +static void MachBikeTransition_TrySlowDown(u8); +static void MovePlayerOnAcroBike(u8, u16, u16); +static u8 CheckMovementInputAcroBike(u8 *, u16, u16); +static u8 AcroBikeHandleInputNormal(u8 *, u16, u16); +static u8 AcroBikeHandleInputTurning(u8 *, u16, u16); +static u8 AcroBikeHandleInputWheelieStanding(u8 *, u16, u16); +static u8 AcroBikeHandleInputBunnyHop(u8 *, u16, u16); +static u8 AcroBikeHandleInputWheelieMoving(u8 *, u16, u16); +static u8 AcroBikeHandleInputSidewaysJump(u8 *, u16, u16); +static u8 AcroBikeHandleInputTurnJump(u8 *, u16, u16); +static void AcroBikeTransition_FaceDirection(u8); +static void AcroBikeTransition_TurnDirection(u8); +static void AcroBikeTransition_Moving(u8); +static void AcroBikeTransition_NormalToWheelie(u8); +static void AcroBikeTransition_WheelieToNormal(u8); +static void AcroBikeTransition_WheelieIdle(u8); +static void AcroBikeTransition_WheelieHoppingStanding(u8); +static void AcroBikeTransition_WheelieHoppingMoving(u8); +static void AcroBikeTransition_SideJump(u8); +static void AcroBikeTransition_TurnJump(u8); +static void AcroBikeTransition_WheelieMoving(u8); +static void AcroBikeTransition_WheelieRisingMoving(u8); +static void AcroBikeTransition_WheelieLoweringMoving(u8); +static void AcroBike_TryHistoryUpdate(u16, u16); +static u8 AcroBike_GetJumpDirection(void); +static void Bike_UpdateDirTimerHistory(u8); +static void Bike_UpdateABStartSelectHistory(u8); +static u8 Bike_DPadToDirection(u16); +static u8 get_some_collision(u8); +static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct MapObject *, s16, s16, u8, u8); +static bool8 IsRunningDisallowedByMetatile(u8); +static void Bike_TryAdvanceCyclingRoadCollisions(); +static u8 CanBikeFaceDirOnMetatile(u8, u8); +static bool8 WillPlayerCollideWithCollision(u8, u8); +static void Bike_SetBikeStill(void); + +/* + A bike transition is a type of callback for the bike that actually + modifies the bicycle's direction or momentum or otherwise movement. + Alternatively, a bike may also have input handlers which process the + bike transition to call: the acro bike has input handlers while the mach + bike does not. This is because the Acro needs to know the button inputs + for its complex tricks and actions. +*/ + +static void (*const sMachBikeTransitions[])(u8) = +{ + MachBikeTransition_FaceDirection, // Face vs Turn: Face has no anim while Turn does. Turn checks for collision because if you turn right as opposed to face right, if there is a wall there, turn will make a bonk sound effect while face will not. + MachBikeTransition_TurnDirection, + MachBikeTransition_TrySpeedUp, + MachBikeTransition_TrySlowDown, +}; + +// bikeFrameCounter is input which is represented by gMachBikeSpeeds in order: 0 is normal speed (1 speed), 1 is fast speed (2 speed), 2 is fastest speed (4 speed) +static void (*const sMachBikeSpeedCallbacks[])(u8) = +{ + PlayerGoSpeed1, // normal speed (1 speed) + PlayerGoSpeed2, // fast speed (2 speed) + PlayerGoSpeed4, // fastest speed (4 speed) +}; + +static void (*const sAcroBikeTransitions[])(u8) = +{ + AcroBikeTransition_FaceDirection, + AcroBikeTransition_TurnDirection, + AcroBikeTransition_Moving, + AcroBikeTransition_NormalToWheelie, + AcroBikeTransition_WheelieToNormal, + AcroBikeTransition_WheelieIdle, + AcroBikeTransition_WheelieHoppingStanding, + AcroBikeTransition_WheelieHoppingMoving, + AcroBikeTransition_SideJump, + AcroBikeTransition_TurnJump, + AcroBikeTransition_WheelieMoving, + AcroBikeTransition_WheelieRisingMoving, + AcroBikeTransition_WheelieLoweringMoving, +}; + +static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) = +{ + AcroBikeHandleInputNormal, + AcroBikeHandleInputTurning, + AcroBikeHandleInputWheelieStanding, + AcroBikeHandleInputBunnyHop, + AcroBikeHandleInputWheelieMoving, + AcroBikeHandleInputSidewaysJump, + AcroBikeHandleInputTurnJump, +}; + +// used with bikeFrameCounter from mach bike +const u16 gMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST}; + +// this is a list of timers to compare against later, terminated with 0. the only timer being compared against is 4 frames in this list. +static const u8 AcroBikeJumpTimerList[] = {4, 0}; + +// this is a list of history inputs to do in order to do the check to retrieve a jump direction for acro bike. it seems to be an extensible list, so its possible that Game Freak may have intended for the Acro Bike to have more complex tricks at some point. The final list only has the acro jump. +static const struct BikeHistoryInputInfo gAcroBikeTricksList[] = +{ + // the 0xF is a mask performed with each byte of the array in order to perform the check on only the last entry of the history list, otherwise the check wouldnt work as there can be 0xF0 as opposed to 0x0F. + {DIR_SOUTH, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_SOUTH}, + {DIR_NORTH, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_NORTH}, + {DIR_WEST, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_WEST}, + {DIR_EAST, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_EAST}, +}; + +void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) +{ + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + MovePlayerOnMachBike(direction, newKeys, heldKeys); + else + MovePlayerOnAcroBike(direction, newKeys, heldKeys); +} + +static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) +{ +#if DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(direction)) + { + Bike_SetBikeStill(); + return; + } +#endif + sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); +} + +// dirTraveling is a variable that is 0 when the player is standing still. +static u8 GetMachBikeTransition(u8 *dirTraveling) +{ + // if the dir updated before this function, get the relevent new direction to check later. + u8 direction = player_get_direction_upper_nybble(); + + // is the player standing still? + if (*dirTraveling == 0) + { + *dirTraveling = direction; // update the direction, since below we either faced a direction or we started moving. + if (gPlayerAvatar.bikeSpeed == SPEED_STANDING) + { + gPlayerAvatar.runningState = NOT_MOVING; + return MACH_TRANS_FACE_DIRECTION; + } + gPlayerAvatar.runningState = MOVING; + return MACH_TRANS_START_MOVING; + } + + // we need to check if the last traveled direction changed from the new direction as well as ensuring that we dont update the state while the player is moving: see the else check. + if (*dirTraveling != direction && gPlayerAvatar.runningState != MOVING) + { + if (gPlayerAvatar.bikeSpeed != SPEED_STANDING) + { + *dirTraveling = direction; // implement the new direction + gPlayerAvatar.runningState = MOVING; + return MACH_TRANS_START_MOVING; + } + // if you didnt start moving but your dir was different, do a turn direction instead. + gPlayerAvatar.runningState = TURN_DIRECTION; + return MACH_TRANS_TURN_DIRECTION; + } + else // the player is either going in the current direction and hasnt changed or their state is currently moving. + { + gPlayerAvatar.runningState = MOVING; + return MACH_TRANS_KEEP_MOVING; + } +} + +// the difference between face direction and turn direction is that one changes direction while the other does the animation of turning as well as changing direction. +static void MachBikeTransition_FaceDirection(u8 direction) +{ + PlayerFaceDirection(direction); + Bike_SetBikeStill(); +} + +static void MachBikeTransition_TurnDirection(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E)) + { + PlayerTurnInPlace(direction); + Bike_SetBikeStill(); + } + else + { + MachBikeTransition_FaceDirection(playerMapObj->mapobj_unk_18); + } +} + +static void MachBikeTransition_TrySpeedUp(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + u8 collision; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == FALSE) + { + // we cannot go forward, so either slow down or, if we are stopped, idle face direction. + if (gPlayerAvatar.bikeSpeed) + MachBikeTransition_TrySlowDown(playerMapObj->placeholder18); + else + MachBikeTransition_FaceDirection(playerMapObj->placeholder18); + } + else + { + collision = get_some_collision(direction); + if (collision > 0 && collision < 12) + { + // we hit a solid object, but check to see if its a ledge and then jump. + if (collision == COLLISION_LEDGE_JUMP) + { + PlayerJumpLedge(direction); + } + else + { + // we hit a solid object that is not a ledge, so perform the collision. + Bike_SetBikeStill(); + if (collision < 5 || collision > 8) + PlayerOnBikeCollide(direction); + } + } + else + { + // we did not hit anything that can slow us down, so perform the advancement callback depending on the bikeFrameCounter and try to increase the mach bike's speed. + sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](direction); + gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1 + if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array + gPlayerAvatar.bikeFrameCounter++; + } + } +} + +static void MachBikeTransition_TrySlowDown(u8 var) +{ + u8 collision; + + if (gPlayerAvatar.bikeSpeed != SPEED_STANDING) + gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.bikeSpeed; + + collision = get_some_collision(var); + + if (collision > 0 && collision < 12) + { + if (collision == COLLISION_LEDGE_JUMP) + { + PlayerJumpLedge(var); + } + else + { + Bike_SetBikeStill(); + if (collision < 5 || collision > 8) + PlayerOnBikeCollide(var); + } + } + else + { + sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](var); + } +} + +// the acro bike requires the input handler to be executed before the transition can. +static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) +{ +#if DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(newDirection)) + { + Bike_SetBikeStill(); + return; + } +#endif + + sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); +} + +static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + return sAcroBikeInputHandlers[gPlayerAvatar.acroBikeState](newDirection, newKeys, heldKeys); +} + +static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction = player_get_direction_upper_nybble(); + + gPlayerAvatar.bikeFrameCounter = 0; + if (*newDirection == DIR_NONE) + { + if (newKeys & B_BUTTON) + { + //We're standing still with the B button held. + //Do a wheelie. + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return ACRO_TRANS_NORMAL_TO_WHEELIE; + } + else + { + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_FACE_DIRECTION; + } + } + if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.bikeSpeed == SPEED_STANDING) + { + gPlayerAvatar.bikeSpeed++; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; + return ACRO_TRANS_WHEELIE_RISING_MOVING; + } + if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING; + gPlayerAvatar.newDirBackup = *newDirection; + gPlayerAvatar.runningState = NOT_MOVING; + return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); + } + gPlayerAvatar.runningState = MOVING; + return ACRO_TRANS_MOVING; +} + +static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + + *newDirection = gPlayerAvatar.newDirBackup; + gPlayerAvatar.bikeFrameCounter++; + + // Wait 6 frames before actually changing direction + if (gPlayerAvatar.bikeFrameCounter > 6) // ... because it takes 6 frames to advance 1 tile. + { + gPlayerAvatar.runningState = TURN_DIRECTION; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + Bike_SetBikeStill(); + return ACRO_TRANS_TURN_DIRECTION; + } + direction = player_get_direction_upper_nybble(); + if (*newDirection == AcroBike_GetJumpDirection()) + { + Bike_SetBikeStill(); // Bike_SetBikeStill sets speed to standing, but the next line immediately overrides it. could have just reset acroBikeState to 0 here instead of wasting a jump. + gPlayerAvatar.bikeSpeed = SPEED_NORMAL; + if (*newDirection == GetOppositeDirection(direction)) + { + // do a turn jump. + // no need to update runningState, didnt move. + gPlayerAvatar.acroBikeState = ACRO_STATE_TURN_JUMP; + return ACRO_TRANS_TURN_JUMP; + } + else + { + // do a sideways jump. + gPlayerAvatar.runningState = MOVING; // we need to move, set state to moving. + gPlayerAvatar.acroBikeState = ACRO_STATE_SIDE_JUMP; + return ACRO_TRANS_SIDE_JUMP; + } + } + *newDirection = direction; + return ACRO_TRANS_FACE_DIRECTION; +} + +static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_upper_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + gPlayerAvatar.runningState = NOT_MOVING; + + if (heldKeys & B_BUTTON) + gPlayerAvatar.bikeFrameCounter++; + else + { + // B button was released. + gPlayerAvatar.bikeFrameCounter = 0; + if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + // Go back to normal on flat ground + *newDirection = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + Bike_SetBikeStill(); + return ACRO_TRANS_WHEELIE_TO_NORMAL; + } + } + if (gPlayerAvatar.bikeFrameCounter >= 40) + { + *newDirection = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_BUNNY_HOP; + Bike_SetBikeStill(); + return ACRO_TRANS_WHEELIE_HOPPING_STANDING; + } + if (*newDirection == direction) + { + gPlayerAvatar.runningState = MOVING; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; + Bike_SetBikeStill(); + return ACRO_TRANS_WHEELIE_MOVING; + } + if (*newDirection == 0) + { + *newDirection = direction; + return ACRO_TRANS_WHEELIE_IDLE; + } + gPlayerAvatar.runningState = TURN_DIRECTION; + return ACRO_TRANS_WHEELIE_IDLE; +} + +static u8 AcroBikeHandleInputBunnyHop(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_upper_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!(heldKeys & B_BUTTON)) + { + // B button was released + Bike_SetBikeStill(); + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + // even though B was released, dont undo the wheelie on the bumpy slope. + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); + } + else + { + // .. otherwise, go back to normal on flat ground + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return ACRO_TRANS_WHEELIE_TO_NORMAL; + } + } + + // B Button is still held + + if (*newDirection == DIR_NONE) + { + // we did not move, so keep hopping in place without moving. + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_WHEELIE_HOPPING_STANDING; + } + if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) + { + // we changed direction, so turn but do not move hop. + gPlayerAvatar.runningState = TURN_DIRECTION; + return ACRO_TRANS_WHEELIE_HOPPING_STANDING; + } + // otherwise, we started moving while hopping + gPlayerAvatar.runningState = MOVING; + return ACRO_TRANS_WHEELIE_HOPPING_MOVING; +} + +static u8 AcroBikeHandleInputWheelieMoving(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_lower_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!(heldKeys & B_BUTTON)) + { + // we were moving on a wheelie, but we let go while moving. reset bike still status + Bike_SetBikeStill(); + if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + // we let go of B and arent on a bumpy slope, set state to normal because now we need to handle this + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + if (*newDirection == DIR_NONE) + { + // we stopped moving but are turning, still try to lower the wheelie in place. + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_WHEELIE_TO_NORMAL; + } + if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) + { + // we did not turn while lowering wheelie, so do so without turning. + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_WHEELIE_TO_NORMAL; + } + // if we are moving while lowering wheelie, put the acro into a lowering state while moving. + gPlayerAvatar.runningState = MOVING; + return ACRO_TRANS_WHEELIE_LOWERING_MOVING; + } + // please do not undo the wheelie on a bumpy slope + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); + } + // we are still holding B. + if (*newDirection == DIR_NONE) + { + // idle the wheelie in place because we're holding B without moving. + *newDirection = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + gPlayerAvatar.runningState = NOT_MOVING; + Bike_SetBikeStill(); + return ACRO_TRANS_WHEELIE_IDLE; + } + if (direction != *newDirection && gPlayerAvatar.runningState != MOVING) + { + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_WHEELIE_IDLE; + } + gPlayerAvatar.runningState = MOVING; + return ACRO_TRANS_WHEELIE_MOVING; +} + +static u8 AcroBikeHandleInputSidewaysJump(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_9 = 0; + FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); +} + +static u8 AcroBikeHandleInputTurnJump(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); +} + +static void AcroBikeTransition_FaceDirection(u8 direction) +{ + PlayerFaceDirection(direction); +} + +static void AcroBikeTransition_TurnDirection(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerFaceDirection(direction); +} + +static void AcroBikeTransition_Moving(u8 direction) +{ + u8 collision; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + AcroBikeTransition_FaceDirection(playerMapObj->placeholder18); + return; + } + collision = get_some_collision(direction); + if (collision > 0 && collision < 12) + { + if (collision == COLLISION_LEDGE_JUMP) + PlayerJumpLedge(direction); + else if (collision < 5 || collision > 8) + PlayerOnBikeCollide(direction); + } + else + { + npc_use_some_d2s(direction); + } +} + +static void AcroBikeTransition_NormalToWheelie(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerStartWheelie(direction); +} + +static void AcroBikeTransition_WheelieToNormal(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerEndWheelie(direction); +} + +static void AcroBikeTransition_WheelieIdle(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerIdleWheelie(direction); +} + +static void AcroBikeTransition_WheelieHoppingStanding(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerStandingHoppingWheelie(direction); +} + +static void AcroBikeTransition_WheelieHoppingMoving(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + AcroBikeTransition_WheelieHoppingStanding(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + //TODO: Try to get rid of this goto + if (var == 0 || var == 9) + { + goto derp; + } + else if (var == 6) + { + PlayerLedgeHoppingWheelie(direction); + } + else if (var < 5 || var > 8) + { + if (var <= 11) + { + AcroBikeTransition_WheelieHoppingStanding(direction); + } + else + { + derp: + PlayerMovingHoppingWheelie(direction); + } + } +} + +static void AcroBikeTransition_SideJump(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj; + + var = get_some_collision(direction); + if (var != 0) + { + if (var == 7) + return; + if (var < 10) + { + AcroBikeTransition_TurnDirection(direction); + return; + } + if (WillPlayerCollideWithCollision(var, direction) == FALSE) + { + AcroBikeTransition_TurnDirection(direction); + return; + } + } + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + PlaySE(SE_JITE_PYOKO); + playerMapObj->mapobj_bit_9 = 1; + PlayerSetAnimId(sub_80608A4(direction), 2); +} + +static void AcroBikeTransition_TurnJump(u8 direction) +{ + PlayerAcroTurnJump(direction); +} + +static void AcroBikeTransition_WheelieMoving(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + PlayerIdleWheelie(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + { + PlayerLedgeHoppingWheelie(direction); + } + else if (var == 9) + { + PlayerIdleWheelie(direction); + } + else if (var <= 4) + { + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + PlayerIdleWheelie(direction); + else + sub_80595DC(direction); //hit wall? + } + return; + } + sub_8059618(direction); + gPlayerAvatar.runningState = MOVING; +} + +static void AcroBikeTransition_WheelieRisingMoving(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + PlayerStartWheelie(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + { + PlayerLedgeHoppingWheelie(direction); + } + else if (var == 9) + { + PlayerIdleWheelie(direction); + } + else if (var <= 4) + { + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + PlayerIdleWheelie(direction); + else + sub_80595DC(direction); //hit wall? + } + return; + } + sub_8059600(direction); + gPlayerAvatar.runningState = MOVING; +} + +static void AcroBikeTransition_WheelieLoweringMoving(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + PlayerEndWheelie(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + PlayerJumpLedge(direction); + else if (var < 5 || var > 8) + PlayerEndWheelie(direction); + return; + } + sub_8059630(direction); +} + +void Bike_TryAcroBikeHistoryUpdate(u16 newKeys, u16 heldKeys) +{ + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + AcroBike_TryHistoryUpdate(newKeys, heldKeys); +} + +static void AcroBike_TryHistoryUpdate(u16 newKeys, u16 heldKeys) // newKeys is unused +{ + u8 direction = Bike_DPadToDirection(heldKeys); + + if (direction == (gPlayerAvatar.directionHistory & 0xF)) + { + // increment the timer for direction history since last input. + if (gPlayerAvatar.dirTimerHistory[0] < 0xFF) + gPlayerAvatar.dirTimerHistory[0]++; + } + else + { + Bike_UpdateDirTimerHistory(direction); + gPlayerAvatar.bikeSpeed = SPEED_STANDING; + } + + direction = heldKeys & (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON); // directions is reused for some reason. + if (direction == (gPlayerAvatar.abStartSelectHistory & 0xF)) + { + if (gPlayerAvatar.abStartSelectTimerHistory[0] < 0xFF) + gPlayerAvatar.abStartSelectTimerHistory[0]++; + } + else + { + Bike_UpdateABStartSelectHistory(direction); + gPlayerAvatar.bikeSpeed = SPEED_STANDING; + } +} + +static bool8 HasPlayerInputTakenLongerThanList(const u8 *dirTimerList, const u8 *abStartSelectTimerList) +{ + u8 i; + + for (i = 0; dirTimerList[i] != 0; i++) + { + if (gPlayerAvatar.dirTimerHistory[i] > dirTimerList[i]) + return FALSE; + } + for (i = 0; abStartSelectTimerList[i] != 0; i++) + { + if (gPlayerAvatar.abStartSelectTimerHistory[i] > abStartSelectTimerList[i]) + return FALSE; + } + return TRUE; +} + +static u8 AcroBike_GetJumpDirection(void) +{ + u32 i; + + for (i = 0; i < 4; i++) + { + const struct BikeHistoryInputInfo *historyInputInfo = &gAcroBikeTricksList[i]; + u32 dirHistory = gPlayerAvatar.directionHistory; + u32 abStartSelectHistory = gPlayerAvatar.abStartSelectHistory; + + dirHistory &= historyInputInfo->dirHistoryMask; + abStartSelectHistory &= historyInputInfo->abStartSelectHistoryMask; + if (dirHistory == historyInputInfo->dirHistoryMatch && abStartSelectHistory == historyInputInfo->abStartSelectHistoryMatch && HasPlayerInputTakenLongerThanList(historyInputInfo->dirTimerHistoryList, historyInputInfo->abStartSelectHistoryList)) + return historyInputInfo->direction; + } + return 0; +} + +static void Bike_UpdateDirTimerHistory(u8 dir) +{ + u8 i; + + gPlayerAvatar.directionHistory = (gPlayerAvatar.directionHistory << 4) | (dir & 0xF); + + for (i = 7; i != 0; i--) + gPlayerAvatar.dirTimerHistory[i] = gPlayerAvatar.dirTimerHistory[i - 1]; + gPlayerAvatar.dirTimerHistory[0] = 1; +} + +static void Bike_UpdateABStartSelectHistory(u8 input) +{ + u8 i; + + gPlayerAvatar.abStartSelectHistory = (gPlayerAvatar.abStartSelectHistory << 4) | (input & 0xF); + + for (i = 7; i != 0; i--) + gPlayerAvatar.abStartSelectTimerHistory[i] = gPlayerAvatar.abStartSelectTimerHistory[i - 1]; + gPlayerAvatar.abStartSelectTimerHistory[0] = 1; +} + +static u8 Bike_DPadToDirection(u16 heldKeys) +{ + if (heldKeys & DPAD_UP) + return DIR_NORTH; + if (heldKeys & DPAD_DOWN) + return DIR_SOUTH; + if (heldKeys & DPAD_LEFT) + return DIR_WEST; + if (heldKeys & DPAD_RIGHT) + return DIR_EAST; + return DIR_NONE; +} + +static u8 get_some_collision(u8 direction) +{ + s16 x; + s16 y; + u8 metatitleBehavior; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + x = playerMapObj->coords2.x; + y = playerMapObj->coords2.y; + MoveCoords(direction, &x, &y); + metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y); + return Bike_CheckCollisionTryAdvanceCollisionCount(playerMapObj, x, y, direction, metatitleBehavior); +} + +static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior) +{ + u8 collision = CheckForFieldObjectCollision(mapObject, x, y, direction, metatitleBehavior); + + if (collision > 4) + return collision; + + if (collision == 0 && IsRunningDisallowedByMetatile(metatitleBehavior)) + collision = 2; + + if (collision) + Bike_TryAdvanceCyclingRoadCollisions(); + + return collision; +} + +bool8 IsRunningDisallowed(u8 tile) +{ + if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR) + return TRUE; + else + return FALSE; +} + +static bool8 IsRunningDisallowedByMetatile(u8 tile) +{ + if (MetatileBehavior_IsRunningDisallowed(tile)) + return TRUE; + if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetZCoord() & 1) == 0) + return TRUE; + return FALSE; +} + +static void Bike_TryAdvanceCyclingRoadCollisions(void) +{ + if (gBikeCyclingChallenge != FALSE && gBikeCollisions < 100) + gBikeCollisions++; +} + +static bool8 CanBikeFaceDirOnMetatile(u8 direction, u8 tile) +{ + if (direction == DIR_EAST || direction == DIR_WEST) + { + //Bike cannot face east or west on a vertical rail + if (MetatileBehavior_IsIsolatedVerticalRail(tile) + || MetatileBehavior_IsVerticalRail(tile)) + return FALSE; + } + else + { + //Bike cannot face north or south on a horizontal rail + if (MetatileBehavior_IsIsolatedHorizontalRail(tile) + || MetatileBehavior_IsHorizontalRail(tile)) + return FALSE; + } + return TRUE; +} + +static bool8 WillPlayerCollideWithCollision(u8 newTileCollision, u8 direction) +{ + if (direction == DIR_NORTH || direction == DIR_SOUTH) + { + if (newTileCollision == 10 || newTileCollision == 12) + return FALSE; + } + else if (newTileCollision == 11 || newTileCollision == 13) + { + return FALSE; + } + + return TRUE; +} + +bool8 IsBikingDisallowedByPlayer(void) +{ + s16 x, y; + u8 tileBehavior; + + if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_4))) + { + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (!IsRunningDisallowedByMetatile(tileBehavior)) + return FALSE; + } + return TRUE; +} + +bool8 player_should_look_direction_be_enforced_upon_movement(void) +{ + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) != FALSE) + return FALSE; + else + return TRUE; +} + +void GetOnOffBike(u8 var) +{ + gUnusedBikeCameraAheadPanback = FALSE; + + if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + Overworld_ClearSavedMusic(); + Overworld_PlaySpecialMapMusic(); + } + else + { + SetPlayerAvatarTransitionFlags(var); + Overworld_SetSavedMusic(BGM_CYCLING); + Overworld_ChangeMusicTo(BGM_CYCLING); + } +} + +void BikeClearState(int newDirHistory, int newAbStartHistory) +{ + u8 i; + + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + gPlayerAvatar.newDirBackup = DIR_NONE; + gPlayerAvatar.bikeFrameCounter = 0; + gPlayerAvatar.bikeSpeed = SPEED_STANDING; + gPlayerAvatar.directionHistory = newDirHistory; + gPlayerAvatar.abStartSelectHistory = newAbStartHistory; + + for (i = 0; i < 8; i++) + gPlayerAvatar.dirTimerHistory[i] = 0; + + for (i = 0; i < 8; i++) + gPlayerAvatar.abStartSelectTimerHistory[i] = 0; +} + +void Bike_UpdateBikeCounterSpeed(u8 counter) +{ + gPlayerAvatar.bikeFrameCounter = counter; + gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // lazy way of multiplying by 1.5. +} + +static void Bike_SetBikeStill(void) +{ + gPlayerAvatar.bikeFrameCounter = 0; + gPlayerAvatar.bikeSpeed = SPEED_STANDING; +} + +s16 GetPlayerSpeed(void) +{ + // because the player pressed a direction, it won't ever return a speed of 0 since this function returns the player's current speed. + s16 machSpeeds[3]; + + memcpy(machSpeeds, gMachBikeSpeeds, sizeof(machSpeeds)); + + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + return machSpeeds[gPlayerAvatar.bikeFrameCounter]; + else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + return SPEED_FASTER; + else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH)) + return SPEED_FAST; + else + return SPEED_NORMAL; +} + +void Bike_HandleBumpySlopeJump(void) +{ + s16 x, y; + u8 tileBehavior; + + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + { + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsBumpySlope(tileBehavior)) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + sub_8059C94(player_get_direction_upper_nybble()); + } + } +} diff --git a/src/birch_pc.c b/src/birch_pc.c new file mode 100644 index 000000000..4b0025504 --- /dev/null +++ b/src/birch_pc.c @@ -0,0 +1,114 @@ +#include "global.h" +#include "event_data.h" +#include "field_message_box.h" +#include "pokedex.h" +#include "constants/species.h" + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +extern const u8 gBirchDexRatingText_LessThan10[]; +extern const u8 gBirchDexRatingText_LessThan20[]; +extern const u8 gBirchDexRatingText_LessThan30[]; +extern const u8 gBirchDexRatingText_LessThan40[]; +extern const u8 gBirchDexRatingText_LessThan50[]; +extern const u8 gBirchDexRatingText_LessThan60[]; +extern const u8 gBirchDexRatingText_LessThan70[]; +extern const u8 gBirchDexRatingText_LessThan80[]; +extern const u8 gBirchDexRatingText_LessThan90[]; +extern const u8 gBirchDexRatingText_LessThan100[]; +extern const u8 gBirchDexRatingText_LessThan110[]; +extern const u8 gBirchDexRatingText_LessThan120[]; +extern const u8 gBirchDexRatingText_LessThan130[]; +extern const u8 gBirchDexRatingText_LessThan140[]; +extern const u8 gBirchDexRatingText_LessThan150[]; +extern const u8 gBirchDexRatingText_LessThan160[]; +extern const u8 gBirchDexRatingText_LessThan170[]; +extern const u8 gBirchDexRatingText_LessThan180[]; +extern const u8 gBirchDexRatingText_LessThan190[]; +extern const u8 gBirchDexRatingText_LessThan200[]; +extern const u8 gBirchDexRatingText_DexCompleted[]; + +bool16 ScriptGetPokedexInfo(void) +{ + if (gSpecialVar_0x8004 == 0) // is national dex not present? + { + gSpecialVar_0x8005 = GetHoennPokedexCount(0); + gSpecialVar_0x8006 = GetHoennPokedexCount(1); + } + else + { + gSpecialVar_0x8005 = GetNationalPokedexCount(0); + gSpecialVar_0x8006 = GetNationalPokedexCount(1); + } + + return IsNationalPokedexEnabled(); +} + +// This shows your Hoenn Pokedex rating and not your National Dex. +const u8 *GetPokedexRatingText(u16 count) +{ + if (count < 10) + return gBirchDexRatingText_LessThan10; + if (count < 20) + return gBirchDexRatingText_LessThan20; + if (count < 30) + return gBirchDexRatingText_LessThan30; + if (count < 40) + return gBirchDexRatingText_LessThan40; + if (count < 50) + return gBirchDexRatingText_LessThan50; + if (count < 60) + return gBirchDexRatingText_LessThan60; + if (count < 70) + return gBirchDexRatingText_LessThan70; + if (count < 80) + return gBirchDexRatingText_LessThan80; + if (count < 90) + return gBirchDexRatingText_LessThan90; + if (count < 100) + return gBirchDexRatingText_LessThan100; + if (count < 110) + return gBirchDexRatingText_LessThan110; + if (count < 120) + return gBirchDexRatingText_LessThan120; + if (count < 130) + return gBirchDexRatingText_LessThan130; + if (count < 140) + return gBirchDexRatingText_LessThan140; + if (count < 150) + return gBirchDexRatingText_LessThan150; + if (count < 160) + return gBirchDexRatingText_LessThan160; + if (count < 170) + return gBirchDexRatingText_LessThan170; + if (count < 180) + return gBirchDexRatingText_LessThan180; + if (count < 190) + return gBirchDexRatingText_LessThan190; + if (count < 200) + return gBirchDexRatingText_LessThan200; + if (count == 200) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + || GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. + return gBirchDexRatingText_LessThan200; + return gBirchDexRatingText_DexCompleted; + } + if (count == 201) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + && GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200. + return gBirchDexRatingText_LessThan200; + return gBirchDexRatingText_DexCompleted; + } + if (count == 202) + return gBirchDexRatingText_DexCompleted; // Hoenn dex is considered complete, even though the hoenn dex count is 210. + return gBirchDexRatingText_LessThan10; +} + +void ShowPokedexRatingMessage(void) +{ + ShowFieldMessage(GetPokedexRatingText(gSpecialVar_0x8004)); +} diff --git a/src/blend_palette.c b/src/blend_palette.c new file mode 100644 index 000000000..843c50ac1 --- /dev/null +++ b/src/blend_palette.c @@ -0,0 +1,20 @@ +#include "global.h" +#include "blend_palette.h" +#include "palette.h" + +void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) +{ + u16 i; + for (i = 0; i < numEntries; i++) + { + u16 index = i + palOffset; + struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; + s8 r = data1->r; + s8 g = data1->g; + s8 b = data1->b; + struct PlttData *data2 = (struct PlttData *)&blendColor; + gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0) + | ((g + (((data2->g - g) * coeff) >> 4)) << 5) + | ((b + (((data2->b - b) * coeff) >> 4)) << 10); + } +} diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c new file mode 100644 index 000000000..f11fb5fb3 --- /dev/null +++ b/src/braille_puzzles.c @@ -0,0 +1,262 @@ +#include "global.h" +#include "braille_puzzles.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "fieldmap.h" +#include "constants/flags.h" +#include "main.h" +#include "constants/maps.h" +#include "map_obj_lock.h" +#include "menu.h" +#include "rom6.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "task.h" +#include "text.h" + +extern u8 gPlayerPartyCount; +extern u8 gLastFieldPokeMenuOpened; + +extern u8 S_OpenRegiceChamber[]; // regiice event script + +bool8 ShouldDoBrailleDigEffect(void) +{ + if (!FlagGet(FLAG_SYS_BRAILLE_DIG) + && (gSaveBlock1.location.mapGroup == MAP_GROUP(SEALED_CHAMBER_OUTER_ROOM) + && gSaveBlock1.location.mapNum == MAP_NUM(SEALED_CHAMBER_OUTER_ROOM))) + { + if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 3) + return TRUE; + else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 3) + return TRUE; + else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 3) + return TRUE; + } + + return FALSE; +} + +void DoBrailleDigEffect(void) +{ + MapGridSetMetatileIdAt(16, 8, 554); + MapGridSetMetatileIdAt(17, 8, 555); + MapGridSetMetatileIdAt(18, 8, 556); + MapGridSetMetatileIdAt(16, 9, 3634); + MapGridSetMetatileIdAt(17, 9, 563); + MapGridSetMetatileIdAt(18, 9, 3636); + DrawWholeMapView(); + PlaySE(SE_BAN); + FlagSet(FLAG_SYS_BRAILLE_DIG); + ScriptContext2_Disable(); +} + +bool8 CheckRelicanthWailord(void) +{ + // First comes Relicanth. + if (GetMonData(&gPlayerParty, MON_DATA_SPECIES2, 0) == SPECIES_RELICANTH) + { + CalculatePlayerPartyCount(); + // Last comes Wailord + if (GetMonData(&gPlayerParty[gPlayerPartyCount - 1], MON_DATA_SPECIES2, 0) == SPECIES_WAILORD) + return TRUE; + } + return FALSE; +} + +bool8 ShouldDoBrailleStrengthEffect(void) +{ + if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == MAP_GROUP(DESERT_RUINS) && gSaveBlock1.location.mapNum == MAP_NUM(DESERT_RUINS))) + { + if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 23) + return TRUE; + else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 23) + return TRUE; + else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 23) + return TRUE; + } + + return FALSE; +} + +void DoBrailleStrengthEffect(void) +{ + FieldEffectActiveListRemove(0x28); + MapGridSetMetatileIdAt(14, 26, 554); + MapGridSetMetatileIdAt(15, 26, 555); + MapGridSetMetatileIdAt(16, 26, 556); + MapGridSetMetatileIdAt(14, 27, 3634); + MapGridSetMetatileIdAt(15, 27, 563); + MapGridSetMetatileIdAt(16, 27, 3636); + DrawWholeMapView(); + PlaySE(SE_BAN); + FlagSet(FLAG_SYS_BRAILLE_STRENGTH); + ScriptContext2_Disable(); +} + +bool8 ShouldDoBrailleFlyEffect(void) +{ + if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == MAP_GROUP(ANCIENT_TOMB) && gSaveBlock1.location.mapNum == MAP_NUM(ANCIENT_TOMB))) + { + if (gSaveBlock1.pos.x == 8 && gSaveBlock1.pos.y == 25) + return TRUE; + } + + return FALSE; +} + +void DoBrailleFlyEffect(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB); +} + +bool8 FldEff_UseFlyAncientTomb(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16; + gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback; + return FALSE; +} + +void UseFlyAncientTomb_Callback(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_FLY_ANCIENT_TOMB); + UseFlyAncientTomb_Finish(); +} + +void UseFlyAncientTomb_Finish(void) +{ + MapGridSetMetatileIdAt(14, 26, 554); + MapGridSetMetatileIdAt(15, 26, 555); + MapGridSetMetatileIdAt(16, 26, 556); + MapGridSetMetatileIdAt(14, 27, 3634); + MapGridSetMetatileIdAt(15, 27, 563); + MapGridSetMetatileIdAt(16, 27, 3636); + DrawWholeMapView(); + PlaySE(SE_BAN); + FlagSet(FLAG_SYS_BRAILLE_FLY); + ScriptContext2_Disable(); +} + +void DoBrailleWait(void) +{ + if (!FlagGet(FLAG_SYS_BRAILLE_WAIT)) + CreateTask(Task_BrailleWait, 0x50); +} + +void Task_BrailleWait(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[1] = 7200; + data[0] = 1; + break; + case 1: + if (BrailleWait_CheckButtonPress() != FALSE) + { + Menu_EraseScreen(); + PlaySE(SE_SELECT); + data[0] = 2; + } + else + { + data[1] = data[1] - 1; + if (data[1] == 0) + { + Menu_EraseScreen(); + data[0] = 3; + data[1] = 30; + } + } + break; + case 2: + if (BrailleWait_CheckButtonPress() == FALSE) + { + data[1] = data[1] - 1; + if (data[1] == 0) + data[0] = 4; + break; + } + sub_8064E2C(); + DestroyTask(taskId); + ScriptContext2_Disable(); + break; + case 3: + data[1] = data[1] - 1; + if (data[1] == 0) + data[0] = 4; + break; + case 4: + sub_8064E2C(); + ScriptContext1_SetupScript(S_OpenRegiceChamber); + DestroyTask(taskId); + break; + } +} + +bool32 BrailleWait_CheckButtonPress(void) +{ + u16 keyMask = A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON | DPAD_ANY; + + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + keyMask |= L_BUTTON | R_BUTTON; + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) + keyMask |= L_BUTTON; + + if (gMain.newKeys & keyMask) + return TRUE; + else + return FALSE; +} + +void DoSealedChamberShakingEffect1(void) +{ + u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9); + + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[4] = 2; + gTasks[taskId].data[5] = 5; + gTasks[taskId].data[6] = 50; + SetCameraPanningCallback(0); +} + +void DoSealedChamberShakingEffect2(void) +{ + u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9); + + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[4] = 3; + gTasks[taskId].data[5] = 5; + gTasks[taskId].data[6] = 2; + SetCameraPanningCallback(0); +} + +void SealedChamberShakingEffect(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->data[1]++; + + if (!(task->data[1] % task->data[5])) + { + task->data[1] = 0; + task->data[2]++; + task->data[4] = -task->data[4]; + SetCameraPanning(0, task->data[4]); + if (task->data[2] == task->data[6]) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + InstallCameraPanAheadCallback(); + } + } +} diff --git a/src/cable_car.c b/src/cable_car.c new file mode 100644 index 000000000..8c3f9885d --- /dev/null +++ b/src/cable_car.c @@ -0,0 +1,1077 @@ + +// Includes +#include "global.h" +#include "ewram.h" +#include "overworld.h" +#include "palette.h" +#include "random.h" +#include "main.h" +#include "menu.h" +#include "script.h" +#include "task.h" +#include "sound.h" +#include "graphics.h" +#include "constants/songs.h" +#include "decompress.h" +#include "field_weather.h" +#include "event_object_movement.h" +#include "scanline_effect.h" +#include "event_data.h" +#include "cable_car_util.h" +#include "constants/map_objects.h" +#include "constants/weather.h" + +extern u8 (*gMenuCallback)(void); + +// Static type declarations + +struct CableCarEwramStruct1 +{ + u8 unk_0000; + u8 unk_0001; + u8 unk_0002; + u8 unk_0003; + u16 unk_0004; + u16 unk_0006; + u8 unk_0008; + u8 unk_0009; + u8 filler_000a[2]; + u8 unk_000c; + u8 unk_000d; + u8 filler_0000e[6]; + u8 unk_0014; + u8 unk_0015; + u8 unk_0016; + u8 unk_0017; + u8 unk_0018; + u8 unk_0019; + u8 unk_001a; + u8 unk_001b; + u8 unk_001c; + u8 unk_001d; + u8 unk_001e; + u8 unk_001f; + u8 unk_0020; + u16 unk_0022[9][12]; + u8 filler_00fa[2]; + u16 unk_00fc[0x20][0x20]; + u16 unk_08fc[0x20][0x20]; +}; // size 0x10FC + +struct CableCarEwramStruct2 +{ + /* 0x000 */ u16 mtChimneyTilemap[0xb4]; + /* 0x168 */ u16 treeTilemap[0x1e0]; + /* 0x528 */ u16 mountainTilemap[0x258]; + /* 0x9d8 */ u16 pylonStemTilemap[0x628]; // size not actually known +}; + +// Static RAM declarations + +EWRAM_DATA struct CableCarEwramStruct1 *sCableCarPtr = NULL; +EWRAM_DATA u8 gUnknown_02039278 = 0; +EWRAM_DATA u8 gUnknown_02039279 = 0; +EWRAM_DATA u8 gUnknown_0203927A = 0; +EWRAM_DATA u8 gUnknown_0203927B = 0; +EWRAM_DATA u8 gUnknown_0203927C = 0; +EWRAM_DATA u8 gUnknown_0203927D = 0; +EWRAM_DATA u32 filler_02039280 = 0; + +// Static ROM declarations + +static void CableCarMainCallback_Setup(void); +static void CableCarMainCallback_Run(void); +static void sub_8123878(u8 taskId); +static void sub_81239E4(u8 taskId); +static void sub_8123AF8(u8 taskId); +static void CableCarVblankCallback(void); +static void nullsub_76(struct Sprite *sprite); +static void sub_8123CB8(struct Sprite *sprite); +static void sub_8123EB8(struct Sprite *sprite); +static void sub_8123F44(struct Sprite *sprite); +static void sub_8123FBC(u8); +static void LoadSprites(void); +static void sub_812453C(void); +static void sub_8124598(void); +static void sub_81245F4(void); +static void sub_812476C(void); +static void sub_81248AC(u8); + +// .rodata + +#if DEBUG + +void debug_sub_8138D74(void); +void debug_sub_8138D8C(void); +u8 debug_sub_8138C14(void); +u8 debug_sub_8138C34(void); +u8 debug_sub_810CD9C(void); + +const u8 Str_842DBD0[] = _("CABLE CAR U"); +const u8 Str_842DBDC[] = _("CABLE CAR D"); +const u8 Str_842DBE8[] = _("ROULETTE1"); +const u8 Str_842DBF2[] = _("ROULETTE3"); +const u8 Str_842DBFC[] = _("View a MAIL"); + +const struct MenuAction gUnkDebug4Menu[] = +{ + {Str_842DBD0, (u8 (*)(void))debug_sub_8138D74}, // why do these two functions have a different prototype? + {Str_842DBDC, (u8 (*)(void))debug_sub_8138D8C}, + {Str_842DBE8, debug_sub_8138C14}, + {Str_842DBF2, debug_sub_8138C34}, + {Str_842DBFC, debug_sub_810CD9C}, +}; + +#endif + +static const u8 gCableCarMtChimneyTilemap[] = INCBIN_U8("graphics/misc/cable_car_mt_chimney_map.bin.lz"); + +static const u8 gCableCarTreeTilemap[] = INCBIN_U8("graphics/misc/cable_car_tree_map.bin.lz"); + +static const u8 gCableCarMountainTilemap[] = INCBIN_U8("graphics/misc/cable_car_mountain_map.bin.lz"); + +static const u16 gCableCarPylonHookTilemapEntries[] = { + 0x3000, + 0x3001, + 0x3002, + 0x3003, + 0x3004, + 0x3005, + 0x3006, + 0x3007, + 0x3008, + 0x3009 +}; + +static const u8 gCableCarPylonStemTilemap[] = INCBIN_U8("graphics/misc/cable_car_pylon_stem_map.bin.lz"); + +static const struct CompressedSpriteSheet gUnknown_08401CF8[] = { + { gCableCar_Gfx, 0x800, 1 }, + { gCableCarDoor_Gfx, 0x40, 2 }, + { gCableCarCord_Gfx, 0x80, 3 }, + { } +}; +static const struct SpritePalette gUnknown_08401D18[] = { + { gCableCar_Pal, 1 }, + { } +}; + +static const struct OamData gOamData_8401D28 = { + .affineMode = ST_OAM_AFFINE_DOUBLE, + .size = 3, + .priority = 2 +}; + +static const struct OamData gOamData_8401D30 = { + .affineMode = ST_OAM_AFFINE_DOUBLE, + .shape = ST_OAM_H_RECTANGLE, + .priority = 2 +}; + +static const struct OamData gOamData_8401D38 = { + .affineMode = ST_OAM_AFFINE_DOUBLE, + .size = 1, + .priority = 2 +}; + +static const struct SpriteTemplate gSpriteTemplate_8401D40[] = +{ + { + .tileTag = 1, + .paletteTag = 1, + .oam = &gOamData_8401D28, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8123CB8, + }, + { + .tileTag = 2, + .paletteTag = 1, + .oam = &gOamData_8401D30, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8123CB8, + }, + { + .tileTag = 3, + .paletteTag = 1, + .oam = &gOamData_8401D38, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = nullsub_76, + } +}; + +#if DEBUG + +extern u8 unk_203955C; + +extern const u8 MauvilleCity_GameCorner_EventScript_1C407E[]; +extern const u8 MauvilleCity_GameCorner_EventScript_1C40AC[]; + +u8 debug_sub_8138C14(void) +{ + unk_203955C = 1; + ScriptContext1_SetupScript(MauvilleCity_GameCorner_EventScript_1C407E); + CloseMenu(); + return 1; +} + +u8 debug_sub_8138C34(void) +{ + unk_203955C = 1; + ScriptContext1_SetupScript(MauvilleCity_GameCorner_EventScript_1C40AC); + CloseMenu(); + return 1; +} + +u8 debug_sub_8138C54(void) +{ + if (gMain.newKeys == DPAD_UP) + Menu_MoveCursor(-1); + if (gMain.newKeys == DPAD_DOWN) + Menu_MoveCursor(1); + if (gMain.newKeys == A_BUTTON) + return gUnkDebug4Menu[Menu_GetCursorPos()].func(); + if (gMain.newKeys == (R_BUTTON | A_BUTTON)) + { + gSpecialVar_0x8004 = 1; + return gUnkDebug4Menu[Menu_GetCursorPos()].func(); + } + if (gMain.newKeys == B_BUTTON) + { + CloseMenu(); + return 1; + } + return 0; +} + +u8 debug_sub_8138CC4(void) +{ + gSpecialVar_0x8004 = 0; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(19, 0, 29, 12); + Menu_PrintItems(20, 1, 5, gUnkDebug4Menu); + InitMenu(0, 20, 1, 5, 0, 8); + gMenuCallback = debug_sub_8138C54; + return 0; +} + +#endif + +static void CableCarTask1(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CableCarMainCallback_Setup); + DestroyTask(taskId); + } +} + +void CableCar(void) +{ + ScriptContext2_Enable(); + CreateTask(CableCarTask1, 1); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); +} + +#if DEBUG + +void debug_sub_8138D74(void) +{ + gSpecialVar_0x8004 = 0; + CloseMenu(); + CableCar(); +} + +void debug_sub_8138D8C(void) +{ + gSpecialVar_0x8004 = 1; + CloseMenu(); + CableCar(); +} + +#endif + +static void CableCarMainCallback_Setup(void) +{ + u8 i; + u16 imebak; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000); + DmaFill32Defvars(3, 0, OAM, OAM_SIZE); + DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); + sCableCarPtr = eCableCar1; + DmaFill16Large(3, 0, eCableCar1, 0x10FC, 0x1000); + gMain.state++; + break; + case 1: + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + ResetPaletteFade(); + StartWeather(); + for (i = 0; i < 20; i++) + { + gWeatherPtr->sprites.s2.ashSprites[i] = NULL; + } + InitMapMusic(); + ResetMapMusic(); + gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0; + gMain.state++; + break; + case 2: + for (i = 0; i < 3; i++) + { + LoadCompressedObjectPic(&gUnknown_08401CF8[i]); + } + LoadSpritePalettes(gUnknown_08401D18); + LZDecompressWram(gCableCarMtChimneyTilemap, eCableCar2->mtChimneyTilemap); + LZDecompressWram(gCableCarTreeTilemap, eCableCar2->treeTilemap); + LZDecompressWram(gCableCarMountainTilemap, eCableCar2->mountainTilemap); + LZDecompressWram(gCableCarPylonStemTilemap, eCableCar2->pylonStemTilemap); + LoadPalette(gCableCarBG_Pal, 0, 0x80); + LZ77UnCompVram(gCableCarBG_Gfx, (u16 *)BG_VRAM); + gMain.state++; + break; + case 3: + LoadSprites(); + RunTasks(); + gMain.state++; + break; + case 4: + if (sCableCarPtr->unk_0002 == 7) + { + gMain.state++; + } + else if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL) + { + for (i = 0; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) + { + gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; + } + } + gMain.state++; + } + break; + case 5: + CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(29), eCableCar2->treeTilemap, 0, 17, 32, 15); + CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(30), eCableCar2->mountainTilemap, 0, 0, 30, 20); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 20); + gMain.state++; + break; + case 6: + sub_81248AC(gSpecialVar_0x8004); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x48, 0, 14, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x6C, 12, 17, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x90, 24, 20, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 0, 17, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0, 20, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 12, 20, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 12, 23, 12, 3); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 24, 23, 12, 3); + gMain.state++; + break; + case 7: + BeginNormalPaletteFade(-1, 3, 16, 0, 0); + FadeInNewBGM(BGM_ROPEWAY, 1); + sub_8123FBC(1); + gMain.state++; + break; + case 8: + imebak = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = imebak; + SetVBlankCallback(CableCarVblankCallback); + SetMainCallback2(CableCarMainCallback_Run); + CreateTask(sub_8123878, 0); + if (gSpecialVar_0x8004 == 0) + { + sCableCarPtr->unk_0000 = CreateTask(sub_81239E4, 1); + } + else + { + sCableCarPtr->unk_0000 = CreateTask(sub_8123AF8, 1); + } + break; + } +} + +static void CableCarMainCallback_Run(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + MapMusicMain(); +} + +static void sub_8123740(void) +{ + u8 i; + + i = 0; + sub_8123FBC(0); + gSpriteCoordOffsetX = 0; + sub_807C9B4(WEATHER_NONE); + for (; i < 20; i++) + { + gWeatherPtr->sprites.s2.ashSprites[i] = NULL; + } + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + DmaFill32Large(3, 0, gSharedMem, 0x20000, 0x1000); + sCableCarPtr = NULL; + DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000); + DmaFill32Defvars(3, 0, OAM, OAM_SIZE); + DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); + warp_in(); + gFieldCallback = NULL; + SetMainCallback2(CB2_LoadMap); +} + +static void sub_8123878(u8 taskId) +{ + u8 i; + + i = 0; + sCableCarPtr->unk_0006++; + switch (sCableCarPtr->unk_0001) + { + case 0: + if (sCableCarPtr->unk_0006 == sCableCarPtr->unk_0004) + { + ChangeWeather(sCableCarPtr->unk_0002); + sCableCarPtr->unk_0001 = 1; + } + break; + case 1: + switch (sCableCarPtr->unk_0002) + { + case 7: + if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL && gWeatherPtr->sprites.s2.ashSprites[0]->oam.priority != 0) + { + for (; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) + { + gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; + } + } + sCableCarPtr->unk_0001 = 2; + } + break; + case 2: + if (gWeatherPtr->currWeather == 2) + { + sCableCarPtr->unk_0001 = 2; + } + else if (sCableCarPtr->unk_0006 >= sCableCarPtr->unk_0004 + 8) + { + for (; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) + { + gWeatherPtr->sprites.s2.ashSprites[i]->invisible ^= TRUE; + } + } + } + break; + } + break; + case 2: + if (sCableCarPtr->unk_0006 == 570) + { + sCableCarPtr->unk_0001 = 3; + BeginNormalPaletteFade(-1, 3, 0, 16, 0); + FadeOutBGM(4); + } + break; + case 3: + if (!gPaletteFade.active) + { + sCableCarPtr->unk_0001 = 255; + } + break; + case 255: + SetVBlankCallback(NULL); + DestroyTask(taskId); + DestroyTask(sCableCarPtr->unk_0000); + SetMainCallback2(sub_8123740); + break; + } +} + +static void sub_81239E4(u8 taskId) +{ + if (sCableCarPtr->unk_0001 != 255) + { + sCableCarPtr->unk_0014--; + if ((sCableCarPtr->unk_0006 % 2) == 0) + { + sCableCarPtr->unk_0015--; + } + if ((sCableCarPtr->unk_0006 % 8) == 0) + { + sCableCarPtr->unk_000c--; + sCableCarPtr->unk_000d--; + } + switch (sCableCarPtr->unk_0014) + { + case 175: + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10); + break; + case 40: + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 3, 0, 2, 2); + break; + case 32: + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 1, 2); + break; + case 16: + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2); + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30); + sCableCarPtr->unk_0015 = 64; + break; + } + } + sub_812453C(); + gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 1) % 128; +} + +static void sub_8123AF8(u8 taskId) +{ + if (sCableCarPtr->unk_0001 != 255) + { + sCableCarPtr->unk_0014++; + if ((sCableCarPtr->unk_0006 % 2) == 0) + { + sCableCarPtr->unk_0015++; + } + if ((sCableCarPtr->unk_0006 % 8) == 0) + { + sCableCarPtr->unk_000c++; + sCableCarPtr->unk_000d++; + } + switch (sCableCarPtr->unk_0014) + { + case 176: + CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30); + break; + case 16: + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 3, 2); + CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10); + sCableCarPtr->unk_0015 = 192; + break; + case 32: + sCableCarPtr->unk_08fc[0][2] = (gCableCarPylonHookTilemapEntries + 2)[0]; + sCableCarPtr->unk_08fc[0][3] = (gCableCarPylonHookTilemapEntries + 2)[1]; + sCableCarPtr->unk_08fc[1][2] = (gCableCarPylonHookTilemapEntries + 2)[5]; + sCableCarPtr->unk_08fc[1][3] = (gCableCarPylonHookTilemapEntries + 2)[6]; + break; + case 40: + sCableCarPtr->unk_08fc[0][4] = (gCableCarPylonHookTilemapEntries + 4)[0]; + sCableCarPtr->unk_08fc[1][4] = (gCableCarPylonHookTilemapEntries + 4)[5]; + break; + } + } + sub_8124598(); + if (sCableCarPtr->unk_0006 < sCableCarPtr->unk_0004) { + gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 247) % 248; + } + else + { + gWeatherPtr->unknown_6FC = (gWeatherPtr->unknown_6FC + 247) % 248; + } +} + +static void CableCarVblankCallback(void) +{ + DmaCopy16(3, sCableCarPtr->unk_00fc, BG_SCREEN_ADDR(28), 0x800); + DmaCopy16(3, sCableCarPtr->unk_08fc, BG_SCREEN_ADDR(31), 0x800); + REG_BG3HOFS = sCableCarPtr->unk_0014; + REG_BG3VOFS = sCableCarPtr->unk_0015; + REG_BG1HOFS = sCableCarPtr->unk_000c; + REG_BG1VOFS = sCableCarPtr->unk_000d; + REG_BG0HOFS = sCableCarPtr->unk_0008; + REG_BG0VOFS = sCableCarPtr->unk_0009; + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void nullsub_76(struct Sprite *sprite) +{ + +} + +static void sub_8123CB8(struct Sprite *sprite) +{ + if (sCableCarPtr->unk_0001 != 255) + { + if (gSpecialVar_0x8004 == 0) + { + sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + } + else + { + sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + } + } +} + +static void sub_8123D98(struct Sprite *sprite) +{ + if (sCableCarPtr->unk_0001 != 255) + { + if (gSpecialVar_0x8004 == 0) + { + sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + } + else + { + sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); + } + switch (sprite->data[2]) + { + case 0: + sprite->pos2.y = 17; + if (sprite->data[3] ++ > 9) + { + sprite->data[3] = 0; + sprite->data[2] ++; + } + break; + default: + sprite->pos2.y = 16; + if (sprite->data[3] ++ > 9) + { + sprite->data[3] = 0; + sprite->data[2] = 0; + } + break; + } + } +} + +static void sub_8123EB8(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + sprite->pos1.x += 2 * sprite->centerToCornerVecX; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + } + if (++sprite->data[0] >= sprite->data[2]) + { + switch (sprite->data[1]) + { + case 0: + sprite->pos1.x++; + if ((sprite->data[0] % 4) == 0) + { + sprite->pos1.y++; + } + break; + case 1: + if ((sprite->data[0] % 2) != 0) + { + sprite->pos1.x++; + if ((sprite->pos1.x % 4) == 0) + { + sprite->pos1.y++; + } + } + break; + } + if (sprite->pos1.y > 0xa0) + { + DestroySprite(sprite); + } + } +} + +static void sub_8123F44(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + } + if (++sprite->data[0] >= sprite->data[2]) + { + switch (sprite->data[1]) + { + case 0: + sprite->pos1.x--; + if ((sprite->data[0] % 4) == 0) + { + sprite->pos1.y--; + } + break; + case 1: + if ((sprite->data[0] % 2) != 0) + { + sprite->pos1.x--; + if ((sprite->pos1.x % 4) == 0) + { + sprite->pos1.y--; + } + } + break; + } + if (sprite->pos1.y < 0x50) + { + DestroySprite(sprite); + } + } +} + +static void sub_8123FBC(bool8 which) +{ + switch (which) + { + case FALSE: + default: + REG_WININ = 0; + REG_WINOUT = 0; + REG_WIN0H = 0; + REG_WIN1H = 0; + REG_WIN0V = 0; + REG_WIN1V = 0; + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BLDCNT = 0; + break; + case TRUE: + REG_WININ = 0; + REG_WINOUT = 0; + REG_WIN0H = 0; + REG_WIN1H = 0; + REG_WIN0V = 0; + REG_WIN1V = 0; + if (gSpecialVar_0x8004 == 0) + { + sCableCarPtr->unk_0014 = 0xb0; + sCableCarPtr->unk_0015 = 0x10; + sCableCarPtr->unk_000c = 0x00; + sCableCarPtr->unk_000d = 0x50; + sCableCarPtr->unk_0009 = 0; + sCableCarPtr->unk_0009 = 0; + } + else + { + sCableCarPtr->unk_0014 = 0x60; + sCableCarPtr->unk_0015 = 0xe8; + sCableCarPtr->unk_000c = 0x00; + sCableCarPtr->unk_000d = 0x04; + sCableCarPtr->unk_0009 = 0; + sCableCarPtr->unk_0009 = 0; + } + REG_BG3HOFS = sCableCarPtr->unk_0014; + REG_BG3VOFS = sCableCarPtr->unk_0015; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = sCableCarPtr->unk_000c; + REG_BG1VOFS = sCableCarPtr->unk_000d; + REG_BG0HOFS = sCableCarPtr->unk_0008; + REG_BG0VOFS = sCableCarPtr->unk_0009; + REG_BG0CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_WRAP; + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29) | BGCNT_WRAP; + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(30) | BGCNT_WRAP; + REG_BG3CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_WRAP; + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + REG_BLDCNT = 0x3f00; + break; + } +} + +static void LoadSprites(void) +{ + u8 spriteId; + u8 i; + + u8 playerGraphicsIds[2] = { + MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, + MAP_OBJ_GFX_RIVAL_MAY_NORMAL + }; + u16 rval = Random(); + u8 hikerGraphicsIds[4] = { + MAP_OBJ_GFX_HIKER, + MAP_OBJ_GFX_CAMPER, + MAP_OBJ_GFX_PICNICKER, + MAP_OBJ_GFX_POOCHYENA + }; + s16 hikerCoords[2][2] = { + { 0, 80 }, + { 240, 146 } + }; + u8 hikerMovementDelayTable[4] = { + 0, + 60, + 120, + 170 + }; + void (*callbacks[2])(struct Sprite *) = { + sub_8123EB8, + sub_8123F44 + }; + + switch (gSpecialVar_0x8004) + { + case 0: + default: + spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0xc8, 0x49, 0x66); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = 0x08; + gSprites[spriteId].pos2.y = 0x10; + gSprites[spriteId].data[0] = 0xc8; + gSprites[spriteId].data[1] = 0x49; + } + spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0xb0, 0x2b, 0x67); + gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; + gSprites[spriteId].data[0] = 0xb0; + gSprites[spriteId].data[1] = 0x2b; + spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0xc8, 0x63, 0x65); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 4; + gSprites[spriteId].data[0] = 0xc8; + gSprites[spriteId].data[1] = 0x63; + sCableCarPtr->unk_0002 = 7; + sCableCarPtr->unk_0004 = 0x15e; + sub_807C9B4(WEATHER_SUNNY); + break; + case 1: + CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0x18, 0x1a, 0x0c, 0x03); + spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0x80, 0x27, 0x66); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = 0x08; + gSprites[spriteId].pos2.y = 0x10; + gSprites[spriteId].data[0] = 0x80; + gSprites[spriteId].data[1] = 0x27; + } + spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0x68, 0x09, 0x67); + gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; + gSprites[spriteId].data[0] = 0x68; + gSprites[spriteId].data[1] = 0x09; + spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0x80, 0x41, 0x65); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 4; + gSprites[spriteId].data[0] = 0x80; + gSprites[spriteId].data[1] = 0x41; + sCableCarPtr->unk_0002 = 2; + sCableCarPtr->unk_0004 = 0x109; + sub_807C9B4(WEATHER_ASH); + break; + } + for (i = 0; i < 9; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_8401D40[2], 16 * i + 0x60, 8 * i - 8, 0x68); + gSprites[spriteId].pos2.x = 8; + gSprites[spriteId].pos2.y = 8; + } + if ((rval % 64) == 0) + { + spriteId = AddPseudoFieldObject(hikerGraphicsIds[rval % 3], callbacks[gSpecialVar_0x8004], hikerCoords[gSpecialVar_0x8004][0], hikerCoords[gSpecialVar_0x8004][1], 0x6a); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 2; + gSprites[spriteId].pos2.x = -gSprites[spriteId].centerToCornerVecX; + gSprites[spriteId].pos2.y = -gSprites[spriteId].centerToCornerVecY; + if (gSpecialVar_0x8004 == 0) + { + if (rval % 2) + { + StartSpriteAnim(&gSprites[spriteId], 6); + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].pos1.y += 2; + } + else + { + StartSpriteAnim(&gSprites[spriteId], 7); + gSprites[spriteId].data[1] = 0; + } + } + else + { + if (rval % 2) + { + StartSpriteAnim(&gSprites[spriteId], 7); + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].pos1.y += 2; + } + else + { + StartSpriteAnim(&gSprites[spriteId], 6); + gSprites[spriteId].data[1] = 0; + } + } + gSprites[spriteId].data[2] = hikerMovementDelayTable[rval % 4]; + } + } +} + +static void sub_812446C(void) +{ + u8 i; + u8 j; + u8 k; + u8 offset; + + for (i = 0, k = 0, offset = 0x24 * (sCableCarPtr->unk_001b + 2); i < 3; i++) + { + for (j = 0; j < 12; j++) + { + sCableCarPtr->unk_0022[i][j] = *(eCableCar2->mtChimneyTilemap + (offset++)); + sCableCarPtr->unk_0022[i + 3][j] = eCableCar2->mtChimneyTilemap[k]; + sCableCarPtr->unk_0022[i + 6][j] = (eCableCar2->mtChimneyTilemap + 0x24)[k]; + k++; + } + } + sCableCarPtr->unk_001b = (sCableCarPtr->unk_001b + 1) % 3; +} + +static void sub_812453C(void) +{ + sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60; + sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f - sCableCarPtr->unk_001d; + sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 - sCableCarPtr->unk_001e; + sCableCarPtr->unk_001d++; + if ((sCableCarPtr->unk_001d % 4) == 0) + { + sCableCarPtr->unk_001e++; + } + if (sCableCarPtr->unk_001d > 16) + { + sub_81245F4(); + } +} + +static void sub_8124598(void) +{ + sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60; + sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f + sCableCarPtr->unk_001d; + sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 + sCableCarPtr->unk_001e; + sCableCarPtr->unk_001d++; + if ((sCableCarPtr->unk_001d % 4) == 0) + { + sCableCarPtr->unk_001e++; + } + if (sCableCarPtr->unk_001d > 16) + { + sub_812476C(); + } +} + +static void sub_81245F4(void) +{ + u8 i = 0; + + sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0; + sCableCarPtr->unk_001f = sCableCarPtr->unk_0008; + sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009; + sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 30) % 32; + sCableCarPtr->unk_0018 -= 2; + gUnknown_0203927A = (sCableCarPtr->unk_001a + 23) % 32; + for (i = 0; i < 9; i++) + { + gUnknown_02039278 = sCableCarPtr->unk_0019; + gUnknown_02039279 = (gUnknown_0203927A + i) % 32; + sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018]; + gUnknown_02039278 = (gUnknown_02039278 + 1) % 32; + sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1]; + } + gUnknown_02039278 = (sCableCarPtr->unk_0019 + 30) % 32; + CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, gUnknown_02039278, 0, 2, 32); + if (sCableCarPtr->unk_0018 == 0) + { + sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 29) % 32; + sCableCarPtr->unk_0018 = 12; + sub_812446C(); + gUnknown_02039278 = (sCableCarPtr->unk_001a + 1) % 32; + CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, 0, gUnknown_02039278, 32, 9); + } +} + +static void sub_812476C(void) +{ + u8 i = 0; + + sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0; + sCableCarPtr->unk_001f = sCableCarPtr->unk_0008; + sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009; + sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 2) % 32; + sCableCarPtr->unk_0018 += 2; + gUnknown_0203927D = sCableCarPtr->unk_001a; + for (i = 0; i < 9; i++) + { + gUnknown_0203927B = sCableCarPtr->unk_0019; + gUnknown_0203927C = (gUnknown_0203927D + i) % 32; + sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018]; + gUnknown_0203927B = (gUnknown_0203927B + 1) % 32; + sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1]; + } + gUnknown_0203927C = (sCableCarPtr->unk_001a + 23) % 32; + CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, sCableCarPtr->unk_0019, gUnknown_0203927C, 2, 9); + if (sCableCarPtr->unk_0018 == 10) + { + sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 3) % 32; + sCableCarPtr->unk_0018 = 0xfe; + sub_812446C(); + } +} + +static void sub_81248AC(u8 a0) +{ + switch (a0) + { + case 0: + default: + sCableCarPtr->unk_001b = 2; + sCableCarPtr->unk_0019 = 0; + sCableCarPtr->unk_001a = 20; + sCableCarPtr->unk_0018 = 12; + sub_812446C(); + sub_81245F4(); + break; + case 1: + sCableCarPtr->unk_001b = 2; + sCableCarPtr->unk_0019 = 28; + sCableCarPtr->unk_001a = 20; + sCableCarPtr->unk_0018 = 4; + sub_812446C(); + sub_812476C(); + break; + } + sCableCarPtr->unk_001c = 0; +} diff --git a/src/cable_car_util.c b/src/cable_car_util.c new file mode 100644 index 000000000..02bfbc195 --- /dev/null +++ b/src/cable_car_util.c @@ -0,0 +1,47 @@ +#include "global.h" +#include "cable_car_util.h" + +// static types + +// static declarations + +// rodata + +// text + +void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) +{ + u8 i; + u8 j; + u8 x; + u8 y; + + for (i = 0, y = top; i < height; i++) + { + for (x = left, j = 0; j < width; j++) + { + *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value; + x = (x + 1) % 32; + } + y = (y + 1) % 32; + } +} + +void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) +{ + u8 i; + u8 j; + u8 x; + u8 y; + const u16 *_src; + + for (i = 0, _src = src, y = top; i < height; i++) + { + for (x = left, j = 0; j < width; j++) + { + *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++; + x = (x + 1) % 32; + } + y = (y + 1) % 32; + } +} diff --git a/src/cable_club.c b/src/cable_club.c new file mode 100644 index 000000000..0da23c5f3 --- /dev/null +++ b/src/cable_club.c @@ -0,0 +1,1033 @@ +#include "global.h" +#include "battle.h" +#include "battle_records.h" +#include "cable_club.h" +#include "event_data.h" +#include "field_message_box.h" +#include "field_specials.h" +#include "field_weather.h" +#include "link.h" +#include "load_save.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "record_mixing.h" +#include "overworld.h" +#include "script.h" +#include "script_pokemon_80C4.h" +#include "constants/songs.h" +#include "sound.h" +#include "start_menu.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "trade.h" +#include "trainer_card.h" + +extern u16 gBattleTypeFlags; +extern const u8 gUnknown_081A4932[]; +extern const u8 gUnknown_081A4975[]; +extern const u8 gUnknown_081A49B6[]; +extern const u8 gUnknown_081A490C[]; +extern struct +{ + u8 field0; + u8 field1; +} gUnknown_020297D8; + +static void sub_8082F20(u8 taskId); +static void sub_8082F68(u8 taskId); +static void sub_8082FEC(u8 taskId); +static void sub_808303C(u8 taskId); +static void sub_80830E4(u8 taskId); +static void sub_8083188(u8 taskId); +static void sub_80831F8(u8 taskId); +static void sub_8083288(u8 taskId); +static void sub_8083314(u8 taskId); +static void sub_80833C4(u8 taskId); +static void sub_80833EC(u8 taskId); +static void sub_8083418(u8 taskId); +static bool8 sub_8083444(u8 taskId); +static void sub_808353C(u8 taskId); +static void sub_8083710(u8 taskId); +static void sub_8083760(u8 taskId); +static void sub_80837B4(u8 taskId); +static void sub_80837EC(u8 taskId); +static void sub_808382C(u8 taskId); +static void sub_8083958(void); +static void sub_80839DC(u8 taskId); +static void sub_8083AAC(u8 taskId); +static void sub_8083B44(u8 taskId); +static void sub_8083B6C(void); +static void sub_8083CA4(u8 taskId); +#if DEBUG +static u8 debug_sub_808B850(void); +#endif + +#ifdef GERMAN +const u8 TrainerCardColorName_Bronze[] = _("BRONZE"); +const u8 TrainerCardColorName_Copper[] = _("KUPFER"); +const u8 TrainerCardColorName_Silver[] = _("SILBER"); +const u8 TrainerCardColorName_Gold[] = _("GOLD"); +#else +const u8 TrainerCardColorName_Bronze[] = _("BRONZE"); +const u8 TrainerCardColorName_Copper[] = _("COPPER"); +const u8 TrainerCardColorName_Silver[] = _("SILVER"); +const u8 TrainerCardColorName_Gold[] = _("GOLD"); +#endif + +const u8 *const gTrainerCardColorNames[] = +{ + TrainerCardColorName_Bronze, + TrainerCardColorName_Copper, + TrainerCardColorName_Silver, + TrainerCardColorName_Gold, +}; + +#if DEBUG +u8 debug_sub_808A4D0(TaskFunc func) +{ + if (func == sub_8082F68) + return 1; + if (func == sub_8082FEC) + return 17; + if (func == sub_808303C) + return 18; + if (func == sub_8083188) + return 19; + if (func == sub_80830E4) + return 20; + if (func == sub_80831F8) + return 33; + if (func == sub_8083314) + return 2; + if (func == sub_80833C4) + return 3; + return 0; +} + +void debug_sub_808A55C(u8 taskId) +{ + s32 i; + + if (!gTasks[gTasks[taskId].data[0]].isActive) + { + if (gTasks[taskId].data[1] == 5) + DestroyTask(taskId); + gTasks[taskId].data[1]++; + } + + PrintHex(gShouldAdvanceLinkState, 2, 0, 2); + PrintHex((u8)gBlockSendBuffer[0], 22, 5, 4); + for (i = 0; i < 4; i++) + { + PrintHex(gLinkPlayerPending[i], 5 + i * 2, 0, 1); + PrintHex(gBlockRecvBuffer[i][0], 22, 6 + i, 4); + } + PrintHex(gLinkStatus, 15, 0, 8); + PrintHex(gLink.state, 2, 10, 2); + PrintHex(GetMultiplayerId(), 7, 12, 2); + PrintHex(GetBlockReceivedStatus(), 7, 10, 2); + PrintHex(gReceivedRemoteLinkPlayers, 2, 12, 1); + PrintHex(gSpecialVar_Result, 11, 8, 2); + PrintHex((gLinkStatus & 0x1C) >> 2, 11, 10, 2); + PrintHex(IsLinkConnectionEstablished(), 11, 12, 1); + PrintHex(IsLinkTaskFinished(), 15, 10, 1); + PrintHex(debug_sub_808A4D0(gTasks[gTasks[taskId].data[0]].func), 15, 12, 2); + PrintHex((uintptr_t)gLinkCallback, 2, 13, 8); + PrintHex(HasLinkErrorOccurred(), 2, 2, 1); + for (i = 0; i < 4; i++) + PrintHex(gLinkPlayers[i].linkType, 2 + i * 6, 3, 4); + PrintHex(REG_SIOCNT, 2, 6, 4); + PrintHex(debug_sub_808B850(), 25, 3, 1); +} +#endif + +static void sub_8082CD4(u8 arg0, u8 arg1) +{ +#if DEBUG + InitLinkTestBG_Unused(12, 0, 31, 2); +#endif + if (FindTaskIdByFunc(sub_8082F20) == 0xFF) + { + u8 taskId1; +#if DEBUG + u8 taskId2; +#endif + + taskId1 = CreateTask(sub_8082F20, 80); + gTasks[taskId1].data[1] = arg0; + gTasks[taskId1].data[2] = arg1; + +#if DEBUG + taskId2 = CreateTask(debug_sub_808A55C, 80); + gTasks[taskId2].data[0] = taskId1; +#endif + } +} + +static void sub_8082D18(u32 value) +{ + ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEFT_ALIGN, 1); + Menu_DrawStdWindowFrame(18, 10, 28, 13); + sub_8072BD8(gOtherText_PLink, 19, 11, 72); +} + +static void sub_8082D4C() +{ + Menu_EraseWindowRect(18, 10, 28, 13); +} + +static void sub_8082D60(u8 taskId, u8 arg1) +{ + s16 *data = &gTasks[taskId].data[3]; + + if (arg1 != *data) + { + if (arg1 <= 1) + sub_8082D4C(); + else + sub_8082D18(arg1); + *data = arg1; + } +} + +static u32 sub_8082D9C(u8 minPlayers, u8 maxPlayers) +{ + int playerCount; + + switch (GetLinkPlayerDataExchangeStatusTimed()) + { + case EXCHANGE_COMPLETE: + playerCount = GetLinkPlayerCount_2(); + if (minPlayers <= playerCount && playerCount <= maxPlayers) + return 1; + ConvertIntToDecimalStringN(gStringVar1, playerCount, STR_CONV_MODE_LEFT_ALIGN, 1); + return 4; + case EXCHANGE_TIMED_OUT: + return 0; + case EXCHANGE_IN_PROGRESS: + return 3; + default: + return 0; + } +} + +static bool32 sub_8082DF4(u8 taskId) +{ + if (HasLinkErrorOccurred() == TRUE) + { + gTasks[taskId].func = sub_8083418; + return TRUE; + } + return FALSE; +} + +static bool32 sub_8082E28(u8 taskId) +{ + if ((gMain.newKeys & B_BUTTON) + && IsLinkConnectionEstablished() == FALSE) + { + gTasks[taskId].func = sub_80833EC; + return TRUE; + } + return FALSE; +} + +static bool32 sub_8082E6C(u8 taskId) +{ + if (IsLinkConnectionEstablished()) + SetSuppressLinkErrorMessage(TRUE); + + if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].func = sub_80833EC; + return TRUE; + } + return FALSE; +} + +static bool32 sub_8082EB8(u8 taskId) +{ + if (GetSioMultiSI() == 1) + { + gTasks[taskId].func = sub_8083418; + return TRUE; + } + return FALSE; +} + +void unref_sub_8082EEC(u8 taskId) +{ + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] == 10) + { + sub_8007E9C(2); + DestroyTask(taskId); + } +} + +static void sub_8082F20(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[0] == 0) + { + OpenLinkTimed(); + sub_80082EC(); + ResetLinkPlayers(); + } + else if (data[0] > 9) + { + gTasks[taskId].func = sub_8082F68; + } + data[0]++; +} + +static void sub_8082F68(u8 taskId) +{ + u32 playerCount = GetLinkPlayerCount_2(); + + if (sub_8082E28(taskId) == TRUE + || sub_8082E6C(taskId) == TRUE + || playerCount < 2) + return; + + SetSuppressLinkErrorMessage(TRUE); + gTasks[taskId].data[3] = 0; + if (IsLinkMaster() == TRUE) + { + PlaySE(SE_PIN); + ShowFieldAutoScrollMessage(gUnknown_081A4932); + gTasks[taskId].func = sub_8082FEC; + } + else + { + PlaySE(SE_BOO); + ShowFieldAutoScrollMessage(gUnknown_081A49B6); + gTasks[taskId].func = sub_80831F8; + } +} + +static void sub_8082FEC(u8 taskId) +{ + if (sub_8082E28(taskId) == TRUE + || sub_8082EB8(taskId) == TRUE + || sub_8082DF4(taskId) == TRUE) + return; + + if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN) + { + gTasks[taskId].data[3] = 0; + gTasks[taskId].func = sub_808303C; + } +} + +static void sub_808303C(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + s32 linkPlayerCount = GetLinkPlayerCount_2(); + + if (sub_8082E28(taskId) == TRUE + || sub_8082EB8(taskId) == TRUE + || sub_8082DF4(taskId) == TRUE) + return; + + sub_8082D60(taskId, linkPlayerCount); + + if (!(gMain.newKeys & A_BUTTON)) + return; + +#if ENGLISH + if (linkPlayerCount < taskData[1]) + return; + + sub_80081C8(linkPlayerCount); + sub_8082D4C(); + ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); + ShowFieldAutoScrollMessage((u8 *)gUnknown_081A4975); + gTasks[taskId].func = sub_80830E4; +#elif GERMAN + if ((gLinkType == 0x2255 && (u32)linkPlayerCount > 1) + || (gLinkType != 0x2255 && taskData[1] <= linkPlayerCount)) + { + sub_80081C8(linkPlayerCount); + sub_8082D4C(); + ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); + ShowFieldAutoScrollMessage((u8 *)gUnknown_081A4975); + gTasks[taskId].func = sub_80830E4; + } +#endif +} + +static void sub_80830E4(u8 taskId) +{ + if (sub_8082E28(taskId) == TRUE + || sub_8082EB8(taskId) == TRUE + || sub_8082DF4(taskId) == TRUE) + return; + + if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN) + { + if (sub_800820C() != GetLinkPlayerCount_2()) + { + ShowFieldAutoScrollMessage(gUnknown_081A4932); + gTasks[taskId].func = sub_8082FEC; + } + else if (gMain.heldKeys & B_BUTTON) + { + ShowFieldAutoScrollMessage(gUnknown_081A4932); + gTasks[taskId].func = sub_8082FEC; + } + else if (gMain.heldKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_8007F4C(); + gTasks[taskId].func = sub_8083188; + } + } +} + +static void sub_8083188(u8 taskId) +{ + u8 local1 = gTasks[taskId].data[1]; + u8 local2 = gTasks[taskId].data[2]; + + if (sub_8082DF4(taskId) == TRUE + || sub_8083444(taskId) == TRUE) + return; + + if (GetLinkPlayerCount_2() != sub_800820C()) + { + gTasks[taskId].func = sub_8083418; + } + else + { + gSpecialVar_Result = sub_8082D9C(local1, local2); + if (gSpecialVar_Result != 0) + gTasks[taskId].func = sub_8083288; + } +} + +static void sub_80831F8(u8 taskId) +{ + u8 local1, local2; + + local1 = gTasks[taskId].data[1]; + local2 = gTasks[taskId].data[2]; + + if (sub_8082E28(taskId) == TRUE + || sub_8082DF4(taskId) == TRUE) + return; + +#if DEBUG + sub_8082D60(taskId, GetLinkPlayerCount_2()); +#endif + + gSpecialVar_Result = sub_8082D9C(local1, local2); + if (gSpecialVar_Result == 0) + return; + if (gSpecialVar_Result == 3) + { + sub_800832C(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80833C4; + } + else + { + gFieldLinkPlayerCount = GetLinkPlayerCount_2(); + gUnknown_03004860 = GetMultiplayerId(); + sub_80081C8(gFieldLinkPlayerCount); + TrainerCard_GenerateCardForPlayer((struct TrainerCard *)gBlockSendBuffer); + gTasks[taskId].func = sub_8083314; + } +} + +static void sub_8083288(u8 taskId) +{ + if (sub_8082DF4(taskId) == TRUE) + return; + + if (gSpecialVar_Result == 3) + { + sub_800832C(); + HideFieldMessageBox(); + gTasks[taskId].func = sub_80833C4; + } + else + { + gFieldLinkPlayerCount = GetLinkPlayerCount_2(); + gUnknown_03004860 = GetMultiplayerId(); + sub_80081C8(gFieldLinkPlayerCount); + TrainerCard_GenerateCardForPlayer((struct TrainerCard *)gBlockSendBuffer); + gTasks[taskId].func = sub_8083314; + sub_8007E9C(2); + } +} + +static void sub_8083314(u8 taskId) +{ + u8 index; + struct TrainerCard *trainerCards; + + if (sub_8082DF4(taskId) == TRUE) + return; + + if (GetBlockReceivedStatus() != sub_8008198()) + return; + + index = 0; + trainerCards = gTrainerCards; + for (index = 0; index < GetLinkPlayerCount(); index++) + { + void *src; + src = gBlockRecvBuffer[index]; + memcpy(&trainerCards[index], src, sizeof(struct TrainerCard)); + } + + SetSuppressLinkErrorMessage(FALSE); + ResetBlockReceivedFlags(); + HideFieldMessageBox(); + + if (gSpecialVar_Result == 1) + { +#if ENGLISH + u16 linkType; + linkType = gLinkType; + // FIXME: sub_8082D4C doesn't take any arguments + sub_8082D4C(0x4411, linkType); +#elif GERMAN + if (gLinkType != 0x4411) + { + if (gLinkType == 0x6601) + deUnkValue2 = 1; + } + sub_8082D4C(); +#endif + EnableBothScriptContexts(); + DestroyTask(taskId); + return; + } + + sub_800832C(); + gTasks[taskId].func = sub_80833C4; +} + +static void sub_80833C4(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers == FALSE) + { + sub_8082D4C(); + EnableBothScriptContexts(); + DestroyTask(taskId); + } +} + +static void sub_80833EC(u8 taskId) +{ + gSpecialVar_Result = 5; + sub_8082D4C(); + HideFieldMessageBox(); + EnableBothScriptContexts(); + DestroyTask(taskId); +} + +static void sub_8083418(u8 taskId) +{ + gSpecialVar_Result = 6; + sub_8082D4C(); + HideFieldMessageBox(); + EnableBothScriptContexts(); + DestroyTask(taskId); +} + +static bool8 sub_8083444(u8 taskId) +{ + gTasks[taskId].data[4]++; + if (gTasks[taskId].data[4] > 600) + { + gTasks[taskId].func = sub_8083418; + return TRUE; + } + + return FALSE; +} + +void sub_808347C(u8 arg0) +{ + u32 r3 = 2; + u32 r2 = 2; + + switch (gSpecialVar_0x8004) + { + case 1: + r3 = 2; + gLinkType = 0x2233; + break; + case 2: + r3 = 2; + gLinkType = 0x2244; + break; + case 5: + r3 = 4; + r2 = 4; + gLinkType = 0x2255; + break; + } + + sub_8082CD4(r3, r2); +} + +void sub_80834E4(void) +{ + gLinkType = 0x1133; + gBattleTypeFlags = 0; + sub_8082CD4(2, 2); +} + +void sub_808350C(void) +{ + gSpecialVar_Result = 0; + gLinkType = 0x3311; + gBattleTypeFlags = 0; + sub_8082CD4(2, 4); +} + +static void sub_808353C(u8 taskId) +{ + int playerCount; + int i; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (gSpecialVar_Result == 1) + { + playerCount = GetLinkPlayerCount(); + for (i = 0; i < playerCount; i++) + { + if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) + { + gSpecialVar_Result = 7; + sub_8008480(); + gTasks[taskId].data[0] = 1; + return; + } + } + } + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + case 1: + if (gReceivedRemoteLinkPlayers == FALSE) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } + break; + } +} + +void sub_80835D8(void) +{ + int taskId = FindTaskIdByFunc(sub_808353C); + + if (taskId == 0xFF) + { + taskId = CreateTask(sub_808353C, 80); + gTasks[taskId].data[0] = 0; + } +} + +void sub_8083614(void) +{ + gLinkType = 0x4411; + gBattleTypeFlags = 0; + sub_8082CD4(2, 4); +} + +void sub_808363C(void) +{ + gLinkType = 0x6601; + gBattleTypeFlags = 0; + sub_8082CD4(4, 4); +} + +u8 sub_8083664(void) +{ + if (FuncIsActiveTask(sub_8083710) != FALSE) + return 0xFF; + + switch (gSpecialVar_0x8004) + { + case 1: + gLinkType = 0x2233; + break; + case 2: + gLinkType = 0x2244; + break; + case 5: + gLinkType = 0x2255; + break; + case 3: + gLinkType = 0x1111; + break; + case 4: + gLinkType = 0x3322; + break; + } + + return CreateTask(sub_8083710, 80); +} + +static void sub_8083710(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[0] == 0) + { + OpenLink(); + ResetLinkPlayers(); + CreateTask(sub_8083C50, 80); + } + else if (data[0] >= 10) + { + gTasks[taskId].func = sub_8083760; + } + data[0]++; +} + +static void sub_8083760(u8 taskId) +{ + if (GetLinkPlayerCount_2() >= 2) + { + if (IsLinkMaster() == TRUE) + gTasks[taskId].func = sub_80837B4; + else + gTasks[taskId].func = sub_80837EC; + } +} + +static void sub_80837B4(u8 taskId) +{ + if (sub_800820C() == GetLinkPlayerCount_2()) + { + sub_8007F4C(); + gTasks[taskId].func = sub_80837EC; + } +} + +static void sub_80837EC(u8 taskId) +{ + if (gReceivedRemoteLinkPlayers == TRUE + && IsLinkPlayerDataExchangeComplete() == TRUE) + { + sub_800826C(); + sub_8007B14(); + DestroyTask(taskId); + } +} + +void sub_8083820(void) +{ + ScrSpecial_DoSaveDialog(); +} + +static void sub_808382C(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + FadeScreen(1, 0); + gLinkType = 0x2211; + ClearLinkCallback_2(); + task->data[0]++; + break; + case 1: + if (!gPaletteFade.active) + task->data[0]++; + break; + case 2: + task->data[1]++; + if (task->data[1] > 20) + task->data[0]++; + break; + case 3: + sub_800832C(); + task->data[0]++; + break; + case 4: + if (!gReceivedRemoteLinkPlayers) + task->data[0]++; + break; + case 5: + if (gLinkPlayers[0].trainerId & 1) + current_map_music_set__default_for_battle(BGM_BATTLE32); + else + current_map_music_set__default_for_battle(BGM_BATTLE20); + + switch (gSpecialVar_0x8004) + { + case 1: + gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK; + break; + case 2: + gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE; + break; + case 5: + ReducePlayerPartyToThree(); + gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI; + break; + } + + SetMainCallback2(sub_800E7C4); + gMain.savedCallback = sub_8083958; + DestroyTask(taskId); + break; + } +} + +static void sub_8083958(void) +{ + Overworld_ResetMapMusic(); + LoadPlayerParty(); + SavePlayerBag(); + sub_810FEFC(); + + if (gSpecialVar_0x8004 != 5) + UpdateLinkBattleRecords(gUnknown_03004860 ^ 1); + + gMain.savedCallback = sub_805465C; + SetMainCallback2(sub_8071B28); +} + +void sub_80839A4(void) +{ + if (gSpecialVar_0x8004 == 1 || gSpecialVar_0x8004 == 2 || gSpecialVar_0x8004 == 5) + { + LoadPlayerParty(); + SavePlayerBag(); + } + copy_saved_warp2_bank_and_enter_x_to_warp1(0x7F); +} + +void sub_80839D0(void) +{ + sub_805559C(); +} + +static void sub_80839DC(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + ShowFieldMessage(gUnknown_081A490C); + task->data[0] = 1; + break; + case 1: + if (IsFieldMessageBoxHidden()) + { + sub_8055574(); + sub_8007270(gSpecialVar_0x8005); + task->data[0] = 2; + } + break; + case 2: + switch (sub_80554F8()) + { + case 0: + break; + case 1: + HideFieldMessageBox(); + task->data[0] = 0; + SwitchTaskToFollowupFunc(taskId); + break; + case 2: + task->data[0] = 3; + break; + } + break; + case 3: + sub_8055588(); + HideFieldMessageBox(); + Menu_EraseScreen(); + DestroyTask(taskId); + EnableBothScriptContexts(); + break; + } +} + +void sub_8083A84(TaskFunc followupFunc) +{ + u8 taskId = CreateTask(sub_80839DC, 80); + SetTaskFuncWithFollowupFunc(taskId, sub_80839DC, followupFunc); + ScriptContext1_Stop(); +} + +static void sub_8083AAC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + ScriptContext2_Enable(); + FadeScreen(1, 0); + ClearLinkCallback_2(); + task->data[0]++; + break; + case 1: + if (!gPaletteFade.active) + task->data[0]++; + break; + case 2: + gUnknown_020297D8.field0 = 0; + gUnknown_020297D8.field1 = 0; + m4aMPlayAllStop(); + sub_800832C(); + task->data[0]++; + break; + case 3: + if (!gReceivedRemoteLinkPlayers) + { + SetMainCallback2(sub_8047CD8); + DestroyTask(taskId); + } + break; + } +} + +static void sub_8083B44(u8 taskId) +{ + sub_8083B6C(); + DestroyTask(taskId); +} + +void sub_8083B5C(void) +{ + sub_8083A84(sub_8083B44); +} + +static void sub_8083B6C(void) +{ + CreateTask(sub_8083AAC, 80); +} + +void sub_8083B80(void) +{ + sub_8083B6C(); + ScriptContext1_Stop(); +} + +void sub_8083B90(void) +{ + gLinkType = 0x2211; + sub_8083A84(sub_808382C); +} + +void unref_sub_8083BB0(void) +{ + u8 taskId = CreateTask(sub_80839DC, 80); + SetTaskFuncWithFollowupFunc(taskId, sub_80839DC, Task_RecordMixing_Main); + ScriptContext1_Stop(); +} + +void sub_8083BDC(void) +{ + TrainerCard_ShowLinkCard(gSpecialVar_0x8006, c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +bool32 sub_8083BF4(u8 linkPlayerIndex) +{ + u32 trainerCardColorIndex; + + gSpecialVar_0x8006 = linkPlayerIndex; + StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name); + + trainerCardColorIndex = sub_80934C4(linkPlayerIndex); + if (trainerCardColorIndex == 0) + return FALSE; + + StringCopy(gStringVar2, gTrainerCardColorNames[trainerCardColorIndex - 1]); + return TRUE; +} + +void sub_8083C50(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->data[0]++; + if (task->data[0] > 300) + { + CloseLink(); + SetMainCallback2(CB2_LinkError); + DestroyTask(taskId); + } + + if (gReceivedRemoteLinkPlayers) + DestroyTask(taskId); +} + +#if DEBUG +extern u16 unk_3004E94; +extern u32 unk_3004E98; + +static void debug_sub_808B7A8(u8); + +void debug_sub_808B778(void) +{ + if (!FuncIsActiveTask(debug_sub_808B7A8)) + CreateTask(debug_sub_808B7A8, 80); + unk_3004E98++; +} + +static void debug_sub_808B7A8(u8 taskId) +{ + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] == 30) + { + gTasks[taskId].data[0] = 0; + unk_3004E94 |= 1; + } +} +#endif + +static void sub_8083CA4(u8 taskId) +{ + if (!gReceivedRemoteLinkPlayers) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } +} + +void unref_sub_8083CC8(u8 taskId) +{ + sub_800832C(); + gTasks[taskId].func = sub_8083CA4; +} + +#if DEBUG +EWRAM_DATA static u8 unk_2030220 = 0; + +void debug_sub_808B82C(void) +{ + unk_2030220 = 0; +} + +void debug_sub_808B838(u8 a) +{ + unk_2030220 |= 1 << a; +} + +static u8 debug_sub_808B850(void) +{ + return unk_2030220; +} +#endif diff --git a/src/choose_party.c b/src/choose_party.c new file mode 100644 index 000000000..4766b2fbb --- /dev/null +++ b/src/choose_party.c @@ -0,0 +1,968 @@ +#include "global.h" +#include "event_data.h" +#include "field_fadetransition.h" +#include "main.h" +#include "menu.h" +#include "name_string_util.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon_menu.h" +#include "field_weather.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "overworld.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "strings.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "ewram.h" + +extern u8 gPlayerPartyCount; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gUnknown_020384F0; +extern struct UnknownPokemonStruct2 gUnknown_02023A00[3]; +extern u8 gUnknown_0202E8F6; +extern struct Pokemon gUnknown_030042FC[]; +extern const u16 gBattleTowerBannedSpecies[]; + +EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; + +extern u8 sub_806BD58(u8, u8); +extern void PartyMenuPrintMonsLevelOrStatus(void); +extern void sub_806BC3C(u8, u8); +extern u8 GetMonStatusAndPokerus(); +extern void PartyMenuPrintHP(); +extern bool8 sub_80F9344(void); + +static void ClearPartySelection(void); +static bool8 IsMonAllowedInBattleTower(struct Pokemon *); +static void sub_812238C(u8); +static void sub_8122450(u8); +static void sub_81224A8(u8); +static void sub_8122728(u8); +static void BattleTowerEntryMenuCallback_Exit(u8); +static void sub_81228E8(u8); +static void sub_8122950(u8); +static void sub_81229B8(void); +static void sub_8122AB8(u8); +static void sub_8122B10(u8); +static void sub_8122C18(u8); +static void Task_DaycareStorageMenu8122EAC(u8); +void sub_8123138(u8); +static void sub_8123170(u8); +static void sub_81231AC(void); + +void sub_8121E10(void) +{ + ClearPartySelection(); + ewram1B000.unk263 = 0; + OpenPartyMenu(PARTY_MENU_TYPE_BATTLE_TOWER, 0); +} + +void sub_8121E34(void) +{ + ClearPartySelection(); + ewram1B000.unk263 = 1; + OpenPartyMenu(PARTY_MENU_TYPE_BATTLE_TOWER, 0); +} + +static void ClearPartySelection(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + gSelectedOrderFromParty[i] = 0; +} + +bool8 SetupBattleTowerPartyMenu(void) +{ + u8 i; + + switch (ewram1B000_alt.setupState) + { + case 0: + if (ewram1B000_alt.monIndex < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); + ewram1B000_alt.monIndex++; + } + else + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.setupState++; + break; + case 2: + CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; + break; + case 3: + if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) == 1) + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; + } + else + { + ewram1B000_alt.monIndex++; + } + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + ewram1B000_alt.setupState++; + break; + case 5: + PrintPartyMenuMonNicknames(); + ewram1B000_alt.setupState++; + break; + case 6: + for (i = 0; i < gPlayerPartyCount; i++) + { + u8 j; + + for (j = 0; j < 3; j++) + { + if (gSelectedOrderFromParty[j] == i + 1) + { + sub_806BC3C(i, j * 14 + 0x1C); + break; + } + } + if (j == 3) + { + if (IsMonAllowedInBattleTower(&gPlayerParty[i]) == TRUE) + sub_806BC3C(i, 0x70); + else + sub_806BC3C(i, 0x7E); + } + } + ewram1B000_alt.setupState++; + break; + case 7: + if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState = 0; + return TRUE; + } + else + { + ewram1B000_alt.monIndex++; + } + break; + } + return FALSE; +} + +static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) +{ + u16 species; + s32 i = 0; + + if (GetMonData(pkmn, MON_DATA_IS_EGG)) + return FALSE; + + if (ewram1B000.unk263 == 0) + { + if (GetMonData(pkmn, MON_DATA_HP) == 0) + return FALSE; + else + return TRUE; + } + + if ((gSaveBlock2.battleTower.battleTowerLevelType) == 0 + && GetMonData(pkmn, MON_DATA_LEVEL) > 50) + return FALSE; + + // Check if the pkmn is in the ban list + species = GetMonData(pkmn, MON_DATA_SPECIES); + while (gBattleTowerBannedSpecies[i] != 0xFFFF) + { + if (gBattleTowerBannedSpecies[i] == species) + return FALSE; + i++; + } + return TRUE; +} + +static u8 sub_81220C8(void) +{ + u8 i; + + if (ewram1B000.unk263 == 0) + return 0xFF; + if (gSelectedOrderFromParty[2] == 0) + return 0x11; + for (i = 0; i < 2; i++) + { + u8 j; + + ewram1B000.unk282 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_SPECIES); + ewram1B000.unk280 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_HELD_ITEM); + for (j = i + 1; j < 3; j++) + { + if (ewram1B000.unk282 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_SPECIES)) + return 0x12; + if (ewram1B000.unk280 != 0 && ewram1B000.unk280 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_HELD_ITEM)) + return 0x13; + } + } + return 0xFF; +} + +//------------------------------------------------------------------------------ +// Battle Tower Entry Menu +//------------------------------------------------------------------------------ + +static void BattleTowerEntryMenuCallback_Summary(u8); +static void BattleTowerEntryMenuCallback_Enter(u8); +static void BattleTowerEntryMenuCallback_NoEntry(u8); +static void BattleTowerEntryMenuCallback_Exit(u8); + +static const struct MenuAction2 sBattleTowerEntryMenuItems[] = +{ + {OtherText_Summary, BattleTowerEntryMenuCallback_Summary}, + {OtherText_Enter2, BattleTowerEntryMenuCallback_Enter}, + {OtherText_NoEntry, BattleTowerEntryMenuCallback_NoEntry}, + {gUnknownText_Exit, BattleTowerEntryMenuCallback_Exit}, +}; + +static const u8 gUnknown_084017D0[] = {1, 0, 3}; +static const u8 gUnknown_084017D3[] = {2, 0, 3}; +static const u8 gUnknown_084017D6[] = {0, 3}; + +static const struct PartyPopupMenu sBattleTowerEntryMenu[] = +{ + {ARRAY_COUNT(gUnknown_084017D0), 9, gUnknown_084017D0}, + {ARRAY_COUNT(gUnknown_084017D3), 9, gUnknown_084017D3}, + {ARRAY_COUNT(gUnknown_084017D6), 9, gUnknown_084017D6}, +}; + + +static bool8 IsPartyMemberAlreadySelected(u8 partyMember) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == partyMember) + return TRUE; + } + return FALSE; +} + +static void sub_81221F8(u8 taskId) +{ + PrintPartyMenuPromptText(5, 1); + if (IsMonAllowedInBattleTower(&gPlayerParty[gLastFieldPokeMenuOpened]) == TRUE) + { + if (IsPartyMemberAlreadySelected(gLastFieldPokeMenuOpened + 1) == TRUE) + { + gTasks[taskId].data[4] = 1; + ShowPartyPopupMenu(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } + else + { + gTasks[taskId].data[4] = 0; + ShowPartyPopupMenu(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } + } + else + { + gTasks[taskId].data[4] = 2; + ShowPartyPopupMenu(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } +} + +void HandleBattleTowerPartyMenu(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (HandleBattleTowerPartyMenuInput(taskId)) + { + case A_BUTTON: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = sub_806CA38(taskId); + if (gLastFieldPokeMenuOpened != 6) + { + GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); + sub_81221F8(taskId); + gTasks[taskId].func = sub_812238C; + } + else + { + gTasks[taskId].func = sub_81224A8; + } + sub_808B5B4(taskId); + break; + case B_BUTTON: + PlaySE(SE_SELECT); + ClearPartySelection(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + break; + } + } +} + +// Handle input +static void sub_812238C(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & 0x40) + { + if (Menu_GetCursorPos() != 0) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + return; + } + if (gMain.newAndRepeatedKeys & 0x80) + { + if (Menu_GetCursorPos() != 3) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + return; + } + if (gMain.newKeys & A_BUTTON) + { + TaskFunc popupMenuFunc; + + PlaySE(SE_SELECT); + popupMenuFunc = PartyMenuGetPopupMenuFunc( + gTasks[taskId].data[4], + sBattleTowerEntryMenu, + sBattleTowerEntryMenuItems, + Menu_GetCursorPos()); + popupMenuFunc(taskId); + return; + } + if (gMain.newKeys & B_BUTTON) + { + BattleTowerEntryMenuCallback_Exit(taskId); + return; + } + } +} + +// Return from menu? +static void sub_8122450(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(gMain.savedCallback); + DestroyTask(taskId); + } +} + +// Wait for A or B press +static void sub_8122480(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + BattleTowerEntryMenuCallback_Exit(taskId); +} + +static void sub_81224A8(u8 taskId) +{ + u8 val = sub_81220C8(); + + if (val != 0xFF) + { + PrintPartyMenuPromptText(val, 0); + gTasks[taskId].func = sub_8122480; + } + else + { + if (gSelectedOrderFromParty[0] != 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + } + else + { + PlaySE(SE_HAZURE); + PrintPartyMenuPromptText(14, 0); + gTasks[taskId].func = sub_8122480; + } + } +} + +// CB2 for menu? +static void sub_8122530(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(ewram1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangeBattleTowerPartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); + GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); + gLastFieldPokeMenuOpened = gUnknown_020384F0; + sub_81221F8(ewram1B000.menuHandlerTaskId); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == 1) + break; + } +} + +static void sub_81225A4(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + SetPartyMenuSettings(PARTY_MENU_TYPE_BATTLE_TOWER, 0xFF, sub_812238C, 5); + SetMainCallback2(sub_8122530); +} + +// Wait for fade, then show summary screen +static void sub_81225D4(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data[0]; + + DestroyTask(taskId); + ewram1B000.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, PSS_MODE_NORMAL); + } +} + +// Summary callback? +static void BattleTowerEntryMenuCallback_Summary(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_81225D4; +} + +static void BattleTowerEntryMenuCallback_Enter(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == 0) + { + gSelectedOrderFromParty[i] = gLastFieldPokeMenuOpened + 1; + sub_806BC3C(gLastFieldPokeMenuOpened, i * 14 + 0x1C); + if (i == 2) + SelectBattleTowerOKButton(taskId); + BattleTowerEntryMenuCallback_Exit(taskId); + return; + } + } + PlaySE(SE_HAZURE); + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); + sub_806D5A4(); + sub_806E834(gOtherText_NoMoreThreePoke, 1); + gTasks[taskId].func = sub_8122728; +} + +static void sub_8122728(u8 taskId) +{ + if (gUnknown_0202E8F6 == 1) + return; + + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + Menu_EraseWindowRect(0, 14, 29, 19); + Menu_DestroyCursor(); + BattleTowerEntryMenuCallback_Exit(taskId); + } +} + +static void BattleTowerEntryMenuCallback_NoEntry(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == gLastFieldPokeMenuOpened + 1) + { + gSelectedOrderFromParty[i] = 0; + switch (i) + { + case 0: + gSelectedOrderFromParty[0] = gSelectedOrderFromParty[1]; + gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; + gSelectedOrderFromParty[2] = 0; + break; + case 1: + gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; + gSelectedOrderFromParty[2] = 0; + break; + } + break; // exit loop + } + } + sub_806BC3C(gLastFieldPokeMenuOpened, 0x70); + if (gSelectedOrderFromParty[0] != 0) + sub_806BC3C(gSelectedOrderFromParty[0] - 1, 0x1C); + if (gSelectedOrderFromParty[1] != 0) + sub_806BC3C(gSelectedOrderFromParty[1] - 1, 0x2A); + BattleTowerEntryMenuCallback_Exit(taskId); +} + +static void sub_81227FC(u8 taskId) +{ + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); + PrintPartyMenuPromptText(0, 0); + gTasks[taskId].func = HandleBattleTowerPartyMenu; +} + +static void BattleTowerEntryMenuCallback_Exit(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_81227FC(taskId); +} + +#if DEBUG + +void debug_sub_81381B4(void) +{ + u8 i; + + memset(gUnknown_02023A00, 0, sizeof(gUnknown_02023A00)); + for (i = 0; i < 3; i++) + { + gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[3 + i], MON_DATA_SPECIES2); + if (gUnknown_02023A00[i].species != 0) + { + gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[3 + i], MON_DATA_LEVEL); + gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[3 + i], MON_DATA_HP); + gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[3 + i], MON_DATA_MAX_HP); + gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[3 + i], MON_DATA_STATUS); + gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM); + gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[3 + i], MON_DATA_PERSONALITY); + gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[3 + i]); + GetMonData(&gPlayerParty[3 + i], MON_DATA_NICKNAME, gUnknown_02023A00[i].nickname); + Text_StripExtCtrlCodes(gUnknown_02023A00[i].nickname); + gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[3 + i], MON_DATA_LANGUAGE); + } + } +} + +#endif + +bool8 SetupLinkMultiBattlePartyMenu(void) +{ + switch (ewram1B000_alt.setupState) + { + case 0: + sub_81228E8(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.setupState++; + break; + case 2: + sub_8122950(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; + break; + case 3: + sub_81229B8(); + ewram1B000_alt.setupState++; + break; + case 4: + sub_806B908(); + return TRUE; + } + return FALSE; +} + +static void sub_81228E8(u8 a) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + CreatePartyMenuMonIcon(a, i, 3, &gPlayerParty[i]); + if (gUnknown_02023A00[i].species != 0) + { + CreateMonIcon_LinkMultiBattle(a, i + 3, 3, &gUnknown_02023A00[i]); + sub_806D50C(a, i + 3); + } + } +} + +static void sub_8122950(u8 a) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + { + u16 item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + + CreateHeldItemIcon_806DCD4(a, i, item); + } + if (gUnknown_02023A00[i].species != 0) + CreateHeldItemIcon_806DCD4(a, i + 3, gUnknown_02023A00[i].heldItem); + } +} + +static void sub_81229B8(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + { + u8 status; + + PartyMenuPrintHP(i, 3, &gPlayerParty[i]); + status = GetMonStatusAndPokerus(&gPlayerParty[i]); + if (status != 0 && status != 6) + PartyMenuPutStatusTilemap(i, 3, status - 1); + else + PartyMenuPrintLevel(i, 3, &gPlayerParty[i]); + PartyMenuPrintGenderIcon(i, 3, &gPlayerParty[i]); + PrintPartyMenuMonNickname(i, 3, &gPlayerParty[i]); + PartyMenuDrawHPBar(i, 3, &gPlayerParty[i]); + } + } +} + +void HandleLinkMultiBattlePartyMenu(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].data[0] = 30; + sub_806D4AC(taskId, gUnknown_02023A00[0].species, 0); + sub_806D4AC(taskId, gUnknown_02023A00[1].species, 1); + sub_806D4AC(taskId, gUnknown_02023A00[2].species, 2); + gTasks[taskId].func = sub_8122AB8; + ewram1B000.unk261 = 1; + } +} + +static void sub_8122AB8(u8 taskId) +{ + sub_806D3B4(taskId, gUnknown_02023A00[1].species, gUnknown_02023A00[2].species); + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].func = sub_8122B10; + ewram1B000.unk261 = 2; + PlaySE(SE_W231); + } +} + +static void sub_8122B10(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gUnknown_02023A00[i].species != 0) + { + u8 r2; + + PartyMenuDoPrintHP(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); + if (gUnknown_02023A00[i].hp == 0) + r2 = 7; + else + r2 = pokemon_ailments_get_primary(gUnknown_02023A00[i].status); + if (r2 != 0) + PartyMenuPutStatusTilemap(i + 3, 3, r2 - 1); + else + PartyMenuDoPrintLevel(i + 3, 3, gUnknown_02023A00[i].level); + PartyMenuDoPrintGenderIcon(gUnknown_02023A00[i].species, gUnknown_02023A00[i].gender, 3, i + 3, gUnknown_02023A00[i].nickname); + StringCopy(gStringVar1, gUnknown_02023A00[i].nickname); + StringGetEnd10(gStringVar1); + SanitizeNameString(gStringVar1); + PartyMenuDoPrintMonNickname(i + 3, 3, gStringVar1); + PartyMenuDoDrawHPBar(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); + } + } + gTasks[taskId].func = sub_8122C18; + gTasks[taskId].data[0] = 0; +} + +static void sub_8122C18(u8 taskId) +{ + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] == 256) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + } +} + +// Exactly the same as SetupBattleTowerPartyMenu except for case 6 +bool8 unref_sub_8122C60(void) +{ + switch (ewram1B000_alt.setupState) + { + case 0: + if (ewram1B000_alt.monIndex < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); + ewram1B000_alt.monIndex++; + } + else + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.setupState++; + break; + case 2: + CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; + break; + case 3: + if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) == 1) + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; + } + else + { + ewram1B000_alt.monIndex++; + } + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + ewram1B000_alt.setupState++; + break; + case 5: + PrintPartyMenuMonNicknames(); + ewram1B000_alt.setupState++; + break; + case 6: + sub_806BCE8(); + ewram1B000_alt.setupState++; + break; + case 7: + if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState = 0; + return TRUE; + } + else + { + ewram1B000_alt.monIndex++; + } + break; + } + return FALSE; +} + +//------------------------------------------------------------------------------ +// Daycare Pokemon Storage Menu +//------------------------------------------------------------------------------ + +static void DaycareStorageMenuCallback_Store(u8); +static void DaycareStorageMenuCallback_Summary(u8); +static void DaycareStorageMenuCallback_Exit(u8); + +static const struct MenuAction2 sDaycareStorageMenuItems[] = +{ + {OtherText_Store, DaycareStorageMenuCallback_Store}, + {OtherText_Summary, DaycareStorageMenuCallback_Summary}, + {gUnknownText_Exit, DaycareStorageMenuCallback_Exit}, +}; + +static const u8 gUnknown_08401808[] = {0, 1, 2}; +static const u8 gUnknown_0840180B[] = {1, 2}; + +static const struct PartyPopupMenu sDaycareStorageMenus[] = +{ + {ARRAY_COUNT(gUnknown_08401808), 9, gUnknown_08401808}, + {ARRAY_COUNT(gUnknown_0840180B), 9, gUnknown_0840180B}, +}; + +static void sub_8122D94(u8 taskId) +{ + if (!GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) + { + gTasks[taskId].data[4] = 0; + ShowPartyPopupMenu(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); + } + else + { + gTasks[taskId].data[4] = 1; + ShowPartyPopupMenu(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); + } +} + +void HandleDaycarePartyMenu(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (HandleDefaultPartyMenuInput(taskId)) + { + case A_BUTTON: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = sub_806CA38(taskId); + GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); + sub_8122D94(taskId); + gTasks[taskId].func = Task_DaycareStorageMenu8122EAC; + break; + case B_BUTTON: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = 0xFF; + gSpecialVar_0x8004 = 0xFF; + sub_8123138(taskId); + break; + } + } +} + +static void Task_DaycareStorageMenu8122EAC(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & 0x40) + { + if (Menu_GetCursorPos() != 0) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + return; + } + if (gMain.newAndRepeatedKeys & 0x80) + { + if (Menu_GetCursorPos() != 3) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + return; + } + if (gMain.newKeys & A_BUTTON) + { + TaskFunc popupMenuFunc; + + PlaySE(SE_SELECT); + popupMenuFunc = PartyMenuGetPopupMenuFunc( + gTasks[taskId].data[4], + sDaycareStorageMenus, + sDaycareStorageMenuItems, + Menu_GetCursorPos()); + popupMenuFunc(taskId); + return; + } + if (gMain.newKeys & B_BUTTON) + { + DaycareStorageMenuCallback_Exit(taskId); + return; + } + } +} + +static void DaycareStorageMenuCallback_Store(u8 taskId) +{ + gSpecialVar_0x8004 = gLastFieldPokeMenuOpened; + sub_8123138(taskId); +} + +static void sub_8122F90(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(ewram1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); + GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); + gLastFieldPokeMenuOpened = gUnknown_020384F0; + sub_8122D94(ewram1B000.menuHandlerTaskId); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == 1) + break; + } +} + +static void sub_8123004(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + SetPartyMenuSettings(PARTY_MENU_TYPE_DAYCARE, 0xFF, Task_DaycareStorageMenu8122EAC, 5); + SetMainCallback2(sub_8122F90); +} + +static void sub_8123034(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data[0]; + + DestroyTask(taskId); + ewram1B000.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, PSS_MODE_NORMAL); + } +} + +static void DaycareStorageMenuCallback_Summary(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8123034; +} + +static void DaycareStorageMenuCallback_Exit(u8 taskId) +{ + PlaySE(SE_SELECT); + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); + PrintPartyMenuPromptText(15, 0); + gTasks[taskId].func = HandleDaycarePartyMenu; +} + +void sub_8123138(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8123170; +} + +static void sub_8123170(u8 taskId) +{ + if (!gPaletteFade.active) + { + gFieldCallback = sub_81231AC; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + } +} + +// Do these last two functions really belong in here? + +static void sub_81231C4(u8); + +void sub_81231AC(void) +{ + pal_fill_black(); + CreateTask(sub_81231C4, 10); +} + +static void sub_81231C4(u8 taskId) +{ + if (IsWeatherNotFadingIn() == TRUE) + { + DestroyTask(taskId); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} diff --git a/src/clear_save_data_menu.c b/src/clear_save_data_menu.c new file mode 100644 index 000000000..b6053715a --- /dev/null +++ b/src/clear_save_data_menu.c @@ -0,0 +1,177 @@ +#include "global.h" +#include "clear_save_data_menu.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "save.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings2.h" +#include "task.h" + +static void VBlankCB_ClearSaveDataScreen(void); +static void Task_InitMenu(u8); +static void Task_ProcessMenuInput(u8); +static void Task_ClearSaveData(u8); +static void CB2_ClearSaveDataScreen(void); +static void VBlankCB_InitClearSaveDataScreen(void); +static u8 InitClearSaveDataScreen(void); +static void CB2_SoftReset(void); + +void CB2_InitClearSaveDataScreen(void) +{ + if (InitClearSaveDataScreen()) + { + CreateTask(Task_InitMenu, 0); + } +} + +static void VBlankCB_ClearSaveDataScreen(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void Task_InitMenu(u8 taskId) +{ + ResetSpriteData(); + + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + + SetVBlankCallback(VBlankCB_ClearSaveDataScreen); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gSystemText_ClearAllSaveDataPrompt, 3, 15); + + Menu_DrawStdWindowFrame(2, 1, 8, 6); + Menu_PrintItems(3, 2, 2, gMenuYesNoItems); + InitMenu(0, 3, 2, 2, 1, 5); + + gTasks[taskId].func = Task_ProcessMenuInput; +} + +static void Task_ProcessMenuInput(u8 taskId) +{ + switch (Menu_ProcessInputNoWrap_()) + { + case 0: + PlaySE(SE_SELECT); + sub_8071F40(gSystemText_ClearingData); + gTasks[taskId].func = Task_ClearSaveData; + break; + case -1: + case 1: + PlaySE(SE_SELECT); + DestroyTask(taskId); + SetMainCallback2(CB2_SoftReset); + break; + } + AnimateSprites(); + BuildOamBuffer(); +} + +static void Task_ClearSaveData(u8 taskId) +{ + Save_EraseAllData(); + DestroyTask(taskId); + SetMainCallback2(CB2_SoftReset); +} + +static void CB2_ClearSaveDataScreen(void) +{ + RunTasks(); + UpdatePaletteFade(); +} + +static void VBlankCB_InitClearSaveDataScreen(void) +{ + TransferPlttBuffer(); +} + +static u8 InitClearSaveDataScreen(void) +{ + u16 i; + u16 ime; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + + ResetPaletteFade(); + + gPlttBufferUnfaded[0] = 0x7fff; + gPlttBufferFaded[0] = 0x7fff; + gPlttBufferUnfaded[1] = 0x3945; + gPlttBufferFaded[1] = 0x3945; + + for (i = 0; i < 0x10; i++) + ((u16 *)(VRAM + 0x20))[i] = 0x1111; + + for (i = 0; i < 0x500; i++) + ((u16 *)(VRAM + 0x3800))[i] = 0x0001; + + ResetTasks(); + ResetSpriteData(); + + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xffff); + + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(VBlankCB_InitClearSaveDataScreen); + + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG3_ON; + gMain.state = 1; + return 0; + case 1: + UpdatePaletteFade(); + if (gPaletteFade.active) + return 0; + SetMainCallback2(CB2_ClearSaveDataScreen); + return 1; + } +} + +static void CB2_SoftReset(void) +{ + switch (gMain.state) + { + case 0: + default: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xffff); + gMain.state = 1; + break; + case 1: + UpdatePaletteFade(); + if (gPaletteFade.active) + return; + DoSoftReset(); + break; + } +} diff --git a/src/clock.c b/src/clock.c new file mode 100644 index 000000000..fceccdfcb --- /dev/null +++ b/src/clock.c @@ -0,0 +1,88 @@ +#include "global.h" +#include "clock.h" +#include "berry.h" +#include "dewford_trend.h" +#include "event_data.h" +#include "field_specials.h" +#include "field_weather.h" +#include "lottery_corner.h" +#include "main.h" +#include "overworld.h" +#include "rtc.h" +#include "time_events.h" +#include "tv.h" +#include "wallclock.h" + +static void UpdatePerDay(struct Time *time); +static void UpdatePerMinute(struct Time *time); +static void ReturnFromStartWallClock(void); + +void InitTimeBasedEvents(void) +{ + FlagSet(FLAG_SYS_CLOCK_SET); + RtcCalcLocalTime(); + gSaveBlock2.lastBerryTreeUpdate = gLocalTime; + VarSet(VAR_DAYS, gLocalTime.days); +} + +void DoTimeBasedEvents(void) +{ + if (FlagGet(FLAG_SYS_CLOCK_SET)) + { + RtcCalcLocalTime(); + UpdatePerDay(&gLocalTime); + UpdatePerMinute(&gLocalTime); + } +} + +static void UpdatePerDay(struct Time *time) +{ + u16 *varPtr = GetVarPointer(VAR_DAYS); + int days = *varPtr; + u16 newDays; + + if (days != time->days && days <= time->days) + { + newDays = time->days - days; + ClearDailyFlags(); + UpdateDewfordTrendPerDay(newDays); + UpdateTVShowsPerDay(newDays); + UpdateWeatherPerDay(newDays); + UpdatePartyPokerusTime(newDays); + UpdateMirageRnd(newDays); + UpdateBirchState(newDays); + SetShoalItemFlag(newDays); + SetRandomLotteryNumber(newDays); + *varPtr = time->days; + } +} + +static void UpdatePerMinute(struct Time *time) +{ + struct Time newTime; + s32 minutesPassed; + + CalcTimeDifference(&newTime, &gSaveBlock2.lastBerryTreeUpdate, time); + minutesPassed = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes; + + if (minutesPassed == 0) // do not do the update for the first minute. + return; + + if (minutesPassed > -1) // do not perform an update on invalid minutesPassed. + { + BerryTreeTimeUpdate(minutesPassed); + gSaveBlock2.lastBerryTreeUpdate = *time; + } +} + +static void ReturnFromStartWallClock(void) +{ + InitTimeBasedEvents(); + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void StartWallClock(void) +{ + SetMainCallback2(CB2_StartWallClock); + gMain.savedCallback = ReturnFromStartWallClock; +} diff --git a/src/coins.c b/src/coins.c new file mode 100644 index 000000000..2c217e635 --- /dev/null +++ b/src/coins.c @@ -0,0 +1,84 @@ +#include "global.h" +#include "coins.h" +#include "menu.h" +#include "string_util.h" +#include "strings.h" + +#define MAX_COINS 9999 + +void UpdateCoinsWindow(s32 coins, u8 x, u8 y) +{ + PrintCoins(coins, 4, x + 2, y + 1); +} + +void ShowCoinsWindow(u32 coins, u8 x, u8 y) +{ + Menu_DrawStdWindowFrame(x, y, x + 9, y + 3); + UpdateCoinsWindow(coins, x, y); +} + +void HideCoinsWindow(u8 x, u8 y) +{ + Menu_EraseWindowRect(x, y, x + 9, y + 3); +} + +void PrintCoins(s32 coins, u8 b, u8 x, u8 y) +{ + u8 string[16]; + u8 *ptr; + u8 r1; + u8 foo; + + ConvertIntToDecimalString(string, coins); + r1 = (b * 6 + 0x21 - 8 * (b + 2)); + x = x - r1 / 8; + foo = r1 % 8; + ptr = gStringVar1; + if (foo) + { + ptr[0] = EXT_CTRL_CODE_BEGIN; + ptr[1] = 0x11; + ptr[2] = 8 - (foo); + ptr += 3; + } + ptr[0] = EXT_CTRL_CODE_BEGIN; + ptr[1] = 0x11; + ptr[2] = (b - StringLength(string)) * 6; + ptr += 3; + StringCopy(ptr, string); + Menu_PrintText(gOtherText_Coins2, x, y); +} + +u16 GetCoins(void) +{ + return gSaveBlock1.coins; +} + +bool8 GiveCoins(u16 coins) +{ + u32 newCoins; + + if (GetCoins() >= MAX_COINS) + return FALSE; + newCoins = coins + gSaveBlock1.coins; + if (gSaveBlock1.coins > (u16)newCoins) + gSaveBlock1.coins = MAX_COINS; + else + { + gSaveBlock1.coins = newCoins; + if ((u16)newCoins > MAX_COINS) + gSaveBlock1.coins = MAX_COINS; + } + return TRUE; +} + +bool8 TakeCoins(u16 coins) +{ + if (GetCoins() >= coins) + { + gSaveBlock1.coins -= coins; + return TRUE; + } + else + return FALSE; +} diff --git a/src/contest_painting.c b/src/contest_painting.c new file mode 100644 index 000000000..0aa02312f --- /dev/null +++ b/src/contest_painting.c @@ -0,0 +1,786 @@ +#include "global.h" +#include "contest_painting.h" +#include "cute_sketch.h" +#include "data2.h" +#include "decompress.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "random.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" +#include "scanline_effect.h" +#include "ewram.h" + +static u8 gUnknown_03000750; +static u16 gUnknown_03000752; +static u16 gUnknown_03000754; +static u8 gUnknown_03000756; + +u16 (*gUnknown_03005E10)[][32]; +struct Unk03005E20 gUnknown_03005E20; +u8 gUnknown_03005E40[0x4C]; +struct ContestEntry *gUnknown_03005E8C; +u16 (*gUnknown_03005E90)[]; + +static const u16 gPictureFramePalettes[][16] = +{ + INCBIN_U16("graphics/picture_frame/bg0.gbapal"), + INCBIN_U16("graphics/picture_frame/bg1.gbapal"), + INCBIN_U16("graphics/picture_frame/bg2.gbapal"), + INCBIN_U16("graphics/picture_frame/bg3.gbapal"), + INCBIN_U16("graphics/picture_frame/bg4.gbapal"), + INCBIN_U16("graphics/picture_frame/bg5.gbapal"), + {0}, + {0}, +}; +const u8 emptySpace[8 * 32] = {0}; +const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl"); +const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl"); +const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl"); +const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl"); +const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl"); +const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl"); +const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl"); +const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl"); +const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl"); +const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl"); +const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl"); +const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl"); +const u8 *const gUnknown_083F60AC[] = +{ + OtherText_Cool, + OtherText_Beauty2, + OtherText_Cute, + OtherText_Smart, + OtherText_Tough, +}; +const struct LabelPair gUnknown_083F60C0[] = +{ + {OtherText_NonstopSuperCool, OtherText_Terminator6}, + {OtherText_GoodLookingPoke, OtherText_Terminator7}, + {OtherText_MarvelousGreat, OtherText_Terminator8}, + {OtherText_CenturyLastVenus, OtherText_Terminator9}, + {OtherText_Terminator10, OtherText_DazzlingSmile}, + {OtherText_PokeCenterIdol, OtherText_Terminator11}, + {OtherText_LovelyAndSweet, OtherText_Terminator12}, + {OtherText_ThePretty, OtherText_WinningPortrait}, + {OtherText_GiveUsWink, OtherText_Terminator13}, + {OtherText_SmartnessMaestro, OtherText_Terminator15}, + {OtherText_ChosenPokeAmong, OtherText_Terminator15}, + {OtherText_TheExcellent, OtherText_ItsMomentOfElegance}, + {OtherText_PowerfullyMuscular, OtherText_Terminator16}, + {OtherText_StrongErEst, OtherText_Terminator17}, + {OtherText_MightyTough, OtherText_Exclamation}, +}; +const struct OamData gOamData_83F6138 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 1, + .bpp = 1, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +const u16 gUnknown_083F6140[] = {0, 0}; + +static void ShowContestPainting(); +static void CB2_HoldContestPainting(void); +static void HoldContestPainting(void); +static void ContestPaintingInitWindow(u8 arg0); +static void ContestPaintingPrintCaption(u8 arg0, u8 arg1); +static void ContestPaintingInitBG(void); +static void ContestPaintingInitVars(u8 arg0); +static void VBlankCB_ContestPainting(void); +void sub_8106B90(); //should be static +static void sub_8107090(u8 arg0, u8 arg1); + +__attribute__((naked)) +void sub_8106630(u32 arg0) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + ldr r2, _0810665C @ =gSharedMem + 0x15DE0\n\ + subs r4, r2, 0x2\n\ + subs r5, r2, 0x1\n\ + ldr r3, _08106660 @ =gSaveBlock1\n\ + subs r0, 0x1\n\ + lsls r1, r0, 5\n\ + adds r1, r3\n\ + ldr r3, _08106664 @ =0x00002dfc\n\ + adds r1, r3\n\ + ldm r1!, {r3,r6,r7}\n\ + stm r2!, {r3,r6,r7}\n\ + ldm r1!, {r3,r6,r7}\n\ + stm r2!, {r3,r6,r7}\n\ + ldm r1!, {r6,r7}\n\ + stm r2!, {r6,r7}\n\ + strb r0, [r4]\n\ + movs r0, 0\n\ + strb r0, [r5]\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0810665C: .4byte gSharedMem + 0x15DE0\n\ +_08106660: .4byte gSaveBlock1\n\ +_08106664: .4byte 0x00002dfc\n\ + .syntax divided\n"); +} + +void CB2_ContestPainting(void) +{ + ShowContestPainting(); +} + +static void ShowContestPainting(void) +{ + switch (gMain.state) + { + case 0: + ScanlineEffect_Stop(); + SetVBlankCallback(NULL); + gUnknown_03005E8C = &ewram15DE0; + ContestPaintingInitVars(TRUE); + ContestPaintingInitBG(); + gMain.state++; + break; + case 1: + { + ResetPaletteFade(); + DmaFill32Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); + ResetSpriteData(); + gMain.state++; + break; + } + case 2: + SeedRng(gMain.vblankCounter1); + InitKeys(); + ContestPaintingInitWindow(ewram15DDF); + gMain.state++; + break; + case 3: + sub_8107090(ewram15DDE, ewram15DDF); + gMain.state++; + break; + case 4: + ContestPaintingPrintCaption(ewram15DDE, ewram15DDF); + LoadPalette(gUnknown_083F6140, 0, 1 * 2); + DmaClear32(3, PLTT, 0x400); + BeginFastPaletteFade(2); + SetVBlankCallback(VBlankCB_ContestPainting); + gUnknown_03000750 = 0; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; + SetMainCallback2(CB2_HoldContestPainting); + break; + } +} + +static void CB2_HoldContestPainting(void) +{ + HoldContestPainting(); + UpdatePaletteFade(); +} + +static void CB2_QuitContestPainting(void) +{ + SetMainCallback2(gMain.savedCallback); +} + +static void HoldContestPainting(void) +{ + switch (gUnknown_03000750) + { + case 0: + if (!gPaletteFade.active) + gUnknown_03000750 = 1; + if (gUnknown_03000756 != 0 && gUnknown_03000754 != 0) + gUnknown_03000754--; + break; + case 1: + if ((gMain.newKeys & 1) || (gMain.newKeys & 2)) + { + u8 two = 2; //needed to make the asm match + + gUnknown_03000750 = two; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + } + if (gUnknown_03000756 != 0) + gUnknown_03000754 = 0; + break; + case 2: + if (!gPaletteFade.active) + SetMainCallback2(CB2_QuitContestPainting); + if (gUnknown_03000756 != 0 && gUnknown_03000754 <= 0x1D) + gUnknown_03000754++; + break; + } +} + +static void ContestPaintingInitWindow(u8 arg0) +{ + InitMenuWindow(&gWindowTemplate_81E7160); + Text_LoadWindowTemplate(&gWindowTemplate_81E7160); +} + +static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) +{ + u8 xPos, yPos; + u8 *ptr; + u8 type; + + if (arg1 == TRUE) + return; + ptr = gUnknown_03005E40; + type = gUnknown_03005E8C->contestType; + if (contestType < 8) + { + ptr = StringCopy(ptr, gUnknown_083F60AC[type]); + ptr = StringCopy(ptr, gContestText_ContestWinner); +#if ENGLISH + ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); +#elif GERMAN + ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); +#endif + + // {LATIN} + ptr[0] = 0xFC; + ptr[1] = 0x16; + ptr += 2; + + ptr = StringCopy(ptr, gOtherText_Unknown1); +#if ENGLISH + ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); +#elif GERMAN + ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); +#endif + + xPos = 6; + yPos = 14; + } + else + { + ptr = StringCopy(ptr, gUnknown_083F60C0[type].prefix); + ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); + ptr = StringCopy(ptr, gUnknown_083F60C0[type].suffix); + + xPos = 3; + yPos = 14; + } + Menu_PrintTextPixelCoords(gUnknown_03005E40, xPos * 8 + 1, yPos * 8, 1); +} + +static void ContestPaintingInitBG(void) +{ + REG_DISPCNT = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_BG0CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; +} + +static void ContestPaintingInitVars(bool8 arg0) +{ + if (arg0 == FALSE) + { + gUnknown_03000756 = FALSE; + gUnknown_03000752 = 0; + gUnknown_03000754 = 0; + } + else + { + gUnknown_03000756 = TRUE; + gUnknown_03000752 = 15; + gUnknown_03000754 = 30; + } +} + +static void ContestPaintingMosaic(void) +{ + if (gUnknown_03000756 == FALSE) + { + REG_MOSAIC = 0; + return; + } + + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; + gUnknown_03000752 = gUnknown_03000754 / 2; + + REG_MOSAIC = (gUnknown_03000752 << 12) | (gUnknown_03000752 << 8) | (gUnknown_03000752 << 4) | (gUnknown_03000752 << 0); +} + +static void VBlankCB_ContestPainting(void) +{ + ContestPaintingMosaic(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +#ifdef NONMATCHING +static void sub_8106AC4(u16 species, u8 arg1) +{ + void *pal; + + // Unsure what gUnknown_03005E8C->var0 is supposed to be. + pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); + LZDecompressVram(pal, gUnknown_03005E90); + + if (arg1 == 1) + { + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].x, + gMonFrontPicCoords[species].y, + 0x2000000, + gUnknown_081FAF4C[1], + species, + (u32)gUnknown_03005E8C->var0 + ); + sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10); + } + else + { + HandleLoadSpecialPokePic( + &gMonBackPicTable[species], + gMonBackPicCoords[species].x, + gMonBackPicCoords[species].y, + 0x2000000, + gUnknown_081FAF4C[0], + species, + (u32)gUnknown_03005E8C->var0 + ); + sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10); + } +} +#else +__attribute__((naked)) +static void sub_8106AC4(u16 arg0, u8 arg2) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0xC\n\ + adds r4, r1, 0\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + ldr r7, _08106B28 @ =gUnknown_03005E8C\n\ + ldr r0, [r7]\n\ + ldr r1, [r0, 0x4]\n\ + ldr r2, [r0]\n\ + adds r0, r6, 0\n\ + bl GetMonSpritePalFromOtIdPersonality\n\ + ldr r1, _08106B2C @ =gUnknown_03005E90\n\ + mov r8, r1\n\ + ldr r1, [r1]\n\ + bl LZDecompressVram\n\ + cmp r4, 0\n\ + bne _08106B40\n\ + lsls r0, r6, 3\n\ + ldr r1, _08106B30 @ =gMonFrontPicTable\n\ + adds r0, r1\n\ + ldr r1, _08106B34 @ =gMonFrontPicCoords\n\ + lsls r2, r6, 2\n\ + adds r2, r1\n\ + ldrb r1, [r2]\n\ + ldrb r2, [r2, 0x1]\n\ + movs r3, 0x80\n\ + lsls r3, 18\n\ + ldr r4, _08106B38 @ =gUnknown_081FAF4C\n\ + ldr r5, [r4, 0x4]\n\ + str r5, [sp]\n\ + str r6, [sp, 0x4]\n\ + ldr r4, [r7]\n\ + ldr r4, [r4]\n\ + str r4, [sp, 0x8]\n\ + bl HandleLoadSpecialPokePic\n\ + mov r2, r8\n\ + ldr r1, [r2]\n\ + ldr r0, _08106B3C @ =gUnknown_03005E10\n\ + ldr r2, [r0]\n\ + adds r0, r5, 0\n\ + bl sub_8106B90\n\ + b _08106B74\n\ + .align 2, 0\n\ +_08106B28: .4byte gUnknown_03005E8C\n\ +_08106B2C: .4byte gUnknown_03005E90\n\ +_08106B30: .4byte gMonFrontPicTable\n\ +_08106B34: .4byte gMonFrontPicCoords\n\ +_08106B38: .4byte gUnknown_081FAF4C\n\ +_08106B3C: .4byte gUnknown_03005E10\n\ +_08106B40:\n\ + lsls r0, r6, 3\n\ + ldr r1, _08106B80 @ =gMonBackPicTable\n\ + adds r0, r1\n\ + ldr r1, _08106B84 @ =gMonBackPicCoords\n\ + lsls r2, r6, 2\n\ + adds r2, r1\n\ + ldrb r1, [r2]\n\ + ldrb r2, [r2, 0x1]\n\ + movs r3, 0x80\n\ + lsls r3, 18\n\ + ldr r4, _08106B88 @ =gUnknown_081FAF4C\n\ + ldr r5, [r4]\n\ + str r5, [sp]\n\ + str r6, [sp, 0x4]\n\ + ldr r4, [r7]\n\ + ldr r4, [r4]\n\ + str r4, [sp, 0x8]\n\ + bl HandleLoadSpecialPokePic\n\ + mov r0, r8\n\ + ldr r1, [r0]\n\ + ldr r0, _08106B8C @ =gUnknown_03005E10\n\ + ldr r2, [r0]\n\ + adds r0, r5, 0\n\ + bl sub_8106B90\n\ +_08106B74:\n\ + add sp, 0xC\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08106B80: .4byte gMonBackPicTable\n\ +_08106B84: .4byte gMonBackPicCoords\n\ +_08106B88: .4byte gUnknown_081FAF4C\n\ +_08106B8C: .4byte gUnknown_03005E10\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8]) +{ + u16 i; + u16 j; + u16 k; + u16 l; + + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + { + for (k = 0; k < 8; k++) + { + for (l = 0; l < 8; l++) + { + //u8 *arr = a[i][j][k]; + //u8 r1 = arr[l / 2]; + u8 r1 = a[i][j][k][l / 2]; + + if (l & 1) + r1 /= 16; + else + r1 %= 16; + //_08106BEA + if (r1 == 0) + c[i][k][j][l] = 0x8000; + else + c[i][k][j][l] = b[r1]; + } + } + } + } +} +#else +__attribute__((naked)) +void sub_8106B90() +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + mov r10, r0\n\ + mov r9, r1\n\ + str r2, [sp]\n\ + movs r0, 0\n\ +_08106BA4:\n\ + movs r3, 0\n\ + adds r1, r0, 0x1\n\ + str r1, [sp, 0x4]\n\ + lsls r0, 3\n\ + str r0, [sp, 0x8]\n\ +_08106BAE:\n\ + movs r1, 0\n\ + adds r2, r3, 0x1\n\ + mov r8, r2\n\ + ldr r7, [sp, 0x8]\n\ + adds r0, r7, r3\n\ + lsls r0, 5\n\ + mov r12, r0\n\ + lsls r4, r3, 3\n\ +_08106BBE:\n\ + movs r3, 0\n\ + lsls r0, r1, 2\n\ + adds r6, r1, 0x1\n\ + mov r2, r12\n\ + adds r5, r2, r0\n\ + ldr r7, [sp, 0x8]\n\ + adds r0, r7, r1\n\ + lsls r0, 7\n\ + ldr r1, [sp]\n\ + adds r2, r0, r1\n\ +_08106BD2:\n\ + lsrs r0, r3, 1\n\ + adds r0, r5, r0\n\ + add r0, r10\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08106BE6\n\ + lsrs r1, 4\n\ + b _08106BEA\n\ +_08106BE6:\n\ + movs r0, 0xF\n\ + ands r1, r0\n\ +_08106BEA:\n\ + cmp r1, 0\n\ + bne _08106BFC\n\ + adds r0, r4, r3\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + movs r7, 0x80\n\ + lsls r7, 8\n\ + adds r1, r7, 0\n\ + b _08106C08\n\ +_08106BFC:\n\ + adds r0, r4, r3\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + lsls r1, 1\n\ + add r1, r9\n\ + ldrh r1, [r1]\n\ +_08106C08:\n\ + strh r1, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x7\n\ + bls _08106BD2\n\ + lsls r0, r6, 16\n\ + lsrs r1, r0, 16\n\ + cmp r1, 0x7\n\ + bls _08106BBE\n\ + mov r1, r8\n\ + lsls r0, r1, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x7\n\ + bls _08106BAE\n\ + ldr r2, [sp, 0x4]\n\ + lsls r0, r2, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x7\n\ + bls _08106BA4\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +static void sub_8106C40(u8 arg0, u8 arg1) +{ + u8 x, y; + + LoadPalette(gPictureFramePalettes, 0, sizeof(gPictureFramePalettes)); + if (arg1 == 1) + { + switch (gUnknown_03005E8C->contestType / 3) + { + case CONTEST_COOL: + RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_0, gUnknown_03005E10); + break; + case CONTEST_BEAUTY: + RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_1, gUnknown_03005E10); + break; + case CONTEST_CUTE: + RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_2, gUnknown_03005E10); + break; + case CONTEST_SMART: + RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_3, gUnknown_03005E10); + break; + case CONTEST_TOUGH: + RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); + RLUnCompWram(gPictureFrameTilemap_4, gUnknown_03005E10); + break; + } + +#define VRAM_PICTURE_DATA(x, y) (((u16 *)(VRAM + 0x6000))[(y) * 32 + (x)]) + + // Set the background + for (y = 0; y < 20; y++) + { + for (x = 0; x < 32; x++) + VRAM_PICTURE_DATA(x, y) = 0x1015; + } + + // Copy the image frame + for (y = 0; y < 10; y++) + { + for (x = 0; x < 18; x++) + VRAM_PICTURE_DATA(x + 6, y + 2) = (*gUnknown_03005E10)[y + 2][x + 6]; + } + + // Re-set the entire top row to the first top frame part + for (x = 0; x < 16; x++) + VRAM_PICTURE_DATA(x + 7, 2) = (*gUnknown_03005E10)[2][7]; + +#undef VRAM_PICTURE_DATA + } + else if (arg0 < 8) + { + RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_5, (void *)(VRAM + 0x6000)); + } + else + { + switch (gUnknown_03005E8C->contestType / 3) + { + case CONTEST_COOL: + RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_0, (void *)(VRAM + 0x6000)); + break; + case CONTEST_BEAUTY: + RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_1, (void *)(VRAM + 0x6000)); + break; + case CONTEST_CUTE: + RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_2, (void *)(VRAM + 0x6000)); + break; + case CONTEST_SMART: + RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_3, (void *)(VRAM + 0x6000)); + break; + case CONTEST_TOUGH: + RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); + RLUnCompVram(gPictureFrameTilemap_4, (void *)(VRAM + 0x6000)); + break; + } + } +} + +static void sub_8106E98(u8 arg0) +{ + //Some hacks just to get the asm to match +#ifndef NONMATCHING + asm(""::"r"(arg0)); +#endif + + gMain.oamBuffer[0] = gOamData_83F6138; + gMain.oamBuffer[0].tileNum = 0; + +#ifndef NONMATCHING + if (arg0) arg0 = gMain.oamBuffer[0].tileNum; +#endif + + gMain.oamBuffer[0].x = 88; + gMain.oamBuffer[0].y = 24; +} + +static u8 sub_8106EE0(u8 arg0) +{ + u8 contestType; + + if (arg0 < 8) + contestType = gUnknown_03005E8C->contestType; + else + contestType = gUnknown_03005E8C->contestType / 3; + + switch (contestType) + { + case CONTEST_COOL: + return CONTESTRESULT_COOL; + case CONTEST_BEAUTY: + return CONTESTRESULT_BEAUTY; + case CONTEST_CUTE: + return CONTESTRESULT_CUTE; + case CONTEST_SMART: + return CONTESTRESULT_SMART; + case CONTEST_TOUGH: + return CONTESTRESULT_TOUGH; + } + + return contestType; +} + +static void sub_8106F4C(void) +{ + gUnknown_03005E90 = &ewram15E00.unk2017e00; + gUnknown_03005E10 = &ewram15E00.unk2015e00; +} + +static void sub_8106F6C(u8 arg0) +{ + gUnknown_03005E20.var_4 = gUnknown_03005E10; + gUnknown_03005E20.var_8 = gUnknown_03005E90; + gUnknown_03005E20.var_18 = 0; + gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0; + gUnknown_03005E20.var_19 = 0; + gUnknown_03005E20.var_1A = 0; + gUnknown_03005E20.var_1B = 64; + gUnknown_03005E20.var_1C = 64; + gUnknown_03005E20.var_1D = 64; + gUnknown_03005E20.var_1E = 64; + + switch (arg0) + { + case CONTESTRESULT_SMART: + case CONTESTRESULT_TOUGH: + gUnknown_03005E20.var_14 = 3; + break; + case CONTESTRESULT_COOL: + case CONTESTRESULT_BEAUTY: + case CONTESTRESULT_CUTE: + default: + gUnknown_03005E20.var_14 = 1; + break; + } + + gUnknown_03005E20.var_16 = 2; + gUnknown_03005E20.var_0 = arg0; + gUnknown_03005E20.var_10 = 0x6010000; + + sub_80FC7A0(&gUnknown_03005E20); + sub_80FDA18(&gUnknown_03005E20); + sub_80FD8CC(&gUnknown_03005E20); + + LoadPalette(gUnknown_03005E90, 256, 256 * 2); +} + +static void sub_8107090(u8 arg0, u8 arg1) +{ + sub_8106F4C(); + sub_8106AC4(gUnknown_03005E8C->var8, 0); + sub_8106F6C(sub_8106EE0(arg0)); + sub_8106E98(arg0); + sub_8106C40(arg0, arg1); +} diff --git a/src/coord_event_weather.c b/src/coord_event_weather.c new file mode 100644 index 000000000..60b87fa30 --- /dev/null +++ b/src/coord_event_weather.c @@ -0,0 +1,119 @@ +#include "global.h" +#include "constants/weather.h" +#include "coord_event_weather.h" +#include "field_weather.h" + +struct CoordEventWeather +{ + u8 coordEventWeather; + void (*func)(void); +}; + +static void CoordEventWeather_Clouds(void); +static void CoordEventWeather_Sunny(void); +static void CoordEventWeather_LightRain(void); +static void CoordEventWeather_Snow(void); +static void CoordEventWeather_Thunderstorm(void); +static void CoordEventWeather_Fog(void); +static void CoordEventWeather_DiagonalFog(void); +static void CoordEventWeather_Ash(void); +static void CoordEventWeather_Sandstorm(void); +static void CoordEventWeather_Dark(void); +static void CoordEventWeather_Drought(void); +static void CoordEventWeather_Route119Cycle(void); +static void CoordEventWeather_Route123Cycle(void); + +static const struct CoordEventWeather sCoordEventWeatherFuncs[] = +{ + { COORD_EVENT_WEATHER_CLOUDS, CoordEventWeather_Clouds }, + { COORD_EVENT_WEATHER_SUNNY, CoordEventWeather_Sunny }, + { COORD_EVENT_WEATHER_RAIN_LIGHT, CoordEventWeather_LightRain }, + { COORD_EVENT_WEATHER_SNOW, CoordEventWeather_Snow }, + { COORD_EVENT_WEATHER_RAIN_MED, CoordEventWeather_Thunderstorm }, + { COORD_EVENT_WEATHER_FOG_1, CoordEventWeather_Fog }, + { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog }, + { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash }, + { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm }, + { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark }, + { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought }, + { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle }, + { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle }, +}; + +static void CoordEventWeather_Clouds(void) +{ + SetWeather(WEATHER_CLOUDS); +} + +static void CoordEventWeather_Sunny(void) +{ + SetWeather(WEATHER_SUNNY); +} + +static void CoordEventWeather_LightRain(void) +{ + SetWeather(WEATHER_RAIN_LIGHT); +} + +static void CoordEventWeather_Snow(void) +{ + SetWeather(WEATHER_SNOW); +} + +static void CoordEventWeather_Thunderstorm(void) +{ + SetWeather(WEATHER_RAIN_MED); +} + +static void CoordEventWeather_Fog(void) +{ + SetWeather(WEATHER_FOG_1); +} + +static void CoordEventWeather_DiagonalFog(void) +{ + SetWeather(WEATHER_FOG_2); +} + +static void CoordEventWeather_Ash(void) +{ + SetWeather(WEATHER_ASH); +} + +static void CoordEventWeather_Sandstorm(void) +{ + SetWeather(WEATHER_SANDSTORM); +} + +static void CoordEventWeather_Dark(void) +{ + SetWeather(WEATHER_SHADE); +} + +static void CoordEventWeather_Drought(void) +{ + SetWeather(WEATHER_DROUGHT); +} + +static void CoordEventWeather_Route119Cycle(void) +{ + SetWeather(WEATHER_ROUTE119_CYCLE); +} + +static void CoordEventWeather_Route123Cycle(void) +{ + SetWeather(WEATHER_ROUTE123_CYCLE); +} + +void DoCoordEventWeather(u8 coordEventWeather) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++) + { + if (sCoordEventWeatherFuncs[i].coordEventWeather == coordEventWeather) + { + sCoordEventWeatherFuncs[i].func(); + return; + } + } +} diff --git a/src/credits.c b/src/credits.c new file mode 100644 index 000000000..9a85265e4 --- /dev/null +++ b/src/credits.c @@ -0,0 +1,1677 @@ +#include "global.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "hall_of_fame.h" +#include "intro_credits_graphics.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokedex.h" +#include "random.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "starter_choose.h" +#include "task.h" +#include "trig.h" +#include "ewram.h" + +asm(".set REG_BASE, 0x4000000"); +asm(".set OFFSET_REG_BLDCNT, 0x50"); +asm(".set OFFSET_REG_BLDALPHA, 0x52"); +asm(".set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT"); +asm(".set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA"); + +enum +{ + PAGE_TITLE, + PAGE_DIRECTOR, + PAGE_ART_DIRECTOR, + PAGE_BATTLE_DIRECTOR, + PAGE_MAIN_PROGRAMMER, + PAGE_BATTLE_SYSTEM_PROGRAMMER, + PAGE_PROGRAMMERS_1, + PAGE_PROGRAMMERS_2, + PAGE_PROGRAMMERS_3, + PAGE_MAIN_GRAHPICS_DESIGNER, + PAGE_POKEMON_GRAHPIC_DESIGNERS_1, + PAGE_POKEMON_GRAHPIC_DESIGNERS_2, + PAGE_POKEMON_GRAHPIC_DESIGNERS_3, + PAGE_POKEMON_DESIGNERS_1, + PAGE_POKEMON_DESIGNERS_2, + PAGE_MUSIC_COMPOSITION, + PAGE_SOUND_EFFECTS, + PAGE_GAME_DESIGNERS_1, + PAGE_GAME_DESIGNERS_2, + PAGE_GAME_DESIGNERS_3, + PAGE_PLOT_SCENARIO, + PAGE_GAME_SCENARIO, + PAGE_SCRIPT_DESIGNERS, + PAGE_MAP_DESIGNERS, + PAGE_MAP_DATA_DESIGNERS, + PAGE_PARAMETRIC_DESIGNERS, + PAGE_POKEDEX_TEXT, + PAGE_ENVIRONMENT_TOOLS, + PAGE_PRODUCT_TESTING, + PAGE_SPECIAL_THANKS, + PAGE_SPECIAL_THANKS_1, + PAGE_SPECIAL_THANKS_2, + PAGE_SPECIAL_THANKS_3, + PAGE_INFORMATION_SUPERVISORS, + PAGE_COORDINATORS, + PAGE_TASK_MANAGERS, + PAGE_PRODUCERS, + PAGE_EXECUTIVE_DIRECTOR, + PAGE_EXECUTIVE_PRODUCERS_1, + PAGE_EXECUTIVE_PRODUCERS_2, + PAGE_TRANSLATION_COORDINATOR, + PAGE_TRANSLATORS, + PAGE_PROGRAMMERS, + PAGE_GRAPHIC_DESIGNERS, + PAGE_PRODUCT_SUPPORT, + +#if ENGLISH + PAGE_ARTWORK, + PAGE_TEXT_EDITOR, + PAGE_NOA_TESTING, + PAGE_BRAILLE_CODE_CHECK_1, + PAGE_BRAILLE_CODE_CHECK_2, +#elif GERMAN + PAGE_NOE_TESTING, + PAGE_BRAILLE_CODE_CHECK_1, +#endif + + PAGE_SPECIAL_THANKS_4, + PAGE_SPECIAL_THANKS_5, + + PAGE_COUNT +}; + +#if ENGLISH +#define POKEMON_TILE_COUNT 68 +#define LAST_PAGE (PAGE_TEXT_EDITOR) +#define UNK_DEFINE_45 (0x45) +#define UNK_DEFINE_82 (0x82) +#define UNK_DEF_1F3 (499) +#elif GERMAN +#define POKEMON_TILE_COUNT 65 +#define LAST_PAGE (PAGE_NOE_TESTING) +#define UNK_DEFINE_45 (8) +#define UNK_DEFINE_82 (0x8D) +#define UNK_DEF_1F3 (554) +#endif + +#define COLOR_DARK_GREEN 0x1967 +#define COLOR_LIGHT_GREEN 0x328D + +enum +{ + TDA_0 = 0, + TDA_TASK_C_ID = 1, + TDA_TASK_E_ID = 2, + TDA_TASK_D_ID = 3, + TDA_4 = 4, + TDA_PLAYER_CYCLIST = 5, + TDA_RIVAL_CYCLIST = 6, + TDA_7 = 7, // Has something to do with the bike scene + TDA_11 = 11, // Gets set depending on whether the bike or the grass scene should be shown + TDA_12 = 12, + TDA_13 = 13, + TDA_14 = 14, + TDA_TASK_B_ID = 15, + + // Appears to be responsible for text + TDB_0 = 0, + TDB_TASK_A_ID = 1, + TDB_CURRENT_PAGE = 2, + TDB_3 = 3, + + TDC_0 = 0, + TDC_1 = 1, + TDC_2 = 2, + TDC_3 = 3, + TDC_4 = 4, + TDC_5 = 5, + + TDD_STATE = 0, + TDD_TASK_A_ID = 1, + TDD_2 = 2, + TDD_3 = 3, + + TDE_0 = 0, + TDE_1 = 1, + TDE_TASK_A_ID = 2, +}; + + +struct Unk201C000 +{ + u16 unk0[POKEMON_TILE_COUNT]; + u16 unk88; + u16 unk8A; + u16 unk8C; + u16 unk8E; + u16 unk90[386]; + u16 unk394; +}; + +struct CreditsEntry +{ + u8 var_0; + const u8 *text; +}; + +extern u8 unk_201e800[0x800]; +extern u8 unk_201f000[0x800]; + +extern struct SpriteTemplate gUnknown_02024E8C; + +extern u16 gUnknown_02039358; +extern s16 gUnknown_0203935A; +extern s16 gUnknown_0203935C; + +static EWRAM_DATA s16 gUnknown_02039320 = 0; +static EWRAM_DATA u16 gUnknown_02039322 = 0; // TASK A +EWRAM_DATA u8 gUnknown_02039324 = 0; +static EWRAM_DATA u8 gUnknown_02039325 = 0; + +extern u8 gReservedSpritePaletteCount; + +// data/hall_of_fame +extern void *gUnknown_0840B5A0[]; + +// data/credits +const u16 gUnknown_0840B7BC[] = INCBIN_U16("graphics/credits/palette_1.gbapal"); +const u8 gUnknown_0840B7FC[] = INCBIN_U8("graphics/credits/ampersand.4bpp"); + +void spritecb_814580C(struct Sprite *sprite); + +const u8 gUnknown_0840B83C[] = +{ + 0, 1, 0, + 0xFF, 1, 0xFF, + 0xFF, 1, 0xFF, + 0xFF, 1, 0xFF, + 0xFF, 1, 0xFF, +}; + +const u8 gUnknown_0840B84B[] = +{ + 1, 0xFF, 1, + 1, 0xFF, 1, + 1, 2, 1, + 1, 0xFF, 1, + 1, 0xFF, 1, +}; + +const u8 gUnknown_0840B85A[] = +{ + 1, 0, 0, + 1, 0xFF, 0xFF, + 1, 2, 2, + 1, 0xFF, 0xFF, + 1, 0x80, 0x80, +}; + +const u8 gUnknown_0840B869[] = +{ + 1, 3, 1, + 1, 4, 1, + 1, 5, 1, + 1, 0xC4, 1, + 1, 0xC3, 1, +}; + +const u8 gUnknown_0840B878[] = +{ + 1, 6, 7, + 1, 8, 9, + 1, 0xFF, 1, + 1, 0x88, 0x89, + 1, 0x86, 0x87, +#ifdef GERMAN + 1, 0, 0, + 1, 0xFF, 0xFF, + 1, 0x80, 0x8A, + 1, 0xFF, 0xFF, + 1, 0xFF, 0xFF, + 0, 1, 0, + 0xFF, 1, 0xFF, + 0xFF, 1, 0xFF, + 0xFF, 1, 0xFF, + 0x80, 1, 0x80, +#endif +}; + +#ifdef GERMAN +#include "data/credits_de.h" +#else +#include "data/credits_en.h" +#endif + +const u8 gUnknown_0840CA00[][2] = +{ + {104, 36}, + {120, 36}, + {136, 36}, +}; + +static const union AnimCmd gSpriteAnim_840CA08[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gSpriteAnim_840CA1C[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(128, 4), + ANIMCMD_FRAME(192, 4), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gSpriteAnim_840CA30[] = +{ + ANIMCMD_FRAME(256, 4), + ANIMCMD_FRAME(320, 4), + ANIMCMD_FRAME(384, 4), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_840CA40[] = +{ + ANIMCMD_FRAME(384, 30), + ANIMCMD_FRAME(320, 30), + ANIMCMD_FRAME(256, 30), + ANIMCMD_FRAME(256, 30), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_0840CA54[] = +{ + gSpriteAnim_840CA08, + gSpriteAnim_840CA1C, + gSpriteAnim_840CA30, + gSpriteAnim_840CA40, +}; + +static const union AnimCmd gSpriteAnim_840CA64[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gSpriteAnim_840CA78[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(128, 4), + ANIMCMD_FRAME(192, 4), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gSpriteAnim_840CA8C[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_0840CA94[] = +{ + gSpriteAnim_840CA64, + gSpriteAnim_840CA78, + gSpriteAnim_840CA8C, +}; + +static const struct SpriteSheet gUnknown_0840CAA0[] = {{ewram1E000_2, 6144, 1001}, {0}}; +static const struct SpritePalette gUnknown_0840CAB0[] = {{ewram_1F800_2, 1001}, {0}}; + +static const struct OamData gOamData_840CAC0 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_840CAC8[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_840CAD0[] = +{ + ANIMCMD_FRAME(64, 8), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_840CAD8[] = +{ + ANIMCMD_FRAME(128, 8), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_840CAE0[] = +{ + gSpriteAnim_840CAC8, + gSpriteAnim_840CAD0, + gSpriteAnim_840CAD8, +}; + +static const struct SpriteTemplate gSpriteTemplate_840CAEC = +{ + .tileTag = 1001, + .paletteTag = 1001, + .oam = &gOamData_840CAC0, + .anims = gSpriteAnimTable_840CAE0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = spritecb_814580C, +}; + +// graphics +extern u8 gCreditsCopyrightEnd_Gfx[]; +extern u16 gIntroCopyright_Pal[16]; + +static void task_a_8143B38(u8 taskIdA); +static void task_a_8143B68(u8 taskIdA); +static void task_a_8143BFC(u8 taskIdA); +static void task_a_80C9BFC(u8 taskIdA); +static void task_a_8143CC0(u8 taskIdA); +static void task_a_8143D04(u8 taskIdA); +static void task_a_8143EBC(u8 taskIdA); +static void task_a_8143F04(u8 taskIdA); +static void task_a_8143F3C(u8 taskIdA); +static void task_a_8143FDC(u8 taskIdA); +static void task_a_8144024(u8 taskIdA); +static void task_a_8144080(u8 taskIdA); +static void task_a_8144114(u8 taskIdA); +static void sub_8144130(void); +static void task_b_81441B8(u8 taskIdB); +static u8 sub_8144454(u8 page, u8 taskIdA); +static void task_d_8144514(u8 taskIdD); +static bool8 sub_8144ECC(u8 data, u8 taskIdA); +static void sub_81450AC(u8 taskIdA); +static void sub_8145128(u16, u16, u16); +static void sub_81452D0(u16 arg0, u16 palette); +static void spritecb_player_8145378(struct Sprite *sprite); +static void spritecb_rival_8145420(struct Sprite *sprite); +static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position); +static void sub_81458DC(void); + +static void vblank_8143948(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_814395C(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + + if ((gMain.heldKeys & B_BUTTON) + && gUnknown_02039324 != 0 + && gTasks[gUnknown_02039322].func == task_a_8143B68) + { + vblank_8143948(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + gUnknown_02039325 = 1; + } +} + +void sub_81439D0(void) +{ + u8 taskIdA; + s16 taskIdC; + u8 taskIdB; + u16 savedIme; + struct Unk201C000 *c000; + + sub_8144130(); + SetVBlankCallback(NULL); + ResetPaletteFade(); + ResetTasks(); + + taskIdA = CreateTask(task_a_8143B38, 0); + + gTasks[taskIdA].data[TDA_4] = 0; + gTasks[taskIdA].data[TDA_7] = 0; + gTasks[taskIdA].data[TDA_11] = 0; + gTasks[taskIdA].data[TDA_13] = 1; + + while (TRUE) + { + if (sub_8144ECC(0, taskIdA)) + break; + } + + taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; + gTasks[taskIdC].data[TDC_0] = 40; + + Text_LoadWindowTemplate(&gWindowTemplate_81E7208); + InitMenuWindow(&gWindowTemplate_81E7208); + LoadPalette(&gUnknown_0840B7BC, 0x80, sizeof(gUnknown_0840B7BC)); + + CpuCopy16(&gUnknown_0840B7FC, (void *)(VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC)); + + REG_BG0VOFS = 0xFFFC; + + taskIdB = CreateTask(task_b_81441B8, 0); + + gTasks[taskIdB].data[TDB_TASK_A_ID] = taskIdA; + gTasks[taskIdA].data[TDA_TASK_B_ID] = taskIdB; + + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + + SetVBlankCallback(vblank_8143948); + m4aSongNumStart(BGM_THANKFOR); + SetMainCallback2(sub_814395C); + gUnknown_02039325 = 0; + + c000 = &ewram1c000; + + sub_81458DC(); + + c000->unk88 = 0; + c000->unk8A = 0; + c000->unk8C = 0; + + gUnknown_02039322 = taskIdA; +} + +static void task_a_8143B38(u8 taskIdA) +{ + if (!gPaletteFade.active) + gTasks[taskIdA].func = task_a_8143B68; +} + +static void task_a_8143B68(u8 taskIdA) +{ + u16 data1; + + if (gTasks[taskIdA].data[TDA_4]) + { + s16 taskIdC; + + taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; + gTasks[taskIdC].data[TDC_0] = 30; + + gTasks[taskIdA].data[TDA_12] = 0x100; + gTasks[taskIdA].func = task_a_8143EBC; + return; + } + + gUnknown_02039320 = 0; + data1 = gTasks[taskIdA].data[TDA_11]; + + if (gTasks[taskIdA].data[TDA_11] == 1) + { + gTasks[taskIdA].data[TDA_13] = data1; + gTasks[taskIdA].data[TDA_11] = 0; + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskIdA].func = task_a_8143BFC; + } + else if (gTasks[taskIdA].data[TDA_11] == 2) + { + gTasks[taskIdA].data[TDA_13] = data1; + gTasks[taskIdA].data[TDA_11] = 0; + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskIdA].func = task_a_8143CC0; + } +} + +static void task_a_8143BFC(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + REG_DISPCNT = 0; + sub_81450AC(taskIdA); + gTasks[taskIdA].func = task_a_80C9BFC; + } +} + +static void task_a_80C9BFC(u8 taskIdA) +{ + u16 backup; + + SetVBlankCallback(NULL); + + if (sub_8144ECC(gTasks[taskIdA].data[TDA_7], taskIdA)) + { + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = backup; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(vblank_8143948); + gTasks[taskIdA].func = task_a_8143B38; + } +} + +static void task_a_8143CC0(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + REG_DISPCNT = 0; + sub_81450AC(taskIdA); + gTasks[taskIdA].func = task_a_8143D04; + } +} + +void task_a_8143D04(u8 taskIdA) +{ + switch (gMain.state) + { + default: + case 0: + { + u16 i; + + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); + LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); + LoadPalette(gBirchBagGrassPal[0] + 1, 1, 31 * 2); + + for (i = 0; i < 0x800; i++) + HALL_OF_FAME_SHEET_0[i] = 0x11; + for (i = 0; i < 0x800; i++) + HALL_OF_FAME_SHEET_1[i] = 0x22; + for (i = 0; i < 0x800; i++) + HALL_OF_FAME_SHEET_2[i] = 0x33; + + EWRAM_1F800[0] = 0; + EWRAM_1F800[1] = 0x53FF; // light yellow + EWRAM_1F800[2] = 0x529F; // light red + EWRAM_1F800[3] = 0x7E94; // light blue + + LoadSpriteSheet(gUnknown_0840CAA0); + LoadSpritePalette(gUnknown_0840CAB0); + + gMain.state += 1; + break; + } + case 1: + gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(task_d_8144514, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_STATE] = 1; + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_TASK_A_ID] = taskIdA; + gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_2] = gTasks[taskIdA].data[TDA_7]; + + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + REG_BG3HOFS = 0; + REG_BG3VOFS = 32; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + + gMain.state = 0; + gUnknown_0203935C = 0; + gTasks[taskIdA].func = task_a_8143B38; + break; + } +} + +static void task_a_8143EBC(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_12]) + { + gTasks[taskIdA].data[TDA_12] -= 1; + return; + } + + BeginNormalPaletteFade(-1, 12, 0, 16, 0); + gTasks[taskIdA].func = task_a_8143F04; +} + +static void task_a_8143F04(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + sub_81450AC(taskIdA); + gTasks[taskIdA].func = task_a_8143F3C; + } +} + +static void task_a_8143F3C(u8 taskIdA) +{ + u16 backup; + + sub_8144130(); + ResetPaletteFade(); + sub_8145128(0, 0x3800, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(-1, 8, 16, 0, 0); + + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = backup; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + + gTasks[taskIdA].data[TDA_0] = 0x100; + gTasks[taskIdA].func = task_a_8143FDC; +} + +static void task_a_8143FDC(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_0]) + { + gTasks[taskIdA].data[TDA_0] -= 1; + return; + } + + BeginNormalPaletteFade(-1, 6, 0, 16, 0); + gTasks[taskIdA].func = task_a_8144024; +} + +static void task_a_8144024(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + sub_81452D0(0x3800, 0); + + BeginNormalPaletteFade(-1, 0, 0, 0, 0); + gTasks[taskIdA].data[TDA_0] = 7200; + gTasks[taskIdA].func = task_a_8144080; + } +} + +static void task_a_8144080(u8 taskIdA) +{ + if (!gPaletteFade.active) + { + if (gTasks[taskIdA].data[TDA_0] == 0) + { + FadeOutBGM(4); + BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF); + gTasks[taskIdA].func = task_a_8144114; + return; + } + + if (gMain.newKeys) + { + FadeOutBGM(4); + BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF); + gTasks[taskIdA].func = task_a_8144114; + return; + } + + if (gTasks[taskIdA].data[TDA_0] == 7144) + { + FadeOutBGM(8); + } + + if (gTasks[taskIdA].data[TDA_0] == 6840) + m4aSongNumStart(BGM_END); + + gTasks[taskIdA].data[TDA_0] -= 1; + } +} + +static void task_a_8144114(u8 taskIdA) +{ + if (!gPaletteFade.active) + SoftReset(0xFF); +} + +static void sub_8144130(void) +{ + REG_DISPCNT = 0; + + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); +} + +static void task_b_81441B8(u8 taskIdB) +{ + u16 i; + + switch (gTasks[taskIdB].data[TDB_0]) + { + case 0: + case 6: + case 7: + case 8: + case 9: + default: + if (!gPaletteFade.active) + { + gTasks[taskIdB].data[TDB_0] = 1; + gTasks[taskIdB].data[TDB_3] = 0x58; + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; + gUnknown_02039320 = 0; + } + return; + case 1: + if (gTasks[taskIdB].data[TDB_3] != 0) + { + gTasks[taskIdB].data[TDB_3] -= 1; + return; + } + gTasks[taskIdB].data[TDB_0] += 1; + return; + case 2: + REG_DISPCNT &= ~DISPCNT_BG0_ON; + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == task_a_8143B68) + { + if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT) + { + for (i = 0; i < 5; i++) + sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, 9 + i * 2, 240); + + gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1; + gTasks[taskIdB].data[TDB_0] += 1; + + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 1; + + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) + BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_LIGHT_GREEN); + else + BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_DARK_GREEN); + return; + } + gTasks[taskIdB].data[TDB_0] = 10; + return; + } + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; + return; + case 3: + REG_DISPCNT |= DISPCNT_BG0_ON; + if (!gPaletteFade.active) + { + gTasks[taskIdB].data[TDB_3] = UNK_DEFINE_82; + gTasks[taskIdB].data[TDB_0] += 1; + } + return; + case 4: + if (gTasks[taskIdB].data[TDB_3] != 0) + { + gTasks[taskIdB].data[TDB_3] -= 1; + return; + } + + if (sub_8144454((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID])) + { + gTasks[taskIdB].data[TDB_0] += 1; + return; + } + gTasks[taskIdB].data[TDB_0] += 1; + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) + BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_LIGHT_GREEN); + else + BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_DARK_GREEN); + return; + case 5: + if (!gPaletteFade.active) + { + Menu_EraseWindowRect(0, 9, 29, 19); + gTasks[taskIdB].data[TDB_0] = 2; + } + return; + + case 10: + gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_4] = 1; + DestroyTask(taskIdB); + return; + } +} + +static u8 sub_8144454(u8 page, u8 taskIdA) +{ + // Starts with bike + ocean + morning + + if (page == PAGE_PROGRAMMERS_1) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == PAGE_POKEMON_GRAHPIC_DESIGNERS_3) + { + // Bike + ocean + sunset + gTasks[taskIdA].data[TDA_7] = 1; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == PAGE_GAME_DESIGNERS_2) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == PAGE_MAP_DATA_DESIGNERS) + { + // Bike + forest + sunset + gTasks[taskIdA].data[TDA_7] = 2; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == PAGE_SPECIAL_THANKS_1) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == PAGE_TASK_MANAGERS) + { + // Bike + forest + sunset + gTasks[taskIdA].data[TDA_7] = 3; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (page == PAGE_TRANSLATION_COORDINATOR) + { + // Grass patch + gTasks[taskIdA].data[TDA_11] = 2; + } + + if (page == LAST_PAGE) + { + // Bike + town + night + gTasks[taskIdA].data[TDA_7] = 4; + gTasks[taskIdA].data[TDA_11] = 1; + } + + if (gTasks[taskIdA].data[TDA_11] != 0) + { + // Returns true if changed? + return TRUE; + } + + return FALSE; +} + +static void task_d_8144514(u8 taskIdD) +{ + struct Unk201C000 *r6 = &ewram1c000; + u8 r2; + + switch (gTasks[taskIdD].data[TDD_STATE]) + { + case 0: + break; + case 1: + if (r6->unk8A == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0) + break; + gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] = 0; + gTasks[taskIdD].data[TDD_STATE]++; + break; + case 2: + if (r6->unk88 == POKEMON_TILE_COUNT || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68) + break; + r2 = sub_81456B4(r6->unk0[r6->unk8C], gUnknown_0840CA00[r6->unk8A][0], gUnknown_0840CA00[r6->unk8A][1], r6->unk8A); + if (r6->unk8C < r6->unk8E - 1) + { + r6->unk8C++; + gSprites[r2].data[3] = 50; + } + else + { + r6->unk8C = 0; + gSprites[r2].data[3] = 512; + } + r6->unk88++; + if (r6->unk8A == 2) + r6->unk8A = 0; + else + r6->unk8A++; + gTasks[taskIdD].data[TDD_3] = 50; + gTasks[taskIdD].data[TDD_STATE]++; + break; + case 3: + if (gTasks[taskIdD].data[TDD_3] != 0) + gTasks[taskIdD].data[TDD_3]--; + else + gTasks[taskIdD].data[TDD_STATE] = 1; + break; + } +} + +void task_c_8144664(u8 taskIdC) +{ + switch (gTasks[taskIdC].data[TDC_0]) + { + case 0: + gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[TDC_5]++; + break; + case 1: + if (gUnknown_0203935A != 0) + { + gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); + gTasks[taskIdC].data[TDC_5]++; + } + else + { + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 2; + gTasks[taskIdC].data[TDC_5] = 0; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 2: + if (gTasks[taskIdC].data[TDC_5] < 64) + { + gTasks[taskIdC].data[TDC_5]++; + gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); + } + else + { + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 3: + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 3; + gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 1; + gTasks[taskIdC].data[TDC_4] = 120; + gTasks[taskIdC].data[TDC_0]++; + break; + case 4: + if (gTasks[taskIdC].data[TDC_4] != 0) + { + gTasks[taskIdC].data[TDC_4]--; + } + else + { + gTasks[taskIdC].data[TDC_5] = 64; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 5: + if (gTasks[taskIdC].data[TDC_5] > 0) + { + gTasks[taskIdC].data[TDC_5]--; + gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); + } + else + { + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 1; + gTasks[taskIdC].data[TDC_0]++; + } + break; + case 6: + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 10: + gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 2; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 20: + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 4; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 30: + gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 5; + gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 3; + gTasks[taskIdC].data[TDC_0] = 50; + break; + case 50: + gTasks[taskIdC].data[TDC_0] = 0; + break; + } +} + +void task_e_8144934(u8 taskIdE) +{ + s16 taskIdC; + + switch (gTasks[taskIdE].data[TDE_0]) + { + default: + case 0: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + + if (gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_B_ID]].data[TDB_CURRENT_PAGE] == PAGE_ART_DIRECTOR) + { + gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 20; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + } + sub_8149020(0); + break; + case 1: + sub_8149020(0); + break; + case 2: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + taskIdC = gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]; + + // Floor to multiple of 128 + if ((gTasks[taskIdC].data[TDC_5] & -128) == 640) + { + gTasks[taskIdC].data[TDC_0] = 1; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + } + sub_8149020(1); + break; + case 3: + if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + { + + if (gTasks[taskIdE].data[TDE_1] == UNK_DEF_1F3) + { + gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 10; + gTasks[taskIdE].data[TDE_1] = 0x7FFF; + } + else + { + gTasks[taskIdE].data[TDE_1] += 1; + } + } + sub_8149020(1); + break; + case 4: + sub_8149020(2); + break; + } +} + +static void sub_8144A68(u8 data, u8 taskIdA) +{ + switch (data) + { + case 0: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8); + break; + case 1: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8); + break; + case 2: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8); + break; + case 3: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8); + break; + case 4: + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 88; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; + gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; + gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; + gTasks[taskIdA].data[TDA_0] = sub_8148EC0(2, 0x2000, 0x200, 8); + break; + } + + gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(task_e_8144934, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_0] = data; + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_1] = 0; + gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_TASK_A_ID] = taskIdA; + + gTasks[taskIdA].data[TDA_TASK_C_ID] = CreateTask(task_c_8144664, 0); + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_0] = 0; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_1] = taskIdA; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_2] = gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_3] = gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]; + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_4] = 0; + + if (data == 2) + gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_5] = UNK_DEFINE_45; +} + +static bool8 sub_8144ECC(u8 data, u8 taskIdA) +{ + u8 spriteId; + + switch (gMain.state) + { + default: + case 0: + REG_DISPCNT = 0; + REG_BG3HOFS = 8; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + ResetSpriteData(); + FreeAllSpritePalettes(); + gMain.state = 1; + break; + case 1: + gUnknown_02039358 = 34; + gUnknown_0203935A = 0; + sub_8148CB0(data); + gMain.state += 1; + break; + case 2: + if (gSaveBlock2.playerGender == MALE) + { + LoadCompressedObjectPic(gIntro2BrendanSpriteSheet); + LoadCompressedObjectPic(gUnknown_08416E34); + LoadCompressedObjectPic(gIntro2BicycleSpriteSheet); + LoadSpritePalettes(gIntro2SpritePalettes); + + spriteId = intro_create_brendan_sprite(120, 46); + gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; + gSprites[spriteId].callback = spritecb_player_8145378; + gSprites[spriteId].anims = gSpriteAnimTable_0840CA54; + + spriteId = intro_create_may_sprite(272, 46); + gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; + gSprites[spriteId].callback = spritecb_rival_8145420; + gSprites[spriteId].anims = gSpriteAnimTable_0840CA94; + } + else + { + LoadCompressedObjectPic(gIntro2MaySpriteSheet); + LoadCompressedObjectPic(gUnknown_08416E24); + LoadCompressedObjectPic(gIntro2BicycleSpriteSheet); + LoadSpritePalettes(gIntro2SpritePalettes); + + spriteId = intro_create_may_sprite(120, 46); + gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; + gSprites[spriteId].callback = spritecb_player_8145378; + gSprites[spriteId].anims = gSpriteAnimTable_0840CA54; + + spriteId = intro_create_brendan_sprite(272, 46); + gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; + gSprites[spriteId].callback = spritecb_rival_8145420; + gSprites[spriteId].anims = gSpriteAnimTable_0840CA94; + }; + gMain.state += 1; + break; + case 3: + sub_8144A68(data, taskIdA); + sub_8148E90(data); + gMain.state = 0; + return TRUE; + } + return FALSE; +} + +static void sub_81450AC(u8 taskIdA) +{ + if (gTasks[taskIdA].data[TDA_0] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_0]); + gTasks[taskIdA].data[TDA_0] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_C_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_C_ID]); + gTasks[taskIdA].data[TDA_TASK_C_ID] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_E_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_E_ID]); + gTasks[taskIdA].data[TDA_TASK_E_ID] = 0; + } + + if (gTasks[taskIdA].data[TDA_TASK_D_ID] != 0) + { + DestroyTask(gTasks[taskIdA].data[TDA_TASK_D_ID]); + gTasks[taskIdA].data[TDA_TASK_D_ID] = 0; + } + + gUnknown_0203935C = 1; +} + +static void sub_8145128(u16 arg0, u16 arg1, u16 arg2) +{ + u16 baseTile; + u16 i; + + LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *) (VRAM + arg0)); + LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal)); + + baseTile = (arg2 / 16) << 12; + + for (i = 0; i < 32 * 32; i++) + ((u16 *) (VRAM + arg1))[i] = baseTile + 1; + + for (i = 0; i < 21; i++) + ((u16 *) (VRAM + arg1))[7 * 32 + 4 + i] = i + 2 + baseTile; + + for (i = 0; i < 20; i++) + ((u16 *) (VRAM + arg1))[9 * 32 + 4 + i] = i + 23 + baseTile; + + for (i = 0; i < 23; i++) + ((u16 *) (VRAM + arg1))[11 * 32 + 4 + i] = i + 43 + baseTile; + + for (i = 0; i < 12; i++) + ((u16 *) (VRAM + arg1))[13 * 32 + 4 + i] = i + 66 + baseTile; +} + +u16 sub_8145208(u8 arg0) +{ + u16 out = (arg0 & 0x3F) + 80; + + if (arg0 == 0xFF) + return 1; + + if (arg0 & (1 << 7)) + out |= 1 << 11; + if (arg0 & (1 << 6)) + out |= 1 << 10; + + return out; +} + +void sub_814524C(const u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette) +{ + u8 y, x; + const u16 tileOffset = (palette / 16) << 12; + + for (y = 0; y < 5; y++) + { + for (x = 0; x < 3; x++) + ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8145208(arg0[y * 3 + x]); + } +} + +static void sub_81452D0(u16 arg0, u16 palette) +{ + u16 pos; + u16 baseTile = (palette / 16) << 12; + + for (pos = 0; pos < 32 * 32; pos++) + ((u16 *) (VRAM + arg0))[pos] = baseTile + 1; + +#if ENGLISH + sub_814524C(gUnknown_0840B83C, 3, 7, arg0, palette); + sub_814524C(gUnknown_0840B84B, 7, 7, arg0, palette); + sub_814524C(gUnknown_0840B85A, 11, 7, arg0, palette); + sub_814524C(gUnknown_0840B85A, 16, 7, arg0, palette); + sub_814524C(gUnknown_0840B869, 20, 7, arg0, palette); + sub_814524C(gUnknown_0840B878, 24, 7, arg0, palette); +#elif GERMAN + sub_814524C(gUnknown_0840B85A, 7, 7, arg0, palette); + sub_814524C(gUnknown_0840B869, 11, 7, arg0, palette); + sub_814524C(gUnknown_0840B878, 15, 7, arg0, palette); + sub_814524C(gUnknown_0840B85A, 19, 7, arg0, palette); +#endif +} + +static void spritecb_player_8145378(struct Sprite *sprite) +{ + if (gUnknown_0203935C != 0) + { + DestroySprite(sprite); + return; + } + + switch (sprite->data[0]) + { + case 0: + StartSpriteAnimIfDifferent(sprite, 0); + break; + case 1: + StartSpriteAnimIfDifferent(sprite, 1); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + case 2: + StartSpriteAnimIfDifferent(sprite, 2); + break; + case 3: + StartSpriteAnimIfDifferent(sprite, 3); + break; + case 4: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > 120) + sprite->pos1.x -= 1; + break; + case 5: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + } +} + +static void spritecb_rival_8145420(struct Sprite *sprite) +{ + if (gUnknown_0203935C != 0) + { + DestroySprite(sprite); + return; + } + + switch (sprite->data[0]) + { + case 0: + sprite->pos2.y = 0; + StartSpriteAnimIfDifferent(sprite, 0); + break; + case 1: + if (sprite->pos1.x > 200) + StartSpriteAnimIfDifferent(sprite, 1); + else + StartSpriteAnimIfDifferent(sprite, 2); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 2; + sprite->pos2.y = -gUnknown_0203935A; + break; + case 2: + sprite->data[7] += 1; + StartSpriteAnimIfDifferent(sprite, 0); + if ((sprite->data[7] & 3) == 0) + sprite->pos1.x += 1; + break; + case 3: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 1; + break; + } +} + +void spritecb_81454E0(struct Sprite *sprite) +{ + if (gUnknown_0203935C) + { + DestroySprite(sprite); + return; + } + + sprite->data[7] += 1; + switch (sprite->data[0]) + { + case 0: + default: + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = sprite->data[1]; + sprite->data[2] = 16; + SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); + sprite->invisible = FALSE; + sprite->data[0] = 1; + break; + case 1: + if (sprite->data[2] < 256) + { + sprite->data[2] += 8; + SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); + } + else + { + sprite->data[0] += 1; + } + switch (sprite->data[1]) + { + case 1: + if ((sprite->data[7] & 3) == 0) + sprite->pos1.y += 1; + sprite->pos1.x -= 2; + break; + case 2: + break; + case 3: + if ((sprite->data[7] & 3) == 0) + sprite->pos1.y += 1; + sprite->pos1.x += 2; + break; + } + break; + case 2: + if (sprite->data[3] != 0) + { + sprite->data[3] -= 1; + } + else + { + REG_BLDCNT = 0xF40; + REG_BLDALPHA = 0x10; + sprite->oam.objMode = 1; + sprite->data[3] = 16; + sprite->data[0] += 1; + } + break; + case 3: + if (sprite->data[3] != 0) + { + int data3; + vu16 *reg; + + sprite->data[3] -= 1; + + reg = ®_BLDALPHA; + data3 = 16 - sprite->data[3]; + *reg = (data3 << 8) + sprite->data[3]; + } + else + { + sprite->invisible = TRUE; + sprite->data[0] = 10; + } + break; + case 10: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroySprite(sprite); + break; + } +} + +static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position) +{ + u32 personality; + const u8 *lzPaletteData; + u8 spriteId; + u8 spriteId2; + + species = NationalPokedexNumToSpecies(species); + switch (species) + { + default: + personality = 0; + break; + case SPECIES_SPINDA: + personality = gSaveBlock2.pokedex.spindaPersonality; + break; + case SPECIES_UNOWN: + personality = gSaveBlock2.pokedex.unownPersonality; + break; + } + + LoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + 0x2000000, + gUnknown_0840B5A0[position], + species, + personality, + 1 + ); + + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF); + LoadCompressedPalette(lzPaletteData, 0x100 + (position * 16), 0x20); + sub_8143648(position, position); + + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].oam.paletteNum = position; + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].data[1] = position + 1; + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].callback = spritecb_81454E0; + + spriteId2 = CreateSprite(&gSpriteTemplate_840CAEC, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1); + gSprites[spriteId2].data[0] = spriteId; + + StartSpriteAnimIfDifferent(&gSprites[spriteId2], position); + + return spriteId; +} + +void spritecb_814580C(struct Sprite *sprite) +{ + if (gSprites[sprite->data[0]].data[0] == 10 || gUnknown_0203935C) + { + DestroySprite(sprite); + return; + } + + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->oam.objMode = gSprites[sprite->data[0]].oam.objMode; + sprite->oam.affineMode = gSprites[sprite->data[0]].oam.affineMode; + sprite->oam.matrixNum = gSprites[sprite->data[0]].oam.matrixNum; + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; +} + +static void sub_81458DC(void) +{ + struct Unk201C000 *unk201C000 = &ewram1c000; + u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_STARTER_MON))); + u16 seenTypesCount; + u16 page; + u16 dexNum; + u16 j; + + for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++) + { + if (GetSetPokedexFlag(dexNum, 1)) + { + unk201C000->unk90[seenTypesCount] = dexNum; + seenTypesCount++; + } + } + + for (dexNum = seenTypesCount; dexNum < 386; dexNum++) + unk201C000->unk90[dexNum] = 0; + + unk201C000->unk394 = seenTypesCount; + if (unk201C000->unk394 < POKEMON_TILE_COUNT) + unk201C000->unk8E = seenTypesCount; + else + unk201C000->unk8E = POKEMON_TILE_COUNT; + + j = 0; + do + { + page = Random() % unk201C000->unk394; + unk201C000->unk0[j] = unk201C000->unk90[page]; + + j++; + unk201C000->unk90[page] = 0; + unk201C000->unk394--; + if (page != unk201C000->unk394) + { + unk201C000->unk90[page] = unk201C000->unk90[unk201C000->unk394]; + unk201C000->unk90[unk201C000->unk394] = 0; + } + } + while (unk201C000->unk394 != 0 && j < POKEMON_TILE_COUNT); + + if (unk201C000->unk8E < POKEMON_TILE_COUNT) + { + for (j = unk201C000->unk8E, page = 0; j < POKEMON_TILE_COUNT; j++) + { + unk201C000->unk0[j] = unk201C000->unk0[page]; + + page++; + if (page == unk201C000->unk8E) + page = 0; + } + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + else + { + for (dexNum = 0; unk201C000->unk0[dexNum] != starter && dexNum < POKEMON_TILE_COUNT; dexNum++); + + if (dexNum < unk201C000->unk8E - 1) + { + unk201C000->unk0[dexNum] = unk201C000->unk0[POKEMON_TILE_COUNT - 1]; + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + else + { + unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; + } + } + unk201C000->unk8E = POKEMON_TILE_COUNT; +} diff --git a/src/cute_sketch.c b/src/cute_sketch.c new file mode 100644 index 000000000..5317bc334 --- /dev/null +++ b/src/cute_sketch.c @@ -0,0 +1,164 @@ +#include "global.h" +#include "cute_sketch.h" +#include "contest_painting.h" + +extern u16 (*gUnknown_03005DEC)[][32]; +extern u8 gUnknown_03005E00; +extern u8 gUnknown_03005DFC; +extern u8 gUnknown_03005DF8; +extern u8 gUnknown_03005DF0; +extern u8 gUnknown_03005E04; +extern u8 gUnknown_03005DF4; + +extern u8 gUnknown_03005DE8; + +// this file's functions +void sub_80FCAA4(void); +void sub_80FCB5C(void); +void sub_80FCD54(void); +void sub_80FCEA4(void); +void sub_80FCCBC(void); +void sub_80FD06C(void); +void sub_80FD114(void); +void sub_80FCF3C(void); +void sub_80FCAC4(void); +void sub_80FCC18(u8); +void sub_80FC92C(u8); +void sub_80FC9E4(u8); +void sub_80FD1C8(u16); +u16 sub_80FD39C(u16*); +u16 sub_80FD68C(u16*, u16*, u16*); + +void sub_80FC7A0(struct Unk03005E20* info) +{ + gUnknown_03005DEC = info->var_4; + gUnknown_03005E00 = info->var_1F; + gUnknown_03005DE8 = info->var_19; + gUnknown_03005DFC = info->var_1A; + gUnknown_03005DF8 = info->var_1B; + gUnknown_03005DF0 = info->var_1C; + gUnknown_03005E04 = info->var_1D; + gUnknown_03005DF4 = info->var_1E; + switch (info->var_0) + { + case 2: + sub_80FCAA4(); + break; + case 8: + sub_80FCB5C(); + break; + case 9: + sub_80FCD54(); + sub_80FCC18(gUnknown_03005E00); + break; + case 10: + sub_80FCD54(); + sub_80FCEA4(); + sub_80FCCBC(); + case 31: + sub_80FCEA4(); + break; + case 11: + sub_80FCD54(); + sub_80FD06C(); + sub_80FD06C(); + sub_80FD114(); + sub_80FCCBC(); + break; + case 13: + sub_80FCF3C(); + break; + case 30: + sub_80FCD54(); + break; + case 32: + sub_80FD06C(); + break; + case 33: + sub_80FD114(); + break; + case 6: + sub_80FCAC4(); + sub_80FC92C(3); + break; + case 36: + sub_80FCD54(); + sub_80FD06C(); + sub_80FD114(); + sub_80FCCBC(); + sub_80FCB5C(); + sub_80FCB5C(); + sub_80FC92C(2); + sub_80FC9E4(4); + break; + } +} + +#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r)) + +void sub_80FC92C(u8 a0) // it changes palette someway somehow... .__. +{ + u8 i, j; + for (i = 0; i < gUnknown_03005DF0; i++) + { + u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; + u16* pal = &var2[gUnknown_03005DE8]; + for (j = 0; j < gUnknown_03005DF8; j++, pal++) + { + if (!(0x8000 & *pal)) + { + u8 val = (31 & *pal); + val += a0; + if (val > 31) + val = 31; + + *pal = RGB2(val, val, val); + } + } + } +} + +void sub_80FC9E4(u8 a0) +{ + u8 i, j; + for (i = 0; i < gUnknown_03005DF0; i++) + { + u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; + u16* pal = &var2[gUnknown_03005DE8]; + for (j = 0; j < gUnknown_03005DF8; j++, pal++) + { + if (!(0x8000 & *pal)) + { + u8 val = (31 & *pal); + if (val > 31 - a0) + val = 31 - (a0 >> 1); + + *pal = RGB2(val, val, val); + } + } + } +} + +void sub_80FCAA4(void) +{ + u32 i; + for (i = 0; i < 3200; i++) + sub_80FD1C8(i); +} + +void sub_80FCAC4(void) +{ + u8 i, j; + for (i = 0; i < gUnknown_03005DF0; i++) + { + u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; + u16* pal = &var2[gUnknown_03005DE8]; + for (j = 0; j < gUnknown_03005DF8; j++, pal++) + { + if (!(0x8000 & *pal)) + { + *pal = sub_80FD39C(pal); + } + } + } +} diff --git a/src/daycare.c b/src/daycare.c new file mode 100644 index 000000000..e26db531f --- /dev/null +++ b/src/daycare.c @@ -0,0 +1,1713 @@ +#include "global.h" +#include "daycare.h" +#include "event_data.h" +#include "field_effect.h" +#include "constants/items.h" +#include "mail_data.h" +#include "main.h" +#include "menu.h" +#include "constants/moves.h" +#include "name_string_util.h" +#include "overworld.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_storage_system.h" +#include "random.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "string_util.h" +#include "strings2.h" +#include "text.h" +#include "trade.h" + +// RAM buffers used to assist with BuildEggMoveset() +IWRAM_DATA u16 gHatchedEggLevelUpMoves[52]; +IWRAM_DATA u16 gHatchedEggFatherMoves[4]; +IWRAM_DATA u16 gHatchedEggFinalMoves[4]; +IWRAM_DATA u16 gHatchedEggEggMoves[12]; +IWRAM_DATA u16 gHatchedEggMotherMoves[4]; + +extern u16 gMoveToLearn; + +static void ClearDaycareMail(struct DayCareMail *); +static void SetInitialEggData(struct Pokemon *, u16, struct DayCare *); +static u8 GetDaycareCompatibilityScore(struct DayCare *); + +#include "data/pokemon/egg_moves.h" + +static const u8 *const sCompatibilityMessages[] = { + DaycareText_GetAlongVeryWell, + DaycareText_GetAlong, + DaycareText_DontLikeOther, + DaycareText_PlayOther +}; + +const u8 sJapaneseEggNickname[] = _("タマゴ"); + +u8 *GetMonNick(struct Pokemon *mon, u8 *dest) +{ + s8 nickname[POKEMON_NAME_LENGTH * 2]; + + GetMonData(mon, MON_DATA_NICKNAME, nickname); + return StringCopy10(dest, nickname); +} + +u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest) +{ + s8 nickname[POKEMON_NAME_LENGTH * 2]; + + GetBoxMonData(mon, MON_DATA_NICKNAME, nickname); + return StringCopy10(dest, nickname); +} + +u8 CountPokemonInDaycare(struct DayCare *daycare) +{ + u8 i, count; + count = 0; + + for (i = 0; i < 2; i++) + { + if (GetBoxMonData(&daycare->mons[i], MON_DATA_SPECIES) != 0) + count++; + } + + return count; +} + +void InitDaycareMailRecordMixing(struct BoxPokemon * daycareMons, struct RecordMixingDayCareMail * daycareMail) +{ + u8 i; + u8 numDaycareMons = 0; + + for (i = 0; i < 2; i++) + { + if (GetBoxMonData(&daycareMons[i], MON_DATA_SPECIES) != SPECIES_NONE) + { + numDaycareMons++; + if (GetBoxMonData(&daycareMons[i], MON_DATA_HELD_ITEM) == ITEM_NONE) + { + daycareMail->itemsHeld[i] = 0; + } + else + { + daycareMail->itemsHeld[i] = 1; + } + } + else + { + daycareMail->itemsHeld[i] = 1; + } + } + + daycareMail->numDaycareMons = numDaycareMons; +} + +static s8 Daycare_FindEmptySpot(struct BoxPokemon * daycareMons) +{ + u8 i; + + for (i = 0; i < 2; i++) + { + if (GetBoxMonData(&daycareMons[i], MON_DATA_SPECIES) == 0) + return i; + } + + return -1; +} + +static void StorePokemonInDaycare(struct Pokemon * mon, struct DayCare * daycare) +{ + s8 emptySlot; + u8 mail; + u8 *names; + + emptySlot = Daycare_FindEmptySpot(daycare->mons); + if (MonHasMail(mon)) + { + StringCopy((names = daycare->misc.mail[emptySlot].names), gSaveBlock2.playerName); + PadNameString(names, 0xFC); + names += 8; + GetMonNick(mon, names); + mail = GetMonData(mon, MON_DATA_MAIL); + daycare->misc.mail[emptySlot].message = gSaveBlock1.mail[mail]; + TakeMailFromMon(mon); + } + + daycare->mons[emptySlot] = mon->box; + BoxMonRestorePP(&daycare->mons[emptySlot]); + daycare->misc.countersEtc.steps[emptySlot] = 0; + ZeroMonData(mon); + party_compaction(); + CalculatePlayerPartyCount(); +} + +void StoreSelectedPokemonInDaycare(void) +{ + StorePokemonInDaycare(&gPlayerParty[gLastFieldPokeMenuOpened], &gSaveBlock1.daycare); +} + +// Shifts the second daycare pokemon slot into the first slot. +static void ShiftDaycareSlots(struct DayCare * daycare) +{ + // This condition is only satisfied when the player takes out the first pokemon from the daycare. + if (GetBoxMonData(&daycare->mons[1], MON_DATA_SPECIES) != 0 && GetBoxMonData(&daycare->mons[0], MON_DATA_SPECIES) == 0) + { + daycare->mons[0] = daycare->mons[1]; + ZeroBoxMonData(&daycare->mons[1]); + + daycare->misc.mail[0] = daycare->misc.mail[1]; + daycare->misc.countersEtc.steps[0] = daycare->misc.countersEtc.steps[1]; + daycare->misc.countersEtc.steps[1] = 0; + ClearDaycareMail(&daycare->misc.mail[1]); + } +} + +static void ApplyDaycareExperience(struct Pokemon * mon) +{ + s32 i; + bool8 firstMove; + u16 learnedMove; + + for (i = 0; i < MAX_LEVEL; i++) + { + // Add the mon's gained daycare experience level by level until it can't level up anymore. + if (TryIncrementMonLevel(mon)) + { + // Teach the mon new moves it learned while in the daycare. + firstMove = TRUE; + while ((learnedMove = MonTryLearningNewMove(mon, firstMove)) != 0) + { + firstMove = FALSE; + if (learnedMove == 0xffff) + { + // Mon already knows 4 moves. + DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn); + } + } + } + else + { + break; + } + } + + // Re-calculate the mons stats at its new level. + CalculateMonStats(mon); +} + +static u16 TakeSelectedPokemonFromDaycare(struct DayCare * daycare, u8 slot) +{ + u16 species; + u32 experience; + struct Pokemon pokemon; + + GetBoxMonNick(&daycare->mons[slot], gStringVar1); + species = GetBoxMonData(&daycare->mons[slot], MON_DATA_SPECIES); + ExpandBoxMon(&daycare->mons[slot], &pokemon); + + if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) + { + experience = GetMonData(&pokemon, MON_DATA_EXP) + daycare->misc.countersEtc.steps[slot]; + SetMonData(&pokemon, MON_DATA_EXP, &experience); + ApplyDaycareExperience(&pokemon); + } + + gPlayerParty[PARTY_SIZE - 1] = pokemon; + if (daycare->misc.mail[slot].message.itemId) + { + GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycare->misc.mail[slot].message); + ClearDaycareMail(&daycare->misc.mail[slot]); + } + + party_compaction(); + ZeroBoxMonData(&daycare->mons[slot]); + daycare->misc.countersEtc.steps[slot] = 0; + ShiftDaycareSlots(daycare); + CalculatePlayerPartyCount(); + return species; +} + +u16 TakePokemonFromDaycare(void) +{ + return TakeSelectedPokemonFromDaycare(&gSaveBlock1.daycare, gSpecialVar_0x8004); +} + +static u8 GetLevelAfterDaycareSteps(struct BoxPokemon * mon, u32 steps) +{ + struct BoxPokemon tempMon = *mon; + + u32 experience = GetBoxMonData(mon, MON_DATA_EXP) + steps; + SetBoxMonData(&tempMon, MON_DATA_EXP, &experience); + return GetLevelFromBoxMonExp(&tempMon); +} + +static u8 GetNumLevelsGainedFromSteps(struct DayCare *daycare, u8 slot) +{ + u8 levelBefore; + u8 levelAfter; + + levelBefore = GetLevelFromBoxMonExp(&daycare->mons[slot]); + levelAfter = GetLevelAfterDaycareSteps(&daycare->mons[slot], daycare->misc.countersEtc.steps[slot]); + return levelAfter - levelBefore; +} + +static u8 GetNumLevelsGainedForDaycareSlot(struct DayCare *daycare, u8 slot) +{ + u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycare, slot); + GetBoxMonNick(&daycare->mons[slot], gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, numLevelsGained, STR_CONV_MODE_LEFT_ALIGN, 2); + return numLevelsGained; +} + +static u16 GetDaycareCostForSelectedMon(struct DayCare *daycare, u8 slot) +{ + u16 cost; + + u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycare, slot); + GetBoxMonNick(&daycare->mons[slot], gStringVar1); + cost = 100 + 100 * numLevelsGained; + ConvertIntToDecimalStringN(gStringVar2, cost, STR_CONV_MODE_LEFT_ALIGN, 5); + return cost; +} + +void GetDaycareCost(void) +{ + gSpecialVar_0x8005 = GetDaycareCostForSelectedMon(&gSaveBlock1.daycare, gSpecialVar_0x8004); +} + +void Debug_AddDaycareSteps(u16 numSteps) +{ + gSaveBlock1.daycare.misc.countersEtc.steps[0] += numSteps; + gSaveBlock1.daycare.misc.countersEtc.steps[1] += numSteps; +} + +u8 GetNumLevelsGainedFromDaycare(void) +{ + if (GetBoxMonData(&gSaveBlock1.daycare.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0) + return GetNumLevelsGainedForDaycareSlot(&gSaveBlock1.daycare, gSpecialVar_0x8004); + + return 0; +} + +static void ClearDaycareMail(struct DayCareMail *mail) +{ + u8 *names; + u8 *names2; + s32 i; + u8 zero = 0; + + for (i = 7, names = &mail->names[7]; i >= 0; i--) + { + *names-- = zero; + } + + names2 = &mail->names[8]; + zero = 0; + names = &mail->names[18]; + do *names-- = zero; while ((s32)names >= (s32)names2); + ClearMailStruct(&mail->message); +} + +void unref_sub_8041824(struct DayCare *daycare) +{ + u8 slot; + for (slot = 0; slot < ARRAY_COUNT(daycare->mons); slot++) + { + ZeroBoxMonData(&daycare->mons[slot]); + daycare->misc.countersEtc.steps[slot] = 0; + ClearDaycareMail(&daycare->misc.mail[slot]); + } + + daycare->misc.countersEtc.pendingEggPersonality = 0; + daycare->misc.countersEtc.eggCycleStepsRemaining = 0; +} + +// Determines what the species of an Egg would be based on the given species. +// It determines this by working backwards through the evolution chain of the +// given species. +u16 GetEggSpecies(u16 species) +{ + int i, j, k; + bool8 found; + + // Working backwards up to 5 times seems arbitrary, since the maximum number + // of times would only be 3 for 3-stage evolutions. + for (i = 0; i < 5; i++) + { + found = FALSE; + for (j = 1; j < NUM_SPECIES; j++) + { + for (k = 0; k < 5; k++) + { + if (gEvolutionTable[j][k].targetSpecies == species) + { + species = j; + found = TRUE; + break; + } + } + + if (found) + break; + } + + if (j == NUM_SPECIES) + break; + } + + return species; +} + +static void _TriggerPendingDaycareEgg(struct DayCare *daycare) +{ + daycare->misc.countersEtc.pendingEggPersonality = (Random() % 0xfffe) + 1; + FlagSet(FLAG_PENDING_DAYCARE_EGG); +} + +static void _TriggerPendingDaycareMaleEgg(struct DayCare *daycare) +{ + daycare->misc.countersEtc.pendingEggPersonality = Random() | 0x8000; + FlagSet(FLAG_PENDING_DAYCARE_EGG); +} + +void TriggerPendingDaycareEgg(void) +{ + _TriggerPendingDaycareEgg(&gSaveBlock1.daycare); +} + +void TriggerPendingDaycareMaleEgg(void) +{ + _TriggerPendingDaycareMaleEgg(&gSaveBlock1.daycare); +} + +// Removes the selected index from the given IV list and shifts the remaining +// elements to the left. +static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) +{ + s32 i, j; + u8 temp[NUM_STATS]; + + ivs[selectedIv] = 0xff; + for (i = 0; i < NUM_STATS; i++) + { + temp[i] = ivs[i]; + } + + j = 0; + for (i = 0; i < NUM_STATS; i++) + { + if (temp[i] != 0xff) + ivs[j++] = temp[i]; + } +} + +static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare) +{ + u8 i; + u8 selectedIvs[3]; + u8 availableIVs[NUM_STATS]; + u8 whichParent[ARRAY_COUNT(selectedIvs)]; + u8 iv; + + // Initialize a list of IV indices. + for (i = 0; i < NUM_STATS; i++) + { + availableIVs[i] = i; + } + + // Select the 3 IVs that will be inherited. + for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) + { + // Randomly pick an IV from the available list. + selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)]; + + // Remove the selected IV index from the available IV indicies. + RemoveIVIndexFromList(availableIVs, selectedIvs[i]); + } + + // Determine which parent each of the selected IVs should inherit from. + for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) + { + whichParent[i] = Random() % 2; + } + + // Set each of inherited IVs on the egg mon. + for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) + { + switch (selectedIvs[i]) + { + case 0: + iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_HP_IV); + SetMonData(egg, MON_DATA_HP_IV, &iv); + break; + case 1: + iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_ATK_IV); + SetMonData(egg, MON_DATA_ATK_IV, &iv); + break; + case 2: + iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_DEF_IV); + SetMonData(egg, MON_DATA_DEF_IV, &iv); + break; + case 3: + iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPEED_IV); + SetMonData(egg, MON_DATA_SPEED_IV, &iv); + break; + case 4: + iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPATK_IV); + SetMonData(egg, MON_DATA_SPATK_IV, &iv); + break; + case 5: + iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPDEF_IV); + SetMonData(egg, MON_DATA_SPDEF_IV, &iv); + break; + } + } +} + +#ifdef NONMATCHING +static +#endif +// Counts the number of egg moves a pokemon learns and stores the moves in +// the given array. +u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves) +{ + u16 eggMoveIdx; + u16 numEggMoves; + u16 species; + u16 i; + + numEggMoves = 0; + eggMoveIdx = 0; + species = GetMonData(pokemon, MON_DATA_SPECIES); + for (i = 0; i < ARRAY_COUNT(gEggMoves) - 1; i++) + { + if (gEggMoves[i] == species + EGG_MOVES_SPECIES_OFFSET) + { + eggMoveIdx = i + 1; + break; + } + } + + for (i = 0; i < 10; i++) + { + if (gEggMoves[eggMoveIdx + i] > EGG_MOVES_SPECIES_OFFSET) + { + // TODO: the curly braces around this if statement are required for a matching build. + break; + } + + eggMoves[i] = gEggMoves[eggMoveIdx + i]; + numEggMoves++; + } + + return numEggMoves; +} + +#ifdef NONMATCHING +void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother) +{ + u16 numSharedParentMoves; + u8 numLevelUpMoves; + u16 numEggMoves; + u16 i, j; + + numSharedParentMoves = 0; + for (i = 0; i < 4; i++) + { + gHatchedEggMotherMoves[i] = 0; + gHatchedEggFatherMoves[i] = 0; + gHatchedEggFinalMoves[i] = 0; + } + for (i = 0; i < 10; i++) + gHatchedEggEggMoves[i] = 0; + for (i = 0; i < 50; i++) + gHatchedEggLevelUpMoves[i] = 0; + + numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), gHatchedEggLevelUpMoves); + for (i = 0; i < 4; i++) + { + gHatchedEggFatherMoves[i] = GetBoxMonData(father, MON_DATA_MOVE1 + i); + gHatchedEggMotherMoves[i] = GetBoxMonData(mother, MON_DATA_MOVE1 + i); + } + + numEggMoves = GetEggMoves(egg, gHatchedEggEggMoves); + + for (i = 0; i < 4; i++) + { + if (gHatchedEggFatherMoves[i] != MOVE_NONE) + { + for (j = 0; j < (u32)numEggMoves; j++) + { + if (gHatchedEggFatherMoves[i] == gHatchedEggEggMoves[j]) + { + if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]); + break; + } + } + } + else + break; + } + for (i = 0; i < 4; i++) + { + if (gHatchedEggFatherMoves[i] != MOVE_NONE) + { + for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) + { + if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01_FOCUS_PUNCH + j) && CanMonLearnTMHM(egg, j)) + { + if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]); + } + } + } + } + for (i = 0; i < 4; i++) + { + if (gHatchedEggFatherMoves[i] == MOVE_NONE) + break; + for (j = 0; j < 4; j++) + { + if (gHatchedEggFatherMoves[i] == gHatchedEggMotherMoves[j] && gHatchedEggFatherMoves[i] != MOVE_NONE) + gHatchedEggFinalMoves[numSharedParentMoves++] = gHatchedEggFatherMoves[i]; + } + } + + for (i = 0; i < 4; i++) + { + if (gHatchedEggFinalMoves[i] == MOVE_NONE) + break; + for (j = 0; j < numLevelUpMoves; j++) + { + if (gHatchedEggLevelUpMoves[j] != MOVE_NONE && gHatchedEggFinalMoves[i] == gHatchedEggLevelUpMoves[j]) + { + if (GiveMoveToMon(egg, gHatchedEggFinalMoves[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFinalMoves[i]); + break; + } + } + } +} +#else +__attribute__((naked)) +void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0xC\n" + "\tadds r7, r0, 0\n" + "\tmov r10, r1\n" + "\tmov r9, r2\n" + "\tmovs r0, 0\n" + "\tstr r0, [sp]\n" + "\tmovs r6, 0\n" + "\tldr r5, _08041CC8 @ =gHatchedEggMotherMoves\n" + "\tmovs r2, 0\n" + "\tldr r4, _08041CCC @ =gHatchedEggFatherMoves\n" + "\tldr r3, _08041CD0 @ =gHatchedEggFinalMoves\n" + "_08041BE4:\n" + "\tlsls r1, r6, 1\n" + "\tadds r0, r1, r5\n" + "\tstrh r2, [r0]\n" + "\tadds r0, r1, r4\n" + "\tstrh r2, [r0]\n" + "\tadds r1, r3\n" + "\tstrh r2, [r1]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041BE4\n" + "\tmovs r6, 0\n" + "\tldr r2, _08041CD4 @ =gHatchedEggEggMoves\n" + "\tmovs r1, 0\n" + "_08041C02:\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r2\n" + "\tstrh r1, [r0]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x9\n" + "\tbls _08041C02\n" + "\tmovs r6, 0\n" + "\tldr r2, _08041CD8 @ =gHatchedEggLevelUpMoves\n" + "\tmovs r1, 0\n" + "_08041C18:\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r2\n" + "\tstrh r1, [r0]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x31\n" + "\tbls _08041C18\n" + "\tadds r0, r7, 0\n" + "\tmovs r1, 0xB\n" + "\tbl GetMonData\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r1, _08041CD8 @ =gHatchedEggLevelUpMoves\n" + "\tbl GetLevelUpMovesBySpecies\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tstr r0, [sp, 0x4]\n" + "\tmovs r6, 0\n" + "\tldr r1, _08041CCC @ =gHatchedEggFatherMoves\n" + "\tmov r8, r1\n" + "_08041C46:\n" + "\tadds r5, r6, 0\n" + "\tadds r5, 0xD\n" + "\tmov r0, r10\n" + "\tadds r1, r5, 0\n" + "\tbl GetBoxMonData\n" + "\tlsls r4, r6, 1\n" + "\tmov r2, r8\n" + "\tadds r1, r4, r2\n" + "\tstrh r0, [r1]\n" + "\tmov r0, r9\n" + "\tadds r1, r5, 0\n" + "\tbl GetBoxMonData\n" + "\tldr r1, _08041CC8 @ =gHatchedEggMotherMoves\n" + "\tadds r4, r1\n" + "\tstrh r0, [r4]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041C46\n" + "\tldr r1, _08041CD4 @ =gHatchedEggEggMoves\n" + "\tadds r0, r7, 0\n" + "\tbl GetEggMoves\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r8, r0\n" + "\tmovs r6, 0\n" + "_08041C82:\n" + "\tldr r0, _08041CCC @ =gHatchedEggFatherMoves\n" + "\tlsls r1, r6, 1\n" + "\tadds r2, r1, r0\n" + "\tldrh r1, [r2]\n" + "\tmov r9, r0\n" + "\tcmp r1, 0\n" + "\tbeq _08041CF8\n" + "\tmovs r5, 0\n" + "\tcmp r5, r8\n" + "\tbcs _08041CEA\n" + "\tadds r4, r2, 0\n" + "\tldr r2, _08041CDC @ =0x0000ffff\n" + "_08041C9A:\n" + "\tldr r0, _08041CD4 @ =gHatchedEggEggMoves\n" + "\tlsls r1, r5, 1\n" + "\tadds r1, r0\n" + "\tldrh r0, [r4]\n" + "\tldrh r1, [r1]\n" + "\tcmp r0, r1\n" + "\tbne _08041CE0\n" + "\tadds r1, r0, 0\n" + "\tadds r0, r7, 0\n" + "\tstr r2, [sp, 0x8]\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r2, [sp, 0x8]\n" + "\tcmp r0, r2\n" + "\tbne _08041CEA\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "\tb _08041CEA\n" + "\t.align 2, 0\n" + "_08041CC8: .4byte gHatchedEggMotherMoves\n" + "_08041CCC: .4byte gHatchedEggFatherMoves\n" + "_08041CD0: .4byte gHatchedEggFinalMoves\n" + "_08041CD4: .4byte gHatchedEggEggMoves\n" + "_08041CD8: .4byte gHatchedEggLevelUpMoves\n" + "_08041CDC: .4byte 0x0000ffff\n" + "_08041CE0:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, r8\n" + "\tbcc _08041C9A\n" + "_08041CEA:\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tldr r3, _08041E14 @ =gHatchedEggFatherMoves\n" + "\tmov r9, r3\n" + "\tcmp r6, 0x3\n" + "\tbls _08041C82\n" + "_08041CF8:\n" + "\tmovs r6, 0\n" + "_08041CFA:\n" + "\tlsls r0, r6, 1\n" + "\tmov r2, r9\n" + "\tadds r1, r0, r2\n" + "\tldrh r1, [r1]\n" + "\tadds r2, r0, 0\n" + "\tadds r6, 0x1\n" + "\tmov r8, r6\n" + "\tcmp r1, 0\n" + "\tbeq _08041D5C\n" + "\tmovs r5, 0\n" + "\tldr r0, _08041E14 @ =gHatchedEggFatherMoves\n" + "\tadds r4, r2, r0\n" + "\tldr r6, _08041E18 @ =0x0000ffff\n" + "\tmov r9, r0\n" + "_08041D16:\n" + "\tldr r3, _08041E1C @ =0x00000121\n" + "\tadds r0, r5, r3\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl ItemIdToBattleMoveId\n" + "\tldrh r1, [r4]\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r1, r0\n" + "\tbne _08041D52\n" + "\tlsls r1, r5, 24\n" + "\tlsrs r1, 24\n" + "\tadds r0, r7, 0\n" + "\tbl CanMonLearnTMHM\n" + "\tcmp r0, 0\n" + "\tbeq _08041D52\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, r6\n" + "\tbne _08041D52\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "_08041D52:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0x39\n" + "\tbls _08041D16\n" + "_08041D5C:\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041CFA\n" + "\tmovs r6, 0\n" + "\tmov r2, r9\n" + "\tldrh r0, [r2]\n" + "\tldr r3, _08041E20 @ =gHatchedEggFinalMoves\n" + "\tmov r10, r3\n" + "\tcmp r0, 0\n" + "\tbeq _08041DC6\n" + "\tmov r4, r9\n" + "\tldr r0, _08041E24 @ =gHatchedEggMotherMoves\n" + "\tmov r9, r0\n" + "\tmov r12, r10\n" + "_08041D7C:\n" + "\tmovs r5, 0\n" + "\tlsls r2, r6, 1\n" + "\tadds r6, 0x1\n" + "\tmov r8, r6\n" + "\tadds r3, r2, r4\n" + "_08041D86:\n" + "\tlsls r0, r5, 1\n" + "\tadd r0, r9\n" + "\tldrh r2, [r3]\n" + "\tadds r1, r2, 0\n" + "\tldrh r0, [r0]\n" + "\tcmp r1, r0\n" + "\tbne _08041DA8\n" + "\tcmp r1, 0\n" + "\tbeq _08041DA8\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tstr r0, [sp]\n" + "\tlsls r1, 1\n" + "\tadd r1, r12\n" + "\tstrh r2, [r1]\n" + "_08041DA8:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0x3\n" + "\tbls _08041D86\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbhi _08041DC6\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r4\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _08041D7C\n" + "_08041DC6:\n" + "\tmovs r6, 0\n" + "\tmov r2, r10\n" + "\tldrh r0, [r2]\n" + "\tcmp r0, 0\n" + "\tbeq _08041E50\n" + "_08041DD0:\n" + "\tmovs r5, 0\n" + "\tadds r3, r6, 0x1\n" + "\tmov r8, r3\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r5, r0\n" + "\tbcs _08041E38\n" + "\tldr r2, _08041E18 @ =0x0000ffff\n" + "_08041DDE:\n" + "\tldr r1, _08041E28 @ =gHatchedEggLevelUpMoves\n" + "\tlsls r0, r5, 1\n" + "\tadds r0, r1\n" + "\tldrh r1, [r0]\n" + "\tcmp r1, 0\n" + "\tbeq _08041E2C\n" + "\tlsls r0, r6, 1\n" + "\tmov r3, r10\n" + "\tadds r4, r0, r3\n" + "\tldrh r0, [r4]\n" + "\tcmp r0, r1\n" + "\tbne _08041E2C\n" + "\tadds r1, r0, 0\n" + "\tadds r0, r7, 0\n" + "\tstr r2, [sp, 0x8]\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r2, [sp, 0x8]\n" + "\tcmp r0, r2\n" + "\tbne _08041E38\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "\tb _08041E38\n" + "\t.align 2, 0\n" + "_08041E14: .4byte gHatchedEggFatherMoves\n" + "_08041E18: .4byte 0x0000ffff\n" + "_08041E1C: .4byte 0x00000121\n" + "_08041E20: .4byte gHatchedEggFinalMoves\n" + "_08041E24: .4byte gHatchedEggMotherMoves\n" + "_08041E28: .4byte gHatchedEggLevelUpMoves\n" + "_08041E2C:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r5, r0\n" + "\tbcc _08041DDE\n" + "_08041E38:\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbhi _08041E50\n" + "\tldr r0, _08041E60 @ =gHatchedEggFinalMoves\n" + "\tlsls r1, r6, 1\n" + "\tadds r1, r0\n" + "\tldrh r1, [r1]\n" + "\tmov r10, r0\n" + "\tcmp r1, 0\n" + "\tbne _08041DD0\n" + "_08041E50:\n" + "\tadd sp, 0xC\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08041E60: .4byte gHatchedEggFinalMoves"); +} +#endif + +static void RemoveEggFromDayCare(struct DayCare *daycare) +{ + daycare->misc.countersEtc.pendingEggPersonality = 0; + daycare->misc.countersEtc.eggCycleStepsRemaining = 0; +} + +void RejectEggFromDayCare(void) +{ + RemoveEggFromDayCare(&gSaveBlock1.daycare); +} + +static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare) +{ + u16 motherItem, fatherItem; + if (*species == SPECIES_WYNAUT || *species == SPECIES_AZURILL) + { + motherItem = GetBoxMonData(&daycare->mons[0], MON_DATA_HELD_ITEM); + fatherItem = GetBoxMonData(&daycare->mons[1], MON_DATA_HELD_ITEM); + if (*species == SPECIES_WYNAUT && motherItem != ITEM_LAX_INCENSE && fatherItem != ITEM_LAX_INCENSE) + { + *species = SPECIES_WOBBUFFET; + } + + if (*species == SPECIES_AZURILL && motherItem != ITEM_SEA_INCENSE && fatherItem != ITEM_SEA_INCENSE) + { + *species = SPECIES_MARILL; + } + } +} + +static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots) +{ + u16 i; + u16 species[2]; + u16 eggSpecies; + + // Determine which of the daycare mons is the mother and father of the egg. + // The 0th index of the parentSlots array is considered the mother slot, and the + // 1st index is the father slot. + for (i = 0; i < 2; i++) + { + species[i] = GetBoxMonData(&daycare->mons[i], MON_DATA_SPECIES); + if (species[i] == SPECIES_DITTO) + { + parentSlots[0] = i ^ 1; + parentSlots[1] = i; + } + else if (GetBoxMonGender(&daycare->mons[i]) == MON_FEMALE) + { + parentSlots[0] = i; + parentSlots[1] = i ^ 1; + } + } + + eggSpecies = GetEggSpecies(species[parentSlots[0]]); + if (eggSpecies == SPECIES_NIDORAN_F && daycare->misc.countersEtc.pendingEggPersonality & 0x8000) + { + eggSpecies = SPECIES_NIDORAN_M; + } + if (eggSpecies == SPECIES_ILLUMISE && daycare->misc.countersEtc.pendingEggPersonality & 0x8000) + { + eggSpecies = SPECIES_VOLBEAT; + } + + // Make Ditto the "mother" slot if the other daycare mon is male. + if (species[parentSlots[1]] == SPECIES_DITTO && GetBoxMonGender(&daycare->mons[parentSlots[0]]) != MON_FEMALE) + { + u8 temp = parentSlots[1]; + parentSlots[1] = parentSlots[0]; + parentSlots[0] = temp; + } + + return eggSpecies; +} + +static void _GiveEggFromDaycare(struct DayCare *daycare) // give_egg +{ + struct Pokemon egg; + u16 species; + u8 parentSlots[2]; // 0th index is "mother" daycare slot, 1st is "father" + u8 isEgg; + + species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots); + AlterEggSpeciesWithIncenseItem(&species, daycare); + SetInitialEggData(&egg, species, daycare); + InheritIVs(&egg, daycare); + BuildEggMoveset(&egg, &daycare->mons[parentSlots[1]], &daycare->mons[parentSlots[0]]); + isEgg = TRUE; + SetMonData(&egg, MON_DATA_IS_EGG, &isEgg); + gPlayerParty[5] = egg; + party_compaction(); + CalculatePlayerPartyCount(); + RemoveEggFromDayCare(daycare); +} + + +void CreateEgg(struct Pokemon *mon, u16 species, bool8 setMetLocation) +{ + u8 metLevel; + u16 ball; + u8 language; + u8 metLocation; + u8 isEgg; + + CreateMon(mon, species, 5, 0x20, FALSE, 0, FALSE, 0); + metLevel = 0; + ball = ITEM_POKE_BALL; + language = LANGUAGE_JAPANESE; + SetMonData(mon, MON_DATA_POKEBALL, &ball); + SetMonData(mon, MON_DATA_NICKNAME, sJapaneseEggNickname); + SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles); + SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); + SetMonData(mon, MON_DATA_LANGUAGE, &language); + if (setMetLocation) + { + metLocation = 253; // hot springs; see PokemonSummaryScreen_PrintEggTrainerMemo + SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation); + } + + isEgg = TRUE; + SetMonData(mon, MON_DATA_IS_EGG, &isEgg); +} + +static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare) +{ + u32 personality; + u16 ball; + u8 metLevel; + u8 language; + + personality = daycare->misc.countersEtc.pendingEggPersonality | (Random() << 16); + CreateMon(mon, species, 5, 0x20, TRUE, personality, FALSE, 0); + metLevel = 0; + ball = ITEM_POKE_BALL; + language = LANGUAGE_JAPANESE; + SetMonData(mon, MON_DATA_POKEBALL, &ball); + SetMonData(mon, MON_DATA_NICKNAME, sJapaneseEggNickname); + SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles); + SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); + SetMonData(mon, MON_DATA_LANGUAGE, &language); +} + +void GiveEggFromDaycare(void) +{ + _GiveEggFromDaycare(&gSaveBlock1.daycare); +} + +#ifdef NONMATCHING +static bool8 _ShouldEggHatch(struct DayCare *daycare) +{ + struct BoxPokemon *parent; + u32 i; + int v0; + int steps; + v0 = 0; + for (i=0, parent=&daycare->mons[0]; i<2; parent++, i++) + { + if (GetBoxMonData(parent, MON_DATA_SANITY_BIT2, v0)) + { + daycare->misc.countersEtc.steps[i]++; + v0++; + } + } + if (daycare->misc.countersEtc.pendingEggPersonality == 0 && v0 == 2 && daycare->misc.extra.misc[4] == 0xff && GetDaycareCompatibilityScore(daycare) > (u32)((u32)(Random() * 100) / 0xffff)) + { + TriggerPendingDaycareEgg(); + } + if ((++daycare->misc.countersEtc.eggCycleStepsRemaining) == 0xff) + { + for (i=0; imisc.countersEtc.pendingEggPersonality) | daycare->misc.countersEtc.pendingEggPersonality) >> 31; +} + +static void _GetDaycareMonNicknames(struct DayCare *daycare) +{ + u8 language; + if (GetBoxMonData(&daycare->mons[0], MON_DATA_SPECIES) != 0) + { + GetBoxMonNick(&daycare->mons[0], gStringVar1); + language = GetBoxMonData(&daycare->mons[0], MON_DATA_LANGUAGE); + GetBoxMonData(&daycare->mons[0], MON_DATA_OT_NAME, gStringVar3); + ConvertInternationalString(gStringVar3, language); + } + + if (GetBoxMonData(&daycare->mons[1], MON_DATA_SPECIES) != 0) + { + GetBoxMonNick(&daycare->mons[1], gStringVar2); + } +} + +u16 GetSelectedDaycareMonNickname(void) +{ + GetBoxMonNick(&gPlayerParty[gLastFieldPokeMenuOpened].box, gStringVar1); + return GetBoxMonData(&gPlayerParty[gLastFieldPokeMenuOpened].box, MON_DATA_SPECIES); +} + +void GetDaycareMonNicknames(void) +{ + _GetDaycareMonNicknames(&gSaveBlock1.daycare); +} + +u8 GetDaycareState(void) +{ + // The daycare can be in 4 possible states: + // 0: default state--no deposited mons, no egg + // 1: there is an egg waiting for the player to pick it up + // 2: there is a single pokemon in the daycare + // 3: there are two pokemon in the daycare, no egg + + u8 numMons; + if (IsEggPending(&gSaveBlock1.daycare)) + { + // There is an Egg waiting for the player. + return 1; + } + + numMons = CountPokemonInDaycare(&gSaveBlock1.daycare); + if (numMons != 0) + { + return numMons + 1; + } + + return 0; +} + +#ifdef NONMATCHING +static +#endif +bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2) +{ + // Determine if the two given egg group lists contain any of the + // same egg groups. + s32 i, j; + u16 *v0, *v1, v2; + + for (i = 0, v0 = eggGroups1; i < 2; v0++, i++) + { + for (j = 0, v2 = *v0, v1 = eggGroups2; j < 2; v1++, j++) + { + if (v2 == *v1) + { + return TRUE; + } + } + } + + return FALSE; +} + +#ifdef NONMATCHING +static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) +{ + u16 species[2]; + u32 otIds[2]; + u32 genders[2]; + u16 eggGroups[2][2]; + int i; + u16 *spc; + u32 *ids; + u32 *gnd; + u16 *egg1; + u16 *egg2; + struct BoxPokemon *parent; + + for (i=0, parent=&daycare->mons[0], spc=species, ids=otIds, gnd=genders, egg1=&eggGroups[0][0], egg2=&eggGroups[0][1]; i<2; spc++, egg1+=2, egg2+=2, parent++, i++) + { + *spc = GetBoxMonData(parent, MON_DATA_SPECIES); + *ids++ = GetBoxMonData(parent, MON_DATA_OT_ID); + *gnd++ = GetGenderFromSpeciesAndPersonality(*spc, GetBoxMonData(parent, MON_DATA_PERSONALITY)); + *egg1 = gBaseStats[*spc].eggGroup1; + *egg2 = gBaseStats[*spc].eggGroup2; + } + if (eggGroups[0][0] == 0xf) + { + return 0; + } + if (eggGroups[1][0] == 0xf) + { + return 0; + } + if (eggGroups[0][0] == 0xd && eggGroups[1][0] == 0xd) + { + return 0; + } + else if (eggGroups[0][0] == 0xd || eggGroups[1][0] == 0xd) + { + if (otIds[0] == otIds[1]) + { + return 20; + } + return 50; + } + if (genders[0] == genders[1] || genders[0] == MON_GENDERLESS || genders[1] == MON_GENDERLESS) + { + return 0; + } + if (!EggGroupsOverlap(eggGroups[0], eggGroups[1])) + { + return 0; + } + if (species[0] == species[1]) + { + if (otIds[0] == otIds[1]) + { + return 50; + } + return 70; + } + else + { + if (otIds[0] != otIds[1]) + { + return 50; + } + return 20; + } +} +#else +__attribute__((naked)) +static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x2C\n" + "\tmovs r1, 0\n" + "\tmov r8, r1\n" + "\tmov r2, sp\n" + "\tadds r2, 0x8\n" + "\tstr r2, [sp, 0x1C]\n" + "\tadd r1, sp, 0xC\n" + "\tmov r10, r1\n" + "\tadds r2, 0xC\n" + "\tstr r2, [sp, 0x20]\n" + "\tmov r1, sp\n" + "\tadds r1, 0x2\n" + "\tldr r2, _08042488 @ =gBaseStats\n" + "\tmov r9, r2\n" + "\tldr r5, [sp, 0x1C]\n" + "\tadds r7, r1, 0\n" + "\tmov r6, sp\n" + "\tldr r1, [sp, 0x20]\n" + "\tstr r1, [sp, 0x24]\n" + "\tmov r2, r10\n" + "\tstr r2, [sp, 0x28]\n" + "\tadds r4, r0, 0\n" + "_0804240E:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xB\n" + "\tbl GetBoxMonData\n" + "\tstrh r0, [r5]\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x1\n" + "\tbl GetBoxMonData\n" + "\tldr r1, [sp, 0x28]\n" + "\tstm r1!, {r0}\n" + "\tstr r1, [sp, 0x28]\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0\n" + "\tbl GetBoxMonData\n" + "\tadds r1, r0, 0\n" + "\tldrh r0, [r5]\n" + "\tbl GetGenderFromSpeciesAndPersonality\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tldr r2, [sp, 0x24]\n" + "\tstm r2!, {r0}\n" + "\tstr r2, [sp, 0x24]\n" + "\tldrh r1, [r5]\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tadd r0, r9\n" + "\tldrb r0, [r0, 0x14]\n" + "\tstrh r0, [r6]\n" + "\tldrh r1, [r5]\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tadd r0, r9\n" + "\tldrb r0, [r0, 0x15]\n" + "\tstrh r0, [r7]\n" + "\tadds r5, 0x2\n" + "\tadds r7, 0x4\n" + "\tadds r6, 0x4\n" + "\tadds r4, 0x50\n" + "\tmovs r0, 0x1\n" + "\tadd r8, r0\n" + "\tmov r1, r8\n" + "\tcmp r1, 0x1\n" + "\tbls _0804240E\n" + "\tmov r0, sp\n" + "\tldrh r1, [r0]\n" + "\tcmp r1, 0xF\n" + "\tbeq _08042484\n" + "\tldrh r0, [r0, 0x4]\n" + "\tcmp r0, 0xF\n" + "\tbeq _08042484\n" + "\tcmp r1, 0xD\n" + "\tbne _0804248C\n" + "\tcmp r0, 0xD\n" + "\tbne _08042490\n" + "_08042484:\n" + "\tmovs r0, 0\n" + "\tb _080424E4\n" + "\t.align 2, 0\n" + "_08042488: .4byte gBaseStats\n" + "_0804248C:\n" + "\tcmp r0, 0xD\n" + "\tbne _0804249C\n" + "_08042490:\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbeq _080424DE\n" + "\tb _080424E2\n" + "_0804249C:\n" + "\tldr r0, [sp, 0x14]\n" + "\tldr r2, [sp, 0x20]\n" + "\tldr r1, [r2, 0x4]\n" + "\tcmp r0, r1\n" + "\tbeq _08042484\n" + "\tcmp r0, 0xFF\n" + "\tbeq _08042484\n" + "\tcmp r1, 0xFF\n" + "\tbeq _08042484\n" + "\tadd r1, sp, 0x4\n" + "\tmov r0, sp\n" + "\tbl EggGroupsOverlap\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _08042484\n" + "\tldr r0, [sp, 0x1C]\n" + "\tldrh r1, [r0, 0x2]\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r1\n" + "\tbne _080424D4\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbeq _080424E2\n" + "\tmovs r0, 0x46\n" + "\tb _080424E4\n" + "_080424D4:\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbne _080424E2\n" + "_080424DE:\n" + "\tmovs r0, 0x14\n" + "\tb _080424E4\n" + "_080424E2:\n" + "\tmovs r0, 0x32\n" + "_080424E4:\n" + "\tadd sp, 0x2C\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +u8 GetDaycareCompatibilityScoreFromSave(void) +{ + return GetDaycareCompatibilityScore(&gSaveBlock1.daycare); +} + +void SetDaycareCompatibilityString(void) +{ + u8 whichString; + u8 relationshipScore; + + relationshipScore = GetDaycareCompatibilityScoreFromSave(); + whichString = 0; + if (relationshipScore == 0) + whichString = 3; + if (relationshipScore == 20) + whichString = 2; + if (relationshipScore == 50) + whichString = 1; + if (relationshipScore == 70) + whichString = 0; + + StringCopy(gStringVar4, sCompatibilityMessages[whichString]); +} + +bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) +{ + u8 i; + u8 flags[2]; + + flags[0] = flags[1] = 0; + for (i = 0; name[i] != EOS; i++) + { + if (name[i] == CHAR_MALE) flags[0]++; + if (name[i] == CHAR_FEMALE) flags[1]++; + } + if (genderRatio == MON_MALE && flags[0] && !flags[1]) + return TRUE; + if (genderRatio == MON_FEMALE && flags[1] && !flags[0]) + return TRUE; + return FALSE; +} + +static u8 *AppendGenderSymbol(u8 *name, u8 gender) +{ + if (gender == MON_MALE) + { + if (!NameHasGenderSymbol(name, MON_MALE)) + return StringAppend(name, gOtherText_MaleSymbol3); + } + else if (gender == MON_FEMALE) + { + if (!NameHasGenderSymbol(name, MON_FEMALE)) + return StringAppend(name, gOtherText_FemaleSymbol3); + } + + return StringAppend(name, gOtherText_GenderlessSymbol); +} + +static u8 *AppendMonGenderSymbol(u8 *name, struct BoxPokemon *boxMon) +{ + return AppendGenderSymbol(name, GetBoxMonGender(boxMon)); +} + +static void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest) +{ + u8 monNames[2][20]; + u8 i; + + *dest = EOS; + for (i = 0; i < 2; i++) + { + GetBoxMonNick(&daycare->mons[i], monNames[i]); + AppendMonGenderSymbol(monNames[i], &daycare->mons[i]); + } + + StringCopy(dest, monNames[0]); + StringAppend(dest, gOtherText_NewLine2); + StringAppend(dest, monNames[1]); + StringAppend(dest, gOtherText_NewLine2); + StringAppend(dest, gOtherText_CancelAndLv); +} + +static void GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest) +{ + u8 i; + u8 level; + + *dest = EOS; + for (i = 0; i < 2; i++) + { + level = GetLevelAfterDaycareSteps(&daycare->mons[i], daycare->misc.countersEtc.steps[i]); + dest[0] = 0x34; + dest[1] = 0xFC; + dest[2] = 0x14; + dest[3] = 0x06; + dest = ConvertIntToDecimalStringN(dest + 4, level, STR_CONV_MODE_RIGHT_ALIGN, 3); + dest[0] = 0xFC; + dest[1] = 0x14; + dest[2] = 0x00; + dest = StringCopy(dest + 3, gOtherText_NewLine2); + } + + *dest = EOS; +} + +static void HandleDaycareLevelMenuInput(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + if (gTasks[taskId].data[0] != 0) + { + gTasks[taskId].data[0] --; + Menu_MoveCursor(-1); + PlaySE(SE_SELECT); + } + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (gTasks[taskId].data[0] != 2) + { + gTasks[taskId].data[0]++; + Menu_MoveCursor(+1); + PlaySE(SE_SELECT); + } + } + else if (gMain.newKeys & A_BUTTON) + { + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = gSpecialVar_Result = gTasks[taskId].data[0]; + DestroyTask(taskId); + Menu_EraseWindowRect(15, 6, 29, 13); + EnableBothScriptContexts(); + } + else if (gMain.newKeys & B_BUTTON) + { + Menu_DestroyCursor(); + gLastFieldPokeMenuOpened = gSpecialVar_Result = 2; + DestroyTask(taskId); + Menu_EraseWindowRect(15, 6, 29, 13); + EnableBothScriptContexts(); + } +} + +void ShowDaycareLevelMenu(void) +{ + u8 buffer[100]; + Menu_DrawStdWindowFrame(15, 6, 29, 13); + GetDaycareLevelMenuText(&gSaveBlock1.daycare, buffer); + Menu_PrintText(buffer, 16, 7); + GetDaycareLevelMenuLevelText(&gSaveBlock1.daycare, buffer); + Menu_PrintTextPixelCoords(buffer, 0xce, 0x38, TRUE); + InitMenu(0, 16, 7, 3, 0, 13); + CreateTask(HandleDaycareLevelMenuInput, 3); +} + +void ChooseSendDaycareMon(void) +{ + OpenPartyMenu(PARTY_MENU_TYPE_DAYCARE, 0); + gMain.savedCallback = c2_exit_to_overworld_2_switch; +} diff --git a/src/decompress.c b/src/decompress.c new file mode 100644 index 000000000..69edf01aa --- /dev/null +++ b/src/decompress.c @@ -0,0 +1,113 @@ +#include "global.h" +#include "decompress.h" +#include "data2.h" +#include "constants/species.h" +#include "text.h" +#include "ewram.h" + +#define WRAM ewram_addr // using gSharedMem doesn't match + +void LZDecompressWram(const void *src, void *dest) +{ + LZ77UnCompWram(src, dest); +} + +void LZDecompressVram(const void *src, void *dest) +{ + LZ77UnCompVram(src, dest); +} + +void LoadCompressedObjectPic(const struct CompressedSpriteSheet *src) +{ + struct SpriteSheet dest; + + LZ77UnCompWram(src->data, (void *)WRAM); + dest.data = (void *)WRAM; + dest.size = src->size; + dest.tag = src->tag; + LoadSpriteSheet(&dest); +} + +void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) +{ + struct SpriteSheet dest; + + LZ77UnCompWram(src->data, buffer); + dest.data = buffer; + dest.size = src->size; + dest.tag = src->tag; + LoadSpriteSheet(&dest); +} + +void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src) +{ + struct SpritePalette dest; + + LZ77UnCompWram(src->data, (void *)WRAM); + dest.data = (void *)WRAM; + dest.tag = src->tag; + LoadSpritePalette(&dest); +} + +void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer) +{ + struct SpritePalette dest; + + LZ77UnCompWram(a->data, buffer); + dest.data = buffer; + dest.tag = a->tag; + LoadSpritePalette(&dest); +} + +void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, u8 b, u8 c, void *d, void *buffer, s32 species) +{ + if (species > SPECIES_EGG) + LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); + else + LZ77UnCompWram(src->data, buffer); +} + +void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g) +{ + u32 frontOrBack; + + // gUnknown_081FAF4C appears to be a list of pointers to locations to store poke pics for back and front pic here. the first and third pointers are used for back while the others are used for front. + if (dest == gUnknown_081FAF4C[0] || dest == gUnknown_081FAF4C[2]) + frontOrBack = 0; // backPic + else + frontOrBack = 1; // frontPic + + LoadSpecialPokePic(src, b, c, d, dest, species, g, frontOrBack); +} + +void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g, u32 frontOrBack) +{ + u8 frontOrBack8 = frontOrBack; + + if (species == SPECIES_UNOWN) + { + u16 i = (((g & 0x3000000) >> 18) | ((g & 0x30000) >> 12) | ((g & 0x300) >> 6) | (g & 3)) % 0x1C; + + // The other Unowns are separate from Unown A. + if (i == 0) + i = SPECIES_UNOWN; + else + i += SPECIES_UNOWN_B - 1; + + if (frontOrBack8 == 0) + LZ77UnCompWram(gMonBackPicTable[i].data, dest); + else + LZ77UnCompWram(gMonFrontPicTable[i].data, dest); + } + else if (species > SPECIES_EGG) // is species unknown? draw the ? icon + LZ77UnCompWram(gMonFrontPicTable[0].data, dest); + else + LZ77UnCompWram(src->data, dest); + + DrawSpindaSpots(species, g, dest, frontOrBack8); +} + +void Unused_LZDecompressWramIndirect(const void **src, void *dest) +{ + LZ77UnCompWram(*src, dest); +} diff --git a/src/decoration.c b/src/decoration.c new file mode 100644 index 000000000..477414993 --- /dev/null +++ b/src/decoration.c @@ -0,0 +1,4283 @@ +#include "global.h" +#include "constants/decorations.h" +#include "main.h" +#include "constants/map_objects.h" +#include "overworld.h" +#include "sound.h" +#include "constants/songs.h" +#include "string_util.h" +#include "menu.h" +#include "menu_helpers.h" +#include "strings.h" +#include "script.h" +#include "palette.h" +#include "field_player_avatar.h" +#include "field_camera.h" +#include "field_fadetransition.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "event_data.h" +#include "field_weather.h" +#include "decoration.h" +#include "shop.h" +#include "ewram.h" + +EWRAM_DATA u8 *gUnknown_020388D0 = NULL; +EWRAM_DATA u8 gUnknown_020388D4 = 0; +EWRAM_DATA u8 gUnknown_020388D5 = 0; +EWRAM_DATA u8 gUnknown_020388D6[16] = {0}; +EWRAM_DATA u8 gUnknown_020388E6[12] = {0}; +EWRAM_DATA u8 gUnknown_020388F2 = 0; +EWRAM_DATA u8 gUnknown_020388F3 = 0; +EWRAM_DATA u8 gUnknown_020388F4 = 0; +EWRAM_DATA u8 gUnknown_020388F5 = 0; +EWRAM_DATA u8 gUnknown_020388F6 = 0; +EWRAM_DATA u8 gUnknown_020388F7[8] = {0}; +EWRAM_DATA struct UnkStruct_02038900 gUnknown_02038900 = {0}; +EWRAM_DATA u16 gUnknown_020391A4 = 0; +EWRAM_DATA u16 gUnknown_020391A6 = 0; +EWRAM_DATA u8 gUnknown_020391A8 = 0; +EWRAM_DATA u8 gUnknown_020391A9 = 0; +EWRAM_DATA u8 gUnknown_020391AA = 0; +EWRAM_DATA struct OamData gUnknown_020391AC = {0}; +EWRAM_DATA struct UnkStruct_020391B4 gUnknown_020391B4[16] = {0}; +EWRAM_DATA u8 gUnknown_02039234 = 0; + +#if ENGLISH +const u8 DecorDesc_SMALL_DESK[] = _( + "A small desk built\n" + "for one."); + +const u8 DecorDesc_POKEMON_DESK[] = _( + "A small desk built in\n" + "the shape of a POKé\n" + "BALL."); + +const u8 DecorDesc_HEAVY_DESK[] = _( + "A large desk made\n" + "of steel. Put some\n" + "decorations on it."); + +const u8 DecorDesc_RAGGED_DESK[] = _( + "A large desk made\n" + "of wood. Put some\n" + "decorations on it."); + +const u8 DecorDesc_COMFORT_DESK[] = _( + "A large desk made\n" + "of leaves. Put some\n" + "decorations on it."); + +const u8 DecorDesc_PRETTY_DESK[] = _( + "A huge desk made\n" + "of glass. Holds lots\n" + "of decorations."); + +const u8 DecorDesc_BRICK_DESK[] = _( + "A huge desk made\n" + "of brick. Holds lots\n" + "of decorations."); + +const u8 DecorDesc_CAMP_DESK[] = _( + "A huge desk made\n" + "of logs. Put lots of\n" + "decorations on it."); + +const u8 DecorDesc_HARD_DESK[] = _( + "A huge desk made\n" + "of rocks. Holds\n" + "many decorations."); + +const u8 DecorDesc_SMALL_CHAIR[] = _( + "A small chair made\n" + "for one."); + +const u8 DecorDesc_POKEMON_CHAIR[] = _( + "A small chair built\n" + "in the shape of a\n" + "POKé BALL."); + +const u8 DecorDesc_HEAVY_CHAIR[] = _( + "A small chair made\n" + "of steel."); + +const u8 DecorDesc_PRETTY_CHAIR[] = _( + "A small chair made\n" + "of glass."); + +const u8 DecorDesc_COMFORT_CHAIR[] = _( + "A small chair made\n" + "of leaves."); + +const u8 DecorDesc_RAGGED_CHAIR[] = _( + "A small chair made\n" + "of wood."); + +const u8 DecorDesc_BRICK_CHAIR[] = _( + "A small chair made\n" + "of brick."); + +const u8 DecorDesc_CAMP_CHAIR[] = _( + "A small chair made\n" + "of logs."); + +const u8 DecorDesc_HARD_CHAIR[] = _( + "A small chair made\n" + "of rock."); + +const u8 DecorDesc_RED_PLANT[] = _( + "A vivid red potted\n" + "plant."); + +const u8 DecorDesc_TROPICAL_PLANT[] = _( + "A flowering tropical\n" + "plant in a pot."); + +const u8 DecorDesc_PRETTY_FLOWERS[] = _( + "A pot of cute\n" + "flowers."); + +const u8 DecorDesc_COLORFUL_PLANT[] = _( + "A large pot with\n" + "many colorful\n" + "flowers."); + +const u8 DecorDesc_BIG_PLANT[] = _( + "A large, umbrella-\n" + "shaped plant in a\n" + "big pot."); + +const u8 DecorDesc_GORGEOUS_PLANT[] = _( + "A large, impressive\n" + "plant in a big pot."); + +const u8 DecorDesc_RED_BRICK[] = _( + "A red-colored brick.\n" + "Decorations can be\n" + "placed on top."); + +const u8 DecorDesc_YELLOW_BRICK[] = _( + "A yellow-colored\n" + "brick. Put some\n" + "decorations on top."); + +const u8 DecorDesc_BLUE_BRICK[] = _( + "A blue-colored\n" + "brick. Put some\n" + "decorations on top."); + +const u8 DecorDesc_RED_BALLOON[] = _( + "A red balloon filled\n" + "with water. Bursts\n" + "if stepped on."); + +const u8 DecorDesc_BLUE_BALLOON[] = _( + "A blue balloon filled\n" + "with water. Bursts\n" + "if stepped on."); + +const u8 DecorDesc_YELLOW_BALLOON[] = _( + "A yellow balloon\n" + "filled with water.\n" + "Pops if stepped on."); + +const u8 DecorDesc_RED_TENT[] = _( + "A large red tent.\n" + "You can hide inside\n" + "it."); + +const u8 DecorDesc_BLUE_TENT[] = _( + "A large blue tent.\n" + "You can hide inside\n" + "it."); + +const u8 DecorDesc_SOLID_BOARD[] = _( + "Place over a hole to\n" + "cross to the other\n" + "side."); + +const u8 DecorDesc_SLIDE[] = _( + "Use to slide down\n" + "from the platform."); + +const u8 DecorDesc_FENCE_LENGTH[] = _( + "A small fence that\n" + "blocks passage."); + +const u8 DecorDesc_FENCE_WIDTH[] = _( + "A small fence that\n" + "blocks passage."); + +const u8 DecorDesc_TIRE[] = _( + "An old large tire.\n" + "Decorations can be\n" + "placed on top."); + +const u8 DecorDesc_STAND[] = _( + "A large pedestal\n" + "with steps."); + +const u8 DecorDesc_MUD_BALL[] = _( + "A large ball of mud.\n" + "Crumbles if stepped\n" + "on."); + +const u8 DecorDesc_BREAKABLE_DOOR[] = _( + "A weird door that\n" + "people can walk\n" + "right through."); + +const u8 DecorDesc_SAND_ORNAMENT[] = _( + "An ornament made\n" + "of sand. Crumbles if\n" + "touched."); + +const u8 DecorDesc_SILVER_SHIELD[] = _( + "Awarded for 50\n" + "straight wins at\n" + "the BATTLE TOWER."); + +const u8 DecorDesc_GOLD_SHIELD[] = _( + "Awarded for 100\n" + "straight wins at\n" + "the BATTLE TOWER."); + +const u8 DecorDesc_GLASS_ORNAMENT[] = _( + "A glass replica of\n" + "a famous sculpture\n" + "at the ART MUSEUM."); + +const u8 DecorDesc_TV[] = _( + "A small, gray-\n" + "colored toy TV."); + +const u8 DecorDesc_ROUND_TV[] = _( + "A toy TV modeled\n" + "in the image of a\n" + "SEEDOT."); + +const u8 DecorDesc_CUTE_TV[] = _( + "A toy TV modeled\n" + "in the image of a\n" + "SKITTY."); + +const u8 DecorDesc_GLITTER_MAT[] = _( + "An odd mat that\n" + "glitters if stepped\n" + "on."); + +const u8 DecorDesc_JUMP_MAT[] = _( + "A trick mat that\n" + "jumps when it is\n" + "stepped on."); + +const u8 DecorDesc_SPIN_MAT[] = _( + "A trick mat that\n" + "spins around when\n" + "stepped on."); + +const u8 DecorDesc_C_LOW_NOTE_MAT[] = _( + "A mat that plays\n" + "a low C note when\n" + "stepped on."); + +const u8 DecorDesc_D_NOTE_MAT[] = _( + "A mat that plays\n" + "a D note when\n" + "stepped on."); + +const u8 DecorDesc_E_NOTE_MAT[] = _( + "A mat that plays\n" + "an E note when\n" + "stepped on."); + +const u8 DecorDesc_F_NOTE_MAT[] = _( + "A mat that plays\n" + "an F note when\n" + "stepped on."); + +const u8 DecorDesc_G_NOTE_MAT[] = _( + "A mat that plays\n" + "a G note when\n" + "stepped on."); + +const u8 DecorDesc_A_NOTE_MAT[] = _( + "A mat that plays\n" + "an A note when\n" + "stepped on."); + +const u8 DecorDesc_B_NOTE_MAT[] = _( + "A mat that plays\n" + "a B note when\n" + "stepped on."); + +const u8 DecorDesc_C_HIGH_NOTE_MAT[] = _( + "A mat that plays\n" + "a high C note when\n" + "stepped on."); + +const u8 DecorDesc_SURF_MAT[] = _( + "A mat designed with\n" + "a SURF image.\n" + "Put items on top."); + +const u8 DecorDesc_THUNDER_MAT[] = _( + "A mat designed with\n" + "a THUNDER image.\n" + "Put items on top."); + +const u8 DecorDesc_FIRE_BLAST_MAT[] = _( + "A mat designed with\n" + "a FIRE BLAST image.\n" + "Put items on top."); + +const u8 DecorDesc_POWDER_SNOW_MAT[] = _( + "A mat with a POWDER\n" + "SNOW image design.\n" + "Put items on top."); + +const u8 DecorDesc_ATTRACT_MAT[] = _( + "A mat designed with\n" + "an ATTRACT image.\n" + "Put items on top."); + +const u8 DecorDesc_FISSURE_MAT[] = _( + "A mat designed with\n" + "a FISSURE image.\n" + "Put items on top."); + +const u8 DecorDesc_SPIKES_MAT[] = _( + "A mat designed with\n" + "a SPIKES image.\n" + "Put items on top."); + +const u8 DecorDesc_BALL_POSTER[] = _( + "A small poster\n" + "printed with POKé\n" + "BALLS."); + +const u8 DecorDesc_GREEN_POSTER[] = _( + "A small poster with\n" + "a TREECKO print."); + +const u8 DecorDesc_RED_POSTER[] = _( + "A small poster with\n" + "a TORCHIC print."); + +const u8 DecorDesc_BLUE_POSTER[] = _( + "A small poster with\n" + "a MUDKIP print."); + +const u8 DecorDesc_CUTE_POSTER[] = _( + "A small poster with\n" + "an AZURILL print."); + +const u8 DecorDesc_PIKA_POSTER[] = _( + "A large poster with\n" + "a PIKACHU and\n" + "PICHU print."); + +const u8 DecorDesc_LONG_POSTER[] = _( + "A large poster with\n" + "a SEVIPER print."); + +const u8 DecorDesc_SEA_POSTER[] = _( + "A large poster with\n" + "a RELICANTH print."); + +const u8 DecorDesc_SKY_POSTER[] = _( + "A large poster with\n" + "a WINGULL print."); + +const u8 DecorDesc_KISS_POSTER[] = _( + "A large poster with\n" + "a SMOOCHUM print."); + +const u8 DecorDesc_PICHU_DOLL[] = _( + "A PICHU doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_PIKACHU_DOLL[] = _( + "A PIKACHU doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_MARILL_DOLL[] = _( + "A MARILL doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_TOGEPI_DOLL[] = _( +#if REVISION >= 1 + "A TOGEPI doll.\n" +#else + "A TOPGEPI doll.\n" +#endif + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_CYNDAQUIL_DOLL[] = _( + "A CYNDAQUIL doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_CHIKORITA_DOLL[] = _( + "A CHIKORITA doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_TOTODILE_DOLL[] = _( + "A TOTODILE doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_JIGGLYPUFF_DOLL[] = _( + "A JIGGLYPUFF doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_MEOWTH_DOLL[] = _( + "A MEOWTH doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_CLEFAIRY_DOLL[] = _( + "A CLEFAIRY doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_DITTO_DOLL[] = _( + "A DITTO doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_SMOOCHUM_DOLL[] = _( + "A SMOOCHUM doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_TREECKO_DOLL[] = _( + "A TREECKO doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_TORCHIC_DOLL[] = _( + "A TORCHIC doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_MUDKIP_DOLL[] = _( + "A MUDKIP doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_DUSKULL_DOLL[] = _( + "A DUSKULL doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_WYNAUT_DOLL[] = _( + "A WYNAUT doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_BALTOY_DOLL[] = _( + "A BALTOY doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_KECLEON_DOLL[] = _( + "A KECLEON doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_AZURILL_DOLL[] = _( + "An AZURILL doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_SKITTY_DOLL[] = _( + "A SKITTY doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_SWABLU_DOLL[] = _( + "A SWABLU doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_GULPIN_DOLL[] = _( + "A GULPIN doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_LOTAD_DOLL[] = _( + "A LOTAD doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_SEEDOT_DOLL[] = _( + "A SEEDOT doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_PIKA_CUSHION[] = _( + "A PIKACHU cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_ROUND_CUSHION[] = _( + "A MARILL cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_KISS_CUSHION[] = _( + "A SMOOCHUM\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_ZIGZAG_CUSHION[] = _( + "A ZIGZAGOON\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_SPIN_CUSHION[] = _( + "A SPINDA cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_DIAMOND_CUSHION[] = _( + "A SABLEYE cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_BALL_CUSHION[] = _( + "A BALL cushion.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_GRASS_CUSHION[] = _( + "A grass-mark\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_FIRE_CUSHION[] = _( + "A fire-mark\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_WATER_CUSHION[] = _( + "A water-mark\n" + "cushion. Place it on\n" + "a mat or a desk."); + +const u8 DecorDesc_SNORLAX_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_RHYDON_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_LAPRAS_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_VENUSAUR_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_CHARIZARD_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_BLASTOISE_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_WAILMER_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_REGIROCK_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_REGICE_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); + +const u8 DecorDesc_REGISTEEL_DOLL[] = _( + "A large doll.\n" + "Place it on a mat\n" + "or a desk."); +#elif GERMAN +#include "data/decoration/descriptions_de.h" +#endif + +const u16 DecorGfx_SMALL_DESK[] = { + 0x87 +}; + +const u16 DecorGfx_POKEMON_DESK[] = { + 0x8F +}; + +const u16 DecorGfx_HEAVY_DESK[] = { + 0x90, + 0x91, + 0x92, + 0x98, + 0x99, + 0x9A +}; + +const u16 DecorGfx_RAGGED_DESK[] = { + 0x93, + 0x94, + 0x95, + 0x9B, + 0x9C, + 0x9D +}; + +const u16 DecorGfx_COMFORT_DESK[] = { + 0x96, + 0x97, + 0xA3, + 0x9E, + 0x9F, + 0xAB +}; + +const u16 DecorGfx_PRETTY_DESK[] = { + 0xBD, + 0xBE, + 0xBF, + 0xC5, + 0xC6, + 0xC7, + 0xCD, + 0xCE, + 0xCF +}; + +const u16 DecorGfx_BRICK_DESK[] = { + 0xA0, + 0xA1, + 0xA2, + 0xA8, + 0xA9, + 0xAA, + 0xB0, + 0xB1, + 0xB2 +}; + +const u16 DecorGfx_CAMP_DESK[] = { + 0xA4, + 0xA5, + 0xA6, + 0xAC, + 0xAD, + 0xAE, + 0xB4, + 0xB5, + 0xB6 +}; + +const u16 DecorGfx_HARD_DESK[] = { + 0xA7, + 0xBB, + 0xBC, + 0xAF, + 0xC3, + 0xC4, + 0xB7, + 0xCB, + 0xCC +}; + +const u16 DecorGfx_SMALL_CHAIR[] = { + 0xB8 +}; + +const u16 DecorGfx_POKEMON_CHAIR[] = { + 0xB9 +}; + +const u16 DecorGfx_HEAVY_CHAIR[] = { + 0xBA +}; + +const u16 DecorGfx_PRETTY_CHAIR[] = { + 0xC0 +}; + +const u16 DecorGfx_COMFORT_CHAIR[] = { + 0xC1 +}; + +const u16 DecorGfx_RAGGED_CHAIR[] = { + 0xC2 +}; + +const u16 DecorGfx_BRICK_CHAIR[] = { + 0xC8 +}; + +const u16 DecorGfx_CAMP_CHAIR[] = { + 0xC9 +}; + +const u16 DecorGfx_HARD_CHAIR[] = { + 0xCA +}; + +const u16 DecorGfx_RED_PLANT[] = { + 0xD0, + 0xD8 +}; + +const u16 DecorGfx_TROPICAL_PLANT[] = { + 0xD2, + 0xDA +}; + +const u16 DecorGfx_PRETTY_FLOWERS[] = { + 0xD4, + 0xDC +}; + +const u16 DecorGfx_COLORFUL_PLANT[] = { + 0xE0, + 0xE2, + 0xE8, + 0xE9 +}; + +const u16 DecorGfx_BIG_PLANT[] = { + 0xE4, + 0xE6, + 0xEC, + 0xED +}; + +const u16 DecorGfx_GORGEOUS_PLANT[] = { + 0xF0, + 0xF2, + 0xF8, + 0xF9 +}; + +const u16 DecorGfx_RED_BRICK[] = { + 0x25, + 0x2D +}; + +const u16 DecorGfx_YELLOW_BRICK[] = { + 0x26, + 0x2E +}; + +const u16 DecorGfx_BLUE_BRICK[] = { + 0x27, + 0x2F +}; + +const u16 DecorGfx_RED_BALLOON[] = { + 0x138 +}; + +const u16 DecorGfx_BLUE_BALLOON[] = { + 0x13C +}; + +const u16 DecorGfx_YELLOW_BALLOON[] = { + 0x140 +}; + +const u16 DecorGfx_RED_TENT[] = { + 0x30, + 0x31, + 0x32, + 0x38, + 0x39, + 0x3A, + 0x40, + 0x41, + 0x3B +}; + +const u16 DecorGfx_BLUE_TENT[] = { + 0x48, + 0x49, + 0x68, + 0x50, + 0x51, + 0x70, + 0x58, + 0x59, + 0x69 +}; + +const u16 DecorGfx_SOLID_BOARD[] = { + 0x34, + 0x3C +}; + +const u16 DecorGfx_SLIDE[] = { + 0x35, + 0x36, + 0x3D, + 0x3E, + 0x63, + 0x64, + 0x6F, + 0x77 +}; + +const u16 DecorGfx_FENCE_LENGTH[] = { + 0x33 +}; + +const u16 DecorGfx_FENCE_WIDTH[] = { + 0x2C +}; + +const u16 DecorGfx_TIRE[] = { + 0x80, + 0x81, + 0x88, + 0x89 +}; + +const u16 DecorGfx_STAND[] = { + 0x6A, + 0x6B, + 0x6C, + 0x6D, + 0x72, + 0x73, + 0x74, + 0x75 +}; + +const u16 DecorGfx_MUD_BALL[] = { + 0x28 +}; + +const u16 DecorGfx_BREAKABLE_DOOR[] = { + 0x37, + 0x3F +}; + +const u16 DecorGfx_SAND_ORNAMENT[] = { + 0x85, + 0x8D +}; + +const u16 DecorGfx_SILVER_SHIELD[] = { + 0xD6, + 0xDE +}; + +const u16 DecorGfx_GOLD_SHIELD[] = { + 0x12E, + 0x136 +}; + +const u16 DecorGfx_GLASS_ORNAMENT[] = { + 0x82, + 0x8A +}; + +const u16 DecorGfx_TV[] = { + 0xF4 +}; + +const u16 DecorGfx_ROUND_TV[] = { + 0xF5 +}; + +const u16 DecorGfx_CUTE_TV[] = { + 0xF6 +}; + +const u16 DecorGfx_GLITTER_MAT[] = { + 0x60 +}; + +const u16 DecorGfx_JUMP_MAT[] = { + 0x61 +}; + +const u16 DecorGfx_SPIN_MAT[] = { + 0x62 +}; + +const u16 DecorGfx_C_LOW_NOTE_MAT[] = { + 0x78 +}; + +const u16 DecorGfx_D_NOTE_MAT[] = { + 0x79 +}; + +const u16 DecorGfx_E_NOTE_MAT[] = { + 0x7A +}; + +const u16 DecorGfx_F_NOTE_MAT[] = { + 0x7B +}; + +const u16 DecorGfx_G_NOTE_MAT[] = { + 0x7C +}; + +const u16 DecorGfx_A_NOTE_MAT[] = { + 0x7D +}; + +const u16 DecorGfx_B_NOTE_MAT[] = { + 0x7E +}; + +const u16 DecorGfx_C_HIGH_NOTE_MAT[] = { + 0xB3 +}; + +const u16 DecorGfx_SURF_MAT[] = { + 0x42, + 0x43, + 0x44, + 0x4A, + 0x4B, + 0x4C, + 0x52, + 0x53, + 0x54 +}; + +const u16 DecorGfx_THUNDER_MAT[] = { + 0x45, + 0x46, + 0x47, + 0x4D, + 0x4E, + 0x4F, + 0x55, + 0x56, + 0x57 +}; + +const u16 DecorGfx_FIRE_BLAST_MAT[] = { + 0x5A, + 0x5B, + 0x5C, + 0x5D, + 0x5E, + 0x5F, + 0x65, + 0x66, + 0x67 +}; + +const u16 DecorGfx_POWDER_SNOW_MAT[] = { + 0x100, + 0x101, + 0x102, + 0x108, + 0x109, + 0x10A, + 0x110, + 0x111, + 0x112 +}; + +const u16 DecorGfx_ATTRACT_MAT[] = { + 0x103, + 0x104, + 0x105, + 0x10B, + 0x10C, + 0x10D, + 0x113, + 0x114, + 0x115 +}; + +const u16 DecorGfx_FISSURE_MAT[] = { + 0x106, + 0x107, + 0x118, + 0x10E, + 0x10F, + 0x120, + 0x116, + 0x117, + 0x128 +}; + +const u16 DecorGfx_SPIKES_MAT[] = { + 0x119, + 0x11A, + 0x11B, + 0x121, + 0x122, + 0x123, + 0x129, + 0x12A, + 0x12B +}; + +const u16 DecorGfx_BALL_POSTER[] = { + 0x130 +}; + +const u16 DecorGfx_GREEN_POSTER[] = { + 0x131 +}; + +const u16 DecorGfx_RED_POSTER[] = { + 0x132 +}; + +const u16 DecorGfx_BLUE_POSTER[] = { + 0x133 +}; + +const u16 DecorGfx_CUTE_POSTER[] = { + 0x134 +}; + +const u16 DecorGfx_PIKA_POSTER[] = { + 0x11C, + 0x11D +}; + +const u16 DecorGfx_LONG_POSTER[] = { + 0x11E, + 0x11F +}; + +const u16 DecorGfx_SEA_POSTER[] = { + 0x124, + 0x125 +}; + +const u16 DecorGfx_SKY_POSTER[] = { + 0x126, + 0x127 +}; + +const u16 DecorGfx_KISS_POSTER[] = { + 0x12C, + 0x12D +}; + +const u16 DecorGfx_PICHU_DOLL[] = { + MAP_OBJ_GFX_PICHU_DOLL +}; + +const u16 DecorGfx_PIKACHU_DOLL[] = { + MAP_OBJ_GFX_PIKACHU_DOLL +}; + +const u16 DecorGfx_MARILL_DOLL[] = { + MAP_OBJ_GFX_MARILL_DOLL +}; + +const u16 DecorGfx_TOGEPI_DOLL[] = { + MAP_OBJ_GFX_TOGEPI_DOLL +}; + +const u16 DecorGfx_CYNDAQUIL_DOLL[] = { + MAP_OBJ_GFX_CYNDAQUIL_DOLL +}; + +const u16 DecorGfx_CHIKORITA_DOLL[] = { + MAP_OBJ_GFX_CHIKORITA_DOLL +}; + +const u16 DecorGfx_TOTODILE_DOLL[] = { + MAP_OBJ_GFX_TOTODILE_DOLL +}; + +const u16 DecorGfx_JIGGLYPUFF_DOLL[] = { + MAP_OBJ_GFX_JIGGLYPUFF_DOLL +}; + +const u16 DecorGfx_MEOWTH_DOLL[] = { + MAP_OBJ_GFX_MEOWTH_DOLL +}; + +const u16 DecorGfx_CLEFAIRY_DOLL[] = { + MAP_OBJ_GFX_CLEFAIRY_DOLL +}; + +const u16 DecorGfx_DITTO_DOLL[] = { + MAP_OBJ_GFX_DITTO_DOLL +}; + +const u16 DecorGfx_SMOOCHUM_DOLL[] = { + MAP_OBJ_GFX_SMOOCHUM_DOLL +}; + +const u16 DecorGfx_TREECKO_DOLL[] = { + MAP_OBJ_GFX_TREECKO_DOLL +}; + +const u16 DecorGfx_TORCHIC_DOLL[] = { + MAP_OBJ_GFX_TORCHIC_DOLL +}; + +const u16 DecorGfx_MUDKIP_DOLL[] = { + MAP_OBJ_GFX_MUDKIP_DOLL +}; + +const u16 DecorGfx_DUSKULL_DOLL[] = { + MAP_OBJ_GFX_DUSKULL_DOLL +}; + +const u16 DecorGfx_WYNAUT_DOLL[] = { + MAP_OBJ_GFX_WYNAUT_DOLL +}; + +const u16 DecorGfx_BALTOY_DOLL[] = { + MAP_OBJ_GFX_BALTOY_DOLL +}; + +const u16 DecorGfx_KECLEON_DOLL[] = { + MAP_OBJ_GFX_KECLEON_DOLL +}; + +const u16 DecorGfx_AZURILL_DOLL[] = { + MAP_OBJ_GFX_AZURILL_DOLL +}; + +const u16 DecorGfx_SKITTY_DOLL[] = { + MAP_OBJ_GFX_SKITTY_DOLL +}; + +const u16 DecorGfx_SWABLU_DOLL[] = { + MAP_OBJ_GFX_SWABLU_DOLL +}; + +const u16 DecorGfx_GULPIN_DOLL[] = { + MAP_OBJ_GFX_GULPIN_DOLL +}; + +const u16 DecorGfx_LOTAD_DOLL[] = { + MAP_OBJ_GFX_LOTAD_DOLL +}; + +const u16 DecorGfx_SEEDOT_DOLL[] = { + MAP_OBJ_GFX_SEEDOT_DOLL +}; + +const u16 DecorGfx_PIKA_CUSHION[] = { + MAP_OBJ_GFX_PIKA_CUSHION +}; + +const u16 DecorGfx_ROUND_CUSHION[] = { + MAP_OBJ_GFX_ROUND_CUSHION +}; + +const u16 DecorGfx_KISS_CUSHION[] = { + MAP_OBJ_GFX_KISS_CUSHION +}; + +const u16 DecorGfx_ZIGZAG_CUSHION[] = { + MAP_OBJ_GFX_ZIGZAG_CUSHION +}; + +const u16 DecorGfx_SPIN_CUSHION[] = { + MAP_OBJ_GFX_SPIN_CUSHION +}; + +const u16 DecorGfx_DIAMOND_CUSHION[] = { + MAP_OBJ_GFX_DIAMOND_CUSHION +}; + +const u16 DecorGfx_BALL_CUSHION[] = { + MAP_OBJ_GFX_BALL_CUSHION +}; + +const u16 DecorGfx_GRASS_CUSHION[] = { + MAP_OBJ_GFX_GRASS_CUSHION +}; + +const u16 DecorGfx_FIRE_CUSHION[] = { + MAP_OBJ_GFX_FIRE_CUSHION +}; + +const u16 DecorGfx_WATER_CUSHION[] = { + MAP_OBJ_GFX_WATER_CUSHION +}; + +const u16 DecorGfx_SNORLAX_DOLL[] = { + MAP_OBJ_GFX_BIG_SNORLAX_DOLL +}; + +const u16 DecorGfx_RHYDON_DOLL[] = { + MAP_OBJ_GFX_BIG_RHYDON_DOLL +}; + +const u16 DecorGfx_LAPRAS_DOLL[] = { + MAP_OBJ_GFX_BIG_LAPRAS_DOLL +}; + +const u16 DecorGfx_VENUSAUR_DOLL[] = { + MAP_OBJ_GFX_BIG_VENUSAUR_DOLL +}; + +const u16 DecorGfx_CHARIZARD_DOLL[] = { + MAP_OBJ_GFX_BIG_CHARIZARD_DOLL +}; + +const u16 DecorGfx_BLASTOISE_DOLL[] = { + MAP_OBJ_GFX_BIG_BLASTOISE_DOLL +}; + +const u16 DecorGfx_WAILMER_DOLL[] = { + MAP_OBJ_GFX_BIG_WAILMER_DOLL +}; + +const u16 DecorGfx_REGIROCK_DOLL[] = { + MAP_OBJ_GFX_BIG_REGIROCK_DOLL +}; + +const u16 DecorGfx_REGICE_DOLL[] = { + MAP_OBJ_GFX_BIG_REGICE_DOLL +}; + +const u16 DecorGfx_REGISTEEL_DOLL[] = { + MAP_OBJ_GFX_BIG_REGISTEEL_DOLL +}; + +#if ENGLISH +const struct Decoration gDecorations[] = { + {DECOR_NONE, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 0, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, + {DECOR_SMALL_DESK, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, + {DECOR_POKEMON_DESK, _("POKéMON DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_POKEMON_DESK, DecorGfx_POKEMON_DESK}, + {DECOR_HEAVY_DESK, _("HEAVY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_HEAVY_DESK, DecorGfx_HEAVY_DESK}, + {DECOR_RAGGED_DESK, _("RAGGED DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_RAGGED_DESK, DecorGfx_RAGGED_DESK}, + {DECOR_COMFORT_DESK, _("COMFORT DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_COMFORT_DESK, DecorGfx_COMFORT_DESK}, + {DECOR_PRETTY_DESK, _("PRETTY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_PRETTY_DESK, DecorGfx_PRETTY_DESK}, + {DECOR_BRICK_DESK, _("BRICK DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_BRICK_DESK, DecorGfx_BRICK_DESK}, + {DECOR_CAMP_DESK, _("CAMP DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_CAMP_DESK, DecorGfx_CAMP_DESK}, + {DECOR_HARD_DESK, _("HARD DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_HARD_DESK, DecorGfx_HARD_DESK}, + {DECOR_SMALL_CHAIR, _("SMALL CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_SMALL_CHAIR, DecorGfx_SMALL_CHAIR}, + {DECOR_POKEMON_CHAIR, _("POKéMON CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_POKEMON_CHAIR, DecorGfx_POKEMON_CHAIR}, + {DECOR_HEAVY_CHAIR, _("HEAVY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HEAVY_CHAIR, DecorGfx_HEAVY_CHAIR}, + {DECOR_PRETTY_CHAIR, _("PRETTY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_PRETTY_CHAIR, DecorGfx_PRETTY_CHAIR}, + {DECOR_COMFORT_CHAIR, _("COMFORT CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_COMFORT_CHAIR, DecorGfx_COMFORT_CHAIR}, + {DECOR_RAGGED_CHAIR, _("RAGGED CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_RAGGED_CHAIR, DecorGfx_RAGGED_CHAIR}, + {DECOR_BRICK_CHAIR, _("BRICK CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_BRICK_CHAIR, DecorGfx_BRICK_CHAIR}, + {DECOR_CAMP_CHAIR, _("CAMP CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_CAMP_CHAIR, DecorGfx_CAMP_CHAIR}, + {DECOR_HARD_CHAIR, _("HARD CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HARD_CHAIR, DecorGfx_HARD_CHAIR}, + {DECOR_RED_PLANT, _("RED PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_RED_PLANT, DecorGfx_RED_PLANT}, + {DECOR_TROPICAL_PLANT, _("TROPICAL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_TROPICAL_PLANT, DecorGfx_TROPICAL_PLANT}, + {DECOR_PRETTY_FLOWERS, _("PRETTY FLOWERS"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_PRETTY_FLOWERS, DecorGfx_PRETTY_FLOWERS}, + {DECOR_COLORFUL_PLANT, _("COLORFUL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_COLORFUL_PLANT, DecorGfx_COLORFUL_PLANT}, + {DECOR_BIG_PLANT, _("BIG PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_BIG_PLANT, DecorGfx_BIG_PLANT}, + {DECOR_GORGEOUS_PLANT, _("GORGEOUS PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_GORGEOUS_PLANT, DecorGfx_GORGEOUS_PLANT}, + {DECOR_RED_BRICK, _("RED BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BRICK, DecorGfx_RED_BRICK}, + {DECOR_YELLOW_BRICK, _("YELLOW BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BRICK, DecorGfx_YELLOW_BRICK}, + {DECOR_BLUE_BRICK, _("BLUE BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BRICK, DecorGfx_BLUE_BRICK}, + {DECOR_RED_BALLOON, _("RED BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BALLOON, DecorGfx_RED_BALLOON}, + {DECOR_BLUE_BALLOON, _("BLUE BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BALLOON, DecorGfx_BLUE_BALLOON}, + {DECOR_YELLOW_BALLOON, _("YELLOW BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BALLOON, DecorGfx_YELLOW_BALLOON}, + {DECOR_RED_TENT, _("RED TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_RED_TENT, DecorGfx_RED_TENT}, + {DECOR_BLUE_TENT, _("BLUE TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_BLUE_TENT, DecorGfx_BLUE_TENT}, + {DECOR_SOLID_BOARD, _("SOLID BOARD"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SOLID_BOARD, DecorGfx_SOLID_BOARD}, + {DECOR_SLIDE, _("SLIDE"), DECORPERM_PASS_FLOOR, DECORSHAPE_2x4, DECORCAT_ORNAMENT, 8000, DecorDesc_SLIDE, DecorGfx_SLIDE}, + {DECOR_FENCE_LENGTH, _("FENCE LENGTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_LENGTH, DecorGfx_FENCE_LENGTH}, + {DECOR_FENCE_WIDTH, _("FENCE WIDTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_WIDTH, DecorGfx_FENCE_WIDTH}, + {DECOR_TIRE, _("TIRE"), DECORPERM_SOLID_FLOOR, DECORSHAPE_2x2, DECORCAT_ORNAMENT, 800, DecorDesc_TIRE, DecorGfx_TIRE}, + {DECOR_STAND, _("STAND"), DECORPERM_PASS_FLOOR, DECORSHAPE_4x2, DECORCAT_ORNAMENT, 7000, DecorDesc_STAND, DecorGfx_STAND}, + {DECOR_MUD_BALL, _("MUD BALL"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 200, DecorDesc_MUD_BALL, DecorGfx_MUD_BALL}, + {DECOR_BREAKABLE_DOOR, _("BREAKABLE DOOR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_BREAKABLE_DOOR, DecorGfx_BREAKABLE_DOOR}, + {DECOR_SAND_ORNAMENT, _("SAND ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SAND_ORNAMENT, DecorGfx_SAND_ORNAMENT}, + {DECOR_SILVER_SHIELD, _("SILVER SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_SILVER_SHIELD, DecorGfx_SILVER_SHIELD}, + {DECOR_GOLD_SHIELD, _("GOLD SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GOLD_SHIELD, DecorGfx_GOLD_SHIELD}, + {DECOR_GLASS_ORNAMENT, _("GLASS ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GLASS_ORNAMENT, DecorGfx_GLASS_ORNAMENT}, + {DECOR_TV, _("TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 3000, DecorDesc_TV, DecorGfx_TV}, + {DECOR_ROUND_TV, _("ROUND TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_ROUND_TV, DecorGfx_ROUND_TV}, + {DECOR_CUTE_TV, _("CUTE TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_CUTE_TV, DecorGfx_CUTE_TV}, + {DECOR_GLITTER_MAT, _("GLITTER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_GLITTER_MAT, DecorGfx_GLITTER_MAT}, + {DECOR_JUMP_MAT, _("JUMP MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_JUMP_MAT, DecorGfx_JUMP_MAT}, + {DECOR_SPIN_MAT, _("SPIN MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_SPIN_MAT, DecorGfx_SPIN_MAT}, + {DECOR_C_LOW_NOTE_MAT, _("C Low NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_LOW_NOTE_MAT, DecorGfx_C_LOW_NOTE_MAT}, + {DECOR_D_NOTE_MAT, _("D NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_D_NOTE_MAT, DecorGfx_D_NOTE_MAT}, + {DECOR_E_NOTE_MAT, _("E NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_E_NOTE_MAT, DecorGfx_E_NOTE_MAT}, + {DECOR_F_NOTE_MAT, _("F NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_F_NOTE_MAT, DecorGfx_F_NOTE_MAT}, + {DECOR_G_NOTE_MAT, _("G NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_G_NOTE_MAT, DecorGfx_G_NOTE_MAT}, + {DECOR_A_NOTE_MAT, _("A NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_A_NOTE_MAT, DecorGfx_A_NOTE_MAT}, + {DECOR_B_NOTE_MAT, _("B NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_B_NOTE_MAT, DecorGfx_B_NOTE_MAT}, + {DECOR_C_HIGH_NOTE_MAT, _("C High NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_HIGH_NOTE_MAT, DecorGfx_C_HIGH_NOTE_MAT}, + {DECOR_SURF_MAT, _("SURF MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SURF_MAT, DecorGfx_SURF_MAT}, + {DECOR_THUNDER_MAT, _("THUNDER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_THUNDER_MAT, DecorGfx_THUNDER_MAT}, + {DECOR_FIRE_BLAST_MAT, _("FIRE BLAST MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FIRE_BLAST_MAT, DecorGfx_FIRE_BLAST_MAT}, + {DECOR_POWDER_SNOW_MAT, _("POWDER SNOW MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_POWDER_SNOW_MAT, DecorGfx_POWDER_SNOW_MAT}, + {DECOR_ATTRACT_MAT, _("ATTRACT MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_ATTRACT_MAT, DecorGfx_ATTRACT_MAT}, + {DECOR_FISSURE_MAT, _("FISSURE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FISSURE_MAT, DecorGfx_FISSURE_MAT}, + {DECOR_SPIKES_MAT, _("SPIKES MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SPIKES_MAT, DecorGfx_SPIKES_MAT}, + {DECOR_BALL_POSTER, _("BALL POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BALL_POSTER, DecorGfx_BALL_POSTER}, + {DECOR_GREEN_POSTER, _("GREEN POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_GREEN_POSTER, DecorGfx_GREEN_POSTER}, + {DECOR_RED_POSTER, _("RED POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_RED_POSTER, DecorGfx_RED_POSTER}, + {DECOR_BLUE_POSTER, _("BLUE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BLUE_POSTER, DecorGfx_BLUE_POSTER}, + {DECOR_CUTE_POSTER, _("CUTE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_CUTE_POSTER, DecorGfx_CUTE_POSTER}, + {DECOR_PIKA_POSTER, _("PIKA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_PIKA_POSTER, DecorGfx_PIKA_POSTER}, + {DECOR_LONG_POSTER, _("LONG POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_LONG_POSTER, DecorGfx_LONG_POSTER}, + {DECOR_SEA_POSTER, _("SEA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SEA_POSTER, DecorGfx_SEA_POSTER}, + {DECOR_SKY_POSTER, _("SKY POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SKY_POSTER, DecorGfx_SKY_POSTER}, + {DECOR_KISS_POSTER, _("KISS POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_KISS_POSTER, DecorGfx_KISS_POSTER}, + {DECOR_PICHU_DOLL, _("PICHU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PICHU_DOLL, DecorGfx_PICHU_DOLL}, + {DECOR_PIKACHU_DOLL, _("PIKACHU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PIKACHU_DOLL, DecorGfx_PIKACHU_DOLL}, + {DECOR_MARILL_DOLL, _("MARILL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MARILL_DOLL, DecorGfx_MARILL_DOLL}, + {DECOR_TOGEPI_DOLL, _("TOGEPI DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOGEPI_DOLL, DecorGfx_TOGEPI_DOLL}, + {DECOR_CYNDAQUIL_DOLL, _("CYNDAQUIL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CYNDAQUIL_DOLL, DecorGfx_CYNDAQUIL_DOLL}, + {DECOR_CHIKORITA_DOLL, _("CHIKORITA DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CHIKORITA_DOLL, DecorGfx_CHIKORITA_DOLL}, + {DECOR_TOTODILE_DOLL, _("TOTODILE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOTODILE_DOLL, DecorGfx_TOTODILE_DOLL}, + {DECOR_JIGGLYPUFF_DOLL, _("JIGGLYPUFF DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_JIGGLYPUFF_DOLL, DecorGfx_JIGGLYPUFF_DOLL}, + {DECOR_MEOWTH_DOLL, _("MEOWTH DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MEOWTH_DOLL, DecorGfx_MEOWTH_DOLL}, + {DECOR_CLEFAIRY_DOLL, _("CLEFAIRY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CLEFAIRY_DOLL, DecorGfx_CLEFAIRY_DOLL}, + {DECOR_DITTO_DOLL, _("DITTO DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DITTO_DOLL, DecorGfx_DITTO_DOLL}, + {DECOR_SMOOCHUM_DOLL, _("SMOOCHUM DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SMOOCHUM_DOLL, DecorGfx_SMOOCHUM_DOLL}, + {DECOR_TREECKO_DOLL, _("TREECKO DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TREECKO_DOLL, DecorGfx_TREECKO_DOLL}, + {DECOR_TORCHIC_DOLL, _("TORCHIC DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TORCHIC_DOLL, DecorGfx_TORCHIC_DOLL}, + {DECOR_MUDKIP_DOLL, _("MUDKIP DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MUDKIP_DOLL, DecorGfx_MUDKIP_DOLL}, + {DECOR_DUSKULL_DOLL, _("DUSKULL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DUSKULL_DOLL, DecorGfx_DUSKULL_DOLL}, + {DECOR_WYNAUT_DOLL, _("WYNAUT DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_WYNAUT_DOLL, DecorGfx_WYNAUT_DOLL}, + {DECOR_BALTOY_DOLL, _("BALTOY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_BALTOY_DOLL, DecorGfx_BALTOY_DOLL}, + {DECOR_KECLEON_DOLL, _("KECLEON DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_KECLEON_DOLL, DecorGfx_KECLEON_DOLL}, + {DECOR_AZURILL_DOLL, _("AZURILL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_AZURILL_DOLL, DecorGfx_AZURILL_DOLL}, + {DECOR_SKITTY_DOLL, _("SKITTY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SKITTY_DOLL, DecorGfx_SKITTY_DOLL}, + {DECOR_SWABLU_DOLL, _("SWABLU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SWABLU_DOLL, DecorGfx_SWABLU_DOLL}, + {DECOR_GULPIN_DOLL, _("GULPIN DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_GULPIN_DOLL, DecorGfx_GULPIN_DOLL}, + {DECOR_LOTAD_DOLL, _("LOTAD DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_LOTAD_DOLL, DecorGfx_LOTAD_DOLL}, + {DECOR_SEEDOT_DOLL, _("SEEDOT DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SEEDOT_DOLL, DecorGfx_SEEDOT_DOLL}, + {DECOR_PIKA_CUSHION, _("PIKA CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_PIKA_CUSHION, DecorGfx_PIKA_CUSHION}, + {DECOR_ROUND_CUSHION, _("ROUND CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ROUND_CUSHION, DecorGfx_ROUND_CUSHION}, + {DECOR_KISS_CUSHION, _("KISS CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_KISS_CUSHION, DecorGfx_KISS_CUSHION}, + {DECOR_ZIGZAG_CUSHION, _("ZIGZAG CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ZIGZAG_CUSHION, DecorGfx_ZIGZAG_CUSHION}, + {DECOR_SPIN_CUSHION, _("SPIN CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_SPIN_CUSHION, DecorGfx_SPIN_CUSHION}, + {DECOR_DIAMOND_CUSHION, _("DIAMOND CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_DIAMOND_CUSHION, DecorGfx_DIAMOND_CUSHION}, + {DECOR_BALL_CUSHION, _("BALL CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_BALL_CUSHION, DecorGfx_BALL_CUSHION}, + {DECOR_GRASS_CUSHION, _("GRASS CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_GRASS_CUSHION, DecorGfx_GRASS_CUSHION}, + {DECOR_FIRE_CUSHION, _("FIRE CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_FIRE_CUSHION, DecorGfx_FIRE_CUSHION}, + {DECOR_WATER_CUSHION, _("WATER CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_WATER_CUSHION, DecorGfx_WATER_CUSHION}, + {DECOR_SNORLAX_DOLL, _("SNORLAX DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_SNORLAX_DOLL, DecorGfx_SNORLAX_DOLL}, + {DECOR_RHYDON_DOLL, _("RHYDON DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_RHYDON_DOLL, DecorGfx_RHYDON_DOLL}, + {DECOR_LAPRAS_DOLL, _("LAPRAS DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_LAPRAS_DOLL, DecorGfx_LAPRAS_DOLL}, + {DECOR_VENUSAUR_DOLL, _("VENUSAUR DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_VENUSAUR_DOLL, DecorGfx_VENUSAUR_DOLL}, + {DECOR_CHARIZARD_DOLL, _("CHARIZARD DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_CHARIZARD_DOLL, DecorGfx_CHARIZARD_DOLL}, + {DECOR_BLASTOISE_DOLL, _("BLASTOISE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_BLASTOISE_DOLL, DecorGfx_BLASTOISE_DOLL}, + {DECOR_WAILMER_DOLL, _("WAILMER DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_WAILMER_DOLL, DecorGfx_WAILMER_DOLL}, + {DECOR_REGIROCK_DOLL, _("REGIROCK DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGIROCK_DOLL, DecorGfx_REGIROCK_DOLL}, + {DECOR_REGICE_DOLL, _("REGICE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGICE_DOLL, DecorGfx_REGICE_DOLL}, + {DECOR_REGISTEEL_DOLL, _("REGISTEEL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGISTEEL_DOLL, DecorGfx_REGISTEEL_DOLL} +}; +#elif GERMAN +#include "data/decoration/decorations.h" +#endif + +const u8 *const gUnknown_083EC5E4[] = { + SecretBaseText_Desk, + SecretBaseText_Chair, + SecretBaseText_Plant, + SecretBaseText_Ornament, + SecretBaseText_Mat, + SecretBaseText_Poster, + SecretBaseText_Doll, + SecretBaseText_Cushion +}; + +const struct MenuAction2 gUnknown_083EC604[] = { + {SecretBaseText_Decorate, sub_80FF160}, + {SecretBaseText_PutAway, sub_8100A0C}, + {SecretBaseText_Toss, sub_8101700}, + {gUnknownText_Exit, gpu_pal_decompress_alloc_tag_and_upload} +}; + +const u8 *const gUnknown_083EC624[] = { + SecretBaseText_PutOutDecor, + SecretBaseText_StoreChosenDecor, + SecretBaseText_ThrowAwayDecor, + gMenuText_GoBackToPrev +}; + +const struct YesNoFuncTable gUnknown_083EC634[] = { + {sub_80FF5BC, sub_80FF058}, + {sub_81017A0, sub_80FF058}, + {sub_81017A0, sub_80FF058}, + {sub_8109D04, sub_80FF058} +}; + +// text + +extern u8 gUnknown_0815F399[]; + +void sub_80FE1DC(void) +{ + sub_80FE2B4(); + Menu_DrawStdWindowFrame(0, 0, 10, 9); + Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604); + InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); +} + +void sub_80FE220(void) +{ + gUnknown_020388D4 = 0; + ScriptContext2_Enable(); + sub_80FE1DC(); + sub_80FE394(); +} + +void DecorationPC(u8 taskId) +{ + sub_80FE220(); + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; +} + +void Task_SecretBasePC_Decoration(u8 taskId) +{ + DecorationPC(taskId); + ewram_1f000.items = gSaveBlock1.secretBases[0].decorations; + ewram_1f000.pos = gSaveBlock1.secretBases[0].decorationPos; + ewram_1f000.size = sizeof gSaveBlock1.secretBases[0].decorations; + ewram_1f000.isPlayerRoom = 0; +} + +void DoPlayerPCDecoration(u8 taskId) +{ + DecorationPC(taskId); + ewram_1f000.items = gSaveBlock1.playerRoomDecor; + ewram_1f000.pos = gSaveBlock1.playerRoomDecorPos; + ewram_1f000.size = sizeof gSaveBlock1.playerRoomDecor; + ewram_1f000.isPlayerRoom = 1; +} + +void sub_80FE2B4(void) +{ + u16 palettes[3] = {RGB(24, 24, 24), + RGB(28, 28, 28), + RGB(31, 31, 31)}; + LoadPalette(&palettes[2], 0xdf, 2); + LoadPalette(&palettes[1], 0xd1, 2); + LoadPalette(&palettes[0], 0xd8, 2); +} + +void Task_DecorationPCProcessMenuInput(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gUnknown_020388D4 = Menu_MoveCursor(-1); + sub_80FE394(); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_020388D4 = Menu_MoveCursor(1); + sub_80FE394(); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_083EC604[gUnknown_020388D4].func(taskId); + } else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gpu_pal_decompress_alloc_tag_and_upload(taskId); + } + } +} + +void sub_80FE394(void) +{ + Menu_BlankWindowRect(2, 15, 27, 18); + Menu_PrintText(gUnknown_083EC624[gUnknown_020388D4], 2, 15); +} + +void gpu_pal_decompress_alloc_tag_and_upload(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 10, 9); + Menu_BlankWindowRect(2, 15, 27, 18); + FreeSpritePaletteByTag(6); + if (ewram_1f000.isPlayerRoom == 0) + { + ScriptContext1_SetupScript(gUnknown_0815F399); + DestroyTask(taskId); + } else + { + ReshowPlayerPC(taskId); + } +} + +void sub_80FE418(u8 taskId) +{ + sub_80FE5AC(taskId); +} + +void sub_80FE428(u8 taskId) +{ + InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); + sub_80FE394(); + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; +} + +void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCategorySelectionMenuString +{ + u8 *strptr; + u8 v0; + v0 = Menu_GetTextWindowPaletteNum(); + // PALETTE {palIdx} + strptr = gStringVar4; + strptr[0] = EXT_CTRL_CODE_BEGIN; + strptr[1] = 5; + strptr[2] = palIdx; + strptr += 3; + strptr = StringCopy(strptr, gUnknown_083EC5E4[decoCat]); + strptr = sub_8072C14(strptr, sub_8134194(decoCat), 0x56, 1); + *strptr++ = 0xba; + strptr = sub_8072C14(strptr, gDecorationInventories[decoCat].size, 0x68, 1); + strptr[0] = EXT_CTRL_CODE_BEGIN; + strptr[1] = 5; + strptr[2] = v0; + strptr[3] = EOS; + Menu_PrintText(gStringVar4, left, top); +} + +void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings +{ + u8 decoCat; + Menu_DrawStdWindowFrame(0, 0, 14, 19); + for (decoCat=0; decoCat<8; decoCat++) + { + if (ewram_1f000.isPlayerRoom == 1 && gTasks[taskId].data[11] == 0 && decoCat != DECORCAT_DOLL && decoCat != DECORCAT_CUSHION) + { + sub_80FE470(decoCat, 1, 2 * decoCat + 1, 13); // Selectable + } else + { + sub_80FE470(decoCat, 1, 2 * decoCat + 1, 255); // Unselectable + } + } + Menu_PrintText(gUnknownText_Exit, 1, 17); +} + +void sub_80FE5AC(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + sub_80FE528(taskId); + InitMenu(0, 1, 1, 9, gUnknown_020388F6, 13); + gTasks[taskId].func = sub_80FE604; +} + +void sub_80FE604(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_020388F6 = Menu_GetCursorPos(); + if (gUnknown_020388F6 != 8) + { + gUnknown_020388D5 = sub_8134194(gUnknown_020388F6); + if (gUnknown_020388D5) + { + sub_8134104(gUnknown_020388F6); + gUnknown_020388D0 = gDecorationInventories[gUnknown_020388F6].items; + sub_80FEF50(taskId); + ClearVerticalScrollIndicatorPalettes(); + sub_80F9480(gUnknown_020388F7, 8); + LoadScrollIndicatorPalette(); + gTasks[taskId].func = sub_80FE868; + } else + { + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE418, 0); + } + } else + { + sub_80FE728(taskId); + } + } else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80FE728(taskId); + } + } +} + +void sub_80FE728(u8 taskId) +{ + if (gTasks[taskId].data[11] != 3) + { + sub_80FE758(taskId); + } else + { + sub_8109DAC(taskId); + } +} + +void sub_80FE758(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); + if (gTasks[taskId].data[11] != 2) + { + sub_80FE1DC(); + Menu_DisplayDialogueFrame(); + sub_80FE394(); + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; + } else + { + Shop_RunExitSellMenuTask(taskId); + } +} + +void sub_80FE7A8(u8 taskId) +{ + gTasks[taskId].data[11] = 3; + gUnknown_020388F6 = 0; + sub_80FE5AC(taskId); +} + +void sub_80FE7D4(u8 *dest, u8 decClass) +{ + StringCopy(dest, gUnknown_083EC5E4[decClass]); +} + +void sub_80FE7EC(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + + sub_80FEC94(taskId); + sub_80FECB8(gUnknown_020388F6); + +#if ENGLISH + Menu_DrawStdWindowFrame(15, 12, 29, 19); +#elif GERMAN + if ((gUnknown_020388F2 + gUnknown_020388F4) != gUnknown_020388D5) + { + Menu_DrawStdWindowFrame(15, 12, 29, 19); + } +#endif + + sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); + InitMenu(0, 1, 2, gUnknown_020388F3 + 1, gUnknown_020388F2, 13); +} + +void sub_80FE868(u8 taskId) +{ + sub_80FE7EC(taskId); + gTasks[taskId].func = sub_80FE948; +} + +void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/) +{ + int v0 /*r10*/; + u8 v1; + v0 = gUnknown_020388F2 + gUnknown_020388F4 == gUnknown_020388D5; + PlaySE(SE_SELECT); + if (cursorVector != 0) + { + gUnknown_020388F2 = Menu_MoveCursor(cursorVector); + } + if (bgVector != 0) + { + v1 = gUnknown_020388F4; + gUnknown_020388F4 = v1 + bgVector; + sub_80FEABC(taskId, 1); + } + if (gUnknown_020388F2 + gUnknown_020388F4 != gUnknown_020388D5) + { + if (v0) + { + Menu_DrawStdWindowFrame(15, 12, 29, 19); + } + sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); + } else + { + Menu_EraseWindowRect(15, 12, 29, 19); + } +} + +void sub_80FE948(u8 taskId) +{ + if (!gPaletteFade.active) + { + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + if (gUnknown_020388F2 != 0) + { + sub_80FE894(taskId, -1, 0); + } else if (gUnknown_020388F4 != 0) + { + sub_80FE894(taskId, 0, -1); + } + } + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + if (gUnknown_020388F2 != gUnknown_020388F3) + { + sub_80FE894(taskId, 1, 0); + } else if (gUnknown_020388F4 + gUnknown_020388F2 != gUnknown_020388D5) + { + sub_80FE894(taskId, 0, 1); + } + } + if (gMain.newKeys & A_BUTTON) + { + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + gUnknown_020388F5 = gUnknown_020388F2 + gUnknown_020388F4; + if (gUnknown_020388F5 == gUnknown_020388D5) + { + gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); + } else + { + gUnknown_083EC634[gTasks[taskId].data[11]].yesFunc(taskId); + } + } else if (gMain.newKeys & B_BUTTON) + { + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); + } + } +} + +const u8 gUnknown_083EC65A[] = _("{PALETTE 13}{STR_VAR_1}"); + +void sub_80FEABC(u8 taskId, u8 dummy1) +{ + u16 i; + u16 j; + u8 ni; + if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(TOP_ARROW), gUnknown_020388F4 != 0)) + { + CreateVerticalScrollIndicators(TOP_ARROW, 0x3c, 0x08); + } + if (gUnknown_020388F4 + 7 == gUnknown_020388D5) + { + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + } + if (gUnknown_020388F4 + 7 < gUnknown_020388D5) + { + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x3c, 0x98); + } + for (i=gUnknown_020388F4; i gUnknown_020388D5 && gUnknown_020388F4 != 0) + { + gUnknown_020388F4--; + } + sub_8134104(gUnknown_020388F6); + sub_80FED90(taskId); + sub_80FEF28(); +} + +void sub_80FF0E0(u8 taskId) +{ + gTasks[taskId].data[3] = gSaveBlock1.pos.x; + gTasks[taskId].data[4] = gSaveBlock1.pos.y; + PlayerGetDestCoords(&gTasks[taskId].data[0], &gTasks[taskId].data[1]); +} + +void sub_80FF114(u8 taskId) +{ + DrawWholeMapView(); + Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); + warp_in(); +} +void sub_80FF160(u8 taskId) +{ + if (!sub_81341D4()) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); + } else + { + gTasks[taskId].data[11] = 0; + gUnknown_020388F6 = 0; + sub_80FE5AC(taskId); + } +} + +u16 sub_80FF1B0(u8 decoId, u8 a1) +{ + u16 retval; + retval = 0xffff; + + switch (decoId) + { + case DECOR_STAND: + retval = gUnknown_083EC97C[a1] << 12; + return retval; + case DECOR_SLIDE: + retval = gUnknown_083EC984[a1] << 12; + return retval; + default: + return retval; + } +} + +void sub_80FF1EC(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight, u16 decIdx) +{ + u16 i; + u16 j; // r10 + u16 behavior; + u16 flags; // r8 + u16 v0; + u16 v1; + s16 x; + s16 decBottom; + + for (i=0; i> 12))) + { + flags = 0xc00; + } else + { + flags = 0x000; + } + if (gDecorations[decIdx].permission != DECORPERM_NA_WALL && sub_80572B0(MapGridGetMetatileBehaviorAt(x, decBottom)) == 1) + { + v0 = 1; + } else + { + v0 = 0; + } + v1 = sub_80FF1B0(gDecorations[decIdx].id, i * decWidth + j); + if (v1 != 0xffff) + { + MapGridSetMetatileEntryAt(x, decBottom, (gDecorations[decIdx].tiles[i * decWidth + j] + (0x200 | v0)) | flags | v1); + } else + { + MapGridSetMetatileIdAt(x, decBottom, (gDecorations[decIdx].tiles[i * decWidth + j] + (0x200 | v0)) | flags); + } + } + } +} + +void sub_80FF394(u16 mapX, u16 mapY, u16 decIdx) +{ + switch (gDecorations[decIdx].shape) + { + case DECORSHAPE_1x1: + sub_80FF1EC(mapX, mapY, 1, 1, decIdx); + break; + case DECORSHAPE_2x1: + sub_80FF1EC(mapX, mapY, 2, 1, decIdx); + break; + case DECORSHAPE_3x1: // unused + sub_80FF1EC(mapX, mapY, 3, 1, decIdx); + break; + case DECORSHAPE_4x2: + sub_80FF1EC(mapX, mapY, 4, 2, decIdx); + break; + case DECORSHAPE_2x2: + sub_80FF1EC(mapX, mapY, 2, 2, decIdx); + break; + case DECORSHAPE_1x2: + sub_80FF1EC(mapX, mapY, 1, 2, decIdx); + break; + case DECORSHAPE_1x3: // unused + sub_80FF1EC(mapX, mapY, 1, 3, decIdx); + break; + case DECORSHAPE_2x4: + sub_80FF1EC(mapX, mapY, 2, 4, decIdx); + break; + case DECORSHAPE_3x3: + sub_80FF1EC(mapX, mapY, 3, 3, decIdx); + break; + case DECORSHAPE_3x2: + sub_80FF1EC(mapX, mapY, 3, 2, decIdx); + break; + } +} + +void sub_80FF474(void) +{ + u8 i; + u8 j; + for (i=0; i<14; i++) + { + if (FlagGet(i + FLAG_DECORATION_2) == 1) + { + FlagClear(i + FLAG_DECORATION_2); + for (j=0; jmapObjectCount; j++) + { + if (gMapHeader.events->mapObjects[j].flagId == i + FLAG_DECORATION_2) + { + break; + } + } + VarSet(0x3f20 + gMapHeader.events->mapObjects[j].graphicsId, gUnknown_02038900.decoration->tiles[0]); + gSpecialVar_0x8005 = gMapHeader.events->mapObjects[j].localId; + gSpecialVar_0x8006 = gUnknown_020391A4; + gSpecialVar_0x8007 = gUnknown_020391A6; + show_sprite(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + sub_805C0F8(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); + sub_805C78C(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + break; + } + } +} + +bool8 sub_80FF58C/*IsThereRoomForMoreDecorations*/(void) +{ + u16 i; + for (i=0; idecoration = &gDecorations[decoIdx]; + if (gDecorations[decoIdx].permission != DECORPERM_SOLID_MAT) + { + sub_81008BC(unk_02038900); + sub_8100930(unk_02038900->decoration->shape); + sub_8100874(unk_02038900); + sub_810070C(unk_02038900->palette, ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles + 8 * unk_02038900->decoration->tiles[0])[7] >> 12); + LoadSpritePalette(&gUnknown_083EC954); + gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0]; + gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83EC93C, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 0); + } else + { + gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0]; + gUnknown_03004880.unk4 = AddPseudoFieldObject(unk_02038900->decoration->tiles[0], sub_81009A8, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 1); + gSprites[gUnknown_03004880.unk4].oam.priority = 1; + } +} + +void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_02038900 *unk_02038900) +{ + u8 v0; + v0 = 16 * (u8)gTasks[taskId].data[5] + gUnknown_083EC900[unk_02038900->decoration->shape].x - 8 * ((u8)gTasks[taskId].data[5] - 1); + if (unk_02038900->decoration->shape == DECORSHAPE_3x1 || unk_02038900->decoration->shape == DECORSHAPE_3x3 || unk_02038900->decoration->shape == DECORSHAPE_3x2) + { + v0 -= 8; + } + if (gSaveBlock2.playerGender == MALE) + { + gUnknown_020391A9 = AddPseudoFieldObject(0xc1, SpriteCallbackDummy, v0, 0x48, 0); + } else + { + gUnknown_020391A9 = AddPseudoFieldObject(0xc2, SpriteCallbackDummy, v0, 0x48, 0); + } + gSprites[gUnknown_020391A9].oam.priority = 1; + DestroySprite(&gSprites[gUnknown_020391A8]); + gUnknown_020391A8 = gUnknown_03004880.unk4; +} + +void sub_80FF960(u8 taskId) +{ + switch (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].shape) + { + case DECORSHAPE_1x1: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_2x1: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_3x1: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_4x2: + gTasks[taskId].data[5] = 4; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_2x2: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_1x2: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_1x3: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 3; + gTasks[taskId].data[1]++; + break; + case DECORSHAPE_2x4: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 4; + break; + case DECORSHAPE_3x3: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 3; + break; + case DECORSHAPE_3x2: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 2; + break; + } +} + +void sub_80FFAB0(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + gSprites[gUnknown_020391A8].data[7] = 1; + gSprites[gUnknown_020391A9].data[7] = 1; + sub_810045C(); + sub_8100038(taskId); +} + +void sub_80FFB08(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + gSprites[gUnknown_020391A8].data[7] = 1; + gSprites[gUnknown_020391A9].data[7] = 1; + sub_810045C(); + DisplayItemMessageOnField(taskId, gSecretBaseText_CancelDecorating, sub_8100248, 0); +} + +bool8 sub_80FFB6C(u8 a0, u16 a1) +{ + if (sub_8057274(a0) != 1 || a1 != 0) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_80FFB94(u8 taskId, s16 x, s16 y, u16 decoId) +{ + if (x == gTasks[taskId].data[3] + 7 && y == gTasks[taskId].data[4] + 7 && decoId != 0) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_80FFBDC(u16 a0, const struct Decoration *decoration) +{ + if (sub_8057274(a0) != 1) + { + if (decoration->id == DECOR_SOLID_BOARD && sub_8057300(a0) == 1) + { + return TRUE; + } + if (sub_805729C(a0)) + { + return TRUE; + } + } + return FALSE; +} + +// When behaviorBy is set, it is masked by 0xf000. This is the step that fails to match when built. +#ifdef NONMATCHING +bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) +{ + u8 i; + u8 j; + u8 behaviorAt; + u16 behaviorBy; + u8 mapY; + u8 mapX; + s16 curY; + s16 curX; + mapY = gTasks[taskId].data[6]; + mapX = gTasks[taskId].data[5]; + switch (decoration->permission) + { + case DECORPERM_SOLID_FLOOR: + case DECORPERM_PASS_FLOOR: + for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; + if (!sub_80FFBDC(behaviorAt, decoration)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); + if (behaviorAt != 0 && behaviorAt != 16) + { + return FALSE; + } + } + } + break; + case DECORPERM_BEHIND_FLOOR: + for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; + if (!sub_805729C(behaviorAt) && !sub_80FFB6C(behaviorAt, behaviorBy)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) + { + return FALSE; + } + } + } + curY = gTasks[taskId].data[1] - mapY + 1; + for (j=0; jtiles[j]) & 0xf000; + if (!sub_805729C(behaviorAt) && !sub_80572B0(behaviorAt)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); + if (behaviorAt != 0 && behaviorAt != 16) + { + return FALSE; + } + } + break; + case DECORPERM_NA_WALL: + for (i=0; ishape == DECORSHAPE_1x2) + { + if (!sub_80572EC(behaviorAt)) + { + return FALSE; + } + } + else if (!sub_80572D8(behaviorAt)) + { + if (!sub_80572EC(behaviorAt)) + { + return FALSE; + } + } + if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) + { + return FALSE; + } + } + break; + } + return TRUE; +} +#else +__attribute__((naked)) +bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x24\n" + "\tstr r1, [sp]\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r10, r0\n" + "\tldr r1, _080FFC60 @ =gTasks\n" + "\tlsls r0, 2\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tadds r0, r1\n" + "\tldrb r2, [r0, 0x14]\n" + "\tstr r2, [sp, 0x4]\n" + "\tldrb r0, [r0, 0x12]\n" + "\tstr r0, [sp, 0x8]\n" + "\tldr r3, [sp]\n" + "\tldrb r0, [r3, 0x11]\n" + "\tadds r2, r1, 0\n" + "\tcmp r0, 0x4\n" + "\tbls _080FFC56\n" + "\tb _08100024\n" + "_080FFC56:\n" + "\tlsls r0, 2\n" + "\tldr r1, _080FFC64 @ =_080FFC68\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_080FFC60: .4byte gTasks\n" + "_080FFC64: .4byte _080FFC68\n" + "\t.align 2, 0\n" + "_080FFC68:\n" + "\t.4byte _080FFC7C\n" + "\t.4byte _080FFC7C\n" + "\t.4byte _080FFD68\n" + "\t.4byte _080FFF1C\n" + "\t.4byte _080FFFA0\n" + "_080FFC7C:\n" + "\tmovs r6, 0\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r6, r0\n" + "\tbcc _080FFC86\n" + "\tb _08100024\n" + "_080FFC86:\n" + "\tmov r1, r10\n" + "\tlsls r1, 2\n" + "\tstr r1, [sp, 0x1C]\n" + "_080FFC8C:\n" + "\tmov r2, r10\n" + "\tlsls r0, r2, 2\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tldr r3, _080FFD64 @ =gTasks\n" + "\tadds r0, r3\n" + "\tldrh r0, [r0, 0xA]\n" + "\tsubs r0, r6\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tadds r6, 0x1\n" + "\tstr r6, [sp, 0x14]\n" + "\tldr r0, [sp, 0x8]\n" + "\tcmp r7, r0\n" + "\tbcs _080FFD56\n" + "\tmov r1, r9\n" + "\tlsls r1, 16\n" + "\tstr r1, [sp, 0xC]\n" + "\tasrs r1, 16\n" + "\tmov r9, r1\n" + "_080FFCB8:\n" + "\tldr r0, [sp, 0x1C]\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tldr r2, _080FFD64 @ =gTasks\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tmov r8, r0\n" + "\tasrs r6, r0, 16\n" + "\tadds r0, r6, 0\n" + "\tmov r1, r9\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp, 0x4]\n" + "\tldr r1, [sp, 0x14]\n" + "\tsubs r0, r3, r1\n" + "\tldr r2, [sp, 0x8]\n" + "\tadds r1, r0, 0\n" + "\tmuls r1, r2\n" + "\tadds r1, r7\n" + "\tldr r3, [sp]\n" + "\tldr r0, [r3, 0x1C]\n" + "\tlsls r1, 1\n" + "\tadds r1, r0\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 2\n" + "\tadds r0, r2, 0\n" + "\tldrh r1, [r1]\n" + "\tadds r0, r1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl GetBehaviorByMetatileId\n" + "\tmovs r3, 0xF0\n" + "\tlsls r3, 8\n" + "\tadds r1, r3, 0\n" + "\tadds r5, r1, 0\n" + "\tands r5, r0\n" + "\tadds r0, r4, 0\n" + "\tldr r1, [sp]\n" + "\tbl sub_80FFBDC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFD1A\n" + "\tb _080FFFF4\n" + "_080FFD1A:\n" + "\tmov r0, r10\n" + "\tadds r1, r6, 0\n" + "\tmov r2, r9\n" + "\tadds r3, r5, 0\n" + "\tbl sub_80FFB94\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFD2E\n" + "\tb _080FFFF4\n" + "_080FFD2E:\n" + "\tmov r1, r8\n" + "\tlsrs r0, r1, 16\n" + "\tldr r2, [sp, 0xC]\n" + "\tlsrs r1, r2, 16\n" + "\tmovs r2, 0\n" + "\tbl GetFieldObjectIdByXYZ\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0\n" + "\tbeq _080FFD4A\n" + "\tcmp r4, 0x10\n" + "\tbeq _080FFD4A\n" + "\tb _080FFFF4\n" + "_080FFD4A:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFCB8\n" + "_080FFD56:\n" + "\tldr r1, [sp, 0x14]\n" + "\tlsls r0, r1, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r2, [sp, 0x4]\n" + "\tcmp r6, r2\n" + "\tbcc _080FFC8C\n" + "\tb _08100024\n" + "\t.align 2, 0\n" + "_080FFD64: .4byte gTasks\n" + "_080FFD68:\n" + "\tmovs r6, 0\n" + "\tmov r3, r10\n" + "\tlsls r3, 2\n" + "\tstr r3, [sp, 0x1C]\n" + "\tldr r0, [sp, 0x4]\n" + "\tsubs r0, 0x1\n" + "\tstr r0, [sp, 0x18]\n" + "\tcmp r6, r0\n" + "\tbge _080FFE54\n" + "\tadds r0, r3, 0\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tstr r0, [sp, 0x10]\n" + "_080FFD82:\n" + "\tldr r1, [sp, 0x10]\n" + "\tadds r0, r1, r2\n" + "\tldrh r0, [r0, 0xA]\n" + "\tsubs r0, r6\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tadds r6, 0x1\n" + "\tstr r6, [sp, 0x14]\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcs _080FFE48\n" + "\tlsls r0, 16\n" + "\tstr r0, [sp, 0x20]\n" + "_080FFDA0:\n" + "\tldr r1, [sp, 0x10]\n" + "\tadds r0, r1, r2\n" + "\tldrh r0, [r0, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tmov r8, r0\n" + "\tasrs r6, r0, 16\n" + "\tmov r2, r9\n" + "\tlsls r1, r2, 16\n" + "\tadds r0, r6, 0\n" + "\tasrs r1, 16\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp, 0x4]\n" + "\tldr r1, [sp, 0x14]\n" + "\tsubs r0, r3, r1\n" + "\tldr r2, [sp, 0x8]\n" + "\tadds r1, r0, 0\n" + "\tmuls r1, r2\n" + "\tadds r1, r7\n" + "\tldr r3, [sp]\n" + "\tldr r0, [r3, 0x1C]\n" + "\tlsls r1, 1\n" + "\tadds r1, r0\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 2\n" + "\tadds r0, r2, 0\n" + "\tldrh r1, [r1]\n" + "\tadds r0, r1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl GetBehaviorByMetatileId\n" + "\tmovs r3, 0xF0\n" + "\tlsls r3, 8\n" + "\tadds r1, r3, 0\n" + "\tadds r5, r1, 0\n" + "\tands r5, r0\n" + "\tadds r0, r4, 0\n" + "\tbl sub_805729C\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFE0C\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r5, 0\n" + "\tbl sub_80FFB6C\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFE0C\n" + "\tb _080FFFF4\n" + "_080FFE0C:\n" + "\tmov r0, r10\n" + "\tadds r1, r6, 0\n" + "\tldr r3, [sp, 0x20]\n" + "\tasrs r2, r3, 16\n" + "\tadds r3, r5, 0\n" + "\tbl sub_80FFB94\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFE22\n" + "\tb _080FFFF4\n" + "_080FFE22:\n" + "\tmov r1, r8\n" + "\tlsrs r0, r1, 16\n" + "\tldr r2, [sp, 0x20]\n" + "\tlsrs r1, r2, 16\n" + "\tmovs r2, 0\n" + "\tbl GetFieldObjectIdByXYZ\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x10\n" + "\tbeq _080FFE3A\n" + "\tb _080FFFF4\n" + "_080FFE3A:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r2, _080FFF18 @ =gTasks\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFDA0\n" + "_080FFE48:\n" + "\tldr r1, [sp, 0x14]\n" + "\tlsls r0, r1, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r3, [sp, 0x18]\n" + "\tcmp r6, r3\n" + "\tblt _080FFD82\n" + "_080FFE54:\n" + "\tldr r0, [sp, 0x1C]\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0, 0xA]\n" + "\tldr r1, [sp, 0x4]\n" + "\tsubs r0, r1\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFE74\n" + "\tb _08100024\n" + "_080FFE74:\n" + "\tlsls r0, 16\n" + "\tstr r0, [sp, 0x20]\n" + "_080FFE78:\n" + "\tldr r0, [sp, 0x1C]\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tldr r1, _080FFF18 @ =gTasks\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tmov r8, r0\n" + "\tasrs r6, r0, 16\n" + "\tmov r2, r9\n" + "\tlsls r1, r2, 16\n" + "\tadds r0, r6, 0\n" + "\tasrs r1, 16\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp]\n" + "\tldr r0, [r3, 0x1C]\n" + "\tlsls r1, r7, 1\n" + "\tadds r1, r0\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 2\n" + "\tadds r0, r2, 0\n" + "\tldrh r1, [r1]\n" + "\tadds r0, r1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl GetBehaviorByMetatileId\n" + "\tmovs r3, 0xF0\n" + "\tlsls r3, 8\n" + "\tadds r1, r3, 0\n" + "\tadds r5, r1, 0\n" + "\tands r5, r0\n" + "\tadds r0, r4, 0\n" + "\tbl sub_805729C\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFEDA\n" + "\tadds r0, r4, 0\n" + "\tbl sub_80572B0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFEDA\n" + "\tb _080FFFF4\n" + "_080FFEDA:\n" + "\tmov r0, r10\n" + "\tadds r1, r6, 0\n" + "\tldr r3, [sp, 0x20]\n" + "\tasrs r2, r3, 16\n" + "\tadds r3, r5, 0\n" + "\tbl sub_80FFB94\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _080FFEF0\n" + "\tb _080FFFF4\n" + "_080FFEF0:\n" + "\tmov r1, r8\n" + "\tlsrs r0, r1, 16\n" + "\tldr r2, [sp, 0x20]\n" + "\tlsrs r1, r2, 16\n" + "\tmovs r2, 0\n" + "\tbl GetFieldObjectIdByXYZ\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0\n" + "\tbeq _080FFF0A\n" + "\tcmp r4, 0x10\n" + "\tbne _080FFFF4\n" + "_080FFF0A:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFE78\n" + "\tb _08100024\n" + "\t.align 2, 0\n" + "_080FFF18: .4byte gTasks\n" + "_080FFF1C:\n" + "\tmovs r6, 0\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r6, r0\n" + "\tbcc _080FFF26\n" + "\tb _08100024\n" + "_080FFF26:\n" + "\tmov r1, r10\n" + "\tlsls r0, r1, 2\n" + "\tadd r0, r10\n" + "\tlsls r1, r0, 3\n" + "\tldr r2, _080FFF9C @ =gTasks\n" + "\tadds r0, r1, r2\n" + "\tldrh r0, [r0, 0xA]\n" + "\tsubs r0, r6\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcs _080FFF8C\n" + "\tadds r0, r2, 0\n" + "\tadds r1, r0\n" + "\tmov r8, r1\n" + "\tmov r1, r9\n" + "\tlsls r0, r1, 16\n" + "\tasrs r5, r0, 16\n" + "_080FFF50:\n" + "\tmov r2, r8\n" + "\tldrh r0, [r2, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tasrs r4, r0, 16\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r5, 0\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tbl sub_80572B0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _080FFFF4\n" + "\tadds r0, r4, 0\n" + "\tadds r1, r5, 0x1\n" + "\tbl MapGridGetMetatileIdAt\n" + "\tmovs r1, 0xA3\n" + "\tlsls r1, 2\n" + "\tcmp r0, r1\n" + "\tbeq _080FFFF4\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFF50\n" + "_080FFF8C:\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r6, r0\n" + "\tbcc _080FFF26\n" + "\tb _08100024\n" + "\t.align 2, 0\n" + "_080FFF9C: .4byte gTasks\n" + "_080FFFA0:\n" + "\tmov r3, r10\n" + "\tlsls r1, r3, 2\n" + "\tadds r0, r1, r3\n" + "\tlsls r0, 3\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0, 0xA]\n" + "\tmov r9, r0\n" + "\tmovs r7, 0\n" + "\tstr r1, [sp, 0x1C]\n" + "\tldr r0, [sp, 0x8]\n" + "\tcmp r7, r0\n" + "\tbcs _08100024\n" + "\tadds r6, r2, 0\n" + "\tmov r1, r9\n" + "\tlsls r1, 16\n" + "\tstr r1, [sp, 0x20]\n" + "_080FFFC0:\n" + "\tldr r0, [sp, 0x1C]\n" + "\tadd r0, r10\n" + "\tlsls r0, 3\n" + "\tadds r0, r6\n" + "\tldrh r0, [r0, 0x8]\n" + "\tadds r0, r7\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tasrs r0, 16\n" + "\tmov r2, r9\n" + "\tlsls r1, r2, 16\n" + "\tasrs r1, 16\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r3, [sp]\n" + "\tldrb r0, [r3, 0x12]\n" + "\tcmp r0, 0x5\n" + "\tbne _080FFFF8\n" + "_080FFFE8:\n" + "\tadds r0, r4, 0\n" + "\tbl sub_80572EC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _08100004\n" + "_080FFFF4:\n" + "\tmovs r0, 0\n" + "\tb _08100026\n" + "_080FFFF8:\n" + "\tadds r0, r4, 0\n" + "\tbl sub_80572D8\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _080FFFE8\n" + "_08100004:\n" + "\tadds r0, r5, 0\n" + "\tldr r2, [sp, 0x20]\n" + "\tlsrs r1, r2, 16\n" + "\tmovs r2, 0\n" + "\tbl GetFieldObjectIdByXYZ\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x10\n" + "\tbne _080FFFF4\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tldr r3, [sp, 0x8]\n" + "\tcmp r7, r3\n" + "\tbcc _080FFFC0\n" + "_08100024:\n" + "\tmovs r0, 0x1\n" + "_08100026:\n" + "\tadd sp, 0x24\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + ".syntax divided\n"); +} +#endif + +void sub_8100038(u8 taskId) +{ + if (sub_80FFC24(taskId, &gDecorations[gUnknown_020388D0[gUnknown_020388F5]]) == 1) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_PlaceItHere, sub_81000A0, 0); + } else + { + PlaySE(SE_HAZURE); + DisplayItemMessageOnField(taskId, gSecretBaseText_CantBePlacedHere, sub_81006A8, 0); + } +} + +void sub_81000A0(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083EC95C); +} + +void sub_81000C4(u8 taskId) +{ + Menu_EraseWindowRect(0, 0, 29, 19); + sub_8100174(taskId); + if (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].permission != DECORPERM_SOLID_MAT) + { + sub_80FF394(gTasks[taskId].data[0], gTasks[taskId].data[1], gUnknown_020388D0[gUnknown_020388F5]); + } else + { + gUnknown_020391A4 = gTasks[taskId].data[0] - 7; + gUnknown_020391A6 = gTasks[taskId].data[1] - 7; + ScriptContext1_SetupScript(gUnknown_081A2F7B); + } + gSprites[gUnknown_020391A8].pos1.y += 2; + sub_810028C(taskId); +} + +void sub_8100174(u8 taskId) +{ + u16 i; + for (i=0; i= gMapHeader.mapData->height) + { + data[1]--; + return FALSE; + } else if (gUnknown_020391AA == DIR_WEST && data[0] - 7 < 0) + { + data[0]++; + return FALSE; + } else if (gUnknown_020391AA == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width) + { + data[0]--; + return FALSE; + } + return TRUE; +} + +bool8 sub_8100430(void) +{ + if ((gMain.heldKeys & DPAD_ANY) != DPAD_UP && (gMain.heldKeys & DPAD_ANY) != DPAD_DOWN && (gMain.heldKeys & DPAD_ANY) != DPAD_LEFT && (gMain.heldKeys & DPAD_ANY) != DPAD_RIGHT) + { + return FALSE; + } + return TRUE; +} + +void sub_810045C(void) +{ + gUnknown_020391AA = 0; + gSprites[gUnknown_020391A8].data[2] = 0; + gSprites[gUnknown_020391A8].data[3] = 0; +} + +void sub_8100494(u8 taskId) +{ + if (!gSprites[gUnknown_020391A8].data[4]) + { + if (gTasks[taskId].data[10] == 1) + { + gUnknown_083EC96C[gTasks[taskId].data[12]].yesFunc(taskId); + return; + } else if (gTasks[taskId].data[10] == 2) + { + gUnknown_083EC96C[gTasks[taskId].data[12]].noFunc(taskId); + return; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_UP) + { + gUnknown_020391AA = DIR_SOUTH; + gSprites[gUnknown_020391A8].data[2] = 0; + gSprites[gUnknown_020391A8].data[3] = -2; + gTasks[taskId].data[1]--; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_DOWN) + { + gUnknown_020391AA = DIR_NORTH; + gSprites[gUnknown_020391A8].data[2] = 0; + gSprites[gUnknown_020391A8].data[3] = 2; + gTasks[taskId].data[1]++; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_LEFT) + { + gUnknown_020391AA = DIR_WEST; + gSprites[gUnknown_020391A8].data[2] = -2; + gSprites[gUnknown_020391A8].data[3] = 0; + gTasks[taskId].data[0]--; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_RIGHT) + { + gUnknown_020391AA = DIR_EAST; + gSprites[gUnknown_020391A8].data[2] = 2; + gSprites[gUnknown_020391A8].data[3] = 0; + gTasks[taskId].data[0]++; + } + if (!sub_8100430() || !sub_810038C(taskId)) + { + sub_810045C(); + } + } + if (gUnknown_020391AA) + { + gSprites[gUnknown_020391A8].data[4]++; + gSprites[gUnknown_020391A8].data[4] &= 7; + } + if (!gTasks[taskId].data[10]) + { + if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].data[10] = A_BUTTON; + } + if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = B_BUTTON; + } + } +} + +void sub_810065C(u8 taskId) +{ + Menu_EraseWindowRect(0, 0, 29, 19); + gSprites[gUnknown_020391A8].data[7] = 0; + gTasks[taskId].data[10] = 0; + gTasks[taskId].func = sub_8100494; +} + +void sub_81006A8(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + sub_810065C(taskId); + } +} + +void sub_81006D0(struct UnkStruct_02038900 *unk_02038900) +{ + u16 i; + for (i=0; i<0x800; i++) + { + unk_02038900->image[i] = 0; + } + for (i=0; i<0x40; i++) + { + unk_02038900->tiles[i] = 0; + } +} + +void sub_810070C(u16 *a0, u16 a1) +{ + u16 i; + for (i=0; i<16; i++) + { + a0[i] = ((u16 *)gMapHeader.mapData->primaryTileset->palettes)[16 * a1 + i]; + } +} + +void sub_8100740(u8 *dest, u16 flags) +{ + u8 buffer[32]; + u16 mode; + u16 i; + mode = flags >> 10; + if (flags != 0) + { + flags &= 0x3ff; + } + for (i=0; i<32; i++) + { + buffer[i] = ((u8 *)gMapHeader.mapData->primaryTileset->tiles)[flags * 32 + i]; + } + switch (mode) + { + case 0: + for (i=0; i<32; i++) + { + dest[i] = buffer[i]; + } + break; + case 1: + for (i=0; i<8; i++) + { + dest[4*i] = (buffer[4*(i+1) - 1] >> 4) + ((buffer[4*(i+1) - 1] & 0xf) << 4); + dest[4*i + 1] = (buffer[4*(i+1) - 2] >> 4) + ((buffer[4*(i+1) - 2] & 0xf) << 4); + dest[4*i + 2] = (buffer[4*(i+1) - 3] >> 4) + ((buffer[4*(i+1) - 3] & 0xf) << 4); + dest[4*i + 3] = (buffer[4*(i+1) - 4] >> 4) + ((buffer[4*(i+1) - 4] & 0xf) << 4); + } + break; + case 2: + for (i=0; i<8; i++) + { + dest[4*i] = buffer[4*(7-i)]; + dest[4*i + 1] = buffer[4*(7-i) + 1]; + dest[4*i + 2] = buffer[4*(7-i) + 2]; + dest[4*i + 3] = buffer[4*(7-i) + 3]; + } + break; + case 3: + for (i=0; i<32; i++) + { + dest[i] = (buffer[31-i] >> 4) + ((buffer[31-i] & 0xf) << 4); + } + break; + } +} + +void sub_8100874(struct UnkStruct_02038900 *unk_02038900) +{ + u16 i; + for (i=0; i<0x40; i++) + sub_8100740(&unk_02038900->image[i * 32], unk_02038900->tiles[i]); +} + +u16 sub_810089C(u16 a0) +{ + return ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles)[a0] & 0xfff; +} + +const u8 Unknown_3EC660[] = {0, 1, 2, 3}; +const u8 Unknown_3EC664[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13}; +const u8 Unknown_3EC670[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; +const u8 Unknown_3EC680[] = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21}; +const u8 Unknown_3EC68C[] = {0, 1, 2, 3, 4, 5, 6, 7}; +const u8 Unknown_3EC694[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; +const u8 Unknown_3EC6B4[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45}; +const u8 Unknown_3EC6D8[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29}; + +const u8 Unknown_3EC6F0[] = {0, 0, 0, 0}; +const u8 Unknown_3EC6F4[] = {0, 0, 1, 1, 0, 0, 1, 1}; +const u8 Unknown_3EC6FC[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2}; +const u8 Unknown_3EC708[] = {0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 4, 4, 5, 5, 6, 6, 7, 7}; +const u8 Unknown_3EC728[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3}; +const u8 Unknown_3EC738[] = {0, 0, 0, 0, 1, 1, 1, 1}; +const u8 Unknown_3EC740[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2}; +const u8 Unknown_3EC74C[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 4, 4, 5, 5, 4, 4, 5, 5, 6, 6, 7, 7, 6, 6, 7, 7}; +const u8 Unknown_3EC76C[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 6, 6, 7, 7, 8, 8}; +const u8 Unknown_3EC790[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5}; + +const u8 Unknown_3EC7A8[] = {4, 5, 6, 7}; +const u8 Unknown_3EC7AC[] = {4, 5, 4, 5, 6, 7, 6, 7}; +const u8 Unknown_3EC7B4[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; +const u8 Unknown_3EC7C0[] = {4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7}; +const u8 Unknown_3EC7E0[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7}; +const u8 Unknown_3EC7F0[] = {4, 5, 6, 7, 4, 5, 6, 7}; +const u8 Unknown_3EC7F8[] = {4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7}; +const u8 Unknown_3EC804[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7}; +const u8 Unknown_3EC824[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; +const u8 Unknown_3EC848[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; + +const struct UnkStruct_803EC860 gUnknown_083EC860[] = { + {Unknown_3EC660, Unknown_3EC6F0, Unknown_3EC7A8, 0x4}, + {Unknown_3EC68C, Unknown_3EC6F4, Unknown_3EC7AC, 0x8}, + {Unknown_3EC664, Unknown_3EC6FC, Unknown_3EC7B4, 0xc}, + {Unknown_3EC694, Unknown_3EC708, Unknown_3EC7C0, 0x20}, + {Unknown_3EC670, Unknown_3EC728, Unknown_3EC7E0, 0x10}, + {Unknown_3EC68C, Unknown_3EC738, Unknown_3EC7F0, 0x8}, + {Unknown_3EC680, Unknown_3EC740, Unknown_3EC7F8, 0xc}, + {Unknown_3EC694, Unknown_3EC74C, Unknown_3EC804, 0x20}, + {Unknown_3EC6B4, Unknown_3EC76C, Unknown_3EC824, 0x24}, + {Unknown_3EC6D8, Unknown_3EC790, Unknown_3EC848, 0x18} +}; + +const struct UnkStruct_083EC900 gUnknown_083EC900[] = { + {0, 1, 0x78, 0x4e}, + {1, 2, 0x80, 0x4e}, + {1, 3, 0x90, 0x56}, + {1, 3, 0x90, 0x46}, + {0, 2, 0x80, 0x46}, + {2, 2, 0x78, 0x46}, + {2, 3, 0x80, 0x56}, + {2, 3, 0x80, 0x36}, + {0, 3, 0x90, 0x46}, + {1, 3, 0x90, 0x46} +}; + +const union AnimCmd gSpriteAnim_83EC928[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 0), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83EC930[] = { + gSpriteAnim_83EC928 +}; + +const struct SpriteFrameImage gSpriteImageTable_83EC934[] = { + {.data = gUnknown_02038900.image, .size = sizeof(gUnknown_02038900.image)} +}; + +const struct SpriteTemplate gSpriteTemplate_83EC93C = { + .tileTag = 0xffff, + .paletteTag = 3000, + .oam = &gUnknown_020391AC, + .anims = gSpriteAnimTable_83EC930, + .images = gSpriteImageTable_83EC934, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_81009A8 +}; + +const struct SpritePalette gUnknown_083EC954 = {.data = (u16 *)&gUnknown_02038900.palette, .tag = 3000}; + +const struct YesNoFuncTable gUnknown_083EC95C = {.yesFunc = sub_81000C4, .noFunc = sub_810065C}; +const struct YesNoFuncTable gUnknown_083EC964 = {.yesFunc = sub_810026C, .noFunc = sub_810065C}; +const struct YesNoFuncTable gUnknown_083EC96C[] = { + {.yesFunc = sub_80FFAB0, .noFunc = sub_80FFB08}, + {.yesFunc = sub_8100F88, .noFunc = sub_8100FB4} +}; + +const u8 gUnknown_083EC97C[] = {4, 4, 4, 4, 0, 3, 3, 0}; +const u8 gUnknown_083EC984[] = {4, 4, 4, 4, 0, 4, 3, 0}; + +const u16 gUnknown_083EC98C[] = INCBIN_U16("graphics/unknown/83EC98C.gbapal"); +const u16 Unknown_3EC9AC[] = INCBIN_U16("graphics/unknown/83EC9AC.gbapal"); +const struct YesNoFuncTable gUnknown_083EC9CC = {.yesFunc = sub_810153C, .noFunc = sub_8100EEC}; +const struct YesNoFuncTable gUnknown_083EC9D4 = {.yesFunc = sub_8101590, .noFunc = sub_8100EEC}; +const u32 gSpriteImage_83EC9DC[] = INCBIN_U32("graphics/unknown_sprites/83EC9DC.4bpp"); +const struct SpritePalette gUnknown_083ECA5C = {.data = gUnknown_083EC98C, .tag = 8}; +const struct SpritePalette gUnknown_083ECA64 = {.data = Unknown_3EC9AC, .tag = 8}; +const struct OamData gOamData_83ECA6C = { + .size = 1, .priority = 1 +}; + +const union AnimCmd gSpriteAnim_83ECA74[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 0), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83ECA7C[] = { + gSpriteAnim_83ECA74 +}; + +const struct SpriteFrameImage gSpriteImageTable_83ECA80[] = { + obj_frame_tiles(gSpriteImage_83EC9DC) +}; + +const struct SpriteTemplate gSpriteTemplate_83ECA88 = { + .tileTag = 0xffff, + .paletteTag = 8, + .oam = &gOamData_83ECA6C, + .anims = gSpriteAnimTable_83ECA7C, + .images = gSpriteImageTable_83ECA80, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8101698 +}; + +const struct YesNoFuncTable gUnknown_083ECAA0 = {.yesFunc = sub_8101848, .noFunc = sub_80FED3C}; + +u8 *const unref_label_083ECAA8[] = {gSharedMem}; + +void sub_81008BC(struct UnkStruct_02038900 *unk_02038900) +{ + u8 i; + u8 shape; + shape = unk_02038900->decoration->shape; + for (i=0; itiles[gUnknown_083EC860[shape].tiles[i]] = sub_810089C(unk_02038900->decoration->tiles[gUnknown_083EC860[shape].y[i]] * 8 + gUnknown_083EC860[shape].x[i]); + } +} + +void sub_8100930(u8 decoShape) +{ + gUnknown_020391AC.y = 0; + gUnknown_020391AC.affineMode = 0; + gUnknown_020391AC.objMode = 0; + gUnknown_020391AC.mosaic = 0; + gUnknown_020391AC.bpp = 0; + gUnknown_020391AC.shape = gUnknown_083EC900[decoShape].shape; + gUnknown_020391AC.x = 0; + gUnknown_020391AC.matrixNum = 0; + gUnknown_020391AC.size = gUnknown_083EC900[decoShape].size; + gUnknown_020391AC.tileNum = 0; + gUnknown_020391AC.priority = 1; + gUnknown_020391AC.paletteNum = 0; +} + +void sub_81009A8(struct Sprite *sprite) +{ + sprite->data[2] = 0; + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = 0; + sprite->data[6] = 0; + sprite->data[7] = 0; + sprite->callback = sub_81009C0; +} + +void sub_81009C0(struct Sprite *sprite) +{ + if (sprite->data[7] == 0) + { + if (sprite->data[6] < 15) + { + sprite->invisible = 0; + } else + { + sprite->invisible = 1; + } + sprite->data[6] = (sprite->data[6] + 1) & 0x1f; + } else + { + sprite->invisible = 0; + } +} + +void sub_8100A0C(u8 taskId) +{ + if (sub_8100D38(taskId) == 1) + { + FadeScreen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_8100E70; + } else + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecorInUse, sub_80FE428, 0); + } +} + +void sub_8100A60(u8 a0) +{ + ewram_1f000.items[a0] = 0; + ewram_1f000.pos[a0] = 0; +} + +void sub_8100A7C(void) +{ + u16 i; + gSpecialVar_0x8005 = 0; + gSpecialVar_Result = 0; + if (gSpecialVar_0x8004 == gUnknown_02039234) + { + gSpecialVar_Result = 1; + } else if (gDecorations[ewram_1f000.items[gUnknown_020391B4[gSpecialVar_0x8004].decorId]].permission == DECORPERM_SOLID_MAT) + { + gSpecialVar_0x8005 = gUnknown_020391B4[gSpecialVar_0x8004].flagId; + sub_8100A60(gUnknown_020391B4[gSpecialVar_0x8004].decorId); + for (i=0; imapObjectCount; i++) + { + if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8005) + { + gSpecialVar_0x8006 = gMapHeader.events->mapObjects[i].localId; + break; + } + } + } +} + +void sub_8100B20(void) +{ + u8 i; + for (i=0; imapObjectCount; i++) + { + if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8004) + { + gSpecialVar_0x8005 = gMapHeader.events->mapObjects[i].localId; + break; + } + } +} + +void sub_8100B6C(void) +{ + u8 i; + u8 j; + u8 k; + u8 x; + u8 y; + u8 permission; + for (i=0; i> 4; + y = ewram_1f000.pos[gUnknown_020391B4[i].decorId] & 0xf; + if (permission != DECORPERM_SOLID_MAT) + { + if (ewram_1f000.items[gUnknown_020391B4[i].decorId] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(x + 7, y + 7) == 0x28c) + { + gUnknown_020391B4[i].height++; + } + for (j=0; jmap)[(x + k) + gMapHeader.mapData->width * (y - j)] | 0x3000); + } + } + sub_8100A60(gUnknown_020391B4[i].decorId); + } + } +} + +void sub_8100C88(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + sub_8100B6C(); + gTasks[taskId].data[2] = 1; + break; + case 1: + if (!gPaletteFade.active) + { + DrawWholeMapView(); + ScriptContext1_SetupScript(gUnknown_081A2F8A); + Menu_EraseWindowRect(0, 0, 29, 19); + gTasks[taskId].data[2] = 2; + } + break; + case 2: + ScriptContext2_Enable(); + sub_80FED90(taskId); + pal_fill_black(); + gTasks[taskId].data[2] = 3; + break; + case 3: + if (IsWeatherNotFadingIn() == TRUE) + { + gTasks[taskId].data[13] = -1; + DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); + } + break; + } +} + +bool8 sub_8100D38(u8 taskId) +{ + u16 i; + for (i=0; iwidth = 1; + unk_020391B4->height = 1; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x1) + { + unk_020391B4->width = 2; + unk_020391B4->height = 1; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x1) + { + unk_020391B4->width = 3; + unk_020391B4->height = 1; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_4x2) + { + unk_020391B4->width = 4; + unk_020391B4->height = 2; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x2) + { + unk_020391B4->width = 2; + unk_020391B4->height = 2; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_1x2) + { + unk_020391B4->width = 1; + unk_020391B4->height = 2; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_1x3) + { + unk_020391B4->width = 1; + unk_020391B4->height = 3; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x4) + { + unk_020391B4->width = 2; + unk_020391B4->height = 4; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x3) + { + unk_020391B4->width = 3; + unk_020391B4->height = 3; + } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x2) + { + unk_020391B4->width = 3; + unk_020391B4->height = 2; + } +} + +void sub_8101198(u8 x, u8 y) +{ + gSprites[gUnknown_020391A8].invisible = 1; + gSprites[gUnknown_020391A8].callback = SpriteCallbackDummy; + gSprites[gUnknown_020391A9].pos1.x = 0x88 + x * 16; + gSprites[gUnknown_020391A9].pos1.y = 0x48 + y * 16; +} + +bool8 sub_8101200(u8 taskId, u8 decorIdx, struct UnkStruct_020391B4 *unk_020391B4) +{ + u8 x; + u8 y; + u8 xOff; + u8 yOff; + x = gTasks[taskId].data[0] - 7; + y = gTasks[taskId].data[1] - 7; + xOff = ewram_1f000.pos[decorIdx] >> 4; + yOff = ewram_1f000.pos[decorIdx] & 0xf; + if (ewram_1f000.items[decorIdx] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(xOff + 7, yOff + 7) == 0x28c) + { + unk_020391B4->height--; + } + if (x >= xOff && x < xOff + unk_020391B4->width && y > yOff - unk_020391B4->height && y <= yOff) + { + sub_8101198(unk_020391B4->width - (x - xOff + 1), yOff - y); + return TRUE; + } + return FALSE; +} + +void sub_81012A0(void) +{ + u8 xOff; + u8 yOff; + u16 i; + xOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].decorId] >> 4; + yOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].decorId] & 0xf; + for (i=0; i<0x40; i++) + { + if (gSaveBlock1.mapObjectTemplates[i].x == xOff && gSaveBlock1.mapObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1.mapObjectTemplates[i].flagId)) + { + gUnknown_020391B4[gUnknown_02039234].flagId = gSaveBlock1.mapObjectTemplates[i].flagId; + break; + } + } +} + +bool8 sub_8101340(u8 taskId) +{ + u16 i; + for (i=0; idecorId = i; + sub_81012A0(); + gUnknown_02039234 = 1; + return TRUE; + } + } + } + } + return FALSE; +} + +void sub_81013B8(u8 a0, u8 a1, u8 a2, u8 a3) +{ + u8 i; + u8 xOff; + u8 yOff; + u8 decorIdx; + for (i=0; i> 4; + yOff = ewram_1f000.pos[i] & 0xf; + if (decorIdx != 0 && gDecorations[decorIdx].permission == DECORPERM_SOLID_MAT && a0 <= xOff && a1 <= yOff && a2 >= xOff && a3 >= yOff) + { + gUnknown_020391B4[gUnknown_02039234].decorId = i; + sub_81012A0(); + gUnknown_02039234++; + } + } +} + +#ifdef NONMATCHING +void sub_8101460(u8 taskId) +{ + u8 i; + u8 xOff; + u8 yOff; + gUnknown_02039234 = 0; + if (sub_8101340(taskId) != TRUE) + { + for (i=0; i> 4; + yOff = ewram_1f000.pos[gUnknown_020391B4[0].decorId] & 0xf; + sub_81013B8(xOff, yOff - gUnknown_020391B4[0].height + 1, xOff + gUnknown_020391B4[0].width - 1, yOff); + } + } +} +#else +__attribute__((naked)) +void sub_8101460(u8 taskId) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r4, _081014B8 @ =gUnknown_02039234\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r4]\n" + "\tadds r0, r6, 0\n" + "\tbl sub_8101340\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbeq _08101504\n" + "\tmovs r5, 0\n" + "\tldr r0, _081014BC @ =ewram_1f000\n" + "\tldrb r1, [r0, 0x8]\n" + "\tcmp r5, r1\n" + "\tbcs _081014D2\n" + "\tadds r7, r4, 0\n" + "_08101486:\n" + "\tldr r0, [r0]\n" + "\tadds r0, r5\n" + "\tldrb r1, [r0] @ compiler incorrectly uses r0 for this and the next instruction\n" + "\tcmp r1, 0\n" + "\tbeq _081014C4\n" + "\tldr r4, _081014C0 @ =gUnknown_020391B4\n" + "\tadds r0, r1, 0\n" + "\tadds r1, r4, 0\n" + "\tbl sub_8101118\n" + "\tadds r0, r6, 0\n" + "\tadds r1, r5, 0\n" + "\tadds r2, r4, 0\n" + "\tbl sub_8101200\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbne _081014C4\n" + "\tstrb r5, [r4]\n" + "\tldrb r0, [r7]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r7]\n" + "\tb _081014D2\n" + "\t.align 2, 0\n" + "_081014B8: .4byte gUnknown_02039234\n" + "_081014BC: .4byte 0x201f000\n" + "_081014C0: .4byte gUnknown_020391B4\n" + "_081014C4:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldr r0, _0810150C @ =ewram_1f000\n" + "\tldrb r1, [r0, 0x8]\n" + "\tcmp r5, r1\n" + "\tbcc _08101486\n" + "_081014D2:\n" + "\tldr r0, _08101510 @ =gUnknown_02039234\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _08101504\n" + "\tldr r0, _0810150C @ =ewram_1f000\n" + "\tldr r2, _08101514 @ =gUnknown_020391B4\n" + "\tldrb r1, [r2]\n" + "\tldr r0, [r0, 0x4]\n" + "\tadds r0, r1\n" + "\tldrb r1, [r0]\n" + "\tlsrs r0, r1, 4\n" + "\tmovs r3, 0xF\n" + "\tands r3, r1\n" + "\tldrb r1, [r2, 0x2]\n" + "\tsubs r1, r3, r1\n" + "\tadds r1, 0x1\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tldrb r2, [r2, 0x1]\n" + "\tadds r2, r0\n" + "\tsubs r2, 0x1\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tbl sub_81013B8\n" + "_08101504:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0810150C: .4byte 0x201f000\n" + "_08101510: .4byte gUnknown_02039234\n" + "_08101514: .4byte gUnknown_020391B4\n" + ".syntax divided\n"); +} +#endif + +void sub_8101518(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083EC9CC); +} + +void sub_810153C(u8 taskId) +{ + FadeScreen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_8100C88; +} + +void sub_810156C(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083EC9D4); +} + +void sub_8101590(u8 taskId) +{ + Menu_EraseWindowRect(0, 0, 29, 19); + sub_81015B0(taskId); +} + +void sub_81015B0(u8 taskId) +{ + FadeScreen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_81015E0; +} + +void sub_81015E0(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + if (!gPaletteFade.active) + { + sub_80FF114(taskId); + gTasks[taskId].data[2] = 1; + } + break; + case 1: + sub_81016F4(); + gFieldCallback = sub_8101678; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + break; + } +} + +void sub_8101648(u8 taskId) +{ + if (IsWeatherNotFadingIn() == TRUE) + { + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; + } +} + +void sub_8101678(void) +{ + pal_fill_black(); + Menu_DisplayDialogueFrame(); + sub_80FE220(); + CreateTask(sub_8101648, 8); +} + +void sub_8101698(struct Sprite *sprite) +{ + sprite->data[0] = (sprite->data[0] + 1) & 0x1f; + if (sprite->data[0] >= 16) + { + sprite->invisible = TRUE; + } else + { + sprite->invisible = FALSE; + } +} + +void sub_81016C8(void) +{ + if (gSaveBlock2.playerGender == MALE) + { + LoadSpritePalette(&gUnknown_083ECA5C); + } else + { + LoadSpritePalette(&gUnknown_083ECA64); + } +} + +void sub_81016F4(void) +{ + FreeSpritePaletteByTag(8); +} + +void sub_8101700(u8 taskId) +{ + if (!sub_81341D4()) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); + } else + { + gTasks[taskId].data[11] = 1; + gUnknown_020388F6 = 0; + sub_80FE5AC(taskId); + } +} + +void sub_8101750(u8 taskId) +{ + if (!sub_81341D4()) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); + } else + { + gTasks[taskId].data[11] = 2; + gUnknown_020388F6 = 0; + sub_80FE5AC(taskId); + } +} + +void sub_81017A0(u8 taskId) +{ + sub_80FEF74(); + sub_80FED1C(); + if (sub_80FEFA4() == TRUE) + { + StringCopy(gStringVar1, gDecorations[gUnknown_020388D0[gUnknown_020388F5]].name); + StringExpandPlaceholders(gStringVar4, gSecretBaseText_WillBeDiscarded); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8101824, 0); + } else + { + DisplayItemMessageOnField(taskId, gSecretBaseText_DecorInUse, sub_80FEFF4, 0); + } +} + +void sub_8101824(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083ECAA0); +} + +void sub_8101848(u8 taskId) +{ + Menu_EraseWindowRect(20, 8, 26, 14); + sub_8109A30(gUnknown_020388D0[gUnknown_020388F5]); + gUnknown_020388D0[gUnknown_020388F5] = DECOR_NONE; + sub_80FF098(taskId); + DisplayItemMessageOnField(taskId, gSecretBaseText_DecorThrownAway, sub_80FEFF4, 0); +} diff --git a/src/decoration_inventory.c b/src/decoration_inventory.c new file mode 100644 index 000000000..8f7f5eb92 --- /dev/null +++ b/src/decoration_inventory.c @@ -0,0 +1,177 @@ +#include "global.h" +#include "constants/decorations.h" +#include "sprite.h" +#include "task.h" +#include "decoration.h" +#include "decoration_inventory.h" + +#define DECOR_INV(ptr) {.items = ptr, .size = sizeof ptr} + +struct DecorationInventory const gDecorationInventories[] = { + DECOR_INV(gSaveBlock1.decorDesk), + DECOR_INV(gSaveBlock1.decorChair), + DECOR_INV(gSaveBlock1.decorPlant), + DECOR_INV(gSaveBlock1.decorOrnament), + DECOR_INV(gSaveBlock1.decorMat), + DECOR_INV(gSaveBlock1.decorPoster), + DECOR_INV(gSaveBlock1.decorDoll), + DECOR_INV(gSaveBlock1.decorCushion) +}; + +void ClearDecorationInventory(u8 invIdx) +{ + u8 i; + for (i=0; i gDecorationInventories[invIdx].items[j])) + { + tmp = gDecorationInventories[invIdx].items[i]; + gDecorationInventories[invIdx].items[i] = gDecorationInventories[invIdx].items[j]; + gDecorationInventories[invIdx].items[j] = tmp; + } + } + } +} + +u8 sub_8134194(u8 invIdx) +{ + u8 i; + u8 count; + count = 0; + for (i=0; iunk1_6 == 0) + { + if (r5->unk0_0 >= (u16)r2) + { + r5->unk0_0 -= r2; + if (r5->unk0_0 == 0) + r5->unk1_6 = 1; + continue; + } + //_080FA290 + r2 -= r5->unk0_0; + r5->unk0_0 = 0; + r5->unk1_6 = 1; + } + //_080FA2A0 + r4 = r5->unk0_0 + r2; + if ((u16)r4 > r5->unk0_7) + { + u32 sp4 = r4 % r5->unk0_7; + r4 = r4 / r5->unk0_7; + + r5->unk1_6 = r4 ^ 1; + if (r5->unk1_6) + r5->unk0_0 = sp4; + else + //_080FA2FA + r5->unk0_0 = r5->unk0_7 - sp4; + } + else + { + //_080FA310 + r5->unk0_0 = r4; + + if (r5->unk0_0 == r5->unk0_7) + r5->unk1_6 = 0; + } + } + sub_80FA46C(gSaveBlock1.easyChatPairs, 5, 0); + } + //_080FA34E +} + +bool8 sub_80FA364(u16 *a) +{ + struct EasyChatPair s = {0}; + u16 i; + + if (!SB1ContainsWords(a)) + { + if (!FlagGet(FLAG_SYS_POPWORD_INPUT)) + { + FlagSet(FLAG_SYS_POPWORD_INPUT); + if (!FlagGet(FLAG_SYS_MIX_RECORD)) + { + gSaveBlock1.easyChatPairs[0].words[0] = a[0]; + gSaveBlock1.easyChatPairs[0].words[1] = a[1]; + return 1; + } + } + + //_080FA3C8 + s.words[0] = a[0]; + s.words[1] = a[1]; + s.unk1_6 = 1; + sub_80FA740(&s); + + for (i = 0; i < 5; i++) + { + if (sub_80FA670(&s, &gSaveBlock1.easyChatPairs[i], 0)) + { + u16 r3 = 4; + + while (r3 > i) + { + gSaveBlock1.easyChatPairs[r3] = gSaveBlock1.easyChatPairs[r3 - 1]; + r3--; + } + gSaveBlock1.easyChatPairs[i] = s; + return (i == 0); + } + //_080FA450 + } + gSaveBlock1.easyChatPairs[4] = s; + } + return 0; +} + +static void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c) +{ + u16 h; + + for (h = 0; h < b; h++) + { + u16 i; + + for (i = h + 1; i < b; i++) + { + if (sub_80FA670(&s[i], &s[h], c)) + { + struct EasyChatPair temp; + + temp = s[i]; + s[i] = s[h]; + s[h] = temp; + } + } + } +} + +void sub_80FA4E4(void *a, u32 b, u8 unused) +{ + u16 i; + u16 j; + u16 r7; + struct EasyChatPair *src; + struct EasyChatPair *dst; + u16 players = GetLinkPlayerCount(); + + for (i = 0; i < players; i++) + memcpy(&ARRAY_2007800[i * 5], (u8 *)a + i * b, 40); + src = ARRAY_2007800; + dst = ARRAY_2007900; + r7 = 0; + for (i = 0; i < players; i++) + { + for (j = 0; j < 5; j++) + { + s16 foo = sub_80FA828(src, r7); + if (foo < 0) + { + *(dst++) = *src; + r7++; + } + else + { + if (ARRAY_2007900[foo].unk0_0 < src->unk0_0) + { + ARRAY_2007900[foo] = *src; + } + } + src++; + } + } + sub_80FA46C(ARRAY_2007900, r7, 2); + src = ARRAY_2007900; + dst = gSaveBlock1.easyChatPairs; + for (i = 0; i < 5; i++) + *(dst++) = *(src++); +} + +void BufferTrendyPhraseString(void) +{ + struct EasyChatPair *s = &gSaveBlock1.easyChatPairs[gSpecialVar_0x8004]; + + ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1); +} + +void TrendyPhraseIsOld(void) +{ + u16 result = 0; + + if (gSaveBlock1.easyChatPairs[0].unk0_0 - gSaveBlock1.easyChatPairs[1].unk0_0 < 2) + { + asm("":::"r2"); //Force the compiler to store address of gSaveBlock1 in r3 instead of r2 + if (!gSaveBlock1.easyChatPairs[0].unk1_6 && gSaveBlock1.easyChatPairs[1].unk1_6) + result = 1; + } + gSpecialVar_Result = result; +} + +void GetDewfordHallPaintingNameIndex(void) +{ + gSpecialVar_Result = (gSaveBlock1.easyChatPairs[0].words[0] + gSaveBlock1.easyChatPairs[0].words[1]) & 7; +} + +static bool8 sub_80FA670(struct EasyChatPair *a, struct EasyChatPair *b, u8 c) +{ + switch (c) + { + case 0: + if (a->unk0_0 > b->unk0_0) + return 1; + if (a->unk0_0 < b->unk0_0) + return 0; + if (a->unk0_7 > b->unk0_7) + return 1; + if (a->unk0_7 < b->unk0_7) + return 0; + break; + case 1: + if (a->unk0_7 > b->unk0_7) + return 1; + if (a->unk0_7 < b->unk0_7) + return 0; + if (a->unk0_0 > b->unk0_0) + return 1; + if (a->unk0_0 < b->unk0_0) + return 0; + break; + case 2: + if (a->unk0_0 > b->unk0_0) + return 1; + if (a->unk0_0 < b->unk0_0) + return 0; + if (a->unk0_7 > b->unk0_7) + return 1; + if (a->unk0_7 < b->unk0_7) + return 0; + if (a->unk2 > b->unk2) + return 1; + if (a->unk2 < b->unk2) + return 0; + if (a->words[0] > b->words[0]) + return 1; + if (a->words[0] < b->words[0]) + return 0; + if (a->words[1] > b->words[1]) + return 1; + if (a->words[1] < b->words[1]) + return 0; + return 1; + } + return Random() & 1; +} + +static void sub_80FA740(struct EasyChatPair *s) +{ + u16 r4; + + r4 = Random() % 98; + if (r4 > 50) + { + r4 = Random() % 98; + if (r4 > 80) + r4 = Random() % 98; + } + s->unk0_7 = r4 + 30; + s->unk0_0 = (Random() % (r4 + 1)) + 30; + s->unk2 = Random(); +} + +static bool8 SB1ContainsWords(u16 *a) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (IsEasyChatPairEqual(a, gSaveBlock1.easyChatPairs[i].words) != 0) + return TRUE; + } + return FALSE; +} + +static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + if (*(words1++) != *(words2++)) + return FALSE; + } + return TRUE; +} + +static s16 sub_80FA828(struct EasyChatPair *a, u16 b) +{ + s16 i; + struct EasyChatPair *s = ARRAY_2007900; + + for (i = 0; i < b; i++) + { + if (IsEasyChatPairEqual(a->words, s->words)) + return i; + s++; + } + return -1; +} diff --git a/src/diploma.c b/src/diploma.c new file mode 100644 index 000000000..b31fc7dec --- /dev/null +++ b/src/diploma.c @@ -0,0 +1,139 @@ +#include "global.h" +#include "diploma.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokedex.h" +#include "overworld.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "scanline_effect.h" + +static void VBlankCB(void); +static void MainCB2(void); +static void Task_DiplomaFadeIn(u8); +static void Task_DiplomaWaitForKeyPress(u8); +static void Task_DiplomaFadeOut(u8); +static void DisplayDiplomaText(void); + +static const u16 gDiplomaPalettes[][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 void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_ShowDiploma(void) +{ + u32 savedIme; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + + LZ77UnCompVram(gDiplomaTiles, (void *)VRAM); + LZ77UnCompVram(gDiplomaTilemap, (void *)(VRAM + 0x3000)); + + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + LoadPalette(gDiplomaPalettes, 0, 64); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + DisplayDiplomaText(); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(VBlankCB); + SetMainCallback2(MainCB2); + + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT512x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + + CreateTask(Task_DiplomaFadeIn, 0); +} + +static void MainCB2(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_DiplomaFadeIn(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_DiplomaWaitForKeyPress; +} + +static void Task_DiplomaWaitForKeyPress(u8 taskId) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_DiplomaFadeOut; + } +} + +static void Task_DiplomaFadeOut(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(sub_80546F0); + } +} + +static void DisplayDiplomaText(void) +{ + if (CompletedNationalPokedex()) + { + REG_BG3HOFS = 256; + StringCopy(gStringVar1, gOtherText_NationalDex); + } + else + { + REG_BG3HOFS = 0; + StringCopy(gStringVar1, gOtherText_HoennDex); + } + Menu_PrintText(gOtherText_DiplomaCertificationGameFreak, 6, 2); +} \ No newline at end of file diff --git a/src/egg_hatch.c b/src/egg_hatch.c new file mode 100644 index 000000000..282ad31fb --- /dev/null +++ b/src/egg_hatch.c @@ -0,0 +1,838 @@ +#include "global.h" +#include "data2.h" +#include "daycare.h" +#include "decompress.h" +#include "event_data.h" +#include "ewram.h" +#include "constants/items.h" +#include "main.h" +#include "menu.h" +#include "naming_screen.h" +#include "overworld.h" +#include "palette.h" +#include "pokemon.h" +#include "random.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "text_window.h" +#include "trig.h" +#include "trade.h" + +extern struct SpriteTemplate gUnknown_02024E8C; + +struct EggHatchData +{ + u8 eggSpriteID; + u8 pokeSpriteID; + u8 CB2_state; + u8 CB2_PalCounter; + u8 eggPartyID; + struct Window window; + u8 tileDataStartOffset; + u8 unused_39; + u8 eggShardVelocityID; +}; + +struct EggHatchData* gEggHatchData; + +extern const u32 gUnknown_08D00000[]; +extern const u32 gUnknown_08D00524[]; +extern const u16 gUnknown_08D004E0[]; //palette +extern const struct SpriteSheet sUnknown_0820A3B0; +extern const struct SpriteSheet sUnknown_0820A3B8; +extern const struct SpritePalette sUnknown_0820A3C0; + +bool8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); +u8 sav1_map_get_name(void); +const struct CompressedSpritePalette* GetMonSpritePalStruct(struct Pokemon* mon); //gets pokemon palette address +void sub_8080990(void); + +static void Task_EggHatch(u8 taskID); +static void CB2_EggHatch_0(void); +static void CB2_EggHatch_1(void); +static void SpriteCB_Egg_0(struct Sprite* sprite); +static void SpriteCB_Egg_1(struct Sprite* sprite); +static void SpriteCB_Egg_2(struct Sprite* sprite); +static void SpriteCB_Egg_3(struct Sprite* sprite); +static void SpriteCB_Egg_4(struct Sprite* sprite); +static void SpriteCB_Egg_5(struct Sprite* sprite); +static void SpriteCB_EggShard(struct Sprite* sprite); +static void EggHatchPrintMessage2(u8* src); +static void EggHatchPrintMessage1(u8* src); +static bool8 EggHatchUpdateWindowText(void); +static void CreateRandomEggShardSprite(void); +static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex); + +// graphics + +static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/egg/palette.gbapal"); +static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/misc/egg_hatch.4bpp"); +static const u8 sEggShardTiles[] = INCBIN_U8("graphics/misc/egg_shard.4bpp"); + +static const struct OamData sOamData_820A378 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_820A380[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_820A388[] = +{ + ANIMCMD_FRAME(16, 5), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_820A390[] = +{ + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_820A398[] = +{ + ANIMCMD_FRAME(48, 5), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_820A3A0[] = +{ + sSpriteAnim_820A380, + sSpriteAnim_820A388, + sSpriteAnim_820A390, + sSpriteAnim_820A398, +}; + +static const struct SpriteSheet sUnknown_0820A3B0 = +{ + .data = sEggHatchTiles, + .size = 2048, + .tag = 12345, +}; + +static const struct SpriteSheet sUnknown_0820A3B8 = +{ + .data = sEggShardTiles, + .size = 128, + .tag = 23456, +}; + +static const struct SpritePalette sUnknown_0820A3C0 = +{ + .data = sEggPalette, + .tag = 54321 +}; + +static const struct SpriteTemplate sSpriteTemplate_820A3C8 = +{ + .tileTag = 12345, + .paletteTag = 54321, + .oam = &sOamData_820A378, + .anims = sSpriteAnimTable_820A3A0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + + +static const struct OamData sOamData_820A3E0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_820A3E8[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_820A3F0[] = +{ + ANIMCMD_FRAME(1, 5), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_820A3F8[] = +{ + ANIMCMD_FRAME(2, 5), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_820A400[] = +{ + ANIMCMD_FRAME(3, 5), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_820A408[] = +{ + sSpriteAnim_820A3E8, + sSpriteAnim_820A3F0, + sSpriteAnim_820A3F8, + sSpriteAnim_820A400, +}; + +static const struct SpriteTemplate sSpriteTemplate_820A418 = +{ + .tileTag = 23456, + .paletteTag = 54321, + .oam = &sOamData_820A3E0, + .anims = sSpriteAnimTable_820A408, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_EggShard +}; + +// actual code + +static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp) +{ + u16 species; + u32 personality, pokerus; + u8 i, friendship, language, gameMet, markings; + u16 moves[4]; + u32 ivs[6]; + + + species = GetMonData(egg, MON_DATA_SPECIES); + + for (i = 0; i < 4; i++) + { + moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i); + } + + personality = GetMonData(egg, MON_DATA_PERSONALITY); + + for (i = 0; i < 6; i++) + { + ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i); + } + + gameMet = GetMonData(egg, MON_DATA_MET_GAME); + markings = GetMonData(egg, MON_DATA_MARKINGS); + pokerus = GetMonData(egg, MON_DATA_POKERUS); + + CreateMon(temp, species, 5, 32, TRUE, personality, 0, 0); + + for (i = 0; i < 4; i++) + { + SetMonData(temp, MON_DATA_MOVE1 + i, (const u8 *) &moves[i]); + } + + for (i = 0; i < 6; i++) + { + SetMonData(temp, MON_DATA_HP_IV + i, (const u8 *) &ivs[i]); + } + + language = GAME_LANGUAGE; + SetMonData(temp, MON_DATA_LANGUAGE, &language); + SetMonData(temp, MON_DATA_MET_GAME, &gameMet); + SetMonData(temp, MON_DATA_MARKINGS, &markings); + + friendship = 120; + SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship); + SetMonData(temp, MON_DATA_POKERUS, (const u8 *) &pokerus); + + *egg = *temp; +} + +static void AddHatchedMonToParty(u8 id) +{ + u8 isEgg; + u16 pokeNum; + u8 name[12]; + u16 ball; + u16 caughtLvl; + u8 mapNameID; + struct Pokemon* mon = &gPlayerParty[id]; + + CreatedHatchedMon(mon, &gEnemyParty[0]); + isEgg = 0; + SetMonData(mon, MON_DATA_IS_EGG, &isEgg); + + pokeNum = GetMonData(mon, MON_DATA_SPECIES); + GetSpeciesName(name, pokeNum); + SetMonData(mon, MON_DATA_NICKNAME, name); + + pokeNum = SpeciesToNationalPokedexNum(pokeNum); + GetSetPokedexFlag(pokeNum, 2); + GetSetPokedexFlag(pokeNum, 3); + + GetMonNick(mon, gStringVar1); + + ball = ITEM_POKE_BALL; + SetMonData(mon, MON_DATA_POKEBALL, (const u8*) &ball); + + caughtLvl = 0; + SetMonData(mon, MON_DATA_MET_LEVEL, (const u8*) &caughtLvl); + + mapNameID = sav1_map_get_name(); + SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID); + + MonRestorePP(mon); + CalculateMonStats(mon); +} + +void ScriptHatchMon(void) +{ + AddHatchedMonToParty(gSpecialVar_0x8004); +} + +#ifdef NONMATCHING +static bool8 sub_8042ABC(void* a, u8 b) +{ + +} + +#else +__attribute__((naked)) +static bool8 sub_8042ABC(void* a, u8 b) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + sub sp, 0x20\n\ + adds r5, r0, 0\n\ + lsls r4, r1, 24\n\ + lsrs r4, 24\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 4\n\ + adds r0, r5, r0\n\ + mov r1, sp\n\ + bl GetBoxMonNick\n\ + lsls r0, r4, 3\n\ + subs r0, r4\n\ + lsls r1, r0, 3\n\ + adds r0, r5, r1\n\ + adds r0, 0xC0\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + beq _08042B40\n\ + adds r0, r1, 0\n\ + adds r0, 0xA0\n\ + adds r5, r0\n\ + adds r6, r5, 0\n\ + adds r6, 0x2C\n\ + mov r0, sp\n\ + adds r1, r6, 0\n\ + bl StringCompareWithoutExtCtrlCodes\n\ + cmp r0, 0\n\ + bne _08042B08\n\ + ldr r0, _08042B30 @ =gSaveBlock2\n\ + adds r1, r5, 0\n\ + adds r1, 0x24\n\ + bl StringCompareWithoutExtCtrlCodes\n\ + cmp r0, 0\n\ + beq _08042B40\n\ +_08042B08:\n\ + ldr r0, _08042B34 @ =gStringVar1\n\ + mov r1, sp\n\ + bl StringCopy\n\ + ldr r4, _08042B38 @ =gStringVar2\n\ + adds r1, r5, 0\n\ + adds r1, 0x24\n\ + adds r0, r4, 0\n\ + bl StringCopy\n\ + ldr r0, _08042B3C @ =gStringVar3\n\ + adds r1, r6, 0\n\ + bl StringCopy\n\ + adds r0, r4, 0\n\ + bl SanitizeNameString\n\ + movs r0, 0x1\n\ + b _08042B42\n\ + .align 2, 0\n\ +_08042B30: .4byte gSaveBlock2\n\ +_08042B34: .4byte gStringVar1\n\ +_08042B38: .4byte gStringVar2\n\ +_08042B3C: .4byte gStringVar3\n\ +_08042B40:\n\ + movs r0, 0\n\ +_08042B42:\n\ + add sp, 0x20\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided"); +} + +#endif // NONMATCHING + +bool8 sub_8042B4C(void) +{ + return sub_8042ABC(&gSaveBlock1.daycare, gSpecialVar_0x8004); +} + +static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID) +{ + u8 r5 = 0; + u8 spriteID = 0; + struct Pokemon* mon = NULL; + + if (a0 == 0) + { + mon = &gPlayerParty[pokeID]; + r5 = 1; + } + if (a0 == 1) + { + mon = &gPlayerParty[pokeID]; + r5 = 3; + } + switch (switchID) + { + case 0: + { + u16 species = GetMonData(mon, MON_DATA_SPECIES); + u32 pid = GetMonData(mon, MON_DATA_PERSONALITY); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, ewram0_6, gUnknown_081FAF4C[2 * a0 + 1], species, pid); + LoadCompressedObjectPalette(GetMonSpritePalStruct(mon)); + } + break; + case 1: + GetMonSpriteTemplate_803C56C(GetMonSpritePalStruct(mon)->tag, r5); + spriteID = CreateSprite(&gUnknown_02024E8C, 120, 70, 6); + gSprites[spriteID].invisible = 1; + gSprites[spriteID].callback = SpriteCallbackDummy; + break; + } + return spriteID; +} + +static void VBlankCB_EggHatch(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void EggHatch(void) +{ + ScriptContext2_Enable(); + CreateTask(Task_EggHatch, 10); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); +} + +static void Task_EggHatch(u8 taskID) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CB2_EggHatch_0); + gFieldCallback = sub_8080990; + DestroyTask(taskID); + } +} + +static void CB2_EggHatch_0(void) +{ + switch (gMain.state) + { + case 0: + REG_DISPCNT = 0; + gEggHatchData = eEggHatchData; + gEggHatchData->eggPartyID = gSpecialVar_0x8004; + gEggHatchData->eggShardVelocityID = 0; + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(VBlankCB_EggHatch); + gMain.state++; + gSpecialVar_0x8005 = GetCurrentMapMusic(); + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gEggHatchData->window, &gWindowTemplate_81E6F84); + gEggHatchData->tileDataStartOffset = TextWindow_SetBaseTileNum(20); + TextWindow_LoadStdFrameGraphics(&gEggHatchData->window); + gMain.state++; + break; + case 2: + LZDecompressVram(&gUnknown_08D00000, (void*)(VRAM)); + CpuSet(&gUnknown_08D00524, ewram0_7, 0x800); + DmaCopy16(3, ewram0_7, (void*)(VRAM + 0x2800), 0x500); + LoadCompressedPalette(&gUnknown_08D004E0, 0, 0x20); + gMain.state++; + break; + case 3: + LoadSpriteSheet(&sUnknown_0820A3B0); + LoadSpriteSheet(&sUnknown_0820A3B8); + LoadSpritePalette(&sUnknown_0820A3C0); + gMain.state++; + break; + case 4: + gEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_820A3C8, 0x78, 0x4B, 5); + AddHatchedMonToParty(gEggHatchData->eggPartyID); + gMain.state++; + break; + case 5: + EggHatchCreateMonSprite(0, 0, gEggHatchData->eggPartyID); + gMain.state++; + break; + case 6: + gEggHatchData->pokeSpriteID = EggHatchCreateMonSprite(0, 1, gEggHatchData->eggPartyID); + gMain.state++; + break; + case 7: + REG_BG2CNT = 0x4C06; + LoadPalette(gUnknown_0820C9F8, 0x10, 0xA0); + DmaCopyLarge16(3, gUnknown_0820CA98, (void *)(VRAM + 0x4000), 0x1300, 0x1000); + DmaCopy16Defvars(3, gUnknown_0820F798, (void *)(VRAM + 0x6000), 0x1000); + gMain.state++; + break; + case 8: + REG_BG1CNT = 0x501; + + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + + SetMainCallback2(CB2_EggHatch_1); + gEggHatchData->CB2_state = 0; + break; + } +} + +static void EggHatchSetMonNickname(void) +{ + SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3); + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +static void Task_EggHatchPlayBGM(u8 taskID) +{ + if (gTasks[taskID].data[0] == 0) + StopMapMusic(); + if (gTasks[taskID].data[0] == 1) + PlayBGM(376); + if (gTasks[taskID].data[0] > 60) + { + PlayBGM(377); + DestroyTask(taskID); + //return; task is destroyed, yet you increment the value? + } + gTasks[taskID].data[0]++; +} + +static void CB2_EggHatch_1(void) +{ + switch (gEggHatchData->CB2_state) + { + case 0: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + REG_DISPCNT = 0x1740; + gEggHatchData->CB2_state++; + CreateTask(Task_EggHatchPlayBGM, 5); + break; + case 1: + if (!gPaletteFade.active) + { + gEggHatchData->CB2_PalCounter = 0; + gEggHatchData->CB2_state++; + } + break; + case 2: + if (++gEggHatchData->CB2_PalCounter > 30) + { + gEggHatchData->CB2_state++; + gSprites[gEggHatchData->eggSpriteID].callback = SpriteCB_Egg_0; + } + break; + case 3: + if (gSprites[gEggHatchData->eggSpriteID].callback == SpriteCallbackDummy) + gEggHatchData->CB2_state++; + break; + case 4: + GetMonNick(&gPlayerParty[gEggHatchData->eggPartyID], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_HatchedFromEgg); + EggHatchPrintMessage2(gStringVar4); + PlayFanfare(371); + gEggHatchData->CB2_state++; + break; + case 5: + if (IsFanfareTaskInactive()) + gEggHatchData->CB2_state++; + break; + case 6: + if (IsFanfareTaskInactive()) + gEggHatchData->CB2_state++; + break; + case 7: + GetMonNick(&gPlayerParty[gEggHatchData->eggPartyID], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_NickHatchPrompt); + EggHatchPrintMessage1(gStringVar4); + gEggHatchData->CB2_state++; + break; + case 8: + if (EggHatchUpdateWindowText()) + { + Menu_DrawStdWindowFrame(22, 8, 27, 13); + InitYesNoMenu(22, 8, 4); + gEggHatchData->CB2_state++; + } + break; + case 9: + { + s8 menuInput; + if ((menuInput = Menu_ProcessInputNoWrap_()) != -2) + { + if (menuInput != -1 && menuInput != 1) + { + u16 species; + u8 gender; + u32 personality; + + GetMonNick(&gPlayerParty[gEggHatchData->eggPartyID], gStringVar3); + species = GetMonData(&gPlayerParty[gEggHatchData->eggPartyID], MON_DATA_SPECIES); + gender = GetMonGender(&gPlayerParty[gEggHatchData->eggPartyID]); + personality = GetMonData(&gPlayerParty[gEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0); + DoNamingScreen(3, gStringVar3, species, gender, personality, EggHatchSetMonNickname); + } + else + gEggHatchData->CB2_state++; + } + } + break; + case 10: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gEggHatchData->CB2_state++; + break; + case 11: + if (!gPaletteFade.active) + SetMainCallback2(c2_exit_to_overworld_2_switch); + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void SpriteCB_Egg_0(struct Sprite* sprite) +{ + if (++sprite->data[0] > 20) + { + sprite->callback = SpriteCB_Egg_1; + sprite->data[0] = 0; + } + else + { + sprite->data[1] = (sprite->data[1] + 20) & 0xFF; + sprite->pos2.x = Sin(sprite->data[1], 1); + if (sprite->data[0] == 15) + { + PlaySE(SE_BOWA); + StartSpriteAnim(sprite, 1); + CreateRandomEggShardSprite(); + } + } +} + +static void SpriteCB_Egg_1(struct Sprite* sprite) +{ + if (++sprite->data[2] > 30) + { + if (++sprite->data[0] > 20) + { + sprite->callback = SpriteCB_Egg_2; + sprite->data[0] = 0; + sprite->data[2] = 0; + } + else + { + sprite->data[1] = (sprite->data[1] + 20) & 0xFF; + sprite->pos2.x = Sin(sprite->data[1], 2); + if (sprite->data[0] == 15) + { + PlaySE(SE_BOWA); + StartSpriteAnim(sprite, 2); + } + } + } +} + +static void SpriteCB_Egg_2(struct Sprite* sprite) +{ + if (++sprite->data[2] > 30) + { + if (++sprite->data[0] > 38) + { + u16 species; + + sprite->callback = SpriteCB_Egg_3; + sprite->data[0] = 0; + species = GetMonData(&gPlayerParty[gEggHatchData->eggPartyID], MON_DATA_SPECIES); + gSprites[gEggHatchData->pokeSpriteID].pos2.x = 0; + gSprites[gEggHatchData->pokeSpriteID].pos2.y = gMonFrontPicCoords[species].y_offset; + } + else + { + sprite->data[1] = (sprite->data[1] + 20) & 0xFF; + sprite->pos2.x = Sin(sprite->data[1], 2); + if (sprite->data[0] == 15) + { + PlaySE(SE_BOWA); + StartSpriteAnim(sprite, 2); + CreateRandomEggShardSprite(); + CreateRandomEggShardSprite(); + } + if (sprite->data[0] == 30) + PlaySE(SE_BOWA); + } + } +} + +static void SpriteCB_Egg_3(struct Sprite* sprite) +{ + if (++sprite->data[0] > 50) + { + sprite->callback = SpriteCB_Egg_4; + sprite->data[0] = 0; + } +} + +static void SpriteCB_Egg_4(struct Sprite* sprite) +{ + s16 i; + if (sprite->data[0] == 0) + BeginNormalPaletteFade(-1, -1, 0, 0x10, 0xFFFF); + if (sprite->data[0] < 4u) + { + for (i = 0; i <= 3; i++) + CreateRandomEggShardSprite(); + } + sprite->data[0]++; + if (!gPaletteFade.active) + { + PlaySE(SE_TAMAGO); + sprite->invisible = 1; + sprite->callback = SpriteCB_Egg_5; + sprite->data[0] = 0; + } +} + +static void SpriteCB_Egg_5(struct Sprite* sprite) +{ + if (sprite->data[0] == 0) + { + gSprites[gEggHatchData->pokeSpriteID].invisible = 0; + StartSpriteAffineAnim(&gSprites[gEggHatchData->pokeSpriteID], 1); + } + if (sprite->data[0] == 8) + BeginNormalPaletteFade(-1, -1, 0x10, 0, 0xFFFF); + if (sprite->data[0] <= 9) + gSprites[gEggHatchData->pokeSpriteID].pos1.y -= 1; + if (sprite->data[0] > 40) + sprite->callback = SpriteCallbackDummy; + sprite->data[0]++; +} + +static void SpriteCB_EggShard(struct Sprite* sprite) +{ + sprite->data[4] += sprite->data[1]; + sprite->data[5] += sprite->data[2]; + + sprite->pos2.x = sprite->data[4] / 256; + sprite->pos2.y = sprite->data[5] / 256; + + sprite->data[2] += sprite->data[3]; + + if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data[2] > 0) + DestroySprite(sprite); +} + +// Converts a number to Q8.8 fixed-point format +#define Q_8_8(n) ((s16)((n) * 256)) + +static const s16 sEggShardVelocities[][2] = +{ + {Q_8_8(-1.5), Q_8_8(-3.75)}, + {Q_8_8(-5), Q_8_8(-3)}, + {Q_8_8(3.5), Q_8_8(-3)}, + {Q_8_8(-4), Q_8_8(-3.75)}, + {Q_8_8(2), Q_8_8(-1.5)}, + {Q_8_8(-0.5), Q_8_8(-6.75)}, + {Q_8_8(5), Q_8_8(-2.25)}, + {Q_8_8(-1.5), Q_8_8(-3.75)}, + {Q_8_8(4.5), Q_8_8(-1.5)}, + {Q_8_8(-1), Q_8_8(-6.75)}, + {Q_8_8(4), Q_8_8(-2.25)}, + {Q_8_8(-3.5), Q_8_8(-3.75)}, + {Q_8_8(1), Q_8_8(-1.5)}, + {Q_8_8(-3.515625), Q_8_8(-6.75)}, + {Q_8_8(4.5), Q_8_8(-2.25)}, + {Q_8_8(-0.5), Q_8_8(-7.5)}, + {Q_8_8(1), Q_8_8(-4.5)}, + {Q_8_8(-2.5), Q_8_8(-2.25)}, + {Q_8_8(2.5), Q_8_8(-7.5)}, +}; + +static void CreateRandomEggShardSprite(void) +{ + u16 spriteAnimIndex; + + s16 velocity1 = sEggShardVelocities[gEggHatchData->eggShardVelocityID][0]; + s16 velocity2 = sEggShardVelocities[gEggHatchData->eggShardVelocityID][1]; + gEggHatchData->eggShardVelocityID++; + spriteAnimIndex = Random() % 4; + CreateEggShardSprite(120, 60, velocity1, velocity2, 100, spriteAnimIndex); +} + +static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex) +{ + u8 spriteID = CreateSprite(&sSpriteTemplate_820A418, x, y, 4); + gSprites[spriteID].data[1] = data1; + gSprites[spriteID].data[2] = data2; + gSprites[spriteID].data[3] = data3; + StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex); +} + +static void EggHatchPrintMessage1(u8* src) +{ + Text_InitWindow8002EB0(&gEggHatchData->window, src, gEggHatchData->tileDataStartOffset, 3, 15); +} + +static void EggHatchPrintMessage2(u8* src) +{ + Text_InitWindowAndPrintText(&gEggHatchData->window, src, gEggHatchData->tileDataStartOffset, 3, 15); +} + +static bool8 EggHatchUpdateWindowText(void) +{ + return Text_UpdateWindow(&gEggHatchData->window); +} diff --git a/src/engine/blend_palette.c b/src/engine/blend_palette.c deleted file mode 100644 index 843c50ac1..000000000 --- a/src/engine/blend_palette.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "global.h" -#include "blend_palette.h" -#include "palette.h" - -void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) -{ - u16 i; - for (i = 0; i < numEntries; i++) - { - u16 index = i + palOffset; - struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; - s8 r = data1->r; - s8 g = data1->g; - s8 b = data1->b; - struct PlttData *data2 = (struct PlttData *)&blendColor; - gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0) - | ((g + (((data2->g - g) * coeff) >> 4)) << 5) - | ((b + (((data2->b - b) * coeff) >> 4)) << 10); - } -} diff --git a/src/engine/cable_car_util.c b/src/engine/cable_car_util.c deleted file mode 100644 index 02bfbc195..000000000 --- a/src/engine/cable_car_util.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "global.h" -#include "cable_car_util.h" - -// static types - -// static declarations - -// rodata - -// text - -void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height) -{ - u8 i; - u8 j; - u8 x; - u8 y; - - for (i = 0, y = top; i < height; i++) - { - for (x = left, j = 0; j < width; j++) - { - *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value; - x = (x + 1) % 32; - } - y = (y + 1) % 32; - } -} - -void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) -{ - u8 i; - u8 j; - u8 x; - u8 y; - const u16 *_src; - - for (i = 0, _src = src, y = top; i < height; i++) - { - for (x = left, j = 0; j < width; j++) - { - *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++; - x = (x + 1) % 32; - } - y = (y + 1) % 32; - } -} diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c deleted file mode 100644 index 0da23c5f3..000000000 --- a/src/engine/cable_club.c +++ /dev/null @@ -1,1033 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_records.h" -#include "cable_club.h" -#include "event_data.h" -#include "field_message_box.h" -#include "field_specials.h" -#include "field_weather.h" -#include "link.h" -#include "load_save.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "record_mixing.h" -#include "overworld.h" -#include "script.h" -#include "script_pokemon_80C4.h" -#include "constants/songs.h" -#include "sound.h" -#include "start_menu.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "trade.h" -#include "trainer_card.h" - -extern u16 gBattleTypeFlags; -extern const u8 gUnknown_081A4932[]; -extern const u8 gUnknown_081A4975[]; -extern const u8 gUnknown_081A49B6[]; -extern const u8 gUnknown_081A490C[]; -extern struct -{ - u8 field0; - u8 field1; -} gUnknown_020297D8; - -static void sub_8082F20(u8 taskId); -static void sub_8082F68(u8 taskId); -static void sub_8082FEC(u8 taskId); -static void sub_808303C(u8 taskId); -static void sub_80830E4(u8 taskId); -static void sub_8083188(u8 taskId); -static void sub_80831F8(u8 taskId); -static void sub_8083288(u8 taskId); -static void sub_8083314(u8 taskId); -static void sub_80833C4(u8 taskId); -static void sub_80833EC(u8 taskId); -static void sub_8083418(u8 taskId); -static bool8 sub_8083444(u8 taskId); -static void sub_808353C(u8 taskId); -static void sub_8083710(u8 taskId); -static void sub_8083760(u8 taskId); -static void sub_80837B4(u8 taskId); -static void sub_80837EC(u8 taskId); -static void sub_808382C(u8 taskId); -static void sub_8083958(void); -static void sub_80839DC(u8 taskId); -static void sub_8083AAC(u8 taskId); -static void sub_8083B44(u8 taskId); -static void sub_8083B6C(void); -static void sub_8083CA4(u8 taskId); -#if DEBUG -static u8 debug_sub_808B850(void); -#endif - -#ifdef GERMAN -const u8 TrainerCardColorName_Bronze[] = _("BRONZE"); -const u8 TrainerCardColorName_Copper[] = _("KUPFER"); -const u8 TrainerCardColorName_Silver[] = _("SILBER"); -const u8 TrainerCardColorName_Gold[] = _("GOLD"); -#else -const u8 TrainerCardColorName_Bronze[] = _("BRONZE"); -const u8 TrainerCardColorName_Copper[] = _("COPPER"); -const u8 TrainerCardColorName_Silver[] = _("SILVER"); -const u8 TrainerCardColorName_Gold[] = _("GOLD"); -#endif - -const u8 *const gTrainerCardColorNames[] = -{ - TrainerCardColorName_Bronze, - TrainerCardColorName_Copper, - TrainerCardColorName_Silver, - TrainerCardColorName_Gold, -}; - -#if DEBUG -u8 debug_sub_808A4D0(TaskFunc func) -{ - if (func == sub_8082F68) - return 1; - if (func == sub_8082FEC) - return 17; - if (func == sub_808303C) - return 18; - if (func == sub_8083188) - return 19; - if (func == sub_80830E4) - return 20; - if (func == sub_80831F8) - return 33; - if (func == sub_8083314) - return 2; - if (func == sub_80833C4) - return 3; - return 0; -} - -void debug_sub_808A55C(u8 taskId) -{ - s32 i; - - if (!gTasks[gTasks[taskId].data[0]].isActive) - { - if (gTasks[taskId].data[1] == 5) - DestroyTask(taskId); - gTasks[taskId].data[1]++; - } - - PrintHex(gShouldAdvanceLinkState, 2, 0, 2); - PrintHex((u8)gBlockSendBuffer[0], 22, 5, 4); - for (i = 0; i < 4; i++) - { - PrintHex(gLinkPlayerPending[i], 5 + i * 2, 0, 1); - PrintHex(gBlockRecvBuffer[i][0], 22, 6 + i, 4); - } - PrintHex(gLinkStatus, 15, 0, 8); - PrintHex(gLink.state, 2, 10, 2); - PrintHex(GetMultiplayerId(), 7, 12, 2); - PrintHex(GetBlockReceivedStatus(), 7, 10, 2); - PrintHex(gReceivedRemoteLinkPlayers, 2, 12, 1); - PrintHex(gSpecialVar_Result, 11, 8, 2); - PrintHex((gLinkStatus & 0x1C) >> 2, 11, 10, 2); - PrintHex(IsLinkConnectionEstablished(), 11, 12, 1); - PrintHex(IsLinkTaskFinished(), 15, 10, 1); - PrintHex(debug_sub_808A4D0(gTasks[gTasks[taskId].data[0]].func), 15, 12, 2); - PrintHex((uintptr_t)gLinkCallback, 2, 13, 8); - PrintHex(HasLinkErrorOccurred(), 2, 2, 1); - for (i = 0; i < 4; i++) - PrintHex(gLinkPlayers[i].linkType, 2 + i * 6, 3, 4); - PrintHex(REG_SIOCNT, 2, 6, 4); - PrintHex(debug_sub_808B850(), 25, 3, 1); -} -#endif - -static void sub_8082CD4(u8 arg0, u8 arg1) -{ -#if DEBUG - InitLinkTestBG_Unused(12, 0, 31, 2); -#endif - if (FindTaskIdByFunc(sub_8082F20) == 0xFF) - { - u8 taskId1; -#if DEBUG - u8 taskId2; -#endif - - taskId1 = CreateTask(sub_8082F20, 80); - gTasks[taskId1].data[1] = arg0; - gTasks[taskId1].data[2] = arg1; - -#if DEBUG - taskId2 = CreateTask(debug_sub_808A55C, 80); - gTasks[taskId2].data[0] = taskId1; -#endif - } -} - -static void sub_8082D18(u32 value) -{ - ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEFT_ALIGN, 1); - Menu_DrawStdWindowFrame(18, 10, 28, 13); - sub_8072BD8(gOtherText_PLink, 19, 11, 72); -} - -static void sub_8082D4C() -{ - Menu_EraseWindowRect(18, 10, 28, 13); -} - -static void sub_8082D60(u8 taskId, u8 arg1) -{ - s16 *data = &gTasks[taskId].data[3]; - - if (arg1 != *data) - { - if (arg1 <= 1) - sub_8082D4C(); - else - sub_8082D18(arg1); - *data = arg1; - } -} - -static u32 sub_8082D9C(u8 minPlayers, u8 maxPlayers) -{ - int playerCount; - - switch (GetLinkPlayerDataExchangeStatusTimed()) - { - case EXCHANGE_COMPLETE: - playerCount = GetLinkPlayerCount_2(); - if (minPlayers <= playerCount && playerCount <= maxPlayers) - return 1; - ConvertIntToDecimalStringN(gStringVar1, playerCount, STR_CONV_MODE_LEFT_ALIGN, 1); - return 4; - case EXCHANGE_TIMED_OUT: - return 0; - case EXCHANGE_IN_PROGRESS: - return 3; - default: - return 0; - } -} - -static bool32 sub_8082DF4(u8 taskId) -{ - if (HasLinkErrorOccurred() == TRUE) - { - gTasks[taskId].func = sub_8083418; - return TRUE; - } - return FALSE; -} - -static bool32 sub_8082E28(u8 taskId) -{ - if ((gMain.newKeys & B_BUTTON) - && IsLinkConnectionEstablished() == FALSE) - { - gTasks[taskId].func = sub_80833EC; - return TRUE; - } - return FALSE; -} - -static bool32 sub_8082E6C(u8 taskId) -{ - if (IsLinkConnectionEstablished()) - SetSuppressLinkErrorMessage(TRUE); - - if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].func = sub_80833EC; - return TRUE; - } - return FALSE; -} - -static bool32 sub_8082EB8(u8 taskId) -{ - if (GetSioMultiSI() == 1) - { - gTasks[taskId].func = sub_8083418; - return TRUE; - } - return FALSE; -} - -void unref_sub_8082EEC(u8 taskId) -{ - gTasks[taskId].data[0]++; - if (gTasks[taskId].data[0] == 10) - { - sub_8007E9C(2); - DestroyTask(taskId); - } -} - -static void sub_8082F20(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (data[0] == 0) - { - OpenLinkTimed(); - sub_80082EC(); - ResetLinkPlayers(); - } - else if (data[0] > 9) - { - gTasks[taskId].func = sub_8082F68; - } - data[0]++; -} - -static void sub_8082F68(u8 taskId) -{ - u32 playerCount = GetLinkPlayerCount_2(); - - if (sub_8082E28(taskId) == TRUE - || sub_8082E6C(taskId) == TRUE - || playerCount < 2) - return; - - SetSuppressLinkErrorMessage(TRUE); - gTasks[taskId].data[3] = 0; - if (IsLinkMaster() == TRUE) - { - PlaySE(SE_PIN); - ShowFieldAutoScrollMessage(gUnknown_081A4932); - gTasks[taskId].func = sub_8082FEC; - } - else - { - PlaySE(SE_BOO); - ShowFieldAutoScrollMessage(gUnknown_081A49B6); - gTasks[taskId].func = sub_80831F8; - } -} - -static void sub_8082FEC(u8 taskId) -{ - if (sub_8082E28(taskId) == TRUE - || sub_8082EB8(taskId) == TRUE - || sub_8082DF4(taskId) == TRUE) - return; - - if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN) - { - gTasks[taskId].data[3] = 0; - gTasks[taskId].func = sub_808303C; - } -} - -static void sub_808303C(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - s32 linkPlayerCount = GetLinkPlayerCount_2(); - - if (sub_8082E28(taskId) == TRUE - || sub_8082EB8(taskId) == TRUE - || sub_8082DF4(taskId) == TRUE) - return; - - sub_8082D60(taskId, linkPlayerCount); - - if (!(gMain.newKeys & A_BUTTON)) - return; - -#if ENGLISH - if (linkPlayerCount < taskData[1]) - return; - - sub_80081C8(linkPlayerCount); - sub_8082D4C(); - ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); - ShowFieldAutoScrollMessage((u8 *)gUnknown_081A4975); - gTasks[taskId].func = sub_80830E4; -#elif GERMAN - if ((gLinkType == 0x2255 && (u32)linkPlayerCount > 1) - || (gLinkType != 0x2255 && taskData[1] <= linkPlayerCount)) - { - sub_80081C8(linkPlayerCount); - sub_8082D4C(); - ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); - ShowFieldAutoScrollMessage((u8 *)gUnknown_081A4975); - gTasks[taskId].func = sub_80830E4; - } -#endif -} - -static void sub_80830E4(u8 taskId) -{ - if (sub_8082E28(taskId) == TRUE - || sub_8082EB8(taskId) == TRUE - || sub_8082DF4(taskId) == TRUE) - return; - - if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN) - { - if (sub_800820C() != GetLinkPlayerCount_2()) - { - ShowFieldAutoScrollMessage(gUnknown_081A4932); - gTasks[taskId].func = sub_8082FEC; - } - else if (gMain.heldKeys & B_BUTTON) - { - ShowFieldAutoScrollMessage(gUnknown_081A4932); - gTasks[taskId].func = sub_8082FEC; - } - else if (gMain.heldKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8007F4C(); - gTasks[taskId].func = sub_8083188; - } - } -} - -static void sub_8083188(u8 taskId) -{ - u8 local1 = gTasks[taskId].data[1]; - u8 local2 = gTasks[taskId].data[2]; - - if (sub_8082DF4(taskId) == TRUE - || sub_8083444(taskId) == TRUE) - return; - - if (GetLinkPlayerCount_2() != sub_800820C()) - { - gTasks[taskId].func = sub_8083418; - } - else - { - gSpecialVar_Result = sub_8082D9C(local1, local2); - if (gSpecialVar_Result != 0) - gTasks[taskId].func = sub_8083288; - } -} - -static void sub_80831F8(u8 taskId) -{ - u8 local1, local2; - - local1 = gTasks[taskId].data[1]; - local2 = gTasks[taskId].data[2]; - - if (sub_8082E28(taskId) == TRUE - || sub_8082DF4(taskId) == TRUE) - return; - -#if DEBUG - sub_8082D60(taskId, GetLinkPlayerCount_2()); -#endif - - gSpecialVar_Result = sub_8082D9C(local1, local2); - if (gSpecialVar_Result == 0) - return; - if (gSpecialVar_Result == 3) - { - sub_800832C(); - HideFieldMessageBox(); - gTasks[taskId].func = sub_80833C4; - } - else - { - gFieldLinkPlayerCount = GetLinkPlayerCount_2(); - gUnknown_03004860 = GetMultiplayerId(); - sub_80081C8(gFieldLinkPlayerCount); - TrainerCard_GenerateCardForPlayer((struct TrainerCard *)gBlockSendBuffer); - gTasks[taskId].func = sub_8083314; - } -} - -static void sub_8083288(u8 taskId) -{ - if (sub_8082DF4(taskId) == TRUE) - return; - - if (gSpecialVar_Result == 3) - { - sub_800832C(); - HideFieldMessageBox(); - gTasks[taskId].func = sub_80833C4; - } - else - { - gFieldLinkPlayerCount = GetLinkPlayerCount_2(); - gUnknown_03004860 = GetMultiplayerId(); - sub_80081C8(gFieldLinkPlayerCount); - TrainerCard_GenerateCardForPlayer((struct TrainerCard *)gBlockSendBuffer); - gTasks[taskId].func = sub_8083314; - sub_8007E9C(2); - } -} - -static void sub_8083314(u8 taskId) -{ - u8 index; - struct TrainerCard *trainerCards; - - if (sub_8082DF4(taskId) == TRUE) - return; - - if (GetBlockReceivedStatus() != sub_8008198()) - return; - - index = 0; - trainerCards = gTrainerCards; - for (index = 0; index < GetLinkPlayerCount(); index++) - { - void *src; - src = gBlockRecvBuffer[index]; - memcpy(&trainerCards[index], src, sizeof(struct TrainerCard)); - } - - SetSuppressLinkErrorMessage(FALSE); - ResetBlockReceivedFlags(); - HideFieldMessageBox(); - - if (gSpecialVar_Result == 1) - { -#if ENGLISH - u16 linkType; - linkType = gLinkType; - // FIXME: sub_8082D4C doesn't take any arguments - sub_8082D4C(0x4411, linkType); -#elif GERMAN - if (gLinkType != 0x4411) - { - if (gLinkType == 0x6601) - deUnkValue2 = 1; - } - sub_8082D4C(); -#endif - EnableBothScriptContexts(); - DestroyTask(taskId); - return; - } - - sub_800832C(); - gTasks[taskId].func = sub_80833C4; -} - -static void sub_80833C4(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers == FALSE) - { - sub_8082D4C(); - EnableBothScriptContexts(); - DestroyTask(taskId); - } -} - -static void sub_80833EC(u8 taskId) -{ - gSpecialVar_Result = 5; - sub_8082D4C(); - HideFieldMessageBox(); - EnableBothScriptContexts(); - DestroyTask(taskId); -} - -static void sub_8083418(u8 taskId) -{ - gSpecialVar_Result = 6; - sub_8082D4C(); - HideFieldMessageBox(); - EnableBothScriptContexts(); - DestroyTask(taskId); -} - -static bool8 sub_8083444(u8 taskId) -{ - gTasks[taskId].data[4]++; - if (gTasks[taskId].data[4] > 600) - { - gTasks[taskId].func = sub_8083418; - return TRUE; - } - - return FALSE; -} - -void sub_808347C(u8 arg0) -{ - u32 r3 = 2; - u32 r2 = 2; - - switch (gSpecialVar_0x8004) - { - case 1: - r3 = 2; - gLinkType = 0x2233; - break; - case 2: - r3 = 2; - gLinkType = 0x2244; - break; - case 5: - r3 = 4; - r2 = 4; - gLinkType = 0x2255; - break; - } - - sub_8082CD4(r3, r2); -} - -void sub_80834E4(void) -{ - gLinkType = 0x1133; - gBattleTypeFlags = 0; - sub_8082CD4(2, 2); -} - -void sub_808350C(void) -{ - gSpecialVar_Result = 0; - gLinkType = 0x3311; - gBattleTypeFlags = 0; - sub_8082CD4(2, 4); -} - -static void sub_808353C(u8 taskId) -{ - int playerCount; - int i; - - switch (gTasks[taskId].data[0]) - { - case 0: - if (gSpecialVar_Result == 1) - { - playerCount = GetLinkPlayerCount(); - for (i = 0; i < playerCount; i++) - { - if (gLinkPlayers[i].language == LANGUAGE_JAPANESE) - { - gSpecialVar_Result = 7; - sub_8008480(); - gTasks[taskId].data[0] = 1; - return; - } - } - } - EnableBothScriptContexts(); - DestroyTask(taskId); - break; - case 1: - if (gReceivedRemoteLinkPlayers == FALSE) - { - EnableBothScriptContexts(); - DestroyTask(taskId); - } - break; - } -} - -void sub_80835D8(void) -{ - int taskId = FindTaskIdByFunc(sub_808353C); - - if (taskId == 0xFF) - { - taskId = CreateTask(sub_808353C, 80); - gTasks[taskId].data[0] = 0; - } -} - -void sub_8083614(void) -{ - gLinkType = 0x4411; - gBattleTypeFlags = 0; - sub_8082CD4(2, 4); -} - -void sub_808363C(void) -{ - gLinkType = 0x6601; - gBattleTypeFlags = 0; - sub_8082CD4(4, 4); -} - -u8 sub_8083664(void) -{ - if (FuncIsActiveTask(sub_8083710) != FALSE) - return 0xFF; - - switch (gSpecialVar_0x8004) - { - case 1: - gLinkType = 0x2233; - break; - case 2: - gLinkType = 0x2244; - break; - case 5: - gLinkType = 0x2255; - break; - case 3: - gLinkType = 0x1111; - break; - case 4: - gLinkType = 0x3322; - break; - } - - return CreateTask(sub_8083710, 80); -} - -static void sub_8083710(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (data[0] == 0) - { - OpenLink(); - ResetLinkPlayers(); - CreateTask(sub_8083C50, 80); - } - else if (data[0] >= 10) - { - gTasks[taskId].func = sub_8083760; - } - data[0]++; -} - -static void sub_8083760(u8 taskId) -{ - if (GetLinkPlayerCount_2() >= 2) - { - if (IsLinkMaster() == TRUE) - gTasks[taskId].func = sub_80837B4; - else - gTasks[taskId].func = sub_80837EC; - } -} - -static void sub_80837B4(u8 taskId) -{ - if (sub_800820C() == GetLinkPlayerCount_2()) - { - sub_8007F4C(); - gTasks[taskId].func = sub_80837EC; - } -} - -static void sub_80837EC(u8 taskId) -{ - if (gReceivedRemoteLinkPlayers == TRUE - && IsLinkPlayerDataExchangeComplete() == TRUE) - { - sub_800826C(); - sub_8007B14(); - DestroyTask(taskId); - } -} - -void sub_8083820(void) -{ - ScrSpecial_DoSaveDialog(); -} - -static void sub_808382C(u8 taskId) -{ - struct Task* task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - FadeScreen(1, 0); - gLinkType = 0x2211; - ClearLinkCallback_2(); - task->data[0]++; - break; - case 1: - if (!gPaletteFade.active) - task->data[0]++; - break; - case 2: - task->data[1]++; - if (task->data[1] > 20) - task->data[0]++; - break; - case 3: - sub_800832C(); - task->data[0]++; - break; - case 4: - if (!gReceivedRemoteLinkPlayers) - task->data[0]++; - break; - case 5: - if (gLinkPlayers[0].trainerId & 1) - current_map_music_set__default_for_battle(BGM_BATTLE32); - else - current_map_music_set__default_for_battle(BGM_BATTLE20); - - switch (gSpecialVar_0x8004) - { - case 1: - gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK; - break; - case 2: - gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE; - break; - case 5: - ReducePlayerPartyToThree(); - gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI; - break; - } - - SetMainCallback2(sub_800E7C4); - gMain.savedCallback = sub_8083958; - DestroyTask(taskId); - break; - } -} - -static void sub_8083958(void) -{ - Overworld_ResetMapMusic(); - LoadPlayerParty(); - SavePlayerBag(); - sub_810FEFC(); - - if (gSpecialVar_0x8004 != 5) - UpdateLinkBattleRecords(gUnknown_03004860 ^ 1); - - gMain.savedCallback = sub_805465C; - SetMainCallback2(sub_8071B28); -} - -void sub_80839A4(void) -{ - if (gSpecialVar_0x8004 == 1 || gSpecialVar_0x8004 == 2 || gSpecialVar_0x8004 == 5) - { - LoadPlayerParty(); - SavePlayerBag(); - } - copy_saved_warp2_bank_and_enter_x_to_warp1(0x7F); -} - -void sub_80839D0(void) -{ - sub_805559C(); -} - -static void sub_80839DC(u8 taskId) -{ - struct Task* task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - ShowFieldMessage(gUnknown_081A490C); - task->data[0] = 1; - break; - case 1: - if (IsFieldMessageBoxHidden()) - { - sub_8055574(); - sub_8007270(gSpecialVar_0x8005); - task->data[0] = 2; - } - break; - case 2: - switch (sub_80554F8()) - { - case 0: - break; - case 1: - HideFieldMessageBox(); - task->data[0] = 0; - SwitchTaskToFollowupFunc(taskId); - break; - case 2: - task->data[0] = 3; - break; - } - break; - case 3: - sub_8055588(); - HideFieldMessageBox(); - Menu_EraseScreen(); - DestroyTask(taskId); - EnableBothScriptContexts(); - break; - } -} - -void sub_8083A84(TaskFunc followupFunc) -{ - u8 taskId = CreateTask(sub_80839DC, 80); - SetTaskFuncWithFollowupFunc(taskId, sub_80839DC, followupFunc); - ScriptContext1_Stop(); -} - -static void sub_8083AAC(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - ScriptContext2_Enable(); - FadeScreen(1, 0); - ClearLinkCallback_2(); - task->data[0]++; - break; - case 1: - if (!gPaletteFade.active) - task->data[0]++; - break; - case 2: - gUnknown_020297D8.field0 = 0; - gUnknown_020297D8.field1 = 0; - m4aMPlayAllStop(); - sub_800832C(); - task->data[0]++; - break; - case 3: - if (!gReceivedRemoteLinkPlayers) - { - SetMainCallback2(sub_8047CD8); - DestroyTask(taskId); - } - break; - } -} - -static void sub_8083B44(u8 taskId) -{ - sub_8083B6C(); - DestroyTask(taskId); -} - -void sub_8083B5C(void) -{ - sub_8083A84(sub_8083B44); -} - -static void sub_8083B6C(void) -{ - CreateTask(sub_8083AAC, 80); -} - -void sub_8083B80(void) -{ - sub_8083B6C(); - ScriptContext1_Stop(); -} - -void sub_8083B90(void) -{ - gLinkType = 0x2211; - sub_8083A84(sub_808382C); -} - -void unref_sub_8083BB0(void) -{ - u8 taskId = CreateTask(sub_80839DC, 80); - SetTaskFuncWithFollowupFunc(taskId, sub_80839DC, Task_RecordMixing_Main); - ScriptContext1_Stop(); -} - -void sub_8083BDC(void) -{ - TrainerCard_ShowLinkCard(gSpecialVar_0x8006, c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -bool32 sub_8083BF4(u8 linkPlayerIndex) -{ - u32 trainerCardColorIndex; - - gSpecialVar_0x8006 = linkPlayerIndex; - StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name); - - trainerCardColorIndex = sub_80934C4(linkPlayerIndex); - if (trainerCardColorIndex == 0) - return FALSE; - - StringCopy(gStringVar2, gTrainerCardColorNames[trainerCardColorIndex - 1]); - return TRUE; -} - -void sub_8083C50(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->data[0]++; - if (task->data[0] > 300) - { - CloseLink(); - SetMainCallback2(CB2_LinkError); - DestroyTask(taskId); - } - - if (gReceivedRemoteLinkPlayers) - DestroyTask(taskId); -} - -#if DEBUG -extern u16 unk_3004E94; -extern u32 unk_3004E98; - -static void debug_sub_808B7A8(u8); - -void debug_sub_808B778(void) -{ - if (!FuncIsActiveTask(debug_sub_808B7A8)) - CreateTask(debug_sub_808B7A8, 80); - unk_3004E98++; -} - -static void debug_sub_808B7A8(u8 taskId) -{ - gTasks[taskId].data[0]++; - if (gTasks[taskId].data[0] == 30) - { - gTasks[taskId].data[0] = 0; - unk_3004E94 |= 1; - } -} -#endif - -static void sub_8083CA4(u8 taskId) -{ - if (!gReceivedRemoteLinkPlayers) - { - EnableBothScriptContexts(); - DestroyTask(taskId); - } -} - -void unref_sub_8083CC8(u8 taskId) -{ - sub_800832C(); - gTasks[taskId].func = sub_8083CA4; -} - -#if DEBUG -EWRAM_DATA static u8 unk_2030220 = 0; - -void debug_sub_808B82C(void) -{ - unk_2030220 = 0; -} - -void debug_sub_808B838(u8 a) -{ - unk_2030220 |= 1 << a; -} - -static u8 debug_sub_808B850(void) -{ - return unk_2030220; -} -#endif diff --git a/src/engine/clear_save_data_menu.c b/src/engine/clear_save_data_menu.c deleted file mode 100644 index b6053715a..000000000 --- a/src/engine/clear_save_data_menu.c +++ /dev/null @@ -1,177 +0,0 @@ -#include "global.h" -#include "clear_save_data_menu.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "save.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "strings2.h" -#include "task.h" - -static void VBlankCB_ClearSaveDataScreen(void); -static void Task_InitMenu(u8); -static void Task_ProcessMenuInput(u8); -static void Task_ClearSaveData(u8); -static void CB2_ClearSaveDataScreen(void); -static void VBlankCB_InitClearSaveDataScreen(void); -static u8 InitClearSaveDataScreen(void); -static void CB2_SoftReset(void); - -void CB2_InitClearSaveDataScreen(void) -{ - if (InitClearSaveDataScreen()) - { - CreateTask(Task_InitMenu, 0); - } -} - -static void VBlankCB_ClearSaveDataScreen(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void Task_InitMenu(u8 taskId) -{ - ResetSpriteData(); - - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - - SetVBlankCallback(VBlankCB_ClearSaveDataScreen); - Menu_DrawStdWindowFrame(2, 14, 27, 19); - Menu_PrintText(gSystemText_ClearAllSaveDataPrompt, 3, 15); - - Menu_DrawStdWindowFrame(2, 1, 8, 6); - Menu_PrintItems(3, 2, 2, gMenuYesNoItems); - InitMenu(0, 3, 2, 2, 1, 5); - - gTasks[taskId].func = Task_ProcessMenuInput; -} - -static void Task_ProcessMenuInput(u8 taskId) -{ - switch (Menu_ProcessInputNoWrap_()) - { - case 0: - PlaySE(SE_SELECT); - sub_8071F40(gSystemText_ClearingData); - gTasks[taskId].func = Task_ClearSaveData; - break; - case -1: - case 1: - PlaySE(SE_SELECT); - DestroyTask(taskId); - SetMainCallback2(CB2_SoftReset); - break; - } - AnimateSprites(); - BuildOamBuffer(); -} - -static void Task_ClearSaveData(u8 taskId) -{ - Save_EraseAllData(); - DestroyTask(taskId); - SetMainCallback2(CB2_SoftReset); -} - -static void CB2_ClearSaveDataScreen(void) -{ - RunTasks(); - UpdatePaletteFade(); -} - -static void VBlankCB_InitClearSaveDataScreen(void) -{ - TransferPlttBuffer(); -} - -static u8 InitClearSaveDataScreen(void) -{ - u16 i; - u16 ime; - - switch (gMain.state) - { - case 0: - default: - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); - - ResetPaletteFade(); - - gPlttBufferUnfaded[0] = 0x7fff; - gPlttBufferFaded[0] = 0x7fff; - gPlttBufferUnfaded[1] = 0x3945; - gPlttBufferFaded[1] = 0x3945; - - for (i = 0; i < 0x10; i++) - ((u16 *)(VRAM + 0x20))[i] = 0x1111; - - for (i = 0; i < 0x500; i++) - ((u16 *)(VRAM + 0x3800))[i] = 0x0001; - - ResetTasks(); - ResetSpriteData(); - - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xffff); - - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - SetVBlankCallback(VBlankCB_InitClearSaveDataScreen); - - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG3_ON; - gMain.state = 1; - return 0; - case 1: - UpdatePaletteFade(); - if (gPaletteFade.active) - return 0; - SetMainCallback2(CB2_ClearSaveDataScreen); - return 1; - } -} - -static void CB2_SoftReset(void) -{ - switch (gMain.state) - { - case 0: - default: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xffff); - gMain.state = 1; - break; - case 1: - UpdatePaletteFade(); - if (gPaletteFade.active) - return; - DoSoftReset(); - break; - } -} diff --git a/src/engine/clock.c b/src/engine/clock.c deleted file mode 100644 index fceccdfcb..000000000 --- a/src/engine/clock.c +++ /dev/null @@ -1,88 +0,0 @@ -#include "global.h" -#include "clock.h" -#include "berry.h" -#include "dewford_trend.h" -#include "event_data.h" -#include "field_specials.h" -#include "field_weather.h" -#include "lottery_corner.h" -#include "main.h" -#include "overworld.h" -#include "rtc.h" -#include "time_events.h" -#include "tv.h" -#include "wallclock.h" - -static void UpdatePerDay(struct Time *time); -static void UpdatePerMinute(struct Time *time); -static void ReturnFromStartWallClock(void); - -void InitTimeBasedEvents(void) -{ - FlagSet(FLAG_SYS_CLOCK_SET); - RtcCalcLocalTime(); - gSaveBlock2.lastBerryTreeUpdate = gLocalTime; - VarSet(VAR_DAYS, gLocalTime.days); -} - -void DoTimeBasedEvents(void) -{ - if (FlagGet(FLAG_SYS_CLOCK_SET)) - { - RtcCalcLocalTime(); - UpdatePerDay(&gLocalTime); - UpdatePerMinute(&gLocalTime); - } -} - -static void UpdatePerDay(struct Time *time) -{ - u16 *varPtr = GetVarPointer(VAR_DAYS); - int days = *varPtr; - u16 newDays; - - if (days != time->days && days <= time->days) - { - newDays = time->days - days; - ClearDailyFlags(); - UpdateDewfordTrendPerDay(newDays); - UpdateTVShowsPerDay(newDays); - UpdateWeatherPerDay(newDays); - UpdatePartyPokerusTime(newDays); - UpdateMirageRnd(newDays); - UpdateBirchState(newDays); - SetShoalItemFlag(newDays); - SetRandomLotteryNumber(newDays); - *varPtr = time->days; - } -} - -static void UpdatePerMinute(struct Time *time) -{ - struct Time newTime; - s32 minutesPassed; - - CalcTimeDifference(&newTime, &gSaveBlock2.lastBerryTreeUpdate, time); - minutesPassed = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes; - - if (minutesPassed == 0) // do not do the update for the first minute. - return; - - if (minutesPassed > -1) // do not perform an update on invalid minutesPassed. - { - BerryTreeTimeUpdate(minutesPassed); - gSaveBlock2.lastBerryTreeUpdate = *time; - } -} - -static void ReturnFromStartWallClock(void) -{ - InitTimeBasedEvents(); - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void StartWallClock(void) -{ - SetMainCallback2(CB2_StartWallClock); - gMain.savedCallback = ReturnFromStartWallClock; -} diff --git a/src/engine/decompress.c b/src/engine/decompress.c deleted file mode 100644 index 69edf01aa..000000000 --- a/src/engine/decompress.c +++ /dev/null @@ -1,113 +0,0 @@ -#include "global.h" -#include "decompress.h" -#include "data2.h" -#include "constants/species.h" -#include "text.h" -#include "ewram.h" - -#define WRAM ewram_addr // using gSharedMem doesn't match - -void LZDecompressWram(const void *src, void *dest) -{ - LZ77UnCompWram(src, dest); -} - -void LZDecompressVram(const void *src, void *dest) -{ - LZ77UnCompVram(src, dest); -} - -void LoadCompressedObjectPic(const struct CompressedSpriteSheet *src) -{ - struct SpriteSheet dest; - - LZ77UnCompWram(src->data, (void *)WRAM); - dest.data = (void *)WRAM; - dest.size = src->size; - dest.tag = src->tag; - LoadSpriteSheet(&dest); -} - -void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) -{ - struct SpriteSheet dest; - - LZ77UnCompWram(src->data, buffer); - dest.data = buffer; - dest.size = src->size; - dest.tag = src->tag; - LoadSpriteSheet(&dest); -} - -void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src) -{ - struct SpritePalette dest; - - LZ77UnCompWram(src->data, (void *)WRAM); - dest.data = (void *)WRAM; - dest.tag = src->tag; - LoadSpritePalette(&dest); -} - -void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer) -{ - struct SpritePalette dest; - - LZ77UnCompWram(a->data, buffer); - dest.data = buffer; - dest.tag = a->tag; - LoadSpritePalette(&dest); -} - -void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, u8 b, u8 c, void *d, void *buffer, s32 species) -{ - if (species > SPECIES_EGG) - LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); - else - LZ77UnCompWram(src->data, buffer); -} - -void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g) -{ - u32 frontOrBack; - - // gUnknown_081FAF4C appears to be a list of pointers to locations to store poke pics for back and front pic here. the first and third pointers are used for back while the others are used for front. - if (dest == gUnknown_081FAF4C[0] || dest == gUnknown_081FAF4C[2]) - frontOrBack = 0; // backPic - else - frontOrBack = 1; // frontPic - - LoadSpecialPokePic(src, b, c, d, dest, species, g, frontOrBack); -} - -void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g, u32 frontOrBack) -{ - u8 frontOrBack8 = frontOrBack; - - if (species == SPECIES_UNOWN) - { - u16 i = (((g & 0x3000000) >> 18) | ((g & 0x30000) >> 12) | ((g & 0x300) >> 6) | (g & 3)) % 0x1C; - - // The other Unowns are separate from Unown A. - if (i == 0) - i = SPECIES_UNOWN; - else - i += SPECIES_UNOWN_B - 1; - - if (frontOrBack8 == 0) - LZ77UnCompWram(gMonBackPicTable[i].data, dest); - else - LZ77UnCompWram(gMonFrontPicTable[i].data, dest); - } - else if (species > SPECIES_EGG) // is species unknown? draw the ? icon - LZ77UnCompWram(gMonFrontPicTable[0].data, dest); - else - LZ77UnCompWram(src->data, dest); - - DrawSpindaSpots(species, g, dest, frontOrBack8); -} - -void Unused_LZDecompressWramIndirect(const void **src, void *dest) -{ - LZ77UnCompWram(*src, dest); -} diff --git a/src/engine/link.c b/src/engine/link.c deleted file mode 100644 index 45807830a..000000000 --- a/src/engine/link.c +++ /dev/null @@ -1,1888 +0,0 @@ -#include "global.h" -#include "cable_club.h" -#include "link.h" -#include "battle.h" -#include "berry.h" -#include "hall_of_fame.h" -#include "item_use.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "random.h" -#include "save.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "ewram.h" - -#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) - -struct BlockTransfer -{ - u16 pos; - u16 size; - void *src; - bool8 active; - u8 multiplayerId; -}; - -struct LinkTestBGInfo -{ - u32 screenBaseBlock; - u32 paletteNum; - u32 dummy_8; - u32 dummy_C; -}; - -extern u16 gBattleTypeFlags; - -extern u16 word_3004858; - -extern void Blender_SetBankBerryData(u8 bank, u16 itemID); - -static void InitLinkTestBG(u8, u8, u8, u8); -void LinkTestScreen(); -static void InitLocalLinkPlayer(void); -static void VBlankCB_LinkTest(void); -static void InitLink(void); -static void Task_TriggerHandshake(u8); -static void TestBlockTransfer(u32, u32, u32); -static void LinkTestProcessKeyInput(void); -static void CB2_LinkTest(void); -static void HandleReceiveRemoteLinkPlayer(u8); -static void ProcessRecvCmds(u8); -static void BuildSendCmd(u16); -static void sub_8007B44(void); -static void ResetBlockSend(void); -static bool8 InitBlockSend(void *, u32); -static void LinkCB_BlockSendBegin(void); -static void LinkCB_BlockSend(void); -static void LinkCB_BlockSendEnd(void); -static void sub_8007E04(void); -u32 sub_8007E40(void); -static void SetBlockReceivedFlag(u8); -static u16 LinkTestCalcBlockChecksum(void *, u16); -static void PrintHexDigit(u8, u8, u8); -static void LinkCB_RequestPlayerDataExchange(void); -static void Task_PrintTestData(u8); -bool8 sub_8008224(void); -u8 GetDummy2(void); -static void sub_8008350(void); -static void sub_800837C(void); -static void sub_80083E0(void); -static void sub_8008454(void); -static void sub_80084C8(void); -static void sub_80084F4(void); - -static void CheckErrorStatus(void); -void CB2_PrintErrorMessage(void); -static u8 IsSioMultiMaster(void); -static void DisableSerial(void); -static void EnableSerial(void); -static void CheckMasterOrSlave(void); -static void InitTimer(void); -static void EnqueueSendCmd(u16 *); -static void DequeueRecvCmds(u16[CMD_LENGTH][MAX_LINK_PLAYERS]); -static void StartTransfer(void); -static bool8 DoHandshake(void); -static void DoRecv(void); -static void DoSend(void); -static void StopTimer(void); -static void SendRecvDone(void); -void ResetSendBuffer(void); -void ResetRecvBuffer(void); - -static struct BlockTransfer sBlockSend; -static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; -static u32 sBlockSendDelayCounter; -static u32 sDummy1; -static u8 sDummy2; -static u32 sPlayerDataExchangeStatus; -static u32 sErrorLinkStatus; -static u32 sErrorLastRecvQueueCount; -static u32 sErrorLastSendQueueCount; -static u32 sDummy3; -static u8 sLinkTestLastBlockSendPos; -static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; -static u8 sNumVBlanksWithoutSerialIntr; -static bool8 sSendBufferEmpty; -static u16 sSendNonzeroCheck; -static u16 sRecvNonzeroCheck; -static u8 sChecksumAvailable; -static u8 sHandshakePlayerCount; - -u16 word_3002910[MAX_LINK_PLAYERS]; -u32 gLinkDebugValue1; -struct LinkPlayerBlock localLinkPlayerBlock; -bool8 gLinkErrorOccurred; -u32 gLinkDebugValue2; -bool8 gLinkPlayerPending[MAX_LINK_PLAYERS]; -struct LinkPlayer gLinkPlayers[MAX_LINK_PLAYERS]; -bool8 gBlockReceived[MAX_LINK_PLAYERS]; -u16 gLinkHeldKeys; -u16 gLinkTimeOutCounter; -struct LinkPlayer localLinkPlayer; -u16 gRecvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]; -u32 gLinkStatus; -bool8 gLinkDummyBool; -u8 byte_3002A68; -u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE]; -bool8 u8_array_3002B70[MAX_LINK_PLAYERS]; -u16 gLinkType; -bool8 u8_array_3002B78[MAX_LINK_PLAYERS]; -u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; -bool8 gSuppressLinkErrorMessage; -u8 gSavedLinkPlayerCount; -u16 gSendCmd[CMD_LENGTH]; -u8 gSavedMultiplayerId; -bool8 gReceivedRemoteLinkPlayers; -struct LinkTestBGInfo gLinkTestBGInfo; -void (*gLinkCallback)(void); -struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS]; -u8 gShouldAdvanceLinkState; -u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; -#if DEBUG -u8 gUnknown_Debug_30030E0; -#endif -u8 gBlockRequestType; -u8 gLastSendQueueCount; -struct Link gLink; -u8 gLastRecvQueueCount; -u16 gLinkSavedIme; - -#ifdef GERMAN -u8 deUnkValue1; -u8 deUnkValue2; -#endif - -EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = 0; -EWRAM_DATA bool8 gLinkTestDummyBool = 0; -EWRAM_DATA u32 gFiller_20238B8 = 0; -EWRAM_DATA u32 dword_20238BC = 0; -EWRAM_DATA bool8 gLinkOpen = 0; - -static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); -static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp"); - -static const u8 sDebugMessages[7][12] = -{ - _("せつぞく ちゅうです"), - _("せつぞく できません"), - _("かくにん ちゅうです"), - _("かくにん できました"), - _("かくにん できません"), - _("かくにん を かくにん"), - _("かくにん は しっぱい"), -}; - -static const u8 sColorCodes[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE2}"); - -const struct BlockRequest sBlockRequestLookupTable[5] = -{ - {gBlockSendBuffer, 200}, - {gBlockSendBuffer, 200}, - {gBlockSendBuffer, 100}, - {gBlockSendBuffer, 220}, - {gBlockSendBuffer, 40}, -}; - -static const u8 sTestString[] = _("テストな"); - -const u8 sMagic[] = "GameFreak inc."; - -const u8 sEmptyString[] = _(" "); - -void Task_DestroySelf(u8 taskId) -{ - DestroyTask(taskId); -} - -static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) -{ - LoadPalette(sLinkTestDigitPalette, 16 * paletteNum, 32); - DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220); - - gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; - gLinkTestBGInfo.paletteNum = paletteNum; - - switch (bgNum) - { - case 1: - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); - break; - case 2: - REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); - break; - case 3: - REG_BG3CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); - break; - } -} - -void InitLinkTestBG_Unused(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) -{ - LoadPalette(sLinkTestDigitPalette, 16 * paletteNum, 32); - DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220); - - gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; - gLinkTestBGInfo.paletteNum = paletteNum; - - *gBGControlRegs[bgNum] = (screenBaseBlock << 8) | (charBaseBlock << 2); -} - -void LinkTestScreen(void) -{ - s32 i; - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - SetVBlankCallback(VBlankCB_LinkTest); - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); - ResetBlockSend(); - gLinkType = 0x1111; - OpenLink(); - SeedRng(gMain.vblankCounter1); - - for (i = 0; i < 4; i++) - { - // Very weird code, but nothing else seems to match. - // The following would have the same effect: - // gSaveBlock2.playerTrainerId[i] = Random(); - u8 *trainerId = gSaveBlock2.playerTrainerId; - s32 r; - s32 mask = 0xFF; - trainerId[i] = (r = Random()) & mask; - } - - InitLinkTestBG(0, 2, 4, 0); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_1D_MAP; - CreateTask(Task_DestroySelf, 0); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - sDummy3 = 0; - InitLocalLinkPlayer(); - CreateTask(Task_PrintTestData, 0); - SetMainCallback2(CB2_LinkTest); -} - -void sub_8007270(u8 a1) -{ - localLinkPlayer.lp_field_18 = a1; -} - -static void InitLocalLinkPlayer(void) -{ - s32 i; - - localLinkPlayer.trainerId = gSaveBlock2.playerTrainerId[0] - | (gSaveBlock2.playerTrainerId[1] << 8) - | (gSaveBlock2.playerTrainerId[2] << 16) - | (gSaveBlock2.playerTrainerId[3] << 24); - - for (i = 0; i < (s32)sizeof(localLinkPlayer.name); i++) - localLinkPlayer.name[i] = gSaveBlock2.playerName[i]; // UB: reads past the end of "playerName" array - - localLinkPlayer.gender = gSaveBlock2.playerGender; - localLinkPlayer.linkType = gLinkType; - localLinkPlayer.language = gGameLanguage; - localLinkPlayer.version = gGameVersion + 0x4000; - localLinkPlayer.lp_field_2 = 0; -} - -static void VBlankCB_LinkTest(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void InitLink(void) -{ - s32 i; - - for (i = 0; i < CMD_LENGTH; i++) - gSendCmd[i] = 0xEFFF; - - gLinkOpen = TRUE; - EnableSerial(); -} - -static void Task_TriggerHandshake(u8 taskId) -{ - gTasks[taskId].data[0]++; - - if (gTasks[taskId].data[0] == 5) - { - gShouldAdvanceLinkState = 1; - DestroyTask(taskId); - } -} - -void OpenLink(void) -{ - s32 i; - - ResetSerial(); - InitLink(); - - gLinkCallback = LinkCB_RequestPlayerDataExchange; - gLinkVSyncDisabled = FALSE; - gLinkErrorOccurred = FALSE; - gSuppressLinkErrorMessage = FALSE; - - ResetBlockReceivedFlags(); - - sDummy1 = 0; - byte_3002A68 = 0; - gLinkDummyBool = FALSE; - gReceivedRemoteLinkPlayers = FALSE; - - for (i = 0; i < 4; i++) - { - gLinkPlayerPending[i] = TRUE; - u8_array_3002B78[i] = 0; - u8_array_3002B70[i] = 0; - } - - CreateTask(Task_TriggerHandshake, 2); -} - -void CloseLink(void) -{ - gReceivedRemoteLinkPlayers = FALSE; - gLinkOpen = FALSE; - DisableSerial(); -} - -static void TestBlockTransfer(u32 a1, u32 a2, u32 a3) -{ - u8 i; - u8 val; - - if (sLinkTestLastBlockSendPos != sBlockSend.pos) - { - PrintHex(sBlockSend.pos, 2, 3, 2); - sLinkTestLastBlockSendPos = sBlockSend.pos; - } - - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) - { - PrintHex(sBlockRecv[i].pos, 2, i + 4, 2); - sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos; - } - } - - val = GetBlockReceivedStatus(); - - if (val == 0xF) - { - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - if ((val >> i) & 1) - { - gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(&gBlockRecvBuffer[i], sBlockRecv[i].size); - ResetBlockReceivedFlag(i); - if (gLinkTestBlockChecksums[i] != 834) - { - gLinkTestDebugValuesEnabled = FALSE; - gLinkTestDummyBool = FALSE; - } - } - } - } -} - -static void LinkTestProcessKeyInput(void) -{ - if (gMain.newKeys & A_BUTTON) - gShouldAdvanceLinkState = 1; - if (gMain.heldKeys & B_BUTTON) - InitBlockSend(ewram4000, 0x2004); - if (gMain.newKeys & L_BUTTON) - BeginNormalPaletteFade(-1, 0, 0x10, 0, 2); - if (gMain.newKeys & START_BUTTON) - SetSuppressLinkErrorMessage(TRUE); - if (gMain.newKeys & R_BUTTON) - Save_WriteData(SAVE_LINK); - if (gMain.newKeys & SELECT_BUTTON) - sub_800832C(); - if (gLinkTestDebugValuesEnabled) - { - u32 vblankCounter1 = gMain.vblankCounter1; - u8 val = gLinkVSyncDisabled; - if (!gLinkCallback) - val = gLinkVSyncDisabled | 0x10; - SetLinkDebugValues(vblankCounter1, val); - } -} - -static void CB2_LinkTest(void) -{ - LinkTestProcessKeyInput(); - TestBlockTransfer(1, 1, 0); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -u16 LinkMain2(u16 *heldKeys) -{ - u8 i; - - if (!gLinkOpen) - return 0; - - for (i = 0; i < CMD_LENGTH; i++) - gSendCmd[i] = 0; - - gLinkHeldKeys = *heldKeys; - - if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED) - { - ProcessRecvCmds(SIO_MULTI_CNT->id); - if (gLinkCallback) - gLinkCallback(); - CheckErrorStatus(); - } - - return gLinkStatus; -} - -static void HandleReceiveRemoteLinkPlayer(u8 multiplayerId) -{ - u32 pendingLinkPlayerCount = 0; - s32 i; - - gLinkPlayerPending[multiplayerId] = FALSE; - - for (i = 0; i < GetLinkPlayerCount_2(); i++) - pendingLinkPlayerCount += gLinkPlayerPending[i]; - - if (pendingLinkPlayerCount == 0 && !gReceivedRemoteLinkPlayers) - gReceivedRemoteLinkPlayers = TRUE; -} - -static void ProcessRecvCmds(u8 unusedParam) -{ - u16 i; - for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - word_3002910[i] = 0; - if (!gRecvCmds[0][i]) - continue; - switch (gRecvCmds[0][i]) - { - case 0x2222: - InitLocalLinkPlayer(); - localLinkPlayerBlock.linkPlayer = localLinkPlayer; - memcpy(localLinkPlayerBlock.magic1, sMagic, sizeof(localLinkPlayerBlock.magic1) - 1); - memcpy(localLinkPlayerBlock.magic2, sMagic, sizeof(localLinkPlayerBlock.magic2) - 1); - InitBlockSend(&localLinkPlayerBlock, sizeof(localLinkPlayerBlock)); - break; - case 0x4444: - word_3002910[i] = gRecvCmds[1][i]; - break; - case 0x5555: - byte_3002A68 = 1; - break; - case 0x5566: - byte_3002A68 = 1; - break; - case 0xBBBB: - { - struct BlockTransfer *blockRecv = &sBlockRecv[i]; - blockRecv->pos = 0; - blockRecv->size = gRecvCmds[1][i]; - blockRecv->multiplayerId = gRecvCmds[2][i]; - break; - } - case 0x8888: - if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE) - { - u16 *buffer = (u16 *)gSharedMem; - u16 j; - for (j = 0; j < CMD_LENGTH - 1; j++) - buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i]; - } - else - { - u16 j; - for (j = 0; j < CMD_LENGTH - 1; j++) - gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i]; - } - - sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2; - - if (sBlockRecv[i].pos >= sBlockRecv[i].size) - { - if (gLinkPlayerPending[i] == TRUE) - { - struct LinkPlayerBlock *block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i]; - struct LinkPlayer *linkPlayer = &gLinkPlayers[i]; - *linkPlayer = block->linkPlayer; - - if (strcmp(block->magic1, sMagic) - || strcmp(block->magic2, sMagic)) - { - SetMainCallback2(CB2_LinkError); - } - else - { - HandleReceiveRemoteLinkPlayer(i); - } - - ConvertInternationalString(gLinkPlayers[i].name, gLinkPlayers[i].language); - } - else - { - SetBlockReceivedFlag(i); -#if DEBUG - debug_sub_808B838(i); -#endif - } - } - break; - case 0x5FFF: - u8_array_3002B78[i] = 1; - break; - case 0x2FFE: - u8_array_3002B70[i] = 1; - break; - case 0xAAAA: - sub_8007E24(); - break; - case 0xAAAB: - Blender_SetBankBerryData(i, gRecvCmds[1][i]); - break; - case 0xCCCC: -#if defined(ENGLISH) - SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); -#elif defined(GERMAN) - if (deUnkValue2 == 1) - { - deUnkValue2 = 2; - deUnkValue1 = gRecvCmds[1][i]; - } - else if (deUnkValue2 == 2 || deUnkValue2 == 3) - { - SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); - - if (deUnkValue2 == 2) - deUnkValue2 = 1; - else - deUnkValue2 = 0; - } - else - { - SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); - } -#endif - break; - case 0xCAFE: - word_3002910[i] = gRecvCmds[1][i]; - break; - } - } -} - -static void BuildSendCmd(u16 code) -{ - switch (code) - { - case 0x2222: - gSendCmd[0] = 0x2222; - gSendCmd[1] = gLinkType; - break; - case 0x2FFE: - gSendCmd[0] = 0x2FFE; - break; - case 0x4444: - gSendCmd[0] = 0x4444; - gSendCmd[1] = gMain.heldKeys; - break; - case 0x5555: - gSendCmd[0] = 0x5555; - break; - case 0x5566: - gSendCmd[0] = 0x5566; - break; - case 0x6666: - gSendCmd[0] = 0x6666; - gSendCmd[1] = 0; - break; - case 0x7777: - { - u8 i; - - gSendCmd[0] = 0x7777; - - for (i = 0; i < 5; i++) - gSendCmd[i + 1] = 0xEE; - - break; - } - case 0xBBBB: - gSendCmd[0] = 0xBBBB; - gSendCmd[1] = sBlockSend.size; - gSendCmd[2] = sBlockSend.multiplayerId + 128; - break; - case 0xAAAA: - gSendCmd[0] = 0xAAAA; - break; - case 0xAAAB: - gSendCmd[0] = 0xAAAB; - gSendCmd[1] = gSpecialVar_ItemId; - break; - case 0xCCCC: - gSendCmd[0] = 0xCCCC; - gSendCmd[1] = gBlockRequestType; - break; - case 0x5FFF: - gSendCmd[0] = 0x5FFF; - break; - case 0xCAFE: - if (!word_3004858 || gLinkTransferringData) - break; - gSendCmd[0] = 0xCAFE; - gSendCmd[1] = word_3004858; - break; - } -} - -void sub_8007B14(void) -{ - gLinkCallback = sub_8007B44; -} - -bool32 sub_8007B24(void) -{ - if (gLinkCallback == sub_8007B44) - return TRUE; - else - return FALSE; -} - -static void sub_8007B44(void) -{ - if (gReceivedRemoteLinkPlayers == TRUE) - BuildSendCmd(0xCAFE); -} - -void ClearLinkCallback(void) -{ - gLinkCallback = NULL; -} - -void ClearLinkCallback_2(void) -{ - gLinkCallback = NULL; -} - -u8 GetLinkPlayerCount(void) -{ - return EXTRACT_PLAYER_COUNT(gLinkStatus); -} - -void OpenLinkTimed(void) -{ - sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED; - gLinkTimeOutCounter = 0; -#if defined(GERMAN) - ResetBlockSend(); -#endif - OpenLink(); -} - -u8 GetLinkPlayerDataExchangeStatusTimed(void) -{ - s32 i; - s32 count = 0; - u32 index; - - if (gReceivedRemoteLinkPlayers == TRUE) - { - if (GetLinkPlayerCount() == 0) - { - gLinkErrorOccurred = TRUE; - CloseLink(); - } - - i = 0; - index = 0; - - while (i < GetLinkPlayerCount()) - { - if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType) - ++count; - ++index; - ++i; - } - - if (count == GetLinkPlayerCount()) - sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; - else - sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; - } - else - { - gLinkTimeOutCounter++; - if (gLinkTimeOutCounter > 600) - sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT; - } - - return sPlayerDataExchangeStatus; -} - -bool8 IsLinkPlayerDataExchangeComplete(void) -{ - u8 i; - u8 count = 0; - u8 isComplete; - - for (i = 0; i < GetLinkPlayerCount(); i++) - if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType) - count++; - - if (count == GetLinkPlayerCount()) - { - isComplete = TRUE; - sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; - } - else - { - isComplete = FALSE; - sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; - } - - return isComplete; -} - -u32 GetLinkPlayerTrainerId(u8 multiplayerId) -{ - return gLinkPlayers[multiplayerId].trainerId; -} - -void ResetLinkPlayers(void) -{ - s32 i; - for (i = 0; i < 4; i++) - memset(&gLinkPlayers[i], 0, sizeof(struct LinkPlayer)); -} - -static void ResetBlockSend(void) -{ - sBlockSend.active = FALSE; - sBlockSend.pos = 0; - sBlockSend.size = 0; - sBlockSend.src = NULL; -} - -static bool8 InitBlockSend(void *data, u32 size) -{ - if (sBlockSend.active) - { - return FALSE; - } - else - { - sBlockSend.multiplayerId = GetMultiplayerId(); - sBlockSend.active = TRUE; - sBlockSend.size = size; - sBlockSend.pos = 0; - - if (size > BLOCK_BUFFER_SIZE) - { - sBlockSend.src = data; - } - else - { - if (data != gBlockSendBuffer) - memcpy(gBlockSendBuffer, data, size); - sBlockSend.src = gBlockSendBuffer; - } - - BuildSendCmd(0xBBBB); - gLinkCallback = LinkCB_BlockSendBegin; - sBlockSendDelayCounter = 0; - return TRUE; - } -} - -static void LinkCB_BlockSendBegin(void) -{ - sBlockSendDelayCounter++; - if (sBlockSendDelayCounter > 2) - gLinkCallback = LinkCB_BlockSend; -} - -static void LinkCB_BlockSend(void) -{ - s32 i; - u8 *buffer = sBlockSend.src; - - gSendCmd[0] = 0x8888; - - for (i = 0; i < CMD_LENGTH - 1; i++) - { - s32 offset = sBlockSend.pos + 2 * i; - gSendCmd[i + 1] = (buffer[offset + 1] << 8) | buffer[offset]; - } - - sBlockSend.pos += (CMD_LENGTH - 1) * 2; - - if (sBlockSend.size <= sBlockSend.pos) - { - sBlockSend.active = FALSE; - gLinkCallback = LinkCB_BlockSendEnd; - } -} - -static void LinkCB_BlockSendEnd(void) -{ - gLinkCallback = NULL; -} - -static void sub_8007E04(void) -{ - GetMultiplayerId(); // whats the point of calling this if you dont use the multiplayer ID? - BuildSendCmd(0x4444); - dword_20238BC++; -} - -void sub_8007E24(void) -{ - dword_20238BC = 0; - gLinkCallback = sub_8007E04; -} - -u32 sub_8007E40(void) -{ - return dword_20238BC; -} - -void sub_8007E4C(void) -{ - BuildSendCmd(0xAAAA); -} - -u8 GetMultiplayerId(void) -{ - return SIO_MULTI_CNT->id; -} - -u8 bitmask_all_link_players_but_self(void) -{ - return ((1 << GetMultiplayerId()) ^ 0xF); -} - -bool8 SendBlock(u8 a1, void *a2, u16 a3) -{ - return InitBlockSend(a2, a3); -} - -bool8 sub_8007E9C(u8 a1) -{ - if (!gLinkCallback) - { - gBlockRequestType = a1; - BuildSendCmd(0xCCCC); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 IsLinkTaskFinished(void) -{ - return gLinkCallback == NULL; -} - -u8 GetBlockReceivedStatus(void) -{ - return (gBlockReceived[3] << 3) - | (gBlockReceived[2] << 2) - | (gBlockReceived[1] << 1) - | gBlockReceived[0]; -} - -static void SetBlockReceivedFlag(u8 multiplayerId) -{ - gBlockReceived[multiplayerId] = TRUE; -} - -void ResetBlockReceivedFlags(void) -{ - s32 i; - for (i = 0; i < 4; i++) - gBlockReceived[i] = FALSE; -} - -void ResetBlockReceivedFlag(u8 multiplayerId) -{ - if (gBlockReceived[multiplayerId]) - gBlockReceived[multiplayerId] = FALSE; -} - -void sub_8007F4C(void) -{ - if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1) - gShouldAdvanceLinkState = 1; -} - -static u16 LinkTestCalcBlockChecksum(void *data, u16 size) -{ - u16 sum = 0; - u16 i; - - for (i = 0; i < size / 2; i++) - sum += ((u16 *)data)[i]; - - return sum; -} - -static void PrintHexDigit(u8 tileNum, u8 x, u8 y) -{ - u16 *tilemap = BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); - tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1); -} - -void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) -{ - u8 buffer[16]; - s32 i; - - for (i = 0; i < maxDigits; i++) - { - buffer[i] = num & 0xF; - num >>= 4; - } - - for (i = maxDigits - 1; i >= 0; i--) - { - PrintHexDigit(buffer[i], x, y); - x++; - } -} - -#if DEBUG - -EWRAM_DATA uintptr_t debugCharacterBase = 0; -EWRAM_DATA uintptr_t unk_20238C8 = 0; -EWRAM_DATA u16 *debugTileMap = NULL; -EWRAM_DATA u32 unk_20238D0 = 0; - -void debug_sub_8008218(u16 *buffer, u32 arg1, u16 *arg2, u32 arg3) -{ - CpuSet(sLinkTestDigitTiles, buffer, 272); - debugCharacterBase = (uintptr_t)buffer; - unk_20238C8 = (uintptr_t)arg1; - debugTileMap = arg2; - unk_20238D0 = arg3; -} - -void debug_sub_8008264(u32 value, int left, int top, int d, int e) -{ - s32 i; - u32 buffer[8]; - - if (unk_20238D0 == e) - { - u32 *ptr; - u16 *tilemapDest; - - if (d > 8) - d = 8; - ptr = buffer; - for (i = 0; i < d; i++) - { - *ptr++ = value & 0xF; - value >>= 4; - } - - tilemapDest = (u16 *)debugTileMap + top * 0x20 + left; - ptr = buffer + d - 1; - for (i = 0; i < d; i++) - { - *tilemapDest = (debugCharacterBase - unk_20238C8) / 32 + *ptr + 1; - ptr--; - tilemapDest++; - } - } -} - -#endif - -static void LinkCB_RequestPlayerDataExchange(void) -{ - // Only one request needs to be sent, so only the master sends it. - if (gLinkStatus & LINK_STAT_MASTER) - BuildSendCmd(0x2222); - gLinkCallback = NULL; -} - -void Task_PrintTestData(u8 taskId) -{ - s32 i; - - PrintHex(gShouldAdvanceLinkState, 2, 1, 2); - PrintHex(gLinkStatus, 15, 1, 8); - PrintHex(gLink.state, 2, 10, 2); - PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2); - PrintHex(GetMultiplayerId(), 15, 12, 2); - PrintHex(gLastSendQueueCount, 25, 1, 2); - PrintHex(gLastRecvQueueCount, 25, 2, 2); - PrintHex(GetBlockReceivedStatus(), 15, 5, 2); - PrintHex(gLinkDebugValue1, 2, 12, 8); - PrintHex(gLinkDebugValue2, 2, 13, 8); - PrintHex(GetSioMultiSI(), 25, 5, 1); - PrintHex(IsSioMultiMaster(), 25, 6, 1); - PrintHex(IsLinkConnectionEstablished(), 25, 7, 1); - PrintHex(HasLinkErrorOccurred(), 25, 8, 1); - - for (i = 0; i < MAX_LINK_PLAYERS; i++) - PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); -} - -void SetLinkDebugValues(u32 value1, u32 value2) -{ - gLinkDebugValue1 = value1; - gLinkDebugValue2 = value2; -} - -u8 sub_8008198(void) -{ - u8 result = 0; - s32 i; - - for (i = 0; i < gSavedLinkPlayerCount; i++) - result |= (1 << i); - - return result; -} - -void sub_80081C8(u8 playerCount) -{ - s32 i; - - gSavedLinkPlayerCount = playerCount; - gSavedMultiplayerId = GetMultiplayerId(); - - for (i = 0; i < 4; i++) - gSavedLinkPlayers[i] = gLinkPlayers[i]; -} - -u8 sub_800820C(void) -{ - return gSavedLinkPlayerCount; -} - -u8 sub_8008218(void) -{ - return gSavedMultiplayerId; -} - -bool8 sub_8008224(void) -{ - s32 count = 0; - s32 i; - - for (i = 0; i < gSavedLinkPlayerCount; i++) - if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) - count++; - - if (count == gSavedLinkPlayerCount) - return TRUE; - else - return FALSE; -} - -void sub_800826C(void) -{ - u8 i; - - for (i = 0; i < gSavedLinkPlayerCount; i++) - { - if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId - || StringCompareWithoutExtCtrlCodes(gSavedLinkPlayers[i].name, gLinkPlayers[i].name)) - { - gLinkErrorOccurred = TRUE; - CloseLink(); - SetMainCallback2(CB2_LinkError); - } - } -} - -void sub_80082EC(void) -{ - gSavedLinkPlayerCount = 0; - gSavedMultiplayerId = 0; -} - -u8 GetLinkPlayerCount_2(void) -{ - return EXTRACT_PLAYER_COUNT(gLinkStatus); -} - -bool8 IsLinkMaster(void) -{ - return EXTRACT_MASTER(gLinkStatus); -} - -u8 GetDummy2(void) -{ - return sDummy2; -} - -void sub_800832C(void) -{ - if (!gLinkCallback) - { - gLinkCallback = sub_8008350; - gLinkDummyBool = FALSE; - } -} - -static void sub_8008350(void) -{ - if (gLastRecvQueueCount == 0) - { - BuildSendCmd(0x5FFF); - gLinkCallback = sub_800837C; - } -} - -static void sub_800837C(void) -{ - s32 i; - s32 totalCount = GetLinkPlayerCount(); - s32 count = 0; - - for (i = 0; i < totalCount; i++) - if (u8_array_3002B78[i]) - count++; - - if (count == totalCount) - { - gBattleTypeFlags &= ~BATTLE_TYPE_20; - gLinkVSyncDisabled = TRUE; - CloseLink(); - gLinkCallback = NULL; - gLinkDummyBool = TRUE; - } -} - -static void sub_80083E0(void) -{ - s32 i; - s32 totalCount = GetLinkPlayerCount(); - s32 count = 0; - - for (i = 0; i < totalCount; i++) - { - if (gLinkPlayers[i].language == 1) - count++; - else if (u8_array_3002B78[i]) - count++; - } - - if (count == totalCount) - { - gBattleTypeFlags &= ~BATTLE_TYPE_20; - gLinkVSyncDisabled = TRUE; - CloseLink(); - gLinkCallback = 0; - gLinkDummyBool = TRUE; - } -} - -static void sub_8008454(void) -{ - if (gLastRecvQueueCount == 0) - { - BuildSendCmd(0x5FFF); - gLinkCallback = sub_80083E0; - } -} - -void sub_8008480(void) -{ - if (!gLinkCallback) - { - gLinkCallback = sub_8008454; - gLinkDummyBool = FALSE; - } -} - -void sub_80084A4(void) -{ - if (!gLinkCallback) - gLinkCallback = sub_80084C8; - gLinkDummyBool = FALSE; -} - -static void sub_80084C8(void) -{ - if (gLastRecvQueueCount == 0) - { - BuildSendCmd(0x2FFE); - gLinkCallback = sub_80084F4; - } -} - -static void sub_80084F4(void) -{ - u8 totalCount = GetLinkPlayerCount(); - u8 count = 0; - - while (count < totalCount && u8_array_3002B70[count]) - count++; - - if (count == totalCount) - { - u8 i; - for (i = 0; i < 4; i++) - u8_array_3002B70[i] = 0; - gLinkCallback = NULL; - } -} - -static void CheckErrorStatus(void) -{ - if (gLinkOpen) - { - if (gLinkStatus & LINK_STAT_ERRORS) - { - if (!gSuppressLinkErrorMessage) - { - sErrorLinkStatus = gLinkStatus; - sErrorLastRecvQueueCount = gLastRecvQueueCount; - sErrorLastSendQueueCount = gLastSendQueueCount; - SetMainCallback2(CB2_LinkError); - } - gLinkErrorOccurred = TRUE; - CloseLink(); - } - } -} - -void CB2_LinkError(void) -{ - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetPaletteFadeControl(); - FillPalette(0, 0, 2); - ResetTasks(); - SetVBlankCallback(VBlankCB_LinkTest); - Text_LoadWindowTemplate(&gWindowTemplate_81E7198); - InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E7198); - Menu_EraseScreen(); - REG_BLDALPHA = 0; - REG_BG0VOFS = 0; - REG_BG0HOFS = 0; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; - gSoftResetDisabled = FALSE; - CreateTask(Task_DestroySelf, 0); - StopMapMusic(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - SetMainCallback2(CB2_PrintErrorMessage); -} - -void CB2_PrintErrorMessage(void) -{ - u8 array[32] __attribute__((unused)); // unused - u8 array2[32] __attribute__((unused)); // unused - - switch (gMain.state) - { - case 0: - Menu_PrintTextPixelCoords(gMultiText_LinkError, 20, 56, 1); -#if DEBUG - StringCopy(array, sColorCodes); - - ConvertIntToHexStringN(array2, sErrorLinkStatus, STR_CONV_MODE_LEADING_ZEROS, 8); - StringAppend(array, array2); - - StringAppend(array, sEmptyString); - - ConvertIntToHexStringN(array2, sErrorLastSendQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2); - StringAppend(array, array2); - - StringAppend(array, sEmptyString); - - ConvertIntToHexStringN(array2, sErrorLastRecvQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2); - StringAppend(array, array2); - - Menu_PrintText(array, 2, 15); -#endif - break; - case 30: - case 60: - PlaySE(SE_BOO); - break; - case 90: - PlaySE(SE_BOO); - break; - } - - if (gMain.state != 200) - gMain.state++; -} - -u8 GetSioMultiSI(void) -{ - return (REG_SIOCNT >> SIO_MULTI_SI_SHIFT) & SIO_MULTI_SI_MASK; -} - -static bool8 IsSioMultiMaster(void) -{ - bool8 isMaster = FALSE; - - if ((REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI)) - isMaster = TRUE; - - return isMaster; -} - -bool8 IsLinkConnectionEstablished(void) -{ - return EXTRACT_CONN_ESTABLISHED(gLinkStatus); -} - -void SetSuppressLinkErrorMessage(bool8 value) -{ - gSuppressLinkErrorMessage = value; -} - -bool8 HasLinkErrorOccurred(void) -{ - return gLinkErrorOccurred; -} - -static void DisableSerial(void) -{ - gLinkSavedIme = REG_IME; - REG_IME = 0; - REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); - REG_IME = gLinkSavedIme; - - REG_SIOCNT = 0; - REG_TM3CNT_H = 0; - REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL; - - CpuFill32(0, &gLink, sizeof(gLink)); -} - -static void EnableSerial(void) -{ - gLinkSavedIme = REG_IME; - REG_IME = 0; - REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); - REG_IME = gLinkSavedIme; - - REG_RCNT = 0; - - REG_SIOCNT = SIO_MULTI_MODE; - REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS; - - gLinkSavedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = gLinkSavedIme; - - REG_SIOMLT_SEND = 0; - - CpuFill32(0, &gLink, sizeof(gLink)); - - sNumVBlanksWithoutSerialIntr = 0; - sSendNonzeroCheck = 0; - sRecvNonzeroCheck = 0; - sChecksumAvailable = FALSE; - sHandshakePlayerCount = 0; - gLastSendQueueCount = 0; - gLastRecvQueueCount = 0; -} - -void ResetSerial(void) -{ - EnableSerial(); - DisableSerial(); -} - -u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]) -{ - u32 retVal; - u32 retVal2; - - switch (gLink.state) - { - case LINK_STATE_START0: - DisableSerial(); - gLink.state = LINK_STATE_START1; - break; - case LINK_STATE_START1: - if (*shouldAdvanceLinkState == 1) - { - EnableSerial(); - gLink.state = LINK_STATE_HANDSHAKE; - } - break; - case LINK_STATE_HANDSHAKE: - switch (*shouldAdvanceLinkState) - { - case 1: - if (gLink.isMaster == 8 && gLink.playerCount > 1) - gLink.handshakeAsMaster = TRUE; - break; - case 2: - gLink.state = LINK_STATE_START0; - REG_SIOMLT_SEND = 0; - break; - default: - CheckMasterOrSlave(); - break; - } - break; - case LINK_STATE_INIT_TIMER: - InitTimer(); - gLink.state = LINK_STATE_CONN_ESTABLISHED; - case LINK_STATE_CONN_ESTABLISHED: - EnqueueSendCmd(sendCmd); - DequeueRecvCmds(recvCmds); - break; - } - - *shouldAdvanceLinkState = 0; - - retVal = gLink.localId; - retVal |= (gLink.playerCount << 2); - - if (gLink.isMaster == 8) - retVal |= 0x20; - - { - u32 receivedNothing = gLink.receivedNothing << 8; - u32 link_field_F = gLink.link_field_F << 9; - u32 hardwareError = gLink.hardwareError << 12; - u32 badChecksum = gLink.badChecksum << 13; - u32 queueFull = gLink.queueFull << 14; - u32 val; - - if (gLink.state == LINK_STATE_CONN_ESTABLISHED) - { - val = 0x40; - val |= receivedNothing; - val |= retVal; - val |= link_field_F; - val |= hardwareError; - val |= badChecksum; - val |= queueFull; - } - else - { - val = retVal; - val |= receivedNothing; - val |= link_field_F; - val |= hardwareError; - val |= badChecksum; - val |= queueFull; - } - - retVal = val; - } - - if (gLink.lag == LAG_MASTER) - retVal |= 0x10000; - - if (gLink.localId > 3) - retVal |= 0x20000; - - retVal2 = retVal; - if (gLink.lag == LAG_SLAVE) - retVal2 |= 0x40000; - - return retVal2; -} - -static void CheckMasterOrSlave(void) -{ - u32 terminals = *(u32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI); - - if (terminals == SIO_MULTI_SD && !gLink.localId) - gLink.isMaster = 8; - else - gLink.isMaster = 0; -} - -static void InitTimer(void) -{ - if (gLink.isMaster) - { - REG_TM3CNT_L = 65339; - REG_TM3CNT_H = TIMER_INTR_ENABLE | TIMER_64CLK; - - gLinkSavedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_TIMER3; - REG_IME = gLinkSavedIme; - } -} - -static void EnqueueSendCmd(u16 *sendCmd) -{ - gLinkSavedIme = REG_IME; - REG_IME = 0; - - if (gLink.sendQueue.count < QUEUE_CAPACITY) - { - u8 i; - u8 offset = gLink.sendQueue.pos + gLink.sendQueue.count; - - if (offset >= QUEUE_CAPACITY) - offset -= QUEUE_CAPACITY; - - for (i = 0; i < CMD_LENGTH; i++) - { - sSendNonzeroCheck |= *sendCmd; - gLink.sendQueue.data[i][offset] = *sendCmd; - *sendCmd = 0; - sendCmd++; - } - } - else - { - gLink.queueFull = QUEUE_FULL_SEND; - } - - if (sSendNonzeroCheck) - { - gLink.sendQueue.count++; - sSendNonzeroCheck = 0; - } - - REG_IME = gLinkSavedIme; - gLastSendQueueCount = gLink.sendQueue.count; -} - -void DequeueRecvCmds(u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]) -{ - u8 i; - u8 j; - - gLinkSavedIme = REG_IME; - REG_IME = 0; - - if (gLink.recvQueue.count == 0) - { - for (i = 0; i < CMD_LENGTH; i++) - for (j = 0; j < gLink.playerCount; j++) - recvCmds[i][j] = 0; - - gLink.receivedNothing = TRUE; - } - else - { - for (i = 0; i < CMD_LENGTH; i++) - for (j = 0; j < gLink.playerCount; j++) - recvCmds[i][j] = gLink.recvQueue.data[j][i][gLink.recvQueue.pos]; - - gLink.recvQueue.count--; - gLink.recvQueue.pos++; - - if (gLink.recvQueue.pos >= QUEUE_CAPACITY) - gLink.recvQueue.pos = 0; - - gLink.receivedNothing = FALSE; - } - - REG_IME = gLinkSavedIme; -} - -void LinkVSync(void) -{ - if (gLink.isMaster) - { - switch (gLink.state) - { - case LINK_STATE_HANDSHAKE: - StartTransfer(); - break; - case LINK_STATE_CONN_ESTABLISHED: - if (gLink.serialIntrCounter > 8) - { - if (gLink.lag == LAG_MASTER) - return; - gLink.serialIntrCounter = 0; - } - else if (gLink.hardwareError != TRUE) - { - gLink.lag = LAG_MASTER; - return; - } - StartTransfer(); - break; - } - } - else if (gLink.state == LINK_STATE_CONN_ESTABLISHED - || gLink.state == LINK_STATE_HANDSHAKE) - { - sNumVBlanksWithoutSerialIntr++; - - if (sNumVBlanksWithoutSerialIntr > 10) - { - if (gLink.state == LINK_STATE_CONN_ESTABLISHED) - gLink.lag = LAG_SLAVE; - - if (gLink.state == LINK_STATE_HANDSHAKE) - { - gLink.playerCount = 0; - gLink.link_field_F = 0; - } - } - } -} - -void Timer3Intr(void) -{ - StopTimer(); - StartTransfer(); -} - -void SerialCB(void) -{ - gLink.localId = SIO_MULTI_CNT->id; - - switch (gLink.state) - { - case LINK_STATE_CONN_ESTABLISHED: - gLink.hardwareError = SIO_MULTI_CNT->error; - DoRecv(); - DoSend(); - SendRecvDone(); - break; - case LINK_STATE_HANDSHAKE: - if (DoHandshake()) - { - if (gLink.isMaster) - { - gLink.state = LINK_STATE_INIT_TIMER; - gLink.serialIntrCounter = 8; - } - else - { - gLink.state = LINK_STATE_CONN_ESTABLISHED; - } - } - break; - } - - gLink.serialIntrCounter++; - sNumVBlanksWithoutSerialIntr = 0; - - if (gLink.serialIntrCounter == 8) - gLastRecvQueueCount = gLink.recvQueue.count; -} - -static void StartTransfer(void) -{ - REG_SIOCNT |= SIO_START; -} - -static bool8 DoHandshake(void) -{ - u8 i; - u8 playerCount = 0; - u16 minRecv = 0xFFFF; - - if (gLink.handshakeAsMaster == TRUE) - REG_SIOMLT_SEND = MASTER_HANDSHAKE; - else - REG_SIOMLT_SEND = SLAVE_HANDSHAKE; - - *(u64 *)&gLink.tempRecvBuffer[0] = REG_SIOMLT_RECV; - REG_SIOMLT_RECV = 0; - - gLink.handshakeAsMaster = FALSE; - - for (i = 0; i < 4; i++) - { - if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE - || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE) - { - playerCount++; - - if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0) - minRecv = gLink.tempRecvBuffer[i]; - } - else - { - if (gLink.tempRecvBuffer[i] != 0xFFFF) - playerCount = 0; - break; - } - } - - gLink.playerCount = playerCount; - - // The handshake is successful when: - // 1. There are multiple players. - // 2. The number of players agrees with the last attempt. - // 3. Player no. 0 is identifying as the master. - if (gLink.playerCount > 1 - && gLink.playerCount == sHandshakePlayerCount - && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE) - return TRUE; - - if (gLink.playerCount > 1) - gLink.link_field_F = (minRecv & 3) + 1; - else - gLink.link_field_F = 0; - - sHandshakePlayerCount = gLink.playerCount; - - return FALSE; -} - -static void DoRecv(void) -{ - u16 recvBuffer[4]; - u8 i; - - *(u64 *)&recvBuffer[0] = REG_SIOMLT_RECV; - - if (gLink.sendCmdIndex == 0) - { - for (i = 0; i < gLink.playerCount; i++) - if (gLink.checksum != recvBuffer[i] && sChecksumAvailable) - gLink.badChecksum = TRUE; - - gLink.checksum = 0; - sChecksumAvailable = TRUE; - } - else - { - u8 index = gLink.recvQueue.pos + gLink.recvQueue.count; - - if (index >= QUEUE_CAPACITY) - index -= QUEUE_CAPACITY; - - if (gLink.recvQueue.count < QUEUE_CAPACITY) - { - for (i = 0; i < gLink.playerCount; i++) - { - gLink.checksum += recvBuffer[i]; - sRecvNonzeroCheck |= recvBuffer[i]; - gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recvBuffer[i]; - } - } - else - { - gLink.queueFull = QUEUE_FULL_RECV; - } - - gLink.recvCmdIndex++; - - if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck) - { - gLink.recvQueue.count++; - sRecvNonzeroCheck = 0; - } - } -} - -static void DoSend(void) -{ - if (gLink.sendCmdIndex == CMD_LENGTH) - { - REG_SIOMLT_SEND = gLink.checksum; - - if (!sSendBufferEmpty) - { - gLink.sendQueue.count--; - gLink.sendQueue.pos++; - - if (gLink.sendQueue.pos >= QUEUE_CAPACITY) - gLink.sendQueue.pos = 0; - } - else - { - sSendBufferEmpty = FALSE; - } - } - else - { - if (!sSendBufferEmpty && gLink.sendQueue.count == 0) - sSendBufferEmpty = TRUE; - - if (sSendBufferEmpty) - REG_SIOMLT_SEND = 0; - else - REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos]; - - gLink.sendCmdIndex++; - } -} - -static void StopTimer(void) -{ - if (gLink.isMaster) - { - REG_TM3CNT_H &= ~TIMER_ENABLE; - REG_TM3CNT_L = 65339; - } -} - -static void SendRecvDone(void) -{ - if (gLink.recvCmdIndex == CMD_LENGTH) - { - gLink.sendCmdIndex = 0; - gLink.recvCmdIndex = 0; - } - else if (gLink.isMaster) - { - REG_TM3CNT_H |= TIMER_ENABLE; - } -} - -void ResetSendBuffer(void) -{ - u8 i; - u8 j; - - gLink.sendQueue.count = 0; - gLink.sendQueue.pos = 0; - - for (i = 0; i < CMD_LENGTH; i++) - for (j = 0; j < QUEUE_CAPACITY; j++) - gLink.sendQueue.data[i][j] = 0xEFFF; -} - -void ResetRecvBuffer(void) -{ - u8 i; - u8 j; - u8 k; - - gLink.recvQueue.count = 0; - gLink.recvQueue.pos = 0; - - for (i = 0; i < 4; i++) - for (j = 0; j < CMD_LENGTH; j++) - for (k = 0; k < QUEUE_CAPACITY; k++) - gLink.recvQueue.data[i][j][k] = 0xEFFF; -} diff --git a/src/engine/load_save.c b/src/engine/load_save.c deleted file mode 100644 index 8424b1121..000000000 --- a/src/engine/load_save.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "global.h" -#include "gba/flash_internal.h" -#include "load_save.h" -#include "main.h" -#include "pokemon.h" -#include "overworld.h" - -extern u8 gPlayerPartyCount; - -bool32 gFlashMemoryPresent; - -struct LoadedSaveData -{ - struct ItemSlot items[20]; - struct ItemSlot keyItems[20]; - struct ItemSlot pokeBalls[16]; - struct ItemSlot TMsHMs[64]; - struct ItemSlot berries[46]; - struct MailStruct mail[16]; -}; - -EWRAM_DATA struct SaveBlock2 gSaveBlock2 = {0}; -EWRAM_DATA struct SaveBlock1 gSaveBlock1 = {0}; - -static EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0}; - -void CheckForFlashMemory(void) -{ - if (!IdentifyFlash()) - { - gFlashMemoryPresent = TRUE; - InitFlashTimer(); - } - else - gFlashMemoryPresent = FALSE; -} - -bool32 GetSecretBase2Field_9(void) -{ - return gSaveBlock2.specialSaveWarp; -} - -void ClearSecretBase2Field_9(void) -{ - gSaveBlock2.specialSaveWarp = 0; -} - -void SetSecretBase2Field_9(void) -{ - gSaveBlock2.specialSaveWarp = 1; -} - -void SetSecretBase2Field_9_AndHideBG(void) // note: no other function sets specialSaveWarp to values other than 0 or 1, hence clear and set distinctions. -{ - gpu_sync_bg_hide(0); // the function doesn't use the parameter passed to it, but this is necessary to match. - gSaveBlock2.specialSaveWarp = 1; -} - -void ClearSecretBase2Field_9_2(void) // duplicate function -{ - gSaveBlock2.specialSaveWarp = 0; -} - -void SavePlayerParty(void) -{ - int i; - - gSaveBlock1.playerPartyCount = gPlayerPartyCount; - - for (i = 0; i < 6; i++) - gSaveBlock1.playerParty[i] = gPlayerParty[i]; -} - -void LoadPlayerParty(void) -{ - int i; - - gPlayerPartyCount = gSaveBlock1.playerPartyCount; - - for (i = 0; i < 6; i++) - gPlayerParty[i] = gSaveBlock1.playerParty[i]; -} - -static void SaveMapObjects(void) -{ - int i; - - for (i = 0; i < 16; i++) - gSaveBlock1.mapObjects[i] = gMapObjects[i]; -} - -static void LoadMapObjects(void) -{ - int i; - - for (i = 0; i < 16; i++) - gMapObjects[i] = gSaveBlock1.mapObjects[i]; -} - -void SaveSerializedGame(void) -{ - SavePlayerParty(); - SaveMapObjects(); -} - -void LoadSerializedGame(void) -{ - LoadPlayerParty(); - LoadMapObjects(); -} - -void LoadPlayerBag(void) -{ - int i; - - // load player items. - for (i = 0; i < 20; i++) - gLoadedSaveData.items[i] = gSaveBlock1.bagPocket_Items[i]; - - // load player key items. - for (i = 0; i < 20; i++) - gLoadedSaveData.keyItems[i] = gSaveBlock1.bagPocket_KeyItems[i]; - - // load player pokeballs. - for (i = 0; i < 16; i++) - gLoadedSaveData.pokeBalls[i] = gSaveBlock1.bagPocket_PokeBalls[i]; - - // load player TMs and HMs. - for (i = 0; i < 64; i++) - gLoadedSaveData.TMsHMs[i] = gSaveBlock1.bagPocket_TMHM[i]; - - // load player berries. - for (i = 0; i < 46; i++) - gLoadedSaveData.berries[i] = gSaveBlock1.bagPocket_Berries[i]; - - // load mail. - for (i = 0; i < 16; i++) - gLoadedSaveData.mail[i] = gSaveBlock1.mail[i]; -} - -void SavePlayerBag(void) -{ - int i; - - // save player items. - for (i = 0; i < 20; i++) - gSaveBlock1.bagPocket_Items[i] = gLoadedSaveData.items[i]; - - // save player key items. - for (i = 0; i < 20; i++) - gSaveBlock1.bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i]; - - // save player pokeballs. - for (i = 0; i < 16; i++) - gSaveBlock1.bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; - - // save player TMs and HMs. - for (i = 0; i < 64; i++) - gSaveBlock1.bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i]; - - // save player berries. - for (i = 0; i < 46; i++) - gSaveBlock1.bagPocket_Berries[i] = gLoadedSaveData.berries[i]; - - // save mail. - for (i = 0; i < 16; i++) - gSaveBlock1.mail[i] = gLoadedSaveData.mail[i]; -} diff --git a/src/engine/main.c b/src/engine/main.c deleted file mode 100644 index 54a443e80..000000000 --- a/src/engine/main.c +++ /dev/null @@ -1,376 +0,0 @@ -#include "global.h" -#include "gba/flash_internal.h" -#include "gba/m4a_internal.h" -#include "main.h" -#include "intro.h" -#include "link.h" -#include "load_save.h" -#include "m4a.h" -#include "play_time.h" -#include "random.h" -#include "rom3.h" -#include "overworld.h" -#include "rtc.h" -#include "siirtc.h" -#include "sound.h" -#include "scanline_effect.h" - -extern struct SoundInfo gSoundInfo; -extern u32 IntrMain[]; - -static void VBlankIntr(void); -static void HBlankIntr(void); -static void VCountIntr(void); -static void SerialIntr(void); -static void IntrDummy(void); - -#ifdef SAPPHIRE -#define GAME_VERSION VERSION_SAPPHIRE -#else -#define GAME_VERSION VERSION_RUBY -#endif - -const u8 gGameVersion = GAME_VERSION; - -const u8 gGameLanguage = GAME_LANGUAGE; - -#if defined(ENGLISH) -const char BuildDateTime[] = "2002 10 15 20:34"; -#elif defined(GERMAN) -const char BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $"; -#endif - -const IntrFunc gIntrTableTemplate[] = -{ - SerialIntr, // Serial interrupt - Timer3Intr, // Timer 3 interrupt - HBlankIntr, // H-blank interrupt - VBlankIntr, // V-blank interrupt - VCountIntr, // V-count interrupt - IntrDummy, // Timer 0 interrupt - IntrDummy, // Timer 1 interrupt - IntrDummy, // Timer 2 interrupt - IntrDummy, // DMA 0 interrupt - IntrDummy, // DMA 1 interrupt - IntrDummy, // DMA 2 interrupt - IntrDummy, // DMA 3 interrupt - IntrDummy, // Key interrupt - IntrDummy, // Game Pak interrupt -}; - -#define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc))) - -u16 gKeyRepeatStartDelay; -bool8 gLinkTransferringData; -struct Main gMain; -u16 gKeyRepeatContinueDelay; -u8 gSoftResetDisabled; -IntrFunc gIntrTable[INTR_COUNT]; -bool8 gLinkVSyncDisabled; -u32 IntrMain_Buffer[0x200]; -u8 gPcmDmaCounter; - -EWRAM_DATA u8 gSharedMem[0x20000] = {0}; -EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL; - -static void UpdateLinkAndCallCallbacks(void); -static void InitMainCallbacks(void); -static void CallCallbacks(void); -static void SeedRngWithRtc(void); -static void ReadKeys(void); -static void InitIntrHandlers(void); -static void WaitForVBlank(void); - -#define B_START_SELECT (B_BUTTON | START_BUTTON | SELECT_BUTTON) - -#ifndef NDEBUG - #include // don't include if not needed. -#endif - -void AgbMain() -{ - RegisterRamReset(RESET_ALL); - REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; - InitKeys(); - InitIntrHandlers(); - m4aSoundInit(); - RtcInit(); - CheckForFlashMemory(); - InitMainCallbacks(); - InitMapMusic(); - SeedRngWithRtc(); - - gSoftResetDisabled = FALSE; - -// In Fire Red, AGBPrintInit is called at this spot. For user convenience, I -// opt to initialize the print area here. It is up to the user where they choose -// to print stuff from, as anything else declared is NOT authoritative. -#ifndef NDEBUG - AGBPrintInit(); - __mb_cur_max = 1; // fix for AGBPrintf -#endif - - if (gFlashMemoryPresent != TRUE) - SetMainCallback2(NULL); - - gLinkTransferringData = FALSE; - - for (;;) - { - ReadKeys(); - - if (gSoftResetDisabled == FALSE - && (gMain.heldKeysRaw & A_BUTTON) - && (gMain.heldKeysRaw & B_START_SELECT) == B_START_SELECT) - DoSoftReset(); - - if (gLink.sendQueue.count > 1 && sub_8055910() == 1) - { - gLinkTransferringData = TRUE; - UpdateLinkAndCallCallbacks(); - gLinkTransferringData = FALSE; - } - else - { - gLinkTransferringData = FALSE; - UpdateLinkAndCallCallbacks(); - - if (gLink.recvQueue.count > 1) - { - if (sub_80558AC() == 1) - { - gMain.newKeys = 0; - gLinkTransferringData = TRUE; - UpdateLinkAndCallCallbacks(); - gLinkTransferringData = FALSE; - } - } - } - - PlayTimeCounter_Update(); - MapMusicMain(); - WaitForVBlank(); - } -} - -static void UpdateLinkAndCallCallbacks(void) -{ - gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); - LinkMain2(&gMain.heldKeys); - if (!(gLinkStatus & LINK_STAT_RECEIVED_NOTHING) || sub_8055940() != 1) - CallCallbacks(); -} - -static void InitMainCallbacks(void) -{ - gMain.vblankCounter1 = 0; - gMain.vblankCounter2 = 0; - gMain.callback1 = NULL; - SetMainCallback2(CB2_InitCopyrightScreenAfterBootup); -} - -static void CallCallbacks(void) -{ - if (gMain.callback1) - gMain.callback1(); - - if (gMain.callback2) - gMain.callback2(); -} - -void SetMainCallback2(MainCallback callback) -{ - gMain.callback2 = callback; - gMain.state = 0; -} - -static void SeedRngWithRtc(void) -{ - u32 seed = RtcGetMinuteCount(); - seed = (seed >> 16) ^ (seed & 0xFFFF); - SeedRng(seed); -} - -void InitKeys(void) -{ - gKeyRepeatContinueDelay = 5; - gKeyRepeatStartDelay = 40; - - gMain.heldKeys = 0; - gMain.newKeys = 0; - gMain.newAndRepeatedKeys = 0; - gMain.heldKeysRaw = 0; - gMain.newKeysRaw = 0; -} - -static void ReadKeys(void) -{ - u16 keyInput = REG_KEYINPUT ^ KEYS_MASK; - gMain.newKeysRaw = keyInput & ~gMain.heldKeysRaw; - gMain.newKeys = gMain.newKeysRaw; - gMain.newAndRepeatedKeys = gMain.newKeysRaw; - - // BUG: Key repeat won't work when pressing L using L=A button mode - // because it compares the raw key input with the remapped held keys. - // Note that newAndRepeatedKeys is never remapped either. - - if (keyInput != 0 && gMain.heldKeys == keyInput) - { - gMain.keyRepeatCounter--; - - if (gMain.keyRepeatCounter == 0) - { - gMain.newAndRepeatedKeys = keyInput; - gMain.keyRepeatCounter = gKeyRepeatContinueDelay; - } - } - else - { - // If there is no input or the input has changed, reset the counter. - gMain.keyRepeatCounter = gKeyRepeatStartDelay; - } - - gMain.heldKeysRaw = keyInput; - gMain.heldKeys = gMain.heldKeysRaw; - - // Remap L to A if the L=A option is enabled. - if (gSaveBlock2.optionsButtonMode == 2) - { - if (gMain.newKeys & L_BUTTON) - gMain.newKeys |= A_BUTTON; - - if (gMain.heldKeys & L_BUTTON) - gMain.heldKeys |= A_BUTTON; - } - - if (gMain.newKeys & gMain.watchedKeysMask) - gMain.watchedKeysPressed = TRUE; -} - -static void InitIntrHandlers(void) -{ - int i; - - for (i = 0; i < INTR_COUNT; i++) - gIntrTable[i] = gIntrTableTemplate[i]; - - DmaCopy32(3, IntrMain, IntrMain_Buffer, sizeof(IntrMain_Buffer)); - - INTR_VECTOR = IntrMain_Buffer; - - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); - SetSerialCallback(NULL); - - REG_IME = 1; - REG_IE = INTR_FLAG_VBLANK; - REG_DISPSTAT = DISPSTAT_VBLANK_INTR; - REG_IE |= INTR_FLAG_VBLANK; -} - -void SetVBlankCallback(IntrCallback callback) -{ - gMain.vblankCallback = callback; -} - -void SetHBlankCallback(IntrCallback callback) -{ - gMain.hblankCallback = callback; -} - -void SetVCountCallback(IntrCallback callback) -{ - gMain.vcountCallback = callback; -} - -void SetSerialCallback(IntrCallback callback) -{ - gMain.serialCallback = callback; -} - -static void VBlankIntr(void) -{ - u16 savedIme; - - if (!gLinkVSyncDisabled) - LinkVSync(); - - savedIme = REG_IME; - REG_IME = 0; - m4aSoundVSync(); - REG_IME = savedIme; - - gMain.vblankCounter1++; - - if (gMain.vblankCallback) - gMain.vblankCallback(); - - gMain.vblankCounter2++; - - gPcmDmaCounter = gSoundInfo.pcmDmaCounter; - - m4aSoundMain(); - sub_800C35C(); - Random(); - - INTR_CHECK |= INTR_FLAG_VBLANK; - gMain.intrCheck |= INTR_FLAG_VBLANK; -} - -void InitFlashTimer(void) -{ - SetFlashTimerIntr(2, gFlashTimerIntrFunc); -} - -static void HBlankIntr(void) -{ - if (gMain.hblankCallback) - gMain.hblankCallback(); - - INTR_CHECK |= INTR_FLAG_HBLANK; - gMain.intrCheck |= INTR_FLAG_HBLANK; -} - -static void VCountIntr(void) -{ - if (gMain.vcountCallback) - gMain.vcountCallback(); - - INTR_CHECK |= INTR_FLAG_VCOUNT; - gMain.intrCheck |= INTR_FLAG_VCOUNT; -} - -static void SerialIntr(void) -{ - if (gMain.serialCallback) - gMain.serialCallback(); - - INTR_CHECK |= INTR_FLAG_SERIAL; - gMain.intrCheck |= INTR_FLAG_SERIAL; -} - -static void IntrDummy(void) -{} - -static void WaitForVBlank(void) -{ - gMain.intrCheck &= ~INTR_FLAG_VBLANK; - VBlankIntrWait(); -} - -void DoSoftReset(void) -{ - REG_IME = 0; - m4aSoundVSyncOff(); - ScanlineEffect_Stop(); - DmaStop(1); - DmaStop(2); - DmaStop(3); - SiiRtcProtect(); - SoftReset(RESET_ALL); -} - -void ClearPokemonCrySongs(void) -{ - CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong)); -} diff --git a/src/engine/main_menu.c b/src/engine/main_menu.c deleted file mode 100644 index 5a3f55b29..000000000 --- a/src/engine/main_menu.c +++ /dev/null @@ -1,1705 +0,0 @@ -#include "global.h" -#include "constants/songs.h" -#include "constants/species.h" -#include "main_menu.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "field_effect.h" -#include "menu.h" -#include "mystery_event_menu.h" -#include "naming_screen.h" -#include "option_menu.h" -#include "palette.h" -#include "pokeball.h" -#include "overworld.h" -#include "rtc.h" -#include "save_menu_util.h" -#include "save.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "title_screen.h" -#include "scanline_effect.h" -#include "ewram.h" - -#define BirchSpeechUpdateWindowText() ((u8)Menu_UpdateWindowTextOverrideLineLength(24)) - -extern struct PaletteFadeControl gPaletteFade; - -extern const u8 gBirchSpeech_Welcome[]; -extern const u8 gBirchSpeech_ThisIsPokemon[]; -extern const u8 gBirchSpeech_WorldInhabitedByPokemon[]; -extern const u8 gBirchSpeech_AndYouAre[]; -extern const u8 gBirchSpeech_AreYouBoyOrGirl[]; -extern const u8 gBirchSpeech_WhatsYourName[]; -extern u8 gBirchSpeech_SoItsPlayer[]; -extern u8 gBirchSpeech_AhOkayYouArePlayer[]; -extern u8 gBirchSpeech_AreYouReady[]; - -extern struct SpriteTemplate gUnknown_02024E8C; -extern const struct MenuAction gUnknown_081E79B0[]; -extern const struct MenuAction gMalePresetNames[]; -extern const struct MenuAction gFemalePresetNames[]; - -extern const u8 gUnknown_081E7834[]; - -extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[]; - -//Menu layouts -enum -{ - HAS_NO_SAVED_GAME, //NEW GAME, OPTION - HAS_SAVED_GAME, //CONTINUE, NEW GAME, OPTION - HAS_MYSTERY_GIFT, //CONTINUE, NEW GAME, MYSTERY EVENTS, OPTION -}; - -static void CB2_MainMenu(void); -static void VBlankCB_MainMenu(void); -static void CB2_InitMainMenuFromOptions(void); -static u32 InitMainMenu(bool8 a1); -static void Task_MainMenuCheckSave(u8 taskId); -static void Task_MainMenuWaitForSaveErrorAck(u8 taskId); -static void Task_MainMenuCheckRtc(u8 taskId); -static void Task_MainMenuWaitForRtcErrorAck(u8 taskId); -static void Task_MainMenuDraw(u8 taskId); -static void Task_MainMenuHighlight(u8 taskId); -static bool8 MainMenuProcessKeyInput(u8 taskId); -static void Task_MainMenuProcessKeyInput(u8 taskId); -static void Task_MainMenuPressedA(u8 taskId); -static void Task_MainMenuPressedB(u8 taskId); -static void HighlightCurrentMenuItem(u8 layout, u8 menuItem); -static void PrintMainMenuItem(const u8 *text, u8 left, u8 top); -static void PrintSaveFileInfo(void); -static void PrintPlayerName(void); -static void PrintPlayTime(void); -static void PrintPokedexCount(void); -static void PrintBadgeCount(void); -static void Task_NewGameSpeech1(u8 taskId); -static void Task_NewGameSpeech2(u8 taskId); -static void Task_NewGameSpeech3(u8 taskId); -static void Task_NewGameSpeech4(u8 taskId); -static void Task_NewGameSpeech5(u8 taskId); -static void Task_NewGameSpeech6(u8 taskId); -static void Task_NewGameSpeech7(u8 taskId); -static void Task_NewGameSpeech8(u8 taskId); -static void Task_NewGameSpeech9(u8 taskId); -static void Task_NewGameSpeech10(u8 taskId); -static void Task_NewGameSpeech11(u8 taskId); -static void Task_NewGameSpeech12(u8 taskId); -static void Task_NewGameSpeech13(u8 taskId); -static void Task_NewGameSpeech14(u8 taskId); -static void Task_NewGameSpeech15(u8 taskId); -static void Task_NewGameSpeech16(u8 taskId); -static void Task_NewGameSpeech17(u8 taskId); -static void Task_NewGameSpeech18(u8 taskId); -static void Task_NewGameSpeech19(u8 taskId); -static void Task_NewGameSpeech20(u8 taskId); -static void Task_NewGameSpeech21(u8 taskId); -static void Task_NewGameSpeech22(u8 taskId); -static void Task_NewGameSpeech23(u8 taskId); -static void Task_NewGameSpeech24(u8 taskId); -static void Task_NewGameSpeech25(u8 taskId); -static void Task_NewGameSpeech26(u8 taskId); -static void Task_NewGameSpeech27(u8 taskId); -static void Task_NewGameSpeech28(u8 taskId); -static void Task_NewGameSpeech29(u8 taskId); -static void Task_NewGameSpeech30(u8 taskId); -static void Task_NewGameSpeech31(u8 taskId); -static void Task_NewGameSpeech32(u8 taskId); -static void Task_NewGameSpeech33(u8 taskId); -static void CB_ContinueNewGameSpeechPart2(); -static void nullsub_34(struct Sprite *sprite); -static void ShrinkPlayerSprite(struct Sprite *sprite); -static u8 CreateAzurillSprite(u8 x, u8 y); -static void AddBirchSpeechObjects(u8 taskId); -static void Task_SpriteFadeOut(u8 taskId); -static void StartSpriteFadeOut(u8 taskId, u8 interval); -static void Task_SpriteFadeIn(u8 taskId); -static void StartSpriteFadeIn(u8 taskId, u8 interval); -static void HandleFloorShadowFadeOut(u8 taskId); -static void StartBackgroundFadeOut(u8 taskId, u8 interval); -static void HandleFloorShadowFadeIn(u8 taskId); -static void StartBackgroundFadeIn(u8 taskId, u8 interval); -static void CreateGenderMenu(u8 left, u8 top); -static s8 GenderMenuProcessInput(void); -static void CreateNameMenu(u8 left, u8 top); -static s8 NameMenuProcessInput(void); -static void SetPresetPlayerName(u8 index); - -static const u16 gUnknown_081E764C[][16] = -{ - INCBIN_U16("graphics/birch_speech/bg0.gbapal"), - INCBIN_U16("graphics/birch_speech/bg1.gbapal"), -}; - -static const u8 gBirchIntroShadowGfx[] = INCBIN_U8("graphics/birch_speech/shadow.4bpp.lz"); -static const u8 gUnknown_081E7834[] = INCBIN_U8("graphics/birch_speech/map.bin.lz"); -static const u16 gUnknown_081E795C[] = INCBIN_U16("graphics/birch_speech/bg2.gbapal"); -static const u16 gUnknown_081E796C[] = INCBIN_U16("graphics/birch_speech/blank_pal.gbapal"); -static const u16 gMainMenuPalette[] = INCBIN_U16("graphics/misc/main_menu.gbapal"); - -static const union AffineAnimCmd gSpriteAffineAnim_81E799C[] = -{ - AFFINEANIMCMD_FRAME(0xFFFE, 0xFFFE, 0, 48), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[] = -{ - gSpriteAffineAnim_81E799C, -}; - -static const struct MenuAction gUnknown_081E79B0[] = -{ - {gBirchText_Boy, NULL}, - {gBirchText_Girl, NULL}, -}; - -static const struct MenuAction gMalePresetNames[] = -{ - {gBirchText_NewName, NULL}, - {gDefaultBoyName1, NULL}, - {gDefaultBoyName2, NULL}, - {gDefaultBoyName3, NULL}, - {gDefaultBoyName4, NULL}, -}; - -static const struct MenuAction gFemalePresetNames[] = -{ - {gBirchText_NewName, NULL}, - {gDefaultGirlName1, NULL}, - {gDefaultGirlName2, NULL}, - {gDefaultGirlName3, NULL}, - {gDefaultGirlName4, NULL}, -}; - -static void CB2_MainMenu(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void VBlankCB_MainMenu(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void CB2_InitMainMenu(void) -{ - InitMainMenu(FALSE); -} - -static void CB2_InitMainMenuFromOptions(void) -{ - InitMainMenu(TRUE); -} - -#define tMenuLayout data[0] -#define tMenuSelection data[1] - -u32 InitMainMenu(u8 a1) -{ - u16 savedIme; - u8 taskId; - - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); - - ResetPaletteFade(); - LoadPalette(gMainMenuPalette, 0, 32); - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); - - if (a1) - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0x0000); // fade to black - else - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xFFFF); // fade to white - - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - - SetVBlankCallback(VBlankCB_MainMenu); - SetMainCallback2(CB2_MainMenu); - - REG_DISPCNT = DISPCNT_MODE_0 - | DISPCNT_OBJ_1D_MAP - | DISPCNT_BG0_ON - | DISPCNT_OBJ_ON - | DISPCNT_WIN0_ON; - - taskId = CreateTask(Task_MainMenuCheckSave, 0); - gTasks[taskId].tMenuSelection = 0; - - return 0; -} - -void Task_MainMenuCheckSave(u8 taskId) -{ - if (gPaletteFade.active) - return; - - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0x1111; - REG_WINOUT = 49; - REG_BLDCNT = 241; - REG_BLDALPHA = 0; - REG_BLDY = 7; - - switch (gSaveFileStatus) - { - case SAVE_STATUS_OK: - if (IsMysteryGiftEnabled() == TRUE) - gTasks[taskId].tMenuLayout = HAS_MYSTERY_GIFT; - else - gTasks[taskId].tMenuLayout = HAS_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuCheckRtc; - break; - case 2: - Menu_DrawStdWindowFrame(2, 14, 27, 19); - MenuPrintMessage(gSaveFileDeletedMessage, 3, 15); - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(113, 159); - gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; - break; - case SAVE_STATUS_ERROR: - Menu_DrawStdWindowFrame(2, 14, 27, 19); - MenuPrintMessage(gSaveFileCorruptMessage, 3, 15); - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(113, 159); - gTasks[taskId].tMenuLayout = HAS_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; - - if (IsMysteryGiftEnabled() == TRUE) - gTasks[taskId].tMenuLayout = HAS_MYSTERY_GIFT; - else - gTasks[taskId].tMenuLayout = HAS_SAVED_GAME; - break; - case SAVE_STATUS_EMPTY: - default: - gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuCheckRtc; - break; - case SAVE_STATUS_NO_FLASH: - Menu_DrawStdWindowFrame(2, 14, 27, 19); - MenuPrintMessage(gBoardNotInstalledMessage, 3, 15); - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(113, 159); - gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME; - gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; - return; - } -} - -void Task_MainMenuWaitForSaveErrorAck(u8 taskId) -{ - if (Menu_UpdateWindowText()) - { - if (gMain.newKeys & A_BUTTON) - { - Menu_EraseWindowRect(2, 14, 27, 19); - gTasks[taskId].func = Task_MainMenuCheckRtc; - } - } -} - -void Task_MainMenuCheckRtc(u8 taskId) -{ - if (!gPaletteFade.active) - { - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0x1111; - REG_WINOUT = 49; - REG_BLDCNT = 241; - REG_BLDALPHA = 0; - REG_BLDY = 7; - - if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK)) - { - gTasks[taskId].func = Task_MainMenuDraw; - } - else - { - Menu_DrawStdWindowFrame(2, 14, 27, 19); - MenuPrintMessage(gBatteryDryMessage, 3, 15); - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(113, 159); - gTasks[taskId].func = Task_MainMenuWaitForRtcErrorAck; - } - } -} - -void Task_MainMenuWaitForRtcErrorAck(u8 taskId) -{ - if (Menu_UpdateWindowText()) - { - if ( gMain.newKeys & 1 ) - { - Menu_EraseWindowRect(2, 14, 27, 19); - gTasks[taskId].func = Task_MainMenuDraw; - } - } -} - -void Task_MainMenuDraw(u8 taskId) -{ - u16 palette; - - if (!gPaletteFade.active) - { - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0x1111; - REG_WINOUT = 49; - REG_BLDCNT = 241; - REG_BLDALPHA = 0; - REG_BLDY = 7; - - palette = RGB(0, 0, 0); - LoadPalette(&palette, 254, 2); - - if (gSaveBlock2.playerGender == MALE) - { - palette = RGB(4, 16, 31); - LoadPalette(&palette, 241, 2); - } - else - { - palette = RGB(31, 3, 21); - LoadPalette(&palette, 241, 2); - } - - switch (gTasks[taskId].tMenuLayout) - { - case HAS_NO_SAVED_GAME: - default: - Menu_DrawStdWindowFrame(1, 0, 28, 3); - PrintMainMenuItem(gMainMenuString_NewGame, 2, 1); - Menu_DrawStdWindowFrame(1, 4, 28, 7); - PrintMainMenuItem(gMainMenuString_Option, 2, 5); - break; - case HAS_SAVED_GAME: - Menu_DrawStdWindowFrame(1, 0, 28, 7); - PrintMainMenuItem(gMainMenuString_Continue, 2, 1); - Menu_DrawStdWindowFrame(1, 8, 28, 11); - PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); - Menu_DrawStdWindowFrame(1, 12, 28, 15); - PrintMainMenuItem(gMainMenuString_Option, 2, 13); - PrintSaveFileInfo(); - break; - case HAS_MYSTERY_GIFT: - Menu_DrawStdWindowFrame(1, 0, 28, 7); - PrintMainMenuItem(gMainMenuString_Continue, 2, 1); - Menu_DrawStdWindowFrame(1, 8, 28, 11); - PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); - Menu_DrawStdWindowFrame(1, 12, 28, 15); - PrintMainMenuItem(gMainMenuString_MysteryEvents, 2, 13); - Menu_DrawStdWindowFrame(1, 16, 28, 19); - PrintMainMenuItem(gMainMenuString_Option, 2, 0x11); - PrintSaveFileInfo(); - break; - } - - gTasks[taskId].func = Task_MainMenuHighlight; - } -} - -void Task_MainMenuHighlight(u8 taskId) -{ - HighlightCurrentMenuItem(gTasks[taskId].tMenuLayout, gTasks[taskId].tMenuSelection); - gTasks[taskId].func = Task_MainMenuProcessKeyInput; -} - -bool8 MainMenuProcessKeyInput(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0x0000); - gTasks[taskId].func = Task_MainMenuPressedA; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN0V = WIN_RANGE(0, 160); - gTasks[taskId].func = Task_MainMenuPressedB; - } - else - { - s32 menuItemCount; - - switch (gTasks[taskId].tMenuLayout) - { - case HAS_NO_SAVED_GAME: - default: - menuItemCount = 2; - break; - case HAS_SAVED_GAME: - menuItemCount = 3; - break; - case HAS_MYSTERY_GIFT: - menuItemCount = 4; - break; - } - - if (gMain.newKeys & DPAD_UP) - { - if (gTasks[taskId].tMenuSelection > 0) - { - gTasks[taskId].tMenuSelection--; - return TRUE; - } - } - if (gMain.newKeys & DPAD_DOWN) - { - if (gTasks[taskId].tMenuSelection < menuItemCount - 1) - { - gTasks[taskId].tMenuSelection++; - return TRUE; - } - } - } - - return FALSE; -} - -void Task_MainMenuProcessKeyInput(u8 taskId) -{ - bool8 currentMenuItemChanged = MainMenuProcessKeyInput(taskId); - if (currentMenuItemChanged) - gTasks[taskId].func = Task_MainMenuHighlight; -} - -void Task_MainMenuPressedA(u8 taskId) -{ - enum - { - NEW_GAME, - CONTINUE, - OPTION, - MYSTERY_EVENTS, - } action; - - if (gPaletteFade.active) - return; - - switch (gTasks[taskId].tMenuLayout) - { - case HAS_NO_SAVED_GAME: - default: - switch (gTasks[taskId].tMenuSelection) - { - case 0: - default: - action = NEW_GAME; - break; - case 1: - action = OPTION; - break; - } - break; - case HAS_SAVED_GAME: - switch (gTasks[taskId].tMenuSelection) - { - case 0: - default: - action = CONTINUE; - break; - case 1: - action = NEW_GAME; - break; - case 2: - action = OPTION; - break; - } - break; - case HAS_MYSTERY_GIFT: - switch (gTasks[taskId].tMenuSelection) - { - case 0: - default: - action = CONTINUE; - break; - case 1: - action = NEW_GAME; - break; - case 2: - action = MYSTERY_EVENTS; - break; - case 3: - action = OPTION; - break; - } - break; - } - - switch ((int)action) - { - case NEW_GAME: - default: - gPlttBufferUnfaded[0] = 0; - gPlttBufferFaded[0] = 0; - gTasks[taskId].func = Task_NewGameSpeech1; - break; - case CONTINUE: - gPlttBufferUnfaded[0] = 0; - gPlttBufferFaded[0] = 0; - SetMainCallback2(CB2_ContinueSavedGame); - DestroyTask(taskId); - break; - case OPTION: - gMain.savedCallback = CB2_InitMainMenuFromOptions; - SetMainCallback2(CB2_InitOptionMenu); - DestroyTask(taskId); - break; - case MYSTERY_EVENTS: - SetMainCallback2(CB2_InitMysteryEventMenu); - DestroyTask(taskId); - break; - } -} - -void Task_MainMenuPressedB(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(CB2_InitTitleScreen); - DestroyTask(taskId); - } -} - -#undef tMenuLayout -#undef tMenuSelection - -void HighlightCurrentMenuItem(u8 layout, u8 menuItem) -{ - REG_WIN0H = WIN_RANGE(9, 231); - - switch (layout) - { - case HAS_NO_SAVED_GAME: - default: - switch (menuItem) - { - case 0: - default: - REG_WIN0V = WIN_RANGE(1, 31); - break; - case 1: - REG_WIN0V = WIN_RANGE(33, 63); - break; - } - break; - case HAS_SAVED_GAME: - switch (menuItem) - { - case 0: - default: - REG_WIN0V = WIN_RANGE(1, 63); - break; - case 1: - REG_WIN0V = WIN_RANGE(65, 95); - break; - case 2: - REG_WIN0V = WIN_RANGE(97, 127); - break; - } - break; - case HAS_MYSTERY_GIFT: - switch (menuItem) - { - case 0: - default: - REG_WIN0V = WIN_RANGE(1, 63); - break; - case 1: - REG_WIN0V = WIN_RANGE(65, 95); - break; - case 2: - REG_WIN0V = WIN_RANGE(97, 127); - break; - case 3: - REG_WIN0V = WIN_RANGE(129, 159); - break; - } - break; - } -} - -void PrintMainMenuItem(const u8 *text, u8 left, u8 top) -{ - u8 i; - u8 buffer[32]; - - buffer[0] = 0xFC; - buffer[1] = 1; - buffer[2] = 14; - - for (i = 0; i < 26; i++) - buffer[3 + i] = text[i]; - - buffer[29] = EOS; - - Menu_PrintText(buffer, left, top); -} - -void PrintSaveFileInfo(void) -{ - PrintPlayerName(); - PrintPokedexCount(); - PrintPlayTime(); - PrintBadgeCount(); -} - -void PrintPlayerName(void) -{ - Menu_PrintText(gMainMenuString_Player, 2, 3); - Menu_PrintText(gSaveBlock2.playerName, 9, 3); -} - -void PrintPlayTime(void) -{ - u8 playTime[16]; - u8 alignedPlayTime[32]; - -#if defined(ENGLISH) - Menu_PrintText(gMainMenuString_Time, 16, 3); - FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); - sub_8072C74(alignedPlayTime, playTime, 48, 1); - Menu_PrintText(alignedPlayTime, 22, 3); -#elif defined(GERMAN) - Menu_PrintTextPixelCoords(gMainMenuString_Time, 124, 24, TRUE); - FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); - sub_8072C74(alignedPlayTime, playTime, 40, 1); - Menu_PrintText(alignedPlayTime, 23, 3); -#endif -} - -void PrintPokedexCount(void) -{ - u8 buffer[16]; - - Menu_PrintText(gMainMenuString_Pokedex, 2, 5); - sub_8072C14(buffer, GetPokedexSeenCount(), 18, 0); - Menu_PrintText(buffer, 9, 5); -} - -void PrintBadgeCount(void) -{ - u8 buffer[16]; - -#if defined(ENGLISH) - Menu_PrintText(gMainMenuString_Badges, 16, 5); -#elif defined(GERMAN) - Menu_PrintTextPixelCoords(gMainMenuString_Badges, 124, 40, TRUE); -#endif - ConvertIntToDecimalString(buffer, GetBadgeCount()); - Menu_PrintTextPixelCoords(buffer, 205, 40, 1); -} - -#define tTrainerSpriteId data[2] -#define tBGhofs data[4] -#define tSubtaskIsDone data[5] -#define tGenderSelection data[6] -#define tFrameCounter data[7] -#define tBirchSpriteId data[8] -#define tAzurillSpriteId data[9] -#define tBrendanSpriteId data[10] -#define tMaySpriteId data[11] - -static void Task_NewGameSpeech1(u8 taskId) -{ - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - LZ77UnCompVram(gBirchIntroShadowGfx, (void *)BG_VRAM); - LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); - LoadPalette(gUnknown_081E764C, 0, 0x40); - LoadPalette(gUnknown_081E796C, 1, 0x10); - ScanlineEffect_Stop(); - ResetSpriteData(); - FreeAllSpritePalettes(); - AddBirchSpeechObjects(taskId); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP; - gTasks[taskId].tBGhofs = 0; - gTasks[taskId].func = Task_NewGameSpeech2; - gTasks[taskId].tTrainerSpriteId = 0xFF; - gTasks[taskId].data[3] = 0xFF; - gTasks[taskId].tFrameCounter = 216; //Wait 3.6 seconds (216 frames) before starting speech - - PlayBGM(BGM_DOORO_X4); -} - -static void Task_NewGameSpeech2(u8 taskId) -{ - if (gTasks[taskId].tFrameCounter != 0) - { - gTasks[taskId].tFrameCounter--; - } - else - { - //Initialize Birch sprite - u8 spriteId = gTasks[taskId].tBirchSpriteId; - - gSprites[spriteId].pos1.x = 136; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = 0; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeIn(taskId, 10); - StartBackgroundFadeIn(taskId, 20); - gTasks[taskId].tFrameCounter = 80; - gTasks[taskId].func = Task_NewGameSpeech3; - } -} - -static void Task_NewGameSpeech3(u8 taskId) -{ - if (gTasks[taskId].tSubtaskIsDone) - { - gSprites[gTasks[taskId].tBirchSpriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - if (gTasks[taskId].tFrameCounter) - { - gTasks[taskId].tFrameCounter--; - } - else - { - Menu_DrawStdWindowFrame(2, 13, 27, 18); - //"Hi! Sorry to keep you waiting... - //...But everyone calls me the POKEMON PROFESSOR." - MenuPrintMessage(gBirchSpeech_Welcome, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech4; - } - } -} - -static void Task_NewGameSpeech4(u8 taskId) -{ - if (!gPaletteFade.active && BirchSpeechUpdateWindowText()) - { - gTasks[taskId].func = Task_NewGameSpeech5; - //"This is what we call a POKEMON." - MenuPrintMessage(gBirchSpeech_ThisIsPokemon, 3, 14); - } -} - -static void Task_NewGameSpeech5(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - gTasks[taskId].func = Task_NewGameSpeech6; -} - -static void Task_NewGameSpeech6(u8 taskId) -{ - u8 spriteId = gTasks[taskId].tAzurillSpriteId; - - gSprites[spriteId].pos1.x = 104; - gSprites[spriteId].pos1.y = 72; - gSprites[spriteId].invisible = 0; - gSprites[spriteId].data[0] = 0; - CreatePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 0x70, 0x3A, 0, 0, 0x20, 0x0000FFFF); - gTasks[taskId].func = Task_NewGameSpeech7; - gTasks[taskId].tFrameCounter = 0; -} - -static void Task_NewGameSpeech7(u8 taskId) -{ - if (IsCryFinished()) - { - //Go on to next sentence after frame 95 - if (gTasks[taskId].tFrameCounter > 95) - { - Menu_SetText(gSystemText_NewPara); - gTasks[taskId].func = Task_NewGameSpeech8; - } - } - - if (gTasks[taskId].tFrameCounter < 16384) - { - gTasks[taskId].tFrameCounter++; - //Play Azurill cry at frame 32 - if (gTasks[taskId].tFrameCounter == 32) - PlayCry1(SPECIES_AZURILL, 0); - } -} - -static void Task_NewGameSpeech8(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - //"This world is widely inhabited by POKEMON... - //...That's what I do." - MenuPrintMessage(gBirchSpeech_WorldInhabitedByPokemon, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech9; - } -} - -static void Task_NewGameSpeech9(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - Menu_DrawStdWindowFrame(2, 13, 27, 18); - //"And you are?" - MenuPrintMessage(gBirchSpeech_AndYouAre, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech10; - } -} - -static void Task_NewGameSpeech10(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - gSprites[gTasks[taskId].tBirchSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; - gSprites[gTasks[taskId].tAzurillSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeOut(taskId, 2); - StartBackgroundFadeOut(taskId, 1); - gTasks[taskId].tFrameCounter = 64; - gTasks[taskId].func = Task_NewGameSpeech11; - } -} - -//Slide platform away to the right -static void Task_NewGameSpeech11(u8 taskId) -{ - if (gTasks[taskId].tBGhofs != -60) - { - gTasks[taskId].tBGhofs -= 2; - REG_BG1HOFS = gTasks[taskId].tBGhofs; - } - else - { - gTasks[taskId].tBGhofs = -60; - gTasks[taskId].func = Task_NewGameSpeech12; - } -} - -static void Task_NewGameSpeech12(u8 taskId) -{ - if (gTasks[taskId].tSubtaskIsDone) - { - //Hide Birch and Azurill - gSprites[gTasks[taskId].tBirchSpriteId].invisible = TRUE; - gSprites[gTasks[taskId].tAzurillSpriteId].invisible = TRUE; - - if (gTasks[taskId].tFrameCounter) - { - gTasks[taskId].tFrameCounter--; - } - else - { - //Initialize Brendan sprite - u8 spriteId = gTasks[taskId].tBrendanSpriteId; - - gSprites[spriteId].pos1.x = 180; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - gTasks[taskId].tTrainerSpriteId = spriteId; - gTasks[taskId].tGenderSelection = 0; - StartSpriteFadeIn(taskId, 2); - StartBackgroundFadeIn(taskId, 1); - gTasks[taskId].func = Task_NewGameSpeech13; - } - } -} - -static void Task_NewGameSpeech13(u8 taskId) -{ - if (gTasks[taskId].tSubtaskIsDone) - { - gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - gTasks[taskId].func = Task_NewGameSpeech14; - } -} - -static void Task_NewGameSpeech14(u8 taskId) -{ - Menu_DrawStdWindowFrame(2, 13, 27, 18); - //"Are you a boy? Or are you a girl?" - MenuPrintMessage(gBirchSpeech_AreYouBoyOrGirl, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech15; -} - -static void Task_NewGameSpeech15(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - CreateGenderMenu(2, 4); - gTasks[taskId].func = Task_NewGameSpeech16; - } -} - -//Process gender menu -static void Task_NewGameSpeech16(u8 taskId) -{ - u8 cursorPos; - - switch (GenderMenuProcessInput()) - { - case MALE: - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - gSaveBlock2.playerGender = MALE; - Menu_EraseWindowRect(2, 4, 8, 9); - gTasks[taskId].func = Task_NewGameSpeech19; - break; - case FEMALE: - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - gSaveBlock2.playerGender = FEMALE; - Menu_EraseWindowRect(2, 4, 8, 9); - gTasks[taskId].func = Task_NewGameSpeech19; - break; - } - - cursorPos = Menu_GetCursorPos(); - - if (cursorPos != gTasks[taskId].tGenderSelection) - { - //Menu selection changed. Slide Brendan or May out and slide the other in - gTasks[taskId].tGenderSelection = cursorPos; - gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeOut(taskId, 0); - gTasks[taskId].func = Task_NewGameSpeech17; - } -} - -//Slide old trainer sprite off right of screen -static void Task_NewGameSpeech17(u8 taskId) -{ - u8 spriteId = gTasks[taskId].tTrainerSpriteId; - - if (gTasks[taskId].tSubtaskIsDone == FALSE) - { - gSprites[spriteId].pos1.x += 4; //Move sprite right - } - else - { - gSprites[spriteId].invisible = TRUE; - - //Set up new trainer sprite - if (gTasks[taskId].tGenderSelection) - spriteId = gTasks[taskId].tMaySpriteId; - else - spriteId = gTasks[taskId].tBrendanSpriteId; - gSprites[spriteId].pos1.x = 240; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = FALSE; - gTasks[taskId].tTrainerSpriteId = spriteId; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeIn(taskId, 0); - gTasks[taskId].func = Task_NewGameSpeech18; - } -} - -//Slide new trainer sprite from right of screen -static void Task_NewGameSpeech18(u8 taskId) -{ - u8 spriteId = gTasks[taskId].tTrainerSpriteId; - - if (gSprites[spriteId].pos1.x > 180) - { - gSprites[spriteId].pos1.x -= 4; //Move sprite left - } - else - { - gSprites[spriteId].pos1.x = 180; - if (gTasks[taskId].tSubtaskIsDone) - { - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - gTasks[taskId].func = Task_NewGameSpeech16; //Go back to gender menu - } - } -} - -static void Task_NewGameSpeech19(u8 taskId) -{ - Menu_DrawStdWindowFrame(2, 13, 27, 18); - //"All right. What's your name?" - MenuPrintMessage(gBirchSpeech_WhatsYourName, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech20; -} - -static void Task_NewGameSpeech20(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - CreateNameMenu(2, 1); - gTasks[taskId].func = Task_NewGameSpeech21; - } -} - -//Handle name menu selection -static void Task_NewGameSpeech21(u8 taskId) -{ - s8 selection = NameMenuProcessInput(); - - switch (selection) - { - case 1: //preset names - case 2: - case 3: - case 4: - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - Menu_EraseWindowRect(2, 1, 22, 12); - SetPresetPlayerName(selection); - gTasks[taskId].func = Task_NewGameSpeech23; - break; - case 0: //NEW NAME - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = Task_NewGameSpeech22; - break; - case -1: //B button - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - Menu_EraseWindowRect(2, 1, 22, 12); - gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu - break; - } -} - -//Open naming screen -static void Task_NewGameSpeech22(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetPresetPlayerName(1); - DoNamingScreen(0, gSaveBlock2.playerName, gSaveBlock2.playerGender, 0, 0, CB_ContinueNewGameSpeechPart2); - } -} - -static void Task_NewGameSpeech23(u8 taskId) -{ - Menu_DrawStdWindowFrame(2, 13, 27, 18); - //"So it's (PLAYER)?" - StringExpandPlaceholders(gStringVar4, gBirchSpeech_SoItsPlayer); - MenuPrintMessage(gStringVar4, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech24; -} - -static void Task_NewGameSpeech24(u8 taskId) -{ - if (BirchSpeechUpdateWindowText()) - { - DisplayYesNoMenu(2, 1, 1); - gTasks[taskId].func = Task_NewGameSpeech25; - } -} - -//Handle yes/no menu selection -static void Task_NewGameSpeech25(u8 taskId) -{ - switch (Menu_ProcessInputNoWrap_()) - { - case 0: //YES - PlaySE(SE_SELECT); - Menu_EraseWindowRect(2, 1, 8, 7); - gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; - StartSpriteFadeOut(taskId, 2); - StartBackgroundFadeOut(taskId, 1); - gTasks[taskId].func = Task_NewGameSpeech26; //Continue - break; - case -1: //B button - case 1: //NO - PlaySE(SE_SELECT); - Menu_EraseWindowRect(2, 1, 8, 7); - gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu - break; - } -} - -static void Task_NewGameSpeech26(u8 taskId) -{ - if (gTasks[taskId].tBGhofs) - { - gTasks[taskId].tBGhofs += 2; - REG_BG1HOFS = gTasks[taskId].tBGhofs; - } - else - { - gTasks[taskId].func = Task_NewGameSpeech27; - } -} - -static void Task_NewGameSpeech27(u8 taskId) -{ - if (gTasks[taskId].tSubtaskIsDone) - { - s16 spriteId; - - //Hide Brendan and May sprites - spriteId = gTasks[taskId].tBrendanSpriteId; - gSprites[spriteId].invisible = TRUE; - spriteId = gTasks[taskId].tMaySpriteId; - gSprites[spriteId].invisible = TRUE; - - //Fade in Birch and Azurill - spriteId = (u8)gTasks[taskId].tBirchSpriteId; - gSprites[spriteId].pos1.x = 136; - gSprites[spriteId].pos1.y = 64; - gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - spriteId = (u8)gTasks[taskId].tAzurillSpriteId; - gSprites[spriteId].pos1.x = 104; - gSprites[spriteId].pos1.y = 72; - gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - - StartSpriteFadeIn(taskId, 2); - StartBackgroundFadeIn(taskId, 1); - Menu_DrawStdWindowFrame(2, 13, 27, 18); - StringExpandPlaceholders(gStringVar4, gBirchSpeech_AhOkayYouArePlayer); - //"Ah, okay! You're (PLAYER) who's moving... - //...I get it now!" - MenuPrintMessage(gStringVar4, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech28; - } -} - -static void Task_NewGameSpeech28(u8 taskId) -{ - if (gTasks[taskId].tSubtaskIsDone) - { - s16 spriteId; - - spriteId = gTasks[taskId].tBirchSpriteId; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - - spriteId = gTasks[taskId].tAzurillSpriteId; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - - if (BirchSpeechUpdateWindowText()) - { - //Fade out Birch and Azurill - spriteId = gTasks[taskId].tBirchSpriteId; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - spriteId = gTasks[taskId].tAzurillSpriteId; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - - StartSpriteFadeOut(taskId, 2); - StartBackgroundFadeOut(taskId, 1); - gTasks[taskId].tFrameCounter = 64; - gTasks[taskId].func = Task_NewGameSpeech29; - } - } -} - -static void Task_NewGameSpeech29(u8 taskId) -{ - if (gTasks[taskId].tSubtaskIsDone) - { - s16 spriteId; - - //Hide Birch and Azurill - spriteId = gTasks[taskId].tBirchSpriteId; - gSprites[spriteId].invisible = TRUE; - spriteId = gTasks[taskId].tAzurillSpriteId; - gSprites[spriteId].invisible = TRUE; - - if (gTasks[taskId].tFrameCounter) - { - gTasks[taskId].tFrameCounter--; - } - else - { - u8 spriteId; - - //Fade in trainer and background - if (gSaveBlock2.playerGender) - spriteId = (u8)gTasks[taskId].tMaySpriteId; - else - spriteId = (u8)gTasks[taskId].tBrendanSpriteId; - gSprites[spriteId].pos1.x = 120; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; - gTasks[taskId].tTrainerSpriteId = spriteId; - - StartSpriteFadeIn(taskId, 2); - StartBackgroundFadeIn(taskId, 1); - Menu_DrawStdWindowFrame(2, 13, 27, 18); - MenuPrintMessage(gBirchSpeech_AreYouReady, 3, 14); - gTasks[taskId].func = Task_NewGameSpeech30; - } - } -} - -static void Task_NewGameSpeech30(u8 taskId) -{ - if (gTasks[taskId].tSubtaskIsDone) - { - s16 spriteId; - - spriteId = gTasks[taskId].tTrainerSpriteId; - gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; - - if (BirchSpeechUpdateWindowText()) - { - u8 spriteId; - - spriteId = gTasks[taskId].tTrainerSpriteId; - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E79AC; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 0); - gSprites[spriteId].callback = ShrinkPlayerSprite; - BeginNormalPaletteFade(0x0000FFFF, 0, 0, 0x10, 0); - FadeOutBGM(4); - gTasks[taskId].func = Task_NewGameSpeech31; - } - } -} - -static void Task_NewGameSpeech31(u8 taskId) -{ - u8 spriteId = gTasks[taskId].tTrainerSpriteId; - - if (gSprites[spriteId].affineAnimEnded) - gTasks[taskId].func = Task_NewGameSpeech32; -} - -static void Task_NewGameSpeech32(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 spriteId = gTasks[taskId].tTrainerSpriteId; - gSprites[spriteId].callback = nullsub_34; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON; - BeginNormalPaletteFade(0xFFFF0000, 0, 0, 0x10, 0xFFFF); - gTasks[taskId].func = Task_NewGameSpeech33; - } -} - -static void Task_NewGameSpeech33(u8 taskId) -{ - if (!gPaletteFade.active) - { - //We're finished setting up. Start the new game! - SetMainCallback2(CB2_NewGame); - DestroyTask(taskId); - } -} - -// Re-initializes graphics state after running the naming screen -// and continues the new game speech -void CB_ContinueNewGameSpeechPart2() -{ - u8 taskId; - u8 spriteId; - u16 savedIme; - - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)PLTT, PLTT_SIZE); - - ResetPaletteFade(); - - LZ77UnCompVram(gBirchIntroShadowGfx, (void *)BG_VRAM); - LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); - - LoadPalette(gUnknown_081E764C, 0, 0x40); - - ResetTasks(); - - taskId = CreateTask(Task_NewGameSpeech23, 0); - - gTasks[taskId].tBGhofs = -60; - - ScanlineEffect_Stop(); - ResetSpriteData(); - FreeAllSpritePalettes(); - AddBirchSpeechObjects(taskId); - - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); - - if (gSaveBlock2.playerGender != MALE) - { - gTasks[taskId].tGenderSelection = FEMALE; - spriteId = gTasks[taskId].tMaySpriteId; - } - else - { - gTasks[taskId].tGenderSelection = MALE; - spriteId = gTasks[taskId].tBrendanSpriteId; - } - - gSprites[spriteId].pos1.x = 180; - gSprites[spriteId].pos1.y = 60; - gSprites[spriteId].invisible = FALSE; - - gTasks[taskId].tTrainerSpriteId = spriteId; - - REG_BG1HOFS = -60; - - BeginNormalPaletteFade(0xFFFFFFFFu, 0, 0x10, 0, 0); - - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - - SetVBlankCallback(VBlankCB_MainMenu); - SetMainCallback2(CB2_MainMenu); - REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | - DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; -} - -void nullsub_34(struct Sprite *sprite) -{ -} - -void ShrinkPlayerSprite(struct Sprite *sprite) -{ - u32 y = (sprite->pos1.y << 16) + sprite->data[0] + 0xC000; - sprite->pos1.y = y >> 16; - sprite->data[0] = y; -} - -u8 CreateAzurillSprite(u8 x, u8 y) -{ - DecompressPicFromTable_2( - &gMonFrontPicTable[SPECIES_AZURILL], - gMonFrontPicCoords[SPECIES_AZURILL].coords, - gMonFrontPicCoords[SPECIES_AZURILL].y_offset, - gUnknown_081FAF4C[0], - gUnknown_081FAF4C[1], - SPECIES_AZURILL); - LoadCompressedObjectPalette(&gMonPaletteTable[SPECIES_AZURILL]); - GetMonSpriteTemplate_803C56C(SPECIES_AZURILL, 1); - return CreateSprite(&gUnknown_02024E8C, x, y, 0); -} - -void AddBirchSpeechObjects(u8 taskId) -{ - u8 spriteId; - - spriteId = CreateBirchSprite(136, 60, 1); - gSprites[spriteId].callback = nullsub_34; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].invisible = 1; - gTasks[taskId].tBirchSpriteId = spriteId; - - spriteId = CreateAzurillSprite(0x68, 0x48); - gSprites[spriteId].callback = nullsub_34; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].invisible = 1; - gTasks[taskId].tAzurillSpriteId = spriteId; - - //Create Brendan sprite - spriteId = CreateTrainerSprite(0, 120, 60, 0, eBrendanSprite); - gSprites[spriteId].callback = nullsub_34; - gSprites[spriteId].invisible = 1; - gSprites[spriteId].oam.priority = 0; - gTasks[taskId].tBrendanSpriteId = spriteId; - - //Create May sprite - spriteId = CreateTrainerSprite(1, 120, 60, 0, eMaySprite); - gSprites[spriteId].callback = nullsub_34; - gSprites[spriteId].invisible = 1; - gSprites[spriteId].oam.priority = 0; - gTasks[taskId].tMaySpriteId = spriteId; -} - -#undef tTrainerSpriteId -#undef tBGhofs -//#undef tSubtaskIsDone -#undef tGenderSelection -#undef tFrameCounter -#undef tBirchSpriteId -#undef tAzurillSpriteId -#undef tBrendanSpriteId -#undef tMaySpriteId - - -// Sprite Fade task - -#define tMainTaskId data[0] -#define tBlendEVA data[1] -#define tBlendEVB data[2] -#define tUpdateInterval data[3] -#define tFrameCounter data[4] - -static void Task_SpriteFadeOut(u8 taskId) -{ - if (gTasks[taskId].tBlendEVA == 0) - { - gTasks[gTasks[taskId].tMainTaskId].tSubtaskIsDone = TRUE; - DestroyTask(taskId); - } - else - { - if (gTasks[taskId].tFrameCounter) - { - gTasks[taskId].tFrameCounter--; - } - else - { - gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval; - gTasks[taskId].tBlendEVA--; - gTasks[taskId].tBlendEVB++; - REG_BLDALPHA = gTasks[taskId].tBlendEVA + (gTasks[taskId].tBlendEVB * 256); - } - } -} - -//Launches a helper task to fade out sprites -static void StartSpriteFadeOut(u8 taskId, u8 interval) -{ - u8 newTaskId; - - REG_BLDCNT = 592; - REG_BLDALPHA = 16; - REG_BLDY = 0; - gTasks[taskId].tSubtaskIsDone = FALSE; - newTaskId = CreateTask(Task_SpriteFadeOut, 0); - - gTasks[newTaskId].tMainTaskId = taskId; - gTasks[newTaskId].tBlendEVA = 16; - gTasks[newTaskId].tBlendEVB = 0; - gTasks[newTaskId].tUpdateInterval = interval; - gTasks[newTaskId].tFrameCounter = interval; -} - -static void Task_SpriteFadeIn(u8 taskId) -{ - if (gTasks[taskId].tBlendEVA == 16) - { - gTasks[gTasks[taskId].tMainTaskId].tSubtaskIsDone = TRUE; - DestroyTask(taskId); - } - else if (gTasks[taskId].tFrameCounter) - { - gTasks[taskId].tFrameCounter--; - } - else - { - gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval; - gTasks[taskId].tBlendEVA++; - gTasks[taskId].tBlendEVB--; - REG_BLDALPHA = gTasks[taskId].tBlendEVA + (gTasks[taskId].tBlendEVB * 256); - } -} - -//Launches a helper task to fade in sprites -static void StartSpriteFadeIn(u8 taskId, u8 interval) -{ - u8 newTaskId; - - REG_BLDCNT = 592; - REG_BLDALPHA = 4096; - REG_BLDY = 0; - gTasks[taskId].tSubtaskIsDone = FALSE; - newTaskId = CreateTask(Task_SpriteFadeIn, 0); - - gTasks[newTaskId].tMainTaskId = taskId; - gTasks[newTaskId].tBlendEVA = 0; - gTasks[newTaskId].tBlendEVB = 16; - gTasks[newTaskId].tUpdateInterval = interval; - gTasks[newTaskId].tFrameCounter = interval; -} - -#undef tMainTaskId -#undef tBlendEVA -#undef tBlendEVB -#undef tUpdateInterval -#undef tFrameCounter - - -// Background fade task - -#define tMainTaskId data[0] -#define tFadeLevel data[1] -#define tDelay data[2] -#define tUpdateInterval data[3] -#define tFrameCounter data[4] - -static void HandleFloorShadowFadeOut(u8 taskId) -{ - if (gTasks[taskId].tDelay) - gTasks[taskId].tDelay--; - else - { - if (gTasks[taskId].tFadeLevel == 8) - DestroyTask(taskId); - else - { - if (gTasks[taskId].tFrameCounter) - gTasks[taskId].tFrameCounter--; - else - { - gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval; - gTasks[taskId].tFadeLevel++; - LoadPalette(&gUnknown_081E795C[gTasks[taskId].tFadeLevel], 1, 0x10); - } - } - } -} - -//Launches a helper task to fade out the background -static void StartBackgroundFadeOut(u8 taskId, u8 interval) -{ - u8 newTaskId = CreateTask(HandleFloorShadowFadeOut, 0); - gTasks[newTaskId].tMainTaskId = taskId; - gTasks[newTaskId].tFadeLevel = 0; - gTasks[newTaskId].tDelay = 8; - gTasks[newTaskId].tUpdateInterval = interval; - gTasks[newTaskId].tFrameCounter = interval; -} - -static void HandleFloorShadowFadeIn(u8 taskId) -{ - if (gTasks[taskId].tDelay) - gTasks[taskId].tDelay--; - else - { - if (gTasks[taskId].tFadeLevel == 0) - DestroyTask(taskId); - else - { - if (gTasks[taskId].tFrameCounter) - gTasks[taskId].tFrameCounter--; - else - { - gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval; - gTasks[taskId].tFadeLevel--; - LoadPalette(&gUnknown_081E795C[gTasks[taskId].tFadeLevel], 1, 0x10); - } - } - } -} - -//Launches a helper task to fade in the background -static void StartBackgroundFadeIn(u8 taskId, u8 interval) -{ - u8 newTaskId = CreateTask(HandleFloorShadowFadeIn, 0); - gTasks[newTaskId].tMainTaskId = taskId; - gTasks[newTaskId].tFadeLevel = 8; - gTasks[newTaskId].tDelay = 8; - gTasks[newTaskId].tUpdateInterval = interval; - gTasks[newTaskId].tFrameCounter = interval; -} - -#undef tMainTaskId -#undef tFadeLevel -#undef tDelay -#undef tUpdateInterval -#undef tFrameCounter - -static void CreateGenderMenu(u8 left, u8 top) -{ - u8 menuLeft, menuTop; - Menu_DrawStdWindowFrame(left, top, left + 6, top + 5); - menuLeft = left + 1; - menuTop = top + 1; - Menu_PrintItems(menuLeft, menuTop, 2, gUnknown_081E79B0); - InitMenu(0, menuLeft, menuTop, 2, 0, 5); -} - -static s8 GenderMenuProcessInput(void) -{ - return Menu_ProcessInputNoWrap(); -} - -static void CreateNameMenu(u8 left, u8 top) -{ - Menu_DrawStdWindowFrame(left, top, left + 10, top + 11); - - if (gSaveBlock2.playerGender == MALE) - Menu_PrintItems(left + 1, top + 1, 5, gMalePresetNames); - else - Menu_PrintItems(left + 1, top + 1, 5, gFemalePresetNames); - - InitMenu(0, left + 1, top + 1, 5, 0, 9); -} - -static s8 NameMenuProcessInput(void) -{ - return Menu_ProcessInput(); -} - -static void SetPresetPlayerName(u8 index) -{ - u8 i; - u8 *name; - - if (gSaveBlock2.playerGender == MALE) - name = (u8 *) gMalePresetNames[index].text; - else - name = (u8 *) gFemalePresetNames[index].text; - - for (i = 0; i < 7; i++) - gSaveBlock2.playerName[i] = name[i]; - - gSaveBlock2.playerName[i] = EOS; -} diff --git a/src/engine/menu.c b/src/engine/menu.c deleted file mode 100644 index 86e20d0eb..000000000 --- a/src/engine/menu.c +++ /dev/null @@ -1,889 +0,0 @@ -#include "global.h" -#include "menu.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu_cursor.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "strings.h" -#include "text.h" -#include "text_window.h" -#include "string_util.h" - -struct Menu -{ - u8 left; - u8 top; - s8 cursorPos; - s8 minCursorPos; - s8 maxCursorPos; - u8 width; - u8 height; - u8 menu_field_7; - u8 columnXCoords[8]; -}; - -static void MultistepInitMenuWindowInternal(const struct WindowTemplate *, u16); -static void InitMenuWindowInternal(const struct WindowTemplate *, u16); -static bool8 IsGridCursorMovementClamped(void); -static u8 sub_8072484(u8, u8, u8, u8, u8, u8, u32); -static u8 sub_80724F4(u8, u8, u8, const struct MenuAction[], u8); -static void sub_8072620(u8, u8, u8, const struct MenuAction[], u8); -static void sub_8072D18(u8, u8); -static void RedrawMenuCursor(u8, u8); - -static struct Menu gMenu; - -EWRAM_DATA struct Window gMenuWindow = {0}; -EWRAM_DATA u8 gFiller_202E908[0x90] = {0}; -EWRAM_DATA struct Window *gMenuWindowPtr = NULL; -EWRAM_DATA u8 gMenuMultistepInitState = 0; -EWRAM_DATA u16 gMenuTextTileOffset = 0; -EWRAM_DATA u16 gMenuTextWindowTileOffset = 0; -EWRAM_DATA u16 gMenuTextWindowContentTileOffset = 0; -EWRAM_DATA u16 gMenuMessageBoxContentTileOffset = 0; - -const struct MenuAction gMenuYesNoItems[] = -{ - { OtherText_Yes, NULL }, - { OtherText_No, NULL }, -}; - -void CloseMenu(void) -{ - PlaySE(SE_SELECT); - Menu_EraseScreen(); - sub_8064E2C(); - ScriptContext2_Disable(); - Menu_DestroyCursor(); -} - -void AppendToList(u8 *list, u8 *pindex, u32 value) -{ - list[*pindex] = value; - (*pindex)++; -} - -void InitMenuWindow(const struct WindowTemplate *winTemplate) -{ - InitMenuWindowInternal(winTemplate, 1); -} - -void MultistepInitMenuWindowBegin(const struct WindowTemplate *winTemplate) -{ - MultistepInitMenuWindowInternal(winTemplate, 1); -} - -static void MultistepInitMenuWindowInternal(const struct WindowTemplate *winTemplate, u16 tileOffset) -{ - gMenuMultistepInitState = 0; - gMenuTextTileOffset = tileOffset; - gMenuWindowPtr = &gMenuWindow; - Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); -} - -bool32 MultistepInitMenuWindowContinue(void) -{ - switch (gMenuMultistepInitState) - { - case 0: - gMenuMultistepInitState++; - return 0; - case 1: - gMenuTextWindowTileOffset = MultistepInitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); - goto next; - case 2: - if (!MultistepLoadFont()) - goto fail; - goto next; - case 3: - gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); - next: - gMenuMultistepInitState++; - return 0; - case 4: - TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); - gMenuMessageBoxContentTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); - return 1; - default: - fail: - return 0; - } -} - -static void InitMenuWindowInternal(const struct WindowTemplate *winTemplate, u16 tileOffset) -{ - gMenuWindowPtr = &gMenuWindow; - Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); - gMenuTextTileOffset = tileOffset; - gMenuTextWindowTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); - gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); - TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); - gMenuMessageBoxContentTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); -} - -void unref_sub_8071DA4(struct WindowTemplate *winTemplate, u16 tileOffset) -{ - gMenuWindowPtr = &gMenuWindow; - Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); - gMenuTextWindowTileOffset = tileOffset; - gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); - TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); - gMenuTextTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); - gMenuMessageBoxContentTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); -} - -void Menu_LoadStdFrameGraphicsOverrideStyle(u8 frameType) -{ - TextWindow_LoadStdFrameGraphicsOverrideStyle(gMenuWindowPtr, frameType); -} - -void Menu_LoadStdFrameGraphics(void) -{ - TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); -} - -void BasicInitMenuWindow(const struct WindowTemplate *winTemplate) -{ - Text_InitWindowWithTemplate(gMenuWindowPtr, winTemplate); - gMenuWindowPtr->tileDataStartOffset = gMenuTextTileOffset; -} - -// Prints -void Menu_PrintText(const u8 *str, u8 left, u8 top) -{ - Text_InitWindowAndPrintText(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); -} - -void Menu_EraseWindowRect(u8 left, u8 top, u8 right, u8 bottom) -{ - Text_EraseWindowRect(gMenuWindowPtr, left, top, right, bottom); -} - -void Menu_BlankWindowRect(u8 left, u8 top, u8 right, u8 bottom) -{ - Text_BlankWindowRect(gMenuWindowPtr, left, top, right, bottom); -} - -void Menu_EraseScreen(void) -{ - Menu_EraseWindowRect(0, 0, 29, 19); -} - -void Menu_DrawStdWindowFrame(u8 left, u8 top, u8 right, u8 bottom) -{ - TextWindow_DrawStdFrame(gMenuWindowPtr, left, top, right, bottom); -} - -void sub_8071F40(const u8 *str) -{ - Menu_DrawStdWindowFrame(2, 14, 28, 19); - Menu_PrintText(str, 3, 15); -} - -void sub_8071F60(u8 a1, u8 a2, u8 a3) -{ - sub_8003490(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3); -} - -u16 unref_sub_8071F98(u8 x, u8 y) -{ - return Text_GetWindowTilemapEntry(gMenuWindowPtr, x, y); -} - -void unref_sub_8071FBC(u16 a1, u8 a2, u8 a3, u8 a4, u8 a5) -{ - Text_FillWindowBorder(gMenuWindowPtr, a1, a2, a3, a4, a5); -} - -void Menu_DisplayDialogueFrame(void) -{ - TextWindow_DisplayDialogueFrame(gMenuWindowPtr); -} - -void MenuPrintMessage(const u8 *str, u8 left, u8 top) -{ - Text_InitWindow8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); -} - -void MenuPrintMessageDefaultCoords(const u8 *str) -{ - Text_InitWindow8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, 2, 15); -} - -void Menu_SetText(const u8 *str) -{ - Text_SetWindowText(gMenuWindowPtr, str); -} - -u8 Menu_UpdateWindowText(void) -{ - return Text_UpdateWindow(gMenuWindowPtr); -} - -u8 unref_sub_8072098(void) -{ - return Text_PrintWindowSimple(gMenuWindowPtr); -} - -void Menu_ClearWindowText(void) -{ - Text_ClearWindow(gMenuWindowPtr); -} - -u8 Menu_MoveCursor(s8 delta) -{ - s32 newPos = gMenu.cursorPos + delta; - - if (newPos < gMenu.minCursorPos) - gMenu.cursorPos = gMenu.maxCursorPos; - else if (newPos > gMenu.maxCursorPos) - gMenu.cursorPos = gMenu.minCursorPos; - else - gMenu.cursorPos += delta; - - RedrawMenuCursor(gMenu.left, 2 * gMenu.cursorPos + gMenu.top); - return gMenu.cursorPos; -} - -u8 Menu_MoveCursorNoWrap(s8 delta) -{ - s32 newPos = gMenu.cursorPos + delta; - - if (newPos < gMenu.minCursorPos) - gMenu.cursorPos = gMenu.minCursorPos; - else if (newPos > gMenu.maxCursorPos) - gMenu.cursorPos = gMenu.maxCursorPos; - else - gMenu.cursorPos += delta; - - RedrawMenuCursor(gMenu.left, 2 * gMenu.cursorPos + gMenu.top); - return gMenu.cursorPos; -} - -u8 Menu_GetCursorPos(void) -{ - return gMenu.cursorPos; -} - -s8 Menu_ProcessInput(void) -{ - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gMenu.menu_field_7) - Menu_DestroyCursor(); - return gMenu.cursorPos; - } - - if (gMain.newKeys & B_BUTTON) - { - if (gMenu.menu_field_7) - Menu_DestroyCursor(); - return -1; - } - - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - return -2; - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - return -2; - } - - return -2; -} - -s8 Menu_ProcessInputNoWrap(void) -{ - u8 cursorPos = gMenu.cursorPos; - - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gMenu.menu_field_7) - Menu_DestroyCursor(); - return gMenu.cursorPos; - } - - if (gMain.newKeys & B_BUTTON) - { - if (gMenu.menu_field_7) - Menu_DestroyCursor(); - return -1; - } - - if (gMain.newKeys & DPAD_UP) - { - if (cursorPos != Menu_MoveCursorNoWrap(-1)) - PlaySE(SE_SELECT); - return -2; - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (cursorPos != Menu_MoveCursorNoWrap(1)) - PlaySE(SE_SELECT); - return -2; - } - - Menu_MoveCursorNoWrap(0); - return -2; -} - -u8 MoveMenuCursor3(s8 delta) -{ - u8 menuHeight = (gMenu.maxCursorPos + 1) >> 1; - s32 newPos = gMenu.cursorPos + delta; - - if (newPos < gMenu.minCursorPos) - gMenu.cursorPos = gMenu.maxCursorPos; - else if (newPos > gMenu.maxCursorPos) - gMenu.cursorPos = gMenu.minCursorPos; - else - gMenu.cursorPos += delta; - - RedrawMenuCursor( - 6 * (gMenu.cursorPos / menuHeight) + gMenu.left, - 2 * (gMenu.cursorPos % menuHeight) + gMenu.top); - - return gMenu.cursorPos; -} - -static u8 MoveMenuCursorGridLayout(s8 delta) -{ - // Don't move cursor if it is clamped - if (gMenu.cursorPos + delta <= gMenu.maxCursorPos) - { - if (IsGridCursorMovementClamped() == TRUE) - return gMenu.cursorPos; - } - else - { - return gMenu.cursorPos; - } - - gMenu.cursorPos += delta; - - if ((gMenu.maxCursorPos + 1) / gMenu.width == 0) - RedrawMenuCursor( - gMenu.left + gMenu.columnXCoords[gMenu.cursorPos % gMenu.width], - 2 * ((gMenu.cursorPos / gMenu.width) % gMenu.height) + gMenu.top); - else - RedrawMenuCursor( - gMenu.left + gMenu.columnXCoords[gMenu.cursorPos % gMenu.width], - 2 * (gMenu.cursorPos / gMenu.width) + gMenu.top); - - return gMenu.cursorPos; -} - -// Returns TRUE if the cursor is on an edge and cannot move in the pressed direction -static bool8 IsGridCursorMovementClamped(void) -{ - if (gMain.newKeys & DPAD_UP) - { - // is cursor on first row? - if (gMenu.cursorPos < gMenu.width) - return TRUE; - } - if (gMain.newKeys & DPAD_DOWN) - { - // is cursor on last row? - if (gMenu.cursorPos >= gMenu.maxCursorPos + 1 - gMenu.width) - return TRUE; - } - if (gMain.newKeys & DPAD_LEFT) - { - // is cursor on first column? - if ((gMenu.cursorPos - gMenu.cursorPos % gMenu.width) % gMenu.width == 1 // always false - || gMenu.cursorPos == 0 // redundant - || gMenu.cursorPos % gMenu.width == 0) - return TRUE; - } - if (gMain.newKeys & DPAD_RIGHT) - { - // is cursor on last column? - if (gMenu.cursorPos % gMenu.width == gMenu.width - 1) - return TRUE; - } - - return FALSE; -} - -static u8 sub_8072484(u8 a1, u8 a2, u8 menuItemCount, u8 a4, u8 width, u8 a6, u32 a7) -{ - u8 v7; - - gMenu.width = width; - gMenu.height = menuItemCount / width; - InitMenu(0, a1, a2, menuItemCount, a4, a6); - v7 = 0; - if (a7) - v7 = -1; - gMenu.menu_field_7 = v7; - return a4; -} - -static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) -{ - u8 i; - u8 maxWidth; - s32 height; - - for (i = 0; i < 7; i++) - gMenu.columnXCoords[i] = 0; - - maxWidth = 0; - for (i = 0; i < menuItemCount; i++) - { - u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; - - if (width > maxWidth) - maxWidth = width; - } - - for (i = 1; i <= columnCount; i++) - gMenu.columnXCoords[i] = maxWidth; - - for (i = 1; i <= columnCount; i++) - gMenu.columnXCoords[i] += 1 + gMenu.columnXCoords[i - 1]; - - gMenu.columnXCoords[columnCount]--; - - if (!((menuItemCount / 2) < columnCount || (menuItemCount % 2 != 0)) - || columnCount == 1 - || columnCount == menuItemCount) - { - height = 2 * (menuItemCount / columnCount) + 1; - } - else - { - height = 2 * ((menuItemCount / columnCount) + 1) + 1; - } - - { - // TODO: Make this code less hideous but still match the original asm. - u8 right; - u8 bottom; - u32 totalWidth; - register s32 val asm("r1"); - - val = (s8)top + height; - val = val << 24; - asm("" ::: "r3"); - bottom = val >> 24; - - totalWidth = (gMenu.columnXCoords[columnCount] + 1); - right = left + totalWidth; - - Menu_DrawStdWindowFrame(left, top, right, bottom); - } - - return maxWidth; -} - -static void sub_8072620(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) -{ - u8 i; - u8 maxWidth; - - for (i = 0; i < 7; i++) - gMenu.columnXCoords[i] = 0; - - maxWidth = 0; - for (i = 0; i < menuItemCount; i++) - { - u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; - - if (width > maxWidth) - maxWidth = width; - } - - for (i = 1; i <= columnCount; i++) - gMenu.columnXCoords[i] = maxWidth; - - for (i = 1; i <= columnCount; i++) - gMenu.columnXCoords[i] += 1 + gMenu.columnXCoords[i - 1]; - - gMenu.columnXCoords[columnCount]--; - - for (i = 0; i < columnCount; i++) - { - u8 row = 0; - u8 j; - for (j = 0; i + j < menuItemCount; j += columnCount, row++) - Menu_PrintText(menuItems[i + j].text, left + gMenu.columnXCoords[i % columnCount], top + 2 * row); - } -} - -void sub_807274C(u8 left, u8 top, u8 menuItemCount, u8 a4, const struct MenuAction menuItems[], u8 columnCount, u32 a7) -{ - u8 maxWidth = sub_80724F4(left, top, menuItemCount, menuItems, columnCount); - - sub_8072484(left + 1, top + 1, menuItemCount, a4, columnCount, maxWidth, a7); - sub_8072620(left + 1, top + 1, menuItemCount, menuItems, columnCount); -} - -s8 Menu_ProcessInputGridLayout(void) -{ - if (gMain.newKeys & A_BUTTON) - { - if (gMenu.menu_field_7) - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - return Menu_GetCursorPos(); - } - - if (gMain.newKeys & B_BUTTON) - { - if (gMenu.menu_field_7) - Menu_DestroyCursor(); - return -1; - } - - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - // Move up one whole row - MoveMenuCursorGridLayout(-gMenu.width); - return -2; - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - // Move down one whole column - MoveMenuCursorGridLayout(gMenu.width); - return -2; - } - else if (gMain.newKeys & DPAD_LEFT) - { - PlaySE(SE_SELECT); - MoveMenuCursorGridLayout(-1); - return -2; - } - else if (gMain.newKeys & DPAD_RIGHT) - { - PlaySE(SE_SELECT); - MoveMenuCursorGridLayout(1); - return -2; - } - - return -2; -} - -u8 Menu_GetColumnXCoord(u8 column) -{ - return gMenu.columnXCoords[column]; -} - -void Menu_PrintItems(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[]) -{ - u8 i; - - for (i = 0; i < menuItemCount; i++) - Menu_PrintText(menuItems[i].text, left, top + 2 * i); -} - -void Menu_PrintItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction2 menuItems[], const u8 *order) -{ - u8 i; - - for (i = 0; i < menuItemCount; i++) - Menu_PrintText(menuItems[order[i]].text, left, top + 2 * i); -} - -void InitYesNoMenu(u8 left, u8 top, u8 a3) -{ - Menu_PrintItems(left + 1, top + 1, 2, gMenuYesNoItems); - InitMenu(0, left + 1, top + 1, 2, 0, a3); -} - -void DisplayYesNoMenu(u8 left, u8 top, u32 a3) -{ - Menu_DrawStdWindowFrame(left, top, left + 6, top + 5); - InitYesNoMenu(left, top, 5); - gMenu.menu_field_7 = a3 ? -1 : 0; -} - -s8 Menu_ProcessInputNoWrap_(void) -{ - return Menu_ProcessInputNoWrap(); -} - -u8 Menu_PrintTextPixelCoords(const u8 *text, u8 left, u16 top, u8 a4) -{ - return Text_InitWindow8004D04(gMenuWindowPtr, text, gMenuTextTileOffset, left, top, a4); -} - -u8 sub_8072A18(const u8 *text, u8 left, u16 top, u8 width, u32 a5) -{ - return sub_8004FD0(gMenuWindowPtr, 0, text, gMenuTextTileOffset, left, top, width, a5); -} - -u8 unref_sub_8072A5C(u8 *dest, u8 *src, u8 left, u16 top, u8 width, u32 a6) -{ - return sub_8004FD0(gMenuWindowPtr, dest, src, gMenuTextTileOffset, left, top, width, a6); -} - -#if ENGLISH -int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) -{ - u8 newlineCount = sub_8004FD0(gMenuWindowPtr, NULL, str, gMenuTextTileOffset, left, top, width, a6); - - left /= 8; - top /= 8; - width = (width + 7) / 8; - height = (height + 7) / 8; - - if (newlineCount < height) - Menu_BlankWindowRect(left, top + 2 * newlineCount, left + width - 1, height + top - 1); -} -#elif GERMAN -__attribute__((naked)) -int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - sub sp, 0x10\n\ - mov r12, r0\n\ - ldr r0, [sp, 0x24]\n\ - ldr r4, [sp, 0x28]\n\ - str r4, [sp, 0xC]\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - lsls r2, 16\n\ - lsrs r4, r2, 16\n\ - lsls r3, 24\n\ - lsrs r6, r3, 24\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r0, _08072AF8 @ =gMenuWindowPtr\n\ - ldr r0, [r0]\n\ - ldr r1, _08072AFC @ =gMenuTextTileOffset\n\ - ldrh r3, [r1]\n\ - str r5, [sp]\n\ - str r4, [sp, 0x4]\n\ - str r6, [sp, 0x8]\n\ - movs r1, 0\n\ - mov r2, r12\n\ - bl sub_8004FD0\n\ - adds r1, r0, 0\n\ - lsls r1, 24\n\ - lsrs r2, r1, 24\n\ - movs r3, 0x7\n\ - ands r3, r5\n\ - cmp r3, 0\n\ - bne _08072B00\n\ - adds r1, r6, 0x7\n\ - asrs r1, 3\n\ - subs r1, 0x1\n\ - b _08072B0C\n\ - .align 2, 0\n\ -_08072AF8: .4byte gMenuWindowPtr\n\ -_08072AFC: .4byte gMenuTextTileOffset\n\ -_08072B00:\n\ - adds r3, r6, r3\n\ - subs r1, r3, 0x1\n\ - cmp r1, 0\n\ - bge _08072B0A\n\ - adds r1, r3, 0x6\n\ -_08072B0A:\n\ - asrs r1, 3\n\ -_08072B0C:\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r6, r1, 0\n\ - lsrs r5, 3\n\ - adds r1, r7, 0x7\n\ - asrs r1, 3\n\ - lsls r1, 24\n\ - lsrs r7, r1, 24\n\ - lsrs r4, 3\n\ - cmp r2, r7\n\ - bcs _08072B3E\n\ - lsls r1, r2, 1\n\ - adds r1, r4, r1\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r2, r5, r6\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - adds r3, r7, r4\n\ - subs r3, 0x1\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - adds r0, r5, 0\n\ - bl Menu_BlankWindowRect\n\ -_08072B3E:\n\ - add sp, 0x10\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif - -void MenuPrint_RightAligned(const u8 *str, u8 left, u8 top) -{ - Text_InitWindow8004D38(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); -} - -void sub_8072B80(const u8 *a1, u8 a2, u8 a3, const u8 *a4) -{ - u8 buffer[64]; - u8 width = GetStringWidth(gMenuWindowPtr, a4); - AlignString(gMenuWindowPtr, buffer, a1, width, 1); - Text_InitWindowAndPrintText(gMenuWindowPtr, buffer, gMenuTextTileOffset, a2, a3); -} - -void sub_8072BD8(const u8 *a1, u8 a2, u8 a3, u16 a4) -{ - Text_InitWindow8004DB0(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3, a4); -} - -u8 *sub_8072C14(u8 *a1, s32 a2, u8 a3, u8 a4) -{ - return AlignInt1(gMenuWindowPtr, a1, a2, a3, a4); -} - -u8 *sub_8072C44(u8 *a1, s32 a2, u8 a3, u8 a4) -{ - return AlignInt2(gMenuWindowPtr, a1, a2, a3, a4); -} - -u8 *sub_8072C74(u8 *a1, const u8 *a2, u8 a3, u8 a4) -{ - return AlignString(gMenuWindowPtr, a1, a2, a3, a4); -} - -u8 sub_8072CA4(const u8 *str) -{ - return GetStringWidth(gMenuWindowPtr, str); -} - -u8 Menu_GetTextWindowPaletteNum(void) -{ - return Text_GetWindowPaletteNum(gMenuWindowPtr); -} - -void Menu_GetTextColors(u8 *a1, u8 *a2, u8 *a3) -{ - Text_GetTextColors(gMenuWindowPtr, a1, a2, a3); -} - -u32 Menu_UpdateWindowTextOverrideLineLength(u8 lineLength) -{ - return Text_UpdateWindowOverrideLineLength(gMenuWindowPtr, lineLength); -} - -struct Window *unref_sub_8072D0C(void) -{ - return gMenuWindowPtr; -} - -static void sub_8072D18(u8 a1, u8 a2) -{ - MenuCursor_Create814A5C0(a1, 0xFFFF, 12, 11679, 8 * a2); -} - -u8 InitMenu(u8 cursorSubpriority, u8 left, u8 top, u8 numChoices, u8 cursorPos, u8 cursorWidth) -{ - s32 pos; - - if (cursorWidth) - sub_8072D18(cursorSubpriority, cursorWidth); - - gMenu.left = left - 1; - gMenu.top = top; - gMenu.minCursorPos = 0; - gMenu.maxCursorPos = numChoices - 1; - gMenu.menu_field_7 = 0; - - pos = cursorPos; - - if (pos < 0 || pos > gMenu.maxCursorPos) - pos = 0; - - gMenu.cursorPos = pos; - Menu_MoveCursor(0); - - return pos; -} - -static void RedrawMenuCursor(u8 x, u8 y) -{ - MenuCursor_SetPos814A880((x + 1) * 8, 8 * y); -} - -void unref_sub_8072DC0() -{ - sub_814A904(); -} - -void sub_8072DCC(u8 a1) -{ - sub_814A958(a1); -} - -void sub_8072DDC(u8 a1) -{ - sub_8072DCC(8 * a1); -} - -void Menu_DestroyCursor(void) -{ - DestroyMenuCursor(); -} - -#if GERMAN -void de_sub_8073110(u8 * buffer, u8 * name) { - u8 * ptr, *ptr2, *ptr3; - - ptr2 = buffer; - ptr = &gStringVar1[1 + StringLengthN(gStringVar1, 256)]; - ptr3 = ptr; - - for (;;) - { - if (*ptr2 == EOS) - break; - - if (*ptr2 == 0xFD) - { - - *ptr3 = EOS; - ptr2 += 2; - - StringAppend(ptr, name); - StringAppend(ptr, ptr2); - - buffer[0] = EOS; - StringAppend(buffer, ptr); - break; - } - - *ptr3 = *ptr2; - ptr2 += 1; - ptr3 += 1; - } -} - -u8 *de_sub_8073174(u8 *name, const u8 *format) { - u32 offset; - u8 *ptr; - - offset = StringLengthN(gStringVar2, 0x100); - ptr = &gStringVar2[1 + offset]; - - StringCopy(ptr, format); - - de_sub_8073110(ptr, name); - - return StringCopy(name, ptr); -} -#endif diff --git a/src/engine/menu_cursor.c b/src/engine/menu_cursor.c deleted file mode 100644 index 35116d40b..000000000 --- a/src/engine/menu_cursor.c +++ /dev/null @@ -1,781 +0,0 @@ -#include "global.h" -#include "menu_cursor.h" -#include "palette.h" -#include "sprite.h" - -EWRAM_DATA static u16 gUnknown_0203A360[0x10] = {}; -EWRAM_DATA static struct Subsprite gMenuCursorSubsprites[10] = {0}; -EWRAM_DATA static u8 gUnknown_0203A3D0 = 0; -EWRAM_DATA static u8 gUnknown_0203A3D1 = 0; -EWRAM_DATA static u8 gUnknown_0203A3D2 = 0; -EWRAM_DATA static u8 gUnknown_0203A3D3 = 0; -EWRAM_DATA static u8 gUnknown_0203A3D4 = 0; - -#if ENGLISH -#include "../src/data/menu_cursor_en.h" -#elif GERMAN -#include "../src/data/menu_cursor_de.h" -#endif // ENGLISH/GERMAN - -void sub_814A590(void) -{ - gUnknown_0203A3D0 = 0x40; - gUnknown_0203A3D1 = 0x40; - gUnknown_0203A3D2 = 0x40; - gUnknown_0203A3D3 = 0; - gUnknown_0203A3D4 = 0; -} - -u8 MenuCursor_Create814A5C0(u8 subpriority, u16 paletteTag, u8 a3, u16 a4, u8 a5) -{ - int v9; - struct Sprite *v10; - - if (gUnknown_0203A3D0 != 0x40 || gUnknown_0203A3D1 != 0x40) - DestroyMenuCursor(); - - v9 = 1; - if (paletteTag == 0xFFFF) - { - gUnknown_0203A360[a3 & 0xF] = a4; - if (LoadSpritePalette(&gUnknown_0842F240) != 0xFF) - { - paletteTag = 0xFFF0; - v9 = 0; - } - } - - LoadSpriteSheetDeferred(&gUnknown_0842F140[a3 & 0xF]); - gUnknown_0203A3D0 = CreateSprite(&gSpriteTemplate_842F250[v9], 0, 160, subpriority); - gUnknown_0203A3D1 = CreateSprite(&gSpriteTemplate_842F250[2], 0, 160, subpriority); - if (gUnknown_0203A3D0 != 0x40) - { - v10 = &gSprites[gUnknown_0203A3D0]; - if (paletteTag == 0xFFFF) - v10->oam.paletteNum = 0; - else - v10->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); - } - if (gUnknown_0203A3D1 != 0x40) - { - v10 = &gSprites[gUnknown_0203A3D1]; - if (paletteTag == 0xFFFF) - v10->oam.paletteNum = 0; - else - v10->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); - - if (!(REG_DISPCNT & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON))) - *(u8 *)(REG_ADDR_WINOUT) |= 0x1F; - gUnknown_0203A3D3 = REG_DISPCNT >> 0xF; - gUnknown_0203A3D4 = *(u8 *)(REG_BASE + REG_OFFSET_WINOUT + 1); - REG_DISPCNT |= DISPCNT_OBJWIN_ON; - *(u8 *)(REG_ADDR_WINOUT + 1) = 0x10; - } - sub_814A958(a5); - return gUnknown_0203A3D0; -} - -// unused -u8 sub_814A758(u8 subpriority, u8 a2, u8 a3, u8 a4) -{ - u8 result; - struct Sprite *spr; - - result = MenuCursor_Create814A5C0(subpriority, 0, a3, 0, a4); - if (result != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - spr->oam.paletteNum = a2; - } - return result; -} - -u8 unref_sub_814A7AC(u8 a1, u16 a2, u8 a3) -{ - u16 i; - u8 val1 = 0; - u16 val2 = 0xF; - - for (i = 0; i <= 0xFF; i++) - { - if (gPlttBufferUnfaded[i] == a2) - { - val1 = (u8)(i >> 4); - val2 = i & 0xF; - } - } - - return sub_814A758(a1, val1, val2, a3); -} - -void DestroyMenuCursor(void) -{ - if (gUnknown_0203A3D0 != 0x40) - { - LoadTilesForSpriteSheet(&gUnknown_0842F140[0]); - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D0]); - gUnknown_0203A3D0 = 0x40; - } - - if (gUnknown_0203A3D1 != 0x40) - { - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D1]); - gUnknown_0203A3D1 = 0x40; - if (!gUnknown_0203A3D3) - REG_DISPCNT &= ~DISPCNT_OBJWIN_ON; - *(u8 *)(REG_BASE + REG_OFFSET_WINOUT + 1) = gUnknown_0203A3D4; - } - - return; -} - -void MenuCursor_SetPos814A880(u8 a1, u8 a2) -{ - struct Sprite *spr; - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - spr->invisible = 0; - spr->centerToCornerVecX = 0; - spr->centerToCornerVecY = 0; - spr->pos1.x = a1; - spr->pos1.y = a2; - } - - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - spr->invisible = 0; - spr->centerToCornerVecX = 0; - spr->centerToCornerVecY = 0; - spr->pos1.x = a1; - spr->pos1.y = a2; - } - - return; -} - -void sub_814A904(void) -{ - struct Sprite *spr; - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - spr->invisible = 1; - } - - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - spr->invisible = 1; - } - - return; -} - -#if ENGLISH -#ifdef NONMATCHING -// Fix pls -void sub_814A958(u8 a) -{ - u8 r7; - struct Subsprite *r4 = &gMenuCursorSubsprites[0]; - s16 r2 = -1; - s32 _a = a; - s16 r5; - s16 i; - - *r4 = (struct Subsprite){.x = 0, .y = 0, .shape = 2, .size = 0, .tileOffset = 0, .priority = 0}; - r4->x = r2; - r4++; - r7 = 1; - r2 = 1; - r5 = a; - i = r5; - while ((i -= r2) >= 8) - { - if (i > 0x1F) - { - *r4 = gUnknown_0842F780; - r4->x = r2; - r2 += 32; - r5 = a; - } - //_0814A9D4 - else - { - r5 = a; - if (_a > 0x27 && i > 8) - { - *r4 = gUnknown_0842F780; - r4->x = (r2 - 32) + (i & ~7); - r2 += i & 0x18; - } - //_0814AA0A - else - { - *r4 = gUnknown_0842F788; - r4->x = r2; - r2 += 8; - } - } - //_0814AA20 - r4++; - r7++; - i = r5; - } - //_0814AA3A - *r4 = gUnknown_0842F790; - r4->x = r2 - 7 + i; - r7++; - if (gUnknown_0203A3D0 != 64) - SetSubspriteTables(&gSprites[gUnknown_0203A3D0], gSubspriteTables_842F5C0 + r7); - if (gUnknown_0203A3D1 != 64) - SetSubspriteTables(&gSprites[gUnknown_0203A3D1], gSubspriteTables_842F5C0 + r7); -} -#else -__attribute__((naked)) -void sub_814A958(u8 a1) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - ldr r4, _0814A9C4\n\ - ldr r2, _0814A9C8\n\ - lsrs r0, 24\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - movs r1, 0x2\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - adds r4, 0x8\n\ - movs r7, 0x1\n\ - movs r2, 0x1\n\ - ldr r1, [sp]\n\ - subs r0, r1, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x7\n\ - ble _0814AA3A\n\ - ldr r0, _0814A9CC\n\ - mov r12, r0\n\ - mov r8, r1\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - mov r10, r1\n\ - ldr r5, _0814A9D0\n\ - mov r9, r5\n\ -_0814A99E:\n\ - lsls r0, r3, 16\n\ - asrs r3, r0, 16\n\ - cmp r3, 0x1F\n\ - ble _0814A9D4\n\ - mov r6, r12\n\ - ldr r0, [r6]\n\ - ldr r1, [r6, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - lsls r0, r2, 16\n\ - movs r1, 0x80\n\ - lsls r1, 14\n\ - adds r0, r1\n\ - lsrs r2, r0, 16\n\ - ldr r3, [sp]\n\ - lsls r5, r3, 16\n\ - b _0814AA20\n\ - .align 2, 0\n\ -_0814A9C4: .4byte gMenuCursorSubsprites\n\ -_0814A9C8: .4byte 0x0000ffff\n\ -_0814A9CC: .4byte gUnknown_0842F780\n\ -_0814A9D0: .4byte gUnknown_0842F788\n\ -_0814A9D4:\n\ - ldr r6, [sp]\n\ - lsls r5, r6, 16\n\ - mov r0, r8\n\ - cmp r0, 0x27\n\ - ble _0814AA0A\n\ - cmp r3, 0x8\n\ - ble _0814AA0A\n\ - mov r6, r12\n\ - ldr r0, [r6]\n\ - ldr r1, [r6, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - adds r2, r1, 0\n\ - subs r2, 0x20\n\ - adds r0, r3, 0\n\ - mov r6, r10\n\ - ands r0, r6\n\ - adds r2, r0\n\ - strh r2, [r4]\n\ - movs r0, 0x18\n\ - ands r0, r3\n\ - adds r1, r0\n\ - lsls r1, 16\n\ - lsrs r2, r1, 16\n\ - b _0814AA20\n\ -_0814AA0A:\n\ - mov r3, r9\n\ - ldr r0, [r3]\n\ - ldr r1, [r3, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - lsls r0, r2, 16\n\ - movs r6, 0x80\n\ - lsls r6, 12\n\ - adds r0, r6\n\ - lsrs r2, r0, 16\n\ -_0814AA20:\n\ - adds r4, 0x8\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - asrs r1, r5, 16\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - subs r1, r0\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x7\n\ - bgt _0814A99E\n\ -_0814AA3A:\n\ - ldr r5, _0814AAA8\n\ - ldr r0, [r5]\n\ - ldr r1, [r5, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - subs r1, 0x7\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - adds r0, r1\n\ - strh r0, [r4]\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r6, _0814AAAC\n\ - ldrb r0, [r6]\n\ - cmp r0, 0x40\n\ - beq _0814AA78\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0814AAB0\n\ - adds r2, r0, r1\n\ - lsls r1, r7, 3\n\ - ldr r0, _0814AAB4\n\ - adds r1, r0\n\ - adds r0, r2, 0\n\ - bl SetSubspriteTables\n\ -_0814AA78:\n\ - ldr r1, _0814AAB8\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x40\n\ - beq _0814AA98\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0814AAB0\n\ - adds r2, r0, r1\n\ - lsls r1, r7, 3\n\ - ldr r0, _0814AAB4\n\ - adds r1, r0\n\ - adds r0, r2, 0\n\ - bl SetSubspriteTables\n\ -_0814AA98:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0814AAA8: .4byte gUnknown_0842F790\n\ -_0814AAAC: .4byte gUnknown_0203A3D0\n\ -_0814AAB0: .4byte gSprites\n\ -_0814AAB4: .4byte gSubspriteTables_842F5C0\n\ -_0814AAB8: .4byte gUnknown_0203A3D1\n\ - .syntax divided\n"); -} -#endif -#elif GERMAN -__attribute__((naked)) -void sub_814A958(u8 a1) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - ldr r4, _0814A9C4 @ =gMenuCursorSubsprites\n\ - ldr r2, _0814A9C8 @ =0x0000ffff\n\ - lsrs r0, 24\n\ - str r0, [sp]\n\ - ldr r0, _0814A9CC @ =gUnknown_0842F780\n\ - ldr r1, [r0, 0x4]\n\ - ldr r0, [r0]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - adds r4, 0x8\n\ - movs r7, 0x1\n\ - movs r2, 0x1\n\ - ldr r1, [sp]\n\ - subs r0, r1, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x7\n\ - ble _0814AA3E\n\ - ldr r0, _0814A9D0 @ =gUnknown_0842F788\n\ - mov r12, r0\n\ - mov r8, r1\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - mov r10, r1\n\ - ldr r5, _0814A9D4 @ =gUnknown_0842F790\n\ - mov r9, r5\n\ -_0814A99E:\n\ - lsls r0, r3, 16\n\ - asrs r3, r0, 16\n\ - cmp r3, 0x1F\n\ - ble _0814A9D8\n\ - mov r6, r12\n\ - ldr r0, [r6]\n\ - ldr r1, [r6, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - lsls r0, r2, 16\n\ - movs r1, 0x80\n\ - lsls r1, 14\n\ - adds r0, r1\n\ - lsrs r2, r0, 16\n\ - ldr r3, [sp]\n\ - lsls r5, r3, 16\n\ - b _0814AA24\n\ - .align 2, 0\n\ -_0814A9C4: .4byte gMenuCursorSubsprites\n\ -_0814A9C8: .4byte 0x0000ffff\n\ -_0814A9CC: .4byte gUnknown_0842F780\n\ -_0814A9D0: .4byte gUnknown_0842F788\n\ -_0814A9D4: .4byte gUnknown_0842F790\n\ -_0814A9D8:\n\ - ldr r6, [sp]\n\ - lsls r5, r6, 16\n\ - mov r0, r8\n\ - cmp r0, 0x27\n\ - ble _0814AA0E\n\ - cmp r3, 0x8\n\ - ble _0814AA0E\n\ - mov r6, r12\n\ - ldr r0, [r6]\n\ - ldr r1, [r6, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - adds r2, r1, 0\n\ - subs r2, 0x20\n\ - adds r0, r3, 0\n\ - mov r6, r10\n\ - ands r0, r6\n\ - adds r2, r0\n\ - strh r2, [r4]\n\ - movs r0, 0x18\n\ - ands r0, r3\n\ - adds r1, r0\n\ - lsls r1, 16\n\ - lsrs r2, r1, 16\n\ - b _0814AA24\n\ -_0814AA0E:\n\ - mov r3, r9\n\ - ldr r0, [r3]\n\ - ldr r1, [r3, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - strh r2, [r4]\n\ - lsls r0, r2, 16\n\ - movs r6, 0x80\n\ - lsls r6, 12\n\ - adds r0, r6\n\ - lsrs r2, r0, 16\n\ -_0814AA24:\n\ - adds r4, 0x8\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - asrs r1, r5, 16\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - subs r1, r0\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x7\n\ - bgt _0814A99E\n\ -_0814AA3E:\n\ - ldr r5, _0814AAAC @ =gUnknown_0842F798\n\ - ldr r0, [r5]\n\ - ldr r1, [r5, 0x4]\n\ - str r0, [r4]\n\ - str r1, [r4, 0x4]\n\ - lsls r1, r2, 16\n\ - asrs r1, 16\n\ - subs r1, 0x7\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - adds r0, r1\n\ - strh r0, [r4]\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r6, _0814AAB0 @ =gUnknown_0203A3D0\n\ - ldrb r0, [r6]\n\ - cmp r0, 0x40\n\ - beq _0814AA7C\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0814AAB4 @ =gSprites\n\ - adds r2, r0, r1\n\ - lsls r1, r7, 3\n\ - ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ - adds r1, r0\n\ - adds r0, r2, 0\n\ - bl SetSubspriteTables\n\ -_0814AA7C:\n\ - ldr r1, _0814AABC @ =gUnknown_0203A3D1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x40\n\ - beq _0814AA9C\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0814AAB4 @ =gSprites\n\ - adds r2, r0, r1\n\ - lsls r1, r7, 3\n\ - ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ - adds r1, r0\n\ - adds r0, r2, 0\n\ - bl SetSubspriteTables\n\ -_0814AA9C:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0814AAAC: .4byte gUnknown_0842F798\n\ -_0814AAB0: .4byte gUnknown_0203A3D0\n\ -_0814AAB4: .4byte gSprites\n\ -_0814AAB8: .4byte gSubspriteTables_842F5C0\n\ -_0814AABC: .4byte gUnknown_0203A3D1\n\ - .syntax divided\n"); -} -#endif - -void sub_814AABC(void (*callback)(struct Sprite *)) -{ - struct Sprite *spr; - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - spr->callback = callback; - } - - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - spr->callback = callback; - } - - return; -} - -void sub_814AAF8(u16 a1) -{ - struct Sprite *spr; - u8 v2; - u8 v3; - u16 v4; - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - if (spr->template->paletteTag == 0xFFFF) - { - for (v2 = 0, v3 = 0xF, v4 = 0; v4 <= 0xFF; v4++) - { - if (gPlttBufferUnfaded[v4] == a1) - { - v2 = v4 >> 4; - v3 = v4 & 0xF; - } - } - spr->oam.paletteNum = v2; - RequestSpriteSheetCopy(&gUnknown_0842F140[v3 & 0xF]); - } - } - return; -} - -void sub_814AB84(void) -{ - struct Sprite *spr; - - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - FreeSpriteOamMatrix(spr); - DestroySprite(spr); - gUnknown_0203A3D1 = 0x40; - - if (!gUnknown_0203A3D3) - REG_DISPCNT &= ~DISPCNT_OBJWIN_ON; - *(u8 *)(REG_ADDR_WINOUT + 1) = gUnknown_0203A3D4; - } - return; -} - -void unref_sub_814ABE4(int a1) -{ - struct Sprite *spr; - - CpuCopy16(gUnknown_0842F5BC[a1], &gMenuCursorSubsprites, 80); - - if (gUnknown_0203A3D0 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D0]; - SetSubspriteTables(spr, &gUnknown_0842F758[a1]); - } - if (gUnknown_0203A3D1 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D1]; - SetSubspriteTables(spr, &gUnknown_0842F758[a1]); - } - return; -} - -u8 CreateBlendedOutlineCursor(u8 subpriority, u16 paletteTag, u8 a3, u16 a4, u8 a5) -{ - int v8; - struct Sprite *spr; - - if (gUnknown_0203A3D2 != 0x40) - MenuCursor_Destroy814AD44(); - - v8 = 1; - - if (paletteTag == 0xFFFF) - { - gUnknown_0203A360[a3 & 0xF] = a4; - if (LoadSpritePalette(&gUnknown_0842F248) != 0xFF ) - { - paletteTag = 0xFFF1; - v8 = 0; - } - } - - LoadSpriteSheetDeferred(&gUnknown_0842F1C0[a3 & 0xF]); -#if ENGLISH - gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 160, subpriority); -#elif GERMAN - gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 161, subpriority); -#endif - - if (gUnknown_0203A3D2 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D2]; - - if (paletteTag == 0xFFFF) - spr->oam.paletteNum = 0; - else - spr->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); - } - sub_814ADF4(a5); - - return gUnknown_0203A3D2; -} - -void MenuCursor_Destroy814AD44(void) -{ - if (gUnknown_0203A3D2 != 0x40) - { - LoadTilesForSpriteSheet(&gUnknown_0842F1C0[0]); - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D2]); - gUnknown_0203A3D2 = 0x40; - } - return; -} - -void MenuCursor_SetPos814AD7C(u8 a1, u8 a2) -{ - struct Sprite *spr; - if (gUnknown_0203A3D2 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D2]; - spr->invisible = 0; - spr->centerToCornerVecX = 0; - spr->centerToCornerVecY = 0; - spr->pos1.x = a1; - spr->pos1.y = a2; - } - return; -} - -void sub_814ADC8() -{ - struct Sprite *spr; - if (gUnknown_0203A3D2 != 0x40) - { - spr = &gSprites[gUnknown_0203A3D2]; - spr->invisible = 1; - } - return; -} - -void sub_814ADF4(u8 a1) -{ - if (a1 > 0x12) - a1 = 0; - - if (gUnknown_0203A3D2 != 0x40) - SetSubspriteTables(&gSprites[gUnknown_0203A3D2], &gSubspriteTables_842F6C0[a1]); - return; -} - -#if GERMAN -void nullsub_814B200(void) -{ -} -#endif diff --git a/src/engine/mystery_event_menu.c b/src/engine/mystery_event_menu.c deleted file mode 100644 index 56801ff53..000000000 --- a/src/engine/mystery_event_menu.c +++ /dev/null @@ -1,494 +0,0 @@ -#include "global.h" -#include "mystery_event_menu.h" -#include "link.h" -#include "main.h" -#include "menu.h" -#include "mystery_event_script.h" -#include "palette.h" -#include "save.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "title_screen.h" -#include "ewram.h" - -static EWRAM_DATA u8 gUnknown_02039338 = 0; - -static void VBlankCB(void); -static bool8 CheckLanguageMatch(void); -static bool8 GetEventLoadMessage(u8 *dest, u32 status); -static void CB2_MysteryEventMenu(void); - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static bool8 CheckLanguageMatch(void) -{ - bool8 val = FALSE; - - if (gLinkPlayers[0].language == gLinkPlayers[1].language) - val = TRUE; - - return val; -} - -void CB2_InitMysteryEventMenu(void) -{ - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - SetVBlankCallback(VBlankCB); - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - Menu_EraseScreen(); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; - REG_BLDCNT = 0; - CreateTask(Task_DestroySelf, 0); - StopMapMusic(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - FillPalette(0, 0, 2); - SetMainCallback2(CB2_MysteryEventMenu); -} - -static bool8 GetEventLoadMessage(u8 *dest, u32 status) -{ - bool8 retVal = 1; - - if (status == 0) - { - StringCopy(dest, gSystemText_EventLoadSuccess); - retVal = 0; - } - - if (status == 2) - retVal = 0; - - if (status == 1) - StringCopy(dest, gSystemText_LoadingError); - - return retVal; -} - -static void CB2_MysteryEventMenu(void) -{ - u16 unkVal; - - switch (gMain.state) - { - case 0: - Menu_DrawStdWindowFrame(0, 14, 29, 19); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); - gMain.state++; - break; - case 1: - if (gPaletteFade.active) - break; - MenuPrintMessageDefaultCoords(gSystemText_LinkStandby); - gMain.state++; - break; - case 2: - if (Menu_UpdateWindowText()) - { - gMain.state++; - gLinkType = 21761; - OpenLink(); - } - break; - case 3: - if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4) - { - PlaySE(SE_PIN); - MenuPrintMessageDefaultCoords(gSystemText_LoadEventPressA); - gMain.state++; - } - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - } - break; - case 4: - if (Menu_UpdateWindowText()) - gMain.state++; - break; -#ifdef NONMATCHING - case 5: - if (GetLinkPlayerCount_2() != 2) - { - GetEventLoadMessage(gStringVar4, 1); - MenuPrintMessageDefaultCoords(gStringVar4); - gMain.state = 13; - break; - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8007F4C(); - Menu_DrawStdWindowFrame(6, 5, 23, 8); - Menu_PrintText(gSystemText_LoadingEvent, 7, 6); - gMain.state++; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - } - break; - case 6: - if (IsLinkConnectionEstablished()) - { - if (!gReceivedRemoteLinkPlayers) - break; - - if (GetLinkPlayerDataExchangeStatusTimed() == 3) - { - sub_800832C(); - Menu_EraseWindowRect(6, 5, 23, 8); - GetEventLoadMessage(gStringVar4, 1); - MenuPrintMessageDefaultCoords(gStringVar4); - gMain.state = 13; - break; - } - else if (CheckLanguageMatch()) - { - MenuPrintMessageDefaultCoords(gSystemText_DontCutLink); - gMain.state++; - break; - } - else - { - CloseLink(); - Menu_EraseWindowRect(6, 5, 23, 8); - GetEventLoadMessage(gStringVar4, 1); - MenuPrintMessageDefaultCoords(gStringVar4); - gMain.state = 13; - break; - } - } - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - break; - } - break; -#else - case 5: - if (GetLinkPlayerCount_2() != 2) - { - goto label; - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_8007F4C(); - Menu_DrawStdWindowFrame(6, 5, 23, 8); - Menu_PrintText(gSystemText_LoadingEvent, 7, 6); - gMain.state++; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - } - break; - case 6: - if (IsLinkConnectionEstablished()) - { - register u8 *ptr asm("r0"); - register u32 offset1 asm("r2"); - register u32 offset2 asm("r1"); - - if (!gReceivedRemoteLinkPlayers) - break; - - if (GetLinkPlayerDataExchangeStatusTimed() == 3) - { - sub_800832C(); - Menu_EraseWindowRect(6, 5, 23, 8); - GetEventLoadMessage(gStringVar4, 1); - MenuPrintMessageDefaultCoords(gStringVar4); - ptr = (u8 *)&gMain; - offset1 = offsetof(struct Main, state); - asm("" ::: "r1"); - ptr += offset1; - *ptr = 13; - } - else if (CheckLanguageMatch()) - { - register u8 *ptr2 asm("r1"); - register int offset3 asm("r0"); - register int dummy asm("r2"); - MenuPrintMessageDefaultCoords(gSystemText_DontCutLink); - ptr2 = (u8 *)&gMain; - offset3 = offsetof(struct Main, state); - if (dummy) - dummy++; - ptr2 += offset3; - (*ptr2)++; - break; - } - else - { - CloseLink(); - Menu_EraseWindowRect(6, 5, 23, 8); - label: - GetEventLoadMessage(gStringVar4, 1); - MenuPrintMessageDefaultCoords(gStringVar4); - ptr = (u8 *)&gMain; - offset2 = offsetof(struct Main, state); - ptr += offset2; - *ptr = 13; - } - break; - } - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - CloseLink(); - gMain.state = 15; - break; - } - break; -#endif - case 7: - if (Menu_UpdateWindowText()) - gMain.state++; - break; - case 8: - if (GetBlockReceivedStatus()) - { - ResetBlockReceivedFlags(); - gMain.state++; - } - break; - case 9: - gMain.state++; - break; - case 10: - sub_800832C(); - gMain.state++; - break; - case 11: - if (gReceivedRemoteLinkPlayers) - break; - unkVal = RunMysteryEventScript(gSharedMem); - CpuFill32(0, gSharedMem, 0x7D4); - if (!GetEventLoadMessage(gStringVar4, unkVal)) - Save_WriteData(SAVE_NORMAL); - gMain.state++; - break; - case 12: - MenuPrintMessageDefaultCoords(gStringVar4); - gMain.state++; - break; - case 13: - Menu_EraseWindowRect(6, 5, 23, 8); - if (Menu_UpdateWindowText()) - { - gMain.state++; - gUnknown_02039338 = 0; - } - break; - case 14: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gMain.state++; - } - break; - case 15: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - gMain.state++; - break; - case 16: - if (!gPaletteFade.active) - DoSoftReset(); - break; - } - - if (gLinkStatus & 0x40) - { - if (!IsLinkMaster()) - { - CloseLink(); - Menu_EraseWindowRect(6, 5, 23, 8); - GetEventLoadMessage(gStringVar4, 1); - MenuPrintMessageDefaultCoords(gStringVar4); - gMain.state = 13; - } - } - - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -#if DEBUG - -static const u8 Str_843DA70[] = _("CARDーE emulation。。。"); -static const u8 Str_843DA84[] = _("LR: select A: send。"); -static const u8 Str_843DA98[] = _("sending。。。"); -static const u8 Str_843DAA3[] = _("completed。"); - -extern const struct {const u8 *text; void (*func)();} gUnknown_Debug_842E2D0[]; -extern const u8 gUnknown_Debug_842E350; - -void debug_sub_815D1D8(); - -void debug_sub_815D04C(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - { - Menu_DrawStdWindowFrame(4, 4, 13, 7); - Menu_PrintText(gUnknown_Debug_842E2D0[gTasks[taskId].data[1]].text, 5, 5); - gTasks[taskId].data[0]++; - } - - if (gMain.newKeys & 0x20) - { - if (gTasks[taskId].data[1] == 0) - gTasks[taskId].data[1] = gUnknown_Debug_842E350 - 1; - else - gTasks[taskId].data[1]--; - gTasks[taskId].data[0] = 0; - } - if (gMain.newKeys & 0x10) - { - if (gTasks[taskId].data[1] == gUnknown_Debug_842E350 - 1) - gTasks[taskId].data[1] = 0; - else - gTasks[taskId].data[1]++; - gTasks[taskId].data[0] = 0; - } - if (gMain.newKeys & A_BUTTON) - { - // TODO: fix this - s32 var = gTasks[taskId].data[1]; - asm(""::"r"(var * 8)); - gUnknown_Debug_842E2D0[var].func(gSharedMem + 0x4000); - - gMain.state++; - DestroyTask(taskId); - } -} - -void debug_sub_815D15C(void) -{ - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - SetVBlankCallback(VBlankCB); - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - Menu_EraseScreen(); - REG_DISPCNT = DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; - REG_BLDCNT = 0; - - CreateTask(Task_DestroySelf, 0); - StopMapMusic(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - FillPalette(0, 0, 2); - SetMainCallback2(debug_sub_815D1D8); -} - -void debug_sub_815D1D8(void) -{ - switch (gMain.state) - { - case 0: - Menu_DrawStdWindowFrame(3, 14, 27, 19); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - gMain.state++; - break; - case 1: - if (!gPaletteFade.active) - { - if (gMain.heldKeys & 0x100) - gUnknown_Debug_30030E0++; - MenuPrintMessage(Str_843DA70, 4, 15); - gMain.state++; - } - break; - case 2: - if (Menu_UpdateWindowText()) - { - gMain.state++; - gLinkType = 0x5501; - OpenLink(); - } - break; - case 3: - if (gReceivedRemoteLinkPlayers != 0) - { - gMain.state++; - MenuPrintMessage(Str_843DA84, 4, 15); - } - break; - case 4: - if (Menu_UpdateWindowText()) - { - CreateTask(debug_sub_815D04C, 10); - gMain.state++; - } - break; - case 6: - MenuPrintMessage(Str_843DA98, 4, 15); - SendBlock(0, gSharedMem + 0x4000, 0x2004); - gMain.state++; - break; - case 7: - Menu_UpdateWindowText(); - if (IsLinkTaskFinished()) - gMain.state++; - break; - case 8: - sub_800832C(); - gMain.state++; - break; - case 9: - if (gReceivedRemoteLinkPlayers == 0) - { - Menu_BlankWindowRect(4, 15, 26, 18); - Menu_PrintText(Str_843DAA3, 4, 15); - gMain.state++; - } - break; - case 10: - if (gMain.newKeys & A_BUTTON) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gMain.state++; - } - break; - case 11: - if (!gPaletteFade.active) - SetMainCallback2(CB2_InitTitleScreen); - break; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -#endif diff --git a/src/engine/mystery_event_msg.c b/src/engine/mystery_event_msg.c deleted file mode 100644 index 03ef22727..000000000 --- a/src/engine/mystery_event_msg.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "global.h" - -#if ENGLISH - -const u8 gOtherText_BerryObtainedDadHasIt[] = _("Obtained a {STR_VAR_2} BERRY!\nDad has it at PETALBURG GYM."); - -const u8 gOtherText_BerryTransformed[] = _("The {STR_VAR_1} BERRY transformed into\none {STR_VAR_2} BERRY."); - -const u8 gOtherText_BerryAlreadyObtained[] = _("The {STR_VAR_1} BERRY has already been\nobtained."); - -const u8 gOtherText_SpecialRibbonReceived[] = _("A special RIBBON was awarded to your\nparty POKéMON."); - -const u8 gOtherText_DexUpgraded[] = _("The POKéDEX has been upgraded with\nthe NATIONAL MODE."); - -const u8 gOtherText_RareWordAdded[] = _("A rare word has been added."); - -const u8 gOtherText_PokeWasSentOver[] = _("{STR_VAR_1} was sent over!"); - -const u8 gOtherText_PartyIsFull[] = _("Your party is full.\n{STR_VAR_1} could not be sent over."); - -const u8 gOtherText_NewTrainerInHoenn[] = _("A new TRAINER has arrived in HOENN."); - -const u8 gOtherText_NewAdversaryInBattleTower[] = _("A new adversary has arrived in the\nBATTLE TOWER."); - -const u8 gOtherText_DataCannotUseVersion[] = _("This data cannot be used in\nthis version."); - -#elif GERMAN - -const u8 gOtherText_BerryObtainedDadHasIt[] = _("Eine {STR_VAR_2}BEERE! Vater in der \nARENA von BLÜTENBURG CITY besitzt\lauch eine."); - -const u8 gOtherText_BerryTransformed[] = _("Die {STR_VAR_1}BEERE verwandelte\nsich in eine {STR_VAR_2}BEERE!"); - -const u8 gOtherText_BerryAlreadyObtained[] = _("Du hast schon eine {STR_VAR_1}BEERE."); - -const u8 gOtherText_SpecialRibbonReceived[] = _("Ein besonderes BAND wurde deinem\nPOKéMON im Team verliehen."); - -const u8 gOtherText_DexUpgraded[] = _("Der POKéDEX wurde mit dem NATIONALEN\nMODUS ausgerüstet."); - -const u8 gOtherText_RareWordAdded[] = _("Ein seltenes Wort wurde hinzugefügt."); - -const u8 gOtherText_PokeWasSentOver[] = _("{STR_VAR_1} wurde gesendet!"); - -const u8 gOtherText_PartyIsFull[] = _("Dein Team ist bereits vollständig.\n{STR_VAR_1} kann nicht gesendet\lwerden."); - -const u8 gOtherText_NewTrainerInHoenn[] = _("Ein neuer TRAINER ist in HOENN\nangekommen."); - -const u8 gOtherText_NewAdversaryInBattleTower[] = _("Ein neuer Widersacher ist im DUELLTURM\neingetroffen."); - -const u8 gOtherText_DataCannotUseVersion[] = _("Die Daten können in dieser Edition\nnicht eingesetzt werden."); - -#endif // ENGLISH/GERMAN diff --git a/src/engine/mystery_event_script.c b/src/engine/mystery_event_script.c deleted file mode 100644 index 6fcad66ac..000000000 --- a/src/engine/mystery_event_script.c +++ /dev/null @@ -1,452 +0,0 @@ -#include "global.h" -#include "berry.h" -#include "battle_tower.h" -#include "easy_chat.h" -#include "event_data.h" -#include "mail_data.h" -#include "mystery_event_script.h" -#include "pokedex.h" -#include "pokemon.h" -#include "pokemon_size_record.h" -#include "script.h" -#include "constants/species.h" -#include "strings.h" -#include "string_util.h" -#include "text.h" -#include "util.h" -#include "mystery_event_msg.h" - -#if ENGLISH -#define LANGUAGE_MASK 0x2 -#elif GERMAN -#define LANGUAGE_MASK 0x4 -#endif - -#ifdef SAPPHIRE -#define VERSION_MASK 0x100 -#else -#define VERSION_MASK 0x80 -#endif - -extern void party_compaction(void); - -extern ScrCmdFunc gMysteryEventScriptCmdTable[]; -extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[]; - -static EWRAM_DATA struct ScriptContext sMysteryEventScriptContext = {0}; - -static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4) -{ - if (!(a1 & LANGUAGE_MASK)) - return FALSE; - - if (!(a2 & LANGUAGE_MASK)) - return FALSE; - - if (!(a3 & 0x4)) - return FALSE; - - if (!(a4 & VERSION_MASK)) - return FALSE; - - return TRUE; -} - -static void SetIncompatible(void) -{ - StringExpandPlaceholders(gStringVar4, gOtherText_DataCannotUseVersion); - SetMysteryEventScriptStatus(3); -} - -static void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script) -{ - InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd); - SetupBytecodeScript(ctx, script); - ctx->data[0] = (u32)script; - ctx->data[1] = 0; - ctx->data[2] = 0; - ctx->data[3] = 0; -} - -static bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx) -{ - if (RunScriptCommand(ctx) && ctx->data[3]) - return TRUE; - else - return FALSE; -} - -u32 RunMysteryEventScript(u8 *script) -{ - struct ScriptContext *ctx = &sMysteryEventScriptContext; - InitMysteryEventScript(ctx, script); - while (RunMysteryEventScriptCommand(ctx)) - ; - return ctx->data[2]; -} - -void SetMysteryEventScriptStatus(u32 val) -{ - sMysteryEventScriptContext.data[2] = val; -} - -static int CalcChecksum(u8 *data, int size) -{ - unsigned int i; - int sum = 0; - - for (i = 0; i < size; i++) - sum += data[i]; - - return sum; -} - -static u32 GetWord(u8 *ptr) -{ - return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); -} - -static void SetWord(u8 *ptr, u32 val) -{ - ptr[0] = val; - ptr[1] = val >> 8; - ptr[2] = val >> 16; - ptr[3] = val >> 24; -} - -bool8 unref_sub_81261B4(u8 *a1, int a2) -{ - if (a1[0x0] == 1 && a1[0x11] == 15 && !GetWord(a1 + 0x12)) - { - int v4 = GetWord(a1 + 0x16) - a2 + (int)a1; - int v5 = GetWord(a1 + 0x1A); - int v6 = CalcChecksum((u8*)v4, v5 - a2 + (int)a1 - v4); - SetWord(a1 + 0x12, v6); - return TRUE; - } - - return FALSE; -} - -bool8 unref_sub_812620C(u8 *a1, int a2) -{ - if (a1[0x0] == 1 && a1[0x11] == 16 && !GetWord(a1 + 0x12)) - { - int v4 = GetWord(a1 + 0x16) - a2 + (int)a1; - int v5 = GetWord(a1 + 0x1A); - int v6 = CalcCRC16((u8*)v4, v5 - a2 + (int)a1 - v4); - SetWord(a1 + 0x12, v6); - return TRUE; - } - - return FALSE; -} - -static u32 CalcRecordMixingGiftChecksum(void) -{ - u32 sum = 0; - int i; - char *data = (char *)&gSaveBlock1.recordMixingGift.data; - - for (i = 0; i < sizeof(gSaveBlock1.recordMixingGift.data); i++) - { - sum += data[i]; - } - - return sum; -} - -static bool32 IsRecordMixingGiftValid(void) -{ - struct RecordMixingGiftData *data = &gSaveBlock1.recordMixingGift.data; - - u32 checksum = CalcRecordMixingGiftChecksum(); - - if (!data->unk0) - return FALSE; - - if (!data->quantity) - return FALSE; - - if (!data->itemId) - return FALSE; - - if (checksum == 0) - return FALSE; - - if (checksum == gSaveBlock1.recordMixingGift.checksum) - return TRUE; - else - return FALSE; -} - -static void ClearRecordMixingGift(void) -{ - CpuFill16(0, &gSaveBlock1.recordMixingGift, sizeof(gSaveBlock1.recordMixingGift)); -} - -static void SetRecordMixingGift(u8 unk, u8 quantity, u16 itemId) -{ - if (!unk || !quantity || !itemId) - { - ClearRecordMixingGift(); - } - else - { - gSaveBlock1.recordMixingGift.data.unk0 = unk; - gSaveBlock1.recordMixingGift.data.quantity = quantity; - gSaveBlock1.recordMixingGift.data.itemId = itemId; - gSaveBlock1.recordMixingGift.checksum = CalcRecordMixingGiftChecksum(); - } -} - -u16 GetRecordMixingGift(void) -{ - struct RecordMixingGiftData *data = &gSaveBlock1.recordMixingGift.data; - - if (!IsRecordMixingGiftValid()) - { - ClearRecordMixingGift(); - return 0; - } - else - { - u16 itemId = data->itemId; - data->quantity--; - if (data->quantity == 0) - ClearRecordMixingGift(); - else - gSaveBlock1.recordMixingGift.checksum = CalcRecordMixingGiftChecksum(); - return itemId; - } -} - -bool8 MEScrCmd_end(struct ScriptContext *ctx) -{ - StopScript(ctx); - return TRUE; -} - -bool8 MEScrCmd_checkcompat(struct ScriptContext *ctx) -{ - u16 v1; - u32 v2; - u16 v3; - u32 v4; - - ctx->data[1] = ScriptReadWord(ctx); - v1 = ScriptReadHalfword(ctx); - v2 = ScriptReadWord(ctx); - v3 = ScriptReadHalfword(ctx); - v4 = ScriptReadWord(ctx); - - if (CheckCompatibility(v1, v2, v3, v4) == TRUE) - ctx->data[3] = 1; - else - SetIncompatible(); - - return TRUE; -} - -bool8 MEScrCmd_nop(struct ScriptContext *ctx) -{ - return FALSE; -} - -bool8 MEScrCmd_setstatus(struct ScriptContext *ctx) -{ - u8 value = ScriptReadByte(ctx); - ctx->data[2] = value; - return FALSE; -} - -bool8 MEScrCmd_setmsg(struct ScriptContext *ctx) -{ - u8 value = ScriptReadByte(ctx); - u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - if (value == 255 || value == ctx->data[2]) - StringExpandPlaceholders(gStringVar4, str); - return FALSE; -} - -bool8 MEScrCmd_runscript(struct ScriptContext *ctx) -{ - u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - ScriptContext2_RunNewScript(script); - return FALSE; -} - -bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx) -{ - u8 *str; - const u8 *message; - bool32 haveBerry = IsEnigmaBerryValid(); - u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - StringCopyN(gStringVar1, gSaveBlock1.enigmaBerry.berry.name, 7); - SetEnigmaBerry(berry); - StringCopyN(gStringVar2, gSaveBlock1.enigmaBerry.berry.name, 7); - - if (!haveBerry) - { - str = gStringVar4; - message = gOtherText_BerryObtainedDadHasIt; - } - else if (StringCompare(gStringVar1, gStringVar2)) - { - str = gStringVar4; - message = gOtherText_BerryTransformed; - } - else - { - str = gStringVar4; - message = gOtherText_BerryAlreadyObtained; - } - - StringExpandPlaceholders(str, message); - - ctx->data[2] = 2; - - if (IsEnigmaBerryValid() == TRUE) - VarSet(VAR_ENIGMA_BERRY_AVAILABLE, 1); - else - ctx->data[2] = 1; - - return FALSE; -} - -bool8 MEScrCmd_giveribbon(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - u8 ribbonId = ScriptReadByte(ctx); - GiveGiftRibbonToParty(index, ribbonId); - StringExpandPlaceholders(gStringVar4, gOtherText_SpecialRibbonReceived); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_initramscript(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 objectId = ScriptReadByte(ctx); - u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId); - return FALSE; -} - -bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx) -{ - EnableNationalPokedex(); - StringExpandPlaceholders(gStringVar4, gOtherText_DexUpgraded); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_addrareword(struct ScriptContext *ctx) -{ - sub_80EB890(ScriptReadByte(ctx)); - StringExpandPlaceholders(gStringVar4, gOtherText_RareWordAdded); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx) -{ - u8 unk = ScriptReadByte(ctx); - u8 quantity = ScriptReadByte(ctx); - u16 itemId = ScriptReadHalfword(ctx); - SetRecordMixingGift(unk, quantity, itemId); - return FALSE; -} - -bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) -{ - struct MailStruct mail; - struct Pokemon pokemon; - u16 species; - u16 heldItem; - u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; - void *pokemonPtr = (void *)data; - void *mailPtr = (void *)(data + sizeof(struct Pokemon)); - - pokemon = *(struct Pokemon *)pokemonPtr; - species = GetMonData(&pokemon, MON_DATA_SPECIES2); - - if (species == SPECIES_EGG) - StringCopyN(gStringVar1, gSystemText_Egg, 11); - else - StringCopyN(gStringVar1, gSystemText_Pokemon2, 11); - - if (gPlayerPartyCount == 6) - { - StringExpandPlaceholders(gStringVar4, gOtherText_PartyIsFull); - ctx->data[2] = 3; - } - else - { - memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon)); - memcpy(&mail, mailPtr, sizeof(struct MailStruct)); - - if (species != SPECIES_EGG) - { - u16 pokedexNum = SpeciesToNationalPokedexNum(species); - GetSetPokedexFlag(pokedexNum, 2); - GetSetPokedexFlag(pokedexNum, 3); - } - - heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM); - if (ItemIsMail(heldItem)) - GiveMailToMon2(&gPlayerParty[5], &mail); - party_compaction(); - CalculatePlayerPartyCount(); - StringExpandPlaceholders(gStringVar4, gOtherText_PokeWasSentOver); - ctx->data[2] = 2; - } - - return FALSE; -} - -bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx) -{ - u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; - memcpy(&gSaveBlock2.battleTower.ereaderTrainer, (void *)data, sizeof(gSaveBlock2.battleTower.ereaderTrainer)); - ValidateEReaderTrainer(); - StringExpandPlaceholders(gStringVar4, gOtherText_NewTrainerInHoenn); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx) -{ - EnableResetRTC(); - StringExpandPlaceholders(gStringVar4, gSystemText_ClockAdjustmentUsable); - ctx->data[2] = 2; - return FALSE; -} - -bool8 MEScrCmd_checksum(struct ScriptContext *ctx) -{ - int checksum = ScriptReadWord(ctx); - u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - if (checksum != CalcChecksum(data, dataEnd - data)) - { - ctx->data[3] = 0; - ctx->data[2] = 1; - } - return TRUE; -} - -bool8 MEScrCmd_crc(struct ScriptContext *ctx) -{ - int crc = ScriptReadWord(ctx); - u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); - if (crc != CalcCRC16(data, dataEnd - data)) - { - ctx->data[3] = 0; - ctx->data[2] = 1; - } - return TRUE; -} diff --git a/src/engine/name_string_util.c b/src/engine/name_string_util.c deleted file mode 100644 index 32e9358e1..000000000 --- a/src/engine/name_string_util.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "global.h" -#include "name_string_util.h" -#include "string_util.h" -#include "text.h" - -void PadNameString(u8 *a1, u8 a2) -{ - u8 i; - - Text_StripExtCtrlCodes(a1); - i = StringLength(a1); - - if (a2 == 0xFC) - { - while (i < 6) - { - a1[i] = 0xFC; - a1[i + 1] = 7; - i += 2; - } - } - else - { - while (i < 6) - { - a1[i] = a2; - i++; - } - } - - a1[i] = EOS; -} - -void SanitizeNameString(u8 *a1) -{ - if (StringLength(a1) < 6) - ConvertInternationalString(a1, 1); - else - Text_StripExtCtrlCodes(a1); -} diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c deleted file mode 100644 index 59b9b4d84..000000000 --- a/src/engine/naming_screen.c +++ /dev/null @@ -1,2167 +0,0 @@ -#include "global.h" -#include "naming_screen.h" -#include "data2.h" -#include "graphics.h" -#include "field_effect.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokemon_icon.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "trig.h" -#include "util.h" -#include "ewram.h" - -#ifdef ENGLISH -#define COLUMN_COUNT 9 -#elif GERMAN -#define COLUMN_COUNT 10 -#endif - -extern u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality); - -const u8 gSpriteImage_83CE094[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp"); -const u8 gSpriteImage_83CE154[] = INCBIN_U8("graphics/naming_screen/pc_icon/1.4bpp"); - -struct NamingScreenData *const namingScreenDataPtr = &namingScreenData; - -extern const struct SubspriteTable gSubspriteTables_83CE558[]; -extern const struct SubspriteTable gSubspriteTables_83CE560[]; -extern const struct SubspriteTable gSubspriteTables_83CE578[]; -extern const struct SubspriteTable gSubspriteTables_83CE580[]; -extern const struct SpriteTemplate gSpriteTemplate_83CE5C8; -extern const struct SpriteTemplate gSpriteTemplate_83CE5E0; -extern const struct SpriteTemplate gSpriteTemplate_83CE5F8; -extern const struct SpriteTemplate gSpriteTemplate_83CE610; -extern const struct SpriteTemplate gSpriteTemplate_83CE628; -extern const struct SpriteTemplate gSpriteTemplate_83CE640; -extern const struct SpriteTemplate gSpriteTemplate_83CE658; -extern const struct SpriteTemplate gSpriteTemplate_83CE670; -extern const struct SpriteTemplate gSpriteTemplate_83CE688; -extern const struct SpriteSheet gUnknown_083CE6A0[]; -extern const struct SpritePalette gUnknown_083CE708[]; -extern const u8 gNamingScreenMenu_Gfx[]; -extern const u16 gUnknown_083CE748[]; -extern const u16 gUnknown_083CEBF8[]; -extern const u16 gUnknown_083CF0A8[]; -extern const u16 gUnknown_08E86258[]; - -static void C2_NamingScreen(void); -static void sub_80B5AA0(void); -static void StoreNamingScreenParameters(u8, u8 *, u16, u16, u32, MainCallback); -static void NamingScreen_TurnOffScreen(void); -static void NamingScreen_Init(void); -static void NamingScreen_ClearVram(void); -static void NamingScreen_ClearOam(void); -static void NamingScreen_SetUpVideoRegs(void); -static void NamingScreen_SetUpWindow(void); -static void NamingScreen_ResetObjects(void); -static void sub_80B5DFC(void); -static void sub_80B5E20(void); -static void sub_80B5E3C(void); -static void NamingScreen_InitDisplayMode(void); -static void Task_DoNothing(u8); -static void sub_80B7558(void); -static void sub_80B753C(void); -static void sub_80B7680(void); -static void sub_80B75C4(void); -static void sub_80B7794(void); -static void sub_80B78A8(void); -static void sub_80B7960(void); -static void CursorInit(void); -static void sub_80B6A80(void); -static void sub_80B6CA8(void); -static void sub_80B6D04(void); -static void sub_80B6E44(void); -static void InputInit(void); -static void sub_80B6438(void); -static void sub_80B5E50(void); -static void Task_NamingScreenMain(u8); -static void SetInputState(u8); -static void sub_80B68D8(u8); -static bool8 HandleKeyboardEvent(void); -static bool8 IsCursorAnimFinished(void); -static void MoveCursorToOKButton(void); -static void sub_80B6B14(void); -static void StartPageSwapAnim(void); -static void sub_80B6888(u8); -static void sub_80B6460(u8, u8, u8); -static bool8 IsPageSwapAnimNotInProgress(void); -static void sub_80B7614(void); -static void GetCursorPos(s16 *, s16 *); -static void SetCursorPos(s16, s16); -static void sub_80B77F8(void); -static void sub_80B74B0(void); -static void DisplaySentToPCMessage(void); -static u8 GetKeyRoleAtCursorPos(void); -static u8 sub_80B61C8(void); -static void DeleteTextCharacter(void); -static void sub_80B7090(void); -static u8 GetInputEvent(void); -static bool8 sub_80B7004(void); -static void sub_80B6914(void); -static void Task_HandlePageSwapAnim(u8); -static void sub_80B6C48(u8, struct Sprite *, struct Sprite *); -static u8 GetTextCaretPosition(void); -static u8 GetCharAtKeyboardPos(s16, s16); -static bool8 sub_80B7104(void); -static bool8 sub_80B713C(void); -static void AddTextCharacter(u8); -static bool8 sub_80B7198(u8); -static bool8 sub_80B7264(u8); -static void sub_80B7370(u8, u8); -static void sub_80B73CC(u8, u8); -static bool8 sub_80B71E4(u8); -static void sub_80B7474(u8, u8); -static void sub_80B72A4(u8, u8); -static bool8 sub_80B720C(u8); -static void sub_80B7568(void); -static void sub_80B75B0(void); -static void sub_80B7698(u16 *, const u16 *); -static void sub_80B76E0(); -static void nullsub_20(u8, u8); -static void PrintKeyboardCharacters(u8); - -void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) -{ - StoreNamingScreenParameters(templateNum, destBuffer, c, d, e, returnCallback); - SetMainCallback2(C2_NamingScreen); -} - -static void C2_NamingScreen(void) -{ - switch (gMain.state) - { - case 0: - NamingScreen_TurnOffScreen(); - NamingScreen_Init(); - gMain.state++; - break; - case 1: - NamingScreen_ClearVram(); - gMain.state++; - break; - case 2: - NamingScreen_ClearOam(); - gMain.state++; - break; - case 3: - NamingScreen_SetUpVideoRegs(); - gMain.state++; - break; - case 4: - NamingScreen_SetUpWindow(); - gMain.state++; - break; - case 5: - NamingScreen_ResetObjects(); - gMain.state++; - break; - case 6: - sub_80B5DFC(); - gMain.state++; - break; - case 7: - sub_80B5E20(); - sub_80B5E3C(); - NamingScreen_InitDisplayMode(); - SetMainCallback2(sub_80B5AA0); - break; - } -} - -static void sub_80B5AA0(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void VBlankCB_NamingScreen(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - REG_BG1VOFS = namingScreenDataPtr->bg1vOffset; - REG_BG2VOFS = namingScreenDataPtr->bg2vOffset; - REG_BG1CNT &= 0xFFFC; - REG_BG1CNT |= namingScreenDataPtr->unk8; - REG_BG2CNT &= 0xFFFC; - REG_BG2CNT |= namingScreenDataPtr->unkA; -} - -static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) -{ - struct Task *task; - - //Create a task that does nothing, and use it as a temporary space to store parameters - task = &gTasks[CreateTask(Task_DoNothing, 0xFF)]; - task->data[0] = templateNum; - task->data[1] = c; - task->data[2] = d; - task->data[3] = e >> 16; - task->data[4] = e; - StoreWordInTwoHalfwords(&task->data[5], (u32)destBuffer); - StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback); -} - -static void GetNamingScreenParameters(void) -{ - u8 taskId; - struct Task *task; - - taskId = FindTaskIdByFunc(Task_DoNothing); - task = &gTasks[taskId]; - namingScreenDataPtr->templateNum = task->data[0]; - namingScreenDataPtr->unk3E = task->data[1]; - namingScreenDataPtr->unk40 = task->data[2]; - namingScreenDataPtr->unk42 = (task->data[3] << 16) | (u16)task->data[4]; - LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenDataPtr->destBuffer); - LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenDataPtr->returnCallback); - DestroyTask(taskId); -} - -static void Task_DoNothing(u8 taskId) -{ -} - -static void NamingScreen_TurnOffScreen(void) -{ - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); - REG_DISPCNT = 0; -} - -static void NamingScreen_InitDisplayMode(void) -{ - u16 savedIme; - - SetVBlankCallback(VBlankCB_NamingScreen); - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; -} - -static void NamingScreen_ClearVram(void) -{ - DmaFill16Large(3, 0, (void *)VRAM, 0x10000, 0x1000); -} - -static void NamingScreen_ClearOam(void) -{ - DmaClear16(3, (void *)OAM, 0x400); -} - -static void NamingScreen_SetUpVideoRegs(void) -{ - REG_BG0CNT = 0; - REG_BG1CNT = 0; - REG_BG2CNT = 0; - REG_BG3CNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(28) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(29) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BLDCNT = 0x640; - REG_BLDALPHA = 0x80C; -} - -static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; //forward declaration - -static void NamingScreen_Init(void) -{ - GetNamingScreenParameters(); - namingScreenDataPtr->state = 0; - namingScreenDataPtr->bg1vOffset = 0; - namingScreenDataPtr->bg2vOffset = 0; - namingScreenDataPtr->unk8 = 1; - namingScreenDataPtr->unkA = 2; - namingScreenDataPtr->unkC = 0; - namingScreenDataPtr->unkD = 1; - namingScreenDataPtr->template = sNamingScreenTemplates[namingScreenDataPtr->templateNum]; - namingScreenDataPtr->currentPage = namingScreenDataPtr->template->unk4; - namingScreenDataPtr->unk2 = 14 - namingScreenDataPtr->template->maxChars / 2; - namingScreenDataPtr->unk3C = gKeyRepeatStartDelay; - memset(namingScreenDataPtr->textBuffer, 0xFF, sizeof(namingScreenDataPtr->textBuffer)); - if (namingScreenDataPtr->template->unk0 != 0) - StringCopy(namingScreenDataPtr->textBuffer, namingScreenDataPtr->destBuffer); - gKeyRepeatStartDelay = 16; -} - -static void NamingScreen_SetUpWindow(void) -{ - Text_LoadWindowTemplate(&gWindowTemplate_81E6E88); - InitMenuWindow(&gWindowTemplate_81E6E88); -} - -static void NamingScreen_ResetObjects(void) -{ - ResetPaletteFade(); - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); -} - -static void sub_80B5DFC(void) -{ - sub_80B7558(); - sub_80B753C(); - sub_80B7680(); - sub_80B75C4(); - sub_80B7794(); - sub_80B78A8(); - sub_80B7960(); -} - -static void sub_80B5E20(void) -{ - CursorInit(); - sub_80B6A80(); - sub_80B6CA8(); - sub_80B6D04(); - sub_80B6E44(); -} - -static void sub_80B5E3C(void) -{ - InputInit(); - sub_80B6438(); - sub_80B5E50(); -} - -//-------------------------------------------------- -// Naming screen main -//-------------------------------------------------- - -static bool8 MainState_BeginFadeIn(struct Task *); -static bool8 MainState_WaitFadeIn(struct Task *); -static bool8 MainState_HandleInput(struct Task *); -static bool8 MainState_MoveToOKButton(struct Task *); -static bool8 MainState_StartPageSwap(struct Task *); -static bool8 MainState_WaitPageSwap(struct Task *); -static bool8 MainState_6(struct Task *); -static bool8 MainState_UpdateSentToPCMessage(struct Task *); -static bool8 MainState_BeginFadeInOut(struct Task *); -static bool8 MainState_WaitFadeOutAndExit(struct Task *); - -static bool8 (*const sMainStateFuncs[])(struct Task *) = -{ - MainState_BeginFadeIn, - MainState_WaitFadeIn, - MainState_HandleInput, - MainState_MoveToOKButton, - MainState_StartPageSwap, - MainState_WaitPageSwap, - MainState_6, - MainState_UpdateSentToPCMessage, - MainState_BeginFadeInOut, - MainState_WaitFadeOutAndExit, -}; - -static void sub_80B5E50(void) -{ - u8 taskId; - - taskId = CreateTask(Task_NamingScreenMain, 2); - Task_NamingScreenMain(taskId); -} - -static void Task_NamingScreenMain(u8 taskId) -{ - while (sMainStateFuncs[namingScreenDataPtr->state](&gTasks[taskId]) != 0) - ; -} - -static bool8 MainState_BeginFadeIn(struct Task *task) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - namingScreenDataPtr->state++; - return 0; -} - -static bool8 MainState_WaitFadeIn(struct Task *task) -{ - if (!gPaletteFade.active) - { - SetInputState(INPUT_STATE_ENABLED); - sub_80B68D8(1); - namingScreenDataPtr->state++; - } - return FALSE; -} - -static bool8 MainState_HandleInput(struct Task *task) -{ - return HandleKeyboardEvent(); -} - -static bool8 MainState_MoveToOKButton(struct Task *task) -{ - if (IsCursorAnimFinished()) - { - SetInputState(INPUT_STATE_ENABLED); - MoveCursorToOKButton(); - namingScreenDataPtr->state = MAIN_STATE_HANDLE_INPUT; - } - return FALSE; -} - -static bool8 MainState_StartPageSwap(struct Task *task) -{ - SetInputState(INPUT_STATE_DISABLED); - sub_80B6B14(); - StartPageSwapAnim(); - sub_80B6888(1); - sub_80B6460(0, 0, 1); - PlaySE(SE_WIN_OPEN); - namingScreenDataPtr->state = MAIN_STATE_WAIT_PAGE_SWAP; - return FALSE; -} - -static bool8 MainState_WaitPageSwap(struct Task *task) -{ - s16 cursorX; - s16 cursorY; - - if (IsPageSwapAnimNotInProgress()) - { - namingScreenDataPtr->state = MAIN_STATE_HANDLE_INPUT; - namingScreenDataPtr->currentPage++; - namingScreenDataPtr->currentPage %= 3; - sub_80B7614(); - sub_80B77F8(); - SetInputState(INPUT_STATE_ENABLED); - GetCursorPos(&cursorX, &cursorY); -#if ENGLISH - if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) - cursorX = 5; -#elif GERMAN - if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 7 || cursorX == 8)) - cursorX = 6; -#endif - SetCursorPos(cursorX, cursorY); - sub_80B6888(0); - } - return FALSE; -} - -static bool8 MainState_6(struct Task *task) -{ - sub_80B74B0(); - SetInputState(INPUT_STATE_DISABLED); - sub_80B68D8(0); - sub_80B6460(3, 0, 1); - gKeyRepeatStartDelay = namingScreenDataPtr->unk3C; - if (namingScreenDataPtr->templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME - && CalculatePlayerPartyCount() >= 6) - { - DisplaySentToPCMessage(); - namingScreenDataPtr->state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE; - return FALSE; - } - else - { - namingScreenDataPtr->state = MAIN_STATE_BEGIN_FADE_OUT; - return TRUE; //Exit the naming screen - } -} - -static bool8 MainState_UpdateSentToPCMessage(struct Task *task) -{ - if (Menu_UpdateWindowText()) - namingScreenDataPtr->state++; - return FALSE; -} - -static bool8 MainState_BeginFadeInOut(struct Task *task) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - namingScreenDataPtr->state++; - return FALSE; -} - -static bool8 MainState_WaitFadeOutAndExit(struct Task *task) -{ - if (!gPaletteFade.active) - SetMainCallback2(namingScreenDataPtr->returnCallback); - return FALSE; -} - -//-------------------------------------------------- -// Keyboard handling -//-------------------------------------------------- - -enum -{ - KEY_ROLE_CHAR, - KEY_ROLE_PAGE, - KEY_ROLE_BACKSPACE, - KEY_ROLE_OK, -}; - - -static bool8 KeyboardKeyHandler_Character(u8); -static bool8 KeyboardKeyHandler_Page(u8); -static bool8 KeyboardKeyHandler_Backspace(u8); -static bool8 KeyboardKeyHandler_OK(u8); - -static bool8 (*const sKeyboardKeyHandlers[])(u8) = -{ - KeyboardKeyHandler_Character, - KeyboardKeyHandler_Page, - KeyboardKeyHandler_Backspace, - KeyboardKeyHandler_OK, -}; - -static bool8 HandleKeyboardEvent(void) -{ - u8 event = GetInputEvent(); - u8 keyRole = GetKeyRoleAtCursorPos(); - - if (event == KBEVENT_PRESSED_SELECT) - return sub_80B61C8(); - else if (event == KBEVENT_PRESSED_B) - { - DeleteTextCharacter(); - return FALSE; - } - else if (event == 7) - { - sub_80B7090(); - return FALSE; - } - return sKeyboardKeyHandlers[keyRole](event); -} - -static bool8 KeyboardKeyHandler_Character(u8 event) -{ - sub_80B6460(3, 0, 0); - if (event == KBEVENT_PRESSED_A) - { - u8 var = sub_80B7004(); - - sub_80B6914(); - if (var) - { - SetInputState(INPUT_STATE_DISABLED); - namingScreenDataPtr->state = MAIN_STATE_MOVE_TO_OK_BUTTON; - } - } - return FALSE; -} - -static bool8 KeyboardKeyHandler_Page(u8 event) -{ - sub_80B6460(0, 1, 0); - if (event == KBEVENT_PRESSED_A) - return sub_80B61C8(); - else - return FALSE; -} - -static bool8 KeyboardKeyHandler_Backspace(u8 event) -{ - sub_80B6460(1, 1, 0); - if (event == KBEVENT_PRESSED_A) - DeleteTextCharacter(); - return FALSE; -} - -static bool8 KeyboardKeyHandler_OK(u8 event) -{ - sub_80B6460(2, 1, 0); - if (event == KBEVENT_PRESSED_A) - { - PlaySE(SE_SELECT); - namingScreenDataPtr->state = MAIN_STATE_6; - return TRUE; - } - else - return FALSE; -} - -static bool8 sub_80B61C8(void) -{ - namingScreenDataPtr->state = MAIN_STATE_START_PAGE_SWAP; - return TRUE; -} - -//-------------------------------------------------- -// Input handling -//-------------------------------------------------- - -enum -{ - FNKEY_CASE, - FNKEY_BACK, - FNKEY_OK, -}; - -#define tState data[0] -#define tKeyboardEvent data[1] -#define tKbFunctionKey data[2] - -static void InputState_Disabled(struct Task *); -static void InputState_Enabled(struct Task *); - -static void (*const sInputStateFuncs[])(struct Task *) = -{ - InputState_Disabled, - InputState_Enabled, -}; - -static void Task_HandleInput(u8); -static void HandleDpadMovement(struct Task *); - -static void InputInit(void) -{ - CreateTask(Task_HandleInput, 1); -} - -static u8 GetInputEvent(void) -{ - u8 taskId = FindTaskIdByFunc(Task_HandleInput); - - return gTasks[taskId].tKeyboardEvent; -} - -static void SetInputState(u8 state) -{ - u8 taskId = FindTaskIdByFunc(Task_HandleInput); - - gTasks[taskId].tState = state; -} - -static void Task_HandleInput(u8 taskId) -{ - sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]); -} - -static void InputState_Disabled(struct Task *task) -{ - task->tKeyboardEvent = 0; -} - -static void InputState_Enabled(struct Task *task) -{ - task->tKeyboardEvent = 0; - if (gMain.newKeys & A_BUTTON) - { - task->tKeyboardEvent = KBEVENT_PRESSED_A; - return; - } - if (gMain.newKeys & B_BUTTON) - { - task->tKeyboardEvent = KBEVENT_PRESSED_B; - return; - } - if (gMain.newKeys & SELECT_BUTTON) - { - task->tKeyboardEvent = KBEVENT_PRESSED_SELECT; - return; - } - if (gMain.newKeys & START_BUTTON) - { - task->tKeyboardEvent = KBEVENT_PRESSED_START; - MoveCursorToOKButton(); - return; - } - HandleDpadMovement(task); -} - -static const s16 sDpadDeltaX[] = -{ - 0, //none - 0, //up - 0, //down - -1, //left - 1 //right -}; - -static const s16 sDpadDeltaY[] = -{ - 0, //none - -1, //up - 1, //down - 0, //left - 0 //right -}; - -static const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2}; -static const s16 gUnknown_083CE274[] = {0, 0, 3, 0}; - -static void HandleDpadMovement(struct Task *task) -{ - s16 cursorX; - s16 cursorY; - u16 dpadDir; - s16 prevCursorX; - - GetCursorPos(&cursorX, &cursorY); - dpadDir = 0; - if (gMain.newAndRepeatedKeys & DPAD_UP) - dpadDir = 1; - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - dpadDir = 2; - if (gMain.newAndRepeatedKeys & DPAD_LEFT) - dpadDir = 3; - if (gMain.newAndRepeatedKeys & DPAD_RIGHT) - dpadDir = 4; - - //Get new cursor position - prevCursorX = cursorX; - cursorX += sDpadDeltaX[dpadDir]; - cursorY += sDpadDeltaY[dpadDir]; - - //Wrap cursor position in the X direction - if (cursorX < 0) - cursorX = COLUMN_COUNT - 1; - if (cursorX > COLUMN_COUNT - 1) - cursorX = 0; - - //Handle cursor movement in X direction - if (sDpadDeltaX[dpadDir] != 0) - { - //The "others" page only has 5 columns -#if ENGLISH - if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) -#elif GERMAN - if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7 || cursorX == 8)) -#endif - { - if (sDpadDeltaX[dpadDir] > 0) - cursorX = COLUMN_COUNT - 1; - else - cursorX = 5; - } - - if (cursorX == COLUMN_COUNT - 1) - { - //We are now on the last column - task->tKbFunctionKey = cursorY; - cursorY = s4RowTo3RowTableY[cursorY]; - } - else if (prevCursorX == COLUMN_COUNT - 1) - { - if (cursorY == 1) - cursorY = task->tKbFunctionKey; - else - cursorY = gUnknown_083CE274[cursorY]; - } - } - - if (cursorX == COLUMN_COUNT - 1) - { - //There are only 3 keys on the last column, unlike the others, - //so wrap Y accordingly - if (cursorY < 0) - cursorY = 2; - if (cursorY > 2) - cursorY = 0; - if (cursorY == 0) - task->tKbFunctionKey = FNKEY_BACK; - else if (cursorY == 2) - task->tKbFunctionKey = FNKEY_OK; - } - else - { - if (cursorY < 0) - cursorY = 3; - if (cursorY > 3) - cursorY = 0; - } - SetCursorPos(cursorX, cursorY); -} - -#undef tState -#undef tKeyboardEvent -#undef tKbFunctionKey - -//-------------------------------------------------- -// -//-------------------------------------------------- - -static void Task_80B64D4(u8); -static u16 sub_80B654C(u8); -static void sub_80B65AC(u8); -static void sub_80B65D4(struct Task *, u8, u8); - -static void sub_80B6438(void) -{ - u8 taskId; - - taskId = CreateTask(Task_80B64D4, 3); - gTasks[taskId].data[0] = 3; -} - -static void sub_80B6460(u8 a, u8 b, u8 c) -{ - struct Task *task = &gTasks[FindTaskIdByFunc(Task_80B64D4)]; - - if (a == task->data[0] && c == 0) - { - task->data[1] = b; - task->data[2] = 1; - return; - } - if (a == 3 && task->data[1] == 0 && c == 0) - return; - if (task->data[0] != 3) - sub_80B65AC(task->data[0]); - sub_80B65D4(task, a, b); -} - -static void Task_80B64D4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - if (task->data[0] == 3 || task->data[2] == 0) - return; - MultiplyInvertedPaletteRGBComponents(sub_80B654C(task->data[0]), task->data[3], task->data[3], task->data[3]); - if (task->data[5] != 0) - { - task->data[5]--; - if (task->data[5] != 0) - return; - } - task->data[5] = 2; - task->data[3] += task->data[4]; - if (task->data[3] == 16) - task->data[4] = -task->data[4]; - else if (task->data[3] == 0) - { - task->data[2] = task->data[1]; - task->data[4] = -task->data[4]; - } -} - -static u16 sub_80B654C(u8 a) -{ - const u16 arr[] = - { - IndexOfSpritePaletteTag(4) * 16 + 0x10E, - IndexOfSpritePaletteTag(6) * 16 + 0x10C, - IndexOfSpritePaletteTag(6) * 16 + 0x10E, - }; - - return arr[a]; -} - -static void sub_80B65AC(u8 a) -{ - u16 index = sub_80B654C(a); - - gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; -} - -static void sub_80B65D4(struct Task *task, u8 b, u8 c) -{ - task->data[0] = b; - task->data[1] = c; - task->data[2] = 1; - task->data[3] = 15; - task->data[4] = 1; - task->data[5] = 0; -} - -//-------------------------------------------------- -// Page Swap -//-------------------------------------------------- - -#define tState data[0] -#define tFrameCount data[1] - -static bool8 PageSwapAnimState_Init(struct Task *); -static bool8 PageSwapAnimState_1(struct Task *); -static bool8 PageSwapAnimState_2(struct Task *); -static bool8 PageSwapAnimState_Done(struct Task *); - -static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = -{ - PageSwapAnimState_Init, - PageSwapAnimState_1, - PageSwapAnimState_2, - PageSwapAnimState_Done, -}; - -static void StartPageSwapAnim(void) -{ - u8 taskId; - - taskId = CreateTask(Task_HandlePageSwapAnim, 0); - Task_HandlePageSwapAnim(taskId); -} - -static bool8 IsPageSwapAnimNotInProgress(void) -{ - if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF) - return TRUE; - else - return FALSE; -} - -static void Task_HandlePageSwapAnim(u8 taskId) -{ - while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0) - ; -} - -static bool8 PageSwapAnimState_Init(struct Task *task) -{ - namingScreenDataPtr->bg1vOffset = 0; - namingScreenDataPtr->bg2vOffset = 0; - task->tState++; - return 0; -} - -static bool8 PageSwapAnimState_1(struct Task *task) -{ - u16 *const arr[] = - { - &namingScreenDataPtr->bg2vOffset, - &namingScreenDataPtr->bg1vOffset - }; - - task->tFrameCount += 4; - *arr[namingScreenDataPtr->unkC] = Sin(task->tFrameCount, 40); - *arr[namingScreenDataPtr->unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); - if (task->tFrameCount >= 64) - { - u8 temp = namingScreenDataPtr->unk8; //Why u8 and not u16? - - namingScreenDataPtr->unk8 = namingScreenDataPtr->unkA; - namingScreenDataPtr->unkA = temp; - task->tState++; - } - return 0; -} - -static bool8 PageSwapAnimState_2(struct Task *task) -{ - u16 *const arr[] = {&namingScreenDataPtr->bg2vOffset, &namingScreenDataPtr->bg1vOffset}; - - task->tFrameCount += 4; - *arr[namingScreenDataPtr->unkC] = Sin(task->tFrameCount, 40); - *arr[namingScreenDataPtr->unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); - if (task->tFrameCount >= 128) - { - u8 temp = namingScreenDataPtr->unkC; - - namingScreenDataPtr->unkC = namingScreenDataPtr->unkD; - namingScreenDataPtr->unkD = temp; - task->tState++; - } - return 0; -} - -static bool8 PageSwapAnimState_Done(struct Task *task) -{ - DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim)); - return 0; -} - -#undef tState -#undef tFrameCount - -//-------------------------------------------------- -// Cursor -//-------------------------------------------------- - -static void CursorInit(void) -{ - namingScreenDataPtr->cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); - gSprites[namingScreenDataPtr->cursorSpriteId].oam.priority = 1; - gSprites[namingScreenDataPtr->cursorSpriteId].oam.objMode = 1; - gSprites[namingScreenDataPtr->cursorSpriteId].data[6] = 1; - gSprites[namingScreenDataPtr->cursorSpriteId].data[6] = 2; - SetCursorPos(0, 0); -} - -static const u8 sKeyboardSymbolPositions[][COLUMN_COUNT] = { -#if ENGLISH - {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Upper page - {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Lower page - {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page -#elif GERMAN - {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Upper page - {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Lower page - {1, 4, 7, 10, 13, 16, 16, 16, 16, 19}, //Others page -#endif -}; - -static u8 CursorColToKeyboardCol(s16 x) -{ - return sKeyboardSymbolPositions[namingScreenDataPtr->currentPage][x]; -} - -static void SetCursorPos(s16 x, s16 y) -{ - struct Sprite *cursorSprite = &gSprites[namingScreenDataPtr->cursorSpriteId]; - - cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27; - cursorSprite->pos1.y = y * 16 + 80; - cursorSprite->data[2] = cursorSprite->data[0]; - cursorSprite->data[3] = cursorSprite->data[1]; - cursorSprite->data[0] = x; - cursorSprite->data[1] = y; -} - -static void GetCursorPos(s16 *x, s16 *y) -{ - struct Sprite *cursorSprite = &gSprites[namingScreenDataPtr->cursorSpriteId]; - - *x = cursorSprite->data[0]; - *y = cursorSprite->data[1]; -} - -static void MoveCursorToOKButton(void) -{ - SetCursorPos(COLUMN_COUNT - 1, 2); -} - -static void sub_80B6888(u8 a) -{ - gSprites[namingScreenDataPtr->cursorSpriteId].data[4] &= -256; - gSprites[namingScreenDataPtr->cursorSpriteId].data[4] |= a; - StartSpriteAnim(&gSprites[namingScreenDataPtr->cursorSpriteId], 0); -} - -static void sub_80B68D8(u8 a) -{ - gSprites[namingScreenDataPtr->cursorSpriteId].data[4] &= 0xFF; - gSprites[namingScreenDataPtr->cursorSpriteId].data[4] |= a << 8; -} - -static void sub_80B6914(void) -{ - StartSpriteAnim(&gSprites[namingScreenDataPtr->cursorSpriteId], 1); -} - -static bool8 IsCursorAnimFinished(void) -{ - return gSprites[namingScreenDataPtr->cursorSpriteId].animEnded; -} - -static u8 GetKeyRoleAtCursorPos(void) -{ - const u8 keyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK}; - s16 cursorX; - s16 cursorY; - - GetCursorPos(&cursorX, &cursorY); - if (cursorX < COLUMN_COUNT - 1) - return KEY_ROLE_CHAR; - else - return keyRoles[cursorY]; -} - -void sub_80B6998(struct Sprite *sprite) -{ - if (sprite->animEnded) - StartSpriteAnim(sprite, 0); - sprite->invisible = (sprite->data[4] & 0xFF); - if (sprite->data[0] == COLUMN_COUNT - 1) - sprite->invisible = TRUE; - if (sprite->invisible || (sprite->data[4] & 0xFF00) == 0 - || sprite->data[0] != sprite->data[2] || sprite->data[1] != sprite->data[3]) - { - sprite->data[5] = 0; - sprite->data[6] = 1; - sprite->data[7] = 2; - } - sprite->data[7]--; - if (sprite->data[7] == 0) - { - sprite->data[5] += sprite->data[6]; - if (sprite->data[5] == 16 || sprite->data[5] == 0) - sprite->data[6] = -sprite->data[6]; - sprite->data[7] = 2; - } - if ((sprite->data[4] & 0xFF00) != 0) - { - s8 gb = sprite->data[5]; - s8 r = sprite->data[5] >> 1; - u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101; - - MultiplyInvertedPaletteRGBComponents(index, r, gb, gb); - } -} - -static void sub_80B6A80(void) -{ - u8 spriteId1; - u8 spriteId2; - u8 spriteId3; - - spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0); - namingScreenDataPtr->unk10 = spriteId1; - SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558); - - spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1); - gSprites[spriteId1].data[6] = spriteId2; - SetSubspriteTables(&gSprites[spriteId2], gSubspriteTables_83CE560); - - spriteId3 = CreateSprite(&gSpriteTemplate_83CE5E0, 0xCC, 0x4B, 2); - gSprites[spriteId3].oam.priority = 1; - gSprites[spriteId1].data[7] = spriteId3; -} - -static void sub_80B6B14(void) -{ - struct Sprite *sprite = &gSprites[namingScreenDataPtr->unk10]; - - sprite->data[0] = 2; - sprite->data[1] = namingScreenDataPtr->currentPage; -} - -static u8 sub_80B6B5C(struct Sprite *); -static u8 sub_80B6B98(struct Sprite *); -static u8 sub_80B6B9C(struct Sprite *); -static u8 sub_80B6C08(struct Sprite *); - -static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) = -{ - sub_80B6B5C, - sub_80B6B98, - sub_80B6B9C, - sub_80B6C08, -}; - -void sub_80B6B34(struct Sprite *sprite) -{ - while (gUnknown_083CE2B4[sprite->data[0]](sprite) != 0) - ; -} - -static u8 sub_80B6B5C(struct Sprite *sprite) -{ - struct Sprite *sprite1 = &gSprites[sprite->data[6]]; - struct Sprite *sprite2 = &gSprites[sprite->data[7]]; - - sub_80B6C48(namingScreenDataPtr->currentPage, sprite1, sprite2); - sprite->data[0]++; - return 0; -} - -static u8 sub_80B6B98(struct Sprite *sprite) -{ - return 0; -} - -static u8 sub_80B6B9C(struct Sprite *sprite) -{ - struct Sprite *r4 = &gSprites[sprite->data[6]]; - struct Sprite *r5 = &gSprites[sprite->data[7]]; - - r4->pos2.y++; - if (r4->pos2.y > 7) - { - sprite->data[0]++; - r4->pos2.y = -4; - r4->invisible = TRUE; - sub_80B6C48(((u8)sprite->data[1] + 1) % 3, r4, r5); - } - return 0; -} - -static u8 sub_80B6C08(struct Sprite *sprite) -{ - struct Sprite *r2 = &gSprites[sprite->data[6]]; - - r2->invisible = FALSE; - r2->pos2.y++; - if (r2->pos2.y >= 0) - { - r2->pos2.y = 0; - sprite->data[0] = 1; - } - return 0; -} - -static const u16 gUnknown_083CE2C4[] = {1, 3, 2}; -static const u16 gUnknown_083CE2CA[] = {4, 6, 5}; - -static void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) -{ - c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083CE2C4[a]); - b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_083CE2CA[a]); - b->subspriteTableNum = a; -} - -// - -static void sub_80B6CA8(void) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83CE610, 0xCC, 0x6C, 0); - SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); - - spriteId = CreateSprite(&gSpriteTemplate_83CE628, 0xCC, 0x84, 0); - SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); -} - -static void sub_80B6D04(void) -{ - u8 spriteId; - s16 r1; - u8 i; - - r1 = (namingScreenDataPtr->unk2 - 1) * 8 + 4; - spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0); - gSprites[spriteId].oam.priority = 3; - r1 = namingScreenDataPtr->unk2 * 8 + 4; - for (i = 0; i < namingScreenDataPtr->template->maxChars; i++, r1 += 8) - { - spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0); - gSprites[spriteId].oam.priority = 3; - gSprites[spriteId].data[0] = i; - } -} - -void sub_80B6D9C(struct Sprite *sprite) -{ - const s16 arr[] = {0, -4, -2, -1}; - - if (sprite->data[0] == 0 || --sprite->data[0] == 0) - { - sprite->data[0] = 8; - sprite->data[1] = (sprite->data[1] + 1) & 3; - } - sprite->pos2.x = arr[sprite->data[1]]; -} - -void sub_80B6DE8(struct Sprite *sprite) -{ - const s16 arr[] = {2, 3, 2, 1}; - u8 var; - - var = GetTextCaretPosition(); - if (var != (u8)sprite->data[0]) - { - sprite->pos2.y = 0; - sprite->data[1] = 0; - sprite->data[2] = 0; - } - else - { - sprite->pos2.y = arr[sprite->data[1]]; - sprite->data[2]++; - if (sprite->data[2] > 8) - { - sprite->data[1] = (sprite->data[1] + 1) & 3; - sprite->data[2] = 0; - } - } -} - -// - -static void nullsub_40(void); -static void sub_80B6E68(void); -static void sub_80B6EBC(void); -static void sub_80B6EFC(void); - -static void (*const gUnknown_083CE2E0[])(void) = -{ - nullsub_40, - sub_80B6E68, - sub_80B6EBC, - sub_80B6EFC, -}; - -static void sub_80B6E44(void) -{ - gUnknown_083CE2E0[namingScreenDataPtr->template->unk2](); -} - -static void nullsub_40(void) -{ -} - -static void sub_80B6E68(void) -{ - u8 rivalGfxId; - u8 spriteId; - - rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenDataPtr->unk3E); - spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0); - gSprites[spriteId].oam.priority = 3; - StartSpriteAnim(&gSprites[spriteId], 4); -} - -static void sub_80B6EBC(void) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83CE688, 0x34, 0x18, 0); - SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE580); - gSprites[spriteId].oam.priority = 3; -} - -static void sub_80B6EFC(void) -{ - u8 spriteId; - - sub_809D51C(); - spriteId = CreateMonIcon(namingScreenDataPtr->unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenDataPtr->unk42); - gSprites[spriteId].oam.priority = 3; -} - -static u8 GetTextCaretPosition(void) -{ - u8 i; - - for (i = 0; i < namingScreenDataPtr->template->maxChars; i++) - { - if (namingScreenDataPtr->textBuffer[i] == EOS) - return i; - } - return namingScreenDataPtr->template->maxChars - 1; -} - -static u8 GetPreviousTextCaretPosition(void) -{ - s8 i; - - for (i = namingScreenDataPtr->template->maxChars - 1; i > 0; i--) - { - if (namingScreenDataPtr->textBuffer[i] != EOS) - return i; - } - return 0; -} - -static void DeleteTextCharacter(void) -{ - u8 index; - u8 var2; - - index = GetPreviousTextCaretPosition(); - namingScreenDataPtr->textBuffer[index] = 0; - sub_80B7960(); - namingScreenDataPtr->textBuffer[index] = EOS; - var2 = GetKeyRoleAtCursorPos(); - if (var2 == 0 || var2 == 2) - sub_80B6460(1, 0, 1); - PlaySE(SE_BOWA); -} - -static bool8 sub_80B7004(void) -{ - s16 x; - s16 y; - u8 ch; - bool8 r4; - - GetCursorPos(&x, &y); - x = CursorColToKeyboardCol(x); - ch = GetCharAtKeyboardPos(x, y); - r4 = 1; - if (ch == 0xFF) - r4 = sub_80B7104(); - else if (ch == 0xFE) - r4 = sub_80B713C(); - else - AddTextCharacter(ch); - sub_80B7960(); - PlaySE(SE_SELECT); - if (r4) - { - if (GetPreviousTextCaretPosition() == namingScreenDataPtr->template->maxChars - 1) - return TRUE; - } - return FALSE; -} - -static void sub_80B7090(void) // DoInput? -{ - u8 r5; - u8 r4; - - r5 = GetPreviousTextCaretPosition(); - r4 = namingScreenDataPtr->textBuffer[r5]; - if (sub_80B7198(r4)) - { - if (sub_80B7264(r4)) - sub_80B7370(r4, r5); - else - sub_80B73CC(r4, r5); - } - else - { - if (sub_80B71E4(r4)) - sub_80B7474(r4, r5); - else - sub_80B72A4(r4, r5); - } - sub_80B7960(); - PlaySE(SE_SELECT); -} - -static bool8 sub_80B7104(void) -{ - u8 r5; - u8 r4; - - r5 = GetPreviousTextCaretPosition(); - r4 = namingScreenDataPtr->textBuffer[r5]; - if (sub_80B720C(r4)) - { - sub_80B72A4(r4, r5); - return TRUE; - } - return FALSE; -} - -static bool8 sub_80B713C(void) -{ - u8 r5; - u8 r4; - - r5 = GetPreviousTextCaretPosition(); - r4 = namingScreenDataPtr->textBuffer[r5]; - if (sub_80B7264(r4)) - { - sub_80B7370(r4, r5); - return TRUE; - } - return FALSE; -} - -static void AddTextCharacter(u8 ch) -{ - u8 index = GetTextCaretPosition(); - - namingScreenDataPtr->textBuffer[index] = ch; -} - -static bool8 sub_80B7198(u8 a) -{ - if ((a >= 55 && a <= 74) - || (a >= 135 && a <= 139) - || (a >= 140 && a <= 144) - || (a >= 145 && a <= 149) - || (a >= 150 && a <= 154)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_80B71E4(u8 a) -{ - if ((a >= 75 && a <= 79) - || (a >= 155 && a <= 159)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_80B720C(u8 a) -{ - if ((a >= 6 && a <= 20) - || (a >= 26 && a <= 30) - || (a >= 75 && a <= 79) - || (a >= 86 && a <= 100) - || (a >= 106 && a <= 110) - || (a >= 155 && a <= 159)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_80B7264(u8 a) -{ - if ((a >= 26 && a <= 30) - || (a >= 70 && a <= 74) - || (a >= 106 && a <= 110) - || (a >= 150 && a <= 154)) - return TRUE; - else - return FALSE; -} - -static void sub_80B72A4(u8 a, u8 b) -{ - u8 chr = a; - - if (a >= 6 && a <= 10) - chr = a + 0x31; - else if (a >= 11 && a <= 15) - chr = a + 0x31; - else if (a >= 16 && a <= 20) - chr = a + 0x31; - else if (a >= 26 && a <= 30) - chr = a + 0x2C; - else if (a >= 75 && a <= 79) - chr = a + 0xFB; - else if (a >= 86 && a <= 90) - chr = a + 0x31; - else if (a >= 91 && a <= 95) - chr = a + 0x31; - else if (a >= 96 && a <= 100) - chr = a + 0x31; - else if (a >= 106 && a <= 110) - chr = a + 0x2C; - else if (a >= 155 && a <= 159) - chr = a + 0xFB; - namingScreenDataPtr->textBuffer[b] = chr; -} - -static void sub_80B7370(u8 a, u8 b) -{ - u8 chr = a; - - if (a >= 26 && a <= 30) - chr = a + 0x31; - else if (a >= 70 && a <= 74) - chr = a + 5; - else if (a >= 106 && a <= 110) - chr = a + 0x31; - else if (a >= 150 && a <= 154) - chr = a + 5; - namingScreenDataPtr->textBuffer[b] = chr; -} - -static void sub_80B73CC(u8 a, u8 b) -{ - u8 chr = a; - - if (a >= 55 && a <= 59) - chr = a + 0xCF; - else if (a >= 60 && a <= 64) - chr = a + 0xCF; - else if (a >= 65 && a <= 69) - chr = a + 0xCF; - else if (a >= 70 && a <= 74) - chr = a + 0xD4; - else if (a >= 135 && a <= 139) - chr = a + 0xCF; - else if (a >= 140 && a <= 144) - chr = a + 0xCF; - else if (a >= 145 && a <= 149) - chr = a + 0xCF; - else if (a >= 150 && a <= 154) - chr = a + 0xD4; - namingScreenDataPtr->textBuffer[b] = chr; -} - -static void sub_80B7474(u8 a, u8 b) -{ - u8 chr = a; - - if (a >= 75 && a <= 79) - chr = a + 0xCF; - else if (a >= 155 && a <= 159) - chr = a + 0xCF; - namingScreenDataPtr->textBuffer[b] = chr; -} - -static void sub_80B74B0(void) -{ - u8 i; - - for (i = 0; i < namingScreenDataPtr->template->maxChars; i++) - { - if (namingScreenDataPtr->textBuffer[i] != 0 && namingScreenDataPtr->textBuffer[i] != 0xFF) - { - StringCopyN(namingScreenDataPtr->destBuffer, namingScreenDataPtr->textBuffer, namingScreenDataPtr->template->maxChars + 1); - break; - } - } -} - -static void DisplaySentToPCMessage(void) -{ - StringCopy(gStringVar1, namingScreenDataPtr->destBuffer); - StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC); - BasicInitMenuWindow(&gWindowTemplate_81E6E88); - Menu_DisplayDialogueFrame(); - MenuPrintMessageDefaultCoords(gStringVar4); -} - -static void sub_80B753C(void) -{ - LoadSpriteSheets(gUnknown_083CE6A0); - LoadSpritePalettes(gUnknown_083CE708); -} - -static void sub_80B7558(void) -{ - sub_80B7568(); - sub_80B75B0(); -} - -static void sub_80B7568(void) -{ - DmaCopy16Defvars(3, gNamingScreenMenu_Gfx, (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32), 0x800); - DmaCopy16Defvars(3, gNamingScreenMenu_Gfx, (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32), 0x800); -} - -static void sub_80B75B0(void) -{ - LoadPalette(gNamingScreenPalettes, 0, 0x80); -} - -static void sub_80B7650(u16 *); -static void sub_80B7660(u16 *); -static void sub_80B7670(u16 *); - -static void (*const gUnknown_083CE2F0[][2])(u16 *) = -{ - {sub_80B7660, sub_80B7650}, - {sub_80B7650, sub_80B7670}, - {sub_80B7670, sub_80B7660}, -}; - -static void sub_80B75C4(void) -{ - u16 *const arr[] = - { - (u16 *)(VRAM + 0xE000), - (u16 *)(VRAM + 0xE800), - }; - - gUnknown_083CE2F0[namingScreenDataPtr->currentPage][0](arr[namingScreenDataPtr->unkC]); - gUnknown_083CE2F0[namingScreenDataPtr->currentPage][1](arr[namingScreenDataPtr->unkD]); -} - -static void sub_80B7614(void) -{ - u16 *const arr[] = - { - (u16 *)(VRAM + 0xE000), - (u16 *)(VRAM + 0xE800), - }; - - gUnknown_083CE2F0[namingScreenDataPtr->currentPage][1](arr[namingScreenDataPtr->unkD]); -} - -static void sub_80B7650(u16 *vramBuffer) -{ - sub_80B7698(vramBuffer, gUnknown_083CE748); -} - -static void sub_80B7660(u16 *vramBuffer) -{ - sub_80B7698(vramBuffer, gUnknown_083CEBF8); -} - -static void sub_80B7670(u16 *vramBuffer) -{ - sub_80B7698(vramBuffer, gUnknown_083CF0A8); -} - -static void sub_80B7680(void) -{ - sub_80B76E0(VRAM + 0xF000, gUnknown_08E86258); -} - -static void sub_80B7698(u16 *vramBuffer, const u16 *src) -{ - s16 i; - s16 j; - - for (i = 0; i < 20; i++) - { - for (j = 0; j < 30; j++, src++) - { - vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; - } - } -} - -static void sub_80B76E0(u16 *vramBuffer, const u16 *src) -{ - s16 i; - s16 j; - - for (i = 0; i < 20; i++) - { - for (j = 0; j < 30; j++, src++) - { - vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; - } - src += 2; - } -} - -static void sub_80B772C(void) -{ - nullsub_20(namingScreenDataPtr->currentPage, namingScreenDataPtr->unkC); -} - -static void sub_80B7740(void) -{ - nullsub_20((namingScreenDataPtr->currentPage + 1) % 3, namingScreenDataPtr->unkD); -} - -static void nullsub_20(u8 a, u8 b) -{ -} - -static void sub_80B7838(void); -static void sub_80B7844(void); -static void sub_80B7850(void); - -static void (*const gUnknown_083CE310[][2])(void) = -{ - sub_80B7844, - sub_80B7838, - sub_80B7838, - sub_80B7850, - sub_80B7850, - sub_80B7844, -}; - -static const struct WindowTemplate *const gUnknown_083CE328[][2][2] = -{ - { - {&gWindowTemplate_81E6EDC, &gWindowTemplate_81E6EF8}, - {&gWindowTemplate_81E6EA4, &gWindowTemplate_81E6EC0}, - }, - { - {&gWindowTemplate_81E6EA4, &gWindowTemplate_81E6EC0}, - {&gWindowTemplate_81E6F14, &gWindowTemplate_81E6F30}, - }, - { - {&gWindowTemplate_81E6F14, &gWindowTemplate_81E6F30}, - {&gWindowTemplate_81E6EDC, &gWindowTemplate_81E6EF8}, - }, -}; - -static void nullsub_61(void); -static void sub_80B78F8(void); - -static void (*const gUnknown_083CE358[])(void) = -{ - nullsub_61, - nullsub_61, - sub_80B78F8, - sub_80B78F8, -}; - -static void nullsub_62(void); -static void sub_80B7924(void); - -static void (*const gUnknown_083CE368[])(void) = -{ - nullsub_62, - sub_80B7924, -}; - -static const u8 sKeyboardCharacters[][4][20]; //forward declaration - -static u8 GetCharAtKeyboardPos(s16 a, s16 b) -{ - return sKeyboardCharacters[namingScreenDataPtr->currentPage][b][a]; -} - -static void sub_80B7794(void) -{ - BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][0][namingScreenDataPtr->unkC]); - gUnknown_083CE310[namingScreenDataPtr->currentPage][0](); - BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][1][namingScreenDataPtr->unkD]); - gUnknown_083CE310[namingScreenDataPtr->currentPage][1](); - sub_80B772C(); - sub_80B7740(); -} - -static void sub_80B77F8(void) -{ - BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][1][namingScreenDataPtr->unkD]); - gUnknown_083CE310[namingScreenDataPtr->currentPage][1](); - sub_80B7740(); -} - -static void sub_80B7838(void) -{ - PrintKeyboardCharacters(1); -} - -static void sub_80B7844(void) -{ - PrintKeyboardCharacters(0); -} - -static void sub_80B7850(void) -{ - PrintKeyboardCharacters(2); -} - -static void PrintKeyboardCharacters(u8 page) //print letters on page -{ - s16 i; - s16 r5; - - for (i = 0, r5 = 9; i < 4; i++, r5 += 2) - Menu_PrintText(sKeyboardCharacters[page][i], 3, r5); -} - -static void sub_80B78A8(void) -{ - BasicInitMenuWindow(&gWindowTemplate_81E6F4C); - gUnknown_083CE358[namingScreenDataPtr->templateNum](); - gUnknown_083CE368[namingScreenDataPtr->template->unk3](); - Menu_PrintText(namingScreenDataPtr->template->title, 9, 2); -} - -static void nullsub_61(void) -{ -} - -static void sub_80B78F8(void) -{ - StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenDataPtr->unk3E]); -} - -static void nullsub_62(void) -{ -} - -static void sub_80B7924(void) -{ - u8 genderSymbol[2] = _("♂"); - - if ((s16)namingScreenDataPtr->unk40 != MON_GENDERLESS) - { - if ((s16)namingScreenDataPtr->unk40 == MON_FEMALE) - genderSymbol[0] = 0xB6; //female symbol - Menu_PrintText(genderSymbol, 0x14, 4); - } -} - -static void sub_80B7960(void) -{ - u8 *string = gStringVar1; - - string[0] = 0xFC; - string[1] = 0x14; - string[2] = 8; - string[3] = 0xFC; - string[4] = 0x11; - string[5] = 1; - string += 6; - StringCopy(string, namingScreenDataPtr->textBuffer); - BasicInitMenuWindow(&gWindowTemplate_81E6F4C); - Menu_PrintText(gStringVar1, namingScreenDataPtr->unk2, 4); -} - -//-------------------------------------------------- -// Forward-declared variables -//-------------------------------------------------- - -static const struct NamingScreenTemplate playerNamingScreenTemplate = -{ - .unk0 = 0, - .maxChars = 7, - .unk2 = 1, - .unk3 = 0, - .unk4 = 0, - .unk5 = 0, - .unk6 = 0, - .unk7 = 0, - .title = OtherText_YourName, -}; - -static const struct NamingScreenTemplate pcBoxNamingTemplate = -{ - .unk0 = 0, - .maxChars = 8, - .unk2 = 2, - .unk3 = 0, - .unk4 = 0, - .unk5 = 0, - .unk6 = 0, - .unk7 = 0, - .title = OtherText_BoxName, -}; - -static const struct NamingScreenTemplate monNamingScreenTemplate = -{ - .unk0 = 0, - .maxChars = 10, - .unk2 = 3, - .unk3 = 1, - .unk4 = 0, - .unk5 = 0, - .unk6 = 0, - .unk7 = 0, - .title = OtherText_PokeName, -}; - -static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = -{ - &playerNamingScreenTemplate, - &pcBoxNamingTemplate, - &monNamingScreenTemplate, - &monNamingScreenTemplate, -}; - -static const u8 sKeyboardCharacters[][4][20] = -{ -#if ENGLISH - { - _(" A B C D E F . "), - _(" G H I J K L , "), - _(" M N O P Q R S "), - _(" T U V W X Y Z "), - }, - { - _(" a b c d e f . "), - _(" g h i j k l , "), - _(" m n o p q r s "), - _(" t u v w x y z "), - }, -#elif GERMAN - { - _(" ABCD EFGH . "), - _(" IJKL MNOP , "), - _(" QRST UVWX "), - _(" YZ ÄÖÜ "), - }, - { - _(" abcd efgh . "), - _(" ijkl mnop , "), - _(" qrst uvwx "), - _(" yz äöü "), - }, -#endif - { - _(" 0 1 2 3 4 "), - _(" 5 6 7 8 9 "), - _(" ! ? ♂ ♀ / - "), - _(" … “ ” ‘ ’ "), - }, -}; - -const struct OamData gOamData_83CE498 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const struct OamData gOamData_83CE4A0 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const struct OamData gOamData_83CE4A8 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - - -const struct Subsprite gSubspriteTable_83CE4B0[] = { - { -20, -16, ST_OAM_H_RECTANGLE, 1, 0, 1 }, - { 12, -16, ST_OAM_SQUARE, 0, 4, 1 }, - { -20, -8, ST_OAM_H_RECTANGLE, 1, 5, 1 }, - { 12, -8, ST_OAM_SQUARE, 0, 9, 1 }, - { -20, 0, ST_OAM_H_RECTANGLE, 1, 10, 1 }, - { 12, 0, ST_OAM_SQUARE, 0, 14, 1 }, - { -20, 8, ST_OAM_H_RECTANGLE, 1, 15, 1 }, - { 12, 8, ST_OAM_SQUARE, 0, 19, 1 } -}; - -const struct Subsprite gSubspriteTable_83CE4F0[] = { - { -12, -4, ST_OAM_SQUARE, 0, 0, 1 }, - { 4, -4, ST_OAM_SQUARE, 0, 1, 1 } -}; - -const struct Subsprite gSubspriteTable_83CE500[] = { - { -12, -4, ST_OAM_H_RECTANGLE, 0, 0, 1 }, - { 4, -4, ST_OAM_SQUARE, 0, 2, 1 } -}; - -const struct Subsprite gSubspriteTable_83CE510[] = { - { -20, -12, ST_OAM_H_RECTANGLE, 1, 0, 1 }, - { 12, -12, ST_OAM_SQUARE, 0, 4, 1 }, - { -20, -4, ST_OAM_H_RECTANGLE, 1, 5, 1 }, - { 12, -4, ST_OAM_SQUARE, 0, 9, 1 }, - { -20, 4, ST_OAM_H_RECTANGLE, 1, 10, 1 }, - { 12, 4, ST_OAM_SQUARE, 0, 14, 1 } -}; - -const struct Subsprite gSubspriteTable_83CE540[] = { - { -8, -12, ST_OAM_H_RECTANGLE, 0, 0, 3 }, - { -8, -4, ST_OAM_H_RECTANGLE, 0, 2, 3 }, - { -8, 4, ST_OAM_H_RECTANGLE, 0, 4, 3 } -}; - -const struct SubspriteTable gSubspriteTables_83CE558[] = { - { 8, gSubspriteTable_83CE4B0 } -}; - -const struct SubspriteTable gSubspriteTables_83CE560[] = { - { 2, gSubspriteTable_83CE500 }, - { 2, gSubspriteTable_83CE500 }, - { 2, gSubspriteTable_83CE500 } -}; - -const struct SubspriteTable gSubspriteTables_83CE578[] = { - { 6, gSubspriteTable_83CE510 } -}; - -const struct SubspriteTable gSubspriteTables_83CE580[] = { - { 3, gSubspriteTable_83CE540 } -}; - -const struct SpriteFrameImage gSpriteImageTable_83CE588[] = { - { gSpriteImage_83CE094, 0xc0 }, - { gSpriteImage_83CE154, 0xc0 } -}; - -const union AnimCmd gSpriteAnim_83CE598[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd gSpriteAnim_83CE5A0[] = { - ANIMCMD_FRAME(4, 8), - ANIMCMD_FRAME(8, 8), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83CE5AC[] = { - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd *const gSpriteAnimTable_83CE5B8[] = { - gSpriteAnim_83CE598 -}; - -const union AnimCmd *const gSpriteAnimTable_83CE5BC[] = { - gSpriteAnim_83CE598, - gSpriteAnim_83CE5A0 -}; - -const union AnimCmd *const gSpriteAnimTable_83CE5C4[] = { - gSpriteAnim_83CE5AC -}; - -const struct SpriteTemplate gSpriteTemplate_83CE5C8 = { - 2, 4, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6B34 -}; - -const struct SpriteTemplate gSpriteTemplate_83CE5E0 = { - 3, 1, &gOamData_83CE4A8, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -const struct SpriteTemplate gSpriteTemplate_83CE5F8 = { - 4, 4, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -const struct SpriteTemplate gSpriteTemplate_83CE610 = { - 0, 6, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -const struct SpriteTemplate gSpriteTemplate_83CE628 = { - 1, 6, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -const struct SpriteTemplate gSpriteTemplate_83CE640 = { - 7, 5, &gOamData_83CE4A0, gSpriteAnimTable_83CE5BC, NULL, gDummySpriteAffineAnimTable, sub_80B6998 -}; - -const struct SpriteTemplate gSpriteTemplate_83CE658 = { - 10, 3, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6D9C -}; - -const struct SpriteTemplate gSpriteTemplate_83CE670 = { - 11, 3, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6DE8 -}; - -const struct SpriteTemplate gSpriteTemplate_83CE688 = { - 0xFFFF, 0, &gOamData_83CE498, gSpriteAnimTable_83CE5C4, gSpriteImageTable_83CE588, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -const struct SpriteSheet gUnknown_083CE6A0[] = { - { gNamingScreenBackButtonTiles, 0x1E0, 0 }, - { gNamingScreenOKButtonTiles, 0x1E0, 1 }, - { gNamingScreenChangeKeyboardBoxTiles, 0x280, 2 }, - { gNamingScreenChangeKeyboardButtonTiles, 0x100, 3 }, - { gNamingScreenLowerTextTiles, 0x60, 4 }, - { gNamingScreenUpperTextTiles, 0x60, 5 }, - { gNamingScreenOthersTextTiles, 0x60, 6 }, - { gNamingScreenCursorTiles, 0x80, 7 }, - { gNamingScreenActiveCursorSmallTiles, 0x80, 8 }, - { gNamingScreenActiveCursorBigTiles, 0x80, 9 }, - { gNamingScreenRightPointingTriangleTiles, 0x20, 10 }, - { gNamingScreenUnderscoreTiles, 0x20, 11 }, - {} -}; - -const struct SpritePalette gUnknown_083CE708[] = { - {gNamingScreenPalettes[0], 0}, - {gNamingScreenPalettes[1], 1}, - {gNamingScreenPalettes[2], 2}, - {gNamingScreenPalettes[3], 3}, - {gNamingScreenPalettes[4], 4}, - {gNamingScreenPalettes[5], 5}, - {gNamingScreenPalettes[4], 6}, - {} -}; - -const u16 gUnknown_083CE748[] = INCBIN_U16("graphics/naming_screen/lower_keyboard_map.bin"); - -const u16 gUnknown_083CEBF8[] = INCBIN_U16("graphics/naming_screen/upper_keyboard_map.bin"); - -const u16 gUnknown_083CF0A8[] = INCBIN_U16("graphics/naming_screen/others_keyboard_map.bin"); - diff --git a/src/engine/option_menu.c b/src/engine/option_menu.c deleted file mode 100644 index a2d32ffb6..000000000 --- a/src/engine/option_menu.c +++ /dev/null @@ -1,560 +0,0 @@ -#include "global.h" -#include "option_menu.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "scanline_effect.h" -#include "sprite.h" -#include "strings2.h" -#include "task.h" - -extern void SetPokemonCryStereo(u32 val); - -// Menu items -enum -{ - MENUITEM_TEXTSPEED, - MENUITEM_BATTLESCENE, - MENUITEM_BATTLESTYLE, - MENUITEM_SOUND, - MENUITEM_BUTTONMODE, - MENUITEM_FRAMETYPE, - MENUITEM_CANCEL, -}; - -// Task data -#define tMenuSelection data[0] -#define tOptTextSpeed data[1] -#define tOptBattleScene data[2] -#define tOptBattleStyle data[3] -#define tOptSound data[4] -#define tOptButtonMode data[5] -#define tOptFrameType data[6] - -const u16 gUnknown_0839F5FC[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal"); -// note: this is only used in the Japanese release -const u8 gUnknown_0839F63C[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp"); - -static void Task_OptionMenuFadeIn(u8 taskId); -static void Task_OptionMenuProcessInput(u8 taskId); -static void Task_OptionMenuSave(u8 taskId); -static void Task_OptionMenuFadeOut(u8 taskId); -static void HighlightOptionMenuItem(u8 selection); -static u8 TextSpeed_ProcessInput(u8 selection); -static void TextSpeed_DrawChoices(u8 selection); -static u8 BattleScene_ProcessInput(u8 selection); -static void BattleScene_DrawChoices(u8 selection); -static u8 BattleStyle_ProcessInput(u8 selection); -static void BattleStyle_DrawChoices(u8 selection); -static u8 Sound_ProcessInput(u8 selection); -static void Sound_DrawChoices(u8 selection); -static u8 FrameType_ProcessInput(u8 selection); -static void FrameType_DrawChoices(u8 selection); -static u8 ButtonMode_ProcessInput(u8 selection); -static void ButtonMode_DrawChoices(u8 selection); - -static void MainCB(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void CB2_InitOptionMenu(void) -{ - switch (gMain.state) - { - default: - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - gMain.state++; - break; - case 1: - ResetPaletteFade(); - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - gMain.state++; - break; - case 2: - Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); - gMain.state++; - break; - case 3: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E71B4); - gMain.state++; - break; - case 4: - if (!MultistepInitMenuWindowContinue()) - return; - gMain.state++; - break; - case 5: - LoadPalette(gUnknown_0839F5FC, 0x80, 0x40); - CpuCopy16(gUnknown_0839F63C, (void *)0x0600BEE0, 0x40); - gMain.state++; - break; - case 6: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gMain.state++; - break; - case 7: - { - u16 savedIme; - - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_WININ = 0x1111; - REG_WINOUT = 0x31; - REG_BLDCNT = 0xE1; - REG_BLDALPHA = 0; - REG_BLDY = 7; - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(VBlankCB); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON | - DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; - gMain.state++; - break; - } - case 8: - { - u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0); - - gTasks[taskId].tMenuSelection = 0; - gTasks[taskId].tOptTextSpeed = gSaveBlock2.optionsTextSpeed; - gTasks[taskId].tOptBattleScene = gSaveBlock2.optionsBattleSceneOff; - gTasks[taskId].tOptBattleStyle = gSaveBlock2.optionsBattleStyle; - gTasks[taskId].tOptSound = gSaveBlock2.optionsSound; - gTasks[taskId].tOptButtonMode = gSaveBlock2.optionsButtonMode; - gTasks[taskId].tOptFrameType = gSaveBlock2.optionsWindowFrameType; - - Menu_DrawStdWindowFrame(2, 0, 27, 3); // title box - Menu_DrawStdWindowFrame(2, 4, 27, 19); // options list box - - Menu_PrintText(gSystemText_OptionMenu, 4, 1); - - Menu_PrintText(gSystemText_TextSpeed, 4, 5); - Menu_PrintText(gSystemText_BattleScene, 4, 7); - Menu_PrintText(gSystemText_BattleStyle, 4, 9); - Menu_PrintText(gSystemText_Sound, 4, 11); - Menu_PrintText(gSystemText_ButtonMode, 4, 13); - Menu_PrintText(gSystemText_Frame, 4, 15); - Menu_PrintText(gSystemText_Cancel, 4, 17); - - TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed); - BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene); - BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle); - Sound_DrawChoices(gTasks[taskId].tOptSound); - ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode); - FrameType_DrawChoices(gTasks[taskId].tOptFrameType); - - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - - HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); - gMain.state++; - break; - } - case 9: - SetMainCallback2(MainCB); - return; - } -} - -static void Task_OptionMenuFadeIn(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_OptionMenuProcessInput; -} - -static void Task_OptionMenuProcessInput(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - if (gTasks[taskId].tMenuSelection == MENUITEM_CANCEL) - gTasks[taskId].func = Task_OptionMenuSave; - } - else if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].func = Task_OptionMenuSave; - } - else if (gMain.newKeys & DPAD_UP) - { - if (gTasks[taskId].tMenuSelection > 0) - gTasks[taskId].tMenuSelection--; - else - gTasks[taskId].tMenuSelection = 6; - HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (gTasks[taskId].tMenuSelection < 6) - gTasks[taskId].tMenuSelection++; - else - gTasks[taskId].tMenuSelection = 0; - HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); - } - else - { - switch (gTasks[taskId].tMenuSelection) - { - case MENUITEM_TEXTSPEED: - gTasks[taskId].tOptTextSpeed = TextSpeed_ProcessInput(gTasks[taskId].tOptTextSpeed); - TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed); - break; - case MENUITEM_BATTLESCENE: - gTasks[taskId].tOptBattleScene = BattleScene_ProcessInput(gTasks[taskId].tOptBattleScene); - BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene); - break; - case MENUITEM_BATTLESTYLE: - gTasks[taskId].tOptBattleStyle = BattleStyle_ProcessInput(gTasks[taskId].tOptBattleStyle); - BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle); - break; - case MENUITEM_SOUND: - gTasks[taskId].tOptSound = Sound_ProcessInput(gTasks[taskId].tOptSound); - Sound_DrawChoices(gTasks[taskId].tOptSound); - break; - case MENUITEM_BUTTONMODE: - gTasks[taskId].tOptButtonMode = ButtonMode_ProcessInput(gTasks[taskId].tOptButtonMode); - ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode); - break; - case MENUITEM_FRAMETYPE: - gTasks[taskId].tOptFrameType = FrameType_ProcessInput(gTasks[taskId].tOptFrameType); - FrameType_DrawChoices(gTasks[taskId].tOptFrameType); - break; - } - } -} - -static void Task_OptionMenuSave(u8 taskId) -{ - gSaveBlock2.optionsTextSpeed = gTasks[taskId].tOptTextSpeed; - gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].tOptBattleScene; - gSaveBlock2.optionsBattleStyle = gTasks[taskId].tOptBattleStyle; - gSaveBlock2.optionsSound = gTasks[taskId].tOptSound; - gSaveBlock2.optionsButtonMode = gTasks[taskId].tOptButtonMode; - gSaveBlock2.optionsWindowFrameType = gTasks[taskId].tOptFrameType; - - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_OptionMenuFadeOut; -} - -static void Task_OptionMenuFadeOut(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(gMain.savedCallback); - } -} - -//This version uses addition '+' instead of OR '|'. -#define WIN_RANGE_(a, b) (((a) << 8) + (b)) - -static void HighlightOptionMenuItem(u8 index) -{ - REG_WIN1H = WIN_RANGE(24, 215); - REG_WIN1V = WIN_RANGE_(index * 16 + 40, index * 16 + 56); -} - -static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style) -{ - u8 dst[15]; - u16 i; - - for (i = 0; *text != EOS && i < 15; i++) - dst[i] = *(text++); - - dst[2] = style; - dst[i] = EOS; - Menu_PrintTextPixelCoords(dst, x, y, 1); -} - -static u8 TextSpeed_ProcessInput(u8 selection) -{ - if (gMain.newKeys & DPAD_RIGHT) - { - if (selection < 2) - selection++; - else - selection = 0; - } - if (gMain.newKeys & DPAD_LEFT) - { - if (selection > 0) - selection--; - else - selection = 2; - } - return selection; -} - -#if ENGLISH -#define TEXTSPEED_SLOW_LEFT (120) -#define TEXTSPEED_MIX_LEFT (155) -#define TEXTSPEED_FAST_LEFT (184) -#endif -#if GERMAN -#define TEXTSPEED_SLOW_LEFT (120) -#define TEXTSPEED_MIX_LEFT (161) -#define TEXTSPEED_FAST_LEFT (202) -#endif - -static void TextSpeed_DrawChoices(u8 selection) -{ - u8 styles[3]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[2] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]); - DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); - DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]); -} - -static u8 BattleScene_ProcessInput(u8 selection) -{ - if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) - selection ^= 1; - return selection; -} - -static void BattleScene_DrawChoices(u8 selection) -{ - u8 styles[2]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); - DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]); -} - -static u8 BattleStyle_ProcessInput(u8 selection) -{ - if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) - selection ^= 1; - return selection; -} - -#if ENGLISH -#define BATTLESTYLE_SHIFT (120) -#define BATTLESTYLE_SET (190) -#elif GERMAN -#define BATTLESTYLE_SHIFT (120) -#define BATTLESTYLE_SET (178) -#endif - -static void BattleStyle_DrawChoices(u8 selection) -{ - u8 styles[2]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]); - DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); -} - -static u8 Sound_ProcessInput(u8 selection) -{ - if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) - { - selection ^= 1; - SetPokemonCryStereo(selection); - } - return selection; -} - -static void Sound_DrawChoices(u8 selection) -{ - u8 styles[3]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); - DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]); -} - -static u8 FrameType_ProcessInput(u8 selection) -{ - if (gMain.newKeys & DPAD_RIGHT) - { - if (selection < 19) - selection++; - else - selection = 0; - Menu_LoadStdFrameGraphicsOverrideStyle(selection); - } - if (gMain.newKeys & DPAD_LEFT) - { - if (selection > 0) - selection--; - else - selection = 19; - Menu_LoadStdFrameGraphicsOverrideStyle(selection); - } - return selection; -} - -#define CHAR_0 0xA1 //Character code of '0' character - -#if ENGLISH -static void FrameType_DrawChoices(u8 selection) -{ - u8 text[6]; - u8 n = selection + 1; - u16 i; - - for (i = 0; gSystemText_Terminator[i] != EOS && i < 6; i++) - text[i] = gSystemText_Terminator[i]; - - //Convert number to decimal string - if (n / 10 != 0) - { - text[i] = n / 10 + CHAR_0; - i++; - text[i] = n % 10 + CHAR_0; - i++; - } - else - { - text[i] = n % 10 + CHAR_0; - i++; - text[i] = CHAR_SPACE; - i++; - } - - text[i] = EOS; - Menu_PrintText(gSystemText_Type, 15, 15); - Menu_PrintText(text, 18, 15); -} -#elif GERMAN -__attribute__((naked)) -static void FrameType_DrawChoices(u8 selection) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x10\n\ - lsls r0, 24\n\ - movs r1, 0x80\n\ - lsls r1, 17\n\ - adds r0, r1\n\ - lsrs r5, r0, 24\n\ - ldr r1, _0808C368 @ =gSystemText_Type\n\ - mov r0, sp\n\ - bl StringCopy\n\ - ldr r1, _0808C36C @ =gSystemText_Terminator\n\ - mov r0, sp\n\ - bl StringAppend\n\ - adds r4, r0, 0\n\ - adds r0, r5, 0\n\ - movs r1, 0xA\n\ - bl __udivsi3\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 24\n\ - lsrs r6, r0, 24\n\ - cmp r6, 0\n\ - beq _0808C370\n\ - adds r0, r1, 0\n\ - adds r0, 0xA1\n\ - strb r0, [r4]\n\ - adds r4, 0x1\n\ - adds r0, r5, 0\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - adds r0, 0xA1\n\ - strb r0, [r4]\n\ - b _0808C380\n\ - .align 2, 0\n\ -_0808C368: .4byte gSystemText_Type\n\ -_0808C36C: .4byte gSystemText_Terminator\n\ -_0808C370:\n\ - adds r0, r5, 0\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - adds r0, 0xA1\n\ - strb r0, [r4]\n\ - adds r4, 0x1\n\ - strb r6, [r4]\n\ -_0808C380:\n\ - adds r4, 0x1\n\ - movs r0, 0xFF\n\ - strb r0, [r4]\n\ - mov r0, sp\n\ - movs r1, 0xF\n\ - movs r2, 0xF\n\ - bl Menu_PrintText\n\ - add sp, 0x10\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -static u8 ButtonMode_ProcessInput(u8 selection) -{ - if (gMain.newKeys & DPAD_RIGHT) - { - if (selection < 2) - selection++; - else - selection = 0; - } - if (gMain.newKeys & DPAD_LEFT) - { - if (selection > 0) - selection--; - else - selection = 2; - } - return selection; -} - -static void ButtonMode_DrawChoices(u8 selection) -{ - u8 styles[3]; - - styles[0] = 0xF; - styles[1] = 0xF; - styles[2] = 0xF; - styles[selection] = 0x8; - - DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]); - DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); - DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); -} diff --git a/src/engine/palette.c b/src/engine/palette.c deleted file mode 100644 index 2a6602503..000000000 --- a/src/engine/palette.c +++ /dev/null @@ -1,832 +0,0 @@ -#include "global.h" -#include "palette.h" -#include "blend_palette.h" -#include "decompress.h" - -enum -{ - NORMAL_FADE, - FAST_FADE, - HARDWARE_FADE, -}; - -// These are structs for some unused palette system. -// The full functionality of this system is unknown. - -struct PaletteStructTemplate -{ - u16 uid; - u16 *src; - u16 pst_field_8_0:1; - u16 pst_field_8_1:9; - u16 size:5; - u16 pst_field_9_7:1; - u8 pst_field_A; - u8 srcCount:5; - u8 pst_field_B_5:3; - u8 pst_field_C; -}; - -struct PaletteStruct -{ - const struct PaletteStructTemplate *base; - u32 ps_field_4_0:1; - u16 ps_field_4_1:1; - u32 baseDestOffset:9; - u16 destOffset:10; - u16 srcIndex:7; - u8 ps_field_8; - u8 ps_field_9; -}; - -EWRAM_DATA u16 gPlttBufferUnfaded[0x200] = {0}; -EWRAM_DATA u16 gPlttBufferFaded[0x200] = {0}; -EWRAM_DATA static struct PaletteStruct sPaletteStructs[0x10] = {0}; -EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; -EWRAM_DATA u32 gFiller_202F394 = 0; -EWRAM_DATA static u32 sPlttBufferTransferPending = 0; -EWRAM_DATA static u8 sPaletteDecompressionBuffer[0x400] = {0}; - -static const struct PaletteStructTemplate sDummyPaletteStructTemplate = -{ - 0xFFFF, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0 -}; - -static void unused_sub_8073DFC(struct PaletteStruct *, u32 *); -static void unused_sub_8073F60(struct PaletteStruct *, u32 *); -static void unused_sub_8074020(struct PaletteStruct *); -static u8 GetPaletteNumByUid(u16); -static u8 UpdateNormalPaletteFade(void); -static void BeginFastPaletteFadeInternal(u8); -static u8 UpdateFastPaletteFade(void); -static u8 UpdateHardwarePaletteFade(void); -static void UpdateBlendRegisters(void); -static bool8 IsSoftwarePaletteFadeFinishing(void); - -void LoadCompressedPalette(const void *src, u16 offset, u16 size) -{ - LZDecompressWram(src, sPaletteDecompressionBuffer); - CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size); - CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferFaded + offset, size); -} - -void LoadPalette(const void *src, u16 offset, u16 size) -{ - CpuCopy16(src, gPlttBufferUnfaded + offset, size); - CpuCopy16(src, gPlttBufferFaded + offset, size); -} - -void FillPalette(u16 value, u16 offset, u16 size) -{ - CpuFill16(value, gPlttBufferUnfaded + offset, size); - CpuFill16(value, gPlttBufferFaded + offset, size); -} - -void TransferPlttBuffer(void) -{ - if (!gPaletteFade.bufferTransferDisabled) - { - void *src = gPlttBufferFaded; - void *dest = (void *)PLTT; - DmaCopy16(3, src, dest, PLTT_SIZE); - sPlttBufferTransferPending = 0; - if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) - UpdateBlendRegisters(); - } -} - -u8 UpdatePaletteFade(void) -{ - u8 result; - u8 dummy = 0; - - if (sPlttBufferTransferPending) - return -1; - - if (gPaletteFade.mode == NORMAL_FADE) - result = UpdateNormalPaletteFade(); - else if (gPaletteFade.mode == FAST_FADE) - result = UpdateFastPaletteFade(); - else - result = UpdateHardwarePaletteFade(); - - sPlttBufferTransferPending = gPaletteFade.multipurpose1 | dummy; - - return result; -} - -void ResetPaletteFade(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - ResetPaletteStruct(i); - - ResetPaletteFadeControl(); -} - -void ReadPlttIntoBuffers(void) -{ - u16 i; - u16 *pltt = (u16 *)PLTT; - - for (i = 0; i < PLTT_SIZE / 2; i++) - { - gPlttBufferUnfaded[i] = pltt[i]; - gPlttBufferFaded[i] = pltt[i]; - } -} - -bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor) -{ - u8 temp; - register u32 _blendColor asm("r8") = blendColor; - - if (gPaletteFade.active) - { - return FALSE; - } - else - { - gPaletteFade.deltaY = 2; - - if (delay < 0) - { - gPaletteFade.deltaY += (delay * -1); - delay = 0; - } - - gPaletteFade_selectedPalettes = selectedPalettes; - gPaletteFade.delayCounter = delay; - gPaletteFade_delay = delay; - gPaletteFade.y = startY; - gPaletteFade.targetY = targetY; - gPaletteFade.blendColor = _blendColor; - gPaletteFade.active = 1; - gPaletteFade.mode = NORMAL_FADE; - - if (startY < targetY) - gPaletteFade.yDec = 0; - else - gPaletteFade.yDec = 1; - - UpdatePaletteFade(); - - temp = gPaletteFade.bufferTransferDisabled; - gPaletteFade.bufferTransferDisabled = 0; - CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE); - sPlttBufferTransferPending = 0; - if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) - UpdateBlendRegisters(); - gPaletteFade.bufferTransferDisabled = temp; - return TRUE; - } -} - -bool8 unref_sub_8073D3C(u32 a1, u8 a2, u8 a3, u8 a4, u16 a5) -{ - ReadPlttIntoBuffers(); - return BeginNormalPaletteFade(a1, a2, a3, a4, a5); -} - -void unref_sub_8073D84(u8 a1, u32 *a2) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - struct PaletteStruct *palstruct = &sPaletteStructs[i]; - if (palstruct->ps_field_4_0) - { - if (palstruct->base->pst_field_8_0 == a1) - { - u8 val1 = palstruct->srcIndex; - u8 val2 = palstruct->base->srcCount; - if (val1 == val2) - { - unused_sub_8074020(palstruct); - if (!palstruct->ps_field_4_0) - continue; - } - if (palstruct->ps_field_8 == 0) - unused_sub_8073DFC(palstruct, a2); - else - palstruct->ps_field_8--; - - unused_sub_8073F60(palstruct, a2); - } - } - } -} - -static void unused_sub_8073DFC(struct PaletteStruct *a1, u32 *a2) -{ - s32 srcIndex; - s32 srcCount; - u8 i = 0; - u16 srcOffset = a1->srcIndex * a1->base->size; - - if (!a1->base->pst_field_8_0) - { - while (i < a1->base->size) - { - gPlttBufferUnfaded[a1->destOffset] = a1->base->src[srcOffset]; - gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset]; - i++; - a1->destOffset++; - srcOffset++; - } - } - else - { - while (i < a1->base->size) - { - gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset]; - i++; - a1->destOffset++; - srcOffset++; - } - } - - a1->destOffset = a1->baseDestOffset; - a1->ps_field_8 = a1->base->pst_field_A; - a1->srcIndex++; - - srcIndex = a1->srcIndex; - srcCount = a1->base->srcCount; - - if (srcIndex >= srcCount) - { - if (a1->ps_field_9) - a1->ps_field_9--; - a1->srcIndex = 0; - } - - *a2 |= 1 << (a1->baseDestOffset >> 4); -} - -static void unused_sub_8073F60(struct PaletteStruct *a1, u32 *a2) -{ - if (gPaletteFade.active && ((1 << (a1->baseDestOffset >> 4)) & gPaletteFade_selectedPalettes)) - { - if (!a1->base->pst_field_8_0) - { - if (gPaletteFade.delayCounter != gPaletteFade_delay) - { - BlendPalette( - a1->baseDestOffset, - a1->base->size, - gPaletteFade.y, - gPaletteFade.blendColor); - } - } - else - { - if (!gPaletteFade.delayCounter) - { - if (a1->ps_field_8 != a1->base->pst_field_A) - { - u32 srcOffset = a1->srcIndex * a1->base->size; - u8 i; - - for (i = 0; i < a1->base->size; i++) - gPlttBufferFaded[a1->baseDestOffset + i] = a1->base->src[srcOffset + i]; - } - } - } - } -} - -static void unused_sub_8074020(struct PaletteStruct *a1) -{ - if (!a1->ps_field_9) - { - s32 val = a1->base->pst_field_B_5; - - if (!val) - { - a1->srcIndex = 0; - a1->ps_field_8 = a1->base->pst_field_A; - a1->ps_field_9 = a1->base->pst_field_C; - a1->destOffset = a1->baseDestOffset; - } - else - { - if (val < 0) - return; - if (val > 2) - return; - ResetPaletteStructByUid(a1->base->uid); - } - } - else - { - a1->ps_field_9--; - } -} - -void ResetPaletteStructByUid(u16 a1) -{ - u8 paletteNum = GetPaletteNumByUid(a1); - if (paletteNum != 16) - ResetPaletteStruct(paletteNum); -} - -void ResetPaletteStruct(u8 paletteNum) -{ - sPaletteStructs[paletteNum].base = &sDummyPaletteStructTemplate; - sPaletteStructs[paletteNum].ps_field_4_0 = 0; - sPaletteStructs[paletteNum].baseDestOffset = 0; - sPaletteStructs[paletteNum].destOffset = 0; - sPaletteStructs[paletteNum].srcIndex = 0; - sPaletteStructs[paletteNum].ps_field_4_1 = 0; - sPaletteStructs[paletteNum].ps_field_8 = 0; - sPaletteStructs[paletteNum].ps_field_9 = 0; -} - -void ResetPaletteFadeControl() -{ - gPaletteFade.multipurpose1 = 0; - gPaletteFade.multipurpose2 = 0; - gPaletteFade.delayCounter = 0; - gPaletteFade.y = 0; - gPaletteFade.targetY = 0; - gPaletteFade.blendColor = 0; - gPaletteFade.active = 0; - gPaletteFade.multipurpose2 = 0; // assign same value twice - gPaletteFade.yDec = 0; - gPaletteFade.bufferTransferDisabled = 0; - gPaletteFade.shouldResetBlendRegisters = 0; - gPaletteFade.hardwareFadeFinishing = 0; - gPaletteFade.softwareFadeFinishing = 0; - gPaletteFade.softwareFadeFinishingCounter = 0; - gPaletteFade.objPaletteToggle = 0; - gPaletteFade.deltaY = 2; -} - -void unref_sub_8074168(u16 uid) -{ - u8 paletteNum = GetPaletteNumByUid(uid); - if (paletteNum != 16) - sPaletteStructs[paletteNum].ps_field_4_1 = 1; -} - -void unref_sub_8074194(u16 uid) -{ - u8 paletteNum = GetPaletteNumByUid(uid); - if (paletteNum != 16) - sPaletteStructs[paletteNum].ps_field_4_1 = 0; -} - -static u8 GetPaletteNumByUid(u16 uid) -{ - u8 i; - - for (i = 0; i < 16; i++) - if (sPaletteStructs[i].base->uid == uid) - return i; - - return 16; -} - -static u8 UpdateNormalPaletteFade() -{ - u16 paletteOffset; - u16 selectedPalettes; - - if (!gPaletteFade.active) - return 0; - - if (IsSoftwarePaletteFadeFinishing()) - { - return gPaletteFade.active; - } - else - { - if (!gPaletteFade.objPaletteToggle) - { - if (gPaletteFade.delayCounter < gPaletteFade_delay) - { - gPaletteFade.delayCounter++; - return 2; - } - gPaletteFade.delayCounter = 0; - } - - paletteOffset = 0; - - if (!gPaletteFade.objPaletteToggle) - { - selectedPalettes = gPaletteFade_selectedPalettes; - } - else - { - selectedPalettes = gPaletteFade_selectedPalettes >> 16; - paletteOffset = 256; - } - - while (selectedPalettes) - { - if (selectedPalettes & 1) - BlendPalette( - paletteOffset, - 16, - gPaletteFade.y, - gPaletteFade.blendColor); - selectedPalettes >>= 1; - paletteOffset += 16; - } - - gPaletteFade.objPaletteToggle ^= 1; - - if (!gPaletteFade.objPaletteToggle) - { - if (gPaletteFade.y == gPaletteFade.targetY) - { - gPaletteFade_selectedPalettes = 0; - gPaletteFade.softwareFadeFinishing = 1; - } - else - { - s8 val; - - if (!gPaletteFade.yDec) - { - val = gPaletteFade.y; - val += gPaletteFade.deltaY; - if (val > gPaletteFade.targetY) - val = gPaletteFade.targetY; - gPaletteFade.y = val; - } - else - { - val = gPaletteFade.y; - val -= gPaletteFade.deltaY; - if (val < gPaletteFade.targetY) - val = gPaletteFade.targetY; - gPaletteFade.y = val; - } - } - } - - return gPaletteFade.active; - } -} - -void InvertPlttBuffer(u32 selectedPalettes) -{ - u16 paletteOffset = 0; - - while (selectedPalettes) - { - if (selectedPalettes & 1) - { - u8 i; - for (i = 0; i < 16; i++) - gPlttBufferFaded[paletteOffset + i] = ~gPlttBufferFaded[paletteOffset + i]; - } - selectedPalettes >>= 1; - paletteOffset += 16; - } -} - -void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b) -{ - u16 paletteOffset = 0; - - while (selectedPalettes) - { - if (selectedPalettes & 1) - { - u8 i; - for (i = 0; i < 16; i++) - { - struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[paletteOffset + i]; - data->r += r; - data->g += g; - data->b += b; - } - } - selectedPalettes >>= 1; - paletteOffset += 16; - } -} - -void UnfadePlttBuffer(u32 selectedPalettes) -{ - u16 paletteOffset = 0; - - while (selectedPalettes) - { - if (selectedPalettes & 1) - { - u8 i; - for (i = 0; i < 16; i++) - gPlttBufferFaded[paletteOffset + i] = gPlttBufferUnfaded[paletteOffset + i]; - } - selectedPalettes >>= 1; - paletteOffset += 16; - } -} - -void BeginFastPaletteFade(u8 submode) -{ - gPaletteFade.deltaY = 2; - BeginFastPaletteFadeInternal(submode); -} - -static void BeginFastPaletteFadeInternal(u8 submode) -{ - gPaletteFade.y = 31; - gPaletteFade_submode = submode & 0x3F; - gPaletteFade.active = 1; - gPaletteFade.mode = FAST_FADE; - - if (submode == FAST_FADE_IN_FROM_BLACK) - CpuFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); - - if (submode == FAST_FADE_IN_FROM_WHITE) - CpuFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); - - UpdatePaletteFade(); -} - -static u8 UpdateFastPaletteFade(void) -{ - u16 i; - u16 paletteOffsetStart; - u16 paletteOffsetEnd; - s8 r0; - s8 g0; - s8 b0; - s8 r; - s8 g; - s8 b; - - if (!gPaletteFade.active) - return 0; - - if (IsSoftwarePaletteFadeFinishing()) - return gPaletteFade.active; - - if (gPaletteFade.objPaletteToggle) - { - paletteOffsetStart = 256; - paletteOffsetEnd = 512; - } - else - { - paletteOffsetStart = 0; - paletteOffsetEnd = 256; - } - - switch (gPaletteFade_submode) - { - case FAST_FADE_IN_FROM_WHITE: - for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) - { - struct PlttData *unfaded; - struct PlttData *faded; - - unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; - r0 = unfaded->r; - g0 = unfaded->g; - b0 = unfaded->b; - - faded = (struct PlttData *)&gPlttBufferFaded[i]; - r = faded->r - 2; - g = faded->g - 2; - b = faded->b - 2; - - if (r < r0) - r = r0; - if (g < g0) - g = g0; - if (b < b0) - b = b0; - - gPlttBufferFaded[i] = RGB(r, g, b); - } - break; - case FAST_FADE_OUT_TO_WHTIE: - for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) - { - struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; - r = data->r + 2; - g = data->g + 2; - b = data->b + 2; - - if (r > 31) - r = 31; - if (g > 31) - g = 31; - if (b > 31) - b = 31; - - gPlttBufferFaded[i] = RGB(r, g, b); - } - break; - case FAST_FADE_IN_FROM_BLACK: - for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) - { - struct PlttData *unfaded; - struct PlttData *faded; - - unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; - r0 = unfaded->r; - g0 = unfaded->g; - b0 = unfaded->b; - - faded = (struct PlttData *)&gPlttBufferFaded[i]; - r = faded->r + 2; - g = faded->g + 2; - b = faded->b + 2; - - if (r > r0) - r = r0; - if (g > g0) - g = g0; - if (b > b0) - b = b0; - - gPlttBufferFaded[i] = RGB(r, g, b); - } - break; - case FAST_FADE_OUT_TO_BLACK: - for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) - { - struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; - r = data->r - 2; - g = data->g - 2; - b = data->b - 2; - - if (r < 0) - r = 0; - if (g < 0) - g = 0; - if (b < 0) - b = 0; - - gPlttBufferFaded[i] = RGB(r, g, b); - } - } - - gPaletteFade.objPaletteToggle ^= 1; - - if (gPaletteFade.objPaletteToggle) - return gPaletteFade.active; - - if (gPaletteFade.y - gPaletteFade.deltaY < 0) - gPaletteFade.y = 0; - else - gPaletteFade.y -= gPaletteFade.deltaY; - - if (gPaletteFade.y == 0) - { - switch (gPaletteFade_submode) - { - case FAST_FADE_IN_FROM_WHITE: - case FAST_FADE_IN_FROM_BLACK: - CpuCopy32(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); - break; - case FAST_FADE_OUT_TO_WHTIE: - CpuFill32(0xFFFFFFFF, gPlttBufferFaded, PLTT_SIZE); - break; - case FAST_FADE_OUT_TO_BLACK: - CpuFill32(0x00000000, gPlttBufferFaded, PLTT_SIZE); - break; - } - - gPaletteFade.mode = NORMAL_FADE; - gPaletteFade.softwareFadeFinishing = 1; - } - - return gPaletteFade.active; -} - -void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters) -{ - gPaletteFade_blendCnt = blendCnt; - gPaletteFade.delayCounter = delay; - gPaletteFade_delay = delay; - gPaletteFade.y = y; - gPaletteFade.targetY = targetY; - gPaletteFade.active = 1; - gPaletteFade.mode = HARDWARE_FADE; - gPaletteFade.shouldResetBlendRegisters = shouldResetBlendRegisters & 1; - gPaletteFade.hardwareFadeFinishing = 0; - - if (y < targetY) - gPaletteFade.yDec = 0; - else - gPaletteFade.yDec = 1; -} - -static u8 UpdateHardwarePaletteFade(void) -{ - if (!gPaletteFade.active) - return 0; - - if (gPaletteFade.delayCounter < gPaletteFade_delay) - { - gPaletteFade.delayCounter++; - return 2; - } - - gPaletteFade.delayCounter = 0; - - if (!gPaletteFade.yDec) - { - gPaletteFade.y++; - if (gPaletteFade.y > gPaletteFade.targetY) - { - gPaletteFade.hardwareFadeFinishing++; - gPaletteFade.y--; - } - } - else - { - s32 y = gPaletteFade.y--; - if (y - 1 < gPaletteFade.targetY) - { - gPaletteFade.hardwareFadeFinishing++; - gPaletteFade.y++; - } - } - - if (gPaletteFade.hardwareFadeFinishing) - { - if (gPaletteFade.shouldResetBlendRegisters) - { - gPaletteFade_blendCnt = 0; - gPaletteFade.y = 0; - } - gPaletteFade.shouldResetBlendRegisters = 0; - } - - return gPaletteFade.active; -} - -static void UpdateBlendRegisters(void) -{ - REG_BLDCNT = gPaletteFade_blendCnt; - REG_BLDY = gPaletteFade.y; - if (gPaletteFade.hardwareFadeFinishing) - { - gPaletteFade.hardwareFadeFinishing = 0; - gPaletteFade.mode = 0; - gPaletteFade_blendCnt = 0; - gPaletteFade.y = 0; - gPaletteFade.active = 0; - } -} - -static bool8 IsSoftwarePaletteFadeFinishing(void) -{ - if (gPaletteFade.softwareFadeFinishing) - { - if (gPaletteFade.softwareFadeFinishingCounter == 4) - { - gPaletteFade.active = 0; - gPaletteFade.softwareFadeFinishing = 0; - gPaletteFade.softwareFadeFinishingCounter = 0; - } - else - { - gPaletteFade.softwareFadeFinishingCounter++; - } - - return TRUE; - } - else - { - return FALSE; - } -} - -void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) -{ - u16 paletteOffset; - - for (paletteOffset = 0; selectedPalettes; paletteOffset += 16) - { - if (selectedPalettes & 1) - BlendPalette(paletteOffset, 16, coeff, color); - selectedPalettes >>= 1; - } -} - -void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) -{ - DmaCopy32Defvars(3, gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); - BlendPalettes(selectedPalettes, coeff, color); -} diff --git a/src/engine/play_time.c b/src/engine/play_time.c deleted file mode 100644 index 9882c9c4b..000000000 --- a/src/engine/play_time.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "global.h" -#include "play_time.h" - -enum -{ - STOPPED, - RUNNING, - MAXED_OUT -}; - -static u8 sPlayTimeCounterState; - -void PlayTimeCounter_Reset() -{ - sPlayTimeCounterState = STOPPED; - - gSaveBlock2.playTimeHours = 0; - gSaveBlock2.playTimeMinutes = 0; - gSaveBlock2.playTimeSeconds = 0; - gSaveBlock2.playTimeVBlanks = 0; -} - -void PlayTimeCounter_Start() -{ - sPlayTimeCounterState = RUNNING; - - if (gSaveBlock2.playTimeHours > 999) - PlayTimeCounter_SetToMax(); -} - -void PlayTimeCounter_Stop() -{ - sPlayTimeCounterState = STOPPED; -} - -void PlayTimeCounter_Update() -{ - if (sPlayTimeCounterState == RUNNING) - { - gSaveBlock2.playTimeVBlanks++; - - if (gSaveBlock2.playTimeVBlanks > 59) - { - gSaveBlock2.playTimeVBlanks = 0; - gSaveBlock2.playTimeSeconds++; - - if (gSaveBlock2.playTimeSeconds > 59) - { - gSaveBlock2.playTimeSeconds = 0; - gSaveBlock2.playTimeMinutes++; - - if (gSaveBlock2.playTimeMinutes > 59) - { - gSaveBlock2.playTimeMinutes = 0; - gSaveBlock2.playTimeHours++; - - if (gSaveBlock2.playTimeHours > 999) - PlayTimeCounter_SetToMax(); - } - } - } - } -} - -void PlayTimeCounter_SetToMax() -{ - sPlayTimeCounterState = MAXED_OUT; - - gSaveBlock2.playTimeHours = 999; - gSaveBlock2.playTimeMinutes = 59; - gSaveBlock2.playTimeSeconds = 59; - gSaveBlock2.playTimeVBlanks = 59; -} diff --git a/src/engine/random.c b/src/engine/random.c deleted file mode 100644 index 8f82b722f..000000000 --- a/src/engine/random.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "global.h" -#include "random.h" - -// The number 1103515245 comes from the example implementation of rand and srand -// in the ISO C standard. - -u32 gRngValue; - -u16 Random(void) -{ - gRngValue = 1103515245 * gRngValue + 24691; - return gRngValue >> 16; -} - -void SeedRng(u16 seed) -{ - gRngValue = seed; -} diff --git a/src/engine/record_mixing.c b/src/engine/record_mixing.c deleted file mode 100644 index a2660bf82..000000000 --- a/src/engine/record_mixing.c +++ /dev/null @@ -1,1082 +0,0 @@ -#include "global.h" -#include "record_mixing.h" -#include "battle_tower.h" -#include "cable_club.h" -#include "daycare.h" -#include "dewford_trend.h" -#include "event_data.h" -#include "fldeff_recordmixing.h" -#include "item.h" -#include "constants/items.h" -#include "load_save.h" -#include "link.h" -#include "mauville_man.h" -#include "menu.h" -#include "mystery_event_script.h" -#include "random.h" -#include "overworld.h" -#include "save.h" -#include "script.h" -#include "secret_base.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "tv.h" -#include "ewram.h" - -EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02038738 = {0}; -extern u16 gSpecialVar_0x8005; - -u32 gUnknown_03005D2C; - -static u8 gUnknown_03000718; -static u8 gUnknown_0300071C[4]; - -void *recordMixingSecretBases = &gSaveBlock1.secretBases; -void *recordMixingTvShows = &gSaveBlock1.tvShows; -void *gUnknown_083D0274 = &gSaveBlock1.pokeNews; -void *gUnknown_083D0278 = &gSaveBlock1.mauvilleMan; -void *recordMixingEasyChatPairs = &gSaveBlock1.easyChatPairs; -struct RecordMixingDayCareMail *gUnknown_083D0280 = &gUnknown_02038738; -void *gBattleTowerPlayerRecord = &gSaveBlock2.battleTower.playerRecord; - -#define BUFFER_CHUNK_SIZE 200 - -void sub_80B929C(void) -{ - sub_8083A84(Task_RecordMixing_Main); -} - -struct PlayerRecords -{ - struct SecretBaseRecord secretBases[20]; - TVShow tvShows[25]; - u8 filler1004[0x40]; - u8 filler1044[0x40]; - struct EasyChatPair easyChatPairs[5]; - struct RecordMixingDayCareMail filler10AC; - struct BattleTowerRecord battleTowerRecord; - u16 filler11C8[0x34]; -}; - -void RecordMixing_PrepareExchangePacket(void) -{ - sub_80BC300(); - sub_80C045C(); - - memcpy(ewram_2018000.secretBases, recordMixingSecretBases, sizeof(ewram_2018000.secretBases)); - memcpy(ewram_2018000.tvShows, recordMixingTvShows, sizeof(ewram_2018000.tvShows)); - memcpy(ewram_2018000.filler1004, gUnknown_083D0274, sizeof(ewram_2008000.filler1004)); - memcpy(ewram_2018000.filler1044, gUnknown_083D0278, sizeof(ewram_2008000.filler1044)); - memcpy(ewram_2018000.easyChatPairs, recordMixingEasyChatPairs, sizeof(ewram_2018000.easyChatPairs)); - gUnknown_02038738.mail[0] = gSaveBlock1.daycare.misc.mail[0]; - gUnknown_02038738.mail[1] = gSaveBlock1.daycare.misc.mail[1]; - InitDaycareMailRecordMixing(gSaveBlock1.daycare.mons, &gUnknown_02038738); - memcpy(&ewram_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixingDayCareMail)); - memcpy(&ewram_2018000.battleTowerRecord, gBattleTowerPlayerRecord, sizeof(struct BattleTowerRecord)); - - if (GetMultiplayerId() == 0) - ewram_2018000.filler11C8[0] = GetRecordMixingGift(); -} - -void RecordMixing_ReceiveExchangePacket(u32 a) -{ - sub_80BD674(ewram_2008000.secretBases, sizeof(struct PlayerRecords), a); - sub_80BFD44((u8 *)ewram_2008000.tvShows, sizeof(struct PlayerRecords), a); - sub_80C0514(ewram_2008000.filler1004, sizeof(struct PlayerRecords), a); - sub_80B9B1C(ewram_2008000.filler1044, sizeof(struct PlayerRecords), a); - sub_80FA4E4(ewram_2008000.easyChatPairs, sizeof(struct PlayerRecords), a); - sub_80B9C6C((u8 *)&ewram_2008000.filler10AC, sizeof(struct PlayerRecords), a, ewram_2008000.tvShows); - sub_80B9B70(&ewram_2008000.battleTowerRecord, sizeof(struct PlayerRecords), a); - sub_80B9F3C(ewram_2008000.filler11C8, a); -} - -#define tCounter data[0] - -void Task_RecordMixing_SoundEffect(u8 taskId) -{ - gTasks[taskId].tCounter++; - if (gTasks[taskId].tCounter == 50) - { - PlaySE(SE_W213); - gTasks[taskId].tCounter = 0; - } -} - -#undef tCounter - - -#define tState data[0] -#define tSndEffTaskId data[15] - -void Task_RecordMixing_Main(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (tState) - { - case 0: // init - sub_8007270(gSpecialVar_0x8005); - VarSet(VAR_TEMP_0, 1); - gUnknown_03000718 = 0; - RecordMixing_PrepareExchangePacket(); - CreateRecordMixingSprite(); - tState = 1; - data[10] = CreateTask(sub_80B95F0, 0x50); - tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 0x51); - break; - case 1: // wait for sub_80B95F0 - if (!gTasks[data[10]].isActive) - { - tState = 2; - FlagSet(FLAG_SYS_MIX_RECORD); - DestroyRecordMixingSprite(); - DestroyTask(tSndEffTaskId); - } - break; - case 2: - data[10] = CreateTask(sub_80BA00C, 10); - tState = 3; - PlaySE(SE_W226); - break; - case 3: // wait for sub_80BA00C - if (!gTasks[data[10]].isActive) - { - tState = 4; - data[10] = sub_8083664(); - Menu_ClearWindowText(); - Menu_PrintText(gOtherText_MixingComplete, 2, 15); - data[8] = 0; - } - break; - case 4: // wait 60 frames - data[8]++; - if (data[8] > 60) - tState = 5; - break; - case 5: - if (!gTasks[data[10]].isActive) - { - sub_8055588(); - Menu_EraseScreen(); - DestroyTask(taskId); - EnableBothScriptContexts(); - } - break; - } -} - -void sub_80B95F0(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->tState) - { - case 0: - sub_80B9A78(); - Menu_DisplayDialogueFrame(); - Menu_PrintText(gOtherText_MixingRecordsWithFriend, 2, 15); - task->data[8] = 0x708; - task->tState = 400; - ClearLinkCallback_2(); - break; - case 100: // wait 20 frames - task->data[12]++; - if (task->data[12] > 20) - { - task->data[12] = 0; - task->tState = 101; - } - break; - case 101: - { - u8 players = GetLinkPlayerCount_2(); - - if (IsLinkMaster() == 1) - { - if (players == sub_800820C()) - { - PlaySE(SE_PIN); - task->tState = 201; - task->data[12] = 0; - } - } - else - { - PlaySE(SE_BOO); - task->tState = 301; - } - } - break; - case 201: - if (sub_800820C() == GetLinkPlayerCount_2()) - { - if (++task->data[12] > GetLinkPlayerCount_2() * 30) - { - sub_8007F4C(); - task->tState = 1; - } - } - break; - case 301: - if (sub_800820C() == GetLinkPlayerCount_2()) - task->tState = 1; - break; - case 400: // wait 20 frames - task->data[12]++; - if (task->data[12] > 20) - { - task->tState = 1; - task->data[12] = 0; - } - break; - case 1: // wait for handshake - if (gReceivedRemoteLinkPlayers) - { - ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), 2, 2); - task->tState = 5; - } - break; - case 2: - { - u8 subTaskId; - - task->data[6] = GetLinkPlayerCount_2(); - task->tState = 0; - task->data[5] = GetMultiplayerId_(); - task->func = Task_RecordMixing_SendPacket; - StorePtrInTaskData(&ewram_2018000, &task->data[2]); - subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50); - task->data[10] = subTaskId; - gTasks[subTaskId].data[0] = taskId; - StorePtrInTaskData((u8 *)&ewram_2008000, &gTasks[subTaskId].data[5]); - } - break; - case 5: // wait 60 frames - task->data[10]++; - if (task->data[10] > 60) - { - task->data[10] = 0; - task->tState = 2; - } - break; - } -} - -void Task_RecordMixing_SendPacket(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - // does this send the data 24 times? - - switch (task->tState) - { - case 0: //Copy record data to send buffer - { - void *recordData = (u8 *)LoadPtrFromTaskData(&task->data[2]) + BUFFER_CHUNK_SIZE * task->data[4]; - - memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE); - task->tState++; - } - break; - case 1: - if (GetMultiplayerId() == 0) - sub_8007E9C(1); - task->tState++; - break; - case 2: - break; - case 3: - task->data[4]++; - if ((u16)task->data[4] == 24) - task->tState++; - else - task->tState = 0; - break; - case 4: - if (!gTasks[task->data[10]].isActive) - task->func = Task_RecordMixing_SendPacket_SwitchToReceive; - } -} - -void Task_RecordMixing_CopyReceiveBuffer(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s32 recvStatus = GetBlockReceivedStatus(); - u8 handledPlayers = 0; - - if (recvStatus == sub_8008198()) - { - u8 player; - - for (player = 0; player < GetLinkPlayerCount(); player++) - { - void *src; - u8 *dst; - - if ((recvStatus >> player) & 1) - { - dst = LoadPtrFromTaskData(&task->data[5]) + task->data[player + 1] * BUFFER_CHUNK_SIZE + player * sizeof(struct PlayerRecords); - src = GetPlayerRecvBuffer(player); - if ((task->data[player + 1] + 1) * BUFFER_CHUNK_SIZE > sizeof(struct PlayerRecords)) - memcpy(dst, src, sizeof(struct PlayerRecords) - task->data[player + 1] * BUFFER_CHUNK_SIZE); - else - memcpy(dst, src, BUFFER_CHUNK_SIZE); - ResetBlockReceivedFlag(player); - task->data[player + 1]++; - if ((u16)task->data[player + 1] == 0x18) - handledPlayers++; - } - } - gTasks[task->data[0]].data[0]++; - } - if (handledPlayers == GetLinkPlayerCount()) - DestroyTask(taskId); -} - -void sub_80B99B4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - if (!gTasks[task->data[10]].isActive) - DestroyTask(taskId); -} - -void Task_RecordMixing_ReceivePacket(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->func = sub_80B99B4; - if (gUnknown_03000718 == 1) - RecordMixing_ReceiveExchangePacket(task->data[5]); -} - -void Task_RecordMixing_SendPacket_SwitchToReceive(u8 taskId) -{ - gTasks[taskId].func = Task_RecordMixing_ReceivePacket; - gUnknown_03000718 = 1; -} - -void *LoadPtrFromTaskData(u16 *taskData) -{ - return (void *)(taskData[0] | (taskData[1] << 16)); -} - -void StorePtrInTaskData(void *ptr, u16 *taskData) -{ - taskData[0] = (u32)ptr; - taskData[1] = (u32)ptr >> 16; -} - -u8 GetMultiplayerId_(void) -{ - return GetMultiplayerId(); -} - -u16 *GetPlayerRecvBuffer(u8 player) -{ - return gBlockRecvBuffer[player]; -} - -void sub_80B9A78(void) -{ - gUnknown_03005D2C = sizeof(struct PlayerRecords); -} - -const u8 gUnknown_083D0288[2] = {1, 0}; - -const u8 gUnknown_083D028A[2][3] = -{ - {1, 2, 0}, - {2, 0, 1}, -}; - -const u8 gUnknown_083D0290[9][4] = -{ - {1, 0, 3, 2}, - {3, 0, 1, 2}, - {2, 0, 3, 1}, - {1, 3, 0, 2}, - {2, 3, 0, 1}, - {3, 2, 0, 1}, - {1, 2, 3, 0}, - {2, 3, 1, 0}, - {3, 2, 1, 0}, -}; - -void sub_80B9A88(u8 *a) -{ - u32 i; - u32 id; - u32 players = GetLinkPlayerCount(); - - switch (players) - { - case 2: - for (i = 0; i < 2; i++) - a[i] = gUnknown_083D0288[i]; - break; - case 3: - id = GetLinkPlayerTrainerId(0) % 2; - for (i = 0; i < 3; i++) - a[i] = gUnknown_083D028A[id][i]; - break; - case 4: - id = GetLinkPlayerTrainerId(0) % 9; - for (i = 0; i < 4; i++) - a[i] = gUnknown_083D0290[id][i]; - break; - default: - break; - } -} - -void sub_80B9B1C(u8 *a, size_t size, u8 index) -{ - u8 arr[4]; - u8 *ptr; - - sub_80B9A88(arr); - //Probably not how it was originally written, but this matches. - memcpy(a + index * size, (ptr = gUnknown_083D0278), 0x40); - memcpy(ptr, a + arr[index] * size, 0x40); - sub_80F7F30(); -} - -void sub_80B9B70(void *battleTowerRecord, u32 size, u8 index) -{ - sub_80B9A88(gUnknown_0300071C); - memcpy(battleTowerRecord + size * index, battleTowerRecord + size * gUnknown_0300071C[index], sizeof(struct BattleTowerRecord)); - sub_8134AC0(battleTowerRecord + size * index); -} - -u8 sub_80B9BBC(u16 *a) -{ - return a[16]; -} - -void sub_80B9BC4(u8 *a, size_t b, u8 c[][2], u8 d, u8 e) -{ - struct DayCareMail *r6 = (struct DayCareMail *)(a + b * c[d][0]); - struct DayCareMail *src = r6 + c[d][1]; - struct DayCareMail sp0 = *src; - struct DayCareMail *r8 = (struct DayCareMail *)(a + b * c[e][0]); - - r6 += c[d][1]; - *r6 = *(r8 + c[e][1]); - - r8 += c[e][1]; - *r8 = sp0; -} - -u8 sub_80B9C4C(u8 *a) -{ - int i; - u8 r2 = 0; - - for (i = 0; i < 0x100; i++) - r2 += a[i]; - return r2; -} - -const u8 gUnknown_083D02B4[][2] = -{ - {0, 1}, - {1, 2}, - {2, 0}, -}; - -const u8 gUnknown_083D02BA[3][4] = -{ - {0, 1, 2, 3}, - {0, 2, 1, 3}, - {0, 3, 2, 1}, -}; - -#ifdef NONMATCHING -void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) -{ - u8 r8; - u8 sp4[4]; - u8 sp8[4]; - void *spC[4]; - u8 sp1C[4][2]; - u8 sp24[4][2]; - u8 sp3C; - u16 sp40 = Random(); - u16 i; // r3 - u16 r7; - u8 r1; - struct DayCareMisc *r6; - - //asm("":::"r8"); - SeedRng(gLinkPlayers[0].trainerId); - r8 = GetLinkPlayerCount(); - for (i = 0; i < 4; i++) - { - sp4[i] = 0xFF; - sp8[i] = 0; - sp1C[i][0] = 0; - sp1C[i][1] = 0; - } - sp3C = 0; - for (i = 0; i < r8; i++) - { - r6 = (struct DayCareMisc *)(a + b * i); - if (r6->numDaycareMons != 0) - { - for (r7 = 0; r7 < r6->numDaycareMons; r7++) - { - if (r6->itemsHeld[r7] == 0) - sp1C[i][r7] = 1; - } - } - //_080B9D3C - } - //_080B9D46 - for (r7 = 0, i = 0; i < r8; i++) - { - r6 = (struct DayCareMisc *)(a + b * i); - if (sp1C[i][0] == 1 || sp1C[i][1] == 1) - sp3C++; - if (sp1C[i][0] == 1 && sp1C[i][1] == 0) - { - sp24[r7][0] = i; - sp24[r7][1] = 0; - r7++; - } - else if (sp1C[i][0] == 0 && sp1C[i][1] == 1) - { - sp24[r7][0] = i; - sp24[r7][1] = 0; - r7++; - } - //else if (sp1C[i][0] == 1 + 1 && sp1C[i][1] + 1 == 1 + 1) - else if (sp1C[i][0] == 1 && sp1C[i][1] == 1) - { - u8 r4, r1; - - sp24[r7][0] = i; - r4 = sub_80B9BBC((u16 *)&r6->data[0]); - r1 = sub_80B9BBC((u16 *)&r6->data[1]); - - asm(""); - if (r4 == 0 && r1 != 0) - sp24[r7][1] = 1; - else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) - sp24[r7][1] = Random() % 2; - else - sp24[r7][1] = 0; - /* - if (r4 == 0 && r1 != 0) - sp24[r7][1] = 1; - else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) - sp24[r7][1] = Random() % 2; - else - sp24[r7][1] = 0; - */ - - /* - if (r4 == 0 && r1 != 0) - sp24[r7][1] = 1; - else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) - //sp24[r7][1] = ((Random() << 16) >> 16) % 2; - sp24[r7][1] = Random() % 2; - else - sp24[r7][1] = 0; - */ - //_080B9E2C: - r7++; - } - } - //_080B9E3E - for (i = 0; i < 4; i++) - { - r6 = (struct DayCareMisc *)a + b * c; - spC[i] = r6; - } - r1 = sub_80B9C4C(d) % 3; - switch (sp3C) - { - case 2: - sub_80B9BC4(a, b, (u8 *)sp24, 0, 1); - break; - case 3: - { - u8 var1 = gUnknown_083D02B4[r1][0]; - u8 var2 = gUnknown_083D02B4[r1][1]; - sub_80B9BC4(a, b, (u8 *)sp24, var1, var2); - } - break; - case 4: - { - u8 *r6 = (u8 *)sp24; - u8 var1 = gUnknown_083D02BA[r1][0]; - u8 var2 = gUnknown_083D02BA[r1][1]; - sub_80B9BC4(a, b, r6, var1, var2); - } - { - u8 *r6 = (u8 *)sp24; - u8 var1 = gUnknown_083D02BA[r1][2]; - u8 var2 = gUnknown_083D02BA[r1][3]; - sub_80B9BC4(a, b, r6, var1, var2); - } - break; - } - //_080B9EF0 - //memcpy(&gSaveBlock1.filler_303C.data[0], a + b * c, 0x38); - //memcpy(&gSaveBlock1.filler_303C.data[1], a + b * c + 0x38, 0x38); - r6 = (struct DayCareMisc *)(a + b * c); - gSaveBlock1.filler_303C.data[0] = r6->data[0]; - gSaveBlock1.filler_303C.data[1] = r6->data[1]; - //memcpy(&gSaveBlock1.filler_303C.data[0], &r6->data[0], 0x38); - //memcpy(&gSaveBlock1.filler_303C.data[1], &r6->data[1], 0x38); - SeedRng(sp40); -} -#else -__attribute__((naked)) -void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x58\n\ - str r0, [sp, 0x2C]\n\ - str r1, [sp, 0x30]\n\ - str r3, [sp, 0x38]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - str r2, [sp, 0x34]\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x40]\n\ - ldr r0, _080B9DA8 @ =gLinkPlayers\n\ - ldrh r0, [r0, 0x4]\n\ - bl SeedRng\n\ - bl GetLinkPlayerCount\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - movs r3, 0\n\ - add r0, sp, 0x1C\n\ - mov r9, r0\n\ - movs r1, 0x1D\n\ - add r1, sp\n\ - mov r10, r1\n\ - mov r2, sp\n\ - adds r2, 0xC\n\ - str r2, [sp, 0x4C]\n\ - movs r7, 0xFF\n\ - add r4, sp, 0x8\n\ - movs r2, 0\n\ - mov r6, r9\n\ - mov r5, r10\n\ -_080B9CBC:\n\ - mov r1, sp\n\ - adds r1, r3\n\ - adds r1, 0x4\n\ - ldrb r0, [r1]\n\ - orrs r0, r7\n\ - strb r0, [r1]\n\ - adds r0, r4, r3\n\ - strb r2, [r0]\n\ - lsls r1, r3, 1\n\ - adds r0, r6, r1\n\ - strb r2, [r0]\n\ - adds r1, r5, r1\n\ - strb r2, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x3\n\ - bls _080B9CBC\n\ - movs r4, 0\n\ - str r4, [sp, 0x3C]\n\ - movs r3, 0\n\ - mov r1, r8\n\ - lsls r0, r1, 16\n\ - lsrs r1, r0, 16\n\ - str r0, [sp, 0x50]\n\ - ldr r4, [sp, 0x30]\n\ - ldr r0, [sp, 0x34]\n\ - adds r2, r4, 0\n\ - muls r2, r0\n\ - str r2, [sp, 0x48]\n\ - ldr r2, [sp, 0x3C]\n\ - cmp r2, r1\n\ - bcs _080B9D46\n\ - mov r8, r1\n\ -_080B9D00:\n\ - ldr r4, [sp, 0x30]\n\ - adds r0, r4, 0\n\ - muls r0, r3\n\ - ldr r1, [sp, 0x2C]\n\ - adds r6, r1, r0\n\ - ldr r0, [r6, 0x70]\n\ - cmp r0, 0\n\ - beq _080B9D3C\n\ - movs r7, 0\n\ - cmp r7, r0\n\ - bcs _080B9D3C\n\ - adds r4, r6, 0\n\ - adds r4, 0x74\n\ - mov r2, r9\n\ - lsls r1, r3, 1\n\ - movs r5, 0x1\n\ -_080B9D20:\n\ - lsls r0, r7, 1\n\ - adds r0, r4, r0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - bne _080B9D30\n\ - adds r0, r7, r1\n\ - adds r0, r2, r0\n\ - strb r5, [r0]\n\ -_080B9D30:\n\ - adds r0, r7, 0x1\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ - ldr r0, [r6, 0x70]\n\ - cmp r7, r0\n\ - bcc _080B9D20\n\ -_080B9D3C:\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, r8\n\ - bcc _080B9D00\n\ -_080B9D46:\n\ - movs r7, 0\n\ - movs r3, 0\n\ - ldr r2, [sp, 0x50]\n\ - cmp r2, 0\n\ - beq _080B9E3E\n\ - mov r4, sp\n\ - adds r4, 0x24\n\ - str r4, [sp, 0x44]\n\ - movs r0, 0x25\n\ - add r0, sp\n\ - mov r8, r0\n\ -_080B9D5C:\n\ - ldr r1, [sp, 0x30]\n\ - adds r0, r1, 0\n\ - muls r0, r3\n\ - ldr r2, [sp, 0x2C]\n\ - adds r6, r2, r0\n\ - lsls r1, r3, 1\n\ - mov r4, r9\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - beq _080B9D7C\n\ - mov r2, r10\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080B9D86\n\ -_080B9D7C:\n\ - ldr r0, [sp, 0x3C]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x3C]\n\ -_080B9D86:\n\ - mov r4, r9\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080B9DAC\n\ - mov r2, r10\n\ - adds r0, r2, r1\n\ - ldrb r2, [r0]\n\ - cmp r2, 0\n\ - bne _080B9DAC\n\ -_080B9D9A:\n\ - lsls r1, r7, 1\n\ - ldr r4, [sp, 0x44]\n\ - adds r0, r4, r1\n\ - strb r3, [r0]\n\ - add r1, r8\n\ - strb r2, [r1]\n\ - b _080B9E2C\n\ - .align 2, 0\n\ -_080B9DA8: .4byte gLinkPlayers\n\ -_080B9DAC:\n\ - mov r2, r9\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080B9DC0\n\ - mov r4, r10\n\ - adds r0, r4, r1\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x1\n\ - beq _080B9D9A\n\ -_080B9DC0:\n\ - mov r2, r9\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080B9E32\n\ - mov r4, r10\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080B9E32\n\ - lsls r5, r7, 1\n\ - ldr r1, [sp, 0x44]\n\ - adds r0, r1, r5\n\ - strb r3, [r0]\n\ - adds r0, r6, 0\n\ - str r3, [sp, 0x54]\n\ - bl sub_80B9BBC\n\ - adds r4, r0, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r6, 0\n\ - adds r0, 0x38\n\ - bl sub_80B9BBC\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldr r3, [sp, 0x54]\n\ - cmp r4, 0\n\ - bne _080B9E0A\n\ - cmp r1, 0\n\ - beq _080B9E0E\n\ - mov r2, r8\n\ - adds r1, r2, r5\n\ - movs r0, 0x1\n\ - strb r0, [r1]\n\ - b _080B9E2C\n\ -_080B9E0A:\n\ - cmp r1, 0\n\ - beq _080B9E26\n\ -_080B9E0E:\n\ - str r3, [sp, 0x54]\n\ - bl Random\n\ - mov r4, r8\n\ - adds r2, r4, r5\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x1\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ - ldr r3, [sp, 0x54]\n\ - b _080B9E2C\n\ -_080B9E26:\n\ - mov r2, r8\n\ - adds r0, r2, r5\n\ - strb r1, [r0]\n\ -_080B9E2C:\n\ - adds r0, r7, 0x1\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ -_080B9E32:\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldr r4, [sp, 0x50]\n\ - cmp r0, r4\n\ - bcc _080B9D5C\n\ -_080B9E3E:\n\ - movs r3, 0\n\ - ldr r1, [sp, 0x48]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 3\n\ - ldr r2, [sp, 0x2C]\n\ - adds r6, r2, r0\n\ - ldr r1, [sp, 0x4C]\n\ -_080B9E4E:\n\ - lsls r0, r3, 2\n\ - adds r0, r1, r0\n\ - str r6, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x3\n\ - bls _080B9E4E\n\ - ldr r0, [sp, 0x38]\n\ - bl sub_80B9C4C\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldr r4, [sp, 0x3C]\n\ - cmp r4, 0x3\n\ - beq _080B9E9C\n\ - cmp r4, 0x3\n\ - bgt _080B9E82\n\ - cmp r4, 0x2\n\ - beq _080B9E8A\n\ - b _080B9EF0\n\ -_080B9E82:\n\ - ldr r0, [sp, 0x3C]\n\ - cmp r0, 0x4\n\ - beq _080B9EBC\n\ - b _080B9EF0\n\ -_080B9E8A:\n\ - add r2, sp, 0x24\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r1, [sp, 0x30]\n\ - movs r3, 0\n\ - bl sub_80B9BC4\n\ - b _080B9EF0\n\ -_080B9E9C:\n\ - ldr r0, _080B9EB8 @ =gUnknown_083D02B4\n\ - lsls r1, 1\n\ - adds r2, r1, r0\n\ - ldrb r3, [r2]\n\ - adds r0, 0x1\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - add r2, sp, 0x24\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r1, [sp, 0x30]\n\ - bl sub_80B9BC4\n\ - b _080B9EF0\n\ - .align 2, 0\n\ -_080B9EB8: .4byte gUnknown_083D02B4\n\ -_080B9EBC:\n\ - add r6, sp, 0x24\n\ - ldr r4, _080B9F2C @ =gUnknown_083D02BA\n\ - lsls r5, r1, 2\n\ - adds r0, r5, r4\n\ - ldrb r3, [r0]\n\ - adds r0, r4, 0x1\n\ - adds r0, r5, r0\n\ - ldrb r0, [r0]\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r1, [sp, 0x30]\n\ - adds r2, r6, 0\n\ - bl sub_80B9BC4\n\ - adds r0, r4, 0x2\n\ - adds r0, r5, r0\n\ - ldrb r3, [r0]\n\ - adds r4, 0x3\n\ - adds r5, r4\n\ - ldrb r0, [r5]\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x2C]\n\ - ldr r1, [sp, 0x30]\n\ - adds r2, r6, 0\n\ - bl sub_80B9BC4\n\ -_080B9EF0:\n\ - ldr r1, [sp, 0x2C]\n\ - ldr r2, [sp, 0x48]\n\ - adds r6, r1, r2\n\ - ldr r4, _080B9F30 @ =gSaveBlock1\n\ - ldr r1, _080B9F34 @ =0x0000303c\n\ - adds r0, r4, r1\n\ - adds r1, r6, 0\n\ - movs r2, 0x38\n\ - bl memcpy\n\ - ldr r2, _080B9F38 @ =0x00003074\n\ - adds r4, r2\n\ - adds r1, r6, 0\n\ - adds r1, 0x38\n\ - adds r0, r4, 0\n\ - movs r2, 0x38\n\ - bl memcpy\n\ - ldr r0, [sp, 0x40]\n\ - bl SeedRng\n\ - add sp, 0x58\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B9F2C: .4byte gUnknown_083D02BA\n\ -_080B9F30: .4byte gSaveBlock1\n\ -_080B9F34: .4byte 0x0000303c\n\ -_080B9F38: .4byte 0x00003074\n\ - .syntax divided\n"); -} -#endif - -void sub_80B9F3C(u16 *a, u8 b) -{ - if (b != 0 && *a != 0) - { - if (GetPocketByItemId(*a) == 5) - { - if (!CheckBagHasItem(*a, 1) && !CheckPCHasItem(*a, 1) && AddBagItem(*a, 1)) - { - VarSet(VAR_TEMP_1, *a); - StringCopy(gStringVar1, gLinkPlayers[0].name); - if (*a == ITEM_EON_TICKET) - FlagSet(FLAG_SYS_HAS_EON_TICKET); - } - else - { - VarSet(VAR_TEMP_1, ITEM_NONE); - } - } - else - { - if (AddBagItem(*a, 1) == TRUE) - { - VarSet(VAR_TEMP_1, *a); - StringCopy(gStringVar1, gLinkPlayers[0].name); - } - else - { - VarSet(VAR_TEMP_1, ITEM_NONE); - } - } - } -} - -void sub_80BA00C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - task->data[0]++; - break; - case 1: - task->data[0]++; - break; - case 2: - SetSecretBase2Field_9_AndHideBG(); - sub_8125E2C(); - task->data[0]++; - break; - case 3: - if (sub_8125E6C() != 0) - { - ClearSecretBase2Field_9_2(); - task->data[0]++; - task->data[1] = 0; - } - break; - case 4: - task->data[1]++; - if (task->data[1] > 10) - { - sub_800832C(); - task->data[0]++; - } - break; - case 5: - if (!gReceivedRemoteLinkPlayers) - DestroyTask(taskId); - break; - } -} diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c deleted file mode 100644 index 8c2c23569..000000000 --- a/src/engine/reset_rtc_screen.c +++ /dev/null @@ -1,692 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "rtc.h" -#include "save.h" -#include "script.h" -#include "sprite.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "scanline_effect.h" - -struct ResetRtcStruct -{ - /*0x0*/ u8 dataIndex; - /*0x2*/ u16 minVal; - /*0x4*/ u16 maxVal; - /*0x6*/ u8 left; - /*0x7*/ u8 right; - /*0x8*/ u8 unk8; -}; - -extern u16 gSaveFileStatus; - -void CB2_ResetRtcScreen(void); -void VBlankCB_ResetRtcScreen(void); -void Task_ResetRtcScreen(u8); - -static const struct ResetRtcStruct gUnknown_08376420[5] = -{ - { - .dataIndex = 3, - .minVal = 1, - .maxVal = 9999, - .left = 0, - .right = 2, - .unk8 = 0, - }, - { - .dataIndex = 4, - .minVal = 0, - .maxVal = 23, - .left = 1, - .right = 3, - .unk8 = 0, - }, - { - .dataIndex = 5, - .minVal = 0, - .maxVal = 59, - .left = 2, - .right = 4, - .unk8 = 0, - }, - { - .dataIndex = 6, - .minVal = 0, - .maxVal = 59, - .left = 3, - .right = 5, - .unk8 = 0, - }, - { - .dataIndex = 7, - .minVal = 0, - .maxVal = 0, - .left = 4, - .right = 0, - .unk8 = 6, - }, -}; - -const struct OamData gOamData_837645C = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const u8 gSpriteImage_8376464[] = INCBIN_U8("graphics/unknown_sprites/83764AC/0.4bpp"); -const u8 gSpriteImage_8376484[] = INCBIN_U8("graphics/unknown_sprites/83764AC/1.4bpp"); - -const u16 Palette_3764A4[] = INCBIN_U16("graphics/unknown/83764A4.gbapal"); - -const struct SpriteFrameImage gSpriteImageTable_83764AC[] = -{ - { gSpriteImage_8376464, 0x20 }, - { gSpriteImage_8376484, 0x20 }, -}; - -const struct SpritePalette gUnknown_083764BC = -{ - .data = Palette_3764A4, - .tag = 0x1000, -}; - -const union AnimCmd gSpriteAnim_83764C4[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd gSpriteAnim_83764CC[] = -{ - ANIMCMD_FRAME(0, 158, .vFlip = TRUE), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd gSpriteAnim_83764D4[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd *const gSpriteAnimTable_83764DC[] = -{ - gSpriteAnim_83764C4, - gSpriteAnim_83764CC, - gSpriteAnim_83764D4, -}; - -const struct SpriteTemplate gSpriteTemplate_83764E8 = -{ - .tileTag = 0xFFFF, - .paletteTag = 0x1000, - .oam = &gOamData_837645C, - .anims = gSpriteAnimTable_83764DC, - .images = gSpriteImageTable_83764AC, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -const u8 gUnknown_08376500[] = _(" : "); - -void SpriteCB_ResetRtcCusor0(struct Sprite *sprite) -{ - int state = gTasks[sprite->data[0]].data[2]; - if (state != sprite->data[1]) - { - sprite->data[1] = state; - switch (state) - { - case 1: - sprite->invisible = FALSE; - sprite->animNum = 1; - sprite->animDelayCounter = 0; - sprite->pos1.x = 53; - sprite->pos1.y = 68; - break; - case 2: - sprite->invisible = FALSE; - sprite->animNum = 1; - sprite->animDelayCounter = 0; - sprite->pos1.x = 86; - sprite->pos1.y = 68; - break; - case 3: - sprite->invisible = FALSE; - sprite->animNum = 1; - sprite->animDelayCounter = 0; - sprite->pos1.x = 107; - sprite->pos1.y = 68; - break; - case 4: - sprite->invisible = FALSE; - sprite->animNum = 1; - sprite->animDelayCounter = 0; - sprite->pos1.x = 128; - sprite->pos1.y = 68; - break; - case 5: - sprite->invisible = FALSE; - sprite->animNum = 2; - sprite->animDelayCounter = 0; - sprite->pos1.x = 155; - sprite->pos1.y = 80; - break; - case 6: - DestroySprite(sprite); - break; - } - } -} - -void SpriteCB_ResetRtcCusor1(struct Sprite *sprite) -{ - int state = gTasks[sprite->data[0]].data[2]; - if (state != sprite->data[1]) - { - sprite->data[1] = state; - switch (state) - { - case 1: - sprite->invisible = FALSE; - sprite->animNum = 0; - sprite->animDelayCounter = 0; - sprite->pos1.x = 53; - sprite->pos1.y = 92; - break; - case 2: - sprite->invisible = FALSE; - sprite->animNum = 0; - sprite->animDelayCounter = 0; - sprite->pos1.x = 86; - sprite->pos1.y = 92; - break; - case 3: - sprite->invisible = FALSE; - sprite->animNum = 0; - sprite->animDelayCounter = 0; - sprite->pos1.x = 107; - sprite->pos1.y = 92; - break; - case 4: - sprite->invisible = FALSE; - sprite->animNum = 0; - sprite->animDelayCounter = 0; - sprite->pos1.x = 128; - sprite->pos1.y = 92; - break; - case 5: - sprite->invisible = TRUE; - break; - case 6: - DestroySprite(sprite); - break; - } - } -} - -void ResetRtcScreen_CreateCursor(u8 taskId) -{ - int spriteId; - - LoadSpritePalette(&gUnknown_083764BC); - - spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0); - gSprites[spriteId].callback = SpriteCB_ResetRtcCusor0; - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = -1; - - spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0); - gSprites[spriteId].callback = SpriteCB_ResetRtcCusor1; - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = -1; -} - -void ResetRtcScreen_FreeCursorPalette(void) -{ - FreeSpritePaletteByTag(gUnknown_083764BC.tag); -} - -void ResetRtcScreen_HideChooseTimeWindow(void) -{ - Menu_EraseWindowRect(3, 8, 25, 11); -} - -void ResetRtcScreen_PrintTime(u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 seconds) -{ - u8 *dest = gStringVar4; - days %= 10000; - hours %= 24; - minutes %= 60; - seconds %= 60; - sub_8072C44(gStringVar1, days, 24, 1); - dest = StringCopy(dest, gStringVar1); - dest = StringCopy(dest, gOtherText_Day); - sub_8072C44(gStringVar1, hours, 18, 1); - dest = StringCopy(dest, gStringVar1); - dest = StringCopy(dest, gUnknown_08376500); - dest = ConvertIntToDecimalStringN(dest, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); - dest = StringCopy(dest, gUnknown_08376500); - ConvertIntToDecimalStringN(dest, seconds, STR_CONV_MODE_LEADING_ZEROS, 2); - Menu_PrintText(gStringVar4, x, y); -} - -void ResetRtcScreen_ShowChooseTimeWindow(u16 days, u8 hours, u8 minutes, u8 seconds) -{ - Menu_DrawStdWindowFrame(3, 8, 25, 11); - Menu_PrintText(gOtherText_OK, 20, 9); - ResetRtcScreen_PrintTime(4, 9, days, hours, minutes, seconds); -} - -bool32 ResetRtcScreen_MoveTimeUpDown(s16 *val, int minVal, int maxVal, u16 keys) -{ - if (keys & DPAD_DOWN) - { - (*val)--; - if (*val < minVal) - *val = maxVal; - } - else if (keys & DPAD_UP) - { - (*val)++; - if (*val > maxVal) - *val = minVal; - } - else if (keys & DPAD_LEFT) - { - *val -= 10; - if (*val < minVal) - *val = maxVal; - } - else if (keys & DPAD_RIGHT) - { - *val += 10; - if (*val > maxVal) - *val = minVal; - } - else - { - return FALSE; - } - - return TRUE; -} - -void Task_ResetRtc_3(u8 taskId) -{ - gTasks[taskId].data[0] = 1; -} - -void Task_ResetRtc_2(u8 taskId) -{ - ResetRtcScreen_HideChooseTimeWindow(); - ResetRtcScreen_FreeCursorPalette(); - gTasks[taskId].func = Task_ResetRtc_3; -} - -void Task_ResetRtc_1(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - u8 selection = data[2]; - const struct ResetRtcStruct *selectionInfo = &gUnknown_08376420[selection - 1]; - - if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].func = Task_ResetRtc_2; - data[1] = 0; - data[2] = 6; - PlaySE(SE_SELECT); - return; - } - - if (gMain.newKeys & DPAD_RIGHT) - { - if (selectionInfo->right) - { - data[2] = selectionInfo->right; - PlaySE(SE_SELECT); - return; - } - } - - if (gMain.newKeys & DPAD_LEFT) - { - if (selectionInfo->left) - { - data[2] = selectionInfo->left; - PlaySE(SE_SELECT); - return; - } - } - - if (selection == 5) - { - if (gMain.newKeys & A_BUTTON) - { - gLocalTime.days = data[3]; - gLocalTime.hours = data[4]; - gLocalTime.minutes = data[5]; - gLocalTime.seconds = data[6]; - PlaySE(SE_SELECT); - gTasks[taskId].func = Task_ResetRtc_2; - data[1] = 1; - data[2] = 6; - } - } - else if (ResetRtcScreen_MoveTimeUpDown(&data[selectionInfo->dataIndex], selectionInfo->minVal, selectionInfo->maxVal, gMain.newAndRepeatedKeys & (DPAD_UP | DPAD_DOWN))) - { - PlaySE(SE_SELECT); - ResetRtcScreen_PrintTime(4, 9, data[3], data[4], data[5], data[6]); - } -} - -void Task_ResetRtc_0(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - data[0] = 0; - data[3] = gLocalTime.days; - data[4] = gLocalTime.hours; - data[5] = gLocalTime.minutes; - data[6] = gLocalTime.seconds; - ResetRtcScreen_ShowChooseTimeWindow(data[3], data[4], data[5], data[6]); - ResetRtcScreen_CreateCursor(taskId); - data[2] = 2; - gTasks[taskId].func = Task_ResetRtc_1; -} - -void CB2_InitResetRtcScreen(void) -{ - REG_DISPCNT = 0; - SetVBlankCallback(NULL); - DmaClear16(3, PLTT, PLTT_SIZE); - DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); - ResetOamRange(0, 128); - LoadOam(); - ScanlineEffect_Stop(); - ScanlineEffect_Clear(); - ResetSpriteData(); - ResetTasks(); - ResetPaletteFade(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - REG_DISPCNT = 4352; - SetVBlankCallback(VBlankCB_ResetRtcScreen); - SetMainCallback2(CB2_ResetRtcScreen); - CreateTask(Task_ResetRtcScreen, 80); -} - -void CB2_ResetRtcScreen(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void VBlankCB_ResetRtcScreen(void) -{ - ProcessSpriteCopyRequests(); - LoadOam(); - TransferPlttBuffer(); -} - -void ResetRtcScreen_ShowMessage(const u8 *str) -{ - Menu_DisplayDialogueFrame(); - Menu_PrintText(str, 2, 15); -} - -void Task_ShowResetRtcPrompt(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 20, 10); - Menu_PrintText(gSystemText_PresentTime, 1, 1); - ResetRtcScreen_PrintTime( - 1, - 3, - gLocalTime.days, - gLocalTime.hours, - gLocalTime.minutes, - gLocalTime.seconds); - Menu_PrintText(gSystemText_PreviousTime, 1, 5); - ResetRtcScreen_PrintTime( - 1, - 7, - gSaveBlock2.lastBerryTreeUpdate.days, - gSaveBlock2.lastBerryTreeUpdate.hours, - gSaveBlock2.lastBerryTreeUpdate.minutes, - gSaveBlock2.lastBerryTreeUpdate.seconds); - ResetRtcScreen_ShowMessage(gSystemText_ResetRTCPrompt); - data[0]++; - case 1: - if (gMain.newKeys & B_BUTTON) - { - DestroyTask(taskId); - DoSoftReset(); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - DestroyTask(taskId); - } - break; - } -} - -void Task_ResetRtcScreen(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, 0xFFFF); - data[0] = 1; - break; - case 1: - if (!gPaletteFade.active) - { - if (gSaveFileStatus == 0 || gSaveFileStatus == 2) - { - ResetRtcScreen_ShowMessage(gSystemText_NoSaveFileNoTime); - data[0] = 5; - } - else - { - RtcCalcLocalTime(); - data[1] = CreateTask(Task_ShowResetRtcPrompt, 80); - data[0] = 2; - } - } - break; - case 2: - if (gTasks[data[1]].isActive != TRUE) - { - Menu_EraseScreen(); - ResetRtcScreen_ShowMessage(gSystemText_PleaseResetTime); - gLocalTime = gSaveBlock2.lastBerryTreeUpdate; - data[1] = CreateTask(Task_ResetRtc_0, 80); - data[0] = 3; - } - break; - case 3: - if (gTasks[data[1]].data[0]) - { - if (!gTasks[data[1]].data[1]) - { - DestroyTask(data[1]); - data[0] = 2; - } - else - { - DestroyTask(data[1]); - RtcReset(); - RtcCalcLocalTimeOffset( - gLocalTime.days, - gLocalTime.hours, - gLocalTime.minutes, - gLocalTime.seconds); - gSaveBlock2.lastBerryTreeUpdate = gLocalTime; - VarSet(VAR_DAYS, gLocalTime.days); - DisableResetRTC(); - ResetRtcScreen_ShowMessage(gSystemText_ClockResetDataSave); - data[0] = 4; - } - } - break; - case 4: - if (Save_WriteData(0) == SAVE_STATUS_OK) - { - ResetRtcScreen_ShowMessage(gSystemText_SaveCompleted); - PlaySE(SE_PINPON); - } - else - { - ResetRtcScreen_ShowMessage(gSystemText_SaveFailed); - PlaySE(SE_BOO); - } - data[0] = 5; - // fall through - case 5: - if (gMain.newKeys & A_BUTTON) - { - BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, 0xFFFF); - data[0] = 6; - } - else - { - break; - } - // fall through - case 6: - if (!gPaletteFade.active) - { - DestroyTask(taskId); - DoSoftReset(); - } - } -} - -#if DEBUG -void debug_sub_806F8F8(void) -{ - SetMainCallback2(CB2_InitResetRtcScreen); -} - -void debug_sub_806F908(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - data[1] = CreateTask(Task_ResetRtc_0, 80); - data[0]++; - break; - case 1: - if (gTasks[data[1]].data[0] != 0) - { - if (gTasks[data[1]].data[1] == 1) - RtcCalcLocalTimeOffset(gLocalTime.days, gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds); - DestroyTask(data[1]); - Menu_EraseScreen(); - ScriptContext2_Disable(); - DestroyTask(taskId); - } - break; - } -} - -void debug_sub_806F99C(void) -{ - RtcCalcLocalTime(); - CreateTask(debug_sub_806F908, 80); - ScriptContext2_Enable(); -} - -void debug_sub_806F9B8(void) -{ - gLocalTime = gSaveBlock2.lastBerryTreeUpdate; - CreateTask(debug_sub_806F908, 80); - ScriptContext2_Enable(); -} - -static const u8 sDebugText_Days[] = _("にっすう"); // "days" -static const u8 sDebugText_Time[] = _("じかん"); // "time" -static const u8 sDebugText_GameTime[] = _("ゲームない じかん"); // "game time" -static const u8 sDebugText_RTCTime[] = _("RTC じかん"); // "RTC time" - -void debug_sub_806F9E4(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - u8 *str = gStringVar4; - - switch (data[0]) - { - case 0: - data[0]++; - break; - case 1: - Menu_DrawStdWindowFrame(0, 9, 29, 19); - ConvertIntToHexStringN(str + 80, RtcGetErrorStatus(), 2, 4); - Menu_PrintText(str + 80, 2, 10); - Menu_PrintText(sDebugText_Days, 12, 12); - Menu_PrintText(sDebugText_Time, 20, 12); - Menu_PrintText(sDebugText_RTCTime, 1, 14); - Menu_PrintText(sDebugText_GameTime, 1, 16); - data[0]++; - break; - case 2: - RtcCalcLocalTime(); - FormatHexRtcTime(str); - debug_sub_8009894(str + 20); - FormatDecimalTime(str + 40, gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds); - ConvertIntToDecimalStringN(str + 60, gLocalTime.days, 1, 4); - if (gSaveBlock2.playTimeVBlanks == 0) - { - Menu_PrintText(str, 20, 14); - Menu_PrintText(str + 20, 12, 14); - Menu_PrintText(str + 40, 20, 16); - Menu_PrintText(str + 60, 12, 16); - } - if (data[1] > 19) // Did you mean < 19? - { - data[1]++; - } - else - { - if (gMain.newKeys & A_BUTTON) - { - Menu_EraseScreen(); - DestroyTask(taskId); - ScriptContext2_Disable(); - } - } - break; - } -} -#endif \ No newline at end of file diff --git a/src/engine/rtc.c b/src/engine/rtc.c deleted file mode 100644 index 5462298ed..000000000 --- a/src/engine/rtc.c +++ /dev/null @@ -1,378 +0,0 @@ -#include "global.h" -#include "rtc.h" -#include "string_util.h" -#include "text.h" - -static u16 sErrorStatus; -static struct SiiRtcInfo sRtc; -static u8 sProbeResult; -static u16 sSavedIme; - -struct Time gLocalTime; - -static const struct SiiRtcInfo sRtcDummy = {0, MONTH_JAN, 1}; // 2000 Jan 1 - -static const s32 sNumDaysInMonths[12] = -{ - 31, - 28, - 31, - 30, - 31, - 30, - 31, - 31, - 30, - 31, - 30, - 31, -}; - -void RtcDisableInterrupts() -{ - sSavedIme = REG_IME; - REG_IME = 0; -} - -void RtcRestoreInterrupts() -{ - REG_IME = sSavedIme; -} - -u32 ConvertBcdToBinary(u8 bcd) -{ - if (bcd > 0x9F) - return 0xFF; - - if ((bcd & 0xF) <= 9) - return (10 * ((bcd >> 4) & 0xF)) + (bcd & 0xF); - else - return 0xFF; -} - -bool8 IsLeapYear(u8 year) -{ - if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) - return TRUE; - - return FALSE; -} - -u16 ConvertDateToDayCount(u8 year, u8 month, u8 day) -{ - s32 i; - u16 dayCount = 0; - -#ifndef BUGFIX_BERRY - // The berry glitch was caused by not adding days for the year 2000. - for (i = year - 1; i > 0; i--) - { - dayCount += 365; - - if (IsLeapYear(i) == TRUE) - dayCount++; - } -#else - // The fix was to use "i >= 0" as the condition instead of "i > 0". - for (i = year - 1; i >= 0; i--) - { - dayCount += 365; - - if (IsLeapYear(i) == TRUE) - dayCount++; - } -#endif // BUGFIX_BERRY - - for (i = 0; i < month - 1; i++) - dayCount += sNumDaysInMonths[i]; - - if (month > MONTH_FEB && IsLeapYear(year) == TRUE) - dayCount++; - - dayCount += day; - - return dayCount; -} - -u16 RtcGetDayCount(struct SiiRtcInfo *rtc) -{ - u8 year = ConvertBcdToBinary(rtc->year); - u8 month = ConvertBcdToBinary(rtc->month); - u8 day = ConvertBcdToBinary(rtc->day); - return ConvertDateToDayCount(year, month, day); -} - -void RtcInit() -{ - sErrorStatus = 0; - - RtcDisableInterrupts(); - SiiRtcUnprotect(); - sProbeResult = SiiRtcProbe(); - RtcRestoreInterrupts(); - - if (!(sProbeResult & 0xF)) - { - sErrorStatus = RTC_INIT_ERROR; - return; - } - - if (sProbeResult & 0xF0) - sErrorStatus = RTC_INIT_WARNING; - else - sErrorStatus = 0; - - RtcGetRawInfo(&sRtc); - sErrorStatus = RtcCheckInfo(&sRtc); -} - -u16 RtcGetErrorStatus() -{ - return sErrorStatus; -} - -void RtcGetInfo(struct SiiRtcInfo *rtc) -{ - if (sErrorStatus & RTC_ERR_FLAG_MASK) - *rtc = sRtcDummy; - else - RtcGetRawInfo(rtc); -} - -void RtcGetDateTime(struct SiiRtcInfo *rtc) -{ - RtcDisableInterrupts(); - SiiRtcGetDateTime(rtc); - RtcRestoreInterrupts(); -} - -void RtcGetStatus(struct SiiRtcInfo *rtc) -{ - RtcDisableInterrupts(); - SiiRtcGetStatus(rtc); - RtcRestoreInterrupts(); -} - -void RtcGetRawInfo(struct SiiRtcInfo *rtc) -{ - RtcGetStatus(rtc); - RtcGetDateTime(rtc); -} - -u16 RtcCheckInfo(struct SiiRtcInfo *rtc) -{ - u16 errorFlags = 0; - s32 year; - s32 month; - s32 value; - - if (rtc->status & SIIRTCINFO_POWER) - errorFlags |= RTC_ERR_POWER_FAILURE; - - if (!(rtc->status & SIIRTCINFO_24HOUR)) - errorFlags |= RTC_ERR_12HOUR_CLOCK; - - year = ConvertBcdToBinary(rtc->year); - - if (year == 0xFF) - errorFlags |= RTC_ERR_INVALID_YEAR; - - month = ConvertBcdToBinary(rtc->month); - - if (month == 0xFF || month == 0 || month > 12) - errorFlags |= RTC_ERR_INVALID_MONTH; - - value = ConvertBcdToBinary(rtc->day); - - if (value == 0xFF) - errorFlags |= RTC_ERR_INVALID_DAY; - - if (month == MONTH_FEB) - { - if (value > IsLeapYear(year) + sNumDaysInMonths[month - 1]) - errorFlags |= RTC_ERR_INVALID_DAY; - } - else - { - if (value > sNumDaysInMonths[month - 1]) - errorFlags |= RTC_ERR_INVALID_DAY; - } - - value = ConvertBcdToBinary(rtc->hour); - - if (value > 24) - errorFlags |= RTC_ERR_INVALID_HOUR; - - value = ConvertBcdToBinary(rtc->minute); - - if (value > 60) - errorFlags |= RTC_ERR_INVALID_MINUTE; - - value = ConvertBcdToBinary(rtc->second); - - if (value > 60) - errorFlags |= RTC_ERR_INVALID_SECOND; - - return errorFlags; -} - -void RtcReset() -{ - RtcDisableInterrupts(); - SiiRtcReset(); - RtcRestoreInterrupts(); -} - -void FormatDecimalTime(u8 *dest, s32 hour, s32 minute, s32 second) -{ - dest = ConvertIntToDecimalStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_COLON; - dest = ConvertIntToDecimalStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_COLON; - dest = ConvertIntToDecimalStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest = EOS; -} - -void FormatHexTime(u8 *dest, s32 hour, s32 minute, s32 second) -{ - dest = ConvertIntToHexStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_COLON; - dest = ConvertIntToHexStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_COLON; - dest = ConvertIntToHexStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest = EOS; -} - -void FormatHexRtcTime(u8 *dest) -{ - FormatHexTime(dest, sRtc.hour, sRtc.minute, sRtc.second); -} - -void FormatDecimalDate(u8 *dest, s32 year, s32 month, s32 day) -{ - dest = ConvertIntToDecimalStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4); - *dest++ = CHAR_HYPHEN; - dest = ConvertIntToDecimalStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_HYPHEN; - dest = ConvertIntToDecimalStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest = EOS; -} - -void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day) -{ - dest = ConvertIntToHexStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4); - *dest++ = CHAR_HYPHEN; - dest = ConvertIntToHexStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest++ = CHAR_HYPHEN; - dest = ConvertIntToHexStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2); - *dest = EOS; -} - -#if DEBUG - -void debug_sub_800987C(u8 *dest) -{ - FormatHexDate(dest, sRtc.year, sRtc.month, sRtc.day); -} - -void debug_sub_8009894(u8 *dest) -{ - u16 dayCount; - - dayCount = RtcGetDayCount(&sRtc); - ConvertIntToDecimalStringN(dest, dayCount, STR_CONV_MODE_RIGHT_ALIGN, 4); -} - -void debug_sub_80098B8(u8 *dest) -{ - ConvertIntToHexStringN(dest, sRtc.status, STR_CONV_MODE_LEADING_ZEROS, 2); -} - -#endif - -void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t) -{ - u16 days = RtcGetDayCount(rtc); - result->seconds = ConvertBcdToBinary(rtc->second) - t->seconds; - result->minutes = ConvertBcdToBinary(rtc->minute) - t->minutes; - result->hours = ConvertBcdToBinary(rtc->hour) - t->hours; - result->days = days - t->days; - - if (result->seconds < 0) - { - result->seconds += 60; - --result->minutes; - } - - if (result->minutes < 0) - { - result->minutes += 60; - --result->hours; - } - - if (result->hours < 0) - { - result->hours += 24; - --result->days; - } -} - -void RtcCalcLocalTime() -{ - RtcGetInfo(&sRtc); - RtcCalcTimeDifference(&sRtc, &gLocalTime, &gSaveBlock2.localTimeOffset); -} - -void RtcInitLocalTimeOffset(s32 hour, s32 minute) -{ - RtcCalcLocalTimeOffset(0, hour, minute, 0); -} - -void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds) -{ - gLocalTime.days = days; - gLocalTime.hours = hours; - gLocalTime.minutes = minutes; - gLocalTime.seconds = seconds; - RtcGetInfo(&sRtc); - RtcCalcTimeDifference(&sRtc, &gSaveBlock2.localTimeOffset, &gLocalTime); -} - -void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2) -{ - result->seconds = t2->seconds - t1->seconds; - result->minutes = t2->minutes - t1->minutes; - result->hours = t2->hours - t1->hours; - result->days = t2->days - t1->days; - - if (result->seconds < 0) - { - result->seconds += 60; - --result->minutes; - } - - if (result->minutes < 0) - { - result->minutes += 60; - --result->hours; - } - - if (result->hours < 0) - { - result->hours += 24; - --result->days; - } -} - -u32 RtcGetMinuteCount() -{ - RtcGetInfo(&sRtc); - return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute; -} - -#if DEBUG -void debug_sub_8009A60() -{ - RtcGetRawInfo(&sRtc); -} -#endif diff --git a/src/engine/save.c b/src/engine/save.c deleted file mode 100644 index 0b7a3dd79..000000000 --- a/src/engine/save.c +++ /dev/null @@ -1,929 +0,0 @@ -#include "global.h" -#include "gba/gba.h" -#include "gba/flash_internal.h" -#include "save.h" -#include "load_save.h" -#include "overworld.h" -#include "pokemon.h" -#include "save_failed_screen.h" -#include "ewram.h" - -#define FILE_SIGNATURE 0x08012025 // signature value to determine if a sector is in use - -//#define TOTAL_FLASH_SECTORS ((ARRAY_COUNT(sSaveBlockChunks) * 2) + (ARRAY_COUNT(sHallOfFameChunks) * 2)) // there are 2 slots, so double each array count and get the sum. -#define TOTAL_FLASH_SECTORS 32 - -struct SaveBlockChunk -{ - u8 *data; - u16 size; -}; - -struct SaveSector -{ - u8 data[0xFF4]; - u16 id; - u16 checksum; - u32 signature; - u32 counter; -}; // size is 0x1000 - -// headless save section? -struct UnkSaveSection -{ - u8 data[0xFF4]; - u32 signature; -}; // size is 0xFF8 - -static u8 WriteSingleChunk(u16, const struct SaveBlockChunk *); -static u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size); -static u8 TryWriteSector(u8, u8 *); -static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *location); -static u32 RestoreSaveBackupVars(const struct SaveBlockChunk *location); -static u8 sub_812550C(u16 a1, const struct SaveBlockChunk *location); -static u8 sub_812556C(u16 a1, const struct SaveBlockChunk *location); -static u8 sub_81255B8(u16, const struct SaveBlockChunk *location); -static u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *location); -static u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *location); -static u8 sub_812587C(u16 a1, const struct SaveBlockChunk *location); -static u8 sub_81258BC(u16, const struct SaveBlockChunk *location); -static u8 GetSaveValidStatus(const struct SaveBlockChunk *location); -static u8 ReadSomeUnknownSectorAndVerify(u8 a1, u8 *data, u16 size); -static u8 DoReadFlashWholeSection(u8, struct SaveSector *); -static u16 CalculateChecksum(void *, u16); -bool8 unref_sub_8125F4C(struct UnkSaveSection *a1); -u8 unref_sub_8125FA0(void); -u8 unref_sub_8125FF0(u8 *data, u16 size); -u8 unref_sub_8126068(u8 sector, u8 *data, u32 size); -u8 unref_sub_8126080(u8 sector, u8 *data); - -// Sector num to begin writing save data. Sectors are rotated each time the game is saved. (possibly to avoid wear on flash memory?) -u16 gFirstSaveSector; -u32 gPrevSaveCounter; -u16 gLastKnownGoodSector; -u32 gDamagedSaveSectors; -u32 gSaveCounter; -struct SaveSector *gFastSaveSection; // the pointer is in fast IWRAM but may sometimes point to the slower EWRAM. -u16 gUnknown_03005EB4; -u16 gSaveFileStatus; -u32 gGameContinueCallback; - -static EWRAM_DATA u32 gLastSaveSectorStatus = 0; // used but in an unferenced function, so unused - -// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer -#define SECTOR_DATA_SIZE 3968 -#define SECTOR_FOOTER_SIZE 128 - -/* - * Sector Layout: - * - * Sectors 0 - 13: Save Slot 1 - * Sectors 14 - 27: Save Slot 2 - * Sectors 28 - 29: Hall of Fame - * Sectors 30 - 31: e-Reader battle tower data, maybe? - * - * There are two save slots for saving the player's game data. We alternate between - * them each time the game is saved, so that if the current save slot is corrupt, - * we can load the previous one. We also rotate the sectors in each save slot - * so that the same data is not always being written to the same sector. This - * might be done to reduce wear on the flash memory, but I'm not sure, since all - * 14 sectors get written anyway. - */ - -#define HALL_OF_FAME_SECTOR 28 - -#define NUM_SECTORS_PER_SAVE_SLOT 14 // Number of sectors occupied by a save slot -#define NUM_HALL_OF_FAME_SECTORS 2 - -// Divide save blocks into individual chunks to be written to flash sectors - -#define SAVEBLOCK_CHUNK(structure, chunkNum) \ -{ \ - (u8 *)&structure + chunkNum * SECTOR_DATA_SIZE, \ - min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \ -} \ - -static const struct SaveBlockChunk sSaveBlockChunks[] = -{ - SAVEBLOCK_CHUNK(gSaveBlock2, 0), - - SAVEBLOCK_CHUNK(gSaveBlock1, 0), - SAVEBLOCK_CHUNK(gSaveBlock1, 1), - SAVEBLOCK_CHUNK(gSaveBlock1, 2), - SAVEBLOCK_CHUNK(gSaveBlock1, 3), - - SAVEBLOCK_CHUNK(gPokemonStorage, 0), - SAVEBLOCK_CHUNK(gPokemonStorage, 1), - SAVEBLOCK_CHUNK(gPokemonStorage, 2), - SAVEBLOCK_CHUNK(gPokemonStorage, 3), - SAVEBLOCK_CHUNK(gPokemonStorage, 4), - SAVEBLOCK_CHUNK(gPokemonStorage, 5), - SAVEBLOCK_CHUNK(gPokemonStorage, 6), - SAVEBLOCK_CHUNK(gPokemonStorage, 7), - SAVEBLOCK_CHUNK(gPokemonStorage, 8), -}; - -static const struct SaveBlockChunk sHallOfFameChunks[] = -{ - SAVEBLOCK_CHUNK(*eHallOfFame, 0), - SAVEBLOCK_CHUNK(*eHallOfFame, 1), -}; - -void Save_EraseAllData(void) -{ - u16 i; - - for (i = 0; i < NUM_SECTORS; i++) - EraseFlashSector(i); -} - -void Save_ResetSaveCounters(void) -{ - gSaveCounter = 0; - gFirstSaveSector = 0; - gDamagedSaveSectors = 0; -} - -enum -{ - SECTOR_DAMAGED, - SECTOR_OK, - SECTOR_CHECK, // unused -}; - -static bool32 SetSectorDamagedStatus(u8 op, u8 sectorNum) -{ - bool32 retVal = FALSE; - - switch (op) - { - case SECTOR_DAMAGED: - gDamagedSaveSectors |= (1 << sectorNum); - break; - case SECTOR_OK: - gDamagedSaveSectors &= ~(1 << sectorNum); - break; - case SECTOR_CHECK: // unused - if (gDamagedSaveSectors & (1 << sectorNum)) - retVal = TRUE; - break; - } - - return retVal; -} - -// If chunkId is 0xFFFF, this function will write all of the chunks pointed to by 'chunks'. -// Otherwise, it will write a single chunk with the given 'chunkId'. -static u8 WriteSaveBlockChunks(u16 chunkId, const struct SaveBlockChunk *chunks) -{ - u32 retVal; - u16 i; - - gFastSaveSection = eSaveSection; - - if (chunkId != 0xFFFF) // write single chunk - { - retVal = WriteSingleChunk(chunkId, chunks); - } - else // write all chunks - { - gLastKnownGoodSector = gFirstSaveSector; - gPrevSaveCounter = gSaveCounter; - gFirstSaveSector++; - gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT; - gSaveCounter++; - retVal = SAVE_STATUS_OK; - - for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++) - WriteSingleChunk(i, chunks); - - // Check for any bad sectors - if (gDamagedSaveSectors != 0) // skip the damaged sector. - { - retVal = SAVE_STATUS_ERROR; - gFirstSaveSector = gLastKnownGoodSector; - gSaveCounter = gPrevSaveCounter; - } - } - - return retVal; -} - -static u8 WriteSingleChunk(u16 chunkId, const struct SaveBlockChunk *chunks) -{ - u16 i; - u16 sectorNum; - u8 *chunkData; - u16 chunkSize; - - // select sector number - sectorNum = chunkId + gFirstSaveSector; - sectorNum %= NUM_SECTORS_PER_SAVE_SLOT; - // select save slot - sectorNum += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); - - chunkData = chunks[chunkId].data; - chunkSize = chunks[chunkId].size; - - // clear save section. - for (i = 0; i < sizeof(struct SaveSector); i++) - ((u8 *)gFastSaveSection)[i] = 0; - - gFastSaveSection->id = chunkId; - gFastSaveSection->signature = FILE_SIGNATURE; - gFastSaveSection->counter = gSaveCounter; - for (i = 0; i < chunkSize; i++) - gFastSaveSection->data[i] = chunkData[i]; - gFastSaveSection->checksum = CalculateChecksum(chunkData, chunkSize); - - return TryWriteSector(sectorNum, gFastSaveSection->data); -} - -static u8 HandleWriteSectorNBytes(u8 sectorNum, u8 *data, u16 size) -{ - u16 i; - struct SaveSector *section = eSaveSection; - - for (i = 0; i < sizeof(struct SaveSector); i++) - ((char *)section)[i] = 0; - - section->signature = FILE_SIGNATURE; - for (i = 0; i < size; i++) - section->data[i] = data[i]; - section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used. - - return TryWriteSector(sectorNum, section->data); -} - -static u8 TryWriteSector(u8 sectorNum, u8 *data) -{ - if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) // is damaged? - { - SetSectorDamagedStatus(SECTOR_DAMAGED, sectorNum); // set damaged sector bits. - return SAVE_STATUS_ERROR; - } - else - { - SetSectorDamagedStatus(SECTOR_OK, sectorNum); // unset damaged sector bits. it's safe now. - return SAVE_STATUS_OK; - } -} - -static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *chunk) // chunk is unused -{ - gFastSaveSection = eSaveSection; - gLastKnownGoodSector = gFirstSaveSector; - gPrevSaveCounter = gSaveCounter; - gFirstSaveSector++; - gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT; - gSaveCounter++; - gUnknown_03005EB4 = 0; - gDamagedSaveSectors = 0; - return 0; -} - -static u32 RestoreSaveBackupVars(const struct SaveBlockChunk *chunk) // chunk is unused -{ - gFastSaveSection = eSaveSection; - gLastKnownGoodSector = gFirstSaveSector; - gPrevSaveCounter = gSaveCounter; - gUnknown_03005EB4 = 0; - gDamagedSaveSectors = 0; - return 0; -} - -static u8 sub_812550C(u16 a1, const struct SaveBlockChunk *chunk) -{ - u8 retVal; - - if (gUnknown_03005EB4 < a1 - 1) - { - retVal = SAVE_STATUS_OK; - WriteSingleChunk(gUnknown_03005EB4, chunk); - gUnknown_03005EB4++; - if (gDamagedSaveSectors) - { - retVal = SAVE_STATUS_ERROR; - gFirstSaveSector = gLastKnownGoodSector; - gSaveCounter = gPrevSaveCounter; - } - } - else - { - retVal = SAVE_STATUS_ERROR; - } - - return retVal; -} - -static u8 sub_812556C(u16 a1, const struct SaveBlockChunk *chunk) -{ - u8 retVal = SAVE_STATUS_OK; - - sub_81255B8(a1 - 1, chunk); - - if (gDamagedSaveSectors) - { - retVal = SAVE_STATUS_ERROR; - gFirstSaveSector = gLastKnownGoodSector; - gSaveCounter = gPrevSaveCounter; - } - return retVal; -} - -static u8 sub_81255B8(u16 chunkId, const struct SaveBlockChunk *chunks) -{ - u16 i; - u16 sector; - u8 *data; - u16 size; - u8 status; - - // select sector number - sector = chunkId + gFirstSaveSector; - sector %= NUM_SECTORS_PER_SAVE_SLOT; - // select save slot - sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); - - data = chunks[chunkId].data; - size = chunks[chunkId].size; - - // clear temp save section. - for (i = 0; i < sizeof(struct SaveSector); i++) - ((char *)gFastSaveSection)[i] = 0; - - gFastSaveSection->id = chunkId; - gFastSaveSection->signature = FILE_SIGNATURE; - gFastSaveSection->counter = gSaveCounter; - - // set temp section's data. - for (i = 0; i < size; i++) - gFastSaveSection->data[i] = data[i]; - - // calculate checksum. - gFastSaveSection->checksum = CalculateChecksum(data, size); - - EraseFlashSector(sector); - - status = SAVE_STATUS_OK; - - for (i = 0; i < sizeof(struct UnkSaveSection); i++) - { - if (ProgramFlashByte(sector, i, gFastSaveSection->data[i])) - { - status = SAVE_STATUS_ERROR; - break; - } - } - - if (status == SAVE_STATUS_ERROR) - { - SetSectorDamagedStatus(SECTOR_DAMAGED, sector); - return SAVE_STATUS_ERROR; - } - else - { - status = SAVE_STATUS_OK; - - for (i = 0; i < 7; i++) - { - if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i])) - { - status = SAVE_STATUS_ERROR; - break; - } - } - - if (status == SAVE_STATUS_ERROR) - { - SetSectorDamagedStatus(SECTOR_DAMAGED, sector); - return SAVE_STATUS_ERROR; - } - else - { - SetSectorDamagedStatus(SECTOR_OK, sector); - return SAVE_STATUS_OK; - } - } -} - -static u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *chunk) -{ - u16 sector; - - // select sector number - sector = a1 + gFirstSaveSector - 1; - sector %= NUM_SECTORS_PER_SAVE_SLOT; - // select save slot - sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); - - if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)])) - { - // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. - SetSectorDamagedStatus(SECTOR_DAMAGED, sector); - gFirstSaveSector = gLastKnownGoodSector; - gSaveCounter = gPrevSaveCounter; - return SAVE_STATUS_ERROR; - } - else - { - SetSectorDamagedStatus(SECTOR_OK, sector); - return SAVE_STATUS_OK; - } -} - -static u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *chunk) -{ - u16 sector; - - sector = a1 + gFirstSaveSector - 1; - sector %= NUM_SECTORS_PER_SAVE_SLOT; - sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); - - if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25)) - { - // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. - SetSectorDamagedStatus(SECTOR_DAMAGED, sector); - gFirstSaveSector = gLastKnownGoodSector; - gSaveCounter = gPrevSaveCounter; - return SAVE_STATUS_ERROR; - } - else - { - SetSectorDamagedStatus(SECTOR_OK, sector); - return SAVE_STATUS_OK; - } -} - -static u8 sub_812587C(u16 a1, const struct SaveBlockChunk *chunk) -{ - u8 retVal; - gFastSaveSection = eSaveSection; - if (a1 != 0xFFFF) - { - retVal = SAVE_STATUS_ERROR; - } - else - { - retVal = GetSaveValidStatus(chunk); - sub_81258BC(0xFFFF, chunk); - } - - return retVal; -} - -static u8 sub_81258BC(u16 a1, const struct SaveBlockChunk *chunks) -{ - u16 i; - u16 checksum; - u16 sector = NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); - u16 id; - - for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++) - { - DoReadFlashWholeSection(i + sector, gFastSaveSection); - id = gFastSaveSection->id; - if (id == 0) - gFirstSaveSector = i; - checksum = CalculateChecksum(gFastSaveSection->data, chunks[id].size); - if (gFastSaveSection->signature == FILE_SIGNATURE - && gFastSaveSection->checksum == checksum) - { - u16 j; - for (j = 0; j < chunks[id].size; j++) - chunks[id].data[j] = gFastSaveSection->data[j]; - } - } - - return 1; -} - -static u8 GetSaveValidStatus(const struct SaveBlockChunk *chunks) -{ - u16 sector; - bool8 signatureValid; - u16 checksum; - u32 slot1saveCounter = 0; - u32 slot2saveCounter = 0; - u8 slot1Status; - u8 slot2Status; - u32 validSectors; - const u32 ALL_SECTORS = (1 << NUM_SECTORS_PER_SAVE_SLOT) - 1; // bitmask of all saveblock sectors - - // check save slot 1. - validSectors = 0; - signatureValid = FALSE; - for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++) - { - DoReadFlashWholeSection(sector, gFastSaveSection); - if (gFastSaveSection->signature == FILE_SIGNATURE) - { - signatureValid = TRUE; - checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size); - if (gFastSaveSection->checksum == checksum) - { - slot1saveCounter = gFastSaveSection->counter; - validSectors |= 1 << gFastSaveSection->id; - } - } - } - - if (signatureValid) - { - if (validSectors == ALL_SECTORS) - slot1Status = SAVE_STATUS_OK; - else - slot1Status = SAVE_STATUS_ERROR; - } - else - { - slot1Status = SAVE_STATUS_EMPTY; - } - - // check save slot 2. - validSectors = 0; - signatureValid = FALSE; - for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++) - { - DoReadFlashWholeSection(NUM_SECTORS_PER_SAVE_SLOT + sector, gFastSaveSection); - if (gFastSaveSection->signature == FILE_SIGNATURE) - { - signatureValid = TRUE; - checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size); - if (gFastSaveSection->checksum == checksum) - { - slot2saveCounter = gFastSaveSection->counter; - validSectors |= 1 << gFastSaveSection->id; - } - } - } - - if (signatureValid) - { - if (validSectors == ALL_SECTORS) - slot2Status = SAVE_STATUS_OK; - else - slot2Status = SAVE_STATUS_ERROR; - } - else - { - slot2Status = SAVE_STATUS_EMPTY; - } - - if (slot1Status == SAVE_STATUS_OK && slot2Status == SAVE_STATUS_OK) - { - // Choose counter of the most recent save file - if ((slot1saveCounter == -1 && slot2saveCounter == 0) || (slot1saveCounter == 0 && slot2saveCounter == -1)) - { - if ((unsigned)(slot1saveCounter + 1) < (unsigned)(slot2saveCounter + 1)) - gSaveCounter = slot2saveCounter; - else - gSaveCounter = slot1saveCounter; - } - else - { - if (slot1saveCounter < slot2saveCounter) - gSaveCounter = slot2saveCounter; - else - gSaveCounter = slot1saveCounter; - } - return SAVE_STATUS_OK; - } - - if (slot1Status == SAVE_STATUS_OK) - { - gSaveCounter = slot1saveCounter; - if (slot2Status == SAVE_STATUS_ERROR) - return SAVE_STATUS_ERROR; - else - return SAVE_STATUS_OK; - } - - if (slot2Status == SAVE_STATUS_OK) - { - gSaveCounter = slot2saveCounter; - if (slot1Status == SAVE_STATUS_ERROR) - return SAVE_STATUS_ERROR; - else - return SAVE_STATUS_OK; - } - - if (slot1Status == SAVE_STATUS_EMPTY && slot2Status == SAVE_STATUS_EMPTY) - { - gSaveCounter = 0; - gFirstSaveSector = 0; - return SAVE_STATUS_EMPTY; - } - - gSaveCounter = 0; - gFirstSaveSector = 0; - return 2; -} - -static u8 ReadSomeUnknownSectorAndVerify(u8 sector, u8 *data, u16 size) -{ - u16 i; - struct SaveSector *section = eSaveSection; - - DoReadFlashWholeSection(sector, section); - if (section->signature == FILE_SIGNATURE) - { - u16 checksum = CalculateChecksum(section->data, size); - if (section->id == checksum) - { - for (i = 0; i < size; i++) - data[i] = section->data[i]; - return SAVE_STATUS_OK; - } - else - { - return 2; - } - } - else - { - return SAVE_STATUS_EMPTY; - } -} - -static u8 DoReadFlashWholeSection(u8 sector, struct SaveSector *section) -{ - ReadFlash(sector, 0, section->data, sizeof(struct SaveSector)); - return 1; -} - -static u16 CalculateChecksum(void *data, u16 size) -{ - u16 i; - u32 checksum = 0; - - for (i = 0; i < (size / 4); i++) - checksum += *((u32 *)data)++; - - return ((checksum >> 16) + checksum); -} - -#if DEBUG -void sub_813B79C(void) -{ - struct SaveSector *sbSector; - struct SaveSector *hofSector; - const struct SaveBlockChunk *sbChunks; - const struct SaveBlockChunk *hofChunks; - u16 i; - - sbSector = eSaveSection; - sbChunks = sSaveBlockChunks; - for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT * 2; i++) - { - DoReadFlashWholeSection(i, sbSector); - sbSector->checksum = CalculateChecksum(sbSector, sbChunks[sbSector->id].size); - ProgramFlashSectorAndVerify(i, sbSector->data); - } - - hofSector = eSaveSection; - hofChunks = sHallOfFameChunks; - for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++) - { - DoReadFlashWholeSection(HALL_OF_FAME_SECTOR + i, hofSector); - hofSector->id = CalculateChecksum(hofSector, hofChunks[i].size); // why id? - ProgramFlashSectorAndVerify(HALL_OF_FAME_SECTOR + i, hofSector->data); - } -} -#endif - -u8 Save_WriteDataInternal(u8 saveType) -{ - u8 i; - - switch (saveType) - { - case SAVE_HALL_OF_FAME_ERASE_BEFORE: // wipes all hall of fame data, then saves hall of fame. unused - for (i = HALL_OF_FAME_SECTOR; i < TOTAL_FLASH_SECTORS; i++) - EraseFlashSector(i); - // fall through - case SAVE_HALL_OF_FAME: // hall of fame. - if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999) - IncrementGameStat(GAME_STAT_ENTERED_HOF); - for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++) - HandleWriteSectorNBytes(HALL_OF_FAME_SECTOR + i, sHallOfFameChunks[i].data, sHallOfFameChunks[i].size); - SaveSerializedGame(); - WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); - break; - case SAVE_NORMAL: // normal save. also called by overwriting your own save. - default: - SaveSerializedGame(); - WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); - break; - case SAVE_LINK: // link save. updates only gSaveBlock1 and gSaveBlock2. - SaveSerializedGame(); - for (i = 0; i < 5; i++) - WriteSaveBlockChunks(i, sSaveBlockChunks); - break; - case SAVE_EREADER: // used in mossdeep "game corner" before/after battling old man e-reader trainer - SaveSerializedGame(); - WriteSaveBlockChunks(0, sSaveBlockChunks); - break; - case SAVE_OVERWRITE_DIFFERENT_FILE: // there is a different file, so overwrite it completely. - // Erase Hall of Fame. - for (i = HALL_OF_FAME_SECTOR; i < TOTAL_FLASH_SECTORS; i++) - EraseFlashSector(i); - SaveSerializedGame(); - WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); - break; - } - return 0; -} - -#if DEBUG -extern u32 gUnknown_Debug_03004BD0; -#endif - -u8 Save_WriteData(u8 saveType) // TrySave -{ - if (gFlashMemoryPresent != TRUE) - return SAVE_STATUS_ERROR; - - Save_WriteDataInternal(saveType); - if (!gDamagedSaveSectors -#if DEBUG - && gUnknown_Debug_03004BD0 == 0 -#endif - ) - return SAVE_STATUS_OK; - - DoSaveFailedScreen(saveType); - return SAVE_STATUS_ERROR; -} - -u8 sub_8125D80(void) // trade.s save -{ - if (gFlashMemoryPresent != TRUE) - return 1; - SaveSerializedGame(); - RestoreSaveBackupVarsAndIncrement(sSaveBlockChunks); - return 0; -} - -bool8 sub_8125DA8(void) // trade.s save -{ - u8 retVal = sub_812550C(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); - if (gDamagedSaveSectors) - DoSaveFailedScreen(0); - if (retVal == SAVE_STATUS_ERROR) - return 1; - else - return 0; -} - -u8 sub_8125DDC(void) // trade.s save -{ - sub_812556C(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); - if (gDamagedSaveSectors) - DoSaveFailedScreen(0); - return 0; -} - -u8 sub_8125E04(void) // trade.s save -{ - WriteSomeFlashByteToPrevSector(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); - if (gDamagedSaveSectors) - DoSaveFailedScreen(0); - return 0; -} - -u8 sub_8125E2C(void) -{ - if (gFlashMemoryPresent != TRUE) - return 1; - - SaveSerializedGame(); - RestoreSaveBackupVars(sSaveBlockChunks); - sub_812556C(gUnknown_03005EB4 + 1, sSaveBlockChunks); - return 0; -} - -// something to do with multiplayer. Possibly record mizing? -bool8 sub_8125E6C(void) -{ - u8 retVal = FALSE; - u16 val = ++gUnknown_03005EB4; - if (val <= 4) - { - sub_812556C(gUnknown_03005EB4 + 1, sSaveBlockChunks); - WriteSomeFlashByte0x25ToPrevSector(val, sSaveBlockChunks); - } - else - { - WriteSomeFlashByte0x25ToPrevSector(val, sSaveBlockChunks); - retVal = TRUE; - } - if (gDamagedSaveSectors) - DoSaveFailedScreen(1); - return retVal; -} - -u8 Save_LoadGameData(u8 saveType) -{ - u8 result; - - if (gFlashMemoryPresent != TRUE) - { - gSaveFileStatus = SAVE_STATUS_NO_FLASH; - return SAVE_STATUS_ERROR; - } - - switch (saveType) - { - case SAVE_NORMAL: - default: - result = sub_812587C(0xFFFF, sSaveBlockChunks); - LoadSerializedGame(); - gSaveFileStatus = result; - gGameContinueCallback = 0; - break; - case SAVE_HALL_OF_FAME: - result = ReadSomeUnknownSectorAndVerify(HALL_OF_FAME_SECTOR, sHallOfFameChunks[0].data, sHallOfFameChunks[0].size); - if (result == SAVE_STATUS_OK) - result = ReadSomeUnknownSectorAndVerify(HALL_OF_FAME_SECTOR + 1, sHallOfFameChunks[1].data, sHallOfFameChunks[1].size); - break; - } - - return result; -} - -const u8 sUnusedFlashSectors[] = { 30, 31 }; - -bool8 unref_sub_8125F4C(struct UnkSaveSection *a1) -{ - u16 i; - char *raw = (char *)a1; - - for (i = 0; i < sizeof(struct SaveSector); i++) - raw[i] = 0; - - ReadFlash(sUnusedFlashSectors[0], 0, a1->data, 4096); - - if (a1->signature != FILE_SIGNATURE) - return FALSE; - - return TRUE; -} - -u8 unref_sub_8125FA0(void) -{ - u16 i; - u8 status = Save_WriteData(SAVE_NORMAL); - - for (i = 0; i < 2; i++) - EraseFlashSector(sUnusedFlashSectors[i]); - - if (status == SAVE_STATUS_ERROR) - { - return 3; - } - else if (status == 3) - { - return 2; - } - else - { - Save_LoadGameData(SAVE_NORMAL); - return 1; - } -} - -u8 unref_sub_8125FF0(u8 *data, u16 size) -{ - u16 i; - struct UnkSaveSection *section = (struct UnkSaveSection *)eSaveSection; - - for (i = 0; i < sizeof(struct SaveSector); i++) - ((char *)section)[i] = 0; - - section->signature = FILE_SIGNATURE; - - for (i = 0; i < size; i++) - section->data[i] = data[i]; - - gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(sUnusedFlashSectors[0], section, sizeof(struct SaveSector)); - - if (gLastSaveSectorStatus) - return SAVE_STATUS_ERROR; - else - return SAVE_STATUS_OK; -} - -u8 unref_sub_8126068(u8 sector, u8 *data, u32 size) -{ - if (ProgramFlashSectorAndVerify(sector, data)) - return SAVE_STATUS_ERROR; - else - return SAVE_STATUS_OK; -} - -u8 unref_sub_8126080(u8 sector, u8 *data) -{ - ReadFlash(sector, 0, data, sizeof(struct SaveSector)); - return 1; -} diff --git a/src/engine/save_failed_screen.c b/src/engine/save_failed_screen.c deleted file mode 100644 index f57315d09..000000000 --- a/src/engine/save_failed_screen.c +++ /dev/null @@ -1,320 +0,0 @@ -#include "global.h" -#include "gba/flash_internal.h" -#include "save_failed_screen.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "save.h" -#include "sprite.h" -#include "starter_choose.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "ewram.h" - -// In English 1.0, the text window is too small, causing text to overflow. - -#ifdef BUGFIX_SAVEFAILEDSCREEN1 -#define MSG_WIN_TOP 10 -#else -#define MSG_WIN_TOP 12 -#endif - -#define CLOCK_WIN_TOP (MSG_WIN_TOP - 4) - -static EWRAM_DATA u16 gSaveFailedType = 0; -static EWRAM_DATA u16 gSaveFailedClockInfo[9] = {0}; - -extern u32 gUnknown_Debug_03004BD0; -extern u32 gDamagedSaveSectors; -extern u32 gGameContinueCallback; - -static const struct OamData sClockOamData = -{ - 160, // Y - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0 -}; - -static const u8 sClockFrames[8][3] = -{ - { 1, 0, 0 }, - { 5, 0, 0 }, - { 9, 0, 0 }, - { 5, 0, 1 }, - { 1, 0, 1 }, - { 5, 1, 1 }, - { 9, 1, 0 }, - { 5, 1, 0 }, -}; - -static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); -static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz"); - -static void VBlankCB(void); -static void CB2_SaveFailedScreen(void); -static void CB2_WipeSave(void); -static void CB2_GameplayCannotBeContinued(void); -static void CB2_FadeAndReturnToTitleScreen(void); -static void CB2_ReturnToTitleScreen(void); -static void VBlankCB_UpdateClockGraphics(void); -static bool8 IsSectorNonEmpty(u16 sector); -static bool8 WipeSector(u16 sector); -static bool8 WipeSectors(u32 sectorBits); - -void DoSaveFailedScreen(u8 saveType) -{ - SetMainCallback2(CB2_SaveFailedScreen); - gSaveFailedType = saveType; - gSaveFailedClockInfo[0] = FALSE; -} - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void CB2_SaveFailedScreen(void) -{ - u16 ime; - - switch (gMain.state) - { - case 0: - default: - SetVBlankCallback(0); - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); - LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); - LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); - LZ77UnCompVram(&gSaveFailedClockGfx, (void *)(VRAM + 0x10020)); - ResetSpriteData(); - ResetTasks(); - ResetPaletteFade(); - LoadPalette(&gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); - LoadPalette(&gSaveFailedClockPal, 0x100, sizeof(gSaveFailedClockPal)); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); - Menu_DrawStdWindowFrame(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window - Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); // message window - Menu_PrintText(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(VBlankCB); - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG2_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; - gMain.state++; - break; - case 1: - if (!UpdatePaletteFade()) - { - SetMainCallback2(CB2_WipeSave); - SetVBlankCallback(VBlankCB_UpdateClockGraphics); - } - break; - } -} - -static void CB2_WipeSave(void) -{ - u8 wipeTries = 0; - - gSaveFailedClockInfo[0] = TRUE; - -#if DEBUG - if (gUnknown_Debug_03004BD0 != 0) - gDamagedSaveSectors = 1; -#endif - - while (gDamagedSaveSectors != 0 && wipeTries < 3) // while there are still attempts left, keep trying to fix the save sectors. - { - if (WipeSectors(gDamagedSaveSectors) != FALSE) - { - Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); - Menu_PrintText(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); - SetMainCallback2(CB2_GameplayCannotBeContinued); - return; - } - - Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); - Menu_PrintText(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1); - Save_WriteDataInternal(gSaveFailedType); - - if (gDamagedSaveSectors != 0) - { -#ifdef BUGFIX_SAVEFAILEDSCREEN2 - Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); -#endif - Menu_PrintText(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); - } - - wipeTries++; - } - - if (wipeTries == 3) - { - Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); - Menu_PrintText(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); - SetMainCallback2(CB2_FadeAndReturnToTitleScreen); // called again below - } - else - { - Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); - - // no callback exists, so the game cannot continue. - if (gGameContinueCallback == 0) - Menu_PrintText(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1); - else // callback exists, so continue - Menu_PrintText(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1); - } - - SetMainCallback2(CB2_FadeAndReturnToTitleScreen); -} - -static void CB2_GameplayCannotBeContinued(void) -{ - gSaveFailedClockInfo[0] = FALSE; - - if (gMain.newKeys & A_BUTTON) - { - Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); - Menu_PrintText(gSystemText_GameplayEnded, 2, MSG_WIN_TOP + 1); - SetVBlankCallback(VBlankCB); - SetMainCallback2(CB2_FadeAndReturnToTitleScreen); - } -} - -static void CB2_FadeAndReturnToTitleScreen(void) -{ - gSaveFailedClockInfo[0] = FALSE; - - if (gMain.newKeys & A_BUTTON) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - SetVBlankCallback(VBlankCB); - SetMainCallback2(CB2_ReturnToTitleScreen); - } -} - -static void CB2_ReturnToTitleScreen(void) -{ - if (!UpdatePaletteFade()) - { - if (gGameContinueCallback == 0) // no callback exists, so do a soft reset. - { - DoSoftReset(); - } - else - { - SetMainCallback2((MainCallback)gGameContinueCallback); - gGameContinueCallback = 0; - } - } -} - -static void VBlankCB_UpdateClockGraphics(void) -{ - unsigned int n = (gMain.vblankCounter2 >> 3) & 7; - - gMain.oamBuffer[0] = sClockOamData; - gMain.oamBuffer[0].x = 112; - gMain.oamBuffer[0].y = (CLOCK_WIN_TOP + 1) * 8; - - if (gSaveFailedClockInfo[0] != FALSE) - { - gMain.oamBuffer[0].tileNum = sClockFrames[n][0]; - gMain.oamBuffer[0].matrixNum = (sClockFrames[n][2] << 4) | (sClockFrames[n][1] << 3); - } - else - { - gMain.oamBuffer[0].tileNum = 1; - } - - CpuFastCopy(gMain.oamBuffer, (void *)OAM, 4); - - if (gSaveFailedClockInfo[1]) // maybe was used for debugging? - gSaveFailedClockInfo[1]--; -} - -static bool8 IsSectorNonEmpty(u16 sector) -{ - u32 *ptr = (u32 *)&gSharedMem; - u16 i; - - ReadFlash(sector, 0, ptr, 4096); - -#if DEBUG // Don't verify the sector wipe? - for (i = 0; i < 0x400; i++, ptr++) - ; - return gUnknown_Debug_03004BD0; -#else - for (i = 0; i < 0x400; i++, ptr++) - if (*ptr != 0) - return TRUE; - return FALSE; -#endif -} - -static bool8 WipeSector(u16 sector) -{ - u16 i, j; - bool8 failed = TRUE; - - for (i = 0; failed && i < 130; i++) - { - for (j = 0; j < 0x1000; j++) - ProgramFlashByte(sector, j, 0); - - failed = IsSectorNonEmpty(sector); - } - - return failed; -} - -static bool8 WipeSectors(u32 sectorBits) -{ - u16 i; - - for (i = 0; i < 0x20; i++) - if ((sectorBits & (1 << i)) && !WipeSector(i)) - sectorBits &= ~(1 << i); - - if (sectorBits == 0) - return FALSE; - else - return TRUE; -} diff --git a/src/engine/save_menu_util.c b/src/engine/save_menu_util.c deleted file mode 100644 index ccf4d9f6f..000000000 --- a/src/engine/save_menu_util.c +++ /dev/null @@ -1,148 +0,0 @@ -#include "global.h" -#include "save_menu_util.h" -#include "event_data.h" -#include "menu.h" -#include "pokedex.h" -#include "region_map.h" -#include "string_util.h" -#include "strings2.h" - -void HandleDrawSaveWindowInfo(s16 left, s16 top) -{ - u32 width = 12; - - // old handle for setting window width? - if (IsResizeSaveWindowEnabled()) - width = 13; - - if (FlagGet(FLAG_SYS_POKEDEX_GET)) - { - // print info + dex information. - Menu_DrawStdWindowFrame(left, top, left + width, top + 11); - PrintSaveMapName(++left, ++top); // MAP NAME - PrintSavePlayerName(left, top + 2); // PLAYER - PrintSaveBadges(left, top + 4); // BADGES - PrintSavePokedexCount(left, top + 6); // POKEDEX - PrintSavePlayTime(left, top + 8); // PLAY TIME - } - else - { - // print everything besides dex. - Menu_DrawStdWindowFrame(left, top, left + width, top + 9); - PrintSaveMapName(++left, ++top); // MAP NAME - PrintSavePlayerName(left, top + 2); // PLAYER - PrintSaveBadges(left, top + 4); // BADGES - PrintSavePlayTime(left, top + 6); // PLAY TIME - } -} - -void HandleCloseSaveWindow(u16 left, u16 top) -{ - u32 width = 12; - - // old handle for setting window width? - if (IsResizeSaveWindowEnabled()) - width = 13; - - if (FlagGet(FLAG_SYS_POKEDEX_GET)) - Menu_EraseWindowRect(left, top, left + width, top + 11); - else - Menu_EraseWindowRect(left, top, left + width, top + 9); -} - -/* -theory: This function was used to handle the save menu window's width being auto sized from -either 12 or 13 in an older source. Whatever was here might have either been optimized out by -GF's compiler or was dummied out to always return a TRUE at some point. -*/ -u8 IsResizeSaveWindowEnabled(void) // i don't know what else to name it.. -{ - return TRUE; -} - -void PrintSavePlayerName(s16 x, s16 y) -{ - Menu_PrintText(gOtherText_Player, x, y); - MenuPrint_RightAligned(gSaveBlock2.playerName, x + 12, y); -} - -void PrintSaveMapName(s16 x, s16 y) -{ - char name[32]; - - CopyMapName(name, gMapHeader.regionMapSectionId); - Menu_PrintText(name, x, y); -} - -void PrintSaveBadges(s16 x, s16 y) -{ - char badges[16]; - - Menu_PrintText(gOtherText_Badges, x, y); - ConvertIntToDecimalString(badges, GetBadgeCount()); - MenuPrint_RightAligned(badges, x + 12, y); -} - -void PrintSavePokedexCount(s16 x, s16 y) -{ - char pokedex[16]; - - Menu_PrintText(gOtherText_Pokedex, x, y); - ConvertIntToDecimalStringN(pokedex, GetPokedexSeenCount(), 1, 3); - MenuPrint_RightAligned(pokedex, x + 12, y); -} - -void PrintSavePlayTime(s16 x, s16 y) -{ - char playtime[16]; - - Menu_PrintText(gOtherText_PlayTime, x, y); - FormatPlayTime(playtime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); - MenuPrint_RightAligned(playtime, x + 12, y); -} - -u8 GetBadgeCount(void) -{ - u8 badgeCount = 0; - int badgeFlag; - - for (badgeFlag = FLAG_BADGE01_GET; badgeFlag <= FLAG_BADGE08_GET; badgeFlag++) - if (FlagGet(badgeFlag)) - badgeCount++; - - return badgeCount; -} - -u16 GetPokedexSeenCount() -{ - u16 pokedexSeenCount; - - if (IsNationalPokedexEnabled()) - pokedexSeenCount = GetNationalPokedexCount(1); - else - pokedexSeenCount = GetHoennPokedexCount(1); - - return pokedexSeenCount; -} - -void FormatPlayTime(char *playtime, u16 hours, u16 minutes, u16 colon) -{ - s16 _colon = colon; - playtime = ConvertIntToDecimalString(playtime, hours); - - // playtime[0] is hours. - // playtime[1] is the character to render between hours and minutes. - // playtime[2] is minutes. - - playtime[0] = 0; - - if (_colon) - playtime[1] = 0xF0; // set middle character to ":" - else - playtime[1] = 0; - - playtime[2] = 0; - playtime += 3; - - ConvertIntToDecimalStringN(playtime, minutes, 2, 2); -} diff --git a/src/engine/script.c b/src/engine/script.c deleted file mode 100644 index 8625cfdc2..000000000 --- a/src/engine/script.c +++ /dev/null @@ -1,376 +0,0 @@ -#include "global.h" -#include "script.h" -#include "event_data.h" - -#define RAM_SCRIPT_MAGIC 51 -#define SCRIPT_STACK_SIZE 20 - -enum -{ - SCRIPT_MODE_STOPPED, - SCRIPT_MODE_BYTECODE, - SCRIPT_MODE_NATIVE, -}; - -EWRAM_DATA u8 *gUnknown_0202E8AC = NULL; - -static u8 sScriptContext1Status; -static struct ScriptContext sScriptContext1; -static struct ScriptContext sScriptContext2; -static bool8 sScriptContext2Enabled; - -extern ScrCmdFunc gScriptCmdTable[]; -extern ScrCmdFunc gScriptCmdTableEnd[]; -extern void *gNullScriptPtr; - -void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd) -{ - s32 i; - - ctx->mode = SCRIPT_MODE_STOPPED; - ctx->scriptPtr = NULL; - ctx->stackDepth = 0; - ctx->nativePtr = NULL; - ctx->cmdTable = cmdTable; - ctx->cmdTableEnd = cmdTableEnd; - - for (i = 0; i < 4; i++) - ctx->data[i] = 0; - - for (i = 0; i < SCRIPT_STACK_SIZE; i++) - ctx->stack[i] = 0; -} - -u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) -{ - ctx->scriptPtr = ptr; - ctx->mode = SCRIPT_MODE_BYTECODE; - return 1; -} - -void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void)) -{ - ctx->mode = SCRIPT_MODE_NATIVE; - ctx->nativePtr = ptr; -} - -void StopScript(struct ScriptContext *ctx) -{ - ctx->mode = SCRIPT_MODE_STOPPED; - ctx->scriptPtr = NULL; -} - -bool8 RunScriptCommand(struct ScriptContext *ctx) -{ - if (ctx->mode == SCRIPT_MODE_STOPPED) - return FALSE; - - switch (ctx->mode) - { - case SCRIPT_MODE_STOPPED: - return FALSE; - case SCRIPT_MODE_NATIVE: - if (ctx->nativePtr) - { - if (ctx->nativePtr() == TRUE) - ctx->mode = SCRIPT_MODE_BYTECODE; - return TRUE; - } - ctx->mode = SCRIPT_MODE_BYTECODE; - case SCRIPT_MODE_BYTECODE: - while (1) - { - u8 cmdCode; - ScrCmdFunc *cmdFunc; - - if (ctx->scriptPtr == NULL) - { - ctx->mode = SCRIPT_MODE_STOPPED; - return FALSE; - } - - if (ctx->scriptPtr == gNullScriptPtr) - { - while (1) - asm("svc 2"); // HALT - } - - cmdCode = *(ctx->scriptPtr); - ctx->scriptPtr++; - cmdFunc = &ctx->cmdTable[cmdCode]; - - if (cmdFunc >= ctx->cmdTableEnd) - { - ctx->mode = SCRIPT_MODE_STOPPED; - return FALSE; - } - - if ((*cmdFunc)(ctx) == TRUE) - return TRUE; - } - } - - return TRUE; -} - -u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) -{ - if (ctx->stackDepth + 1 >= SCRIPT_STACK_SIZE) - { - return 1; - } - else - { - ctx->stack[ctx->stackDepth] = ptr; - ctx->stackDepth++; - return 0; - } -} - -const u8 *ScriptPop(struct ScriptContext *ctx) -{ - if (ctx->stackDepth == 0) - return NULL; - - ctx->stackDepth--; - return ctx->stack[ctx->stackDepth]; -} - -void ScriptJump(struct ScriptContext *ctx, u8 *ptr) -{ - ctx->scriptPtr = ptr; -} - -void ScriptCall(struct ScriptContext *ctx, u8 *ptr) -{ - ScriptPush(ctx, ctx->scriptPtr); - ctx->scriptPtr = ptr; -} - -void ScriptReturn(struct ScriptContext *ctx) -{ - ctx->scriptPtr = ScriptPop(ctx); -} - -u16 ScriptReadHalfword(struct ScriptContext *ctx) -{ - u16 value = *(ctx->scriptPtr++); - value |= *(ctx->scriptPtr++) << 8; - return value; -} - -u32 ScriptReadWord(struct ScriptContext *ctx) -{ - u32 value0 = *(ctx->scriptPtr++); - u32 value1 = *(ctx->scriptPtr++); - u32 value2 = *(ctx->scriptPtr++); - u32 value3 = *(ctx->scriptPtr++); - return (((((value3 << 8) + value2) << 8) + value1) << 8) + value0; -} - -void ScriptContext2_Enable(void) -{ - sScriptContext2Enabled = TRUE; -} - -void ScriptContext2_Disable(void) -{ - sScriptContext2Enabled = FALSE; -} - -bool8 ScriptContext2_IsEnabled(void) -{ - return sScriptContext2Enabled; -} - -void ScriptContext1_Init(void) -{ - InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); - sScriptContext1Status = 2; -} - -bool8 ScriptContext2_RunScript(void) -{ - if (sScriptContext1Status == 2) - return 0; - - if (sScriptContext1Status == 1) - return 0; - - ScriptContext2_Enable(); - - if (!RunScriptCommand(&sScriptContext1)) - { - sScriptContext1Status = 2; - ScriptContext2_Disable(); - return 0; - } - - return 1; -} - -void ScriptContext1_SetupScript(const u8 *ptr) -{ - InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); - SetupBytecodeScript(&sScriptContext1, ptr); - ScriptContext2_Enable(); - sScriptContext1Status = 0; -} - -void ScriptContext1_Stop(void) -{ - sScriptContext1Status = 1; -} - -void EnableBothScriptContexts() -{ - sScriptContext1Status = 0; - ScriptContext2_Enable(); -} - -void ScriptContext2_RunNewScript(const u8 *ptr) -{ - InitScriptContext(&sScriptContext2, &gScriptCmdTable, &gScriptCmdTableEnd); - SetupBytecodeScript(&sScriptContext2, ptr); - while (RunScriptCommand(&sScriptContext2) == 1) - ; -} - -static u8 *mapheader_get_tagged_pointer(u8 tag) -{ - u8 *mapScripts = gMapHeader.mapScripts; - - if (mapScripts == NULL) - return NULL; - - while (1) - { - if (*mapScripts == 0) - return NULL; - if (*mapScripts == tag) - { - mapScripts++; - return (u8 *)(mapScripts[0] + (mapScripts[1] << 8) + (mapScripts[2] << 16) + (mapScripts[3] << 24)); - } - mapScripts += 5; - } -} - -static void mapheader_run_script_by_tag(u8 tag) -{ - u8 *ptr = mapheader_get_tagged_pointer(tag); - if (ptr) - ScriptContext2_RunNewScript(ptr); -} - -static u8 *mapheader_get_first_match_from_tagged_ptr_list(u8 tag) -{ - u8 *ptr = mapheader_get_tagged_pointer(tag); - - if (!ptr) - return NULL; - - while (1) - { - u16 varIndex1; - u16 varIndex2; - varIndex1 = ptr[0] | (ptr[1] << 8); - if (!varIndex1) - return NULL; - ptr += 2; - varIndex2 = ptr[0] | (ptr[1] << 8); - ptr += 2; - if (VarGet(varIndex1) == VarGet(varIndex2)) - return (u8 *)(ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24)); - ptr += 4; - } -} - -void mapheader_run_script_with_tag_x1(void) -{ - mapheader_run_script_by_tag(1); -} - -void mapheader_run_script_with_tag_x3(void) -{ - mapheader_run_script_by_tag(3); -} - -void mapheader_run_script_with_tag_x5(void) -{ - mapheader_run_script_by_tag(5); -} - -void mapheader_run_script_with_tag_x6(void) -{ - mapheader_run_script_by_tag(6); -} - -bool8 mapheader_run_first_tag2_script_list_match(void) -{ - u8 *ptr = mapheader_get_first_match_from_tagged_ptr_list(2); - - if (!ptr) - return 0; - - ScriptContext1_SetupScript(ptr); - return 1; -} - -void mapheader_run_first_tag4_script_list_match(void) -{ - u8 *ptr = mapheader_get_first_match_from_tagged_ptr_list(4); - if (ptr) - ScriptContext2_RunNewScript(ptr); -} - -static u32 CalculateRamScriptChecksum(void) -{ - u32 i; - u32 sum = 0; - for (i = 0; i < sizeof(struct RamScriptData); i++) - sum += ((u8 *)&gSaveBlock1.ramScript.data)[i]; - return sum; -} - -void ClearRamScript(void) -{ - CpuFill32(0, &gSaveBlock1.ramScript, sizeof(struct RamScript)); -} - -bool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId) -{ - struct RamScriptData *scriptData = &gSaveBlock1.ramScript.data; - - ClearRamScript(); - - if (scriptSize > sizeof(scriptData->script)) - return FALSE; - - scriptData->magic = RAM_SCRIPT_MAGIC; - scriptData->mapGroup = mapGroup; - scriptData->mapNum = mapNum; - scriptData->objectId = objectId; - memcpy(scriptData->script, script, scriptSize); - gSaveBlock1.ramScript.checksum = CalculateRamScriptChecksum(); - return TRUE; -} - -u8 *GetRamScript(u8 objectId, u8 *script) -{ - struct RamScriptData *scriptData = &gSaveBlock1.ramScript.data; - gUnknown_0202E8AC = 0; - if (scriptData->magic == RAM_SCRIPT_MAGIC - && scriptData->mapGroup == gSaveBlock1.location.mapGroup - && scriptData->mapNum == gSaveBlock1.location.mapNum - && scriptData->objectId == objectId) - { - if (CalculateRamScriptChecksum() == gSaveBlock1.ramScript.checksum) - { - gUnknown_0202E8AC = script; - return scriptData->script; - } - ClearRamScript(); - } - return script; -} diff --git a/src/engine/sound.c b/src/engine/sound.c deleted file mode 100644 index 159ad3f70..000000000 --- a/src/engine/sound.c +++ /dev/null @@ -1,568 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "sound.h" -#include "battle.h" -#include "m4a.h" -#include "main.h" -#include "pokemon.h" -#include "constants/songs.h" -#include "task.h" - -struct Fanfare -{ - u16 songNum; - u16 duration; -}; - -extern u16 gBattleTypeFlags; - -static EWRAM_DATA struct MusicPlayerInfo *gMPlay_PokemonCry = NULL; -static EWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0; - -static u16 sCurrentMapMusic; -static u16 sNextMapMusic; -static u8 sMapMusicState; -static u8 sMapMusicFadeInSpeed; -static u16 sFanfareCounter; - -bool8 gDisableMusic; - -extern struct MusicPlayerInfo gMPlay_BGM; -extern struct MusicPlayerInfo gMPlay_SE1; -extern struct MusicPlayerInfo gMPlay_SE2; -extern struct MusicPlayerInfo gMPlay_SE3; - -extern struct ToneData voicegroup_8452590[]; -extern struct ToneData voicegroup_8452B90[]; -extern struct ToneData voicegroup_8453190[]; -extern struct ToneData voicegroup_8453790[]; - -extern struct ToneData voicegroup_84537C0[]; -extern struct ToneData voicegroup_8453DC0[]; -extern struct ToneData voicegroup_84543C0[]; -extern struct ToneData voicegroup_84549C0[]; - -static const struct Fanfare sFanfares[] = -{ - { BGM_FANFA1, 80 }, - { BGM_FANFA4, 160 }, - { BGM_FANFA5, 220 }, - { BGM_ME_WAZA, 220 }, - { BGM_ME_ASA, 160 }, - { BGM_ME_BACHI, 340 }, - { BGM_ME_WASURE, 180 }, - { BGM_ME_KINOMI, 120 }, - { BGM_ME_TAMA, 710 }, - { BGM_ME_B_BIG, 250 }, - { BGM_ME_B_SMALL, 150 }, - { BGM_ME_ZANNEN, 160 }, -}; - -static void Task_Fanfare(u8 taskId); -static void CreateFanfareTask(void); -static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode); -static void Task_DuckBGMForPokemonCry(u8 taskId); -static void RestoreBGMVolumeAfterPokemonCry(void); - -void InitMapMusic(void) -{ - gDisableMusic = FALSE; - ResetMapMusic(); -} - -void MapMusicMain(void) -{ - switch (sMapMusicState) - { - case 0: - break; - case 1: - sMapMusicState = 2; - PlayBGM(sCurrentMapMusic); - break; - case 2: - break; - case 5: - if (IsBGMStopped()) - { - sNextMapMusic = 0; - sMapMusicState = 0; - } - break; - case 6: - if (IsBGMStopped() && IsFanfareTaskInactive()) - { - sCurrentMapMusic = sNextMapMusic; - sNextMapMusic = 0; - sMapMusicState = 2; - PlayBGM(sCurrentMapMusic); - } - break; - case 7: - if (IsBGMStopped() && IsFanfareTaskInactive()) - { - FadeInNewBGM(sNextMapMusic, sMapMusicFadeInSpeed); - sCurrentMapMusic = sNextMapMusic; - sNextMapMusic = 0; - sMapMusicState = 2; - sMapMusicFadeInSpeed = 0; - } - break; - } -} - -void ResetMapMusic(void) -{ - sCurrentMapMusic = 0; - sNextMapMusic = 0; - sMapMusicState = 0; - sMapMusicFadeInSpeed = 0; -} - -u16 GetCurrentMapMusic(void) -{ - return sCurrentMapMusic; -} - -void PlayNewMapMusic(u16 songNum) -{ - sCurrentMapMusic = songNum; - sNextMapMusic = 0; - sMapMusicState = 1; -} - -void StopMapMusic(void) -{ - sCurrentMapMusic = 0; - sNextMapMusic = 0; - sMapMusicState = 1; -} - -void FadeOutMapMusic(u8 speed) -{ - if (IsNotWaitingForBGMStop()) - FadeOutBGM(speed); - sCurrentMapMusic = 0; - sNextMapMusic = 0; - sMapMusicState = 5; -} - -void FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed) -{ - FadeOutMapMusic(speed); - sCurrentMapMusic = 0; - sNextMapMusic = songNum; - sMapMusicState = 6; -} - -void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed) -{ - FadeOutMapMusic(fadeOutSpeed); - sCurrentMapMusic = 0; - sNextMapMusic = songNum; - sMapMusicState = 7; - sMapMusicFadeInSpeed = fadeInSpeed; -} - -void FadeInNewMapMusic(u16 songNum, u8 speed) -{ - FadeInNewBGM(songNum, speed); - sCurrentMapMusic = songNum; - sNextMapMusic = 0; - sMapMusicState = 2; - sMapMusicFadeInSpeed = 0; -} - -bool8 IsNotWaitingForBGMStop(void) -{ - if (sMapMusicState == 6) - return FALSE; - if (sMapMusicState == 5) - return FALSE; - if (sMapMusicState == 7) - return FALSE; - return TRUE; -} - -void PlayFanfareByFanfareNum(u8 fanfareNum) -{ - u16 songNum; - m4aMPlayStop(&gMPlay_BGM); - songNum = sFanfares[fanfareNum].songNum; - sFanfareCounter = sFanfares[fanfareNum].duration; - m4aSongNumStart(songNum); -} - -bool8 WaitFanfare(bool8 stop) -{ - if (sFanfareCounter) - { - sFanfareCounter--; - return FALSE; - } - else - { - if (!stop) - m4aMPlayContinue(&gMPlay_BGM); - else - m4aSongNumStart(SE_STOP); - - return TRUE; - } -} - -void StopFanfareByFanfareNum(u8 fanfareNum) -{ - m4aSongNumStop(sFanfares[fanfareNum].songNum); -} - -void PlayFanfare(u16 songNum) -{ - s32 i; - for (i = 0; (u32)i < 12; i++) - { - if (sFanfares[i].songNum == songNum) - { - PlayFanfareByFanfareNum(i); - CreateFanfareTask(); - return; - } - } - - PlayFanfareByFanfareNum(0); - CreateFanfareTask(); -} - -bool8 IsFanfareTaskInactive(void) -{ - if (FuncIsActiveTask(Task_Fanfare) == TRUE) - return FALSE; - return TRUE; -} - -static void Task_Fanfare(u8 taskId) -{ - if (sFanfareCounter) - { - sFanfareCounter--; - } - else - { - m4aMPlayContinue(&gMPlay_BGM); - DestroyTask(taskId); - } -} - -static void CreateFanfareTask(void) -{ - if (FuncIsActiveTask(Task_Fanfare) != TRUE) - CreateTask(Task_Fanfare, 80); -} - -void FadeInNewBGM(u16 songNum, u8 speed) -{ - if (gDisableMusic) - songNum = 0; - m4aSongNumStart(songNum); - m4aMPlayImmInit(&gMPlay_BGM); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0); - m4aSongNumStop(songNum); - m4aMPlayFadeIn(&gMPlay_BGM, speed); -} - -void FadeOutBGMTemporarily(u8 speed) -{ - m4aMPlayFadeOutTemporarily(&gMPlay_BGM, speed); -} - -bool8 IsBGMPausedOrStopped(void) -{ - if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) - return TRUE; - if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) - return TRUE; - return FALSE; -} - -void FadeInBGM(u8 speed) -{ - m4aMPlayFadeIn(&gMPlay_BGM, speed); -} - -void FadeOutBGM(u8 speed) -{ - m4aMPlayFadeOut(&gMPlay_BGM, speed); -} - -bool8 IsBGMStopped(void) -{ - if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) - return TRUE; - return FALSE; -} - -void PlayCry1(u16 species, s8 pan) -{ - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); - PlayCryInternal(species, pan, 125, 10, 0); - gPokemonCryBGMDuckingCounter = 2; - RestoreBGMVolumeAfterPokemonCry(); -} - -void PlayCry2(u16 species, s8 pan, s8 volume, u8 priority) -{ - PlayCryInternal(species, pan, volume, priority, 0); -} - -void PlayCry3(u16 species, s8 pan, u8 mode) -{ - if (mode == 1) - { - PlayCryInternal(species, pan, 125, 10, 1); - } - else - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); - PlayCryInternal(species, pan, 125, 10, mode); - gPokemonCryBGMDuckingCounter = 2; - RestoreBGMVolumeAfterPokemonCry(); - } -} - -void PlayCry4(u16 species, s8 pan, u8 mode) -{ - if (mode == 1) - { - PlayCryInternal(species, pan, 125, 10, 1); - } - else - { - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); - PlayCryInternal(species, pan, 125, 10, mode); - } -} - -void PlayCry5(u16 species, u8 mode) -{ - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); - PlayCryInternal(species, 0, 125, 10, mode); - gPokemonCryBGMDuckingCounter = 2; - RestoreBGMVolumeAfterPokemonCry(); -} - -static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) -{ - bool32 v0; - u32 release; - u32 length; - u32 pitch; - u32 chorus; - u32 index; - u8 table; - - species--; - v0 = FALSE; - release = 0; - length = 140; - pitch = 15360; - chorus = 0; - - switch (mode) - { - case 0: - break; - case 1: - length = 20; - release = 225; - break; - case 2: - length = 30; - release = 225; - pitch = 15600; - chorus = 20; - volume = 80; - break; - case 3: - length = 50; - release = 200; - pitch = 14800; - break; - case 4: - length = 20; - release = 220; - pitch = 15800; - break; - case 5: - release = 200; - pitch = 14500; - break; - } - - SetPokemonCryVolume(volume); - SetPokemonCryPanpot(pan); - SetPokemonCryPitch(pitch); - SetPokemonCryLength(length); - SetPokemonCryProgress(0); - SetPokemonCryRelease(release); - SetPokemonCryChorus(chorus); - SetPokemonCryPriority(priority); - - species = SpeciesToCryId(species); - index = species & 0x7F; - table = species >> 7; - - switch (table) - { - case 0: - gMPlay_PokemonCry = SetPokemonCryTone( - v0 ? &voicegroup_84537C0[index] : &voicegroup_8452590[index]); - break; - case 1: - gMPlay_PokemonCry = SetPokemonCryTone( - v0 ? &voicegroup_8453DC0[index] : &voicegroup_8452B90[index]); - break; - case 2: - gMPlay_PokemonCry = SetPokemonCryTone( - v0 ? &voicegroup_84543C0[index] : &voicegroup_8453190[index]); - break; - case 3: - gMPlay_PokemonCry = SetPokemonCryTone( - v0 ? &voicegroup_84549C0[index] : &voicegroup_8453790[index]); - break; - } -} - -bool8 IsCryFinished(void) -{ - if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) == TRUE) - { - return FALSE; - } - else - { - ClearPokemonCrySongs(); - return TRUE; - } -} - -void StopCryAndClearCrySongs(void) -{ - m4aMPlayStop(gMPlay_PokemonCry); - ClearPokemonCrySongs(); -} - -void StopCry(void) -{ - m4aMPlayStop(gMPlay_PokemonCry); -} - -bool8 IsCryPlayingOrClearCrySongs(void) -{ - if (IsPokemonCryPlaying(gMPlay_PokemonCry)) - { - return TRUE; - } - else - { - ClearPokemonCrySongs(); - return FALSE; - } -} - -bool8 IsCryPlaying(void) -{ - if (IsPokemonCryPlaying(gMPlay_PokemonCry)) - return TRUE; - else - return FALSE; -} - -static void Task_DuckBGMForPokemonCry(u8 taskId) -{ - if (gPokemonCryBGMDuckingCounter) - { - gPokemonCryBGMDuckingCounter--; - return; - } - - if (!IsPokemonCryPlaying(gMPlay_PokemonCry)) - { - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - DestroyTask(taskId); - } -} - -static void RestoreBGMVolumeAfterPokemonCry(void) -{ - if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) != TRUE) - CreateTask(Task_DuckBGMForPokemonCry, 80); -} - -void PlayBGM(u16 songNum) -{ - if (gDisableMusic) - songNum = 0; - m4aSongNumStart(songNum); -} - -void PlaySE(u16 songNum) -{ - m4aSongNumStart(songNum); -} - -void PlaySE12WithPanning(u16 songNum, s8 pan) -{ - m4aSongNumStart(songNum); - m4aMPlayImmInit(&gMPlay_SE1); - m4aMPlayImmInit(&gMPlay_SE2); - m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); - m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); -} - -void PlaySE1WithPanning(u16 songNum, s8 pan) -{ - m4aSongNumStart(songNum); - m4aMPlayImmInit(&gMPlay_SE1); - m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); -} - -void PlaySE2WithPanning(u16 songNum, s8 pan) -{ - m4aSongNumStart(songNum); - m4aMPlayImmInit(&gMPlay_SE2); - m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); -} - -void SE12PanpotControl(s8 pan) -{ - m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); - m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); -} - -bool8 IsSEPlaying(void) -{ - if ((gMPlay_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlay_SE2.status & MUSICPLAYER_STATUS_PAUSE)) - return FALSE; - if (!(gMPlay_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlay_SE2.status & MUSICPLAYER_STATUS_TRACK)) - return FALSE; - return TRUE; -} - -bool8 IsBGMPlaying(void) -{ - if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) - return FALSE; - if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) - return FALSE; - return TRUE; -} - -bool8 IsSpecialSEPlaying(void) -{ - if (gMPlay_SE3.status & MUSICPLAYER_STATUS_PAUSE) - return FALSE; - if (!(gMPlay_SE3.status & MUSICPLAYER_STATUS_TRACK)) - return FALSE; - return TRUE; -} diff --git a/src/engine/sprite.c b/src/engine/sprite.c deleted file mode 100644 index a9d84e01a..000000000 --- a/src/engine/sprite.c +++ /dev/null @@ -1,1803 +0,0 @@ -#include "global.h" -#include "debug.h" -#include "sprite.h" -#include "main.h" -#include "menu_cursor.h" -#include "palette.h" -#include "sprite.h" - -#define MAX_SPRITE_COPY_REQUESTS 64 - -#define OAM_MATRIX_COUNT 32 - -#define SET_SPRITE_TILE_RANGE(index, start, count) \ -{ \ - sSpriteTileRanges[index * 2] = start; \ - (sSpriteTileRanges + 1)[index * 2] = count; \ -} - -#define ALLOC_SPRITE_TILE(n) \ -{ \ - gSpriteTileAllocBitmap[(n) / 8] |= (1 << ((n) % 8)); \ -} - -#define FREE_SPRITE_TILE(n) \ -{ \ - gSpriteTileAllocBitmap[(n) / 8] &= ~(1 << ((n) % 8)); \ -} - -#define SPRITE_TILE_IS_ALLOCATED(n) ((gSpriteTileAllocBitmap[(n) / 8] >> ((n) % 8)) & 1) - -struct SpriteCopyRequest -{ - const u8 *src; - u8 *dest; - u16 size; -}; - -struct OamDimensions -{ - s8 width; - s8 height; -}; - -static void UpdateOamCoords(void); -static void BuildSpritePriorities(void); -static void SortSprites(void); -static void CopyMatricesToOamBuffer(void); -static void AddSpritesToOamBuffer(void); -static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); -static void ClearSpriteCopyRequests(void); -static void ResetOamMatrices(void); -static void ResetSprite(struct Sprite *sprite); -static s16 AllocSpriteTiles(u16 tileCount); -static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); -static void ResetAllSprites(void); -static void BeginAnim(struct Sprite *sprite); -static void ContinueAnim(struct Sprite *sprite); -static void AnimCmd_frame(struct Sprite *sprite); -static void AnimCmd_end(struct Sprite *sprite); -static void AnimCmd_jump(struct Sprite *sprite); -static void AnimCmd_loop(struct Sprite *sprite); -static void BeginAnimLoop(struct Sprite *sprite); -static void ContinueAnimLoop(struct Sprite *sprite); -static void JumpToTopOfAnimLoop(struct Sprite *sprite); -static void BeginAffineAnim(struct Sprite *sprite); -static void ContinueAffineAnim(struct Sprite *sprite); -static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite); -static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite); -static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); -static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); -static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); -static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite); -static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite); -static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite); -static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix); -static u8 GetSpriteMatrixNum(struct Sprite *sprite); -static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip); -static void AffineAnimStateRestartAnim(u8 matrixNum); -static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum); -static void AffineAnimStateReset(u8 matrixNum); -static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); -static void DecrementAnimDelayCounter(struct Sprite *sprite); -static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum); -static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); -static s16 ConvertScaleParam(s16 scale); -static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd); -static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); -static void ResetAffineAnimData(void); -static u8 IndexOfSpriteTileTag(u16 tag); -static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); -static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); - -typedef void (*AnimFunc)(struct Sprite *); -typedef void (*AnimCmdFunc)(struct Sprite *); -typedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *); - -#define DUMMY_OAM_DATA \ -{ \ - 160, /* Y (off-screen) */ \ - 0, \ - 0, \ - 0, \ - 0, \ - 0, \ - 304, /* X */ \ - 0, \ - 0, \ - 0, \ - 3, /* lowest priority */ \ - 0, \ - 0 \ -} - -#define ANIM_END 0xFFFF -#define AFFINE_ANIM_END 0x7FFF - -// forward declarations -const union AnimCmd * const gDummySpriteAnimTable[]; -const union AffineAnimCmd * const gDummySpriteAffineAnimTable[]; -const struct SpriteTemplate gDummySpriteTemplate; - -// Unreferenced error message. -// It means "The DMA transfer request table has exceeded its limit." -static const u8 sDmaOverErrorMsg[] = - _( - "DMA OVER\n" - "DMAてんそう\n" - "リクエストテーブルが\n" - "オーバーしました" - ); - -// Unreferenced data. -static const u8 sUnknownData[24] = -{ - 0x01, 0x04, 0x10, 0x40, - 0x02, 0x04, 0x08, 0x20, - 0x02, 0x04, 0x08, 0x20, - 0x01, 0x04, 0x10, 0x40, - 0x02, 0x04, 0x08, 0x20, - 0x02, 0x04, 0x08, 0x20, -}; - -static const u8 sCenterToCornerVecTable[3][4][2] = -{ - { // square - { -4, -4 }, - { -8, -8 }, - { -16, -16 }, - { -32, -32 }, - }, - { // horizontal rectangle - { -8, -4 }, - { -16, -4 }, - { -16, -8 }, - { -32, -16 }, - }, - { // vertical rectangle - { -4, -8 }, - { -4, -16 }, - { -8, -16 }, - { -16, -32 }, - }, -}; - -static const struct Sprite sDummySprite = -{ - .oam = DUMMY_OAM_DATA, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .template = &gDummySpriteTemplate, - .subspriteTables = NULL, - .callback = SpriteCallbackDummy, - .pos1 = { 304, 160 }, - .pos2 = { 0, 0 }, - .centerToCornerVecX = 0, - .centerToCornerVecY = 0, - .animNum = 0, - .animCmdIndex = 0, - .animDelayCounter = 0, - .animPaused = 0, - .affineAnimPaused = 0, - .animLoopCounter = 0, - .data = {0}, - .inUse = 0, - .coordOffsetEnabled = 0, - .invisible = 0, - .flags_3 = 0, - .flags_4 = 0, - .flags_5 = 0, - .flags_6 = 0, - .flags_7 = 0, - .hFlip = 0, - .vFlip = 0, - .animBeginning = 0, - .affineAnimBeginning = 0, - .animEnded = 0, - .affineAnimEnded = 0, - .usingSheet = 0, - .flags_f = 0, - .sheetTileStart = 0, - .subspriteTableNum = 0, - .subspriteMode = 0, - .subpriority = 0xFF -}; - -const struct OamData gDummyOamData = DUMMY_OAM_DATA; - -static const union AnimCmd sDummyAnim = { ANIM_END }; - -const union AnimCmd * const gDummySpriteAnimTable[] = { &sDummyAnim }; - -static const union AffineAnimCmd sDummyAffineAnim = { AFFINE_ANIM_END }; - -const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffineAnim }; - -const struct SpriteTemplate gDummySpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0xFFFF, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -// TODO: Find out what these are used for. -static const u16 sOamBitmasks[9] = -{ - 0xFF00, 0x00FF, 0x001F, - 0xFE00, 0x01FF, 0x03E0, - 0xFC00, 0x03FF, 0xFC00, -}; - -static const AnimFunc sAnimFuncs[] = -{ - ContinueAnim, - BeginAnim, -}; - -static const AnimFunc sAffineAnimFuncs[] = -{ - ContinueAffineAnim, - BeginAffineAnim, -}; - -static const AnimCmdFunc sAnimCmdFuncs[] = -{ - AnimCmd_loop, - AnimCmd_jump, - AnimCmd_end, - AnimCmd_frame, -}; - -static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] = -{ - AffineAnimCmd_loop, - AffineAnimCmd_jump, - AffineAnimCmd_end, - AffineAnimCmd_frame, -}; - -static const struct OamDimensions sOamDimensions[3][4] = -{ - { // square - { 8, 8 }, - { 16, 16 }, - { 32, 32 }, - { 64, 64 }, - }, - { // horizontal rectangle - { 16, 8 }, - { 32, 8 }, - { 32, 16 }, - { 64, 32 }, - }, - { // vertical rectangle - { 8, 16 }, - { 8, 32 }, - { 16, 32 }, - { 32, 64 }, - }, -}; - -static u16 sSpriteTileRangeTags[MAX_SPRITES]; -static u16 sSpriteTileRanges[MAX_SPRITES * 2]; -static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT]; -static u16 sSpritePaletteTags[16]; - -u8 gSpriteOrder[MAX_SPRITES]; -bool8 gShouldProcessSpriteCopyRequests; -u8 gSpriteCopyRequestCount; -struct SpriteCopyRequest gSpriteCopyRequests[MAX_SPRITE_COPY_REQUESTS]; -u8 gOamLimit; -u16 gReservedSpriteTileCount; -u8 gSpriteTileAllocBitmap[128]; -s16 gSpriteCoordOffsetX; -s16 gSpriteCoordOffsetY; -u32 gOamMatrixAllocBitmap; -struct OamMatrix gOamMatrices[OAM_MATRIX_COUNT]; -u8 gReservedSpritePaletteCount; - -EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0}; -EWRAM_DATA u16 gSpritePriorities[MAX_SPRITES] = {0}; -EWRAM_DATA u8 gAffineAnimsDisabled = {0}; - -void ResetSpriteData(void) -{ - ResetOamRange(0, 128); - ResetAllSprites(); - ClearSpriteCopyRequests(); - ResetAffineAnimData(); - FreeSpriteTileRanges(); - gOamLimit = 64; - gReservedSpriteTileCount = 0; - AllocSpriteTiles(0); - gSpriteCoordOffsetX = 0; - gSpriteCoordOffsetY = 0; -} - -void AnimateSprites(void) -{ - u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - - if (sprite->inUse) - { - sprite->callback(sprite); - - if (sprite->inUse) - AnimateSprite(sprite); - } - } -} - -void BuildOamBuffer(void) -{ - u8 temp; - UpdateOamCoords(); - BuildSpritePriorities(); - SortSprites(); - temp = gMain.oamLoadDisabled; - gMain.oamLoadDisabled = TRUE; - AddSpritesToOamBuffer(); - CopyMatricesToOamBuffer(); - gMain.oamLoadDisabled = temp; - gShouldProcessSpriteCopyRequests = TRUE; -} - -static void UpdateOamCoords(void) -{ - u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && !sprite->invisible) - { - if (sprite->coordOffsetEnabled) - { - sprite->oam.x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - sprite->oam.y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - sprite->oam.x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - sprite->oam.y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - } - } -} - -static void BuildSpritePriorities(void) -{ - u16 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - u16 priority = sprite->subpriority | (sprite->oam.priority << 8); - gSpritePriorities[i] = priority; - } -} - -static void SortSprites(void) -{ - u8 i; - for (i = 1; i < MAX_SPRITES; i++) - { - u8 j = i; - struct Sprite *sprite1 = &gSprites[gSpriteOrder[i - 1]]; - struct Sprite *sprite2 = &gSprites[gSpriteOrder[i]]; - u16 sprite1Priority = gSpritePriorities[gSpriteOrder[i - 1]]; - u16 sprite2Priority = gSpritePriorities[gSpriteOrder[i]]; - s16 sprite1Y = sprite1->oam.y; - s16 sprite2Y = sprite2->oam.y; - - if (sprite1Y >= DISPLAY_HEIGHT) - sprite1Y = sprite1Y - 256; - - if (sprite2Y >= DISPLAY_HEIGHT) - sprite2Y = sprite2Y - 256; - - if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite1->oam.size == 3) - { - u32 shape = sprite1->oam.shape; - if (shape == ST_OAM_SQUARE || shape == 2) - { - if (sprite1Y > 128) - sprite1Y = sprite1Y - 256; - } - } - - if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite2->oam.size == 3) - { - u32 shape = sprite2->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite2Y > 128) - sprite2Y = sprite2Y - 256; - } - } - - while (j > 0 - && ((sprite1Priority > sprite2Priority) - || (sprite1Priority == sprite2Priority && sprite1Y < sprite2Y))) - { - u8 temp = gSpriteOrder[j]; - gSpriteOrder[j] = gSpriteOrder[j - 1]; - gSpriteOrder[j - 1] = temp; - - // UB: If j equals 1, then j-- makes j equal 0. - // Then, gSpriteOrder[-1] gets accessed below. - // Although this doesn't result in a bug in the ROM, - // the behavior is undefined. - j--; - - sprite1 = &gSprites[gSpriteOrder[j - 1]]; - sprite2 = &gSprites[gSpriteOrder[j]]; - sprite1Priority = gSpritePriorities[gSpriteOrder[j - 1]]; - sprite2Priority = gSpritePriorities[gSpriteOrder[j]]; - sprite1Y = sprite1->oam.y; - sprite2Y = sprite2->oam.y; - - if (sprite1Y >= DISPLAY_HEIGHT) - sprite1Y = sprite1Y - 256; - - if (sprite2Y >= DISPLAY_HEIGHT) - sprite2Y = sprite2Y - 256; - - if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite1->oam.size == 3) - { - u32 shape = sprite1->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite1Y > 128) - sprite1Y = sprite1Y - 256; - } - } - - if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE - && sprite2->oam.size == 3) - { - u32 shape = sprite2->oam.shape; - if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) - { - if (sprite2Y > 128) - sprite2Y = sprite2Y - 256; - } - } - } - } -} - -static void CopyMatricesToOamBuffer(void) -{ - u8 i; - for (i = 0; i < OAM_MATRIX_COUNT; i++) - { - u32 base = 4 * i; - gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; - gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; - gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; - gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; - } -} - -static void AddSpritesToOamBuffer(void) -{ - u8 i = 0; - u8 oamIndex = 0; - - while (i < MAX_SPRITES) - { - struct Sprite *sprite = &gSprites[gSpriteOrder[i]]; - if (sprite->inUse && !sprite->invisible && AddSpriteToOamBuffer(sprite, &oamIndex)) - break; - i++; - } - - gMain.objCount = oamIndex; - - while (oamIndex < gOamLimit) - { - gMain.oamBuffer[oamIndex] = gDummyOamData; - oamIndex++; - } -} - -u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - if (!gSprites[i].inUse) - return CreateSpriteAt(i, template, x, y, subpriority); - - return MAX_SPRITES; -} - -u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) -{ - s16 i; - - for (i = MAX_SPRITES - 1; i > -1; i--) - if (!gSprites[i].inUse) - return CreateSpriteAt(i, template, x, y, subpriority); - - return MAX_SPRITES; -} - -u8 CreateInvisibleSprite(void (*callback)(struct Sprite *)) -{ - u8 index = CreateSprite(&gDummySpriteTemplate, 0, 0, 31); - - if (index == MAX_SPRITES) - { - return MAX_SPRITES; - } - else - { - gSprites[index].invisible = TRUE; - gSprites[index].callback = callback; - return index; - } -} - -static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) -{ - struct Sprite *sprite = &gSprites[index]; - - ResetSprite(sprite); - - sprite->inUse = TRUE; - sprite->animBeginning = TRUE; - sprite->affineAnimBeginning = TRUE; - sprite->usingSheet = TRUE; - - sprite->subpriority = subpriority; - sprite->oam = *template->oam; - sprite->anims = template->anims; - sprite->affineAnims = template->affineAnims; - sprite->template = template; - sprite->callback = template->callback; - sprite->pos1.x = x; - sprite->pos1.y = y; - - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - - if (template->tileTag == 0xFFFF) - { - s16 tileNum; - sprite->images = template->images; - tileNum = AllocSpriteTiles((u8)(sprite->images->size / TILE_SIZE_4BPP)); - if (tileNum == -1) - { - ResetSprite(sprite); - return MAX_SPRITES; - } - sprite->oam.tileNum = tileNum; - sprite->usingSheet = FALSE; - sprite->sheetTileStart = 0; - } - else - { - sprite->sheetTileStart = GetSpriteTileStartByTag(template->tileTag); - SetSpriteSheetFrameTileNum(sprite); - } - - if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) - InitSpriteAffineAnim(sprite); - - if (template->paletteTag != 0xFFFF) - sprite->oam.paletteNum = IndexOfSpritePaletteTag(template->paletteTag); - - return index; -} - -u8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - - if (!gSprites[i].inUse) - { - u8 index = CreateSpriteAt(i, template, x, y, subpriority); - - if (index == MAX_SPRITES) - return MAX_SPRITES; - - gSprites[i].callback(sprite); - - if (gSprites[i].inUse) - AnimateSprite(sprite); - - return index; - } - } - - return MAX_SPRITES; -} - -void DestroySprite(struct Sprite *sprite) -{ - if (sprite->inUse) - { - if (!sprite->usingSheet) - { - u16 i; - u16 tileEnd = (sprite->images->size / TILE_SIZE_4BPP) + sprite->oam.tileNum; - for (i = sprite->oam.tileNum; i < tileEnd; i++) - FREE_SPRITE_TILE(i); - } - ResetSprite(sprite); - } -} - -void ResetOamRange(u8 a, u8 b) -{ - u8 i; - - for (i = a; i < b; i++) - { - struct OamData *oamBuffer = gMain.oamBuffer; - oamBuffer[i] = *(struct OamData *)&gDummyOamData; - } -} - -void LoadOam(void) -{ - if (!gMain.oamLoadDisabled) - CpuCopy32(gMain.oamBuffer, (void *)OAM, sizeof(gMain.oamBuffer)); -} - -static void ClearSpriteCopyRequests(void) -{ - u8 i; - - gShouldProcessSpriteCopyRequests = FALSE; - gSpriteCopyRequestCount = 0; - - for (i = 0; i < MAX_SPRITE_COPY_REQUESTS; i++) - { - gSpriteCopyRequests[i].src = 0; - gSpriteCopyRequests[i].dest = 0; - gSpriteCopyRequests[i].size = 0; - } -} - -static void ResetOamMatrices(void) -{ - u8 i; - for (i = 0; i < OAM_MATRIX_COUNT; i++) - { - // set to identity matrix - gOamMatrices[i].a = 0x0100; - gOamMatrices[i].b = 0x0000; - gOamMatrices[i].c = 0x0000; - gOamMatrices[i].d = 0x0100; - } -} - -void SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d) -{ - gOamMatrices[matrixNum].a = a; - gOamMatrices[matrixNum].b = b; - gOamMatrices[matrixNum].c = c; - gOamMatrices[matrixNum].d = d; -} - -static void ResetSprite(struct Sprite *sprite) -{ - *sprite = sDummySprite; -} - -void CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode) -{ - u8 x = sCenterToCornerVecTable[shape][size][0]; - u8 y = sCenterToCornerVecTable[shape][size][1]; - - if (affineMode & ST_OAM_AFFINE_DOUBLE_MASK) - { - x *= 2; - y *= 2; - } - - sprite->centerToCornerVecX = x; - sprite->centerToCornerVecY = y; -} - -static s16 AllocSpriteTiles(u16 tileCount) -{ - u16 i; - s16 start; - u16 numTilesFound; - - if (tileCount == 0) - { - // Free all unreserved tiles if the tile count is 0. - for (i = gReservedSpriteTileCount; i < TOTAL_OBJ_TILE_COUNT; i++) - FREE_SPRITE_TILE(i); - - return 0; - } - - i = gReservedSpriteTileCount; - - for (;;) - { - while (SPRITE_TILE_IS_ALLOCATED(i)) - { - i++; - - if (i == TOTAL_OBJ_TILE_COUNT) - return -1; - } - - start = i; - numTilesFound = 1; - - while (numTilesFound != tileCount) - { - i++; - - if (i == TOTAL_OBJ_TILE_COUNT) - return -1; - - if (!SPRITE_TILE_IS_ALLOCATED(i)) - numTilesFound++; - else - break; - } - - if (numTilesFound == tileCount) - break; - } - - for (i = start; i < tileCount + start; i++) - ALLOC_SPRITE_TILE(i); - - return start; -} - -u8 SpriteTileAllocBitmapOp(u16 bit, u8 op) -{ - u8 index = bit / 8; - u8 shift = bit % 8; - u8 val = bit % 8; - u8 retVal = 0; - - if (op == 0) - { - val = ~(1 << val); - gSpriteTileAllocBitmap[index] &= val; - } - else if (op == 1) - { - val = (1 << val); - gSpriteTileAllocBitmap[index] |= val; - } - else - { - retVal = 1 << shift; - retVal &= gSpriteTileAllocBitmap[index]; - } - - return retVal; -} - -void SpriteCallbackDummy(struct Sprite *sprite) -{ -} - -void ProcessSpriteCopyRequests(void) -{ - if (gShouldProcessSpriteCopyRequests) - { - u8 i = 0; - - while (gSpriteCopyRequestCount > 0) - { - CpuCopy16(gSpriteCopyRequests[i].src, gSpriteCopyRequests[i].dest, gSpriteCopyRequests[i].size); - gSpriteCopyRequestCount--; - i++; - } - - gShouldProcessSpriteCopyRequests = FALSE; - } -} - -static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) -{ - if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) - { - gSpriteCopyRequests[gSpriteCopyRequestCount].src = images[index].data; - gSpriteCopyRequests[gSpriteCopyRequestCount].dest = OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum; - gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size; - gSpriteCopyRequestCount++; - } -#if DEBUG - else - { - Crash(sDmaOverErrorMsg); - } -#endif -} - -void RequestSpriteCopy(const void *src, u8 *dest, u16 size) -{ - if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) - { - gSpriteCopyRequests[gSpriteCopyRequestCount].src = src; - gSpriteCopyRequests[gSpriteCopyRequestCount].dest = dest; - gSpriteCopyRequests[gSpriteCopyRequestCount].size = size; - gSpriteCopyRequestCount++; - } -#if DEBUG - else - { - Crash(sDmaOverErrorMsg); - } -#endif -} - -// these two functions are unused. -void CopyFromSprites(u8 *dest) -{ - u32 i; - u8 *src = (u8 *)gSprites; - for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) - { - *dest = *src; - dest++; - src++; - } -} - -void CopyToSprites(u8 *src) -{ - u32 i; - u8 *dest = (u8 *)gSprites; - for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) - { - *dest = *src; - src++; - dest++; - } -} - -static void ResetAllSprites(void) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - ResetSprite(&gSprites[i]); - gSpriteOrder[i] = i; - } - - ResetSprite(&gSprites[i]); - sub_814A590(); -} - -void FreeSpriteTiles(struct Sprite *sprite) -{ - if (sprite->template->tileTag != 0xFFFF) - FreeSpriteTilesByTag(sprite->template->tileTag); -} - -void FreeSpritePalette(struct Sprite *sprite) -{ - FreeSpritePaletteByTag(sprite->template->paletteTag); -} - -void FreeSpriteOamMatrix(struct Sprite *sprite) -{ - if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) - { - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - } -} - -void DestroySpriteAndFreeResources(struct Sprite *sprite) -{ - FreeSpriteTiles(sprite); - FreeSpritePalette(sprite); - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); -} - -// Loads the mon name, level, and hp sprites into OAM. -void DrawPartyMenuMonText(u32 a1, u32 a2, const u16 *a3, u16 a4, u32 baseTileNumber) -{ - const u16 *d = a3; - struct OamData *oam = &gMain.oamBuffer[gMain.objCount]; - while (!(gMain.objCount & 0x80) && (s16)(d[0] + 1) != 0) - { - u16 *x = (u16 *)oam; - x[0] = (d[0] & sOamBitmasks[0]) | ((d[0] + a2) & sOamBitmasks[1]) | ((a4 & sOamBitmasks[2]) << 8); - x[1] = (d[1] & sOamBitmasks[3]) | ((d[1] + a1) & sOamBitmasks[4]) | ((a4 & sOamBitmasks[5]) << 4); - x[2] = (d[2] & sOamBitmasks[6]) | ((d[2] + baseTileNumber) & sOamBitmasks[7]) | (a4 & sOamBitmasks[8]); - oam++; - gMain.objCount++; - d += 3; - } -} - -void AnimateSprite(struct Sprite *sprite) -{ - sAnimFuncs[sprite->animBeginning](sprite); - - if (!gAffineAnimsDisabled) - sAffineAnimFuncs[sprite->affineAnimBeginning](sprite); -} - -static void BeginAnim(struct Sprite *sprite) -{ - s16 imageValue; - u8 duration; - u8 hFlip; - u8 vFlip; - - sprite->animCmdIndex = 0; - sprite->animEnded = FALSE; - sprite->animLoopCounter = 0; - imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - - if (imageValue != -1) - { - sprite->animBeginning = FALSE; - duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; - vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; - - if (duration) - duration--; - - sprite->animDelayCounter = duration; - - if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) - SetSpriteOamFlipBits(sprite, hFlip, vFlip); - - if (sprite->usingSheet) - sprite->oam.tileNum = sprite->sheetTileStart + imageValue; - else - RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); - } -} - -static void ContinueAnim(struct Sprite *sprite) -{ - if (sprite->animDelayCounter) - { - u8 hFlip; - u8 vFlip; - DecrementAnimDelayCounter(sprite); - hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; - vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; - if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) - SetSpriteOamFlipBits(sprite, hFlip, vFlip); - } - else if (!sprite->animPaused) - { - s16 type; - s16 funcIndex; - sprite->animCmdIndex++; - type = sprite->anims[sprite->animNum][sprite->animCmdIndex].type; - funcIndex = 3; - if (type < 0) - funcIndex = type + 3; - sAnimCmdFuncs[funcIndex](sprite); - } -} - -static void AnimCmd_frame(struct Sprite *sprite) -{ - s16 imageValue; - u8 duration; - u8 hFlip; - u8 vFlip; - - imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; - vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; - - if (duration) - duration--; - - sprite->animDelayCounter = duration; - - if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) - SetSpriteOamFlipBits(sprite, hFlip, vFlip); - - if (sprite->usingSheet) - sprite->oam.tileNum = sprite->sheetTileStart + imageValue; - else - RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); -} - -static void AnimCmd_end(struct Sprite *sprite) -{ - sprite->animCmdIndex--; - sprite->animEnded = TRUE; -} - -static void AnimCmd_jump(struct Sprite *sprite) -{ - s16 imageValue; - u8 duration; - u8 hFlip; - u8 vFlip; - - sprite->animCmdIndex = sprite->anims[sprite->animNum][sprite->animCmdIndex].jump.target; - - imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; - vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; - - if (duration) - duration--; - - sprite->animDelayCounter = duration; - - if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) - SetSpriteOamFlipBits(sprite, hFlip, vFlip); - - if (sprite->usingSheet) - sprite->oam.tileNum = sprite->sheetTileStart + imageValue; - else - RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); -} - -static void AnimCmd_loop(struct Sprite *sprite) -{ - if (sprite->animLoopCounter) - ContinueAnimLoop(sprite); - else - BeginAnimLoop(sprite); -} - -static void BeginAnimLoop(struct Sprite *sprite) -{ - sprite->animLoopCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].loop.count; - JumpToTopOfAnimLoop(sprite); - ContinueAnim(sprite); -} - -static void ContinueAnimLoop(struct Sprite *sprite) -{ - sprite->animLoopCounter--; - JumpToTopOfAnimLoop(sprite); - ContinueAnim(sprite); -} - -static void JumpToTopOfAnimLoop(struct Sprite *sprite) -{ - if (sprite->animLoopCounter) - { - sprite->animCmdIndex--; - - while (sprite->anims[sprite->animNum][sprite->animCmdIndex - 1].type != -3) - { - if (sprite->animCmdIndex == 0) - break; - sprite->animCmdIndex--; - } - - sprite->animCmdIndex--; - } -} - -static void BeginAffineAnim(struct Sprite *sprite) -{ - if ((sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) && sprite->affineAnims[0][0].type != 32767) - { - struct AffineAnimFrameCmd frameCmd; - u8 matrixNum = GetSpriteMatrixNum(sprite); - AffineAnimStateRestartAnim(matrixNum); - GetAffineAnimFrame(matrixNum, sprite, &frameCmd); - sprite->affineAnimBeginning = FALSE; - sprite->affineAnimEnded = FALSE; - ApplyAffineAnimFrame(matrixNum, &frameCmd); - sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; - } -} - -static void ContinueAffineAnim(struct Sprite *sprite) -{ - if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) - { - u8 matrixNum = GetSpriteMatrixNum(sprite); - - if (sAffineAnimStates[matrixNum].delayCounter) - { - AffineAnimDelay(matrixNum, sprite); - } - else if (!sprite->affineAnimPaused) - { - s16 type; - s16 funcIndex; - sAffineAnimStates[matrixNum].animCmdIndex++; - type = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].type; - funcIndex = 3; - if (type >= 32765) - funcIndex = type - 32765; - sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite); - } - } -} - -static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite) -{ - if (!DecrementAffineAnimDelayCounter(sprite, matrixNum)) - { - struct AffineAnimFrameCmd frameCmd; - GetAffineAnimFrame(matrixNum, sprite, &frameCmd); - ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &frameCmd); - } -} - -static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite) -{ - if (sAffineAnimStates[matrixNum].loopCounter) - ContinueAffineAnimLoop(matrixNum, sprite); - else - BeginAffineAnimLoop(matrixNum, sprite); -} - -static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) -{ - sAffineAnimStates[matrixNum].loopCounter = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].loop.count; - JumpToTopOfAffineAnimLoop(matrixNum, sprite); - ContinueAffineAnim(sprite); -} - -static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) -{ - sAffineAnimStates[matrixNum].loopCounter--; - JumpToTopOfAffineAnimLoop(matrixNum, sprite); - ContinueAffineAnim(sprite); -} - -static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) -{ - if (sAffineAnimStates[matrixNum].loopCounter) - { - sAffineAnimStates[matrixNum].animCmdIndex--; - - while (sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex - 1].type != 32765) - { - if (sAffineAnimStates[matrixNum].animCmdIndex == 0) - break; - sAffineAnimStates[matrixNum].animCmdIndex--; - } - - sAffineAnimStates[matrixNum].animCmdIndex--; - } -} - -static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite) -{ - struct AffineAnimFrameCmd frameCmd; - sAffineAnimStates[matrixNum].animCmdIndex = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].jump.target; - GetAffineAnimFrame(matrixNum, sprite, &frameCmd); - ApplyAffineAnimFrame(matrixNum, &frameCmd); - sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; -} - -static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite) -{ - struct AffineAnimFrameCmd dummyFrameCmd = {0}; - sprite->affineAnimEnded = TRUE; - sAffineAnimStates[matrixNum].animCmdIndex--; - ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); -} - -static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite) -{ - struct AffineAnimFrameCmd frameCmd; - GetAffineAnimFrame(matrixNum, sprite, &frameCmd); - ApplyAffineAnimFrame(matrixNum, &frameCmd); - sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; -} - -static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix) -{ - gOamMatrices[destMatrixIndex].a = srcMatrix->a; - gOamMatrices[destMatrixIndex].b = srcMatrix->b; - gOamMatrices[destMatrixIndex].c = srcMatrix->c; - gOamMatrices[destMatrixIndex].d = srcMatrix->d; -} - -static u8 GetSpriteMatrixNum(struct Sprite *sprite) -{ - u8 matrixNum = 0; - if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) - matrixNum = sprite->oam.matrixNum; - return matrixNum; -} - -static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip) -{ - sprite->oam.matrixNum &= 0x7; - sprite->oam.matrixNum |= (((hFlip ^ sprite->hFlip) & 1) << 3); - sprite->oam.matrixNum |= (((vFlip ^ sprite->vFlip) & 1) << 4); -} - -static void AffineAnimStateRestartAnim(u8 matrixNum) -{ - sAffineAnimStates[matrixNum].animCmdIndex = 0; - sAffineAnimStates[matrixNum].delayCounter = 0; - sAffineAnimStates[matrixNum].loopCounter = 0; -} - -static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum) -{ - sAffineAnimStates[matrixNum].animNum = animNum; - sAffineAnimStates[matrixNum].animCmdIndex = 0; - sAffineAnimStates[matrixNum].delayCounter = 0; - sAffineAnimStates[matrixNum].loopCounter = 0; - sAffineAnimStates[matrixNum].xScale = 0x0100; - sAffineAnimStates[matrixNum].yScale = 0x0100; - sAffineAnimStates[matrixNum].rotation = 0; -} - -static void AffineAnimStateReset(u8 matrixNum) -{ - sAffineAnimStates[matrixNum].animNum = 0; - sAffineAnimStates[matrixNum].animCmdIndex = 0; - sAffineAnimStates[matrixNum].delayCounter = 0; - sAffineAnimStates[matrixNum].loopCounter = 0; - sAffineAnimStates[matrixNum].xScale = 0x0100; - sAffineAnimStates[matrixNum].yScale = 0x0100; - sAffineAnimStates[matrixNum].rotation = 0; -} - -static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) -{ - sAffineAnimStates[matrixNum].xScale = frameCmd->xScale; - sAffineAnimStates[matrixNum].yScale = frameCmd->yScale; - sAffineAnimStates[matrixNum].rotation = frameCmd->rotation << 8; -} - -static void DecrementAnimDelayCounter(struct Sprite *sprite) -{ - if (!sprite->animPaused) - sprite->animDelayCounter--; -} - -static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum) -{ - if (!sprite->affineAnimPaused) - --sAffineAnimStates[matrixNum].delayCounter; - return sprite->affineAnimPaused; -} - -static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) -{ - struct ObjAffineSrcData srcData; - struct OamMatrix matrix; - sAffineAnimStates[matrixNum].xScale += frameCmd->xScale; - sAffineAnimStates[matrixNum].yScale += frameCmd->yScale; - sAffineAnimStates[matrixNum].rotation = (sAffineAnimStates[matrixNum].rotation + (frameCmd->rotation << 8)) & ~0xFF; - srcData.xScale = ConvertScaleParam(sAffineAnimStates[matrixNum].xScale); - srcData.yScale = ConvertScaleParam(sAffineAnimStates[matrixNum].yScale); - srcData.rotation = sAffineAnimStates[matrixNum].rotation; - ObjAffineSet(&srcData, &matrix, 1, 2); - CopyOamMatrix(matrixNum, &matrix); -} - -static s16 ConvertScaleParam(s16 scale) -{ - s32 val = 0x10000; - return val / scale; -} - -static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd) -{ - frameCmd->xScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.xScale; - frameCmd->yScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.yScale; - frameCmd->rotation = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.rotation; - frameCmd->duration = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.duration; -} - -static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) -{ - struct AffineAnimFrameCmd dummyFrameCmd = {0}; - - if (frameCmd->duration) - { - frameCmd->duration--; - ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, frameCmd); - } - else - { - ApplyAffineAnimFrameAbsolute(matrixNum, frameCmd); - ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); - } -} - -void StartSpriteAnim(struct Sprite *sprite, u8 animNum) -{ - sprite->animNum = animNum; - sprite->animBeginning = TRUE; - sprite->animEnded = FALSE; -} - -void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum) -{ - if (sprite->animNum != animNum) - StartSpriteAnim(sprite, animNum); -} - -void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex) -{ - u8 temp = sprite->animPaused; - sprite->animCmdIndex = animCmdIndex - 1; - sprite->animDelayCounter = 0; - sprite->animBeginning = FALSE; - sprite->animEnded = FALSE; - sprite->animPaused = FALSE; - ContinueAnim(sprite); - if (sprite->animDelayCounter) - sprite->animDelayCounter++; - sprite->animPaused = temp; -} - -void StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum) -{ - u8 matrixNum = GetSpriteMatrixNum(sprite); - AffineAnimStateStartAnim(matrixNum, animNum); - sprite->affineAnimBeginning = TRUE; - sprite->affineAnimEnded = FALSE; -} - -void StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) -{ - u8 matrixNum = GetSpriteMatrixNum(sprite); - if (sAffineAnimStates[matrixNum].animNum != animNum) - StartSpriteAffineAnim(sprite, animNum); -} - -void ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum) -{ - u8 matrixNum = GetSpriteMatrixNum(sprite); - sAffineAnimStates[matrixNum].animNum = animNum; - sprite->affineAnimBeginning = TRUE; - sprite->affineAnimEnded = FALSE; -} - -void ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) -{ - u8 matrixNum = GetSpriteMatrixNum(sprite); - if (sAffineAnimStates[matrixNum].animNum != animNum) - ChangeSpriteAffineAnim(sprite, animNum); -} - -void SetSpriteSheetFrameTileNum(struct Sprite *sprite) -{ - if (sprite->usingSheet) - { - s16 tileOffset = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - if (tileOffset < 0) - tileOffset = 0; - sprite->oam.tileNum = sprite->sheetTileStart + tileOffset; - } -} - -static void ResetAffineAnimData(void) -{ - u8 i; - - gAffineAnimsDisabled = 0; - gOamMatrixAllocBitmap = 0; - - ResetOamMatrices(); - - for (i = 0; i < OAM_MATRIX_COUNT; i++) - AffineAnimStateReset(i); -} - -u8 AllocOamMatrix(void) -{ - u8 i = 0; - u32 bit = 1; - u32 bitmap = gOamMatrixAllocBitmap; - - while (i < OAM_MATRIX_COUNT) - { - if (!(bitmap & bit)) - { - gOamMatrixAllocBitmap |= bit; - return i; - } - - i++; - bit <<= 1; - } - - return 0xFF; -} - -void FreeOamMatrix(u8 matrixNum) -{ - u8 i = 0; - u32 bit = 1; - - while (i < matrixNum) - { - i++; - bit <<= 1; - } - - gOamMatrixAllocBitmap &= ~bit; - SetOamMatrix(matrixNum, 0x100, 0, 0, 0x100); -} - -void InitSpriteAffineAnim(struct Sprite *sprite) -{ - u8 matrixNum = AllocOamMatrix(); - if (matrixNum != 0xFF) - { - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - sprite->oam.matrixNum = matrixNum; - sprite->affineAnimBeginning = TRUE; - AffineAnimStateReset(matrixNum); - } -} - -void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation) -{ - struct ObjAffineSrcData srcData; - struct OamMatrix matrix; - srcData.xScale = ConvertScaleParam(xScale); - srcData.yScale = ConvertScaleParam(yScale); - srcData.rotation = rotation; - ObjAffineSet(&srcData, &matrix, 1, 2); - CopyOamMatrix(matrixNum, &matrix); -} - -u16 LoadSpriteSheet(const struct SpriteSheet *sheet) -{ - s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); - - if (tileStart < 0) - { - return 0; - } - else - { - AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); - CpuCopy16(sheet->data, OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); - return (u16)tileStart; - } -} - -void LoadSpriteSheets(const struct SpriteSheet *sheets) -{ - u8 i; - for (i = 0; sheets[i].data != NULL; i++) - LoadSpriteSheet(&sheets[i]); -} - -u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet) -{ - s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); - - if (tileStart < 0) - { - return 0; - } - else - { - AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); - return (u16)tileStart; - } -} - -void AllocTilesForSpriteSheets(struct SpriteSheet *sheets) -{ - u8 i; - for (i = 0; sheets[i].data != NULL; i++) - AllocTilesForSpriteSheet(&sheets[i]); -} - -void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet) -{ - const u8 *data = sheet->data; - u16 tileStart = GetSpriteTileStartByTag(sheet->tag); - CpuCopy16(data, OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); -} - -void LoadTilesForSpriteSheets(struct SpriteSheet *sheets) -{ - u8 i; - for (i = 0; sheets[i].data != NULL; i++) - LoadTilesForSpriteSheet(&sheets[i]); -} - -void FreeSpriteTilesByTag(u16 tag) -{ - u8 index = IndexOfSpriteTileTag(tag); - if (index != 0xFF) - { - u16 i; - u16 *rangeStarts; - u16 *rangeCounts; - u16 start; - u16 count; - rangeStarts = sSpriteTileRanges; - start = rangeStarts[index * 2]; - rangeCounts = sSpriteTileRanges + 1; - count = rangeCounts[index * 2]; - - for (i = start; i < start + count; i++) - FREE_SPRITE_TILE(i); - - sSpriteTileRangeTags[index] = 0xFFFF; - } -} - -void FreeSpriteTileRanges(void) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - sSpriteTileRangeTags[i] = 0xFFFF; - SET_SPRITE_TILE_RANGE(i, 0, 0); - } -} - -u16 GetSpriteTileStartByTag(u16 tag) -{ - u8 index = IndexOfSpriteTileTag(tag); - if (index == 0xFF) - return 0xFFFF; - return sSpriteTileRanges[index * 2]; -} - -static u8 IndexOfSpriteTileTag(u16 tag) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - if (sSpriteTileRangeTags[i] == tag) - return i; - - return 0xFF; -} - -u16 GetSpriteTileTagByTileStart(u16 start) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - if (sSpriteTileRangeTags[i] != 0xFFFF && sSpriteTileRanges[i * 2] == start) - return sSpriteTileRangeTags[i]; - } - - return 0xFFFF; -} - -static void AllocSpriteTileRange(u16 tag, u16 start, u16 count) -{ - u8 freeIndex = IndexOfSpriteTileTag(0xFFFF); - sSpriteTileRangeTags[freeIndex] = tag; - SET_SPRITE_TILE_RANGE(freeIndex, start, count); -} - -void RequestSpriteSheetCopy(const struct SpriteSheet *sheet) -{ - const u8 *data = sheet->data; - u16 tileStart = GetSpriteTileStartByTag(sheet->tag); - RequestSpriteCopy(data, OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP, sheet->size); -} - -u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet) -{ - s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); - - if (tileStart < 0) - { - return 0; - } - else - { - AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); - RequestSpriteSheetCopy(sheet); - return (u16)tileStart; - } -} - -void FreeAllSpritePalettes(void) -{ - u8 i; - gReservedSpritePaletteCount = 0; - for (i = 0; i < 16; i++) - sSpritePaletteTags[i] = 0xFFFF; -} - -u8 LoadSpritePalette(const struct SpritePalette *palette) -{ - u8 index = IndexOfSpritePaletteTag(palette->tag); - - if (index != 0xFF) - return index; - - index = IndexOfSpritePaletteTag(0xFFFF); - - if (index == 0xFF) - { - return 0xFF; - } - else - { - sSpritePaletteTags[index] = palette->tag; - DoLoadSpritePalette(palette->data, index * 16); - return index; - } -} - -void LoadSpritePalettes(const struct SpritePalette *palettes) -{ - u8 i; - for (i = 0; palettes[i].data != NULL; i++) - if (LoadSpritePalette(&palettes[i]) == 0xFF) - break; -} - -static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) -{ - LoadPalette(src, paletteOffset + 0x100, 32); -} - -u8 AllocSpritePalette(u16 tag) -{ - u8 index = IndexOfSpritePaletteTag(0xFFFF); - if (index == 0xFF) - { - return 0xFF; - } - else - { - sSpritePaletteTags[index] = tag; - return index; - } -} - -u8 IndexOfSpritePaletteTag(u16 tag) -{ - u8 i; - for (i = gReservedSpritePaletteCount; i < 16; i++) - if (sSpritePaletteTags[i] == tag) - return i; - - return 0xFF; -} - -u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum) -{ - return sSpritePaletteTags[paletteNum]; -} - -void FreeSpritePaletteByTag(u16 tag) -{ - u8 index = IndexOfSpritePaletteTag(tag); - if (index != 0xFF) - sSpritePaletteTags[index] = 0xFFFF; -} - -void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables) -{ - sprite->subspriteTables = subspriteTables; - sprite->subspriteTableNum = 0; - sprite->subspriteMode = SUBSPRITES_ON; -} - -bool8 AddSpriteToOamBuffer(struct Sprite *sprite, u8 *oamIndex) -{ - if (*oamIndex >= gOamLimit) - return 1; - - if (!sprite->subspriteTables || sprite->subspriteMode == SUBSPRITES_OFF) - { - gMain.oamBuffer[*oamIndex] = sprite->oam; - (*oamIndex)++; - return 0; - } - else - { - return AddSubspritesToOamBuffer(sprite, &gMain.oamBuffer[*oamIndex], oamIndex); - } -} - -bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex) -{ - const struct SubspriteTable *subspriteTable; - struct OamData *oam; - - if (*oamIndex >= gOamLimit) - return 1; - - subspriteTable = &sprite->subspriteTables[sprite->subspriteTableNum]; - oam = &sprite->oam; - - if (!subspriteTable || !subspriteTable->subsprites) - { - *destOam = *oam; - (*oamIndex)++; - return 0; - } - else - { - u16 tileNum; - u16 baseX; - u16 baseY; - u8 subspriteCount; - u8 hFlip; - u8 vFlip; - u8 i; - - tileNum = oam->tileNum; - subspriteCount = subspriteTable->subspriteCount; - hFlip = ((s32)oam->matrixNum >> 3) & 1; - vFlip = ((s32)oam->matrixNum >> 4) & 1; - baseX = oam->x - sprite->centerToCornerVecX; - baseY = oam->y - sprite->centerToCornerVecY; - - for (i = 0; i < subspriteCount; i++, (*oamIndex)++) - { - u16 x; - u16 y; - - if (*oamIndex >= gOamLimit) - return 1; - - x = subspriteTable->subsprites[i].x; - y = subspriteTable->subsprites[i].y; - - if (hFlip) - { - s8 width = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].width; - s16 right = x; - right += width; - x = right; - x = ~x + 1; - } - - if (vFlip) - { - s8 height = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].height; - s16 bottom = y; - bottom += height; - y = bottom; - y = ~y + 1; - } - - destOam[i] = *oam; - destOam[i].shape = subspriteTable->subsprites[i].shape; - destOam[i].size = subspriteTable->subsprites[i].size; - destOam[i].x = (s16)baseX + (s16)x; - destOam[i].y = baseY + y; - destOam[i].tileNum = tileNum + subspriteTable->subsprites[i].tileOffset; - - if (sprite->subspriteMode != SUBSPRITES_IGNORE_PRIORITY) - destOam[i].priority = subspriteTable->subsprites[i].priority; - } - } - - return 0; -} diff --git a/src/engine/string_util.c b/src/engine/string_util.c deleted file mode 100644 index 7316f533a..000000000 --- a/src/engine/string_util.c +++ /dev/null @@ -1,561 +0,0 @@ -#include "global.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" - -u8 gUnknownStringVar[16]; - -const u8 gEmptyString_81E72B0[] = _(""); -const u8 gRightPointingTriangleString[] = _("▶"); - -static const u8 sDigits[] = __("0123456789ABCDEF"); - -static const s32 sPowersOfTen[] = -{ - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, -}; - -u8 *StringCopy10(u8 *dest, const u8 *src) -{ - u8 i; - u32 limit = 10; - - for (i = 0; i < limit; i++) - { - dest[i] = src[i]; - - if (dest[i] == EOS) - return &dest[i]; - } - - dest[i] = EOS; - return &dest[i]; -} - -u8 *StringGetEnd10(u8 *str) -{ - u8 i; - u32 limit = 10; - - for (i = 0; i < limit; i++) - if (str[i] == EOS) - return &str[i]; - - str[i] = EOS; - return &str[i]; -} - -u8 *StringCopy8(u8 *dest, const u8 *src) -{ - s32 i; - - for (i = 0; i < 8; i++) - { - dest[i] = src[i]; - - if (dest[i] == EOS) - return &dest[i]; - } - - dest[i] = EOS; - return &dest[i]; -} - -u8 *StringCopy(u8 *dest, const u8 *src) -{ - while (*src != EOS) - { - *dest = *src; - dest++; - src++; - } - - *dest = EOS; - return dest; -} - -u8 *StringAppend(u8 *dest, const u8 *src) -{ - while (*dest != EOS) - dest++; - - return StringCopy(dest, src); -} - -u8 *StringCopyN(u8 *dest, const u8 *src, u8 n) -{ - u16 i; - - for (i = 0; i < n; i++) - dest[i] = src[i]; - - return &dest[n]; -} - -u8 *StringAppendN(u8 *dest, const u8 *src, u8 n) -{ - while (*dest != EOS) - dest++; - - return StringCopyN(dest, src, n); -} - -u16 StringLength(const u8 *str) -{ - u16 length = 0; - - while (str[length] != EOS) - { - u16 temp = length; - length++; - if (str[temp] == EXT_CTRL_CODE_BEGIN) - length += GetExtCtrlCodeLength(str[length]); - } - - return length; -} - -#ifdef GERMAN -s32 StringLengthN(const u8 *str, s32 n) -{ - s32 i; - - for (i = 0; i < n && str[i] != EOS; i++) - ; - - if (i == n) - i = 0; - - return i; -} -#endif - -s32 StringCompare(const u8 *str1, const u8 *str2) -{ - while (*str1 == *str2) - { - if (*str1 == EOS) - return 0; - str1++; - str2++; - } - - return *str1 - *str2; -} - -s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n) -{ - while (*str1 == *str2) - { - if (*str1 == EOS) - return 0; - str1++; - str2++; - if (--n == 0) - return 0; - } - - return *str1 - *str2; -} - -u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) -{ - enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; - s32 powerOfTen; - s32 largestPowerOfTen = sPowersOfTen[n - 1]; - - state = WAITING_FOR_NONZERO_DIGIT; - - if (mode == STR_CONV_MODE_RIGHT_ALIGN) - state = WRITING_SPACES; - - if (mode == STR_CONV_MODE_LEADING_ZEROS) - state = WRITING_DIGITS; - - for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) - { - char *out; - u8 c; - u16 digit = value / powerOfTen; - s32 temp = value - (powerOfTen * digit); - - if (state == WRITING_DIGITS) - { - out = dest++; - - if (digit <= 9) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (digit != 0 || powerOfTen == 1) - { - state = WRITING_DIGITS; - out = dest++; - - if (digit <= 9) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (state == WRITING_SPACES) - { - *dest++ = CHAR_SPACE; - } - - value = temp; - } - - *dest = EOS; - return dest; -} - -u8 *ConvertIntToDecimalStringN_DigitWidth6(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) -{ - enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; - s32 powerOfTen; - s32 largestPowerOfTen = sPowersOfTen[n - 1]; - - *dest++ = EXT_CTRL_CODE_BEGIN; - *dest++ = 0x14; - *dest++ = 6; - - state = WAITING_FOR_NONZERO_DIGIT; - - if (mode == STR_CONV_MODE_RIGHT_ALIGN) - state = WRITING_SPACES; - - if (mode == STR_CONV_MODE_LEADING_ZEROS) - state = WRITING_DIGITS; - - for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) - { - char *out; - u8 c; - u16 digit = value / powerOfTen; - s32 temp = value - (powerOfTen * digit); - - if (state == WRITING_DIGITS) - { - out = dest++; - - if (digit <= 9) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (digit != 0 || powerOfTen == 1) - { - state = WRITING_DIGITS; - out = dest++; - - if (digit <= 9) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (state == WRITING_SPACES) - { - *dest++ = CHAR_SPACE; - } - - value = temp; - } - - *dest++ = EXT_CTRL_CODE_BEGIN; - *dest++ = 0x14; - *dest++ = 0x00; - - *dest = EOS; - return dest; -} - -u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) -{ - enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; - u8 i; - s32 powerOfSixteen; - s32 largestPowerOfSixteen = 1; - - for (i = 1; i < n; i++) - largestPowerOfSixteen *= 16; - - state = WAITING_FOR_NONZERO_DIGIT; - - if (mode == STR_CONV_MODE_RIGHT_ALIGN) - state = WRITING_SPACES; - - if (mode == STR_CONV_MODE_LEADING_ZEROS) - state = WRITING_DIGITS; - - for (powerOfSixteen = largestPowerOfSixteen; powerOfSixteen > 0; powerOfSixteen /= 16) - { - char *out; - u8 c; - u32 digit = value / powerOfSixteen; - s32 temp = value % powerOfSixteen; - - if (state == WRITING_DIGITS) - { - out = dest++; - - if (digit <= 0xF) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (digit != 0 || powerOfSixteen == 1) - { - state = WRITING_DIGITS; - out = dest++; - - if (digit <= 0xF) - c = sDigits[digit]; - else - c = CHAR_QUESTION_MARK; - - *out = c; - } - else if (state == WRITING_SPACES) - { - *dest++ = CHAR_SPACE; - } - - value = temp; - } - - *dest = EOS; - return dest; -} - -u8 *ConvertIntToDecimalString(u8 *dest, s32 value) -{ - char temp[12]; - s32 length = 0; - - do - { - temp[length++] = sDigits[value % 10]; - value /= 10; - } while (value != 0); - - length--; - - while (length != -1) - { - *dest++ = temp[length]; - length--; - } - - *dest = EOS; - return dest; -} - -u8 *StringExpandPlaceholders(u8 *dest, const u8 *src) -{ - for (;;) - { - u8 c = *src++; - u8 placeholderId; - const u8 *expandedString; - u8 length; - - switch (c) - { - case PLACEHOLDER_BEGIN: - placeholderId = *src++; - expandedString = GetExpandedPlaceholder(placeholderId); - dest = StringExpandPlaceholders(dest, expandedString); - break; - case EXT_CTRL_CODE_BEGIN: - *dest++ = c; - length = GetExtCtrlCodeLength(*src); - memcpy(dest, src, length); - dest += length; - src += length; - break; - case EOS: - *dest = EOS; - return dest; - case 0xFA: - case 0xFB: - case 0xFE: - default: - *dest++ = c; - } - } -} - -u8 *StringBraille(u8 *dest, const u8 *src) -{ - u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF }; - u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF }; - - dest = StringCopy(dest, setBrailleFont); - - for (;;) - { - u8 c = *src++; - - switch (c) - { - case EOS: - *dest = c; - return dest; - case 0xFE: - dest = StringCopy(dest, gotoLine2); - break; - default: - *dest++ = c; - *dest++ = c + 0x40; - break; - } - } -} - -static const u8 *ExpandPlaceholder_UnknownStringVar(void) -{ - return gUnknownStringVar; -} - -static const u8 *ExpandPlaceholder_PlayerName(void) -{ - return gSaveBlock2.playerName; -} - -static const u8 *ExpandPlaceholder_StringVar1(void) -{ - return gStringVar1; -} - -static const u8 *ExpandPlaceholder_StringVar2(void) -{ - return gStringVar2; -} - -static const u8 *ExpandPlaceholder_StringVar3(void) -{ - return gStringVar3; -} - -static const u8 *ExpandPlaceholder_KunChan(void) -{ - if (gSaveBlock2.playerGender == MALE) - return gExpandedPlaceholder_Kun; - else - return gExpandedPlaceholder_Chan; -} - -static const u8 *ExpandPlaceholder_RivalName(void) -{ - if (gSaveBlock2.playerGender == MALE) - return gExpandedPlaceholder_May; - else - return gExpandedPlaceholder_Brendan; -} - -#define VERSION_DEPENDENT_PLACEHOLDER_LIST \ - X(Version, Ruby, Sapphire) \ - X(EvilTeam, Magma, Aqua) \ - X(GoodTeam, Aqua, Magma) \ - X(EvilLeader, Maxie, Archie) \ - X(GoodLeader, Archie, Maxie) \ - X(EvilLegendary, Groudon, Kyogre) \ - X(GoodLegendary, Kyogre, Groudon) - -#ifdef SAPPHIRE -#define X(ph, r, s) \ -static const u8 *ExpandPlaceholder_##ph(void) { return gExpandedPlaceholder_##s; } -VERSION_DEPENDENT_PLACEHOLDER_LIST -#else -#define X(ph, r, s) \ -static const u8 *ExpandPlaceholder_##ph(void) { return gExpandedPlaceholder_##r; } -VERSION_DEPENDENT_PLACEHOLDER_LIST -#endif - -#undef X - -const u8 *GetExpandedPlaceholder(u32 id) -{ - typedef const u8 *(*ExpandPlaceholderFunc)(void); - - static const ExpandPlaceholderFunc funcs[] = - { - ExpandPlaceholder_UnknownStringVar, - ExpandPlaceholder_PlayerName, - ExpandPlaceholder_StringVar1, - ExpandPlaceholder_StringVar2, - ExpandPlaceholder_StringVar3, - ExpandPlaceholder_KunChan, - ExpandPlaceholder_RivalName, - ExpandPlaceholder_Version, - ExpandPlaceholder_EvilTeam, - ExpandPlaceholder_GoodTeam, - ExpandPlaceholder_EvilLeader, - ExpandPlaceholder_GoodLeader, - ExpandPlaceholder_EvilLegendary, - ExpandPlaceholder_GoodLegendary, - }; - - if (id >= ARRAY_COUNT(funcs)) - return gExpandedPlaceholder_Empty; - else - return funcs[id](); -} - -u8 *StringFill(u8 *dest, u8 c, u16 n) -{ - u16 i; - - for (i = 0; i < n; i++) - *dest++ = c; - - *dest = EOS; - return dest; -} - -u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n) -{ - while (*src != EOS) - { - *dest++ = *src++; - - if (n) - n--; - } - - n--; - - while (n != (u16)-1) - { - *dest++ = c; - n--; - } - - *dest = EOS; - return dest; -} - -u8 *StringFillWithTerminator(u8 *dest, u16 n) -{ - return StringFill(dest, EOS, n); -} diff --git a/src/engine/task.c b/src/engine/task.c deleted file mode 100644 index 3e8a5588c..000000000 --- a/src/engine/task.c +++ /dev/null @@ -1,215 +0,0 @@ -#include "global.h" -#include "debug.h" -#include "task.h" - -#define ACTIVE_SENTINEL 0x10 -#define HEAD_SENTINEL 0xFE -#define TAIL_SENTINEL 0xFF - -// gTasks is a queue of the active 16 tasks -struct Task gTasks[ACTIVE_SENTINEL]; - -static void InsertTask(u8 newTaskId); -static u8 FindFirstActiveTask(); - -const u8 gError_NoTasksLeft[] = _( - "TASK OVER\n" - "タスクがオーバーしました"); - -void ResetTasks() -{ - u8 taskId; - - for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) - { - gTasks[taskId].isActive = FALSE; - gTasks[taskId].func = TaskDummy; - gTasks[taskId].prev = taskId; - gTasks[taskId].next = taskId + 1; - gTasks[taskId].priority = -1; - memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data)); - } - - gTasks[0].prev = HEAD_SENTINEL; - gTasks[ACTIVE_SENTINEL - 1].next = TAIL_SENTINEL; -} - -u8 CreateTask(TaskFunc func, u8 priority) -{ - u8 taskId; - - for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) - { - if (!gTasks[taskId].isActive) - { - gTasks[taskId].func = func; - gTasks[taskId].priority = priority; - InsertTask(taskId); - memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data)); - gTasks[taskId].isActive = TRUE; - return taskId; - } - } - -#if DEBUG - Crash(gError_NoTasksLeft); -#endif - - return 0; -} - -static void InsertTask(u8 newTaskId) -{ - u8 taskId = FindFirstActiveTask(); - - if (taskId == ACTIVE_SENTINEL) - { - // The task system inserts from the top downwards starting from the end (0xFF) to 0. If FindFirstActiveTask returned the value equivalent to ACTIVE_SENTINEL, it means it is the only task because it searched the entire queue. - gTasks[newTaskId].prev = HEAD_SENTINEL; - gTasks[newTaskId].next = TAIL_SENTINEL; - return; - } - - while (1) - { - if (gTasks[newTaskId].priority < gTasks[taskId].priority) - { - // We've found a task with a higher priority value, - // so we insert the new task before it. - gTasks[newTaskId].prev = gTasks[taskId].prev; - gTasks[newTaskId].next = taskId; - - if (gTasks[taskId].prev != HEAD_SENTINEL) - gTasks[gTasks[taskId].prev].next = newTaskId; // as long as we are not at the end, insert the newTask appropriately. - - gTasks[taskId].prev = newTaskId; - return; - } - if (gTasks[taskId].next == TAIL_SENTINEL) // we did not find a space for the task, so overwrite the last task as it is the lowest priority. - { - // We've reached the end. - gTasks[newTaskId].prev = taskId; - gTasks[newTaskId].next = gTasks[taskId].next; - gTasks[taskId].next = newTaskId; - return; - } - taskId = gTasks[taskId].next; // neither the priority was lower, nor the end. check the next task. - } -} - -void DestroyTask(u8 taskId) -{ - if (gTasks[taskId].isActive) - { - gTasks[taskId].isActive = FALSE; - - if (gTasks[taskId].prev == HEAD_SENTINEL) - { - if (gTasks[taskId].next != TAIL_SENTINEL) - gTasks[gTasks[taskId].next].prev = HEAD_SENTINEL; - } - else - { - if (gTasks[taskId].next == TAIL_SENTINEL) - { - gTasks[gTasks[taskId].prev].next = TAIL_SENTINEL; - } - else - { - gTasks[gTasks[taskId].prev].next = gTasks[taskId].next; - gTasks[gTasks[taskId].next].prev = gTasks[taskId].prev; - } - } - } -} - -void RunTasks(void) -{ - u8 taskId = FindFirstActiveTask(); - - if (taskId != ACTIVE_SENTINEL) - { - do - { - gTasks[taskId].func(taskId); - taskId = gTasks[taskId].next; - } while (taskId != TAIL_SENTINEL); - } -} - -static u8 FindFirstActiveTask(void) -{ - u8 taskId; - - for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) - if (gTasks[taskId].isActive == TRUE && gTasks[taskId].prev == HEAD_SENTINEL) - break; - - return taskId; -} - -void TaskDummy(u8 taskId) -{ -} - -#define TASK_DATA_OP(taskId, offset, op) \ -{ \ - u32 tasksAddr = (u32)gTasks; \ - u32 addr = taskId * sizeof(struct Task) + offset; \ - u32 dataAddr = tasksAddr + offsetof(struct Task, data); \ - addr += dataAddr; \ - op; \ -} - -void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc) -{ - TASK_DATA_OP(taskId, 28, *((u16 *)addr) = (u32)followupFunc) - TASK_DATA_OP(taskId, 30, *((u16 *)addr) = (u32)followupFunc >> 16) - gTasks[taskId].func = func; -} - -void SwitchTaskToFollowupFunc(u8 taskId) -{ - s32 func; - - gTasks[taskId].func = NULL; - - TASK_DATA_OP(taskId, 28, func = *((u16 *)addr)) - TASK_DATA_OP(taskId, 30, func |= *((s16 *)addr) << 16) - - gTasks[taskId].func = (TaskFunc)func; -} - -bool8 FuncIsActiveTask(TaskFunc func) -{ - u8 i; - - for (i = 0; i < ACTIVE_SENTINEL; i++) - if (gTasks[i].isActive == TRUE && gTasks[i].func == func) - return TRUE; - - return FALSE; -} - -u8 FindTaskIdByFunc(TaskFunc func) -{ - s32 i; - - for (i = 0; i < ACTIVE_SENTINEL; i++) - if (gTasks[i].isActive == TRUE && gTasks[i].func == func) - return (u8)i; - - return -1; -} - -u8 GetTaskCount(void) -{ - u8 i; - u8 count = 0; - - for (i = 0; i < ACTIVE_SENTINEL; i++) - if (gTasks[i].isActive == TRUE) - count++; - - return count; -} diff --git a/src/engine/text.c b/src/engine/text.c deleted file mode 100644 index fe18a6d79..000000000 --- a/src/engine/text.c +++ /dev/null @@ -1,4385 +0,0 @@ -#include "global.h" -#include "text.h" -#include "battle.h" -#include "main.h" -#include "palette.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" - -enum -{ - WIN_STATE_END, - WIN_STATE_BEGIN, - WIN_STATE_NORMAL, - WIN_STATE_CHAR_DELAY, - WIN_STATE_PAUSE, - WIN_STATE_WAIT_BUTTON, - WIN_STATE_NEWLINE, - WIN_STATE_PLACEHOLDER, - WIN_STATE_WAIT_CLEAR, - WIN_STATE_WAIT_SCROLL, - WIN_STATE_WAIT_SOUND, -}; - -enum -{ - TEXT_MODE_UNKNOWN0, - TEXT_MODE_MONOSPACE, - TEXT_MODE_UNKNOWN2, // variable width? -}; - -enum -{ - WAIT_TYPE_NORMAL, // allows the player to interrupt the text delay with A or B - WAIT_TYPE_BATTLE, // disables interrupting the text delay if in a link battle - WAIT_TYPE_AUTOSCROLL, // disables interrupting the text delay - WAIT_TYPE_CONTEST, // disables interrupting the text delay if in a link contest -}; - -struct Font -{ - u32 type; - u8 *glyphs; - u16 glyphSize; - u16 lowerTileOffset; -}; - -struct GlyphBuffer -{ - // 0-7 left tile - // 8-15 right tile (if it exists) - u32 pixelRows[16]; - - // pixel row filled with BG color - u32 background; - - // table of color indices (not a palette) - u32 colors[16]; -}; - -struct GlyphTileInfo -{ - u8 textMode; - u8 startPixel; - u8 width; - u8 *src; - u32 *dest; - u32 *colors; -}; - -struct ShiftAmount -{ - u32 left; - u32 right; -}; - -static u16 InitVariableWidthFontTileData(struct Window *, u16); -static u16 LoadFixedWidthFont(struct Window *, u16); -static u16 LoadFixedWidthFont_Font1Latin(struct Window *, u16); -static u16 LoadFixedWidthFont_Font4Latin(struct Window *, u16); -static u16 LoadFixedWidthFont_Braille(struct Window *, u16); -static void MultistepLoadFont_LoadGlyph(struct Window *, u16, u8); -static u8 sub_8002FA0(struct Window *, const u8 *); -static u8 PrintNextChar(struct Window *); -static u8 HandleExtCtrlCode(struct Window *); -static u8 UpdateWindowText(struct Window *); -static u8 DrawGlyph_TextMode0(struct Window *, u32); -static void DrawGlyph_TextMode2(struct Window *, u32); -static void LoadFixedWidthGlyph(struct Window *, u32, u8 *); -static void WriteGlyphTilemap(struct Window *, u16, u16); -static void GetGlyphTilePointers(u8, u8, u16, u8 **, u8 **); -static u16 *GetCursorTilemapPointer(struct Window *); -static void ApplyColors_UnshadowedFont(const u8 *, u32 *, u8, u8); -static void ApplyColors_ShadowedFont(const void *, void *, u8, u8, u8); -static void SetCursorX(struct Window *, u8); -static void AddToCursorX(struct Window *, u8); -static void AddToCursorY(struct Window *, u8); -static void ClipLeft(struct Window *); -static void ClipRight(struct Window *); -static void SetWindowDefaultColors(struct Window *); -static void SetWindowBackgroundColor(struct Window *, u8); -static void SetWindowShadowColor(struct Window *, u8); -static void SetWindowForegroundColor(struct Window *, u8); -static u8 GetTextDelay(struct Window *); -static bool8 PlayerCanInterruptDelay(struct Window *); -static void ScrollWindowTextLines(struct Window *); -static void ScrollWindowTextLines_TextMode0(struct Window *); -static void DoScroll_TextMode0(struct Window *, u16); -static void ScrollWindowTextLines_TextModeMonospace(struct Window *); -static void DoScroll_TextModeMonospace(struct Window *, u16); -static void ScrollWindowTextLines_TextMode2(struct Window *); -static void DoScroll_TextMode2(struct Window *, u8); -void Text_ClearWindow(struct Window *); -static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *, u8); -static void ClearWindowTextLines_TextMode2(struct Window *, u8); -static void TryEraseDownArrow(struct Window *); -static u16 GetBlankTileNum(struct Window *); -static u8 WaitWithDownArrow(struct Window *); -static void DrawInitialDownArrow(struct Window *); -static void UpdateDownArrowAnimation(struct Window *); -static u16 GetCursorTileNum(struct Window *, u32, u32); -static s32 DrawGlyphTiles(struct Window *, u32, u32); -static void UpdateTilemap(struct Window *, u32); -static u8 GetGlyphWidth(struct Window *, u32); -static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *); - -static void PrintGlyph_TextMode0(struct Window *, u32); -static void PrintGlyph_TextMode1(struct Window *, u32); -static void PrintGlyph_TextMode2(struct Window *, u32); - -static void WriteGlyphTilemap_Font0_Font3(struct Window *, u32); -static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); -static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); -static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); -static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); -static void WriteGlyphTilemap_Font6(struct Window *, u32); - -static u8 ExtCtrlCode_Nop(struct Window *); -static u8 ExtCtrlCode_ForegroundColor(struct Window *); -static u8 ExtCtrlCode_BackgroundColor(struct Window *); -static u8 ExtCtrlCode_ShadowColor(struct Window *); -static u8 ExtCtrlCode_AllColors(struct Window *); -static u8 ExtCtrlCode_Palette(struct Window *); -static u8 ExtCtrlCode_Font(struct Window *); -static u8 ExtCtrlCode_DefaultFont(struct Window *); -static u8 ExtCtrlCode_Pause(struct Window *); -static u8 ExtCtrlCode_WaitButton(struct Window *); -static u8 ExtCtrlCode_WaitSound(struct Window *); -static u8 ExtCtrlCode_PlayBGM(struct Window *); -static u8 ExtCtrlCode_Escape(struct Window *); -static u8 ExtCtrlCode_Nop2(struct Window *); -static u8 ExtCtrlCode_SetCursorY(struct Window *); -static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *); -static u8 ExtCtrlCode_PlaySE(struct Window *); -static u8 ExtCtrlCode_Skip(struct Window *); -static u8 ExtCtrlCode_SetCursorX(struct Window *); -static u8 ExtCtrlCode_SkipTo(struct Window *); -static u8 ExtCtrlCode_Spacing(struct Window *); -static u8 ExtCtrlCode_Japanese(struct Window *); -static u8 ExtCtrlCode_Latin(struct Window *); - -static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *, u8 *, u32 *, u8); -static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *, u8 *, u32 *, u8); - -static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *, u32 *, u32 *, u8); -static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *, u32 *, u32 *, u8); - -static struct Window *sMultistepLoadFont_Window; -static u16 sMultistepLoadFont_StartOffset; -static u16 sMultistepLoadFont_Index; -static struct Window sTempWindow; -static u8 sWaitType; -static u8 sLineLength; -static struct GlyphBuffer sGlyphBuffer; - -EWRAM_DATA u16 gBGTilemapBuffers[4][0x400] = {0}; - -EWRAM_DATA u8 gStringVar1[0x100] = {0}; -EWRAM_DATA u8 gStringVar2[0x100] = {0}; -EWRAM_DATA u8 gStringVar3[0x100] = {0}; -EWRAM_DATA u8 gStringVar4[0x100] = {0}; - -extern u16 gBattleTypeFlags; -extern u8 gIsLinkContest; -extern u8 gTileBuffer[]; - -vu16 *const gBGControlRegs[] = -{ - ®_BG0CNT, - ®_BG1CNT, - ®_BG2CNT, - ®_BG3CNT, -}; - -vu16 *const gBGHOffsetRegs[] = -{ - ®_BG0HOFS, - ®_BG1HOFS, - ®_BG2HOFS, - ®_BG3HOFS, -}; - -vu16 *const gBGVOffsetRegs[] = -{ - ®_BG0VOFS, - ®_BG1VOFS, - ®_BG2VOFS, - ®_BG3VOFS, -}; - -const u16 gUnknown_081E29D8[] = { 0x100, 0x200, 0x400, 0x800 }; -const u16 gUnknown_081E29E0[] = { 0x100, 0x200, 0x400, 0x800 }; -const u16 gUnknown_081E29E8[] = { 1, 2, 4, 8 }; - -static const u8 sFont0LatinGlyphs[] = INCBIN_U8("graphics/fonts/font0_lat.1bpp"); -static const u8 sFont1LatinGlyphs[] = INCBIN_U8("graphics/fonts/font1_lat.1bpp"); -static const u8 sFont0JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font0_jpn.1bpp"); -static const u8 sFont1JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font1_jpn.1bpp"); -static const u8 sBrailleGlyphs[] = INCBIN_U8("graphics/fonts/font6_braille.1bpp"); -static const u32 sDownArrowTiles[] = INCBIN_U32("graphics/fonts/down_arrow.4bpp"); - -// clang-format off -#include "../data/text/type1_map.h" -#include "../data/text/type3_map.h" -#include "../data/text/font1_widths.h" -#include "../data/text/font4_widths.h" -#include "../data/text/font0_widths.h" -#include "../data/text/font3_widths.h" -// clang-format on - -const u16 gUnknownPalette_81E6692[] = INCBIN_U16("graphics/fonts/unknown_81E6692.gbapal"); -const u16 gFontDefaultPalette[] = INCBIN_U16("graphics/fonts/default.gbapal"); - -const u8 sBlankTile[8] = { 0, 0, 0, 0, 0, 0, 0, 0, }; - -static const u32 sGlyphMasks[9][8][3] = -{ - { - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFFFF0, }, - { 0x0000000F,0xFFFFFFFF,0xFFFFFF00, }, - { 0x000000FF,0xFFFFFFFF,0xFFFFF000, }, - { 0x00000FFF,0xFFFFFFFF,0xFFFF0000, }, - { 0x0000FFFF,0xFFFFFFFF,0xFFF00000, }, - { 0x000FFFFF,0xFFFFFFFF,0xFF000000, }, - { 0x00FFFFFF,0xFFFFFFFF,0xF0000000, }, - { 0x0FFFFFFF,0xFFFFFFFF,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFFF00, }, - { 0x0000000F,0xFFFFFFFF,0xFFFFF000, }, - { 0x000000FF,0xFFFFFFFF,0xFFFF0000, }, - { 0x00000FFF,0xFFFFFFFF,0xFFF00000, }, - { 0x0000FFFF,0xFFFFFFFF,0xFF000000, }, - { 0x000FFFFF,0xFFFFFFFF,0xF0000000, }, - { 0x00FFFFFF,0xFFFFFFFF,0x00000000, }, - { 0x0FFFFFFF,0xFFFFFFF0,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFFF000, }, - { 0x0000000F,0xFFFFFFFF,0xFFFF0000, }, - { 0x000000FF,0xFFFFFFFF,0xFFF00000, }, - { 0x00000FFF,0xFFFFFFFF,0xFF000000, }, - { 0x0000FFFF,0xFFFFFFFF,0xF0000000, }, - { 0x000FFFFF,0xFFFFFFFF,0x00000000, }, - { 0x00FFFFFF,0xFFFFFFF0,0x00000000, }, - { 0x0FFFFFFF,0xFFFFFF00,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFFF0000, }, - { 0x0000000F,0xFFFFFFFF,0xFFF00000, }, - { 0x000000FF,0xFFFFFFFF,0xFF000000, }, - { 0x00000FFF,0xFFFFFFFF,0xF0000000, }, - { 0x0000FFFF,0xFFFFFFFF,0x00000000, }, - { 0x000FFFFF,0xFFFFFFF0,0x00000000, }, - { 0x00FFFFFF,0xFFFFFF00,0x00000000, }, - { 0x0FFFFFFF,0xFFFFF000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFFF00000, }, - { 0x0000000F,0xFFFFFFFF,0xFF000000, }, - { 0x000000FF,0xFFFFFFFF,0xF0000000, }, - { 0x00000FFF,0xFFFFFFFF,0x00000000, }, - { 0x0000FFFF,0xFFFFFFF0,0x00000000, }, - { 0x000FFFFF,0xFFFFFF00,0x00000000, }, - { 0x00FFFFFF,0xFFFFF000,0x00000000, }, - { 0x0FFFFFFF,0xFFFF0000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xFF000000, }, - { 0x0000000F,0xFFFFFFFF,0xF0000000, }, - { 0x000000FF,0xFFFFFFFF,0x00000000, }, - { 0x00000FFF,0xFFFFFFF0,0x00000000, }, - { 0x0000FFFF,0xFFFFFF00,0x00000000, }, - { 0x000FFFFF,0xFFFFF000,0x00000000, }, - { 0x00FFFFFF,0xFFFF0000,0x00000000, }, - { 0x0FFFFFFF,0xFFF00000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0xF0000000, }, - { 0x0000000F,0xFFFFFFFF,0x00000000, }, - { 0x000000FF,0xFFFFFFF0,0x00000000, }, - { 0x00000FFF,0xFFFFFF00,0x00000000, }, - { 0x0000FFFF,0xFFFFF000,0x00000000, }, - { 0x000FFFFF,0xFFFF0000,0x00000000, }, - { 0x00FFFFFF,0xFFF00000,0x00000000, }, - { 0x0FFFFFFF,0xFF000000,0x00000000, }, - }, - { - { 0x00000000,0xFFFFFFFF,0x00000000, }, - { 0x0000000F,0xFFFFFFF0,0x00000000, }, - { 0x000000FF,0xFFFFFF00,0x00000000, }, - { 0x00000FFF,0xFFFFF000,0x00000000, }, - { 0x0000FFFF,0xFFFF0000,0x00000000, }, - { 0x000FFFFF,0xFFF00000,0x00000000, }, - { 0x00FFFFFF,0xFF000000,0x00000000, }, - { 0x0FFFFFFF,0xF0000000,0x00000000, }, - }, -}; - -static const struct ShiftAmount sGlyphShiftAmounts[8] = -{ - { 0, 32 }, - { 4, 28 }, - { 8, 24 }, - { 12, 20 }, - { 16, 16 }, - { 20, 12 }, - { 24, 8 }, - { 28, 4 }, -}; - -typedef void (*PrintGlyphFunc)(struct Window *, u32); - -static const PrintGlyphFunc sPrintGlyphFuncs[] = -{ - PrintGlyph_TextMode0, - PrintGlyph_TextMode1, - PrintGlyph_TextMode2, -}; - -typedef void (*WriteGlyphTilemapFunc)(struct Window *, u32); - -static const WriteGlyphTilemapFunc sWriteGlyphTilemapFuncs[] = -{ - WriteGlyphTilemap_Font0_Font3, - WriteGlyphTilemap_Font1_Font4, - WriteGlyphTilemap_Font2_Font5, - WriteGlyphTilemap_Font0_Font3, - WriteGlyphTilemap_Font1_Font4, - WriteGlyphTilemap_Font2_Font5, - WriteGlyphTilemap_Font6, -}; - -static const struct Window sDefaultWindow = { .language = GAME_LANGUAGE }; - -typedef u8 (*ExtCtrlCodeFunc)(struct Window *); - -static const ExtCtrlCodeFunc sExtCtrlCodeFuncs[] = -{ - ExtCtrlCode_Nop, - ExtCtrlCode_ForegroundColor, - ExtCtrlCode_BackgroundColor, - ExtCtrlCode_ShadowColor, - ExtCtrlCode_AllColors, - ExtCtrlCode_Palette, - ExtCtrlCode_Font, - ExtCtrlCode_DefaultFont, - ExtCtrlCode_Pause, - ExtCtrlCode_WaitButton, - ExtCtrlCode_WaitSound, - ExtCtrlCode_PlayBGM, - ExtCtrlCode_Escape, - ExtCtrlCode_Nop2, - ExtCtrlCode_SetCursorY, - ExtCtrlCode_ClearWindowTextLines, - ExtCtrlCode_PlaySE, - ExtCtrlCode_Skip, - ExtCtrlCode_SetCursorX, - ExtCtrlCode_SkipTo, - ExtCtrlCode_Spacing, - ExtCtrlCode_Japanese, - ExtCtrlCode_Latin, -}; - -extern const u32 gFont3LatinGlyphs[]; -extern const u32 gFont4LatinGlyphs[]; -extern const u32 gFont3JapaneseGlyphs[]; -extern const u32 gFont4JapaneseGlyphs[]; - -// Getting rid of the u8 recasting will make the ROM no longer match due to -// a const being required to pass the elements directly to the rodata structs. -static const struct Font sFonts[] = -{ - // Japanese fonts - { 0, (u8 *)sFont0JapaneseGlyphs, 16, 8 }, - { 1, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, - { 2, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, - { 4, (u8 *)gFont3JapaneseGlyphs, 64, 512 }, - { 1, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, - { 2, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, - { 3, (u8 *)sBrailleGlyphs, 8, 0 }, - // Latin - { 0, (u8 *)sFont0LatinGlyphs, 16, 8 }, - { 1, (u8 *)sFont1LatinGlyphs, 8, 0 }, - { 2, (u8 *)sFont1LatinGlyphs, 8, 0 }, - { 0, (u8 *)gFont3LatinGlyphs, 64, 32 }, - { 1, (u8 *)gFont4LatinGlyphs, 32, 0 }, - { 2, (u8 *)gFont4LatinGlyphs, 32, 0 }, - { 3, (u8 *)sBrailleGlyphs, 8, 0 }, -}; - -static const u8 sTextSpeedDelays[] = { 6, 3, 1 }; // slow, mid, fast - -static const u8 sExtCtrlCodeLengths[] = -{ - 1, - 2, - 2, - 2, - 4, - 2, - 2, - 1, - 2, - 1, - 1, - 3, - 2, - 2, - 2, - 1, - 3, - 2, - 2, - 2, - 2, - 1, - 1, -}; - -typedef void (*ShiftGlyphTileUnshadowedFunc)(struct GlyphBuffer *, u8 *, u32 *, u8); - -static const ShiftGlyphTileUnshadowedFunc sShiftGlyphTileUnshadowedFuncs[] = -{ - ShiftGlyphTile_UnshadowedFont_Width0, - ShiftGlyphTile_UnshadowedFont_Width1, - ShiftGlyphTile_UnshadowedFont_Width2, - ShiftGlyphTile_UnshadowedFont_Width3, - ShiftGlyphTile_UnshadowedFont_Width4, - ShiftGlyphTile_UnshadowedFont_Width5, - ShiftGlyphTile_UnshadowedFont_Width6, - ShiftGlyphTile_UnshadowedFont_Width7, - ShiftGlyphTile_UnshadowedFont_Width8, -}; - -typedef void (*ShiftGlyphTileShadowedFunc)(struct GlyphBuffer *, u32 *, u32 *, u8); - -static const ShiftGlyphTileShadowedFunc sShiftGlyphTileShadowedFuncs[] = -{ - ShiftGlyphTile_ShadowedFont_Width0, - ShiftGlyphTile_ShadowedFont_Width1, - ShiftGlyphTile_ShadowedFont_Width2, - ShiftGlyphTile_ShadowedFont_Width3, - ShiftGlyphTile_ShadowedFont_Width4, - ShiftGlyphTile_ShadowedFont_Width5, - ShiftGlyphTile_ShadowedFont_Width6, - ShiftGlyphTile_ShadowedFont_Width7, - ShiftGlyphTile_ShadowedFont_Width8, -}; - -const struct WindowTemplate gWindowTemplate_81E6C3C = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 0, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6C58 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 26, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6C74 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 0, // background color - 3, // shadow color - 4, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - OBJ_VRAM0, // tile data - NULL, // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6C90 = -{ - 0, // BG number - 1, // BG character base block - 30, // BG screen base block - 2, // BG priority - 31, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(1), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6CAC = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 8, // width - 60, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6CC8 = -{ - 2, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6CE4 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6D00 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 2, // foreground color - 15, // background color - 3, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6D1C = -{ - 1, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 2, // foreground color - 15, // background color - 3, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6D38 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 8, // width - 64, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6D54 = -{ - 3, // BG number - 3, // BG character base block - 15, // BG screen base block - 3, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(3), // tile data - BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6D70 = -{ - 3, // BG number - 3, // BG character base block - 15, // BG screen base block - 3, // BG priority - 3, // palette number - 1, // foreground color - 3, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(3), // tile data - BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6D8C = -{ - 1, // BG number - 0, // BG character base block - 14, // BG screen base block - 1, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6DA8 = -{ - 0, // BG number - 0, // BG character base block - 12, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(11), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_TrainerCard_Back_Values = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_TrainerCard_Back_Labels = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 14, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6DFC = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6E18 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6E34 = -{ - 1, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6E50 = -{ - 0, // BG number - 2, // BG character base block - 28, // BG screen base block - 0, // BG priority - 13, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6E6C = -{ - 0, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 13, // palette number - 15, // foreground color - 0, // background color - 10, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6E88 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6EA4 = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 1, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6EC0 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 1, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6EDC = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6EF8 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 2, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6F14 = -{ - 1, // BG number - 0, // BG character base block - 28, // BG screen base block - 1, // BG priority - 3, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6F30 = -{ - 2, // BG number - 2, // BG character base block - 29, // BG screen base block - 2, // BG priority - 3, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 8, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(29), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6F4C = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6F68 = -{ - 0, // BG number - 2, // BG character base block - 13, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(13), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6F84 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 1, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6FA0 = -{ - 1, // BG number - 0, // BG character base block - 24, // BG screen base block - 3, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6FBC = -{ - 0, // BG number - 0, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6FD8 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E6FF4 = -{ - 0, // BG number - 0, // BG character base block - 24, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(24), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7010 = -{ - 0, // BG number - 0, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E702C = -{ - 3, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7048 = -{ - 2, // BG number - 2, // BG character base block - 14, // BG screen base block - 2, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 16, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7064 = -{ - 2, // BG number - 2, // BG character base block - 14, // BG screen base block - 2, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(14), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7080 = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 11, // palette number - 1, // foreground color - 15, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E709C = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E70B8 = -{ - 2, // BG number - 0, // BG character base block - 30, // BG screen base block - 2, // BG priority - 11, // palette number - 1, // foreground color - 0, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E70D4 = -{ - 3, // BG number - 0, // BG character base block - 30, // BG screen base block - 3, // BG priority - 11, // palette number - 1, // foreground color - 15, // background color - 5, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E70F0 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 1, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 32, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E710C = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 1, // BG priority - 15, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7128 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7144 = -{ - 0, // BG number - 2, // BG character base block - 31, // BG screen base block - 0, // BG priority - 13, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7160 = -{ - 1, // BG number - 1, // BG character base block - 10, // BG screen base block - 1, // BG priority - 14, // palette number - 1, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(1), // tile data - BG_SCREEN_ADDR(10), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E717C = -{ - 0, // BG number - 3, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(3), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7198 = -{ - 0, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 15, // foreground color - 0, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E71B4 = -{ - 0, // BG number - 2, // BG character base block - 15, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(15), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E71D0 = -{ - 1, // BG number - 1, // BG character base block - 28, // BG screen base block - 0, // BG priority - 5, // palette number - 13, // foreground color - 14, // background color - 15, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(1), // tile data - BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E71EC = -{ - 2, // BG number - 1, // BG character base block - 30, // BG screen base block - 0, // BG priority - 5, // palette number - 13, // foreground color - 14, // background color - 15, // shadow color - 3, // font - 0, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(1), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7208 = -{ - 0, // BG number - 2, // BG character base block - 28, // BG screen base block - 0, // BG priority - 8, // palette number - 1, // foreground color - 0, // background color - 2, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(28), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7224 = -{ - 0, // BG number - 0, // BG character base block - 31, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(0), // tile data - BG_SCREEN_ADDR(31), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7240 = -{ - 1, // BG number - 2, // BG character base block - 30, // BG screen base block - 0, // BG priority - 15, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - BG_CHAR_ADDR(2), // tile data - BG_SCREEN_ADDR(30), // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E725C = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 15, // foreground color - 0, // background color - 14, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 30, // width - 20, // height - OBJ_VRAM0, // tile data - NULL, // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7278 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 3, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -const struct WindowTemplate gWindowTemplate_81E7294 = -{ - 0, // BG number - 0, // BG character base block - 0, // BG screen base block - 0, // BG priority - 0, // palette number - 1, // foreground color - 15, // background color - 8, // shadow color - 4, // font - 2, // text mode - 0, // spacing - 0, // tilemap left coordinate - 0, // tilemap top coordinate - 16, // width - 32, // height - gTileBuffer, // tile data - NULL, // tilemap -}; - -static void UpdateBGRegs(const struct WindowTemplate *winTemplate) -{ - u8 bgNum = winTemplate->bgNum; - *gBGHOffsetRegs[bgNum] = 0; - *gBGVOffsetRegs[bgNum] = 0; - *gBGControlRegs[bgNum] = winTemplate->priority | (winTemplate->screenBaseBlock << 8) | (winTemplate->charBaseBlock << 2); -} - -static void ClearBGMem(const struct WindowTemplate *winTemplate) -{ - CpuFastFill(0, winTemplate->tileData, 32); - - if (winTemplate->tilemap) - CpuFastFill(0, winTemplate->tilemap, 0x800); -} - -void LoadFontDefaultPalette(const struct WindowTemplate *winTemplate) -{ - LoadPalette(gFontDefaultPalette, 16 * winTemplate->paletteNum, 32); -} - -void Text_LoadWindowTemplate(const struct WindowTemplate *winTemplate) -{ - UpdateBGRegs(winTemplate); - ClearBGMem(winTemplate); - LoadFontDefaultPalette(winTemplate); -} - -u16 InitWindowTileData(struct Window *win, u16 startOffset) -{ - u16 retVal; - - win->tileDataStartOffset = startOffset; - retVal = 0; - - switch (win->template->textMode) - { - case TEXT_MODE_UNKNOWN2: - retVal = InitVariableWidthFontTileData(win, startOffset); - break; - case TEXT_MODE_MONOSPACE: - switch (win->template->fontNum) - { - case 0: - case 3: - retVal = LoadFixedWidthFont(win, startOffset); - break; - case 1: - case 2: - retVal = LoadFixedWidthFont_Font1Latin(win, startOffset); - break; - case 4: - case 5: - retVal = LoadFixedWidthFont_Font4Latin(win, startOffset); - break; - case 6: - retVal = LoadFixedWidthFont_Braille(win, startOffset); - break; - } - break; - } - - return retVal; -} - -static u16 InitVariableWidthFontTileData(struct Window *win, u16 startOffset) -{ - u8 *buffer; - - win->tileDataStartOffset = startOffset; - win->tileDataOffset = 2; - buffer = win->tileData + 32 * win->tileDataStartOffset; - CpuFastFill(0, buffer, 32); - ApplyColors_UnshadowedFont(sBlankTile, (u32 *)(buffer + 32), win->template->foregroundColor, win->template->backgroundColor); - return win->tileDataStartOffset + win->tileDataOffset + win->width * win->height; -} - -static u16 LoadFixedWidthFont(struct Window *win, u16 startOffset) -{ - s32 glyph; - u8 *buffer = win->tileData + 32 * startOffset; - for (glyph = 0; glyph < 256; glyph++) - { - LoadFixedWidthGlyph(win, glyph, buffer); - buffer += 64; - } - return 2 * glyph; -} - -static u16 LoadFixedWidthFont_Font1Latin(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -static u16 LoadFixedWidthFont_Font4Latin(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_ShadowedFont(&gFont4LatinGlyphs[8 * i], buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -static u16 LoadFixedWidthFont_Braille(struct Window *win, u16 startOffset) -{ - s32 i; - u8 *buffer = win->tileData + 32 * startOffset; - for (i = 0; i < 256; i++) - { - ApplyColors_UnshadowedFont(&sBrailleGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); - buffer += 32; - } - return i; -} - -u32 MultistepInitWindowTileData(struct Window *win, u16 startOffset) -{ - u32 retVal; - sMultistepLoadFont_Window = win; - sMultistepLoadFont_Index = 0; - sMultistepLoadFont_StartOffset = startOffset; - win->tileDataStartOffset = startOffset; - retVal = 0; - - switch (win->template->textMode) - { - case TEXT_MODE_UNKNOWN2: - retVal = InitVariableWidthFontTileData(win, startOffset); - break; - case TEXT_MODE_MONOSPACE: - retVal = 256; - if (win->template->fontNum == 0 - || win->template->fontNum == 3) - retVal *= 2; - break; - } - - return retVal; -} - -bool32 MultistepLoadFont(void) -{ - bool32 retVal = TRUE; - - if (sMultistepLoadFont_Window->template->textMode == TEXT_MODE_MONOSPACE) - { - s32 i; - - for (i = sMultistepLoadFont_Index; i < sMultistepLoadFont_Index + 16; i++) - MultistepLoadFont_LoadGlyph(sMultistepLoadFont_Window, sMultistepLoadFont_StartOffset, i); - - sMultistepLoadFont_Index += 16; - - if (sMultistepLoadFont_Index < 256) - retVal = FALSE; - } - - return retVal; -} - -static void MultistepLoadFont_LoadGlyph(struct Window *win, u16 startOffset, u8 glyph) -{ - u8 *buffer; - - switch (win->template->fontNum) - { - case 0: - case 3: - buffer = win->tileData + 32 * startOffset + 64 * glyph; - LoadFixedWidthGlyph(win, glyph, buffer); - break; - case 1: - case 2: - buffer = win->tileData + 32 * (glyph + startOffset); - ApplyColors_UnshadowedFont( - &sFont1LatinGlyphs[8 * glyph], - (u32 *)buffer, - win->foregroundColor, - win->backgroundColor); - break; - case 4: - case 5: - buffer = win->tileData + 32 * (glyph + startOffset); - ApplyColors_ShadowedFont( - &gFont4LatinGlyphs[8 * glyph], - buffer, - win->foregroundColor, - win->shadowColor, - win->backgroundColor); - break; - } -} - -void EmptyFunc(void) -{ -} - -void Text_InitWindowWithTemplate(struct Window *win, const struct WindowTemplate *winTemplate) -{ - *win = sDefaultWindow; - win->template = (struct WindowTemplate *)winTemplate; - win->textMode = winTemplate->textMode; - win->spacing = winTemplate->spacing; - win->fontNum = winTemplate->fontNum; - win->paletteNum = winTemplate->paletteNum; - win->tilemapLeft = winTemplate->tilemapLeft; - win->tilemapTop = winTemplate->tilemapTop; - win->width = winTemplate->width; - win->height = winTemplate->height; - win->tileData = winTemplate->tileData; - win->tilemap = winTemplate->tilemap; - SetWindowDefaultColors(win); - SetWindowBackgroundColor(win, winTemplate->backgroundColor); - SetWindowShadowColor(win, winTemplate->shadowColor); - SetWindowForegroundColor(win, winTemplate->foregroundColor); -} - -void Text_InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - const struct WindowTemplate *winTemplate = win->template; - win->textMode = winTemplate->textMode; - win->fontNum = winTemplate->fontNum; - win->language = GAME_LANGUAGE; - win->paletteNum = winTemplate->paletteNum; - win->win_field_B = 0; - win->win_field_C = 0; - win->delayCounter = 0; - win->spacing = winTemplate->spacing; - win->win_field_F = 0; - win->tilemapLeft = winTemplate->tilemapLeft; - win->tilemapTop = winTemplate->tilemapTop; - win->width = winTemplate->width; - win->height = winTemplate->height; - win->text = text; - win->textIndex = 0; - win->tileDataStartOffset = tileDataStartOffset; - win->tileDataOffset = 0; - win->left = 8 * left; - win->cursorX = 0; - win->top = 8 * top; - win->cursorY = 0; - win->state = WIN_STATE_BEGIN; - win->downArrowCounter = 0; - win->tileData = winTemplate->tileData; - win->tilemap = winTemplate->tilemap; - SetWindowDefaultColors(win); - SetWindowBackgroundColor(win, winTemplate->backgroundColor); - SetWindowShadowColor(win, winTemplate->shadowColor); - SetWindowForegroundColor(win, winTemplate->foregroundColor); -} - -void Text_InitWindow8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) -{ - u8 val; - - Text_InitWindow(win, text, tileDataStartOffset, 0, 0); - win->left = left; - win->top = top; - val = 0; - if (a6) - val = 255; - win->win_field_F = val; - if (val) - ClipLeft(win); -} - -void Text_SetWindowText(struct Window *win, const u8 *text) -{ - win->state = WIN_STATE_NORMAL; - win->text = text; - win->textIndex = 0; - win->downArrowCounter = 0; - win->win_field_B = -1; - win->win_field_C = 0; - win->delayCounter = 0; -} - -void Text_InitWindow8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - gMain.watchedKeysMask = A_BUTTON | B_BUTTON; - gMain.watchedKeysPressed = 0; - sWaitType = WAIT_TYPE_NORMAL; - sLineLength = 26; - Text_InitWindow(win, text, tileDataStartOffset, left, top); - win->win_field_B = -1; - if (win->textMode == TEXT_MODE_UNKNOWN0) - { - u16 val = GetCursorTileNum(win, 0, 0); - u8 *buffer = win->tileData + 32 * val; - ApplyColors_UnshadowedFont(sBlankTile, (u32 *)buffer, win->backgroundColor, win->backgroundColor); - ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * 0x6E], (u32 *)(buffer + 32), win->foregroundColor, win->backgroundColor); - win->tileDataOffset = 2; - } -} - -u8 Text_PrintWindow8002F44(struct Window *win) -{ - while (win->state != WIN_STATE_END) - { - if (win->state == WIN_STATE_NEWLINE) - { - AddToCursorY(win, 16); - win->cursorX = 0; - if (win->win_field_F) - ClipLeft(win); - win->state = WIN_STATE_NORMAL; - } - else if (win->state == WIN_STATE_PLACEHOLDER) - { - sub_8002FA0(win, GetExpandedPlaceholder(win->text[win->textIndex++])); - } - - PrintNextChar(win); - } - return 1; -} - -static u8 sub_8002FA0(struct Window *win, const u8 *text) -{ - u8 retVal; - u8 savedLanguage = win->language; - const u8 *savedText = win->text; - - u16 savedTextIndex = win->textIndex; - win->text = text; - win->textIndex = 0; - win->state = WIN_STATE_NORMAL; - retVal = Text_PrintWindow8002F44(win); - win->text = savedText; - win->textIndex = savedTextIndex; - win->state = WIN_STATE_NORMAL; - win->language = savedLanguage; - return retVal; -} - -static u8 PrintNextChar(struct Window *win) -{ - u8 c = win->text[win->textIndex++]; - - // Handle special control characters - switch (c) - { - case EOS: - ClipRight(win); - win->state = WIN_STATE_END; - return 0; - case PLACEHOLDER_BEGIN: - win->state = WIN_STATE_PLACEHOLDER; - return 2; - case CHAR_NEWLINE: - ClipRight(win); - win->state = WIN_STATE_NEWLINE; - return 2; - case CHAR_PROMPT_CLEAR: - DrawInitialDownArrow(win); - win->state = WIN_STATE_WAIT_CLEAR; - return 2; - case CHAR_PROMPT_SCROLL: - DrawInitialDownArrow(win); - win->state = WIN_STATE_WAIT_SCROLL; - return 2; - case EXT_CTRL_CODE_BEGIN: - return HandleExtCtrlCode(win); - } - - sPrintGlyphFuncs[win->textMode](win, c); - return 1; -} - -// Extended 0xFC control functions - -static u8 HandleExtCtrlCode(struct Window *win) -{ - return sExtCtrlCodeFuncs[win->text[win->textIndex++]](win); -} - -static u8 ExtCtrlCode_Nop(struct Window *win) -{ - return 2; -} - -static u8 ExtCtrlCode_ForegroundColor(struct Window *win) -{ - SetWindowForegroundColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_BackgroundColor(struct Window *win) -{ - SetWindowBackgroundColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_ShadowColor(struct Window *win) -{ - SetWindowShadowColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_AllColors(struct Window *win) -{ - SetWindowForegroundColor(win, win->text[win->textIndex++]); - SetWindowBackgroundColor(win, win->text[win->textIndex++]); - SetWindowShadowColor(win, win->text[win->textIndex++]); - return 2; -} - -static u8 ExtCtrlCode_Palette(struct Window *win) -{ - win->paletteNum = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_Font(struct Window *win) -{ - win->fontNum = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_DefaultFont(struct Window *win) -{ - win->fontNum = win->template->fontNum; - return 2; -} - -static u8 ExtCtrlCode_Pause(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_PAUSE; - win->delayCounter = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_WaitButton(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_WAIT_BUTTON; - return 2; -} - -static u8 ExtCtrlCode_WaitSound(struct Window *win) -{ - ClipRight(win); - win->state = WIN_STATE_WAIT_SOUND; - return 2; -} - -static u8 ExtCtrlCode_PlayBGM(struct Window *win) -{ - u16 loByte = win->text[win->textIndex++]; - u16 hiByte = win->text[win->textIndex++] << 8; - PlayBGM(loByte | hiByte); - return 2; -} - -static u8 ExtCtrlCode_Escape(struct Window *win) -{ - sPrintGlyphFuncs[win->textMode](win, win->text[win->textIndex++]); - return 1; -} - -u8 ExtCtrlCode_Nop2(struct Window *win) -{ - return 1; -} - -static u8 ExtCtrlCode_SetCursorY(struct Window *win) -{ - ClipRight(win); - AddToCursorY(win, 8 * win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *win) -{ - Text_ClearWindow(win); - return 2; -} - -static u8 ExtCtrlCode_PlaySE(struct Window *win) -{ - u16 loByte = win->text[win->textIndex++]; - u16 hiByte = win->text[win->textIndex++] << 8; - PlaySE(loByte | hiByte); - return 2; -} - -static void DrawSpace(struct Window *win) -{ - if (win->textMode == TEXT_MODE_MONOSPACE || (win->left + win->cursorX) & 7 || win->spacing <= 7) - { - sPrintGlyphFuncs[win->textMode](win, 0); - } - else - { - u32 val = sGlyphBuffer.background; - u16 index = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * index); - buffer[0] = val; - buffer[1] = val; - buffer[2] = val; - buffer[3] = val; - buffer[4] = val; - buffer[5] = val; - buffer[6] = val; - buffer[7] = val; - index = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * index); - buffer[0] = val; - buffer[1] = val; - buffer[2] = val; - buffer[3] = val; - buffer[4] = val; - buffer[5] = val; - buffer[6] = val; - buffer[7] = val; - UpdateTilemap(win, 1); - AddToCursorX(win, 8); - } -} - -static void sub_8003344(struct Window *win, u8 newX) -{ - u8 savedSpacing = win->spacing; - - if (newX - win->cursorX <= 8) - win->spacing = newX - win->cursorX; - else - win->spacing = 8 - ((win->left + win->cursorX) & 7); - - while (win->cursorX < newX) - { - s32 spacing; - DrawSpace(win); - spacing = newX - win->cursorX; - if (spacing >= 8) - spacing = 8; - win->spacing = spacing; - } - - win->spacing = savedSpacing; -} - -static u8 ExtCtrlCode_Skip(struct Window *win) -{ - sub_8003344(win, win->cursorX + win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_SetCursorX(struct Window *win) -{ - ClipRight(win); - SetCursorX(win, win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_SkipTo(struct Window *win) -{ - sub_8003344(win, win->text[win->textIndex++]); - return 1; -} - -static u8 ExtCtrlCode_Spacing(struct Window *win) -{ - win->spacing = win->text[win->textIndex++]; - return 2; -} - -static u8 ExtCtrlCode_Japanese(struct Window *win) -{ - win->language = LANGUAGE_JAPANESE; - return 2; -} - -static u8 ExtCtrlCode_Latin(struct Window *win) -{ - win->language = GAME_LANGUAGE; - return 2; -} - -// Prints the window text without expanding any placeholders -u8 Text_PrintWindowSimple(struct Window *win) -{ - u8 retVal = 1; - while (win->state != WIN_STATE_END) - { - if (win->state == WIN_STATE_NEWLINE) - { - AddToCursorY(win, 16); - win->cursorX = 0; - if (win->win_field_F) - ClipLeft(win); - win->state = WIN_STATE_NORMAL; - } - if (PrintNextChar(win) == 1) - { - retVal = 0; - break; - } - } - return retVal; -} - -u8 Text_InitWindowAndPrintText(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - Text_InitWindow(win, text, tileDataStartOffset, left, top); - return Text_PrintWindow8002F44(win); -} - -u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 top) -{ - u8 retVal; - u8 text[2]; - text[0] = c; - text[1] = EOS; - Text_InitWindow(win, text, tileDataStartOffset, left, top); - retVal = PrintNextChar(win); - ClipRight(win); - return retVal; -} - -void sub_80034D4(u8 *tileData, const u8 *text) -{ - Text_InitWindow8004E3C(&gWindowTemplate_81E6C74, tileData, text); -} - -u8 sub_80034EC(u8 *str) -{ - return Text_GetStringWidthFromWindowTemplate((struct WindowTemplate *)&gWindowTemplate_81E6C74, str); -} - -u8 *sub_8003504(u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - sTempWindow.template = (struct WindowTemplate *)&gWindowTemplate_81E6C74; - Text_InitWindow(&sTempWindow, 0, 0, 0, 0); - return AlignInt2(&sTempWindow, dest, value, alignAmount, alignType); -} - -u8 *sub_8003558(u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) -{ - sTempWindow.template = (struct WindowTemplate *)&gWindowTemplate_81E6C74; - Text_InitWindow(&sTempWindow, src, 0, 0, 0); - return AlignString(&sTempWindow, dest, src, alignAmount, alignType); -} - -// Updates the window text -// The text delay can be accelerated by holding the A button -u8 Text_UpdateWindow(struct Window *win) -{ - sWaitType = WAIT_TYPE_NORMAL; - return UpdateWindowText(win); -} - -// Returns TRUE when all of the text has been printed. -static u8 UpdateWindowText(struct Window *win) -{ - switch (win->state) - { - case WIN_STATE_WAIT_BUTTON: - if (PlayerCanInterruptDelay(win)) - { - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PlaySE(SE_SELECT); - } - else - { - return FALSE; - } - } - else - { - win->delayCounter--; - if (win->delayCounter) - return FALSE; - } - win->state = WIN_STATE_NORMAL; - return FALSE; - case WIN_STATE_CHAR_DELAY: - // Allow the player to speed up text by holding a button - if (PlayerCanInterruptDelay(win) - && (gMain.heldKeys & (A_BUTTON | B_BUTTON)) - && gMain.watchedKeysPressed == TRUE) - { - win->delayCounter = 0; - win->state = WIN_STATE_NORMAL; - break; - } - // fall through - case WIN_STATE_PAUSE: - // Wait for timer to expire, then continue printing - if (win->delayCounter) - { - win->delayCounter--; - if (win->delayCounter) - return FALSE; - } - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_WAIT_CLEAR: - // Erase the text once a button is pressed - if (WaitWithDownArrow(win)) - { - Text_ClearWindow(win); - win->state = WIN_STATE_NORMAL; - asm(""); - } - return FALSE; - case WIN_STATE_WAIT_SCROLL: - // Scroll the text once a button is pressed - if (WaitWithDownArrow(win)) - { - ScrollWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - asm(""); - } - return FALSE; - case WIN_STATE_PLACEHOLDER: - win->textIndex++; - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_NEWLINE: - ScrollWindowTextLines(win); - win->state = WIN_STATE_NORMAL; - asm(""); - return FALSE; - case WIN_STATE_BEGIN: - Text_ClearWindow(win); - break; - case WIN_STATE_WAIT_SOUND: - if (IsSEPlaying()) - return FALSE; - win->state = WIN_STATE_NORMAL; - break; - case WIN_STATE_END: - return TRUE; // done printing text - case WIN_STATE_NORMAL: - break; - default: - win->state = WIN_STATE_END; - return TRUE; - } - - PrintNextChar(win); - - switch (win->state) - { - case WIN_STATE_END: - return TRUE; // done printing text - case WIN_STATE_WAIT_BUTTON: - case WIN_STATE_WAIT_CLEAR: - case WIN_STATE_WAIT_SCROLL: - if (PlayerCanInterruptDelay(win)) - return 0; - win->delayCounter = 60; - break; - case WIN_STATE_PAUSE: - case WIN_STATE_NEWLINE: - case WIN_STATE_WAIT_SOUND: - break; - default: - win->state = WIN_STATE_CHAR_DELAY; - win->delayCounter = GetTextDelay(win); - break; - } - - return 0; -} - -#if defined(ENGLISH) -#define SUB_800374C_LINE_LENGTH 26 -#elif defined(GERMAN) -#define SUB_800374C_LINE_LENGTH 27 -#endif - -u8 Text_UpdateWindowInBattle(struct Window *win) -{ - u8 retVal; - - sWaitType = WAIT_TYPE_BATTLE; - sLineLength = SUB_800374C_LINE_LENGTH; - retVal = UpdateWindowText(win); - sLineLength = 26; - sWaitType = WAIT_TYPE_NORMAL; - return retVal; -} - -u8 Text_UpdateWindowAutoscroll(struct Window *win) -{ - u8 retVal; - - sWaitType = WAIT_TYPE_AUTOSCROLL; - sLineLength = 26; - retVal = UpdateWindowText(win); - sWaitType = WAIT_TYPE_NORMAL; - return retVal; -} - -u8 Text_UpdateWindowInContest(struct Window *win) -{ - u8 retVal; - - sWaitType = WAIT_TYPE_CONTEST; - sLineLength = 17; - retVal = UpdateWindowText(win); - sLineLength = 26; - return retVal; -} - -u32 Text_UpdateWindowOverrideLineLength(struct Window *win, u8 lineLength) -{ - u8 retVal; - - sWaitType = WAIT_TYPE_NORMAL; - sLineLength = lineLength; - retVal = UpdateWindowText(win); - sLineLength = 26; - return retVal; -} - -static void PrintGlyph_TextMode0(struct Window *win, u32 glyph) -{ - AddToCursorX(win, DrawGlyph_TextMode0(win, glyph)); - if (win->win_field_B) - ClipRight(win); -} - -static u8 DrawGlyph_TextMode0(struct Window *win, u32 glyph) -{ - u8 pixelsWidth = GetGlyphWidth(win, glyph); - u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); - UpdateTilemap(win, tilesWidth); - return pixelsWidth; -} - -static void PrintGlyph_TextMode1(struct Window *win, u32 glyph) -{ - sWriteGlyphTilemapFuncs[win->fontNum](win, glyph); - win->cursorX += 8; -} - -static void WriteGlyphTilemap_Font0_Font3(struct Window *win, u32 glyph) -{ - s16 val = win->tileDataStartOffset + 2 * glyph; - WriteGlyphTilemap(win, val, val + 1); -} - -static void WriteGlyphTilemap_Font1_Font4(struct Window *win, u32 glyph) -{ - u32 val = glyph * 2; - WriteGlyphTilemap( - win, - win->tileDataStartOffset + sFontType1Map[val], - win->tileDataStartOffset + sFontType1Map[val + 1]); -} - -static void WriteGlyphTilemap_Font2_Font5(struct Window *win, u32 glyph) -{ - WriteGlyphTilemap( - win, - win->tileDataStartOffset + 212, - win->tileDataStartOffset + glyph); -} - -static void WriteGlyphTilemap_Font6(struct Window *win, u32 glyph) -{ - u32 val = glyph * 2; - WriteGlyphTilemap( - win, - win->tileDataStartOffset + sFontType3Map[val], - win->tileDataStartOffset + sFontType3Map[val + 1]); -} - -static void PrintGlyph_TextMode2(struct Window *win, u32 glyph) -{ - u8 width = GetGlyphWidth(win, glyph); - DrawGlyph_TextMode2(win, glyph); - AddToCursorX(win, width); - if (win->win_field_B) - ClipRight(win); -} - -static void DrawGlyph_TextMode2(struct Window *win, u32 glyph) -{ - u8 pixelsWidth = GetGlyphWidth(win, glyph); - u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); - UpdateTilemap(win, tilesWidth); -} - -static void LoadFixedWidthGlyph(struct Window *win, u32 glyph, u8 *dest) -{ - u8 *upperTile; - u8 *lowerTile; - - GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); - - switch (win->fontNum) - { - case 0: - case 1: - case 2: - case 6: - ApplyColors_UnshadowedFont(upperTile, (u32 *)dest, win->foregroundColor, win->backgroundColor); - ApplyColors_UnshadowedFont(lowerTile, (u32 *)(dest + 32), win->foregroundColor, win->backgroundColor); - break; - case 3: - case 4: - case 5: - ApplyColors_ShadowedFont(upperTile, dest, win->foregroundColor, win->shadowColor, win->backgroundColor); - ApplyColors_ShadowedFont(lowerTile, dest + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); - break; - } -} - -static void WriteGlyphTilemap(struct Window *win, u16 upperTileNum, u16 lowerTileNum) -{ - u16 *buffer = GetCursorTilemapPointer(win); - if (buffer) - { - u16 palette = (win->paletteNum << 12); - buffer[0] = upperTileNum | palette; - buffer[32] = lowerTileNum | palette; - } -} - -static void GetGlyphTilePointers(u8 fontNum, u8 language, u16 glyph, u8 **upperTilePtr, u8 **lowerTilePtr) -{ - u16 index; - const struct Font *font; - - if (language == LANGUAGE_JAPANESE) - language = 0; - else - language = 7; - - font = &sFonts[language + fontNum]; - - switch (font->type) - { - case 0: - *upperTilePtr = font->glyphs + glyph * font->glyphSize; - *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; - break; - case 1: - index = 2 * glyph; - *upperTilePtr = font->glyphs + sFontType1Map[index] * font->glyphSize; - *lowerTilePtr = font->glyphs + sFontType1Map[index + 1] * font->glyphSize; - break; - case 2: - *upperTilePtr = font->glyphs + 212 * font->glyphSize; - *lowerTilePtr = font->glyphs + glyph * font->glyphSize; - break; - case 3: - index = 2 * glyph; - *upperTilePtr = font->glyphs + sFontType3Map[index] * font->glyphSize; - *lowerTilePtr = font->glyphs + sFontType3Map[index + 1] * font->glyphSize; - break; - case 4: - *upperTilePtr = font->glyphs - + (glyph & 0xFFF0) * font->glyphSize - + (((glyph &= 0xF) * font->glyphSize) >> 1); - *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; - break; - } -} - -static u16 *GetCursorTilemapPointer(struct Window *win) -{ - u16 *ptr = NULL; - if (win->tilemap) - { - u8 x = ((win->left + win->cursorX) >> 3) + win->tilemapLeft; - u8 y = ((win->top + win->cursorY) >> 3) + win->tilemapTop; - ptr = &win->tilemap[(y * 32) + x]; - } - return ptr; -} - -static void ApplyColors_UnshadowedFont(const u8 *src, u32 *dest, u8 foreground, u8 background) -{ - u32 a[2]; - s32 i; - const u8 *srcRows = src; - - a[0] = background; - a[1] = foreground; - - for (i = 0; i < 8; i++) - { - u32 destRow = a[srcRows[i] & 1] - | (a[(srcRows[i] >> 1) & 1] << 4) - | (a[(srcRows[i] >> 2) & 1] << 8) - | (a[(srcRows[i] >> 3) & 1] << 12) - | (a[(srcRows[i] >> 4) & 1] << 16) - | (a[(srcRows[i] >> 5) & 1] << 20) - | (a[(srcRows[i] >> 6) & 1] << 24) - | (a[(srcRows[i] >> 7) ] << 28); - dest[i] = destRow; - } -} - -static void ApplyColors_ShadowedFont(const void *src, void *dest, u8 foreground, u8 shadow, u8 background) -{ - u32 a[0x10]; - s32 i; - const u32 *curSrc; - u32 *curDest; - u32 colorMask; - - a[0x1] = 0x1; - a[0x2] = 0x2; - a[0x3] = 0x3; - a[0x4] = 0x4; - a[0x5] = 0x5; - a[0x6] = 0x6; - a[0x7] = 0x7; - a[0x8] = 0x8; - a[0x9] = 0x9; - a[0xA] = 0xA; - a[0xB] = 0xB; - a[0xC] = 0xC; - a[0xD] = 0xD; - a[0x0] = background; - a[0xE] = shadow; - a[0xF] = foreground; - - colorMask = 0xF; - - curSrc = src; - curDest = dest; - - for (i = 7; i >= 0; i--) - { - u32 row = *curSrc++; - u32 recoloredRow = a[row & colorMask] - | (a[(row >> 4) & colorMask] << 4) - | (a[(row >> 8) & colorMask] << 8) - | (a[(row >> 12) & colorMask] << 12) - | (a[(row >> 16) & colorMask] << 16) - | (a[(row >> 20) & colorMask] << 20) - | (a[(row >> 24) & colorMask] << 24) - | (a[(row >> 28) ] << 28); - *curDest++ = recoloredRow; - } -} - -static void SetCursorX(struct Window *win, u8 x) -{ - if (win->textMode == TEXT_MODE_UNKNOWN0 && ((win->left + win->cursorX) & 7)) - win->tileDataOffset += 2; - win->cursorX = x; -} - -static void AddToCursorX(struct Window *win, u8 deltaX) -{ - if (win->textMode == TEXT_MODE_UNKNOWN0) - { - u8 x = win->cursorX; - win->cursorX += deltaX; - if (((win->left + win->cursorX) & 0xF8) != ((win->left + x) & 0xF8)) - win->tileDataOffset += 2; - } - else - { - win->cursorX += deltaX; - } -} - -static void AddToCursorY(struct Window *win, u8 deltaY) -{ - if (win->textMode == TEXT_MODE_UNKNOWN0 && ((win->left + win->cursorX) & 7)) - win->tileDataOffset += 2; - win->cursorY += deltaY; -} - -static void EraseAtCursor(struct Window *win) -{ - switch (win->textMode) - { - case TEXT_MODE_UNKNOWN0: - case TEXT_MODE_UNKNOWN2: - DrawGlyphTiles(win, 0, 8); - break; - case TEXT_MODE_MONOSPACE: - sWriteGlyphTilemapFuncs[win->fontNum](win, 0); - break; - } -} - -static void ClipLeft(struct Window *win) -{ - u32 pixel = win->left & 7; - - if (win->textMode != TEXT_MODE_MONOSPACE && pixel) - { - const u32 *masks = sGlyphMasks[8][pixel]; - u32 outsideMask = masks[0]; - u32 insideMask = ~outsideMask; - u32 outside = sGlyphBuffer.background & outsideMask; - u16 tileNum = GetCursorTileNum(win, 0, 0); - u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - tileNum = GetCursorTileNum(win, 0, 1); - buffer = (u32 *)(win->tileData + 32 * tileNum); - buffer[0] = (buffer[0] & insideMask) | outside; - buffer[1] = (buffer[1] & insideMask) | outside; - buffer[2] = (buffer[2] & insideMask) | outside; - buffer[3] = (buffer[3] & insideMask) | outside; - buffer[4] = (buffer[4] & insideMask) | outside; - buffer[5] = (buffer[5] & insideMask) | outside; - buffer[6] = (buffer[6] & insideMask) | outside; - buffer[7] = (buffer[7] & insideMask) | outside; - } -} - -static void ClipRight(struct Window *win) -{ - register u8 cursorX asm("r0") = win->cursorX; - u8 left = win->left; - u32 pixelX = (cursorX + left) & 7; - - if (win->textMode != TEXT_MODE_MONOSPACE && pixelX != 0) - { - const u32 *masks = sGlyphMasks[8 - pixelX][pixelX]; - u32 insideMask = masks[0]; - u32 outside = (sGlyphBuffer.background & ~insideMask); - u16 tileNum; - u32 *tileData; - - tileNum = GetCursorTileNum(win, 0, 0); - tileData = (u32 *)(win->tileData + 32 * tileNum); - - tileData[0] = (tileData[0] & insideMask) | outside; - tileData[1] = (tileData[1] & insideMask) | outside; - tileData[2] = (tileData[2] & insideMask) | outside; - tileData[3] = (tileData[3] & insideMask) | outside; - tileData[4] = (tileData[4] & insideMask) | outside; - tileData[5] = (tileData[5] & insideMask) | outside; - tileData[6] = (tileData[6] & insideMask) | outside; - tileData[7] = (tileData[7] & insideMask) | outside; - - tileNum = GetCursorTileNum(win, 0, 1); - tileData = (u32 *)(win->tileData + 32 * tileNum); - - tileData[0] = (tileData[0] & insideMask) | outside; - tileData[1] = (tileData[1] & insideMask) | outside; - tileData[2] = (tileData[2] & insideMask) | outside; - tileData[3] = (tileData[3] & insideMask) | outside; - tileData[4] = (tileData[4] & insideMask) | outside; - tileData[5] = (tileData[5] & insideMask) | outside; - tileData[6] = (tileData[6] & insideMask) | outside; - tileData[7] = (tileData[7] & insideMask) | outside; - - UpdateTilemap(win, 1); - } -} - -static void SetWindowDefaultColors(struct Window *win) -{ - u32 i; - - win->backgroundColor = 0; - win->shadowColor = 14; - win->foregroundColor = 15; - - for (i = 0; i < 16; i++) - sGlyphBuffer.colors[i] = i; -} - -static void SetWindowBackgroundColor(struct Window *win, u8 color) -{ - u32 val1; - u32 val2; - u32 val3; - win->backgroundColor = color; - sGlyphBuffer.colors[0] = color; - val1 = color | (color << 4); - val2 = val1 | (val1 << 8); - val3 = val2 | (val2 << 16); - sGlyphBuffer.background = val3; -} - -static void SetWindowShadowColor(struct Window *win, u8 color) -{ - win->shadowColor = color; - sGlyphBuffer.colors[14] = color; -} - -static void SetWindowForegroundColor(struct Window *win, u8 color) -{ - win->foregroundColor = color; - sGlyphBuffer.colors[15] = color; -} - -static u8 GetTextDelay(struct Window *win) -{ - if (!PlayerCanInterruptDelay(win)) - return 3; - - return sTextSpeedDelays[gSaveBlock2.optionsTextSpeed]; -} - -static bool8 PlayerCanInterruptDelay(struct Window *win) -{ - bool8 retVal = TRUE; - - switch (sWaitType) - { - case WAIT_TYPE_AUTOSCROLL: - retVal = FALSE; - break; - case WAIT_TYPE_CONTEST: - retVal = gIsLinkContest ? FALSE : TRUE; - break; - case WAIT_TYPE_BATTLE: - retVal = (gBattleTypeFlags & BATTLE_TYPE_LINK) ? FALSE : TRUE; - break; - } - - return retVal; -} - -static void ScrollWindowTextLines(struct Window *win) -{ - switch (win->textMode) - { - case TEXT_MODE_UNKNOWN0: - ScrollWindowTextLines_TextMode0(win); - break; - case TEXT_MODE_MONOSPACE: - ScrollWindowTextLines_TextModeMonospace(win); - break; - case TEXT_MODE_UNKNOWN2: - ScrollWindowTextLines_TextMode2(win); - break; - } -} - -static void ScrollWindowTextLines_TextMode0(struct Window *win) -{ - if (win->cursorY == 0) - { - // Advance to the next line - win->tileDataOffset = 2 * sLineLength + 2; - win->cursorX = 0; - win->cursorY += 16; - } - else - { - if (win->win_field_C & 2) - win->tileDataOffset = 2 * sLineLength + 2; - else - win->tileDataOffset = 2; - win->win_field_C ^= 2; - win->cursorX = 0; - DoScroll_TextMode0(win, sLineLength); - } -} - -static void DoScroll_TextMode0(struct Window *win, u16 lineLength) -{ - u16 *buffer = win->tilemap; - u32 val1 = 32 * (win->top >> 3); - u32 val2 = (win->left >> 3); - u16 fill; - buffer += val1 + val2; - fill = (win->paletteNum << 12) | GetBlankTileNum(win); - - // Move the bottom line up - CpuCopy16(buffer + 64, buffer, lineLength * 2); - CpuCopy16(buffer + 96, buffer + 32, lineLength * 2); - - // Clear the bottom line - CpuFill16(fill, buffer + 64, lineLength * 2); - CpuFill16(fill, buffer + 96, lineLength * 2); -} - -static void ScrollWindowTextLines_TextModeMonospace(struct Window *win) -{ - if (win->cursorY == 0) - { - // Advance to the next line - win->cursorX = 0; - win->cursorY += 16; - } - else - { - win->win_field_C ^= 2; - win->cursorX = 0; - DoScroll_TextModeMonospace(win, sLineLength); - } -} - -static void DoScroll_TextModeMonospace(struct Window *win, u16 lineLength) -{ - u16 *buffer = GetCursorTilemapPointer(win); - u16 *dest = buffer - 32; - u16 fill = (win->paletteNum << 12) | GetBlankTileNum(win); - - // Move the bottom line up - CpuCopy16(buffer + 32, dest, lineLength * 2); - CpuCopy16(buffer + 64, buffer, lineLength * 2); - - // Clear the bottom line - CpuFill16(fill, buffer + 32, lineLength * 2); - CpuFill16(fill, buffer + 64, lineLength * 2); -} - -static void ScrollWindowTextLines_TextMode2(struct Window *win) -{ - if (win->cursorY == 0) - { - // Advance to the next line - win->cursorX = 0; - win->cursorY += 16; - } - else - { - win->win_field_C ^= 2; - win->cursorX = 0; - DoScroll_TextMode2(win, sLineLength); - } -} - -static void DoScroll_TextMode2(struct Window *win, u8 lineLength) -{ - u8 i; - u8 *buf1 = win->tileData + 32 * GetCursorTileNum(win, 0, -2); - u8 *buf2 = win->tileData + 32 * GetCursorTileNum(win, 0, 0); - u8 *buf4; - u16 *buf3; - u16 a[4]; - - CpuFastCopy(buf2, buf1, 32 * lineLength); - CpuFastFill(sGlyphBuffer.background, buf2, 32 * lineLength); - buf4 = buf2 + 32 * win->width; - CpuFastCopy(buf4, buf1 + 32 * win->width, 32 * lineLength); - CpuFastFill(sGlyphBuffer.background, buf4, 32 * lineLength); - - buf3 = GetCursorTilemapPointer(win) - 64; - - a[0] = (win->tileDataStartOffset + win->tileDataOffset - + ((win->top >> 3) * win->width) - + (win->left >> 3)) - | (win->paletteNum << 12); - a[1] = a[0] + win->width; - a[2] = a[1] + win->width; - a[3] = a[2] + win->width; - - for (i = 0; i < lineLength; i++) - { - buf3[0] = a[0]++; - buf3[32] = a[1]++; - buf3[64] = a[2]++; - buf3[96] = a[3]++; - buf3++; - } -} - -void Text_ClearWindow(struct Window *win) -{ - switch (win->textMode) - { - case TEXT_MODE_UNKNOWN0: - ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); - win->tileDataOffset = 2; - break; - case TEXT_MODE_MONOSPACE: - ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); - break; - case TEXT_MODE_UNKNOWN2: - ClearWindowTextLines_TextMode2(win, sLineLength); - break; - } -} - -static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *win, u8 lineLength) -{ - u8 x, y; - u16 *buffer; - u16 fill; - - win->cursorX = 0; - win->cursorY = 0; - win->win_field_C = 0; - - buffer = GetCursorTilemapPointer(win); - fill = GetBlankTileNum(win) | (win->paletteNum << 12); - - for (y = 0; y < 4; y++) - { - for (x = 0; x < lineLength; x++) - buffer[x] = fill; - buffer += 32; - } -} - -static void ClearWindowTextLines_TextMode2(struct Window *win, u8 lineLength) -{ - u8 *buffer; - - win->cursorX = 0; - win->cursorY = 0; - win->win_field_C = 0; - - buffer = win->tileData + 32 * GetCursorTileNum(win, 0, 0); - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); - buffer += 32 * win->width; - CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); -} - -static void DrawDownArrow(struct Window *win) -{ - if (PlayerCanInterruptDelay(win)) - { - const u32 *downArrowTiles = &sDownArrowTiles[((win->downArrowCounter & 0x0F00) >> 8) * 16]; - - switch (win->textMode) - { - case TEXT_MODE_MONOSPACE: - { - u8 *buffer; - u16 tileNum = win->tileDataStartOffset + 254; - if (win->fontNum == 0 || win->fontNum == 3) - tileNum *= 2; - buffer = win->tileData + 32 * tileNum; - ApplyColors_ShadowedFont(downArrowTiles, buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); - ApplyColors_ShadowedFont(downArrowTiles + 8, buffer + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); - WriteGlyphTilemap(win, tileNum, tileNum + 1); - break; - } - case TEXT_MODE_UNKNOWN0: - case TEXT_MODE_UNKNOWN2: - { - struct GlyphTileInfo glyphTileInfo; - glyphTileInfo.textMode = win->textMode; - glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; - if (glyphTileInfo.startPixel != 0) - { - u8 *upperTile; - u8 *lowerTile; - GetGlyphTilePointers(win->fontNum, win->language, 0, &upperTile, &lowerTile); - glyphTileInfo.width = 8 - glyphTileInfo.startPixel; - glyphTileInfo.src = upperTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 1)); - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - } - glyphTileInfo.width = 8; - glyphTileInfo.src = (u8 *)downArrowTiles; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src += 32; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - if (glyphTileInfo.startPixel != 0) - UpdateTilemap(win, 2); - else - UpdateTilemap(win, 1); - break; - } - } - } -} - -static u8 WaitWithDownArrow(struct Window *win) -{ - u8 retVal = TRUE; - - if (!PlayerCanInterruptDelay(win)) - { - win->delayCounter--; - if (!win->delayCounter) - { - TryEraseDownArrow(win); - } - else - { - UpdateDownArrowAnimation(win); - retVal = FALSE; - } - } - else - { - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PlaySE(SE_SELECT); - TryEraseDownArrow(win); - } - else - { - UpdateDownArrowAnimation(win); - retVal = FALSE; - } - } - - return retVal; -} - -static void DrawInitialDownArrow(struct Window *win) -{ - win->downArrowCounter = 0; - DrawDownArrow(win); -} - -static void UpdateDownArrowAnimation(struct Window *win) -{ - u16 downArrowPos = (win->downArrowCounter & 0x0F00) >> 8; - u16 wait = win->downArrowCounter & 0x000F; - u16 newVal; - - wait++; - - if (wait == 6) - { - wait = 0; - downArrowPos++; - if (downArrowPos > 3) - downArrowPos = 0; - win->downArrowCounter = downArrowPos << 8; - DrawDownArrow(win); - } - - newVal = downArrowPos << 8; - newVal |= wait; - - win->downArrowCounter = newVal; -} - -static void TryEraseDownArrow(struct Window *win) -{ - win->downArrowCounter = 0; - if (PlayerCanInterruptDelay(win) == TRUE) - EraseAtCursor(win); -} - -// unused -u16 Text_GetWindowTilemapEntry(struct Window *win, u8 x, u8 y) -{ - u16 *tilemap = win->tilemap; - return tilemap[32 * y + x]; -} - -// unused -void Text_FillWindowBorder(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) -{ - u8 i; - u16 *buffer = &win->tilemap[top * 32]; - - // Fill top border - for (i = left; i <= right; i++) - buffer[i] = tilemapEntry; - - for (i = top + 1; i < bottom - 1; i++) - { - buffer += 32; - // left border - buffer[left] = tilemapEntry; - // right border - buffer[right] = tilemapEntry; - } - - // Fill bottom border - if (top != bottom) - { - buffer += 32; - for (i = left; i <= right; i++) - buffer[i] = tilemapEntry; - } -} - -// unused -void DrawWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) -{ - Text_FillWindowBorder(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); -} - -// Fills the whole window area with tilemapEntry -void Text_FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) -{ - u16 *buffer = &win->tilemap[top * 32]; - while (top++ <= bottom) - { - u8 x; - for (x = left; x <= right; x++) - buffer[x] = tilemapEntry; - buffer += 32; - } -} - -void Text_FillWindowRectDefPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) -{ - Text_FillWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); -} - -void Text_EraseWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) -{ - Text_FillWindowRectDefPalette(win, 0, left, top, right, bottom); -} - -void Text_BlankWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) -{ - u16 tileNum = GetBlankTileNum(win); - Text_FillWindowRectDefPalette(win, tileNum, left, top, right, bottom); -} - -static u16 GetBlankTileNum(struct Window *win) -{ - u16 retVal = win->tileDataStartOffset; - - switch (win->textMode) - { - case TEXT_MODE_UNKNOWN0: - break; - case TEXT_MODE_UNKNOWN2: - retVal++; - break; - case TEXT_MODE_MONOSPACE: - switch (win->fontNum) - { - case 1: - case 2: - case 4: - case 5: - retVal += 212; - case 0: - case 3: - case 6: - break; - default: - retVal = 0; - } - break; - } - - return retVal; -} - -static s32 sub_80048D8(struct Window *win, u8 x, u8 y) -{ - win->cursorX = x; - win->cursorY = y & 0xF8; -} - -static u8 GetGlyphWidth(struct Window *win, u32 glyph) -{ - u8 width = 8; - -#ifdef BUGFIX_GLYPHWIDTH - if (win->language != LANGUAGE_JAPANESE) -#else - if (win->language == LANGUAGE_ENGLISH) -#endif - { - width = win->spacing; - if (!win->spacing) - { - switch (win->fontNum) - { - case 3: - width = sFont3Widths[glyph]; - break; - case 4: - case 5: - width = sFont4Widths[sFontType1Map[2 * glyph + 1]]; - break; - case 0: - width = sFont0Widths[glyph]; - break; - case 1: - case 2: - width = sFont1Widths[sFontType1Map[2 * glyph + 1]]; - break; - case 6: - width = 8; - break; - default: - width = 8; - } - } - } - - return width; -} - -u8 GetExtCtrlCodeLength(u8 code) -{ - u8 length = 0; - if (code <= 0x16) - length = sExtCtrlCodeLengths[code]; - return length; -} - -u8 *AlignInt1(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - u8 temp[16]; - u8 width; - switch (alignType) - { - case 0: - ConvertIntToDecimalString(temp, value); - dest = StringCopy(dest, temp); - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - break; - case 1: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, temp); - break; - case 2: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, temp); - if (alignAmount > width) - { - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) -{ - u8 temp[16]; - u8 width; - switch (alignType) - { - case 0: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - dest = StringCopy(dest, temp); - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 17; - dest[2] = alignAmount - width; - dest += 3; - *dest = 0xFF; - break; - case 1: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 17; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, temp); - break; - case 2: - ConvertIntToDecimalString(temp, value); - width = GetStringWidth(win, temp); - if (alignAmount > width) - { - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 17; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, temp); - if (alignAmount > width) - { - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 17; - dest[2] = (alignAmount - width) / 2; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) -{ - u8 width; - switch (alignType) - { - case 0: - dest = StringCopy(dest, src); - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - break; - case 1: - width = GetStringWidth(win, src); - if (alignAmount > width) - { - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 19; - dest[2] = alignAmount - width; - dest += 3; - } - dest = StringCopy(dest, src); - break; - case 2: - width = GetStringWidth(win, src); - if (alignAmount > width) - { - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 19; - dest[2] = (alignAmount - width) / 2; - dest += 3; - } - dest = StringCopy(dest, src); - if (alignAmount > width) - { - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 19; - dest[2] = alignAmount; - dest += 3; - *dest = 0xFF; - } - break; - } - return dest; -} - -u8 GetStringWidth(struct Window *win, const u8 *s) -{ - u8 width = 0; - u8 savedFontNum = win->fontNum; - u8 savedLanguage = win->language; - u8 savedSpacing = win->spacing; - s32 i = 0; - - while (s[i] != EOS) - { - u8 c = s[i]; - switch (c) - { - case PLACEHOLDER_BEGIN: - { - u8 temp; - i++; - temp = win->language; - width += GetStringWidth(win, GetExpandedPlaceholder(s[i])); - win->language = temp; - i++; - break; - } - case EXT_CTRL_CODE_BEGIN: - i++; - switch (s[i]) - { - case 6: - win->fontNum = s[i + 1]; - break; - case 7: - win->fontNum = win->template->fontNum; - break; - case 0x11: - width += s[i + 1]; - break; - case 0x12: - case 0x13: - if (width < s[i + 1]) - width = s[i + 1]; - break; - case 0x14: - win->spacing = s[i + 1]; - break; - case 0x15: - win->language = LANGUAGE_JAPANESE; - break; - case 0x16: - win->language = GAME_LANGUAGE; - break; - } - - i += GetExtCtrlCodeLength(s[i]); - break; - default: - i++; - width += GetGlyphWidth(win, c); - } - } - - win->spacing = savedSpacing; - win->language = savedLanguage; - win->fontNum = savedFontNum; - - return width; -} - -u8 Text_InitWindow8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) -{ - Text_InitWindow8002E4C(win, text, tileDataStartOffset, left, top, a6); - return Text_PrintWindow8002F44(win); -} - -u8 Text_InitWindow8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) -{ - u8 width = GetStringWidth(win, text); - Text_InitWindow(win, text, tileDataStartOffset, left - ((u32)(width + 7) >> 3), top); - EraseAtCursor(win); - width &= 7; - if (width) - width = 8 - width; - sub_80048D8(win, width, 0); - return Text_PrintWindow8002F44(win); -} - -u8 Text_InitWindow8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6) -{ - register u32 val asm("r5") = (u8)((a6 >> 1) - (GetStringWidth(win, text) >> 1)); - left += (val >> 3); - Text_InitWindow(win, text, tileDataStartOffset, left, top); - EraseAtCursor(win); - sub_80048D8(win, val & 7, 0); - return Text_PrintWindow8002F44(win); -} - -u8 Text_GetWindowPaletteNum(struct Window *win) -{ - return win->paletteNum; -} - -void Text_GetTextColors(struct Window *win, u8 *foreground, u8 *background, u8 *shadow) -{ - *foreground = win->foregroundColor; - *background = win->backgroundColor; - *shadow = win->shadowColor; -} - -void Text_InitWindow8004E3C(const struct WindowTemplate *winTemplate, u8 *tileData, const u8 *text) -{ - sTempWindow.template = winTemplate; - Text_InitWindow(&sTempWindow, text, 0, 0, 0); - sTempWindow.tileData = tileData; - Text_PrintWindow8002F44(&sTempWindow); -} - -u8 Text_GetStringWidthFromWindowTemplate(const struct WindowTemplate *winTemplate, const u8 *s) -{ - sTempWindow.template = winTemplate; - Text_InitWindow(&sTempWindow, s, 0, 0, 0); - return GetStringWidth(&sTempWindow, s); -} - -void ConvertInternationalString(u8 *s, u8 language) -{ - if (language == LANGUAGE_JAPANESE) - { - u8 i; - - Text_StripExtCtrlCodes(s); - i = StringLength(s); - s[i++] = EXT_CTRL_CODE_BEGIN; - s[i++] = 22; - s[i++] = EOS; - - i--; - - while (i != (u8)-1) - { - s[i + 2] = s[i]; - i--; - } - - s[0] = EXT_CTRL_CODE_BEGIN; - s[1] = 21; - } -} - -void Text_StripExtCtrlCodes(u8 *str) -{ - u16 srcIndex = 0; - u16 destIndex = 0; - while (str[srcIndex] != EOS) - { - if (str[srcIndex] == EXT_CTRL_CODE_BEGIN) - { - srcIndex++; - srcIndex += GetExtCtrlCodeLength(str[srcIndex]); - } - else - { - str[destIndex++] = str[srcIndex++]; - } - } - str[destIndex] = EOS; -} - -static const u8 *SkipExtCtrlCode(const u8 *s) -{ - while (*s == EXT_CTRL_CODE_BEGIN) - { - s++; - s += GetExtCtrlCodeLength(*s); - } - - return s; -} - -s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2) -{ - s32 retVal = 0; - - while (1) - { - str1 = SkipExtCtrlCode(str1); - str2 = SkipExtCtrlCode(str2); - - if (*str1 > *str2) - break; - - if (*str1 < *str2) - { - retVal = -1; - if (*str2 == 0xFF) - retVal = 1; - } - - if (*str1 == 0xFF) - return retVal; - - str1++; - str2++; - } - - retVal = 1; - - if (*str1 == 0xFF) - retVal = -1; - - return retVal; -} - -u8 sub_8004FD0(struct Window *win, u8 *dest, const u8 *src, u16 tileDataStartOffset, u8 left, u16 top, u8 width, u32 a8) -{ - u8 newlineCount = 0; - u8 extCtrlCodeLength; - u8 *start; - u32 endsWithoutNewline; - - if (dest == NULL) - dest = gStringVar4; - - start = dest; - endsWithoutNewline = FALSE; - - while (*src != 0xFF) - { - switch (*src) - { - default: - *dest = *src; - dest++; - src++; - endsWithoutNewline = TRUE; - break; - case 0xFC: - extCtrlCodeLength = GetExtCtrlCodeLength(src[1]) + 1; - memcpy(dest, src, extCtrlCodeLength); - dest += extCtrlCodeLength; - src += extCtrlCodeLength; - break; - case 0xFE: - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = width; - dest[3] = 0xFE; - dest += 4; - src++; - newlineCount++; - endsWithoutNewline = FALSE; - break; - } - } - - dest[0] = 0xFC; - dest[1] = 19; - dest[2] = width; - dest[3] = 0xFF; - - if (endsWithoutNewline) - newlineCount++; - - Text_InitWindow8002E4C(win, start, tileDataStartOffset, left, top, a8); - Text_PrintWindow8002F44(win); - - return newlineCount; -} - -static s32 DrawGlyphTile_UnshadowedFont(struct GlyphTileInfo *glyphTileInfo) -{ - struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; - u32 colors[2]; - u32 *buffer = glyphTileInfo->dest; - const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; - u32 mask1 = masks[0] | masks[2]; - - glyphBuffer->pixelRows[0] = buffer[0] & mask1; - glyphBuffer->pixelRows[1] = buffer[1] & mask1; - glyphBuffer->pixelRows[2] = buffer[2] & mask1; - glyphBuffer->pixelRows[3] = buffer[3] & mask1; - glyphBuffer->pixelRows[4] = buffer[4] & mask1; - glyphBuffer->pixelRows[5] = buffer[5] & mask1; - glyphBuffer->pixelRows[6] = buffer[6] & mask1; - glyphBuffer->pixelRows[7] = buffer[7] & mask1; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - u32 mask2 = masks[1]; - if (glyphTileInfo->textMode == TEXT_MODE_UNKNOWN2) - { - glyphBuffer->pixelRows[8] = buffer[8] & mask2; - glyphBuffer->pixelRows[9] = buffer[9] & mask2; - glyphBuffer->pixelRows[10] = buffer[10] & mask2; - glyphBuffer->pixelRows[11] = buffer[11] & mask2; - glyphBuffer->pixelRows[12] = buffer[12] & mask2; - glyphBuffer->pixelRows[13] = buffer[13] & mask2; - glyphBuffer->pixelRows[14] = buffer[14] & mask2; - glyphBuffer->pixelRows[15] = buffer[15] & mask2; - } - else - { - glyphBuffer->pixelRows[8] = buffer[16] & mask2; - glyphBuffer->pixelRows[9] = buffer[17] & mask2; - glyphBuffer->pixelRows[10] = buffer[18] & mask2; - glyphBuffer->pixelRows[11] = buffer[19] & mask2; - glyphBuffer->pixelRows[12] = buffer[20] & mask2; - glyphBuffer->pixelRows[13] = buffer[21] & mask2; - glyphBuffer->pixelRows[14] = buffer[22] & mask2; - glyphBuffer->pixelRows[15] = buffer[23] & mask2; - } - } - - colors[0] = glyphTileInfo->colors[0]; - colors[1] = glyphTileInfo->colors[15]; - - sShiftGlyphTileUnshadowedFuncs[glyphTileInfo->width](glyphBuffer, glyphTileInfo->src, colors, glyphTileInfo->startPixel); - - buffer[0] = glyphBuffer->pixelRows[0]; - buffer[1] = glyphBuffer->pixelRows[1]; - buffer[2] = glyphBuffer->pixelRows[2]; - buffer[3] = glyphBuffer->pixelRows[3]; - buffer[4] = glyphBuffer->pixelRows[4]; - buffer[5] = glyphBuffer->pixelRows[5]; - buffer[6] = glyphBuffer->pixelRows[6]; - buffer[7] = glyphBuffer->pixelRows[7]; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - if (glyphTileInfo->textMode != TEXT_MODE_UNKNOWN2) - buffer += 8; - buffer[8] = glyphBuffer->pixelRows[8]; - buffer[9] = glyphBuffer->pixelRows[9]; - buffer[10] = glyphBuffer->pixelRows[10]; - buffer[11] = glyphBuffer->pixelRows[11]; - buffer[12] = glyphBuffer->pixelRows[12]; - buffer[13] = glyphBuffer->pixelRows[13]; - buffer[14] = glyphBuffer->pixelRows[14]; - buffer[15] = glyphBuffer->pixelRows[15]; - } - - return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; -} - -static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *a3, u8 startPixel) -{ -} - -static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = colors[src[i] >> 7]; - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - // XXX: why 4? - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20) - | (colors[(src[i] >> 1) & 1] << 24); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 7) & 1] << 0) - | (colors[(src[i] >> 6) & 1] << 4) - | (colors[(src[i] >> 5) & 1] << 8) - | (colors[(src[i] >> 4) & 1] << 12) - | (colors[(src[i] >> 3) & 1] << 16) - | (colors[(src[i] >> 2) & 1] << 20) - | (colors[(src[i] >> 1) & 1] << 24) - | (colors[(src[i] >> 0) & 1] << 28); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *glyphTileInfo) -{ - struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; - u32 *buffer = glyphTileInfo->dest; - const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; - u32 mask1 = masks[0] | masks[2]; - - glyphBuffer->pixelRows[0] = buffer[0] & mask1; - glyphBuffer->pixelRows[1] = buffer[1] & mask1; - glyphBuffer->pixelRows[2] = buffer[2] & mask1; - glyphBuffer->pixelRows[3] = buffer[3] & mask1; - glyphBuffer->pixelRows[4] = buffer[4] & mask1; - glyphBuffer->pixelRows[5] = buffer[5] & mask1; - glyphBuffer->pixelRows[6] = buffer[6] & mask1; - glyphBuffer->pixelRows[7] = buffer[7] & mask1; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - u32 mask2 = masks[1]; - if (glyphTileInfo->textMode == TEXT_MODE_UNKNOWN2) - { - glyphBuffer->pixelRows[8] = buffer[8] & mask2; - glyphBuffer->pixelRows[9] = buffer[9] & mask2; - glyphBuffer->pixelRows[10] = buffer[10] & mask2; - glyphBuffer->pixelRows[11] = buffer[11] & mask2; - glyphBuffer->pixelRows[12] = buffer[12] & mask2; - glyphBuffer->pixelRows[13] = buffer[13] & mask2; - glyphBuffer->pixelRows[14] = buffer[14] & mask2; - glyphBuffer->pixelRows[15] = buffer[15] & mask2; - } - else - { - glyphBuffer->pixelRows[8] = buffer[16] & mask2; - glyphBuffer->pixelRows[9] = buffer[17] & mask2; - glyphBuffer->pixelRows[10] = buffer[18] & mask2; - glyphBuffer->pixelRows[11] = buffer[19] & mask2; - glyphBuffer->pixelRows[12] = buffer[20] & mask2; - glyphBuffer->pixelRows[13] = buffer[21] & mask2; - glyphBuffer->pixelRows[14] = buffer[22] & mask2; - glyphBuffer->pixelRows[15] = buffer[23] & mask2; - } - } - - sShiftGlyphTileShadowedFuncs[glyphTileInfo->width](glyphBuffer, (u32 *)glyphTileInfo->src, glyphTileInfo->colors, glyphTileInfo->startPixel); - - buffer[0] = glyphBuffer->pixelRows[0]; - buffer[1] = glyphBuffer->pixelRows[1]; - buffer[2] = glyphBuffer->pixelRows[2]; - buffer[3] = glyphBuffer->pixelRows[3]; - buffer[4] = glyphBuffer->pixelRows[4]; - buffer[5] = glyphBuffer->pixelRows[5]; - buffer[6] = glyphBuffer->pixelRows[6]; - buffer[7] = glyphBuffer->pixelRows[7]; - - if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) - { - if (glyphTileInfo->textMode != TEXT_MODE_UNKNOWN2) - buffer += 8; - buffer[8] = glyphBuffer->pixelRows[8]; - buffer[9] = glyphBuffer->pixelRows[9]; - buffer[10] = glyphBuffer->pixelRows[10]; - buffer[11] = glyphBuffer->pixelRows[11]; - buffer[12] = glyphBuffer->pixelRows[12]; - buffer[13] = glyphBuffer->pixelRows[13]; - buffer[14] = glyphBuffer->pixelRows[14]; - buffer[15] = glyphBuffer->pixelRows[15]; - } - - return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; -} - -static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ -} - -static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = colors[src[i] & 0xF]; - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4) - | (colors[(src[i] >> 8) & 0xF] << 8); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u8 i; - for (i = 0; i < 8; i++) - { - u32 val = (colors[(src[i] >> 0) & 0xF] << 0) - | (colors[(src[i] >> 4) & 0xF] << 4) - | (colors[(src[i] >> 8) & 0xF] << 8) - | (colors[(src[i] >> 12) & 0xF] << 12); - u32 *dest = &glyphBuffer->pixelRows[i]; - dest[0] |= val << shiftAmount->left; - dest[8] |= val >> shiftAmount->right; - } -} - -#define SHIFT_GLYPH_WIDTH5_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH5_STEP(0) - SHIFT_GLYPH_WIDTH5_STEP(1) - SHIFT_GLYPH_WIDTH5_STEP(2) - SHIFT_GLYPH_WIDTH5_STEP(3) - SHIFT_GLYPH_WIDTH5_STEP(4) - SHIFT_GLYPH_WIDTH5_STEP(5) - SHIFT_GLYPH_WIDTH5_STEP(6) - SHIFT_GLYPH_WIDTH5_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH6_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH6_STEP(0) - SHIFT_GLYPH_WIDTH6_STEP(1) - SHIFT_GLYPH_WIDTH6_STEP(2) - SHIFT_GLYPH_WIDTH6_STEP(3) - SHIFT_GLYPH_WIDTH6_STEP(4) - SHIFT_GLYPH_WIDTH6_STEP(5) - SHIFT_GLYPH_WIDTH6_STEP(6) - SHIFT_GLYPH_WIDTH6_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH7_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20) \ - | (colors[(src[i] >> 24) & 0xF] << 24); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH7_STEP(0) - SHIFT_GLYPH_WIDTH7_STEP(1) - SHIFT_GLYPH_WIDTH7_STEP(2) - SHIFT_GLYPH_WIDTH7_STEP(3) - SHIFT_GLYPH_WIDTH7_STEP(4) - SHIFT_GLYPH_WIDTH7_STEP(5) - SHIFT_GLYPH_WIDTH7_STEP(6) - SHIFT_GLYPH_WIDTH7_STEP(7) -} - -#define SHIFT_GLYPH_WIDTH8_STEP(i) \ -val = (colors[(src[i] >> 0) & 0xF] << 0) \ - | (colors[(src[i] >> 4) & 0xF] << 4) \ - | (colors[(src[i] >> 8) & 0xF] << 8) \ - | (colors[(src[i] >> 12) & 0xF] << 12) \ - | (colors[(src[i] >> 16) & 0xF] << 16) \ - | (colors[(src[i] >> 20) & 0xF] << 20) \ - | (colors[(src[i] >> 24) & 0xF] << 24) \ - | (colors[(src[i] >> 28) ] << 28); \ -glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ -glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ - -static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) -{ - const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; - u32 val; - SHIFT_GLYPH_WIDTH8_STEP(0) - SHIFT_GLYPH_WIDTH8_STEP(1) - SHIFT_GLYPH_WIDTH8_STEP(2) - SHIFT_GLYPH_WIDTH8_STEP(3) - SHIFT_GLYPH_WIDTH8_STEP(4) - SHIFT_GLYPH_WIDTH8_STEP(5) - SHIFT_GLYPH_WIDTH8_STEP(6) - SHIFT_GLYPH_WIDTH8_STEP(7) -} - -static s32 DrawGlyphTiles(struct Window *win, u32 glyph, u32 glyphWidth) -{ - struct GlyphTileInfo glyphTileInfo; - u8 *upperTile; - u8 *lowerTile; - s32 retVal = 0; - - GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); - glyphTileInfo.textMode = win->textMode; - glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; - glyphTileInfo.width = glyphWidth; - glyphTileInfo.src = upperTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); - glyphTileInfo.colors = sGlyphBuffer.colors; - - switch (win->fontNum) - { - case 0: - case 1: - case 2: - case 6: - DrawGlyphTile_UnshadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - retVal = DrawGlyphTile_UnshadowedFont(&glyphTileInfo); - break; - case 3: - case 4: - case 5: - DrawGlyphTile_ShadowedFont(&glyphTileInfo); - glyphTileInfo.src = lowerTile; - glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); - retVal = DrawGlyphTile_ShadowedFont(&glyphTileInfo); - break; - } - - return retVal; -} - -static void UpdateTilemap(struct Window *win, u32 tilesWidth) -{ - u16 *tilemap = GetCursorTilemapPointer(win); - if (tilesWidth && tilemap) - { - u16 paletteNum = (win->paletteNum << 12); - u16 upperLeftTileNum = GetCursorTileNum(win, 0, 0); - u16 lowerLeftTileNum = GetCursorTileNum(win, 0, 1); - tilemap[0] = upperLeftTileNum | paletteNum; - tilemap[32] = lowerLeftTileNum | paletteNum; - if (tilesWidth == 2) - { - u16 upperRightTileNum = GetCursorTileNum(win, 1, 0); - u16 lowerRightTileNum = GetCursorTileNum(win, 1, 1); - tilemap[1] = upperRightTileNum | paletteNum; - tilemap[33] = lowerRightTileNum | paletteNum; - } - } -} - -static u16 GetCursorTileNum(struct Window *win, u32 xOffset, u32 yOffset) -{ - u16 index; - - if (win->textMode == TEXT_MODE_UNKNOWN2) - index = win->tileDataStartOffset - + win->tileDataOffset - + (((win->top + win->cursorY) >> 3) + yOffset) * win->width - + (((win->left + win->cursorX) >> 3) + xOffset); - else - index = win->tileDataStartOffset + win->tileDataOffset + 2 * xOffset + yOffset; - - return index; -} diff --git a/src/engine/text_window.c b/src/engine/text_window.c deleted file mode 100644 index ade349f4e..000000000 --- a/src/engine/text_window.c +++ /dev/null @@ -1,275 +0,0 @@ -#include "global.h" -#include "text_window.h" -#include "main.h" -#include "palette.h" -#include "text.h" - -#define STD_WINDOW_PALETTE_NUM 14 - -// Dimensions (in tiles) of a field dialogue frame -#define STD_DLG_FRAME_LEFT 0 -#define STD_DLG_FRAME_TOP 14 -#define STD_DLG_FRAME_WIDTH 26 -#define STD_DLG_FRAME_HEIGHT 4 - -static void LoadTextWindowTiles(u8, void *); -static void LoadTextWindowPalette(u8, u8); -static void DrawStandardFrame(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom); -static u16 GetDialogueFrameTilemapEntry(u16 tilemapEntry, u8 x, u8 y, u8 width, u8 height); -static void DrawDialogueFrame(struct Window *win, u8 left, u8 top, u8 width, u8 height); - -static u16 sTextWindowBaseTileNum; -static u16 sDialogueFrameBaseTileNum; - -extern const u8 gTextWindowFrame1_Gfx[]; -extern const u8 gTextWindowFrame2_Gfx[]; -extern const u8 gTextWindowFrame3_Gfx[]; -extern const u8 gTextWindowFrame4_Gfx[]; -extern const u8 gTextWindowFrame5_Gfx[]; -extern const u8 gTextWindowFrame6_Gfx[]; -extern const u8 gTextWindowFrame7_Gfx[]; -extern const u8 gTextWindowFrame8_Gfx[]; -extern const u8 gTextWindowFrame9_Gfx[]; -extern const u8 gTextWindowFrame10_Gfx[]; -extern const u8 gTextWindowFrame11_Gfx[]; -extern const u8 gTextWindowFrame12_Gfx[]; -extern const u8 gTextWindowFrame13_Gfx[]; -extern const u8 gTextWindowFrame14_Gfx[]; -extern const u8 gTextWindowFrame15_Gfx[]; -extern const u8 gTextWindowFrame16_Gfx[]; -extern const u8 gTextWindowFrame17_Gfx[]; -extern const u8 gTextWindowFrame18_Gfx[]; -extern const u8 gTextWindowFrame19_Gfx[]; -extern const u8 gTextWindowFrame20_Gfx[]; - -extern const u16 gTextWindowFrame1_Pal[]; -extern const u16 gTextWindowFrame2_Pal[]; -extern const u16 gTextWindowFrame3_Pal[]; -extern const u16 gTextWindowFrame4_Pal[]; -extern const u16 gTextWindowFrame5_Pal[]; -extern const u16 gTextWindowFrame6_Pal[]; -extern const u16 gTextWindowFrame7_Pal[]; -extern const u16 gTextWindowFrame8_Pal[]; -extern const u16 gTextWindowFrame9_Pal[]; -extern const u16 gTextWindowFrame10_Pal[]; -extern const u16 gTextWindowFrame11_Pal[]; -extern const u16 gTextWindowFrame12_Pal[]; -extern const u16 gTextWindowFrame13_Pal[]; -extern const u16 gTextWindowFrame14_Pal[]; -extern const u16 gTextWindowFrame15_Pal[]; -extern const u16 gTextWindowFrame16_Pal[]; -extern const u16 gTextWindowFrame17_Pal[]; -extern const u16 gTextWindowFrame18_Pal[]; -extern const u16 gTextWindowFrame19_Pal[]; -extern const u16 gTextWindowFrame20_Pal[]; - -extern const u8 gDialogueFrame_Gfx[]; - -static const struct FrameGraphics sTextWindowFrameGraphics[20] = -{ - {gTextWindowFrame1_Gfx, gTextWindowFrame1_Pal}, - {gTextWindowFrame2_Gfx, gTextWindowFrame2_Pal}, - {gTextWindowFrame3_Gfx, gTextWindowFrame3_Pal}, - {gTextWindowFrame4_Gfx, gTextWindowFrame4_Pal}, - {gTextWindowFrame5_Gfx, gTextWindowFrame5_Pal}, - {gTextWindowFrame6_Gfx, gTextWindowFrame6_Pal}, - {gTextWindowFrame7_Gfx, gTextWindowFrame7_Pal}, - {gTextWindowFrame8_Gfx, gTextWindowFrame8_Pal}, - {gTextWindowFrame9_Gfx, gTextWindowFrame9_Pal}, - {gTextWindowFrame10_Gfx, gTextWindowFrame10_Pal}, - {gTextWindowFrame11_Gfx, gTextWindowFrame11_Pal}, - {gTextWindowFrame12_Gfx, gTextWindowFrame12_Pal}, - {gTextWindowFrame13_Gfx, gTextWindowFrame13_Pal}, - {gTextWindowFrame14_Gfx, gTextWindowFrame14_Pal}, - {gTextWindowFrame15_Gfx, gTextWindowFrame15_Pal}, - {gTextWindowFrame16_Gfx, gTextWindowFrame16_Pal}, - {gTextWindowFrame17_Gfx, gTextWindowFrame17_Pal}, - {gTextWindowFrame18_Gfx, gTextWindowFrame18_Pal}, - {gTextWindowFrame19_Gfx, gTextWindowFrame19_Pal}, - {gTextWindowFrame20_Gfx, gTextWindowFrame20_Pal}, -}; - -static const u16 sDialogueFrameTilemap[5][7] = -{ - {1, 3, 4, 4, 5, 6, 9}, - {11, 9, 9, 9, 9, 0x040B, 9}, - {7, 9, 9, 9, 9, 10, 9}, - {0x080B, 9, 9, 9, 9, 0x0C0B, 9}, - {0x0801, 0x0803, 0x0804, 0x0804, 0x0805, 0x0806, 9}, -}; - -u16 TextWindow_SetBaseTileNum(u16 baseTileNum) -{ - sTextWindowBaseTileNum = baseTileNum; - return baseTileNum + 9; -} - -// Loads the tiles and palette of the window frame into VRAM using the selected frame type -void TextWindow_LoadStdFrameGraphics(struct Window *win) -{ - u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; - LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); - LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, STD_WINDOW_PALETTE_NUM); -} - -// Loads the tiles and palette of the window frame into VRAM with an alternate palette -void TextWindow_LoadStdFrameGraphicsOverridePal(struct Window *win, u8 palSlot) -{ - u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; - LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); - LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, palSlot); -} - -// Loads the tiles and palette of the window frame into VRAM with an alternate frame type -void TextWindow_LoadStdFrameGraphicsOverrideStyle(struct Window *win, u8 frameType) -{ - u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; - LoadTextWindowTiles(frameType, tileData); - LoadTextWindowPalette(frameType, STD_WINDOW_PALETTE_NUM); -} - -void TextWindow_DrawStdFrame(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) -{ - DrawStandardFrame(win->template->tilemap, sTextWindowBaseTileNum, left, top, right, bottom); -} - -// Returns the tile data and palette for the specified frame type -const struct FrameGraphics *TextWindow_GetFrameGraphics(u8 frameType) -{ - if (frameType > 19) - return &sTextWindowFrameGraphics[0]; - else - return &sTextWindowFrameGraphics[frameType]; -} - -static void LoadTextWindowTiles(u8 frameType, void *dest) -{ - const struct FrameGraphics *frameGraphics = TextWindow_GetFrameGraphics(frameType); - CpuFastCopy(frameGraphics->tiles, dest, 9 * TILE_SIZE_4BPP); -} - -static void LoadTextWindowPalette(u8 frameType, u8 palSlot) -{ - const struct FrameGraphics *frameGraphics = TextWindow_GetFrameGraphics(frameType); - LoadPalette(frameGraphics->palette, 16 * palSlot, 0x20); -} - -// Draws a standard window frame -static void DrawStandardFrame(u16 *tilemap, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom) -{ - u8 startX = min(left, right); - u8 endX = max(left, right); - u8 startY = min(top, bottom); - u8 endY = max(top, bottom); - u8 x, y; - - // top left corner - tilemap[32 * startY + startX] = baseTileNum | (STD_WINDOW_PALETTE_NUM << 12); - - // top border - for (x = startX + 1; x < endX; x++) - tilemap[32 * startY + x] = (baseTileNum + 1) | (STD_WINDOW_PALETTE_NUM << 12); - - // top right corner - tilemap[32 * startY + endX] = (baseTileNum + 2) | (STD_WINDOW_PALETTE_NUM << 12); - - for (y = startY + 1; y < endY; y++) - { - // left border - tilemap[32 * y + startX] = (baseTileNum + 3) | (STD_WINDOW_PALETTE_NUM << 12); - - // middle - for (x = startX + 1; x < endX; x++) - tilemap[32 * y + x] = (baseTileNum + 4) | (STD_WINDOW_PALETTE_NUM << 12); - - // right border - tilemap[32 * y + endX] = (baseTileNum + 5) | (STD_WINDOW_PALETTE_NUM << 12); - } - - // bottom left corner - tilemap[32 * endY + startX] = (baseTileNum + 6) | (STD_WINDOW_PALETTE_NUM << 12); - - // bottom border - for (x = startX + 1; x < endX; x++) - tilemap[32 * endY + x] = (baseTileNum + 7) | (STD_WINDOW_PALETTE_NUM << 12); - - // bottom right corner - tilemap[32 * endY + endX] = (baseTileNum + 8) | (STD_WINDOW_PALETTE_NUM << 12); -} - -u16 TextWindow_SetDlgFrameBaseTileNum(u16 baseTileNum) -{ - sDialogueFrameBaseTileNum = baseTileNum; - return baseTileNum + 14; -} - -void unref_sub_80651DC(struct Window *win, u8 *text) -{ - Text_InitWindow8002EB0(win, text, sDialogueFrameBaseTileNum + 14, 2, 15); -} - -// Loads and draws a dialogue window frame -void TextWindow_DisplayDialogueFrame(struct Window *win) -{ - TextWindow_LoadDialogueFrameTiles(win); - TextWindow_DrawDialogueFrame(win); -} - -static u16 GetDialogueFrameTilemapEntry(u16 baseTilemapEntry, u8 x, u8 y, u8 width, u8 height) -{ - u16 tilemapEntry = 9; - - if (y >= height) - y = y - height + 3; - else if (y > 1) - y = 2; - - if (x >= width + 2) - x = x - (width + 2) + 4; - else if (x > 2) - x = 3; - - if (x < 7 && y < 5) - tilemapEntry = sDialogueFrameTilemap[y][x]; - - tilemapEntry += baseTilemapEntry; - - return tilemapEntry; -} - -static void DrawDialogueFrame(struct Window *win, u8 left, u8 top, u8 width, u8 height) -{ - u8 x, y; - u16 baseTilemapEntry = (win->paletteNum << 12) | sDialogueFrameBaseTileNum; - u16 *tilemap = win->template->tilemap; - - for (y = 0; y < height + 2; y++) - { - for (x = 0; x < width + 6; x++) - tilemap[(left + x) + 32 * (top + y)] = (win->paletteNum << 12) | GetDialogueFrameTilemapEntry(baseTilemapEntry, x, y, width, height); - } -} - -// Draws an alternate styled frame used for dialogue windows that appear on the overworld -void TextWindow_DrawDialogueFrame(struct Window *win) -{ - DrawDialogueFrame(win, STD_DLG_FRAME_LEFT, STD_DLG_FRAME_TOP, STD_DLG_FRAME_WIDTH, STD_DLG_FRAME_HEIGHT); -} - -// Loads the dialogue window frame tiles into VRAM -void TextWindow_LoadDialogueFrameTiles(struct Window *win) -{ - u8 *tileData = win->template->tileData; - CpuFastCopy(gDialogueFrame_Gfx, tileData + 32 * sDialogueFrameBaseTileNum, 14 * TILE_SIZE_4BPP); -} - -// Erases a dialogue window frame -void TextWindow_EraseDialogueFrame(struct Window *win) -{ - u8 i; - u16 *tilemap = win->template->tilemap + (STD_DLG_FRAME_TOP * 32); - u16 tilemapEntry = win->paletteNum << 12; - - for (i = 0; i < ((STD_DLG_FRAME_HEIGHT + 2) * 32); i++) - tilemap[i] = tilemapEntry; -} diff --git a/src/engine/tileset_anim.c b/src/engine/tileset_anim.c deleted file mode 100644 index abd38edad..000000000 --- a/src/engine/tileset_anim.c +++ /dev/null @@ -1,991 +0,0 @@ -#include "global.h" -#include "tileset_anim.h" - -struct Dma -{ - const void *src; - const void *dest; - u16 size; -}; - -EWRAM_DATA static struct Dma gTilesetAnimDmas[20] = {0}; - -static u8 gNumTilesetAnimDmas; -static u16 gTileset1AnimFrame; -static u16 gTileset1AnimLength; -static u16 gTileset2AnimFrame; -static u16 gTileset2AnimLength; -static void (*gTileset1AnimCallback)(u16); -static void (*gTileset2AnimCallback)(u16); - -static void StartTileset1Animation(void); -static void StartTileset2Animation(void); - -static void sub_8073014(u16); -static void sub_8073058(u16); - -static void sub_8073070(u16); -static void sub_8073098(u16); -static void sub_80730C0(u16); -static void sub_80730E8(u16); -static void sub_807361C(u16); - -static void sub_8073424(u16); -static void sub_80734A0(u16); -static void sub_8073514(u16); -static void sub_8073540(u16); -static void sub_80735B4(u16); -static void sub_80735E4(u16); -static void sub_80738A8(u16); -static void sub_8073600(u16); -static void sub_80738C0(u16); -static void sub_8073890(u16); -static void sub_80738EC(u16); - -static void sub_80737A4(u16, u8); -static void sub_80737E0(u16); -static void sub_8073704(u16, u8); -static void sub_8073644(u8); -static void sub_8073808(u16); -static void sub_8073830(u16, u8); -static void sub_807368C(u8); -static void sub_80736DC(u8); -static void sub_80736B4(u8); -static void sub_8073868(u16); - -static void sub_8073904(u16); -static void sub_80739C4(u16); -static void sub_807392C(u16); -static void sub_807399C(u16); -static void sub_8073974(u16); -static void sub_80739EC(u16); - -static const u8 TilesetAnimTiles_General_0_1[] = INCBIN_U8("data/tilesets/primary/general/anim/0/1.4bpp"); -static const u8 TilesetAnimTiles_General_0_0[] = INCBIN_U8("data/tilesets/primary/general/anim/0/0.4bpp"); -static const u8 TilesetAnimTiles_General_0_2[] = INCBIN_U8("data/tilesets/primary/general/anim/0/2.4bpp"); -asm(".space 32"); - -static const u8 *const gTilesetAnimTable_General_0[] = -{ - TilesetAnimTiles_General_0_0, - TilesetAnimTiles_General_0_1, - TilesetAnimTiles_General_0_0, - TilesetAnimTiles_General_0_2, -}; - -static const u8 TilesetAnimTiles_General_1_0[] = INCBIN_U8("data/tilesets/primary/general/anim/1/0.4bpp"); -static const u8 TilesetAnimTiles_General_1_1[] = INCBIN_U8("data/tilesets/primary/general/anim/1/1.4bpp"); -static const u8 TilesetAnimTiles_General_1_2[] = INCBIN_U8("data/tilesets/primary/general/anim/1/2.4bpp"); -static const u8 TilesetAnimTiles_General_1_3[] = INCBIN_U8("data/tilesets/primary/general/anim/1/3.4bpp"); -static const u8 TilesetAnimTiles_General_1_4[] = INCBIN_U8("data/tilesets/primary/general/anim/1/4.4bpp"); -static const u8 TilesetAnimTiles_General_1_5[] = INCBIN_U8("data/tilesets/primary/general/anim/1/5.4bpp"); -static const u8 TilesetAnimTiles_General_1_6[] = INCBIN_U8("data/tilesets/primary/general/anim/1/6.4bpp"); -static const u8 TilesetAnimTiles_General_1_7[] = INCBIN_U8("data/tilesets/primary/general/anim/1/7.4bpp"); - -static const u8 *const gTilesetAnimTable_General_1[] = -{ - TilesetAnimTiles_General_1_0, - TilesetAnimTiles_General_1_1, - TilesetAnimTiles_General_1_2, - TilesetAnimTiles_General_1_3, - TilesetAnimTiles_General_1_4, - TilesetAnimTiles_General_1_5, - TilesetAnimTiles_General_1_6, - TilesetAnimTiles_General_1_7, -}; - -static const u8 TilesetAnimTiles_General_2_0[] = INCBIN_U8("data/tilesets/primary/general/anim/2/0.4bpp"); -static const u8 TilesetAnimTiles_General_2_1[] = INCBIN_U8("data/tilesets/primary/general/anim/2/1.4bpp"); -static const u8 TilesetAnimTiles_General_2_2[] = INCBIN_U8("data/tilesets/primary/general/anim/2/2.4bpp"); -static const u8 TilesetAnimTiles_General_2_3[] = INCBIN_U8("data/tilesets/primary/general/anim/2/3.4bpp"); -static const u8 TilesetAnimTiles_General_2_4[] = INCBIN_U8("data/tilesets/primary/general/anim/2/4.4bpp"); -static const u8 TilesetAnimTiles_General_2_5[] = INCBIN_U8("data/tilesets/primary/general/anim/2/5.4bpp"); -static const u8 TilesetAnimTiles_General_2_6[] = INCBIN_U8("data/tilesets/primary/general/anim/2/6.4bpp"); - -static const u8 *const gTilesetAnimTable_General_2[] = -{ - TilesetAnimTiles_General_2_0, - TilesetAnimTiles_General_2_1, - TilesetAnimTiles_General_2_2, - TilesetAnimTiles_General_2_3, - TilesetAnimTiles_General_2_4, - TilesetAnimTiles_General_2_5, - TilesetAnimTiles_General_2_6, - TilesetAnimTiles_General_2_0, -}; - -static const u8 TilesetAnimTiles_General_3_0[] = INCBIN_U8("data/tilesets/primary/general/anim/3/0.4bpp"); -static const u8 TilesetAnimTiles_General_3_1[] = INCBIN_U8("data/tilesets/primary/general/anim/3/1.4bpp"); -static const u8 TilesetAnimTiles_General_3_2[] = INCBIN_U8("data/tilesets/primary/general/anim/3/2.4bpp"); -static const u8 TilesetAnimTiles_General_3_3[] = INCBIN_U8("data/tilesets/primary/general/anim/3/3.4bpp"); - -static const u8 *const gTilesetAnimTable_General_3[] = -{ - TilesetAnimTiles_General_3_0, - TilesetAnimTiles_General_3_1, - TilesetAnimTiles_General_3_2, - TilesetAnimTiles_General_3_3, -}; - -static const u8 TilesetAnimTiles_General_4_0[] = INCBIN_U8("data/tilesets/primary/general/anim/4/0.4bpp"); -static const u8 TilesetAnimTiles_General_4_1[] = INCBIN_U8("data/tilesets/primary/general/anim/4/1.4bpp"); -static const u8 TilesetAnimTiles_General_4_2[] = INCBIN_U8("data/tilesets/primary/general/anim/4/2.4bpp"); -static const u8 TilesetAnimTiles_General_4_3[] = INCBIN_U8("data/tilesets/primary/general/anim/4/3.4bpp"); - -static const u8 *const gTilesetAnimTable_General_4[] = -{ - TilesetAnimTiles_General_4_0, - TilesetAnimTiles_General_4_1, - TilesetAnimTiles_General_4_2, - TilesetAnimTiles_General_4_3, -}; - -static const u8 TilesetAnimTiles_Lavaridge_0[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/0.4bpp"); -static const u8 TilesetAnimTiles_Lavaridge_1[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/1.4bpp"); -static const u8 TilesetAnimTiles_Lavaridge_2[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/2.4bpp"); -static const u8 TilesetAnimTiles_Lavaridge_3[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/3.4bpp"); - -static const u8 *const gTilesetAnimTable_Lavaridge[] = -{ - TilesetAnimTiles_Lavaridge_0, - TilesetAnimTiles_Lavaridge_1, - TilesetAnimTiles_Lavaridge_2, - TilesetAnimTiles_Lavaridge_3, -}; - -static const u8 TilesetAnimTiles_Pacifidlog_0_0[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/0.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_0_1[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/1.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_0_2[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/2.4bpp"); - -static const u8 *const gTilesetAnimTable_Pacifidlog_0[] = -{ - TilesetAnimTiles_Pacifidlog_0_0, - TilesetAnimTiles_Pacifidlog_0_1, - TilesetAnimTiles_Pacifidlog_0_2, - TilesetAnimTiles_Pacifidlog_0_1, -}; - -static const u8 TilesetAnimTiles_Underwater_0[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/0.4bpp"); -static const u8 TilesetAnimTiles_Underwater_1[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/1.4bpp"); -static const u8 TilesetAnimTiles_Underwater_2[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/2.4bpp"); -static const u8 TilesetAnimTiles_Underwater_3[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/3.4bpp"); - -static const u8 *const gTilesetAnimTable_Underwater[] = -{ - TilesetAnimTiles_Underwater_0, - TilesetAnimTiles_Underwater_1, - TilesetAnimTiles_Underwater_2, - TilesetAnimTiles_Underwater_3, -}; - -static const u8 TilesetAnimTiles_Pacifidlog_1_0[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/0.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_1_1[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/1.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_1_2[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/2.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_1_3[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/3.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_1_4[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/4.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_1_5[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/5.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_1_6[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/6.4bpp"); -static const u8 TilesetAnimTiles_Pacifidlog_1_7[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/7.4bpp"); - -static const u8 *const gTilesetAnimTable_Pacifidlog_1[] = -{ - TilesetAnimTiles_Pacifidlog_1_0, - TilesetAnimTiles_Pacifidlog_1_1, - TilesetAnimTiles_Pacifidlog_1_2, - TilesetAnimTiles_Pacifidlog_1_3, - TilesetAnimTiles_Pacifidlog_1_4, - TilesetAnimTiles_Pacifidlog_1_5, - TilesetAnimTiles_Pacifidlog_1_6, - TilesetAnimTiles_Pacifidlog_1_7, -}; - -static const u8 TilesetAnimTiles_Mauville_0_0[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/0.4bpp"); -static const u8 TilesetAnimTiles_Mauville_0_1[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/1.4bpp"); -static const u8 TilesetAnimTiles_Mauville_0_2[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/2.4bpp"); -static const u8 TilesetAnimTiles_Mauville_0_3[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/3.4bpp"); -static const u8 TilesetAnimTiles_Mauville_0_4[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/4.4bpp"); - -static const u8 TilesetAnimTiles_Mauville_1_0[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/0.4bpp"); -static const u8 TilesetAnimTiles_Mauville_1_1[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/1.4bpp"); -static const u8 TilesetAnimTiles_Mauville_1_2[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/2.4bpp"); -static const u8 TilesetAnimTiles_Mauville_1_3[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/3.4bpp"); -static const u8 TilesetAnimTiles_Mauville_1_4[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/4.4bpp"); - -static const void *const gUnknown_0837BAE4[] = -{ - (void *)(VRAM + 0x4C00), - (void *)(VRAM + 0x4C80), - (void *)(VRAM + 0x4D00), - (void *)(VRAM + 0x4D80), - (void *)(VRAM + 0x4E00), - (void *)(VRAM + 0x4E80), - (void *)(VRAM + 0x4F00), - (void *)(VRAM + 0x4F80), -}; - -static const void *const gUnknown_0837BB04[] = -{ - (void *)(VRAM + 0x5000), - (void *)(VRAM + 0x5080), - (void *)(VRAM + 0x5100), - (void *)(VRAM + 0x5180), - (void *)(VRAM + 0x5200), - (void *)(VRAM + 0x5280), - (void *)(VRAM + 0x5300), - (void *)(VRAM + 0x5380), -}; - -static const u8 *const gTilesetAnimTable_Mauville_0A[] = -{ - TilesetAnimTiles_Mauville_0_0, - TilesetAnimTiles_Mauville_0_0, - TilesetAnimTiles_Mauville_0_1, - TilesetAnimTiles_Mauville_0_2, - TilesetAnimTiles_Mauville_0_3, - TilesetAnimTiles_Mauville_0_3, - TilesetAnimTiles_Mauville_0_3, - TilesetAnimTiles_Mauville_0_3, - TilesetAnimTiles_Mauville_0_3, - TilesetAnimTiles_Mauville_0_3, - TilesetAnimTiles_Mauville_0_2, - TilesetAnimTiles_Mauville_0_1, -}; - -static const u8 *const gTilesetAnimTable_Mauville_1A[] = -{ - TilesetAnimTiles_Mauville_1_0, - TilesetAnimTiles_Mauville_1_0, - TilesetAnimTiles_Mauville_1_1, - TilesetAnimTiles_Mauville_1_2, - TilesetAnimTiles_Mauville_1_3, - TilesetAnimTiles_Mauville_1_3, - TilesetAnimTiles_Mauville_1_3, - TilesetAnimTiles_Mauville_1_3, - TilesetAnimTiles_Mauville_1_3, - TilesetAnimTiles_Mauville_1_3, - TilesetAnimTiles_Mauville_1_2, - TilesetAnimTiles_Mauville_1_1, -}; - -static const u8 *const gTilesetAnimTable_Mauville_0B[] = -{ - TilesetAnimTiles_Mauville_0_0, - TilesetAnimTiles_Mauville_0_0, - TilesetAnimTiles_Mauville_0_4, - TilesetAnimTiles_Mauville_0_4, -}; - -static const u8 *const gTilesetAnimTable_Mauville_1B[] = -{ - TilesetAnimTiles_Mauville_1_0, - TilesetAnimTiles_Mauville_1_0, - TilesetAnimTiles_Mauville_1_4, - TilesetAnimTiles_Mauville_1_4, -}; - -static const u8 TilesetAnimTiles_Rustboro_0_0[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/0.4bpp"); -static const u8 TilesetAnimTiles_Rustboro_0_1[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/1.4bpp"); -static const u8 TilesetAnimTiles_Rustboro_0_2[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/2.4bpp"); -static const u8 TilesetAnimTiles_Rustboro_0_3[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/3.4bpp"); -static const u8 TilesetAnimTiles_Rustboro_0_4[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/4.4bpp"); -static const u8 TilesetAnimTiles_Rustboro_0_5[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/5.4bpp"); -static const u8 TilesetAnimTiles_Rustboro_0_6[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/6.4bpp"); -static const u8 TilesetAnimTiles_Rustboro_0_7[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/7.4bpp"); - -static const void *const gUnknown_0837BFA4[] = -{ - (void *)(VRAM + 0x5000), - (void *)(VRAM + 0x5080), - (void *)(VRAM + 0x5100), - (void *)(VRAM + 0x5180), - (void *)(VRAM + 0x5200), - (void *)(VRAM + 0x5280), - (void *)(VRAM + 0x5300), - (void *)(VRAM + 0x5380), -}; - -static const u8 *const gTilesetAnimTable_Rustboro_0[] = -{ - TilesetAnimTiles_Rustboro_0_0, - TilesetAnimTiles_Rustboro_0_1, - TilesetAnimTiles_Rustboro_0_2, - TilesetAnimTiles_Rustboro_0_3, - TilesetAnimTiles_Rustboro_0_4, - TilesetAnimTiles_Rustboro_0_5, - TilesetAnimTiles_Rustboro_0_6, - TilesetAnimTiles_Rustboro_0_7, -}; - -static const u8 TilesetAnimTiles_Rustboro_1_0[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/1/0.4bpp"); -static const u8 TilesetAnimTiles_Rustboro_1_1[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/1/1.4bpp"); - -static const u8 *const gTilesetAnimTable_Rustboro_1[] = -{ - TilesetAnimTiles_Rustboro_1_0, - TilesetAnimTiles_Rustboro_1_1, -}; - -static const u8 TilesetAnimTiles_Cave_0[] = INCBIN_U8("data/tilesets/secondary/cave/anim/0.4bpp"); -static const u8 TilesetAnimTiles_Cave_1[] = INCBIN_U8("data/tilesets/secondary/cave/anim/1.4bpp"); -static const u8 TilesetAnimTiles_Cave_2[] = INCBIN_U8("data/tilesets/secondary/cave/anim/2.4bpp"); -static const u8 TilesetAnimTiles_Cave_3[] = INCBIN_U8("data/tilesets/secondary/cave/anim/3.4bpp"); -// unused anim tiles for cave -static const u8 TilesetAnimTiles_Cave_4[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/0.4bpp"); -static const u8 TilesetAnimTiles_Cave_5[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/1.4bpp"); -static const u8 TilesetAnimTiles_Cave_6[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/2.4bpp"); -static const u8 TilesetAnimTiles_Cave_7[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/3.4bpp"); -asm(".space 32"); - -static const u8 *const gTilesetAnimTable_Cave[] = -{ - TilesetAnimTiles_Cave_0, - TilesetAnimTiles_Cave_1, - TilesetAnimTiles_Cave_2, - TilesetAnimTiles_Cave_3, -}; - -static const u8 TilesetAnimTiles_EverGrande_0[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/0.4bpp"); -static const u8 TilesetAnimTiles_EverGrande_1[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/1.4bpp"); -static const u8 TilesetAnimTiles_EverGrande_2[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/2.4bpp"); -static const u8 TilesetAnimTiles_EverGrande_3[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/3.4bpp"); -static const u8 TilesetAnimTiles_EverGrande_4[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/4.4bpp"); -static const u8 TilesetAnimTiles_EverGrande_5[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/5.4bpp"); -static const u8 TilesetAnimTiles_EverGrande_6[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/6.4bpp"); -static const u8 TilesetAnimTiles_EverGrande_7[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/7.4bpp"); -asm(".space 32"); - -static const void *const gUnknown_0837C93C[] = -{ - (void *)(VRAM + 0x5C00), - (void *)(VRAM + 0x5C80), - (void *)(VRAM + 0x5D00), - (void *)(VRAM + 0x5D80), - (void *)(VRAM + 0x5E00), - (void *)(VRAM + 0x5E80), - (void *)(VRAM + 0x5F00), - (void *)(VRAM + 0x5F80), -}; - -static const u8 *const gTilesetAnimTable_EverGrande[] = -{ - TilesetAnimTiles_EverGrande_0, - TilesetAnimTiles_EverGrande_1, - TilesetAnimTiles_EverGrande_2, - TilesetAnimTiles_EverGrande_3, - TilesetAnimTiles_EverGrande_4, - TilesetAnimTiles_EverGrande_5, - TilesetAnimTiles_EverGrande_6, - TilesetAnimTiles_EverGrande_7, -}; - -static const u8 TilesetAnimTiles_Building_0[] = INCBIN_U8("data/tilesets/primary/building/anim/0.4bpp"); -static const u8 TilesetAnimTiles_Building_1[] = INCBIN_U8("data/tilesets/primary/building/anim/1.4bpp"); - -static const u8 *const gTilesetAnimTable_Building[] = -{ - TilesetAnimTiles_Building_0, - TilesetAnimTiles_Building_1, -}; - -static const u8 TilesetAnimTiles_SootopolisGym_0_0[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/0.4bpp"); -static const u8 TilesetAnimTiles_SootopolisGym_0_1[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/1.4bpp"); -static const u8 TilesetAnimTiles_SootopolisGym_0_2[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/2.4bpp"); -static const u8 TilesetAnimTiles_SootopolisGym_1_0[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/0.4bpp"); -static const u8 TilesetAnimTiles_SootopolisGym_1_1[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/1.4bpp"); -static const u8 TilesetAnimTiles_SootopolisGym_1_2[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/2.4bpp"); - -static const u8 *const gTilesetAnimTable_SootopolisGym_0[] = -{ - TilesetAnimTiles_SootopolisGym_0_0, - TilesetAnimTiles_SootopolisGym_0_1, - TilesetAnimTiles_SootopolisGym_0_2, -}; - -static const u8 *const gTilesetAnimTable_SootopolisGym_1[] = -{ - TilesetAnimTiles_SootopolisGym_1_0, - TilesetAnimTiles_SootopolisGym_1_1, - TilesetAnimTiles_SootopolisGym_1_2, -}; - -static const u8 TilesetAnimTiles_EliteFour_1_0[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/1/0.4bpp"); -static const u8 TilesetAnimTiles_EliteFour_1_1[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/1/1.4bpp"); -static const u8 TilesetAnimTiles_EliteFour_0_0[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/0.4bpp"); -static const u8 TilesetAnimTiles_EliteFour_0_1[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/1.4bpp"); -static const u8 TilesetAnimTiles_EliteFour_0_2[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/2.4bpp"); -static const u8 TilesetAnimTiles_EliteFour_0_3[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/3.4bpp"); -asm(".space 32"); - -static const u8 *const gTilesetAnimTable_EliteFour_0[] = -{ - TilesetAnimTiles_EliteFour_0_0, - TilesetAnimTiles_EliteFour_0_1, - TilesetAnimTiles_EliteFour_0_2, - TilesetAnimTiles_EliteFour_0_3, -}; - -static const u8 *const gTilesetAnimTable_EliteFour_1[] = -{ - TilesetAnimTiles_EliteFour_1_0, - TilesetAnimTiles_EliteFour_1_1, -}; - -static const u8 TilesetAnimTiles_MauvilleGym_0[] = INCBIN_U8("data/tilesets/secondary/mauville_gym/anim/0.4bpp"); -static const u8 TilesetAnimTiles_MauvilleGym_1[] = INCBIN_U8("data/tilesets/secondary/mauville_gym/anim/1.4bpp"); -asm(".space 32"); - -static const u8 *const gTilesetAnimTable_MauvilleGym[] = -{ - TilesetAnimTiles_MauvilleGym_0, - TilesetAnimTiles_MauvilleGym_1, -}; - -static const u8 TilesetAnimTiles_BikeShop_0[] = INCBIN_U8("data/tilesets/secondary/bike_shop/anim/0.4bpp"); -static const u8 TilesetAnimTiles_BikeShop_1[] = INCBIN_U8("data/tilesets/secondary/bike_shop/anim/1.4bpp"); -asm(".space 32"); - -static const u8 *const gTilesetAnimTable_BikeShop[] = -{ - TilesetAnimTiles_BikeShop_0, - TilesetAnimTiles_BikeShop_1, -}; - -static void ClearTilesetAnimDmas(void) -{ - gNumTilesetAnimDmas = 0; - CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas)); -} - -static void QueueTilesetAnimDma(const void *src, const void *dest, u16 size) -{ - if (gNumTilesetAnimDmas < 20) - { - gTilesetAnimDmas[gNumTilesetAnimDmas].src = src; - gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest; - gTilesetAnimDmas[gNumTilesetAnimDmas].size = size; - gNumTilesetAnimDmas++; - } -} - -void sub_8072E74(void) -{ - int i; - for (i = 0; i < gNumTilesetAnimDmas; i++) - { - DmaCopy16(3, - gTilesetAnimDmas[i].src, - gTilesetAnimDmas[i].dest, - gTilesetAnimDmas[i].size); - } - gNumTilesetAnimDmas = 0; -} - -void cur_mapheader_run_tileset_funcs_after_some_cpuset(void) -{ - ClearTilesetAnimDmas(); - StartTileset1Animation(); - StartTileset2Animation(); -} - -void sub_8072ED0(void) -{ - StartTileset2Animation(); -} - -void sub_8072EDC(void) -{ - ClearTilesetAnimDmas(); - if (++gTileset1AnimFrame >= gTileset1AnimLength) - { - gTileset1AnimFrame = 0; - } - if (++gTileset2AnimFrame >= gTileset2AnimLength) - { - gTileset2AnimFrame = 0; - } - if (gTileset1AnimCallback) - { - gTileset1AnimCallback(gTileset1AnimFrame); - } - if (gTileset2AnimCallback) - { - gTileset2AnimCallback(gTileset2AnimFrame); - } -} - -static void StartTileset1Animation(void) -{ - gTileset1AnimFrame = 0; - gTileset1AnimLength = 0; - gTileset1AnimCallback = 0; - if (gMapHeader.mapData->primaryTileset) - { - if (gMapHeader.mapData->primaryTileset->callback) - { - gMapHeader.mapData->primaryTileset->callback(); - } - } -} - -static void StartTileset2Animation(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = 0; - gTileset2AnimCallback = 0; - if (gMapHeader.mapData->secondaryTileset) - { - if (gMapHeader.mapData->secondaryTileset->callback) - { - gMapHeader.mapData->secondaryTileset->callback(); - } - } -} - -void TilesetCB_General(void) -{ - gTileset1AnimFrame = 0; - gTileset1AnimLength = 0x100; - gTileset1AnimCallback = sub_8073014; -} - -void TilesetCB_Building(void) -{ - gTileset1AnimFrame = 0; - gTileset1AnimLength = 0x100; - gTileset1AnimCallback = sub_8073058; -} - -static void sub_8073014(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 0) sub_8073070(a1 / 0x10); - if (v1 == 1) sub_8073098(a1 / 0x10); - if (v1 == 2) sub_80730C0(a1 / 0x10); - if (v1 == 3) sub_80730E8(a1 / 0x10); - if (v1 == 4) sub_807361C(a1 / 0x10); -} - -static void sub_8073058(u16 a1) -{ - if (a1 % 8 == 0) - { - sub_8073904(a1 / 8); - } -} - -static void sub_8073070(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1], BG_TILE_ADDR(127), 0x80); -} - -static void sub_8073098(u16 a1) -{ - u8 v1; - v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1], BG_TILE_ADDR(108), 0x3c0); -} - -static void sub_80730C0(u16 a1) -{ - int v1; - v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1], BG_TILE_ADDR(116), 0x140); -} - -static void sub_80730E8(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1], BG_TILE_ADDR(124), 0xc0); -} - -void TilesetCB_Petalburg(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Rustboro(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073424; -} - -void TilesetCB_Dewford(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Slateport(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Mauville(void) -{ - gTileset2AnimFrame = gTileset1AnimFrame; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_80734A0; -} - -void TilesetCB_Lavaridge(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073514; -} - -void TilesetCB_Fallarbor(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Fortree(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Lilycove(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Mossdeep(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_EverGrande(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073540; -} - -void TilesetCB_Pacifidlog(void) -{ - gTileset2AnimFrame = gTileset1AnimFrame; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_80735B4; -} - -void TilesetCB_Sootopolis(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = 0; -} - -void TilesetCB_Underwater(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = 0x80; - gTileset2AnimCallback = sub_80735E4; -} - -void TilesetCB_SootopolisGym(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = 0xf0; - gTileset2AnimCallback = sub_80738A8; -} - -void TilesetCB_Cave(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073600; -} - -void TilesetCB_EliteFour(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = 0x80; - gTileset2AnimCallback = sub_80738C0; -} - -void TilesetCB_MauvilleGym(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_8073890; -} - -void TilesetCB_BikeShop(void) -{ - gTileset2AnimFrame = 0; - gTileset2AnimLength = gTileset1AnimLength; - gTileset2AnimCallback = sub_80738EC; -} - -static void sub_8073424(u16 a1) -{ - int v1; - v1 = a1 % 8; - if (v1 == 0) - { - sub_80737A4(a1 / 8, 0); - sub_80737E0(a1 / 8); - } - if (v1 == 1) sub_80737A4(a1 / 8, 1); - if (v1 == 2) sub_80737A4(a1 / 8, 2); - if (v1 == 3) sub_80737A4(a1 / 8, 3); - if (v1 == 4) sub_80737A4(a1 / 8, 4); - if (v1 == 5) sub_80737A4(a1 / 8, 5); - if (v1 == 6) sub_80737A4(a1 / 8, 6); - if (v1 == 7) sub_80737A4(a1 / 8, 7); -} - -static void sub_80734A0(u16 a1) -{ - int v1; - v1 = a1 % 8; - if (v1 == 0) sub_8073704(a1 / 8, 0); - if (v1 == 1) sub_8073704(a1 / 8, 1); - if (v1 == 2) sub_8073704(a1 / 8, 2); - if (v1 == 3) sub_8073704(a1 / 8, 3); - if (v1 == 4) sub_8073704(a1 / 8, 4); - if (v1 == 5) sub_8073704(a1 / 8, 5); - if (v1 == 6) sub_8073704(a1 / 8, 6); - if (v1 == 7) sub_8073704(a1 / 8, 7); -} - -static void sub_8073514(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 0) sub_8073644(a1 / 0x10); - if (v1 == 1) sub_8073808(a1 / 0x10); -} - -static void sub_8073540(u16 a1) -{ - int v1; - v1 = a1 % 8; - if (v1 == 0) sub_8073830(a1 / 8, 0); - if (v1 == 1) sub_8073830(a1 / 8, 1); - if (v1 == 2) sub_8073830(a1 / 8, 2); - if (v1 == 3) sub_8073830(a1 / 8, 3); - if (v1 == 4) sub_8073830(a1 / 8, 4); - if (v1 == 5) sub_8073830(a1 / 8, 5); - if (v1 == 6) sub_8073830(a1 / 8, 6); - if (v1 == 7) sub_8073830(a1 / 8, 7); -} - -static void sub_80735B4(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 0) sub_807368C(a1 / 0x10); - if (v1 == 1) sub_80736DC(a1 / 0x10); -} - -static void sub_80735E4(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 0) sub_80736B4(a1 / 0x10); -} - -static void sub_8073600(u16 a1) -{ - int v1; - v1 = a1 % 0x10; - if (v1 == 1) sub_8073868(a1 / 0x10); -} - -static void sub_807361C(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1], BG_TILE_ADDR(120), 0x140); -} - -static void sub_8073644(u8 a1) -{ - u8 v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], BG_TILE_ADDR(200), 0x80); - v1 = (a1 + 2) % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], BG_TILE_ADDR(201), 0x80); -} - -static void sub_807368C(u8 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1], BG_TILE_ADDR(244), 0x3c0); -} - -static void sub_80736B4(u8 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1], BG_TILE_ADDR(252), 0x80); -} - -static void sub_80736DC(u8 a1) -{ - int v1; - v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1], BG_TILE_ADDR(252), 0x100); -} - -static void sub_8073704(u16 a1, u8 a2) -{ - int v1; - a1 -= a2; - if (a1 < 12) - { - v1 = a1 % 12; - QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1], gUnknown_0837BAE4[a2], 0x80); - QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1], gUnknown_0837BB04[a2], 0x80); - } - else - { - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1], gUnknown_0837BAE4[a2], 0x80); - QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1], gUnknown_0837BB04[a2], 0x80); - } -} - -static void sub_80737A4(u16 a1, u8 a2) -{ - int v1; - a1 -= a2; - - v1 = a1 % 8; - if (gTilesetAnimTable_Rustboro_0[v1]) - { - QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1], gUnknown_0837BFA4[a2], 0x80); - } -} - -static void sub_80737E0(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1], BG_TILE_ADDR(240), 0x80); -} - -static void sub_8073808(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], BG_TILE_ADDR(168), 0x80); -} - -static void sub_8073830(u16 a1, u8 a2) -{ - int v1; - a1 -= a2; - v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1], gUnknown_0837C93C[a2], 0x80); -} - -static void sub_8073868(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], BG_TILE_ADDR(232), 0x80); -} - -static void sub_8073890(u16 a1) -{ - int v1; - v1 = a1 % 2; - if (!v1) - { - sub_80739C4(a1 / 2); - } -} - -static void sub_80738A8(u16 a1) -{ - int v1; - v1 = a1 % 8; - if (!v1) - { - sub_807392C(a1 / 8); - } -} - -static void sub_80738C0(u16 a1) -{ - if (a1 % 0x40 == 0) - { - sub_807399C(a1 / 0x40); - } - if (a1 % 8 == 1) - { - sub_8073974(a1 / 8); - } -} - -static void sub_80738EC(u16 a1) -{ - if (a1 % 4 == 0) - { - sub_80739EC(a1 / 4); - } -} - -static void sub_8073904(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_Building[v1], BG_TILE_ADDR(124), 0x80); -} - -static void sub_807392C(u16 a1) -{ - int v1; - v1 = a1 % 3; - QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1], BG_TILE_ADDR(252), 0x180); - QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1], BG_TILE_ADDR(244), 0x280); -} - -static void sub_8073974(u16 a1) -{ - int v1; - v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1], BG_TILE_ADDR(254), 0x20); -} - -static void sub_807399C(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1], BG_TILE_ADDR(248), 0x80); -} - -static void sub_80739C4(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1], BG_TILE_ADDR(164), 0x200); -} - -static void sub_80739EC(u16 a1) -{ - int v1; - v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], BG_TILE_ADDR(252), 0x120); -} diff --git a/src/engine/time_events.c b/src/engine/time_events.c deleted file mode 100644 index 4bd732788..000000000 --- a/src/engine/time_events.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "global.h" -#include "time_events.h" -#include "event_data.h" -#include "field_weather.h" -#include "pokemon.h" -#include "random.h" -#include "overworld.h" -#include "rtc.h" -#include "script.h" -#include "task.h" - -static u32 GetMirageRnd(void) -{ - u32 hi = VarGet(VAR_MIRAGE_RND_H); - u32 lo = VarGet(VAR_MIRAGE_RND_L); - return (hi << 16) | lo; -} - -static void SetMirageRnd(u32 rnd) -{ - VarSet(VAR_MIRAGE_RND_H, rnd >> 16); - VarSet(VAR_MIRAGE_RND_L, rnd); -} - -// unused -void InitMirageRnd(void) -{ - SetMirageRnd((Random() << 16) | Random()); -} - -void UpdateMirageRnd(u16 days) -{ - s32 rnd = GetMirageRnd(); - while (days) - { - rnd = 1103515245 * rnd + 12345; - days--; - } - SetMirageRnd(rnd); -} - -bool8 IsMirageIslandPresent(void) -{ - u16 rnd = GetMirageRnd() >> 16; - int i; - - for (i = 0; i < PARTY_SIZE; i++) - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && (GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY) & 0xFFFF) == rnd) - return TRUE; - - return FALSE; -} - -void UpdateShoalTideFlag(void) -{ - static const u8 tide[] = - { - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - }; - - if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0())) - { - RtcCalcLocalTime(); - if (tide[gLocalTime.hours]) - FlagSet(FLAG_SYS_SHOAL_TIDE); - else - FlagClear(FLAG_SYS_SHOAL_TIDE); - } -} - -static void Task_WaitWeather(u8 taskId) -{ - if (IsWeatherChangeComplete()) - { - EnableBothScriptContexts(); - DestroyTask(taskId); - } -} - -void WaitWeather(void) -{ - CreateTask(Task_WaitWeather, 80); -} - -void InitBirchState(void) -{ - *(u16 *)GetVarPointer(VAR_BIRCH_STATE) = 0; -} - -void UpdateBirchState(u16 days) -{ - u16 *state = GetVarPointer(VAR_BIRCH_STATE); - *state += days; - *state %= 7; -} diff --git a/src/engine/trade.c b/src/engine/trade.c deleted file mode 100644 index 36e6fc757..000000000 --- a/src/engine/trade.c +++ /dev/null @@ -1,5692 +0,0 @@ -#include "global.h" -#include "name_string_util.h" -#include "string_util.h" -#include "text.h" -#include "main.h" -#include "constants/species.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "constants/easy_chat.h" -#include "link.h" -#include "strings2.h" -#include "graphics.h" -#include "palette.h" -#include "task.h" -#include "menu.h" -#include "text_window.h" -#include "pokemon_icon.h" -#include "cable_club.h" -#include "party_menu.h" -#include "constants/songs.h" -#include "sound.h" -#include "data2.h" -#include "pokemon_summary_screen.h" -#include "overworld.h" -#include "rom_8077ABC.h" -#include "daycare.h" -#include "event_data.h" -#include "strings.h" -#include "load_save.h" -#include "save.h" -#include "script.h" -#include "field_fadetransition.h" -#include "decompress.h" -#include "mail_data.h" -#include "evolution_scene.h" -#include "pokeball.h" -#include "pokedex.h" -#include "field_effect.h" -#include "util.h" -#include "battle_interface.h" -#include "trade.h" -#include "ewram.h" - -#ifdef ENGLISH -#define sub_804A96C_alt sub_804A96C -asm(".set sub_804A96C_alt, sub_804A96C"); -#endif - -#define Trade_SendData(ptr) (SendBlock(bitmask_all_link_players_but_self(), ptr->linkData, 20)) - -struct InGameTrade { - /*0x00*/ u8 name[11]; - /*0x0C*/ u16 species; - /*0x0E*/ u8 ivs[6]; - /*0x14*/ bool8 secondAbility; - /*0x18*/ u32 otId; - /*0x1C*/ u8 stats[5]; - /*0x24*/ u32 personality; - /*0x28*/ u16 heldItem; - /*0x2A*/ u8 mailNum; - /*0x2B*/ u8 otName[11]; - /*0x36*/ u8 otGender; - /*0x37*/ u8 sheen; - /*0x38*/ u16 playerSpecies; -}; - -struct UnkStructC { - /*0x00*/ u16 words[9]; - /*0x10*/ u8 string[8]; - /*0x1A*/ u8 otId[4]; - /*0x1E*/ u16 species; - /*0x20*/ u16 heldItem; -}; - -struct UnkStructD { - /*0x00*/ u8 filler_00[8]; - /*0x08*/ void *vramAddr; - /*0x0c*/ u8 filler_0c[4]; - /*0x10*/ u8 unk_10; - /*0x12*/ u16 unk_12[0x400]; -}; - -struct UnkStructE { - /*0x00*/ u8 unk_00; - /*0x02*/ u16 unk_02; - /*0x04*/ u8 unk_04; -}; - -struct TradeEwramSubstruct { - /*0x0000*/ u8 unk_0000; - /*0x0001*/ u8 unk_0001; - /*0x0004*/ struct Window window; - /*0x0034*/ u8 partyIcons[2][6]; - /*0x0040*/ u8 tradeMenuCursorSpriteIdx; - /*0x0041*/ u8 tradeMenuCursorPosition; - /*0x0042*/ u8 partyCounts[2]; - /*0x0044*/ u8 tradeMenuOptionsActive[13]; - /*0x0051*/ u8 unk_0051[2][6]; - /*0x005d*/ u8 unk_005d[2][6]; - /*0x005d*/ u8 unk_0069[2][6]; - /*0x0075*/ u8 unk_0075; - /*0x0076*/ u8 filler_0076[4]; - /*0x007a*/ u8 unk_007a; - /*0x007b*/ u8 unk_007b; - /*0x007c*/ u8 unk_007c; - /*0x007d*/ u8 unk_007d; - /*0x007e*/ u16 unk_007e; - /*0x0080*/ u8 unk_0080[2]; - /*0x0082*/ u8 unk_0082[2]; - /*0x0084*/ u8 unk_0084; - /*0x0085*/ u8 unk_0085; - /*0x0086*/ u8 unk_0086; - /*0x0087*/ u8 unk_0087; - /*0x0088*/ u8 filler_0088[2]; - /*0x008a*/ u8 unk_008a; - /*0x008c*/ u16 linkData[20]; - /*0x00b4*/ u8 unk_00b4; - /*0x00b5*/ u8 unk_00b5[11]; - /*0x00c0*/ u8 filler_00c0[8]; - /*0x00c8*/ struct UnkStructD unk_00c8; - /*0x08dc*/ struct UnkStructE unk_08dc[4]; - /*0x08fc*/ u8 filler_08fc[0x704]; -}; - -IWRAM_DATA u8 gUnknown_03000508[8]; - -struct UnkStructF { - u8 filler_0000[9]; - u8 unk_0009; - u8 filler_000a[0xff6]; -}; - -struct TradeEwramStruct { - /*0x00000*/ u8 filler_00000[0x7000]; - /*0x07000*/ struct TradeEwramSubstruct unk_07000; - /*0x08000*/ struct UnkStructF unk_08000; - /*0x09000*/ u8 filler_09000[0x4000]; - /*0x0d000*/ u8 tileBuffers[13][256]; - /*0x0dd00*/ u8 filler_0dd00[0x1300]; - /*0x0f000*/ struct TradeEwramSubstruct2 unk_0f000; -}; - -static void sub_8047EC0(void); -static void sub_804AFB8(const struct WindowTemplate *, u8 *, const u8 *, u8); -static void sub_804ACD8(const u8 *, u8 *, u8); -static void nullsub_5(u8, u8); -static void sub_804AA88(void); -static void sub_804A964(struct UnkStructD *, void *); -static void sub_80489F4(void); -static void sub_804AA0C(u8); -static bool8 sub_8048D44(void); -static void sub_804AF84(void); -static bool8 sub_804ABF8(void); -static void sub_804ACF4(u8); -static void sub_804A41C(u8); -static void sub_8048C70(void); -static void sub_8048B0C(u8); -static void sub_804AE3C(u8); -static void sub_804AF10(void); -static void sub_80494D8(void); -static void sub_8048AB4(void); -static void sub_804A940(struct UnkStructD *); -static void sub_804B41C(void); -static void sub_8049DE0(void); -static void sub_804AB30(void); -static void sub_8049ED4(u8); -static void sub_804A6DC(u8); -static void sub_804A938(struct UnkStructD *); -static void sub_804A9F4(u8); -static void sub_804AA00(u8); -static void sub_8049E9C(u8); -static void sub_804AADC(u16, u8); -static void sub_804A80C(void); -static u8 sub_80499F0(const u8 *, u8, u8); -static void sub_804A840(u8); -#ifdef NONMATCHING -static -#endif -u8 sub_804A2B4(u8 *, u8, u8); -static void sub_804A96C_alt(struct UnkStructD *, u8, u8, const u16 *, u8, u8, u16); -static void sub_804A96C(struct UnkStructD *, u8, u8, const u16 *, u8, u8, u16); -#ifdef NONMATCHING -static -#endif -void sub_804A33C(u8 *, u8, u8); -#ifdef NONMATCHING -static -#endif -void sub_804A51C(u8, u8, u8, u8, u8, u8); -static void sub_804D7AC(struct Sprite *); -static bool8 sub_804C29C(void); -static void sub_804DC18(void); -static u8 sub_804B2B0(void); -static void sub_804E144(void); -static void sub_804E1A0(u8); -static void sub_804DAD4(struct MailStruct *, const struct InGameTrade *); -static void sub_804DC88(void); -static void sub_804D6BC(struct Sprite *); -static void sub_804D738(struct Sprite *); -static void sub_804BBE8(u8); -static void sub_804B058(struct Sprite *); -static void sub_804B07C(struct Sprite *); -static void sub_804B0BC(struct Sprite *); -static void sub_804B104(struct Sprite *); -static void sub_804D80C(struct Sprite *); -static void sub_804E1DC(void); -static void sub_804BBCC(void); -static void sub_804D8E4(void); -static void sub_804C164(void); -static void sub_804C1A8(void); -#ifdef NONMATCHING -static -#endif -void sub_804DB84(void); - -EWRAM_DATA u8 *gUnknown_020296CC[13] = {0}; -EWRAM_DATA struct MailStruct gUnknown_02029700[6] = {0}; -EWRAM_DATA u8 gUnknown_020297D8[2] = {0}; - -extern struct TradeEwramSubstruct *gUnknown_03004824; - -const u32 unref_data_820ABD4[] = -{ - 0x00000890, - 0x00003AC0, - 0x0000001C, - 0x00000530, - 0x00000024, - 0x00000064, - 0x000004D8 -}; - -const u16 gTradeMovesBoxTilemap[] = INCBIN_U16("graphics/trade/moves_box_map.bin"); -const u16 gTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_map.bin"); -const u16 gTradeStripesBG2Tilemap[] = INCBIN_U16("graphics/trade/stripes_bg2_map.bin"); -const u16 gTradeStripesBG3Tilemap[] = INCBIN_U16("graphics/trade/stripes_bg3_map.bin"); - -const struct OamData gOamData_820BFEC = { - .shape = ST_OAM_H_RECTANGLE, - .size = 2, - .priority = 1 -}; - -const union AnimCmd gSpriteAnim_820BFF4[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_820BFFC[] = { - ANIMCMD_FRAME(8, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_820C004[] = { - ANIMCMD_FRAME(16, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_820C00C[] = { - ANIMCMD_FRAME(24, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_820C014[] = { - ANIMCMD_FRAME(32, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_820C01C[] = { - ANIMCMD_FRAME(40, 5), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_820C024[] = { - gSpriteAnim_820BFF4, - gSpriteAnim_820BFFC, - gSpriteAnim_820C004, - gSpriteAnim_820C00C, - gSpriteAnim_820C014, - gSpriteAnim_820C01C -}; - -const u16 TradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text1.gbapal"); -const u16 UnrefTradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text2.gbapal"); - -const struct SpriteSheet gUnknown_0820C07C[] = { - {ewram_2010000.tileBuffers[ 0], 256, 200}, - {ewram_2010000.tileBuffers[ 1], 256, 201}, - {ewram_2010000.tileBuffers[ 2], 256, 202}, - {ewram_2010000.tileBuffers[ 3], 256, 203}, - {ewram_2010000.tileBuffers[ 4], 256, 204}, - {ewram_2010000.tileBuffers[ 5], 256, 205}, - {ewram_2010000.tileBuffers[ 6], 256, 206}, - {ewram_2010000.tileBuffers[ 7], 256, 207}, - {ewram_2010000.tileBuffers[ 8], 256, 208}, - {ewram_2010000.tileBuffers[ 9], 256, 209}, - {ewram_2010000.tileBuffers[10], 256, 210}, - {ewram_2010000.tileBuffers[11], 256, 211}, - {ewram_2010000.tileBuffers[12], 256, 212}, -}; - -const struct SpritePalette gSpritePalette_TradeScreenText = { - TradeScreenTextPalette, 4925 -}; - -const struct SpriteTemplate gSpriteTemplate_820C0EC = { - 200, - 4925, - &gOamData_820BFEC, - gSpriteAnimTable_820C024, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -const struct OamData gOamData_820C104 = { - .shape = ST_OAM_H_RECTANGLE, - .size = 3, - .priority = 1 -}; - -const union AnimCmd gSpriteAnim_820C10C[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_820C114[] = { - ANIMCMD_FRAME(32, 5), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_820C11C[] = { - gSpriteAnim_820C10C, - gSpriteAnim_820C114 -}; - -const struct SpriteSheet gUnknown_0820C124 = { - gUnknown_08EA1DEC, 0x800, 300 -}; - -const struct SpritePalette gUnknown_0820C12C = { - gUnknown_08EA0328, 2345 -}; - -const struct SpriteTemplate gSpriteTemplate_820C134 = { - 300, - 2345, - &gOamData_820C104, - gSpriteAnimTable_820C11C, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -const u8 *const gUnknown_0820C14C[] = { - TradeText_Cancel, - TradeText_ChoosePoke, - TradeText_Summary1, - TradeText_Trade1, - TradeText_CancelTradePrompt, - TradeText_PressBToExit -}; - -// This is used to determine the next mon to select when the D-Pad is -// pressed in a given direction. -// Note that the mons are laid out like this. -// 0-5 are the player's party and 6-11 are the trading partner's party. -// 12 is the cancel button. -// 0 1 6 7 -// 2 3 8 9 -// 4 5 10 11 -// 12 - -const u8 gTradeNextSelectedMonTable[][4][6] = { - { - { 4, 2, 12, 12, 0, 0}, - { 2, 4, 12, 12, 0, 0}, - { 7, 6, 1, 0, 0, 0}, - { 1, 6, 7, 0, 0, 0} - }, { - { 5, 3, 12, 12, 0, 0}, - { 3, 5, 12, 12, 0, 0}, - { 0, 7, 6, 1, 0, 0}, - { 6, 7, 0, 1, 0, 0} - }, { - { 0, 0, 0, 0, 0, 0}, - { 4, 0, 0, 0, 0, 0}, - { 9, 8, 7, 6, 0, 0}, - { 3, 1, 0, 0, 0, 0} - }, { - { 1, 1, 1, 1, 0, 0}, - { 5, 1, 1, 1, 0, 0}, - { 2, 9, 8, 7, 0, 0}, - { 8, 9, 6, 6, 0, 0} - }, { - { 2, 2, 2, 2, 0, 0}, - { 0, 0, 0, 0, 0, 0}, - {11, 10, 9, 8, 7, 6}, - { 5, 3, 1, 0, 0, 0} - }, { - { 3, 3, 3, 3, 0, 0}, - { 1, 1, 1, 1, 0, 0}, - { 4, 4, 4, 4, 0, 0}, - {10, 8, 6, 0, 0, 0} - }, { - {10, 8, 12, 0, 0, 0}, - { 8, 10, 12, 0, 0, 0}, - { 1, 0, 0, 0, 0, 0}, - { 7, 0, 1, 0, 0, 0} - }, { - {12, 0, 0, 0, 0, 0}, - { 9, 12, 0, 0, 0, 0}, - { 6, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 0, 0} - }, { - { 6, 0, 0, 0, 0, 0}, - {10, 6, 0, 0, 0, 0}, - { 3, 2, 1, 0, 0, 0}, - { 9, 7, 0, 0, 0, 0} - }, { - { 7, 0, 0, 0, 0, 0}, - {11, 12, 0, 0, 0, 0}, - { 8, 0, 0, 0, 0, 0}, - { 2, 1, 0, 0, 0, 0} - }, { - { 8, 0, 0, 0, 0, 0}, - { 6, 0, 0, 0, 0, 0}, - { 5, 4, 3, 2, 1, 0}, - {11, 9, 7, 0, 0, 0} - }, { - { 9, 0, 0, 0, 0, 0}, - {12, 0, 0, 0, 0, 0}, - {10, 0, 0, 0, 0, 0}, - { 4, 2, 0, 0, 0, 0} - }, { - {11, 9, 7, 6, 0, 0}, - { 7, 6, 0, 0, 0, 0}, - {12, 0, 0, 0, 0, 0}, - {12, 0, 0, 0, 0, 0} - } -}; - -const u8 gTradeMonSpriteCoords[][2] = { - // Your party - {1, 5}, - {8, 5}, - {1, 10}, - {8, 10}, - {1, 15}, - {8, 15}, - - // Friend's party - {16, 5}, - {23, 5}, - {16, 10}, - {23, 10}, - {16, 15}, - {23, 15}, - - {23, 18} // CANCEL -}; - -const u8 gTradeLevelDisplayCoords[2][6][2] = { - { - // Your party - {5, 4}, - {12, 4}, - {5, 9}, - {12, 9}, - {5, 14}, - {12, 14}, - }, - { - // Friend's party - {20, 4}, - {27, 4}, - {20, 9}, - {27, 9}, - {20, 14}, - {27, 14} - } -}; - -const u8 gTradeMonBoxCoords[2][6][2] = { - { - // Your party - {1, 3}, - {8, 3}, - {1, 8}, - {8, 8}, - {1, 13}, - {8, 13}, - }, - { - // Friend's party - {16, 3}, - {23, 3}, - {16, 8}, - {23, 8}, - {16, 13}, - {23, 13} - } -}; - -const u8 gTradeUnknownSpriteCoords[][2][2] = { - { - { 59, 10}, - {179, 10}, - }, - { - { 59, 10}, - {179, 10} - } -}; - -const u8 *const gUnknown_0820C2F0[] = { - TradeText_LinkStandby, - TradeText_TradeCancelled, - TradeText_OnlyPoke, - TradeText_NonTradablePoke, - TradeText_WaitingForFriend, - TradeText_WantToTrade -}; - -const u8 gTradeMessageWindowRects[][4] = { - {8, 7, 22, 12}, - {8, 7, 22, 12}, - {6, 7, 24, 12}, - {6, 7, 24, 12}, - {8, 7, 22, 12}, - {7, 7, 23, 12} -}; - -const struct MenuAction2 gUnknown_0820C320[] = { - {TradeText_Summary2, sub_804A9F4}, - {TradeText_Trade2, sub_804AA00} -}; - -const u8 gUnknown_0820C330[][2] = { - { 0, 14}, - {15, 29} -}; - -const u8 gUnknown_0820C334[][2] = { - { 3, 5}, - { 3, 7}, - {18, 5}, - {18, 7} -}; - -const u8 gOtherText_Terminator[] = _(""); -const u8 gOtherText_MaleSymbol3[] = _("♂"); -const u8 gOtherText_FemaleSymbol3[] = _("♀"); -const u8 gOtherText_GenderlessSymbol[] = _("$"); - -u8 *const unref_data_820C344 = gTileBuffer; -const u8 unref_strings_820C348[][13] = { - _("かいめの そうしん"), - _("かいめの じゅしん"), - _("ポケモンアイコンセット"), - _("OBJテキストセット"), - _("セルセット"), - _("OBJテキストADD"), - _("システムメッセージADD"), - _("はいけいセット"), -}; - -const u8 gUnknown_0820C3B0[] = _("ヌケニン"); -const u8 unref_string_0820C3B5[] = _("こうかんせいりつ "); -const u8 unref_string_0820C3C3[] = _("だめだたらしいよ "); -const u8 gUnknown_0820C3D1[][2] = { - { 4, 3}, - {19, 3}, - { 0, 0} -}; - -const u16 gTradeBallPalette[] = INCBIN_U16("graphics/trade/ball.gbapal"); -const u32 gTradeBallTiles[] = INCBIN_U32("graphics/trade/ball.4bpp"); -const u16 gUnknown_0820C9F8[][16] = { - INCBIN_U16("graphics/trade/unknown.gbapal"), - INCBIN_U16("graphics/trade/gba.gbapal"), - INCBIN_U16("graphics/trade/shadow.gbapal"), - {}, - INCBIN_U16("graphics/trade/misc.gbapal") -}; - -const u32 gUnknown_0820CA98[] = INCBIN_U32("graphics/trade/gba.4bpp"); -const u32 gUnknown_0820CA98_2[] = INCBIN_U32("graphics/trade/shadow.4bpp"); -const u32 gUnknown_0820DD98[] = INCBIN_U32("graphics/trade/pokeball_symbol.8bpp"); -const u16 gUnknown_0820F798[] = INCBIN_U16("graphics/trade/shadow_map.bin"); -const u16 gUnknown_08210798[] = INCBIN_U16("graphics/trade/gba_map.bin"); -const u16 gUnknown_08211798[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); -const u16 gUnknown_08211F98[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); -const u16 unused_08212098[] = INCBIN_U16("graphics/unused/unknown/8212098.gbapal"); -const u16 gTradeCableEndPalette[] = INCBIN_U16("graphics/trade/cable_end.gbapal"); -const u16 unused_082120D8[] = INCBIN_U16("graphics/unused/unknown/82120D8.gbapal"); -const u16 nullpal_082120F8[16] = {}; -const u16 gTradeGlowPalette[] = INCBIN_U16("graphics/trade/glow.gbapal"); -const u32 gTradeGlow1Tiles[] = INCBIN_U32("graphics/trade/glow1.4bpp"); -const u32 gTradeGlow2Tiles[] = INCBIN_U32("graphics/trade/glow2.4bpp"); -const u32 gTradeCableEndTiles[] = INCBIN_U32("graphics/trade/cable_end.4bpp"); -const u32 gTradeGBAScreenTiles[] = INCBIN_U32("graphics/trade/gba_screen.4bpp"); -const u32 gUnknown_08213738[] = INCBIN_U32("graphics/trade/gba_affine.8bpp"); -const u16 gUnknown_08215778[] = INCBIN_U16("graphics/trade/gba_affine_map.bin"); - -const struct OamData gOamData_8215878 = { - .affineMode = 1, - .size = 1 -}; - -const union AnimCmd gSpriteAnim_8215880[] = { - ANIMCMD_FRAME( 0, 3), - ANIMCMD_FRAME( 4, 3), - ANIMCMD_FRAME( 8, 3), - ANIMCMD_FRAME(12, 3), - ANIMCMD_FRAME(16, 3), - ANIMCMD_FRAME(20, 3), - ANIMCMD_FRAME(24, 3), - ANIMCMD_FRAME(28, 3), - ANIMCMD_FRAME(32, 3), - ANIMCMD_FRAME(36, 3), - ANIMCMD_FRAME(40, 3), - ANIMCMD_FRAME(44, 3), - ANIMCMD_LOOP(1), - ANIMCMD_FRAME( 0, 3), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_82158BC[] = { - ANIMCMD_FRAME( 0, 3), - ANIMCMD_FRAME( 4, 3), - ANIMCMD_FRAME( 8, 3), - ANIMCMD_FRAME(12, 3), - ANIMCMD_FRAME(16, 3), - ANIMCMD_FRAME(20, 3), - ANIMCMD_FRAME(24, 3), - ANIMCMD_FRAME(28, 3), - ANIMCMD_FRAME(32, 3), - ANIMCMD_FRAME(36, 3), - ANIMCMD_FRAME(40, 3), - ANIMCMD_FRAME(44, 3), - ANIMCMD_LOOP(2), - ANIMCMD_FRAME( 0, 3), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_82158F8[] = { - gSpriteAnim_8215880, - gSpriteAnim_82158BC -}; - -const union AffineAnimCmd gSpriteAffineAnim_8215900[] = { - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd gSpriteAffineAnim_8215910[] = { - AFFINEANIMCMD_FRAME(-8, 0, 0, 20), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd gSpriteAffineAnim_8215920[] = { - AFFINEANIMCMD_FRAME(0x60, 0x100, 0, 0), - AFFINEANIMCMD_FRAME( 0, 0, 0, 5), - AFFINEANIMCMD_FRAME( 8, 0, 0, 20), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_8215940[] = { - gSpriteAffineAnim_8215900, - gSpriteAffineAnim_8215910, - gSpriteAffineAnim_8215920 -}; - -const struct SpriteSheet gUnknown_0821594C = { - (const u8 *)gTradeBallTiles, 0x600, 5557 -}; - -const struct SpritePalette gUnknown_08215954 = { - gTradeBallPalette, 5558 -}; - -const struct SpriteTemplate gSpriteTemplate_821595C = { - 5557, - 5558, - &gOamData_8215878, - gSpriteAnimTable_82158F8, - NULL, - gSpriteAffineAnimTable_8215940, - sub_804D6BC -}; - -const struct OamData gOamData_8215974 = { - .affineMode = 1, - .objMode = 1, - .size = 2, - .priority = 1 -}; - -const union AnimCmd gSpriteAnim_821597C[] = { - ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_8215984[] = { - gSpriteAnim_821597C -}; - -const union AffineAnimCmd gSpriteAffineAnim_8215988[] = { - AFFINEANIMCMD_FRAME(-10, -10, 0, 5), - AFFINEANIMCMD_FRAME(10, 10, 0, 5), - AFFINEANIMCMD_JUMP(0) -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_82159A0[] = { - gSpriteAffineAnim_8215988 -}; - -const struct SpriteSheet gUnknown_082159A4 = { - (const u8 *)gTradeGlow1Tiles, 0x200, 5550 -}; - -const struct SpritePalette gUnknown_082159AC = { - gTradeGlowPalette, 5551 -}; - -const struct SpritePalette gUnknown_082159B4 = { - gTradeCableEndPalette, 5555 -}; - -const struct SpriteTemplate gSpriteTemplate_82159BC = { - 5550, - 5551, - &gOamData_8215974, - gSpriteAnimTable_8215984, - NULL, - gSpriteAffineAnimTable_82159A0, - sub_804B058 -}; - -const struct OamData gOamData_82159D4 = { - .shape = ST_OAM_V_RECTANGLE, - .size = 2, - .priority = 1 -}; - -const union AnimCmd gSpriteAnim_82159DC[] = { - ANIMCMD_FRAME(0, 5, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_82159E4[] = { - ANIMCMD_FRAME(8, 5, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_82159EC[] = { - gSpriteAnim_82159DC, - gSpriteAnim_82159E4 -}; - -const struct SpriteSheet gUnknown_082159F4 = { - (const u8 *)gTradeGlow2Tiles, 0x300, 5552 -}; - -const struct SpriteTemplate gSpriteTemplate_82159FC = { - 5552, - 5551, - &gOamData_82159D4, - gSpriteAnimTable_82159EC, - NULL, - gDummySpriteAffineAnimTable, - sub_804B07C -}; - -const struct OamData gOamData_8215A14 = { - .shape = ST_OAM_V_RECTANGLE, - .size = 2, - .priority = 1 -}; - -const union AnimCmd gSpriteAnim_8215A1C[] = { - ANIMCMD_FRAME(0, 10), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_8215A24[] = { - gSpriteAnim_8215A1C -}; - -const struct SpriteSheet gUnknown_08215A28 = { - (const u8 *)gTradeCableEndTiles, 0x100, 5554 -}; - -const struct SpriteTemplate gSpriteTemplate_8215A30 = { - 5554, - 5555, - &gOamData_8215A14, - gSpriteAnimTable_8215A24, - NULL, - gDummySpriteAffineAnimTable, - sub_804B0BC -}; - -const struct OamData gOamData_8215A48 = { - .shape = ST_OAM_H_RECTANGLE, - .size = 3, - .priority = 1 -}; - -const union AnimCmd gSpriteAnim_8215A50[] = { - ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME(96, 2, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), - ANIMCMD_LOOP(8), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_8215A74[] = { - gSpriteAnim_8215A50 -}; - -const struct SpriteSheet gUnknown_08215A78 = { - (const u8 *)gTradeGBAScreenTiles, 0x1000, 5556 -}; - -const struct SpriteTemplate gSpriteTemplate_8215A80 = { - 5556, - 5555, - &gOamData_8215A48, - gSpriteAnimTable_8215A74, - NULL, - gDummySpriteAffineAnimTable, - sub_804B104 -}; - -const u16 gTradeGlow2PaletteAnimTable[] = { - RGB(18, 24, 31), - RGB(18, 24, 31), - RGB(18, 24, 31), - RGB(31, 31, 31), - RGB(31, 31, 31), - RGB(31, 31, 31), - RGB(18, 24, 31), - RGB(18, 24, 31), - RGB(18, 24, 31), - RGB(31, 31, 31), - RGB(31, 31, 31), - RGB(31, 31, 31), -}; - -const union AffineAnimCmd gSpriteAffineAnim_8215AB0[] = { - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_JUMP(0) -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_8215AC0[] = { - gSpriteAffineAnim_8215AB0 -}; - -const struct InGameTrade gIngameTrades[] = { -#if ENGLISH - { - _("MAKIT"), SPECIES_MAKUHITA, - 5, 5, 4, 4, 4, 4, - TRUE, 49562, - 5, 5, 5, 5, 30, - 0x9C40, - ITEM_X_ATTACK, -1, - _("ELYSSA"), MALE, 10, - SPECIES_SLAKOTH - }, { - _("SKITIT"), SPECIES_SKITTY, - 5, 4, 4, 5, 4, 4, - FALSE, 2259, - 5, 5, 30, 5, 5, - 0x498A2E17, - ITEM_GLITTER_MAIL, 0, - _("DARRELL"), FEMALE, 10, - SPECIES_PIKACHU - }, { - _("COROSO"), - SPECIES_CORSOLA, - 4, 4, 5, 4, 4, 5, - TRUE, 50183, - 5, 30, 5, 5, 5, - 0x4C970B7F, - ITEM_TROPIC_MAIL, 1, - _("LANE"), FEMALE, 10, - SPECIES_BELLOSSOM - } -#elif GERMAN - { - _("MAKIT"), SPECIES_MAKUHITA, - 5, 5, 4, 4, 4, 4, - TRUE, 49562, - 5, 5, 5, 5, 30, - 0x9C40, - ITEM_X_ATTACK, -1, - _("MAIK"), MALE, 10, - SPECIES_SLAKOTH - }, { - _("CONEC"), SPECIES_SKITTY, - 5, 4, 4, 5, 4, 4, - FALSE, 2259, - 5, 5, 30, 5, 5, - 0x498A2E17, - ITEM_GLITTER_MAIL, 0, - _("MADINA"), FEMALE, 10, - SPECIES_PIKACHU - }, { - _("CORASO"), - SPECIES_CORSOLA, - 4, 4, 5, 4, 4, 5, - TRUE, 50183, - 5, 30, 5, 5, 5, - 0x4C970B7F, - ITEM_TROPIC_MAIL, 1, - _("LIANA"), FEMALE, 10, - SPECIES_BELLOSSOM - } -#endif -}; - -const u16 gIngameTradeMail[][10] = { -#if ENGLISH - { - EC_POKEMON(PIKACHU), - EC_WORD_THANK_YOU, - EC_WORD_EXCL, - EC_WORD_MY, - EC_POKEMON(SKITTY), - EC_WORD_EATS, - EC_WORD_A_LOT, - EC_WORD_NOW, - EC_WORD_EXCL, - 0 - }, { - EC_WORD_I, - EC_WORD_WANT, - EC_WORD_TO, - EC_WORD_SEE, - EC_WORD_A, - EC_MOVE2(PETAL_DANCE), - EC_WORD_IT_S, - EC_WORD_SO, - EC_WORD_PRETTY, - 0 - } -#elif GERMAN - { - EC_POKEMON(PIKACHU), - EC_WORD_THANK_YOU, - EC_WORD_EXCL, - EC_WORD_MY, - EC_POKEMON(SKITTY), - EC_WORD_EATS, - 0xFFFF, - EC_WORD_A_LOT, - EC_WORD_EXCL, - 0 - }, { - EC_WORD_I, - EC_WORD_WANT, - EC_WORD_OF, - EC_MOVE2(PETAL_DANCE), - EC_WORD_WORKS, - EC_WORD_THE, - EC_WORD_IS, - EC_WORD_SO, - EC_WORD_PRETTY, - 0 - } -#endif -}; - -const s8 gTradeBallVerticalVelocityTable[] = { - 0, 0, 1, 0, - 1, 0, 1, 1, - 1, 1, 2, 2, - 2, 2, 3, 3, - 3, 3, 4, 4, - 4, 4, -4, -4, - -4, -3, -3, -3, - -3, -2, -2, -2, - -2, -1, -1, -1, - -1, 0, -1, 0, - -1, 0, 0, 0, - 0, 0, 1, 0, - 1, 0, 1, 1, - 1, 1, 2, 2, - 2, 2, 3, 3, - 3, 3, 4, 4, - 4, 4, -4, -3, - -3, -2, -2, -1, - -1, -1, 0, -1, - 0, 0, 0, 0, - 0, 0, 1, 0, - 1, 1, 1, 2, - 2, 3, 3, 4, - -4, -3, -2, -1, - -1, -1, 0, 0, - 0, 0, 1, 0, - 1, 1, 2, 3 -}; - -// .text - -void sub_8047CD8(void) -{ - SetMainCallback2(sub_8047EC0); -} - -static void sub_8047CE8(void) -{ - u8 mpId; - sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[0], gSaveBlock2.playerName, 0xC); - mpId = GetMultiplayerId(); - sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[3], gLinkPlayers[mpId ^ 1].name, 0xC); - sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[6], gUnknown_0820C14C[0], 0x8); - sub_804ACD8(gUnknown_0820C14C[1], gUnknown_020296CC[8], 0x14); - nullsub_5(3, 0); -} - -static void sub_8047D58(void) -{ - struct SpriteTemplate spriteTemplate; - int i; - u8 mpId; - u16 slen; - int language; - - slen = StringLength(gSaveBlock2.playerName); - language = slen <= 5 ? 0 : 1; - for (i = 0; i < 3; i ++) - { - spriteTemplate = gSpriteTemplate_820C0EC; - spriteTemplate.tileTag += i; - CreateSprite(&spriteTemplate, gTradeUnknownSpriteCoords[language][0][0] + 32 * i, gTradeUnknownSpriteCoords[language][0][1], 1); - } - - mpId = GetMultiplayerId(); - slen = StringLength(gLinkPlayers[mpId ^ 1].name); - language = slen <= 5 ? 0 : 1; - for (i = 0; i < 3; i ++) - { - spriteTemplate = gSpriteTemplate_820C0EC; - spriteTemplate.tileTag += i + 3; - CreateSprite(&spriteTemplate, gTradeUnknownSpriteCoords[language][1][0] + 32 * i, gTradeUnknownSpriteCoords[language][1][1], 1); - } - nullsub_5(5, 0); -} - -static void sub_8047E44(void) -{ - struct SpriteTemplate spriteTemplate; - int i; - - for (i = 0; i < 2; i ++) - { - spriteTemplate = gSpriteTemplate_820C0EC; - spriteTemplate.tileTag += i + 6; - CreateSprite(&spriteTemplate, 0xd6 + 32 * i, 0x98, 1); - } - - for (i = 0; i < 5; i ++) - { - spriteTemplate = gSpriteTemplate_820C0EC; - spriteTemplate.tileTag += i + 8; - CreateSprite(&spriteTemplate, 0x18 + 32 * i, 0x96, 1); - } -} - -static void sub_8047EC0(void) -{ - int i; - - switch (gMain.state) - { - case 0: - gUnknown_03004824 = &ewram_2010000.unk_07000; - sub_804AA88(); - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - sub_804A964(&gUnknown_03004824->unk_00c8, BG_SCREEN_ADDR(5)); - SetVBlankCallback(sub_80489F4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); - Text_InitWindowWithTemplate(&gUnknown_03004824->window, &gWindowTemplate_81E6F84); - gUnknown_03004824->unk_007a = TextWindow_SetBaseTileNum(20); - TextWindow_LoadStdFrameGraphics(&gUnknown_03004824->window); - Menu_EraseScreen(); - sub_809D51C(); - gUnknown_03004824->unk_0075 = 0; - gUnknown_03004824->unk_007b = 0; - gUnknown_03004824->unk_007c = 0; - gUnknown_03004824->unk_0080[0] = 0; - gUnknown_03004824->unk_0080[1] = 0; - gUnknown_03004824->unk_0086 = 0; - gUnknown_03004824->unk_0087 = 0; - gUnknown_03004824->unk_00b4 = 0; - gUnknown_03000508[0] = 0; - gMain.state ++; - sub_804AA0C(0); - CpuFill16(0, ewram_2010000.tileBuffers, sizeof(ewram_2010000.tileBuffers)); - for (i = 0; i < 13; i ++) - gUnknown_020296CC[i] = ewram_2010000.tileBuffers[i]; - break; - case 1: - gLinkType = 0x1122; - OpenLink(); - for (i = 0; i < PARTY_SIZE; i ++) - CreateMon(&gEnemyParty[i], 0, 0, 0x20, FALSE, 0, FALSE, 0); - gMain.state ++; - gUnknown_03004824->unk_00b4 = 0; - CreateTask(sub_8083C50, 1); - break; - case 2: - gUnknown_03004824->unk_00b4 ++; - if (gUnknown_03004824->unk_00b4 > 11) - { - gUnknown_03004824->unk_00b4 = 0; - gMain.state ++; - } - break; - case 3: - if (GetLinkPlayerCount_2() >= sub_800820C()) - { - if (IsLinkMaster()) - { - if (++gUnknown_03004824->unk_00b4 > 30) - { - sub_8007F4C(); - gMain.state ++; - } - } - else - gMain.state ++; - } - break; - case 4: - if (gReceivedRemoteLinkPlayers == 1 && IsLinkPlayerDataExchangeComplete() == TRUE) - { - CalculatePlayerPartyCount(); - gMain.state ++; - } - break; - case 5: - if (sub_8048D44()) - { - sub_804AF84(); - gMain.state ++; - } - break; - case 6: - CalculateEnemyPartyCount(); - Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, 0, 0, 29, 19); - REG_DISPCNT = 0; - gUnknown_03004824->partyCounts[0] = gPlayerPartyCount; - gUnknown_03004824->partyCounts[1] = gEnemyPartyCount; - for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) - gUnknown_03004824->partyIcons[0][i] = CreateMonIcon(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2), sub_809D62C, gTradeMonSpriteCoords[i][0] * 8 + 14, gTradeMonSpriteCoords[i][1] * 8 - 12, TRUE, GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY)); - for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) - gUnknown_03004824->partyIcons[1][i] = CreateMonIcon(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[6 + i][0] * 8 + 14, gTradeMonSpriteCoords[6 + i][1] * 8 - 12, TRUE, GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY)); - nullsub_5(2, 0); - gMain.state ++; - break; - case 7: - LoadHeldItemIconGraphics(); - CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 0); - gMain.state ++; - break; - case 8: - CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 1); - gMain.state ++; - break; - case 9: - sub_8047CE8(); - gMain.state ++; - gUnknown_03004824->unk_00b4 = 0; - break; - case 10: - nullsub_5(4, 0); - if (sub_804ABF8()) - gMain.state ++; - break; - case 11: - sub_8047D58(); - gMain.state ++; - break; - case 12: - sub_8047E44(); - gUnknown_03004824->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_820C134, gTradeMonSpriteCoords[0][0] * 8 + 32, gTradeMonSpriteCoords[0][1] * 8, 2); - gUnknown_03004824->tradeMenuCursorPosition = 0; - gMain.state ++; - nullsub_5(6, 0); - break; - case 13: - sub_804ACF4(0); - sub_804A41C(0); - gUnknown_03004824->unk_0000 = 0; - gUnknown_03004824->unk_0001 = 0; - sub_8048C70(); - gMain.state ++; - nullsub_5(7, 0); - PlayBGM(BGM_P_SCHOOL); - break; - case 14: - sub_804ACF4(1); - sub_804A41C(1); - gMain.state ++; - // fallthrough - case 15: - sub_8048B0C(0); - gMain.state ++; - break; - case 16: - sub_8048B0C(1); - gMain.state ++; - break; - case 17: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gMain.state ++; - break; - case 18: - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - gMain.state ++; - break; - case 19: - sub_804AE3C(0); - gMain.state ++; - break; - case 20: - sub_804AE3C(1); - sub_804AF10(); - gMain.state ++; - break; - case 21: - if (!gPaletteFade.active) - { - gMain.callback1 = sub_80494D8; - SetMainCallback2(sub_8048AB4); - gUnknown_03000508[0] = 0; - } - break; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_80484F4(void) -{ - int i; - struct UnkStructF *unkStructF; - - switch (gMain.state) - { - case 0: - gUnknown_03004824 = &ewram_2010000.unk_07000; - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - sub_804A964(&gUnknown_03004824->unk_00c8, BG_SCREEN_ADDR(5)); - SetVBlankCallback(sub_80489F4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); - Text_InitWindowWithTemplate(&gUnknown_03004824->window, &gWindowTemplate_81E6F84); - gUnknown_03004824->unk_007a = TextWindow_SetBaseTileNum(20); - TextWindow_LoadStdFrameGraphics(&gUnknown_03004824->window); - Menu_EraseScreen(); - sub_809D51C(); - gUnknown_03004824->unk_0075 = 0; - gUnknown_03004824->unk_007b = 0; - gUnknown_03004824->unk_007c = 0; - gUnknown_03004824->unk_0080[0] = 0; - gUnknown_03004824->unk_0080[1] = 0; - gUnknown_03004824->unk_0086 = 0; - gUnknown_03004824->unk_0087 = 0; - gUnknown_03004824->unk_00b4 = 0; - gUnknown_03000508[0] = 0; - gMain.state ++; - for (i = 0; i < 13; i ++) - gUnknown_020296CC[i] = ewram_2010000.tileBuffers[i]; - break; - case 1: - gMain.state ++; - gUnknown_03004824->unk_00b4 = 0; - break; - case 2: - gMain.state ++; - break; - case 3: - gMain.state ++; - break; - case 4: - CalculatePlayerPartyCount(); - gMain.state ++; - break; - case 5: - gMain.state ++; - break; - case 6: - CalculateEnemyPartyCount(); - REG_DISPCNT = 0; - gUnknown_03004824->partyCounts[0] = gPlayerPartyCount; - gUnknown_03004824->partyCounts[1] = gEnemyPartyCount; - sub_804A41C(0); - sub_804A41C(1); - for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) - gUnknown_03004824->partyIcons[0][i] = CreateMonIcon(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[i][0] * 8 + 14, gTradeMonSpriteCoords[i][1] * 8 - 12, TRUE, GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY)); - for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) - gUnknown_03004824->partyIcons[1][i] = CreateMonIcon(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[6 + i][0] * 8 + 14, gTradeMonSpriteCoords[6 + i][1] * 8 - 12, TRUE, GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY)); - nullsub_5(2, 0); - gMain.state ++; - break; - case 7: - LoadHeldItemIconGraphics(); - CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 0); - gMain.state ++; - break; - case 8: - CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 1); - gMain.state ++; - break; - case 9: - sub_8047CE8(); - gMain.state ++; - gUnknown_03004824->unk_00b4 = 0; - break; - case 10: - nullsub_5(4, 0); - if (sub_804ABF8()) - { - gMain.state ++; - } - break; - case 11: - sub_8047D58(); - gMain.state ++; - break; - case 12: - sub_8047E44(); - unkStructF = &ewram_2010000.unk_08000; - if (gUnknown_03004824->tradeMenuCursorPosition < 6) - gUnknown_03004824->tradeMenuCursorPosition = unkStructF->unk_0009; - else - gUnknown_03004824->tradeMenuCursorPosition = unkStructF->unk_0009 + 6; - gUnknown_03004824->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_820C134, gTradeMonSpriteCoords[gUnknown_03004824->tradeMenuCursorPosition][0] * 8 + 32, gTradeMonSpriteCoords[gUnknown_03004824->tradeMenuCursorPosition][1] * 8, 2); - gMain.state = 15; - nullsub_5(6, 0); - break; - case 15: - sub_8048B0C(0); - gMain.state ++; - break; - case 16: - sub_8048B0C(1); - gUnknown_03004824->unk_0000 = 0; - gUnknown_03004824->unk_0001 = 0; - sub_8048C70(); - nullsub_5(7, 0); - gMain.state ++; - break; - case 17: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gMain.state ++; - break; - case 18: - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - gMain.state ++; - break; - case 19: - gMain.state ++; - break; - case 20: - sub_804AF10(); - gMain.state ++; - break; - case 21: - if (!gPaletteFade.active) - { - SetMainCallback2(sub_8048AB4); - gUnknown_03000508[0] = 0; - } - break; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_80489F4(void) -{ - sub_804A940(&gUnknown_03004824->unk_00c8); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -/*static*/ void sub_8048A14(void) -{ - if (++gUnknown_03004824->unk_00b4 >= 16) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_03004824->unk_007b = 10; - } -} - -/*static*/ void sub_8048A50(void) -{ - if (!gPaletteFade.active) - { - gUnknown_020297D8[0] = gUnknown_03004824->tradeMenuCursorPosition; - gUnknown_020297D8[1] = gUnknown_03004824->unk_008a; - sub_800832C(); - gUnknown_03004824->unk_007b = 13; - } -} - -/*static*/ void sub_8048A90(void) -{ - if (!gReceivedRemoteLinkPlayers) - { - gMain.callback1 = NULL; - SetMainCallback2(sub_804B41C); - } -} - -static void sub_8048AB4(void) -{ - sub_8049DE0(); - sub_804AB30(); - sub_8049ED4(0); - sub_8049ED4(1); - REG_BG2HOFS = gUnknown_03004824->unk_0000++; - REG_BG3HOFS = gUnknown_03004824->unk_0001--; - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -#ifdef NONMATCHING -// Only minor register permutations -#pragma push_macro("BLOCKSIZE") -#define BLOCKSIZE 0x800 -static void sub_8048B0C(u8 a0) -{ - int i; - - switch (a0) - { - case 0: - for (i = 0; i < 48; i ++) - { - gPlttBufferUnfaded[i] = *(gUnknown_08EA02C8 + i); - gPlttBufferFaded[i] = *(gUnknown_08EA02C8 + i); - } - DmaCopyLarge16(3, gUnknown_08EA0348, (void *)BG_VRAM, 0x1280, 0x1000); - for (i = 0; i < 0x400; i ++) - gUnknown_03004824->unk_00c8.unk_12[i] = gUnknown_08EA15C8[i]; - DmaCopy16Defvars(3, gTradeStripesBG2Tilemap, BG_SCREEN_ADDR(6), 0x800); - break; - case 1: - DmaCopy16Defvars(3, gTradeStripesBG3Tilemap, BG_SCREEN_ADDR(7), 0x800); - sub_804A6DC(0); - sub_804A6DC(1); - sub_804A938(&gUnknown_03004824->unk_00c8); - REG_BG0CNT &= ~0x03; // BGCNT_PRIORITY(0) - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(5); - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(6); - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(7); - REG_BG0HOFS = 0; - REG_BG1HOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1VOFS = 0; - REG_BG2VOFS = 0; - REG_BG3VOFS = 0; - break; - } -} -#pragma pop_macro("BLOCKSIZE") -#else -asm(".include \"constants/gba_constants.inc\""); -__attribute__((naked)) -static void sub_8048B0C(u8 a0) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _08048B1C\n" - "\tcmp r0, 0x1\n" - "\tbeq _08048BD0\n" - "\tb _08048C3A\n" - "_08048B1C:\n" - "\tldr r5, _08048BA0 @ =gUnknown_08EA0348\n" - "\tldr r0, _08048BA4 @ =gTradeStripesBG2Tilemap\n" - "\tmov r12, r0\n" - "\tldr r1, _08048BA8 @ =gUnknown_08EA02C8\n" - "\tldr r4, _08048BAC @ =gPlttBufferFaded\n" - "\tldr r3, _08048BB0 @ =gPlttBufferUnfaded\n" - "\tmovs r2, 0x2F\n" - "_08048B2A:\n" - "\tldrh r0, [r1]\n" - "\tstrh r0, [r3]\n" - "\tldrh r0, [r1]\n" - "\tstrh r0, [r4]\n" - "\tadds r1, 0x2\n" - "\tadds r4, 0x2\n" - "\tadds r3, 0x2\n" - "\tsubs r2, 0x1\n" - "\tcmp r2, 0\n" - "\tbge _08048B2A\n" - "\tadds r3, r5, 0\n" - "\tmovs r4, 0xC0\n" - "\tlsls r4, 19\n" - "\tmovs r5, 0x94\n" - "\tlsls r5, 5\n" - "\tldr r1, _08048BB4 @ =0x040000d4\n" - "\tldr r6, _08048BB8 @ =0x80000800\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 5\n" - "\tmovs r7, 0x80\n" - "\tlsls r7, 24\n" - "_08048B54:\n" - "\tstr r3, [r1]\n" - "\tstr r4, [r1, 0x4]\n" - "\tstr r6, [r1, 0x8]\n" - "\tldr r0, [r1, 0x8]\n" - "\tadds r3, r2\n" - "\tadds r4, r2\n" - "\tsubs r5, r2\n" - "\tcmp r5, r2\n" - "\tbhi _08048B54\n" - "\tstr r3, [r1]\n" - "\tstr r4, [r1, 0x4]\n" - "\tlsrs r0, r5, 1\n" - "\torrs r0, r7\n" - "\tstr r0, [r1, 0x8]\n" - "\tldr r0, [r1, 0x8]\n" - "\tmovs r2, 0\n" - "\tldr r5, _08048BBC @ =0x000003ff\n" - "\tldr r4, _08048BC0 @ =gUnknown_03004824\n" - "\tldr r3, _08048BC4 @ =gUnknown_08EA15C8\n" - "_08048B7A:\n" - "\tldr r0, [r4]\n" - "\tlsls r1, r2, 1\n" - "\tadds r0, 0xDA\n" - "\tadds r0, r1\n" - "\tldrh r1, [r3]\n" - "\tstrh r1, [r0]\n" - "\tadds r3, 0x2\n" - "\tadds r2, 0x1\n" - "\tcmp r2, r5\n" - "\tble _08048B7A\n" - "\tldr r1, _08048BC8 @ =0x06003000\n" - "\tldr r0, _08048BB4 @ =0x040000d4\n" - "\tmov r2, r12\n" - "\tstr r2, [r0]\n" - "\tstr r1, [r0, 0x4]\n" - "\tldr r1, _08048BCC @ =0x80000400\n" - "\tstr r1, [r0, 0x8]\n" - "\tldr r0, [r0, 0x8]\n" - "\tb _08048C3A\n" - "\t.align 2, 0\n" - "_08048BA0: .4byte gUnknown_08EA0348\n" - "_08048BA4: .4byte gTradeStripesBG2Tilemap\n" - "_08048BA8: .4byte gUnknown_08EA02C8\n" - "_08048BAC: .4byte gPlttBufferFaded\n" - "_08048BB0: .4byte gPlttBufferUnfaded\n" - "_08048BB4: .4byte 0x040000d4\n" - "_08048BB8: .4byte 0x80000800\n" - "_08048BBC: .4byte 0x000003ff\n" - "_08048BC0: .4byte gUnknown_03004824\n" - "_08048BC4: .4byte gUnknown_08EA15C8\n" - "_08048BC8: .4byte 0x06003000\n" - "_08048BCC: .4byte 0x80000400\n" - "_08048BD0:\n" - "\tldr r1, _08048C40 @ =gTradeStripesBG3Tilemap\n" - "\tldr r2, _08048C44 @ =0x06003800\n" - "\tldr r0, _08048C48 @ =0x040000d4\n" - "\tstr r1, [r0]\n" - "\tstr r2, [r0, 0x4]\n" - "\tldr r1, _08048C4C @ =0x80000400\n" - "\tstr r1, [r0, 0x8]\n" - "\tldr r0, [r0, 0x8]\n" - "\tmovs r0, 0\n" - "\tbl sub_804A6DC\n" - "\tmovs r0, 0x1\n" - "\tbl sub_804A6DC\n" - "\tldr r0, _08048C50 @ =gUnknown_03004824\n" - "\tldr r0, [r0]\n" - "\tadds r0, 0xC8\n" - "\tbl sub_804A938\n" - "\tldr r2, _08048C54 @ =REG_BG0CNT\n" - "\tldrh r1, [r2]\n" - "\tldr r0, _08048C58 @ =0x0000fffc\n" - "\tands r0, r1\n" - "\tstrh r0, [r2]\n" - "\tldr r1, _08048C5C @ =REG_BG1CNT\n" - "\tldr r2, _08048C60 @ =0x00000501\n" - "\tadds r0, r2, 0\n" - "\tstrh r0, [r1]\n" - "\tadds r1, 0x2\n" - "\tldr r2, _08048C64 @ =0x00000602\n" - "\tadds r0, r2, 0\n" - "\tstrh r0, [r1]\n" - "\tadds r1, 0x2\n" - "\tldr r2, _08048C68 @ =0x00000703\n" - "\tadds r0, r2, 0\n" - "\tstrh r0, [r1]\n" - "\tldr r0, _08048C6C @ =REG_BG0HOFS\n" - "\tmovs r1, 0\n" - "\tstrh r1, [r0]\n" - "\tadds r0, 0x4\n" - "\tstrh r1, [r0]\n" - "\tadds r0, 0x4\n" - "\tstrh r1, [r0]\n" - "\tadds r0, 0x4\n" - "\tstrh r1, [r0]\n" - "\tsubs r0, 0xA\n" - "\tstrh r1, [r0]\n" - "\tadds r0, 0x4\n" - "\tstrh r1, [r0]\n" - "\tadds r0, 0x4\n" - "\tstrh r1, [r0]\n" - "\tadds r0, 0x4\n" - "\tstrh r1, [r0]\n" - "_08048C3A:\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08048C40: .4byte gTradeStripesBG3Tilemap\n" - "_08048C44: .4byte 0x06003800\n" - "_08048C48: .4byte 0x040000d4\n" - "_08048C4C: .4byte 0x80000400\n" - "_08048C50: .4byte gUnknown_03004824\n" - "_08048C54: .4byte REG_BG0CNT\n" - "_08048C58: .4byte 0x0000fffc\n" - "_08048C5C: .4byte REG_BG1CNT\n" - "_08048C60: .4byte 0x00000501\n" - "_08048C64: .4byte 0x00000602\n" - "_08048C68: .4byte 0x00000703\n" - "_08048C6C: .4byte REG_BG0HOFS"); -} -#endif - -static void sub_8048C70(void) -{ - int i; - for (i = 0; i < PARTY_SIZE; i ++) - { - if (i < gUnknown_03004824->partyCounts[0]) - { - gSprites[gUnknown_03004824->partyIcons[0][i]].invisible = FALSE; - gUnknown_03004824->tradeMenuOptionsActive[i] = TRUE; - } - else - { - gUnknown_03004824->tradeMenuOptionsActive[i] = FALSE; - } - if (i < gUnknown_03004824->partyCounts[1]) - { - gSprites[gUnknown_03004824->partyIcons[1][i]].invisible = FALSE; - gUnknown_03004824->tradeMenuOptionsActive[i + 6] = TRUE; - } - else - { - gUnknown_03004824->tradeMenuOptionsActive[i + 6] = FALSE; - } - } - gUnknown_03004824->tradeMenuOptionsActive[12] = TRUE; -} - -static void nullsub_5(u8 a0, u8 a1) {} - -// why not just use memcpy? -static void Trade_Memcpy(void *dataDest, void *dataSrc, u32 size) -{ - u8 *dest = dataDest; - u8 *src = dataSrc; - int i; - for (i = 0; i < size; i ++) dest[i] = src[i]; -} - -static bool8 sub_8048D44(void) -{ - u8 mpId = GetMultiplayerId(); - int i; - u16 species; - u8 nickname[11]; - struct Pokemon *pokemon; - - SetLinkDebugValues(gUnknown_03004824->unk_0075 / 100, gUnknown_03004824->unk_0075 % 100); - switch (gUnknown_03004824->unk_0075) - { - case 0: - Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon)); - gUnknown_03004824->unk_0075 ++; - break; - case 1: - if (IsLinkTaskFinished()) - { - if (GetBlockReceivedStatus() == 0) - { - gUnknown_03004824->unk_0075 ++; - } - else - { - ResetBlockReceivedFlags(); - gUnknown_03004824->unk_0075 ++; - } - } - break; - case 2: - if (mpId == 0) - { - sub_8007E9C(1); - } - gUnknown_03004824->unk_0075 ++; - break; - case 3: - if (GetBlockReceivedStatus() == 3) - { - Trade_Memcpy(&gEnemyParty[0], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); - ResetBlockReceivedFlags(); - gUnknown_03004824->unk_0075 ++; - } - break; - case 4: - Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[2], 2 * sizeof(struct Pokemon)); - gUnknown_03004824->unk_0075 ++; - break; - case 5: - if (mpId == 0) - { - sub_8007E9C(1); - } - gUnknown_03004824->unk_0075 ++; - break; - case 6: - if (GetBlockReceivedStatus() == 3) - { - Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); - ResetBlockReceivedFlags(); - gUnknown_03004824->unk_0075 ++; - } - break; - case 7: - Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 2 * sizeof(struct Pokemon)); - gUnknown_03004824->unk_0075 ++; - break; - case 8: - if (mpId == 0) - { - sub_8007E9C(1); - } - gUnknown_03004824->unk_0075 ++; - break; - case 9: - if (GetBlockReceivedStatus() == 3) - { - Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); - ResetBlockReceivedFlags(); - gUnknown_03004824->unk_0075 ++; - } - break; - case 10: - Trade_Memcpy(gBlockSendBuffer, &gSaveBlock1.mail[0], 6 * sizeof(struct MailStruct) + 4); - gUnknown_03004824->unk_0075 ++; - break; - case 11: - if (mpId == 0) - { - sub_8007E9C(3); - } - gUnknown_03004824->unk_0075 ++; - break; - case 12: - if (GetBlockReceivedStatus() == 3) - { - Trade_Memcpy(&gUnknown_02029700[0], gBlockRecvBuffer[mpId ^ 1], 6 * sizeof(struct MailStruct)); - ResetBlockReceivedFlags(); - gUnknown_03004824->unk_0075 ++; - } - break; - case 13: - Trade_Memcpy(gBlockSendBuffer, gSaveBlock1.giftRibbons, 11); - gUnknown_03004824->unk_0075 ++; - break; - case 14: - if (mpId == 0) - { - sub_8007E9C(4); - } - gUnknown_03004824->unk_0075 ++; - break; - case 15: - if (GetBlockReceivedStatus() == 3) - { - Trade_Memcpy(gUnknown_03004824->unk_00b5, gBlockRecvBuffer[mpId ^ 1], 11); - ResetBlockReceivedFlags(); - gUnknown_03004824->unk_0075 ++; - } - break; - case 16: - pokemon = gEnemyParty; - for (i = 0; i < PARTY_SIZE; i ++) - { - if ((species = GetMonData(pokemon, MON_DATA_SPECIES)) != SPECIES_NONE && species == SPECIES_SHEDINJA && GetMonData(pokemon, MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE) - { - GetMonData(pokemon, MON_DATA_NICKNAME, nickname); - if (!StringCompareWithoutExtCtrlCodes(nickname, gUnknown_0820C3B0)) - SetMonData(pokemon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]); - } - pokemon ++; - } - return TRUE; - } - return FALSE; -} - -static void sub_8049088(void) -{ - u8 string[28]; - StringCopy(string, gTradeText_TradeOkayPrompt); - sub_804ACD8(string, BG_CHAR_ADDR(4) + gUnknown_03004824->unk_007e * 32, 20); -} - -static void sub_80490BC(u8 mpId, u8 a1) -{ - if (a1 & 1) - { - switch (gBlockRecvBuffer[mpId][0]) - { - case 0xeeaa: - gUnknown_03004824->unk_0084 = 2; - break; - case 0xaabb: - gUnknown_03004824->unk_0084 = 1; - break; - case 0xbbbb: - gUnknown_03004824->unk_0086 = 1; - break; - case 0xbbcc: - gUnknown_03004824->unk_0086 = 2; - break; - } - ResetBlockReceivedFlag(0); - } - if (a1 & 2) - { - switch (gBlockRecvBuffer[1][0]) - { - case 0xeeaa: - gUnknown_03004824->unk_0085 = 2; - break; - case 0xaabb: - gUnknown_03004824->unk_008a = gBlockRecvBuffer[1][1] + 6; - gUnknown_03004824->unk_0085 = 1; - break; - case 0xbbbb: - gUnknown_03004824->unk_0087 = 1; - break; - case 0xbbcc: - gUnknown_03004824->unk_0087 = 2; - break; - } - ResetBlockReceivedFlag(1); - } -} - -static void sub_80491E4(u8 mpId, u8 status) -{ - if (status & 1) - { - switch (gBlockRecvBuffer[0][0]) - { - case 0xeebb: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - sub_804AA0C(4); - gUnknown_03004824->unk_007b = 11; - break; - case 0xeecc: - sub_804AA0C(5); - gUnknown_03004824->unk_007b = 8; - break; - case 0xdddd: - gUnknown_03004824->unk_008a = gBlockRecvBuffer[0][1] + 6; - sub_8049E9C(gUnknown_03004824->tradeMenuCursorPosition); - sub_8049E9C(gUnknown_03004824->unk_008a); - gUnknown_03004824->unk_007b = 7; - break; - case 0xccdd: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_03004824->unk_007b = 10; - break; - case 0xddee: - sub_804AA0C(1); - gUnknown_03004824->unk_007b = 8; - break; - } - ResetBlockReceivedFlag(0); - } - if (status & 2) - { - ResetBlockReceivedFlag(1); - } -} - -static void sub_80492D8(void) -{ - if (gUnknown_03004824->unk_0084 && gUnknown_03004824->unk_0085) - { - if (gUnknown_03004824->unk_0084 == 1 && gUnknown_03004824->unk_0085 == 1) - { - gUnknown_03004824->unk_007b = 6; - gUnknown_03004824->linkData[0] = 0xdddd; - gUnknown_03004824->linkData[1] = gUnknown_03004824->tradeMenuCursorPosition; - sub_804AADC(5, 0); - gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; - } - else if (gUnknown_03004824->unk_0084 == 1 && gUnknown_03004824->unk_0085 == 2) - { - sub_804AA0C(1); - gUnknown_03004824->linkData[0] = 0xeecc; - gUnknown_03004824->linkData[1] = 0; - sub_804AADC(5, 0); - gUnknown_03004824->unk_0086 = gUnknown_03004824->unk_0087 = 0; - gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; - gUnknown_03004824->unk_007b = 8; - } - else if (gUnknown_03004824->unk_0084 == 2 && gUnknown_03004824->unk_0085 == 1) - { - sub_804AA0C(5); - gUnknown_03004824->linkData[0] = 0xddee; - gUnknown_03004824->linkData[1] = 0; - sub_804AADC(5, 0); - gUnknown_03004824->unk_0086 = gUnknown_03004824->unk_0087 = 0; - gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; - gUnknown_03004824->unk_007b = 8; - } - else if (gUnknown_03004824->unk_0084 == 2 && gUnknown_03004824->unk_0085 == 2) - { - gUnknown_03004824->linkData[0] = 0xeebb; - gUnknown_03004824->linkData[1] = 0; - sub_804AADC(5, 0); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; - gUnknown_03004824->unk_007b = 11; - } - } - if (gUnknown_03004824->unk_0086 && gUnknown_03004824->unk_0087) - { - if (gUnknown_03004824->unk_0086 == 1 && gUnknown_03004824->unk_0087 == 1) - { - gUnknown_03004824->linkData[0] = 0xccdd; - gUnknown_03004824->linkData[1] = 0; - sub_804AADC(5, 0); - gUnknown_03004824->unk_0086 = 0; - gUnknown_03004824->unk_0087 = 0; - gUnknown_03004824->unk_007b = 9; - } - if (gUnknown_03004824->unk_0086 == 2 || gUnknown_03004824->unk_0087 == 2) - { - sub_804AA0C(1); - gUnknown_03004824->linkData[0] = 0xddee; - gUnknown_03004824->linkData[1] = 0; - sub_804AADC(5, 0); - gUnknown_03004824->unk_0086 = 0; - gUnknown_03004824->unk_0087 = 0; - gUnknown_03004824->unk_007b = 8; - } - } -} - -static void sub_80494D8(void) -{ - u8 mpId = GetMultiplayerId(); - u8 status; - if ((status = GetBlockReceivedStatus())) - { - if (mpId == 0) - sub_80490BC(mpId, status); - else - sub_80491E4(mpId, status); - ResetBlockReceivedFlags(); - } - if (mpId == 0) - sub_80492D8(); -} - -static u8 sub_8049514(u8 oldPosition, u8 direction) -{ - int i; - u8 newPosition = 0; - for (i = 0; i < PARTY_SIZE; i ++) - { - if (gUnknown_03004824->tradeMenuOptionsActive[gTradeNextSelectedMonTable[oldPosition][direction][i]] == TRUE) - { - newPosition = gTradeNextSelectedMonTable[oldPosition][direction][i]; - break; - } - } - return newPosition; -} - -static void TradeMenuMoveCursor(u8 *tradeMenuCursorPosition, u8 direction) -{ - u8 newPosition = sub_8049514(*tradeMenuCursorPosition, direction); - if (newPosition == 12) // CANCEL - { - StartSpriteAnim(&gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx], 1); - gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.x = 0xe0; - gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.y = 0xa0; - } - else - { - StartSpriteAnim(&gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx], 0); - gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.x = gTradeMonSpriteCoords[newPosition][0] * 8 + 32; - gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.y = gTradeMonSpriteCoords[newPosition][1] * 8; - } - if (*tradeMenuCursorPosition != newPosition) - { - PlaySE(SE_SELECT); - } - *tradeMenuCursorPosition = newPosition; -} - -static void sub_8049620(void) -{ - sub_804AA0C(0); - gUnknown_03004824->unk_007b = 5; - if (GetMultiplayerId() == 1) - { - gUnknown_03004824->linkData[0] = 0xaabb; - gUnknown_03004824->linkData[1] = gUnknown_03004824->tradeMenuCursorPosition; - Trade_SendData(gUnknown_03004824); - } - else - { - gUnknown_03004824->unk_0084 = 1; - } -} - -static void sub_8049680(void) -{ - int i; - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 0); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 1); - } - else if (gMain.newAndRepeatedKeys & DPAD_LEFT) - { - TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 2); - } - else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) - { - TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 3); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE) - { - TextWindow_DrawStdFrame(&gUnknown_03004824->window, 18, 14, 28, 19); - Menu_PrintItems(19, 15, 2, (const struct MenuAction *)gUnknown_0820C320); - InitMenu(0, 19, 15, 2, 0, 9); - gUnknown_03004824->unk_007b = 1; - } - else if (gUnknown_03004824->tradeMenuCursorPosition < 2 * PARTY_SIZE) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_03004824->unk_007b = 2; - } - else if (gUnknown_03004824->tradeMenuCursorPosition == 2 * PARTY_SIZE) - { - TextWindow_DrawStdFrame(&gUnknown_03004824->window, 24, 14, 29, 19); - InitYesNoMenu(24, 14, 4); - gUnknown_03004824->unk_007b = 4; - sub_804ACD8(gUnknown_0820C14C[4], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); - } - } - if (gMain.newKeys & R_BUTTON) - { - for (i = 0; i < 10; i ++) - { - gUnknown_03004824->linkData[i] = i; - } - Trade_SendData(gUnknown_03004824); - } -} - -static void sub_8049804(void) -{ - Menu_DestroyCursor(); - sub_804A80C(); - gUnknown_03004824->unk_007b = 0; - gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = FALSE; - sub_804ACD8(gUnknown_0820C14C[1], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); -} - -static void sub_8049860(void) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (Menu_GetCursorPos() == 0) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_03004824->unk_007b = 2; - } - else if (sub_80499F0(gUnknown_03004824->unk_0051[0], gUnknown_03004824->partyCounts[0], gUnknown_03004824->tradeMenuCursorPosition) == 0) - { - sub_804AADC(3, 2); - gUnknown_03004824->unk_007b = 8; - } - else - { - sub_8049620(); - gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = TRUE; - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_8049804(); - } -} - -static void sub_8049954(void) -{ - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_8049804(); - } -} - -static void sub_804997C(void) -{ - if (!gPaletteFade.active) - { - if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE) - { - ShowPokemonSummaryScreen(gPlayerParty, gUnknown_03004824->tradeMenuCursorPosition, gUnknown_03004824->partyCounts[0] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT); - } - else - { - ShowPokemonSummaryScreen(gEnemyParty, gUnknown_03004824->tradeMenuCursorPosition - 6, gUnknown_03004824->partyCounts[1] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT); - } - } -} - -static u8 sub_80499F0(const u8 *src, u8 partyCount, u8 tradeMenuCursorPosition) -{ - u8 retval = 0; - int i; - for (i = 0; i < partyCount; i ++) - { - if (tradeMenuCursorPosition != i) - { - retval += src[i]; - } - } - return retval; -} - -static void sub_8049A20(void) -{ - u8 unk_0051[12]; - int i; - for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) - { - unk_0051[i] = gUnknown_03004824->unk_0051[0][i]; - } - if (sub_80499F0(unk_0051, gUnknown_03004824->partyCounts[0], gUnknown_03004824->tradeMenuCursorPosition) == 0) - { - sub_804AADC(3, 2); - gUnknown_03004824->linkData[0] = 0xbbcc; - sub_804AADC(0xb4, 0); - } - else - { - sub_804AADC(3, 1); - gUnknown_03004824->linkData[0] = 0xbbbb; - if (IsLinkTaskFinished()) - { - Trade_SendData(gUnknown_03004824); - } - } -} - -static void sub_8049AC0(void) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (Menu_GetCursorPos() == 0) - { - sub_8049A20(); - } - else - { - sub_804AADC(3, 1); - if (IsLinkTaskFinished()) - { - gUnknown_03004824->linkData[0] = 0xbbcc; - Trade_SendData(gUnknown_03004824); - } - } - gUnknown_03004824->unk_007b = 100; - } - else if (gMain.newKeys & B_BUTTON) - { - sub_804AADC(3, 1); - if (Menu_GetCursorPos() == 0) - { - gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); - } - gUnknown_03004824->linkData[0] = 0xbbcc; - Trade_SendData(gUnknown_03004824); - gUnknown_03004824->unk_007b = 100; - } -} - -static void sub_8049BC0(void) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (Menu_GetCursorPos() == 0) - { - sub_804AA0C(4); - gUnknown_03004824->linkData[0] = 0xeeaa; - gUnknown_03004824->linkData[1] = 0; - sub_804AADC(5, 0); - gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = TRUE; - gUnknown_03004824->unk_007b = 100; - } - else - { - sub_8049804(); - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_8049804(); - } -} - -static void sub_8049C8C(void) -{ - if (GetMultiplayerId() == 0) - { - sub_8049E9C(gUnknown_03004824->tradeMenuCursorPosition); - sub_8049E9C(gUnknown_03004824->unk_008a); - } - gUnknown_03004824->unk_007b = 7; -} - -static void sub_8049CC4(void) -{ - if (gUnknown_03004824->unk_0080[0] == 5 && gUnknown_03004824->unk_0080[1] == 5) - { - sub_8049088(); - gUnknown_03004824->unk_007b = 14; - } -} - -static void DisplayMessageAndContinueTask(void) -{ - gUnknown_03004824->unk_00b4++; - if (gUnknown_03004824->unk_00b4 > 120) - { - TextWindow_DrawStdFrame(&gUnknown_03004824->window, 24, 14, 29, 19); - InitYesNoMenu(24, 14, 4); - gUnknown_03004824->unk_00b4 = 0; - gUnknown_03004824->unk_007b = 3; - } -} - -static void sub_8049D44(void) -{ - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_804A840(0); - sub_804A840(1); - gUnknown_03004824->unk_007b = 0; - gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = FALSE; - } -} - -static void sub_8049D9C(void) -{ - if (!gPaletteFade.active) - { - sub_800832C(); - gUnknown_03004824->unk_007b = 12; - } -} - -static void sub_8049DC4(void) -{ - if (gReceivedRemoteLinkPlayers == 0) - { - SetMainCallback2(sub_805465C); - } -} - -static void sub_8049DE0(void) -{ - switch (gUnknown_03004824->unk_007b) - { - case 0: - sub_8049680(); - break; - case 1: - sub_8049860(); - break; - case 2: - sub_804997C(); - break; - case 3: - sub_8049AC0(); - break; - case 4: - sub_8049BC0(); - break; - case 6: - sub_8049C8C(); - break; - case 7: - sub_8049CC4(); - break; - case 8: - sub_8049D44(); - break; - case 9: - sub_8048A14(); - break; - case 10: - sub_8048A50(); - break; - case 11: - sub_8049D9C(); - break; - case 12: - sub_8049DC4(); - break; - case 13: - sub_8048A90(); - break; - case 14: - DisplayMessageAndContinueTask(); - break; - case 15: - sub_8049954(); - break; - } -} - -static void sub_8049E9C(u8 a0) -{ - u8 v0 = a0 / 6; - if (gUnknown_03004824->unk_0080[v0] == 0) - { - gUnknown_03004824->unk_0080[v0] = 1; - gUnknown_03004824->unk_0082[v0] = a0; - } -} - -// TODO: Figure out what the f**k is going on here -#ifdef NONMATCHING -static void sub_8049ED4(u8 a0) -{ - u8 i; - s8 stringLength; - u8 whichParty = 1; - u8 whichPokemon; - u8 string1[40]; - u8 string2[56]; - u8 temp0 = gUnknown_03004824->unk_0082[a0]; - if (temp0 < PARTY_SIZE) - whichParty = 0; - whichPokemon = temp0 % PARTY_SIZE; - - switch (gUnknown_03004824->unk_0080[a0]) - { - case 1: - for (i = 0; i < gUnknown_03004824->partyCounts[a0]; i ++) - { - gSprites[gUnknown_03004824->partyIcons[whichParty][i]].invisible = TRUE; - } - gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].invisible = FALSE; - gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data[0] = 20; - gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data[2] = (gTradeMonSpriteCoords[6 * whichParty + whichPokemon][0] + gTradeMonSpriteCoords[6 * whichParty + whichPokemon + 1][0]) / 2 * 8 + 14; - gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data[4] = gTradeMonSpriteCoords[6 * whichParty + whichPokemon][1] * 8 - 12; - StoreSpriteCallbackInData(&gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]], sub_809D62C); - gUnknown_03004824->unk_0080[a0] ++; - sub_8078A34(&gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]]); - Menu_DestroyCursor(); - Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[whichParty][0], 0, gUnknown_0820C330[whichParty][1], 19); - sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15 * a0, 0, gTradePartyBoxTilemap, 15, 17, 0); - if (whichParty == 0) - { - sub_804A80C(); - } - break; - case 2: - if (gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].callback == sub_809D62C) - { - gUnknown_03004824->unk_0080[a0] = 3; - } - break; - case 3: - sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15 * whichParty, 0, gTradePartyBoxTilemap, 15, 17, 0); - gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos1.x = (gTradeMonSpriteCoords[6 * whichParty + whichPokemon ][0] + gTradeMonSpriteCoords[6 * whichParty + whichPokemon + 1][0]) / 2 * 8 + 14; - gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos1.y = gTradeMonSpriteCoords[6 * whichParty + whichPokemon ][1] * 8 - 12; - gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos2.x = 0; - gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos2.y = 0; - stringLength = sub_804A2B4(string1 + 6, whichParty, whichPokemon); - string1[0] = 0xFC; - string1[1] = 0x06; - string1[2] = 0x04; - string1[3] = 0xFC; - string1[4] = 0x11; - string1[5] = (64 - stringLength) / 2; - Text_InitWindowAndPrintText(&gUnknown_03004824->window, string1, gUnknown_03004824->unk_007a + whichParty * 6 * 32, gUnknown_0820C334[whichParty][0], gUnknown_0820C334[whichParty][1]); - sub_804A33C(string2, whichParty, whichPokemon); - Text_InitWindowAndPrintText(&gUnknown_03004824->window, gOtherText_Terminator2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 32, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); - Text_InitWindowAndPrintText(&gUnknown_03004824->window, string2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 38, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); - gUnknown_03004824->unk_0080[a0] ++; - break; - case 4: - sub_804ACD8(gUnknown_0820C14C[5], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); - sub_804A51C(a0, whichPokemon, gUnknown_0820C3D1[a0][0] + 4, gUnknown_0820C3D1[a0][1] + 1, gUnknown_0820C3D1[a0][0], gUnknown_0820C3D1[a0][1]); - gUnknown_03004824->unk_0080[a0] ++; - break; - } -} -#else -__attribute__((naked)) -static void sub_8049ED4(u8 a0) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x74\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "\tldr r0, _08049F24 @ =gUnknown_03004824\n" - "\tldr r5, [r0]\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x82\n" - "\tadd r0, r10\n" - "\tldrb r0, [r0]\n" - "\tmovs r1, 0x1\n" - "\tstr r1, [sp, 0x6C]\n" - "\tcmp r0, 0x5\n" - "\tbhi _08049EFE\n" - "\tmovs r2, 0\n" - "\tstr r2, [sp, 0x6C]\n" - "_08049EFE:\n" - "\tmovs r1, 0x6\n" - "\tbl __umodsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r8, r0\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x80\n" - "\tmov r1, r10\n" - "\tadds r3, r0, r1\n" - "\tldrb r0, [r3]\n" - "\tcmp r0, 0x2\n" - "\tbne _08049F1A\n" - "\tb _0804A0AC\n" - "_08049F1A:\n" - "\tcmp r0, 0x2\n" - "\tbgt _08049F28\n" - "\tcmp r0, 0x1\n" - "\tbeq _08049F36\n" - "\tb _0804A294\n" - "\t.align 2, 0\n" - "_08049F24: .4byte gUnknown_03004824\n" - "_08049F28:\n" - "\tcmp r0, 0x3\n" - "\tbne _08049F2E\n" - "\tb _0804A0E4\n" - "_08049F2E:\n" - "\tcmp r0, 0x4\n" - "\tbne _08049F34\n" - "\tb _0804A244\n" - "_08049F34:\n" - "\tb _0804A294\n" - "_08049F36:\n" - "\tmovs r4, 0\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x42\n" - "\tadd r0, r10\n" - "\tldr r7, _0804A094 @ =gSprites\n" - "\tldr r2, [sp, 0x6C]\n" - "\tlsls r2, 1\n" - "\tmov r9, r2\n" - "\tldr r3, _0804A098 @ =gTradeMonSpriteCoords\n" - "\tmov r12, r3\n" - "\tmov r5, r10\n" - "\tlsls r5, 4\n" - "\tstr r5, [sp, 0x70]\n" - "\tldrb r0, [r0]\n" - "\tcmp r4, r0\n" - "\tbcs _08049F8E\n" - "\tadds r6, r7, 0\n" - "\tldr r2, _0804A09C @ =gUnknown_03004824\n" - "\tldr r0, [sp, 0x6C]\n" - "\tadd r0, r9\n" - "\tlsls r3, r0, 1\n" - "\tmovs r5, 0x4\n" - "_08049F62:\n" - "\tldr r0, [r2]\n" - "\tadds r1, r4, r3\n" - "\tadds r0, 0x34\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r6\n" - "\tadds r0, 0x3E\n" - "\tldrb r1, [r0]\n" - "\torrs r1, r5\n" - "\tstrb r1, [r0]\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r0, [r2]\n" - "\tadds r0, 0x42\n" - "\tadd r0, r10\n" - "\tldrb r0, [r0]\n" - "\tcmp r4, r0\n" - "\tbcc _08049F62\n" - "_08049F8E:\n" - "\tldr r1, _0804A09C @ =gUnknown_03004824\n" - "\tldr r0, [r1]\n" - "\tldr r5, [sp, 0x6C]\n" - "\tadd r5, r9\n" - "\tlsls r3, r5, 1\n" - "\tmov r2, r8\n" - "\tadds r6, r2, r3\n" - "\tadds r0, 0x34\n" - "\tadds r0, r6\n" - "\tldrb r1, [r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r7\n" - "\tadds r0, 0x3E\n" - "\tldrb r2, [r0]\n" - "\tmovs r1, 0x5\n" - "\tnegs r1, r1\n" - "\tands r1, r2\n" - "\tstrb r1, [r0]\n" - "\tldr r0, _0804A09C @ =gUnknown_03004824\n" - "\tldr r4, [r0]\n" - "\tadds r4, 0x34\n" - "\tadds r4, r6\n" - "\tldrb r1, [r4]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r7\n" - "\tmovs r1, 0x14\n" - "\tstrh r1, [r0, 0x2E]\n" - "\tldrb r0, [r4]\n" - "\tlsls r2, r0, 4\n" - "\tadds r2, r0\n" - "\tlsls r2, 2\n" - "\tadds r2, r7\n" - "\tlsls r5, 2\n" - "\tmov r1, r12\n" - "\tadds r0, r5, r1\n" - "\tldrb r0, [r0]\n" - "\tadds r3, 0x1\n" - "\tlsls r3, 1\n" - "\tadd r3, r12\n" - "\tldrb r1, [r3]\n" - "\tadds r0, r1\n" - "\tasrs r0, 1\n" - "\tlsls r0, 3\n" - "\tadds r0, 0xE\n" - "\tstrh r0, [r2, 0x32]\n" - "\tldrb r0, [r4]\n" - "\tlsls r1, r0, 4\n" - "\tadds r1, r0\n" - "\tlsls r1, 2\n" - "\tadds r1, r7\n" - "\tmov r0, r12\n" - "\tadds r0, 0x1\n" - "\tadds r5, r0\n" - "\tldrb r0, [r5]\n" - "\tlsls r0, 3\n" - "\tsubs r0, 0xC\n" - "\tstrh r0, [r1, 0x36]\n" - "\tldrb r1, [r4]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r7\n" - "\tldr r1, _0804A0A0 @ =sub_809D62C\n" - "\tbl StoreSpriteCallbackInData\n" - "\tldr r2, _0804A09C @ =gUnknown_03004824\n" - "\tldr r1, [r2]\n" - "\tadds r1, 0x80\n" - "\tadd r1, r10\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tldr r0, [r2]\n" - "\tadds r0, 0x34\n" - "\tadds r0, r6\n" - "\tldrb r1, [r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r7\n" - "\tbl sub_8078A34\n" - "\tbl Menu_DestroyCursor\n" - "\tldr r3, _0804A09C @ =gUnknown_03004824\n" - "\tldr r0, [r3]\n" - "\tadds r0, 0x4\n" - "\tldr r1, _0804A0A4 @ =gUnknown_0820C330\n" - "\tmov r5, r9\n" - "\tadds r2, r5, r1\n" - "\tldrb r2, [r2]\n" - "\tadds r1, 0x1\n" - "\tadd r1, r9\n" - "\tldrb r1, [r1]\n" - "\tstr r1, [sp]\n" - "\tmovs r1, 0x13\n" - "\tstr r1, [sp, 0x4]\n" - "\tmovs r1, 0\n" - "\tmovs r3, 0\n" - "\tbl Text_FillWindowRectDefPalette\n" - "\tldr r1, _0804A09C @ =gUnknown_03004824\n" - "\tldr r0, [r1]\n" - "\tadds r0, 0xC8\n" - "\tldr r2, [sp, 0x70]\n" - "\tmov r3, r10\n" - "\tsubs r1, r2, r3\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tldr r3, _0804A0A8 @ =gTradePartyBoxTilemap\n" - "\tmovs r2, 0xF\n" - "\tstr r2, [sp]\n" - "\tmovs r2, 0x11\n" - "\tstr r2, [sp, 0x4]\n" - "\tmovs r5, 0\n" - "\tstr r5, [sp, 0x8]\n" - "\tmovs r2, 0\n" - "\tbl sub_804A96C_alt\n" - "\tldr r0, [sp, 0x6C]\n" - "\tcmp r0, 0\n" - "\tbeq _0804A08C\n" - "\tb _0804A294\n" - "_0804A08C:\n" - "\tbl sub_804A80C\n" - "\tb _0804A294\n" - "\t.align 2, 0\n" - "_0804A094: .4byte gSprites\n" - "_0804A098: .4byte gTradeMonSpriteCoords\n" - "_0804A09C: .4byte gUnknown_03004824\n" - "_0804A0A0: .4byte sub_809D62C\n" - "_0804A0A4: .4byte gUnknown_0820C330\n" - "_0804A0A8: .4byte gTradePartyBoxTilemap\n" - "_0804A0AC:\n" - "\tldr r2, _0804A0DC @ =gSprites\n" - "\tldr r1, [sp, 0x6C]\n" - "\tlsls r0, r1, 1\n" - "\tadds r0, r1\n" - "\tlsls r0, 1\n" - "\tadd r0, r8\n" - "\tadds r1, r5, 0\n" - "\tadds r1, 0x34\n" - "\tadds r1, r0\n" - "\tldrb r1, [r1]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r2, 0x1C\n" - "\tadds r0, r2\n" - "\tldr r1, [r0]\n" - "\tldr r0, _0804A0E0 @ =sub_809D62C\n" - "\tcmp r1, r0\n" - "\tbeq _0804A0D4\n" - "\tb _0804A294\n" - "_0804A0D4:\n" - "\tmovs r0, 0x3\n" - "\tstrb r0, [r3]\n" - "\tb _0804A294\n" - "\t.align 2, 0\n" - "_0804A0DC: .4byte gSprites\n" - "_0804A0E0: .4byte sub_809D62C\n" - "_0804A0E4:\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0xC8\n" - "\tldr r2, [sp, 0x6C]\n" - "\tlsls r1, r2, 4\n" - "\tsubs r1, r2\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tldr r3, _0804A228 @ =gTradeMovesBoxTilemap\n" - "\tmovs r2, 0xF\n" - "\tstr r2, [sp]\n" - "\tmovs r7, 0x11\n" - "\tstr r7, [sp, 0x4]\n" - "\tmovs r5, 0\n" - "\tstr r5, [sp, 0x8]\n" - "\tmovs r2, 0\n" - "\tbl sub_804A96C_alt\n" - "\tldr r0, _0804A22C @ =gUnknown_03004824\n" - "\tldr r3, [r0]\n" - "\tldr r1, [sp, 0x6C]\n" - "\tlsls r6, r1, 1\n" - "\tadds r1, r6\n" - "\tmov r9, r1\n" - "\tlsls r1, 1\n" - "\tmov r2, r8\n" - "\tadds r0, r2, r1\n" - "\tadds r3, 0x34\n" - "\tadds r3, r0\n" - "\tldrb r0, [r3]\n" - "\tlsls r2, r0, 4\n" - "\tadds r2, r0\n" - "\tlsls r2, 2\n" - "\tldr r5, _0804A230 @ =gSprites\n" - "\tadds r2, r5\n" - "\tldr r4, _0804A234 @ =gTradeMonSpriteCoords\n" - "\tmov r0, r9\n" - "\tlsls r5, r0, 2\n" - "\tadds r0, r5, r4\n" - "\tldrb r0, [r0]\n" - "\tadds r1, 0x1\n" - "\tlsls r1, 1\n" - "\tadds r1, r4\n" - "\tldrb r1, [r1]\n" - "\tadds r0, r1\n" - "\tasrs r0, 1\n" - "\tlsls r0, 3\n" - "\tadds r0, 0xE\n" - "\tstrh r0, [r2, 0x20]\n" - "\tldrb r0, [r3]\n" - "\tlsls r1, r0, 4\n" - "\tadds r1, r0\n" - "\tlsls r1, 2\n" - "\tldr r2, _0804A230 @ =gSprites\n" - "\tadds r1, r2\n" - "\tadds r4, 0x1\n" - "\tadds r5, r4\n" - "\tldrb r0, [r5]\n" - "\tlsls r0, 3\n" - "\tsubs r0, 0xC\n" - "\tstrh r0, [r1, 0x22]\n" - "\tldrb r1, [r3]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r2\n" - "\tmovs r5, 0\n" - "\tstrh r5, [r0, 0x24]\n" - "\tldrb r1, [r3]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r0, r2\n" - "\tstrh r5, [r0, 0x26]\n" - "\tmov r0, sp\n" - "\tadds r0, 0x12\n" - "\tldr r1, [sp, 0x6C]\n" - "\tmov r2, r8\n" - "\tbl sub_804A2B4\n" - "\tadd r1, sp, 0xC\n" - "\tmovs r3, 0xFC\n" - "\tstrb r3, [r1]\n" - "\tadds r2, r1, 0\n" - "\tmovs r1, 0x6\n" - "\tstrb r1, [r2, 0x1]\n" - "\tmovs r1, 0x4\n" - "\tstrb r1, [r2, 0x2]\n" - "\tadds r1, r2, 0\n" - "\tstrb r3, [r1, 0x3]\n" - "\tstrb r7, [r1, 0x4]\n" - "\tlsls r0, 24\n" - "\tasrs r0, 24\n" - "\tmovs r1, 0x40\n" - "\tsubs r1, r0\n" - "\tlsrs r0, r1, 31\n" - "\tadds r1, r0\n" - "\tasrs r1, 1\n" - "\tstrb r1, [r2, 0x5]\n" - "\tldr r0, _0804A22C @ =gUnknown_03004824\n" - "\tldr r1, [r0]\n" - "\tadds r0, r1, 0x4\n" - "\tadds r1, 0x7A\n" - "\tldrb r2, [r1]\n" - "\tmov r1, r9\n" - "\tlsls r1, 6\n" - "\tmov r9, r1\n" - "\tadd r2, r9\n" - "\tldr r4, _0804A238 @ =gUnknown_0820C334\n" - "\tldr r3, [sp, 0x6C]\n" - "\tlsls r1, r3, 2\n" - "\tadds r3, r1, r4\n" - "\tldrb r3, [r3]\n" - "\tldr r5, _0804A23C @ =gUnknown_0820C334 + 0x1\n" - "\tadds r1, r5\n" - "\tldrb r1, [r1]\n" - "\tstr r1, [sp]\n" - "\tadd r1, sp, 0xC\n" - "\tbl Text_InitWindowAndPrintText\n" - "\tadd r7, sp, 0x34\n" - "\tadds r0, r7, 0\n" - "\tldr r1, [sp, 0x6C]\n" - "\tmov r2, r8\n" - "\tbl sub_804A33C\n" - "\tldr r0, _0804A22C @ =gUnknown_03004824\n" - "\tldr r2, [r0]\n" - "\tadds r0, r2, 0x4\n" - "\tldr r1, _0804A240 @ =gOtherText_Terminator2\n" - "\tadds r2, 0x7A\n" - "\tldrb r2, [r2]\n" - "\tadd r2, r9\n" - "\tadds r2, 0x20\n" - "\tadds r6, 0x1\n" - "\tlsls r6, 1\n" - "\tadds r4, r6, r4\n" - "\tldrb r5, [r4]\n" - "\tldr r3, _0804A23C @ =gUnknown_0820C334 + 0x1\n" - "\tadds r6, r3\n" - "\tldrb r4, [r6]\n" - "\tadds r4, 0x1\n" - "\tlsls r4, 24\n" - "\tlsrs r4, 24\n" - "\tstr r4, [sp]\n" - "\tadds r3, r5, 0\n" - "\tbl Text_InitWindowAndPrintText\n" - "\tldr r0, _0804A22C @ =gUnknown_03004824\n" - "\tldr r1, [r0]\n" - "\tadds r0, r1, 0x4\n" - "\tadds r1, 0x7A\n" - "\tldrb r2, [r1]\n" - "\tadd r2, r9\n" - "\tadds r2, 0x26\n" - "\tstr r4, [sp]\n" - "\tadds r1, r7, 0\n" - "\tadds r3, r5, 0\n" - "\tbl Text_InitWindowAndPrintText\n" - "\tldr r2, _0804A22C @ =gUnknown_03004824\n" - "\tldr r1, [r2]\n" - "\tb _0804A28A\n" - "\t.align 2, 0\n" - "_0804A228: .4byte gTradeMovesBoxTilemap\n" - "_0804A22C: .4byte gUnknown_03004824\n" - "_0804A230: .4byte gSprites\n" - "_0804A234: .4byte gTradeMonSpriteCoords\n" - "_0804A238: .4byte gUnknown_0820C334\n" - "_0804A23C: .4byte gUnknown_0820C334 + 0x1\n" - "_0804A240: .4byte gOtherText_Terminator2\n" - "_0804A244:\n" - "\tldr r0, _0804A2A4 @ =gUnknown_0820C14C\n" - "\tldr r0, [r0, 0x14]\n" - "\tadds r1, r5, 0\n" - "\tadds r1, 0x7E\n" - "\tldrh r1, [r1]\n" - "\tlsls r1, 5\n" - "\tldr r3, _0804A2A8 @ =0x06010000\n" - "\tadds r1, r3\n" - "\tmovs r2, 0x14\n" - "\tbl sub_804ACD8\n" - "\tldr r0, _0804A2AC @ =gUnknown_0820C3D1\n" - "\tmov r5, r10\n" - "\tlsls r1, r5, 1\n" - "\tadds r4, r1, r0\n" - "\tldrb r2, [r4]\n" - "\tadds r2, 0x4\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tadds r0, 0x1\n" - "\tadds r1, r0\n" - "\tldrb r3, [r1]\n" - "\tadds r3, 0x1\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tldrb r0, [r4]\n" - "\tstr r0, [sp]\n" - "\tldrb r0, [r1]\n" - "\tstr r0, [sp, 0x4]\n" - "\tmov r0, r10\n" - "\tmov r1, r8\n" - "\tbl sub_804A51C\n" - "\tldr r0, _0804A2B0 @ =gUnknown_03004824\n" - "\tldr r1, [r0]\n" - "_0804A28A:\n" - "\tadds r1, 0x80\n" - "\tadd r1, r10\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1]\n" - "_0804A294:\n" - "\tadd sp, 0x74\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0804A2A4: .4byte gUnknown_0820C14C\n" - "_0804A2A8: .4byte 0x06010000\n" - "_0804A2AC: .4byte gUnknown_0820C3D1\n" - "_0804A2B0: .4byte gUnknown_03004824"); -} -#endif - -#ifdef NONMATCHING -static -#endif -u8 sub_804A2B4(u8 *a0, u8 whichParty, u8 whichPokemon) -{ - u8 string[11]; - if (whichParty == 0) - { - GetMonData(&gPlayerParty[whichPokemon], MON_DATA_NICKNAME, string); - StringCopy10(a0, string); - GetMonGender(&gPlayerParty[whichPokemon]); - GetMonData(&gPlayerParty[whichPokemon], MON_DATA_LEVEL); - } - else - { - GetMonData(&gEnemyParty[whichPokemon], MON_DATA_NICKNAME, string); - StringCopy10(a0, string); - GetMonGender(&gEnemyParty[whichPokemon]); - GetMonData(&gEnemyParty[whichPokemon], MON_DATA_LEVEL); - } - return Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7294, a0); -} - -#ifdef NONMATCHING -static -#endif -void sub_804A33C(u8 *a0, u8 whichParty, u8 whichPokemon) -{ - u16 i; - u16 moves[4]; - if (gUnknown_03004824->unk_005d[whichParty][whichPokemon] == 0) - { - for (i = 0; i < 4; i ++) - { - if (whichParty == 0) - moves[i] = GetMonData(&gPlayerParty[whichPokemon], MON_DATA_MOVE1 + i, NULL); - else - moves[i] = GetMonData(&gEnemyParty[whichPokemon], MON_DATA_MOVE1 + i, NULL); - } - StringCopy(a0, gOtherText_Terminator); - for (i = 0; i < 4; i ++) - { - if (moves[i] != 0) - { - StringAppend(a0, gMoveNames[moves[i]]); - } - StringAppend(a0, gOtherText_ControlAndMiscText); - } - } - else - { - StringCopy(a0, gOtherText_Terminator); - StringAppend(a0, gOtherText_FourQuestions); - } -} - -#ifdef NONMATCHING -static void sub_804A41C(u8 whichParty) -{ - u8 i; - u8 nickname[22]; - u8 string[40]; - struct Pokemon *pokemon; - - string[0] = 0xFC; - string[1] = 0x06; - string[2] = 0x04; - string[3] = 0xFC; - string[4] = 0x11; - string[5] = 0x00; - - for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) - { - pokemon = whichParty == 0 ? &gPlayerParty[i] : &gEnemyParty[i]; - GetMonData(pokemon, MON_DATA_NICKNAME, nickname); - StringCopy10(string + 6, nickname); - GetMonGender(pokemon); - string[5] = (50 - Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7294, string + 6)) / 2; - Text_InitWindowAndPrintText(&gUnknown_03004824->window, string, gUnknown_03004824->unk_007a + 22 * 6 * whichParty + 22 * i, gTradeMonSpriteCoords[i + 6 * whichParty][0], gTradeMonSpriteCoords[i + 6 * whichParty][1]); - } -} -#else -__attribute__((naked)) -static void sub_804A41C(u8 whichParty) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x44\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tadd r3, sp, 0x1C\n" - "\tmovs r2, 0\n" - "\tmovs r1, 0xFC\n" - "\tstrb r1, [r3]\n" - "\tmovs r0, 0x6\n" - "\tstrb r0, [r3, 0x1]\n" - "\tmovs r0, 0x4\n" - "\tstrb r0, [r3, 0x2]\n" - "\tstrb r1, [r3, 0x3]\n" - "\tmovs r0, 0x11\n" - "\tstrb r0, [r3, 0x4]\n" - "\tstrb r2, [r3, 0x5]\n" - "\tmovs r6, 0\n" - "\tldr r1, _0804A470 @ =gUnknown_03004824\n" - "\tldr r0, [r1]\n" - "\tadds r0, 0x42\n" - "\tadds r0, r5\n" - "\tldrb r0, [r0]\n" - "\tcmp r6, r0\n" - "\tbcs _0804A504\n" - "\tmov r8, r3\n" - "\tadds r7, r1, 0\n" - "\tldr r0, _0804A474 @ =gTradeMonSpriteCoords\n" - "\tmov r9, r0\n" - "\tmovs r4, 0x1\n" - "\tadd r4, r9\n" - "\tmov r10, r4\n" - "_0804A462:\n" - "\tcmp r5, 0\n" - "\tbne _0804A47C\n" - "\tmovs r0, 0x64\n" - "\tadds r4, r6, 0\n" - "\tmuls r4, r0\n" - "\tldr r0, _0804A478 @ =gPlayerParty\n" - "\tb _0804A484\n" - "\t.align 2, 0\n" - "_0804A470: .4byte gUnknown_03004824\n" - "_0804A474: .4byte gTradeMonSpriteCoords\n" - "_0804A478: .4byte gPlayerParty\n" - "_0804A47C:\n" - "\tmovs r0, 0x64\n" - "\tadds r4, r6, 0\n" - "\tmuls r4, r0\n" - "\tldr r0, _0804A514 @ =gEnemyParty\n" - "_0804A484:\n" - "\tadds r4, r0\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x2\n" - "\tadd r2, sp, 0x4\n" - "\tbl GetMonData\n" - "\tmov r0, sp\n" - "\tadds r0, 0x22\n" - "\tadd r1, sp, 0x4\n" - "\tbl StringCopy10\n" - "\tadds r0, r4, 0\n" - "\tbl GetMonGender\n" - "\tmov r1, sp\n" - "\tadds r1, 0x22\n" - "\tldr r0, _0804A518 @ =gWindowTemplate_81E7294\n" - "\tbl Text_GetStringWidthFromWindowTemplate\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmovs r1, 0x32\n" - "\tsubs r1, r0\n" - "\tlsrs r0, r1, 31\n" - "\tadds r1, r0\n" - "\tasrs r1, 1\n" - "\tmov r0, r8\n" - "\tstrb r1, [r0, 0x5]\n" - "\tldr r1, [r7]\n" - "\tadds r0, r1, 0x4\n" - "\tadds r1, 0x7A\n" - "\tlsls r2, r5, 5\n" - "\tadds r2, r5\n" - "\tlsls r2, 2\n" - "\tldrb r1, [r1]\n" - "\tadds r2, r1\n" - "\tmovs r1, 0x16\n" - "\tmuls r1, r6\n" - "\tadds r2, r1\n" - "\tlsls r2, 16\n" - "\tlsrs r2, 16\n" - "\tlsls r1, r5, 1\n" - "\tadds r1, r5\n" - "\tlsls r1, 1\n" - "\tadds r1, r6, r1\n" - "\tlsls r1, 1\n" - "\tmov r4, r9\n" - "\tadds r3, r1, r4\n" - "\tldrb r3, [r3]\n" - "\tadd r1, r10\n" - "\tldrb r1, [r1]\n" - "\tstr r1, [sp]\n" - "\tmov r1, r8\n" - "\tbl Text_InitWindowAndPrintText\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r0, [r7]\n" - "\tadds r0, 0x42\n" - "\tadds r0, r5\n" - "\tldrb r0, [r0]\n" - "\tcmp r6, r0\n" - "\tbcc _0804A462\n" - "_0804A504:\n" - "\tadd sp, 0x44\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0804A514: .4byte gEnemyParty\n" - "_0804A518: .4byte gWindowTemplate_81E7294"); -} -#endif - -#ifdef NONMATCHING -static -#endif -void sub_804A51C(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4, u8 a5) -{ - u8 nickname[24]; - u8 level; - u8 gender; - u8 lv_div_10; - sub_804A96C(&gUnknown_03004824->unk_00c8, a4, a5, gTradeMonBoxTilemap, 6, 3, 0); - if (a0 == 0) - { - level = GetMonData(&gPlayerParty[a1], MON_DATA_LEVEL, NULL); - gender = GetMonGender(&gPlayerParty[a1]); - GetMonData(&gPlayerParty[a1], MON_DATA_NICKNAME, nickname); - } - else - { - level = GetMonData(&gEnemyParty[a1], MON_DATA_LEVEL, NULL); - gender = GetMonGender(&gEnemyParty[a1]); - GetMonData(&gEnemyParty[a1], MON_DATA_NICKNAME, nickname); - } - if (gUnknown_03004824->unk_005d[a0][a1] == 0) - { - lv_div_10 = level / 10; - if (lv_div_10 != 0) - { - gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3] = lv_div_10 + 0x60; - } - gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 + 1] = (u8)(level % 10) + 0x70; - if (gender == MON_MALE) - { - if (!NameHasGenderSymbol(nickname, MON_MALE)) - { - gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] += 1; - } - } - else if (gender == MON_FEMALE) - { - if (!NameHasGenderSymbol(nickname, MON_FEMALE)) - { - gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] += 2; - } - } - } - else - { - gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 32] = gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 33]; - gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] = gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 36] | 0x400; - } -#ifdef GERMAN - gUnknown_03004824->unk_00c8.unk_10 = 1; -#endif -} - -#ifdef NONMATCHING -static void sub_804A6DC(u8 whichParty) -{ - int i; - for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) - { - sub_804A51C(whichParty, i, gTradeLevelDisplayCoords[whichParty][i][0], gTradeLevelDisplayCoords[whichParty][i][1], gTradeMonBoxCoords[whichParty][i][0], gTradeMonBoxCoords[whichParty][i][1]); - } -} -#else -__attribute__((naked)) -static void sub_804A6DC(u8 whichParty) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tsub sp, 0x8\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tmovs r7, 0\n" - "\tldr r0, _0804A734 @ =gUnknown_03004824\n" - "\tldr r0, [r0]\n" - "\tadds r0, 0x42\n" - "\tadds r0, r6\n" - "\tldrb r0, [r0]\n" - "\tcmp r7, r0\n" - "\tbge _0804A72C\n" - "\tlsls r0, r6, 1\n" - "\tadds r0, r6\n" - "\tldr r1, _0804A738 @ =gTradeLevelDisplayCoords\n" - "\tlsls r0, 2\n" - "\tadds r5, r0, r1\n" - "\tldr r1, _0804A73C @ =gTradeMonBoxCoords\n" - "\tadds r4, r0, r1\n" - "_0804A702:\n" - "\tlsls r1, r7, 24\n" - "\tlsrs r1, 24\n" - "\tldrb r2, [r5]\n" - "\tldrb r3, [r5, 0x1]\n" - "\tldrb r0, [r4]\n" - "\tstr r0, [sp]\n" - "\tldrb r0, [r4, 0x1]\n" - "\tstr r0, [sp, 0x4]\n" - "\tadds r0, r6, 0\n" - "\tbl sub_804A51C\n" - "\tadds r5, 0x2\n" - "\tadds r4, 0x2\n" - "\tadds r7, 0x1\n" - "\tldr r0, _0804A734 @ =gUnknown_03004824\n" - "\tldr r0, [r0]\n" - "\tadds r0, 0x42\n" - "\tadds r0, r6\n" - "\tldrb r0, [r0]\n" - "\tcmp r7, r0\n" - "\tblt _0804A702\n" - "_0804A72C:\n" - "\tadd sp, 0x8\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0804A734: .4byte gUnknown_03004824\n" - "_0804A738: .4byte gTradeLevelDisplayCoords\n" - "_0804A73C: .4byte gTradeMonBoxCoords"); -} -#endif - -static void sub_804A740(u8 whichParty) -{ - int i; - for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) - { - gSprites[gUnknown_03004824->partyIcons[whichParty][i]].invisible = FALSE; - gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos1.x = gTradeMonSpriteCoords[6 * whichParty + i][0] * 8 + 14; - gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos1.y = gTradeMonSpriteCoords[6 * whichParty + i][1] * 8 - 12; - gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos2.x = 0; - gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos2.y = 0; - } -} - -static void sub_804A80C(void) -{ - Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); - sub_804A41C(1); -} - -static void sub_804A840(u8 whichParty) -{ - if (whichParty == 0) - { - Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[0][0], 0, gUnknown_0820C330[0][1], 19); - sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 0, 0, gTradePartyBoxTilemap, 15, 17, 0); - sub_804A6DC(0); - sub_804A41C(0); - sub_804A740(0); - sub_804A938(&gUnknown_03004824->unk_00c8); - } - else - { - Menu_DestroyCursor(); - Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); - sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15, 0, gTradePartyBoxTilemap, 15, 17, 0); - sub_804A6DC(1); - sub_804A41C(1); - sub_804A740(1); - sub_804A938(&gUnknown_03004824->unk_00c8); - } - sub_804ACD8(gUnknown_0820C14C[1], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); - gUnknown_03004824->unk_0080[whichParty] = 0; -} - -static void sub_804A938(struct UnkStructD *unkStructD) -{ - unkStructD->unk_10 = 1; -} - -static void sub_804A940(struct UnkStructD *unkStructD) -{ - if (unkStructD->unk_10) - { - CpuCopy16(unkStructD->unk_12, unkStructD->vramAddr, sizeof(unkStructD->unk_12)); - unkStructD->unk_10 = 0; - } -} - -static void sub_804A964(struct UnkStructD *unkStructD, void *dest) -{ - unkStructD->unk_10 = 0; - unkStructD->vramAddr = dest; -} - -static void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, const u16 *tilemap, u8 width, u8 height, u16 sp8) { - int y, x; - - for (y = 0; y < height; y++) - { - - for (x = 0; x < width; x++) - { - arg0->unk_12[(top * 32 + left) + y * 32 + x] = tilemap[width * y + x] | sp8; - } - } - -#if ENGLISH - arg0->unk_10 = 1; -#endif -} - -#if GERMAN -static void sub_804A96C_alt(struct UnkStructD *arg0, u8 left, u8 top, const u16 *tilemap, u8 width, u8 height, u16 sp8) { - sub_804A96C(arg0, left, top, tilemap, width, height, sp8); - - arg0->unk_10 = 1; -} -#endif - -static void sub_804A9F4(u8 unused) -{ - Menu_EraseScreen(); -} - -static void sub_804AA00(u8 unused) -{ - Menu_EraseScreen(); -} - -static void sub_804AA0C(u8 a0) -{ - TextWindow_DrawStdFrame(&gUnknown_03004824->window, gTradeMessageWindowRects[a0][0], gTradeMessageWindowRects[a0][1], gTradeMessageWindowRects[a0][2], gTradeMessageWindowRects[a0][3]); - Text_InitWindowAndPrintText(&gUnknown_03004824->window, gUnknown_0820C2F0[a0], 0x180 + gUnknown_03004824->unk_007a, gTradeMessageWindowRects[a0][0] + 1, gTradeMessageWindowRects[a0][1] + 1); -} - -static void sub_804AA88(void) -{ - int i; - for (i = 0; i < 4; i ++) - { - gUnknown_03004824->unk_08dc[i].unk_00 = 0; - gUnknown_03004824->unk_08dc[i].unk_02 = 0; - gUnknown_03004824->unk_08dc[i].unk_04 |= 0xff; - } -} - -static void sub_804AADC(u16 a0, u8 a1) -{ - int i; - for (i = 0; i < 4; i ++) - { - if (gUnknown_03004824->unk_08dc[i].unk_00 == 0) - { - gUnknown_03004824->unk_08dc[i].unk_02 = a0; - gUnknown_03004824->unk_08dc[i].unk_04 = a1; - gUnknown_03004824->unk_08dc[i].unk_00 = 1; - break; - } - } -} - -static void sub_804AB30(void) -{ - int i; - for (i = 0; i < 4; i ++) - { - if (gUnknown_03004824->unk_08dc[i].unk_00) - { - if (gUnknown_03004824->unk_08dc[i].unk_02 != 0) - { - gUnknown_03004824->unk_08dc[i].unk_02 --; - continue; - } - switch (gUnknown_03004824->unk_08dc[i].unk_04) - { - case 0: - Trade_SendData(gUnknown_03004824); - break; - case 1: - sub_804AA0C(0); - break; - case 2: - sub_804AA0C(2); - break; - case 3: - sub_804AA0C(3); - break; - case 4: - sub_804AA0C(3); - break; - case 5: - sub_804AA0C(3); - break; - } - gUnknown_03004824->unk_08dc[i].unk_00 = 0; - } - } -} - -static bool8 sub_804ABF8(void) -{ - switch (gUnknown_03004824->unk_00b4) - { - case 8: - gUnknown_03004824->unk_007e = LoadSpriteSheet(&gUnknown_0820C07C[gUnknown_03004824->unk_00b4]); - gUnknown_03004824->unk_00b4 ++; - return FALSE; - case 13: - LoadSpritePalette(&gSpritePalette_TradeScreenText); - gUnknown_03004824->unk_00b4 ++; - return FALSE; - case 14: - LoadSpritePalette(&gUnknown_0820C12C); - gUnknown_03004824->unk_00b4 ++; - return FALSE; - case 15: - LoadSpriteSheet(&gUnknown_0820C124); - gUnknown_03004824->unk_00b4 ++; - // fallthrough - case 16: - gUnknown_03004824->unk_00b4 = 0; - return TRUE; - default: - LoadSpriteSheet(&gUnknown_0820C07C[gUnknown_03004824->unk_00b4]); - gUnknown_03004824->unk_00b4 ++; - return FALSE; - } -} - -static void sub_804ACD8(const u8 *src, u8 *dest, u8 a2) -{ - sub_804AFB8(&gWindowTemplate_81E725C, dest, src, a2); -} - -#ifdef NONMATCHING -static void sub_804ACF4(u8 who) -{ - struct Pokemon *pokemon; - int i; - switch (who) - { - case 0: - for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) - { - pokemon = &gPlayerParty[i]; - if (GetMonData(pokemon, MON_DATA_IS_EGG) == TRUE) - { - gUnknown_03004824->unk_0051[0][i] = 0; - gUnknown_03004824->unk_005d[0][i] = 1; - } - else if (GetMonData(pokemon, MON_DATA_HP) == 0) - { - gUnknown_03004824->unk_0051[0][i] = 0; - gUnknown_03004824->unk_005d[0][i] = 0; - } - else - { - gUnknown_03004824->unk_0051[0][i] = 1; - gUnknown_03004824->unk_005d[0][i] = 0; - } - } - break; - case 1: - for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) - { - pokemon = &gEnemyParty[i]; - if (GetMonData(pokemon, MON_DATA_IS_EGG) == TRUE) - { - gUnknown_03004824->unk_0051[1][i] = 0; - gUnknown_03004824->unk_005d[1][i] = 1; - } - else if (GetMonData(pokemon, MON_DATA_HP) == 0) - { - gUnknown_03004824->unk_0051[1][i] = 0; - gUnknown_03004824->unk_005d[1][i] = 0; - } - else - { - gUnknown_03004824->unk_0051[1][i] = 1; - gUnknown_03004824->unk_005d[1][i] = 0; - } - } - break; - } -} -#else -static __attribute__((naked)) void sub_804ACF4(u8 who) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r8, r0\n" - "\tcmp r0, 0\n" - "\tbeq _0804AD0C\n" - "\tcmp r0, 0x1\n" - "\tbeq _0804ADA0\n" - "\tb _0804AE2C\n" - "_0804AD0C:\n" - "\tmovs r7, 0\n" - "\tldr r1, _0804AD4C @ =gUnknown_03004824\n" - "\tldr r0, [r1]\n" - "\tadds r0, 0x42\n" - "\tldrb r0, [r0]\n" - "\tcmp r7, r0\n" - "\tblt _0804AD1C\n" - "\tb _0804AE2C\n" - "_0804AD1C:\n" - "\tadds r6, r1, 0\n" - "\tmovs r5, 0\n" - "\tmov r9, r5\n" - "_0804AD22:\n" - "\tmovs r0, 0x64\n" - "\tadds r1, r7, 0\n" - "\tmuls r1, r0\n" - "\tldr r0, _0804AD50 @ =gPlayerParty\n" - "\tadds r4, r1, r0\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x2D\n" - "\tbl GetMonData\n" - "\tadds r1, r0, 0\n" - "\tcmp r1, 0x1\n" - "\tbne _0804AD54\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x51\n" - "\tadds r0, r5\n" - "\tmov r2, r9\n" - "\tstrb r2, [r0]\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x5D\n" - "\tadds r0, r5\n" - "\tb _0804AD84\n" - "\t.align 2, 0\n" - "_0804AD4C: .4byte gUnknown_03004824\n" - "_0804AD50: .4byte gPlayerParty\n" - "_0804AD54:\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x39\n" - "\tbl GetMonData\n" - "\tadds r1, r0, 0\n" - "\tcmp r1, 0\n" - "\tbne _0804AD72\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x51\n" - "\tadds r0, r5\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x5D\n" - "\tadds r0, r5\n" - "\tb _0804AD84\n" - "_0804AD72:\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x51\n" - "\tadds r0, r5\n" - "\tmovs r1, 0x1\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x5D\n" - "\tadds r0, r5\n" - "\tmov r1, r9\n" - "_0804AD84:\n" - "\tstrb r1, [r0]\n" - "\tldr r0, _0804AD9C @ =gUnknown_03004824\n" - "\tadds r5, 0x1\n" - "\tadds r7, 0x1\n" - "\tldr r0, [r0]\n" - "\tadds r0, 0x42\n" - "\tadd r0, r8\n" - "\tldrb r0, [r0]\n" - "\tcmp r7, r0\n" - "\tblt _0804AD22\n" - "\tb _0804AE2C\n" - "\t.align 2, 0\n" - "_0804AD9C: .4byte gUnknown_03004824\n" - "_0804ADA0:\n" - "\tmovs r7, 0\n" - "\tldr r1, _0804ADE0 @ =gUnknown_03004824\n" - "\tldr r0, [r1]\n" - "\tadds r0, 0x43\n" - "\tldrb r0, [r0]\n" - "\tcmp r7, r0\n" - "\tbge _0804AE2C\n" - "\tadds r6, r1, 0\n" - "\tmovs r5, 0x6\n" - "\tmovs r2, 0\n" - "\tmov r9, r2\n" - "_0804ADB6:\n" - "\tmovs r0, 0x64\n" - "\tadds r1, r7, 0\n" - "\tmuls r1, r0\n" - "\tldr r0, _0804ADE4 @ =gEnemyParty\n" - "\tadds r4, r1, r0\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x2D\n" - "\tbl GetMonData\n" - "\tadds r1, r0, 0\n" - "\tcmp r1, 0x1\n" - "\tbne _0804ADE8\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x51\n" - "\tadds r0, r5\n" - "\tmov r2, r9\n" - "\tstrb r2, [r0]\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x5D\n" - "\tadds r0, r5\n" - "\tb _0804AE18\n" - "\t.align 2, 0\n" - "_0804ADE0: .4byte gUnknown_03004824\n" - "_0804ADE4: .4byte gEnemyParty\n" - "_0804ADE8:\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x39\n" - "\tbl GetMonData\n" - "\tadds r1, r0, 0\n" - "\tcmp r1, 0\n" - "\tbne _0804AE06\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x51\n" - "\tadds r0, r5\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x5D\n" - "\tadds r0, r5\n" - "\tb _0804AE18\n" - "_0804AE06:\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x51\n" - "\tadds r0, r5\n" - "\tmovs r1, 0x1\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x5D\n" - "\tadds r0, r5\n" - "\tmov r1, r9\n" - "_0804AE18:\n" - "\tstrb r1, [r0]\n" - "\tldr r0, _0804AE38 @ =gUnknown_03004824\n" - "\tadds r5, 0x1\n" - "\tadds r7, 0x1\n" - "\tldr r0, [r0]\n" - "\tadds r0, 0x42\n" - "\tadd r0, r8\n" - "\tldrb r0, [r0]\n" - "\tcmp r7, r0\n" - "\tblt _0804ADB6\n" - "_0804AE2C:\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0804AE38: .4byte gUnknown_03004824"); -} -#endif - -static void sub_804AE3C(u8 who) -{ - u16 i; - u16 curHp; - u16 maxHp; - switch (who) - { - case 0: - for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) - { - curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); - gUnknown_03004824->unk_0069[0][i] = GetHPBarLevel(curHp, maxHp); - } - break; - case 1: - for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) - { - curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP); - maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP); - gUnknown_03004824->unk_0069[1][i] = GetHPBarLevel(curHp, maxHp); - } - break; - } -} - -static void sub_804AF10(void) -{ - int i, j; - for (i = 0; i < 2; i ++) - { - for (j = 0; j < gUnknown_03004824->partyCounts[i]; j ++) - { - sub_809D824(&gSprites[gUnknown_03004824->partyIcons[i][j]], 4 - gUnknown_03004824->unk_0069[i][j]); - } - } -} - -static void sub_804AF84(void) -{ - int i; - for (i = 0; i < 11; i ++) - if (gSaveBlock1.giftRibbons[i] == 0 && gUnknown_03004824->unk_00b5[i] != 0) - gSaveBlock1.giftRibbons[i] = gUnknown_03004824->unk_00b5[i]; -} - -static void sub_804AFB8(const struct WindowTemplate *windowConfig, u8 *dest, const u8 *src, u8 size) -{ - u8 i; - u8 *tileBuffer; - size = (size + 3) / 4; - tileBuffer = gTileBuffer; - CpuFill16(0, tileBuffer, size * 0x80); - CpuFill16(0, tileBuffer + windowConfig->width * 0x20, size * 0x80); - Text_InitWindow8004E3C(windowConfig, tileBuffer, src); - for (i = 0; i < size; i ++) - { - CpuCopy16(&tileBuffer[32 * (i * 4)], &dest[32 * (i * 8)], 0x80); - CpuCopy16(&tileBuffer[32 * (i * 4 + windowConfig->width)], &dest[32 * (i * 8 + 4)], 0x80); - } -} - -static void sub_804B058(struct Sprite *sprite) -{ - if (++ sprite->data[0] == 10) - { - PlaySE(SE_BOWA); - sprite->data[0] = 0; - } -} - -static void sub_804B07C(struct Sprite *sprite) -{ - if (sprite->data[1] == 0) - { - if (++ sprite->data[0] == 12) - sprite->data[0] = 0; - LoadPalette(&gTradeGlow2PaletteAnimTable[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2); - } -} - -static void sub_804B0BC(struct Sprite *sprite) -{ - sprite->data[0] ++; - sprite->pos2.y ++; - if (sprite->data[0] == 10) - DestroySprite(sprite); -} - -static void sub_804B0E0(struct Sprite *sprite) -{ - sprite->data[0] ++; - sprite->pos2.y --; - if (sprite->data[0] == 10) - DestroySprite(sprite); -} - -static void sub_804B104(struct Sprite *sprite) -{ - if (++ sprite->data[0] == 15) - { - PlaySE(SE_W107); - sprite->data[0] = 0; - } -} - -static void sub_804B128(void) -{ - struct BgAffineDstData dest; - DoBgAffineSet(&dest, gUnknown_03004828->unk_0104 << 8, gUnknown_03004828->unk_0106 << 8, gUnknown_03004828->unk_010c, gUnknown_03004828->unk_010e, gUnknown_03004828->unk_0118, gUnknown_03004828->unk_0118, gUnknown_03004828->unk_011c); - REG_BG2PA = dest.pa; - REG_BG2PB = dest.pb; - REG_BG2PC = dest.pc; - REG_BG2PD = dest.pd; - REG_BG2X = dest.dx; - REG_BG2Y = dest.dy; -} - -#ifdef NONMATCHING -static void sub_804B1BC(void) -{ - REG_BG1VOFS = gUnknown_03004828->bg1vofs; - REG_BG1HOFS = gUnknown_03004828->bg1hofs; - if ((REG_DISPCNT & 7) == DISPCNT_MODE_0) - { - REG_BG2VOFS = gUnknown_03004828->bg2vofs; - REG_BG2HOFS = gUnknown_03004828->bg2hofs; - } - else - { - sub_804B128(); - } -} -#else -__attribute__((naked)) static void sub_804B1BC(void) -{ - asm_unified("\tpush {lr}\n" - "\tldr r1, _0804B1FC @ =REG_BG1VOFS\n" - "\tldr r0, _0804B200 @ =gUnknown_03004828\n" - "\tldr r2, [r0]\n" - "\tmovs r3, 0x88\n" - "\tlsls r3, 1\n" - "\tadds r0, r2, r3\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r1]\n" - "\tsubs r1, 0x2\n" - "\tadds r3, 0x2\n" - "\tadds r0, r2, r3\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r1]\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 19\n" - "\tldrh r0, [r0]\n" - "\tmovs r1, 0x7\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0804B208\n" - "\tldr r1, _0804B204 @ =REG_BG2VOFS\n" - "\tadds r3, 0x2\n" - "\tadds r0, r2, r3\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r1]\n" - "\tsubs r1, 0x2\n" - "\tadds r3, 0x2\n" - "\tadds r0, r2, r3\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r1]\n" - "\tb _0804B20C\n" - "\t.align 2, 0\n" - "_0804B1FC: .4byte REG_BG1VOFS\n" - "_0804B200: .4byte gUnknown_03004828\n" - "_0804B204: .4byte REG_BG2VOFS\n" - "_0804B208:\n" - "\tbl sub_804B128\n" - "_0804B20C:\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif - -static void sub_804B210(void) -{ - sub_804B1BC(); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void sub_804B228(void) -{ - gUnknown_03004828->unk_00b4 = 0; - gUnknown_03004828->unk_00b2 = 0; - gUnknown_03004828->unk_00b3 = 0; -} - -#ifdef NONMATCHING -static -#endif -void sub_804B24C(void) -{ - if (gUnknown_03004828->unk_00b2 == gUnknown_03004828->unk_00b3) - { - gUnknown_03004828->unk_00b4 ++; - } - else - { - gUnknown_03004828->unk_00b4 = 0; - } - if (gUnknown_03004828->unk_00b4 > 0xb4) - { - gUnknown_03004828->unk_00b4 = 0; - gUnknown_03004828->unk_00b3 = 0; - gUnknown_03004828->unk_00b2 = 0; - } - gUnknown_03004828->unk_00b3 = gUnknown_03004828->unk_00b2; -} - -static u8 sub_804B2B0(void) -{ - if (gReceivedRemoteLinkPlayers) - return GetMultiplayerId(); - return 0; -} - -static void sub_804B2D0(u8 whichParty, u8 a1) -{ - u8 v0; - struct Pokemon *pokemon; - u16 species; - u32 personality; - - v0 = 0; - pokemon = NULL; - if (whichParty == 0) - { - pokemon = &gPlayerParty[gUnknown_020297D8[0]]; - v0 = 1; - } - if (whichParty == 1) - { - pokemon = &gEnemyParty[gUnknown_020297D8[1] % 6]; - v0 = 3; - } - switch (a1) - { - case 0: - species = GetMonData(pokemon, MON_DATA_SPECIES2); - personality = GetMonData(pokemon, MON_DATA_PERSONALITY); - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gSharedMem, gUnknown_081FAF4C[whichParty * 2 + 1], species, personality); - LoadCompressedObjectPalette(GetMonSpritePalStruct(pokemon)); - gUnknown_03004828->tradeSpecies[whichParty] = species; - break; - case 1: - GetMonSpriteTemplate_803C56C(GetMonSpritePalStruct(pokemon)->tag, v0); - gUnknown_03004828->pokePicSpriteIdxs[whichParty] = CreateSprite(&gUnknown_02024E8C, 0x78, 0x3c, 0x6); - gSprites[gUnknown_03004828->pokePicSpriteIdxs[whichParty]].invisible = TRUE; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; - break; - } -} - -#ifdef NONMATCHING -static void sub_804B41C(void) -// Link trade init -{ - switch (gMain.state) - { - case 0: - REG_DISPCNT = 0; - ResetTasks(); - CloseLink(); - gUnknown_03004828 = &ewram_2010000.unk_0f000; - ResetSpriteData(); - FreeAllSpritePalettes(); - SetVBlankCallback(sub_804B210); - sub_804B228(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); - Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E6F84); - gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); - TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); - Menu_EraseScreen(); - gLinkType = 0x1144; - gMain.state ++; - LZDecompressVram(gUnknown_08D00000, (void *)VRAM); - CpuCopy16(gUnknown_08D00524, ewram, 0x1000); - DmaCopy16Defvars(3, ewram, BG_SCREEN_ADDR(5), 0x500); - LoadCompressedPalette(gUnknown_08D004E0, 0, 32); - gUnknown_03004828->unk_00b6 = 0; - gUnknown_03004828->unk_00c4 = 0; - gUnknown_03004828->isLinkTrade = TRUE; - gUnknown_03004828->unk_0104 = 0x40; - gUnknown_03004828->unk_0106 = 0x40; - gUnknown_03004828->unk_0108 = 0; - gUnknown_03004828->unk_010a = 0; - gUnknown_03004828->unk_010c = 0x78; - gUnknown_03004828->unk_010e = 0x50; - gUnknown_03004828->unk_0118 = 0x100; - gUnknown_03004828->unk_011c = 0; - break; - case 1: - OpenLink(); - gMain.state ++; - gUnknown_03004828->unk_00c0 = 0; - break; - case 2: - if (++ gUnknown_03004828->unk_00c0 > 60) - { - gUnknown_03004828->unk_00c0 = 0; - gMain.state ++; - } - break; - case 3: - if (IsLinkMaster()) - { - if (GetLinkPlayerCount_2() >= sub_800820C() && ++ gUnknown_03004828->unk_00c0 > 30) - { - sub_8007F4C(); - gMain.state ++; - } - } - else - { - gMain.state ++; - } - break; - case 4: - sub_804B24C(); - if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) gMain.state ++; - break; - case 5: - gUnknown_03004828->unk_009c = 0; - gUnknown_03004828->unk_009d = 0; - gUnknown_03004828->unk_00bd = 0; - sub_804B2D0(0, 0); - gMain.state ++; - break; - case 6: - sub_804B2D0(0, 1); - gMain.state ++; - break; - case 7: - sub_804B2D0(1, 0); - gMain.state ++; - break; - case 8: - sub_804B2D0(1, 1); - gMain.state ++; - break; - case 9: - sub_804C164(); - LoadSpriteSheet(&gUnknown_0821594C); - LoadSpritePalette(&gUnknown_08215954); - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); - gMain.state ++; - break; - case 10: - gMain.state ++; - // fallthrough - case 11: - sub_804BBE8(5); - sub_804BBE8(0); - sub_804C1A8(); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gMain.state ++; - break; - case 12: - if (!gPaletteFade.active) - { - SetMainCallback2(sub_804DB84); - } - break; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} -#else -static __attribute__((naked)) void sub_804B41C(void) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tsub sp, 0x4\n" - "\tldr r1, _0804B43C @ =gMain\n" - "\tldr r2, _0804B440 @ =0x0000043c\n" - "\tadds r0, r1, r2\n" - "\tldrb r0, [r0]\n" - "\tadds r2, r1, 0\n" - "\tcmp r0, 0xC\n" - "\tbls _0804B430\n" - "\tb _0804B76E_break\n" - "_0804B430:\n" - "\tlsls r0, 2\n" - "\tldr r1, _0804B444 @ =_0804B448\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_0804B43C: .4byte gMain\n" - "_0804B440: .4byte 0x0000043c\n" - "_0804B444: .4byte _0804B448\n" - "\t.align 2, 0\n" - "_0804B448:\n" - "\t.4byte _0804B47C_case00\n" - "\t.4byte _0804B5AC_case01\n" - "\t.4byte _0804B5D4_case02\n" - "\t.4byte _0804B5FC_case03\n" - "\t.4byte _0804B648_case04\n" - "\t.4byte _0804B678_case05\n" - "\t.4byte _0804B6A8_case06\n" - "\t.4byte _0804B6B2_case07\n" - "\t.4byte _0804B6CC_case08\n" - "\t.4byte _0804B6E4_case09\n" - "\t.4byte _0804B71C_case10\n" - "\t.4byte _0804B726_case11\n" - "\t.4byte _0804B75C_case12\n" - "_0804B47C_case00:\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 19\n" - "\tmovs r0, 0\n" - "\tstrh r0, [r1]\n" - "\tbl ResetTasks\n" - "\tbl CloseLink\n" - "\tldr r6, _0804B570 @ =gUnknown_03004828\n" - "\tldr r5, _0804B574 @ =gSharedMem + 0x1F000\n" - "\tstr r5, [r6]\n" - "\tbl ResetSpriteData\n" - "\tbl FreeAllSpritePalettes\n" - "\tldr r0, _0804B578 @ =sub_804B210\n" - "\tbl SetVBlankCallback\n" - "\tbl sub_804B228\n" - "\tldr r4, _0804B57C @ =gWindowTemplate_81E6F84\n" - "\tadds r0, r4, 0\n" - "\tbl Text_LoadWindowTemplate\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x4\n" - "\tadds r1, r4, 0\n" - "\tbl Text_InitWindowWithTemplate\n" - "\tmovs r0, 0x2\n" - "\tbl TextWindow_SetBaseTileNum\n" - "\tldr r1, [r6]\n" - "\tadds r1, 0x34\n" - "\tstrb r0, [r1]\n" - "\tldr r0, [r6]\n" - "\tadds r0, 0x4\n" - "\tbl TextWindow_LoadStdFrameGraphics\n" - "\tbl Menu_EraseScreen\n" - "\tldr r1, _0804B580 @ =gLinkType\n" - "\tldr r4, _0804B584 @ =0x00001144\n" - "\tadds r0, r4, 0\n" - "\tstrh r0, [r1]\n" - "\tldr r1, _0804B588 @ =gMain\n" - "\tldr r0, _0804B58C @ =0x0000043c\n" - "\tadds r1, r0\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tldr r0, _0804B590 @ =gUnknown_08D00000\n" - "\tmovs r1, 0xC0\n" - "\tlsls r1, 19\n" - "\tbl LZDecompressVram\n" - "\tldr r0, _0804B594 @ =gUnknown_08D00524\n" - "\tldr r1, _0804B598 @ =0xfffe1000\n" - "\tadds r5, r1\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 4\n" - "\tadds r1, r5, 0\n" - "\tbl CpuSet\n" - "\tldr r1, _0804B59C @ =0x06002800\n" - "\tldr r0, _0804B5A0 @ =0x040000d4\n" - "\tstr r5, [r0]\n" - "\tstr r1, [r0, 0x4]\n" - "\tldr r1, _0804B5A4 @ =0x80000280\n" - "\tstr r1, [r0, 0x8]\n" - "\tldr r0, [r0, 0x8]\n" - "\tldr r0, _0804B5A8 @ =gUnknown_08D004E0\n" - "\tmovs r1, 0\n" - "\tmovs r2, 0x20\n" - "\tbl LoadCompressedPalette\n" - "\tldr r1, [r6]\n" - "\tadds r0, r1, 0\n" - "\tadds r0, 0xB6\n" - "\tmovs r2, 0\n" - "\tstrh r2, [r0]\n" - "\tadds r0, 0xE\n" - "\tstrh r2, [r0]\n" - "\tmovs r4, 0x8F\n" - "\tlsls r4, 1\n" - "\tadds r1, r4\n" - "\tmovs r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tldr r3, [r6]\n" - "\tmovs r1, 0x82\n" - "\tlsls r1, 1\n" - "\tadds r0, r3, r1\n" - "\tmovs r1, 0x40\n" - "\tstrh r1, [r0]\n" - "\tsubs r4, 0x18\n" - "\tadds r0, r3, r4\n" - "\tstrh r1, [r0]\n" - "\tadds r1, 0xC8\n" - "\tadds r0, r3, r1\n" - "\tstrh r2, [r0]\n" - "\tadds r4, 0x4\n" - "\tadds r0, r3, r4\n" - "\tstrh r2, [r0]\n" - "\tmovs r0, 0x86\n" - "\tlsls r0, 1\n" - "\tadds r1, r3, r0\n" - "\tmovs r0, 0x78\n" - "\tstrh r0, [r1]\n" - "\tadds r4, 0x4\n" - "\tadds r1, r3, r4\n" - "\tmovs r0, 0x50\n" - "\tstrh r0, [r1]\n" - "\tadds r0, 0xC8\n" - "\tadds r1, r3, r0\n" - "\tsubs r0, 0x18\n" - "\tstrh r0, [r1]\n" - "\tmovs r1, 0x8E\n" - "\tlsls r1, 1\n" - "\tadds r0, r3, r1\n" - "\tstrh r2, [r0]\n" - "\tb _0804B76E_break\n" - "\t.align 2, 0\n" - "_0804B570: .4byte gUnknown_03004828\n" - "_0804B574: .4byte gSharedMem + 0x1F000\n" - "_0804B578: .4byte sub_804B210\n" - "_0804B57C: .4byte gWindowTemplate_81E6F84\n" - "_0804B580: .4byte gLinkType\n" - "_0804B584: .4byte 0x00001144\n" - "_0804B588: .4byte gMain\n" - "_0804B58C: .4byte 0x0000043c\n" - "_0804B590: .4byte gUnknown_08D00000\n" - "_0804B594: .4byte gUnknown_08D00524\n" - "_0804B598: .4byte 0xfffe1000\n" - "_0804B59C: .4byte 0x06002800\n" - "_0804B5A0: .4byte 0x040000d4\n" - "_0804B5A4: .4byte 0x80000280\n" - "_0804B5A8: .4byte gUnknown_08D004E0\n" - "_0804B5AC_case01:\n" - "\tbl OpenLink\n" - "\tldr r1, _0804B5C8 @ =gMain\n" - "\tldr r2, _0804B5CC @ =0x0000043c\n" - "\tadds r1, r2\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tmovs r2, 0\n" - "\tstrb r0, [r1]\n" - "\tldr r0, _0804B5D0 @ =gUnknown_03004828\n" - "\tldr r0, [r0]\n" - "\tadds r0, 0xC0\n" - "\tstr r2, [r0]\n" - "\tb _0804B76E_break\n" - "\t.align 2, 0\n" - "_0804B5C8: .4byte gMain\n" - "_0804B5CC: .4byte 0x0000043c\n" - "_0804B5D0: .4byte gUnknown_03004828\n" - "_0804B5D4_case02:\n" - "\tldr r0, _0804B5F4 @ =gUnknown_03004828\n" - "\tldr r0, [r0]\n" - "\tadds r1, r0, 0\n" - "\tadds r1, 0xC0\n" - "\tldr r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstr r0, [r1]\n" - "\tcmp r0, 0x3C\n" - "\tbhi _0804B5E8\n" - "\tb _0804B76E_break\n" - "_0804B5E8:\n" - "\tmovs r0, 0\n" - "\tstr r0, [r1]\n" - "\tldr r4, _0804B5F8 @ =0x0000043c\n" - "\tadds r1, r2, r4\n" - "\tb _0804B74C\n" - "\t.align 2, 0\n" - "_0804B5F4: .4byte gUnknown_03004828\n" - "_0804B5F8: .4byte 0x0000043c\n" - "_0804B5FC_case03:\n" - "\tbl IsLinkMaster\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _0804B608\n" - "\tb _0804B746\n" - "_0804B608:\n" - "\tbl GetLinkPlayerCount_2\n" - "\tadds r4, r0, 0\n" - "\tbl sub_800820C\n" - "\tlsls r4, 24\n" - "\tlsls r0, 24\n" - "\tcmp r4, r0\n" - "\tbcs _0804B61C\n" - "\tb _0804B76E_break\n" - "_0804B61C:\n" - "\tldr r0, _0804B63C @ =gUnknown_03004828\n" - "\tldr r1, [r0]\n" - "\tadds r1, 0xC0\n" - "\tldr r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstr r0, [r1]\n" - "\tcmp r0, 0x1E\n" - "\tbhi _0804B62E\n" - "\tb _0804B76E_break\n" - "_0804B62E:\n" - "\tbl sub_8007F4C\n" - "\tldr r1, _0804B640 @ =gMain\n" - "\tldr r0, _0804B644 @ =0x0000043c\n" - "\tadds r1, r0\n" - "\tb _0804B74C\n" - "\t.align 2, 0\n" - "_0804B63C: .4byte gUnknown_03004828\n" - "_0804B640: .4byte gMain\n" - "_0804B644: .4byte 0x0000043c\n" - "_0804B648_case04:\n" - "\tbl sub_804B24C\n" - "\tldr r0, _0804B66C @ =gReceivedRemoteLinkPlayers\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x1\n" - "\tbeq _0804B656\n" - "\tb _0804B76E_break\n" - "_0804B656:\n" - "\tbl IsLinkPlayerDataExchangeComplete\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbeq _0804B664\n" - "\tb _0804B76E_break\n" - "_0804B664:\n" - "\tldr r1, _0804B670 @ =gMain\n" - "\tldr r4, _0804B674 @ =0x0000043c\n" - "\tadds r1, r4\n" - "\tb _0804B74C\n" - "\t.align 2, 0\n" - "_0804B66C: .4byte gReceivedRemoteLinkPlayers\n" - "_0804B670: .4byte gMain\n" - "_0804B674: .4byte 0x0000043c\n" - "_0804B678_case05:\n" - "\tldr r2, _0804B69C @ =gUnknown_03004828\n" - "\tldr r0, [r2]\n" - "\tadds r0, 0x9C\n" - "\tmovs r1, 0\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r2]\n" - "\tadds r0, 0x9D\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r2]\n" - "\tadds r0, 0xBD\n" - "\tstrb r1, [r0]\n" - "\tmovs r0, 0\n" - "\tbl sub_804B2D0\n" - "\tldr r1, _0804B6A0 @ =gMain\n" - "\tldr r0, _0804B6A4 @ =0x0000043c\n" - "\tadds r1, r0\n" - "\tb _0804B74C\n" - "\t.align 2, 0\n" - "_0804B69C: .4byte gUnknown_03004828\n" - "_0804B6A0: .4byte gMain\n" - "_0804B6A4: .4byte 0x0000043c\n" - "_0804B6A8_case06:\n" - "\tmovs r0, 0\n" - "\tmovs r1, 0x1\n" - "\tbl sub_804B2D0\n" - "\tb _0804B746\n" - "_0804B6B2_case07:\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0\n" - "\tbl sub_804B2D0\n" - "\tldr r1, _0804B6C4 @ =gMain\n" - "\tldr r4, _0804B6C8 @ =0x0000043c\n" - "\tadds r1, r4\n" - "\tb _0804B74C\n" - "\t.align 2, 0\n" - "_0804B6C4: .4byte gMain\n" - "_0804B6C8: .4byte 0x0000043c\n" - "_0804B6CC_case08:\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x1\n" - "\tbl sub_804B2D0\n" - "\tldr r1, _0804B6DC @ =gMain\n" - "\tldr r0, _0804B6E0 @ =0x0000043c\n" - "\tadds r1, r0\n" - "\tb _0804B74C\n" - "\t.align 2, 0\n" - "_0804B6DC: .4byte gMain\n" - "_0804B6E0: .4byte 0x0000043c\n" - "_0804B6E4_case09:\n" - "\tbl sub_804C164\n" - "\tldr r0, _0804B704 @ =gUnknown_0821594C\n" - "\tbl LoadSpriteSheet\n" - "\tldr r0, _0804B708 @ =gUnknown_08215954\n" - "\tbl LoadSpritePalette\n" - "\tldr r1, _0804B70C @ =REG_BG1CNT\n" - "\tldr r2, _0804B710 @ =0x00000502\n" - "\tadds r0, r2, 0\n" - "\tstrh r0, [r1]\n" - "\tldr r1, _0804B714 @ =gMain\n" - "\tldr r4, _0804B718 @ =0x0000043c\n" - "\tadds r1, r4\n" - "\tb _0804B74C\n" - "\t.align 2, 0\n" - "_0804B704: .4byte gUnknown_0821594C\n" - "_0804B708: .4byte gUnknown_08215954\n" - "_0804B70C: .4byte REG_BG1CNT\n" - "_0804B710: .4byte 0x00000502\n" - "_0804B714: .4byte gMain\n" - "_0804B718: .4byte 0x0000043c\n" - "_0804B71C_case10:\n" - "\tldr r0, _0804B754 @ =0x0000043c\n" - "\tadds r1, r2, r0\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1]\n" - "_0804B726_case11:\n" - "\tmovs r0, 0x5\n" - "\tbl sub_804BBE8\n" - "\tmovs r0, 0\n" - "\tbl sub_804BBE8\n" - "\tbl sub_804C1A8\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x10\n" - "\tmovs r3, 0\n" - "\tbl BeginNormalPaletteFade\n" - "_0804B746:\n" - "\tldr r1, _0804B758 @ =gMain\n" - "\tldr r2, _0804B754 @ =0x0000043c\n" - "\tadds r1, r2\n" - "_0804B74C:\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tb _0804B76E_break\n" - "\t.align 2, 0\n" - "_0804B754: .4byte 0x0000043c\n" - "_0804B758: .4byte gMain\n" - "_0804B75C_case12:\n" - "\tldr r0, _0804B788 @ =gPaletteFade\n" - "\tldrb r1, [r0, 0x7]\n" - "\tmovs r0, 0x80\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0804B76E_break\n" - "\tldr r0, _0804B78C @ =sub_804DB84\n" - "\tbl SetMainCallback2\n" - "_0804B76E_break:\n" - "\tbl RunTasks\n" - "\tbl AnimateSprites\n" - "\tbl BuildOamBuffer\n" - "\tbl UpdatePaletteFade\n" - "\tadd sp, 0x4\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0804B788: .4byte gPaletteFade\n" - "_0804B78C: .4byte sub_804DB84"); -} -#endif - -// In-game trade init -void sub_804B790(void) -{ - u8 otName[11]; - switch (gMain.state) - { - case 0: - gUnknown_020297D8[0] = gSpecialVar_0x8005; - gUnknown_020297D8[1] = 6; - StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); - GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); - StringCopy(gLinkPlayers[1].name, otName); - REG_DISPCNT = 0; - ResetTasks(); - gUnknown_03004828 = &ewram_2010000.unk_0f000; - ResetSpriteData(); - FreeAllSpritePalettes(); - SetVBlankCallback(sub_804B210); - sub_804B228(); - Text_LoadWindowTemplate(&gWindowTemplate_81E717C); - Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E717C); - gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); - TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); - Menu_EraseScreen(); - gLinkType = 0x1144; - gUnknown_03004828->isLinkTrade = FALSE; - gUnknown_03004828->unk_00b6 = 0; - gUnknown_03004828->unk_00c4 = 0; - gUnknown_03004828->unk_0104 = 0x40; - gUnknown_03004828->unk_0106 = 0x40; - gUnknown_03004828->unk_0108 = 0; - gUnknown_03004828->unk_010a = 0; - gUnknown_03004828->unk_010c = 0x78; - gUnknown_03004828->unk_010e = 0x50; - gUnknown_03004828->unk_0118 = 0x100; - gUnknown_03004828->unk_011c = 0; - gUnknown_03004828->unk_00c0 = 0; - gMain.state = 5; - break; - case 5: - sub_804B2D0(0, 0); - gMain.state ++; - break; - case 6: - sub_804B2D0(0, 1); - gMain.state ++; - break; - case 7: - sub_804B2D0(1, 0); - gMain.state ++; - break; - case 8: - sub_804B2D0(1, 1); - gMain.state ++; - break; - case 9: - sub_804C164(); - LoadSpriteSheet(&gUnknown_0821594C); - LoadSpritePalette(&gUnknown_08215954); - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); - gMain.state ++; - break; - case 10: - gMain.state ++; - // fallthrough - case 11: - sub_804BBE8(5); - sub_804BBE8(0); - sub_804C1A8(); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gMain.state ++; - break; - case 12: - if (!gPaletteFade.active) - { - SetMainCallback2(sub_804BBCC); - } - break; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_804BA18(u8 partyIdx) -{ - struct Pokemon *pokemon = &gPlayerParty[partyIdx]; - if (!GetMonData(pokemon, MON_DATA_IS_EGG)) - { - u16 species = SpeciesToNationalPokedexNum(GetMonData(pokemon, MON_DATA_SPECIES, NULL)); - GetSetPokedexFlag(species, 2); - GetSetPokedexFlag(species, 3); - } -} - -static void sub_804BA64(void) -{ - u8 mpId = GetMultiplayerId(); - if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000) - EnableNationalPokedex(); -} - -static void sub_804BA94(u8 a0, u8 a1) -{ - u8 friendship; - struct Pokemon *playerPokemon = &gPlayerParty[a0]; - u16 playerMail = GetMonData(playerPokemon, MON_DATA_MAIL); - - struct Pokemon *friendPokemon = &gEnemyParty[a1]; - u16 friendMail = GetMonData(friendPokemon, MON_DATA_MAIL); - - if (playerMail != 0xff) - ClearMailStruct(&gSaveBlock1.mail[playerMail]); - - // This is where the actual trade happens!! - gUnknown_03004828->pokemon = *playerPokemon; - *playerPokemon = *friendPokemon; - *friendPokemon = gUnknown_03004828->pokemon; - - friendship = 70; - if (!GetMonData(playerPokemon, MON_DATA_IS_EGG)) - SetMonData(playerPokemon, MON_DATA_FRIENDSHIP, &friendship); - - if (friendMail != 0xff) - GiveMailToMon2(playerPokemon, &gUnknown_02029700[friendMail]); - - sub_804BA18(a0); - if (gReceivedRemoteLinkPlayers) - sub_804BA64(); -} - -static void sub_804BB78(void) -{ - switch (gUnknown_03004828->unk_00bd) - { - case 1: - if (IsLinkTaskFinished()) - { - Trade_SendData(gUnknown_03004828); - gUnknown_03004828->unk_00bd ++; - } - // fallthrough - case 2: - gUnknown_03004828->unk_00bd = 0; - break; - } -} - -static void sub_804BBCC(void) -{ - sub_804C29C(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_804BBE8(u8 a0) -{ - int i; - u16 *buffer; - switch (a0) - { - case 0: - LoadPalette(gUnknown_0820C9F8, 0x10, 0xa0); - DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(1), 0x1300, 0x1000); - DmaCopy16Defvars(3, gUnknown_0820F798, BG_SCREEN_ADDR(18), 0x1000); - gUnknown_03004828->bg2vofs = 0; - gUnknown_03004828->bg2hofs = 0xb4; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256; - break; - case 1: - gUnknown_03004828->bg1hofs = 0; - gUnknown_03004828->bg1vofs = 0x15c; - REG_BG1VOFS = 0x15c; - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512; - - DmaCopy16Defvars(3, gUnknown_08210798, BG_SCREEN_ADDR(5), 0x1000); - DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(0), 0x1300, 0x1000); - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; - break; - case 2: - gUnknown_03004828->bg1vofs = 0; - gUnknown_03004828->bg1hofs = 0; - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; - DmaCopy16Defvars(3, gUnknown_08211798, BG_SCREEN_ADDR(5), 0x800); - break; - case 3: - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; - gUnknown_03004828->unk_0104 = 0x40; - gUnknown_03004828->unk_0106 = 0x40; - gUnknown_03004828->unk_010c = 0x78; - gUnknown_03004828->unk_010e = -0x46; - gUnknown_03004828->unk_011c = 0; - DmaCopyLarge16(3, gUnknown_0820DD98, BG_CHAR_ADDR(1), 0x1a00, 0x1000); - DmaCopy16Defvars(3, gUnknown_08211F98, BG_SCREEN_ADDR(18), 0x100); - break; - case 4: - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18); - gUnknown_03004828->unk_0104 = 0x40; - gUnknown_03004828->unk_0106 = 0x5c; - gUnknown_03004828->unk_0118 = 0x20; - gUnknown_03004828->unk_011a = 0x400; - gUnknown_03004828->unk_011c = 0; - DmaCopyLarge16(3, gUnknown_08213738, BG_CHAR_ADDR(1), 0x2040, 0x1000); - DmaCopy16Defvars(3, gUnknown_08215778, BG_SCREEN_ADDR(18), 0x100); - break; - case 5: - gUnknown_03004828->bg1vofs = 0; - gUnknown_03004828->bg1hofs = 0; - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5); - LZDecompressVram(gUnknown_08D00000, BG_CHAR_ADDR(0)); - CpuCopy16(gUnknown_08D00524, buffer = (u16 *)gSharedMem, 0x1000); - LoadCompressedPalette(gUnknown_08D004E0, 0x70, 0x20); - FillPalette(0, 0, 2); - for (i = 0; i < 0x280; i ++) - buffer[i] |= 0x7000; - DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500); - Menu_EraseWindowRect(2, 15, 27, 18); - break; - case 6: - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18); - gUnknown_03004828->unk_0104 = 0x40; - gUnknown_03004828->unk_0106 = 0x5c; - gUnknown_03004828->unk_0118 = 0x100; - gUnknown_03004828->unk_011a = 0x80; - gUnknown_03004828->unk_010c = 0x78; - gUnknown_03004828->unk_010e = 0x50; - gUnknown_03004828->unk_011c = 0; - DmaCopyLarge16(3, gUnknown_08213738, BG_CHAR_ADDR(1), 0x2040, 0x1000); - DmaCopy16Defvars(3, gUnknown_08215778, BG_SCREEN_ADDR(18), 0x100); - break; - case 7: - gUnknown_03004828->bg2vofs = 0; - gUnknown_03004828->bg2hofs = 0; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256; - LoadPalette(gUnknown_0820C9F8, 0x10, 0xa0); - DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(1), 0x1300, 0x1000); - DmaCopy16Defvars(3, gUnknown_0820F798, BG_SCREEN_ADDR(18), 0x1000); - break; - } -} - -static void sub_804C0F8(u8 a0) -{ - if (a0 == 0) - { - if (gUnknown_03004828->bg1vofs < 0x10a) - { - gUnknown_03004828->unk_010e ++; - gUnknown_03004828->unk_011c += 64; - } - } - else - { - if (gUnknown_03004828->unk_010e > -0x40) - { - gUnknown_03004828->unk_010e --; - gUnknown_03004828->unk_011c += 64; - } - } -} - -static void sub_804C164(void) -{ - LoadSpriteSheet(&gUnknown_082159A4); - LoadSpriteSheet(&gUnknown_082159F4); - LoadSpriteSheet(&gUnknown_08215A28); - LoadSpriteSheet(&gUnknown_08215A78); - LoadSpritePalette(&gUnknown_082159AC); - LoadSpritePalette(&gUnknown_082159B4); -} - -static void sub_804C1A8(void) -{ - u8 mpId; - u8 string[20]; - const struct InGameTrade *ingameTrade; - if (gUnknown_03004828->isLinkTrade) - { - mpId = GetMultiplayerId(); - StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); - GetMonData(&gEnemyParty[gUnknown_020297D8[1] % 6], MON_DATA_NICKNAME, string); - StringCopy10(gStringVar3, string); - GetMonData(&gPlayerParty[gUnknown_020297D8[0]], MON_DATA_NICKNAME, string); - StringCopy10(gStringVar2, string); - } - else - { - ingameTrade = &gIngameTrades[gSpecialVar_0x8004]; - StringCopy(gStringVar1, ingameTrade->otName); - StringCopy10(gStringVar3, ingameTrade->name); - GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, string); - StringCopy10(gStringVar2, string); - } -} - -static bool8 sub_804C29C(void) -{ - u16 evoTarget; - - switch (gUnknown_03004828->unk_00c4) - { - case 0: - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x = -0xb4; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[gUnknown_03004828->tradeSpecies[0]].y_offset; - gUnknown_03004828->unk_00c4 ++; - gUnknown_03004828->unk_0124 = GetCurrentMapMusic(); - PlayBGM(BGM_SHINKA); - break; - case 1: - if (gUnknown_03004828->bg2hofs > 0) - { - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x += 3; - gUnknown_03004828->bg2hofs -= 3; - } - else - { - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x = 0; - gUnknown_03004828->bg2hofs = 0; - gUnknown_03004828->unk_00c4 = 10; - } - break; - - case 10: - StringExpandPlaceholders(gStringVar4, gTradeText_WillBeSent); - Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gUnknown_03004828->unk_00c4 = 11; - gUnknown_03004828->unk_00c0 = 0; - break; - case 11: - if (++gUnknown_03004828->unk_00c0 == 80) - { - gUnknown_03004828->unk_0102 = sub_8047580(gUnknown_03004828->pokePicSpriteIdxs[0], gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].oam.paletteNum, 0x78, 0x20, 0x2, 0x1, 0x14, 0xfffff); - gUnknown_03004828->unk_00c4 ++; - Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); - StringExpandPlaceholders(gStringVar4, gTradeText_ByeBye); - Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - } - break; - case 12: - if (gSprites[gUnknown_03004828->unk_0102].callback == SpriteCallbackDummy && Text_UpdateWindow(&gUnknown_03004828->window) == TRUE) - { - gUnknown_03004828->unk_0103 = CreateSprite(&gSpriteTemplate_821595C, 0x78, 0x20, 0); - gSprites[gUnknown_03004828->unk_0103].callback = sub_804D738; - DestroySprite(&gSprites[gUnknown_03004828->unk_0102]); - gUnknown_03004828->unk_00c4 ++; - } - break; - case 13: - // The game waits here for the sprite to finish its animation sequence. - break; - case 14: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_03004828->unk_00c4 = 20; - break; - - case 20: - if (!gPaletteFade.active) - { - sub_804BBE8(4); - gUnknown_03004828->unk_00c4 ++; - } - break; - case 21: - BeginNormalPaletteFade(-1, -1, 16, 0, 0); - gUnknown_03004828->unk_00c4 ++; - break; - case 22: - if (!gPaletteFade.active) - { - gUnknown_03004828->unk_00c4 = 23; - } - break; - case 23: - if (gUnknown_03004828->unk_011a > 0x100) - { - gUnknown_03004828->unk_011a -= 0x34; - } - else - { - sub_804BBE8(1); - gUnknown_03004828->unk_011a = 0x80; - gUnknown_03004828->unk_00c4 ++; - gUnknown_03004828->unk_00c0 = 0; - } - gUnknown_03004828->unk_0118 = 0x8000 / gUnknown_03004828->unk_011a; - break; - case 24: - if (++ gUnknown_03004828->unk_00c0 > 20) - { - sub_804BBE8(3); - sub_804B128(); - gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_8215A80, 0x78, 0x50, 0); - gUnknown_03004828->unk_00c4 ++; - } - break; - case 25: - if (gSprites[gUnknown_03004828->unk_00bb].animEnded) - { - DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); - REG_BLDCNT = 0x640; - REG_BLDALPHA = 0x40C; - gUnknown_03004828->unk_00c4 ++; - } - break; - case 26: - if (-- gUnknown_03004828->bg1vofs == 0x13C) - { - gUnknown_03004828->unk_00c4 ++; - } - if (gUnknown_03004828->bg1vofs == 0x148) - { - gUnknown_03004828->unk_00bc = CreateSprite(&gSpriteTemplate_8215A30, 0x80, 0x41, 0); - } - break; - case 27: - gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159BC, 0x80, 0x50, 3); - gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x80, 0x50, 0); - StartSpriteAnim(&gSprites[gUnknown_03004828->unk_00bb], 1); - gUnknown_03004828->unk_00c4 ++; - break; - case 28: - if ((gUnknown_03004828->bg1vofs -= 2) == 0xA6) - { - gUnknown_03004828->unk_00c4 = 200; - } - sub_804C0F8(0); - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - break; - case 200: - gSprites[gUnknown_03004828->unk_00ba].pos1.y -= 2; - gSprites[gUnknown_03004828->unk_00bb].pos1.y -= 2; - sub_804C0F8(0); - if (gSprites[gUnknown_03004828->unk_00ba].pos1.y < -8) - { - gUnknown_03004828->unk_00c4 = 29; - } - break; - case 29: - BeginNormalPaletteFade(-1, -1, 0, 16, 0); - gUnknown_03004828->unk_00c4 = 30; - break; - case 30: - if (!gPaletteFade.active) - { - DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); - DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); - sub_804BBE8(2); - gUnknown_03004828->unk_00c4 ++; - } - break; - case 31: - BeginNormalPaletteFade(-1, -1, 16, 0, 0); - gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159FC, 0x6f, 0xaa, 0); - gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x81, -0xa, 0); - gUnknown_03004828->unk_00c4 ++; - break; - case 32: - if (!gPaletteFade.active) - { - PlaySE(SE_TK_WARPOUT); - gUnknown_03004828->unk_00c4 ++; - } - gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; - gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; - break; - case 33: - gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; - gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; - if (gSprites[gUnknown_03004828->unk_00ba].pos2.y <= -0x5a) - { - gSprites[gUnknown_03004828->unk_00ba].data[1] = 1; - gSprites[gUnknown_03004828->unk_00bb].data[1] = 1; - gUnknown_03004828->unk_00c4 ++; - } - break; - case 34: - BlendPalettes(1, 16, 0xffff); - gUnknown_03004828->unk_00c4 ++; - break; - case 35: - BlendPalettes(1, 0, 0xffff); - gUnknown_03004828->unk_00c4 ++; - break; - case 36: - BlendPalettes(1, 16, 0xffff); - gUnknown_03004828->unk_00c4 ++; - break; - case 37: - if (!IsPokeSpriteNotFlipped(gUnknown_03004828->tradeSpecies[0])) - { - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].affineAnims = gSpriteAffineAnimTable_8215AC0; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].oam.affineMode = 3; - CalcCenterToCornerVec(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0, 3, 3); - StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0); - } - else - { - StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0); - } - StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]], 0); - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos1.x = 0x3c; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.x = 0xb4; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos1.y = 0xc0; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.y = -0x20; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].invisible = FALSE; - gUnknown_03004828->unk_00c4 ++; - break; - case 38: - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y -= 3; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.y += 3; - if (-0xa0 > gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y && gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y >= -0xa3) - { - PlaySE(SE_TK_WARPIN); - } - if (gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y < -0xde) - { - gSprites[gUnknown_03004828->unk_00ba].data[1] = 0; - gSprites[gUnknown_03004828->unk_00bb].data[1] = 0; - gUnknown_03004828->unk_00c4 ++; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = TRUE; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].invisible = TRUE; - BlendPalettes(1, 0, 0xffff); - } - break; - case 39: - gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; - gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; - if (gSprites[gUnknown_03004828->unk_00ba].pos2.y <= -0xde) - { - BeginNormalPaletteFade(-1, -1, 0, 16, 0); - gUnknown_03004828->unk_00c4 ++; - DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); - DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); - } - break; - case 40: - if (!gPaletteFade.active) - { - gUnknown_03004828->unk_00c4 ++; - sub_804BBE8(1); - gUnknown_03004828->bg1vofs = 0xa6; - gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159BC, 0x80, -0x14, 3); - gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x80, -0x14, 0); - StartSpriteAnim(&gSprites[gUnknown_03004828->unk_00bb], 1); - } - break; - case 41: - BeginNormalPaletteFade(-1, -1, 16, 0, 0); - gUnknown_03004828->unk_00c4 ++; - break; - case 42: - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - sub_804C0F8(1); - if (!gPaletteFade.active) - { - gUnknown_03004828->unk_00c4 ++; - } - break; - case 43: - sub_804C0F8(1); - gSprites[gUnknown_03004828->unk_00ba].pos2.y += 3; - gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; - if (gSprites[gUnknown_03004828->unk_00ba].pos2.y + gSprites[gUnknown_03004828->unk_00ba].pos1.y == 64) - { - gUnknown_03004828->unk_00c4 ++; - } - break; - case 44: - sub_804C0F8(1); - if ((gUnknown_03004828->bg1vofs += 2) > 0x13c) - { - gUnknown_03004828->bg1vofs = 0x13c; - gUnknown_03004828->unk_00c4 ++; - } - break; - case 45: - DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); - DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); - gUnknown_03004828->unk_00c4 ++; - gUnknown_03004828->unk_00c0 = 0; - break; - case 46: - if (++ gUnknown_03004828->unk_00c0 == 10) - { - gUnknown_03004828->unk_00c4 ++; - } - break; - case 47: - if (++ gUnknown_03004828->bg1vofs > 0x15c) - { - gUnknown_03004828->bg1vofs = 0x15c; - gUnknown_03004828->unk_00c4 ++; - } - if (gUnknown_03004828->bg1vofs == 0x148) - gUnknown_03004828->unk_00bc = CreateSprite(&gSpriteTemplate_8215A30, 0x80, 0x41, 0); - gSprites[gUnknown_03004828->unk_00bc].callback = sub_804B0E0; - break; - case 48: - gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_8215A80, 0x78, 0x50, 0); - gUnknown_03004828->unk_00c4 = 50; - break; - - case 50: - if (gSprites[gUnknown_03004828->unk_00bb].animEnded) - { - DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); - sub_804BBE8(6); - gUnknown_03004828->unk_00c4 ++; - PlaySE(SE_W028); - } - break; - case 51: - if (gUnknown_03004828->unk_011a < 0x400) - { - gUnknown_03004828->unk_011a += 0x34; - } - else - { - gUnknown_03004828->unk_011a = 0x400; - gUnknown_03004828->unk_00c4 ++; - } - gUnknown_03004828->unk_0118 = 0x8000 / gUnknown_03004828->unk_011a; - break; - case 52: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_03004828->unk_00c4 = 60; - break; - - case 60: - if (!gPaletteFade.active) - { - sub_804BBE8(5); - sub_804BBE8(7); - gUnknown_03004828->unk_00c4 ++; - } - break; - case 61: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gUnknown_03004828->unk_00c4 ++; - break; - case 62: - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - if (!gPaletteFade.active) - { - gUnknown_03004828->unk_00c4 ++; - } - break; - case 63: - gUnknown_03004828->unk_0103 = CreateSprite(&gSpriteTemplate_821595C, 0x78, -0x8, 0); - gSprites[gUnknown_03004828->unk_0103].data[3] = 0x4a; - gSprites[gUnknown_03004828->unk_0103].callback = sub_804D80C; - StartSpriteAnim(&gSprites[gUnknown_03004828->unk_0103], 1); - StartSpriteAffineAnim(&gSprites[gUnknown_03004828->unk_0103], 2); - BlendPalettes(1 << (16 + gSprites[gUnknown_03004828->unk_0103].oam.paletteNum), 16, 0xffff); - gUnknown_03004828->unk_00c4 ++; - gUnknown_03004828->unk_00c0 = 0; - break; - case 64: - BeginNormalPaletteFade(1 << (16 + gSprites[gUnknown_03004828->unk_0103].oam.paletteNum), 1, 16, 0, 0xffff); - gUnknown_03004828->unk_00c4 ++; - break; - case 65: - if (gSprites[gUnknown_03004828->unk_0103].callback == SpriteCallbackDummy) - { - gUnknown_03004828->unk_00c4 ++; - } - break; - case 66: - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.x = 0x78; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[gUnknown_03004828->tradeSpecies[1]].y_offset + 60; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.x = 0; - gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.y = 0; - CreatePokeballSprite(gUnknown_03004828->pokePicSpriteIdxs[1], gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].oam.paletteNum, 0x78, 0x54, 2, 1, 0x14, 0xfffff); - FreeSpriteOamMatrix(&gSprites[gUnknown_03004828->unk_0103]); - DestroySprite(&gSprites[gUnknown_03004828->unk_0103]); - gUnknown_03004828->unk_00c4 ++; - break; - case 67: - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); - StringExpandPlaceholders(gStringVar4, gTradeText_SentOverPoke); - Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gUnknown_03004828->unk_00c4 ++; - gUnknown_03004828->unk_00c0 = 0; - break; - case 68: - if (++ gUnknown_03004828->unk_00c0 == 4) - { - PlayFanfare(BGM_FANFA5); - } - if (gUnknown_03004828->unk_00c0 == 0xf0) - { - gUnknown_03004828->unk_00c4 ++; - Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); - StringExpandPlaceholders(gStringVar4, gTradeText_TakeGoodCare); - Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gUnknown_03004828->unk_00c0 = 0; - } - break; - case 69: // OneHand - if (++ gUnknown_03004828->unk_00c0 == 60) - { - gUnknown_03004828->unk_00c4 ++; - } - break; - case 70: - sub_804E1DC(); - gUnknown_03004828->unk_00c4 ++; - break; - case 71: - if (gUnknown_03004828->isLinkTrade) - { - return TRUE; - } - else if (gMain.newKeys & A_BUTTON) - { - gUnknown_03004828->unk_00c4 ++; - } - break; - case 72: // Only if in-game trade - sub_804BA94(gSpecialVar_0x8005, 0); - gCB2_AfterEvolution = sub_804BBCC; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_020297D8[0]], TRUE, ITEM_NONE); - if (evoTarget != SPECIES_NONE) - TradeEvolutionScene(&gPlayerParty[gUnknown_020297D8[0]], evoTarget, gUnknown_03004828->pokePicSpriteIdxs[1], gUnknown_020297D8[0]); - gUnknown_03004828->unk_00c4 ++; - break; - case 73: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_03004828->unk_00c4 ++; - break; - case 74: - if (!gPaletteFade.active) - { - PlayBGM(gUnknown_03004828->unk_0124); - SetMainCallback2(c2_exit_to_overworld_2_switch); - sub_804D8E4(); - } - break; - } - return FALSE; -} - -static void sub_804D588(void) -{ - u16 evoTarget; - switch (gMain.state) - { - case 0: - gMain.state = 4; - gSoftResetDisabled = TRUE; - break; - case 4: - gCB2_AfterEvolution = sub_804DC88; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_020297D8[0]], TRUE, ITEM_NONE); - if (evoTarget != SPECIES_NONE) - TradeEvolutionScene(&gPlayerParty[gUnknown_020297D8[0]], evoTarget, gUnknown_03004828->pokePicSpriteIdxs[1], gUnknown_020297D8[0]); - else - SetMainCallback2(sub_804DC88); - gUnknown_020297D8[0] = 255; - break; - } - if (!HasLinkErrorOccurred()) - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_804D63C(void) -{ - u8 blockReceivedStatus; - sub_804B2B0(); - blockReceivedStatus = GetBlockReceivedStatus(); - if (blockReceivedStatus & 0x01) - { - if (gBlockRecvBuffer[0][0] == 0xdcba) - { - SetMainCallback2(sub_804D588); - } - if (gBlockRecvBuffer[0][0] == 0xabcd) - { - gUnknown_03004828->unk_009c = 1; - } - ResetBlockReceivedFlag(0); - } - if (blockReceivedStatus & 0x02) - { - if (gBlockRecvBuffer[1][0] == 0xabcd) - { - gUnknown_03004828->unk_009d = 1; - } - ResetBlockReceivedFlag(1); - } -} - -static void sub_804D6BC(struct Sprite *sprite) -{ - sprite->pos1.y += sprite->data[0] / 10; - sprite->data[5] += sprite->data[1]; - sprite->pos1.x = sprite->data[5] / 10; - if (sprite->pos1.y > 0x4c) - { - sprite->pos1.y = 0x4c; - sprite->data[0] = -(sprite->data[0] * sprite->data[2]) / 100; - sprite->data[3] ++; - } - if (sprite->pos1.x == 0x78) - sprite->data[1] = 0; - sprite->data[0] += sprite->data[4]; - if (sprite->data[3] == 4) - { - sprite->data[7] = 1; - sprite->callback = SpriteCallbackDummy; - } -} - -static void sub_804D738(struct Sprite *sprite) -{ - sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]]; - if (sprite->data[0] == 22) - PlaySE(SE_KON); - if (++ sprite->data[0] == 44) - { - PlaySE(SE_W025); - sprite->callback = sub_804D7AC; - sprite->data[0] = 0; - BeginNormalPaletteFade(1 << (16 + sprite->oam.paletteNum), -1, 0, 16, -1); - } -} - -static void sub_804D7AC(struct Sprite *sprite) -{ - if (sprite->data[1] == 20) - StartSpriteAffineAnim(sprite, 1); - if (++ sprite->data[1] > 20) - { - sprite->pos2.y -= gTradeBallVerticalVelocityTable[sprite->data[0]]; - if (++ sprite->data[0] == 23) - { - DestroySprite(sprite); - gUnknown_03004828->unk_00c4 = 14; // Resume the master trade animation - } - } -} - -static void sub_804D80C(struct Sprite *sprite) -{ - if (sprite->data[2] == 0) - { - if ((sprite->pos1.y += 4) > sprite->data[3]) - { - sprite->data[2] ++; - sprite->data[0] = 0x16; - PlaySE(SE_KON); - } - } - else - { - if (sprite->data[0] == 0x42) - PlaySE(SE_KON2); - if (sprite->data[0] == 0x5c) - PlaySE(SE_KON3); - if (sprite->data[0] == 0x6b) - PlaySE(SE_KON4); - sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]]; - if (++sprite->data[0] == 0x6c) - sprite->callback = SpriteCallbackDummy; - } -} - -u16 GetInGameTradeSpeciesInfo(void) -{ - const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; - StringCopy(gStringVar1, gSpeciesNames[inGameTrade->playerSpecies]); - StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); - return inGameTrade->playerSpecies; -} - -static void sub_804D8E4(void) -{ - u8 nickname[32]; - const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; - GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); - StringCopy10(gStringVar1, nickname); - StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); -} - -static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade) -{ - const struct InGameTrade *inGameTrade = &gIngameTrades[whichInGameTrade]; - u8 level = GetMonData(&gPlayerParty[whichPlayerMon], MON_DATA_LEVEL); - - struct MailStruct mail; - u8 metLocation = 0xFE; - u8 isMail; - struct Pokemon *pokemon = &gEnemyParty[0]; - - CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); - - SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); - SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); - SetMonData(pokemon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]); - SetMonData(pokemon, MON_DATA_SPEED_IV, &inGameTrade->ivs[3]); - SetMonData(pokemon, MON_DATA_SPATK_IV, &inGameTrade->ivs[4]); - SetMonData(pokemon, MON_DATA_SPDEF_IV, &inGameTrade->ivs[5]); - SetMonData(pokemon, MON_DATA_NICKNAME, inGameTrade->name); - SetMonData(pokemon, MON_DATA_OT_NAME, inGameTrade->otName); - SetMonData(pokemon, MON_DATA_OT_GENDER, &inGameTrade->otGender); - SetMonData(pokemon, MON_DATA_ALT_ABILITY, &inGameTrade->secondAbility); - SetMonData(pokemon, MON_DATA_BEAUTY, &inGameTrade->stats[1]); - SetMonData(pokemon, MON_DATA_CUTE, &inGameTrade->stats[2]); - SetMonData(pokemon, MON_DATA_COOL, &inGameTrade->stats[0]); - SetMonData(pokemon, MON_DATA_SMART, &inGameTrade->stats[3]); - SetMonData(pokemon, MON_DATA_TOUGH, &inGameTrade->stats[4]); - SetMonData(pokemon, MON_DATA_SHEEN, &inGameTrade->sheen); - SetMonData(pokemon, MON_DATA_MET_LOCATION, &metLocation); - - isMail = FALSE; - if (inGameTrade->heldItem != ITEM_NONE) - { - if (ItemIsMail(inGameTrade->heldItem)) - { - sub_804DAD4(&mail, inGameTrade); - gUnknown_02029700[0] = mail; - SetMonData(pokemon, MON_DATA_MAIL, &isMail); - SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); - } - else - { - SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); - } - } - CalculateMonStats(&gEnemyParty[0]); -} - -static void sub_804DAD4(struct MailStruct *mail, const struct InGameTrade *trade) { - s32 i; - - for (i = 0; i < 9; i++) - { - mail->words[i] = gIngameTradeMail[trade->mailNum][i]; - } - - StringCopy(mail->playerName, trade->otName); - -#if GERMAN - PadNameString(mail->playerName, CHAR_SPACE); -#endif - - mail->trainerId[0] = trade->otId >> 24; - mail->trainerId[1] = trade->otId >> 16; - mail->trainerId[2] = trade->otId >> 8; - mail->trainerId[3] = trade->otId; - mail->species = trade->species; - mail->itemId = trade->heldItem; -} - -u16 GetTradeSpecies(void) -{ - if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG)) - return SPECIES_NONE; - return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES); -} - -void CreateInGameTradePokemon(void) -{ - _CreateInGameTradePokemon(gSpecialVar_0x8005, gSpecialVar_0x8004); -} - -#ifdef NONMATCHING -static -#endif -void sub_804DB84(void) -{ - if (sub_804C29C() == TRUE) - { - DestroySprite(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]]); - FreeSpriteOamMatrix(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]]); - sub_804BA94(gUnknown_020297D8[0], gUnknown_020297D8[1] % 6); - gUnknown_03004828->linkData[0] = 0xabcd; - gUnknown_03004828->unk_00bd = 1; - SetMainCallback2(sub_804DC18); - } - sub_804BB78(); - sub_804D63C(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_804DC18(void) -{ - u8 mpId = sub_804B2B0(); - sub_804D63C(); - if (mpId == 0 && gUnknown_03004828->unk_009c == 1 && gUnknown_03004828->unk_009d == 1) - { - gUnknown_03004828->linkData[0] = 0xdcba; - Trade_SendData(gUnknown_03004828); - gUnknown_03004828->unk_009c = 2; - gUnknown_03004828->unk_009d = 2; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_804DC88(void) -{ - switch (gMain.state) - { - case 0: - gUnknown_03004828 = &ewram_2010000.unk_0f000; - gMain.state ++; - Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); - StringExpandPlaceholders(gStringVar4, gOtherText_LinkStandby2); - Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - break; - case 1: - sub_80084A4(); - gMain.state = 100; - gUnknown_03004828->unk_00c0 = 0; - break; - case 100: - if (++ gUnknown_03004828->unk_00c0 > 180) - { - gMain.state = 101; - gUnknown_03004828->unk_00c0 = 0; - } - if (IsLinkTaskFinished()) - { - gMain.state = 2; - } - break; - case 101: - if (IsLinkTaskFinished()) - { - gMain.state = 2; - } - break; - case 2: - gMain.state = 50; - Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); - Text_InitWindowAndPrintText(&gUnknown_03004828->window, gSystemText_Saving, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - break; - case 50: - SetSecretBase2Field_9_AndHideBG(); - IncrementGameStat(GAME_STAT_POKEMON_TRADES); - sub_8125D80(); - gMain.state ++; - gUnknown_03004828->unk_00c0 = 0; - break; - case 51: - if (++ gUnknown_03004828->unk_00c0 == 5) - { - gMain.state ++; - } - break; - case 52: - if (sub_8125DA8()) - { - ClearSecretBase2Field_9_2(); - gMain.state = 4; - } - else - { - gUnknown_03004828->unk_00c0 = 0; - gMain.state = 51; - } - break; - case 4: - sub_8125DDC(); - gMain.state = 40; - gUnknown_03004828->unk_00c0 = 0; - break; - case 40: - if (++ gUnknown_03004828->unk_00c0 > 50) - { - gUnknown_03004828->unk_00c0 = 0; - gMain.state = 41; - } - break; - case 41: - sub_80084A4(); - gMain.state = 42; - break; - case 42: - if (IsLinkTaskFinished()) - { - sub_8125E04(); - gSoftResetDisabled = FALSE; - gMain.state = 5; - } - break; - case 5: - if (++ gUnknown_03004828->unk_00c0 > 60) - { - gMain.state ++; - sub_80084A4(); - } - break; - case 6: - if (IsLinkTaskFinished()) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gMain.state ++; - } - break; - case 7: - if (!gPaletteFade.active) - { - FadeOutBGM(3); - gMain.state ++; - } - break; - case 8: - if (IsBGMStopped() == TRUE) - { - sub_800832C(); - gMain.state ++; - } - break; - case 9: - if (!gReceivedRemoteLinkPlayers) - { - SetMainCallback2(sub_804E144); - } - break; - } - if (!HasLinkErrorOccurred()) - { - RunTasks(); - } - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_804E144(void) -{ - if (!gPaletteFade.active) - SetMainCallback2((sub_8047CD8)); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void DoInGameTradeScene(void) -{ - ScriptContext2_Enable(); - CreateTask(sub_804E1A0, 10); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); -} - -static void sub_804E1A0(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(sub_804B790); - gFieldCallback = sub_8080990; - DestroyTask(taskId); - } -} - -static void sub_804E1DC(void) -{ - u8 i; - u8 numRibbons = 0; - for (i = 0; i < 12; i ++) - { - numRibbons += GetMonData(&gEnemyParty[gUnknown_020297D8[1] % 6], MON_DATA_CHAMPION_RIBBON + i); - } - if (numRibbons != 0) - FlagSet(FLAG_SYS_RIBBON_GET); -} - -void sub_804E22C(void) -{ - LZDecompressVram(gUnknown_08D00000, (void *)VRAM); - CpuCopy16(gUnknown_08D00524, gSharedMem, 0x1000); - DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500); - LoadCompressedPalette(gUnknown_08D004E0, 0, 32); - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); -} diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c deleted file mode 100644 index 8d16aa9bf..000000000 --- a/src/engine/trainer_card.c +++ /dev/null @@ -1,1617 +0,0 @@ -#include "global.h" -#include "trainer_card.h" -#include "easy_chat.h" -#include "event_data.h" -#include "field_effect.h" -#include "graphics.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "money.h" -#include "palette.h" -#include "pokedex.h" -#include "overworld.h" -#include "script_pokemon_80C4.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "scanline_effect.h" -#include "util.h" -#include "ewram.h" - -typedef void (*Callback)(void); - -struct Struct2000000 -{ - /*0x00*/ u8 current_state; - /*0x01*/ bool8 isShowingLinkCard; - /*0x02*/ u8 starCount; - /*0x03*/ bool8 backSideShown; - /*0x04*/ u8 var_4; - /*0x05*/ bool8 showColon; - /*0x06*/ u8 frameCounter; /* Used to flash colon */ - /*0x07*/ bool8 showPokedexCount; - /*0x08*/ bool8 showHallOfFame; - /*0x09*/ bool8 showLinkBattleStatus; - /*0x0A*/ bool8 showBattleTowerStatus; - /*0x0B*/ bool8 showContestRecord; - /*0x0C*/ bool8 showMixingRecord; - /*0x0D*/ bool8 showTradingRecord; - /*0x0E*/ bool8 ownedBadges[8]; - /*0x16*/ u8 filler_16[10]; - /*0x20*/ u8 easyChatPhrase[4][0x10]; - /*0x60*/ Callback *var_60; - /*0x64*/ struct TrainerCard displayedCard; - /*0x9C*/ u8 language; // 0x9C -}; - -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; - -EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; - -extern const u16 gUnknown_083B5F0C[]; -extern const u16 gBadgesPalette[]; -extern const u16 gUnknown_083B5F4C[]; -extern const u16 gUnknown_083B5F6C[]; -extern const u16 gTrainerCardBadgesMap[][4]; - -const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp"); -// XXX: what is this? -u8 *const ewram_ = gSharedMem; - -#if DEBUG -const struct TrainerCard sTestTrainerCard = -{ - .gender = FEMALE, - .stars = 4, - .hasPokedex = TRUE, - .var_3 = TRUE, - .var_4 = TRUE, - .firstHallOfFameA = 999, - .firstHallOfFameB = 99, - .firstHallOfFameC = 99, - .pokedexSeen = 411, - .trainerId = 12345, - .playTimeHours = 99, - .playTimeMinutes = 99, - .linkBattleWins = 9999, - .linkBattleLosses = 9999, - .battleTowerWins = 9999, - .battleTowerLosses = 9999, - .contestsWithFriends = 999, - .pokeblocksWithFriends = 0xFFFF, - .pokemonTrades = 0xFFFF, - .money = 99999, - .var_28 = {1, 2, 3, 4}, - .playerName = _("てすと"), // "test" -}; -#endif - -bool8 TrainerCard_Init(struct Task *); -bool8 TrainerCard_WaitForFadeInToFinish(struct Task *); -bool8 TrainerCard_WaitForKeys(struct Task *); -bool8 TrainerCard_StartFlipAntimation(struct Task *); -bool8 TrainerCard_WaitForFlipToFinish(struct Task *); -bool8 TrainerCard_FadeOut(struct Task *); -bool8 TrainerCard_WaitForFadeOutToFinishAndQuit(struct Task *); - -bool8 (*const TrainerCard_StateMachine[])(struct Task *) = -{ - TrainerCard_Init, - TrainerCard_WaitForFadeInToFinish, - TrainerCard_WaitForKeys, - TrainerCard_StartFlipAntimation, - TrainerCard_WaitForFlipToFinish, - TrainerCard_FadeOut, - TrainerCard_WaitForFadeOutToFinishAndQuit, -}; - -bool8 TrainerCard_InitFlipAnimation(struct Task *); -bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *); -bool8 TrainerCard_SwitchToNewSide(struct Task *); -bool8 TrainerCard_ScaleUpFlipAnimation(struct Task *); -bool8 TrainerCard_FinishFlipAnimation(struct Task *); - -bool8 (*const TrainerCard_FlipAnimationStateMachine[])(struct Task *) = -{ - TrainerCard_InitFlipAnimation, - TrainerCard_ScaleDownFlipAnimation, - TrainerCard_SwitchToNewSide, - TrainerCard_ScaleUpFlipAnimation, - TrainerCard_FinishFlipAnimation, -}; - -// FIXME: Other signature than on save_menu_util.h -void FormatPlayTime(u8 *playtime, u16 hours, u16 minutes, s16 colon); -u16 GetPokedexSeenCount(void); - -enum -{ - TD_SHOWING_LINK_CARD, - TD_CARD_INDEX, - TD_CALLBACK, -}; - -static void sub_8093174(void); -static void sub_809323C(void); -static void sub_8093254(void); -static void TrainerCard_InitScreenForPlayer(Callback callBack); -static void TrainerCard_InitScreenForLinkPlayer(u8 arg1, Callback callBack); -void TrainerCard_FillTrainerCardStruct(void); -static void nullsub_60(u8); -static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal); -static u8 TrainerCard_GetStarCount(struct TrainerCard *); -static void sub_8093534(void); -static void sub_8093550(void); -static void sub_8093598(void); -static void sub_80935EC(void); -static void sub_8093610(void); -static void sub_8093688(void); -static void TrainerCard_FillFlags(void); -static void sub_80937A4(void); -static void sub_80937BC(void); -static void sub_80937D8(void); -static void sub_80937F0(void); -static void nullsub_15(void); -static void sub_8093800(void); -static void TrainerCard_CreateStateMachine(void); -static void TrainerCard_RunStateMachine(u8 taskId); -static void TrainerCard_CreatePrintPlayTimeTask(void); -static void TrainerCard_DestoryPlayTimeTask(void); -static void TrainerCard_Front_PrintPlayTime(u8 taskId); -static void TrainerCard_CreateFlipAnimationTask(void); -static u8 TrainerCard_HasFlipAnimationFinished(void); -static void TrainerCard_RunFlipAnimationStateMachine(u8 taskId); -static void TrainerCard_FlipAnimationHBlankCallback(void); -static void TrainerCard_DrawCard(void); -static void TrainerCard_DrawCardFront(void); -static void TrainerCard_DrawCardBack(void); -static void TrainerCard_ResetOffsetRegisters(void); -static void TrainerCard_CopyGraphics(void); -static void TrainerCard_LoadPalettes(void); -static void TrainerCard_LoadTrainerGraphics(void); -static void sub_8093F14(void); -static void sub_8093F48(void); -static void sub_8093F64(void); -static void TrainerCard_LoadTrainerTilemap(void); -static void TrainerCard_DrawStars(void); -static void TrainerCard_DisplayBadges(void); -static void TrainerCard_ClearTrainerGraphics(void); -static void TrainerCard_ClearPokedexLabel(void); -static void TrainerCard_Front_PrintTexts(void); -static void TrainerCard_Back_PrintTexts(void); -static void TrainerCard_Front_PrintTrainerID(void); -static void TrainerCard_Front_PrintMoney(void); -static void TrainerCard_Front_PrintPokedexCount(void); -static void TrainerCard_Front_GetPlayTimeString(u8 *arg1, s16 colon); -static void TrainerCard_PrintEasyChatPhrase(void); -static void TrainerCard_Back_PrintName(void); -static void TrainerCard_Back_PrintHallOfFameTime_Label(void); -static void TrainerCard_Back_PrintHallOfFameTime(void); -static void TrainerCard_Back_PrintLinkBattlesLabel(void); -static void TrainerCard_Back_PrintLinkBattles(void); -static void TrainerCard_Back_PrintBattleTower_Label(void); -static void TrainerCard_Back_PrintBattleTower(void); -static void TrainerCard_Back_PrintLinkContests_Label(void); -static void TrainerCard_Back_PrintLinkContests(void); -static void TrainerCard_Back_PrintLinkPokeblocks_Label(void); -static void TrainerCard_Back_PrintLinkPokeblocks(void); -static void TrainerCard_Back_PrintPokemonTrades_Label(void); -static void TrainerCard_Back_PrintPokemonTrades(void); -void unref_sub_8094588(u16 left, u16 top); - -#if DEBUG -static u8 gDebug_03000748; -#endif - -void TrainerCard_ShowPlayerCard(Callback arg1) -{ -#if DEBUG - gDebug_03000748 = 0; -#endif - TrainerCard_InitScreenForPlayer(arg1); - SetMainCallback2(sub_8093174); - ewram0_2.language = GAME_LANGUAGE; -} - -void TrainerCard_ShowLinkCard(u8 playerIndex, Callback arg2) -{ -#if DEBUG - gDebug_03000748 = 0; -#endif - TrainerCard_InitScreenForLinkPlayer(playerIndex, arg2); - SetMainCallback2(sub_8093174); - ewram0_2.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language; -} - -#if DEBUG -void debug_sub_80A0710(Callback callback) -{ - gDebug_03000748 = TRUE; - TrainerCard_InitScreenForPlayer(callback); - SetMainCallback2(sub_8093174); - ewram0_2.language = GAME_LANGUAGE; -} - -void debug_sub_80A073C(Callback callback) -{ - memcpy(&gTrainerCards[0], &sTestTrainerCard, sizeof(struct TrainerCard)); - gDebug_03000748=TRUE; - TrainerCard_InitScreenForLinkPlayer(0, callback); - SetMainCallback2(sub_8093174); - ewram0_2.language = GAME_LANGUAGE; -} - -void debug_sub_80A0780() -{ - int i; - - for (i = 0; i < 4; i++) - memcpy(&gTrainerCards[i], &sTestTrainerCard, sizeof(struct TrainerCard)); -} -#endif - -static void sub_8093174(void) -{ - switch (gMain.state) - { - case 0: - sub_8093534(); - sub_8093688(); - gMain.state++; - break; - case 1: - sub_8093598(); - gMain.state++; - break; - case 2: - sub_80935EC(); - gMain.state++; - break; - case 3: - sub_8093610(); - sub_80937A4(); - gMain.state++; - break; - case 4: - sub_80937BC(); - gMain.state++; - case 5: - if (MultistepInitMenuWindowContinue()) - gMain.state++; - break; - case 6: - sub_80937F0(); - gMain.state++; - break; - case 7: - sub_80937D8(); - gMain.state++; - break; - case 8: - nullsub_15(); - sub_8093800(); - sub_8093550(); - SetMainCallback2(sub_809323C); - break; - } -} - -static void sub_809323C(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_8093254(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ewram0_2.frameCounter++; - if (ewram0_2.frameCounter >= 60) - { - ewram0_2.frameCounter = 0; - ewram0_2.showColon ^= 1; - } - if (ewram0_2.var_4) - DmaCopy16(3, &gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 0x140); -} - -static void TrainerCard_InitScreenForPlayer(Callback callBack) -{ - u8 taskId = CreateTask(nullsub_60, 0xFF); - struct Task *task = &gTasks[taskId]; - task->data[TD_SHOWING_LINK_CARD] = FALSE; - StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); -} - -static void TrainerCard_InitScreenForLinkPlayer(u8 arg1, Callback callBack) -{ - u8 taskId = CreateTask(nullsub_60, 0xFF); - - struct Task *task = &gTasks[taskId]; - task->data[TD_SHOWING_LINK_CARD] = TRUE; - task->data[TD_CARD_INDEX] = arg1; - StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); -} - -void TrainerCard_FillTrainerCardStruct(void) -{ - u8 taskId = FindTaskIdByFunc(nullsub_60); - struct Task *task = &gTasks[taskId]; - ewram0_2.isShowingLinkCard = task->data[TD_SHOWING_LINK_CARD]; - - LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&ewram0_2.var_60); - - if (ewram0_2.isShowingLinkCard) - { - ewram0_2.displayedCard = gTrainerCards[task->data[TD_CARD_INDEX]]; - } - else - { - TrainerCard_GenerateCardForPlayer(&ewram0_2.displayedCard); - } -} - -static void nullsub_60(u8 taskid) -{ -} - -void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) -{ - u32 playTime; - bool32 enteredHallOfFame; - bool8 r4; - u8 i; - - trainerCard->gender = gSaveBlock2.playerGender; - trainerCard->playTimeHours = gSaveBlock2.playTimeHours; - trainerCard->playTimeMinutes = gSaveBlock2.playTimeMinutes; - - playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME); - enteredHallOfFame = GetGameStat(GAME_STAT_ENTERED_HOF); - if (!enteredHallOfFame) - { - playTime = 0; - } - trainerCard->firstHallOfFameA = playTime >> 16; - trainerCard->firstHallOfFameB = (playTime >> 8) & 0xFF; - trainerCard->firstHallOfFameC = playTime & 0xFF; - - trainerCard->hasPokedex = FlagGet(FLAG_SYS_POKEDEX_GET); - trainerCard->var_3 = CompletedHoennPokedex(); - trainerCard->pokedexSeen = GetPokedexSeenCount(); - - trainerCard->trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; - - // Link Cable Battles - trainerCard->linkBattleWins = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_WINS, 9999); - trainerCard->linkBattleLosses = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_LOSSES, 9999); - - // Contests w/ Friends - trainerCard->contestsWithFriends = sav12_xor_get_clamped_above(GAME_STAT_WON_LINK_CONTEST, 999); - - // Pokéblocks w/ Friends - trainerCard->pokeblocksWithFriends = sav12_xor_get_clamped_above(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); - - // Pokémon Trades - trainerCard->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF); - - // Battle Tower - trainerCard->battleTowerWins = gSaveBlock2.battleTower.totalBattleTowerWins; - trainerCard->battleTowerLosses = gSaveBlock2.battleTower.bestBattleTowerWinStreak; - if (trainerCard->battleTowerWins > 9999) - { - trainerCard->battleTowerWins = 9999; - } - if (trainerCard->battleTowerLosses > 9999) - { - trainerCard->battleTowerLosses = 9999; - } - - r4 = FALSE; - if (sub_80C4D50() > 4) - { - r4 = TRUE; - } - trainerCard->var_4 = r4; - - trainerCard->money = gSaveBlock1.money; - - for (i = 0; i < 4; i++) - { - trainerCard->var_28[i] = gSaveBlock1.easyChats.unk2B1C[i]; - } - - for (i = 0; i < 8; i++) - { - trainerCard->playerName[i] = gSaveBlock2.playerName[i]; - } - - trainerCard->stars = TrainerCard_GetStarCount(trainerCard); -} - -u8 sub_80934C4(u8 id) -{ - return gTrainerCards[id].stars; -} - -static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal) -{ - u32 value = GetGameStat(index); - - if (value > maxVal) - { - value = maxVal; - } - - return value; -} - -static u8 TrainerCard_GetStarCount(struct TrainerCard *trainerCard) -{ - u8 value = 0; - - if (trainerCard->firstHallOfFameA != 0 || trainerCard->firstHallOfFameB != 0 || trainerCard->firstHallOfFameC != 0) - { - value++; - } - - if (trainerCard->var_3) - { - value++; - } - - if (trainerCard->battleTowerLosses > 49) - { - value++; - } - - if (trainerCard->var_4) - { - value++; - } - - return value; -} - -static void sub_8093534(void) -{ - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); - REG_DISPCNT = 0; -} - -static void sub_8093550(void) -{ - u16 backup; - - SetVBlankCallback(sub_8093254); - - backup = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK | INTR_FLAG_HBLANK; - REG_IME = backup; - - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; -} - -void sub_8093598(void) -{ - DmaFill16Large(3, 0, (void *)VRAM, 0x10000, 0x1000); -} - -void sub_80935EC(void) -{ - DmaFill16Defvars(3, 0, (void *)OAM, 0x400); -} - -void sub_8093610(void) -{ - REG_BG0CNT = 0; - REG_BG1CNT = 0; - REG_BG2CNT = 0; - REG_BG3CNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(10) | BGCNT_16COLOR | BGCNT_TXT256x256; -} - -static void sub_8093688(void) -{ - u8 i; - - TrainerCard_FillTrainerCardStruct(); - ewram0_2.current_state = 0; - ewram0_2.backSideShown = FALSE; - ewram0_2.var_4 = FALSE; - ewram0_2.starCount = ewram0_2.displayedCard.stars; - ewram0_2.showColon = 0; - ewram0_2.frameCounter = 0; - for (i = 0; i < 4; i++) - EasyChat_GetWordText(ewram0_2.easyChatPhrase[i], ewram0_2.displayedCard.var_28[i]); - TrainerCard_FillFlags(); -} - -static void TrainerCard_FillFlags(void) -{ - ewram0_2.showPokedexCount = 0; - ewram0_2.showHallOfFame = 0; - ewram0_2.showLinkBattleStatus = 0; - ewram0_2.showBattleTowerStatus = 0; - ewram0_2.showContestRecord = 0; - ewram0_2.showMixingRecord = 0; - ewram0_2.showTradingRecord = 0; - memset(ewram0_2.ownedBadges, 0, sizeof(ewram0_2.ownedBadges)); - - if (ewram0_2.displayedCard.hasPokedex) - ewram0_2.showPokedexCount++; - - if (ewram0_2.displayedCard.firstHallOfFameA != 0 - || ewram0_2.displayedCard.firstHallOfFameB != 0 - || ewram0_2.displayedCard.firstHallOfFameC != 0) - ewram0_2.showHallOfFame++; - - if (ewram0_2.displayedCard.linkBattleWins != 0 || ewram0_2.displayedCard.linkBattleLosses != 0) - ewram0_2.showLinkBattleStatus++; - - if (ewram0_2.displayedCard.battleTowerWins != 0 || ewram0_2.displayedCard.battleTowerLosses != 0) - ewram0_2.showBattleTowerStatus++; - - if (ewram0_2.displayedCard.contestsWithFriends != 0) - ewram0_2.showContestRecord++; - - if (ewram0_2.displayedCard.pokeblocksWithFriends != 0) - ewram0_2.showMixingRecord++; - - if (ewram0_2.displayedCard.pokemonTrades != 0) - ewram0_2.showTradingRecord++; - - if (!ewram0_2.isShowingLinkCard) - { - u32 badgeFlag; - int i = 0; - - badgeFlag = FLAG_BADGE01_GET; - while (1) - { - if (FlagGet(badgeFlag)) - ewram0_2.ownedBadges[i]++; - badgeFlag++; - i++; - if (badgeFlag > FLAG_BADGE08_GET) - { - break; - } - } - } - -#if DEBUG - if (gDebug_03000748 != 0) - { - ewram0_2.showHallOfFame = TRUE; - ewram0_2.showLinkBattleStatus = TRUE; - ewram0_2.showBattleTowerStatus = TRUE; - ewram0_2.showContestRecord = TRUE; - ewram0_2.showMixingRecord = TRUE; - ewram0_2.showTradingRecord = TRUE; - memset(ewram0_2.ownedBadges, TRUE, sizeof(ewram0_2.ownedBadges)); - } -#endif -} - -void sub_80937A4() -{ - ResetPaletteFade(); - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); -} - -void sub_80937BC() -{ - Text_LoadWindowTemplate(&gWindowTemplate_TrainerCard_Back_Values); - MultistepInitMenuWindowBegin(&gWindowTemplate_TrainerCard_Back_Values); -} - -static void sub_80937D8() -{ - TrainerCard_ResetOffsetRegisters(); - TrainerCard_CopyGraphics(); - sub_8093F64(); - TrainerCard_DrawCard(); -} - -static void sub_80937F0() -{ - TrainerCard_LoadTrainerGraphics(); -} - -static void nullsub_15(void) -{ -} - -static void sub_8093800() -{ - TrainerCard_CreateStateMachine(); -} - -static void TrainerCard_CreateStateMachine(void) -{ - u8 taskId; - - taskId = CreateTask(TrainerCard_RunStateMachine, 0); - TrainerCard_RunStateMachine(taskId); -} - -static void TrainerCard_RunStateMachine(u8 taskId) -{ - while (TrainerCard_StateMachine[ewram0_2.current_state](&gTasks[taskId]) != 0) - ; -} - -bool8 TrainerCard_Init(struct Task *task) -{ - ewram0_2.showColon = gSaveBlock2.playTimeSeconds & 1; - ewram0_2.frameCounter = gSaveBlock2.playTimeVBlanks; - TrainerCard_CreatePrintPlayTimeTask(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - ewram0_2.current_state++; /* Advance state machine */ - return FALSE; -} - -bool8 TrainerCard_WaitForFadeInToFinish(struct Task *task) -{ - if (!gPaletteFade.active) - ewram0_2.current_state++; /* Advance state machine */ - return FALSE; -} - -bool8 TrainerCard_WaitForKeys(struct Task *task) -{ - if (gMain.newKeys & B_BUTTON) - { - ewram0_2.current_state = 5; /* Jump to fadeout state */ - return TRUE; - } - else if (gMain.newKeys & A_BUTTON) - { - /* It appears that it was previously possible to return the the front side - after viewing the back side. This was probably removed due to being - unintuitive. */ - if (ewram0_2.backSideShown) - { - ewram0_2.current_state = 5; /* Jump to fadeout state */ - } - else - { - ewram0_2.backSideShown ^= 1; /* Switch to back side */ - ewram0_2.current_state = 3; /* Jump to start flip animation state */ - } - return TRUE; - } -#if DEBUG - else if (gDebug_03000748 && gMain.newKeys & R_BUTTON) - { - ewram0_2.starCount++; - ewram0_2.starCount %= 5; - TrainerCard_LoadPalettes(); - if (ewram0_2.backSideShown == 0) - TrainerCard_DrawStars(); - } -#endif - - return FALSE; -} - -bool8 TrainerCard_StartFlipAntimation(struct Task *task) -{ - TrainerCard_CreateFlipAnimationTask(); - PlaySE(SE_CARD); - ewram0_2.current_state++; /* Advance state machine */ - return FALSE; -} - -bool8 TrainerCard_WaitForFlipToFinish(struct Task *task) -{ - if (TrainerCard_HasFlipAnimationFinished()) - ewram0_2.current_state = 2; /* Return to wait for keys state */ - return FALSE; -} - -bool8 TrainerCard_FadeOut(struct Task *task) -{ - TrainerCard_DestoryPlayTimeTask(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - ewram0_2.current_state++; /* Advance state machine */ - return FALSE; -} - -bool8 TrainerCard_WaitForFadeOutToFinishAndQuit(struct Task *task) -{ - if (!gPaletteFade.active) - SetMainCallback2((MainCallback)ewram0_2.var_60); - return FALSE; -} - -static void TrainerCard_CreatePrintPlayTimeTask(void) -{ - CreateTask(TrainerCard_Front_PrintPlayTime, 0); - BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); -} - -static void TrainerCard_DestoryPlayTimeTask(void) -{ - u8 taskId = FindTaskIdByFunc(TrainerCard_Front_PrintPlayTime); - - if (taskId != 0xFF) - DestroyTask(taskId); -} - -static void TrainerCard_Front_PrintPlayTime(u8 taskId) -{ - u8 buffer[32]; - struct Task *task = &gTasks[taskId]; - - if (ewram0_2.showColon != task->data[TD_CARD_INDEX]) - { - task->data[TD_CARD_INDEX] = ewram0_2.showColon; - task->data[TD_SHOWING_LINK_CARD] ^= TRUE; - } - TrainerCard_Front_GetPlayTimeString(buffer, task->data[TD_SHOWING_LINK_CARD]); - Menu_PrintText(buffer, 10, 12); -} - -static void TrainerCard_CreateFlipAnimationTask(void) -{ - u8 taskId; - - taskId = CreateTask(TrainerCard_RunFlipAnimationStateMachine, 0); - TrainerCard_RunFlipAnimationStateMachine(taskId); -} - -static u8 TrainerCard_HasFlipAnimationFinished(void) -{ - if (FindTaskIdByFunc(TrainerCard_RunFlipAnimationStateMachine) == 0xFF) - return TRUE; - else - return FALSE; -} - -static void TrainerCard_RunFlipAnimationStateMachine(u8 taskId) -{ - while (TrainerCard_FlipAnimationStateMachine[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) - ; -} - -bool8 TrainerCard_InitFlipAnimation(struct Task *task) -{ - u32 i; - - ewram0_2.var_4 = FALSE; - ScanlineEffect_Clear(); - for (i = 0; i < 0xA0; i++) - gScanlineEffectRegBuffers[1][i] = -4; - SetHBlankCallback(TrainerCard_FlipAnimationHBlankCallback); - ewram0_2.var_4 = TRUE; - task->data[0]++; - return FALSE; -} - -/* -bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) -{ - u32 r7; - u16 r9; - u32 r6; - u32 r5; - u32 r4; - u32 r10; - u32 sp0; - s16 i; - - ewram0_2.var_4 = 0; - task->data[1] += 3; - if (task->data[1] > 79) - task->data[1] = 79; - - r7 = task->data[1]; - r9 = 160 - r7; - r4 = r9 - r7; - r6 = -r7 << 16; - r5 = (160 << 16) / r4; - r5 -= 1 << 16; - r10 = r5 * r4 + r6; - sp0 = r5 / r4; - r5 *= 2; - - for (i = 0; i < r7; i++) - { - gScanlineEffectRegBuffers.filler0[i] = -4 - (u32)i; - } - //_08093B74 - for (; i < r9; i++) - { - u16 var = r6 >> 16; - r6 += r5; - r5 -= sp0; - gScanlineEffectRegBuffers.filler0[i] = -4 + var; - } - for (; i < 160; i++) - gScanlineEffectRegBuffers.filler0[i] = -4 + (u16)(r10 >> 16); - ewram0_2.var_4 = 1; - if (task->data[1] > 0x4A) - task->data[0]++; - return FALSE; -} -*/ - -__attribute__((naked)) -bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - mov r8, r0\n\ - ldr r1, _08093BFC @ =gSharedMem\n\ - movs r0, 0\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - ldrh r0, [r2, 0xA]\n\ - adds r0, 0x3\n\ - strh r0, [r2, 0xA]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x4F\n\ - ble _08093B18\n\ - movs r0, 0x4F\n\ - strh r0, [r2, 0xA]\n\ -_08093B18:\n\ - mov r4, r8\n\ - movs r0, 0xA\n\ - ldrsh r7, [r4, r0]\n\ - movs r0, 0xA0\n\ - subs r0, r7\n\ - mov r9, r0\n\ - subs r4, r0, r7\n\ - negs r0, r7\n\ - lsls r6, r0, 16\n\ - movs r0, 0xA0\n\ - lsls r0, 16\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - adds r5, r0, 0\n\ - ldr r1, _08093C00 @ =0xffff0000\n\ - adds r5, r1\n\ - adds r0, r5, 0\n\ - muls r0, r4\n\ - adds r0, r6\n\ - mov r10, r0\n\ - adds r0, r5, 0\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - str r0, [sp]\n\ - lsls r5, 1\n\ - movs r3, 0\n\ - cmp r3, r7\n\ - bcs _08093B74\n\ - ldr r2, _08093C04 @ =gScanlineEffectRegBuffers\n\ - mov r12, r2\n\ - ldr r0, _08093C08 @ =0x0000fffc\n\ - adds r4, r0, 0\n\ -_08093B5C:\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - lsls r1, r0, 1\n\ - add r1, r12\n\ - subs r2, r4, r0\n\ - strh r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, r7\n\ - bcc _08093B5C\n\ -_08093B74:\n\ - lsls r2, r3, 16\n\ - mov r1, r9\n\ - lsls r0, r1, 16\n\ - asrs r1, r0, 16\n\ - mov r4, r10\n\ - lsrs r7, r4, 16\n\ - cmp r2, r0\n\ - bge _08093BAE\n\ - ldr r0, _08093C04 @ =gScanlineEffectRegBuffers\n\ - mov r9, r0\n\ - ldr r4, _08093C08 @ =0x0000fffc\n\ - mov r12, r4\n\ - adds r4, r1, 0\n\ -_08093B8E:\n\ - lsrs r1, r6, 16\n\ - adds r6, r5\n\ - ldr r0, [sp]\n\ - subs r5, r0\n\ - asrs r2, 16\n\ - lsls r0, r2, 1\n\ - add r0, r9\n\ - add r1, r12\n\ - strh r1, [r0]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, r4\n\ - blt _08093B8E\n\ -_08093BAE:\n\ - adds r1, r7, 0\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x9F\n\ - bgt _08093BD4\n\ - ldr r4, _08093C04 @ =gScanlineEffectRegBuffers\n\ - ldr r0, _08093C08 @ =0x0000fffc\n\ - adds r2, r1, r0\n\ -_08093BBE:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r0, r1, 1\n\ - adds r0, r4\n\ - strh r2, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x9F\n\ - ble _08093BBE\n\ -_08093BD4:\n\ - movs r0, 0x1\n\ - ldr r1, _08093BFC @ =gSharedMem\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - movs r4, 0xA\n\ - ldrsh r0, [r2, r4]\n\ - cmp r0, 0x4A\n\ - ble _08093BEA\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ -_08093BEA:\n\ - movs r0, 0\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08093BFC: .4byte gSharedMem\n\ -_08093C00: .4byte 0xffff0000\n\ -_08093C04: .4byte gScanlineEffectRegBuffers\n\ -_08093C08: .4byte 0x0000fffc\n\ - .syntax divided\n"); -} - -bool8 TrainerCard_SwitchToNewSide(struct Task *task) -{ - TrainerCard_DestoryPlayTimeTask(); - TrainerCard_DrawCard(); - if (!ewram0_2.backSideShown) { - /* This code never runs because it is impossible to flip the back side back to the front side */ - TrainerCard_CreatePrintPlayTimeTask(); - } - task->data[0]++; - return TRUE; -} - -__attribute__((naked)) -bool8 TrainerCard_ScaleUpFlipAnimation(struct Task *task) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - mov r8, r0\n\ - ldr r1, _08093D40 @ =gSharedMem\n\ - movs r2, 0\n\ - strb r2, [r1, 0x4]\n\ - ldrh r0, [r0, 0xA]\n\ - subs r0, 0x3\n\ - mov r3, r8\n\ - strh r0, [r3, 0xA]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bgt _08093C5C\n\ - strh r2, [r3, 0xA]\n\ -_08093C5C:\n\ - mov r4, r8\n\ - movs r0, 0xA\n\ - ldrsh r7, [r4, r0]\n\ - movs r0, 0xA0\n\ - subs r0, r7\n\ - mov r9, r0\n\ - subs r4, r0, r7\n\ - negs r0, r7\n\ - lsls r6, r0, 16\n\ - movs r0, 0xA0\n\ - lsls r0, 16\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - adds r5, r0, 0\n\ - ldr r1, _08093D44 @ =0xffff0000\n\ - adds r5, r1\n\ - adds r0, r5, 0\n\ - muls r0, r4\n\ - adds r0, r6\n\ - mov r10, r0\n\ - adds r0, r5, 0\n\ - adds r1, r4, 0\n\ - bl __udivsi3\n\ - str r0, [sp]\n\ - lsrs r5, 1\n\ - movs r3, 0\n\ - cmp r3, r7\n\ - bcs _08093CB8\n\ - ldr r2, _08093D48 @ =gScanlineEffectRegBuffers\n\ - mov r12, r2\n\ - ldr r0, _08093D4C @ =0x0000fffc\n\ - adds r4, r0, 0\n\ -_08093CA0:\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - lsls r1, r0, 1\n\ - add r1, r12\n\ - subs r2, r4, r0\n\ - strh r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, r7\n\ - bcc _08093CA0\n\ -_08093CB8:\n\ - lsls r2, r3, 16\n\ - mov r1, r9\n\ - lsls r0, r1, 16\n\ - asrs r1, r0, 16\n\ - mov r4, r10\n\ - lsrs r7, r4, 16\n\ - cmp r2, r0\n\ - bge _08093CF2\n\ - ldr r0, _08093D48 @ =gScanlineEffectRegBuffers\n\ - mov r9, r0\n\ - ldr r3, _08093D4C @ =0x0000fffc\n\ - mov r12, r3\n\ - adds r4, r1, 0\n\ -_08093CD2:\n\ - lsrs r1, r6, 16\n\ - adds r6, r5\n\ - ldr r0, [sp]\n\ - adds r5, r0\n\ - asrs r2, 16\n\ - lsls r0, r2, 1\n\ - add r0, r9\n\ - add r1, r12\n\ - strh r1, [r0]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, r4\n\ - blt _08093CD2\n\ -_08093CF2:\n\ - adds r1, r7, 0\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x9F\n\ - bgt _08093D18\n\ - ldr r4, _08093D48 @ =gScanlineEffectRegBuffers\n\ - ldr r0, _08093D4C @ =0x0000fffc\n\ - adds r2, r1, r0\n\ -_08093D02:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r0, r1, 1\n\ - adds r0, r4\n\ - strh r2, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - cmp r1, 0x9F\n\ - ble _08093D02\n\ -_08093D18:\n\ - movs r0, 0x1\n\ - ldr r1, _08093D40 @ =gSharedMem\n\ - strb r0, [r1, 0x4]\n\ - mov r2, r8\n\ - movs r3, 0xA\n\ - ldrsh r0, [r2, r3]\n\ - cmp r0, 0\n\ - bgt _08093D2E\n\ - ldrh r0, [r2, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r2, 0x8]\n\ -_08093D2E:\n\ - movs r0, 0\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08093D40: .4byte gSharedMem\n\ -_08093D44: .4byte 0xffff0000\n\ -_08093D48: .4byte gScanlineEffectRegBuffers\n\ -_08093D4C: .4byte 0x0000fffc\n\ - .syntax divided\n"); -} - -bool8 TrainerCard_FinishFlipAnimation(struct Task *task) -{ - u8 taskId; - - ewram0_2.var_4 = FALSE; - SetHBlankCallback(NULL); - TrainerCard_ResetOffsetRegisters(); - taskId = FindTaskIdByFunc(TrainerCard_RunFlipAnimationStateMachine); - DestroyTask(taskId); - return FALSE; -} - -static void TrainerCard_FlipAnimationHBlankCallback(void) -{ - u16 bgVOffset = gScanlineEffectRegBuffers[1][REG_VCOUNT & 0xFF]; - - REG_BG0VOFS = bgVOffset; - REG_BG1VOFS = bgVOffset; - REG_BG2VOFS = bgVOffset; -} - -static void TrainerCard_DrawCard(void) -{ - if (ewram0_2.backSideShown) - TrainerCard_DrawCardBack(); - else - TrainerCard_DrawCardFront(); -} - -static void TrainerCard_DrawCardFront(void) -{ - Menu_EraseScreen(); - TrainerCard_ClearTrainerGraphics(); - sub_8093F14(); - TrainerCard_LoadTrainerTilemap(); - TrainerCard_DrawStars(); - TrainerCard_DisplayBadges(); - TrainerCard_Front_PrintTexts(); -} - -static void TrainerCard_DrawCardBack(void) -{ - Menu_EraseScreen(); - TrainerCard_ClearTrainerGraphics(); - sub_8093F48(); - TrainerCard_Back_PrintTexts(); -} - -static void TrainerCard_ResetOffsetRegisters(void) -{ - REG_BG0VOFS = -4; - REG_BG1HOFS = 0; - REG_BG1VOFS = -4; - REG_BG2HOFS = 0; - REG_BG2VOFS = -4; -} - -static void TrainerCard_CopyGraphics(void) -{ - TrainerCard_LoadPalettes(); - LoadPalette(gUnknown_083B5F6C, 0xE0, 32); - DmaCopyLarge16(3, gMenuTrainerCard_Gfx, (void *)VRAM, 0x1480, 0x1000); - DmaCopy16Defvars(3, gBadgesTiles, (void *)(VRAM + 0x1480), 0x400); -} - -extern const u16 *const gTrainerCardPalettes[]; - -static void TrainerCard_LoadPalettes(void) -{ - LoadPalette(gTrainerCardPalettes[ewram0_2.starCount], 0, 48 * 2); - LoadPalette(gBadgesPalette, 48, 16 * 2); - LoadPalette(gUnknown_083B5F4C, 64, 16 * 2); - if (ewram0_2.displayedCard.gender != MALE) - LoadPalette(gUnknown_083B5F0C, 16, 16 * 2); -} - -static void TrainerCard_LoadTrainerGraphics(void) -{ - LoadTrainerGfx_TrainerCard(ewram0_2.displayedCard.gender, 80, (void *)(VRAM + 0x1880)); -} - -static void sub_8093F14(void) -{ - const void *arr[] = {gUnknown_08E8CAC0, gUnknown_08E8D4C0}; - - CpuFastSet(arr[ewram0_2.isShowingLinkCard], (void *)(VRAM + 0x4800), 0x140); -} - -// I don't really know where to put the data. It's in such a weird order. - -const u8 gUnknown_083B5EF4[] = _(" : "); - -const u16 *const gTrainerCardPalettes[] = -{ - gMenuTrainerCard0Star_Pal, - gMenuTrainerCard1Star_Pal, - gMenuTrainerCard2Star_Pal, - gMenuTrainerCard3Star_Pal, - gMenuTrainerCard4Star_Pal, -}; - -const u16 gUnknown_083B5F0C[] = INCBIN_U16("graphics/trainer_card/83B5F0C.gbapal"); -const u16 gBadgesPalette[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); -const u16 gUnknown_083B5F4C[] = INCBIN_U16("graphics/trainer_card/83B5F4C.gbapal"); -const u16 gUnknown_083B5F6C[] = INCBIN_U16("graphics/trainer_card/83B5F6C.gbapal"); -const u16 gTrainerCardBadgesMap[][4] = INCBIN_U16("graphics/trainer_card/83B5F8C_map.bin"); - -static void sub_8093F48(void) -{ - CpuFastSet(gUnknown_08E8CFC0, (void *)(VRAM + 0x4800), 320); -} - -static void sub_8093F64(void) -{ - CpuFastSet(gUnknown_08E8D9C0, (void *)(VRAM + 0x5000), 320); -} - -static void TrainerCard_LoadTrainerTilemap(void) -{ - u16 r5 = 0xC4; - u16 *ptr = (u16 *)(VRAM + 0x4000); - s16 i; - s16 j; - - for (i = 5; i < 13; i++) - { - for (j = 19; j < 27; j++, r5++) - ptr[i * 32 + j] = r5 | 0x5000; - } -} - -static void TrainerCard_DrawStars(void) -{ - u16 *ptr = (u16 *)(VRAM + 0x4000); - s16 i = 15; - s16 var = 15 + ewram0_2.starCount; - - while (i < var) - { - ptr[6 * 32 + i] = 0x408F; - i++; - } - while (i < 0x13) - { - ptr[6 * 32 + i] = 0; - i++; - } -} - -static void TrainerCard_DisplayBadges(void) -{ - if (!ewram0_2.isShowingLinkCard) - { - u16 *ptr = (u16 *)(VRAM + 0x4000); - s16 i; - s16 r2; - - for (i = 0, r2 = 4; i < 8; i++, r2 += 3) - { - if (ewram0_2.ownedBadges[i] != 0) - { - ptr[15 * 32 + r2 + 0] = gTrainerCardBadgesMap[i][0] | 0x3000; - ptr[15 * 32 + r2 + 1] = gTrainerCardBadgesMap[i][1] | 0x3000; - ptr[16 * 32 + r2 + 0] = gTrainerCardBadgesMap[i][2] | 0x3000; - ptr[16 * 32 + r2 + 1] = gTrainerCardBadgesMap[i][3] | 0x3000; - } - } - } -} - -static void TrainerCard_ClearTrainerGraphics(void) -{ - s16 i; - u16 *ptr; - - for (i = 0, ptr = (u16 *)(VRAM + 0x4000); i < 0x400; i++, ptr++) - *ptr = 0; -} - -static void TrainerCard_ClearPokedexLabel(void) -{ - u16 *ptr = (u16 *)(VRAM + 0x4800); - u16 i; - - for (i = 3; i < 17; i++) - { - ptr[10 * 32 + i] = 1; - ptr[11 * 32 + i] = 1; - } -} - -static void TrainerCard_Front_PrintTexts(void) -{ - u8 *buffer; - - BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); - - buffer = gStringVar1; - StringCopy(buffer, ewram0_2.displayedCard.playerName); - ConvertInternationalString(buffer, ewram0_2.language); - Menu_PrintText(buffer, 7, 5); - - TrainerCard_Front_PrintTrainerID(); - TrainerCard_Front_PrintMoney(); - TrainerCard_Front_PrintPokedexCount(); - TrainerCard_PrintEasyChatPhrase(); -} - -static void TrainerCard_Back_PrintTexts(void) -{ - BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); - TrainerCard_Back_PrintName(); - TrainerCard_Back_PrintHallOfFameTime_Label(); - TrainerCard_Back_PrintLinkBattlesLabel(); - TrainerCard_Back_PrintBattleTower_Label(); - TrainerCard_Back_PrintLinkContests_Label(); - TrainerCard_Back_PrintLinkPokeblocks_Label(); - TrainerCard_Back_PrintPokemonTrades_Label(); - - BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Labels); - TrainerCard_Back_PrintHallOfFameTime(); - TrainerCard_Back_PrintLinkBattles(); - TrainerCard_Back_PrintBattleTower(); - TrainerCard_Back_PrintLinkContests(); - TrainerCard_Back_PrintLinkPokeblocks(); - TrainerCard_Back_PrintPokemonTrades(); -} - -static void TrainerCard_Front_PrintTrainerID(void) -{ - u8 buffer[8]; - - ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); - Menu_PrintText(buffer, 20, 2); -} - -static void TrainerCard_Front_PrintMoney(void) -{ - sub_80B7AEC(ewram0_2.displayedCard.money, 16, 8); -} - -static void TrainerCard_Front_PrintPokedexCount(void) -{ - u8 buffer[16]; - - if ( -#if DEBUG - gDebug_03000748 == 0 && -#endif - !ewram0_2.showPokedexCount) - { - TrainerCard_ClearPokedexLabel(); - } - else - { - ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3); - MenuPrint_RightAligned(buffer, 16, 10); - } -} - -static void TrainerCard_Front_GetPlayTimeString(u8 *arg1, s16 colon) -{ - u8 buffer[16]; - u16 playTimeHours; - u16 playTimeMinutes; - - playTimeHours = gSaveBlock2.playTimeHours; - playTimeMinutes = gSaveBlock2.playTimeMinutes; - if (ewram0_2.isShowingLinkCard != 0) - { - playTimeHours = ewram0_2.displayedCard.playTimeHours; - playTimeMinutes = ewram0_2.displayedCard.playTimeMinutes; - } - FormatPlayTime(buffer, playTimeHours, playTimeMinutes, colon); - sub_8072C74(arg1, buffer, 48, 1); -} - -static void TrainerCard_PrintEasyChatPhrase(void) -{ - u8 *str; - - if (ewram0_2.isShowingLinkCard != 0) - { - str = gStringVar1; - str = StringCopy(str, ewram0_2.easyChatPhrase[0]); - str[0] = 00; - str++; - str = StringCopy(str, ewram0_2.easyChatPhrase[1]); - Menu_PrintText(gStringVar1, 2, 14); - - str = gStringVar1; - str = StringCopy(str, ewram0_2.easyChatPhrase[2]); - str[0] = 00; - str++; - str = StringCopy(str, ewram0_2.easyChatPhrase[3]); - Menu_PrintText(gStringVar1, 2, 16); - } -} - -static void TrainerCard_Back_PrintName(void) -{ - u8 *str; - - str = gStringVar1; - StringCopy(str, ewram0_2.displayedCard.playerName); - ConvertInternationalString(str, ewram0_2.language); - -#if ENGLISH - StringAppend(str, gOtherText_TrainersTrainerCard); -#elif GERMAN - de_sub_8073174(str, gOtherText_TrainersTrainerCard); -#endif - - MenuPrint_RightAligned(gStringVar1, 28, 2); -} - -static void TrainerCard_Back_PrintHallOfFameTime_Label(void) -{ - if (ewram0_2.showHallOfFame != 0) - Menu_PrintText(gOtherText_FirstHOF, 3, 5); -} - -static void TrainerCard_Back_PrintHallOfFameTime(void) -{ - u8 *str; - - if (ewram0_2.showHallOfFame != 0) - { - str = gStringVar1; - str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3); - str = StringCopy(str, gUnknown_083B5EF4); - str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2); - str = StringCopy(str, gUnknown_083B5EF4); - str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2); - MenuPrint_RightAligned(gStringVar1, 28, 5); - } -} - -static void TrainerCard_Back_PrintLinkBattlesLabel(void) -{ - if (ewram0_2.showLinkBattleStatus != 0) - Menu_PrintText(gOtherText_LinkCableBattles, 3, 7); -} - -static void TrainerCard_Back_PrintLinkBattles(void) -{ - u8 buffer[16]; - - if (ewram0_2.showLinkBattleStatus != 0) - { - ConvertIntToDecimalString(buffer, ewram0_2.displayedCard.linkBattleWins); - MenuPrint_RightAligned(buffer, 22, 7); - - ConvertIntToDecimalString(buffer, ewram0_2.displayedCard.linkBattleLosses); - MenuPrint_RightAligned(buffer, 28, 7); - } -} - -static void TrainerCard_Back_PrintBattleTower_Label(void) -{ - if (ewram0_2.showBattleTowerStatus != 0) - Menu_PrintText(gOtherText_BattleTowerWinRecord, 3, 15); -} - -static void TrainerCard_Back_PrintBattleTower(void) -{ - u8 buffer[16]; - - if (ewram0_2.showBattleTowerStatus != 0) - { - sub_8072C44(buffer, ewram0_2.displayedCard.battleTowerWins, 24, 1); - Menu_PrintTextPixelCoords(buffer, 112, 120, 0); - - sub_8072C44(buffer, ewram0_2.displayedCard.battleTowerLosses, 24, 1); - Menu_PrintTextPixelCoords(buffer, 149, 120, 0); - } -} - -static void TrainerCard_Back_PrintLinkContests_Label(void) -{ - if (ewram0_2.showContestRecord != 0) - Menu_PrintText(gOtherText_ContestRecord, 3, 13); -} - -static void TrainerCard_Back_PrintLinkContests(void) -{ - u8 buffer[8]; - - if (ewram0_2.showContestRecord != 0) - { - ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3); - MenuPrint_RightAligned(buffer, 28, 13); - } -} - -static void TrainerCard_Back_PrintLinkPokeblocks_Label(void) -{ - if (ewram0_2.showMixingRecord != 0) - Menu_PrintText(gOtherText_MixingRecord, 3, 11); -} - -static void TrainerCard_Back_PrintLinkPokeblocks(void) -{ - u8 buffer[8]; - - if (ewram0_2.showMixingRecord != 0) - { - ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); - MenuPrint_RightAligned(buffer, 28, 11); - } -} - -static void TrainerCard_Back_PrintPokemonTrades_Label(void) -{ - if (ewram0_2.showTradingRecord != 0) - Menu_PrintText(gOtherText_TradeRecord, 3, 9); -} - -static void TrainerCard_Back_PrintPokemonTrades(void) -{ - u8 buffer[8]; - - if (ewram0_2.showTradingRecord != 0) - { - ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); - MenuPrint_RightAligned(buffer, 28, 9); - } -} - -void unref_sub_8094588(u16 left, u16 top) -{ - const u8 *text = gOtherText_Boy; - - if (gSaveBlock2.playerGender == FEMALE) - text = gOtherText_Girl; - Menu_PrintText(text, left, top); -} diff --git a/src/engine/trig.c b/src/engine/trig.c deleted file mode 100644 index e16a69e63..000000000 --- a/src/engine/trig.c +++ /dev/null @@ -1,549 +0,0 @@ -#include "global.h" -#include "trig.h" - -// Converts a number to Q8.8 fixed-point format -#define Q_8_8(n) ((s16)((n) * 256)) - -// Converts a number to Q4.12 fixed-point format -#define Q_4_12(n) ((s16)((n) * 4096)) - -// Values of sin(x*(π/128)) as Q8.8 fixed-point numbers from x = 0 to x = 319 -const s16 gSineTable[] = -{ - Q_8_8(0), // sin(0*(π/128)) - Q_8_8(0.0234375), // sin(1*(π/128)) - Q_8_8(0.046875), // sin(2*(π/128)) - Q_8_8(0.0703125), // sin(3*(π/128)) - Q_8_8(0.09765625), // sin(4*(π/128)) - Q_8_8(0.12109375), // sin(5*(π/128)) - Q_8_8(0.14453125), // sin(6*(π/128)) - Q_8_8(0.16796875), // sin(7*(π/128)) - Q_8_8(0.19140625), // sin(8*(π/128)) - Q_8_8(0.21875), // sin(9*(π/128)) - Q_8_8(0.2421875), // sin(10*(π/128)) - Q_8_8(0.265625), // sin(11*(π/128)) - Q_8_8(0.2890625), // sin(12*(π/128)) - Q_8_8(0.3125), // sin(13*(π/128)) - Q_8_8(0.3359375), // sin(14*(π/128)) - Q_8_8(0.359375), // sin(15*(π/128)) - Q_8_8(0.37890625), // sin(16*(π/128)) - Q_8_8(0.40234375), // sin(17*(π/128)) - Q_8_8(0.42578125), // sin(18*(π/128)) - Q_8_8(0.44921875), // sin(19*(π/128)) - Q_8_8(0.46875), // sin(20*(π/128)) - Q_8_8(0.4921875), // sin(21*(π/128)) - Q_8_8(0.51171875), // sin(22*(π/128)) - Q_8_8(0.53125), // sin(23*(π/128)) - Q_8_8(0.5546875), // sin(24*(π/128)) - Q_8_8(0.57421875), // sin(25*(π/128)) - Q_8_8(0.59375), // sin(26*(π/128)) - Q_8_8(0.61328125), // sin(27*(π/128)) - Q_8_8(0.6328125), // sin(28*(π/128)) - Q_8_8(0.65234375), // sin(29*(π/128)) - Q_8_8(0.66796875), // sin(30*(π/128)) - Q_8_8(0.6875), // sin(31*(π/128)) - Q_8_8(0.70703125), // sin(32*(π/128)) - Q_8_8(0.72265625), // sin(33*(π/128)) - Q_8_8(0.73828125), // sin(34*(π/128)) - Q_8_8(0.75390625), // sin(35*(π/128)) - Q_8_8(0.76953125), // sin(36*(π/128)) - Q_8_8(0.78515625), // sin(37*(π/128)) - Q_8_8(0.80078125), // sin(38*(π/128)) - Q_8_8(0.81640625), // sin(39*(π/128)) - Q_8_8(0.828125), // sin(40*(π/128)) - Q_8_8(0.84375), // sin(41*(π/128)) - Q_8_8(0.85546875), // sin(42*(π/128)) - Q_8_8(0.8671875), // sin(43*(π/128)) - Q_8_8(0.87890625), // sin(44*(π/128)) - Q_8_8(0.890625), // sin(45*(π/128)) - Q_8_8(0.90234375), // sin(46*(π/128)) - Q_8_8(0.9140625), // sin(47*(π/128)) - Q_8_8(0.921875), // sin(48*(π/128)) - Q_8_8(0.9296875), // sin(49*(π/128)) - Q_8_8(0.94140625), // sin(50*(π/128)) - Q_8_8(0.94921875), // sin(51*(π/128)) - Q_8_8(0.953125), // sin(52*(π/128)) - Q_8_8(0.9609375), // sin(53*(π/128)) - Q_8_8(0.96875), // sin(54*(π/128)) - Q_8_8(0.97265625), // sin(55*(π/128)) - Q_8_8(0.98046875), // sin(56*(π/128)) - Q_8_8(0.984375), // sin(57*(π/128)) - Q_8_8(0.98828125), // sin(58*(π/128)) - Q_8_8(0.9921875), // sin(59*(π/128)) - Q_8_8(0.9921875), // sin(60*(π/128)) - Q_8_8(0.99609375), // sin(61*(π/128)) - Q_8_8(0.99609375), // sin(62*(π/128)) - Q_8_8(0.99609375), // sin(63*(π/128)) - Q_8_8(1), // sin(64*(π/128)) - Q_8_8(0.99609375), // sin(65*(π/128)) - Q_8_8(0.99609375), // sin(66*(π/128)) - Q_8_8(0.99609375), // sin(67*(π/128)) - Q_8_8(0.9921875), // sin(68*(π/128)) - Q_8_8(0.9921875), // sin(69*(π/128)) - Q_8_8(0.98828125), // sin(70*(π/128)) - Q_8_8(0.984375), // sin(71*(π/128)) - Q_8_8(0.98046875), // sin(72*(π/128)) - Q_8_8(0.97265625), // sin(73*(π/128)) - Q_8_8(0.96875), // sin(74*(π/128)) - Q_8_8(0.9609375), // sin(75*(π/128)) - Q_8_8(0.953125), // sin(76*(π/128)) - Q_8_8(0.94921875), // sin(77*(π/128)) - Q_8_8(0.94140625), // sin(78*(π/128)) - Q_8_8(0.9296875), // sin(79*(π/128)) - Q_8_8(0.921875), // sin(80*(π/128)) - Q_8_8(0.9140625), // sin(81*(π/128)) - Q_8_8(0.90234375), // sin(82*(π/128)) - Q_8_8(0.890625), // sin(83*(π/128)) - Q_8_8(0.87890625), // sin(84*(π/128)) - Q_8_8(0.8671875), // sin(85*(π/128)) - Q_8_8(0.85546875), // sin(86*(π/128)) - Q_8_8(0.84375), // sin(87*(π/128)) - Q_8_8(0.828125), // sin(88*(π/128)) - Q_8_8(0.81640625), // sin(89*(π/128)) - Q_8_8(0.80078125), // sin(90*(π/128)) - Q_8_8(0.78515625), // sin(91*(π/128)) - Q_8_8(0.76953125), // sin(92*(π/128)) - Q_8_8(0.75390625), // sin(93*(π/128)) - Q_8_8(0.73828125), // sin(94*(π/128)) - Q_8_8(0.72265625), // sin(95*(π/128)) - Q_8_8(0.70703125), // sin(96*(π/128)) - Q_8_8(0.6875), // sin(97*(π/128)) - Q_8_8(0.66796875), // sin(98*(π/128)) - Q_8_8(0.65234375), // sin(99*(π/128)) - Q_8_8(0.6328125), // sin(100*(π/128)) - Q_8_8(0.61328125), // sin(101*(π/128)) - Q_8_8(0.59375), // sin(102*(π/128)) - Q_8_8(0.57421875), // sin(103*(π/128)) - Q_8_8(0.5546875), // sin(104*(π/128)) - Q_8_8(0.53125), // sin(105*(π/128)) - Q_8_8(0.51171875), // sin(106*(π/128)) - Q_8_8(0.4921875), // sin(107*(π/128)) - Q_8_8(0.46875), // sin(108*(π/128)) - Q_8_8(0.44921875), // sin(109*(π/128)) - Q_8_8(0.42578125), // sin(110*(π/128)) - Q_8_8(0.40234375), // sin(111*(π/128)) - Q_8_8(0.37890625), // sin(112*(π/128)) - Q_8_8(0.359375), // sin(113*(π/128)) - Q_8_8(0.3359375), // sin(114*(π/128)) - Q_8_8(0.3125), // sin(115*(π/128)) - Q_8_8(0.2890625), // sin(116*(π/128)) - Q_8_8(0.265625), // sin(117*(π/128)) - Q_8_8(0.2421875), // sin(118*(π/128)) - Q_8_8(0.21875), // sin(119*(π/128)) - Q_8_8(0.19140625), // sin(120*(π/128)) - Q_8_8(0.16796875), // sin(121*(π/128)) - Q_8_8(0.14453125), // sin(122*(π/128)) - Q_8_8(0.12109375), // sin(123*(π/128)) - Q_8_8(0.09765625), // sin(124*(π/128)) - Q_8_8(0.0703125), // sin(125*(π/128)) - Q_8_8(0.046875), // sin(126*(π/128)) - Q_8_8(0.0234375), // sin(127*(π/128)) - Q_8_8(0), // sin(128*(π/128)) - Q_8_8(-0.0234375), // sin(129*(π/128)) - Q_8_8(-0.046875), // sin(130*(π/128)) - Q_8_8(-0.0703125), // sin(131*(π/128)) - Q_8_8(-0.09765625), // sin(132*(π/128)) - Q_8_8(-0.12109375), // sin(133*(π/128)) - Q_8_8(-0.14453125), // sin(134*(π/128)) - Q_8_8(-0.16796875), // sin(135*(π/128)) - Q_8_8(-0.19140625), // sin(136*(π/128)) - Q_8_8(-0.21875), // sin(137*(π/128)) - Q_8_8(-0.2421875), // sin(138*(π/128)) - Q_8_8(-0.265625), // sin(139*(π/128)) - Q_8_8(-0.2890625), // sin(140*(π/128)) - Q_8_8(-0.3125), // sin(141*(π/128)) - Q_8_8(-0.3359375), // sin(142*(π/128)) - Q_8_8(-0.359375), // sin(143*(π/128)) - Q_8_8(-0.37890625), // sin(144*(π/128)) - Q_8_8(-0.40234375), // sin(145*(π/128)) - Q_8_8(-0.42578125), // sin(146*(π/128)) - Q_8_8(-0.44921875), // sin(147*(π/128)) - Q_8_8(-0.46875), // sin(148*(π/128)) - Q_8_8(-0.4921875), // sin(149*(π/128)) - Q_8_8(-0.51171875), // sin(150*(π/128)) - Q_8_8(-0.53125), // sin(151*(π/128)) - Q_8_8(-0.5546875), // sin(152*(π/128)) - Q_8_8(-0.57421875), // sin(153*(π/128)) - Q_8_8(-0.59375), // sin(154*(π/128)) - Q_8_8(-0.61328125), // sin(155*(π/128)) - Q_8_8(-0.6328125), // sin(156*(π/128)) - Q_8_8(-0.65234375), // sin(157*(π/128)) - Q_8_8(-0.66796875), // sin(158*(π/128)) - Q_8_8(-0.6875), // sin(159*(π/128)) - Q_8_8(-0.70703125), // sin(160*(π/128)) - Q_8_8(-0.72265625), // sin(161*(π/128)) - Q_8_8(-0.73828125), // sin(162*(π/128)) - Q_8_8(-0.75390625), // sin(163*(π/128)) - Q_8_8(-0.76953125), // sin(164*(π/128)) - Q_8_8(-0.78515625), // sin(165*(π/128)) - Q_8_8(-0.80078125), // sin(166*(π/128)) - Q_8_8(-0.81640625), // sin(167*(π/128)) - Q_8_8(-0.828125), // sin(168*(π/128)) - Q_8_8(-0.84375), // sin(169*(π/128)) - Q_8_8(-0.85546875), // sin(170*(π/128)) - Q_8_8(-0.8671875), // sin(171*(π/128)) - Q_8_8(-0.87890625), // sin(172*(π/128)) - Q_8_8(-0.890625), // sin(173*(π/128)) - Q_8_8(-0.90234375), // sin(174*(π/128)) - Q_8_8(-0.9140625), // sin(175*(π/128)) - Q_8_8(-0.921875), // sin(176*(π/128)) - Q_8_8(-0.9296875), // sin(177*(π/128)) - Q_8_8(-0.94140625), // sin(178*(π/128)) - Q_8_8(-0.94921875), // sin(179*(π/128)) - Q_8_8(-0.953125), // sin(180*(π/128)) - Q_8_8(-0.9609375), // sin(181*(π/128)) - Q_8_8(-0.96875), // sin(182*(π/128)) - Q_8_8(-0.97265625), // sin(183*(π/128)) - Q_8_8(-0.98046875), // sin(184*(π/128)) - Q_8_8(-0.984375), // sin(185*(π/128)) - Q_8_8(-0.98828125), // sin(186*(π/128)) - Q_8_8(-0.9921875), // sin(187*(π/128)) - Q_8_8(-0.9921875), // sin(188*(π/128)) - Q_8_8(-0.99609375), // sin(189*(π/128)) - Q_8_8(-0.99609375), // sin(190*(π/128)) - Q_8_8(-0.99609375), // sin(191*(π/128)) - Q_8_8(-1), // sin(192*(π/128)) - Q_8_8(-0.99609375), // sin(193*(π/128)) - Q_8_8(-0.99609375), // sin(194*(π/128)) - Q_8_8(-0.99609375), // sin(195*(π/128)) - Q_8_8(-0.9921875), // sin(196*(π/128)) - Q_8_8(-0.9921875), // sin(197*(π/128)) - Q_8_8(-0.98828125), // sin(198*(π/128)) - Q_8_8(-0.984375), // sin(199*(π/128)) - Q_8_8(-0.98046875), // sin(200*(π/128)) - Q_8_8(-0.97265625), // sin(201*(π/128)) - Q_8_8(-0.96875), // sin(202*(π/128)) - Q_8_8(-0.9609375), // sin(203*(π/128)) - Q_8_8(-0.953125), // sin(204*(π/128)) - Q_8_8(-0.94921875), // sin(205*(π/128)) - Q_8_8(-0.94140625), // sin(206*(π/128)) - Q_8_8(-0.9296875), // sin(207*(π/128)) - Q_8_8(-0.921875), // sin(208*(π/128)) - Q_8_8(-0.9140625), // sin(209*(π/128)) - Q_8_8(-0.90234375), // sin(210*(π/128)) - Q_8_8(-0.890625), // sin(211*(π/128)) - Q_8_8(-0.87890625), // sin(212*(π/128)) - Q_8_8(-0.8671875), // sin(213*(π/128)) - Q_8_8(-0.85546875), // sin(214*(π/128)) - Q_8_8(-0.84375), // sin(215*(π/128)) - Q_8_8(-0.828125), // sin(216*(π/128)) - Q_8_8(-0.81640625), // sin(217*(π/128)) - Q_8_8(-0.80078125), // sin(218*(π/128)) - Q_8_8(-0.78515625), // sin(219*(π/128)) - Q_8_8(-0.76953125), // sin(220*(π/128)) - Q_8_8(-0.75390625), // sin(221*(π/128)) - Q_8_8(-0.73828125), // sin(222*(π/128)) - Q_8_8(-0.72265625), // sin(223*(π/128)) - Q_8_8(-0.70703125), // sin(224*(π/128)) - Q_8_8(-0.6875), // sin(225*(π/128)) - Q_8_8(-0.66796875), // sin(226*(π/128)) - Q_8_8(-0.65234375), // sin(227*(π/128)) - Q_8_8(-0.6328125), // sin(228*(π/128)) - Q_8_8(-0.61328125), // sin(229*(π/128)) - Q_8_8(-0.59375), // sin(230*(π/128)) - Q_8_8(-0.57421875), // sin(231*(π/128)) - Q_8_8(-0.5546875), // sin(232*(π/128)) - Q_8_8(-0.53125), // sin(233*(π/128)) - Q_8_8(-0.51171875), // sin(234*(π/128)) - Q_8_8(-0.4921875), // sin(235*(π/128)) - Q_8_8(-0.46875), // sin(236*(π/128)) - Q_8_8(-0.44921875), // sin(237*(π/128)) - Q_8_8(-0.42578125), // sin(238*(π/128)) - Q_8_8(-0.40234375), // sin(239*(π/128)) - Q_8_8(-0.37890625), // sin(240*(π/128)) - Q_8_8(-0.359375), // sin(241*(π/128)) - Q_8_8(-0.3359375), // sin(242*(π/128)) - Q_8_8(-0.3125), // sin(243*(π/128)) - Q_8_8(-0.2890625), // sin(244*(π/128)) - Q_8_8(-0.265625), // sin(245*(π/128)) - Q_8_8(-0.2421875), // sin(246*(π/128)) - Q_8_8(-0.21875), // sin(247*(π/128)) - Q_8_8(-0.19140625), // sin(248*(π/128)) - Q_8_8(-0.16796875), // sin(249*(π/128)) - Q_8_8(-0.14453125), // sin(250*(π/128)) - Q_8_8(-0.12109375), // sin(251*(π/128)) - Q_8_8(-0.09765625), // sin(252*(π/128)) - Q_8_8(-0.0703125), // sin(253*(π/128)) - Q_8_8(-0.046875), // sin(254*(π/128)) - Q_8_8(-0.0234375), // sin(255*(π/128)) - Q_8_8(0), // sin(256*(π/128)) - Q_8_8(0.0234375), // sin(257*(π/128)) - Q_8_8(0.046875), // sin(258*(π/128)) - Q_8_8(0.0703125), // sin(259*(π/128)) - Q_8_8(0.09765625), // sin(260*(π/128)) - Q_8_8(0.12109375), // sin(261*(π/128)) - Q_8_8(0.14453125), // sin(262*(π/128)) - Q_8_8(0.16796875), // sin(263*(π/128)) - Q_8_8(0.19140625), // sin(264*(π/128)) - Q_8_8(0.21875), // sin(265*(π/128)) - Q_8_8(0.2421875), // sin(266*(π/128)) - Q_8_8(0.265625), // sin(267*(π/128)) - Q_8_8(0.2890625), // sin(268*(π/128)) - Q_8_8(0.3125), // sin(269*(π/128)) - Q_8_8(0.3359375), // sin(270*(π/128)) - Q_8_8(0.359375), // sin(271*(π/128)) - Q_8_8(0.37890625), // sin(272*(π/128)) - Q_8_8(0.40234375), // sin(273*(π/128)) - Q_8_8(0.42578125), // sin(274*(π/128)) - Q_8_8(0.44921875), // sin(275*(π/128)) - Q_8_8(0.46875), // sin(276*(π/128)) - Q_8_8(0.4921875), // sin(277*(π/128)) - Q_8_8(0.51171875), // sin(278*(π/128)) - Q_8_8(0.53125), // sin(279*(π/128)) - Q_8_8(0.5546875), // sin(280*(π/128)) - Q_8_8(0.57421875), // sin(281*(π/128)) - Q_8_8(0.59375), // sin(282*(π/128)) - Q_8_8(0.61328125), // sin(283*(π/128)) - Q_8_8(0.6328125), // sin(284*(π/128)) - Q_8_8(0.65234375), // sin(285*(π/128)) - Q_8_8(0.66796875), // sin(286*(π/128)) - Q_8_8(0.6875), // sin(287*(π/128)) - Q_8_8(0.70703125), // sin(288*(π/128)) - Q_8_8(0.72265625), // sin(289*(π/128)) - Q_8_8(0.73828125), // sin(290*(π/128)) - Q_8_8(0.75390625), // sin(291*(π/128)) - Q_8_8(0.76953125), // sin(292*(π/128)) - Q_8_8(0.78515625), // sin(293*(π/128)) - Q_8_8(0.80078125), // sin(294*(π/128)) - Q_8_8(0.81640625), // sin(295*(π/128)) - Q_8_8(0.828125), // sin(296*(π/128)) - Q_8_8(0.84375), // sin(297*(π/128)) - Q_8_8(0.85546875), // sin(298*(π/128)) - Q_8_8(0.8671875), // sin(299*(π/128)) - Q_8_8(0.87890625), // sin(300*(π/128)) - Q_8_8(0.890625), // sin(301*(π/128)) - Q_8_8(0.90234375), // sin(302*(π/128)) - Q_8_8(0.9140625), // sin(303*(π/128)) - Q_8_8(0.921875), // sin(304*(π/128)) - Q_8_8(0.9296875), // sin(305*(π/128)) - Q_8_8(0.94140625), // sin(306*(π/128)) - Q_8_8(0.94921875), // sin(307*(π/128)) - Q_8_8(0.953125), // sin(308*(π/128)) - Q_8_8(0.9609375), // sin(309*(π/128)) - Q_8_8(0.96875), // sin(310*(π/128)) - Q_8_8(0.97265625), // sin(311*(π/128)) - Q_8_8(0.98046875), // sin(312*(π/128)) - Q_8_8(0.984375), // sin(313*(π/128)) - Q_8_8(0.98828125), // sin(314*(π/128)) - Q_8_8(0.9921875), // sin(315*(π/128)) - Q_8_8(0.9921875), // sin(316*(π/128)) - Q_8_8(0.99609375), // sin(317*(π/128)) - Q_8_8(0.99609375), // sin(318*(π/128)) - Q_8_8(0.99609375), // sin(319*(π/128)) -}; - -// values of sin(x) as Q4.12 fixed-point numbers from x = 0° to x = 179° -const s16 gSineDegreeTable[] = -{ - Q_4_12(0), // sin(0°) - Q_4_12(0.017333984375), // sin(1°) - Q_4_12(0.034912109375), // sin(2°) - Q_4_12(0.05224609375), // sin(3°) - Q_4_12(0.06982421875), // sin(4°) - Q_4_12(0.087158203125), // sin(5°) - Q_4_12(0.1044921875), // sin(6°) - Q_4_12(0.121826171875), // sin(7°) - Q_4_12(0.13916015625), // sin(8°) - Q_4_12(0.156494140625), // sin(9°) - Q_4_12(0.173583984375), // sin(10°) - Q_4_12(0.19091796875), // sin(11°) - Q_4_12(0.2080078125), // sin(12°) - Q_4_12(0.224853515625), // sin(13°) - Q_4_12(0.241943359375), // sin(14°) - Q_4_12(0.2587890625), // sin(15°) - Q_4_12(0.275634765625), // sin(16°) - Q_4_12(0.29248046875), // sin(17°) - Q_4_12(0.30908203125), // sin(18°) - Q_4_12(0.32568359375), // sin(19°) - Q_4_12(0.342041015625), // sin(20°) - Q_4_12(0.3583984375), // sin(21°) - Q_4_12(0.37451171875), // sin(22°) - Q_4_12(0.390625), // sin(23°) - Q_4_12(0.40673828125), // sin(24°) - Q_4_12(0.422607421875), // sin(25°) - Q_4_12(0.4384765625), // sin(26°) - Q_4_12(0.4541015625), // sin(27°) - Q_4_12(0.469482421875), // sin(28°) - Q_4_12(0.48486328125), // sin(29°) - Q_4_12(0.5), // sin(30°) - Q_4_12(0.51513671875), // sin(31°) - Q_4_12(0.530029296875), // sin(32°) - Q_4_12(0.544677734375), // sin(33°) - Q_4_12(0.55908203125), // sin(34°) - Q_4_12(0.573486328125), // sin(35°) - Q_4_12(0.587890625), // sin(36°) - Q_4_12(0.601806640625), // sin(37°) - Q_4_12(0.61572265625), // sin(38°) - Q_4_12(0.62939453125), // sin(39°) - Q_4_12(0.642822265625), // sin(40°) - Q_4_12(0.656005859375), // sin(41°) - Q_4_12(0.669189453125), // sin(42°) - Q_4_12(0.681884765625), // sin(43°) - Q_4_12(0.694580078125), // sin(44°) - Q_4_12(0.70703125), // sin(45°) - Q_4_12(0.71923828125), // sin(46°) - Q_4_12(0.7314453125), // sin(47°) - Q_4_12(0.7431640625), // sin(48°) - Q_4_12(0.754638671875), // sin(49°) - Q_4_12(0.76611328125), // sin(50°) - Q_4_12(0.777099609375), // sin(51°) - Q_4_12(0.7880859375), // sin(52°) - Q_4_12(0.798583984375), // sin(53°) - Q_4_12(0.80908203125), // sin(54°) - Q_4_12(0.819091796875), // sin(55°) - Q_4_12(0.8291015625), // sin(56°) - Q_4_12(0.838623046875), // sin(57°) - Q_4_12(0.84814453125), // sin(58°) - Q_4_12(0.857177734375), // sin(59°) - Q_4_12(0.865966796875), // sin(60°) - Q_4_12(0.87451171875), // sin(61°) - Q_4_12(0.883056640625), // sin(62°) - Q_4_12(0.89111328125), // sin(63°) - Q_4_12(0.898681640625), // sin(64°) - Q_4_12(0.90625), // sin(65°) - Q_4_12(0.91357421875), // sin(66°) - Q_4_12(0.92041015625), // sin(67°) - Q_4_12(0.92724609375), // sin(68°) - Q_4_12(0.93359375), // sin(69°) - Q_4_12(0.939697265625), // sin(70°) - Q_4_12(0.945556640625), // sin(71°) - Q_4_12(0.951171875), // sin(72°) - Q_4_12(0.956298828125), // sin(73°) - Q_4_12(0.961181640625), // sin(74°) - Q_4_12(0.9658203125), // sin(75°) - Q_4_12(0.97021484375), // sin(76°) - Q_4_12(0.974365234375), // sin(77°) - Q_4_12(0.97802734375), // sin(78°) - Q_4_12(0.981689453125), // sin(79°) - Q_4_12(0.98486328125), // sin(80°) - Q_4_12(0.98779296875), // sin(81°) - Q_4_12(0.990234375), // sin(82°) - Q_4_12(0.992431640625), // sin(83°) - Q_4_12(0.994384765625), // sin(84°) - Q_4_12(0.99609375), // sin(85°) - Q_4_12(0.99755859375), // sin(86°) - Q_4_12(0.99853515625), // sin(87°) - Q_4_12(0.999267578125), // sin(88°) - Q_4_12(0.999755859375), // sin(89°) - Q_4_12(1), // sin(90°) - Q_4_12(0.999755859375), // sin(91°) - Q_4_12(0.999267578125), // sin(92°) - Q_4_12(0.99853515625), // sin(93°) - Q_4_12(0.99755859375), // sin(94°) - Q_4_12(0.99609375), // sin(95°) - Q_4_12(0.994384765625), // sin(96°) - Q_4_12(0.992431640625), // sin(97°) - Q_4_12(0.990234375), // sin(98°) - Q_4_12(0.98779296875), // sin(99°) - Q_4_12(0.98486328125), // sin(100°) - Q_4_12(0.981689453125), // sin(101°) - Q_4_12(0.97802734375), // sin(102°) - Q_4_12(0.974365234375), // sin(103°) - Q_4_12(0.97021484375), // sin(104°) - Q_4_12(0.9658203125), // sin(105°) - Q_4_12(0.961181640625), // sin(106°) - Q_4_12(0.956298828125), // sin(107°) - Q_4_12(0.951171875), // sin(108°) - Q_4_12(0.945556640625), // sin(109°) - Q_4_12(0.939697265625), // sin(110°) - Q_4_12(0.93359375), // sin(111°) - Q_4_12(0.92724609375), // sin(112°) - Q_4_12(0.92041015625), // sin(113°) - Q_4_12(0.91357421875), // sin(114°) - Q_4_12(0.90625), // sin(115°) - Q_4_12(0.898681640625), // sin(116°) - Q_4_12(0.89111328125), // sin(117°) - Q_4_12(0.883056640625), // sin(118°) - Q_4_12(0.87451171875), // sin(119°) - Q_4_12(0.865966796875), // sin(120°) - Q_4_12(0.857177734375), // sin(121°) - Q_4_12(0.84814453125), // sin(122°) - Q_4_12(0.838623046875), // sin(123°) - Q_4_12(0.8291015625), // sin(124°) - Q_4_12(0.819091796875), // sin(125°) - Q_4_12(0.80908203125), // sin(126°) - Q_4_12(0.798583984375), // sin(127°) - Q_4_12(0.7880859375), // sin(128°) - Q_4_12(0.777099609375), // sin(129°) - Q_4_12(0.76611328125), // sin(130°) - Q_4_12(0.754638671875), // sin(131°) - Q_4_12(0.7431640625), // sin(132°) - Q_4_12(0.7314453125), // sin(133°) - Q_4_12(0.71923828125), // sin(134°) - Q_4_12(0.70703125), // sin(135°) - Q_4_12(0.694580078125), // sin(136°) - Q_4_12(0.681884765625), // sin(137°) - Q_4_12(0.669189453125), // sin(138°) - Q_4_12(0.656005859375), // sin(139°) - Q_4_12(0.642822265625), // sin(140°) - Q_4_12(0.62939453125), // sin(141°) - Q_4_12(0.61572265625), // sin(142°) - Q_4_12(0.601806640625), // sin(143°) - Q_4_12(0.587890625), // sin(144°) - Q_4_12(0.573486328125), // sin(145°) - Q_4_12(0.55908203125), // sin(146°) - Q_4_12(0.544677734375), // sin(147°) - Q_4_12(0.530029296875), // sin(148°) - Q_4_12(0.51513671875), // sin(149°) - Q_4_12(0.5), // sin(150°) - Q_4_12(0.48486328125), // sin(151°) - Q_4_12(0.469482421875), // sin(152°) - Q_4_12(0.4541015625), // sin(153°) - Q_4_12(0.4384765625), // sin(154°) - Q_4_12(0.422607421875), // sin(155°) - Q_4_12(0.40673828125), // sin(156°) - Q_4_12(0.390625), // sin(157°) - Q_4_12(0.37451171875), // sin(158°) - Q_4_12(0.3583984375), // sin(159°) - Q_4_12(0.342041015625), // sin(160°) - Q_4_12(0.32568359375), // sin(161°) - Q_4_12(0.30908203125), // sin(162°) - Q_4_12(0.29248046875), // sin(163°) - Q_4_12(0.275634765625), // sin(164°) - Q_4_12(0.2587890625), // sin(165°) - Q_4_12(0.241943359375), // sin(166°) - Q_4_12(0.224853515625), // sin(167°) - Q_4_12(0.2080078125), // sin(168°) - Q_4_12(0.19091796875), // sin(169°) - Q_4_12(0.173583984375), // sin(170°) - Q_4_12(0.156494140625), // sin(171°) - Q_4_12(0.13916015625), // sin(172°) - Q_4_12(0.121826171875), // sin(173°) - Q_4_12(0.1044921875), // sin(174°) - Q_4_12(0.087158203125), // sin(175°) - Q_4_12(0.06982421875), // sin(176°) - Q_4_12(0.05224609375), // sin(177°) - Q_4_12(0.034912109375), // sin(178°) - Q_4_12(0.017333984375), // sin(179°) -}; - -// amplitude * sin(index*(π/128)) -s16 Sin(s16 index, s16 amplitude) -{ - return (amplitude * gSineTable[index]) >> 8; -} - -// amplitude * cos(index*(π/128)) -s16 Cos(s16 index, s16 amplitude) -{ - return (amplitude * gSineTable[index + 64]) >> 8; -} - -// angle in degrees -s16 Sin2(u16 angle) -{ - s32 angleMod = angle % 180; - s32 negate = ((angle / 180) & 1); - s16 value = gSineDegreeTable[angleMod]; - - if (negate) - return -value; - else - return value; -} - -// angle in degrees -s16 Cos2(u16 angle) -{ - return Sin2(angle + 90); -} diff --git a/src/engine/util.c b/src/engine/util.c deleted file mode 100644 index 582b9f806..000000000 --- a/src/engine/util.c +++ /dev/null @@ -1,525 +0,0 @@ -#include "global.h" -#include "util.h" - -const u32 gBitTable[] = -{ - 1 << 0, - 1 << 1, - 1 << 2, - 1 << 3, - 1 << 4, - 1 << 5, - 1 << 6, - 1 << 7, - 1 << 8, - 1 << 9, - 1 << 10, - 1 << 11, - 1 << 12, - 1 << 13, - 1 << 14, - 1 << 15, - 1 << 16, - 1 << 17, - 1 << 18, - 1 << 19, - 1 << 20, - 1 << 21, - 1 << 22, - 1 << 23, - 1 << 24, - 1 << 25, - 1 << 26, - 1 << 27, - 1 << 28, - 1 << 29, - 1 << 30, - 1 << 31, -}; - -static const struct SpriteTemplate gInvisibleSpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const u8 gSpriteDimensions[3][4][2] = -{ - // square - { - {1, 1}, - {2, 2}, - {4, 4}, - {8, 8}, - }, - - // horizontal rectangle - { - {2, 1}, - {4, 1}, - {4, 2}, - {8, 4}, - }, - - // vertical rectangle - { - {1, 2}, - {1, 4}, - {2, 4}, - {4, 8}, - }, -}; - -static const u16 gCrc16Table[] = -{ - 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, - 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, - 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, - 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, - 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, - 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, - 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, - 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, - 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, - 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, - 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, - 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, - 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, - 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, - 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, - 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, - 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, - 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, - 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, - 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, - 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, - 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, - 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, - 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, - 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, - 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB, - 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, - 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, - 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, - 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, - 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, - 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78, -}; - -const u8 gMiscBlank_Gfx[] = INCBIN_U8("graphics/interface/blank.4bpp"); - - -u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *)) -{ - u8 sprite = CreateSprite(&gInvisibleSpriteTemplate, 248, 168, 14); - gSprites[sprite].invisible = TRUE; - gSprites[sprite].callback = callback; - return sprite; -} - -void StoreWordInTwoHalfwords(u16 *h, u32 w) -{ - h[0] = (u16)(w); - h[1] = (u16)(w >> 16); -} - -void LoadWordFromTwoHalfwords(u16 *h, u32 *w) -{ - *w = h[0] | (s16)h[1] << 16; -} - -void SetBgAffineStruct(struct BgAffineSrcData *src, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) -{ - src->texX = texX; - src->texY = texY; - src->scrX = scrX; - src->scrY = scrY; - src->sx = sx; - src->sy = sy; - src->alpha = alpha; -} - -void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) -{ - struct BgAffineSrcData src; - - SetBgAffineStruct(&src, texX, texY, scrX, scrY, sx, sy, alpha); - BgAffineSet(&src, dest, 1); -} - -#ifdef NONMATCHING - -// Functionally equivalent. -// Only the two yflip loops don't match. -void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) -{ - u8 x, y; - s8 i, j; - u8 xflip[32]; - u8 h = gSpriteDimensions[shape][size][1]; - u8 w = gSpriteDimensions[shape][size][0]; - - for (y = 0; y < h; y++) - { - int filler = 32 - w; - - for (x = 0; x < w; x++) - { - int tile = (*tilemap & 0x3ff) * 32; - int attr = *tilemap & 0xc00; - - if (attr == 0) - { - void *src = tiles + tile; - void *dest = output; - int length = 32; - DmaCopy32(3, src, dest, length); - } - else if (attr == 0x800) // yflip - { - for (i = 0; i < 8; i++) - { - void *src = tiles; - void *dest = output; - int length = 4; - // this is likely wrong, but makes it closer to matching - src += tile + (7 - i) * 4; - dest += i * 4; - DmaCopy32(3, src, dest, length); - } - } - else // xflip - { - for (i = 0; i < 8; i++) - { - for (j = 0; j < 4; j++) - { - u8 i2 = i * 4; - xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4; - xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4; - } - } - if (*tilemap & 0x800) // yflip - { - for (i = 0; i < 8; i++) - { - void *src = xflip + (7-i) * 4; - void *dest = output + i*4; - int length = 4; - DmaCopy32(3, src, dest, length); - } - } - else - { - void *src = xflip; - void *dest = output; - int length = 32; - DmaCopy32(3, src, dest, length); - } - } - tilemap++; - output += 32; - } - tilemap += filler; - } -} - -#else - -__attribute__((naked)) void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) -{ - asm("\n" - " .syntax unified\n" - " push {r4-r7,lr}\n" - " mov r7, r10\n" - " mov r6, r9\n" - " mov r5, r8\n" - " push {r5-r7}\n" - " sub sp, 0x3C\n" - " str r2, [sp, 0x20]\n" - " adds r4, r3, 0\n" - " ldr r7, [sp, 0x5C]\n" - " lsls r0, 24\n" - " lsls r1, 24\n" - " ldr r2, _08041008 @ =gSpriteDimensions\n" - " lsrs r1, 23\n" - " lsrs r0, 21\n" - " adds r1, r0\n" - " adds r0, r2, 0x1\n" - " adds r0, r1, r0\n" - " ldrb r0, [r0]\n" - " str r0, [sp, 0x24]\n" - " adds r1, r2\n" - " ldrb r1, [r1]\n" - " str r1, [sp, 0x28]\n" - " movs r1, 0\n" - " cmp r1, r0\n" - " bcc _08040FB4\n" - " b _08041136\n" - "_08040FB4:\n" - " movs r0, 0x20\n" - " ldr r2, [sp, 0x28]\n" - " subs r0, r2\n" - " lsls r0, 1\n" - " str r0, [sp, 0x2C]\n" - "_08040FBE:\n" - " movs r2, 0\n" - " adds r1, 0x1\n" - " str r1, [sp, 0x34]\n" - " ldr r3, [sp, 0x28]\n" - " cmp r2, r3\n" - " bcc _08040FCC\n" - " b _08041124\n" - "_08040FCC:\n" - " ldr r0, _0804100C @ =0x040000d4\n" - " mov r8, r0\n" - "_08040FD0:\n" - " ldrh r1, [r4]\n" - " ldr r0, _08041010 @ =0x000003ff\n" - " ands r0, r1\n" - " lsls r0, 5\n" - " mov r12, r0\n" - " movs r0, 0xC0\n" - " lsls r0, 4\n" - " ands r0, r1\n" - " mov r3, sp\n" - " strh r1, [r3, 0x38]\n" - " cmp r0, 0\n" - " bne _08041018\n" - " ldr r0, [sp, 0x20]\n" - " add r0, r12\n" - " mov r1, r8\n" - " str r0, [r1]\n" - " str r7, [r1, 0x4]\n" - " ldr r3, _08041014 @ =0x84000008\n" - " str r3, [r1, 0x8]\n" - " ldr r0, [r1, 0x8]\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " adds r7, 0x20\n" - " mov r10, r7\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - " b _08041112\n" - " .align 2, 0\n" - "_08041008: .4byte gSpriteDimensions\n" - "_0804100C: .4byte 0x040000d4\n" - "_08041010: .4byte 0x000003ff\n" - "_08041014: .4byte 0x84000008\n" - "_08041018:\n" - " movs r1, 0x80\n" - " lsls r1, 4\n" - " cmp r0, r1\n" - " bne _08041068\n" - " movs r3, 0\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " movs r0, 0x20\n" - " adds r0, r7\n" - " mov r10, r0\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - " ldr r4, _08041060 @ =0x040000d4\n" - " ldr r6, _08041064 @ =0x84000001\n" - " movs r5, 0x7\n" - "_08041036:\n" - " lsls r2, r3, 24\n" - " asrs r2, 24\n" - " subs r0, r5, r2\n" - " lsls r0, 2\n" - " add r0, r12\n" - " ldr r1, [sp, 0x20]\n" - " adds r0, r1, r0\n" - " lsls r1, r2, 2\n" - " adds r1, r7, r1\n" - " str r0, [r4]\n" - " str r1, [r4, 0x4]\n" - " str r6, [r4, 0x8]\n" - " ldr r0, [r4, 0x8]\n" - " adds r2, 0x1\n" - " lsls r2, 24\n" - " lsrs r3, r2, 24\n" - " asrs r2, 24\n" - " cmp r2, 0x7\n" - " ble _08041036\n" - " b _08041112\n" - " .align 2, 0\n" - "_08041060: .4byte 0x040000d4\n" - "_08041064: .4byte 0x84000001\n" - "_08041068:\n" - " movs r3, 0\n" - " adds r4, 0x2\n" - " str r4, [sp, 0x30]\n" - " movs r0, 0x20\n" - " adds r0, r7\n" - " mov r10, r0\n" - " adds r2, 0x1\n" - " mov r9, r2\n" - "_08041078:\n" - " movs r2, 0\n" - " lsls r4, r3, 24\n" - " lsls r0, r4, 2\n" - " lsrs r0, 24\n" - " adds r6, r0, 0x3\n" - " mov r1, r12\n" - " adds r5, r1, r0\n" - "_08041086:\n" - " lsls r1, r2, 24\n" - " asrs r1, 24\n" - " subs r0, r6, r1\n" - " mov r2, sp\n" - " adds r3, r2, r0\n" - " adds r0, r5, r1\n" - " ldr r2, [sp, 0x20]\n" - " adds r0, r2, r0\n" - " ldrb r2, [r0]\n" - " movs r0, 0xF\n" - " ands r0, r2\n" - " lsls r0, 4\n" - " lsrs r2, 4\n" - " orrs r0, r2\n" - " strb r0, [r3]\n" - " adds r1, 0x1\n" - " lsls r1, 24\n" - " lsrs r2, r1, 24\n" - " asrs r1, 24\n" - " cmp r1, 0x3\n" - " ble _08041086\n" - " movs r3, 0x80\n" - " lsls r3, 17\n" - " adds r0, r4, r3\n" - " lsrs r3, r0, 24\n" - " asrs r0, 24\n" - " cmp r0, 0x7\n" - " ble _08041078\n" - " movs r0, 0x80\n" - " lsls r0, 4\n" - " mov r1, sp\n" - " ldrh r1, [r1, 0x38]\n" - " ands r0, r1\n" - " cmp r0, 0\n" - " beq _08041104\n" - " movs r3, 0\n" - " ldr r4, _080410FC @ =0x040000d4\n" - " ldr r6, _08041100 @ =0x84000001\n" - " movs r5, 0x7\n" - "_080410D4:\n" - " lsls r1, r3, 24\n" - " asrs r1, 24\n" - " subs r0, r5, r1\n" - " lsls r0, 2\n" - " mov r3, sp\n" - " adds r2, r3, r0\n" - " lsls r0, r1, 2\n" - " adds r0, r7, r0\n" - " str r2, [r4]\n" - " str r0, [r4, 0x4]\n" - " str r6, [r4, 0x8]\n" - " ldr r0, [r4, 0x8]\n" - " adds r1, 0x1\n" - " lsls r1, 24\n" - " lsrs r3, r1, 24\n" - " asrs r1, 24\n" - " cmp r1, 0x7\n" - " ble _080410D4\n" - " b _08041112\n" - " .align 2, 0\n" - "_080410FC: .4byte 0x040000d4\n" - "_08041100: .4byte 0x84000001\n" - "_08041104:\n" - " mov r0, sp\n" - " mov r1, r8\n" - " str r0, [r1]\n" - " str r7, [r1, 0x4]\n" - " ldr r2, _08041148 @ =0x84000008\n" - " str r2, [r1, 0x8]\n" - " ldr r0, [r1, 0x8]\n" - "_08041112:\n" - " ldr r4, [sp, 0x30]\n" - " mov r7, r10\n" - " mov r3, r9\n" - " lsls r0, r3, 24\n" - " lsrs r2, r0, 24\n" - " ldr r0, [sp, 0x28]\n" - " cmp r2, r0\n" - " bcs _08041124\n" - " b _08040FD0\n" - "_08041124:\n" - " ldr r1, [sp, 0x2C]\n" - " adds r4, r1\n" - " ldr r2, [sp, 0x34]\n" - " lsls r0, r2, 24\n" - " lsrs r1, r0, 24\n" - " ldr r3, [sp, 0x24]\n" - " cmp r1, r3\n" - " bcs _08041136\n" - " b _08040FBE\n" - "_08041136:\n" - " add sp, 0x3C\n" - " pop {r3-r5}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " mov r10, r5\n" - " pop {r4-r7}\n" - " pop {r0}\n" - " bx r0\n" - " .align 2, 0\n" - "_08041148: .4byte 0x84000008\n" - " .syntax divided\n" - ); -} - -#endif - -int CountTrailingZeroBits(u32 value) -{ - u8 i; - - for (i = 0; i < 32; i++) - { - if ((value & 1) == 0) - value >>= 1; - else - return i; - } - return 0; -} - -u16 CalcCRC16(u8 *data, int length) -{ - u16 i, j; - u16 crc = 0x1121; - - for (i = 0; i < length; i++) - { - crc ^= data[i]; - for (j = 0; j < 8; j++) - { - if (crc & 1) - crc = (crc >> 1) ^ 0x8408; - else - crc >>= 1; - } - } - return ~crc; -} - -u16 CalcCRC16WithTable(u8 *data, int length) -{ - u16 i; - u16 crc = 0x1121; - u8 byte; - - for (i = 0; i < length; i++) - { - byte = crc >> 8; - crc ^= data[i]; - crc = byte ^ gCrc16Table[(u8)crc]; - } - return ~crc; -} diff --git a/src/event_data.c b/src/event_data.c new file mode 100644 index 000000000..9d6d2372b --- /dev/null +++ b/src/event_data.c @@ -0,0 +1,182 @@ +#include "global.h" +#include "event_data.h" +#include "pokedex.h" + +#define TEMP_FLAGS_SIZE 0x4 +#define DAILY_FLAGS_SIZE 0x8 +#define TEMP_VARS_SIZE 0x20 + +EWRAM_DATA u16 gSpecialVar_0x8000 = 0; +EWRAM_DATA u16 gSpecialVar_0x8001 = 0; +EWRAM_DATA u16 gSpecialVar_0x8002 = 0; +EWRAM_DATA u16 gSpecialVar_0x8003 = 0; +EWRAM_DATA u16 gSpecialVar_0x8004 = 0; +EWRAM_DATA u16 gSpecialVar_0x8005 = 0; +EWRAM_DATA u16 gSpecialVar_0x8006 = 0; +EWRAM_DATA u16 gSpecialVar_0x8007 = 0; +EWRAM_DATA u16 gSpecialVar_0x8008 = 0; +EWRAM_DATA u16 gSpecialVar_0x8009 = 0; +EWRAM_DATA u16 gSpecialVar_0x800A = 0; +EWRAM_DATA u16 gSpecialVar_0x800B = 0; +EWRAM_DATA u16 gSpecialVar_Result = 0; +EWRAM_DATA u16 gSpecialVar_LastTalked = 0; +EWRAM_DATA u16 gSpecialVar_Facing = 0; +EWRAM_DATA u8 gUnknown_0202E8E2[16] = {0}; + +extern u16 *gSpecialVars[]; + +void InitEventData(void) +{ + memset(gSaveBlock1.flags, 0, sizeof(gSaveBlock1.flags)); + memset(gSaveBlock1.vars, 0, sizeof(gSaveBlock1.vars)); + memset(gUnknown_0202E8E2, 0, sizeof(gUnknown_0202E8E2)); +} + +void ClearTempFieldEventData(void) +{ + memset(gSaveBlock1.flags, 0, TEMP_FLAGS_SIZE); + memset(gSaveBlock1.vars, 0, TEMP_VARS_SIZE); + FlagClear(FLAG_SYS_ENC_UP_ITEM); + FlagClear(FLAG_SYS_ENC_DOWN_ITEM); + FlagClear(FLAG_SYS_USE_STRENGTH); + FlagClear(FLAG_SYS_CTRL_OBJ_DELETE); +} + +// probably had different flag splits at one point. +void ClearDailyFlags(void) +{ + memset(gSaveBlock1.flags + (DAILY_FLAGS_START / 8), 0, DAILY_FLAGS_SIZE); +} + +void DisableNationalPokedex(void) +{ + u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); + gSaveBlock2.pokedex.nationalMagic = 0; + *nationalDexVar = 0; + FlagClear(FLAG_SYS_NATIONAL_DEX); +} + +void EnableNationalPokedex(void) +{ + u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); + gSaveBlock2.pokedex.nationalMagic = 0xDA; + *nationalDexVar = 0x302; + FlagSet(FLAG_SYS_NATIONAL_DEX); + gSaveBlock2.pokedex.unknown1 = 1; + gSaveBlock2.pokedex.order = 0; + sub_808C0A0(); +} + +bool32 IsNationalPokedexEnabled(void) +{ + if (gSaveBlock2.pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(FLAG_SYS_NATIONAL_DEX)) + return TRUE; + else + return FALSE; +} + +void DisableMysteryGift(void) +{ + FlagClear(FLAG_SYS_EXDATA_ENABLE); +} + +void EnableMysteryGift(void) +{ + FlagSet(FLAG_SYS_EXDATA_ENABLE); +} + +bool32 IsMysteryGiftEnabled(void) +{ + return FlagGet(FLAG_SYS_EXDATA_ENABLE); +} + +void DisableResetRTC(void) +{ + VarSet(VAR_RESET_RTC_ENABLE, 0); + FlagClear(FLAG_SYS_RESET_RTC_ENABLE); +} + +void EnableResetRTC(void) +{ + VarSet(VAR_RESET_RTC_ENABLE, 0x920); + FlagSet(FLAG_SYS_RESET_RTC_ENABLE); +} + +bool32 CanResetRTC(void) +{ + if (FlagGet(FLAG_SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920) + return TRUE; + else + return FALSE; +} + +u16 *GetVarPointer(u16 id) +{ + if (id < VARS_START) + return NULL; + if (id < 0x8000) + return &gSaveBlock1.vars[id - VARS_START]; + return gSpecialVars[id - 0x8000]; +} + +u16 VarGet(u16 id) +{ + u16 *ptr = GetVarPointer(id); + if (!ptr) + return id; + return *ptr; +} + +bool8 VarSet(u16 id, u16 value) +{ + u16 *ptr = GetVarPointer(id); + if (!ptr) + return FALSE; + *ptr = value; + return TRUE; +} + +u8 VarGetFieldObjectGraphicsId(u8 id) +{ + return VarGet(VAR_OBJ_GFX_ID_0 + id); +} + +u8 *GetFlagPointer(u16 id) +{ + if (id == 0) + return 0; + + if (id < 0x4000) + return &gSaveBlock1.flags[id / 8]; + + return &gUnknown_0202E8E2[(id - 0x4000) / 8]; +} + +u8 FlagSet(u16 id) +{ + u8 *ptr = GetFlagPointer(id); + if (ptr) + *ptr |= 1 << (id & 7); + return 0; +} + +u8 FlagClear(u16 id) +{ + u8 *ptr = GetFlagPointer(id); + if (ptr) + *ptr &= ~(1 << (id & 7)); + return 0; +} + +bool8 FlagGet(u16 id) +{ + u8 *ptr = GetFlagPointer(id); + + if (!ptr) + return FALSE; + + if (!(((*ptr) >> (id & 7)) & 1)) + return FALSE; + + return TRUE; +} diff --git a/src/event_object_movement.c b/src/event_object_movement.c new file mode 100644 index 000000000..155ce33f5 --- /dev/null +++ b/src/event_object_movement.c @@ -0,0 +1,9423 @@ +#include "global.h" +#include "event_object_movement.h" +#include "berry.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "palette.h" +#include "random.h" +#include "overworld.h" +#include "sprite.h" +#include "metatile_behavior.h" +#include "constants/maps.h" +#include "constants/map_objects.h" +#include "trainer_see.h" + +// this file was known as evobjmv.c in Game Freak's original source + +// rodata + +const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; + +void ObjectCB_CameraObject(struct Sprite *sprite); +const struct SpriteTemplate gSpriteTemplate_830FD24 = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; + +void CameraObject_0(struct Sprite *); +void CameraObject_1(struct Sprite *); +void CameraObject_2(struct Sprite *); +void (*const gCameraObjectFuncs[])(struct Sprite *) = { + CameraObject_0, + CameraObject_1, + CameraObject_2, +}; + +const u32 gMapObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/00.4bpp"); +const u32 gMapObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/01.4bpp"); +const u32 gMapObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/02.4bpp"); +const u32 gMapObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/03.4bpp"); +const u32 gMapObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/04.4bpp"); +const u32 gMapObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/05.4bpp"); +const u32 gMapObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/06.4bpp"); +const u32 gMapObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/07.4bpp"); +const u32 gMapObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/08.4bpp"); +const u32 gMapObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/09.4bpp"); +const u32 gMapObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/10.4bpp"); +const u32 gMapObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/11.4bpp"); +const u32 gMapObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/12.4bpp"); +const u32 gMapObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/13.4bpp"); +const u32 gMapObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/14.4bpp"); +const u32 gMapObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/15.4bpp"); +const u32 gMapObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/16.4bpp"); +const u32 gMapObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/17.4bpp"); +const u16 gMapObjectPalette8[] = INCBIN_U16("graphics/map_objects/palettes/08.gbapal"); +const u16 NullPalette_8310F68[16] = {}; +const u16 NullPalette_8310F88[16] = {}; +const u16 NullPalette_8310FA8[16] = {}; +const u16 NullPalette_8310FC8[16] = {}; +const u16 NullPalette_8310FE8[16] = {}; +const u16 NullPalette_8311008[16] = {}; +const u16 NullPalette_8311028[16] = {}; +const u16 NullPalette_8311048[16] = {}; +const u16 NullPalette_8311068[16] = {}; +const u16 NullPalette_8311088[16] = {}; +const u16 NullPalette_83110A8[16] = {}; +const u16 NullPalette_83110C8[16] = {}; +const u16 NullPalette_83110E8[16] = {}; +const u16 NullPalette_8311108[16] = {}; +const u16 NullPalette_8311128[16] = {}; +const u16 gMapObjectPalette9[] = INCBIN_U16("graphics/map_objects/palettes/09.gbapal"); +const u16 gMapObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/10.gbapal"); +const u32 gMapObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/0.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/1.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/2.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/3.4bpp"); +const u32 gMapObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/4.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/0.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/3.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/1.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/4.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/2.4bpp"); +const u32 gMapObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/5.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/0.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/1.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/2.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/3.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/4.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/5.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/6.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/7.4bpp"); +const u32 gMapObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/8.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/00.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/01.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/02.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/03.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/04.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/05.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/06.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/07.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/08.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/09.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/10.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/11.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/12.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/13.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/14.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/15.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/16.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/17.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/18.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/19.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/20.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/21.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/22.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/23.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/24.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/25.4bpp"); +const u32 gMapObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/26.4bpp"); +const u32 gMapObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/00.4bpp"); +const u32 gMapObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/01.4bpp"); +const u32 gMapObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/02.4bpp"); +const u32 gMapObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/03.4bpp"); +const u32 gMapObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/04.4bpp"); +const u32 gMapObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/05.4bpp"); +const u32 gMapObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/06.4bpp"); +const u32 gMapObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/07.4bpp"); +const u32 gMapObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/08.4bpp"); +const u32 gMapObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/09.4bpp"); +const u32 gMapObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/10.4bpp"); +const u32 gMapObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/11.4bpp"); +const u32 gMapObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/0.4bpp"); +const u32 gMapObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/3.4bpp"); +const u32 gMapObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/1.4bpp"); +const u32 gMapObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/4.4bpp"); +const u32 gMapObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/2.4bpp"); +const u32 gMapObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/5.4bpp"); +const u32 gMapObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/decorating.4bpp"); +const u32 gMapObjectPic_MayDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/may/decorating.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/0.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/1.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/2.4bpp"); +const u32 gMapObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/3.4bpp"); +const u32 gMapObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/0.4bpp"); +const u32 gMapObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/1.4bpp"); +const u32 gMapObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/2.4bpp"); +const u32 gMapObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/3.4bpp"); +const u16 gMapObjectPalette11[] = INCBIN_U16("graphics/map_objects/palettes/11.gbapal"); +const u32 gMapObjectPic_MayNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/00.4bpp"); +const u32 gMapObjectPic_MayNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/01.4bpp"); +const u32 gMapObjectPic_MayNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/02.4bpp"); +const u32 gMapObjectPic_MayNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/03.4bpp"); +const u32 gMapObjectPic_MayNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/04.4bpp"); +const u32 gMapObjectPic_MayNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/05.4bpp"); +const u32 gMapObjectPic_MayNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/06.4bpp"); +const u32 gMapObjectPic_MayNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/07.4bpp"); +const u32 gMapObjectPic_MayNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/08.4bpp"); +const u32 gMapObjectPic_MayNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/09.4bpp"); +const u32 gMapObjectPic_MayNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/10.4bpp"); +const u32 gMapObjectPic_MayNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/11.4bpp"); +const u32 gMapObjectPic_MayNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/12.4bpp"); +const u32 gMapObjectPic_MayNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/13.4bpp"); +const u32 gMapObjectPic_MayNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/14.4bpp"); +const u32 gMapObjectPic_MayNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/15.4bpp"); +const u32 gMapObjectPic_MayNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/16.4bpp"); +const u32 gMapObjectPic_MayNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/17.4bpp"); +const u16 gMapObjectPalette17[] = INCBIN_U16("graphics/map_objects/palettes/17.gbapal"); +const u16 gMapObjectPalette18[] = INCBIN_U16("graphics/map_objects/palettes/18.gbapal"); +const u16 NullPalette_831B7E8[16] = {}; +const u16 NullPalette_831B808[16] = {}; +const u16 NullPalette_831B828[16] = {}; +const u16 NullPalette_831B848[16] = {}; +const u16 NullPalette_831B868[16] = {}; +const u16 NullPalette_831B888[16] = {}; +const u16 NullPalette_831B8A8[16] = {}; +const u16 NullPalette_831B8C8[16] = {}; +const u16 NullPalette_831B8E8[16] = {}; +const u16 NullPalette_831B908[16] = {}; +const u16 NullPalette_831B928[16] = {}; +const u16 NullPalette_831B948[16] = {}; +const u16 NullPalette_831B968[16] = {}; +const u16 NullPalette_831B988[16] = {}; +const u32 gMapObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/0.4bpp"); +const u32 gMapObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/1.4bpp"); +const u32 gMapObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/2.4bpp"); +const u32 gMapObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/3.4bpp"); +const u32 gMapObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/4.4bpp"); +const u32 gMapObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/5.4bpp"); +const u32 gMapObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/6.4bpp"); +const u32 gMapObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/7.4bpp"); +const u32 gMapObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/8.4bpp"); +const u32 gMapObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/00.4bpp"); +const u32 gMapObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/01.4bpp"); +const u32 gMapObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/02.4bpp"); +const u32 gMapObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/03.4bpp"); +const u32 gMapObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/04.4bpp"); +const u32 gMapObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/05.4bpp"); +const u32 gMapObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/06.4bpp"); +const u32 gMapObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/07.4bpp"); +const u32 gMapObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/08.4bpp"); +const u32 gMapObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/09.4bpp"); +const u32 gMapObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/10.4bpp"); +const u32 gMapObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/11.4bpp"); +const u32 gMapObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/12.4bpp"); +const u32 gMapObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/13.4bpp"); +const u32 gMapObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/14.4bpp"); +const u32 gMapObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/15.4bpp"); +const u32 gMapObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/16.4bpp"); +const u32 gMapObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/17.4bpp"); +const u32 gMapObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/18.4bpp"); +const u32 gMapObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/19.4bpp"); +const u32 gMapObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/20.4bpp"); +const u32 gMapObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/21.4bpp"); +const u32 gMapObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/22.4bpp"); +const u32 gMapObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/23.4bpp"); +const u32 gMapObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/24.4bpp"); +const u32 gMapObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/25.4bpp"); +const u32 gMapObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/26.4bpp"); +const u32 gMapObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/0.4bpp"); +const u32 gMapObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/3.4bpp"); +const u32 gMapObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/1.4bpp"); +const u32 gMapObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/4.4bpp"); +const u32 gMapObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/2.4bpp"); +const u32 gMapObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/5.4bpp"); +const u32 gMapObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/0.4bpp"); +const u32 gMapObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/1.4bpp"); +const u32 gMapObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/2.4bpp"); +const u32 gMapObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/3.4bpp"); +const u32 gMapObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/4.4bpp"); +const u32 gMapObjectPic_MayFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/00.4bpp"); +const u32 gMapObjectPic_MayFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/01.4bpp"); +const u32 gMapObjectPic_MayFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/02.4bpp"); +const u32 gMapObjectPic_MayFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/03.4bpp"); +const u32 gMapObjectPic_MayFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/04.4bpp"); +const u32 gMapObjectPic_MayFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/05.4bpp"); +const u32 gMapObjectPic_MayFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/06.4bpp"); +const u32 gMapObjectPic_MayFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/07.4bpp"); +const u32 gMapObjectPic_MayFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/08.4bpp"); +const u32 gMapObjectPic_MayFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/09.4bpp"); +const u32 gMapObjectPic_MayFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/10.4bpp"); +const u32 gMapObjectPic_MayFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/11.4bpp"); +const u32 gMapObjectPic_MayWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/0.4bpp"); +const u32 gMapObjectPic_MayWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/3.4bpp"); +const u32 gMapObjectPic_MayWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/1.4bpp"); +const u32 gMapObjectPic_MayWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/4.4bpp"); +const u32 gMapObjectPic_MayWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/2.4bpp"); +const u32 gMapObjectPic_MayWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/5.4bpp"); +const u16 gMapObjectPalette0[] = INCBIN_U16("graphics/map_objects/palettes/00.gbapal"); +const u16 gMapObjectPalette1[] = INCBIN_U16("graphics/map_objects/palettes/01.gbapal"); +const u16 gMapObjectPalette2[] = INCBIN_U16("graphics/map_objects/palettes/02.gbapal"); +const u16 gMapObjectPalette3[] = INCBIN_U16("graphics/map_objects/palettes/03.gbapal"); +const u16 gMapObjectPalette4[] = INCBIN_U16("graphics/map_objects/palettes/04.gbapal"); +const u16 gMapObjectPalette5[] = INCBIN_U16("graphics/map_objects/palettes/05.gbapal"); +const u16 gMapObjectPalette6[] = INCBIN_U16("graphics/map_objects/palettes/06.gbapal"); +const u16 gMapObjectPalette7[] = INCBIN_U16("graphics/map_objects/palettes/07.gbapal"); +const u32 gMapObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/0.4bpp"); +const u32 gMapObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/1.4bpp"); +const u32 gMapObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/2.4bpp"); +const u32 gMapObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/3.4bpp"); +const u32 gMapObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/4.4bpp"); +const u32 gMapObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/5.4bpp"); +const u32 gMapObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/6.4bpp"); +const u32 gMapObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/7.4bpp"); +const u32 gMapObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/8.4bpp"); +const u32 gMapObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/0.4bpp"); +const u32 gMapObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/1.4bpp"); +const u32 gMapObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/2.4bpp"); +const u32 gMapObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/3.4bpp"); +const u32 gMapObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/4.4bpp"); +const u32 gMapObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/5.4bpp"); +const u32 gMapObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/6.4bpp"); +const u32 gMapObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/7.4bpp"); +const u32 gMapObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/8.4bpp"); +const u32 gMapObjectPic_Boy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/0.4bpp"); +const u32 gMapObjectPic_Boy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/1.4bpp"); +const u32 gMapObjectPic_Boy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/2.4bpp"); +const u32 gMapObjectPic_Boy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/3.4bpp"); +const u32 gMapObjectPic_Boy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/4.4bpp"); +const u32 gMapObjectPic_Boy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/5.4bpp"); +const u32 gMapObjectPic_Boy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/6.4bpp"); +const u32 gMapObjectPic_Boy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/7.4bpp"); +const u32 gMapObjectPic_Boy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/8.4bpp"); +const u32 gMapObjectPic_Girl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/0.4bpp"); +const u32 gMapObjectPic_Girl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/1.4bpp"); +const u32 gMapObjectPic_Girl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/2.4bpp"); +const u32 gMapObjectPic_Girl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/3.4bpp"); +const u32 gMapObjectPic_Girl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/4.4bpp"); +const u32 gMapObjectPic_Girl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/5.4bpp"); +const u32 gMapObjectPic_Girl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/6.4bpp"); +const u32 gMapObjectPic_Girl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/7.4bpp"); +const u32 gMapObjectPic_Girl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/8.4bpp"); +const u32 gMapObjectPic_Boy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/0.4bpp"); +const u32 gMapObjectPic_Boy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/1.4bpp"); +const u32 gMapObjectPic_Boy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/2.4bpp"); +const u32 gMapObjectPic_Boy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/3.4bpp"); +const u32 gMapObjectPic_Boy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/4.4bpp"); +const u32 gMapObjectPic_Boy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/5.4bpp"); +const u32 gMapObjectPic_Boy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/6.4bpp"); +const u32 gMapObjectPic_Boy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/7.4bpp"); +const u32 gMapObjectPic_Boy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/8.4bpp"); +const u32 gMapObjectPic_Girl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/0.4bpp"); +const u32 gMapObjectPic_Girl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/1.4bpp"); +const u32 gMapObjectPic_Girl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/2.4bpp"); +const u32 gMapObjectPic_Girl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/3.4bpp"); +const u32 gMapObjectPic_Girl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/4.4bpp"); +const u32 gMapObjectPic_Girl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/5.4bpp"); +const u32 gMapObjectPic_Girl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/6.4bpp"); +const u32 gMapObjectPic_Girl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/7.4bpp"); +const u32 gMapObjectPic_Girl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/8.4bpp"); +const u32 gMapObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/0.4bpp"); +const u32 gMapObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/1.4bpp"); +const u32 gMapObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/2.4bpp"); +const u32 gMapObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/3.4bpp"); +const u32 gMapObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/4.4bpp"); +const u32 gMapObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/5.4bpp"); +const u32 gMapObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/6.4bpp"); +const u32 gMapObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/7.4bpp"); +const u32 gMapObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/8.4bpp"); +const u32 gMapObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/0.4bpp"); +const u32 gMapObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/1.4bpp"); +const u32 gMapObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/2.4bpp"); +const u32 gMapObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/3.4bpp"); +const u32 gMapObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/4.4bpp"); +const u32 gMapObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/5.4bpp"); +const u32 gMapObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/6.4bpp"); +const u32 gMapObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/7.4bpp"); +const u32 gMapObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/8.4bpp"); +const u32 gMapObjectPic_Boy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/0.4bpp"); +const u32 gMapObjectPic_Boy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/1.4bpp"); +const u32 gMapObjectPic_Boy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/2.4bpp"); +const u32 gMapObjectPic_Boy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/3.4bpp"); +const u32 gMapObjectPic_Boy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/4.4bpp"); +const u32 gMapObjectPic_Boy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/5.4bpp"); +const u32 gMapObjectPic_Boy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/6.4bpp"); +const u32 gMapObjectPic_Boy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/7.4bpp"); +const u32 gMapObjectPic_Boy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/8.4bpp"); +const u32 gMapObjectPic_Girl3_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/0.4bpp"); +const u32 gMapObjectPic_Girl3_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/1.4bpp"); +const u32 gMapObjectPic_Girl3_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/2.4bpp"); +const u32 gMapObjectPic_Girl3_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/3.4bpp"); +const u32 gMapObjectPic_Girl3_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/4.4bpp"); +const u32 gMapObjectPic_Girl3_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/5.4bpp"); +const u32 gMapObjectPic_Girl3_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/6.4bpp"); +const u32 gMapObjectPic_Girl3_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/7.4bpp"); +const u32 gMapObjectPic_Girl3_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/8.4bpp"); +const u32 gMapObjectPic_Boy4_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/0.4bpp"); +const u32 gMapObjectPic_Boy4_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/1.4bpp"); +const u32 gMapObjectPic_Boy4_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/2.4bpp"); +const u32 gMapObjectPic_Boy4_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/3.4bpp"); +const u32 gMapObjectPic_Boy4_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/4.4bpp"); +const u32 gMapObjectPic_Boy4_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/5.4bpp"); +const u32 gMapObjectPic_Boy4_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/6.4bpp"); +const u32 gMapObjectPic_Boy4_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/7.4bpp"); +const u32 gMapObjectPic_Boy4_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/8.4bpp"); +const u32 gMapObjectPic_Woman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/0.4bpp"); +const u32 gMapObjectPic_Woman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/1.4bpp"); +const u32 gMapObjectPic_Woman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/2.4bpp"); +const u32 gMapObjectPic_Woman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/3.4bpp"); +const u32 gMapObjectPic_Woman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/4.4bpp"); +const u32 gMapObjectPic_Woman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/5.4bpp"); +const u32 gMapObjectPic_Woman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/6.4bpp"); +const u32 gMapObjectPic_Woman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/7.4bpp"); +const u32 gMapObjectPic_Woman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/8.4bpp"); +const u32 gMapObjectPic_FatMan_0[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/0.4bpp"); +const u32 gMapObjectPic_FatMan_1[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/1.4bpp"); +const u32 gMapObjectPic_FatMan_2[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/2.4bpp"); +const u32 gMapObjectPic_FatMan_3[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/3.4bpp"); +const u32 gMapObjectPic_FatMan_4[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/4.4bpp"); +const u32 gMapObjectPic_FatMan_5[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/5.4bpp"); +const u32 gMapObjectPic_FatMan_6[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/6.4bpp"); +const u32 gMapObjectPic_FatMan_7[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/7.4bpp"); +const u32 gMapObjectPic_FatMan_8[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/8.4bpp"); +const u32 gMapObjectPic_Woman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/0.4bpp"); +const u32 gMapObjectPic_Woman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/1.4bpp"); +const u32 gMapObjectPic_Woman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/2.4bpp"); +const u32 gMapObjectPic_Woman2_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/3.4bpp"); +const u32 gMapObjectPic_Woman2_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/4.4bpp"); +const u32 gMapObjectPic_Woman2_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/5.4bpp"); +const u32 gMapObjectPic_Woman2_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/6.4bpp"); +const u32 gMapObjectPic_Woman2_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/7.4bpp"); +const u32 gMapObjectPic_Woman2_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/8.4bpp"); +const u32 gMapObjectPic_Man1_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/0.4bpp"); +const u32 gMapObjectPic_Man1_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/1.4bpp"); +const u32 gMapObjectPic_Man1_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/2.4bpp"); +const u32 gMapObjectPic_Man1_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/3.4bpp"); +const u32 gMapObjectPic_Man1_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/4.4bpp"); +const u32 gMapObjectPic_Man1_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/5.4bpp"); +const u32 gMapObjectPic_Man1_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/6.4bpp"); +const u32 gMapObjectPic_Man1_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/7.4bpp"); +const u32 gMapObjectPic_Man1_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/8.4bpp"); +const u32 gMapObjectPic_Woman3_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/0.4bpp"); +const u32 gMapObjectPic_Woman3_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/1.4bpp"); +const u32 gMapObjectPic_Woman3_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/2.4bpp"); +const u32 gMapObjectPic_Woman3_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/3.4bpp"); +const u32 gMapObjectPic_Woman3_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/4.4bpp"); +const u32 gMapObjectPic_Woman3_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/5.4bpp"); +const u32 gMapObjectPic_Woman3_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/6.4bpp"); +const u32 gMapObjectPic_Woman3_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/7.4bpp"); +const u32 gMapObjectPic_Woman3_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/8.4bpp"); +const u32 gMapObjectPic_OldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/0.4bpp"); +const u32 gMapObjectPic_OldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/1.4bpp"); +const u32 gMapObjectPic_OldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/2.4bpp"); +const u32 gMapObjectPic_OldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/3.4bpp"); +const u32 gMapObjectPic_OldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/4.4bpp"); +const u32 gMapObjectPic_OldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/5.4bpp"); +const u32 gMapObjectPic_OldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/6.4bpp"); +const u32 gMapObjectPic_OldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/7.4bpp"); +const u32 gMapObjectPic_OldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/8.4bpp"); +const u32 gMapObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/0.4bpp"); +const u32 gMapObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/1.4bpp"); +const u32 gMapObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/2.4bpp"); +const u32 gMapObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/3.4bpp"); +const u32 gMapObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/4.4bpp"); +const u32 gMapObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/5.4bpp"); +const u32 gMapObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/6.4bpp"); +const u32 gMapObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/7.4bpp"); +const u32 gMapObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/8.4bpp"); +const u32 gMapObjectPic_Man2_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/0.4bpp"); +const u32 gMapObjectPic_Man2_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/1.4bpp"); +const u32 gMapObjectPic_Man2_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/2.4bpp"); +const u32 gMapObjectPic_Man2_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/3.4bpp"); +const u32 gMapObjectPic_Man2_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/4.4bpp"); +const u32 gMapObjectPic_Man2_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/5.4bpp"); +const u32 gMapObjectPic_Man2_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/6.4bpp"); +const u32 gMapObjectPic_Man2_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/7.4bpp"); +const u32 gMapObjectPic_Man2_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/8.4bpp"); +const u32 gMapObjectPic_Woman4_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/0.4bpp"); +const u32 gMapObjectPic_Woman4_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/1.4bpp"); +const u32 gMapObjectPic_Woman4_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/2.4bpp"); +const u32 gMapObjectPic_Woman4_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/3.4bpp"); +const u32 gMapObjectPic_Woman4_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/4.4bpp"); +const u32 gMapObjectPic_Woman4_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/5.4bpp"); +const u32 gMapObjectPic_Woman4_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/6.4bpp"); +const u32 gMapObjectPic_Woman4_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/7.4bpp"); +const u32 gMapObjectPic_Woman4_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/8.4bpp"); +const u32 gMapObjectPic_Man3_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/0.4bpp"); +const u32 gMapObjectPic_Man3_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/1.4bpp"); +const u32 gMapObjectPic_Man3_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/2.4bpp"); +const u32 gMapObjectPic_Man3_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/3.4bpp"); +const u32 gMapObjectPic_Man3_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/4.4bpp"); +const u32 gMapObjectPic_Man3_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/5.4bpp"); +const u32 gMapObjectPic_Man3_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/6.4bpp"); +const u32 gMapObjectPic_Man3_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/7.4bpp"); +const u32 gMapObjectPic_Man3_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/8.4bpp"); +const u32 gMapObjectPic_Woman5_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/0.4bpp"); +const u32 gMapObjectPic_Woman5_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/1.4bpp"); +const u32 gMapObjectPic_Woman5_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/2.4bpp"); +const u32 gMapObjectPic_Woman5_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/3.4bpp"); +const u32 gMapObjectPic_Woman5_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/4.4bpp"); +const u32 gMapObjectPic_Woman5_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/5.4bpp"); +const u32 gMapObjectPic_Woman5_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/6.4bpp"); +const u32 gMapObjectPic_Woman5_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/7.4bpp"); +const u32 gMapObjectPic_Woman5_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/8.4bpp"); +const u32 gMapObjectPic_Cook_0[] = INCBIN_U32("graphics/map_objects/pics/people/cook/0.4bpp"); +const u32 gMapObjectPic_Cook_1[] = INCBIN_U32("graphics/map_objects/pics/people/cook/1.4bpp"); +const u32 gMapObjectPic_Cook_2[] = INCBIN_U32("graphics/map_objects/pics/people/cook/2.4bpp"); +const u32 gMapObjectPic_Woman6_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/0.4bpp"); +const u32 gMapObjectPic_Woman6_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/1.4bpp"); +const u32 gMapObjectPic_Woman6_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/2.4bpp"); +const u32 gMapObjectPic_Woman6_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/3.4bpp"); +const u32 gMapObjectPic_Woman6_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/4.4bpp"); +const u32 gMapObjectPic_Woman6_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/5.4bpp"); +const u32 gMapObjectPic_Woman6_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/6.4bpp"); +const u32 gMapObjectPic_Woman6_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/7.4bpp"); +const u32 gMapObjectPic_Woman6_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/8.4bpp"); +const u32 gMapObjectPic_OldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/0.4bpp"); +const u32 gMapObjectPic_OldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/1.4bpp"); +const u32 gMapObjectPic_OldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/2.4bpp"); +const u32 gMapObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/0.4bpp"); +const u32 gMapObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/1.4bpp"); +const u32 gMapObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/2.4bpp"); +const u32 gMapObjectPic_Camper_0[] = INCBIN_U32("graphics/map_objects/pics/people/camper/0.4bpp"); +const u32 gMapObjectPic_Camper_1[] = INCBIN_U32("graphics/map_objects/pics/people/camper/1.4bpp"); +const u32 gMapObjectPic_Camper_2[] = INCBIN_U32("graphics/map_objects/pics/people/camper/2.4bpp"); +const u32 gMapObjectPic_Camper_3[] = INCBIN_U32("graphics/map_objects/pics/people/camper/3.4bpp"); +const u32 gMapObjectPic_Camper_4[] = INCBIN_U32("graphics/map_objects/pics/people/camper/4.4bpp"); +const u32 gMapObjectPic_Camper_5[] = INCBIN_U32("graphics/map_objects/pics/people/camper/5.4bpp"); +const u32 gMapObjectPic_Camper_6[] = INCBIN_U32("graphics/map_objects/pics/people/camper/6.4bpp"); +const u32 gMapObjectPic_Camper_7[] = INCBIN_U32("graphics/map_objects/pics/people/camper/7.4bpp"); +const u32 gMapObjectPic_Camper_8[] = INCBIN_U32("graphics/map_objects/pics/people/camper/8.4bpp"); +const u32 gMapObjectPic_Picnicker_0[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/0.4bpp"); +const u32 gMapObjectPic_Picnicker_1[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/1.4bpp"); +const u32 gMapObjectPic_Picnicker_2[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/2.4bpp"); +const u32 gMapObjectPic_Picnicker_3[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/3.4bpp"); +const u32 gMapObjectPic_Picnicker_4[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/4.4bpp"); +const u32 gMapObjectPic_Picnicker_5[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/5.4bpp"); +const u32 gMapObjectPic_Picnicker_6[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/6.4bpp"); +const u32 gMapObjectPic_Picnicker_7[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/7.4bpp"); +const u32 gMapObjectPic_Picnicker_8[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/8.4bpp"); +const u32 gMapObjectPic_Man4_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/0.4bpp"); +const u32 gMapObjectPic_Man4_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/1.4bpp"); +const u32 gMapObjectPic_Man4_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/2.4bpp"); +const u32 gMapObjectPic_Man4_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/3.4bpp"); +const u32 gMapObjectPic_Man4_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/4.4bpp"); +const u32 gMapObjectPic_Man4_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/5.4bpp"); +const u32 gMapObjectPic_Man4_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/6.4bpp"); +const u32 gMapObjectPic_Man4_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/7.4bpp"); +const u32 gMapObjectPic_Man4_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/8.4bpp"); +const u32 gMapObjectPic_Woman7_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/0.4bpp"); +const u32 gMapObjectPic_Woman7_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/1.4bpp"); +const u32 gMapObjectPic_Woman7_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/2.4bpp"); +const u32 gMapObjectPic_Woman7_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/3.4bpp"); +const u32 gMapObjectPic_Woman7_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/4.4bpp"); +const u32 gMapObjectPic_Woman7_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/5.4bpp"); +const u32 gMapObjectPic_Woman7_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/6.4bpp"); +const u32 gMapObjectPic_Woman7_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/7.4bpp"); +const u32 gMapObjectPic_Woman7_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/8.4bpp"); +const u32 gMapObjectPic_Youngster_0[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/0.4bpp"); +const u32 gMapObjectPic_Youngster_1[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/1.4bpp"); +const u32 gMapObjectPic_Youngster_2[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/2.4bpp"); +const u32 gMapObjectPic_Youngster_3[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/3.4bpp"); +const u32 gMapObjectPic_Youngster_4[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/4.4bpp"); +const u32 gMapObjectPic_Youngster_5[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/5.4bpp"); +const u32 gMapObjectPic_Youngster_6[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/6.4bpp"); +const u32 gMapObjectPic_Youngster_7[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/7.4bpp"); +const u32 gMapObjectPic_Youngster_8[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/8.4bpp"); +const u32 gMapObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/0.4bpp"); +const u32 gMapObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/1.4bpp"); +const u32 gMapObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/2.4bpp"); +const u32 gMapObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/3.4bpp"); +const u32 gMapObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/4.4bpp"); +const u32 gMapObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/5.4bpp"); +const u32 gMapObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/6.4bpp"); +const u32 gMapObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/7.4bpp"); +const u32 gMapObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/8.4bpp"); +const u32 gMapObjectPic_PsychicM_0[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/0.4bpp"); +const u32 gMapObjectPic_PsychicM_1[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/1.4bpp"); +const u32 gMapObjectPic_PsychicM_2[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/2.4bpp"); +const u32 gMapObjectPic_PsychicM_3[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/3.4bpp"); +const u32 gMapObjectPic_PsychicM_4[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/4.4bpp"); +const u32 gMapObjectPic_PsychicM_5[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/5.4bpp"); +const u32 gMapObjectPic_PsychicM_6[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/6.4bpp"); +const u32 gMapObjectPic_PsychicM_7[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/7.4bpp"); +const u32 gMapObjectPic_PsychicM_8[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/8.4bpp"); +const u32 gMapObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/0.4bpp"); +const u32 gMapObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/1.4bpp"); +const u32 gMapObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/2.4bpp"); +const u32 gMapObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/3.4bpp"); +const u32 gMapObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/4.4bpp"); +const u32 gMapObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/5.4bpp"); +const u32 gMapObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/6.4bpp"); +const u32 gMapObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/7.4bpp"); +const u32 gMapObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/8.4bpp"); +const u32 gMapObjectPic_Maniac_0[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/0.4bpp"); +const u32 gMapObjectPic_Maniac_1[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/1.4bpp"); +const u32 gMapObjectPic_Maniac_2[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/2.4bpp"); +const u32 gMapObjectPic_Maniac_3[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/3.4bpp"); +const u32 gMapObjectPic_Maniac_4[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/4.4bpp"); +const u32 gMapObjectPic_Maniac_5[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/5.4bpp"); +const u32 gMapObjectPic_Maniac_6[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/6.4bpp"); +const u32 gMapObjectPic_Maniac_7[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/7.4bpp"); +const u32 gMapObjectPic_Maniac_8[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/8.4bpp"); +const u32 gMapObjectPic_HexManiac_0[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/0.4bpp"); +const u32 gMapObjectPic_HexManiac_1[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/1.4bpp"); +const u32 gMapObjectPic_HexManiac_2[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/2.4bpp"); +const u32 gMapObjectPic_HexManiac_3[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/3.4bpp"); +const u32 gMapObjectPic_HexManiac_4[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/4.4bpp"); +const u32 gMapObjectPic_HexManiac_5[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/5.4bpp"); +const u32 gMapObjectPic_HexManiac_6[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/6.4bpp"); +const u32 gMapObjectPic_HexManiac_7[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/7.4bpp"); +const u32 gMapObjectPic_HexManiac_8[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/8.4bpp"); +const u32 gMapObjectPic_Woman8_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/0.4bpp"); +const u32 gMapObjectPic_Woman8_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/1.4bpp"); +const u32 gMapObjectPic_Woman8_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/2.4bpp"); +const u32 gMapObjectPic_Woman8_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/3.4bpp"); +const u32 gMapObjectPic_Woman8_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/4.4bpp"); +const u32 gMapObjectPic_Woman8_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/5.4bpp"); +const u32 gMapObjectPic_Woman8_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/6.4bpp"); +const u32 gMapObjectPic_Woman8_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/7.4bpp"); +const u32 gMapObjectPic_Woman8_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/8.4bpp"); +const u32 gMapObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/0.4bpp"); +const u32 gMapObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/1.4bpp"); +const u32 gMapObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/2.4bpp"); +const u32 gMapObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/3.4bpp"); +const u32 gMapObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/4.4bpp"); +const u32 gMapObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/5.4bpp"); +const u32 gMapObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/6.4bpp"); +const u32 gMapObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/7.4bpp"); +const u32 gMapObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/8.4bpp"); +const u32 gMapObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/0.4bpp"); +const u32 gMapObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/1.4bpp"); +const u32 gMapObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/2.4bpp"); +const u32 gMapObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/3.4bpp"); +const u32 gMapObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/4.4bpp"); +const u32 gMapObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/5.4bpp"); +const u32 gMapObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/6.4bpp"); +const u32 gMapObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/7.4bpp"); +const u32 gMapObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/8.4bpp"); +const u32 gMapObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/0.4bpp"); +const u32 gMapObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/1.4bpp"); +const u32 gMapObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/2.4bpp"); +const u32 gMapObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/3.4bpp"); +const u32 gMapObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/4.4bpp"); +const u32 gMapObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/5.4bpp"); +const u32 gMapObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/6.4bpp"); +const u32 gMapObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/7.4bpp"); +const u32 gMapObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/8.4bpp"); +const u32 gMapObjectPic_Beauty_0[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/0.4bpp"); +const u32 gMapObjectPic_Beauty_1[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/1.4bpp"); +const u32 gMapObjectPic_Beauty_2[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/2.4bpp"); +const u32 gMapObjectPic_Beauty_3[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/3.4bpp"); +const u32 gMapObjectPic_Beauty_4[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/4.4bpp"); +const u32 gMapObjectPic_Beauty_5[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/5.4bpp"); +const u32 gMapObjectPic_Beauty_6[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/6.4bpp"); +const u32 gMapObjectPic_Beauty_7[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/7.4bpp"); +const u32 gMapObjectPic_Beauty_8[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/8.4bpp"); +const u32 gMapObjectPic_Scientist1_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/0.4bpp"); +const u32 gMapObjectPic_Scientist1_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/1.4bpp"); +const u32 gMapObjectPic_Scientist1_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/2.4bpp"); +const u32 gMapObjectPic_Scientist1_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/3.4bpp"); +const u32 gMapObjectPic_Scientist1_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/4.4bpp"); +const u32 gMapObjectPic_Scientist1_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/5.4bpp"); +const u32 gMapObjectPic_Scientist1_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/6.4bpp"); +const u32 gMapObjectPic_Scientist1_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/7.4bpp"); +const u32 gMapObjectPic_Scientist1_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/8.4bpp"); +const u32 gMapObjectPic_Lass_0[] = INCBIN_U32("graphics/map_objects/pics/people/lass/0.4bpp"); +const u32 gMapObjectPic_Lass_1[] = INCBIN_U32("graphics/map_objects/pics/people/lass/1.4bpp"); +const u32 gMapObjectPic_Lass_2[] = INCBIN_U32("graphics/map_objects/pics/people/lass/2.4bpp"); +const u32 gMapObjectPic_Lass_3[] = INCBIN_U32("graphics/map_objects/pics/people/lass/3.4bpp"); +const u32 gMapObjectPic_Lass_4[] = INCBIN_U32("graphics/map_objects/pics/people/lass/4.4bpp"); +const u32 gMapObjectPic_Lass_5[] = INCBIN_U32("graphics/map_objects/pics/people/lass/5.4bpp"); +const u32 gMapObjectPic_Lass_6[] = INCBIN_U32("graphics/map_objects/pics/people/lass/6.4bpp"); +const u32 gMapObjectPic_Lass_7[] = INCBIN_U32("graphics/map_objects/pics/people/lass/7.4bpp"); +const u32 gMapObjectPic_Lass_8[] = INCBIN_U32("graphics/map_objects/pics/people/lass/8.4bpp"); +const u32 gMapObjectPic_Gentleman_0[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/0.4bpp"); +const u32 gMapObjectPic_Gentleman_1[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/1.4bpp"); +const u32 gMapObjectPic_Gentleman_2[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/2.4bpp"); +const u32 gMapObjectPic_Gentleman_3[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/3.4bpp"); +const u32 gMapObjectPic_Gentleman_4[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/4.4bpp"); +const u32 gMapObjectPic_Gentleman_5[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/5.4bpp"); +const u32 gMapObjectPic_Gentleman_6[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/6.4bpp"); +const u32 gMapObjectPic_Gentleman_7[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/7.4bpp"); +const u32 gMapObjectPic_Gentleman_8[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/8.4bpp"); +const u32 gMapObjectPic_Sailor_0[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/0.4bpp"); +const u32 gMapObjectPic_Sailor_1[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/1.4bpp"); +const u32 gMapObjectPic_Sailor_2[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/2.4bpp"); +const u32 gMapObjectPic_Sailor_3[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/3.4bpp"); +const u32 gMapObjectPic_Sailor_4[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/4.4bpp"); +const u32 gMapObjectPic_Sailor_5[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/5.4bpp"); +const u32 gMapObjectPic_Sailor_6[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/6.4bpp"); +const u32 gMapObjectPic_Sailor_7[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/7.4bpp"); +const u32 gMapObjectPic_Sailor_8[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/8.4bpp"); +const u32 gMapObjectPic_Fisherman_0[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/0.4bpp"); +const u32 gMapObjectPic_Fisherman_1[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/1.4bpp"); +const u32 gMapObjectPic_Fisherman_2[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/2.4bpp"); +const u32 gMapObjectPic_Fisherman_3[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/3.4bpp"); +const u32 gMapObjectPic_Fisherman_4[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/4.4bpp"); +const u32 gMapObjectPic_Fisherman_5[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/5.4bpp"); +const u32 gMapObjectPic_Fisherman_6[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/6.4bpp"); +const u32 gMapObjectPic_Fisherman_7[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/7.4bpp"); +const u32 gMapObjectPic_Fisherman_8[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/8.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/0.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/1.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/2.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/3.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/4.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/5.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/6.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/7.4bpp"); +const u32 gMapObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/8.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/0.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/1.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/2.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/3.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/4.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/5.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/6.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/7.4bpp"); +const u32 gMapObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/8.4bpp"); +const u32 gMapObjectPic_TuberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/0.4bpp"); +const u32 gMapObjectPic_TuberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/1.4bpp"); +const u32 gMapObjectPic_TuberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/2.4bpp"); +const u32 gMapObjectPic_TuberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/3.4bpp"); +const u32 gMapObjectPic_TuberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/4.4bpp"); +const u32 gMapObjectPic_TuberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/5.4bpp"); +const u32 gMapObjectPic_TuberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/6.4bpp"); +const u32 gMapObjectPic_TuberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/7.4bpp"); +const u32 gMapObjectPic_TuberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/8.4bpp"); +const u32 gMapObjectPic_TuberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/0.4bpp"); +const u32 gMapObjectPic_TuberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/1.4bpp"); +const u32 gMapObjectPic_TuberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/2.4bpp"); +const u32 gMapObjectPic_TuberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/3.4bpp"); +const u32 gMapObjectPic_TuberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/4.4bpp"); +const u32 gMapObjectPic_TuberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/5.4bpp"); +const u32 gMapObjectPic_TuberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/6.4bpp"); +const u32 gMapObjectPic_TuberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/7.4bpp"); +const u32 gMapObjectPic_TuberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/8.4bpp"); +const u32 gMapObjectPic_Hiker_0[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/0.4bpp"); +const u32 gMapObjectPic_Hiker_1[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/1.4bpp"); +const u32 gMapObjectPic_Hiker_2[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/2.4bpp"); +const u32 gMapObjectPic_Hiker_3[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/3.4bpp"); +const u32 gMapObjectPic_Hiker_4[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/4.4bpp"); +const u32 gMapObjectPic_Hiker_5[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/5.4bpp"); +const u32 gMapObjectPic_Hiker_6[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/6.4bpp"); +const u32 gMapObjectPic_Hiker_7[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/7.4bpp"); +const u32 gMapObjectPic_Hiker_8[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/8.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/0.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/1.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/2.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/3.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/4.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/5.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/6.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/7.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/8.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/0.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/1.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/2.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/3.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/4.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/5.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/6.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/7.4bpp"); +const u32 gMapObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/8.4bpp"); +const u32 gMapObjectPic_Man5_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/0.4bpp"); +const u32 gMapObjectPic_Man5_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/1.4bpp"); +const u32 gMapObjectPic_Man5_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/2.4bpp"); +const u32 gMapObjectPic_Man5_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/3.4bpp"); +const u32 gMapObjectPic_Man5_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/4.4bpp"); +const u32 gMapObjectPic_Man5_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/5.4bpp"); +const u32 gMapObjectPic_Man5_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/6.4bpp"); +const u32 gMapObjectPic_Man5_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/7.4bpp"); +const u32 gMapObjectPic_Man5_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/8.4bpp"); +const u32 gMapObjectPic_Man6_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/0.4bpp"); +const u32 gMapObjectPic_Man6_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/1.4bpp"); +const u32 gMapObjectPic_Man6_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/2.4bpp"); +const u32 gMapObjectPic_Man6_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/3.4bpp"); +const u32 gMapObjectPic_Man6_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/4.4bpp"); +const u32 gMapObjectPic_Man6_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/5.4bpp"); +const u32 gMapObjectPic_Man6_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/6.4bpp"); +const u32 gMapObjectPic_Man6_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/7.4bpp"); +const u32 gMapObjectPic_Man6_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/8.4bpp"); +const u32 gMapObjectPic_Nurse_0[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/0.4bpp"); +const u32 gMapObjectPic_Nurse_1[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/1.4bpp"); +const u32 gMapObjectPic_Nurse_2[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/2.4bpp"); +const u32 gMapObjectPic_Nurse_3[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/3.4bpp"); +const u32 gMapObjectPic_Nurse_4[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/4.4bpp"); +const u32 gMapObjectPic_Nurse_5[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/5.4bpp"); +const u32 gMapObjectPic_Nurse_6[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/6.4bpp"); +const u32 gMapObjectPic_Nurse_7[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/7.4bpp"); +const u32 gMapObjectPic_Nurse_8[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/8.4bpp"); +const u32 gMapObjectPic_Nurse_9[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/9.4bpp"); +const u32 gMapObjectPic_ItemBall[] = INCBIN_U32("graphics/map_objects/pics/misc/item_ball.4bpp"); +const u32 gMapObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/0.4bpp"); +const u32 gMapObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/1.4bpp"); +const u32 gMapObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/2.4bpp"); +const u32 gMapObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/3.4bpp"); +const u32 gMapObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/4.4bpp"); +const u32 gMapObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/5.4bpp"); +const u32 gMapObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/6.4bpp"); +const u32 gMapObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/7.4bpp"); +const u32 gMapObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/8.4bpp"); +const u32 gMapObjectPic_ReporterM_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/0.4bpp"); +const u32 gMapObjectPic_ReporterM_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/1.4bpp"); +const u32 gMapObjectPic_ReporterM_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/2.4bpp"); +const u32 gMapObjectPic_ReporterM_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/3.4bpp"); +const u32 gMapObjectPic_ReporterM_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/4.4bpp"); +const u32 gMapObjectPic_ReporterM_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/5.4bpp"); +const u32 gMapObjectPic_ReporterM_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/6.4bpp"); +const u32 gMapObjectPic_ReporterM_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/7.4bpp"); +const u32 gMapObjectPic_ReporterM_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/8.4bpp"); +const u32 gMapObjectPic_ReporterF_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/0.4bpp"); +const u32 gMapObjectPic_ReporterF_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/1.4bpp"); +const u32 gMapObjectPic_ReporterF_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/2.4bpp"); +const u32 gMapObjectPic_ReporterF_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/3.4bpp"); +const u32 gMapObjectPic_ReporterF_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/4.4bpp"); +const u32 gMapObjectPic_ReporterF_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/5.4bpp"); +const u32 gMapObjectPic_ReporterF_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/6.4bpp"); +const u32 gMapObjectPic_ReporterF_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/7.4bpp"); +const u32 gMapObjectPic_ReporterF_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/8.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/0.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/1.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/2.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/3.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/4.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/5.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/6.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/7.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/8.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/0.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/1.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/2.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/3.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/4.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/5.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/6.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/7.4bpp"); +const u32 gMapObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/8.4bpp"); +const u32 gMapObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/0.4bpp"); +const u32 gMapObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/1.4bpp"); +const u32 gMapObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/2.4bpp"); +const u32 gMapObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/3.4bpp"); +const u32 gMapObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/4.4bpp"); +const u32 gMapObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/5.4bpp"); +const u32 gMapObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/6.4bpp"); +const u32 gMapObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/7.4bpp"); +const u32 gMapObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/8.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/0.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/1.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/2.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/3.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/4.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/5.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/6.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/7.4bpp"); +const u32 gMapObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/8.4bpp"); +const u32 gMapObjectPic_Teala_0[] = INCBIN_U32("graphics/map_objects/pics/people/teala/0.4bpp"); +const u32 gMapObjectPic_Teala_1[] = INCBIN_U32("graphics/map_objects/pics/people/teala/1.4bpp"); +const u32 gMapObjectPic_Teala_2[] = INCBIN_U32("graphics/map_objects/pics/people/teala/2.4bpp"); +const u32 gMapObjectPic_Teala_3[] = INCBIN_U32("graphics/map_objects/pics/people/teala/3.4bpp"); +const u32 gMapObjectPic_Teala_4[] = INCBIN_U32("graphics/map_objects/pics/people/teala/4.4bpp"); +const u32 gMapObjectPic_Teala_5[] = INCBIN_U32("graphics/map_objects/pics/people/teala/5.4bpp"); +const u32 gMapObjectPic_Teala_6[] = INCBIN_U32("graphics/map_objects/pics/people/teala/6.4bpp"); +const u32 gMapObjectPic_Teala_7[] = INCBIN_U32("graphics/map_objects/pics/people/teala/7.4bpp"); +const u32 gMapObjectPic_Teala_8[] = INCBIN_U32("graphics/map_objects/pics/people/teala/8.4bpp"); +const u32 gMapObjectPic_Artist_0[] = INCBIN_U32("graphics/map_objects/pics/people/artist/0.4bpp"); +const u32 gMapObjectPic_Artist_1[] = INCBIN_U32("graphics/map_objects/pics/people/artist/1.4bpp"); +const u32 gMapObjectPic_Artist_2[] = INCBIN_U32("graphics/map_objects/pics/people/artist/2.4bpp"); +const u32 gMapObjectPic_Artist_3[] = INCBIN_U32("graphics/map_objects/pics/people/artist/3.4bpp"); +const u32 gMapObjectPic_Artist_4[] = INCBIN_U32("graphics/map_objects/pics/people/artist/4.4bpp"); +const u32 gMapObjectPic_Artist_5[] = INCBIN_U32("graphics/map_objects/pics/people/artist/5.4bpp"); +const u32 gMapObjectPic_Artist_6[] = INCBIN_U32("graphics/map_objects/pics/people/artist/6.4bpp"); +const u32 gMapObjectPic_Artist_7[] = INCBIN_U32("graphics/map_objects/pics/people/artist/7.4bpp"); +const u32 gMapObjectPic_Artist_8[] = INCBIN_U32("graphics/map_objects/pics/people/artist/8.4bpp"); +const u32 gMapObjectPic_Cameraman_0[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/0.4bpp"); +const u32 gMapObjectPic_Cameraman_1[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/1.4bpp"); +const u32 gMapObjectPic_Cameraman_2[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/2.4bpp"); +const u32 gMapObjectPic_Cameraman_3[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/3.4bpp"); +const u32 gMapObjectPic_Cameraman_4[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/4.4bpp"); +const u32 gMapObjectPic_Cameraman_5[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/5.4bpp"); +const u32 gMapObjectPic_Cameraman_6[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/6.4bpp"); +const u32 gMapObjectPic_Cameraman_7[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/7.4bpp"); +const u32 gMapObjectPic_Cameraman_8[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/8.4bpp"); +const u32 gMapObjectPic_Scientist2_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/0.4bpp"); +const u32 gMapObjectPic_Scientist2_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/1.4bpp"); +const u32 gMapObjectPic_Scientist2_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/2.4bpp"); +const u32 gMapObjectPic_Scientist2_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/3.4bpp"); +const u32 gMapObjectPic_Scientist2_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/4.4bpp"); +const u32 gMapObjectPic_Scientist2_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/5.4bpp"); +const u32 gMapObjectPic_Scientist2_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/6.4bpp"); +const u32 gMapObjectPic_Scientist2_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/7.4bpp"); +const u32 gMapObjectPic_Scientist2_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/8.4bpp"); +const u32 gMapObjectPic_Man7_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/0.4bpp"); +const u32 gMapObjectPic_Man7_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/1.4bpp"); +const u32 gMapObjectPic_Man7_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/2.4bpp"); +const u32 gMapObjectPic_Man7_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/3.4bpp"); +const u32 gMapObjectPic_Man7_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/4.4bpp"); +const u32 gMapObjectPic_Man7_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/5.4bpp"); +const u32 gMapObjectPic_Man7_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/6.4bpp"); +const u32 gMapObjectPic_Man7_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/7.4bpp"); +const u32 gMapObjectPic_Man7_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/8.4bpp"); +const u32 gMapObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/0.4bpp"); +const u32 gMapObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/1.4bpp"); +const u32 gMapObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/2.4bpp"); +const u32 gMapObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/3.4bpp"); +const u32 gMapObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/4.4bpp"); +const u32 gMapObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/5.4bpp"); +const u32 gMapObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/6.4bpp"); +const u32 gMapObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/7.4bpp"); +const u32 gMapObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/8.4bpp"); +const u32 gMapObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/0.4bpp"); +const u32 gMapObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/1.4bpp"); +const u32 gMapObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/2.4bpp"); +const u32 gMapObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/3.4bpp"); +const u32 gMapObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/4.4bpp"); +const u32 gMapObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/5.4bpp"); +const u32 gMapObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/6.4bpp"); +const u32 gMapObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/7.4bpp"); +const u32 gMapObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/8.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/0.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/1.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/2.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/3.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/4.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/5.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/6.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/7.4bpp"); +const u32 gMapObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/8.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/0.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/1.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/2.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/3.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/4.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/5.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/6.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/7.4bpp"); +const u32 gMapObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/8.4bpp"); +const u32 gMapObjectPic_Sidney_0[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/0.4bpp"); +const u32 gMapObjectPic_Sidney_1[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/1.4bpp"); +const u32 gMapObjectPic_Sidney_2[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/2.4bpp"); +const u32 gMapObjectPic_Phoebe_0[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/0.4bpp"); +const u32 gMapObjectPic_Phoebe_1[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/1.4bpp"); +const u32 gMapObjectPic_Phoebe_2[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/2.4bpp"); +const u32 gMapObjectPic_Glacia_0[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/0.4bpp"); +const u32 gMapObjectPic_Glacia_1[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/1.4bpp"); +const u32 gMapObjectPic_Glacia_2[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/2.4bpp"); +const u32 gMapObjectPic_Drake_0[] = INCBIN_U32("graphics/map_objects/pics/people/drake/0.4bpp"); +const u32 gMapObjectPic_Drake_1[] = INCBIN_U32("graphics/map_objects/pics/people/drake/1.4bpp"); +const u32 gMapObjectPic_Drake_2[] = INCBIN_U32("graphics/map_objects/pics/people/drake/2.4bpp"); +const u32 gMapObjectPic_Roxanne_0[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/0.4bpp"); +const u32 gMapObjectPic_Roxanne_1[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/1.4bpp"); +const u32 gMapObjectPic_Roxanne_2[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/2.4bpp"); +const u32 gMapObjectPic_Brawly_0[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/0.4bpp"); +const u32 gMapObjectPic_Brawly_1[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/1.4bpp"); +const u32 gMapObjectPic_Brawly_2[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/2.4bpp"); +const u32 gMapObjectPic_Wattson_0[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/0.4bpp"); +const u32 gMapObjectPic_Wattson_1[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/1.4bpp"); +const u32 gMapObjectPic_Wattson_2[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/2.4bpp"); +const u32 gMapObjectPic_Flannery_0[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/0.4bpp"); +const u32 gMapObjectPic_Flannery_1[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/1.4bpp"); +const u32 gMapObjectPic_Flannery_2[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/2.4bpp"); +const u32 gMapObjectPic_Norman_0[] = INCBIN_U32("graphics/map_objects/pics/people/norman/0.4bpp"); +const u32 gMapObjectPic_Norman_1[] = INCBIN_U32("graphics/map_objects/pics/people/norman/1.4bpp"); +const u32 gMapObjectPic_Norman_2[] = INCBIN_U32("graphics/map_objects/pics/people/norman/2.4bpp"); +const u32 gMapObjectPic_Norman_3[] = INCBIN_U32("graphics/map_objects/pics/people/norman/3.4bpp"); +const u32 gMapObjectPic_Norman_4[] = INCBIN_U32("graphics/map_objects/pics/people/norman/4.4bpp"); +const u32 gMapObjectPic_Norman_5[] = INCBIN_U32("graphics/map_objects/pics/people/norman/5.4bpp"); +const u32 gMapObjectPic_Norman_6[] = INCBIN_U32("graphics/map_objects/pics/people/norman/6.4bpp"); +const u32 gMapObjectPic_Norman_7[] = INCBIN_U32("graphics/map_objects/pics/people/norman/7.4bpp"); +const u32 gMapObjectPic_Norman_8[] = INCBIN_U32("graphics/map_objects/pics/people/norman/8.4bpp"); +const u32 gMapObjectPic_Winona_0[] = INCBIN_U32("graphics/map_objects/pics/people/winona/0.4bpp"); +const u32 gMapObjectPic_Winona_1[] = INCBIN_U32("graphics/map_objects/pics/people/winona/1.4bpp"); +const u32 gMapObjectPic_Winona_2[] = INCBIN_U32("graphics/map_objects/pics/people/winona/2.4bpp"); +const u32 gMapObjectPic_Liza_0[] = INCBIN_U32("graphics/map_objects/pics/people/liza/0.4bpp"); +const u32 gMapObjectPic_Liza_1[] = INCBIN_U32("graphics/map_objects/pics/people/liza/1.4bpp"); +const u32 gMapObjectPic_Liza_2[] = INCBIN_U32("graphics/map_objects/pics/people/liza/2.4bpp"); +const u32 gMapObjectPic_Tate_0[] = INCBIN_U32("graphics/map_objects/pics/people/tate/0.4bpp"); +const u32 gMapObjectPic_Tate_1[] = INCBIN_U32("graphics/map_objects/pics/people/tate/1.4bpp"); +const u32 gMapObjectPic_Tate_2[] = INCBIN_U32("graphics/map_objects/pics/people/tate/2.4bpp"); +const u32 gMapObjectPic_Wallace_0[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/0.4bpp"); +const u32 gMapObjectPic_Wallace_1[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/1.4bpp"); +const u32 gMapObjectPic_Wallace_2[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/2.4bpp"); +const u32 gMapObjectPic_Wallace_3[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/3.4bpp"); +const u32 gMapObjectPic_Wallace_4[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/4.4bpp"); +const u32 gMapObjectPic_Wallace_5[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/5.4bpp"); +const u32 gMapObjectPic_Wallace_6[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/6.4bpp"); +const u32 gMapObjectPic_Wallace_7[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/7.4bpp"); +const u32 gMapObjectPic_Wallace_8[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/8.4bpp"); +const u32 gMapObjectPic_Steven_0[] = INCBIN_U32("graphics/map_objects/pics/people/steven/0.4bpp"); +const u32 gMapObjectPic_Steven_1[] = INCBIN_U32("graphics/map_objects/pics/people/steven/1.4bpp"); +const u32 gMapObjectPic_Steven_2[] = INCBIN_U32("graphics/map_objects/pics/people/steven/2.4bpp"); +const u32 gMapObjectPic_Steven_3[] = INCBIN_U32("graphics/map_objects/pics/people/steven/3.4bpp"); +const u32 gMapObjectPic_Steven_4[] = INCBIN_U32("graphics/map_objects/pics/people/steven/4.4bpp"); +const u32 gMapObjectPic_Steven_5[] = INCBIN_U32("graphics/map_objects/pics/people/steven/5.4bpp"); +const u32 gMapObjectPic_Steven_6[] = INCBIN_U32("graphics/map_objects/pics/people/steven/6.4bpp"); +const u32 gMapObjectPic_Steven_7[] = INCBIN_U32("graphics/map_objects/pics/people/steven/7.4bpp"); +const u32 gMapObjectPic_Steven_8[] = INCBIN_U32("graphics/map_objects/pics/people/steven/8.4bpp"); +const u32 gMapObjectPic_Wally_0[] = INCBIN_U32("graphics/map_objects/pics/people/wally/0.4bpp"); +const u32 gMapObjectPic_Wally_1[] = INCBIN_U32("graphics/map_objects/pics/people/wally/1.4bpp"); +const u32 gMapObjectPic_Wally_2[] = INCBIN_U32("graphics/map_objects/pics/people/wally/2.4bpp"); +const u32 gMapObjectPic_Wally_3[] = INCBIN_U32("graphics/map_objects/pics/people/wally/3.4bpp"); +const u32 gMapObjectPic_Wally_4[] = INCBIN_U32("graphics/map_objects/pics/people/wally/4.4bpp"); +const u32 gMapObjectPic_Wally_5[] = INCBIN_U32("graphics/map_objects/pics/people/wally/5.4bpp"); +const u32 gMapObjectPic_Wally_6[] = INCBIN_U32("graphics/map_objects/pics/people/wally/6.4bpp"); +const u32 gMapObjectPic_Wally_7[] = INCBIN_U32("graphics/map_objects/pics/people/wally/7.4bpp"); +const u32 gMapObjectPic_Wally_8[] = INCBIN_U32("graphics/map_objects/pics/people/wally/8.4bpp"); +const u32 gMapObjectPic_LittleBoy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/0.4bpp"); +const u32 gMapObjectPic_LittleBoy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/1.4bpp"); +const u32 gMapObjectPic_LittleBoy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/2.4bpp"); +const u32 gMapObjectPic_LittleBoy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/3.4bpp"); +const u32 gMapObjectPic_LittleBoy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/4.4bpp"); +const u32 gMapObjectPic_LittleBoy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/5.4bpp"); +const u32 gMapObjectPic_LittleBoy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/6.4bpp"); +const u32 gMapObjectPic_LittleBoy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/7.4bpp"); +const u32 gMapObjectPic_LittleBoy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/8.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/0.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/1.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/2.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/3.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/4.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/5.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/6.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/7.4bpp"); +const u32 gMapObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/8.4bpp"); +const u32 gMapObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/0.4bpp"); +const u32 gMapObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/1.4bpp"); +const u32 gMapObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/2.4bpp"); +const u32 gMapObjectPic_Boy5_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/0.4bpp"); +const u32 gMapObjectPic_Boy5_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/1.4bpp"); +const u32 gMapObjectPic_Boy5_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/2.4bpp"); +const u32 gMapObjectPic_ContestJudge_0[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/0.4bpp"); +const u32 gMapObjectPic_ContestJudge_1[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/1.4bpp"); +const u32 gMapObjectPic_ContestJudge_2[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/2.4bpp"); +const u32 gMapObjectPic_ContestJudge_3[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/3.4bpp"); +const u32 gMapObjectPic_ContestJudge_4[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/4.4bpp"); +const u32 gMapObjectPic_ContestJudge_5[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/5.4bpp"); +const u32 gMapObjectPic_ContestJudge_6[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/6.4bpp"); +const u32 gMapObjectPic_ContestJudge_7[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/7.4bpp"); +const u32 gMapObjectPic_ContestJudge_8[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/8.4bpp"); +const u32 gMapObjectPic_Archie_0[] = INCBIN_U32("graphics/map_objects/pics/people/archie/0.4bpp"); +const u32 gMapObjectPic_Archie_1[] = INCBIN_U32("graphics/map_objects/pics/people/archie/1.4bpp"); +const u32 gMapObjectPic_Archie_2[] = INCBIN_U32("graphics/map_objects/pics/people/archie/2.4bpp"); +const u32 gMapObjectPic_Archie_3[] = INCBIN_U32("graphics/map_objects/pics/people/archie/3.4bpp"); +const u32 gMapObjectPic_Archie_4[] = INCBIN_U32("graphics/map_objects/pics/people/archie/4.4bpp"); +const u32 gMapObjectPic_Archie_5[] = INCBIN_U32("graphics/map_objects/pics/people/archie/5.4bpp"); +const u32 gMapObjectPic_Archie_6[] = INCBIN_U32("graphics/map_objects/pics/people/archie/6.4bpp"); +const u32 gMapObjectPic_Archie_7[] = INCBIN_U32("graphics/map_objects/pics/people/archie/7.4bpp"); +const u32 gMapObjectPic_Archie_8[] = INCBIN_U32("graphics/map_objects/pics/people/archie/8.4bpp"); +const u32 gMapObjectPic_Maxie_0[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/0.4bpp"); +const u32 gMapObjectPic_Maxie_1[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/1.4bpp"); +const u32 gMapObjectPic_Maxie_2[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/2.4bpp"); +const u32 gMapObjectPic_Maxie_3[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/3.4bpp"); +const u32 gMapObjectPic_Maxie_4[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/4.4bpp"); +const u32 gMapObjectPic_Maxie_5[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/5.4bpp"); +const u32 gMapObjectPic_Maxie_6[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/6.4bpp"); +const u32 gMapObjectPic_Maxie_7[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/7.4bpp"); +const u32 gMapObjectPic_Maxie_8[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/8.4bpp"); +const u32 gMapObjectPic_Kyogre_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/0.4bpp"); +const u32 gMapObjectPic_Kyogre_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/1.4bpp"); +const u32 gMapObjectPic_Groudon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/0.4bpp"); +const u32 gMapObjectPic_Groudon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/1.4bpp"); +const u32 gMapObjectPic_Regi[] = INCBIN_U32("graphics/map_objects/pics/pokemon/regi.4bpp"); +const u32 gMapObjectPic_Skitty_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/0.4bpp"); +const u32 gMapObjectPic_Skitty_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/1.4bpp"); +const u32 gMapObjectPic_Skitty_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/2.4bpp"); +const u32 gMapObjectPic_Kecleon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/0.4bpp"); +const u32 gMapObjectPic_Kecleon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/1.4bpp"); +const u32 gMapObjectPic_Kecleon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/2.4bpp"); +const u32 gMapObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/0.4bpp"); +const u32 gMapObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/1.4bpp"); +const u32 gMapObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/0.4bpp"); +const u32 gMapObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/1.4bpp"); +const u32 gMapObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/2.4bpp"); +const u32 gMapObjectPic_Pikachu_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/0.4bpp"); +const u32 gMapObjectPic_Pikachu_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/1.4bpp"); +const u32 gMapObjectPic_Pikachu_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/2.4bpp"); +const u32 gMapObjectPic_Azumarill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/0.4bpp"); +const u32 gMapObjectPic_Azumarill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/1.4bpp"); +const u32 gMapObjectPic_Azumarill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/2.4bpp"); +const u32 gMapObjectPic_Wingull_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/0.4bpp"); +const u32 gMapObjectPic_Wingull_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/3.4bpp"); +const u32 gMapObjectPic_Wingull_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/1.4bpp"); +const u32 gMapObjectPic_Wingull_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/4.4bpp"); +const u32 gMapObjectPic_Wingull_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/2.4bpp"); +const u32 gMapObjectPic_Wingull_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/5.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/0.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/1.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/2.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/3.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/4.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/5.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/6.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/7.4bpp"); +const u32 gMapObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/8.4bpp"); +const u32 gMapObjectPic_Azurill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/0.4bpp"); +const u32 gMapObjectPic_Azurill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/1.4bpp"); +const u32 gMapObjectPic_Azurill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/2.4bpp"); +const u32 gMapObjectPic_Mom_0[] = INCBIN_U32("graphics/map_objects/pics/people/mom/0.4bpp"); +const u32 gMapObjectPic_Mom_1[] = INCBIN_U32("graphics/map_objects/pics/people/mom/1.4bpp"); +const u32 gMapObjectPic_Mom_2[] = INCBIN_U32("graphics/map_objects/pics/people/mom/2.4bpp"); +const u32 gMapObjectPic_Mom_3[] = INCBIN_U32("graphics/map_objects/pics/people/mom/3.4bpp"); +const u32 gMapObjectPic_Mom_4[] = INCBIN_U32("graphics/map_objects/pics/people/mom/4.4bpp"); +const u32 gMapObjectPic_Mom_5[] = INCBIN_U32("graphics/map_objects/pics/people/mom/5.4bpp"); +const u32 gMapObjectPic_Mom_6[] = INCBIN_U32("graphics/map_objects/pics/people/mom/6.4bpp"); +const u32 gMapObjectPic_Mom_7[] = INCBIN_U32("graphics/map_objects/pics/people/mom/7.4bpp"); +const u32 gMapObjectPic_Mom_8[] = INCBIN_U32("graphics/map_objects/pics/people/mom/8.4bpp"); +const u16 gMapObjectPalette22[] = INCBIN_U16("graphics/map_objects/palettes/22.gbapal"); +const u16 gMapObjectPalette23[] = INCBIN_U16("graphics/map_objects/palettes/23.gbapal"); +const u16 gMapObjectPalette24[] = INCBIN_U16("graphics/map_objects/palettes/24.gbapal"); +const u16 gMapObjectPalette25[] = INCBIN_U16("graphics/map_objects/palettes/25.gbapal"); +const u32 gMapObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_natu_doll.4bpp"); +const u32 gMapObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_magnemite_doll.4bpp"); +const u32 gMapObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_squirtle_doll.4bpp"); +const u32 gMapObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_wooper_doll.4bpp"); +const u32 gMapObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_pikachu_doll.4bpp"); +const u32 gMapObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_porygon2_doll.4bpp"); +const u32 gMapObjectPic_PichuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pichu_doll.4bpp"); +const u32 gMapObjectPic_PikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pikachu_doll.4bpp"); +const u32 gMapObjectPic_MarillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/marill_doll.4bpp"); +const u32 gMapObjectPic_TogepiDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/togepi_doll.4bpp"); +const u32 gMapObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/cyndaquil_doll.4bpp"); +const u32 gMapObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/chikorita_doll.4bpp"); +const u32 gMapObjectPic_TotodileDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/totodile_doll.4bpp"); +const u32 gMapObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/jigglypuff_doll.4bpp"); +const u32 gMapObjectPic_MeowthDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/meowth_doll.4bpp"); +const u32 gMapObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/clefairy_doll.4bpp"); +const u32 gMapObjectPic_DittoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/ditto_doll.4bpp"); +const u32 gMapObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/smoochum_doll.4bpp"); +const u32 gMapObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/treecko_doll.4bpp"); +const u32 gMapObjectPic_TorchicDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/torchic_doll.4bpp"); +const u32 gMapObjectPic_MudkipDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/mudkip_doll.4bpp"); +const u32 gMapObjectPic_DuskullDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/duskull_doll.4bpp"); +const u32 gMapObjectPic_WynautDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/wynaut_doll.4bpp"); +const u32 gMapObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/baltoy_doll.4bpp"); +const u32 gMapObjectPic_KecleonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/kecleon_doll.4bpp"); +const u32 gMapObjectPic_AzurillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/azurill_doll.4bpp"); +const u32 gMapObjectPic_SkittyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/skitty_doll.4bpp"); +const u32 gMapObjectPic_SwabluDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/swablu_doll.4bpp"); +const u32 gMapObjectPic_GulpinDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/gulpin_doll.4bpp"); +const u32 gMapObjectPic_LotadDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/lotad_doll.4bpp"); +const u32 gMapObjectPic_SeedotDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/seedot_doll.4bpp"); +const u32 gMapObjectPic_PikaCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/pika_cushion.4bpp"); +const u32 gMapObjectPic_RoundCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/round_cushion.4bpp"); +const u32 gMapObjectPic_KissCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/kiss_cushion.4bpp"); +const u32 gMapObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/zigzag_cushion.4bpp"); +const u32 gMapObjectPic_SpinCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/spin_cushion.4bpp"); +const u32 gMapObjectPic_DiamondCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/diamond_cushion.4bpp"); +const u32 gMapObjectPic_BallCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/ball_cushion.4bpp"); +const u32 gMapObjectPic_GrassCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/grass_cushion.4bpp"); +const u32 gMapObjectPic_FireCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/fire_cushion.4bpp"); +const u32 gMapObjectPic_WaterCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/water_cushion.4bpp"); +const u32 gMapObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_snorlax_doll.4bpp"); +const u32 gMapObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_rhydon_doll.4bpp"); +const u32 gMapObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_lapras_doll.4bpp"); +const u32 gMapObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_venusaur_doll.4bpp"); +const u32 gMapObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_charizard_doll.4bpp"); +const u32 gMapObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_blastoise_doll.4bpp"); +const u32 gMapObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_wailmer_doll.4bpp"); +const u32 gMapObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regirock_doll.4bpp"); +const u32 gMapObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regice_doll.4bpp"); +const u32 gMapObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_registeel_doll.4bpp"); +const u32 gMapObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/0.4bpp"); +const u32 gMapObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/1.4bpp"); +const u32 gMapObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/2.4bpp"); +const u32 gMapObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/3.4bpp"); +const u32 gMapObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/0.4bpp"); +const u32 gMapObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/1.4bpp"); +const u32 gMapObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/2.4bpp"); +const u32 gMapObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/3.4bpp"); +const u32 gMapObjectPic_PushableBoulder[] = INCBIN_U32("graphics/map_objects/pics/misc/pushable_boulder.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/0.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/1.4bpp"); +const u32 gMapObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/2.4bpp"); +const u32 gMapObjectPic_Fossil[] = INCBIN_U32("graphics/map_objects/pics/misc/fossil.4bpp"); +const u32 gMapObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/map_objects/pics/misc/submarine_shadow.4bpp"); +const u16 gMapObjectPalette26[] = INCBIN_U16("graphics/map_objects/palettes/26.gbapal"); +const u32 gMapObjectPic_Truck[] = INCBIN_U32("graphics/map_objects/pics/misc/truck.4bpp"); +const u16 gMapObjectPalette14[] = INCBIN_U16("graphics/map_objects/palettes/14.gbapal"); +const u32 gMapObjectPic_MachokeCarryingBox_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/0.4bpp"); +const u32 gMapObjectPic_MachokeCarryingBox_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/1.4bpp"); +const u32 gMapObjectPic_MachokeCarryingBox_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/2.4bpp"); +const u32 gMapObjectPic_MachokeFacingAway_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/0.4bpp"); +const u32 gMapObjectPic_MachokeFacingAway_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/1.4bpp"); +const u16 gMapObjectPalette15[] = INCBIN_U16("graphics/map_objects/palettes/15.gbapal"); +const u32 gMapObjectPic_BirchsBag[] = INCBIN_U32("graphics/map_objects/pics/misc/birchs_bag.4bpp"); +const u32 gMapObjectPic_Poochyena_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/0.4bpp"); +const u32 gMapObjectPic_Poochyena_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/1.4bpp"); +const u32 gMapObjectPic_Poochyena_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/2.4bpp"); +const u32 gMapObjectPic_Poochyena_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/3.4bpp"); +const u32 gMapObjectPic_Poochyena_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/4.4bpp"); +const u32 gMapObjectPic_Poochyena_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/5.4bpp"); +const u32 gMapObjectPic_Poochyena_6[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/6.4bpp"); +const u32 gMapObjectPic_Poochyena_7[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/7.4bpp"); +const u32 gMapObjectPic_Poochyena_8[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/8.4bpp"); +const u16 gMapObjectPalette16[] = INCBIN_U16("graphics/map_objects/palettes/16.gbapal"); +const u32 gMapObjectPic_CableCar[] = INCBIN_U32("graphics/map_objects/pics/misc/cable_car.4bpp"); +const u16 gMapObjectPalette20[] = INCBIN_U16("graphics/map_objects/palettes/20.gbapal"); +const u32 gMapObjectPic_SSTidal[] = INCBIN_U32("graphics/map_objects/pics/misc/ss_tidal.4bpp"); +const u16 gMapObjectPalette21[] = INCBIN_U16("graphics/map_objects/palettes/21.gbapal"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/0.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/1.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/2.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/3.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/4.4bpp"); +const u32 gFieldEffectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/5.4bpp"); +const u32 gMapObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/dirt_pile.4bpp"); +const u32 gMapObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/0.4bpp"); +const u32 gMapObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/1.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/0.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/1.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/2.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/3.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/4.4bpp"); +const u32 gMapObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/5.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/0.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/1.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/2.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/3.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/4.4bpp"); +const u32 gMapObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/5.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/0.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/1.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/2.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/3.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/4.4bpp"); +const u32 gMapObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/5.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/0.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/1.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/2.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/3.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/4.4bpp"); +const u32 gMapObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/5.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/0.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/1.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/2.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/3.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/4.4bpp"); +const u32 gMapObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/5.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/0.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/1.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/2.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/3.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/4.4bpp"); +const u32 gMapObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/5.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/0.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/1.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/2.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/3.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/4.4bpp"); +const u32 gMapObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/5.4bpp"); +const u32 gMapObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/0.4bpp"); +const u32 gMapObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/1.4bpp"); +const u32 gMapObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/2.4bpp"); +const u32 gMapObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/3.4bpp"); +const u32 gMapObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/4.4bpp"); +const u32 gMapObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/5.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/0.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/1.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/2.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/3.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/4.4bpp"); +const u32 gMapObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/5.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/0.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/1.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/2.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/3.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/4.4bpp"); +const u32 gMapObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/5.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/0.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/1.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/2.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/3.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/4.4bpp"); +const u32 gMapObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/5.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/0.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/1.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/2.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/3.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/4.4bpp"); +const u32 gMapObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/5.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/0.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/1.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/2.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/3.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/4.4bpp"); +const u32 gMapObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/5.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/0.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/1.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/2.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/3.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/4.4bpp"); +const u32 gMapObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/5.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/0.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/1.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/2.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/3.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/4.4bpp"); +const u32 gMapObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/5.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/0.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/1.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/2.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/3.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/4.4bpp"); +const u32 gMapObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/5.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/0.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/1.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/2.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/3.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/4.4bpp"); +const u32 gMapObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/5.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/0.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/1.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/2.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/3.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/4.4bpp"); +const u32 gMapObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/5.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/0.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/1.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/2.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/3.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/4.4bpp"); +const u32 gMapObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/5.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/0.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/1.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/2.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/3.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/4.4bpp"); +const u32 gMapObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/5.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/0.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/1.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/2.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/3.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/4.4bpp"); +const u32 gMapObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/5.4bpp"); +const u32 gMapObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/0.4bpp"); +const u32 gMapObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/1.4bpp"); +const u32 gMapObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/2.4bpp"); +const u32 gMapObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/3.4bpp"); +const u32 gMapObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/4.4bpp"); +const u32 gMapObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/5.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/0.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/1.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/2.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/3.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/4.4bpp"); +const u32 gMapObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/5.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/0.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/1.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/2.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/3.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/4.4bpp"); +const u32 gMapObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/5.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/0.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/1.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/2.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/3.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/4.4bpp"); +const u32 gMapObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/5.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/0.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/1.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/2.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/3.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/4.4bpp"); +const u32 gMapObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/5.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/0.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/1.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/2.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/3.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/4.4bpp"); +const u32 gMapObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/5.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/0.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/1.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/2.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/3.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/4.4bpp"); +const u32 gMapObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/5.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/0.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/1.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/2.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/3.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/4.4bpp"); +const u32 gMapObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/5.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/0.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/1.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/2.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/3.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/4.4bpp"); +const u32 gMapObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/5.4bpp"); +const u32 gFieldEffectPic_SurfBlob_0[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/0.4bpp"); +const u32 gFieldEffectPic_SurfBlob_1[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/1.4bpp"); +const u32 gFieldEffectPic_SurfBlob_2[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/2.4bpp"); +const u32 gMapObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/0.4bpp"); +const u32 gMapObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/1.4bpp"); +const u32 gMapObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/2.4bpp"); +const u32 gMapObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/3.4bpp"); +const u32 gMapObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/4.4bpp"); +const u32 gMapObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/5.4bpp"); +const u32 gMapObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/6.4bpp"); +const u16 gMapObjectPalette12[] = INCBIN_U16("graphics/map_objects/palettes/12.gbapal"); +const u16 gMapObjectPalette13[] = INCBIN_U16("graphics/map_objects/palettes/13.gbapal"); + +const u32 gFieldEffectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_small.4bpp"); +const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_medium.4bpp"); +const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp"); +const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp"); +const u32 filler_8368A08[0x48] = {}; +const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effect_objects/pics/cut_grass.4bpp"); +const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); +const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal"); +const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp"); +const u32 gFieldEffectPic_Ripple_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/1.4bpp"); +const u32 gFieldEffectPic_Ripple_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/2.4bpp"); +const u32 gFieldEffectPic_Ripple_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/3.4bpp"); +const u32 gFieldEffectPic_Ripple_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/4.4bpp"); +const u32 gFieldEffectPic_Ash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/0.4bpp"); +const u32 gFieldEffectPic_Ash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/1.4bpp"); +const u32 gFieldEffectPic_Ash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/2.4bpp"); +const u32 gFieldEffectPic_Ash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/3.4bpp"); +const u32 gFieldEffectPic_Ash_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/4.4bpp"); +const u32 gFieldEffectPic_Arrow_0[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/0.4bpp"); +const u32 gFieldEffectPic_Arrow_1[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/1.4bpp"); +const u32 gFieldEffectPic_Arrow_2[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/2.4bpp"); +const u32 gFieldEffectPic_Arrow_3[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/3.4bpp"); +const u32 gFieldEffectPic_Arrow_4[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/4.4bpp"); +const u32 gFieldEffectPic_Arrow_5[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/5.4bpp"); +const u32 gFieldEffectPic_Arrow_6[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/6.4bpp"); +const u32 gFieldEffectPic_Arrow_7[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/7.4bpp"); +const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effect_objects/palettes/00.gbapal"); +const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effect_objects/palettes/01.gbapal"); +const u32 gFieldEffectPic_Dust_0[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/0.4bpp"); +const u32 gFieldEffectPic_Dust_1[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/1.4bpp"); +const u32 gFieldEffectPic_Dust_2[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/2.4bpp"); +const u32 unknown_8369588[] = INCBIN_U32("graphics/field_effect_objects/unknown.bin"); +const u32 gFieldEffectPic_JumpTallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/0.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/1.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/2.4bpp"); +const u32 gFieldEffectPic_JumpTallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/3.4bpp"); +const u32 UnusedGrass0[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/0.4bpp"); +const u32 UnusedGrass1[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/1.4bpp"); +const u32 UnusedGrass2[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/2.4bpp"); +const u32 UnusedGrass3[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/3.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/0.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/1.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/2.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/3.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/4.4bpp"); +const u32 UnusedGrassLong[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/unused.4bpp"); +const u32 gFieldEffectPic_JumpLongGrass_5[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/5.4bpp"); +const u32 gFieldEffectPic_Unknown17_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/0.4bpp"); +const u32 gFieldEffectPic_Unknown17_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/1.4bpp"); +const u32 gFieldEffectPic_Unknown17_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/2.4bpp"); +const u32 gFieldEffectPic_Unknown17_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/3.4bpp"); +const u32 gFieldEffectPic_Unknown17_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/4.4bpp"); +const u32 gFieldEffectPic_Unknown17_5[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/5.4bpp"); +const u32 gFieldEffectPic_Unknown17_6[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/6.4bpp"); +const u32 gFieldEffectPic_Unknown17_7[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/7.4bpp"); +const u32 gFieldEffectPic_Unknown18_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/0.4bpp"); +const u32 gFieldEffectPic_Unknown18_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/1.4bpp"); +const u32 gFieldEffectPic_Unknown18_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/2.4bpp"); +const u32 gFieldEffectPic_Unknown18_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/3.4bpp"); +const u32 gFieldEffectPic_LongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/0.4bpp"); +const u32 gFieldEffectPic_LongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/1.4bpp"); +const u32 gFieldEffectPic_LongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/2.4bpp"); +const u32 gFieldEffectPic_LongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/3.4bpp"); +const u32 gFieldEffectPic_TallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/0.4bpp"); +const u32 gFieldEffectPic_TallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/1.4bpp"); +const u32 gFieldEffectPic_TallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/2.4bpp"); +const u32 gFieldEffectPic_TallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/3.4bpp"); +const u32 gFieldEffectPic_TallGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/4.4bpp"); +const u32 gFieldEffectPic_ShortGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/0.4bpp"); +const u32 gFieldEffectPic_ShortGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/1.4bpp"); +const u32 gFieldEffectPic_SandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/0.4bpp"); +const u32 gFieldEffectPic_SandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/1.4bpp"); +const u32 gFieldEffectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/0.4bpp"); +const u32 gFieldEffectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/1.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/0.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/1.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/2.4bpp"); +const u32 gFieldEffectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/3.4bpp"); +const u32 gFieldEffectPic_Unknown19_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/0.4bpp"); +const u32 gFieldEffectPic_Unknown19_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/1.4bpp"); +const u32 gFieldEffectPic_Unknown19_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/2.4bpp"); +const u32 gFieldEffectPic_Unknown19_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/3.4bpp"); +const u32 gFieldEffectPic_SandPile_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/0.4bpp"); +const u32 gFieldEffectPic_SandPile_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/1.4bpp"); +const u32 gFieldEffectPic_SandPile_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/2.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/0.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/1.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/2.4bpp"); +const u32 gFieldEffectPic_JumpBigSplash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/3.4bpp"); +const u32 gFieldEffectPic_Splash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/0.4bpp"); +const u32 gFieldEffectPic_Splash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/1.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/0.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/1.4bpp"); +const u32 gFieldEffectPic_JumpSmallSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/2.4bpp"); +const u32 gFieldEffectPic_Unknown20_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/0.4bpp"); +const u32 gFieldEffectPic_Unknown20_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/1.4bpp"); +const u32 gFieldEffectPic_Unknown20_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/2.4bpp"); +const u32 gFieldEffectPic_Unknown20_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/3.4bpp"); +const u32 gFieldEffectPic_Unknown20_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/4.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/0.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/1.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/2.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/3.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/4.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/5.4bpp"); +const u32 gFieldEffectPic_TreeDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/6.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/0.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/1.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/2.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/3.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/4.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/5.4bpp"); +const u32 gFieldEffectPic_MountainDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/6.4bpp"); +const u32 gFieldEffectPic_SandDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/0.4bpp"); +const u32 gFieldEffectPic_SandDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/1.4bpp"); +const u32 gFieldEffectPic_SandDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/2.4bpp"); +const u32 gFieldEffectPic_SandDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/3.4bpp"); +const u32 gFieldEffectPic_SandDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/4.4bpp"); +const u32 gFieldEffectPic_SandDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/5.4bpp"); +const u32 gFieldEffectPic_SandDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/6.4bpp"); +const u32 gFieldEffectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effect_objects/pics/hot_springs_water.4bpp"); +const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effect_objects/palettes/02.gbapal"); +const u32 gFieldEffectPic_PopOutOfAsh_0[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/0.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_1[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/1.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_2[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/2.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_3[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/3.4bpp"); +const u32 gFieldEffectPic_PopOutOfAsh_4[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/4.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_0[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/0.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_1[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/1.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_2[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/2.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_3[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/3.4bpp"); +const u32 gFieldEffectPic_LavaridgeGymWarp_4[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/4.4bpp"); +const u32 gFieldEffectPic_Bubbles_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/0.4bpp"); +const u32 gFieldEffectPic_Bubbles_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/1.4bpp"); +const u32 gFieldEffectPic_Bubbles_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/2.4bpp"); +const u32 gFieldEffectPic_Bubbles_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/3.4bpp"); +const u32 gFieldEffectPic_Bubbles_4[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/4.4bpp"); +const u32 gFieldEffectPic_Bubbles_5[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/5.4bpp"); +const u32 gFieldEffectPic_Bubbles_6[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/6.4bpp"); +const u32 gFieldEffectPic_Bubbles_7[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/7.4bpp"); +const u32 gFieldEffectPic_Sparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/0.4bpp"); +const u32 gFieldEffectPic_Sparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/1.4bpp"); +const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/field_effect_objects/palettes/03.gbapal"); +const u32 gFieldEffectPic_Bird[] = INCBIN_U32("graphics/field_effect_objects/pics/bird.4bpp"); + +void (*const gUnknown_0836DA88[])(struct Sprite *) = +{ + sub_805C884, + sub_805CDE8, + sub_805C8AC, + sub_805CF28, + sub_805CF28, + sub_805D0AC, + sub_805D0AC, + sub_805D230, + sub_805D230, + sub_805D230, + sub_805D230, + sub_80587B4, + FieldObjectCB_BerryTree, + sub_805D4F4, + sub_805D634, + sub_805D774, + sub_805D8B4, + sub_805D9F4, + sub_805DB34, + sub_805DC74, + sub_805DDB4, + sub_805DEF4, + sub_805E034, + sub_805E174, + sub_805E278, + sub_805E37C, + sub_805E37C, + sub_805E37C, + sub_805E37C, + sub_805E5DC, + sub_805E668, + sub_805E6F4, + sub_805E780, + sub_805E80C, + sub_805E898, + sub_805E924, + sub_805E9B0, + sub_805EA3C, + sub_805EAC8, + sub_805EB54, + sub_805EBE0, + sub_805EC6C, + sub_805ECF8, + sub_805ED84, + sub_805EE10, + sub_805EE9C, + sub_805EF28, + sub_805EFB4, + sub_805F040, + sub_805F0CC, + sub_805F158, + sub_805F1E4, + sub_805F270, + sub_805F2FC, + sub_805F2FC, + sub_805F2FC, + sub_805F2FC, + FieldObjectCB_TreeDisguise, + FieldObjectCB_MountainDisguise, + sub_805F8E0, + sub_805F8E0, + sub_805F8E0, + sub_805F8E0, + FieldObjectCB_Hidden1, + sub_805FB20, + sub_805FB20, + sub_805FB20, + sub_805FB20, + sub_805FB90, + sub_805FB90, + sub_805FB90, + sub_805FB90, + sub_805FC00, + sub_805FC00, + sub_805FC00, + sub_805FC00, + sub_805FC70 +}; + +const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; + +#include "data/field_map_obj/map_object_graphics_info_pointers.h" +#include "data/field_map_obj/field_effect_object_template_pointers.h" +#include "data/field_map_obj/map_object_pic_tables.h" +#include "data/field_map_obj/map_object_anims.h" +#include "data/field_map_obj/base_oam.h" +#include "data/field_map_obj/map_object_subsprites.h" +#include "data/field_map_obj/map_object_graphics_info.h" + +const struct SpritePalette gUnknown_0837377C[] = { + {gMapObjectPalette0, 0x1103}, + {gMapObjectPalette1, 0x1104}, + {gMapObjectPalette2, 0x1105}, + {gMapObjectPalette3, 0x1106}, + {gMapObjectPalette4, 0x1107}, + {gMapObjectPalette5, 0x1108}, + {gMapObjectPalette6, 0x1109}, + {gMapObjectPalette7, 0x110A}, + {gMapObjectPalette8, 0x1100}, + {gMapObjectPalette9, 0x1101}, + {gMapObjectPalette10, 0x1102}, + {gMapObjectPalette11, 0x1115}, + {gMapObjectPalette12, 0x110B}, + {gMapObjectPalette13, 0x110C}, + {gMapObjectPalette14, 0x110D}, + {gMapObjectPalette15, 0x110E}, + {gMapObjectPalette16, 0x110F}, + {gMapObjectPalette17, 0x1110}, + {gMapObjectPalette18, 0x1111}, + {gMapObjectPalette19, 0x1112}, + {gMapObjectPalette20, 0x1113}, + {gMapObjectPalette21, 0x1114}, + {gMapObjectPalette22, 0x1116}, + {gMapObjectPalette23, 0x1117}, + {gMapObjectPalette24, 0x1118}, + {gMapObjectPalette25, 0x1119}, + {gMapObjectPalette26, 0x111A}, + {NULL, 0x0000} +}; + +const u16 Palettes_837385C[] = { + 0x1101, + 0x1101, + 0x1101, + 0x1101 +}; + +const u16 Palettes_8373864[] = { + 0x1111, + 0x1111, + 0x1111, + 0x1111 +}; + +const u16 Palettes_837386C[] = { + 0x1115, + 0x1115, + 0x1115, + 0x1115 +}; + +const struct PairedPalettes gUnknown_08373874[] = { + {0x1100, Palettes_837385C}, + {0x1110, Palettes_837385C}, + {0x1115, Palettes_837386C}, + {0x11FF, NULL} +}; + +const u16 Palettes_8373894[] = { + 0x110C, + 0x110C, + 0x110C, + 0x110C +}; + +const u16 Palettes_837389C[] = { + 0x110D, + 0x110D, + 0x110D, + 0x110D +}; + +const u16 Palettes_83738A4[] = { + 0x110E, + 0x110E, + 0x110E, + 0x110E +}; + +const u16 Palettes_83738AC[] = { + 0x1112, + 0x1112, + 0x1112, + 0x1112 +}; + +const u16 Palettes_83738B4[] = { + 0x1113, + 0x1113, + 0x1113, + 0x1113 +}; + +const u16 Palettes_83738BC[] = { + 0x1114, + 0x1114, + 0x1114, + 0x1114 +}; + +const u16 Palettes_83738C4[] = { + 0x111A, + 0x111A, + 0x111A, + 0x111A +}; + +const u16 Palettes_83738CC[] = { + 0x1117, + 0x1117, + 0x1117, + 0x1117 +}; + +const u16 Palettes_83738D4[] = { + 0x1119, + 0x1119, + 0x1119, + 0x1119 +}; + +const u16 Palettes_83738DC[] = { + 0x1109, + 0x1109, + 0x1109, + 0x1109 +}; + +const struct PairedPalettes gUnknown_083738E4[] = { + {0x1100, Palettes_837385C}, + {0x1110, Palettes_837385C}, + {0x110B, Palettes_8373894}, + {0x110D, Palettes_837389C}, + {0x110E, Palettes_83738A4}, + {0x1112, Palettes_83738AC}, + {0x1113, Palettes_83738B4}, + {0x1114, Palettes_83738BC}, + {0x1116, Palettes_83738CC}, + {0x1118, Palettes_83738D4}, + {0x1105, Palettes_83738DC}, + {0x111A, Palettes_83738C4}, + {0x11FF, NULL} +}; + +const u16 Unknown_837394C[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373960[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373974[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 Unknown_8373988[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A +}; + +const u16 *const gUnknown_0837399C[] = { + Unknown_837394C, + Unknown_8373960, + Unknown_8373974, + Unknown_8373988 +}; + +#include "data/field_map_obj/berry_tree_graphics_tables.h" +#include "data/field_map_obj/field_effect_objects.h" + +const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; +const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; +const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; + +#include "data/field_map_obj/callback_subroutine_pointers.h" + +const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; +const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; +const u8 gUnknown_08375606[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; +const u8 gUnknown_0837560F[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D}; +const u8 gUnknown_08375618[] = {0x10, 0x10, 0x11, 0x12, 0x13, 0x10, 0x10, 0x11, 0x11}; +const u8 gUnknown_08375621[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_0837562A[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_08375633[] = {0x18, 0x18, 0x19, 0x1A, 0x1B, 0x18, 0x18, 0x19, 0x19}; +const u8 gUnknown_0837563C[] = {0x1C, 0x1C, 0x1D, 0x1E, 0x1F, 0x1C, 0x1C, 0x1D, 0x1D}; +const u8 gUnknown_08375645[] = {0x20, 0x20, 0x21, 0x22, 0x23, 0x20, 0x20, 0x21, 0x21}; +const u8 gUnknown_0837564E[] = {0x24, 0x24, 0x25, 0x26, 0x27, 0x24, 0x24, 0x25, 0x25}; +const u8 gUnknown_08375657[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; +const u8 gUnknown_08375660[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; +const u8 gUnknown_08375669[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; +const u8 gUnknown_08375672[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; +const u8 gUnknown_0837567B[] = {0x08, 0x08, 0x07, 0x09, 0x0A, 0x08, 0x08, 0x07, 0x07}; + +bool8 (*const gUnknown_08375684[])(u8) = { + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsWestBlocked, + MetatileBehavior_IsEastBlocked +}; + +bool8 (*const gUnknown_08375694[])(u8) = { + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsEastBlocked, + MetatileBehavior_IsWestBlocked +}; + +const struct Coords16 gDirectionToVector[] = { + { 0, 0}, + { 0, 1}, + { 0, -1}, + {-1, 0}, + { 1, 0}, + {-1, 1}, + { 1, 1}, + {-1, -1}, + { 1, -1} +}; + +const u8 gUnknown_083756C8[] = {0x00, 0x00, 0x01, 0x02, 0x03}; +const u8 gUnknown_083756CD[] = {0x04, 0x04, 0x05, 0x06, 0x07}; +const u8 gUnknown_083756D2[] = {0x08, 0x08, 0x09, 0x0A, 0x0B}; +const u8 gUnknown_083756D7[] = {0x15, 0x15, 0x16, 0x17, 0x18}; +const u8 gUnknown_083756DC[] = {0x29, 0x29, 0x2A, 0x2B, 0x2C}; +const u8 gUnknown_083756E1[] = {0x2D, 0x2D, 0x2E, 0x2F, 0x30}; +const u8 gUnknown_083756E6[] = {0x31, 0x31, 0x32, 0x33, 0x34}; +const u8 gUnknown_083756EB[] = {0x35, 0x35, 0x36, 0x37, 0x38}; +const u8 gUnknown_083756F0[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F}; +const u8 gUnknown_083756F5[] = {0x46, 0x46, 0x47, 0x48, 0x49}; +const u8 gUnknown_083756FA[] = {0x4B, 0x4B, 0x4A, 0x4D, 0x4C}; +const u8 gUnknown_083756FF[] = {0x42, 0x42, 0x43, 0x44, 0x45}; +const u8 gUnknown_08375704[] = {0x3A, 0x3A, 0x3B, 0x3C, 0x3D}; +const u8 gUnknown_08375709[] = {0x19, 0x19, 0x1A, 0x1B, 0x1C}; +const u8 gUnknown_0837570E[] = {0x1D, 0x1D, 0x1E, 0x1F, 0x20}; +const u8 gUnknown_08375713[] = {0x21, 0x21, 0x22, 0x23, 0x24}; +const u8 gUnknown_08375718[] = {0x25, 0x25, 0x26, 0x27, 0x28}; +const u8 gUnknown_0837571D[] = {0x62, 0x62, 0x63, 0x64, 0x65}; +const u8 gUnknown_08375722[] = {0x66, 0x66, 0x67, 0x68, 0x69}; +const u8 gUnknown_08375727[] = {0x6A, 0x6A, 0x6B, 0x6C, 0x6D}; +const u8 gUnknown_0837572C[] = {0x6E, 0x6E, 0x6F, 0x70, 0x71}; +const u8 gUnknown_08375731[] = {0x72, 0x72, 0x73, 0x74, 0x75}; +const u8 gUnknown_08375736[] = {0x76, 0x76, 0x77, 0x78, 0x79}; +const u8 gUnknown_0837573B[] = {0x7A, 0x7A, 0x7B, 0x7C, 0x7D}; +const u8 gUnknown_08375740[] = {0x7E, 0x7E, 0x7F, 0x80, 0x81}; +const u8 gUnknown_08375745[] = {0x82, 0x82, 0x83, 0x84, 0x85}; +const u8 gUnknown_0837574A[] = {0x86, 0x86, 0x87, 0x88, 0x89}; + +const u8 gUnknown_0837574F[] = {2, 1, 4, 3, 8, 7, 6, 5}; + +const u8 gUnknown_08375757[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {3, 4, 2, 1}, + {4, 3, 1, 2} +}; + +const u8 gUnknown_08375767[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {4, 3, 1, 2}, + {3, 4, 2, 1} +}; + +#include "data/field_map_obj/anim_func_ptrs.h" + +// text + +extern void strange_npc_table_clear(void); +extern void ClearPlayerAvatarInfo(void); +extern void npc_load_two_palettes__no_record(u16, u8); +extern void npc_load_two_palettes__and_record(u16, u8); +extern void sub_8060388(s16, s16, s16 *, s16 *); +void sub_80634D0(struct MapObject *, struct Sprite *); +extern void pal_patch_for_npc(u16, u16); +extern void CameraObjectReset1(void); + +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; +extern u8 gReservedSpritePaletteCount; +extern struct Camera gCamera; + +static u8 gUnknown_030005A4; +static u16 gUnknown_030005A6; + +struct MapObject gMapObjects[16]; +#if DEBUG +u8 gUnknown_Debug_03004BC0; +#endif + +void npc_clear_ids_and_state(struct MapObject *mapObj) +{ + memset(mapObj, 0, sizeof(struct MapObject)); + mapObj->localId = 0xFF; + mapObj->mapNum = 0xFF; + mapObj->mapGroup = 0xFF; + mapObj->mapobj_unk_1C = 0xFF; +} + +void npcs_clear_ids_and_state(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + npc_clear_ids_and_state(&gMapObjects[i]); +#if DEBUG + gUnknown_Debug_03004BC0 = 0; +#endif +} + +void sub_805AA98(void) +{ + strange_npc_table_clear(); + npcs_clear_ids_and_state(); + ClearPlayerAvatarInfo(); + sub_805AAB0(); +} + +void sub_805AAB0(void) +{ + u8 spriteId; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); + + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 0); + gSprites[spriteId].invisible = 1; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); + + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 1); + gSprites[spriteId].invisible = 1; +} + +u8 sub_805AB54(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (!gMapObjects[i].active) + break; + } + return i; +} + +u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + if (localId < 255) + return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); + else + return GetFieldObjectIdByLocalId(localId); +} + +bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId) +{ + *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); + if (*mapObjectId == 16) + return TRUE; + else + return FALSE; +} + +u8 GetFieldObjectIdByXY(s16 x, s16 y) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) + break; + } + return i; +} + +u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) + return i; + } + return 16; +} + +u8 GetFieldObjectIdByLocalId(u8 localId) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == localId) + return i; + } + return 16; +} + +// The bitfield at 0x18 needs to be u16 for this function to match +struct MapObjectAlt +{ + /*0x00*/ u32 active:1; + u32 mapobj_bit_1:1; + u32 mapobj_bit_2:1; + u32 mapobj_bit_3:1; + u32 mapobj_bit_4:1; + u32 mapobj_bit_5:1; + u32 mapobj_bit_6:1; + u32 mapobj_bit_7:1; + /*0x01*/ u32 mapobj_bit_8:1; + u32 mapobj_bit_9:1; + u32 mapobj_bit_10:1; + u32 mapobj_bit_11:1; + u32 mapobj_bit_12:1; + u32 mapobj_bit_13:1; + u32 mapobj_bit_14:1; + u32 mapobj_bit_15:1; + /*0x02*/ u32 mapobj_bit_16:1; + u32 mapobj_bit_17:1; + u32 mapobj_bit_18:1; + u32 mapobj_bit_19:1; + u32 mapobj_bit_20:1; + u32 mapobj_bit_21:1; + u32 mapobj_bit_22:1; + u32 mapobj_bit_23:1; + /*0x03*/ u32 mapobj_bit_24:1; + u32 mapobj_bit_25:1; + u32 mapobj_bit_26:1; + u32 mapobj_bit_27:1; + u32 mapobj_bit_28:1; + u32 mapobj_bit_29:1; + u32 mapobj_bit_30:1; + u32 mapobj_bit_31:1; + /*0x04*/ u8 spriteId; + /*0x05*/ u8 graphicsId; + /*0x06*/ u8 animPattern; + /*0x07*/ u8 trainerType; + /*0x08*/ u8 localId; + /*0x09*/ u8 mapNum; + /*0x0A*/ u8 mapGroup; + /*0x0B*/ u8 mapobj_unk_0B_0:4; + u8 elevation:4; + /*0x0C*/ struct Coords16 coords1; + /*0x10*/ struct Coords16 coords2; + /*0x14*/ struct Coords16 coords3; + /*0x18*/ u16 mapobj_unk_18:4; //current direction? + /*0x18*/ u16 placeholder18:4; + /*0x19*/ u16 rangeX:4; + /*0x19*/ u16 rangeY:4; + /*0x1A*/ u8 mapobj_unk_1A; + /*0x1B*/ u8 mapobj_unk_1B; + /*0x1C*/ u8 mapobj_unk_1C; + /*0x1D*/ u8 trainerRange_berryTreeId; + /*0x1E*/ u8 mapobj_unk_1E; + /*0x1F*/ u8 mapobj_unk_1F; + /*0x20*/ u8 mapobj_unk_20; + /*0x21*/ u8 mapobj_unk_21; + /*0x22*/ u8 animId; + /*size = 0x24*/ +}; + +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + struct MapObjectAlt *mapObj; //TODO: resolve the mapobj_unk_19b weirdness + u8 var; + s16 r3; + s16 r2; + + if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) + return 16; + mapObj = (void *)&gMapObjects[var]; + npc_clear_ids_and_state((struct MapObject *)mapObj); + r3 = template->x + 7; + r2 = template->y + 7; + mapObj->active = TRUE; + mapObj->mapobj_bit_2 = TRUE; + mapObj->graphicsId = template->graphicsId; + mapObj->animPattern = template->movementType; + mapObj->localId = template->localId; + mapObj->mapNum = b; + asm("":::"r6"); + mapObj->mapGroup = c; + mapObj->coords1.x = r3; + mapObj->coords1.y = r2; + mapObj->coords2.x = r3; + mapObj->coords2.y = r2; + mapObj->coords3.x = r3; + mapObj->coords3.y = r2; + mapObj->mapobj_unk_0B_0 = template->elevation; + mapObj->elevation = template->elevation; + mapObj->rangeX = template->unkA_0; + mapObj->rangeY = template->unkA_4; + mapObj->trainerType = template->unkC; + mapObj->trainerRange_berryTreeId = template->unkE; + mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; + FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); + asm("":::"r5","r6"); + FieldObjectHandleDynamicGraphicsId((struct MapObject *)mapObj); + if (gUnknown_0836DBBC[mapObj->animPattern] != 0) + { + if (mapObj->rangeX == 0) + mapObj->rangeX++; + if (mapObj->rangeY == 0) + mapObj->rangeY++; + } +#if DEBUG + gUnknown_Debug_03004BC0++; +#endif + return var; +} + +u8 sub_805ADDC(u8 localId) +{ + u8 objectCount; + u8 i; + + if (gMapHeader.events == NULL) + return 16; + objectCount = gMapHeader.events->mapObjectCount; + for (i = 0; i < objectCount; i++) + { + struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; + + if (template->localId == localId && !FlagGet(template->flagId)) + return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + } + return 16; +} + +u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) +{ + u8 i = 0; + + for (i = 0; i < 16 && gMapObjects[i].active; i++) + { + if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) + return 1; + } + if (i >= 16) + return 1; + *d = i; + for (; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) + return 1; + } + return 0; +} + +void RemoveFieldObject(struct MapObject *mapObject) +{ + mapObject->active = FALSE; + RemoveFieldObjectInternal(mapObject); +#if DEBUG + gUnknown_Debug_03004BC0--; +#endif +} + +void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return; + FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId)); + RemoveFieldObject(&gMapObjects[mapObjectId]); +} + +void RemoveFieldObjectInternal(struct MapObject *mapObject) +{ + struct SpriteFrameImage image; + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + + image.size = gfxInfo->size; + gSprites[mapObject->spriteId].images = ℑ + DestroySprite(&gSprites[mapObject->spriteId]); +} + +void npc_hide_all_but_player(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (i != gPlayerAvatar.mapObjectId) + RemoveFieldObject(&gMapObjects[i]); + } +} + +u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) +{ + u8 mapObjectId; + u8 spriteId; + const struct MapObjectGraphicsInfo *gfxInfo; + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d); + if (mapObjectId == 16) + return 16; + + mapObject = &gMapObjects[mapObjectId]; + gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (gfxInfo->paletteSlot == 0) + npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + else if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (mapObject->animPattern == 0x4C) + mapObject->mapobj_bit_13 = TRUE; + +#ifdef NONMATCHING + sprTemplate->paletteTag = 0xFFFF; +#else + *(u16 *)&sprTemplate->paletteTag = 0xFFFF; +#endif + spriteId = CreateSprite(sprTemplate, 0, 0, 0); + if (spriteId == 64) + { +#if DEBUG + gUnknown_Debug_03004BC0--; +#endif + gMapObjects[mapObjectId].active = FALSE; + return 16; + } + sprite = &gSprites[spriteId]; + sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = mapObjectId; + mapObject->spriteId = spriteId; + mapObject->mapobj_bit_12 = gfxInfo->inanimate; + if (!mapObject->mapobj_bit_12) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); + sub_80634D0(mapObject, sprite); + return mapObjectId; +} + +u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) +{ + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables = NULL; + struct SpriteFrameImage spriteFrameImage; + const struct MapObjectGraphicsInfo *gfxInfo; + u8 mapObjectId; + + gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId); + MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = gfxInfo->size; + spriteTemplate.images = &spriteFrameImage; + mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e); + if (mapObjectId == 16) + return 16; + gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images; + if (subspriteTables != NULL) + SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); + return mapObjectId; +} + +u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate) +{ + s16 x; + s16 y; + + GetFieldObjectMovingCameraOffset(&x, &y); + return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); +} + +u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f) +{ + struct MapObjectTemplate mapObjTemplate; + + d -= 7; + e -= 7; + mapObjTemplate.localId = c; + mapObjTemplate.graphicsId = a; + mapObjTemplate.unk2 = 0; + mapObjTemplate.x = d; + mapObjTemplate.y = e; + mapObjTemplate.elevation = f; + mapObjTemplate.movementType = b; + mapObjTemplate.unkA_0 = 0; + mapObjTemplate.unkA_4 = 0; + mapObjTemplate.unkC = 0; + mapObjTemplate.unkE = 0; + return SpawnSpecialFieldObject(&mapObjTemplate); +} + +u8 show_sprite(u8 a, u8 b, u8 c) +{ + struct MapObjectTemplate *r5; + s16 x; + s16 y; + + r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c); + if (r5 == NULL) + return 16; + GetFieldObjectMovingCameraOffset(&x, &y); + return SpawnFieldObject(r5, b, c, x, y); +} + +void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + + sprTemplate->tileTag = gfxInfo->tileTag; + sprTemplate->paletteTag = gfxInfo->paletteTag1; + sprTemplate->oam = gfxInfo->oam; + sprTemplate->anims = gfxInfo->anims; + sprTemplate->images = gfxInfo->images; + sprTemplate->affineAnims = gfxInfo->affineAnims; + sprTemplate->callback = callback; + *subspriteTables = gfxInfo->subspriteTables; +} + +void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables); +} + +void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); +} + +u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); + if (spriteTemplate.paletteTag != 0xFFFF) + sub_805BDF8(spriteTemplate.paletteTag); + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); + if (spriteId != 64 && subspriteTables != NULL) + { + SetSubspriteTables(&gSprites[spriteId], subspriteTables); + gSprites[spriteId].subspriteMode = 2; + } + return spriteId; +} + +extern void sub_8064970(struct Sprite *); +extern void sub_8060470(s16 *, s16 *, s16, s16); +void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z); + +u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) +{ + const struct MapObjectGraphicsInfo *gfxInfo; + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8064970, &spriteTemplate, &subspriteTables); +#ifdef NONMATCHING + spriteTemplate.paletteTag = 0xFFFF; +#else + *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; +#endif + x += 7; + y += 7; + sub_8060470(&x, &y, 8, 16); + spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); + if (spriteId != 64) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.y += sprite->centerToCornerVecY; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = b; + sprite->data[1] = elevation; + if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (subspriteTables != NULL) + { + SetSubspriteTables(sprite, subspriteTables); + sprite->subspriteMode = 2; + } + InitObjectPriorityByZCoord(sprite, elevation); + SetObjectSubpriorityByZCoord(elevation, sprite, 1); + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); + } + return spriteId; +} + +void sub_805B55C(s16 a, s16 b) +{ + u8 i; + + if (gMapHeader.events != NULL) + { + s16 r9 = gSaveBlock1.pos.x - 2; + s16 sp8 = gSaveBlock1.pos.x + 17; + s16 r10 = gSaveBlock1.pos.y; + s16 spC = gSaveBlock1.pos.y + 16; + u8 objectCount = gMapHeader.events->mapObjectCount; + + for (i = 0; i < objectCount; i++) + { + struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; + s16 foo = template->x + 7; + s16 bar = template->y + 7; + + if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo + && !FlagGet(template->flagId)) + SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b); + } + } +} + +void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject); + +void RemoveFieldObjectsOutsideView(void) +{ + u8 i; + u8 j; + + for (i = 0; i < 16; i++) + { + bool8 isActiveLinkPlayer; + + for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) + { + if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) + isActiveLinkPlayer = TRUE; + } + if (!isActiveLinkPlayer) + { + struct MapObject *mapObject = &gMapObjects[i]; + + if (mapObject->active && !mapObject->mapobj_bit_16) + RemoveFieldObjectIfOutsideView(mapObject); + } + } +} + +void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) +{ + s16 r7 = gSaveBlock1.pos.x - 2; + s16 r5 = gSaveBlock1.pos.x + 17; + s16 r4 = gSaveBlock1.pos.y; + s16 r6 = gSaveBlock1.pos.y + 16; + + if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5 + && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6) + return; + if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5 + && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6) + return; + RemoveFieldObject(mapObject); +} + +void sub_805B75C(u8, s16, s16); + +void sub_805B710(u16 a, u16 b) +{ + u8 i; + +#if DEBUG + gUnknown_Debug_03004BC0 = 0; +#endif + ClearPlayerAvatarInfo(); + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active) + { + sub_805B75C(i, a, b); +#if DEBUG + gUnknown_Debug_03004BC0++; +#endif + } + } + sub_805AAB0(); +} + +extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); +extern void sub_805B914(struct MapObject *); + +void sub_805B75C(u8 a, s16 b, s16 c) +{ + struct SpriteTemplate sp0; + struct SpriteFrameImage sp18; + const struct SubspriteTable *subspriteTables; + const struct MapObjectGraphicsInfo *gfxInfo; + struct MapObject *mapObject; + u8 spriteId; + + #define i spriteId + for (i = 0; i < 4; i++) + { + if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId) + return; + } + #undef i + + mapObject = &gMapObjects[a]; + asm("":::"r5"); + subspriteTables = NULL; + gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sp18.size = gfxInfo->size; + MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables); + sp0.images = &sp18; + *(u16 *)&sp0.paletteTag = 0xFFFF; + if (gfxInfo->paletteSlot == 0) + npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (gfxInfo->paletteSlot > 9) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + *(u16 *)&sp0.paletteTag = 0xFFFF; + spriteId = CreateSprite(&sp0, 0, 0, 0); + if (spriteId != 64) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sprite->images = gfxInfo->images; + if (mapObject->animPattern == 11) + { + SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId); + mapObject->mapobj_unk_1B = sub_8126B54(); + } + if (subspriteTables != NULL) + SetSubspriteTables(sprite, subspriteTables); + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = a; + mapObject->spriteId = spriteId; + if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + sub_805B914(mapObject); + SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); + } +} + +void sub_805B914(struct MapObject *mapObject) +{ + mapObject->mapobj_bit_1 = FALSE; + mapObject->mapobj_bit_2 = TRUE; + mapObject->mapobj_bit_22 = FALSE; + mapObject->mapobj_bit_17 = FALSE; + mapObject->mapobj_bit_18 = FALSE; + mapObject->mapobj_bit_19 = FALSE; + mapObject->mapobj_bit_20 = FALSE; + mapObject->mapobj_bit_21 = FALSE; + FieldObjectClearAnim(mapObject); +} + +void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) +{ + gPlayerAvatar.mapObjectId = mapObjectId; + gPlayerAvatar.spriteId = spriteId; + gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); + SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); +} + +void sub_805B980(struct MapObject *mapObject, u8 graphicsId) +{ + const struct MapObjectGraphicsInfo *gfxInfo; + struct Sprite *sprite; + + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + sprite = &gSprites[mapObject->spriteId]; + if (gfxInfo->paletteSlot == 0) + pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + if (gfxInfo->paletteSlot == 10) + npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); + sprite->oam.shape = gfxInfo->oam->shape; + sprite->oam.size = gfxInfo->oam->size; + sprite->images = gfxInfo->images; + sprite->anims = gfxInfo->anims; + sprite->subspriteTables = gfxInfo->subspriteTables; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + mapObject->mapobj_bit_12 = gfxInfo->inanimate; + mapObject->graphicsId = graphicsId; + sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + if (mapObject->mapobj_bit_15) + CameraObjectReset1(); +} + +void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + sub_805B980(&gMapObjects[mapObjectId], graphicsId); +} + +void FieldObjectTurn(struct MapObject *mapObject, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + if (!mapObject->mapobj_bit_12) + { + StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); + SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); + } +} + +void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + FieldObjectTurn(&gMapObjects[mapObjectId], direction); +} + +void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction) +{ + FieldObjectTurn(&gMapObjects[player->mapObjectId], direction); +} + +void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 treeStage; + u8 treeId; + + mapObject->mapobj_bit_13 = TRUE; + sprite->invisible = TRUE; + treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); + if (treeStage != 0) + { + mapObject->mapobj_bit_13 = FALSE; + sprite->invisible = FALSE; + treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; + treeStage--; + if (treeId > 0x2B) + treeId = 0; + sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]); + sprite->images = gBerryTreePicTablePointers[treeId]; + sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage]; + StartSpriteAnim(sprite, treeStage); + } +} + +const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) +{ + if (graphicsId > 0xEF) + graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16); + if (graphicsId > 0xD9) + graphicsId = 5; + return gMapObjectGraphicsInfoPointers[graphicsId]; +} + +void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) +{ + if (mapObject->graphicsId > 0xEF) + mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16); +} + +void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + gMapObjects[mapObjectId].mapobj_bit_13 = d; +} + +void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) +{ + *(u8 *)localId = mapObject->localId; + *(u8 *)mapNum = mapObject->mapNum; + *(u8 *)mapGroup = mapObject->mapGroup; +} + +void sub_805BCC0(s16 x, s16 y) +{ + u8 mapObjectId; + struct MapObject *mapObject; + + mapObjectId = GetFieldObjectIdByXY(x, y); + if (mapObjectId != 16) + { + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_2 = TRUE; + } +} + +void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) +{ + u8 mapObjectId; + struct MapObject *mapObject; + struct Sprite *sprite; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + mapObject = &gMapObjects[mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + mapObject->mapobj_bit_26 = TRUE; + sprite->subpriority = subpriority; + } +} + +void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + struct MapObject *mapObject; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_26 = FALSE; + mapObject->mapobj_bit_2 = TRUE; + } +} + +void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 mapObjectId; + struct Sprite *sprite; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + } +} + +void gpu_pal_allocator_reset__manage_upper_four(void) +{ + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 12; +} + +void sub_805BDF8(u16 tag) +{ + u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag); + + if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8 + sub_805BE58(&gUnknown_0837377C[paletteIndex]); +} + +void unref_sub_805BE24(u16 *arr) +{ + u8 i; + + for (i = 0; arr[i] != 0x11FF; i++) + sub_805BDF8(arr[i]); +} + +u8 sub_805BE58(const struct SpritePalette *palette) +{ + if (IndexOfSpritePaletteTag(palette->tag) != 0xFF) + return 0xFF; + else + return LoadSpritePalette(palette); +} + +void pal_patch_for_npc(u16 a, u16 b) +{ + u8 var = b; + u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a); + + LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20); +} + +void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c) +{ + for (; b < c; arr++, b++) + pal_patch_for_npc(*arr, b); +} + +u8 FindFieldObjectPaletteIndexByTag(u16 tag) +{ + u8 i; + + for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++) + { + if (gUnknown_0837377C[i].tag == tag) + return i; + } + return 0xFF; +} + +void npc_load_two_palettes__no_record(u16 a, u8 b) +{ + u8 i; + + pal_patch_for_npc(a, b); + for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++) + { + if (gUnknown_08373874[i].tag == a) + { + pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); + break; + } + } +} + +void npc_load_two_palettes__and_record(u16 a, u8 b) +{ + u8 i; + + gUnknown_030005A6 = a; + pal_patch_for_npc(a, b); + for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) + { + if (gUnknown_083738E4[i].tag == a) + { + pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); + break; + } + } +} + +void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = mapObject->coords2.x; + mapObject->coords3.y = mapObject->coords2.y; + mapObject->coords2.x += x; + mapObject->coords2.y += y; +} + +void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = mapObject->coords2.x; + mapObject->coords3.y = mapObject->coords2.y; + mapObject->coords2.x = x; + mapObject->coords2.y = y; +} + +void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) +{ + mapObject->coords3.x = x; + mapObject->coords3.y = y; + mapObject->coords2.x = x; + mapObject->coords2.y = y; +} + +void sub_805C058(struct MapObject *mapObject, s16 x, s16 y) +{ + struct Sprite *sprite = &gSprites[mapObject->spriteId]; + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + + npc_coords_set(mapObject, x, y); + sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); + sprite->centerToCornerVecX = -(gfxInfo->width >> 1); + sprite->centerToCornerVecY = -(gfxInfo->height >> 1); + sprite->pos1.x += 8; + sprite->pos1.y += 16 + sprite->centerToCornerVecY; + sub_805B914(mapObject); + if (mapObject->mapobj_bit_15) + CameraObjectReset1(); +} + +void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + x += 7; + y += 7; + sub_805C058(&gMapObjects[mapObjectId], x, y); + } +} + +void npc_coords_shift_still(struct MapObject *mapObject) +{ + npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); +} + +void UpdateFieldObjectCoordsForCameraUpdate(void) +{ + u8 i; + s16 deltaX; + s16 deltaY; + + if (gCamera.field_0) + { + deltaX = gCamera.x; + deltaY = gCamera.y; + for (i = 0; i < 16; i++) + { + + if (gMapObjects[i].active) + { + gMapObjects[i].coords1.x -= deltaX; + gMapObjects[i].coords1.y -= deltaY; + gMapObjects[i].coords2.x -= deltaX; + gMapObjects[i].coords2.y -= deltaY; + gMapObjects[i].coords3.x -= deltaX; + gMapObjects[i].coords3.y -= deltaY; + } + } + } +} + +bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); + +u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y + && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) + return i; + } + return 16; +} + +bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) +{ + if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 + && mapObject->mapobj_unk_0B_0 != z) + return FALSE; + else + return TRUE; +} + +void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) +{ + UpdateFieldObjectCoordsForCameraUpdate(); + sub_805B55C(x, y); + RemoveFieldObjectsOutsideView(); +} + +u8 AddCameraObject(u8 a) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4); + + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[0] = a; + return spriteId; +} + +void ObjectCB_CameraObject(struct Sprite *sprite) +{ + void (*cameraObjectFuncs[3])(struct Sprite *); + memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs); + cameraObjectFuncs[sprite->data[1]](sprite); +} + +void CameraObject_0(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->invisible = TRUE; + sprite->data[1] = 1; + CameraObject_1(sprite); +} + +void CameraObject_1(struct Sprite *sprite) +{ + s16 x = gSprites[sprite->data[0]].pos1.x; + s16 y = gSprites[sprite->data[0]].pos1.y; + + sprite->data[2] = x - sprite->pos1.x; + sprite->data[3] = y - sprite->pos1.y; + sprite->pos1.x = x; + sprite->pos1.y = y; +} + +void CameraObject_2(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->data[2] = 0; + sprite->data[3] = 0; +} + +struct Sprite *FindCameraObject(void) +{ + u8 i; + + for (i = 0; i < 64; i++) + { + if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) + return &gSprites[i]; + } + return NULL; +} + +void CameraObjectReset1(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite != NULL) + { + cameraSprite->data[1] = 0; + cameraSprite->callback(cameraSprite); + } +} + +void CameraObjectSetFollowedObjectId(u8 spriteId) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite != NULL) + { + cameraSprite->data[0] = spriteId; + CameraObjectReset1(); + } +} + +u8 CameraObjectGetFollowedObjectId(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + if (cameraSprite == NULL) + return 64; + else + return cameraSprite->data[0]; +} + +void CameraObjectReset2(void) +{ + struct Sprite *cameraSprite = FindCameraObject(); + + cameraSprite->data[1] = 2; +} + +u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < 64; i++) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *src; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + break; + } + } + return i; +} + +u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority) +{ + s16 i; + + for (i = 63; i > -1; i--) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *src; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + return i; + } + } + return 64; +} + +void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) +{ + mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; + if (!mapObject->mapobj_bit_9) + { + s8 _direction = direction; //needed for the asm to match + mapObject->mapobj_unk_18 = _direction; + } + mapObject->placeholder18 = direction; +} + +u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + + return template->script; +} + +u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) +{ + return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); +} + +u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + + return template->flagId; +} + +u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) +{ + return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); +} + +u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return 0xFF; + else + return gMapObjects[mapObjectId].trainerType; +} + +u8 unref_sub_805C60C(u8 mapObjectId) +{ + return gMapObjects[mapObjectId].trainerType; +} + +u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + return 0xFF; + else + return gMapObjects[mapObjectId].trainerRange_berryTreeId; +} + +u8 FieldObjectGetBerryTreeId(u8 mapObjectId) +{ + return gMapObjects[mapObjectId].trainerRange_berryTreeId; +} + +struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8); + +struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup) + return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount); + else + { + struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); + + return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount); + } +} + +struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) +{ + u8 i; + + for (i = 0; i < count; i++) + { + if (templates[i].localId == localId) + return &templates[i]; + } + return NULL; +} + +struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject) +{ + s32 i; + + if (mapObject->mapNum != gSaveBlock1.location.mapNum + || mapObject->mapGroup != gSaveBlock1.location.mapGroup) + return NULL; + + for (i = 0; i < 64; i++) + { + if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId) + return &gSaveBlock1.mapObjectTemplates[i]; + } + return NULL; +} + +void sub_805C754(struct MapObject *mapObject) +{ + struct MapObjectTemplate *template = sub_805C700(mapObject); + + if (template != NULL) + { + template->x = mapObject->coords2.x - 7; + template->y = mapObject->coords2.y - 7; + } +} + +void sub_805C774(struct MapObject *mapObject, u8 movementType) +{ + struct MapObjectTemplate *template = sub_805C700(mapObject); + + if (template != NULL) + template->movementType = movementType; +} + +void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + sub_805C754(&gMapObjects[mapObjectId]); +} + +void sub_805C7C4(u8 a) +{ + gpu_pal_allocator_reset__manage_upper_four(); + gUnknown_030005A6 = 0x11FF; + gUnknown_030005A4 = a; + pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10); +} + +u16 npc_paltag_by_palslot(u8 a) +{ + u8 i; + + if (a < 10) + return gUnknown_0837399C[gUnknown_030005A4][a]; + + for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) + { + if (gUnknown_083738E4[i].tag == gUnknown_030005A6) + { + return gUnknown_083738E4[i].data[gUnknown_030005A4]; + } + } + return 0x11FF; +} + +fieldmap_object_null_cb(sub_805C884, sub_805C8A8); +fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224); + +u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); + +u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); +void sub_8064820(struct Sprite *, s16); + +u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +extern u8 sub_8064824(struct Sprite *); + +u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +extern u8 sub_805FF20(struct MapObject *, u8); + +u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + direction = directions[Random() & 3]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) +{ + s16 x; + s16 y; + s16 objx; + s16 objy; + s16 minx; + s16 maxx; + s16 miny; + s16 maxy; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0) + { + return 0; + } + if (mapObject->trainerType != 1 && mapObject->trainerType != 3) + { + return 0; + } + PlayerGetDestCoords(&x, &y); + objx = mapObject->coords2.x; + objy = mapObject->coords2.y; + minx = objx - mapObject->trainerRange_berryTreeId; + miny = objy - mapObject->trainerRange_berryTreeId; + maxx = objx + mapObject->trainerRange_berryTreeId; + maxy = objy + mapObject->trainerRange_berryTreeId; + if (minx > x || maxx < x || miny > y || maxy < y) + { + return 0; + } + return 1; +} + +u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + if (a2 > a3) + { + dirn = DIR_EAST; + if (a0 < 0) + { + dirn = DIR_WEST; + } + } + else + { + dirn = DIR_SOUTH; + if (a1 < 0) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = DIR_SOUTH; + if (a1 < 0) + { + dirn = DIR_NORTH; + } + return dirn; +} + +u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = DIR_EAST; + if (a0 < 0) + { + dirn = DIR_WEST; + } + return dirn; +} + +u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = DIR_NORTH; + } + } + else if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = DIR_NORTH; + } + } + else if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = DIR_NORTH; + } + } + return dirn; +} + +u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = DIR_SOUTH; + } + } + else if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = DIR_SOUTH; + } + } + return dirn; +} + +u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) { + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = DIR_SOUTH; + } + } + else if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = DIR_SOUTH; + } + } + return dirn; +} + +u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_EAST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_WEST) + { + dirn = sub_805CADC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_SOUTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3) +{ + u8 dirn; + dirn = sub_805CAAC(a0, a1, a2, a3); + if (dirn == DIR_NORTH) + { + dirn = sub_805CAEC(a0, a1, a2, a3); + } + return dirn; +} + +u8 sub_805CD60(struct MapObject *mapObject, u8 a1) +{ + s16 x; + s16 y; + s16 x2; + s16 y2; + if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + return 0; + } + PlayerGetDestCoords(&x, &y); + x -= mapObject->coords2.x; + y -= mapObject->coords2.y; + x2 = x; + y2 = y; + if (x2 < 0) + { + x2 = -x2; + } + if (y2 < 0) + { + y2 = -y2; + } + return gUnknown_08375244[a1](x, y, x2, y2); +} + +fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270); + +u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284); + +u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752A0, 2); + direction = directions[Random() & 1]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4); + +u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) + { + return 0; + } + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + sprite->data[1] = 3; + return 1; +} + +u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) != 0) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752C0, 2); + direction = directions[Random() & 1]; + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 5; + if (sub_805FF20(mapObject, direction) != 0) + { + sprite->data[1] = 1; + } + return 1; +} + +u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 6; + return 1; +} + +u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4); + +u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) + { + sprite->data[1] = 2; + return 1; + } + return 0; +} + +u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + return 0; +} + +u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite); + +void FieldObjectCB_BerryTree(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (!(sprite->data[7] & 1)) + { + get_berry_tree_graphics(mapObject, sprite); + sprite->data[7] |= 1; + } + meta_step(mapObject, sprite, sub_805D314); +} + +u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite) +{ + return gUnknown_083752D0[sprite->data[1]](mapObject, sprite); +} + +u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 berryTreeStage; + npc_reset(mapObject, sprite); + mapObject->mapobj_bit_13 = 1; + sprite->invisible = 1; + berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); + if (!berryTreeStage) + { + if (!(sprite->data[7] & 4) && sprite->animNum == 4) + { + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); + sprite->animNum = 0; + } + return 0; + } + mapObject->mapobj_bit_13 = 0; + sprite->invisible = 0; + berryTreeStage--; + if (sprite->animNum != berryTreeStage) + { + sprite->data[1] = 2; + return 1; + } + get_berry_tree_graphics(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, 0x39); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 0; + return 1; + } + return 0; +} + +u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 3; + sprite->data[2] = 0; + sprite->data[7] |= 2; + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); + return 1; +} + +u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[2]++; + mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); + sprite->animPaused = 1; + if (sprite->data[2] > 64) + { + get_berry_tree_graphics(mapObject, sprite); + sprite->data[1] = 4; + sprite->data[2] = 0; + return 1; + } + return 0; +} + +u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[2]++; + mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); + sprite->animPaused = 1; + if (sprite->data[2] > 64) + { + sprite->data[1] = 0; + sprite->data[7] &= (-3); + return 1; + } + return 0; +} + +fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4); + +u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752A0, 2); + direction = sub_805CD60(mapObject, 1); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8); + +u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_083752C0, 2); + direction = sub_805CD60(mapObject, 2); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C); + +u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375320, 2); + direction = sub_805CD60(mapObject, 3); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324); + +u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375338, 2); + direction = sub_805CD60(mapObject, 4); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C); + +u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375350, 2); + direction = sub_805CD60(mapObject, 5); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354); + +u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUnknown_08375368, 2); + direction = sub_805CD60(mapObject, 6); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C); + +u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375380, 4); + direction = sub_805CD60(mapObject, 7); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384); + +u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_08375398, 4); + direction = sub_805CD60(mapObject, 8); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C); + +u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_083753B0, 4); + direction = sub_805CD60(mapObject, 9); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4); + +u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 4; + return 1; + } + return 0; +} + +u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUnknown_083753C8, 4); + direction = sub_805CD60(mapObject, 10); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC); + +u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, 0x30); + sprite->data[1] = 2; + } + return 0; +} + +u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gUnknown_083753DC, 5); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[mapObject->mapobj_unk_18]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 0; + return 1; +} + +fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4); + +u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sub_8064820(sprite, 0x30); + sprite->data[1] = 2; + } + return 0; +} + +u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) + { + sprite->data[1] = 3; + } + return 0; +} + +u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gUnknown_083753F4, 5); + direction = sub_805CD60(mapObject, 0); + if (direction == 0) + { + direction = directions[mapObject->mapobj_unk_18]; + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 0; + return 1; +} + +fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC); + +u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 direction; + direction = gUnknown_0836DC09[mapObject->animPattern]; + if (mapObject->mapobj_unk_21 != 0) + { + direction = GetOppositeDirection(direction); + } + FieldObjectSetDirection(mapObject, direction); + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 v0; + u8 goSpeed0AnimId; + if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 0; + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + } + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + if (v0 == 1) + { + mapObject->mapobj_unk_21 ++; + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + } + if (v0 != 0) + { + goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); + } + FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 3; + return 1; +} + +u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + sprite->data[1] = 1; + return 1; +} + +u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence) +{ + u8 v0; + u8 goSpeed0AnimId; + if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 0; + } + FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + if (v0 == 1) + { + mapObject->mapobj_unk_21 ++; + FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); + goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); + v0 = sub_805FF20(mapObject, mapObject->placeholder18); + } + if (v0 != 0) + { + goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); + } + FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C); + +u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375418, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C); + +u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375428, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C); + +u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375438, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C); + +u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375448, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + + + +fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C); + +u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375458, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C); + +u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375468, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C); + +u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375240, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478); + +u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375484, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488); + +u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375494, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498); + +u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754A4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8); + +u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754B4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8); + +u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754C4, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8); + +u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754D4, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8); + +u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754E4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8); + +u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_083754F4, 4); + if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 2; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8); + +u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375504, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508); + +u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375514, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518); + +u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375524, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528); + +u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375534, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538); + +u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375544, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548); + +u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375554, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558); + +u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375564, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568); + +u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375574, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +} + +fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578); + +u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 directions[4]; + memcpy(directions, gUnknown_08375584, 4); + if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) + { + mapObject->mapobj_unk_21 = 3; + } + return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); +}; + +fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588); + +u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + if (mapObject->mapobj_unk_21 == 0) + { + mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); + } + sprite->data[1] = 1; + return 1; +} + +u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + { + return 0; + } + return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); +} + +u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + mapObject->mapobj_bit_1 = 0; + sprite->data[1] = 1; + } + return 0; +} + +bool8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + return 0; +} + +bool8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2))); + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +bool8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = a2; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); + if (npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = 1; + sprite->data[1] = 2; + return 1; +} + +bool8 sub_805F4F0(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_8060744(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F5A8(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806079C(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F660(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80607C8(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806084C(direction)); + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 sub_805F760(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80608A4(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + x = mapObject->coords2.x; + y = mapObject->coords2.y; + sub_8060320(direction, &x, &y, 2, 2); + FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data[1] = 2; + return TRUE; +} + +fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); + +u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + { + return 0; + } + return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); +} + +u8 sub_805F9F8(struct MapObject *, struct Sprite *); + +void FieldObjectCB_TreeDisguise(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) + { + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); + mapObject->mapobj_unk_21 = 1; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); +} + +u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + return 0; +} + +void FieldObjectCB_MountainDisguise(struct Sprite *sprite) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) + { + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); + mapObject->mapobj_unk_21 = 1; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); +} + +u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite); + +void FieldObjectCB_Hidden1(struct Sprite *sprite) +{ + if (sprite->data[7] == 0) + { + gMapObjects[sprite->data[0]].mapobj_bit_26 = 1; + sprite->subspriteMode = 2; + sprite->oam.priority = 3; + sprite->data[7] ++; + } + meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805FAD8); +} + +u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + return gUnknown_083755CC[sprite->data[1]](mapObject, sprite); +} + +u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + return 0; +} + +u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 0; + } + return 0; +} + +fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0); + +u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8); + +u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0); + +u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); + sprite->data[1] = 1; + return 1; +} + +fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8); + +u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_reset(mapObject, sprite); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); + mapObject->mapobj_bit_13 = 1; + sprite->data[1] = 1; + return 1; +} + +u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectExecRegularAnim(mapObject, sprite)) + { + sprite->data[1] = 2; + return 1; + } + return 0; +} + +u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + return 0; +} + +void sub_805FC70(struct Sprite *sprite); + +void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_1 = 0; + mapObject->mapobj_bit_6 = 0; + mapObject->mapobj_bit_7 = 0; + mapObject->mapobj_unk_1C = 0xff; + sprite->data[1] = 0; +} + +u8 FieldObjectDirectionToImageAnimId(u8 direction) +{ + return gUnknown_083755F4[direction]; +} + +u8 get_go_image_anim_num(u8 direction) +{ + return gUnknown_083755FD[direction]; +} + +u8 get_go_fast_image_anim_num(u8 direction) +{ + return gUnknown_08375606[direction]; +} + +u8 get_go_faster_image_anim_num(u8 direction) +{ + return gUnknown_0837560F[direction]; +} + +u8 sub_805FD78(u8 direction) +{ + return gUnknown_08375618[direction]; +} + +u8 sub_805FD88(u8 direction) +{ + return gUnknown_08375621[direction]; +} + +u8 sub_805FD98(u8 direction) +{ + return gUnknown_0837562A[direction]; +} + +u8 unref_sub_805FDA8(u8 direction) +{ + return gUnknown_08375633[direction]; +} + +u8 sub_805FDB8(u8 direction) +{ + return gUnknown_0837563C[direction]; +} + +u8 sub_805FDC8(u8 direction) +{ + return gUnknown_08375645[direction]; +} + +u8 sub_805FDD8(u8 direction) +{ + return gUnknown_0837564E[direction]; +} + +u8 sub_805FDE8(u8 direction) +{ + return gUnknown_08375657[direction]; +} + +u8 sub_805FDF8(u8 direction) +{ + return gUnknown_08375660[direction]; +} + +u8 sub_805FE08(u8 direction) +{ + return gUnknown_08375669[direction]; +} + +u8 get_run_image_anim_num(u8 direction) +{ + return gUnknown_08375672[direction]; +} + +void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) +{ + if (!mapObject->mapobj_bit_12) + { + sprite->animNum = animNum; + if (sprite->animCmdIndex == 1) + { + sprite->animCmdIndex = 2; + } else if (sprite->animCmdIndex == 3) + { + sprite->animCmdIndex = 0; + } + SeekSpriteAnim(sprite, sprite->animCmdIndex); + } +} + +void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) +{ + u8 animCmdIndex; + if (!mapObject->mapobj_bit_12) + { + sprite->animNum = animNum; + animCmdIndex = 3; + if (sprite->animCmdIndex < 2) + { + animCmdIndex = 1; + } + SeekSpriteAnim(sprite, animCmdIndex); + } +} + +u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3) +{ + if (a0 > a2) + { + return DIR_WEST; + } else if (a0 < a2) + { + return DIR_EAST; + } else if (a1 > a3) + { + return DIR_NORTH; + } else + { + return DIR_SOUTH; + } +} + +void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) +{ + mapObject->animPattern = animPattern; + mapObject->mapobj_unk_21 = 0; + mapObject->animId = 0; + gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern]; + gSprites[mapObject->spriteId].data[1] = 0; +} + +u8 npc_running_behaviour_by_direction(u8 direction) +{ + return gUnknown_0837567B[direction]; +} + +u8 sub_805FF20(struct MapObject *mapObject, u8 direction) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + MoveCoords(direction, &x, &y); + return npc_block_way(mapObject, x, y, direction); +} + +bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y); +static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y); +bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); + +u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) +{ + u8 direction; + direction = dirn; + if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) + return 1; + else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) + return 2; + else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) + return 2; + else if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) + return 3; + else if (DoesObjectCollideWithObjectAt(mapObject, x, y)) + return 4; + return 0; +} + +u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + u8 flags = 0; + + if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) + flags |= 1; + if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) + flags |= 2; + if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) + flags |= 4; + if (DoesObjectCollideWithObjectAt(mapObject, x, y)) + flags |= 8; + return flags; +} + +bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y) +{ + s16 minv; + s16 maxv; + + if (mapObject->range.as_nybbles.x != 0) + { + minv = mapObject->coords1.x - (mapObject->range.as_nybbles.x); + maxv = mapObject->coords1.x + (mapObject->range.as_nybbles.x); + if (minv > x || maxv < x) + return TRUE; + } + if (mapObject->range.as_nybbles.y != 0) + { + minv = mapObject->coords1.y - (mapObject->range.as_nybbles.y); + maxv = mapObject->coords1.y + (mapObject->range.as_nybbles.y); + if (minv > y || maxv < y) + return TRUE; + } + return FALSE; +} + +bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +{ + if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) + { + return 1; + } + return 0; +} + +static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + struct MapObject *mapObject2 = &gMapObjects[i]; + + if (mapObject2->active && mapObject2 != mapObject) + { + if (((mapObject2->coords2.x == x && mapObject2->coords2.y == y) || (mapObject2->coords3.x == x && mapObject2->coords3.y == y)) + && AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0)) + return TRUE; + } + } + return 0; +} + +// this function is only used in berry.c, but its unknown whether its intended context is the berry tree check or if its checking for the flickering. +bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + if (gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 2) + return TRUE; + + return FALSE; +} + +void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 mapObjectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) + { + gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 4; + } +} + +void MoveCoords(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVector[direction].x; + *y += gDirectionToVector[direction].y; +} + +void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVector[direction].x << 4; + *y += gDirectionToVector[direction].y << 4; +} + +void sub_8060320(u32 dirn, s16 *x, s16 *y, s16 deltaX, s16 deltaY) +{ + u8 direction = dirn; + s16 dx2 = deltaX; + s16 dy2 = deltaY; + if (gDirectionToVector[direction].x > 0) + { + *x += dx2; + } + if (gDirectionToVector[direction].x < 0) + { + *x -= dx2; + } + if (gDirectionToVector[direction].y > 0) + { + *y += dy2; + } + if (gDirectionToVector[direction].y < 0) + { + *y -= dy2; + } +} + +void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2) +{ + *x2 = (x1 - gSaveBlock1.pos.x) << 4; + *y2 = (y1 - gSaveBlock1.pos.y) << 4; + *x2 -= gUnknown_0300489C; + *y2 -= gUnknown_03004898; +} + +void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2) +{ + s16 x3; + s16 y3; + x3 = -gUnknown_0300489C - gUnknown_03004880.unk10; + y3 = -gUnknown_03004898 - gUnknown_03004880.unk14; + if (gUnknown_03004880.unk10 > 0) + { + x3 += 0x10; + } + if (gUnknown_03004880.unk10 < 0) + { + x3 -= 0x10; + } + if (gUnknown_03004880.unk14 > 0) + { + y3 += 0x10; + } + if (gUnknown_03004880.unk14 < 0) + { + y3 -= 0x10; + } + *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3; + *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3; +} + +void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy) +{ + sub_80603CC(*x, *y, x, y); + *x += dx; + *y += dy; +} + +void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) +{ + *x = 0; + *y = 0; + if (gUnknown_03004880.unk10 > 0) + { + (*x)++; + } + if (gUnknown_03004880.unk10 < 0) + { + (*x)--; + } + if (gUnknown_03004880.unk14 > 0) + { + (*y)++; + } + if (gUnknown_03004880.unk14 < 0) + { + (*y)--; + } +} + +void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 direction, s16 *x, s16 *y) +{ + u8 newDirn = direction; + *x = mapObject->coords2.x; + *y = mapObject->coords2.y; + MoveCoords(newDirn, x, y); +} + +bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) + { + return TRUE; + } + return FALSE; +} + +bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff) + { + return TRUE; + } + return FALSE; +} + +bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) +{ + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) + { + return TRUE; + } + UnfreezeMapObject(mapObject); + mapObject->mapobj_unk_1C = specialAnimId; + mapObject->mapobj_bit_6 = 1; + mapObject->mapobj_bit_7 = 0; + gSprites[mapObject->spriteId].data[2] = 0; + return FALSE; +} + +void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) +{ + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + FieldObjectSetSpecialAnim(mapObject, specialAnimId); +} + +void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + { + FieldObjectClearAnim(mapObject); + } +} + +void FieldObjectClearAnim(struct MapObject *mapObject) +{ + mapObject->mapobj_unk_1C = 0xFF; + mapObject->mapobj_bit_6 = 0; + mapObject->mapobj_bit_7 = 0; + gSprites[mapObject->spriteId].data[1] = 0; + gSprites[mapObject->spriteId].data[2] = 0; +} + +bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + return mapObject->mapobj_bit_7; + return 0x10; +} + +bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) +{ + u8 specialAnimStatus; + specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); + if (specialAnimStatus != 0 && specialAnimStatus != 0x10) + { + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + } + return specialAnimStatus; +} + +u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6) + { + return mapObject->mapobj_unk_1C; + } + return 0xFF; +} + +extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite); +extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite); +extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite); +void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite); +void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite); +void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite); +void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite); + +void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *)) +{ + DoGroundEffects_OnSpawn(mapObject, sprite); + sub_80634A0(mapObject, sprite); + if (FieldObjectIsSpecialAnimActive(mapObject)) + { + FieldObjectExecSpecialAnim(mapObject, sprite); + } else + { + if (!mapObject->mapobj_bit_8) + { + while (callback(mapObject, sprite)); + } + } + DoGroundEffects_OnBeginStep(mapObject, sprite); + DoGroundEffects_OnFinishStep(mapObject, sprite); + npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); + sub_80634D0(mapObject, sprite); + FieldObjectUpdateSubpriority(mapObject, sprite); +} + +#define dirn_to_anim(name, table)\ +u8 name(u32 idx)\ +{\ + u8 direction;\ + u8 animIds[sizeof(table)];\ + direction = idx;\ + memcpy(animIds, (table), sizeof(table));\ + if (direction > DIR_EAST) direction = 0;\ + return animIds[direction];\ +} + +dirn_to_anim(GetFaceDirectionAnimId, gUnknown_083756C8) +dirn_to_anim(GetSimpleGoAnimId, gUnknown_083756CD) +dirn_to_anim(GetGoSpeed0AnimId, gUnknown_083756D2) +dirn_to_anim(sub_8060744, gUnknown_083756D7) +dirn_to_anim(d2s_08064034, gUnknown_083756DC) +dirn_to_anim(sub_806079C, gUnknown_083756E1) +dirn_to_anim(sub_80607C8, gUnknown_083756E6) +dirn_to_anim(sub_80607F4, gUnknown_083756EB) +dirn_to_anim(GetJumpLedgeAnimId, gUnknown_083756F0) +dirn_to_anim(sub_806084C, gUnknown_083756F5) +dirn_to_anim(sub_8060878, gUnknown_083756FA) +dirn_to_anim(sub_80608A4, gUnknown_083756FF) +dirn_to_anim(sub_80608D0, gUnknown_08375704) +dirn_to_anim(GetStepInPlaceDelay32AnimId, gUnknown_08375709) +dirn_to_anim(GetStepInPlaceDelay16AnimId, gUnknown_0837570E) +dirn_to_anim(GetStepInPlaceDelay8AnimId, gUnknown_08375713) +dirn_to_anim(GetStepInPlaceDelay4AnimId, gUnknown_08375718) + +u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) +{ + return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); +} + +u8 sub_80609D8(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837571D, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A04(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375722, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A30(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375727, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A5C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837572C, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060A88(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375731, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060AB4(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375736, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060AE0(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837573B, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B0C(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375740, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B38(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_08375745, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 sub_8060B64(u8 index) +{ + u8 directions[5]; + memcpy(directions, gUnknown_0837574A, 5); + if (index >= 5) + { + index = 0; + } + return directions[index]; +} + +u8 GetOppositeDirection(u8 direction) +{ + u8 directions[8]; + memcpy(directions, gUnknown_0837574F, 8); + if (direction == 0 || direction > 8) + { + return direction; + } + return directions[direction - 1]; +} + +u32 zffu_offset_calc(u8 a0, u8 a1) +{ + return gUnknown_08375757[a0 - 1][a1 - 1]; +} + +u32 state_to_direction(u8 a0, u32 a1, u32 a2) +{ + u32 zffuOffset; + u8 a1_2 = a1; + u8 a2_2 = a2; + if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) + { + return 0; + } + zffuOffset = zffu_offset_calc(a1_2, a2); + return gUnknown_08375767[a0 - 1][zffuOffset - 1]; +} + +void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) + { + mapObject->mapobj_bit_7 = 1; + } +} + +bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) + { + mapObject->mapobj_unk_1C = 0xFF; + sprite->data[2] = 0; + return 1; + } + return 0; +} + +void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) +{ + mapObject->mapobj_unk_1C = animId; + sprite->data[2] = 0; +} + +void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + npc_coords_shift_still(mapObject); + sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + sprite->animPaused = 1; + sprite->data[2] = 1; +} + +u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_SOUTH); + return 1; +} + +u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_NORTH); + return 1; +} + +u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_WEST); + return 1; +} + +u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, DIR_EAST); + return 1; +} + +void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + FieldObjectSetDirection(mapObject, direction); + MoveCoords(direction, &x, &y); + npc_coords_shift(mapObject, x, y); + oamt_npc_ministep_reset(sprite, direction, a3); + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + sprite->data[2] = 1; +} + +extern u8 (*const gUnknown_083759C0[5])(u8); + +void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + u8 (*const functions[5])(u8); + memcpy((void *)functions, gUnknown_083759C0, sizeof(gUnknown_083759C0)); + sub_8060D20(mapObject, sprite, direction, a3); + sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18)); +} + +void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_8060D20(mapObject, sprite, direction, 1); + sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); +} + +bool8 obj_npc_ministep(struct Sprite *); + +bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (obj_npc_ministep(sprite)) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + sprite->animPaused = 1; + return 1; + } + return 0; +} + +void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + s16 x; + s16 y; + x = mapObject->coords2.x; + y = mapObject->coords2.y; + FieldObjectSetDirection(mapObject, direction); + MoveCoords(direction, &x, &y); + npc_coords_shift(mapObject, x, y); + sub_806467C(sprite, direction); + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + sprite->data[2] = 1; +} + +void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_8060E68(mapObject, sprite, direction); + sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); +} + +bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_806468C(sprite)) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + sprite->animPaused = 1; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060F5C(struct MapObject *, struct Sprite *); + +bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + return sub_8060F5C(mapObject, sprite); +} + +bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060F9C(struct MapObject *, struct Sprite *); + +bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_NORTH); + return sub_8060F9C(mapObject, sprite); +} + +bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8060FDC(struct MapObject *, struct Sprite *); + +bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_WEST); + return sub_8060FDC(mapObject, sprite); +} + +bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806101C(struct MapObject *, struct Sprite *); + +bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_EAST); + return sub_806101C(mapObject, sprite); +} + +bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806105C(struct MapObject *, struct Sprite *); + +bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 0); + return sub_806105C(mapObject, sprite); +} + +bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806109C(struct MapObject *, struct Sprite *); + +bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 0); + return sub_806109C(mapObject, sprite); +} + +bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80610DC(struct MapObject *, struct Sprite *); + +bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 0); + return sub_80610DC(mapObject, sprite); +} + +bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806111C(struct MapObject *, struct Sprite *); + +bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 0); + return sub_806111C(mapObject, sprite); +} + +bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) +{ + s16 vSPp4[3]; + s16 x; + s16 y; + memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34); + x = 0; + y = 0; + FieldObjectSetDirection(mapObject, direction); + sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]); + npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); + sub_80646E4(sprite, direction, a4, a5); + sprite->data[2] = 1; + sprite->animPaused = 0; + mapObject->mapobj_bit_2 = 1; + mapObject->mapobj_bit_4 = 1; +} + +void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) +{ + sub_806113C(mapObject, sprite, direction, a4, a5); + sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + DoShadowFieldEffect(mapObject); +} + +u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *)) +{ + s16 vSPp4[3]; + s16 x; + s16 y; + u8 retval; + memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A); + retval = callback(sprite); + if (retval == 1 && vSPp4[sprite->data[4]] != 0) + { + x = 0; + y = 0; + sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data[4]], vSPp4[sprite->data[4]]); + npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); + mapObject->mapobj_bit_2 = 1; + mapObject->mapobj_bit_4 = 1; + } else if (retval == 0xff) + { + npc_coords_shift_still(mapObject); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->animPaused = 1; + } + return retval; +} + +u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite) +{ + return sub_806123C(mapObject, sprite, sub_8064704); +} + +u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite) +{ + return sub_806123C(mapObject, sprite, sub_806478C); +} + +bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061300(mapObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061314(mapObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 retval; + + retval = sub_8061300(mapObject, sprite); + if (retval != 1) + { + if (retval == 0xFF) + { + return TRUE; + } + return FALSE; + } + FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); + sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); + return FALSE; +} + +bool8 sub_80613D4(struct MapObject *, struct Sprite *); +bool8 sub_806142C(struct MapObject *, struct Sprite *); +bool8 sub_8061484(struct MapObject *, struct Sprite *); +bool8 sub_80614DC(struct MapObject *, struct Sprite *); + +bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0); + return sub_80613D4(mapObject, sprite); +} + +bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0); + return sub_806142C(mapObject, sprite); +} + +bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0); + return sub_8061484(mapObject, sprite); +} + +bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0); + return sub_80614DC(mapObject, sprite); +} + +bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8061508(struct Sprite *sprite, u16 duration) +{ + sprite->data[2] = 1; + sprite->data[3] = duration; +} + +bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[3]--; + if (!sprite->data[3]) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 1); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 2); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 4); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 8); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061508(sprite, 16); + return sub_8061510(mapObject, sprite); +} + +bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite); +bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 1); + return sub_80615EC(mapObject, sprite); +} + +bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 1); + return sub_806162C(mapObject, sprite); +} + +bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 1); + return sub_806166C(mapObject, sprite); +} + +bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} +bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 1); + return sub_80616AC(mapObject, sprite); +} + +bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration) +{ + FieldObjectSetDirection(mapObject, direction); + sub_805FE28(mapObject, sprite, animId); + sprite->animPaused = 0; + sprite->data[2] = 1; + sprite->data[3] = duration; +} + +bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->data[3]--; + if (sprite->data[3] == 0) + { + sprite->data[2] = 2; + sprite->animPaused = 1; + return TRUE; + } + return FALSE; +} + +bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sprite->data[3] & 1) + { + sprite->animDelayCounter++; + } + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32); + return sub_806173C(mapObject, sprite); +} + +bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8061B18(struct MapObject *, struct Sprite *); + +bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 2); + return sub_8061B18(mapObject, sprite); +} + +bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061B58(struct MapObject *, struct Sprite *); + +bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 2); + return sub_8061B58(mapObject, sprite); +} + +bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061B98(struct MapObject *, struct Sprite *); + +bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 2); + return sub_8061B98(mapObject, sprite); +} + +bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061BD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 2); + return sub_8061BD8(mapObject, sprite); +} + +bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061C18(struct MapObject *, struct Sprite *); + +bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 3); + return sub_8061C18(mapObject, sprite); +} + +bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061C58(struct MapObject *, struct Sprite *); + +bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 3); + return sub_8061C58(mapObject, sprite); +} + +bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061C98(struct MapObject *, struct Sprite *); + +bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 3); + return sub_8061C98(mapObject, sprite); +} + +bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061CD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 3); + return sub_8061CD8(mapObject, sprite); +} + +bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061D18(struct MapObject *, struct Sprite *); + +bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_SOUTH, 4); + return sub_8061D18(mapObject, sprite); +} + +bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061D58(struct MapObject *, struct Sprite *); + +bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_NORTH, 4); + return sub_8061D58(mapObject, sprite); +} + +bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061D98(struct MapObject *, struct Sprite *); + +bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_WEST, 4); + return sub_8061D98(mapObject, sprite); +} + +bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +bool8 sub_8061DD8(struct MapObject *, struct Sprite *); + +bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_go_anim(mapObject, sprite, DIR_EAST, 4); + return sub_8061DD8(mapObject, sprite); +} + +bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E18(struct MapObject *, struct Sprite *); + +bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_SOUTH); + return sub_8061E18(mapObject, sprite); +} + +bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E58(struct MapObject *, struct Sprite *); + +bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_NORTH); + return sub_8061E58(mapObject, sprite); +} + +bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061E98(struct MapObject *, struct Sprite *); + +bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_WEST); + return sub_8061E98(mapObject, sprite); +} + +bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061ED8(struct MapObject *, struct Sprite *); + +bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite) +{ + do_run_anim(mapObject, sprite, DIR_EAST); + return sub_8061ED8(mapObject, sprite); +} + +bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) +{ + obj_anim_image_set_and_seek(sprite, animNum, 0); + FieldObjectSetDirection(mapObject, direction); + sprite->data[2] = 1; +} + +bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); + return FALSE; +} + +bool8 sub_8064864(struct Sprite *); + +bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + sub_806113C(mapObject, sprite, direction, 1, 0); + StartSpriteAnim(sprite, sub_805FD88(direction)); +} + +bool8 sub_8061FB0(struct MapObject *, struct Sprite *); + +bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_SOUTH); + return sub_8061FB0(mapObject, sprite); +} + +bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8061FF8(struct MapObject *, struct Sprite *); + +bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_NORTH); + return sub_8061FF8(mapObject, sprite); +} + +bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062040(struct MapObject *, struct Sprite *); + +bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_WEST); + return sub_8062040(mapObject, sprite); +} + +bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062088(struct MapObject *, struct Sprite *); + +bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8061F5C(mapObject, sprite, DIR_EAST); + return sub_8062088(mapObject, sprite); +} + +bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061340(mapObject, sprite)) + { + sprite->data[2] = 2; + mapObject->mapobj_bit_5 = 0; + return TRUE; + } + return FALSE; +} + +bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 objectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) + { + an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)); + } + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 objectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) + { + an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y))); + } + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_9 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_9 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2); + return sub_80621BC(mapObject, sprite); +} + +bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2); + return sub_8062214(mapObject, sprite); +} + +bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2); + return sub_806226C(mapObject, sprite); +} + +bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2); + return sub_80622C4(mapObject, sprite); +} + +bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0); + return sub_806231C(mapObject, sprite); +} + +bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0); + return sub_8062374(mapObject, sprite); +} + +bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0); + return sub_80623CC(mapObject, sprite); +} + +bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0); + return sub_8062424(mapObject, sprite); +} + +bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2); + return sub_806247C(mapObject, sprite); +} + +bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2); + return sub_80624D4(mapObject, sprite); +} + +bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2); + return sub_806252C(mapObject, sprite); +} + +bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite); + +bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite) +{ + maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2); + return sub_8062584(mapObject, sprite); +} + +bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061358(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]); + return TRUE; +} + +bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); + return FALSE; +} + +bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_25 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_25 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_12 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); + sprite->data[2] = 1; + return TRUE; +} + +bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_HEART_ICON); + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_8062704(struct MapObject *, struct Sprite *); + +bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->animPattern == 0x3F) + { + sub_8084794(mapObject); + return FALSE; + } + else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) + { + sprite->data[2] = 2; + return TRUE; + } + else + { + sub_812869C(mapObject); + sprite->data[2] = 1; + return sub_8062704(mapObject, sprite); + } +} + +bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_81286C4(mapObject)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite) +{ + obj_anim_image_set_and_seek(sprite, 1, 0); + sprite->data[2] = 1; + return FALSE; +} + +bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sub_8064820(sprite, 0x20); + sprite->data[2] = 2; + } + return FALSE; +} + +bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 ^= 1; + if (sub_8064824(sprite)) + { + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 3; + } + return FALSE; +} + +bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + obj_anim_image_set_and_seek(sprite, 1, 0); + sprite->data[2] = 1; + return FALSE; +} + +bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8064864(sprite)) + { + sub_8064820(sprite, 0x20); + sprite->data[2] = 2; + } + return FALSE; +} + +bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_13 ^= 1; + if (sub_8064824(sprite)) + { + mapObject->mapobj_bit_13 = 1; + sprite->data[2] = 3; + } + return FALSE; +} + +bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_26 = 1; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite) +{ + mapObject->mapobj_bit_26 = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->oam.affineMode = 3; + InitSpriteAffineAnim(sprite); + sprite->affineAnimPaused = 1; + sprite->subspriteMode = 0; + return TRUE; +} + +bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite) +{ + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + return TRUE; +} + +bool8 sub_80628D0(struct MapObject *, struct Sprite *); + +bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = 0; + StartSpriteAffineAnimIfDifferent(sprite, 0); + return sub_80628D0(mapObject, sprite); +} + +bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->affineAnimPaused = 1; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062930(struct MapObject *, struct Sprite *); + +bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8060ED8(mapObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = 0; + ChangeSpriteAffineAnimIfDifferent(sprite, 1); + return sub_8062930(mapObject, sprite); +} + +bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (an_walk_any_2(mapObject, sprite)) + { + sprite->affineAnimPaused = 1; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) +{ + FieldObjectSetDirection(mapObject, direction); + npc_coords_shift_still(mapObject); + sub_805FE64(mapObject, sprite, sub_805FDD8(direction)); + sprite->animPaused = 1; + sprite->data[2] = 1; +} + +bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_SOUTH); + return TRUE; +} + +bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_NORTH); + return TRUE; +} + +bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_WEST); + return TRUE; +} + +bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_806295C(mapObject, sprite, DIR_EAST); + return TRUE; +} + +bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST)); + return FALSE; +} + +bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST)); + return FALSE; +} + +bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH)); + return FALSE; +} + +bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH)); + return FALSE; +} + +bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST)); + return FALSE; +} + +bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite) +{ + npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST)); + return FALSE; +} + +void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4) +{ + sub_806113C(mapObject, sprite, direction, a3, a4); + StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction)); + DoShadowFieldEffect(mapObject); +} + +bool8 sub_8062BFC(struct MapObject *, struct Sprite *); + +bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1); + return sub_8062BFC(mapObject, sprite); +} + +bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062C54(struct MapObject *, struct Sprite *); + +bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1); + return sub_8062C54(mapObject, sprite); +} + +bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062CAC(struct MapObject *, struct Sprite *); + +bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1); + return sub_8062CAC(mapObject, sprite); +} + +bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062D04(struct MapObject *, struct Sprite *); + +bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1); + return sub_8062D04(mapObject, sprite); +} + +bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062D5C(struct MapObject *, struct Sprite *); + +bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1); + return sub_8062D5C(mapObject, sprite); +} + +bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062DB4(struct MapObject *, struct Sprite *); + +bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1); + return sub_8062DB4(mapObject, sprite); +} + +bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062E0C(struct MapObject *, struct Sprite *); + +bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1); + return sub_8062E0C(mapObject, sprite); +} + +bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062E64(struct MapObject *, struct Sprite *); + +bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1); + return sub_8062E64(mapObject, sprite); +} + +bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062EBC(struct MapObject *, struct Sprite *); + +bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0); + return sub_8062EBC(mapObject, sprite); +} + +bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062F14(struct MapObject *, struct Sprite *); + +bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0); + return sub_8062F14(mapObject, sprite); +} + +bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062F6C(struct MapObject *, struct Sprite *); + +bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0); + return sub_8062F6C(mapObject, sprite); +} + +bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062FC4(struct MapObject *, struct Sprite *); + +bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0); + return sub_8062FC4(mapObject, sprite); +} + +bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_8061328(mapObject, sprite)) + { + mapObject->mapobj_bit_22 = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8); + return sub_8061714(mapObject, sprite); +} + +bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8); + return sub_8061714(mapObject, sprite); +} + +void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18)); + SeekSpriteAnim(sprite, 0); +} + +bool8 sub_8063128(struct MapObject *, struct Sprite *); + +bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063128(mapObject, sprite); +} + +bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063168(struct MapObject *, struct Sprite *); + +bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_NORTH, 1); + return sub_8063168(mapObject, sprite); +} + +bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80631A8(struct MapObject *, struct Sprite *); + +bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_WEST, 1); + return sub_80631A8(mapObject, sprite); +} + +bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80631E8(struct MapObject *, struct Sprite *); + +bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80630D0(mapObject, sprite, DIR_EAST, 1); + return sub_80631E8(mapObject, sprite); +} + +bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18)); +} + +bool8 sub_8063258(struct MapObject *, struct Sprite *); + +bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063258(mapObject, sprite); +} + +bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063298(struct MapObject *, struct Sprite *); + +bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_NORTH, 1); + return sub_8063298(mapObject, sprite); +} + +bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80632D8(struct MapObject *, struct Sprite *); + +bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_WEST, 1); + return sub_80632D8(mapObject, sprite); +} + +bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063318(struct MapObject *, struct Sprite *); + +bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063208(mapObject, sprite, DIR_EAST, 1); + return sub_8063318(mapObject, sprite); +} + +bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) +{ + sub_8060D20(mapObject, sprite, direction, a3); + StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18)); + SeekSpriteAnim(sprite, 0); +} + +bool8 sub_8063390(struct MapObject *, struct Sprite *); + +bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_SOUTH, 1); + return sub_8063390(mapObject, sprite); +} + +bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_80633D0(struct MapObject *, struct Sprite *); + +bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_NORTH, 1); + return sub_80633D0(mapObject, sprite); +} + +bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063410(struct MapObject *, struct Sprite *); + +bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_WEST, 1); + return sub_8063410(mapObject, sprite); +} + +bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063450(struct MapObject *, struct Sprite *); + +bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8063338(mapObject, sprite, DIR_EAST, 1); + return sub_8063450(mapObject, sprite); +} + +bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite) +{ + return TRUE; +} + +bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->animPaused = 1; + return TRUE; +} + +void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->mapobj_bit_10) + { + sprite->animPaused = 1; + } +} + +void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite) +{ + if (mapObject->mapobj_bit_11) + { + sprite->animPaused = 0; + mapObject->mapobj_bit_10 = 0; + mapObject->mapobj_bit_11 = 0; + } +} + +void sub_80634E8(struct MapObject *, struct Sprite *); +static void UpdateMapObjSpriteVisibility(struct MapObject *, struct Sprite *); + +void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_80634E8(mapObject, sprite); + UpdateMapObjSpriteVisibility(mapObject, sprite); +} + +#ifdef NONMATCHING +void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) +{ + u16 x; + u16 y; + s16 x2; + s16 y2; + const struct MapObjectGraphicsInfo *graphicsInfo; + mapObject->mapobj_bit_14 = 0; + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + x2 = graphicsInfo->width + x; // offending line + y2 = graphicsInfo->height + y; // similarly offending line + if ((s16)x >= 0x100 || x2 < -0x10) + { + mapObject->mapobj_bit_14 = 1; + } + if ((s16)y >= 0xB0 || y2 < -0x10) + { + mapObject->mapobj_bit_14 = 1; + } +} +#else +__attribute__((naked)) +void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r5, r0, 0\n\ + adds r4, r1, 0\n\ + ldrb r1, [r5, 0x1]\n\ + movs r0, 0x41\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r5, 0x1]\n\ + ldrb r0, [r5, 0x5]\n\ + bl GetFieldObjectGraphicsInfo\n\ + adds r6, r0, 0\n\ + adds r0, r4, 0\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0806354C\n\ + ldrh r1, [r4, 0x24]\n\ + ldrh r0, [r4, 0x20]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\ + adds r0, r1\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r0, [r4, 0x22]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x29\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\ + adds r0, r1\n\ + ldrh r2, [r2]\n\ + adds r0, r2\n\ + b _08063574\n\ + .align 2, 0\n\ +_08063544: .4byte gSpriteCoordOffsetX\n\ +_08063548: .4byte gSpriteCoordOffsetY\n\ +_0806354C:\n\ + ldrh r1, [r4, 0x24]\n\ + ldrh r0, [r4, 0x20]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x28\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + adds r0, r1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r0, [r4, 0x22]\n\ + adds r1, r0\n\ + adds r0, r4, 0\n\ + adds r0, 0x29\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + adds r0, r1\n\ +_08063574:\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + ldrh r0, [r6, 0x8]\n\ + adds r0, r3\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + ldrh r0, [r6, 0xA]\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + cmp r0, 0xFF\n\ + bgt _0806359C\n\ + lsls r0, r1, 16\n\ + asrs r0, 16\n\ + movs r1, 0x10\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _080635A4\n\ +_0806359C:\n\ + ldrb r0, [r5, 0x1]\n\ + movs r1, 0x40\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ +_080635A4:\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + cmp r0, 0xAF\n\ + bgt _080635B8\n\ + lsls r0, r4, 16\n\ + asrs r0, 16\n\ + movs r1, 0x10\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _080635C0\n\ +_080635B8:\n\ + ldrb r0, [r5, 0x1]\n\ + movs r1, 0x40\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ +_080635C0:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ +.syntax divided\n"); +} +#endif + +void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->invisible = 0; + if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) + { + sprite->invisible = 1; + } +} + +static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void DoTracksGroundEffect_BikeTireTracks( +struct MapObject *mapObj, struct Sprite *sprite, u8); +void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); +u8 GetReflectionTypeByMetatileBehavior(u32 behavior); + +static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_Reflection(mapObj, flags); + GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags); + GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); +} + +static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_Reflection(mapObj, flags); + GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags); + GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags); + GetGroundEffectFlags_Tracks(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_Puddle(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); +} + +static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) +{ + FieldObjectUpdateMetatileBehaviors(mapObj); + GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); + GetGroundEffectFlags_SandPile(mapObj, flags); + GetGroundEffectFlags_Puddle(mapObj, flags); + GetGroundEffectFlags_Ripple(mapObj, flags); + GetGroundEffectFlags_ShortGrass(mapObj, flags); + GetGroundEffectFlags_HotSprings(mapObj, flags); + GetGroundEffectFlags_Seaweed(mapObj, flags); + GetGroundEffectFlags_JumpLanding(mapObj, flags); +} + +void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) +{ + mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y); + mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y); +} + +void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) +{ + u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; + u8 type = FieldObjectCheckForReflectiveSurface(mapObj); + + if (type) + { + if (!mapObj->mapobj_bit_17) + { + mapObj->mapobj_bit_17 = 0; + mapObj->mapobj_bit_17 = 1; + *flags |= reflectionFlags[type - 1]; + } + } + else + { + mapObj->mapobj_bit_17 = 0; + } +} + +void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x1; +} + +void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x2; +} + +void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x4; +} + +void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + *flags |= 0x8; +} + +void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + { + *flags |= 0x100; + } + else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) + || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) + { + *flags |= 0x80; + } +} + +void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_20) + { + mapObj->mapobj_bit_20 = 0; + mapObj->mapobj_bit_20 = 1; + *flags |= 0x800; + } + } + else + { + mapObj->mapobj_bit_20 = 0; + } +} + +void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) +{ + if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) + || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) + { + if (!mapObj->mapobj_bit_19) + { + mapObj->mapobj_bit_19 = 0; + mapObj->mapobj_bit_19 = 1; + *flags |= 0x40; + } + } + else + { + mapObj->mapobj_bit_19 = 0; + } +} + +void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) + { + *flags |= 0x400; + } +} + +void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E)) + *flags |= 0x200; +} + +void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_18) + { + mapObj->mapobj_bit_18 = 0; + mapObj->mapobj_bit_18 = 1; + *flags |= 0x20000; + } + } + else + { + mapObj->mapobj_bit_18 = 0; + } +} + +void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) + { + if (!mapObj->mapobj_bit_21) + { + mapObj->mapobj_bit_21 = 0; + mapObj->mapobj_bit_21 = 1; + *flags |= 0x40000; + } + } + else + { + mapObj->mapobj_bit_21 = 0; + } +} + +void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) +{ + if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E)) + *flags |= 0x80000; +} + +void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) +{ + typedef bool8 (*MetatileFunc)(u8); + + static const MetatileFunc metatileFuncs[] = { + MetatileBehavior_IsTallGrass, + MetatileBehavior_IsLongGrass, + MetatileBehavior_IsPuddle, + MetatileBehavior_IsSurfableWaterOrUnderwater, + MetatileBehavior_IsShallowFlowingWater, + MetatileBehavior_IsATile, + }; + + static const u32 jumpLandingFlags[] = { + 0x00001000, // Landing in tall grass + 0x00002000, // Landing in long grass + 0x00004000, // Landing on puddle + 0x00008000, // Landing on surfable water or underwater + 0x00004000, // Landing on shallow flowing water + 0x00010000, // Landing on any other type of ground + }; + + if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) + { + u8 i; + + for (i = 0; i < 6; i++) + { + if (metatileFuncs[i](mapObj->mapobj_unk_1E)) + { + *flags |= jumpLandingFlags[i]; + return; + } + } + } +} + +u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + + // ceil div by tile width? + s16 width = (info->width + 8) >> 4; + s16 height = (info->height + 8) >> 4; + s16 i; + s16 j; + u8 result; + u8 b; + s16 one; + +#define RETURN_REFLECTION_TYPE_AT(x, y) \ + b = MapGridGetMetatileBehaviorAt(x, y); \ + result = GetReflectionTypeByMetatileBehavior(b); \ + if (result != 0) \ + return result; + + for (i = 0, one = 1; i < height; i++) + { + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i) + for (j = 1; j < width; j++) + { + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i) + } + } + return 0; + +#undef RETURN_REFLECTION_TYPE_AT +} + +u8 GetReflectionTypeByMetatileBehavior(u32 behavior) +{ + if (MetatileBehavior_IsIce(behavior)) + return 1; + else if (MetatileBehavior_IsReflective(behavior)) + return 2; + else + return 0; +} + +u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) +{ + static bool8 (*const unknown_08376040[])(u8) = { + MetatileBehavior_IsJumpSouth, + MetatileBehavior_IsJumpNorth, + MetatileBehavior_IsJumpWest, + MetatileBehavior_IsJumpEast, + }; + + u8 b; + u8 index = z; + + if (index == 0) + return 0; + else if (index > 4) + index -= 4; + + index--; + b = MapGridGetMetatileBehaviorAt(x, y); + + if (unknown_08376040[index](b) == 1) + return index + 1; + + return 0; +} + +void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_4) + return; + + if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + return; + + if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F)) + return; + + sprite->subspriteTableNum = 4; + + if (ZCoordToPriority(mapObj->elevation) == 1) + sprite->subspriteTableNum = 5; +} + +bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) +{ + u8 mapZ; + + if (z == 0) + return FALSE; + + mapZ = MapGridGetZCoordAt(x, y); + + if (mapZ == 0 || mapZ == 0xF) + return FALSE; + + if (mapZ != z) + return TRUE; + + return FALSE; +} + +static const u8 sUnknown_08376050[] = { + 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is directly the inverse of gFieldObjectPriorities_08376070. +static const u8 sFieldObjectPriorities_08376060[] = { + 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is the inverse of gFieldObjectPriorities_08376060. +// 1 = Above player sprite +// 2 = Below player sprite +static const u8 sFieldObjectPriorities_08376070[] = { + 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, +}; + +void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_26) + return; + + FieldObjectUpdateZCoord(mapObj); + + sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation]; + sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation]; +} + +void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) +{ + sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z]; + sprite->oam.priority = sFieldObjectPriorities_08376060[z]; +} + +u8 ZCoordToPriority(u8 z) +{ + return sFieldObjectPriorities_08376060[z]; +} + +void FieldObjectUpdateZCoord(struct MapObject *mapObj) +{ + u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y); + u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y); + + if (z == 0xF || z2 == 0xF) + return; + + mapObj->mapobj_unk_0B_0 = z; + + if (z != 0 && z != 0xF) + mapObj->elevation = z; +} + +void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) +{ + s32 tmp = sprite->centerToCornerVecY; + u32 tmpa = *(u16 *)&sprite->pos1.y; + u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; + s32 tmp2 = (tmpa - tmp) + tmpb; + u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; + sprite->subpriority = tmp3 + sUnknown_08376050[a] + b; +} + +void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_26) + return; + + SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); +} + +bool8 AreZCoordsCompatible(u8 a, u8 b) +{ + if (a == 0 || b == 0) + return TRUE; + + if (a != b) + return FALSE; + + return TRUE; +} + +void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 1; + FieldEffectStart(FLDEFF_TALL_GRASS); +} + +void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 0; + FieldEffectStart(FLDEFF_TALL_GRASS); +} + +void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 1; + FieldEffectStart(FLDEFF_LONG_GRASS); +} + +void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; + gFieldEffectArguments[5] = mapObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; + gFieldEffectArguments[7] = 0; + FieldEffectStart(FLDEFF_LONG_GRASS); +} + +void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) +{ + SetUpReflection(mapObj, sprite, 0); +} + +void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite) +{ + SetUpReflection(mapObj, sprite, 1); +} + +void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); +} + +static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { + nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, +}; + +void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + gUnknown_08376080[info->tracks](mapObj, sprite, 0); +} + +void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + gUnknown_08376080[info->tracks](mapObj, sprite, 1); +} + +static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ +} + +static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ + // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) + u16 sandFootprints_FieldEffectData[2] = { + FLDEFF_SAND_FOOTPRINTS, + FLDEFF_DEEP_SAND_FOOTPRINTS + }; + + gFieldEffectArguments[0] = mapObj->coords3.x; + gFieldEffectArguments[1] = mapObj->coords3.y; + gFieldEffectArguments[2] = 149; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = mapObj->mapobj_unk_18; + FieldEffectStart(sandFootprints_FieldEffectData[a]); +} + +static void DoTracksGroundEffect_BikeTireTracks( + struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ + // Specifies which bike track shape to show next. + // For example, when the bike turns from up to right, it will show + // a track that curves to the right. + // Each 4-byte row corresponds to the initial direction of the bike, and + // each byte in that row is for the next direction of the bike in the order + // of down, up, left, right. + static const u8 bikeTireTracks_Transitions[4][4] = { + 1, 2, 7, 8, + 1, 2, 6, 5, + 5, 8, 3, 4, + 6, 7, 3, 4, + }; + + if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) + { + gFieldEffectArguments[0] = mapObj->coords3.x; + gFieldEffectArguments[1] = mapObj->coords3.y; + gFieldEffectArguments[2] = 149; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = + bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; + FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); + } +} + +void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite) +{ + DoRippleFieldEffect(mapObj, sprite); +} + +void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj); +} + +void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj); +} + +void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + u8 spriteId; + + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); + + spriteId = sub_8126FF0( + mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y); + + if (spriteId == MAX_SPRITES) + GroundEffect_SpawnOnTallGrass(mapObj, sprite); +} + +void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = 2; + FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); +} + +void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); +} + +void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); +} + +void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + gFieldEffectArguments[2] = mapObj->elevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_DUST); +} + +void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj); +} + +void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj); +} + +void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = mapObj->coords2.x; + gFieldEffectArguments[1] = mapObj->coords2.y; + FieldEffectStart(FLDEFF_BUBBLES); +} + +static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { + GroundEffect_SpawnOnTallGrass, + sub_8063E94, + sub_8063EE0, + sub_8063F2C, + GroundEffect_WaterReflection, + GroundEffect_IceReflection, + GroundEffect_FlowingWater, + sub_8063FA0, + sub_8063FCC, + GroundEffect_Ripple, + GroundEffect_StepOnPuddle, + GroundEffect_SandPile, + GroundEffect_JumpOnTallGrass, + GroundEffect_JumpOnLongGrass, + GroundEffect_JumpOnShallowWater, + GroundEffect_JumpOnWater, + GroundEffect_JumpLandingDust, + GroundEffect_ShortGrass, + GroundEffect_HotSprings, + GroundEffect_Seaweed +}; + +void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1) + if (flags & 1) + gUnknown_083760A0[i](mapObj, sprite); +} + +void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags) +{ + if (mapObj->mapobj_bit_4) + { + mapObj->mapobj_bit_18 = 0; + mapObj->mapobj_bit_20 = 0; + mapObj->mapobj_bit_19 = 0; + mapObj->mapobj_bit_21 = 0; + *flags &= 0xFFF9F7BD; + } +} + +void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags) +{ + if (mapObj->mapobj_bit_5) + *flags &= 0xFFFFFBFF; +} + +void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_2) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnSpawn(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_2 = 0; + mapObj->mapobj_bit_4 = 0; + } +} + +void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_2) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + filters_out_some_ground_effects(mapObj, &flags); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_2 = 0; + mapObj->mapobj_bit_4 = 0; + } +} + +void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_3) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_3 = 0; + mapObj->mapobj_bit_5 = 0; + } +} + +typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); + +void Step1(struct Sprite *sprite, u8 dir); +void Step2(struct Sprite *sprite, u8 dir); +void Step3(struct Sprite *sprite, u8 dir); +void Step4(struct Sprite *sprite, u8 dir); +void Step8(struct Sprite *sprite, u8 dir); + +const SpriteStepFunc Unknown_83760F0[] = { + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1 +}; + +const SpriteStepFunc Unknown_8376130[] = { + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, + Step2 +}; + +const SpriteStepFunc Unknown_8376150[] = { + Step2, + Step3, + Step3, + Step2, + Step3, + Step3 +}; + +const SpriteStepFunc Unknown_8376168[] = { + Step4, + Step4, + Step4, + Step4 +}; + +const SpriteStepFunc Unknown_8376178[] = { + Step8, + Step8 +}; + +const SpriteStepFunc *const gUnknown_08376180[] = { + Unknown_83760F0, + Unknown_8376130, + Unknown_8376150, + Unknown_8376168, + Unknown_8376178 +}; + +const s16 gUnknown_08376194[] = { + 16, 8, 6, 4, 2 +}; + +const s8 Unknown_837619E[] = { + -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0 +}; + +const s8 Unknown_83761AE[] = { + 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0 +}; + +const s8 Unknown_83761BE[] = { + -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0 +}; + +const s8 *const gUnknown_083761D0[] = { + Unknown_837619E, + Unknown_83761AE, + Unknown_83761BE +}; + +bool8 FreezeMapObject(struct MapObject *mapObject) +{ + if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) + { + return TRUE; + } + else + { + mapObject->mapobj_bit_8 = 1; + mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; + mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; + gSprites[mapObject->spriteId].animPaused = 1; + gSprites[mapObject->spriteId].affineAnimPaused = 1; + return FALSE; + } +} + +void FreezeMapObjects(void) +{ + u8 i; + for (i = 0; i < 16; i++) + if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) + FreezeMapObject(&gMapObjects[i]); +} + +void FreezeMapObjectsExceptOne(u8 a1) +{ + u8 i; + for (i = 0; i < 16; i++) + if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) + FreezeMapObject(&gMapObjects[i]); +} + +void UnfreezeMapObject(struct MapObject *mapObject) +{ + if (mapObject->active && mapObject->mapobj_bit_8) + { + mapObject->mapobj_bit_8 = 0; + gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; + gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; + } +} + +void UnfreezeMapObjects(void) +{ + u8 i; + for (i = 0; i < 16; i++) + if (gMapObjects[i].active) + UnfreezeMapObject(&gMapObjects[i]); +} + +void Step1(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += gDirectionToVector[dir].x; + sprite->pos1.y += gDirectionToVector[dir].y; +} + +void Step2(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y; +} + +void Step3(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y; +} + +void Step4(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y; +} + +void Step8(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x; + sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y; +} + +void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->data[3] = a2; + sprite->data[4] = a3; + sprite->data[5] = 0; +} + +bool8 obj_npc_ministep(struct Sprite *sprite) +{ + if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]]) + return FALSE; + + gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); + + sprite->data[5]++; + + if (sprite->data[5] < gUnknown_08376194[sprite->data[4]]) + return FALSE; + + return TRUE; +} + +void sub_806467C(struct Sprite *sprite, u8 a2) +{ + sprite->data[3] = a2; + sprite->data[4] = 0; + sprite->data[5] = 0; +} + +bool8 sub_806468C(struct Sprite *sprite) +{ + if (!(sprite->data[4] & 1)) + { + Step1(sprite, sprite->data[3]); + sprite->data[5]++; + } + + sprite->data[4]++; + + if (sprite->data[5] > 15) + return TRUE; + else + return FALSE; +} + +s16 sub_80646C8(s16 a1, u8 a2) +{ + return gUnknown_083761D0[a2][a1]; +} + +void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) +{ + sprite->data[3] = a2; + sprite->data[4] = a3; + sprite->data[5] = a4; + sprite->data[6] = 0; +} + +u8 sub_8064704(struct Sprite *sprite) +{ + s16 v5[3] = {0x10, 0x10, 0x20}; + u8 v6[3] = {0, 0, 1}; + u8 v2 = 0; + + if (sprite->data[4]) + Step1(sprite, sprite->data[3]); + + sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + + sprite->data[6]++; + + if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) + v2 = 1; + + if (sprite->data[6] >= v5[sprite->data[4]]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +u8 sub_806478C(struct Sprite *sprite) +{ + s16 v5[3] = {0x20, 0x20, 0x40}; + u8 v6[3] = {1, 1, 2}; + u8 v2 = 0; + + if (sprite->data[4] && !(sprite->data[6] & 1)) + Step1(sprite, sprite->data[3]); + + sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + + sprite->data[6]++; + + if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) + v2 = 1; + + if (sprite->data[6] >= v5[sprite->data[4]]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +void sub_8064820(struct Sprite *sprite, s16 a2) +{ + sprite->data[3] = a2; +} + +bool8 sub_8064824(struct Sprite *sprite) +{ + sprite->data[3]--; + + if (sprite->data[3] == 0) + return TRUE; + else + return FALSE; +} + +void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->animNum = a2; + sprite->animPaused = 0 ; + SeekSpriteAnim(sprite, a3); +} + +bool8 sub_8064864(struct Sprite *sprite) +{ + if (sprite->animEnded) + return TRUE; + else + return FALSE; +} + +void sub_806487C(struct Sprite *sprite, bool8 invisible) +{ + u16 x, y; + s16 x2, y2; + + sprite->invisible = invisible; + + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + + x2 = x - (sprite->centerToCornerVecX >> 1); + y2 = y - (sprite->centerToCornerVecY >> 1); + + if ((s16)x > 255 || x2 < -16) + sprite->invisible = 1; + if ((s16)y > 175 || y2 < -16) + sprite->invisible = 1; +} + +void sub_8064970(struct Sprite *sprite) +{ + SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); + sub_806487C(sprite, 0); +} + +void sub_8064990(u8 a1, u8 dir) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1) + { + u8 animNum = FieldObjectDirectionToImageAnimId(dir); + StartSpriteAnim(sprite, animNum); + break; + } + } +} + +u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) +{ + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + return FieldEffectStart(fieldEffectId); +} + +void DoShadowFieldEffect(struct MapObject *mapObject) +{ + if (!mapObject->mapobj_bit_22) + { + mapObject->mapobj_bit_22 = 1; + oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); + } +} + +void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + gFieldEffectArguments[0] = sprite->pos1.x; + gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; + gFieldEffectArguments[2] = 151; + gFieldEffectArguments[3] = 3; + FieldEffectStart(FLDEFF_RIPPLE); +} diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c new file mode 100644 index 000000000..b9ef5b402 --- /dev/null +++ b/src/evolution_graphics.c @@ -0,0 +1,614 @@ +#include "global.h" +#include "evolution_graphics.h" +#include "sprite.h" +#include "trig.h" +#include "random.h" +#include "decompress.h" +#include "task.h" +#include "sound.h" +#include "constants/songs.h" +#include "palette.h" + +// this file's functions +static void EvoSparkle_DummySpriteCb(struct Sprite* sprite); +static void EvoTask_BeginPreSet1_FadeAndPlaySE(u8 taskID); +static void EvoTask_CreatePreEvoSparkleSet1(u8 taskID); +static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskID); +static void EvoTask_BeginPreSparklesSet2(u8 taskID); +static void EvoTask_CreatePreEvoSparklesSet2(u8 taskID); +static void EvoTask_DestroyPreSet2Task(u8 taskID); +static void EvoTask_BeginPostSparklesSet1(u8 taskID); +static void EvoTask_CreatePostEvoSparklesSet1(u8 taskID); +static void EvoTask_DestroyPostSet1Task(u8 taskID); +static void EvoTask_BeginPostSparklesSet2_AndFlash(u8 taskID); +static void EvoTask_CreatePostEvoSparklesSet2_AndFlash(u8 taskID); +static void EvoTask_BeginPostSparklesSet2_AndFlash_Trade(u8 taskID); +static void EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade(u8 taskID); +static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID); + +static void sub_8149FC8(u8 taskID); +static void sub_8149FEC(u8 taskID); +static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskID); +static void PreEvoInVisible_PostEvoVisible_KillTask(u8 taskID); +static void sub_814A03C(u8 taskID); + +// const data +static const u16 sEvoSparklePalette[] = INCBIN_U16("graphics/misc/evo_sparkle.gbapal"); +static const u8 sEvoSparkleTiles[] = INCBIN_U8("graphics/misc/evo_sparkle.4bpp.lz"); + +static const struct CompressedSpriteSheet sEvoSparkleSpriteSheets[] = +{ + {sEvoSparkleTiles, 0x20, 1001}, + {NULL, 0, 0} +}; +static const struct SpritePalette sEvoSparkleSpritePals[] = +{ + {sEvoSparklePalette, 1001}, + {NULL, 0} +}; + +static const struct OamData sOamData_EvoSparkle = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_EvoSparkle[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_EvoSparkle[] = +{ + sSpriteAnim_EvoSparkle, +}; + +static const struct SpriteTemplate sEvoSparkleSpriteTemplate = +{ + .tileTag = 1001, + .paletteTag = 1001, + .oam = &sOamData_EvoSparkle, + .anims = sSpriteAnimTable_EvoSparkle, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = EvoSparkle_DummySpriteCb +}; + +static const s16 sEvoSparkleMatricies[] = +{ + 0x3C0, 0x380, 0x340, 0x300, 0x2C0, 0x280, 0x240, 0x200, 0x1C0, + 0x180, 0x140, 0x100, -4, 0x10, -3, 0x30, -2, 0x50, + -1, 0x70, 0x1, 0x70, 0x2, 0x50, 0x3, 0x30, 0x4, 0x10 +}; + +// code + +static void EvoSparkle_DummySpriteCb(struct Sprite* sprite) +{ + +} + +static void SetEvoSparklesMatrices(void) +{ + u16 i; + for (i = 0; i < 12; i++) + { + SetOamMatrix(20 + i, sEvoSparkleMatricies[i], 0, 0, sEvoSparkleMatricies[i]); + } +} + +static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite) +{ + if (sprite->pos1.y > 8) + { + u8 matrixNum; + + sprite->pos1.y = 88 - (sprite->data[7] * sprite->data[7]) / 80; + sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4; + sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); + sprite->data[6] += 4; + if (sprite->data[7] & 1) + sprite->data[5]--; + sprite->data[7]++; + if (sprite->pos2.y > 0) + sprite->subpriority = 1; + else + sprite->subpriority = 20; + matrixNum = sprite->data[5] / 4 + 20; + if (matrixNum > 31) + matrixNum = 31; + sprite->oam.matrixNum = matrixNum; + } + else + DestroySprite(sprite); +} + +static void CreatePreEvoSparkleSet1(u8 arg0) +{ + u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 88, 0); + if (spriteID != MAX_SPRITES) + { + gSprites[spriteID].data[5] = 48; + gSprites[spriteID].data[6] = arg0; + gSprites[spriteID].data[7] = 0; + gSprites[spriteID].oam.affineMode = 1; + gSprites[spriteID].oam.matrixNum = 31; + gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet1; + } +} + +static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite) +{ + if (sprite->pos1.y < 88) + { + sprite->pos1.y = 8 + (sprite->data[7] * sprite->data[7]) / 5; + sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4; + sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); + sprite->data[5] = 8 + Sin((u8)(sprite->data[7] * 4), 40); + sprite->data[7]++; + } + else + DestroySprite(sprite); +} + +static void CreatePreEvoSparkleSet2(u8 arg0) +{ + u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 8, 0); + if (spriteID != MAX_SPRITES) + { + gSprites[spriteID].data[5] = 8; + gSprites[spriteID].data[6] = arg0; + gSprites[spriteID].data[7] = 0; + gSprites[spriteID].oam.affineMode = 1; + gSprites[spriteID].oam.matrixNum = 25; + gSprites[spriteID].subpriority = 1; + gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet2; + } +} + +static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite) +{ + if (sprite->data[5] > 8) + { + sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]); + sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); + sprite->data[5] -= sprite->data[3]; + sprite->data[6] += 4; + } + else + DestroySprite(sprite); +} + +static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1) +{ + u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0); + if (spriteID != MAX_SPRITES) + { + gSprites[spriteID].data[3] = arg1; + gSprites[spriteID].data[5] = 120; + gSprites[spriteID].data[6] = arg0; + gSprites[spriteID].data[7] = 0; + gSprites[spriteID].oam.affineMode = 1; + gSprites[spriteID].oam.matrixNum = 31; + gSprites[spriteID].subpriority = 1; + gSprites[spriteID].callback = SpriteCB_PostEvoSparkleSet1; + } +} + +static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite) +{ + if (!(sprite->data[7] & 3)) + sprite->pos1.y++; + if (sprite->data[6] < 128) + { + u8 matrixNum; + + sprite->pos2.y = -Sin((u8)(sprite->data[6]), sprite->data[5]); + sprite->pos1.x = 120 + (sprite->data[3] * sprite->data[7]) / 3; + sprite->data[6]++; + matrixNum = 31 - (sprite->data[6] * 12 / 128); + if (sprite->data[6] > 64) + sprite->subpriority = 1; + else + { + sprite->invisible = 0; + sprite->subpriority = 20; + if (sprite->data[6] > 112 && sprite->data[6] & 1) + sprite->invisible = 1; + } + if (matrixNum < 20) + matrixNum = 20; + sprite->oam.matrixNum = matrixNum; + sprite->data[7]++; + } + else + DestroySprite(sprite); +} + +static void CreatePostEvoSparkleSet2(u8 arg0) +{ + u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0); + if (spriteID != MAX_SPRITES) + { + gSprites[spriteID].data[3] = 3 - (Random() % 7); + gSprites[spriteID].data[5] = 48 + (Random() & 0x3F); + gSprites[spriteID].data[7] = 0; + gSprites[spriteID].oam.affineMode = 1; + gSprites[spriteID].oam.matrixNum = 31; + gSprites[spriteID].subpriority = 20; + gSprites[spriteID].callback = SpriteCB_PostEvoSparkleSet2; + } +} + +void LoadEvoSparkleSpriteAndPal(void) +{ + LoadCompressedObjectPic(&sEvoSparkleSpriteSheets[0]); + LoadSpritePalettes(sEvoSparkleSpritePals); +} + +#define tFrameCounter data[15] + +u8 LaunchTask_PreEvoSparklesSet1(u16 arg0) +{ + u8 taskID = CreateTask(EvoTask_BeginPreSet1_FadeAndPlaySE, 0); + gTasks[taskID].data[1] = arg0; + return taskID; +} + +static void EvoTask_BeginPreSet1_FadeAndPlaySE(u8 taskID) +{ + SetEvoSparklesMatrices(); + gTasks[taskID].tFrameCounter = 0; + BeginNormalPaletteFade(3 << gTasks[taskID].data[1], 0xA, 0, 0x10, 0x7FFF); + gTasks[taskID].func = EvoTask_CreatePreEvoSparkleSet1; + PlaySE(SE_W025); +} + +static void EvoTask_CreatePreEvoSparkleSet1(u8 taskID) +{ + if (gTasks[taskID].tFrameCounter < 64) + { + if (!(gTasks[taskID].tFrameCounter & 7)) + { + u8 i; + for (i = 0; i < 4; i++) + CreatePreEvoSparkleSet1((0x78 & gTasks[taskID].tFrameCounter) * 2 + i * 64); + } + gTasks[taskID].tFrameCounter++; + } + else + { + gTasks[taskID].tFrameCounter = 96; + gTasks[taskID].func = EvoTask_WaitForPre1SparklesToGoUp; + } +} + +static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskID) +{ + if (gTasks[taskID].tFrameCounter != 0) + gTasks[taskID].tFrameCounter--; + else + DestroyTask(taskID); +} + +u8 LaunchTask_PreEvoSparklesSet2(void) +{ + return CreateTask(EvoTask_BeginPreSparklesSet2, 0); +} + +static void EvoTask_BeginPreSparklesSet2(u8 taskID) +{ + SetEvoSparklesMatrices(); + gTasks[taskID].tFrameCounter = 0; + gTasks[taskID].func = EvoTask_CreatePreEvoSparklesSet2; + PlaySE(SE_W062B); +} + +static void EvoTask_CreatePreEvoSparklesSet2(u8 taskID) +{ + if (gTasks[taskID].tFrameCounter < 96) + { + if (gTasks[taskID].tFrameCounter < 6) + { + u8 i; + for (i = 0; i < 9; i++) + CreatePreEvoSparkleSet2(i * 16); + } + gTasks[taskID].tFrameCounter++; + } + else + gTasks[taskID].func = EvoTask_DestroyPreSet2Task; +} + +static void EvoTask_DestroyPreSet2Task(u8 taskID) +{ + DestroyTask(taskID); +} + +u8 LaunchTask_PostEvoSparklesSet1(void) +{ + return CreateTask(EvoTask_BeginPostSparklesSet1, 0); +} + +static void EvoTask_BeginPostSparklesSet1(u8 taskID) +{ + SetEvoSparklesMatrices(); + gTasks[taskID].tFrameCounter = 0; + gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet1; + PlaySE(SE_REAPOKE); +} + +static void EvoTask_CreatePostEvoSparklesSet1(u8 taskID) +{ + if (gTasks[taskID].tFrameCounter < 48) + { + if (gTasks[taskID].tFrameCounter == 0) + { + u8 i; + for (i = 0; i < 16; i++) + CreatePostEvoSparkleSet1(i * 16, 4); + } + if (gTasks[taskID].tFrameCounter == 32) + { + u8 i; + for (i = 0; i < 16; i++) + CreatePostEvoSparkleSet1(i * 16, 8); + } + gTasks[taskID].tFrameCounter++; + } + else + gTasks[taskID].func = EvoTask_DestroyPostSet1Task; +} + +static void EvoTask_DestroyPostSet1Task(u8 taskID) +{ + DestroyTask(taskID); +} + +u8 LaunchTask_PostEvoSparklesSet2AndFlash(u16 species) +{ + u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash, 0); + gTasks[taskID].data[2] = species; + return taskID; +} + +static void EvoTask_BeginPostSparklesSet2_AndFlash(u8 taskID) +{ + SetEvoSparklesMatrices(); + gTasks[taskID].tFrameCounter = 0; + CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); + BeginNormalPaletteFade(0xFFF9001C, 0, 0, 0x10, 0x7FFF); + gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet2_AndFlash; + PlaySE(SE_W080); +} + +static void EvoTask_CreatePostEvoSparklesSet2_AndFlash(u8 taskID) +{ + if (gTasks[taskID].tFrameCounter < 128) + { + u8 i; + switch (gTasks[taskID].tFrameCounter) + { + default: + if (gTasks[taskID].tFrameCounter < 50) + CreatePostEvoSparkleSet2(Random() & 7); + break; + case 0: + for (i = 0; i < 8; i++) + CreatePostEvoSparkleSet2(i); + break; + case 32: + BeginNormalPaletteFade(0xFFFF001C, 0x10, 0x10, 0, 0x7FFF); + break; + } + gTasks[taskID].tFrameCounter++; + } + else + gTasks[taskID].func = EvoTask_DestroyPostSet2AndFlashTask; +} + +static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID) +{ + if (!gPaletteFade.active) + DestroyTask(taskID); +} + +u8 LaunchTask_PostEvoSparklesSet2AndFlash_Trade(u16 species) +{ + u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash_Trade, 0); + gTasks[taskID].data[2] = species; + return taskID; +} + +static void EvoTask_BeginPostSparklesSet2_AndFlash_Trade(u8 taskID) +{ + SetEvoSparklesMatrices(); + gTasks[taskID].tFrameCounter = 0; + CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); + BeginNormalPaletteFade(0xFFF90001, 0, 0, 0x10, 0x7FFF); + gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade; + PlaySE(SE_W080); +} + +static void EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade(u8 taskID) +{ + if (gTasks[taskID].tFrameCounter < 128) + { + u8 i; + switch (gTasks[taskID].tFrameCounter) + { + default: + if (gTasks[taskID].tFrameCounter < 50) + CreatePostEvoSparkleSet2(Random() & 7); + break; + case 0: + for (i = 0; i < 8; i++) + CreatePostEvoSparkleSet2(i); + break; + case 32: + BeginNormalPaletteFade(0xFFFF0001, 0x10, 0x10, 0, 0x7FFF); + break; + } + gTasks[taskID].tFrameCounter++; + } + else + gTasks[taskID].func = EvoTask_DestroyPostSet2AndFlashTask; +} + +#undef tFrameCounter + +static void PokeEvoSprite_DummySpriteCB(struct Sprite* sprite) +{ + +} + +#define tPreEvoSpriteID data[1] +#define tPostEvoSpriteID data[2] +#define tEvoStopped data[8] + +u8 sub_8149E7C(u8 preEvoSpriteID, u8 postEvoSpriteID) +{ + u16 i; + u16 stack[16]; + u8 taskID; + s32 toDiv; + + for (i = 0; i < 16; i++) + stack[i] = 0x7FFF; + + taskID = CreateTask(sub_8149FC8, 0); + gTasks[taskID].tPreEvoSpriteID = preEvoSpriteID; + gTasks[taskID].tPostEvoSpriteID = postEvoSpriteID; + gTasks[taskID].data[3] = 256; + gTasks[taskID].data[4] = 16; + + toDiv = 65536; + SetOamMatrix(30, 256, 0, 0, 256); + SetOamMatrix(31, toDiv / gTasks[taskID].data[4], 0, 0, toDiv / gTasks[taskID].data[4]); + + gSprites[preEvoSpriteID].callback = PokeEvoSprite_DummySpriteCB; + gSprites[preEvoSpriteID].oam.affineMode = 1; + gSprites[preEvoSpriteID].oam.matrixNum = 30; + gSprites[preEvoSpriteID].invisible = 0; + CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[preEvoSpriteID].oam.paletteNum * 16)], 16); + + gSprites[postEvoSpriteID].callback = PokeEvoSprite_DummySpriteCB; + gSprites[postEvoSpriteID].oam.affineMode = 1; + gSprites[postEvoSpriteID].oam.matrixNum = 31; + gSprites[postEvoSpriteID].invisible = 0; + CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[postEvoSpriteID].oam.paletteNum * 16)], 16); + + gTasks[taskID].tEvoStopped = FALSE; + return taskID; +} + +static void sub_8149FC8(u8 taskID) +{ + gTasks[taskID].data[5] = 0; + gTasks[taskID].data[6] = 8; + gTasks[taskID].func = sub_8149FEC; +} + +static void sub_8149FEC(u8 taskID) +{ + if (gTasks[taskID].tEvoStopped) + PreEvoVisible_PostEvoInvisible_KillTask(taskID); + else if (gTasks[taskID].data[6] == 128) + PreEvoInVisible_PostEvoVisible_KillTask(taskID); + else + { + gTasks[taskID].data[6] += 2; + gTasks[taskID].data[5] ^= 1; + gTasks[taskID].func = sub_814A03C; + } +} + +static void sub_814A03C(u8 taskID) +{ + if (gTasks[taskID].tEvoStopped) + gTasks[taskID].func = PreEvoVisible_PostEvoInvisible_KillTask; + else + { + u16 oamMatrixArg; + u8 r6 = 0; + if (gTasks[taskID].data[5] == 0) + { + if (gTasks[taskID].data[3] < 256 - gTasks[taskID].data[6]) + gTasks[taskID].data[3] += gTasks[taskID].data[6]; + else + { + gTasks[taskID].data[3] = 256; + r6++; + } + if (gTasks[taskID].data[4] > 16 + gTasks[taskID].data[6]) + gTasks[taskID].data[4] -= gTasks[taskID].data[6]; + else + { + gTasks[taskID].data[4] = 16; + r6++; + } + } + else + { + if (gTasks[taskID].data[4] < 256 - gTasks[taskID].data[6]) + gTasks[taskID].data[4] += gTasks[taskID].data[6]; + else + { + gTasks[taskID].data[4] = 256; + r6++; + } + if (gTasks[taskID].data[3] > 16 + gTasks[taskID].data[6]) + gTasks[taskID].data[3] -= gTasks[taskID].data[6]; + else + { + gTasks[taskID].data[3] = 16; + r6++; + } + } + oamMatrixArg = 65536 / gTasks[taskID].data[3]; + SetOamMatrix(30, oamMatrixArg, 0, 0, oamMatrixArg); + + oamMatrixArg = 65536 / gTasks[taskID].data[4]; + SetOamMatrix(31, oamMatrixArg, 0, 0, oamMatrixArg); + if (r6 == 2) + gTasks[taskID].func = sub_8149FEC; + } +} + +static void PreEvoInVisible_PostEvoVisible_KillTask(u8 taskID) +{ + gSprites[gTasks[taskID].tPreEvoSpriteID].oam.affineMode = 0; + gSprites[gTasks[taskID].tPreEvoSpriteID].oam.matrixNum = 0; + gSprites[gTasks[taskID].tPreEvoSpriteID].invisible = 1; + + gSprites[gTasks[taskID].tPostEvoSpriteID].oam.affineMode = 0; + gSprites[gTasks[taskID].tPostEvoSpriteID].oam.matrixNum = 0; + gSprites[gTasks[taskID].tPostEvoSpriteID].invisible = 0; + + DestroyTask(taskID); +} + +static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskID) +{ + gSprites[gTasks[taskID].tPreEvoSpriteID].oam.affineMode = 0; + gSprites[gTasks[taskID].tPreEvoSpriteID].oam.matrixNum = 0; + gSprites[gTasks[taskID].tPreEvoSpriteID].invisible = 0; + + gSprites[gTasks[taskID].tPostEvoSpriteID].oam.affineMode = 0; + gSprites[gTasks[taskID].tPostEvoSpriteID].oam.matrixNum = 0; + gSprites[gTasks[taskID].tPostEvoSpriteID].invisible = 1; + + DestroyTask(taskID); +} diff --git a/src/evolution_scene.c b/src/evolution_scene.c new file mode 100644 index 000000000..3ba325574 --- /dev/null +++ b/src/evolution_scene.c @@ -0,0 +1,3959 @@ +#include "global.h" +#include "task.h" +#include "evolution_scene.h" +#include "evolution_graphics.h" +#include "palette.h" +#include "main.h" +#include "text.h" +#include "text_window.h" +#include "pokemon.h" +#include "string_util.h" +#include "battle.h" +#include "scanline_effect.h" +#include "data2.h" +#include "decompress.h" +#include "m4a.h" +#include "trade.h" +#include "menu.h" +#include "pokedex.h" +#include "constants/species.h" +#include "sound.h" +#include "constants/songs.h" +#include "overworld.h" +#include "battle_message.h" +#include "pokemon_summary_screen.h" +#include "menu_cursor.h" +#include "strings2.h" +#include "ewram.h" + +struct EvoInfo +{ + u8 preEvoSpriteID; + u8 postEvoSpriteID; + u8 evoTaskID; + u8 field_3; + + u8 unk4[0x40]; + u8 unk44[0x40]; + u8 unk84[0x40]; + + u8 unkC4[0x40][0x20]; // 0x20148C4 + u8 unk8C4[0x40][0x20]; // 0x20150C4 + u8 unk10C4[0x40][0x20]; // 0x20158C4 + u8 unk18C4[0x40][0x20]; // 0x20160C4 + u8 unk20C4[0x40][0x20]; // 0x20168C4 + u8 unk28C4[0x40][0x20]; // 0x20170C4 + u8 unk30C4[0x40][0x20]; // 0x20178C4 + u8 unk38C4[0x40][0x20]; // 0x20180C4 + + u8 *unk40C4[0x40][0x20]; // 0x20188C4 + + u16 unk60C4[0x40][0x20]; // 0x201A8C4 + u16 unk70C4[0x40][0x20]; // 0x201B8C4 + u16 unk80C4[0x40][0x20]; // 0x201C8C4 + u16 unk90C4[0x40][0x20]; // 0x201D8C4 + + u8 unkA0C4; // 0x201E8C4 +}; + +void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); +void sub_8024CEC(void); +void sub_8023A80(void); +void sub_802BC6C(void); +void sub_8023AD8(void); +void nullsub_6(void); +bool32 IsHMMove2(u16 move); + +extern struct Window gUnknown_03004210; +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattle_BG3_X; +extern u16 gBattle_BG3_Y; +extern u8 gBattleTerrain; +extern u8 gReservedSpritePaletteCount; +extern u16 gMoveToLearn; +extern struct SpriteTemplate gUnknown_02024E8C; +extern bool8 gAffineAnimsDisabled; +extern u8 gDisplayedStringBattle[]; +extern u8 gBattleTextBuff2[]; + +extern u8 gBattleCommunication[]; +#define sEvoCursorPos gBattleCommunication[1] // when learning a new move +#define sEvoGraphicsTaskID gBattleCommunication[2] + +extern const u8 BattleText_StartEvo[]; +extern const u8 BattleText_FinishEvo[]; +extern const u8 BattleText_StopEvo[]; +extern const u8 *const gBattleStringsTable[]; + +// this file's functions +static void Task_EvolutionScene(u8 taskID); +static void Task_TradeEvolutionScene(u8 taskID); +static void CB2_EvolutionSceneUpdate(void); +static void CB2_TradeEvolutionSceneUpdate(void); +static void EvoDummyFunc(void); +static void EvoDummyFunc2(void); +static void VBlankCB_EvolutionScene(void); +static void VBlankCB_TradeEvolutionScene(void); +static void sub_81150D8(void); + +// iwram common +MainCallback gCB2_AfterEvolution; + +// const data +static const u8 sUnknownShedinjaJpnString[] = _("ヌケニン"); +static const u8 sUnusedString0[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE2}{SHADOW LIGHT_GREY}"); +static const u8 sUnusedString1[] = _("▶\n "); +static const u8 sUnusedString2[] = _(" \n▶"); +static const u8 sUnusedString3[] = _(" \n "); +static const u8 sPadding[9] = {0}; + +// code + +static void CB2_BeginEvolutionScene(void) +{ + UpdatePaletteFade(); + RunTasks(); +} + +#define tState data[0] +#define tMonPtrHI data[1] +#define tMonPtrLO data[2] +#define tPreEvoSpecies data[3] +#define tPostEvoSpecies data[4] +#define tCanStop data[5] // in first fast data[5] only checks that +#define tBits data[5] // in the second task, it works as a bitfield +#define tLearnsFirstMove data[6] +#define tLearnMoveState data[8] +#define tData9 data[9] +#define tdata10 data[10] +#define tEvoWasStopped data[11] +#define tPartyID data[12] + +#define TASK_BIT_CAN_STOP 0x1 +#define TASK_BIT_LEARN_MOVE 0x80 + +static void Task_BeginEvolutionScene(u8 taskID) +{ + struct Pokemon* mon = NULL; + switch (gTasks[taskID].tState) + { + case 0: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].tState++; + break; + case 1: + if (!gPaletteFade.active) + { + u16 speciesToEvolve; + bool8 canStopEvo; + u8 partyID; + + mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10)); + speciesToEvolve = gTasks[taskID].tPostEvoSpecies; + canStopEvo = gTasks[taskID].tCanStop; + partyID = gTasks[taskID].tPartyID; + + DestroyTask(taskID); + EvolutionScene(mon, speciesToEvolve, canStopEvo, partyID); + } + break; + } +} + +void BeginEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID) +{ + u8 taskID = CreateTask(Task_BeginEvolutionScene, 0); + gTasks[taskID].tState = 0; + gTasks[taskID].tMonPtrHI = (u32)(mon); + gTasks[taskID].tMonPtrLO = (u32)(mon) >> 0x10; + gTasks[taskID].tPostEvoSpecies = speciesToEvolve; + gTasks[taskID].tCanStop = canStopEvo; + gTasks[taskID].tPartyID = partyID; + SetMainCallback2(CB2_BeginEvolutionScene); +} + +void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID) +{ + u8 name[20]; + u16 currSpecies; + u32 TiD, PiD; + const struct CompressedSpritePalette** pokePal; + u8 ID; + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + CpuFill32(0, (void*)(VRAM), VRAM_SIZE); + + REG_MOSAIC = 0; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); + ResetPaletteFade(); + + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; + + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); + gBattleTerrain = BATTLE_TERRAIN_PLAIN; + + sub_800D6D4(); + sub_800DAB8(); + ResetSpriteData(); + ScanlineEffect_Stop(); + ResetTasks(); + FreeAllSpritePalettes(); + + gReservedSpritePaletteCount = 4; + + GetMonData(mon, MON_DATA_NICKNAME, name); + StringCopy10(gStringVar1, name); + StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]); + + // preEvo sprite + currSpecies = GetMonData(mon, MON_DATA_SPECIES); + TiD = GetMonData(mon, MON_DATA_OT_ID); + PiD = GetMonData(mon, MON_DATA_PERSONALITY); + DecompressPicFromTable_2(&gMonFrontPicTable[currSpecies], + gMonFrontPicCoords[currSpecies].coords, + gMonFrontPicCoords[currSpecies].y_offset, + (void*)(0x2000000), + gUnknown_081FAF4C[1], currSpecies); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(currSpecies, TiD, PiD); + LoadCompressedPalette(*pokePal, 0x110, 0x20); + + GetMonSpriteTemplate_803C56C(currSpecies, 1); + gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; + sEvoInfo.preEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); + + gSprites[ID].callback = nullsub_37; + gSprites[ID].oam.paletteNum = 1; + gSprites[ID].invisible = 1; + + // postEvo sprite + DecompressPicFromTable_2(&gMonFrontPicTable[speciesToEvolve], + gMonFrontPicCoords[speciesToEvolve].coords, + gMonFrontPicCoords[speciesToEvolve].y_offset, + (void*)(0x2000000), + gUnknown_081FAF4C[3], speciesToEvolve); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD); + LoadCompressedPalette(*pokePal, 0x120, 0x20); + + GetMonSpriteTemplate_803C56C(speciesToEvolve, 3); + gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; + sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); + gSprites[ID].callback = nullsub_37; + gSprites[ID].oam.paletteNum = 2; + gSprites[ID].invisible = 1; + + LoadEvoSparkleSpriteAndPal(); + + sEvoInfo.evoTaskID = ID = CreateTask(Task_EvolutionScene, 0); + gTasks[ID].tState = 0; + gTasks[ID].tPreEvoSpecies = currSpecies; + gTasks[ID].tPostEvoSpecies = speciesToEvolve; + gTasks[ID].tMonPtrHI = (u32)(mon); + gTasks[ID].tMonPtrLO = (u32)(mon) >> 0x10; + gTasks[ID].tCanStop = canStopEvo; + gTasks[ID].tLearnsFirstMove = TRUE; + gTasks[ID].tEvoWasStopped = FALSE; + gTasks[ID].tPartyID = partyID; + + memcpy(ewram9000_hack, &gPlttBufferUnfaded[0x20], 0x60); + + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; + SetHBlankCallback(EvoDummyFunc); + SetVBlankCallback(VBlankCB_EvolutionScene); + m4aMPlayAllStop(); + SetMainCallback2(CB2_EvolutionSceneUpdate); +} + +static void CB2_EvolutionSceneLoadGraphics(void) +{ + u8 ID; + const struct CompressedSpritePalette** pokePal; + u16 postEvoSpecies; + u32 TiD, PiD; + struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoInfo.evoTaskID].tPartyID]; + + postEvoSpecies = gTasks[sEvoInfo.evoTaskID].tPostEvoSpecies; + TiD = GetMonData(Mon, MON_DATA_OT_ID); + PiD = GetMonData(Mon, MON_DATA_PERSONALITY); + + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + CpuFill32(0, (void*)(VRAM), VRAM_SIZE); + + REG_MOSAIC = 0; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); + ResetPaletteFade(); + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; + + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); + gBattleTerrain = BATTLE_TERRAIN_PLAIN; + + sub_800D6D4(); + sub_800DAB8(); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + + DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies], + gMonFrontPicCoords[postEvoSpecies].coords, + gMonFrontPicCoords[postEvoSpecies].y_offset, + (void*)(0x2000000), + gUnknown_081FAF4C[3], postEvoSpecies); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD); + LoadCompressedPalette(*pokePal, 0x120, 0x20); + + GetMonSpriteTemplate_803C56C(postEvoSpecies, 3); + gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; + sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); + + gSprites[ID].callback = nullsub_37; + gSprites[ID].oam.paletteNum = 2; + + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; + SetHBlankCallback(EvoDummyFunc); + SetVBlankCallback(VBlankCB_EvolutionScene); + SetMainCallback2(CB2_EvolutionSceneUpdate); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); +} + +static void CB2_TradeEvolutionSceneLoadGraphics(void) +{ + struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoInfo.evoTaskID].tPartyID]; + u16 postEvoSpecies = gTasks[sEvoInfo.evoTaskID].tPostEvoSpecies; + + switch (gMain.state) + { + case 0: + REG_DISPCNT = 0; + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; + gMain.state++; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E6F84); + gMain.state++; + break; + case 2: + TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); + gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); + Menu_EraseScreen(); + ResetPaletteFade(); + gMain.state++; + SetHBlankCallback(EvoDummyFunc); + SetVBlankCallback(VBlankCB_TradeEvolutionScene); + break; + case 3: + sub_804E22C(); + gMain.state++; + break; + case 4: + { + const struct CompressedSpritePalette** pokePal; + u32 TiD = GetMonData(Mon, MON_DATA_OT_ID); + u32 PiD = GetMonData(Mon, MON_DATA_PERSONALITY); + DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies], + gMonFrontPicCoords[postEvoSpecies].coords, + gMonFrontPicCoords[postEvoSpecies].y_offset, + (void*)(0x2000000), + gUnknown_081FAF4C[3], postEvoSpecies); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD); + LoadCompressedPalette(*pokePal, 0x120, 0x20); + gMain.state++; + } + break; + case 5: + { + u8 ID; + + GetMonSpriteTemplate_803C56C(postEvoSpecies, 3); + gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; + sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); + + gSprites[ID].callback = nullsub_37; + gSprites[ID].oam.paletteNum = 2; + gMain.state++; + } + break; + case 6: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + SetMainCallback2(CB2_TradeEvolutionSceneUpdate); + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP; + break; + } +} + +void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpriteID, u8 partyID) +{ + u8 name[20]; + u16 currSpecies; + u32 TiD, PiD; + const struct CompressedSpritePalette** pokePal; + u8 ID; + + GetMonData(mon, MON_DATA_NICKNAME, name); + StringCopy10(gStringVar1, name); + StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]); + + gAffineAnimsDisabled = TRUE; + + // preEvo sprite + currSpecies = GetMonData(mon, MON_DATA_SPECIES); + PiD = GetMonData(mon, MON_DATA_PERSONALITY); + TiD = GetMonData(mon, MON_DATA_OT_ID); + sEvoInfo.preEvoSpriteID = preEvoSpriteID; + DecompressPicFromTable_2(&gMonFrontPicTable[speciesToEvolve], + gMonFrontPicCoords[speciesToEvolve].coords, + gMonFrontPicCoords[speciesToEvolve].y_offset, + (void*)(0x2000000), + gUnknown_081FAF4C[1], speciesToEvolve); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD); + LoadCompressedPalette(*pokePal, 0x120, 0x20); + + GetMonSpriteTemplate_803C56C(speciesToEvolve, 1); + gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; + sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); + + gSprites[ID].callback = nullsub_37; + gSprites[ID].oam.paletteNum = 2; + gSprites[ID].invisible = 1; + + LoadEvoSparkleSpriteAndPal(); + + sEvoInfo.evoTaskID = ID = CreateTask(Task_TradeEvolutionScene, 0); + gTasks[ID].tState = 0; + gTasks[ID].tPreEvoSpecies = currSpecies; + gTasks[ID].tPostEvoSpecies = speciesToEvolve; + gTasks[ID].tMonPtrHI = (u32)(mon); + gTasks[ID].tMonPtrLO = (u32)(mon) >> 0x10; + gTasks[ID].tLearnsFirstMove = TRUE; + gTasks[ID].tEvoWasStopped = FALSE; + gTasks[ID].tPartyID = partyID; + + SetMainCallback2(CB2_TradeEvolutionSceneUpdate); +} + +static void CB2_EvolutionSceneUpdate(void) +{ + AnimateSprites(); + BuildOamBuffer(); + Text_UpdateWindowInBattle(&gUnknown_03004210); + UpdatePaletteFade(); + RunTasks(); +} + +static void CB2_TradeEvolutionSceneUpdate(void) +{ + AnimateSprites(); + BuildOamBuffer(); + Text_UpdateWindow(&gUnknown_03004828->window); + UpdatePaletteFade(); + RunTasks(); +} + +static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) +{ + u32 data = 0; + + if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6) + { + s32 i; + struct Pokemon* Shedinja = &gPlayerParty[gPlayerPartyCount]; + + CopyMon(Shedinja, mon, sizeof(struct Pokemon)); + SetMonData(Shedinja, MON_DATA_SPECIES, (void*)&gEvolutionTable[preEvoSpecies][1].targetSpecies); + SetMonData(Shedinja, MON_DATA_NICKNAME, (void*)gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); + SetMonData(Shedinja, MON_DATA_HELD_ITEM, (void*)&data); + SetMonData(Shedinja, MON_DATA_MARKINGS, (void*)&data); + SetMonData(Shedinja, MON_DATA_10, (void*)&data); + for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + 5; i++) + SetMonData(Shedinja, i, (void*)&data); + for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FATEFUL_ENCOUNTER; i++) + SetMonData(Shedinja, i, (void*)&data); + SetMonData(Shedinja, MON_DATA_STATUS, (void*)&data); + data = 0xFF; + SetMonData(Shedinja, MON_DATA_MAIL, (void*)&data); + + CalculateMonStats(Shedinja); + CalculatePlayerPartyCount(); + + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), 3); + + if (GetMonData(Shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA + && GetMonData(Shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE + && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK) + SetMonData(Shedinja, MON_DATA_NICKNAME, sUnknownShedinjaJpnString); + } +} + +static void Task_EvolutionScene(u8 taskID) +{ + u32 var; + struct Pokemon* mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10)); + + // check if B Button was held, so the evolution gets stopped + if (gMain.heldKeys == B_BUTTON && gTasks[taskID].tState == 8 && gTasks[taskID].tBits & TASK_BIT_CAN_STOP) + { + gTasks[taskID].tState = 16; + if (gTasks[sEvoGraphicsTaskID].isActive) + gTasks[sEvoGraphicsTaskID].EvoGraphicsTaskEvoStop = TRUE; + } + switch (gTasks[taskID].tState) + { + case 0: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gSprites[sEvoInfo.preEvoSpriteID].invisible = 0; + gTasks[taskID].tState++; + break; + case 1: // print 'whoa, poke is evolving!!!' msg + if (!gPaletteFade.active) + { + StringExpandPlaceholders(gStringVar4, BattleText_StartEvo); + Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); + gTasks[taskID].tState++; + } + break; + case 2: // wait for string, play cry + if (gUnknown_03004210.state == 0) + { + PlayCry1(gTasks[taskID].tPreEvoSpecies, 0); + gTasks[taskID].tState++; + } + break; + case 3: // wait for cry, play tu du SE + if (IsCryFinished()) + { + PlaySE(BGM_ME_SHINKA); + gTasks[taskID].tState++; + } + break; + case 4: // play evolution music and fade screen black + if (!IsSEPlaying()) + { + PlayNewMapMusic(BGM_SHINKA); + gTasks[taskID].tState++; + BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0); + } + break; + case 5: // after screen fade, preapre evo sparkles + if (!gPaletteFade.active) + { + sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet1(17); + gTasks[taskID].tState++; + } + break; + case 6: // another set of evo sparkles + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + gTasks[taskID].tState++; + sEvoInfo.field_3 = 1; + sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet2(); + } + break; + case 7: // launch task that flashes pre evo with post evo sprites + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + sEvoGraphicsTaskID = sub_8149E7C(sEvoInfo.preEvoSpriteID, sEvoInfo.postEvoSpriteID); + gTasks[taskID].tState++; + } + break; + case 8: // wait for the above task to finish + if (--sEvoInfo.field_3 == 0) + { + sEvoInfo.field_3 = 3; + if (!gTasks[sEvoGraphicsTaskID].isActive) + gTasks[taskID].tState++; + } + break; + case 9: // post evo sparkles + sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet1(); + gTasks[taskID].tState++; + break; + case 10: + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet2AndFlash(gTasks[taskID].tPostEvoSpecies); + gTasks[taskID].tState++; + } + break; + case 11: // play tu du sound after evolution + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + PlaySE(SE_EXP); + gTasks[taskID].tState++; + } + break; + case 12: // play poke cry after evolution and return screed to pre-fade state + if (IsSEPlaying()) + { + m4aMPlayAllStop(); + PlayCry1(gTasks[taskID].tPostEvoSpecies, 0); + memcpy(&gPlttBufferUnfaded[0x20], ewram9000_hack, 0x60); + BeginNormalPaletteFade(0x1C, 0, 0x10, 0, 0); + gTasks[taskID].tState++; + } + break; + case 13: // congratulations string and rename prompt + if (IsCryFinished() && !gPaletteFade.active) + { + StringExpandPlaceholders(gStringVar4, BattleText_FinishEvo); + Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); + PlayBGM(BGM_FANFA5); + gTasks[taskID].tState++; + SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); + CalculateMonStats(mon); + EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); + IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); + } + break; + case 14: // check if it wants to learn a new move + if (gUnknown_03004210.state == 0) + { + var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove); + if (var != 0 && !gTasks[taskID].tEvoWasStopped) + { + u8 text[20]; + + Overworld_PlaySpecialMapMusic(); + gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE; + gTasks[taskID].tLearnsFirstMove = FALSE; + gTasks[taskID].tLearnMoveState = 0; + GetMonData(mon, MON_DATA_NICKNAME, text); + StringCopy10(gBattleTextBuff1, text); + if (var == 0xFFFF) // no place to learn it + gTasks[taskID].tState = 21; + else if (var == 0xFFFE) // it already knows that move + break; + else + gTasks[taskID].tState = 19; // has less than 4 moves, so it's been learned + } + else // no move to learn + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].tState++; + } + } + break; + case 15: // task has finished, return + if (!gPaletteFade.active) + { + if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE)) + Overworld_PlaySpecialMapMusic(); + if (!gTasks[taskID].tEvoWasStopped) + CreateShedinja(gTasks[taskID].tPreEvoSpecies, mon); + DestroyTask(taskID); + SetMainCallback2(gCB2_AfterEvolution); + } + break; + case 16: // evolution has been canceled, stop music and re-fade palette + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + m4aMPlayAllStop(); + BeginNormalPaletteFade(0x6001C, 0, 0x10, 0, 0x7FFF); + gTasks[taskID].tState++; + } + break; + case 17: // play cry of the pokemon trying to evolve again, evolution has been stopped + if (!gPaletteFade.active) + { + PlayCry1(gTasks[taskID].tPreEvoSpecies, 0); + gTasks[taskID].tState++; + } + break; + case 18: // after the cry, print the string 'WHOA IT DID NOT EVOLVE!!!' + if (IsCryFinished()) + { + StringExpandPlaceholders(gStringVar4, BattleText_StopEvo); + Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); + gTasks[taskID].tEvoWasStopped = TRUE; + gTasks[taskID].tState = 14; + } + break; + case 19: // pokemon learned a new move, print string and play a fanfare + if (gUnknown_03004210.state == 0 && !IsSEPlaying()) + { + sub_8024CEC(); + PlayFanfare(BGM_FANFA1); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter + gTasks[taskID].tState++; + } + break; + case 20: // wait a bit and check if can learn another move + if (gUnknown_03004210.state == 0 && !IsSEPlaying() && --gTasks[taskID].tLearnsFirstMove == 0) + gTasks[taskID].tState = 14; + break; + case 21: // try to learn a new move + switch (gTasks[taskID].tLearnMoveState) + { + case 0: + if (gUnknown_03004210.state == 0 && !IsSEPlaying()) + { + sub_8024CEC(); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tLearnMoveState++; + } + break; + case 1: + if (gUnknown_03004210.state == 0 && !IsSEPlaying()) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tLearnMoveState++; + } + break; + case 2: + if (gUnknown_03004210.state != 0) + break; + if (!IsSEPlaying()) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tData9 = 5; + gTasks[taskID].tdata10 = 9; + gTasks[taskID].tLearnMoveState++; + } + case 3: + if (gUnknown_03004210.state == 0 && !IsSEPlaying()) + { + sub_8023A80(); + gTasks[taskID].tLearnMoveState++; + sEvoCursorPos = 0; + sub_802BC6C(); + } + break; + case 4: + if (gMain.newKeys & DPAD_UP && sEvoCursorPos != 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + sEvoCursorPos = 0; + sub_802BC6C(); + } + if (gMain.newKeys & DPAD_DOWN && sEvoCursorPos == 0) + { + PlaySE(SE_SELECT); + nullsub_6(); + sEvoCursorPos = 1; + sub_802BC6C(); + } + if (gMain.newKeys & A_BUTTON) + { + sub_8023AD8(); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + PlaySE(SE_SELECT); + if (sEvoCursorPos != 0) + gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; + else + { + gTasks[taskID].tLearnMoveState = gTasks[taskID].tData9; + if (gTasks[taskID].tLearnMoveState == 5) + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + } + } + if (gMain.newKeys & B_BUTTON) + { + sub_8023AD8(); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + PlaySE(SE_SELECT); + gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; + } + break; + case 5: + if (!gPaletteFade.active) + { + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID, + gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics, + gMoveToLearn); + gTasks[taskID].tLearnMoveState++; + } + break; + case 6: + if (!gPaletteFade.active && gMain.callback2 == CB2_EvolutionSceneUpdate) + { + var = sub_809FA30(); // moveID + if (var == 4) + gTasks[taskID].tLearnMoveState = 9; + else + { + u16 move = GetMonData(mon, var + MON_DATA_MOVE1); + if (IsHMMove2(move)) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tLearnMoveState = 11; + } + else + { + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 2; + gBattleTextBuff2[2] = move; + gBattleTextBuff2[3] = (move & 0xFF00) >> 8; + gBattleTextBuff2[4] = EOS; + RemoveMonPPBonus(mon, var); + SetMonMoveSlot(mon, gMoveToLearn, var); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tLearnMoveState++; + } + } + } + break; + case 7: + if (gUnknown_03004210.state == 0 && !IsSEPlaying()) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tLearnMoveState++; + } + break; + case 8: + if (gUnknown_03004210.state == 0 && !IsSEPlaying()) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tState = 19; + } + break; + case 9: + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[8]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tData9 = 10; + gTasks[taskID].tdata10 = 0; + gTasks[taskID].tLearnMoveState = 3; + break; + case 10: + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[9]); + Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); + gTasks[taskID].tState = 14; + break; + case 11: + if (gUnknown_03004210.state == 0 && !IsSEPlaying()) + gTasks[taskID].tLearnMoveState = 5; + break; + } + break; + } +} + +static void Task_TradeEvolutionScene(u8 taskID) +{ + u32 var; + struct Pokemon* mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10)); + + switch (gTasks[taskID].tState) + { + case 0: + StringExpandPlaceholders(gStringVar4, BattleText_StartEvo); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tState++; + break; + case 1: + if (gUnknown_03004828->window.state == 0) + { + PlayCry1(gTasks[taskID].tPreEvoSpecies, 0); + gTasks[taskID].tState++; + } + break; + case 2: + if (IsCryFinished()) + { + m4aSongNumStop(BGM_SHINKA); + PlaySE(BGM_ME_SHINKA); + gTasks[taskID].tState++; + } + break; + case 3: + if (!IsSEPlaying()) + { + PlayBGM(BGM_SHINKA); + gTasks[taskID].tState++; + BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0); + } + break; + case 4: + if (!gPaletteFade.active) + { + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP; + sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet1(17); + gTasks[taskID].tState++; + } + break; + case 5: + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + gTasks[taskID].tState++; + sEvoInfo.field_3 = 1; + sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet2(); + } + break; + case 6: + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + sEvoGraphicsTaskID = sub_8149E7C(sEvoInfo.preEvoSpriteID, sEvoInfo.postEvoSpriteID); + gTasks[taskID].tState++; + } + break; + case 7: + if (--sEvoInfo.field_3 == 0) + { + sEvoInfo.field_3 = 3; + if (!gTasks[sEvoGraphicsTaskID].isActive) + gTasks[taskID].tState++; + } + break; + case 8: + sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet1(); + gTasks[taskID].tState++; + break; + case 9: + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet2AndFlash_Trade(gTasks[taskID].tPostEvoSpecies); + gTasks[taskID].tState++; + } + break; + case 10: + if (!gTasks[sEvoGraphicsTaskID].isActive) + { + PlaySE(SE_EXP); + gTasks[taskID].tState++; + } + break; + case 11: + if (IsSEPlaying()) + { + PlayCry1(gTasks[taskID].tPostEvoSpecies, 0); + memcpy(&gPlttBufferUnfaded[0x20], ewram9000_hack, 0x60); + BeginNormalPaletteFade(1, 0, 0x10, 0, 0); + gTasks[taskID].tState++; + } + break; + case 12: + if (IsCryFinished() && !gPaletteFade.active) + { + StringExpandPlaceholders(gStringVar4, BattleText_FinishEvo); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + PlayFanfare(BGM_FANFA5); + gTasks[taskID].tState++; + SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); + CalculateMonStats(mon); + EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); + IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); + } + break; + case 13: + if (gUnknown_03004828->window.state == 0 && IsFanfareTaskInactive() == TRUE) + { + var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove); + if (var != 0 && !gTasks[taskID].tEvoWasStopped) + { + u8 text[20]; + + gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE; + gTasks[taskID].tLearnsFirstMove = FALSE; + gTasks[taskID].tLearnMoveState = 0; + GetMonData(mon, MON_DATA_NICKNAME, text); + StringCopy10(gBattleTextBuff1, text); + if (var == 0xFFFF) + gTasks[taskID].tState = 17; + else if (var == 0xFFFE) + break; + else + gTasks[taskID].tState = 15; + } + else + { + PlayBGM(BGM_SHINKA); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gOtherText_LinkStandby2, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tState++; + } + } + break; + case 14: + if (gUnknown_03004828->window.state == 0) + { + DestroyTask(taskID); + SetMainCallback2(gCB2_AfterEvolution); + } + break; + case 15: + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) + { + sub_8024CEC(); + PlayFanfare(BGM_FANFA1); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter + gTasks[taskID].tState++; + } + break; + case 16: + if (gUnknown_03004828->window.state == 0 && IsFanfareTaskInactive() == TRUE && --gTasks[taskID].tLearnsFirstMove == 0) + gTasks[taskID].tState = 13; + break; + case 17: + switch (gTasks[taskID].tLearnMoveState) + { + case 0: + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) + { + sub_8024CEC(); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tLearnMoveState++; + } + break; + case 1: + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tLearnMoveState++; + } + break; + case 2: + if (gUnknown_03004828->window.state != 0) + break; + if (!IsSEPlaying()) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tData9 = 5; + gTasks[taskID].tdata10 = 9; + gTasks[taskID].tLearnMoveState++; + } + case 3: + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) + { + TextWindow_DrawStdFrame(&gUnknown_03004828->window, 24, 8, 29, 13); + sEvoCursorPos = 0; + Text_InitWindow(&gUnknown_03004828->window, gOtherText_YesNoAndPlayer, gUnknown_03004828->textWindowBaseTileNum + 128, 25, 9); + Text_PrintWindow8002F44(&gUnknown_03004828->window); + MenuCursor_Create814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); + sub_81150D8(); + gTasks[taskID].tLearnMoveState++; + sEvoCursorPos = 0; + } + break; + case 4: + if (gMain.newKeys & DPAD_UP && sEvoCursorPos != 0) + { + PlaySE(SE_SELECT); + EvoDummyFunc2(); + sEvoCursorPos = 0; + sub_81150D8(); + } + if (gMain.newKeys & DPAD_DOWN && sEvoCursorPos == 0) + { + PlaySE(SE_SELECT); + EvoDummyFunc2(); + sEvoCursorPos = 1; + sub_81150D8(); + } + if (gMain.newKeys & A_BUTTON) + { + Text_EraseWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); + DestroyMenuCursor(); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + PlaySE(SE_SELECT); + if (sEvoCursorPos != 0) + gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; + else + { + gTasks[taskID].tLearnMoveState = gTasks[taskID].tData9; + if (gTasks[taskID].tLearnMoveState == 5) + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + } + } + if (gMain.newKeys & B_BUTTON) + { + Text_EraseWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); + DestroyMenuCursor(); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + PlaySE(SE_SELECT); + gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; + } + break; + case 5: + if (!gPaletteFade.active) + { + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID, + gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics, + gMoveToLearn); + gTasks[taskID].tLearnMoveState++; + } + break; + case 6: + if (!gPaletteFade.active && gMain.callback2 == CB2_TradeEvolutionSceneUpdate) + { + var = sub_809FA30(); // moveID + if (var == 4) + gTasks[taskID].tLearnMoveState = 9; + else + { + u16 move = GetMonData(mon, var + MON_DATA_MOVE1); + if (IsHMMove2(move)) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tLearnMoveState = 11; + } + else + { + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 2; + gBattleTextBuff2[2] = move; + gBattleTextBuff2[3] = (move & 0xFF00) >> 8; + gBattleTextBuff2[4] = EOS; + RemoveMonPPBonus(mon, var); + SetMonMoveSlot(mon, gMoveToLearn, var); + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tLearnMoveState++; + } + } + } + break; + case 7: + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tLearnMoveState++; + } + break; + case 8: + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) + { + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tState = 15; + } + break; + case 9: + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[8]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tData9 = 10; + gTasks[taskID].tdata10 = 0; + gTasks[taskID].tLearnMoveState = 3; + break; + case 10: + StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[9]); + Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gTasks[taskID].tState = 13; + break; + case 11: + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) + gTasks[taskID].tLearnMoveState = 5; + break; + } + break; + } +} + +/* +DizzyEgg, 27.08.2017 +NOTE: + Functions below are all unused. + What's more, they do NOT exist in Emerald. + That's why I think there is no reason to decompile those, + as they probably were prototypes for the evolution + functions. +*/ + +/* +void unref_sub_8113B50(u8 *a, u8 *b) +{ + //u8 *sp0 = a; + //u8 *sp4 = b; +#define sp0 a +#define sp4 b + s32 sp8; + s32 spC = 0; + u32 sp10 = 0; + s32 sp14; + s32 r6; + u32 r8; + + for (sp8 = 0; sp8 < 64; sp8++) + { + sEvoInfo.unk84[sp8] = 0; + sEvoInfo.unk4[sp8] = 0; + sEvoInfo.unk44[sp8] = 0; + for (r6 = 0; r6 < 32; r6++) + { + sEvoInfo.unk10C4[sp8][r6] = 0; + sEvoInfo.unk18C4[sp8][r6] = 0; + sEvoInfo.unk20C4[sp8][r6] = 0; + sEvoInfo.unk28C4[sp8][r6] = 0; + sEvoInfo.unkC4[sp8][r6] = 0; + sEvoInfo.unk8C4[sp8][r6] = 0; + sEvoInfo.unk30C4[sp8][r6] = 0; + sEvoInfo.unk38C4[sp8][r6] = 0; + + sEvoInfo.unk60C4[sp8][r6] = 0; + sEvoInfo.unk70C4[sp8][r6] = 0; + sEvoInfo.unk80C4[sp8][r6] = 0; + sEvoInfo.unk90C4[sp8][r6] = 0; + } + } + + sEvoInfo.unkA0C4 = 64; + r8 = 0; + for (sp8 = 0; sp8 < 64; sp8++) + { + //_08113C32 + u32 r3 = 0; + u8 *r2 = sp0 + r8; + + for (r6 = 0; r6 < 64; r6++) + { + sEvoInfo.unk40C4[sp8][r6 >> 1] = r2; + switch (r3) + { + case 0: + switch (r6 & 1) + { + case 0: + if (*r2 & 0xF) + { + sEvoInfo.unk10C4[sp8][sEvoInfo.unk4[sp8]] = r6; + r3 = 1; + } + break; + case 1: + if (*r2 & 0xF0) + { + sEvoInfo.unk10C4[sp8][sEvoInfo.unk4[sp8]] = r6; + r3 = 1; + } + break; + } + break; + case 1: + switch (r6 & r3) + { + case 0: + if (*r2 & 0xF) + { + sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6 - 1; + sEvoInfo.unk4[sp8]++; + r3 = 0; + } + break; + case 1: + if (*r2 & 0xF0) + { + sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6 - 1; + sEvoInfo.unk4[sp8]++; + r3 = 0; + } + break; + } + } + //if (!((r6 + 1) & 7)) + if ((r6 + 1) % 8 == 0) + r2 += 0x1D; + else if (r6 & 1) + r2 += 1; + } + if (r3) + { + sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6; + sEvoInfo.unk4[sp8]++; + } + //_08113D26 + if (!((sp8 + 1) & 7)) + r8 += 0xE4; + else + r8 += 4; + } + //_08113D4A + r8 = 0; + for (sp8 = 0; sp8 < 64; sp8++) + { + //_08113D6A + u32 r3 = 0; + u8 *r2 = sp4 + r8; + + for (r6 = 0; r6 < 64; r6++) + { + switch (r3) + { + case 0: + switch (r6 & 1) + { + case 0: + if (*r2 & 0xF) + { + sEvoInfo.unk20C4[sp8][sEvoInfo.unk44[sp8]] = r6; + r3 = 1; + } + break; + case 1: + if (*r2 & 0xF0) + { + sEvoInfo.unk20C4[sp8][sEvoInfo.unk44[sp8]] = r6; + r3 = 1; + } + break; + } + break; + case 1: + switch (r6 & r3) + { + case 0: + if (*r2 & 0xF) + { + sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6 - 1; + sEvoInfo.unk44[sp8]++; + r3 = 0; + } + break; + case 1: + if (*r2 & 0xF0) + { + sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6 - 1; + sEvoInfo.unk44[sp8]++; + r3 = 0; + } + break; + } + } + //_08113DE4 + if (!((r6 + 1) & 7)) + r2 += 0x1D; + else if (r6 & 1) + r2 += 1; + + } + if (r3) + { + sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6; + sEvoInfo.unk44[sp8]++; + } + //if (!((sp8 + 1) & 7)) + if ((sp8 + 1) % 8 == 0) + r8 += 0xE4; + else + r8 += 4; + } + + for (sp8 = 0; sp8 < 0x40; sp8++) //_08113E3A + { + if (sEvoInfo.unk4[sp8] < sEvoInfo.unk44[sp8]) + { + for (spC = 0; spC < sEvoInfo.unk4[sp8]; spC++) + { + sp14 = 0x100; + + for (r6 = 0; r6 < sEvoInfo.unk44[sp8]; r6++) + { + s32 r3; + + //_08113EA4 + if (sEvoInfo.unk10C4[sp8][spC] > sEvoInfo.unk20C4[sp8][r6]) + r3 = sEvoInfo.unk10C4[sp8][spC] - sEvoInfo.unk20C4[sp8][r6]; + else + r3 = sEvoInfo.unk20C4[sp8][r6] - sEvoInfo.unk10C4[sp8][spC]; + + if (sEvoInfo.unk18C4[sp8][spC] > sEvoInfo.unk28C4[sp8][spC]) + r3 += sEvoInfo.unk18C4[sp8][spC] - sEvoInfo.unk28C4[sp8][spC]; + else + r3 += sEvoInfo.unk28C4[sp8][spC] - sEvoInfo.unk18C4[sp8][spC]; + + if (sp14 >= r3 && sEvoInfo.unkC4[sp8][r6] == 0 && sEvoInfo.unk8C4[sp8][r6] == 0) + { + sp10 = r6; + sp14 = r3; + } + } + //_08113F3E + sub_81141F0(spC, sp10, sp8); + } + //_08113F54 + + for (r6 = 0; r6 < sEvoInfo.unk44[sp8]; r6++) + { + if (sEvoInfo.unkC4[sp8][r6] == 0 && sEvoInfo.unk8C4[sp8][r6] == 0) + sub_811430C(r6, sp8); + } + } + //_08113F9E + if (sEvoInfo.unk4[sp8] == sEvoInfo.unk44[sp8]) + { + for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++) + sub_81141F0(r6, r6, sp8); + } + //_08113FCC + if (sEvoInfo.unk4[sp8] > sEvoInfo.unk44[sp8]) + { + for (sp10 = 0; sp10 < sEvoInfo.unk44[sp8]; sp10++) + { + sp14 = 0x100; + + for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++) + { + s32 r3; + + if (sEvoInfo.unk10C4[sp8][r6] > sEvoInfo.unk20C4[sp8][sp10]) + r3 = sEvoInfo.unk10C4[sp8][r6] - sEvoInfo.unk20C4[sp8][sp10]; + else + r3 = sEvoInfo.unk20C4[sp8][sp10] - sEvoInfo.unk10C4[sp8][r6]; + + if (sEvoInfo.unk18C4[sp8][r6] > sEvoInfo.unk28C4[sp8][sp10]) + r3 += sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk28C4[sp8][sp10]; + else + r3 += sEvoInfo.unk28C4[sp8][sp10] - sEvoInfo.unk18C4[sp8][r6]; + + //r3 = abs(sEvoInfo.unk10C4[sp8][r6] - sEvoInfo.unk20C4[sp8][sp10]); + //r3 += abs(sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk28C4[sp8][sp10]); + + if (sp14 > r3 && sEvoInfo.unkC4[sp8][r6] == 0) + { + spC = r6; + sp14 = r3; + } + } + //_081140C4 + sEvoInfo.unk30C4[sp8][spC] = sEvoInfo.unk20C4[sp8][sp10]; + sEvoInfo.unk38C4[sp8][spC] = sEvoInfo.unk28C4[sp8][sp10]; + sEvoInfo.unkC4[sp8][spC] = 1; + } + //_08114104 + for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++) + { + sEvoInfo.unk20C4[sp8][r6] = sEvoInfo.unk30C4[sp8][r6]; + sEvoInfo.unk28C4[sp8][r6] = sEvoInfo.unk38C4[sp8][r6]; + if (sEvoInfo.unkC4[sp8][r6] != 0) + { + sEvoInfo.unkC4[sp8][r6] = 0; + sub_81141F0(r6, r6, sp8); + } + else + { + // Ugh, can't get this part right + //u8 *ptr1 = &sEvoInfo.unk10C4[sp8][r6]; + //u8 *ptr2 = &sEvoInfo.unk18C4[sp8][r6]; + //s32 r2 = *ptr1 + (*ptr2 - *ptr1) / 2; + + //u8 r0_ = sEvoInfo.unk10C4[sp8][r6]; + //u8 r2_ = sEvoInfo.unk18C4[sp8][r6]; + //s32 r2 = (r0_ - r2_) / 2; + + s32 r2 = (sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk10C4[sp8][r6]); + s32 r2_ = sEvoInfo.unk10C4[sp8][r6]; + + sEvoInfo.unk20C4[sp8][r6] = sEvoInfo.unk28C4[sp8][r6] = r2_ + r2 / 2; + sEvoInfo.unk28C4[sp8][r6]++; + sub_81141F0(r6, r6, sp8); + } + } + } + //_081141C4 + } +#undef sp0 +#undef sp4 +} +*/ +__attribute__((naked)) +void unref_sub_8113B50() +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x3C\n\ + str r0, [sp]\n\ + str r1, [sp, 0x4]\n\ + movs r0, 0\n\ + str r0, [sp, 0xC]\n\ + movs r1, 0\n\ + str r1, [sp, 0x10]\n\ + movs r2, 0\n\ + str r2, [sp, 0x8]\n\ + ldr r3, _08113C60 @ =gSharedMem + 0x14800\n\ + mov r12, r3\n\ + ldr r4, _08113C64 @ =0x000018c4\n\ + add r4, r12\n\ + mov r10, r4\n\ + ldr r5, _08113C68 @ =0x000020c4\n\ + add r5, r12\n\ + mov r8, r5\n\ +_08113B7C:\n\ + adds r0, r3, 0\n\ + adds r0, 0x84\n\ + ldr r1, [sp, 0x8]\n\ + adds r0, r1, r0\n\ + strb r2, [r0]\n\ + adds r0, r3, 0x4\n\ + adds r0, r1, r0\n\ + strb r2, [r0]\n\ + ldr r4, _08113C6C @ =gSharedMem + 0x14844\n\ + adds r0, r1, r4\n\ + strb r2, [r0]\n\ + movs r6, 0\n\ + lsls r1, 5\n\ + mov r9, r1\n\ + ldr r5, [sp, 0x8]\n\ + lsls r4, r5, 6\n\ +_08113B9C:\n\ + mov r0, r9\n\ + adds r1, r6, r0\n\ + ldr r5, _08113C70 @ =gSharedMem + 0x158C4\n\ + adds r0, r1, r5\n\ + strb r2, [r0]\n\ + mov r5, r10\n\ + adds r0, r1, r5\n\ + strb r2, [r0]\n\ + mov r5, r8\n\ + adds r0, r1, r5\n\ + strb r2, [r0]\n\ + ldr r5, _08113C74 @ =gSharedMem + 0x170C4\n\ + adds r0, r1, r5\n\ + strb r2, [r0]\n\ + adds r7, r3, 0\n\ + adds r7, 0xC4\n\ + adds r0, r1, r7\n\ + strb r2, [r0]\n\ + ldr r5, _08113C78 @ =0x000008c4\n\ + adds r0, r3, r5\n\ + adds r0, r1, r0\n\ + strb r2, [r0]\n\ + ldr r5, _08113C7C @ =0x000030c4\n\ + adds r0, r3, r5\n\ + adds r0, r1, r0\n\ + strb r2, [r0]\n\ + ldr r5, _08113C80 @ =0x000038c4\n\ + adds r0, r3, r5\n\ + adds r1, r0\n\ + strb r2, [r1]\n\ + lsls r1, r6, 1\n\ + adds r1, r4\n\ + ldr r5, _08113C84 @ =0x000060c4\n\ + adds r0, r3, r5\n\ + adds r0, r1, r0\n\ + strh r2, [r0]\n\ + ldr r5, _08113C88 @ =0x000070c4\n\ + adds r0, r3, r5\n\ + adds r0, r1, r0\n\ + strh r2, [r0]\n\ + ldr r5, _08113C8C @ =0x000080c4\n\ + adds r0, r3, r5\n\ + adds r0, r1, r0\n\ + strh r2, [r0]\n\ + ldr r5, _08113C90 @ =0x000090c4\n\ + adds r0, r3, r5\n\ + adds r1, r0\n\ + strh r2, [r1]\n\ + adds r6, 0x1\n\ + cmp r6, 0x1F\n\ + ble _08113B9C\n\ + ldr r0, [sp, 0x8]\n\ + adds r0, 0x1\n\ + str r0, [sp, 0x8]\n\ + cmp r0, 0x3F\n\ + ble _08113B7C\n\ + ldr r1, _08113C94 @ =0x0000a0c4\n\ + add r1, r12\n\ + movs r0, 0x40\n\ + strb r0, [r1]\n\ + movs r1, 0\n\ + mov r8, r1\n\ + movs r2, 0\n\ + str r2, [sp, 0x8]\n\ + movs r3, 0x80\n\ + lsls r3, 5\n\ + adds r3, r7\n\ + mov r12, r3\n\ + movs r4, 0xC0\n\ + lsls r4, 5\n\ + adds r4, r7\n\ + mov r9, r4\n\ + movs r5, 0\n\ + adds r4, r7, 0\n\ + subs r4, 0xC0\n\ +_08113C32:\n\ + movs r3, 0\n\ + ldr r2, [sp]\n\ + add r2, r8\n\ + movs r6, 0\n\ + ldr r0, [sp, 0x8]\n\ + adds r0, 0x1\n\ + str r0, [sp, 0x30]\n\ + ldr r1, [sp, 0x8]\n\ + lsls r1, 7\n\ + mov r10, r1\n\ + movs r7, 0x1\n\ + negs r7, r7\n\ +_08113C4A:\n\ + asrs r0, r6, 1\n\ + lsls r0, 2\n\ + add r0, r10\n\ + ldr r1, _08113C98 @ =gSharedMem + 0x188C4\n\ + adds r0, r1\n\ + str r2, [r0]\n\ + cmp r3, 0\n\ + beq _08113C9C\n\ + cmp r3, 0x1\n\ + beq _08113CC6\n\ + b _08113CF4\n\ + .align 2, 0\n\ +_08113C60: .4byte gSharedMem + 0x14800\n\ +_08113C64: .4byte 0x000018c4\n\ +_08113C68: .4byte 0x000020c4\n\ +_08113C6C: .4byte gSharedMem + 0x14844\n\ +_08113C70: .4byte gSharedMem + 0x158C4\n\ +_08113C74: .4byte gSharedMem + 0x170C4\n\ +_08113C78: .4byte 0x000008c4\n\ +_08113C7C: .4byte 0x000030c4\n\ +_08113C80: .4byte 0x000038c4\n\ +_08113C84: .4byte 0x000060c4\n\ +_08113C88: .4byte 0x000070c4\n\ +_08113C8C: .4byte 0x000080c4\n\ +_08113C90: .4byte 0x000090c4\n\ +_08113C94: .4byte 0x0000a0c4\n\ +_08113C98: .4byte gSharedMem + 0x188C4\n\ +_08113C9C:\n\ + movs r0, 0x1\n\ + ands r0, r6\n\ + cmp r0, 0\n\ + beq _08113CAA\n\ + cmp r0, 0x1\n\ + beq _08113CB0\n\ + b _08113CF4\n\ +_08113CAA:\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + b _08113CB4\n\ +_08113CB0:\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF0\n\ +_08113CB4:\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08113CF4\n\ + ldrb r0, [r4]\n\ + adds r0, r5\n\ + add r0, r12\n\ + strb r6, [r0]\n\ + movs r3, 0x1\n\ + b _08113CF4\n\ +_08113CC6:\n\ + adds r0, r6, 0\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08113CD4\n\ + cmp r0, 0x1\n\ + beq _08113CDA\n\ + b _08113CF4\n\ +_08113CD4:\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + b _08113CDE\n\ +_08113CDA:\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF0\n\ +_08113CDE:\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08113CF4\n\ + ldrb r0, [r4]\n\ + adds r0, r5\n\ + add r0, r9\n\ + strb r7, [r0]\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + movs r3, 0\n\ +_08113CF4:\n\ + adds r0, r6, 0x1\n\ + movs r1, 0x7\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08113D02\n\ + adds r2, 0x1D\n\ + b _08113D0C\n\ +_08113D02:\n\ + movs r0, 0x1\n\ + ands r0, r6\n\ + cmp r0, 0\n\ + beq _08113D0C\n\ + adds r2, 0x1\n\ +_08113D0C:\n\ + adds r7, 0x1\n\ + adds r6, 0x1\n\ + cmp r6, 0x3F\n\ + ble _08113C4A\n\ + cmp r3, 0\n\ + beq _08113D26\n\ + ldrb r0, [r4]\n\ + adds r0, r5\n\ + add r0, r9\n\ + strb r6, [r0]\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ +_08113D26:\n\ + movs r0, 0x7\n\ + ldr r2, [sp, 0x30]\n\ + ands r2, r0\n\ + cmp r2, 0\n\ + bne _08113D36\n\ + movs r3, 0xE4\n\ + add r8, r3\n\ + b _08113D3A\n\ +_08113D36:\n\ + movs r0, 0x4\n\ + add r8, r0\n\ +_08113D3A:\n\ + adds r5, 0x20\n\ + adds r4, 0x1\n\ + ldr r1, [sp, 0x8]\n\ + adds r1, 0x1\n\ + str r1, [sp, 0x8]\n\ + cmp r1, 0x3F\n\ + bgt _08113D4A\n\ + b _08113C32\n\ +_08113D4A:\n\ + movs r2, 0\n\ + mov r8, r2\n\ + movs r3, 0\n\ + str r3, [sp, 0x8]\n\ + ldr r0, _08113D84 @ =gSharedMem + 0x14844\n\ + movs r4, 0x82\n\ + lsls r4, 6\n\ + adds r4, r0\n\ + mov r10, r4\n\ + movs r5, 0xA2\n\ + lsls r5, 6\n\ + adds r7, r0, r5\n\ + movs r5, 0\n\ + adds r4, r0, 0\n\ + movs r0, 0x1\n\ + mov r9, r0\n\ +_08113D6A:\n\ + movs r3, 0\n\ + ldr r2, [sp, 0x4]\n\ + add r2, r8\n\ + movs r6, 0\n\ + ldr r1, [sp, 0x8]\n\ + adds r1, 0x1\n\ + str r1, [sp, 0x30]\n\ +_08113D78:\n\ + cmp r3, 0\n\ + beq _08113D88\n\ + cmp r3, 0x1\n\ + beq _08113DB4\n\ + b _08113DE4\n\ + .align 2, 0\n\ +_08113D84: .4byte gSharedMem + 0x14844\n\ +_08113D88:\n\ + adds r0, r6, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08113D98\n\ + cmp r0, 0x1\n\ + beq _08113D9E\n\ + b _08113DE4\n\ +_08113D98:\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + b _08113DA2\n\ +_08113D9E:\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF0\n\ +_08113DA2:\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08113DE4\n\ + ldrb r0, [r4]\n\ + adds r0, r5\n\ + add r0, r10\n\ + strb r6, [r0]\n\ + movs r3, 0x1\n\ + b _08113DE4\n\ +_08113DB4:\n\ + adds r0, r6, 0\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08113DC2\n\ + cmp r0, 0x1\n\ + beq _08113DC8\n\ + b _08113DE4\n\ +_08113DC2:\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF\n\ + b _08113DCC\n\ +_08113DC8:\n\ + ldrb r1, [r2]\n\ + movs r0, 0xF0\n\ +_08113DCC:\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08113DE4\n\ + ldrb r0, [r4]\n\ + adds r0, r5\n\ + adds r0, r7\n\ + subs r1, r6, 0x1\n\ + strb r1, [r0]\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + movs r3, 0\n\ +_08113DE4:\n\ + adds r1, r6, 0x1\n\ + movs r0, 0x7\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08113DF2\n\ + adds r2, 0x1D\n\ + b _08113DFC\n\ +_08113DF2:\n\ + mov r0, r9\n\ + ands r6, r0\n\ + cmp r6, 0\n\ + beq _08113DFC\n\ + adds r2, 0x1\n\ +_08113DFC:\n\ + adds r6, r1, 0\n\ + cmp r6, 0x3F\n\ + ble _08113D78\n\ + cmp r3, 0\n\ + beq _08113E14\n\ + ldrb r0, [r4]\n\ + adds r0, r5\n\ + adds r0, r7\n\ + strb r6, [r0]\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ +_08113E14:\n\ + movs r0, 0x7\n\ + ldr r1, [sp, 0x30]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _08113E24\n\ + movs r2, 0xE4\n\ + add r8, r2\n\ + b _08113E28\n\ +_08113E24:\n\ + movs r3, 0x4\n\ + add r8, r3\n\ +_08113E28:\n\ + adds r5, 0x20\n\ + adds r4, 0x1\n\ + ldr r0, [sp, 0x8]\n\ + adds r0, 0x1\n\ + str r0, [sp, 0x8]\n\ + cmp r0, 0x3F\n\ + ble _08113D6A\n\ + movs r1, 0\n\ + str r1, [sp, 0x8]\n\ +_08113E3A:\n\ + ldr r3, [sp, 0x8]\n\ + ldr r4, _08113EBC @ =gSharedMem + 0x14804\n\ + adds r2, r3, r4\n\ + ldr r5, _08113EC0 @ =gSharedMem + 0x14844\n\ + adds r1, r3, r5\n\ + ldrb r0, [r2]\n\ + adds r3, 0x1\n\ + str r3, [sp, 0x30]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bcc _08113E52\n\ + b _08113F9E\n\ +_08113E52:\n\ + movs r0, 0\n\ + str r0, [sp, 0xC]\n\ + ldrb r2, [r2]\n\ + cmp r0, r2\n\ + bge _08113F54\n\ + ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\ + adds r0, 0x4\n\ + ldr r1, [sp, 0x8]\n\ + adds r0, r1, r0\n\ + str r0, [sp, 0x18]\n\ +_08113E66:\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + str r2, [sp, 0x14]\n\ + movs r6, 0\n\ + ldr r3, [sp, 0x8]\n\ + ldr r4, _08113EC0 @ =gSharedMem + 0x14844\n\ + adds r0, r3, r4\n\ + ldr r5, [sp, 0xC]\n\ + adds r5, 0x1\n\ + str r5, [sp, 0x34]\n\ + ldrb r0, [r0]\n\ + cmp r6, r0\n\ + bge _08113F3E\n\ + ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\ + mov r10, r0\n\ + lsls r0, r3, 5\n\ + ldr r2, [sp, 0xC]\n\ + adds r1, r2, r0\n\ + mov r9, r0\n\ + ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\ + adds r0, 0xC4\n\ + mov r3, r9\n\ + adds r7, r3, r0\n\ + mov r5, r9\n\ + ldr r4, _08113EC4 @ =gSharedMem + 0x14800\n\ + ldr r2, _08113EC8 @ =0x000010c4\n\ + adds r0, r4, r2\n\ + adds r1, r0\n\ + mov r8, r1\n\ + ldrb r3, [r1]\n\ + str r3, [sp, 0x1C]\n\ +_08113EA4:\n\ + ldr r0, _08113ECC @ =0x000020c4\n\ + add r0, r10\n\ + adds r0, r5, r0\n\ + ldr r4, [sp, 0x1C]\n\ + ldrb r1, [r0]\n\ + cmp r4, r1\n\ + bls _08113ED0\n\ + mov r2, r8\n\ + ldrb r1, [r2]\n\ + ldrb r0, [r0]\n\ + b _08113ED6\n\ + .align 2, 0\n\ +_08113EBC: .4byte gSharedMem + 0x14804\n\ +_08113EC0: .4byte gSharedMem + 0x14844\n\ +_08113EC4: .4byte gSharedMem + 0x14800\n\ +_08113EC8: .4byte 0x000010c4\n\ +_08113ECC: .4byte 0x000020c4\n\ +_08113ED0:\n\ + ldrb r1, [r0]\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ +_08113ED6:\n\ + subs r3, r1, r0\n\ + ldr r1, [sp, 0xC]\n\ + add r1, r9\n\ + ldr r0, _08113EFC @ =0x000018c4\n\ + add r0, r10\n\ + adds r4, r1, r0\n\ + ldr r0, _08113F00 @ =0x000028c4\n\ + add r0, r10\n\ + adds r2, r5, r0\n\ + ldrb r0, [r4]\n\ + ldr r1, _08113F04 @ =gSharedMem + 0x14800\n\ + mov r12, r1\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bls _08113F08\n\ + adds r1, r0, 0\n\ + ldrb r0, [r2]\n\ + b _08113F0C\n\ + .align 2, 0\n\ +_08113EFC: .4byte 0x000018c4\n\ +_08113F00: .4byte 0x000028c4\n\ +_08113F04: .4byte gSharedMem + 0x14800\n\ +_08113F08:\n\ + ldrb r1, [r2]\n\ + ldrb r0, [r4]\n\ +_08113F0C:\n\ + subs r1, r0\n\ + adds r3, r1\n\ + ldr r2, [sp, 0x14]\n\ + cmp r2, r3\n\ + ble _08113F2C\n\ + ldrb r0, [r7]\n\ + cmp r0, 0\n\ + bne _08113F2C\n\ + ldr r0, _08114050 @ =0x000008c4\n\ + add r0, r12\n\ + adds r0, r5, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08113F2C\n\ + str r6, [sp, 0x10]\n\ + str r3, [sp, 0x14]\n\ +_08113F2C:\n\ + adds r7, 0x1\n\ + adds r5, 0x1\n\ + adds r6, 0x1\n\ + ldr r3, [sp, 0x8]\n\ + ldr r4, _08114054 @ =gSharedMem + 0x14844\n\ + adds r0, r3, r4\n\ + ldrb r0, [r0]\n\ + cmp r6, r0\n\ + blt _08113EA4\n\ +_08113F3E:\n\ + ldr r0, [sp, 0xC]\n\ + ldr r1, [sp, 0x10]\n\ + ldr r2, [sp, 0x8]\n\ + bl sub_81141F0\n\ + ldr r5, [sp, 0x34]\n\ + str r5, [sp, 0xC]\n\ + ldr r0, [sp, 0x18]\n\ + ldrb r0, [r0]\n\ + cmp r5, r0\n\ + blt _08113E66\n\ +_08113F54:\n\ + movs r6, 0\n\ + ldr r2, _08114058 @ =gSharedMem + 0x14800\n\ + ldr r1, [sp, 0x8]\n\ + ldr r3, _08114054 @ =gSharedMem + 0x14844\n\ + adds r0, r1, r3\n\ + adds r4, r2, 0\n\ + mov r12, r4\n\ + ldrb r0, [r0]\n\ + cmp r6, r0\n\ + bge _08113F9E\n\ + mov r0, r12\n\ + adds r0, 0x44\n\ + adds r4, r1, r0\n\ +_08113F6E:\n\ + ldr r5, [sp, 0x8]\n\ + lsls r0, r5, 5\n\ + adds r1, r6, r0\n\ + adds r0, r2, 0\n\ + adds r0, 0xC4\n\ + adds r0, r1, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08113F94\n\ + ldr r3, _08114050 @ =0x000008c4\n\ + adds r0, r2, r3\n\ + adds r0, r1, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08113F94\n\ + adds r0, r6, 0\n\ + adds r1, r5, 0\n\ + bl sub_811430C\n\ +_08113F94:\n\ + adds r6, 0x1\n\ + ldr r2, _08114058 @ =gSharedMem + 0x14800\n\ + ldrb r5, [r4]\n\ + cmp r6, r5\n\ + blt _08113F6E\n\ +_08113F9E:\n\ + ldr r0, [sp, 0x8]\n\ + ldr r1, _0811405C @ =gSharedMem + 0x14804\n\ + adds r2, r0, r1\n\ + ldr r3, _08114054 @ =gSharedMem + 0x14844\n\ + adds r1, r0, r3\n\ + ldrb r0, [r2]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bne _08113FCC\n\ + movs r6, 0\n\ + ldrb r4, [r2]\n\ + cmp r6, r4\n\ + bge _08113FCC\n\ + adds r4, r2, 0\n\ +_08113FBA:\n\ + adds r0, r6, 0\n\ + adds r1, r6, 0\n\ + ldr r2, [sp, 0x8]\n\ + bl sub_81141F0\n\ + adds r6, 0x1\n\ + ldrb r5, [r4]\n\ + cmp r6, r5\n\ + blt _08113FBA\n\ +_08113FCC:\n\ + ldr r0, [sp, 0x8]\n\ + ldr r1, _0811405C @ =gSharedMem + 0x14804\n\ + adds r2, r0, r1\n\ + ldr r3, _08114054 @ =gSharedMem + 0x14844\n\ + adds r1, r0, r3\n\ + ldrb r0, [r2]\n\ + ldr r4, _08114058 @ =gSharedMem + 0x14800\n\ + ldrb r5, [r1]\n\ + cmp r0, r5\n\ + bhi _08113FE2\n\ + b _081141C4\n\ +_08113FE2:\n\ + movs r0, 0\n\ + str r0, [sp, 0x10]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + blt _08113FEE\n\ + b _08114104\n\ +_08113FEE:\n\ + str r2, [sp, 0x2C]\n\ + ldr r1, [sp, 0x8]\n\ + lsls r1, 5\n\ + mov r9, r1\n\ + adds r0, r4, 0\n\ + adds r0, 0x44\n\ + ldr r2, [sp, 0x8]\n\ + adds r0, r2, r0\n\ + str r0, [sp, 0x20]\n\ + mov r3, r9\n\ + str r3, [sp, 0x24]\n\ +_08114004:\n\ + movs r4, 0x80\n\ + lsls r4, 1\n\ + str r4, [sp, 0x14]\n\ + movs r6, 0\n\ + ldr r5, [sp, 0x10]\n\ + adds r5, 0x1\n\ + str r5, [sp, 0x38]\n\ + ldr r0, [sp, 0x2C]\n\ + ldrb r0, [r0]\n\ + cmp r6, r0\n\ + bge _081140C4\n\ + ldr r1, [sp, 0x10]\n\ + ldr r2, [sp, 0x24]\n\ + adds r1, r2\n\ + mov r10, r1\n\ + ldr r0, _08114058 @ =gSharedMem + 0x14800\n\ + adds r0, 0xC4\n\ + adds r2, r0\n\ + mov r8, r2\n\ + ldr r7, [sp, 0x24]\n\ + ldr r3, _08114058 @ =gSharedMem + 0x14800\n\ + ldr r4, _08114060 @ =0x000010c4\n\ + adds r0, r3, r4\n\ + adds r5, r7, r0\n\ + ldr r0, _08114064 @ =gSharedMem + 0x168C4\n\ + add r0, r10\n\ + mov r12, r0\n\ + ldrb r1, [r0]\n\ + str r1, [sp, 0x28]\n\ +_0811403E:\n\ + ldrb r0, [r5]\n\ + ldr r2, [sp, 0x28]\n\ + cmp r0, r2\n\ + bls _08114068\n\ + adds r1, r0, 0\n\ + mov r3, r12\n\ + ldrb r0, [r3]\n\ + b _0811406E\n\ + .align 2, 0\n\ +_08114050: .4byte 0x000008c4\n\ +_08114054: .4byte gSharedMem + 0x14844\n\ +_08114058: .4byte gSharedMem + 0x14800\n\ +_0811405C: .4byte gSharedMem + 0x14804\n\ +_08114060: .4byte 0x000010c4\n\ +_08114064: .4byte gSharedMem + 0x168C4\n\ +_08114068:\n\ + mov r4, r12\n\ + ldrb r1, [r4]\n\ + ldrb r0, [r5]\n\ +_0811406E:\n\ + subs r3, r1, r0\n\ + ldr r1, _0811408C @ =gSharedMem + 0x14800\n\ + ldr r2, _08114090 @ =0x000018c4\n\ + adds r0, r1, r2\n\ + adds r4, r7, r0\n\ + ldr r2, _08114094 @ =gSharedMem + 0x170C4\n\ + add r2, r10\n\ + ldrb r0, [r4]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bls _08114098\n\ + adds r1, r0, 0\n\ + ldrb r0, [r2]\n\ + b _0811409C\n\ + .align 2, 0\n\ +_0811408C: .4byte gSharedMem + 0x14800\n\ +_08114090: .4byte 0x000018c4\n\ +_08114094: .4byte gSharedMem + 0x170C4\n\ +_08114098:\n\ + ldrb r1, [r2]\n\ + ldrb r0, [r4]\n\ +_0811409C:\n\ + subs r1, r0\n\ + adds r3, r1\n\ + ldr r2, [sp, 0x14]\n\ + cmp r2, r3\n\ + ble _081140B2\n\ + mov r4, r8\n\ + ldrb r0, [r4]\n\ + cmp r0, 0\n\ + bne _081140B2\n\ + str r6, [sp, 0xC]\n\ + str r3, [sp, 0x14]\n\ +_081140B2:\n\ + movs r0, 0x1\n\ + add r8, r0\n\ + adds r7, 0x1\n\ + adds r5, 0x1\n\ + adds r6, 0x1\n\ + ldr r1, [sp, 0x2C]\n\ + ldrb r1, [r1]\n\ + cmp r6, r1\n\ + blt _0811403E\n\ +_081140C4:\n\ + ldr r3, [sp, 0xC]\n\ + add r3, r9\n\ + ldr r2, _08114164 @ =gSharedMem + 0x14800\n\ + ldr r4, _08114168 @ =0x000030c4\n\ + adds r1, r2, r4\n\ + adds r1, r3, r1\n\ + ldr r2, [sp, 0x10]\n\ + add r2, r9\n\ + ldr r5, _0811416C @ =gSharedMem + 0x168C4\n\ + adds r0, r2, r5\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + ldr r0, _08114164 @ =gSharedMem + 0x14800\n\ + ldr r4, _08114170 @ =0x000038c4\n\ + adds r1, r0, r4\n\ + adds r1, r3, r1\n\ + ldr r5, _08114174 @ =gSharedMem + 0x170C4\n\ + adds r2, r5\n\ + ldrb r0, [r2]\n\ + strb r0, [r1]\n\ + ldr r0, _08114164 @ =gSharedMem + 0x14800\n\ + adds r0, 0xC4\n\ + adds r3, r0\n\ + movs r0, 0x1\n\ + strb r0, [r3]\n\ + ldr r0, [sp, 0x38]\n\ + str r0, [sp, 0x10]\n\ + ldr r1, [sp, 0x20]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + bge _08114104\n\ + b _08114004\n\ +_08114104:\n\ + movs r6, 0\n\ + ldr r4, _08114164 @ =gSharedMem + 0x14800\n\ + ldr r2, [sp, 0x8]\n\ + ldr r3, _08114178 @ =gSharedMem + 0x14804\n\ + adds r0, r2, r3\n\ + ldrb r0, [r0]\n\ + cmp r6, r0\n\ + bge _081141C4\n\ + adds r7, r4, 0\n\ + mov r9, r6\n\ + movs r5, 0xC4\n\ + adds r5, r7\n\ + mov r8, r5\n\ +_0811411E:\n\ + ldr r1, [sp, 0x8]\n\ + lsls r0, r1, 5\n\ + adds r2, r6, r0\n\ + ldr r3, _0811417C @ =0x000020c4\n\ + adds r0, r7, r3\n\ + adds r0, r2\n\ + mov r10, r0\n\ + ldr r5, _08114168 @ =0x000030c4\n\ + adds r0, r7, r5\n\ + adds r0, r2, r0\n\ + ldrb r0, [r0]\n\ + mov r1, r10\n\ + strb r0, [r1]\n\ + ldr r3, _08114180 @ =0x000028c4\n\ + adds r0, r7, r3\n\ + adds r3, r2, r0\n\ + ldr r5, _08114170 @ =0x000038c4\n\ + adds r0, r7, r5\n\ + adds r0, r2, r0\n\ + ldrb r0, [r0]\n\ + strb r0, [r3]\n\ + mov r0, r8\n\ + adds r1, r2, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, 0\n\ + beq _08114184\n\ + mov r2, r9\n\ + strb r2, [r1]\n\ + adds r0, r6, 0\n\ + adds r1, r6, 0\n\ + ldr r2, [sp, 0x8]\n\ + bl sub_81141F0\n\ + b _081141B4\n\ + .align 2, 0\n\ +_08114164: .4byte gSharedMem + 0x14800\n\ +_08114168: .4byte 0x000030c4\n\ +_0811416C: .4byte gSharedMem + 0x168C4\n\ +_08114170: .4byte 0x000038c4\n\ +_08114174: .4byte gSharedMem + 0x170C4\n\ +_08114178: .4byte gSharedMem + 0x14804\n\ +_0811417C: .4byte 0x000020c4\n\ +_08114180: .4byte 0x000028c4\n\ +_08114184:\n\ + ldr r5, _081141E0 @ =0x000010c4\n\ + adds r1, r4, r5\n\ + adds r1, r2, r1\n\ + ldr r5, _081141E4 @ =0x000018c4\n\ + adds r0, r4, r5\n\ + adds r0, r2, r0\n\ + ldrb r0, [r0]\n\ + ldrb r2, [r1]\n\ + subs r0, r2\n\ + lsrs r1, r0, 31\n\ + adds r0, r1\n\ + asrs r0, 1\n\ + adds r2, r0\n\ + strb r2, [r3]\n\ + mov r0, r10\n\ + strb r2, [r0]\n\ + ldrb r0, [r3]\n\ + subs r0, 0x1\n\ + strb r0, [r3]\n\ + adds r0, r6, 0\n\ + adds r1, r6, 0\n\ + ldr r2, [sp, 0x8]\n\ + bl sub_81141F0\n\ +_081141B4:\n\ + adds r6, 0x1\n\ + ldr r4, _081141E8 @ =gSharedMem + 0x14800\n\ + ldr r1, [sp, 0x8]\n\ + ldr r2, _081141EC @ =gSharedMem + 0x14804\n\ + adds r0, r1, r2\n\ + ldrb r0, [r0]\n\ + cmp r6, r0\n\ + blt _0811411E\n\ +_081141C4:\n\ + ldr r3, [sp, 0x30]\n\ + str r3, [sp, 0x8]\n\ + cmp r3, 0x3F\n\ + bgt _081141CE\n\ + b _08113E3A\n\ +_081141CE:\n\ + add sp, 0x3C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_081141E0: .4byte 0x000010c4\n\ +_081141E4: .4byte 0x000018c4\n\ +_081141E8: .4byte gSharedMem + 0x14800\n\ +_081141EC: .4byte gSharedMem + 0x14804\n\ + .syntax divided"); +} + +void sub_81141F0(s32 a, s32 b, s32 c) +{ + u32 r7; + + sEvoInfo.unk30C4[c][b] = sEvoInfo.unk10C4[c][a]; + sEvoInfo.unk38C4[c][b] = sEvoInfo.unk18C4[c][a]; + + r7 = 0; + if (sEvoInfo.unk10C4[c][a] < sEvoInfo.unk20C4[c][b]) + { + sEvoInfo.unkC4[c][b] = 4; + r7 = sEvoInfo.unk20C4[c][b] - sEvoInfo.unk10C4[c][a]; + } + else if (sEvoInfo.unk10C4[c][a] > sEvoInfo.unk20C4[c][b]) + { + sEvoInfo.unkC4[c][b] = 1; + r7 = sEvoInfo.unk10C4[c][a] - sEvoInfo.unk20C4[c][b]; + } + sEvoInfo.unk80C4[c][b] = r7 * 16; + + r7 = 0; + if (sEvoInfo.unk18C4[c][a] < sEvoInfo.unk28C4[c][b]) + { + sEvoInfo.unk8C4[c][b] = 3; + r7 = sEvoInfo.unk28C4[c][b] - sEvoInfo.unk18C4[c][a]; + } + else if (sEvoInfo.unk18C4[c][a] > sEvoInfo.unk28C4[c][b]) + { + sEvoInfo.unk8C4[c][b] = 2; + r7 = sEvoInfo.unk18C4[c][a] - sEvoInfo.unk28C4[c][b]; + } + sEvoInfo.unk90C4[c][b] = r7 * 16; + + sEvoInfo.unk84[c]++; +} + +void sub_811430C(u32 a, u32 b) +{ + u8 r2 = sEvoInfo.unk28C4[b][a]; + u8 r3 = sEvoInfo.unk20C4[b][a]; + s32 r7 = r2 - r3; + + sEvoInfo.unk30C4[b][a] = sEvoInfo.unk38C4[b][a] = r3 + r7 / 2; + sEvoInfo.unkC4[b][a] = 5; + sEvoInfo.unk8C4[b][a] = 7; + sEvoInfo.unk84[b]++; + r7 = sEvoInfo.unk30C4[b][a] - sEvoInfo.unk20C4[b][a]; + sEvoInfo.unk80C4[b][a] = r7 * 16; + r7 = sEvoInfo.unk28C4[b][a] - sEvoInfo.unk38C4[b][a]; + sEvoInfo.unk90C4[b][a] = r7 * 16; +} + +__attribute__((naked)) +void unref_sub_81143CC() +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + movs r0, 0x1\n\ + str r0, [sp, 0x4]\n\ + ldr r0, _08114408 @ =gSharedMem + 0x14800\n\ + ldr r2, _0811440C @ =0x0000a0c4\n\ + adds r1, r0, r2\n\ + ldrb r3, [r1]\n\ + adds r4, r0, 0\n\ + cmp r3, 0\n\ + beq _081143EE\n\ + subs r0, r3, 0x1\n\ + strb r0, [r1]\n\ +_081143EE:\n\ + movs r5, 0\n\ + str r5, [sp]\n\ +_081143F2:\n\ + movs r3, 0\n\ + adds r2, r4, 0\n\ + adds r0, r4, 0\n\ + adds r0, 0x84\n\ + ldr r1, [sp]\n\ + adds r0, r1, r0\n\ + adds r1, 0x1\n\ + str r1, [sp, 0x8]\n\ + bl _08114D84\n\ + .align 2, 0\n\ +_08114408: .4byte gSharedMem + 0x14800\n\ +_0811440C: .4byte 0x0000a0c4\n\ +_08114410:\n\ + ldr r5, [sp]\n\ + lsls r0, r5, 5\n\ + adds r1, r3, r0\n\ + adds r2, 0xC4\n\ + adds r1, r2\n\ + ldrb r2, [r1]\n\ + mov r8, r0\n\ + adds r0, r3, 0x1\n\ + mov r10, r0\n\ + cmp r2, 0xC\n\ + bls _08114428\n\ + b _081148D2\n\ +_08114428:\n\ + lsls r0, r2, 2\n\ + ldr r1, _08114434 @ =_08114438\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08114434: .4byte _08114438\n\ + .align 2, 0\n\ +_08114438:\n\ + .4byte _081148D2\n\ + .4byte _0811446C\n\ + .4byte _081144F0\n\ + .4byte _0811457C\n\ + .4byte _08114600\n\ + .4byte _0811468C\n\ + .4byte _081146C8\n\ + .4byte _08114704\n\ + .4byte _08114740\n\ + .4byte _0811477C\n\ + .4byte _081147D0\n\ + .4byte _08114810\n\ + .4byte _08114858\n\ +_0811446C:\n\ + movs r1, 0\n\ + str r1, [sp, 0x4]\n\ + lsls r0, r3, 1\n\ + ldr r2, [sp]\n\ + lsls r1, r2, 6\n\ + adds r0, r1\n\ + ldr r5, _081144E0 @ =0x000060c4\n\ + adds r2, r4, r5\n\ + adds r2, r0, r2\n\ + ldr r5, _081144E4 @ =0x000080c4\n\ + adds r1, r4, r5\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + ldrh r0, [r2]\n\ + adds r1, r0\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r1\n\ + lsrs r5, r0, 8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r2]\n\ + movs r6, 0\n\ + adds r1, r3, 0x1\n\ + mov r10, r1\n\ + ldr r2, [sp, 0x4]\n\ + cmp r2, r5\n\ + blt _081144A6\n\ + b _081148D2\n\ +_081144A6:\n\ + mov r9, r4\n\ + mov r4, r8\n\ + adds r7, r3, r4\n\ + ldr r0, _081144E8 @ =0x000030c4\n\ + add r0, r9\n\ + adds r4, r7, r0\n\ + ldr r0, _081144EC @ =0x000020c4\n\ + add r0, r9\n\ + adds r2, r7, r0\n\ +_081144B8:\n\ + ldrb r0, [r4]\n\ + subs r0, 0x1\n\ + strb r0, [r4]\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + str r2, [sp, 0xC]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DB4\n\ + ldrb r0, [r4]\n\ + ldr r2, [sp, 0xC]\n\ + ldr r3, [sp, 0x10]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bne _081144D8\n\ + b _081148A0\n\ +_081144D8:\n\ + adds r6, 0x1\n\ + cmp r6, r5\n\ + blt _081144B8\n\ + b _081148D2\n\ + .align 2, 0\n\ +_081144E0: .4byte 0x000060c4\n\ +_081144E4: .4byte 0x000080c4\n\ +_081144E8: .4byte 0x000030c4\n\ +_081144EC: .4byte 0x000020c4\n\ +_081144F0:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r4, _08114568 @ =gSharedMem + 0x14800\n\ + lsls r0, r3, 1\n\ + ldr r5, [sp]\n\ + lsls r1, r5, 6\n\ + adds r0, r1\n\ + ldr r1, _0811456C @ =0x000060c4\n\ + adds r2, r4, r1\n\ + adds r2, r0, r2\n\ + ldr r5, _08114570 @ =0x000080c4\n\ + adds r1, r4, r5\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + ldrh r0, [r2]\n\ + adds r1, r0\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r1\n\ + lsrs r5, r0, 8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r2]\n\ + movs r6, 0\n\ + adds r1, r3, 0x1\n\ + mov r10, r1\n\ + ldr r2, [sp, 0x4]\n\ + cmp r2, r5\n\ + blt _0811452C\n\ + b _081148D2\n\ +_0811452C:\n\ + mov r9, r4\n\ + mov r4, r8\n\ + adds r7, r3, r4\n\ + ldr r0, _08114574 @ =0x000030c4\n\ + add r0, r9\n\ + adds r4, r7, r0\n\ + ldr r0, _08114578 @ =0x000020c4\n\ + add r0, r9\n\ + adds r2, r7, r0\n\ +_0811453E:\n\ + ldrb r0, [r4]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bne _08114548\n\ + b _081148B8\n\ +_08114548:\n\ + adds r1, r0, 0\n\ + ldr r0, [sp]\n\ + str r2, [sp, 0xC]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DF0\n\ + ldrb r0, [r4]\n\ + subs r0, 0x1\n\ + strb r0, [r4]\n\ + adds r6, 0x1\n\ + ldr r2, [sp, 0xC]\n\ + ldr r3, [sp, 0x10]\n\ + cmp r6, r5\n\ + blt _0811453E\n\ + b _081148D2\n\ + .align 2, 0\n\ +_08114568: .4byte gSharedMem + 0x14800\n\ +_0811456C: .4byte 0x000060c4\n\ +_08114570: .4byte 0x000080c4\n\ +_08114574: .4byte 0x000030c4\n\ +_08114578: .4byte 0x000020c4\n\ +_0811457C:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + lsls r0, r3, 1\n\ + ldr r5, [sp]\n\ + lsls r1, r5, 6\n\ + adds r0, r1\n\ + ldr r1, _081145F0 @ =0x000060c4\n\ + adds r2, r4, r1\n\ + adds r2, r0, r2\n\ + ldr r5, _081145F4 @ =0x000080c4\n\ + adds r1, r4, r5\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + ldrh r0, [r2]\n\ + adds r1, r0\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r1\n\ + lsrs r5, r0, 8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r2]\n\ + movs r6, 0\n\ + adds r1, r3, 0x1\n\ + mov r10, r1\n\ + ldr r2, [sp, 0x4]\n\ + cmp r2, r5\n\ + blt _081145B6\n\ + b _081148D2\n\ +_081145B6:\n\ + mov r9, r4\n\ + mov r4, r8\n\ + adds r7, r3, r4\n\ + ldr r0, _081145F8 @ =0x000030c4\n\ + add r0, r9\n\ + adds r4, r7, r0\n\ + ldr r0, _081145FC @ =0x000020c4\n\ + add r0, r9\n\ + adds r2, r7, r0\n\ +_081145C8:\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + str r2, [sp, 0xC]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DB4\n\ + ldrb r0, [r4]\n\ + ldr r2, [sp, 0xC]\n\ + ldr r3, [sp, 0x10]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bne _081145E8\n\ + b _081148AC\n\ +_081145E8:\n\ + adds r6, 0x1\n\ + cmp r6, r5\n\ + blt _081145C8\n\ + b _081148D2\n\ + .align 2, 0\n\ +_081145F0: .4byte 0x000060c4\n\ +_081145F4: .4byte 0x000080c4\n\ +_081145F8: .4byte 0x000030c4\n\ +_081145FC: .4byte 0x000020c4\n\ +_08114600:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r4, _08114678 @ =gSharedMem + 0x14800\n\ + lsls r0, r3, 1\n\ + ldr r5, [sp]\n\ + lsls r1, r5, 6\n\ + adds r0, r1\n\ + ldr r1, _0811467C @ =0x000060c4\n\ + adds r2, r4, r1\n\ + adds r2, r0, r2\n\ + ldr r5, _08114680 @ =0x000080c4\n\ + adds r1, r4, r5\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + ldrh r0, [r2]\n\ + adds r1, r0\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r1\n\ + lsrs r5, r0, 8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r2]\n\ + movs r6, 0\n\ + adds r1, r3, 0x1\n\ + mov r10, r1\n\ + ldr r2, [sp, 0x4]\n\ + cmp r2, r5\n\ + blt _0811463C\n\ + b _081148D2\n\ +_0811463C:\n\ + mov r9, r4\n\ + mov r4, r8\n\ + adds r7, r3, r4\n\ + ldr r0, _08114684 @ =0x000030c4\n\ + add r0, r9\n\ + adds r4, r7, r0\n\ + ldr r0, _08114688 @ =0x000020c4\n\ + add r0, r9\n\ + adds r2, r7, r0\n\ +_0811464E:\n\ + ldrb r0, [r4]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bne _08114658\n\ + b _081148B8\n\ +_08114658:\n\ + adds r1, r0, 0\n\ + ldr r0, [sp]\n\ + str r2, [sp, 0xC]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DF0\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + adds r6, 0x1\n\ + ldr r2, [sp, 0xC]\n\ + ldr r3, [sp, 0x10]\n\ + cmp r6, r5\n\ + blt _0811464E\n\ + b _081148D2\n\ + .align 2, 0\n\ +_08114678: .4byte gSharedMem + 0x14800\n\ +_0811467C: .4byte 0x000060c4\n\ +_08114680: .4byte 0x000080c4\n\ +_08114684: .4byte 0x000030c4\n\ +_08114688: .4byte 0x000020c4\n\ +_0811468C:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r5, _081146C0 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r4, r3, r0\n\ + ldr r1, _081146C4 @ =0x000030c4\n\ + adds r0, r5, r1\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [sp]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114E48\n\ + lsls r0, 24\n\ + ldr r3, [sp, 0x10]\n\ + adds r2, r3, 0x1\n\ + mov r10, r2\n\ + cmp r0, 0\n\ + bne _081146B4\n\ + b _081148D2\n\ +_081146B4:\n\ + adds r0, r5, 0\n\ + adds r0, 0xC4\n\ + adds r0, r4, r0\n\ + movs r1, 0x9\n\ + strb r1, [r0]\n\ + b _081148D2\n\ + .align 2, 0\n\ +_081146C0: .4byte gSharedMem + 0x14800\n\ +_081146C4: .4byte 0x000030c4\n\ +_081146C8:\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r5, _081146FC @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r4, r3, r0\n\ + ldr r1, _08114700 @ =0x000030c4\n\ + adds r0, r5, r1\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [sp]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114E48\n\ + lsls r0, 24\n\ + ldr r3, [sp, 0x10]\n\ + adds r2, r3, 0x1\n\ + mov r10, r2\n\ + cmp r0, 0\n\ + bne _081146F0\n\ + b _081148D2\n\ +_081146F0:\n\ + adds r0, r5, 0\n\ + adds r0, 0xC4\n\ + adds r0, r4, r0\n\ + movs r1, 0xA\n\ + strb r1, [r0]\n\ + b _081148D2\n\ + .align 2, 0\n\ +_081146FC: .4byte gSharedMem + 0x14800\n\ +_08114700: .4byte 0x000030c4\n\ +_08114704:\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r5, _08114738 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r4, r3, r0\n\ + ldr r1, _0811473C @ =0x000030c4\n\ + adds r0, r5, r1\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [sp]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114E48\n\ + lsls r0, 24\n\ + ldr r3, [sp, 0x10]\n\ + adds r2, r3, 0x1\n\ + mov r10, r2\n\ + cmp r0, 0\n\ + bne _0811472C\n\ + b _081148D2\n\ +_0811472C:\n\ + adds r0, r5, 0\n\ + adds r0, 0xC4\n\ + adds r0, r4, r0\n\ + movs r1, 0xB\n\ + strb r1, [r0]\n\ + b _081148D2\n\ + .align 2, 0\n\ +_08114738: .4byte gSharedMem + 0x14800\n\ +_0811473C: .4byte 0x000030c4\n\ +_08114740:\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r5, _08114774 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r4, r3, r0\n\ + ldr r1, _08114778 @ =0x000030c4\n\ + adds r0, r5, r1\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [sp]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114E48\n\ + lsls r0, 24\n\ + ldr r3, [sp, 0x10]\n\ + adds r2, r3, 0x1\n\ + mov r10, r2\n\ + cmp r0, 0\n\ + bne _08114768\n\ + b _081148D2\n\ +_08114768:\n\ + adds r0, r5, 0\n\ + adds r0, 0xC4\n\ + adds r0, r4, r0\n\ + movs r1, 0xC\n\ + strb r1, [r0]\n\ + b _081148D2\n\ + .align 2, 0\n\ +_08114774: .4byte gSharedMem + 0x14800\n\ +_08114778: .4byte 0x000030c4\n\ +_0811477C:\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r6, _081147B4 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r5, r3, r0\n\ + ldr r1, _081147B8 @ =0x000030c4\n\ + adds r4, r6, r1\n\ + adds r4, r5, r4\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DB4\n\ + ldr r2, _081147BC @ =0x000020c4\n\ + adds r0, r6, r2\n\ + adds r0, r5, r0\n\ + ldrb r1, [r4]\n\ + ldr r3, [sp, 0x10]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + bne _081147C0\n\ + adds r0, r6, 0\n\ + adds r0, 0xC4\n\ + adds r0, r5, r0\n\ + mov r4, sp\n\ + ldrb r4, [r4, 0x4]\n\ + strb r4, [r0]\n\ + b _08114844\n\ + .align 2, 0\n\ +_081147B4: .4byte gSharedMem + 0x14800\n\ +_081147B8: .4byte 0x000030c4\n\ +_081147BC: .4byte 0x000020c4\n\ +_081147C0:\n\ + adds r0, r6, 0\n\ + adds r0, 0xC4\n\ + adds r0, r5, r0\n\ + movs r1, 0x1\n\ + strb r1, [r0]\n\ + adds r0, r3, 0x1\n\ + mov r10, r0\n\ + b _081148D2\n\ +_081147D0:\n\ + movs r1, 0\n\ + str r1, [sp, 0x4]\n\ + ldr r6, _08114804 @ =gSharedMem + 0x14800\n\ + mov r2, r8\n\ + adds r5, r3, r2\n\ + ldr r0, _08114808 @ =0x000030c4\n\ + adds r4, r6, r0\n\ + adds r4, r5, r4\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DF0\n\ + ldr r1, _0811480C @ =0x000020c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + ldrb r1, [r4]\n\ + ldr r3, [sp, 0x10]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + beq _08114882\n\ + adds r0, r6, 0\n\ + adds r0, 0xC4\n\ + adds r0, r5, r0\n\ + movs r1, 0x2\n\ + b _08114842\n\ + .align 2, 0\n\ +_08114804: .4byte gSharedMem + 0x14800\n\ +_08114808: .4byte 0x000030c4\n\ +_0811480C: .4byte 0x000020c4\n\ +_08114810:\n\ + movs r0, 0\n\ + str r0, [sp, 0x4]\n\ + ldr r6, _0811484C @ =gSharedMem + 0x14800\n\ + mov r1, r8\n\ + adds r5, r3, r1\n\ + ldr r2, _08114850 @ =0x000030c4\n\ + adds r4, r6, r2\n\ + adds r4, r5, r4\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DB4\n\ + ldr r1, _08114854 @ =0x000020c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + ldrb r1, [r4]\n\ + ldr r3, [sp, 0x10]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + beq _08114882\n\ + adds r0, r6, 0\n\ + adds r0, 0xC4\n\ + adds r0, r5, r0\n\ + movs r1, 0x3\n\ +_08114842:\n\ + strb r1, [r0]\n\ +_08114844:\n\ + adds r5, r3, 0x1\n\ + mov r10, r5\n\ + b _081148D2\n\ + .align 2, 0\n\ +_0811484C: .4byte gSharedMem + 0x14800\n\ +_08114850: .4byte 0x000030c4\n\ +_08114854: .4byte 0x000020c4\n\ +_08114858:\n\ + movs r0, 0\n\ + str r0, [sp, 0x4]\n\ + ldr r6, _08114894 @ =gSharedMem + 0x14800\n\ + mov r1, r8\n\ + adds r5, r3, r1\n\ + ldr r2, _08114898 @ =0x000030c4\n\ + adds r4, r6, r2\n\ + adds r4, r5, r4\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DF0\n\ + ldr r1, _0811489C @ =0x000020c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + ldrb r1, [r4]\n\ + ldr r3, [sp, 0x10]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + bne _081148C4\n\ +_08114882:\n\ + adds r0, r6, 0\n\ + adds r0, 0xC4\n\ + adds r0, r5, r0\n\ + mov r2, sp\n\ + ldrb r2, [r2, 0x4]\n\ + strb r2, [r0]\n\ + adds r4, r3, 0x1\n\ + mov r10, r4\n\ + b _081148D2\n\ + .align 2, 0\n\ +_08114894: .4byte gSharedMem + 0x14800\n\ +_08114898: .4byte 0x000030c4\n\ +_0811489C: .4byte 0x000020c4\n\ +_081148A0:\n\ + mov r0, r9\n\ + adds r0, 0xC4\n\ + adds r0, r7, r0\n\ + movs r5, 0\n\ + strb r5, [r0]\n\ + b _081148D2\n\ +_081148AC:\n\ + mov r0, r9\n\ + adds r0, 0xC4\n\ + adds r0, r7, r0\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + b _081148D2\n\ +_081148B8:\n\ + mov r0, r9\n\ + adds r0, 0xC4\n\ + adds r0, r7, r0\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + b _081148D2\n\ +_081148C4:\n\ + adds r0, r6, 0\n\ + adds r0, 0xC4\n\ + adds r0, r5, r0\n\ + movs r1, 0x4\n\ + strb r1, [r0]\n\ + adds r2, r3, 0x1\n\ + mov r10, r2\n\ +_081148D2:\n\ + ldr r0, _081148F4 @ =gSharedMem + 0x14800\n\ + mov r4, r8\n\ + adds r1, r3, r4\n\ + ldr r5, _081148F8 @ =0x000008c4\n\ + adds r2, r0, r5\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + adds r4, r0, 0\n\ + cmp r1, 0xC\n\ + bls _081148E8\n\ + b _08114D76\n\ +_081148E8:\n\ + lsls r0, r1, 2\n\ + ldr r1, _081148FC @ =_08114900\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_081148F4: .4byte gSharedMem + 0x14800\n\ +_081148F8: .4byte 0x000008c4\n\ +_081148FC: .4byte _08114900\n\ + .align 2, 0\n\ +_08114900:\n\ + .4byte _08114D76\n\ + .4byte _08114934\n\ + .4byte _081149B8\n\ + .4byte _08114A3C\n\ + .4byte _08114AC0\n\ + .4byte _08114B44\n\ + .4byte _08114B7C\n\ + .4byte _08114BB4\n\ + .4byte _08114BEC\n\ + .4byte _08114C24\n\ + .4byte _08114C78\n\ + .4byte _08114CB8\n\ + .4byte _08114CF8\n\ +_08114934:\n\ + movs r0, 0\n\ + str r0, [sp, 0x4]\n\ + lsls r0, r3, 1\n\ + ldr r2, [sp]\n\ + lsls r1, r2, 6\n\ + adds r0, r1\n\ + ldr r5, _081149A8 @ =0x000070c4\n\ + adds r2, r4, r5\n\ + adds r2, r0, r2\n\ + ldr r5, _081149AC @ =0x000090c4\n\ + adds r1, r4, r5\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + ldrh r0, [r2]\n\ + adds r1, r0\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r1\n\ + lsrs r5, r0, 8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r2]\n\ + movs r6, 0\n\ + ldr r1, [sp, 0x4]\n\ + cmp r1, r5\n\ + blt _0811496A\n\ + b _08114D76\n\ +_0811496A:\n\ + mov r9, r4\n\ + mov r2, r8\n\ + adds r7, r3, r2\n\ + ldr r0, _081149B0 @ =0x000038c4\n\ + add r0, r9\n\ + adds r4, r7, r0\n\ + movs r3, 0\n\ + ldr r0, _081149B4 @ =0x000028c4\n\ + add r0, r9\n\ + adds r2, r7, r0\n\ +_0811497E:\n\ + ldrb r0, [r4]\n\ + subs r0, 0x1\n\ + strb r0, [r4]\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + str r2, [sp, 0xC]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DB4\n\ + ldrb r0, [r4]\n\ + ldr r2, [sp, 0xC]\n\ + ldr r3, [sp, 0x10]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bne _0811499E\n\ + b _08114D4C\n\ +_0811499E:\n\ + adds r6, 0x1\n\ + cmp r6, r5\n\ + blt _0811497E\n\ + b _08114D76\n\ + .align 2, 0\n\ +_081149A8: .4byte 0x000070c4\n\ +_081149AC: .4byte 0x000090c4\n\ +_081149B0: .4byte 0x000038c4\n\ +_081149B4: .4byte 0x000028c4\n\ +_081149B8:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r4, _08114A28 @ =gSharedMem + 0x14800\n\ + lsls r0, r3, 1\n\ + ldr r5, [sp]\n\ + lsls r1, r5, 6\n\ + adds r0, r1\n\ + ldr r1, _08114A2C @ =0x000070c4\n\ + adds r2, r4, r1\n\ + adds r2, r0, r2\n\ + ldr r5, _08114A30 @ =0x000090c4\n\ + adds r1, r4, r5\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + ldrh r0, [r2]\n\ + adds r1, r0\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r1\n\ + lsrs r5, r0, 8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r2]\n\ + movs r6, 0\n\ + ldr r1, [sp, 0x4]\n\ + cmp r1, r5\n\ + blt _081149F0\n\ + b _08114D76\n\ +_081149F0:\n\ + mov r9, r4\n\ + mov r2, r8\n\ + adds r7, r3, r2\n\ + ldr r0, _08114A34 @ =0x000038c4\n\ + add r0, r9\n\ + adds r4, r7, r0\n\ + ldr r0, _08114A38 @ =0x000028c4\n\ + add r0, r9\n\ + adds r2, r7, r0\n\ +_08114A02:\n\ + ldrb r0, [r4]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bne _08114A0C\n\ + b _08114D3C\n\ +_08114A0C:\n\ + adds r1, r0, 0\n\ + ldr r0, [sp]\n\ + str r2, [sp, 0xC]\n\ + bl sub_8114DF0\n\ + ldrb r0, [r4]\n\ + subs r0, 0x1\n\ + strb r0, [r4]\n\ + adds r6, 0x1\n\ + ldr r2, [sp, 0xC]\n\ + cmp r6, r5\n\ + blt _08114A02\n\ + b _08114D76\n\ + .align 2, 0\n\ +_08114A28: .4byte gSharedMem + 0x14800\n\ +_08114A2C: .4byte 0x000070c4\n\ +_08114A30: .4byte 0x000090c4\n\ +_08114A34: .4byte 0x000038c4\n\ +_08114A38: .4byte 0x000028c4\n\ +_08114A3C:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + lsls r0, r3, 1\n\ + ldr r5, [sp]\n\ + lsls r1, r5, 6\n\ + adds r0, r1\n\ + ldr r1, _08114AB0 @ =0x000070c4\n\ + adds r2, r4, r1\n\ + adds r2, r0, r2\n\ + ldr r5, _08114AB4 @ =0x000090c4\n\ + adds r1, r4, r5\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + ldrh r0, [r2]\n\ + adds r1, r0\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r1\n\ + lsrs r5, r0, 8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r2]\n\ + movs r6, 0\n\ + ldr r1, [sp, 0x4]\n\ + cmp r1, r5\n\ + blt _08114A72\n\ + b _08114D76\n\ +_08114A72:\n\ + mov r9, r4\n\ + mov r2, r8\n\ + adds r7, r3, r2\n\ + ldr r0, _08114AB8 @ =0x000038c4\n\ + add r0, r9\n\ + adds r4, r7, r0\n\ + movs r3, 0\n\ + ldr r0, _08114ABC @ =0x000028c4\n\ + add r0, r9\n\ + adds r2, r7, r0\n\ +_08114A86:\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + str r2, [sp, 0xC]\n\ + str r3, [sp, 0x10]\n\ + bl sub_8114DB4\n\ + ldrb r0, [r4]\n\ + ldr r2, [sp, 0xC]\n\ + ldr r3, [sp, 0x10]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bne _08114AA6\n\ + b _08114D4C\n\ +_08114AA6:\n\ + adds r6, 0x1\n\ + cmp r6, r5\n\ + blt _08114A86\n\ + b _08114D76\n\ + .align 2, 0\n\ +_08114AB0: .4byte 0x000070c4\n\ +_08114AB4: .4byte 0x000090c4\n\ +_08114AB8: .4byte 0x000038c4\n\ +_08114ABC: .4byte 0x000028c4\n\ +_08114AC0:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r4, _08114B30 @ =gSharedMem + 0x14800\n\ + lsls r0, r3, 1\n\ + ldr r5, [sp]\n\ + lsls r1, r5, 6\n\ + adds r0, r1\n\ + ldr r1, _08114B34 @ =0x000070c4\n\ + adds r2, r4, r1\n\ + adds r2, r0, r2\n\ + ldr r5, _08114B38 @ =0x000090c4\n\ + adds r1, r4, r5\n\ + adds r0, r1\n\ + ldrh r1, [r0]\n\ + ldrh r0, [r2]\n\ + adds r1, r0\n\ + movs r0, 0xFF\n\ + lsls r0, 8\n\ + ands r0, r1\n\ + lsrs r5, r0, 8\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r2]\n\ + movs r6, 0\n\ + ldr r1, [sp, 0x4]\n\ + cmp r1, r5\n\ + blt _08114AF8\n\ + b _08114D76\n\ +_08114AF8:\n\ + mov r9, r4\n\ + mov r2, r8\n\ + adds r7, r3, r2\n\ + ldr r0, _08114B3C @ =0x000038c4\n\ + add r0, r9\n\ + adds r4, r7, r0\n\ + ldr r0, _08114B40 @ =0x000028c4\n\ + add r0, r9\n\ + adds r2, r7, r0\n\ +_08114B0A:\n\ + ldrb r0, [r4]\n\ + ldrb r1, [r2]\n\ + cmp r0, r1\n\ + bne _08114B14\n\ + b _08114D5C\n\ +_08114B14:\n\ + adds r1, r0, 0\n\ + ldr r0, [sp]\n\ + str r2, [sp, 0xC]\n\ + bl sub_8114DF0\n\ + ldrb r0, [r4]\n\ + adds r0, 0x1\n\ + strb r0, [r4]\n\ + adds r6, 0x1\n\ + ldr r2, [sp, 0xC]\n\ + cmp r6, r5\n\ + blt _08114B0A\n\ + b _08114D76\n\ + .align 2, 0\n\ +_08114B30: .4byte gSharedMem + 0x14800\n\ +_08114B34: .4byte 0x000070c4\n\ +_08114B38: .4byte 0x000090c4\n\ +_08114B3C: .4byte 0x000038c4\n\ +_08114B40: .4byte 0x000028c4\n\ +_08114B44:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r5, _08114B70 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r4, r3, r0\n\ + ldr r1, _08114B74 @ =0x000038c4\n\ + adds r0, r5, r1\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [sp]\n\ + bl sub_8114E48\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08114B64\n\ + b _08114D76\n\ +_08114B64:\n\ + ldr r2, _08114B78 @ =0x000008c4\n\ + adds r0, r5, r2\n\ + adds r0, r4, r0\n\ + movs r1, 0x9\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114B70: .4byte gSharedMem + 0x14800\n\ +_08114B74: .4byte 0x000038c4\n\ +_08114B78: .4byte 0x000008c4\n\ +_08114B7C:\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r5, _08114BA8 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r4, r3, r0\n\ + ldr r1, _08114BAC @ =0x000038c4\n\ + adds r0, r5, r1\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [sp]\n\ + bl sub_8114E48\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08114B9C\n\ + b _08114D76\n\ +_08114B9C:\n\ + ldr r2, _08114BB0 @ =0x000008c4\n\ + adds r0, r5, r2\n\ + adds r0, r4, r0\n\ + movs r1, 0xA\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114BA8: .4byte gSharedMem + 0x14800\n\ +_08114BAC: .4byte 0x000038c4\n\ +_08114BB0: .4byte 0x000008c4\n\ +_08114BB4:\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r5, _08114BE0 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r4, r3, r0\n\ + ldr r1, _08114BE4 @ =0x000038c4\n\ + adds r0, r5, r1\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [sp]\n\ + bl sub_8114E48\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08114BD4\n\ + b _08114D76\n\ +_08114BD4:\n\ + ldr r2, _08114BE8 @ =0x000008c4\n\ + adds r0, r5, r2\n\ + adds r0, r4, r0\n\ + movs r1, 0xB\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114BE0: .4byte gSharedMem + 0x14800\n\ +_08114BE4: .4byte 0x000038c4\n\ +_08114BE8: .4byte 0x000008c4\n\ +_08114BEC:\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r5, _08114C18 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r4, r3, r0\n\ + ldr r1, _08114C1C @ =0x000038c4\n\ + adds r0, r5, r1\n\ + adds r0, r4, r0\n\ + ldrb r1, [r0]\n\ + ldr r0, [sp]\n\ + bl sub_8114E48\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _08114C0C\n\ + b _08114D76\n\ +_08114C0C:\n\ + ldr r2, _08114C20 @ =0x000008c4\n\ + adds r0, r5, r2\n\ + adds r0, r4, r0\n\ + movs r1, 0xC\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114C18: .4byte gSharedMem + 0x14800\n\ +_08114C1C: .4byte 0x000038c4\n\ +_08114C20: .4byte 0x000008c4\n\ +_08114C24:\n\ + movs r4, 0\n\ + str r4, [sp, 0x4]\n\ + ldr r6, _08114C58 @ =gSharedMem + 0x14800\n\ + mov r0, r8\n\ + adds r5, r3, r0\n\ + ldr r1, _08114C5C @ =0x000038c4\n\ + adds r4, r6, r1\n\ + adds r4, r5, r4\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + bl sub_8114DB4\n\ + ldr r2, _08114C60 @ =0x000028c4\n\ + adds r0, r6, r2\n\ + adds r0, r5, r0\n\ + ldrb r1, [r4]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + bne _08114C68\n\ + ldr r4, _08114C64 @ =0x000008c4\n\ + adds r0, r6, r4\n\ + adds r0, r5, r0\n\ + mov r5, sp\n\ + ldrb r5, [r5, 0x4]\n\ + strb r5, [r0]\n\ + b _08114D76\n\ + .align 2, 0\n\ +_08114C58: .4byte gSharedMem + 0x14800\n\ +_08114C5C: .4byte 0x000038c4\n\ +_08114C60: .4byte 0x000028c4\n\ +_08114C64: .4byte 0x000008c4\n\ +_08114C68:\n\ + ldr r1, _08114C74 @ =0x000008c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + movs r1, 0x1\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114C74: .4byte 0x000008c4\n\ +_08114C78:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r6, _08114CA8 @ =gSharedMem + 0x14800\n\ + mov r4, r8\n\ + adds r5, r3, r4\n\ + ldr r0, _08114CAC @ =0x000038c4\n\ + adds r4, r6, r0\n\ + adds r4, r5, r4\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + bl sub_8114DF0\n\ + ldr r1, _08114CB0 @ =0x000028c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + ldrb r1, [r4]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + beq _08114D1E\n\ + ldr r1, _08114CB4 @ =0x000008c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + movs r1, 0x2\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114CA8: .4byte gSharedMem + 0x14800\n\ +_08114CAC: .4byte 0x000038c4\n\ +_08114CB0: .4byte 0x000028c4\n\ +_08114CB4: .4byte 0x000008c4\n\ +_08114CB8:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r6, _08114CE8 @ =gSharedMem + 0x14800\n\ + mov r4, r8\n\ + adds r5, r3, r4\n\ + ldr r0, _08114CEC @ =0x000038c4\n\ + adds r4, r6, r0\n\ + adds r4, r5, r4\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + bl sub_8114DB4\n\ + ldr r1, _08114CF0 @ =0x000028c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + ldrb r1, [r4]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + beq _08114D1E\n\ + ldr r1, _08114CF4 @ =0x000008c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + movs r1, 0x3\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114CE8: .4byte gSharedMem + 0x14800\n\ +_08114CEC: .4byte 0x000038c4\n\ +_08114CF0: .4byte 0x000028c4\n\ +_08114CF4: .4byte 0x000008c4\n\ +_08114CF8:\n\ + movs r2, 0\n\ + str r2, [sp, 0x4]\n\ + ldr r6, _08114D2C @ =gSharedMem + 0x14800\n\ + mov r4, r8\n\ + adds r5, r3, r4\n\ + ldr r0, _08114D30 @ =0x000038c4\n\ + adds r4, r6, r0\n\ + adds r4, r5, r4\n\ + ldrb r1, [r4]\n\ + ldr r0, [sp]\n\ + bl sub_8114DF0\n\ + ldr r1, _08114D34 @ =0x000028c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + ldrb r1, [r4]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + bne _08114D6C\n\ +_08114D1E:\n\ + ldr r2, _08114D38 @ =0x000008c4\n\ + adds r0, r6, r2\n\ + adds r0, r5, r0\n\ + mov r4, sp\n\ + ldrb r4, [r4, 0x4]\n\ + strb r4, [r0]\n\ + b _08114D76\n\ + .align 2, 0\n\ +_08114D2C: .4byte gSharedMem + 0x14800\n\ +_08114D30: .4byte 0x000038c4\n\ +_08114D34: .4byte 0x000028c4\n\ +_08114D38: .4byte 0x000008c4\n\ +_08114D3C:\n\ + ldr r0, _08114D48 @ =0x000008c4\n\ + add r0, r9\n\ + adds r0, r7, r0\n\ + movs r1, 0\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114D48: .4byte 0x000008c4\n\ +_08114D4C:\n\ + ldr r0, _08114D58 @ =0x000008c4\n\ + add r0, r9\n\ + adds r0, r7, r0\n\ + strb r3, [r0]\n\ + b _08114D76\n\ + .align 2, 0\n\ +_08114D58: .4byte 0x000008c4\n\ +_08114D5C:\n\ + ldr r0, _08114D68 @ =0x000008c4\n\ + add r0, r9\n\ + adds r0, r7, r0\n\ + movs r1, 0\n\ + b _08114D74\n\ + .align 2, 0\n\ +_08114D68: .4byte 0x000008c4\n\ +_08114D6C:\n\ + ldr r1, _08114DAC @ =0x000008c4\n\ + adds r0, r6, r1\n\ + adds r0, r5, r0\n\ + movs r1, 0x4\n\ +_08114D74:\n\ + strb r1, [r0]\n\ +_08114D76:\n\ + mov r3, r10\n\ + ldr r2, _08114DB0 @ =gSharedMem + 0x14800\n\ + adds r0, r2, 0\n\ + adds r0, 0x84\n\ + ldr r4, [sp]\n\ + adds r0, r4, r0\n\ + adds r4, r2, 0\n\ +_08114D84:\n\ + ldrb r0, [r0]\n\ + cmp r3, r0\n\ + bge _08114D8E\n\ + bl _08114410\n\ +_08114D8E:\n\ + ldr r5, [sp, 0x8]\n\ + str r5, [sp]\n\ + cmp r5, 0x3F\n\ + bgt _08114D9A\n\ + bl _081143F2\n\ +_08114D9A:\n\ + ldr r0, [sp, 0x4]\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08114DAC: .4byte 0x000008c4\n\ +_08114DB0: .4byte gSharedMem + 0x14800\n\ + .syntax divided"); +} + +void sub_8114DB4(u32 a, u8 b) +{ + u8 *r2 = sEvoInfo.unk40C4[a][b / 2]; + + if (b % 2 != 0) + *r2 |= 0xF0; + else + *r2 |= 0x0F; +} + +void sub_8114DF0(u32 a, u8 b) +{ + u8 *r2 = sEvoInfo.unk40C4[a][b / 2]; + u8 *r1 = r2 + 0x6000; + + if (b % 2 != 0) + { + if (!(*r1 & 0xF0)) + *r2 &= 0x0F; + } + else + { + if (!(*r1 & 0x0F)) + *r2 &= 0xF0; + } +} + +__attribute__((naked)) +void sub_8114E48() +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + adds r4, r0, 0\n\ + lsls r1, 24\n\ + lsrs r6, r1, 24\n\ + ldr r1, _08114E6C @ =gSharedMem + 0x14800\n\ + ldr r2, _08114E70 @ =0x0000a0c4\n\ + adds r0, r1, r2\n\ + ldrb r0, [r0]\n\ + adds r5, r1, 0\n\ + cmp r0, 0\n\ + bne _08114E60\n\ + b _08114F5E\n\ +_08114E60:\n\ + movs r1, 0\n\ + movs r3, 0\n\ + cmp r4, 0\n\ + bne _08114E74\n\ + movs r1, 0x1\n\ + b _08114EA6\n\ + .align 2, 0\n\ +_08114E6C: .4byte gSharedMem + 0x14800\n\ +_08114E70: .4byte 0x0000a0c4\n\ +_08114E74:\n\ + subs r0, r4, 0x1\n\ + lsls r0, 5\n\ + adds r2, r3, r0\n\ + adds r0, r5, 0\n\ + adds r0, 0xC4\n\ + adds r0, r2, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08114EA6\n\ + ldr r7, _08114EC4 @ =0x000008c4\n\ + adds r0, r5, r7\n\ + adds r0, r2, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08114EA6\n\ + adds r3, 0x1\n\ + cmp r3, 0x1F\n\ + bgt _08114EA6\n\ + cmp r4, 0\n\ + bne _08114E74\n\ + lsls r0, r1, 24\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + adds r0, r1\n\ + lsrs r1, r0, 24\n\ +_08114EA6:\n\ + cmp r3, 0x20\n\ + bne _08114EB4\n\ + lsls r0, r1, 24\n\ + movs r2, 0x80\n\ + lsls r2, 17\n\ + adds r0, r2\n\ + lsrs r1, r0, 24\n\ +_08114EB4:\n\ + movs r3, 0\n\ + cmp r4, 0x3F\n\ + bne _08114EC8\n\ + lsls r0, r1, 24\n\ + movs r7, 0x80\n\ + lsls r7, 17\n\ + adds r0, r7\n\ + b _08114EF8\n\ + .align 2, 0\n\ +_08114EC4: .4byte 0x000008c4\n\ +_08114EC8:\n\ + adds r0, r4, 0x1\n\ + lsls r0, 5\n\ + adds r2, r3, r0\n\ + adds r0, r5, 0\n\ + adds r0, 0xC4\n\ + adds r0, r2, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08114EFA\n\ + ldr r7, _08114F64 @ =0x000008c4\n\ + adds r0, r5, r7\n\ + adds r0, r2, r0\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08114EFA\n\ + adds r3, 0x1\n\ + cmp r3, 0x1F\n\ + bgt _08114EFA\n\ + cmp r4, 0x3F\n\ + bne _08114EC8\n\ + lsls r0, r1, 24\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + adds r0, r1\n\ +_08114EF8:\n\ + lsrs r1, r0, 24\n\ +_08114EFA:\n\ + cmp r3, 0x20\n\ + bne _08114F08\n\ + lsls r0, r1, 24\n\ + movs r2, 0x80\n\ + lsls r2, 17\n\ + adds r0, r2\n\ + lsrs r1, r0, 24\n\ +_08114F08:\n\ + cmp r1, 0x2\n\ + beq _08114F5E\n\ + subs r0, r6, 0x2\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + cmp r0, 0\n\ + bge _08114F18\n\ + movs r1, 0\n\ +_08114F18:\n\ + adds r0, r6, 0x2\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3F\n\ + ble _08114F26\n\ + movs r2, 0x3F\n\ +_08114F26:\n\ + lsls r1, 24\n\ + asrs r3, r1, 24\n\ + lsls r0, r2, 24\n\ + asrs r2, r0, 24\n\ + adds r6, r1, 0\n\ + adds r7, r0, 0\n\ + cmp r3, r2\n\ + bge _08114F7C\n\ + cmp r4, 0\n\ + beq _08114F7C\n\ + subs r0, r4, 0x1\n\ + lsls r5, r0, 7\n\ + ldr r0, _08114F68 @ =gSharedMem + 0x188C4\n\ + mov r12, r0\n\ +_08114F42:\n\ + asrs r0, r3, 1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + add r0, r12\n\ + ldr r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08114F6C\n\ + ldrb r1, [r1]\n\ + movs r0, 0xF0\n\ +_08114F58:\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08114F72\n\ +_08114F5E:\n\ + movs r0, 0x1\n\ + b _08114FCA\n\ + .align 2, 0\n\ +_08114F64: .4byte 0x000008c4\n\ +_08114F68: .4byte gSharedMem + 0x188C4\n\ +_08114F6C:\n\ + ldrb r1, [r1]\n\ + movs r0, 0xF\n\ + b _08114F58\n\ +_08114F72:\n\ + adds r3, 0x1\n\ + cmp r3, r2\n\ + bge _08114F7C\n\ + cmp r4, 0\n\ + bne _08114F42\n\ +_08114F7C:\n\ + asrs r3, r6, 24\n\ + asrs r1, r7, 24\n\ + cmp r3, r1\n\ + bge _08114FC8\n\ + cmp r4, 0x3F\n\ + beq _08114FC8\n\ + adds r0, r4, 0x1\n\ + lsls r5, r0, 7\n\ + ldr r6, _08114FB0 @ =gSharedMem + 0x188C4\n\ + adds r2, r1, 0\n\ +_08114F90:\n\ + asrs r0, r3, 1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + adds r0, r6\n\ + ldr r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08114FB4\n\ + ldrb r1, [r1]\n\ + movs r0, 0xF0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08114FBE\n\ + b _08114F5E\n\ + .align 2, 0\n\ +_08114FB0: .4byte gSharedMem + 0x188C4\n\ +_08114FB4:\n\ + ldrb r1, [r1]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08114F5E\n\ +_08114FBE:\n\ + adds r3, 0x1\n\ + cmp r3, r2\n\ + bge _08114FC8\n\ + cmp r4, 0x3F\n\ + bne _08114F90\n\ +_08114FC8:\n\ + movs r0, 0\n\ +_08114FCA:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided"); +} + +// Functions below are vblank callbacks and are used + +static void EvoDummyFunc(void) +{ + +} + +static void VBlankCB_EvolutionScene(void) +{ + REG_BG0CNT = BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256 | BGCNT_AFF512x512 | BGCNT_PRIORITY(3); // 0x9803 + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; + REG_BG1HOFS = gBattle_BG1_X; + REG_BG1VOFS = gBattle_BG1_Y; + REG_BG2HOFS = gBattle_BG2_X; + REG_BG2VOFS = gBattle_BG2_Y; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void VBlankCB_TradeEvolutionScene(void) +{ + REG_BG0HOFS = gBattle_BG0_X; + REG_BG0VOFS = gBattle_BG0_Y; + REG_BG1HOFS = gBattle_BG1_X; + REG_BG1VOFS = gBattle_BG1_Y; + REG_BG2HOFS = gBattle_BG2_X; + REG_BG2VOFS = gBattle_BG2_Y; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void sub_81150D8(void) +{ + MenuCursor_SetPos814A880(200, 72 + (sEvoCursorPos * 16)); +} + +static void EvoDummyFunc2(void) +{ + +} diff --git a/src/field/bard_music.c b/src/field/bard_music.c deleted file mode 100644 index 5c48749cf..000000000 --- a/src/field/bard_music.c +++ /dev/null @@ -1,225 +0,0 @@ -#include "global.h" -#include "bard_music.h" -#include "easy_chat.h" - -struct BardSound -{ - /*0x00*/ u8 var00; - /*0x01*/ s8 var01; - /*0x02*/ u16 var02; - /*0x04*/ u16 volume; - /*0x06*/ u16 var06; -}; - -static const s16 Unknown_8416F08[] = {-768, 6144}; -static const s16 Unknown_8416F0C[] = {2304, 6144}; -static const s16 Unknown_8416F10[] = {256, 6144}; -static const s16 Unknown_8416F14[] = {1024, 6144}; -static const s16 Unknown_8416F18[] = {2816, 6144}; -static const s16 Unknown_8416F1C[] = {-768, -256, 6144}; -static const s16 Unknown_8416F22[] = {-768, 512, 6144}; -static const s16 Unknown_8416F28[] = {512, 1024, 6144}; -static const s16 Unknown_8416F2E[] = {1536, 2048, 6144}; -static const s16 Unknown_8416F34[] = {2304, 2048, 6144}; -static const s16 Unknown_8416F3A[] = {-768, -256, -768, 6144}; -static const s16 Unknown_8416F42[] = {1024, -768, 1024, 6144}; -static const s16 Unknown_8416F4A[] = {2304, 2048, 1536, 6144}; -static const s16 Unknown_8416F52[] = {256, 512, 1024, 6144}; -static const s16 Unknown_8416F5A[] = {1536, 4096, 3328, 6144}; -static const s16 Unknown_8416F62[] = {1024, 2304, 1024, 2304, 6144}; -static const s16 Unknown_8416F6C[] = {2304, 1024, 3328, 1024, 6144}; -static const s16 Unknown_8416F76[] = {256, 512, 1024, 1536, 6144}; -static const s16 Unknown_8416F80[] = {2048, 1536, 1024, 512, 6144}; -static const s16 Unknown_8416F8A[] = {3840, 3328, 2816, 2560, 6144}; -static const s16 Unknown_8416F94[] = {-768, -256, 256, 512, 1024, 6144}; -static const s16 Unknown_8416FA0[] = {2304, 2048, 1536, 1024, 512, 6144}; -static const s16 Unknown_8416FAC[] = {256, 1024, 2304, 1024, 256, 6144}; -static const s16 Unknown_8416FB8[] = {2304, 1024, 2304, 1024, -768, 6144}; -static const s16 Unknown_8416FC4[] = {2816, 2048, 1024, 1024, 1536, 6144}; -static const s16 Unknown_8416FD0[] = {-768, -256, 256, 512, 1024, 1536, 6144}; -static const s16 Unknown_8416FDE[] = {2048, 1536, 1024, 512, 256, -256, 6144}; -static const s16 Unknown_8416FEC[] = {256, 512, 1024, 256, 512, 4096, 6144}; -static const s16 Unknown_8416FFA[] = {1024, -768, 2304, 1024, 2304, 1024, 6144}; -static const s16 Unknown_8417008[] = {2048, 2304, 2048, 2304, 2048, 2304, 6144}; -static const s16 Unknown_8417016[] = {512, 256, 512, 256, 512, 1024, 512, 6144}; -static const s16 Unknown_8417026[] = {256, 256, -256, -256, -768, 1024, -768, 6144}; -static const s16 Unknown_8417036[] = {2048, 2304, 2816, 3328, 3584, 3328, 2816, 6144}; -static const s16 Unknown_8417046[] = {2048, 1536, 1024, 512, 3328, 2816, 2304, 6144}; -static const s16 Unknown_8417056[] = {768, 1024, 1536, 2048, 1792, 2048, 1024, 6144}; - -static const s16 *const sWordPitches[] = { - Unknown_8416F08, - Unknown_8416F0C, - Unknown_8416F10, - Unknown_8416F14, - Unknown_8416F18, - Unknown_8416F1C, - Unknown_8416F22, - Unknown_8416F28, - Unknown_8416F2E, - Unknown_8416F34, - Unknown_8416F3A, - Unknown_8416F42, - Unknown_8416F4A, - Unknown_8416F52, - Unknown_8416F5A, - Unknown_8416F62, - Unknown_8416F6C, - Unknown_8416F76, - Unknown_8416F80, - Unknown_8416F8A, - Unknown_8416F94, - Unknown_8416FA0, - Unknown_8416FAC, - Unknown_8416FB8, - Unknown_8416FC4, - Unknown_8416FD0, - Unknown_8416FDE, - Unknown_8416FEC, - Unknown_8416FFA, - Unknown_8417008, - Unknown_8417016, - Unknown_8417026, - Unknown_8417036, - Unknown_8417046, - Unknown_8417056 -}; - -static const u32 sBardSoundLengthDeltas[] = { - 9, - 22, - 15, - 16, - 39, - 21, - 9, - 30, - 24, - 15, - 25, - 12, - 22, - 45, - 24, - 15, - 40, - 9, - 21, - 42, - 18, - 9, - 22, - 15, - 27, - 48, - 18, - 27, - 33, - 24, - 25, - 39, - 19, - 16, - 54, - 18, - 9, - 45, - 15, - 12, - 39, - 23, - 5, - 45, - 12, - 21, - 48, - 12, - 21, - 69, - 18, - 15 -}; - -#if ENGLISH -#include "../src/data/bard_music_en.h" -#elif GERMAN -#include "../src/data/bard_music_de.h" -#endif // ENGLISH/GERMAN - -static const struct BardSound (*const gBardMusicTable[])[6] = { - BardMusic_POKEMON, - BardMusic_TRAINER, - BardMusic_STATUS, - BardMusic_BATTLE, - BardMusic_GREETINGS, - BardMusic_PEOPLE, - BardMusic_VOICES, - BardMusic_SPEECH, - BardMusic_ENDINGS, - BardMusic_FEELINGS, - BardMusic_CONDITIONS, - BardMusic_ACTIONS, - BardMusic_LIFESTYLE, - BardMusic_HOBBIES, - BardMusic_TIME, - BardMusic_MISC, - BardMusic_ADJECTIVES, - BardMusic_EVENTS, - BardMusic_MOVE_1, - BardMusic_MOVE_2, - BardMusic_TRENDY_SAYING, - BardMusic_POKEMON_2 -}; - -static s16 CalcWordPitch(u32 arg0, u32 songPos) -{ - return sWordPitches[arg0][songPos]; -} - -#if ENGLISH -const struct BardSound *GetWordSounds(u16 group, u16 word) -{ - const struct BardSound (*sounds)[6] = gBardMusicTable[group]; - - return sounds[word]; -} -#elif GERMAN -const struct BardSound *GetWordSounds(u16 group, u16 word) -{ - const struct BardSound (*sounds)[6] = gBardMusicTable[group]; - u32 index = de_sub_80EB748(group, word); - - return sounds[index]; -} -#endif - -s32 GetWordPhonemes(struct BardSong *song, const struct BardSound *src, u16 arg2) -{ - s32 i; - s32 j; - s32 thirty; - - for (i = 0; i < 6; i++) - { - song->phonemes[i].sound = src[i].var00; - if (src[i].var00 != 0xFF) - { - s32 length = src[i].var01 + sBardSoundLengthDeltas[src[i].var00]; - - song->phonemes[i].length = length; - song->phonemes[i].volume = src[i].volume; - song->var04 += length; - } - } - - for (j = 0, thirty = 30; j < i; j++) - song->phonemes[j].pitch = CalcWordPitch(thirty + arg2, j); - - song->currWord++; - song->currPhoneme = 0; - song->phonemeTimer = 0; - song->state = 0; - song->voiceInflection = 0; - - //warning: no return statement in function returning non-void -} diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c deleted file mode 100644 index d4dbba120..000000000 --- a/src/field/battle_tower.c +++ /dev/null @@ -1,2107 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_setup.h" -#include "battle_tower.h" -#include "battle_transition.h" -#include "data2.h" -#include "easy_chat.h" -#include "constants/easy_chat.h" -#include "event_data.h" -#include "item.h" -#include "constants/items.h" -#include "main.h" -#include "constants/map_objects.h" -#include "constants/moves.h" -#include "new_game.h" -#include "overworld.h" -#include "pokedex.h" -#include "random.h" -#include "save.h" -#include "script_pokemon_80C4.h" -#include "constants/species.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "trainer.h" -#include "tv.h" -#include "constants/vars.h" -#include "ewram.h" - -#if ENGLISH -#include "../data/battle_tower/trainers.h" -#elif GERMAN -#include "../data/battle_tower/trainers_de.h" -#endif - -static const u16 sBattleTowerHeldItems[] = -{ - ITEM_NONE, - ITEM_KINGS_ROCK, - ITEM_SITRUS_BERRY, - ITEM_ORAN_BERRY, - ITEM_CHESTO_BERRY, - ITEM_HARD_STONE, - ITEM_FOCUS_BAND, - ITEM_PERSIM_BERRY, - ITEM_MIRACLE_SEED, - ITEM_BERRY_JUICE, - ITEM_MACHO_BRACE, - ITEM_SILVER_POWDER, - ITEM_CHERI_BERRY, - ITEM_BLACK_GLASSES, - ITEM_BLACK_BELT, - ITEM_SOUL_DEW, - ITEM_CHOICE_BAND, - ITEM_MAGNET, - ITEM_SILK_SCARF, - ITEM_WHITE_HERB, - ITEM_DEEP_SEA_SCALE, - ITEM_DEEP_SEA_TOOTH, - ITEM_MYSTIC_WATER, - ITEM_SHARP_BEAK, - ITEM_QUICK_CLAW, - ITEM_LEFTOVERS, - ITEM_RAWST_BERRY, - ITEM_LIGHT_BALL, - ITEM_POISON_BARB, - ITEM_NEVER_MELT_ICE, - ITEM_ASPEAR_BERRY, - ITEM_SPELL_TAG, - ITEM_BRIGHT_POWDER, - ITEM_LEPPA_BERRY, - ITEM_SCOPE_LENS, - ITEM_TWISTED_SPOON, - ITEM_METAL_COAT, - ITEM_MENTAL_HERB, - ITEM_CHARCOAL, - ITEM_PECHA_BERRY, - ITEM_SOFT_SAND, - ITEM_LUM_BERRY, - ITEM_DRAGON_SCALE, - ITEM_DRAGON_FANG, - ITEM_IAPAPA_BERRY, - ITEM_WIKI_BERRY, - ITEM_SEA_INCENSE, - ITEM_SHELL_BELL, - ITEM_SALAC_BERRY, - ITEM_LANSAT_BERRY, - ITEM_APICOT_BERRY, - ITEM_STARF_BERRY, - ITEM_LIECHI_BERRY, - ITEM_STICK, - ITEM_LAX_INCENSE, - ITEM_AGUAV_BERRY, - ITEM_FIGY_BERRY, - ITEM_THICK_CLUB, - ITEM_MAGO_BERRY, - ITEM_METAL_POWDER, - ITEM_PETAYA_BERRY, - ITEM_LUCKY_PUNCH, - ITEM_GANLON_BERRY, -}; - -#include "../data/battle_tower/level_50_mons.h" -#include "../data/battle_tower/level_100_mons.h" - -static const u8 sMaleTrainerClasses[] = -{ - FACILITY_CLASS_RUIN_MANIAC, - FACILITY_CLASS_TUBER_M, - FACILITY_CLASS_COOL_TRAINER_M, - FACILITY_CLASS_RICH_BOY, - FACILITY_CLASS_POKEMANIAC, - FACILITY_CLASS_SWIMMER_M, - FACILITY_CLASS_BLACK_BELT, - FACILITY_CLASS_GUITARIST, - FACILITY_CLASS_KINDLER, - FACILITY_CLASS_CAMPER, - FACILITY_CLASS_BUG_MANIAC, - FACILITY_CLASS_PSYCHIC_M, - FACILITY_CLASS_GENTLEMAN, - FACILITY_CLASS_SCHOOL_KID_M, - FACILITY_CLASS_POKEFAN_M, - FACILITY_CLASS_EXPERT_M, - FACILITY_CLASS_YOUNGSTER, - FACILITY_CLASS_FISHERMAN, - FACILITY_CLASS_CYCLING_TRIATHLETE_M, - FACILITY_CLASS_RUNNING_TRIATHLETE_M, - FACILITY_CLASS_SWIMMING_TRIATHLETE_M, - FACILITY_CLASS_DRAGON_TAMER, - FACILITY_CLASS_BIRD_KEEPER, - FACILITY_CLASS_NINJA_BOY, - FACILITY_CLASS_SAILOR, - FACILITY_CLASS_COLLECTOR, - FACILITY_CLASS_POKEMON_BREEDER_M, - FACILITY_CLASS_POKEMON_RANGER_M, - FACILITY_CLASS_BUG_CATCHER, - FACILITY_CLASS_HIKER, -}; - -static const u8 sFemaleTrainerClasses[] = -{ - FACILITY_CLASS_AROMA_LADY, - FACILITY_CLASS_TUBER_F, - FACILITY_CLASS_COOL_TRAINER_F, - FACILITY_CLASS_HEX_MANIAC, - FACILITY_CLASS_LADY, - FACILITY_CLASS_BEAUTY, - FACILITY_CLASS_PSYCHIC_F, - FACILITY_CLASS_SCHOOL_KID_F, - FACILITY_CLASS_POKEFAN_F, - FACILITY_CLASS_EXPERT_F, - FACILITY_CLASS_CYCLING_TRIATHLETE_F, - FACILITY_CLASS_RUNNING_TRIATHLETE_F, - FACILITY_CLASS_SWIMMING_TRIATHLETE_F, - FACILITY_CLASS_BATTLE_GIRL, - FACILITY_CLASS_PARASOL_LADY, - FACILITY_CLASS_SWIMMER_F, - FACILITY_CLASS_PICNICKER, - FACILITY_CLASS_POKEMON_BREEDER_F, - FACILITY_CLASS_POKEMON_RANGER_F, - FACILITY_CLASS_LASS, -}; - -static const u8 sMaleTrainerGfxIds[] = -{ - MAP_OBJ_GFX_HIKER, - MAP_OBJ_GFX_TUBER_M, - MAP_OBJ_GFX_MAN_4, - MAP_OBJ_GFX_BOY_4, - MAP_OBJ_GFX_MANIAC, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, - MAP_OBJ_GFX_BLACK_BELT, - MAP_OBJ_GFX_MAN_6, - MAP_OBJ_GFX_MAN_6, - MAP_OBJ_GFX_CAMPER, - MAP_OBJ_GFX_MANIAC, - MAP_OBJ_GFX_PSYCHIC_M, - MAP_OBJ_GFX_GENTLEMAN, - MAP_OBJ_GFX_SCHOOL_KID_M, - MAP_OBJ_GFX_MAN_3, - MAP_OBJ_GFX_OLD_MAN_1, - MAP_OBJ_GFX_YOUNGSTER, - MAP_OBJ_GFX_FISHERMAN, - MAP_OBJ_GFX_CYCLING_TRIATHLETE_M, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, - MAP_OBJ_GFX_MAN_4, - MAP_OBJ_GFX_MAN_6, - MAP_OBJ_GFX_LITTLE_BOY_1, - MAP_OBJ_GFX_SAILOR, - MAP_OBJ_GFX_MANIAC, - MAP_OBJ_GFX_MAN_5, - MAP_OBJ_GFX_CAMPER, - MAP_OBJ_GFX_BUG_CATCHER, - MAP_OBJ_GFX_HIKER, -}; - -static const u8 sFemaleTrainerGfxIds[] = -{ - MAP_OBJ_GFX_WOMAN_3, - MAP_OBJ_GFX_TUBER_F, - MAP_OBJ_GFX_WOMAN_7, - MAP_OBJ_GFX_WOMAN_1, - MAP_OBJ_GFX_WOMAN_3, - MAP_OBJ_GFX_BEAUTY, - MAP_OBJ_GFX_LASS, - MAP_OBJ_GFX_GIRL_3, - MAP_OBJ_GFX_WOMAN_2, - MAP_OBJ_GFX_OLD_WOMAN_1, - MAP_OBJ_GFX_CYCLING_TRIATHLETE_F, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, - MAP_OBJ_GFX_GIRL_3, - MAP_OBJ_GFX_WOMAN_7, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, - MAP_OBJ_GFX_PICNICKER, - MAP_OBJ_GFX_WOMAN_3, - MAP_OBJ_GFX_PICNICKER, - MAP_OBJ_GFX_LASS, -}; - -const u16 gBattleTowerBannedSpecies[] = -{ - SPECIES_MEW, - SPECIES_MEWTWO, - SPECIES_HO_OH, - SPECIES_LUGIA, - SPECIES_CELEBI, - SPECIES_KYOGRE, - SPECIES_GROUDON, - SPECIES_RAYQUAZA, - SPECIES_JIRACHI, - SPECIES_DEOXYS, - 0xFFFF, -}; - -// Item prizes for battle tower streaks of 5 or fewer sets. -static const u16 sShortStreakPrizes[] = -{ - ITEM_HP_UP, - ITEM_PROTEIN, - ITEM_IRON, - ITEM_CALCIUM, - ITEM_CARBOS, - ITEM_ZINC, -}; - -// Item prizes for battle tower streaks of greater than 5 sets. -static const u16 sLongStreakPrizes[] = -{ - ITEM_BRIGHT_POWDER, - ITEM_WHITE_HERB, - ITEM_QUICK_CLAW, - ITEM_LEFTOVERS, - ITEM_MENTAL_HERB, - ITEM_KINGS_ROCK, - ITEM_FOCUS_BAND, - ITEM_SCOPE_LENS, - ITEM_CHOICE_BAND, -}; - -static void ResetBattleTowerStreak(u8 levelType); -static void ValidateBattleTowerRecordChecksums(void); -static void PrintEReaderTrainerFarewellMessage(void); -extern void SetBattleTowerTrainerGfxId(u8); -static void SaveCurrentWinStreak(void); -static void sub_8135CFC(void); -static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *); -static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); -static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *); -static void ClearBattleTowerRecord(struct BattleTowerRecord *); - -extern const u8 BattleText_Format3[]; -extern const u8 BattleText_Format4[]; -extern const u8 BattleText_Format5[]; -extern const u8 BattleText_Format6[]; -extern const u8 BattleText_Format7[]; -extern const u8 BattleText_Format8[]; -extern const u8 BattleText_Format9[]; -extern u16 gSpecialVar_0x8004; -extern u8 gTrainerClassToPicIndex[]; -extern u8 gTrainerClassToNameIndex[]; -extern u16 gTrainerBattleOpponent; -extern u16 gBattleTypeFlags; -extern u8 gSelectedOrderFromParty[]; -extern u8 gBattleOutcome; -extern struct Pokemon gUnknown_030042FC[]; -extern struct BattlePokemon gBattleMons[]; - -void sub_8134548(void) -{ - u8 var1 = 0; - s32 levelType; - - for (levelType = 0; levelType < 2; levelType++) - { - switch (gSaveBlock2.battleTower.var_4AE[levelType]) - { - case 0: - default: - ResetBattleTowerStreak(levelType); - if (!var1) - VarSet(VAR_TEMP_0, 5); - break; - case 1: - ResetBattleTowerStreak(levelType); - VarSet(VAR_TEMP_0, 1); - var1++; - break; - case 4: - VarSet(VAR_TEMP_0, 2); - var1++; - break; - case 5: - VarSet(VAR_TEMP_0, 3); - var1++; - break; - case 2: - VarSet(VAR_TEMP_0, 4); - var1++; - break; - case 3: - case 6: - break; - } - } - - if ((gSaveBlock2.battleTower.var_4AE[0] == 3 || gSaveBlock2.battleTower.var_4AE[0] == 6) - && (gSaveBlock2.battleTower.var_4AE[1] == 3 || gSaveBlock2.battleTower.var_4AE[1] == 6)) - VarSet(VAR_TEMP_0, 5); - - ValidateBattleTowerRecordChecksums(); -} - -void ResetBattleTowerStreak(u8 levelType) -{ - gSaveBlock2.battleTower.var_4AE[levelType] = 0; - gSaveBlock2.battleTower.curChallengeBattleNum[levelType] = 1; - gSaveBlock2.battleTower.curStreakChallengesNum[levelType] = 1; -} - -// Checks if the next trainer in Battle Tower should be the E-Reader trainer. -bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak) -{ - u8 trainerTeamLevel; - u8 monLevel; - s32 i; - u16 validPartySpecies[6]; - u16 validPartyHeldItems[6]; - u8 numValid; - - numValid = 0; - - ValidateEReaderTrainer(); - - if (gSpecialVar_Result != 0 || gSaveBlock2.battleTower.ereaderTrainer.winStreak != winStreak) - return FALSE; - - if (levelType != 0) - trainerTeamLevel = 100; - else - trainerTeamLevel = 50; - - for (i = 0; i < 3; i++) - { - monLevel = gSaveBlock2.battleTower.ereaderTrainer.party[i].level; - if (gSaveBlock2.battleTower.ereaderTrainer.party[i].level != trainerTeamLevel) - return FALSE; - - CheckMonBattleTowerBanlist( - gSaveBlock2.battleTower.ereaderTrainer.party[i].species, - gSaveBlock2.battleTower.ereaderTrainer.party[i].heldItem, - 1, - levelType, - monLevel, - validPartySpecies, - validPartyHeldItems, - &numValid); - } - - return (numValid == 3); -} - -bool8 sub_81346F4(void) -{ - s32 recordIndex, i; - u8 battleTowerLevelType; - u16 winStreak; - bool8 retVal; - s32 numCandidates; - u32 trainerIds[5]; - - numCandidates = 0; - battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak)) - { - gSaveBlock2.battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID; - retVal = TRUE; - } - else - { - // Check if one of the battle tower trainers from record mixing should be the next trainer. - for (recordIndex = 0; recordIndex < 5; recordIndex++) - { - struct BattleTowerRecord *record = &gSaveBlock2.battleTower.records[recordIndex]; - u32 recordHasData = 0; - u32 checksum = 0; - - for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32) - 1; i++) - { - recordHasData |= ((u32 *)record)[i]; - checksum += ((u32 *)record)[i]; - } - - if (gSaveBlock2.battleTower.records[recordIndex].winStreak == winStreak - && gSaveBlock2.battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType - && recordHasData - && gSaveBlock2.battleTower.records[recordIndex].checksum == checksum) - { - trainerIds[numCandidates] = recordIndex; - numCandidates++; - } - } - - if (numCandidates == 0) - { - retVal = FALSE; - } - else - { - gSaveBlock2.battleTower.battleTowerTrainerId = trainerIds[Random() % numCandidates] + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID; - retVal = TRUE; - } - } - - return retVal; -} - -// void sub_81347F8(void) -// { -// bool8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; -// if (sub_81346F4()) -// { -// SetBattleTowerTrainerGfxId(gSaveBlock2.battleTower.battleTowerTrainerId); -// gSaveBlock2.battleTower.var_4C1[gSaveBlock2.battleTower.curChallengeBattleNum[levelType]] = gSaveBlock2.battleTower.battleTowerTrainerId; -// } -// else -// { -// u16 var1; - -// if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] > 7) -// { -// while (1) -// { -// s32 i; -// u32 temp = ((Random() & 0xFF) * 30) >> 8; -// var1 = temp + 70; -// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && var1 != gSaveBlock2.battleTower.var_4C1[i]; i++) // TODO: [i + 1]??? -// { } - -// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) -// { -// break; -// } -// } -// } -// else -// { -// if (gSaveBlock2.battleTower.curChallengeBattleNum[levelType] == 7) -// { -// while (1) -// { -// s32 i; -// u32 temp = ((Random() & 0xFF) * 5); -// u32 temp2 = (((gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1) * 10) + 20); -// var1 = temp / 128 + temp2; -// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2.battleTower.var_4C1[i] != var1; i++) // TODO: [i + 1]???? -// { } - -// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) -// { -// break; -// } -// } -// } -// else -// { -// while (1) -// { -// s32 i; -// u32 temp = ((Random() & 0xFF) * 320); -// u32 temp2 = ((gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1) * 10); -// var1 = temp + temp2; -// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2.battleTower.var_4C1[i] != var1; i++) -// { } - -// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) -// { -// break; -// } -// } -// } -// } - -// gSaveBlock2.battleTower.battleTowerTrainerId = var1; -// SetBattleTowerTrainerGfxId(gSaveBlock2.battleTower.battleTowerTrainerId); - -// if (gSaveBlock2.battleTower.curChallengeBattleNum[levelType] < 7) -// { -// gSaveBlock2.battleTower.var_4C1[gSaveBlock2.battleTower.curChallengeBattleNum[levelType]] = gSaveBlock2.battleTower.battleTowerTrainerId; -// } -// } -// } - -__attribute__((naked)) -void sub_81347F8(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r5, _08134838 @ =gSaveBlock2\n\ - ldr r1, _0813483C @ =0x00000554\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 31\n\ - lsrs r6, r0, 31\n\ - bl sub_81346F4\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08134848\n\ - ldr r2, _08134840 @ =0x00000564\n\ - adds r4, r5, r2\n\ - ldrb r0, [r4]\n\ - bl SetBattleTowerTrainerGfxId\n\ - lsls r0, r6, 1\n\ - movs r3, 0xAB\n\ - lsls r3, 3\n\ - adds r1, r5, r3\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - adds r0, r5, r0\n\ - ldr r1, _08134844 @ =0x00000569\n\ - adds r0, r1\n\ - ldrb r1, [r4]\n\ - b _081349DC\n\ - .align 2, 0\n\ -_08134838: .4byte gSaveBlock2\n\ -_0813483C: .4byte 0x00000554\n\ -_08134840: .4byte 0x00000564\n\ -_08134844: .4byte 0x00000569\n\ -_08134848:\n\ - lsls r0, r6, 1\n\ - ldr r2, _081348D8 @ =0x0000055c\n\ - adds r1, r5, r2\n\ - adds r1, r0, r1\n\ - ldrh r1, [r1]\n\ - adds r7, r0, 0\n\ - cmp r1, 0x7\n\ - bls _0813485A\n\ - b _0813495C\n\ -_0813485A:\n\ - movs r3, 0xAB\n\ - lsls r3, 3\n\ - adds r0, r5, r3\n\ - adds r1, r7, r0\n\ - ldrh r0, [r1]\n\ - cmp r0, 0x7\n\ - bne _081348E4\n\ - adds r6, r5, 0\n\ - mov r9, r7\n\ - adds r5, r1, 0\n\ - ldr r0, _081348DC @ =0x0000056a\n\ - adds r0, r6\n\ - mov r10, r0\n\ - mov r8, r5\n\ -_08134876:\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - lsls r2, r1, 2\n\ - adds r2, r1\n\ - ldr r1, _081348D8 @ =0x0000055c\n\ - adds r4, r6, r1\n\ - mov r3, r9\n\ - adds r0, r3, r4\n\ - ldrh r1, [r0]\n\ - subs r1, 0x1\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 1\n\ - adds r0, 0x14\n\ - lsrs r2, 7\n\ - adds r2, r0\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - movs r1, 0\n\ - ldrh r0, [r5]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - bge _081348C8\n\ - mov r3, r10\n\ - ldrb r0, [r3]\n\ - cmp r0, r2\n\ - beq _081348C8\n\ - subs r0, r4, 0x4\n\ - adds r0, r7, r0\n\ - ldrh r0, [r0]\n\ - subs r3, r0, 0x1\n\ - adds r4, 0xE\n\ -_081348BA:\n\ - adds r1, 0x1\n\ - cmp r1, r3\n\ - bge _081348C8\n\ - adds r0, r1, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, r2\n\ - bne _081348BA\n\ -_081348C8:\n\ - mov r3, r8\n\ - ldrh r0, [r3]\n\ - subs r0, 0x1\n\ - ldr r4, _081348E0 @ =gSaveBlock2\n\ - cmp r1, r0\n\ - bne _08134876\n\ - b _081349B6\n\ - .align 2, 0\n\ -_081348D8: .4byte 0x0000055c\n\ -_081348DC: .4byte 0x0000056a\n\ -_081348E0: .4byte gSaveBlock2\n\ -_081348E4:\n\ - adds r6, r5, 0\n\ - mov r9, r7\n\ - adds r5, r1, 0\n\ - ldr r2, _08134950 @ =0x0000056a\n\ - adds r2, r6\n\ - mov r10, r2\n\ - mov r8, r5\n\ -_081348F2:\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsrs r2, r0, 6\n\ - ldr r3, _08134954 @ =0x0000055c\n\ - adds r4, r6, r3\n\ - mov r1, r9\n\ - adds r0, r1, r4\n\ - ldrh r1, [r0]\n\ - subs r1, 0x1\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 1\n\ - adds r0, r2, r0\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - movs r1, 0\n\ - ldrh r0, [r5]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - bge _08134942\n\ - mov r3, r10\n\ - ldrb r0, [r3]\n\ - cmp r0, r2\n\ - beq _08134942\n\ - subs r0, r4, 0x4\n\ - adds r0, r7, r0\n\ - ldrh r0, [r0]\n\ - subs r3, r0, 0x1\n\ - adds r4, 0xE\n\ -_08134934:\n\ - adds r1, 0x1\n\ - cmp r1, r3\n\ - bge _08134942\n\ - adds r0, r1, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, r2\n\ - bne _08134934\n\ -_08134942:\n\ - mov r3, r8\n\ - ldrh r0, [r3]\n\ - subs r0, 0x1\n\ - ldr r4, _08134958 @ =gSaveBlock2\n\ - cmp r1, r0\n\ - bne _081348F2\n\ - b _081349B6\n\ - .align 2, 0\n\ -_08134950: .4byte 0x0000056a\n\ -_08134954: .4byte 0x0000055c\n\ -_08134958: .4byte gSaveBlock2\n\ -_0813495C:\n\ - movs r2, 0xAB\n\ - lsls r2, 3\n\ - adds r0, r5, r2\n\ - adds r6, r7, r0\n\ - ldr r3, _081349EC @ =0x0000056a\n\ - adds r3, r5\n\ - mov r8, r3\n\ - adds r5, r6, 0\n\ -_0813496C:\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 1\n\ - asrs r0, 8\n\ - adds r0, 0x46\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - movs r1, 0\n\ - ldrh r0, [r6]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - bge _081349AC\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - ldr r4, _081349F0 @ =gSaveBlock2\n\ - cmp r0, r2\n\ - beq _081349AC\n\ - ldrh r0, [r5]\n\ - subs r3, r0, 0x1\n\ - ldr r0, _081349EC @ =0x0000056a\n\ - adds r4, r0\n\ -_0813499E:\n\ - adds r1, 0x1\n\ - cmp r1, r3\n\ - bge _081349AC\n\ - adds r0, r1, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, r2\n\ - bne _0813499E\n\ -_081349AC:\n\ - ldrh r0, [r6]\n\ - subs r0, 0x1\n\ - ldr r4, _081349F0 @ =gSaveBlock2\n\ - cmp r1, r0\n\ - bne _0813496C\n\ -_081349B6:\n\ - ldr r1, _081349F4 @ =0x00000564\n\ - adds r0, r4, r1\n\ - strb r2, [r0]\n\ - ldr r2, _081349F4 @ =0x00000564\n\ - adds r5, r4, r2\n\ - ldrb r0, [r5]\n\ - bl SetBattleTowerTrainerGfxId\n\ - movs r3, 0xAB\n\ - lsls r3, 3\n\ - adds r0, r4, r3\n\ - adds r1, r7, r0\n\ - ldrh r0, [r1]\n\ - cmp r0, 0x6\n\ - bhi _081349DE\n\ - adds r0, r4, r0\n\ - ldr r1, _081349F8 @ =0x00000569\n\ - adds r0, r1\n\ - ldrb r1, [r5]\n\ -_081349DC:\n\ - strb r1, [r0]\n\ -_081349DE:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081349EC: .4byte 0x0000056a\n\ -_081349F0: .4byte gSaveBlock2\n\ -_081349F4: .4byte 0x00000564\n\ -_081349F8: .4byte 0x00000569\n\ -.syntax divided\n"); -} - -void SetBattleTowerTrainerGfxId(u8 trainerIndex) -{ - u32 i; - u8 trainerClass; - - if (trainerIndex < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - trainerClass = gBattleTowerTrainers[trainerIndex].trainerClass; - else if (trainerIndex < BATTLE_TOWER_EREADER_TRAINER_ID) - trainerClass = gSaveBlock2.battleTower.records[trainerIndex - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; - else - trainerClass = gSaveBlock2.battleTower.ereaderTrainer.trainerClass; - - for (i = 0; i < 30; i++) - { - if (sMaleTrainerClasses[i] == trainerClass) - break; - } - if (i != 30) - { - u8 trainerObjectGfxId = sMaleTrainerGfxIds[i]; - VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId); - return; - } - - for (i = 0; i < 20; i++) - { - if (sFemaleTrainerClasses[i] == trainerClass) - break; - } - if (i != 20) - { - u8 trainerObjectGfxId = sFemaleTrainerGfxIds[i]; - VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId); - return; - } - - VarSet(VAR_OBJ_GFX_ID_0, MAP_OBJ_GFX_BOY_1); -} - -void SetEReaderTrainerGfxId(void) -{ - SetBattleTowerTrainerGfxId(BATTLE_TOWER_EREADER_TRAINER_ID); -} - -// void sub_8134AC0(struct BattleTowerRecord *record) -// { -// u16 var1[6]; -// u16 var2[6]; -// s32 i, j, k; -// s16 l = 0; - -// for (i = 0; i < 5; i++) -// { -// k = 0; -// for (j = 0; j < 4 && gSaveBlock2.battleTower.records[i].trainerId[j] == record->trainerId[j]; j++); -// if (j == 4) -// { -// for (; k < 7 && gSaveBlock2.battleTower.records[i].name[4] == record->name[4]; k++) -// { -// if (record->name[4] == 0xFF) -// { -// k = 7; -// break; -// } -// } -// } - -// if (k == 7) -// { -// break; -// } -// } - -// if (i < 5) -// { -// gSaveBlock2.battleTower.records[i] = *record; -// return; -// } - -// i = 0; -// while (i < 5) -// { -// if (gSaveBlock2.battleTower.records[i].winStreak == 0) -// { -// if (i > 4) -// { -// break; -// } - -// gSaveBlock2.battleTower.records[i] = *record; -// return; -// } - -// i++; -// } - -// var1[0] = gSaveBlock2.battleTower.records[0].winStreak; -// var2[0] = 0; -// l++; - -// for (i = 1; i < 5; i++) -// { -// j = 0; -// if (j < l) -// { -// for (; gSaveBlock2.battleTower.records[i].winStreak <= var1[j]; j++) -// { -// if (gSaveBlock2.battleTower.records[i].winStreak < var1[j]) -// { -// j = 0; -// l = 1; -// var1[0] = gSaveBlock2.battleTower.records[i].winStreak; -// var2[0] = i; -// break; -// } -// } -// } - -// if (j == l) -// { -// var1[l] = gSaveBlock2.battleTower.records[i].winStreak; -// var2[l] = i; -// l++; -// } -// } - -// gSaveBlock2.battleTower.records[var2[(Random() % l)]] = *record; -// } -__attribute__((naked)) -void sub_8134AC0(struct BattleTowerRecord *record) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x1C\n\ - movs r7, 0\n\ - mov r8, r0\n\ - movs r5, 0\n\ - ldr r0, _08134B3C @ =gSaveBlock2\n\ - mov r12, r0\n\ - mov r1, r8\n\ - ldrb r1, [r1, 0xC]\n\ - str r1, [sp, 0x18]\n\ - movs r2, 0xAA\n\ - lsls r2, 1\n\ - add r2, r12\n\ - mov r10, r2\n\ - mov r9, r5\n\ -_08134AE6:\n\ - movs r6, 0\n\ - movs r3, 0\n\ - ldr r0, _08134B40 @ =gSaveBlock2 + 0x158\n\ - add r0, r9\n\ - ldrb r0, [r0]\n\ - ldr r1, [sp, 0x18]\n\ - cmp r0, r1\n\ - bne _08134B14\n\ - movs r0, 0xA4\n\ - muls r0, r5\n\ - ldr r1, _08134B40 @ =gSaveBlock2 + 0x158\n\ - adds r2, r0, r1\n\ - mov r4, r8\n\ - adds r4, 0xC\n\ -_08134B02:\n\ - adds r2, 0x1\n\ - adds r3, 0x1\n\ - cmp r3, 0x3\n\ - bgt _08134B14\n\ - adds r1, r4, r3\n\ - ldrb r0, [r2]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - beq _08134B02\n\ -_08134B14:\n\ - cmp r3, 0x4\n\ - bne _08134B54\n\ - movs r6, 0\n\ - mov r2, r10\n\ - ldrb r0, [r2]\n\ - mov r3, r8\n\ - ldrb r3, [r3, 0x8]\n\ - cmp r0, r3\n\ - bne _08134B54\n\ - adds r1, r0, 0\n\ - movs r0, 0xA4\n\ - muls r0, r5\n\ - adds r0, 0x4\n\ - ldr r3, _08134B44 @ =gSaveBlock2 + 0x150\n\ - adds r2, r0, r3\n\ -_08134B32:\n\ - cmp r1, 0xFF\n\ - bne _08134B48\n\ - movs r6, 0x7\n\ - b _08134B54\n\ - .align 2, 0\n\ -_08134B3C: .4byte gSaveBlock2\n\ -_08134B40: .4byte gSaveBlock2 + 0x158\n\ -_08134B44: .4byte gSaveBlock2 + 0x150\n\ -_08134B48:\n\ - adds r6, 0x1\n\ - cmp r6, 0x6\n\ - bgt _08134B54\n\ - ldrb r0, [r2]\n\ - cmp r0, r1\n\ - beq _08134B32\n\ -_08134B54:\n\ - cmp r6, 0x7\n\ - beq _08134B64\n\ - movs r0, 0xA4\n\ - add r10, r0\n\ - add r9, r0\n\ - adds r5, 0x1\n\ - cmp r5, 0x4\n\ - ble _08134AE6\n\ -\n\ -_08134B64:\n\ - cmp r5, 0x4\n\ - bgt _08134B76\n\ - movs r0, 0xA4\n\ - muls r0, r5\n\ - add r0, r12\n\ - movs r1, 0xA6\n\ - lsls r1, 1\n\ - adds r0, r1\n\ - b _08134B9E\n\ -_08134B76:\n\ - movs r5, 0\n\ - movs r1, 0xA7\n\ - lsls r1, 1\n\ - add r1, r12\n\ - b _08134B88\n\ -_08134B80:\n\ - adds r1, 0xA4\n\ - adds r5, 0x1\n\ - cmp r5, 0x4\n\ - bgt _08134BA8\n\ -_08134B88:\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - bne _08134B80\n\ - cmp r5, 0x4\n\ - bgt _08134BA8\n\ - movs r0, 0xA4\n\ - muls r0, r5\n\ - add r0, r12\n\ - movs r2, 0xA6\n\ - lsls r2, 1\n\ - adds r0, r2\n\ -_08134B9E:\n\ - mov r1, r8\n\ - movs r2, 0xA4\n\ - bl memcpy\n\ - b _08134C5E\n\ -\n\ -_08134BA8:\n\ - mov r2, sp\n\ - movs r3, 0xA7\n\ - lsls r3, 1\n\ - mov r1, r12\n\ - adds r0, r1, r3\n\ - ldrh r0, [r0]\n\ - movs r1, 0\n\ - strh r0, [r2]\n\ - add r0, sp, 0xC\n\ - strh r1, [r0]\n\ - adds r7, 0x1\n\ - movs r5, 0x1\n\ - add r2, sp, 0xC @var2 = r2\n\ - mov r9, r2\n\ - mov r10, r3\n\ -_08134BC6:\n\ - movs r3, 0\n\ - adds r0, r5, 0x1\n\ - mov r12, r0\n\ - cmp r3, r7\n\ - bge _08134C0A @ j < l\n\ - movs r1, 0xA4\n\ - adds r0, r5, 0\n\ - muls r0, r1\n\ - ldr r2, _08134BFC @ =gSaveBlock2\n\ - adds r0, r2\n\ - mov r1, r10\n\ - adds r4, r0, r1\n\ - mov r6, sp\n\ -_08134BE0:\n\ - lsls r0, r3, 1\n\ - add r0, sp\n\ - ldrh r2, [r4]\n\ - adds r1, r2, 0\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bcs _08134C00\n\ - movs r3, 0\n\ - movs r7, 0x1\n\ - strh r2, [r6]\n\ - mov r2, r9\n\ - strh r5, [r2]\n\ - b _08134C0A\n\ - .align 2, 0\n\ -_08134BFC: .4byte gSaveBlock2\n\ -_08134C00:\n\ - cmp r1, r0\n\ - bhi _08134C0A\n\ - adds r3, 0x1\n\ - cmp r3, r7\n\ - blt _08134BE0\n\ -_08134C0A:\n\ - cmp r3, r7\n\ - bne _08134C2A\n\ - lsls r1, r7, 1\n\ - mov r3, sp\n\ - adds r2, r3, r1\n\ - movs r3, 0xA4\n\ - adds r0, r5, 0\n\ - muls r0, r3\n\ - ldr r3, _08134C70 @ =gSaveBlock2\n\ - adds r0, r3\n\ - add r0, r10\n\ - ldrh r0, [r0]\n\ - strh r0, [r2]\n\ - add r1, r9\n\ - strh r5, [r1]\n\ - adds r7, 0x1\n\ -_08134C2A:\n\ - mov r5, r12\n\ - cmp r5, 0x4\n\ - ble _08134BC6\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - adds r1, r7, 0\n\ - bl __modsi3\n\ - adds r5, r0, 0\n\ - ldr r2, _08134C70 @ =gSaveBlock2\n\ - lsls r0, r5, 1\n\ - add r0, sp\n\ - adds r0, 0xC\n\ - ldrh r1, [r0]\n\ - movs r0, 0xA4\n\ - muls r0, r1\n\ - adds r0, r2\n\ - movs r1, 0xA6\n\ - lsls r1, 1\n\ - adds r0, r1\n\ - mov r1, r8\n\ - movs r2, 0xA4\n\ - bl memcpy\n\ -_08134C5E:\n\ - add sp, 0x1C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08134C70: .4byte gSaveBlock2\n\ - .syntax divided\n"); -} - -u8 get_trainer_class_pic_index(void) -{ - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; - else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - return gTrainerClassToPicIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; - else - return gTrainerClassToPicIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; -} - -u8 get_trainer_class_name_index(void) -{ - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; - else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - return gTrainerClassToNameIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; - else - return gTrainerClassToNameIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; -} - -void get_trainer_name(u8* dest) -{ - s32 i; - - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - for (i = 0; i < 7; i++) - dest[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - for (i = 0; i < 7; i++) - dest[i] = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].name[i]; - } - else - { - for (i = 0; i < 7; i++) - dest[i] = gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].name[i]; - } - - dest[i] = EOS; -} - -void FillBattleTowerTrainerParty(void) -{ - s32 partyIndex, i; - u16 chosenMonIndices[3]; - u8 friendship; - u8 level; - u8 fixedIV; - u8 battleMonsOffset; - u8 monPoolSize; - u8 teamFlags; - const struct BattleTowerPokemon *battleTowerMons; - - battleMonsOffset = 0; - monPoolSize = 60; - friendship = 255; - - ZeroEnemyPartyMons(); - - // Different trainers have access to different sets of pokemon to use in battle. - // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are - // stronger. Additionally, the later trainers' pokemon are granted higher IVs. - if (gSaveBlock2.battleTower.battleTowerTrainerId < 20) - { - fixedIV = 6; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 30) - { - fixedIV = 9; - battleMonsOffset = 30; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 40) - { - fixedIV = 12; - battleMonsOffset = 60; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 50) - { - fixedIV = 15; - battleMonsOffset = 90; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 60) - { - fixedIV = 18; - battleMonsOffset = 120; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 70) - { - fixedIV = 21; - battleMonsOffset = 150; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 80) - { - fixedIV = 31; - battleMonsOffset = 180; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - fixedIV = 31; - battleMonsOffset = 200; - monPoolSize = 100; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - // Load E-Reader trainer's party. - for (partyIndex = 0; partyIndex < 3; partyIndex++) - sub_803ADE8(&gEnemyParty[partyIndex], &gSaveBlock2.battleTower.ereaderTrainer.party[partyIndex]); - return; - } - else - { - // Load a battle tower record's party. (From record mixing) - for (partyIndex = 0; partyIndex < 3; partyIndex++) - { - sub_803ADE8( - &gEnemyParty[partyIndex], - &gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); - } - return; - } - - // Use the appropriate list of pokemon and level depending on the - // current challenge type. (level 50 or level 100 challenge) - if (gSaveBlock2.battleTower.battleTowerLevelType != 0) - { - battleTowerMons = gBattleTowerLevel100Mons; - level = 100; - } - else - { - battleTowerMons = gBattleTowerLevel50Mons; - level = 50; - } - - teamFlags = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].teamFlags; - - // Attempt to fill the trainer's party with random Pokemon until 3 have been - // successfully chosen. The trainer's party may not have duplicate pokemon species - // or duplicate held items. Each pokemon must have all of the trainer's team flags - // set, as well. If any of those conditions are not met, then the loop starts over - // and another pokemon is chosen at random. - partyIndex = 0; - while (partyIndex != 3) - { - // Pick a random pokemon index based on the number of pokemon available to choose from - // and the starting offset in the battle tower pokemon array. - s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset; - - // Ensure the chosen pokemon has compatible team flags with the trainer. - if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags) - { - // Ensure this pokemon species isn't a duplicate. - for (i = 0; i < partyIndex; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species) - break; - } - - if (i != partyIndex) - continue; - - // Ensure this pokemon's held item isn't a duplicate. - for (i = 0; i < partyIndex; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != 0 - && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) - break; - } - - if (i != partyIndex) - continue; - - // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary - // because the species and held items were already checked directly above. Perhaps this - // is leftover code before the logic for duplicate species and held items was added. - //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); - for (i = 0; i < partyIndex; i++) - { - if (chosenMonIndices[i] == battleMonIndex) - break; - } - - if (i != partyIndex) - continue; - - chosenMonIndices[partyIndex] = battleMonIndex; - - // Place the chosen pokemon into the trainer's party. - CreateMonWithEVSpread( - &gEnemyParty[partyIndex], - battleTowerMons[battleMonIndex].species, - level, - fixedIV, - battleTowerMons[battleMonIndex].evSpread); - - // Give the chosen pokemon its specified moves. - for (i = 0; i < 4; i++) - { - SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); - if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) - friendship = 0; // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. - } - - SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]); - - // The pokemon was successfully added to the trainer's party, so it's safe to move on to - // the next party slot. - partyIndex++; - } - } -} - -u32 CountBattleTowerBanlistCaught(void) -{ - s32 i; - u32 numCaught = 0; - - for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) - { - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleTowerBannedSpecies[i]), FLAG_GET_CAUGHT)) - numCaught++; - } - - return numCaught; -} - -u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numToAppend) -{ - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) - { - curIndexToAppend++; - switch (curIndexToAppend - 1) - { - case 0: - case 2: - case 4: - case 6: - case 8: - case 10: - if (numToAppend == curIndexToAppend) - StringAppend(gStringVar1, BattleText_Format3); - else if (numToAppend > curIndexToAppend) - StringAppend(gStringVar1, BattleText_Format4); - break; - case 1: - if (curIndexToAppend == numToAppend) - StringAppend(gStringVar1, BattleText_Format3); - else - StringAppend(gStringVar1, BattleText_Format4); - StringAppend(gStringVar1, BattleText_Format7); - break; - case 3: - case 5: - case 7: - case 9: - default: - if (curIndexToAppend == numToAppend) - StringAppend(gStringVar1, BattleText_Format3); - else - StringAppend(gStringVar1, BattleText_Format4); - StringAppend(gStringVar1, BattleText_Format6); - break; - } - StringAppend(gStringVar1, gSpeciesNames[species]); - } - - return curIndexToAppend; -} - -void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid) -{ - s32 i; - u32 counter = 0; - - if (species == SPECIES_EGG || species == SPECIES_NONE) - return; - - while (1) - { - if (gBattleTowerBannedSpecies[counter] == 0xFFFF) - break; - - if (gBattleTowerBannedSpecies[counter] == species) - break; - - counter++; - } - - if (gBattleTowerBannedSpecies[counter] != 0xFFFF) - return; - - if (battleTowerLevelType == 0 && monLevel > 50) - return; - - for (i = 0; i < *numValid && validPartySpecies[i] != species ; i++); - if (i != *numValid) - return; - - if (heldItem != 0) - { - for (i = 0; i < *numValid && validPartyHeldItems[i] != heldItem ; i++); - if (i != *numValid) - return; - } - - validPartySpecies[*numValid] = species; - validPartyHeldItems[*numValid] = heldItem; - *numValid = *numValid + 1; -} - -void CheckPartyBattleTowerBanlist(void) -{ - s32 i; - u16 species2; - u16 heldItem; - u8 level; - u16 hp; - u32 numBanlistCaught; - u16 validPartySpecies[6]; - u16 validPartyHeldItems[6]; - u8 counter; - - counter = 0; - - for (i = 0; i < PARTY_SIZE; i++) - { - species2 = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - - CheckMonBattleTowerBanlist(species2, heldItem, hp, gSpecialVar_Result, level, validPartySpecies, validPartyHeldItems, &counter); - } - - if (counter < 3) - { - gStringVar1[0] = 0xFF; - gSpecialVar_0x8004 = 1; - counter = 0; - - numBanlistCaught = CountBattleTowerBanlistCaught(); - - for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) - counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter, numBanlistCaught); - - if (counter == 0) - { - StringAppend(gStringVar1, BattleText_Format5); - StringAppend(gStringVar1, BattleText_Format8); - return; - } - - if (1 & counter) - StringAppend(gStringVar1, BattleText_Format6); - else - StringAppend(gStringVar1, BattleText_Format5); - - StringAppend(gStringVar1, BattleText_Format9); - } - else - { - gSpecialVar_0x8004 = 0; - gSaveBlock2.battleTower.battleTowerLevelType = gSpecialVar_Result; - } -} - -void PrintBattleTowerTrainerMessage(u16 *easyChat) -{ - sub_80EB544(gStringVar4, easyChat, 2, 3); -} - -void PrintBattleTowerTrainerGreeting(void) -{ - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting); - else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting); - else - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting); -} - -void sub_81354CC(void) -{ - s32 i; - u16 heldItem; - - switch (gSpecialVar_0x8004) - { - case 0: - break; - case 1: - for (i = 0; i < PARTY_SIZE; i++) - { - heldItem = GetMonData(&gSaveBlock1.playerParty[i], MON_DATA_HELD_ITEM); - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); - } - break; - case 2: - PrintEReaderTrainerFarewellMessage(); - break; - } - - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void sub_8135534(u8 taskId) -{ - if (IsBattleTransitionDone() == TRUE) - { - gMain.savedCallback = sub_81354CC; - SetMainCallback2(sub_800E7C4); - DestroyTask(taskId); - } -} - -void StartSpecialBattle(void) -{ - s32 i; - u16 heldItem; - u8 transition; - - switch (gSpecialVar_0x8004) - { - case 0: // battle tower battle - gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER); - gTrainerBattleOpponent = 0; - - FillBattleTowerTrainerParty(); - - CreateTask(sub_8135534, 1); - current_map_music_set__default_for_battle(0); - transition = BattleSetup_GetBattleTowerBattleTransition(); - BattleTransition_StartOnField(transition); - break; - case 1: // secret base battle - for (i = 0; i < PARTY_SIZE; i++) - { - heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - SetMonData(&gSaveBlock1.playerParty[i], MON_DATA_HELD_ITEM, &heldItem); - } - - CreateTask(sub_8135534, 1); - current_map_music_set__default_for_battle(0); - transition = BattleSetup_GetBattleTowerBattleTransition(); - BattleTransition_StartOnField(transition); - break; - case 2: // e-reader trainer battle - ZeroEnemyPartyMons(); - - for (i = 0; i < 3; i++) - sub_803ADE8(&gEnemyParty[i], &gSaveBlock2.battleTower.ereaderTrainer.party[i]); - - gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER); - gTrainerBattleOpponent = 0; - - CreateTask(sub_8135534, 1); - current_map_music_set__default_for_battle(0); - transition = BattleSetup_GetBattleTowerBattleTransition(); - BattleTransition_StartOnField(transition); - break; - } -} - -void SetBattleTowerProperty(void) -{ - s32 i; - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - switch (gSpecialVar_0x8004) - { - case 0: - ewram160FB = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType]; - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8005; - break; - case 1: - gSaveBlock2.battleTower.battleTowerLevelType = gSpecialVar_0x8005; - break; - case 2: - gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] = gSpecialVar_0x8005; - break; - case 3: - gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] = gSpecialVar_0x8005; - break; - case 4: - gSaveBlock2.battleTower.battleTowerTrainerId = gSpecialVar_0x8005; - break; - case 5: - for (i = 0; i < 3; i++) - gSaveBlock2.battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i]; - break; - case 6: - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - ClearEReaderTrainer(&gSaveBlock2.battleTower.ereaderTrainer); - if (gSaveBlock2.battleTower.totalBattleTowerWins < 9999) - gSaveBlock2.battleTower.totalBattleTowerWins++; - gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]++; - SaveCurrentWinStreak(); - gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; - gStringVar1[0] = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1; - gStringVar1[1] = 0xFF; - break; - case 7: - if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] < 1430) - gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]++; - SaveCurrentWinStreak(); - gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; - break; - case 8: - gSaveBlock2.battleTower.unk_554 = gSpecialVar_0x8005; - break; - case 9: - break; - case 10: - SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2.battleTower.bestBattleTowerWinStreak); - break; - case 11: - if (gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] != 3) - ResetBattleTowerStreak(battleTowerLevelType); - break; - case 12: - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; - break; - case 13: - gSaveBlock2.battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - break; - case 14: - gSaveBlock2.battleTower.lastStreakLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - break; - } -} - -void BattleTowerUtil(void) -{ - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - switch (gSpecialVar_0x8004) - { - case 0: - gSpecialVar_Result = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType]; - break; - case 1: - gSpecialVar_Result = gSaveBlock2.battleTower.battleTowerLevelType; - break; - case 2: - gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; - break; - case 3: - gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; - break; - case 4: - gSpecialVar_Result = gSaveBlock2.battleTower.battleTowerTrainerId; - break; - case 5: - case 6: - case 7: - break; - case 8: - gSpecialVar_Result = gSaveBlock2.battleTower.unk_554; - break; - case 9: - gSpecialVar_Result = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - break; - case 10: - SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2.battleTower.bestBattleTowerWinStreak); - break; - case 11: - ResetBattleTowerStreak(battleTowerLevelType); - break; - case 12: - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; - break; - case 13: - gSaveBlock2.battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - break; - case 14: - gSaveBlock2.battleTower.lastStreakLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - break; - } -} - -void SetBattleTowerParty(void) -{ - s32 i; - - for (i = 0; i < 3; i++) - gSelectedOrderFromParty[i] = gSaveBlock2.battleTower.selectedPartyMons[i]; - - ReducePlayerPartyToThree(); -} - -static void SaveCurrentWinStreak(void) -{ - u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; - u16 streak = GetCurrentBattleTowerWinStreak(levelType); - - if (gSaveBlock2.battleTower.recordWinStreaks[levelType] < streak) - gSaveBlock2.battleTower.recordWinStreaks[levelType] = streak; - - if (gSaveBlock2.battleTower.recordWinStreaks[0] > gSaveBlock2.battleTower.recordWinStreaks[1]) - { - streak = gSaveBlock2.battleTower.recordWinStreaks[0]; - SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); - - if (streak > 9999) - gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; - else - gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; - } - else - { - streak = gSaveBlock2.battleTower.recordWinStreaks[1]; - SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); - - if (streak > 9999) - gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; - else - gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; - } -} - -void sub_8135AC4(void) -{ - s32 i; - u8 trainerClass; - struct BattleTowerRecord *playerRecord = &gSaveBlock2.battleTower.playerRecord; - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (gSaveBlock2.playerGender != MALE) - { - trainerClass = sFemaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] - + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 20u]; - } - else - { - trainerClass = sMaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] - + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 30u]; - } - - playerRecord->battleTowerLevelType = battleTowerLevelType; - playerRecord->trainerClass = trainerClass; - - copy_word_to_mem(playerRecord->trainerId, gSaveBlock2.playerTrainerId); - StringCopy8(playerRecord->name, gSaveBlock2.playerName); - - playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - - for (i = 0; i < 6; i++) - playerRecord->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; - - for (i = 0; i < 3; i++) - sub_803AF78(&gUnknown_030042FC[gSaveBlock2.battleTower.selectedPartyMons[i]], &playerRecord->party[i]); - - SetBattleTowerRecordChecksum(&gSaveBlock2.battleTower.playerRecord); - SaveCurrentWinStreak(); -} - -void SaveBattleTowerProgress(void) -{ - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0) - { - if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] > 1 - || gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] > 1) - sub_8135AC4(); - } - - sub_8135CFC(); - - gSaveBlock2.battleTower.battleOutcome = gBattleOutcome; - - if (gSpecialVar_0x8004 != 3) - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004; - - VarSet(VAR_TEMP_0, 0); - gSaveBlock2.battleTower.unk_554 = 1; - Save_WriteData(SAVE_EREADER); -} - -void BattleTower_SoftReset(void) -{ - DoSoftReset(); -} - -void ValidateBattleTowerRecordChecksums(void) -{ - u32 i; - s32 recordIndex; - struct BattleTowerRecord *record; - u32 checksum; - - checksum = 0; - for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) - checksum += ((u32 *)&gSaveBlock2.battleTower.playerRecord)[i]; - - if (gSaveBlock2.battleTower.playerRecord.checksum != checksum) - ClearBattleTowerRecord(&gSaveBlock2.battleTower.playerRecord); - - for (recordIndex = 0; recordIndex < 5; recordIndex++) - { - record = &gSaveBlock2.battleTower.records[recordIndex]; - checksum = 0; - for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) - checksum += ((u32 *)record)[i]; - - if (gSaveBlock2.battleTower.records[recordIndex].checksum != checksum) - ClearBattleTowerRecord(&gSaveBlock2.battleTower.records[recordIndex]); - } -} - -void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record) -{ - u32 i; - - record->checksum = 0; - for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) - record->checksum += ((u32 *)record)[i]; -} - -void ClearBattleTowerRecord(struct BattleTowerRecord *record) -{ - u32 i; - - for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32); i++) - ((u32 *)record)[i] = 0; -} - -void sub_8135CFC(void) -{ - s32 i; - - get_trainer_name(gSaveBlock2.battleTower.defeatedByTrainerName); - gSaveBlock2.battleTower.defeatedBySpecies = gBattleMons[1].species; - gSaveBlock2.battleTower.firstMonSpecies = gBattleMons[0].species; - - for (i = 0; i < POKEMON_NAME_LENGTH; i++) - gSaveBlock2.battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i]; -} - -u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) -{ - u16 winStreak = ((gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] - 1) * 7 - 1) - + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; - - if (winStreak > 9999) - return 9999; - else - return winStreak; -} - -void DetermineBattleTowerPrize(void) -{ - u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1 > 5) - gSaveBlock2.battleTower.prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)]; - else - gSaveBlock2.battleTower.prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)]; -} - -void GiveBattleTowerPrize(void) -{ - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (AddBagItem(gSaveBlock2.battleTower.prizeItem, 1) == TRUE) - { - CopyItemName(gSaveBlock2.battleTower.prizeItem, gStringVar1); - gSpecialVar_Result = 1; - } - else - { - gSpecialVar_Result = 0; - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = 6; - } -} - -void AwardBattleTowerRibbons(void) -{ - s32 i; - u32 partyIndex; - struct Pokemon *pokemon; - u8 ribbonType; - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (battleTowerLevelType != 0) - ribbonType = MON_DATA_VICTORY_RIBBON; - else - ribbonType = MON_DATA_WINNING_RIBBON; - - gSpecialVar_Result = 0; - - if (GetCurrentBattleTowerWinStreak(battleTowerLevelType) > 55) - { - for (i = 0; i < 3; i++) - { - partyIndex = gSaveBlock2.battleTower.selectedPartyMons[i] - 1; - pokemon = &gPlayerParty[partyIndex]; - if (!GetMonData(pokemon, ribbonType)) - { - gSpecialVar_Result = 1; - SetMonData(pokemon, ribbonType, &gSpecialVar_Result); - } - } - } - - if (gSpecialVar_Result != 0) - IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); -} - -// This is a leftover debugging function that is used to populate the E-Reader -// trainer with the player's current data. -void Debug_FillEReaderTrainerWithPlayerData(void) -{ - struct BattleTowerEReaderTrainer *ereaderTrainer; - s32 i; - s32 j; - - ereaderTrainer = &gSaveBlock2.battleTower.ereaderTrainer; - - if (gSaveBlock2.playerGender != MALE) - { - ereaderTrainer->trainerClass = sFemaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] - + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 20u]; - } - else - { - ereaderTrainer->trainerClass = sMaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] - + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 30u]; - } - - copy_word_to_mem(ereaderTrainer->trainerId, gSaveBlock2.playerTrainerId); - StringCopy8(ereaderTrainer->name, gSaveBlock2.playerName); - - ereaderTrainer->winStreak = 1; - - j = 7; - for (i = 0; i < 6; i++) - { - ereaderTrainer->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; - ereaderTrainer->farewellPlayerLost[i] = j; - ereaderTrainer->farewellPlayerWon[i] = j + 6; - j++; - } - - for (i = 0; i < 3; i++) - sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]); - - SetEReaderTrainerChecksum(ereaderTrainer); -} - -u8 GetEReaderTrainerPicIndex(void) -{ - return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; -} - -u8 GetEReaderTrainerClassNameIndex(void) -{ - return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; -} - -void SetEReaderTrainerName(u8 *trainerName) -{ - s32 i; - - for (i = 0; i < 7; i++) - trainerName[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; - - trainerName[i] = 0xFF; -} - -// Checks if the saved E-Reader trainer is valid. -void ValidateEReaderTrainer(void) -{ - u32 i; - u32 checksum; - struct BattleTowerEReaderTrainer *ereaderTrainer; - - gSpecialVar_Result = 0; - ereaderTrainer = &gSaveBlock2.battleTower.ereaderTrainer; - - checksum = 0; - for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) - checksum |= ((u32 *)ereaderTrainer)[i]; - - if (checksum == 0) - { - gSpecialVar_Result = 1; - return; - } - - checksum = 0; - for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) - checksum += ((u32 *)ereaderTrainer)[i]; - - if (gSaveBlock2.battleTower.ereaderTrainer.checksum != checksum) - { - ClearEReaderTrainer(&gSaveBlock2.battleTower.ereaderTrainer); - gSpecialVar_Result = 1; - } -} - -void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer) -{ - s32 i; - - ereaderTrainer->checksum = 0; - for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) - ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i]; -} - -void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer) -{ - u32 i; - - for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32); i++) - ((u32 *)ereaderTrainer)[i] = 0; -} - -void PrintEReaderTrainerGreeting(void) -{ - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting); -} - -void PrintEReaderTrainerFarewellMessage(void) -{ - if (gBattleOutcome == BATTLE_DREW) - gStringVar4[0] = EOS; - else if (gBattleOutcome == BATTLE_WON) - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerWon); - else - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerLost); -} - -void TryEnableBravoTrainerBattleTower(void) -{ - s32 i; - - for (i = 0; i < 2; i++) - { - if (gSaveBlock2.battleTower.var_4AE[i] == 1) - sub_80BFD20(); - } -} - -#if GERMAN -u8 de_sub_81364AC(void) -{ - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; - else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - return gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; - else - return gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass; -} - -u8 de_sub_81364F8(void) -{ - return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; -} -#endif diff --git a/src/field/berry.c b/src/field/berry.c deleted file mode 100644 index 9313c458b..000000000 --- a/src/field/berry.c +++ /dev/null @@ -1,1565 +0,0 @@ -#include "global.h" -#include "berry.h" -#include "field_control_avatar.h" -#include "event_object_movement.h" -#include "fieldmap.h" -#include "item.h" -#include "item_menu.h" -#include "item_use.h" -#include "constants/items.h" -#include "main.h" -#include "menu.h" -#include "random.h" -#include "task.h" -#include "text.h" - -#define BERRY_NAME_LENGTH 6 -#define BERRY_REGROW_LIMIT 10 -#define MAX_BERRY_TREES 128 - -#define BERRY_NONE 0 -#define FIRST_BERRY ITEM_CHERI_BERRY -#define LAST_BERRY ITEM_ENIGMA_BERRY - -#define GETBERRYID(berry) ((berry - FIRST_BERRY) + 1) -#define GETITEMID(berry) ((berry + FIRST_BERRY) - 1) - -#ifdef ENGLISH -#define NAME_CHERI_BERRY _("CHERI") -#define NAME_CHESTO_BERRY _("CHESTO") -#define NAME_PECHA_BERRY _("PECHA") -#define NAME_RAWST_BERRY _("RAWST") -#define NAME_ASPEAR_BERRY _("ASPEAR") -#define NAME_LEPPA_BERRY _("LEPPA") -#define NAME_ORAN_BERRY _("ORAN") -#define NAME_PERSIM_BERRY _("PERSIM") -#define NAME_LUM_BERRY _("LUM") -#define NAME_SITRUS_BERRY _("SITRUS") -#define NAME_FIGY_BERRY _("FIGY") -#define NAME_WIKI_BERRY _("WIKI") -#define NAME_MAGO_BERRY _("MAGO") -#define NAME_AGUAV_BERRY _("AGUAV") -#define NAME_IAPAPA_BERRY _("IAPAPA") -#define NAME_RAZZ_BERRY _("RAZZ") -#define NAME_BLUK_BERRY _("BLUK") -#define NAME_NANAB_BERRY _("NANAB") -#define NAME_WEPEAR_BERRY _("WEPEAR") -#define NAME_PINAP_BERRY _("PINAP") -#define NAME_POMEG_BERRY _("POMEG") -#define NAME_KELPSY_BERRY _("KELPSY") -#define NAME_QUALOT_BERRY _("QUALOT") -#define NAME_HONDEW_BERRY _("HONDEW") -#define NAME_GREPA_BERRY _("GREPA") -#define NAME_TAMATO_BERRY _("TAMATO") -#define NAME_CORNN_BERRY _("CORNN") -#define NAME_MAGOST_BERRY _("MAGOST") -#define NAME_RABUTA_BERRY _("RABUTA") -#define NAME_NOMEL_BERRY _("NOMEL") -#define NAME_SPELON_BERRY _("SPELON") -#define NAME_PAMTRE_BERRY _("PAMTRE") -#define NAME_WATMEL_BERRY _("WATMEL") -#define NAME_DURIN_BERRY _("DURIN") -#define NAME_BELUE_BERRY _("BELUE") -#define NAME_LIECHI_BERRY _("LIECHI") -#define NAME_GANLON_BERRY _("GANLON") -#define NAME_SALAC_BERRY _("SALAC") -#define NAME_PETAYA_BERRY _("PETAYA") -#define NAME_APICOT_BERRY _("APICOT") -#define NAME_LANSAT_BERRY _("LANSAT") -#define NAME_STARF_BERRY _("STARF") -#define NAME_ENIGMA_BERRY _("ENIGMA") - -static const u8 gBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); -static const u8 gBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy."); -static const u8 gBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are"); -static const u8 gBerryDescriptionPart2_Chesto[] = _("very tough. It is dry-tasting all over."); -static const u8 gBerryDescriptionPart1_Pecha[] = _("Very sweet and delicious."); -static const u8 gBerryDescriptionPart2_Pecha[] = _("Also very tender - handle with care."); -static const u8 gBerryDescriptionPart1_Rawst[] = _("If the leaves grow long and curly,"); -static const u8 gBerryDescriptionPart2_Rawst[] = _("the BERRY seems to grow very bitter."); -static const u8 gBerryDescriptionPart1_Aspear[] = _("The hard BERRY is dense with a rich"); -static const u8 gBerryDescriptionPart2_Aspear[] = _("juice. It is quite sour."); -static const u8 gBerryDescriptionPart1_Leppa[] = _("Grows slower than CHERI and others."); -static const u8 gBerryDescriptionPart2_Leppa[] = _("The smaller the BERRY, the tastier."); -static const u8 gBerryDescriptionPart1_Oran[] = _("A peculiar BERRY with a mix of flavors."); -static const u8 gBerryDescriptionPart2_Oran[] = _("BERRIES grow in half a day."); -static const u8 gBerryDescriptionPart1_Persim[] = _("Loves sunlight. The BERRY’s color"); -static const u8 gBerryDescriptionPart2_Persim[] = _("grows vivid when exposed to the sun."); -static const u8 gBerryDescriptionPart1_Lum[] = _("Slow to grow. If raised with loving"); -static const u8 gBerryDescriptionPart2_Lum[] = _("care, it may grow two BERRIES."); -static const u8 gBerryDescriptionPart1_Sitrus[] = _("Closely related to ORAN. The large"); -static const u8 gBerryDescriptionPart2_Sitrus[] = _("BERRY has a well-rounded flavor."); -static const u8 gBerryDescriptionPart1_Figy[] = _("The BERRY, which looks chewed up,"); -static const u8 gBerryDescriptionPart2_Figy[] = _("brims with spicy substances."); -static const u8 gBerryDescriptionPart1_Wiki[] = _("The BERRY is said to have grown lumpy"); -static const u8 gBerryDescriptionPart2_Wiki[] = _("to help POKéMON grip it."); -static const u8 gBerryDescriptionPart1_Mago[] = _("The BERRY turns curvy as it grows."); -static const u8 gBerryDescriptionPart2_Mago[] = _("The curvier, the sweeter and tastier."); -static const u8 gBerryDescriptionPart1_Aguav[] = _("The flower is dainty. It is rare in its"); -static const u8 gBerryDescriptionPart2_Aguav[] = _("ability to grow without light."); -static const u8 gBerryDescriptionPart1_Iapapa[] = _("The BERRY is very big and sour."); -static const u8 gBerryDescriptionPart2_Iapapa[] = _("It takes at least a day to grow."); -static const u8 gBerryDescriptionPart1_Razz[] = _("The red BERRY tastes slightly spicy."); -static const u8 gBerryDescriptionPart2_Razz[] = _("It grows quickly in just four hours."); -static const u8 gBerryDescriptionPart1_Bluk[] = _("The BERRY is blue on the outside, but"); -static const u8 gBerryDescriptionPart2_Bluk[] = _("it blackens the mouth when eaten."); -static const u8 gBerryDescriptionPart1_Nanab[] = _("This BERRY was the seventh"); -static const u8 gBerryDescriptionPart2_Nanab[] = _("discovered in the world. It is sweet."); -static const u8 gBerryDescriptionPart1_Wepear[] = _("The flower is small and white. It has a"); -static const u8 gBerryDescriptionPart2_Wepear[] = _("delicate balance of bitter and sour."); -static const u8 gBerryDescriptionPart1_Pinap[] = _("Weak against wind and cold."); -static const u8 gBerryDescriptionPart2_Pinap[] = _("The fruit is spicy and the skin, sour."); -static const u8 gBerryDescriptionPart1_Pomeg[] = _("However much it is watered,"); -static const u8 gBerryDescriptionPart2_Pomeg[] = _("it only grows up to six BERRIES."); -static const u8 gBerryDescriptionPart1_Kelpsy[] = _("A rare variety shaped like a root."); -static const u8 gBerryDescriptionPart2_Kelpsy[] = _("Grows a very large flower."); -static const u8 gBerryDescriptionPart1_Qualot[] = _("Loves water. Grows strong even in"); -static const u8 gBerryDescriptionPart2_Qualot[] = _("locations with constant rainfall."); -static const u8 gBerryDescriptionPart1_Hondew[] = _("A BERRY that is very valuable and"); -static const u8 gBerryDescriptionPart2_Hondew[] = _("rarely seen. It is very delicious."); -static const u8 gBerryDescriptionPart1_Grepa[] = _("Despite its tenderness and round"); -static const u8 gBerryDescriptionPart2_Grepa[] = _("shape, the BERRY is unimaginably sour."); -static const u8 gBerryDescriptionPart1_Tamato[] = _("The BERRY is lip-bendingly spicy."); -static const u8 gBerryDescriptionPart2_Tamato[] = _("It takes time to grow."); -static const u8 gBerryDescriptionPart1_Cornn[] = _("A BERRY from an ancient era. May not"); -static const u8 gBerryDescriptionPart2_Cornn[] = _("grow unless planted in quantity."); -static const u8 gBerryDescriptionPart1_Magost[] = _("A BERRY that is widely said to have"); -static const u8 gBerryDescriptionPart2_Magost[] = _("a finely balanced flavor."); -static const u8 gBerryDescriptionPart1_Rabuta[] = _("A rare variety that is overgrown with"); -static const u8 gBerryDescriptionPart2_Rabuta[] = _("hair. It is quite bitter."); -static const u8 gBerryDescriptionPart1_Nomel[] = _("Quite sour. Just one bite makes it"); -static const u8 gBerryDescriptionPart2_Nomel[] = _("impossible to taste for three days."); -static const u8 gBerryDescriptionPart1_Spelon[] = _("The vividly red BERRY is very spicy."); -static const u8 gBerryDescriptionPart2_Spelon[] = _("Its warts secrete a spicy substance."); -static const u8 gBerryDescriptionPart1_Pamtre[] = _("Drifts on the sea from somewhere."); -static const u8 gBerryDescriptionPart2_Pamtre[] = _("It is thought to grow elsewhere."); -static const u8 gBerryDescriptionPart1_Watmel[] = _("A huge BERRY, with some over 20"); -static const u8 gBerryDescriptionPart2_Watmel[] = _("inches discovered. Exceedingly sweet."); -static const u8 gBerryDescriptionPart1_Durin[] = _("Bitter to even look at. It is so"); -static const u8 gBerryDescriptionPart2_Durin[] = _("bitter, no one has ever eaten it as is."); -static const u8 gBerryDescriptionPart1_Belue[] = _("It is glossy and looks delicious, but"); -static const u8 gBerryDescriptionPart2_Belue[] = _("it is awfully sour. Takes time to grow."); -static const u8 gBerryDescriptionPart1_Liechi[] = _("A mysterious BERRY. It is rumored to"); -static const u8 gBerryDescriptionPart2_Liechi[] = _("contain the power of the sea."); -static const u8 gBerryDescriptionPart1_Ganlon[] = _("A mysterious BERRY. It is rumored to"); -static const u8 gBerryDescriptionPart2_Ganlon[] = _("contain the power of the land."); -static const u8 gBerryDescriptionPart1_Salac[] = _("A mysterious BERRY. It is rumored to"); -static const u8 gBerryDescriptionPart2_Salac[] = _("contain the power of the sky."); -static const u8 gBerryDescriptionPart1_Petaya[] = _("A mysterious BERRY. It is rumored to"); -static const u8 gBerryDescriptionPart2_Petaya[] = _("contain the power of all living things."); -static const u8 gBerryDescriptionPart1_Apicot[] = _("A very mystifying BERRY. No telling"); -static const u8 gBerryDescriptionPart2_Apicot[] = _("what may happen or how it can be used."); -static const u8 gBerryDescriptionPart1_Lansat[] = _("Said to be a legendary BERRY."); -static const u8 gBerryDescriptionPart2_Lansat[] = _("Holding it supposedly brings joy."); -static const u8 gBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the"); -static const u8 gBerryDescriptionPart2_Starf[] = _("world’s edge. Considered a mirage."); -static const u8 gBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY."); -static const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars."); -#elif defined(GERMAN) -#define NAME_CHERI_BERRY _("AMRENA") -#define NAME_CHESTO_BERRY _("MARON") -#define NAME_PECHA_BERRY _("PIRSIF") -#define NAME_RAWST_BERRY _("FRAGIA") -#define NAME_ASPEAR_BERRY _("WILBIR") -#define NAME_LEPPA_BERRY _("JONAGO") -#define NAME_ORAN_BERRY _("SINEL") -#define NAME_PERSIM_BERRY _("PERSIM") -#define NAME_LUM_BERRY _("PRUNUS") -#define NAME_SITRUS_BERRY _("TSITRU") -#define NAME_FIGY_BERRY _("GIEFE") -#define NAME_WIKI_BERRY _("WIKI") -#define NAME_MAGO_BERRY _("MAGO") -#define NAME_AGUAV_BERRY _("GAUVE") -#define NAME_IAPAPA_BERRY _("YAPA") -#define NAME_RAZZ_BERRY _("HIMMIH") -#define NAME_BLUK_BERRY _("MORB") -#define NAME_NANAB_BERRY _("NANAB") -#define NAME_WEPEAR_BERRY _("NIRBE") -#define NAME_PINAP_BERRY _("SANANA") -#define NAME_POMEG_BERRY _("GRANA") -#define NAME_KELPSY_BERRY _("SETANG") -#define NAME_QUALOT_BERRY _("QUALOT") -#define NAME_HONDEW_BERRY _("HONMEL") -#define NAME_GREPA_BERRY _("LABRUS") -#define NAME_TAMATO_BERRY _("TAMOT") -#define NAME_CORNN_BERRY _("SAIM") -#define NAME_MAGOST_BERRY _("MAGOST") -#define NAME_RABUTA_BERRY _("RABUTA") -#define NAME_NOMEL_BERRY _("TRONZI") -#define NAME_SPELON_BERRY _("KIWAN") -#define NAME_PAMTRE_BERRY _("PALLM") -#define NAME_WATMEL_BERRY _("WASMEL") -#define NAME_DURIN_BERRY _("DURIN") -#define NAME_BELUE_BERRY _("MYRTIL") -#define NAME_LIECHI_BERRY _("LYDZI") -#define NAME_GANLON_BERRY _("LINGAN") -#define NAME_SALAC_BERRY _("SALKA") -#define NAME_PETAYA_BERRY _("TAHAY") -#define NAME_APICOT_BERRY _("APIKO") -#define NAME_LANSAT_BERRY _("LANSAT") -#define NAME_STARF_BERRY _("KRAMBO") -#define NAME_ENIGMA_BERRY _("ENIGMA") - -static const u8 gBerryDescriptionPart1_Cheri[] = _("Erblüht mit hübschen, zarten Blumen."); -static const u8 gBerryDescriptionPart2_Cheri[] = _("Diese knallrote BEERE ist sehr scharf."); -static const u8 gBerryDescriptionPart1_Chesto[] = _("Diese BEERE hat eine dicke Haut und"); -static const u8 gBerryDescriptionPart2_Chesto[] = _("hartes Fruchtfleisch. Trocken!"); -static const u8 gBerryDescriptionPart1_Pecha[] = _("Sehr süß und delikat."); -static const u8 gBerryDescriptionPart2_Pecha[] = _("Sehr zart. Vorsichtig anfassen!"); -static const u8 gBerryDescriptionPart1_Rawst[] = _("Wenn die Blätter lang und wellig sind,"); -static const u8 gBerryDescriptionPart2_Rawst[] = _("wird die BEERE sehr bitter."); -static const u8 gBerryDescriptionPart1_Aspear[] = _("Diese harte BEERE ist sehr"); -static const u8 gBerryDescriptionPart2_Aspear[] = _("saftig und sauer im Geschmack!"); -static const u8 gBerryDescriptionPart1_Leppa[] = _("Wächst langsamer als AMRENA und"); -static const u8 gBerryDescriptionPart2_Leppa[] = _("andere. Je kleiner, desto delikater."); -static const u8 gBerryDescriptionPart1_Oran[] = _("Eine BEERE unterschiedlichsten Ge-"); -static const u8 gBerryDescriptionPart2_Oran[] = _("schmacks. Wächst an einem halben Tag."); -static const u8 gBerryDescriptionPart1_Persim[] = _("Liebt Sonnenlicht. Die BEERE"); -static const u8 gBerryDescriptionPart2_Persim[] = _("wächst im Sonnenlicht sehr schnell."); -static const u8 gBerryDescriptionPart1_Lum[] = _("Langsamer Wuchs. Wird sie liebevoll ge-"); -static const u8 gBerryDescriptionPart2_Lum[] = _("pflegt, kann sie 2 BEEREN tragen."); -static const u8 gBerryDescriptionPart1_Sitrus[] = _("Eng verwandt mit SINEL. Diese große"); -static const u8 gBerryDescriptionPart2_Sitrus[] = _("BEERE ist von rundem Geschmack."); -static const u8 gBerryDescriptionPart1_Figy[] = _("Die BEERE sieht angekaut aus. Sie ist"); -static const u8 gBerryDescriptionPart2_Figy[] = _("voller scharfer Substanzen."); -static const u8 gBerryDescriptionPart1_Wiki[] = _("Die BEERE wächst unförmig,"); -static const u8 gBerryDescriptionPart2_Wiki[] = _("damit PKMN sie besser greifen können."); -static const u8 gBerryDescriptionPart1_Mago[] = _("Die BEERE hat Ausbeulungen. Je mehr"); -static const u8 gBerryDescriptionPart2_Mago[] = _("Beulen, desto schmackhafter ist sie."); -static const u8 gBerryDescriptionPart1_Aguav[] = _("Die Blume ist zart. Sie ist fähig,"); -static const u8 gBerryDescriptionPart2_Aguav[] = _("ohne Licht wachsen zu können."); -static const u8 gBerryDescriptionPart1_Iapapa[] = _("Die BEERE ist groß und sauer."); -static const u8 gBerryDescriptionPart2_Iapapa[] = _("Sie braucht einen Tag zum Wachsen."); -static const u8 gBerryDescriptionPart1_Razz[] = _("Diese rote BEERE schmeckt etwas"); -static const u8 gBerryDescriptionPart2_Razz[] = _("scharf. Sie wächst in nur 4 Stunden."); -static const u8 gBerryDescriptionPart1_Bluk[] = _("Die BEERE ist außen blau, verfärbt"); -static const u8 gBerryDescriptionPart2_Bluk[] = _("sich im Mund aber schwarz."); -static const u8 gBerryDescriptionPart1_Nanab[] = _("Diese BEERE war die 7., die auf der"); -static const u8 gBerryDescriptionPart2_Nanab[] = _("Welt entdeckt wurde. Sie ist süß."); -static const u8 gBerryDescriptionPart1_Wepear[] = _("Die Blume ist klein und weiß. Angenehm"); -static const u8 gBerryDescriptionPart2_Wepear[] = _("bitter und sauer zugleich."); -static const u8 gBerryDescriptionPart1_Pinap[] = _("Wind und Kälte verträgt sie nicht."); -static const u8 gBerryDescriptionPart2_Pinap[] = _("Fruchtfleisch: Scharf. Haut: Sauer."); -static const u8 gBerryDescriptionPart1_Pomeg[] = _("Egal wie viel Wasser sie bekommt, sie"); -static const u8 gBerryDescriptionPart2_Pomeg[] = _("trägt immer bis zu 6 BEEREN."); -static const u8 gBerryDescriptionPart1_Kelpsy[] = _("Eine Seltenheit. Geformt wie eine"); -static const u8 gBerryDescriptionPart2_Kelpsy[] = _("Wurzel. Hat eine große Blume."); -static const u8 gBerryDescriptionPart1_Qualot[] = _("Liebt das Wasser. Wächst besonders"); -static const u8 gBerryDescriptionPart2_Qualot[] = _("gut in regenreichen Gegenden."); -static const u8 gBerryDescriptionPart1_Hondew[] = _("Eine wertvolle und seltene BEERE."); -static const u8 gBerryDescriptionPart2_Hondew[] = _("Sie ist sehr schmackhaft."); -static const u8 gBerryDescriptionPart1_Grepa[] = _("Die BEERE ist zart und von runder"); -static const u8 gBerryDescriptionPart2_Grepa[] = _("Form. Aber sie ist unglaublich sauer!"); -static const u8 gBerryDescriptionPart1_Tamato[] = _("Die Schärfe der BEERE verbrennt die"); -static const u8 gBerryDescriptionPart2_Tamato[] = _("Lippen. Sie braucht Zeit zum Wachsen."); -static const u8 gBerryDescriptionPart1_Cornn[] = _("Eine BEERE aus alten Zeiten. Wächst"); -static const u8 gBerryDescriptionPart2_Cornn[] = _("nur, wenn in großen Mengen gepflanzt."); -static const u8 gBerryDescriptionPart1_Magost[] = _("Eine BEERE, die für ihren feinen, aus-"); -static const u8 gBerryDescriptionPart2_Magost[] = _("gewogenen Geschmack bekannt ist."); -static const u8 gBerryDescriptionPart1_Rabuta[] = _("Eine Seltenheit, die über und über mit"); -static const u8 gBerryDescriptionPart2_Rabuta[] = _("Haaren bewachsen ist. Sehr bitter!"); -static const u8 gBerryDescriptionPart1_Nomel[] = _("Sehr sauer. Ein Biss betäubt die"); -static const u8 gBerryDescriptionPart2_Nomel[] = _("Geschmacksnerven für 3 Tage!"); -static const u8 gBerryDescriptionPart1_Spelon[] = _("Die leuchtend rote BEERE ist sehr"); -static const u8 gBerryDescriptionPart2_Spelon[] = _("scharf. Gibt scharfe Substanzen ab!"); -static const u8 gBerryDescriptionPart1_Pamtre[] = _("Wird vom Meer angespült. Sie wächst"); -static const u8 gBerryDescriptionPart2_Pamtre[] = _("an einem anderen Ort."); -static const u8 gBerryDescriptionPart1_Watmel[] = _("Eine große BEERE, 25 cm groß."); -static const u8 gBerryDescriptionPart2_Watmel[] = _("Außergewöhnlich süß."); -static const u8 gBerryDescriptionPart1_Durin[] = _("Bitter schon ihr Anblick! Sie ist so"); -static const u8 gBerryDescriptionPart2_Durin[] = _("bitter, dass niemand sie pur isst."); -static const u8 gBerryDescriptionPart1_Belue[] = _("Sie glänzt, sieht zart aus, ist extrem"); -static const u8 gBerryDescriptionPart2_Belue[] = _("sauer und braucht Zeit zum Wachsen."); -static const u8 gBerryDescriptionPart1_Liechi[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -static const u8 gBerryDescriptionPart2_Liechi[] = _("sie enthalte die Kraft des Meeres."); -static const u8 gBerryDescriptionPart1_Ganlon[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -static const u8 gBerryDescriptionPart2_Ganlon[] = _("sie enthalte die Kraft des Landes."); -static const u8 gBerryDescriptionPart1_Salac[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -static const u8 gBerryDescriptionPart2_Salac[] = _("sie enthalte die Kraft des Himmels."); -static const u8 gBerryDescriptionPart1_Petaya[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -static const u8 gBerryDescriptionPart2_Petaya[] = _("sie enthalte die Kraft allen Lebens."); -static const u8 gBerryDescriptionPart1_Apicot[] = _("Eine rätselhafte BEERE. Man kann"); -static const u8 gBerryDescriptionPart2_Apicot[] = _("nicht sagen, wie und was sie ist."); -static const u8 gBerryDescriptionPart1_Lansat[] = _("Eine legendäre BEERE. Sie zu"); -static const u8 gBerryDescriptionPart2_Lansat[] = _("tragen bringt Freude."); -static const u8 gBerryDescriptionPart1_Starf[] = _("So stark, dass sie an den Rand der"); -static const u8 gBerryDescriptionPart2_Starf[] = _("Welt verbannt wurde. Ein Märchen?"); -static const u8 gBerryDescriptionPart1_Enigma[] = _("Eine enigmatische BEERE. Sie scheint"); -static const u8 gBerryDescriptionPart2_Enigma[] = _("die Macht der Sterne zu besitzen."); -#endif - -const struct Berry gBerries[] = -{ - { - .name = NAME_CHERI_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 20, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Cheri, - .description2 = gBerryDescriptionPart2_Cheri, - .stageDuration = 3, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_CHESTO_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 80, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Chesto, - .description2 = gBerryDescriptionPart2_Chesto, - .stageDuration = 3, - .spicy = 0, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_PECHA_BERRY, - .firmness = BERRY_FIRMNESS_VERY_SOFT, - .size = 40, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Pecha, - .description2 = gBerryDescriptionPart2_Pecha, - .stageDuration = 3, - .spicy = 0, - .dry = 0, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_RAWST_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 32, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Rawst, - .description2 = gBerryDescriptionPart2_Rawst, - .stageDuration = 3, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 10, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_ASPEAR_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 50, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Aspear, - .description2 = gBerryDescriptionPart2_Aspear, - .stageDuration = 3, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 10, - .smoothness = 25, - }, - { - .name = NAME_LEPPA_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 28, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Leppa, - .description2 = gBerryDescriptionPart2_Leppa, - .stageDuration = 4, - .spicy = 10, - .dry = 0, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_ORAN_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 35, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Oran, - .description2 = gBerryDescriptionPart2_Oran, - .stageDuration = 3, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_PERSIM_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 47, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Persim, - .description2 = gBerryDescriptionPart2_Persim, - .stageDuration = 3, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_LUM_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 34, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Lum, - .description2 = gBerryDescriptionPart2_Lum, - .stageDuration = 12, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_SITRUS_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 95, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Sitrus, - .description2 = gBerryDescriptionPart2_Sitrus, - .stageDuration = 6, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_FIGY_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 100, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Figy, - .description2 = gBerryDescriptionPart2_Figy, - .stageDuration = 6, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_WIKI_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 115, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Wiki, - .description2 = gBerryDescriptionPart2_Wiki, - .stageDuration = 6, - .spicy = 0, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_MAGO_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 126, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Mago, - .description2 = gBerryDescriptionPart2_Mago, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_AGUAV_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 64, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Aguav, - .description2 = gBerryDescriptionPart2_Aguav, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 10, - .sour = 0, - .smoothness = 25, - }, - { - .name = NAME_IAPAPA_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 223, - .maxYield = 3, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Iapapa, - .description2 = gBerryDescriptionPart2_Iapapa, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 10, - .smoothness = 25, - }, - { - .name = NAME_RAZZ_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 120, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Razz, - .description2 = gBerryDescriptionPart2_Razz, - .stageDuration = 1, - .spicy = 10, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_BLUK_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 108, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Bluk, - .description2 = gBerryDescriptionPart2_Bluk, - .stageDuration = 1, - .spicy = 0, - .dry = 10, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_NANAB_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 77, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Nanab, - .description2 = gBerryDescriptionPart2_Nanab, - .stageDuration = 1, - .spicy = 0, - .dry = 0, - .sweet = 10, - .bitter = 10, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_WEPEAR_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 74, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Wepear, - .description2 = gBerryDescriptionPart2_Wepear, - .stageDuration = 1, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_PINAP_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 80, - .maxYield = 6, - .minYield = 3, - .description1 = gBerryDescriptionPart1_Pinap, - .description2 = gBerryDescriptionPart2_Pinap, - .stageDuration = 1, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_POMEG_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 135, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Pomeg, - .description2 = gBerryDescriptionPart2_Pomeg, - .stageDuration = 3, - .spicy = 10, - .dry = 0, - .sweet = 10, - .bitter = 10, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_KELPSY_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 150, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Kelpsy, - .description2 = gBerryDescriptionPart2_Kelpsy, - .stageDuration = 3, - .spicy = 0, - .dry = 10, - .sweet = 0, - .bitter = 10, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_QUALOT_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 110, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Qualot, - .description2 = gBerryDescriptionPart2_Qualot, - .stageDuration = 3, - .spicy = 10, - .dry = 0, - .sweet = 10, - .bitter = 0, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_HONDEW_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 162, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Hondew, - .description2 = gBerryDescriptionPart2_Hondew, - .stageDuration = 3, - .spicy = 10, - .dry = 10, - .sweet = 0, - .bitter = 10, - .sour = 0, - .smoothness = 20, - }, - { - .name = NAME_GREPA_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 149, - .maxYield = 6, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Grepa, - .description2 = gBerryDescriptionPart2_Grepa, - .stageDuration = 3, - .spicy = 0, - .dry = 10, - .sweet = 10, - .bitter = 0, - .sour = 10, - .smoothness = 20, - }, - { - .name = NAME_TAMATO_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 200, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Tamato, - .description2 = gBerryDescriptionPart2_Tamato, - .stageDuration = 6, - .spicy = 20, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 30, - }, - { - .name = NAME_CORNN_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 75, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Cornn, - .description2 = gBerryDescriptionPart2_Cornn, - .stageDuration = 6, - .spicy = 0, - .dry = 20, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 30, - }, - { - .name = NAME_MAGOST_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 140, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Magost, - .description2 = gBerryDescriptionPart2_Magost, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 20, - .bitter = 10, - .sour = 0, - .smoothness = 30, - }, - { - .name = NAME_RABUTA_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 226, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Rabuta, - .description2 = gBerryDescriptionPart2_Rabuta, - .stageDuration = 6, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 20, - .sour = 10, - .smoothness = 30, - }, - { - .name = NAME_NOMEL_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 285, - .maxYield = 4, - .minYield = 2, - .description1 = gBerryDescriptionPart1_Nomel, - .description2 = gBerryDescriptionPart2_Nomel, - .stageDuration = 6, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 20, - .smoothness = 30, - }, - { - .name = NAME_SPELON_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 133, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Spelon, - .description2 = gBerryDescriptionPart2_Spelon, - .stageDuration = 18, - .spicy = 40, - .dry = 10, - .sweet = 0, - .bitter = 0, - .sour = 0, - .smoothness = 70, - }, - { - .name = NAME_PAMTRE_BERRY, - .firmness = BERRY_FIRMNESS_VERY_SOFT, - .size = 244, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Pamtre, - .description2 = gBerryDescriptionPart2_Pamtre, - .stageDuration = 18, - .spicy = 0, - .dry = 40, - .sweet = 10, - .bitter = 0, - .sour = 0, - .smoothness = 70, - }, - { - .name = NAME_WATMEL_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 250, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Watmel, - .description2 = gBerryDescriptionPart2_Watmel, - .stageDuration = 18, - .spicy = 0, - .dry = 0, - .sweet = 40, - .bitter = 10, - .sour = 0, - .smoothness = 70, - }, - { - .name = NAME_DURIN_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 280, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Durin, - .description2 = gBerryDescriptionPart2_Durin, - .stageDuration = 18, - .spicy = 0, - .dry = 0, - .sweet = 0, - .bitter = 40, - .sour = 10, - .smoothness = 70, - }, - { - .name = NAME_BELUE_BERRY, - .firmness = BERRY_FIRMNESS_VERY_SOFT, - .size = 300, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Belue, - .description2 = gBerryDescriptionPart2_Belue, - .stageDuration = 18, - .spicy = 10, - .dry = 0, - .sweet = 0, - .bitter = 0, - .sour = 40, - .smoothness = 70, - }, - { - .name = NAME_LIECHI_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 111, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Liechi, - .description2 = gBerryDescriptionPart2_Liechi, - .stageDuration = 24, - .spicy = 40, - .dry = 0, - .sweet = 40, - .bitter = 0, - .sour = 10, - .smoothness = 80, - }, - { - .name = NAME_GANLON_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 33, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Ganlon, - .description2 = gBerryDescriptionPart2_Ganlon, - .stageDuration = 24, - .spicy = 0, - .dry = 40, - .sweet = 0, - .bitter = 40, - .sour = 0, - .smoothness = 80, - }, - { - .name = NAME_SALAC_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 95, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Salac, - .description2 = gBerryDescriptionPart2_Salac, - .stageDuration = 24, - .spicy = 0, - .dry = 0, - .sweet = 40, - .bitter = 0, - .sour = 40, - .smoothness = 80, - }, - { - .name = NAME_PETAYA_BERRY, - .firmness = BERRY_FIRMNESS_VERY_HARD, - .size = 237, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Petaya, - .description2 = gBerryDescriptionPart2_Petaya, - .stageDuration = 24, - .spicy = 40, - .dry = 0, - .sweet = 0, - .bitter = 40, - .sour = 0, - .smoothness = 80, - }, - { - .name = NAME_APICOT_BERRY, - .firmness = BERRY_FIRMNESS_HARD, - .size = 75, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Apicot, - .description2 = gBerryDescriptionPart2_Apicot, - .stageDuration = 24, - .spicy = 0, - .dry = 40, - .sweet = 0, - .bitter = 0, - .sour = 40, - .smoothness = 80, - }, - { - .name = NAME_LANSAT_BERRY, - .firmness = BERRY_FIRMNESS_SOFT, - .size = 97, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Lansat, - .description2 = gBerryDescriptionPart2_Lansat, - .stageDuration = 24, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 30, - }, - { - .name = NAME_STARF_BERRY, - .firmness = BERRY_FIRMNESS_SUPER_HARD, - .size = 153, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Starf, - .description2 = gBerryDescriptionPart2_Starf, - .stageDuration = 24, - .spicy = 10, - .dry = 10, - .sweet = 10, - .bitter = 10, - .sour = 10, - .smoothness = 30, - }, - { - .name = NAME_ENIGMA_BERRY, - .firmness = BERRY_FIRMNESS_UNKNOWN, - .size = 0, - .maxYield = 2, - .minYield = 1, - .description1 = gBerryDescriptionPart1_Enigma, - .description2 = gBerryDescriptionPart2_Enigma, - .stageDuration = 24, - .spicy = 40, - .dry = 40, - .sweet = 40, - .bitter = 40, - .sour = 40, - .smoothness = 40, - }, -}; - -static const struct BerryTree gBlankBerryTree = {0}; - -extern u8 S_BerryTree[]; -extern u16 gSpecialVar_LastTalked; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -/* - An enigma berry is a type of berry which functions - as though it is a custom berry. Because it behaves - like its a custom berry, it doesn't hold an identity - represented in its icons or descriptions, leaving its - information to be decided by the e-reader cards - which were intended to deliver these custom - berries. -*/ - -static u8 CalcBerryYield(struct BerryTree *tree); -static u16 GetStageDurationByBerryType(u8 berry); - -#if DEBUG - -extern u8 sub_80B47D8(u16 var); - -u8 debug_sub_80C2B04(void) -{ - u8 taskId = sub_80B47D8(0); - - gTasks[taskId].data[4]--; - CloseMenu(); - return 1; -} - -u8 debug_sub_80C2B30(void) -{ - u8 taskId = sub_80B47D8(1); - - gTasks[taskId].data[4]--; - CloseMenu(); - return 1; -} - -#endif - -// unused -// this could be static, but making it so causes a compile-time warning. -void ClearEnigmaBerries(void) -{ - CpuFill16(0, &gSaveBlock1.enigmaBerry, sizeof(gSaveBlock1.enigmaBerry)); -} - -void SetEnigmaBerry(u8 *src) -{ - // initialize the enigma berry by copying the data from the script. - u32 i; - u8 *dest = (u8*)&gSaveBlock1.enigmaBerry; - - for (i = 0; i < sizeof(gSaveBlock1.enigmaBerry); i++) - dest[i] = src[i]; - - // at this point, the description pointer is not yet initialized. we need to initialize it since - // we dont know where in memory this is going to be. set the berry desc pointers to the - // EnigmaBerry struct's description arrays since these are where the descriptions are stored. - gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1; - gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; -} - -static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) -{ - const u8 *description1; - const u8 *description2; - u32 i; - u32 checksum; - u8 *dest; - - // the description pointers could be pointing to anywhere in memory. we do not want these - // pointers to factor into the checksum as it will produce a different result every time: so - // back the pointers up and set them to null so the checksum is safe to calculate. - description1 = gSaveBlock1.enigmaBerry.berry.description1; - description2 = gSaveBlock1.enigmaBerry.berry.description2; - gSaveBlock1.enigmaBerry.berry.description1 = NULL; - gSaveBlock1.enigmaBerry.berry.description2 = NULL; - - dest = (u8*)enigmaBerry; - checksum = 0; - for (i = 0; i < ((u32)&gSaveBlock1.enigmaBerry.checksum - (u32)&gSaveBlock1.enigmaBerry); i++) - checksum += dest[i]; - - // the checksum is calculated: the descriptions are safe to restore now. - gSaveBlock1.enigmaBerry.berry.description1 = description1; - gSaveBlock1.enigmaBerry.berry.description2 = description2; - - return checksum; -} - -#if DEBUG - -extern const u8 gSpriteImage_UnusedCherry[]; -extern const u16 gSpritePalette_UnusedCherry[]; -extern u8 gUnknown_Debug_839B6CE[]; - -static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ"); -static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう"); - -void debug_sub_80C2C18(u8 *name, u8 holdEffect, u8 holdEffectParam) -{ - s32 i; - - gSaveBlock1.enigmaBerry.berry = gBerries[0]; - StringCopy(gSaveBlock1.enigmaBerry.berry.name, name); - StringCopy(gSaveBlock1.enigmaBerry.description1, gUnknown_Debug_083F7F84); - StringCopy(gSaveBlock1.enigmaBerry.description2, gUnknown_Debug_083F7F90); - gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1; - gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; - for (i = 0; i < 0x480; i++) - gSaveBlock1.enigmaBerry.pic[i] = gSpriteImage_UnusedCherry[i]; - for (i = 0; i < 16; i++) - gSaveBlock1.enigmaBerry.palette[i] = gSpritePalette_UnusedCherry[i]; - for (i = 0; i < 18; i++) - gSaveBlock1.enigmaBerry.itemEffect[i] = gUnknown_Debug_839B6CE[i]; - gSaveBlock1.enigmaBerry.holdEffect = holdEffect; - gSaveBlock1.enigmaBerry.holdEffectParam = holdEffectParam; - gSaveBlock1.enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry); -} - -void debug_sub_80C2D24(u8 spicy, u8 dry, u8 sweet, u8 bitter, u8 sour, u8 smoothness) -{ - gSaveBlock1.enigmaBerry.berry.spicy = spicy; - gSaveBlock1.enigmaBerry.berry.dry = dry; - gSaveBlock1.enigmaBerry.berry.sweet = sweet; - gSaveBlock1.enigmaBerry.berry.bitter = bitter; - gSaveBlock1.enigmaBerry.berry.sour = sour; - gSaveBlock1.enigmaBerry.berry.smoothness = smoothness; - gSaveBlock1.enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry); -} - -#endif - -// due to e-reader scans being particularly volatile to failure, it is a requirement to check for -// their integrity here due to scans possibly failing to produce the correct result. -bool32 IsEnigmaBerryValid(void) -{ - if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0) - return FALSE; - if (gSaveBlock1.enigmaBerry.berry.maxYield == 0) - return FALSE; - if (GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry) != gSaveBlock1.enigmaBerry.checksum) - return FALSE; - return TRUE; -} - -const struct Berry *GetBerryInfo(u8 berry) -{ - // when getting the pointer to the berry info, enigma berries are handled differently. if your - // berry is an Enigma Berry and its checksum is valid, fetch the pointer to its information in - // the save block. - if (berry == GETBERRYID(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid()) - return &gSaveBlock1.enigmaBerry.berry; - else - { - // invalid berries will be flattened into a cheri berry. Interestingly, if your berry was - // an enigma berry whos checksum failed, the game will use the Enigma Berry information - // for this: meaning if you see the Enigma Berry information, its actually because the - // checksum failed. - if (berry == BERRY_NONE || berry > GETBERRYID(LAST_BERRY)) - berry = GETBERRYID(FIRST_BERRY); - return &gBerries[berry - 1]; - } -} - -// the save file can handle up to a number of 128 berry trees as indicated by its definition -// in global.h. Interestingly, this function does not check that limit of 128. -static struct BerryTree *GetBerryTreeInfo(u8 id) -{ - return &gSaveBlock1.berryTrees[id]; -} - -// this was called because the berry script was successful: meaning the player chose to -// water the tree. We need to check for the current tree stage and set the appropriate -// water flag to true. -bool32 FieldObjectInteractionWaterBerryTree(void) -{ - // GetBerryTreeInfo does not sanitize the tree retrieved, but there are no known - // instances where this can cause problems. - struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject)); - - switch (tree->stage) - { - case BERRY_STAGE_PLANTED: - tree->watered1 = TRUE; - break; - case BERRY_STAGE_SPROUTED: - tree->watered2 = TRUE; - break; - case BERRY_STAGE_TALLER: - tree->watered3 = TRUE; - break; - case BERRY_STAGE_FLOWERING: - tree->watered4 = TRUE; - break; - default: - return FALSE; - } - return TRUE; -} - -bool8 IsPlayerFacingUnplantedSoil(void) -{ - if (GetFieldObjectScriptPointerPlayerFacing() == S_BerryTree - && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == BERRY_STAGE_NO_BERRY) - return TRUE; - else - return FALSE; -} - -bool8 TryToWaterBerryTree(void) -{ - if (GetFieldObjectScriptPointerPlayerFacing() != S_BerryTree) - return FALSE; - else - return FieldObjectInteractionWaterBerryTree(); -} - -void ClearBerryTrees(void) -{ - int i; - struct SaveBlock1 *saveBlock1 = &gSaveBlock1; - struct BerryTree berryTree = gBlankBerryTree; - - for (i = 0; i < MAX_BERRY_TREES; i++) - saveBlock1->berryTrees[i] = berryTree; -} - -// when the player does not interact with the tree for a period of time, this is called -// to advance the grow state. -static bool32 BerryTreeGrow(struct BerryTree *tree) -{ - if (tree->growthSparkle) - return FALSE; - switch (tree->stage) - { - case BERRY_STAGE_NO_BERRY: - return FALSE; - case BERRY_STAGE_FLOWERING: - tree->berryYield = CalcBerryYield(tree); - case BERRY_STAGE_PLANTED: - case BERRY_STAGE_SPROUTED: - case BERRY_STAGE_TALLER: - tree->stage++; - break; - case BERRY_STAGE_BERRIES: - tree->watered1 = 0; - tree->watered2 = 0; - tree->watered3 = 0; - tree->watered4 = 0; - tree->berryYield = 0; - tree->stage = BERRY_STAGE_SPROUTED; - if (++tree->regrowthCount == BERRY_REGROW_LIMIT) - *tree = gBlankBerryTree; - break; - } - return TRUE; -} - -void BerryTreeTimeUpdate(s32 minutesPassed) -{ - int i; - struct BerryTree *tree; - - for (i = 0; i < MAX_BERRY_TREES; i++) - { - tree = &gSaveBlock1.berryTrees[i]; - - if (tree->berry != BERRY_NONE && tree->stage != BERRY_STAGE_NO_BERRY && tree->growthSparkle == FALSE) - { - // the player has waited too long to water the berry. Reset the tree. This is because - // if the berry state is not in the unwatered state, the tree will grow anyway despite this - // check, which means BerryTreeGrow will handle the regrow process for this, removing the - // need for this check. This only handles the unwatered soil state. - if (minutesPassed >= GetStageDurationByBerryType(tree->berry) * 71) - { - *tree = gBlankBerryTree; - } - else - { - // because time is altered below, perhaps they thought it was unsafe to change it, even - // though that is not how passed arguments behave. - s32 time = minutesPassed; - - while (time != 0) - { - if (tree->minutesUntilNextStage > time) - { - // its been X minutes since the last berry update, so update - // minutesUntilNextStage appropriately to match the time offset - // that has passed since the update. - tree->minutesUntilNextStage -= time; - break; - } - // perform the subtraction the other way around to get the number of minutes since - // the inferred stage update that occured, since minutesUntilNextStage is <= time. - // we may need this variable to simulate multiple berry cycles in the while loop. - time -= tree->minutesUntilNextStage; - tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry); // since the tree was inferred to update, set the new minutesUntilNextStage. - if (BerryTreeGrow(tree) == FALSE) - break; - if (tree->stage == BERRY_STAGE_BERRIES) - tree->minutesUntilNextStage *= 4; - } - } - } - } -} - -void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 noSparkle) -{ - struct BerryTree *tree = GetBerryTreeInfo(id); - - *tree = gBlankBerryTree; - tree->berry = berry; - tree->minutesUntilNextStage = GetStageDurationByBerryType(berry); - tree->stage = stage; - if (stage == BERRY_STAGE_BERRIES) - { - tree->berryYield = CalcBerryYield(tree); - tree->minutesUntilNextStage *= 4; - } - if (noSparkle == FALSE) - { - tree->growthSparkle = TRUE; - } -} - -void RemoveBerryTree(u8 id) -{ - gSaveBlock1.berryTrees[id] = gBlankBerryTree; -} - -u8 GetBerryTypeByBerryTreeId(u8 id) -{ - return gSaveBlock1.berryTrees[id].berry; -} - -u8 GetStageByBerryTreeId(u8 id) -{ - return gSaveBlock1.berryTrees[id].stage; -} - -u8 ItemIdToBerryType(u16 item) -{ - u16 berry = item - FIRST_BERRY; - - if (berry > LAST_BERRY - FIRST_BERRY) - return GETBERRYID(FIRST_BERRY); - else - return GETBERRYID(item); -} - -static u16 BerryTypeToItemId(u16 berry) -{ - u16 item = berry - 1; - - if (item > LAST_BERRY - FIRST_BERRY) - return FIRST_BERRY; - else - return GETITEMID(berry); -} - -void GetBerryNameByBerryType(u8 berry, u8 *string) -{ - memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH); - string[BERRY_NAME_LENGTH] = EOS; -} - -void ResetBerryTreeSparkleFlag(u8 id) -{ - GetBerryTreeInfo(id)->growthSparkle = FALSE; -} - -static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree) -{ - u8 count = 0; - - if (tree->watered1) - count++; - if (tree->watered2) - count++; - if (tree->watered3) - count++; - if (tree->watered4) - count++; - return count; -} - -static u8 GetNumStagesWateredByBerryTreeId(u8 id) -{ - return BerryTreeGetNumStagesWatered(GetBerryTreeInfo(id)); -} - -static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) -{ - u32 randMin; - u32 randMax; - u32 rand; - u32 extraYield; - - // depending on if the player gave the tree plenty of water, berry yield will be affected proportionally. - - if (water == 0) - return min; - else - { - randMin = (max - min) * (water - 1); - randMax = (max - min) * (water); - rand = randMin + Random() % (randMax - randMin + 1); - - if ((rand % 4) > 1) - extraYield = rand / 4 + 1; - else - extraYield = rand / 4; - return extraYield + min; - } -} - -static u8 CalcBerryYield(struct BerryTree *tree) -{ - const struct Berry *berry = GetBerryInfo(tree->berry); - u8 min = berry->minYield; - u8 max = berry->maxYield; - - return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree)); -} - -static u8 GetBerryCountByBerryTreeId(u8 id) -{ - return gSaveBlock1.berryTrees[id].berryYield; -} - -static u16 GetStageDurationByBerryType(u8 berry) -{ - return GetBerryInfo(berry)->stageDuration * 60; -} - -void FieldObjectInteractionGetBerryTreeData(void) -{ - u8 id; - u8 berry; - u8 localId; - u8 group; - u8 num; - - id = FieldObjectGetBerryTreeId(gSelectedMapObject); - berry = GetBerryTypeByBerryTreeId(id); - ResetBerryTreeSparkleFlag(id); - localId = gSpecialVar_LastTalked; - num = gSaveBlock1.location.mapNum; - group = gSaveBlock1.location.mapGroup; - if (IsBerryTreeSparkling(localId, num, group)) - { - // we cannot allow the player to grow/interact with the tree while the tree - // is undergoing the sparkling effect, so set the special var to the sparkling - // state and let the event script process the flag. - gSpecialVar_0x8004 = BERRY_STAGE_SPARKLING; - } - else - gSpecialVar_0x8004 = GetStageByBerryTreeId(id); - gSpecialVar_0x8005 = GetNumStagesWateredByBerryTreeId(id); - gSpecialVar_0x8006 = GetBerryCountByBerryTreeId(id); - GetBerryNameByBerryType(berry, gStringVar1); -} - -void Berry_FadeAndGoToBerryBagMenu(void) -{ - SetMainCallback2(sub_80A68CC); -} - -void FieldObjectInteractionPlantBerryTree(void) -{ - u8 berry = ItemIdToBerryType(gSpecialVar_ItemId); - - PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE); - FieldObjectInteractionGetBerryTreeData(); -} - -void FieldObjectInteractionPickBerryTree(void) -{ - u8 id = FieldObjectGetBerryTreeId(gSelectedMapObject); - u8 berry = GetBerryTypeByBerryTreeId(id); - - gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id)); -} - -void FieldObjectInteractionRemoveBerryTree(void) -{ - RemoveBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject)); - sub_8060288(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); -} - -bool8 PlayerHasBerries(void) -{ - return IsBagPocketNonEmpty(BAG_BERRIES); -} - -#if DEBUG -void debug_sub_80C33FC(const u8 *buffer, s32 value, u8 n) -{ - StringAppend(gStringVar4, buffer); - ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n); - StringAppend(gStringVar4, gStringVar1); -} - -static const u8 gUnknown_Debug_083F7F9D[] = _("POS:"); -static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:"); -static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:"); -static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:"); -static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:"); -static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:"); -static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:"); -static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:"); -static const u8 gUnknown_Debug_083F7FD3[] = _(""); - -u8* DebugOpenBerryInfo(void) -{ - if (GetFieldObjectScriptPointerPlayerFacing() != S_BerryTree) - { - return NULL; - } - else - { - u32 berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject); - struct BerryTree *berryTree = GetBerryTreeInfo(berryTreeId); - s32 i; - - for (i = 0; i < 500; i++) - gStringVar4[i] = EOS; - - debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3); - debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2); - debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2); - debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->minutesUntilNextStage, 5); - debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2); - debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3); - debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1); - debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1); - debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1); - debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1); - debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1); - - return gStringVar4; - } -} - -#endif - -// whenever the player is not within view of the berry tree during its sparkle state, the -// sparkle state will be reset. -void ResetBerryTreeSparkleFlags(void) -{ - s16 cam_left; - s16 cam_top; - s16 left; - s16 top; - s16 right; - s16 bottom; - int i; - - GetCameraCoords(&cam_left, &cam_top); - left = cam_left; - top = cam_top + 3; - right = cam_left + 14; - bottom = top + 8; - for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.mapObjects); i++) - { - if (gMapObjects[i].active && gMapObjects[i].animPattern == 12) // is the object an active berry tree? - { - cam_left = gMapObjects[i].coords2.x; - cam_top = gMapObjects[i].coords2.y; - if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom) - ResetBerryTreeSparkleFlag(gMapObjects[i].trainerRange_berryTreeId); - } - } -} diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c deleted file mode 100644 index 9fbfd0681..000000000 --- a/src/field/berry_tag_screen.c +++ /dev/null @@ -1,453 +0,0 @@ -#include "global.h" -#include "berry_tag_screen.h" -#include "berry.h" -#include "decompress.h" -#include "event_object_movement.h" -#include "item_menu.h" -#include "constants/items.h" -#include "item_use.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "palette.h" -#include "overworld.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" - -#define OFFSET_7B (123) -#define FIRST_BERRY ITEM_CHERI_BERRY - -struct Struct2000000 -{ - /*0x00*/ u8 filler_0[0x1FFFF]; - /*0x1FFFF*/ u8 var_1FFFF; -}; - -extern struct Struct2000000 gSharedMem; -extern u16 gBattle_BG1_Y; - -static EWRAM_DATA u8 gUnknown_0203932C = 0; -static EWRAM_DATA s16 gUnknown_0203932E[5] = {0}; - -extern const struct CompressedSpriteSheet gUnknown_083C1F74; -extern const struct CompressedSpritePalette gUnknown_083C1F7C; - -extern u8 gBerryCheck_Gfx[]; -extern u8 gBerryCheck_Pal[]; -extern u8 gUnknown_08E788E4[]; -extern u8 gUnknown_08E78A84[]; - -const u8 *const gUnknown_0841192C[] = -{ - ContestStatsText_VerySoft, - ContestStatsText_Soft, - ContestStatsText_Hard, - ContestStatsText_VeryHard, - ContestStatsText_SuperHard, -}; - -static void sub_8146014(void); -static void sub_814602C(void); -static bool8 sub_8146058(void); -static void sub_8146288(void); -static bool8 sub_81462B8(void); -static void sub_814640C(u8 taskId); -static void sub_8146440(u8 taskId); -static void sub_8146480(u8 taskid); -static void sub_81464E4(void); -static void sub_8146600(u8 berry); -static void sub_81466A0(void); -static void sub_81466E8(u8 taskId, s8 direction); -static void sub_8146798(u8 berry); -static void sub_8146810(s8 berry); -static void sub_81468BC(void); - -static void sub_8146014(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -static void sub_814602C(void) -{ - REG_BG0VOFS = gBattle_BG1_Y; - REG_BG1VOFS = gBattle_BG1_Y; - - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static bool8 sub_8146058(void) -{ - u8 berry; - u16 backup; - - switch (gMain.state) - { - case 0: - ClearVideoCallbacks(); - sub_80F9368(); - sub_8146288(); - REG_BLDCNT = 0; - gMain.state += 1; - break; - case 1: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = 1; - gMain.state += 1; - break; - case 2: - ResetSpriteData(); - gMain.state += 1; - break; - case 3: - Text_LoadWindowTemplate(&gWindowTemplate_81E6E18); - gMain.state += 1; - break; - case 4: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E18); - gMain.state += 1; - break; - case 5: - if (!MultistepInitMenuWindowContinue()) - break; - gSharedMem.var_1FFFF = 0; - gMain.state += 1; - break; - case 6: - if (!sub_81462B8()) - break; - gSharedMem.var_1FFFF = 0; - gMain.state += 1; - break; - case 7: - sub_81464E4(); - gMain.state += 1; - break; - case 8: - berry = gSpecialVar_ItemId + OFFSET_7B; - gUnknown_0203932C = CreateBerrySprite(berry, 56, 64); - gMain.state += 1; - break; - case 9: - sub_8146600(gSpecialVar_ItemId + OFFSET_7B); - gMain.state += 1; - break; - case 10: - backup = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = backup; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(sub_814602C); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; - gMain.state += 1; - break; - case 11: - if (sub_8055870() == TRUE) - break; - gMain.state += 1; - break; - case 12: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - SetMainCallback2(sub_8146014); - return TRUE; - } - - return FALSE; -} - -void BerryTagScreen_814625C(u8 taskId) -{ - do - { - if (sub_8146058() == TRUE) - { - CreateTask(sub_8146480, 0); - return; - } - } while (sub_80F9344() != TRUE); -} - -static void sub_8146288(void) -{ - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - gBattle_BG1_Y = 0; -} - -bool8 sub_81462B8(void) -{ - u16 i; - - switch (gSharedMem.var_1FFFF) - { - case 0: - LZDecompressVram(gBerryCheck_Gfx, (void *)VRAM); - gSharedMem.var_1FFFF += 1; - break; - case 1: - LZDecompressVram(gUnknown_08E788E4, (void *)VRAM + 0x2800); - gSharedMem.var_1FFFF += 1; - break; - case 2: - LZDecompressVram(gUnknown_08E78A84, (void *)VRAM + 0x3000); - gSharedMem.var_1FFFF += 1; - break; - case 3: - for (i = 0; i < 0x400; i++) - { - if (gSaveBlock2.playerGender == MALE) - gBGTilemapBuffers[2][i] = 0x4042; - else - gBGTilemapBuffers[2][i] = 0x5042; - } - DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x3800), 0x800); - gSharedMem.var_1FFFF += 1; - break; - case 4: - LoadCompressedPalette(gBerryCheck_Pal, 0, 96 * 2); - gSharedMem.var_1FFFF += 1; - break; - case 5: - LoadCompressedObjectPic(&gUnknown_083C1F74); - gSharedMem.var_1FFFF += 1; - break; - case 6: - LoadCompressedObjectPalette(&gUnknown_083C1F7C); - gSharedMem.var_1FFFF = 0; - return TRUE; - } - - return FALSE; -} - -static void sub_814640C(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(sub_80A5B40); - sub_80A7DD4(); - gpu_pal_allocator_reset__manage_upper_four(); - DestroyTask(taskId); - } -} - -static void sub_8146440(u8 taskId) -{ - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = sub_814640C; -} - -static void sub_8146480(u8 taskid) -{ - if (!gPaletteFade.active) - { - if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_UP) - sub_81466E8(taskid, -1); - if ((gMain.newAndRepeatedKeys & (DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) == DPAD_DOWN) - sub_81466E8(taskid, 1); - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - sub_8146440(taskid); - } -} - -static void sub_81464E4(void) -{ - const struct Berry *berryInfo; -#ifdef UNITS_IMPERIAL - u32 size; - s32 sizeMajor; - s32 sizeMinor; -#endif -#if GERMAN - u8 buffer[16]; -#endif - - berryInfo = GetBerryInfo(gSpecialVar_ItemId + OFFSET_7B + 1); - - ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_ItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2); - Menu_PrintText(gStringVar1, 12, 4); - -#if ENGLISH - Menu_PrintText(berryInfo->name, 14, 4); -#elif GERMAN - StringCopy(buffer, berryInfo->name); - StringAppend(buffer, gOtherText_Berry2); - Menu_PrintText(buffer, 14, 4); -#endif - - Menu_PrintText(berryInfo->description1, 4, 14); - Menu_PrintText(berryInfo->description2, 4, 16); - -#ifdef UNITS_IMPERIAL - size = (berryInfo->size * 1000) / 254; - if (size % 10 >= 5) - size += 10; - sizeMinor = (size % 100) / 10; - sizeMajor = size / 100; -#endif - - Menu_PrintText(gOtherText_Size, 11, 7); - if (berryInfo->size != 0) - { -#ifdef UNITS_IMPERIAL - ConvertIntToDecimalStringN(gStringVar1, sizeMajor, STR_CONV_MODE_LEFT_ALIGN, 2); - ConvertIntToDecimalStringN(gStringVar2, sizeMinor, STR_CONV_MODE_LEFT_ALIGN, 2); -#else - ConvertIntToDecimalStringN(gStringVar1, berryInfo->size / 10, STR_CONV_MODE_LEFT_ALIGN, 2); - ConvertIntToDecimalStringN(gStringVar2, berryInfo->size % 10, STR_CONV_MODE_LEFT_ALIGN, 2); -#endif - Menu_PrintText(gContestStatsText_Unknown1, 16, 7); - } - else - { - Menu_PrintText(gOtherText_ThreeQuestions2, 16, 7); - } - - Menu_PrintText(gOtherText_Firm, 11, 9); - if (berryInfo->firmness != 0) - Menu_PrintText(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9); - else - Menu_PrintText(gOtherText_ThreeQuestions2, 16, 9); -} - -static void sub_8146600(u8 berry) -{ - const struct Berry *berryInfo; - u16 i; - - berryInfo = GetBerryInfo(berry + 1); - for (i = 0; i < 5; i++) - gUnknown_0203932E[i] = (u16)gUnknown_0203932E[i] | 0xFFFF; - - // argument is the center of the circle - if (berryInfo->spicy) - gUnknown_0203932E[0] = sub_80A7E5C(48); - if (berryInfo->dry) - gUnknown_0203932E[1] = sub_80A7E5C(88); - if (berryInfo->sweet) - gUnknown_0203932E[2] = sub_80A7E5C(128); - if (berryInfo->bitter) - gUnknown_0203932E[3] = sub_80A7E5C(168); - if (berryInfo->sour) - gUnknown_0203932E[4] = sub_80A7E5C(208); -} - -static void sub_81466A0(void) -{ - u16 i; - - for (i = 0; i < 5; i++) - { - if (gUnknown_0203932E[i] != -1) - { - DestroySprite(&gSprites[gUnknown_0203932E[i]]); - gUnknown_0203932E[i] = -1; - } - } -} - -static void sub_81466E8(u8 taskId, s8 direction) -{ - u8 berryPocket = 3; - s16 *data = gTasks[taskId].data; - - if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos == 0 - && direction < 0) - return; - if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + 1 == gBagPocketScrollStates[berryPocket].numSlots - && direction > 0) - return; - - PlaySE(SE_SELECT); - if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + direction < 0) - data[1] = -(gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos); - else if (gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos + direction >= gBagPocketScrollStates[berryPocket].numSlots) - data[1] = gBagPocketScrollStates[berryPocket].numSlots - gBagPocketScrollStates[berryPocket].scrollTop - gBagPocketScrollStates[berryPocket].cursorPos - 1; - else - data[1] = direction; - - gTasks[taskId].func = sub_8146798; - - if (direction < 0) - data[0] = -16; - else - data[0] = 16; - -} - -static void sub_8146798(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - gBattle_BG1_Y = (gBattle_BG1_Y + taskData[0]) & 0xFF; - if ((taskData[0] > 0 && gBattle_BG1_Y == 144) - || (taskData[0] < 0 && gBattle_BG1_Y == 112)) - { - sub_8146810(gTasks[taskId].data[1]); - sub_81468BC(); - } - if (gBattle_BG1_Y == 0) - { - gTasks[taskId].data[0] = gBattle_BG1_Y; - gTasks[taskId].data[1] = gBattle_BG1_Y; - gTasks[taskId].func = sub_8146480; - } -} - -static void sub_8146810(s8 berry) -{ - u8 berryPocket = 3; - - if (berry > 0) - { - if (gBagPocketScrollStates[berryPocket].cursorPos + berry > 7) - { - gBagPocketScrollStates[berryPocket].scrollTop += gBagPocketScrollStates[berryPocket].cursorPos - 7 + berry; - gBagPocketScrollStates[berryPocket].cursorPos = 7; - } - else - { - gBagPocketScrollStates[berryPocket].cursorPos += berry; - } - } - else - { - if (gBagPocketScrollStates[berryPocket].cursorPos + berry < 0) - { - gBagPocketScrollStates[berryPocket].scrollTop += gBagPocketScrollStates[berryPocket].cursorPos + berry; - gBagPocketScrollStates[berryPocket].cursorPos = 0; - } - else - { - gBagPocketScrollStates[berryPocket].cursorPos += berry; - } - } - gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos].itemId; - DestroySprite(&gSprites[gUnknown_0203932C]); - sub_81466A0(); - sub_80A7DD4(); -} - -static void sub_81468BC(void) -{ - Menu_EraseWindowRect(0, 4, 29, 19); - sub_81464E4(); - - // center of berry sprite - gUnknown_0203932C = CreateBerrySprite(gSpecialVar_ItemId + OFFSET_7B, 56, 64); - - sub_8146600(gSpecialVar_ItemId + OFFSET_7B); -} diff --git a/src/field/bike.c b/src/field/bike.c deleted file mode 100644 index 28439e6bb..000000000 --- a/src/field/bike.c +++ /dev/null @@ -1,1071 +0,0 @@ -#include "global.h" -#include "bike.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "constants/flags.h" -#include "global.fieldmap.h" -#include "metatile_behavior.h" -#include "overworld.h" -#include "constants/songs.h" -#include "sound.h" - -extern bool8 gBikeCyclingChallenge; -extern u8 gBikeCollisions; -extern u8 gUnusedBikeCameraAheadPanback; - -#if DEBUG -extern u8 gUnknown_020297ED; -u8 debug_sub_805F2B0(u8); -#endif - -static void MovePlayerOnMachBike(u8, u16, u16); -static u8 GetMachBikeTransition(u8 *); -static void MachBikeTransition_FaceDirection(u8); -static void MachBikeTransition_TurnDirection(u8); -static void MachBikeTransition_TrySpeedUp(u8); -static void MachBikeTransition_TrySlowDown(u8); -static void MovePlayerOnAcroBike(u8, u16, u16); -static u8 CheckMovementInputAcroBike(u8 *, u16, u16); -static u8 AcroBikeHandleInputNormal(u8 *, u16, u16); -static u8 AcroBikeHandleInputTurning(u8 *, u16, u16); -static u8 AcroBikeHandleInputWheelieStanding(u8 *, u16, u16); -static u8 AcroBikeHandleInputBunnyHop(u8 *, u16, u16); -static u8 AcroBikeHandleInputWheelieMoving(u8 *, u16, u16); -static u8 AcroBikeHandleInputSidewaysJump(u8 *, u16, u16); -static u8 AcroBikeHandleInputTurnJump(u8 *, u16, u16); -static void AcroBikeTransition_FaceDirection(u8); -static void AcroBikeTransition_TurnDirection(u8); -static void AcroBikeTransition_Moving(u8); -static void AcroBikeTransition_NormalToWheelie(u8); -static void AcroBikeTransition_WheelieToNormal(u8); -static void AcroBikeTransition_WheelieIdle(u8); -static void AcroBikeTransition_WheelieHoppingStanding(u8); -static void AcroBikeTransition_WheelieHoppingMoving(u8); -static void AcroBikeTransition_SideJump(u8); -static void AcroBikeTransition_TurnJump(u8); -static void AcroBikeTransition_WheelieMoving(u8); -static void AcroBikeTransition_WheelieRisingMoving(u8); -static void AcroBikeTransition_WheelieLoweringMoving(u8); -static void AcroBike_TryHistoryUpdate(u16, u16); -static u8 AcroBike_GetJumpDirection(void); -static void Bike_UpdateDirTimerHistory(u8); -static void Bike_UpdateABStartSelectHistory(u8); -static u8 Bike_DPadToDirection(u16); -static u8 get_some_collision(u8); -static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct MapObject *, s16, s16, u8, u8); -static bool8 IsRunningDisallowedByMetatile(u8); -static void Bike_TryAdvanceCyclingRoadCollisions(); -static u8 CanBikeFaceDirOnMetatile(u8, u8); -static bool8 WillPlayerCollideWithCollision(u8, u8); -static void Bike_SetBikeStill(void); - -/* - A bike transition is a type of callback for the bike that actually - modifies the bicycle's direction or momentum or otherwise movement. - Alternatively, a bike may also have input handlers which process the - bike transition to call: the acro bike has input handlers while the mach - bike does not. This is because the Acro needs to know the button inputs - for its complex tricks and actions. -*/ - -static void (*const sMachBikeTransitions[])(u8) = -{ - MachBikeTransition_FaceDirection, // Face vs Turn: Face has no anim while Turn does. Turn checks for collision because if you turn right as opposed to face right, if there is a wall there, turn will make a bonk sound effect while face will not. - MachBikeTransition_TurnDirection, - MachBikeTransition_TrySpeedUp, - MachBikeTransition_TrySlowDown, -}; - -// bikeFrameCounter is input which is represented by gMachBikeSpeeds in order: 0 is normal speed (1 speed), 1 is fast speed (2 speed), 2 is fastest speed (4 speed) -static void (*const sMachBikeSpeedCallbacks[])(u8) = -{ - PlayerGoSpeed1, // normal speed (1 speed) - PlayerGoSpeed2, // fast speed (2 speed) - PlayerGoSpeed4, // fastest speed (4 speed) -}; - -static void (*const sAcroBikeTransitions[])(u8) = -{ - AcroBikeTransition_FaceDirection, - AcroBikeTransition_TurnDirection, - AcroBikeTransition_Moving, - AcroBikeTransition_NormalToWheelie, - AcroBikeTransition_WheelieToNormal, - AcroBikeTransition_WheelieIdle, - AcroBikeTransition_WheelieHoppingStanding, - AcroBikeTransition_WheelieHoppingMoving, - AcroBikeTransition_SideJump, - AcroBikeTransition_TurnJump, - AcroBikeTransition_WheelieMoving, - AcroBikeTransition_WheelieRisingMoving, - AcroBikeTransition_WheelieLoweringMoving, -}; - -static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) = -{ - AcroBikeHandleInputNormal, - AcroBikeHandleInputTurning, - AcroBikeHandleInputWheelieStanding, - AcroBikeHandleInputBunnyHop, - AcroBikeHandleInputWheelieMoving, - AcroBikeHandleInputSidewaysJump, - AcroBikeHandleInputTurnJump, -}; - -// used with bikeFrameCounter from mach bike -const u16 gMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST}; - -// this is a list of timers to compare against later, terminated with 0. the only timer being compared against is 4 frames in this list. -static const u8 AcroBikeJumpTimerList[] = {4, 0}; - -// this is a list of history inputs to do in order to do the check to retrieve a jump direction for acro bike. it seems to be an extensible list, so its possible that Game Freak may have intended for the Acro Bike to have more complex tricks at some point. The final list only has the acro jump. -static const struct BikeHistoryInputInfo gAcroBikeTricksList[] = -{ - // the 0xF is a mask performed with each byte of the array in order to perform the check on only the last entry of the history list, otherwise the check wouldnt work as there can be 0xF0 as opposed to 0x0F. - {DIR_SOUTH, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_SOUTH}, - {DIR_NORTH, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_NORTH}, - {DIR_WEST, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_WEST}, - {DIR_EAST, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_EAST}, -}; - -void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) -{ - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - MovePlayerOnMachBike(direction, newKeys, heldKeys); - else - MovePlayerOnAcroBike(direction, newKeys, heldKeys); -} - -static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) -{ -#if DEBUG - if (gUnknown_020297ED && debug_sub_805F2B0(direction)) - { - Bike_SetBikeStill(); - return; - } -#endif - sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); -} - -// dirTraveling is a variable that is 0 when the player is standing still. -static u8 GetMachBikeTransition(u8 *dirTraveling) -{ - // if the dir updated before this function, get the relevent new direction to check later. - u8 direction = player_get_direction_upper_nybble(); - - // is the player standing still? - if (*dirTraveling == 0) - { - *dirTraveling = direction; // update the direction, since below we either faced a direction or we started moving. - if (gPlayerAvatar.bikeSpeed == SPEED_STANDING) - { - gPlayerAvatar.runningState = NOT_MOVING; - return MACH_TRANS_FACE_DIRECTION; - } - gPlayerAvatar.runningState = MOVING; - return MACH_TRANS_START_MOVING; - } - - // we need to check if the last traveled direction changed from the new direction as well as ensuring that we dont update the state while the player is moving: see the else check. - if (*dirTraveling != direction && gPlayerAvatar.runningState != MOVING) - { - if (gPlayerAvatar.bikeSpeed != SPEED_STANDING) - { - *dirTraveling = direction; // implement the new direction - gPlayerAvatar.runningState = MOVING; - return MACH_TRANS_START_MOVING; - } - // if you didnt start moving but your dir was different, do a turn direction instead. - gPlayerAvatar.runningState = TURN_DIRECTION; - return MACH_TRANS_TURN_DIRECTION; - } - else // the player is either going in the current direction and hasnt changed or their state is currently moving. - { - gPlayerAvatar.runningState = MOVING; - return MACH_TRANS_KEEP_MOVING; - } -} - -// the difference between face direction and turn direction is that one changes direction while the other does the animation of turning as well as changing direction. -static void MachBikeTransition_FaceDirection(u8 direction) -{ - PlayerFaceDirection(direction); - Bike_SetBikeStill(); -} - -static void MachBikeTransition_TurnDirection(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E)) - { - PlayerTurnInPlace(direction); - Bike_SetBikeStill(); - } - else - { - MachBikeTransition_FaceDirection(playerMapObj->mapobj_unk_18); - } -} - -static void MachBikeTransition_TrySpeedUp(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - u8 collision; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == FALSE) - { - // we cannot go forward, so either slow down or, if we are stopped, idle face direction. - if (gPlayerAvatar.bikeSpeed) - MachBikeTransition_TrySlowDown(playerMapObj->placeholder18); - else - MachBikeTransition_FaceDirection(playerMapObj->placeholder18); - } - else - { - collision = get_some_collision(direction); - if (collision > 0 && collision < 12) - { - // we hit a solid object, but check to see if its a ledge and then jump. - if (collision == COLLISION_LEDGE_JUMP) - { - PlayerJumpLedge(direction); - } - else - { - // we hit a solid object that is not a ledge, so perform the collision. - Bike_SetBikeStill(); - if (collision < 5 || collision > 8) - PlayerOnBikeCollide(direction); - } - } - else - { - // we did not hit anything that can slow us down, so perform the advancement callback depending on the bikeFrameCounter and try to increase the mach bike's speed. - sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](direction); - gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1 - if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array - gPlayerAvatar.bikeFrameCounter++; - } - } -} - -static void MachBikeTransition_TrySlowDown(u8 var) -{ - u8 collision; - - if (gPlayerAvatar.bikeSpeed != SPEED_STANDING) - gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.bikeSpeed; - - collision = get_some_collision(var); - - if (collision > 0 && collision < 12) - { - if (collision == COLLISION_LEDGE_JUMP) - { - PlayerJumpLedge(var); - } - else - { - Bike_SetBikeStill(); - if (collision < 5 || collision > 8) - PlayerOnBikeCollide(var); - } - } - else - { - sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](var); - } -} - -// the acro bike requires the input handler to be executed before the transition can. -static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) -{ -#if DEBUG - if (gUnknown_020297ED && debug_sub_805F2B0(newDirection)) - { - Bike_SetBikeStill(); - return; - } -#endif - - sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); -} - -static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - return sAcroBikeInputHandlers[gPlayerAvatar.acroBikeState](newDirection, newKeys, heldKeys); -} - -static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction = player_get_direction_upper_nybble(); - - gPlayerAvatar.bikeFrameCounter = 0; - if (*newDirection == DIR_NONE) - { - if (newKeys & B_BUTTON) - { - //We're standing still with the B button held. - //Do a wheelie. - *newDirection = direction; - gPlayerAvatar.runningState = NOT_MOVING; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return ACRO_TRANS_NORMAL_TO_WHEELIE; - } - else - { - *newDirection = direction; - gPlayerAvatar.runningState = NOT_MOVING; - return ACRO_TRANS_FACE_DIRECTION; - } - } - if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.bikeSpeed == SPEED_STANDING) - { - gPlayerAvatar.bikeSpeed++; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; - return ACRO_TRANS_WHEELIE_RISING_MOVING; - } - if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING; - gPlayerAvatar.newDirBackup = *newDirection; - gPlayerAvatar.runningState = NOT_MOVING; - return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); - } - gPlayerAvatar.runningState = MOVING; - return ACRO_TRANS_MOVING; -} - -static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction; - - *newDirection = gPlayerAvatar.newDirBackup; - gPlayerAvatar.bikeFrameCounter++; - - // Wait 6 frames before actually changing direction - if (gPlayerAvatar.bikeFrameCounter > 6) // ... because it takes 6 frames to advance 1 tile. - { - gPlayerAvatar.runningState = TURN_DIRECTION; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - Bike_SetBikeStill(); - return ACRO_TRANS_TURN_DIRECTION; - } - direction = player_get_direction_upper_nybble(); - if (*newDirection == AcroBike_GetJumpDirection()) - { - Bike_SetBikeStill(); // Bike_SetBikeStill sets speed to standing, but the next line immediately overrides it. could have just reset acroBikeState to 0 here instead of wasting a jump. - gPlayerAvatar.bikeSpeed = SPEED_NORMAL; - if (*newDirection == GetOppositeDirection(direction)) - { - // do a turn jump. - // no need to update runningState, didnt move. - gPlayerAvatar.acroBikeState = ACRO_STATE_TURN_JUMP; - return ACRO_TRANS_TURN_JUMP; - } - else - { - // do a sideways jump. - gPlayerAvatar.runningState = MOVING; // we need to move, set state to moving. - gPlayerAvatar.acroBikeState = ACRO_STATE_SIDE_JUMP; - return ACRO_TRANS_SIDE_JUMP; - } - } - *newDirection = direction; - return ACRO_TRANS_FACE_DIRECTION; -} - -static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_upper_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - gPlayerAvatar.runningState = NOT_MOVING; - - if (heldKeys & B_BUTTON) - gPlayerAvatar.bikeFrameCounter++; - else - { - // B button was released. - gPlayerAvatar.bikeFrameCounter = 0; - if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - // Go back to normal on flat ground - *newDirection = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - Bike_SetBikeStill(); - return ACRO_TRANS_WHEELIE_TO_NORMAL; - } - } - if (gPlayerAvatar.bikeFrameCounter >= 40) - { - *newDirection = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_BUNNY_HOP; - Bike_SetBikeStill(); - return ACRO_TRANS_WHEELIE_HOPPING_STANDING; - } - if (*newDirection == direction) - { - gPlayerAvatar.runningState = MOVING; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; - Bike_SetBikeStill(); - return ACRO_TRANS_WHEELIE_MOVING; - } - if (*newDirection == 0) - { - *newDirection = direction; - return ACRO_TRANS_WHEELIE_IDLE; - } - gPlayerAvatar.runningState = TURN_DIRECTION; - return ACRO_TRANS_WHEELIE_IDLE; -} - -static u8 AcroBikeHandleInputBunnyHop(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_upper_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!(heldKeys & B_BUTTON)) - { - // B button was released - Bike_SetBikeStill(); - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - // even though B was released, dont undo the wheelie on the bumpy slope. - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); - } - else - { - // .. otherwise, go back to normal on flat ground - *newDirection = direction; - gPlayerAvatar.runningState = NOT_MOVING; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return ACRO_TRANS_WHEELIE_TO_NORMAL; - } - } - - // B Button is still held - - if (*newDirection == DIR_NONE) - { - // we did not move, so keep hopping in place without moving. - *newDirection = direction; - gPlayerAvatar.runningState = NOT_MOVING; - return ACRO_TRANS_WHEELIE_HOPPING_STANDING; - } - if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) - { - // we changed direction, so turn but do not move hop. - gPlayerAvatar.runningState = TURN_DIRECTION; - return ACRO_TRANS_WHEELIE_HOPPING_STANDING; - } - // otherwise, we started moving while hopping - gPlayerAvatar.runningState = MOVING; - return ACRO_TRANS_WHEELIE_HOPPING_MOVING; -} - -static u8 AcroBikeHandleInputWheelieMoving(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_lower_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!(heldKeys & B_BUTTON)) - { - // we were moving on a wheelie, but we let go while moving. reset bike still status - Bike_SetBikeStill(); - if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - // we let go of B and arent on a bumpy slope, set state to normal because now we need to handle this - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - if (*newDirection == DIR_NONE) - { - // we stopped moving but are turning, still try to lower the wheelie in place. - *newDirection = direction; - gPlayerAvatar.runningState = NOT_MOVING; - return ACRO_TRANS_WHEELIE_TO_NORMAL; - } - if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) - { - // we did not turn while lowering wheelie, so do so without turning. - gPlayerAvatar.runningState = NOT_MOVING; - return ACRO_TRANS_WHEELIE_TO_NORMAL; - } - // if we are moving while lowering wheelie, put the acro into a lowering state while moving. - gPlayerAvatar.runningState = MOVING; - return ACRO_TRANS_WHEELIE_LOWERING_MOVING; - } - // please do not undo the wheelie on a bumpy slope - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); - } - // we are still holding B. - if (*newDirection == DIR_NONE) - { - // idle the wheelie in place because we're holding B without moving. - *newDirection = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - gPlayerAvatar.runningState = NOT_MOVING; - Bike_SetBikeStill(); - return ACRO_TRANS_WHEELIE_IDLE; - } - if (direction != *newDirection && gPlayerAvatar.runningState != MOVING) - { - gPlayerAvatar.runningState = NOT_MOVING; - return ACRO_TRANS_WHEELIE_IDLE; - } - gPlayerAvatar.runningState = MOVING; - return ACRO_TRANS_WHEELIE_MOVING; -} - -static u8 AcroBikeHandleInputSidewaysJump(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_9 = 0; - FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); -} - -static u8 AcroBikeHandleInputTurnJump(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); -} - -static void AcroBikeTransition_FaceDirection(u8 direction) -{ - PlayerFaceDirection(direction); -} - -static void AcroBikeTransition_TurnDirection(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerFaceDirection(direction); -} - -static void AcroBikeTransition_Moving(u8 direction) -{ - u8 collision; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - AcroBikeTransition_FaceDirection(playerMapObj->placeholder18); - return; - } - collision = get_some_collision(direction); - if (collision > 0 && collision < 12) - { - if (collision == COLLISION_LEDGE_JUMP) - PlayerJumpLedge(direction); - else if (collision < 5 || collision > 8) - PlayerOnBikeCollide(direction); - } - else - { - npc_use_some_d2s(direction); - } -} - -static void AcroBikeTransition_NormalToWheelie(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerStartWheelie(direction); -} - -static void AcroBikeTransition_WheelieToNormal(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerEndWheelie(direction); -} - -static void AcroBikeTransition_WheelieIdle(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerIdleWheelie(direction); -} - -static void AcroBikeTransition_WheelieHoppingStanding(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerStandingHoppingWheelie(direction); -} - -static void AcroBikeTransition_WheelieHoppingMoving(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - AcroBikeTransition_WheelieHoppingStanding(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - //TODO: Try to get rid of this goto - if (var == 0 || var == 9) - { - goto derp; - } - else if (var == 6) - { - PlayerLedgeHoppingWheelie(direction); - } - else if (var < 5 || var > 8) - { - if (var <= 11) - { - AcroBikeTransition_WheelieHoppingStanding(direction); - } - else - { - derp: - PlayerMovingHoppingWheelie(direction); - } - } -} - -static void AcroBikeTransition_SideJump(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj; - - var = get_some_collision(direction); - if (var != 0) - { - if (var == 7) - return; - if (var < 10) - { - AcroBikeTransition_TurnDirection(direction); - return; - } - if (WillPlayerCollideWithCollision(var, direction) == FALSE) - { - AcroBikeTransition_TurnDirection(direction); - return; - } - } - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - PlaySE(SE_JITE_PYOKO); - playerMapObj->mapobj_bit_9 = 1; - PlayerSetAnimId(sub_80608A4(direction), 2); -} - -static void AcroBikeTransition_TurnJump(u8 direction) -{ - PlayerAcroTurnJump(direction); -} - -static void AcroBikeTransition_WheelieMoving(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - PlayerIdleWheelie(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - { - PlayerLedgeHoppingWheelie(direction); - } - else if (var == 9) - { - PlayerIdleWheelie(direction); - } - else if (var <= 4) - { - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - PlayerIdleWheelie(direction); - else - sub_80595DC(direction); //hit wall? - } - return; - } - sub_8059618(direction); - gPlayerAvatar.runningState = MOVING; -} - -static void AcroBikeTransition_WheelieRisingMoving(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - PlayerStartWheelie(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - { - PlayerLedgeHoppingWheelie(direction); - } - else if (var == 9) - { - PlayerIdleWheelie(direction); - } - else if (var <= 4) - { - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - PlayerIdleWheelie(direction); - else - sub_80595DC(direction); //hit wall? - } - return; - } - sub_8059600(direction); - gPlayerAvatar.runningState = MOVING; -} - -static void AcroBikeTransition_WheelieLoweringMoving(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - PlayerEndWheelie(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - PlayerJumpLedge(direction); - else if (var < 5 || var > 8) - PlayerEndWheelie(direction); - return; - } - sub_8059630(direction); -} - -void Bike_TryAcroBikeHistoryUpdate(u16 newKeys, u16 heldKeys) -{ - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - AcroBike_TryHistoryUpdate(newKeys, heldKeys); -} - -static void AcroBike_TryHistoryUpdate(u16 newKeys, u16 heldKeys) // newKeys is unused -{ - u8 direction = Bike_DPadToDirection(heldKeys); - - if (direction == (gPlayerAvatar.directionHistory & 0xF)) - { - // increment the timer for direction history since last input. - if (gPlayerAvatar.dirTimerHistory[0] < 0xFF) - gPlayerAvatar.dirTimerHistory[0]++; - } - else - { - Bike_UpdateDirTimerHistory(direction); - gPlayerAvatar.bikeSpeed = SPEED_STANDING; - } - - direction = heldKeys & (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON); // directions is reused for some reason. - if (direction == (gPlayerAvatar.abStartSelectHistory & 0xF)) - { - if (gPlayerAvatar.abStartSelectTimerHistory[0] < 0xFF) - gPlayerAvatar.abStartSelectTimerHistory[0]++; - } - else - { - Bike_UpdateABStartSelectHistory(direction); - gPlayerAvatar.bikeSpeed = SPEED_STANDING; - } -} - -static bool8 HasPlayerInputTakenLongerThanList(const u8 *dirTimerList, const u8 *abStartSelectTimerList) -{ - u8 i; - - for (i = 0; dirTimerList[i] != 0; i++) - { - if (gPlayerAvatar.dirTimerHistory[i] > dirTimerList[i]) - return FALSE; - } - for (i = 0; abStartSelectTimerList[i] != 0; i++) - { - if (gPlayerAvatar.abStartSelectTimerHistory[i] > abStartSelectTimerList[i]) - return FALSE; - } - return TRUE; -} - -static u8 AcroBike_GetJumpDirection(void) -{ - u32 i; - - for (i = 0; i < 4; i++) - { - const struct BikeHistoryInputInfo *historyInputInfo = &gAcroBikeTricksList[i]; - u32 dirHistory = gPlayerAvatar.directionHistory; - u32 abStartSelectHistory = gPlayerAvatar.abStartSelectHistory; - - dirHistory &= historyInputInfo->dirHistoryMask; - abStartSelectHistory &= historyInputInfo->abStartSelectHistoryMask; - if (dirHistory == historyInputInfo->dirHistoryMatch && abStartSelectHistory == historyInputInfo->abStartSelectHistoryMatch && HasPlayerInputTakenLongerThanList(historyInputInfo->dirTimerHistoryList, historyInputInfo->abStartSelectHistoryList)) - return historyInputInfo->direction; - } - return 0; -} - -static void Bike_UpdateDirTimerHistory(u8 dir) -{ - u8 i; - - gPlayerAvatar.directionHistory = (gPlayerAvatar.directionHistory << 4) | (dir & 0xF); - - for (i = 7; i != 0; i--) - gPlayerAvatar.dirTimerHistory[i] = gPlayerAvatar.dirTimerHistory[i - 1]; - gPlayerAvatar.dirTimerHistory[0] = 1; -} - -static void Bike_UpdateABStartSelectHistory(u8 input) -{ - u8 i; - - gPlayerAvatar.abStartSelectHistory = (gPlayerAvatar.abStartSelectHistory << 4) | (input & 0xF); - - for (i = 7; i != 0; i--) - gPlayerAvatar.abStartSelectTimerHistory[i] = gPlayerAvatar.abStartSelectTimerHistory[i - 1]; - gPlayerAvatar.abStartSelectTimerHistory[0] = 1; -} - -static u8 Bike_DPadToDirection(u16 heldKeys) -{ - if (heldKeys & DPAD_UP) - return DIR_NORTH; - if (heldKeys & DPAD_DOWN) - return DIR_SOUTH; - if (heldKeys & DPAD_LEFT) - return DIR_WEST; - if (heldKeys & DPAD_RIGHT) - return DIR_EAST; - return DIR_NONE; -} - -static u8 get_some_collision(u8 direction) -{ - s16 x; - s16 y; - u8 metatitleBehavior; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - x = playerMapObj->coords2.x; - y = playerMapObj->coords2.y; - MoveCoords(direction, &x, &y); - metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y); - return Bike_CheckCollisionTryAdvanceCollisionCount(playerMapObj, x, y, direction, metatitleBehavior); -} - -static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior) -{ - u8 collision = CheckForFieldObjectCollision(mapObject, x, y, direction, metatitleBehavior); - - if (collision > 4) - return collision; - - if (collision == 0 && IsRunningDisallowedByMetatile(metatitleBehavior)) - collision = 2; - - if (collision) - Bike_TryAdvanceCyclingRoadCollisions(); - - return collision; -} - -bool8 IsRunningDisallowed(u8 tile) -{ - if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR) - return TRUE; - else - return FALSE; -} - -static bool8 IsRunningDisallowedByMetatile(u8 tile) -{ - if (MetatileBehavior_IsRunningDisallowed(tile)) - return TRUE; - if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetZCoord() & 1) == 0) - return TRUE; - return FALSE; -} - -static void Bike_TryAdvanceCyclingRoadCollisions(void) -{ - if (gBikeCyclingChallenge != FALSE && gBikeCollisions < 100) - gBikeCollisions++; -} - -static bool8 CanBikeFaceDirOnMetatile(u8 direction, u8 tile) -{ - if (direction == DIR_EAST || direction == DIR_WEST) - { - //Bike cannot face east or west on a vertical rail - if (MetatileBehavior_IsIsolatedVerticalRail(tile) - || MetatileBehavior_IsVerticalRail(tile)) - return FALSE; - } - else - { - //Bike cannot face north or south on a horizontal rail - if (MetatileBehavior_IsIsolatedHorizontalRail(tile) - || MetatileBehavior_IsHorizontalRail(tile)) - return FALSE; - } - return TRUE; -} - -static bool8 WillPlayerCollideWithCollision(u8 newTileCollision, u8 direction) -{ - if (direction == DIR_NORTH || direction == DIR_SOUTH) - { - if (newTileCollision == 10 || newTileCollision == 12) - return FALSE; - } - else if (newTileCollision == 11 || newTileCollision == 13) - { - return FALSE; - } - - return TRUE; -} - -bool8 IsBikingDisallowedByPlayer(void) -{ - s16 x, y; - u8 tileBehavior; - - if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_4))) - { - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if (!IsRunningDisallowedByMetatile(tileBehavior)) - return FALSE; - } - return TRUE; -} - -bool8 player_should_look_direction_be_enforced_upon_movement(void) -{ - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) != FALSE) - return FALSE; - else - return TRUE; -} - -void GetOnOffBike(u8 var) -{ - gUnusedBikeCameraAheadPanback = FALSE; - - if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - { - SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - Overworld_ClearSavedMusic(); - Overworld_PlaySpecialMapMusic(); - } - else - { - SetPlayerAvatarTransitionFlags(var); - Overworld_SetSavedMusic(BGM_CYCLING); - Overworld_ChangeMusicTo(BGM_CYCLING); - } -} - -void BikeClearState(int newDirHistory, int newAbStartHistory) -{ - u8 i; - - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - gPlayerAvatar.newDirBackup = DIR_NONE; - gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.bikeSpeed = SPEED_STANDING; - gPlayerAvatar.directionHistory = newDirHistory; - gPlayerAvatar.abStartSelectHistory = newAbStartHistory; - - for (i = 0; i < 8; i++) - gPlayerAvatar.dirTimerHistory[i] = 0; - - for (i = 0; i < 8; i++) - gPlayerAvatar.abStartSelectTimerHistory[i] = 0; -} - -void Bike_UpdateBikeCounterSpeed(u8 counter) -{ - gPlayerAvatar.bikeFrameCounter = counter; - gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // lazy way of multiplying by 1.5. -} - -static void Bike_SetBikeStill(void) -{ - gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.bikeSpeed = SPEED_STANDING; -} - -s16 GetPlayerSpeed(void) -{ - // because the player pressed a direction, it won't ever return a speed of 0 since this function returns the player's current speed. - s16 machSpeeds[3]; - - memcpy(machSpeeds, gMachBikeSpeeds, sizeof(machSpeeds)); - - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - return machSpeeds[gPlayerAvatar.bikeFrameCounter]; - else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - return SPEED_FASTER; - else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH)) - return SPEED_FAST; - else - return SPEED_NORMAL; -} - -void Bike_HandleBumpySlopeJump(void) -{ - s16 x, y; - u8 tileBehavior; - - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - { - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if (MetatileBehavior_IsBumpySlope(tileBehavior)) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - sub_8059C94(player_get_direction_upper_nybble()); - } - } -} diff --git a/src/field/birch_pc.c b/src/field/birch_pc.c deleted file mode 100644 index 4b0025504..000000000 --- a/src/field/birch_pc.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_message_box.h" -#include "pokedex.h" -#include "constants/species.h" - -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -extern const u8 gBirchDexRatingText_LessThan10[]; -extern const u8 gBirchDexRatingText_LessThan20[]; -extern const u8 gBirchDexRatingText_LessThan30[]; -extern const u8 gBirchDexRatingText_LessThan40[]; -extern const u8 gBirchDexRatingText_LessThan50[]; -extern const u8 gBirchDexRatingText_LessThan60[]; -extern const u8 gBirchDexRatingText_LessThan70[]; -extern const u8 gBirchDexRatingText_LessThan80[]; -extern const u8 gBirchDexRatingText_LessThan90[]; -extern const u8 gBirchDexRatingText_LessThan100[]; -extern const u8 gBirchDexRatingText_LessThan110[]; -extern const u8 gBirchDexRatingText_LessThan120[]; -extern const u8 gBirchDexRatingText_LessThan130[]; -extern const u8 gBirchDexRatingText_LessThan140[]; -extern const u8 gBirchDexRatingText_LessThan150[]; -extern const u8 gBirchDexRatingText_LessThan160[]; -extern const u8 gBirchDexRatingText_LessThan170[]; -extern const u8 gBirchDexRatingText_LessThan180[]; -extern const u8 gBirchDexRatingText_LessThan190[]; -extern const u8 gBirchDexRatingText_LessThan200[]; -extern const u8 gBirchDexRatingText_DexCompleted[]; - -bool16 ScriptGetPokedexInfo(void) -{ - if (gSpecialVar_0x8004 == 0) // is national dex not present? - { - gSpecialVar_0x8005 = GetHoennPokedexCount(0); - gSpecialVar_0x8006 = GetHoennPokedexCount(1); - } - else - { - gSpecialVar_0x8005 = GetNationalPokedexCount(0); - gSpecialVar_0x8006 = GetNationalPokedexCount(1); - } - - return IsNationalPokedexEnabled(); -} - -// This shows your Hoenn Pokedex rating and not your National Dex. -const u8 *GetPokedexRatingText(u16 count) -{ - if (count < 10) - return gBirchDexRatingText_LessThan10; - if (count < 20) - return gBirchDexRatingText_LessThan20; - if (count < 30) - return gBirchDexRatingText_LessThan30; - if (count < 40) - return gBirchDexRatingText_LessThan40; - if (count < 50) - return gBirchDexRatingText_LessThan50; - if (count < 60) - return gBirchDexRatingText_LessThan60; - if (count < 70) - return gBirchDexRatingText_LessThan70; - if (count < 80) - return gBirchDexRatingText_LessThan80; - if (count < 90) - return gBirchDexRatingText_LessThan90; - if (count < 100) - return gBirchDexRatingText_LessThan100; - if (count < 110) - return gBirchDexRatingText_LessThan110; - if (count < 120) - return gBirchDexRatingText_LessThan120; - if (count < 130) - return gBirchDexRatingText_LessThan130; - if (count < 140) - return gBirchDexRatingText_LessThan140; - if (count < 150) - return gBirchDexRatingText_LessThan150; - if (count < 160) - return gBirchDexRatingText_LessThan160; - if (count < 170) - return gBirchDexRatingText_LessThan170; - if (count < 180) - return gBirchDexRatingText_LessThan180; - if (count < 190) - return gBirchDexRatingText_LessThan190; - if (count < 200) - return gBirchDexRatingText_LessThan200; - if (count == 200) - { - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) - || GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. - return gBirchDexRatingText_LessThan200; - return gBirchDexRatingText_DexCompleted; - } - if (count == 201) - { - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) - && GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200. - return gBirchDexRatingText_LessThan200; - return gBirchDexRatingText_DexCompleted; - } - if (count == 202) - return gBirchDexRatingText_DexCompleted; // Hoenn dex is considered complete, even though the hoenn dex count is 210. - return gBirchDexRatingText_LessThan10; -} - -void ShowPokedexRatingMessage(void) -{ - ShowFieldMessage(GetPokedexRatingText(gSpecialVar_0x8004)); -} diff --git a/src/field/braille_puzzles.c b/src/field/braille_puzzles.c deleted file mode 100644 index f11fb5fb3..000000000 --- a/src/field/braille_puzzles.c +++ /dev/null @@ -1,262 +0,0 @@ -#include "global.h" -#include "braille_puzzles.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "fieldmap.h" -#include "constants/flags.h" -#include "main.h" -#include "constants/maps.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "rom6.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "task.h" -#include "text.h" - -extern u8 gPlayerPartyCount; -extern u8 gLastFieldPokeMenuOpened; - -extern u8 S_OpenRegiceChamber[]; // regiice event script - -bool8 ShouldDoBrailleDigEffect(void) -{ - if (!FlagGet(FLAG_SYS_BRAILLE_DIG) - && (gSaveBlock1.location.mapGroup == MAP_GROUP(SEALED_CHAMBER_OUTER_ROOM) - && gSaveBlock1.location.mapNum == MAP_NUM(SEALED_CHAMBER_OUTER_ROOM))) - { - if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 3) - return TRUE; - else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 3) - return TRUE; - else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 3) - return TRUE; - } - - return FALSE; -} - -void DoBrailleDigEffect(void) -{ - MapGridSetMetatileIdAt(16, 8, 554); - MapGridSetMetatileIdAt(17, 8, 555); - MapGridSetMetatileIdAt(18, 8, 556); - MapGridSetMetatileIdAt(16, 9, 3634); - MapGridSetMetatileIdAt(17, 9, 563); - MapGridSetMetatileIdAt(18, 9, 3636); - DrawWholeMapView(); - PlaySE(SE_BAN); - FlagSet(FLAG_SYS_BRAILLE_DIG); - ScriptContext2_Disable(); -} - -bool8 CheckRelicanthWailord(void) -{ - // First comes Relicanth. - if (GetMonData(&gPlayerParty, MON_DATA_SPECIES2, 0) == SPECIES_RELICANTH) - { - CalculatePlayerPartyCount(); - // Last comes Wailord - if (GetMonData(&gPlayerParty[gPlayerPartyCount - 1], MON_DATA_SPECIES2, 0) == SPECIES_WAILORD) - return TRUE; - } - return FALSE; -} - -bool8 ShouldDoBrailleStrengthEffect(void) -{ - if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == MAP_GROUP(DESERT_RUINS) && gSaveBlock1.location.mapNum == MAP_NUM(DESERT_RUINS))) - { - if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 23) - return TRUE; - else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 23) - return TRUE; - else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 23) - return TRUE; - } - - return FALSE; -} - -void DoBrailleStrengthEffect(void) -{ - FieldEffectActiveListRemove(0x28); - MapGridSetMetatileIdAt(14, 26, 554); - MapGridSetMetatileIdAt(15, 26, 555); - MapGridSetMetatileIdAt(16, 26, 556); - MapGridSetMetatileIdAt(14, 27, 3634); - MapGridSetMetatileIdAt(15, 27, 563); - MapGridSetMetatileIdAt(16, 27, 3636); - DrawWholeMapView(); - PlaySE(SE_BAN); - FlagSet(FLAG_SYS_BRAILLE_STRENGTH); - ScriptContext2_Disable(); -} - -bool8 ShouldDoBrailleFlyEffect(void) -{ - if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == MAP_GROUP(ANCIENT_TOMB) && gSaveBlock1.location.mapNum == MAP_NUM(ANCIENT_TOMB))) - { - if (gSaveBlock1.pos.x == 8 && gSaveBlock1.pos.y == 25) - return TRUE; - } - - return FALSE; -} - -void DoBrailleFlyEffect(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB); -} - -bool8 FldEff_UseFlyAncientTomb(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16; - gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback; - return FALSE; -} - -void UseFlyAncientTomb_Callback(void) -{ - FieldEffectActiveListRemove(FLDEFF_USE_FLY_ANCIENT_TOMB); - UseFlyAncientTomb_Finish(); -} - -void UseFlyAncientTomb_Finish(void) -{ - MapGridSetMetatileIdAt(14, 26, 554); - MapGridSetMetatileIdAt(15, 26, 555); - MapGridSetMetatileIdAt(16, 26, 556); - MapGridSetMetatileIdAt(14, 27, 3634); - MapGridSetMetatileIdAt(15, 27, 563); - MapGridSetMetatileIdAt(16, 27, 3636); - DrawWholeMapView(); - PlaySE(SE_BAN); - FlagSet(FLAG_SYS_BRAILLE_FLY); - ScriptContext2_Disable(); -} - -void DoBrailleWait(void) -{ - if (!FlagGet(FLAG_SYS_BRAILLE_WAIT)) - CreateTask(Task_BrailleWait, 0x50); -} - -void Task_BrailleWait(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - data[1] = 7200; - data[0] = 1; - break; - case 1: - if (BrailleWait_CheckButtonPress() != FALSE) - { - Menu_EraseScreen(); - PlaySE(SE_SELECT); - data[0] = 2; - } - else - { - data[1] = data[1] - 1; - if (data[1] == 0) - { - Menu_EraseScreen(); - data[0] = 3; - data[1] = 30; - } - } - break; - case 2: - if (BrailleWait_CheckButtonPress() == FALSE) - { - data[1] = data[1] - 1; - if (data[1] == 0) - data[0] = 4; - break; - } - sub_8064E2C(); - DestroyTask(taskId); - ScriptContext2_Disable(); - break; - case 3: - data[1] = data[1] - 1; - if (data[1] == 0) - data[0] = 4; - break; - case 4: - sub_8064E2C(); - ScriptContext1_SetupScript(S_OpenRegiceChamber); - DestroyTask(taskId); - break; - } -} - -bool32 BrailleWait_CheckButtonPress(void) -{ - u16 keyMask = A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON | DPAD_ANY; - - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) - keyMask |= L_BUTTON | R_BUTTON; - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) - keyMask |= L_BUTTON; - - if (gMain.newKeys & keyMask) - return TRUE; - else - return FALSE; -} - -void DoSealedChamberShakingEffect1(void) -{ - u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9); - - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[4] = 2; - gTasks[taskId].data[5] = 5; - gTasks[taskId].data[6] = 50; - SetCameraPanningCallback(0); -} - -void DoSealedChamberShakingEffect2(void) -{ - u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9); - - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[4] = 3; - gTasks[taskId].data[5] = 5; - gTasks[taskId].data[6] = 2; - SetCameraPanningCallback(0); -} - -void SealedChamberShakingEffect(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - task->data[1]++; - - if (!(task->data[1] % task->data[5])) - { - task->data[1] = 0; - task->data[2]++; - task->data[4] = -task->data[4]; - SetCameraPanning(0, task->data[4]); - if (task->data[2] == task->data[6]) - { - DestroyTask(taskId); - EnableBothScriptContexts(); - InstallCameraPanAheadCallback(); - } - } -} diff --git a/src/field/choose_party.c b/src/field/choose_party.c deleted file mode 100644 index 4766b2fbb..000000000 --- a/src/field/choose_party.c +++ /dev/null @@ -1,968 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_fadetransition.h" -#include "main.h" -#include "menu.h" -#include "name_string_util.h" -#include "palette.h" -#include "party_menu.h" -#include "pokemon_menu.h" -#include "field_weather.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "overworld.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "strings.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "ewram.h" - -extern u8 gPlayerPartyCount; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gUnknown_020384F0; -extern struct UnknownPokemonStruct2 gUnknown_02023A00[3]; -extern u8 gUnknown_0202E8F6; -extern struct Pokemon gUnknown_030042FC[]; -extern const u16 gBattleTowerBannedSpecies[]; - -EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; - -extern u8 sub_806BD58(u8, u8); -extern void PartyMenuPrintMonsLevelOrStatus(void); -extern void sub_806BC3C(u8, u8); -extern u8 GetMonStatusAndPokerus(); -extern void PartyMenuPrintHP(); -extern bool8 sub_80F9344(void); - -static void ClearPartySelection(void); -static bool8 IsMonAllowedInBattleTower(struct Pokemon *); -static void sub_812238C(u8); -static void sub_8122450(u8); -static void sub_81224A8(u8); -static void sub_8122728(u8); -static void BattleTowerEntryMenuCallback_Exit(u8); -static void sub_81228E8(u8); -static void sub_8122950(u8); -static void sub_81229B8(void); -static void sub_8122AB8(u8); -static void sub_8122B10(u8); -static void sub_8122C18(u8); -static void Task_DaycareStorageMenu8122EAC(u8); -void sub_8123138(u8); -static void sub_8123170(u8); -static void sub_81231AC(void); - -void sub_8121E10(void) -{ - ClearPartySelection(); - ewram1B000.unk263 = 0; - OpenPartyMenu(PARTY_MENU_TYPE_BATTLE_TOWER, 0); -} - -void sub_8121E34(void) -{ - ClearPartySelection(); - ewram1B000.unk263 = 1; - OpenPartyMenu(PARTY_MENU_TYPE_BATTLE_TOWER, 0); -} - -static void ClearPartySelection(void) -{ - u8 i; - - for (i = 0; i < 3; i++) - gSelectedOrderFromParty[i] = 0; -} - -bool8 SetupBattleTowerPartyMenu(void) -{ - u8 i; - - switch (ewram1B000_alt.setupState) - { - case 0: - if (ewram1B000_alt.monIndex < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); - ewram1B000_alt.monIndex++; - } - else - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - ewram1B000_alt.setupState++; - break; - case 2: - CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); - ewram1B000_alt.setupState++; - break; - case 3: - if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) == 1) - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState++; - } - else - { - ewram1B000_alt.monIndex++; - } - break; - case 4: - PartyMenuPrintMonsLevelOrStatus(); - ewram1B000_alt.setupState++; - break; - case 5: - PrintPartyMenuMonNicknames(); - ewram1B000_alt.setupState++; - break; - case 6: - for (i = 0; i < gPlayerPartyCount; i++) - { - u8 j; - - for (j = 0; j < 3; j++) - { - if (gSelectedOrderFromParty[j] == i + 1) - { - sub_806BC3C(i, j * 14 + 0x1C); - break; - } - } - if (j == 3) - { - if (IsMonAllowedInBattleTower(&gPlayerParty[i]) == TRUE) - sub_806BC3C(i, 0x70); - else - sub_806BC3C(i, 0x7E); - } - } - ewram1B000_alt.setupState++; - break; - case 7: - if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState = 0; - return TRUE; - } - else - { - ewram1B000_alt.monIndex++; - } - break; - } - return FALSE; -} - -static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) -{ - u16 species; - s32 i = 0; - - if (GetMonData(pkmn, MON_DATA_IS_EGG)) - return FALSE; - - if (ewram1B000.unk263 == 0) - { - if (GetMonData(pkmn, MON_DATA_HP) == 0) - return FALSE; - else - return TRUE; - } - - if ((gSaveBlock2.battleTower.battleTowerLevelType) == 0 - && GetMonData(pkmn, MON_DATA_LEVEL) > 50) - return FALSE; - - // Check if the pkmn is in the ban list - species = GetMonData(pkmn, MON_DATA_SPECIES); - while (gBattleTowerBannedSpecies[i] != 0xFFFF) - { - if (gBattleTowerBannedSpecies[i] == species) - return FALSE; - i++; - } - return TRUE; -} - -static u8 sub_81220C8(void) -{ - u8 i; - - if (ewram1B000.unk263 == 0) - return 0xFF; - if (gSelectedOrderFromParty[2] == 0) - return 0x11; - for (i = 0; i < 2; i++) - { - u8 j; - - ewram1B000.unk282 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_SPECIES); - ewram1B000.unk280 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_HELD_ITEM); - for (j = i + 1; j < 3; j++) - { - if (ewram1B000.unk282 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_SPECIES)) - return 0x12; - if (ewram1B000.unk280 != 0 && ewram1B000.unk280 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_HELD_ITEM)) - return 0x13; - } - } - return 0xFF; -} - -//------------------------------------------------------------------------------ -// Battle Tower Entry Menu -//------------------------------------------------------------------------------ - -static void BattleTowerEntryMenuCallback_Summary(u8); -static void BattleTowerEntryMenuCallback_Enter(u8); -static void BattleTowerEntryMenuCallback_NoEntry(u8); -static void BattleTowerEntryMenuCallback_Exit(u8); - -static const struct MenuAction2 sBattleTowerEntryMenuItems[] = -{ - {OtherText_Summary, BattleTowerEntryMenuCallback_Summary}, - {OtherText_Enter2, BattleTowerEntryMenuCallback_Enter}, - {OtherText_NoEntry, BattleTowerEntryMenuCallback_NoEntry}, - {gUnknownText_Exit, BattleTowerEntryMenuCallback_Exit}, -}; - -static const u8 gUnknown_084017D0[] = {1, 0, 3}; -static const u8 gUnknown_084017D3[] = {2, 0, 3}; -static const u8 gUnknown_084017D6[] = {0, 3}; - -static const struct PartyPopupMenu sBattleTowerEntryMenu[] = -{ - {ARRAY_COUNT(gUnknown_084017D0), 9, gUnknown_084017D0}, - {ARRAY_COUNT(gUnknown_084017D3), 9, gUnknown_084017D3}, - {ARRAY_COUNT(gUnknown_084017D6), 9, gUnknown_084017D6}, -}; - - -static bool8 IsPartyMemberAlreadySelected(u8 partyMember) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (gSelectedOrderFromParty[i] == partyMember) - return TRUE; - } - return FALSE; -} - -static void sub_81221F8(u8 taskId) -{ - PrintPartyMenuPromptText(5, 1); - if (IsMonAllowedInBattleTower(&gPlayerParty[gLastFieldPokeMenuOpened]) == TRUE) - { - if (IsPartyMemberAlreadySelected(gLastFieldPokeMenuOpened + 1) == TRUE) - { - gTasks[taskId].data[4] = 1; - ShowPartyPopupMenu(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); - } - else - { - gTasks[taskId].data[4] = 0; - ShowPartyPopupMenu(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); - } - } - else - { - gTasks[taskId].data[4] = 2; - ShowPartyPopupMenu(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); - } -} - -void HandleBattleTowerPartyMenu(u8 taskId) -{ - if (!gPaletteFade.active) - { - switch (HandleBattleTowerPartyMenuInput(taskId)) - { - case A_BUTTON: - PlaySE(SE_SELECT); - gLastFieldPokeMenuOpened = sub_806CA38(taskId); - if (gLastFieldPokeMenuOpened != 6) - { - GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); - sub_81221F8(taskId); - gTasks[taskId].func = sub_812238C; - } - else - { - gTasks[taskId].func = sub_81224A8; - } - sub_808B5B4(taskId); - break; - case B_BUTTON: - PlaySE(SE_SELECT); - ClearPartySelection(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8122450; - break; - } - } -} - -// Handle input -static void sub_812238C(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & 0x40) - { - if (Menu_GetCursorPos() != 0) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - return; - } - if (gMain.newAndRepeatedKeys & 0x80) - { - if (Menu_GetCursorPos() != 3) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - return; - } - if (gMain.newKeys & A_BUTTON) - { - TaskFunc popupMenuFunc; - - PlaySE(SE_SELECT); - popupMenuFunc = PartyMenuGetPopupMenuFunc( - gTasks[taskId].data[4], - sBattleTowerEntryMenu, - sBattleTowerEntryMenuItems, - Menu_GetCursorPos()); - popupMenuFunc(taskId); - return; - } - if (gMain.newKeys & B_BUTTON) - { - BattleTowerEntryMenuCallback_Exit(taskId); - return; - } - } -} - -// Return from menu? -static void sub_8122450(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(gMain.savedCallback); - DestroyTask(taskId); - } -} - -// Wait for A or B press -static void sub_8122480(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - BattleTowerEntryMenuCallback_Exit(taskId); -} - -static void sub_81224A8(u8 taskId) -{ - u8 val = sub_81220C8(); - - if (val != 0xFF) - { - PrintPartyMenuPromptText(val, 0); - gTasks[taskId].func = sub_8122480; - } - else - { - if (gSelectedOrderFromParty[0] != 0) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8122450; - } - else - { - PlaySE(SE_HAZURE); - PrintPartyMenuPromptText(14, 0); - gTasks[taskId].func = sub_8122480; - } - } -} - -// CB2 for menu? -static void sub_8122530(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(ewram1B000.menuHandlerTaskId, gUnknown_020384F0); - ChangeBattleTowerPartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); - GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); - gLastFieldPokeMenuOpened = gUnknown_020384F0; - sub_81221F8(ewram1B000.menuHandlerTaskId); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == 1) - break; - } -} - -static void sub_81225A4(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - SetPartyMenuSettings(PARTY_MENU_TYPE_BATTLE_TOWER, 0xFF, sub_812238C, 5); - SetMainCallback2(sub_8122530); -} - -// Wait for fade, then show summary screen -static void sub_81225D4(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data[0]; - - DestroyTask(taskId); - ewram1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, PSS_MODE_NORMAL); - } -} - -// Summary callback? -static void BattleTowerEntryMenuCallback_Summary(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_81225D4; -} - -static void BattleTowerEntryMenuCallback_Enter(u8 taskId) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (gSelectedOrderFromParty[i] == 0) - { - gSelectedOrderFromParty[i] = gLastFieldPokeMenuOpened + 1; - sub_806BC3C(gLastFieldPokeMenuOpened, i * 14 + 0x1C); - if (i == 2) - SelectBattleTowerOKButton(taskId); - BattleTowerEntryMenuCallback_Exit(taskId); - return; - } - } - PlaySE(SE_HAZURE); - Menu_EraseWindowRect(20, 10, 29, 19); - Menu_DestroyCursor(); - sub_806D5A4(); - sub_806E834(gOtherText_NoMoreThreePoke, 1); - gTasks[taskId].func = sub_8122728; -} - -static void sub_8122728(u8 taskId) -{ - if (gUnknown_0202E8F6 == 1) - return; - - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - Menu_EraseWindowRect(0, 14, 29, 19); - Menu_DestroyCursor(); - BattleTowerEntryMenuCallback_Exit(taskId); - } -} - -static void BattleTowerEntryMenuCallback_NoEntry(u8 taskId) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (gSelectedOrderFromParty[i] == gLastFieldPokeMenuOpened + 1) - { - gSelectedOrderFromParty[i] = 0; - switch (i) - { - case 0: - gSelectedOrderFromParty[0] = gSelectedOrderFromParty[1]; - gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; - gSelectedOrderFromParty[2] = 0; - break; - case 1: - gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; - gSelectedOrderFromParty[2] = 0; - break; - } - break; // exit loop - } - } - sub_806BC3C(gLastFieldPokeMenuOpened, 0x70); - if (gSelectedOrderFromParty[0] != 0) - sub_806BC3C(gSelectedOrderFromParty[0] - 1, 0x1C); - if (gSelectedOrderFromParty[1] != 0) - sub_806BC3C(gSelectedOrderFromParty[1] - 1, 0x2A); - BattleTowerEntryMenuCallback_Exit(taskId); -} - -static void sub_81227FC(u8 taskId) -{ - Menu_EraseWindowRect(20, 10, 29, 19); - Menu_DestroyCursor(); - PrintPartyMenuPromptText(0, 0); - gTasks[taskId].func = HandleBattleTowerPartyMenu; -} - -static void BattleTowerEntryMenuCallback_Exit(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_81227FC(taskId); -} - -#if DEBUG - -void debug_sub_81381B4(void) -{ - u8 i; - - memset(gUnknown_02023A00, 0, sizeof(gUnknown_02023A00)); - for (i = 0; i < 3; i++) - { - gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[3 + i], MON_DATA_SPECIES2); - if (gUnknown_02023A00[i].species != 0) - { - gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[3 + i], MON_DATA_LEVEL); - gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[3 + i], MON_DATA_HP); - gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[3 + i], MON_DATA_MAX_HP); - gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[3 + i], MON_DATA_STATUS); - gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM); - gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[3 + i], MON_DATA_PERSONALITY); - gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[3 + i]); - GetMonData(&gPlayerParty[3 + i], MON_DATA_NICKNAME, gUnknown_02023A00[i].nickname); - Text_StripExtCtrlCodes(gUnknown_02023A00[i].nickname); - gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[3 + i], MON_DATA_LANGUAGE); - } - } -} - -#endif - -bool8 SetupLinkMultiBattlePartyMenu(void) -{ - switch (ewram1B000_alt.setupState) - { - case 0: - sub_81228E8(ewram1B000_alt.menuHandlerTaskId); - ewram1B000_alt.setupState++; - break; - case 1: - LoadHeldItemIconGraphics(); - ewram1B000_alt.setupState++; - break; - case 2: - sub_8122950(ewram1B000_alt.menuHandlerTaskId); - ewram1B000_alt.setupState++; - break; - case 3: - sub_81229B8(); - ewram1B000_alt.setupState++; - break; - case 4: - sub_806B908(); - return TRUE; - } - return FALSE; -} - -static void sub_81228E8(u8 a) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) - CreatePartyMenuMonIcon(a, i, 3, &gPlayerParty[i]); - if (gUnknown_02023A00[i].species != 0) - { - CreateMonIcon_LinkMultiBattle(a, i + 3, 3, &gUnknown_02023A00[i]); - sub_806D50C(a, i + 3); - } - } -} - -static void sub_8122950(u8 a) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) - { - u16 item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - - CreateHeldItemIcon_806DCD4(a, i, item); - } - if (gUnknown_02023A00[i].species != 0) - CreateHeldItemIcon_806DCD4(a, i + 3, gUnknown_02023A00[i].heldItem); - } -} - -static void sub_81229B8(void) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) - { - u8 status; - - PartyMenuPrintHP(i, 3, &gPlayerParty[i]); - status = GetMonStatusAndPokerus(&gPlayerParty[i]); - if (status != 0 && status != 6) - PartyMenuPutStatusTilemap(i, 3, status - 1); - else - PartyMenuPrintLevel(i, 3, &gPlayerParty[i]); - PartyMenuPrintGenderIcon(i, 3, &gPlayerParty[i]); - PrintPartyMenuMonNickname(i, 3, &gPlayerParty[i]); - PartyMenuDrawHPBar(i, 3, &gPlayerParty[i]); - } - } -} - -void HandleLinkMultiBattlePartyMenu(u8 taskId) -{ - if (!gPaletteFade.active) - { - gTasks[taskId].data[0] = 30; - sub_806D4AC(taskId, gUnknown_02023A00[0].species, 0); - sub_806D4AC(taskId, gUnknown_02023A00[1].species, 1); - sub_806D4AC(taskId, gUnknown_02023A00[2].species, 2); - gTasks[taskId].func = sub_8122AB8; - ewram1B000.unk261 = 1; - } -} - -static void sub_8122AB8(u8 taskId) -{ - sub_806D3B4(taskId, gUnknown_02023A00[1].species, gUnknown_02023A00[2].species); - if (gTasks[taskId].data[0] == 0) - { - gTasks[taskId].func = sub_8122B10; - ewram1B000.unk261 = 2; - PlaySE(SE_W231); - } -} - -static void sub_8122B10(u8 taskId) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - if (gUnknown_02023A00[i].species != 0) - { - u8 r2; - - PartyMenuDoPrintHP(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); - if (gUnknown_02023A00[i].hp == 0) - r2 = 7; - else - r2 = pokemon_ailments_get_primary(gUnknown_02023A00[i].status); - if (r2 != 0) - PartyMenuPutStatusTilemap(i + 3, 3, r2 - 1); - else - PartyMenuDoPrintLevel(i + 3, 3, gUnknown_02023A00[i].level); - PartyMenuDoPrintGenderIcon(gUnknown_02023A00[i].species, gUnknown_02023A00[i].gender, 3, i + 3, gUnknown_02023A00[i].nickname); - StringCopy(gStringVar1, gUnknown_02023A00[i].nickname); - StringGetEnd10(gStringVar1); - SanitizeNameString(gStringVar1); - PartyMenuDoPrintMonNickname(i + 3, 3, gStringVar1); - PartyMenuDoDrawHPBar(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); - } - } - gTasks[taskId].func = sub_8122C18; - gTasks[taskId].data[0] = 0; -} - -static void sub_8122C18(u8 taskId) -{ - gTasks[taskId].data[0]++; - if (gTasks[taskId].data[0] == 256) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8122450; - } -} - -// Exactly the same as SetupBattleTowerPartyMenu except for case 6 -bool8 unref_sub_8122C60(void) -{ - switch (ewram1B000_alt.setupState) - { - case 0: - if (ewram1B000_alt.monIndex < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); - ewram1B000_alt.monIndex++; - } - else - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - ewram1B000_alt.setupState++; - break; - case 2: - CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); - ewram1B000_alt.setupState++; - break; - case 3: - if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) == 1) - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState++; - } - else - { - ewram1B000_alt.monIndex++; - } - break; - case 4: - PartyMenuPrintMonsLevelOrStatus(); - ewram1B000_alt.setupState++; - break; - case 5: - PrintPartyMenuMonNicknames(); - ewram1B000_alt.setupState++; - break; - case 6: - sub_806BCE8(); - ewram1B000_alt.setupState++; - break; - case 7: - if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState = 0; - return TRUE; - } - else - { - ewram1B000_alt.monIndex++; - } - break; - } - return FALSE; -} - -//------------------------------------------------------------------------------ -// Daycare Pokemon Storage Menu -//------------------------------------------------------------------------------ - -static void DaycareStorageMenuCallback_Store(u8); -static void DaycareStorageMenuCallback_Summary(u8); -static void DaycareStorageMenuCallback_Exit(u8); - -static const struct MenuAction2 sDaycareStorageMenuItems[] = -{ - {OtherText_Store, DaycareStorageMenuCallback_Store}, - {OtherText_Summary, DaycareStorageMenuCallback_Summary}, - {gUnknownText_Exit, DaycareStorageMenuCallback_Exit}, -}; - -static const u8 gUnknown_08401808[] = {0, 1, 2}; -static const u8 gUnknown_0840180B[] = {1, 2}; - -static const struct PartyPopupMenu sDaycareStorageMenus[] = -{ - {ARRAY_COUNT(gUnknown_08401808), 9, gUnknown_08401808}, - {ARRAY_COUNT(gUnknown_0840180B), 9, gUnknown_0840180B}, -}; - -static void sub_8122D94(u8 taskId) -{ - if (!GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) - { - gTasks[taskId].data[4] = 0; - ShowPartyPopupMenu(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); - } - else - { - gTasks[taskId].data[4] = 1; - ShowPartyPopupMenu(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); - } -} - -void HandleDaycarePartyMenu(u8 taskId) -{ - if (!gPaletteFade.active) - { - switch (HandleDefaultPartyMenuInput(taskId)) - { - case A_BUTTON: - PlaySE(SE_SELECT); - gLastFieldPokeMenuOpened = sub_806CA38(taskId); - GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); - sub_8122D94(taskId); - gTasks[taskId].func = Task_DaycareStorageMenu8122EAC; - break; - case B_BUTTON: - PlaySE(SE_SELECT); - gLastFieldPokeMenuOpened = 0xFF; - gSpecialVar_0x8004 = 0xFF; - sub_8123138(taskId); - break; - } - } -} - -static void Task_DaycareStorageMenu8122EAC(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & 0x40) - { - if (Menu_GetCursorPos() != 0) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - return; - } - if (gMain.newAndRepeatedKeys & 0x80) - { - if (Menu_GetCursorPos() != 3) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - return; - } - if (gMain.newKeys & A_BUTTON) - { - TaskFunc popupMenuFunc; - - PlaySE(SE_SELECT); - popupMenuFunc = PartyMenuGetPopupMenuFunc( - gTasks[taskId].data[4], - sDaycareStorageMenus, - sDaycareStorageMenuItems, - Menu_GetCursorPos()); - popupMenuFunc(taskId); - return; - } - if (gMain.newKeys & B_BUTTON) - { - DaycareStorageMenuCallback_Exit(taskId); - return; - } - } -} - -static void DaycareStorageMenuCallback_Store(u8 taskId) -{ - gSpecialVar_0x8004 = gLastFieldPokeMenuOpened; - sub_8123138(taskId); -} - -static void sub_8122F90(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(ewram1B000.menuHandlerTaskId, gUnknown_020384F0); - ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); - GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); - gLastFieldPokeMenuOpened = gUnknown_020384F0; - sub_8122D94(ewram1B000.menuHandlerTaskId); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == 1) - break; - } -} - -static void sub_8123004(void) -{ - gPaletteFade.bufferTransferDisabled = TRUE; - SetPartyMenuSettings(PARTY_MENU_TYPE_DAYCARE, 0xFF, Task_DaycareStorageMenu8122EAC, 5); - SetMainCallback2(sub_8122F90); -} - -static void sub_8123034(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data[0]; - - DestroyTask(taskId); - ewram1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, PSS_MODE_NORMAL); - } -} - -static void DaycareStorageMenuCallback_Summary(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8123034; -} - -static void DaycareStorageMenuCallback_Exit(u8 taskId) -{ - PlaySE(SE_SELECT); - Menu_EraseWindowRect(20, 10, 29, 19); - Menu_DestroyCursor(); - PrintPartyMenuPromptText(15, 0); - gTasks[taskId].func = HandleDaycarePartyMenu; -} - -void sub_8123138(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8123170; -} - -static void sub_8123170(u8 taskId) -{ - if (!gPaletteFade.active) - { - gFieldCallback = sub_81231AC; - SetMainCallback2(c2_exit_to_overworld_2_switch); - DestroyTask(taskId); - } -} - -// Do these last two functions really belong in here? - -static void sub_81231C4(u8); - -void sub_81231AC(void) -{ - pal_fill_black(); - CreateTask(sub_81231C4, 10); -} - -static void sub_81231C4(u8 taskId) -{ - if (IsWeatherNotFadingIn() == TRUE) - { - DestroyTask(taskId); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - } -} diff --git a/src/field/coins.c b/src/field/coins.c deleted file mode 100644 index 2c217e635..000000000 --- a/src/field/coins.c +++ /dev/null @@ -1,84 +0,0 @@ -#include "global.h" -#include "coins.h" -#include "menu.h" -#include "string_util.h" -#include "strings.h" - -#define MAX_COINS 9999 - -void UpdateCoinsWindow(s32 coins, u8 x, u8 y) -{ - PrintCoins(coins, 4, x + 2, y + 1); -} - -void ShowCoinsWindow(u32 coins, u8 x, u8 y) -{ - Menu_DrawStdWindowFrame(x, y, x + 9, y + 3); - UpdateCoinsWindow(coins, x, y); -} - -void HideCoinsWindow(u8 x, u8 y) -{ - Menu_EraseWindowRect(x, y, x + 9, y + 3); -} - -void PrintCoins(s32 coins, u8 b, u8 x, u8 y) -{ - u8 string[16]; - u8 *ptr; - u8 r1; - u8 foo; - - ConvertIntToDecimalString(string, coins); - r1 = (b * 6 + 0x21 - 8 * (b + 2)); - x = x - r1 / 8; - foo = r1 % 8; - ptr = gStringVar1; - if (foo) - { - ptr[0] = EXT_CTRL_CODE_BEGIN; - ptr[1] = 0x11; - ptr[2] = 8 - (foo); - ptr += 3; - } - ptr[0] = EXT_CTRL_CODE_BEGIN; - ptr[1] = 0x11; - ptr[2] = (b - StringLength(string)) * 6; - ptr += 3; - StringCopy(ptr, string); - Menu_PrintText(gOtherText_Coins2, x, y); -} - -u16 GetCoins(void) -{ - return gSaveBlock1.coins; -} - -bool8 GiveCoins(u16 coins) -{ - u32 newCoins; - - if (GetCoins() >= MAX_COINS) - return FALSE; - newCoins = coins + gSaveBlock1.coins; - if (gSaveBlock1.coins > (u16)newCoins) - gSaveBlock1.coins = MAX_COINS; - else - { - gSaveBlock1.coins = newCoins; - if ((u16)newCoins > MAX_COINS) - gSaveBlock1.coins = MAX_COINS; - } - return TRUE; -} - -bool8 TakeCoins(u16 coins) -{ - if (GetCoins() >= coins) - { - gSaveBlock1.coins -= coins; - return TRUE; - } - else - return FALSE; -} diff --git a/src/field/coord_event_weather.c b/src/field/coord_event_weather.c deleted file mode 100644 index 60b87fa30..000000000 --- a/src/field/coord_event_weather.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "global.h" -#include "constants/weather.h" -#include "coord_event_weather.h" -#include "field_weather.h" - -struct CoordEventWeather -{ - u8 coordEventWeather; - void (*func)(void); -}; - -static void CoordEventWeather_Clouds(void); -static void CoordEventWeather_Sunny(void); -static void CoordEventWeather_LightRain(void); -static void CoordEventWeather_Snow(void); -static void CoordEventWeather_Thunderstorm(void); -static void CoordEventWeather_Fog(void); -static void CoordEventWeather_DiagonalFog(void); -static void CoordEventWeather_Ash(void); -static void CoordEventWeather_Sandstorm(void); -static void CoordEventWeather_Dark(void); -static void CoordEventWeather_Drought(void); -static void CoordEventWeather_Route119Cycle(void); -static void CoordEventWeather_Route123Cycle(void); - -static const struct CoordEventWeather sCoordEventWeatherFuncs[] = -{ - { COORD_EVENT_WEATHER_CLOUDS, CoordEventWeather_Clouds }, - { COORD_EVENT_WEATHER_SUNNY, CoordEventWeather_Sunny }, - { COORD_EVENT_WEATHER_RAIN_LIGHT, CoordEventWeather_LightRain }, - { COORD_EVENT_WEATHER_SNOW, CoordEventWeather_Snow }, - { COORD_EVENT_WEATHER_RAIN_MED, CoordEventWeather_Thunderstorm }, - { COORD_EVENT_WEATHER_FOG_1, CoordEventWeather_Fog }, - { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog }, - { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash }, - { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm }, - { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark }, - { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought }, - { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle }, - { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle }, -}; - -static void CoordEventWeather_Clouds(void) -{ - SetWeather(WEATHER_CLOUDS); -} - -static void CoordEventWeather_Sunny(void) -{ - SetWeather(WEATHER_SUNNY); -} - -static void CoordEventWeather_LightRain(void) -{ - SetWeather(WEATHER_RAIN_LIGHT); -} - -static void CoordEventWeather_Snow(void) -{ - SetWeather(WEATHER_SNOW); -} - -static void CoordEventWeather_Thunderstorm(void) -{ - SetWeather(WEATHER_RAIN_MED); -} - -static void CoordEventWeather_Fog(void) -{ - SetWeather(WEATHER_FOG_1); -} - -static void CoordEventWeather_DiagonalFog(void) -{ - SetWeather(WEATHER_FOG_2); -} - -static void CoordEventWeather_Ash(void) -{ - SetWeather(WEATHER_ASH); -} - -static void CoordEventWeather_Sandstorm(void) -{ - SetWeather(WEATHER_SANDSTORM); -} - -static void CoordEventWeather_Dark(void) -{ - SetWeather(WEATHER_SHADE); -} - -static void CoordEventWeather_Drought(void) -{ - SetWeather(WEATHER_DROUGHT); -} - -static void CoordEventWeather_Route119Cycle(void) -{ - SetWeather(WEATHER_ROUTE119_CYCLE); -} - -static void CoordEventWeather_Route123Cycle(void) -{ - SetWeather(WEATHER_ROUTE123_CYCLE); -} - -void DoCoordEventWeather(u8 coordEventWeather) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++) - { - if (sCoordEventWeatherFuncs[i].coordEventWeather == coordEventWeather) - { - sCoordEventWeatherFuncs[i].func(); - return; - } - } -} diff --git a/src/field/daycare.c b/src/field/daycare.c deleted file mode 100644 index da0838d29..000000000 --- a/src/field/daycare.c +++ /dev/null @@ -1,1713 +0,0 @@ -#include "global.h" -#include "daycare.h" -#include "event_data.h" -#include "field_effect.h" -#include "constants/items.h" -#include "mail_data.h" -#include "main.h" -#include "menu.h" -#include "constants/moves.h" -#include "name_string_util.h" -#include "overworld.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_storage_system.h" -#include "random.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "string_util.h" -#include "strings2.h" -#include "text.h" -#include "trade.h" - -// RAM buffers used to assist with BuildEggMoveset() -IWRAM_DATA u16 gHatchedEggLevelUpMoves[52]; -IWRAM_DATA u16 gHatchedEggFatherMoves[4]; -IWRAM_DATA u16 gHatchedEggFinalMoves[4]; -IWRAM_DATA u16 gHatchedEggEggMoves[12]; -IWRAM_DATA u16 gHatchedEggMotherMoves[4]; - -extern u16 gMoveToLearn; - -static void ClearDaycareMail(struct DayCareMail *); -static void SetInitialEggData(struct Pokemon *, u16, struct DayCare *); -static u8 GetDaycareCompatibilityScore(struct DayCare *); - -#include "../data/pokemon/egg_moves.h" - -static const u8 *const sCompatibilityMessages[] = { - DaycareText_GetAlongVeryWell, - DaycareText_GetAlong, - DaycareText_DontLikeOther, - DaycareText_PlayOther -}; - -const u8 sJapaneseEggNickname[] = _("タマゴ"); - -u8 *GetMonNick(struct Pokemon *mon, u8 *dest) -{ - s8 nickname[POKEMON_NAME_LENGTH * 2]; - - GetMonData(mon, MON_DATA_NICKNAME, nickname); - return StringCopy10(dest, nickname); -} - -u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest) -{ - s8 nickname[POKEMON_NAME_LENGTH * 2]; - - GetBoxMonData(mon, MON_DATA_NICKNAME, nickname); - return StringCopy10(dest, nickname); -} - -u8 CountPokemonInDaycare(struct DayCare *daycare) -{ - u8 i, count; - count = 0; - - for (i = 0; i < 2; i++) - { - if (GetBoxMonData(&daycare->mons[i], MON_DATA_SPECIES) != 0) - count++; - } - - return count; -} - -void InitDaycareMailRecordMixing(struct BoxPokemon * daycareMons, struct RecordMixingDayCareMail * daycareMail) -{ - u8 i; - u8 numDaycareMons = 0; - - for (i = 0; i < 2; i++) - { - if (GetBoxMonData(&daycareMons[i], MON_DATA_SPECIES) != SPECIES_NONE) - { - numDaycareMons++; - if (GetBoxMonData(&daycareMons[i], MON_DATA_HELD_ITEM) == ITEM_NONE) - { - daycareMail->itemsHeld[i] = 0; - } - else - { - daycareMail->itemsHeld[i] = 1; - } - } - else - { - daycareMail->itemsHeld[i] = 1; - } - } - - daycareMail->numDaycareMons = numDaycareMons; -} - -static s8 Daycare_FindEmptySpot(struct BoxPokemon * daycareMons) -{ - u8 i; - - for (i = 0; i < 2; i++) - { - if (GetBoxMonData(&daycareMons[i], MON_DATA_SPECIES) == 0) - return i; - } - - return -1; -} - -static void StorePokemonInDaycare(struct Pokemon * mon, struct DayCare * daycare) -{ - s8 emptySlot; - u8 mail; - u8 *names; - - emptySlot = Daycare_FindEmptySpot(daycare->mons); - if (MonHasMail(mon)) - { - StringCopy((names = daycare->misc.mail[emptySlot].names), gSaveBlock2.playerName); - PadNameString(names, 0xFC); - names += 8; - GetMonNick(mon, names); - mail = GetMonData(mon, MON_DATA_MAIL); - daycare->misc.mail[emptySlot].message = gSaveBlock1.mail[mail]; - TakeMailFromMon(mon); - } - - daycare->mons[emptySlot] = mon->box; - BoxMonRestorePP(&daycare->mons[emptySlot]); - daycare->misc.countersEtc.steps[emptySlot] = 0; - ZeroMonData(mon); - party_compaction(); - CalculatePlayerPartyCount(); -} - -void StoreSelectedPokemonInDaycare(void) -{ - StorePokemonInDaycare(&gPlayerParty[gLastFieldPokeMenuOpened], &gSaveBlock1.daycare); -} - -// Shifts the second daycare pokemon slot into the first slot. -static void ShiftDaycareSlots(struct DayCare * daycare) -{ - // This condition is only satisfied when the player takes out the first pokemon from the daycare. - if (GetBoxMonData(&daycare->mons[1], MON_DATA_SPECIES) != 0 && GetBoxMonData(&daycare->mons[0], MON_DATA_SPECIES) == 0) - { - daycare->mons[0] = daycare->mons[1]; - ZeroBoxMonData(&daycare->mons[1]); - - daycare->misc.mail[0] = daycare->misc.mail[1]; - daycare->misc.countersEtc.steps[0] = daycare->misc.countersEtc.steps[1]; - daycare->misc.countersEtc.steps[1] = 0; - ClearDaycareMail(&daycare->misc.mail[1]); - } -} - -static void ApplyDaycareExperience(struct Pokemon * mon) -{ - s32 i; - bool8 firstMove; - u16 learnedMove; - - for (i = 0; i < MAX_LEVEL; i++) - { - // Add the mon's gained daycare experience level by level until it can't level up anymore. - if (TryIncrementMonLevel(mon)) - { - // Teach the mon new moves it learned while in the daycare. - firstMove = TRUE; - while ((learnedMove = MonTryLearningNewMove(mon, firstMove)) != 0) - { - firstMove = FALSE; - if (learnedMove == 0xffff) - { - // Mon already knows 4 moves. - DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn); - } - } - } - else - { - break; - } - } - - // Re-calculate the mons stats at its new level. - CalculateMonStats(mon); -} - -static u16 TakeSelectedPokemonFromDaycare(struct DayCare * daycare, u8 slot) -{ - u16 species; - u32 experience; - struct Pokemon pokemon; - - GetBoxMonNick(&daycare->mons[slot], gStringVar1); - species = GetBoxMonData(&daycare->mons[slot], MON_DATA_SPECIES); - ExpandBoxMon(&daycare->mons[slot], &pokemon); - - if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) - { - experience = GetMonData(&pokemon, MON_DATA_EXP) + daycare->misc.countersEtc.steps[slot]; - SetMonData(&pokemon, MON_DATA_EXP, &experience); - ApplyDaycareExperience(&pokemon); - } - - gPlayerParty[PARTY_SIZE - 1] = pokemon; - if (daycare->misc.mail[slot].message.itemId) - { - GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycare->misc.mail[slot].message); - ClearDaycareMail(&daycare->misc.mail[slot]); - } - - party_compaction(); - ZeroBoxMonData(&daycare->mons[slot]); - daycare->misc.countersEtc.steps[slot] = 0; - ShiftDaycareSlots(daycare); - CalculatePlayerPartyCount(); - return species; -} - -u16 TakePokemonFromDaycare(void) -{ - return TakeSelectedPokemonFromDaycare(&gSaveBlock1.daycare, gSpecialVar_0x8004); -} - -static u8 GetLevelAfterDaycareSteps(struct BoxPokemon * mon, u32 steps) -{ - struct BoxPokemon tempMon = *mon; - - u32 experience = GetBoxMonData(mon, MON_DATA_EXP) + steps; - SetBoxMonData(&tempMon, MON_DATA_EXP, &experience); - return GetLevelFromBoxMonExp(&tempMon); -} - -static u8 GetNumLevelsGainedFromSteps(struct DayCare *daycare, u8 slot) -{ - u8 levelBefore; - u8 levelAfter; - - levelBefore = GetLevelFromBoxMonExp(&daycare->mons[slot]); - levelAfter = GetLevelAfterDaycareSteps(&daycare->mons[slot], daycare->misc.countersEtc.steps[slot]); - return levelAfter - levelBefore; -} - -static u8 GetNumLevelsGainedForDaycareSlot(struct DayCare *daycare, u8 slot) -{ - u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycare, slot); - GetBoxMonNick(&daycare->mons[slot], gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, numLevelsGained, STR_CONV_MODE_LEFT_ALIGN, 2); - return numLevelsGained; -} - -static u16 GetDaycareCostForSelectedMon(struct DayCare *daycare, u8 slot) -{ - u16 cost; - - u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycare, slot); - GetBoxMonNick(&daycare->mons[slot], gStringVar1); - cost = 100 + 100 * numLevelsGained; - ConvertIntToDecimalStringN(gStringVar2, cost, STR_CONV_MODE_LEFT_ALIGN, 5); - return cost; -} - -void GetDaycareCost(void) -{ - gSpecialVar_0x8005 = GetDaycareCostForSelectedMon(&gSaveBlock1.daycare, gSpecialVar_0x8004); -} - -void Debug_AddDaycareSteps(u16 numSteps) -{ - gSaveBlock1.daycare.misc.countersEtc.steps[0] += numSteps; - gSaveBlock1.daycare.misc.countersEtc.steps[1] += numSteps; -} - -u8 GetNumLevelsGainedFromDaycare(void) -{ - if (GetBoxMonData(&gSaveBlock1.daycare.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0) - return GetNumLevelsGainedForDaycareSlot(&gSaveBlock1.daycare, gSpecialVar_0x8004); - - return 0; -} - -static void ClearDaycareMail(struct DayCareMail *mail) -{ - u8 *names; - u8 *names2; - s32 i; - u8 zero = 0; - - for (i = 7, names = &mail->names[7]; i >= 0; i--) - { - *names-- = zero; - } - - names2 = &mail->names[8]; - zero = 0; - names = &mail->names[18]; - do *names-- = zero; while ((s32)names >= (s32)names2); - ClearMailStruct(&mail->message); -} - -void unref_sub_8041824(struct DayCare *daycare) -{ - u8 slot; - for (slot = 0; slot < ARRAY_COUNT(daycare->mons); slot++) - { - ZeroBoxMonData(&daycare->mons[slot]); - daycare->misc.countersEtc.steps[slot] = 0; - ClearDaycareMail(&daycare->misc.mail[slot]); - } - - daycare->misc.countersEtc.pendingEggPersonality = 0; - daycare->misc.countersEtc.eggCycleStepsRemaining = 0; -} - -// Determines what the species of an Egg would be based on the given species. -// It determines this by working backwards through the evolution chain of the -// given species. -u16 GetEggSpecies(u16 species) -{ - int i, j, k; - bool8 found; - - // Working backwards up to 5 times seems arbitrary, since the maximum number - // of times would only be 3 for 3-stage evolutions. - for (i = 0; i < 5; i++) - { - found = FALSE; - for (j = 1; j < NUM_SPECIES; j++) - { - for (k = 0; k < 5; k++) - { - if (gEvolutionTable[j][k].targetSpecies == species) - { - species = j; - found = TRUE; - break; - } - } - - if (found) - break; - } - - if (j == NUM_SPECIES) - break; - } - - return species; -} - -static void _TriggerPendingDaycareEgg(struct DayCare *daycare) -{ - daycare->misc.countersEtc.pendingEggPersonality = (Random() % 0xfffe) + 1; - FlagSet(FLAG_PENDING_DAYCARE_EGG); -} - -static void _TriggerPendingDaycareMaleEgg(struct DayCare *daycare) -{ - daycare->misc.countersEtc.pendingEggPersonality = Random() | 0x8000; - FlagSet(FLAG_PENDING_DAYCARE_EGG); -} - -void TriggerPendingDaycareEgg(void) -{ - _TriggerPendingDaycareEgg(&gSaveBlock1.daycare); -} - -void TriggerPendingDaycareMaleEgg(void) -{ - _TriggerPendingDaycareMaleEgg(&gSaveBlock1.daycare); -} - -// Removes the selected index from the given IV list and shifts the remaining -// elements to the left. -static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) -{ - s32 i, j; - u8 temp[NUM_STATS]; - - ivs[selectedIv] = 0xff; - for (i = 0; i < NUM_STATS; i++) - { - temp[i] = ivs[i]; - } - - j = 0; - for (i = 0; i < NUM_STATS; i++) - { - if (temp[i] != 0xff) - ivs[j++] = temp[i]; - } -} - -static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare) -{ - u8 i; - u8 selectedIvs[3]; - u8 availableIVs[NUM_STATS]; - u8 whichParent[ARRAY_COUNT(selectedIvs)]; - u8 iv; - - // Initialize a list of IV indices. - for (i = 0; i < NUM_STATS; i++) - { - availableIVs[i] = i; - } - - // Select the 3 IVs that will be inherited. - for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) - { - // Randomly pick an IV from the available list. - selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)]; - - // Remove the selected IV index from the available IV indicies. - RemoveIVIndexFromList(availableIVs, selectedIvs[i]); - } - - // Determine which parent each of the selected IVs should inherit from. - for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) - { - whichParent[i] = Random() % 2; - } - - // Set each of inherited IVs on the egg mon. - for (i = 0; i < ARRAY_COUNT(selectedIvs); i++) - { - switch (selectedIvs[i]) - { - case 0: - iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_HP_IV); - SetMonData(egg, MON_DATA_HP_IV, &iv); - break; - case 1: - iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_ATK_IV); - SetMonData(egg, MON_DATA_ATK_IV, &iv); - break; - case 2: - iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_DEF_IV); - SetMonData(egg, MON_DATA_DEF_IV, &iv); - break; - case 3: - iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPEED_IV); - SetMonData(egg, MON_DATA_SPEED_IV, &iv); - break; - case 4: - iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPATK_IV); - SetMonData(egg, MON_DATA_SPATK_IV, &iv); - break; - case 5: - iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPDEF_IV); - SetMonData(egg, MON_DATA_SPDEF_IV, &iv); - break; - } - } -} - -#ifdef NONMATCHING -static -#endif -// Counts the number of egg moves a pokemon learns and stores the moves in -// the given array. -u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves) -{ - u16 eggMoveIdx; - u16 numEggMoves; - u16 species; - u16 i; - - numEggMoves = 0; - eggMoveIdx = 0; - species = GetMonData(pokemon, MON_DATA_SPECIES); - for (i = 0; i < ARRAY_COUNT(gEggMoves) - 1; i++) - { - if (gEggMoves[i] == species + EGG_MOVES_SPECIES_OFFSET) - { - eggMoveIdx = i + 1; - break; - } - } - - for (i = 0; i < 10; i++) - { - if (gEggMoves[eggMoveIdx + i] > EGG_MOVES_SPECIES_OFFSET) - { - // TODO: the curly braces around this if statement are required for a matching build. - break; - } - - eggMoves[i] = gEggMoves[eggMoveIdx + i]; - numEggMoves++; - } - - return numEggMoves; -} - -#ifdef NONMATCHING -void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother) -{ - u16 numSharedParentMoves; - u8 numLevelUpMoves; - u16 numEggMoves; - u16 i, j; - - numSharedParentMoves = 0; - for (i = 0; i < 4; i++) - { - gHatchedEggMotherMoves[i] = 0; - gHatchedEggFatherMoves[i] = 0; - gHatchedEggFinalMoves[i] = 0; - } - for (i = 0; i < 10; i++) - gHatchedEggEggMoves[i] = 0; - for (i = 0; i < 50; i++) - gHatchedEggLevelUpMoves[i] = 0; - - numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), gHatchedEggLevelUpMoves); - for (i = 0; i < 4; i++) - { - gHatchedEggFatherMoves[i] = GetBoxMonData(father, MON_DATA_MOVE1 + i); - gHatchedEggMotherMoves[i] = GetBoxMonData(mother, MON_DATA_MOVE1 + i); - } - - numEggMoves = GetEggMoves(egg, gHatchedEggEggMoves); - - for (i = 0; i < 4; i++) - { - if (gHatchedEggFatherMoves[i] != MOVE_NONE) - { - for (j = 0; j < (u32)numEggMoves; j++) - { - if (gHatchedEggFatherMoves[i] == gHatchedEggEggMoves[j]) - { - if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff) - DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]); - break; - } - } - } - else - break; - } - for (i = 0; i < 4; i++) - { - if (gHatchedEggFatherMoves[i] != MOVE_NONE) - { - for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) - { - if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01_FOCUS_PUNCH + j) && CanMonLearnTMHM(egg, j)) - { - if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff) - DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]); - } - } - } - } - for (i = 0; i < 4; i++) - { - if (gHatchedEggFatherMoves[i] == MOVE_NONE) - break; - for (j = 0; j < 4; j++) - { - if (gHatchedEggFatherMoves[i] == gHatchedEggMotherMoves[j] && gHatchedEggFatherMoves[i] != MOVE_NONE) - gHatchedEggFinalMoves[numSharedParentMoves++] = gHatchedEggFatherMoves[i]; - } - } - - for (i = 0; i < 4; i++) - { - if (gHatchedEggFinalMoves[i] == MOVE_NONE) - break; - for (j = 0; j < numLevelUpMoves; j++) - { - if (gHatchedEggLevelUpMoves[j] != MOVE_NONE && gHatchedEggFinalMoves[i] == gHatchedEggLevelUpMoves[j]) - { - if (GiveMoveToMon(egg, gHatchedEggFinalMoves[i]) == 0xffff) - DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFinalMoves[i]); - break; - } - } - } -} -#else -__attribute__((naked)) -void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0xC\n" - "\tadds r7, r0, 0\n" - "\tmov r10, r1\n" - "\tmov r9, r2\n" - "\tmovs r0, 0\n" - "\tstr r0, [sp]\n" - "\tmovs r6, 0\n" - "\tldr r5, _08041CC8 @ =gHatchedEggMotherMoves\n" - "\tmovs r2, 0\n" - "\tldr r4, _08041CCC @ =gHatchedEggFatherMoves\n" - "\tldr r3, _08041CD0 @ =gHatchedEggFinalMoves\n" - "_08041BE4:\n" - "\tlsls r1, r6, 1\n" - "\tadds r0, r1, r5\n" - "\tstrh r2, [r0]\n" - "\tadds r0, r1, r4\n" - "\tstrh r2, [r0]\n" - "\tadds r1, r3\n" - "\tstrh r2, [r1]\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tcmp r6, 0x3\n" - "\tbls _08041BE4\n" - "\tmovs r6, 0\n" - "\tldr r2, _08041CD4 @ =gHatchedEggEggMoves\n" - "\tmovs r1, 0\n" - "_08041C02:\n" - "\tlsls r0, r6, 1\n" - "\tadds r0, r2\n" - "\tstrh r1, [r0]\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tcmp r6, 0x9\n" - "\tbls _08041C02\n" - "\tmovs r6, 0\n" - "\tldr r2, _08041CD8 @ =gHatchedEggLevelUpMoves\n" - "\tmovs r1, 0\n" - "_08041C18:\n" - "\tlsls r0, r6, 1\n" - "\tadds r0, r2\n" - "\tstrh r1, [r0]\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tcmp r6, 0x31\n" - "\tbls _08041C18\n" - "\tadds r0, r7, 0\n" - "\tmovs r1, 0xB\n" - "\tbl GetMonData\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tldr r1, _08041CD8 @ =gHatchedEggLevelUpMoves\n" - "\tbl GetLevelUpMovesBySpecies\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r6, 0\n" - "\tldr r1, _08041CCC @ =gHatchedEggFatherMoves\n" - "\tmov r8, r1\n" - "_08041C46:\n" - "\tadds r5, r6, 0\n" - "\tadds r5, 0xD\n" - "\tmov r0, r10\n" - "\tadds r1, r5, 0\n" - "\tbl GetBoxMonData\n" - "\tlsls r4, r6, 1\n" - "\tmov r2, r8\n" - "\tadds r1, r4, r2\n" - "\tstrh r0, [r1]\n" - "\tmov r0, r9\n" - "\tadds r1, r5, 0\n" - "\tbl GetBoxMonData\n" - "\tldr r1, _08041CC8 @ =gHatchedEggMotherMoves\n" - "\tadds r4, r1\n" - "\tstrh r0, [r4]\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tcmp r6, 0x3\n" - "\tbls _08041C46\n" - "\tldr r1, _08041CD4 @ =gHatchedEggEggMoves\n" - "\tadds r0, r7, 0\n" - "\tbl GetEggMoves\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r8, r0\n" - "\tmovs r6, 0\n" - "_08041C82:\n" - "\tldr r0, _08041CCC @ =gHatchedEggFatherMoves\n" - "\tlsls r1, r6, 1\n" - "\tadds r2, r1, r0\n" - "\tldrh r1, [r2]\n" - "\tmov r9, r0\n" - "\tcmp r1, 0\n" - "\tbeq _08041CF8\n" - "\tmovs r5, 0\n" - "\tcmp r5, r8\n" - "\tbcs _08041CEA\n" - "\tadds r4, r2, 0\n" - "\tldr r2, _08041CDC @ =0x0000ffff\n" - "_08041C9A:\n" - "\tldr r0, _08041CD4 @ =gHatchedEggEggMoves\n" - "\tlsls r1, r5, 1\n" - "\tadds r1, r0\n" - "\tldrh r0, [r4]\n" - "\tldrh r1, [r1]\n" - "\tcmp r0, r1\n" - "\tbne _08041CE0\n" - "\tadds r1, r0, 0\n" - "\tadds r0, r7, 0\n" - "\tstr r2, [sp, 0x8]\n" - "\tbl GiveMoveToMon\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tldr r2, [sp, 0x8]\n" - "\tcmp r0, r2\n" - "\tbne _08041CEA\n" - "\tldrh r1, [r4]\n" - "\tadds r0, r7, 0\n" - "\tbl DeleteFirstMoveAndGiveMoveToMon\n" - "\tb _08041CEA\n" - "\t.align 2, 0\n" - "_08041CC8: .4byte gHatchedEggMotherMoves\n" - "_08041CCC: .4byte gHatchedEggFatherMoves\n" - "_08041CD0: .4byte gHatchedEggFinalMoves\n" - "_08041CD4: .4byte gHatchedEggEggMoves\n" - "_08041CD8: .4byte gHatchedEggLevelUpMoves\n" - "_08041CDC: .4byte 0x0000ffff\n" - "_08041CE0:\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, r8\n" - "\tbcc _08041C9A\n" - "_08041CEA:\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tldr r3, _08041E14 @ =gHatchedEggFatherMoves\n" - "\tmov r9, r3\n" - "\tcmp r6, 0x3\n" - "\tbls _08041C82\n" - "_08041CF8:\n" - "\tmovs r6, 0\n" - "_08041CFA:\n" - "\tlsls r0, r6, 1\n" - "\tmov r2, r9\n" - "\tadds r1, r0, r2\n" - "\tldrh r1, [r1]\n" - "\tadds r2, r0, 0\n" - "\tadds r6, 0x1\n" - "\tmov r8, r6\n" - "\tcmp r1, 0\n" - "\tbeq _08041D5C\n" - "\tmovs r5, 0\n" - "\tldr r0, _08041E14 @ =gHatchedEggFatherMoves\n" - "\tadds r4, r2, r0\n" - "\tldr r6, _08041E18 @ =0x0000ffff\n" - "\tmov r9, r0\n" - "_08041D16:\n" - "\tldr r3, _08041E1C @ =0x00000121\n" - "\tadds r0, r5, r3\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl ItemIdToBattleMoveId\n" - "\tldrh r1, [r4]\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r1, r0\n" - "\tbne _08041D52\n" - "\tlsls r1, r5, 24\n" - "\tlsrs r1, 24\n" - "\tadds r0, r7, 0\n" - "\tbl CanMonLearnTMHM\n" - "\tcmp r0, 0\n" - "\tbeq _08041D52\n" - "\tldrh r1, [r4]\n" - "\tadds r0, r7, 0\n" - "\tbl GiveMoveToMon\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, r6\n" - "\tbne _08041D52\n" - "\tldrh r1, [r4]\n" - "\tadds r0, r7, 0\n" - "\tbl DeleteFirstMoveAndGiveMoveToMon\n" - "_08041D52:\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, 0x39\n" - "\tbls _08041D16\n" - "_08041D5C:\n" - "\tmov r1, r8\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r6, r0, 16\n" - "\tcmp r6, 0x3\n" - "\tbls _08041CFA\n" - "\tmovs r6, 0\n" - "\tmov r2, r9\n" - "\tldrh r0, [r2]\n" - "\tldr r3, _08041E20 @ =gHatchedEggFinalMoves\n" - "\tmov r10, r3\n" - "\tcmp r0, 0\n" - "\tbeq _08041DC6\n" - "\tmov r4, r9\n" - "\tldr r0, _08041E24 @ =gHatchedEggMotherMoves\n" - "\tmov r9, r0\n" - "\tmov r12, r10\n" - "_08041D7C:\n" - "\tmovs r5, 0\n" - "\tlsls r2, r6, 1\n" - "\tadds r6, 0x1\n" - "\tmov r8, r6\n" - "\tadds r3, r2, r4\n" - "_08041D86:\n" - "\tlsls r0, r5, 1\n" - "\tadd r0, r9\n" - "\tldrh r2, [r3]\n" - "\tadds r1, r2, 0\n" - "\tldrh r0, [r0]\n" - "\tcmp r1, r0\n" - "\tbne _08041DA8\n" - "\tcmp r1, 0\n" - "\tbeq _08041DA8\n" - "\tldr r1, [sp]\n" - "\tadds r0, r1, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tstr r0, [sp]\n" - "\tlsls r1, 1\n" - "\tadd r1, r12\n" - "\tstrh r2, [r1]\n" - "_08041DA8:\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, 0x3\n" - "\tbls _08041D86\n" - "\tmov r1, r8\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r6, r0, 16\n" - "\tcmp r6, 0x3\n" - "\tbhi _08041DC6\n" - "\tlsls r0, r6, 1\n" - "\tadds r0, r4\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _08041D7C\n" - "_08041DC6:\n" - "\tmovs r6, 0\n" - "\tmov r2, r10\n" - "\tldrh r0, [r2]\n" - "\tcmp r0, 0\n" - "\tbeq _08041E50\n" - "_08041DD0:\n" - "\tmovs r5, 0\n" - "\tadds r3, r6, 0x1\n" - "\tmov r8, r3\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r5, r0\n" - "\tbcs _08041E38\n" - "\tldr r2, _08041E18 @ =0x0000ffff\n" - "_08041DDE:\n" - "\tldr r1, _08041E28 @ =gHatchedEggLevelUpMoves\n" - "\tlsls r0, r5, 1\n" - "\tadds r0, r1\n" - "\tldrh r1, [r0]\n" - "\tcmp r1, 0\n" - "\tbeq _08041E2C\n" - "\tlsls r0, r6, 1\n" - "\tmov r3, r10\n" - "\tadds r4, r0, r3\n" - "\tldrh r0, [r4]\n" - "\tcmp r0, r1\n" - "\tbne _08041E2C\n" - "\tadds r1, r0, 0\n" - "\tadds r0, r7, 0\n" - "\tstr r2, [sp, 0x8]\n" - "\tbl GiveMoveToMon\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tldr r2, [sp, 0x8]\n" - "\tcmp r0, r2\n" - "\tbne _08041E38\n" - "\tldrh r1, [r4]\n" - "\tadds r0, r7, 0\n" - "\tbl DeleteFirstMoveAndGiveMoveToMon\n" - "\tb _08041E38\n" - "\t.align 2, 0\n" - "_08041E14: .4byte gHatchedEggFatherMoves\n" - "_08041E18: .4byte 0x0000ffff\n" - "_08041E1C: .4byte 0x00000121\n" - "_08041E20: .4byte gHatchedEggFinalMoves\n" - "_08041E24: .4byte gHatchedEggMotherMoves\n" - "_08041E28: .4byte gHatchedEggLevelUpMoves\n" - "_08041E2C:\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r5, r0\n" - "\tbcc _08041DDE\n" - "_08041E38:\n" - "\tmov r1, r8\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r6, r0, 16\n" - "\tcmp r6, 0x3\n" - "\tbhi _08041E50\n" - "\tldr r0, _08041E60 @ =gHatchedEggFinalMoves\n" - "\tlsls r1, r6, 1\n" - "\tadds r1, r0\n" - "\tldrh r1, [r1]\n" - "\tmov r10, r0\n" - "\tcmp r1, 0\n" - "\tbne _08041DD0\n" - "_08041E50:\n" - "\tadd sp, 0xC\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08041E60: .4byte gHatchedEggFinalMoves"); -} -#endif - -static void RemoveEggFromDayCare(struct DayCare *daycare) -{ - daycare->misc.countersEtc.pendingEggPersonality = 0; - daycare->misc.countersEtc.eggCycleStepsRemaining = 0; -} - -void RejectEggFromDayCare(void) -{ - RemoveEggFromDayCare(&gSaveBlock1.daycare); -} - -static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare) -{ - u16 motherItem, fatherItem; - if (*species == SPECIES_WYNAUT || *species == SPECIES_AZURILL) - { - motherItem = GetBoxMonData(&daycare->mons[0], MON_DATA_HELD_ITEM); - fatherItem = GetBoxMonData(&daycare->mons[1], MON_DATA_HELD_ITEM); - if (*species == SPECIES_WYNAUT && motherItem != ITEM_LAX_INCENSE && fatherItem != ITEM_LAX_INCENSE) - { - *species = SPECIES_WOBBUFFET; - } - - if (*species == SPECIES_AZURILL && motherItem != ITEM_SEA_INCENSE && fatherItem != ITEM_SEA_INCENSE) - { - *species = SPECIES_MARILL; - } - } -} - -static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots) -{ - u16 i; - u16 species[2]; - u16 eggSpecies; - - // Determine which of the daycare mons is the mother and father of the egg. - // The 0th index of the parentSlots array is considered the mother slot, and the - // 1st index is the father slot. - for (i = 0; i < 2; i++) - { - species[i] = GetBoxMonData(&daycare->mons[i], MON_DATA_SPECIES); - if (species[i] == SPECIES_DITTO) - { - parentSlots[0] = i ^ 1; - parentSlots[1] = i; - } - else if (GetBoxMonGender(&daycare->mons[i]) == MON_FEMALE) - { - parentSlots[0] = i; - parentSlots[1] = i ^ 1; - } - } - - eggSpecies = GetEggSpecies(species[parentSlots[0]]); - if (eggSpecies == SPECIES_NIDORAN_F && daycare->misc.countersEtc.pendingEggPersonality & 0x8000) - { - eggSpecies = SPECIES_NIDORAN_M; - } - if (eggSpecies == SPECIES_ILLUMISE && daycare->misc.countersEtc.pendingEggPersonality & 0x8000) - { - eggSpecies = SPECIES_VOLBEAT; - } - - // Make Ditto the "mother" slot if the other daycare mon is male. - if (species[parentSlots[1]] == SPECIES_DITTO && GetBoxMonGender(&daycare->mons[parentSlots[0]]) != MON_FEMALE) - { - u8 temp = parentSlots[1]; - parentSlots[1] = parentSlots[0]; - parentSlots[0] = temp; - } - - return eggSpecies; -} - -static void _GiveEggFromDaycare(struct DayCare *daycare) // give_egg -{ - struct Pokemon egg; - u16 species; - u8 parentSlots[2]; // 0th index is "mother" daycare slot, 1st is "father" - u8 isEgg; - - species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots); - AlterEggSpeciesWithIncenseItem(&species, daycare); - SetInitialEggData(&egg, species, daycare); - InheritIVs(&egg, daycare); - BuildEggMoveset(&egg, &daycare->mons[parentSlots[1]], &daycare->mons[parentSlots[0]]); - isEgg = TRUE; - SetMonData(&egg, MON_DATA_IS_EGG, &isEgg); - gPlayerParty[5] = egg; - party_compaction(); - CalculatePlayerPartyCount(); - RemoveEggFromDayCare(daycare); -} - - -void CreateEgg(struct Pokemon *mon, u16 species, bool8 setMetLocation) -{ - u8 metLevel; - u16 ball; - u8 language; - u8 metLocation; - u8 isEgg; - - CreateMon(mon, species, 5, 0x20, FALSE, 0, FALSE, 0); - metLevel = 0; - ball = ITEM_POKE_BALL; - language = LANGUAGE_JAPANESE; - SetMonData(mon, MON_DATA_POKEBALL, &ball); - SetMonData(mon, MON_DATA_NICKNAME, sJapaneseEggNickname); - SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles); - SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); - SetMonData(mon, MON_DATA_LANGUAGE, &language); - if (setMetLocation) - { - metLocation = 253; // hot springs; see PokemonSummaryScreen_PrintEggTrainerMemo - SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation); - } - - isEgg = TRUE; - SetMonData(mon, MON_DATA_IS_EGG, &isEgg); -} - -static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare) -{ - u32 personality; - u16 ball; - u8 metLevel; - u8 language; - - personality = daycare->misc.countersEtc.pendingEggPersonality | (Random() << 16); - CreateMon(mon, species, 5, 0x20, TRUE, personality, FALSE, 0); - metLevel = 0; - ball = ITEM_POKE_BALL; - language = LANGUAGE_JAPANESE; - SetMonData(mon, MON_DATA_POKEBALL, &ball); - SetMonData(mon, MON_DATA_NICKNAME, sJapaneseEggNickname); - SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles); - SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); - SetMonData(mon, MON_DATA_LANGUAGE, &language); -} - -void GiveEggFromDaycare(void) -{ - _GiveEggFromDaycare(&gSaveBlock1.daycare); -} - -#ifdef NONMATCHING -static bool8 _ShouldEggHatch(struct DayCare *daycare) -{ - struct BoxPokemon *parent; - u32 i; - int v0; - int steps; - v0 = 0; - for (i=0, parent=&daycare->mons[0]; i<2; parent++, i++) - { - if (GetBoxMonData(parent, MON_DATA_SANITY_BIT2, v0)) - { - daycare->misc.countersEtc.steps[i]++; - v0++; - } - } - if (daycare->misc.countersEtc.pendingEggPersonality == 0 && v0 == 2 && daycare->misc.extra.misc[4] == 0xff && GetDaycareCompatibilityScore(daycare) > (u32)((u32)(Random() * 100) / 0xffff)) - { - TriggerPendingDaycareEgg(); - } - if ((++daycare->misc.countersEtc.eggCycleStepsRemaining) == 0xff) - { - for (i=0; imisc.countersEtc.pendingEggPersonality) | daycare->misc.countersEtc.pendingEggPersonality) >> 31; -} - -static void _GetDaycareMonNicknames(struct DayCare *daycare) -{ - u8 language; - if (GetBoxMonData(&daycare->mons[0], MON_DATA_SPECIES) != 0) - { - GetBoxMonNick(&daycare->mons[0], gStringVar1); - language = GetBoxMonData(&daycare->mons[0], MON_DATA_LANGUAGE); - GetBoxMonData(&daycare->mons[0], MON_DATA_OT_NAME, gStringVar3); - ConvertInternationalString(gStringVar3, language); - } - - if (GetBoxMonData(&daycare->mons[1], MON_DATA_SPECIES) != 0) - { - GetBoxMonNick(&daycare->mons[1], gStringVar2); - } -} - -u16 GetSelectedDaycareMonNickname(void) -{ - GetBoxMonNick(&gPlayerParty[gLastFieldPokeMenuOpened].box, gStringVar1); - return GetBoxMonData(&gPlayerParty[gLastFieldPokeMenuOpened].box, MON_DATA_SPECIES); -} - -void GetDaycareMonNicknames(void) -{ - _GetDaycareMonNicknames(&gSaveBlock1.daycare); -} - -u8 GetDaycareState(void) -{ - // The daycare can be in 4 possible states: - // 0: default state--no deposited mons, no egg - // 1: there is an egg waiting for the player to pick it up - // 2: there is a single pokemon in the daycare - // 3: there are two pokemon in the daycare, no egg - - u8 numMons; - if (IsEggPending(&gSaveBlock1.daycare)) - { - // There is an Egg waiting for the player. - return 1; - } - - numMons = CountPokemonInDaycare(&gSaveBlock1.daycare); - if (numMons != 0) - { - return numMons + 1; - } - - return 0; -} - -#ifdef NONMATCHING -static -#endif -bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2) -{ - // Determine if the two given egg group lists contain any of the - // same egg groups. - s32 i, j; - u16 *v0, *v1, v2; - - for (i = 0, v0 = eggGroups1; i < 2; v0++, i++) - { - for (j = 0, v2 = *v0, v1 = eggGroups2; j < 2; v1++, j++) - { - if (v2 == *v1) - { - return TRUE; - } - } - } - - return FALSE; -} - -#ifdef NONMATCHING -static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) -{ - u16 species[2]; - u32 otIds[2]; - u32 genders[2]; - u16 eggGroups[2][2]; - int i; - u16 *spc; - u32 *ids; - u32 *gnd; - u16 *egg1; - u16 *egg2; - struct BoxPokemon *parent; - - for (i=0, parent=&daycare->mons[0], spc=species, ids=otIds, gnd=genders, egg1=&eggGroups[0][0], egg2=&eggGroups[0][1]; i<2; spc++, egg1+=2, egg2+=2, parent++, i++) - { - *spc = GetBoxMonData(parent, MON_DATA_SPECIES); - *ids++ = GetBoxMonData(parent, MON_DATA_OT_ID); - *gnd++ = GetGenderFromSpeciesAndPersonality(*spc, GetBoxMonData(parent, MON_DATA_PERSONALITY)); - *egg1 = gBaseStats[*spc].eggGroup1; - *egg2 = gBaseStats[*spc].eggGroup2; - } - if (eggGroups[0][0] == 0xf) - { - return 0; - } - if (eggGroups[1][0] == 0xf) - { - return 0; - } - if (eggGroups[0][0] == 0xd && eggGroups[1][0] == 0xd) - { - return 0; - } - else if (eggGroups[0][0] == 0xd || eggGroups[1][0] == 0xd) - { - if (otIds[0] == otIds[1]) - { - return 20; - } - return 50; - } - if (genders[0] == genders[1] || genders[0] == MON_GENDERLESS || genders[1] == MON_GENDERLESS) - { - return 0; - } - if (!EggGroupsOverlap(eggGroups[0], eggGroups[1])) - { - return 0; - } - if (species[0] == species[1]) - { - if (otIds[0] == otIds[1]) - { - return 50; - } - return 70; - } - else - { - if (otIds[0] != otIds[1]) - { - return 50; - } - return 20; - } -} -#else -__attribute__((naked)) -static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x2C\n" - "\tmovs r1, 0\n" - "\tmov r8, r1\n" - "\tmov r2, sp\n" - "\tadds r2, 0x8\n" - "\tstr r2, [sp, 0x1C]\n" - "\tadd r1, sp, 0xC\n" - "\tmov r10, r1\n" - "\tadds r2, 0xC\n" - "\tstr r2, [sp, 0x20]\n" - "\tmov r1, sp\n" - "\tadds r1, 0x2\n" - "\tldr r2, _08042488 @ =gBaseStats\n" - "\tmov r9, r2\n" - "\tldr r5, [sp, 0x1C]\n" - "\tadds r7, r1, 0\n" - "\tmov r6, sp\n" - "\tldr r1, [sp, 0x20]\n" - "\tstr r1, [sp, 0x24]\n" - "\tmov r2, r10\n" - "\tstr r2, [sp, 0x28]\n" - "\tadds r4, r0, 0\n" - "_0804240E:\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0xB\n" - "\tbl GetBoxMonData\n" - "\tstrh r0, [r5]\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x1\n" - "\tbl GetBoxMonData\n" - "\tldr r1, [sp, 0x28]\n" - "\tstm r1!, {r0}\n" - "\tstr r1, [sp, 0x28]\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0\n" - "\tbl GetBoxMonData\n" - "\tadds r1, r0, 0\n" - "\tldrh r0, [r5]\n" - "\tbl GetGenderFromSpeciesAndPersonality\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tldr r2, [sp, 0x24]\n" - "\tstm r2!, {r0}\n" - "\tstr r2, [sp, 0x24]\n" - "\tldrh r1, [r5]\n" - "\tlsls r0, r1, 3\n" - "\tsubs r0, r1\n" - "\tlsls r0, 2\n" - "\tadd r0, r9\n" - "\tldrb r0, [r0, 0x14]\n" - "\tstrh r0, [r6]\n" - "\tldrh r1, [r5]\n" - "\tlsls r0, r1, 3\n" - "\tsubs r0, r1\n" - "\tlsls r0, 2\n" - "\tadd r0, r9\n" - "\tldrb r0, [r0, 0x15]\n" - "\tstrh r0, [r7]\n" - "\tadds r5, 0x2\n" - "\tadds r7, 0x4\n" - "\tadds r6, 0x4\n" - "\tadds r4, 0x50\n" - "\tmovs r0, 0x1\n" - "\tadd r8, r0\n" - "\tmov r1, r8\n" - "\tcmp r1, 0x1\n" - "\tbls _0804240E\n" - "\tmov r0, sp\n" - "\tldrh r1, [r0]\n" - "\tcmp r1, 0xF\n" - "\tbeq _08042484\n" - "\tldrh r0, [r0, 0x4]\n" - "\tcmp r0, 0xF\n" - "\tbeq _08042484\n" - "\tcmp r1, 0xD\n" - "\tbne _0804248C\n" - "\tcmp r0, 0xD\n" - "\tbne _08042490\n" - "_08042484:\n" - "\tmovs r0, 0\n" - "\tb _080424E4\n" - "\t.align 2, 0\n" - "_08042488: .4byte gBaseStats\n" - "_0804248C:\n" - "\tcmp r0, 0xD\n" - "\tbne _0804249C\n" - "_08042490:\n" - "\tldr r1, [sp, 0xC]\n" - "\tmov r2, r10\n" - "\tldr r0, [r2, 0x4]\n" - "\tcmp r1, r0\n" - "\tbeq _080424DE\n" - "\tb _080424E2\n" - "_0804249C:\n" - "\tldr r0, [sp, 0x14]\n" - "\tldr r2, [sp, 0x20]\n" - "\tldr r1, [r2, 0x4]\n" - "\tcmp r0, r1\n" - "\tbeq _08042484\n" - "\tcmp r0, 0xFF\n" - "\tbeq _08042484\n" - "\tcmp r1, 0xFF\n" - "\tbeq _08042484\n" - "\tadd r1, sp, 0x4\n" - "\tmov r0, sp\n" - "\tbl EggGroupsOverlap\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _08042484\n" - "\tldr r0, [sp, 0x1C]\n" - "\tldrh r1, [r0, 0x2]\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, r1\n" - "\tbne _080424D4\n" - "\tldr r1, [sp, 0xC]\n" - "\tmov r2, r10\n" - "\tldr r0, [r2, 0x4]\n" - "\tcmp r1, r0\n" - "\tbeq _080424E2\n" - "\tmovs r0, 0x46\n" - "\tb _080424E4\n" - "_080424D4:\n" - "\tldr r1, [sp, 0xC]\n" - "\tmov r2, r10\n" - "\tldr r0, [r2, 0x4]\n" - "\tcmp r1, r0\n" - "\tbne _080424E2\n" - "_080424DE:\n" - "\tmovs r0, 0x14\n" - "\tb _080424E4\n" - "_080424E2:\n" - "\tmovs r0, 0x32\n" - "_080424E4:\n" - "\tadd sp, 0x2C\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif - -u8 GetDaycareCompatibilityScoreFromSave(void) -{ - return GetDaycareCompatibilityScore(&gSaveBlock1.daycare); -} - -void SetDaycareCompatibilityString(void) -{ - u8 whichString; - u8 relationshipScore; - - relationshipScore = GetDaycareCompatibilityScoreFromSave(); - whichString = 0; - if (relationshipScore == 0) - whichString = 3; - if (relationshipScore == 20) - whichString = 2; - if (relationshipScore == 50) - whichString = 1; - if (relationshipScore == 70) - whichString = 0; - - StringCopy(gStringVar4, sCompatibilityMessages[whichString]); -} - -bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) -{ - u8 i; - u8 flags[2]; - - flags[0] = flags[1] = 0; - for (i = 0; name[i] != EOS; i++) - { - if (name[i] == CHAR_MALE) flags[0]++; - if (name[i] == CHAR_FEMALE) flags[1]++; - } - if (genderRatio == MON_MALE && flags[0] && !flags[1]) - return TRUE; - if (genderRatio == MON_FEMALE && flags[1] && !flags[0]) - return TRUE; - return FALSE; -} - -static u8 *AppendGenderSymbol(u8 *name, u8 gender) -{ - if (gender == MON_MALE) - { - if (!NameHasGenderSymbol(name, MON_MALE)) - return StringAppend(name, gOtherText_MaleSymbol3); - } - else if (gender == MON_FEMALE) - { - if (!NameHasGenderSymbol(name, MON_FEMALE)) - return StringAppend(name, gOtherText_FemaleSymbol3); - } - - return StringAppend(name, gOtherText_GenderlessSymbol); -} - -static u8 *AppendMonGenderSymbol(u8 *name, struct BoxPokemon *boxMon) -{ - return AppendGenderSymbol(name, GetBoxMonGender(boxMon)); -} - -static void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest) -{ - u8 monNames[2][20]; - u8 i; - - *dest = EOS; - for (i = 0; i < 2; i++) - { - GetBoxMonNick(&daycare->mons[i], monNames[i]); - AppendMonGenderSymbol(monNames[i], &daycare->mons[i]); - } - - StringCopy(dest, monNames[0]); - StringAppend(dest, gOtherText_NewLine2); - StringAppend(dest, monNames[1]); - StringAppend(dest, gOtherText_NewLine2); - StringAppend(dest, gOtherText_CancelAndLv); -} - -static void GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest) -{ - u8 i; - u8 level; - - *dest = EOS; - for (i = 0; i < 2; i++) - { - level = GetLevelAfterDaycareSteps(&daycare->mons[i], daycare->misc.countersEtc.steps[i]); - dest[0] = 0x34; - dest[1] = 0xFC; - dest[2] = 0x14; - dest[3] = 0x06; - dest = ConvertIntToDecimalStringN(dest + 4, level, STR_CONV_MODE_RIGHT_ALIGN, 3); - dest[0] = 0xFC; - dest[1] = 0x14; - dest[2] = 0x00; - dest = StringCopy(dest + 3, gOtherText_NewLine2); - } - - *dest = EOS; -} - -static void HandleDaycareLevelMenuInput(u8 taskId) -{ - if (gMain.newKeys & DPAD_UP) - { - if (gTasks[taskId].data[0] != 0) - { - gTasks[taskId].data[0] --; - Menu_MoveCursor(-1); - PlaySE(SE_SELECT); - } - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (gTasks[taskId].data[0] != 2) - { - gTasks[taskId].data[0]++; - Menu_MoveCursor(+1); - PlaySE(SE_SELECT); - } - } - else if (gMain.newKeys & A_BUTTON) - { - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - gLastFieldPokeMenuOpened = gSpecialVar_Result = gTasks[taskId].data[0]; - DestroyTask(taskId); - Menu_EraseWindowRect(15, 6, 29, 13); - EnableBothScriptContexts(); - } - else if (gMain.newKeys & B_BUTTON) - { - Menu_DestroyCursor(); - gLastFieldPokeMenuOpened = gSpecialVar_Result = 2; - DestroyTask(taskId); - Menu_EraseWindowRect(15, 6, 29, 13); - EnableBothScriptContexts(); - } -} - -void ShowDaycareLevelMenu(void) -{ - u8 buffer[100]; - Menu_DrawStdWindowFrame(15, 6, 29, 13); - GetDaycareLevelMenuText(&gSaveBlock1.daycare, buffer); - Menu_PrintText(buffer, 16, 7); - GetDaycareLevelMenuLevelText(&gSaveBlock1.daycare, buffer); - Menu_PrintTextPixelCoords(buffer, 0xce, 0x38, TRUE); - InitMenu(0, 16, 7, 3, 0, 13); - CreateTask(HandleDaycareLevelMenuInput, 3); -} - -void ChooseSendDaycareMon(void) -{ - OpenPartyMenu(PARTY_MENU_TYPE_DAYCARE, 0); - gMain.savedCallback = c2_exit_to_overworld_2_switch; -} diff --git a/src/field/decoration.c b/src/field/decoration.c deleted file mode 100644 index 0e7fa5f41..000000000 --- a/src/field/decoration.c +++ /dev/null @@ -1,4283 +0,0 @@ -#include "global.h" -#include "constants/decorations.h" -#include "main.h" -#include "constants/map_objects.h" -#include "overworld.h" -#include "sound.h" -#include "constants/songs.h" -#include "string_util.h" -#include "menu.h" -#include "menu_helpers.h" -#include "strings.h" -#include "script.h" -#include "palette.h" -#include "field_player_avatar.h" -#include "field_camera.h" -#include "field_fadetransition.h" -#include "fieldmap.h" -#include "metatile_behavior.h" -#include "event_data.h" -#include "field_weather.h" -#include "decoration.h" -#include "shop.h" -#include "ewram.h" - -EWRAM_DATA u8 *gUnknown_020388D0 = NULL; -EWRAM_DATA u8 gUnknown_020388D4 = 0; -EWRAM_DATA u8 gUnknown_020388D5 = 0; -EWRAM_DATA u8 gUnknown_020388D6[16] = {0}; -EWRAM_DATA u8 gUnknown_020388E6[12] = {0}; -EWRAM_DATA u8 gUnknown_020388F2 = 0; -EWRAM_DATA u8 gUnknown_020388F3 = 0; -EWRAM_DATA u8 gUnknown_020388F4 = 0; -EWRAM_DATA u8 gUnknown_020388F5 = 0; -EWRAM_DATA u8 gUnknown_020388F6 = 0; -EWRAM_DATA u8 gUnknown_020388F7[8] = {0}; -EWRAM_DATA struct UnkStruct_02038900 gUnknown_02038900 = {0}; -EWRAM_DATA u16 gUnknown_020391A4 = 0; -EWRAM_DATA u16 gUnknown_020391A6 = 0; -EWRAM_DATA u8 gUnknown_020391A8 = 0; -EWRAM_DATA u8 gUnknown_020391A9 = 0; -EWRAM_DATA u8 gUnknown_020391AA = 0; -EWRAM_DATA struct OamData gUnknown_020391AC = {0}; -EWRAM_DATA struct UnkStruct_020391B4 gUnknown_020391B4[16] = {0}; -EWRAM_DATA u8 gUnknown_02039234 = 0; - -#if ENGLISH -const u8 DecorDesc_SMALL_DESK[] = _( - "A small desk built\n" - "for one."); - -const u8 DecorDesc_POKEMON_DESK[] = _( - "A small desk built in\n" - "the shape of a POKé\n" - "BALL."); - -const u8 DecorDesc_HEAVY_DESK[] = _( - "A large desk made\n" - "of steel. Put some\n" - "decorations on it."); - -const u8 DecorDesc_RAGGED_DESK[] = _( - "A large desk made\n" - "of wood. Put some\n" - "decorations on it."); - -const u8 DecorDesc_COMFORT_DESK[] = _( - "A large desk made\n" - "of leaves. Put some\n" - "decorations on it."); - -const u8 DecorDesc_PRETTY_DESK[] = _( - "A huge desk made\n" - "of glass. Holds lots\n" - "of decorations."); - -const u8 DecorDesc_BRICK_DESK[] = _( - "A huge desk made\n" - "of brick. Holds lots\n" - "of decorations."); - -const u8 DecorDesc_CAMP_DESK[] = _( - "A huge desk made\n" - "of logs. Put lots of\n" - "decorations on it."); - -const u8 DecorDesc_HARD_DESK[] = _( - "A huge desk made\n" - "of rocks. Holds\n" - "many decorations."); - -const u8 DecorDesc_SMALL_CHAIR[] = _( - "A small chair made\n" - "for one."); - -const u8 DecorDesc_POKEMON_CHAIR[] = _( - "A small chair built\n" - "in the shape of a\n" - "POKé BALL."); - -const u8 DecorDesc_HEAVY_CHAIR[] = _( - "A small chair made\n" - "of steel."); - -const u8 DecorDesc_PRETTY_CHAIR[] = _( - "A small chair made\n" - "of glass."); - -const u8 DecorDesc_COMFORT_CHAIR[] = _( - "A small chair made\n" - "of leaves."); - -const u8 DecorDesc_RAGGED_CHAIR[] = _( - "A small chair made\n" - "of wood."); - -const u8 DecorDesc_BRICK_CHAIR[] = _( - "A small chair made\n" - "of brick."); - -const u8 DecorDesc_CAMP_CHAIR[] = _( - "A small chair made\n" - "of logs."); - -const u8 DecorDesc_HARD_CHAIR[] = _( - "A small chair made\n" - "of rock."); - -const u8 DecorDesc_RED_PLANT[] = _( - "A vivid red potted\n" - "plant."); - -const u8 DecorDesc_TROPICAL_PLANT[] = _( - "A flowering tropical\n" - "plant in a pot."); - -const u8 DecorDesc_PRETTY_FLOWERS[] = _( - "A pot of cute\n" - "flowers."); - -const u8 DecorDesc_COLORFUL_PLANT[] = _( - "A large pot with\n" - "many colorful\n" - "flowers."); - -const u8 DecorDesc_BIG_PLANT[] = _( - "A large, umbrella-\n" - "shaped plant in a\n" - "big pot."); - -const u8 DecorDesc_GORGEOUS_PLANT[] = _( - "A large, impressive\n" - "plant in a big pot."); - -const u8 DecorDesc_RED_BRICK[] = _( - "A red-colored brick.\n" - "Decorations can be\n" - "placed on top."); - -const u8 DecorDesc_YELLOW_BRICK[] = _( - "A yellow-colored\n" - "brick. Put some\n" - "decorations on top."); - -const u8 DecorDesc_BLUE_BRICK[] = _( - "A blue-colored\n" - "brick. Put some\n" - "decorations on top."); - -const u8 DecorDesc_RED_BALLOON[] = _( - "A red balloon filled\n" - "with water. Bursts\n" - "if stepped on."); - -const u8 DecorDesc_BLUE_BALLOON[] = _( - "A blue balloon filled\n" - "with water. Bursts\n" - "if stepped on."); - -const u8 DecorDesc_YELLOW_BALLOON[] = _( - "A yellow balloon\n" - "filled with water.\n" - "Pops if stepped on."); - -const u8 DecorDesc_RED_TENT[] = _( - "A large red tent.\n" - "You can hide inside\n" - "it."); - -const u8 DecorDesc_BLUE_TENT[] = _( - "A large blue tent.\n" - "You can hide inside\n" - "it."); - -const u8 DecorDesc_SOLID_BOARD[] = _( - "Place over a hole to\n" - "cross to the other\n" - "side."); - -const u8 DecorDesc_SLIDE[] = _( - "Use to slide down\n" - "from the platform."); - -const u8 DecorDesc_FENCE_LENGTH[] = _( - "A small fence that\n" - "blocks passage."); - -const u8 DecorDesc_FENCE_WIDTH[] = _( - "A small fence that\n" - "blocks passage."); - -const u8 DecorDesc_TIRE[] = _( - "An old large tire.\n" - "Decorations can be\n" - "placed on top."); - -const u8 DecorDesc_STAND[] = _( - "A large pedestal\n" - "with steps."); - -const u8 DecorDesc_MUD_BALL[] = _( - "A large ball of mud.\n" - "Crumbles if stepped\n" - "on."); - -const u8 DecorDesc_BREAKABLE_DOOR[] = _( - "A weird door that\n" - "people can walk\n" - "right through."); - -const u8 DecorDesc_SAND_ORNAMENT[] = _( - "An ornament made\n" - "of sand. Crumbles if\n" - "touched."); - -const u8 DecorDesc_SILVER_SHIELD[] = _( - "Awarded for 50\n" - "straight wins at\n" - "the BATTLE TOWER."); - -const u8 DecorDesc_GOLD_SHIELD[] = _( - "Awarded for 100\n" - "straight wins at\n" - "the BATTLE TOWER."); - -const u8 DecorDesc_GLASS_ORNAMENT[] = _( - "A glass replica of\n" - "a famous sculpture\n" - "at the ART MUSEUM."); - -const u8 DecorDesc_TV[] = _( - "A small, gray-\n" - "colored toy TV."); - -const u8 DecorDesc_ROUND_TV[] = _( - "A toy TV modeled\n" - "in the image of a\n" - "SEEDOT."); - -const u8 DecorDesc_CUTE_TV[] = _( - "A toy TV modeled\n" - "in the image of a\n" - "SKITTY."); - -const u8 DecorDesc_GLITTER_MAT[] = _( - "An odd mat that\n" - "glitters if stepped\n" - "on."); - -const u8 DecorDesc_JUMP_MAT[] = _( - "A trick mat that\n" - "jumps when it is\n" - "stepped on."); - -const u8 DecorDesc_SPIN_MAT[] = _( - "A trick mat that\n" - "spins around when\n" - "stepped on."); - -const u8 DecorDesc_C_LOW_NOTE_MAT[] = _( - "A mat that plays\n" - "a low C note when\n" - "stepped on."); - -const u8 DecorDesc_D_NOTE_MAT[] = _( - "A mat that plays\n" - "a D note when\n" - "stepped on."); - -const u8 DecorDesc_E_NOTE_MAT[] = _( - "A mat that plays\n" - "an E note when\n" - "stepped on."); - -const u8 DecorDesc_F_NOTE_MAT[] = _( - "A mat that plays\n" - "an F note when\n" - "stepped on."); - -const u8 DecorDesc_G_NOTE_MAT[] = _( - "A mat that plays\n" - "a G note when\n" - "stepped on."); - -const u8 DecorDesc_A_NOTE_MAT[] = _( - "A mat that plays\n" - "an A note when\n" - "stepped on."); - -const u8 DecorDesc_B_NOTE_MAT[] = _( - "A mat that plays\n" - "a B note when\n" - "stepped on."); - -const u8 DecorDesc_C_HIGH_NOTE_MAT[] = _( - "A mat that plays\n" - "a high C note when\n" - "stepped on."); - -const u8 DecorDesc_SURF_MAT[] = _( - "A mat designed with\n" - "a SURF image.\n" - "Put items on top."); - -const u8 DecorDesc_THUNDER_MAT[] = _( - "A mat designed with\n" - "a THUNDER image.\n" - "Put items on top."); - -const u8 DecorDesc_FIRE_BLAST_MAT[] = _( - "A mat designed with\n" - "a FIRE BLAST image.\n" - "Put items on top."); - -const u8 DecorDesc_POWDER_SNOW_MAT[] = _( - "A mat with a POWDER\n" - "SNOW image design.\n" - "Put items on top."); - -const u8 DecorDesc_ATTRACT_MAT[] = _( - "A mat designed with\n" - "an ATTRACT image.\n" - "Put items on top."); - -const u8 DecorDesc_FISSURE_MAT[] = _( - "A mat designed with\n" - "a FISSURE image.\n" - "Put items on top."); - -const u8 DecorDesc_SPIKES_MAT[] = _( - "A mat designed with\n" - "a SPIKES image.\n" - "Put items on top."); - -const u8 DecorDesc_BALL_POSTER[] = _( - "A small poster\n" - "printed with POKé\n" - "BALLS."); - -const u8 DecorDesc_GREEN_POSTER[] = _( - "A small poster with\n" - "a TREECKO print."); - -const u8 DecorDesc_RED_POSTER[] = _( - "A small poster with\n" - "a TORCHIC print."); - -const u8 DecorDesc_BLUE_POSTER[] = _( - "A small poster with\n" - "a MUDKIP print."); - -const u8 DecorDesc_CUTE_POSTER[] = _( - "A small poster with\n" - "an AZURILL print."); - -const u8 DecorDesc_PIKA_POSTER[] = _( - "A large poster with\n" - "a PIKACHU and\n" - "PICHU print."); - -const u8 DecorDesc_LONG_POSTER[] = _( - "A large poster with\n" - "a SEVIPER print."); - -const u8 DecorDesc_SEA_POSTER[] = _( - "A large poster with\n" - "a RELICANTH print."); - -const u8 DecorDesc_SKY_POSTER[] = _( - "A large poster with\n" - "a WINGULL print."); - -const u8 DecorDesc_KISS_POSTER[] = _( - "A large poster with\n" - "a SMOOCHUM print."); - -const u8 DecorDesc_PICHU_DOLL[] = _( - "A PICHU doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_PIKACHU_DOLL[] = _( - "A PIKACHU doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_MARILL_DOLL[] = _( - "A MARILL doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_TOGEPI_DOLL[] = _( -#if REVISION >= 1 - "A TOGEPI doll.\n" -#else - "A TOPGEPI doll.\n" -#endif - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_CYNDAQUIL_DOLL[] = _( - "A CYNDAQUIL doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_CHIKORITA_DOLL[] = _( - "A CHIKORITA doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_TOTODILE_DOLL[] = _( - "A TOTODILE doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_JIGGLYPUFF_DOLL[] = _( - "A JIGGLYPUFF doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_MEOWTH_DOLL[] = _( - "A MEOWTH doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_CLEFAIRY_DOLL[] = _( - "A CLEFAIRY doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_DITTO_DOLL[] = _( - "A DITTO doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_SMOOCHUM_DOLL[] = _( - "A SMOOCHUM doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_TREECKO_DOLL[] = _( - "A TREECKO doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_TORCHIC_DOLL[] = _( - "A TORCHIC doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_MUDKIP_DOLL[] = _( - "A MUDKIP doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_DUSKULL_DOLL[] = _( - "A DUSKULL doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_WYNAUT_DOLL[] = _( - "A WYNAUT doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_BALTOY_DOLL[] = _( - "A BALTOY doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_KECLEON_DOLL[] = _( - "A KECLEON doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_AZURILL_DOLL[] = _( - "An AZURILL doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_SKITTY_DOLL[] = _( - "A SKITTY doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_SWABLU_DOLL[] = _( - "A SWABLU doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_GULPIN_DOLL[] = _( - "A GULPIN doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_LOTAD_DOLL[] = _( - "A LOTAD doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_SEEDOT_DOLL[] = _( - "A SEEDOT doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_PIKA_CUSHION[] = _( - "A PIKACHU cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_ROUND_CUSHION[] = _( - "A MARILL cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_KISS_CUSHION[] = _( - "A SMOOCHUM\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_ZIGZAG_CUSHION[] = _( - "A ZIGZAGOON\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_SPIN_CUSHION[] = _( - "A SPINDA cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_DIAMOND_CUSHION[] = _( - "A SABLEYE cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_BALL_CUSHION[] = _( - "A BALL cushion.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_GRASS_CUSHION[] = _( - "A grass-mark\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_FIRE_CUSHION[] = _( - "A fire-mark\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_WATER_CUSHION[] = _( - "A water-mark\n" - "cushion. Place it on\n" - "a mat or a desk."); - -const u8 DecorDesc_SNORLAX_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_RHYDON_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_LAPRAS_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_VENUSAUR_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_CHARIZARD_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_BLASTOISE_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_WAILMER_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_REGIROCK_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_REGICE_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); - -const u8 DecorDesc_REGISTEEL_DOLL[] = _( - "A large doll.\n" - "Place it on a mat\n" - "or a desk."); -#elif GERMAN -#include "../data/decoration/descriptions_de.h" -#endif - -const u16 DecorGfx_SMALL_DESK[] = { - 0x87 -}; - -const u16 DecorGfx_POKEMON_DESK[] = { - 0x8F -}; - -const u16 DecorGfx_HEAVY_DESK[] = { - 0x90, - 0x91, - 0x92, - 0x98, - 0x99, - 0x9A -}; - -const u16 DecorGfx_RAGGED_DESK[] = { - 0x93, - 0x94, - 0x95, - 0x9B, - 0x9C, - 0x9D -}; - -const u16 DecorGfx_COMFORT_DESK[] = { - 0x96, - 0x97, - 0xA3, - 0x9E, - 0x9F, - 0xAB -}; - -const u16 DecorGfx_PRETTY_DESK[] = { - 0xBD, - 0xBE, - 0xBF, - 0xC5, - 0xC6, - 0xC7, - 0xCD, - 0xCE, - 0xCF -}; - -const u16 DecorGfx_BRICK_DESK[] = { - 0xA0, - 0xA1, - 0xA2, - 0xA8, - 0xA9, - 0xAA, - 0xB0, - 0xB1, - 0xB2 -}; - -const u16 DecorGfx_CAMP_DESK[] = { - 0xA4, - 0xA5, - 0xA6, - 0xAC, - 0xAD, - 0xAE, - 0xB4, - 0xB5, - 0xB6 -}; - -const u16 DecorGfx_HARD_DESK[] = { - 0xA7, - 0xBB, - 0xBC, - 0xAF, - 0xC3, - 0xC4, - 0xB7, - 0xCB, - 0xCC -}; - -const u16 DecorGfx_SMALL_CHAIR[] = { - 0xB8 -}; - -const u16 DecorGfx_POKEMON_CHAIR[] = { - 0xB9 -}; - -const u16 DecorGfx_HEAVY_CHAIR[] = { - 0xBA -}; - -const u16 DecorGfx_PRETTY_CHAIR[] = { - 0xC0 -}; - -const u16 DecorGfx_COMFORT_CHAIR[] = { - 0xC1 -}; - -const u16 DecorGfx_RAGGED_CHAIR[] = { - 0xC2 -}; - -const u16 DecorGfx_BRICK_CHAIR[] = { - 0xC8 -}; - -const u16 DecorGfx_CAMP_CHAIR[] = { - 0xC9 -}; - -const u16 DecorGfx_HARD_CHAIR[] = { - 0xCA -}; - -const u16 DecorGfx_RED_PLANT[] = { - 0xD0, - 0xD8 -}; - -const u16 DecorGfx_TROPICAL_PLANT[] = { - 0xD2, - 0xDA -}; - -const u16 DecorGfx_PRETTY_FLOWERS[] = { - 0xD4, - 0xDC -}; - -const u16 DecorGfx_COLORFUL_PLANT[] = { - 0xE0, - 0xE2, - 0xE8, - 0xE9 -}; - -const u16 DecorGfx_BIG_PLANT[] = { - 0xE4, - 0xE6, - 0xEC, - 0xED -}; - -const u16 DecorGfx_GORGEOUS_PLANT[] = { - 0xF0, - 0xF2, - 0xF8, - 0xF9 -}; - -const u16 DecorGfx_RED_BRICK[] = { - 0x25, - 0x2D -}; - -const u16 DecorGfx_YELLOW_BRICK[] = { - 0x26, - 0x2E -}; - -const u16 DecorGfx_BLUE_BRICK[] = { - 0x27, - 0x2F -}; - -const u16 DecorGfx_RED_BALLOON[] = { - 0x138 -}; - -const u16 DecorGfx_BLUE_BALLOON[] = { - 0x13C -}; - -const u16 DecorGfx_YELLOW_BALLOON[] = { - 0x140 -}; - -const u16 DecorGfx_RED_TENT[] = { - 0x30, - 0x31, - 0x32, - 0x38, - 0x39, - 0x3A, - 0x40, - 0x41, - 0x3B -}; - -const u16 DecorGfx_BLUE_TENT[] = { - 0x48, - 0x49, - 0x68, - 0x50, - 0x51, - 0x70, - 0x58, - 0x59, - 0x69 -}; - -const u16 DecorGfx_SOLID_BOARD[] = { - 0x34, - 0x3C -}; - -const u16 DecorGfx_SLIDE[] = { - 0x35, - 0x36, - 0x3D, - 0x3E, - 0x63, - 0x64, - 0x6F, - 0x77 -}; - -const u16 DecorGfx_FENCE_LENGTH[] = { - 0x33 -}; - -const u16 DecorGfx_FENCE_WIDTH[] = { - 0x2C -}; - -const u16 DecorGfx_TIRE[] = { - 0x80, - 0x81, - 0x88, - 0x89 -}; - -const u16 DecorGfx_STAND[] = { - 0x6A, - 0x6B, - 0x6C, - 0x6D, - 0x72, - 0x73, - 0x74, - 0x75 -}; - -const u16 DecorGfx_MUD_BALL[] = { - 0x28 -}; - -const u16 DecorGfx_BREAKABLE_DOOR[] = { - 0x37, - 0x3F -}; - -const u16 DecorGfx_SAND_ORNAMENT[] = { - 0x85, - 0x8D -}; - -const u16 DecorGfx_SILVER_SHIELD[] = { - 0xD6, - 0xDE -}; - -const u16 DecorGfx_GOLD_SHIELD[] = { - 0x12E, - 0x136 -}; - -const u16 DecorGfx_GLASS_ORNAMENT[] = { - 0x82, - 0x8A -}; - -const u16 DecorGfx_TV[] = { - 0xF4 -}; - -const u16 DecorGfx_ROUND_TV[] = { - 0xF5 -}; - -const u16 DecorGfx_CUTE_TV[] = { - 0xF6 -}; - -const u16 DecorGfx_GLITTER_MAT[] = { - 0x60 -}; - -const u16 DecorGfx_JUMP_MAT[] = { - 0x61 -}; - -const u16 DecorGfx_SPIN_MAT[] = { - 0x62 -}; - -const u16 DecorGfx_C_LOW_NOTE_MAT[] = { - 0x78 -}; - -const u16 DecorGfx_D_NOTE_MAT[] = { - 0x79 -}; - -const u16 DecorGfx_E_NOTE_MAT[] = { - 0x7A -}; - -const u16 DecorGfx_F_NOTE_MAT[] = { - 0x7B -}; - -const u16 DecorGfx_G_NOTE_MAT[] = { - 0x7C -}; - -const u16 DecorGfx_A_NOTE_MAT[] = { - 0x7D -}; - -const u16 DecorGfx_B_NOTE_MAT[] = { - 0x7E -}; - -const u16 DecorGfx_C_HIGH_NOTE_MAT[] = { - 0xB3 -}; - -const u16 DecorGfx_SURF_MAT[] = { - 0x42, - 0x43, - 0x44, - 0x4A, - 0x4B, - 0x4C, - 0x52, - 0x53, - 0x54 -}; - -const u16 DecorGfx_THUNDER_MAT[] = { - 0x45, - 0x46, - 0x47, - 0x4D, - 0x4E, - 0x4F, - 0x55, - 0x56, - 0x57 -}; - -const u16 DecorGfx_FIRE_BLAST_MAT[] = { - 0x5A, - 0x5B, - 0x5C, - 0x5D, - 0x5E, - 0x5F, - 0x65, - 0x66, - 0x67 -}; - -const u16 DecorGfx_POWDER_SNOW_MAT[] = { - 0x100, - 0x101, - 0x102, - 0x108, - 0x109, - 0x10A, - 0x110, - 0x111, - 0x112 -}; - -const u16 DecorGfx_ATTRACT_MAT[] = { - 0x103, - 0x104, - 0x105, - 0x10B, - 0x10C, - 0x10D, - 0x113, - 0x114, - 0x115 -}; - -const u16 DecorGfx_FISSURE_MAT[] = { - 0x106, - 0x107, - 0x118, - 0x10E, - 0x10F, - 0x120, - 0x116, - 0x117, - 0x128 -}; - -const u16 DecorGfx_SPIKES_MAT[] = { - 0x119, - 0x11A, - 0x11B, - 0x121, - 0x122, - 0x123, - 0x129, - 0x12A, - 0x12B -}; - -const u16 DecorGfx_BALL_POSTER[] = { - 0x130 -}; - -const u16 DecorGfx_GREEN_POSTER[] = { - 0x131 -}; - -const u16 DecorGfx_RED_POSTER[] = { - 0x132 -}; - -const u16 DecorGfx_BLUE_POSTER[] = { - 0x133 -}; - -const u16 DecorGfx_CUTE_POSTER[] = { - 0x134 -}; - -const u16 DecorGfx_PIKA_POSTER[] = { - 0x11C, - 0x11D -}; - -const u16 DecorGfx_LONG_POSTER[] = { - 0x11E, - 0x11F -}; - -const u16 DecorGfx_SEA_POSTER[] = { - 0x124, - 0x125 -}; - -const u16 DecorGfx_SKY_POSTER[] = { - 0x126, - 0x127 -}; - -const u16 DecorGfx_KISS_POSTER[] = { - 0x12C, - 0x12D -}; - -const u16 DecorGfx_PICHU_DOLL[] = { - MAP_OBJ_GFX_PICHU_DOLL -}; - -const u16 DecorGfx_PIKACHU_DOLL[] = { - MAP_OBJ_GFX_PIKACHU_DOLL -}; - -const u16 DecorGfx_MARILL_DOLL[] = { - MAP_OBJ_GFX_MARILL_DOLL -}; - -const u16 DecorGfx_TOGEPI_DOLL[] = { - MAP_OBJ_GFX_TOGEPI_DOLL -}; - -const u16 DecorGfx_CYNDAQUIL_DOLL[] = { - MAP_OBJ_GFX_CYNDAQUIL_DOLL -}; - -const u16 DecorGfx_CHIKORITA_DOLL[] = { - MAP_OBJ_GFX_CHIKORITA_DOLL -}; - -const u16 DecorGfx_TOTODILE_DOLL[] = { - MAP_OBJ_GFX_TOTODILE_DOLL -}; - -const u16 DecorGfx_JIGGLYPUFF_DOLL[] = { - MAP_OBJ_GFX_JIGGLYPUFF_DOLL -}; - -const u16 DecorGfx_MEOWTH_DOLL[] = { - MAP_OBJ_GFX_MEOWTH_DOLL -}; - -const u16 DecorGfx_CLEFAIRY_DOLL[] = { - MAP_OBJ_GFX_CLEFAIRY_DOLL -}; - -const u16 DecorGfx_DITTO_DOLL[] = { - MAP_OBJ_GFX_DITTO_DOLL -}; - -const u16 DecorGfx_SMOOCHUM_DOLL[] = { - MAP_OBJ_GFX_SMOOCHUM_DOLL -}; - -const u16 DecorGfx_TREECKO_DOLL[] = { - MAP_OBJ_GFX_TREECKO_DOLL -}; - -const u16 DecorGfx_TORCHIC_DOLL[] = { - MAP_OBJ_GFX_TORCHIC_DOLL -}; - -const u16 DecorGfx_MUDKIP_DOLL[] = { - MAP_OBJ_GFX_MUDKIP_DOLL -}; - -const u16 DecorGfx_DUSKULL_DOLL[] = { - MAP_OBJ_GFX_DUSKULL_DOLL -}; - -const u16 DecorGfx_WYNAUT_DOLL[] = { - MAP_OBJ_GFX_WYNAUT_DOLL -}; - -const u16 DecorGfx_BALTOY_DOLL[] = { - MAP_OBJ_GFX_BALTOY_DOLL -}; - -const u16 DecorGfx_KECLEON_DOLL[] = { - MAP_OBJ_GFX_KECLEON_DOLL -}; - -const u16 DecorGfx_AZURILL_DOLL[] = { - MAP_OBJ_GFX_AZURILL_DOLL -}; - -const u16 DecorGfx_SKITTY_DOLL[] = { - MAP_OBJ_GFX_SKITTY_DOLL -}; - -const u16 DecorGfx_SWABLU_DOLL[] = { - MAP_OBJ_GFX_SWABLU_DOLL -}; - -const u16 DecorGfx_GULPIN_DOLL[] = { - MAP_OBJ_GFX_GULPIN_DOLL -}; - -const u16 DecorGfx_LOTAD_DOLL[] = { - MAP_OBJ_GFX_LOTAD_DOLL -}; - -const u16 DecorGfx_SEEDOT_DOLL[] = { - MAP_OBJ_GFX_SEEDOT_DOLL -}; - -const u16 DecorGfx_PIKA_CUSHION[] = { - MAP_OBJ_GFX_PIKA_CUSHION -}; - -const u16 DecorGfx_ROUND_CUSHION[] = { - MAP_OBJ_GFX_ROUND_CUSHION -}; - -const u16 DecorGfx_KISS_CUSHION[] = { - MAP_OBJ_GFX_KISS_CUSHION -}; - -const u16 DecorGfx_ZIGZAG_CUSHION[] = { - MAP_OBJ_GFX_ZIGZAG_CUSHION -}; - -const u16 DecorGfx_SPIN_CUSHION[] = { - MAP_OBJ_GFX_SPIN_CUSHION -}; - -const u16 DecorGfx_DIAMOND_CUSHION[] = { - MAP_OBJ_GFX_DIAMOND_CUSHION -}; - -const u16 DecorGfx_BALL_CUSHION[] = { - MAP_OBJ_GFX_BALL_CUSHION -}; - -const u16 DecorGfx_GRASS_CUSHION[] = { - MAP_OBJ_GFX_GRASS_CUSHION -}; - -const u16 DecorGfx_FIRE_CUSHION[] = { - MAP_OBJ_GFX_FIRE_CUSHION -}; - -const u16 DecorGfx_WATER_CUSHION[] = { - MAP_OBJ_GFX_WATER_CUSHION -}; - -const u16 DecorGfx_SNORLAX_DOLL[] = { - MAP_OBJ_GFX_BIG_SNORLAX_DOLL -}; - -const u16 DecorGfx_RHYDON_DOLL[] = { - MAP_OBJ_GFX_BIG_RHYDON_DOLL -}; - -const u16 DecorGfx_LAPRAS_DOLL[] = { - MAP_OBJ_GFX_BIG_LAPRAS_DOLL -}; - -const u16 DecorGfx_VENUSAUR_DOLL[] = { - MAP_OBJ_GFX_BIG_VENUSAUR_DOLL -}; - -const u16 DecorGfx_CHARIZARD_DOLL[] = { - MAP_OBJ_GFX_BIG_CHARIZARD_DOLL -}; - -const u16 DecorGfx_BLASTOISE_DOLL[] = { - MAP_OBJ_GFX_BIG_BLASTOISE_DOLL -}; - -const u16 DecorGfx_WAILMER_DOLL[] = { - MAP_OBJ_GFX_BIG_WAILMER_DOLL -}; - -const u16 DecorGfx_REGIROCK_DOLL[] = { - MAP_OBJ_GFX_BIG_REGIROCK_DOLL -}; - -const u16 DecorGfx_REGICE_DOLL[] = { - MAP_OBJ_GFX_BIG_REGICE_DOLL -}; - -const u16 DecorGfx_REGISTEEL_DOLL[] = { - MAP_OBJ_GFX_BIG_REGISTEEL_DOLL -}; - -#if ENGLISH -const struct Decoration gDecorations[] = { - {DECOR_NONE, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 0, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, - {DECOR_SMALL_DESK, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, - {DECOR_POKEMON_DESK, _("POKéMON DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_POKEMON_DESK, DecorGfx_POKEMON_DESK}, - {DECOR_HEAVY_DESK, _("HEAVY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_HEAVY_DESK, DecorGfx_HEAVY_DESK}, - {DECOR_RAGGED_DESK, _("RAGGED DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_RAGGED_DESK, DecorGfx_RAGGED_DESK}, - {DECOR_COMFORT_DESK, _("COMFORT DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x2, DECORCAT_DESK, 6000, DecorDesc_COMFORT_DESK, DecorGfx_COMFORT_DESK}, - {DECOR_PRETTY_DESK, _("PRETTY DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_PRETTY_DESK, DecorGfx_PRETTY_DESK}, - {DECOR_BRICK_DESK, _("BRICK DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_BRICK_DESK, DecorGfx_BRICK_DESK}, - {DECOR_CAMP_DESK, _("CAMP DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_CAMP_DESK, DecorGfx_CAMP_DESK}, - {DECOR_HARD_DESK, _("HARD DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_3x3, DECORCAT_DESK, 9000, DecorDesc_HARD_DESK, DecorGfx_HARD_DESK}, - {DECOR_SMALL_CHAIR, _("SMALL CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_SMALL_CHAIR, DecorGfx_SMALL_CHAIR}, - {DECOR_POKEMON_CHAIR, _("POKéMON CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_POKEMON_CHAIR, DecorGfx_POKEMON_CHAIR}, - {DECOR_HEAVY_CHAIR, _("HEAVY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HEAVY_CHAIR, DecorGfx_HEAVY_CHAIR}, - {DECOR_PRETTY_CHAIR, _("PRETTY CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_PRETTY_CHAIR, DecorGfx_PRETTY_CHAIR}, - {DECOR_COMFORT_CHAIR, _("COMFORT CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_COMFORT_CHAIR, DecorGfx_COMFORT_CHAIR}, - {DECOR_RAGGED_CHAIR, _("RAGGED CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_RAGGED_CHAIR, DecorGfx_RAGGED_CHAIR}, - {DECOR_BRICK_CHAIR, _("BRICK CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_BRICK_CHAIR, DecorGfx_BRICK_CHAIR}, - {DECOR_CAMP_CHAIR, _("CAMP CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_CAMP_CHAIR, DecorGfx_CAMP_CHAIR}, - {DECOR_HARD_CHAIR, _("HARD CHAIR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_CHAIR, 2000, DecorDesc_HARD_CHAIR, DecorGfx_HARD_CHAIR}, - {DECOR_RED_PLANT, _("RED PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_RED_PLANT, DecorGfx_RED_PLANT}, - {DECOR_TROPICAL_PLANT, _("TROPICAL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_TROPICAL_PLANT, DecorGfx_TROPICAL_PLANT}, - {DECOR_PRETTY_FLOWERS, _("PRETTY FLOWERS"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_PLANT, 3000, DecorDesc_PRETTY_FLOWERS, DecorGfx_PRETTY_FLOWERS}, - {DECOR_COLORFUL_PLANT, _("COLORFUL PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_COLORFUL_PLANT, DecorGfx_COLORFUL_PLANT}, - {DECOR_BIG_PLANT, _("BIG PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_BIG_PLANT, DecorGfx_BIG_PLANT}, - {DECOR_GORGEOUS_PLANT, _("GORGEOUS PLANT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_2x2, DECORCAT_PLANT, 5000, DecorDesc_GORGEOUS_PLANT, DecorGfx_GORGEOUS_PLANT}, - {DECOR_RED_BRICK, _("RED BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BRICK, DecorGfx_RED_BRICK}, - {DECOR_YELLOW_BRICK, _("YELLOW BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BRICK, DecorGfx_YELLOW_BRICK}, - {DECOR_BLUE_BRICK, _("BLUE BRICK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BRICK, DecorGfx_BLUE_BRICK}, - {DECOR_RED_BALLOON, _("RED BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_RED_BALLOON, DecorGfx_RED_BALLOON}, - {DECOR_BLUE_BALLOON, _("BLUE BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_BLUE_BALLOON, DecorGfx_BLUE_BALLOON}, - {DECOR_YELLOW_BALLOON, _("YELLOW BALLOON"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_YELLOW_BALLOON, DecorGfx_YELLOW_BALLOON}, - {DECOR_RED_TENT, _("RED TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_RED_TENT, DecorGfx_RED_TENT}, - {DECOR_BLUE_TENT, _("BLUE TENT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_ORNAMENT, 10000, DecorDesc_BLUE_TENT, DecorGfx_BLUE_TENT}, - {DECOR_SOLID_BOARD, _("SOLID BOARD"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SOLID_BOARD, DecorGfx_SOLID_BOARD}, - {DECOR_SLIDE, _("SLIDE"), DECORPERM_PASS_FLOOR, DECORSHAPE_2x4, DECORCAT_ORNAMENT, 8000, DecorDesc_SLIDE, DecorGfx_SLIDE}, - {DECOR_FENCE_LENGTH, _("FENCE LENGTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_LENGTH, DecorGfx_FENCE_LENGTH}, - {DECOR_FENCE_WIDTH, _("FENCE WIDTH"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 500, DecorDesc_FENCE_WIDTH, DecorGfx_FENCE_WIDTH}, - {DECOR_TIRE, _("TIRE"), DECORPERM_SOLID_FLOOR, DECORSHAPE_2x2, DECORCAT_ORNAMENT, 800, DecorDesc_TIRE, DecorGfx_TIRE}, - {DECOR_STAND, _("STAND"), DECORPERM_PASS_FLOOR, DECORSHAPE_4x2, DECORCAT_ORNAMENT, 7000, DecorDesc_STAND, DecorGfx_STAND}, - {DECOR_MUD_BALL, _("MUD BALL"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 200, DecorDesc_MUD_BALL, DecorGfx_MUD_BALL}, - {DECOR_BREAKABLE_DOOR, _("BREAKABLE DOOR"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_BREAKABLE_DOOR, DecorGfx_BREAKABLE_DOOR}, - {DECOR_SAND_ORNAMENT, _("SAND ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 3000, DecorDesc_SAND_ORNAMENT, DecorGfx_SAND_ORNAMENT}, - {DECOR_SILVER_SHIELD, _("SILVER SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_SILVER_SHIELD, DecorGfx_SILVER_SHIELD}, - {DECOR_GOLD_SHIELD, _("GOLD SHIELD"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GOLD_SHIELD, DecorGfx_GOLD_SHIELD}, - {DECOR_GLASS_ORNAMENT, _("GLASS ORNAMENT"), DECORPERM_BEHIND_FLOOR, DECORSHAPE_1x2, DECORCAT_ORNAMENT, 0, DecorDesc_GLASS_ORNAMENT, DecorGfx_GLASS_ORNAMENT}, - {DECOR_TV, _("TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 3000, DecorDesc_TV, DecorGfx_TV}, - {DECOR_ROUND_TV, _("ROUND TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_ROUND_TV, DecorGfx_ROUND_TV}, - {DECOR_CUTE_TV, _("CUTE TV"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_ORNAMENT, 4000, DecorDesc_CUTE_TV, DecorGfx_CUTE_TV}, - {DECOR_GLITTER_MAT, _("GLITTER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_GLITTER_MAT, DecorGfx_GLITTER_MAT}, - {DECOR_JUMP_MAT, _("JUMP MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_JUMP_MAT, DecorGfx_JUMP_MAT}, - {DECOR_SPIN_MAT, _("SPIN MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 2000, DecorDesc_SPIN_MAT, DecorGfx_SPIN_MAT}, - {DECOR_C_LOW_NOTE_MAT, _("C Low NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_LOW_NOTE_MAT, DecorGfx_C_LOW_NOTE_MAT}, - {DECOR_D_NOTE_MAT, _("D NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_D_NOTE_MAT, DecorGfx_D_NOTE_MAT}, - {DECOR_E_NOTE_MAT, _("E NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_E_NOTE_MAT, DecorGfx_E_NOTE_MAT}, - {DECOR_F_NOTE_MAT, _("F NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_F_NOTE_MAT, DecorGfx_F_NOTE_MAT}, - {DECOR_G_NOTE_MAT, _("G NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_G_NOTE_MAT, DecorGfx_G_NOTE_MAT}, - {DECOR_A_NOTE_MAT, _("A NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_A_NOTE_MAT, DecorGfx_A_NOTE_MAT}, - {DECOR_B_NOTE_MAT, _("B NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_B_NOTE_MAT, DecorGfx_B_NOTE_MAT}, - {DECOR_C_HIGH_NOTE_MAT, _("C High NOTE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_1x1, DECORCAT_MAT, 500, DecorDesc_C_HIGH_NOTE_MAT, DecorGfx_C_HIGH_NOTE_MAT}, - {DECOR_SURF_MAT, _("SURF MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SURF_MAT, DecorGfx_SURF_MAT}, - {DECOR_THUNDER_MAT, _("THUNDER MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_THUNDER_MAT, DecorGfx_THUNDER_MAT}, - {DECOR_FIRE_BLAST_MAT, _("FIRE BLAST MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FIRE_BLAST_MAT, DecorGfx_FIRE_BLAST_MAT}, - {DECOR_POWDER_SNOW_MAT, _("POWDER SNOW MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_POWDER_SNOW_MAT, DecorGfx_POWDER_SNOW_MAT}, - {DECOR_ATTRACT_MAT, _("ATTRACT MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_ATTRACT_MAT, DecorGfx_ATTRACT_MAT}, - {DECOR_FISSURE_MAT, _("FISSURE MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_FISSURE_MAT, DecorGfx_FISSURE_MAT}, - {DECOR_SPIKES_MAT, _("SPIKES MAT"), DECORPERM_PASS_FLOOR, DECORSHAPE_3x3, DECORCAT_MAT, 4000, DecorDesc_SPIKES_MAT, DecorGfx_SPIKES_MAT}, - {DECOR_BALL_POSTER, _("BALL POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BALL_POSTER, DecorGfx_BALL_POSTER}, - {DECOR_GREEN_POSTER, _("GREEN POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_GREEN_POSTER, DecorGfx_GREEN_POSTER}, - {DECOR_RED_POSTER, _("RED POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_RED_POSTER, DecorGfx_RED_POSTER}, - {DECOR_BLUE_POSTER, _("BLUE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_BLUE_POSTER, DecorGfx_BLUE_POSTER}, - {DECOR_CUTE_POSTER, _("CUTE POSTER"), DECORPERM_NA_WALL, DECORSHAPE_1x1, DECORCAT_POSTER, 1000, DecorDesc_CUTE_POSTER, DecorGfx_CUTE_POSTER}, - {DECOR_PIKA_POSTER, _("PIKA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_PIKA_POSTER, DecorGfx_PIKA_POSTER}, - {DECOR_LONG_POSTER, _("LONG POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_LONG_POSTER, DecorGfx_LONG_POSTER}, - {DECOR_SEA_POSTER, _("SEA POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SEA_POSTER, DecorGfx_SEA_POSTER}, - {DECOR_SKY_POSTER, _("SKY POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_SKY_POSTER, DecorGfx_SKY_POSTER}, - {DECOR_KISS_POSTER, _("KISS POSTER"), DECORPERM_NA_WALL, DECORSHAPE_2x1, DECORCAT_POSTER, 1500, DecorDesc_KISS_POSTER, DecorGfx_KISS_POSTER}, - {DECOR_PICHU_DOLL, _("PICHU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PICHU_DOLL, DecorGfx_PICHU_DOLL}, - {DECOR_PIKACHU_DOLL, _("PIKACHU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_PIKACHU_DOLL, DecorGfx_PIKACHU_DOLL}, - {DECOR_MARILL_DOLL, _("MARILL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MARILL_DOLL, DecorGfx_MARILL_DOLL}, - {DECOR_TOGEPI_DOLL, _("TOGEPI DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOGEPI_DOLL, DecorGfx_TOGEPI_DOLL}, - {DECOR_CYNDAQUIL_DOLL, _("CYNDAQUIL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CYNDAQUIL_DOLL, DecorGfx_CYNDAQUIL_DOLL}, - {DECOR_CHIKORITA_DOLL, _("CHIKORITA DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CHIKORITA_DOLL, DecorGfx_CHIKORITA_DOLL}, - {DECOR_TOTODILE_DOLL, _("TOTODILE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TOTODILE_DOLL, DecorGfx_TOTODILE_DOLL}, - {DECOR_JIGGLYPUFF_DOLL, _("JIGGLYPUFF DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_JIGGLYPUFF_DOLL, DecorGfx_JIGGLYPUFF_DOLL}, - {DECOR_MEOWTH_DOLL, _("MEOWTH DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MEOWTH_DOLL, DecorGfx_MEOWTH_DOLL}, - {DECOR_CLEFAIRY_DOLL, _("CLEFAIRY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_CLEFAIRY_DOLL, DecorGfx_CLEFAIRY_DOLL}, - {DECOR_DITTO_DOLL, _("DITTO DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DITTO_DOLL, DecorGfx_DITTO_DOLL}, - {DECOR_SMOOCHUM_DOLL, _("SMOOCHUM DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SMOOCHUM_DOLL, DecorGfx_SMOOCHUM_DOLL}, - {DECOR_TREECKO_DOLL, _("TREECKO DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TREECKO_DOLL, DecorGfx_TREECKO_DOLL}, - {DECOR_TORCHIC_DOLL, _("TORCHIC DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_TORCHIC_DOLL, DecorGfx_TORCHIC_DOLL}, - {DECOR_MUDKIP_DOLL, _("MUDKIP DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_MUDKIP_DOLL, DecorGfx_MUDKIP_DOLL}, - {DECOR_DUSKULL_DOLL, _("DUSKULL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_DUSKULL_DOLL, DecorGfx_DUSKULL_DOLL}, - {DECOR_WYNAUT_DOLL, _("WYNAUT DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_WYNAUT_DOLL, DecorGfx_WYNAUT_DOLL}, - {DECOR_BALTOY_DOLL, _("BALTOY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_BALTOY_DOLL, DecorGfx_BALTOY_DOLL}, - {DECOR_KECLEON_DOLL, _("KECLEON DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_KECLEON_DOLL, DecorGfx_KECLEON_DOLL}, - {DECOR_AZURILL_DOLL, _("AZURILL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_AZURILL_DOLL, DecorGfx_AZURILL_DOLL}, - {DECOR_SKITTY_DOLL, _("SKITTY DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SKITTY_DOLL, DecorGfx_SKITTY_DOLL}, - {DECOR_SWABLU_DOLL, _("SWABLU DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SWABLU_DOLL, DecorGfx_SWABLU_DOLL}, - {DECOR_GULPIN_DOLL, _("GULPIN DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_GULPIN_DOLL, DecorGfx_GULPIN_DOLL}, - {DECOR_LOTAD_DOLL, _("LOTAD DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_LOTAD_DOLL, DecorGfx_LOTAD_DOLL}, - {DECOR_SEEDOT_DOLL, _("SEEDOT DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_DOLL, 3000, DecorDesc_SEEDOT_DOLL, DecorGfx_SEEDOT_DOLL}, - {DECOR_PIKA_CUSHION, _("PIKA CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_PIKA_CUSHION, DecorGfx_PIKA_CUSHION}, - {DECOR_ROUND_CUSHION, _("ROUND CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ROUND_CUSHION, DecorGfx_ROUND_CUSHION}, - {DECOR_KISS_CUSHION, _("KISS CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_KISS_CUSHION, DecorGfx_KISS_CUSHION}, - {DECOR_ZIGZAG_CUSHION, _("ZIGZAG CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_ZIGZAG_CUSHION, DecorGfx_ZIGZAG_CUSHION}, - {DECOR_SPIN_CUSHION, _("SPIN CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_SPIN_CUSHION, DecorGfx_SPIN_CUSHION}, - {DECOR_DIAMOND_CUSHION, _("DIAMOND CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_DIAMOND_CUSHION, DecorGfx_DIAMOND_CUSHION}, - {DECOR_BALL_CUSHION, _("BALL CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_BALL_CUSHION, DecorGfx_BALL_CUSHION}, - {DECOR_GRASS_CUSHION, _("GRASS CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_GRASS_CUSHION, DecorGfx_GRASS_CUSHION}, - {DECOR_FIRE_CUSHION, _("FIRE CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_FIRE_CUSHION, DecorGfx_FIRE_CUSHION}, - {DECOR_WATER_CUSHION, _("WATER CUSHION"), DECORPERM_SOLID_MAT, DECORSHAPE_1x1, DECORCAT_CUSHION, 2000, DecorDesc_WATER_CUSHION, DecorGfx_WATER_CUSHION}, - {DECOR_SNORLAX_DOLL, _("SNORLAX DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_SNORLAX_DOLL, DecorGfx_SNORLAX_DOLL}, - {DECOR_RHYDON_DOLL, _("RHYDON DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_RHYDON_DOLL, DecorGfx_RHYDON_DOLL}, - {DECOR_LAPRAS_DOLL, _("LAPRAS DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_LAPRAS_DOLL, DecorGfx_LAPRAS_DOLL}, - {DECOR_VENUSAUR_DOLL, _("VENUSAUR DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_VENUSAUR_DOLL, DecorGfx_VENUSAUR_DOLL}, - {DECOR_CHARIZARD_DOLL, _("CHARIZARD DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_CHARIZARD_DOLL, DecorGfx_CHARIZARD_DOLL}, - {DECOR_BLASTOISE_DOLL, _("BLASTOISE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_BLASTOISE_DOLL, DecorGfx_BLASTOISE_DOLL}, - {DECOR_WAILMER_DOLL, _("WAILMER DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_WAILMER_DOLL, DecorGfx_WAILMER_DOLL}, - {DECOR_REGIROCK_DOLL, _("REGIROCK DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGIROCK_DOLL, DecorGfx_REGIROCK_DOLL}, - {DECOR_REGICE_DOLL, _("REGICE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGICE_DOLL, DecorGfx_REGICE_DOLL}, - {DECOR_REGISTEEL_DOLL, _("REGISTEEL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGISTEEL_DOLL, DecorGfx_REGISTEEL_DOLL} -}; -#elif GERMAN -#include "../data/decoration/decorations.h" -#endif - -const u8 *const gUnknown_083EC5E4[] = { - SecretBaseText_Desk, - SecretBaseText_Chair, - SecretBaseText_Plant, - SecretBaseText_Ornament, - SecretBaseText_Mat, - SecretBaseText_Poster, - SecretBaseText_Doll, - SecretBaseText_Cushion -}; - -const struct MenuAction2 gUnknown_083EC604[] = { - {SecretBaseText_Decorate, sub_80FF160}, - {SecretBaseText_PutAway, sub_8100A0C}, - {SecretBaseText_Toss, sub_8101700}, - {gUnknownText_Exit, gpu_pal_decompress_alloc_tag_and_upload} -}; - -const u8 *const gUnknown_083EC624[] = { - SecretBaseText_PutOutDecor, - SecretBaseText_StoreChosenDecor, - SecretBaseText_ThrowAwayDecor, - gMenuText_GoBackToPrev -}; - -const struct YesNoFuncTable gUnknown_083EC634[] = { - {sub_80FF5BC, sub_80FF058}, - {sub_81017A0, sub_80FF058}, - {sub_81017A0, sub_80FF058}, - {sub_8109D04, sub_80FF058} -}; - -// text - -extern u8 gUnknown_0815F399[]; - -void sub_80FE1DC(void) -{ - sub_80FE2B4(); - Menu_DrawStdWindowFrame(0, 0, 10, 9); - Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604); - InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); -} - -void sub_80FE220(void) -{ - gUnknown_020388D4 = 0; - ScriptContext2_Enable(); - sub_80FE1DC(); - sub_80FE394(); -} - -void DecorationPC(u8 taskId) -{ - sub_80FE220(); - gTasks[taskId].func = Task_DecorationPCProcessMenuInput; -} - -void Task_SecretBasePC_Decoration(u8 taskId) -{ - DecorationPC(taskId); - ewram_1f000.items = gSaveBlock1.secretBases[0].decorations; - ewram_1f000.pos = gSaveBlock1.secretBases[0].decorationPos; - ewram_1f000.size = sizeof gSaveBlock1.secretBases[0].decorations; - ewram_1f000.isPlayerRoom = 0; -} - -void DoPlayerPCDecoration(u8 taskId) -{ - DecorationPC(taskId); - ewram_1f000.items = gSaveBlock1.playerRoomDecor; - ewram_1f000.pos = gSaveBlock1.playerRoomDecorPos; - ewram_1f000.size = sizeof gSaveBlock1.playerRoomDecor; - ewram_1f000.isPlayerRoom = 1; -} - -void sub_80FE2B4(void) -{ - u16 palettes[3] = {RGB(24, 24, 24), - RGB(28, 28, 28), - RGB(31, 31, 31)}; - LoadPalette(&palettes[2], 0xdf, 2); - LoadPalette(&palettes[1], 0xd1, 2); - LoadPalette(&palettes[0], 0xd8, 2); -} - -void Task_DecorationPCProcessMenuInput(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - gUnknown_020388D4 = Menu_MoveCursor(-1); - sub_80FE394(); - } - if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - gUnknown_020388D4 = Menu_MoveCursor(1); - sub_80FE394(); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_083EC604[gUnknown_020388D4].func(taskId); - } else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gpu_pal_decompress_alloc_tag_and_upload(taskId); - } - } -} - -void sub_80FE394(void) -{ - Menu_BlankWindowRect(2, 15, 27, 18); - Menu_PrintText(gUnknown_083EC624[gUnknown_020388D4], 2, 15); -} - -void gpu_pal_decompress_alloc_tag_and_upload(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 10, 9); - Menu_BlankWindowRect(2, 15, 27, 18); - FreeSpritePaletteByTag(6); - if (ewram_1f000.isPlayerRoom == 0) - { - ScriptContext1_SetupScript(gUnknown_0815F399); - DestroyTask(taskId); - } else - { - ReshowPlayerPC(taskId); - } -} - -void sub_80FE418(u8 taskId) -{ - sub_80FE5AC(taskId); -} - -void sub_80FE428(u8 taskId) -{ - InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); - sub_80FE394(); - gTasks[taskId].func = Task_DecorationPCProcessMenuInput; -} - -void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCategorySelectionMenuString -{ - u8 *strptr; - u8 v0; - v0 = Menu_GetTextWindowPaletteNum(); - // PALETTE {palIdx} - strptr = gStringVar4; - strptr[0] = EXT_CTRL_CODE_BEGIN; - strptr[1] = 5; - strptr[2] = palIdx; - strptr += 3; - strptr = StringCopy(strptr, gUnknown_083EC5E4[decoCat]); - strptr = sub_8072C14(strptr, sub_8134194(decoCat), 0x56, 1); - *strptr++ = 0xba; - strptr = sub_8072C14(strptr, gDecorationInventories[decoCat].size, 0x68, 1); - strptr[0] = EXT_CTRL_CODE_BEGIN; - strptr[1] = 5; - strptr[2] = v0; - strptr[3] = EOS; - Menu_PrintText(gStringVar4, left, top); -} - -void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings -{ - u8 decoCat; - Menu_DrawStdWindowFrame(0, 0, 14, 19); - for (decoCat=0; decoCat<8; decoCat++) - { - if (ewram_1f000.isPlayerRoom == 1 && gTasks[taskId].data[11] == 0 && decoCat != DECORCAT_DOLL && decoCat != DECORCAT_CUSHION) - { - sub_80FE470(decoCat, 1, 2 * decoCat + 1, 13); // Selectable - } else - { - sub_80FE470(decoCat, 1, 2 * decoCat + 1, 255); // Unselectable - } - } - Menu_PrintText(gUnknownText_Exit, 1, 17); -} - -void sub_80FE5AC(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 29, 19); - sub_80FE528(taskId); - InitMenu(0, 1, 1, 9, gUnknown_020388F6, 13); - gTasks[taskId].func = sub_80FE604; -} - -void sub_80FE604(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_020388F6 = Menu_GetCursorPos(); - if (gUnknown_020388F6 != 8) - { - gUnknown_020388D5 = sub_8134194(gUnknown_020388F6); - if (gUnknown_020388D5) - { - sub_8134104(gUnknown_020388F6); - gUnknown_020388D0 = gDecorationInventories[gUnknown_020388F6].items; - sub_80FEF50(taskId); - ClearVerticalScrollIndicatorPalettes(); - sub_80F9480(gUnknown_020388F7, 8); - LoadScrollIndicatorPalette(); - gTasks[taskId].func = sub_80FE868; - } else - { - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 14, 19); - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE418, 0); - } - } else - { - sub_80FE728(taskId); - } - } else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_80FE728(taskId); - } - } -} - -void sub_80FE728(u8 taskId) -{ - if (gTasks[taskId].data[11] != 3) - { - sub_80FE758(taskId); - } else - { - sub_8109DAC(taskId); - } -} - -void sub_80FE758(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 14, 19); - if (gTasks[taskId].data[11] != 2) - { - sub_80FE1DC(); - Menu_DisplayDialogueFrame(); - sub_80FE394(); - gTasks[taskId].func = Task_DecorationPCProcessMenuInput; - } else - { - Shop_RunExitSellMenuTask(taskId); - } -} - -void sub_80FE7A8(u8 taskId) -{ - gTasks[taskId].data[11] = 3; - gUnknown_020388F6 = 0; - sub_80FE5AC(taskId); -} - -void sub_80FE7D4(u8 *dest, u8 decClass) -{ - StringCopy(dest, gUnknown_083EC5E4[decClass]); -} - -void sub_80FE7EC(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 29, 19); - - sub_80FEC94(taskId); - sub_80FECB8(gUnknown_020388F6); - -#if ENGLISH - Menu_DrawStdWindowFrame(15, 12, 29, 19); -#elif GERMAN - if ((gUnknown_020388F2 + gUnknown_020388F4) != gUnknown_020388D5) - { - Menu_DrawStdWindowFrame(15, 12, 29, 19); - } -#endif - - sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); - InitMenu(0, 1, 2, gUnknown_020388F3 + 1, gUnknown_020388F2, 13); -} - -void sub_80FE868(u8 taskId) -{ - sub_80FE7EC(taskId); - gTasks[taskId].func = sub_80FE948; -} - -void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/) -{ - int v0 /*r10*/; - u8 v1; - v0 = gUnknown_020388F2 + gUnknown_020388F4 == gUnknown_020388D5; - PlaySE(SE_SELECT); - if (cursorVector != 0) - { - gUnknown_020388F2 = Menu_MoveCursor(cursorVector); - } - if (bgVector != 0) - { - v1 = gUnknown_020388F4; - gUnknown_020388F4 = v1 + bgVector; - sub_80FEABC(taskId, 1); - } - if (gUnknown_020388F2 + gUnknown_020388F4 != gUnknown_020388D5) - { - if (v0) - { - Menu_DrawStdWindowFrame(15, 12, 29, 19); - } - sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); - } else - { - Menu_EraseWindowRect(15, 12, 29, 19); - } -} - -void sub_80FE948(u8 taskId) -{ - if (!gPaletteFade.active) - { - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - if (gUnknown_020388F2 != 0) - { - sub_80FE894(taskId, -1, 0); - } else if (gUnknown_020388F4 != 0) - { - sub_80FE894(taskId, 0, -1); - } - } - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - if (gUnknown_020388F2 != gUnknown_020388F3) - { - sub_80FE894(taskId, 1, 0); - } else if (gUnknown_020388F4 + gUnknown_020388F2 != gUnknown_020388D5) - { - sub_80FE894(taskId, 0, 1); - } - } - if (gMain.newKeys & A_BUTTON) - { - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - gUnknown_020388F5 = gUnknown_020388F2 + gUnknown_020388F4; - if (gUnknown_020388F5 == gUnknown_020388D5) - { - gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); - } else - { - gUnknown_083EC634[gTasks[taskId].data[11]].yesFunc(taskId); - } - } else if (gMain.newKeys & B_BUTTON) - { - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); - } - } -} - -const u8 gUnknown_083EC65A[] = _("{PALETTE 13}{STR_VAR_1}"); - -void sub_80FEABC(u8 taskId, u8 dummy1) -{ - u16 i; - u16 j; - u8 ni; - if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(TOP_ARROW), gUnknown_020388F4 != 0)) - { - CreateVerticalScrollIndicators(TOP_ARROW, 0x3c, 0x08); - } - if (gUnknown_020388F4 + 7 == gUnknown_020388D5) - { - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - } - if (gUnknown_020388F4 + 7 < gUnknown_020388D5) - { - CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x3c, 0x98); - } - for (i=gUnknown_020388F4; i gUnknown_020388D5 && gUnknown_020388F4 != 0) - { - gUnknown_020388F4--; - } - sub_8134104(gUnknown_020388F6); - sub_80FED90(taskId); - sub_80FEF28(); -} - -void sub_80FF0E0(u8 taskId) -{ - gTasks[taskId].data[3] = gSaveBlock1.pos.x; - gTasks[taskId].data[4] = gSaveBlock1.pos.y; - PlayerGetDestCoords(&gTasks[taskId].data[0], &gTasks[taskId].data[1]); -} - -void sub_80FF114(u8 taskId) -{ - DrawWholeMapView(); - Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); - warp_in(); -} -void sub_80FF160(u8 taskId) -{ - if (!sub_81341D4()) - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); - } else - { - gTasks[taskId].data[11] = 0; - gUnknown_020388F6 = 0; - sub_80FE5AC(taskId); - } -} - -u16 sub_80FF1B0(u8 decoId, u8 a1) -{ - u16 retval; - retval = 0xffff; - - switch (decoId) - { - case DECOR_STAND: - retval = gUnknown_083EC97C[a1] << 12; - return retval; - case DECOR_SLIDE: - retval = gUnknown_083EC984[a1] << 12; - return retval; - default: - return retval; - } -} - -void sub_80FF1EC(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight, u16 decIdx) -{ - u16 i; - u16 j; // r10 - u16 behavior; - u16 flags; // r8 - u16 v0; - u16 v1; - s16 x; - s16 decBottom; - - for (i=0; i> 12))) - { - flags = 0xc00; - } else - { - flags = 0x000; - } - if (gDecorations[decIdx].permission != DECORPERM_NA_WALL && sub_80572B0(MapGridGetMetatileBehaviorAt(x, decBottom)) == 1) - { - v0 = 1; - } else - { - v0 = 0; - } - v1 = sub_80FF1B0(gDecorations[decIdx].id, i * decWidth + j); - if (v1 != 0xffff) - { - MapGridSetMetatileEntryAt(x, decBottom, (gDecorations[decIdx].tiles[i * decWidth + j] + (0x200 | v0)) | flags | v1); - } else - { - MapGridSetMetatileIdAt(x, decBottom, (gDecorations[decIdx].tiles[i * decWidth + j] + (0x200 | v0)) | flags); - } - } - } -} - -void sub_80FF394(u16 mapX, u16 mapY, u16 decIdx) -{ - switch (gDecorations[decIdx].shape) - { - case DECORSHAPE_1x1: - sub_80FF1EC(mapX, mapY, 1, 1, decIdx); - break; - case DECORSHAPE_2x1: - sub_80FF1EC(mapX, mapY, 2, 1, decIdx); - break; - case DECORSHAPE_3x1: // unused - sub_80FF1EC(mapX, mapY, 3, 1, decIdx); - break; - case DECORSHAPE_4x2: - sub_80FF1EC(mapX, mapY, 4, 2, decIdx); - break; - case DECORSHAPE_2x2: - sub_80FF1EC(mapX, mapY, 2, 2, decIdx); - break; - case DECORSHAPE_1x2: - sub_80FF1EC(mapX, mapY, 1, 2, decIdx); - break; - case DECORSHAPE_1x3: // unused - sub_80FF1EC(mapX, mapY, 1, 3, decIdx); - break; - case DECORSHAPE_2x4: - sub_80FF1EC(mapX, mapY, 2, 4, decIdx); - break; - case DECORSHAPE_3x3: - sub_80FF1EC(mapX, mapY, 3, 3, decIdx); - break; - case DECORSHAPE_3x2: - sub_80FF1EC(mapX, mapY, 3, 2, decIdx); - break; - } -} - -void sub_80FF474(void) -{ - u8 i; - u8 j; - for (i=0; i<14; i++) - { - if (FlagGet(i + FLAG_DECORATION_2) == 1) - { - FlagClear(i + FLAG_DECORATION_2); - for (j=0; jmapObjectCount; j++) - { - if (gMapHeader.events->mapObjects[j].flagId == i + FLAG_DECORATION_2) - { - break; - } - } - VarSet(0x3f20 + gMapHeader.events->mapObjects[j].graphicsId, gUnknown_02038900.decoration->tiles[0]); - gSpecialVar_0x8005 = gMapHeader.events->mapObjects[j].localId; - gSpecialVar_0x8006 = gUnknown_020391A4; - gSpecialVar_0x8007 = gUnknown_020391A6; - show_sprite(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - sub_805C0F8(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); - sub_805C78C(gSpecialVar_0x8005, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - break; - } - } -} - -bool8 sub_80FF58C/*IsThereRoomForMoreDecorations*/(void) -{ - u16 i; - for (i=0; idecoration = &gDecorations[decoIdx]; - if (gDecorations[decoIdx].permission != DECORPERM_SOLID_MAT) - { - sub_81008BC(unk_02038900); - sub_8100930(unk_02038900->decoration->shape); - sub_8100874(unk_02038900); - sub_810070C(unk_02038900->palette, ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles + 8 * unk_02038900->decoration->tiles[0])[7] >> 12); - LoadSpritePalette(&gUnknown_083EC954); - gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0]; - gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83EC93C, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 0); - } else - { - gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0]; - gUnknown_03004880.unk4 = AddPseudoFieldObject(unk_02038900->decoration->tiles[0], sub_81009A8, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 1); - gSprites[gUnknown_03004880.unk4].oam.priority = 1; - } -} - -void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_02038900 *unk_02038900) -{ - u8 v0; - v0 = 16 * (u8)gTasks[taskId].data[5] + gUnknown_083EC900[unk_02038900->decoration->shape].x - 8 * ((u8)gTasks[taskId].data[5] - 1); - if (unk_02038900->decoration->shape == DECORSHAPE_3x1 || unk_02038900->decoration->shape == DECORSHAPE_3x3 || unk_02038900->decoration->shape == DECORSHAPE_3x2) - { - v0 -= 8; - } - if (gSaveBlock2.playerGender == MALE) - { - gUnknown_020391A9 = AddPseudoFieldObject(0xc1, SpriteCallbackDummy, v0, 0x48, 0); - } else - { - gUnknown_020391A9 = AddPseudoFieldObject(0xc2, SpriteCallbackDummy, v0, 0x48, 0); - } - gSprites[gUnknown_020391A9].oam.priority = 1; - DestroySprite(&gSprites[gUnknown_020391A8]); - gUnknown_020391A8 = gUnknown_03004880.unk4; -} - -void sub_80FF960(u8 taskId) -{ - switch (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].shape) - { - case DECORSHAPE_1x1: - gTasks[taskId].data[5] = 1; - gTasks[taskId].data[6] = 1; - break; - case DECORSHAPE_2x1: - gTasks[taskId].data[5] = 2; - gTasks[taskId].data[6] = 1; - break; - case DECORSHAPE_3x1: - gTasks[taskId].data[5] = 3; - gTasks[taskId].data[6] = 1; - break; - case DECORSHAPE_4x2: - gTasks[taskId].data[5] = 4; - gTasks[taskId].data[6] = 2; - break; - case DECORSHAPE_2x2: - gTasks[taskId].data[5] = 2; - gTasks[taskId].data[6] = 2; - break; - case DECORSHAPE_1x2: - gTasks[taskId].data[5] = 1; - gTasks[taskId].data[6] = 2; - break; - case DECORSHAPE_1x3: - gTasks[taskId].data[5] = 1; - gTasks[taskId].data[6] = 3; - gTasks[taskId].data[1]++; - break; - case DECORSHAPE_2x4: - gTasks[taskId].data[5] = 2; - gTasks[taskId].data[6] = 4; - break; - case DECORSHAPE_3x3: - gTasks[taskId].data[5] = 3; - gTasks[taskId].data[6] = 3; - break; - case DECORSHAPE_3x2: - gTasks[taskId].data[5] = 3; - gTasks[taskId].data[6] = 2; - break; - } -} - -void sub_80FFAB0(u8 taskId) -{ - gTasks[taskId].data[10] = 0; - gSprites[gUnknown_020391A8].data[7] = 1; - gSprites[gUnknown_020391A9].data[7] = 1; - sub_810045C(); - sub_8100038(taskId); -} - -void sub_80FFB08(u8 taskId) -{ - gTasks[taskId].data[10] = 0; - gSprites[gUnknown_020391A8].data[7] = 1; - gSprites[gUnknown_020391A9].data[7] = 1; - sub_810045C(); - DisplayItemMessageOnField(taskId, gSecretBaseText_CancelDecorating, sub_8100248, 0); -} - -bool8 sub_80FFB6C(u8 a0, u16 a1) -{ - if (sub_8057274(a0) != 1 || a1 != 0) - { - return FALSE; - } - return TRUE; -} - -bool8 sub_80FFB94(u8 taskId, s16 x, s16 y, u16 decoId) -{ - if (x == gTasks[taskId].data[3] + 7 && y == gTasks[taskId].data[4] + 7 && decoId != 0) - { - return FALSE; - } - return TRUE; -} - -bool8 sub_80FFBDC(u16 a0, const struct Decoration *decoration) -{ - if (sub_8057274(a0) != 1) - { - if (decoration->id == DECOR_SOLID_BOARD && sub_8057300(a0) == 1) - { - return TRUE; - } - if (sub_805729C(a0)) - { - return TRUE; - } - } - return FALSE; -} - -// When behaviorBy is set, it is masked by 0xf000. This is the step that fails to match when built. -#ifdef NONMATCHING -bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) -{ - u8 i; - u8 j; - u8 behaviorAt; - u16 behaviorBy; - u8 mapY; - u8 mapX; - s16 curY; - s16 curX; - mapY = gTasks[taskId].data[6]; - mapX = gTasks[taskId].data[5]; - switch (decoration->permission) - { - case DECORPERM_SOLID_FLOOR: - case DECORPERM_PASS_FLOOR: - for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; - if (!sub_80FFBDC(behaviorAt, decoration)) - { - return FALSE; - } - if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) - { - return FALSE; - } - behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); - if (behaviorAt != 0 && behaviorAt != 16) - { - return FALSE; - } - } - } - break; - case DECORPERM_BEHIND_FLOOR: - for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; - if (!sub_805729C(behaviorAt) && !sub_80FFB6C(behaviorAt, behaviorBy)) - { - return FALSE; - } - if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) - { - return FALSE; - } - if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) - { - return FALSE; - } - } - } - curY = gTasks[taskId].data[1] - mapY + 1; - for (j=0; jtiles[j]) & 0xf000; - if (!sub_805729C(behaviorAt) && !sub_80572B0(behaviorAt)) - { - return FALSE; - } - if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) - { - return FALSE; - } - behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); - if (behaviorAt != 0 && behaviorAt != 16) - { - return FALSE; - } - } - break; - case DECORPERM_NA_WALL: - for (i=0; ishape == DECORSHAPE_1x2) - { - if (!sub_80572EC(behaviorAt)) - { - return FALSE; - } - } - else if (!sub_80572D8(behaviorAt)) - { - if (!sub_80572EC(behaviorAt)) - { - return FALSE; - } - } - if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) - { - return FALSE; - } - } - break; - } - return TRUE; -} -#else -__attribute__((naked)) -bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration) -{ - asm(".syntax unified\n" - "\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x24\n" - "\tstr r1, [sp]\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "\tldr r1, _080FFC60 @ =gTasks\n" - "\tlsls r0, 2\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r1\n" - "\tldrb r2, [r0, 0x14]\n" - "\tstr r2, [sp, 0x4]\n" - "\tldrb r0, [r0, 0x12]\n" - "\tstr r0, [sp, 0x8]\n" - "\tldr r3, [sp]\n" - "\tldrb r0, [r3, 0x11]\n" - "\tadds r2, r1, 0\n" - "\tcmp r0, 0x4\n" - "\tbls _080FFC56\n" - "\tb _08100024\n" - "_080FFC56:\n" - "\tlsls r0, 2\n" - "\tldr r1, _080FFC64 @ =_080FFC68\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_080FFC60: .4byte gTasks\n" - "_080FFC64: .4byte _080FFC68\n" - "\t.align 2, 0\n" - "_080FFC68:\n" - "\t.4byte _080FFC7C\n" - "\t.4byte _080FFC7C\n" - "\t.4byte _080FFD68\n" - "\t.4byte _080FFF1C\n" - "\t.4byte _080FFFA0\n" - "_080FFC7C:\n" - "\tmovs r6, 0\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFC86\n" - "\tb _08100024\n" - "_080FFC86:\n" - "\tmov r1, r10\n" - "\tlsls r1, 2\n" - "\tstr r1, [sp, 0x1C]\n" - "_080FFC8C:\n" - "\tmov r2, r10\n" - "\tlsls r0, r2, 2\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r3, _080FFD64 @ =gTasks\n" - "\tadds r0, r3\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tadds r6, 0x1\n" - "\tstr r6, [sp, 0x14]\n" - "\tldr r0, [sp, 0x8]\n" - "\tcmp r7, r0\n" - "\tbcs _080FFD56\n" - "\tmov r1, r9\n" - "\tlsls r1, 16\n" - "\tstr r1, [sp, 0xC]\n" - "\tasrs r1, 16\n" - "\tmov r9, r1\n" - "_080FFCB8:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r2, _080FFD64 @ =gTasks\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tadds r0, r6, 0\n" - "\tmov r1, r9\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp, 0x4]\n" - "\tldr r1, [sp, 0x14]\n" - "\tsubs r0, r3, r1\n" - "\tldr r2, [sp, 0x8]\n" - "\tadds r1, r0, 0\n" - "\tmuls r1, r2\n" - "\tadds r1, r7\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tldr r1, [sp]\n" - "\tbl sub_80FFBDC\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFD1A\n" - "\tb _080FFFF4\n" - "_080FFD1A:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tmov r2, r9\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFD2E\n" - "\tb _080FFFF4\n" - "_080FFD2E:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0xC]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetFieldObjectIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r4, 0\n" - "\tbeq _080FFD4A\n" - "\tcmp r4, 0x10\n" - "\tbeq _080FFD4A\n" - "\tb _080FFFF4\n" - "_080FFD4A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFCB8\n" - "_080FFD56:\n" - "\tldr r1, [sp, 0x14]\n" - "\tlsls r0, r1, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r2, [sp, 0x4]\n" - "\tcmp r6, r2\n" - "\tbcc _080FFC8C\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFD64: .4byte gTasks\n" - "_080FFD68:\n" - "\tmovs r6, 0\n" - "\tmov r3, r10\n" - "\tlsls r3, 2\n" - "\tstr r3, [sp, 0x1C]\n" - "\tldr r0, [sp, 0x4]\n" - "\tsubs r0, 0x1\n" - "\tstr r0, [sp, 0x18]\n" - "\tcmp r6, r0\n" - "\tbge _080FFE54\n" - "\tadds r0, r3, 0\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tstr r0, [sp, 0x10]\n" - "_080FFD82:\n" - "\tldr r1, [sp, 0x10]\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tadds r6, 0x1\n" - "\tstr r6, [sp, 0x14]\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcs _080FFE48\n" - "\tlsls r0, 16\n" - "\tstr r0, [sp, 0x20]\n" - "_080FFDA0:\n" - "\tldr r1, [sp, 0x10]\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp, 0x4]\n" - "\tldr r1, [sp, 0x14]\n" - "\tsubs r0, r3, r1\n" - "\tldr r2, [sp, 0x8]\n" - "\tadds r1, r0, 0\n" - "\tmuls r1, r2\n" - "\tadds r1, r7\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tbl sub_805729C\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE0C\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0\n" - "\tbl sub_80FFB6C\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE0C\n" - "\tb _080FFFF4\n" - "_080FFE0C:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tldr r3, [sp, 0x20]\n" - "\tasrs r2, r3, 16\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFE22\n" - "\tb _080FFFF4\n" - "_080FFE22:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetFieldObjectIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x10\n" - "\tbeq _080FFE3A\n" - "\tb _080FFFF4\n" - "_080FFE3A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r2, _080FFF18 @ =gTasks\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFDA0\n" - "_080FFE48:\n" - "\tldr r1, [sp, 0x14]\n" - "\tlsls r0, r1, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r3, [sp, 0x18]\n" - "\tcmp r6, r3\n" - "\tblt _080FFD82\n" - "_080FFE54:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tldr r1, [sp, 0x4]\n" - "\tsubs r0, r1\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFE74\n" - "\tb _08100024\n" - "_080FFE74:\n" - "\tlsls r0, 16\n" - "\tstr r0, [sp, 0x20]\n" - "_080FFE78:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tldr r1, _080FFF18 @ =gTasks\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tmov r8, r0\n" - "\tasrs r6, r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp]\n" - "\tldr r0, [r3, 0x1C]\n" - "\tlsls r1, r7, 1\n" - "\tadds r1, r0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 2\n" - "\tadds r0, r2, 0\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tbl GetBehaviorByMetatileId\n" - "\tmovs r3, 0xF0\n" - "\tlsls r3, 8\n" - "\tadds r1, r3, 0\n" - "\tadds r5, r1, 0\n" - "\tands r5, r0\n" - "\tadds r0, r4, 0\n" - "\tbl sub_805729C\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEDA\n" - "\tadds r0, r4, 0\n" - "\tbl sub_80572B0\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEDA\n" - "\tb _080FFFF4\n" - "_080FFEDA:\n" - "\tmov r0, r10\n" - "\tadds r1, r6, 0\n" - "\tldr r3, [sp, 0x20]\n" - "\tasrs r2, r3, 16\n" - "\tadds r3, r5, 0\n" - "\tbl sub_80FFB94\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _080FFEF0\n" - "\tb _080FFFF4\n" - "_080FFEF0:\n" - "\tmov r1, r8\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetFieldObjectIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r4, 0\n" - "\tbeq _080FFF0A\n" - "\tcmp r4, 0x10\n" - "\tbne _080FFFF4\n" - "_080FFF0A:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFE78\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFF18: .4byte gTasks\n" - "_080FFF1C:\n" - "\tmovs r6, 0\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFF26\n" - "\tb _08100024\n" - "_080FFF26:\n" - "\tmov r1, r10\n" - "\tlsls r0, r1, 2\n" - "\tadd r0, r10\n" - "\tlsls r1, r0, 3\n" - "\tldr r2, _080FFF9C @ =gTasks\n" - "\tadds r0, r1, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tsubs r0, r6\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcs _080FFF8C\n" - "\tadds r0, r2, 0\n" - "\tadds r1, r0\n" - "\tmov r8, r1\n" - "\tmov r1, r9\n" - "\tlsls r0, r1, 16\n" - "\tasrs r5, r0, 16\n" - "_080FFF50:\n" - "\tmov r2, r8\n" - "\tldrh r0, [r2, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tasrs r4, r0, 16\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tbl sub_80572B0\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080FFFF4\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0x1\n" - "\tbl MapGridGetMetatileIdAt\n" - "\tmovs r1, 0xA3\n" - "\tlsls r1, 2\n" - "\tcmp r0, r1\n" - "\tbeq _080FFFF4\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFF50\n" - "_080FFF8C:\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r0, [sp, 0x4]\n" - "\tcmp r6, r0\n" - "\tbcc _080FFF26\n" - "\tb _08100024\n" - "\t.align 2, 0\n" - "_080FFF9C: .4byte gTasks\n" - "_080FFFA0:\n" - "\tmov r3, r10\n" - "\tlsls r1, r3, 2\n" - "\tadds r0, r1, r3\n" - "\tlsls r0, 3\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0, 0xA]\n" - "\tmov r9, r0\n" - "\tmovs r7, 0\n" - "\tstr r1, [sp, 0x1C]\n" - "\tldr r0, [sp, 0x8]\n" - "\tcmp r7, r0\n" - "\tbcs _08100024\n" - "\tadds r6, r2, 0\n" - "\tmov r1, r9\n" - "\tlsls r1, 16\n" - "\tstr r1, [sp, 0x20]\n" - "_080FFFC0:\n" - "\tldr r0, [sp, 0x1C]\n" - "\tadd r0, r10\n" - "\tlsls r0, 3\n" - "\tadds r0, r6\n" - "\tldrh r0, [r0, 0x8]\n" - "\tadds r0, r7\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tasrs r0, 16\n" - "\tmov r2, r9\n" - "\tlsls r1, r2, 16\n" - "\tasrs r1, 16\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldr r3, [sp]\n" - "\tldrb r0, [r3, 0x12]\n" - "\tcmp r0, 0x5\n" - "\tbne _080FFFF8\n" - "_080FFFE8:\n" - "\tadds r0, r4, 0\n" - "\tbl sub_80572EC\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _08100004\n" - "_080FFFF4:\n" - "\tmovs r0, 0\n" - "\tb _08100026\n" - "_080FFFF8:\n" - "\tadds r0, r4, 0\n" - "\tbl sub_80572D8\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080FFFE8\n" - "_08100004:\n" - "\tadds r0, r5, 0\n" - "\tldr r2, [sp, 0x20]\n" - "\tlsrs r1, r2, 16\n" - "\tmovs r2, 0\n" - "\tbl GetFieldObjectIdByXYZ\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x10\n" - "\tbne _080FFFF4\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tldr r3, [sp, 0x8]\n" - "\tcmp r7, r3\n" - "\tbcc _080FFFC0\n" - "_08100024:\n" - "\tmovs r0, 0x1\n" - "_08100026:\n" - "\tadd sp, 0x24\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - ".syntax divided\n"); -} -#endif - -void sub_8100038(u8 taskId) -{ - if (sub_80FFC24(taskId, &gDecorations[gUnknown_020388D0[gUnknown_020388F5]]) == 1) - { - DisplayItemMessageOnField(taskId, gSecretBaseText_PlaceItHere, sub_81000A0, 0); - } else - { - PlaySE(SE_HAZURE); - DisplayItemMessageOnField(taskId, gSecretBaseText_CantBePlacedHere, sub_81006A8, 0); - } -} - -void sub_81000A0(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083EC95C); -} - -void sub_81000C4(u8 taskId) -{ - Menu_EraseWindowRect(0, 0, 29, 19); - sub_8100174(taskId); - if (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].permission != DECORPERM_SOLID_MAT) - { - sub_80FF394(gTasks[taskId].data[0], gTasks[taskId].data[1], gUnknown_020388D0[gUnknown_020388F5]); - } else - { - gUnknown_020391A4 = gTasks[taskId].data[0] - 7; - gUnknown_020391A6 = gTasks[taskId].data[1] - 7; - ScriptContext1_SetupScript(gUnknown_081A2F7B); - } - gSprites[gUnknown_020391A8].pos1.y += 2; - sub_810028C(taskId); -} - -void sub_8100174(u8 taskId) -{ - u16 i; - for (i=0; i= gMapHeader.mapData->height) - { - data[1]--; - return FALSE; - } else if (gUnknown_020391AA == DIR_WEST && data[0] - 7 < 0) - { - data[0]++; - return FALSE; - } else if (gUnknown_020391AA == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width) - { - data[0]--; - return FALSE; - } - return TRUE; -} - -bool8 sub_8100430(void) -{ - if ((gMain.heldKeys & DPAD_ANY) != DPAD_UP && (gMain.heldKeys & DPAD_ANY) != DPAD_DOWN && (gMain.heldKeys & DPAD_ANY) != DPAD_LEFT && (gMain.heldKeys & DPAD_ANY) != DPAD_RIGHT) - { - return FALSE; - } - return TRUE; -} - -void sub_810045C(void) -{ - gUnknown_020391AA = 0; - gSprites[gUnknown_020391A8].data[2] = 0; - gSprites[gUnknown_020391A8].data[3] = 0; -} - -void sub_8100494(u8 taskId) -{ - if (!gSprites[gUnknown_020391A8].data[4]) - { - if (gTasks[taskId].data[10] == 1) - { - gUnknown_083EC96C[gTasks[taskId].data[12]].yesFunc(taskId); - return; - } else if (gTasks[taskId].data[10] == 2) - { - gUnknown_083EC96C[gTasks[taskId].data[12]].noFunc(taskId); - return; - } - if ((gMain.heldKeys & DPAD_ANY) == DPAD_UP) - { - gUnknown_020391AA = DIR_SOUTH; - gSprites[gUnknown_020391A8].data[2] = 0; - gSprites[gUnknown_020391A8].data[3] = -2; - gTasks[taskId].data[1]--; - } - if ((gMain.heldKeys & DPAD_ANY) == DPAD_DOWN) - { - gUnknown_020391AA = DIR_NORTH; - gSprites[gUnknown_020391A8].data[2] = 0; - gSprites[gUnknown_020391A8].data[3] = 2; - gTasks[taskId].data[1]++; - } - if ((gMain.heldKeys & DPAD_ANY) == DPAD_LEFT) - { - gUnknown_020391AA = DIR_WEST; - gSprites[gUnknown_020391A8].data[2] = -2; - gSprites[gUnknown_020391A8].data[3] = 0; - gTasks[taskId].data[0]--; - } - if ((gMain.heldKeys & DPAD_ANY) == DPAD_RIGHT) - { - gUnknown_020391AA = DIR_EAST; - gSprites[gUnknown_020391A8].data[2] = 2; - gSprites[gUnknown_020391A8].data[3] = 0; - gTasks[taskId].data[0]++; - } - if (!sub_8100430() || !sub_810038C(taskId)) - { - sub_810045C(); - } - } - if (gUnknown_020391AA) - { - gSprites[gUnknown_020391A8].data[4]++; - gSprites[gUnknown_020391A8].data[4] &= 7; - } - if (!gTasks[taskId].data[10]) - { - if (gMain.newKeys & A_BUTTON) - { - gTasks[taskId].data[10] = A_BUTTON; - } - if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = B_BUTTON; - } - } -} - -void sub_810065C(u8 taskId) -{ - Menu_EraseWindowRect(0, 0, 29, 19); - gSprites[gUnknown_020391A8].data[7] = 0; - gTasks[taskId].data[10] = 0; - gTasks[taskId].func = sub_8100494; -} - -void sub_81006A8(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - sub_810065C(taskId); - } -} - -void sub_81006D0(struct UnkStruct_02038900 *unk_02038900) -{ - u16 i; - for (i=0; i<0x800; i++) - { - unk_02038900->image[i] = 0; - } - for (i=0; i<0x40; i++) - { - unk_02038900->tiles[i] = 0; - } -} - -void sub_810070C(u16 *a0, u16 a1) -{ - u16 i; - for (i=0; i<16; i++) - { - a0[i] = ((u16 *)gMapHeader.mapData->primaryTileset->palettes)[16 * a1 + i]; - } -} - -void sub_8100740(u8 *dest, u16 flags) -{ - u8 buffer[32]; - u16 mode; - u16 i; - mode = flags >> 10; - if (flags != 0) - { - flags &= 0x3ff; - } - for (i=0; i<32; i++) - { - buffer[i] = ((u8 *)gMapHeader.mapData->primaryTileset->tiles)[flags * 32 + i]; - } - switch (mode) - { - case 0: - for (i=0; i<32; i++) - { - dest[i] = buffer[i]; - } - break; - case 1: - for (i=0; i<8; i++) - { - dest[4*i] = (buffer[4*(i+1) - 1] >> 4) + ((buffer[4*(i+1) - 1] & 0xf) << 4); - dest[4*i + 1] = (buffer[4*(i+1) - 2] >> 4) + ((buffer[4*(i+1) - 2] & 0xf) << 4); - dest[4*i + 2] = (buffer[4*(i+1) - 3] >> 4) + ((buffer[4*(i+1) - 3] & 0xf) << 4); - dest[4*i + 3] = (buffer[4*(i+1) - 4] >> 4) + ((buffer[4*(i+1) - 4] & 0xf) << 4); - } - break; - case 2: - for (i=0; i<8; i++) - { - dest[4*i] = buffer[4*(7-i)]; - dest[4*i + 1] = buffer[4*(7-i) + 1]; - dest[4*i + 2] = buffer[4*(7-i) + 2]; - dest[4*i + 3] = buffer[4*(7-i) + 3]; - } - break; - case 3: - for (i=0; i<32; i++) - { - dest[i] = (buffer[31-i] >> 4) + ((buffer[31-i] & 0xf) << 4); - } - break; - } -} - -void sub_8100874(struct UnkStruct_02038900 *unk_02038900) -{ - u16 i; - for (i=0; i<0x40; i++) - sub_8100740(&unk_02038900->image[i * 32], unk_02038900->tiles[i]); -} - -u16 sub_810089C(u16 a0) -{ - return ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles)[a0] & 0xfff; -} - -const u8 Unknown_3EC660[] = {0, 1, 2, 3}; -const u8 Unknown_3EC664[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13}; -const u8 Unknown_3EC670[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; -const u8 Unknown_3EC680[] = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21}; -const u8 Unknown_3EC68C[] = {0, 1, 2, 3, 4, 5, 6, 7}; -const u8 Unknown_3EC694[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; -const u8 Unknown_3EC6B4[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45}; -const u8 Unknown_3EC6D8[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29}; - -const u8 Unknown_3EC6F0[] = {0, 0, 0, 0}; -const u8 Unknown_3EC6F4[] = {0, 0, 1, 1, 0, 0, 1, 1}; -const u8 Unknown_3EC6FC[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2}; -const u8 Unknown_3EC708[] = {0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 4, 4, 5, 5, 6, 6, 7, 7}; -const u8 Unknown_3EC728[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3}; -const u8 Unknown_3EC738[] = {0, 0, 0, 0, 1, 1, 1, 1}; -const u8 Unknown_3EC740[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2}; -const u8 Unknown_3EC74C[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 4, 4, 5, 5, 4, 4, 5, 5, 6, 6, 7, 7, 6, 6, 7, 7}; -const u8 Unknown_3EC76C[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 6, 6, 7, 7, 8, 8}; -const u8 Unknown_3EC790[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5}; - -const u8 Unknown_3EC7A8[] = {4, 5, 6, 7}; -const u8 Unknown_3EC7AC[] = {4, 5, 4, 5, 6, 7, 6, 7}; -const u8 Unknown_3EC7B4[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; -const u8 Unknown_3EC7C0[] = {4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7}; -const u8 Unknown_3EC7E0[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7}; -const u8 Unknown_3EC7F0[] = {4, 5, 6, 7, 4, 5, 6, 7}; -const u8 Unknown_3EC7F8[] = {4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7}; -const u8 Unknown_3EC804[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7}; -const u8 Unknown_3EC824[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; -const u8 Unknown_3EC848[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7}; - -const struct UnkStruct_803EC860 gUnknown_083EC860[] = { - {Unknown_3EC660, Unknown_3EC6F0, Unknown_3EC7A8, 0x4}, - {Unknown_3EC68C, Unknown_3EC6F4, Unknown_3EC7AC, 0x8}, - {Unknown_3EC664, Unknown_3EC6FC, Unknown_3EC7B4, 0xc}, - {Unknown_3EC694, Unknown_3EC708, Unknown_3EC7C0, 0x20}, - {Unknown_3EC670, Unknown_3EC728, Unknown_3EC7E0, 0x10}, - {Unknown_3EC68C, Unknown_3EC738, Unknown_3EC7F0, 0x8}, - {Unknown_3EC680, Unknown_3EC740, Unknown_3EC7F8, 0xc}, - {Unknown_3EC694, Unknown_3EC74C, Unknown_3EC804, 0x20}, - {Unknown_3EC6B4, Unknown_3EC76C, Unknown_3EC824, 0x24}, - {Unknown_3EC6D8, Unknown_3EC790, Unknown_3EC848, 0x18} -}; - -const struct UnkStruct_083EC900 gUnknown_083EC900[] = { - {0, 1, 0x78, 0x4e}, - {1, 2, 0x80, 0x4e}, - {1, 3, 0x90, 0x56}, - {1, 3, 0x90, 0x46}, - {0, 2, 0x80, 0x46}, - {2, 2, 0x78, 0x46}, - {2, 3, 0x80, 0x56}, - {2, 3, 0x80, 0x36}, - {0, 3, 0x90, 0x46}, - {1, 3, 0x90, 0x46} -}; - -const union AnimCmd gSpriteAnim_83EC928[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 0), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83EC930[] = { - gSpriteAnim_83EC928 -}; - -const struct SpriteFrameImage gSpriteImageTable_83EC934[] = { - {.data = gUnknown_02038900.image, .size = sizeof(gUnknown_02038900.image)} -}; - -const struct SpriteTemplate gSpriteTemplate_83EC93C = { - .tileTag = 0xffff, - .paletteTag = 3000, - .oam = &gUnknown_020391AC, - .anims = gSpriteAnimTable_83EC930, - .images = gSpriteImageTable_83EC934, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81009A8 -}; - -const struct SpritePalette gUnknown_083EC954 = {.data = (u16 *)&gUnknown_02038900.palette, .tag = 3000}; - -const struct YesNoFuncTable gUnknown_083EC95C = {.yesFunc = sub_81000C4, .noFunc = sub_810065C}; -const struct YesNoFuncTable gUnknown_083EC964 = {.yesFunc = sub_810026C, .noFunc = sub_810065C}; -const struct YesNoFuncTable gUnknown_083EC96C[] = { - {.yesFunc = sub_80FFAB0, .noFunc = sub_80FFB08}, - {.yesFunc = sub_8100F88, .noFunc = sub_8100FB4} -}; - -const u8 gUnknown_083EC97C[] = {4, 4, 4, 4, 0, 3, 3, 0}; -const u8 gUnknown_083EC984[] = {4, 4, 4, 4, 0, 4, 3, 0}; - -const u16 gUnknown_083EC98C[] = INCBIN_U16("graphics/unknown/83EC98C.gbapal"); -const u16 Unknown_3EC9AC[] = INCBIN_U16("graphics/unknown/83EC9AC.gbapal"); -const struct YesNoFuncTable gUnknown_083EC9CC = {.yesFunc = sub_810153C, .noFunc = sub_8100EEC}; -const struct YesNoFuncTable gUnknown_083EC9D4 = {.yesFunc = sub_8101590, .noFunc = sub_8100EEC}; -const u32 gSpriteImage_83EC9DC[] = INCBIN_U32("graphics/unknown_sprites/83EC9DC.4bpp"); -const struct SpritePalette gUnknown_083ECA5C = {.data = gUnknown_083EC98C, .tag = 8}; -const struct SpritePalette gUnknown_083ECA64 = {.data = Unknown_3EC9AC, .tag = 8}; -const struct OamData gOamData_83ECA6C = { - .size = 1, .priority = 1 -}; - -const union AnimCmd gSpriteAnim_83ECA74[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 0), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83ECA7C[] = { - gSpriteAnim_83ECA74 -}; - -const struct SpriteFrameImage gSpriteImageTable_83ECA80[] = { - obj_frame_tiles(gSpriteImage_83EC9DC) -}; - -const struct SpriteTemplate gSpriteTemplate_83ECA88 = { - .tileTag = 0xffff, - .paletteTag = 8, - .oam = &gOamData_83ECA6C, - .anims = gSpriteAnimTable_83ECA7C, - .images = gSpriteImageTable_83ECA80, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8101698 -}; - -const struct YesNoFuncTable gUnknown_083ECAA0 = {.yesFunc = sub_8101848, .noFunc = sub_80FED3C}; - -u8 *const unref_label_083ECAA8[] = {gSharedMem}; - -void sub_81008BC(struct UnkStruct_02038900 *unk_02038900) -{ - u8 i; - u8 shape; - shape = unk_02038900->decoration->shape; - for (i=0; itiles[gUnknown_083EC860[shape].tiles[i]] = sub_810089C(unk_02038900->decoration->tiles[gUnknown_083EC860[shape].y[i]] * 8 + gUnknown_083EC860[shape].x[i]); - } -} - -void sub_8100930(u8 decoShape) -{ - gUnknown_020391AC.y = 0; - gUnknown_020391AC.affineMode = 0; - gUnknown_020391AC.objMode = 0; - gUnknown_020391AC.mosaic = 0; - gUnknown_020391AC.bpp = 0; - gUnknown_020391AC.shape = gUnknown_083EC900[decoShape].shape; - gUnknown_020391AC.x = 0; - gUnknown_020391AC.matrixNum = 0; - gUnknown_020391AC.size = gUnknown_083EC900[decoShape].size; - gUnknown_020391AC.tileNum = 0; - gUnknown_020391AC.priority = 1; - gUnknown_020391AC.paletteNum = 0; -} - -void sub_81009A8(struct Sprite *sprite) -{ - sprite->data[2] = 0; - sprite->data[3] = 0; - sprite->data[4] = 0; - sprite->data[5] = 0; - sprite->data[6] = 0; - sprite->data[7] = 0; - sprite->callback = sub_81009C0; -} - -void sub_81009C0(struct Sprite *sprite) -{ - if (sprite->data[7] == 0) - { - if (sprite->data[6] < 15) - { - sprite->invisible = 0; - } else - { - sprite->invisible = 1; - } - sprite->data[6] = (sprite->data[6] + 1) & 0x1f; - } else - { - sprite->invisible = 0; - } -} - -void sub_8100A0C(u8 taskId) -{ - if (sub_8100D38(taskId) == 1) - { - FadeScreen(1, 0); - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_8100E70; - } else - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecorInUse, sub_80FE428, 0); - } -} - -void sub_8100A60(u8 a0) -{ - ewram_1f000.items[a0] = 0; - ewram_1f000.pos[a0] = 0; -} - -void sub_8100A7C(void) -{ - u16 i; - gSpecialVar_0x8005 = 0; - gSpecialVar_Result = 0; - if (gSpecialVar_0x8004 == gUnknown_02039234) - { - gSpecialVar_Result = 1; - } else if (gDecorations[ewram_1f000.items[gUnknown_020391B4[gSpecialVar_0x8004].decorId]].permission == DECORPERM_SOLID_MAT) - { - gSpecialVar_0x8005 = gUnknown_020391B4[gSpecialVar_0x8004].flagId; - sub_8100A60(gUnknown_020391B4[gSpecialVar_0x8004].decorId); - for (i=0; imapObjectCount; i++) - { - if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8005) - { - gSpecialVar_0x8006 = gMapHeader.events->mapObjects[i].localId; - break; - } - } - } -} - -void sub_8100B20(void) -{ - u8 i; - for (i=0; imapObjectCount; i++) - { - if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8004) - { - gSpecialVar_0x8005 = gMapHeader.events->mapObjects[i].localId; - break; - } - } -} - -void sub_8100B6C(void) -{ - u8 i; - u8 j; - u8 k; - u8 x; - u8 y; - u8 permission; - for (i=0; i> 4; - y = ewram_1f000.pos[gUnknown_020391B4[i].decorId] & 0xf; - if (permission != DECORPERM_SOLID_MAT) - { - if (ewram_1f000.items[gUnknown_020391B4[i].decorId] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(x + 7, y + 7) == 0x28c) - { - gUnknown_020391B4[i].height++; - } - for (j=0; jmap)[(x + k) + gMapHeader.mapData->width * (y - j)] | 0x3000); - } - } - sub_8100A60(gUnknown_020391B4[i].decorId); - } - } -} - -void sub_8100C88(u8 taskId) -{ - switch (gTasks[taskId].data[2]) - { - case 0: - sub_8100B6C(); - gTasks[taskId].data[2] = 1; - break; - case 1: - if (!gPaletteFade.active) - { - DrawWholeMapView(); - ScriptContext1_SetupScript(gUnknown_081A2F8A); - Menu_EraseWindowRect(0, 0, 29, 19); - gTasks[taskId].data[2] = 2; - } - break; - case 2: - ScriptContext2_Enable(); - sub_80FED90(taskId); - pal_fill_black(); - gTasks[taskId].data[2] = 3; - break; - case 3: - if (IsWeatherNotFadingIn() == TRUE) - { - gTasks[taskId].data[13] = -1; - DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); - } - break; - } -} - -bool8 sub_8100D38(u8 taskId) -{ - u16 i; - for (i=0; iwidth = 1; - unk_020391B4->height = 1; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x1) - { - unk_020391B4->width = 2; - unk_020391B4->height = 1; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x1) - { - unk_020391B4->width = 3; - unk_020391B4->height = 1; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_4x2) - { - unk_020391B4->width = 4; - unk_020391B4->height = 2; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x2) - { - unk_020391B4->width = 2; - unk_020391B4->height = 2; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_1x2) - { - unk_020391B4->width = 1; - unk_020391B4->height = 2; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_1x3) - { - unk_020391B4->width = 1; - unk_020391B4->height = 3; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_2x4) - { - unk_020391B4->width = 2; - unk_020391B4->height = 4; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x3) - { - unk_020391B4->width = 3; - unk_020391B4->height = 3; - } else if (gDecorations[decorIdx].shape == DECORSHAPE_3x2) - { - unk_020391B4->width = 3; - unk_020391B4->height = 2; - } -} - -void sub_8101198(u8 x, u8 y) -{ - gSprites[gUnknown_020391A8].invisible = 1; - gSprites[gUnknown_020391A8].callback = SpriteCallbackDummy; - gSprites[gUnknown_020391A9].pos1.x = 0x88 + x * 16; - gSprites[gUnknown_020391A9].pos1.y = 0x48 + y * 16; -} - -bool8 sub_8101200(u8 taskId, u8 decorIdx, struct UnkStruct_020391B4 *unk_020391B4) -{ - u8 x; - u8 y; - u8 xOff; - u8 yOff; - x = gTasks[taskId].data[0] - 7; - y = gTasks[taskId].data[1] - 7; - xOff = ewram_1f000.pos[decorIdx] >> 4; - yOff = ewram_1f000.pos[decorIdx] & 0xf; - if (ewram_1f000.items[decorIdx] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(xOff + 7, yOff + 7) == 0x28c) - { - unk_020391B4->height--; - } - if (x >= xOff && x < xOff + unk_020391B4->width && y > yOff - unk_020391B4->height && y <= yOff) - { - sub_8101198(unk_020391B4->width - (x - xOff + 1), yOff - y); - return TRUE; - } - return FALSE; -} - -void sub_81012A0(void) -{ - u8 xOff; - u8 yOff; - u16 i; - xOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].decorId] >> 4; - yOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].decorId] & 0xf; - for (i=0; i<0x40; i++) - { - if (gSaveBlock1.mapObjectTemplates[i].x == xOff && gSaveBlock1.mapObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1.mapObjectTemplates[i].flagId)) - { - gUnknown_020391B4[gUnknown_02039234].flagId = gSaveBlock1.mapObjectTemplates[i].flagId; - break; - } - } -} - -bool8 sub_8101340(u8 taskId) -{ - u16 i; - for (i=0; idecorId = i; - sub_81012A0(); - gUnknown_02039234 = 1; - return TRUE; - } - } - } - } - return FALSE; -} - -void sub_81013B8(u8 a0, u8 a1, u8 a2, u8 a3) -{ - u8 i; - u8 xOff; - u8 yOff; - u8 decorIdx; - for (i=0; i> 4; - yOff = ewram_1f000.pos[i] & 0xf; - if (decorIdx != 0 && gDecorations[decorIdx].permission == DECORPERM_SOLID_MAT && a0 <= xOff && a1 <= yOff && a2 >= xOff && a3 >= yOff) - { - gUnknown_020391B4[gUnknown_02039234].decorId = i; - sub_81012A0(); - gUnknown_02039234++; - } - } -} - -#ifdef NONMATCHING -void sub_8101460(u8 taskId) -{ - u8 i; - u8 xOff; - u8 yOff; - gUnknown_02039234 = 0; - if (sub_8101340(taskId) != TRUE) - { - for (i=0; i> 4; - yOff = ewram_1f000.pos[gUnknown_020391B4[0].decorId] & 0xf; - sub_81013B8(xOff, yOff - gUnknown_020391B4[0].height + 1, xOff + gUnknown_020391B4[0].width - 1, yOff); - } - } -} -#else -__attribute__((naked)) -void sub_8101460(u8 taskId) -{ - asm(".syntax unified\n" - "\tpush {r4-r7,lr}\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r4, _081014B8 @ =gUnknown_02039234\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r4]\n" - "\tadds r0, r6, 0\n" - "\tbl sub_8101340\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbeq _08101504\n" - "\tmovs r5, 0\n" - "\tldr r0, _081014BC @ =ewram_1f000\n" - "\tldrb r1, [r0, 0x8]\n" - "\tcmp r5, r1\n" - "\tbcs _081014D2\n" - "\tadds r7, r4, 0\n" - "_08101486:\n" - "\tldr r0, [r0]\n" - "\tadds r0, r5\n" - "\tldrb r1, [r0] @ compiler incorrectly uses r0 for this and the next instruction\n" - "\tcmp r1, 0\n" - "\tbeq _081014C4\n" - "\tldr r4, _081014C0 @ =gUnknown_020391B4\n" - "\tadds r0, r1, 0\n" - "\tadds r1, r4, 0\n" - "\tbl sub_8101118\n" - "\tadds r0, r6, 0\n" - "\tadds r1, r5, 0\n" - "\tadds r2, r4, 0\n" - "\tbl sub_8101200\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbne _081014C4\n" - "\tstrb r5, [r4]\n" - "\tldrb r0, [r7]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r7]\n" - "\tb _081014D2\n" - "\t.align 2, 0\n" - "_081014B8: .4byte gUnknown_02039234\n" - "_081014BC: .4byte 0x201f000\n" - "_081014C0: .4byte gUnknown_020391B4\n" - "_081014C4:\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldr r0, _0810150C @ =ewram_1f000\n" - "\tldrb r1, [r0, 0x8]\n" - "\tcmp r5, r1\n" - "\tbcc _08101486\n" - "_081014D2:\n" - "\tldr r0, _08101510 @ =gUnknown_02039234\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbeq _08101504\n" - "\tldr r0, _0810150C @ =ewram_1f000\n" - "\tldr r2, _08101514 @ =gUnknown_020391B4\n" - "\tldrb r1, [r2]\n" - "\tldr r0, [r0, 0x4]\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tlsrs r0, r1, 4\n" - "\tmovs r3, 0xF\n" - "\tands r3, r1\n" - "\tldrb r1, [r2, 0x2]\n" - "\tsubs r1, r3, r1\n" - "\tadds r1, 0x1\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tldrb r2, [r2, 0x1]\n" - "\tadds r2, r0\n" - "\tsubs r2, 0x1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tbl sub_81013B8\n" - "_08101504:\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0810150C: .4byte 0x201f000\n" - "_08101510: .4byte gUnknown_02039234\n" - "_08101514: .4byte gUnknown_020391B4\n" - ".syntax divided\n"); -} -#endif - -void sub_8101518(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083EC9CC); -} - -void sub_810153C(u8 taskId) -{ - FadeScreen(1, 0); - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_8100C88; -} - -void sub_810156C(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083EC9D4); -} - -void sub_8101590(u8 taskId) -{ - Menu_EraseWindowRect(0, 0, 29, 19); - sub_81015B0(taskId); -} - -void sub_81015B0(u8 taskId) -{ - FadeScreen(1, 0); - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_81015E0; -} - -void sub_81015E0(u8 taskId) -{ - switch (gTasks[taskId].data[2]) - { - case 0: - if (!gPaletteFade.active) - { - sub_80FF114(taskId); - gTasks[taskId].data[2] = 1; - } - break; - case 1: - sub_81016F4(); - gFieldCallback = sub_8101678; - SetMainCallback2(c2_exit_to_overworld_2_switch); - DestroyTask(taskId); - break; - } -} - -void sub_8101648(u8 taskId) -{ - if (IsWeatherNotFadingIn() == TRUE) - { - gTasks[taskId].func = Task_DecorationPCProcessMenuInput; - } -} - -void sub_8101678(void) -{ - pal_fill_black(); - Menu_DisplayDialogueFrame(); - sub_80FE220(); - CreateTask(sub_8101648, 8); -} - -void sub_8101698(struct Sprite *sprite) -{ - sprite->data[0] = (sprite->data[0] + 1) & 0x1f; - if (sprite->data[0] >= 16) - { - sprite->invisible = TRUE; - } else - { - sprite->invisible = FALSE; - } -} - -void sub_81016C8(void) -{ - if (gSaveBlock2.playerGender == MALE) - { - LoadSpritePalette(&gUnknown_083ECA5C); - } else - { - LoadSpritePalette(&gUnknown_083ECA64); - } -} - -void sub_81016F4(void) -{ - FreeSpritePaletteByTag(8); -} - -void sub_8101700(u8 taskId) -{ - if (!sub_81341D4()) - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); - } else - { - gTasks[taskId].data[11] = 1; - gUnknown_020388F6 = 0; - sub_80FE5AC(taskId); - } -} - -void sub_8101750(u8 taskId) -{ - if (!sub_81341D4()) - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE428, 0); - } else - { - gTasks[taskId].data[11] = 2; - gUnknown_020388F6 = 0; - sub_80FE5AC(taskId); - } -} - -void sub_81017A0(u8 taskId) -{ - sub_80FEF74(); - sub_80FED1C(); - if (sub_80FEFA4() == TRUE) - { - StringCopy(gStringVar1, gDecorations[gUnknown_020388D0[gUnknown_020388F5]].name); - StringExpandPlaceholders(gStringVar4, gSecretBaseText_WillBeDiscarded); - DisplayItemMessageOnField(taskId, gStringVar4, sub_8101824, 0); - } else - { - DisplayItemMessageOnField(taskId, gSecretBaseText_DecorInUse, sub_80FEFF4, 0); - } -} - -void sub_8101824(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083ECAA0); -} - -void sub_8101848(u8 taskId) -{ - Menu_EraseWindowRect(20, 8, 26, 14); - sub_8109A30(gUnknown_020388D0[gUnknown_020388F5]); - gUnknown_020388D0[gUnknown_020388F5] = DECOR_NONE; - sub_80FF098(taskId); - DisplayItemMessageOnField(taskId, gSecretBaseText_DecorThrownAway, sub_80FEFF4, 0); -} diff --git a/src/field/decoration_inventory.c b/src/field/decoration_inventory.c deleted file mode 100644 index 8f7f5eb92..000000000 --- a/src/field/decoration_inventory.c +++ /dev/null @@ -1,177 +0,0 @@ -#include "global.h" -#include "constants/decorations.h" -#include "sprite.h" -#include "task.h" -#include "decoration.h" -#include "decoration_inventory.h" - -#define DECOR_INV(ptr) {.items = ptr, .size = sizeof ptr} - -struct DecorationInventory const gDecorationInventories[] = { - DECOR_INV(gSaveBlock1.decorDesk), - DECOR_INV(gSaveBlock1.decorChair), - DECOR_INV(gSaveBlock1.decorPlant), - DECOR_INV(gSaveBlock1.decorOrnament), - DECOR_INV(gSaveBlock1.decorMat), - DECOR_INV(gSaveBlock1.decorPoster), - DECOR_INV(gSaveBlock1.decorDoll), - DECOR_INV(gSaveBlock1.decorCushion) -}; - -void ClearDecorationInventory(u8 invIdx) -{ - u8 i; - for (i=0; i gDecorationInventories[invIdx].items[j])) - { - tmp = gDecorationInventories[invIdx].items[i]; - gDecorationInventories[invIdx].items[i] = gDecorationInventories[invIdx].items[j]; - gDecorationInventories[invIdx].items[j] = tmp; - } - } - } -} - -u8 sub_8134194(u8 invIdx) -{ - u8 i; - u8 count; - count = 0; - for (i=0; iunk1_6 == 0) - { - if (r5->unk0_0 >= (u16)r2) - { - r5->unk0_0 -= r2; - if (r5->unk0_0 == 0) - r5->unk1_6 = 1; - continue; - } - //_080FA290 - r2 -= r5->unk0_0; - r5->unk0_0 = 0; - r5->unk1_6 = 1; - } - //_080FA2A0 - r4 = r5->unk0_0 + r2; - if ((u16)r4 > r5->unk0_7) - { - u32 sp4 = r4 % r5->unk0_7; - r4 = r4 / r5->unk0_7; - - r5->unk1_6 = r4 ^ 1; - if (r5->unk1_6) - r5->unk0_0 = sp4; - else - //_080FA2FA - r5->unk0_0 = r5->unk0_7 - sp4; - } - else - { - //_080FA310 - r5->unk0_0 = r4; - - if (r5->unk0_0 == r5->unk0_7) - r5->unk1_6 = 0; - } - } - sub_80FA46C(gSaveBlock1.easyChatPairs, 5, 0); - } - //_080FA34E -} - -bool8 sub_80FA364(u16 *a) -{ - struct EasyChatPair s = {0}; - u16 i; - - if (!SB1ContainsWords(a)) - { - if (!FlagGet(FLAG_SYS_POPWORD_INPUT)) - { - FlagSet(FLAG_SYS_POPWORD_INPUT); - if (!FlagGet(FLAG_SYS_MIX_RECORD)) - { - gSaveBlock1.easyChatPairs[0].words[0] = a[0]; - gSaveBlock1.easyChatPairs[0].words[1] = a[1]; - return 1; - } - } - - //_080FA3C8 - s.words[0] = a[0]; - s.words[1] = a[1]; - s.unk1_6 = 1; - sub_80FA740(&s); - - for (i = 0; i < 5; i++) - { - if (sub_80FA670(&s, &gSaveBlock1.easyChatPairs[i], 0)) - { - u16 r3 = 4; - - while (r3 > i) - { - gSaveBlock1.easyChatPairs[r3] = gSaveBlock1.easyChatPairs[r3 - 1]; - r3--; - } - gSaveBlock1.easyChatPairs[i] = s; - return (i == 0); - } - //_080FA450 - } - gSaveBlock1.easyChatPairs[4] = s; - } - return 0; -} - -static void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c) -{ - u16 h; - - for (h = 0; h < b; h++) - { - u16 i; - - for (i = h + 1; i < b; i++) - { - if (sub_80FA670(&s[i], &s[h], c)) - { - struct EasyChatPair temp; - - temp = s[i]; - s[i] = s[h]; - s[h] = temp; - } - } - } -} - -void sub_80FA4E4(void *a, u32 b, u8 unused) -{ - u16 i; - u16 j; - u16 r7; - struct EasyChatPair *src; - struct EasyChatPair *dst; - u16 players = GetLinkPlayerCount(); - - for (i = 0; i < players; i++) - memcpy(&ARRAY_2007800[i * 5], (u8 *)a + i * b, 40); - src = ARRAY_2007800; - dst = ARRAY_2007900; - r7 = 0; - for (i = 0; i < players; i++) - { - for (j = 0; j < 5; j++) - { - s16 foo = sub_80FA828(src, r7); - if (foo < 0) - { - *(dst++) = *src; - r7++; - } - else - { - if (ARRAY_2007900[foo].unk0_0 < src->unk0_0) - { - ARRAY_2007900[foo] = *src; - } - } - src++; - } - } - sub_80FA46C(ARRAY_2007900, r7, 2); - src = ARRAY_2007900; - dst = gSaveBlock1.easyChatPairs; - for (i = 0; i < 5; i++) - *(dst++) = *(src++); -} - -void BufferTrendyPhraseString(void) -{ - struct EasyChatPair *s = &gSaveBlock1.easyChatPairs[gSpecialVar_0x8004]; - - ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1); -} - -void TrendyPhraseIsOld(void) -{ - u16 result = 0; - - if (gSaveBlock1.easyChatPairs[0].unk0_0 - gSaveBlock1.easyChatPairs[1].unk0_0 < 2) - { - asm("":::"r2"); //Force the compiler to store address of gSaveBlock1 in r3 instead of r2 - if (!gSaveBlock1.easyChatPairs[0].unk1_6 && gSaveBlock1.easyChatPairs[1].unk1_6) - result = 1; - } - gSpecialVar_Result = result; -} - -void GetDewfordHallPaintingNameIndex(void) -{ - gSpecialVar_Result = (gSaveBlock1.easyChatPairs[0].words[0] + gSaveBlock1.easyChatPairs[0].words[1]) & 7; -} - -static bool8 sub_80FA670(struct EasyChatPair *a, struct EasyChatPair *b, u8 c) -{ - switch (c) - { - case 0: - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; - break; - case 1: - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; - break; - case 2: - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; - if (a->unk2 > b->unk2) - return 1; - if (a->unk2 < b->unk2) - return 0; - if (a->words[0] > b->words[0]) - return 1; - if (a->words[0] < b->words[0]) - return 0; - if (a->words[1] > b->words[1]) - return 1; - if (a->words[1] < b->words[1]) - return 0; - return 1; - } - return Random() & 1; -} - -static void sub_80FA740(struct EasyChatPair *s) -{ - u16 r4; - - r4 = Random() % 98; - if (r4 > 50) - { - r4 = Random() % 98; - if (r4 > 80) - r4 = Random() % 98; - } - s->unk0_7 = r4 + 30; - s->unk0_0 = (Random() % (r4 + 1)) + 30; - s->unk2 = Random(); -} - -static bool8 SB1ContainsWords(u16 *a) -{ - u16 i; - - for (i = 0; i < 5; i++) - { - if (IsEasyChatPairEqual(a, gSaveBlock1.easyChatPairs[i].words) != 0) - return TRUE; - } - return FALSE; -} - -static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2) -{ - u16 i; - - for (i = 0; i < 2; i++) - { - if (*(words1++) != *(words2++)) - return FALSE; - } - return TRUE; -} - -static s16 sub_80FA828(struct EasyChatPair *a, u16 b) -{ - s16 i; - struct EasyChatPair *s = ARRAY_2007900; - - for (i = 0; i < b; i++) - { - if (IsEasyChatPairEqual(a->words, s->words)) - return i; - s++; - } - return -1; -} diff --git a/src/field/diploma.c b/src/field/diploma.c deleted file mode 100644 index b31fc7dec..000000000 --- a/src/field/diploma.c +++ /dev/null @@ -1,139 +0,0 @@ -#include "global.h" -#include "diploma.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokedex.h" -#include "overworld.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "scanline_effect.h" - -static void VBlankCB(void); -static void MainCB2(void); -static void Task_DiplomaFadeIn(u8); -static void Task_DiplomaWaitForKeyPress(u8); -static void Task_DiplomaFadeOut(u8); -static void DisplayDiplomaText(void); - -static const u16 gDiplomaPalettes[][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 void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void CB2_ShowDiploma(void) -{ - u32 savedIme; - - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - - LZ77UnCompVram(gDiplomaTiles, (void *)VRAM); - LZ77UnCompVram(gDiplomaTilemap, (void *)(VRAM + 0x3000)); - - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - FreeAllSpritePalettes(); - LoadPalette(gDiplomaPalettes, 0, 64); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); - DisplayDiplomaText(); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - SetVBlankCallback(VBlankCB); - SetMainCallback2(MainCB2); - - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT512x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - - CreateTask(Task_DiplomaFadeIn, 0); -} - -static void MainCB2(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void Task_DiplomaFadeIn(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_DiplomaWaitForKeyPress; -} - -static void Task_DiplomaWaitForKeyPress(u8 taskId) -{ - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_DiplomaFadeOut; - } -} - -static void Task_DiplomaFadeOut(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(sub_80546F0); - } -} - -static void DisplayDiplomaText(void) -{ - if (CompletedNationalPokedex()) - { - REG_BG3HOFS = 256; - StringCopy(gStringVar1, gOtherText_NationalDex); - } - else - { - REG_BG3HOFS = 0; - StringCopy(gStringVar1, gOtherText_HoennDex); - } - Menu_PrintText(gOtherText_DiplomaCertificationGameFreak, 6, 2); -} \ No newline at end of file diff --git a/src/field/event_data.c b/src/field/event_data.c deleted file mode 100644 index 9d6d2372b..000000000 --- a/src/field/event_data.c +++ /dev/null @@ -1,182 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "pokedex.h" - -#define TEMP_FLAGS_SIZE 0x4 -#define DAILY_FLAGS_SIZE 0x8 -#define TEMP_VARS_SIZE 0x20 - -EWRAM_DATA u16 gSpecialVar_0x8000 = 0; -EWRAM_DATA u16 gSpecialVar_0x8001 = 0; -EWRAM_DATA u16 gSpecialVar_0x8002 = 0; -EWRAM_DATA u16 gSpecialVar_0x8003 = 0; -EWRAM_DATA u16 gSpecialVar_0x8004 = 0; -EWRAM_DATA u16 gSpecialVar_0x8005 = 0; -EWRAM_DATA u16 gSpecialVar_0x8006 = 0; -EWRAM_DATA u16 gSpecialVar_0x8007 = 0; -EWRAM_DATA u16 gSpecialVar_0x8008 = 0; -EWRAM_DATA u16 gSpecialVar_0x8009 = 0; -EWRAM_DATA u16 gSpecialVar_0x800A = 0; -EWRAM_DATA u16 gSpecialVar_0x800B = 0; -EWRAM_DATA u16 gSpecialVar_Result = 0; -EWRAM_DATA u16 gSpecialVar_LastTalked = 0; -EWRAM_DATA u16 gSpecialVar_Facing = 0; -EWRAM_DATA u8 gUnknown_0202E8E2[16] = {0}; - -extern u16 *gSpecialVars[]; - -void InitEventData(void) -{ - memset(gSaveBlock1.flags, 0, sizeof(gSaveBlock1.flags)); - memset(gSaveBlock1.vars, 0, sizeof(gSaveBlock1.vars)); - memset(gUnknown_0202E8E2, 0, sizeof(gUnknown_0202E8E2)); -} - -void ClearTempFieldEventData(void) -{ - memset(gSaveBlock1.flags, 0, TEMP_FLAGS_SIZE); - memset(gSaveBlock1.vars, 0, TEMP_VARS_SIZE); - FlagClear(FLAG_SYS_ENC_UP_ITEM); - FlagClear(FLAG_SYS_ENC_DOWN_ITEM); - FlagClear(FLAG_SYS_USE_STRENGTH); - FlagClear(FLAG_SYS_CTRL_OBJ_DELETE); -} - -// probably had different flag splits at one point. -void ClearDailyFlags(void) -{ - memset(gSaveBlock1.flags + (DAILY_FLAGS_START / 8), 0, DAILY_FLAGS_SIZE); -} - -void DisableNationalPokedex(void) -{ - u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); - gSaveBlock2.pokedex.nationalMagic = 0; - *nationalDexVar = 0; - FlagClear(FLAG_SYS_NATIONAL_DEX); -} - -void EnableNationalPokedex(void) -{ - u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX); - gSaveBlock2.pokedex.nationalMagic = 0xDA; - *nationalDexVar = 0x302; - FlagSet(FLAG_SYS_NATIONAL_DEX); - gSaveBlock2.pokedex.unknown1 = 1; - gSaveBlock2.pokedex.order = 0; - sub_808C0A0(); -} - -bool32 IsNationalPokedexEnabled(void) -{ - if (gSaveBlock2.pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(FLAG_SYS_NATIONAL_DEX)) - return TRUE; - else - return FALSE; -} - -void DisableMysteryGift(void) -{ - FlagClear(FLAG_SYS_EXDATA_ENABLE); -} - -void EnableMysteryGift(void) -{ - FlagSet(FLAG_SYS_EXDATA_ENABLE); -} - -bool32 IsMysteryGiftEnabled(void) -{ - return FlagGet(FLAG_SYS_EXDATA_ENABLE); -} - -void DisableResetRTC(void) -{ - VarSet(VAR_RESET_RTC_ENABLE, 0); - FlagClear(FLAG_SYS_RESET_RTC_ENABLE); -} - -void EnableResetRTC(void) -{ - VarSet(VAR_RESET_RTC_ENABLE, 0x920); - FlagSet(FLAG_SYS_RESET_RTC_ENABLE); -} - -bool32 CanResetRTC(void) -{ - if (FlagGet(FLAG_SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920) - return TRUE; - else - return FALSE; -} - -u16 *GetVarPointer(u16 id) -{ - if (id < VARS_START) - return NULL; - if (id < 0x8000) - return &gSaveBlock1.vars[id - VARS_START]; - return gSpecialVars[id - 0x8000]; -} - -u16 VarGet(u16 id) -{ - u16 *ptr = GetVarPointer(id); - if (!ptr) - return id; - return *ptr; -} - -bool8 VarSet(u16 id, u16 value) -{ - u16 *ptr = GetVarPointer(id); - if (!ptr) - return FALSE; - *ptr = value; - return TRUE; -} - -u8 VarGetFieldObjectGraphicsId(u8 id) -{ - return VarGet(VAR_OBJ_GFX_ID_0 + id); -} - -u8 *GetFlagPointer(u16 id) -{ - if (id == 0) - return 0; - - if (id < 0x4000) - return &gSaveBlock1.flags[id / 8]; - - return &gUnknown_0202E8E2[(id - 0x4000) / 8]; -} - -u8 FlagSet(u16 id) -{ - u8 *ptr = GetFlagPointer(id); - if (ptr) - *ptr |= 1 << (id & 7); - return 0; -} - -u8 FlagClear(u16 id) -{ - u8 *ptr = GetFlagPointer(id); - if (ptr) - *ptr &= ~(1 << (id & 7)); - return 0; -} - -bool8 FlagGet(u16 id) -{ - u8 *ptr = GetFlagPointer(id); - - if (!ptr) - return FALSE; - - if (!(((*ptr) >> (id & 7)) & 1)) - return FALSE; - - return TRUE; -} diff --git a/src/field/event_object_movement.c b/src/field/event_object_movement.c deleted file mode 100644 index 7a5f62456..000000000 --- a/src/field/event_object_movement.c +++ /dev/null @@ -1,9423 +0,0 @@ -#include "global.h" -#include "event_object_movement.h" -#include "berry.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "palette.h" -#include "random.h" -#include "overworld.h" -#include "sprite.h" -#include "metatile_behavior.h" -#include "constants/maps.h" -#include "constants/map_objects.h" -#include "trainer_see.h" - -// this file was known as evobjmv.c in Game Freak's original source - -// rodata - -const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; - -void ObjectCB_CameraObject(struct Sprite *sprite); -const struct SpriteTemplate gSpriteTemplate_830FD24 = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; - -void CameraObject_0(struct Sprite *); -void CameraObject_1(struct Sprite *); -void CameraObject_2(struct Sprite *); -void (*const gCameraObjectFuncs[])(struct Sprite *) = { - CameraObject_0, - CameraObject_1, - CameraObject_2, -}; - -const u32 gMapObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/00.4bpp"); -const u32 gMapObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/01.4bpp"); -const u32 gMapObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/02.4bpp"); -const u32 gMapObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/03.4bpp"); -const u32 gMapObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/04.4bpp"); -const u32 gMapObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/05.4bpp"); -const u32 gMapObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/06.4bpp"); -const u32 gMapObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/07.4bpp"); -const u32 gMapObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/08.4bpp"); -const u32 gMapObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/09.4bpp"); -const u32 gMapObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/10.4bpp"); -const u32 gMapObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/11.4bpp"); -const u32 gMapObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/12.4bpp"); -const u32 gMapObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/13.4bpp"); -const u32 gMapObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/14.4bpp"); -const u32 gMapObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/15.4bpp"); -const u32 gMapObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/16.4bpp"); -const u32 gMapObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/normal/17.4bpp"); -const u16 gMapObjectPalette8[] = INCBIN_U16("graphics/map_objects/palettes/08.gbapal"); -const u16 NullPalette_8310F68[16] = {}; -const u16 NullPalette_8310F88[16] = {}; -const u16 NullPalette_8310FA8[16] = {}; -const u16 NullPalette_8310FC8[16] = {}; -const u16 NullPalette_8310FE8[16] = {}; -const u16 NullPalette_8311008[16] = {}; -const u16 NullPalette_8311028[16] = {}; -const u16 NullPalette_8311048[16] = {}; -const u16 NullPalette_8311068[16] = {}; -const u16 NullPalette_8311088[16] = {}; -const u16 NullPalette_83110A8[16] = {}; -const u16 NullPalette_83110C8[16] = {}; -const u16 NullPalette_83110E8[16] = {}; -const u16 NullPalette_8311108[16] = {}; -const u16 NullPalette_8311128[16] = {}; -const u16 gMapObjectPalette9[] = INCBIN_U16("graphics/map_objects/palettes/09.gbapal"); -const u16 gMapObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/10.gbapal"); -const u32 gMapObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/0.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/1.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/2.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/3.4bpp"); -const u32 gMapObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/field_move/4.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/0.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/3.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/1.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/4.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/2.4bpp"); -const u32 gMapObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/surfing/5.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/0.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/1.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/2.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/3.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/4.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/5.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/6.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/7.4bpp"); -const u32 gMapObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/mach_bike/8.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/00.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/01.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/02.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/03.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/04.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/05.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/06.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/07.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/08.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/09.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/10.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/11.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/12.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/13.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/14.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/15.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/16.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/17.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/18.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/19.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/20.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/21.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/22.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/23.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/24.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/25.4bpp"); -const u32 gMapObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/acro_bike/26.4bpp"); -const u32 gMapObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/00.4bpp"); -const u32 gMapObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/01.4bpp"); -const u32 gMapObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/02.4bpp"); -const u32 gMapObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/03.4bpp"); -const u32 gMapObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/04.4bpp"); -const u32 gMapObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/05.4bpp"); -const u32 gMapObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/06.4bpp"); -const u32 gMapObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/07.4bpp"); -const u32 gMapObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/08.4bpp"); -const u32 gMapObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/09.4bpp"); -const u32 gMapObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/10.4bpp"); -const u32 gMapObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/fishing/11.4bpp"); -const u32 gMapObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/0.4bpp"); -const u32 gMapObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/3.4bpp"); -const u32 gMapObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/1.4bpp"); -const u32 gMapObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/4.4bpp"); -const u32 gMapObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/2.4bpp"); -const u32 gMapObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/watering/5.4bpp"); -const u32 gMapObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/decorating.4bpp"); -const u32 gMapObjectPic_MayDecorating[] = INCBIN_U32("graphics/map_objects/pics/people/may/decorating.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/0.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/1.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/2.4bpp"); -const u32 gMapObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/brendan/underwater/3.4bpp"); -const u32 gMapObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/0.4bpp"); -const u32 gMapObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/1.4bpp"); -const u32 gMapObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/2.4bpp"); -const u32 gMapObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/underwater/3.4bpp"); -const u16 gMapObjectPalette11[] = INCBIN_U16("graphics/map_objects/palettes/11.gbapal"); -const u32 gMapObjectPic_MayNormal_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/00.4bpp"); -const u32 gMapObjectPic_MayNormal_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/01.4bpp"); -const u32 gMapObjectPic_MayNormal_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/02.4bpp"); -const u32 gMapObjectPic_MayNormal_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/03.4bpp"); -const u32 gMapObjectPic_MayNormal_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/04.4bpp"); -const u32 gMapObjectPic_MayNormal_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/05.4bpp"); -const u32 gMapObjectPic_MayNormal_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/06.4bpp"); -const u32 gMapObjectPic_MayNormal_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/07.4bpp"); -const u32 gMapObjectPic_MayNormal_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/08.4bpp"); -const u32 gMapObjectPic_MayNormal_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/09.4bpp"); -const u32 gMapObjectPic_MayNormal_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/10.4bpp"); -const u32 gMapObjectPic_MayNormal_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/11.4bpp"); -const u32 gMapObjectPic_MayNormal_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/12.4bpp"); -const u32 gMapObjectPic_MayNormal_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/13.4bpp"); -const u32 gMapObjectPic_MayNormal_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/14.4bpp"); -const u32 gMapObjectPic_MayNormal_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/15.4bpp"); -const u32 gMapObjectPic_MayNormal_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/16.4bpp"); -const u32 gMapObjectPic_MayNormal_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/normal/17.4bpp"); -const u16 gMapObjectPalette17[] = INCBIN_U16("graphics/map_objects/palettes/17.gbapal"); -const u16 gMapObjectPalette18[] = INCBIN_U16("graphics/map_objects/palettes/18.gbapal"); -const u16 NullPalette_831B7E8[16] = {}; -const u16 NullPalette_831B808[16] = {}; -const u16 NullPalette_831B828[16] = {}; -const u16 NullPalette_831B848[16] = {}; -const u16 NullPalette_831B868[16] = {}; -const u16 NullPalette_831B888[16] = {}; -const u16 NullPalette_831B8A8[16] = {}; -const u16 NullPalette_831B8C8[16] = {}; -const u16 NullPalette_831B8E8[16] = {}; -const u16 NullPalette_831B908[16] = {}; -const u16 NullPalette_831B928[16] = {}; -const u16 NullPalette_831B948[16] = {}; -const u16 NullPalette_831B968[16] = {}; -const u16 NullPalette_831B988[16] = {}; -const u32 gMapObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/0.4bpp"); -const u32 gMapObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/1.4bpp"); -const u32 gMapObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/2.4bpp"); -const u32 gMapObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/3.4bpp"); -const u32 gMapObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/4.4bpp"); -const u32 gMapObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/5.4bpp"); -const u32 gMapObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/6.4bpp"); -const u32 gMapObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/7.4bpp"); -const u32 gMapObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/mach_bike/8.4bpp"); -const u32 gMapObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/00.4bpp"); -const u32 gMapObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/01.4bpp"); -const u32 gMapObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/02.4bpp"); -const u32 gMapObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/03.4bpp"); -const u32 gMapObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/04.4bpp"); -const u32 gMapObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/05.4bpp"); -const u32 gMapObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/06.4bpp"); -const u32 gMapObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/07.4bpp"); -const u32 gMapObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/08.4bpp"); -const u32 gMapObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/09.4bpp"); -const u32 gMapObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/10.4bpp"); -const u32 gMapObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/11.4bpp"); -const u32 gMapObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/12.4bpp"); -const u32 gMapObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/13.4bpp"); -const u32 gMapObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/14.4bpp"); -const u32 gMapObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/15.4bpp"); -const u32 gMapObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/16.4bpp"); -const u32 gMapObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/17.4bpp"); -const u32 gMapObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/18.4bpp"); -const u32 gMapObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/19.4bpp"); -const u32 gMapObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/20.4bpp"); -const u32 gMapObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/21.4bpp"); -const u32 gMapObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/22.4bpp"); -const u32 gMapObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/23.4bpp"); -const u32 gMapObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/24.4bpp"); -const u32 gMapObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/25.4bpp"); -const u32 gMapObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/map_objects/pics/people/may/acro_bike/26.4bpp"); -const u32 gMapObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/0.4bpp"); -const u32 gMapObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/3.4bpp"); -const u32 gMapObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/1.4bpp"); -const u32 gMapObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/4.4bpp"); -const u32 gMapObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/2.4bpp"); -const u32 gMapObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/surfing/5.4bpp"); -const u32 gMapObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/0.4bpp"); -const u32 gMapObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/1.4bpp"); -const u32 gMapObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/2.4bpp"); -const u32 gMapObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/3.4bpp"); -const u32 gMapObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/field_move/4.4bpp"); -const u32 gMapObjectPic_MayFishing_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/00.4bpp"); -const u32 gMapObjectPic_MayFishing_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/01.4bpp"); -const u32 gMapObjectPic_MayFishing_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/02.4bpp"); -const u32 gMapObjectPic_MayFishing_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/03.4bpp"); -const u32 gMapObjectPic_MayFishing_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/04.4bpp"); -const u32 gMapObjectPic_MayFishing_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/05.4bpp"); -const u32 gMapObjectPic_MayFishing_6[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/06.4bpp"); -const u32 gMapObjectPic_MayFishing_7[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/07.4bpp"); -const u32 gMapObjectPic_MayFishing_8[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/08.4bpp"); -const u32 gMapObjectPic_MayFishing_9[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/09.4bpp"); -const u32 gMapObjectPic_MayFishing_10[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/10.4bpp"); -const u32 gMapObjectPic_MayFishing_11[] = INCBIN_U32("graphics/map_objects/pics/people/may/fishing/11.4bpp"); -const u32 gMapObjectPic_MayWatering_0[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/0.4bpp"); -const u32 gMapObjectPic_MayWatering_3[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/3.4bpp"); -const u32 gMapObjectPic_MayWatering_1[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/1.4bpp"); -const u32 gMapObjectPic_MayWatering_4[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/4.4bpp"); -const u32 gMapObjectPic_MayWatering_2[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/2.4bpp"); -const u32 gMapObjectPic_MayWatering_5[] = INCBIN_U32("graphics/map_objects/pics/people/may/watering/5.4bpp"); -const u16 gMapObjectPalette0[] = INCBIN_U16("graphics/map_objects/palettes/00.gbapal"); -const u16 gMapObjectPalette1[] = INCBIN_U16("graphics/map_objects/palettes/01.gbapal"); -const u16 gMapObjectPalette2[] = INCBIN_U16("graphics/map_objects/palettes/02.gbapal"); -const u16 gMapObjectPalette3[] = INCBIN_U16("graphics/map_objects/palettes/03.gbapal"); -const u16 gMapObjectPalette4[] = INCBIN_U16("graphics/map_objects/palettes/04.gbapal"); -const u16 gMapObjectPalette5[] = INCBIN_U16("graphics/map_objects/palettes/05.gbapal"); -const u16 gMapObjectPalette6[] = INCBIN_U16("graphics/map_objects/palettes/06.gbapal"); -const u16 gMapObjectPalette7[] = INCBIN_U16("graphics/map_objects/palettes/07.gbapal"); -const u32 gMapObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/0.4bpp"); -const u32 gMapObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/1.4bpp"); -const u32 gMapObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/2.4bpp"); -const u32 gMapObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/3.4bpp"); -const u32 gMapObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/4.4bpp"); -const u32 gMapObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/5.4bpp"); -const u32 gMapObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/6.4bpp"); -const u32 gMapObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/7.4bpp"); -const u32 gMapObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_1/8.4bpp"); -const u32 gMapObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/0.4bpp"); -const u32 gMapObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/1.4bpp"); -const u32 gMapObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/2.4bpp"); -const u32 gMapObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/3.4bpp"); -const u32 gMapObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/4.4bpp"); -const u32 gMapObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/5.4bpp"); -const u32 gMapObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/6.4bpp"); -const u32 gMapObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/7.4bpp"); -const u32 gMapObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_1/8.4bpp"); -const u32 gMapObjectPic_Boy1_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/0.4bpp"); -const u32 gMapObjectPic_Boy1_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/1.4bpp"); -const u32 gMapObjectPic_Boy1_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/2.4bpp"); -const u32 gMapObjectPic_Boy1_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/3.4bpp"); -const u32 gMapObjectPic_Boy1_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/4.4bpp"); -const u32 gMapObjectPic_Boy1_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/5.4bpp"); -const u32 gMapObjectPic_Boy1_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/6.4bpp"); -const u32 gMapObjectPic_Boy1_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/7.4bpp"); -const u32 gMapObjectPic_Boy1_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_1/8.4bpp"); -const u32 gMapObjectPic_Girl1_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/0.4bpp"); -const u32 gMapObjectPic_Girl1_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/1.4bpp"); -const u32 gMapObjectPic_Girl1_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/2.4bpp"); -const u32 gMapObjectPic_Girl1_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/3.4bpp"); -const u32 gMapObjectPic_Girl1_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/4.4bpp"); -const u32 gMapObjectPic_Girl1_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/5.4bpp"); -const u32 gMapObjectPic_Girl1_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/6.4bpp"); -const u32 gMapObjectPic_Girl1_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/7.4bpp"); -const u32 gMapObjectPic_Girl1_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_1/8.4bpp"); -const u32 gMapObjectPic_Boy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/0.4bpp"); -const u32 gMapObjectPic_Boy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/1.4bpp"); -const u32 gMapObjectPic_Boy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/2.4bpp"); -const u32 gMapObjectPic_Boy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/3.4bpp"); -const u32 gMapObjectPic_Boy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/4.4bpp"); -const u32 gMapObjectPic_Boy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/5.4bpp"); -const u32 gMapObjectPic_Boy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/6.4bpp"); -const u32 gMapObjectPic_Boy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/7.4bpp"); -const u32 gMapObjectPic_Boy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_2/8.4bpp"); -const u32 gMapObjectPic_Girl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/0.4bpp"); -const u32 gMapObjectPic_Girl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/1.4bpp"); -const u32 gMapObjectPic_Girl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/2.4bpp"); -const u32 gMapObjectPic_Girl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/3.4bpp"); -const u32 gMapObjectPic_Girl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/4.4bpp"); -const u32 gMapObjectPic_Girl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/5.4bpp"); -const u32 gMapObjectPic_Girl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/6.4bpp"); -const u32 gMapObjectPic_Girl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/7.4bpp"); -const u32 gMapObjectPic_Girl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_2/8.4bpp"); -const u32 gMapObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/0.4bpp"); -const u32 gMapObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/1.4bpp"); -const u32 gMapObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/2.4bpp"); -const u32 gMapObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/3.4bpp"); -const u32 gMapObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/4.4bpp"); -const u32 gMapObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/5.4bpp"); -const u32 gMapObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/6.4bpp"); -const u32 gMapObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/7.4bpp"); -const u32 gMapObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_2/8.4bpp"); -const u32 gMapObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/0.4bpp"); -const u32 gMapObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/1.4bpp"); -const u32 gMapObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/2.4bpp"); -const u32 gMapObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/3.4bpp"); -const u32 gMapObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/4.4bpp"); -const u32 gMapObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/5.4bpp"); -const u32 gMapObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/6.4bpp"); -const u32 gMapObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/7.4bpp"); -const u32 gMapObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_girl_2/8.4bpp"); -const u32 gMapObjectPic_Boy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/0.4bpp"); -const u32 gMapObjectPic_Boy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/1.4bpp"); -const u32 gMapObjectPic_Boy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/2.4bpp"); -const u32 gMapObjectPic_Boy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/3.4bpp"); -const u32 gMapObjectPic_Boy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/4.4bpp"); -const u32 gMapObjectPic_Boy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/5.4bpp"); -const u32 gMapObjectPic_Boy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/6.4bpp"); -const u32 gMapObjectPic_Boy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/7.4bpp"); -const u32 gMapObjectPic_Boy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_3/8.4bpp"); -const u32 gMapObjectPic_Girl3_0[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/0.4bpp"); -const u32 gMapObjectPic_Girl3_1[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/1.4bpp"); -const u32 gMapObjectPic_Girl3_2[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/2.4bpp"); -const u32 gMapObjectPic_Girl3_3[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/3.4bpp"); -const u32 gMapObjectPic_Girl3_4[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/4.4bpp"); -const u32 gMapObjectPic_Girl3_5[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/5.4bpp"); -const u32 gMapObjectPic_Girl3_6[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/6.4bpp"); -const u32 gMapObjectPic_Girl3_7[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/7.4bpp"); -const u32 gMapObjectPic_Girl3_8[] = INCBIN_U32("graphics/map_objects/pics/people/girl_3/8.4bpp"); -const u32 gMapObjectPic_Boy4_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/0.4bpp"); -const u32 gMapObjectPic_Boy4_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/1.4bpp"); -const u32 gMapObjectPic_Boy4_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/2.4bpp"); -const u32 gMapObjectPic_Boy4_3[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/3.4bpp"); -const u32 gMapObjectPic_Boy4_4[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/4.4bpp"); -const u32 gMapObjectPic_Boy4_5[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/5.4bpp"); -const u32 gMapObjectPic_Boy4_6[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/6.4bpp"); -const u32 gMapObjectPic_Boy4_7[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/7.4bpp"); -const u32 gMapObjectPic_Boy4_8[] = INCBIN_U32("graphics/map_objects/pics/people/boy_4/8.4bpp"); -const u32 gMapObjectPic_Woman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/0.4bpp"); -const u32 gMapObjectPic_Woman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/1.4bpp"); -const u32 gMapObjectPic_Woman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/2.4bpp"); -const u32 gMapObjectPic_Woman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/3.4bpp"); -const u32 gMapObjectPic_Woman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/4.4bpp"); -const u32 gMapObjectPic_Woman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/5.4bpp"); -const u32 gMapObjectPic_Woman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/6.4bpp"); -const u32 gMapObjectPic_Woman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/7.4bpp"); -const u32 gMapObjectPic_Woman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_1/8.4bpp"); -const u32 gMapObjectPic_FatMan_0[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/0.4bpp"); -const u32 gMapObjectPic_FatMan_1[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/1.4bpp"); -const u32 gMapObjectPic_FatMan_2[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/2.4bpp"); -const u32 gMapObjectPic_FatMan_3[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/3.4bpp"); -const u32 gMapObjectPic_FatMan_4[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/4.4bpp"); -const u32 gMapObjectPic_FatMan_5[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/5.4bpp"); -const u32 gMapObjectPic_FatMan_6[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/6.4bpp"); -const u32 gMapObjectPic_FatMan_7[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/7.4bpp"); -const u32 gMapObjectPic_FatMan_8[] = INCBIN_U32("graphics/map_objects/pics/people/fat_man/8.4bpp"); -const u32 gMapObjectPic_Woman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/0.4bpp"); -const u32 gMapObjectPic_Woman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/1.4bpp"); -const u32 gMapObjectPic_Woman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/2.4bpp"); -const u32 gMapObjectPic_Woman2_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/3.4bpp"); -const u32 gMapObjectPic_Woman2_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/4.4bpp"); -const u32 gMapObjectPic_Woman2_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/5.4bpp"); -const u32 gMapObjectPic_Woman2_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/6.4bpp"); -const u32 gMapObjectPic_Woman2_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/7.4bpp"); -const u32 gMapObjectPic_Woman2_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_2/8.4bpp"); -const u32 gMapObjectPic_Man1_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/0.4bpp"); -const u32 gMapObjectPic_Man1_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/1.4bpp"); -const u32 gMapObjectPic_Man1_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/2.4bpp"); -const u32 gMapObjectPic_Man1_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/3.4bpp"); -const u32 gMapObjectPic_Man1_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/4.4bpp"); -const u32 gMapObjectPic_Man1_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/5.4bpp"); -const u32 gMapObjectPic_Man1_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/6.4bpp"); -const u32 gMapObjectPic_Man1_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/7.4bpp"); -const u32 gMapObjectPic_Man1_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_1/8.4bpp"); -const u32 gMapObjectPic_Woman3_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/0.4bpp"); -const u32 gMapObjectPic_Woman3_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/1.4bpp"); -const u32 gMapObjectPic_Woman3_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/2.4bpp"); -const u32 gMapObjectPic_Woman3_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/3.4bpp"); -const u32 gMapObjectPic_Woman3_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/4.4bpp"); -const u32 gMapObjectPic_Woman3_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/5.4bpp"); -const u32 gMapObjectPic_Woman3_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/6.4bpp"); -const u32 gMapObjectPic_Woman3_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/7.4bpp"); -const u32 gMapObjectPic_Woman3_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_3/8.4bpp"); -const u32 gMapObjectPic_OldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/0.4bpp"); -const u32 gMapObjectPic_OldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/1.4bpp"); -const u32 gMapObjectPic_OldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/2.4bpp"); -const u32 gMapObjectPic_OldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/3.4bpp"); -const u32 gMapObjectPic_OldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/4.4bpp"); -const u32 gMapObjectPic_OldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/5.4bpp"); -const u32 gMapObjectPic_OldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/6.4bpp"); -const u32 gMapObjectPic_OldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/7.4bpp"); -const u32 gMapObjectPic_OldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_1/8.4bpp"); -const u32 gMapObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/0.4bpp"); -const u32 gMapObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/1.4bpp"); -const u32 gMapObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/2.4bpp"); -const u32 gMapObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/3.4bpp"); -const u32 gMapObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/4.4bpp"); -const u32 gMapObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/5.4bpp"); -const u32 gMapObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/6.4bpp"); -const u32 gMapObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/7.4bpp"); -const u32 gMapObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_1/8.4bpp"); -const u32 gMapObjectPic_Man2_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/0.4bpp"); -const u32 gMapObjectPic_Man2_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/1.4bpp"); -const u32 gMapObjectPic_Man2_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/2.4bpp"); -const u32 gMapObjectPic_Man2_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/3.4bpp"); -const u32 gMapObjectPic_Man2_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/4.4bpp"); -const u32 gMapObjectPic_Man2_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/5.4bpp"); -const u32 gMapObjectPic_Man2_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/6.4bpp"); -const u32 gMapObjectPic_Man2_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/7.4bpp"); -const u32 gMapObjectPic_Man2_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_2/8.4bpp"); -const u32 gMapObjectPic_Woman4_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/0.4bpp"); -const u32 gMapObjectPic_Woman4_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/1.4bpp"); -const u32 gMapObjectPic_Woman4_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/2.4bpp"); -const u32 gMapObjectPic_Woman4_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/3.4bpp"); -const u32 gMapObjectPic_Woman4_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/4.4bpp"); -const u32 gMapObjectPic_Woman4_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/5.4bpp"); -const u32 gMapObjectPic_Woman4_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/6.4bpp"); -const u32 gMapObjectPic_Woman4_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/7.4bpp"); -const u32 gMapObjectPic_Woman4_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_4/8.4bpp"); -const u32 gMapObjectPic_Man3_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/0.4bpp"); -const u32 gMapObjectPic_Man3_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/1.4bpp"); -const u32 gMapObjectPic_Man3_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/2.4bpp"); -const u32 gMapObjectPic_Man3_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/3.4bpp"); -const u32 gMapObjectPic_Man3_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/4.4bpp"); -const u32 gMapObjectPic_Man3_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/5.4bpp"); -const u32 gMapObjectPic_Man3_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/6.4bpp"); -const u32 gMapObjectPic_Man3_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/7.4bpp"); -const u32 gMapObjectPic_Man3_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_3/8.4bpp"); -const u32 gMapObjectPic_Woman5_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/0.4bpp"); -const u32 gMapObjectPic_Woman5_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/1.4bpp"); -const u32 gMapObjectPic_Woman5_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/2.4bpp"); -const u32 gMapObjectPic_Woman5_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/3.4bpp"); -const u32 gMapObjectPic_Woman5_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/4.4bpp"); -const u32 gMapObjectPic_Woman5_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/5.4bpp"); -const u32 gMapObjectPic_Woman5_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/6.4bpp"); -const u32 gMapObjectPic_Woman5_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/7.4bpp"); -const u32 gMapObjectPic_Woman5_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_5/8.4bpp"); -const u32 gMapObjectPic_Cook_0[] = INCBIN_U32("graphics/map_objects/pics/people/cook/0.4bpp"); -const u32 gMapObjectPic_Cook_1[] = INCBIN_U32("graphics/map_objects/pics/people/cook/1.4bpp"); -const u32 gMapObjectPic_Cook_2[] = INCBIN_U32("graphics/map_objects/pics/people/cook/2.4bpp"); -const u32 gMapObjectPic_Woman6_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/0.4bpp"); -const u32 gMapObjectPic_Woman6_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/1.4bpp"); -const u32 gMapObjectPic_Woman6_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/2.4bpp"); -const u32 gMapObjectPic_Woman6_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/3.4bpp"); -const u32 gMapObjectPic_Woman6_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/4.4bpp"); -const u32 gMapObjectPic_Woman6_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/5.4bpp"); -const u32 gMapObjectPic_Woman6_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/6.4bpp"); -const u32 gMapObjectPic_Woman6_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/7.4bpp"); -const u32 gMapObjectPic_Woman6_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_6/8.4bpp"); -const u32 gMapObjectPic_OldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/0.4bpp"); -const u32 gMapObjectPic_OldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/1.4bpp"); -const u32 gMapObjectPic_OldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_man_2/2.4bpp"); -const u32 gMapObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/0.4bpp"); -const u32 gMapObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/1.4bpp"); -const u32 gMapObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/map_objects/pics/people/old_woman_2/2.4bpp"); -const u32 gMapObjectPic_Camper_0[] = INCBIN_U32("graphics/map_objects/pics/people/camper/0.4bpp"); -const u32 gMapObjectPic_Camper_1[] = INCBIN_U32("graphics/map_objects/pics/people/camper/1.4bpp"); -const u32 gMapObjectPic_Camper_2[] = INCBIN_U32("graphics/map_objects/pics/people/camper/2.4bpp"); -const u32 gMapObjectPic_Camper_3[] = INCBIN_U32("graphics/map_objects/pics/people/camper/3.4bpp"); -const u32 gMapObjectPic_Camper_4[] = INCBIN_U32("graphics/map_objects/pics/people/camper/4.4bpp"); -const u32 gMapObjectPic_Camper_5[] = INCBIN_U32("graphics/map_objects/pics/people/camper/5.4bpp"); -const u32 gMapObjectPic_Camper_6[] = INCBIN_U32("graphics/map_objects/pics/people/camper/6.4bpp"); -const u32 gMapObjectPic_Camper_7[] = INCBIN_U32("graphics/map_objects/pics/people/camper/7.4bpp"); -const u32 gMapObjectPic_Camper_8[] = INCBIN_U32("graphics/map_objects/pics/people/camper/8.4bpp"); -const u32 gMapObjectPic_Picnicker_0[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/0.4bpp"); -const u32 gMapObjectPic_Picnicker_1[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/1.4bpp"); -const u32 gMapObjectPic_Picnicker_2[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/2.4bpp"); -const u32 gMapObjectPic_Picnicker_3[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/3.4bpp"); -const u32 gMapObjectPic_Picnicker_4[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/4.4bpp"); -const u32 gMapObjectPic_Picnicker_5[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/5.4bpp"); -const u32 gMapObjectPic_Picnicker_6[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/6.4bpp"); -const u32 gMapObjectPic_Picnicker_7[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/7.4bpp"); -const u32 gMapObjectPic_Picnicker_8[] = INCBIN_U32("graphics/map_objects/pics/people/picnicker/8.4bpp"); -const u32 gMapObjectPic_Man4_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/0.4bpp"); -const u32 gMapObjectPic_Man4_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/1.4bpp"); -const u32 gMapObjectPic_Man4_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/2.4bpp"); -const u32 gMapObjectPic_Man4_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/3.4bpp"); -const u32 gMapObjectPic_Man4_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/4.4bpp"); -const u32 gMapObjectPic_Man4_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/5.4bpp"); -const u32 gMapObjectPic_Man4_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/6.4bpp"); -const u32 gMapObjectPic_Man4_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/7.4bpp"); -const u32 gMapObjectPic_Man4_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_4/8.4bpp"); -const u32 gMapObjectPic_Woman7_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/0.4bpp"); -const u32 gMapObjectPic_Woman7_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/1.4bpp"); -const u32 gMapObjectPic_Woman7_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/2.4bpp"); -const u32 gMapObjectPic_Woman7_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/3.4bpp"); -const u32 gMapObjectPic_Woman7_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/4.4bpp"); -const u32 gMapObjectPic_Woman7_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/5.4bpp"); -const u32 gMapObjectPic_Woman7_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/6.4bpp"); -const u32 gMapObjectPic_Woman7_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/7.4bpp"); -const u32 gMapObjectPic_Woman7_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_7/8.4bpp"); -const u32 gMapObjectPic_Youngster_0[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/0.4bpp"); -const u32 gMapObjectPic_Youngster_1[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/1.4bpp"); -const u32 gMapObjectPic_Youngster_2[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/2.4bpp"); -const u32 gMapObjectPic_Youngster_3[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/3.4bpp"); -const u32 gMapObjectPic_Youngster_4[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/4.4bpp"); -const u32 gMapObjectPic_Youngster_5[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/5.4bpp"); -const u32 gMapObjectPic_Youngster_6[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/6.4bpp"); -const u32 gMapObjectPic_Youngster_7[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/7.4bpp"); -const u32 gMapObjectPic_Youngster_8[] = INCBIN_U32("graphics/map_objects/pics/people/youngster/8.4bpp"); -const u32 gMapObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/0.4bpp"); -const u32 gMapObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/1.4bpp"); -const u32 gMapObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/2.4bpp"); -const u32 gMapObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/3.4bpp"); -const u32 gMapObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/4.4bpp"); -const u32 gMapObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/5.4bpp"); -const u32 gMapObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/6.4bpp"); -const u32 gMapObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/7.4bpp"); -const u32 gMapObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/map_objects/pics/people/bug_catcher/8.4bpp"); -const u32 gMapObjectPic_PsychicM_0[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/0.4bpp"); -const u32 gMapObjectPic_PsychicM_1[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/1.4bpp"); -const u32 gMapObjectPic_PsychicM_2[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/2.4bpp"); -const u32 gMapObjectPic_PsychicM_3[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/3.4bpp"); -const u32 gMapObjectPic_PsychicM_4[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/4.4bpp"); -const u32 gMapObjectPic_PsychicM_5[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/5.4bpp"); -const u32 gMapObjectPic_PsychicM_6[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/6.4bpp"); -const u32 gMapObjectPic_PsychicM_7[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/7.4bpp"); -const u32 gMapObjectPic_PsychicM_8[] = INCBIN_U32("graphics/map_objects/pics/people/psychic_m/8.4bpp"); -const u32 gMapObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/0.4bpp"); -const u32 gMapObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/1.4bpp"); -const u32 gMapObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/2.4bpp"); -const u32 gMapObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/3.4bpp"); -const u32 gMapObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/4.4bpp"); -const u32 gMapObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/5.4bpp"); -const u32 gMapObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/6.4bpp"); -const u32 gMapObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/7.4bpp"); -const u32 gMapObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/map_objects/pics/people/school_kid_m/8.4bpp"); -const u32 gMapObjectPic_Maniac_0[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/0.4bpp"); -const u32 gMapObjectPic_Maniac_1[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/1.4bpp"); -const u32 gMapObjectPic_Maniac_2[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/2.4bpp"); -const u32 gMapObjectPic_Maniac_3[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/3.4bpp"); -const u32 gMapObjectPic_Maniac_4[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/4.4bpp"); -const u32 gMapObjectPic_Maniac_5[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/5.4bpp"); -const u32 gMapObjectPic_Maniac_6[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/6.4bpp"); -const u32 gMapObjectPic_Maniac_7[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/7.4bpp"); -const u32 gMapObjectPic_Maniac_8[] = INCBIN_U32("graphics/map_objects/pics/people/maniac/8.4bpp"); -const u32 gMapObjectPic_HexManiac_0[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/0.4bpp"); -const u32 gMapObjectPic_HexManiac_1[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/1.4bpp"); -const u32 gMapObjectPic_HexManiac_2[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/2.4bpp"); -const u32 gMapObjectPic_HexManiac_3[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/3.4bpp"); -const u32 gMapObjectPic_HexManiac_4[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/4.4bpp"); -const u32 gMapObjectPic_HexManiac_5[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/5.4bpp"); -const u32 gMapObjectPic_HexManiac_6[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/6.4bpp"); -const u32 gMapObjectPic_HexManiac_7[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/7.4bpp"); -const u32 gMapObjectPic_HexManiac_8[] = INCBIN_U32("graphics/map_objects/pics/people/hex_maniac/8.4bpp"); -const u32 gMapObjectPic_Woman8_0[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/0.4bpp"); -const u32 gMapObjectPic_Woman8_1[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/1.4bpp"); -const u32 gMapObjectPic_Woman8_2[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/2.4bpp"); -const u32 gMapObjectPic_Woman8_3[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/3.4bpp"); -const u32 gMapObjectPic_Woman8_4[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/4.4bpp"); -const u32 gMapObjectPic_Woman8_5[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/5.4bpp"); -const u32 gMapObjectPic_Woman8_6[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/6.4bpp"); -const u32 gMapObjectPic_Woman8_7[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/7.4bpp"); -const u32 gMapObjectPic_Woman8_8[] = INCBIN_U32("graphics/map_objects/pics/people/woman_8/8.4bpp"); -const u32 gMapObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/0.4bpp"); -const u32 gMapObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/1.4bpp"); -const u32 gMapObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/2.4bpp"); -const u32 gMapObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/3.4bpp"); -const u32 gMapObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/4.4bpp"); -const u32 gMapObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/5.4bpp"); -const u32 gMapObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/6.4bpp"); -const u32 gMapObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/7.4bpp"); -const u32 gMapObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_m/8.4bpp"); -const u32 gMapObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/0.4bpp"); -const u32 gMapObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/1.4bpp"); -const u32 gMapObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/2.4bpp"); -const u32 gMapObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/3.4bpp"); -const u32 gMapObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/4.4bpp"); -const u32 gMapObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/5.4bpp"); -const u32 gMapObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/6.4bpp"); -const u32 gMapObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/7.4bpp"); -const u32 gMapObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/map_objects/pics/people/swimmer_f/8.4bpp"); -const u32 gMapObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/0.4bpp"); -const u32 gMapObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/1.4bpp"); -const u32 gMapObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/2.4bpp"); -const u32 gMapObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/3.4bpp"); -const u32 gMapObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/4.4bpp"); -const u32 gMapObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/5.4bpp"); -const u32 gMapObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/6.4bpp"); -const u32 gMapObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/7.4bpp"); -const u32 gMapObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/map_objects/pics/people/black_belt/8.4bpp"); -const u32 gMapObjectPic_Beauty_0[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/0.4bpp"); -const u32 gMapObjectPic_Beauty_1[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/1.4bpp"); -const u32 gMapObjectPic_Beauty_2[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/2.4bpp"); -const u32 gMapObjectPic_Beauty_3[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/3.4bpp"); -const u32 gMapObjectPic_Beauty_4[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/4.4bpp"); -const u32 gMapObjectPic_Beauty_5[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/5.4bpp"); -const u32 gMapObjectPic_Beauty_6[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/6.4bpp"); -const u32 gMapObjectPic_Beauty_7[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/7.4bpp"); -const u32 gMapObjectPic_Beauty_8[] = INCBIN_U32("graphics/map_objects/pics/people/beauty/8.4bpp"); -const u32 gMapObjectPic_Scientist1_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/0.4bpp"); -const u32 gMapObjectPic_Scientist1_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/1.4bpp"); -const u32 gMapObjectPic_Scientist1_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/2.4bpp"); -const u32 gMapObjectPic_Scientist1_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/3.4bpp"); -const u32 gMapObjectPic_Scientist1_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/4.4bpp"); -const u32 gMapObjectPic_Scientist1_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/5.4bpp"); -const u32 gMapObjectPic_Scientist1_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/6.4bpp"); -const u32 gMapObjectPic_Scientist1_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/7.4bpp"); -const u32 gMapObjectPic_Scientist1_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_1/8.4bpp"); -const u32 gMapObjectPic_Lass_0[] = INCBIN_U32("graphics/map_objects/pics/people/lass/0.4bpp"); -const u32 gMapObjectPic_Lass_1[] = INCBIN_U32("graphics/map_objects/pics/people/lass/1.4bpp"); -const u32 gMapObjectPic_Lass_2[] = INCBIN_U32("graphics/map_objects/pics/people/lass/2.4bpp"); -const u32 gMapObjectPic_Lass_3[] = INCBIN_U32("graphics/map_objects/pics/people/lass/3.4bpp"); -const u32 gMapObjectPic_Lass_4[] = INCBIN_U32("graphics/map_objects/pics/people/lass/4.4bpp"); -const u32 gMapObjectPic_Lass_5[] = INCBIN_U32("graphics/map_objects/pics/people/lass/5.4bpp"); -const u32 gMapObjectPic_Lass_6[] = INCBIN_U32("graphics/map_objects/pics/people/lass/6.4bpp"); -const u32 gMapObjectPic_Lass_7[] = INCBIN_U32("graphics/map_objects/pics/people/lass/7.4bpp"); -const u32 gMapObjectPic_Lass_8[] = INCBIN_U32("graphics/map_objects/pics/people/lass/8.4bpp"); -const u32 gMapObjectPic_Gentleman_0[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/0.4bpp"); -const u32 gMapObjectPic_Gentleman_1[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/1.4bpp"); -const u32 gMapObjectPic_Gentleman_2[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/2.4bpp"); -const u32 gMapObjectPic_Gentleman_3[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/3.4bpp"); -const u32 gMapObjectPic_Gentleman_4[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/4.4bpp"); -const u32 gMapObjectPic_Gentleman_5[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/5.4bpp"); -const u32 gMapObjectPic_Gentleman_6[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/6.4bpp"); -const u32 gMapObjectPic_Gentleman_7[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/7.4bpp"); -const u32 gMapObjectPic_Gentleman_8[] = INCBIN_U32("graphics/map_objects/pics/people/gentleman/8.4bpp"); -const u32 gMapObjectPic_Sailor_0[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/0.4bpp"); -const u32 gMapObjectPic_Sailor_1[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/1.4bpp"); -const u32 gMapObjectPic_Sailor_2[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/2.4bpp"); -const u32 gMapObjectPic_Sailor_3[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/3.4bpp"); -const u32 gMapObjectPic_Sailor_4[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/4.4bpp"); -const u32 gMapObjectPic_Sailor_5[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/5.4bpp"); -const u32 gMapObjectPic_Sailor_6[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/6.4bpp"); -const u32 gMapObjectPic_Sailor_7[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/7.4bpp"); -const u32 gMapObjectPic_Sailor_8[] = INCBIN_U32("graphics/map_objects/pics/people/sailor/8.4bpp"); -const u32 gMapObjectPic_Fisherman_0[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/0.4bpp"); -const u32 gMapObjectPic_Fisherman_1[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/1.4bpp"); -const u32 gMapObjectPic_Fisherman_2[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/2.4bpp"); -const u32 gMapObjectPic_Fisherman_3[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/3.4bpp"); -const u32 gMapObjectPic_Fisherman_4[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/4.4bpp"); -const u32 gMapObjectPic_Fisherman_5[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/5.4bpp"); -const u32 gMapObjectPic_Fisherman_6[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/6.4bpp"); -const u32 gMapObjectPic_Fisherman_7[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/7.4bpp"); -const u32 gMapObjectPic_Fisherman_8[] = INCBIN_U32("graphics/map_objects/pics/people/fisherman/8.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/0.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/1.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/2.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/3.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/4.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/5.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/6.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/7.4bpp"); -const u32 gMapObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_m/8.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/0.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/1.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/2.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/3.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/4.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/5.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/6.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/7.4bpp"); -const u32 gMapObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/running_triathlete_f/8.4bpp"); -const u32 gMapObjectPic_TuberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/0.4bpp"); -const u32 gMapObjectPic_TuberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/1.4bpp"); -const u32 gMapObjectPic_TuberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/2.4bpp"); -const u32 gMapObjectPic_TuberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/3.4bpp"); -const u32 gMapObjectPic_TuberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/4.4bpp"); -const u32 gMapObjectPic_TuberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/5.4bpp"); -const u32 gMapObjectPic_TuberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/6.4bpp"); -const u32 gMapObjectPic_TuberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/7.4bpp"); -const u32 gMapObjectPic_TuberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_f/8.4bpp"); -const u32 gMapObjectPic_TuberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/0.4bpp"); -const u32 gMapObjectPic_TuberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/1.4bpp"); -const u32 gMapObjectPic_TuberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/2.4bpp"); -const u32 gMapObjectPic_TuberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/3.4bpp"); -const u32 gMapObjectPic_TuberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/4.4bpp"); -const u32 gMapObjectPic_TuberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/5.4bpp"); -const u32 gMapObjectPic_TuberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/6.4bpp"); -const u32 gMapObjectPic_TuberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/7.4bpp"); -const u32 gMapObjectPic_TuberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m/8.4bpp"); -const u32 gMapObjectPic_Hiker_0[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/0.4bpp"); -const u32 gMapObjectPic_Hiker_1[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/1.4bpp"); -const u32 gMapObjectPic_Hiker_2[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/2.4bpp"); -const u32 gMapObjectPic_Hiker_3[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/3.4bpp"); -const u32 gMapObjectPic_Hiker_4[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/4.4bpp"); -const u32 gMapObjectPic_Hiker_5[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/5.4bpp"); -const u32 gMapObjectPic_Hiker_6[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/6.4bpp"); -const u32 gMapObjectPic_Hiker_7[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/7.4bpp"); -const u32 gMapObjectPic_Hiker_8[] = INCBIN_U32("graphics/map_objects/pics/people/hiker/8.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/0.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/1.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/2.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/3.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/4.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/5.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/6.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/7.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_m/8.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/0.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/1.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/2.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/3.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/4.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/5.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/6.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/7.4bpp"); -const u32 gMapObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/map_objects/pics/people/cycling_triathlete_f/8.4bpp"); -const u32 gMapObjectPic_Man5_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/0.4bpp"); -const u32 gMapObjectPic_Man5_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/1.4bpp"); -const u32 gMapObjectPic_Man5_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/2.4bpp"); -const u32 gMapObjectPic_Man5_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/3.4bpp"); -const u32 gMapObjectPic_Man5_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/4.4bpp"); -const u32 gMapObjectPic_Man5_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/5.4bpp"); -const u32 gMapObjectPic_Man5_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/6.4bpp"); -const u32 gMapObjectPic_Man5_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/7.4bpp"); -const u32 gMapObjectPic_Man5_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_5/8.4bpp"); -const u32 gMapObjectPic_Man6_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/0.4bpp"); -const u32 gMapObjectPic_Man6_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/1.4bpp"); -const u32 gMapObjectPic_Man6_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/2.4bpp"); -const u32 gMapObjectPic_Man6_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/3.4bpp"); -const u32 gMapObjectPic_Man6_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/4.4bpp"); -const u32 gMapObjectPic_Man6_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/5.4bpp"); -const u32 gMapObjectPic_Man6_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/6.4bpp"); -const u32 gMapObjectPic_Man6_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/7.4bpp"); -const u32 gMapObjectPic_Man6_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_6/8.4bpp"); -const u32 gMapObjectPic_Nurse_0[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/0.4bpp"); -const u32 gMapObjectPic_Nurse_1[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/1.4bpp"); -const u32 gMapObjectPic_Nurse_2[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/2.4bpp"); -const u32 gMapObjectPic_Nurse_3[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/3.4bpp"); -const u32 gMapObjectPic_Nurse_4[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/4.4bpp"); -const u32 gMapObjectPic_Nurse_5[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/5.4bpp"); -const u32 gMapObjectPic_Nurse_6[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/6.4bpp"); -const u32 gMapObjectPic_Nurse_7[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/7.4bpp"); -const u32 gMapObjectPic_Nurse_8[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/8.4bpp"); -const u32 gMapObjectPic_Nurse_9[] = INCBIN_U32("graphics/map_objects/pics/people/nurse/9.4bpp"); -const u32 gMapObjectPic_ItemBall[] = INCBIN_U32("graphics/map_objects/pics/misc/item_ball.4bpp"); -const u32 gMapObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/0.4bpp"); -const u32 gMapObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/1.4bpp"); -const u32 gMapObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/2.4bpp"); -const u32 gMapObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/3.4bpp"); -const u32 gMapObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/4.4bpp"); -const u32 gMapObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/5.4bpp"); -const u32 gMapObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/6.4bpp"); -const u32 gMapObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/7.4bpp"); -const u32 gMapObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/map_objects/pics/people/prof_birch/8.4bpp"); -const u32 gMapObjectPic_ReporterM_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/0.4bpp"); -const u32 gMapObjectPic_ReporterM_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/1.4bpp"); -const u32 gMapObjectPic_ReporterM_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/2.4bpp"); -const u32 gMapObjectPic_ReporterM_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/3.4bpp"); -const u32 gMapObjectPic_ReporterM_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/4.4bpp"); -const u32 gMapObjectPic_ReporterM_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/5.4bpp"); -const u32 gMapObjectPic_ReporterM_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/6.4bpp"); -const u32 gMapObjectPic_ReporterM_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/7.4bpp"); -const u32 gMapObjectPic_ReporterM_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_m/8.4bpp"); -const u32 gMapObjectPic_ReporterF_0[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/0.4bpp"); -const u32 gMapObjectPic_ReporterF_1[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/1.4bpp"); -const u32 gMapObjectPic_ReporterF_2[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/2.4bpp"); -const u32 gMapObjectPic_ReporterF_3[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/3.4bpp"); -const u32 gMapObjectPic_ReporterF_4[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/4.4bpp"); -const u32 gMapObjectPic_ReporterF_5[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/5.4bpp"); -const u32 gMapObjectPic_ReporterF_6[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/6.4bpp"); -const u32 gMapObjectPic_ReporterF_7[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/7.4bpp"); -const u32 gMapObjectPic_ReporterF_8[] = INCBIN_U32("graphics/map_objects/pics/people/reporter_f/8.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/0.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/1.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/2.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/3.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/4.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/5.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/6.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/7.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_1/8.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/0.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/1.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/2.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/3.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/4.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/5.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/6.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/7.4bpp"); -const u32 gMapObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/map_objects/pics/people/mauville_old_man_2/8.4bpp"); -const u32 gMapObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/0.4bpp"); -const u32 gMapObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/1.4bpp"); -const u32 gMapObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/2.4bpp"); -const u32 gMapObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/3.4bpp"); -const u32 gMapObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/4.4bpp"); -const u32 gMapObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/5.4bpp"); -const u32 gMapObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/6.4bpp"); -const u32 gMapObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/7.4bpp"); -const u32 gMapObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/map_objects/pics/people/mart_employee/8.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/0.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/1.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/2.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/3.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/4.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/5.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/6.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/7.4bpp"); -const u32 gMapObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/rooftop_sale_woman/8.4bpp"); -const u32 gMapObjectPic_Teala_0[] = INCBIN_U32("graphics/map_objects/pics/people/teala/0.4bpp"); -const u32 gMapObjectPic_Teala_1[] = INCBIN_U32("graphics/map_objects/pics/people/teala/1.4bpp"); -const u32 gMapObjectPic_Teala_2[] = INCBIN_U32("graphics/map_objects/pics/people/teala/2.4bpp"); -const u32 gMapObjectPic_Teala_3[] = INCBIN_U32("graphics/map_objects/pics/people/teala/3.4bpp"); -const u32 gMapObjectPic_Teala_4[] = INCBIN_U32("graphics/map_objects/pics/people/teala/4.4bpp"); -const u32 gMapObjectPic_Teala_5[] = INCBIN_U32("graphics/map_objects/pics/people/teala/5.4bpp"); -const u32 gMapObjectPic_Teala_6[] = INCBIN_U32("graphics/map_objects/pics/people/teala/6.4bpp"); -const u32 gMapObjectPic_Teala_7[] = INCBIN_U32("graphics/map_objects/pics/people/teala/7.4bpp"); -const u32 gMapObjectPic_Teala_8[] = INCBIN_U32("graphics/map_objects/pics/people/teala/8.4bpp"); -const u32 gMapObjectPic_Artist_0[] = INCBIN_U32("graphics/map_objects/pics/people/artist/0.4bpp"); -const u32 gMapObjectPic_Artist_1[] = INCBIN_U32("graphics/map_objects/pics/people/artist/1.4bpp"); -const u32 gMapObjectPic_Artist_2[] = INCBIN_U32("graphics/map_objects/pics/people/artist/2.4bpp"); -const u32 gMapObjectPic_Artist_3[] = INCBIN_U32("graphics/map_objects/pics/people/artist/3.4bpp"); -const u32 gMapObjectPic_Artist_4[] = INCBIN_U32("graphics/map_objects/pics/people/artist/4.4bpp"); -const u32 gMapObjectPic_Artist_5[] = INCBIN_U32("graphics/map_objects/pics/people/artist/5.4bpp"); -const u32 gMapObjectPic_Artist_6[] = INCBIN_U32("graphics/map_objects/pics/people/artist/6.4bpp"); -const u32 gMapObjectPic_Artist_7[] = INCBIN_U32("graphics/map_objects/pics/people/artist/7.4bpp"); -const u32 gMapObjectPic_Artist_8[] = INCBIN_U32("graphics/map_objects/pics/people/artist/8.4bpp"); -const u32 gMapObjectPic_Cameraman_0[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/0.4bpp"); -const u32 gMapObjectPic_Cameraman_1[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/1.4bpp"); -const u32 gMapObjectPic_Cameraman_2[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/2.4bpp"); -const u32 gMapObjectPic_Cameraman_3[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/3.4bpp"); -const u32 gMapObjectPic_Cameraman_4[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/4.4bpp"); -const u32 gMapObjectPic_Cameraman_5[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/5.4bpp"); -const u32 gMapObjectPic_Cameraman_6[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/6.4bpp"); -const u32 gMapObjectPic_Cameraman_7[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/7.4bpp"); -const u32 gMapObjectPic_Cameraman_8[] = INCBIN_U32("graphics/map_objects/pics/people/cameraman/8.4bpp"); -const u32 gMapObjectPic_Scientist2_0[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/0.4bpp"); -const u32 gMapObjectPic_Scientist2_1[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/1.4bpp"); -const u32 gMapObjectPic_Scientist2_2[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/2.4bpp"); -const u32 gMapObjectPic_Scientist2_3[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/3.4bpp"); -const u32 gMapObjectPic_Scientist2_4[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/4.4bpp"); -const u32 gMapObjectPic_Scientist2_5[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/5.4bpp"); -const u32 gMapObjectPic_Scientist2_6[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/6.4bpp"); -const u32 gMapObjectPic_Scientist2_7[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/7.4bpp"); -const u32 gMapObjectPic_Scientist2_8[] = INCBIN_U32("graphics/map_objects/pics/people/scientist_2/8.4bpp"); -const u32 gMapObjectPic_Man7_0[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/0.4bpp"); -const u32 gMapObjectPic_Man7_1[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/1.4bpp"); -const u32 gMapObjectPic_Man7_2[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/2.4bpp"); -const u32 gMapObjectPic_Man7_3[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/3.4bpp"); -const u32 gMapObjectPic_Man7_4[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/4.4bpp"); -const u32 gMapObjectPic_Man7_5[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/5.4bpp"); -const u32 gMapObjectPic_Man7_6[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/6.4bpp"); -const u32 gMapObjectPic_Man7_7[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/7.4bpp"); -const u32 gMapObjectPic_Man7_8[] = INCBIN_U32("graphics/map_objects/pics/people/man_7/8.4bpp"); -const u32 gMapObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/0.4bpp"); -const u32 gMapObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/1.4bpp"); -const u32 gMapObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/2.4bpp"); -const u32 gMapObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/3.4bpp"); -const u32 gMapObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/4.4bpp"); -const u32 gMapObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/5.4bpp"); -const u32 gMapObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/6.4bpp"); -const u32 gMapObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/7.4bpp"); -const u32 gMapObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_m/8.4bpp"); -const u32 gMapObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/0.4bpp"); -const u32 gMapObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/1.4bpp"); -const u32 gMapObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/2.4bpp"); -const u32 gMapObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/3.4bpp"); -const u32 gMapObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/4.4bpp"); -const u32 gMapObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/5.4bpp"); -const u32 gMapObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/6.4bpp"); -const u32 gMapObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/7.4bpp"); -const u32 gMapObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/aqua_member_f/8.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/0.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/1.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/2.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/3.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/4.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/5.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/6.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/7.4bpp"); -const u32 gMapObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_m/8.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/0.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/1.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/2.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/3.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/4.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/5.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/6.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/7.4bpp"); -const u32 gMapObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/map_objects/pics/people/magma_member_f/8.4bpp"); -const u32 gMapObjectPic_Sidney_0[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/0.4bpp"); -const u32 gMapObjectPic_Sidney_1[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/1.4bpp"); -const u32 gMapObjectPic_Sidney_2[] = INCBIN_U32("graphics/map_objects/pics/people/sidney/2.4bpp"); -const u32 gMapObjectPic_Phoebe_0[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/0.4bpp"); -const u32 gMapObjectPic_Phoebe_1[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/1.4bpp"); -const u32 gMapObjectPic_Phoebe_2[] = INCBIN_U32("graphics/map_objects/pics/people/phoebe/2.4bpp"); -const u32 gMapObjectPic_Glacia_0[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/0.4bpp"); -const u32 gMapObjectPic_Glacia_1[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/1.4bpp"); -const u32 gMapObjectPic_Glacia_2[] = INCBIN_U32("graphics/map_objects/pics/people/glacia/2.4bpp"); -const u32 gMapObjectPic_Drake_0[] = INCBIN_U32("graphics/map_objects/pics/people/drake/0.4bpp"); -const u32 gMapObjectPic_Drake_1[] = INCBIN_U32("graphics/map_objects/pics/people/drake/1.4bpp"); -const u32 gMapObjectPic_Drake_2[] = INCBIN_U32("graphics/map_objects/pics/people/drake/2.4bpp"); -const u32 gMapObjectPic_Roxanne_0[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/0.4bpp"); -const u32 gMapObjectPic_Roxanne_1[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/1.4bpp"); -const u32 gMapObjectPic_Roxanne_2[] = INCBIN_U32("graphics/map_objects/pics/people/roxanne/2.4bpp"); -const u32 gMapObjectPic_Brawly_0[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/0.4bpp"); -const u32 gMapObjectPic_Brawly_1[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/1.4bpp"); -const u32 gMapObjectPic_Brawly_2[] = INCBIN_U32("graphics/map_objects/pics/people/brawly/2.4bpp"); -const u32 gMapObjectPic_Wattson_0[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/0.4bpp"); -const u32 gMapObjectPic_Wattson_1[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/1.4bpp"); -const u32 gMapObjectPic_Wattson_2[] = INCBIN_U32("graphics/map_objects/pics/people/wattson/2.4bpp"); -const u32 gMapObjectPic_Flannery_0[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/0.4bpp"); -const u32 gMapObjectPic_Flannery_1[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/1.4bpp"); -const u32 gMapObjectPic_Flannery_2[] = INCBIN_U32("graphics/map_objects/pics/people/flannery/2.4bpp"); -const u32 gMapObjectPic_Norman_0[] = INCBIN_U32("graphics/map_objects/pics/people/norman/0.4bpp"); -const u32 gMapObjectPic_Norman_1[] = INCBIN_U32("graphics/map_objects/pics/people/norman/1.4bpp"); -const u32 gMapObjectPic_Norman_2[] = INCBIN_U32("graphics/map_objects/pics/people/norman/2.4bpp"); -const u32 gMapObjectPic_Norman_3[] = INCBIN_U32("graphics/map_objects/pics/people/norman/3.4bpp"); -const u32 gMapObjectPic_Norman_4[] = INCBIN_U32("graphics/map_objects/pics/people/norman/4.4bpp"); -const u32 gMapObjectPic_Norman_5[] = INCBIN_U32("graphics/map_objects/pics/people/norman/5.4bpp"); -const u32 gMapObjectPic_Norman_6[] = INCBIN_U32("graphics/map_objects/pics/people/norman/6.4bpp"); -const u32 gMapObjectPic_Norman_7[] = INCBIN_U32("graphics/map_objects/pics/people/norman/7.4bpp"); -const u32 gMapObjectPic_Norman_8[] = INCBIN_U32("graphics/map_objects/pics/people/norman/8.4bpp"); -const u32 gMapObjectPic_Winona_0[] = INCBIN_U32("graphics/map_objects/pics/people/winona/0.4bpp"); -const u32 gMapObjectPic_Winona_1[] = INCBIN_U32("graphics/map_objects/pics/people/winona/1.4bpp"); -const u32 gMapObjectPic_Winona_2[] = INCBIN_U32("graphics/map_objects/pics/people/winona/2.4bpp"); -const u32 gMapObjectPic_Liza_0[] = INCBIN_U32("graphics/map_objects/pics/people/liza/0.4bpp"); -const u32 gMapObjectPic_Liza_1[] = INCBIN_U32("graphics/map_objects/pics/people/liza/1.4bpp"); -const u32 gMapObjectPic_Liza_2[] = INCBIN_U32("graphics/map_objects/pics/people/liza/2.4bpp"); -const u32 gMapObjectPic_Tate_0[] = INCBIN_U32("graphics/map_objects/pics/people/tate/0.4bpp"); -const u32 gMapObjectPic_Tate_1[] = INCBIN_U32("graphics/map_objects/pics/people/tate/1.4bpp"); -const u32 gMapObjectPic_Tate_2[] = INCBIN_U32("graphics/map_objects/pics/people/tate/2.4bpp"); -const u32 gMapObjectPic_Wallace_0[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/0.4bpp"); -const u32 gMapObjectPic_Wallace_1[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/1.4bpp"); -const u32 gMapObjectPic_Wallace_2[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/2.4bpp"); -const u32 gMapObjectPic_Wallace_3[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/3.4bpp"); -const u32 gMapObjectPic_Wallace_4[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/4.4bpp"); -const u32 gMapObjectPic_Wallace_5[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/5.4bpp"); -const u32 gMapObjectPic_Wallace_6[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/6.4bpp"); -const u32 gMapObjectPic_Wallace_7[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/7.4bpp"); -const u32 gMapObjectPic_Wallace_8[] = INCBIN_U32("graphics/map_objects/pics/people/wallace/8.4bpp"); -const u32 gMapObjectPic_Steven_0[] = INCBIN_U32("graphics/map_objects/pics/people/steven/0.4bpp"); -const u32 gMapObjectPic_Steven_1[] = INCBIN_U32("graphics/map_objects/pics/people/steven/1.4bpp"); -const u32 gMapObjectPic_Steven_2[] = INCBIN_U32("graphics/map_objects/pics/people/steven/2.4bpp"); -const u32 gMapObjectPic_Steven_3[] = INCBIN_U32("graphics/map_objects/pics/people/steven/3.4bpp"); -const u32 gMapObjectPic_Steven_4[] = INCBIN_U32("graphics/map_objects/pics/people/steven/4.4bpp"); -const u32 gMapObjectPic_Steven_5[] = INCBIN_U32("graphics/map_objects/pics/people/steven/5.4bpp"); -const u32 gMapObjectPic_Steven_6[] = INCBIN_U32("graphics/map_objects/pics/people/steven/6.4bpp"); -const u32 gMapObjectPic_Steven_7[] = INCBIN_U32("graphics/map_objects/pics/people/steven/7.4bpp"); -const u32 gMapObjectPic_Steven_8[] = INCBIN_U32("graphics/map_objects/pics/people/steven/8.4bpp"); -const u32 gMapObjectPic_Wally_0[] = INCBIN_U32("graphics/map_objects/pics/people/wally/0.4bpp"); -const u32 gMapObjectPic_Wally_1[] = INCBIN_U32("graphics/map_objects/pics/people/wally/1.4bpp"); -const u32 gMapObjectPic_Wally_2[] = INCBIN_U32("graphics/map_objects/pics/people/wally/2.4bpp"); -const u32 gMapObjectPic_Wally_3[] = INCBIN_U32("graphics/map_objects/pics/people/wally/3.4bpp"); -const u32 gMapObjectPic_Wally_4[] = INCBIN_U32("graphics/map_objects/pics/people/wally/4.4bpp"); -const u32 gMapObjectPic_Wally_5[] = INCBIN_U32("graphics/map_objects/pics/people/wally/5.4bpp"); -const u32 gMapObjectPic_Wally_6[] = INCBIN_U32("graphics/map_objects/pics/people/wally/6.4bpp"); -const u32 gMapObjectPic_Wally_7[] = INCBIN_U32("graphics/map_objects/pics/people/wally/7.4bpp"); -const u32 gMapObjectPic_Wally_8[] = INCBIN_U32("graphics/map_objects/pics/people/wally/8.4bpp"); -const u32 gMapObjectPic_LittleBoy3_0[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/0.4bpp"); -const u32 gMapObjectPic_LittleBoy3_1[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/1.4bpp"); -const u32 gMapObjectPic_LittleBoy3_2[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/2.4bpp"); -const u32 gMapObjectPic_LittleBoy3_3[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/3.4bpp"); -const u32 gMapObjectPic_LittleBoy3_4[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/4.4bpp"); -const u32 gMapObjectPic_LittleBoy3_5[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/5.4bpp"); -const u32 gMapObjectPic_LittleBoy3_6[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/6.4bpp"); -const u32 gMapObjectPic_LittleBoy3_7[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/7.4bpp"); -const u32 gMapObjectPic_LittleBoy3_8[] = INCBIN_U32("graphics/map_objects/pics/people/little_boy_3/8.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/0.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/1.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/2.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/3.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/4.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/5.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/6.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/7.4bpp"); -const u32 gMapObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/map_objects/pics/people/hot_springs_old_woman/8.4bpp"); -const u32 gMapObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/0.4bpp"); -const u32 gMapObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/1.4bpp"); -const u32 gMapObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/latias_latios/2.4bpp"); -const u32 gMapObjectPic_Boy5_0[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/0.4bpp"); -const u32 gMapObjectPic_Boy5_1[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/1.4bpp"); -const u32 gMapObjectPic_Boy5_2[] = INCBIN_U32("graphics/map_objects/pics/people/boy_5/2.4bpp"); -const u32 gMapObjectPic_ContestJudge_0[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/0.4bpp"); -const u32 gMapObjectPic_ContestJudge_1[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/1.4bpp"); -const u32 gMapObjectPic_ContestJudge_2[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/2.4bpp"); -const u32 gMapObjectPic_ContestJudge_3[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/3.4bpp"); -const u32 gMapObjectPic_ContestJudge_4[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/4.4bpp"); -const u32 gMapObjectPic_ContestJudge_5[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/5.4bpp"); -const u32 gMapObjectPic_ContestJudge_6[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/6.4bpp"); -const u32 gMapObjectPic_ContestJudge_7[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/7.4bpp"); -const u32 gMapObjectPic_ContestJudge_8[] = INCBIN_U32("graphics/map_objects/pics/people/contest_judge/8.4bpp"); -const u32 gMapObjectPic_Archie_0[] = INCBIN_U32("graphics/map_objects/pics/people/archie/0.4bpp"); -const u32 gMapObjectPic_Archie_1[] = INCBIN_U32("graphics/map_objects/pics/people/archie/1.4bpp"); -const u32 gMapObjectPic_Archie_2[] = INCBIN_U32("graphics/map_objects/pics/people/archie/2.4bpp"); -const u32 gMapObjectPic_Archie_3[] = INCBIN_U32("graphics/map_objects/pics/people/archie/3.4bpp"); -const u32 gMapObjectPic_Archie_4[] = INCBIN_U32("graphics/map_objects/pics/people/archie/4.4bpp"); -const u32 gMapObjectPic_Archie_5[] = INCBIN_U32("graphics/map_objects/pics/people/archie/5.4bpp"); -const u32 gMapObjectPic_Archie_6[] = INCBIN_U32("graphics/map_objects/pics/people/archie/6.4bpp"); -const u32 gMapObjectPic_Archie_7[] = INCBIN_U32("graphics/map_objects/pics/people/archie/7.4bpp"); -const u32 gMapObjectPic_Archie_8[] = INCBIN_U32("graphics/map_objects/pics/people/archie/8.4bpp"); -const u32 gMapObjectPic_Maxie_0[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/0.4bpp"); -const u32 gMapObjectPic_Maxie_1[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/1.4bpp"); -const u32 gMapObjectPic_Maxie_2[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/2.4bpp"); -const u32 gMapObjectPic_Maxie_3[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/3.4bpp"); -const u32 gMapObjectPic_Maxie_4[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/4.4bpp"); -const u32 gMapObjectPic_Maxie_5[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/5.4bpp"); -const u32 gMapObjectPic_Maxie_6[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/6.4bpp"); -const u32 gMapObjectPic_Maxie_7[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/7.4bpp"); -const u32 gMapObjectPic_Maxie_8[] = INCBIN_U32("graphics/map_objects/pics/people/maxie/8.4bpp"); -const u32 gMapObjectPic_Kyogre_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/0.4bpp"); -const u32 gMapObjectPic_Kyogre_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kyogre/1.4bpp"); -const u32 gMapObjectPic_Groudon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/0.4bpp"); -const u32 gMapObjectPic_Groudon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/groudon/1.4bpp"); -const u32 gMapObjectPic_Regi[] = INCBIN_U32("graphics/map_objects/pics/pokemon/regi.4bpp"); -const u32 gMapObjectPic_Skitty_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/0.4bpp"); -const u32 gMapObjectPic_Skitty_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/1.4bpp"); -const u32 gMapObjectPic_Skitty_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/skitty/2.4bpp"); -const u32 gMapObjectPic_Kecleon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/0.4bpp"); -const u32 gMapObjectPic_Kecleon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/1.4bpp"); -const u32 gMapObjectPic_Kecleon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/kecleon/2.4bpp"); -const u32 gMapObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/0.4bpp"); -const u32 gMapObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/rayquaza/1.4bpp"); -const u32 gMapObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/0.4bpp"); -const u32 gMapObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/1.4bpp"); -const u32 gMapObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/zigzagoon/2.4bpp"); -const u32 gMapObjectPic_Pikachu_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/0.4bpp"); -const u32 gMapObjectPic_Pikachu_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/1.4bpp"); -const u32 gMapObjectPic_Pikachu_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/pikachu/2.4bpp"); -const u32 gMapObjectPic_Azumarill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/0.4bpp"); -const u32 gMapObjectPic_Azumarill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/1.4bpp"); -const u32 gMapObjectPic_Azumarill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azumarill/2.4bpp"); -const u32 gMapObjectPic_Wingull_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/0.4bpp"); -const u32 gMapObjectPic_Wingull_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/3.4bpp"); -const u32 gMapObjectPic_Wingull_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/1.4bpp"); -const u32 gMapObjectPic_Wingull_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/4.4bpp"); -const u32 gMapObjectPic_Wingull_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/2.4bpp"); -const u32 gMapObjectPic_Wingull_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/wingull/5.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/0.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/1.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/2.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/3.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/4.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/5.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/6.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/7.4bpp"); -const u32 gMapObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/map_objects/pics/people/tuber_m_swimming/8.4bpp"); -const u32 gMapObjectPic_Azurill_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/0.4bpp"); -const u32 gMapObjectPic_Azurill_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/1.4bpp"); -const u32 gMapObjectPic_Azurill_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/azurill/2.4bpp"); -const u32 gMapObjectPic_Mom_0[] = INCBIN_U32("graphics/map_objects/pics/people/mom/0.4bpp"); -const u32 gMapObjectPic_Mom_1[] = INCBIN_U32("graphics/map_objects/pics/people/mom/1.4bpp"); -const u32 gMapObjectPic_Mom_2[] = INCBIN_U32("graphics/map_objects/pics/people/mom/2.4bpp"); -const u32 gMapObjectPic_Mom_3[] = INCBIN_U32("graphics/map_objects/pics/people/mom/3.4bpp"); -const u32 gMapObjectPic_Mom_4[] = INCBIN_U32("graphics/map_objects/pics/people/mom/4.4bpp"); -const u32 gMapObjectPic_Mom_5[] = INCBIN_U32("graphics/map_objects/pics/people/mom/5.4bpp"); -const u32 gMapObjectPic_Mom_6[] = INCBIN_U32("graphics/map_objects/pics/people/mom/6.4bpp"); -const u32 gMapObjectPic_Mom_7[] = INCBIN_U32("graphics/map_objects/pics/people/mom/7.4bpp"); -const u32 gMapObjectPic_Mom_8[] = INCBIN_U32("graphics/map_objects/pics/people/mom/8.4bpp"); -const u16 gMapObjectPalette22[] = INCBIN_U16("graphics/map_objects/palettes/22.gbapal"); -const u16 gMapObjectPalette23[] = INCBIN_U16("graphics/map_objects/palettes/23.gbapal"); -const u16 gMapObjectPalette24[] = INCBIN_U16("graphics/map_objects/palettes/24.gbapal"); -const u16 gMapObjectPalette25[] = INCBIN_U16("graphics/map_objects/palettes/25.gbapal"); -const u32 gMapObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_natu_doll.4bpp"); -const u32 gMapObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_magnemite_doll.4bpp"); -const u32 gMapObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_squirtle_doll.4bpp"); -const u32 gMapObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_wooper_doll.4bpp"); -const u32 gMapObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_pikachu_doll.4bpp"); -const u32 gMapObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/map_objects/pics/dolls/unused_porygon2_doll.4bpp"); -const u32 gMapObjectPic_PichuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pichu_doll.4bpp"); -const u32 gMapObjectPic_PikachuDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/pikachu_doll.4bpp"); -const u32 gMapObjectPic_MarillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/marill_doll.4bpp"); -const u32 gMapObjectPic_TogepiDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/togepi_doll.4bpp"); -const u32 gMapObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/cyndaquil_doll.4bpp"); -const u32 gMapObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/chikorita_doll.4bpp"); -const u32 gMapObjectPic_TotodileDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/totodile_doll.4bpp"); -const u32 gMapObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/jigglypuff_doll.4bpp"); -const u32 gMapObjectPic_MeowthDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/meowth_doll.4bpp"); -const u32 gMapObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/clefairy_doll.4bpp"); -const u32 gMapObjectPic_DittoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/ditto_doll.4bpp"); -const u32 gMapObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/smoochum_doll.4bpp"); -const u32 gMapObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/treecko_doll.4bpp"); -const u32 gMapObjectPic_TorchicDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/torchic_doll.4bpp"); -const u32 gMapObjectPic_MudkipDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/mudkip_doll.4bpp"); -const u32 gMapObjectPic_DuskullDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/duskull_doll.4bpp"); -const u32 gMapObjectPic_WynautDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/wynaut_doll.4bpp"); -const u32 gMapObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/baltoy_doll.4bpp"); -const u32 gMapObjectPic_KecleonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/kecleon_doll.4bpp"); -const u32 gMapObjectPic_AzurillDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/azurill_doll.4bpp"); -const u32 gMapObjectPic_SkittyDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/skitty_doll.4bpp"); -const u32 gMapObjectPic_SwabluDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/swablu_doll.4bpp"); -const u32 gMapObjectPic_GulpinDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/gulpin_doll.4bpp"); -const u32 gMapObjectPic_LotadDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/lotad_doll.4bpp"); -const u32 gMapObjectPic_SeedotDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/seedot_doll.4bpp"); -const u32 gMapObjectPic_PikaCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/pika_cushion.4bpp"); -const u32 gMapObjectPic_RoundCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/round_cushion.4bpp"); -const u32 gMapObjectPic_KissCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/kiss_cushion.4bpp"); -const u32 gMapObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/zigzag_cushion.4bpp"); -const u32 gMapObjectPic_SpinCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/spin_cushion.4bpp"); -const u32 gMapObjectPic_DiamondCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/diamond_cushion.4bpp"); -const u32 gMapObjectPic_BallCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/ball_cushion.4bpp"); -const u32 gMapObjectPic_GrassCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/grass_cushion.4bpp"); -const u32 gMapObjectPic_FireCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/fire_cushion.4bpp"); -const u32 gMapObjectPic_WaterCushion[] = INCBIN_U32("graphics/map_objects/pics/cushions/water_cushion.4bpp"); -const u32 gMapObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_snorlax_doll.4bpp"); -const u32 gMapObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_rhydon_doll.4bpp"); -const u32 gMapObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_lapras_doll.4bpp"); -const u32 gMapObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_venusaur_doll.4bpp"); -const u32 gMapObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_charizard_doll.4bpp"); -const u32 gMapObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_blastoise_doll.4bpp"); -const u32 gMapObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_wailmer_doll.4bpp"); -const u32 gMapObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regirock_doll.4bpp"); -const u32 gMapObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_regice_doll.4bpp"); -const u32 gMapObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/map_objects/pics/dolls/big_registeel_doll.4bpp"); -const u32 gMapObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/0.4bpp"); -const u32 gMapObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/1.4bpp"); -const u32 gMapObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/2.4bpp"); -const u32 gMapObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/map_objects/pics/misc/cuttable_tree/3.4bpp"); -const u32 gMapObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/0.4bpp"); -const u32 gMapObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/1.4bpp"); -const u32 gMapObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/2.4bpp"); -const u32 gMapObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/map_objects/pics/misc/breakable_rock/3.4bpp"); -const u32 gMapObjectPic_PushableBoulder[] = INCBIN_U32("graphics/map_objects/pics/misc/pushable_boulder.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/0.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/1.4bpp"); -const u32 gMapObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/map_objects/pics/misc/mr_brineys_boat/2.4bpp"); -const u32 gMapObjectPic_Fossil[] = INCBIN_U32("graphics/map_objects/pics/misc/fossil.4bpp"); -const u32 gMapObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/map_objects/pics/misc/submarine_shadow.4bpp"); -const u16 gMapObjectPalette26[] = INCBIN_U16("graphics/map_objects/palettes/26.gbapal"); -const u32 gMapObjectPic_Truck[] = INCBIN_U32("graphics/map_objects/pics/misc/truck.4bpp"); -const u16 gMapObjectPalette14[] = INCBIN_U16("graphics/map_objects/palettes/14.gbapal"); -const u32 gMapObjectPic_MachokeCarryingBox_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/0.4bpp"); -const u32 gMapObjectPic_MachokeCarryingBox_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/1.4bpp"); -const u32 gMapObjectPic_MachokeCarryingBox_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_carrying_box/2.4bpp"); -const u32 gMapObjectPic_MachokeFacingAway_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/0.4bpp"); -const u32 gMapObjectPic_MachokeFacingAway_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/machoke_facing_away/1.4bpp"); -const u16 gMapObjectPalette15[] = INCBIN_U16("graphics/map_objects/palettes/15.gbapal"); -const u32 gMapObjectPic_BirchsBag[] = INCBIN_U32("graphics/map_objects/pics/misc/birchs_bag.4bpp"); -const u32 gMapObjectPic_Poochyena_0[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/0.4bpp"); -const u32 gMapObjectPic_Poochyena_1[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/1.4bpp"); -const u32 gMapObjectPic_Poochyena_2[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/2.4bpp"); -const u32 gMapObjectPic_Poochyena_3[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/3.4bpp"); -const u32 gMapObjectPic_Poochyena_4[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/4.4bpp"); -const u32 gMapObjectPic_Poochyena_5[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/5.4bpp"); -const u32 gMapObjectPic_Poochyena_6[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/6.4bpp"); -const u32 gMapObjectPic_Poochyena_7[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/7.4bpp"); -const u32 gMapObjectPic_Poochyena_8[] = INCBIN_U32("graphics/map_objects/pics/pokemon/poochyena/8.4bpp"); -const u16 gMapObjectPalette16[] = INCBIN_U16("graphics/map_objects/palettes/16.gbapal"); -const u32 gMapObjectPic_CableCar[] = INCBIN_U32("graphics/map_objects/pics/misc/cable_car.4bpp"); -const u16 gMapObjectPalette20[] = INCBIN_U16("graphics/map_objects/palettes/20.gbapal"); -const u32 gMapObjectPic_SSTidal[] = INCBIN_U32("graphics/map_objects/pics/misc/ss_tidal.4bpp"); -const u16 gMapObjectPalette21[] = INCBIN_U16("graphics/map_objects/palettes/21.gbapal"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/0.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/1.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/2.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/3.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/4.4bpp"); -const u32 gFieldEffectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/field_effect_objects/pics/berry_tree_growth_sparkle/5.4bpp"); -const u32 gMapObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/dirt_pile.4bpp"); -const u32 gMapObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/0.4bpp"); -const u32 gMapObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sprout/1.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/0.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/1.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/2.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/3.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/4.4bpp"); -const u32 gMapObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pecha/5.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/0.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/1.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/2.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/3.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/4.4bpp"); -const u32 gMapObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/kelpsy/5.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/0.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/1.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/2.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/3.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/4.4bpp"); -const u32 gMapObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wepear/5.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/0.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/1.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/2.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/3.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/4.4bpp"); -const u32 gMapObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/iapapa/5.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/0.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/1.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/2.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/3.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/4.4bpp"); -const u32 gMapObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cheri/5.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/0.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/1.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/2.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/3.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/4.4bpp"); -const u32 gMapObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/figy/5.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/0.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/1.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/2.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/3.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/4.4bpp"); -const u32 gMapObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/mago/5.4bpp"); -const u32 gMapObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/0.4bpp"); -const u32 gMapObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/1.4bpp"); -const u32 gMapObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/2.4bpp"); -const u32 gMapObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/3.4bpp"); -const u32 gMapObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/4.4bpp"); -const u32 gMapObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lum/5.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/0.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/1.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/2.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/3.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/4.4bpp"); -const u32 gMapObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/razz/5.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/0.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/1.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/2.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/3.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/4.4bpp"); -const u32 gMapObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/grepa/5.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/0.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/1.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/2.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/3.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/4.4bpp"); -const u32 gMapObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rabuta/5.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/0.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/1.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/2.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/3.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/4.4bpp"); -const u32 gMapObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/nomel/5.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/0.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/1.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/2.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/3.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/4.4bpp"); -const u32 gMapObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/leppa/5.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/0.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/1.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/2.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/3.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/4.4bpp"); -const u32 gMapObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/liechi/5.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/0.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/1.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/2.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/3.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/4.4bpp"); -const u32 gMapObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/hondew/5.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/0.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/1.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/2.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/3.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/4.4bpp"); -const u32 gMapObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aguav/5.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/0.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/1.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/2.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/3.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/4.4bpp"); -const u32 gMapObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/wiki/5.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/0.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/1.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/2.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/3.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/4.4bpp"); -const u32 gMapObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pomeg/5.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/0.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/1.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/2.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/3.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/4.4bpp"); -const u32 gMapObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/rawst/5.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/0.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/1.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/2.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/3.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/4.4bpp"); -const u32 gMapObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/spelon/5.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/0.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/1.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/2.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/3.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/4.4bpp"); -const u32 gMapObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/chesto/5.4bpp"); -const u32 gMapObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/0.4bpp"); -const u32 gMapObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/1.4bpp"); -const u32 gMapObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/2.4bpp"); -const u32 gMapObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/3.4bpp"); -const u32 gMapObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/4.4bpp"); -const u32 gMapObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/oran/5.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/0.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/1.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/2.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/3.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/4.4bpp"); -const u32 gMapObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/persim/5.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/0.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/1.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/2.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/3.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/4.4bpp"); -const u32 gMapObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/sitrus/5.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/0.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/1.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/2.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/3.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/4.4bpp"); -const u32 gMapObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/aspear/5.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/0.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/1.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/2.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/3.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/4.4bpp"); -const u32 gMapObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/pamtre/5.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/0.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/1.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/2.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/3.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/4.4bpp"); -const u32 gMapObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/cornn/5.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/0.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/1.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/2.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/3.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/4.4bpp"); -const u32 gMapObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/lansat/5.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/0.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/1.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/2.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/3.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/4.4bpp"); -const u32 gMapObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/durin/5.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/0.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/1.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/2.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/3.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/4.4bpp"); -const u32 gMapObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/map_objects/pics/berry_trees/tamato/5.4bpp"); -const u32 gFieldEffectPic_SurfBlob_0[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/0.4bpp"); -const u32 gFieldEffectPic_SurfBlob_1[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/1.4bpp"); -const u32 gFieldEffectPic_SurfBlob_2[] = INCBIN_U32("graphics/field_effect_objects/pics/surf_blob/2.4bpp"); -const u32 gMapObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/0.4bpp"); -const u32 gMapObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/1.4bpp"); -const u32 gMapObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/2.4bpp"); -const u32 gMapObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/3.4bpp"); -const u32 gMapObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/4.4bpp"); -const u32 gMapObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/5.4bpp"); -const u32 gMapObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/map_objects/pics/people/quinty_plump/6.4bpp"); -const u16 gMapObjectPalette12[] = INCBIN_U16("graphics/map_objects/palettes/12.gbapal"); -const u16 gMapObjectPalette13[] = INCBIN_U16("graphics/map_objects/palettes/13.gbapal"); - -const u32 gFieldEffectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_small.4bpp"); -const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_medium.4bpp"); -const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp"); -const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp"); -const u32 filler_8368A08[0x48] = {}; -const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effect_objects/pics/cut_grass.4bpp"); -const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp"); -const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal"); -const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp"); -const u32 gFieldEffectPic_Ripple_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/1.4bpp"); -const u32 gFieldEffectPic_Ripple_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/2.4bpp"); -const u32 gFieldEffectPic_Ripple_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/3.4bpp"); -const u32 gFieldEffectPic_Ripple_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/4.4bpp"); -const u32 gFieldEffectPic_Ash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/0.4bpp"); -const u32 gFieldEffectPic_Ash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/1.4bpp"); -const u32 gFieldEffectPic_Ash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/2.4bpp"); -const u32 gFieldEffectPic_Ash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/3.4bpp"); -const u32 gFieldEffectPic_Ash_4[] = INCBIN_U32("graphics/field_effect_objects/pics/ash/4.4bpp"); -const u32 gFieldEffectPic_Arrow_0[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/0.4bpp"); -const u32 gFieldEffectPic_Arrow_1[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/1.4bpp"); -const u32 gFieldEffectPic_Arrow_2[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/2.4bpp"); -const u32 gFieldEffectPic_Arrow_3[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/3.4bpp"); -const u32 gFieldEffectPic_Arrow_4[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/4.4bpp"); -const u32 gFieldEffectPic_Arrow_5[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/5.4bpp"); -const u32 gFieldEffectPic_Arrow_6[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/6.4bpp"); -const u32 gFieldEffectPic_Arrow_7[] = INCBIN_U32("graphics/field_effect_objects/pics/arrow/7.4bpp"); -const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/field_effect_objects/palettes/00.gbapal"); -const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/field_effect_objects/palettes/01.gbapal"); -const u32 gFieldEffectPic_Dust_0[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/0.4bpp"); -const u32 gFieldEffectPic_Dust_1[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/1.4bpp"); -const u32 gFieldEffectPic_Dust_2[] = INCBIN_U32("graphics/field_effect_objects/pics/dust/2.4bpp"); -const u32 unknown_8369588[] = INCBIN_U32("graphics/field_effect_objects/unknown.bin"); -const u32 gFieldEffectPic_JumpTallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/0.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/1.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/2.4bpp"); -const u32 gFieldEffectPic_JumpTallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_tall_grass/3.4bpp"); -const u32 UnusedGrass0[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/0.4bpp"); -const u32 UnusedGrass1[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/1.4bpp"); -const u32 UnusedGrass2[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/2.4bpp"); -const u32 UnusedGrass3[] = INCBIN_U32("graphics/field_effect_objects/pics/unused_grass/3.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/0.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/1.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/2.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/3.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/4.4bpp"); -const u32 UnusedGrassLong[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/unused.4bpp"); -const u32 gFieldEffectPic_JumpLongGrass_5[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_long_grass/5.4bpp"); -const u32 gFieldEffectPic_Unknown17_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/0.4bpp"); -const u32 gFieldEffectPic_Unknown17_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/1.4bpp"); -const u32 gFieldEffectPic_Unknown17_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/2.4bpp"); -const u32 gFieldEffectPic_Unknown17_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/3.4bpp"); -const u32 gFieldEffectPic_Unknown17_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/4.4bpp"); -const u32 gFieldEffectPic_Unknown17_5[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/5.4bpp"); -const u32 gFieldEffectPic_Unknown17_6[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/6.4bpp"); -const u32 gFieldEffectPic_Unknown17_7[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_17/7.4bpp"); -const u32 gFieldEffectPic_Unknown18_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/0.4bpp"); -const u32 gFieldEffectPic_Unknown18_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/1.4bpp"); -const u32 gFieldEffectPic_Unknown18_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/2.4bpp"); -const u32 gFieldEffectPic_Unknown18_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_18/3.4bpp"); -const u32 gFieldEffectPic_LongGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/0.4bpp"); -const u32 gFieldEffectPic_LongGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/1.4bpp"); -const u32 gFieldEffectPic_LongGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/2.4bpp"); -const u32 gFieldEffectPic_LongGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/long_grass/3.4bpp"); -const u32 gFieldEffectPic_TallGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/0.4bpp"); -const u32 gFieldEffectPic_TallGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/1.4bpp"); -const u32 gFieldEffectPic_TallGrass_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/2.4bpp"); -const u32 gFieldEffectPic_TallGrass_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/3.4bpp"); -const u32 gFieldEffectPic_TallGrass_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tall_grass/4.4bpp"); -const u32 gFieldEffectPic_ShortGrass_0[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/0.4bpp"); -const u32 gFieldEffectPic_ShortGrass_1[] = INCBIN_U32("graphics/field_effect_objects/pics/short_grass/1.4bpp"); -const u32 gFieldEffectPic_SandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/0.4bpp"); -const u32 gFieldEffectPic_SandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_footprints/1.4bpp"); -const u32 gFieldEffectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/0.4bpp"); -const u32 gFieldEffectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/field_effect_objects/pics/deep_sand_footprints/1.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/0.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/1.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/2.4bpp"); -const u32 gFieldEffectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bike_tire_tracks/3.4bpp"); -const u32 gFieldEffectPic_Unknown19_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/0.4bpp"); -const u32 gFieldEffectPic_Unknown19_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/1.4bpp"); -const u32 gFieldEffectPic_Unknown19_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/2.4bpp"); -const u32 gFieldEffectPic_Unknown19_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_19/3.4bpp"); -const u32 gFieldEffectPic_SandPile_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/0.4bpp"); -const u32 gFieldEffectPic_SandPile_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/1.4bpp"); -const u32 gFieldEffectPic_SandPile_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_pile/2.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/0.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/1.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/2.4bpp"); -const u32 gFieldEffectPic_JumpBigSplash_3[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_big_splash/3.4bpp"); -const u32 gFieldEffectPic_Splash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/0.4bpp"); -const u32 gFieldEffectPic_Splash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/splash/1.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_0[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/0.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_1[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/1.4bpp"); -const u32 gFieldEffectPic_JumpSmallSplash_2[] = INCBIN_U32("graphics/field_effect_objects/pics/jump_small_splash/2.4bpp"); -const u32 gFieldEffectPic_Unknown20_0[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/0.4bpp"); -const u32 gFieldEffectPic_Unknown20_1[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/1.4bpp"); -const u32 gFieldEffectPic_Unknown20_2[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/2.4bpp"); -const u32 gFieldEffectPic_Unknown20_3[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/3.4bpp"); -const u32 gFieldEffectPic_Unknown20_4[] = INCBIN_U32("graphics/field_effect_objects/pics/unknown_20/4.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/0.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/1.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/2.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/3.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/4.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/5.4bpp"); -const u32 gFieldEffectPic_TreeDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/tree_disguise/6.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/0.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/1.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/2.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/3.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/4.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/5.4bpp"); -const u32 gFieldEffectPic_MountainDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/mountain_disguise/6.4bpp"); -const u32 gFieldEffectPic_SandDisguise_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/0.4bpp"); -const u32 gFieldEffectPic_SandDisguise_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/1.4bpp"); -const u32 gFieldEffectPic_SandDisguise_2[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/2.4bpp"); -const u32 gFieldEffectPic_SandDisguise_3[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/3.4bpp"); -const u32 gFieldEffectPic_SandDisguise_4[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/4.4bpp"); -const u32 gFieldEffectPic_SandDisguise_5[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/5.4bpp"); -const u32 gFieldEffectPic_SandDisguise_6[] = INCBIN_U32("graphics/field_effect_objects/pics/sand_disguise/6.4bpp"); -const u32 gFieldEffectPic_HotSpringsWater[] = INCBIN_U32("graphics/field_effect_objects/pics/hot_springs_water.4bpp"); -const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/field_effect_objects/palettes/02.gbapal"); -const u32 gFieldEffectPic_PopOutOfAsh_0[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/0.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_1[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/1.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_2[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/2.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_3[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/3.4bpp"); -const u32 gFieldEffectPic_PopOutOfAsh_4[] = INCBIN_U32("graphics/field_effect_objects/pics/pop_out_of_ash/4.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_0[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/0.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_1[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/1.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_2[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/2.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_3[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/3.4bpp"); -const u32 gFieldEffectPic_LavaridgeGymWarp_4[] = INCBIN_U32("graphics/field_effect_objects/pics/lavaridge_gym_warp/4.4bpp"); -const u32 gFieldEffectPic_Bubbles_0[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/0.4bpp"); -const u32 gFieldEffectPic_Bubbles_1[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/1.4bpp"); -const u32 gFieldEffectPic_Bubbles_2[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/2.4bpp"); -const u32 gFieldEffectPic_Bubbles_3[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/3.4bpp"); -const u32 gFieldEffectPic_Bubbles_4[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/4.4bpp"); -const u32 gFieldEffectPic_Bubbles_5[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/5.4bpp"); -const u32 gFieldEffectPic_Bubbles_6[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/6.4bpp"); -const u32 gFieldEffectPic_Bubbles_7[] = INCBIN_U32("graphics/field_effect_objects/pics/bubbles/7.4bpp"); -const u32 gFieldEffectPic_Sparkle_0[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/0.4bpp"); -const u32 gFieldEffectPic_Sparkle_1[] = INCBIN_U32("graphics/field_effect_objects/pics/sparkle/1.4bpp"); -const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/field_effect_objects/palettes/03.gbapal"); -const u32 gFieldEffectPic_Bird[] = INCBIN_U32("graphics/field_effect_objects/pics/bird.4bpp"); - -void (*const gUnknown_0836DA88[])(struct Sprite *) = -{ - sub_805C884, - sub_805CDE8, - sub_805C8AC, - sub_805CF28, - sub_805CF28, - sub_805D0AC, - sub_805D0AC, - sub_805D230, - sub_805D230, - sub_805D230, - sub_805D230, - sub_80587B4, - FieldObjectCB_BerryTree, - sub_805D4F4, - sub_805D634, - sub_805D774, - sub_805D8B4, - sub_805D9F4, - sub_805DB34, - sub_805DC74, - sub_805DDB4, - sub_805DEF4, - sub_805E034, - sub_805E174, - sub_805E278, - sub_805E37C, - sub_805E37C, - sub_805E37C, - sub_805E37C, - sub_805E5DC, - sub_805E668, - sub_805E6F4, - sub_805E780, - sub_805E80C, - sub_805E898, - sub_805E924, - sub_805E9B0, - sub_805EA3C, - sub_805EAC8, - sub_805EB54, - sub_805EBE0, - sub_805EC6C, - sub_805ECF8, - sub_805ED84, - sub_805EE10, - sub_805EE9C, - sub_805EF28, - sub_805EFB4, - sub_805F040, - sub_805F0CC, - sub_805F158, - sub_805F1E4, - sub_805F270, - sub_805F2FC, - sub_805F2FC, - sub_805F2FC, - sub_805F2FC, - FieldObjectCB_TreeDisguise, - FieldObjectCB_MountainDisguise, - sub_805F8E0, - sub_805F8E0, - sub_805F8E0, - sub_805F8E0, - FieldObjectCB_Hidden1, - sub_805FB20, - sub_805FB20, - sub_805FB20, - sub_805FB20, - sub_805FB90, - sub_805FB90, - sub_805FB90, - sub_805FB90, - sub_805FC00, - sub_805FC00, - sub_805FC00, - sub_805FC00, - sub_805FC70 -}; - -const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; - -#include "../data/field_map_obj/map_object_graphics_info_pointers.h" -#include "../data/field_map_obj/field_effect_object_template_pointers.h" -#include "../data/field_map_obj/map_object_pic_tables.h" -#include "../data/field_map_obj/map_object_anims.h" -#include "../data/field_map_obj/base_oam.h" -#include "../data/field_map_obj/map_object_subsprites.h" -#include "../data/field_map_obj/map_object_graphics_info.h" - -const struct SpritePalette gUnknown_0837377C[] = { - {gMapObjectPalette0, 0x1103}, - {gMapObjectPalette1, 0x1104}, - {gMapObjectPalette2, 0x1105}, - {gMapObjectPalette3, 0x1106}, - {gMapObjectPalette4, 0x1107}, - {gMapObjectPalette5, 0x1108}, - {gMapObjectPalette6, 0x1109}, - {gMapObjectPalette7, 0x110A}, - {gMapObjectPalette8, 0x1100}, - {gMapObjectPalette9, 0x1101}, - {gMapObjectPalette10, 0x1102}, - {gMapObjectPalette11, 0x1115}, - {gMapObjectPalette12, 0x110B}, - {gMapObjectPalette13, 0x110C}, - {gMapObjectPalette14, 0x110D}, - {gMapObjectPalette15, 0x110E}, - {gMapObjectPalette16, 0x110F}, - {gMapObjectPalette17, 0x1110}, - {gMapObjectPalette18, 0x1111}, - {gMapObjectPalette19, 0x1112}, - {gMapObjectPalette20, 0x1113}, - {gMapObjectPalette21, 0x1114}, - {gMapObjectPalette22, 0x1116}, - {gMapObjectPalette23, 0x1117}, - {gMapObjectPalette24, 0x1118}, - {gMapObjectPalette25, 0x1119}, - {gMapObjectPalette26, 0x111A}, - {NULL, 0x0000} -}; - -const u16 Palettes_837385C[] = { - 0x1101, - 0x1101, - 0x1101, - 0x1101 -}; - -const u16 Palettes_8373864[] = { - 0x1111, - 0x1111, - 0x1111, - 0x1111 -}; - -const u16 Palettes_837386C[] = { - 0x1115, - 0x1115, - 0x1115, - 0x1115 -}; - -const struct PairedPalettes gUnknown_08373874[] = { - {0x1100, Palettes_837385C}, - {0x1110, Palettes_837385C}, - {0x1115, Palettes_837386C}, - {0x11FF, NULL} -}; - -const u16 Palettes_8373894[] = { - 0x110C, - 0x110C, - 0x110C, - 0x110C -}; - -const u16 Palettes_837389C[] = { - 0x110D, - 0x110D, - 0x110D, - 0x110D -}; - -const u16 Palettes_83738A4[] = { - 0x110E, - 0x110E, - 0x110E, - 0x110E -}; - -const u16 Palettes_83738AC[] = { - 0x1112, - 0x1112, - 0x1112, - 0x1112 -}; - -const u16 Palettes_83738B4[] = { - 0x1113, - 0x1113, - 0x1113, - 0x1113 -}; - -const u16 Palettes_83738BC[] = { - 0x1114, - 0x1114, - 0x1114, - 0x1114 -}; - -const u16 Palettes_83738C4[] = { - 0x111A, - 0x111A, - 0x111A, - 0x111A -}; - -const u16 Palettes_83738CC[] = { - 0x1117, - 0x1117, - 0x1117, - 0x1117 -}; - -const u16 Palettes_83738D4[] = { - 0x1119, - 0x1119, - 0x1119, - 0x1119 -}; - -const u16 Palettes_83738DC[] = { - 0x1109, - 0x1109, - 0x1109, - 0x1109 -}; - -const struct PairedPalettes gUnknown_083738E4[] = { - {0x1100, Palettes_837385C}, - {0x1110, Palettes_837385C}, - {0x110B, Palettes_8373894}, - {0x110D, Palettes_837389C}, - {0x110E, Palettes_83738A4}, - {0x1112, Palettes_83738AC}, - {0x1113, Palettes_83738B4}, - {0x1114, Palettes_83738BC}, - {0x1116, Palettes_83738CC}, - {0x1118, Palettes_83738D4}, - {0x1105, Palettes_83738DC}, - {0x111A, Palettes_83738C4}, - {0x11FF, NULL} -}; - -const u16 Unknown_837394C[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373960[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373974[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 Unknown_8373988[] = { - 0x1100, - 0x1101, - 0x1103, - 0x1104, - 0x1105, - 0x1106, - 0x1107, - 0x1108, - 0x1109, - 0x110A -}; - -const u16 *const gUnknown_0837399C[] = { - Unknown_837394C, - Unknown_8373960, - Unknown_8373974, - Unknown_8373988 -}; - -#include "../data/field_map_obj/berry_tree_graphics_tables.h" -#include "../data/field_map_obj/field_effect_objects.h" - -const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; -const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; -const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; - -#include "../data/field_map_obj/callback_subroutine_pointers.h" - -const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; -const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; -const u8 gUnknown_08375606[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; -const u8 gUnknown_0837560F[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F, 0x0C, 0x0C, 0x0D, 0x0D}; -const u8 gUnknown_08375618[] = {0x10, 0x10, 0x11, 0x12, 0x13, 0x10, 0x10, 0x11, 0x11}; -const u8 gUnknown_08375621[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_0837562A[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_08375633[] = {0x18, 0x18, 0x19, 0x1A, 0x1B, 0x18, 0x18, 0x19, 0x19}; -const u8 gUnknown_0837563C[] = {0x1C, 0x1C, 0x1D, 0x1E, 0x1F, 0x1C, 0x1C, 0x1D, 0x1D}; -const u8 gUnknown_08375645[] = {0x20, 0x20, 0x21, 0x22, 0x23, 0x20, 0x20, 0x21, 0x21}; -const u8 gUnknown_0837564E[] = {0x24, 0x24, 0x25, 0x26, 0x27, 0x24, 0x24, 0x25, 0x25}; -const u8 gUnknown_08375657[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; -const u8 gUnknown_08375660[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; -const u8 gUnknown_08375669[] = {0x08, 0x08, 0x09, 0x0A, 0x0B, 0x08, 0x08, 0x09, 0x09}; -const u8 gUnknown_08375672[] = {0x14, 0x14, 0x15, 0x16, 0x17, 0x14, 0x14, 0x15, 0x15}; -const u8 gUnknown_0837567B[] = {0x08, 0x08, 0x07, 0x09, 0x0A, 0x08, 0x08, 0x07, 0x07}; - -bool8 (*const gUnknown_08375684[])(u8) = { - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsWestBlocked, - MetatileBehavior_IsEastBlocked -}; - -bool8 (*const gUnknown_08375694[])(u8) = { - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsEastBlocked, - MetatileBehavior_IsWestBlocked -}; - -const struct Coords16 gDirectionToVector[] = { - { 0, 0}, - { 0, 1}, - { 0, -1}, - {-1, 0}, - { 1, 0}, - {-1, 1}, - { 1, 1}, - {-1, -1}, - { 1, -1} -}; - -const u8 gUnknown_083756C8[] = {0x00, 0x00, 0x01, 0x02, 0x03}; -const u8 gUnknown_083756CD[] = {0x04, 0x04, 0x05, 0x06, 0x07}; -const u8 gUnknown_083756D2[] = {0x08, 0x08, 0x09, 0x0A, 0x0B}; -const u8 gUnknown_083756D7[] = {0x15, 0x15, 0x16, 0x17, 0x18}; -const u8 gUnknown_083756DC[] = {0x29, 0x29, 0x2A, 0x2B, 0x2C}; -const u8 gUnknown_083756E1[] = {0x2D, 0x2D, 0x2E, 0x2F, 0x30}; -const u8 gUnknown_083756E6[] = {0x31, 0x31, 0x32, 0x33, 0x34}; -const u8 gUnknown_083756EB[] = {0x35, 0x35, 0x36, 0x37, 0x38}; -const u8 gUnknown_083756F0[] = {0x0C, 0x0C, 0x0D, 0x0E, 0x0F}; -const u8 gUnknown_083756F5[] = {0x46, 0x46, 0x47, 0x48, 0x49}; -const u8 gUnknown_083756FA[] = {0x4B, 0x4B, 0x4A, 0x4D, 0x4C}; -const u8 gUnknown_083756FF[] = {0x42, 0x42, 0x43, 0x44, 0x45}; -const u8 gUnknown_08375704[] = {0x3A, 0x3A, 0x3B, 0x3C, 0x3D}; -const u8 gUnknown_08375709[] = {0x19, 0x19, 0x1A, 0x1B, 0x1C}; -const u8 gUnknown_0837570E[] = {0x1D, 0x1D, 0x1E, 0x1F, 0x20}; -const u8 gUnknown_08375713[] = {0x21, 0x21, 0x22, 0x23, 0x24}; -const u8 gUnknown_08375718[] = {0x25, 0x25, 0x26, 0x27, 0x28}; -const u8 gUnknown_0837571D[] = {0x62, 0x62, 0x63, 0x64, 0x65}; -const u8 gUnknown_08375722[] = {0x66, 0x66, 0x67, 0x68, 0x69}; -const u8 gUnknown_08375727[] = {0x6A, 0x6A, 0x6B, 0x6C, 0x6D}; -const u8 gUnknown_0837572C[] = {0x6E, 0x6E, 0x6F, 0x70, 0x71}; -const u8 gUnknown_08375731[] = {0x72, 0x72, 0x73, 0x74, 0x75}; -const u8 gUnknown_08375736[] = {0x76, 0x76, 0x77, 0x78, 0x79}; -const u8 gUnknown_0837573B[] = {0x7A, 0x7A, 0x7B, 0x7C, 0x7D}; -const u8 gUnknown_08375740[] = {0x7E, 0x7E, 0x7F, 0x80, 0x81}; -const u8 gUnknown_08375745[] = {0x82, 0x82, 0x83, 0x84, 0x85}; -const u8 gUnknown_0837574A[] = {0x86, 0x86, 0x87, 0x88, 0x89}; - -const u8 gUnknown_0837574F[] = {2, 1, 4, 3, 8, 7, 6, 5}; - -const u8 gUnknown_08375757[][4] = { - {2, 1, 4, 3}, - {1, 2, 3, 4}, - {3, 4, 2, 1}, - {4, 3, 1, 2} -}; - -const u8 gUnknown_08375767[][4] = { - {2, 1, 4, 3}, - {1, 2, 3, 4}, - {4, 3, 1, 2}, - {3, 4, 2, 1} -}; - -#include "../data/field_map_obj/anim_func_ptrs.h" - -// text - -extern void strange_npc_table_clear(void); -extern void ClearPlayerAvatarInfo(void); -extern void npc_load_two_palettes__no_record(u16, u8); -extern void npc_load_two_palettes__and_record(u16, u8); -extern void sub_8060388(s16, s16, s16 *, s16 *); -void sub_80634D0(struct MapObject *, struct Sprite *); -extern void pal_patch_for_npc(u16, u16); -extern void CameraObjectReset1(void); - -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; -extern u8 gReservedSpritePaletteCount; -extern struct Camera gCamera; - -static u8 gUnknown_030005A4; -static u16 gUnknown_030005A6; - -struct MapObject gMapObjects[16]; -#if DEBUG -u8 gUnknown_Debug_03004BC0; -#endif - -void npc_clear_ids_and_state(struct MapObject *mapObj) -{ - memset(mapObj, 0, sizeof(struct MapObject)); - mapObj->localId = 0xFF; - mapObj->mapNum = 0xFF; - mapObj->mapGroup = 0xFF; - mapObj->mapobj_unk_1C = 0xFF; -} - -void npcs_clear_ids_and_state(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - npc_clear_ids_and_state(&gMapObjects[i]); -#if DEBUG - gUnknown_Debug_03004BC0 = 0; -#endif -} - -void sub_805AA98(void) -{ - strange_npc_table_clear(); - npcs_clear_ids_and_state(); - ClearPlayerAvatarInfo(); - sub_805AAB0(); -} - -void sub_805AAB0(void) -{ - u8 spriteId; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); - - gSprites[spriteId].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 0); - gSprites[spriteId].invisible = 1; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F); - - gSprites[spriteId].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 1); - gSprites[spriteId].invisible = 1; -} - -u8 sub_805AB54(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (!gMapObjects[i].active) - break; - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - if (localId < 255) - return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup); - else - return GetFieldObjectIdByLocalId(localId); -} - -bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId) -{ - *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup); - if (*mapObjectId == 16) - return TRUE; - else - return FALSE; -} - -u8 GetFieldObjectIdByXY(s16 x, s16 y) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) - break; - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) - return i; - } - return 16; -} - -u8 GetFieldObjectIdByLocalId(u8 localId) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId) - return i; - } - return 16; -} - -// The bitfield at 0x18 needs to be u16 for this function to match -struct MapObjectAlt -{ - /*0x00*/ u32 active:1; - u32 mapobj_bit_1:1; - u32 mapobj_bit_2:1; - u32 mapobj_bit_3:1; - u32 mapobj_bit_4:1; - u32 mapobj_bit_5:1; - u32 mapobj_bit_6:1; - u32 mapobj_bit_7:1; - /*0x01*/ u32 mapobj_bit_8:1; - u32 mapobj_bit_9:1; - u32 mapobj_bit_10:1; - u32 mapobj_bit_11:1; - u32 mapobj_bit_12:1; - u32 mapobj_bit_13:1; - u32 mapobj_bit_14:1; - u32 mapobj_bit_15:1; - /*0x02*/ u32 mapobj_bit_16:1; - u32 mapobj_bit_17:1; - u32 mapobj_bit_18:1; - u32 mapobj_bit_19:1; - u32 mapobj_bit_20:1; - u32 mapobj_bit_21:1; - u32 mapobj_bit_22:1; - u32 mapobj_bit_23:1; - /*0x03*/ u32 mapobj_bit_24:1; - u32 mapobj_bit_25:1; - u32 mapobj_bit_26:1; - u32 mapobj_bit_27:1; - u32 mapobj_bit_28:1; - u32 mapobj_bit_29:1; - u32 mapobj_bit_30:1; - u32 mapobj_bit_31:1; - /*0x04*/ u8 spriteId; - /*0x05*/ u8 graphicsId; - /*0x06*/ u8 animPattern; - /*0x07*/ u8 trainerType; - /*0x08*/ u8 localId; - /*0x09*/ u8 mapNum; - /*0x0A*/ u8 mapGroup; - /*0x0B*/ u8 mapobj_unk_0B_0:4; - u8 elevation:4; - /*0x0C*/ struct Coords16 coords1; - /*0x10*/ struct Coords16 coords2; - /*0x14*/ struct Coords16 coords3; - /*0x18*/ u16 mapobj_unk_18:4; //current direction? - /*0x18*/ u16 placeholder18:4; - /*0x19*/ u16 rangeX:4; - /*0x19*/ u16 rangeY:4; - /*0x1A*/ u8 mapobj_unk_1A; - /*0x1B*/ u8 mapobj_unk_1B; - /*0x1C*/ u8 mapobj_unk_1C; - /*0x1D*/ u8 trainerRange_berryTreeId; - /*0x1E*/ u8 mapobj_unk_1E; - /*0x1F*/ u8 mapobj_unk_1F; - /*0x20*/ u8 mapobj_unk_20; - /*0x21*/ u8 mapobj_unk_21; - /*0x22*/ u8 animId; - /*size = 0x24*/ -}; - -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - struct MapObjectAlt *mapObj; //TODO: resolve the mapobj_unk_19b weirdness - u8 var; - s16 r3; - s16 r2; - - if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) - return 16; - mapObj = (void *)&gMapObjects[var]; - npc_clear_ids_and_state((struct MapObject *)mapObj); - r3 = template->x + 7; - r2 = template->y + 7; - mapObj->active = TRUE; - mapObj->mapobj_bit_2 = TRUE; - mapObj->graphicsId = template->graphicsId; - mapObj->animPattern = template->movementType; - mapObj->localId = template->localId; - mapObj->mapNum = b; - asm("":::"r6"); - mapObj->mapGroup = c; - mapObj->coords1.x = r3; - mapObj->coords1.y = r2; - mapObj->coords2.x = r3; - mapObj->coords2.y = r2; - mapObj->coords3.x = r3; - mapObj->coords3.y = r2; - mapObj->mapobj_unk_0B_0 = template->elevation; - mapObj->elevation = template->elevation; - mapObj->rangeX = template->unkA_0; - mapObj->rangeY = template->unkA_4; - mapObj->trainerType = template->unkC; - mapObj->trainerRange_berryTreeId = template->unkE; - mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; - FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); - asm("":::"r5","r6"); - FieldObjectHandleDynamicGraphicsId((struct MapObject *)mapObj); - if (gUnknown_0836DBBC[mapObj->animPattern] != 0) - { - if (mapObj->rangeX == 0) - mapObj->rangeX++; - if (mapObj->rangeY == 0) - mapObj->rangeY++; - } -#if DEBUG - gUnknown_Debug_03004BC0++; -#endif - return var; -} - -u8 sub_805ADDC(u8 localId) -{ - u8 objectCount; - u8 i; - - if (gMapHeader.events == NULL) - return 16; - objectCount = gMapHeader.events->mapObjectCount; - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; - - if (template->localId == localId && !FlagGet(template->flagId)) - return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - } - return 16; -} - -u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) -{ - u8 i = 0; - - for (i = 0; i < 16 && gMapObjects[i].active; i++) - { - if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) - return 1; - } - if (i >= 16) - return 1; - *d = i; - for (; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c) - return 1; - } - return 0; -} - -void RemoveFieldObject(struct MapObject *mapObject) -{ - mapObject->active = FALSE; - RemoveFieldObjectInternal(mapObject); -#if DEBUG - gUnknown_Debug_03004BC0--; -#endif -} - -void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return; - FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId)); - RemoveFieldObject(&gMapObjects[mapObjectId]); -} - -void RemoveFieldObjectInternal(struct MapObject *mapObject) -{ - struct SpriteFrameImage image; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - - image.size = gfxInfo->size; - gSprites[mapObject->spriteId].images = ℑ - DestroySprite(&gSprites[mapObject->spriteId]); -} - -void npc_hide_all_but_player(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (i != gPlayerAvatar.mapObjectId) - RemoveFieldObject(&gMapObjects[i]); - } -} - -u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) -{ - u8 mapObjectId; - u8 spriteId; - const struct MapObjectGraphicsInfo *gfxInfo; - struct MapObject *mapObject; - struct Sprite *sprite; - - mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d); - if (mapObjectId == 16) - return 16; - - mapObject = &gMapObjects[mapObjectId]; - gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (gfxInfo->paletteSlot == 0) - npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - else if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (mapObject->animPattern == 0x4C) - mapObject->mapobj_bit_13 = TRUE; - -#ifdef NONMATCHING - sprTemplate->paletteTag = 0xFFFF; -#else - *(u16 *)&sprTemplate->paletteTag = 0xFFFF; -#endif - spriteId = CreateSprite(sprTemplate, 0, 0, 0); - if (spriteId == 64) - { -#if DEBUG - gUnknown_Debug_03004BC0--; -#endif - gMapObjects[mapObjectId].active = FALSE; - return 16; - } - sprite = &gSprites[spriteId]; - sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = mapObjectId; - mapObject->spriteId = spriteId; - mapObject->mapobj_bit_12 = gfxInfo->inanimate; - if (!mapObject->mapobj_bit_12) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - sub_80634D0(mapObject, sprite); - return mapObjectId; -} - -u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) -{ - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables = NULL; - struct SpriteFrameImage spriteFrameImage; - const struct MapObjectGraphicsInfo *gfxInfo; - u8 mapObjectId; - - gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId); - MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = gfxInfo->size; - spriteTemplate.images = &spriteFrameImage; - mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e); - if (mapObjectId == 16) - return 16; - gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images; - if (subspriteTables != NULL) - SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); - return mapObjectId; -} - -u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate) -{ - s16 x; - s16 y; - - GetFieldObjectMovingCameraOffset(&x, &y); - return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); -} - -u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f) -{ - struct MapObjectTemplate mapObjTemplate; - - d -= 7; - e -= 7; - mapObjTemplate.localId = c; - mapObjTemplate.graphicsId = a; - mapObjTemplate.unk2 = 0; - mapObjTemplate.x = d; - mapObjTemplate.y = e; - mapObjTemplate.elevation = f; - mapObjTemplate.movementType = b; - mapObjTemplate.unkA_0 = 0; - mapObjTemplate.unkA_4 = 0; - mapObjTemplate.unkC = 0; - mapObjTemplate.unkE = 0; - return SpawnSpecialFieldObject(&mapObjTemplate); -} - -u8 show_sprite(u8 a, u8 b, u8 c) -{ - struct MapObjectTemplate *r5; - s16 x; - s16 y; - - r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c); - if (r5 == NULL) - return 16; - GetFieldObjectMovingCameraOffset(&x, &y); - return SpawnFieldObject(r5, b, c, x, y); -} - -void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - - sprTemplate->tileTag = gfxInfo->tileTag; - sprTemplate->paletteTag = gfxInfo->paletteTag1; - sprTemplate->oam = gfxInfo->oam; - sprTemplate->anims = gfxInfo->anims; - sprTemplate->images = gfxInfo->images; - sprTemplate->affineAnims = gfxInfo->affineAnims; - sprTemplate->callback = callback; - *subspriteTables = gfxInfo->subspriteTables; -} - -void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables); -} - -void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); -} - -u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); - if (spriteTemplate.paletteTag != 0xFFFF) - sub_805BDF8(spriteTemplate.paletteTag); - spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); - if (spriteId != 64 && subspriteTables != NULL) - { - SetSubspriteTables(&gSprites[spriteId], subspriteTables); - gSprites[spriteId].subspriteMode = 2; - } - return spriteId; -} - -extern void sub_8064970(struct Sprite *); -extern void sub_8060470(s16 *, s16 *, s16, s16); -void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z); - -u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) -{ - const struct MapObjectGraphicsInfo *gfxInfo; - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - - gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8064970, &spriteTemplate, &subspriteTables); -#ifdef NONMATCHING - spriteTemplate.paletteTag = 0xFFFF; -#else - *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; -#endif - x += 7; - y += 7; - sub_8060470(&x, &y, 8, 16); - spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); - if (spriteId != 64) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.y += sprite->centerToCornerVecY; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = b; - sprite->data[1] = elevation; - if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (subspriteTables != NULL) - { - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = 2; - } - InitObjectPriorityByZCoord(sprite, elevation); - SetObjectSubpriorityByZCoord(elevation, sprite, 1); - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); - } - return spriteId; -} - -void sub_805B55C(s16 a, s16 b) -{ - u8 i; - - if (gMapHeader.events != NULL) - { - s16 r9 = gSaveBlock1.pos.x - 2; - s16 sp8 = gSaveBlock1.pos.x + 17; - s16 r10 = gSaveBlock1.pos.y; - s16 spC = gSaveBlock1.pos.y + 16; - u8 objectCount = gMapHeader.events->mapObjectCount; - - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i]; - s16 foo = template->x + 7; - s16 bar = template->y + 7; - - if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo - && !FlagGet(template->flagId)) - SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b); - } - } -} - -void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject); - -void RemoveFieldObjectsOutsideView(void) -{ - u8 i; - u8 j; - - for (i = 0; i < 16; i++) - { - bool8 isActiveLinkPlayer; - - for (j = 0, isActiveLinkPlayer = 0; j < 4; j++) - { - if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) - isActiveLinkPlayer = TRUE; - } - if (!isActiveLinkPlayer) - { - struct MapObject *mapObject = &gMapObjects[i]; - - if (mapObject->active && !mapObject->mapobj_bit_16) - RemoveFieldObjectIfOutsideView(mapObject); - } - } -} - -void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) -{ - s16 r7 = gSaveBlock1.pos.x - 2; - s16 r5 = gSaveBlock1.pos.x + 17; - s16 r4 = gSaveBlock1.pos.y; - s16 r6 = gSaveBlock1.pos.y + 16; - - if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5 - && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6) - return; - if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5 - && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6) - return; - RemoveFieldObject(mapObject); -} - -void sub_805B75C(u8, s16, s16); - -void sub_805B710(u16 a, u16 b) -{ - u8 i; - -#if DEBUG - gUnknown_Debug_03004BC0 = 0; -#endif - ClearPlayerAvatarInfo(); - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active) - { - sub_805B75C(i, a, b); -#if DEBUG - gUnknown_Debug_03004BC0++; -#endif - } - } - sub_805AAB0(); -} - -extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); -extern void sub_805B914(struct MapObject *); - -void sub_805B75C(u8 a, s16 b, s16 c) -{ - struct SpriteTemplate sp0; - struct SpriteFrameImage sp18; - const struct SubspriteTable *subspriteTables; - const struct MapObjectGraphicsInfo *gfxInfo; - struct MapObject *mapObject; - u8 spriteId; - - #define i spriteId - for (i = 0; i < 4; i++) - { - if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId) - return; - } - #undef i - - mapObject = &gMapObjects[a]; - asm("":::"r5"); - subspriteTables = NULL; - gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - sp18.size = gfxInfo->size; - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables); - sp0.images = &sp18; - *(u16 *)&sp0.paletteTag = 0xFFFF; - if (gfxInfo->paletteSlot == 0) - npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (gfxInfo->paletteSlot > 9) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - *(u16 *)&sp0.paletteTag = 0xFFFF; - spriteId = CreateSprite(&sp0, 0, 0, 0); - if (spriteId != 64) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sprite->images = gfxInfo->images; - if (mapObject->animPattern == 11) - { - SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId); - mapObject->mapobj_unk_1B = sub_8126B54(); - } - if (subspriteTables != NULL) - SetSubspriteTables(sprite, subspriteTables); - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = a; - mapObject->spriteId = spriteId; - if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - sub_805B914(mapObject); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - } -} - -void sub_805B914(struct MapObject *mapObject) -{ - mapObject->mapobj_bit_1 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - mapObject->mapobj_bit_22 = FALSE; - mapObject->mapobj_bit_17 = FALSE; - mapObject->mapobj_bit_18 = FALSE; - mapObject->mapobj_bit_19 = FALSE; - mapObject->mapobj_bit_20 = FALSE; - mapObject->mapobj_bit_21 = FALSE; - FieldObjectClearAnim(mapObject); -} - -void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) -{ - gPlayerAvatar.mapObjectId = mapObjectId; - gPlayerAvatar.spriteId = spriteId; - gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); - SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); -} - -void sub_805B980(struct MapObject *mapObject, u8 graphicsId) -{ - const struct MapObjectGraphicsInfo *gfxInfo; - struct Sprite *sprite; - - gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - sprite = &gSprites[mapObject->spriteId]; - if (gfxInfo->paletteSlot == 0) - pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - if (gfxInfo->paletteSlot == 10) - npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); - sprite->oam.shape = gfxInfo->oam->shape; - sprite->oam.size = gfxInfo->oam->size; - sprite->images = gfxInfo->images; - sprite->anims = gfxInfo->anims; - sprite->subspriteTables = gfxInfo->subspriteTables; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - mapObject->mapobj_bit_12 = gfxInfo->inanimate; - mapObject->graphicsId = graphicsId; - sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - if (mapObject->mapobj_bit_15) - CameraObjectReset1(); -} - -void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - sub_805B980(&gMapObjects[mapObjectId], graphicsId); -} - -void FieldObjectTurn(struct MapObject *mapObject, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - if (!mapObject->mapobj_bit_12) - { - StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); - } -} - -void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - FieldObjectTurn(&gMapObjects[mapObjectId], direction); -} - -void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction) -{ - FieldObjectTurn(&gMapObjects[player->mapObjectId], direction); -} - -void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 treeStage; - u8 treeId; - - mapObject->mapobj_bit_13 = TRUE; - sprite->invisible = TRUE; - treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (treeStage != 0) - { - mapObject->mapobj_bit_13 = FALSE; - sprite->invisible = FALSE; - treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; - treeStage--; - if (treeId > 0x2B) - treeId = 0; - sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]); - sprite->images = gBerryTreePicTablePointers[treeId]; - sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage]; - StartSpriteAnim(sprite, treeStage); - } -} - -const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) -{ - if (graphicsId > 0xEF) - graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16); - if (graphicsId > 0xD9) - graphicsId = 5; - return gMapObjectGraphicsInfoPointers[graphicsId]; -} - -void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) -{ - if (mapObject->graphicsId > 0xEF) - mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16); -} - -void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - gMapObjects[mapObjectId].mapobj_bit_13 = d; -} - -void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) -{ - *(u8 *)localId = mapObject->localId; - *(u8 *)mapNum = mapObject->mapNum; - *(u8 *)mapGroup = mapObject->mapGroup; -} - -void sub_805BCC0(s16 x, s16 y) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - mapObjectId = GetFieldObjectIdByXY(x, y); - if (mapObjectId != 16) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) -{ - u8 mapObjectId; - struct MapObject *mapObject; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - mapObject->mapobj_bit_26 = TRUE; - sprite->subpriority = subpriority; - } -} - -void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_26 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; - sprite->pos2.x = x; - sprite->pos2.y = y; - } -} - -void gpu_pal_allocator_reset__manage_upper_four(void) -{ - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 12; -} - -void sub_805BDF8(u16 tag) -{ - u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag); - - if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8 - sub_805BE58(&gUnknown_0837377C[paletteIndex]); -} - -void unref_sub_805BE24(u16 *arr) -{ - u8 i; - - for (i = 0; arr[i] != 0x11FF; i++) - sub_805BDF8(arr[i]); -} - -u8 sub_805BE58(const struct SpritePalette *palette) -{ - if (IndexOfSpritePaletteTag(palette->tag) != 0xFF) - return 0xFF; - else - return LoadSpritePalette(palette); -} - -void pal_patch_for_npc(u16 a, u16 b) -{ - u8 var = b; - u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a); - - LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20); -} - -void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c) -{ - for (; b < c; arr++, b++) - pal_patch_for_npc(*arr, b); -} - -u8 FindFieldObjectPaletteIndexByTag(u16 tag) -{ - u8 i; - - for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++) - { - if (gUnknown_0837377C[i].tag == tag) - return i; - } - return 0xFF; -} - -void npc_load_two_palettes__no_record(u16 a, u8 b) -{ - u8 i; - - pal_patch_for_npc(a, b); - for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++) - { - if (gUnknown_08373874[i].tag == a) - { - pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); - break; - } - } -} - -void npc_load_two_palettes__and_record(u16 a, u8 b) -{ - u8 i; - - gUnknown_030005A6 = a; - pal_patch_for_npc(a, b); - for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) - { - if (gUnknown_083738E4[i].tag == a) - { - pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]); - break; - } - } -} - -void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x += x; - mapObject->coords2.y += y; -} - -void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = x; - mapObject->coords3.y = y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void sub_805C058(struct MapObject *mapObject, s16 x, s16 y) -{ - struct Sprite *sprite = &gSprites[mapObject->spriteId]; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - - npc_coords_set(mapObject, x, y); - sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y); - sprite->centerToCornerVecX = -(gfxInfo->width >> 1); - sprite->centerToCornerVecY = -(gfxInfo->height >> 1); - sprite->pos1.x += 8; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sub_805B914(mapObject); - if (mapObject->mapobj_bit_15) - CameraObjectReset1(); -} - -void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - x += 7; - y += 7; - sub_805C058(&gMapObjects[mapObjectId], x, y); - } -} - -void npc_coords_shift_still(struct MapObject *mapObject) -{ - npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); -} - -void UpdateFieldObjectCoordsForCameraUpdate(void) -{ - u8 i; - s16 deltaX; - s16 deltaY; - - if (gCamera.field_0) - { - deltaX = gCamera.x; - deltaY = gCamera.y; - for (i = 0; i < 16; i++) - { - - if (gMapObjects[i].active) - { - gMapObjects[i].coords1.x -= deltaX; - gMapObjects[i].coords1.y -= deltaY; - gMapObjects[i].coords2.x -= deltaX; - gMapObjects[i].coords2.y -= deltaY; - gMapObjects[i].coords3.x -= deltaX; - gMapObjects[i].coords3.y -= deltaY; - } - } - } -} - -bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); - -u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y - && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) - return i; - } - return 16; -} - -bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) -{ - if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 - && mapObject->mapobj_unk_0B_0 != z) - return FALSE; - else - return TRUE; -} - -void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) -{ - UpdateFieldObjectCoordsForCameraUpdate(); - sub_805B55C(x, y); - RemoveFieldObjectsOutsideView(); -} - -u8 AddCameraObject(u8 a) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4); - - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[0] = a; - return spriteId; -} - -void ObjectCB_CameraObject(struct Sprite *sprite) -{ - void (*cameraObjectFuncs[3])(struct Sprite *); - memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs); - cameraObjectFuncs[sprite->data[1]](sprite); -} - -void CameraObject_0(struct Sprite *sprite) -{ - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; - sprite->invisible = TRUE; - sprite->data[1] = 1; - CameraObject_1(sprite); -} - -void CameraObject_1(struct Sprite *sprite) -{ - s16 x = gSprites[sprite->data[0]].pos1.x; - s16 y = gSprites[sprite->data[0]].pos1.y; - - sprite->data[2] = x - sprite->pos1.x; - sprite->data[3] = y - sprite->pos1.y; - sprite->pos1.x = x; - sprite->pos1.y = y; -} - -void CameraObject_2(struct Sprite *sprite) -{ - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; - sprite->data[2] = 0; - sprite->data[3] = 0; -} - -struct Sprite *FindCameraObject(void) -{ - u8 i; - - for (i = 0; i < 64; i++) - { - if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) - return &gSprites[i]; - } - return NULL; -} - -void CameraObjectReset1(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite != NULL) - { - cameraSprite->data[1] = 0; - cameraSprite->callback(cameraSprite); - } -} - -void CameraObjectSetFollowedObjectId(u8 spriteId) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite != NULL) - { - cameraSprite->data[0] = spriteId; - CameraObjectReset1(); - } -} - -u8 CameraObjectGetFollowedObjectId(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - if (cameraSprite == NULL) - return 64; - else - return cameraSprite->data[0]; -} - -void CameraObjectReset2(void) -{ - struct Sprite *cameraSprite = FindCameraObject(); - - cameraSprite->data[1] = 2; -} - -u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < 64; i++) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *src; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - break; - } - } - return i; -} - -u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority) -{ - s16 i; - - for (i = 63; i > -1; i--) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *src; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - return i; - } - } - return 64; -} - -void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) -{ - mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; - if (!mapObject->mapobj_bit_9) - { - s8 _direction = direction; //needed for the asm to match - mapObject->mapobj_unk_18 = _direction; - } - mapObject->placeholder18 = direction; -} - -u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - - return template->script; -} - -u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - - return template->flagId; -} - -u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return 0xFF; - else - return gMapObjects[mapObjectId].trainerType; -} - -u8 unref_sub_805C60C(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerType; -} - -u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - return 0xFF; - else - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -u8 FieldObjectGetBerryTreeId(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8); - -struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup) - return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount); - else - { - struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); - - return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount); - } -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) -{ - u8 i; - - for (i = 0; i < count; i++) - { - if (templates[i].localId == localId) - return &templates[i]; - } - return NULL; -} - -struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject) -{ - s32 i; - - if (mapObject->mapNum != gSaveBlock1.location.mapNum - || mapObject->mapGroup != gSaveBlock1.location.mapGroup) - return NULL; - - for (i = 0; i < 64; i++) - { - if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId) - return &gSaveBlock1.mapObjectTemplates[i]; - } - return NULL; -} - -void sub_805C754(struct MapObject *mapObject) -{ - struct MapObjectTemplate *template = sub_805C700(mapObject); - - if (template != NULL) - { - template->x = mapObject->coords2.x - 7; - template->y = mapObject->coords2.y - 7; - } -} - -void sub_805C774(struct MapObject *mapObject, u8 movementType) -{ - struct MapObjectTemplate *template = sub_805C700(mapObject); - - if (template != NULL) - template->movementType = movementType; -} - -void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - sub_805C754(&gMapObjects[mapObjectId]); -} - -void sub_805C7C4(u8 a) -{ - gpu_pal_allocator_reset__manage_upper_four(); - gUnknown_030005A6 = 0x11FF; - gUnknown_030005A4 = a; - pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10); -} - -u16 npc_paltag_by_palslot(u8 a) -{ - u8 i; - - if (a < 10) - return gUnknown_0837399C[gUnknown_030005A4][a]; - - for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++) - { - if (gUnknown_083738E4[i].tag == gUnknown_030005A6) - { - return gUnknown_083738E4[i].data[gUnknown_030005A4]; - } - } - return 0x11FF; -} - -fieldmap_object_null_cb(sub_805C884, sub_805C8A8); -fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224); - -u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); - -u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); -void sub_8064820(struct Sprite *, s16); - -u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -extern u8 sub_8064824(struct Sprite *); - -u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -extern u8 sub_805FF20(struct MapObject *, u8); - -u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - direction = directions[Random() & 3]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) -{ - s16 x; - s16 y; - s16 objx; - s16 objy; - s16 minx; - s16 maxx; - s16 miny; - s16 maxy; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0) - { - return 0; - } - if (mapObject->trainerType != 1 && mapObject->trainerType != 3) - { - return 0; - } - PlayerGetDestCoords(&x, &y); - objx = mapObject->coords2.x; - objy = mapObject->coords2.y; - minx = objx - mapObject->trainerRange_berryTreeId; - miny = objy - mapObject->trainerRange_berryTreeId; - maxx = objx + mapObject->trainerRange_berryTreeId; - maxy = objy + mapObject->trainerRange_berryTreeId; - if (minx > x || maxx < x || miny > y || maxy < y) - { - return 0; - } - return 1; -} - -u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - if (a2 > a3) - { - dirn = DIR_EAST; - if (a0 < 0) - { - dirn = DIR_WEST; - } - } - else - { - dirn = DIR_SOUTH; - if (a1 < 0) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = DIR_SOUTH; - if (a1 < 0) - { - dirn = DIR_NORTH; - } - return dirn; -} - -u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = DIR_EAST; - if (a0 < 0) - { - dirn = DIR_WEST; - } - return dirn; -} - -u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = DIR_NORTH; - } - } - else if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = DIR_NORTH; - } - } - else if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = DIR_NORTH; - } - } - return dirn; -} - -u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = DIR_SOUTH; - } - } - else if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = DIR_SOUTH; - } - } - return dirn; -} - -u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) { - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = DIR_SOUTH; - } - } - else if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = DIR_SOUTH; - } - } - return dirn; -} - -u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_EAST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_WEST) - { - dirn = sub_805CADC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_SOUTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3) -{ - u8 dirn; - dirn = sub_805CAAC(a0, a1, a2, a3); - if (dirn == DIR_NORTH) - { - dirn = sub_805CAEC(a0, a1, a2, a3); - } - return dirn; -} - -u8 sub_805CD60(struct MapObject *mapObject, u8 a1) -{ - s16 x; - s16 y; - s16 x2; - s16 y2; - if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - return 0; - } - PlayerGetDestCoords(&x, &y); - x -= mapObject->coords2.x; - y -= mapObject->coords2.y; - x2 = x; - y2 = y; - if (x2 < 0) - { - x2 = -x2; - } - if (y2 < 0) - { - y2 = -y2; - } - return gUnknown_08375244[a1](x, y, x2, y2); -} - -fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270); - -u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284); - -u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752A0, 2); - direction = directions[Random() & 1]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4); - -u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) == 0) - { - return 0; - } - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - sprite->data[1] = 3; - return 1; -} - -u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) != 0) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752C0, 2); - direction = directions[Random() & 1]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (sub_805FF20(mapObject, direction) != 0) - { - sprite->data[1] = 1; - } - return 1; -} - -u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 6; - return 1; -} - -u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4); - -u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite) != 0) - { - sprite->data[1] = 2; - return 1; - } - return 0; -} - -u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - return 0; -} - -u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite); - -void FieldObjectCB_BerryTree(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (!(sprite->data[7] & 1)) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data[7] |= 1; - } - meta_step(mapObject, sprite, sub_805D314); -} - -u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_083752D0[sprite->data[1]](mapObject, sprite); -} - -u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 berryTreeStage; - npc_reset(mapObject, sprite); - mapObject->mapobj_bit_13 = 1; - sprite->invisible = 1; - berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (!berryTreeStage) - { - if (!(sprite->data[7] & 4) && sprite->animNum == 4) - { - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - sprite->animNum = 0; - } - return 0; - } - mapObject->mapobj_bit_13 = 0; - sprite->invisible = 0; - berryTreeStage--; - if (sprite->animNum != berryTreeStage) - { - sprite->data[1] = 2; - return 1; - } - get_berry_tree_graphics(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, 0x39); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 0; - return 1; - } - return 0; -} - -u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 3; - sprite->data[2] = 0; - sprite->data[7] |= 2; - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - return 1; -} - -u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[2]++; - mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); - sprite->animPaused = 1; - if (sprite->data[2] > 64) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data[1] = 4; - sprite->data[2] = 0; - return 1; - } - return 0; -} - -u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[2]++; - mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1); - sprite->animPaused = 1; - if (sprite->data[2] > 64) - { - sprite->data[1] = 0; - sprite->data[7] &= (-3); - return 1; - } - return 0; -} - -fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4); - -u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752A0, 2); - direction = sub_805CD60(mapObject, 1); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8); - -u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837520C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_083752C0, 2); - direction = sub_805CD60(mapObject, 2); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C); - -u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375320, 2); - direction = sub_805CD60(mapObject, 3); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324); - -u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375338, 2); - direction = sub_805CD60(mapObject, 4); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C); - -u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375350, 2); - direction = sub_805CD60(mapObject, 5); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354); - -u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUnknown_08375368, 2); - direction = sub_805CD60(mapObject, 6); - if (direction == 0) - { - direction = directions[Random() & 1]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C); - -u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375380, 4); - direction = sub_805CD60(mapObject, 7); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384); - -u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_08375398, 4); - direction = sub_805CD60(mapObject, 8); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C); - -u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_083753B0, 4); - direction = sub_805CD60(mapObject, 9); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4); - -u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, gUnknown_0837521C[Random() & 3]); - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return 1; - } - return 0; -} - -u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUnknown_083753C8, 4); - direction = sub_805CD60(mapObject, 10); - if (direction == 0) - { - direction = directions[Random() & 3]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC); - -u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, 0x30); - sprite->data[1] = 2; - } - return 0; -} - -u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gUnknown_083753DC, 5); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 0; - return 1; -} - -fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4); - -u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sub_8064820(sprite, 0x30); - sprite->data[1] = 2; - } - return 0; -} - -u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 3; - } - return 0; -} - -u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gUnknown_083753F4, 5); - direction = sub_805CD60(mapObject, 0); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 0; - return 1; -} - -fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC); - -u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - direction = gUnknown_0836DC09[mapObject->animPattern]; - if (mapObject->mapobj_unk_21 != 0) - { - direction = GetOppositeDirection(direction); - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 v0; - u8 goSpeed0AnimId; - if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - } - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - if (v0 == 1) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - } - if (v0 != 0) - { - goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 3; - return 1; -} - -u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return 1; -} - -u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence) -{ - u8 v0; - u8 goSpeed0AnimId; - if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - } - FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - if (v0 == 1) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]); - goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18); - v0 = sub_805FF20(mapObject, mapObject->placeholder18); - } - if (v0 != 0) - { - goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C); - -u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375418, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C); - -u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375428, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C); - -u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375438, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C); - -u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375448, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - - - -fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C); - -u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375458, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C); - -u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375468, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C); - -u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375240, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478); - -u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375484, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488); - -u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375494, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498); - -u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754A4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8); - -u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754B4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8); - -u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754C4, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8); - -u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754D4, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8); - -u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754E4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8); - -u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_083754F4, 4); - if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 2; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8); - -u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375504, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508); - -u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375514, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518); - -u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375524, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528); - -u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375534, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538); - -u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375544, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548); - -u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375554, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558); - -u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375564, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568); - -u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375574, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -} - -fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578); - -u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - memcpy(directions, gUnknown_08375584, 4); - if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x) - { - mapObject->mapobj_unk_21 = 3; - } - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions); -}; - -fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588); - -u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - if (mapObject->mapobj_unk_21 == 0) - { - mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); - } - sprite->data[1] = 1; - return 1; -} - -u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - { - return 0; - } - return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); -} - -u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = 0; - sprite->data[1] = 1; - } - return 0; -} - -bool8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - return 0; -} - -bool8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2))); - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -bool8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = a2; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = 1; - sprite->data[1] = 2; - return 1; -} - -bool8 sub_805F4F0(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_8060744(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F5A8(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_806079C(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F660(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_80607C8(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectSetRegularAnim(mapObject, sprite, sub_806084C(direction)); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_805F760(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_80608A4(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - x = mapObject->coords2.x; - y = mapObject->coords2.y; - sub_8060320(direction, &x, &y, 2, 2); - FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); - -u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - { - return 0; - } - return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); -} - -u8 sub_805F9F8(struct MapObject *, struct Sprite *); - -void FieldObjectCB_TreeDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) - { - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); - mapObject->mapobj_unk_21 = 1; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); -} - -u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return 0; -} - -void FieldObjectCB_MountainDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[sprite->data[0]]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0)) - { - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); - mapObject->mapobj_unk_21 = 1; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8); -} - -u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite); - -void FieldObjectCB_Hidden1(struct Sprite *sprite) -{ - if (sprite->data[7] == 0) - { - gMapObjects[sprite->data[0]].mapobj_bit_26 = 1; - sprite->subspriteMode = 2; - sprite->oam.priority = 3; - sprite->data[7] ++; - } - meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805FAD8); -} - -u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_083755CC[sprite->data[1]](mapObject, sprite); -} - -u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return 0; -} - -u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 0; - } - return 0; -} - -fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0); - -u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8); - -u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0); - -u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return 1; -} - -fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8); - -u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - mapObject->mapobj_bit_13 = 1; - sprite->data[1] = 1; - return 1; -} - -u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 2; - return 1; - } - return 0; -} - -u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - return 0; -} - -void sub_805FC70(struct Sprite *sprite); - -void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = 0; - mapObject->mapobj_bit_6 = 0; - mapObject->mapobj_bit_7 = 0; - mapObject->mapobj_unk_1C = 0xff; - sprite->data[1] = 0; -} - -u8 FieldObjectDirectionToImageAnimId(u8 direction) -{ - return gUnknown_083755F4[direction]; -} - -u8 get_go_image_anim_num(u8 direction) -{ - return gUnknown_083755FD[direction]; -} - -u8 get_go_fast_image_anim_num(u8 direction) -{ - return gUnknown_08375606[direction]; -} - -u8 get_go_faster_image_anim_num(u8 direction) -{ - return gUnknown_0837560F[direction]; -} - -u8 sub_805FD78(u8 direction) -{ - return gUnknown_08375618[direction]; -} - -u8 sub_805FD88(u8 direction) -{ - return gUnknown_08375621[direction]; -} - -u8 sub_805FD98(u8 direction) -{ - return gUnknown_0837562A[direction]; -} - -u8 unref_sub_805FDA8(u8 direction) -{ - return gUnknown_08375633[direction]; -} - -u8 sub_805FDB8(u8 direction) -{ - return gUnknown_0837563C[direction]; -} - -u8 sub_805FDC8(u8 direction) -{ - return gUnknown_08375645[direction]; -} - -u8 sub_805FDD8(u8 direction) -{ - return gUnknown_0837564E[direction]; -} - -u8 sub_805FDE8(u8 direction) -{ - return gUnknown_08375657[direction]; -} - -u8 sub_805FDF8(u8 direction) -{ - return gUnknown_08375660[direction]; -} - -u8 sub_805FE08(u8 direction) -{ - return gUnknown_08375669[direction]; -} - -u8 get_run_image_anim_num(u8 direction) -{ - return gUnknown_08375672[direction]; -} - -void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - if (sprite->animCmdIndex == 1) - { - sprite->animCmdIndex = 2; - } else if (sprite->animCmdIndex == 3) - { - sprite->animCmdIndex = 0; - } - SeekSpriteAnim(sprite, sprite->animCmdIndex); - } -} - -void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - u8 animCmdIndex; - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - animCmdIndex = 3; - if (sprite->animCmdIndex < 2) - { - animCmdIndex = 1; - } - SeekSpriteAnim(sprite, animCmdIndex); - } -} - -u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3) -{ - if (a0 > a2) - { - return DIR_WEST; - } else if (a0 < a2) - { - return DIR_EAST; - } else if (a1 > a3) - { - return DIR_NORTH; - } else - { - return DIR_SOUTH; - } -} - -void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) -{ - mapObject->animPattern = animPattern; - mapObject->mapobj_unk_21 = 0; - mapObject->animId = 0; - gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern]; - gSprites[mapObject->spriteId].data[1] = 0; -} - -u8 npc_running_behaviour_by_direction(u8 direction) -{ - return gUnknown_0837567B[direction]; -} - -u8 sub_805FF20(struct MapObject *mapObject, u8 direction) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - MoveCoords(direction, &x, &y); - return npc_block_way(mapObject, x, y, direction); -} - -bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y); -static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y); -bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); - -u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) -{ - u8 direction; - direction = dirn; - if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) - return 1; - else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) - return 2; - else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) - return 2; - else if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - return 3; - else if (DoesObjectCollideWithObjectAt(mapObject, x, y)) - return 4; - return 0; -} - -u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - u8 flags = 0; - - if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) - flags |= 1; - if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) - flags |= 2; - if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - flags |= 4; - if (DoesObjectCollideWithObjectAt(mapObject, x, y)) - flags |= 8; - return flags; -} - -bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y) -{ - s16 minv; - s16 maxv; - - if (mapObject->range.as_nybbles.x != 0) - { - minv = mapObject->coords1.x - (mapObject->range.as_nybbles.x); - maxv = mapObject->coords1.x + (mapObject->range.as_nybbles.x); - if (minv > x || maxv < x) - return TRUE; - } - if (mapObject->range.as_nybbles.y != 0) - { - minv = mapObject->coords1.y - (mapObject->range.as_nybbles.y); - maxv = mapObject->coords1.y + (mapObject->range.as_nybbles.y); - if (minv > y || maxv < y) - return TRUE; - } - return FALSE; -} - -bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) - { - return 1; - } - return 0; -} - -static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - struct MapObject *mapObject2 = &gMapObjects[i]; - - if (mapObject2->active && mapObject2 != mapObject) - { - if (((mapObject2->coords2.x == x && mapObject2->coords2.y == y) || (mapObject2->coords3.x == x && mapObject2->coords3.y == y)) - && AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0)) - return TRUE; - } - } - return 0; -} - -// this function is only used in berry.c, but its unknown whether its intended context is the berry tree check or if its checking for the flickering. -bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - if (gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 2) - return TRUE; - - return FALSE; -} - -void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 4; - } -} - -void MoveCoords(u8 direction, s16 *x, s16 *y) -{ - *x += gDirectionToVector[direction].x; - *y += gDirectionToVector[direction].y; -} - -void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) -{ - *x += gDirectionToVector[direction].x << 4; - *y += gDirectionToVector[direction].y << 4; -} - -void sub_8060320(u32 dirn, s16 *x, s16 *y, s16 deltaX, s16 deltaY) -{ - u8 direction = dirn; - s16 dx2 = deltaX; - s16 dy2 = deltaY; - if (gDirectionToVector[direction].x > 0) - { - *x += dx2; - } - if (gDirectionToVector[direction].x < 0) - { - *x -= dx2; - } - if (gDirectionToVector[direction].y > 0) - { - *y += dy2; - } - if (gDirectionToVector[direction].y < 0) - { - *y -= dy2; - } -} - -void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2) -{ - *x2 = (x1 - gSaveBlock1.pos.x) << 4; - *y2 = (y1 - gSaveBlock1.pos.y) << 4; - *x2 -= gUnknown_0300489C; - *y2 -= gUnknown_03004898; -} - -void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2) -{ - s16 x3; - s16 y3; - x3 = -gUnknown_0300489C - gUnknown_03004880.unk10; - y3 = -gUnknown_03004898 - gUnknown_03004880.unk14; - if (gUnknown_03004880.unk10 > 0) - { - x3 += 0x10; - } - if (gUnknown_03004880.unk10 < 0) - { - x3 -= 0x10; - } - if (gUnknown_03004880.unk14 > 0) - { - y3 += 0x10; - } - if (gUnknown_03004880.unk14 < 0) - { - y3 -= 0x10; - } - *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3; - *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3; -} - -void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy) -{ - sub_80603CC(*x, *y, x, y); - *x += dx; - *y += dy; -} - -void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) -{ - *x = 0; - *y = 0; - if (gUnknown_03004880.unk10 > 0) - { - (*x)++; - } - if (gUnknown_03004880.unk10 < 0) - { - (*x)--; - } - if (gUnknown_03004880.unk14 > 0) - { - (*y)++; - } - if (gUnknown_03004880.unk14 < 0) - { - (*y)--; - } -} - -void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 direction, s16 *x, s16 *y) -{ - u8 newDirn = direction; - *x = mapObject->coords2.x; - *y = mapObject->coords2.y; - MoveCoords(newDirn, x, y); -} - -bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) - { - return TRUE; - } - UnfreezeMapObject(mapObject); - mapObject->mapobj_unk_1C = specialAnimId; - mapObject->mapobj_bit_6 = 1; - mapObject->mapobj_bit_7 = 0; - gSprites[mapObject->spriteId].data[2] = 0; - return FALSE; -} - -void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - FieldObjectSetSpecialAnim(mapObject, specialAnimId); -} - -void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - FieldObjectClearAnim(mapObject); - } -} - -void FieldObjectClearAnim(struct MapObject *mapObject) -{ - mapObject->mapobj_unk_1C = 0xFF; - mapObject->mapobj_bit_6 = 0; - mapObject->mapobj_bit_7 = 0; - gSprites[mapObject->spriteId].data[1] = 0; - gSprites[mapObject->spriteId].data[2] = 0; -} - -bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - return mapObject->mapobj_bit_7; - return 0x10; -} - -bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) -{ - u8 specialAnimStatus; - specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); - if (specialAnimStatus != 0 && specialAnimStatus != 0x10) - { - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - } - return specialAnimStatus; -} - -u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - return mapObject->mapobj_unk_1C; - } - return 0xFF; -} - -extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite); -extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite); -extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite); -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite); -void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite); - -void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *)) -{ - DoGroundEffects_OnSpawn(mapObject, sprite); - sub_80634A0(mapObject, sprite); - if (FieldObjectIsSpecialAnimActive(mapObject)) - { - FieldObjectExecSpecialAnim(mapObject, sprite); - } else - { - if (!mapObject->mapobj_bit_8) - { - while (callback(mapObject, sprite)); - } - } - DoGroundEffects_OnBeginStep(mapObject, sprite); - DoGroundEffects_OnFinishStep(mapObject, sprite); - npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); - sub_80634D0(mapObject, sprite); - FieldObjectUpdateSubpriority(mapObject, sprite); -} - -#define dirn_to_anim(name, table)\ -u8 name(u32 idx)\ -{\ - u8 direction;\ - u8 animIds[sizeof(table)];\ - direction = idx;\ - memcpy(animIds, (table), sizeof(table));\ - if (direction > DIR_EAST) direction = 0;\ - return animIds[direction];\ -} - -dirn_to_anim(GetFaceDirectionAnimId, gUnknown_083756C8) -dirn_to_anim(GetSimpleGoAnimId, gUnknown_083756CD) -dirn_to_anim(GetGoSpeed0AnimId, gUnknown_083756D2) -dirn_to_anim(sub_8060744, gUnknown_083756D7) -dirn_to_anim(d2s_08064034, gUnknown_083756DC) -dirn_to_anim(sub_806079C, gUnknown_083756E1) -dirn_to_anim(sub_80607C8, gUnknown_083756E6) -dirn_to_anim(sub_80607F4, gUnknown_083756EB) -dirn_to_anim(GetJumpLedgeAnimId, gUnknown_083756F0) -dirn_to_anim(sub_806084C, gUnknown_083756F5) -dirn_to_anim(sub_8060878, gUnknown_083756FA) -dirn_to_anim(sub_80608A4, gUnknown_083756FF) -dirn_to_anim(sub_80608D0, gUnknown_08375704) -dirn_to_anim(GetStepInPlaceDelay32AnimId, gUnknown_08375709) -dirn_to_anim(GetStepInPlaceDelay16AnimId, gUnknown_0837570E) -dirn_to_anim(GetStepInPlaceDelay8AnimId, gUnknown_08375713) -dirn_to_anim(GetStepInPlaceDelay4AnimId, gUnknown_08375718) - -u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) -{ - return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); -} - -u8 sub_80609D8(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837571D, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A04(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375722, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A30(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375727, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A5C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837572C, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060A88(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375731, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060AB4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375736, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060AE0(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837573B, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B0C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375740, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B38(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375745, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060B64(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837574A, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetOppositeDirection(u8 direction) -{ - u8 directions[8]; - memcpy(directions, gUnknown_0837574F, 8); - if (direction == 0 || direction > 8) - { - return direction; - } - return directions[direction - 1]; -} - -u32 zffu_offset_calc(u8 a0, u8 a1) -{ - return gUnknown_08375757[a0 - 1][a1 - 1]; -} - -u32 state_to_direction(u8 a0, u32 a1, u32 a2) -{ - u32 zffuOffset; - u8 a1_2 = a1; - u8 a2_2 = a2; - if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) - { - return 0; - } - zffuOffset = zffu_offset_calc(a1_2, a2); - return gUnknown_08375767[a0 - 1][zffuOffset - 1]; -} - -void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) - { - mapObject->mapobj_bit_7 = 1; - } -} - -bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) - { - mapObject->mapobj_unk_1C = 0xFF; - sprite->data[2] = 0; - return 1; - } - return 0; -} - -void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) -{ - mapObject->mapobj_unk_1C = animId; - sprite->data[2] = 0; -} - -void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - sprite->animPaused = 1; - sprite->data[2] = 1; -} - -u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_SOUTH); - return 1; -} - -u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_NORTH); - return 1; -} - -u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_WEST); - return 1; -} - -u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_EAST); - return 1; -} - -void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - oamt_npc_ministep_reset(sprite, direction, a3); - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - sprite->data[2] = 1; -} - -extern u8 (*const gUnknown_083759C0[5])(u8); - -void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - u8 (*const functions[5])(u8); - memcpy((void *)functions, gUnknown_083759C0, sizeof(gUnknown_083759C0)); - sub_8060D20(mapObject, sprite, direction, a3); - sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18)); -} - -void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8060D20(mapObject, sprite, direction, 1); - sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 obj_npc_ministep(struct Sprite *); - -bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (obj_npc_ministep(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - sprite->animPaused = 1; - return 1; - } - return 0; -} - -void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - s16 x; - s16 y; - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - sub_806467C(sprite, direction); - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - sprite->data[2] = 1; -} - -void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8060E68(mapObject, sprite, direction); - sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_806468C(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - sprite->animPaused = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060F5C(struct MapObject *, struct Sprite *); - -bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - return sub_8060F5C(mapObject, sprite); -} - -bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060F9C(struct MapObject *, struct Sprite *); - -bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_NORTH); - return sub_8060F9C(mapObject, sprite); -} - -bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8060FDC(struct MapObject *, struct Sprite *); - -bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_WEST); - return sub_8060FDC(mapObject, sprite); -} - -bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806101C(struct MapObject *, struct Sprite *); - -bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_EAST); - return sub_806101C(mapObject, sprite); -} - -bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806105C(struct MapObject *, struct Sprite *); - -bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 0); - return sub_806105C(mapObject, sprite); -} - -bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806109C(struct MapObject *, struct Sprite *); - -bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 0); - return sub_806109C(mapObject, sprite); -} - -bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80610DC(struct MapObject *, struct Sprite *); - -bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 0); - return sub_80610DC(mapObject, sprite); -} - -bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806111C(struct MapObject *, struct Sprite *); - -bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 0); - return sub_806111C(mapObject, sprite); -} - -bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) -{ - s16 vSPp4[3]; - s16 x; - s16 y; - memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34); - x = 0; - y = 0; - FieldObjectSetDirection(mapObject, direction); - sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - sub_80646E4(sprite, direction, a4, a5); - sprite->data[2] = 1; - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; -} - -void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5) -{ - sub_806113C(mapObject, sprite, direction, a4, a5); - sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - DoShadowFieldEffect(mapObject); -} - -u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *)) -{ - s16 vSPp4[3]; - s16 x; - s16 y; - u8 retval; - memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A); - retval = callback(sprite); - if (retval == 1 && vSPp4[sprite->data[4]] != 0) - { - x = 0; - y = 0; - sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data[4]], vSPp4[sprite->data[4]]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; - } else if (retval == 0xff) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = 1; - mapObject->mapobj_bit_5 = 1; - sprite->animPaused = 1; - } - return retval; -} - -u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_806123C(mapObject, sprite, sub_8064704); -} - -u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_806123C(mapObject, sprite, sub_806478C); -} - -bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061300(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061314(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 retval; - - retval = sub_8061300(mapObject, sprite); - if (retval != 1) - { - if (retval == 0xFF) - { - return TRUE; - } - return FALSE; - } - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - return FALSE; -} - -bool8 sub_80613D4(struct MapObject *, struct Sprite *); -bool8 sub_806142C(struct MapObject *, struct Sprite *); -bool8 sub_8061484(struct MapObject *, struct Sprite *); -bool8 sub_80614DC(struct MapObject *, struct Sprite *); - -bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0); - return sub_80613D4(mapObject, sprite); -} - -bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0); - return sub_806142C(mapObject, sprite); -} - -bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0); - return sub_8061484(mapObject, sprite); -} - -bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0); - return sub_80614DC(mapObject, sprite); -} - -bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8061508(struct Sprite *sprite, u16 duration) -{ - sprite->data[2] = 1; - sprite->data[3] = duration; -} - -bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[3]--; - if (!sprite->data[3]) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 1); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 2); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 4); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 8); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061508(sprite, 16); - return sub_8061510(mapObject, sprite); -} - -bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite); -bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 1); - return sub_80615EC(mapObject, sprite); -} - -bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 1); - return sub_806162C(mapObject, sprite); -} - -bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 1); - return sub_806166C(mapObject, sprite); -} - -bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} -bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 1); - return sub_80616AC(mapObject, sprite); -} - -bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration) -{ - FieldObjectSetDirection(mapObject, direction); - sub_805FE28(mapObject, sprite, animId); - sprite->animPaused = 0; - sprite->data[2] = 1; - sprite->data[3] = duration; -} - -bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[3]--; - if (sprite->data[3] == 0) - { - sprite->data[2] = 2; - sprite->animPaused = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sprite->data[3] & 1) - { - sprite->animDelayCounter++; - } - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32); - return sub_806173C(mapObject, sprite); -} - -bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8061B18(struct MapObject *, struct Sprite *); - -bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 2); - return sub_8061B18(mapObject, sprite); -} - -bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061B58(struct MapObject *, struct Sprite *); - -bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 2); - return sub_8061B58(mapObject, sprite); -} - -bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061B98(struct MapObject *, struct Sprite *); - -bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 2); - return sub_8061B98(mapObject, sprite); -} - -bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061BD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 2); - return sub_8061BD8(mapObject, sprite); -} - -bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061C18(struct MapObject *, struct Sprite *); - -bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 3); - return sub_8061C18(mapObject, sprite); -} - -bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061C58(struct MapObject *, struct Sprite *); - -bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 3); - return sub_8061C58(mapObject, sprite); -} - -bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061C98(struct MapObject *, struct Sprite *); - -bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 3); - return sub_8061C98(mapObject, sprite); -} - -bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061CD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 3); - return sub_8061CD8(mapObject, sprite); -} - -bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061D18(struct MapObject *, struct Sprite *); - -bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_SOUTH, 4); - return sub_8061D18(mapObject, sprite); -} - -bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061D58(struct MapObject *, struct Sprite *); - -bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_NORTH, 4); - return sub_8061D58(mapObject, sprite); -} - -bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061D98(struct MapObject *, struct Sprite *); - -bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_WEST, 4); - return sub_8061D98(mapObject, sprite); -} - -bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - - -bool8 sub_8061DD8(struct MapObject *, struct Sprite *); - -bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_go_anim(mapObject, sprite, DIR_EAST, 4); - return sub_8061DD8(mapObject, sprite); -} - -bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E18(struct MapObject *, struct Sprite *); - -bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_SOUTH); - return sub_8061E18(mapObject, sprite); -} - -bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E58(struct MapObject *, struct Sprite *); - -bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_NORTH); - return sub_8061E58(mapObject, sprite); -} - -bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061E98(struct MapObject *, struct Sprite *); - -bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_WEST); - return sub_8061E98(mapObject, sprite); -} - -bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061ED8(struct MapObject *, struct Sprite *); - -bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite) -{ - do_run_anim(mapObject, sprite, DIR_EAST); - return sub_8061ED8(mapObject, sprite); -} - -bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) -{ - obj_anim_image_set_and_seek(sprite, animNum, 0); - FieldObjectSetDirection(mapObject, direction); - sprite->data[2] = 1; -} - -bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); - return FALSE; -} - -bool8 sub_8064864(struct Sprite *); - -bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_806113C(mapObject, sprite, direction, 1, 0); - StartSpriteAnim(sprite, sub_805FD88(direction)); -} - -bool8 sub_8061FB0(struct MapObject *, struct Sprite *); - -bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_SOUTH); - return sub_8061FB0(mapObject, sprite); -} - -bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8061FF8(struct MapObject *, struct Sprite *); - -bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_NORTH); - return sub_8061FF8(mapObject, sprite); -} - -bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062040(struct MapObject *, struct Sprite *); - -bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_WEST); - return sub_8062040(mapObject, sprite); -} - -bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062088(struct MapObject *, struct Sprite *); - -bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8061F5C(mapObject, sprite, DIR_EAST); - return sub_8062088(mapObject, sprite); -} - -bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061340(mapObject, sprite)) - { - sprite->data[2] = 2; - mapObject->mapobj_bit_5 = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 objectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) - { - an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)); - } - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 objectId; - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId)) - { - an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y))); - } - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2); - return sub_80621BC(mapObject, sprite); -} - -bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2); - return sub_8062214(mapObject, sprite); -} - -bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2); - return sub_806226C(mapObject, sprite); -} - -bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2); - return sub_80622C4(mapObject, sprite); -} - -bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0); - return sub_806231C(mapObject, sprite); -} - -bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0); - return sub_8062374(mapObject, sprite); -} - -bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0); - return sub_80623CC(mapObject, sprite); -} - -bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0); - return sub_8062424(mapObject, sprite); -} - -bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2); - return sub_806247C(mapObject, sprite); -} - -bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2); - return sub_80624D4(mapObject, sprite); -} - -bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2); - return sub_806252C(mapObject, sprite); -} - -bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite); - -bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite) -{ - maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2); - return sub_8062584(mapObject, sprite); -} - -bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061358(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]); - return TRUE; -} - -bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); - return FALSE; -} - -bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_HEART_ICON); - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8062704(struct MapObject *, struct Sprite *); - -bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->animPattern == 0x3F) - { - sub_8084794(mapObject); - return FALSE; - } - else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) - { - sprite->data[2] = 2; - return TRUE; - } - else - { - sub_812869C(mapObject); - sprite->data[2] = 1; - return sub_8062704(mapObject, sprite); - } -} - -bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_81286C4(mapObject)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data[2] = 1; - return FALSE; -} - -bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sub_8064820(sprite, 0x20); - sprite->data[2] = 2; - } - return FALSE; -} - -bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= 1; - if (sub_8064824(sprite)) - { - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 3; - } - return FALSE; -} - -bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data[2] = 1; - return FALSE; -} - -bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8064864(sprite)) - { - sub_8064820(sprite, 0x20); - sprite->data[2] = 2; - } - return FALSE; -} - -bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= 1; - if (sub_8064824(sprite)) - { - mapObject->mapobj_bit_13 = 1; - sprite->data[2] = 3; - } - return FALSE; -} - -bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = 1; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->oam.affineMode = 3; - InitSpriteAffineAnim(sprite); - sprite->affineAnimPaused = 1; - sprite->subspriteMode = 0; - return TRUE; -} - -bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = 0; - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - return TRUE; -} - -bool8 sub_80628D0(struct MapObject *, struct Sprite *); - -bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - sprite->affineAnimPaused = 0; - StartSpriteAffineAnimIfDifferent(sprite, 0); - return sub_80628D0(mapObject, sprite); -} - -bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->affineAnimPaused = 1; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062930(struct MapObject *, struct Sprite *); - -bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8060ED8(mapObject, sprite, DIR_SOUTH); - sprite->affineAnimPaused = 0; - ChangeSpriteAffineAnimIfDifferent(sprite, 1); - return sub_8062930(mapObject, sprite); -} - -bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (an_walk_any_2(mapObject, sprite)) - { - sprite->affineAnimPaused = 1; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - sub_805FE64(mapObject, sprite, sub_805FDD8(direction)); - sprite->animPaused = 1; - sprite->data[2] = 1; -} - -bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_SOUTH); - return TRUE; -} - -bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_NORTH); - return TRUE; -} - -bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_WEST); - return TRUE; -} - -bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_806295C(mapObject, sprite, DIR_EAST); - return TRUE; -} - -bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST)); - return FALSE; -} - -bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST)); - return FALSE; -} - -bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH)); - return FALSE; -} - -bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH)); - return FALSE; -} - -bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST)); - return FALSE; -} - -bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST)); - return FALSE; -} - -void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4) -{ - sub_806113C(mapObject, sprite, direction, a3, a4); - StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction)); - DoShadowFieldEffect(mapObject); -} - -bool8 sub_8062BFC(struct MapObject *, struct Sprite *); - -bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1); - return sub_8062BFC(mapObject, sprite); -} - -bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062C54(struct MapObject *, struct Sprite *); - -bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1); - return sub_8062C54(mapObject, sprite); -} - -bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062CAC(struct MapObject *, struct Sprite *); - -bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1); - return sub_8062CAC(mapObject, sprite); -} - -bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062D04(struct MapObject *, struct Sprite *); - -bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1); - return sub_8062D04(mapObject, sprite); -} - -bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062D5C(struct MapObject *, struct Sprite *); - -bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1); - return sub_8062D5C(mapObject, sprite); -} - -bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062DB4(struct MapObject *, struct Sprite *); - -bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1); - return sub_8062DB4(mapObject, sprite); -} - -bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062E0C(struct MapObject *, struct Sprite *); - -bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1); - return sub_8062E0C(mapObject, sprite); -} - -bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062E64(struct MapObject *, struct Sprite *); - -bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1); - return sub_8062E64(mapObject, sprite); -} - -bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062EBC(struct MapObject *, struct Sprite *); - -bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0); - return sub_8062EBC(mapObject, sprite); -} - -bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062F14(struct MapObject *, struct Sprite *); - -bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0); - return sub_8062F14(mapObject, sprite); -} - -bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062F6C(struct MapObject *, struct Sprite *); - -bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0); - return sub_8062F6C(mapObject, sprite); -} - -bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062FC4(struct MapObject *, struct Sprite *); - -bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0); - return sub_8062FC4(mapObject, sprite); -} - -bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8061328(mapObject, sprite)) - { - mapObject->mapobj_bit_22 = 0; - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8); - return sub_8061714(mapObject, sprite); -} - -bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8); - return sub_8061714(mapObject, sprite); -} - -void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -bool8 sub_8063128(struct MapObject *, struct Sprite *); - -bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063128(mapObject, sprite); -} - -bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063168(struct MapObject *, struct Sprite *); - -bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_NORTH, 1); - return sub_8063168(mapObject, sprite); -} - -bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80631A8(struct MapObject *, struct Sprite *); - -bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_WEST, 1); - return sub_80631A8(mapObject, sprite); -} - -bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80631E8(struct MapObject *, struct Sprite *); - -bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80630D0(mapObject, sprite, DIR_EAST, 1); - return sub_80631E8(mapObject, sprite); -} - -bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18)); -} - -bool8 sub_8063258(struct MapObject *, struct Sprite *); - -bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063258(mapObject, sprite); -} - -bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063298(struct MapObject *, struct Sprite *); - -bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_NORTH, 1); - return sub_8063298(mapObject, sprite); -} - -bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80632D8(struct MapObject *, struct Sprite *); - -bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_WEST, 1); - return sub_80632D8(mapObject, sprite); -} - -bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063318(struct MapObject *, struct Sprite *); - -bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063208(mapObject, sprite, DIR_EAST, 1); - return sub_8063318(mapObject, sprite); -} - -bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3) -{ - sub_8060D20(mapObject, sprite, direction, a3); - StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -bool8 sub_8063390(struct MapObject *, struct Sprite *); - -bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_SOUTH, 1); - return sub_8063390(mapObject, sprite); -} - -bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80633D0(struct MapObject *, struct Sprite *); - -bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_NORTH, 1); - return sub_80633D0(mapObject, sprite); -} - -bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063410(struct MapObject *, struct Sprite *); - -bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_WEST, 1); - return sub_8063410(mapObject, sprite); -} - -bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063450(struct MapObject *, struct Sprite *); - -bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8063338(mapObject, sprite, DIR_EAST, 1); - return sub_8063450(mapObject, sprite); -} - -bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite) -{ - return TRUE; -} - -bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->animPaused = 1; - return TRUE; -} - -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_10) - { - sprite->animPaused = 1; - } -} - -void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_11) - { - sprite->animPaused = 0; - mapObject->mapobj_bit_10 = 0; - mapObject->mapobj_bit_11 = 0; - } -} - -void sub_80634E8(struct MapObject *, struct Sprite *); -static void UpdateMapObjSpriteVisibility(struct MapObject *, struct Sprite *); - -void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80634E8(mapObject, sprite); - UpdateMapObjSpriteVisibility(mapObject, sprite); -} - -#ifdef NONMATCHING -void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u16 x; - u16 y; - s16 x2; - s16 y2; - const struct MapObjectGraphicsInfo *graphicsInfo; - mapObject->mapobj_bit_14 = 0; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - x2 = graphicsInfo->width + x; // offending line - y2 = graphicsInfo->height + y; // similarly offending line - if ((s16)x >= 0x100 || x2 < -0x10) - { - mapObject->mapobj_bit_14 = 1; - } - if ((s16)y >= 0xB0 || y2 < -0x10) - { - mapObject->mapobj_bit_14 = 1; - } -} -#else -__attribute__((naked)) -void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r5, r0, 0\n\ - adds r4, r1, 0\n\ - ldrb r1, [r5, 0x1]\n\ - movs r0, 0x41\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r5, 0x1]\n\ - ldrb r0, [r5, 0x5]\n\ - bl GetFieldObjectGraphicsInfo\n\ - adds r6, r0, 0\n\ - adds r0, r4, 0\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0806354C\n\ - ldrh r1, [r4, 0x24]\n\ - ldrh r0, [r4, 0x20]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\ - adds r0, r1\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r1, [r4, 0x26]\n\ - ldrh r0, [r4, 0x22]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x29\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\ - adds r0, r1\n\ - ldrh r2, [r2]\n\ - adds r0, r2\n\ - b _08063574\n\ - .align 2, 0\n\ -_08063544: .4byte gSpriteCoordOffsetX\n\ -_08063548: .4byte gSpriteCoordOffsetY\n\ -_0806354C:\n\ - ldrh r1, [r4, 0x24]\n\ - ldrh r0, [r4, 0x20]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x28\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - adds r0, r1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r1, [r4, 0x26]\n\ - ldrh r0, [r4, 0x22]\n\ - adds r1, r0\n\ - adds r0, r4, 0\n\ - adds r0, 0x29\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - adds r0, r1\n\ -_08063574:\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - ldrh r0, [r6, 0x8]\n\ - adds r0, r3\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - ldrh r0, [r6, 0xA]\n\ - adds r0, r2\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - cmp r0, 0xFF\n\ - bgt _0806359C\n\ - lsls r0, r1, 16\n\ - asrs r0, 16\n\ - movs r1, 0x10\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _080635A4\n\ -_0806359C:\n\ - ldrb r0, [r5, 0x1]\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ -_080635A4:\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - cmp r0, 0xAF\n\ - bgt _080635B8\n\ - lsls r0, r4, 16\n\ - asrs r0, 16\n\ - movs r1, 0x10\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bge _080635C0\n\ -_080635B8:\n\ - ldrb r0, [r5, 0x1]\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r5, 0x1]\n\ -_080635C0:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ -.syntax divided\n"); -} -#endif - -void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->invisible = 0; - if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) - { - sprite->invisible = 1; - } -} - -static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8); -static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); -static void DoTracksGroundEffect_BikeTireTracks( -struct MapObject *mapObj, struct Sprite *sprite, u8); -void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite); -void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); -void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); -u8 GetReflectionTypeByMetatileBehavior(u32 behavior); - -static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_Reflection(mapObj, flags); - GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags); - GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); -} - -static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_Reflection(mapObj, flags); - GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags); - GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags); - GetGroundEffectFlags_Tracks(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_Puddle(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); -} - -static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) -{ - FieldObjectUpdateMetatileBehaviors(mapObj); - GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); - GetGroundEffectFlags_SandPile(mapObj, flags); - GetGroundEffectFlags_Puddle(mapObj, flags); - GetGroundEffectFlags_Ripple(mapObj, flags); - GetGroundEffectFlags_ShortGrass(mapObj, flags); - GetGroundEffectFlags_HotSprings(mapObj, flags); - GetGroundEffectFlags_Seaweed(mapObj, flags); - GetGroundEffectFlags_JumpLanding(mapObj, flags); -} - -void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) -{ - mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y); - mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y); -} - -void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) -{ - u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; - u8 type = FieldObjectCheckForReflectiveSurface(mapObj); - - if (type) - { - if (!mapObj->mapobj_bit_17) - { - mapObj->mapobj_bit_17 = 0; - mapObj->mapobj_bit_17 = 1; - *flags |= reflectionFlags[type - 1]; - } - } - else - { - mapObj->mapobj_bit_17 = 0; - } -} - -void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x1; -} - -void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x2; -} - -void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x4; -} - -void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - *flags |= 0x8; -} - -void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) - { - *flags |= 0x100; - } - else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) - || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) - { - *flags |= 0x80; - } -} - -void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_20) - { - mapObj->mapobj_bit_20 = 0; - mapObj->mapobj_bit_20 = 1; - *flags |= 0x800; - } - } - else - { - mapObj->mapobj_bit_20 = 0; - } -} - -void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) -{ - if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) - || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) - { - if (!mapObj->mapobj_bit_19) - { - mapObj->mapobj_bit_19 = 0; - mapObj->mapobj_bit_19 = 1; - *flags |= 0x40; - } - } - else - { - mapObj->mapobj_bit_19 = 0; - } -} - -void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) - { - *flags |= 0x400; - } -} - -void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E)) - *flags |= 0x200; -} - -void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_18) - { - mapObj->mapobj_bit_18 = 0; - mapObj->mapobj_bit_18 = 1; - *flags |= 0x20000; - } - } - else - { - mapObj->mapobj_bit_18 = 0; - } -} - -void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) - { - if (!mapObj->mapobj_bit_21) - { - mapObj->mapobj_bit_21 = 0; - mapObj->mapobj_bit_21 = 1; - *flags |= 0x40000; - } - } - else - { - mapObj->mapobj_bit_21 = 0; - } -} - -void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) -{ - if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E)) - *flags |= 0x80000; -} - -void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) -{ - typedef bool8 (*MetatileFunc)(u8); - - static const MetatileFunc metatileFuncs[] = { - MetatileBehavior_IsTallGrass, - MetatileBehavior_IsLongGrass, - MetatileBehavior_IsPuddle, - MetatileBehavior_IsSurfableWaterOrUnderwater, - MetatileBehavior_IsShallowFlowingWater, - MetatileBehavior_IsATile, - }; - - static const u32 jumpLandingFlags[] = { - 0x00001000, // Landing in tall grass - 0x00002000, // Landing in long grass - 0x00004000, // Landing on puddle - 0x00008000, // Landing on surfable water or underwater - 0x00004000, // Landing on shallow flowing water - 0x00010000, // Landing on any other type of ground - }; - - if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) - { - u8 i; - - for (i = 0; i < 6; i++) - { - if (metatileFuncs[i](mapObj->mapobj_unk_1E)) - { - *flags |= jumpLandingFlags[i]; - return; - } - } - } -} - -u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - - // ceil div by tile width? - s16 width = (info->width + 8) >> 4; - s16 height = (info->height + 8) >> 4; - s16 i; - s16 j; - u8 result; - u8 b; - s16 one; - -#define RETURN_REFLECTION_TYPE_AT(x, y) \ - b = MapGridGetMetatileBehaviorAt(x, y); \ - result = GetReflectionTypeByMetatileBehavior(b); \ - if (result != 0) \ - return result; - - for (i = 0, one = 1; i < height; i++) - { - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i) - for (j = 1; j < width; j++) - { - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i) - RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i) - } - } - return 0; - -#undef RETURN_REFLECTION_TYPE_AT -} - -u8 GetReflectionTypeByMetatileBehavior(u32 behavior) -{ - if (MetatileBehavior_IsIce(behavior)) - return 1; - else if (MetatileBehavior_IsReflective(behavior)) - return 2; - else - return 0; -} - -u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) -{ - static bool8 (*const unknown_08376040[])(u8) = { - MetatileBehavior_IsJumpSouth, - MetatileBehavior_IsJumpNorth, - MetatileBehavior_IsJumpWest, - MetatileBehavior_IsJumpEast, - }; - - u8 b; - u8 index = z; - - if (index == 0) - return 0; - else if (index > 4) - index -= 4; - - index--; - b = MapGridGetMetatileBehaviorAt(x, y); - - if (unknown_08376040[index](b) == 1) - return index + 1; - - return 0; -} - -void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_4) - return; - - if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) - return; - - if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F)) - return; - - sprite->subspriteTableNum = 4; - - if (ZCoordToPriority(mapObj->elevation) == 1) - sprite->subspriteTableNum = 5; -} - -bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) -{ - u8 mapZ; - - if (z == 0) - return FALSE; - - mapZ = MapGridGetZCoordAt(x, y); - - if (mapZ == 0 || mapZ == 0xF) - return FALSE; - - if (mapZ != z) - return TRUE; - - return FALSE; -} - -static const u8 sUnknown_08376050[] = { - 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 -}; - -// Each byte corresponds to a sprite priority for a field object. -// This is directly the inverse of gFieldObjectPriorities_08376070. -static const u8 sFieldObjectPriorities_08376060[] = { - 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 -}; - -// Each byte corresponds to a sprite priority for a field object. -// This is the inverse of gFieldObjectPriorities_08376060. -// 1 = Above player sprite -// 2 = Below player sprite -static const u8 sFieldObjectPriorities_08376070[] = { - 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, -}; - -void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_26) - return; - - FieldObjectUpdateZCoord(mapObj); - - sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation]; - sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation]; -} - -void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) -{ - sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z]; - sprite->oam.priority = sFieldObjectPriorities_08376060[z]; -} - -u8 ZCoordToPriority(u8 z) -{ - return sFieldObjectPriorities_08376060[z]; -} - -void FieldObjectUpdateZCoord(struct MapObject *mapObj) -{ - u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y); - u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y); - - if (z == 0xF || z2 == 0xF) - return; - - mapObj->mapobj_unk_0B_0 = z; - - if (z != 0 && z != 0xF) - mapObj->elevation = z; -} - -void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) -{ - s32 tmp = sprite->centerToCornerVecY; - u32 tmpa = *(u16 *)&sprite->pos1.y; - u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; - s32 tmp2 = (tmpa - tmp) + tmpb; - u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; - sprite->subpriority = tmp3 + sUnknown_08376050[a] + b; -} - -void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite) -{ - if (mapObj->mapobj_bit_26) - return; - - SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); -} - -bool8 AreZCoordsCompatible(u8 a, u8 b) -{ - if (a == 0 || b == 0) - return TRUE; - - if (a != b) - return FALSE; - - return TRUE; -} - -void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 1; - FieldEffectStart(FLDEFF_TALL_GRASS); -} - -void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 0; - FieldEffectStart(FLDEFF_TALL_GRASS); -} - -void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 1; - FieldEffectStart(FLDEFF_LONG_GRASS); -} - -void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; - gFieldEffectArguments[5] = mapObj->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; - gFieldEffectArguments[7] = 0; - FieldEffectStart(FLDEFF_LONG_GRASS); -} - -void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) -{ - SetUpReflection(mapObj, sprite, 0); -} - -void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite) -{ - SetUpReflection(mapObj, sprite, 1); -} - -void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); -} - -static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { - nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, -}; - -void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - gUnknown_08376080[info->tracks](mapObj, sprite, 0); -} - -void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); - gUnknown_08376080[info->tracks](mapObj, sprite, 1); -} - -static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ -} - -static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ - // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) - u16 sandFootprints_FieldEffectData[2] = { - FLDEFF_SAND_FOOTPRINTS, - FLDEFF_DEEP_SAND_FOOTPRINTS - }; - - gFieldEffectArguments[0] = mapObj->coords3.x; - gFieldEffectArguments[1] = mapObj->coords3.y; - gFieldEffectArguments[2] = 149; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = mapObj->mapobj_unk_18; - FieldEffectStart(sandFootprints_FieldEffectData[a]); -} - -static void DoTracksGroundEffect_BikeTireTracks( - struct MapObject *mapObj, struct Sprite *sprite, u8 a) -{ - // Specifies which bike track shape to show next. - // For example, when the bike turns from up to right, it will show - // a track that curves to the right. - // Each 4-byte row corresponds to the initial direction of the bike, and - // each byte in that row is for the next direction of the bike in the order - // of down, up, left, right. - static const u8 bikeTireTracks_Transitions[4][4] = { - 1, 2, 7, 8, - 1, 2, 6, 5, - 5, 8, 3, 4, - 6, 7, 3, 4, - }; - - if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) - { - gFieldEffectArguments[0] = mapObj->coords3.x; - gFieldEffectArguments[1] = mapObj->coords3.y; - gFieldEffectArguments[2] = 149; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = - bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; - FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); - } -} - -void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite) -{ - DoRippleFieldEffect(mapObj, sprite); -} - -void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj); -} - -void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj); -} - -void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - u8 spriteId; - - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); - - spriteId = sub_8126FF0( - mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y); - - if (spriteId == MAX_SPRITES) - GroundEffect_SpawnOnTallGrass(mapObj, sprite); -} - -void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = 2; - FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); -} - -void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); -} - -void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); -} - -void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - gFieldEffectArguments[2] = mapObj->elevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_DUST); -} - -void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj); -} - -void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite) -{ - oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj); -} - -void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = mapObj->coords2.x; - gFieldEffectArguments[1] = mapObj->coords2.y; - FieldEffectStart(FLDEFF_BUBBLES); -} - -static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { - GroundEffect_SpawnOnTallGrass, - sub_8063E94, - sub_8063EE0, - sub_8063F2C, - GroundEffect_WaterReflection, - GroundEffect_IceReflection, - GroundEffect_FlowingWater, - sub_8063FA0, - sub_8063FCC, - GroundEffect_Ripple, - GroundEffect_StepOnPuddle, - GroundEffect_SandPile, - GroundEffect_JumpOnTallGrass, - GroundEffect_JumpOnLongGrass, - GroundEffect_JumpOnShallowWater, - GroundEffect_JumpOnWater, - GroundEffect_JumpLandingDust, - GroundEffect_ShortGrass, - GroundEffect_HotSprings, - GroundEffect_Seaweed -}; - -void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1) - if (flags & 1) - gUnknown_083760A0[i](mapObj, sprite); -} - -void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags) -{ - if (mapObj->mapobj_bit_4) - { - mapObj->mapobj_bit_18 = 0; - mapObj->mapobj_bit_20 = 0; - mapObj->mapobj_bit_19 = 0; - mapObj->mapobj_bit_21 = 0; - *flags &= 0xFFF9F7BD; - } -} - -void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags) -{ - if (mapObj->mapobj_bit_5) - *flags &= 0xFFFFFBFF; -} - -void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_2) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnSpawn(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_2 = 0; - mapObj->mapobj_bit_4 = 0; - } -} - -void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_2) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - filters_out_some_ground_effects(mapObj, &flags); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_2 = 0; - mapObj->mapobj_bit_4 = 0; - } -} - -void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite) -{ - u32 flags; - - if (mapObj->mapobj_bit_3) - { - flags = 0; - FieldObjectUpdateZCoordAndPriority(mapObj, sprite); - GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags); - FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); - FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags); - sub_8064218(mapObj, sprite, flags); - mapObj->mapobj_bit_3 = 0; - mapObj->mapobj_bit_5 = 0; - } -} - -typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); - -void Step1(struct Sprite *sprite, u8 dir); -void Step2(struct Sprite *sprite, u8 dir); -void Step3(struct Sprite *sprite, u8 dir); -void Step4(struct Sprite *sprite, u8 dir); -void Step8(struct Sprite *sprite, u8 dir); - -const SpriteStepFunc Unknown_83760F0[] = { - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1 -}; - -const SpriteStepFunc Unknown_8376130[] = { - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, - Step2 -}; - -const SpriteStepFunc Unknown_8376150[] = { - Step2, - Step3, - Step3, - Step2, - Step3, - Step3 -}; - -const SpriteStepFunc Unknown_8376168[] = { - Step4, - Step4, - Step4, - Step4 -}; - -const SpriteStepFunc Unknown_8376178[] = { - Step8, - Step8 -}; - -const SpriteStepFunc *const gUnknown_08376180[] = { - Unknown_83760F0, - Unknown_8376130, - Unknown_8376150, - Unknown_8376168, - Unknown_8376178 -}; - -const s16 gUnknown_08376194[] = { - 16, 8, 6, 4, 2 -}; - -const s8 Unknown_837619E[] = { - -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0 -}; - -const s8 Unknown_83761AE[] = { - 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0 -}; - -const s8 Unknown_83761BE[] = { - -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0 -}; - -const s8 *const gUnknown_083761D0[] = { - Unknown_837619E, - Unknown_83761AE, - Unknown_83761BE -}; - -bool8 FreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) - { - return TRUE; - } - else - { - mapObject->mapobj_bit_8 = 1; - mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; - mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; - gSprites[mapObject->spriteId].animPaused = 1; - gSprites[mapObject->spriteId].affineAnimPaused = 1; - return FALSE; - } -} - -void FreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < 16; i++) - if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void FreezeMapObjectsExceptOne(u8 a1) -{ - u8 i; - for (i = 0; i < 16; i++) - if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void UnfreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->active && mapObject->mapobj_bit_8) - { - mapObject->mapobj_bit_8 = 0; - gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; - gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; - } -} - -void UnfreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < 16; i++) - if (gMapObjects[i].active) - UnfreezeMapObject(&gMapObjects[i]); -} - -void Step1(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += gDirectionToVector[dir].x; - sprite->pos1.y += gDirectionToVector[dir].y; -} - -void Step2(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y; -} - -void Step3(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y; -} - -void Step4(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y; -} - -void Step8(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x; - sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y; -} - -void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = 0; -} - -bool8 obj_npc_ministep(struct Sprite *sprite) -{ - if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]]) - return FALSE; - - gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); - - sprite->data[5]++; - - if (sprite->data[5] < gUnknown_08376194[sprite->data[4]]) - return FALSE; - - return TRUE; -} - -void sub_806467C(struct Sprite *sprite, u8 a2) -{ - sprite->data[3] = a2; - sprite->data[4] = 0; - sprite->data[5] = 0; -} - -bool8 sub_806468C(struct Sprite *sprite) -{ - if (!(sprite->data[4] & 1)) - { - Step1(sprite, sprite->data[3]); - sprite->data[5]++; - } - - sprite->data[4]++; - - if (sprite->data[5] > 15) - return TRUE; - else - return FALSE; -} - -s16 sub_80646C8(s16 a1, u8 a2) -{ - return gUnknown_083761D0[a2][a1]; -} - -void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) -{ - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = a4; - sprite->data[6] = 0; -} - -u8 sub_8064704(struct Sprite *sprite) -{ - s16 v5[3] = {0x10, 0x10, 0x20}; - u8 v6[3] = {0, 0, 1}; - u8 v2 = 0; - - if (sprite->data[4]) - Step1(sprite, sprite->data[3]); - - sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); - - sprite->data[6]++; - - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; - - if (sprite->data[6] >= v5[sprite->data[4]]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -u8 sub_806478C(struct Sprite *sprite) -{ - s16 v5[3] = {0x20, 0x20, 0x40}; - u8 v6[3] = {1, 1, 2}; - u8 v2 = 0; - - if (sprite->data[4] && !(sprite->data[6] & 1)) - Step1(sprite, sprite->data[3]); - - sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); - - sprite->data[6]++; - - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; - - if (sprite->data[6] >= v5[sprite->data[4]]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -void sub_8064820(struct Sprite *sprite, s16 a2) -{ - sprite->data[3] = a2; -} - -bool8 sub_8064824(struct Sprite *sprite) -{ - sprite->data[3]--; - - if (sprite->data[3] == 0) - return TRUE; - else - return FALSE; -} - -void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->animNum = a2; - sprite->animPaused = 0 ; - SeekSpriteAnim(sprite, a3); -} - -bool8 sub_8064864(struct Sprite *sprite) -{ - if (sprite->animEnded) - return TRUE; - else - return FALSE; -} - -void sub_806487C(struct Sprite *sprite, bool8 invisible) -{ - u16 x, y; - s16 x2, y2; - - sprite->invisible = invisible; - - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - - x2 = x - (sprite->centerToCornerVecX >> 1); - y2 = y - (sprite->centerToCornerVecY >> 1); - - if ((s16)x > 255 || x2 < -16) - sprite->invisible = 1; - if ((s16)y > 175 || y2 < -16) - sprite->invisible = 1; -} - -void sub_8064970(struct Sprite *sprite) -{ - SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); - sub_806487C(sprite, 0); -} - -void sub_8064990(u8 a1, u8 dir) -{ - u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1) - { - u8 animNum = FieldObjectDirectionToImageAnimId(dir); - StartSpriteAnim(sprite, animNum); - break; - } - } -} - -u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - return FieldEffectStart(fieldEffectId); -} - -void DoShadowFieldEffect(struct MapObject *mapObject) -{ - if (!mapObject->mapobj_bit_22) - { - mapObject->mapobj_bit_22 = 1; - oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); - } -} - -void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - gFieldEffectArguments[0] = sprite->pos1.x; - gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; - gFieldEffectArguments[2] = 151; - gFieldEffectArguments[3] = 3; - FieldEffectStart(FLDEFF_RIPPLE); -} diff --git a/src/field/field_camera.c b/src/field/field_camera.c deleted file mode 100644 index 8384ad8d1..000000000 --- a/src/field/field_camera.c +++ /dev/null @@ -1,496 +0,0 @@ -#include "global.h" -#include "field_camera.h" -#include "berry.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "rotating_gate.h" -#include "sprite.h" -#include "text.h" - -EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE; - -struct UnknownStruct -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; - bool8 unk4; -}; - -static struct UnknownStruct gUnknown_03000590; -static u16 gUnknown_03000598; -static s16 gUnknown_0300059A; -static u8 gUnknown_0300059C; -static void (*gUnknown_030005A0)(void); - -struct CameraSomething gUnknown_03004880; -u16 gUnknown_03004898; -u16 gUnknown_0300489C; - -static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData); -static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData); -static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData); -static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData); -static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y); - -static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData); -static void DrawMetatileAt(struct MapData *mapData, u16, int, int); -static void DrawMetatile(s32 a, u16 *b, u16 c); -static void CameraPanningCB_PanAhead(void); - -static void move_tilemap_camera_to_upper_left_corner_(struct UnknownStruct *a) -{ - a->unk2 = 0; - a->unk3 = 0; - a->unk0 = 0; - a->unk1 = 0; - a->unk4 = TRUE; -} - -static void tilemap_move_something(struct UnknownStruct *a, u32 b, u32 c) -{ - a->unk2 += b; - a->unk2 %= 32; - a->unk3 += c; - a->unk3 %= 32; -} - -static void coords8_add(struct UnknownStruct *a, u32 b, u32 c) -{ - a->unk0 += b; - a->unk1 += c; -} - -void move_tilemap_camera_to_upper_left_corner(void) -{ - move_tilemap_camera_to_upper_left_corner_(&gUnknown_03000590); - CpuFill16(0, gBGTilemapBuffers[2], 0x800); - CpuFill16(0, gBGTilemapBuffers[1], 0x800); - CpuFill16(0x3014, gBGTilemapBuffers[3], 0x800); -} - -void sub_8057A58(void) -{ - *gBGHOffsetRegs[1] = gUnknown_03000590.unk0 + gUnknown_03000598; - *gBGVOffsetRegs[1] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; - *gBGHOffsetRegs[2] = gUnknown_03000590.unk0 + gUnknown_03000598; - *gBGVOffsetRegs[2] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; - *gBGHOffsetRegs[3] = gUnknown_03000590.unk0 + gUnknown_03000598; - *gBGVOffsetRegs[3] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; - - if (gUnknown_03000590.unk4) - { - DmaCopy16(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800); - DmaCopy16(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800); - DmaCopy16(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800); - gUnknown_03000590.unk4 = FALSE; - } -} - -void sub_8057B14(u16 *a, u16 *b) -{ - *a = gUnknown_03000590.unk0 + gUnknown_03000598; - *b = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; -} - -void DrawWholeMapView(void) -{ - DrawWholeMapViewInternal(gSaveBlock1.pos.x, gSaveBlock1.pos.y, gMapHeader.mapData); - gUnknown_03000590.unk4 = TRUE; -} - -static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData) -{ - u8 i; - u8 j; - u32 r6; - u8 temp; - - for (i = 0; i < 32; i += 2) - { - temp = gUnknown_03000590.unk3 + i; - if (temp >= 32) - temp -= 32; - r6 = temp * 32; - for (j = 0; j < 32; j += 2) - { - temp = gUnknown_03000590.unk2 + j; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, r6 + temp, x + j / 2, y + i / 2); - } - } -} - -static void RedrawMapSlicesForCameraUpdate(struct UnknownStruct *a, int x, int y) -{ - struct MapData *mapData = gMapHeader.mapData; - - if (x > 0) - RedrawMapSliceWest(a, mapData); - if (x < 0) - RedrawMapSliceEast(a, mapData); - if (y > 0) - RedrawMapSliceNorth(a, mapData); - if (y < 0) - RedrawMapSliceSouth(a, mapData); - a->unk4 = TRUE; -} - -static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData) -{ - u8 i; - u8 temp; - u32 r7; - - temp = a->unk3 + 28; - if (temp >= 32) - temp -= 32; - r7 = temp * 32; - for (i = 0; i < 32; i += 2) - { - temp = a->unk2 + i; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y + 14); - } -} - -static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData) -{ - u8 i; - u8 temp; - u32 r7 = a->unk3 * 32; - - for (i = 0; i < 32; i += 2) - { - temp = a->unk2 + i; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y); - } -} - -static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData) -{ - u8 i; - u8 temp; - u32 r6 = a->unk2; - - for (i = 0; i < 32; i += 2) - { - temp = a->unk3 + i; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, temp * 32 + r6, gSaveBlock1.pos.x, gSaveBlock1.pos.y + i / 2); - } -} - -static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData) -{ - u8 i; - u8 temp; - u8 r5 = a->unk2 + 28; - - if (r5 >= 32) - r5 -= 32; - for (i = 0; i < 32; i += 2) - { - temp = a->unk3 + i; - if (temp >= 32) - temp -= 32; - DrawMetatileAt(mapData, temp * 32 + r5, gSaveBlock1.pos.x + 14, gSaveBlock1.pos.y + i / 2); - } -} - -void CurrentMapDrawMetatileAt(int a, int b) -{ - int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, a, b); - - if (offset >= 0) - { - DrawMetatileAt(gMapHeader.mapData, offset, a, b); - gUnknown_03000590.unk4 = TRUE; - } -} - -void DrawDoorMetatileAt(int x, int y, u16 *arr) -{ - int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, x, y); - - if (offset >= 0) - { - DrawMetatile(1, arr, offset); - gUnknown_03000590.unk4 = TRUE; - } -} - -static void DrawMetatileAt(struct MapData *mapData, u16 b, int c, int d) -{ - u16 metatileId = MapGridGetMetatileIdAt(c, d); - u16 *metatiles; - - if (metatileId > 1024) - metatileId = 0; - if (metatileId < 512) - metatiles = mapData->primaryTileset->metatiles; - else - { - metatiles = mapData->secondaryTileset->metatiles; - metatileId -= 512; - } - DrawMetatile(MapGridGetMetatileLayerTypeAt(c, d), metatiles + metatileId * 8, b); -} - -static void DrawMetatile(s32 a, u16 *b, u16 c) -{ - switch (a) - { - case 2: - gBGTilemapBuffers[3][c] = b[0]; - gBGTilemapBuffers[3][c + 1] = b[1]; - gBGTilemapBuffers[3][c + 0x20] = b[2]; - gBGTilemapBuffers[3][c + 0x21] = b[3]; - - gBGTilemapBuffers[2][c] = 0; - gBGTilemapBuffers[2][c + 1] = 0; - gBGTilemapBuffers[2][c + 0x20] = 0; - gBGTilemapBuffers[2][c + 0x21] = 0; - - gBGTilemapBuffers[1][c] = b[4]; - gBGTilemapBuffers[1][c + 1] = b[5]; - gBGTilemapBuffers[1][c + 0x20] = b[6]; - gBGTilemapBuffers[1][c + 0x21] = b[7]; - break; - case 1: - gBGTilemapBuffers[3][c] = b[0]; - gBGTilemapBuffers[3][c + 1] = b[1]; - gBGTilemapBuffers[3][c + 0x20] = b[2]; - gBGTilemapBuffers[3][c + 0x21] = b[3]; - - gBGTilemapBuffers[2][c] = b[4]; - gBGTilemapBuffers[2][c + 1] = b[5]; - gBGTilemapBuffers[2][c + 0x20] = b[6]; - gBGTilemapBuffers[2][c + 0x21] = b[7]; - - gBGTilemapBuffers[1][c] = 0; - gBGTilemapBuffers[1][c + 1] = 0; - gBGTilemapBuffers[1][c + 0x20] = 0; - gBGTilemapBuffers[1][c + 0x21] = 0; - break; - case 0: - gBGTilemapBuffers[3][c] = 0x3014; - gBGTilemapBuffers[3][c + 1] = 0x3014; - gBGTilemapBuffers[3][c + 0x20] = 0x3014; - gBGTilemapBuffers[3][c + 0x21] = 0x3014; - - gBGTilemapBuffers[2][c] = b[0]; - gBGTilemapBuffers[2][c + 1] = b[1]; - gBGTilemapBuffers[2][c + 0x20] = b[2]; - gBGTilemapBuffers[2][c + 0x21] = b[3]; - - gBGTilemapBuffers[1][c] = b[4]; - gBGTilemapBuffers[1][c + 1] = b[5]; - gBGTilemapBuffers[1][c + 0x20] = b[6]; - gBGTilemapBuffers[1][c + 0x21] = b[7]; - break; - } -} - -static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y) -{ - x -= gSaveBlock1.pos.x; - x *= 2; - if (x >= 32 || x < 0) - return -1; - x = x + a->unk2; - if (x >= 32) - x -= 32; - - y = (y - gSaveBlock1.pos.y) * 2; - if (y >= 32 || y < 0) - return -1; - y = y + a->unk3; - if (y >= 32) - y -= 32; - - return y * 32 + x; -} - -static void CameraUpdateCallback(struct CameraSomething *a) -{ - if (a->unk4 != 0) - { - a->unk8 = gSprites[a->unk4].data[2]; - a->unkC = gSprites[a->unk4].data[3]; - } -} - -void ResetCameraUpdateInfo(void) -{ - gUnknown_03004880.unk8 = 0; - gUnknown_03004880.unkC = 0; - gUnknown_03004880.unk10 = 0; - gUnknown_03004880.unk14 = 0; - gUnknown_03004880.unk4 = 0; - gUnknown_03004880.callback = NULL; -} - -u32 InitCameraUpdateCallback(u8 a) -{ - if (gUnknown_03004880.unk4 != 0) - DestroySprite(&gSprites[gUnknown_03004880.unk4]); - gUnknown_03004880.unk4 = AddCameraObject(a); - gUnknown_03004880.callback = CameraUpdateCallback; - return 0; -} - -void CameraUpdate(void) -{ - int deltaX; - int deltaY; - int r0; - int r1; - int r7; - int r8; - - if (gUnknown_03004880.callback != NULL) - gUnknown_03004880.callback(&gUnknown_03004880); - r7 = gUnknown_03004880.unk8; - r8 = gUnknown_03004880.unkC; - deltaX = 0; - deltaY = 0; - r1 = gUnknown_03004880.unk10; - r0 = gUnknown_03004880.unk14; - - - if (r1 == 0 && r7 != 0) - { - if (r7 > 0) - deltaX = 1; - else - deltaX = -1; - } - if (r0 == 0 && r8 != 0) - { - if (r8 > 0) - deltaY = 1; - else - deltaY = -1; - } - if (r1 != 0 && r1 == -r7) - { - if (r7 > 0) - deltaX = 1; - else - deltaX = -1; - } - if (r0 != 0 && r0 == -r8) - { - if (r8 > 0) - deltaX = 1; - else - deltaX = -1; - } - - gUnknown_03004880.unk10 += r7; - gUnknown_03004880.unk10 = gUnknown_03004880.unk10 - 16 * (gUnknown_03004880.unk10 / 16); - gUnknown_03004880.unk14 += r8; - gUnknown_03004880.unk14 = gUnknown_03004880.unk14 - 16 * (gUnknown_03004880.unk14 / 16); - - if (deltaX != 0 || deltaY != 0) - { - CameraMove(deltaX, deltaY); - UpdateFieldObjectsForCameraUpdate(deltaX, deltaY); - RotatingGatePuzzleCameraUpdate(deltaX, deltaY); - ResetBerryTreeSparkleFlags(); - tilemap_move_something(&gUnknown_03000590, deltaX * 2, deltaY * 2); - RedrawMapSlicesForCameraUpdate(&gUnknown_03000590, deltaX * 2, deltaY * 2); - } - - coords8_add(&gUnknown_03000590, r7, r8); - gUnknown_0300489C -= r7; - gUnknown_03004898 -= r8; -} - -void camera_move_and_redraw(int a, int b) -{ - CameraMove(a, b); - UpdateFieldObjectsForCameraUpdate(a, b); - DrawWholeMapView(); - gUnknown_0300489C -= a * 16; - gUnknown_03004898 -= b * 16; -} - -void SetCameraPanningCallback(void (*a)(void)) -{ - gUnknown_030005A0 = a; -} - -void SetCameraPanning(s16 a, s16 b) -{ - gUnknown_03000598 = a; - gUnknown_0300059A = b + 32; -} - -void InstallCameraPanAheadCallback(void) -{ - gUnknown_030005A0 = CameraPanningCB_PanAhead; - gUnknown_0300059C = 0; - gUnknown_03000598 = 0; - gUnknown_0300059A = 32; -} - -void UpdateCameraPanning(void) -{ - if (gUnknown_030005A0 != NULL) - gUnknown_030005A0(); - //Update sprite offset of overworld objects - gSpriteCoordOffsetX = gUnknown_0300489C - gUnknown_03000598; - gSpriteCoordOffsetY = gUnknown_03004898 - gUnknown_0300059A - 8; -} - -static void CameraPanningCB_PanAhead(void) -{ - u8 var; - - if (gUnusedBikeCameraAheadPanback == FALSE) - { - InstallCameraPanAheadCallback(); - } - else - { - // this code is never reached. - if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) - { - gUnknown_0300059C ^= 1; - if (gUnknown_0300059C == 0) - return; - } - else - { - gUnknown_0300059C = 0; - } - - var = player_get_direction_upper_nybble(); - if (var == 2) - { - if (gUnknown_0300059A > -8) - gUnknown_0300059A -= 2; - } - else if (var == 1) - { - if (gUnknown_0300059A < 72) - gUnknown_0300059A += 2; - } - else if (gUnknown_0300059A < 32) - { - gUnknown_0300059A += 2; - } - else if (gUnknown_0300059A > 32) - { - gUnknown_0300059A -= 2; - } - } -} diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c deleted file mode 100644 index 3ae422512..000000000 --- a/src/field/field_control_avatar.c +++ /dev/null @@ -1,934 +0,0 @@ -#include "global.h" -#include "field_control_avatar.h" -#include "battle_setup.h" -#include "bike.h" -#include "coord_event_weather.h" -#include "daycare.h" -#include "debug.h" -#include "event_data.h" -#include "field_fadetransition.h" -#include "field_player_avatar.h" -#include "field_poison.h" -#include "field_specials.h" -#include "fieldmap.h" -#include "constants/flags.h" -#include "item_menu.h" -#include "metatile_behavior.h" -#include "overworld.h" -#include "safari_zone.h" -#include "script.h" -#include "secret_base.h" -#include "constants/songs.h" -#include "sound.h" -#include "start_menu.h" -#include "trainer_see.h" -#include "constants/vars.h" -#include "wild_encounter.h" - -struct Coords32 -{ - s32 x; - s32 y; -}; - -extern u16 gSpecialVar_LastTalked; -extern u16 gSpecialVar_Facing; -extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u8 gUnknown_020297ED; - -static EWRAM_DATA u8 gUnknown_0202E8C0 = 0; -static EWRAM_DATA u16 gUnknown_0202E8C2 = 0; - -u8 gSelectedMapObject; - -//scripts -extern u8 gUnknown_081A2C51[]; -extern u8 gUnknown_0815281E[]; -extern u8 gUnknown_08152C39[]; -extern u8 gUnknown_0815F36C[]; -extern u8 gUnknown_0815F43A[]; -extern u8 gUnknown_081A0009[]; -extern u8 gUnknown_081C6C02[]; -extern u8 HiddenItemScript[]; -extern u8 Event_TV[]; -extern u8 gUnknown_081A0009[]; -extern u8 ClosedSootopolisGymDoorScript[]; -extern u8 gUnknown_081A4363[]; -extern u8 gUnknown_081C346A[]; -extern u8 gUnknown_081616E1[]; -extern u8 Event_WorldMap[]; -extern u8 S_RunningShoesManual[]; -extern u8 PictureBookShelfScript[]; -extern u8 BookshelfScript[]; -extern u8 PokemonCenterBookshelfScript[]; -extern u8 VaseScript[]; -extern u8 TrashCanScript[]; -extern u8 ShopShelfScript[]; -extern u8 BlueprintScript[]; -extern u8 gUnknown_0815F36C[]; -extern u8 gUnknown_0815F43A[]; -extern u8 gUnknown_0815F523[]; -extern u8 gUnknown_0815F528[]; -extern u8 UseSurfScript[]; -extern u8 S_UseWaterfall[]; -extern u8 S_CannotUseWaterfall[]; -extern u8 UseDiveScript[]; -extern u8 S_UseDiveUnderwater[]; -extern u8 S_FallDownHole[]; -extern u8 gUnknown_081A14B8[]; -extern u8 S_EggHatch[]; -extern u8 gUnknown_0815FD0D[]; -extern u8 gUnknown_081C6BDE[]; - -static void player_get_pos_to_and_height(struct MapPosition *); -static void player_get_next_pos_and_height(struct MapPosition *); -static u16 cur_mapdata_block_role_at_player_pos(int); -static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c); -static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c); -static u8 *sub_8068364(struct MapPosition *, u8, u8); -static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *, u8, u8 c); -static u8 *sub_8068500(struct MapPosition *, u8, u8); -static u8 *TryGetFieldMoveScript(struct MapPosition *, u8, u8); -static bool32 sub_8068770(void); -static bool32 sub_80687A4(void); -static bool8 sub_80687E4(struct MapPosition *, u16, u16); -static void happiness_algorithm_step(void); -static bool8 overworld_poison_step(void); -static bool8 is_it_battle_time_3(u16); -static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); -static bool8 sub_8068B30(u16); -static bool8 is_non_stair_warp_tile(u16, u8); -static s8 map_warp_check_packed(struct MapHeader *, struct MapPosition *); -static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *); -static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); -static s8 map_warp_check(struct MapHeader *, u16, u16, u8); -static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8); -static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);; - -void FieldClearPlayerInput(struct FieldInput *input) -{ - input->pressedAButton = 0; - input->input_field_0_1 = 0; - input->pressedStartButton = 0; - input->pressedSelectButton = 0; - input->input_field_0_4 = 0; - input->input_field_0_5 = 0; - input->input_field_0_6 = 0; - input->pressedBButton = 0; - input->input_field_1_0 = 0; - input->input_field_1_1 = 0; - input->input_field_1_2 = 0; - input->input_field_1_3 = 0; - input->dpadDirection = 0; -} - -void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) -{ - u8 r6 = gPlayerAvatar.tileTransitionState; - u8 r9 = gPlayerAvatar.runningState; - bool8 forcedMove = MetatileBehavior_IsMoveTile(cur_mapdata_block_role_at_player_pos(r9)); - - if ((r6 == 2 && forcedMove == FALSE) || r6 == 0) - { - if (GetPlayerSpeed() != 4) - { - if (newKeys & START_BUTTON) - input->pressedStartButton = TRUE; - if (newKeys & SELECT_BUTTON) - input->pressedSelectButton = TRUE; - if (newKeys & A_BUTTON) - input->pressedAButton = TRUE; - if (newKeys & B_BUTTON) - input->pressedBButton = TRUE; - } - if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT)) - { - input->input_field_0_4 = TRUE; - input->input_field_0_5 = TRUE; - } - } - if (forcedMove == FALSE) - { - if (r6 == 2 && r9 == 2) - input->input_field_0_6 = TRUE; - if (forcedMove == FALSE && r6 == 2) - input->input_field_0_1 = TRUE; - } - if (heldKeys & DPAD_UP) - input->dpadDirection = DIR_NORTH; - else if (heldKeys & DPAD_DOWN) - input->dpadDirection = DIR_SOUTH; - else if (heldKeys & DPAD_LEFT) - input->dpadDirection = DIR_WEST; - else if (heldKeys & DPAD_RIGHT) - input->dpadDirection = DIR_EAST; -#if DEBUG - if ((heldKeys & R_BUTTON) && input->pressedStartButton) - { - input->input_field_1_2 = TRUE; - input->pressedStartButton = FALSE; - } - if (gUnknown_020297ED) - { - if (heldKeys & R_BUTTON) - { - input->input_field_1_1 = TRUE; - input->input_field_0_6 = FALSE; - input->input_field_0_1 = FALSE; - input->input_field_0_4 = FALSE; - input->input_field_0_5 = FALSE; - if (newKeys & SELECT_BUTTON) - { - input->input_field_1_0 = TRUE; - input->pressedSelectButton = FALSE; - } - } - if (heldKeys & L_BUTTON) - input->input_field_1_3 = TRUE; - } -#endif -} - -int sub_8068024(struct FieldInput *input) -{ - struct MapPosition position; - u8 r6; - u16 r4; - - r6 = player_get_direction_lower_nybble(); - player_get_pos_to_and_height(&position); - r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); -#if DEBUG - if (input->input_field_1_3 && dive_warp(&position, r4) == TRUE) - return TRUE; -#endif - - if ( -#if DEBUG - !input->input_field_1_1 && -#endif - CheckTrainers() == TRUE) - return TRUE; - - if ( -#if DEBUG - !input->input_field_1_1 && -#endif - mapheader_run_first_tag2_script_list_match() == 1) - return TRUE; - - if (input->pressedBButton && sub_80687A4() == 1) - return TRUE; - if (input->input_field_0_6) - { - IncrementGameStat(GAME_STAT_STEPS); - if (sub_80687E4(&position, r4, r6) == 1) - return TRUE; - } - if (input->input_field_0_1 && is_it_battle_time_3(r4) == 1) - return TRUE; - if (input->input_field_0_4 && input->dpadDirection == r6) - { - if (mapheader_run_first_tag2_script_list_match_conditionally(&position, r4, r6) == 1) - return TRUE; - } - player_get_next_pos_and_height(&position); - r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (input->pressedAButton && sub_80681F0(&position, r4, r6) == 1) - return TRUE; - if (input->input_field_0_5 && input->dpadDirection == r6) - { - if (map_warp_consider_2_to_inside(&position, r4, r6) == 1) - return TRUE; - } - if (input->pressedAButton && sub_8068770() == 1) - return TRUE; - if (input->pressedStartButton) - { - PlaySE(SE_WIN_OPEN); - sub_8071310(); - return TRUE; - } - if (input->pressedSelectButton && sub_80A6D1C() == TRUE) - return TRUE; - -#if DEBUG - if (input->input_field_1_0) - { - debug_sub_80888D8(); - return TRUE; - } - if (input->input_field_1_2) - { - PlaySE(SE_WIN_OPEN); - DebugMenu_8077048(); - return TRUE; - } -#endif - - return FALSE; -} - -static void player_get_pos_to_and_height(struct MapPosition *position) -{ - PlayerGetDestCoords(&position->x, &position->y); - position->height = PlayerGetZCoord(); -} - -static void player_get_next_pos_and_height(struct MapPosition *position) -{ - s16 x, y; - - GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y); - PlayerGetDestCoords(&x, &y); - if (MapGridGetZCoordAt(x, y) != 0) - position->height = PlayerGetZCoord(); - else - position->height = 0; -} - -static u16 cur_mapdata_block_role_at_player_pos(int unused) -{ - s16 x, y; - - PlayerGetDestCoords(&x, &y); - return MapGridGetMetatileBehaviorAt(x, y); -} - -static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c) -{ - u8 *script = TryGetScriptOnPressingA(position, b, c); - - if (script == NULL) - return FALSE; - - if (script != gUnknown_0815281E - && script != gUnknown_08152C39 - && script != gUnknown_0815F36C - && script != gUnknown_0815F43A - && script != gUnknown_081A0009) - PlaySE(5); - - ScriptContext1_SetupScript(script); - return TRUE; -} - -static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c) -{ - u8 *script; - - script = sub_8068364(position, b, c); - if (script != NULL) - return script; - script = TryGetInvisibleMapObjectScript(position, b, c); - if (script != NULL) - return script; - script = sub_8068500(position, b, c); - if (script != NULL) - return script; - script = TryGetFieldMoveScript(position, b, c); - if (script != NULL) - return script; - - return NULL; -} - -u8 *sub_80682A8(struct MapPosition *position, u8 unused, u8 c) -{ - u8 r3; - s32 i; - - if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y))) - r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height); - else - r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height); - if (r3 == 16 || gMapObjects[r3].localId == 0xFF) - return NULL; - for (i = 0; i < 4; i++) - { - if (gLinkPlayerMapObjects[i].active == TRUE && gLinkPlayerMapObjects[i].mapObjId == r3) - return NULL; - } - gSelectedMapObject = r3; - gSpecialVar_LastTalked = gMapObjects[r3].localId; - gSpecialVar_Facing = c; - return GetFieldObjectScriptPointerByFieldObjectId(r3); -} - -static u8 *sub_8068364(struct MapPosition *position, u8 b, u8 c) -{ - u8 r3; - u8 *script; - - r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height); - if (r3 == 16 || gMapObjects[r3].localId == 0xFF) - { - if (MetatileBehavior_IsCounter(b) != TRUE) - return NULL; - r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height); - if (r3 == 16 || gMapObjects[r3].localId == 0xFF) - return NULL; - } - //_080683E8 - gSelectedMapObject = r3; - gSpecialVar_LastTalked = gMapObjects[r3].localId; - gSpecialVar_Facing = c; - script = GetFieldObjectScriptPointerByFieldObjectId(r3); - script = GetRamScript(gSpecialVar_LastTalked, script); - return script; -} - -static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *position, u8 unused, u8 c) -{ - struct BgEvent *bgEvent = FindInvisibleMapObjectByPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); - - if (bgEvent == NULL) - return NULL; - if (bgEvent->bgUnion.script == NULL) - return gUnknown_081C6C02; - switch (bgEvent->kind) - { - case 0: - default: - return bgEvent->bgUnion.script; - case 1: - if (c != 2) - return NULL; - break; - case 2: - if (c != 1) - return NULL; - break; - case 3: - if (c != 4) - return NULL; - break; - case 4: - if (c != 3) - return NULL; - break; - case 5: - case 6: - case 7: - gSpecialVar_0x8004 = ((u32)bgEvent->bgUnion.script >> 16) + FLAG_HIDDEN_ITEMS_START; - gSpecialVar_0x8005 = (u32)bgEvent->bgUnion.script; - if (FlagGet(gSpecialVar_0x8004) == TRUE) - return NULL; - return HiddenItemScript; - case 8: - if (c == 2) - { - gSpecialVar_0x8004 = bgEvent->bgUnion.secretBaseId; - if (sub_80BC050()) - return gUnknown_081A2C51; - } - return NULL; - } - return bgEvent->bgUnion.script; -} - -static u8 *sub_8068500(struct MapPosition *position, u8 b, u8 c) -{ - s8 height; - - if (MetatileBehavior_IsPlayerFacingTVScreen(b, c) == TRUE) - return Event_TV; - if (MetatileBehavior_IsPC(b) == TRUE) - return gUnknown_081A0009; - if (MetatileBehavior_IsClosedSootopolisGymDoor(b) == TRUE) - return ClosedSootopolisGymDoorScript; - if (is_tile_x84(b) == TRUE) - return gUnknown_081A4363; - if (MetatileBehavior_IsPokeblockFeeder(b) == TRUE) - return gUnknown_081C346A; - if (MetatileBehavior_IsTrickHousePuzzleDoor(b) == TRUE) - return gUnknown_081616E1; - if (MetatileBehavior_IsRegionMap(b) == TRUE) - return Event_WorldMap; - if (sub_805791C(b) == TRUE) - return S_RunningShoesManual; - if (MetatileBehavior_IsPictureBookShelf(b) == TRUE) - return PictureBookShelfScript; - if (MetatileBehavior_IsBookShelf(b) == TRUE) - return BookshelfScript; - if (MetatileBehavior_IsPokeCenterBookShelf(b) == TRUE) - return PokemonCenterBookshelfScript; - if (MetatileBehavior_IsVase(b) == TRUE) - return VaseScript; - if (MetatileBehavior_IsTrashCan(b) == TRUE) - return TrashCanScript; - if (MetatileBehavior_IsShopShelf(b) == TRUE) - return ShopShelfScript; - if (MetatileBehavior_IsBlueprint(b) == TRUE) - return BlueprintScript; - height = position->height; - if (height == MapGridGetZCoordAt(position->x, position->y)) - { - if (MetatileBehavior_IsSecretBasePC(b) == TRUE) - return gUnknown_0815F36C; - if (sub_805724C(b) == TRUE) - return gUnknown_0815F43A; - if (sub_8057364(b) == TRUE) - return gUnknown_0815F523; - if (sub_8057378(b) == TRUE) - return gUnknown_0815F528; - } - return NULL; -} - -static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2) -{ - if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) - return UseSurfScript; - if (MetatileBehavior_IsWaterfall(b) == TRUE) - { - if (FlagGet(FLAG_BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) - return S_UseWaterfall; - else - return S_CannotUseWaterfall; - } - return NULL; -} - -static bool32 sub_8068770(void) -{ - if (FlagGet(FLAG_BADGE07_GET) && sub_8068F18() == 2) - { - ScriptContext1_SetupScript(UseDiveScript); - return TRUE; - } - return FALSE; -} - -static bool32 sub_80687A4(void) -{ - if (FlagGet(FLAG_BADGE07_GET) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_8068F18() == 1) - { - ScriptContext1_SetupScript(S_UseDiveUnderwater); - return TRUE; - } - return FALSE; -} - -static bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused) -{ - if (mapheader_trigger_activate_at__run_now(position) == TRUE) - return TRUE; - if (sub_8068A64(position, b) == TRUE) - return TRUE; - if (sub_8068870(b) == TRUE) - return TRUE; - if (sub_8068894() == TRUE) - return TRUE; - if (UpdateRepelCounter() == TRUE) - return TRUE; - return FALSE; -} - -bool8 mapheader_trigger_activate_at__run_now(struct MapPosition *position) -{ - u8 *script = mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height); - - if (script == NULL) - return FALSE; - ScriptContext1_SetupScript(script); - return TRUE; -} - -//can be u8, u16, or u32 -bool8 sub_8068870(u16 a) -{ - if (MetatileBehavior_IsCrackedFloorHole(a)) - { - ScriptContext1_SetupScript(S_FallDownHole); - return TRUE; - } - return FALSE; -} - -bool8 sub_8068894(void) -{ - IncrementRematchStepCounter(); - happiness_algorithm_step(); - if (overworld_poison_step() == TRUE) - { - ScriptContext1_SetupScript(gUnknown_081A14B8); - return TRUE; - } - if (ShouldEggHatch()) - { - IncrementGameStat(GAME_STAT_HATCHED_EGGS); - ScriptContext1_SetupScript(S_EggHatch); - return TRUE; - } - if (SafariZoneTakeStep() == TRUE) - return TRUE; - if (CountSSTidalStep(1) == TRUE) - { - ScriptContext1_SetupScript(gUnknown_0815FD0D); - return TRUE; - } - return FALSE; -} - -void unref_sub_80688F8(void) -{ - VarSet(VAR_HAPPINESS_STEP_COUNTER, 0); -} - -static void happiness_algorithm_step(void) -{ - u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER); - int i; - - (*ptr)++; - (*ptr) %= 128; - if (*ptr == 0) - { - struct Pokemon *pkmn = gPlayerParty; - - for (i = 0; i < 6; i++) - { - AdjustFriendship(pkmn, 5); - pkmn++; - } - } -} - -void overworld_poison_timer_set(void) -{ - VarSet(VAR_POISON_STEP_COUNTER, 0); -} - -static bool8 overworld_poison_step(void) -{ - u16 *ptr; - - if (gMapHeader.mapType != MAP_TYPE_SECRET_BASE) - { - ptr = GetVarPointer(VAR_POISON_STEP_COUNTER); - (*ptr)++; - (*ptr) %= 4; - if (*ptr == 0) - { - switch (DoPoisonFieldEffect()) - { - case 0: - return FALSE; - case 1: - return FALSE; - case 2: - return TRUE; - } - } - } - return FALSE; -} - -void prev_quest_postbuffer_cursor_backup_reset(void) -{ - gUnknown_0202E8C0 = 0; -} - -static bool8 is_it_battle_time_3(u16 a) -{ - if (gUnknown_0202E8C0 < 4) - { - gUnknown_0202E8C0++; - gUnknown_0202E8C2 = a; - return FALSE; - } - if (StandardWildEncounter(a, gUnknown_0202E8C2) == TRUE) - { - gUnknown_0202E8C0 = 0; - gUnknown_0202E8C2 = a; - return TRUE; - } - else - { - gUnknown_0202E8C2 = a; - return FALSE; - } -} - -static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c) -{ - s8 r6 = map_warp_check_packed(&gMapHeader, position); - - if (is_non_stair_warp_tile(b, c) == TRUE && r6 != -1) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sub_8068C30(&gMapHeader, r6, position); - sub_8080E88(); - return TRUE; - } - return FALSE; -} - -bool8 sub_8068A64(struct MapPosition *position, u16 b) -{ - s8 r4 = map_warp_check_packed(&gMapHeader, position); - - if (r4 != -1 && sub_8068B30(b) == TRUE) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sub_8068C30(&gMapHeader, r4, position); - if (MetatileBehavior_IsEscalator(b) == TRUE) - { - sub_8080F2C(b); - return TRUE; - } - if (MetatileBehavior_IsLavaridgeB1FWarp(b) == TRUE) - { - sub_8080F48(); - return TRUE; - } - if (MetatileBehavior_IsLavaridge1FWarp(b) == TRUE) - { - sub_8080F58(); - return TRUE; - } - if (MetatileBehavior_IsAquaHideoutWarp(b) == TRUE) - { - sub_8080F68(); - return TRUE; - } - if (MetatileBehavior_IsMtPyreHole(b) == TRUE) - { - ScriptContext1_SetupScript(gUnknown_081C6BDE); - return TRUE; - } - sub_8080E88(); - return TRUE; - } - return FALSE; -} - -static bool8 sub_8068B30(u16 a) -{ - if (MetatileBehavior_IsWarpDoor(a) != TRUE - && MetatileBehavior_IsLadder(a) != TRUE - && MetatileBehavior_IsEscalator(a) != TRUE - && MetatileBehavior_IsNonAnimDoor(a) != TRUE - && MetatileBehavior_IsLavaridgeB1FWarp(a) != TRUE - && MetatileBehavior_IsLavaridge1FWarp(a) != TRUE - && MetatileBehavior_IsAquaHideoutWarp(a) != TRUE - && MetatileBehavior_IsMtPyreHole(a) != TRUE) - return FALSE; - return TRUE; -} - -static bool8 is_non_stair_warp_tile(u16 a, u8 b) -{ - switch (b) - { - case 2: - return MetatileBehavior_IsNorthArrowWarp(a); - case 1: - return MetatileBehavior_IsSouthArrowWarp(a); - case 3: - return MetatileBehavior_IsWestArrowWarp(a); - case 4: - return MetatileBehavior_IsEastArrowWarp(a); - } - return FALSE; -} - -static s8 map_warp_check_packed(struct MapHeader *mapHeader, struct MapPosition *position) -{ - return map_warp_check(mapHeader, position->x - 7, position->y - 7, position->height); -} - -static void sub_8068C30(struct MapHeader *unused, s8 b, struct MapPosition *position) -{ - struct WarpEvent *warpEvent = &gMapHeader.events->warps[b]; - - if (warpEvent->mapNum == 0x7F) - { - copy_saved_warp2_bank_and_enter_x_to_warp1(warpEvent->mapGroup); - } - else - { - struct MapHeader *mapHeader; - - warp1_set_2(warpEvent->unk7, warpEvent->mapNum, warpEvent->mapGroup); - sub_80535C4(position->x, position->y); - mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->unk7, warpEvent->mapNum); - if (mapHeader->events->warps[warpEvent->mapGroup].mapNum == 0x7F) - saved_warp2_set(mapHeader->events->warps[b].mapGroup, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, b); - } -} - -static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c) -{ - s8 r4; - - if (c == 2) - { - if (sub_80571C0(b) == TRUE) - { - sub_80BC038(position, gMapHeader.events); - return TRUE; - } - if (MetatileBehavior_IsWarpDoor(b) == TRUE) - { - r4 = map_warp_check_packed(&gMapHeader, position); - if (r4 != -1 && sub_8068B30(b) == TRUE) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sub_8068C30(&gMapHeader, r4, position); - sub_8080EF0(); - return TRUE; - } - } - } - return FALSE; -} - -static s8 map_warp_check(struct MapHeader *mapHeader, u16 x, u16 y, u8 warpId) -{ - s32 i; - struct WarpEvent *warpEvent = mapHeader->events->warps; - u8 warpCount = mapHeader->events->warpCount; - - for (i = 0; i < warpCount; i++, warpEvent++) - { - if ((u16)warpEvent->x == x && (u16)warpEvent->y == y) - { - if ((u8)warpEvent->warpId == warpId || (u8)warpEvent->warpId == 0) - return i; - } - } - return -1; -} - -static u8 *trigger_activate(struct CoordEvent *coordEvent) -{ - if (coordEvent != NULL) - { - if (coordEvent->script == NULL) - { - DoCoordEventWeather(coordEvent->trigger); - return NULL; - } - if (coordEvent->trigger == 0) - { - ScriptContext2_RunNewScript(coordEvent->script); - return NULL; - } - if (VarGet(coordEvent->trigger) == (u8)coordEvent->index) - return coordEvent->script; - } - return NULL; -} - -static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) -{ - s32 i; - struct CoordEvent *coordEvents = mapHeader->events->coordEvents; - u8 coordEventCount = mapHeader->events->coordEventCount; - - for (i = 0; i < coordEventCount; i++) - { - if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y) - { - if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0) - { - u8 *script = trigger_activate(&coordEvents[i]); - if (script != NULL) - return script; - } - } - } - return NULL; -} - -u8 *sub_8068E24(struct MapPosition *position) -{ - return mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height); -} - -static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHeader, u16 b, u16 c, u8 d) -{ - u8 i; - struct BgEvent *bgEvents = mapHeader->events->bgEvents; - u8 bgEventCount = mapHeader->events->bgEventCount; - - for (i = 0; i < bgEventCount; i++) - { - if ((u16)bgEvents[i].x == b && (u16)bgEvents[i].y == c) - { - if (bgEvents[i].unk4 == d || bgEvents[i].unk4 == 0) - return &bgEvents[i]; - } - } - return NULL; -} - -bool8 dive_warp(struct MapPosition *position, u16 b) -{ - if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(b) == 0) - { - if (sub_80538B0(position->x - 7, position->y - 7)) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sp13E_warp_to_last_warp(); - PlaySE(SE_W291); - return TRUE; - } - } - else if (sub_80574EC(b) == TRUE) - { - if (sub_80538D0(position->x - 7, position->y - 7)) - { - walkrun_find_lowest_active_bit_in_bitfield(); - sp13E_warp_to_last_warp(); - PlaySE(SE_W291); - return TRUE; - } - } - return FALSE; -} - -u8 sub_8068F18(void) -{ - s16 x, y; - u8 r5; - - PlayerGetDestCoords(&x, &y); - r5 = MapGridGetMetatileBehaviorAt(x, y); - if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(r5) == 0) - { - if (sub_80538B0(x - 7, y - 7) == TRUE) - return 1; - } - else if (sub_80574EC(r5) == TRUE) - { - if (sub_80538D0(x - 7, y - 7) == TRUE) - return 2; - } - return 0; -} - -u8 *GetFieldObjectScriptPointerPlayerFacing(void) -{ - u8 r4; - struct MapPosition position; - - r4 = player_get_direction_upper_nybble(); - player_get_next_pos_and_height(&position); - return sub_8068364(&position, MapGridGetMetatileBehaviorAt(position.x, position.y), r4); -} - -int SetCableClubWarp(void) -{ - struct MapPosition position; - - player_get_direction_upper_nybble(); //unnecessary - player_get_pos_to_and_height(&position); - MapGridGetMetatileBehaviorAt(position.x, position.y); //unnecessary - sub_8068C30(&gMapHeader, map_warp_check_packed(&gMapHeader, &position), &position); - return 0; -} diff --git a/src/field/field_door.c b/src/field/field_door.c deleted file mode 100644 index 89dae725c..000000000 --- a/src/field/field_door.c +++ /dev/null @@ -1,603 +0,0 @@ -#include "global.h" -#include "field_door.h" -#include "field_camera.h" -#include "fieldmap.h" -#include "metatile_behavior.h" -#include "constants/songs.h" -#include "task.h" - -const u8 DoorAnimTiles_04[][0x100] = -{ - INCBIN_U8("graphics/door_anims/04/0.4bpp"), - INCBIN_U8("graphics/door_anims/04/1.4bpp"), - INCBIN_U8("graphics/door_anims/04/2.4bpp"), -}; - -// TODO: Make these blank palette includes? -asm(".space 32"); - -const u8 DoorAnimTiles_05[][0x100] = -{ - INCBIN_U8("graphics/door_anims/05/0.4bpp"), - INCBIN_U8("graphics/door_anims/05/1.4bpp"), - INCBIN_U8("graphics/door_anims/05/2.4bpp"), -}; - -const u8 DoorAnimTiles_08[][0x100] = -{ - INCBIN_U8("graphics/door_anims/08/0.4bpp"), - INCBIN_U8("graphics/door_anims/08/1.4bpp"), - INCBIN_U8("graphics/door_anims/08/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_15[][0x100] = -{ - INCBIN_U8("graphics/door_anims/15/0.4bpp"), - INCBIN_U8("graphics/door_anims/15/1.4bpp"), - INCBIN_U8("graphics/door_anims/15/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_16[][0x100] = -{ - INCBIN_U8("graphics/door_anims/16/0.4bpp"), - INCBIN_U8("graphics/door_anims/16/1.4bpp"), - INCBIN_U8("graphics/door_anims/16/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_00[][0x100] = -{ - INCBIN_U8("graphics/door_anims/00/0.4bpp"), - INCBIN_U8("graphics/door_anims/00/1.4bpp"), - INCBIN_U8("graphics/door_anims/00/2.4bpp"), -}; - -const u8 DoorAnimTiles_01[][0x100] = -{ - INCBIN_U8("graphics/door_anims/01/0.4bpp"), - INCBIN_U8("graphics/door_anims/01/1.4bpp"), - INCBIN_U8("graphics/door_anims/01/2.4bpp"), -}; - -const u8 DoorAnimTiles_02[][0x100] = -{ - INCBIN_U8("graphics/door_anims/02/0.4bpp"), - INCBIN_U8("graphics/door_anims/02/1.4bpp"), - INCBIN_U8("graphics/door_anims/02/2.4bpp"), -}; - -const u8 DoorAnimTiles_03[][0x100] = -{ - INCBIN_U8("graphics/door_anims/03/0.4bpp"), - INCBIN_U8("graphics/door_anims/03/1.4bpp"), - INCBIN_U8("graphics/door_anims/03/2.4bpp"), -}; - -const u8 DoorAnimTiles_06[][0x100] = -{ - INCBIN_U8("graphics/door_anims/06/0.4bpp"), - INCBIN_U8("graphics/door_anims/06/1.4bpp"), - INCBIN_U8("graphics/door_anims/06/2.4bpp"), -}; - -const u8 DoorAnimTiles_07[][0x100] = -{ - INCBIN_U8("graphics/door_anims/07/0.4bpp"), - INCBIN_U8("graphics/door_anims/07/1.4bpp"), - INCBIN_U8("graphics/door_anims/07/2.4bpp"), -}; - -const u8 DoorAnimTiles_09[][0x100] = -{ - INCBIN_U8("graphics/door_anims/09/0.4bpp"), - INCBIN_U8("graphics/door_anims/09/1.4bpp"), - INCBIN_U8("graphics/door_anims/09/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_10[][0x100] = -{ - INCBIN_U8("graphics/door_anims/10/0.4bpp"), - INCBIN_U8("graphics/door_anims/10/1.4bpp"), - INCBIN_U8("graphics/door_anims/10/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_11[][0x100] = -{ - INCBIN_U8("graphics/door_anims/11/0.4bpp"), - INCBIN_U8("graphics/door_anims/11/1.4bpp"), - INCBIN_U8("graphics/door_anims/11/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_12[][0x100] = -{ - INCBIN_U8("graphics/door_anims/12/0.4bpp"), - INCBIN_U8("graphics/door_anims/12/1.4bpp"), - INCBIN_U8("graphics/door_anims/12/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_13[][0x100] = -{ - INCBIN_U8("graphics/door_anims/13/0.4bpp"), - INCBIN_U8("graphics/door_anims/13/1.4bpp"), - INCBIN_U8("graphics/door_anims/13/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_14[][0x100] = -{ - INCBIN_U8("graphics/door_anims/14/0.4bpp"), - INCBIN_U8("graphics/door_anims/14/1.4bpp"), - INCBIN_U8("graphics/door_anims/14/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_17[][0x100] = -{ - INCBIN_U8("graphics/door_anims/17/0.4bpp"), - INCBIN_U8("graphics/door_anims/17/1.4bpp"), - INCBIN_U8("graphics/door_anims/17/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_18[][0x100] = -{ - INCBIN_U8("graphics/door_anims/18/0.4bpp"), - INCBIN_U8("graphics/door_anims/18/1.4bpp"), - INCBIN_U8("graphics/door_anims/18/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_19[][0x100] = -{ - INCBIN_U8("graphics/door_anims/19/0.4bpp"), - INCBIN_U8("graphics/door_anims/19/1.4bpp"), - INCBIN_U8("graphics/door_anims/19/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_20[][0x100] = -{ - INCBIN_U8("graphics/door_anims/20/0.4bpp"), - INCBIN_U8("graphics/door_anims/20/1.4bpp"), - INCBIN_U8("graphics/door_anims/20/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_21[][0x100] = -{ - INCBIN_U8("graphics/door_anims/21/0.4bpp"), - INCBIN_U8("graphics/door_anims/21/1.4bpp"), - INCBIN_U8("graphics/door_anims/21/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_22[][0x100] = -{ - INCBIN_U8("graphics/door_anims/22/0.4bpp"), - INCBIN_U8("graphics/door_anims/22/1.4bpp"), - INCBIN_U8("graphics/door_anims/22/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_23[][0x100] = -{ - INCBIN_U8("graphics/door_anims/23/0.4bpp"), - INCBIN_U8("graphics/door_anims/23/1.4bpp"), - INCBIN_U8("graphics/door_anims/23/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_24[][0x100] = -{ - INCBIN_U8("graphics/door_anims/24/0.4bpp"), - INCBIN_U8("graphics/door_anims/24/1.4bpp"), - INCBIN_U8("graphics/door_anims/24/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_25[][0x100] = -{ - INCBIN_U8("graphics/door_anims/25/0.4bpp"), - INCBIN_U8("graphics/door_anims/25/1.4bpp"), - INCBIN_U8("graphics/door_anims/25/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_26[][0x100] = -{ - INCBIN_U8("graphics/door_anims/26/0.4bpp"), - INCBIN_U8("graphics/door_anims/26/1.4bpp"), - INCBIN_U8("graphics/door_anims/26/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_27[][0x100] = -{ - INCBIN_U8("graphics/door_anims/27/0.4bpp"), - INCBIN_U8("graphics/door_anims/27/1.4bpp"), - INCBIN_U8("graphics/door_anims/27/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_28[][0x100] = -{ - INCBIN_U8("graphics/door_anims/28/0.4bpp"), - INCBIN_U8("graphics/door_anims/28/1.4bpp"), - INCBIN_U8("graphics/door_anims/28/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_29[][0x100] = -{ - INCBIN_U8("graphics/door_anims/29/0.4bpp"), - INCBIN_U8("graphics/door_anims/29/1.4bpp"), - INCBIN_U8("graphics/door_anims/29/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_30[][0x100] = -{ - INCBIN_U8("graphics/door_anims/30/0.4bpp"), - INCBIN_U8("graphics/door_anims/30/1.4bpp"), - INCBIN_U8("graphics/door_anims/30/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_31[][0x100] = -{ - INCBIN_U8("graphics/door_anims/31/0.4bpp"), - INCBIN_U8("graphics/door_anims/31/1.4bpp"), - INCBIN_U8("graphics/door_anims/31/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_32[][0x100] = -{ - INCBIN_U8("graphics/door_anims/32/0.4bpp"), - INCBIN_U8("graphics/door_anims/32/1.4bpp"), - INCBIN_U8("graphics/door_anims/32/2.4bpp"), -}; - -asm(".space 32"); - -const u8 DoorAnimTiles_33[][0x100] = -{ - INCBIN_U8("graphics/door_anims/33/0.4bpp"), - INCBIN_U8("graphics/door_anims/33/1.4bpp"), - INCBIN_U8("graphics/door_anims/33/2.4bpp"), -}; - -asm(".space 32"); - -static const struct DoorAnimFrame gDoorOpenAnimFrames[] = -{ - {4, -1}, - {4, 0}, - {4, 0x100}, - {4, 0x200}, - {0, 0}, -}; - -static const struct DoorAnimFrame gDoorCloseAnimFrames[] = -{ - {4, 0x200}, - {4, 0x100}, - {4, 0}, - {4, -1}, - {0, 0}, -}; - -const u8 DoorAnimPalettes_830F8A4[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 00 -const u8 DoorAnimPalettes_830F8AC[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 01 -const u8 DoorAnimPalettes_830F8B4[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 02 -const u8 DoorAnimPalettes_830F8BC[] = {0, 0, 1, 1, 1, 1, 1, 1}; // door 03 -const u8 DoorAnimPalettes_830F8C4[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 04 -const u8 DoorAnimPalettes_830F8CC[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 05 -const u8 DoorAnimPalettes_830F8D4[] = {11, 11, 11, 11, 11, 11, 11, 11}; // door 06 -const u8 DoorAnimPalettes_830F8DC[] = {10, 10, 10, 10, 10, 10, 10, 10}; // door 07 -const u8 DoorAnimPalettes_830F8E4[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 08 -const u8 DoorAnimPalettes_830F8EC[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 09 -const u8 DoorAnimPalettes_830F8F4[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 10 -const u8 DoorAnimPalettes_830F8FC[] = {9, 9, 1, 1, 1, 1, 1, 1}; // door 11 -const u8 DoorAnimPalettes_830F904[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 12 -const u8 DoorAnimPalettes_830F90C[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 13 -const u8 DoorAnimPalettes_830F914[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 14 -const u8 DoorAnimPalettes_830F91C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 15 -const u8 DoorAnimPalettes_830F924[] = {0, 0, 5, 5, 5, 5, 5, 5}; // door 16 -const u8 DoorAnimPalettes_830F92C[] = {6, 6, 1, 1, 1, 1, 1, 1}; // door 17 -const u8 DoorAnimPalettes_830F934[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 18 -const u8 DoorAnimPalettes_830F93C[] = {6, 6, 5, 5, 5, 5, 5, 5}; // door 19 -const u8 DoorAnimPalettes_830F944[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 20 -const u8 DoorAnimPalettes_830F94C[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 21 -const u8 DoorAnimPalettes_830F954[] = {6, 6, 7, 7, 7, 7, 7, 7}; // door 22 -const u8 DoorAnimPalettes_830F95C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 23 -const u8 DoorAnimPalettes_830F964[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 24 -const u8 DoorAnimPalettes_830F96C[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 25 -const u8 DoorAnimPalettes_830F974[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 26 -const u8 DoorAnimPalettes_830F97C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 27 -const u8 DoorAnimPalettes_830F984[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 28 -const u8 DoorAnimPalettes_830F98C[] = {11, 11, 7, 7, 7, 7, 7, 7}; // door 29 -const u8 DoorAnimPalettes_830F994[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 30 -const u8 DoorAnimPalettes_830F99C[] = {6, 6, 7, 7, 7, 7, 7, 7}; // door 31 -const u8 DoorAnimPalettes_830F9A4[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 32 -const u8 DoorAnimPalettes_830F9AC[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 33 - -static const struct DoorGraphics gDoorAnimGraphicsTable[] = -{ - {0x021, 0, DoorAnimTiles_00, DoorAnimPalettes_830F8A4}, // door 00 - {0x061, 1, DoorAnimTiles_01, DoorAnimPalettes_830F8AC}, // door 01 - {0x1CD, 1, DoorAnimTiles_02, DoorAnimPalettes_830F8B4}, // door 02 - {0x041, 1, DoorAnimTiles_03, DoorAnimPalettes_830F8BC}, // door 03 - {0x248, 0, DoorAnimTiles_04, DoorAnimPalettes_830F8C4}, // door 04 - {0x249, 0, DoorAnimTiles_05, DoorAnimPalettes_830F8CC}, // door 05 - {0x22F, 0, DoorAnimTiles_06, DoorAnimPalettes_830F8D4}, // door 06 - {0x21F, 0, DoorAnimTiles_07, DoorAnimPalettes_830F8DC}, // door 07 - {0x2A5, 0, DoorAnimTiles_08, DoorAnimPalettes_830F8E4}, // door 08 - {0x287, 0, DoorAnimTiles_09, DoorAnimPalettes_830F8F4}, // door 09 - {0x2AC, 0, DoorAnimTiles_10, DoorAnimPalettes_830F934}, // door 10 - {0x3A1, 0, DoorAnimTiles_11, DoorAnimPalettes_830F93C}, // door 11 - {0x2DC, 0, DoorAnimTiles_12, DoorAnimPalettes_830F92C}, // door 12 - {0x225, 0, DoorAnimTiles_13, DoorAnimPalettes_830F924}, // door 13 - {0x1DB, 1, DoorAnimTiles_14, DoorAnimPalettes_830F94C}, // door 14 - {0x246, 0, DoorAnimTiles_15, DoorAnimPalettes_830F8EC}, // door 15 - {0x28E, 0, DoorAnimTiles_16, DoorAnimPalettes_830F944}, // door 16 - {0x2A1, 0, DoorAnimTiles_17, DoorAnimPalettes_830F8FC}, // door 17 - {0x21C, 0, DoorAnimTiles_18, DoorAnimPalettes_830F914}, // door 18 - {0x21E, 0, DoorAnimTiles_19, DoorAnimPalettes_830F91C}, // door 19 - {0x21D, 1, DoorAnimTiles_20, DoorAnimPalettes_830F904}, // door 20 - {0x21A, 0, DoorAnimTiles_21, DoorAnimPalettes_830F90C}, // door 21 - {0x224, 0, DoorAnimTiles_22, DoorAnimPalettes_830F954}, // door 22 - {0x289, 0, DoorAnimTiles_23, DoorAnimPalettes_830F95C}, // door 23 - {0x30C, 1, DoorAnimTiles_24, DoorAnimPalettes_830F964}, // door 24 - {0x32D, 1, DoorAnimTiles_25, DoorAnimPalettes_830F96C}, // door 25 - {0x2ED, 1, DoorAnimTiles_26, DoorAnimPalettes_830F974}, // door 26 - {0x264, 1, DoorAnimTiles_27, DoorAnimPalettes_830F97C}, // door 27 - {0x22B, 0, DoorAnimTiles_28, DoorAnimPalettes_830F984}, // door 28 - {0x2F7, 0, DoorAnimTiles_29, DoorAnimPalettes_830F98C}, // door 29 - {0x297, 0, DoorAnimTiles_30, DoorAnimPalettes_830F994}, // door 30 - {0x285, 1, DoorAnimTiles_31, DoorAnimPalettes_830F99C}, // door 31 - {0x25D, 1, DoorAnimTiles_32, DoorAnimPalettes_830F9A4}, // door 32 - {0x20E, 1, DoorAnimTiles_33, DoorAnimPalettes_830F9AC}, // door 33 - {0, 0, NULL, NULL}, -}; - -static void CopyDoorTilesToVram(const void *src) -{ - CpuFastSet(src, (void *)(VRAM + 0x7F00), 0x40); -} - -static void door_build_blockdef(u16 *a, u16 b, const u8 *c) -{ - int i; - u16 unk; - - for (i = 0; i < 4; i++) - { - unk = *(c++) << 12; - a[i] = unk | (b + i); - } - for (; i < 8; i++) - { - unk = *(c++) << 12; - a[i] = unk; - } -} - -static void DrawCurrentDoorAnimFrame(u32 x, u32 y, const u8 *c) -{ - u16 arr[8]; - - door_build_blockdef(arr, 0x3F8, c); - DrawDoorMetatileAt(x, y - 1, arr); - door_build_blockdef(arr, 0x3FC, c + 4); - DrawDoorMetatileAt(x, y, arr); -} - -static void DrawClosedDoorTiles(u32 x, u32 y) -{ - CurrentMapDrawMetatileAt(x, y - 1); - CurrentMapDrawMetatileAt(x, y); -} - -static void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frame, u32 x, u32 y) -{ - if (frame->offset == 0xFFFF) - DrawClosedDoorTiles(x, y); - else - { - CopyDoorTilesToVram(gfx->tiles + frame->offset); - DrawCurrentDoorAnimFrame(x, y, gfx->palette); - } -} - -enum -{ - TD_FRAMELIST = 0, - TD_GFX = 2, - TD_FRAME = 4, - TD_COUNTER, - TD_X, - TD_Y -}; - -static bool32 sub_8058464(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData) -{ - if (taskData[TD_COUNTER] == 0) - DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]); - if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time) - { - taskData[TD_COUNTER] = 0; - taskData[TD_FRAME]++; - if (frames[taskData[TD_FRAME]].time == 0) - return FALSE; - else - return TRUE; - } - taskData[TD_COUNTER]++; - return TRUE; -} - -static void Task_AnimateDoor(u8 taskId) -{ - u16 *taskData = gTasks[taskId].data; - struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]); - struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]); - - if (sub_8058464(gfx, frames, taskData) == FALSE) - DestroyTask(taskId); -} - -static const struct DoorAnimFrame *GetLastDoorFrame(const struct DoorAnimFrame *frame, const void *unused) -{ - while (frame->time != 0) - frame++; - return frame - 1; -} - -static const struct DoorGraphics *GetDoorGraphics(const struct DoorGraphics *gfx, u16 metatileNum) -{ - while (gfx->tiles != NULL) - { - if (gfx->metatileNum == metatileNum) - return gfx; - gfx++; - } - return NULL; -} - -static s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, u32 x, u32 y) -{ - if (FuncIsActiveTask(Task_AnimateDoor) == TRUE) - return -1; - else - { - u8 taskId = CreateTask(Task_AnimateDoor, 0x50); - s16 *taskData = gTasks[taskId].data; - - taskData[TD_X] = x; - taskData[TD_Y] = y; - - taskData[TD_FRAMELIST + 1] = (u32)frames; - taskData[TD_FRAMELIST] = (u32)frames >> 16; - - taskData[TD_GFX + 1] = (u32)gfx; - taskData[TD_GFX] = (u32)gfx >> 16; - - return taskId; - } -} - -static void DrawClosedDoor(const struct DoorGraphics *unused, u32 x, u32 y) -{ - DrawClosedDoorTiles(x, y); -} - -static void DrawOpenedDoor(const struct DoorGraphics *gfx, u32 x, u32 y) -{ - gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); - if (gfx != NULL) - DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y); -} - -static s8 StartDoorOpenAnimation(const struct DoorGraphics *gfx, u32 x, u32 y) -{ - gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); - if (gfx == NULL) - return -1; - else - return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y); -} - -static s8 StartDoorCloseAnimation(const struct DoorGraphics *gfx, u32 x, u32 y) -{ - gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); - if (gfx == NULL) - return -1; - else - return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y); -} - -static s8 cur_mapdata_get_door_x2_at(const struct DoorGraphics *gfx, u32 x, u32 y) -{ - gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); - if (gfx == NULL) - return -1; - else - return gfx->unk2; -} - -void unref_sub_805869C(u32 x, u32 y) -{ - StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); -} - -void FieldSetDoorOpened(u32 x, u32 y) -{ - if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) - DrawOpenedDoor(gDoorAnimGraphicsTable, x, y); -} - -void FieldSetDoorClosed(u32 x, u32 y) -{ - if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) - DrawClosedDoor(gDoorAnimGraphicsTable, x, y); -} - -s8 FieldAnimateDoorClose(u32 x, u32 y) -{ - if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) - return -1; - else - return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y); -} - -s8 FieldAnimateDoorOpen(u32 x, u32 y) -{ - if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) - return -1; - else - return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); -} - -bool8 FieldIsDoorAnimationRunning(void) -{ - return FuncIsActiveTask(Task_AnimateDoor); -} - -u32 GetDoorSoundEffect(u32 x, u32 y) -{ - if (cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y) == 0) - return SE_DOOR; - else - return SE_JIDO_DOA; -} diff --git a/src/field/field_effect.c b/src/field/field_effect.c deleted file mode 100644 index f85bc520e..000000000 --- a/src/field/field_effect.c +++ /dev/null @@ -1,3385 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "script.h" -#include "trig.h" -#include "main.h" -#include "field_weather.h" -#include "decompress.h" -#include "sprite.h" -#include "menu.h" -#include "palette.h" -#include "text.h" -#include "overworld.h" -#include "task.h" -#include "sound.h" -#include "constants/songs.h" -#include "decoration.h" -#include "field_player_avatar.h" -#include "event_object_movement.h" -#include "metatile_behavior.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "fieldmap.h" -#include "util.h" -#include "field_effect_helpers.h" -#include "pokemon_storage_system.h" - -#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} - -EWRAM_DATA s32 gFieldEffectArguments[8] = {0}; - -const u32 gSpriteImage_839DC14[] = INCBIN_U32("graphics/birch_speech/birch.4bpp"); -const u16 gBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal"); -const u32 gSpriteImage_839E434[] = INCBIN_U32("graphics/misc/pokeball_glow.4bpp"); -const u16 gFieldEffectObjectPalette4[16] = INCBIN_U16("graphics/field_effect_objects/palettes/04.gbapal"); -const u32 gSpriteImage_839E474[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp"); -const u32 gSpriteImage_839E534[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp"); -const u32 gSpriteImage_839E5F4[] = INCBIN_U32("graphics/misc/big_hof_monitor.4bpp"); -const u8 gSpriteImage_839E7F4[] = INCBIN_U8("graphics/misc/small_hof_monitor.4bpp"); -const u16 gFieldEffectObjectPalette5[16] = INCBIN_U16("graphics/field_effect_objects/palettes/05.gbapal"); - -// Graphics for the lights streaking past your Pokemon when it uses a field move. -const u32 gFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/field_move_streaks.4bpp"); -const u16 gFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/field_move_streaks.gbapal"); -const u16 gFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/field_move_streaks_map.bin"); - -// The following light streaks effect is used when the map is dark (e.g. a cave). -const u32 gDarknessFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/darkness_field_move_streaks.4bpp"); -const u16 gDarknessFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/darkness_field_move_streaks.gbapal"); -const u16 gDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/darkness_field_move_streaks_map.bin"); - -bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *) = { - FieldEffectCmd_loadtiles, - FieldEffectCmd_loadfadedpal, - FieldEffectCmd_loadpal, - FieldEffectCmd_callnative, - FieldEffectCmd_end, - FieldEffectCmd_loadgfx_callnative, - FieldEffectCmd_loadtiles_callnative, - FieldEffectCmd_loadfadedpal_callnative, -}; - -const struct OamData gOamData_839F0F4 = {.size = 3}; -const struct OamData gOamData_839F0FC = {.size = 0}; -const struct OamData gOamData_839F104 = {.size = 1}; - -const struct SpriteFrameImage gSpriteImageTable_839F10C[] = { - obj_frame_tiles(gSpriteImage_839DC14) -}; -const struct SpritePalette gUnknown_0839F114 = {.data = gBirchPalette, .tag = 0x1006}; - -const union AnimCmd gSpriteAnim_839F11C[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 1), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_839F124[] = { - gSpriteAnim_839F11C -}; - -const struct SpriteTemplate gSpriteTemplate_839F128 = { - .tileTag = 0xffff, - .paletteTag = 4102, - .oam = &gOamData_839F0F4, - .anims = (const union AnimCmd *const *)&gSpriteAnimTable_839F124, - .images = gSpriteImageTable_839F10C, - .affineAnims = (const union AffineAnimCmd *const *)&gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -const struct SpritePalette gFieldEffectObjectPaletteInfo4 = {.data = gFieldEffectObjectPalette4, .tag = 0x1007}; -const struct SpritePalette gFieldEffectObjectPaletteInfo5 = {.data = gFieldEffectObjectPalette5, .tag = 0x1010}; -const struct OamData gOamData_839F150 = { - .shape = 1, - .size = 2 -}; - -const struct SpriteFrameImage gSpriteImageTable_839F158[] = { - obj_frame_tiles(gSpriteImage_839E434) -}; - -const struct SpriteFrameImage gSpriteImageTable_839F160[] = { - obj_frame_tiles(gSpriteImage_839E474), - obj_frame_tiles(gSpriteImage_839E534) -}; - -const struct SpriteFrameImage gSpriteImageTable_839F170[] = { - obj_frame_tiles(gSpriteImage_839E5F4) -}; - -const struct SpriteFrameImage gSpriteImageTable_839F178[] = { - {.data = gSpriteImage_839E7F4, .size = 0x200} // the macro breaks down here -}; - -const struct Subsprite Unknown_39F180[] = { - {.x = -12, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 0}, - {.x = 4, .y = -8, .priority = 2, .tileOffset = 2, .shape = 0, .size = 0}, - {.x = -12, .y = 0, .priority = 2, .tileOffset = 3, .shape = 1, .size = 0}, - {.x = 4, .y = 0, .priority = 2, .tileOffset = 5, .shape = 0, .size = 0} -}; - -const struct SubspriteTable gUnknown_0839F1A0 = subsprite_table(Unknown_39F180); - -const struct Subsprite Unknown_39F1A8[] = { - {.x = -32, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 1}, - {.x = 0, .y = -8, .priority = 2, .tileOffset = 4, .shape = 1, .size = 1}, - {.x = -32, .y = 0, .priority = 2, .tileOffset = 8, .shape = 1, .size = 1}, - {.x = 0, .y = 0, .priority = 2, .tileOffset = 12, .shape = 1, .size = 1} -}; - -const struct SubspriteTable gUnknown_0839F1C8 = subsprite_table(Unknown_39F1A8); - -const union AnimCmd gSpriteAnim_839F1D0[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 1), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd gSpriteAnim_839F1D8[] = { - ANIMCMD_FRAME(.imageValue = 0, .duration = 16), - ANIMCMD_FRAME(.imageValue = 1, .duration = 16), - ANIMCMD_FRAME(.imageValue = 0, .duration = 16), - ANIMCMD_FRAME(.imageValue = 1, .duration = 16), - ANIMCMD_FRAME(.imageValue = 0, .duration = 16), - ANIMCMD_FRAME(.imageValue = 1, .duration = 16), - ANIMCMD_FRAME(.imageValue = 0, .duration = 16), - ANIMCMD_FRAME(.imageValue = 1, .duration = 16), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_839F1FC[] = { - gSpriteAnim_839F1D0, - gSpriteAnim_839F1D8 -}; - -const union AnimCmd *const gSpriteAnimTable_839F204[] = { - gSpriteAnim_839F1D0 -}; - -const struct SpriteTemplate gSpriteTemplate_839F208 = { - .tileTag = 0xffff, - .paletteTag = 4103, - .oam = &gOamData_839F0FC, - .anims = gSpriteAnimTable_839F1FC, - .images = gSpriteImageTable_839F158, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_PokeballGlow -}; - - -const struct SpriteTemplate gSpriteTemplate_839F220 = { - .tileTag = 0xffff, - .paletteTag = 4100, - .oam = &gOamData_839F104, - .anims = gSpriteAnimTable_839F1FC, - .images = gSpriteImageTable_839F160, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_PokecenterMonitor -}; - - -const struct SpriteTemplate gSpriteTemplate_839F238 = { - .tileTag = 0xffff, - .paletteTag = 4112, - .oam = &gOamData_839F104, - .anims = gSpriteAnimTable_839F204, - .images = gSpriteImageTable_839F170, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_HallOfFameMonitor -}; - - -const struct SpriteTemplate gSpriteTemplate_839F250 = { - .tileTag = 0xffff, - .paletteTag = 4112, - .oam = &gOamData_839F150, - .anims = gSpriteAnimTable_839F204, - .images = gSpriteImageTable_839F178, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_HallOfFameMonitor -}; - -void (*const gUnknown_0839F268[])(struct Task *) = { - PokecenterHealEffect_0, - PokecenterHealEffect_1, - PokecenterHealEffect_2, - PokecenterHealEffect_3 -}; - -void (*const gUnknown_0839F278[])(struct Task *) = { - HallOfFameRecordEffect_0, - HallOfFameRecordEffect_1, - HallOfFameRecordEffect_2, - HallOfFameRecordEffect_3 -}; - -void (*const gUnknown_0839F288[])(struct Sprite *) = { - PokeballGlowEffect_0, - PokeballGlowEffect_1, - PokeballGlowEffect_2, - PokeballGlowEffect_3, - PokeballGlowEffect_4, - PokeballGlowEffect_5, - PokeballGlowEffect_6, - PokeballGlowEffect_7 -}; - -const struct Coords16 gUnknown_0839F2A8[] = { - {.x = 0, .y = 0}, - {.x = 6, .y = 0}, - {.x = 0, .y = 4}, - {.x = 6, .y = 4}, - {.x = 0, .y = 8}, - {.x = 6, .y = 8} -}; - -const u8 gUnknown_0839F2C0[] = {16, 12, 8, 0}; -const u8 gUnknown_0839F2C4[] = {16, 12, 8, 0}; -const u8 gUnknown_0839F2C8[] = { 0, 0, 0, 0}; - -bool8 (*const gUnknown_0839F2CC[])(struct Task *) = { - sub_80867AC, - sub_8086854, - sub_8086870, - sub_80868E4, - sub_808699C, - sub_80869B8, - sub_80869F8 -}; - -bool8 (*const gUnknown_0839F2E8[])(struct Task *) = { - sub_8086AA0, - sub_8086AC0, - sub_8086B30, - sub_8086B54, - sub_8086B64, - sub_8086B88 -}; - -bool8 (*const gUnknown_0839F300[])(struct Task *) = { - sub_8086CF4, - sub_8086D70, - sub_8086DB0, - sub_8086E10, - sub_8086E50, - sub_8086EB0, - sub_8086ED4 -}; - -bool8 (*const gUnknown_0839F31C[])(struct Task *, struct MapObject *) = { - sub_8086FB0, - waterfall_1_do_anim_probably, - waterfall_2_wait_anim_finish_probably, - sub_8087030, - sub_8087058 -}; - -bool8 (*const gUnknown_0839F330[])(struct Task *) = { - sub_8087124, - dive_2_unknown, - dive_3_unknown -}; - -bool8 (*const gUnknown_0839F33C[])(struct Task *, struct MapObject *, struct Sprite *) = { - sub_808722C, - sub_8087264, - sub_8087298, - sub_80872E4, - sub_80873D8, - sub_80873F4 -}; - -bool8 (*const gUnknown_0839F354[])(struct Task *, struct MapObject *, struct Sprite *) = { - sub_80874CC, - sub_80874FC, - sub_8087548, - sub_808759C -}; - -bool8 (*const gUnknown_0839F364[])(struct Task *, struct MapObject *, struct Sprite *) = { - sub_80876C8, - sub_80876F8, - sub_8087774, - sub_80877AC, - sub_80877D4 -}; - -void (*const gUnknown_0839F378[])(struct Task *) = { - sub_80878F4, - sub_8087914 -}; - -static u8 sActiveList[32]; - -extern u8 *gFieldEffectScriptPointers[]; - -u32 FieldEffectStart(u8 id) -{ - u8 *script; - u32 val; - - FieldEffectActiveListAdd(id); - - script = gFieldEffectScriptPointers[id]; - - while (gFieldEffectScriptFuncs[*script](&script, &val)) - ; - - return val; -} - -bool8 FieldEffectCmd_loadtiles(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadTiles(script); - return TRUE; -} - -bool8 FieldEffectCmd_loadfadedpal(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadFadedPalette(script); - return TRUE; -} - -bool8 FieldEffectCmd_loadpal(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadPalette(script); - return TRUE; -} - -bool8 FieldEffectCmd_callnative(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_CallNative(script, val); - return TRUE; -} - -bool8 FieldEffectCmd_end(u8 **script, u32 *val) -{ - return FALSE; -} - -bool8 FieldEffectCmd_loadgfx_callnative(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadTiles(script); - FieldEffectScript_LoadFadedPalette(script); - FieldEffectScript_CallNative(script, val); - return TRUE; -} - -bool8 FieldEffectCmd_loadtiles_callnative(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadTiles(script); - FieldEffectScript_CallNative(script, val); - return TRUE; -} - -bool8 FieldEffectCmd_loadfadedpal_callnative(u8 **script, u32 *val) -{ - (*script)++; - FieldEffectScript_LoadFadedPalette(script); - FieldEffectScript_CallNative(script, val); - return TRUE; -} - -u32 FieldEffectScript_ReadWord(u8 **script) -{ - return (*script)[0] - + ((*script)[1] << 8) - + ((*script)[2] << 16) - + ((*script)[3] << 24); -} - -void FieldEffectScript_LoadTiles(u8 **script) -{ - struct SpriteSheet *sheet = (struct SpriteSheet *)FieldEffectScript_ReadWord(script); - if (GetSpriteTileStartByTag(sheet->tag) == 0xFFFF) - LoadSpriteSheet(sheet); - (*script) += 4; -} - -void FieldEffectScript_LoadFadedPalette(u8 **script) -{ - struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); - LoadSpritePalette(palette); - UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); - (*script) += 4; -} - -void FieldEffectScript_LoadPalette(u8 **script) -{ - struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); - LoadSpritePalette(palette); - (*script) += 4; -} - -void FieldEffectScript_CallNative(u8 **script, u32 *val) -{ - u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script); - *val = func(); - (*script) += 4; -} - -void FieldEffectFreeGraphicsResources(struct Sprite *sprite) -{ - u16 sheetTileStart = sprite->sheetTileStart; - u32 paletteNum = sprite->oam.paletteNum; - DestroySprite(sprite); - FieldEffectFreeTilesIfUnused(sheetTileStart); - FieldEffectFreePaletteIfUnused(paletteNum); -} - -void FieldEffectStop(struct Sprite *sprite, u8 id) -{ - FieldEffectFreeGraphicsResources(sprite); - FieldEffectActiveListRemove(id); -} - -void FieldEffectFreeTilesIfUnused(u16 tileStart) -{ - u8 i; - u16 tag = GetSpriteTileTagByTileStart(tileStart); - - if (tag != 0xFFFF) - { - for (i = 0; i < MAX_SPRITES; i++) - if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart) - return; - FreeSpriteTilesByTag(tag); - } -} - -void FieldEffectFreePaletteIfUnused(u8 paletteNum) -{ - u8 i; - u16 tag = GetSpritePaletteTagByPaletteNum(paletteNum); - - if (tag != 0xFFFF) - { - for (i = 0; i < MAX_SPRITES; i++) - if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum) - return; - FreeSpritePaletteByTag(tag); - } -} - -void FieldEffectActiveListClear(void) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sActiveList); i++) - sActiveList[i] = 0xFF; -} - -void FieldEffectActiveListAdd(u8 id) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sActiveList); i++) - { - if (sActiveList[i] == 0xFF) - { - sActiveList[i] = id; - return; - } - } -} - -void FieldEffectActiveListRemove(u8 id) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sActiveList); i++) - { - if (sActiveList[i] == id) - { - sActiveList[i] = 0xFF; - return; - } - } -} - -bool8 FieldEffectActiveListContains(u8 id) -{ - u8 i; - for (i = 0; i < ARRAY_COUNT(sActiveList); i++) - if (sActiveList[i] == id) - return TRUE; - return FALSE; -} - -u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer) -{ - struct SpriteTemplate spriteTemplate; - LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer); - LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer); - spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag; - spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag; - spriteTemplate.oam = &gOamData_839F0F4; - spriteTemplate.anims = gDummySpriteAnimTable; - spriteTemplate.images = NULL; - spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; - spriteTemplate.callback = SpriteCallbackDummy; - return CreateSprite(&spriteTemplate, x, y, subpriority); -} - -void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) -{ - LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); - LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20); -} - -u8 CreateBirchSprite(s16 x, s16 y, u8 subpriority) -{ - LoadSpritePalette(&gUnknown_0839F114); - return CreateSprite(&gSpriteTemplate_839F128, x, y, subpriority); -} - -u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) -{ - DecompressPicFromTable_2(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, gUnknown_081FAF4C[3], gUnknown_081FAF4C[3], species); - LoadCompressedObjectPalette(&gMonPaletteTable[species]); - GetMonSpriteTemplate_803C56C(species, 3); - gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; - PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); - return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); -} - -u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) -{ - const struct CompressedSpritePalette *spritePalette; - - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); - spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g); - LoadCompressedObjectPalette(spritePalette); - GetMonSpriteTemplate_803C56C(species, 3); - gUnknown_02024E8C.paletteTag = spritePalette->tag; - PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); - return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); -} - -void FreeResourcesAndDestroySprite(struct Sprite *sprite) -{ - ResetPreservedPalettesInWeather(); - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); - if (sprite->oam.affineMode != 0) - { - FreeOamMatrix(sprite->oam.matrixNum); - } - DestroySprite(sprite); -} - -#ifdef NONMATCHING -void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) -{ - int curRed; - int curGreen; - int curBlue; - - curRed = gPlttBufferUnfaded[i] & 0x1f; - curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; - curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; - curRed += (((0x1f - curRed) * r) >> 4); - curGreen += (((0x1f - curGreen) * g) >> 4); - curBlue += (((0x1f - curBlue) * b) >> 4); - gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); -} - -void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) -{ - int curRed; - int curGreen; - int curBlue; - - curRed = gPlttBufferUnfaded[i] & 0x1f; - curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; - curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; - curRed -= ((curRed * r) >> 4); - curGreen -= ((curGreen * g) >> 4); - curBlue -= ((curBlue * b) >> 4); - gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); -} -#else -__attribute__((naked)) -void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) -{ - asm(".syntax unified\n" - "\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tlsls r0, 16\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n" - "\tlsrs r0, 15\n" - "\tadds r4, r0, r4\n" - "\tldrh r4, [r4]\n" - "\tmovs r5, 0x1F\n" - "\tmov r9, r5\n" - "\tmov r8, r4\n" - "\tmov r6, r8\n" - "\tands r6, r5\n" - "\tmov r8, r6\n" - "\tmovs r6, 0xF8\n" - "\tlsls r6, 2\n" - "\tands r6, r4\n" - "\tlsrs r6, 5\n" - "\tmovs r5, 0xF8\n" - "\tlsls r5, 7\n" - "\tands r4, r5\n" - "\tlsrs r4, 10\n" - "\tmov r7, r9\n" - "\tmov r5, r8\n" - "\tsubs r7, r5\n" - "\tmov r12, r7\n" - "\tmov r7, r12\n" - "\tmuls r7, r1\n" - "\tadds r1, r7, 0\n" - "\tasrs r1, 4\n" - "\tadd r8, r1\n" - "\tmov r5, r9\n" - "\tsubs r1, r5, r6\n" - "\tmuls r1, r2\n" - "\tasrs r1, 4\n" - "\tadds r6, r1\n" - "\tsubs r5, r4\n" - "\tmov r9, r5\n" - "\tmov r1, r9\n" - "\tmuls r1, r3\n" - "\tasrs r1, 4\n" - "\tadds r4, r1\n" - "\tmov r7, r8\n" - "\tlsls r7, 16\n" - "\tlsls r6, 21\n" - "\torrs r6, r7\n" - "\tlsls r4, 26\n" - "\torrs r4, r6\n" - "\tlsrs r4, 16\n" - "\tldr r1, _08085D04 @ =gPlttBufferFaded\n" - "\tadds r0, r1\n" - "\tstrh r4, [r0]\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08085D00: .4byte gPlttBufferUnfaded\n" - "_08085D04: .4byte gPlttBufferFaded\n" - ".syntax divided"); -} - -__attribute__((naked)) -void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) -{ - asm(".syntax unified\n" - "\tpush {r4-r6,lr}\n" - "\tmov r6, r8\n" - "\tpush {r6}\n" - "\tlsls r0, 16\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n" - "\tlsrs r0, 15\n" - "\tadds r4, r0, r4\n" - "\tldrh r4, [r4]\n" - "\tmovs r5, 0x1F\n" - "\tmov r8, r5\n" - "\tmov r6, r8\n" - "\tands r6, r4\n" - "\tmov r8, r6\n" - "\tmovs r5, 0xF8\n" - "\tlsls r5, 2\n" - "\tands r5, r4\n" - "\tlsrs r5, 5\n" - "\tmovs r6, 0xF8\n" - "\tlsls r6, 7\n" - "\tands r4, r6\n" - "\tlsrs r4, 10\n" - "\tmov r6, r8\n" - "\tmuls r6, r1\n" - "\tadds r1, r6, 0\n" - "\tasrs r1, 4\n" - "\tmov r6, r8\n" - "\tsubs r6, r1\n" - "\tadds r1, r5, 0\n" - "\tmuls r1, r2\n" - "\tasrs r1, 4\n" - "\tsubs r5, r1\n" - "\tadds r1, r4, 0\n" - "\tmuls r1, r3\n" - "\tasrs r1, 4\n" - "\tsubs r4, r1\n" - "\tlsls r6, 16\n" - "\tlsls r5, 21\n" - "\torrs r5, r6\n" - "\tlsls r4, 26\n" - "\torrs r4, r5\n" - "\tlsrs r4, 16\n" - "\tldr r1, _08085D7C @ =gPlttBufferFaded\n" - "\tadds r0, r1\n" - "\tstrh r4, [r0]\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08085D78: .4byte gPlttBufferUnfaded\n" - "_08085D7C: .4byte gPlttBufferFaded\n" - ".syntax divided"); -} -#endif - -void Task_PokecenterHeal(u8 taskId); -u8 CreatePokeballGlowSprite(s16, s16, s16, u16); -u8 PokecenterHealEffectHelper(s16, s16); - -bool8 FldEff_PokecenterHeal(void) -{ - u8 nPokemon; - struct Task *task; - - nPokemon = CalculatePlayerPartyCount(); - task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)]; - task->data[1] = nPokemon; - task->data[2] = 0x5d; - task->data[3] = 0x24; - task->data[4] = 0x7c; - task->data[5] = 0x18; - return FALSE; -} - -void Task_PokecenterHeal(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - gUnknown_0839F268[task->data[0]](task); -} - -void PokecenterHealEffect_0(struct Task *task) -{ - task->data[0]++; - task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 1); - task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]); -} - -void PokecenterHealEffect_1(struct Task *task) -{ - if (gSprites[task->data[6]].data[0] > 1) - { - gSprites[task->data[7]].data[0]++; - task->data[0]++; - } -} - -void PokecenterHealEffect_2(struct Task *task) -{ - if (gSprites[task->data[6]].data[0] > 4) - { - task->data[0]++; - } -} - -void PokecenterHealEffect_3(struct Task *task) -{ - if (gSprites[task->data[6]].data[0] > 6) - { - DestroySprite(&gSprites[task->data[6]]); - FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); - DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); - } -} - -void Task_HallOfFameRecord(u8 taskId); -void HallOfFameRecordEffectHelper(s16, s16, s16, u8); - -bool8 FldEff_HallOfFameRecord(void) -{ - u8 nPokemon; - struct Task *task; - - nPokemon = CalculatePlayerPartyCount(); - task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)]; - task->data[1] = nPokemon; - task->data[2] = 0x75; - task->data[3] = 0x34; - return FALSE; -} - -void Task_HallOfFameRecord(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - gUnknown_0839F278[task->data[0]](task); -} - -void HallOfFameRecordEffect_0(struct Task *task) -{ - u8 taskId; - task->data[0]++; - task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 0); - taskId = FindTaskIdByFunc(Task_HallOfFameRecord); - HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0); - HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1); - HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1); - HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1); - HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1); -} - -void HallOfFameRecordEffect_1(struct Task *task) -{ - if (gSprites[task->data[6]].data[0] > 1) - { - task->data[15]++; // was this ever initialized? is this ever used? - task->data[0]++; - } -} - -void HallOfFameRecordEffect_2(struct Task *task) -{ - if (gSprites[task->data[6]].data[0] > 4) - { - task->data[0]++; - } -} - -void HallOfFameRecordEffect_3(struct Task *task) -{ - if (gSprites[task->data[6]].data[0] > 6) - { - DestroySprite(&gSprites[task->data[6]]); - FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); - DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); - } -} - -void SpriteCB_PokeballGlowEffect(struct Sprite *); - -u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5) -{ - u8 spriteId; - struct Sprite *sprite; - spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); - sprite = &gSprites[spriteId]; - sprite->pos2.x = x; - sprite->pos2.y = y; - sprite->data[5] = data5; - sprite->data[6] = data6; - sprite->data[7] = spriteId; - return spriteId; -} - -void SpriteCB_PokeballGlowEffect(struct Sprite *sprite) -{ - gUnknown_0839F288[sprite->data[0]](sprite); -} - -void PokeballGlowEffect_0(struct Sprite *sprite) -{ - u8 endSpriteId; - if (sprite->data[1] == 0 || (--sprite->data[1]) == 0) - { - sprite->data[1] = 25; - endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_839F208, gUnknown_0839F2A8[sprite->data[2]].x + sprite->pos2.x, gUnknown_0839F2A8[sprite->data[2]].y + sprite->pos2.y, 0); - gSprites[endSpriteId].oam.priority = 2; - gSprites[endSpriteId].data[0] = sprite->data[7]; - sprite->data[2]++; - sprite->data[6]--; - PlaySE(SE_BOWA); - } - if (sprite->data[6] == 0) - { - sprite->data[1] = 32; - sprite->data[0]++; - } -} - -void PokeballGlowEffect_1(struct Sprite *sprite) -{ - if ((--sprite->data[1]) == 0) - { - sprite->data[0]++; - sprite->data[1] = 8; - sprite->data[2] = 0; - sprite->data[3] = 0; - if (sprite->data[5]) - { - PlayFanfare(BGM_ME_ASA); - } - } -} - -void PokeballGlowEffect_2(struct Sprite *sprite) -{ - u8 phase; - if ((--sprite->data[1]) == 0) - { - sprite->data[1] = 8; - sprite->data[2]++; - sprite->data[2] &= 3; - if (sprite->data[2] == 0) - { - sprite->data[3]++; - } - } - phase = (sprite->data[2] + 3) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - phase = (sprite->data[2] + 2) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - phase = (sprite->data[2] + 1) & 3; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - phase = sprite->data[2]; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - if (sprite->data[3] > 2) - { - sprite->data[0]++; - sprite->data[1] = 8; - sprite->data[2] = 0; - } -} - -void PokeballGlowEffect_3(struct Sprite *sprite) -{ - u8 phase; - if ((--sprite->data[1]) == 0) - { - sprite->data[1] = 8; - sprite->data[2]++; - sprite->data[2] &= 3; - if (sprite->data[2] == 3) - { - sprite->data[0]++; - sprite->data[1] = 30; - } - } - phase = sprite->data[2]; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); -} - -void PokeballGlowEffect_4(struct Sprite *sprite) -{ - if ((--sprite->data[1]) == 0) - { - sprite->data[0]++; - } -} - -void PokeballGlowEffect_5(struct Sprite *sprite) -{ - sprite->data[0]++; -} - -void PokeballGlowEffect_6(struct Sprite *sprite) -{ - if (sprite->data[5] == 0 || IsFanfareTaskInactive()) - { - sprite->data[0]++; - } -} - -void PokeballGlowEffect_7(struct Sprite *sprite) -{ -} - -void SpriteCB_PokeballGlow(struct Sprite *sprite) -{ - if (gSprites[sprite->data[0]].data[0] > 4) - { - FieldEffectFreeGraphicsResources(sprite); - } -} - -u8 PokecenterHealEffectHelper(s16 x, s16 y) -{ - u8 spriteIdAtEnd; - struct Sprite *sprite; - spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F220, x, y, 0); - sprite = &gSprites[spriteIdAtEnd]; - sprite->oam.priority = 2; - sprite->invisible = 1; - SetSubspriteTables(sprite, &gUnknown_0839F1A0); - return spriteIdAtEnd; -} - -void SpriteCB_PokecenterMonitor(struct Sprite *sprite) -{ - if (sprite->data[0] != 0) - { - sprite->data[0] = 0; - sprite->invisible = 0; - StartSpriteAnim(sprite, 1); - } - if (sprite->animEnded) - { - FieldEffectFreeGraphicsResources(sprite); - } -} - -void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3) -{ - u8 spriteIdAtEnd; - if (!a3) - { - spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F238, a1, a2, 0); - SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0839F1C8); - } else - { - spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F250, a1, a2, 0); - } - gSprites[spriteIdAtEnd].invisible = 1; - gSprites[spriteIdAtEnd].data[0] = a0; -} - -void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) -{ - if (gTasks[sprite->data[0]].data[15]) - { - if (sprite->data[1] == 0 || (--sprite->data[1]) == 0) - { - sprite->data[1] = 16; - sprite->invisible ^= 1; - } - sprite->data[2]++; - } - if (sprite->data[2] > 127) - { - FieldEffectFreeGraphicsResources(sprite); - } -} - -void mapldr_080842E8(void); -void mapldr_08084390(void); -void task00_8084310(u8); -void c3_080843F8(u8); - -void sub_80865BC(void) -{ - SetMainCallback2(c2_exit_to_overworld_2_switch); - gFieldCallback = mapldr_080842E8; -} - -void mapldr_080842E8(void) -{ - pal_fill_black(); - CreateTask(task00_8084310, 0); - ScriptContext2_Enable(); - FreezeMapObjects(); - gFieldCallback = NULL; -} - -void task00_8084310(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - if (!task->data[0]) - { - if (!IsWeatherNotFadingIn()) - { - return; - } - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - if ((int)gFieldEffectArguments[0] > 5) - { - gFieldEffectArguments[0] = 0; - } - FieldEffectStart(FLDEFF_USE_FLY); - task->data[0]++; - } - if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) - { - Overworld_ResetStateAfterFly(); - warp_in(); - SetMainCallback2(CB2_LoadMap); - gFieldCallback = mapldr_08084390; - DestroyTask(taskId); - } -} - -void mapldr_08084390(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_black(); - CreateTask(c3_080843F8, 0); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - if (gPlayerAvatar.flags & 0x08) - { - FieldObjectTurn(&gMapObjects[gPlayerAvatar.mapObjectId], DIR_WEST); - } - ScriptContext2_Enable(); - FreezeMapObjects(); - gFieldCallback = NULL; -} - -void c3_080843F8(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - if (task->data[0] == 0) - { - if (gPaletteFade.active) - { - return; - } - FieldEffectStart(FLDEFF_FLY_IN); - task->data[0]++; - } - if (!FieldEffectActiveListContains(FLDEFF_FLY_IN)) - { - ScriptContext2_Disable(); - UnfreezeMapObjects(); - DestroyTask(taskId); - } -} - -extern void pal_fill_for_map_transition(void); -void sub_8086774(u8); -extern void CameraObjectReset2(void); -extern void CameraObjectReset1(void); - -void sub_8086748(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - FreezeMapObjects(); - CreateTask(sub_8086774, 0); - gFieldCallback = NULL; -} - -void sub_8086774(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - while (gUnknown_0839F2CC[task->data[0]](task)); // return code signifies whether to continue blocking here -} - -bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] -{ - struct MapObject *playerObject; - struct Sprite *playerSprite; - playerObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - playerSprite = &gSprites[gPlayerAvatar.spriteId]; - CameraObjectReset2(); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - gPlayerAvatar.preventStep = TRUE; - FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); - task->data[4] = playerSprite->subspriteMode; - playerObject->mapobj_bit_26 = 1; - playerSprite->oam.priority = 1; - playerSprite->subspriteMode = 2; - task->data[0]++; - return TRUE; -} - -bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] -{ - if (IsWeatherNotFadingIn()) - { - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] -{ - struct Sprite *sprite; - s16 centerToCornerVecY; - sprite = &gSprites[gPlayerAvatar.spriteId]; - centerToCornerVecY = -(sprite->centerToCornerVecY << 1); - sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); - task->data[1] = 1; - task->data[2] = 0; - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; - PlaySE(SE_RU_HYUU); - task->data[0]++; - return FALSE; -} - -bool8 sub_80868E4(struct Task *task) -{ - struct MapObject *mapObject; - struct Sprite *sprite; - - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.y += task->data[1]; - if (task->data[1] < 8) - { - task->data[2] += task->data[1]; - if (task->data[2] & 0xf) - { - task->data[1] <<= 1; - } - } - if (task->data[3] == 0 && sprite->pos2.y >= -16) - { - task->data[3]++; - mapObject->mapobj_bit_26 = 0; - sprite->subspriteMode = task->data[4]; - mapObject->mapobj_bit_2 = 1; - } - if (sprite->pos2.y >= 0) - { - PlaySE(SE_W070); - mapObject->mapobj_bit_3 = 1; - mapObject->mapobj_bit_5 = 1; - sprite->pos2.y = 0; - task->data[0]++; - } - return FALSE; -} - -bool8 sub_808699C(struct Task *task) -{ - task->data[0]++; - task->data[1] = 4; - task->data[2] = 0; - SetCameraPanningCallback(NULL); - return TRUE; -} - -bool8 sub_80869B8(struct Task *task) -{ - SetCameraPanning(0, task->data[1]); - task->data[1] = -task->data[1]; - task->data[2]++; - if ((task->data[2] & 3) == 0) - { - task->data[1] >>= 1; - } - if (task->data[1] == 0) - { - task->data[0]++; - } - return FALSE; -} - -bool8 sub_80869F8(struct Task *task) -{ - gPlayerAvatar.preventStep = FALSE; - ScriptContext2_Disable(); - CameraObjectReset1(); - UnfreezeMapObjects(); - InstallCameraPanAheadCallback(); - DestroyTask(FindTaskIdByFunc(sub_8086774)); - return FALSE; -} - -void sub_8086A68(u8); -extern void sub_80B4824(u8); -extern void sub_8053FF8(void); -extern void fade_8080918(void); - -void sub_8086B98(struct Task *); -void sub_8086BE4(struct Task *); -void sub_8086C30(void); -void sub_8086C40(void); -bool8 sub_8054034(void); -void sub_8086C94(void); -void sub_80B483C(void); -void sub_8086CBC(u8); - -void sub_8086A2C(u8 a0, u8 priority) -{ - u8 taskId; - taskId = CreateTask(sub_8086A68, priority); - gTasks[taskId].data[1] = 0; - if (a0 == 0x6a) - { - gTasks[taskId].data[1] = 1; - } -} - -void sub_8086A68(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - while (gUnknown_0839F2E8[task->data[0]](task)); -} - -bool8 sub_8086AA0(struct Task *task) -{ - FreezeMapObjects(); - CameraObjectReset2(); - sub_80B4824(task->data[1]); - task->data[0]++; - return FALSE; -} - -bool8 sub_8086AC0(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); - task->data[0]++; - task->data[2] = 0; - task->data[3] = 0; - if ((u8)task->data[1] == 0) - { - task->data[0] = 4; - } - PlaySE(SE_ESUKA); - } - return FALSE; -} - -bool8 sub_8086B30(struct Task *task) -{ - sub_8086B98(task); - if (task->data[2] > 3) - { - sub_8086C30(); - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8086B54(struct Task *task) -{ - sub_8086B98(task); - sub_8086C40(); - return FALSE; -} - -bool8 sub_8086B64(struct Task *task) -{ - sub_8086BE4(task); - if (task->data[2] > 3) - { - sub_8086C30(); - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8086B88(struct Task *task) -{ - sub_8086BE4(task); - sub_8086C40(); - return FALSE; -} - -void sub_8086B98(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x84, task->data[2]); - sprite->pos2.y = Sin(0x94, task->data[2]); - task->data[3]++; - if (task->data[3] & 1) - { - task->data[2]++; - } -} - -void sub_8086BE4(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x7c, task->data[2]); - sprite->pos2.y = Sin(0x76, task->data[2]); - task->data[3]++; - if (task->data[3] & 1) - { - task->data[2]++; - } -} - -void sub_8086C30(void) -{ - sub_8053FF8(); - fade_8080918(); -} - -void sub_8086C40(void) -{ - if (!gPaletteFade.active && sub_8054034() == TRUE) - { - sub_80B483C(); - warp_in(); - gFieldCallback = sub_8086C94; - SetMainCallback2(CB2_LoadMap); - DestroyTask(FindTaskIdByFunc(sub_8086A68)); - } -} - -void sub_8086C94(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - CreateTask(sub_8086CBC, 0); - gFieldCallback = NULL; -} - -void sub_8086CBC(u8 taskId) -{ - struct Task *task; - task = &gTasks[taskId]; - while (gUnknown_0839F300[task->data[0]](task)); -} - -bool8 sub_8086CF4(struct Task *task) -{ - struct MapObject *mapObject; - s16 x; - s16 y; - u8 behavior; - CameraObjectReset2(); - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(DIR_EAST)); - PlayerGetDestCoords(&x, &y); - behavior = MapGridGetMetatileBehaviorAt(x, y); - task->data[0]++; - task->data[1] = 16; - if (behavior == 0x6b) - { - behavior = 1; - task->data[0] = 3; - } else - { - behavior = 0; - } - sub_80B4824(behavior); - return TRUE; -} - -bool8 sub_8086D70(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x84, task->data[1]); - sprite->pos2.y = Sin(0x94, task->data[1]); - task->data[0]++; - return FALSE; -} - -bool8 sub_8086DB0(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x84, task->data[1]); - sprite->pos2.y = Sin(0x94, task->data[1]); - task->data[2]++; - if (task->data[2] & 1) - { - task->data[1]--; - } - if (task->data[1] == 0) - { - sprite->pos2.x = 0; - sprite->pos2.y = 0; - task->data[0] = 5; - } - return FALSE; -} - -bool8 sub_8086E10(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x7c, task->data[1]); - sprite->pos2.y = Sin(0x76, task->data[1]); - task->data[0]++; - return FALSE; -} - -bool8 sub_8086E50(struct Task *task) -{ - struct Sprite *sprite; - sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.x = Cos(0x7c, task->data[1]); - sprite->pos2.y = Sin(0x76, task->data[1]); - task->data[2]++; - if (task->data[2] & 1) - { - task->data[1]--; - } - if (task->data[1] == 0) - { - sprite->pos2.x = 0; - sprite->pos2.y = 0; - task->data[0]++; - } - return FALSE; -} - -extern bool8 sub_80B4850(void); - -bool8 sub_8086EB0(struct Task *task) -{ - if (sub_80B4850()) - { - return FALSE; - } - sub_80B483C(); - task->data[0]++; - return TRUE; -} - -bool8 sub_8086ED4(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - CameraObjectReset1(); - ScriptContext2_Disable(); - FieldObjectSetSpecialAnim(mapObject, GetGoSpeed0AnimId(DIR_EAST)); - DestroyTask(FindTaskIdByFunc(sub_8086CBC)); - } - return FALSE; -} - -void sub_8086F64(u8); - -bool8 FldEff_UseWaterfall(void) -{ - u8 taskId; - taskId = CreateTask(sub_8086F64, 0xff); - gTasks[taskId].data[1] = gFieldEffectArguments[0]; - sub_8086F64(taskId); - return FALSE; -} - -void sub_8086F64(u8 taskId) -{ - while (gUnknown_0839F31C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])); -} - -bool8 sub_8086FB0(struct Task *task, struct MapObject *mapObject) -{ - ScriptContext2_Enable(); - gPlayerAvatar.preventStep = TRUE; - task->data[0]++; - return FALSE; -} - -bool8 waterfall_1_do_anim_probably(struct Task *task, struct MapObject *mapObject) -{ - ScriptContext2_Enable(); - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) - { - FieldObjectClearAnimIfSpecialAnimFinished(mapObject); - gFieldEffectArguments[0] = task->data[1]; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - task->data[0]++; - } - return FALSE; -} - -bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct MapObject *mapObject) -{ - if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) - { - return FALSE; - } - task->data[0]++; - return TRUE; -} - -bool8 sub_8087030(struct Task *task, struct MapObject *mapObject) -{ - FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(DIR_NORTH)); - task->data[0]++; - return FALSE; -} - -bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) -{ - if (!FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - return FALSE; - } - if (MetatileBehavior_IsWaterfall(mapObject->mapobj_unk_1E)) - { - task->data[0] = 3; - return TRUE; - } - ScriptContext2_Disable(); - gPlayerAvatar.preventStep = FALSE; - DestroyTask(FindTaskIdByFunc(sub_8086F64)); - FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); - return FALSE; -} - -void Task_Dive(u8); -extern int dive_warp(struct MapPosition *, u16); - -bool8 FldEff_UseDive(void) -{ - u8 taskId; - taskId = CreateTask(Task_Dive, 0xff); - gTasks[taskId].data[15] = gFieldEffectArguments[0]; - gTasks[taskId].data[14] = gFieldEffectArguments[1]; - Task_Dive(taskId); - return FALSE; -} - -void Task_Dive(u8 taskId) -{ - while (gUnknown_0839F330[gTasks[taskId].data[0]](&gTasks[taskId])); -} - -bool8 sub_8087124(struct Task *task) -{ - gPlayerAvatar.preventStep = TRUE; - task->data[0]++; - return FALSE; -} - -bool8 dive_2_unknown(struct Task *task) -{ - ScriptContext2_Enable(); - gFieldEffectArguments[0] = task->data[15]; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - task->data[0]++; - return FALSE; -} - -bool8 dive_3_unknown(struct Task *task) -{ - struct MapPosition mapPosition; - PlayerGetDestCoords(&mapPosition.x, &mapPosition.y); - if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) - { - dive_warp(&mapPosition, gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E); - DestroyTask(FindTaskIdByFunc(Task_Dive)); - FieldEffectActiveListRemove(FLDEFF_USE_DIVE); - } - return FALSE; -} - -void sub_80871D0(u8); -void mapldr_080851BC(void); - -void sub_80871B8(u8 priority) -{ - CreateTask(sub_80871D0, priority); -} - -void sub_80871D0(u8 taskId) -{ - while (gUnknown_0839F33C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); -} - -bool8 sub_808722C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - FreezeMapObjects(); - CameraObjectReset2(); - SetCameraPanningCallback(NULL); - gPlayerAvatar.preventStep = TRUE; - mapObject->mapobj_bit_26 = 1; - task->data[1] = 1; - task->data[0]++; - return TRUE; -} - -bool8 sub_8087264(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - SetCameraPanning(0, task->data[1]); - task->data[1] = -task->data[1]; - task->data[2]++; - if (task->data[2] > 7) - { - task->data[2] = 0; - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8087298(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->pos2.y = 0; - task->data[3] = 1; - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP); - PlaySE(SE_W153); - task->data[0]++; - return TRUE; -} - -bool8 sub_80872E4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - s16 centerToCornerVecY; - SetCameraPanning(0, task->data[1]); - if (task->data[1] = -task->data[1], ++task->data[2] <= 17) - { - if (!(task->data[2] & 1) && (task->data[1] <= 3)) - { - task->data[1] <<= 1; - } - } else if (!(task->data[2] & 4) && (task->data[1] > 0)) - { - task->data[1] >>= 1; - } - if (task->data[2] > 6) - { - centerToCornerVecY = -(sprite->centerToCornerVecY << 1); - if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY)) - { - sprite->pos2.y -= task->data[3]; - if (task->data[3] <= 7) - { - task->data[3]++; - } - } else - { - task->data[4] = 1; - } - } - if (task->data[5] == 0 && sprite->pos2.y < -0x10) - { - task->data[5]++; - mapObject->mapobj_bit_26 = 1; - sprite->oam.priority = 1; - sprite->subspriteMode = 2; - } - if (task->data[1] == 0 && task->data[4] != 0) - { - task->data[0]++; - } - return FALSE; -} - -bool8 sub_80873D8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8053FF8(); - fade_8080918(); - task->data[0]++; - return FALSE; -} - -bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!gPaletteFade.active && sub_8054034() == TRUE) - { - warp_in(); - gFieldCallback = mapldr_080851BC; - SetMainCallback2(CB2_LoadMap); - DestroyTask(FindTaskIdByFunc(sub_80871D0)); - } - return FALSE; -} - -void sub_8087470(u8); - -void mapldr_080851BC(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - gFieldCallback = NULL; - CreateTask(sub_8087470, 0); -} - -void sub_8087470(u8 taskId) -{ - while (gUnknown_0839F354[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); -} - -bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - CameraObjectReset2(); - FreezeMapObjects(); - gPlayerAvatar.preventStep = TRUE; - mapObject->mapobj_bit_13 = 1; - task->data[0]++; - return FALSE; -} - -bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (IsWeatherNotFadingIn()) - { - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); - task->data[0]++; - } - return FALSE; -} - -bool8 sub_8087548(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite = &gSprites[task->data[1]]; - if (sprite->animCmdIndex > 1) - { - task->data[0]++; - mapObject->mapobj_bit_13 = 0; - CameraObjectReset1(); - PlaySE(SE_W091); - FieldObjectSetSpecialAnim(mapObject, sub_80608A4(DIR_EAST)); - } - return FALSE; -} - -bool8 sub_808759C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - gPlayerAvatar.preventStep = FALSE; - ScriptContext2_Disable(); - UnfreezeMapObjects(); - DestroyTask(FindTaskIdByFunc(sub_8087470)); - } - return FALSE; -} - -extern void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy); -extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; - -u8 FldEff_LavaridgeGymWarp(void) -{ - u8 spriteId; - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; - gSprites[spriteId].coordOffsetEnabled = 1; - return spriteId; -} - -void sub_8087638(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); - } -} - -void sub_808766C(u8); - -void sub_8087654(u8 priority) -{ - CreateTask(sub_808766C, priority); -} - -void sub_808766C(u8 taskId) -{ - while(gUnknown_0839F364[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); -} - -bool8 sub_80876C8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - FreezeMapObjects(); - CameraObjectReset2(); - gPlayerAvatar.preventStep = TRUE; - mapObject->mapobj_bit_26 = 1; - task->data[0]++; - return FALSE; -} - -bool8 sub_80876F8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - if (task->data[1] > 3) - { - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); - task->data[0]++; - } else - { - task->data[1]++; - FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); - PlaySE(SE_FU_ZUZUZU); - } - } - return FALSE; -} - -bool8 sub_8087774(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gSprites[task->data[1]].animCmdIndex == 2) - { - mapObject->mapobj_bit_13 = 1; - task->data[0]++; - } - return FALSE; -} - -bool8 sub_80877AC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) - { - sub_8053FF8(); - fade_8080918(); - task->data[0]++; - } - return FALSE; -} - -void sub_80878C4(u8); -void mapldr_080859D4(void); - -bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!gPaletteFade.active && sub_8054034() == TRUE) - { - warp_in(); - gFieldCallback = sub_8086748; - SetMainCallback2(CB2_LoadMap); - DestroyTask(FindTaskIdByFunc(sub_808766C)); - } - return FALSE; -} - -u8 FldEff_PopOutOfAsh(void) -{ - u8 spriteId; - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; - gSprites[spriteId].coordOffsetEnabled = 1; - return spriteId; -} - -void sub_808788C(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH); - } -} - -void sub_80878A8(void) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - CreateTask(sub_80878C4, 0x50); -} - -void sub_80878C4(u8 taskId) -{ - gUnknown_0839F378[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_80878F4(struct Task *task) -{ - task->data[0]++; - task->data[14] = 64; - task->data[15] = player_get_direction_lower_nybble(); -} - -void sub_8087914(struct Task *task) -{ - struct MapObject *mapObject; - u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; - if (task->data[14] != 0 && (--task->data[14]) == 0) - { - sub_8053FF8(); - fade_8080918(); - } - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - if (task->data[14] == 0 && !gPaletteFade.active && sub_8054034() == TRUE) - { - FieldObjectSetDirection(mapObject, task->data[15]); - sub_8053678(); - warp_in(); - gFieldCallback = mapldr_080859D4; - SetMainCallback2(CB2_LoadMap); - DestroyTask(FindTaskIdByFunc(sub_80878C4)); - } else if (task->data[1] == 0 || (--task->data[1]) == 0) - { - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); - if (task->data[2] < 12) - { - task->data[2]++; - } - task->data[1] = 8 >> (task->data[2] >> 2); - } - } -} - -void (*const gUnknown_0839F388[])(struct Task *) = { - sub_8087AA4, - sub_8087AC8 -}; - -void sub_8087A74(u8); - -void mapldr_080859D4(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - FreezeMapObjects(); - gFieldCallback = NULL; - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - CreateTask(sub_8087A74, 0); -} - -void sub_8087A74(u8 taskId) -{ - gUnknown_0839F388[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8087AA4(struct Task *task) -{ - if (IsWeatherNotFadingIn()) - { - task->data[0]++; - task->data[15] = player_get_direction_lower_nybble(); - } -} - -void sub_8087AC8(struct Task *task) -{ - u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; - struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (task->data[1] == 0 || (--task->data[1]) == 0) - { - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) && !FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - return; - } - if (task->data[2] >= 32 && task->data[15] == player_get_direction_lower_nybble()) - { - mapObject->mapobj_bit_13 = 0; - ScriptContext2_Disable(); - UnfreezeMapObjects(); - DestroyTask(FindTaskIdByFunc(sub_8087A74)); - return; - } - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); - if (task->data[2] < 32) - { - task->data[2]++; - } - task->data[1] = task->data[2] >> 2; - } - mapObject->mapobj_bit_13 ^= 1; -} - -void sub_8087BBC(u8); -void mapldr_08085D88(void); - -void sub_8087BA8(void) -{ - CreateTask(sub_8087BBC, 0); -} - -void (*const gUnknown_0839F390[])(struct Task *) = { - sub_8087BEC, - sub_8087C14, - sub_8087CA4, - sub_8087D78 -}; - -void sub_8087BBC(u8 taskId) -{ - gUnknown_0839F390[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8087BEC(struct Task *task) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - CameraObjectReset2(); - task->data[15] = player_get_direction_lower_nybble(); - task->data[0]++; -} - -void sub_8087C14(struct Task *task) -{ - u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; - struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (task->data[1] == 0 || (--task->data[1]) == 0) - { - FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); - task->data[1] = 8; - task->data[2]++; - } - if (task->data[2] > 7 && task->data[15] == mapObject->mapobj_unk_18) - { - task->data[0]++; - task->data[1] = 4; - task->data[2] = 8; - task->data[3] = 1; - PlaySE(SE_TK_WARPIN); - } -} - -void sub_8087CA4(struct Task *task) -{ - u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; - struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; - if ((--task->data[1]) <= 0) - { - task->data[1] = 4; - FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); - } - sprite->pos1.y -= task->data[3]; - task->data[4] += task->data[3]; - if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8)) - { - task->data[3] <<= 1; - } - if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != 0)) - { - sprite->subspriteMode = 2; - } - if (task->data[4] >= 0xa8) - { - task->data[0]++; - sub_8053FF8(); - fade_8080918(); - } -} - -void sub_8087D78(struct Task *task) -{ - if (!gPaletteFade.active && sub_8054034() == TRUE) - { - Overworld_SetWarpDestToLastHealLoc(); - warp_in(); - SetMainCallback2(CB2_LoadMap); - gFieldCallback = mapldr_08085D88; - DestroyTask(FindTaskIdByFunc(sub_8087BBC)); - } -} - -void sub_8087E1C(u8); - -void mapldr_08085D88(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_for_map_transition(); - ScriptContext2_Enable(); - FreezeMapObjects(); - gFieldCallback = NULL; - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - CameraObjectReset2(); - CreateTask(sub_8087E1C, 0); -} - -void (*const gUnknown_0839F3A0[])(struct Task *) = { - sub_8087E4C, - sub_8087ED8, - sub_8087FDC -}; - -void sub_8087E1C(u8 taskId) -{ - gUnknown_0839F3A0[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8087E4C(struct Task *task) -{ - struct Sprite *sprite; - s16 centerToCornerVecY; - if (IsWeatherNotFadingIn()) - { - sprite = &gSprites[gPlayerAvatar.spriteId]; - centerToCornerVecY = -(sprite->centerToCornerVecY << 1); - sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; - task->data[0]++; - task->data[1] = 8; - task->data[2] = 1; - task->data[14] = sprite->subspriteMode; - task->data[15] = player_get_direction_lower_nybble(); - PlaySE(SE_TK_WARPIN); - } -} - -void sub_8087ED8(struct Task *task) -{ - u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; - struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; - if ((sprite->pos2.y += task->data[1]) >= -8) - { - if (task->data[13] == 0) - { - task->data[13]++; - mapObject->mapobj_bit_2 = 1; - sprite->subspriteMode = task->data[14]; - } - } else - { - sprite->oam.priority = 1; - if (sprite->subspriteMode != 0) - { - sprite->subspriteMode = 2; - } - } - if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1)) - { - task->data[1]--; - } - if ((--task->data[2]) == 0) - { - task->data[2] = 4; - FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); - } - if (sprite->pos2.y >= 0) - { - sprite->pos2.y = 0; - task->data[0]++; - task->data[1] = 1; - task->data[2] = 0; - } -} - -void sub_8087FDC(struct Task *task) -{ - u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; - struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if ((--task->data[1]) == 0) - { - FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); - task->data[1] = 8; - if ((++task->data[2]) > 4 && task->data[14] == mapObject->mapobj_unk_18) - { - ScriptContext2_Disable(); - CameraObjectReset1(); - UnfreezeMapObjects(); - DestroyTask(FindTaskIdByFunc(sub_8087E1C)); - } - } -} - -void sub_8088120(u8); -void sub_808847C(u8); -u8 sub_8088830(u32, u32, u32); -void sub_80883DC(void); -void sub_808843C(u16); -void sub_8088890(struct Sprite *); - -bool8 FldEff_FieldMoveShowMon(void) -{ - u8 taskId; - if (is_map_type_1_2_3_5_or_6(Overworld_GetMapTypeOfSaveblockLocation()) == TRUE) - { - taskId = CreateTask(sub_8088120, 0xff); - } else - { - taskId = CreateTask(sub_808847C, 0xff); - } - gTasks[taskId].data[15] = sub_8088830(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - return FALSE; -} - -bool8 FldEff_FieldMoveShowMonInit(void) -{ - struct Pokemon *pokemon; - u32 flag = gFieldEffectArguments[0] & 0x80000000; - pokemon = &gPlayerParty[(u8)gFieldEffectArguments[0]]; - gFieldEffectArguments[0] = GetMonData(pokemon, MON_DATA_SPECIES); - gFieldEffectArguments[1] = GetMonData(pokemon, MON_DATA_OT_ID); - gFieldEffectArguments[2] = GetMonData(pokemon, MON_DATA_PERSONALITY); - gFieldEffectArguments[0] |= flag; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); - FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - return FALSE; -} - -void (*const gUnknown_0839F3AC[])(struct Task *) = { - sub_8088150, - sub_80881C0, - sub_8088228, - sub_80882B4, - sub_80882E4, - sub_8088338, - sub_8088380 -}; - -void sub_8088120(u8 taskId) -{ - gUnknown_0839F3AC[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8088150(struct Task *task) -{ - task->data[11] = REG_WININ; - task->data[12] = REG_WINOUT; - StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback); - task->data[1] = 0xf0f1; - task->data[2] = 0x5051; - task->data[3] = 0x3f; - task->data[4] = 0x3e; - REG_WIN0H = task->data[1]; - REG_WIN0V = task->data[2]; - REG_WININ = task->data[3]; - REG_WINOUT = task->data[4]; - SetVBlankCallback(sub_80883DC); - task->data[0]++; -} - -void sub_80881C0(struct Task *task) -{ - u16 offset; - u16 delta; - offset = ((REG_BG0CNT >> 2) << 14); - delta = ((REG_BG0CNT >> 8) << 11); - CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x200); - CpuFill32(0, (void *)(VRAM + delta), 0x800); - LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); - sub_808843C(delta); - task->data[0]++; -} - -void sub_8088228(struct Task *task) -{ - s16 v0; - s16 v2; - s16 v3; - task->data[5] -= 16; - v0 = ((u16)task->data[1] >> 8); - v2 = ((u16)task->data[2] >> 8); - v3 = ((u16)task->data[2] & 0xff); - v0 -= 16; - v2 -= 2; - v3 += 2; - if (v0 < 0) - { - v0 = 0; - } - if (v2 < 0x28) - { - v2 = 0x28; - } - if (v3 > 0x78) - { - v3 = 0x78; - } - task->data[1] = (v0 << 8) | (task->data[1] & 0xff); - task->data[2] = (v2 << 8) | v3; - if (v0 == 0 && v2 == 0x28 && v3 == 0x78) - { - gSprites[task->data[15]].callback = sub_8088890; - task->data[0]++; - } -} - -void sub_80882B4(struct Task *task) -{ - task->data[5] -= 16; - if (gSprites[task->data[15]].data[7]) - { - task->data[0]++; - } -} - -void sub_80882E4(struct Task *task) -{ - s16 v2; - s16 v3; - task->data[5] -= 16; - v2 = (task->data[2] >> 8); - v3 = (task->data[2] & 0xff); - v2 += 6; - v3 -= 6; - if (v2 > 0x50) - { - v2 = 0x50; - } - if (v3 < 0x51) - { - v3 = 0x51; - } - task->data[2] = (v2 << 8) | v3; - if (v2 == 0x50 && v3 == 0x51) - { - task->data[0]++; - } -} - -void sub_8088338(struct Task *task) -{ - u16 bg0cnt; - bg0cnt = (REG_BG0CNT >> 8) << 11; - CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); - task->data[1] = 0xf1; - task->data[2] = 0xa1; - task->data[3] = task->data[11]; - task->data[4] = task->data[12]; - task->data[0]++; -} - -void sub_8088380(struct Task *task) -{ - IntrCallback callback; - LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); - SetVBlankCallback(callback); - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); - FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); - DestroyTask(FindTaskIdByFunc(sub_8088120)); -} - -void sub_80883DC(void) -{ - struct Task *task; - IntrCallback callback; - task = &gTasks[FindTaskIdByFunc(sub_8088120)]; - LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); - callback(); - REG_WIN0H = task->data[1]; - REG_WIN0V = task->data[2]; - REG_WININ = task->data[3]; - REG_WINOUT = task->data[4]; - REG_BG0HOFS = task->data[5]; - REG_BG0VOFS = task->data[6]; -} - -void sub_808843C(u16 offs) -{ - u16 i; - u16 *dest; - dest = (u16 *)(VRAM + 0x140 + offs); - for (i=0; i<0x140; i++, dest++) - { - *dest = gFieldMoveStreaksTilemap[i] | 0xf000; - } -} - -void sub_80886B0(void); -bool8 sub_8088708(struct Task *); -void sub_80886F8(struct Task *); -bool8 sub_80887C0(struct Task *); - -void (*const gUnknown_0839F3C8[])(struct Task *) = { - sub_80884AC, - sub_80884E8, - sub_8088554, - sub_80885A8, - sub_80885D8, - sub_808860C, - sub_808862C -}; - -void sub_808847C(u8 taskId) -{ - gUnknown_0839F3C8[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_80884AC(struct Task *task) -{ - REG_BG0HOFS = task->data[1]; - REG_BG0VOFS = task->data[2]; - StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); - SetVBlankCallback(sub_80886B0); - task->data[0]++; -} - -void sub_80884E8(struct Task *task) -{ - u16 offset; - u16 delta; - offset = ((REG_BG0CNT >> 2) << 14); - delta = ((REG_BG0CNT >> 8) << 11); - task->data[12] = delta; - CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x80); - CpuFill32(0, (void *)(VRAM + delta), 0x800); - LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20); - task->data[0]++; -} - -void sub_8088554(struct Task *task) -{ - if (sub_8088708(task)) - { - REG_WIN1H = 0x00f0; - REG_WIN1V = 0x2878; - gSprites[task->data[15]].callback = sub_8088890; - task->data[0]++; - } - sub_80886F8(task); -} - -void sub_80885A8(struct Task *task) -{ - sub_80886F8(task); - if (gSprites[task->data[15]].data[7]) - { - task->data[0]++; - } -} - -void sub_80885D8(struct Task *task) -{ - sub_80886F8(task); - task->data[3] = task->data[1] & 7; - task->data[4] = 0; - REG_WIN1H = 0xffff; - REG_WIN1V = 0xffff; - task->data[0]++; -} - -void sub_808860C(struct Task *task) -{ - sub_80886F8(task); - if (sub_80887C0(task)) - { - task->data[0]++; - } -} - -void sub_808862C(struct Task *task) -{ - IntrCallback intrCallback; - u16 bg0cnt; - bg0cnt = (REG_BG0CNT >> 8) << 11; - CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); - LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); - SetVBlankCallback(intrCallback); - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); - FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); - DestroyTask(FindTaskIdByFunc(sub_808847C)); -} - -void sub_80886B0(void) -{ - IntrCallback intrCallback; - struct Task *task; - task = &gTasks[FindTaskIdByFunc(sub_808847C)]; - LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); - intrCallback(); - REG_BG0HOFS = task->data[1]; - REG_BG0VOFS = task->data[2]; -} - -void sub_80886F8(struct Task *task) -{ - task->data[1] -= 16; - task->data[3] += 16; -} - -#ifdef NONMATCHING -bool8 sub_8088708(struct Task *task) -{ - u16 i; - u16 srcOffs; - u16 dstOffs; - u16 *dest; - if (task->data[4] >= 32) - { - return TRUE; - } - dstOffs = (task->data[3] >> 3) & 0x1f; - if (dstOffs >= task->data[4]) - { - dstOffs = (32 - dstOffs) & 0x1f; - srcOffs = (32 - task->data[4]) & 0x1f; - dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); - for (i=0; i<10; i++) - { - dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32] | 0xf000; - dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; - } - task->data[4] += 2; - } - return FALSE; -} -#else -__attribute__((naked)) -bool8 sub_8088708(struct Task *task) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x4\n" - "\tadds r5, r0, 0\n" - "\tldrh r2, [r5, 0x10]\n" - "\tmovs r1, 0x10\n" - "\tldrsh r0, [r5, r1]\n" - "\tcmp r0, 0x1F\n" - "\tble _08088724\n" - "\tmovs r0, 0x1\n" - "\tb _080887A8\n" - "_08088724:\n" - "\tldrh r0, [r5, 0xE]\n" - "\tlsls r0, 16\n" - "\tasrs r3, r0, 19\n" - "\tmovs r1, 0x1F\n" - "\tands r3, r1\n" - "\tmovs r4, 0x10\n" - "\tldrsh r0, [r5, r4]\n" - "\tcmp r3, r0\n" - "\tblt _080887A6\n" - "\tmovs r0, 0x20\n" - "\tsubs r3, r0, r3\n" - "\tands r3, r1\n" - "\tsubs r0, r2\n" - "\tmov r12, r0\n" - "\tmov r7, r12\n" - "\tands r7, r1\n" - "\tmov r12, r7\n" - "\tldrh r0, [r5, 0x20]\n" - "\tldr r1, _080887B8 @ =0x06000140\n" - "\tadds r1, r0\n" - "\tmov r8, r1\n" - "\tmovs r4, 0\n" - "\tldr r7, _080887BC @ =gDarknessFieldMoveStreaksTilemap\n" - "\tmov r10, r7\n" - "\tmovs r0, 0xF0\n" - "\tlsls r0, 8\n" - "\tmov r9, r0\n" - "\tadds r1, r3, 0x1\n" - "\tmovs r0, 0x1F\n" - "\tands r1, r0\n" - "\tstr r1, [sp]\n" - "\tmov r6, r12\n" - "\tadds r6, 0x1\n" - "\tands r6, r0\n" - "_08088768:\n" - "\tlsls r1, r4, 5\n" - "\tadds r2, r1, r3\n" - "\tlsls r2, 1\n" - "\tadd r2, r8\n" - "\tmov r7, r12\n" - "\tadds r0, r7, r1\n" - "\tlsls r0, 1\n" - "\tadd r0, r10\n" - "\tldrh r0, [r0]\n" - "\tmov r7, r9\n" - "\torrs r0, r7\n" - "\tstrh r0, [r2]\n" - "\tldr r0, [sp]\n" - "\tadds r2, r1, r0\n" - "\tlsls r2, 1\n" - "\tadd r2, r8\n" - "\tadds r1, r6, r1\n" - "\tlsls r1, 1\n" - "\tadd r1, r10\n" - "\tldrh r0, [r1]\n" - "\tmov r1, r9\n" - "\torrs r0, r1\n" - "\tstrh r0, [r2]\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tcmp r4, 0x9\n" - "\tbls _08088768\n" - "\tldrh r0, [r5, 0x10]\n" - "\tadds r0, 0x2\n" - "\tstrh r0, [r5, 0x10]\n" - "_080887A6:\n" - "\tmovs r0, 0\n" - "_080887A8:\n" - "\tadd sp, 0x4\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.align 2, 0\n" - "_080887B8: .4byte 0x06000140\n" - "_080887BC: .4byte gDarknessFieldMoveStreaksTilemap"); -} -#endif - -bool8 sub_80887C0(struct Task *task) -{ - u16 i; - u16 dstOffs; - u16 *dest; - if (task->data[4] >= 32) - { - return TRUE; - } - dstOffs = task->data[3] >> 3; - if (dstOffs >= task->data[4]) - { - dstOffs = (task->data[1] >> 3) & 0x1f; - dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); - for (i=0; i<10; i++) - { - dest[dstOffs + i * 32] = 0xf000; - dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; - } - task->data[4] += 2; - } - return FALSE; -} - -u8 sub_8088830(u32 a0, u32 a1, u32 a2) -{ - u16 v0; - u8 monSprite; - struct Sprite *sprite; - v0 = (a0 & 0x80000000) >> 16; - a0 &= 0x7fffffff; - monSprite = CreateMonSprite_FieldMove(a0, a1, a2, 0x140, 0x50, 0); - sprite = &gSprites[monSprite]; - sprite->callback = SpriteCallbackDummy; - sprite->oam.priority = 0; - sprite->data[0] = a0; - sprite->data[6] = v0; - return monSprite; -} - -void sub_80888D4(struct Sprite *); - -void sub_8088890(struct Sprite *sprite) -{ - if ((sprite->pos1.x -= 20) <= 0x78) - { - sprite->pos1.x = 0x78; - sprite->data[1] = 30; - sprite->callback = sub_80888D4; - if (sprite->data[6]) - { - PlayCry2(sprite->data[0], 0, 0x7d, 0xa); - } else - { - PlayCry1(sprite->data[0], 0); - } - } -} - -void sub_80888F0(struct Sprite *); - -void sub_80888D4(struct Sprite *sprite) -{ - if ((--sprite->data[1]) == 0) - { - sprite->callback = sub_80888F0; - } -} - -void sub_80888F0(struct Sprite *sprite) -{ - if (sprite->pos1.x < -0x40) - { - sprite->data[7] = 1; - } else - { - sprite->pos1.x -= 20; - } -} - -void sub_8088954(u8); - -u8 FldEff_UseSurf(void) -{ - u8 taskId; - taskId = CreateTask(sub_8088954, 0xff); - gTasks[taskId].data[15] = gFieldEffectArguments[0]; - Overworld_ClearSavedMusic(); - Overworld_ChangeMusicTo(0x016d); - return FALSE; -} - -void (*const gUnknown_0839F3E4[])(struct Task *) = { - sub_8088984, - sub_80889E4, - sub_8088A30, - sub_8088A78, - sub_8088AF4 -}; - -void sub_8088954(u8 taskId) -{ - gUnknown_0839F3E4[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8088984(struct Task *task) -{ - ScriptContext2_Enable(); - FreezeMapObjects(); - gPlayerAvatar.preventStep = TRUE; - SetPlayerAvatarStateMask(8); - PlayerGetDestCoords(&task->data[1], &task->data[2]); - MoveCoords(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18, &task->data[1], &task->data[2]); - task->data[0]++; -} - -void sub_80889E4(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - sub_8059BF4(); - FieldObjectSetSpecialAnim(mapObject, 0x39); - task->data[0]++; - } -} - -void sub_8088A30(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject)) - { - gFieldEffectArguments[0] = task->data[15] | 0x80000000; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - task->data[0]++; - } -} - -void sub_8088A78(struct Task *task) -{ - struct MapObject *mapObject; - if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(3)); - FieldObjectClearAnimIfSpecialAnimFinished(mapObject); - FieldObjectSetSpecialAnim(mapObject, sub_80608D0(mapObject->placeholder18)); - gFieldEffectArguments[0] = task->data[1]; - gFieldEffectArguments[1] = task->data[2]; - gFieldEffectArguments[2] = gPlayerAvatar.mapObjectId; - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_SURF_BLOB); - task->data[0]++; - } -} - -void sub_8088AF4(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - gPlayerAvatar.preventStep = FALSE; - gPlayerAvatar.flags &= 0xdf; - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(mapObject->placeholder18)); - sub_8127ED0(mapObject->mapobj_unk_1A, 1); - UnfreezeMapObjects(); - ScriptContext2_Disable(); - FieldEffectActiveListRemove(FLDEFF_USE_SURF); - DestroyTask(FindTaskIdByFunc(sub_8088954)); - } -} - -void sub_8088BC4(struct Sprite *); - -u8 FldEff_NPCFlyOut(void) -{ - u8 spriteId; - struct Sprite *sprite; - spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1); - sprite = &gSprites[spriteId]; - sprite->oam.paletteNum = 0; - sprite->oam.priority = 1; - sprite->callback = sub_8088BC4; - sprite->data[1] = gFieldEffectArguments[0]; - PlaySE(SE_W019); - return spriteId; -} - -void sub_8088BC4(struct Sprite *sprite) -{ - struct Sprite *npcSprite; - sprite->pos2.x = Cos(sprite->data[2], 0x8c); - sprite->pos2.y = Sin(sprite->data[2], 0x48); - sprite->data[2] = (sprite->data[2] + 4) & 0xff; - if (sprite->data[0]) - { - npcSprite = &gSprites[sprite->data[1]]; - npcSprite->coordOffsetEnabled = 0; - npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x; - npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; - npcSprite->pos2.x = 0; - npcSprite->pos2.y = 0; - } - if (sprite->data[2] >= 0x80) - { - FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); - } -} - -void sub_8088C70(u8); -extern void sub_8127EFC(u8, u8); -u8 sub_8088F60(void); -bool8 sub_8088FA4(u8); -void sub_8088FC0(u8); -void sub_8088FFC(u8, u8); -void sub_8089018(struct Sprite *); -void sub_80890D8(struct Sprite *); - -u8 FldEff_UseFly(void) -{ - u8 taskId; - taskId = CreateTask(sub_8088C70, 0xfe); - gTasks[taskId].data[1] = gFieldEffectArguments[0]; - return 0; -} - -void (*const gUnknown_0839F3F8[])(struct Task *) = { - sub_8088CA0, - sub_8088CF8, - sub_8088D3C, - sub_8088D94, - sub_8088DD8, - sub_8088E2C, - sub_8088EB4, - sub_8088F10, - sub_8088F30 -}; - -void sub_8088C70(u8 taskId) -{ - gUnknown_0839F3F8[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_8088CA0(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - task->data[15] = gPlayerAvatar.flags; - gPlayerAvatar.preventStep = TRUE; - SetPlayerAvatarStateMask(1); - sub_8059BF4(); - FieldObjectSetSpecialAnim(mapObject, 0x39); - task->data[0]++; - } -} - -void sub_8088CF8(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - task->data[0]++; - gFieldEffectArguments[0] = task->data[1]; - FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - } -} - -void sub_8088D3C(struct Task *task) -{ - struct MapObject *mapObject; - if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (task->data[15] & 0x08) - { - sub_8127ED0(mapObject->mapobj_unk_1A, 2); - sub_8127EFC(mapObject->mapobj_unk_1A, 0); - } - task->data[1] = sub_8088F60(); - task->data[0]++; - } -} - -void sub_8088D94(struct Task *task) -{ - if (sub_8088FA4(task->data[1])) - { - task->data[0]++; - task->data[2] = 16; - SetPlayerAvatarTransitionFlags(0x01); - FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], 0x02); - } -} - -void sub_8088DD8(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if ((task->data[2] == 0 || (--task->data[2]) == 0) && FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - task->data[0]++; - PlaySE(SE_W019); - sub_8088FC0(task->data[1]); - } -} - -void sub_8088E2C(struct Task *task) -{ - struct MapObject *mapObject; - if ((++task->data[2]) >= 8) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x03)); - StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); - mapObject->mapobj_bit_12 = 1; - FieldObjectSetSpecialAnim(mapObject, 0x48); - if (task->data[15] & 0x08) - { - DestroySprite(&gSprites[mapObject->mapobj_unk_1A]); - } - task->data[0]++; - task->data[2] = 0; - } -} - -void sub_8088EB4(struct Task *task) -{ - struct MapObject *mapObject; - if ((++task->data[2]) >= 10) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - mapObject->mapobj_bit_12 = 0; - mapObject->mapobj_bit_22 = 0; - sub_8088FFC(task->data[1], mapObject->spriteId); - CameraObjectReset2(); - task->data[0]++; - } -} - -void sub_8088F10(struct Task *task) -{ - if (sub_8088FA4(task->data[1])) - { - fade_8080918(); - task->data[0]++; - } -} - -void sub_8088F30(struct Task *task) -{ - if (!gPaletteFade.active) - { - FieldEffectActiveListRemove(FLDEFF_USE_FLY); - DestroyTask(FindTaskIdByFunc(sub_8088C70)); - } -} - -u8 sub_8088F60(void) -{ - u8 spriteId; - struct Sprite *sprite; - spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1); - sprite = &gSprites[spriteId]; - sprite->oam.paletteNum = 0; - sprite->oam.priority = 1; - sprite->callback = sub_8089018; - return spriteId; -} - -u8 sub_8088FA4(u8 spriteId) -{ - return gSprites[spriteId].data[7]; -} - -void sub_8088FC0(u8 spriteId) -{ - struct Sprite *sprite; - sprite = &gSprites[spriteId]; - sprite->callback = sub_80890D8; - sprite->pos1.x = 0x78; - sprite->pos1.y = 0x00; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */); - sprite->data[6] = 0x40; -} - -void sub_8088FFC(u8 a0, u8 a1) -{ - gSprites[a0].data[6] = a1; -} - -const union AffineAnimCmd SpriteAffineAnim_839F41C[] = { - AFFINEANIMCMD_FRAME(8, 8, -30, 0), - AFFINEANIMCMD_FRAME(28, 28, 0, 30), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd SpriteAffineAnim_839F434[] = { - AFFINEANIMCMD_FRAME(256, 256, 64, 0), - AFFINEANIMCMD_FRAME(-10, -10, 0, 22), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_0839F44C[] = { - SpriteAffineAnim_839F41C, - SpriteAffineAnim_839F434 -}; - -void sub_8089018(struct Sprite *sprite) -{ - if (sprite->data[7] == 0) - { - if (sprite->data[0] == 0) - { - sprite->oam.affineMode = 3; - sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; - InitSpriteAffineAnim(sprite); - StartSpriteAffineAnim(sprite, 0); - sprite->pos1.x = 0x76; - sprite->pos1.y = -0x30; - sprite->data[0]++; - sprite->data[1] = 0x40; - sprite->data[2] = 0x100; - } - sprite->data[1] += (sprite->data[2] >> 8); - sprite->pos2.x = Cos(sprite->data[1], 0x78); - sprite->pos2.y = Sin(sprite->data[1], 0x78); - if (sprite->data[2] < 0x800) - { - sprite->data[2] += 0x60; - } - if (sprite->data[1] > 0x81) - { - sprite->data[7]++; - sprite->oam.affineMode = 0; - FreeOamMatrix(sprite->oam.matrixNum); - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0); - } - } -} - -void sub_80890D8(struct Sprite *sprite) -{ - struct Sprite *sprite1; - sprite->pos2.x = Cos(sprite->data[2], 0x8c); - sprite->pos2.y = Sin(sprite->data[2], 0x48); - sprite->data[2] = (sprite->data[2] + 4) & 0xff; - if (sprite->data[6] != 0x40) - { - sprite1 = &gSprites[sprite->data[6]]; - sprite1->coordOffsetEnabled = 0; - sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x; - sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; - sprite1->pos2.x = 0; - sprite1->pos2.y = 0; - } - if (sprite->data[2] >= 0x80) - { - sprite->data[7] = 1; - } -} - -void sub_808914C(struct Sprite *sprite) -{ - if (sprite->data[7] == 0) - { - if (sprite->data[0] == 0) - { - sprite->oam.affineMode = 3; - sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; - InitSpriteAffineAnim(sprite); - StartSpriteAffineAnim(sprite, 1); - sprite->pos1.x = 0x5e; - sprite->pos1.y = -0x20; - sprite->data[0]++; - sprite->data[1] = 0xf0; - sprite->data[2] = 0x800; - sprite->data[4] = 0x80; - } - sprite->data[1] += sprite->data[2] >> 8; - sprite->data[3] += sprite->data[2] >> 8; - sprite->data[1] &= 0xff; - sprite->pos2.x = Cos(sprite->data[1], 0x20); - sprite->pos2.y = Sin(sprite->data[1], 0x78); - if (sprite->data[2] > 0x100) - { - sprite->data[2] -= sprite->data[4]; - } - if (sprite->data[4] < 0x100) - { - sprite->data[4] += 24; - } - if (sprite->data[2] < 0x100) - { - sprite->data[2] = 0x100; - } - if (sprite->data[3] >= 60) - { - sprite->data[7]++; - sprite->oam.affineMode = 0; - FreeOamMatrix(sprite->oam.matrixNum); - sprite->invisible = 1; - } - } -} - -void sub_8089230(u8 spriteId) -{ - sub_8088FC0(spriteId); - gSprites[spriteId].callback = sub_808914C; -} - -void sub_8089270(u8); - -u8 FldEff_FlyIn(void) -{ - CreateTask(sub_8089270, 0xfe); - return 0; -} - -void (*const gUnknown_0839F454[])(struct Task *) = { - sub_80892A0, - sub_8089354, - sub_80893C0, - sub_8089414, - sub_808948C, - sub_80894C4, - fishE -}; - -void sub_8089270(u8 taskId) -{ - gUnknown_0839F454[gTasks[taskId].data[0]](&gTasks[taskId]); -} - -void sub_80892A0(struct Task *task) -{ - struct MapObject *mapObject; - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - task->data[0]++; - task->data[2] = 17; - task->data[15] = gPlayerAvatar.flags; - gPlayerAvatar.preventStep = TRUE; - SetPlayerAvatarStateMask(0x01); - if (task->data[15] & 0x08) - { - sub_8127ED0(mapObject->mapobj_unk_1A, 0); - } - sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x3)); - CameraObjectReset2(); - FieldObjectTurn(mapObject, DIR_WEST); - StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); - mapObject->mapobj_bit_13 = 0; - task->data[1] = sub_8088F60(); - sub_8088FC0(task->data[1]); - sub_8088FFC(task->data[1], mapObject->spriteId); - } -} - -void sub_8089354(struct Task *task) -{ - struct MapObject *mapObject; - struct Sprite *sprite; - if (task->data[2] == 0 || (--task->data[2]) == 0) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - sub_8088FFC(task->data[1], 0x40); - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - task->data[0]++; - task->data[2] = 0; - } -} - -void sub_80893C0(struct Task *task) -{ - s16 unknown_0839F470[18] = { - -2, - -4, - -5, - -6, - -7, - -8, - -8, - -8, - -7, - -7, - -6, - -5, - -3, - -2, - 0, - 2, - 4, - 8 - }; - struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; - sprite->pos2.y = unknown_0839F470[task->data[2]]; - if ((++task->data[2]) >= 18) - { - task->data[0]++; - } -} - -void sub_8089414(struct Task *task) -{ - struct MapObject *mapObject; - struct Sprite *sprite; - if (sub_8088FA4(task->data[1])) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - mapObject->mapobj_bit_12 = 0; - sub_805C058(mapObject, mapObject->coords2.x, mapObject->coords2.y); - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->coordOffsetEnabled = 1; - sub_8059BF4(); - FieldObjectSetSpecialAnim(mapObject, 0x39); - task->data[0]++; - } -} - -void sub_808948C(struct Task *task) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gPlayerAvatar.mapObjectId])) - { - task->data[0]++; - sub_8089230(task->data[1]); - } -} - -void sub_80894C4(struct Task *task) -{ - if (sub_8088FA4(task->data[1])) - { - DestroySprite(&gSprites[task->data[1]]); - task->data[0]++; - task->data[1] = 0x10; - } -} - -void fishE(struct Task *task) -{ - u8 state; - struct MapObject *mapObject; - if ((--task->data[1]) == 0) - { - mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - state = 0; - if (task->data[15] & 0x08) - { - state = 3; - sub_8127ED0(mapObject->mapobj_unk_1A, 1); - } - sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(state)); - FieldObjectTurn(mapObject, DIR_SOUTH); - gPlayerAvatar.flags = task->data[15]; - gPlayerAvatar.preventStep = FALSE; - FieldEffectActiveListRemove(FLDEFF_FLY_IN); - DestroyTask(FindTaskIdByFunc(sub_8089270)); - } -} diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c deleted file mode 100644 index bc4a1770e..000000000 --- a/src/field/field_effect_helpers.c +++ /dev/null @@ -1,1602 +0,0 @@ -#include "global.h" -#include "sprite.h" -#include "fieldmap.h" -#include "metatile_behavior.h" -#include "constants/songs.h" -#include "sound.h" -#include "event_object_movement.h" -#include "field_camera.h" -#include "field_weather.h" -#include "field_effect.h" -#include "field_effect_helpers.h" - -static void sub_81269E0(struct Sprite *); -static void npc_pal_op(struct MapObject *mapObject, struct Sprite *sprite); -static void npc_pal_op_A(struct MapObject *, u8); -static void npc_pal_op_B(struct MapObject *, u8); -static void sub_81275A0(struct Sprite *); -static void sub_81275C4(struct Sprite *); -static void sub_8127DA0(struct Sprite *); -static void sub_8127DD0(struct Sprite *); -static void sub_8127E30(struct Sprite *); -static void sub_812882C(struct Sprite *, u8, u8); -static void sub_81278D8(struct Sprite *); -static void sub_8127FD4(struct MapObject *, struct Sprite *); -static void sub_812800C(struct MapObject *, struct Sprite *); -static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *); -static void sub_8128174(struct Sprite *); -static u32 ShowDisguiseFieldEffect(u8, u8, u8); - -void SetUpReflection(struct MapObject *mapObject, struct Sprite *sprite, bool8 flag) -{ - struct Sprite *newSprite; - - newSprite = &gSprites[obj_unfreeze(sprite, sprite->pos1.x, sprite->pos1.y, 0x98)]; - newSprite->callback = sub_81269E0; - newSprite->oam.priority = 3; - newSprite->oam.paletteNum = gUnknown_0830FD14[newSprite->oam.paletteNum]; - newSprite->usingSheet = TRUE; - newSprite->anims = gDummySpriteAnimTable; - StartSpriteAnim(newSprite, 0); - newSprite->affineAnims = gDummySpriteAffineAnimTable; - newSprite->affineAnimBeginning = TRUE; - newSprite->subspriteMode = 0; - newSprite->data[0] = sprite->data[0]; - newSprite->data[1] = mapObject->localId; - newSprite->data[7] = flag; - npc_pal_op(mapObject, newSprite); - if (!flag) - { - newSprite->oam.affineMode = 1; - } -} - -static s16 sub_81268D0(struct MapObject *mapObject) -{ - return GetFieldObjectGraphicsInfo(mapObject->graphicsId)->height - 2; -} - -static void npc_pal_op(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 whichElement; - u16 unk_8041e2c[] = {0x0c, 0x1c, 0x2c}; - sprite->data[2] = 0; - if (!GetFieldObjectGraphicsInfo(mapObject->graphicsId)->disableReflectionPaletteLoad && ((whichElement = sub_8057450(mapObject->mapobj_unk_1F)) || (whichElement = sub_8057450(mapObject->mapobj_unk_1E)))) - { - sprite->data[2] = unk_8041e2c[whichElement - 1]; - npc_pal_op_A(mapObject, sprite->oam.paletteNum); - } - else - { - npc_pal_op_B(mapObject, sprite->oam.paletteNum); - } -} - -static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum) -{ - const struct MapObjectGraphicsInfo *graphicsInfo; - - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (graphicsInfo->paletteTag2 != 0x11ff) - { - if (graphicsInfo->paletteSlot == 0) - { - npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, paletteNum); - } - else if (graphicsInfo->paletteSlot == 10) - { - npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, paletteNum); - } - else - { - pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum); - } - UpdateSpritePaletteWithWeather(paletteNum); - } -} - -static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum) -{ - const struct MapObjectGraphicsInfo *graphicsInfo; - - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (graphicsInfo->paletteTag2 != 0x11ff) - { - pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum); - UpdateSpritePaletteWithWeather(paletteNum); - } -} - -static void sub_81269E0(struct Sprite *sprite) -{ - struct MapObject *mapObject; - struct Sprite *oldSprite; - - mapObject = &gMapObjects[sprite->data[0]]; - oldSprite = &gSprites[mapObject->spriteId]; - if (!mapObject->active || !mapObject->mapobj_bit_17 || mapObject->localId != sprite->data[1]) - { - sprite->inUse = FALSE; - } - else - { - sprite->oam.paletteNum = gUnknown_0830FD14[oldSprite->oam.paletteNum]; - sprite->oam.shape = oldSprite->oam.shape; - sprite->oam.size = oldSprite->oam.size; - sprite->oam.matrixNum = oldSprite->oam.matrixNum | 0x10; - sprite->oam.tileNum = oldSprite->oam.tileNum; - sprite->subspriteTables = oldSprite->subspriteTables; - sprite->subspriteTableNum = oldSprite->subspriteTableNum; - sprite->invisible = oldSprite->invisible; - sprite->pos1.x = oldSprite->pos1.x; - sprite->pos1.y = oldSprite->pos1.y + sub_81268D0(mapObject) + sprite->data[2]; - sprite->centerToCornerVecX = oldSprite->centerToCornerVecX; - sprite->centerToCornerVecY = oldSprite->centerToCornerVecY; - sprite->pos2.x = oldSprite->pos2.x; - sprite->pos2.y = -oldSprite->pos2.y; - sprite->coordOffsetEnabled = oldSprite->coordOffsetEnabled; - if (sprite->data[7] == FALSE) - { - sprite->oam.matrixNum = 0; - if (oldSprite->oam.matrixNum & 0x8) - { - sprite->oam.matrixNum = 1; - } - } - } -} - -u8 sub_8126B54(void) -{ - u8 spriteId; - struct Sprite *sprite; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[8] /*gFieldEffectSpriteTemplate_Arrow*/, 0, 0, 0x52); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - sprite->coordOffsetEnabled = TRUE; - sprite->invisible = TRUE; - } - return spriteId; -} - -void objid_set_invisible(u8 spriteId) -{ - gSprites[spriteId].invisible = TRUE; -} - -void sub_8126BC4(u8 spriteId, u8 animNum, s16 x, s16 y) -{ - s16 x2; - s16 y2; - struct Sprite *sprite; - - sprite = &gSprites[spriteId]; - if (sprite->invisible || sprite->data[0] != x || sprite->data[1] != y) - { - sub_80603CC(x, y, &x2, &y2); - sprite = &gSprites[spriteId]; - sprite->pos1.x = x2 + 8; - sprite->pos1.y = y2 + 8; - sprite->invisible = FALSE; - sprite->data[0] = x; - sprite->data[1] = y; - StartSpriteAnim(sprite, animNum - 1); - } -} - -const u8 gUnknown_08401E32[] = { - 0, - 1, - 2, - 3 -}; - -const u16 gUnknown_08401E36[] = { - 4, - 4, - 4, - 16 -}; - -u32 FldEff_Shadow(void) -{ - u8 mapObjectId; - const struct MapObjectGraphicsInfo *graphicsInfo; - u8 spriteId; - - mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[gUnknown_08401E32[graphicsInfo->shadowSize]], 0, 0, 0x94); - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].coordOffsetEnabled = TRUE; - gSprites[spriteId].data[0] = gFieldEffectArguments[0]; - gSprites[spriteId].data[1] = gFieldEffectArguments[1]; - gSprites[spriteId].data[2] = gFieldEffectArguments[2]; - gSprites[spriteId].data[3] = (graphicsInfo->height >> 1) - gUnknown_08401E36[graphicsInfo->shadowSize]; - } - return 0; -} - -void oamc_shadow(struct Sprite *sprite) -{ - u8 mapObjectId; - struct MapObject *mapObject; - struct Sprite *linkedSprite; - - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId)) - { - FieldEffectStop(sprite, FLDEFF_SHADOW); - } - else - { - mapObject = &gMapObjects[mapObjectId]; - linkedSprite = &gSprites[mapObject->spriteId]; - sprite->oam.priority = linkedSprite->oam.priority; - sprite->pos1.x = linkedSprite->pos1.x; - sprite->pos1.y = linkedSprite->pos1.y + sprite->data[3]; - if (!mapObject->active || !mapObject->mapobj_bit_22 || MetatileBehavior_IsPokeGrass(mapObject->mapobj_unk_1E) || MetatileBehavior_IsSurfableWaterOrUnderwater(mapObject->mapobj_unk_1E) || MetatileBehavior_IsSurfableWaterOrUnderwater(mapObject->mapobj_unk_1F) || MetatileBehavior_IsReflective(mapObject->mapobj_unk_1E) || MetatileBehavior_IsReflective(mapObject->mapobj_unk_1F)) - { - FieldEffectStop(sprite, FLDEFF_SHADOW); - } - } -} - -u32 FldEff_TallGrass(void) -{ - s16 x; - s16 y; - u8 spriteId; - struct Sprite *sprite; - - x = gFieldEffectArguments[0]; - y = gFieldEffectArguments[1]; - sub_8060470(&x, &y, 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[4], x, y, 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = gFieldEffectArguments[0]; - sprite->data[2] = gFieldEffectArguments[1]; - sprite->data[3] = gFieldEffectArguments[4]; - sprite->data[4] = gFieldEffectArguments[5]; - sprite->data[5] = gFieldEffectArguments[6]; - if (gFieldEffectArguments[7]) - { - SeekSpriteAnim(sprite, 4); - } - } - return 0; -} - -void unc_grass_normal(struct Sprite *sprite) -{ - u8 mapNum; - u8 mapGroup; - u8 metatileBehavior; - u8 localId; - u8 mapObjectId; - struct MapObject *mapObject; - - mapNum = sprite->data[5] >> 8; - mapGroup = sprite->data[5]; - if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup)) - { - sprite->data[1] -= gCamera.x; - sprite->data[2] -= gCamera.y; - sprite->data[5] = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup; - } - localId = sprite->data[3] >> 8; - mapNum = sprite->data[3]; - mapGroup = sprite->data[4]; - metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded)) - { - FieldEffectStop(sprite, FLDEFF_TALL_GRASS); - } - else - { - mapObject = &gMapObjects[mapObjectId]; - if ((mapObject->coords2.x != sprite->data[1] || mapObject->coords2.y != sprite->data[2]) && (mapObject->coords3.x != sprite->data[1] || mapObject->coords3.y != sprite->data[2])) - { - sprite->data[7] = TRUE; - } - metatileBehavior = 0; - if (sprite->animCmdIndex == 0) - { - metatileBehavior = 4; - } - sub_806487C(sprite, 0); - sub_812882C(sprite, sprite->data[0], metatileBehavior); - } -} - -u32 FldEff_JumpTallGrass(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[10], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = 12; - } - return 0; -} - -u8 sub_8126FF0(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - struct Sprite *sprite; - u8 i; - - for (i = 0; i < MAX_SPRITES; i ++) - { - if (gSprites[i].inUse) - { - sprite = &gSprites[i]; - if (sprite->callback == unc_grass_normal && (x == sprite->data[1] && y == sprite->data[2]) && (localId == (u8)(sprite->data[3] >> 8) && mapNum == (sprite->data[3] & 0xFF) && mapGroup == sprite->data[4])) - { - return i; - } - } - } - return MAX_SPRITES; -} - -u32 FldEff_LongGrass(void) -{ - s16 x; - s16 y; - u8 spriteId; - struct Sprite *sprite; - - x = gFieldEffectArguments[0]; - y = gFieldEffectArguments[1]; - sub_8060470(&x, &y, 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[15], x, y, 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = ZCoordToPriority(gFieldEffectArguments[2]); - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = gFieldEffectArguments[0]; - sprite->data[2] = gFieldEffectArguments[1]; - sprite->data[3] = gFieldEffectArguments[4]; - sprite->data[4] = gFieldEffectArguments[5]; - sprite->data[5] = gFieldEffectArguments[6]; - if (gFieldEffectArguments[7]) - { - SeekSpriteAnim(sprite, 6); - } - } - return 0; -} - -void unc_grass_tall(struct Sprite *sprite) -{ - u8 mapNum; - u8 mapGroup; - u8 metatileBehavior; - u8 localId; - u8 mapObjectId; - struct MapObject *mapObject; - - mapNum = sprite->data[5] >> 8; - mapGroup = sprite->data[5]; - if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup)) - { - sprite->data[1] -= gCamera.x; - sprite->data[2] -= gCamera.y; - sprite->data[5] = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup; - } - localId = sprite->data[3] >> 8; - mapNum = sprite->data[3]; - mapGroup = sprite->data[4]; - metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded)) - { - FieldEffectStop(sprite, FLDEFF_LONG_GRASS); - } - else - { - mapObject = &gMapObjects[mapObjectId]; - if ((mapObject->coords2.x != sprite->data[1] || mapObject->coords2.y != sprite->data[2]) && (mapObject->coords3.x != sprite->data[1] || mapObject->coords3.y != sprite->data[2])) - { - sprite->data[7] = TRUE; - } - sub_806487C(sprite, 0); - sub_812882C(sprite, sprite->data[0], 0); - } -} - -u32 FldEff_JumpLongGrass(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[16], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = 18; - } - return 0; -} - -u32 FldEff_ShortGrass(void) -{ - u8 mapObjectId; - struct MapObject *mapObject; - u8 spriteId; - struct Sprite *sprite; - - mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - mapObject = &gMapObjects[mapObjectId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[30], 0, 0, 0); - if (spriteId != MAX_SPRITES) - { - sprite = &(gSprites[spriteId]); - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = gSprites[mapObject->spriteId].pos1.x; - sprite->data[4] = gSprites[mapObject->spriteId].pos1.y; - } - return 0; -} - -void sub_8127334(struct Sprite *sprite) -{ - u8 mapObjectId; - s16 x; - s16 y; - const struct MapObjectGraphicsInfo *graphicsInfo; - struct Sprite *linkedSprite; - - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_18) - { - FieldEffectStop(sprite, FLDEFF_SHORT_GRASS); - } - else - { - graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); - linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; - y = linkedSprite->pos1.y; - x = linkedSprite->pos1.x; - if (x != sprite->data[3] || y != sprite->data[4]) - { - sprite->data[3] = x; - sprite->data[4] = y; - if (sprite->animEnded) - { - StartSpriteAnim(sprite, 0); - } - } - sprite->pos1.x = x; - sprite->pos1.y = y; - sprite->pos2.y = (graphicsInfo->height >> 1) - 8; - sprite->subpriority = linkedSprite->subpriority - 1; - sprite->oam.priority = linkedSprite->oam.priority; - sub_806487C(sprite, linkedSprite->invisible); - } -} - -u32 FldEff_SandFootprints(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[11], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[7] = FLDEFF_SAND_FOOTPRINTS; - StartSpriteAnim(sprite, gFieldEffectArguments[4]); - } - return 0; -} - -u32 FldEff_DeepSandFootprints(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[23], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[7] = FLDEFF_DEEP_SAND_FOOTPRINTS; - StartSpriteAnim(sprite, gFieldEffectArguments[4]); - } - return spriteId; -} - -u32 FldEff_BikeTireTracks(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[27], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[7] = FLDEFF_BIKE_TIRE_TRACKS; - StartSpriteAnim(sprite, gFieldEffectArguments[4]); - } - return spriteId; -} - -void (*const gUnknown_08401E40[])(struct Sprite *) = { - sub_81275A0, - sub_81275C4 -}; - -void sub_8127584(struct Sprite *sprite) -{ - gUnknown_08401E40[sprite->data[0]](sprite); -} - -static void sub_81275A0(struct Sprite *sprite) -{ - if (++sprite->data[1] > 40) - { - sprite->data[0] = 1; - } - sub_806487C(sprite, FALSE); -} - -static void sub_81275C4(struct Sprite *sprite) -{ - sprite->invisible ^= 1; - sprite->data[1] ++; - sub_806487C(sprite, sprite->invisible); - if (sprite->data[1] > 56) - { - FieldEffectStop(sprite, sprite->data[7]); - } -} - -u32 FldEff_Splash(void) -{ - u8 mapObjectId; - struct MapObject *mapObject; - u8 spriteId; - struct Sprite *sprite; - const struct MapObjectGraphicsInfo *graphicsInfo; - struct Sprite *linkedSprite; - - mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - mapObject = &gMapObjects[mapObjectId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0); - if (spriteId != MAX_SPRITES) - { - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - linkedSprite = &gSprites[mapObject->spriteId]; - sprite->oam.priority = linkedSprite->oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->pos2.y = (graphicsInfo->height >> 1) - 4; - PlaySE(SE_MIZU); - } - return 0; -} - -void sub_81276B4(struct Sprite *sprite) -{ - u8 mapObjectId; - - if (sprite->animEnded || TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId)) - { - FieldEffectStop(sprite, FLDEFF_SPLASH); - } - else - { - sprite->pos1.x = gSprites[gMapObjects[mapObjectId].spriteId].pos1.x; - sprite->pos1.y = gSprites[gMapObjects[mapObjectId].spriteId].pos1.y; - sub_806487C(sprite, FALSE); - } -} - -u32 FldEff_JumpSmallSplash(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[14], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = FLDEFF_JUMP_SMALL_SPLASH; - } - return 0; -} - -u32 FldEff_JumpBigSplash(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[12], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = FLDEFF_JUMP_BIG_SPLASH; - } - return 0; -} - -u32 FldEff_FeetInFlowingWater(void) -{ - u8 mapObjectId; - struct MapObject *mapObject; - u8 spriteId; - struct Sprite *sprite; - const struct MapObjectGraphicsInfo *graphicsInfo; - - mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - mapObject = &gMapObjects[mapObjectId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0); - if (spriteId != MAX_SPRITES) - { - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - sprite = &gSprites[spriteId]; - sprite->callback = sub_81278D8; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = -1; - sprite->data[4] = -1; - sprite->pos2.y = (graphicsInfo->height >> 1) - 4; - StartSpriteAnim(sprite, 1); - } - return 0; -} - -static void sub_81278D8(struct Sprite *sprite) -{ - u8 mapObjectId; - struct Sprite *linkedSprite; - struct MapObject *mapObject; - - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_19) - { - FieldEffectStop(sprite, FLDEFF_FEET_IN_FLOWING_WATER); - } - else - { - mapObject = &gMapObjects[mapObjectId]; - linkedSprite = &gSprites[mapObject->spriteId]; - sprite->pos1.x = linkedSprite->pos1.x; - sprite->pos1.y = linkedSprite->pos1.y; - sprite->subpriority = linkedSprite->subpriority; - sub_806487C(sprite, FALSE); - if (mapObject->coords2.x != sprite->data[3] || mapObject->coords2.y != sprite->data[4]) - { - sprite->data[3] = mapObject->coords2.x; - sprite->data[4] = mapObject->coords2.y; - if (!sprite->invisible) - { - PlaySE(SE_MIZU); - } - } - } -} - -u32 FldEff_Ripple(void) -{ - u8 spriteId; - struct Sprite *sprite; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[5], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_RIPPLE; - } - return 0; -} - -u32 FldEff_HotSpringsWater(void) -{ - u8 mapObjectId; - struct MapObject *mapObject; - u8 spriteId; - struct Sprite *sprite; - - mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - mapObject = &gMapObjects[mapObjectId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[31], 0, 0, 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = gSprites[mapObject->spriteId].pos1.x; - sprite->data[4] = gSprites[mapObject->spriteId].pos1.y; - } - return 0; -} - -void sub_8127A7C(struct Sprite *sprite) -{ - u8 mapObjectId; - const struct MapObjectGraphicsInfo *graphicsInfo; - struct Sprite *linkedSprite; - - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_21) - { - FieldEffectStop(sprite, FLDEFF_HOT_SPRINGS_WATER); - } - else - { - graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); - linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; - sprite->pos1.x = linkedSprite->pos1.x; - sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 8; - sprite->subpriority = linkedSprite->subpriority - 1; - sub_806487C(sprite, FALSE); - } -} - -u32 FldEff_Unknown19(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[17], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNKNOWN_19; - } - return 0; -} - -u32 FldEff_Unknown20(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[18], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNKNOWN_20; - } - return 0; -} - -u32 FldEff_Unknown21(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[19], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNKNOWN_21; - } - return 0; -} - -u32 FldEff_Unknown22(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[20], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = FLDEFF_UNKNOWN_22; - } - return 0; -} - -void ash(s16 x, s16 y, u16 c, s16 d) -{ - gFieldEffectArguments[0] = x; - gFieldEffectArguments[1] = y; - gFieldEffectArguments[2] = 0x52; - gFieldEffectArguments[3] = 1; - gFieldEffectArguments[4] = c; - gFieldEffectArguments[5] = d; - FieldEffectStart(FLDEFF_ASH); -} - -u32 FldEff_Ash(void) -{ - s16 x; - s16 y; - u8 spriteId; - struct Sprite *sprite; - - x = gFieldEffectArguments[0]; - y = gFieldEffectArguments[1]; - sub_8060470(&x, &y, 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[6], x, y, gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[1] = gFieldEffectArguments[0]; - sprite->data[2] = gFieldEffectArguments[1]; - sprite->data[3] = gFieldEffectArguments[4]; - sprite->data[4] = gFieldEffectArguments[5]; - } - return 0; -} - -void (*const gUnknown_08401E48[])(struct Sprite *) = { - sub_8127DA0, - sub_8127DD0, - sub_8127E30 -}; - -void sub_8127D84(struct Sprite *sprite) -{ - gUnknown_08401E48[sprite->data[0]](sprite); -} - -static void sub_8127DA0(struct Sprite *sprite) -{ - sprite->invisible = TRUE; - sprite->animPaused = TRUE; - if (--sprite->data[4] == 0) - { - sprite->data[0] = 1; - } -} - -static void sub_8127DD0(struct Sprite *sprite) -{ - sprite->invisible = FALSE; - sprite->animPaused = FALSE; - MapGridSetMetatileIdAt(sprite->data[1], sprite->data[2], sprite->data[3]); - CurrentMapDrawMetatileAt(sprite->data[1], sprite->data[2]); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_2 = TRUE; - sprite->data[0] = 2; -} - -static void sub_8127E30(struct Sprite *sprite) -{ - sub_806487C(sprite, FALSE); - if (sprite->animEnded) - { - FieldEffectStop(sprite, FLDEFF_ASH); - } -} - -u32 FldEff_SurfBlob(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[7], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); - if (spriteId !=MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.paletteNum = 0; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = -1; - sprite->data[6] = -1; - sprite->data[7] = -1; - } - FieldEffectActiveListRemove(FLDEFF_SURF_BLOB); - return spriteId; -} - -void sub_8127ED0(u8 spriteId, u8 value) -{ - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (value & 0xF); -} - -void sub_8127EFC(u8 spriteId, u8 value) -{ - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((value & 0xF) << 4); -} - -void sub_8127F28(u8 spriteId, u8 value, s16 data1) -{ - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((value & 0xF) << 8); - gSprites[spriteId].data[1] = data1; -} - -static u8 sub_8127F5C(struct Sprite *sprite) -{ - return sprite->data[0] & 0xF; -} - -static u8 sub_8127F64(struct Sprite *sprite) -{ - return (sprite->data[0] & 0xF0) >> 4; -} - -static u8 sub_8127F70(struct Sprite *sprite) -{ - return (sprite->data[0] & 0xF00) >> 8; -} - -void sub_8127F7C(struct Sprite *sprite) -{ - struct MapObject *mapObject; - struct Sprite *linkedSprite; - - mapObject = &gMapObjects[sprite->data[2]]; - linkedSprite = &gSprites[mapObject->spriteId]; - sub_8127FD4(mapObject, sprite); - sub_812800C(mapObject, sprite); - sub_81280A0(mapObject, linkedSprite, sprite); - sprite->oam.priority = linkedSprite->oam.priority; -} - -static void sub_8127FD4(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 unk_8041E54[] = {0, 0, 1, 2, 3}; - if (sub_8127F64(sprite) == 0) - { - StartSpriteAnimIfDifferent(sprite, unk_8041E54[mapObject->placeholder18]); - } -} - -#ifdef NONMATCHING -static void sub_812800C(struct MapObject *mapObject, struct Sprite *sprite) -{ - s16 x; - s16 y; - u8 i; - - x = mapObject->coords2.x; - y = mapObject->coords2.y; - if (sprite->pos2.y == 0 && (x != sprite->data[6] || y != sprite->data[7])) - { - sprite->data[5] = sprite->pos2.y; - for (sprite->data[6] = x, sprite->data[7] = y, i = DIR_SOUTH; i <= DIR_EAST; i ++, x = sprite->data[6], y = sprite->data[7]) - { - MoveCoords(i, &x, &y); - if (MapGridGetZCoordAt(x, y) == 3) - { - sprite->data[5] ++; - break; - } - } - } -} -#else -__attribute__((naked)) static void sub_812800C(struct MapObject *mapObject, struct Sprite *sprite) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tsub sp, 0x4\n" - "\tadds r4, r1, 0\n" - "\tldrh r2, [r0, 0x10]\n" - "\tmov r1, sp\n" - "\tstrh r2, [r1]\n" - "\tldrh r1, [r0, 0x12]\n" - "\tmov r0, sp\n" - "\tadds r0, 0x2\n" - "\tstrh r1, [r0]\n" - "\tmovs r2, 0x26\n" - "\tldrsh r3, [r4, r2]\n" - "\tmov r8, r0\n" - "\tcmp r3, 0\n" - "\tbne _08128094\n" - "\tmov r0, sp\n" - "\tmovs r5, 0\n" - "\tldrsh r2, [r0, r5]\n" - "\tmovs r5, 0x3A\n" - "\tldrsh r0, [r4, r5]\n" - "\tcmp r2, r0\n" - "\tbne _08128048\n" - "\tlsls r0, r1, 16\n" - "\tasrs r0, 16\n" - "\tmovs r5, 0x3C\n" - "\tldrsh r1, [r4, r5]\n" - "\tcmp r0, r1\n" - "\tbeq _08128094\n" - "_08128048:\n" - "\tstrh r3, [r4, 0x38]\n" - "\tstrh r2, [r4, 0x3A]\n" - "\tmov r1, r8\n" - "\tmovs r2, 0\n" - "\tldrsh r0, [r1, r2]\n" - "\tstrh r0, [r4, 0x3C]\n" - "\tmovs r5, 0x1\n" - "\tmov r7, r8\n" - "\tmov r6, sp\n" - "_0812805A:\n" - "\tadds r0, r5, 0\n" - "\tmov r1, sp\n" - "\tadds r2, r7, 0\n" - "\tbl MoveCoords\n" - "\tmovs r1, 0\n" - "\tldrsh r0, [r6, r1]\n" - "\tmovs r2, 0\n" - "\tldrsh r1, [r7, r2]\n" - "\tbl MapGridGetZCoordAt\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x3\n" - "\tbne _08128080\n" - "\tldrh r0, [r4, 0x38]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r4, 0x38]\n" - "\tb _08128094\n" - "_08128080:\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tldrh r0, [r4, 0x3A]\n" - "\tstrh r0, [r6]\n" - "\tldrh r0, [r4, 0x3C]\n" - "\tmov r1, r8\n" - "\tstrh r0, [r1]\n" - "\tcmp r5, 0x4\n" - "\tbls _0812805A\n" - "_08128094:\n" - "\tadd sp, 0x4\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif - -static void sub_81280A0(struct MapObject *mapObject, struct Sprite *linkedSprite, struct Sprite *sprite) -{ - u16 unk_8401E5A[] = {3, 7}; - u8 v0 = sub_8127F5C(sprite); - if (v0 != 0) - { - if (((u16)(++ sprite->data[4]) & unk_8401E5A[sprite->data[5]]) == 0) - { - sprite->pos2.y += sprite->data[3]; - } - if ((sprite->data[4] & 0x0F) == 0) - { - sprite->data[3] = -sprite->data[3]; - } - if (v0 != 2) - { - if (sub_8127F70(sprite) == 0) - { - linkedSprite->pos2.y = sprite->pos2.y; - } - else - { - linkedSprite->pos2.y = sprite->data[1] + sprite->pos2.y; - } - sprite->pos1.x = linkedSprite->pos1.x; - sprite->pos1.y = linkedSprite->pos1.y + 8; - } - } -} - -u8 sub_8128124(u8 oldSpriteId) -{ - u8 spriteId; - struct Sprite *sprite; - - spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1); - sprite = &gSprites[spriteId]; - sprite->callback = sub_8128174; - sprite->invisible = TRUE; - sprite->data[0] = oldSpriteId; - sprite->data[1] = 1; - return spriteId; -} - -static void sub_8128174(struct Sprite *sprite) -{ - struct Sprite *oldSprite; - - oldSprite = &gSprites[sprite->data[0]]; - if (((sprite->data[2]++) & 0x03) == 0) - { - oldSprite->pos2.y += sprite->data[1]; - } - if ((sprite->data[2] & 0x0F) == 0) - { - sprite->data[1] = -sprite->data[1]; - } -} - -u32 FldEff_Dust(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[9], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = 10; - } - return 0; -} - -u32 FldEff_SandPile(void) -{ - u8 mapObjectId; - struct MapObject *mapObject; - u8 spriteId; - struct Sprite *sprite; - const struct MapObjectGraphicsInfo *graphicsInfo; - - mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - mapObject = &gMapObjects[mapObjectId]; - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[29], 0, 0, 0); - if (spriteId != MAX_SPRITES) - { - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = gSprites[mapObject->spriteId].pos1.x; - sprite->data[4] = gSprites[mapObject->spriteId].pos1.y; - sprite->pos2.y = (graphicsInfo->height >> 1) - 2; - SeekSpriteAnim(sprite, 2); - } - return 0; -} - -void sub_81282E0(struct Sprite *sprite) -{ - u8 mapObjectId; - s16 x; - s16 y; - - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_20) - { - FieldEffectStop(sprite, FLDEFF_SAND_PILE); - } - else - { - y = gSprites[gMapObjects[mapObjectId].spriteId].pos1.y; - x = gSprites[gMapObjects[mapObjectId].spriteId].pos1.x; - if (x != sprite->data[3] || y != sprite->data[4]) - { - sprite->data[3] = x; - sprite->data[4] = y; - if (sprite->animEnded) - { - StartSpriteAnim(sprite, 0); - } - } - sprite->pos1.x = x; - sprite->pos1.y = y; - sprite->subpriority = gSprites[gMapObjects[mapObjectId].spriteId].subpriority; - sub_806487C(sprite, FALSE); - } -} - -u32 FldEff_Bubbles(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[34], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = 1; - } - return 0; -} - -void sub_8128410(struct Sprite *sprite) -{ - sprite->data[0] += 0x80; - sprite->data[0] &= 0x100; - sprite->pos1.y -= sprite->data[0] >> 8; - sub_806487C(sprite, FALSE); - if (sprite->invisible || sprite->animEnded) - { - FieldEffectStop(sprite, FLDEFF_BUBBLES); - } -} - -u32 FldEff_BerryTreeGrowthSparkle(void) -{ - u8 spriteId; - struct Sprite *sprite; - - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = gFieldEffectArguments[3]; - sprite->oam.paletteNum = 5; - sprite->data[0] = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; - } - return 0; -} - -u32 FldEff_TreeDisguise(void) -{ - return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, 0x18, 0x04); -} - - -u32 FldEff_MountainDisguise(void) -{ - return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, 0x19, 0x03); -} - - -u32 FldEff_SandDisguise(void) -{ - return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 0x1C, 0x02); -} - -static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum) -{ - u8 spriteId; - struct Sprite *sprite; - - if (TryGetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &spriteId)) - { - FieldEffectActiveListRemove(fldEff); - return MAX_SPRITES; - } - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[templateIdx], 0, 0, 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled ++; - sprite->oam.paletteNum = paletteNum; - sprite->data[1] = fldEff; - sprite->data[2] = gFieldEffectArguments[0]; - sprite->data[3] = gFieldEffectArguments[1]; - sprite->data[4] = gFieldEffectArguments[2]; - } - return spriteId; -} - -void sub_81285AC(struct Sprite *sprite) -{ - u8 mapObjectId; - const struct MapObjectGraphicsInfo *graphicsInfo; - struct Sprite *linkedSprite; - - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &mapObjectId)) - { - FieldEffectStop(sprite, sprite->data[1]); - } - // else { - graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); - linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; - sprite->invisible = linkedSprite->invisible; - sprite->pos1.x = linkedSprite->pos1.x; - sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16; - sprite->subpriority = linkedSprite->subpriority - 1; - if (sprite->data[0] == 1) - { - sprite->data[0] ++; - StartSpriteAnim(sprite, 1); - } - if (sprite->data[0] == 2 && sprite->animEnded) - { - sprite->data[7] = 1; - } - if (sprite->data[0] == 3) - { - FieldEffectStop(sprite, sprite->data[1]); - } - // } -} - -void sub_812869C(struct MapObject *mapObject) -{ - if (mapObject->mapobj_unk_21 == 1) - { - gSprites[mapObject->mapobj_unk_1A].data[0] ++; - } -} - -bool8 sub_81286C4(struct MapObject *mapObject) -{ - struct Sprite *sprite; - - if (mapObject->mapobj_unk_21 == 2) - { - return TRUE; - } - if (mapObject->mapobj_unk_21 == 0) - { - return TRUE; - } - sprite = &gSprites[mapObject->mapobj_unk_1A]; - if (sprite->data[7]) - { - mapObject->mapobj_unk_21 = 2; - sprite->data[0] ++; - return TRUE; - } - return FALSE; -} - -u32 FldEff_Sparkle(void) -{ - u8 spriteId; - - gFieldEffectArguments[0] += 7; - gFieldEffectArguments[1] += 7; - sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[35], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].oam.priority = gFieldEffectArguments[2]; - gSprites[spriteId].coordOffsetEnabled = TRUE; - } - return 0; -} - -void sub_8128774(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - { - if (sprite->animEnded) - { - sprite->invisible = TRUE; - sprite->data[0] ++; - } - if (sprite->data[0] == 0) - { - return; - } - } - if (++ sprite->data[1] >= 35) - { - FieldEffectStop(sprite, FLDEFF_SPARKLE); - } -} - -void sub_81287C4(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - FieldEffectStop(sprite, sprite->data[1]); - } - else - { - sub_806487C(sprite, FALSE); - SetObjectSubpriorityByZCoord(sprite->data[0], sprite, 0); - } -} - -void sub_8128800(struct Sprite *sprite) -{ - if (sprite->animEnded) - { - FieldEffectStop(sprite, sprite->data[0]); - } - else - { - sub_806487C(sprite, FALSE); - } -} - -#ifdef NONMATCHING -static void sub_812882C(struct Sprite *sprite /*r6*/, u8 z, u8 offset) -{ - u8 i; - s16 xlo; - s16 xhi; - s16 lx; - s16 lyhi; - s16 ly; - s16 ylo; - s16 yhi; - struct MapObject *mapObject; // r4 - const struct MapObjectGraphicsInfo *graphicsInfo; // destroyed - struct Sprite *linkedSprite; // r5 - - SetObjectSubpriorityByZCoord(z, sprite, offset); - for (i = 0; i < 16; i ++) - { - mapObject = &gMapObjects[i]; - if (mapObject->active) - { - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - linkedSprite = &gSprites[mapObject->spriteId]; - xhi = sprite->pos1.x + sprite->centerToCornerVecX; - xlo = sprite->pos1.x - sprite->centerToCornerVecX; - lx = linkedSprite->pos1.x; - if (xhi < lx && xlo > lx) - { - lyhi = linkedSprite->pos1.y + linkedSprite->centerToCornerVecY; - ly = linkedSprite->pos1.y; - ylo = sprite->pos1.y - sprite->centerToCornerVecY; - yhi = ylo + linkedSprite->centerToCornerVecY; - if ((lyhi < yhi || lyhi < ylo) && ly > yhi) - { - if (sprite->subpriority <= linkedSprite->subpriority) - { - sprite->subpriority = linkedSprite->subpriority + 2; - break; - } - } - } - } - } -} -#else -__attribute__((naked)) static void sub_812882C(struct Sprite *sprite /*r6*/, u8 z, u8 offset) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tadds r6, r0, 0\n" - "\tadds r0, r1, 0\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tadds r1, r6, 0\n" - "\tbl SetObjectSubpriorityByZCoord\n" - "\tmovs r7, 0\n" - "_08128842:\n" - "\tlsls r0, r7, 3\n" - "\tadds r0, r7\n" - "\tlsls r0, 2\n" - "\tldr r1, _081288DC @ =gMapObjects\n" - "\tadds r4, r0, r1\n" - "\tldrb r0, [r4]\n" - "\tlsls r0, 31\n" - "\tcmp r0, 0\n" - "\tbeq _081288E4\n" - "\tldrb r0, [r4, 0x5]\n" - "\tbl GetFieldObjectGraphicsInfo\n" - "\tldrb r1, [r4, 0x4]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tldr r1, _081288E0 @ =gSprites\n" - "\tadds r5, r0, r1\n" - "\tadds r0, r6, 0\n" - "\tadds r0, 0x28\n" - "\tmovs r2, 0\n" - "\tldrsb r2, [r0, r2]\n" - "\tldrh r0, [r6, 0x20]\n" - "\tadds r1, r0, r2\n" - "\tsubs r0, r2\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tlsls r1, 16\n" - "\tasrs r1, 16\n" - "\tmovs r0, 0x20\n" - "\tldrsh r2, [r5, r0]\n" - "\tcmp r1, r2\n" - "\tbge _081288E4\n" - "\tlsls r0, r4, 16\n" - "\tasrs r0, 16\n" - "\tcmp r0, r2\n" - "\tble _081288E4\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x29\n" - "\tmovs r3, 0\n" - "\tldrsb r3, [r0, r3]\n" - "\tldrh r2, [r5, 0x22]\n" - "\tadds r2, r3\n" - "\tldrh r4, [r5, 0x22]\n" - "\tadds r0, r6, 0\n" - "\tadds r0, 0x29\n" - "\tmovs r1, 0\n" - "\tldrsb r1, [r0, r1]\n" - "\tldrh r0, [r6, 0x22]\n" - "\tsubs r0, r1\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tadds r3, r0, r3\n" - "\tlsls r2, 16\n" - "\tasrs r2, 16\n" - "\tlsls r3, 16\n" - "\tasrs r3, 16\n" - "\tcmp r2, r3\n" - "\tblt _081288BC\n" - "\tcmp r2, r0\n" - "\tbge _081288E4\n" - "_081288BC:\n" - "\tlsls r0, r4, 16\n" - "\tasrs r0, 16\n" - "\tcmp r0, r3\n" - "\tble _081288E4\n" - "\tadds r2, r6, 0\n" - "\tadds r2, 0x43\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x43\n" - "\tldrb r1, [r0]\n" - "\tldrb r0, [r2]\n" - "\tcmp r0, r1\n" - "\tbhi _081288E4\n" - "\tadds r0, r1, 0x2\n" - "\tstrb r0, [r2]\n" - "\tb _081288EE\n" - "\t.align 2, 0\n" - "_081288DC: .4byte gMapObjects\n" - "_081288E0: .4byte gSprites\n" - "_081288E4:\n" - "\tadds r0, r7, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tcmp r7, 0xF\n" - "\tbls _08128842\n" - "_081288EE:\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c deleted file mode 100644 index 35ea3952a..000000000 --- a/src/field/field_fadetransition.c +++ /dev/null @@ -1,641 +0,0 @@ -#include "global.h" -#include "cable_club.h" -#include "fieldmap.h" -#include "field_door.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "field_special_scene.h" -#include "field_weather.h" -#include "fldeff_flash.h" -#include "link.h" -#include "main.h" -#include "map_obj_lock.h" -#include "metatile_behavior.h" -#include "palette.h" -#include "overworld.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "start_menu.h" -#include "task.h" - -void sub_8080B9C(u8); -void task_map_chg_seq_0807E20C(u8); -void task_map_chg_seq_0807E2CC(u8); -void task0A_fade_n_map_maybe(u8); -void sub_808115C(u8); - -void palette_bg_fill_white(void) -{ - CpuFastFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); -} - -void palette_bg_fill_black(void) -{ - CpuFastFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); -} - -void pal_fill_for_map_transition(void) -{ - u8 map_light = get_map_type_from_warp0(); - switch (fade_type_for_given_maplight_pair(map_light, Overworld_GetMapTypeOfSaveblockLocation())) - { - case 0: - FadeScreen(0, 0); - palette_bg_fill_black(); - break; - case 1: - FadeScreen(2, 0); - palette_bg_fill_white(); - } -} - -void pal_fill_black(void) -{ - FadeScreen(0, 0); - palette_bg_fill_black(); -} - -void fade_8080918(void) -{ - u8 light_level = Overworld_GetMapTypeOfSaveblockLocation(); - switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) - { - case 0: - FadeScreen(1, 0); - break; - case 1: - FadeScreen(3, 0); - } -} - -void sub_8080958(u8 arg) -{ - sub_8059B88(!arg); -} - -void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID) -{ - if (sub_8080E70() == TRUE) - { - DestroyTask(taskID); - EnableBothScriptContexts(); - } -} - -void sub_8080990(void) -{ - ScriptContext2_Enable(); - Overworld_PlaySpecialMapMusic(); - pal_fill_black(); - CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); -} - -void sub_80809B0(void) -{ - ScriptContext2_Enable(); - pal_fill_black(); - CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); -} - -void task_mpl_807DD60(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - task->data[1] = sub_8083664(); - task->data[0]++; - break; - case 1: - if (gTasks[task->data[1]].isActive != TRUE) - { - pal_fill_for_map_transition(); - task->data[0]++; - } - break; - case 2: - if (sub_8080E70() == TRUE) - { - ScriptContext2_Disable(); - DestroyTask(taskId); - } - } -} - -void sub_8080A3C(void) -{ - ScriptContext2_Enable(); - Overworld_PlaySpecialMapMusic(); - palette_bg_fill_black(); - CreateTask(task_mpl_807DD60, 10); -} - -void sub_8080A5C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - sub_80084A4(); - task->data[0]++; - break; - case 1: - if (IsLinkTaskFinished()) - { - pal_fill_for_map_transition(); - task->data[0]++; - } - break; - case 2: - if (sub_8080E70() == TRUE) - { - sub_8007B14(); - ScriptContext2_Disable(); - DestroyTask(taskId); - } - } -} - -void sub_8080AC4(void) -{ - ScriptContext2_Enable(); - Overworld_PlaySpecialMapMusic(); - palette_bg_fill_black(); - CreateTask(sub_8080A5C, 10); -} - -void sub_8080AE4(void) -{ - s16 x, y; - u8 behavior; - TaskFunc func; - PlayerGetDestCoords(&x, &y); - behavior = MapGridGetMetatileBehaviorAt(x, y); - if (MetatileBehavior_IsDoor(behavior) == TRUE) - func = sub_8080B9C; - else if (MetatileBehavior_IsNonAnimDoor(behavior) == TRUE) - func = task_map_chg_seq_0807E20C; - else - func = task_map_chg_seq_0807E2CC; - CreateTask(func, 10); -} - -void mapldr_default(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_for_map_transition(); - sub_8080AE4(); - ScriptContext2_Enable(); -} - -void sub_8080B60(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_black(); - sub_8080AE4(); - ScriptContext2_Enable(); -} - -void sub_8080B78(void) -{ - Overworld_PlaySpecialMapMusic(); - pal_fill_for_map_transition(); - PlaySE(SE_TK_WARPOUT); - CreateTask(task_map_chg_seq_0807E2CC, 10); - ScriptContext2_Enable(); -} - -void sub_8080B9C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s16 *x = &task->data[2]; - s16 *y = &task->data[3]; - - switch (task->data[0]) - { - case 0: - sub_8080958(0); - FreezeMapObjects(); - PlayerGetDestCoords(x, y); - FieldSetDoorOpened(*x, *y); - task->data[0] = 1; - break; - case 1: - if (sub_8080E70()) - { - u8 mapObjId; - sub_8080958(1); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 8); - task->data[0] = 2; - } - break; - case 2: - if (walkrun_is_standing_still()) - { - u8 mapObjId; - task->data[1] = FieldAnimateDoorClose(*x, *y); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]); - task->data[0] = 3; - } - break; - case 3: - if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) - { - UnfreezeMapObjects(); - task->data[0] = 4; - } - break; - case 4: - ScriptContext2_Disable(); - DestroyTask(taskId); - break; - } -} - -void task_map_chg_seq_0807E20C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s16 *x = &task->data[2]; - s16 *y = &task->data[3]; - - switch (task->data[0]) - { - case 0: - sub_8080958(0); - FreezeMapObjects(); - PlayerGetDestCoords(x, y); - task->data[0] = 1; - break; - case 1: - if (sub_8080E70()) - { - u8 mapObjId; - sub_8080958(1); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], GetGoSpeed0AnimId(player_get_direction_lower_nybble())); - task->data[0] = 2; - } - break; - case 2: - if (walkrun_is_standing_still()) - { - UnfreezeMapObjects(); - task->data[0] = 3; - } - break; - case 3: - ScriptContext2_Disable(); - DestroyTask(taskId); - break; - } -} - -void task_map_chg_seq_0807E2CC(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - FreezeMapObjects(); - ScriptContext2_Enable(); - gTasks[taskId].data[0]++; - break; - case 1: - if (sub_8080E70()) - { - UnfreezeMapObjects(); - ScriptContext2_Disable(); - DestroyTask(taskId); - } - break; - } -} - -void sub_8080DC4(u8 taskId) -{ - if (sub_8080E70() == TRUE) - { - DestroyTask(taskId); - CreateTask(sub_80712B4, 80); - } -} - -void atk17_seteffectsecondary(void) -{ - pal_fill_black(); - CreateStartMenuTask(sub_8080DC4); - ScriptContext2_Enable(); -} - -void task_mpl_807E3C8(u8 taskId) -{ - if (sub_8080E70() == 1) - { - ScriptContext2_Disable(); - DestroyTask(taskId); - sub_8064E2C(); - } -} - -void sub_8080E28(void) -{ - ScriptContext2_Enable(); - pal_fill_black(); - CreateTask(task_mpl_807E3C8, 10); -} - -void sub_8080E44(void) -{ - ScriptContext2_Enable(); - Overworld_PlaySpecialMapMusic(); - pal_fill_black(); - CreateTask(task_mpl_807E3C8, 10); -} - -bool32 sub_8080E64(void) -{ - return gPaletteFade.active; -} - -bool32 sub_8080E70(void) -{ - if (IsWeatherNotFadingIn() == TRUE) - return TRUE; - else - return FALSE; -} - -void sub_8080E88(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlayRainSoundEffect(); - PlaySE(SE_KAIDAN); - gFieldCallback = mapldr_default; - CreateTask(task0A_fade_n_map_maybe, 10); -} - -void sp13E_warp_to_last_warp(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlayRainSoundEffect(); - gFieldCallback = mapldr_default; - CreateTask(task0A_fade_n_map_maybe, 10); -} - -void sub_8080EF0(void) -{ - ScriptContext2_Enable(); - gFieldCallback = mapldr_default; - CreateTask(sub_808115C, 10); -} - -void sp13F_fall_to_last_warp(void) -{ - sp13E_warp_to_last_warp(); - gFieldCallback = sub_8086748; -} - -void sub_8080F2C(u8 metatileBehavior) -{ - ScriptContext2_Enable(); - sub_8086A2C(metatileBehavior, 10); -} - -void sub_8080F48(void) -{ - ScriptContext2_Enable(); - sub_80871B8(10); -} - -void sub_8080F58(void) -{ - ScriptContext2_Enable(); - sub_8087654(10); -} - -void sub_8080F68(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlaySE(SE_TK_WARPIN); - CreateTask(task0A_fade_n_map_maybe, 10); - gFieldCallback = sub_8080B78; -} - -void sub_8080F9C(void) -{ - ScriptContext2_Enable(); - fade_8080918(); - CreateTask(task0A_fade_n_map_maybe, 10); - gFieldCallback = sub_80C791C; -} - -void sub_8080FC4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - ScriptContext2_Enable(); - task->data[0]++; - break; - case 1: - if (!sub_8080E64() && sub_8054034()) - { - task->data[0]++; - } - break; - case 2: - warp_in(); - SetMainCallback2(sub_8054588); - DestroyTask(taskId); - break; - } -} - -void DoCableClubWarp(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlaySE(SE_KAIDAN); - CreateTask(sub_8080FC4, 10); -} - -void sub_8081050(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - ClearLinkCallback_2(); - FadeScreen(1, 0); - sub_8053FF8(); - PlaySE(SE_KAIDAN); - data[0]++; - break; - case 1: - if (!sub_8080E64() && sub_8054034()) - { - sub_800832C(); - data[0]++; - } - break; - case 2: - if (!gReceivedRemoteLinkPlayers) - { - warp_in(); - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskId); - } - break; - } -} - -void sub_80810DC(void) -{ - CreateTask(sub_8081050, 10); -} - -#if DEBUG - -__attribute__((naked)) -void debug_sub_80888D8() -{ - asm("\ - PUSH {LR}\n\ - BL debug_sub_8052E04\n\ - BL sub_8080E88\n\ - BL ScriptContext2_Enable\n\ - POP {R0}\n\ - BX R0"); -} - -#endif - -void task0A_fade_n_map_maybe(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - FreezeMapObjects(); - ScriptContext2_Enable(); - task->data[0]++; - break; - case 1: - if (!sub_8080E64() && sub_8054034()) - { - task->data[0]++; - } - break; - case 2: - warp_in(); - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskId); - break; - } -} - -void sub_808115C(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s16 *x = &task->data[2]; - s16 *y = &task->data[3]; - - switch (task->data[0]) - { - case 0: - FreezeMapObjects(); - PlayerGetDestCoords(x, y); - PlaySE(GetDoorSoundEffect(*x, *y - 1)); - task->data[1] = FieldAnimateDoorOpen(*x, *y - 1); - task->data[0] = 1; - break; - case 1: - if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) - { - u8 mapObjId; - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[mapObjId]); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 9); - task->data[0] = 2; - } - break; - case 2: - if (walkrun_is_standing_still()) - { - u8 mapObjId; - task->data[1] = FieldAnimateDoorClose(*x, *y - 1); - mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]); - sub_8080958(0); - task->data[0] = 3; - } - break; - case 3: - if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) - { - task->data[0] = 4; - } - break; - case 4: - sub_8053FF8(); - fade_8080918(); - PlayRainSoundEffect(); - task->data[0] = 0; - task->func = task0A_fade_n_map_maybe; - break; - } -} - -void sub_80812C8(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - FreezeMapObjects(); - ScriptContext2_Enable(); - task->data[0]++; - break; - case 1: - if (!sub_8080E64() && sub_8054034()) - { - task->data[0]++; - } - break; - case 2: - warp_in(); - SetMainCallback2(sub_8054534); - DestroyTask(taskId); - break; - } -} - -void sub_8081334(void) -{ - ScriptContext2_Enable(); - sub_8053FF8(); - fade_8080918(); - PlayRainSoundEffect(); - PlaySE(SE_KAIDAN); - gFieldCallback = sub_8080B60; - CreateTask(sub_80812C8, 10); -} diff --git a/src/field/field_message_box.c b/src/field/field_message_box.c deleted file mode 100644 index 5eec7a14b..000000000 --- a/src/field/field_message_box.c +++ /dev/null @@ -1,155 +0,0 @@ -#include "global.h" -#include "field_message_box.h" -#include "menu.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "text_window.h" - -static EWRAM_DATA struct Window gFieldMessageBoxWindow = {0}; - -static u8 sMessageBoxMode; - -static void Task_FieldMessageBox(u8 taskId); -static void CreateFieldMessageBoxTask(void); -static void DestroyFieldMessageBoxTask(void); -static void PrintFieldMessage(const u8 *message); -static void PrintFieldMessageFromStringVar4(void); - -void InitFieldMessageBox(void) -{ - sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; - TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); - Text_InitWindowWithTemplate(&gFieldMessageBoxWindow, &gWindowTemplate_81E6CE4); -} - -static void Task_FieldMessageBox(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - switch (task->data[0]) - { - case 0: - TextWindow_LoadDialogueFrameTiles(&gFieldMessageBoxWindow); - task->data[0]++; - break; - case 1: - TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow); - task->data[0]++; - break; - case 2: - switch (sMessageBoxMode) - { - case FIELD_MESSAGE_BOX_NORMAL: - if (!Text_UpdateWindow(&gFieldMessageBoxWindow)) - return; - break; - case FIELD_MESSAGE_BOX_AUTO_SCROLL: - if (!Text_UpdateWindowAutoscroll(&gFieldMessageBoxWindow)) - return; - break; - } - sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; - DestroyTask(taskId); - } -} - -static void CreateFieldMessageBoxTask(void) -{ - CreateTask(Task_FieldMessageBox, 80); -} - -static void DestroyFieldMessageBoxTask(void) -{ - u8 taskId = FindTaskIdByFunc(Task_FieldMessageBox); - if (taskId != 0xFF) - DestroyTask(taskId); -} - -bool8 ShowFieldMessage(const u8 *message) -{ - if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) - { - return FALSE; - } - else - { - PrintFieldMessage(message); - sMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; - return TRUE; - } -} - -bool8 ShowFieldAutoScrollMessage(const u8 *message) -{ - if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) - { - return FALSE; - } - else - { - sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; - PrintFieldMessage(message); - return TRUE; - } -} - -bool8 unref_sub_8064BB8(const u8 *message) -{ - sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; - PrintFieldMessage(message); - return TRUE; -} - -bool8 unref_sub_8064BD0(const u8 *message) -{ - if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) - { - return FALSE; - } - else - { - sMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; - PrintFieldMessageFromStringVar4(); - return TRUE; - } -} - -static void PrintFieldMessage(const u8 *message) -{ - StringExpandPlaceholders(gStringVar4, message); - Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); - CreateFieldMessageBoxTask(); -} - -static void PrintFieldMessageFromStringVar4(void) -{ - Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); - CreateFieldMessageBoxTask(); -} - -void HideFieldMessageBox(void) -{ - DestroyFieldMessageBoxTask(); - TextWindow_EraseDialogueFrame(&gFieldMessageBoxWindow); - sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; -} - -u8 GetFieldMessageBoxMode(void) -{ - return sMessageBoxMode; -} - -bool8 IsFieldMessageBoxHidden(void) -{ - if (sMessageBoxMode == FIELD_MESSAGE_BOX_HIDDEN) - return TRUE; - else - return FALSE; -} - -void unref_sub_8064CA0(void) -{ - DestroyFieldMessageBoxTask(); - TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow); - sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; -} diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c deleted file mode 100644 index 1552381b2..000000000 --- a/src/field/field_player_avatar.c +++ /dev/null @@ -1,1797 +0,0 @@ -#include "global.h" -#include "field_player_avatar.h" -#include "bike.h" -#include "event_data.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "event_object_movement.h" -#include "fieldmap.h" -#include "main.h" -#include "constants/map_objects.h" -#include "menu.h" -#include "metatile_behavior.h" -#include "new_game.h" -#include "party_menu.h" -#include "random.h" -#include "overworld.h" -#include "rotating_gate.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "strings2.h" -#include "task.h" -#include "tv.h" -#include "wild_encounter.h" - -EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {0}; - -//Functions -static bool8 sub_8058854(struct MapObject *, u8); -static void npc_clear_strange_bits(struct MapObject *a); -static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); -static void PlayerAllowForcedMovementIfMovingSameDirection(void); -static bool8 TryDoMetatileBehaviorForcedMovement(void); -static u8 GetForcedMovementByMetatileBehavior(void); -static void MovePlayerNotOnBike(u8 a, u16 b); -static u8 CheckMovementInputNotOnBike(u8 a); -static u8 CheckForPlayerAvatarCollision(u8 a); -static u8 sub_8058EF0(s16 a, s16 b, u8 c); -static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c); -static u8 sub_8058F6C(s16 a, s16 b, u8 c); -static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d); -static void DoPlayerAvatarTransition(void); -static bool8 player_is_anim_in_certain_ranges(void); -static bool8 sub_80592A4(void); -static bool8 PlayerIsAnimActive(void); -static bool8 PlayerCheckIfAnimFinishedOrInactive(void); -static void PlayerNotOnBikeCollide(u8 a); -static void PlayCollisionSoundIfNotFacingWarp(u8 a); -static void sub_8059D60(struct MapObject *a); -static void StartStrengthAnim(u8 a, u8 b); -static void DoPlayerMatJump(void); -static void sub_805A06C(void); -u8 debug_sub_805F2B0(u8); -u8 debug_sub_805F2DC(u8); - -static bool8 (*const gUnknown_0830FB58[])(u8) = -{ - MetatileBehavior_IsTrickHouseSlipperyFloor, - MetatileBehavior_IsIce_2, - MetatileBehavior_IsWalkSouth, - MetatileBehavior_IsWalkNorth, - MetatileBehavior_IsWalkWest, - MetatileBehavior_IsWalkEast, - MetatileBehavior_IsSouthwardCurrent, - MetatileBehavior_IsNorthwardCurrent, - MetatileBehavior_IsWestwardCurrent, - MetatileBehavior_IsEastwardCurrent, - MetatileBehavior_IsSlideSouth, - MetatileBehavior_IsSlideNorth, - MetatileBehavior_IsSlideWest, - MetatileBehavior_IsSlideEast, - MetatileBehavior_IsWaterfall, - MetatileBehavior_0xBB, - MetatileBehavior_0xBC, - MetatileBehavior_IsMuddySlope, -}; -static bool8 (*const gUnknown_0830FBA0[])(void) = -{ - ForcedMovement_None, - ForcedMovement_Slip, - ForcedMovement_Slip, - sub_8058AAC, - sub_8058AC4, - sub_8058ADC, - sub_8058AF4, - sub_8058B0C, - sub_8058B24, - sub_8058B3C, - sub_8058B54, - ForcedMovement_SlideSouth, - ForcedMovement_SlideNorth, - ForcedMovement_SlideWest, - ForcedMovement_SlideEast, - sub_8058B0C, - ForcedMovement_MatJump, - sub_8058C10, - ForcedMovement_MuddySlope, -}; -static void (*const gUnknown_0830FBEC[])(u8, u16) = -{ - PlayerNotOnBikeNotMoving, - PlayerNotOnBikeTurningInPlace, - sub_8058D0C, -}; -static bool8 (*const gUnknown_0830FBF8[])(u8) = -{ - MetatileBehavior_IsBumpySlope, - MetatileBehavior_IsIsolatedVerticalRail, - MetatileBehavior_IsIsolatedHorizontalRail, - MetatileBehavior_IsVerticalRail, - MetatileBehavior_IsHorizontalRail, -}; -static const u8 gUnknown_0830FC0C[] = {9, 10, 11, 12, 13}; -static void (*const gUnknown_0830FC14[])(struct MapObject *) = -{ - PlayerAvatarTransition_Normal, - PlayerAvatarTransition_MachBike, - PlayerAvatarTransition_AcroBike, - PlayerAvatarTransition_Surfing, - PlayerAvatarTransition_Underwater, - sub_80591F4, - nullsub_49, - nullsub_49, -}; -static bool8 (*const gUnknown_0830FC34[])(u8) = -{ - MetatileBehavior_IsSouthArrowWarp, - MetatileBehavior_IsNorthArrowWarp, - MetatileBehavior_IsWestArrowWarp, - MetatileBehavior_IsEastArrowWarp, -}; -static const u8 sRivalAvatarGfxIds[][2] = -{ - {MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, MAP_OBJ_GFX_RIVAL_MAY_NORMAL}, - {MAP_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE}, - {MAP_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE}, - {MAP_OBJ_GFX_RIVAL_BRENDAN_SURFING, MAP_OBJ_GFX_RIVAL_MAY_SURFING}, - {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER}, - {MAP_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE}, - {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING}, - {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING}, -}; -static const u8 sPlayerAvatarGfxIds[][2] = -{ - {MAP_OBJ_GFX_BRENDAN_NORMAL, MAP_OBJ_GFX_MAY_NORMAL}, - {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_MAY_MACH_BIKE}, - {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_MAY_ACRO_BIKE}, - {MAP_OBJ_GFX_BRENDAN_SURFING, MAP_OBJ_GFX_MAY_SURFING}, - {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER}, - {MAP_OBJ_GFX_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_MAY_FIELD_MOVE}, - {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING}, - {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING}, -}; -static const u8 gUnknown_0830FC64[2][5][2] = -{ - //male - { - {MAP_OBJ_GFX_BRENDAN_NORMAL, 1}, - {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, 2}, - {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, 4}, - {MAP_OBJ_GFX_BRENDAN_SURFING, 8}, - {MAP_OBJ_GFX_BRENDAN_UNDERWATER, 16}, - }, - //female - { - {MAP_OBJ_GFX_MAY_NORMAL, 1}, - {MAP_OBJ_GFX_MAY_MACH_BIKE, 2}, - {MAP_OBJ_GFX_MAY_ACRO_BIKE, 4}, - {MAP_OBJ_GFX_MAY_SURFING, 8}, - {MAP_OBJ_GFX_MAY_UNDERWATER, 16}, - } -}; -static bool8 (*const gUnknown_0830FC78[])(u8) = //Duplicate of gUnknown_0830FC34 -{ - MetatileBehavior_IsSouthArrowWarp, - MetatileBehavior_IsNorthArrowWarp, - MetatileBehavior_IsWestArrowWarp, - MetatileBehavior_IsEastArrowWarp, -}; -static u8 (*const gUnknown_0830FC88[])(struct Task *, struct MapObject *, struct MapObject *) = -{ - sub_8059E84, - sub_8059EA4, - sub_8059F40, -}; -static u8 (*const sPlayerAvatarSecretBaseMatJump[])(struct Task *, struct MapObject *) = -{ - PlayerAvatar_DoSecretBaseMatJump, -}; -static u8 (*const gUnknown_0830FC98[])(struct Task *, struct MapObject *) = -{ - sub_805A0D8, - sub_805A100, - sub_805A178, - sub_805A1B8, -}; - -fieldmap_object_null_cb(sub_80587B4, sub_80587D8); - -void player_step(u8 direction, u16 newKeys, u16 heldKeys) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - sub_8059D60(playerMapObj); - if (gPlayerAvatar.preventStep == FALSE) - { - Bike_TryAcroBikeHistoryUpdate(newKeys, heldKeys); - if (!sub_8058854(playerMapObj, direction)) - { - npc_clear_strange_bits(playerMapObj); - DoPlayerAvatarTransition(); - if (TryDoMetatileBehaviorForcedMovement() == 0) - { - MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys); - PlayerAllowForcedMovementIfMovingSameDirection(); - } - } - } -} - -static bool8 sub_8058854(struct MapObject *playerMapObj, u8 direction) -{ - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj) - && !FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) - { - u8 specialAnim = FieldObjectGetSpecialAnim(playerMapObj); - - if (specialAnim > 24 && specialAnim < 29 && direction != DIR_NONE && playerMapObj->placeholder18 != direction) - { - FieldObjectClearAnim(playerMapObj); - return FALSE; - } - else - { - return TRUE; - } - } - return FALSE; -} - -static void npc_clear_strange_bits(struct MapObject *a) -{ - a->mapobj_bit_12 = 0; - a->mapobj_bit_10 = 0; - a->mapobj_bit_9 = 0; - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_DASH; -} - -static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys) -{ - if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - || (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)) - MovePlayerOnBike(direction, newKeys, heldKeys); - else - MovePlayerNotOnBike(direction, heldKeys); -} - -static void PlayerAllowForcedMovementIfMovingSameDirection(void) -{ - if (gPlayerAvatar.runningState == MOVING) - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; -} - -static bool8 TryDoMetatileBehaviorForcedMovement(void) -{ -#if DEBUG - if (gUnknown_020297ED != 0 && (gMain.heldKeys & 0x100)) - return 0; -#endif - return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); -} - -static u8 GetForcedMovementByMetatileBehavior(void) -{ - u8 i; - - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_5)) - { - u8 r5 = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E; - - for (i = 0; i < 18; i++) - { - if (gUnknown_0830FB58[i](r5)) - return i + 1; - } - } - return 0; -} - -bool8 ForcedMovement_None(void) -{ - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_6) - { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_9 = 0; - playerMapObj->mapobj_bit_11 = 1; - FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_6; - } - return FALSE; -} - -static u8 DoForcedMovement(u8 direction, void (*b)(u8)) -{ - struct PlayerAvatar *playerAvatar = &gPlayerAvatar; - u8 collisionType = CheckForPlayerAvatarCollision(direction); - - playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; - if (collisionType != 0) - { - ForcedMovement_None(); - if (collisionType <= 4) - { - return 0; - } - else - { - if (collisionType == COLLISION_LEDGE_JUMP) - PlayerJumpLedge(direction); - playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; - playerAvatar->runningState = MOVING; - return 1; - } - } - else - { - playerAvatar->runningState = MOVING; - b(direction); - return 1; - } -} - -static u8 DoForcedMovementInCurrentDirection(void (*a)(u8)) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_10 = 1; - return DoForcedMovement(playerMapObj->placeholder18, a); -} - -bool8 ForcedMovement_Slip(void) -{ - return DoForcedMovementInCurrentDirection(PlayerGoSpeed2); -} - -bool8 sub_8058AAC(void) -{ - return DoForcedMovement(1, PlayerGoSpeed1); -} - -bool8 sub_8058AC4(void) -{ - return DoForcedMovement(2, PlayerGoSpeed1); -} - -bool8 sub_8058ADC(void) -{ - return DoForcedMovement(3, PlayerGoSpeed1); -} - -bool8 sub_8058AF4(void) -{ - return DoForcedMovement(4, PlayerGoSpeed1); -} - -bool8 sub_8058B0C(void) -{ - return DoForcedMovement(1, npc_use_some_d2s); -} - -bool8 sub_8058B24(void) -{ - return DoForcedMovement(2, npc_use_some_d2s); -} - -bool8 sub_8058B3C(void) -{ - return DoForcedMovement(3, npc_use_some_d2s); -} - -bool8 sub_8058B54(void) -{ - return DoForcedMovement(4, npc_use_some_d2s); -} - -static u8 ForcedMovement_Slide(u8 direction, void (*b)(u8)) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_10 = 1; - playerMapObj->mapobj_bit_9 = 1; - return DoForcedMovement(direction, b); -} - -bool8 ForcedMovement_SlideSouth(void) -{ - return ForcedMovement_Slide(1, PlayerGoSpeed2); -} - -bool8 ForcedMovement_SlideNorth(void) -{ - return ForcedMovement_Slide(2, PlayerGoSpeed2); -} - -bool8 ForcedMovement_SlideWest(void) -{ - return ForcedMovement_Slide(3, PlayerGoSpeed2); -} - -bool8 ForcedMovement_SlideEast(void) -{ - return ForcedMovement_Slide(4, PlayerGoSpeed2); -} - -bool8 ForcedMovement_MatJump(void) -{ - DoPlayerMatJump(); - return TRUE; -} - -bool8 sub_8058C10(void) -{ - sub_805A06C(); - return TRUE; -} - -bool8 ForcedMovement_MuddySlope(void) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (playerMapObj->placeholder18 != 2 || GetPlayerSpeed() <= 3) - { - Bike_UpdateBikeCounterSpeed(0); - playerMapObj->mapobj_bit_9 = 1; - return DoForcedMovement(1, PlayerGoSpeed2); - } - else - { - return FALSE; - } -} - -static void MovePlayerNotOnBike(u8 direction, u16 heldKeys) -{ -#if DEBUG - if (gUnknown_020297ED != 0 && debug_sub_805F2B0(direction) != 0) - return; -#endif - gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys); -} - -static u8 CheckMovementInputNotOnBike(u8 direction) -{ - if (direction == DIR_NONE) - { - gPlayerAvatar.runningState = NOT_MOVING; - return 0; - } - else if (direction != player_get_direction_upper_nybble() && gPlayerAvatar.runningState != MOVING) - { - gPlayerAvatar.runningState = TURN_DIRECTION; - return 1; - } - else - { - gPlayerAvatar.runningState = MOVING; - return 2; - } -} - -void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys) -{ - PlayerFaceDirection(player_get_direction_lower_nybble()); -} - -void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys) -{ - PlayerTurnInPlace(direction); -} - -void sub_8058D0C(u8 direction, u16 heldKeys) -{ - u8 r1 = CheckForPlayerAvatarCollision(direction); - - switch (r1) - { - case 6: - PlayerJumpLedge(direction); - return; - default: - if (r1 > 8 || r1 < 5) - PlayerNotOnBikeCollide(direction); - return; - case 0: - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - { - // speed 2 is fast, same speed as running - PlayerGoSpeed2(direction); - return; - } - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(FLAG_SYS_B_DASH) - && IsRunningDisallowed(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0) - { - sub_805940C(direction); - gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; - } - else - { - PlayerGoSpeed1(direction); - } - } -} - -static u8 CheckForPlayerAvatarCollision(u8 direction) -{ - s16 x, y; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - x = playerMapObj->coords2.x; - y = playerMapObj->coords2.y; - MoveCoords(direction, &x, &y); - return CheckForFieldObjectCollision(playerMapObj, x, y, direction, MapGridGetMetatileBehaviorAt(x, y)); -} - -u8 CheckForFieldObjectCollision(struct MapObject *a, s16 x, s16 y, u8 direction, u8 e) -{ - u8 collision; - - collision = npc_block_way(a, x, y, direction); - if (collision == 3 && sub_8058EF0(x, y, direction)) - return 5; - if (ShouldJumpLedge(x, y, direction)) - { - IncrementGameStat(GAME_STAT_JUMPED_DOWN_LEDGES); - return COLLISION_LEDGE_JUMP; - } - if (collision == 4 && sub_8058F6C(x, y, direction)) - return 7; - - if (collision == 0) - { - if (CheckForRotatingGatePuzzleCollision(direction, x, y)) - return 8; - check_acro_bike_metatile(x, y, e, &collision); - } - return collision; -} - -static u8 sub_8058EF0(s16 a, s16 b, u8 c) -{ - if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - && MapGridGetZCoordAt(a, b) == 3 - && GetFieldObjectIdByXYZ(a, b, 3) == 16) - { - sub_805A20C(c); - return 1; - } - else - { - return 0; - } -} - -static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c) -{ - if (GetLedgeJumpDirection(a, b, c) != 0) - return 1; - else - return 0; -} - -static u8 sub_8058F6C(s16 a, s16 b, u8 c) -{ - if (FlagGet(FLAG_SYS_USE_STRENGTH)) - { - u8 mapObjectId = GetFieldObjectIdByXY(a, b); - - if (mapObjectId != 16) - { - if (gMapObjects[mapObjectId].graphicsId == 0x57) - { - a = gMapObjects[mapObjectId].coords2.x; - b = gMapObjects[mapObjectId].coords2.y; - MoveCoords(c, &a, &b); - if (npc_block_way(&gMapObjects[mapObjectId], a, b, c) == 0 - && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(a, b)) == 0) - { - StartStrengthAnim(mapObjectId, c); - return 1; - } - } - } - } - return 0; -} - -static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (gUnknown_0830FBF8[i](c)) - { - *d = gUnknown_0830FC0C[i]; - return; - } - } -} - -void SetPlayerAvatarTransitionFlags(u16 a) -{ - gPlayerAvatar.unk1 |= a; - DoPlayerAvatarTransition(); -} - -static void DoPlayerAvatarTransition(void) -{ - u8 i; - u32 flags = gPlayerAvatar.unk1; - - if (flags != 0) - { - for (i = 0; i < 8; i++, flags >>= 1) - { -#ifdef NONMATCHING - if (flags & 1) - { - gUnknown_0830FC14[i](&gMapObjects[gPlayerAvatar.mapObjectId]); - } -#else - if (flags & 1) - { - register void (*const *funcs)(struct MapObject *) asm("r0") = gUnknown_0830FC14; - funcs[i](&gMapObjects[gPlayerAvatar.mapObjectId]); - } -#endif - } - gPlayerAvatar.unk1 = 0; - } -} - -void nullsub_49(struct MapObject *a) -{ -} - -void PlayerAvatarTransition_Normal(struct MapObject *a) -{ - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(0)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(1); -} - -void PlayerAvatarTransition_MachBike(struct MapObject *a) -{ - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(1)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(2); - BikeClearState(0, 0); -} - -void PlayerAvatarTransition_AcroBike(struct MapObject *a) -{ - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(2)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(4); - BikeClearState(0, 0); - Bike_HandleBumpySlopeJump(); -} - -void PlayerAvatarTransition_Surfing(struct MapObject *a) -{ - u8 unk; - - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(3)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(8); - gFieldEffectArguments[0] = a->coords2.x; - gFieldEffectArguments[1] = a->coords2.y; - gFieldEffectArguments[2] = gPlayerAvatar.mapObjectId; - unk = FieldEffectStart(FLDEFF_SURF_BLOB); - a->mapobj_unk_1A = unk; - sub_8127ED0(unk, 1); -} - -void PlayerAvatarTransition_Underwater(struct MapObject *a) -{ - sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(4)); - FieldObjectTurn(a, a->placeholder18); - SetPlayerAvatarStateMask(16); - a->mapobj_unk_1A = sub_8128124(a->spriteId); -} - -void sub_80591F4(struct MapObject *a) -{ - gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_5; -} - -void sub_8059204(void) -{ - gPlayerAvatar.tileTransitionState = T_NOT_MOVING; - if (PlayerIsAnimActive()) - { - if (!PlayerCheckIfAnimFinishedOrInactive()) - { - if (!player_is_anim_in_certain_ranges()) - gPlayerAvatar.tileTransitionState = T_TILE_TRANSITION; - } - else - { - if (!sub_80592A4()) - gPlayerAvatar.tileTransitionState = T_TILE_CENTER; - } - } -} - -static bool8 player_is_anim_in_certain_ranges(void) -{ - u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C; - - if (unk < 4 - || (unk >= 16 && unk < 0x15) - || (unk >= 25 && unk < 41) - || (unk >= 98 && unk < 110) - || (unk >= 122 && unk < 126)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_80592A4(void) -{ - if (player_is_anim_in_certain_ranges() && gPlayerAvatar.runningState != TURN_DIRECTION) - return TRUE; - else - return FALSE; -} - -static bool8 PlayerIsAnimActive(void) -{ - return FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[gPlayerAvatar.mapObjectId]); -} - -static bool8 PlayerCheckIfAnimFinishedOrInactive(void) -{ - return FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]); -} - -static void player_set_x22(u8 a) -{ - gMapObjects[gPlayerAvatar.mapObjectId].animId = a; -} - -u8 player_get_x22(void) -{ - return gMapObjects[gPlayerAvatar.mapObjectId].animId; -} - -static void sub_8059348(u8 a) -{ - FieldObjectForceSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], a); -} - -void PlayerSetAnimId(u8 animId, u8 b) -{ - if (!PlayerIsAnimActive()) - { - player_set_x22(b); - FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], animId); - } -} - -// normal speed (1 speed) -void PlayerGoSpeed1(u8 a) -{ - PlayerSetAnimId(GetGoSpeed0AnimId(a), 2); -} - -// fast speed (2 speed) -void PlayerGoSpeed2(u8 a) -{ - PlayerSetAnimId(sub_8060744(a), 2); -} - -void npc_use_some_d2s(u8 a) -{ - PlayerSetAnimId(d2s_08064034(a), 2); -} - -// fastest speed (4 speed) -void PlayerGoSpeed4(u8 a) -{ - PlayerSetAnimId(sub_806079C(a), 2); -} - -void sub_805940C(u8 a) -{ - PlayerSetAnimId(sub_80607F4(a), 2); -} - -void PlayerOnBikeCollide(u8 a) -{ - PlayCollisionSoundIfNotFacingWarp(a); - PlayerSetAnimId(GetStepInPlaceDelay16AnimId(a), 2); -} - -static void PlayerNotOnBikeCollide(u8 a) -{ - PlayCollisionSoundIfNotFacingWarp(a); - PlayerSetAnimId(GetStepInPlaceDelay32AnimId(a), 2); -} - -void PlayerFaceDirection(u8 direction) -{ - PlayerSetAnimId(GetFaceDirectionAnimId(direction), 1); -} - -void PlayerTurnInPlace(u8 direction) -{ - PlayerSetAnimId(GetStepInPlaceDelay8AnimId(direction), 1); -} - -void PlayerJumpLedge(u8 direction) -{ - PlaySE(SE_DANSA); - PlayerSetAnimId(GetJumpLedgeAnimId(direction), 8); -} - -void sub_80594C0(void) -{ - if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING) - { - if (player_should_look_direction_be_enforced_upon_movement()) - sub_8059348(GetFaceDirectionAnimId(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18)); - } -} - -// wheelie idle -void PlayerIdleWheelie(u8 a) -{ - PlayerSetAnimId(sub_80609D8(a), 1); -} - -// normal to wheelie -void PlayerStartWheelie(u8 a) -{ - PlayerSetAnimId(sub_8060A04(a), 1); -} - -// wheelie to normal -void PlayerEndWheelie(u8 a) -{ - PlayerSetAnimId(sub_8060A30(a), 1); -} - -// wheelie hopping standing -void PlayerStandingHoppingWheelie(u8 a) -{ - PlaySE(SE_JITE_PYOKO); - PlayerSetAnimId(sub_8060A5C(a), 1); -} - -// wheelie hopping moving -void PlayerMovingHoppingWheelie(u8 a) -{ - PlaySE(SE_JITE_PYOKO); - PlayerSetAnimId(sub_8060A88(a), 2); -} - -// wheelie hopping ledge -void PlayerLedgeHoppingWheelie(u8 a) -{ - PlaySE(SE_JITE_PYOKO); - PlayerSetAnimId(sub_8060AB4(a), 8); -} - -// acro turn jump -void PlayerAcroTurnJump(u8 direction) -{ - PlaySE(SE_JITE_PYOKO); - PlayerSetAnimId(sub_8060878(direction), 1); -} - -void sub_80595DC(u8 direction) -{ - PlaySE(SE_WALL_HIT); - PlayerSetAnimId(sub_8060AE0(direction), 2); -} - -void sub_8059600(u8 a) -{ - PlayerSetAnimId(sub_8060B0C(a), 2); -} - -void sub_8059618(u8 a) -{ - PlayerSetAnimId(sub_8060B38(a), 2); -} - -void sub_8059630(u8 a) -{ - PlayerSetAnimId(sub_8060B64(a), 2); -} - -static void PlayCollisionSoundIfNotFacingWarp(u8 a) -{ - s16 x, y; - u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E; - - if (!gUnknown_0830FC34[a - 1](unk)) - { - if (a == 2) - { - PlayerGetDestCoords(&x, &y); - MoveCoords(2, &x, &y); - if (MetatileBehavior_IsWarpDoor(MapGridGetMetatileBehaviorAt(x, y))) - return; - } - PlaySE(SE_WALL_HIT); - } -} - -void GetXYCoordsOneStepInFrontOfPlayer(s16 *x, s16 *y) -{ - *x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; - *y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; - MoveCoords(player_get_direction_lower_nybble(), x, y); -} - -void PlayerGetDestCoords(s16 *x, s16 *y) -{ - *x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; - *y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; -} - -u8 player_get_direction_lower_nybble(void) -{ - return gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18; -} - -u8 player_get_direction_upper_nybble(void) -{ - return gMapObjects[gPlayerAvatar.mapObjectId].placeholder18; -} - -u8 PlayerGetZCoord(void) -{ - return gMapObjects[gPlayerAvatar.mapObjectId].elevation; -} - -void unref_sub_8059790(s16 a, s16 b) -{ - sub_805C058(&gMapObjects[gPlayerAvatar.mapObjectId], a, b); -} - -u8 TestPlayerAvatarFlags(u8 a) -{ - return gPlayerAvatar.flags & a; -} - -u8 sub_80597D0(void) -{ - return gPlayerAvatar.flags; -} - -u8 GetPlayerAvatarObjectId(void) -{ - return gPlayerAvatar.spriteId; -} - -void sub_80597E8(void) -{ - ForcedMovement_None(); -} - -void sub_80597F4(void) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - npc_clear_strange_bits(playerMapObj); - FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - { - Bike_HandleBumpySlopeJump(); - Bike_UpdateBikeCounterSpeed(0); - } -} - -u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) -{ - return sRivalAvatarGfxIds[state][gender]; -} - -static u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) -{ - return sPlayerAvatarGfxIds[state][gender]; -} - -u8 GetPlayerAvatarGraphicsIdByStateId(u8 state) -{ - return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); -} - -u8 unref_GetRivalAvatarGenderByGraphcsId(u8 gfxId) -{ - switch (gfxId) - { - case MAP_OBJ_GFX_RIVAL_MAY_NORMAL: - case MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE: - case MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE: - case MAP_OBJ_GFX_RIVAL_MAY_SURFING: - case MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE: - case MAP_OBJ_GFX_MAY_UNDERWATER: - case MAP_OBJ_GFX_MAY_FISHING: - case MAP_OBJ_GFX_MAY_WATERING: - return FEMALE; - default: - return MALE; - } -} - -u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) -{ - switch (gfxId) - { - case MAP_OBJ_GFX_MAY_NORMAL: - case MAP_OBJ_GFX_MAY_MACH_BIKE: - case MAP_OBJ_GFX_MAY_ACRO_BIKE: - case MAP_OBJ_GFX_MAY_SURFING: - case MAP_OBJ_GFX_MAY_FIELD_MOVE: - case MAP_OBJ_GFX_MAY_UNDERWATER: - case MAP_OBJ_GFX_MAY_FISHING: - case MAP_OBJ_GFX_MAY_WATERING: - return FEMALE; - default: - return MALE; - } -} - -bool8 PartyHasMonWithSurf(void) -{ - u8 i; - - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - { - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0) - break; - if (pokemon_has_move(&gPlayerParty[i], 0x39)) - return TRUE; - } - } - return FALSE; -} - -bool8 IsPlayerSurfingNorth(void) -{ - if (player_get_direction_upper_nybble() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - return TRUE; - else - return FALSE; -} - -bool8 IsPlayerFacingSurfableFishableWater(void) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - s16 x = playerMapObj->coords2.x; - s16 y = playerMapObj->coords2.y; - - MoveCoords(playerMapObj->mapobj_unk_18, &x, &y); - if (npc_block_way(playerMapObj, x, y, playerMapObj->mapobj_unk_18) == 3 && PlayerGetZCoord() == 3 - && MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(x, y))) - return TRUE; - else - return FALSE; -} - -void ClearPlayerAvatarInfo(void) -{ - memset(&gPlayerAvatar, 0, sizeof(struct PlayerAvatar)); -} - -void SetPlayerAvatarStateMask(u8 a) -{ - gPlayerAvatar.flags &= 0xE0; - gPlayerAvatar.flags |= a; -} - -static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 a, u8 gender) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (gUnknown_0830FC64[gender][i][0] == a) - return gUnknown_0830FC64[gender][i][1]; - } - return 1; -} - -u8 GetPlayerAvatarGraphicsIdByCurrentState(void) -{ - u8 i; - u8 r5 = gPlayerAvatar.flags; - - for (i = 0; i < 5; i++) - { - if (gUnknown_0830FC64[gPlayerAvatar.gender][i][1] & r5) - return gUnknown_0830FC64[gPlayerAvatar.gender][i][0]; - } - return 0; -} - -void SetPlayerAvatarExtraStateTransition(u8 a, u8 b) -{ - u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(a, gPlayerAvatar.gender); - - gPlayerAvatar.unk1 |= unk | b; - DoPlayerAvatarTransition(); -} - -void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) -{ - struct MapObjectTemplate playerMapObjTemplate; - u8 mapObjectId; - struct MapObject *mapObject; - - playerMapObjTemplate.localId = 0xFF; - playerMapObjTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(0, gender); - playerMapObjTemplate.x = x - 7; - playerMapObjTemplate.y = y - 7; - playerMapObjTemplate.elevation = 0; - playerMapObjTemplate.movementType = 11; - playerMapObjTemplate.unkA_0 = 0; - playerMapObjTemplate.unkA_4 = 0; - playerMapObjTemplate.unkC = 0; - playerMapObjTemplate.unkE = 0; - playerMapObjTemplate.script = NULL; - playerMapObjTemplate.flagId = 0; - mapObjectId = SpawnSpecialFieldObject(&playerMapObjTemplate); - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_16 = 1; - mapObject->mapobj_unk_1B = sub_8126B54(); - FieldObjectTurn(mapObject, direction); - ClearPlayerAvatarInfo(); - gPlayerAvatar.runningState = NOT_MOVING; - gPlayerAvatar.tileTransitionState = T_NOT_MOVING; - gPlayerAvatar.mapObjectId = mapObjectId; - gPlayerAvatar.spriteId = mapObject->spriteId; - gPlayerAvatar.gender = gender; - SetPlayerAvatarStateMask(0x21); -} - -void sub_8059B88(u8 a) -{ - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = a; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - gSprites[gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A].invisible = a; -} - -void sub_8059BF4(void) -{ - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(5)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 0); -} - -void sub_8059C3C(u8 a) -{ - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(6)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDE8(a)); -} - -void sub_8059C94(u8 a) -{ - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(2)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FD98(a)); - SeekSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 1); -} - -void sub_8059D08(u8 a) -{ - sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(7)); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], FieldObjectDirectionToImageAnimId(a)); -} - -static void sub_8059D60(struct MapObject *a) -{ - s16 x; - s16 y; - u8 r6; - u8 r8 = a->mapobj_unk_1E; - - for (x = 0, r6 = 1; x < 4; x++, r6++) - { - if (gUnknown_0830FC78[x](r8) && r6 == a->placeholder18) - { - x = a->coords2.x; - y = a->coords2.y; - MoveCoords(r6, &x, &y); - sub_8126BC4(a->mapobj_unk_1B, r6, x, y); - return; - } - } - objid_set_invisible(a->mapobj_unk_1B); -} - -/* Strength */ - -static void sub_8059E2C(u8 taskId); - -static void StartStrengthAnim(u8 a, u8 b) -{ - u8 taskId = CreateTask(sub_8059E2C, 0xFF); - - gTasks[taskId].data[1] = a; - gTasks[taskId].data[2] = b; - sub_8059E2C(taskId); -} - -static void sub_8059E2C(u8 taskId) -{ - while (gUnknown_0830FC88[gTasks[taskId].data[0]](&gTasks[taskId], - &gMapObjects[gPlayerAvatar.mapObjectId], - &gMapObjects[gTasks[taskId].data[1]])) - ; -} - -u8 sub_8059E84(struct Task *task, struct MapObject *b, struct MapObject *c) -{ - ScriptContext2_Enable(); - gPlayerAvatar.preventStep = TRUE; - task->data[0]++; - return 0; -} - -u8 sub_8059EA4(struct Task *task, struct MapObject *b, struct MapObject *c) -{ - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(b) - && !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(c)) - { - FieldObjectClearAnimIfSpecialAnimFinished(b); - FieldObjectClearAnimIfSpecialAnimFinished(c); - FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId((u8)task->data[2])); - FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId((u8)task->data[2])); - gFieldEffectArguments[0] = c->coords2.x; - gFieldEffectArguments[1] = c->coords2.y; - gFieldEffectArguments[2] = c->elevation; - gFieldEffectArguments[3] = gSprites[c->spriteId].oam.priority; - FieldEffectStart(FLDEFF_DUST); - PlaySE(SE_W070); - task->data[0]++; - } - return 0; -} - -u8 sub_8059F40(struct Task *task, struct MapObject *b, struct MapObject *c) -{ - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(b) - && FieldObjectCheckIfSpecialAnimFinishedOrInactive(c)) - { - FieldObjectClearAnimIfSpecialAnimFinished(b); - FieldObjectClearAnimIfSpecialAnimFinished(c); - gPlayerAvatar.preventStep = FALSE; - ScriptContext2_Disable(); - DestroyTask(FindTaskIdByFunc(sub_8059E2C)); - } - return 0; -} - -/* Some field effect */ - -static void DoPlayerAvatarSecretBaseMatJump(u8 taskId); - -static void DoPlayerMatJump(void) -{ - DoPlayerAvatarSecretBaseMatJump(CreateTask(DoPlayerAvatarSecretBaseMatJump, 0xFF)); -} - -static void DoPlayerAvatarSecretBaseMatJump(u8 taskId) -{ - while (sPlayerAvatarSecretBaseMatJump[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) - ; -} - -// because data[0] is used to call this, it can be inferred that there may have been multiple mat jump functions at one point, so the name for these groups of functions is appropriate in assuming the sole use of mat jump. -u8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct MapObject *mapObject) -{ - gPlayerAvatar.preventStep = TRUE; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - PlaySE(SE_DANSA); - FieldObjectSetSpecialAnim(mapObject, sub_806084C(mapObject->mapobj_unk_18)); - task->data[1]++; - if (task->data[1] > 1) - { - gPlayerAvatar.preventStep = FALSE; - gPlayerAvatar.unk1 |= 0x20; - DestroyTask(FindTaskIdByFunc(DoPlayerAvatarSecretBaseMatJump)); - } - } - return 0; -} - -/* Some field effect */ - -static void sub_805A08C(u8 taskId); - -static void sub_805A06C(void) -{ - u8 taskId = CreateTask(sub_805A08C, 0xFF); - - sub_805A08C(taskId); -} - -static void sub_805A08C(u8 taskId) -{ - while (gUnknown_0830FC98[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) - ; -} - -u8 sub_805A0D8(struct Task *task, struct MapObject *mapObject) -{ - task->data[0]++; - task->data[1] = mapObject->placeholder18; - gPlayerAvatar.preventStep = TRUE; - ScriptContext2_Enable(); - PlaySE(SE_TK_WARPIN); - return 1; -} - -u8 sub_805A100(struct Task *task, struct MapObject *mapObject) -{ - u8 directions[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; - - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - u8 direction; - - FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(direction = directions[mapObject->placeholder18 - 1])); - if (direction == (u8)task->data[1]) - task->data[2]++; - task->data[0]++; - if (task->data[2] > 3 && direction == GetOppositeDirection(task->data[1])) - task->data[0]++; - } - return 0; -} - -u8 sub_805A178(struct Task *task, struct MapObject *mapObject) -{ - const u8 arr[] = {16, 16, 17, 18, 19}; - - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - FieldObjectSetSpecialAnim(mapObject, arr[task->data[2]]); - task->data[0] = 1; - } - return 0; -} - -u8 sub_805A1B8(struct Task *task, struct MapObject *mapObject) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(GetOppositeDirection(task->data[1]))); - ScriptContext2_Disable(); - gPlayerAvatar.preventStep = FALSE; - DestroyTask(FindTaskIdByFunc(sub_805A08C)); - } - return 0; -} - -/* Some Field effect */ - -static void taskFF_0805D1D4(u8 taskId); -static void sub_805A2D0(u8 taskId); - -void sub_805A20C(u8 a) -{ - u8 taskId; - - ScriptContext2_Enable(); - Overworld_ClearSavedMusic(); - Overworld_ChangeMusicToDefault(); - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; - gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; - gPlayerAvatar.preventStep = TRUE; - taskId = CreateTask(taskFF_0805D1D4, 0xFF); - gTasks[taskId].data[0] = a; - taskFF_0805D1D4(taskId); -} - -static void taskFF_0805D1D4(u8 taskId) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj)) - { - if (!FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) - return; - } - sub_8127ED0(playerMapObj->mapobj_unk_1A, 2); - FieldObjectSetSpecialAnim(playerMapObj, sub_80608D0((u8)gTasks[taskId].data[0])); - gTasks[taskId].func = sub_805A2D0; -} - -static void sub_805A2D0(u8 taskId) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) - { - sub_805B980(playerMapObj, GetPlayerAvatarGraphicsIdByStateId(0)); - FieldObjectSetSpecialAnim(playerMapObj, GetFaceDirectionAnimId(playerMapObj->mapobj_unk_18)); - gPlayerAvatar.preventStep = FALSE; - ScriptContext2_Disable(); - DestroySprite(&gSprites[playerMapObj->mapobj_unk_1A]); - DestroyTask(taskId); - } -} - -/* Fishing */ - -static u8 (*const sFishingStateFuncs[])(struct Task *) = -{ - Fishing1, - Fishing2, - Fishing3, - Fishing4, - Fishing5, - Fishing6, - Fishing7, - Fishing8, - Fishing9, - Fishing10, - Fishing11, - Fishing12, - Fishing13, - Fishing14, - Fishing15, - Fishing16, -}; - -static void Task_Fishing(u8 taskId); -static void sub_805A954(void); - -#define tStep data[0] -#define tFrameCounter data[1] -#define tNumDots data[2] -#define tDotsRequired data[3] -#define tRoundsPlayed data[12] -#define tMinRoundsRequired data[13] -#define tPlayerGfxId data[14] -#define tFishingRod data[15] - -#define FISHING_START_ROUND 3 -#define FISHING_GOT_BITE 6 -#define FISHING_ON_HOOK 9 -#define FISHING_NO_BITE 11 -#define FISHING_GOT_AWAY 12 -#define FISHING_SHOW_RESULT 13 - -void StartFishing(u8 rod) -{ - u8 taskId = CreateTask(Task_Fishing, 0xFF); - - gTasks[taskId].tFishingRod = rod; - Task_Fishing(taskId); -} - -static void Task_Fishing(u8 taskId) -{ - while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId])) - ; -} - -u8 Fishing1(struct Task *task) -{ - ScriptContext2_Enable(); - gPlayerAvatar.preventStep = TRUE; - task->tStep++; - return 0; -} - -u8 Fishing2(struct Task *task) -{ - struct MapObject *playerMapObj; - const s16 arr1[] = {1, 1, 1}; - const s16 arr2[] = {1, 3, 6}; - - task->tRoundsPlayed = 0; - task->tMinRoundsRequired = arr1[task->tFishingRod] + (Random() % arr2[task->tFishingRod]); - task->tPlayerGfxId = gMapObjects[gPlayerAvatar.mapObjectId].graphicsId; - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - FieldObjectClearAnimIfSpecialAnimActive(playerMapObj); - playerMapObj->mapobj_bit_11 = 1; - sub_8059C3C(playerMapObj->mapobj_unk_18); - task->tStep++; - return 0; -} - -u8 Fishing3(struct Task *task) -{ - sub_805A954(); - - // Wait one second before starting dot game - task->tFrameCounter++; - if (task->tFrameCounter >= 60) - task->tStep++; - return 0; -} - -u8 Fishing4(struct Task *task) -{ - u32 randVal; - - Menu_DisplayDialogueFrame(); - task->tStep++; - task->tFrameCounter = 0; - task->tNumDots = 0; - randVal = Random(); - randVal %= 10; - task->tDotsRequired = randVal + 1; - if (task->tRoundsPlayed == 0) - task->tDotsRequired = randVal + 4; - if (task->tDotsRequired >= 10) - task->tDotsRequired = 10; - return 1; -} - -// Play a round of the dot game -u8 Fishing5(struct Task *task) -{ - const u8 dot[] = _("·"); - - sub_805A954(); - task->tFrameCounter++; - if (gMain.newKeys & A_BUTTON) - { - task->tStep = FISHING_NO_BITE; - if (task->tRoundsPlayed != 0) - task->tStep = FISHING_GOT_AWAY; - return 1; - } - else - { - if (task->tFrameCounter >= 20) - { - task->tFrameCounter = 0; - if (task->tNumDots >= task->tDotsRequired) - { - task->tStep++; - if (task->tRoundsPlayed != 0) - task->tStep++; - task->tRoundsPlayed++; - } - else - { - Menu_PrintText(dot, task->tNumDots + 4, 15); - task->tNumDots++; - } - } - return 0; - } -} - -// Determine if fish bites -u8 Fishing6(struct Task *task) -{ - sub_805A954(); - task->tStep++; - if (!DoesCurrentMapHaveFishingMons() || (Random() & 1)) - task->tStep = FISHING_NO_BITE; - else - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FE08(player_get_direction_lower_nybble())); - return 1; -} - -// Oh! A Bite! -u8 Fishing7(struct Task *task) -{ - sub_805A954(); - Menu_PrintText(gOtherText_OhABite, 4, 17); - task->tStep++; - task->tFrameCounter = 0; - return 0; -} - -// We have a bite. Now, wait for the player to press A, or the timer to expire. -u8 Fishing8(struct Task *task) -{ - const s16 reelTimeouts[3] = {36, 33, 30}; - - sub_805A954(); - task->tFrameCounter++; - if (task->tFrameCounter >= reelTimeouts[task->tFishingRod]) - task->tStep = FISHING_GOT_AWAY; - else if (gMain.newKeys & A_BUTTON) - task->tStep++; - return 0; -} - -// Determine if we're going to play the dot game again -u8 Fishing9(struct Task *task) -{ - const s16 arr[][2] = - { - {0, 0}, - {40, 10}, - {70, 30} - }; - - sub_805A954(); - task->tStep++; - if (task->tRoundsPlayed < task->tMinRoundsRequired) - { - task->tStep = FISHING_START_ROUND; - } - else if (task->tRoundsPlayed < 2) - { - // probability of having to play another round - s16 probability = Random() % 100; - - if (arr[task->tFishingRod][task->tRoundsPlayed] > probability) - task->tStep = FISHING_START_ROUND; - } - return 0; -} - -u8 Fishing10(struct Task *task) -{ - sub_805A954(); - MenuPrintMessageDefaultCoords(gOtherText_PokeOnHook); - Menu_DisplayDialogueFrame(); - task->tStep++; - task->tFrameCounter = 0; - return 0; -} - -u8 Fishing11(struct Task *task) -{ - if (task->tFrameCounter == 0) - sub_805A954(); - - if (task->tFrameCounter == 0) - { - if (Menu_UpdateWindowText()) - { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - sub_805B980(playerMapObj, task->tPlayerGfxId); - FieldObjectTurn(playerMapObj, playerMapObj->placeholder18); - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); - gSprites[gPlayerAvatar.spriteId].pos2.x = 0; - gSprites[gPlayerAvatar.spriteId].pos2.y = 0; - Menu_EraseScreen(); - task->tFrameCounter++; - return 0; - } - } - - if (task->tFrameCounter != 0) - { - gPlayerAvatar.preventStep = FALSE; - ScriptContext2_Disable(); - FishingWildEncounter(task->tFishingRod); - sub_80BE97C(1); - DestroyTask(FindTaskIdByFunc(Task_Fishing)); - } - return 0; -} - -// Not even a nibble -u8 Fishing12(struct Task *task) -{ - sub_805A954(); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble())); - MenuPrintMessageDefaultCoords(gOtherText_NotEvenANibble); - task->tStep = FISHING_SHOW_RESULT; - return 1; -} - -// It got away -u8 Fishing13(struct Task *task) -{ - sub_805A954(); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble())); - MenuPrintMessageDefaultCoords(gOtherText_ItGotAway); - task->tStep++; - return 1; -} - -// Display the message -u8 Fishing14(struct Task *task) -{ - sub_805A954(); - Menu_DisplayDialogueFrame(); - task->tStep++; - return 0; -} - -u8 Fishing15(struct Task *task) -{ - sub_805A954(); - if (gSprites[gPlayerAvatar.spriteId].animEnded) - { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - sub_805B980(playerMapObj, task->tPlayerGfxId); - FieldObjectTurn(playerMapObj, playerMapObj->placeholder18); - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); - gSprites[gPlayerAvatar.spriteId].pos2.x = 0; - gSprites[gPlayerAvatar.spriteId].pos2.y = 0; - task->tStep++; - } - return 0; -} - -u8 Fishing16(struct Task *task) -{ - if (Menu_UpdateWindowText()) - { - gPlayerAvatar.preventStep = FALSE; - ScriptContext2_Disable(); - UnfreezeMapObjects(); - Menu_EraseScreen(); - sub_80BE97C(0); - DestroyTask(FindTaskIdByFunc(Task_Fishing)); - } - return 0; -} - -#undef tStep -#undef tFrameCounter -#undef tFishingRod - -static void sub_805A954(void) -{ - struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; - u8 animCmdIndex; - u8 animType; - - AnimateSprite(playerSprite); - playerSprite->pos2.x = 0; - playerSprite->pos2.y = 0; - animCmdIndex = playerSprite->animCmdIndex; - if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) - { - animCmdIndex--; - } - else - { - playerSprite->animDelayCounter++; - if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) - animCmdIndex--; - } - animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; - if (animType == 1 || animType == 2 || animType == 3) - { - playerSprite->pos2.x = 8; - if (player_get_direction_lower_nybble() == 3) - playerSprite->pos2.x = -8; - } - if (animType == 5) - playerSprite->pos2.y = -8; - if (animType == 10 || animType == 11) - playerSprite->pos2.y = 8; - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y); -} - -#if DEBUG - -u8 debug_sub_805F2B0(u8 a) -{ - if (gMain.heldKeys & 0x100) - return debug_sub_805F2DC(a); - else - return 0; -} - -u8 debug_sub_805F2DC(u8 a) -{ - if (a == 0) - PlayerFaceDirection(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18); - else if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 && !CanCameraMoveInDirection(a)) - PlayerOnBikeCollide(a); - else - PlayerGoSpeed4(a); - return 1; -} - -#endif diff --git a/src/field/field_poison.c b/src/field/field_poison.c deleted file mode 100644 index 8365351f9..000000000 --- a/src/field/field_poison.c +++ /dev/null @@ -1,146 +0,0 @@ -#include "global.h" -#include "field_poison.h" -#include "field_message_box.h" -#include "fldeff_poison.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "script.h" -#include "string_util.h" -#include "task.h" -#include "text.h" - -extern u16 gSpecialVar_Result; -extern u8 fieldPoisonText_PokemonFainted[]; - -bool32 CheckMonIsValid(struct Pokemon *pkmn) -{ - // UB: Too few arguments for function 'GetMonData' - u16 species2 = GetMonData(pkmn, MON_DATA_SPECIES2); - - if (species2 == 0 || species2 == 0x19C) - return FALSE; - else - return TRUE; -} - -bool32 AllMonsFainted(void) -{ - struct Pokemon *pkmn = &gPlayerParty[0]; - int i; - - for (i = 0; i < 6; i++, pkmn++) - { - // UB: Too few arguments for function 'GetMonData' - if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) != 0) - return FALSE; - } - return TRUE; -} - -void MonFaintFromPoisonOnField(u8 partyMember) -{ - struct Pokemon *pkmn = &gPlayerParty[partyMember]; - u32 val = 0; - - AdjustFriendship(pkmn, 7); - SetMonData(pkmn, MON_DATA_STATUS, &val); - GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1); - StringGetEnd10(gStringVar1); -} - -bool32 CheckMonFaintedFromPoison(u8 partyMember) -{ - struct Pokemon *pkmn = &gPlayerParty[partyMember]; - - // UB: Too few arguments for function 'GetMonData' - if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) == 0 - && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) - return TRUE; - else - return FALSE; -} - -#define tState data[0] -#define tPartyMember data[1] - -void Task_WhiteOut(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (tState) - { - case 0: - // Check if any Pokemon have fainted due to poison - while (tPartyMember < 6) - { - if (CheckMonFaintedFromPoison(tPartyMember)) - { - // Show message about fainted mon - MonFaintFromPoisonOnField(tPartyMember); - ShowFieldMessage(fieldPoisonText_PokemonFainted); - tState++; - return; - } - tPartyMember++; - } - tState = 2; - break; - case 1: // Wait for message box to disappear - if (IsFieldMessageBoxHidden()) - tState--; // Go to previous step and check next party member - break; - case 2: // done checking all mons - if (AllMonsFainted()) - gSpecialVar_Result = 1; - else - gSpecialVar_Result = 0; - EnableBothScriptContexts(); - DestroyTask(taskId); - break; - } -} - -#undef tState -#undef tPartyMember - -void ExecuteWhiteOut(void) -{ - CreateTask(Task_WhiteOut, 0x50); - ScriptContext1_Stop(); -} - -s32 DoPoisonFieldEffect(void) -{ - struct Pokemon *pkmn = &gPlayerParty[0]; - u32 numPoisoned = 0; - u32 numFainting = 0; - int i; - - // count the number of mons that are poisoned and fainting from poison, - // and decrement HP of all poisoned mons - for (i = 0; i < 6; i++) - { - u32 hp; - - if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0 - && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) - { - // decrement HP of poisoned mon - hp = GetMonData(pkmn, MON_DATA_HP); - if (hp != 0) - hp--; - if (hp == 0) - numFainting++; - SetMonData(pkmn, MON_DATA_HP, &hp); - numPoisoned++; - } - pkmn++; - } - if (numFainting != 0 || numPoisoned != 0) - FldeffPoison_Start(); - if (numFainting != 0) - return 2; - if (numPoisoned != 0) - return 1; - return 0; -} diff --git a/src/field/field_region_map.c b/src/field/field_region_map.c deleted file mode 100644 index 54091459f..000000000 --- a/src/field/field_region_map.c +++ /dev/null @@ -1,123 +0,0 @@ -#include "global.h" -#include "field_region_map.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "region_map.h" -#include "sprite.h" -#include "strings2.h" -#include "text.h" -#include "ewram.h" - -struct RegionMapStruct -{ - u8 str[0x16]; - u8 unk16; - u8 filler[0x869]; -}; - -struct UnkStruct -{ - MainCallback callback; - u8 filler[4]; - // This should be RegionMap, but I can't do that because it overlaps unk888. - struct RegionMapStruct unk8; - u16 unk888; -}; - -void FieldInitRegionMap(MainCallback callback) -{ - SetVBlankCallback(NULL); - ewram0_5.unk888 = 0; - ewram0_5.callback = callback; - SetMainCallback2(CB2_FieldInitRegionMap); -} - -void CB2_FieldInitRegionMap(void) -{ - REG_DISPCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - ResetSpriteData(); - FreeAllSpritePalettes(); - // TODO: remove this cast - InitRegionMap((void *)&ewram0_5.unk8, 0); - CreateRegionMapPlayerIcon(0, 0); - CreateRegionMapCursor(1, 1); - Text_LoadWindowTemplate(&gWindowTemplate_81E709C); - InitMenuWindow(&gWindowTemplate_81E709C); - Menu_EraseScreen(); - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - Menu_DrawStdWindowFrame(21, 0, 29, 3); - sub_8072BD8(gOtherText_Hoenn, 0x16, 1, 0x38); - Menu_DrawStdWindowFrame(16, 16, 29, 19); - sub_813F0C8(); - SetMainCallback2(CB2_FieldRegionMap); - SetVBlankCallback(VBlankCB_FieldRegionMap); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); -} - -void VBlankCB_FieldRegionMap(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void CB2_FieldRegionMap(void) -{ - sub_813EFDC(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_813EFDC(void) -{ - switch (ewram0_5.unk888) - { - case 0: - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - ewram0_5.unk888++; - break; - case 1: - if (!gPaletteFade.active) - ewram0_5.unk888++; - break; - case 2: - switch (sub_80FAB60()) - { - case 3: - sub_813F0C8(); - break; - case 4: - case 5: - ewram0_5.unk888++; - } - break; - case 3: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - ewram0_5.unk888++; - break; - case 4: - if (!gPaletteFade.active) - { - FreeRegionMapIconResources(); - SetMainCallback2(ewram0_5.callback); - } - break; - } -} - -void sub_813F0C8(void) -{ - Menu_BlankWindowRect(17, 17, 28, 18); - if (ewram0_5.unk8.unk16) - Menu_PrintText(ewram0_5.unk8.str, 17, 17); -} diff --git a/src/field/field_screen_effect.c b/src/field/field_screen_effect.c deleted file mode 100644 index 61301c5a9..000000000 --- a/src/field/field_screen_effect.c +++ /dev/null @@ -1,331 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_camera.h" -#include "menu.h" -#include "palette.h" -#include "overworld.h" -#include "script.h" -#include "task.h" -#include "text.h" -#include "scanline_effect.h" - -const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 }; - -const s32 gMaxFlashLevel = 4; - -const static struct ScanlineEffectParams gUnknown_0839ACEC = -{ - (void *)REG_ADDR_WIN0H, - ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, - 1 -}; - -static void sub_808136C(u16 *dest, u32 a2, s32 a3, s32 a4) -{ - if (a2 <= 0xA0) - { - if (a3 < 0) - a3 = 0; - if (a3 > 255) - a3 = 255; - if (a4 < 0) - a4 = 0; - if (a4 > 255) - a4 = 255; - dest[a2] = (a3 << 8) | a4; - } -} - -static void sub_8081398(u16 *dest, s32 a2, s32 a3, s32 a4) -{ - s32 v1 = a4; - s32 v2 = a4; - s32 v3 = 0; - while (v1 >= v3) - { - sub_808136C(dest, a3 - v3, a2 - v1, a2 + v1); - sub_808136C(dest, a3 + v3, a2 - v1, a2 + v1); - sub_808136C(dest, a3 - v1, a2 - v3, a2 + v3); - sub_808136C(dest, a3 + v1, a2 - v3, a2 + v3); - v2 -= (v3 * 2) - 1; - v3++; - if (v2 < 0) - { - v2 += 2 * (v1 - 1); - v1--; - } - } -} - -static void sub_8081424(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]); - data[0] = 1; - break; - case 1: - sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]); - data[0] = 0; - data[3] += data[5]; - if (data[3] > data[4]) - { - if (data[6] == 1) - { - ScanlineEffect_Stop(); - data[0] = 2; - } - else - { - DestroyTask(taskId); - } - } - break; - case 2: - ScanlineEffect_Clear(); - DestroyTask(taskId); - break; - } -} - -static void sub_80814E8(u8 taskId) -{ - if (!FuncIsActiveTask(sub_8081424)) - { - EnableBothScriptContexts(); - DestroyTask(taskId); - } -} - -static void sub_8081510(void) -{ - if (!FuncIsActiveTask(sub_80814E8)) - CreateTask(sub_80814E8, 80); -} - -static u8 sub_8081534(s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, u8 a6) -{ - u8 taskId = CreateTask(sub_8081424, 80); - s16 *data = gTasks[taskId].data; - - data[3] = a3; - data[4] = a4; - data[1] = a1; - data[2] = a2; - data[6] = a5; - - if (a3 < a4) - data[5] = a6; - else - data[5] = -a6; - - return taskId; -} - -void sub_8081594(u8 a1) -{ - u8 flashLevel = Overworld_GetFlashLevel(); - u8 value = 0; - if (!a1) - value = 1; - sub_8081534(120, 80, gUnknown_0839ACDC[flashLevel], gUnknown_0839ACDC[a1], value, 1); - sub_8081510(); - ScriptContext2_Enable(); -} - -void sub_80815E0(u8 a1) -{ - if (a1) - { - sub_8081398(&gScanlineEffectRegBuffers[0][0], 120, 80, gUnknown_0839ACDC[a1]); - CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); - } -} - -static void sub_808161C(u8 a1) -{ - int i; - u16 color[1]; - - if (!a1) - color[0] = 0x1F; - else - color[0] = 0x7C00; - - for (i = 0; i < 16; i++) - { - LoadPalette(color, 0xF0 + i, 2); - } -} - -static bool8 sub_8081658(u16 a1) -{ - u8 lo = REG_BLDALPHA & 0xFF; - u8 hi = REG_BLDALPHA >> 8; - - if (a1) - { - if (lo) - { - lo--; - } - } - else - { - if (hi < 0x10) - { - hi++; - } - } - - REG_BLDALPHA = (hi << 8) | lo; - - if (lo == 0 && hi == 0x10) - { - return TRUE; - } - - return FALSE; -} - -static void sub_80816A8(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - data[6] = REG_DISPCNT; - data[7] = REG_BLDCNT; - data[8] = REG_BLDALPHA; - data[9] = REG_WININ; - data[10] = REG_WINOUT; - REG_DISPCNT &= 0xBFFF; - REG_BLDCNT |= gUnknown_081E29E8[0]; - REG_BLDALPHA = 1804; - REG_WININ = 63; - REG_WINOUT = 30; - sub_8081398(&gScanlineEffectRegBuffers[0][0], data[2], data[3], 1); - CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); - //ScanlineEffect_SetParams(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]); - ScanlineEffect_SetParams(gUnknown_0839ACEC); - data[0] = 1; - break; - case 1: - Menu_BlankWindowRect(0, 0, 29, 19); - sub_808161C(data[1]); - sub_8081534(data[2], data[3], 1, 160, 1, 2); - data[0] = 2; - break; - case 2: - if (!FuncIsActiveTask(sub_8081424)) - { - EnableBothScriptContexts(); - data[0] = 3; - } - break; - case 3: - InstallCameraPanAheadCallback(); - SetCameraPanningCallback(NULL); - data[5] = 0; - data[4] = 4; - data[0] = 4; - break; - case 4: - data[4]--; - if (!data[4]) - { - s32 panning; - data[4] = 4; - data[5] ^= 1; - if (data[5]) - panning = 4; - else - panning = -4; - SetCameraPanning(0, panning); - } - break; - case 6: - InstallCameraPanAheadCallback(); - data[4] = 8; - data[0] = 7; - break; - case 7: - data[4]--; - if (!data[4]) - { - data[4] = 8; - data[5] ^= 1; - if (sub_8081658(data[5]) == TRUE) - data[0] = 5; - } - break; - case 5: - Menu_EraseWindowRect(0, 0, 29, 19); - LoadFontDefaultPalette(&gWindowTemplate_81E6CE4); - REG_WIN0H = 255; - REG_DISPCNT = data[6]; - REG_BLDCNT = data[7]; - REG_BLDALPHA = data[8]; - REG_WININ = data[9]; - REG_WINOUT = data[10]; - EnableBothScriptContexts(); - DestroyTask(taskId); - break; - } -} - -void sub_80818A4(void) -{ - u8 taskId = CreateTask(sub_80816A8, 80); - s16 *data = gTasks[taskId].data; - - if (gSpecialVar_Result == 0) - { - data[1] = 0; - data[2] = 104; - } - else if (gSpecialVar_Result == 1) - { - data[1] = 1; - data[2] = 104; - } - else if (gSpecialVar_Result == 2) - { - data[1] = 0; - data[2] = 120; - } - else - { - data[1] = 1; - data[2] = 120; - } - - data[3] = 80; -} - -void sub_80818FC(void) -{ - u8 taskId = FindTaskIdByFunc(sub_80816A8); - gTasks[taskId].data[0] = 6; -} - -static void task50_0807F0C8(u8); - -void sub_8081924(void) -{ - Overworld_FadeOutMapMusic(); - CreateTask(task50_0807F0C8, 80); -} - -static void task50_0807F0C8(u8 taskId) -{ - if (sub_8054034() == TRUE) - { - DestroyTask(taskId); - EnableBothScriptContexts(); - } -} diff --git a/src/field/field_special_scene.c b/src/field/field_special_scene.c deleted file mode 100644 index 2010ebcf4..000000000 --- a/src/field/field_special_scene.c +++ /dev/null @@ -1,382 +0,0 @@ -#include "global.h" -#include "field_special_scene.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_fadetransition.h" -#include "event_object_movement.h" -#include "field_specials.h" -#include "fieldmap.h" -#include "main.h" -#include "palette.h" -#include "overworld.h" -#include "script.h" -#include "script_movement.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" - -#define SECONDS(value) ((signed) (60.0 * value + 0.5)) - -// TODO: Move somewhere else -enum -{ - STEP_17 = 0x17, - STEP_18, - STEP_END = 0xFE, -}; - -const u32 gMapObjectPic_MovingBox[] = INCBIN_U32("graphics/map_objects/pics/misc/moving_box.4bpp"); -const u16 gMapObjectPalette19[] = INCBIN_U16("graphics/map_objects/palettes/19.gbapal"); - -static const s8 gTruckCamera_HorizontalTable[] = -{ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - -1, - -1, - -1, - 0, -}; - -const u8 gUnknown_083D295F[] = -{ - STEP_18, - STEP_END, -}; - -const u8 gUnknown_083D2961[] = -{ - STEP_17, - STEP_END, -}; - -// porthole states -enum -{ - INIT_PORTHOLE, - IDLE_CHECK, - EXECUTE_MOVEMENT, - EXIT_PORTHOLE, -}; - -s16 GetTruckCameraBobbingY(int a1) -{ - if (!(a1 % 120)) - return -1; - else if ((a1 % 10) <= 4) - return 1; - - return 0; -} - -s16 GetTruckBoxMovement(int a1) // for the box movement? -{ - if (!((a1 + 120) % 180)) - return -1; - - return 0; -} - -void Task_Truck1(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - s16 cameraYpan, cameraXpan = 0; - s16 box1, box2, box3; - - box1 = GetTruckBoxMovement(data[0] + 30) * 4; // top box. - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, box1 + 3); - box2 = GetTruckBoxMovement(data[0]) * 2; // bottom left box. - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, box2 - 3); - box3 = GetTruckBoxMovement(data[0]) * 4; // bottom right box. - sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, box3); - - if (++data[0] == SECONDS(500)) // this will never run - data[0] = 0; // reset the timer if it gets stuck. - - // this also matches with directly calling GetTruckCameraBobbingY within SetCameraPanning, but this is consistent with a later function that requires a temp variable. - cameraYpan = GetTruckCameraBobbingY(data[0]); - SetCameraPanning(cameraXpan, cameraYpan); -} - -void Task_Truck2(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - s16 cameraYpan; - s16 cameraXpan; - s16 box1, box2, box3; - - data[0]++; - data[2]++; - - if (data[0] > 5) - { - data[0] = 0; - data[1]++; - } - if ((u16)data[1] == 19) - { - DestroyTask(taskId); - } - else - { - if (gTruckCamera_HorizontalTable[data[1]] == 2) - gTasks[taskId].func = Task_Truck3; - - cameraXpan = gTruckCamera_HorizontalTable[data[1]]; - cameraYpan = GetTruckCameraBobbingY(data[2]); - SetCameraPanning(cameraXpan, cameraYpan); - box1 = GetTruckBoxMovement(data[2] + 30) * 4; - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, box1 + 3); - box2 = GetTruckBoxMovement(data[2]) * 2; - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, box2 - 3); - box3 = GetTruckBoxMovement(data[2]) * 4; - sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, box3); - } -} - -void Task_Truck3(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - s16 cameraXpan; - s16 cameraYpan; - - data[0]++; - - if (data[0] > 5) - { - data[0] = 0; - data[1]++; - } - - if ((u16)data[1] == 19) - { - DestroyTask(taskId); - } - else - { - cameraXpan = gTruckCamera_HorizontalTable[data[1]]; - cameraYpan = 0; - SetCameraPanning(cameraXpan, cameraYpan); - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, cameraYpan + 3); - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, cameraYpan - 3); - sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, cameraYpan); - } -} - -void Task_HandleTruckSequence(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - /* - Each case has a timer which is handled with data[1], incrementing - until it reaches the if function's condition, which sets the next task up. - */ - case 0: - data[1]++; - if (data[1] == SECONDS(1.5)) - { - SetCameraPanningCallback(0); - data[1] = 0; // reset the timer. - data[2] = CreateTask(Task_Truck1, 0xA); - data[0] = 1; // run the next case. - PlaySE(SE_TRACK_MOVE); - } - break; - case 1: - data[1]++; - if (data[1] == SECONDS(2.5)) - { - pal_fill_black(); - data[1] = 0; - data[0] = 2; - } - break; - case 2: - data[1]++; - if (!gPaletteFade.active && data[1] > SECONDS(5)) - { - data[1] = 0; - DestroyTask(data[2]); - data[3] = CreateTask(Task_Truck2, 0xA); - data[0] = 3; - PlaySE(SE_TRACK_STOP); - } - break; - case 3: - if (!gTasks[data[3]].isActive) // is Truck2 no longer active (is Truck3 active?) - { - InstallCameraPanAheadCallback(); - data[1] = 0; - data[0] = 4; - } - break; - case 4: - data[1]++; - if (data[1] == 90) - { - PlaySE(SE_TRACK_HAIK); - data[1] = 0; - data[0] = 5; - } - break; - case 5: - data[1]++; - if (data[1] == 120) - { - MapGridSetMetatileIdAt(11, 8, 520); - MapGridSetMetatileIdAt(11, 9, 528); - MapGridSetMetatileIdAt(11, 10, 536); - DrawWholeMapView(); - PlaySE(SE_TRACK_DOOR); - DestroyTask(taskId); - ScriptContext2_Disable(); - } - break; - } -} - -void ExecuteTruckSequence(void) -{ - MapGridSetMetatileIdAt(11, 8, 525); - MapGridSetMetatileIdAt(11, 9, 533); - MapGridSetMetatileIdAt(11, 10, 541); - DrawWholeMapView(); - ScriptContext2_Enable(); - CpuFastFill(0, gPlttBufferFaded, 0x400); - CreateTask(Task_HandleTruckSequence, 0xA); -} - -void EndTruckSequence(u8 taskId) -{ - if (!FuncIsActiveTask(Task_HandleTruckSequence)) - { - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3, 3); - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 0, -3); - sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3, 0); - } -} - -bool8 sub_80C7754(void) -{ - s8 mapGroup, mapNum; - s16 x, y; - - if (GetSSTidalLocation(&mapGroup, &mapNum, &x, &y)) - { - return FALSE; - } - else - { - Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y); - return TRUE; - } -} - -void Task_HandlePorthole(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - u16 *var = GetVarPointer(VAR_PORTHOLE_STATE); - struct WarpData *location = &gSaveBlock1.location; - - switch (data[0]) - { - case INIT_PORTHOLE: // finish fading before making porthole finish. - if (!gPaletteFade.active) - { - data[1] = 0; - data[0] = EXECUTE_MOVEMENT; // execute movement before checking if should be exited. strange? - } - break; - case IDLE_CHECK: // idle and move. - if (gMain.newKeys & A_BUTTON) - data[1] = 1; - if (!ScriptMovement_IsObjectMovementFinished(0xFF, location->mapNum, location->mapGroup)) - return; - if (CountSSTidalStep(1) == TRUE) - { - if (*var == 2) - *var = 9; - else - *var = 10; - data[0] = 3; - return; - } - data[0] = 2; - case EXECUTE_MOVEMENT: // execute movement. - if (data[1]) - { - data[0] = EXIT_PORTHOLE; // exit porthole. - return; - } - // run this once. - if (*var == 2) // which direction? - { - ScriptMovement_StartObjectMovementScript(0xFF, location->mapNum, location->mapGroup, gUnknown_083D295F); - data[0] = IDLE_CHECK; // run case 1. - } - else - { - ScriptMovement_StartObjectMovementScript(0xFF, location->mapNum, location->mapGroup, gUnknown_083D2961); - data[0] = IDLE_CHECK; // run case 1. - } - break; - case EXIT_PORTHOLE: // exit porthole. - FlagClear(FLAG_SPECIAL_FLAG_1); - FlagClear(FLAG_SPECIAL_FLAG_0); - copy_saved_warp2_bank_and_enter_x_to_warp1(0); - sp13E_warp_to_last_warp(); - DestroyTask(taskId); - break; - } -} - -void sub_80C78A0(void) -{ - u8 spriteId = AddPseudoFieldObject(0x8C, SpriteCallbackDummy, 112, 80, 0); - - gSprites[spriteId].coordOffsetEnabled = FALSE; - - if (VarGet(VAR_PORTHOLE_STATE) == 2) - { - StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(4)); - } - else - { - StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(3)); - } -} - -void sub_80C791C(void) -{ - sub_80C78A0(); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = TRUE; - pal_fill_black(); - CreateTask(Task_HandlePorthole, 80); - ScriptContext2_Enable(); -} - -void sub_80C7958(void) -{ - FlagSet(FLAG_SYS_CRUISE_MODE); - FlagSet(FLAG_SPECIAL_FLAG_1); - FlagSet(FLAG_SPECIAL_FLAG_0); - saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); - sub_80C7754(); - sub_8080F9C(); -} diff --git a/src/field/field_specials.c b/src/field/field_specials.c deleted file mode 100644 index 715086f00..000000000 --- a/src/field/field_specials.c +++ /dev/null @@ -1,2381 +0,0 @@ -#include "global.h" -#include "field_specials.h" -#include "diploma.h" -#include "fieldmap.h" -#include "event_data.h" -#include "battle_tower.h" -#include "event_object_movement.h" -#include "region_map.h" -#include "field_region_map.h" -#include "field_message_box.h" -#include "field_camera.h" -#include "field_player_avatar.h" -#include "main.h" -#include "constants/maps.h" -#include "overworld.h" -#include "script.h" -#include "constants/songs.h" -#include "string_util.h" -#include "strings.h" -#include "pokeblock.h" -#include "constants/species.h" -#include "constants/abilities.h" -#include "constants/moves.h" -#include "text.h" -#include "wallclock.h" -#include "tv.h" -#include "rtc.h" -#include "link.h" -#include "constants/songs.h" -#include "sound.h" -#include "menu.h" -#include "starter_choose.h" -#include "menu_helpers.h" -#include "battle_tower.h" -#include "field_weather.h" -#include "pokemon_summary_screen.h" -#include "random.h" - -#if ENGLISH -#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD -#elif GERMAN -#define CHAR_DECIMAL_SEPARATOR CHAR_COMMA -#endif - -extern struct WarpData gUnknown_020297F0; -extern u8 gBattleOutcome; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_Result; - -extern u8 *const gUnknown_083D1464[3]; - -EWRAM_DATA bool8 gBikeCyclingChallenge = FALSE; -EWRAM_DATA u8 gBikeCollisions = 0; -EWRAM_DATA u32 gBikeCyclingTimer = 0; -EWRAM_DATA u8 gUnknown_02039258 = 0; -EWRAM_DATA u8 gUnknown_02039259 = 0; -EWRAM_DATA u8 gUnknown_0203925A = 0; -EWRAM_DATA u8 gUnknown_0203925B = 0; -EWRAM_DATA u8 gUnknown_0203925C = 0; - -static void RecordCyclingRoadResults(u32, u8); - -static struct ElevatorMenu gUnknown_03000760[20]; - -void ScrSpecial_ShowDiploma(void) -{ - SetMainCallback2(CB2_ShowDiploma); - ScriptContext2_Enable(); -} - -void ScrSpecial_ViewWallClock(void) -{ - gMain.savedCallback = c2_exit_to_overworld_2_switch; - SetMainCallback2(CB2_ViewWallClock); - ScriptContext2_Enable(); -} - -void ResetCyclingRoadChallengeData(void) -{ - gBikeCyclingChallenge = FALSE; - gBikeCollisions = 0; - gBikeCyclingTimer = 0; -} - -void ScrSpecial_BeginCyclingRoadChallenge(void) -{ - gBikeCyclingChallenge = TRUE; - gBikeCollisions = 0; - gBikeCyclingTimer = gMain.vblankCounter1; -} - -u16 GetPlayerAvatarBike(void) -{ - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) - return 1; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) - return 2; - return 0; -} - -static void DetermineCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) -{ - u8 result; - - if (numBikeCollisions <= 99) - { - ConvertIntToDecimalStringN(gStringVar1, numBikeCollisions, STR_CONV_MODE_LEFT_ALIGN, 2); - StringAppend(gStringVar1, gOtherText_Times); - } - else - { - StringCopy(gStringVar1, gOtherText_99Times); - } - - if (numFrames < 3600) - { - ConvertIntToDecimalStringN(gStringVar2, numFrames / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); - gStringVar2[2] = CHAR_DECIMAL_SEPARATOR; - ConvertIntToDecimalStringN(&gStringVar2[3], ((numFrames % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); - StringAppend(gStringVar2, gOtherText_Seconds); - } - else - { - StringCopy(gStringVar2, gOtherText_1Minute); - } - - result = 0; - if (numBikeCollisions == 0) - { - result = 5; - } - else if (numBikeCollisions < 4) - { - result = 4; - } - else if (numBikeCollisions < 10) - { - result = 3; - } - else if (numBikeCollisions < 20) - { - result = 2; - } - else if (numBikeCollisions < 100) - { - result = 1; - } - - if (numFrames / 60 <= 10) - { - result += 5; - } - else if (numFrames / 60 <= 15) - { - result += 4; - } - else if (numFrames / 60 <= 20) - { - result += 3; - } - else if (numFrames / 60 <= 40) - { - result += 2; - } - else if (numFrames / 60 < 60) - { - result += 1; - } - - - gSpecialVar_Result = result; -} - -void FinishCyclingRoadChallenge(void) { - const u32 numFrames = gMain.vblankCounter1 - gBikeCyclingTimer; - - DetermineCyclingRoadResults(numFrames, gBikeCollisions); - RecordCyclingRoadResults(numFrames, gBikeCollisions); -} - -static void RecordCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) { - u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L); - u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H); - u32 framesRecord = low + (high << 16); - - if (framesRecord > numFrames || framesRecord == 0) - { - VarSet(VAR_CYCLING_ROAD_RECORD_TIME_L, numFrames); - VarSet(VAR_CYCLING_ROAD_RECORD_TIME_H, numFrames >> 16); - VarSet(VAR_CYCLING_ROAD_RECORD_COLLISIONS, numBikeCollisions); - } -} - -u16 GetRecordedCyclingRoadResults(void) { - u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L); - u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H); - u32 framesRecord = low + (high << 16); - - if (framesRecord == 0) - { - return FALSE; - } - - DetermineCyclingRoadResults(framesRecord, VarGet(VAR_CYCLING_ROAD_RECORD_COLLISIONS)); - return TRUE; -} - -void UpdateCyclingRoadState(void) { - if (gUnknown_020297F0.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE) && gUnknown_020297F0.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE)) - { - return; - } - - if (VarGet(VAR_CYCLING_CHALLENGE_STATE) == 2 || VarGet(VAR_CYCLING_CHALLENGE_STATE) == 3) - { - VarSet(VAR_CYCLING_CHALLENGE_STATE, 0); - Overworld_SetSavedMusic(SE_STOP); - } -} - -void SetSSTidalFlag(void) -{ - FlagSet(FLAG_SYS_CRUISE_MODE); - *GetVarPointer(VAR_CRUISE_STEP_COUNT) = 0; -} - -void ResetSSTidalFlag(void) -{ - FlagClear(FLAG_SYS_CRUISE_MODE); -} - -bool32 CountSSTidalStep(u16 delta) -{ - if (!FlagGet(FLAG_SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) <= 0xcc) - { - return FALSE; - } - return TRUE; -} - -u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) -{ - u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT); - switch (*GetVarPointer(VAR_PORTHOLE_STATE)) - { - case 1: - case 8: - return 1; - case 3: - case 9: - return 4; - case 4: - case 5: - return 2; - case 6: - case 10: - return 3; - case 2: - if (*varCruiseStepCount < 60) - { - *mapNum = MAP_NUM(ROUTE134); - *x = *varCruiseStepCount + 19; - } - else if (*varCruiseStepCount < 140) - { - *mapNum = MAP_NUM(ROUTE133); - *x = *varCruiseStepCount - 60; - } - else - { - *mapNum = MAP_NUM(ROUTE132); - *x = *varCruiseStepCount - 140; - } - break; - case 7: - if (*varCruiseStepCount < 66) - { - *mapNum = MAP_NUM(ROUTE132); - *x = 65 - *varCruiseStepCount; - } - else if (*varCruiseStepCount < 146) { - *mapNum = MAP_NUM(ROUTE133); - *x = 145 - *varCruiseStepCount; - } - else - { - *mapNum = MAP_NUM(ROUTE134); - *x = 224 - *varCruiseStepCount; - } - break; - } - *mapGroup = MAP_GROUP(ROUTE132); - *y = 20; - return 0; -} - -u8 GetLinkPartnerNames(void) -{ - u8 i; - u8 j = 0; - u8 myLinkPlayerNumber = sub_8008218(); - u8 nLinkPlayers = sub_800820C(); - for (i=0; i=0; i--) - { - MapGridSetMetatileIdAt(switchCoords->x, switchCoords->y, 0x206); - switchCoords++; - } - for (y=12; y<24; y++) - { - for (x=7; x<16; x++) - { - switch (MapGridGetMetatileIdAt(x, y)) - { - case 0x220: - MapGridSetMetatileIdAt(x, y, 0x230); - break; - case 0x221: - MapGridSetMetatileIdAt(x, y, 0x231); - break; - case 0x228: - MapGridSetMetatileIdAt(x, y, 0x238); - break; - case 0x229: - MapGridSetMetatileIdAt(x, y, 0x239); - break; - case 0x222: - MapGridSetMetatileIdAt(x, y, 0x232); - break; - case 0x223: - MapGridSetMetatileIdAt(x, y, 0x233); - break; - case 0x22a: - MapGridSetMetatileIdAt(x, y, 0x23a); - break; - case 0x22b: - MapGridSetMetatileIdAt(x, y, 0x23b); - break; - case 0x240: - MapGridSetMetatileIdAt(x, y, 0xe42); - break; - case 0x241: - MapGridSetMetatileIdAt(x, y, 0xe43); - break; - case 0x248: - case 0x249: - MapGridSetMetatileIdAt(x, y, 0x21a); - break; - case 0x250: - MapGridSetMetatileIdAt(x, y, 0x251); - break; - } - } - } -} - -static void Task_PetalburgGym(u8); -static void PetalburgGymFunc(u8, u16); -const u8 gUnknown_083F8370[] = {0, 1, 1, 1, 1}; -const u16 gUnknown_083F8376[] = {0x218, 0x219, 0x21a, 0x21b, 0x21c}; - -void PetalburgGymSpecial1(void) -{ - gUnknown_02039258 = 0; - gUnknown_02039259 = 0; - PlaySE(SE_KI_GASYAN); - CreateTask(Task_PetalburgGym, 8); -} - -static void Task_PetalburgGym(u8 taskId) -{ - if (gUnknown_083F8370[gUnknown_02039259] == gUnknown_02039258) - { - PetalburgGymFunc(gSpecialVar_0x8004, gUnknown_083F8376[gUnknown_02039259]); - gUnknown_02039258 = 0; - if ((++gUnknown_02039259) == 5) - { - DestroyTask(taskId); - EnableBothScriptContexts(); - } - } - else - { - gUnknown_02039258++; - } -} - -static void PetalburgGymFunc(u8 a0, u16 a1) -{ - u16 x[4]; - u16 y[4]; - u8 i; - u8 nDoors = 0; - switch (a0) - { - case 1: - nDoors = 2; - x[0] = 1; - x[1] = 7; - y[0] = 0x68; - y[1] = 0x68; - break; - case 2: - nDoors = 2; - x[0] = 1; - x[1] = 7; - y[0] = 0x4e; - y[1] = 0x4e; - break; - case 3: - nDoors = 2; - x[0] = 1; - x[1] = 7; - y[0] = 0x5b; - y[1] = 0x5b; - break; - case 4: - nDoors = 1; - x[0] = 7; - y[0] = 0x27; - break; - case 5: - nDoors = 2; - x[0] = 1; - x[1] = 7; - y[0] = 0x34; - y[1] = 0x34; - break; - case 6: - nDoors = 1; - x[0] = 1; - y[0] = 0x41; - break; - case 7: - nDoors = 1; - x[0] = 7; - y[0] = 0xd; - break; - case 8: - nDoors = 1; - x[0] = 1; - y[0] = 0x1a; - break; - } - for (i=0; i 9999) - { - weekCount = 9999; - } - return weekCount; -} - -u8 GetLeadMonFriendshipScore(void) -{ - struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()]; - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255) - { - return 6; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200) - { - return 5; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150) - { - return 4; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100) - { - return 3; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50) - { - return 2; - } - if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1) - { - return 1; - } - return 0; -} - -void CB2_FieldShowRegionMap(void) -{ - FieldInitRegionMap(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void FieldShowRegionMap(void) -{ - SetMainCallback2(CB2_FieldShowRegionMap); -} - -static void Task_PCTurnOnEffect(u8); -static void PCTurnOffEffect_0(struct Task *); -static void PCTurnOffEffect_1(s16, s8, s8); -static void PCTurnOffEffect(void); - -void DoPCTurnOnEffect(void) -{ - if (FuncIsActiveTask(Task_PCTurnOnEffect) != TRUE) - { - u8 taskId = CreateTask(Task_PCTurnOnEffect, 8); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = taskId; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - } -} - -static void Task_PCTurnOnEffect(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - if (task->data[0] == 0) - { - PCTurnOffEffect_0(task); - } -} - -static void PCTurnOffEffect_0(struct Task *task) -{ - u8 playerDirectionLowerNybble; - s8 dx = 0; - s8 dy = 0; - if (task->data[3] == 6) - { - task->data[3] = 0; - playerDirectionLowerNybble = player_get_direction_lower_nybble(); - switch (playerDirectionLowerNybble) - { - case DIR_NORTH: - dx = 0; - dy = -1; - break; - case DIR_WEST: - dx = -1; - dy = -1; - break; - case DIR_EAST: - dx = 1; - dy = -1; - break; - } - PCTurnOffEffect_1(task->data[4], dx, dy); - DrawWholeMapView(); - task->data[4] ^= 1; - if ((++task->data[2]) == 5) - { - DestroyTask(task->data[1]); - } - } - task->data[3]++; -} - -static void PCTurnOffEffect_1(s16 flag, s8 dx, s8 dy) -{ - u16 tileId = 0; - if (flag != 0) - { - if (gSpecialVar_0x8004 == 0) - { - tileId = 0x4; - } - else if (gSpecialVar_0x8004 == 1) - { - tileId = 0x25a; - } - else if (gSpecialVar_0x8004 == 2) - { - tileId = 0x259; - } - } - else - { - if (gSpecialVar_0x8004 == 0) - { - tileId = 0x5; - } - else if (gSpecialVar_0x8004 == 1) - { - tileId = 0x27f; - } - else if (gSpecialVar_0x8004 == 2) - { - tileId = 0x27e; - } - } - MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); -} - -void DoPCTurnOffEffect(void) -{ - PCTurnOffEffect(); -} - -static void PCTurnOffEffect(void) -{ - s8 dx = 0; - s8 dy = 0; - u16 tileId = 0; - u8 playerDirectionLowerNybble = player_get_direction_lower_nybble(); - switch (playerDirectionLowerNybble) - { - case DIR_NORTH: - dx = 0; - dy = -1; - break; - case DIR_WEST: - dx = -1; - dy = -1; - break; - case DIR_EAST: - dx = 1; - dy = -1; - break; - } - if (gSpecialVar_0x8004 == 0) - { - tileId = 0x4; - } - else if (gSpecialVar_0x8004 == 1) - { - tileId = 0x25a; - } - else if (gSpecialVar_0x8004 == 2) - { - tileId = 0x259; - } - MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); - DrawWholeMapView(); -} - -static void Task_LotteryCornerComputerEffect(u8); -static void LotteryCornerComputerEffect(struct Task *); - -void DoLotteryCornerComputerEffect(void) -{ - if (FuncIsActiveTask(Task_LotteryCornerComputerEffect) != TRUE) - { - u8 taskId = CreateTask(Task_LotteryCornerComputerEffect, 8); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = taskId; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - } -} - -static void Task_LotteryCornerComputerEffect(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - if (task->data[0] == 0) - { - LotteryCornerComputerEffect(task); - } -} - -static void LotteryCornerComputerEffect(struct Task *task) -{ - if (task->data[3] == 6) - { - task->data[3] = 0; - if (task->data[4] != 0) - { - MapGridSetMetatileIdAt(18, 8, 0xe9d); - MapGridSetMetatileIdAt(18, 9, 0xea5); - } - else - { - MapGridSetMetatileIdAt(18, 8, 0xe58); - MapGridSetMetatileIdAt(18, 9, 0xe60); - } - DrawWholeMapView(); - task->data[4] ^= 1; - if ((++task->data[2]) == 5) - { - DestroyTask(task->data[1]); - } - } - task->data[3]++; -} - -void EndLotteryCornerComputerEffect(void) -{ - MapGridSetMetatileIdAt(18, 8, 0xe9d); - MapGridSetMetatileIdAt(18, 9, 0xea5); - DrawWholeMapView(); -} - -static void sub_810E874(void); -void DisplayCurrentElevatorFloor(void); -void sub_810E984(u8); -bool8 sub_810EAC8(u8, u8); -void sub_810EB90(u8, u8); -void ShakeScreenInElevator(void); -void sub_810EC34(u8); -void sub_810EC9C(u8); -void sub_810ECB0(void); -void sub_810ECD4(void); -void sub_810ECFC(void); -void sub_810ED40(u8); -void sub_810ED60(struct Task *); -void sub_810EEDC(void); - -const u8 *const gUnknown_083F8380[] = { - OtherText_1F, - OtherText_2F, - OtherText_3F, - OtherText_4F, - OtherText_5F, - OtherText_6F, - OtherText_7F, - OtherText_8F, - OtherText_9F, - OtherText_10F, - OtherText_11F, - OtherText_B1F, - OtherText_B2F, - OtherText_B3F, - OtherText_B4F, - OtherText_Rooftop -}; - -void SetDepartmentStoreFloorVar(void) -{ - u8 deptStoreFloor; - switch (gSaveBlock1.warp2.mapNum) - { - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F): - deptStoreFloor = 0; - break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F): - deptStoreFloor = 1; - break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F): - deptStoreFloor = 2; - break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F): - deptStoreFloor = 3; - break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F): - deptStoreFloor = 4; - break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP): - deptStoreFloor = 15; - break; - default: - deptStoreFloor = 0; - break; - } - VarSet(VAR_DEPT_STORE_FLOOR, deptStoreFloor); -} - -void ScriptAddElevatorMenuItem(u8 a0, u8 a1, u8 a2, u8 a3) -{ - u8 i; - if (gSpecialVar_0x8004 == 0) - { - for (i=0; i<20; i++) - { - gUnknown_03000760[i].var0 = 16; - } - } - gUnknown_03000760[gSpecialVar_0x8004].var0 = a0; - gUnknown_03000760[gSpecialVar_0x8004].var1 = a1; - gUnknown_03000760[gSpecialVar_0x8004].var2 = a2; - gUnknown_03000760[gSpecialVar_0x8004].var3 = a3; - gSpecialVar_0x8004++; -} - -void ScriptShowElevatorMenu(void) -{ - u8 i = 0; - gUnknown_0203925A = 0; - gUnknown_0203925B = 0; - ScriptAddElevatorMenuItem(16, 0, 0, 0); - while (gUnknown_03000760[i].var0 != 16) - { - gUnknown_0203925A++; - i++; - } - sub_810E874(); -} - -static void sub_810E874(void) -{ - u8 i; - ScriptContext2_Enable(); - if (gUnknown_0203925A > 5) - { - Menu_DrawStdWindowFrame(0, 0, 8, 11); - InitMenu(0, 1, 1, 5, 0, 7); - gUnknown_0203925C = 0; - ClearVerticalScrollIndicatorPalettes(); - LoadScrollIndicatorPalette(); - sub_810ECD4(); - } - else - { - Menu_DrawStdWindowFrame(0, 0, 8, 2 * gUnknown_0203925A + 1); - InitMenu(0, 1, 1, gUnknown_0203925A, 0, 7); - } - for (i = 0; i < 5 && gUnknown_03000760[i].var0 != 16; i ++) - { - Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1); - } - DisplayCurrentElevatorFloor(); - CreateTask(sub_810E984, 8); -} - -void DisplayCurrentElevatorFloor(void) -{ - Menu_DrawStdWindowFrame(20, 0, 29, 5); - sub_8072BD8(gOtherText_NowOn, 21, 1, 64); - sub_8072BD8(gUnknown_083F8380[gSpecialVar_0x8005], 21, 3, 64); -} - -void sub_810E984(u8 taskId) -{ - u8 curMenuPos; - if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) - { - gUnknown_0203925B--; - curMenuPos = Menu_GetCursorPos(); - Menu_MoveCursorNoWrap(-1); - sub_810EAC8(curMenuPos, DPAD_UP); - } - if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) - { - gUnknown_0203925B++; - curMenuPos = Menu_GetCursorPos(); - Menu_MoveCursorNoWrap(+1); - sub_810EAC8(curMenuPos, DPAD_DOWN); - } - if (gMain.newKeys & A_BUTTON) - { - saved_warp2_set_2(0, gUnknown_03000760[gUnknown_0203925B].var1, gUnknown_03000760[gUnknown_0203925B].var2, -1, 2, 1); - if (gSpecialVar_0x8005 == gUnknown_0203925B) - { - gSpecialVar_Result = 0; - PlaySE(SE_SELECT); - Menu_EraseWindowRect(0, 0, 29, 12); - sub_810EC9C(taskId); - } - else - { - gSpecialVar_Result = 1; - gSpecialVar_0x8005 = gUnknown_0203925B; - ShakeScreenInElevator(); - FieldObjectTurnByLocalIdAndMap(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH); - sub_810EEDC(); - Menu_EraseScreen(); - DestroyTask(taskId); - } - } - else if (gMain.newKeys & B_BUTTON) - { - gSpecialVar_Result = 0; - PlaySE(SE_SELECT); - sub_810EEDC(); - Menu_EraseWindowRect(0, 0, 29, 12); - sub_810EC9C(taskId); - } -} - -// This function, as written, swaps the roles of r4 and r5 throughout. -#ifdef NONMATCHING -bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) -{ - u8 i; - bool8 flag = 0; - u8 newPos = 0; - if (gUnknown_0203925A < 5) - { - return FALSE; - } - if (dpadInput == DPAD_UP) - { - if (prevMenuPos == 0) - { - newPos = gUnknown_0203925B; - flag = 1; - } - } - else if (dpadInput == DPAD_DOWN) - { - if (prevMenuPos == 4) - { - newPos = gUnknown_0203925B - 4; - flag = 1; - } - } - if (flag) - { - sub_810EB90(newPos, 5); - Menu_BlankWindowRect(2, 1, 7, 10); - for (i=0; i<5 && gUnknown_03000760[newPos].var0 != 16; newPos++, i++) - { - Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1); - } - } - return flag; -} -#else -__attribute__((naked)) -bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tlsls r0, 24\n" - "\tlsrs r2, r0, 24\n" - "\tadds r5, r2, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tadds r3, r1, 0\n" - "\tmovs r7, 0\n" - "\tmovs r4, 0\n" - "\tldr r0, _0810EAEC @ =gUnknown_0203925A\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x4\n" - "\tbhi _0810EAF0\n" - "\tmovs r0, 0\n" - "\tb _0810EB78\n" - "\t.align 2, 0\n" - "_0810EAEC: .4byte gUnknown_0203925A\n" - "_0810EAF0:\n" - "\tcmp r1, 0x40\n" - "\tbne _0810EB04\n" - "\tcmp r2, 0\n" - "\tbne _0810EB18\n" - "\tldr r0, _0810EB00 @ =gUnknown_0203925B\n" - "\tldrb r4, [r0]\n" - "\tmovs r7, 0x1\n" - "\tb _0810EB1C\n" - "\t.align 2, 0\n" - "_0810EB00: .4byte gUnknown_0203925B\n" - "_0810EB04:\n" - "\tcmp r3, 0x80\n" - "\tbne _0810EB18\n" - "\tcmp r5, 0x4\n" - "\tbne _0810EB18\n" - "\tldr r0, _0810EB84 @ =gUnknown_0203925B\n" - "\tldrb r0, [r0]\n" - "\tsubs r0, 0x4\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tmovs r7, 0x1\n" - "_0810EB18:\n" - "\tcmp r7, 0\n" - "\tbeq _0810EB76\n" - "_0810EB1C:\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0x5\n" - "\tbl sub_810EB90\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0x1\n" - "\tmovs r2, 0x7\n" - "\tmovs r3, 0xA\n" - "\tbl Menu_BlankWindowRect\n" - "\tmovs r5, 0\n" - "\tldr r2, _0810EB88 @ =gUnknown_03000760\n" - "\tlsls r1, r4, 2\n" - "\tadds r0, r1, r2\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x10\n" - "\tbeq _0810EB76\n" - "\tldr r0, _0810EB8C @ =gUnknown_083F8380\n" - "\tmov r8, r0\n" - "\tadds r6, r2, 0\n" - "_0810EB44:\n" - "\tadds r0, r1, r6\n" - "\tldrb r0, [r0]\n" - "\tlsls r0, 2\n" - "\tadd r0, r8\n" - "\tldr r0, [r0]\n" - "\tlsls r2, r5, 1\n" - "\tadds r2, 0x1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tmovs r1, 0x1\n" - "\tbl Menu_PrintText\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tadds r0, r5, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, 0x4\n" - "\tbhi _0810EB76\n" - "\tlsls r1, r4, 2\n" - "\tadds r0, r1, r6\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x10\n" - "\tbne _0810EB44\n" - "_0810EB76:\n" - "\tadds r0, r7, 0\n" - "_0810EB78:\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.align 2, 0\n" - "_0810EB84: .4byte gUnknown_0203925B\n" - "_0810EB88: .4byte gUnknown_03000760\n" - "_0810EB8C: .4byte gUnknown_083F8380"); -} -#endif - -void sub_810EB90(u8 newPos, u8 maxItems) -{ - if (newPos == 0) - { - gUnknown_0203925C ^= 0x02; - DestroyVerticalScrollIndicator(TOP_ARROW); - } - else - { - sub_810ECB0(); - } - if (newPos + maxItems < gUnknown_0203925A) - { - sub_810ECD4(); - } - else if (newPos + maxItems == gUnknown_0203925A) - { - gUnknown_0203925C ^= 0x01; - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - } -} - -void ShakeScreenInElevator(void) -{ - u8 taskId = CreateTask(sub_810EC34, 9); - gTasks[taskId].data[0] = 1; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 1; - gTasks[taskId].data[5] = 3; - SetCameraPanningCallback(NULL); - sub_810ECFC(); - PlaySE(SE_ELEBETA); -} - -void sub_810EC34(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - task->data[1] ++; - if (task->data[1] % task->data[5] == 0) - { - task->data[1] = 0; - task->data[2] ++; - if (task->data[3] == 0) - { - task->data[4] = -task->data[4]; - SetCameraPanning(0, task->data[4]); - if (task->data[2] == 23) - { - PlaySE(SE_PINPON); - sub_810EC9C(taskId); - InstallCameraPanAheadCallback(); - } - } - } -} - -void sub_810EC9C(u8 taskId) -{ - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void sub_810ECB0(void) -{ - if (gUnknown_0203925C >> 1 != 1) - { - gUnknown_0203925C |= 0x2; - CreateVerticalScrollIndicators(TOP_ARROW, 0x24, 0x08); - } -} - -void sub_810ECD4(void) -{ - if ((gUnknown_0203925C & 1) == 0) - { - gUnknown_0203925C |= 0x1; - CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x24, 0x48); - } -} - -void sub_810ECFC(void) -{ - if (FuncIsActiveTask(sub_810ED40) != TRUE) - { - u8 taskId = CreateTask(sub_810ED40, 8); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = taskId; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 0; - } -} - -void sub_810ED40(u8 taskId) -{ - sub_810ED60(&gTasks[taskId]); -} - -void sub_810ED60(struct Task *task) -{ - if (task->data[3] == 8) - { - task->data[3] = 0; - if (task->data[4] != 0) - { - MapGridSetMetatileIdAt( 7, 7, 0xe68); - MapGridSetMetatileIdAt( 8, 7, 0xe69); - MapGridSetMetatileIdAt( 9, 7, 0xe69); - MapGridSetMetatileIdAt(10, 7, 0xe6a); - MapGridSetMetatileIdAt( 7, 8, 0xe70); - MapGridSetMetatileIdAt( 8, 8, 0xe71); - MapGridSetMetatileIdAt( 9, 8, 0xe71); - MapGridSetMetatileIdAt(10, 8, 0xe72); - MapGridSetMetatileIdAt( 7, 9, 0xe78); - MapGridSetMetatileIdAt( 8, 9, 0xe79); - MapGridSetMetatileIdAt( 9, 9, 0xe79); - MapGridSetMetatileIdAt(10, 9, 0xe7a); - } - else - { - MapGridSetMetatileIdAt( 7, 7, 0xe6b); - MapGridSetMetatileIdAt( 8, 7, 0xe6c); - MapGridSetMetatileIdAt( 9, 7, 0xe6c); - MapGridSetMetatileIdAt(10, 7, 0xe6d); - MapGridSetMetatileIdAt( 7, 8, 0xe73); - MapGridSetMetatileIdAt( 8, 8, 0xe74); - MapGridSetMetatileIdAt( 9, 8, 0xe74); - MapGridSetMetatileIdAt(10, 8, 0xe75); - MapGridSetMetatileIdAt( 7, 9, 0xe7b); - MapGridSetMetatileIdAt( 8, 9, 0xe7c); - MapGridSetMetatileIdAt( 9, 9, 0xe7c); - MapGridSetMetatileIdAt(10, 9, 0xe7d); - } - DrawWholeMapView(); - task->data[4] ^= 1; - task->data[2]++; - if (task->data[2] == 8) - { - DestroyTask(task->data[1]); - } - } - task->data[3]++; -} - -void sub_810EEDC(void) -{ - if ((gUnknown_0203925C & 1) != 0) - { - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - } - if ((gUnknown_0203925C >> 1) == 1) - { - DestroyVerticalScrollIndicator(TOP_ARROW); - } - BuyMenuFreeMemory(); -} - -void SetTrickHouseEndRoomFlag(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = 0x259; - *specVar = flag; - FlagSet(flag); -} - -void ResetTrickHouseEndRoomFlag(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = 0x259; - *specVar = flag; - FlagClear(flag); -} - -bool8 CheckLeadMonCool(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_COOL) < 200) - { - return FALSE; - } - return TRUE; -} - -bool8 CheckLeadMonBeauty(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_BEAUTY) < 200) - { - return FALSE; - } - return TRUE; -} - -bool8 CheckLeadMonCute(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_CUTE) < 200) - { - return FALSE; - } - return TRUE; -} - -bool8 CheckLeadMonSmart(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SMART) < 200) - { - return FALSE; - } - return TRUE; -} - -bool8 CheckLeadMonTough(void) -{ - if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_TOUGH) < 200) - { - return FALSE; - } - return TRUE; -} - -void IsGrassTypeInParty(void) -{ - u8 i; - u16 species; - struct Pokemon *pokemon; - for (i=0; i> 1 != 1) - { - gUnknown_0203925C |= 0x02; - CreateVerticalScrollIndicators(TOP_ARROW, 0x2c, 0x08); - } -} - -void sub_810F2B4(void) -{ - if (!(gUnknown_0203925C & 0x01)) - { - gUnknown_0203925C |= 0x01; - CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x2c, 0x58); - } -} - -void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) -{ - if (newPos == 0) - { - gUnknown_0203925C ^= 0x02; - DestroyVerticalScrollIndicator(TOP_ARROW); - } - else - { - sub_810F290(); - } - if (newPos + maxItems < gUnknown_0203925A) - { - sub_810F2B4(); - } - else if (newPos + maxItems == gUnknown_0203925A) - { - gUnknown_0203925C ^= 0x01; - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - } -} - -void SpawnCameraDummy(void) -{ - u8 mapObjectId = SpawnSpecialFieldObjectParametrized(7, 8, 0x7f, gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7, 3); - gMapObjects[mapObjectId].mapobj_bit_13 = 1; - CameraObjectSetFollowedObjectId(gMapObjects[mapObjectId].spriteId); -} - -void RemoveCameraDummy(void) -{ - CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); - RemoveFieldObjectByLocalIdAndMap(0x7f, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); -} - -u8 GetPokeblockNameByMonNature(void) -{ - return sub_810CB68(GetNature(&gPlayerParty[GetLeadMonIndex()]), gStringVar1); -} - -void GetSecretBaseNearbyMapName(void) -{ - GetMapSectionName(gStringVar1, VarGet(VAR_SECRET_BASE_MAP), 0); -} - -u16 GetBestBattleTowerStreak(void) -{ - return GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK); -} - -void BufferEReaderTrainerName(void) -{ - SetEReaderTrainerName(gStringVar1); -} - -const u8 gUnknown_083F83E0[] = {12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6}; -const u8 gUnknown_083F83EC[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5}; -const u8 gUnknown_083F83F8[] = {3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5}; - -u8 GetSlotMachineId(void) -{ - u32 v0 = gSaveBlock1.easyChatPairs[0].unk0_0 + gSaveBlock1.easyChatPairs[0].unk2 + gUnknown_083F83E0[gSpecialVar_0x8004]; - if (GetPriceReduction(2)) - { - return gUnknown_083F83F8[v0 % 12]; - } - return gUnknown_083F83EC[v0 % 12]; -} - -bool8 FoundAbandonedShipRoom1Key(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = FLAG_HIDDEN_ITEM_1F; - *specVar = flag; - if (!FlagGet(flag)) - { - return FALSE; - } - return TRUE; -} - -bool8 FoundAbandonedShipRoom2Key(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = FLAG_HIDDEN_ITEM_20; - *specVar = flag; - if (!FlagGet(flag)) - { - return FALSE; - } - return TRUE; -} - -bool8 FoundAbandonedShipRoom4Key(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = FLAG_HIDDEN_ITEM_21; - *specVar = flag; - if (!FlagGet(flag)) - { - return FALSE; - } - return TRUE; -} - -bool8 FoundAbandonedShipRoom6Key(void) -{ - u16 *specVar = &gSpecialVar_0x8004; - u16 flag = FLAG_HIDDEN_ITEM_22; - *specVar = flag; - if (!FlagGet(flag)) - { - return FALSE; - } - return TRUE; -} - -bool8 LeadMonHasEffortRibbon(void) -{ - return GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, NULL); -} - -void GivLeadMonEffortRibbon(void) -{ - bool8 ribbonSet; - IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); - FlagSet(FLAG_SYS_RIBBON_GET); - ribbonSet = TRUE; - SetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, &ribbonSet); -} - -bool8 ScrSpecial_AreLeadMonEVsMaxedOut(void) -{ - if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= 510) - { - return TRUE; - } - return FALSE; -} - -u8 TryUpdateRusturfTunnelState(void) -{ - if (!FlagGet(FLAG_RUSTURF_TUNNEL_OPENED) && gSaveBlock1.location.mapGroup == MAP_GROUP(RUSTURF_TUNNEL) && gSaveBlock1.location.mapNum == MAP_NUM(RUSTURF_TUNNEL)) - { - if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1)) - { - VarSet(VAR_RUSTURF_TUNNEL_STATE, 4); - return TRUE; - } - else if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2)) - { - VarSet(VAR_RUSTURF_TUNNEL_STATE, 5); - return TRUE; - } - } - return FALSE; -} - -void SetShoalItemFlag(u16 v0) -{ - FlagSet(0x85f); -} - -void PutZigzagoonInPlayerParty(void) -{ - u16 monData; - CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0); - monData = TRUE; - SetMonData(&gPlayerParty[0], MON_DATA_ALT_ABILITY, &monData); - monData = MOVE_TACKLE; - SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, &monData); - monData = MOVE_NONE; - SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, &monData); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, &monData); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, &monData); -} - -bool8 IsStarterInParty(void) -{ - u8 i; - u16 starter = GetStarterPokemon(VarGet(VAR_STARTER_MON)); - u8 partyCount = CalculatePlayerPartyCount(); - for (i = 0; i < partyCount; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == starter) - { - return TRUE; - } - } - return FALSE; -} - -bool8 CheckFreePokemonStorageSpace(void) -{ - u16 i, j; - for (i=0; i<14; i++) - { - for (j=0; j<30; j++) - { - if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) - { - return TRUE; - } - } - } - return FALSE; -} - -bool8 IsPokerusInParty(void) -{ - if (!CheckPartyPokerus(gPlayerParty, 0x3f)) - { - return FALSE; - } - return TRUE; -} - -static void sub_810F7A8(u8); -static void sub_810F814(u8); - -void sub_810F758(void) -{ - u8 taskId = CreateTask(sub_810F7A8, 9); - gTasks[taskId].data[0] = gSpecialVar_0x8005; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = gSpecialVar_0x8004; - gTasks[taskId].data[5] = 5; - SetCameraPanningCallback(NULL); - PlaySE(SE_W070); -} - -static void sub_810F7A8(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - task->data[1]++; - if ((task->data[1] % task->data[5]) == 0) - { - task->data[1] = 0; - task->data[2]++; - if (task->data[3] == 0) - { - task->data[0] = -task->data[0]; - task->data[4] = -task->data[4]; - SetCameraPanning(task->data[0], task->data[4]); - if (task->data[2] == 8) - { - sub_810F814(taskId); - InstallCameraPanAheadCallback(); - } - } - } -} - -static void sub_810F814(u8 taskId) -{ - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -bool8 FoundBlackGlasses(void) -{ - return FlagGet(FLAG_HIDDEN_ITEM_BLACK_GLASSES); -} - -void SetRoute119Weather(void) -{ - if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()) != TRUE) - { - SetSav1Weather(0x14); - } -} - -void SetRoute123Weather(void) -{ - if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()) != TRUE) - { - SetSav1Weather(0x15); - } -} - -u8 GetLeadMonIndex(void) -{ - u8 i; - u8 partyCount = CalculatePlayerPartyCount(); - for (i=0; i= 7) - { - return 0; - } - else if (gLocalTime.days < 0) - { - return 8; - } - return 7 - (gLocalTime.days - tmReceivedDay); -} - -u16 SetPacifidlogTMReceivedDay(void) -{ - VarSet(VAR_PACIFIDLOG_TM_RECEIVED_DAY, gLocalTime.days); - return gLocalTime.days; -} - -bool8 MonOTNameMatchesPlayer(void) -{ - GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); - if (!StringCompareWithoutExtCtrlCodes(gSaveBlock2.playerName, gStringVar1)) - { - return FALSE; - } - return TRUE; -} - -void BufferLottoTicketNumber(void) -{ - if (gSpecialVar_Result >= 10000) - { - sub_80BF088(0, gSpecialVar_Result); - } - else if (gSpecialVar_Result >= 1000) - { - gStringVar1[0] = CHAR_0; - ConvertIntToDecimalStringN(gStringVar1 + 1, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); - } - else if (gSpecialVar_Result >= 100) - { - gStringVar1[0] = CHAR_0; - gStringVar1[1] = CHAR_0; - ConvertIntToDecimalStringN(gStringVar1 + 2, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); - } - else if (gSpecialVar_Result >= 10) - { - gStringVar1[0] = CHAR_0; - gStringVar1[1] = CHAR_0; - gStringVar1[2] = CHAR_0; - ConvertIntToDecimalStringN(gStringVar1 + 3, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); - } - else - { - gStringVar1[0] = CHAR_0; - gStringVar1[1] = CHAR_0; - gStringVar1[2] = CHAR_0; - gStringVar1[3] = CHAR_0; - ConvertIntToDecimalStringN(gStringVar1 + 4, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); - } -} - -const u8 gUnknown_083F8404[] = {2, 1, 2, 1}; -const u8 gUnknown_083F8408[] = {8, 9, 10, 11, 12, 13, 14, 15}; -const u8 gUnknown_083F8410[] = {8, 13, 14, 11, 10, 12, 15, 9}; - -bool8 sub_810FF30(void); -void UpdateMovedLilycoveFanClubMembers(void); -void sub_810FF48(void); -void sub_810FD80(void); -u16 GetNumMovedLilycoveFanClubMembers(void); -int sub_810FB9C(void); - -void ResetFanClub(void) -{ - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = 0; - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = 0; -} - -void sub_810FA74(void) -{ - if (sub_810FF30()) - { - UpdateMovedLilycoveFanClubMembers(); - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; - } -} - -void sub_810FAA0(void) -{ - if (!((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 1)) - { - sub_810FF48(); - sub_810FD80(); - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; - FlagClear(FLAG_HIDE_FANCLUB_OLD_LADY); - FlagClear(FLAG_HIDE_FANCLUB_BOY); - FlagClear(FLAG_HIDE_FANCLUB_LITTLE_BOY); - FlagClear(FLAG_HIDE_FANCLUB_LADY); - VarSet(VAR_LILYCOVE_FAN_CLUB_STATE, 1); - } -} - -u8 sub_810FB10(u8 a0) -{ - if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) - { - if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7f) + gUnknown_083F8404[a0] >= 20) - { - if (GetNumMovedLilycoveFanClubMembers() < 3) - { - sub_810FB9C(); - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] &= 0xff80; - } - else - { - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0xff80) | 20; - } - } - else - { - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] += gUnknown_083F8404[a0]; - } - } - return gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7f; -} - -int sub_810FB9C(void) -{ - u8 i; - int retval = 0; - for (i=0; i<8; i++) - { - if (!((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8408[i]) & 0x01)) - { - retval = i; - if (Random() & 1) - { - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= (1 << gUnknown_083F8408[i]); - return retval; - } - } - } - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= (1 << gUnknown_083F8408[retval]); - return retval; -} - -int sub_810FC18(void) -{ - u8 i; - int retval = 0; - if (GetNumMovedLilycoveFanClubMembers() == 1) - { - return 0; - } - for (i=0; i<8; i++) - { - if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8410[i]) & 1) - { - retval = i; - if (Random() & 1) - { - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= (1 << gUnknown_083F8410[i]); - return retval; - } - } - } - if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8410[retval]) & 1) - { - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= (1 << gUnknown_083F8410[retval]); - } - return retval; -} - -u16 GetNumMovedLilycoveFanClubMembers(void) -{ - u8 i; - u8 retval = 0; - for (i = 0; i < 8; i++) - { - if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> (i + 8)) & 1) - { - retval++; - } - } - - return retval; -} - -void UpdateMovedLilycoveFanClubMembers(void) -{ - u8 i = 0; - if (gSaveBlock2.playTimeHours < 999) - { - while (1) - { - if (GetNumMovedLilycoveFanClubMembers() < 5) - { - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; - break; - } - else if (i == 8) - { - break; - } - else if (gSaveBlock2.playTimeHours - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] < 12) - { - return; - } - sub_810FC18(); - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] += 12; - i++; - } - } -} - -bool8 ShouldMoveLilycoveFanClubMember(void) -{ - return (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gSpecialVar_0x8004) & 0x01; -} - -void sub_810FD80(void) -{ - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x2000; - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x100; - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x400; -} - -void sub_810FE1C(void *, u8, u8); - -void BufferStreakTrainerText(void) -{ - u8 a = 0; - u8 b = 0; - switch (gSpecialVar_0x8004) - { - case 8: - break; - case 9: - break; - case 10: - a = 0; - b = 3; - break; - case 11: - a = 0; - b = 1; - break; - case 12: - a = 1; - b = 0; - break; - case 13: - a = 0; - b = 4; - break; - case 14: - a = 1; - b = 5; - break; - case 15: - break; - } - sub_810FE1C(gSaveBlock1.linkBattleRecords, a, b); -} - -void sub_810FE1C(void *linkRecords, u8 a, u8 b) -{ - u8 *curRecord = (linkRecords + 16 * a); - if (*curRecord == EOS) - { - switch (b) - { - case 0: - StringCopy(gStringVar1, gOtherText_Wallace); - break; - case 1: - StringCopy(gStringVar1, gOtherText_Steven); - break; - case 2: - StringCopy(gStringVar1, gOtherText_Brawly); - break; - case 3: - StringCopy(gStringVar1, gOtherText_Winona); - break; - case 4: - StringCopy(gStringVar1, gOtherText_Phoebe); - break; - case 5: - StringCopy(gStringVar1, gOtherText_Glacia); - break; - default: - StringCopy(gStringVar1, gOtherText_Wallace); - break; - } - } - else - { - StringCopyN(gStringVar1, curRecord, 7); - gStringVar1[7] = EOS; - if (gStringVar1[0] == 0xfc && gStringVar1[1] == 0x15) - { - ConvertInternationalString(gStringVar1, 1); - } - } -} - -void sub_810FEFC(void) -{ - if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) - { - sub_810FA74(); - if (gBattleOutcome == 1) - { - sub_810FB9C(); - } - else - { - sub_810FC18(); - } - } -} - -bool8 sub_810FF30(void) -{ - return (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 0x01; -} - -void sub_810FF48(void) -{ - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x80; -} - -u8 sub_810FF60(void) -{ - return sub_810FB10(gSpecialVar_0x8004); -} diff --git a/src/field/field_tasks.c b/src/field/field_tasks.c deleted file mode 100644 index ce5fc6c0e..000000000 --- a/src/field/field_tasks.c +++ /dev/null @@ -1,864 +0,0 @@ -#include "global.h" -#include "task.h" -#include "main.h" -#include "constants/vars.h" -#include "bike.h" -#include "item.h" -#include "constants/items.h" -#include "event_data.h" -#include "overworld.h" -#include "clock.h" -#include "script.h" -#include "field_special_scene.h" -#include "field_effect_helpers.h" -#include "secret_base.h" -#include "metatile_behavior.h" -#include "fieldmap.h" -#include "field_player_avatar.h" -#include "field_camera.h" -#include "constants/songs.h" -#include "sound.h" -#include "field_tasks.h" - -void DummyPerStepCallback(u8); -void PerStepCallback_8069F64(u8); -void PerStepCallback_8069AA0(u8); -void PerStepCallback_8069864(u8); -void PerStepCallback_8069DD4(u8); -void PerStepCallback_806A07C(u8); - -void (*const gUnknown_08376364[])(u8) = { - DummyPerStepCallback, - PerStepCallback_8069F64, - PerStepCallback_8069AA0, - PerStepCallback_8069864, - PerStepCallback_8069DD4, - EndTruckSequence, - sub_80BCF1C, - PerStepCallback_806A07C -}; - -void Task_RunPerStepCallback(u8 taskId) -{ - int idx = gTasks[taskId].data[0]; - gUnknown_08376364[idx](taskId); -} - -#define tState data[0] -#define tAmbientCryState data[1] -#define tAmbientCryDelay data[2] - -static void RunTimeBasedEvents(s16 *data) -{ - switch (tState) - { - case 0: - if (gMain.vblankCounter1 & 0x1000) - { - DoTimeBasedEvents(); - tState++; - } - break; - case 1: - if (!(gMain.vblankCounter1 & 0x1000)) - { - tState--; - } - break; - } -} - -void Task_RunTimeBasedEvents(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (!ScriptContext2_IsEnabled()) - { - RunTimeBasedEvents(data); - UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay); - } -} - -#undef tState -#undef tAmbientCryState -#undef tAmbientCryDelay - -void Task_MuddySlope(u8); - -void SetUpFieldTasks(void) -{ - if (!FuncIsActiveTask(Task_RunPerStepCallback)) - { - u8 taskId = CreateTask(Task_RunPerStepCallback, 0x50); - gTasks[taskId].data[0] = 0; - } - if (!FuncIsActiveTask(Task_MuddySlope)) - { - CreateTask(Task_MuddySlope, 0x50); - } - if (!FuncIsActiveTask(Task_RunTimeBasedEvents)) - { - CreateTask(Task_RunTimeBasedEvents, 0x50); - } -} - -void ActivatePerStepCallback(u8 callback) -{ - s16 *dataPointer; - s16 *dataStart; - s16 zero; - u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) - { - dataStart = gTasks[taskId].data; - zero = 0; - dataPointer = &dataStart[15]; - do - { - *dataPointer-- = zero; - } while ((int)dataPointer >= (int)dataStart); - if (callback >= ARRAY_COUNT(gUnknown_08376364)) - { - *dataStart = 0; - } - else - { - *dataStart = callback; - } - } -} - -void ResetFieldTasksArgs(void) -{ - u8 taskId; - s16 *taskData; - taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) - { - taskData = gTasks[taskId].data; - } - taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); - if (taskId != 0xff) - { - taskData = gTasks[taskId].data; - taskData[1] = 0; - taskData[2] = 0; - } -} - -const struct MetatileOffset gUnknown_08376384[][2] = { - {{ 0, 0,0x259}, { 0, 1,0x261}}, - {{ 0, -1,0x259}, { 0, 0,0x261}}, - {{ 0, 0,0x252}, { 1, 0,0x253}}, - {{ -1, 0,0x252}, { 0, 0,0x253}} -}; - -const struct MetatileOffset gUnknown_083763A4[][2] = { - {{ 0, 0,0x25A}, { 0, 1,0x262}}, - {{ 0, -1,0x25A}, { 0, 0,0x262}}, - {{ 0, 0,0x254}, { 1, 0,0x255}}, - {{ -1, 0,0x254}, { 0, 0,0x255}} -}; - -const struct MetatileOffset gUnknown_083763C4[][2] = { - {{ 0, 0,0x258}, { 0, 1,0x260}}, - {{ 0, -1,0x258}, { 0, 0,0x260}}, - {{ 0, 0,0x250}, { 1, 0,0x251}}, - {{ -1, 0,0x250}, { 0, 0,0x251}} -}; - -void DummyPerStepCallback(u8 taskId) {} - -const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8 a1) -{ - if (sub_80576A0(a1)) - { - return a0[0]; - } - else if (sub_80576B4(a1)) - { - return a0[1]; - } - else if (sub_80576C8(a1)) - { - return a0[2]; - } - else if (sub_80576DC(a1)) - { - return a0[3]; - } - else - { - return NULL; - } -} - -#ifdef NONMATCHING -void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) -{ - const struct MetatileOffset *offsetData = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y)); - const struct MetatileOffset *offsetdata2 = offsetData; - if (offsetData != NULL) - { - MapGridSetMetatileIdAt(x + offsetData[0].x, y + offsetData[0].y, offsetData[0].tileId); - if (flag) - { - CurrentMapDrawMetatileAt(x + offsetData[0].x, y + offsetData[0].y); - } - MapGridSetMetatileIdAt(x + offsetdata2[1].x, y + offsetdata2[1].y, offsetdata2[1].tileId); - if (flag) - { - CurrentMapDrawMetatileAt(x + offsetdata2[1].x, y + offsetdata2[1].y); - } - } -} -#else -__attribute__((naked)) -void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tadds r5, r0, 0\n" - "\tmov r8, r3\n" - "\tlsls r1, 16\n" - "\tasrs r6, r1, 16\n" - "\tlsls r2, 16\n" - "\tasrs r7, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tadds r1, r7, 0\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tadds r1, r0, 0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tadds r0, r5, 0\n" - "\tbl sub_80695E0\n" - "\tadds r4, r0, 0\n" - "\tadds r5, r4, 0\n" - "\tcmp r4, 0\n" - "\tbeq _080696B6\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r4, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x1\n" - "\tldrsb r1, [r4, r1]\n" - "\tadds r1, r7, r1\n" - "\tldrh r2, [r4, 0x2]\n" - "\tbl MapGridSetMetatileIdAt\n" - "\tmov r0, r8\n" - "\tcmp r0, 0\n" - "\tbeq _0806968E\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r4, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x1\n" - "\tldrsb r1, [r4, r1]\n" - "\tadds r1, r7, r1\n" - "\tbl CurrentMapDrawMetatileAt\n" - "_0806968E:\n" - "\tmovs r0, 0x4\n" - "\tldrsb r0, [r5, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x5\n" - "\tldrsb r1, [r5, r1]\n" - "\tadds r1, r7, r1\n" - "\tldrh r2, [r5, 0x6]\n" - "\tbl MapGridSetMetatileIdAt\n" - "\tmov r0, r8\n" - "\tcmp r0, 0\n" - "\tbeq _080696B6\n" - "\tmovs r0, 0x4\n" - "\tldrsb r0, [r5, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x5\n" - "\tldrsb r1, [r5, r1]\n" - "\tadds r1, r7, r1\n" - "\tbl CurrentMapDrawMetatileAt\n" - "_080696B6:\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif - -void sub_80696C0(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_08376384, x, y, flag); -} - -void sub_80696E4(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_083763A4, x, y, flag); -} - -void sub_8069708(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_083763C4, x, y, flag); -} - -bool32 sub_806972C(s16 x1, s16 y1, s16 x2, s16 y2) -{ - s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x2, y2); - if (sub_80576A0(metatileBehavior)) - { - if (y1 > y2) - { - return FALSE; - } - } - else if (sub_80576B4(metatileBehavior)) - { - if (y1 < y2) - { - return FALSE; - } - } - else if (sub_80576C8(metatileBehavior)) - { - if (x1 > x2) - { - return FALSE; - } - } - else if (sub_80576DC(metatileBehavior)) - { - if (x1 < x2) - { - return FALSE; - } - } - return TRUE; -} - -bool32 sub_80697C8(s16 x1, s16 y1, s16 x2, s16 y2) -{ - s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x1, y1); - if (sub_80576A0(metatileBehavior)) - { - if (y1 < y2) - { - return FALSE; - } - } - else if (sub_80576B4(metatileBehavior)) - { - if (y1 > y2) - { - return FALSE; - } - } - else if (sub_80576C8(metatileBehavior)) - { - if (x1 < x2) - { - return FALSE; - } - } - else if (sub_80576DC(metatileBehavior)) - { - if (x1 > x2) - { - return FALSE; - } - } - return TRUE; -} - -void PerStepCallback_8069864(u8 taskId) -{ - s16 *data; - s16 x, y; - data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - switch (data[1]) - { - case 0: - data[2] = x; - data[3] = y; - sub_80696E4(x, y, TRUE); - data[1] = 1; - break; - case 1: - if (x != data[2] || y != data[3]) - { - if (sub_806972C(x, y, data[2], data[3])) - { - sub_80696C0(data[2], data[3], TRUE); - sub_8069708(data[2], data[3], FALSE); - data[4] = data[2]; - data[5] = data[3]; - data[1] = 2; - data[6] = 8; - } - else - { - data[4] = -1; - data[5] = -1; - } - if (sub_80697C8(x, y, data[2], data[3])) - { - sub_80696C0(x, y, TRUE); - data[1] = 2; - data[6] = 8; - } - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsPacifidlogLog(MapGridGetMetatileBehaviorAt(x, y))) - { - PlaySE(SE_MIZU); - } - } - break; - case 2: - if ((--data[6]) == 0) - { - sub_80696E4(x, y, TRUE); - if (data[4] != -1 && data[5] != -1) - { - sub_8069708(data[4], data[5], TRUE); - } - data[1] = 1; - } - break; - } -} - -void sub_80699D8(s16 x, s16 y) -{ - u8 z = PlayerGetZCoord(); - if (!(z & 0x01)) - { - switch (MapGridGetMetatileIdAt(x, y)) - { - case 0x24e: - MapGridSetMetatileIdAt(x, y, 0x24f); - break; - case 0x256: - MapGridSetMetatileIdAt(x, y, 0x257); - break; - } - } -} - -void sub_8069A3C(s16 x, s16 y) -{ - u8 z = PlayerGetZCoord(); - if (!(z & 0x01)) - { - switch (MapGridGetMetatileIdAt(x, y)) - { - case 0x24f: - MapGridSetMetatileIdAt(x, y, 0x24e); - break; - case 0x257: - MapGridSetMetatileIdAt(x, y, 0x256); - break; - } - } -} - -void PerStepCallback_8069AA0(u8 taskId) -{ - bool8 isFortreeBridgeCur; - bool8 isFortreeBridgePrev; - u8 z, flag; - s16 x, y, x2, y2; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - switch (data[1]) - { - default: - break; - case 0: - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y))) - { - sub_80699D8(x, y); - CurrentMapDrawMetatileAt(x, y); - } - data[1] = 1; - break; - case 1: - x2 = data[2]; - y2 = data[3]; - if (x == x2 && y == y2) - { - break; - } - isFortreeBridgeCur = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y)); - isFortreeBridgePrev = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x2, y2)); - z = PlayerGetZCoord(); - flag = 0; - if ((u8)(z & 1) == 0) - { - flag = 1; - } - if (flag && (isFortreeBridgeCur == 1 || isFortreeBridgePrev == 1)) - { - PlaySE(SE_HASHI); - } - if (isFortreeBridgePrev) - { - sub_8069A3C(x2, y2); - CurrentMapDrawMetatileAt(x2, y2); - sub_80699D8(x, y); - CurrentMapDrawMetatileAt(x, y); - } - data[4] = x2; - data[5] = y2; - data[2] = x; - data[3] = y; - if (!isFortreeBridgePrev) - { - break; - } - data[6] = 16; - data[1] = 2; - // fallthrough - case 2: - data[6]--; - x2 = data[4]; - y2 = data[5]; - switch (data[6] % 7) - { - case 0: - CurrentMapDrawMetatileAt(x2, y2); - case 1: - case 2: - case 3: - break; - case 4: - sub_80699D8(x2, y2); - CurrentMapDrawMetatileAt(x2, y2); - sub_8069A3C(x2, y2); - case 5: - case 6: - case 7: - break; - } - if (data[6] == 0) - { - data[1] = 1; - } - break; - } -} - -const u16 gUnknown_083763E4[] = { - 0, - 0, - 0, - 0, - 0, - 0, - VAR_TEMP_1, - VAR_TEMP_2, - VAR_TEMP_3, - VAR_TEMP_4, - 0, - 0, - VAR_TEMP_5, - VAR_TEMP_6, - VAR_TEMP_7, - 0, - 0, - VAR_TEMP_8, - VAR_TEMP_9, - VAR_TEMP_A, - 0, - 0, - 0, - 0, - 0, - 0 -}; - -bool32 sub_8069CB8(s16 x, s16 y) -{ - if ((u16)(x - 3) < 11 && (u16)(y - 6) < 14 && gUnknown_083763E4[y]) - { - return TRUE; - } - return FALSE; -} - -void sub_8069CFC(s16 x, s16 y) -{ - if (sub_8069CB8(x, y)) - { - *GetVarPointer(gUnknown_083763E4[y]) |= (1 << (x - 3)); - } -} - -bool32 sub_8069D34(s16 x, s16 y) -{ - u32 var; - if (!sub_8069CB8(x, y)) - { - return FALSE; - } - var = VarGet(gUnknown_083763E4[y]) << 16; - if (((1 << 16) << (x - 3)) & var) - { - return TRUE; - } - return FALSE; -} - -void SetSootopolisGymCrackedIceMetatiles(void) -{ - s32 x, y; - s32 width = gMapHeader.mapData->width; - s32 height = gMapHeader.mapData->height; - for (x = 0; x < width; x++) - { - for (y = 0; y < height; y++) - { - if (sub_8069D34(x, y) == TRUE) - { - MapGridSetMetatileIdAt(x + 7, y + 7, 0x20e); - } - } - } -} - -void PerStepCallback_8069DD4(u8 taskId) -{ - s16 x, y; - u16 tileBehavior; - u16 *var; - s16 *data = gTasks[taskId].data; - switch (data[1]) - { - case 0: - PlayerGetDestCoords(&x, &y); - data[2] = x; - data[3] = y; - data[1] = 1; - break; - case 1: - PlayerGetDestCoords(&x, &y); - if (x != data[2] || y != data[3]) - { - data[2] = x; - data[3] = y; - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - var = GetVarPointer(VAR_ICE_STEP_COUNT); - if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE) - { - (*var)++; - data[6] = 4; - data[1] = 2; - data[4] = x; - data[5] = y; - } - else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE) - { - *var = 0; - data[6] = 4; - data[1] = 3; - data[4] = x; - data[5] = y; - } - } - break; - case 2: - if (data[6] != 0) - { - data[6]--; - } - else - { - x = data[4]; - y = data[5]; - PlaySE(SE_RU_BARI); - MapGridSetMetatileIdAt(x, y, 0x20e); - CurrentMapDrawMetatileAt(x, y); - sub_8069CFC(x - 7, y - 7); - data[1] = 1; - } - break; - case 3: - if (data[6] != 0) - { - data[6]--; - } - else - { - x = data[4]; - y = data[5]; - PlaySE(SE_RU_GASYAN); - MapGridSetMetatileIdAt(x, y, 0x206); - CurrentMapDrawMetatileAt(x, y); - data[1] = 1; - } - break; - } -} - -void PerStepCallback_8069F64(u8 taskId) -{ - s16 x, y; - u16 *var; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - if (x != data[1] || y != data[2]) - { - data[1] = x; - data[2] = y; - if (MetatileBehavior_IsAshGrass(MapGridGetMetatileBehaviorAt(x, y))) - { - if (MapGridGetMetatileIdAt(x, y) == 0x20a) - { - ash(x, y, 0x212, 4); - } - else - { - ash(x, y, 0x206, 4); - } - if (CheckBagHasItem(ITEM_SOOT_SACK, 1)) - { - var = GetVarPointer(VAR_ASH_GATHER_COUNT); - if (*var < 9999) - { - (*var)++; - } - } - } - } -} - -void sub_806A040(s16 x, s16 y) -{ - MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == 0x22f ? 0x206 : 0x237); - CurrentMapDrawMetatileAt(x, y); -} - -void PerStepCallback_806A07C(u8 taskId) -{ - s16 x, y; - u16 behavior; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - behavior = MapGridGetMetatileBehaviorAt(x, y); - if (data[4] != 0 && (--data[4]) == 0) - { - sub_806A040(data[5], data[6]); - } - if (data[7] != 0 && (--data[7]) == 0) - { - sub_806A040(data[8], data[9]); - } - if (MetatileBehavior_IsCrackedFloorHole(behavior)) - { - VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty - } - if ((x != data[2] || y != data[3])) - { - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsCrackedFloor(behavior)) - { - if (GetPlayerSpeed() != 4) - { - VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty - } - if (data[4] == 0) - { - data[4] = 3; - data[5] = x; - data[6] = y; - } - else if (data[7] == 0) - { - data[7] = 3; - data[8] = x; - data[9] = y; - } - } - } -} - -const u16 gUnknown_08376418[] = {0xe8, 0xeb, 0xea, 0xe9}; - -void sub_806A18C(s16 *data, s16 x, s16 y) -{ - u16 tile; - if ((--data[0]) == 0) - { - tile = 0xe8; - } - else - { - tile = gUnknown_08376418[data[0] / 8]; - } - MapGridSetMetatileIdAt(x, y, tile); - CurrentMapDrawMetatileAt(x, y); - MapGridSetMetatileIdAt(x, y, 0xe8); -} - -void Task_MuddySlope(u8 taskId) -{ - s16 x, y, x2, y2; - int i; - u16 mapIndices; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - mapIndices = (gSaveBlock1.location.mapGroup << 8) | gSaveBlock1.location.mapNum; - switch (data[1]) - { - case 0: - data[0] = mapIndices; - data[2] = x; - data[3] = y; - data[1] = 1; - data[4] = 0; - data[7] = 0; - data[10] = 0; - data[13] = 0; - break; - case 1: - if (data[2] != x || data[3] != y) - { - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsMuddySlope(MapGridGetMetatileBehaviorAt(x, y))) - { - for (i=4; i<14; i+=3) - { - if (data[i] == 0) - { - data[i] = 32; - data[i + 1] = x; - data[i + 2] = y; - break; - } - } - } - } - break; - } - if (gCamera.field_0 && mapIndices != data[0]) - { - data[0] = mapIndices; - x2 = gCamera.x; - y2 = gCamera.y; - } - else - { - x2 = 0; - y2 = 0; - } - for (i=4; i<14; i+=3) - { - if (data[i]) - { - data[i + 1] -= x2; - data[i + 2] -= y2; - sub_806A18C(&data[i], data[i + 1], data[i + 2]); - } - } -} diff --git a/src/field/field_weather.c b/src/field/field_weather.c deleted file mode 100644 index 5857145ef..000000000 --- a/src/field/field_weather.c +++ /dev/null @@ -1,1310 +0,0 @@ -#include "global.h" -#include "constants/songs.h" -#include "constants/weather.h" -#include "blend_palette.h" -#include "event_object_movement.h" -#include "field_weather.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "random.h" -#include "script.h" -#include "start_menu.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "ewram.h" - -#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) - -enum -{ - GAMMA_NONE, - GAMMA_NORMAL, - GAMMA_ALT, -}; - -struct RGBColor -{ - u16 r:5; - u16 g:5; - u16 b:5; -}; - -struct WeatherPaletteData -{ - u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes. -}; - -struct WeatherCallbacks -{ - void (*initVars)(void); - void (*main)(void); - void (*initAll)(void); - bool8 (*finish)(void); -}; - -EWRAM_DATA struct Weather gWeather = {0}; -EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0}; -EWRAM_DATA u16 gUnknown_0202FF58 = 0; - -static const u8 *sPaletteGammaTypes; - -const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz"); -const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz"); -const u8 DroughtPaletteData_2[] = INCBIN_U8("graphics/weather/drought2.bin.lz"); -const u8 DroughtPaletteData_3[] = INCBIN_U8("graphics/weather/drought3.bin.lz"); -const u8 DroughtPaletteData_4[] = INCBIN_U8("graphics/weather/drought4.bin.lz"); -const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz"); - -static const u8 *const sCompressedDroughtPalettes[] = -{ - DroughtPaletteData_0, - DroughtPaletteData_1, - DroughtPaletteData_2, - DroughtPaletteData_3, - DroughtPaletteData_4, - DroughtPaletteData_5, - (u8*)eDroughtPaletteData.gammaShiftColors, -}; - -// This is a pointer to gWeather. All code in this file accesses gWeather directly, -// while code in other field weather files accesses gWeather through this pointer. -// This is likely the result of compiler optimization, since using the pointer in -// this file produces the same result as accessing gWeather directly. -struct Weather *const gWeatherPtr = &gWeather; - -static bool8 LightenSpritePaletteInFog(u8); -static void BuildGammaShiftTables(void); -static void UpdateWeatherGammaShift(void); -static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex); -static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor); -static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor); -static void ApplyFogBlend(u8 blendCoeff, u16 blendColor); -static bool8 FadeInScreen_RainShowShade(void); -static bool8 FadeInScreen_Drought(void); -static bool8 FadeInScreen_Fog1(void); -static void FadeInScreenWithWeather(void); -static void DoNothing(void); -void None_Init(void); -void None_Main(void); -bool8 None_Finish(void); -void Clouds_InitVars(void); -void Clouds_Main(void); -void Clouds_InitAll(void); -bool8 Clouds_Finish(void); -void Weather2_InitVars(void); -void Weather2_Main(void); -void Weather2_InitAll(void); -bool8 Weather2_Finish(void); -void LightRain_InitVars(void); -void LightRain_Main(void); -void LightRain_InitAll(void); -bool8 LightRain_Finish(void); -void Snow_InitVars(void); -void Snow_Main(void); -void Snow_InitAll(void); -bool8 Snow_Finish(void); -void MedRain_InitVars(void); -void Rain_Main(void); -void MedRain_InitAll(void); -bool8 Rain_Finish(void); -void Fog1_InitVars(void); -void Fog1_Main(void); -void Fog1_InitAll(void); -bool8 Fog1_Finish(void); -void Ash_InitVars(void); -void Ash_Main(void); -void Ash_InitAll(void); -bool8 Ash_Finish(void); -void Sandstorm_InitVars(void); -void Sandstorm_Main(void); -void Sandstorm_InitAll(void); -bool8 Sandstorm_Finish(void); -void Fog2_InitVars(void); -void Fog2_Main(void); -void Fog2_InitAll(void); -bool8 Fog2_Finish(void); -void Fog1_InitVars(void); -void Fog1_Main(void); -void Fog1_InitAll(void); -bool8 Fog1_Finish(void); -void Shade_InitVars(void); -void Shade_Main(void); -void Shade_InitAll(void); -bool8 Shade_Finish(void); -void Drought_InitVars(void); -void Drought_Main(void); -void Drought_InitAll(void); -bool8 Drought_Finish(void); -void HeavyRain_InitVars(void); -void Rain_Main(void); -void HeavyRain_InitAll(void); -bool8 Rain_Finish(void); -void Bubbles_InitVars(void); -void Bubbles_Main(void); -void Bubbles_InitAll(void); -bool8 Bubbles_Finish(void); - -static const struct WeatherCallbacks sWeatherFuncs[] = -{ - {None_Init, None_Main, None_Init, None_Finish}, - {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish}, - {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish}, - {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, - {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish}, - {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish}, - {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, - {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish}, - {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish}, - {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish}, - {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, - {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish}, - {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish}, - {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish}, - {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish}, -}; - -void (*const gWeatherPalStateFuncs[])(void) = -{ - UpdateWeatherGammaShift, // WEATHER_PAL_STATE_CHANGING_WEATHER - FadeInScreenWithWeather, // WEATHER_PAL_STATE_SCREEN_FADING_IN - DoNothing, // WEATHER_PAL_STATE_SCREEN_FADING_OUT - DoNothing, // WEATHER_PAL_STATE_IDLE -}; - -// This table specifies which of the gamma shift tables should be -// applied to each of the background and sprite palettes. -static const u8 sBasePaletteGammaTypes[32] = -{ - // background palettes - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NONE, - GAMMA_NONE, - // sprite palettes - GAMMA_ALT, - GAMMA_NORMAL, - GAMMA_ALT, - GAMMA_ALT, - GAMMA_ALT, - GAMMA_ALT, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_ALT, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, - GAMMA_NORMAL, -}; - -#if DEBUG - -static const u8 sDebugText_Weather_None[] = _("なし   "); // "none" -static const u8 sDebugText_Weather_Clear[] = _("はれ   "); // "clear" -static const u8 sDebugText_Weather_Clear2[] = _("はれ2  "); // "clear2" -static const u8 sDebugText_Weather_Rain[] = _("あめ   "); // "rain" -static const u8 sDebugText_Weather_Snow[] = _("ゆき   "); // "snow" -static const u8 sDebugText_Weather_Lightning[] = _("かみなり "); // "lightning" -static const u8 sDebugText_Weather_Fog[] = _("きり   "); // "fog" -static const u8 sDebugText_Weather_VolcanicAsh[] = _("かざんばい"); // "volcanic ash" -static const u8 sDebugText_Weather_Sandstorm[] = _("すなあらし"); // "sandstorm -static const u8 sDebugText_Weather_Fog2[] = _("きり2  "); // "fog2" -static const u8 sDebugText_Weather_Underwater[] = _("かいてい "); // "undersea" -static const u8 sDebugText_Weather_Cloudy[] = _("くもり  "); // "cloudy" -static const u8 sDebugText_Weather_Clear3[] = _("はれ3  "); // "clear3" -static const u8 sDebugText_Weather_HeavyRain[] = _("おおあめ"); // "heavy rain" -static const u8 sDebugText_Weather_Underwater2[] = _("かいてい2"); // "undersea2" - -static const u8 *const sDebugText_Weather[] = -{ - [WEATHER_NONE] = sDebugText_Weather_None, - [WEATHER_CLOUDS] = sDebugText_Weather_Clear, - [WEATHER_SUNNY] = sDebugText_Weather_Clear2, - [WEATHER_RAIN_LIGHT] = sDebugText_Weather_Rain, - [WEATHER_SNOW] = sDebugText_Weather_Snow, - [WEATHER_RAIN_MED] = sDebugText_Weather_Lightning, - [WEATHER_FOG_1] = sDebugText_Weather_Fog, - [WEATHER_ASH] = sDebugText_Weather_VolcanicAsh, - [WEATHER_SANDSTORM] = sDebugText_Weather_Sandstorm, - [WEATHER_FOG_2] = sDebugText_Weather_Fog2, - [WEATHER_FOG_3] = sDebugText_Weather_Underwater, - [WEATHER_SHADE] = sDebugText_Weather_Cloudy, - [WEATHER_DROUGHT] = sDebugText_Weather_Clear3, - [WEATHER_RAIN_HEAVY] = sDebugText_Weather_HeavyRain, - [WEATHER_BUBBLES] = sDebugText_Weather_Underwater2, -}; - -#endif - -const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); - -void StartWeather(void) -{ - u8 index; - - if (!FuncIsActiveTask(Task_WeatherMain)) - { - index = AllocSpritePalette(0x1200); - CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); - BuildGammaShiftTables(); - gWeatherPtr->altGammaSpritePalIndex = index; - gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(0x1201); - gWeatherPtr->rainSpriteCount = 0; - gWeatherPtr->unknown_6D8 = 0; - gWeatherPtr->cloudSpritesCreated = 0; - gWeatherPtr->snowflakeSpriteCount = 0; - gWeatherPtr->ashSpritesCreated = 0; - gWeatherPtr->fog1SpritesCreated = 0; - gWeatherPtr->fog2SpritesCreated = 0; - gWeatherPtr->sandstormSprites1Created = 0; - gWeatherPtr->sandstormSprites2Created = 0; - gWeatherPtr->unknown_72E = 0; - gWeatherPtr->lightenedFogSpritePalsCount = 0; - Weather_SetBlendCoeffs(16, 0); - gWeatherPtr->currWeather = 0; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - gWeatherPtr->readyForInit = FALSE; - gWeatherPtr->weatherChangeComplete = TRUE; - gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80); - } -} - -void ChangeWeather(u8 weather) -{ - if (weather != WEATHER_RAIN_LIGHT && weather != WEATHER_RAIN_MED && weather != WEATHER_RAIN_HEAVY) - { - PlayRainSoundEffect(); - } - - if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather) - { - sWeatherFuncs[weather].initVars(); - } - - gWeatherPtr->weatherChangeComplete = FALSE; - gWeatherPtr->nextWeather = weather; - gWeatherPtr->finishStep = 0; -} - -void sub_807C988(u8 weather) -{ - PlayRainSoundEffect(); - gWeatherPtr->currWeather = weather; - gWeatherPtr->nextWeather = weather; -} - -void sub_807C9B4(u8 weather) -{ - PlayRainSoundEffect(); - gWeatherPtr->currWeather = weather; - gWeatherPtr->nextWeather = weather; - gWeatherPtr->readyForInit = TRUE; -} - -void Task_WeatherInit(u8 taskId) -{ - // Waits until it's ok to initialize weather. - // When the screen fades in, this is set to TRUE. - if (gWeatherPtr->readyForInit) - { - sWeatherFuncs[gWeatherPtr->currWeather].initAll(); - gTasks[taskId].func = Task_WeatherMain; - } -} - -void Task_WeatherMain(u8 taskId) -{ - if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather) - { - if (!sWeatherFuncs[gWeatherPtr->currWeather].finish()) - { - // Finished cleaning up previous weather. Now transition to next weather. - sWeatherFuncs[gWeatherPtr->nextWeather].initVars(); - gWeatherPtr->gammaStepFrameCounter = 0; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; - gWeatherPtr->currWeather = gWeatherPtr->nextWeather; - gWeatherPtr->weatherChangeComplete = TRUE; - } - } - else - { - sWeatherFuncs[gWeatherPtr->currWeather].main(); - } - - gWeatherPalStateFuncs[gWeatherPtr->palProcessingState](); -} - -void None_Init(void) -{ - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 0; -} - -void None_Main(void) -{ -} - -u8 None_Finish(void) -{ - return 0; -} - -// Builds two tables that contain gamma shifts for palette colors. -// It's unclear why the two tables aren't declared as const arrays, since -// this function always builds the same two tables. -static void BuildGammaShiftTables(void) -{ - u16 v0; - u8 (*v1)[32]; - u16 v2; - u16 v4; - u16 v5; - u16 v6; - u16 v9; - u32 v10; - u16 v11; - s16 dunno; - - sPaletteGammaTypes = sBasePaletteGammaTypes; - for (v0 = 0; v0 <= 1; v0++) - { - if (v0 == 0) - v1 = gWeatherPtr->gammaShifts; - else - v1 = gWeatherPtr->altGammaShifts; - - for (v2 = 0; v2 < 32; v2++) - { - v4 = v2 << 8; - if (v0 == 0) - v5 = (v2 << 8) / 16; - else - v5 = 0; - for (v6 = 0; v6 <= 2; v6++) - { - v4 = (v4 - v5); - v1[v6][v2] = v4 >> 8; - } - v9 = v4; - v10 = 0x1f00 - v4; - if ((0x1f00 - v4) < 0) - { - v10 += 0xf; - } - v11 = v10 >> 4; - if (v2 < 12) - { - for (; v6 < 19; v6++) - { - v4 += v11; - dunno = v4 - v9; - if (dunno > 0) - v4 -= (dunno + ((u16)dunno >> 15)) >> 1; - v1[v6][v2] = v4 >> 8; - if (v1[v6][v2] > 0x1f) - v1[v6][v2] = 0x1f; - } - } - else - { - for (; v6 < 19; v6++) - { - v4 += v11; - v1[v6][v2] = v4 >> 8; - if (v1[v6][v2] > 0x1f) - v1[v6][v2] = 0x1f; - } - } - } - } -} - -// When the weather is changing, it gradually updates the palettes -// towards the desired gamma shift. -static void UpdateWeatherGammaShift(void) -{ - if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) - { - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - else - { - if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay) - { - gWeatherPtr->gammaStepFrameCounter = 0; - if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex) - gWeatherPtr->gammaIndex++; - else - gWeatherPtr->gammaIndex--; - - ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex); - } - } -} - -static void FadeInScreenWithWeather(void) -{ - if (++gWeatherPtr->unknown_6CB > 1) - gWeatherPtr->unknown_6CA = 0; - - switch (gWeatherPtr->currWeather) - { - case WEATHER_RAIN_LIGHT: - case WEATHER_RAIN_MED: - case WEATHER_RAIN_HEAVY: - case WEATHER_SNOW: - case WEATHER_SHADE: - if (FadeInScreen_RainShowShade() == FALSE) - { - gWeatherPtr->gammaIndex = 3; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - break; - case WEATHER_DROUGHT: - if (FadeInScreen_Drought() == FALSE) - { - gWeatherPtr->gammaIndex = -6; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - break; - case WEATHER_FOG_1: - if (FadeInScreen_Fog1() == FALSE) - { - gWeatherPtr->gammaIndex = 0; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - break; - case WEATHER_ASH: - case WEATHER_SANDSTORM: - case WEATHER_FOG_2: - case WEATHER_FOG_3: - default: - if (!gPaletteFade.active) - { - gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex; - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; - } - break; - } -} - -bool8 FadeInScreen_RainShowShade(void) -{ - if (gWeatherPtr->fadeScreenCounter == 16) - return FALSE; - - if (++gWeatherPtr->fadeScreenCounter >= 16) - { - ApplyGammaShift(0, 32, 3); - gWeatherPtr->fadeScreenCounter = 16; - return FALSE; - } - - ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); - return TRUE; -} - -bool8 FadeInScreen_Drought(void) -{ - if (gWeatherPtr->fadeScreenCounter == 16) - return FALSE; - - if (++gWeatherPtr->fadeScreenCounter >= 16) - { - ApplyGammaShift(0, 32, -6); - gWeatherPtr->fadeScreenCounter = 16; - return FALSE; - } - - ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); - return TRUE; -} - -bool8 FadeInScreen_Fog1(void) -{ - if (gWeatherPtr->fadeScreenCounter == 16) - return FALSE; - - gWeatherPtr->fadeScreenCounter++; - ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); - return TRUE; -} - -static void DoNothing(void) -{ } - -static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) -{ - u16 curPalIndex; - u16 palOffset; - u8 *gammaTable; - u16 i; - - if (gammaIndex > 0) - { - gammaIndex--; - palOffset = startPalIndex * 16; - numPalettes += startPalIndex; - curPalIndex = startPalIndex; - - // Loop through the speficied palette range and apply necessary gamma shifts to the colors. - while (curPalIndex < numPalettes) - { - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) - { - // No palette change. - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); - palOffset += 16; - } - else - { - u8 r, g, b; - - if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex) - gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; - else - gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; - - if (curPalIndex == 16 || curPalIndex > 27) - { - for (i = 0; i < 16; i++) - { - if (gPlttBufferUnfaded[palOffset] == RGB(31, 12, 11)) - { - // Skip gamma shift for this specific color. (Why?) - palOffset++; - } - else - { - // Apply gamma shift to the original color. - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - r = gammaTable[baseColor.r]; - g = gammaTable[baseColor.g]; - b = gammaTable[baseColor.b]; - gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; - } - } - } - else - { - for (i = 0; i < 16; i++) - { - // Apply gamma shift to the original color. - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - r = gammaTable[baseColor.r]; - g = gammaTable[baseColor.g]; - b = gammaTable[baseColor.b]; - gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; - } - } - } - - curPalIndex++; - } - } - else if (gammaIndex < 0) - { - // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables. - gammaIndex = -gammaIndex - 1; - palOffset = startPalIndex * 16; - numPalettes += startPalIndex; - curPalIndex = startPalIndex; - - while (curPalIndex < numPalettes) - { - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) - { - // No palette change. - CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); - palOffset += 16; - } - else - { - if (curPalIndex == 16 || curPalIndex > 27) - { - for (i = 0; i < 16; i++) - { - // Skip gamma shift for this specific color. (Why?) - if (gPlttBufferUnfaded[palOffset] != RGB(31, 12, 11)) - gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; - - palOffset++; - } - } - else - { - for (i = 0; i < 16; i++) - { - gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; - palOffset++; - } - } - } - - curPalIndex++; - } - } - else - { - // No palette blending. - CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); - } -} - -static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) -{ - u16 palOffset; - u16 curPalIndex; - u16 i; - struct RGBColor color = *(struct RGBColor *)&blendColor; - u8 rBlend = color.r; - u8 gBlend = color.g; - u8 bBlend = color.b; - - palOffset = startPalIndex * 16; - numPalettes += startPalIndex; - gammaIndex--; - curPalIndex = startPalIndex; - - while (curPalIndex < numPalettes) - { - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) - { - // No gamma shift. Simply blend the colors. - BlendPalette(palOffset, 16, blendCoeff, blendColor); - palOffset += 16; - } - else - { - u8 *gammaTable; - - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL) - gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; - else - gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; - - for (i = 0; i < 16; i++) - { - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - u8 r = gammaTable[baseColor.r]; - u8 g = gammaTable[baseColor.g]; - u8 b = gammaTable[baseColor.b]; - - // Apply gamma shift and target blend color to the original color. - r += ((rBlend - r) * blendCoeff) >> 4; - g += ((gBlend - g) * blendCoeff) >> 4; - b += ((bBlend - b) * blendCoeff) >> 4; - gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; - } - } - - curPalIndex++; - } -} - -void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor) -{ - struct RGBColor color; - u8 rBlend; - u8 gBlend; - u8 bBlend; - u16 curPalIndex; - u16 palOffset; - u16 i; - - gammaIndex = -gammaIndex - 1; - color = *(struct RGBColor *)&blendColor; - rBlend = color.r; - gBlend = color.g; - bBlend = color.b; - palOffset = 0; - for (curPalIndex = 0; curPalIndex < 32; curPalIndex++) - { - if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) - { - // No gamma shift. Simply blend the colors. - BlendPalette(palOffset, 16, blendCoeff, blendColor); - palOffset += 16; - } - else - { - for (i = 0; i < 16; i++) - { - u32 offset; - struct RGBColor color1; - struct RGBColor color2; - u8 r1, g1, b1; - u8 r2, g2, b2; - - color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - r1 = color1.r; - g1 = color1.g; - b1 = color1.b; - - offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1); - color2 = *(struct RGBColor *)&eDroughtPaletteData.gammaShiftColors[gammaIndex][offset]; - r2 = color2.r; - g2 = color2.g; - b2 = color2.b; - - r2 += ((rBlend - r2) * blendCoeff) >> 4; - g2 += ((gBlend - g2) * blendCoeff) >> 4; - b2 += ((bBlend - b2) * blendCoeff) >> 4; - - gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2; - } - } - } -} - -void ApplyFogBlend(u8 blendCoeff, u16 blendColor) -{ - struct RGBColor color; - u8 rBlend; - u8 gBlend; - u8 bBlend; - u16 curPalIndex; - - BlendPalette(0, 0x100, blendCoeff, blendColor); - color = *(struct RGBColor *)&blendColor; - rBlend = color.r; - gBlend = color.g; - bBlend = color.b; - - for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) - { - if (LightenSpritePaletteInFog(curPalIndex)) - { - u16 palEnd = (curPalIndex + 1) * 16; - u16 palOffset = curPalIndex * 16; - - while (palOffset < palEnd) - { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - u8 r = color.r; - u8 g = color.g; - u8 b = color.b; - - r += ((28 - r) * 3) >> 2; - g += ((31 - g) * 3) >> 2; - b += ((28 - b) * 3) >> 2; - - r += ((rBlend - r) * blendCoeff) >> 4; - g += ((gBlend - g) * blendCoeff) >> 4; - b += ((bBlend - b) * blendCoeff) >> 4; - - gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; - palOffset++; - } - } - else - { - BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor); - } - } -} - -static void MarkFogSpritePalToLighten(u8 paletteIndex) -{ - if (gWeatherPtr->lightenedFogSpritePalsCount < 6) - { - gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex; - gWeatherPtr->lightenedFogSpritePalsCount++; - } -} - -static bool8 LightenSpritePaletteInFog(u8 paletteIndex) -{ - u16 i; - - for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) - { - if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) - return TRUE; - } - - return FALSE; -} - -void sub_807D5BC(s8 gammaIndex) -{ - if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) - { - ApplyGammaShift(0, 32, gammaIndex); - gWeatherPtr->gammaIndex = gammaIndex; - } -} - -void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) -{ - if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) - { - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; - gWeatherPtr->gammaIndex = gammaIndex; - gWeatherPtr->gammaTargetIndex = gammaTargetIndex; - gWeatherPtr->gammaStepFrameCounter = 0; - gWeatherPtr->gammaStepDelay = gammaStepDelay; - sub_807D5BC(gammaIndex); - } -} - -void FadeScreen(u8 mode, u8 delay) -{ - u32 fadeColor; - bool8 fadeOut; - bool8 useWeatherPal; - - switch (mode) - { - case FADE_FROM_BLACK: - fadeColor = 0; - fadeOut = FALSE; - break; - case FADE_FROM_WHITE: - fadeColor = 0xFFFF; - fadeOut = FALSE; - break; - case FADE_TO_BLACK: - fadeColor = 0; - fadeOut = TRUE; - break; - case FADE_TO_WHITE: - fadeColor = 0xFFFF; - fadeOut = TRUE; - break; - default: - return; - } - - switch (gWeatherPtr->currWeather) - { - case WEATHER_RAIN_LIGHT: - case WEATHER_RAIN_MED: - case WEATHER_RAIN_HEAVY: - case WEATHER_SNOW: - case WEATHER_FOG_1: - case WEATHER_SHADE: - case WEATHER_DROUGHT: - useWeatherPal = TRUE; - break; - default: - useWeatherPal = FALSE; - break; - } - - if (fadeOut) - { - if (useWeatherPal) - CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); - - BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; - } - else - { - gWeatherPtr->fadeDestColor = fadeColor; - if (useWeatherPal) - gWeatherPtr->fadeScreenCounter = 0; - else - BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); - - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; - gWeatherPtr->unknown_6CA = 1; - gWeatherPtr->unknown_6CB = 0; - Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); - gWeatherPtr->readyForInit = TRUE; - } -} - -bool8 IsWeatherNotFadingIn(void) -{ - return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); -} - -void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) -{ - u16 paletteIndex = 16 + spritePaletteIndex; - u16 i; - - switch (gWeatherPtr->palProcessingState) - { - case WEATHER_PAL_STATE_SCREEN_FADING_IN: - if (gWeatherPtr->unknown_6CA != 0) - { - if (gWeatherPtr->currWeather == WEATHER_FOG_1) - MarkFogSpritePalToLighten(paletteIndex); - paletteIndex *= 16; - for (i = 0; i < 16; i++) - gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; - } - break; - case WEATHER_PAL_STATE_SCREEN_FADING_OUT: - paletteIndex *= 16; - CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32); - BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); - break; - // WEATHER_PAL_STATE_CHANGING_WEATHER - // WEATHER_PAL_STATE_CHANGING_IDLE - default: - if (gWeatherPtr->currWeather != WEATHER_FOG_1) - { - ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); - } - else - { - paletteIndex *= 16; - BlendPalette(paletteIndex, 16, 12, 0x73FC); - } - break; - } -} - -void ApplyWeatherGammaShiftToPal(u8 paletteIndex) -{ - ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); -} - -u8 unref_sub_807D894(void) -{ - if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) - return gWeatherPtr->unknown_6CA; - else - return 0; -} - -void LoadCustomWeatherSpritePalette(const u16 *palette) -{ - LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); - UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); -} - -static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b) -{ - u8 gammaIndex = *gammaIndexPtr; - u16 i; - - if (gammaIndex < 7) - { - gammaIndex--; - LZ77UnCompWram(sCompressedDroughtPalettes[gammaIndex], eDroughtPaletteData.gammaShiftColors[gammaIndex]); - if (gammaIndex == 0) - { - eDroughtPaletteData.gammaShiftColors[gammaIndex][0] = RGB(1, 1, 1); - for (i = 1; i < 0x1000; i++) - eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex][i - 1]; - } - else - { - for (i = 0; i < 0x1000; i++) - eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex - 1][i]; - } - if (++(*gammaIndexPtr) == 7) - { - *gammaIndexPtr = 32; - *b = 32; - } - } -} - -void ResetDroughtWeatherPaletteLoading(void) -{ - gWeatherPtr->loadDroughtPalsIndex = 1; - gWeatherPtr->loadDroughtPalsOffset = 1; -} - -bool8 LoadDroughtWeatherPalettes(void) -{ - if (gWeatherPtr->loadDroughtPalsIndex < 32) - { - LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset); - if (gWeatherPtr->loadDroughtPalsIndex < 32) - return TRUE; - } - return FALSE; -} - -void sub_807DA04(s8 gammaIndex) -{ - sub_807D5BC(-gammaIndex - 1); -} - -void sub_807DA14(void) -{ - gWeatherPtr->unknown_73C = 0; - gWeatherPtr->unknown_740 = 0; - gWeatherPtr->unknown_742 = 0; - gWeatherPtr->unknown_73E = 0; - gUnknown_0202FF58 = 5; -} - -void sub_807DA4C(void) -{ - switch (gWeatherPtr->unknown_742) - { - case 0: - if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58) - { - gWeatherPtr->unknown_740 = 0; - sub_807DA04(gWeatherPtr->unknown_73C++); - if (gWeatherPtr->unknown_73C > 5) - { - gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; - gWeatherPtr->unknown_742 = 1; - gWeatherPtr->unknown_740 = 0x3C; - } - } - break; - case 1: - gWeatherPtr->unknown_740 = (gWeatherPtr->unknown_740 + 3) & 0x7F; - gWeatherPtr->unknown_73C = ((gSineTable[gWeatherPtr->unknown_740] - 1) >> 6) + 2; - if (gWeatherPtr->unknown_73C != gWeatherPtr->unknown_73E) - sub_807DA04(gWeatherPtr->unknown_73C); - gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; - break; - case 2: - if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58) - { - gWeatherPtr->unknown_740 = 0; - sub_807DA04(--gWeatherPtr->unknown_73C); - if (gWeatherPtr->unknown_73C == 3) - gWeatherPtr->unknown_742 = 0; - } - break; - } -} - -void Weather_SetBlendCoeffs(u8 eva, u8 evb) -{ - gWeatherPtr->currBlendEVA = eva; - gWeatherPtr->currBlendEVB = evb; - gWeatherPtr->targetBlendEVA = eva; - gWeatherPtr->targetBlendEVB = evb; - REG_BLDALPHA = BLDALPHA_BLEND(eva, evb); -} - -void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay) -{ - gWeatherPtr->targetBlendEVA = eva; - gWeatherPtr->targetBlendEVB = evb; - gWeatherPtr->blendDelay = delay; - gWeatherPtr->blendFrameCounter = 0; - gWeatherPtr->blendUpdateCounter = 0; -} - -bool8 Weather_UpdateBlend(void) -{ - if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA - && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) - return TRUE; - - if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay) - { - gWeatherPtr->blendFrameCounter = 0; - gWeatherPtr->blendUpdateCounter++; - - // Update currBlendEVA and currBlendEVB on alternate frames - if (gWeatherPtr->blendUpdateCounter & 1) - { - if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA) - gWeatherPtr->currBlendEVA++; - else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA) - gWeatherPtr->currBlendEVA--; - } - else - { - if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB) - gWeatherPtr->currBlendEVB++; - else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB) - gWeatherPtr->currBlendEVB--; - } - } - - REG_BLDALPHA = BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); - - if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA - && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) - return TRUE; - - return FALSE; -} - -void unref_sub_807DCB4(u8 a) -{ - switch (a) - { - case 1: - SetWeather(WEATHER_CLOUDS); - break; - case 2: - SetWeather(WEATHER_SUNNY); - break; - case 3: - SetWeather(WEATHER_RAIN_LIGHT); - break; - case 4: - SetWeather(WEATHER_SNOW); - break; - case 5: - SetWeather(WEATHER_RAIN_MED); - break; - case 6: - SetWeather(WEATHER_FOG_1); - break; - case 7: - SetWeather(WEATHER_FOG_2); - break; - case 8: - SetWeather(WEATHER_ASH); - break; - case 9: - SetWeather(WEATHER_SANDSTORM); - break; - case 10: - SetWeather(WEATHER_SHADE); - break; - } -} - -u8 GetCurrentWeather(void) -{ - return gWeatherPtr->currWeather; -} - -void SetRainStrengthFromSoundEffect(u16 soundEffect) -{ - if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) - { - switch (soundEffect) - { - case SE_T_KOAME: - gWeatherPtr->rainStrength = 0; - break; - case SE_T_OOAME: - gWeatherPtr->rainStrength = 1; - break; - case SE_T_AME: - gWeatherPtr->rainStrength = 2; - break; - default: - return; - } - - PlaySE(soundEffect); - } -} - -void PlayRainSoundEffect(void) -{ - if (IsSpecialSEPlaying()) - { - switch (gWeatherPtr->rainStrength) - { - case 0: - PlaySE(SE_T_KOAME_E); - break; - case 1: - PlaySE(SE_T_OOAME_E); - break; - case 2: - default: - PlaySE(SE_T_AME_E); - break; - } - } -} - -u8 IsWeatherChangeComplete(void) -{ - return gWeatherPtr->weatherChangeComplete; -} - -void SetWeatherScreenFadeOut(void) -{ - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; -} - -void unref_sub_807DE24(void) -{ - gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; -} - -void PreservePaletteInWeather(u8 preservedPalIndex) -{ - CpuCopy16(sBasePaletteGammaTypes, gFieldEffectPaletteGammaTypes, 32); - gFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE; - sPaletteGammaTypes = gFieldEffectPaletteGammaTypes; -} - -void ResetPreservedPalettesInWeather(void) -{ - sPaletteGammaTypes = sBasePaletteGammaTypes; -} - -#if DEBUG - -EWRAM_DATA static u8 sSelectedDebugWeather = 0; - -bool8 debug_sub_8085564(void) -{ - bool8 changed = FALSE; - - if (gMain.newKeys & R_BUTTON) - { - sSelectedDebugWeather++; - if (sSelectedDebugWeather == 15) - sSelectedDebugWeather = 0; - changed = TRUE; - } - if (gMain.newKeys & L_BUTTON) - { - if (sSelectedDebugWeather != 0) - sSelectedDebugWeather--; - else - sSelectedDebugWeather = 14; - changed = TRUE; - } - - if (changed) - { - Menu_BlankWindowRect(22, 1, 28, 2); - Menu_PrintText(sDebugText_Weather[sSelectedDebugWeather], 23, 1); - } - - if (gMain.newKeys & A_BUTTON) - { - ChangeWeather(sSelectedDebugWeather); - CloseMenu(); - return TRUE; - } - - return FALSE; -} - -bool8 debug_sub_808560C(void) -{ - sSelectedDebugWeather = gWeather.currWeather; - Menu_EraseScreen(); - Menu_BlankWindowRect(22, 1, 28, 2); - Menu_PrintText(sDebugText_Weather[sSelectedDebugWeather], 23, 1); - gMenuCallback = debug_sub_8085564; - return FALSE; -} - -#endif diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c deleted file mode 100644 index 386925531..000000000 --- a/src/field/field_weather_effects.c +++ /dev/null @@ -1,2381 +0,0 @@ -#include "global.h" -#include "event_object_movement.h" -#include "field_weather.h" -#include "overworld.h" -#include "random.h" -#include "script.h" -#include "constants/weather.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" - -extern struct Weather *const gWeatherPtr; - -const u16 gUnknown_08397108[] = INCBIN_U16("graphics/weather/1.gbapal"); -const u16 gUnknown_08397128[] = INCBIN_U16("graphics/weather/2.gbapal"); -const u8 gWeatherFog2Tiles[] = INCBIN_U8("graphics/weather/fog2.4bpp"); -const u8 gWeatherFog1Tiles[] = INCBIN_U8("graphics/weather/fog1.4bpp"); -const u8 gWeatherCloudTiles[] = INCBIN_U8("graphics/weather/cloud.4bpp"); -const u8 gWeatherSnow1Tiles[] = INCBIN_U8("graphics/weather/snow0.4bpp"); -const u8 gWeatherSnow2Tiles[] = INCBIN_U8("graphics/weather/snow1.4bpp"); -const u8 gWeatherBubbleTiles[] = INCBIN_U8("graphics/weather/bubble.4bpp"); -const u8 gWeatherAshTiles[] = INCBIN_U8("graphics/weather/ash.4bpp"); -const u8 gWeatherRainTiles[] = INCBIN_U8("graphics/weather/rain.4bpp"); -const u8 gWeatherSandstormTiles[] = INCBIN_U8("graphics/weather/sandstorm.4bpp"); - -static const struct Coords16 gUnknown_0839A9C8[] = -{ - { 0, 66}, - { 5, 73}, - {10, 78}, -}; - -static const struct SpriteSheet sCloudSpriteSheet = {gWeatherCloudTiles, sizeof(gWeatherCloudTiles), 0x1200}; - -static const struct OamData gOamData_839A9DC = -{ - .y = 0, - .affineMode = 0, - .objMode = 1, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 3, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd gSpriteAnim_839A9E4[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_839A9EC[] = -{ - gSpriteAnim_839A9E4, -}; - -void sub_807E0F4(struct Sprite *); -static const struct SpriteTemplate sCloudSpriteTemplate = -{ - .tileTag = 4608, - .paletteTag = 4609, - .oam = &gOamData_839A9DC, - .anims = gSpriteAnimTable_839A9EC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807E0F4, -}; - -extern void sub_807D5BC(s8 gammaIndex); -extern void sub_807DA14(void); -extern void sub_807DA4C(void); -extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c); -extern bool8 Weather_UpdateBlend(void); -extern void SetRainStrengthFromSoundEffect(u16 sndEff); -extern void sub_807D5F0(u8 a, u8 b, u8 c); - -//------------------------------------------------------------------------------ -// Clouds -//------------------------------------------------------------------------------ - -void Clouds_InitVars(void) -{ - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 20; - gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->initStep = 0; - if (gWeatherPtr->cloudSpritesCreated == FALSE) - Weather_SetBlendCoeffs(0, 16); -} - -void Clouds_Main(void); - -void Clouds_InitAll(void) -{ - Clouds_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Clouds_Main(); -} - -void CreateCloudSprites(void); - -void Clouds_Main(void) -{ - switch (gWeatherPtr->initStep) - { - case 0: - CreateCloudSprites(); - gWeatherPtr->initStep++; - break; - case 1: - Weather_SetTargetBlendCoeffs(12, 8, 1); - gWeatherPtr->initStep++; - break; - case 2: - if (Weather_UpdateBlend()) - { - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - } - break; - } -} - -void sub_807E0A0(void); - -bool8 Clouds_Finish(void) -{ - switch (gWeatherPtr->finishStep) - { - case 0: - Weather_SetTargetBlendCoeffs(0, 16, 1); - gWeatherPtr->finishStep++; - return TRUE; - case 1: - if (Weather_UpdateBlend()) - { - sub_807E0A0(); - gWeatherPtr->finishStep++; - } - return TRUE; - } - return FALSE; -} - -//------------------------------------------------------------------------------ -// Weather 2 -//------------------------------------------------------------------------------ - -void Weather2_InitVars(void) -{ - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 20; -} - -void Weather2_InitAll(void) -{ - Weather2_InitVars(); -} - -void Weather2_Main(void) -{ -} - -int Weather2_Finish(void) -{ - return 0; -} - -void CreateCloudSprites(void) -{ - u16 i; - - if (gWeatherPtr->cloudSpritesCreated == TRUE) - return; - LoadSpriteSheet(&sCloudSpriteSheet); - LoadCustomWeatherSpritePalette(gUnknown_08397108); - for (i = 0; i < 3; i++) - { - u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF); - - if (spriteId != 64) - { - struct Sprite *sprite; - - gWeatherPtr->sprites.s1.cloudSprites[i] = &gSprites[spriteId]; - sprite = gWeatherPtr->sprites.s1.cloudSprites[i]; - sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y); - sprite->coordOffsetEnabled = TRUE; - } - else - { - gWeatherPtr->sprites.s1.cloudSprites[i] = NULL; - } - } - gWeatherPtr->cloudSpritesCreated = TRUE; -} - -void sub_807E0A0(void) -{ - u16 i; - - if (gWeatherPtr->cloudSpritesCreated == FALSE) - return; - for (i = 0; i < 3; i++) - { - if (gWeatherPtr->sprites.s1.cloudSprites[i] != NULL) - DestroySprite(gWeatherPtr->sprites.s1.cloudSprites[i]); - } - FreeSpriteTilesByTag(0x1200); - gWeatherPtr->cloudSpritesCreated = FALSE; -} - -void sub_807E0F4(struct Sprite *sprite) -{ - sprite->data[0] = (sprite->data[0] + 1) & 1; - if (sprite->data[0] != 0) - sprite->pos1.x--; -} - -//------------------------------------------------------------------------------ -// Drought -//------------------------------------------------------------------------------ - -void Drought_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 0; -} - -void Drought_Main(void); - -void Drought_InitAll(void) -{ - Drought_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Drought_Main(); -} - -void Drought_Main(void) -{ - switch (gWeatherPtr->initStep) - { - case 0: - if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) - gWeatherPtr->initStep++; - break; - case 1: - ResetDroughtWeatherPaletteLoading(); - gWeatherPtr->initStep++; - break; - case 2: - if (LoadDroughtWeatherPalettes() == FALSE) - gWeatherPtr->initStep++; - break; - case 3: - sub_807DA14(); - gWeatherPtr->initStep++; - break; - case 4: - sub_807DA4C(); - if (gWeatherPtr->unknown_73C == 6) - { - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - } - break; - default: - sub_807DA4C(); - break; - } -} - -int Drought_Finish(void) -{ - return 0; -} - -void task50_0807B6D4(u8); - -void sub_807E25C(void) -{ - CreateTask(task50_0807B6D4, 0x50); -} - -#define tState data[0] -#define tBlendY data[1] -#define tBlendDelay data[2] -#define tWinRange data[3] - -void task50_0807B6D4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->tState) - { - case 0: - task->tBlendY = 0; - task->tBlendDelay = 0; - task->tWinRange = REG_WININ; - REG_WININ = WIN_RANGE(63, 63); - REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ - | BLDCNT_EFFECT_LIGHTEN; - REG_BLDY = 0; - task->tState++; - // fall through - case 1: - task->tBlendY += 3; - if (task->tBlendY > 16) - task->tBlendY = 16; - REG_BLDY = task->tBlendY; - if (task->tBlendY >= 16) - task->tState++; - break; - case 2: - task->tBlendDelay++; - if (task->tBlendDelay > 9) - { - task->tBlendDelay = 0; - task->tBlendY--; - if (task->tBlendY <= 0) - { - task->tBlendY = 0; - task->tState++; - } - REG_BLDY = task->tBlendY; - } - break; - case 3: - REG_BLDCNT = 0; - REG_BLDY = 0; - REG_WININ = task->tWinRange; - task->tState++; - break; - case 4: - EnableBothScriptContexts(); - DestroyTask(taskId); - break; - } -} - -#undef tState -#undef tBlendY -#undef tBlendDelay -#undef tWinRange - -//------------------------------------------------------------------------------ -// Light Rain -//------------------------------------------------------------------------------ - -void LightRain_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6D6 = 0; - gWeatherPtr->unknown_6DB = 8; - gWeatherPtr->unknown_6DC = 0; - gWeatherPtr->unknown_6D9 = 10; - gWeatherPtr->gammaTargetIndex = 3; - gWeatherPtr->gammaStepDelay = 20; - SetRainStrengthFromSoundEffect(SE_T_KOAME); -} - -void LightRain_Main(void); - -void LightRain_InitAll(void) -{ - LightRain_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - LightRain_Main(); -} - -void LoadRainSpriteSheet(void); -u8 CreateRainSprite(void); -u8 sub_807E8E8(void); - -void LightRain_Main(void) -{ - switch (gWeatherPtr->initStep) - { - case 0: - LoadRainSpriteSheet(); - gWeatherPtr->initStep++; - break; - case 1: - if (CreateRainSprite() == 0) - gWeatherPtr->initStep++; - break; - case 2: - if (sub_807E8E8() == FALSE) - { - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - } - break; - } -} - -void DestroyRainSprites(void); - -bool8 LightRain_Finish(void) -{ - switch (gWeatherPtr->finishStep) - { - case 0: - if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT - || gWeatherPtr->nextWeather == WEATHER_RAIN_MED - || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY) - { - gWeatherPtr->finishStep = 0xFF; - return FALSE; - } - else - { - gWeatherPtr->unknown_6D9 = 0; - gWeatherPtr->finishStep++; - } - // fall through - case 1: - if (sub_807E8E8() == FALSE) - { - DestroyRainSprites(); - gWeatherPtr->finishStep++; - return FALSE; - } - return TRUE; - } - return FALSE; -} - -// defined below -extern const s16 gUnknown_0839AABC[][2]; -extern const u16 gUnknown_0839AAC4[][2]; - -void sub_807E4EC(struct Sprite *sprite) -{ - u32 randVal; - u16 r6; - s32 r4; - s32 r0; - - if (sprite->data[1] == 0) - sprite->data[1] = 361; - randVal = sprite->data[1] * 1103515245 + 12345; - sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600; - - r6 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0]; - - r4 = sprite->data[1] % 30; - sprite->data[2] = r4 * 8; // useless assignment - - r0 = sprite->data[1] / 30; - sprite->data[3] = r0 * 8; // useless assignment - - sprite->data[2] = r4; - sprite->data[2] <<= 7; - - sprite->data[3] = r0; - sprite->data[3] <<= 7; - - sprite->data[2] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0] * r6; - sprite->data[3] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1] * r6; - - StartSpriteAnim(sprite, 0); - sprite->data[4] = 0; - sprite->coordOffsetEnabled = FALSE; - sprite->data[0] = r6; -} - -void sub_807E5C0(struct Sprite *sprite) -{ - if (sprite->data[4] == 0) - { - sprite->data[2] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0]; - sprite->data[3] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1]; - sprite->pos1.x = sprite->data[2] >> 4; - sprite->pos1.y = sprite->data[3] >> 4; - - if (sprite->data[5] != 0 - && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248) - && sprite->pos1.y >= -16 && sprite->pos1.y <= 176) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - - sprite->data[0]--; - if (sprite->data[0] == 0) - { - StartSpriteAnim(sprite, gWeatherPtr->unknown_6DC + 1); - sprite->data[4] = 1; - sprite->pos1.x -= gSpriteCoordOffsetX; - sprite->pos1.y -= gSpriteCoordOffsetY; - sprite->coordOffsetEnabled = TRUE; - } - } - else if (sprite->animEnded) - { - sprite->invisible = TRUE; - sub_807E4EC(sprite); - } -} - -void sub_807E6C4(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - { - sub_807E4EC(sprite); - sprite->callback = sub_807E5C0; - } - else - { - sprite->data[0]--; - } -} - -void sub_807E6F0(struct Sprite *sprite, u16 b) -{ - u16 r8 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0]; - u16 r6 = b / (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8); - u16 r4 = b % (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8); - - while (--r6 != 0xFFFF) - sub_807E4EC(sprite); - if (r4 < r8) - { - while (--r4 != 0xFFFF) - sub_807E5C0(sprite); - sprite->data[6] = 0; - } - else - { - sprite->data[0] = r4 - r8; - sprite->invisible = TRUE; - sprite->data[6] = 1; - } -} - -extern const struct SpriteSheet sRainSpriteSheet; // defined below - -void LoadRainSpriteSheet(void) -{ - LoadSpriteSheet(&sRainSpriteSheet); -} - -static const struct Coords16 sRainSpriteCoords[] = -{ - { 0, 0}, - { 0, 160}, - { 0, 64}, - {144, 224}, - {144, 128}, - { 32, 32}, - { 32, 192}, - { 32, 96}, - { 72, 128}, - { 72, 32}, - { 72, 192}, - {216, 96}, - {216, 0}, - {104, 160}, - {104, 64}, - {104, 224}, - {144, 0}, - {144, 160}, - {144, 64}, - { 32, 224}, - { 32, 128}, - { 72, 32}, - { 72, 192}, - { 48, 96}, -}; - -static const struct OamData gOamData_839AA68 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 2, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 2, - .affineParam = 0, -}; - -static const union AnimCmd gSpriteAnim_839AA70[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd gSpriteAnim_839AA78[] = -{ - ANIMCMD_FRAME(8, 3), - ANIMCMD_FRAME(32, 2), - ANIMCMD_FRAME(40, 2), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_839AA88[] = -{ - ANIMCMD_FRAME(8, 3), - ANIMCMD_FRAME(16, 3), - ANIMCMD_FRAME(24, 4), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_839AA98[] = -{ - gSpriteAnim_839AA70, - gSpriteAnim_839AA78, - gSpriteAnim_839AA88, -}; - -static const struct SpriteTemplate sRainSpriteTemplate = -{ - .tileTag = 4614, - .paletteTag = 4608, - .oam = &gOamData_839AA68, - .anims = gSpriteAnimTable_839AA98, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807E5C0, -}; - - -const s16 gUnknown_0839AABC[][2] = -{ - {-104, 208}, - {-160, 320}, -}; - -const u16 gUnknown_0839AAC4[][2] = -{ - {18, 7}, - {12, 10}, -}; - -static const struct SpriteSheet sRainSpriteSheet = {gWeatherRainTiles, sizeof(gWeatherRainTiles), 0x1206}; - -static const struct OamData gOamData_839AAD4 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct SpriteFrameImage gSpriteImageTable_839AADC[] = -{ - {gWeatherSnow1Tiles, sizeof(gWeatherSnow1Tiles)}, - {gWeatherSnow2Tiles, sizeof(gWeatherSnow2Tiles)}, -}; - -static const union AnimCmd gSpriteAnim_839AAEC[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_839AAF4[] = -{ - ANIMCMD_FRAME(1, 16), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_839AAFC[] = -{ - gSpriteAnim_839AAEC, - gSpriteAnim_839AAF4, -}; - -void sub_807ED48(struct Sprite *); -static const struct SpriteTemplate sSnowflakeSpriteTemplate = -{ - .tileTag = 0xFFFF, - .paletteTag = 4608, - .oam = &gOamData_839AAD4, - .anims = gSpriteAnimTable_839AAFC, - .images = gSpriteImageTable_839AADC, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807ED48, -}; - -// unused data -static const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300}; - -static const struct OamData gOamData_839AB2C = -{ - .y = 0, - .affineMode = 0, - .objMode = 1, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd gSpriteAnim_839AB34[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_839AB3C[] = -{ - ANIMCMD_FRAME(32, 16), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_839AB44[] = -{ - ANIMCMD_FRAME(64, 16), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_839AB4C[] = -{ - ANIMCMD_FRAME(96, 16), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_839AB54[] = -{ - ANIMCMD_FRAME(128, 16), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_839AB5C[] = -{ - ANIMCMD_FRAME(160, 16), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_839AB64[] = -{ - gSpriteAnim_839AB34, - gSpriteAnim_839AB3C, - gSpriteAnim_839AB44, - gSpriteAnim_839AB4C, - gSpriteAnim_839AB54, - gSpriteAnim_839AB5C, -}; - -static const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] = -{ - AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] = -{ - gSpriteAffineAnim_839AB7C, -}; - -static void Fog1SpriteCallback(struct Sprite *); -static const struct SpriteTemplate sFog1SpriteTemplate = -{ - .tileTag = 4609, - .paletteTag = 4608, - .oam = &gOamData_839AB2C, - .anims = gSpriteAnimTable_839AB64, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_839AB8C, - .callback = Fog1SpriteCallback, -}; - -bool8 CreateRainSprite(void) -{ - u8 spriteNum; - u8 spriteId; - - if (gWeatherPtr->rainSpriteCount == 24) - return FALSE; - - spriteNum = gWeatherPtr->rainSpriteCount; - spriteId = CreateSpriteAtEnd(&sRainSpriteTemplate, - sRainSpriteCoords[spriteNum].x, sRainSpriteCoords[spriteNum].y, 78); - if (spriteId != 64) - { - gSprites[spriteId].data[5] = 0; - gSprites[spriteId].data[1] = spriteNum * 145; - while (gSprites[spriteId].data[1] >= 600) - gSprites[spriteId].data[1] -= 600; - sub_807E4EC(&gSprites[spriteId]); - sub_807E6F0(&gSprites[spriteId], spriteNum * 9); - gSprites[spriteId].invisible = TRUE; - gWeatherPtr->sprites.s1.rainSprites[spriteNum] = &gSprites[spriteId]; - } - else - { - gWeatherPtr->sprites.s1.rainSprites[spriteNum] = NULL; - } - - if (++gWeatherPtr->rainSpriteCount == 24) - { - u16 i; - - for (i = 0; i < 24; i++) - { - if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL) - { - if (gWeatherPtr->sprites.s1.rainSprites[i]->data[6] == 0) - gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E5C0; - else - gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E6C4; - } - } - return FALSE; - } - return TRUE; -} - -bool8 sub_807E8E8(void) -{ - if (gWeatherPtr->unknown_6D8 == gWeatherPtr->unknown_6D9) - return FALSE; - - if (++gWeatherPtr->unknown_6D6 > gWeatherPtr->unknown_6DB) - { - gWeatherPtr->unknown_6D6 = 0; - if (gWeatherPtr->unknown_6D8 < gWeatherPtr->unknown_6D9) - { - gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8++]->data[5] = 1; - } - else - { - gWeatherPtr->unknown_6D8--; - gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->data[5] = 0; - gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->invisible = TRUE; - } - } - return TRUE; -} - -void DestroyRainSprites(void) -{ - u16 i; - - for (i = 0; i < gWeatherPtr->rainSpriteCount; i++) - { - if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL) - DestroySprite(gWeatherPtr->sprites.s1.rainSprites[i]); - } - gWeatherPtr->rainSpriteCount = 0; - FreeSpriteTilesByTag(0x1206); -} - -//------------------------------------------------------------------------------ -// Snow -//------------------------------------------------------------------------------ - -void Snow_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->gammaTargetIndex = 3; - gWeatherPtr->gammaStepDelay = 20; - gWeatherPtr->unknown_6E5 = 16; - gWeatherPtr->unknown_6E0 = 0; -} - -void Snow_Main(void); -void sub_807ED48(struct Sprite *); - -void Snow_InitAll(void) -{ - Snow_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - { - u16 i; - - Snow_Main(); - for (i = 0; i < gWeatherPtr->snowflakeSpriteCount; i++) - { - sub_807ED48(gWeatherPtr->sprites.s1.snowflakeSprites[i]); - } - } -} - -u8 snowflakes_progress(void); - -void Snow_Main(void) -{ - if (gWeatherPtr->initStep == 0 && snowflakes_progress() == FALSE) - { - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - } -} - -bool8 Snow_Finish(void) -{ - switch (gWeatherPtr->finishStep) - { - case 0: - gWeatherPtr->unknown_6E5 = 0; - gWeatherPtr->unknown_6E0 = 0; - gWeatherPtr->finishStep++; - // fall through - case 1: - if (snowflakes_progress() == FALSE) - { - gWeatherPtr->finishStep++; - return FALSE; - } - return TRUE; - } - return FALSE; -} - -bool8 CreateSnowflakeSprite(void); -bool8 RemoveSnowflakeSprite(void); - -bool8 snowflakes_progress(void) -{ - if (gWeatherPtr->snowflakeSpriteCount == gWeatherPtr->unknown_6E5) - return FALSE; - - gWeatherPtr->unknown_6E0++; - if (gWeatherPtr->unknown_6E0 > 36) - { - gWeatherPtr->unknown_6E0 = 0; - if (gWeatherPtr->snowflakeSpriteCount < gWeatherPtr->unknown_6E5) - CreateSnowflakeSprite(); - else - RemoveSnowflakeSprite(); - } - return (gWeatherPtr->snowflakeSpriteCount != gWeatherPtr->unknown_6E5); -} - -void sub_807EC40(struct Sprite *); - -bool8 CreateSnowflakeSprite(void) -{ - u8 spriteId = CreateSpriteAtEnd(&sSnowflakeSpriteTemplate, 0, 0, 78); - - if (spriteId == 64) - return FALSE; - gSprites[spriteId].data[4] = gWeatherPtr->snowflakeSpriteCount; - sub_807EC40(&gSprites[spriteId]); - gSprites[spriteId].coordOffsetEnabled = TRUE; - gWeatherPtr->sprites.s1.snowflakeSprites[gWeatherPtr->snowflakeSpriteCount++] = &gSprites[spriteId]; - return TRUE; -} - -bool8 RemoveSnowflakeSprite(void) -{ - if (gWeatherPtr->snowflakeSpriteCount != 0) - { - DestroySprite(gWeatherPtr->sprites.s1.snowflakeSprites[--gWeatherPtr->snowflakeSpriteCount]); - return TRUE; - } - return FALSE; -} - -void sub_807EC40(struct Sprite *sprite) -{ - u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30); - u16 r6; - - sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); - sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); - sprite->data[0] = sprite->pos1.y * 128; - sprite->pos2.x = 0; - r6 = Random(); - sprite->data[1] = (r6 & 3) * 5 + 64; - sprite->data[7] = (r6 & 3) * 5 + 64; - StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1); - sprite->data[3] = 0; - sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1; - sprite->data[6] = (r6 & 0x1F) + 210; - sprite->data[5] = 0; -} - -void sub_807ECEC(struct Sprite *sprite) -{ - if (gWeatherPtr->unknown_6E2 > 18) - { - sprite->invisible = FALSE; - sprite->callback = sub_807ED48; - sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); - sprite->data[0] = sprite->pos1.y * 128; - gWeatherPtr->unknown_6E2 = 0; - } -} - -void sub_807ED48(struct Sprite *sprite) -{ - s16 r3; - s16 r2; - - sprite->data[0] += sprite->data[1]; - sprite->pos1.y = sprite->data[0] >> 7; - sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF; - sprite->pos2.x = gSineTable[sprite->data[3]] / 64; - - r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF; - if (r3 & 0x100) - r3 = -0x100 | r3; // hmm... what is this? - if (r3 < -3) - sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); - else if (r3 > 242) - sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); - - r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF; - if (r2 > 163 && r2 < 171) - { - sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); - sprite->data[0] = sprite->pos1.y * 128; - sprite->data[5] = 0; - sprite->data[6] = 220; - } - else if (r2 > 242 && r2 < 250) - { - sprite->pos1.y = 163; - sprite->data[0] = sprite->pos1.y * 128; - sprite->data[5] = 0; - sprite->data[6] = 220; - sprite->invisible = TRUE; - sprite->callback = sub_807ECEC; - } - - sprite->data[5]++; - if (sprite->data[5] == sprite->data[6]) - { - sub_807EC40(sprite); - sprite->pos1.y = 250; - sprite->invisible = TRUE; - sprite->callback = sub_807ECEC; - } -} - -//------------------------------------------------------------------------------ -// Medium Rain -//------------------------------------------------------------------------------ - -void MedRain_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6D6 = 0; - gWeatherPtr->unknown_6DB = 4; - gWeatherPtr->unknown_6DC = 0; - gWeatherPtr->unknown_6D9 = 16; - gWeatherPtr->gammaTargetIndex = 3; - gWeatherPtr->gammaStepDelay = 20; - gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment - gWeatherPtr->unknown_6ED = 0; - SetRainStrengthFromSoundEffect(SE_T_AME); -} - -void Rain_Main(void); - -void MedRain_InitAll(void) -{ - MedRain_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Rain_Main(); -} - -//------------------------------------------------------------------------------ -// Heavy Rain -//------------------------------------------------------------------------------ - -void HeavyRain_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6D6 = 0; - gWeatherPtr->unknown_6DB = 4; - gWeatherPtr->unknown_6DC = 1; - gWeatherPtr->unknown_6D9 = 24; - gWeatherPtr->gammaTargetIndex = 3; - gWeatherPtr->gammaStepDelay = 20; - gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment - SetRainStrengthFromSoundEffect(SE_T_OOAME); -} - -void HeavyRain_InitAll(void) -{ - HeavyRain_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Rain_Main(); -} - -void UpdateThunderSound(void); -void SetThunderCounter(u16); - -void Rain_Main(void) -{ - UpdateThunderSound(); - switch (gWeatherPtr->initStep) - { - case 0: - LoadRainSpriteSheet(); - gWeatherPtr->initStep++; - break; - case 1: - if (CreateRainSprite()) - break; - gWeatherPtr->initStep++; - break; - case 2: - if (sub_807E8E8()) - break; - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - break; - case 3: - if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_CHANGING_WEATHER) - break; - gWeatherPtr->initStep = 6; - break; - case 4: - gWeatherPtr->unknown_6EA = 1; - gWeatherPtr->unknown_6E6 = (Random() % 360) + 360; - gWeatherPtr->initStep++; - // fall through - case 5: - if (--gWeatherPtr->unknown_6E6 != 0) - break; - gWeatherPtr->initStep++; - break; - case 6: - gWeatherPtr->unknown_6EA = 1; - gWeatherPtr->unknown_6EB = Random() % 2; - gWeatherPtr->initStep++; - break; - case 7: - gWeatherPtr->unknown_6EC = (Random() & 1) + 1; - gWeatherPtr->initStep++; - // fall through - case 8: - sub_807D5BC(19); - if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1) - SetThunderCounter(20); - gWeatherPtr->unknown_6E6 = (Random() % 3) + 6; - gWeatherPtr->initStep++; - break; - case 9: - if (--gWeatherPtr->unknown_6E6 != 0) - break; - sub_807D5BC(3); - gWeatherPtr->unknown_6EA = 1; - if (--gWeatherPtr->unknown_6EC != 0) - { - gWeatherPtr->unknown_6E6 = (Random() % 16) + 60; - gWeatherPtr->initStep = 10; - } - else if (gWeatherPtr->unknown_6EB == 0) - { - gWeatherPtr->initStep = 4; - } - else - { - gWeatherPtr->initStep = 11; - } - break; - case 10: - if (--gWeatherPtr->unknown_6E6 != 0) - break; - gWeatherPtr->initStep = 8; - break; - case 11: - gWeatherPtr->unknown_6E6 = (Random() % 16) + 60; - gWeatherPtr->initStep++; - break; - case 12: - if (--gWeatherPtr->unknown_6E6 != 0) - break; - SetThunderCounter(100); - sub_807D5BC(19); - // Why use "% 16" everywhere else and "& 0xF" here. So dumb. - gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30; - gWeatherPtr->initStep++; - break; - case 13: - if (--gWeatherPtr->unknown_6E6 != 0) - break; - sub_807D5F0(19, 3, 5); - gWeatherPtr->initStep++; - break; - case 14: - if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_IDLE) - break; - gWeatherPtr->unknown_6EA = 1; - gWeatherPtr->initStep = 4; - break; - } -} - -bool8 Rain_Finish(void) -{ - switch (gWeatherPtr->finishStep) - { - case 0: - gWeatherPtr->unknown_6EA = 0; - gWeatherPtr->finishStep++; - // fall through - case 1: - Rain_Main(); - if (gWeatherPtr->unknown_6EA != 0) - { - if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT - || gWeatherPtr->nextWeather == WEATHER_RAIN_MED - || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY) - return FALSE; - gWeatherPtr->unknown_6D9 = 0; - gWeatherPtr->finishStep++; - } - break; - case 2: - if (sub_807E8E8()) - break; - DestroyRainSprites(); - gWeatherPtr->unknown_6ED = 0; - gWeatherPtr->finishStep++; - return FALSE; - default: - return FALSE; - } - return TRUE; -} - -void SetThunderCounter(u16 max) -{ - if (gWeatherPtr->unknown_6ED == 0) - { - gWeatherPtr->thunderCounter = Random() % max; - gWeatherPtr->unknown_6ED = 1; - } -} - -void UpdateThunderSound(void) -{ - if (gWeatherPtr->unknown_6ED == 1) - { - if (gWeatherPtr->thunderCounter == 0) - { - if (IsSEPlaying()) - return; - if (Random() & 1) - PlaySE(SE_T_KAMI); - else - PlaySE(SE_T_KAMI2); - gWeatherPtr->unknown_6ED = 0; - } - else - { - gWeatherPtr->thunderCounter--; - } - } -} - -//------------------------------------------------------------------------------ -// Fog 1 -//------------------------------------------------------------------------------ - -void Fog1_Main(void); -static void CreateFog1Sprites(void); -static void DestroyFog1Sprites(void); - -void Fog1_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 20; - if (gWeatherPtr->fog1SpritesCreated == 0) - { - gWeatherPtr->unknown_6F0 = 0; - gWeatherPtr->unknown_6F2 = 0; - gWeatherPtr->fog1ScrollPosX = 0; - Weather_SetBlendCoeffs(0, 16); - } -} - -void Fog1_InitAll(void) -{ - Fog1_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Fog1_Main(); -} - -void Fog1_Main(void) -{ - gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF; - if (++gWeatherPtr->unknown_6F0 > 3) - { - gWeatherPtr->unknown_6F0 = 0; - gWeatherPtr->unknown_6F2++; - } - switch (gWeatherPtr->initStep) - { - case 0: - CreateFog1Sprites(); - if (gWeatherPtr->currWeather == WEATHER_FOG_1) - Weather_SetTargetBlendCoeffs(12, 8, 3); - else - Weather_SetTargetBlendCoeffs(4, 16, 0); - gWeatherPtr->initStep++; - break; - case 1: - if (Weather_UpdateBlend()) - { - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - } - break; - } -} - -bool8 Fog1_Finish(void) -{ - gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF; - if (++gWeatherPtr->unknown_6F0 > 3) - { - gWeatherPtr->unknown_6F0 = 0; - gWeatherPtr->unknown_6F2++; - } - switch (gWeatherPtr->finishStep) - { - case 0: - Weather_SetTargetBlendCoeffs(0, 16, 3); - gWeatherPtr->finishStep++; - break; - case 1: - if (!Weather_UpdateBlend()) - break; - gWeatherPtr->finishStep++; - break; - case 2: - DestroyFog1Sprites(); - gWeatherPtr->finishStep++; - break; - default: - return FALSE; - } - return TRUE; -} - -#define sprColumn data[0] - -static void Fog1SpriteCallback(struct Sprite *sprite) -{ - sprite->pos2.y = (u8)gSpriteCoordOffsetY; - sprite->pos1.x = gWeatherPtr->fog1ScrollPosX + 32 + sprite->sprColumn * 64; - if (sprite->pos1.x > 0x10F) - { - sprite->pos1.x = 480 + gWeatherPtr->fog1ScrollPosX - (4 - sprite->sprColumn) * 64; - sprite->pos1.x &= 0x1FF; - } -} - -static void CreateFog1Sprites(void) -{ - u16 i; - - if (!gWeatherPtr->fog1SpritesCreated) - { - struct SpriteSheet fog1SpriteSheet = {gWeatherFog1Tiles, sizeof(gWeatherFog1Tiles), 0x1201}; - - LoadSpriteSheet(&fog1SpriteSheet); - for (i = 0; i < 20; i++) - { - u8 spriteId = CreateSpriteAtEnd(&sFog1SpriteTemplate, 0, 0, 0xFF); - - if (spriteId != MAX_SPRITES) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sprite->sprColumn = i % 5; - sprite->pos1.x = (i % 5) * 64 + 32; - sprite->pos1.y = (i / 5) * 64 + 32; - gWeatherPtr->sprites.s2.fog1Sprites[i] = sprite; - } - else - { - gWeatherPtr->sprites.s2.fog1Sprites[i] = NULL; - } - } - gWeatherPtr->fog1SpritesCreated = TRUE; - } -} - -#undef sprColumn - -static void DestroyFog1Sprites(void) -{ - u16 i; - - if (gWeatherPtr->fog1SpritesCreated) - { - for (i = 0; i < 20; i++) - { - if (gWeatherPtr->sprites.s2.fog1Sprites[i] != NULL) - DestroySprite(gWeatherPtr->sprites.s2.fog1Sprites[i]); - } - FreeSpriteTilesByTag(0x1201); - gWeatherPtr->fog1SpritesCreated = 0; - } -} - -//------------------------------------------------------------------------------ -// Volcanic ash -//------------------------------------------------------------------------------ - -void Ash_Main(void); -void LoadAshSpriteSheet(void); -void CreateAshSprites(void); -void DestroyAshSprites(void); - -void Ash_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 20; - gWeatherPtr->unknown_6FE = 20; - if (!gWeatherPtr->ashSpritesCreated) - { - Weather_SetBlendCoeffs(0, 16); - REG_BLDALPHA = BLDALPHA_BLEND(64, 63); // Those aren't even valid coefficients! - } -} - -void Ash_InitAll(void) -{ - Ash_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Ash_Main(); -} - -void Ash_Main(void) -{ - gWeatherPtr->unknown_6FC = gSpriteCoordOffsetX & 0x1FF; - while (gWeatherPtr->unknown_6FC > 0xEF) - gWeatherPtr->unknown_6FC -= 0xF0; - switch (gWeatherPtr->initStep) - { - case 0: - LoadAshSpriteSheet(); - gWeatherPtr->initStep++; - break; - case 1: - if (!gWeatherPtr->ashSpritesCreated) - CreateAshSprites(); - Weather_SetTargetBlendCoeffs(16, 0, 1); - gWeatherPtr->initStep++; - break; - case 2: - if (!Weather_UpdateBlend()) - break; - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - break; - default: - Weather_UpdateBlend(); - break; - } -} - -bool8 Ash_Finish(void) -{ - switch (gWeatherPtr->finishStep) - { - case 0: - Weather_SetTargetBlendCoeffs(0, 16, 1); - gWeatherPtr->finishStep++; - break; - case 1: - if (!Weather_UpdateBlend()) - break; - DestroyAshSprites(); - gWeatherPtr->finishStep++; - break; - case 2: - REG_BLDALPHA = 0; - gWeatherPtr->finishStep++; - return FALSE; - default: - return FALSE; - } - return TRUE; -} - -static const struct SpriteSheet sAshSpriteSheet = {gWeatherAshTiles, sizeof(gWeatherAshTiles), 0x1202}; - -void LoadAshSpriteSheet(void) -{ - LoadSpriteSheet(&sAshSpriteSheet); -} - -const struct OamData gOamData_839ABB8 = -{ - .y = 0, - .affineMode = 0, - .objMode = 1, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 15, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_839ABC0[] = -{ - ANIMCMD_FRAME(0, 60), - ANIMCMD_FRAME(64, 60), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd *const gSpriteAnimTable_839ABCC[] = -{ - gSpriteAnim_839ABC0, -}; - -void sub_807FAA8(struct Sprite *); -static const struct SpriteTemplate sAshSpriteTemplate = -{ - .tileTag = 4610, - .paletteTag = 4608, - .oam = &gOamData_839ABB8, - .anims = gSpriteAnimTable_839ABCC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807FAA8, -}; - -void CreateAshSprites(void) -{ - u8 i; - - if (!gWeatherPtr->ashSpritesCreated) - { - for (i = 0; i < 20; i++) - { - u8 spriteId = CreateSpriteAtEnd(&sAshSpriteTemplate, 0, 0, 0x4E); - - if (spriteId != MAX_SPRITES) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sprite->data[1] = 0; - sprite->data[2] = (u8)(i % 5); - sprite->data[3] = (u8)(i / 5); - sprite->data[0] = sprite->data[3] * 64 + 32; - gWeatherPtr->sprites.s2.ashSprites[i] = sprite; - } - else - { - gWeatherPtr->sprites.s2.ashSprites[i] = NULL; - } - } - gWeatherPtr->ashSpritesCreated = TRUE; - } -} - -void DestroyAshSprites(void) -{ - u16 i; - - if (gWeatherPtr->ashSpritesCreated) - { - for (i = 0; i < 20; i++) - { - if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) - DestroySprite(gWeatherPtr->sprites.s2.ashSprites[i]); - } - FreeSpriteTilesByTag(0x1202); - gWeatherPtr->ashSpritesCreated = FALSE; - } -} - -void sub_807FAA8(struct Sprite *sprite) -{ - sprite->data[1]++; - if (sprite->data[1] > 5) - { - sprite->data[1] = 0; - sprite->data[0]++; - } - sprite->pos1.y = gSpriteCoordOffsetY + sprite->data[0]; - sprite->pos1.x = gWeatherPtr->unknown_6FC + 32 + sprite->data[2] * 64; - if (sprite->pos1.x > 271) - { - sprite->pos1.x = gWeatherPtr->unknown_6FC + 0x1E0 - (4 - sprite->data[2]) * 64; - sprite->pos1.x &= 0x1FF; - } -} - -//------------------------------------------------------------------------------ -// Fog 2 -//------------------------------------------------------------------------------ - -void Fog2_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = 0; - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 20; - gWeatherPtr->unknown_6F0 = 0; - gWeatherPtr->unknown_6F2 = 1; - if (gWeatherPtr->fog2SpritesCreated == 0) - { - gWeatherPtr->unknown_71C = 0; - gWeatherPtr->unknown_71E = 0; - gWeatherPtr->unknown_720 = 0; - gWeatherPtr->unknown_722 = 0; - gWeatherPtr->unknown_718 = 0; - gWeatherPtr->unknown_71A = 0; - Weather_SetBlendCoeffs(0, 16); - } -} - -void Fog2_Main(void); - -void Fog2_InitAll(void) -{ - Fog2_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Fog2_Main(); -} - -void sub_807FC9C(void); -void CreateFog2Sprites(void); - -void Fog2_Main(void) -{ - sub_807FC9C(); - switch (gWeatherPtr->initStep) - { - case 0: - CreateFog2Sprites(); - gWeatherPtr->initStep++; - break; - case 1: - Weather_SetTargetBlendCoeffs(12, 8, 8); - gWeatherPtr->initStep++; - break; - case 2: - if (!Weather_UpdateBlend()) - break; - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - break; - } -} - -void DestroyFog2Sprites(void); - -bool8 Fog2_Finish(void) -{ - sub_807FC9C(); - switch (gWeatherPtr->finishStep) - { - case 0: - Weather_SetTargetBlendCoeffs(0, 16, 1); - gWeatherPtr->finishStep++; - break; - case 1: - if (!Weather_UpdateBlend()) - break; - gWeatherPtr->finishStep++; - break; - case 2: - DestroyFog2Sprites(); - gWeatherPtr->finishStep++; - break; - default: - return FALSE; - } - return TRUE; -} - -void sub_807FC9C(void) -{ - if (++gWeatherPtr->unknown_71C > 2) - { - gWeatherPtr->unknown_720++; - gWeatherPtr->unknown_71C = 0; - } - - if (++gWeatherPtr->unknown_71E > 4) - { - gWeatherPtr->unknown_722++; - gWeatherPtr->unknown_71E = 0; - } - - gWeatherPtr->unknown_718 = (gSpriteCoordOffsetX - gWeatherPtr->unknown_720) & 0xFF; - gWeatherPtr->unknown_71A = gSpriteCoordOffsetY + gWeatherPtr->unknown_722; -} - -extern const struct SpriteTemplate sFog2SpriteTemplate; // defined below - -void CreateFog2Sprites(void) -{ - u16 i; - - if (!gWeatherPtr->fog2SpritesCreated) - { - struct SpriteSheet fog2SpriteSheet = {gWeatherFog2Tiles, sizeof(gWeatherFog2Tiles), 0x1203}; - - LoadSpriteSheet(&fog2SpriteSheet); - for (i = 0; i < 20; i++) - { - u8 spriteId = CreateSpriteAtEnd(&sFog2SpriteTemplate, 0, (i / 5) * 64, 0xFF); - - if (spriteId != MAX_SPRITES) - { - struct Sprite *sprite = &gSprites[spriteId]; - - sprite->data[0] = i % 5; - sprite->data[1] = i / 5; - gWeatherPtr->sprites.s2.fog2Sprites[i] = sprite; - } - else - { - gWeatherPtr->sprites.s2.fog2Sprites[i] = NULL; - } - } - gWeatherPtr->fog2SpritesCreated = TRUE; - } -} - -const struct OamData gOamData_839ABF0 = -{ - .y = 0, - .affineMode = 0, - .objMode = 1, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_839ABF8[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_839AC00[] = -{ - gSpriteAnim_839ABF8, -}; - -void Fog2SpriteCallback(struct Sprite *); -const struct SpriteTemplate sFog2SpriteTemplate = -{ - .tileTag = 4611, - .paletteTag = 4608, - .oam = &gOamData_839ABF0, - .anims = gSpriteAnimTable_839AC00, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = Fog2SpriteCallback, -}; - -void DestroyFog2Sprites(void) -{ - u16 i; - - if (gWeatherPtr->fog2SpritesCreated) - { - for (i = 0; i < 20; i++) - { - if (gWeatherPtr->sprites.s2.fog2Sprites[i] != NULL) - DestroySprite(gWeatherPtr->sprites.s2.fog2Sprites[i]); - } - FreeSpriteTilesByTag(0x1203); - gWeatherPtr->fog2SpritesCreated = FALSE; - } -} - -void Fog2SpriteCallback(struct Sprite *sprite) -{ - sprite->pos2.y = gWeatherPtr->unknown_71A; - sprite->pos1.x = gWeatherPtr->unknown_718 + 32 + sprite->data[0] * 64; - if (sprite->pos1.x > 271) - { - sprite->pos1.x = gWeatherPtr->unknown_718 + 0x1E0 - (4 - sprite->data[0]) * 64; - sprite->pos1.x &= 0x1FF; - } -} - -//------------------------------------------------------------------------------ -// Sandstorm -//------------------------------------------------------------------------------ - -void Sandstorm_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->weatherGfxLoaded = 0; - gWeatherPtr->gammaTargetIndex = 0; - gWeatherPtr->gammaStepDelay = 20; - if (gWeatherPtr->sandstormSprites1Created == 0) - { - gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0; - gWeatherPtr->unknown_712 = 8; - gWeatherPtr->unknown_714 = 0; - // Dead code. How does the compiler not optimize this out? - if (gWeatherPtr->unknown_712 > 0x5F) - gWeatherPtr->unknown_712 = 0x80 - gWeatherPtr->unknown_712; - Weather_SetBlendCoeffs(0, 16); - } -} - -void Sandstorm_Main(void); - -void Sandstorm_InitAll(void) -{ - Sandstorm_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Sandstorm_Main(); -} - -void sub_808002C(void); -void sub_8080064(void); -void CreateSandstormSprites_1(void); -void CreateSandstormSprites_2(void); - -void Sandstorm_Main(void) -{ - sub_8080064(); - sub_808002C(); - if (gWeatherPtr->unknown_712 > 0x5F) - gWeatherPtr->unknown_712 = 32; - switch (gWeatherPtr->initStep) - { - case 0: - CreateSandstormSprites_1(); - CreateSandstormSprites_2(); - gWeatherPtr->initStep++; - break; - case 1: - Weather_SetTargetBlendCoeffs(16, 0, 0); - gWeatherPtr->initStep++; - break; - case 2: - if (!Weather_UpdateBlend()) - break; - gWeatherPtr->weatherGfxLoaded = TRUE; - gWeatherPtr->initStep++; - break; - } -} - -void sub_80800E4(void); - -bool8 Sandstorm_Finish(void) -{ - sub_8080064(); - sub_808002C(); - switch (gWeatherPtr->finishStep) - { - case 0: - Weather_SetTargetBlendCoeffs(0, 16, 0); - gWeatherPtr->finishStep++; - break; - case 1: - if (!Weather_UpdateBlend()) - break; - gWeatherPtr->finishStep++; - break; - case 2: - sub_80800E4(); - gWeatherPtr->finishStep++; - break; - default: - return FALSE; - } - return TRUE; -} - -void sub_808002C(void) -{ - if (gWeatherPtr->unknown_714++ > 4) - { - gWeatherPtr->unknown_712++; - gWeatherPtr->unknown_714 = 0; - } -} - -void sub_8080064(void) -{ - gWeatherPtr->unknown_704 -= gSineTable[gWeatherPtr->unknown_712] * 4; - gWeatherPtr->unknown_708 -= gSineTable[gWeatherPtr->unknown_712]; - gWeatherPtr->unknown_70E = (gSpriteCoordOffsetX + (gWeatherPtr->unknown_704 >> 8)) & 0xFF; - gWeatherPtr->unknown_710 = gSpriteCoordOffsetY + (gWeatherPtr->unknown_708 >> 8); -} - -void sub_80800E4(void) -{ - u16 i; - - if (gWeatherPtr->sandstormSprites1Created) - { - for (i = 0; i < 20; i++) - { - if (gWeatherPtr->sprites.s2.sandstormSprites1[i] != NULL) - DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites1[i]); - } - gWeatherPtr->sandstormSprites1Created = FALSE; - FreeSpriteTilesByTag(0x1204); - } - - if (gWeatherPtr->sandstormSprites2Created) - { - for (i = 0; i < 5; i++) - { - if (gWeatherPtr->sprites.s2.sandstormSprites2[i] != NULL) - DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites2[i]); - } - gWeatherPtr->sandstormSprites2Created = FALSE; - } -} - -const struct OamData gOamData_839AC1C = -{ - .y = 0, - .affineMode = 0, - .objMode = 1, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_839AC24[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_839AC2C[] = -{ - ANIMCMD_FRAME(64, 3), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_839AC34[] = -{ - gSpriteAnim_839AC24, - gSpriteAnim_839AC2C, -}; - -void SandstormSpriteCallback1(struct Sprite *); -const struct SpriteTemplate sSandstormSpriteTemplate = -{ - .tileTag = 4612, - .paletteTag = 4609, - .oam = &gOamData_839AC1C, - .anims = gSpriteAnimTable_839AC34, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SandstormSpriteCallback1, -}; - -static const struct SpriteSheet sSandstormSpriteSheet = {gWeatherSandstormTiles, sizeof(gWeatherSandstormTiles), 0x1204}; - -void CreateSandstormSprites_1(void) -{ - u16 i; - - if (!gWeatherPtr->sandstormSprites1Created) - { - LoadSpriteSheet(&sSandstormSpriteSheet); - LoadCustomWeatherSpritePalette(gUnknown_08397128); - for (i = 0; i < 20; i++) - { - u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1); - - if (spriteId != MAX_SPRITES) - { - gWeatherPtr->sprites.s2.sandstormSprites1[i] = &gSprites[spriteId]; - gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[0] = i % 5; - gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[1] = i / 5; - } - else - { - gWeatherPtr->sprites.s2.sandstormSprites1[i] = NULL; - } - } - gWeatherPtr->sandstormSprites1Created = TRUE; - } -} - -const u16 gUnknown_0839AC5C[] = {0, 120, 80, 160, 40, 0}; - -void SandstormSpriteCallback2(struct Sprite *); - -void CreateSandstormSprites_2(void) -{ - u16 i; - - if (!gWeatherPtr->sandstormSprites2Created) - { - for (i = 0; i < 5; i++) - { - u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, i * 48 + 0x18, 0xD0, 1); - - if (spriteId != MAX_SPRITES) - { - gWeatherPtr->sprites.s2.sandstormSprites2[i] = &gSprites[spriteId]; - gWeatherPtr->sprites.s2.sandstormSprites2[i]->oam.size = 2; - gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[1] = i * 51; - gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[0] = 8; - gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[2] = 0; - gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[4] = 0x6730; - gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[3] = gUnknown_0839AC5C[i]; - StartSpriteAnim(gWeatherPtr->sprites.s2.sandstormSprites2[i], 1); - CalcCenterToCornerVec(gWeatherPtr->sprites.s2.sandstormSprites2[i], 0, 2, 0); - gWeatherPtr->sprites.s2.sandstormSprites2[i]->callback = SandstormSpriteCallback2; - } - else - { - gWeatherPtr->sprites.s2.sandstormSprites2[i] = NULL; - } - gWeatherPtr->sandstormSprites2Created = TRUE; - } - } -} - -void SandstormSpriteCallback1(struct Sprite *sprite) -{ - sprite->pos2.y = gWeatherPtr->unknown_710; - sprite->pos1.x = gWeatherPtr->unknown_70E + 32 + sprite->data[0] * 64; - if (sprite->pos1.x > 271) - { - sprite->pos1.x = gWeatherPtr->unknown_70E + 0x1E0 - (4 - sprite->data[0]) * 64; - sprite->pos1.x &= 0x1FF; - } -} - -void SandstormSpriteCallback3(struct Sprite *); - -void SandstormSpriteCallback2(struct Sprite *sprite) -{ - if (--sprite->data[3] == -1) - sprite->callback = SandstormSpriteCallback3; -} - -void SandstormSpriteCallback3(struct Sprite *sprite) -{ - u32 x; - u32 y; - - if (--sprite->pos1.y < -48) - { - sprite->pos1.y = 208; - sprite->data[0] = 4; - } - x = sprite->data[0] * gSineTable[sprite->data[1]]; - y = sprite->data[0] * gSineTable[sprite->data[1] + 64]; - sprite->pos2.x = x >> 8; - sprite->pos2.y = y >> 8; - sprite->data[1] = (sprite->data[1] + 10) & 0xFF; - if (++sprite->data[2] > 8) - { - sprite->data[2] = 0; - sprite->data[0]++; - } -} - -//------------------------------------------------------------------------------ -// Shade -//------------------------------------------------------------------------------ - -void Shade_InitVars(void) -{ - gWeatherPtr->initStep = 0; - gWeatherPtr->gammaTargetIndex = 3; - gWeatherPtr->gammaStepDelay = 20; -} - -void Shade_InitAll(void) -{ - Shade_InitVars(); -} - -void Shade_Main(void) -{ -} - -bool8 Shade_Finish(void) -{ - return FALSE; -} - -//------------------------------------------------------------------------------ -// Weather 14 -//------------------------------------------------------------------------------ - -const u8 gUnknown_0839AC68[] = {40, 90, 60, 90, 2, 60, 40, 30}; - -const struct SpriteSheet gWeatherBubbleSpriteSheet = {gWeatherBubbleTiles, sizeof(gWeatherBubbleTiles), 0x1205}; - -void Bubbles_InitVars(void) -{ - Fog1_InitVars(); - if (gWeatherPtr->unknown_72E == 0) - { - LoadSpriteSheet(&gWeatherBubbleSpriteSheet); - gWeatherPtr->unknown_728 = 0; - gWeatherPtr->unknown_726 = gUnknown_0839AC68[0]; - gWeatherPtr->unknown_72A = 0; - gWeatherPtr->unknown_72C = 0; - } -} - -void Bubbles_Main(void); - -void Bubbles_InitAll(void) -{ - Bubbles_InitVars(); - while (gWeatherPtr->weatherGfxLoaded == FALSE) - Bubbles_Main(); -} - -void sub_8080588(u16); - -void Bubbles_Main(void) -{ - Fog1_Main(); - if (++gWeatherPtr->unknown_726 > gUnknown_0839AC68[gWeatherPtr->unknown_728]) - { - gWeatherPtr->unknown_726 = 0; - if (++gWeatherPtr->unknown_728 > 7) - gWeatherPtr->unknown_728 = 0; - sub_8080588(gWeatherPtr->unknown_72A); - if (++gWeatherPtr->unknown_72A > 12) - gWeatherPtr->unknown_72A = 0; - } -} - -void sub_8080610(void); - -bool8 Bubbles_Finish(void) -{ - if (!Fog1_Finish()) - { - sub_8080610(); - return FALSE; - } - return TRUE; -} - -const s16 gUnknown_0839AC78[][2] = -{ - {120, 160}, - {376, 160}, - { 40, 140}, - {296, 140}, - {180, 130}, - {436, 130}, - { 60, 160}, - {436, 160}, - {220, 180}, - {476, 180}, - { 10, 90}, - {266, 90}, - {256, 160}, -}; - -const union AnimCmd gSpriteAnim_839ACAC[] = -{ - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_839ACB8[] = -{ - gSpriteAnim_839ACAC, -}; - -extern const struct OamData gOamData_837DF24; - -void unc_0807DAB4(struct Sprite *); -const struct SpriteTemplate gSpriteTemplate_839ACBC = -{ - .tileTag = 4613, - .paletteTag = 4608, - .oam = &gOamData_837DF24, - .anims = gSpriteAnimTable_839ACB8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = unc_0807DAB4, -}; - -void sub_8080588(u16 a) -{ - s16 x = gUnknown_0839AC78[a][0]; - s16 y = gUnknown_0839AC78[a][1] - gSpriteCoordOffsetY; - u8 spriteId = CreateSpriteAtEnd( - &gSpriteTemplate_839ACBC, - x, - y, - 0); - - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].coordOffsetEnabled = TRUE; - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].data[2] = 0; - gWeatherPtr->unknown_72C++; - } -} - -void sub_8080610(void) -{ - u16 i; - - for (i = 0; i < 64; i++) - { - if (gSprites[i].template == &gSpriteTemplate_839ACBC) - DestroySprite(&gSprites[i]); - } - FreeSpriteTilesByTag(0x1205); -} - -void unc_0807DAB4(struct Sprite *sprite) -{ - ++sprite->data[0]; - if (++sprite->data[0] > 8) // double increment - { - sprite->data[0] = 0; - if (sprite->data[1] == 0) - { - if (++sprite->pos2.x > 4) - sprite->data[1] = 1; - } - else - { - if (--sprite->pos2.x <= 0) - sprite->data[1] = 0; - } - } - sprite->pos1.y -= 3; - if (++sprite->data[2] > 0x77) - DestroySprite(sprite); -} - -//------------------------------------------------------------------------------ - -u8 TranslateWeatherNum(u8); -void UpdateRainCounter(u8, u8); - -void SetSav1Weather(u32 weather) -{ - u8 oldWeather = gSaveBlock1.weather; - - gSaveBlock1.weather = TranslateWeatherNum(weather); - UpdateRainCounter(gSaveBlock1.weather, oldWeather); -} - -u8 GetSav1Weather(void) -{ - return gSaveBlock1.weather; -} - -void SetSav1WeatherFromCurrMapHeader(void) -{ - u8 oldWeather = gSaveBlock1.weather; - - gSaveBlock1.weather = TranslateWeatherNum(gMapHeader.weather); - UpdateRainCounter(gSaveBlock1.weather, oldWeather); -} - -void SetWeather(u32 weather) -{ - SetSav1Weather(weather); - ChangeWeather(GetSav1Weather()); -} - -void SetWeather_Unused(u32 weather) -{ - SetSav1Weather(weather); - sub_807C988(GetSav1Weather()); -} - -void DoCurrentWeather(void) -{ - ChangeWeather(GetSav1Weather()); -} - -void sub_8080750(void) -{ - sub_807C988(GetSav1Weather()); -} - -static const u8 sWeatherCycle1[] = {2, 3, 5, 3}; -static const u8 sWeatherCycle2[] = {2, 2, 3, 2}; - -u8 TranslateWeatherNum(u8 weather) -{ - switch (weather) - { - case 0: return 0; - case 1: return 1; - case 2: return 2; - case 3: return 3; - case 4: return 4; - case 5: return 5; - case 6: return 6; - case 7: return 7; - case 8: return 8; - case 9: return 9; - case 10: return 10; - case 11: return 11; - case 12: return 12; - case 13: return 13; - case 14: return 14; - case 20: return sWeatherCycle1[gSaveBlock1.filler_2F]; - case 21: return sWeatherCycle2[gSaveBlock1.filler_2F]; - default: return 0; - } -} - -void UpdateWeatherPerDay(u16 increment) -{ - u16 weatherStage = gSaveBlock1.filler_2F + increment; - weatherStage %= 4; - gSaveBlock1.filler_2F = weatherStage; -} - -void UpdateRainCounter(u8 newWeather, u8 oldWeather) -{ - if (newWeather != oldWeather - && (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED)) - IncrementGameStat(GAME_STAT_GOT_RAINED_ON); -} diff --git a/src/field/fieldmap.c b/src/field/fieldmap.c deleted file mode 100644 index 7383bb174..000000000 --- a/src/field/fieldmap.c +++ /dev/null @@ -1,957 +0,0 @@ -#include "global.h" -#include "fieldmap.h" -#include "palette.h" -#include "overworld.h" -#include "script.h" -#include "secret_base.h" -#include "tv.h" - -struct ConnectionFlags -{ - u8 south:1; - u8 north:1; - u8 west:1; - u8 east:1; -}; - -struct Coords32 -{ - s32 x; - s32 y; -}; - -EWRAM_DATA static u16 gUnknown_02029828[0x2800] = {0}; -EWRAM_DATA struct MapHeader gMapHeader = {0}; -EWRAM_DATA struct Camera gCamera = {0}; -EWRAM_DATA static struct ConnectionFlags gUnknown_0202E850 = {0}; - -struct BackupMapData gUnknown_03004870; - -static const struct ConnectionFlags sDummyConnectionFlags = {0}; - -struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection) -{ - return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum); -} - -void not_trainer_hill_battle_pyramid(void) -{ - mapheader_copy_mapdata_with_padding(&gMapHeader); - sub_80BB970(gMapHeader.events); - mapheader_run_script_with_tag_x1(); -} - -void sub_8055FC0(void) -{ - mapheader_copy_mapdata_with_padding(&gMapHeader); - sub_80BBCCC(0); - sub_80BB970(gMapHeader.events); - sub_8056670(); - mapheader_run_script_with_tag_x1(); - UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); -} - -void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader) -{ - struct MapData *mapData; - int width; - int height; - mapData = mapHeader->mapData; - CpuFastFill16(0x03ff, gUnknown_02029828, sizeof(gUnknown_02029828)); - gUnknown_03004870.map = gUnknown_02029828; - width = mapData->width + 15; - gUnknown_03004870.width = width; - height = mapData->height + 14; - gUnknown_03004870.height = height; - if (width * height <= 0x2800) - { - map_copy_with_padding(mapData->map, mapData->width, mapData->height); - sub_80560AC(mapHeader); - } -} - -void map_copy_with_padding(u16 *map, u16 width, u16 height) -{ - u16 *dest; - int y; - dest = gUnknown_03004870.map; - dest += gUnknown_03004870.width * 7 + 7; - for (y = 0; y < height; y++) - { - CpuCopy16(map, dest, width * 2); - dest += width + 0xf; - map += width; - } -} - -void sub_80560AC(struct MapHeader *mapHeader) -{ - // BUG: This results in a null pointer dereference when mapHeader->connections - // is NULL, causing count to be assigned a garbage value. This garbage value - // just so happens to have the most significant bit set, so it is treated as - // negative and the loop below thankfully never executes in this scenario. - int count = mapHeader->connections->count; - struct MapConnection *connection = mapHeader->connections->connections; - int i; - - gUnknown_0202E850 = sDummyConnectionFlags; - for (i = 0; i < count; i++, connection++) - { - struct MapHeader *cMap = mapconnection_get_mapheader(connection); - u32 offset = connection->offset; - - switch (connection->direction) - { - case CONNECTION_SOUTH: - fillSouthConnection(mapHeader, cMap, offset); - gUnknown_0202E850.south = 1; - break; - case CONNECTION_NORTH: - fillNorthConnection(mapHeader, cMap, offset); - gUnknown_0202E850.north = 1; - break; - case CONNECTION_WEST: - fillWestConnection(mapHeader, cMap, offset); - gUnknown_0202E850.west = 1; - break; - case CONNECTION_EAST: - fillEastConnection(mapHeader, cMap, offset); - gUnknown_0202E850.east = 1; - break; - } - } -} - -void sub_8056134(int x, int y, struct MapHeader *mapHeader, int x2, int y2, int width, int height) -{ - int i; - u16 *src; - u16 *dest; - int mapWidth; - - mapWidth = mapHeader->mapData->width; - src = &mapHeader->mapData->map[mapWidth * y2 + x2]; - dest = &gUnknown_03004870.map[gUnknown_03004870.width * y + x]; - - for (i = 0; i < height; i++) - { - CpuCopy16(src, dest, width * 2); - dest += gUnknown_03004870.width; - src += mapWidth; - } -} - -void fillSouthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) -{ - int x, y; - int x2; - int width; - int cWidth; - - if (connectedMapHeader) - { - cWidth = connectedMapHeader->mapData->width; - x = offset + 7; - y = mapHeader->mapData->height + 7; - if (x < 0) - { - x2 = -x; - x += cWidth; - if (x < gUnknown_03004870.width) - { - width = x; - } - else - { - width = gUnknown_03004870.width; - } - x = 0; - } - else - { - x2 = 0; - if (x + cWidth < gUnknown_03004870.width) - { - width = cWidth; - } - else - { - width = gUnknown_03004870.width - x; - } - } - sub_8056134( - x, y, - connectedMapHeader, - x2, /*y2*/ 0, - width, /*height*/ 7); - } -} - -void fillNorthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) -{ - int x; - int x2, y2; - int width; - int cWidth, cHeight; - - if (connectedMapHeader) - { - cWidth = connectedMapHeader->mapData->width; - cHeight = connectedMapHeader->mapData->height; - x = offset + 7; - y2 = cHeight - 7; - if (x < 0) - { - x2 = -x; - x += cWidth; - if (x < gUnknown_03004870.width) - { - width = x; - } - else - { - width = gUnknown_03004870.width; - } - x = 0; - } - else - { - x2 = 0; - if (x + cWidth < gUnknown_03004870.width) - { - width = cWidth; - } - else - { - width = gUnknown_03004870.width - x; - } - } - - sub_8056134( - x, /*y*/ 0, - connectedMapHeader, - x2, y2, - width, /*height*/ 7); - - } -} - - -void fillWestConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) -{ - int y; - int x2, y2; - int height; - int cWidth, cHeight; - if (connectedMapHeader) - { - cWidth = connectedMapHeader->mapData->width; - cHeight = connectedMapHeader->mapData->height; - y = offset + 7; - x2 = cWidth - 7; - if (y < 0) - { - y2 = -y; - if (y + cHeight < gUnknown_03004870.height) - { - height = y + cHeight; - } - else - { - height = gUnknown_03004870.height; - } - y = 0; - } - else - { - y2 = 0; - if (y + cHeight < gUnknown_03004870.height) - { - height = cHeight; - } - else - { - height = gUnknown_03004870.height - y; - } - } - - sub_8056134( - /*x*/ 0, y, - connectedMapHeader, - x2, y2, - /*width*/ 7, height); - } -} - -void fillEastConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) -{ - int x, y; - int y2; - int height; - int cHeight; - if (connectedMapHeader) - { - cHeight = connectedMapHeader->mapData->height; - x = mapHeader->mapData->width + 7; - y = offset + 7; - if (y < 0) - { - y2 = -y; - if (y + cHeight < gUnknown_03004870.height) - { - height = y + cHeight; - } - else - { - height = gUnknown_03004870.height; - } - y = 0; - } - else - { - y2 = 0; - if (y + cHeight < gUnknown_03004870.height) - { - height = cHeight; - } - else - { - height = gUnknown_03004870.height - y; - } - } - - sub_8056134( - x, y, - connectedMapHeader, - /*x2*/ 0, y2, - /*width*/ 8, height); - } -} - -union Block -{ - struct - { - u16 block:10; - u16 collision:2; - u16 elevation:4; - } block; - u16 value; -}; - -u8 MapGridGetZCoordAt(int x, int y) -{ - u16 block; - int i; - u16 *border; - - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; - } - else - { - border = gMapHeader.mapData->border; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = gMapHeader.mapData->border[i]; - block |= 0xc00; - } - if (block == 0x3ff) - { - return 0; - } - return block >> 12; -} - -u8 MapGridIsImpassableAt(int x, int y) -{ - u16 block; - int i; - u16 *border; - - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; - } - else - { - border = gMapHeader.mapData->border; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = gMapHeader.mapData->border[i]; - block |= 0xc00; - } - if (block == 0x3ff) - { - return 1; - } - return (block & 0xc00) >> 10; -} - -u32 MapGridGetMetatileIdAt(int x, int y) -{ - u16 block; - int i; - int j; - struct MapData *mapData; - u16 *border; - u16 block2; - - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; - } - else - { - mapData = gMapHeader.mapData; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = mapData->border[i] | 0xc00; - } - if (block == 0x3ff) - { - border = gMapHeader.mapData->border; - j = (x + 1) & 1; - j += ((y + 1) & 1) * 2; - block2 = gMapHeader.mapData->border[j]; - block2 |= 0xc00; - return block2 & block; - } - return block & 0x3ff; -} - -u32 MapGridGetMetatileBehaviorAt(int x, int y) -{ - u16 metatile; - metatile = MapGridGetMetatileIdAt(x, y); - return GetBehaviorByMetatileId(metatile) & 0xff; -} - -u8 MapGridGetMetatileLayerTypeAt(int x, int y) -{ - u16 metatile; - metatile = MapGridGetMetatileIdAt(x, y); - return (GetBehaviorByMetatileId(metatile) & 0xf000) >> 12; -} - -void MapGridSetMetatileIdAt(int x, int y, u16 metatile) -{ - int i; - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - i = x + y * gUnknown_03004870.width; - gUnknown_03004870.map[i] = (gUnknown_03004870.map[i] & 0xf000) | (metatile & 0xfff); - } -} - -void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) -{ - int i; - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - i = x + gUnknown_03004870.width * y; - gUnknown_03004870.map[i] = metatile; - } -} - -u32 GetBehaviorByMetatileId(u16 metatile) -{ - u16 *attributes; - if (metatile <= 0x1ff) - { - attributes = gMapHeader.mapData->primaryTileset->metatileAttributes; - return attributes[metatile]; - } - else if (metatile <= 0x3ff) - { - attributes = gMapHeader.mapData->secondaryTileset->metatileAttributes; - return attributes[metatile - 0x200]; - } - else - { - return 0xff; - } -} - -void save_serialize_map(void) -{ - int i, j; - int x, y; - u16 *mapView; - int width; - mapView = gSaveBlock1.mapView; - width = gUnknown_03004870.width; - x = gSaveBlock1.pos.x; - y = gSaveBlock1.pos.y; - for (i = y; i < y + 14; i++) - { - for (j = x; j < x + 15; j++) - { - *mapView++ = gUnknown_02029828[width * i + j]; - } - } -} - -int sub_8056618(void) -{ - u16 i; - u32 r2; - r2 = 0; - for (i = 0; i < 0x200; i++) - { - r2 |= gSaveBlock1.mapView[i]; - } - if (r2 == 0) - { - return 1; - } - return 0; -} - -void sav2_mapdata_clear(void) -{ - CpuFill16(0, gSaveBlock1.mapView, sizeof(gSaveBlock1.mapView)); -} - -void sub_8056670(void) -{ - int i, j; - int x, y; - u16 *mapView; - int width; - mapView = gSaveBlock1.mapView; - if (!sub_8056618()) - { - width = gUnknown_03004870.width; - x = gSaveBlock1.pos.x; - y = gSaveBlock1.pos.y; - for (i = y; i < y + 14; i++) - { - for (j = x; j < x + 15; j++) - { - gUnknown_02029828[width * i + j] = *mapView++; - } - } - sav2_mapdata_clear(); - } -} - -void sub_80566F0(u8 a1) -{ - u16 *mapView; - int width; - int x0, y0; - int x2, y2; - u16 *src, *dest; - int srci, desti; - int r9, r8; - int x, y; - int i, j; - mapView = gSaveBlock1.mapView; - width = gUnknown_03004870.width; - r9 = 0; - r8 = 0; - x0 = gSaveBlock1.pos.x; - y0 = gSaveBlock1.pos.y; - x2 = 15; - y2 = 14; - switch (a1) - { - case CONNECTION_NORTH: - y0 += 1; - y2 = 13; - break; - case CONNECTION_SOUTH: - r8 = 1; - y2 = 13; - break; - case CONNECTION_WEST: - x0 += 1; - x2 = 14; - break; - case CONNECTION_EAST: - r9 = 1; - x2 = 14; - break; - } - for (y = 0; y < y2; y++) - { - i = 0; - j = 0; - for (x = 0; x < x2; x++) - { - desti = width * (y + y0); - srci = (y + r8) * 15 + r9; - src = &mapView[srci + i]; - dest = &gUnknown_02029828[x0 + desti + j]; - *dest = *src; - i++; - j++; - } - } - sav2_mapdata_clear(); -} - -int GetMapBorderIdAt(int x, int y) -{ - struct MapData *mapData; - u16 block, block2; - int i, j; - if (x >= 0 && x < gUnknown_03004870.width - && y >= 0 && y < gUnknown_03004870.height) - { - i = gUnknown_03004870.width; - i *= y; - block = gUnknown_03004870.map[x + i]; - if (block == 0x3ff) - { - goto fail; - } - } - else - { - mapData = gMapHeader.mapData; - j = (x + 1) & 1; - j += ((y + 1) & 1) * 2; - block2 = 0xc00 | mapData->border[j]; - if (block2 == 0x3ff) - { - goto fail; - } - } - goto success; -fail: - return -1; -success: - - if (x >= (gUnknown_03004870.width - 8)) - { - if (!gUnknown_0202E850.east) - { - return -1; - } - return CONNECTION_EAST; - } - else if (x < 7) - { - if (!gUnknown_0202E850.west) - { - return -1; - } - return CONNECTION_WEST; - } - else if (y >= (gUnknown_03004870.height - 7)) - { - if (!gUnknown_0202E850.south) - { - return -1; - } - return CONNECTION_SOUTH; - } - else if (y < 7) - { - if (!gUnknown_0202E850.north) - { - return -1; - } - return CONNECTION_NORTH; - } - else - { - return 0; - } -} - -int GetPostCameraMoveMapBorderId(int x, int y) -{ - return GetMapBorderIdAt(gSaveBlock1.pos.x + 7 + x, gSaveBlock1.pos.y + 7 + y); -} - -int CanCameraMoveInDirection(int direction) -{ - int x, y; - x = gSaveBlock1.pos.x + 7 + gUnknown_0821664C[direction].x; - y = gSaveBlock1.pos.y + 7 + gUnknown_0821664C[direction].y; - if (GetMapBorderIdAt(x, y) == -1) - { - return 0; - } - return 1; -} - -void sub_8056918(struct MapConnection *connection, int direction, int x, int y) -{ - struct MapHeader *mapHeader; - mapHeader = mapconnection_get_mapheader(connection); - switch (direction) - { - case CONNECTION_EAST: - gSaveBlock1.pos.x = -x; - gSaveBlock1.pos.y -= connection->offset; - break; - case CONNECTION_WEST: - gSaveBlock1.pos.x = mapHeader->mapData->width; - gSaveBlock1.pos.y -= connection->offset; - break; - case CONNECTION_SOUTH: - gSaveBlock1.pos.x -= connection->offset; - gSaveBlock1.pos.y = -y; - break; - case CONNECTION_NORTH: - gSaveBlock1.pos.x -= connection->offset; - gSaveBlock1.pos.y = mapHeader->mapData->height; - break; - } -} - -bool8 CameraMove(int x, int y) -{ - unsigned int direction; - struct MapConnection *connection; - int old_x, old_y; - gCamera.field_0 = FALSE; - direction = GetPostCameraMoveMapBorderId(x, y); - if (direction + 1 <= 1) - { - gSaveBlock1.pos.x += x; - gSaveBlock1.pos.y += y; - } - else - { - save_serialize_map(); - old_x = gSaveBlock1.pos.x; - old_y = gSaveBlock1.pos.y; - connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y); - sub_8056918(connection, direction, x, y); - sub_80538F0(connection->mapGroup, connection->mapNum); - gCamera.field_0 = TRUE; - gCamera.x = old_x - gSaveBlock1.pos.x; - gCamera.y = old_y - gSaveBlock1.pos.y; - gSaveBlock1.pos.x += x; - gSaveBlock1.pos.y += y; - sub_80566F0(direction); - } - return gCamera.field_0; -} - -struct MapConnection *sub_8056A64(u8 direction, int x, int y) -{ - int count; - struct MapConnection *connection; - int i; - count = gMapHeader.connections->count; - connection = gMapHeader.connections->connections; - for (i = 0; i < count; i++, connection++) - { - if (connection->direction == direction) - { - if (sub_8056ABC(direction, x, y, connection) == TRUE) - { - return connection; - } - } - } - return NULL; -} - -bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection) -{ - struct MapHeader *mapHeader; - mapHeader = mapconnection_get_mapheader(connection); - switch (direction) - { - case CONNECTION_SOUTH: - case CONNECTION_NORTH: - return sub_8056B20(x, gMapHeader.mapData->width, mapHeader->mapData->width, connection->offset); - case CONNECTION_WEST: - case CONNECTION_EAST: - return sub_8056B20(y, gMapHeader.mapData->height, mapHeader->mapData->height, connection->offset); - } - return FALSE; -} - -bool8 sub_8056B20(int x, int src_width, int dest_width, int offset) -{ - int offset2; - offset2 = offset; - if (offset2 < 0) - { - offset2 = 0; - } - if (dest_width + offset < src_width) - { - src_width = dest_width + offset; - } - if (offset2 <= x && x <= src_width) - { - return TRUE; - } - return FALSE; -} - -int sub_8056B4C(int x, int width) -{ - if (x >= 0 && x < width) - { - return TRUE; - } - return FALSE; -} - -int sub_8056B60(struct MapConnection *connection, int x, int y) -{ - struct MapHeader *mapHeader; - mapHeader = mapconnection_get_mapheader(connection); - switch (connection->direction) - { - case CONNECTION_SOUTH: - case CONNECTION_NORTH: - return sub_8056B4C(x - connection->offset, mapHeader->mapData->width); - case CONNECTION_WEST: - case CONNECTION_EAST: - return sub_8056B4C(y - connection->offset, mapHeader->mapData->height); - } - return FALSE; -} - -struct MapConnection *sub_8056BA0(s16 x, s16 y) -{ - int count; - struct MapConnection *connection; - int i; - u8 direction; - if (!gMapHeader.connections) - { - return NULL; - } - else - { - count = gMapHeader.connections->count; - connection = gMapHeader.connections->connections; - for (i = 0; i < count; i++, connection++) - { - direction = connection->direction; - if ((direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE) - || (direction == CONNECTION_NORTH && y > 6) - || (direction == CONNECTION_SOUTH && y < gMapHeader.mapData->height + 7) - || (direction == CONNECTION_WEST && x > 6) - || (direction == CONNECTION_EAST && x < gMapHeader.mapData->width + 7)) - { - continue; - } - if (sub_8056B60(connection, x - 7, y - 7) == TRUE) - { - return connection; - } - } - } - return NULL; -} - -void sub_8056C50(u16 x, u16 y) -{ - gSaveBlock1.pos.x = x - 7; - gSaveBlock1.pos.y = y - 7; -} - -void sav1_camera_get_focus_coords(u16 *x, u16 *y) -{ - *x = gSaveBlock1.pos.x + 7; - *y = gSaveBlock1.pos.y + 7; -} - -void unref_sub_8056C7C(u16 x, u16 y) -{ - gSaveBlock1.pos.x = x; - gSaveBlock1.pos.y = y; -} - -void GetCameraCoords(u16 *x, u16 *y) -{ - *x = gSaveBlock1.pos.x; - *y = gSaveBlock1.pos.y; -} - -void sub_8056C98(struct Tileset *tileset, void *src) -{ - if (tileset) - { - if (!tileset->isCompressed) - { - CpuFastSet(tileset->tiles, src, 0x1000); - } - else - { - LZ77UnCompVram(tileset->tiles, src); - } - } -} - -void sub_8056CBC(struct Tileset *tileset, int offset, int size) -{ - u16 black; - if (tileset) - { - if (tileset->isSecondary == FALSE) - { - black = 0; - LoadPalette(&black, offset, 2); - LoadPalette(tileset->palettes + 2, offset + 1, size - 2); - } - else if (tileset->isSecondary == TRUE) - { - LoadPalette(tileset->palettes + 0xc0, offset, size); - } - else - { - LZ77UnCompVram(tileset->palettes, (void*)0x2000000); - LoadPalette((void*)0x2000000, offset, size); - } - } -} - -void sub_8056D28(struct MapData *mapData) -{ - void *src = (void*)(BG_VRAM); - sub_8056C98(mapData->primaryTileset, src); -} - -void sub_8056D38(struct MapData *mapData) -{ - void *src = (void*)(BG_VRAM + 0x4000); - sub_8056C98(mapData->secondaryTileset, src); -} - -void apply_map_tileset1_palette(struct MapData *mapData) -{ - sub_8056CBC(mapData->primaryTileset, 0, 0xc0); -} - -void apply_map_tileset2_palette(struct MapData *mapData) -{ - sub_8056CBC(mapData->secondaryTileset, 0x60, 0xc0); -} - -void copy_map_tileset1_tileset2_to_vram(struct MapData *mapData) -{ - if (mapData) - { - sub_8056D28(mapData); - sub_8056D38(mapData); - } -} - -void apply_map_tileset1_tileset2_palette(struct MapData *mapData) -{ - if (mapData) - { - apply_map_tileset1_palette(mapData); - apply_map_tileset2_palette(mapData); - } -} diff --git a/src/field/fldeff_berrytree.c b/src/field/fldeff_berrytree.c deleted file mode 100644 index 6b03e9952..000000000 --- a/src/field/fldeff_berrytree.c +++ /dev/null @@ -1,56 +0,0 @@ -#include "global.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "script.h" - -static void Task_WateringBerryTreeAnim_0(u8); -static void Task_WateringBerryTreeAnim_1(u8); -static void Task_WateringBerryTreeAnim_2(u8); -static void Task_WateringBerryTreeAnim_3(u8); - -static void Task_WateringBerryTreeAnim_0(u8 taskId) -{ - gTasks[taskId].func = Task_WateringBerryTreeAnim_1; -} - -static void Task_WateringBerryTreeAnim_1(u8 taskId) -{ - struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) - || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - sub_8059D08(player_get_direction_lower_nybble()); - FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay16AnimId(player_get_direction_lower_nybble())); - gTasks[taskId].func = Task_WateringBerryTreeAnim_2; - } -} - -static void Task_WateringBerryTreeAnim_2(u8 taskId) -{ - struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) - { - s16 value = gTasks[taskId].data[1]++; - - if (value < 10) - { - FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay16AnimId(player_get_direction_lower_nybble())); - } - else - { - gTasks[taskId].func = Task_WateringBerryTreeAnim_3; - } - } -} - -static void Task_WateringBerryTreeAnim_3(u8 taskId) -{ - SetPlayerAvatarTransitionFlags(sub_80597D0()); - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void DoWateringBerryTreeAnim(void) -{ - CreateTask(Task_WateringBerryTreeAnim_0, 80); -} diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c deleted file mode 100644 index c8f942fe5..000000000 --- a/src/field/fldeff_cut.c +++ /dev/null @@ -1,369 +0,0 @@ -#include "global.h" -#include "fldeff_cut.h" -#include "field_camera.h" -#include "field_effect.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "map_obj_lock.h" -#include "metatile_behavior.h" -#include "metatile_behaviors.h" -#include "pokemon_menu.h" -#include "overworld.h" -#include "rom6.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "trig.h" -#include "ewram.h" - -extern void (*gFieldCallback)(void); -extern void (*gUnknown_03005CE4)(void); -extern u8 gLastFieldPokeMenuOpened; - -extern const u8 S_UseCut[]; - -const struct OamData gOamData_CutGrass = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 1, - .priority = 1, - .paletteNum = 1, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_CutGrass[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_JUMP(0), -}; - -const union AnimCmd *const gSpriteAnimTable_CutGrass[] = -{ - gSpriteAnim_CutGrass, -}; - -const struct SpriteFrameImage gSpriteImageTable_CutGrass[] = -{ - {gFieldEffectPic_CutGrass, 0x20}, -}; - -const struct SpritePalette gFieldEffectObjectPaletteInfo6 = {gFieldEffectObjectPalette6, 0x1000}; - -static void sub_80A2A48(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_CutGrass = -{ - .tileTag = 0xFFFF, - .paletteTag = 0x1000, - .oam = &gOamData_CutGrass, - .anims = gSpriteAnimTable_CutGrass, - .images = gSpriteImageTable_CutGrass, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A2A48, -}; - -#if DEBUG - -void debug_sub_80AFEE4(void) -{ - s16 x, y; - u8 i, j; - u8 metatile; - - if (npc_before_player_of_type(0x52) == TRUE) - { - gLastFieldPokeMenuOpened = 0; - sub_80A2634(); - return; - } - - PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - for (i = 0; i < 3; i++) - { - y = i - 1 + gUnknown_0203923C.y; - for (j = 0; j < 3; j++) - { - x = j - 1 + gUnknown_0203923C.x; - if (MapGridGetZCoordAt(x, y) == gUnknown_0203923C.height) - { - metatile = MapGridGetMetatileBehaviorAt(x, y); - if (MetatileBehavior_IsPokeGrass(metatile) == TRUE - || MetatileBehavior_IsAshGrass(metatile) == TRUE) - { - gLastFieldPokeMenuOpened = 0; - sub_80A25E8(); - return; - } - } - } - } - ScriptContext2_Disable(); -} - -#endif - -bool8 SetUpFieldMove_Cut(void) -{ - s16 x, y; - u8 i, j; - u8 tileBehavior; - - if(npc_before_player_of_type(0x52) == TRUE) // is in front of tree? - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_80A2634; - return TRUE; - } - else // is in ash or grass to cut? - { - PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - for(i = 0; i < 3; i++) - { - y = i - 1 + gUnknown_0203923C.y; - for(j = 0; j < 3; j++) - { - x = j - 1 + gUnknown_0203923C.x; - if(MapGridGetZCoordAt(x, y) == gUnknown_0203923C.height) - { - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if(MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE - || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_80A25E8; - return TRUE; - } - } - } - } - return FALSE; // do not use cut - } -} - -void sub_80A25E8(void) -{ - FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS); - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; -} - -bool8 FldEff_UseCutOnGrass(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_80A2684 >> 16; - gTasks[taskId].data[9] = (u32)sub_80A2684; - IncrementGameStat(GAME_STAT_USED_CUT); - return FALSE; -} - -void sub_80A2634(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(S_UseCut); -} - -bool8 FldEff_UseCutOnTree(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_80A2B00 >> 16; - gTasks[taskId].data[9] = (u32)sub_80A2B00; - IncrementGameStat(GAME_STAT_USED_CUT); - return FALSE; -} - -void sub_80A2684(void) -{ - FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS); - FieldEffectStart(FLDEFF_CUT_GRASS); -} - -bool8 FldEff_CutGrass(void) -{ - s16 x, y; - u8 tileBehavior; - u8 i, j; // not in for loop? - - for(i = 0, PlaySE(SE_W015), PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); i < 3; i++) - { - y = i - 1 + gUnknown_0203923C.y; - for(j = 0; j < 3; j++) - { - x = j - 1 + gUnknown_0203923C.x; - if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height) - { - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if(MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE) - { - sub_80A27A8(x, y); - sub_805BCC0(x, y); - } - } - } - } - sub_80A28F4(gUnknown_0203923C.x - 1, gUnknown_0203923C.y - 2); - DrawWholeMapView(); - - // populate sprite ID array - for(i = 0; i < 8; i++) - { - eCutGrassSpriteArray[i] = CreateSprite((struct SpriteTemplate *)&gSpriteTemplate_CutGrass, - gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); - gSprites[eCutGrassSpriteArray[i]].data[2] = 32 * i; - } - return 0; -} - -// set map grid metatile depending on x, y -// TODO: enum for metatile IDs -void sub_80A27A8(s16 x, s16 y) -{ - int metatileId = MapGridGetMetatileIdAt(x, y); - - switch(metatileId) - { - case 0x208: - case 0x15: - case 0xD: - MapGridSetMetatileIdAt(x, y, 0x1); - break; - case 0x1C6: - MapGridSetMetatileIdAt(x, y, 0x1CE); - break; - case 0x1C7: - MapGridSetMetatileIdAt(x, y, 0x1CF); - break; - case 0x281: - MapGridSetMetatileIdAt(x, y, 0x279); - break; - case 0x282: - MapGridSetMetatileIdAt(x, y, 0x27A); - break; - case 0x283: - MapGridSetMetatileIdAt(x, y, 0x27B); - break; - case 0x206: - case 0x207: - MapGridSetMetatileIdAt(x, y, 0x271); - break; - case 0x212: - case 0x20A: - MapGridSetMetatileIdAt(x, y, 0x218); - break; - case 0x25: - MapGridSetMetatileIdAt(x, y, 0xE); - break; - } -} - -s32 sub_80A28A0(s16 x, s16 y) -{ - u16 metatileId = MapGridGetMetatileIdAt(x, y); - - if(metatileId == 1) - return 1; - else if(metatileId == 633) - return 2; - else if(metatileId == 634) - return 3; - else if(metatileId == 635) - return 4; - else - return 0; -} - -void sub_80A28F4(s16 x, s16 y) -{ - s16 i; - u16 lowerY = y + 3; - - for(i = 0; i < 3; i++) - { - u16 currentX = x + i; - s16 currentXsigned = x + i; - if(MapGridGetMetatileIdAt(currentXsigned, y) == 21) - { - switch((u8)sub_80A28A0(currentXsigned, y + 1)) - { - case 1: - MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x208); - break; - case 2: - MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x281); - break; - case 3: - MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x282); - break; - case 4: - MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x283); - break; - } - } - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY) == 1) - { - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x208) - MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x1); - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x281) - MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x279); - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x282) - MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27A); - if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x283) - MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27B); - } - } -} - -static void sub_80A2A48(struct Sprite *sprite) -{ - sprite->data[0] = 8; - sprite->data[1] = 0; - sprite->data[3] = 0; - sprite->callback = (void *)objc_8097BBC; -} - -void objc_8097BBC(struct Sprite *sprite) -{ - u16 tempdata; - u16 tempdata2; - - sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]); - sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]); - - sprite->data[2] = (sprite->data[2] + 8) & 0xFF; - sprite->data[0] += ((tempdata2 = sprite->data[3]) << 16 >> 18) + 1; // what? - sprite->data[3] = tempdata2 + 1; - - tempdata = sprite->data[1]; - if((s16)tempdata != 28) // done rotating the grass, execute clean up function - sprite->data[1]++; - else - sprite->callback = (void *)sub_80A2AB8; -} - -void sub_80A2AB8(void) -{ - u8 i; - - for (i = 1; i < 8; i++) - DestroySprite(&gSprites[eCutGrassSpriteArray[i]]); - FieldEffectStop(&gSprites[eCutGrassSpriteArray[0]], FLDEFF_CUT_GRASS); - sub_8064E2C(); - ScriptContext2_Disable(); -} - -void sub_80A2B00(void) -{ - PlaySE(SE_W015); - FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE); - EnableBothScriptContexts(); -} diff --git a/src/field/fldeff_decoration.c b/src/field/fldeff_decoration.c deleted file mode 100644 index 1859fc00b..000000000 --- a/src/field/fldeff_decoration.c +++ /dev/null @@ -1,364 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" - -extern const u8 gSpriteImage_83D21EC[]; -extern const u8 gSpriteImage_83D22EC[]; -extern const u8 gSpriteImage_83D23EC[]; -extern const u16 gTilesetPalettes_SecretBase[][16]; - -const struct OamData gOamData_83D266C = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 2, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_83D2674[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_FRAME(2, 6), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_83D2684[] = -{ - gSpriteAnim_83D2674, -}; - -const struct SpriteFrameImage gSpriteImageTable_83D2688[] = -{ - {gSpriteImage_83D21EC, 0x100}, - {gSpriteImage_83D22EC, 0x100}, - {gSpriteImage_83D23EC, 0x100}, -}; - -void SpriteCB_SandPillar_0(struct Sprite *); -void SpriteCB_SandPillar_1(struct Sprite *); -void SpriteCB_SandPillar_2(struct Sprite *); -const struct SpriteTemplate gSpriteTemplate_83D26A0 = -{ - .tileTag = 0xFFFF, - .paletteTag = 4110, - .oam = &gOamData_83D266C, - .anims = gSpriteAnimTable_83D2684, - .images = gSpriteImageTable_83D2688, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_SandPillar_0, -}; - -// This uses one of the secret base palettes, so there is no "09.pal" file. -const struct SpritePalette gFieldEffectObjectPaletteInfo9 = {gTilesetPalettes_SecretBase[5], 0x100E}; - -extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; - -static void sub_80C68EC(u8); -static void DoBalloonSoundEffect(s16); - -void sub_80C68A4(s16 metatileId, s16 x, s16 y) -{ - u8 taskId = CreateTask(sub_80C68EC, 0); - - gTasks[taskId].data[0] = metatileId; - gTasks[taskId].data[1] = x; - gTasks[taskId].data[2] = y; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = 1; -} - -static void sub_80C68EC(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (data[3] == 6) - data[3] = 0; - else - data[3]++; - - if (data[3] == 0) - { - if (data[4] == 2) - DoBalloonSoundEffect(data[0]); - MapGridSetMetatileIdAt(data[1], data[2], data[0] + data[4]); - CurrentMapDrawMetatileAt(data[1], data[2]); - if (data[4] == 3) - DestroyTask(taskId); - else - data[4]++; - } -} - -static void DoBalloonSoundEffect(s16 metatileId) -{ - switch (metatileId) - { - case 824: - PlaySE(SE_FUUSEN1); - break; - case 828: - PlaySE(SE_FUUSEN2); - break; - case 832: - PlaySE(SE_FUUSEN3); - break; - case 552: - PlaySE(SE_TOY_DANGO); - break; - } -} - -bool8 FldEff_Nop47(void) -{ - return FALSE; -} - -bool8 FldEff_Nop48(void) -{ - return FALSE; -} - -static void sub_80C69C4(s16 x, s16 y) -{ - PlaySE(SE_TOY_KABE); - MapGridSetMetatileIdAt(x, y, 630); - MapGridSetMetatileIdAt(x, y - 1, 622); - CurrentMapDrawMetatileAt(x, y); - CurrentMapDrawMetatileAt(x, y - 1); -} - -static void sub_80C6A14(u8 taskId) -{ - if (gTasks[taskId].data[0] == 7) - { - sub_80C69C4(gTasks[taskId].data[1], gTasks[taskId].data[2]); - DestroyTask(taskId); - } - else - { - gTasks[taskId].data[0]++; - } -} - -void sub_80C6A54(s16 x, s16 y) -{ - u8 dir = player_get_direction_lower_nybble(); - if (dir == DIR_SOUTH) - { - sub_80C69C4(x, y); - } - else if (dir == DIR_NORTH) - { - u8 taskId = CreateTask(sub_80C6A14, 5); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = x; - gTasks[taskId].data[2] = y; - } -} - -static void Task_DecorationSoundEffect(u8 taskId) -{ - if (gTasks[taskId].data[1] == 7) - { - switch (gTasks[taskId].data[0]) - { - case 632: - PlaySE(SE_TOY_C); - break; - case 633: - PlaySE(SE_TOY_D); - break; - case 634: - PlaySE(SE_TOY_E); - break; - case 635: - PlaySE(SE_TOY_F); - break; - case 636: - PlaySE(SE_TOY_G); - break; - case 637: - PlaySE(SE_TOY_A); - break; - case 638: - PlaySE(SE_TOY_B); - break; - case 691: - PlaySE(SE_TOY_C1); - break; - } - - DestroyTask(taskId); - } - else - { - gTasks[taskId].data[1]++; - } -} - -void DoDecorationSoundEffect(s16 arg) -{ - u8 taskId = CreateTask(Task_DecorationSoundEffect, 5); - gTasks[taskId].data[0] = arg; - gTasks[taskId].data[1] = 0; -} - -void SpriteCB_YellowCave4Sparkle(struct Sprite *sprite) -{ - sprite->data[0]++; - if (sprite->data[0] == 8) - PlaySE(SE_W215); - if (sprite->data[0] >= 32) - DestroySprite(sprite); -} - -void DoYellowCave4Sparkle(void) -{ - s16 x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; - s16 y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; - u8 spriteId; - - sub_8060470(&x, &y, 8, 4); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], x, y, 0); - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].coordOffsetEnabled = TRUE; - gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].oam.paletteNum = 5; - gSprites[spriteId].callback = SpriteCB_YellowCave4Sparkle; - gSprites[spriteId].data[0] = 0; - } -} - -bool8 FldEff_SandPillar(void) -{ - s16 x, y; - - ScriptContext2_Enable(); - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - gFieldEffectArguments[5] = x; - gFieldEffectArguments[6] = y; - - switch (player_get_direction_lower_nybble()) - { - case DIR_SOUTH: - CreateSprite( - &gSpriteTemplate_83D26A0, - gSprites[gPlayerAvatar.spriteId].oam.x + 8, - gSprites[gPlayerAvatar.spriteId].oam.y + 32, - 0); - break; - case DIR_NORTH: - CreateSprite( - &gSpriteTemplate_83D26A0, - gSprites[gPlayerAvatar.spriteId].oam.x + 8, - gSprites[gPlayerAvatar.spriteId].oam.y, - 148); - break; - case DIR_WEST: - CreateSprite( - &gSpriteTemplate_83D26A0, - gSprites[gPlayerAvatar.spriteId].oam.x - 8, - gSprites[gPlayerAvatar.spriteId].oam.y + 16, - 148); - break; - case DIR_EAST: - CreateSprite( - &gSpriteTemplate_83D26A0, - gSprites[gPlayerAvatar.spriteId].oam.x + 24, - gSprites[gPlayerAvatar.spriteId].oam.y + 16, - 148); - break; - } - - return FALSE; -} - -void SpriteCB_SandPillar_0(struct Sprite *sprite) -{ - PlaySE(SE_W088); - if (MapGridGetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1) == 646) - MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 3586); - else - MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 644); - MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 522); - CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1); - CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]); - sprite->data[0] = 0; - sprite->callback = SpriteCB_SandPillar_1; -} - -void SpriteCB_SandPillar_1(struct Sprite *sprite) -{ - if (sprite->data[0] < 18) - { - sprite->data[0]++; - } - else - { - MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 3724); - CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]); - sprite->data[0] = 0; - sprite->callback = SpriteCB_SandPillar_2; - } -} - -void SpriteCB_SandPillar_2(struct Sprite *sprite) -{ - FieldEffectStop(sprite, FLDEFF_SAND_PILLAR); - EnableBothScriptContexts(); -} - -void GetShieldToyTVDecorationInfo(void) -{ - s16 x, y; - s32 metatileId; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - - metatileId = MapGridGetMetatileIdAt(x, y); - - switch (metatileId) - { - case 822: - ConvertIntToDecimalStringN(gStringVar1, 100, STR_CONV_MODE_LEFT_ALIGN, 3); - StringCopy(gStringVar2, gSecretBaseText_GoldRank); - gSpecialVar_Result = 0; - break; - case 734: - ConvertIntToDecimalStringN(gStringVar1, 50, STR_CONV_MODE_LEFT_ALIGN, 2); - StringCopy(gStringVar2, gSecretBaseText_SilverRank); - gSpecialVar_Result = 0; - break; - case 756: - gSpecialVar_Result = 1; - break; - case 757: - gSpecialVar_Result = 2; - break; - case 758: - gSpecialVar_Result = 3; - break; - } -} diff --git a/src/field/fldeff_escalator.c b/src/field/fldeff_escalator.c deleted file mode 100644 index 981233480..000000000 --- a/src/field/fldeff_escalator.c +++ /dev/null @@ -1,132 +0,0 @@ -#include "global.h" -#include "task.h" -#include "fieldmap.h" -#include "field_camera.h" -#include "field_player_avatar.h" - -extern u8 gUnknown_02038731; - -void sub_80B45B4(u8 taskId, const s16 *list, u16 c) -{ - s16 r5 = gTasks[taskId].data[4] - 1; - s16 r3 = gTasks[taskId].data[5] - 1; - s16 r4 = gTasks[taskId].data[1]; - s16 y; - s16 x; - - if (gTasks[taskId].data[2] == 0) - { - for (y = 0; y < 3; y++) - { - for (x = 0; x < 3; x++) - { - s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); - - if (list[r4] == metatileId) - { - if (r4 != 2) - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]); - else - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]); - } - } - } - } - else - { - for (y = 0; y < 3; y++) - { - for (x = 0; x < 3; x++) - { - s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); - - if (list[2 - r4] == metatileId) - { - if (r4 != 2) - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]); - else - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]); - } - } - } - } -} - -const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; -const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; -const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; -const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; -const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; -const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; -const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; - -void sub_80B4710(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - data[3] = 1; - - switch (data[0]) - { - case 0: - sub_80B45B4(taskId, gUnknown_083CC714, 0); - break; - case 1: - sub_80B45B4(taskId, gUnknown_083CC71A, 0); - break; - case 2: - sub_80B45B4(taskId, gUnknown_083CC720, 0xC00); - break; - case 3: - sub_80B45B4(taskId, gUnknown_083CC726, 0); - break; - case 4: - sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00); - break; - case 5: - sub_80B45B4(taskId, gUnknown_083CC732, 0); - break; - case 6: - sub_80B45B4(taskId, gUnknown_083CC738, 0); - break; - } - - data[0] = (data[0] + 1) & 7; - if (!data[0]) - { - DrawWholeMapView(); - data[1] = (data[1] + 1) % 3; - data[3] = 0; - } -} - -u8 sub_80B47D8(u16 var) -{ - u8 taskId = CreateTask(sub_80B4710, 0); - s16 *data = gTasks[taskId].data; - - PlayerGetDestCoords(&data[4], &data[5]); - data[0] = 0; - data[1] = 0; - data[2] = var; - sub_80B4710(taskId); - return taskId; -} - -void sub_80B4824(u8 var) -{ - gUnknown_02038731 = sub_80B47D8(var); -} - -void sub_80B483C(void) -{ - DestroyTask(gUnknown_02038731); -} - -bool8 sub_80B4850(void) -{ - if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) - return FALSE; - else - return TRUE; -} diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c deleted file mode 100644 index 30ddd0f6c..000000000 --- a/src/field/fldeff_flash.c +++ /dev/null @@ -1,342 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_effect.h" -#include "main.h" -#include "palette.h" -#include "pokemon_menu.h" -#include "overworld.h" -#include "rom6.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" - -struct FlashStruct -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; - void (*func)(void); -}; - -extern u8 gLastFieldPokeMenuOpened; -extern void (*gUnknown_03005CE4)(void); - -extern u8 gUnknown_081B694A[]; - -void sub_810CBFC(void); -void sub_810CC34(void); -bool8 sub_810CD5C(void); -void sub_810CE5C(u8); -void sub_810CE78(u8); -void sub_810CF18(u8); -void sub_810CF5C(u8); -void sub_810CFC4(u8); -void sub_810D00C(u8); -void sub_810D028(u8); -void sub_810D0C4(u8); -void sub_810D128(u8); -void sub_810CFF8(void); -void sub_810CE48(void); - -static const struct FlashStruct gUnknown_083F7FC4[] = -{ - {1, 4, 1, 0, sub_810CFF8}, - {2, 4, 1, 0, sub_810CFF8}, - {3, 4, 1, 0, sub_810CFF8}, - {5, 4, 1, 0, sub_810CFF8}, - {6, 4, 1, 0, sub_810CFF8}, - {7, 4, 1, 0, sub_810CFF8}, - {8, 4, 1, 0, sub_810CFF8}, - {9, 4, 1, 0, sub_810CFF8}, - {4, 1, 0, 1, sub_810CE48}, - {4, 2, 0, 1, sub_810CE48}, - {4, 3, 0, 1, sub_810CE48}, - {4, 5, 0, 1, sub_810CE48}, - {4, 6, 0, 1, sub_810CE48}, - {4, 7, 0, 1, sub_810CE48}, - {4, 8, 0, 1, sub_810CE48}, - {4, 9, 0, 1, sub_810CE48}, - {0, 0, 0, 0, NULL}, -}; - -// TODO: Make these extracted palettes? -static const u16 gCaveTransitionPalette_White[] = {0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF}; -static const u16 gCaveTransitionPalette_Black[] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}; - -static const u16 gUnknown_083F808C[] = INCBIN_U16("graphics/misc/83F808C.gbapal"); -static const u16 gUnknown_083F809C[] = INCBIN_U16("graphics/misc/83F809C.gbapal"); -static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz"); -static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz"); - -#if DEBUG - -void debug_sub_8122080(void) -{ - if (gMapHeader.cave == 1 && !FlagGet(FLAG_SYS_USE_FLASH)) - sub_810CBFC(); - else - ScriptContext2_Disable(); -} - -#endif - -bool8 SetUpFieldMove_Flash(void) -{ - if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH)) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_810CBFC; - return TRUE; - } - - return FALSE; -} - -void sub_810CBFC(void) -{ - u8 taskId = oei_task_add(); - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - gTasks[taskId].data[8] = (uintptr_t)sub_810CC34 >> 16; - gTasks[taskId].data[9] = (uintptr_t)sub_810CC34; -} - -void sub_810CC34(void) -{ - PlaySE(SE_W115); - FlagSet(FLAG_SYS_USE_FLASH); - ScriptContext1_SetupScript(gUnknown_081B694A); -} - -void sub_810CC54(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void sub_810CC80(void) -{ - u16 ime; - - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); - ResetPaletteFade(); - ResetTasks(); - ResetSpriteData(); - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - SetVBlankCallback(VBlankCB); - SetMainCallback2(sub_810CC54); - if (!sub_810CD5C()) - SetMainCallback2(gMain.savedCallback); -} - -bool8 sub_810CD5C(void) -{ - u8 i; - u8 v0 = get_map_type_from_warp0(); - u8 v1 = Overworld_GetMapTypeOfSaveblockLocation(); - - for (i = 0; gUnknown_083F7FC4[i].unk0; i++) - { - if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) - { - gUnknown_083F7FC4[i].func(); - return TRUE; - } - } - - return FALSE; -} - -u8 sub_810CDB8(u8 a1, u8 a2) -{ - u8 i; - u8 v0 = a1; - u8 v1 = a2; - - for (i = 0; gUnknown_083F7FC4[i].unk0; i++) - { - if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) - { - return gUnknown_083F7FC4[i].unk2; - } - } - - return FALSE; -} - -u8 fade_type_for_given_maplight_pair(u8 a1, u8 a2) -{ - u8 i; - u8 v0 = a1; - u8 v1 = a2; - - for (i = 0; gUnknown_083F7FC4[i].unk0; i++) - { - if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) - { - return gUnknown_083F7FC4[i].unk3; - } - } - - return FALSE; -} - -void sub_810CE48(void) -{ - CreateTask(sub_810CE5C, 0); -} - -void sub_810CE5C(u8 taskId) -{ - gTasks[taskId].func = sub_810CE78; -} - -void sub_810CE78(u8 taskId) -{ - REG_DISPCNT = 0; - LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000); - LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800); - LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); - LoadPalette(gUnknown_083F809C, 0xE0, 0x10); - REG_BLDCNT = 15937; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG0CNT = 7948; - REG_DISPCNT = 4416; - gTasks[taskId].func = sub_810CF18; - gTasks[taskId].data[0] = 16; - gTasks[taskId].data[1] = 0; -} - -void sub_810CF18(u8 taskId) -{ - u16 count = gTasks[taskId].data[1]; - u16 blend = count + 0x1000; - REG_BLDALPHA = blend; - if (count <= 0x10) - { - gTasks[taskId].data[1]++; - } - else - { - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_810CF5C; - } -} - -void sub_810CF5C(u8 taskId) -{ - u16 count; - - REG_BLDALPHA = 4112; - - count = gTasks[taskId].data[2]; - - if (count < 8) - { - gTasks[taskId].data[2]++; - LoadPalette(&gUnknown_083F809C[count], 0xE0, 16 - 2 * count); - } - else - { - LoadPalette(gCaveTransitionPalette_White, 0, 0x20); - gTasks[taskId].func = sub_810CFC4; - gTasks[taskId].data[2] = 8; - } -} - -void sub_810CFC4(u8 taskId) -{ - if (gTasks[taskId].data[2]) - gTasks[taskId].data[2]--; - else - SetMainCallback2(gMain.savedCallback); -} - -void sub_810CFF8(void) -{ - CreateTask(sub_810D00C, 0); -} - -void sub_810D00C(u8 taskId) -{ - gTasks[taskId].func = sub_810D028; -} - -void sub_810D028(u8 taskId) -{ - REG_DISPCNT = 0; - LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000); - LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG0CNT = 7948; - REG_DISPCNT = 4416; - LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); - LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); - gTasks[taskId].func = sub_810D0C4; - gTasks[taskId].data[0] = 16; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; -} - -void sub_810D0C4(u8 taskId) -{ - u16 count = gTasks[taskId].data[2]; - if (count < 16) - { - gTasks[taskId].data[2]++; - gTasks[taskId].data[2]++; - LoadPalette(&gUnknown_083F808C[15 - count], 0xE0, 2 * (count + 1)); - } - else - { - REG_BLDALPHA = 4112; - REG_BLDCNT = 15937; - gTasks[taskId].func = sub_810D128; - } -} - -void sub_810D128(u8 taskId) -{ - u16 count = 16 - gTasks[taskId].data[1]; - u16 blend = count + 0x1000; - REG_BLDALPHA = blend; - if (count) - { - gTasks[taskId].data[1]++; - } - else - { - LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); - SetMainCallback2(gMain.savedCallback); - } -} diff --git a/src/field/fldeff_poison.c b/src/field/fldeff_poison.c deleted file mode 100644 index 52afc2516..000000000 --- a/src/field/fldeff_poison.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "global.h" -#include "fldeff_poison.h" -#include "task.h" -#include "constants/songs.h" -#include "sound.h" - -static void Task_FieldPoisonEffect(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - data[1] += 2; - if (data[1] > 8) - { - data[0]++; - } - break; - case 1: - data[1] -= 2; - if (data[1] == 0) - { - data[0]++; - } - break; - case 2: - DestroyTask(taskId); - return; - } - - REG_MOSAIC = (data[1] << 4) | data[1]; -} - -void FldeffPoison_Start(void) -{ - PlaySE(SE_DOKU); - CreateTask(Task_FieldPoisonEffect, 80); -} - -bool32 FldeffPoison_IsActive(void) -{ - return FuncIsActiveTask(Task_FieldPoisonEffect); -} diff --git a/src/field/fldeff_recordmixing.c b/src/field/fldeff_recordmixing.c deleted file mode 100644 index 716447f9c..000000000 --- a/src/field/fldeff_recordmixing.c +++ /dev/null @@ -1,83 +0,0 @@ -#include "global.h" -#include "event_object_movement.h" -#include "fldeff_recordmixing.h" -#include "sprite.h" - -extern const struct OamData gFieldOamData_32x8; - -static const u8 sSpriteImage_83D26C0[] = INCBIN_U8("graphics/unknown_sprites/83D2860/0.4bpp"); -static const u8 sSpriteImage_83D2740[] = INCBIN_U8("graphics/unknown_sprites/83D2860/1.4bpp"); -static const u8 sSpriteImage_83D27C0[] = INCBIN_U8("graphics/unknown_sprites/83D2860/2.4bpp"); -static const u16 sPalette_3D2840[] = INCBIN_U16("graphics/unknown/unknown_3D2840.gbapal"); - - -static const struct SpriteFrameImage sSpriteImageTable_83FD950[] = -{ - { sSpriteImage_83D26C0, sizeof(sSpriteImage_83D26C0) }, - { sSpriteImage_83D2740, sizeof(sSpriteImage_83D2740) }, - { sSpriteImage_83D27C0, sizeof(sSpriteImage_83D27C0) }, -}; - -static const struct SpritePalette sUnknown_083D2878 = { sPalette_3D2840, 0x1000 }; - -static const union AnimCmd sSpriteAnim_83D2880[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_FRAME(2, 30), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd *const sSpriteAnimTable_83D2890[] = -{ - sSpriteAnim_83D2880, -}; - -static const struct SpriteTemplate sSpriteTemplate_83D2894 = -{ - .tileTag = 0xFFFF, - .paletteTag = 0x1000, - .oam = &gFieldOamData_32x8, - .anims = sSpriteAnimTable_83D2890, - .images = sSpriteImageTable_83FD950, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -u8 CreateRecordMixingSprite(void) -{ - u8 spriteId; - - LoadSpritePalette(&sUnknown_083D2878); - - spriteId = CreateSprite(&sSpriteTemplate_83D2894, 0, 0, 82); - - if (spriteId == MAX_SPRITES) - { - return MAX_SPRITES; - } - else - { - struct Sprite *sprite = &gSprites[spriteId]; - sub_8060388(16, 13, &sprite->pos1.x, &sprite->pos1.y); - sprite->coordOffsetEnabled = TRUE; - sprite->pos1.x += 16; - sprite->pos1.y += 2; - } - - return spriteId; -} - -void DestroyRecordMixingSprite(void) -{ - int i; - - for (i = 0; i < MAX_SPRITES; i++) - { - if (gSprites[i].template == &sSpriteTemplate_83D2894) - { - FreeSpritePalette(&gSprites[i]); - DestroySprite(&gSprites[i]); - } - } -} diff --git a/src/field/fldeff_secret_base_pc.c b/src/field/fldeff_secret_base_pc.c deleted file mode 100644 index 394c4bc56..000000000 --- a/src/field/fldeff_secret_base_pc.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "task.h" - -static void Task_SecretBasePCTurnOn(u8); - -u32 FldEff_SecretBasePCTurnOn(void) -{ - s16 x, y; - u8 taskId; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - taskId = CreateTask(Task_SecretBasePCTurnOn, 0); - gTasks[taskId].data[0] = x; - gTasks[taskId].data[1] = y; - gTasks[taskId].data[2] = 0; - - return 0; -} - -static void Task_SecretBasePCTurnOn(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[2]) - { - case 4: - case 12: - MapGridSetMetatileIdAt(data[0], data[1], 548); - CurrentMapDrawMetatileAt(data[0], data[1]); - break; - case 8: - case 16: - MapGridSetMetatileIdAt(data[0], data[1], 544); - CurrentMapDrawMetatileAt(data[0], data[1]); - break; - case 20: - MapGridSetMetatileIdAt(data[0], data[1], 548); - CurrentMapDrawMetatileAt(data[0], data[1]); - FieldEffectActiveListRemove(FLDEFF_SECRET_BASE_PC_TURN_ON); - EnableBothScriptContexts(); - DestroyTask(taskId); - return; - } - - data[2]++; -} - -void DoSecretBasePCTurnOffEffect(void) -{ - s16 x, y; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - PlaySE(SE_PC_OFF); - - if (!VarGet(VAR_CURRENT_SECRET_BASE)) - MapGridSetMetatileIdAt(x, y, 3616); - else - MapGridSetMetatileIdAt(x, y, 3617); - - CurrentMapDrawMetatileAt(x, y); -} diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c deleted file mode 100644 index d1df03d84..000000000 --- a/src/field/fldeff_secretpower.c +++ /dev/null @@ -1,526 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "fieldmap.h" -#include "field_effect.h" -#include "field_player_avatar.h" -#include "metatile_behavior.h" -#include "metatile_behaviors.h" -#include "overworld.h" -#include "pokemon_menu.h" -#include "rom6.h" -#include "script.h" -#include "secret_base.h" -#include "constants/songs.h" -#include "sound.h" - -extern u8 gUnknown_081A2CE6[]; -extern u8 gUnknown_081A2D3E[]; -extern u8 gUnknown_081A2D96[]; - -const u8 gSpriteImage_83D198C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/0.4bpp"); -const u8 gSpriteImage_83D1A0C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/1.4bpp"); -const u8 gSpriteImage_83D1A8C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/2.4bpp"); -const u8 gSpriteImage_83D1B0C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/3.4bpp"); -const u8 gSpriteImage_83D1B8C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/4.4bpp"); -const u8 gUnusedEmptySpace_83D1C0C[32] = {0}; -const u16 gFieldEffectObjectPalette7[] = INCBIN_U16("graphics/field_effect_objects/palettes/07.gbapal"); -const u8 gSpriteImage_83D1C4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/0.4bpp"); -const u8 gSpriteImage_83D1CCC[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/1.4bpp"); -const u8 gSpriteImage_83D1D4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/2.4bpp"); -const u8 gSpriteImage_83D1DCC[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/3.4bpp"); -const u8 gSpriteImage_83D1E4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/4.4bpp"); -const u8 gSpriteImage_83D1ECC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/0.4bpp"); -const u8 gSpriteImage_83D1F4C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/1.4bpp"); -const u8 gSpriteImage_83D1FCC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/2.4bpp"); -const u8 gSpriteImage_83D204C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/3.4bpp"); -const u8 gSpriteImage_83D20CC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/4.4bpp"); -const u8 gSpriteImage_83D214C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/5.4bpp"); // unused -const u16 gFieldEffectObjectPalette8[] = INCBIN_U16("graphics/field_effect_objects/palettes/08.gbapal"); -const u8 gSpriteImage_83D21EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/0.4bpp"); -const u8 gSpriteImage_83D22EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/1.4bpp"); -const u8 gSpriteImage_83D23EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/2.4bpp"); - -const struct OamData gOamData_83D24EC = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_83D24F4[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(2, 8), - ANIMCMD_FRAME(3, 8), - ANIMCMD_FRAME(4, 8), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83D250C[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(2, 8), - ANIMCMD_FRAME(3, 8), - ANIMCMD_FRAME(4, 8), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83D2524[] = -{ - ANIMCMD_FRAME(4, 8), - ANIMCMD_FRAME(3, 8), - ANIMCMD_FRAME(2, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83D253C[] = -{ - ANIMCMD_FRAME(0, 8, .hFlip = TRUE), - ANIMCMD_FRAME(1, 8, .hFlip = TRUE), - ANIMCMD_FRAME(2, 8, .hFlip = TRUE), - ANIMCMD_FRAME(3, 8, .hFlip = TRUE), - ANIMCMD_FRAME(4, 8, .hFlip = TRUE), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83D2554[] = -{ - ANIMCMD_FRAME(4, 8, .hFlip = TRUE), - ANIMCMD_FRAME(3, 8, .hFlip = TRUE), - ANIMCMD_FRAME(2, 8, .hFlip = TRUE), - ANIMCMD_FRAME(1, 8, .hFlip = TRUE), - ANIMCMD_FRAME(0, 8, .hFlip = TRUE), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83D256C[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(2, 8), - ANIMCMD_FRAME(3, 8), - ANIMCMD_FRAME(4, 8), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_83D2584[] = -{ - gSpriteAnim_83D24F4, -}; - -const union AnimCmd *const gSpriteAnimTable_83D2588[] = -{ - gSpriteAnim_83D250C, - gSpriteAnim_83D2524, - gSpriteAnim_83D253C, - gSpriteAnim_83D2554, -}; - -const union AnimCmd *const gSpriteAnimTable_83D2598[] = -{ - gSpriteAnim_83D256C, -}; - -const struct SpriteFrameImage gSpriteImageTable_83D259C[] = -{ - {gSpriteImage_83D198C, 0x80}, - {gSpriteImage_83D1A0C, 0x80}, - {gSpriteImage_83D1A8C, 0x80}, - {gSpriteImage_83D1B0C, 0x80}, - {gSpriteImage_83D1B8C, 0x80}, -}; - -const struct SpriteFrameImage gSpriteImageTable_83D25C4[] = -{ - {gSpriteImage_83D1ECC, 0x80}, - {gSpriteImage_83D1F4C, 0x80}, - {gSpriteImage_83D1FCC, 0x80}, - {gSpriteImage_83D204C, 0x80}, - {gSpriteImage_83D20CC, 0x80}, -}; - -const struct SpriteFrameImage gSpriteImageTable_83D25EC[] = -{ - {gSpriteImage_83D1C4C, 0x80}, - {gSpriteImage_83D1CCC, 0x80}, - {gSpriteImage_83D1D4C, 0x80}, - {gSpriteImage_83D1DCC, 0x80}, - {gSpriteImage_83D1E4C, 0x80}, -}; - -void sub_80C644C(struct Sprite *); -const struct SpriteTemplate gSpriteTemplate_83D2614 = -{ - .tileTag = 0xFFFF, - .paletteTag = 4099, - .oam = &gOamData_83D24EC, - .anims = gSpriteAnimTable_83D2584, - .images = gSpriteImageTable_83D259C, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80C644C, -}; - -void sub_80C6598(struct Sprite *); -const struct SpriteTemplate gSpriteTemplate_83D262C = -{ - .tileTag = 0xFFFF, - .paletteTag = 4104, - .oam = &gOamData_83D24EC, - .anims = gSpriteAnimTable_83D2588, - .images = gSpriteImageTable_83D25C4, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80C6598, -}; - -void sub_80C66BC(struct Sprite *); -const struct SpriteTemplate gSpriteTemplate_83D2644 = -{ - .tileTag = 0xFFFF, - .paletteTag = 4104, - .oam = &gOamData_83D24EC, - .anims = gSpriteAnimTable_83D2598, - .images = gSpriteImageTable_83D25EC, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80C66BC, -}; - -const struct SpritePalette gFieldEffectObjectPaletteInfo7 = {gFieldEffectObjectPalette7, 0x1003}; -const struct SpritePalette gFieldEffectObjectPaletteInfo8 = {gFieldEffectObjectPalette8, 0x1008}; - -void sub_80C639C(void); -void sub_80C63E8(void); -void sub_80C6468(struct Sprite *); -void sub_80C6498(struct Sprite *); -void sub_80C64A8(void); -void sub_80C64F4(void); -void sub_80C65C4(struct Sprite *); -void sub_80C65FC(struct Sprite *); -void sub_80C660C(void); -void sub_80C6658(void); -void sub_80C66D8(struct Sprite *sprite); -void sub_80C6708(struct Sprite *sprite); - -void sub_80C6264(void) -{ - sub_80BBFD8(&gUnknown_0203923C, gMapHeader.events); - sub_80BB5E4(); -} - -void sub_80C6280(void) -{ - switch (gFieldEffectArguments[1]) - { - case 1: - gFieldEffectArguments[5] = 8; - gFieldEffectArguments[6] = 40; - break; - case 2: - gFieldEffectArguments[5] = 8; - gFieldEffectArguments[6] = 8; - break; - case 3: - gFieldEffectArguments[5] = -8; - gFieldEffectArguments[6] = 24; - break; - case 4: - gFieldEffectArguments[5] = 24; - gFieldEffectArguments[6] = 24; - break; - } -} - -#if DEBUG - -void debug_sub_80D93F4(void) -{ - u8 metatile; - - sub_80BB63C(); - - if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != 2) - { - ScriptContext2_Disable(); - return; - } - - GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - metatile = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y); - if (MetatileBehavior_IsSecretBaseCave(metatile) == TRUE) - { - sub_80C6264(); - gLastFieldPokeMenuOpened = 0; - sub_80C639C(); - } - else if (MetatileBehavior_IsSecretBaseTree(metatile) == TRUE) - { - sub_80C6264(); - gLastFieldPokeMenuOpened = 0; - sub_80C64A8(); - } - else if (MetatileBehavior_IsSecretBaseShrub(metatile) == TRUE) - { - sub_80C6264(); - gLastFieldPokeMenuOpened = 0; - sub_80C660C(); - } - else - { - ScriptContext2_Disable(); - } -} - -#endif - -bool8 SetUpFieldMove_SecretPower(void) -{ - u8 behavior; - - sub_80BB63C(); - - if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != DIR_NORTH) - return FALSE; - - GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); - behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y); - - if (MetatileBehavior_IsSecretBaseCave(behavior) == TRUE) - { - sub_80C6264(); - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_80C639C; - return TRUE; - } - - if (MetatileBehavior_IsSecretBaseTree(behavior) == TRUE) - { - sub_80C6264(); - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_80C64A8; - return TRUE; - } - - if (MetatileBehavior_IsSecretBaseShrub(behavior) == TRUE) - { - sub_80C6264(); - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_80C660C; - return TRUE; - } - - return FALSE; -} - -void sub_80C639C(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(gUnknown_081A2CE6); -} - -bool8 FldEff_UseSecretPowerCave(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (uintptr_t)sub_80C63E8 >> 16; - gTasks[taskId].data[9] = (uintptr_t)sub_80C63E8; - - return FALSE; -} - -void sub_80C63E8(void) -{ - FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_CAVE); - FieldEffectStart(FLDEFF_SECRET_POWER_CAVE); -} - -bool8 FldEff_SecretPowerCave(void) -{ - sub_80C6280(); - CreateSprite( - &gSpriteTemplate_83D2614, - gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5], - gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6], - 148); - return FALSE; -} - -void sub_80C644C(struct Sprite *sprite) -{ - PlaySE(SE_W088); - sprite->data[0] = 0; - sprite->callback = sub_80C6468; -} - -void sub_80C6468(struct Sprite *sprite) -{ - if (sprite->data[0] < 40) - { - sprite->data[0]++; - if (sprite->data[0] == 20 ) - sub_80BB800(); - } - else - { - sprite->data[0] = 0; - sprite->callback = sub_80C6498; - } -} - -void sub_80C6498(struct Sprite *sprite) -{ - FieldEffectStop(sprite, FLDEFF_SECRET_POWER_CAVE); - EnableBothScriptContexts(); -} - -void sub_80C64A8(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(gUnknown_081A2D3E); -} - -bool8 FldEff_UseSecretPowerTree(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (uintptr_t)sub_80C64F4 >> 16; - gTasks[taskId].data[9] = (uintptr_t)sub_80C64F4; - - return FALSE; -} - -void sub_80C64F4(void) -{ - FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_TREE); - FieldEffectStart(FLDEFF_SECRET_POWER_TREE); -} - -bool8 FldEff_SecretPowerTree(void) -{ - s16 behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y) & 0xFFF; - - if (behavior == MB_SECRET_BASE_SPOT_TREE_1) - { - gFieldEffectArguments[7] = 0; - } - - if (behavior == MB_SECRET_BASE_SPOT_TREE_2) - { - gFieldEffectArguments[7] = 2; - } - - sub_80C6280(); - - CreateSprite( - &gSpriteTemplate_83D262C, - gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5], - gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6], - 148); - - if (gFieldEffectArguments[7] == 1 || gFieldEffectArguments[7] == 3) - sub_80BB800(); - - return FALSE; -} - -void sub_80C6598(struct Sprite *sprite) -{ - PlaySE(SE_W010); - sprite->animNum = gFieldEffectArguments[7]; - sprite->data[0] = 0; - sprite->callback = sub_80C65C4; -} - -void sub_80C65C4(struct Sprite *sprite) -{ - sprite->data[0]++; - - if (sprite->data[0] >= 40) - { - if (gFieldEffectArguments[7] == 0 || gFieldEffectArguments[7] == 2) - sub_80BB800(); - sprite->data[0] = 0; - sprite->callback = sub_80C65FC; - } -} - - -void sub_80C65FC(struct Sprite *sprite) -{ - FieldEffectStop(sprite, FLDEFF_SECRET_POWER_TREE); - EnableBothScriptContexts(); -} - -void sub_80C660C(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(gUnknown_081A2D96); -} - -bool8 FldEff_UseSecretPowerShrub(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (uintptr_t)sub_80C6658 >> 16; - gTasks[taskId].data[9] = (uintptr_t)sub_80C6658; - - return FALSE; -} - -void sub_80C6658(void) -{ - FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_SHRUB); - FieldEffectStart(FLDEFF_SECRET_POWER_SHRUB); -} - -bool8 FldEff_SecretPowerShrub(void) -{ - sub_80C6280(); - CreateSprite( - &gSpriteTemplate_83D2644, - gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5], - gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6], - 148); - return FALSE; -} - -void sub_80C66BC(struct Sprite *sprite) -{ - PlaySE(SE_W077); - sprite->data[0] = 0; - sprite->callback = sub_80C66D8; -} - -void sub_80C66D8(struct Sprite *sprite) -{ - if (sprite->data[0] < 40) - { - sprite->data[0]++; - if (sprite->data[0] == 20 ) - sub_80BB800(); - } - else - { - sprite->data[0] = 0; - sprite->callback = sub_80C6708; - } -} - - -void sub_80C6708(struct Sprite *sprite) -{ - FieldEffectStop(sprite, FLDEFF_SECRET_POWER_SHRUB); - EnableBothScriptContexts(); -} diff --git a/src/field/fldeff_softboiled.c b/src/field/fldeff_softboiled.c deleted file mode 100644 index 3c64ec520..000000000 --- a/src/field/fldeff_softboiled.c +++ /dev/null @@ -1,148 +0,0 @@ -#include "global.h" -#include "fldeff_softboiled.h" -#include "menu.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_menu.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "strings.h" -#include "task.h" -#include "ewram.h" - -struct Struct2001000 { - u8 unk0; - u8 unk1; - u8 unk2; - u8 filler3[9]; - void *unkC; -}; - -struct Struct201C000 { - struct Pokemon *unk0; - u8 filler4[1]; - u8 unk5; - u16 unk6; - u8 filler8[4]; - s32 unkC; - void* unk10; - u8 filler14[26]; - s16 unk2E; -}; - -#if ENGLISH -#define WINDOW_LEFT 3 -#define WINDOW_RIGHT 26 -#elif GERMAN -#define WINDOW_LEFT 0 -#define WINDOW_RIGHT 29 -#endif - -// extern -extern u8 gUnknown_0202E8F6; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gUnknown_0202E8F4; - -// Static -static void sub_8133D50(u8 taskId); -static void sub_8133E74(u8 taskId); -static void sub_8133EB8(u8 taskId); -static void sub_8133EF8(void); - -bool8 SetUpFieldMove_SoftBoiled(void) { - u16 maxHp; - u16 hp; - u16 minHp; - - maxHp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAX_HP); - hp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HP); - - minHp = (maxHp / 5); - if (hp >= minHp) - { - return TRUE; - } - - return FALSE; -} - -void sub_8133D28(u8 taskid) { - EWRAM_1000.unkC = sub_8133D50; - EWRAM_1B000_2.unk272 = 3; - DoPokemonMenu_Switch(taskid); -} - -static void sub_8133D50(u8 taskId) { - u8 unk1, unk2; - u16 hp; - struct Pokemon *pokemon; - //struct Task *task; - - struct Sprite *sprites = gSprites; - - - unk1 = sprites[EWRAM_1000.unk1].data[0]; - unk2 = sprites[EWRAM_1000.unk2].data[0]; - - if (unk1 > 5 || unk2 > 5) - { - sub_806CD44(taskId); - return; - } - - EWRAM_1C000.unk0 = &gPlayerParty[sprites[EWRAM_1000.unk2].data[0]]; - hp = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP); - - if (hp == 0 || unk1 == unk2 || GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP) == hp) - { - sub_8133EB8(taskId); - return; - } - - PlaySE(SE_KAIFUKU); - - EWRAM_1C000.unk5 = gSprites[EWRAM_1000.unk1].data[0]; - - pokemon = &gPlayerParty[EWRAM_1C000.unk5]; - EWRAM_1C000.unk0 = pokemon; - EWRAM_1C000.unk6 = 0; - EWRAM_1C000.unkC = -0x8000; - EWRAM_1C000.unk10 = sub_8133EF8; - - - gTasks[taskId].data[10] = GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP); - gTasks[taskId].data[11] = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP); - gTasks[taskId].data[12] = gTasks[taskId].data[10] / 5; - - sub_806D5A4(); - gTasks[taskId].func = sub_806FA18; - EWRAM_1B000_2.unk282 = gTasks[taskId].data[11]; -} - -static void sub_8133E74(u8 taskId) { - if (gUnknown_0202E8F6) - { - return; - } - - Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - PrintPartyMenuPromptText(3, 0); - gTasks[taskId].func = HandlePartyMenuSwitchPokemonInput; -} - -static void sub_8133EB8(u8 taskId) { - gUnknown_0202E8F4 = 0; - sub_806D5A4(); - sub_806E834(gOtherText_CantUseOnPoke, 1); - gTasks[taskId].func = sub_8133E74; -} - -static void sub_8133EF8(void) { - sub_806CCE4(); - EWRAM_1B000_2.unk261 = 2; - DestroySprite(&gSprites[EWRAM_1000.unk1]); - Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - PrintPartyMenuPromptText(0, 0); - SwitchTaskToFollowupFunc(EWRAM_1000.unk0); -} diff --git a/src/field/fldeff_strength.c b/src/field/fldeff_strength.c deleted file mode 100644 index 9f9cd4013..000000000 --- a/src/field/fldeff_strength.c +++ /dev/null @@ -1,99 +0,0 @@ -#include "global.h" -#include "constants/map_objects.h" -#include "braille_puzzles.h" -#include "field_effect.h" -#include "party_menu.h" -#include "pokemon.h" -#include "pokemon_menu.h" -#include "rom6.h" -#include "script.h" -#include "task.h" -#include "text.h" - -static void sub_811AA18(void); -static void sub_811AA38(void); -static void sub_811AA9C(void); - -extern u8 gLastFieldPokeMenuOpened; -extern u16 gSpecialVar_Result; -extern void (*gFieldCallback)(void); -extern void (*gUnknown_03005CE4)(void); - -extern u8 S_UseStrength[]; - -#if DEBUG -void debug_sub_8130318(void) -{ - if (ShouldDoBrailleStrengthEffect()) - { - gLastFieldPokeMenuOpened = 0; - gSpecialVar_Result = 0; - sub_811AA38(); - } - else if (npc_before_player_of_type(MAP_OBJ_GFX_PUSHABLE_BOULDER) == TRUE) - { - gLastFieldPokeMenuOpened = 0; - gSpecialVar_Result = 0; - sub_811AA18(); - } - else - { - ScriptContext2_Disable(); - } -} -#endif - -bool8 SetUpFieldMove_Strength(void) -{ - if (ShouldDoBrailleStrengthEffect()) - { - gSpecialVar_Result = gLastFieldPokeMenuOpened; - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_811AA38; - } - else - { - if (npc_before_player_of_type(87) != TRUE) - return 0; - gSpecialVar_Result = gLastFieldPokeMenuOpened; - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_811AA18; - } - - return TRUE; -} - -static void sub_811AA18(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - ScriptContext1_SetupScript(S_UseStrength); -} - -static void sub_811AA38(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - FieldEffectStart(FLDEFF_USE_STRENGTH); -} - -bool8 FldEff_UseStrength(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_811AA9C >> 16; - gTasks[taskId].data[9] = (u32)sub_811AA9C; - GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1); - return FALSE; -} - -static void sub_811AA9C(void) -{ - if (ShouldDoBrailleStrengthEffect()) - { - DoBrailleStrengthEffect(); - } - else - { - FieldEffectActiveListRemove(40); - EnableBothScriptContexts(); - } -} diff --git a/src/field/fldeff_sweetscent.c b/src/field/fldeff_sweetscent.c deleted file mode 100644 index b9dbf619d..000000000 --- a/src/field/fldeff_sweetscent.c +++ /dev/null @@ -1,88 +0,0 @@ -#include "global.h" -#include "field_effect.h" -#include "field_player_avatar.h" -#include "palette.h" -#include "pokemon_menu.h" -#include "rom6.h" -#include "script.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "wild_encounter.h" - -static void sub_812BFD4(void); -static void sub_812C01C(void); -static void sub_812C084(u8); -static void sub_812C118(u8); - -extern u8 gLastFieldPokeMenuOpened; -extern void (*gFieldCallback)(void); -extern void (*gUnknown_03005CE4)(void); - -extern u8 SweetScentNothingHereScript[]; - -bool8 SetUpFieldMove_SweetScent(void) -{ - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_812BFD4; - return TRUE; -} - -static void sub_812BFD4(void) -{ - FieldEffectStart(FLDEFF_SWEET_SCENT); - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; -} - -bool8 FldEff_SweetScent() -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_812C01C >> 16; - gTasks[taskId].data[9] = (u32)sub_812C01C; - return FALSE; -} - -static void sub_812C01C(void) -{ - u8 taskId; - - PlaySE(0xEC); - BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, 0x1F); - taskId = CreateTask(sub_812C084, 0); - gTasks[taskId].data[0] = 0; - FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT); -} - -static void sub_812C084(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gTasks[taskId].data[0] == 64) - { - gTasks[taskId].data[0] = 0; - if (SweetScentWildEncounter() == TRUE) - { - DestroyTask(taskId); - } - else - { - gTasks[taskId].func = sub_812C118; - BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, 0x1F); - } - } - else - { - gTasks[taskId].data[0]++; - } - } -} - -static void sub_812C118(u8 taskId) -{ - if (!gPaletteFade.active) - { - ScriptContext1_SetupScript(SweetScentNothingHereScript); - DestroyTask(taskId); - } -} diff --git a/src/field/fldeff_teleport.c b/src/field/fldeff_teleport.c deleted file mode 100644 index af48fb414..000000000 --- a/src/field/fldeff_teleport.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "global.h" -#include "fldeff_teleport.h" -#include "field_effect.h" -#include "field_player_avatar.h" -#include "pokemon_menu.h" -#include "overworld.h" -#include "rom6.h" -#include "task.h" - -extern void (*gFieldCallback)(void); -extern u8 gLastFieldPokeMenuOpened; -extern void (*gUnknown_03005CE4)(void); - -bool8 SetUpFieldMove_Teleport(void) -{ - if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = hm_teleport_run_dp02scr; - return TRUE; - } - - return FALSE; -} - -void hm_teleport_run_dp02scr(void) -{ - Overworld_ResetStateAfterTeleport(); - FieldEffectStart(FLDEFF_USE_TELEPORT); - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; -} - -bool8 FldEff_UseTeleport(void) -{ - u8 taskId = oei_task_add(); - gTasks[taskId].data[8] = (u32)sub_814A404 >> 16; - gTasks[taskId].data[9] = (u32)sub_814A404; - SetPlayerAvatarTransitionFlags(1); - return 0; -} - -void sub_814A404(void) -{ - FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT); - sub_8087BA8(); -} diff --git a/src/field/heal_location.c b/src/field/heal_location.c deleted file mode 100644 index a10c7a7b8..000000000 --- a/src/field/heal_location.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "global.h" -#include "heal_location.h" -#include "constants/maps.h" - -#define NUM_HEAL_LOCATIONS 22 - -static const struct HealLocation sHealLocations[] = -{ - {MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), 4, 2}, - {MAP_GROUP(LITTLEROOT_TOWN_MAYS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_2F), 4, 2}, - {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), 20, 17}, - {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), 19, 20}, - {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), 22, 6}, - {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), 16, 39}, - {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), 5, 7}, - {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), 24, 15}, - {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), 28, 17}, - {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), 43, 32}, - {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 27, 49}, - {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 5, 9}, - {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 14, 9}, - {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), 6, 17}, - {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), 2, 11}, - {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), 9, 7}, - {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), 14, 8}, - {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), 16, 4}, - {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), 8, 16}, - {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 18, 6}, - {MAP_GROUP(BATTLE_TOWER_OUTSIDE), MAP_NUM(BATTLE_TOWER_OUTSIDE), 14, 9}, - {MAP_GROUP(SOUTHERN_ISLAND_EXTERIOR), MAP_NUM(SOUTHERN_ISLAND_EXTERIOR), 15, 20}, -}; - -u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum) -{ - u32 i; - - for (i = 0; i < NUM_HEAL_LOCATIONS; i++) - { - if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum) - return i + 1; - } - return 0; -} - -const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum) -{ - u32 index = GetHealLocationIndexByMap(mapGroup, mapNum); - - if (index == 0) - return NULL; - else - return &sHealLocations[index - 1]; -} - -const struct HealLocation *GetHealLocation(u32 index) -{ - if (index == 0) - return NULL; - else if (index > NUM_HEAL_LOCATIONS) - return NULL; - else - return &sHealLocations[index - 1]; -} diff --git a/src/field/hof_pc.c b/src/field/hof_pc.c deleted file mode 100644 index 267ed4274..000000000 --- a/src/field/hof_pc.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "global.h" -#include "hall_of_fame.h" -#include "main.h" -#include "palette.h" -#include "overworld.h" -#include "script.h" -#include "script_menu.h" -#include "task.h" - -extern void (*gFieldCallback)(void); -extern void (*gUnknown_0300485C)(void); - -static void ReshowPCMenuAfterHallOfFamePC(void); -static void Task_WaitForPaletteFade(u8); - -void AccessHallOfFamePC(void) -{ - SetMainCallback2(sub_81428CC); - ScriptContext2_Enable(); -} - -void ReturnFromHallOfFamePC(void) -{ - SetMainCallback2(c2_exit_to_overworld_2_switch); - gFieldCallback = ReshowPCMenuAfterHallOfFamePC; -} - -static void ReshowPCMenuAfterHallOfFamePC(void) -{ - ScriptContext2_Enable(); - Overworld_PlaySpecialMapMusic(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); - ScrSpecial_CreatePCMenu(); - ScriptMenu_DisplayPCStartupPrompt(); - CreateTask(Task_WaitForPaletteFade, 10); -} - -static void Task_WaitForPaletteFade(u8 taskId) -{ - if (!gPaletteFade.active) - DestroyTask(taskId); -} diff --git a/src/field/item.c b/src/field/item.c deleted file mode 100644 index af05c0a21..000000000 --- a/src/field/item.c +++ /dev/null @@ -1,697 +0,0 @@ -#include "global.h" -#include "constants/hold_effects.h" -#include "item.h" -#include "constants/items.h" -#include "item_menu.h" -#include "item_use.h" -#include "berry.h" -#include "string_util.h" -#include "strings.h" - -struct Item -{ - u8 name[14]; - u16 itemId; - u16 price; - u8 holdEffect; - u8 holdEffectParam; - const u8 *description; - u8 importance; - u8 unk19; - u8 pocket; - u8 type; - ItemUseFunc fieldUseFunc; - u8 battleUsage; - ItemUseFunc battleUseFunc; - u8 secondaryId; -}; - -extern u8 gUnknown_02038560; -extern struct BagPocket gBagPockets[NUM_BAG_POCKETS]; - -// These constants are used in gItems -enum -{ - POCKET_NONE, - POCKET_ITEMS, - POCKET_POKE_BALLS, - POCKET_TM_HM, - POCKET_BERRIES, - POCKET_KEY_ITEMS, -}; - -enum -{ - ITEMS_POCKET, - BALLS_POCKET, - TMHM_POCKET, - BERRIES_POCKET, - KEYITEMS_POCKET -}; - -#if ENGLISH -#include "../data/item_descriptions_en.h" -#include "../data/items_en.h" -#elif GERMAN -#include "../data/item_descriptions_de.h" -#include "../data/items_de.h" -#endif - -static void CompactPCItems(void); - -void CopyItemName(u16 itemId, u8 *string) -{ - if (itemId == ITEM_ENIGMA_BERRY) - { - StringCopy(string, GetBerryInfo(0x2B)->name); // berry 0x2b = enigma berry - StringAppend(string, gOtherText_Berry2); - } - else - { - StringCopy(string, ItemId_GetName(itemId)); - } -} - -//Unreferenced -s8 CountUsedBagPocketSlots(u8 pocket) -{ - u8 i; - - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == 0) - return i; - } - return -1; -} - -bool8 IsBagPocketNonEmpty(u8 pocket) -{ - u8 i; - - for (i = 0; i < gBagPockets[pocket - 1].capacity; i++) - { - if (gBagPockets[pocket - 1].itemSlots[i].itemId != 0) - return TRUE; - } - return FALSE; -} - -bool8 CheckBagHasItem(u16 itemId, u16 count) -{ - u8 i; - u8 pocket; - - if (ItemId_GetPocket(itemId) == 0) - return FALSE; - pocket = ItemId_GetPocket(itemId) - 1; - //Check for item slots that contain the item - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - { - //Does this item slot contain enough of the item? - if (gBagPockets[pocket].itemSlots[i].quantity >= count) - return TRUE; - count -= gBagPockets[pocket].itemSlots[i].quantity; - //Does this item slot and all previous slots contain enough of the item? - if (count == 0) - return TRUE; - } - } - return FALSE; -} - -bool8 CheckBagHasSpace(u16 itemId, u16 count) -{ - u8 i; - u8 pocket; - u16 slotCapacity; - - if (ItemId_GetPocket(itemId) == 0) - return FALSE; - pocket = ItemId_GetPocket(itemId) - 1; - if (pocket != BERRIES_POCKET) - slotCapacity = 99; - else - slotCapacity = 999; - - //Check space in any existing item slots that already contain this item - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - { - if (gBagPockets[pocket].itemSlots[i].quantity + count <= slotCapacity) - return TRUE; - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) - return FALSE; - count -= slotCapacity - gBagPockets[pocket].itemSlots[i].quantity; - if (count == 0) - return TRUE; - } - } - - //Check space in empty item slots - if (count > 0) - { - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == 0) - { - if (count <= slotCapacity) - return TRUE; - else - count -= slotCapacity; - } - } - if (count > 0) - return FALSE; //No more item slots. The bag is full - } - - return TRUE; -} - -// This function matches if gBagPockets is declared non-const, -// but it should be fixed anyway. -//#ifdef NONMATCHING -bool8 AddBagItem(u16 itemId, u16 count) -{ - u8 i; - u8 pocket; - u16 slotCapacity; - struct ItemSlot newItems[64]; - - if (ItemId_GetPocket(itemId) == 0) - return FALSE; - pocket = ItemId_GetPocket(itemId) - 1; - //Copy the bag pocket - memcpy(newItems, gBagPockets[pocket].itemSlots, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); - if (pocket != BERRIES_POCKET) - slotCapacity = 99; - else - slotCapacity = 999; - - //Use any item slots that already contain this item - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (newItems[i].itemId == itemId) - { - if (newItems[i].quantity + count <= slotCapacity) - { - newItems[i].quantity += count; - //Copy pocket back into the bag. - memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); - return TRUE; - } - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) - return FALSE; - count -= slotCapacity - newItems[i].quantity; - newItems[i].quantity = slotCapacity; - if (count == 0) - goto copy_items; - } - } - - //Put any remaining items into new item slots. - if (count > 0) - { - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (newItems[i].itemId == 0) - { - newItems[i].itemId = itemId; - if (count <= slotCapacity) - { - newItems[i].quantity = count; - goto copy_items; - } - count -= slotCapacity; - newItems[i].quantity = slotCapacity; - } - } - if (count > 0) - return FALSE; //No more empty item slots. The bag is full. - } - - copy_items: - //Copy pocket back into the bag. - memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); - return TRUE; -} -//#else -//__attribute__((naked)) -//bool8 AddBagItem(u16 itemId, u16 count) -//{ -// asm(".syntax unified\n\ -// push {r4-r7,lr}\n\ -// mov r7, r9\n\ -// mov r6, r8\n\ -// push {r6,r7}\n\ -// sub sp, 0x100\n\ -// lsls r0, 16\n\ -// lsrs r0, 16\n\ -// mov r8, r0\n\ -// lsls r1, 16\n\ -// lsrs r4, r1, 16\n\ -// bl ItemId_GetPocket\n\ -// lsls r0, 24\n\ -// cmp r0, 0\n\ -// beq _080A9510\n\ -// mov r0, r8\n\ -// bl ItemId_GetPocket\n\ -// subs r0, 0x1\n\ -// lsls r0, 24\n\ -// lsrs r6, r0, 24\n\ -// ldr r1, _080A94F8 @ =gBagPockets\n\ -// lsls r0, r6, 3\n\ -// adds r5, r0, r1\n\ -// ldr r1, [r5]\n\ -// ldrb r2, [r5, 0x4]\n\ -// lsls r2, 2\n\ -// mov r0, sp\n\ -// bl memcpy\n\ -// ldr r7, _080A94FC @ =0x000003e7\n\ -// cmp r6, 0x3\n\ -// beq _080A9468\n\ -// movs r7, 0x63\n\ -//_080A9468:\n\ -// movs r1, 0\n\ -// ldrb r0, [r5, 0x4]\n\ -// cmp r1, r0\n\ -// bcs _080A94B2\n\ -// subs r0, r6, 0x2\n\ -// lsls r0, 24\n\ -// lsrs r0, 24\n\ -// mov r12, r0\n\ -//_080A9478:\n\ -// lsls r0, r1, 2\n\ -// mov r2, sp\n\ -// adds r3, r2, r0\n\ -// ldrh r0, [r3]\n\ -// cmp r0, r8\n\ -// bne _080A94A6\n\ -// ldrh r2, [r3, 0x2]\n\ -// adds r0, r2, r4\n\ -// cmp r0, r7\n\ -// ble _080A9500\n\ -// mov r0, r12\n\ -// cmp r0, 0x1\n\ -// bls _080A9510\n\ -// subs r0, r7, r2\n\ -// subs r0, r4, r0\n\ -// lsls r0, 16\n\ -// lsrs r4, r0, 16\n\ -// strh r7, [r3, 0x2]\n\ -// ldr r2, _080A94F8 @ =gBagPockets\n\ -// mov r9, r2\n\ -// lsls r3, r6, 3\n\ -// cmp r4, 0\n\ -// beq _080A9516\n\ -//_080A94A6:\n\ -// adds r0, r1, 0x1\n\ -// lsls r0, 24\n\ -// lsrs r1, r0, 24\n\ -// ldrb r0, [r5, 0x4]\n\ -// cmp r1, r0\n\ -// bcc _080A9478\n\ -//_080A94B2:\n\ -// ldr r2, _080A94F8 @ =gBagPockets\n\ -// mov r9, r2\n\ -// lsls r3, r6, 3\n\ -// cmp r4, 0\n\ -// beq _080A9516\n\ -// movs r1, 0\n\ -// adds r0, r3, r2\n\ -// ldrb r0, [r0, 0x4]\n\ -// cmp r1, r0\n\ -// bcs _080A94F2\n\ -// mov r6, r9\n\ -// adds r5, r3, r6\n\ -//_080A94CA:\n\ -// lsls r0, r1, 2\n\ -// mov r6, sp\n\ -// adds r2, r6, r0\n\ -// ldrh r0, [r2]\n\ -// cmp r0, 0\n\ -// bne _080A94E6\n\ -// mov r0, r8\n\ -// strh r0, [r2]\n\ -// cmp r4, r7\n\ -// bls _080A9514\n\ -// subs r0, r4, r7\n\ -// lsls r0, 16\n\ -// lsrs r4, r0, 16\n\ -// strh r7, [r2, 0x2]\n\ -//_080A94E6:\n\ -// adds r0, r1, 0x1\n\ -// lsls r0, 24\n\ -// lsrs r1, r0, 24\n\ -// ldrb r2, [r5, 0x4]\n\ -// cmp r1, r2\n\ -// bcc _080A94CA\n\ -//_080A94F2:\n\ -// cmp r4, 0\n\ -// beq _080A9516\n\ -// b _080A9510\n\ -// .align 2, 0\n\ -//_080A94F8: .4byte gBagPockets\n\ -//_080A94FC: .4byte 0x000003e7\n\ -//_080A9500:\n\ -// strh r0, [r3, 0x2]\n\ -// ldr r0, _080A950C @ =gBagPockets\n\ -// lsls r1, r6, 3\n\ -// adds r1, r0\n\ -// b _080A951A\n\ -// .align 2, 0\n\ -//_080A950C: .4byte gBagPockets\n\ -//_080A9510:\n\ -// movs r0, 0\n\ -// b _080A9528\n\ -//_080A9514:\n\ -// strh r4, [r2, 0x2]\n\ -//_080A9516:\n\ -// mov r6, r9\n\ -// adds r1, r3, r6\n\ -//_080A951A:\n\ -// ldr r0, [r1]\n\ -// ldrb r2, [r1, 0x4]\n\ -// lsls r2, 2\n\ -// mov r1, sp\n\ -// bl memcpy\n\ -// movs r0, 0x1\n\ -//_080A9528:\n\ -// add sp, 0x100\n\ -// pop {r3,r4}\n\ -// mov r8, r3\n\ -// mov r9, r4\n\ -// pop {r4-r7}\n\ -// pop {r1}\n\ -// bx r1\n\ -// .syntax divided\n"); -//} -//#endif - -bool8 RemoveBagItem(u16 itemId, u16 count) -{ - u8 i; - u8 pocket; - u16 totalQuantity = 0; - - if (ItemId_GetPocket(itemId) == 0 || itemId == 0) - return FALSE; - pocket = ItemId_GetPocket(itemId) - 1; - - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - totalQuantity += gBagPockets[pocket].itemSlots[i].quantity; - } - if (totalQuantity < count) - return FALSE; //We don't have enough of the item - - if (gBagPockets[pocket].capacity > gUnknown_02038560 - && gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId == itemId) - { - if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity >= count) - { - gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity -= count; - count = 0; - } - else - { - count -= gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity; - gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity = 0; - } - if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity == 0) - gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId = 0; - if (count == 0) - return TRUE; - } - - for (i = 0; i < gBagPockets[pocket].capacity; i++) - { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) - { - if (gBagPockets[pocket].itemSlots[i].quantity >= count) - { - gBagPockets[pocket].itemSlots[i].quantity -= count; - count = 0; - } - else - { - count -= gBagPockets[pocket].itemSlots[i].quantity; - gBagPockets[pocket].itemSlots[i].quantity = 0; - } - if (gBagPockets[pocket].itemSlots[i].quantity == 0) - gBagPockets[pocket].itemSlots[i].itemId = 0; - if (count == 0) - return TRUE; - } - } - return TRUE; -} - -u8 GetPocketByItemId(u16 itemId) -{ - return ItemId_GetPocket(itemId); -} - -void ClearItemSlots(struct ItemSlot *itemSlots, u8 b) -{ - u16 i; - - for (i = 0; i < b; i++) - { - itemSlots[i].itemId = 0; - itemSlots[i].quantity = 0; - } -} - -static s32 FindFreePCItemSlot(void) -{ - s8 i; - - for (i = 0; i < 50; i++) - { - if (gSaveBlock1.pcItems[i].itemId == 0) - return i; - } - return -1; -} - -u8 CountUsedPCItemSlots(void) -{ - u8 usedSlots = 0; - u8 i; - - for (i = 0; i < 50; i++) - { - if (gSaveBlock1.pcItems[i].itemId != 0) - usedSlots++; - } - return usedSlots; -} - -bool8 CheckPCHasItem(u16 itemId, u16 count) -{ - u8 i; - - for (i = 0; i < 50; i++) - { - if (gSaveBlock1.pcItems[i].itemId == itemId && gSaveBlock1.pcItems[i].quantity >= count) - return TRUE; - } - return FALSE; -} - -bool8 AddPCItem(u16 itemId, u16 count) -{ - u8 i; - s8 freeSlot; - struct ItemSlot newItems[50]; - - //Copy PC items - memcpy(newItems, gSaveBlock1.pcItems, sizeof(newItems)); - - //Use any item slots that already contain this item - for (i = 0; i < 50; i++) - { - if (newItems[i].itemId == itemId) - { - if (newItems[i].quantity + count <= 999) - { - newItems[i].quantity += count; - memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); - return TRUE; - } - count += newItems[i].quantity - 999; - newItems[i].quantity = 999; - if (count == 0) - { - memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); - return TRUE; - } - } - } - - //Put any remaining items into a new item slot. - if (count > 0) - { - freeSlot = FindFreePCItemSlot(); - if (freeSlot == -1) - return FALSE; - newItems[freeSlot].itemId = itemId; - newItems[freeSlot].quantity = count; - } - - //Copy items back to the PC - memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); - return TRUE; -} - -void RemovePCItem(u8 index, u16 count) -{ - gSaveBlock1.pcItems[index].quantity -= count; - if (gSaveBlock1.pcItems[index].quantity == 0) - { - gSaveBlock1.pcItems[index].itemId = 0; - CompactPCItems(); - } -} - -static void CompactPCItems(void) -{ - u16 i; - u16 j; - - for (i = 0; i < 49; i++) - { - for (j = i + 1; j <= 49; j++) - { - if (gSaveBlock1.pcItems[i].itemId == 0) - { - struct ItemSlot temp = gSaveBlock1.pcItems[i]; - gSaveBlock1.pcItems[i] = gSaveBlock1.pcItems[j]; - gSaveBlock1.pcItems[j] = temp; - } - } - } -} - -void SwapRegisteredBike(void) -{ - switch (gSaveBlock1.registeredItem) - { - case 0x103: - gSaveBlock1.registeredItem = 0x110; - break; - case 0x110: - gSaveBlock1.registeredItem = 0x103; - break; - } -} - -static u16 SanitizeItemId(u16 itemId) -{ - if (itemId >= ARRAY_COUNT(gItems)) - return 0; - else - return itemId; -} - -const u8 *ItemId_GetName(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].name; -} - -u16 ItemId_GetId(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].itemId; -} - -u16 ItemId_GetPrice(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].price; -} - -u8 ItemId_GetHoldEffect(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].holdEffect; -} - -u8 ItemId_GetHoldEffectParam(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].holdEffectParam; -} - -const u8 *ItemId_GetDescription(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].description; -} - -bool32 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c) -{ - u32 r5 = c + 1; - const u8 *description = gItems[SanitizeItemId(itemId)].description; - u8 *str = a; - - for (;;) - { - if (*description == 0xFF || *description == 0xFE) - { - r5--; - if (r5 == 0) - { - *str = 0xFF; - return TRUE; - } - if (*description == 0xFF) - return FALSE; - str = a; - description++; - } - else - *(str++) = *(description++); - } -} - -u8 ItemId_GetImportance(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].importance; -} - -// unused -u8 ItemId_GetUnknownValue(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].unk19; -} - -u8 ItemId_GetPocket(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].pocket; -} - -u8 ItemId_GetType(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].type; -} - -ItemUseFunc ItemId_GetFieldFunc(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].fieldUseFunc; -} - -u8 ItemId_GetBattleUsage(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].battleUsage; -} - -ItemUseFunc ItemId_GetBattleFunc(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].battleUseFunc; -} - -u8 ItemId_GetSecondaryId(u16 itemId) -{ - return gItems[SanitizeItemId(itemId)].secondaryId; -} diff --git a/src/field/item_menu.c b/src/field/item_menu.c deleted file mode 100644 index 32b14e021..000000000 --- a/src/field/item_menu.c +++ /dev/null @@ -1,4607 +0,0 @@ -#include "global.h" -#include "berry.h" -#include "berry_tag_screen.h" -#include "data2.h" -#include "decompress.h" -#include "field_effect.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "graphics.h" -#include "item.h" -#include "constants/items.h" -#include "item_menu.h" -#include "item_use.h" -#include "link.h" -#include "mail_data.h" -#include "main.h" -#include "map_name_popup.h" -#include "menu.h" -#include "menu_cursor.h" -#include "menu_helpers.h" -#include "money.h" -#include "palette.h" -#include "party_menu.h" -#include "player_pc.h" -#include "pokemon_menu.h" -#include "overworld.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "strings.h" -#include "strings2.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "scanline_effect.h" -#include "menu_helpers.h" -#include "ewram.h" - -// External stuff -extern void gpu_pal_allocator_reset__manage_upper_four(void); -extern void SetVerticalScrollIndicatorPriority(); -extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16); -extern void PauseVerticalScrollIndicator(); -extern u8 sub_80F9284(void); -extern void sub_808B5B4(); -extern u8 sub_80F92F4(); -extern void sub_80C9C7C(u8); -extern void pal_fill_black(void); -extern bool8 IsWeatherNotFadingIn(void); -extern u8 sub_80F931C(); -extern void sub_808A3F8(u8); -extern void Shop_FadeReturnToMartMenu(void); -extern void sub_80546B8(u8); -extern void sub_804E990(u8); -extern void sub_802E424(u8); -extern void sub_8064E2C(void); - -struct UnknownStruct2 -{ - u8 unk0; - u8 textLine; - u8 unk2; -}; - -struct UnknownStruct3 -{ - u8 unk0; - u8 unk1; - u8 unk2; -}; - -struct UnknownStruct4 -{ - u8 unk0; - u8 unk1; - u16 unk2; - const u8 *unk4; - TaskFunc unk8; -}; - -struct UnknownStruct5 -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -}; - -struct UnknownStruct6 -{ - u8 unk0; -}; - -enum -{ - BAG_POCKET_ITEMS, // 0 - BAG_POCKET_POKE_BALLS, // 1 - BAG_POCKET_TMs_HMs, // 2 - BAG_POCKET_BERRIES, // 3 - BAG_POCKET_KEY_ITEMS, // 4 -}; - -enum -{ - RETURN_TO_FIELD_0, - RETURN_TO_BATTLE, - RETURN_TO_PKMN_LIST, - RETURN_TO_SHOP, - RETURN_TO_FIELD_4, - RETURN_TO_FIELD_5, - RETURN_TO_PC, - RETURN_TO_WALLY_BATTLE, -}; - -enum -{ - ITEM_ACTION_USE_0, // 0 - ITEM_ACTION_TOSS, // 1 - ITEM_ACTION_CANCEL_2, // 2 - ITEM_ACTION_REGISTER, // 3 - ITEM_ACTION_USE_4, // 4 - ITEM_ACTION_CANCEL_5, // 5 - ITEM_ACTION_GIVE, // 6 - ITEM_ACTION_CHECK_TAG, // 7 - ITEM_ACTION_NONE, // 8 - ITEM_ACTION_CONFIRM, // 9 -}; - -// ewram -EWRAM_DATA static struct UnknownStruct2 gUnknown_0203853C = {0}; -EWRAM_DATA static struct UnknownStruct3 gUnknown_02038540 = {0}; -EWRAM_DATA static struct UnknownStruct4 gUnknown_02038544 = {0}; -EWRAM_DATA static struct UnknownStruct5 gUnknown_02038550 = {0}; -EWRAM_DATA static struct UnknownStruct6 gUnknown_02038554 = {0}; // There are 3 bytes of padding after this, so I assume it's a struct -EWRAM_DATA static u8 gUnknown_02038558 = 0; -EWRAM_DATA static s8 sCurrentBagPocket = 0; -EWRAM_DATA static u8 gUnknown_0203855A = 0; -EWRAM_DATA static s8 gUnknown_0203855B = 0; -EWRAM_DATA static s8 gUnknown_0203855C = 0; -EWRAM_DATA u16 gSpecialVar_ItemId = 0; -EWRAM_DATA u8 gUnknown_02038560 = 0; -EWRAM_DATA u8 gUnknown_02038561 = 0; -EWRAM_DATA static u8 gUnknown_02038562 = 0; -EWRAM_DATA static u8 gUnknown_02038563 = 0; -EWRAM_DATA static u8 gUnknown_02038564 = 0; -EWRAM_DATA static u8 sPokeballSpriteId ALIGNED(4) = 0; // HACK: why is there a space before this variable? - -// bss -static u8 sPopupMenuSelection; -static u8 sReturnLocation; -static const u8 *sPopupMenuActionList; - -// common -void (*gFieldItemUseCallback)(u8) = NULL; -extern u16 gBattle_BG1_Y; -extern struct PocketScrollState gBagPocketScrollStates[]; -extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots -extern const u8 Event_NoRegisteredItem[]; - -// TODO: decompile the debug code so we can use static in this file -#define static - -extern const struct CompressedSpriteSheet sMaleBagSpriteSheet; -extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet; -extern const struct CompressedSpritePalette sBagSpritePalette; - -const struct BagPocket gBagPockets[NUM_BAG_POCKETS] = -{ - {gSaveBlock1.bagPocket_Items, 20}, - {gSaveBlock1.bagPocket_PokeBalls, 16}, - {gSaveBlock1.bagPocket_TMHM, 64}, - {gSaveBlock1.bagPocket_Berries, 46}, - {gSaveBlock1.bagPocket_KeyItems, 20}, -}; - -static void HandlePopupMenuAction_UseOnField(u8); -static void HandlePopupMenuAction_Toss(u8); -static void sub_80A5F80(u8); -static void HandlePopupMenuAction_Register(u8); -static void HandlePopupMenuAction_UseInBattle(u8); -static void sub_80A7124(u8); -static void HandlePopupMenuAction_Give(u8); -static void HandlePopupMenuAction_CheckTag(u8); -static void HandlePopupMenuAction_Confirm(u8); - -static const struct MenuAction2 sItemPopupMenuActions[] = -{ - {OtherText_Use, HandlePopupMenuAction_UseOnField}, - {OtherText_Toss, HandlePopupMenuAction_Toss}, - {gOtherText_CancelNoTerminator, sub_80A5F80}, - {OtherText_Register, HandlePopupMenuAction_Register}, - {OtherText_Use, HandlePopupMenuAction_UseInBattle}, - {gOtherText_CancelNoTerminator, sub_80A7124}, - {OtherText_Give2, HandlePopupMenuAction_Give}, - {OtherText_CheckTag, HandlePopupMenuAction_CheckTag}, - {gOtherText_CancelWithTerminator, NULL}, - {OtherText_Confirm, HandlePopupMenuAction_Confirm}, -}; - -static const u8 sItemPopupMenuChoicesTable[][6] = -{ - [BAG_POCKET_ITEMS] = - { - ITEM_ACTION_USE_0, - ITEM_ACTION_TOSS, - ITEM_ACTION_GIVE, - ITEM_ACTION_CANCEL_2, - }, - - [BAG_POCKET_POKE_BALLS] = - { - ITEM_ACTION_GIVE, - ITEM_ACTION_TOSS, - ITEM_ACTION_NONE, - ITEM_ACTION_CANCEL_2, - }, - - [BAG_POCKET_TMs_HMs] = - { - ITEM_ACTION_USE_0, - ITEM_ACTION_NONE, - ITEM_ACTION_GIVE, - ITEM_ACTION_CANCEL_2, - }, - - [BAG_POCKET_BERRIES] = - { - ITEM_ACTION_CHECK_TAG, - ITEM_ACTION_USE_0, - ITEM_ACTION_TOSS, - ITEM_ACTION_NONE, - ITEM_ACTION_GIVE, - ITEM_ACTION_CANCEL_2 - }, - - [BAG_POCKET_KEY_ITEMS] = - { - ITEM_ACTION_USE_0, - ITEM_ACTION_NONE, - ITEM_ACTION_REGISTER, - ITEM_ACTION_CANCEL_2, - }, -}; - -const u8 gUnknown_083C16AE[][2] = -{ - {6, 2}, - {6, 2}, - {6, 2}, - {6, 2}, - {2, 0}, -}; - -const u8 gUnknown_083C16B8[] = {7, 9, 8, 2}; - -static void OnItemSelect_Field05(u8); -static void OnBagClose_Field0(u8); -static void OnBagClose_PkmnList(u8); -static void OnItemSelect_PkmnList(u8); -static void OnBagClose_Shop(u8); -static void OnItemSelect_Shop(u8); -static void OnBagClose_Field4(u8); -static void OnItemSelect_Field4(u8); -static void OnBagClose_Field5(u8); -static void OnBagClose_PC(u8); -static void OnItemSelect_PC(u8); -static void OnItemSelect_Battle(u8); -static void OnBagClose_Battle(u8); - -static const struct {TaskFunc onItemSelect; TaskFunc onBagClose;} gUnknown_083C16BC[] = -{ - [RETURN_TO_FIELD_0] = {OnItemSelect_Field05, OnBagClose_Field0}, - [RETURN_TO_BATTLE] = {OnItemSelect_Battle, OnBagClose_Battle}, - [RETURN_TO_PKMN_LIST] = {OnItemSelect_PkmnList, OnBagClose_PkmnList}, - [RETURN_TO_SHOP] = {OnItemSelect_Shop, OnBagClose_Shop}, - [RETURN_TO_FIELD_4] = {OnItemSelect_Field4, OnBagClose_Field4}, - [RETURN_TO_FIELD_5] = {OnItemSelect_Field05, OnBagClose_Field5}, - [RETURN_TO_PC] = {OnItemSelect_PC, OnBagClose_PC}, -}; - -static void sub_80A5E60(u8); -static void sub_80A5E90(u8); - -static const struct YesNoFuncTable gUnknown_083C16F4 = {sub_80A5E60, sub_80A5E90}; - -static void sub_80A65AC(u8); -static void sub_80A6618(u8); - -const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618}; - -void sub_80A34E8(void); -static bool8 LoadBagGraphicsMultistep(void); -static void sub_80A362C(void); -static void sub_80A3740(void); -static void sub_80A396C(u16 *, u8, u8, u8); -static void sub_80A39B8(u16 *, u8); -static void sub_80A39E4(u16 *, u8, u8, s8); -static void DrawPocketIndicatorDots(u16 *, u8); -static void SortItemSlots(struct BagPocket); -static void UpdateAllBagPockets(void); -static void sub_80A3D24(u8); -static void sub_80A3D40(void); -static void RemoveSelectIconFromRegisteredItem(void); -static void sub_80A48E8(u16, int, int); -static void ItemListMenu_InitDescription(s16); -static void ItemListMenu_ChangeDescription(s16, int); -static void sub_80A4F68(u8); -static void sub_80A50C8(u8); -static void sub_80A5AE4(u8); -static void sub_80A5BF8(u8); -static void Task_CallItemUseOnFieldCallback(u8); -static void sub_80A6444(u8); -static void sub_80A648C(u8); -static void Task_BuyHowManyDialogueHandleInput(u8); -static void BuyMenuPrintItemQuantityAndPrice(u8); -static void BuyMenuDisplayMessage(u16, u16); -static void sub_80A683C(void); -static void sub_80A6870(u16, u8); -static void sub_80A699C(void); -static void sub_80A7230(u8); -static void ItemListMenu_InitMenu(void); -static void sub_80A73C0(void); -static void sub_80A73F0(void); -static void sub_80A73FC(void); -static void sub_80A740C(void); -static void sub_80A7420(void); -static void sub_80A751C(void); -static void sub_80A7528(u8); -static void sub_80A7590(void); -static void sub_80A75E4(void); -static void sub_80A7630(void); -static void sub_80A763C(void); -static void sub_80A76A0(void); -static void sub_80A770C(void); -static void DisplayCannotUseItemMessage(int, const u8 *, TaskFunc, int); -static void sub_80A7768(void); -static void sub_80A7828(void); -static void sub_80A7834(int, int); -static bool32 sub_80A78A0(void); -static void sub_80A78B8(void); -static bool32 sub_80A78C4(void); -static void sub_80A78E8(void); -static int sub_80A78F4(void); -static void sub_80A7918(void); -static int sub_80A7924(void); -static int sub_80A7958(void); -static void sub_80A7970(void); -static void sub_80A797C(void); -static int sub_80A7988(void); -static void sub_80A79B4(struct Sprite *); -static void sub_80A79EC(struct Sprite *); -static void sub_80A7A94(struct Sprite *); -static void sub_80A7AE4(struct Sprite *); -static void CreateBagSprite(void); -static void sub_80A7B6C(struct Sprite *); -static void CreateBagPokeballSprite(u8); -static void sub_80A7C64(void); - -static void sub_80A3118(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - sub_80A740C(); - UpdatePaletteFade(); -} - -static void sub_80A3134(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0x2000), 0x800); - DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x6000), 0x800); -} - -static bool8 SetupBagMultistep(void) -{ - u32 index; - u16 savedIme; - - switch (gMain.state) - { - case 0: - ClearVideoCallbacks(); - sub_80A34E8(); - gMain.state++; - break; - case 1: - ScanlineEffect_Stop(); - gMain.state++; - break; - case 2: - gpu_pal_allocator_reset__manage_upper_four(); - gMain.state++; - break; - case 3: - ClearBGTilemapBuffers(); - ewramBagSetupStep = 0; - gMain.state++; - break; - case 4: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = TRUE; - gMain.state++; - break; - case 5: - ResetSpriteData(); - gMain.state++; - break; - case 6: - if (LoadBagGraphicsMultistep() == FALSE) - break; - gMain.state++; - break; - case 7: - Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); - gMain.state++; - break; - case 8: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC); - gMain.state++; - break; - case 9: - if (!MultistepInitMenuWindowContinue()) - break; - gMain.state++; - break; - case 10: - ClearVerticalScrollIndicatorPalettes(); - LoadScrollIndicatorPalette(); - CreateVerticalScrollIndicators(TOP_ARROW, 172, 12); - CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148); - CreateVerticalScrollIndicators(LEFT_ARROW, 28, 88); - CreateVerticalScrollIndicators(RIGHT_ARROW, 100, 88); - SetVerticalScrollIndicatorPriority(TOP_ARROW, 2); - SetVerticalScrollIndicatorPriority(BOTTOM_ARROW, 2); - SetVerticalScrollIndicatorPriority(LEFT_ARROW, 2); - SetVerticalScrollIndicatorPriority(RIGHT_ARROW, 2); - if (sReturnLocation == RETURN_TO_FIELD_4 || sReturnLocation == RETURN_TO_FIELD_5) - { - SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE); - SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE); - } - gMain.state++; - break; - case 11: - gUnknown_0203855A = 16; - sub_80A39B8(gBGTilemapBuffers[2], sCurrentBagPocket + 1); - DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); - UpdateAllBagPockets(); - SortItemSlots(gBagPockets[2]); - SortItemSlots(gBagPockets[3]); - sub_80A3D40(); - gCurrentBagPocketItemSlots = gBagPockets[sCurrentBagPocket].itemSlots; - sub_80A362C(); - gMain.state++; - break; - case 12: - sub_80A48E8(0xFFFF, 0, 7); - index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - ItemListMenu_InitDescription(gCurrentBagPocketItemSlots[index].itemId); - ItemListMenu_InitMenu(); - gUnknown_0203855B = sCurrentBagPocket + 1; - gUnknown_0203855C = 0; - gMain.state++; - break; - case 13: - CreateBagSprite(); - CreateBagPokeballSprite(0); - sub_80A3740(); - gMain.state++; - break; - case 14: - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = FALSE; - gMain.state++; - break; - case 15: - if (sub_8055870() == TRUE) - break; - gMain.state++; - break; - case 16: - SetVBlankCallback(sub_80A3134); - SetMainCallback2(sub_80A3118); - sub_80A751C(); - sub_80A7630(); - sub_80A770C(); - sub_80A7828(); - sub_80A78B8(); -#if DEBUG - if (gLinkOpen == TRUE) - debug_sub_8008218((void *)(VRAM + 0xF5E0), 0x8000, (void *)(VRAM + 0xF800), 0); -#endif - return TRUE; - } - return FALSE; -} - -static bool8 sub_80A34B4(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - sPopupMenuSelection = 0; - ResetTasks(); - return TRUE; - } - if (sub_80F9344() == TRUE) - break; - } - return FALSE; -} - - -void sub_80A34E8(void) -{ - sub_80F9368(); - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(4) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - REG_BLDCNT = 0; -} - -static bool8 LoadBagGraphicsMultistep(void) -{ - switch (ewramBagSetupStep) - { - case 0: - LZDecompressVram(gBagScreen_Gfx, (void *)(VRAM + 0x4000)); - ewramBagSetupStep++; - break; - case 1: - CpuCopy16(gUnknown_08E77004, gBGTilemapBuffers[2], 0x800); - ewramBagSetupStep++; - break; - case 2: - if (gSaveBlock2.playerGender == MALE || sReturnLocation == RETURN_TO_WALLY_BATTLE) - LoadCompressedPalette(gBagScreenMale_Pal, 0, 64); - else - LoadCompressedPalette(gBagScreenFemale_Pal, 0, 64); - ewramBagSetupStep++; - break; - case 3: - if (gSaveBlock2.playerGender == MALE || sReturnLocation == RETURN_TO_WALLY_BATTLE) - LoadCompressedObjectPic(&sMaleBagSpriteSheet); - else - LoadCompressedObjectPic(&sFemaleBagSpriteSheet); - ewramBagSetupStep++; - break; - case 4: - LoadCompressedObjectPalette(&sBagSpritePalette); - ewramBagSetupStep = 0; - return TRUE; - } - return FALSE; -} - -static void sub_80A362C(void) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - u8 r3; - - if (sReturnLocation == RETURN_TO_FIELD_5) - r3 = gBagPocketScrollStates[i].numSlots - 1; - else - r3 = gBagPocketScrollStates[i].numSlots; - - if (gBagPocketScrollStates[i].scrollTop != 0) - { - if (gBagPocketScrollStates[i].scrollTop + gBagPocketScrollStates[i].cursorMax > r3) - gBagPocketScrollStates[i].scrollTop = r3 - gBagPocketScrollStates[i].cursorMax; - } - else - { - if (gBagPocketScrollStates[i].cursorPos > r3) - gBagPocketScrollStates[i].cursorPos = r3; - } - } -} - -void ResetBagScrollPositions(void) -{ - u16 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - { - gBagPocketScrollStates[i].cursorPos = 0; - gBagPocketScrollStates[i].scrollTop = 0; - gBagPocketScrollStates[i].numSlots = 0; - gBagPocketScrollStates[i].cursorMax = 0; - } - sCurrentBagPocket = 0; -} - -static void sub_80A36B8(u16 *a, u8 b, u8 c, u8 d, u8 e) -{ - u16 i; - u16 j; - - for (i = c; i <= c + e; i++) - { - for (j = b; j <= b + d; j++) - { - u32 index = j + i * 32; - - a[index] = 0; - } - } -} - -void ClearBag(void) -{ - u16 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); - ResetBagScrollPositions(); -} - -#if DEBUG - -const struct ItemSlot gUnknown_Debug_083EBC68[60] = -{ - {ITEM_POKE_BALL, 10}, - {ITEM_ULTRA_BALL, 15}, - {ITEM_GREAT_BALL, 20}, - {ITEM_MASTER_BALL, 25}, - {ITEM_ACRO_BIKE, 1 }, - {ITEM_OLD_ROD, 1 }, - {ITEM_GOOD_ROD, 1 }, - {ITEM_SUPER_ROD, 1 }, - {ITEM_POKEBLOCK_CASE, 1 }, - {ITEM_WAILMER_PAIL, 1 }, - {ITEM_ITEMFINDER, 1 }, - {ITEM_NONE, 1 }, -}; - -void debug_sub_80A3714(void) -{ - u16 arr[5]; - u16 i; - - for (i = 0; i < 5; i++) - arr[i] = 0; - for (i = 0; i < ARRAY_COUNT(gUnknown_Debug_083EBC68); i++) - { - u16 pocket; - - if (gUnknown_Debug_083EBC68[i].itemId == ITEM_NONE) - break; - pocket = ItemId_GetPocket(gUnknown_Debug_083EBC68[i].itemId) - 1; - gBagPockets[pocket].itemSlots[arr[pocket]] = gUnknown_Debug_083EBC68[i]; - arr[pocket]++; - } -} - -#endif - -static void sub_80A3740(void) -{ - const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; - - LoadPalette(&colors[1], 0xD1, sizeof(colors[1])); - LoadPalette(&colors[0], 0xD8, sizeof(colors[0])); -} - -static void sub_80A3770(void) -{ - if (sReturnLocation == RETURN_TO_FIELD_0) - { - sPopupMenuActionList = sItemPopupMenuChoicesTable[sCurrentBagPocket]; - if (sCurrentBagPocket != BAG_POCKET_BERRIES) - gUnknown_02038564 = 4; - else - gUnknown_02038564 = 6; - } -} - -static void sub_80A37C0(u8 taskId) -{ - gTasks[taskId].func = sub_80A50C8; - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - StartVerticalScrollIndicators(LEFT_ARROW); - StartVerticalScrollIndicators(RIGHT_ARROW); -} - -static void sub_80A37F8(u8 taskId) -{ - u8 r5 = gUnknown_0203855A; - - if (r5 < 16) - { - gUnknown_0203855A++; - sub_80A396C(gBGTilemapBuffers[2], r5, gUnknown_0203855A, 0x4F); - sub_80A39E4(gBGTilemapBuffers[2], sCurrentBagPocket + 1, gUnknown_0203855A / 2, gTasks[taskId].data[5]); - gUnknown_02038558 = 1; - sub_80A48E8(taskId, r5 / 2, gUnknown_0203855A / 2 - 1); - gUnknown_02038558 = 0; - return; - } - - if (gLinkOpen == TRUE) - { - u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - - ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, gUnknown_02038562); - gUnknown_02038562++; - } - else - { - while (gUnknown_02038562 < 3) - { - u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - - ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, gUnknown_02038562); - gUnknown_02038562++; - } - } - if (gUnknown_02038562 == 3) - { - gUnknown_0203855A = 16; - gUnknown_0203855B = sCurrentBagPocket + 1; - sub_80A37C0(FindTaskIdByFunc(sub_80A4F68)); - DestroyTask(taskId); - ItemListMenu_InitMenu(); - SetVerticalScrollIndicators(LEFT_ARROW, VISIBLE); - SetVerticalScrollIndicators(RIGHT_ARROW, VISIBLE); - } -} - -static void sub_80A3954(u16 *a) -{ - CpuCopy16(gUnknown_08E77004, a, 0x800); -} - -static void sub_80A396C(u16 *a, u8 b, u8 c, u8 d) -{ - u16 *dst = a + 14 + (b + 2) * 32; - u16 i; - - while (c > b++) - { - for (i = 0; i < 15; i++) - dst[i] = d; - dst += 32; - } -} - -static void sub_80A39B8(u16 *a, u8 b) -{ - u8 var = b * 2; - - sub_809D104(a, 4, 10, gUnknown_08E96EC8, 0, var, 8, 2); -} - -static void sub_80A39E4(u16 *a, u8 b, u8 c, s8 d) -{ - u16 r2 = b * 2; - u16 r7; - - if (d == -1) - { - r7 = (b + 1) * 2; - if (b == 5) - r7 = 2; - - sub_809D104(a, 4, 10, gUnknown_08E96EC8, 8 - c, r2, c, 2); - sub_809D104(a, c + 4, 10, gUnknown_08E96EC8, 0, r7, 8 - c, 2); - } - else if (d == 1) - { - r7 = (b - 1) * 2; - if (b == 1) - r7 = 10; - - sub_809D104(a, 4, 10, gUnknown_08E96EC8, c, r7, 8 - c, 2); - sub_809D104(a, 12 - c, 10, gUnknown_08E96EC8, 0, r2, c, 2); - } -} - -// Draws dots under the bag sprite, showing which pocket is selected -static void DrawPocketIndicatorDots(u16 *tileMapBuffer, u8 selectedPocket) -{ - u8 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - { - if (i == selectedPocket) - tileMapBuffer[0x125 + i] = 0x107D; - else - tileMapBuffer[0x125 + i] = 0x107C; - } -} - -static void ChangePocket(u16 *tileMapBuffer, s8 delta) -{ - u8 taskId; - - sCurrentBagPocket += delta; - // Wrap around - if (sCurrentBagPocket >= NUM_BAG_POCKETS) - sCurrentBagPocket = 0; - if (sCurrentBagPocket < 0) - sCurrentBagPocket = NUM_BAG_POCKETS - 1; - - sub_80A76A0(); - sub_80A7590(); - gCurrentBagPocketItemSlots = gBagPockets[sCurrentBagPocket].itemSlots; - sub_80A3D24(sCurrentBagPocket); - gUnknown_0203855A = 0; - sub_80A3954(tileMapBuffer); - sub_80A396C(tileMapBuffer, 0, 16, 3); - sub_80A39B8(tileMapBuffer, 0); - gUnknown_0203855B = 6; - gUnknown_02038562 = 0; - taskId = FindTaskIdByFunc(sub_80A37F8); - if (taskId == 0xFF) - taskId = CreateTask(sub_80A37F8, 8); - gTasks[taskId].data[5] = delta; -} - -static void SwapItemSlots(struct ItemSlot *a, struct ItemSlot *b) -{ - struct ItemSlot temp = *a; - - *a = *b; - *b = temp; -} - -static void RemoveEmptyItemSlots(struct BagPocket pocket) -{ - u16 i; - u16 j; - - for (i = 0; i < pocket.capacity - 1; i++) - { - for (j = i + 1; j < pocket.capacity; j++) - { - if (pocket.itemSlots[i].quantity == 0) - SwapItemSlots(&pocket.itemSlots[i], &pocket.itemSlots[j]); - } - } -} - -static void SortItemSlots(struct BagPocket pocket) -{ - u16 i; - u16 j; - - for (i = 0; i < pocket.capacity; i++) - { - for (j = i + 1; j < pocket.capacity; j++) - { - if (pocket.itemSlots[i].quantity != 0 && pocket.itemSlots[j].quantity != 0 - && pocket.itemSlots[i].itemId > pocket.itemSlots[j].itemId) - SwapItemSlots(&pocket.itemSlots[i], &pocket.itemSlots[j]); - } - } -} - -static void UpdateBagPocket(u8 pocketNum) -{ - u16 i; - - gBagPocketScrollStates[pocketNum].numSlots = 0; - for (i = 0; i < gBagPockets[pocketNum].capacity; i++) - { - if (gBagPockets[pocketNum].itemSlots[i].quantity != 0) - gBagPocketScrollStates[pocketNum].numSlots++; - } - RemoveEmptyItemSlots(gBagPockets[pocketNum]); -} - -static void UpdateAllBagPockets(void) -{ - u8 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - UpdateBagPocket(i); -} - -static void sub_80A3D24(u8 pocketNum) -{ - if (gBagPocketScrollStates[pocketNum].numSlots >= 7) - gBagPocketScrollStates[pocketNum].cursorMax = 7; - else - gBagPocketScrollStates[pocketNum].cursorMax = gBagPocketScrollStates[pocketNum].numSlots; -} - -static void sub_80A3D40(void) -{ - u8 i; - - for (i = 0; i < NUM_BAG_POCKETS; i++) - sub_80A3D24(i); -} - -static void sub_80A3D5C(u8 taskId) -{ - u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - - gCurrentBagPocketItemSlots[index].quantity -= gTasks[taskId].data[1]; - if (gCurrentBagPocketItemSlots[index].quantity == 0) // item slot will be removed if the quantity is zero - { - // Un-register the item if registered - if (gSaveBlock1.registeredItem == gCurrentBagPocketItemSlots[index].itemId) - { - RemoveSelectIconFromRegisteredItem(); - gSaveBlock1.registeredItem = ITEM_NONE; - } - - gCurrentBagPocketItemSlots[index].itemId = ITEM_NONE; - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 7 == gBagPocketScrollStates[sCurrentBagPocket].numSlots - && gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - gBagPocketScrollStates[sCurrentBagPocket].scrollTop--; - UpdateBagPocket(sCurrentBagPocket); - } - sub_80A3D24(sCurrentBagPocket); -} - -void sub_80A3E0C(void) -{ - u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - - if (gCurrentBagPocketItemSlots[index].quantity == 0) - { - gCurrentBagPocketItemSlots[index].itemId = 0; - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 7 == gBagPocketScrollStates[sCurrentBagPocket].numSlots - && gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - gBagPocketScrollStates[sCurrentBagPocket].scrollTop--; - UpdateBagPocket(sCurrentBagPocket); - } - sub_80A3D24(sCurrentBagPocket); -} - -static void nullsub_16(void) -{ -} - -static void sub_80A3E70(u8 a, u8 b) -{ - struct ItemSlot temp = gCurrentBagPocketItemSlots[a]; - - gCurrentBagPocketItemSlots[a] = gCurrentBagPocketItemSlots[b]; - gCurrentBagPocketItemSlots[b] = temp; -} - -static void sub_80A3E90(u8 taskId) -{ - PlaySE(SE_SELECT); - nullsub_16(); - sub_80A3E70( - gTasks[taskId].data[10] - 1, - gBagPocketScrollStates[sCurrentBagPocket].cursorPos + gBagPocketScrollStates[sCurrentBagPocket].scrollTop); - gTasks[taskId].data[10] = 0; - sub_80A763C(); - sub_80A7528(0); - ItemListMenu_InitMenu(); -} - -static void sub_80A3EF4(u8 taskId) -{ - u8 r2; - - PlaySE(SE_SELECT); - nullsub_16(); - r2 = gTasks[taskId].data[10] - gBagPocketScrollStates[sCurrentBagPocket].scrollTop - 1; - gTasks[taskId].data[10] = 0; - if (r2 < 8) - sub_80A48E8(taskId, r2, r2); - sub_80A7528(0); -} - -static void sub_80A3F50(u8 taskId) -{ - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A7528(1); -} - -void sub_80A3FA0(u16 *a, u8 b, u8 c, u8 d, u8 e, u16 f) -{ - s16 i; - s16 j; - - for (i = c; i < c + e; i++) - { - for (j = b; j < b + d; j++) - { - u32 index = j + i * 32; - - a[index] = f; - } - } -} - -static void sub_80A4008(u16 *a, u8 b, u8 c, u8 d, u8 e) -{ - sub_80A3FA0(a, b, c, d, e, 1); -} - -static void DrawSelectIcon(u32 itemPos) -{ - u16 *ptr1 = gBGTilemapBuffers[2] + 0x5A; - - ptr1 += itemPos * 64; - ptr1[0] = 0x5A; - ptr1[1] = 0x5B; - ptr1[2] = 0x5C; - ptr1[32] = 0x6A; - ptr1[33] = 0x6B; - ptr1[34] = 0x6C; -} - -static void MoveSelectIcon(u8 itemPos) -{ - u16 i; - u16 *ptr; - - ptr = gBGTilemapBuffers[2] + 0x5A; - for (i = 0; i < 16; i++) - { - ptr[0] = 0x4F; - ptr[1] = 0x4F; - ptr[2] = 0x4F; - ptr += 32; - } - - ptr = gBGTilemapBuffers[2] + 0x5A + itemPos * 64; - ptr[0] = 0x5A; - ptr[1] = 0x5B; - ptr[2] = 0x5C; - ptr[32] = 0x6A; - ptr[33] = 0x6B; - ptr[34] = 0x6C; -} - -static void EraseSelectIcon(u8 itemPos) -{ - u16 *ptr = gBGTilemapBuffers[2] + 0x5A; - - ptr += itemPos * 64; - ptr[0] = 0x4F; - ptr[1] = 0x4F; - ptr[2] = 0x4F; - ptr[32] = 0x4F; - ptr[33] = 0x4F; - ptr[34] = 0x4F; -} - -static void RemoveSelectIconFromRegisteredItem(void) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - break; - if (gCurrentBagPocketItemSlots[gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i].itemId == gSaveBlock1.registeredItem) - { - EraseSelectIcon(i); - break; - } - } -} - -static void AddSelectIconToRegisteredItem(void) -{ - RemoveSelectIconFromRegisteredItem(); - MoveSelectIcon(gBagPocketScrollStates[sCurrentBagPocket].cursorPos); -} - -void sub_80A4164(u8 *dest, u16 value, enum StringConvertMode mode, u8 digits) -{ - *dest++ = CHAR_MULT_SIGN; - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 0x14; - dest[2] = 6; - dest += 3; - ConvertIntToDecimalStringN(dest, value, mode, digits); -} - -void sub_80A418C(u16 value, enum StringConvertMode mode, u8 c, u8 d, u8 digits) -{ - sub_80A4164(gStringVar1, value, mode, digits); - Menu_PrintText(gStringVar1, c, d); -} - -static void sub_80A41D4(u8 taskId) -{ - sub_80A763C(); -} - -static void sub_80A41E0(u8 *a, u16 b, const u8 *c, u16 d, u8 e) -{ - a[0] = EXT_CTRL_CODE_BEGIN; - a[1] = 0x13; - a[2] = 8; - a += 3; - a = ConvertIntToDecimalStringN(a, b, STR_CONV_MODE_LEADING_ZEROS, 2); - a[0] = EXT_CTRL_CODE_BEGIN; - a[1] = 0x13; - a[2] = 0x18; - a += 3; - a = sub_8072C74(a, c, 0x78 - (e + 1) * 6, 0); - *a++ = CHAR_MULT_SIGN; - sub_8072C14(a, d, 0x78, 1); -} - -static u8 *sub_80A425C(u8 taskId, u8 *text, u8 c) -{ - if (gTasks[taskId].data[10] - gBagPocketScrollStates[sCurrentBagPocket].scrollTop - 1 == c) - { - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 1; - text[2] = 2; - text += 3; - } - return text; -} - -static bool8 sub_80A42B0(u8 itemPos, int b) -{ - u8 r5; - u16 *ptr; - struct UnknownStruct3 *r8 = &gUnknown_02038540; - - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + itemPos > gBagPocketScrollStates[sCurrentBagPocket].numSlots) - return TRUE; - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + itemPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - if (sReturnLocation == RETURN_TO_FIELD_5) - return TRUE; - r5 = itemPos * 2 + 2; - sub_8072C74(gStringVar1, gOtherText_CloseBag, 0x78, 0); - Menu_PrintText(gStringVar1, 14, r5); - ptr = gBGTilemapBuffers[2] + 14 + r5 * 32; - ptr[0] = 0x4F; - ptr[1] = 0x4F; - ptr[32] = 0x4F; - ptr[33] = 0x4F; - if (itemPos == 7) - return TRUE; - if ((b == 1 && r8->unk2 != 0) || b == 2) - Menu_BlankWindowRect(14, r5 + 2, 29, 13); - else - Menu_BlankWindowRect(14, r5 + 2, 29, 17); - return TRUE; - } - return FALSE; -} - -static void sub_80A4380(u16 a, int b, int c, int d) -{ - u8 i; - - for (i = b; i <= c; i++) - { - u8 r4; - u8 r5; - u8 *text; - - if (sub_80A42B0(i, d) == TRUE) - break; - r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; - r5 = i * 2 + 2; - text = gStringVar1; - text = sub_80A425C(a, text, i); - text = sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x66, 0); - *text++ = CHAR_MULT_SIGN; - sub_8072C14(text, gCurrentBagPocketItemSlots[r4].quantity, 0x78, 1); - Menu_PrintText(gStringVar1, 14, r5); - } -} - -static void sub_80A444C(u16 a, int b, int c, int d) -{ - u8 i; - - for (i = b; i <= c; i++) - { - u8 r4; - u8 r5; - u8 *text; - - if (sub_80A42B0(i, d) == TRUE) - break; - r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; - r5 = i * 2 + 2; - text = gStringVar1; - text = sub_80A425C(a, text, i); -#if ENGLISH - sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x60, 0); -#else - sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x63, 0); -#endif - Menu_PrintText(gStringVar1, 14, r5); - if (gUnknown_02038558 != 0) - { - if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) - DrawSelectIcon(i); - } - else - { - if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) - MoveSelectIcon(i); - else - EraseSelectIcon(i); - } - } -} - -// more gBGTilemapBuffers shenanigans -#ifdef NONMATCHING -static void sub_80A4548(u16 a, int b, int c, int d) -{ - u8 i; - - for (i = b; i <= c; i++) - { - u8 r4; - u8 sp10; - u32 r5; - u8 *text; - - if (sub_80A42B0(i, d) == TRUE) - break; - r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; - sp10 = i * 2 + 2; - r5 = sp10 * 32 + 14; - text = gStringVar1; - text = sub_80A425C(a, text, i); - if (gCurrentBagPocketItemSlots[r4].itemId < 0x153) - { - const u8 *r2; - - gBGTilemapBuffers[2][r5 + 0] = 0x59; - gBGTilemapBuffers[2][r5 + 1] = 0x4F; - gBGTilemapBuffers[2][r5 + 32] = 0x69; - gBGTilemapBuffers[2][r5 + 33] = 0x4F; - r2 = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; - sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 288, r2, gCurrentBagPocketItemSlots[r4].quantity, 2); - } - else - { - const u8 *moveName; - - gBGTilemapBuffers[2][r5 + 0] = 0x105D; - gBGTilemapBuffers[2][r5 + 1] = 0x105E; - gBGTilemapBuffers[2][r5 + 32] = 0x106D; - gBGTilemapBuffers[2][r5 + 33] = 0x106E; - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 0x13; - text[2] = 0x11; - text += 3; - text = ConvertIntToDecimalString(text, gCurrentBagPocketItemSlots[r4].itemId); - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 0x13; - text[2] = 0x18; - text += 3; - moveName = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; - sub_8072C74(text, moveName, 0x78, 0); - } - Menu_PrintText(gStringVar1, 14, sp10); - } -} -#else -__attribute__((naked)) -static void sub_80A4548(u16 a, int b, int c, int d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - str r2, [sp, 0x8]\n\ - str r3, [sp, 0xC]\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x4]\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r8, r1\n\ - ldr r0, _080A456C @ =gBGTilemapBuffers + 0x1000\n\ - mov r9, r0\n\ - b _080A46C2\n\ - .align 2, 0\n\ -_080A456C: .4byte gBGTilemapBuffers + 0x1000\n\ -_080A4570:\n\ - ldr r1, _080A461C @ =gBagPocketScrollStates\n\ - ldr r0, _080A4620 @ =sCurrentBagPocket\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x1]\n\ - add r4, r8\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r1, r8\n\ - lsls r0, r1, 25\n\ - movs r3, 0x80\n\ - lsls r3, 18\n\ - adds r0, r3\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x10]\n\ - lsls r0, 5\n\ - adds r0, 0xE\n\ - adds r5, r0, 0\n\ - ldr r6, _080A4624 @ =gStringVar1\n\ - ldr r1, [sp, 0x4]\n\ - lsls r0, r1, 24\n\ - lsrs r0, 24\n\ - adds r1, r6, 0\n\ - mov r2, r8\n\ - bl sub_80A425C\n\ - adds r6, r0, 0\n\ - ldr r3, _080A4628 @ =gCurrentBagPocketItemSlots\n\ - mov r10, r3\n\ - ldr r0, [r3]\n\ - lsls r7, r4, 2\n\ - adds r3, r7, r0\n\ - ldrh r1, [r3]\n\ - movs r0, 0xA9\n\ - lsls r0, 1\n\ - cmp r1, r0\n\ - bhi _080A4634\n\ - lsls r0, r5, 1\n\ - add r0, r9\n\ - movs r1, 0x59\n\ - strh r1, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 1\n\ - add r0, r9\n\ - movs r2, 0x4F\n\ - strh r2, [r0]\n\ - adds r0, r5, 0\n\ - adds r0, 0x20\n\ - lsls r0, 1\n\ - add r0, r9\n\ - movs r1, 0x69\n\ - strh r1, [r0]\n\ - adds r0, r5, 0\n\ - adds r0, 0x21\n\ - lsls r0, 1\n\ - add r0, r9\n\ - strh r2, [r0]\n\ - ldrh r0, [r3]\n\ - bl ItemIdToBattleMoveId\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xD\n\ - adds r2, r0, 0\n\ - muls r2, r1\n\ - ldr r0, _080A462C @ =gMoveNames\n\ - adds r2, r0\n\ - mov r1, r10\n\ - ldr r0, [r1]\n\ - adds r0, r7, r0\n\ - ldr r3, _080A4630 @ =0xfffffee0\n\ - adds r1, r3, 0\n\ - ldrh r3, [r0]\n\ - adds r1, r3\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - ldrh r3, [r0, 0x2]\n\ - movs r0, 0x2\n\ - str r0, [sp]\n\ - adds r0, r6, 0\n\ - bl sub_80A41E0\n\ - b _080A46AE\n\ - .align 2, 0\n\ -_080A461C: .4byte gBagPocketScrollStates\n\ -_080A4620: .4byte sCurrentBagPocket\n\ -_080A4624: .4byte gStringVar1\n\ -_080A4628: .4byte gCurrentBagPocketItemSlots\n\ -_080A462C: .4byte gMoveNames\n\ -_080A4630: .4byte 0xfffffee0\n\ -_080A4634:\n\ - lsls r0, r5, 1\n\ - add r0, r9\n\ - ldr r1, _080A46EC @ =0x0000105d\n\ - strh r1, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 1\n\ - add r0, r9\n\ - adds r1, 0x1\n\ - strh r1, [r0]\n\ - adds r0, r5, 0\n\ - adds r0, 0x20\n\ - lsls r0, 1\n\ - add r0, r9\n\ - adds r1, 0xF\n\ - strh r1, [r0]\n\ - adds r0, r5, 0\n\ - adds r0, 0x21\n\ - lsls r0, 1\n\ - add r0, r9\n\ - adds r1, 0x1\n\ - strh r1, [r0]\n\ - movs r0, 0xFC\n\ - strb r0, [r6]\n\ - movs r4, 0x13\n\ - strb r4, [r6, 0x1]\n\ - movs r0, 0x11\n\ - strb r0, [r6, 0x2]\n\ - adds r6, 0x3\n\ - mov r1, r10\n\ - ldr r0, [r1]\n\ - adds r0, r7, r0\n\ - ldrh r1, [r0]\n\ - ldr r3, _080A46F0 @ =0xfffffeae\n\ - adds r1, r3\n\ - adds r0, r6, 0\n\ - bl ConvertIntToDecimalString\n\ - adds r6, r0, 0\n\ - movs r0, 0xFC\n\ - strb r0, [r6]\n\ - strb r4, [r6, 0x1]\n\ - movs r0, 0x18\n\ - strb r0, [r6, 0x2]\n\ - adds r6, 0x3\n\ - mov r1, r10\n\ - ldr r0, [r1]\n\ - adds r0, r7, r0\n\ - ldrh r0, [r0]\n\ - bl ItemIdToBattleMoveId\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xD\n\ - muls r1, r0\n\ - ldr r0, _080A46F4 @ =gMoveNames\n\ - adds r1, r0\n\ - adds r0, r6, 0\n\ - movs r2, 0x78\n\ - movs r3, 0\n\ - bl sub_8072C74\n\ -_080A46AE:\n\ - ldr r0, _080A46F8 @ =gStringVar1\n\ - movs r1, 0xE\n\ - ldr r2, [sp, 0x10]\n\ - bl Menu_PrintText\n\ - mov r0, r8\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ -_080A46C2:\n\ - ldr r3, [sp, 0x8]\n\ - cmp r8, r3\n\ - bgt _080A46DA\n\ - mov r0, r8\n\ - ldr r1, [sp, 0xC]\n\ - bl sub_80A42B0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - beq _080A46DA\n\ - b _080A4570\n\ -_080A46DA:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A46EC: .4byte 0x0000105d\n\ -_080A46F0: .4byte 0xfffffeae\n\ -_080A46F4: .4byte gMoveNames\n\ -_080A46F8: .4byte gStringVar1\n\ - .syntax divided\n"); -} -#endif - -static void sub_80A46FC(u16 a, int b, int c, int d) -{ - u8 i; - - for (i = b; i <= c; i++) - { - u8 r4; - u8 r5; - u8 *text; - register int var asm("r0"); - - if (sub_80A42B0(i, d) == TRUE) - break; - r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; - r5 = i * 2 + 2; - - var = 14 + r5 * 32; - gBGTilemapBuffers[2][var] = 0x59; - var += 32; - gBGTilemapBuffers[2][var] = 0x69; - - text = gStringVar1; - text = sub_80A425C(a, text, i); - CopyItemName(gCurrentBagPocketItemSlots[r4].itemId, gStringVar2); - sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 0x84, gStringVar2, gCurrentBagPocketItemSlots[r4].quantity, 3); - Menu_PrintText(gStringVar1, 14, r5); - } -} - -static void sub_80A47E8(u16 a, int b, int c, int d) -{ - switch (sCurrentBagPocket) - { - case BAG_POCKET_ITEMS: - case BAG_POCKET_POKE_BALLS: - sub_80A4380(a, b, c, d); - break; - case BAG_POCKET_KEY_ITEMS: - sub_80A444C(a, b, c, d); - break; - case BAG_POCKET_TMs_HMs: - sub_80A4548(a, b, c, d); - break; - case BAG_POCKET_BERRIES: - sub_80A46FC(a, b, c, d); - break; - } - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); - else - SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); - if ((sReturnLocation != RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots + 1) - || (sReturnLocation == RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots)) - SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); - else - SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); -} - -static void sub_80A48E8(u16 taskId, int b, int c) -{ - sub_80A47E8(taskId, b, c, 0); -} - -static void sub_80A48F8(u16 taskId) -{ - sub_80A47E8(taskId, 0, 5, 2); -} - -static void ItemListMenu_InitDescription(s16 itemId) -{ - u8 r5; - - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - r5 = sub_8072A18(gOtherText_ReturnTo, 4, 0x68, 0x68, 1); - r5 += sub_8072A18(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0x68, 1); - } - else - { - r5 = sub_8072A18(ItemId_GetDescription(itemId), 4, 0x68, 0x68, 1); - } - - if (r5 < 3) - Menu_EraseWindowRect(0, 13 + r5 * 2, 13, 20); -} - -static void ItemListMenu_ChangeDescription(s16 itemId, int b) -{ - u8 description[100]; - - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - if (b == 0) - { - Menu_EraseWindowRect(0, 13, 13, 20); - Menu_PrintTextPixelCoords(gOtherText_ReturnTo, 4, 0x68, 0); - } - else if (b == 1) - { - Menu_PrintTextPixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0); - } - } - else - { - if (b == 0) - Menu_EraseWindowRect(0, 13, 13, 20); - if (ItemId_CopyDescription(description, itemId, b)) - Menu_PrintTextPixelCoords(description, 4, 104 + b * 16, 0); - } -} - -static bool32 CopyTextLine(u8 *destination, const u8 *source, u32 c) -{ - u32 r4 = c + 1; - const u8 *src = source; - u8 *dst = destination; - - while (1) - { - if (*src == CHAR_NEWLINE || *src == EOS) - { - r4--; - if (r4 == 0) - { - *dst = EOS; - return TRUE; - } - if (*src == EOS) - return FALSE; - // got a new line - reset dst pointer - dst = destination; - src++; - } - else - { - *dst++ = *src++; - } - } -} - -static void sub_80A4A98(const u8 *text, u32 line) -{ - u8 buffer[100]; - - if (line == 0) - Menu_EraseWindowRect(0, 13, 13, 20); - if (CopyTextLine(buffer, text, line)) - Menu_PrintTextPixelCoords(buffer, 4, 104 + line * 16, 0); -} - -static void sub_80A4ADC(u8 taskId) -{ - if (gTasks[taskId].data[10] == 0) - sub_80A7528(0); - PlaySE(SE_SELECT); - gUnknown_0203855C = 1; -} - -static void sub_80A4B14(s8 a, u8 b) -{ - gBagPocketScrollStates[sCurrentBagPocket].scrollTop += a; - Menu_MoveCursor(0); - sub_80A73C0(); - sub_80A763C(); - sub_80A4ADC(b); -} - -static void sub_80A4B58(s8 delta, u8 b) -{ - gBagPocketScrollStates[sCurrentBagPocket].cursorPos = Menu_MoveCursor(delta); - sub_80A73C0(); - sub_80A4ADC(b); -} - -static const u8 *sub_80A4B90(u16 itemId) -{ - if (TestPlayerAvatarFlags(6)) - { - if (itemId == ITEM_MACH_BIKE || itemId == ITEM_ACRO_BIKE) - return gOtherText_Walk; - } - if (ItemIsMail(itemId) == TRUE) - return gOtherText_Check; - return sItemPopupMenuActions[sPopupMenuActionList[0]].text; -} - -static void sub_80A4BF0(u16 *a) -{ - u8 i; - - if (gUnknown_02038564 == 4) - { - Menu_DrawStdWindowFrame(0, 7, 13, 12); - sub_80A4008(a, 1, 8, 12, 4); - if (sub_80F9344() == TRUE && sReturnLocation == RETURN_TO_FIELD_5) - { - sub_80A7834(1, 0); - } - else - { - for (i = 0; i < gUnknown_02038564; i++) - { - const u8 *text; - - if (i == 0) - text = sub_80A4B90(gSpecialVar_ItemId); - else - text = sItemPopupMenuActions[sPopupMenuActionList[i]].text; - Menu_PrintText(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2); - } - } - if (sReturnLocation == RETURN_TO_FIELD_5) - InitMenu(0, 1, 8, gUnknown_02038564, sPopupMenuSelection, 1); - else - InitMenu(0, 1, 8, gUnknown_02038564, 0, 1); - sub_8072DCC(0x2F); - } - else - { - Menu_DrawStdWindowFrame(0, 5, 13, 12); - sub_80A4008(a, 1, 6, 12, 6); - for (i = 0; i < gUnknown_02038564; i++) - Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[i]].text, 1 + (i / 3) * 6, 6 + (i % 3) * 2); - InitMenu(0, 1, 6, gUnknown_02038564, 0, 1); - sub_8072DCC(0x2F); - } - sub_80A7528(2); -} - -static void sub_80A4DA4(u16 *a) -{ - sub_80A73FC(); - sub_80A36B8(a, 0, 6, 13, 6); - Menu_EraseWindowRect(0, 5, 13, 12); - sub_80A7590(); -} - -static void sub_80A4DD8(u8 taskId, u8 b, u8 c, u8 d, u8 e, u8 digits) -{ - gTasks[taskId].data[1] = 1; - gTasks[taskId].data[2] = b + 2; - gTasks[taskId].data[3] = c + 1; - Menu_DrawStdWindowFrame(b, c, b + d, c + e); - sub_80A4008(gBGTilemapBuffers[1], b + 1, c + 1, d - 1, e - 1); - sub_80A418C(1, 1, b + 2, c + 1, digits); -} - -static void sub_80A4E8C(s8 delta, u8 b) -{ - PlaySE(SE_SELECT); - SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); - SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); - SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE); - SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE); - PauseVerticalScrollIndicator(TOP_ARROW); - PauseVerticalScrollIndicator(BOTTOM_ARROW); - PauseVerticalScrollIndicator(LEFT_ARROW); - PauseVerticalScrollIndicator(RIGHT_ARROW); - ChangePocket(gBGTilemapBuffers[2], delta); - DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); - sub_80A3770(); - sub_80A7C64(); - CreateBagPokeballSprite(b); -} - -static bool8 sub_80A4F0C(void) -{ - if (sReturnLocation == RETURN_TO_FIELD_5 || sReturnLocation == RETURN_TO_FIELD_4) - return FALSE; - if (gMain.newKeys == DPAD_RIGHT || sub_80F9284() == 2) - { - sub_80A4E8C(1, 2); - return TRUE; - } - if (gMain.newKeys == DPAD_LEFT || sub_80F9284() == 1) - { - sub_80A4E8C(-1, 1); - return TRUE; - } - return FALSE; -} - -static void sub_80A4F68(u8 taskId) -{ - sub_80A4F0C(); -} - -static bool8 sub_80A4F74(u8 a) -{ - bool8 retVal = FALSE; - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos != 0) - sub_80A4B58(-1, a); - else if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - sub_80A4B14(-1, a); - if (gLinkOpen == TRUE && gMain.keyRepeatCounter == 5) - gMain.keyRepeatCounter = 11; - retVal = TRUE; - } - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - if (sReturnLocation != RETURN_TO_FIELD_5) - { - if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].cursorMax) - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) - sub_80A4B14(1, a); - } - else - { - sub_80A4B58(1, a); - } - } - else - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots - 1) - { - if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].cursorMax) - sub_80A4B58(1, a); - else - sub_80A4B14(1, a); - } - } - retVal = TRUE; - if (gLinkOpen == TRUE && gMain.keyRepeatCounter == 5) - gMain.keyRepeatCounter = 11; - } - else - { - if (gTasks[a].data[10] == 0 && sub_80A4F0C() == TRUE) - { - sub_80A73F0(); - gTasks[a].func = sub_80A4F68; - retVal = TRUE; - } - else - { - sub_80A73C0(); - } - } - return retVal; -} - -static void sub_80A50C8(u8 taskId) -{ - s16 *r5 = gTasks[taskId].data; - - if (!gPaletteFade.active) - { - if (sub_80A4F74(taskId) == TRUE) - { - sub_808B5B4(taskId); - return; - } - - if ((gMain.newKeys & SELECT_BUTTON) - && !(sCurrentBagPocket == BAG_POCKET_BERRIES || sCurrentBagPocket == BAG_POCKET_TMs_HMs) - && (sReturnLocation == RETURN_TO_FIELD_0 || sReturnLocation == RETURN_TO_BATTLE)) - { - if (r5[10] == 0) - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - PlaySE(SE_SELECT); - sub_80A3F50(taskId); - } - sub_808B5B4(taskId); - } - else - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - PlaySE(SE_SELECT); - sub_80A3E90(taskId); - } - else - { - sub_80A3EF4(taskId); - } - sub_808B5B4(taskId); - } - return; - } - - if (gMain.newKeys & A_BUTTON) - { - if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) - { - if (r5[10] == 0) - { - gSpecialVar_ItemId = 0; - gUnknown_083C16BC[sReturnLocation].onBagClose(taskId); - } - else - { - sub_80A3EF4(taskId); - } - sub_808B5B4(taskId); - } - else - { - if (r5[10] == 0) - { - PlaySE(SE_SELECT); - gUnknown_02038560 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId; - gUnknown_083C16BC[sReturnLocation].onItemSelect(taskId); - StopVerticalScrollIndicators(TOP_ARROW); - StopVerticalScrollIndicators(BOTTOM_ARROW); - StopVerticalScrollIndicators(LEFT_ARROW); - StopVerticalScrollIndicators(RIGHT_ARROW); - sub_80A797C(); - } - else - { - sub_80A3E90(taskId); - } - sub_808B5B4(taskId); - } - return; - } - - if (gMain.newKeys & B_BUTTON) - { - if (r5[10] == 0) - { - if (sReturnLocation != RETURN_TO_FIELD_5) - { - gSpecialVar_ItemId = 0; - gUnknown_083C16BC[sReturnLocation].onBagClose(taskId); - } - } - else - { - sub_80A3EF4(taskId); - } - sub_808B5B4(taskId); - return; - } - } -} - -bool8 SellMenu_QuantityRoller(u8 taskId, u16 b) -{ - s16 *taskData = gTasks[taskId].data; - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - if (taskData[1] != b) - taskData[1]++; - else - taskData[1] = 1; - return TRUE; - } - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - if (taskData[1] != 1) - taskData[1]--; - else - taskData[1] = b; - return TRUE; - } - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_RIGHT) - { - if (taskData[1] + 10 < b) - taskData[1] += 10; - else - taskData[1] = b; - return TRUE; - } - - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_LEFT) - { - if (taskData[1] > 10) - taskData[1] -= 10; - else - taskData[1] = 1; - return TRUE; - } - - return FALSE; -} - -static bool8 sub_80A5350(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - if (SellMenu_QuantityRoller(taskId, gCurrentBagPocketItemSlots[gUnknown_02038560].quantity) == TRUE) - { - // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way - if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) - sub_80A418C(taskData[1], 1, taskData[2], taskData[3], 3); - else - sub_80A418C(taskData[1], 1, taskData[2], taskData[3], 2); - return TRUE; - } - return FALSE; -} - -static void sub_80A53CC(void) -{ - if (sub_80A34B4() == TRUE) - { - sub_80A3770(); - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - } -} - -void sub_80A53F8(void) -{ - sReturnLocation = RETURN_TO_FIELD_0; - SetMainCallback2(sub_80A53CC); -} - -#ifdef NONMATCHING -static void sub_80A5414(u8 taskId) -{ - TaskFunc r5 = NULL; - - if (sub_80A78A0() != 0) - { - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x40) - { - if ((sPopupMenuSelection & 1) && sPopupMenuActionList[sPopupMenuSelection - 1] == 8) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor3(-1); - } - } - //_080A546C - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x80) - { - if (!(sPopupMenuSelection & 1) && sPopupMenuActionList[sPopupMenuSelection + 1] != 8) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor3(1); - } - } - //_080A549C - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x20) - { - if (sPopupMenuSelection > 1 && sPopupMenuActionList[sPopupMenuSelection - 2] != 8) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor3(-2); - } - } - //_080A54CC - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x10) - { - if (sPopupMenuSelection <= 1 && sPopupMenuActionList[sPopupMenuSelection + 2] != 8) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor3(2); - } - } - //_080A5500 - else if (!(gMain.newKeys & A_BUTTON)) - { - if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A4DA4(gBGTilemapBuffers[1]); - r5 = sItemPopupMenuActions[sPopupMenuActionList[3]].func; - r5(taskId); - } - } - else - { - //_080A5590 - gTasks[taskId].data[10] = 0; - sub_80A4DA4(gBGTilemapBuffers[1]); - r5 = sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func; - r5(taskId); - } - } - //_080A5552 - if (r5 == NULL) - { - if (sReturnLocation == RETURN_TO_FIELD_5) - { - if (sPopupMenuSelection == 0) - { - sub_8072DDC(12); - return; - } - //_080A55D4 - //else - //{ - if (sPopupMenuSelection == 0 || sPopupMenuSelection == 1) - sub_8072DCC(0x2F); - else - sub_8072DCC(0x30); - //} - } - //_080A55E0 - else - { - if (sPopupMenuSelection == 0 || sPopupMenuSelection == 1) - sub_8072DCC(0x2F); - else - sub_8072DCC(0x30); - } - } -} -#else -__attribute__((naked)) -static void sub_80A5414(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r5, 0\n\ - bl sub_80A78A0\n\ - cmp r0, 0\n\ - bne _080A5426\n\ - b _080A5552\n\ -_080A5426:\n\ - ldr r2, _080A5460 @ =gMain\n\ - ldrh r0, [r2, 0x30]\n\ - movs r1, 0xF0\n\ - ands r1, r0\n\ - cmp r1, 0x40\n\ - bne _080A546C\n\ - ldr r4, _080A5464 @ =sPopupMenuSelection\n\ - ldrb r1, [r4]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080A5440\n\ - b _080A5552\n\ -_080A5440:\n\ - ldrb r1, [r4]\n\ - ldr r0, _080A5468 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - subs r1, 0x1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x8\n\ - bne _080A5452\n\ - b _080A5552\n\ -_080A5452:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - b _080A54EE\n\ - .align 2, 0\n\ -_080A5460: .4byte gMain\n\ -_080A5464: .4byte sPopupMenuSelection\n\ -_080A5468: .4byte sPopupMenuActionList\n\ -_080A546C:\n\ - cmp r1, 0x80\n\ - bne _080A549C\n\ - ldr r4, _080A5494 @ =sPopupMenuSelection\n\ - ldrb r1, [r4]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080A5552\n\ - ldrb r1, [r4]\n\ - ldr r0, _080A5498 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x8\n\ - beq _080A5552\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - b _080A54EE\n\ - .align 2, 0\n\ -_080A5494: .4byte sPopupMenuSelection\n\ -_080A5498: .4byte sPopupMenuActionList\n\ -_080A549C:\n\ - cmp r1, 0x20\n\ - bne _080A54CC\n\ - ldr r4, _080A54C4 @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x1\n\ - bls _080A5552\n\ - adds r1, r0, 0\n\ - ldr r0, _080A54C8 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - subs r1, 0x2\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x8\n\ - beq _080A5552\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x2\n\ - negs r0, r0\n\ - b _080A54EE\n\ - .align 2, 0\n\ -_080A54C4: .4byte sPopupMenuSelection\n\ -_080A54C8: .4byte sPopupMenuActionList\n\ -_080A54CC:\n\ - cmp r1, 0x10\n\ - bne _080A5500\n\ - ldr r4, _080A54F8 @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x1\n\ - bhi _080A5552\n\ - adds r1, r0, 0\n\ - ldr r0, _080A54FC @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x2]\n\ - cmp r0, 0x8\n\ - beq _080A5552\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x2\n\ -_080A54EE:\n\ - bl MoveMenuCursor3\n\ - strb r0, [r4]\n\ - b _080A5552\n\ - .align 2, 0\n\ -_080A54F8: .4byte sPopupMenuSelection\n\ -_080A54FC: .4byte sPopupMenuActionList\n\ -_080A5500:\n\ - ldrh r1, [r2, 0x2E]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080A5590\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080A5552\n\ - ldr r1, _080A5570 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x1C]\n\ - ldr r1, _080A5574 @ =gBagPocketScrollStates\n\ - ldr r0, _080A5578 @ =sCurrentBagPocket\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r2, [r0]\n\ - adds r0, r4, 0\n\ - adds r1, r2, 0\n\ - bl sub_80A48E8\n\ - ldr r0, _080A557C @ =gBGTilemapBuffers + 0x800\n\ - bl sub_80A4DA4\n\ - ldr r1, _080A5580 @ =sItemPopupMenuActions\n\ - ldr r0, _080A5584 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x3]\n\ - lsls r0, 3\n\ - adds r1, 0x4\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r5\n\ -_080A5552:\n\ - cmp r5, 0\n\ - bne _080A55FA\n\ - ldr r0, _080A5588 @ =sReturnLocation\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x5\n\ - bne _080A55E0\n\ - ldr r0, _080A558C @ =sPopupMenuSelection\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080A55D4\n\ - movs r0, 0xC\n\ - bl sub_8072DDC\n\ - b _080A55FA\n\ - .align 2, 0\n\ -_080A5570: .4byte gTasks\n\ -_080A5574: .4byte gBagPocketScrollStates\n\ -_080A5578: .4byte sCurrentBagPocket\n\ -_080A557C: .4byte gBGTilemapBuffers + 0x800\n\ -_080A5580: .4byte sItemPopupMenuActions\n\ -_080A5584: .4byte sPopupMenuActionList\n\ -_080A5588: .4byte sReturnLocation\n\ -_080A558C: .4byte sPopupMenuSelection\n\ -_080A5590:\n\ - ldr r1, _080A55C0 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x1C]\n\ - ldr r0, _080A55C4 @ =gBGTilemapBuffers + 0x800\n\ - bl sub_80A4DA4\n\ - ldr r1, _080A55C8 @ =sItemPopupMenuActions\n\ - ldr r0, _080A55CC @ =sPopupMenuSelection\n\ - ldrb r2, [r0]\n\ - ldr r0, _080A55D0 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r1, 0x4\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r5\n\ - b _080A5552\n\ - .align 2, 0\n\ -_080A55C0: .4byte gTasks\n\ -_080A55C4: .4byte gBGTilemapBuffers + 0x800\n\ -_080A55C8: .4byte sItemPopupMenuActions\n\ -_080A55CC: .4byte sPopupMenuSelection\n\ -_080A55D0: .4byte sPopupMenuActionList\n\ -_080A55D4:\n\ - cmp r0, 0x1\n\ - bls _080A55E8\n\ - movs r0, 0x30\n\ - bl sub_8072DCC\n\ - b _080A55FA\n\ -_080A55E0:\n\ - ldr r0, _080A55F0 @ =sPopupMenuSelection\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bhi _080A55F4\n\ -_080A55E8:\n\ - movs r0, 0x2F\n\ - bl sub_8072DCC\n\ - b _080A55FA\n\ - .align 2, 0\n\ -_080A55F0: .4byte sPopupMenuSelection\n\ -_080A55F4:\n\ - movs r0, 0x30\n\ - bl sub_8072DCC\n\ -_080A55FA:\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -__attribute__((naked)) -static void sub_80A5600(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r5, 0\n\ - ldr r2, _080A563C @ =gMain\n\ - ldrh r0, [r2, 0x30]\n\ - movs r1, 0xF0\n\ - ands r1, r0\n\ - cmp r1, 0x40\n\ - bne _080A5648\n\ - ldr r4, _080A5640 @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _080A561E\n\ - b _080A5736\n\ -_080A561E:\n\ - adds r1, r0, 0\n\ - ldr r0, _080A5644 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - subs r1, 0x1\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x8\n\ - bne _080A5630\n\ - b _080A5736\n\ -_080A5630:\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - b _080A56D2\n\ - .align 2, 0\n\ -_080A563C: .4byte gMain\n\ -_080A5640: .4byte sPopupMenuSelection\n\ -_080A5644: .4byte sPopupMenuActionList\n\ -_080A5648:\n\ - cmp r1, 0x80\n\ - bne _080A5680\n\ - ldr r4, _080A5674 @ =sPopupMenuSelection\n\ - ldrb r1, [r4]\n\ - ldr r0, _080A5678 @ =gUnknown_02038564\n\ - ldrb r0, [r0]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - beq _080A5736\n\ - cmp r1, 0x2\n\ - beq _080A5736\n\ - ldr r0, _080A567C @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r0, r1, r0\n\ - ldrb r0, [r0, 0x1]\n\ - cmp r0, 0x8\n\ - beq _080A5736\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x1\n\ - b _080A56D2\n\ - .align 2, 0\n\ -_080A5674: .4byte sPopupMenuSelection\n\ -_080A5678: .4byte gUnknown_02038564\n\ -_080A567C: .4byte sPopupMenuActionList\n\ -_080A5680:\n\ - cmp r1, 0x20\n\ - bne _080A56B0\n\ - ldr r4, _080A56A8 @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x2\n\ - bls _080A5736\n\ - adds r1, r0, 0\n\ - ldr r0, _080A56AC @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - subs r1, 0x3\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x8\n\ - beq _080A5736\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x3\n\ - negs r0, r0\n\ - b _080A56D2\n\ - .align 2, 0\n\ -_080A56A8: .4byte sPopupMenuSelection\n\ -_080A56AC: .4byte sPopupMenuActionList\n\ -_080A56B0:\n\ - cmp r1, 0x10\n\ - bne _080A56E4\n\ - ldr r4, _080A56DC @ =sPopupMenuSelection\n\ - ldrb r0, [r4]\n\ - cmp r0, 0x2\n\ - bhi _080A5736\n\ - adds r1, r0, 0\n\ - ldr r0, _080A56E0 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x3]\n\ - cmp r0, 0x8\n\ - beq _080A5736\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - movs r0, 0x3\n\ -_080A56D2:\n\ - bl MoveMenuCursor3\n\ - strb r0, [r4]\n\ - b _080A5736\n\ - .align 2, 0\n\ -_080A56DC: .4byte sPopupMenuSelection\n\ -_080A56E0: .4byte sPopupMenuActionList\n\ -_080A56E4:\n\ - ldrh r1, [r2, 0x2E]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080A5768\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080A5736\n\ - ldr r1, _080A574C @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x1C]\n\ - ldr r1, _080A5750 @ =gBagPocketScrollStates\n\ - ldr r0, _080A5754 @ =sCurrentBagPocket\n\ - ldrb r0, [r0]\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r2, [r0]\n\ - adds r0, r4, 0\n\ - adds r1, r2, 0\n\ - bl sub_80A48E8\n\ - ldr r0, _080A5758 @ =gBGTilemapBuffers + 0x800\n\ - bl sub_80A4DA4\n\ - ldr r1, _080A575C @ =sItemPopupMenuActions\n\ - ldr r0, _080A5760 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x5]\n\ - lsls r0, 3\n\ - adds r1, 0x4\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r5\n\ -_080A5736:\n\ - cmp r5, 0\n\ - bne _080A57BE\n\ - ldr r0, _080A5764 @ =sPopupMenuSelection\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080A57AC\n\ - movs r0, 0xC\n\ - bl sub_8072DDC\n\ - b _080A57BE\n\ - .align 2, 0\n\ -_080A574C: .4byte gTasks\n\ -_080A5750: .4byte gBagPocketScrollStates\n\ -_080A5754: .4byte sCurrentBagPocket\n\ -_080A5758: .4byte gBGTilemapBuffers + 0x800\n\ -_080A575C: .4byte sItemPopupMenuActions\n\ -_080A5760: .4byte sPopupMenuActionList\n\ -_080A5764: .4byte sPopupMenuSelection\n\ -_080A5768:\n\ - ldr r1, _080A5798 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x1C]\n\ - ldr r0, _080A579C @ =gBGTilemapBuffers + 0x800\n\ - bl sub_80A4DA4\n\ - ldr r1, _080A57A0 @ =sItemPopupMenuActions\n\ - ldr r0, _080A57A4 @ =sPopupMenuSelection\n\ - ldrb r2, [r0]\n\ - ldr r0, _080A57A8 @ =sPopupMenuActionList\n\ - ldr r0, [r0]\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 3\n\ - adds r1, 0x4\n\ - adds r0, r1\n\ - ldr r5, [r0]\n\ - adds r0, r4, 0\n\ - bl _call_via_r5\n\ - b _080A5736\n\ - .align 2, 0\n\ -_080A5798: .4byte gTasks\n\ -_080A579C: .4byte gBGTilemapBuffers + 0x800\n\ -_080A57A0: .4byte sItemPopupMenuActions\n\ -_080A57A4: .4byte sPopupMenuSelection\n\ -_080A57A8: .4byte sPopupMenuActionList\n\ -_080A57AC:\n\ - cmp r0, 0x2\n\ - bhi _080A57B8\n\ - movs r0, 0x2F\n\ - bl sub_8072DCC\n\ - b _080A57BE\n\ -_080A57B8:\n\ - movs r0, 0x30\n\ - bl sub_8072DCC\n\ -_080A57BE:\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} - -static void sub_80A57C4(void) -{ - u8 r5; - - sPopupMenuActionList = gUnknown_083C16AE[sCurrentBagPocket]; - if (sCurrentBagPocket == BAG_POCKET_KEY_ITEMS) - { - gUnknown_02038564 = 1; - r5 = 9; - } - else if (sub_80F92F4(gSpecialVar_ItemId) == 0) - { - sPopupMenuActionList = gUnknown_083C16AE[4]; - gUnknown_02038564 = 1; - r5 = 9; - } - else - { - gUnknown_02038564 = 2; - r5 = 7; - } - sub_80A4008(gBGTilemapBuffers[1], 7, r5 + 1, 6, gUnknown_02038564 * 2); - Menu_DrawStdWindowFrame(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5); - sub_80A7834(0, r5); - InitMenu(0, 7, r5 + 1, gUnknown_02038564, 0, 6); -} - -static void sub_80A5888(u8 taskId) -{ - if (sub_80A78A0() != 0) - { - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (sPopupMenuSelection != 0) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = Menu_MoveCursor(-1); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (sPopupMenuSelection != gUnknown_02038564 - 1) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = Menu_MoveCursor(1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A4DA4(gBGTilemapBuffers[1]); - sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A4DA4(gBGTilemapBuffers[1]); - sItemPopupMenuActions[2].func(taskId); - } - } -} - -static void OnBagClose_Field0(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_805469C >> 16; - gTasks[taskId].data[9] = (u32)sub_805469C; - gLastFieldPokeMenuOpened = 0; - sub_80A5AE4(taskId); -} - -static void OnItemSelect_Field05(u8 taskId) -{ - sPopupMenuSelection = 0; - if (sReturnLocation == RETURN_TO_FIELD_5) - sPopupMenuSelection = 1; - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - if (sub_80F9344() == TRUE && sReturnLocation != RETURN_TO_FIELD_5) - { - sub_80A57C4(); - gTasks[taskId].func = sub_80A5888; - } - else - { - sub_80A4BF0(gBGTilemapBuffers[1]); - if (sCurrentBagPocket != BAG_POCKET_BERRIES || sReturnLocation == RETURN_TO_FIELD_5) - gTasks[taskId].func = sub_80A5414; - else - gTasks[taskId].func = sub_80A5600; - } -} - -static void sub_80A5AAC(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = HandleItemMenuPaletteFade; -} - -static void sub_80A5AE4(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_80A5AAC(taskId); -} - -void HandleItemMenuPaletteFade(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - if (!gPaletteFade.active) - { - MainCallback cb = (MainCallback)((u16)taskData[8] << 16 | (u16)taskData[9]); - - SetMainCallback2(cb); - gpu_pal_allocator_reset__manage_upper_four(); - DestroyTask(taskId); - } -} - -void sub_80A5B40(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - ResetTasks(); - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -static void HandlePopupMenuAction_UseOnField(u8 taskId) -{ - if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL) - { - PlaySE(SE_SELECT); - if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1) - { - sub_80A5BF8(taskId); - } - else - { - gTasks[taskId].data[2] = 0; - if (sCurrentBagPocket != BAG_POCKET_BERRIES) - ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); - else - sub_80C9C7C(taskId); - } - } -} - -static void sub_80A5BF8(u8 taskId) -{ - sub_80A73FC(); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gOtherText_NoPokemon, CleanUpItemMenuMessage, 1); -} - -static void sub_80A5C24(u8 taskId) -{ - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -void CleanUpItemMenuMessage(u8 taskId) -{ - sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - Menu_EraseWindowRect(7, 7, 13, 12); - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_80A5C24; -} - -void CleanUpOverworldMessage(u8 taskId) -{ - Menu_EraseWindowRect(0, 13, 29, 19); - DestroyTask(taskId); - sub_8064E2C(); - ScriptContext2_Disable(); -} - -void ExecuteItemUseFromBlackPalette(void) -{ - pal_fill_black(); - CreateTask(Task_CallItemUseOnFieldCallback, 8); -} - -static void Task_CallItemUseOnFieldCallback(u8 taskId) -{ - if (IsWeatherNotFadingIn() == TRUE) - gFieldItemUseCallback(taskId); -} - -void sub_80A5D04(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -static void sub_80A5D38(u8 taskId) -{ - gTasks[taskId].data[1] = 0; - sub_80A4DA4(gBGTilemapBuffers[1]); - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A5D78(void) -{ - sub_80A4008(gBGTilemapBuffers[1], 8, 8, 5, 4); - DisplayYesNoMenu(7, 7, 1); -} - -static void sub_80A5DA0(u16 itemId, u16 quantity) -{ - CopyItemName(itemId, gStringVar1); - if (quantity >= 100) - ConvertIntToDecimalStringN(gStringVar2, quantity, STR_CONV_MODE_LEFT_ALIGN, 3); - else - ConvertIntToDecimalStringN(gStringVar2, quantity, STR_CONV_MODE_LEFT_ALIGN, 2); - sub_80A4DA4(gBGTilemapBuffers[1]); - sub_80A7528(5); - sub_80A5D78(); -} - -static void sub_80A5DF8(void) -{ - sub_80A4DA4(gBGTilemapBuffers[1]); - Menu_EraseWindowRect(7, 6, 11, 13); - sub_80A7528(4); -} - -static void sub_80A5E1C(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - gTasks[taskId].data[10] = 0; - sub_80A41D4(taskId); - sub_80A5D38(taskId); - } -} - -static void sub_80A5E60(u8 taskId) -{ - sub_80A5DF8(); - sub_80A3D5C(taskId); - gTasks[taskId].func = sub_80A5E1C; -} - -static void sub_80A5E90(u8 taskId) -{ - sub_80A5D38(taskId); -} - -static void sub_80A5EA0(u8 taskId) -{ - if (sub_80A5350(taskId) == TRUE) - return; - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_80A5DA0(gSpecialVar_ItemId, gTasks[taskId].data[1]); - DoYesNoFuncWithChoice(taskId, &gUnknown_083C16F4); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_80A5D38(taskId); - } -} - -static void HandlePopupMenuAction_Toss(u8 taskId) -{ - PlaySE(SE_SELECT); - gTasks[taskId].func = sub_80A5EA0; - sub_80A7528(3); - // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way - if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) - sub_80A4DD8(taskId, 6, 9, 7, 3, 3); - else - sub_80A4DD8(taskId, 7, 9, 6, 3, 2); -} - -static void sub_80A5F80(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void HandlePopupMenuAction_Register(u8 taskId) -{ - PlaySE(SE_SELECT); - if (gSaveBlock1.registeredItem == gSpecialVar_ItemId) - { - // Un-register the registered item - RemoveSelectIconFromRegisteredItem(); - gSaveBlock1.registeredItem = 0; - } - else - { - AddSelectIconToRegisteredItem(); - gSaveBlock1.registeredItem = gSpecialVar_ItemId; - } - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A6000(u8 taskId) -{ - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A6024(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_80A6000; - } -} - -static void DisplayCannotBeHeldMessage(u8 taskId) -{ - sub_80A73FC(); - CopyItemName(gSpecialVar_ItemId, gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeld); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1); -} - -static void HandlePopupMenuAction_Give(u8 taskId) -{ - PlaySE(SE_SELECT); - if (sub_80F931C(gSpecialVar_ItemId) == 0) - { - sub_80A73FC(); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1); - } - else if (ItemId_GetImportance(gSpecialVar_ItemId) == 0) - { - if (CalculatePlayerPartyCount() == 0) - { - sub_80A5BF8(taskId); - } - else - { - gTasks[taskId].data[8] = (u32)sub_808B020 >> 16; - gTasks[taskId].data[9] = (u32)sub_808B020; - gTasks[taskId].func = HandleItemMenuPaletteFade; - gUnknown_02038561 = 1; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - } - } - else - { - DisplayCannotBeHeldMessage(taskId); - } -} - -static void HandlePopupMenuAction_CheckTag(u8 taskId) -{ - sub_80A5AE4(taskId); - gTasks[taskId].data[8] = (u32)BerryTagScreen_814625C >> 16; - gTasks[taskId].data[9] = (u32)BerryTagScreen_814625C; -} - -static void sub_80A61A8(void) -{ - if (sub_80A34B4() == TRUE) - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); -} - -void sub_80A61D0(void) -{ - sReturnLocation = RETURN_TO_PKMN_LIST; - SetMainCallback2(sub_80A61A8); -} - -static void OnBagClose_PkmnList(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16; - gTasks[taskId].data[9] = (u32)sub_808A3F8; - sub_80A5AE4(taskId); -} - -static void OnItemSelect_PkmnList(u8 taskId) -{ - u8 r6 = sCurrentBagPocket + 1; - - if (sub_80F931C(gSpecialVar_ItemId) == 0) - { - sub_80A73FC(); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1); - } - else if (sub_80F92F4(gSpecialVar_ItemId) == 0) - { - sub_80A73FC(); - CopyItemName(gSpecialVar_ItemId, gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeldHere); - sub_80A7590(); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1); - } - else if (r6 != 5 && ItemId_GetImportance(gSpecialVar_ItemId) == 0) - { - gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16; - gTasks[taskId].data[9] = (u32)sub_808A3F8; - sub_80A5AAC(taskId); - } - else - { - DisplayCannotBeHeldMessage(taskId); - } -} - -static void sub_80A62D8(void) -{ - if (sub_80A34B4() == TRUE) - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); -} - -void ItemMenu_LoadSellMenu(void) -{ - sReturnLocation = RETURN_TO_SHOP; - SetMainCallback2(sub_80A62D8); -} - -static void OnBagClose_Shop(u8 taskId) -{ - gFieldCallback = Shop_FadeReturnToMartMenu; - gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; - gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; - sub_80A5AE4(taskId); -} - -static void OnItemSelect_Shop(u8 taskId) -{ - sub_80A7590(); - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - CopyItemName(gSpecialVar_ItemId, gStringVar2); - if (ItemId_GetPrice(gSpecialVar_ItemId) == 0) - { - StringExpandPlaceholders(gStringVar4, gOtherText_CantBuyThat); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6444, 1); - } - else - { - StringExpandPlaceholders(gStringVar4, gOtherText_HowManyToSell); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A648C, 1); - } -} - -static void sub_80A640C(u8 taskId) -{ - gTasks[taskId].data[10] = 0; - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A6444(u8 taskId) -{ - sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_80A640C; -} - -static void sub_80A648C(u8 taskId) -{ - gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; - sub_80A4008(gBGTilemapBuffers[1], 1, 11, 12, 2); - Menu_DrawStdWindowFrame(0, 10, 13, 13); - gTasks[taskId].data[1] = 1; - gTasks[taskId].data[2] = 1; - gTasks[taskId].data[3] = 11; - // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way - if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) - sub_80A418C(1, 1, 1, 11, 3); - else - sub_80A418C(1, 1, 1, 11, 2); - BuyMenuDisplayMessage(gSpecialVar_ItemId, 1); - sub_80A683C(); -} - -static void sub_80A6520(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - BuyMenuPrintItemQuantityAndPrice(taskId); - } -} - -static void sub_80A6548(u8 taskId) -{ - sub_80A48F8(taskId); - gTasks[taskId].func = sub_80A6520; -} - -static void sub_80A6574(u8 taskId) -{ - PlaySE(SE_REGI); - sub_80A6870(gSpecialVar_ItemId, gTasks[taskId].data[1]); - gTasks[taskId].func = sub_80A6548; -} - -static void sub_80A65AC(u8 taskId) -{ - Menu_EraseWindowRect(7, 6, 13, 12); - sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); - CopyItemName(gSpecialVar_ItemId, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_SoldItem); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6574, 1); - sub_80A3D5C(taskId); -} - -static void sub_80A6618(u8 taskId) -{ - Menu_EraseWindowRect(7, 6, 13, 12); - sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); - BuyMenuPrintItemQuantityAndPrice(taskId); -} - -static void sub_80A6650(u8 taskId) -{ - sub_80A5D78(); - DoYesNoFuncWithChoice(taskId, &gUnknown_083C16FC); -} - -static void Task_BuyHowManyDialogueHandleInput(u8 taskId) -{ - if (sub_80A5350(taskId) == TRUE) - { - Menu_EraseWindowRect(6, 11, 12, 11); - BuyMenuDisplayMessage(gSpecialVar_ItemId, gTasks[taskId].data[1]); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - Menu_EraseWindowRect(0, 10, 13, 13); - sub_80A36B8(gBGTilemapBuffers[1], 0, 10, 13, 3); - ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6); - StringExpandPlaceholders(gStringVar4, gOtherText_CanPay); - DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6650, 1); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - BuyMenuPrintItemQuantityAndPrice(taskId); - } -} - -static void sub_80A6760(u8 taskId) -{ - gTasks[taskId].data[10] = 0; - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) -{ - sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - CloseMoneyWindow(0, 0); - Menu_EraseWindowRect(0, 4, 13, 13); - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_80A6760; -} - -static void BuyMenuDisplayMessage(u16 itemId, u16 quantity) -{ - PrintMoneyAmount(ItemId_GetPrice(itemId) / 2 * quantity, 6, 6, 11); - ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(itemId) / 2 * quantity, STR_CONV_MODE_LEFT_ALIGN, 6); -} - -static void sub_80A683C(void) -{ - OpenMoneyWindow(gSaveBlock1.money, 0, 0); - sub_80A4008(gBGTilemapBuffers[1], 1, 1, 12, 2); -} - -static void sub_80A6870(u16 itemId, u8 quantity) -{ - AddMoney(&gSaveBlock1.money, ItemId_GetPrice(itemId) / 2 * quantity); - UpdateMoneyWindow(gSaveBlock1.money, 0, 0); -} - -static void sub_80A68A4(void) -{ - if (sub_80A34B4() == TRUE) - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); -} - -void sub_80A68CC(void) -{ - sCurrentBagPocket = BAG_POCKET_BERRIES; - sReturnLocation = RETURN_TO_FIELD_4; - SetMainCallback2(sub_80A68A4); -} - -static void OnBagClose_Field4(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_80546B8 >> 16; - gTasks[taskId].data[9] = (u32)sub_80546B8; - sub_80A5AE4(taskId); -} - -static void OnItemSelect_Field4(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_80546B8 >> 16; - gTasks[taskId].data[9] = (u32)sub_80546B8; - sub_80A5AAC(taskId); -} - -static void sub_80A6940(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - sub_80A699C(); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_80A6978(void) -{ - sCurrentBagPocket = BAG_POCKET_BERRIES; - sReturnLocation = RETURN_TO_FIELD_5; - SetMainCallback2(sub_80A6940); -} - -static void sub_80A699C(void) -{ - sPopupMenuActionList = gUnknown_083C16B8; - gUnknown_02038564 = 4; -} - -static void OnBagClose_Field5(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_804E990 >> 16; - gTasks[taskId].data[9] = (u32)sub_804E990; - sub_80A5AE4(taskId); -} - -static void HandlePopupMenuAction_Confirm(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_804E990 >> 16; - gTasks[taskId].data[9] = (u32)sub_804E990; - sub_80A5AAC(taskId); -} - -static void sub_80A6A08(void) -{ - if (sub_80A34B4() == TRUE) - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); -} - -void sub_80A6A30(void) -{ - sReturnLocation = RETURN_TO_PC; - SetMainCallback2(sub_80A6A08); -} - -static void OnBagClose_PC(u8 taskId) -{ - gFieldCallback = ItemStorage_ReturnToMenuAfterDeposit; - gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; - gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; - sub_80A5AE4(taskId); -} - -static void sub_80A6A84(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - sub_80A4DA4(gBGTilemapBuffers[1]); - CopyItemName(gSpecialVar_ItemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, taskData[1], STR_CONV_MODE_LEFT_ALIGN, 3); - Menu_EraseWindowRect(7, 6, 11, 13); - sub_80A7528(7); - sub_80A3D5C(taskId); - gTasks[taskId].func = sub_80A5E1C; -} - -static void sub_80A6B00(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - PlaySE(SE_SELECT); - sub_80A5D38(taskId); - } -} - -static void sub_80A6B64(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - if (ItemId_GetImportance(gSpecialVar_ItemId) == 2) - { - gTasks[taskId].func = sub_80A6B00; - sub_80A7528(9); - } - else - { - if (AddPCItem(gSpecialVar_ItemId, taskData[1]) == TRUE) - { - sub_80A6A84(taskId); - } - else - { - gTasks[taskId].func = sub_80A6B00; - sub_80A7528(8); - } - } -} - -static void sub_80A6BE0(u8 taskId) -{ - if (sub_80A5350(taskId) == TRUE) - return; - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_80A4DA4(gBGTilemapBuffers[1]); - sub_80A6B64(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - PlaySE(SE_SELECT); - sub_80A5D38(taskId); - } -} - -static void OnItemSelect_PC(u8 taskId) -{ - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - PlaySE(SE_SELECT); - sub_80A7590(); - if (sCurrentBagPocket != BAG_POCKET_KEY_ITEMS) - { - gTasks[taskId].func = sub_80A6BE0; - sub_80A7528(6); - // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way - if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) - sub_80A4DD8(taskId, 6, 9, 7, 3, 3); - else - sub_80A4DD8(taskId, 7, 9, 6, 3, 2); - } - else - { - gTasks[taskId].data[1] = 1; - sub_80A6B64(taskId); - } -} - -bool32 sub_80A6D1C(void) -{ - HideMapNamePopup(); - if (gSaveBlock1.registeredItem != 0) - { - if (CheckBagHasItem(gSaveBlock1.registeredItem, 1) == TRUE) - { - u8 taskId; - - ScriptContext2_Enable(); - FreezeMapObjects(); - sub_80594C0(); - sub_80597F4(); - gSpecialVar_ItemId = gSaveBlock1.registeredItem; - taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1.registeredItem), 8); - gTasks[taskId].data[2] = 1; - return TRUE; - } - gSaveBlock1.registeredItem = 0; - } - ScriptContext1_SetupScript(Event_NoRegisteredItem); - return TRUE; -} - -static void sub_80A6D98(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - gUnknown_02038563 = CreateTask(sub_80A50C8, 0); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_80A6DCC(void) -{ - sPopupMenuSelection = 0; - sReturnLocation = RETURN_TO_BATTLE; - SetMainCallback2(sub_80A6D98); -} - -static void sub_80A6DF0(u16 *a) -{ - u8 r6 = (gUnknown_02038564 - 1) * 2; - - Menu_DrawStdWindowFrame(7, 9 - r6, 13, 12); - sub_80A4008(a, 8, 10 - r6, 5, r6 + 2); - if (gUnknown_02038564 == 1) - { - Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 10); - } - else - { - Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8); - Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10); - } - InitMenu(0, 8, 10 - r6, gUnknown_02038564, 0, 5); - sub_80A7528(2); -} - -static void sub_80A6EB8(u8 taskId) -{ - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - if (sPopupMenuSelection == 1) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = Menu_MoveCursor(-1); - } - } - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - if (sPopupMenuSelection + 1 < gUnknown_02038564) - { - PlaySE(SE_SELECT); - sPopupMenuSelection = Menu_MoveCursor(1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A4DA4(gBGTilemapBuffers[1]); - sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - gTasks[taskId].data[10] = 0; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A4DA4(gBGTilemapBuffers[1]); - sItemPopupMenuActions[5].func(taskId); - } -} - -static const u8 gUnknown_083C1708[] = {4, 5}; -static const u8 gUnknown_083C170A[] = {5, 0}; - -static void sub_80A6FDC(void) -{ - if (ItemId_GetBattleUsage(gSpecialVar_ItemId) != 0) - { - sPopupMenuActionList = gUnknown_083C1708; - gUnknown_02038564 = 2; - } - else - { - sPopupMenuActionList = gUnknown_083C170A; - gUnknown_02038564 = 1; - } -} - -static void OnItemSelect_Battle(u8 taskId) -{ - sPopupMenuSelection = 0; - sub_80A6FDC(); - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - sub_80A6DF0(gBGTilemapBuffers[1]); - gTasks[taskId].func = sub_80A6EB8; -} - -void sub_80A7094(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)sub_802E424 >> 16; - gTasks[taskId].data[9] = (u32)sub_802E424; - gTasks[taskId].func = HandleItemMenuPaletteFade; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -static void OnBagClose_Battle(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_80A7094(taskId); -} - -static void HandlePopupMenuAction_UseInBattle(u8 taskId) -{ - if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL) - { - PlaySE(SE_SELECT); - ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); - } -} - -static void sub_80A7124(u8 taskId) -{ - PlaySE(SE_SELECT); - sub_80A7528(0); - sub_80A41D4(taskId); - ItemListMenu_InitMenu(); - sub_80A37C0(taskId); -} - -static void sub_80A7150(void) -{ - while (1) - { - if (SetupBagMultistep() == TRUE) - { - gUnknown_02038563 = CreateTask(sub_80A7230, 0); - gTasks[gUnknown_02038563].data[15] = 0; - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void PrepareBagForWallyTutorial(void) -{ - u8 i; - - sPopupMenuSelection = 0; - sCurrentBagPocket = BAG_POCKET_ITEMS; - for (i = 0; i < 5; i++) - { - gBagPocketScrollStates[i].cursorPos = 0; - gBagPocketScrollStates[i].scrollTop = 0; - } - - // Save player's items - memcpy(ewramSavedItemsPocket, gSaveBlock1.bagPocket_Items, sizeof(gSaveBlock1.bagPocket_Items)); - memcpy(ewramSavedPokeballsPocket, gSaveBlock1.bagPocket_PokeBalls, sizeof(gSaveBlock1.bagPocket_PokeBalls)); - - // Add Wally's items to the bag - ClearItemSlots(gSaveBlock1.bagPocket_Items, ARRAY_COUNT(gSaveBlock1.bagPocket_Items)); - ClearItemSlots(gSaveBlock1.bagPocket_PokeBalls, ARRAY_COUNT(gSaveBlock1.bagPocket_PokeBalls)); - AddBagItem(ITEM_POTION, 1); - AddBagItem(ITEM_POKE_BALL, 1); - - sReturnLocation = RETURN_TO_WALLY_BATTLE; - SetMainCallback2(sub_80A7150); -} - -static void sub_80A7230(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - switch (taskData[15]) - { - case 102: - PlaySE(SE_SELECT); - sub_80A4E8C(1, 2); - break; - case 204: - PlaySE(SE_SELECT); - StopVerticalScrollIndicators(LEFT_ARROW); - StopVerticalScrollIndicators(RIGHT_ARROW); - gSpecialVar_ItemId = ITEM_POKE_BALL; - sPopupMenuActionList = gUnknown_083C1708; - gUnknown_02038564 = 2; - gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; - sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); - sub_80A73FC(); - sub_80A6DF0(gBGTilemapBuffers[1]); - break; - case 306: - PlaySE(SE_SELECT); - sub_80A4DA4(gBGTilemapBuffers[1]); - - // Restore player's items - memcpy(gSaveBlock1.bagPocket_Items, ewramSavedItemsPocket, sizeof(gSaveBlock1.bagPocket_Items)); - memcpy(gSaveBlock1.bagPocket_PokeBalls, ewramSavedPokeballsPocket, sizeof(gSaveBlock1.bagPocket_PokeBalls)); - - taskData[8] = (u32)sub_802E424 >> 16; - taskData[9] = (u32)sub_802E424; - gTasks[taskId].func = HandleItemMenuPaletteFade; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - return; - } - taskData[15]++; -} - -static void ItemListMenu_InitMenu(void) -{ - InitMenu(0, 14, 2, gBagPocketScrollStates[sCurrentBagPocket].cursorMax + 1, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, 0); - CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 15); - sub_80A73C0(); -} - -static void sub_80A73C0(void) -{ - MenuCursor_SetPos814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16); -} - -static void sub_80A73F0(void) -{ - sub_814ADC8(); -} - -static void sub_80A73FC(void) -{ - Menu_DestroyCursor(); - MenuCursor_Destroy814AD44(); -} - -static void sub_80A740C(void) -{ - sub_80A75E4(); - sub_80A7768(); - sub_80A7420(); -#if DEBUG - if (gLinkOpen == TRUE) - debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 0); -#endif -} - -static void sub_80A7420(void) -{ - struct UnknownStruct2 *unkStruct = &gUnknown_0203853C; - int index; - - switch (unkStruct->unk0) - { - case 3: - unkStruct->unk0 = 2; - break; - case 2: - switch (unkStruct->unk2) - { - case 0: - index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; - ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, unkStruct->textLine); - break; - case 1: - sub_80A4A98(gOtherText_SwitchWhichItem, unkStruct->textLine); - break; - case 2: - sub_80A4A98(gOtherText_WhatWillYouDo2, unkStruct->textLine); - break; - case 3: - sub_80A4A98(gOtherText_HowManyToToss, unkStruct->textLine); - break; - case 4: - sub_80A4A98(gOtherText_ThrewAwayItem, unkStruct->textLine); - break; - case 5: - sub_80A4A98(gOtherText_OkayToThrowAwayPrompt, unkStruct->textLine); - break; - case 6: - sub_80A4A98(gOtherText_HowManyToDeposit, unkStruct->textLine); - break; - case 7: - sub_80A4A98(gOtherText_DepositedItems, unkStruct->textLine); - break; - case 8: - sub_80A4A98(gOtherText_NoRoomForItems, unkStruct->textLine); - break; - case 9: - sub_80A4A98(gOtherText_CantStoreSomeoneItem, unkStruct->textLine); - break; - } - unkStruct->textLine++; - if (unkStruct->textLine == 3) - { - unkStruct->unk0 = 0; - sub_80A7918(); - } - break; - } -} - -static void sub_80A751C(void) -{ - gUnknown_0203853C.unk0 = 0; -} - -static void sub_80A7528(u8 a) -{ - gUnknown_0203853C.textLine = 0; - gUnknown_0203853C.unk2 = a; - switch (sub_80A78F4()) - { - case 0: - gUnknown_0203853C.unk0 = 2; - while (gUnknown_0203853C.unk0 != 0) - sub_80A7420(); - break; - case 1: - gUnknown_0203853C.unk0 = 3; - break; - case 2: - gUnknown_0203853C.unk0 = 1; - break; - } -} - -static void sub_80A756C(void) -{ - if (gUnknown_0203853C.unk0 == 2 || gUnknown_0203853C.unk0 == 3) - sub_80A7918(); - gUnknown_0203853C.unk0 = 0; -} - -static void sub_80A7590(void) -{ - Menu_EraseWindowRect(0, 13, 13, 20); - sub_80A756C(); -} - -static void sub_80A75A8(void) -{ - if (gUnknown_0203853C.unk0 == 2 || gUnknown_0203853C.unk0 == 3) - gUnknown_0203853C.unk0 = 1; -} - -static void sub_80A75C4(void) -{ - switch (gUnknown_0203853C.unk0) - { - case 1: - gUnknown_0203853C.unk0 = 3; - break; - case 0: - sub_80A7918(); - break; - } -} - -static void sub_80A75E4(void) -{ - if (gUnknown_02038540.unk0 == 1 && sub_80A7988() == 0) - { - int r1; - - sub_80A47E8(gUnknown_02038563, gUnknown_02038540.unk1, gUnknown_02038540.unk1, 1); - gUnknown_02038540.unk1++; - if (gUnknown_02038540.unk2 != 0) - r1 = 5; - else - r1 = 7; - if (r1 < gUnknown_02038540.unk1) - { - gUnknown_02038540.unk0 = 0; - sub_80A78E8(); - } - } -} - -static void sub_80A7630(void) -{ - gUnknown_02038540.unk0 = 0; -} - -static void sub_80A763C(void) -{ - struct UnknownStruct3 *r4 = &gUnknown_02038540; - - switch (sub_80A78C4()) - { - case FALSE: - sub_80A48E8(gUnknown_02038563, 0, 7); - break; - case TRUE: - r4->unk0 = 1; - r4->unk1 = 0; - r4->unk2 = 0; - break; - } -} - -static void sub_80A7678(void) -{ - if (gUnknown_02038540.unk0 == 1) - sub_80A78E8(); - gUnknown_02038540.unk0 = 0; -} - -static void sub_80A7694(void) -{ - gUnknown_02038540.unk2 = 1; -} - -static void sub_80A76A0(void) -{ - Menu_EraseWindowRect(14, 2, 29, 18); - sub_80A7678(); -} - -static bool32 sub_80A76B8(void) -{ - struct UnknownStruct3 *s = &gUnknown_02038540; - - return (s->unk0 == 0); -} - -static bool32 sub_80A76D0(void) -{ - struct UnknownStruct3 *s = &gUnknown_02038540; - - return (s->unk1 > 5); -} - -static void sub_80A76E8(void) -{ - if (gUnknown_02038544.unk0 == 1) - { - DisplayItemMessageOnField( - gUnknown_02038544.unk1, - gUnknown_02038544.unk4, - gUnknown_02038544.unk8, - gUnknown_02038544.unk2); - gUnknown_02038544.unk0 = 0; - } -} - -static void sub_80A770C(void) -{ - gUnknown_02038544.unk0 = 0; -} - -static void DisplayCannotUseItemMessage(int a, const u8 *b, TaskFunc func, int d) -{ - struct UnknownStruct4 *r4 = &gUnknown_02038544; - - switch (sub_80A7924()) - { - case 0: - DisplayItemMessageOnField(a, b, func, d); - break; - case 2: - r4->unk0 = 1; - r4->unk1 = a; - r4->unk4 = b; - r4->unk8 = func; - r4->unk2 = d; - break; - } -} - -static void sub_80A7768(void) -{ - struct UnknownStruct5 *r4 = &gUnknown_02038550; - - if (r4->unk0 == 2) - { - if (r4->unk1 != 0) - { - if (r4->unk2 != 1) - { - const u8 *text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; - int var = r4->unk1 - 1; - - Menu_PrintText(text, 7, var * 2 + 1 + r4->unk3); - } - else - { - const u8 *text; - int var; - - if (r4->unk1 == 1) - text = sub_80A4B90(gSpecialVar_ItemId); - else - text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; - var = r4->unk1 - 1; - Menu_PrintText(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8); - } - if (r4->unk1 == gUnknown_02038564) - { - r4->unk0 = 0; - sub_80A7970(); - } - } - r4->unk1++; - } -} - -static void sub_80A7828(void) -{ - gUnknown_02038550.unk0 = 0; -} - -static void sub_80A7834(int a, int b) -{ - struct UnknownStruct5 *r4 = &gUnknown_02038550; - - switch (sub_80A7958()) - { - case 1: - r4->unk0 = 2; - r4->unk1 = 0; - r4->unk2 = a; - r4->unk3 = b; - break; - case 2: - r4->unk0 = 1; - r4->unk1 = 0; - r4->unk2 = a; - r4->unk3 = b; - break; - } -} - -static void sub_80A7868(void) -{ - if (gUnknown_02038550.unk0 == 2) - gUnknown_02038550.unk0 = 1; -} - -static void sub_80A7880(void) -{ - switch (gUnknown_02038550.unk0) - { - case 1: - gUnknown_02038550.unk0 = 2; - break; - case 0: - sub_80A7970(); - break; - } -} - -static bool32 sub_80A78A0(void) -{ - struct UnknownStruct5 *r0 = &gUnknown_02038550; - - return (r0->unk0 == 0); -} - -static void sub_80A78B8(void) -{ - gUnknown_02038554.unk0 = 0; -} - -static bool32 sub_80A78C4(void) -{ - bool32 retVal; - - if (gLinkOpen == TRUE) - { - sub_80A7868(); - sub_80A75A8(); - retVal = TRUE; - } - else - { - retVal = FALSE; - } - return retVal; -} - -static void sub_80A78E8(void) -{ - sub_80A7880(); -} - -static int sub_80A78F4(void) -{ - int retVal; - - if (gLinkOpen == TRUE) - { - if (sub_80A76B8() != 0) - retVal = 1; - else - retVal = 2; - } - else - { - retVal = 0; - } - return retVal; -} - -static void sub_80A7918(void) -{ - sub_80A76E8(); -} - -static int sub_80A7924(void) -{ - if (gLinkOpen == TRUE && sub_80A76B8() == 0) - { - if (sub_80A76D0() != 0) - { - sub_80A7678(); - return 0; - } - } - else - { - return 0; - } - sub_80A7694(); - return 2; -} - -static int sub_80A7958(void) -{ - if (sub_80A76B8() == 0) - return 2; - sub_80A75A8(); - return 1; -} - -static void sub_80A7970(void) -{ - sub_80A75C4(); -} - -static void sub_80A797C(void) -{ - gUnknown_02038554.unk0 = 1; -} - -static int sub_80A7988(void) -{ - int val = gUnknown_02038554.unk0; - - gUnknown_02038554.unk0 = 0; - return val; -} - -static const u16 gPalette_83C170C[] = INCBIN_U16("graphics/unknown/83C170C.gbapal"); -static const u8 gSpriteImage_83C172C[] = INCBIN_U8("graphics/unknown_sprites/83C172C.4bpp"); - -const u8 gSpriteImage_UnusedCherry[] = INCBIN_U8("graphics/unused/cherry.4bpp"); -const u16 gSpritePalette_UnusedCherry[] = INCBIN_U16("graphics/unused/cherry.gbapal"); - -//------------------------------------------------------------------------------ -// Bag Sprite -//------------------------------------------------------------------------------ - -static const struct OamData sBagSpriteOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 2, - .paletteNum = 7, - .affineParam = 0, -}; - -static const union AnimCmd sBagSpriteAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq1[] = -{ - ANIMCMD_FRAME(64, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq5[] = -{ - ANIMCMD_FRAME(128, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq2[] = -{ - ANIMCMD_FRAME(192, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq3[] = -{ - ANIMCMD_FRAME(256, 4), - ANIMCMD_END, -}; - -static const union AnimCmd sBagSpriteAnimSeq4[] = -{ - ANIMCMD_FRAME(320, 4), - ANIMCMD_END, -}; - -static const union AnimCmd *const sBagSpriteAnimTable[] = -{ - sBagSpriteAnimSeq0, - sBagSpriteAnimSeq1, - sBagSpriteAnimSeq2, - sBagSpriteAnimSeq3, - sBagSpriteAnimSeq4, - sBagSpriteAnimSeq5, -}; - -static const union AffineAnimCmd sBagSpriteAffineAnimSeq[] = -{ - AFFINEANIMCMD_FRAME(0, 0, -2, 2), - AFFINEANIMCMD_FRAME(0, 0, 2, 4), - AFFINEANIMCMD_FRAME(0, 0, -2, 4), - AFFINEANIMCMD_FRAME(0, 0, 2, 2), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const sBagSpriteAffineAnimTable[] = -{ - sBagSpriteAffineAnimSeq, -}; - -static const struct CompressedSpriteSheet sMaleBagSpriteSheet = {gBagMaleTiles, 0x3000, 30000}; -static const struct CompressedSpriteSheet sFemaleBagSpriteSheet = {gBagFemaleTiles, 0x3000, 30000}; -static const struct CompressedSpritePalette sBagSpritePalette = {gBagPalette, 30000}; - -static void sub_80A7998(struct Sprite *sprite) -{ - sprite->animNum = 0; - sprite->data[0] = 0; - sprite->data[1] = 0; - sprite->data[2] = 0; - sprite->data[3] = 0; - sprite->data[4] = 0; - sprite->callback = sub_80A79B4; -} - -static void sub_80A79B4(struct Sprite *sprite) -{ - if (gUnknown_0203855B != -1) - sub_80A79EC(sprite); - if (gUnknown_0203855C != 0) - sub_80A7A94(sprite); -} - -static void sub_80A79EC(struct Sprite *sprite) -{ - switch (sprite->data[3]) - { - case 0: - if (gUnknown_0203855B != 6) - { - sprite->animBeginning = TRUE; - sprite->animNum = gUnknown_0203855B; - gUnknown_0203855B = -1; - } - else - { - sprite->animBeginning = TRUE; - sprite->animNum = 0; - sprite->pos1.y -= 4; - sprite->data[0] = 4; - sprite->data[3] = 1; - sub_80A7AE4(sprite); - } - break; - case 1: - if (sprite->data[0] != 0) - { - if (sprite->data[1] != 0) - { - sprite->pos1.y++; - sprite->data[0]--; - } - sprite->data[1] = (sprite->data[1] + 1) & 1; - } - else - { - gUnknown_0203855B = -1; - sprite->data[1] = 0; - sprite->data[3] = 0; - } - break; - } -} - -static void sub_80A7A94(struct Sprite *sprite) -{ - switch (sprite->data[4]) - { - case 0: - sprite->oam.affineMode = 1; - sprite->affineAnims = sBagSpriteAffineAnimTable; - InitSpriteAffineAnim(sprite); - sprite->data[4] = 1; - break; - case 1: - sprite->data[2]++; - if (sprite->data[2] == 12) - sub_80A7AE4(sprite); - break; - } -} - -static void sub_80A7AE4(struct Sprite *sprite) -{ - gUnknown_0203855C = 0; - sprite->oam.affineMode = 0; - sprite->data[2] = 0; - sprite->data[4] = 0; - FreeOamMatrix(sprite->oam.matrixNum); -} - -static const struct SpriteTemplate sBagSpriteTemplate = -{ - .tileTag = 30000, - .paletteTag = 30000, - .oam = &sBagSpriteOamData, - .anims = sBagSpriteAnimTable, - .images = NULL, - .affineAnims = sBagSpriteAffineAnimTable, - .callback = sub_80A7998, -}; - -static void CreateBagSprite(void) -{ - CreateSprite(&sBagSpriteTemplate, 58, 40, 0); -} - -//------------------------------------------------------------------------------ -// Pokeball Sprite -//------------------------------------------------------------------------------ - -static const struct OamData gOamData_83C1CF8 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 4, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 8, - .affineParam = 0, -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83C1D00[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 8, 32), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83C1D10[] = -{ - AFFINEANIMCMD_FRAME(0, 0, -8, 32), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83C1D20[] = -{ - gSpriteAffineAnim_83C1D00, - gSpriteAffineAnim_83C1D10, -}; - -static const struct SpriteFrameImage gSpriteImageTable_83C1D28[] = -{ - {gSpriteImage_83C172C, sizeof(gSpriteImage_83C172C)}, -}; - -static const struct SpritePalette sPokeballSpritePalette = {gPalette_83C170C, 8}; - -static void sub_80A7B28(struct Sprite *sprite) -{ - sprite->data[3] = 0; - sprite->data[0] = 0; - sub_80A7B6C(sprite); - sprite->callback = sub_80A7B6C; -} - -static void sub_80A7B48(struct Sprite *sprite) -{ - sprite->centerToCornerVecX = sprite->data[5] - ((sprite->data[0] + 1) & 1); - sprite->centerToCornerVecY = sprite->data[6] - ((sprite->data[0] + 1) & 1); -} - -static void sub_80A7B6C(struct Sprite *sprite) -{ - if (sprite->data[7] != 0) - { - switch (sprite->data[3]) - { - case 0: - sprite->oam.affineMode = 1; - if (sprite->data[7] == 1) - sprite->affineAnims = gSpriteAffineAnimTable_83C1D20; - else - sprite->affineAnims = gSpriteAffineAnimTable_83C1D20 + 1; - InitSpriteAffineAnim(sprite); - sprite->data[3] = 1; - sprite->data[5] = sprite->centerToCornerVecX; - sprite->data[6] = sprite->centerToCornerVecY; - sub_80A7B48(sprite); - break; - case 1: - sprite->data[0]++; - sub_80A7B48(sprite); - if (sprite->data[0] == 32) - { - sprite->data[0] = 0; - sprite->data[3] = 0; - sprite->centerToCornerVecX = sprite->data[5]; - sprite->centerToCornerVecY = sprite->data[6]; - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = 0; - sprite->callback = SpriteCallbackDummy; - } - break; - } - } -} - -static const struct SpriteTemplate sPokeballSpriteTemplate = -{ - .tileTag = 0xFFFF, - .paletteTag = 8, - .oam = &gOamData_83C1CF8, - .anims = sBagSpriteAnimTable, - .images = gSpriteImageTable_83C1D28, - .affineAnims = gSpriteAffineAnimTable_83C1D20, - .callback = sub_80A7B28, -}; - -static void CreateBagPokeballSprite(u8 a) -{ - LoadSpritePalette(&sPokeballSpritePalette); - sPokeballSpriteId = CreateSprite(&sPokeballSpriteTemplate, 16, 88, 0); - gSprites[sPokeballSpriteId].data[7] = a; -} - -static void sub_80A7C64(void) -{ - FreeSpritePaletteByTag(8); - FreeOamMatrix(gSprites[sPokeballSpriteId].oam.matrixNum); - DestroySprite(&gSprites[sPokeballSpriteId]); -} - -static const struct OamData sBerrySpriteOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 7, - .affineParam = 0, -}; - -static const struct OamData gOamData_83C1D58 = -{ - .y = 0, - .affineMode = 3, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 7, - .affineParam = 0, -}; - -static const union AnimCmd sBerrySpriteAnimSeq[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const sBerrySpriteAnimTable[] = -{ - sBerrySpriteAnimSeq, -}; - -static const struct SpriteFrameImage sBerrySpriteImageTable[] = -{ - {ewramBerryPic, 0x800}, -}; - -static void SpriteCB_BerrySprite(struct Sprite *); -static const struct SpriteTemplate sBerrySpriteTemplate = -{ - .tileTag = 0xFFFF, - .paletteTag = 30020, - .oam = &sBerrySpriteOamData, - .anims = sBerrySpriteAnimTable, - .images = sBerrySpriteImageTable, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_BerrySprite, -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83C1D8C[] = -{ - AFFINEANIMCMD_FRAME(-1, -1, -3, 96), - AFFINEANIMCMD_FRAME(0, 0, 0, 16), - AFFINEANIMCMD_FRAME(-2, -2, -1, 64), - AFFINEANIMCMD_FRAME(-8, 0, 0, 16), - AFFINEANIMCMD_FRAME(0, -8, 0, 16), - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83C1DC4[] = -{ - AFFINEANIMCMD_FRAME(-1, -1, 3, 96), - AFFINEANIMCMD_FRAME(0, 0, 0, 16), - AFFINEANIMCMD_FRAME(-2, -2, 1, 64), - AFFINEANIMCMD_FRAME(-8, 0, 0, 16), - AFFINEANIMCMD_FRAME(0, -8, 0, 16), - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83C1DFC[] = -{ - gSpriteAffineAnim_83C1D8C, - gSpriteAffineAnim_83C1DC4, -}; - -static const struct SpriteTemplate gSpriteTemplate_83C1E04 = -{ - .tileTag = 0xFFFF, - .paletteTag = 30020, - .oam = &gOamData_83C1D58, - .anims = sBerrySpriteAnimTable, - .images = sBerrySpriteImageTable, - .affineAnims = gSpriteAffineAnimTable_83C1DFC, - .callback = SpriteCallbackDummy, -}; - -static const struct {const u8 *lzPic; const u8 *lzPalette;} sBerryGraphicsTable[] = -{ - {gBerryPic_Cheri, gBerryPalette_Cheri}, - {gBerryPic_Chesto, gBerryPalette_Chesto}, - {gBerryPic_Pecha, gBerryPalette_Pecha}, - {gBerryPic_Rawst, gBerryPalette_Rawst}, - {gBerryPic_Aspear, gBerryPalette_Aspear}, - {gBerryPic_Leppa, gBerryPalette_Leppa}, - {gBerryPic_Oran, gBerryPalette_Oran}, - {gBerryPic_Persim, gBerryPalette_Persim}, - {gBerryPic_Lum, gBerryPalette_Lum}, - {gBerryPic_Sitrus, gBerryPalette_Sitrus}, - {gBerryPic_Figy, gBerryPalette_Figy}, - {gBerryPic_Wiki, gBerryPalette_Wiki}, - {gBerryPic_Mago, gBerryPalette_Mago}, - {gBerryPic_Aguav, gBerryPalette_Aguav}, - {gBerryPic_Iapapa, gBerryPalette_Iapapa}, - {gBerryPic_Razz, gBerryPalette_Razz}, - {gBerryPic_Bluk, gBerryPalette_Bluk}, - {gBerryPic_Nanab, gBerryPalette_Nanab}, - {gBerryPic_Wepear, gBerryPalette_Wepear}, - {gBerryPic_Pinap, gBerryPalette_Pinap}, - {gBerryPic_Pomeg, gBerryPalette_Pomeg}, - {gBerryPic_Kelpsy, gBerryPalette_Kelpsy}, - {gBerryPic_Qualot, gBerryPalette_Qualot}, - {gBerryPic_Hondew, gBerryPalette_Hondew}, - {gBerryPic_Grepa, gBerryPalette_Grepa}, - {gBerryPic_Tamato, gBerryPalette_Tamato}, - {gBerryPic_Cornn, gBerryPalette_Cornn}, - {gBerryPic_Magost, gBerryPalette_Magost}, - {gBerryPic_Rabuta, gBerryPalette_Rabuta}, - {gBerryPic_Nomel, gBerryPalette_Nomel}, - {gBerryPic_Spelon, gBerryPalette_Spelon}, - {gBerryPic_Pamtre, gBerryPalette_Pamtre}, - {gBerryPic_Watmel, gBerryPalette_Watmel}, - {gBerryPic_Durin, gBerryPalette_Durin}, - {gBerryPic_Belue, gBerryPalette_Belue}, - {gBerryPic_Liechi, gBerryPalette_Liechi}, - {gBerryPic_Ganlon, gBerryPalette_Ganlon}, - {gBerryPic_Salac, gBerryPalette_Salac}, - {gBerryPic_Petaya, gBerryPalette_Petaya}, - {gBerryPic_Apicot, gBerryPalette_Apicot}, - {gBerryPic_Lansat, gBerryPalette_Lansat}, - {gBerryPic_Starf, gBerryPalette_Starf}, - {gBerryPic_Enigma, gBerryPalette_Enigma}, -}; - -static void DrawBerryPic(const u8 *src, u8 *dst) -{ - u8 i; - u8 j; - - memset(dst, 0, 0x800); - dst += 0x100; - for (i = 0; i < 6; i++) - { - dst += 32; - for (j = 0; j < 6; j++) - { - memcpy(dst, src, 32); - dst += 32; - src += 32; - } - if (i != 5) - dst += 32; - } -} - -static void LoadBerryPic(u8 berryId) -{ - struct SpritePalette spritePal; - - if (berryId == 0x2A && IsEnigmaBerryValid() == TRUE) - { - DrawBerryPic(gSaveBlock1.enigmaBerry.pic, ewramBerryPic); - spritePal.data = gSaveBlock1.enigmaBerry.palette; - spritePal.tag = 0x7544; - LoadSpritePalette(&spritePal); - } - else - { - spritePal.data = (u16 *)sBerryGraphicsTable[berryId].lzPalette; - spritePal.tag = 0x7544; - LoadCompressedObjectPalette((struct CompressedSpritePalette *)&spritePal); - LZDecompressWram(sBerryGraphicsTable[berryId].lzPic, ewramBerryPicTemp); - DrawBerryPic(ewramBerryPicTemp, ewramBerryPic); - } -} - -u8 CreateBerrySprite(u8 berryId, s16 x, s16 y) -{ - LoadBerryPic(berryId); - return CreateSprite(&sBerrySpriteTemplate, x, y, 0); -} - -static void SpriteCB_BerrySprite(struct Sprite *sprite) -{ - sprite->pos2.y = -gBattle_BG1_Y; -} - -void sub_80A7DD4(void) -{ - FreeSpritePaletteByTag(0x7544); - FreeSpritePaletteByTag(8); -} - -u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate) -{ - u8 spriteId; - - FreeSpritePaletteByTag(0x7544); - LoadBerryPic(berryId); - spriteId = CreateSprite(&gSpriteTemplate_83C1E04, x, y, 0); - if (animate == TRUE) - StartSpriteAffineAnim(&gSprites[spriteId], 1); - return spriteId; -} - -const struct CompressedSpriteSheet gUnknown_083C1F74 = {gBerryCheckCircle_Gfx, 2048, 0x2710}; - -const struct CompressedSpritePalette gUnknown_083C1F7C = {gBerryCheck_Pal, 0x2710}; - -static const struct OamData gOamData_83C1F84 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd gSpriteAnim_83C1F8C[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_83C1F94[] = -{ - gSpriteAnim_83C1F8C, -}; - -static const struct SpriteTemplate gSpriteTemplate_83C1F98 = -{ - .tileTag = 10000, - .paletteTag = 10000, - .oam = &gOamData_83C1F84, - .anims = gSpriteAnimTable_83C1F94, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_BerrySprite, -}; - -u8 sub_80A7E5C(s16 x) -{ - return CreateSprite(&gSpriteTemplate_83C1F98, x, 99, 0); -} diff --git a/src/field/item_use.c b/src/field/item_use.c deleted file mode 100644 index a0fbb13b2..000000000 --- a/src/field/item_use.c +++ /dev/null @@ -1,1200 +0,0 @@ -#include "global.h" -#include "item_use.h" -#include "battle.h" -#include "berry.h" -#include "bike.h" -#include "coins.h" -#include "data2.h" -#include "event_data.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "item.h" -#include "item_menu.h" -#include "constants/flags.h" -#include "constants/items.h" -#include "mail.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "menu_helpers.h" -#include "metatile_behavior.h" -#include "palette.h" -#include "party_menu.h" -#include "pokeblock.h" -#include "pokemon_item_effect.h" -#include "pokemon_menu.h" -#include "overworld.h" -#include "rom_8094928.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "constants/vars.h" - -extern void (*gFieldItemUseCallback)(u8); -extern void (*gFieldCallback)(void); -extern void (*gUnknown_0300485C)(void); -extern void (*gPokemonItemUseCallback)(u8, u16, TaskFunc); - -extern u8 gUnknown_02038561; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gBankInMenu; - -extern u8 gUnknown_081A1654[]; -extern u8 gUnknown_081A168F[]; - -extern u16 gBattlePartyID[]; - -extern u16 gBattleTypeFlags; - -static const u8 gSSTidalBetaString[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); -static const u8 gSSTidalBetaString2[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); - -static const u8 *const gUnknown_083D61DC[2] = -{ - gSSTidalBetaString, - gSSTidalBetaString2, -}; - -static const MainCallback gExitToOverworldFuncList[] = -{ - sub_808B020, - c2_exit_to_overworld_2_switch, - sub_810B96C, -}; - -static const u8 gItemFinderDirections[] = { DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST }; - -static const struct YesNoFuncTable gUnknown_083D61F4 = -{ - .yesFunc = sub_80C9FC0, - .noFunc = CleanUpItemMenuMessage, -}; - -void ExecuteSwitchToOverworldFromItemUse(u8 taskId) -{ - u8 taskData; - - if (gSpecialVar_ItemId == 0xAF) - taskData = gTasks[taskId].data[15] - 1; - else - taskData = ItemId_GetType(gSpecialVar_ItemId) - 1; - - gTasks[taskId].data[8] = (u32)gExitToOverworldFuncList[taskData] >> 16; - gTasks[taskId].data[9] = (u32)gExitToOverworldFuncList[taskData]; - gTasks[taskId].func = HandleItemMenuPaletteFade; -} - -void ItemMenu_ConfirmNormalFade(u8 var) -{ - ExecuteSwitchToOverworldFromItemUse(var); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void ItemMenu_ConfirmComplexFade(u8 var) -{ - ExecuteSwitchToOverworldFromItemUse(var); - FadeScreen(1, 0); -} - -void SetUpItemUseOnFieldCallback(u8 taskId) -{ - if (gTasks[taskId].data[2] != 1) - { - gFieldCallback = ExecuteItemUseFromBlackPalette; - ItemMenu_ConfirmNormalFade(taskId); - } - else - { - gFieldItemUseCallback(taskId); - } -} - -void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) -{ - StringExpandPlaceholders(gStringVar4, text); - - switch (playerMenuStatus) - { - case 0: // Item Menu - Menu_EraseWindowRect(0, 13, 13, 20); - DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1); - break; - default: // Field - DisplayItemMessageOnField(var1, gStringVar4, CleanUpOverworldMessage, 0); - break; - } -} - -void DisplayDadsAdviceCannotUseItemMessage(u8 var1, u8 playerMenuStatus) -{ - HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_DadsAdvice); -} - -void DisplayCantGetOffBikeItemMessage(u8 var1, u8 playerMenuStatus) -{ - HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_CantGetOffBike); -} - -u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId) -{ - if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM) - return 1; - else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone) - return 2; - else - return 0; -} - -void ItemMenu_ReadMail(u8 taskId) -{ - struct MailStruct mailStruct; - - if (!gPaletteFade.active) - { - mailStruct.itemId = gSpecialVar_ItemId; - HandleReadMail(&mailStruct, sub_80A5D04, 0); - DestroyTask(taskId); - } -} - -void ItemUseOutOfBattle_Mail(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = ItemMenu_ReadMail; -} - -void ItemUseOutOfBattle_Bike(u8 taskId) -{ - s16 x, y; - u8 tileBehavior; - - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - if (FlagGet(FLAG_SYS_CYCLING_ROAD) == TRUE // on cycling road? - || MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE - || MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE - || MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE - || MetatileBehavior_IsIsolatedHorizontalRail(tileBehavior) == TRUE) - { - DisplayCantGetOffBikeItemMessage(taskId, gTasks[taskId].data[2]); - } - else - { - if (Overworld_IsBikingAllowed() == TRUE && IsBikingDisallowedByPlayer() == FALSE) - { - gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Bike; - SetUpItemUseOnFieldCallback(taskId); - } - else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOnFieldCB_Bike(u8 taskId) -{ - if (ItemId_GetSecondaryId(gSpecialVar_ItemId) == 0) - GetOnOffBike(2); - if (ItemId_GetSecondaryId(gSpecialVar_ItemId) == 1) - GetOnOffBike(4); - - sub_8064E2C(); - ScriptContext2_Disable(); - DestroyTask(taskId); -} - -bool32 CanFish(void) -{ - s16 x, y; - u16 tileBehavior; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - - if (MetatileBehavior_IsWaterfall(tileBehavior)) - return FALSE; - - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) - return FALSE; - - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - { - if (IsPlayerFacingSurfableFishableWater()) - return TRUE; - } - else - { - if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior) && !MapGridIsImpassableAt(x, y)) - return TRUE; - if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) - return TRUE; - } - - return FALSE; -} - -void ItemUseOutOfBattle_Rod(u8 taskId) -{ - if (CanFish() == TRUE) - { - gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Rod; - SetUpItemUseOnFieldCallback(taskId); - } - else - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); -} - -void ItemUseOnFieldCB_Rod(u8 taskId) -{ - StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId)); - DestroyTask(taskId); -} - -void ItemUseOutOfBattle_Itemfinder(u8 var) -{ - IncrementGameStat(GAME_STAT_USED_ITEMFINDER); - gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Itemfinder; - SetUpItemUseOnFieldCallback(var); -} - -void ItemUseOnFieldCB_Itemfinder(u8 taskId) -{ - if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) - gTasks[taskId].func = RunItemfinderResults; - else - DisplayItemMessageOnField(taskId, gOtherText_NoResponse, ExitItemfinder, 0); -} - -void RunItemfinderResults(u8 taskId) -{ - u8 playerDir; - u8 playerDirToItem; - u8 i; - s16 *data = gTasks[taskId].data; - - if (!data[3]) - { - if (data[4] == 4) - { - playerDirToItem = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]); - if (playerDirToItem) - { - SetPlayerDirectionTowardsItem(gItemFinderDirections[playerDirToItem - 1]); - gTasks[taskId].func = DisplayItemRespondingMessageAndExitItemfinder; - } - else // player is above hidden item. - { - playerDir = player_get_direction_lower_nybble(); - - // rotate player clockwise depending on current direction. - for (i = 0; i < 4; i++) - if (playerDir == gItemFinderDirections[i]) - data[5] = (i + 1) & 3; - - gTasks[taskId].func = RotatePlayerAndExitItemfinder; - data[3] = 0; - data[2] = 0; - } - return; - } - PlaySE(SE_DAUGI); // play the itemfinder jingle 4 times before executing the itemfinder. - data[4]++; - } - data[3] = (data[3] + 1) & 0x1F; -} - -void ExitItemfinder(u8 taskId) -{ - Menu_EraseWindowRect(0, 14, 29, 19); - sub_8064E2C(); - ScriptContext2_Disable(); - DestroyTask(taskId); -} - -bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId) -{ - int distanceX, distanceY; - u16 x, y; - s16 newDistanceX, newDistanceY, i; - - PlayerGetDestCoords(&x, &y); - gTasks[taskId].data[2] = FALSE; - - for (i = 0; i < events->bgEventCount; i++) - { - if ((events -> bgEvents[i].kind == 7) && !FlagGet(events -> bgEvents[i].bgUnion.hiddenItem.hiddenItemId + FLAG_HIDDEN_ITEMS_START)) - { - // do a distance lookup of each item so long as the index remains less than the objects on the current map. - distanceX = (u16)events -> bgEvents[i].x + 7; - newDistanceX = distanceX - x; - distanceY = (u16)events -> bgEvents[i].y + 7; - newDistanceY = distanceY - y; - - // is item in range? - if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6)) - sub_80C9838(taskId, newDistanceX, newDistanceY); // send coordinates of the item relative to the player - } - } - sub_80C9720(taskId); - - // hidden item detected? - if (gTasks[taskId].data[2] == TRUE) - return TRUE; - else - return FALSE; -} - -bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y) -{ - u8 bgEventCount = events->bgEventCount; - struct BgEvent *bgEvent = events->bgEvents; - int i; - - for (i = 0; i < bgEventCount; i++) - { - if (bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed? - { - if (!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + FLAG_HIDDEN_ITEMS_START)) - return TRUE; - else - return FALSE; - } - } - return FALSE; -} - -bool8 sub_80C9688(struct MapConnection *connection, int x, int y) -{ - struct MapHeader *mapHeader; - u16 localX, localY; - u32 localOffset; - s32 localLength; - - mapHeader = mapconnection_get_mapheader(connection); - - switch (connection->direction) - { - // same weird temp variable behavior seen in HiddenItemAtPos - case 2: - localOffset = connection->offset + 7; - localX = x - localOffset; - localLength = mapHeader->mapData->height - 7; - localY = localLength + y; // additions are reversed for some reason - break; - case 1: - localOffset = connection->offset + 7; - localX = x - localOffset; - localLength = gMapHeader.mapData->height + 7; - localY = y - localLength; - break; - case 3: - localLength = mapHeader->mapData->width - 7; - localX = localLength + x; // additions are reversed for some reason - localOffset = connection->offset + 7; - localY = y - localOffset; - break; - case 4: - localLength = gMapHeader.mapData->width + 7; - localX = x - localLength; - localOffset = connection->offset + 7; - localY = y - localOffset; - break; - default: - return FALSE; - } - return HiddenItemAtPos(mapHeader->events, localX, localY); -} - -// weird math -#ifdef NONMATCHING -void sub_80C9720(u8 taskId) -{ - s16 x, y; - s16 curX, curY; - s16 width = gMapHeader.mapData->width + 7; - s16 height = gMapHeader.mapData->height + 7; - - PlayerGetDestCoords(&x, &y); - - for (curX = x - 7; curX <= x + 7; curX++) - { - for (curY = y - 5; curY <= y + 5; curY++) - { - if (7 > curX - || curX >= width - || 7 > curY - || curY >= height) - { - struct MapConnection *conn = sub_8056BA0(curX, curY); - if (conn && sub_80C9688(conn, curX, curY) == TRUE) - sub_80C9838(taskId, curX - x, curY - y); - } - } - } -} -#else -__attribute__((naked)) -void sub_80C9720(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - ldr r0, _080C9834 @ =gMapHeader\n\ - ldr r1, [r0]\n\ - ldr r0, [r1]\n\ - adds r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - ldr r0, [r1, 0x4]\n\ - adds r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0xC]\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl PlayerGetDestCoords\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - subs r0, 0x7\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - asrs r0, 16\n\ - mov r1, sp\n\ - movs r2, 0\n\ - ldrsh r1, [r1, r2]\n\ - adds r1, 0x7\n\ - cmp r0, r1\n\ - bgt _080C9824\n\ -_080C976E:\n\ - mov r5, sp\n\ - ldrh r0, [r5, 0x2]\n\ - subs r0, 0x5\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - movs r6, 0x2\n\ - ldrsh r0, [r5, r6]\n\ - adds r0, 0x5\n\ - lsls r3, 16\n\ - mov r8, r3\n\ - cmp r1, r0\n\ - bgt _080C980E\n\ - movs r0, 0x7\n\ - str r0, [sp, 0x10]\n\ - mov r1, r8\n\ - asrs r1, 16\n\ - mov r9, r1\n\ - mov r10, r0\n\ -_080C9796:\n\ - ldr r3, [sp, 0x10]\n\ - cmp r3, r9\n\ - bgt _080C97B8\n\ - ldr r5, [sp, 0x8]\n\ - lsls r0, r5, 16\n\ - asrs r0, 16\n\ - cmp r9, r0\n\ - bge _080C97B8\n\ - asrs r1, r2, 16\n\ - cmp r10, r1\n\ - bgt _080C97B8\n\ - ldr r6, [sp, 0xC]\n\ - lsls r0, r6, 16\n\ - asrs r0, 16\n\ - lsls r7, r4, 16\n\ - cmp r1, r0\n\ - blt _080C97F6\n\ -_080C97B8:\n\ - mov r0, r8\n\ - asrs r5, r0, 16\n\ - lsls r4, 16\n\ - asrs r6, r4, 16\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl sub_8056BA0\n\ - adds r7, r4, 0\n\ - cmp r0, 0\n\ - beq _080C97F6\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - bl sub_80C9688\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080C97F6\n\ - mov r0, sp\n\ - ldrh r1, [r0]\n\ - subs r1, r5, r1\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - ldrh r2, [r0, 0x2]\n\ - subs r2, r6, r2\n\ - lsls r2, 16\n\ - asrs r2, 16\n\ - ldr r0, [sp, 0x4]\n\ - bl sub_80C9838\n\ -_080C97F6:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r0, r7, r1\n\ - lsrs r4, r0, 16\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - mov r3, sp\n\ - movs r5, 0x2\n\ - ldrsh r0, [r3, r5]\n\ - adds r0, 0x5\n\ - cmp r1, r0\n\ - ble _080C9796\n\ -_080C980E:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - add r1, r8\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - mov r0, sp\n\ - movs r6, 0\n\ - ldrsh r0, [r0, r6]\n\ - adds r0, 0x7\n\ - cmp r1, r0\n\ - ble _080C976E\n\ -_080C9824:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080C9834: .4byte gMapHeader\n\ - .syntax divided"); -} -#endif - -void sub_80C9838(u8 taskId, s16 x, s16 y) -{ - s16 *data = gTasks[taskId].data; - s16 var1, var2, var3, var4; - - if (data[2] == FALSE) - { - data[0] = x; - data[1] = y; - data[2] = TRUE; - } - else - { - // data[0] and data[1] contain the player's coordinates. - // x and y contain the item's coordinates. - if (data[0] < 0) - var1 = data[0] * -1; // item is to the left - else - var1 = data[0]; // item is to the right - - if (data[1] < 0) - var2 = data[1] * -1; // item is to the north - else - var2 = data[1]; // item is to the south - - if (x < 0) - var3 = x * -1; - else - var3 = x; - - if (y < 0) - var4 = y * -1; - else - var4 = y; - - if (var1 + var2 > var3 + var4) - { - data[0] = x; - data[1] = y; - } - else - { - if (var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y))) - { - data[0] = x; - data[1] = y; - } - } - } -} - -u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY) -{ - s16 abX, abY; - - if (itemX == 0 && itemY == 0) - return DIR_NONE; // player is standing on the item. - - // get absolute X distance. - if (itemX < 0) - abX = itemX * -1; - else - abX = itemX; - - // get absolute Y distance. - if (itemY < 0) - abY = itemY * -1; - else - abY = itemY; - - if (abX > abY) - { - if (itemX < 0) - return DIR_EAST; - else - return DIR_NORTH; - } - else - { - if (abX < abY) - { - if (itemY < 0) - return DIR_SOUTH; - else - return DIR_WEST; - } - if (abX == abY) - { - if (itemY < 0) - return DIR_SOUTH; - else - return DIR_WEST; - } - return DIR_NONE; // should never get here. return something so it doesnt crash. - } -} - -void SetPlayerDirectionTowardsItem(u8 direction) -{ - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - UnfreezeMapObject(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - PlayerTurnInPlace(direction); -} - -void DisplayItemRespondingMessageAndExitItemfinder(u8 taskId) -{ - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) - DisplayItemMessageOnField(taskId, gOtherText_ItemfinderResponding, ExitItemfinder, 0); -} - -void RotatePlayerAndExitItemfinder(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE - || data[2] == FALSE) - { - SetPlayerDirectionTowardsItem(gItemFinderDirections[data[5]]); - data[2] = 1; - data[5] = (data[5] + 1) & 3; - data[3]++; - - if (data[3] == 4) - DisplayItemMessageOnField(taskId, gOtherText_ItemfinderItemUnderfoot, ExitItemfinder, 0); - } -} - -void ItemUseOutOfBattle_PokeblockCase(u8 taskId) -{ - if (sub_80F9344() == TRUE) - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } - else if (gTasks[taskId].data[2] != TRUE) - { - sub_810BA7C(0); - ItemMenu_ConfirmNormalFade(taskId); - } - else - { - gFieldCallback = (void *)sub_8080E28; - sub_810BA7C(1); - ItemMenu_ConfirmComplexFade(taskId); - } -} - -void ItemUseOutOfBattle_CoinCase(u8 taskId) -{ - ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4); - StringExpandPlaceholders(gStringVar4, gOtherText_Coins3); - - if (!gTasks[taskId].data[2]) - { - Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); - } - else - { - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpOverworldMessage, 0); - } -} - -void sub_80C9BB8(u8 var) -{ - if (gMain.newKeys & A_BUTTON) - CleanUpItemMenuMessage(var); -} - -void sub_80C9BD8(u8 var) -{ - if (gMain.newKeys & A_BUTTON) - CleanUpOverworldMessage(var); -} - -// unused -void ItemUseOutOfBattle_SSTicket(u8 taskId) -{ - if (gTasks[taskId].data[2] == 0) - { - Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BB8, 1); - } - else - { - DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BD8, 0); - } -} - -void sub_80C9C7C(u8 taskId) -{ - if (IsPlayerFacingUnplantedSoil() == TRUE) - { - gFieldItemUseCallback = sub_80C9D00; - gFieldCallback = ExecuteItemUseFromBlackPalette; - gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; - gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; - gTasks[taskId].func = HandleItemMenuPaletteFade; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - } - else - { - ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); - } -} - -void sub_80C9D00(u8 taskId) -{ - RemoveBagItem(gSpecialVar_ItemId, 1); - ScriptContext2_Enable(); - ScriptContext1_SetupScript(gUnknown_081A1654); - DestroyTask(taskId); -} - -void ItemUseOutOfBattle_WailmerPail(u8 taskId) -{ - if (TryToWaterBerryTree() == TRUE) - { - gFieldItemUseCallback = sub_80C9D74; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void sub_80C9D74(u8 taskId) -{ - ScriptContext2_Enable(); - ScriptContext1_SetupScript(gUnknown_081A168F); - DestroyTask(taskId); -} - -void sub_80C9D98(u8 taskId) -{ - gUnknown_02038561 = 0; - ItemMenu_ConfirmNormalFade(taskId); -} - -void ItemUseOutOfBattle_Medicine(u8 taskId) -{ - gPokemonItemUseCallback = UseMedicine; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_SacredAsh(u8 taskId) -{ - u8 i; - - gLastFieldPokeMenuOpened = 0; - - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - { - gLastFieldPokeMenuOpened = i; - break; - } - } - gPokemonItemUseCallback = sub_8070048; - gUnknown_02038561 = 4; - ItemMenu_ConfirmNormalFade(taskId); -} - -void ItemUseOutOfBattle_PPRecovery(u8 taskId) -{ - gPokemonItemUseCallback = DoPPRecoveryItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_PPUp(u8 taskId) -{ - gPokemonItemUseCallback = DoPPUpItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_RareCandy(u8 taskId) -{ - gPokemonItemUseCallback = DoRareCandyItemEffect; - sub_80C9D98(taskId); -} - -void ItemUseOutOfBattle_TMHM(u8 taskId) -{ - Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - - if (gSpecialVar_ItemId >= ITEM_HM01_CUT) - DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM - else - DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM -} - -void sub_80C9EE4(u8 taskId) -{ - PlaySE(SE_PC_LOGON); - gTasks[taskId].func = sub_80C9F10; -} - -void sub_80C9F10(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - { - StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_ItemId)]); - StringExpandPlaceholders(gStringVar4, gOtherText_ContainsMove); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80C9F80, 1); - } -} - -void sub_80C9F80(u8 var) -{ - DisplayYesNoMenu(7, 7, 1); - sub_80A3FA0(gBGTilemapBuffers[1], 8, 8, 5, 4, 1); - DoYesNoFuncWithChoice(var, &gUnknown_083D61F4); -} - -void sub_80C9FC0(u8 var) -{ - gPokemonItemUseCallback = TeachMonTMMove; - sub_80C9D98(var); -} - -static void PrepareItemUseMessage(void) -{ - RemoveBagItem(gSpecialVar_ItemId, 1); - sub_80A3E0C(); - CopyItemName(gSpecialVar_ItemId, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedItem); -} - -void ItemUseOutOfBattle_Repel(u8 var) -{ - if (VarGet(VAR_REPEL_STEP_COUNT) == 0) - { - VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId)); - PrepareItemUseMessage(); - DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1); - } - else - { - DisplayItemMessageOnField(var, gOtherText_RepelLingers, CleanUpItemMenuMessage, 1); - } -} - -void sub_80CA07C(void) -{ - sub_80A3E0C(); - CopyItemName(gSpecialVar_ItemId, gStringVar2); -} - -void sub_80CA098(u8 taskId) -{ - if(++gTasks[taskId].data[15] > 7) - { - PlaySE(SE_BIDORO); - DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); - } -} - -void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId) -{ - if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE) - { - FlagSet(FLAG_SYS_ENC_UP_ITEM); - FlagClear(FLAG_SYS_ENC_DOWN_ITEM); - sub_80CA07C(); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedFlute); - gTasks[taskId].func = sub_80CA098; - gTasks[taskId].data[15] = 0; - } - else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE) - { - FlagSet(FLAG_SYS_ENC_DOWN_ITEM); - FlagClear(FLAG_SYS_ENC_UP_ITEM); - sub_80CA07C(); - StringExpandPlaceholders(gStringVar4, gOtherText_UsedRepel); - gTasks[taskId].func = sub_80CA098; - gTasks[taskId].data[15] = 0; - } -} - -void task08_080A1C44(u8 taskId) -{ - player_avatar_init_params_reset(); - sub_80878A8(); - DestroyTask(taskId); -} - -void EscapeRopeCallback(u8 taskId) -{ - Overworld_ResetStateAfterDigEscRope(); - PrepareItemUseMessage(); - gTasks[taskId].data[0] = 0; - DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44, 0); -} - -bool8 CanUseEscapeRopeOnCurrMap(void) -{ - if (gMapHeader.mapType == MAP_TYPE_UNDERGROUND) - return TRUE; - else - return FALSE; -} - -void ItemUseOutOfBattle_EscapeRope(u8 taskId) -{ - if (CanUseEscapeRopeOnCurrMap() == TRUE) - { - gFieldItemUseCallback = EscapeRopeCallback; - SetUpItemUseOnFieldCallback(taskId); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOutOfBattle_EvolutionStone(u8 var) -{ - gPokemonItemUseCallback = DoEvolutionStoneItemEffect; - sub_80C9D98(var); -} - -void ItemUseInBattle_PokeBall(u8 var) -{ - if (PlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? - { - RemoveBagItem(gSpecialVar_ItemId, 1); - sub_80A7094(var); - } - else - { - Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1); - } -} - -void sub_80CA294(u8 var) -{ - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - sub_80A7094(var); -} - -void sub_80CA2BC(u8 taskId) -{ - if(++gTasks[taskId].data[15] > 7) - { - PlaySE(SE_KAIFUKU); - RemoveBagItem(gSpecialVar_ItemId, 1); - DisplayItemMessageOnField(taskId, sub_803F378(gSpecialVar_ItemId), sub_80CA294, 1); - } -} - -void ItemUseInBattle_StatIncrease(u8 taskId) -{ - u16 partyId = gBattlePartyID[gBankInMenu]; - - Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - - if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE) - { - DisplayItemMessageOnField(taskId, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); - } - else - { - gTasks[taskId].func = sub_80CA2BC; - gTasks[taskId].data[15] = 0; - } -} - -void sub_80CA394(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_8094E4C(); - gpu_pal_allocator_reset__manage_upper_four(); - DestroyTask(taskId); - } -} - -void sub_80CA3C0(u8 taskId) -{ - gTasks[taskId].func = sub_80CA394; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void ItemUseInBattle_Medicine(u8 var) -{ - gPokemonItemUseCallback = UseMedicine; - sub_80CA3C0(var); -} - -void unref_sub_80CA410(u8 var) -{ - gPokemonItemUseCallback = sub_8070048; - sub_80CA3C0(var); -} - -void ItemUseInBattle_PPRecovery(u8 var) -{ - gPokemonItemUseCallback = DoPPRecoveryItemEffect; - sub_80CA3C0(var); -} - -void unref_sub_80CA448(u8 var) -{ - Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - - if (ExecuteTableBasedItemEffect__(0, gSpecialVar_ItemId, 0) == FALSE) - { - RemoveBagItem(gSpecialVar_ItemId, 1); - GetMonNickname(&gPlayerParty[0], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); - DisplayItemMessageOnField(var, gStringVar4, sub_80A7094, 1); - } - else - { - DisplayItemMessageOnField(var, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); - } -} - -void ItemUseInBattle_Escape(u8 taskId) -{ - Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - - if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) - { - PrepareItemUseMessage(); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1); - } - else - { - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); - } -} - -void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) -{ - switch (GetItemEffectType(gSpecialVar_ItemId) - 1) - { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_Medicine(taskId); - break; - case 9: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_SacredAsh(taskId); - break; - case 0: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_RareCandy(taskId); - break; - case 18: - case 19: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_PPUp(taskId); - break; - case 20: - gTasks[taskId].data[15] = 1; - ItemUseOutOfBattle_PPRecovery(taskId); - break; - default: - gTasks[taskId].data[15] = 4; - ItemUseOutOfBattle_CannotUse(taskId); - } -} - -void ItemUseInBattle_EnigmaBerry(u8 taskId) -{ - switch (GetItemEffectType(gSpecialVar_ItemId)) - { - case 0: - ItemUseInBattle_StatIncrease(taskId); - break; - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 11: - ItemUseInBattle_Medicine(taskId); - break; - case 21: - ItemUseInBattle_PPRecovery(taskId); - break; - default: - ItemUseOutOfBattle_CannotUse(taskId); - } -} - -void ItemUseOutOfBattle_CannotUse(u8 taskId) -{ - DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); -} diff --git a/src/field/landmark.c b/src/field/landmark.c deleted file mode 100644 index 476821ec6..000000000 --- a/src/field/landmark.c +++ /dev/null @@ -1,417 +0,0 @@ -#include "global.h" -#include "landmark.h" -#include "event_data.h" -#include "region_map_sections.h" - -struct Landmark -{ - const u8 *name; - u16 flag; -}; - -struct LandmarkList -{ - u8 mapSection; - u8 id; - const struct Landmark *const *landmarks; -}; - -extern const u8 gLandmarkName_FlowerShop[]; -extern const u8 gLandmarkName_PetalburgWoods[]; -extern const u8 gLandmarkName_MrBrineysCottage[]; -extern const u8 gLandmarkName_AbandonedShip[]; -extern const u8 gLandmarkName_SeashoreHouse[]; -extern const u8 gLandmarkName_SlateportBeach[]; -extern const u8 gLandmarkName_CyclingRoad[]; -extern const u8 gLandmarkName_NewMauville[]; -extern const u8 gLandmarkName_TrickHouse[]; -extern const u8 gLandmarkName_OldLadysRestShop[]; -extern const u8 gLandmarkName_Desert[]; -extern const u8 gLandmarkName_WinstrateFamily[]; -extern const u8 gLandmarkName_CableCar[]; -extern const u8 gLandmarkName_GlassWorkshop[]; -extern const u8 gLandmarkName_WeatherInstitute[]; -extern const u8 gLandmarkName_MeteorFalls[]; -extern const u8 gLandmarkName_TunnelersRestHouse[]; -extern const u8 gLandmarkName_RusturfTunnel[]; -extern const u8 gLandmarkName_PokemonDayCare[]; -extern const u8 gLandmarkName_SafariZoneEntrance[]; -extern const u8 gLandmarkName_MtPyre[]; -extern const u8 gLandmarkName_ShoalCave[]; -extern const u8 gLandmarkName_SeafloorCavern[]; -extern const u8 gLandmarkName_GraniteCave[]; -extern const u8 gLandmarkName_OceanCurrent[]; -extern const u8 gLandmarkName_LanettesHouse[]; -extern const u8 gLandmarkName_FieryPath[]; -extern const u8 gLandmarkName_JaggedPass[]; -extern const u8 gLandmarkName_BerryMastersHouse[]; -extern const u8 gLandmarkName_IslandCave[]; -extern const u8 gLandmarkName_DesertRuins[]; -extern const u8 gLandmarkName_ScorchedSlab[]; -extern const u8 gLandmarkName_AncientTomb[]; -extern const u8 gLandmarkName_SealedChamber[]; -extern const u8 gLandmarkName_FossilManiacsHouse[]; -extern const u8 gLandmarkName_HuntersHouse[]; -extern const u8 gLandmarkName_SkyPillar[]; - -static const struct Landmark Landmark_FlowerShop = {gLandmarkName_FlowerShop, FLAG_LANDMARK_FLOWER_SHOP}; -static const struct Landmark Landmark_PetalburgWoods = {gLandmarkName_PetalburgWoods, -1}; -static const struct Landmark Landmark_MrBrineysCottage = {gLandmarkName_MrBrineysCottage, FLAG_LANDMARK_MR_BRINEY_HOUSE}; -static const struct Landmark Landmark_AbandonedShip = {gLandmarkName_AbandonedShip, FLAG_LANDMARK_ABANDONED_SHIP}; -static const struct Landmark Landmark_SeashoreHouse = {gLandmarkName_SeashoreHouse, FLAG_LANDMARK_SEASHORE_HOUSE}; -static const struct Landmark Landmark_SlateportBeach = {gLandmarkName_SlateportBeach, -1}; -static const struct Landmark Landmark_CyclingRoad = {gLandmarkName_CyclingRoad, -1}; -static const struct Landmark Landmark_NewMauville = {gLandmarkName_NewMauville, FLAG_LANDMARK_NEW_MAUVILLE}; -static const struct Landmark Landmark_TrickHouse = {gLandmarkName_TrickHouse, FLAG_LANDMARK_TRICK_HOUSE}; -static const struct Landmark Landmark_OldLadysRestShop = {gLandmarkName_OldLadysRestShop, FLAG_LANDMARK_OLD_LADY_REST_SHOP}; -static const struct Landmark Landmark_Desert = {gLandmarkName_Desert, -1}; -static const struct Landmark Landmark_WinstrateFamily = {gLandmarkName_WinstrateFamily, FLAG_LANDMARK_WINSTRATE_FAMILY}; -static const struct Landmark Landmark_CableCar = {gLandmarkName_CableCar, -1}; -static const struct Landmark Landmark_GlassWorkshop = {gLandmarkName_GlassWorkshop, FLAG_LANDMARK_GLASS_WORKSHOP}; -static const struct Landmark Landmark_WeatherInstitute = {gLandmarkName_WeatherInstitute, -1}; -static const struct Landmark Landmark_MeteorFalls = {gLandmarkName_MeteorFalls, -1}; -static const struct Landmark Landmark_TunnelersRestHouse = {gLandmarkName_TunnelersRestHouse, FLAG_LANDMARK_TUNNELERS_REST_HOUSE}; -static const struct Landmark Landmark_RusturfTunnel = {gLandmarkName_RusturfTunnel, -1}; -static const struct Landmark Landmark_PokemonDayCare = {gLandmarkName_PokemonDayCare, FLAG_LANDMARK_POKEMON_DAYCARE}; -static const struct Landmark Landmark_SafariZoneEntrance = {gLandmarkName_SafariZoneEntrance, -1}; -static const struct Landmark Landmark_MtPyre = {gLandmarkName_MtPyre, -1}; -static const struct Landmark Landmark_ShoalCave = {gLandmarkName_ShoalCave, -1}; -static const struct Landmark Landmark_SeafloorCavern = {gLandmarkName_SeafloorCavern, FLAG_LANDMARK_SEAFLOOR_CAVERN}; -static const struct Landmark Landmark_GraniteCave = {gLandmarkName_GraniteCave, -1}; -static const struct Landmark Landmark_OceanCurrent = {gLandmarkName_OceanCurrent, -1}; -static const struct Landmark Landmark_LanettesHouse = {gLandmarkName_LanettesHouse, FLAG_LANDMARK_LANETTES_HOUSE}; -static const struct Landmark Landmark_FieryPath = {gLandmarkName_FieryPath, FLAG_LANDMARK_FIERY_PATH}; -static const struct Landmark Landmark_JaggedPass = {gLandmarkName_JaggedPass, -1}; -static const struct Landmark Landmark_BerryMastersHouse = {gLandmarkName_BerryMastersHouse, FLAG_LANDMARK_BERRY_MASTERS_HOUSE}; -static const struct Landmark Landmark_IslandCave = {gLandmarkName_IslandCave, FLAG_LANDMARK_ISLAND_CAVE}; -static const struct Landmark Landmark_DesertRuins = {gLandmarkName_DesertRuins, FLAG_LANDMARK_DESERT_RUINS}; -static const struct Landmark Landmark_ScorchedSlab = {gLandmarkName_ScorchedSlab, FLAG_LANDMARK_SCORCHED_SLAB}; -static const struct Landmark Landmark_AncientTomb = {gLandmarkName_AncientTomb, FLAG_LANDMARK_ANCIENT_TOMB}; -static const struct Landmark Landmark_SealedChamber = {gLandmarkName_SealedChamber, FLAG_LANDMARK_SEALED_CHAMBER}; -static const struct Landmark Landmark_FossilManiacsHouse = {gLandmarkName_FossilManiacsHouse, FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE}; -static const struct Landmark Landmark_HuntersHouse = {gLandmarkName_HuntersHouse, FLAG_LANDMARK_HUNTERS_HOUSE}; -static const struct Landmark Landmark_SkyPillar = {gLandmarkName_SkyPillar, FLAG_LANDMARK_SKY_PILLAR}; - -static const struct Landmark *const Landmarks_Route104_0[] = -{ - &Landmark_FlowerShop, - NULL, -}; - -static const struct Landmark *const Landmarks_Route104_1[] = -{ - &Landmark_PetalburgWoods, - &Landmark_MrBrineysCottage, - NULL, -}; - -static const struct Landmark *const Landmarks_Route105_0[] = -{ - &Landmark_IslandCave, - NULL, -}; - -static const struct Landmark *const Landmarks_Route106_1[] = -{ - &Landmark_GraniteCave, - NULL, -}; - -static const struct Landmark *const Landmarks_Route108_0[] = -{ - &Landmark_AbandonedShip, - NULL, -}; - -static const struct Landmark *const Landmarks_Route109_0[] = -{ - &Landmark_SeashoreHouse, - &Landmark_SlateportBeach, - NULL, -}; - -static const struct Landmark *const Landmarks_Route110_0[] = -{ - &Landmark_CyclingRoad, - &Landmark_NewMauville, - NULL, -}; - -static const struct Landmark *const Landmarks_Route110_1[] = -{ - &Landmark_CyclingRoad, - NULL, -}; - -static const struct Landmark *const Landmarks_Route110_2[] = -{ - &Landmark_CyclingRoad, - &Landmark_TrickHouse, - NULL, -}; - -static const struct Landmark *const Landmarks_Route111_0[] = -{ - &Landmark_OldLadysRestShop, - NULL, -}; - -static const struct Landmark *const Landmarks_Route111_1[] = -{ - &Landmark_Desert, - NULL, -}; - -static const struct Landmark *const Landmarks_Route111_3[] = -{ - &Landmark_DesertRuins, - &Landmark_Desert, - NULL, -}; - -static const struct Landmark *const Landmarks_Route111_4[] = -{ - &Landmark_WinstrateFamily, - &Landmark_Desert, - NULL, -}; - -static const struct Landmark *const Landmarks_Route112_0[] = -{ - &Landmark_FieryPath, - &Landmark_JaggedPass, - NULL, -}; - -static const struct Landmark *const Landmarks_Route112_1[] = -{ - &Landmark_CableCar, - &Landmark_FieryPath, - NULL, -}; - -static const struct Landmark *const Landmarks_Route113_1[] = -{ - &Landmark_GlassWorkshop, - NULL, -}; - -static const struct Landmark *const Landmarks_Route114_1[] = -{ - &Landmark_FossilManiacsHouse, - NULL, -}; - -static const struct Landmark *const Landmarks_Route114_2[] = -{ - &Landmark_LanettesHouse, - NULL, -}; - -static const struct Landmark *const Landmarks_MeteorFalls[] = -{ - &Landmark_MeteorFalls, - NULL, -}; - -static const struct Landmark *const Landmarks_Route116_1[] = -{ - &Landmark_TunnelersRestHouse, - &Landmark_RusturfTunnel, - NULL, -}; - -static const struct Landmark *const Landmarks_Route116_2[] = -{ - &Landmark_RusturfTunnel, - NULL, -}; - -static const struct Landmark *const Landmarks_Route117_2[] = -{ - &Landmark_PokemonDayCare, - NULL, -}; - -static const struct Landmark *const Landmarks_Route119_1[] = -{ - &Landmark_WeatherInstitute, - NULL, -}; - -static const struct Landmark *const Landmarks_Route120_0[] = -{ - &Landmark_ScorchedSlab, - NULL, -}; - -static const struct Landmark *const Landmarks_Route120_2[] = -{ - &Landmark_AncientTomb, - NULL, -}; - -static const struct Landmark *const Landmarks_Route121_2[] = -{ - &Landmark_SafariZoneEntrance, - NULL, -}; - -static const struct Landmark *const Landmarks_Route122_0[] = -{ - &Landmark_MtPyre, - NULL, -}; - -static const struct Landmark *const Landmarks_Route123_0[] = -{ - &Landmark_BerryMastersHouse, - NULL, -}; - -static const struct Landmark *const Landmarks_Route124_7[] = -{ - &Landmark_HuntersHouse, - NULL, -}; - -static const struct Landmark *const Landmarks_Route125_2[] = -{ - &Landmark_ShoalCave, - NULL, -}; - -static const struct Landmark *const Landmarks_Route128_1[] = -{ - &Landmark_SeafloorCavern, - NULL, -}; - -static const struct Landmark *const Landmarks_Route131_1[] = -{ - &Landmark_SkyPillar, - NULL, -}; - -static const struct Landmark *const Landmarks_OceanCurrent[] = -{ - &Landmark_OceanCurrent, - NULL, -}; - -static const struct Landmark *const Landmarks_Route134_2[] = -{ - &Landmark_SealedChamber, - &Landmark_OceanCurrent, - NULL, -}; - -static const struct Landmark *const Landmarks_MtChimney_2[] = -{ - &Landmark_CableCar, - &Landmark_JaggedPass, - NULL, -}; - -static const struct LandmarkList gLandmarkLists[] = -{ - {MAPSEC_Route104, 0, Landmarks_Route104_0}, - {MAPSEC_Route104, 1, Landmarks_Route104_1}, - {MAPSEC_Route105, 0, Landmarks_Route105_0}, - {MAPSEC_Route106, 1, Landmarks_Route106_1}, - {MAPSEC_Route108, 0, Landmarks_Route108_0}, - {MAPSEC_Route109, 0, Landmarks_Route109_0}, - {MAPSEC_Route110, 0, Landmarks_Route110_0}, - {MAPSEC_Route110, 1, Landmarks_Route110_1}, - {MAPSEC_Route110, 2, Landmarks_Route110_2}, - {MAPSEC_Route111, 0, Landmarks_Route111_0}, - {MAPSEC_Route111, 1, Landmarks_Route111_1}, - {MAPSEC_Route111, 2, Landmarks_Route111_1}, - {MAPSEC_Route111, 3, Landmarks_Route111_3}, - {MAPSEC_Route111, 4, Landmarks_Route111_4}, - {MAPSEC_Route112, 0, Landmarks_Route112_0}, - {MAPSEC_Route112, 1, Landmarks_Route112_1}, - {MAPSEC_Route113, 1, Landmarks_Route113_1}, - {MAPSEC_Route114, 1, Landmarks_Route114_1}, - {MAPSEC_Route114, 2, Landmarks_Route114_2}, - {MAPSEC_Route114, 3, Landmarks_MeteorFalls}, - {MAPSEC_Route115, 0, Landmarks_MeteorFalls}, - {MAPSEC_Route115, 1, Landmarks_MeteorFalls}, - {MAPSEC_Route116, 1, Landmarks_Route116_1}, - {MAPSEC_Route116, 2, Landmarks_Route116_2}, - {MAPSEC_Route117, 2, Landmarks_Route117_2}, - {MAPSEC_Route119, 1, Landmarks_Route119_1}, - {MAPSEC_Route120, 0, Landmarks_Route120_0}, - {MAPSEC_Route120, 2, Landmarks_Route120_2}, - {MAPSEC_Route121, 2, Landmarks_Route121_2}, - {MAPSEC_Route122, 0, Landmarks_Route122_0}, - {MAPSEC_Route123, 0, Landmarks_Route123_0}, - {MAPSEC_Route122, 1, Landmarks_Route122_0}, - {MAPSEC_Route124, 7, Landmarks_Route124_7}, - {MAPSEC_Route125, 2, Landmarks_Route125_2}, - {MAPSEC_Route128, 1, Landmarks_Route128_1}, - {MAPSEC_Route131, 1, Landmarks_Route131_1}, - {MAPSEC_Route132, 0, Landmarks_OceanCurrent}, - {MAPSEC_Route132, 1, Landmarks_OceanCurrent}, - {MAPSEC_Route133, 0, Landmarks_OceanCurrent}, - {MAPSEC_Route133, 1, Landmarks_OceanCurrent}, - {MAPSEC_Route133, 2, Landmarks_OceanCurrent}, - {MAPSEC_Route134, 0, Landmarks_OceanCurrent}, - {MAPSEC_Route134, 1, Landmarks_OceanCurrent}, - {MAPSEC_Route134, 2, Landmarks_Route134_2}, - {MAPSEC_MtChimney, 2, Landmarks_MtChimney_2}, - {MAPSEC_Nothing, 0, NULL}, -}; - -static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id); - -const u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count) -{ - const struct Landmark *const *landmarks = GetLandmarks(mapSection, id); - - if (!landmarks) - return NULL; - - while (1) - { - const struct Landmark *landmark = *landmarks; - - if (landmark->flag == 0xFFFF || FlagGet(landmark->flag) == TRUE) - { - if (count == 0) - break; - else - count--; - } - - landmarks++; - if (!*landmarks) - return NULL; - } - - return (*landmarks)->name; -} - -static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id) -{ - u16 i = 0; - - for (; gLandmarkLists[i].mapSection != MAPSEC_Nothing; i++) - { - if (gLandmarkLists[i].mapSection > mapSection) - return NULL; - if (gLandmarkLists[i].mapSection == mapSection) - break; - } - - if (gLandmarkLists[i].mapSection == MAPSEC_Nothing) - return NULL; - - for (; gLandmarkLists[i].mapSection == mapSection; i++) - { - if (gLandmarkLists[i].id == id) - return gLandmarkLists[i].landmarks; - } - - return NULL; -} diff --git a/src/field/lottery_corner.c b/src/field/lottery_corner.c deleted file mode 100644 index 03de26054..000000000 --- a/src/field/lottery_corner.c +++ /dev/null @@ -1,174 +0,0 @@ -#include "global.h" -#include "lottery_corner.h" -#include "event_data.h" -#include "constants/items.h" -#include "random.h" -#include "constants/species.h" -#include "string_util.h" -#include "text.h" - -extern u16 gSpecialVar_Result; -extern u16 gSpecialVar_0x8004; -extern struct PokemonStorage gPokemonStorage; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; -static EWRAM_DATA u16 sWinNumberDigit = 0; -static EWRAM_DATA u16 sOtIdDigit = 0; - -static const u16 sLotteryPrizes[] = -{ - ITEM_PP_UP, - ITEM_EXP_SHARE, - ITEM_MAX_REVIVE, - ITEM_MASTER_BALL, -}; - -static u8 GetMatchingDigits(u16, u16); - -void ResetLotteryCorner(void) -{ - u16 rand = Random(); - - SetLotteryNumber((Random() << 16) | rand); - VarSet(VAR_LOTTERY_PRIZE, 0); -} - -void SetRandomLotteryNumber(u16 i) -{ - u32 var = Random(); - - while (--i != 0xFFFF) - var = var * 1103515245 + 12345; - - SetLotteryNumber(var); -} - -void RetrieveLotteryNumber(void) -{ - u16 lottoNumber = GetLotteryNumber(); - gSpecialVar_Result = lottoNumber; -} - -void PickLotteryCornerTicket(void) -{ - u16 i; - u16 j; - u32 box; - u32 slot; - - gSpecialVar_0x8004 = 0; - slot = 0; - box = 0; - for (i = 0; i < 6; i++) - { - struct Pokemon *pkmn = &gPlayerParty[i]; - - // UB: Too few arguments for function GetMonData - if (GetMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE) - { - // do not calculate ticket values for eggs. - if (!GetMonData(pkmn, MON_DATA_IS_EGG)) - { - u32 otId = GetMonData(pkmn, MON_DATA_OT_ID); - u8 numMatchingDigits = GetMatchingDigits(gSpecialVar_Result, otId); - - if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1) - { - gSpecialVar_0x8004 = numMatchingDigits - 1; - box = 14; - slot = i; - } - } - } - else // pokemon are always arranged from populated spots first to unpopulated, so the moment a NONE species is found, that's the end of the list. - break; - } - - // player has 14 boxes. - for (i = 0; i < 14; i++) - { - // player has 30 slots per box. - for (j = 0; j < 30; j++) - { - struct BoxPokemon *pkmn = &gPokemonStorage.boxes[i][j]; - - // UB: Too few arguments for function GetMonData - if (GetBoxMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE && - !GetBoxMonData(pkmn, MON_DATA_IS_EGG)) - { - u32 otId = GetBoxMonData(pkmn, MON_DATA_OT_ID); - u8 numMatchingDigits = GetMatchingDigits(gSpecialVar_Result, otId); - - if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1) - { - gSpecialVar_0x8004 = numMatchingDigits - 1; - box = i; - slot = j; - } - } - } - } - - if (gSpecialVar_0x8004 != 0) - { - gSpecialVar_0x8005 = sLotteryPrizes[gSpecialVar_0x8004 - 1]; - - if (box == 14) - { - gSpecialVar_0x8006 = 0; - GetMonData(&gPlayerParty[slot], MON_DATA_NICKNAME, gStringVar1); - } - else - { - gSpecialVar_0x8006 = 1; - GetBoxMonData(&gPokemonStorage.boxes[box][slot], MON_DATA_NICKNAME, gStringVar1); - } - StringGetEnd10(gStringVar1); - } -} - -static u8 GetMatchingDigits(u16 winNumber, u16 otId) -{ - u8 i; - u8 matchingDigits = 0; - - for (i = 0; i < 5; i++) - { - sWinNumberDigit = winNumber % 10; - sOtIdDigit = otId % 10; - - if (sWinNumberDigit == sOtIdDigit) - { - winNumber = winNumber / 10; - otId = otId / 10; - matchingDigits++; - } - else - break; - } - return matchingDigits; -} - -// lottery numbers go from 0 to 99999, not 65535 (0xFFFF). interestingly enough, the function that calls GetLotteryNumber shifts to u16, so it cant be anything above 65535 anyway. -void SetLotteryNumber(u32 lotteryNum) -{ - u16 high = lotteryNum >> 16; - u16 low = lotteryNum; - - VarSet(VAR_LOTTERY_RND_L, low); - VarSet(VAR_LOTTERY_RND_H, high); -} - -u32 GetLotteryNumber(void) -{ - u16 low = VarGet(VAR_LOTTERY_RND_L); - u16 high = VarGet(VAR_LOTTERY_RND_H); - - return (high << 16) | low; -} - -// interestingly, this may have been the original lottery number set function, but GF tried to change it to 32-bit later but didnt finish changing all calls as one GetLotteryNumber still shifts to u16. -void SetLotteryNumber16_Unused(u16 lotteryNum) -{ - SetLotteryNumber(lotteryNum); -} diff --git a/src/field/map_name_popup.c b/src/field/map_name_popup.c deleted file mode 100644 index 49a470cc1..000000000 --- a/src/field/map_name_popup.c +++ /dev/null @@ -1,107 +0,0 @@ -#include "global.h" -#include "map_name_popup.h" -#include "event_data.h" -#include "menu.h" -#include "region_map.h" -#include "task.h" - -EWRAM_DATA static u8 sTaskId = 0; - -static void Task_MapNamePopup(u8); -static void DrawMapNamePopup(void); - -bool8 unref_sub_80A2F44(void) -{ - CloseMenu(); - ShowMapNamePopup(); - return 1; -} - -void ShowMapNamePopup(void) -{ - if (FlagGet(FLAG_SPECIAL_FLAG_0) != TRUE) - { - if (!FuncIsActiveTask(Task_MapNamePopup)) - { - sTaskId = CreateTask(Task_MapNamePopup, 90); - REG_BG0VOFS = 32; - DrawMapNamePopup(); - gTasks[sTaskId].data[0] = 0; - gTasks[sTaskId].data[2] = 32; - } - else - { - if (gTasks[sTaskId].data[0] != 2) - gTasks[sTaskId].data[0] = 2; - gTasks[sTaskId].data[3] = 1; - } - } -} - -void Task_MapNamePopup(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - task->data[2] -= 2; - if (task->data[2] <= 0 ) - { - task->data[0] = 1; - gTasks[sTaskId].data[1] = 0; - } - break; - case 1: - task->data[1]++; - if (task->data[1] > 120 ) - { - task->data[1] = 0; - task->data[0] = 2; - } - break; - case 2: - task->data[2] += 2; - if (task->data[2] > 31) - { - if (task->data[3]) - { - DrawMapNamePopup(); - task->data[0] = 0; - task->data[3] = 0; - } - else - { - task->data[0] = 4; - return; - } - } - break; - case 4: - HideMapNamePopup(); - return; - } - - REG_BG0VOFS = task->data[2]; -} - -void HideMapNamePopup(void) -{ - if (FuncIsActiveTask(Task_MapNamePopup)) - { - Menu_LoadStdFrameGraphics(); - Menu_EraseWindowRect(0, 0, 13, 3); - REG_BG0VOFS = 0; - DestroyTask(sTaskId); - } -} - -void DrawMapNamePopup(void) -{ - u8 name[20]; - - Menu_LoadStdFrameGraphicsOverrideStyle(0); - GetMapSectionName(name, gMapHeader.regionMapSectionId, 0); - Menu_DrawStdWindowFrame(0, 0, 13, 3); - sub_8072BD8(name, 1, 1, 0x60); -} diff --git a/src/field/map_obj_lock.c b/src/field/map_obj_lock.c deleted file mode 100644 index 3bd25dbdf..000000000 --- a/src/field/map_obj_lock.c +++ /dev/null @@ -1,117 +0,0 @@ -#include "global.h" -#include "map_obj_lock.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "script_movement.h" -#include "task.h" - -extern u16 gSpecialVar_Facing; - -bool8 walkrun_is_standing_still(void) -{ - if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) - return FALSE; - else - return TRUE; -} - -void sub_8064CDC(u8 taskId) -{ - if (walkrun_is_standing_still()) - { - sub_80594C0(); - DestroyTask(taskId); - } -} - -bool8 sub_8064CFC(void) -{ - if (FuncIsActiveTask(sub_8064CDC)) - { - return FALSE; - } - else - { - sub_80597F4(); - return TRUE; - } -} - -void ScriptFreezeMapObjects(void) -{ - FreezeMapObjects(); - CreateTask(sub_8064CDC, 80); -} - -void sub_8064D38(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - if (!task->data[0] && walkrun_is_standing_still() == TRUE) - { - sub_80594C0(); - task->data[0] = 1; - } - if (!task->data[1] && !gMapObjects[gSelectedMapObject].mapobj_bit_1) - { - FreezeMapObject(&gMapObjects[gSelectedMapObject]); - task->data[1] = 1; - } - if (task->data[0] && task->data[1]) - DestroyTask(taskId); -} - -bool8 sub_8064DB4(void) -{ - if (FuncIsActiveTask(sub_8064D38)) - { - return FALSE; - } - else - { - sub_80597F4(); - return TRUE; - } -} - -void LockSelectedMapObject(void) -{ - u8 taskId; - FreezeMapObjectsExceptOne(gSelectedMapObject); - taskId = CreateTask(sub_8064D38, 80); - if (!gMapObjects[gSelectedMapObject].mapobj_bit_1) - { - FreezeMapObject(&gMapObjects[gSelectedMapObject]); - gTasks[taskId].data[1] = 1; - } -} - -void sub_8064E2C(void) -{ - u8 objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); - sub_80A2178(); - UnfreezeMapObjects(); -} - -void unref_sub_8064E5C(void) -{ - u8 objectId; - - if (gMapObjects[gSelectedMapObject].active) - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); - objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); - sub_80A2178(); - UnfreezeMapObjects(); -} - -void sub_8064EAC(void) -{ - FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], gSpecialVar_Facing); -} - -void sub_8064ED4(void) -{ - FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[gSelectedMapObject]); -} diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c deleted file mode 100644 index a68d5071d..000000000 --- a/src/field/mauville_man.c +++ /dev/null @@ -1,1345 +0,0 @@ -#include "global.h" -#include "bard_music.h" -#include "mauville_man.h" -#include "easy_chat.h" -#include "constants/easy_chat.h" -#include "event_data.h" -#include "field_message_box.h" -#include "m4a.h" -#include "menu.h" -#include "overworld.h" -#include "random.h" -#include "script.h" -#include "constants/map_objects.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "trader.h" - -#define MACRO1(a) (((a) % 4) + (((a) / 8) & 1)) - -extern struct MusicPlayerInfo gMPlay_SE2; - -extern u16 gSpecialVar_Result; -extern u16 gSpecialVar_0x8004; - -extern const u8 gTextStoryteller_Story1Title[]; -extern const u8 gTextStoryteller_Story1Action[]; -extern const u8 gTextStoryteller_Story1Text[]; -extern const u8 gTextStoryteller_Story2Title[]; -extern const u8 gTextStoryteller_Story2Action[]; -extern const u8 gTextStoryteller_Story2Text[]; -extern const u8 gTextStoryteller_Story3Title[]; -extern const u8 gTextStoryteller_Story3Action[]; -extern const u8 gTextStoryteller_Story3Text[]; -extern const u8 gTextStoryteller_Story4Title[]; -extern const u8 gTextStoryteller_Story4Action[]; -extern const u8 gTextStoryteller_Story4Text[]; -extern const u8 gTextStoryteller_Story5Title[]; -extern const u8 gTextStoryteller_Story5Action[]; -extern const u8 gTextStoryteller_Story5Text[]; -extern const u8 gTextStoryteller_Story6Title[]; -extern const u8 gTextStoryteller_Story6Action[]; -extern const u8 gTextStoryteller_Story6Text[]; -extern const u8 gTextStoryteller_Story7Title[]; -extern const u8 gTextStoryteller_Story7Action[]; -extern const u8 gTextStoryteller_Story7Text[]; -extern const u8 gTextStoryteller_Story8Title[]; -extern const u8 gTextStoryteller_Story8Action[]; -extern const u8 gTextStoryteller_Story8Text[]; -extern const u8 gTextStoryteller_Story9Title[]; -extern const u8 gTextStoryteller_Story9Action[]; -extern const u8 gTextStoryteller_Story9Text[]; -extern const u8 gTextStoryteller_Story10Title[]; -extern const u8 gTextStoryteller_Story10Action[]; -extern const u8 gTextStoryteller_Story10Text[]; -extern const u8 gTextStoryteller_Story11Title[]; -extern const u8 gTextStoryteller_Story11Action[]; -extern const u8 gTextStoryteller_Story11Text[]; -extern const u8 gTextStoryteller_Story12Title[]; -extern const u8 gTextStoryteller_Story12Action[]; -extern const u8 gTextStoryteller_Story12Text[]; -extern const u8 gTextStoryteller_Story13Title[]; -extern const u8 gTextStoryteller_Story13Action[]; -extern const u8 gTextStoryteller_Story13Text[]; -extern const u8 gTextStoryteller_Story14Title[]; -extern const u8 gTextStoryteller_Story14Action[]; -extern const u8 gTextStoryteller_Story14Text[]; -extern const u8 gTextStoryteller_Story15Title[]; -extern const u8 gTextStoryteller_Story15Action[]; -extern const u8 gTextStoryteller_Story15Text[]; -extern const u8 gTextStoryteller_Story16Title[]; -extern const u8 gTextStoryteller_Story16Action[]; -extern const u8 gTextStoryteller_Story16Text[]; -extern const u8 gTextStoryteller_Story17Title[]; -extern const u8 gTextStoryteller_Story17Action[]; -extern const u8 gTextStoryteller_Story17Text[]; -extern const u8 gTextStoryteller_Story18Title[]; -extern const u8 gTextStoryteller_Story18Action[]; -extern const u8 gTextStoryteller_Story18Text[]; -extern const u8 gTextStoryteller_Story19Title[]; -extern const u8 gTextStoryteller_Story19Action[]; -extern const u8 gTextStoryteller_Story19Text[]; -extern const u8 gTextStoryteller_Story20Title[]; -extern const u8 gTextStoryteller_Story20Action[]; -extern const u8 gTextStoryteller_Story20Text[]; -extern const u8 gTextStoryteller_Story21Title[]; -extern const u8 gTextStoryteller_Story21Action[]; -extern const u8 gTextStoryteller_Story21Text[]; -extern const u8 gTextStoryteller_Story22Title[]; -extern const u8 gTextStoryteller_Story22Action[]; -extern const u8 gTextStoryteller_Story22Text[]; -extern const u8 gTextStoryteller_Story23Title[]; -extern const u8 gTextStoryteller_Story23Action[]; -extern const u8 gTextStoryteller_Story23Text[]; -extern const u8 gTextStoryteller_Story24Title[]; -extern const u8 gTextStoryteller_Story24Action[]; -extern const u8 gTextStoryteller_Story24Text[]; -extern const u8 gTextStoryteller_Story25Title[]; -extern const u8 gTextStoryteller_Story25Action[]; -extern const u8 gTextStoryteller_Story25Text[]; -extern const u8 gTextStoryteller_Story26Title[]; -extern const u8 gTextStoryteller_Story26Action[]; -extern const u8 gTextStoryteller_Story26Text[]; -extern const u8 gTextStoryteller_Story27Title[]; -extern const u8 gTextStoryteller_Story27Action[]; -extern const u8 gTextStoryteller_Story27Text[]; -extern const u8 gTextStoryteller_Story28Title[]; -extern const u8 gTextStoryteller_Story28Action[]; -extern const u8 gTextStoryteller_Story28Text[]; -extern const u8 gTextStoryteller_Story29Title[]; -extern const u8 gTextStoryteller_Story29Action[]; -extern const u8 gTextStoryteller_Story29Text[]; -extern const u8 gTextStoryteller_Story30Title[]; -extern const u8 gTextStoryteller_Story30Action[]; -extern const u8 gTextStoryteller_Story30Text[]; -extern const u8 gTextStoryteller_Story31Title[]; -extern const u8 gTextStoryteller_Story31Action[]; -extern const u8 gTextStoryteller_Story31Text[]; -extern const u8 gTextStoryteller_Story32Title[]; -extern const u8 gTextStoryteller_Story32Action[]; -extern const u8 gTextStoryteller_Story32Text[]; -extern const u8 gTextStoryteller_Story33Title[]; -extern const u8 gTextStoryteller_Story33Action[]; -extern const u8 gTextStoryteller_Story33Text[]; -extern const u8 gTextStoryteller_Story34Title[]; -extern const u8 gTextStoryteller_Story34Action[]; -extern const u8 gTextStoryteller_Story34Text[]; -extern const u8 gTextStoryteller_Story35Title[]; -extern const u8 gTextStoryteller_Story35Action[]; -extern const u8 gTextStoryteller_Story35Text[]; -extern const u8 gTextStoryteller_Story36Title[]; -extern const u8 gTextStoryteller_Story36Action[]; -extern const u8 gTextStoryteller_Story36Text[]; - -extern struct BardSong gUnknown_03005DA0; - -EWRAM_DATA static u16 gUnknown_020388BC = 0; // set but not used? - -static const u16 sDefaultBardSongLyrics[] = -{ -#ifdef ENGLISH - EC_WORD_SISTER, - EC_WORD_EATS, - EC_WORD_SWEETS, - EC_WORD_VORACIOUS, - EC_WORD_AND, - EC_WORD_DROOLING, -#else - EC_WORD_SISTER, - EC_WORD_MUST_BE, - EC_WORD_SWEETS, - EC_WORD_VORACIOUS, - EC_WORD_DROOLING, - EC_WORD_THICK, -#endif -}; - -static const u8 *const sGiddyAdjectives[] = -{ - OtherText_SoPretty, - OtherText_SoDarling, - OtherText_SoRelaxed, - OtherText_SoSunny, - OtherText_SoDesirable, - OtherText_SoExciting, - OtherText_SoAmusing, - OtherText_SoMagical, -}; - -static const u8 *const sGiddyQuestions[] = -{ - OtherText_WantVacationNicePlace, - OtherText_BoughtCrayonsIsNice, - OtherText_IfWeCouldFloat, - OtherText_SandWashesAwayMakeSad, - OtherText_WhatsBottomSeaLike, - OtherText_SeeSettingSun, - OtherText_LyingInGreenGrass, - OtherText_SecretBasesWonderful, -}; - -static void sub_80F7DC0(void); -static void Task_BardSong(u8); -static void StartBardSong(u8); -static void StorytellerSetup(void); -static void sub_80F8428(void); - -static void SetupBard(void) -{ - u16 i; - struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; - - bard->id = MAUVILLE_MAN_BARD; - bard->hasChangedSong = FALSE; - for (i = 0; i < 6; i++) - bard->songLyrics[i] = sDefaultBardSongLyrics[i]; -} - -static void SetupHipster(void) -{ - struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster; - - hipster->id = MAUVILLE_MAN_HIPSTER; - hipster->alreadySpoken = FALSE; -} - -static void SetupStoryteller(void) -{ - StorytellerSetup(); -} - -static void SetupGiddy(void) -{ - struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; - - giddy->id = MAUVILLE_MAN_GIDDY; - giddy->taleCounter = 0; -} - -static void SetupTrader(void) -{ - TraderSetup(); -} - -void SetupMauvilleOldMan(void) -{ - u16 trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; - - // Determine man based on the last digit of the player's trainer ID. - switch ((trainerId % 10) / 2) - { - case MAUVILLE_MAN_BARD: - SetupBard(); - break; - case MAUVILLE_MAN_HIPSTER: - SetupHipster(); - break; - case MAUVILLE_MAN_TRADER: - SetupTrader(); - break; - case MAUVILLE_MAN_STORYTELLER: - SetupStoryteller(); - break; - case MAUVILLE_MAN_GIDDY: - SetupGiddy(); - break; - } - sub_80F83D0(); -} - -#if DEBUG -void debug_sub_810B32C(u8 a) -{ - u8 i; - u8 savedArr[8]; - - switch (a) - { - case 0: - SetupBard(); - break; - case 1: - for (i = 0; i < 8; i++) - savedArr[i] = gSaveBlock1.unk2D8C[i]; - SetupHipster(); - for (i = 0; i < 8; i++) - gSaveBlock1.unk2D8C[i] = savedArr[i]; - break; - case 2: - SetupTrader(); - break; - case 3: - SetupStoryteller(); - break; - case 4: - SetupGiddy(); - break; - } - sub_80F83D0(); -} -#endif - -u8 GetCurrentMauvilleOldMan(void) -{ - struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common; - - return common->id; -} - -void ScrSpecial_GetCurrentMauvilleMan(void) -{ - gSpecialVar_Result = GetCurrentMauvilleOldMan(); -} - -void ScrSpecial_HasBardSongBeenChanged(void) -{ - u16 *scriptResult = &gSpecialVar_Result; // why?? - struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; - - *scriptResult = bard->hasChangedSong; -} - -void ScrSpecial_SaveBardSongLyrics(void) -{ - u16 i; - struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; - - StringCopy(bard->playerName, gSaveBlock2.playerName); - - for (i = 0; i < 4; i++) - bard->playerTrainerId[i] = gSaveBlock2.playerTrainerId[i]; - - for (i = 0; i < 6; i++) - bard->songLyrics[i] = bard->temporaryLyrics[i]; - - bard->hasChangedSong = TRUE; -} - -// Copies lyrics into gStringVar4 -void PrepareSongText(void) -{ - struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; - u16 specialVar = gSpecialVar_0x8004; // It's a bit odd to use this temp variable, but it seems needed to match. - u16 *lyrics; - u16 lineNum; - u8 *wordEnd; - u8 *str; - - lyrics = bard->temporaryLyrics; - if (specialVar == 0) - lyrics = bard->songLyrics; - wordEnd = gStringVar4; - str = wordEnd; - // Put three words on each line - for (lineNum = 0; lineNum < 2; lineNum++) - { - wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++)); - while (wordEnd != str) - { - if (*str == CHAR_SPACE) - *str = CHAR_SONG_WORD_SEPARATOR; - str++; - } - - str++; - *(wordEnd++) = CHAR_SPACE; - - wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++)); - while (wordEnd != str) - { - if (*str == CHAR_SPACE) - *str = CHAR_SONG_WORD_SEPARATOR; - str++; - } - - str++; - *(wordEnd++) = CHAR_NEWLINE; - - wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++)); - while (wordEnd != str) - { - if (*str == CHAR_SPACE) - *str = CHAR_SONG_WORD_SEPARATOR; - str++; - } - - if (lineNum == 0) - { - *(wordEnd++) = EXT_CTRL_CODE_BEGIN; - *(wordEnd++) = 15; - } - } -} - -void ScrSpecial_PlayBardSong(void) -{ - StartBardSong(gSpecialVar_0x8004); - Menu_DisplayDialogueFrame(); - ScriptContext1_Stop(); -} - -void ScrSpecial_GetHipsterSpokenFlag(void) -{ - u16 *scriptResult = &gSpecialVar_Result; // again?? - struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster; - - *scriptResult = hipster->alreadySpoken; -} - -void ScrSpecial_SetHipsterSpokenFlag(void) -{ - struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster; - - hipster->alreadySpoken = TRUE; -} - -void ScrSpecial_HipsterTeachWord(void) -{ - u16 var = sub_80EB8EC(); - - if (var == 0xFFFF) - { - gSpecialVar_Result = FALSE; - } - else - { - EasyChat_GetWordText(gStringVar1, var); - gSpecialVar_Result = TRUE; - } -} - -void ScrSpecial_GiddyShouldTellAnotherTale(void) -{ - struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; - - if (giddy->taleCounter == 10) - { - gSpecialVar_Result = FALSE; - giddy->taleCounter = 0; - } - else - { - gSpecialVar_Result = TRUE; - } -} - -void ScrSpecial_GenerateGiddyLine(void) -{ - struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; - - if (giddy->taleCounter == 0) - sub_80F7DC0(); - - if (giddy->randomWords[giddy->taleCounter] != 0xFFFF) // is not the last element of the array? - { - u8 *stringPtr; - u32 adjective = Random(); - - adjective %= 8; - stringPtr = EasyChat_GetWordText(gStringVar4, giddy->randomWords[giddy->taleCounter]); - stringPtr = StringCopy(stringPtr, gOtherText_Is); - stringPtr = StringCopy(stringPtr, sGiddyAdjectives[adjective]); - StringCopy(stringPtr, gOtherText_DontYouAgree); - } - else - { - StringCopy(gStringVar4, sGiddyQuestions[giddy->questionList[giddy->questionNum++]]); - } - - if (!(Random() % 10)) - giddy->taleCounter = 10; - else - giddy->taleCounter++; - - gSpecialVar_Result = TRUE; -} - -#ifdef NONMATCHING -static void sub_80F7DC0(void) -{ - u16 arr[][2] = - { - { 0x0, 0}, - { 0xC, 0}, - { 0xD, 0}, - {0x12, 0}, - {0x13, 0}, - {0x15, 0}, - }; - u16 i; - u16 r10; - u16 r7; - - for (i = 0; i < 8; i++) - { - struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; - - //gSaveBlock1.mauvilleMan.giddy.questionList[i] = i; - giddy->questionList[i] = i; - } - - // Scramble questions - for (i = 0; i < 8; i++) - { - struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; - - /* - u16 r1 = Random() % (i + 1); - u8 r7 = gSaveBlock1.mauvilleMan.giddy.questionList[i]; - gSaveBlock1.mauvilleMan.giddy.questionList[i] = gSaveBlock1.mauvilleMan.giddy.questionList[r1]; - gSaveBlock1.mauvilleMan.giddy.questionList[r1] = r7; - */ - u16 r1 = Random() % (i + 1); - u8 r7 = giddy->questionList[i]; - giddy->questionList[i] = giddy->questionList[r1]; - giddy->questionList[r1] = r7; - } - - r10 = 0; - for (i = 0; i < 6; i++) - { - arr[i][1] = sub_80EAE88(arr[i][0]); - r10 += arr[i][1]; - } - - { - struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; - giddy->questionNum = 0; - } - //gSaveBlock1.mauvilleMan.giddy.questionNum = 0; - - r7 = 0; - for (i = 0; i < 10; i++) - { - struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; - - u16 var = Random() % 10; - if (var < 3 && r7 < 8) - { - //gSaveBlock1.mauvilleMan.giddy.randomWords[i] = 0xFFFF; - giddy->randomWords[i] = 0xFFFF; - r7++; - } - //_080F7E90 - else - { - s16 r2 = Random() % r10; - - u16 r1 = 0; - - while (i < 6) // comparing the wrong variable - { - r2 = arr[r1][1] - r2; - if (r2 <= 0) - break; - r1++; - } - - if (r1 == 6) - r1 = 0; - //gSaveBlock1.mauvilleMan.giddy.randomWords[i] = sub_80EB784(arr[r1][0]); - giddy->randomWords[i] = sub_80EB784(arr[r1][0]); - } - } -} -#else - -static const u16 gUnknown_083E53C8[][2] = -{ - { 0x0, 0}, - { 0xC, 0}, - { 0xD, 0}, - {0x12, 0}, - {0x13, 0}, - {0x15, 0}, -}; - -__attribute__((naked)) -static void sub_80F7DC0(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x18\n\ - ldr r1, _080F7E84 @ =gUnknown_083E53C8\n\ - mov r0, sp\n\ - movs r2, 0x18\n\ - bl memcpy\n\ - movs r5, 0\n\ - movs r0, 0x2\n\ - add r0, sp\n\ - mov r8, r0\n\ - ldr r1, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\ - adds r1, 0x18\n\ - adds r3, r1, 0\n\ -_080F7DE4:\n\ - adds r0, r3, r5\n\ - strb r5, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - cmp r5, 0x7\n\ - bls _080F7DE4\n\ - movs r5, 0\n\ - ldr r2, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\ - adds r2, 0x4\n\ - mov r9, r2\n\ - adds r6, r1, 0\n\ -_080F7DFC:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - adds r4, r5, 0x1\n\ - adds r1, r4, 0\n\ - bl __modsi3\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - adds r2, r6, r5\n\ - ldrb r7, [r2]\n\ - adds r1, r6, r1\n\ - ldrb r0, [r1]\n\ - strb r0, [r2]\n\ - strb r7, [r1]\n\ - lsls r4, 16\n\ - lsrs r5, r4, 16\n\ - cmp r5, 0x7\n\ - bls _080F7DFC\n\ - movs r3, 0\n\ - mov r10, r3\n\ - movs r5, 0\n\ -_080F7E2A:\n\ - lsls r4, r5, 2\n\ - mov r1, sp\n\ - adds r0, r1, r4\n\ - ldrb r0, [r0]\n\ - bl sub_80EAE88\n\ - add r4, r8\n\ - strh r0, [r4]\n\ - add r0, r10\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ - adds r0, r5, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - cmp r5, 0x5\n\ - bls _080F7E2A\n\ - movs r0, 0\n\ - ldr r2, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\ - strb r0, [r2, 0x2]\n\ - movs r7, 0\n\ - movs r5, 0\n\ -_080F7E56:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, 0x2\n\ - bhi _080F7E90\n\ - cmp r7, 0x7\n\ - bhi _080F7E90\n\ - lsls r0, r5, 1\n\ - add r0, r9\n\ - ldr r1, _080F7E8C @ =0x0000ffff\n\ - strh r1, [r0]\n\ - adds r0, r7, 0x1\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ - adds r4, r5, 0x1\n\ - b _080F7EE2\n\ - .align 2, 0\n\ -_080F7E84: .4byte gUnknown_083E53C8\n\ -_080F7E88: .4byte gSaveBlock1 + 0x2D94\n\ -_080F7E8C: .4byte 0x0000ffff\n\ -_080F7E90:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r1, r10\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - movs r1, 0\n\ - adds r4, r5, 0x1\n\ - lsls r6, r5, 1\n\ - cmp r5, 0x5\n\ - bhi _080F7ECC\n\ - mov r3, r8\n\ - ldrh r0, [r3]\n\ - b _080F7EC2\n\ -_080F7EB2:\n\ - adds r0, r1, 0x1\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r5, 0x5\n\ - bhi _080F7ECC\n\ - lsls r0, r1, 2\n\ - adds r0, r3, r0\n\ - ldrh r0, [r0]\n\ -_080F7EC2:\n\ - subs r0, r2, r0\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - cmp r0, 0\n\ - bgt _080F7EB2\n\ -_080F7ECC:\n\ - cmp r1, 0x6\n\ - bne _080F7ED2\n\ - movs r1, 0\n\ -_080F7ED2:\n\ - lsls r0, r1, 2\n\ - add r0, sp\n\ - ldrh r0, [r0]\n\ - bl sub_80EB784\n\ - mov r2, r9\n\ - adds r1, r2, r6\n\ - strh r0, [r1]\n\ -_080F7EE2:\n\ - lsls r0, r4, 16\n\ - lsrs r5, r0, 16\n\ - cmp r5, 0x9\n\ - bls _080F7E56\n\ - add sp, 0x18\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -static void sub_80F7EFC(void) -{ - struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; - - bard->hasChangedSong = FALSE; -} - -static void sub_80F7F0C(void) -{ - struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster; - - hipster->alreadySpoken = FALSE; -} - -static void sub_80F7F18(void) -{ - sub_8109A20(); -} - -static void sub_80F7F24(void) -{ - sub_80F8428(); -} - -void sub_80F7F30(void) -{ - switch (GetCurrentMauvilleOldMan()) - { - case MAUVILLE_MAN_BARD: - sub_80F7EFC(); - break; - case MAUVILLE_MAN_HIPSTER: - sub_80F7F0C(); - break; - case MAUVILLE_MAN_STORYTELLER: - sub_80F7F24(); - break; - case MAUVILLE_MAN_TRADER: - sub_80F7F18(); - break; - case MAUVILLE_MAN_GIDDY: - break; - } - sub_80F83D0(); -} - -#define tState data[0] -#define tCharIndex data[3] -#define tCurrWord data[4] -#define tUseTemporaryLyrics data[5] - -static void StartBardSong(bool8 useTemporaryLyrics) -{ - u8 taskId = CreateTask(Task_BardSong, 0x50); - - gTasks[taskId].tUseTemporaryLyrics = useTemporaryLyrics; -} - -static void BardSing(struct Task *task, struct BardSong *song) -{ - switch (task->tState) - { - case 0: // Initialize song - { - struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; - u16 *lyrics; - s32 i; - - // Copy lyrics - if (gSpecialVar_0x8004 == 0) - lyrics = bard->songLyrics; - else - lyrics = bard->temporaryLyrics; - for (i = 0; i < 6; i++) - song->lyrics[i] = lyrics[i]; - - // Clear phonemes - for (i = 0; i < 6; i++) - { - song->phonemes[i].sound = 0xFFFF; - song->phonemes[i].length = 0; - song->phonemes[i].pitch = 0; - song->phonemes[i].volume = 0; - } - song->currWord = 0; - song->currPhoneme = 0; - song->var04 = 0; - } - break; - case 1: // Wait for BGM to end - break; - case 2: // Initialize word - { - u16 word = song->lyrics[song->currWord]; - const struct BardSound *sounds = GetWordSounds(EC_GROUP(word), EC_INDEX(word)); - - song->var04 = 0; - GetWordPhonemes(song, sounds, MACRO1(word)); - } - break; - case 3: - case 4: - { - struct BardPhoneme *phoneme = &song->phonemes[song->currPhoneme]; - - switch (song->state) - { - case 0: - if (song->phonemeTimer == 0) // Timer has expired. Move to next phoneme - { - if (song->currPhoneme == 6 || phoneme->sound == 0xFF) - { - song->state = 0xFE; - break; - } - song->phonemeTimer = phoneme->length; - if (phoneme->sound <= 50) - { - u16 num = phoneme->sound / 3; - - m4aSongNumStart(249 + num * 3); - } - song->state = 1; - } - else - { - if (song->voiceInflection > 10) - song->volume -= 2; - if (song->voiceInflection & 1) - song->pitch += 64; - else - song->pitch -= 64; - m4aMPlayVolumeControl(&gMPlay_SE2, 0xFFFF, song->volume); - m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, song->pitch); - song->voiceInflection++; - } - song->phonemeTimer--; - break; - case 1: - song->currPhoneme++; - song->state = 0; - if (phoneme->sound <= 50) - { - song->volume = 0x100 + phoneme->volume * 16; - m4aMPlayVolumeControl(&gMPlay_SE2, 0xFFFF, song->volume); - song->pitch = 0x200 + phoneme->pitch; - m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, song->pitch); - } - break; - case 0xFE: - m4aMPlayStop(&gMPlay_SE2); - song->state = 0xFF; - break; - } - } - break; - case 5: - break; - } -} - -static void Task_BardSong(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; // r5 - - BardSing(task, &gUnknown_03005DA0); - switch (task->tState) - { - case 0: // Initialize song - PrepareSongText(); - Text_InitWindowWithTemplate(gMenuWindowPtr, &gWindowTemplate_81E6CE4); - Text_InitWindow8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15); - task->data[1] = 0; - task->data[2] = 0; - task->tCharIndex = 0; - task->tCurrWord = 0; - FadeOutBGMTemporarily(4); - task->tState = 1; - break; - case 1: // Wait for BGM to end - if (IsBGMPausedOrStopped()) - task->tState = 2; - break; - case 2: // Initialize word - { - struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; - u8 *str = gStringVar4 + task->tCharIndex; - u16 wordLen = 0; - // Can't get it to match without hacking - u32 temp; - register s16 zero asm("r1"); - - while (*str != CHAR_SPACE - && *str != CHAR_NEWLINE - && *str != EXT_CTRL_CODE_BEGIN - && *str != EOS) - { - str++; - wordLen++; - } - if (!task->tUseTemporaryLyrics) - gUnknown_020388BC = MACRO1(bard->songLyrics[task->tCurrWord]); - else - gUnknown_020388BC = MACRO1(bard->temporaryLyrics[task->tCurrWord]); - temp = gUnknown_03005DA0.var04 / wordLen; - zero = 0; - gUnknown_03005DA0.var04 = temp; - if (gUnknown_03005DA0.var04 <= 0) - gUnknown_03005DA0.var04 = 1; - task->tCurrWord++; - if (task->data[2] == 0) - task->tState = 3; - else - task->tState = 5; - task->data[1] = zero; - } - break; - case 5: - if (task->data[2] == 0) - task->tState = 3; - else - task->data[2]--; - break; - case 3: - if (gStringVar4[task->tCharIndex] == EOS) - { - FadeInNewBGM(BGM_POKECEN, 6); - m4aMPlayFadeOutTemporarily(&gMPlay_SE2, 2); - EnableBothScriptContexts(); - DestroyTask(taskId); - } - else if (gStringVar4[task->tCharIndex] == CHAR_SPACE) - { - Text_PrintWindowSimple(gMenuWindowPtr); - task->tCharIndex++; - task->tState = 2; - task->data[2] = 0; - } - else if (gStringVar4[task->tCharIndex] == CHAR_NEWLINE) - { - task->tCharIndex++; - task->tState = 2; - task->data[2] = 0; - } - else if (gStringVar4[task->tCharIndex] == EXT_CTRL_CODE_BEGIN) - { - task->tCharIndex += 2; // skip over control codes - task->tState = 2; - task->data[2] = 8; - } - else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR) - { - gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space - Text_PrintWindowSimple(gMenuWindowPtr); - task->tCharIndex++; - task->data[2] = 0; - } - else - { - switch (task->data[1]) - { - case 0: - Text_PrintWindowSimple(gMenuWindowPtr); - task->data[1]++; - break; - case 1: - task->data[1]++; - break; - case 2: - task->tCharIndex++; - task->data[1] = 0; - task->data[2] = gUnknown_03005DA0.var04; - task->tState = 4; - break; - } - } - break; - case 4: - task->data[2]--; - if (task->data[2] == 0) - task->tState = 3; - break; - } -} - -void sub_80F83D0(void) -{ - VarSet(VAR_OBJ_GFX_ID_0, MAP_OBJ_GFX_BARD + GetCurrentMauvilleOldMan()); -} - -struct Story -{ - u8 stat; - u8 minVal; - const u8 *title; - const u8 *action; - const u8 *fullText; -}; - -static const struct Story sStorytellerStories[] = -{ - {0x32, 1, gTextStoryteller_Story1Title, gTextStoryteller_Story1Action, gTextStoryteller_Story1Text}, - {0x02, 1, gTextStoryteller_Story2Title, gTextStoryteller_Story2Action, gTextStoryteller_Story2Text}, - {0x03, 1, gTextStoryteller_Story3Title, gTextStoryteller_Story3Action, gTextStoryteller_Story3Text}, - {0x04, 1, gTextStoryteller_Story4Title, gTextStoryteller_Story4Action, gTextStoryteller_Story4Text}, - {0x06, 1, gTextStoryteller_Story5Title, gTextStoryteller_Story5Action, gTextStoryteller_Story5Text}, - {0x09, 1, gTextStoryteller_Story6Title, gTextStoryteller_Story6Action, gTextStoryteller_Story6Text}, - {0x0B, 1, gTextStoryteller_Story7Title, gTextStoryteller_Story7Action, gTextStoryteller_Story7Text}, - {0x0C, 1, gTextStoryteller_Story8Title, gTextStoryteller_Story8Action, gTextStoryteller_Story8Text}, - {0x0D, 1, gTextStoryteller_Story9Title, gTextStoryteller_Story9Action, gTextStoryteller_Story9Text}, - {0x0E, 1, gTextStoryteller_Story10Title, gTextStoryteller_Story10Action, gTextStoryteller_Story10Text}, - {0x0F, 1, gTextStoryteller_Story11Title, gTextStoryteller_Story11Action, gTextStoryteller_Story11Text}, - {0x10, 1, gTextStoryteller_Story12Title, gTextStoryteller_Story12Action, gTextStoryteller_Story12Text}, - {0x11, 1, gTextStoryteller_Story13Title, gTextStoryteller_Story13Action, gTextStoryteller_Story13Text}, - {0x12, 1, gTextStoryteller_Story14Title, gTextStoryteller_Story14Action, gTextStoryteller_Story14Text}, - {0x13, 1, gTextStoryteller_Story15Title, gTextStoryteller_Story15Action, gTextStoryteller_Story15Text}, - {0x14, 1, gTextStoryteller_Story16Title, gTextStoryteller_Story16Action, gTextStoryteller_Story16Text}, - {0x1A, 1, gTextStoryteller_Story17Title, gTextStoryteller_Story17Action, gTextStoryteller_Story17Text}, - {0x1B, 1, gTextStoryteller_Story18Title, gTextStoryteller_Story18Action, gTextStoryteller_Story18Text}, - {0x1C, 1, gTextStoryteller_Story19Title, gTextStoryteller_Story19Action, gTextStoryteller_Story19Text}, - {0x1D, 2, gTextStoryteller_Story20Title, gTextStoryteller_Story20Action, gTextStoryteller_Story20Text}, - {0x1E, 1, gTextStoryteller_Story21Title, gTextStoryteller_Story21Action, gTextStoryteller_Story21Text}, - {0x21, 1, gTextStoryteller_Story22Title, gTextStoryteller_Story22Action, gTextStoryteller_Story22Text}, - {0x24, 1, gTextStoryteller_Story23Title, gTextStoryteller_Story23Action, gTextStoryteller_Story23Text}, - {0x25, 1, gTextStoryteller_Story24Title, gTextStoryteller_Story24Action, gTextStoryteller_Story24Text}, - {0x26, 1, gTextStoryteller_Story25Title, gTextStoryteller_Story25Action, gTextStoryteller_Story25Text}, - {0x27, 1, gTextStoryteller_Story26Title, gTextStoryteller_Story26Action, gTextStoryteller_Story26Text}, - {0x28, 1, gTextStoryteller_Story27Title, gTextStoryteller_Story27Action, gTextStoryteller_Story27Text}, - {0x29, 1, gTextStoryteller_Story28Title, gTextStoryteller_Story28Action, gTextStoryteller_Story28Text}, - {0x2A, 1, gTextStoryteller_Story29Title, gTextStoryteller_Story29Action, gTextStoryteller_Story29Text}, - {0x2B, 1, gTextStoryteller_Story30Title, gTextStoryteller_Story30Action, gTextStoryteller_Story30Text}, - {0x2C, 1, gTextStoryteller_Story31Title, gTextStoryteller_Story31Action, gTextStoryteller_Story31Text}, - {0x2D, 1, gTextStoryteller_Story32Title, gTextStoryteller_Story32Action, gTextStoryteller_Story32Text}, - {0x2E, 1, gTextStoryteller_Story33Title, gTextStoryteller_Story33Action, gTextStoryteller_Story33Text}, - {0x2F, 1, gTextStoryteller_Story34Title, gTextStoryteller_Story34Action, gTextStoryteller_Story34Text}, - {0x30, 1, gTextStoryteller_Story35Title, gTextStoryteller_Story35Action, gTextStoryteller_Story35Text}, - {0x31, 1, gTextStoryteller_Story36Title, gTextStoryteller_Story36Action, gTextStoryteller_Story36Text}, -}; - -static void StorytellerSetup(void) -{ - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - s32 i; - - storyteller->id = MAUVILLE_MAN_STORYTELLER; - storyteller->alreadyRecorded = FALSE; - for (i = 0; i < 4; i++) - { - storyteller->gameStatIDs[i] = 0; - storyteller->trainerNames[0][i] = EOS; // Maybe they meant storyteller->trainerNames[i][0] instead? - } -} - -static void sub_80F8428(void) -{ - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - - storyteller->id = MAUVILLE_MAN_STORYTELLER; - storyteller->alreadyRecorded = FALSE; -} - -static u32 StorytellerGetGameStat(u8 stat) -{ - if (stat == NUM_GAME_STATS) - stat = 0; - return GetGameStat(stat); -} - -static const struct Story *GetStoryByStat(u32 stat) -{ - s32 i; - - for (i = 0; i < 36; i++) - { - if (sStorytellerStories[i].stat == stat) - return &sStorytellerStories[i]; - } - return &sStorytellerStories[35]; -} - -static const u8 *GetStoryTitleByStat(u32 stat) -{ - return GetStoryByStat(stat)->title; -} - -static const u8 *GetStoryTextByStat(u32 stat) -{ - return GetStoryByStat(stat)->fullText; -} - -static const u8 *GetStoryActionByStat(u32 stat) -{ - return GetStoryByStat(stat)->action; -} - -static u8 GetFreeStorySlot(void) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - - if (storyteller->gameStatIDs[i] == 0) - break; - } - return i; -} - -static u32 StorytellerGetRecordedTrainerStat(u32 trainer) -{ - u8 *ptr = gSaveBlock1.mauvilleMan.storyteller.statValues[trainer]; - - return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); -} - -static void StorytellerSetRecordedTrainerStat(u32 trainer, u32 val) -{ - u8 *ptr = gSaveBlock1.mauvilleMan.storyteller.statValues[trainer]; - - ptr[0] = val; - ptr[1] = val >> 8; - ptr[2] = val >> 16; - ptr[3] = val >> 24; -} - -static bool32 HasTrainerStatIncreased(u32 trainer) -{ - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - - if (StorytellerGetGameStat(storyteller->gameStatIDs[trainer]) > StorytellerGetRecordedTrainerStat(trainer)) - return TRUE; - else - return FALSE; -} - -static void GetStoryByStattellerPlayerName(u32 player, void *dst) -{ - u8 *name = gSaveBlock1.mauvilleMan.storyteller.trainerNames[player]; - - memset(dst, EOS, 8); - memcpy(dst, name, 7); -} - -static void StorytellerSetPlayerName(u32 player, const u8 *src) -{ - u8 *name = gSaveBlock1.mauvilleMan.storyteller.trainerNames[player]; - u8 len = StringLength(src); - - memset(name, EOS, 7); - StringCopyN(name, src, len); -} - -static void StorytellerRecordNewStat(u32 player, u32 stat) -{ - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - - storyteller->gameStatIDs[player] = stat; - StorytellerSetPlayerName(player, gSaveBlock2.playerName); - StorytellerSetRecordedTrainerStat(player, StorytellerGetGameStat(stat)); - ConvertIntToDecimalStringN(gStringVar1, StorytellerGetGameStat(stat), 0, 10); - StringCopy(gStringVar2, GetStoryActionByStat(stat)); -} - -static void ScrambleStatList(u8 *arr, s32 count) -{ - s32 i; - - for (i = 0; i < count; i++) - arr[i] = i; - for (i = 0; i < count; i++) - { - u32 a = Random() % count; - u32 b = Random() % count; - u8 temp = arr[a]; - arr[a] = arr[b]; - arr[b] = temp; - } -} - -// What purpose does this struct even serve? Only the length field is used. -static const struct {u32 length; struct MauvilleManStoryteller *unused1; u32 unused2;} sStorytellerStuff = -{ - 36, - &gSaveBlock1.mauvilleMan.storyteller, // unused - 12, // unused -}; - -static bool8 StorytellerInitializeRandomStat(void) -{ - u8 arr[sStorytellerStuff.length]; - s32 i; - s32 j; - - ScrambleStatList(arr, 36); - for (i = 0; i < 36; i++) - { - u8 stat = sStorytellerStories[arr[i]].stat; - u8 minVal = sStorytellerStories[arr[i]].minVal; - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - - for (j = 0; j < 4; j++) - { - if (gSaveBlock1.mauvilleMan.storyteller.gameStatIDs[j] == stat) - break; - } - if (j == 4 && StorytellerGetGameStat(stat) >= minVal) - { - storyteller->alreadyRecorded = TRUE; - StorytellerRecordNewStat(GetFreeStorySlot(), stat); - return TRUE; - } - } - return FALSE; -} - -static void StorytellerDisplayStory(u32 player) -{ - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - u8 stat = storyteller->gameStatIDs[player]; - - ConvertIntToDecimalStringN(gStringVar1, StorytellerGetRecordedTrainerStat(player), 0, 10); - StringCopy(gStringVar2, GetStoryActionByStat(stat)); - GetStoryByStattellerPlayerName(player, gStringVar3); - ShowFieldMessage(GetStoryTextByStat(stat)); -} - -static void PrintStoryList(void) -{ - s32 i; - - Menu_DrawStdWindowFrame(0, 0, 25, 4 + GetFreeStorySlot() * 2); - for (i = 0; i < 4; i++) - { - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - u8 stat = storyteller->gameStatIDs[i]; - - if (stat == 0) - break; - Menu_PrintText(GetStoryTitleByStat(stat), 1, 2 + i * 2); - } - Menu_PrintText(gPCText_Cancel, 1, 2 + i * 2); -} - -static u8 gUnknown_03000748; - -static void Task_StoryListMenu(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s32 selection; - - switch (task->data[0]) - { - case 0: - PrintStoryList(); - InitMenu(0, 1, 2, GetFreeStorySlot() + 1, 0, 24); - task->data[0]++; - break; - case 1: - selection = Menu_ProcessInput(); - if (selection == -2) - break; - if (selection == -1 || selection == GetFreeStorySlot()) - { - gSpecialVar_Result = 0; - } - else - { - gSpecialVar_Result = 1; - gUnknown_03000748 = selection; - } - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 25, 12); - DestroyTask(taskId); - EnableBothScriptContexts(); - break; - } -} - -// Sets gSpecialVar_Result to TRUE if player selected a story -void ScrSpecial_StorytellerStoryListMenu(void) -{ - CreateTask(Task_StoryListMenu, 0x50); -} - -void ScrSpecial_StorytellerDisplayStory(void) -{ - StorytellerDisplayStory(gUnknown_03000748); -} - -u8 ScrSpecial_StorytellerGetFreeStorySlot(void) -{ - return GetFreeStorySlot(); -} - -// Returns TRUE if stat has increased -bool8 ScrSpecial_StorytellerUpdateStat(void) -{ - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - u8 r4 = storyteller->gameStatIDs[gUnknown_03000748]; - - if (HasTrainerStatIncreased(gUnknown_03000748) == TRUE) - { - StorytellerRecordNewStat(gUnknown_03000748, r4); - return TRUE; - } - return FALSE; -} - -bool8 ScrSpecial_HasStorytellerAlreadyRecorded(void) -{ - struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; - - if (storyteller->alreadyRecorded == FALSE) - return FALSE; - else - return TRUE; -} - -bool8 ScrSpecial_StorytellerInitializeRandomStat(void) -{ - return StorytellerInitializeRandomStat(); -} diff --git a/src/field/menu_helpers.c b/src/field/menu_helpers.c deleted file mode 100644 index 388d98ec7..000000000 --- a/src/field/menu_helpers.c +++ /dev/null @@ -1,555 +0,0 @@ -#include "global.h" -#include "item_menu.h" -#include "constants/items.h" -#include "link.h" -#include "mail_data.h" -#include "main.h" -#include "constants/maps.h" -#include "menu.h" -#include "menu_helpers.h" -#include "overworld.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "text.h" - -#define SCROLL_INDICATOR_PAL_TAG 6 - -static void sub_80F9834(struct Sprite *sprite); - -static EWRAM_DATA u8 gVerticalScrollIndicatorIds[4] = {0}; -static EWRAM_DATA struct YesNoFuncTable gUnknown_020388C4 = {0}; - -static TaskFunc gUnknown_0300074C; - -static const u8 gSpriteImage_83E5808[] = INCBIN_U8("graphics/unknown_sprites/83E59A0/0.4bpp"); - -static const u8 gSpriteImage_83E5848[] = INCBIN_U8("graphics/unknown_sprites/83E59A0/1.4bpp"); - -static const u8 gSpriteImage_83E5888[] = INCBIN_U8("graphics/unknown_sprites/83E59B0/0.4bpp"); - -static const u8 gSpriteImage_83E58C8[] = INCBIN_U8("graphics/unknown_sprites/83E59B0/1.4bpp"); - -static const u8 gSpriteImage_83E5908[] = INCBIN_U8("graphics/unknown_sprites/83E59C0/0.4bpp"); - -static const u8 gSpriteImage_83E5928[] = INCBIN_U8("graphics/unknown_sprites/83E59C0/1.4bpp"); - -static const u16 Palette_3E5948[] = INCBIN_U16("graphics/interface/83E5948.gbapal"); - -static const struct SpritePalette gUnknown_083E5968 = { Palette_3E5948, SCROLL_INDICATOR_PAL_TAG }; - -static const struct OamData gOamData_83E5970 = -{ - .tileNum = 1 -}; - -static const struct OamData gOamData_83E5978 = -{ - .shape = ST_OAM_H_RECTANGLE, - .tileNum = 1 -}; - -static const struct OamData gOamData_83E5980 = -{ - .shape = ST_OAM_V_RECTANGLE, - .tileNum = 1 -}; - -static const union AnimCmd gSpriteAnim_83E5988[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_83E5990[] = -{ - ANIMCMD_FRAME(1, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_83E5998[] = -{ - gSpriteAnim_83E5988, - gSpriteAnim_83E5990, -}; - -static const struct SpriteFrameImage gSpriteImageTable_83E59A0[] = -{ - { gSpriteImage_83E5808, 0x40 }, - { gSpriteImage_83E5848, 0x40 }, -}; - -static const struct SpriteFrameImage gSpriteImageTable_83E59B0[] = -{ - { gSpriteImage_83E5888, 0x40 }, - { gSpriteImage_83E58C8, 0x40 }, -}; - -static const struct SpriteFrameImage gSpriteImageTable_83E59C0[] = -{ - { gSpriteImage_83E5908, 0x20 }, - { gSpriteImage_83E5928, 0x20 }, -}; - -static const struct SpriteTemplate gSpriteTemplate_83E59D0 = -{ - .tileTag = 0xFFFF, - .paletteTag = SCROLL_INDICATOR_PAL_TAG, - .oam = &gOamData_83E5978, - .anims = gSpriteAnimTable_83E5998, - .images = gSpriteImageTable_83E59A0, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80F9834, -}; - -static const struct SpriteTemplate gSpriteTemplate_83E59E8 = -{ - .tileTag = 0xFFFF, - .paletteTag = SCROLL_INDICATOR_PAL_TAG, - .oam = &gOamData_83E5980, - .anims = gSpriteAnimTable_83E5998, - .images = gSpriteImageTable_83E59B0, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80F9834, -}; - -static const struct SpriteTemplate gSpriteTemplate_83E5A00 = -{ - .tileTag = 0xFFFF, - .paletteTag = SCROLL_INDICATOR_PAL_TAG, - .oam = &gOamData_83E5970, - .anims = gSpriteAnimTable_83E5998, - .images = gSpriteImageTable_83E59C0, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -void ClearBGTilemapBuffers(void) -{ - memset(&gBGTilemapBuffers[1], 0, 0x800); - memset(&gBGTilemapBuffers[2], 0, 0x800); - memset(&gBGTilemapBuffers[3], 0, 0x800); -} - -// display message box, fill box with tile if tile is not zero, print string -static void PrintMessage(const u8 *str, u16 tile) -{ - Menu_DisplayDialogueFrame(); - if (tile) - { - sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile); - } - MenuPrintMessageDefaultCoords(str); -} - -static void sub_80F9090(u8 taskId) -{ - if (Menu_UpdateWindowText() == TRUE) - { - gUnknown_0300074C(taskId); - } -} - -void DisplayItemMessageOnField(u8 taskId, const u8 *str, TaskFunc callback, u16 tile) -{ - PrintMessage(str, tile); - gUnknown_0300074C = callback; - gTasks[taskId].func = sub_80F9090; -} - -static void Task_CallYesOrNoCallback(u8 taskId) -{ - switch (Menu_ProcessInputNoWrap_()) - { - case 0: - PlaySE(SE_SELECT); - gUnknown_020388C4.yesFunc(taskId); - break; - case 1: - case -1: - PlaySE(SE_SELECT); - gUnknown_020388C4.noFunc(taskId); - } -} - -void DoYesNoFuncWithChoice(u8 taskId, const struct YesNoFuncTable *funcTable) -{ - gUnknown_020388C4 = *funcTable; - gTasks[taskId].func = Task_CallYesOrNoCallback; -} - -static void PrintStringWithPalette(const u8 *str, u8 paletteNum, u8 left, u8 top) -{ - u8 paletteStr[] = _("{PALETTE 0}"); - - if (paletteNum != 0xFF) - { - paletteStr[2] = paletteNum; - StringCopy(gStringVar4, paletteStr); - StringAppend(gStringVar4, str); - paletteStr[2] = gMenuWindowPtr->paletteNum; - StringAppend(gStringVar4, paletteStr); - } - else - { - StringCopy(gStringVar4, str); - } - - Menu_PrintText(gStringVar4, left, top); -} - -// unused -void PrintNumberWithPalette(s32 value, u8 paletteNum, u8 n, u8 mode, u8 left, u8 top) -{ - ConvertIntToDecimalStringN(gStringVar1, value, mode, n); - if (paletteNum != 0xFF) - { - PrintStringWithPalette(gStringVar1, paletteNum, left, top); - } - else - { - Menu_PrintText(gStringVar1, left, top); - } -} - -// unused -void PrintTriangleCursorWithPalette(u8 left, u8 top, u8 paletteNum) -{ - u8 cursorStr[] = _("▶"); - PrintStringWithPalette(cursorStr, paletteNum, left, top); -} - -u8 sub_80F9284(void) -{ - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) - { - if (gMain.newKeys & L_BUTTON) - { - return 1; - } - if (gMain.newKeys & R_BUTTON) - { - return 2; - } - } - - return 0; -} - -u8 sub_80F92BC(void) -{ - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) - { - if (gMain.newAndRepeatedKeys & L_BUTTON) - { - return 1; - } - if (gMain.newAndRepeatedKeys & R_BUTTON) - { - return 2; - } - } - - return 0; -} - -bool8 sub_80F92F4(u16 itemId) -{ - if (itemId != ITEM_ENIGMA_BERRY) - { - return TRUE; - } - - if (!(gSaveBlock1.location.mapGroup == MAP_GROUP(TRADE_CENTER) && gSaveBlock1.location.mapNum == MAP_NUM(TRADE_CENTER))) - { - return TRUE; - } - - return FALSE; -} - -bool8 sub_80F931C(u16 itemId) -{ - if (is_c1_link_related_active() != TRUE) - { - return TRUE; - } - - if (ItemIsMail(itemId) != TRUE) - { - return TRUE; - } - - return FALSE; -} - -bool8 sub_80F9344(void) -{ - if (is_c1_link_related_active() == TRUE || gReceivedRemoteLinkPlayers == 1) - { - return TRUE; - } - - return FALSE; -} - -void sub_80F9368(void) -{ - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); -} - -void ClearVideoCallbacks(void) -{ - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); -} - -void ClearVerticalScrollIndicatorPalettes(void) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - gVerticalScrollIndicatorIds[i] = 0xFF; - } - - FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); - LoadSpritePalette(&gUnknown_083E5968); -} - -void sub_80F9480(u8 *data, u8 n) -{ - u8 i; - - for (i = 0; i < n; i++) - { - data[i] = 0xFF; - } -} - -void sub_80F94A4(u8 animNum, u8 *spriteId, s16 x, s16 y) -{ - if (animNum <= 5) - { - if (*spriteId == 0xFF) - { - *spriteId = CreateSprite(&gSpriteTemplate_83E5A00, x, y, 0); - } - animNum -= 4; - StartSpriteAnim(&gSprites[*spriteId], animNum); - } -} - -void sub_80F94F8(u8 *spriteId) -{ - if (*spriteId != 0xFF) - { - DestroySprite(&gSprites[*spriteId]); - *spriteId = 0xFF; - } -} - -void sub_80F9520(u8 *data, u8 n) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - sub_80F94F8(&data[i]); - } -} - -void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y) -{ - if (id >= 4) - { - return; - } - - switch (id) - { - case TOP_ARROW: - if (gVerticalScrollIndicatorIds[TOP_ARROW] == 0xFF) - { - gVerticalScrollIndicatorIds[TOP_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); - gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[2] = -1; - if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] != 0xFF) - { - gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y * -1; - gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3]; - } - else - { - gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = 0; - } - } - break; - - case BOTTOM_ARROW: - if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] == 0xFF) - { - gVerticalScrollIndicatorIds[BOTTOM_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); - gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[2] = 1; - if (gVerticalScrollIndicatorIds[TOP_ARROW] != 0xFF) - { - gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y * -1; - gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3]; - } - else - { - gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = 0; - } - } - break; - - case LEFT_ARROW: - if (gVerticalScrollIndicatorIds[LEFT_ARROW] == 0xFF) - { - gVerticalScrollIndicatorIds[LEFT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); - gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[0] = -1; - if (gVerticalScrollIndicatorIds[RIGHT_ARROW] != 0xFF) - { - gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x * -1; - gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1]; - } - else - { - gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = 0; - } - } - break; - - case RIGHT_ARROW: - if (gVerticalScrollIndicatorIds[RIGHT_ARROW] == 0xFF) - { - gVerticalScrollIndicatorIds[RIGHT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); - gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[0] = 1; - if (gVerticalScrollIndicatorIds[LEFT_ARROW] != 0xFF) - { - gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x * -1; - gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1]; - } - else - { - gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = 0; - } - } - break; - } - - StartSpriteAnim(&gSprites[gVerticalScrollIndicatorIds[id]], id & 1); -} - -void SetVerticalScrollIndicators(u8 id, bool8 invisible) -{ - if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF) - { - gSprites[gVerticalScrollIndicatorIds[id]].invisible = invisible; - } -} - -void DestroyVerticalScrollIndicator(u8 id) -{ - if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF) - { - DestroySprite(&gSprites[gVerticalScrollIndicatorIds[id]]); - gVerticalScrollIndicatorIds[id] = 0xFF; - } -} - -void LoadScrollIndicatorPalette(void) -{ - LoadSpritePalette(&gUnknown_083E5968); -} - -void BuyMenuFreeMemory(void) -{ - FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); -} - -static void sub_80F9834(struct Sprite *sprite) -{ - if (sprite->data[1] == 0) - { - sprite->pos2.x += sprite->data[0]; - } - if (sprite->data[3] == 0) - { - sprite->pos2.y += sprite->data[2]; - } - sprite->data[1]++; - sprite->data[3]++; - if (sprite->data[1] > 2) - { - sprite->data[1] = 0; - } - if (sprite->data[3] > 2) - { - sprite->data[3] = 0; - } - if (sprite->pos2.x == 8 || sprite->pos2.x == -8) - { - sprite->pos2.x = 0; - } - if (sprite->pos2.y == 8 || sprite->pos2.y == -8) - { - sprite->pos2.y = 0; - } -} - -void StopVerticalScrollIndicators(u8 id) -{ - if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) - { - gSprites[gVerticalScrollIndicatorIds[id]].callback = SpriteCallbackDummy; - } -} - -void StartVerticalScrollIndicators(u8 id) -{ - if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) - { - gSprites[gVerticalScrollIndicatorIds[id]].callback = sub_80F9834; - } -} - -static void ResetVerticalScrollIndicators(u8 id) -{ - if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) - { - gSprites[gVerticalScrollIndicatorIds[id]].pos2.x = 0; - gSprites[gVerticalScrollIndicatorIds[id]].pos2.y = 0; - gSprites[gVerticalScrollIndicatorIds[id]].data[1] = 0; - gSprites[gVerticalScrollIndicatorIds[id]].data[3] = 0; - } -} - -void PauseVerticalScrollIndicator(u8 id) -{ - StopVerticalScrollIndicators(id); - ResetVerticalScrollIndicators(id); -} - -void SetVerticalScrollIndicatorPriority(u8 id, u8 priority) -{ - if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) - { - gSprites[gVerticalScrollIndicatorIds[id]].oam.priority = priority; - } -} diff --git a/src/field/metatile_behavior.c b/src/field/metatile_behavior.c deleted file mode 100644 index d05ba0b89..000000000 --- a/src/field/metatile_behavior.c +++ /dev/null @@ -1,1308 +0,0 @@ -#include "global.h" -#include "metatile_behavior.h" -#include "metatile_behaviors.h" - -#define TILE_ATTRIBUTES(three, two, one) (((one) ? 1 : 0) | ((two) ? 2 : 0) | ((three) ? 4 : 0)) - -static const u8 sTileBitAttributes[] = -{ - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, TRUE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, TRUE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(TRUE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE), - TILE_ATTRIBUTES(FALSE, FALSE, FALSE) -}; - -// only used as default case for checking jump landing in field_ground_effect. -bool8 MetatileBehavior_IsATile(u8 var) -{ - return TRUE; -} - -bool8 MetatileBehavior_IsEncounterTile(u8 var) -{ - if ((sTileBitAttributes[var] & 1) != 0) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsJumpEast(u8 var) -{ - if (var == MB_JUMP_EAST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsJumpWest(u8 var) -{ - if (var == MB_JUMP_WEST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsJumpNorth(u8 var) -{ - if (var == MB_JUMP_NORTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsJumpSouth(u8 var) -{ - if (var == MB_JUMP_SOUTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPokeGrass(u8 var) -{ - if (var == MB_TALL_GRASS || var == MB_LONG_GRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSandOrDeepSand(u8 var) -{ - if (var == MB_SAND || var == MB_DEEP_SAND) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsDeepSand(u8 var) -{ - if (var == MB_DEEP_SAND) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsReflective(u8 var) -{ - if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_1A || var == MB_ICE || var == MB_SOOTOPOLIS_DEEP_WATER || var == MB_REFLECTION_UNDER_BRIDGE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsIce(u8 var) -{ - if (var == MB_ICE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWarpDoor(u8 var) -{ - if (var == MB_ANIMATED_DOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsDoor(u8 var) -{ - if (var == MB_8D || var == MB_ANIMATED_DOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsEscalator(u8 var) -{ - if (var == MB_UP_ESCALATOR || var == MB_DOWN_ESCALATOR) - return TRUE; - else - return FALSE; -} - -bool8 unref_sub_8056EE0(u8 var) -{ - if (var == MB_04) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsLadder(u8 var) -{ - if (var == MB_LADDER) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsNonAnimDoor(u8 var) -{ - if (var == MB_NON_ANIMATED_DOOR || var == MB_WATER_DOOR || var == MB_DEEP_SOUTH_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsDeepSouthWarp(u8 var) -{ - if (var == MB_DEEP_SOUTH_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8 var) -{ - if ((sTileBitAttributes[var] & 2) != 0) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsEastArrowWarp(u8 var) -{ - if (var == MB_EAST_ARROW_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWestArrowWarp(u8 var) -{ - if (var == MB_WEST_ARROW_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsNorthArrowWarp(u8 var) -{ - if (var == MB_NORTH_ARROW_WARP || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSouthArrowWarp(u8 var) -{ - if (var == MB_SOUTH_ARROW_WARP || var == MB_WATER_SOUTH_ARROW_WARP || var == MB_SHOAL_CAVE_ENTRANCE) - return TRUE; - else - return FALSE; -} - -// unused -bool8 MetatileBehavior_IsArrowWarp(u8 var) -{ - u8 var2 = 0; - - if (MetatileBehavior_IsEastArrowWarp(var) - || MetatileBehavior_IsWestArrowWarp(var) - || MetatileBehavior_IsNorthArrowWarp(var) - || MetatileBehavior_IsSouthArrowWarp(var)) - { - var2 = 1; - } - return var2; -} - -bool8 MetatileBehavior_IsMoveTile(u8 var) -{ - if ((var >= MB_WALK_EAST && var <= MB_TRICK_HOUSE_PUZZLE_8_FLOOR) || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT) - || var == MB_MUDDY_SLOPE || var == MB_CRACKED_FLOOR || var == MB_WATERFALL || var == MB_ICE || var == MB_BB || var == MB_BC) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsIce_2(u8 var) -{ - if (var == MB_ICE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 var) -{ - if (var == MB_TRICK_HOUSE_PUZZLE_8_FLOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_0x05(u8 var) -{ - if (var == MB_05) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWalkNorth(u8 var) -{ - if (var == MB_WALK_NORTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWalkSouth(u8 var) -{ - if (var == MB_WALK_SOUTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWalkWest(u8 var) -{ - if (var == MB_WALK_WEST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWalkEast(u8 var) -{ - if (var == MB_WALK_EAST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsNorthwardCurrent(u8 var) -{ - if (var == MB_NORTHWARD_CURRENT) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSouthwardCurrent(u8 var) -{ - if (var == MB_SOUTHWARD_CURRENT) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWestwardCurrent(u8 var) -{ - if (var == MB_WESTWARD_CURRENT) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsEastwardCurrent(u8 var) -{ - if (var == MB_EASTWARD_CURRENT) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSlideNorth(u8 var) -{ - if (var == MB_SLIDE_NORTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSlideSouth(u8 var) -{ - if (var == MB_SLIDE_SOUTH) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSlideWest(u8 var) -{ - if (var == MB_SLIDE_WEST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSlideEast(u8 var) -{ - if (var == MB_SLIDE_EAST) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCounter(u8 var) -{ - if (var == MB_COUNTER) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 tile, u8 playerDir) -{ - if (playerDir != CONNECTION_NORTH) // if the player isn't facing north, forget about it. - return FALSE; - else if (tile == MB_TELEVISION) // is the player's north tile a TV? - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPC(u8 var) -{ - if (var == MB_PC) - return TRUE; - else - return FALSE; -} - -bool8 is_tile_x84(u8 var) -{ - if (var == MB_84) - return TRUE; - else - return FALSE; -} - -bool8 sub_80571C0(u8 var) -{ - if (var == MB_91 || var == MB_93 || var == MB_95 || var == MB_97 - || var == MB_99 || var == MB_9B || var == MB_9D) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSecretBaseCave(u8 var) -{ - if (var == MB_SECRET_BASE_SPOT_RED_CAVE || var == MB_SECRET_BASE_SPOT_BROWN_CAVE || var == MB_SECRET_BASE_SPOT_YELLOW_CAVE || var == MB_SECRET_BASE_SPOT_BLUE_CAVE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSecretBaseTree(u8 var) -{ - if (var == MB_SECRET_BASE_SPOT_TREE_1 || var == MB_SECRET_BASE_SPOT_TREE_2) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSecretBaseShrub(u8 var) -{ - if (var == MB_SECRET_BASE_SPOT_SHRUB) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSecretBasePC(u8 var) -{ - if (var == MB_SECRET_BASE_PC) - return TRUE; - else - return FALSE; -} - -bool8 sub_805724C(u8 var) -{ - if (var == MB_B1) - return TRUE; - else - return FALSE; -} - -bool8 unref_sub_8057260(u8 var) -{ - if (var == MB_B2) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057274(u8 var) -{ - if (var == MB_B3) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057288(u8 var) -{ - if (var == MB_B9) - return TRUE; - else - return FALSE; -} - -bool8 sub_805729C(u8 var) -{ - if (var == MB_NORMAL) - return TRUE; - else - return FALSE; -} - -bool8 sub_80572B0(u8 var) -{ - if (var == MB_B7) - return TRUE; - else - return FALSE; -} - -bool8 unref_sub_80572C4(u8 var) -{ - if (var == MB_B2) - return TRUE; - else - return FALSE; -} - -bool8 sub_80572D8(u8 var) -{ - if (var == MB_B5) - return TRUE; - else - return FALSE; -} - -bool8 sub_80572EC(u8 var) -{ - if (var == MB_C3) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057300(u8 var) -{ - if (var == MB_C2) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057314(u8 var) -{ - if (var == MB_B8) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057328(u8 var) -{ - if (var == MB_BE) - return TRUE; - else - return FALSE; -} - -bool8 sub_805733C(u8 var) -{ - if (var == MB_BD) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057350(u8 var) -{ - if (var == MB_BA) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057364(u8 var) -{ - if (var == MB_BF) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057378(u8 var) -{ - if (var == MB_C4) - return TRUE; - else - return FALSE; -} - -bool8 sub_805738C(u8 var) -{ - if (var == MB_C5) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_HasRipples(u8 var) -{ - if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_SOOTOPOLIS_DEEP_WATER) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPuddle(u8 var) -{ - if (var == MB_PUDDLE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsTallGrass(u8 var) -{ - if (var == MB_TALL_GRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsLongGrass(u8 var) -{ - if (var == MB_LONG_GRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBerryTreeSoil(u8 var) -{ - if (var == MB_BERRY_TREE_SOIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsAshGrass(u8 var) -{ - if (var == MB_ASHGRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsUnusedFootprintMetatile(u8 var) -{ - if (var == MB_25) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBridge(u8 var) -{ - if (var >= MB_WARP_OR_BRIDGE && var <= MB_ROUTE120_NORTH_BRIDGE_2) - return TRUE; - else - return FALSE; -} - -u8 sub_8057450(u8 var) -{ - u8 result = var - MB_WARP_OR_BRIDGE; - - if (result > 3) - result = 0; - - return result; -} - -bool8 MetatileBehavior_IsLandWildEncounter(u8 var) -{ - if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == FALSE && MetatileBehavior_IsEncounterTile(var) == TRUE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWaterWildEncounter(u8 var) -{ - if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == TRUE && MetatileBehavior_IsEncounterTile(var) == TRUE) - return TRUE; - else - return FALSE; -} - -bool8 sub_80574C4(u8 var) -{ - if (var == MB_0B) - return TRUE; - else - return FALSE; -} - -bool8 sub_80574D8(u8 var) -{ - if (var == MB_MOUNTAIN_TOP) - return TRUE; - else - return FALSE; -} - -bool8 sub_80574EC(u8 var) -{ - if (var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER) - return TRUE; - else - return FALSE; -} - -bool8 sub_805750C(u8 var) -{ - if (var == MB_NO_SURFACING || var == MB_SEAWEED_NO_SURFACING) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsShallowFlowingWater(u8 var) -{ - if (var == MB_SHALLOW_WATER || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP || var == MB_SHOAL_CAVE_ENTRANCE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsThinIce(u8 var) -{ - if (var == MB_THIN_ICE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCrackedIce(u8 var) -{ - if (var == MB_CRACKED_ICE) - return TRUE; - else - return FALSE; -} - -bool8 sub_8057568(u8 var) -{ - if (var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER) - return TRUE; - else - return FALSE; -} - -bool8 unref_sub_8057584(u8 var) -{ - if (var == MB_18 || var == MB_1A) - return TRUE; - else - return FALSE; -} - -bool8 sub_805759C(u8 var) -{ - if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) && MetatileBehavior_IsWaterfall(var) == FALSE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsEastBlocked(u8 var) -{ - if (var == MB_IMPASSABLE_EAST || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_SOUTHEAST || var == MB_C1 || var == MB_BE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWestBlocked(u8 var) -{ - if (var == MB_IMPASSABLE_WEST || var == MB_IMPASSABLE_NORTHWEST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_C1 || var == MB_BE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsNorthBlocked(u8 var) -{ - if (var == MB_IMPASSABLE_NORTH || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_NORTHWEST || var == MB_BED) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSouthBlocked(u8 var) -{ - if (var == MB_IMPASSABLE_SOUTH || var == MB_IMPASSABLE_SOUTHEAST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_BED) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsShortGrass(u8 var) -{ - if (var == MB_SHORT_GRASS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsHotSprings(u8 var) -{ - if (var == MB_HOT_SPRINGS) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsWaterfall(u8 var) -{ - if (var == MB_WATERFALL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsFortreeBridge(u8 var) -{ - if (var == MB_FORTREE_BRIDGE) - return TRUE; - else - return FALSE; -} - -bool8 sub_80576A0(u8 var) -{ - if (var == MB_PACIFIDLOG_VERTICAL_LOG_1) - return TRUE; - else - return FALSE; -} - -bool8 sub_80576B4(u8 var) -{ - if (var == MB_PACIFIDLOG_VERTICAL_LOG_2) - return TRUE; - else - return FALSE; -} - -bool8 sub_80576C8(u8 var) -{ - if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_1) - return TRUE; - else - return FALSE; -} - -bool8 sub_80576DC(u8 var) -{ - if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_2) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPacifidlogLog(u8 var) -{ - if (var >= MB_PACIFIDLOG_VERTICAL_LOG_1 && var <= MB_PACIFIDLOG_HORIZONTAL_LOG_2) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 var) -{ - if (var == MB_TRICK_HOUSE_PUZZLE_DOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsRegionMap(u8 var) -{ - if (var == MB_REGION_MAP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsClosedSootopolisGymDoor(u8 var) -{ - if (var == MB_CLOSED_SOOTOPOLIS_GYM_DOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsRoulette(u8 var) -{ - if (var == MB_ROULETTE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPokeblockFeeder(u8 var) -{ - if (var == MB_POKEBLOCK_FEEDER) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_0xBB(u8 var) -{ - if (var == MB_BB) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_0xBC(u8 var) -{ - if (var == MB_BC) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 var) -{ - if (var == MB_LAVARIDGE_GYM_B1F_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsLavaridge1FWarp(u8 var) -{ - if (var == MB_LAVARIDGE_GYM_1F_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsAquaHideoutWarp(u8 var) -{ - if (var == MB_AQUA_HIDEOUT_WARP) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSurfableFishableWater(u8 var) -{ - if (var == MB_POND_WATER || var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT)) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsMtPyreHole(u8 var) -{ - if (var == MB_MT_PYRE_HOLE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCrackedFloorHole(u8 var) -{ - if (var == MB_CRACKED_FLOOR_HOLE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCrackedFloor(u8 var) -{ - if (var == MB_CRACKED_FLOOR) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsMuddySlope(u8 var) -{ - if (var == MB_MUDDY_SLOPE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBumpySlope(u8 var) -{ - if (var == MB_BUMPY_SLOPE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 var) -{ - if (var == MB_ISOLATED_VERTICAL_RAIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 var) -{ - if (var == MB_ISOLATED_HORIZONTAL_RAIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsVerticalRail(u8 var) -{ - if (var == MB_VERTICAL_RAIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsHorizontalRail(u8 var) -{ - if (var == MB_HORIZONTAL_RAIL) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsSeaweed(u8 var) -{ - if (var == MB_SEAWEED || var == MB_SEAWEED_NO_SURFACING) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsRunningDisallowed(u8 var) -{ - if (var == MB_NO_RUNNING || var == MB_LONG_GRASS || var == MB_HOT_SPRINGS || MetatileBehavior_IsPacifidlogLog(var) != FALSE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsCuttableGrass(u8 var) -{ - if (var == MB_TALL_GRASS || var == MB_LONG_GRASS || var == MB_ASHGRASS || var == MB_LONG_GRASS_SOUTH_EDGE) - return TRUE; - else - return FALSE; -} - -bool8 sub_805791C(u8 var) -{ - if (var == MB_8E) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPictureBookShelf(u8 var) -{ - if (var == MB_PICTURE_BOOK_SHELF) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBookShelf(u8 var) -{ - if (var == MB_BOOKSHELF) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsPokeCenterBookShelf(u8 var) -{ - if (var == MB_POKEMON_CENTER_BOOKSHELF) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsVase(u8 var) -{ - if (var == MB_VASE) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsTrashCan(u8 var) -{ - if (var == MB_TRASH_CAN) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsShopShelf(u8 var) -{ - if (var == MB_SHOP_SHELF) - return TRUE; - else - return FALSE; -} - -bool8 MetatileBehavior_IsBlueprint(u8 var) -{ - if (var == MB_BLUEPRINT) - return TRUE; - else - return FALSE; -} diff --git a/src/field/money.c b/src/field/money.c deleted file mode 100644 index 3b7268dbc..000000000 --- a/src/field/money.c +++ /dev/null @@ -1,304 +0,0 @@ -#include "global.h" -#include "money.h" -#include "decompress.h" -#include "menu.h" -#include "sprite.h" -#include "string_util.h" -#include "graphics.h" - -#define SPRITE_TAG_MONEY (0x2722) - -extern u16 gSpecialVar_0x8005; - -static EWRAM_DATA u8 gUnknown_02038734 = 0; - -static const struct OamData gOamData_83CF558 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_83CF560[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83CF568[] = -{ - gSpriteAnim_83CF560, -}; - -const struct SpriteTemplate gSpriteTemplate_83CF56C = -{ - .tileTag = 10018, - .paletteTag = 10018, - .oam = &gOamData_83CF558, - .anims = gSpriteAnimTable_83CF568, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -const struct CompressedSpriteSheet gUnknown_083CF584[] = {gMenuMoneyGfx, 256, SPRITE_TAG_MONEY}; -const struct CompressedSpritePalette gUnknown_083CF58C[] = {gMenuMoneyPal, SPRITE_TAG_MONEY}; - -bool8 IsEnoughMoney(u32 budget, u32 cost) -{ - if (budget >= cost) - { - return TRUE; - } - - return FALSE; -} - -void AddMoney(u32 *arg0, u32 arg1) -{ - if (*arg0 > *arg0 + arg1) - { - *arg0 = 999999; - return; - } - - *arg0 = *arg0 + arg1; - if (*arg0 > 999999) - { - *arg0 = 999999; - } -} - -void RemoveMoney(u32 *arg0, u32 arg1) -{ - if (*arg0 < arg1) - { - *arg0 = 0; - } - else - { - *arg0 = *arg0 - arg1; - } -} - -void GetMoneyAmountText(u8 *buffer, u32 amount, u8 arg2) -{ - u8 width; - u8 i; - - if (amount > 999999) - width = 7; - else if (amount > 99999) - width = 6; - // A special sprite is used for 10000 in the decoration - // shop, so be sure to account for this. - else if (amount > 10000) - width = 5; - else if (amount > 999) - width = 4; - else if (amount > 99) - width = 3; - else if (amount > 9) - width = 2; - else - width = 1; - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x14; - buffer[2] = 0x06; - buffer += 3; - - for (i = 0; i < arg2 - width; i++) - { - buffer[0] = CHAR_SPACE; - buffer += 1; - } - - buffer[0] = CHAR_CURRENCY; - buffer += 1; - - buffer = ConvertIntToDecimalString(buffer, amount); - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x14; - buffer[2] = 0x00; - buffer[3] = EOS; -} - -void PrintMoneyAmount(u32 amount, u8 size, u8 x, u8 y) -{ - u8 buffer[16]; - u8 stringWidth; - - GetMoneyAmountText(buffer, amount, size); - stringWidth = sub_8072CA4(buffer); - - if (stringWidth >= (size + 1) * 8) - { - Menu_PrintText(buffer, x, y); - } - else - { - int xPlusOne = x + 1; - Menu_PrintTextPixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1); - } -} - -void sub_80B7AEC(u32 arg0, u8 left, u8 top) -{ - u8 buffer[32]; - u8 *ptr; - - ptr = &buffer[0]; - - ptr[0] = CHAR_CURRENCY; - ptr++; - - ptr = ConvertIntToDecimalString(ptr, arg0); - - MenuPrint_RightAligned(buffer, left, top); - -#ifdef ENGLISH - ptr[0] = 0xFC; - ptr[1] = 0x14; - ptr[2] = 0x00; - ptr[3] = 0xFF; -#endif -} - -__attribute__((naked)) -void Draw10000Sprite(u8 var1, u8 var2, int var3) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - mov r8, r0\n\ - adds r5, r1, 0\n\ - mov r9, r2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - mov r1, r9\n\ - lsls r1, 8\n\ - mov r9, r1\n\ - ldr r4, _080B7BD8 @ =gDecoration10000_Gfx\n\ - adds r0, r1, r4\n\ - lsls r6, r5, 4\n\ - subs r6, r5\n\ - lsls r1, r6, 6\n\ - mov r3, r8\n\ - adds r3, 0x1\n\ - lsls r3, 5\n\ - ldr r2, _080B7BDC @ =0x06008000\n\ - adds r3, r2\n\ - adds r1, r3\n\ - movs r2, 0x20\n\ - str r3, [sp]\n\ - bl CpuFastSet\n\ - adds r4, 0x80\n\ - add r9, r4\n\ - adds r0, r5, 0x1\n\ - lsls r4, r0, 4\n\ - subs r4, r0\n\ - lsls r1, r4, 6\n\ - ldr r3, [sp]\n\ - adds r1, r3\n\ - mov r0, r9\n\ - movs r2, 0x20\n\ - bl CpuFastSet\n\ - movs r3, 0\n\ - lsls r5, 5\n\ - mov r0, r8\n\ - adds r7, r5, r0\n\ - lsls r6, 1\n\ - adds r6, 0x1\n\ - add r6, r8\n\ - ldr r1, _080B7BE0 @ =0xfffff000\n\ - adds r5, r1, 0\n\ - ldr r0, _080B7BE4 @ =0x0600f800\n\ - mov r12, r0\n\ - ldr r1, _080B7BE8 @ =0x0600f840\n\ - mov r9, r1\n\ - lsls r4, 1\n\ - adds r4, 0x1\n\ - add r4, r8\n\ -_080B7BAA:\n\ - adds r1, r7, r3\n\ - lsls r1, 1\n\ - mov r0, r12\n\ - adds r2, r1, r0\n\ - adds r0, r3, r6\n\ - adds r0, r5\n\ - strh r0, [r2]\n\ - add r1, r9\n\ - adds r0, r3, r4\n\ - adds r0, r5\n\ - strh r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x3\n\ - bls _080B7BAA\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B7BD8: .4byte gDecoration10000_Gfx\n\ -_080B7BDC: .4byte 0x06008000\n\ -_080B7BE0: .4byte 0xfffff000\n\ -_080B7BE4: .4byte 0x0600f800\n\ -_080B7BE8: .4byte 0x0600f840\n\ - .syntax divided\n"); -} - -void UpdateMoneyWindow(u32 amount, u8 x, u8 y) -{ - PrintMoneyAmount(amount, 6, x + 6, y + 1); -} - -void OpenMoneyWindow(u32 amount, u8 x, u8 y) -{ - Menu_DrawStdWindowFrame(x, y, x + 13, y + 3); - UpdateMoneyWindow(amount, x, y); - - LoadCompressedObjectPic(gUnknown_083CF584); - LoadCompressedObjectPalette(gUnknown_083CF58C); - - gUnknown_02038734 = CreateSprite(&gSpriteTemplate_83CF56C, x * 8 + 19, y * 8 + 11, 0); -} - -void CloseMoneyWindow(u8 x, u8 y) -{ - DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]); - FreeSpritePaletteByTag(SPRITE_TAG_MONEY); - Menu_EraseWindowRect(x, y, x + 13, y + 3); -} - -bool8 HasEnoughMoneyFor(void) -{ - return IsEnoughMoney(gSaveBlock1.money, gSpecialVar_0x8005); -} - -void PayMoneyFor(void) -{ - RemoveMoney(&gSaveBlock1.money, gSpecialVar_0x8005); -} diff --git a/src/field/overworld.c b/src/field/overworld.c deleted file mode 100644 index 6376aa1af..000000000 --- a/src/field/overworld.c +++ /dev/null @@ -1,2750 +0,0 @@ -#include "global.h" -#include "overworld.h" -#include "battle_setup.h" -#include "berry.h" -#include "cable_club.h" -#include "clock.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_control_avatar.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "event_object_movement.h" -#include "field_message_box.h" -#include "field_player_avatar.h" -#include "field_screen_effect.h" -#include "field_special_scene.h" -#include "field_specials.h" -#include "field_tasks.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "fldeff_flash.h" -#include "heal_location.h" -#include "link.h" -#include "load_save.h" -#include "main.h" -#include "m4a.h" -#include "constants/maps.h" -#include "map_name_popup.h" -#include "menu.h" -#include "metatile_behavior.h" -#include "new_game.h" -#include "palette.h" -#include "play_time.h" -#include "random.h" -#include "roamer.h" -#include "rotating_gate.h" -#include "safari_zone.h" -#include "script.h" -#include "script_pokemon_80C4.h" -#include "secret_base.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "start_menu.h" -#include "task.h" -#include "tileset_anim.h" -#include "time_events.h" -#include "tv.h" -#include "scanline_effect.h" -#include "wild_encounter.h" - -#ifdef SAPPHIRE -#define LEGENDARY_MUSIC BGM_OOAME // Heavy Rain -#else -#define LEGENDARY_MUSIC BGM_HIDERI // Drought -#endif - -struct UnkTVStruct -{ - u32 tv_field_0; - u32 tv_field_4; -}; - -extern u8 gUnknown_020297ED; -extern u16 gUnknown_03004898; -extern u16 gUnknown_0300489C; - -extern u8 S_WhiteOut[]; -extern u8 gUnknown_0819FC9F[]; -extern u8 SingleBattleColosseum_EventScript_1A436F[]; -extern u8 SingleBattleColosseum_EventScript_1A4379[]; -extern u8 DoubleBattleColosseum_EventScript_1A4383[]; -extern u8 DoubleBattleColosseum_EventScript_1A439E[]; -extern u8 DoubleBattleColosseum_EventScript_1A43B9[]; -extern u8 DoubleBattleColosseum_EventScript_1A43D4[]; -extern u8 TradeCenter_EventScript_1A43F0[]; -extern u8 TradeCenter_EventScript_1A43FA[]; -extern u8 RecordCorner_EventScript_1A4418[]; -extern u8 RecordCorner_EventScript_1A442D[]; -extern u8 RecordCorner_EventScript_1A4442[]; -extern u8 RecordCorner_EventScript_1A4457[]; -extern u8 TradeRoom_ReadTrainerCard1[]; -extern u8 TradeRoom_ReadTrainerCard2[]; -extern u8 TradeRoom_TooBusyToNotice[]; -extern u8 TradeRoom_PromptToCancelLink[]; -extern u8 TradeRoom_TerminateLink[]; -extern u8 gUnknown_081A4508[]; - -extern struct MapData * const gMapAttributes[]; -extern struct MapHeader * const * const gMapGroups[]; -extern s32 gMaxFlashLevel; - -EWRAM_DATA struct WarpData gUnknown_020297F0 = {0}; -EWRAM_DATA struct WarpData gWarpDestination = {0}; // new warp position -EWRAM_DATA struct WarpData gUnknown_02029800 = {0}; -EWRAM_DATA struct WarpData gUnknown_02029808 = {0}; -EWRAM_DATA struct UnkPlayerStruct gUnknown_02029810 = {0}; -EWRAM_DATA static u16 sAmbientCrySpecies = 0; -EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; -EWRAM_DATA struct LinkPlayerMapObject gLinkPlayerMapObjects[4] = {0}; - -static u8 gUnknown_03000580[4]; -static u16 (*gUnknown_03000584)(u32); -static u8 gUnknown_03000588; - -u16 word_3004858; -void (*gFieldCallback)(void); -u8 gUnknown_03004860; -u8 gFieldLinkPlayerCount; - -static const struct WarpData sDummyWarpData = -{ - .mapGroup = -1, - .mapNum = -1, - .warpId = -1, - .x = -1, - .y = -1, -}; - -static const u8 sUnusedData[] = -{ - 0xB0, 0x04, 0x00, 0x00, - 0x10, 0x0E, 0x00, 0x00, - 0xB0, 0x04, 0x00, 0x00, - 0x60, 0x09, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, - 0xD4, 0xFF, 0xFF, 0xFF, - 0x2C, 0x00, 0x00, 0x00, -}; - -const struct UCoords32 gUnknown_0821664C[] = -{ - { 0, 0}, - { 0, 1}, - { 0, -1}, - {-1, 0}, - { 1, 0}, - {-1, 1}, - { 1, 1}, - {-1, -1}, - { 1, -1}, -}; - -const struct ScanlineEffectParams gUnknown_08216694 = -{ - (void *)REG_ADDR_WIN0H, - ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, - 1, - 0, -}; - -static u8 sub_8055C68(struct LinkPlayerMapObject *, struct MapObject *, u8); -static u8 sub_8055C88(struct LinkPlayerMapObject *, struct MapObject *, u8); -static u8 sub_8055C8C(struct LinkPlayerMapObject *, struct MapObject *, u8); - -static u8 (*const gUnknown_082166A0[])(struct LinkPlayerMapObject *, struct MapObject *, u8) = -{ - sub_8055C68, - sub_8055C88, - sub_8055C8C, -}; - -static u8 sub_8055CAC(struct LinkPlayerMapObject *, struct MapObject *, u8); -static u8 sub_8055CB0(struct LinkPlayerMapObject *, struct MapObject *, u8); -static u8 sub_8055D18(struct LinkPlayerMapObject *, struct MapObject *, u8); - -static u8 (*const gUnknown_082166AC[])(struct LinkPlayerMapObject *, struct MapObject *, u8) = -{ - sub_8055CAC, - sub_8055CB0, - sub_8055CB0, - sub_8055CB0, - sub_8055CB0, - sub_8055CAC, - sub_8055CAC, - sub_8055D18, - sub_8055D18, - sub_8055D18, - sub_8055D18, -}; - -static void sub_8055D30(struct LinkPlayerMapObject *, struct MapObject *); -static void sub_8055D38(struct LinkPlayerMapObject *, struct MapObject *); - -static void (*const gUnknown_082166D8[])(struct LinkPlayerMapObject *, struct MapObject *) = -{ - sub_8055D30, - sub_8055D38, -}; - - -static void DoWhiteOut(void) -{ - ScriptContext2_RunNewScript(S_WhiteOut); - gSaveBlock1.money /= 2; - ScrSpecial_HealPlayerParty(); - Overworld_ResetStateAfterWhiteOut(); - Overworld_SetWarpDestToLastHealLoc(); - warp_in(); -} - -void Overworld_ResetStateAfterFly(void) -{ - player_avatar_init_params_reset(); - FlagClear(FLAG_SYS_CYCLING_ROAD); - FlagClear(FLAG_SYS_CRUISE_MODE); - FlagClear(FLAG_SYS_SAFARI_MODE); - FlagClear(FLAG_SYS_USE_STRENGTH); - FlagClear(FLAG_SYS_USE_FLASH); -} - -void Overworld_ResetStateAfterTeleport(void) -{ - player_avatar_init_params_reset(); - FlagClear(FLAG_SYS_CYCLING_ROAD); - FlagClear(FLAG_SYS_CRUISE_MODE); - FlagClear(FLAG_SYS_SAFARI_MODE); - FlagClear(FLAG_SYS_USE_STRENGTH); - FlagClear(FLAG_SYS_USE_FLASH); - ScriptContext2_RunNewScript(gUnknown_0819FC9F); -} - -void Overworld_ResetStateAfterDigEscRope(void) -{ - player_avatar_init_params_reset(); - FlagClear(FLAG_SYS_CYCLING_ROAD); - FlagClear(FLAG_SYS_CRUISE_MODE); - FlagClear(FLAG_SYS_SAFARI_MODE); - FlagClear(FLAG_SYS_USE_STRENGTH); - FlagClear(FLAG_SYS_USE_FLASH); -} - -void Overworld_ResetStateAfterWhiteOut(void) -{ - player_avatar_init_params_reset(); - FlagClear(FLAG_SYS_CYCLING_ROAD); - FlagClear(FLAG_SYS_CRUISE_MODE); - FlagClear(FLAG_SYS_SAFARI_MODE); - FlagClear(FLAG_SYS_USE_STRENGTH); - FlagClear(FLAG_SYS_USE_FLASH); -} - -void sub_805308C(void) -{ - FlagClear(FLAG_SYS_SAFARI_MODE); - ChooseAmbientCrySpecies(); - ResetCyclingRoadChallengeData(); - UpdateLocationHistoryForRoamer(); - RoamerMoveToOtherLocationSet(); -} - -void ResetGameStats(void) -{ - s32 i; - - for (i = 0; i < NUM_GAME_STATS; i++) - gSaveBlock1.gameStats[i] = 0; -} - -void IncrementGameStat(u8 index) -{ - if (index < NUM_GAME_STATS) - { - if (gSaveBlock1.gameStats[index] < 0xFFFFFF) - gSaveBlock1.gameStats[index]++; - else - gSaveBlock1.gameStats[index] = 0xFFFFFF; - } -} - -u32 GetGameStat(u8 index) -{ - if (index >= NUM_GAME_STATS) - return 0; - - return gSaveBlock1.gameStats[index]; -} - -void SetGameStat(u8 index, u32 value) -{ - if (index < NUM_GAME_STATS) - gSaveBlock1.gameStats[index] = value; -} - -void LoadMapObjTemplatesFromHeader(void) -{ - // Clear map object templates - CpuFill32(0, gSaveBlock1.mapObjectTemplates, sizeof(gSaveBlock1.mapObjectTemplates)); - - // Copy map header events to save block - CpuCopy32(gMapHeader.events->mapObjects, - gSaveBlock1.mapObjectTemplates, - gMapHeader.events->mapObjectCount * sizeof(struct MapObjectTemplate)); -} - -static void LoadSaveblockMapObjScripts(void) -{ - struct MapObjectTemplate *mapObjectTemplates = gSaveBlock1.mapObjectTemplates; - s32 i; - - for (i = 0; i < 64; i++) - mapObjectTemplates[i].script = gMapHeader.events->mapObjects[i].script; -} - -void Overworld_SetMapObjTemplateCoords(u8 localId, s16 x, s16 y) -{ - s32 i; - for (i = 0; i < 64; i++) - { - struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; - if (mapObjectTemplate->localId == localId) - { - mapObjectTemplate->x = x; - mapObjectTemplate->y = y; - return; - } - } -} - -void Overworld_SetMapObjTemplateMovementType(u8 localId, u8 movementType) -{ - s32 i; - - for (i = 0; i < 64; i++) - { - struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; - if (mapObjectTemplate->localId == localId) - { - mapObjectTemplate->movementType = movementType; - return; - } - } -} - -static void mapdata_load_assets_to_gpu_and_full_redraw(void) -{ - move_tilemap_camera_to_upper_left_corner(); - copy_map_tileset1_tileset2_to_vram(gMapHeader.mapData); - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); - DrawWholeMapView(); - cur_mapheader_run_tileset_funcs_after_some_cpuset(); -} - -static struct MapData *get_mapdata_header(void) -{ - u16 mapDataId = gSaveBlock1.mapDataId; - if (mapDataId) - return gMapAttributes[mapDataId - 1]; - return NULL; -} - -static void ApplyCurrentWarp(void) -{ - gUnknown_020297F0 = gSaveBlock1.location; - gSaveBlock1.location = gWarpDestination; - gUnknown_02029800 = sDummyWarpData; - gUnknown_02029808 = sDummyWarpData; -} - -static void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - warp->mapGroup = mapGroup; - warp->mapNum = mapNum; - warp->warpId = warpId; - warp->x = x; - warp->y = y; -} - -static bool32 warp_data_is_not_neg_1(struct WarpData *warp) -{ - if (warp->mapGroup != -1) - return FALSE; - if (warp->mapNum != -1) - return FALSE; - if (warp->warpId != -1) - return FALSE; - if (warp->x != -1) - return FALSE; - if (warp->y != -1) - return FALSE; - return TRUE; -} - -struct MapHeader *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum) -{ - return gMapGroups[mapGroup][mapNum]; -} - -struct MapHeader *const warp1_get_mapheader(void) -{ - return Overworld_GetMapHeaderByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); -} - -static void set_current_map_header_from_sav1_save_old_name(void) -{ - gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); - gSaveBlock1.mapDataId = gMapHeader.mapDataId; - gMapHeader.mapData = get_mapdata_header(); -} - -static void LoadSaveblockMapHeader(void) -{ - gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); - gMapHeader.mapData = get_mapdata_header(); -} - -void sub_80533CC(void) -{ - if (gSaveBlock1.location.warpId >= 0 && gSaveBlock1.location.warpId < gMapHeader.events->warpCount) - { - gSaveBlock1.pos.x = gMapHeader.events->warps[gSaveBlock1.location.warpId].x; - gSaveBlock1.pos.y = gMapHeader.events->warps[gSaveBlock1.location.warpId].y; - } - else if (gSaveBlock1.location.x >= 0 && gSaveBlock1.location.y >= 0) - { - gSaveBlock1.pos.x = gSaveBlock1.location.x; - gSaveBlock1.pos.y = gSaveBlock1.location.y; - } - else - { - gSaveBlock1.pos.x = gMapHeader.mapData->width / 2; - gSaveBlock1.pos.y = gMapHeader.mapData->height / 2; - } -} - -void warp_in(void) -{ - ApplyCurrentWarp(); - set_current_map_header_from_sav1_save_old_name(); - sub_80533CC(); -} - -void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - SetWarpData(&gWarpDestination, mapGroup, mapNum, warpId, x, y); -} - -void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId) -{ - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, -1, -1); -} - -void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId) -{ - SetWarpData(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); -} - -void saved_warp2_set_2(int unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - SetWarpData(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); -} - -void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused) -{ - gWarpDestination = gSaveBlock1.warp2; -} - -void sub_8053538(u8 a1) -{ - const struct HealLocation *warp = GetHealLocation(a1); - - if (warp) - Overworld_SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y); -} - -void Overworld_SetWarpDestToLastHealLoc(void) -{ - gWarpDestination = gSaveBlock1.lastHealLocation; -} - -void Overworld_SetHealLocationWarp(u8 healLocationId) -{ - const struct HealLocation *healLocation = GetHealLocation(healLocationId); - - if (healLocation != NULL) - SetWarpData(&gSaveBlock1.lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y); -} - -void sub_80535C4(s16 a1, s16 a2) -{ - u8 currMapType = Overworld_GetMapTypeOfSaveblockLocation(); - u8 destMapType = GetMapTypeByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); - if (is_map_type_1_2_3_5_or_6(currMapType) && is_map_type_1_2_3_5_or_6(destMapType) != TRUE) - sub_805363C(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, a1 - 7, a2 - 6); -} - -void sub_805363C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - SetWarpData(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); -} - -void sub_8053678(void) -{ - gWarpDestination = gSaveBlock1.warp4; -} - -void sub_8053690(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - SetWarpData(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); -} - -static void warp1_set_to_warp2(void) -{ - gWarpDestination = gUnknown_02029800; -} - -void sub_80536E4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - SetWarpData(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); -} - -void sub_8053720(s16 x, s16 y) -{ - if (warp_data_is_not_neg_1(&gUnknown_02029808) == TRUE) - { - gWarpDestination = gUnknown_020297F0; - } - else - { - Overworld_SetWarpDestination(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); - } -} - -void sub_8053778(void) -{ - gWarpDestination = gSaveBlock1.warp1; -} - -void unref_sub_8053790(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) -{ - SetWarpData(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); -} - -void sub_80537CC(u8 a1) -{ - const struct HealLocation *warp = GetHealLocation(a1); - if (warp) - SetWarpData(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y); -} - -void gpu_sync_bg_hide() -{ - gSaveBlock1.warp1 = gSaveBlock1.warp2; -} - -struct MapConnection *GetMapConnection(u8 dir) -{ - s32 i; - s32 count = gMapHeader.connections->count; - struct MapConnection *connection = gMapHeader.connections->connections; - - if (connection == NULL) - return NULL; - - for(i = 0; i < count; i++, connection++) - if (connection->direction == dir) - return connection; - - return NULL; -} - -bool8 sub_8053850(u8 dir, u16 x, u16 y) -{ - struct MapConnection *connection = GetMapConnection(dir); - - if (connection != NULL) - { - Overworld_SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y); - } - else - { - mapheader_run_script_with_tag_x6(); - if (warp_data_is_not_neg_1(&gUnknown_02029800)) - return FALSE; - warp1_set_to_warp2(); - } - return TRUE; -} - -bool8 sub_80538B0(u16 x, u16 y) -{ - return sub_8053850(CONNECTION_EMERGE, x, y); -} - -bool8 sub_80538D0(u16 x, u16 y) -{ - return sub_8053850(CONNECTION_DIVE, x, y); -} - -void sub_80538F0(u8 mapGroup, u8 mapNum) -{ - s32 paletteIndex; - - Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1); - sub_8053F0C(); - ApplyCurrentWarp(); - set_current_map_header_from_sav1_save_old_name(); - LoadMapObjTemplatesFromHeader(); - ClearTempFieldEventData(); - ResetCyclingRoadChallengeData(); - prev_quest_postbuffer_cursor_backup_reset(); - TryUpdateRandomTrainerRematches(mapGroup, mapNum); - DoTimeBasedEvents(); - SetSav1WeatherFromCurrMapHeader(); - ChooseAmbientCrySpecies(); - SetDefaultFlashLevel(); - Overworld_ClearSavedMusic(); - mapheader_run_script_with_tag_x3(); - not_trainer_hill_battle_pyramid(); - sub_8056D38(gMapHeader.mapData); - apply_map_tileset2_palette(gMapHeader.mapData); - - for (paletteIndex = 6; paletteIndex < 12; paletteIndex++) - ApplyWeatherGammaShiftToPal(paletteIndex); - - sub_8072ED0(); - UpdateLocationHistoryForRoamer(); - RoamerMove(); - DoCurrentWeather(); - ResetFieldTasksArgs(); - mapheader_run_script_with_tag_x5(); - ShowMapNamePopup(); -} - -void sub_8053994(u32 a1) -{ - bool8 v2; - bool8 v3; - - set_current_map_header_from_sav1_save_old_name(); - LoadMapObjTemplatesFromHeader(); - v2 = is_map_type_1_2_3_5_or_6(gMapHeader.mapType); - v3 = Overworld_MapTypeIsIndoors(gMapHeader.mapType); - ClearTempFieldEventData(); - ResetCyclingRoadChallengeData(); - prev_quest_postbuffer_cursor_backup_reset(); - TryUpdateRandomTrainerRematches(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); - if (a1 != 1) - DoTimeBasedEvents(); - SetSav1WeatherFromCurrMapHeader(); - ChooseAmbientCrySpecies(); - if (v2) - FlagClear(FLAG_SYS_USE_FLASH); - SetDefaultFlashLevel(); - Overworld_ClearSavedMusic(); - mapheader_run_script_with_tag_x3(); - UpdateLocationHistoryForRoamer(); - RoamerMoveToOtherLocationSet(); - not_trainer_hill_battle_pyramid(); - if (a1 != 1 && v3) - { - UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); - sub_80BBCCC(1); - } -} - -void player_avatar_init_params_reset(void) -{ - gUnknown_02029810.player_field_1 = 1; - gUnknown_02029810.player_field_0 = 1; -} - -void walkrun_find_lowest_active_bit_in_bitfield(void) -{ - gUnknown_02029810.player_field_1 = player_get_direction_lower_nybble(); - - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) - gUnknown_02029810.player_field_0 = 2; - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) - gUnknown_02029810.player_field_0 = 4; - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - gUnknown_02029810.player_field_0 = 8; - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) - gUnknown_02029810.player_field_0 = 16; - else - gUnknown_02029810.player_field_0 = 1; -} - -struct UnkPlayerStruct *sub_8053AA8(void) -{ - struct UnkPlayerStruct playerStruct; - u8 mapType = Overworld_GetMapTypeOfSaveblockLocation(); - u16 v2 = cur_mapdata_block_role_at_screen_center_acc_to_sav1(); - u8 v4 = sub_8053B00(&gUnknown_02029810, v2, mapType); - playerStruct.player_field_0 = v4; - playerStruct.player_field_1 = sub_8053B60(&gUnknown_02029810, v4, v2, mapType); - gUnknown_02029810 = playerStruct; - return &gUnknown_02029810; -} - -u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3) -{ - if (a3 != 8 && FlagGet(FLAG_SYS_CRUISE_MODE)) - return 1; - if (a3 == 5) - return 16; - if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1) - return 8; - if (Overworld_IsBikingAllowed() != TRUE) - return 1; - if (playerStruct->player_field_0 == 2) - return 2; - if (playerStruct->player_field_0 != 4) - return 1; - return 4; -} - -u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4) -{ - if (FlagGet(FLAG_SYS_CRUISE_MODE) && a4 == 6) - return 4; - if (MetatileBehavior_IsDeepSouthWarp(a3) == TRUE) - return 2; - if (MetatileBehavior_IsNonAnimDoor(a3) == TRUE || MetatileBehavior_IsDoor(a3) == TRUE) - return 1; - if (MetatileBehavior_IsSouthArrowWarp(a3) == TRUE) - return 2; - if (MetatileBehavior_IsNorthArrowWarp(a3) == TRUE) - return 1; - if (MetatileBehavior_IsWestArrowWarp(a3) == TRUE) - return 4; - if (MetatileBehavior_IsEastArrowWarp(a3) == TRUE) - return 3; - if ((playerStruct->player_field_0 == 16 && a2 == 8) - || (playerStruct->player_field_0 == 8 && a2 == 16)) - return playerStruct->player_field_1; - if (MetatileBehavior_IsLadder(a3) == TRUE) - return playerStruct->player_field_1; - return 1; -} - -u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void) -{ - return MapGridGetMetatileBehaviorAt(gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7); -} - -bool32 Overworld_IsBikingAllowed(void) -{ - // is player in cycling road entrance? - if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE) - && (gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE) - || gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE))) - return TRUE; - - // is player indoor, in a secret base, or underwater? - if (gMapHeader.mapType == MAP_TYPE_INDOOR) - return FALSE; - if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE) - return FALSE; - if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) - return FALSE; - - // Thou shalt not bike on the sacred resting grounds of Kyogre/Groudon. - if (gSaveBlock1.location.mapGroup == MAP_GROUP(SEAFLOOR_CAVERN_ROOM9) - && gSaveBlock1.location.mapNum == MAP_NUM(SEAFLOOR_CAVERN_ROOM9)) - return FALSE; - if (gSaveBlock1.location.mapGroup == MAP_GROUP(CAVE_OF_ORIGIN_B4F) - && gSaveBlock1.location.mapNum == MAP_NUM(CAVE_OF_ORIGIN_B4F)) - return FALSE; - - return TRUE; -} - -void SetDefaultFlashLevel(void) -{ - if (!gMapHeader.cave) - gSaveBlock1.flashLevel = 0; - else if (FlagGet(FLAG_SYS_USE_FLASH)) - gSaveBlock1.flashLevel = 1; - else - gSaveBlock1.flashLevel = gMaxFlashLevel; -} - -void Overworld_SetFlashLevel(s32 flashLevel) -{ - if (flashLevel < 0 || flashLevel > gMaxFlashLevel) - flashLevel = 0; - gSaveBlock1.flashLevel = flashLevel; -} - -u8 Overworld_GetFlashLevel(void) -{ - return gSaveBlock1.flashLevel; -} - -void sub_8053D14(u16 mapDataId) -{ - gSaveBlock1.mapDataId = mapDataId; - gMapHeader.mapData = get_mapdata_header(); -} - -static bool16 ShouldLegendaryMusicPlayAtLocation(struct WarpData *warp) -{ - if (!FlagGet(FLAG_SYS_WEATHER_CTRL)) - return FALSE; - if (warp->mapGroup == 0) - { - switch (warp->mapNum) - { - case MAP_NUM(LILYCOVE_CITY): - case MAP_NUM(MOSSDEEP_CITY): - case MAP_NUM(SOOTOPOLIS_CITY): - case MAP_NUM(EVER_GRANDE_CITY): - return TRUE; - case MAP_NUM(ROUTE124): - case MAP_NUM(ROUTE125): - case MAP_NUM(ROUTE126): - case MAP_NUM(ROUTE127): - case MAP_NUM(ROUTE128): - return TRUE; - } - } - return FALSE; -} - -static bool16 IsInfiltratedWeatherInstitute(struct WarpData *warp) -{ - if (VarGet(VAR_WEATHER_INSTITUTE_STATE)) - return FALSE; - if (warp->mapGroup != MAP_GROUP(ROUTE119_WEATHER_INSTITUTE_1F)) - return FALSE; - if (warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_1F) - || warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_2F)) - return TRUE; - return FALSE; -} - -static u16 GetLocationMusic(struct WarpData *warp) -{ - if (ShouldLegendaryMusicPlayAtLocation(warp) == TRUE) - return LEGENDARY_MUSIC; - else if (IsInfiltratedWeatherInstitute(warp) == TRUE) - return BGM_TOZAN; - else - return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music; -} - -u16 GetCurrLocationDefaultMusic(void) -{ - u16 music; - - // Play the desert music only when the sandstorm is active on Route 111. - if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE111) - && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE111) - && GetSav1Weather() == 8) - return BGM_ASHROAD; - - music = GetLocationMusic(&gSaveBlock1.location); - if (music != 0x7FFF) - { - return music; - } - else - { - if (gSaveBlock1.pos.x < 24) - return BGM_DOORO_X1; - else - return BGM_GRANROAD; - } -} - -u16 GetWarpDestinationMusic(void) -{ - u16 music = GetLocationMusic(&gWarpDestination); - if (music != 0x7FFF) - { - return music; - } - else - { - if (gSaveBlock1.location.mapGroup == MAP_GROUP(MAUVILLE_CITY) - && gSaveBlock1.location.mapNum == MAP_NUM(MAUVILLE_CITY)) - return BGM_DOORO_X1; - else - return BGM_GRANROAD; - } -} - -void Overworld_ResetMapMusic(void) -{ - ResetMapMusic(); -} - -void Overworld_PlaySpecialMapMusic(void) -{ - u16 music = GetCurrLocationDefaultMusic(); - - if (music != LEGENDARY_MUSIC) - { - if (gSaveBlock1.savedMusic) - music = gSaveBlock1.savedMusic; - else if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER) - music = BGM_DEEPDEEP; - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - music = BGM_NAMINORI; - } - - if (music != GetCurrentMapMusic()) - PlayNewMapMusic(music); -} - -void Overworld_SetSavedMusic(u16 songNum) -{ - gSaveBlock1.savedMusic = songNum; -} - -void Overworld_ClearSavedMusic(void) -{ - gSaveBlock1.savedMusic = 0; -} - -void sub_8053F0C(void) -{ - if (FlagGet(FLAG_SPECIAL_FLAG_1) != TRUE) - { - u16 newMusic = GetWarpDestinationMusic(); - u16 currentMusic = GetCurrentMapMusic(); - if (newMusic != LEGENDARY_MUSIC) - { - if (currentMusic == BGM_DEEPDEEP || currentMusic == BGM_NAMINORI) - return; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - newMusic = BGM_NAMINORI; - } - if (newMusic != currentMusic) - { - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - FadeOutAndFadeInNewMapMusic(newMusic, 4, 4); - else - FadeOutAndPlayNewMapMusic(newMusic, 8); - } - } -} - -void Overworld_ChangeMusicToDefault(void) -{ - u16 currentMusic = GetCurrentMapMusic(); - if (currentMusic != GetCurrLocationDefaultMusic()) - FadeOutAndPlayNewMapMusic(GetCurrLocationDefaultMusic(), 8); -} - -void Overworld_ChangeMusicTo(u16 newMusic) -{ - u16 currentMusic = GetCurrentMapMusic(); - if (currentMusic != newMusic && currentMusic != LEGENDARY_MUSIC) - FadeOutAndPlayNewMapMusic(newMusic, 8); -} - -u8 GetMapMusicFadeoutSpeed(void) -{ - struct MapHeader *mapHeader = warp1_get_mapheader(); - if (Overworld_MapTypeIsIndoors(mapHeader->mapType) == TRUE) - return 2; - else - return 4; -} - -void sub_8053FF8(void) -{ - u16 music = GetWarpDestinationMusic(); - if (FlagGet(FLAG_SPECIAL_FLAG_1) != TRUE && music != GetCurrentMapMusic()) - { - u8 speed = GetMapMusicFadeoutSpeed(); - FadeOutMapMusic(speed); - } -} - -bool8 sub_8054034(void) -{ - return IsNotWaitingForBGMStop(); -} - -void Overworld_FadeOutMapMusic(void) -{ - FadeOutMapMusic(4); -} - -static void PlayAmbientCry(void) -{ - s16 x, y; - s8 pan; - s8 volume; - - PlayerGetDestCoords(&x, &y); - if (sIsAmbientCryWaterMon == TRUE - && !MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) - return; - pan = (Random() % 88) + 212; - volume = (Random() % 30) + 50; - PlayCry2(sAmbientCrySpecies, pan, volume, 1); -} - -void UpdateAmbientCry(s16 *state, u16 *delayCounter) -{ - switch (*state) - { - case 0: - if (sAmbientCrySpecies == SPECIES_NONE) - *state = 4; - else - *state = 1; - break; - case 1: - *delayCounter = (Random() % 2400) + 1200; - *state = 3; - break; - case 2: - *delayCounter = (Random() % 1200) + 1200; - *state = 3; - break; - case 3: - (*delayCounter)--; - if (*delayCounter == 0) - { - PlayAmbientCry(); - *state = 2; - } - break; - case 4: - break; - } -} - -void ChooseAmbientCrySpecies(void) -{ - if ((gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE130) - && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE130)) - && !IsMirageIslandPresent()) - { - // Only play water pokemon cries on this route - // when Mirage Island is not present - sIsAmbientCryWaterMon = TRUE; - sAmbientCrySpecies = GetLocalWaterMon(); - } - else - { - sAmbientCrySpecies = GetLocalWildMon(&sIsAmbientCryWaterMon); - } -} - -u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum) -{ - return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->mapType; -} - -u8 GetMapTypeByWarpData(struct WarpData *warp) -{ - return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum); -} - -u8 Overworld_GetMapTypeOfSaveblockLocation(void) -{ - return GetMapTypeByWarpData(&gSaveBlock1.location); -} - -u8 get_map_type_from_warp0(void) -{ - return GetMapTypeByWarpData(&gUnknown_020297F0); -} - -bool8 is_map_type_1_2_3_5_or_6(u8 mapType) -{ - if (mapType == MAP_TYPE_ROUTE - || mapType == MAP_TYPE_TOWN - || mapType == MAP_TYPE_UNDERWATER - || mapType == MAP_TYPE_CITY - || mapType == MAP_TYPE_6) - return TRUE; - else - return FALSE; -} - -bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType) -{ - if (mapType == MAP_TYPE_ROUTE - || mapType == MAP_TYPE_TOWN - || mapType == MAP_TYPE_6 - || mapType == MAP_TYPE_CITY) - return TRUE; - else - return FALSE; -} - -bool8 Overworld_MapTypeIsIndoors(u8 mapType) -{ - if (mapType == MAP_TYPE_INDOOR - || mapType == MAP_TYPE_SECRET_BASE) - return TRUE; - else - return FALSE; -} - -u8 unref_sub_8054260(void) -{ - return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum)->regionMapSectionId; -} - -u8 sav1_map_get_name(void) -{ - return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->regionMapSectionId; -} - -u8 sav1_map_get_battletype(void) -{ - return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType; -} - -#if DEBUG - -void debug_sub_8076B68(void); - -void debug_sub_80589D8(void); - -void debug_sub_8058A50(void); - -void CB2_InitTestMenu(void) -{ - m4aSoundVSyncOff(); - SetVBlankCallback(NULL); - DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - ScanlineEffect_Stop(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - debug_sub_8076B68(); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - REG_IE |= 1; - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; - m4aSoundVSyncOn(); - SetVBlankCallback(debug_sub_8058A50); - m4aSongNumStart(0x19D); - SetMainCallback2(debug_sub_80589D8); -} - -void debug_sub_80589D8(void) -{ - if (UpdatePaletteFade()) - return; - - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); -} - -void debug_sub_80589F4(void) -{ - if (UpdatePaletteFade()) - return; - - SetVBlankCallback(NULL); - - DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); - - SetMainCallback2(gMain.savedCallback); -} - -void debug_sub_8058A50(void) -{ - ProcessSpriteCopyRequests(); - LoadOam(); - TransferPlttBuffer(); -} - -#endif - -void ResetSafariZoneFlag_(void) -{ - ResetSafariZoneFlag(); -} - -bool32 is_c1_link_related_active(void) -{ - if (gMain.callback1 == sub_8055354) - return TRUE; - else - return FALSE; -} - -void c1_overworld_normal(u16 newKeys, u16 heldKeys) -{ - struct FieldInput inputStruct; - - sub_8059204(); - FieldClearPlayerInput(&inputStruct); - FieldGetPlayerInput(&inputStruct, newKeys, heldKeys); - if (!ScriptContext2_IsEnabled()) - { - if (sub_8068024(&inputStruct) == 1) - { - ScriptContext2_Enable(); - HideMapNamePopup(); - } - else - { - player_step(inputStruct.dpadDirection, newKeys, heldKeys); - } - } -} - -void c1_overworld(void) -{ - if (gMain.callback2 == c2_overworld) - c1_overworld_normal(gMain.newKeys, gMain.heldKeys); -} - -void OverworldBasic(void) -{ - ScriptContext2_RunScript(); - RunTasks(); - AnimateSprites(); - CameraUpdate(); - UpdateCameraPanning(); - BuildOamBuffer(); - UpdatePaletteFade(); - sub_8072EDC(); -} - -// This CB2 is used when starting -void CB2_OverworldBasic(void) -{ - OverworldBasic(); -} - -void c2_overworld(void) -{ - int fading = (gPaletteFade.active != 0); - if (fading) - SetVBlankCallback(NULL); - OverworldBasic(); - if (fading) - SetFieldVBlankCallback(); -} - -void set_callback1(MainCallback cb) -{ - gMain.callback1 = cb; -} - -void sub_80543DC(u16 (*a1)(u32)) -{ - gUnknown_03000584 = a1; -} - -void sub_80543E8(void) -{ - if (gFieldCallback != NULL) - gFieldCallback(); - else - mapldr_default(); - gFieldCallback = NULL; -} - -void CB2_NewGame(void) -{ - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); - ResetSafariZoneFlag_(); - NewGameInitData(); - player_avatar_init_params_reset(); - PlayTimeCounter_Start(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - gFieldCallback = ExecuteTruckSequence; - do_load_map_stuff_loop(&gMain.state); - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); -} - -#if DEBUG - -extern void (*gFieldCallback)(void); - -void debug_sub_8058C00(void) -{ - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); - ResetSafariZoneFlag_(); - player_avatar_init_params_reset(); - PlayTimeCounter_Start(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - - if (gMain.heldKeys & R_BUTTON) - gFieldCallback = ExecuteTruckSequence; - else - gFieldCallback = sub_8080B60; - - do_load_map_stuff_loop(&gMain.state); - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); -} - -#endif - -void CB2_WhiteOut(void) -{ - u8 val; - gMain.state++; - if (gMain.state >= 120) - { - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); - ResetSafariZoneFlag_(); - DoWhiteOut(); - player_avatar_init_params_reset(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - gFieldCallback = sub_8080B60; - val = 0; - do_load_map_stuff_loop(&val); - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); - } -} - -void CB2_LoadMap(void) -{ - FieldClearVBlankHBlankCallbacks(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - set_callback1(NULL); - SetMainCallback2(sub_810CC80); - gMain.savedCallback = CB2_LoadMap2; -} - -void CB2_LoadMap2(void) -{ - do_load_map_stuff_loop(&gMain.state); - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); -} - -void sub_8054534(void) -{ - if (!gMain.state) - { - FieldClearVBlankHBlankCallbacks(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - set_callback1(NULL); - } - if (sub_805493C(&gMain.state, 1)) - { - SetFieldVBlankCallback(); - set_callback1(c1_overworld); - SetMainCallback2(c2_overworld); - } -} - -void sub_8054588(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = sub_8080AC4; - SetMainCallback2(c2_80567AC); -} - -void c2_80567AC(void) -{ - if (sub_805483C(&gMain.state)) - { - SetFieldVBlankCallback(); - set_callback1(sub_8055354); - sub_80543DC(sub_8055390); - SetMainCallback2(c2_overworld); - } -} - -void c2_exit_to_overworld_2_switch(void) -{ - if (is_c1_link_related_active() == TRUE) - { - SetMainCallback2(c2_exit_to_overworld_2_link); - } - else - { - FieldClearVBlankHBlankCallbacks(); - SetMainCallback2(c2_exit_to_overworld_2_local); - } -} - -void c2_exit_to_overworld_2_local(void) -{ - if (sub_8054A4C(&gMain.state)) - { - SetFieldVBlankCallback(); - SetMainCallback2(c2_overworld); - } -} - -void c2_exit_to_overworld_2_link(void) -{ - if (!sub_8055870() && sub_8054A9C(&gMain.state)) - SetMainCallback2(c2_overworld); -} - -void sub_805465C(void) -{ - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); - sub_8054F70(); - set_callback1(sub_8055354); - sub_80543DC(sub_8055390); - gFieldCallback = sub_8080A3C; - ScriptContext1_Init(); - ScriptContext2_Disable(); - c2_exit_to_overworld_2_switch(); -} - -void sub_805469C(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = atk17_seteffectsecondary; - c2_exit_to_overworld_2_switch(); -} - -void sub_80546B8(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = sub_80809B0; - c2_exit_to_overworld_2_switch(); -} - -void c2_exit_to_overworld_1_continue_scripts_restart_music(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = sub_8080990; - c2_exit_to_overworld_2_switch(); -} - -void sub_80546F0(void) -{ - FieldClearVBlankHBlankCallbacks(); - gFieldCallback = sub_8080B60; - c2_exit_to_overworld_2_switch(); -} - -void sub_805470C(void) -{ - if (gMapHeader.flags == 1 && sub_80BBB24() == 1) - ShowMapNamePopup(); - sub_8080B60(); -} - -void CB2_ContinueSavedGame(void) -{ - FieldClearVBlankHBlankCallbacks(); - StopMapMusic(); -#if DEBUG - if (gMain.heldKeys & R_BUTTON) - gUnknown_020297ED = TRUE; -#endif - ResetSafariZoneFlag_(); - LoadSaveblockMapHeader(); - LoadSaveblockMapObjScripts(); - UnfreezeMapObjects(); - DoTimeBasedEvents(); - sub_805308C(); - sub_8055FC0(); - PlayTimeCounter_Start(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - if (GetSecretBase2Field_9() == 1) - { - ClearSecretBase2Field_9(); - sub_8053778(); - warp_in(); - SetMainCallback2(CB2_LoadMap); - } - else - { - gFieldCallback = sub_805470C; - set_callback1(c1_overworld); - c2_exit_to_overworld_2_switch(); - } -} - -void FieldClearVBlankHBlankCallbacks(void) -{ - u16 savedIme = REG_IME; - REG_IME = 0; - REG_IE &= ~INTR_FLAG_HBLANK; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); -} - -void SetFieldVBlankCallback(void) -{ - SetVBlankCallback(VBlankCB_Field); -} - -void VBlankCB_Field(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - ScanlineEffect_InitHBlankDmaTransfer(); - sub_8057A58(); - TransferPlttBuffer(); - sub_8072E74(); -} - -void sub_8054814(void) -{ - u8 val = Overworld_GetFlashLevel(); - if (val) - { - sub_80815E0(val); - ScanlineEffect_SetParams(gUnknown_08216694); - } -} - -bool32 sub_805483C(u8 *a1) -{ - switch (*a1) - { - case 0: - FieldClearVBlankHBlankCallbacks(); - ScriptContext1_Init(); - ScriptContext2_Disable(); - sub_8054F70(); - sub_8054BA8(); - (*a1)++; - break; - case 1: - sub_8053994(1); - (*a1)++; - break; - case 2: - sub_8054D4C(1); - (*a1)++; - break; - case 3: - sub_8054E98(); - sub_8054D90(); - sub_8054EC8(); - sub_8054E60(); - (*a1)++; - break; - case 4: - sub_8054814(); - sub_8054C54(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); - (*a1)++; - break; - case 5: - move_tilemap_camera_to_upper_left_corner(); - (*a1)++; - break; - case 6: - sub_8056D28(gMapHeader.mapData); - (*a1)++; - break; - case 7: - sub_8056D38(gMapHeader.mapData); - (*a1)++; - break; - case 8: - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); - (*a1)++; - break; - case 9: - DrawWholeMapView(); - (*a1)++; - break; - case 10: - cur_mapheader_run_tileset_funcs_after_some_cpuset(); - (*a1)++; - break; - case 12: - sub_80543E8(); - (*a1)++; - break; - case 11: - (*a1)++; - break; - case 13: - return 1; - } - return 0; -} - -bool32 sub_805493C(u8 *a1, u32 a2) -{ - switch (*a1) - { - case 0: - FieldClearVBlankHBlankCallbacks(); - sub_8053994(a2); - (*a1)++; - break; - case 1: - sub_8054BA8(); - (*a1)++; - break; - case 2: - sub_8054D4C(a2); - (*a1)++; - break; - case 3: - mli4_mapscripts_and_other(); - sub_8054E34(); - (*a1)++; - break; - case 4: - sub_8054814(); - sub_8054C54(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); - (*a1)++; - break; - case 5: - move_tilemap_camera_to_upper_left_corner(); - (*a1)++; - break; - case 6: - sub_8056D28(gMapHeader.mapData); - (*a1)++; - break; - case 7: - sub_8056D38(gMapHeader.mapData); - (*a1)++; - break; - case 8: - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); - (*a1)++; - break; - case 9: - DrawWholeMapView(); - (*a1)++; - break; - case 10: - cur_mapheader_run_tileset_funcs_after_some_cpuset(); - (*a1)++; - break; - case 11: - if (gMapHeader.flags == 1 && sub_80BBB24() == 1) - ShowMapNamePopup(); - (*a1)++; - break; - case 12: - sub_80543E8(); - (*a1)++; - break; - case 13: - return 1; - } - return 0; -} - -bool32 sub_8054A4C(u8 *a1) -{ - switch (*a1) - { - case 0: - sub_8054BA8(); - sub_8054D4C(0); - sub_8054E20(); - sub_8054E34(); - (*a1)++; - break; - case 1: - sub_8054C2C(); - (*a1)++; - break; - case 2: - sub_80543E8(); - (*a1)++; - break; - case 3: - return 1; - } - return 0; -} - -bool32 sub_8054A9C(u8 *a1) -{ - switch (*a1) - { - case 0: - FieldClearVBlankHBlankCallbacks(); - sub_8054BA8(); - (*a1)++; - break; - case 1: - sub_8054D4C(1); - (*a1)++; - break; - case 2: - sub_8054F48(); - sub_8054E20(); - sub_8054E7C(); - (*a1)++; - break; - case 3: - sub_8054814(); - sub_8054C54(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); - (*a1)++; - break; - case 4: - move_tilemap_camera_to_upper_left_corner(); - (*a1)++; - break; - case 5: - sub_8056D28(gMapHeader.mapData); - (*a1)++; - break; - case 6: - sub_8056D38(gMapHeader.mapData); - (*a1)++; - break; - case 7: - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); - (*a1)++; - break; - case 8: - DrawWholeMapView(); - (*a1)++; - break; - case 9: - cur_mapheader_run_tileset_funcs_after_some_cpuset(); - (*a1)++; - break; - case 12: - sub_80543E8(); - (*a1)++; - break; - case 10: - case 11: - (*a1)++; - break; - case 13: - SetFieldVBlankCallback(); - (*a1)++; - return 1; - } - return 0; -} - -void do_load_map_stuff_loop(u8 *a1) -{ - while (!sub_805493C(a1, 0)) - ; -} - -void sub_8054BA8(void) -{ - REG_DISPCNT = 0; - - ScanlineEffect_Stop(); - - DmaClear16(3, PLTT + 2, PLTT_SIZE - 2); - DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); - ResetOamRange(0, 128); - LoadOam(); -} - -void sub_8054C2C(void) -{ - sub_8054814(); - sub_8054C54(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); - mapdata_load_assets_to_gpu_and_full_redraw(); -} - -void sub_8054C54(void) -{ - REG_MOSAIC = 0; - REG_WININ = 7967; - REG_WINOUT = 257; - REG_WIN0H = 255; - REG_WIN0V = 255; - REG_WIN1H = -1; - REG_WIN1V = -1; - REG_BLDCNT = gUnknown_081E29E0[1] | gUnknown_081E29E0[2] | gUnknown_081E29E0[3] | 0x1040; - REG_BLDALPHA = 1805; - *gBGHOffsetRegs[0] = 0; - *gBGVOffsetRegs[0] = 0; - *gBGControlRegs[0] = 0; - *gBGHOffsetRegs[1] = 0; - *gBGVOffsetRegs[1] = 0; - *gBGControlRegs[1] = 7489; - *gBGHOffsetRegs[2] = 0; - *gBGVOffsetRegs[2] = 0; - *gBGControlRegs[2] = 7234; - *gBGHOffsetRegs[3] = 0; - *gBGVOffsetRegs[3] = 0; - *gBGControlRegs[3] = 7747; - REG_DISPCNT = gUnknown_081E29D8[1] | 0x7060 | gUnknown_081E29D8[2] | gUnknown_081E29D8[0] | gUnknown_081E29D8[3]; -} - -void sub_8054D4C(u32 a1) -{ - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - ScanlineEffect_Clear(); - ResetCameraUpdateInfo(); - InstallCameraPanAheadCallback(); - sub_805C7C4(0); - FieldEffectActiveListClear(); - InitFieldMessageBox(); - StartWeather(); - sub_8080750(); - if (!a1) - SetUpFieldTasks(); - mapheader_run_script_with_tag_x5(); -} - -void sub_8054D90(void) -{ - gUnknown_0300489C = 0; - gUnknown_03004898 = 0; - sub_805AA98(); - sub_805B55C(0, 0); - mapheader_run_first_tag4_script_list_match(); -} - -void mli4_mapscripts_and_other(void) -{ - s16 x, y; - struct UnkPlayerStruct *player; - gUnknown_0300489C = 0; - gUnknown_03004898 = 0; - sub_805AA98(); - sav1_camera_get_focus_coords(&x, &y); - player = sub_8053AA8(); - InitPlayerAvatar(x, y, player->player_field_1, gSaveBlock2.playerGender); - SetPlayerAvatarTransitionFlags(player->player_field_0); - player_avatar_init_params_reset(); - sub_805B55C(0, 0); - ResetBerryTreeSparkleFlags(); - mapheader_run_first_tag4_script_list_match(); -} - -void sub_8054E20(void) -{ - sub_805B710(0, 0); - RotatingGate_InitPuzzleAndGraphics(); -} - -void sub_8054E34(void) -{ - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 = 1; - InitCameraUpdateCallback(gPlayerAvatar.spriteId); -} - -void sub_8054E60(void) -{ - InitCameraUpdateCallback(sub_8055AE8(gUnknown_03004860)); -} - -void sub_8054E7C(void) -{ - InitCameraUpdateCallback(sub_8055AE8(gUnknown_03004860)); -} - -void sub_8054E98(void) -{ - u16 x, y; - sav1_camera_get_focus_coords(&x, &y); - sub_8056C50(x + gUnknown_03004860, y); -} - -void sub_8054EC8(void) -{ - u16 i; - u16 x, y; - - sav1_camera_get_focus_coords(&x, &y); - x -= gUnknown_03004860; - - for (i = 0; i < gFieldLinkPlayerCount; i++) - { - SpawnLinkPlayerMapObject(i, i + x, y, gLinkPlayers[i].gender); - CreateLinkPlayerSprite(i); - } - - sub_8055340(word_3002910); -} - -void sub_8054F48(void) -{ - u16 i; - for (i = 0; i < gFieldLinkPlayerCount; i++) - CreateLinkPlayerSprite(i); -} - -void sub_8054F70(void) -{ - int i; - for (i = 0; i < 4; i++) - gUnknown_03000580[i] = 0x80; -} - -bool32 sub_8054F88(u16 a1) -{ - int i; - int count = gFieldLinkPlayerCount; - - for (i = 0; i < count; i++) - if (gUnknown_03000580[i] != a1) - return FALSE; - return TRUE; -} - -bool32 sub_8054FC0(u16 a1) -{ - int i; - int count = gFieldLinkPlayerCount; - - for (i = 0; i < count; i++) - if (gUnknown_03000580[i] == a1) - return TRUE; - return FALSE; -} - -void sub_8054FF8(u32 a1, u16 a2, struct UnkStruct_8054FF8 *a3, u16 *a4) -{ - u8 *script; - - if (gUnknown_03000580[a1] == 0x80) - { - script = sub_8055648(a3); - if (script) - { - *a4 = sub_8055758(script); - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_8055808(script); - } - return; - } - if (sub_8054FC0(0x83) == 1) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_805585C(); - } - return; - } - switch (a2) - { - case 24: - if (sub_8055630(a3)) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_80557F4(); - } - } - break; - case 18: - if (sub_8055660(a3) == 1) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_8055824(); - } - } - break; - case 25: - script = sub_805568C(a3); - if (script) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_80553E4); - sub_8055840(script); - } - } - break; - case 27: - if (sub_8055618(a3)) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_8055408); - sub_80557E8(); - } - } - break; - case 28: - if (sub_8055618(a3)) - { - gUnknown_03000580[a1] = 0x81; - if (a3->b) - { - sub_80543DC(sub_8055438); - sub_80557E8(); - } - } - break; - } - } - - switch (a2) - { - case 23: - gUnknown_03000580[a1] = 0x83; - break; - case 22: - gUnknown_03000580[a1] = 0x82; - break; - case 26: - gUnknown_03000580[a1] = 0x80; - if (a3->b) - sub_80543DC(sub_8055390); - break; - case 29: - if (gUnknown_03000580[a1] == 0x82) - gUnknown_03000580[a1] = 0x81; - break; - } -} - -void sub_8055218(u16 *a1, int a2) -{ - struct UnkStruct_8054FF8 st; - int i; - for (i = 0; i < 4; i++) - { - u16 v5 = a1[i]; - u16 v8 = 0; - sub_80555B0(i, a2, &st); - sub_8054FF8(i, v5, &st, &v8); - if (gUnknown_03000580[i] == 0x80) - v8 = sub_805530C(v5); - sub_8055BFC(i, v8); - } -} - -void sub_8055280(u16 a1) -{ - if (a1 >= 17 && a1 < 30) - word_3004858 = a1; - else - word_3004858 = 17; -} - -u16 sub_80552B0(u32 a1) -{ - if (gMain.heldKeys & DPAD_UP) - { - return 19; - } - else if (gMain.heldKeys & DPAD_DOWN) - { - return 18; - } - else if (gMain.heldKeys & DPAD_LEFT) - { - return 20; - } - else if (gMain.heldKeys & DPAD_RIGHT) - { - return 21; - } - else if (gMain.newKeys & START_BUTTON) - { - return 24; - } - else if (gMain.newKeys & A_BUTTON) - { - return 25; - } - else - { - return 17; - } -} - -u16 sub_805530C(u16 a1) -{ - switch (a1) - { - case 21: - return 4; - case 20: - return 3; - case 19: - return 1; - case 18: - return 2; - default: - return 0; - } -} - -void sub_8055340(u16 *a1) -{ - int i; - for (i = 0; i < 4; i++) - a1[i] = 17; -} - -void sub_8055354(void) -{ - u8 val = gUnknown_03004860; - sub_8055218(word_3002910, val); - sub_8055280(gUnknown_03000584(val)); - sub_8055340(word_3002910); -} - -u16 sub_8055390(u32 a1) -{ - if (ScriptContext2_IsEnabled() == 1) - return 17; - if (gLink.recvQueue.count > 4) - return 27; - if (gLink.sendQueue.count <= 4) - return sub_80552B0(a1); - return 28; -} - -u16 sub_80553E0(u32 a1) -{ - return 17; -} - -u16 sub_80553E4(u32 a1) -{ - u16 retVal; - if (ScriptContext2_IsEnabled() == 1) - { - retVal = 17; - } - else - { - retVal = 26; - sub_80543DC(sub_80553E0); - } - return retVal; -} - -u16 sub_8055408(u32 a1) -{ - u16 retVal; - if (gLink.recvQueue.count > 2) - { - retVal = 17; - } - else - { - retVal = 26; - ScriptContext2_Disable(); - sub_80543DC(sub_80553E0); - } - return retVal; -} - -u16 sub_8055438(u32 a1) -{ - u16 retVal; - if (gLink.sendQueue.count > 2) - { - retVal = 17; - } - else - { - retVal = 26; - ScriptContext2_Disable(); - sub_80543DC(sub_80553E0); - } - return retVal; -} - -u16 sub_8055468(u32 a1) -{ - return 17; -} - -u16 sub_805546C(u32 linkPlayerId) -{ - if (gUnknown_03000580[linkPlayerId] == 0x82 && (gMain.newKeys & B_BUTTON)) - { - sub_80543DC(sub_8055468); - return 29; - } - else - { - return 17; - } -} - -u16 sub_80554A4(u32 a1) -{ - sub_80543DC(sub_805546C); - return 22; -} - -u16 sub_80554B8(u32 a1) -{ - return 17; -} - -u16 sub_80554BC(u32 a1) -{ - if (sub_8054F88(0x83) == TRUE) - { - ScriptContext1_SetupScript(gUnknown_081A4508); - sub_80543DC(sub_80554B8); - } - return 17; -} - -u16 sub_80554E4(u32 a1) -{ - sub_80543DC(sub_80554BC); - return 23; -} - -s32 sub_80554F8(void) -{ - if (sub_8054FC0(0x83) == TRUE) - return 2; - if (gUnknown_03000584 == sub_805546C && gUnknown_03000580[gUnknown_03004860] != 0x82) - return 0; - if (gUnknown_03000584 == sub_8055468 && gUnknown_03000580[gUnknown_03004860] == 0x81) - return 2; - return sub_8054F88(0x82); -} - -bool32 unref_sub_8055568(void) -{ - return sub_8054FC0(0x83); -} - -u16 sub_8055574(void) -{ - sub_80543DC(sub_80554A4); - return 0; -} - -u16 sub_8055588(void) -{ - sub_80543DC(sub_80553E4); - return 0; -} - -u16 sub_805559C(void) -{ - sub_80543DC(sub_80554E4); - return 0; -} - -void sub_80555B0(int linkPlayerId, int a2, struct UnkStruct_8054FF8 *a3) -{ - s16 x, y; - - a3->a = linkPlayerId; - a3->b = (linkPlayerId == a2) ? 1 : 0; - a3->c = gLinkPlayerMapObjects[linkPlayerId].mode; - a3->d = sub_8055B30(linkPlayerId); - sub_8055B08(linkPlayerId, &x, &y); - a3->sub.x = x; - a3->sub.y = y; - a3->sub.height = sub_8055B50(linkPlayerId); - a3->field_C = MapGridGetMetatileBehaviorAt(x, y); -} - -bool32 sub_8055618(struct UnkStruct_8054FF8 *a1) -{ - u8 v1 = a1->c; - if (v1 == 2 || v1 == 0) - return TRUE; - else - return FALSE; -} - -bool32 sub_8055630(struct UnkStruct_8054FF8 *a1) -{ - u8 v1 = a1->c; - if (v1 == 2 || v1 == 0) - return TRUE; - else - return FALSE; -} - -u8 *sub_8055648(struct UnkStruct_8054FF8 *a1) -{ - if (a1->c != 2) - return 0; - return sub_8068E24(&a1->sub); -} - -bool32 sub_8055660(struct UnkStruct_8054FF8 *a1) -{ - if (a1->c != 2 && a1->c != 0) - return FALSE; - if (!MetatileBehavior_IsSouthArrowWarp(a1->field_C)) - return FALSE; - if (a1->d != 1) - return FALSE; - return TRUE; -} - -u8 *sub_805568C(struct UnkStruct_8054FF8 *a1) -{ - struct MapPosition unkStruct; - u8 linkPlayerId; - - if (a1->c && a1->c != 2) - return 0; - - unkStruct = a1->sub; - unkStruct.x += gUnknown_0821664C[a1->d].x; - unkStruct.y += gUnknown_0821664C[a1->d].y; - unkStruct.height = 0; - linkPlayerId = GetLinkPlayerIdAt(unkStruct.x, unkStruct.y); - - if (linkPlayerId != 4) - { - if (!a1->b) - return TradeRoom_TooBusyToNotice; - if (gUnknown_03000580[linkPlayerId] != 0x80) - return TradeRoom_TooBusyToNotice; - if (!sub_8083BF4(linkPlayerId)) - return TradeRoom_ReadTrainerCard1; - else - return TradeRoom_ReadTrainerCard2; - } - - return sub_80682A8(&unkStruct, a1->field_C, a1->d); -} - -u16 sub_8055758(u8 *script) -{ - if (script == DoubleBattleColosseum_EventScript_1A4383) - return 10; - if (script == DoubleBattleColosseum_EventScript_1A439E) - return 9; - if (script == DoubleBattleColosseum_EventScript_1A43B9) - return 10; - if (script == DoubleBattleColosseum_EventScript_1A43D4) - return 9; - if (script == RecordCorner_EventScript_1A4418) - return 10; - if (script == RecordCorner_EventScript_1A442D) - return 9; - if (script == RecordCorner_EventScript_1A4442) - return 10; - if (script == RecordCorner_EventScript_1A4457) - return 9; - if (script == SingleBattleColosseum_EventScript_1A436F) - return 10; - if (script == SingleBattleColosseum_EventScript_1A4379) - return 9; - if (script == TradeCenter_EventScript_1A43F0) - return 10; - if (script == TradeCenter_EventScript_1A43FA) - return 9; - return 0; -} - -void sub_80557E8(void) -{ - ScriptContext2_Enable(); -} - -void sub_80557F4(void) -{ - PlaySE(SE_WIN_OPEN); - sub_8071310(); - ScriptContext2_Enable(); -} - -void sub_8055808(u8 *script) -{ - PlaySE(SE_SELECT); - ScriptContext1_SetupScript(script); - ScriptContext2_Enable(); -} - -void sub_8055824(void) -{ - PlaySE(SE_WIN_OPEN); - ScriptContext1_SetupScript(TradeRoom_PromptToCancelLink); - ScriptContext2_Enable(); -} - -void sub_8055840(u8 *script) -{ - PlaySE(SE_SELECT); - ScriptContext1_SetupScript(script); - ScriptContext2_Enable(); -} - -void sub_805585C(void) -{ - ScriptContext1_SetupScript(TradeRoom_TerminateLink); - ScriptContext2_Enable(); -} - -bool32 sub_8055870(void) -{ - if (!is_c1_link_related_active()) - return 0; - if (gLink.recvQueue.count >= 3) - gUnknown_03000588 = 1; - else - gUnknown_03000588 = 0; - return gUnknown_03000588; -} - -bool32 sub_80558AC(void) -{ - u8 temp; - - if (is_c1_link_related_active() != TRUE) - return FALSE; - - if (sub_8007B24() != TRUE) - return FALSE; - - if (gUnknown_03000584 == sub_8055408) - return TRUE; - - if (gUnknown_03000584 != sub_80553E4) - return FALSE; - - temp = gUnknown_03000588; - gUnknown_03000588 = 0; - - if (temp == TRUE) - return TRUE; - - if (gPaletteFade.active && gPaletteFade.softwareFadeFinishing) - return TRUE; - - return FALSE; -} - -bool32 sub_8055910(void) -{ - if (is_c1_link_related_active() != TRUE) - return FALSE; - - if (sub_8007B24() != TRUE) - return FALSE; - - if (gUnknown_03000584 == sub_8055438) - return TRUE; - - return FALSE; -} - -bool32 sub_8055940(void) -{ - if (!sub_8007B24()) - return FALSE; - return TRUE; -} - -void ZeroLinkPlayerMapObject(struct LinkPlayerMapObject *linkPlayerMapObj) -{ - memset(linkPlayerMapObj, 0, sizeof(struct LinkPlayerMapObject)); -} - -void strange_npc_table_clear(void) -{ - memset(gLinkPlayerMapObjects, 0, sizeof(gLinkPlayerMapObjects)); -} - -void ZeroMapObject(struct MapObject *mapObj) -{ - memset(mapObj, 0, sizeof(struct MapObject)); -} - -void SpawnLinkPlayerMapObject(u8 linkPlayerId, s16 x, s16 y, u8 a4) -{ - u8 mapObjId = sub_805AB54(); - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - - ZeroLinkPlayerMapObject(linkPlayerMapObj); - ZeroMapObject(mapObj); - - linkPlayerMapObj->active = 1; - linkPlayerMapObj->linkPlayerId = linkPlayerId; - linkPlayerMapObj->mapObjId = mapObjId; - linkPlayerMapObj->mode = 0; - - mapObj->active = 1; - mapObj->mapobj_bit_1 = a4; - mapObj->range.as_byte = 2; - mapObj->spriteId = 64; - - InitLinkPlayerMapObjectPos(mapObj, x, y); -} - -void InitLinkPlayerMapObjectPos(struct MapObject *mapObj, s16 x, s16 y) -{ - mapObj->coords2.x = x; - mapObj->coords2.y = y; - mapObj->coords3.x = x; - mapObj->coords3.y = y; - sub_80603CC(x, y, &mapObj->coords1.x, &mapObj->coords1.y); - mapObj->coords1.x += 8; - FieldObjectUpdateZCoord(mapObj); -} - -void unref_sub_8055A6C(u8 linkPlayerId, u8 a2) -{ - if (gLinkPlayerMapObjects[linkPlayerId].active) - { - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - mapObj->range.as_byte = a2; - } -} - -void unref_sub_8055A9C(u8 linkPlayerId) -{ - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - if (mapObj->spriteId != 64 ) - DestroySprite(&gSprites[mapObj->spriteId]); - linkPlayerMapObj->active = 0; - mapObj->active = 0; -} - -u8 sub_8055AE8(u8 linkPlayerId) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->spriteId; -} - -void sub_8055B08(u8 linkPlayerId, u16 *x, u16 *y) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - *x = mapObj->coords2.x; - *y = mapObj->coords2.y; -} - -u8 sub_8055B30(u8 linkPlayerId) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->range.as_byte; -} - -u8 sub_8055B50(u8 linkPlayerId) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->mapobj_unk_0B_0; -} - -s32 unref_sub_8055B74(u8 linkPlayerId) -{ - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return 16 - (s8)mapObj->mapobj_unk_21; -} - -u8 GetLinkPlayerIdAt(s16 x, s16 y) -{ - u8 i; - for (i = 0; i < 4; i++) - { - if (gLinkPlayerMapObjects[i].active - && (gLinkPlayerMapObjects[i].mode == 0 || gLinkPlayerMapObjects[i].mode == 2)) - { - struct MapObject *mapObj = &gMapObjects[gLinkPlayerMapObjects[i].mapObjId]; - if (mapObj->coords2.x == x && mapObj->coords2.y == y) - return i; - } - } - return 4; -} - -void sub_8055BFC(u8 linkPlayerId, u8 a2) -{ - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - - if (linkPlayerMapObj->active) - { - if (a2 > 10) - mapObj->mapobj_bit_2 = 1; - else - gUnknown_082166D8[gUnknown_082166A0[linkPlayerMapObj->mode](linkPlayerMapObj, mapObj, a2)](linkPlayerMapObj, mapObj); - } -} - -static u8 sub_8055C68(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3); -} - -static u8 sub_8055C88(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - return 1; -} - -static u8 sub_8055C8C(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3); -} - -static u8 sub_8055CAC(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - return 0; -} - -static u8 sub_8055CB0(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - s16 x, y; - - mapObj->range.as_byte = npc_something3(a3, mapObj->range.as_byte); - FieldObjectMoveDestCoords(mapObj, mapObj->range.as_byte, &x, &y); - - if (LinkPlayerDetectCollision(linkPlayerMapObj->mapObjId, mapObj->range.as_byte, x, y)) - { - return 0; - } - else - { - mapObj->mapobj_unk_21 = 16; - npc_coords_shift(mapObj, x, y); - FieldObjectUpdateZCoord(mapObj); - return 1; - } -} - -static u8 sub_8055D18(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) -{ - mapObj->range.as_byte = npc_something3(a3, mapObj->range.as_byte); - return 0; -} - -static void sub_8055D30(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) -{ - linkPlayerMapObj->mode = 0; -} - -static void sub_8055D38(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) -{ - mapObj->mapobj_unk_21--; - linkPlayerMapObj->mode = 1; - MoveCoords(mapObj->range.as_byte, &mapObj->coords1.x, &mapObj->coords1.y); - if (!mapObj->mapobj_unk_21) - { - npc_coords_shift_still(mapObj); - linkPlayerMapObj->mode = 2; - } -} - -u8 npc_something3(u8 a1, u8 a2) -{ - switch (a1 - 1) - { - case 0: - case 6: - return 2; - case 1: - case 7: - return 1; - case 2: - case 8: - return 3; - case 3: - case 9: - return 4; - } - return a2; -} - -u8 LinkPlayerDetectCollision(u8 selfMapObjId, u8 a2, s16 x, s16 y) -{ - u8 i; - for (i = 0; i < 16; i++) - { - if (i != selfMapObjId) - { - if ((gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) - || (gMapObjects[i].coords3.x == x && gMapObjects[i].coords3.y == y)) - { - return 1; - } - } - } - return MapGridIsImpassableAt(x, y); -} - -void CreateLinkPlayerSprite(u8 linkPlayerId) -{ - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - struct Sprite *sprite; - - if (linkPlayerMapObj->active) - { - u8 val = GetRivalAvatarGraphicsIdByStateIdAndGender(0, mapObj->mapobj_bit_1); - mapObj->spriteId = AddPseudoFieldObject(val, SpriteCB_LinkPlayer, 0, 0, 0); - sprite = &gSprites[mapObj->spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = linkPlayerId; - mapObj->mapobj_bit_2 = 0; - } -} - -void SpriteCB_LinkPlayer(struct Sprite *sprite) -{ - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[sprite->data[0]]; - struct MapObject *mapObj = &gMapObjects[linkPlayerMapObj->mapObjId]; - sprite->pos1.x = mapObj->coords1.x; - sprite->pos1.y = mapObj->coords1.y; - SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); - sprite->oam.priority = ZCoordToPriority(mapObj->elevation); - if (!linkPlayerMapObj->mode) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObj->range.as_byte)); - else - StartSpriteAnimIfDifferent(sprite, get_go_image_anim_num(mapObj->range.as_byte)); - sub_806487C(sprite, 0); - if (mapObj->mapobj_bit_2) - { - sprite->invisible = ((sprite->data[7] & 4) >> 2); - sprite->data[7]++; - } -} diff --git a/src/field/party_menu.c b/src/field/party_menu.c deleted file mode 100644 index 9caaa05b9..000000000 --- a/src/field/party_menu.c +++ /dev/null @@ -1,5321 +0,0 @@ -#include "global.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "constants/songs.h" -#include "constants/species.h" -#include "party_menu.h" -#include "battle.h" -#include "battle_interface.h" -#include "battle_party_menu.h" -#include "choose_party.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "evolution_scene.h" -#include "item.h" -#include "item_use.h" -#include "item_menu.h" -#include "link.h" -#include "mail_data.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "palette.h" -#include "pokemon.h" -#include "pokemon_icon.h" -#include "pokemon_item_effect.h" -#include "pokemon_menu.h" -#include "pokemon_summary_screen.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "scanline_effect.h" -#include "util.h" -#include "script_pokemon_80F9.h" -#include "ewram.h" - -struct Coords8 -{ - u8 x; - u8 y; -}; - -struct PartyMenuWindowCoords -{ - u8 left; - u8 top; - u8 right; - u8 bottom; -}; - -struct PartyMonTextSettingsStruct -{ - u8 xOffset; - u8 yOffset; - const u16 *oamSettings; -}; - -struct PartyMenuHandlersStruct -{ - /*0x0*/TaskFunc menuHandler; - /*0x4*/bool8 (*menuSetup)(void); - /*0x8*/u8 initialPromptTextId; // element in PartyMenuPromptTexts -}; - -static void nullsub_12(u8 monIndex, struct Pokemon *pokemon); -static void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon); -static void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon); -static void sub_806D05C(u8 taskId); -static void sub_806D15C(u8 taskId); -static void sub_806D198(u8 taskId); -static void sub_806E884(u8 taskId); -static void sub_8070D90(u8 taskId); -static void sub_806D5B8(u8 taskId); -static void sub_806D014(u8 taskId); -static void sub_806D118(u8 taskId); -static void CB2_InitPartyMenu(void); -static void ReDrawPartyMonBackgrounds(void); -static void sub_806BA94(s16 a, u16 b, u8 c, u8 d); -static void sub_806B9A4(s16 a, u16 b, u8 c); -static void sub_806CA18(u8 taskId, u8 b); -static void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); -static void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); -static void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); -static void UpdateMonIconFrame_806DA0C(struct Sprite *sprite); -static void UpdateMonIconFrame_806DA38(struct Sprite *sprite); -static void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c); -static u8 sub_806CA00(u8 taskId); -static void SpriteCB_sub_806D37C(struct Sprite *sprite); -static u8 GetMonIconSpriteId(u8 taskId, u8 monIndex); -static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite); -static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId); -static void ItemUseMoveMenu_HandleCancel(u8 taskId); -static bool8 SetupDefaultPartyMenu(void); -/*static*/ void sub_806B4A8(void); -/*static*/ void VBlankCB_PartyMenu(void); -/*static*/ bool8 LoadPartyMenuGraphics(u8 a); -static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d); -static void sub_806BB9C(u8 a); -static void sub_806BBEC(u8 a); - -EWRAM_DATA u8 gUnknown_0202E8F4 = 0; -EWRAM_DATA u8 gUnknown_0202E8F5 = 0; -EWRAM_DATA u8 gUnknown_0202E8F6 = 0; -EWRAM_DATA u16 gUnknown_0202E8F8 = 0; -EWRAM_DATA u8 gPartyMenuType = 0; - -const u16 TMHMMoves[] = -{ - MOVE_FOCUS_PUNCH, - MOVE_DRAGON_CLAW, - MOVE_WATER_PULSE, - MOVE_CALM_MIND, - MOVE_ROAR, - MOVE_TOXIC, - MOVE_HAIL, - MOVE_BULK_UP, - MOVE_BULLET_SEED, - MOVE_HIDDEN_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_ICE_BEAM, - MOVE_BLIZZARD, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_GIGA_DRAIN, - MOVE_SAFEGUARD, - MOVE_FRUSTRATION, - MOVE_SOLAR_BEAM, - MOVE_IRON_TAIL, - MOVE_THUNDERBOLT, - MOVE_THUNDER, - MOVE_EARTHQUAKE, - MOVE_RETURN, - MOVE_DIG, - MOVE_PSYCHIC, - MOVE_SHADOW_BALL, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_REFLECT, - MOVE_SHOCK_WAVE, - MOVE_FLAMETHROWER, - MOVE_SLUDGE_BOMB, - MOVE_SANDSTORM, - MOVE_FIRE_BLAST, - MOVE_ROCK_TOMB, - MOVE_AERIAL_ACE, - MOVE_TORMENT, - MOVE_FACADE, - MOVE_SECRET_POWER, - MOVE_REST, - MOVE_ATTRACT, - MOVE_THIEF, - MOVE_STEEL_WING, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_OVERHEAT, - MOVE_CUT, - MOVE_FLY, - MOVE_SURF, - MOVE_STRENGTH, - MOVE_FLASH, - MOVE_ROCK_SMASH, - MOVE_WATERFALL, - MOVE_DIVE, -}; - -//FIXME -//const u8 *unrefTileBuffer = gTileBuffer; -asm(".4byte gTileBuffer\n"); - -static const u8 MenuGfx_HoldIcons[] = INCBIN_U8("graphics/interface/hold_icons.4bpp"); -static const u16 MenuPal_HoldIcons[] = INCBIN_U16("graphics/interface/hold_icons.gbapal"); - -static const struct SpriteSheet HeldItemsSpriteSheet = { - MenuGfx_HoldIcons, - sizeof MenuGfx_HoldIcons, - 0xd750 -}; - -static const struct SpritePalette HeldItemsPalette = { - MenuPal_HoldIcons, - 0xd750 -}; - -static const struct OamData gOamData_83765EC = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd gSpriteAnim_83765F4[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83765FC[] = { - ANIMCMD_FRAME(1, 1), - ANIMCMD_END -}; - -static const union AnimCmd *const gSpriteAnimTable_8376604[] = { - gSpriteAnim_83765F4, - gSpriteAnim_83765FC, -}; - -static const struct SpriteTemplate gSpriteTemplate_837660C = { - 55120, - 55120, - &gOamData_83765EC, - gSpriteAnimTable_8376604, - NULL, - gDummySpriteAffineAnimTable, - SpriteCB_UpdateHeldItemIconPosition -}; - -// Texts that can be displayed in the bottom of the party menu. -static const u8 *const PartyMenuPromptTexts[] = { - OtherText_ChoosePoke, - OtherText_MovePokeTo, - OtherText_TeachWhat, - OtherText_UseWhat, - OtherText_GiveWhat, - OtherText_DoWhat, - OtherText_NothingToCut, - OtherText_CantSurf, - OtherText_AlreadySurfing, - OtherText_CantUseThatHere, - OtherText_RestoreWhatMove, - OtherText_BoostPP, - gOtherText_CancelWithTerminator, - OtherText_DoWhatWithItem, - OtherText_NoPokeForBattle, - OtherText_ChoosePoke2, - OtherText_NotEnoughHP, - OtherText_ThreePokeNeeded, - OtherText_PokeCantBeSame, - OtherText_NoIdenticalHoldItems, - OtherText_TeachWhichPoke, -}; - -static const struct Coords8 gUnknown_08376678[8][6] = { - {{16, 40}, {104, 18}, {104, 42}, {104, 66}, {104, 90}, {104, 114}}, // PARTY_MENU_TYPE_STANDARD - {{16, 24}, { 16, 80}, {104, 18}, {104, 50}, {104, 82}, {104, 114}}, // PARTY_MENU_TYPE_BATTLE - {{16, 24}, { 16, 80}, {104, 26}, {104, 50}, {104, 82}, {104, 106}}, // PARTY_MENU_TYPE_CONTEST - {{16, 24}, {104, 26}, {104, 50}, { 16, 80}, {104, 82}, {104, 106}}, // PARTY_MENU_TYPE_IN_GAME_TRADE - {{ 5, 4}, { 16, 1}, { 16, 4}, { 16, 7}, { 16, 10}, { 16, 13}}, // PARTY_MENU_TYPE_BATTLE_TOWER - {{ 5, 2}, { 5, 9}, { 16, 1}, { 16, 5}, { 16, 9}, { 16, 13}}, // PARTY_MENU_TYPE_LINK_MULTI_BATTLE - {{ 5, 2}, { 5, 9}, { 16, 2}, { 16, 5}, { 16, 9}, { 16, 12}}, // PARTY_MENU_TYPE_DAYCARE - {{ 5, 2}, { 16, 2}, { 16, 5}, { 5, 9}, { 16, 9}, { 16, 12}}, // PARTY_MENU_TYPE_MOVE_TUTOR -}; - -static const struct Coords8 gUnknown_08376738[12][6] = { - {{6, 5}, {17, 2}, {17, 5}, {17, 8}, {17, 11}, {17, 14}}, - {{6, 3}, { 6, 10}, {17, 2}, {17, 6}, {17, 10}, {17, 14}}, - {{6, 3}, { 6, 10}, {17, 3}, {17, 6}, {17, 10}, {17, 13}}, - {{6, 3}, {17, 3}, {17, 6}, { 6, 10}, {17, 10}, {17, 13}}, - {{3, 7}, {22, 2}, {22, 5}, {22, 8}, {22, 11}, {22, 14}}, - {{3, 5}, { 3, 12}, {22, 2}, {22, 6}, {22, 10}, {22, 14}}, - {{3, 5}, { 3, 12}, {22, 3}, {22, 6}, {22, 10}, {22, 13}}, - {{3, 5}, {22, 3}, {22, 6}, { 3, 12}, {22, 10}, {22, 13}}, - {{7, 7}, {26, 2}, {26, 5}, {26, 8}, {26, 11}, {26, 14}}, - {{7, 5}, { 7, 12}, {26, 2}, {26, 6}, {26, 10}, {26, 14}}, - {{7, 5}, { 7, 12}, {26, 3}, {26, 6}, {26, 10}, {26, 13}}, - {{7, 5}, {26, 3}, {26, 6}, { 7, 12}, {26, 10}, {26, 13}}, -}; - -static u16 *const gUnknown_08376858[4][6] = { - {(u16*)(BG_VRAM + 0xF1C8), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF16E), (u16*)(BG_VRAM + 0xF22E), (u16*)(BG_VRAM + 0xF2EE), (u16*)(BG_VRAM + 0xF3AE)}, // PARTY_MENU_STANDARD - {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF3AE)}, // PARTY_MENU_LAYOUT_DOUBLE_BATTLE - {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0EE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF36E)}, // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE - {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF0EE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF36E)}, // PARTY_MENU_LAYOUT_MULTI_BATTLE -}; - -static const struct Coords8 gUnknown_083768B8[3][8] = { - {{8, 44}, {92, 22}, {92, 46}, {92, 70}, {92, 94}, {92, 118}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_STANDARD - {{8, 28}, { 8, 84}, {92, 22}, {92, 54}, {92, 86}, {92, 118}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_DOUBLE_BATTLE - {{8, 28}, { 8, 84}, {92, 30}, {92, 54}, {92, 86}, {92, 110}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE -}; - -static u16 *const gUnknown_08376918[2][PARTY_SIZE] = { - {(u16*)(BG_VRAM + 0xF1C6), (u16*)(BG_VRAM + 0xF06C), (u16*)(BG_VRAM + 0xF12C), (u16*)(BG_VRAM + 0xF1EC), (u16*)(BG_VRAM + 0xF2AC), (u16*)(BG_VRAM + 0xF36C)}, - {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF3AE)}, -}; - -static const struct PartyMenuWindowCoords gUnknown_08376948[2][6] = { - {{2, 4, 10, 9}, {16, 1, 29, 3}, {16, 4, 29, 6}, {16, 7, 29, 9}, {16, 10, 29, 12}, {16, 13, 29, 15}}, - {{2, 2, 10, 7}, { 2, 9, 10, 14}, {16, 1, 29, 3}, {16, 5, 29, 7}, {16, 9, 29, 11}, {16, 13, 29, 15}}, -}; - -static const struct PartyMenuWindowCoords gUnknown_08376978[2][6] = { - {{2, 7, 10, 9}, {21, 1, 29, 3}, {21, 4, 29, 6}, {21, 7, 29, 9}, {21, 10, 29, 12}, {21, 13, 29, 15}}, - {{2, 2, 10, 7}, { 2, 9, 10, 14}, {16, 1, 29, 3}, {16, 5, 29, 7}, {16, 9, 29, 11}, {16, 13, 29, 15}}, -}; - -// This is actually a 2x6x2 array, but the code reads it as a flat array. -static const u8 gUnknown_083769A8[] = { - 0, 3, 11, 1, 11, 4, 11, 7, 11, 10, 11, 13, - 0, 1, 0, 8, 11, 1, 11, 5, 11, 9, 11, 13, // Double battle -}; - -// This is actually a 2x6x2 array, but the code reads it as a flat array. -//FIXME: sub_806B908() accesses this data via gUnknown_083769A8 (directly above this). This means these -// two arrays might be a struct, rather than separate arrays. -static const u8 gUnknown_083769C0[] = { - 0, 1, 0, 8, 11, 2, 11, 5, 11, 9, 11, 12, - 0, 1, 0, 8, 11, 2, 11, 5, 11, 9, 11, 12, // Double battle -}; - -static const u8 gUnknown_083769D8[] = { - 0x24,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x27, - 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, - 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, - 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, - 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x47, - 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x47, - 0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57, -}; - -static const u8 gUnknown_08376A25[] = { - 0x50,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x53, - 0x60,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x63, - 0x70,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x73, -}; - -static const u8 gUnknown_08376A5E[] = { - 0x20,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x23, - 0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33, - 0x40,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x43, -}; - -static const u8 gUnusedData_08376A97[] = { - 0x0C,0x0D,0x0E,0x0F,0x00,0x01,0x02,0x03,0x04,0x05,0x0F, - 0x10,0x11,0x12,0x13,0x14,0x15,0x0F,0x06,0x05,0x01,0x07, - 0x08,0x09,0x0F,0x16,0x15,0x11,0x17,0x18,0x19,0x0F,0x09, - 0x0A,0x0B,0x05,0x0C,0x0F,0x0F,0x19,0x1A,0x1B,0x15,0x1C, - 0x0F,0x0F,0x0D,0x0B,0x05,0x0C,0x0F,0x0F,0x0F,0x1D,0x1B, - 0x15,0x1C,0x0F,0x0F,0x0F,0x06,0x05,0x0B,0x05,0x0C,0x0F, - 0x0F,0x16,0x15,0x1B,0x15,0x1C,0x0F,0x0F,0x0F,0x0F,0x20, - 0x0C,0x09,0x0F,0x0F,0x0F,0x1F,0x30,0x1C,0x19,0x0F,0x0F, - 0x0F,0x25,0x0F,0x22,0x24,0x0F,0x0F,0x0F,0x35,0x41,0x32, - 0x34,0x0F,0x0F,0x0F,0x26,0x0F,0x23,0x0E,0x0F,0x0F,0x0F, - 0x36,0x43,0x33,0x1E,0x0F,0x0F,0x27,0x28,0x29,0x03,0x2A, - 0x0F,0x0F,0x37,0x38,0x39,0x13,0x3A,0x0F,0x0F,0x27,0x28, - 0x29,0x03,0x04,0x05,0x0F,0x37,0x38,0x39,0x13,0x14,0x15, - 0x0F,0x2B,0x2C,0x02,0x28,0x29,0x2D,0x21,0x3B,0x3C,0x12, - 0x38,0x39,0x3D,0x31,0x2B,0x2C,0x02,0x28,0x29,0x08,0x09, - 0x3B,0x3C,0x12,0x38,0x39,0x18,0x19,0x2E,0x2F,0x2B,0x2C, - 0x02,0x27,0x2D,0x3E,0x3F,0x3B,0x3C,0x12,0x45,0x3D, -}; - -static const TaskFunc gUnknown_08376B54[] = { - ItemUseMoveMenu_HandleMoveSelection, - ItemUseMoveMenu_HandleCancel, -}; - -#define PartyMonOAMSettings(x, y, palette, shape, size, priority, tileOffset) \ - ((shape) << 14) | (y), \ - ((size) << 14) | (x), \ - ((palette) << 12) | ((priority) << 10) | (tileOffset) - -static const u16 PartyMonOAMSettings_LeftColumn[] = { - PartyMonOAMSettings(24, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 0), - PartyMonOAMSettings(56, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 4), - PartyMonOAMSettings(24, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 8), - PartyMonOAMSettings(56, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 12), - PartyMonOAMSettings(32, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 16), - PartyMonOAMSettings(37, 32, 15, ST_OAM_H_RECTANGLE, 1, 1, 24), - PartyMonOAMSettings(69, 32, 15, ST_OAM_H_RECTANGLE, 1, 1, 28), - 0xFFFF, -}; - -static const u16 PartyMonOAMSettings_RightColumn[] = { - PartyMonOAMSettings( 24, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 0), - PartyMonOAMSettings( 56, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 4), - PartyMonOAMSettings( 24, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 8), - PartyMonOAMSettings( 56, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 12), - PartyMonOAMSettings( 32, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 16), - PartyMonOAMSettings(101, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 24), - PartyMonOAMSettings(133, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 28), - 0xFFFF, -}; - -// Controls where and how the mons' text appears in the party menu screen (nickname, HP, and level). -static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = -{ - { // PARTY_MENU_LAYOUT_STANDARD - { 1, 4, PartyMonOAMSettings_LeftColumn}, - {12, 1, PartyMonOAMSettings_RightColumn}, - {12, 4, PartyMonOAMSettings_RightColumn}, - {12, 7, PartyMonOAMSettings_RightColumn}, - {12, 10, PartyMonOAMSettings_RightColumn}, - {12, 13, PartyMonOAMSettings_RightColumn}, - }, - { // PARTY_MENU_LAYOUT_DOUBLE_BATTLE - { 1, 2, PartyMonOAMSettings_LeftColumn}, - { 1, 9, PartyMonOAMSettings_LeftColumn}, - {12, 1, PartyMonOAMSettings_RightColumn}, - {12, 5, PartyMonOAMSettings_RightColumn}, - {12, 9, PartyMonOAMSettings_RightColumn}, - {12, 13, PartyMonOAMSettings_RightColumn}, - }, - { // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE - { 1, 2, PartyMonOAMSettings_LeftColumn}, - { 1, 9, PartyMonOAMSettings_LeftColumn}, - {12, 2, PartyMonOAMSettings_RightColumn}, - {12, 5, PartyMonOAMSettings_RightColumn}, - {12, 9, PartyMonOAMSettings_RightColumn}, - {12, 12, PartyMonOAMSettings_RightColumn}, - }, - { // PARTY_MENU_LAYOUT_MULTI_BATTLE - { 1, 2, PartyMonOAMSettings_LeftColumn}, - {12, 2, PartyMonOAMSettings_RightColumn}, - {12, 5, PartyMonOAMSettings_RightColumn}, - { 1, 9, PartyMonOAMSettings_LeftColumn}, - {12, 9, PartyMonOAMSettings_RightColumn}, - {12, 12, PartyMonOAMSettings_RightColumn}, - }, -}; - -static const struct PartyMenuHandlersStruct PartyMenuHandlers[] = -{ - {HandleDefaultPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_STANDARD - {HandleBattlePartyMenu, SetUpBattlePartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE - {HandleSelectPartyMenu, SetupContestPartyMenu, 0}, // PARTY_MENU_TYPE_CONTEST - {HandleSelectPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_IN_GAME_TRADE - {HandleBattleTowerPartyMenu, SetupBattleTowerPartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE_TOWER - {HandleLinkMultiBattlePartyMenu, SetupLinkMultiBattlePartyMenu, 0xFF}, // PARTY_MENU_TYPE_LINK_MULTI_BATTLE - {HandleDaycarePartyMenu, SetupDefaultPartyMenu, 0x0F}, // PARTY_MENU_TYPE_DAYCARE - {HandleMoveTutorPartyMenu, SetupMoveTutorPartyMenu, 0}, // PARTY_MENU_TYPE_MOVE_TUTOR -}; - -struct Unk201C000 -{ - /*0x00*/ struct Pokemon *pokemon; - /*0x04*/ u8 unk4; - /*0x05*/ u8 unk5; - /*0x06*/ u16 unk6; - /*0x08*/ u16 unk8; - /*0x0A*/ u8 pad_0A[2]; - /*0x0C*/ s32 unkC; - /*0x10*/ TaskFunc unk10; - /*0x14*/ TaskFunc unk14; -}; - -struct Unk201FE00 -{ - u8 unkE00; // not sure if this is an array or struct, or how big it is - u8 unkE01; - u8 unkE02; -}; - -extern u16 gBattleTypeFlags; -extern u8 gTileBuffer[]; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gPlayerPartyCount; -extern s32 gBattleMoveDamage; -extern u16 gMoveToLearn; - -extern u16 gUnknown_08E9A300[]; -extern struct Coords8 const gUnknown_08376738[12][6]; -extern const u8 gUnknown_083769C0[]; -extern u8 gUnknown_02039460[]; -extern struct Window gUnknown_03004210; - -extern const u8 gPartyMenuMisc_Gfx[]; -extern const u8 gPartyMenuMisc_Tilemap[]; -extern const u8 gPartyMenuMisc_Pal[]; -extern const u8 gFontDefaultPalette[]; -extern const u8 gPartyMenuHpBar_Gfx[]; -extern const u8 gPartyMenuOrderText_Gfx[]; -extern const u8 gStatusGfx_Icons[]; -extern const u8 gStatusPal_Icons[]; - -#if ENGLISH -#define WINDOW_LEFT (3) -#define WINDOW_RIGHT (26) -#elif GERMAN -#define WINDOW_LEFT (0) -#define WINDOW_RIGHT (29) -#endif - -void CB2_PartyMenuMain(void) -{ - const struct PartyMonTextSettingsStruct *textSettings; - s32 i; - - AnimateSprites(); - BuildOamBuffer(); - - textSettings = PartyMonTextSettings[gPartyMenuType]; - for (i = 0; i < PARTY_SIZE; i++) - { - // Draw mon name, level, and hp sprites - DrawPartyMenuMonText( - textSettings->xOffset * 8, - textSettings->yOffset * 8, - textSettings->oamSettings, - 0, - (i << 5) | 0x200); - textSettings++; - } - - RunTasks(); - UpdatePaletteFade(); - -#if DEBUG - if (gLinkOpen == TRUE) - debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 2); -#endif -} - -void VBlankCB_PartyMenu(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ReDrawPartyMonBackgrounds(); -} - -void SetPartyMenuSettings(u8 menuType, u8 battleTypeFlags, TaskFunc menuHandlerFunc, u8 textId) -{ - if (battleTypeFlags != 0xFF) - { - gBattleTypeFlags = battleTypeFlags; - } - - ewram1B000.menuType = menuType; - ewram1B000.menuHandler = menuHandlerFunc; - ewram1B000.promptTextId = textId; -} - -void DoOpenPartyMenu(u8 menuType, u8 battleFlags, TaskFunc menuHandlerFunc, u8 textId) -{ - SetPartyMenuSettings(menuType, battleFlags, menuHandlerFunc, textId); - SetMainCallback2(CB2_InitPartyMenu); -} - -void OpenPartyMenu(u8 menuType, u8 battleFlags) -{ - DoOpenPartyMenu(menuType, battleFlags, PartyMenuHandlers[menuType].menuHandler, PartyMenuHandlers[menuType].initialPromptTextId); -} - -// This is a Task which is repeatedly called until it eventually returns TRUE when finished. -bool8 SetupDefaultPartyMenu(void) -{ - switch (ewram1B000_alt.setupState) - { - case 0: - if (ewram1B000_alt.monIndex < gPlayerPartyCount) - { - TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); - ewram1B000_alt.monIndex++; - } - else - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState++; - } - break; - case 1: - LoadHeldItemIconGraphics(); - ewram1B000_alt.setupState++; - break; - case 2: - CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); - ewram1B000_alt.setupState++; - break; - case 3: - if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) != 1) - { - ewram1B000_alt.monIndex++; - } - else - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState++; - } - break; - case 4: - PartyMenuPrintMonsLevelOrStatus(); - ewram1B000_alt.setupState++; - break; - case 5: - PrintPartyMenuMonNicknames(); - ewram1B000_alt.setupState++; - break; - case 6: - PartyMenuTryPrintMonsHP(); - ewram1B000_alt.setupState++; - break; - case 7: - nullsub_13(); - ewram1B000_alt.setupState++; - break; - case 8: - PartyMenuDrawHPBars(); - ewram1B000_alt.setupState++; - break; - case 9: - if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) - { - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.setupState = 0; - return TRUE; - } - else - { - ewram1B000_alt.monIndex++; - break; - } - } - - return FALSE; -} - -bool8 InitPartyMenu(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - gPaletteFade.bufferTransferDisabled = 1; - gMain.state++; - break; - case 1: - ScanlineEffect_Stop(); - gMain.state++; - break; - case 2: - sub_806B4A8(); - ewram1B000_alt.setupState = 0; - ewram1B000_alt.monIndex = 0; - ewram1B000_alt.unk268 = 0; - gMain.state++; - break; - case 3: - ResetSpriteData(); - gMain.state++; - break; - case 4: - if (ewram1B000.menuType != PARTY_MENU_TYPE_BATTLE && ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) - ResetTasks(); - gMain.state++; - break; - case 5: - FreeAllSpritePalettes(); - gMain.state++; - break; - case 6: - ewram1B000.menuHandlerTaskId = CreateTask(ewram1B000.menuHandler, 0); - gMain.state++; - break; - case 7: - Text_LoadWindowTemplate(&gWindowTemplate_81E6C90); - gMain.state++; - break; - case 8: - Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C90); - MultistepInitWindowTileData(&gUnknown_03004210, 1); - gMain.state++; - break; - case 9: - if (MultistepLoadFont()) - { - ewram1B000_alt.setupState = 1; - gMain.state++; - } - break; - case 10: - if (LoadPartyMenuGraphics(ewram1B000_alt.setupState) == TRUE) - { - ewram1B000_alt.setupState = 0; - gMain.state++; - } - else - { - ewram1B000_alt.setupState++; - } - break; - case 11: - sub_809D51C(); - gMain.state++; - break; - case 12: - if (PartyMenuHandlers[ewram1B000.menuType].menuSetup() == TRUE) - gMain.state++; - break; - case 13: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6CC8); - gMain.state++; - break; - case 14: - if (MultistepInitMenuWindowContinue()) - gMain.state++; - break; - case 15: - PrintPartyMenuPromptText(ewram1B000.promptTextId, 0); - gMain.state++; - break; - case 16: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - gMain.state++; - break; - case 17: - SetVBlankCallback(VBlankCB_PartyMenu); -#if DEBUG - if (gLinkOpen == TRUE) - debug_sub_8008218((void *)(VRAM + 0xE5E0), 0x8000, (void *)(VRAM + 0x7800), 2); -#endif - return TRUE; - } - - return FALSE; -} - -void CB2_InitPartyMenu(void) -{ - while (InitPartyMenu() != TRUE) - { - if (sub_80F9344() == TRUE) - return; - } - - if (ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) - ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); - - SetMainCallback2(CB2_PartyMenuMain); -} - -void sub_806B4A8(void) -{ - SetHBlankCallback(NULL); - REG_DISPCNT = 8000; - REG_BG0CNT = 0x1E05; - REG_BG1CNT = 0x703; - REG_BG2CNT = 0xF08; - REG_BG3CNT = 0x602; - REG_BLDCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG3VOFS = -1; -} - -bool8 IsLinkDoubleBattle() -{ - if ((gBattleTypeFlags & BATTLE_TYPE_LINK_DOUBLE) == BATTLE_TYPE_LINK_DOUBLE) - return TRUE; - else - return FALSE; -} - -// Draws the blue rectangular regions surrounding each of the party mons. -void ReDrawPartyMonBackgrounds(void) -{ - if (ewram1B000.unk261) - { - DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(BG_VRAM + 0x3000), 0x800); - - if (ewram1B000.unk261 == 2) - ewram1B000.unk261 = 0; - } -} - -bool8 DrawPartyMonBackground(u8 monIndex) -{ - const u8 *arr; - - if (!IsDoubleBattle()) - gPartyMenuType = PARTY_MENU_LAYOUT_STANDARD; - else if (IsLinkDoubleBattle() == TRUE) - gPartyMenuType = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; - else - gPartyMenuType = PARTY_MENU_LAYOUT_DOUBLE_BATTLE; - - arr = &gUnknown_083769A8[gPartyMenuType * 12]; - - switch (monIndex) - { - case 0: - memset(&gBGTilemapBuffers[2], 0, 0x800); - break; - case 1: - sub_806B9A4(arr[0], arr[1], 3); - sub_806BF24(&arr[0], 0, 3, 0); - break; - case 2: - if (!IsDoubleBattle()) - { - if (gPlayerPartyCount > 1) - { - sub_806BA94(arr[2], arr[3], 0, 3); - sub_806BF24(&arr[2], 1, 3, 0); - } - else - { - sub_806BA94(arr[2], arr[3], 1, 3); - } - } - else if (IsLinkDoubleBattle() == TRUE) - { - sub_806B9A4(arr[2], arr[3], 4); - sub_806BF24(&arr[2], 1, 4, 0); - } - else - { - sub_806B9A4(arr[2], arr[3], 3); - sub_806BF24(&arr[2], 1, 3, 0); - } - break; - case 3: - if (!IsDoubleBattle()) - { - if (gPlayerPartyCount > 2) - { - sub_806BA94(arr[4], arr[5], 0, 3); - sub_806BF24(&arr[4], 2, 3, 0); - } - else - { - sub_806BA94(arr[4], arr[5], 1, 3); - } - } - else if (IsLinkDoubleBattle() == TRUE) - { - if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) - { - sub_806BA94(arr[4], arr[5], 0, 3); - sub_806BF24(&arr[4], 2, 3, 0); - } - else - { - sub_806BA94(arr[4], arr[5], 1, 3); - } - } - else if (gPlayerPartyCount > 2) - { - sub_806BA94(arr[4], arr[5], 0, 3); - sub_806BF24(&arr[4], 2, 3, 0); - } - else - { - sub_806BA94(arr[4], arr[5], 1, 3); - } - break; - case 4: - if (!IsDoubleBattle()) - { - if (gPlayerPartyCount > 3) - { - sub_806BA94(arr[6], arr[7], 0, 3); - sub_806BF24(&arr[6], 3, 3, 0); - } - else - { - sub_806BA94(arr[6], arr[7], 1, 3); - } - } - else if (IsLinkDoubleBattle() == TRUE) - { - if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) - { - sub_806BA94(arr[6], arr[7], 0, 3); - sub_806BF24(&arr[6], 3, 3, 0); - } - else - { - sub_806BA94(arr[6], arr[7], 1, 3); - } - } - else if (gPlayerPartyCount > 3) - { - sub_806BA94(arr[6], arr[7], 0, 3); - sub_806BF24(&arr[6], 3, 3, 0); - } - else - { - sub_806BA94(arr[6], arr[7], 1, 3); - } - break; - case 5: - if (!IsDoubleBattle()) - { - if (gPlayerPartyCount > 4) - { - sub_806BA94(arr[8], arr[9], 0, 3); - sub_806BF24(&arr[8], 4, 3, 0); - } - else - { - sub_806BA94(arr[8], arr[9], 1, 3); - } - } - else if (IsLinkDoubleBattle() == TRUE) - { - if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) - { - sub_806BA94(arr[8], arr[9], 0, 4); - sub_806BF24(&arr[8], 4, 4, 0); - } - else - { - sub_806BA94(arr[8], arr[9], 1, 4); - } - } - else if (gPlayerPartyCount > 4) - { - sub_806BA94(arr[8], arr[9], 0, 3); - sub_806BF24(&arr[8], 4, 3, 0); - } - else - { - sub_806BA94(arr[8], arr[9], 1, 3); - } - break; - case 6: - if (!IsDoubleBattle()) - { - if (gPlayerPartyCount > 5) - { - sub_806BA94(arr[10], arr[11], 0, 3); - sub_806BF24(&arr[10], 5, 3, 0); - } - else - { - sub_806BA94(arr[10], arr[11], 1, 3); - } - } - else if (IsLinkDoubleBattle() == TRUE) - { - if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) - { - sub_806BA94(arr[10], arr[11], 0, 4); - sub_806BF24(&arr[10], 5, 4, 0); - } - else - { - sub_806BA94(arr[10], arr[11], 1, 4); - } - } - else if (gPlayerPartyCount > 5) - { - sub_806BA94(arr[10], arr[11], 0, 3); - sub_806BF24(&arr[10], 5, 3, 0); - } - else - { - sub_806BA94(arr[10], arr[11], 1, 3); - } - break; - case 7: - if (ewram1B000.menuType == PARTY_MENU_TYPE_BATTLE_TOWER) - sub_806BB9C(1); - sub_806BBEC(1); - break; - case 8: - ewram1B000.unk261 = 2; - return TRUE; - } - - return FALSE; -} - -#ifdef NONMATCHING -void sub_806B908(void) -{ - memset(&gBGTilemapBuffers[2], 0, 0x800); - gPartyMenuType = PARTY_MENU_LAYOUT_MULTI_BATTLE; - sub_806B9A4(gUnknown_083769C0[12], gUnknown_083769C0[13], 3); - - if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES)) - sub_806BA94(gUnknown_083769C0[16], gUnknown_083769C0[17], 0, 3); - else - sub_806BA94(gUnknown_083769C0[16], gUnknown_083769C0[17], 1, 3); - - if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) - sub_806BA94(gUnknown_083769C0[18], gUnknown_083769C0[19], 0, 3); - else - sub_806BA94(gUnknown_083769C0[18], gUnknown_083769C0[19], 1, 3); - - ewram1B000.unk261 = 2; -} -#else -__attribute__((naked)) -void sub_806B908(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - ldr r0, _0806B948 @ =gBGTilemapBuffers + 0x1000\n\ - movs r2, 0x80\n\ - lsls r2, 4\n\ - movs r1, 0\n\ - bl memset\n\ - ldr r1, _0806B94C @ =gPartyMenuType\n\ - movs r0, 0x3\n\ - strb r0, [r1]\n\ - ldr r0, _0806B950 @ =gUnknown_083769A8\n\ - adds r4, r0, 0\n\ - adds r4, 0x24\n\ - ldr r5, _0806B954 @ =gPlayerParty + 1 * 0x64\n\ - ldrb r0, [r4]\n\ - ldrb r1, [r4, 0x1]\n\ - movs r2, 0x3\n\ - bl sub_806B9A4\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806B958\n\ - ldrb r0, [r4, 0x4]\n\ - ldrb r1, [r4, 0x5]\n\ - movs r2, 0\n\ - movs r3, 0x3\n\ - bl sub_806BA94\n\ - b _0806B964\n\ - .align 2, 0\n\ -_0806B948: .4byte gBGTilemapBuffers + 0x1000\n\ -_0806B94C: .4byte gPartyMenuType\n\ -_0806B950: .4byte gUnknown_083769A8\n\ -_0806B954: .4byte gPlayerParty + 1 * 0x64\n\ -_0806B958:\n\ - ldrb r0, [r4, 0x4]\n\ - ldrb r1, [r4, 0x5]\n\ - movs r2, 0x1\n\ - movs r3, 0x3\n\ - bl sub_806BA94\n\ -_0806B964:\n\ - adds r0, r5, 0\n\ - adds r0, 0x64\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806B980\n\ - ldrb r0, [r4, 0x6]\n\ - ldrb r1, [r4, 0x7]\n\ - movs r2, 0\n\ - movs r3, 0x3\n\ - bl sub_806BA94\n\ - b _0806B98C\n\ -_0806B980:\n\ - ldrb r0, [r4, 0x6]\n\ - ldrb r1, [r4, 0x7]\n\ - movs r2, 0x1\n\ - movs r3, 0x3\n\ - bl sub_806BA94\n\ -_0806B98C:\n\ - ldr r0, _0806B99C @ =gSharedMem + 0x1B000\n\ - ldr r1, _0806B9A0 @ =0x00000261\n\ - adds r0, r1\n\ - movs r1, 0x2\n\ - strb r1, [r0]\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806B99C: .4byte gSharedMem + 0x1B000\n\ -_0806B9A0: .4byte 0x00000261\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void sub_806B9A4(s16 a, u16 b, u8 c) -{ - u8 i; - u16 var1 = b * 32; - - for (i = 0; i <= 6; i++) - { - u8 j = 0; - - if (a <= 0x1F) - { - for (; j <= 10 && a + j <= 0x1F; j++) - { - if (a + j >= 0) - gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (c << 12) | gUnknown_083769D8[i * 11 + j]; - } - } - } -} - -void sub_806BA34(s16 a, u16 b) -{ - u8 i; - u16 var1 = b * 32; - - for (i = 0; i <= 6; i++) - { - u8 j = 0; - - if (a <= 0x1F) - { - for (; j <= 10 && a + j <= 0x1F; j++) - { - if (a + j >= 0) - gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; - } - } - } -} - -void sub_806BA94(s16 a, u16 b, u8 c, u8 d) -{ - u8 i; - const u8 *arr; - u16 var1; - - if (c == 0) - arr = gUnknown_08376A25; - else - arr = gUnknown_08376A5E; - - var1 = b * 32; - - for (i = 0; i < 3; i++) - { - u8 j = 0; - - if (a <= 0x1F) - { - while (j <= 0x12 && a + j <= 0x1F) - { - if (a + j >= 0) - { - gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (d << 12) | arr[i * 19 + j]; - } - - j++; - } - } - } -} - -void sub_806BB3C(s16 a, u16 b) -{ - u8 i; - u16 var1 = (b * 32); - - for (i = 0; i < 3; i++) - { - u8 j = 0; - - if (a <= 0x1F) - { - for (; j <= 0x12 && a + j <= 0x1F; j++) - { - if (a + j >= 0) - { - gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; - } - } - } - } -} - -void sub_806BB9C(u8 a) -{ - u8 i; - u16 arr[12] = - { - 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - }; - u16 *vramPtr = (u16 *)(BG_VRAM + 0x3C30); - - for (i = 0; i < PARTY_SIZE; i++) - { - vramPtr[i] = arr[i] + (a << 12); - vramPtr[i + 0x20] = arr[i + PARTY_SIZE] + (a << 12); - } -} - -void sub_806BBEC(u8 a) -{ - u8 i; - u16 arr[12] = - { - 0x2A, 0x0B, 0x0C, 0x0D, 0x0E, 0x2F, - 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, - }; - u16 *vramPtr = (u16 *)(BG_VRAM + 0x3CB0); - - for (i = 0; i < PARTY_SIZE; i++) - { - vramPtr[i] = arr[i] + (a << 12); - vramPtr[i + 0x20] = arr[i + PARTY_SIZE] + (a << 12); - } -} - -void sub_806BC3C(u8 monIndex, u8 b) -{ - u16 *vramPtr = gUnknown_08376918[IsDoubleBattle()][monIndex]; - u8 i; - u16 var1; - - for (i = 0, var1 = (b / 7) * 32; i <= PARTY_SIZE; i++) - { - u32 offset = i + var1; - vramPtr[i] = gUnknown_08E9A300[offset] + 0x10C; - vramPtr[i + 0x20] = gUnknown_08E9A300[offset + 0x20] + 0x10C; - } - - // Some dead code was likely optimized out, but the compiler still think r8 was used. - asm("":::"r8"); -} - -void unref_sub_806BCB8(u8 a) -{ - u8 i; - - for (i = 0; i < gPlayerPartyCount; i++) - sub_806BC3C(i, a); -} - -// This is ultimately unreferenced, since it's caller is unreferenced. -void sub_806BCE8() -{ - u8 i; - - for (i = 0; i < gPlayerPartyCount; i++) - { - if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - { - switch (GetMonGender(&gPlayerParty[i])) - { - case MON_MALE: - sub_806BC3C(i, 0x54); - break; - case MON_FEMALE: - sub_806BC3C(i, 0x62); - break; - default: - sub_806BC3C(i, 0x46); - break; - } - } - else - { - sub_806BC3C(i, 0x46); - } - } -} - -u8 sub_806BD58(u8 taskId, u8 b) -{ - u8 spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - sub_806CA18(taskId, spriteId); - return 1; -} - -#ifdef NONMATCHING -u16 HandleDefaultPartyMenuInput(u8 taskId) -{ - s8 menuDirectionPressed = 0x0; - - switch (gMain.newAndRepeatedKeys) - { - case DPAD_UP: - menuDirectionPressed = -1; - break; - case DPAD_DOWN: - menuDirectionPressed = 1; - break; - case DPAD_LEFT: - menuDirectionPressed = -2; - break; - case DPAD_RIGHT: - menuDirectionPressed = 2; - break; - } - - if (menuDirectionPressed == 0) - { - u8 var1 = sub_80F92BC(); - switch (var1) - { - case 1: - menuDirectionPressed = -1; - break; - case 2: - menuDirectionPressed = 1; - break; - } - - if (menuDirectionPressed == 0) - { - if ((gMain.newKeys & A_BUTTON) && gSprites[sub_806CA00(taskId)].data[0] == 7) - { - // Selected "CANCEL" - return B_BUTTON; - } - else - { - return gMain.newKeys & (A_BUTTON | B_BUTTON); - } - } - } - - ChangePartyMenuSelection(taskId, menuDirectionPressed); - return gMain.newAndRepeatedKeys; -} -#else -__attribute__((naked)) -u16 HandleDefaultPartyMenuInput(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r4, 0\n\ - ldr r0, _0806BD9C @ =gMain\n\ - ldrh r0, [r0, 0x30]\n\ - cmp r0, 0x20\n\ - beq _0806BDB2\n\ - cmp r0, 0x20\n\ - bgt _0806BDA0\n\ - cmp r0, 0x10\n\ - beq _0806BDB6\n\ - b _0806BDB8\n\ - .align 2, 0\n\ -_0806BD9C: .4byte gMain\n\ -_0806BDA0:\n\ - cmp r0, 0x40\n\ - beq _0806BDAA\n\ - cmp r0, 0x80\n\ - beq _0806BDAE\n\ - b _0806BDB8\n\ -_0806BDAA:\n\ - movs r4, 0xFF\n\ - b _0806BDB8\n\ -_0806BDAE:\n\ - movs r4, 0x1\n\ - b _0806BDB8\n\ -_0806BDB2:\n\ - movs r4, 0xFE\n\ - b _0806BDB8\n\ -_0806BDB6:\n\ - movs r4, 0x2\n\ -_0806BDB8:\n\ - lsls r0, r4, 24\n\ - cmp r0, 0\n\ - bne _0806BDDC\n\ - bl sub_80F92BC\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - beq _0806BDD0\n\ - cmp r0, 0x2\n\ - beq _0806BDD4\n\ - b _0806BDD6\n\ -_0806BDD0:\n\ - movs r4, 0xFF\n\ - b _0806BDD6\n\ -_0806BDD4:\n\ - movs r4, 0x1\n\ -_0806BDD6:\n\ - lsls r0, r4, 24\n\ - cmp r0, 0\n\ - beq _0806BDF0\n\ -_0806BDDC:\n\ - asrs r1, r0, 24\n\ - adds r0, r5, 0\n\ - bl ChangePartyMenuSelection\n\ - ldr r0, _0806BDEC @ =gMain\n\ - ldrh r0, [r0, 0x30]\n\ - b _0806BE2C\n\ - .align 2, 0\n\ -_0806BDEC: .4byte gMain\n\ -_0806BDF0:\n\ - ldr r0, _0806BE1C @ =gMain\n\ - ldrh r1, [r0, 0x2E]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0806BE24\n\ - ldr r4, _0806BE20 @ =gSprites\n\ - adds r0, r5, 0\n\ - bl sub_806CA00\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 4\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4\n\ - movs r2, 0x2E\n\ - ldrsh r0, [r1, r2]\n\ - cmp r0, 0x7\n\ - bne _0806BE24\n\ - movs r0, 0x2\n\ - b _0806BE2C\n\ - .align 2, 0\n\ -_0806BE1C: .4byte gMain\n\ -_0806BE20: .4byte gSprites\n\ -_0806BE24:\n\ - ldr r0, _0806BE34 @ =gMain\n\ - ldrh r1, [r0, 0x2E]\n\ - movs r0, 0x3\n\ - ands r0, r1\n\ -_0806BE2C:\n\ - pop {r4,r5}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0806BE34: .4byte gMain\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -u16 HandleBattleTowerPartyMenuInput(u8 taskId) -{ - u8 menuDirectionPressed = 0x0; - - switch (gMain.newAndRepeatedKeys) - { - case DPAD_UP: - menuDirectionPressed = 0xFF; - break; - case DPAD_DOWN: - menuDirectionPressed = 0x1; - break; - case DPAD_LEFT: - menuDirectionPressed = 0xFE; - break; - case DPAD_RIGHT: - menuDirectionPressed = 0x2; - break; - } - - if (menuDirectionPressed == 0) - { - switch (sub_80F92BC()) - { - case 1: - menuDirectionPressed = 0xFF; - break; - case 2: - menuDirectionPressed = 0x1; - break; - } - } - - if (gMain.newKeys & START_BUTTON) - { - SelectBattleTowerOKButton(taskId); - return START_BUTTON; - } - else - { - s8 signedMenuDirection = menuDirectionPressed; - if (signedMenuDirection) - { - ChangeBattleTowerPartyMenuSelection(taskId, signedMenuDirection); - return gMain.newAndRepeatedKeys; - } - else - { - if (gMain.newKeys & A_BUTTON) - { - if (gSprites[sub_806CA00(taskId)].data[0] == 7) - return B_BUTTON; - } - } - } - - return gMain.newKeys & (A_BUTTON | B_BUTTON); -} - -void task_pc_turn_off(const u8 *a, u8 b) -{ - if (a[0]) - sub_806BA94(a[0], a[1], 0, b); - else - sub_806B9A4(a[0], a[1], b); -} - -void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d) -{ - if (GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES) && GetMonData(&gPlayerParty[monIndex], MON_DATA_HP) == 0) - c = PARTY_SIZE - 1; - - if (d == 1) - c += 4; - - task_pc_turn_off(a, c); -} - -void ChangePartyMenuSelection(u8 taskId, s8 directionPressed) -{ - bool8 isLinkDoubleBattle; - u8 spriteId = sub_806CA00(taskId); - u8 menuIndex = gSprites[spriteId].data[0]; - - UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); - - isLinkDoubleBattle = IsLinkDoubleBattle(); - if (isLinkDoubleBattle == 1) - { - if (menuIndex == 0 || menuIndex == 2 || menuIndex == 3) - sub_806BF24(&gUnknown_083769C0[menuIndex * 2], menuIndex, 3, 0); - if (menuIndex == 1 || menuIndex == 4 || menuIndex == 5) - sub_806BF24(&gUnknown_083769C0[menuIndex * 2], menuIndex, 4, 0); - if (menuIndex == 7) - sub_806BBEC(1); - - ChangeLinkDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); - - if (gSprites[spriteId].data[0] == 0 || gSprites[spriteId].data[0] == 2 || gSprites[spriteId].data[0] == 3) - sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1); - if (gSprites[spriteId].data[0] == 1 || gSprites[spriteId].data[0] == 4 || gSprites[spriteId].data[0] == 5) - sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 4, 1); - if (gSprites[spriteId].data[0] == 7) - sub_806BBEC(2); - - ewram1B000.unk261 = 2; - - gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data[0]].x; - gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data[0]].y; - } - else - { - u8 isDoubleBattle = IsDoubleBattle(); - - if (menuIndex < PARTY_SIZE) - sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + menuIndex * 2], menuIndex, 3, 0); - else - sub_806BBEC(1); - - if (!isDoubleBattle) - ChangeDefaultPartyMenuSelection(spriteId, menuIndex, directionPressed); - else - ChangeDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); - - if (gSprites[spriteId].data[0] < PARTY_SIZE) - sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1); - else - sub_806BBEC(2); - - ewram1B000.unk261 = 2; - - gSprites[spriteId].pos1.x = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data[0]].x; - gSprites[spriteId].pos1.y = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data[0]].y; - } - - UpdateMonIconFrame_806DA44(taskId, gSprites[spriteId].data[0], 1); - - if (menuIndex != gSprites[spriteId].data[0]) - PlaySE(SE_SELECT); -} - -void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) -{ - u8 nextIndex; - s8 menuMovement = directionPressed + 2; - - switch (menuMovement) - { - case 2: // no movement - gSprites[spriteId].data[1] = 0; - break; - case 1: // moving up - if (menuIndex == 0) - { - gSprites[spriteId].data[0] = 7; - } - else if (menuIndex == 7) - { - gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - } - else - { - s8 diff = directionPressed; - gSprites[spriteId].data[0] += diff; - } - gSprites[spriteId].data[1] = 0; - break; - case 3: // moving down - if (menuIndex == gPlayerPartyCount - 1) - { - gSprites[spriteId].data[0] = 7; - } - else if (menuIndex == 7) - { - gSprites[spriteId].data[0] = 0; - } - else - { - s8 diff = directionPressed; - gSprites[spriteId].data[0] += diff; - } - gSprites[spriteId].data[1] = 0; - break; - case 4: // moving right - if (gPlayerPartyCount > 1 && menuIndex == 0) - { - if (gSprites[spriteId].data[1] == 0) - gSprites[spriteId].data[1] = 1; - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - } - break; - case 0: // moving left - // Only move the selection to the left side if one of the mons in the right-hand column are currently selected - nextIndex = menuIndex - 1; - if (nextIndex <= 4) - { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = menuIndex; - } - break; - } -} - -void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) -{ - u8 var1; - s8 menuMovement = directionPressed + 2; - - switch(menuMovement) - { - case 2: // no movement - gSprites[spriteId].data[1] = 0; - break; - case 3: // moving down - if (menuIndex == 7) - { - gSprites[spriteId].data[0] = 0; - } - else if (menuIndex == gPlayerPartyCount - 1) - { - gSprites[spriteId].data[0] = 7; - } - else - { - s8 diff = directionPressed; - gSprites[spriteId].data[0] += diff; - } - gSprites[spriteId].data[1] = 0; - break; - case 1: // moving up - if (menuIndex == 0) - { - gSprites[spriteId].data[0] = 7; - } - else if (menuIndex == 7) - { - gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - } - else - { - s8 diff = directionPressed; - gSprites[spriteId].data[0] += diff; - } - gSprites[spriteId].data[1] = 0; - break; - case 4: // moving right - if (menuIndex == 0) - { - if (gPlayerPartyCount > 2) - { - u16 var1 = gSprites[spriteId].data[1] - 2; - if (var1 > 1) - gSprites[spriteId].data[0] = 2; - else - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - } - } - else if (menuIndex == 1) - { - if (gPlayerPartyCount > 4) - { - u16 var1 = gSprites[spriteId].data[1] - 4; - if (var1 <= 1) - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - else - gSprites[spriteId].data[0] = 4; - } - } - break; - case 0: // moving left - var1 = menuIndex - 2; - if (var1 <= 1) - { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = menuIndex; - } - else - { - u8 var2 = menuIndex - 4; - if (var2 <= 1) - { - gSprites[spriteId].data[0] = 1; - gSprites[spriteId].data[1] = menuIndex; - } - } - break; - } -} - -#ifdef NONMATCHING -void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) -{ - s8 menuMovement; - u16 var1; - u8 var2; - - menuMovement = directionPressed + 2; - switch (menuMovement) - { - case 2: // no movement - gSprites[spriteId].data[1] = 0; - break; - case 3: // moving down - if (menuIndex == 7) { - gSprites[spriteId].data[0] = 0; - } else { - while (menuIndex != PARTY_SIZE - 1) { - menuIndex++; - if (GetMonData(&gPlayerParty[menuIndex], MON_DATA_SPECIES)) - { - gSprites[spriteId].data[0] = menuIndex; - gSprites[spriteId].data[1] = 0; - return; - } - } - - gSprites[spriteId].data[0] = 7; - } - - gSprites[spriteId].data[1] = 0; - break; - case 1: // moving up - while (menuIndex != 0) { - menuIndex--; - if (menuIndex != PARTY_SIZE && GetMonData(gPlayerParty[menuIndex], MON_DATA_SPECIES)) - { - gSprites[spriteId].data[0] = menuIndex; - gSprites[spriteId].data[1] = 0; - return; - } - } - - gSprites[spriteId].data[0] = 7; - gSprites[spriteId].data[1] = 0; - break; - case 4: // moving right - if (menuIndex == 0) { - var1 = gSprites[spriteId].data[1] - 2; - if (var1 > 1) { - if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) { - gSprites[spriteId].data[0] = 2; - } else if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) { - gSprites[spriteId].data[0] = 3; - } - } else { - gSprites[spriteId].data[0] = 1; - } - } else if (menuIndex == 1) { - var1 = gSprites[spriteId].data[1] - 4; - if (var1 <= 1) { - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - } else { - if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) { - gSprites[spriteId].data[0] = 4; - } else if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) { - gSprites[spriteId].data[0] = 5; - } - } - } - break; - case 0: // moving left - var2 = menuIndex - 2; - if (var2 <= 1) { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = menuIndex; - } else { - var2 = menuIndex - 4; - if (var2 <= 1) { - gSprites[spriteId].data[0] = 1; - gSprites[spriteId].data[1] = menuIndex; - } - } - - break; - } -} - -#else -__attribute__((naked)) -void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - lsls r1, 24\n\ - lsrs r4, r1, 24\n\ - lsls r2, 24\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - adds r2, r0\n\ - asrs r0, r2, 24\n\ - cmp r0, 0x4\n\ - bls _0806C4AA\n\ - b _0806C64E\n\ -_0806C4AA:\n\ - lsls r0, 2\n\ - ldr r1, _0806C4B4 @ =_0806C4B8\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0806C4B4: .4byte _0806C4B8\n\ - .align 2, 0\n\ -_0806C4B8:\n\ - .4byte _0806C618\n\ - .4byte _0806C524\n\ - .4byte _0806C4CC\n\ - .4byte _0806C4E0\n\ - .4byte _0806C57C\n\ -_0806C4CC:\n\ - ldr r0, _0806C4DC @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - movs r0, 0\n\ - strh r0, [r1, 0x30]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C4DC: .4byte gSprites\n\ -_0806C4E0:\n\ - cmp r4, 0x7\n\ - bne _0806C4FC\n\ - ldr r2, _0806C4F8 @ =gSprites\n\ - lsls r3, r5, 4\n\ - adds r0, r3, r5\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - movs r1, 0\n\ - strh r1, [r0, 0x2E]\n\ - adds r1, r2, 0\n\ - adds r6, r3, 0\n\ - b _0806C566\n\ - .align 2, 0\n\ -_0806C4F8: .4byte gSprites\n\ -_0806C4FC:\n\ - lsls r6, r5, 4\n\ - b _0806C518\n\ -_0806C500:\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - movs r0, 0x64\n\ - muls r0, r4\n\ - ldr r1, _0806C520 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0806C528\n\ -_0806C518:\n\ - cmp r4, 0x5\n\ - bne _0806C500\n\ - b _0806C558\n\ - .align 2, 0\n\ -_0806C520: .4byte gPlayerParty\n\ -_0806C524:\n\ - lsls r6, r5, 4\n\ - b _0806C554\n\ -_0806C528:\n\ - ldr r1, _0806C534 @ =gSprites\n\ - adds r0, r6, r5\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - strh r4, [r0, 0x2E]\n\ - b _0806C566\n\ - .align 2, 0\n\ -_0806C534: .4byte gSprites\n\ -_0806C538:\n\ - subs r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x6\n\ - beq _0806C554\n\ - movs r0, 0x64\n\ - muls r0, r4\n\ - ldr r1, _0806C574 @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0806C528\n\ -_0806C554:\n\ - cmp r4, 0\n\ - bne _0806C538\n\ -_0806C558:\n\ - ldr r0, _0806C578 @ =gSprites\n\ - adds r1, r6, r5\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - movs r2, 0x7\n\ - strh r2, [r1, 0x2E]\n\ - adds r1, r0, 0\n\ -_0806C566:\n\ - adds r0, r6, r5\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - movs r1, 0\n\ - strh r1, [r0, 0x30]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C574: .4byte gPlayerParty\n\ -_0806C578: .4byte gSprites\n\ -_0806C57C:\n\ - cmp r4, 0\n\ - bne _0806C5C8\n\ - ldr r0, _0806C5AC @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r4, r1, r0\n\ - ldrh r1, [r4, 0x30]\n\ - subs r0, r1, 0x2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bls _0806C5E2\n\ - ldr r5, _0806C5B0 @ =gPlayerParty + 2 * 0x64\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806C5B4\n\ - movs r0, 0x2\n\ - strh r0, [r4, 0x2E]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C5AC: .4byte gSprites\n\ -_0806C5B0: .4byte gPlayerParty + 2 * 0x64\n\ -_0806C5B4:\n\ - adds r0, r5, 0\n\ - adds r0, 0x64\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806C64E\n\ - movs r0, 0x3\n\ - strh r0, [r4, 0x2E]\n\ - b _0806C64E\n\ -_0806C5C8:\n\ - cmp r4, 0x1\n\ - bne _0806C64E\n\ - ldr r0, _0806C5E8 @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r4, r1, r0\n\ - ldrh r1, [r4, 0x30]\n\ - subs r0, r1, 0x4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bhi _0806C5EC\n\ -_0806C5E2:\n\ - strh r1, [r4, 0x2E]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C5E8: .4byte gSprites\n\ -_0806C5EC:\n\ - ldr r5, _0806C600 @ =gPlayerParty + 4 * 0x64\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806C604\n\ - movs r0, 0x4\n\ - strh r0, [r4, 0x2E]\n\ - b _0806C64E\n\ - .align 2, 0\n\ -_0806C600: .4byte gPlayerParty + 4 * 0x64\n\ -_0806C604:\n\ - adds r0, r5, 0\n\ - adds r0, 0x64\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0806C64E\n\ - movs r0, 0x5\n\ - strh r0, [r4, 0x2E]\n\ - b _0806C64E\n\ -_0806C618:\n\ - subs r0, r4, 0x2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bhi _0806C634\n\ - ldr r0, _0806C630 @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - movs r0, 0\n\ - b _0806C64A\n\ - .align 2, 0\n\ -_0806C630: .4byte gSprites\n\ -_0806C634:\n\ - subs r0, r4, 0x4\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bhi _0806C64E\n\ - ldr r0, _0806C654 @ =gSprites\n\ - lsls r1, r5, 4\n\ - adds r1, r5\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - movs r0, 0x1\n\ -_0806C64A:\n\ - strh r0, [r1, 0x2E]\n\ - strh r4, [r1, 0x30]\n\ -_0806C64E:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806C654: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed) -{ - u16 newMenuIndex; - u8 newMenuIndex2; - u8 newMenuIndex3; - s8 menuMovement; - u8 spriteId = sub_806CA00(taskId); - u8 menuIndex = gSprites[spriteId].data[0]; - - UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); - - if (menuIndex < PARTY_SIZE) - sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); - else if (menuIndex == PARTY_SIZE) - sub_806BB9C(1); - else - sub_806BBEC(1); - - menuMovement = directionPressed + 2; - switch (menuMovement) - { - case 2: // no movement - gSprites[spriteId].data[1] = 0; - break; - case 1: // moving up - if (menuIndex == 0) - gSprites[spriteId].data[0] = 7; - else if (menuIndex == PARTY_SIZE) - gSprites[spriteId].data[0] = gPlayerPartyCount - 1; - else - gSprites[spriteId].data[0] += directionPressed; - gSprites[spriteId].data[1] = 0; - break; - case 3: // moving down - if (menuIndex == gPlayerPartyCount - 1) - gSprites[spriteId].data[0] = 6; - else if (menuIndex == 7) - gSprites[spriteId].data[0] = 0; - else - gSprites[spriteId].data[0] += directionPressed; - gSprites[spriteId].data[1] = 0; - break; - case 4: // moving right - if (gPlayerPartyCount > 1 && menuIndex == 0) - { - if (gSprites[spriteId].data[1] == 0) - gSprites[spriteId].data[1] = 1; - gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; - } - break; - case 0: // moving left - newMenuIndex3 = menuIndex - 1; - if (newMenuIndex3 <= 4) - { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = menuIndex; - } - break; - } - - gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data[0]].x; - gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data[0]].y; - - - newMenuIndex = gSprites[spriteId].data[0]; - if (gSprites[spriteId].data[0] < PARTY_SIZE) - sub_806BF24(&gUnknown_083769A8[gSprites[spriteId].data[0] * 2], newMenuIndex, 3, 1); - else if (gSprites[spriteId].data[0] == PARTY_SIZE) - sub_806BB9C(2); - else - sub_806BBEC(2); - - ewram1B000.unk261 = 2; - - newMenuIndex2 = gSprites[spriteId].data[0]; - UpdateMonIconFrame_806DA44(taskId, newMenuIndex2, 1); - - if (menuIndex != gSprites[spriteId].data[0]) - PlaySE(SE_SELECT); -} - -// Selects the "OK" button in the Battle Tower party menu. -void SelectBattleTowerOKButton(u8 taskId) -{ - u8 spriteId = sub_806CA00(taskId); - - u8 menuIndex = gSprites[spriteId].data[0]; - if (menuIndex != 6) - { - UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); - - if (menuIndex < PARTY_SIZE) - sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); - else - sub_806BBEC(1); - - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].data[0] = 6; - gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][6].x; - gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][6].y; - - sub_806BB9C(2); - - ewram1B000.unk261 = 2; - PlaySE(SE_SELECT); - } -} - -void sub_806C92C(u8 spriteId) -{ - u8 menuIndex1 = gSprites[spriteId].data[0]; - u8 menuIndex2 = gSprites[spriteId].data[1]; - - if (!IsDoubleBattle()) - { - if (menuIndex1 < 1) - { - if (menuIndex2 < 1) - menuIndex2 = 1; - } - else - { - if (menuIndex2 >= 1) - menuIndex2 = 0; - } - } - else - { - if (menuIndex1 < 2) - { - if (menuIndex2 < 2) - menuIndex2 = 2; - } - else - { - if (menuIndex2 >= 2) - menuIndex2 = 0; - } - } - - gSprites[spriteId].data[1] = menuIndex2; -} - -void sub_806C994(u8 taskId, u8 b) -{ - u8 spriteId = sub_806CA00(taskId); - - gSprites[spriteId].data[0] = b; - sub_806C92C(spriteId); -} - -void sub_806C9C4(u8 taskId, u8 spriteId) -{ - u8 spriteId2 = sub_806CA00(taskId); - - gSprites[spriteId].pos1.x = gSprites[spriteId2].pos1.x; - gSprites[spriteId].pos1.y = gSprites[spriteId2].pos1.y; - gSprites[spriteId].data[0] = gSprites[spriteId2].data[0]; -} - -u8 sub_806CA00(u8 taskId) -{ - return gTasks[taskId].data[3] >> 8; -} - -void sub_806CA18(u8 taskId, u8 b) -{ - u8 var1 = gTasks[taskId].data[3]; - gTasks[taskId].data[3] = var1 | (b << 8); -} - -u8 sub_806CA38(u8 taskId) -{ - u8 spriteId = sub_806CA00(taskId); - return gSprites[spriteId].data[0]; -} - -void SetupDefaultPartyMenuSwitchPokemon(u8 taskId) -{ - gTasks[taskId].func = TaskDummy; - ewram01000.unk0 = taskId; - - CreateTask(HandlePartyMenuSwitchPokemonInput, 0); - ewram01000.unk1 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); - - sub_806C9C4(taskId, ewram01000.unk1); - ewram01000.unk2 = sub_806CA00(taskId); - - PrintPartyMenuPromptText(ewram1B000_alt.unk272, 0); - - sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data[0] * 2], gSprites[ewram01000.unk1].data[0], 6, 0); - ewram1B000.unk261 = 2; -} - -// Handles changing the the current mon selection when choosing mons to swap places. -void ChangePartyMenuSwitchPokemonSelection(u8 taskId, s16 menuDirectionPressed) -{ - struct Sprite *sprite1 = &gSprites[ewram01000.unk1]; - struct Sprite *sprite2 = &gSprites[ewram01000.unk2]; - - ChangePartyMenuSelection(taskId, menuDirectionPressed); - - if (sprite1->data[0] != sprite2->data[0]) - sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 1); - else - sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 0); -} - -void HandlePartyMenuSwitchPokemonInput(u8 taskId) -{ - switch (gMain.newAndRepeatedKeys) - { - case DPAD_UP: - ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, -1); - break; - case DPAD_DOWN: - ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, 1); - break; - case DPAD_LEFT: - ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, -2); - break; - case DPAD_RIGHT: - ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, 2); - break; - } - - if (gMain.newKeys & A_BUTTON) - { - PlaySE(5); - gTasks[taskId].func = ewram01000.unkC; - gTasks[taskId].func(taskId); - } - else if (gMain.newKeys == B_BUTTON) - { - PlaySE(5); - sub_806CD44(taskId); - } -} - -void sub_806CC2C(u8 taskId) -{ - DestroySprite(&gSprites[ewram01000.unk1]); - PrintPartyMenuPromptText(0, 0); - - ewram1B000.unk261 = 2; - SwitchTaskToFollowupFunc(ewram01000.unk0); - DestroyTask(taskId); -} - -void sub_806CC74(u8 taskId) -{ - sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk2].data[0] * 2], gSprites[ewram01000.unk2].data[0], 3, 1); - sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data[0] * 2], gSprites[ewram01000.unk1].data[0], 3, 0); - sub_806CC2C(taskId); -} - -void sub_806CCE4() -{ - u8 monIndex1 = gSprites[ewram01000.unk1].data[0]; - u8 monIndex2 = gSprites[ewram01000.unk2].data[0]; - - if (monIndex1 <= 5) - sub_806BF24(&gUnknown_083769A8[monIndex1 * 2], monIndex1, 3, 0); - if (monIndex2 <= 5) - sub_806BF24(&gUnknown_083769A8[monIndex2 * 2], monIndex2, 3, 1); -} - -void sub_806CD44(u8 taskId) -{ - sub_806CCE4(); - sub_806CC2C(taskId); -} - -void sub_806CD5C(u8 taskId) -{ - u8 monIndex1 = gSprites[ewram01000.unk1].data[0]; - u8 monIndex2 = gSprites[ewram01000.unk2].data[0]; - - if (monIndex1 == monIndex2 || monIndex1 == 7 || monIndex2 == 7) - { - sub_806CD44(taskId); - } - else - { - u8 var1; - - sub_806D5B8(monIndex1); - sub_806D5B8(monIndex2); - - if (monIndex1 > monIndex2) - { - ewram01000.unk5 = monIndex2; - ewram01000.unk6 = monIndex1; - } - else - { - ewram01000.unk5 = monIndex1; - ewram01000.unk6 = monIndex2; - } - - ewram01000.unk3 = GetMonIconSpriteId(ewram01000.unk0, ewram01000.unk5); - ewram01000.unk4 = GetMonIconSpriteId(ewram01000.unk0, ewram01000.unk6); - - var1 = ewram01000.unk5; - if (!var1) - { - gSprites[ewram01000.unk3].data[0] = -8; - gSprites[ewram01000.unk3].data[2] = -0xA8; - ewram01000.unk8 = var1; - ewram01000.unkA = 11; - - gTasks[taskId].func = sub_806D014; - ewram1B000.unk261 = 1; - } - else - { - gSprites[ewram01000.unk3].data[0] = 8; - gSprites[ewram01000.unk3].data[2] = 0xA8; - ewram01000.unk8 = 11; - ewram01000.unkA = 11; - - gTasks[taskId].func = sub_806D118; - ewram1B000.unk261 = 1; - } - - gSprites[ewram01000.unk3].callback = SpriteCB_sub_806D37C; - - gSprites[ewram01000.unk4].data[0] = 8; - gSprites[ewram01000.unk4].data[2] = 0xA8; - gSprites[ewram01000.unk4].callback = SpriteCB_sub_806D37C; - - gSprites[ewram01000.unk3].callback(&gSprites[ewram01000.unk3]); - gSprites[ewram01000.unk4].callback(&gSprites[ewram01000.unk4]); - } -} - -void SwapValues_s16(s16 *a, s16 *b) -{ - s16 temp = *a; - *a = *b; - *b = temp; -} - -#ifdef NONMATCHING -void sub_806CF04(void) -{ - SwapValues_s16(&gSprites[ewram01000.unk3].pos1.x, &gSprites[ewram01000.unk4].pos1.x); - SwapValues_s16(&gSprites[ewram01000.unk3].pos1.y, &gSprites[ewram01000.unk4].pos1.y); - SwapValues_s16(&gSprites[ewram01000.unk3].pos2.x, &gSprites[ewram01000.unk4].pos2.x); - SwapValues_s16(&gSprites[ewram01000.unk3].data[0], &gSprites[ewram01000.unk4].data[0]); - - gSprites[ewram01000.unk3].callback = SpriteCB_sub_806D37C; - gSprites[ewram01000.unk4].callback = SpriteCB_sub_806D37C; -} -#else -__attribute__((naked)) -void sub_806CF04(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - ldr r4, _0806CF94 @ =gSharedMem + 0x1000\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r5, _0806CF98 @ =gSprites + 0x20\n\ - adds r0, r5\n\ - ldrb r2, [r4, 0x4]\n\ - lsls r1, r2, 4\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - bl SwapValues_s16\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r3, r5, 0x2\n\ - adds r0, r3\n\ - ldrb r2, [r4, 0x4]\n\ - lsls r1, r2, 4\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r3\n\ - bl SwapValues_s16\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r3, r5, 0x4\n\ - adds r0, r3\n\ - ldrb r2, [r4, 0x4]\n\ - lsls r1, r2, 4\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r3\n\ - bl SwapValues_s16\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r3, r5, 0\n\ - adds r3, 0xE\n\ - adds r0, r3\n\ - ldrb r2, [r4, 0x4]\n\ - lsls r1, r2, 4\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r3\n\ - bl SwapValues_s16\n\ - ldrb r1, [r4, 0x3]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - subs r5, 0x4\n\ - adds r0, r5\n\ - ldr r2, _0806CF9C @ =SpriteCB_sub_806D37C\n\ - str r2, [r0]\n\ - ldrb r1, [r4, 0x4]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - str r2, [r0]\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806CF94: .4byte gSharedMem + 0x1000\n\ -_0806CF98: .4byte gSprites + 0x20\n\ -_0806CF9C: .4byte SpriteCB_sub_806D37C\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void sub_806CFA0(u8 taskId, u8 b) -{ - u8 var1 = ((ewram01000.unk6 - 1) * 3) + 1; - - sub_806BA34(ewram01000.unk8, 3); - sub_806BB3C(ewram01000.unkA, var1); - - if (!b) - { - ewram01000.unk8--; - ewram01000.unkA++; - } - else - { - ewram01000.unk8++; - ewram01000.unkA--; - } - - sub_806B9A4(ewram01000.unk8, 3, 10); - sub_806BA94(ewram01000.unkA, var1, 0, 10); -} - -void sub_806D014(u8 taskId) -{ - sub_806CFA0(taskId, 0); - - if (ewram01000.unk8 < -13 && ewram01000.unkA > 32) - { - sub_806CF04(); - gTasks[taskId].func = sub_806D05C; - } -} - -void sub_806D05C(u8 taskId) -{ - sub_806CFA0(taskId, 1); - - if (ewram01000.unk8 == 0 && ewram01000.unkA == 11) - gTasks[taskId].func = sub_806D198; -} - -void sub_806D098(u8 a, u8 b) -{ - u8 var1 = ((ewram01000.unk5 - 1) * 3) + 1; - u8 var2 = ((ewram01000.unk6 - 1) * 3) + 1; - - sub_806BB3C(ewram01000.unk8, var1); - sub_806BB3C(ewram01000.unkA, var2); - - if (!b) - { - ewram01000.unk8++; - ewram01000.unkA++; - } - else - { - ewram01000.unk8--; - ewram01000.unkA--; - } - - sub_806BA94(ewram01000.unk8, var1, 0, 10); - sub_806BA94(ewram01000.unkA, var2, 0, 10); -} - -void sub_806D118(u8 taskId) -{ - sub_806D098(taskId, 0); - - if (ewram01000.unk8 > 32 && ewram01000.unkA > 32) - { - sub_806CF04(); - gTasks[taskId].func = sub_806D15C; - } -} - -void sub_806D15C(u8 taskId) -{ - sub_806D098(taskId, 1); - - if (ewram01000.unk8 == 11 && ewram01000.unkA == 11) - gTasks[taskId].func = sub_806D198; -} - -void sub_806D198(u8 taskId) -{ - u8 spriteId; - - SetMonIconSpriteId(ewram01000.unk0, ewram01000.unk5, ewram01000.unk4); - SetMonIconSpriteId(ewram01000.unk0, ewram01000.unk6, ewram01000.unk3); - - gSprites[ewram01000.unk3].pos1.x = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk6].x; - gSprites[ewram01000.unk3].pos1.y = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk6].y; - gSprites[ewram01000.unk3].pos2.x = 0; - gSprites[ewram01000.unk3].pos2.y = 0; - gSprites[ewram01000.unk3].callback = UpdateMonIconFrame_806DA38; - - gSprites[ewram01000.unk4].pos1.x = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk5].x; - gSprites[ewram01000.unk4].pos1.y = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk5].y; - gSprites[ewram01000.unk4].pos2.x = 0; - gSprites[ewram01000.unk4].pos2.y = 0; - gSprites[ewram01000.unk4].callback = UpdateMonIconFrame_806DA38; - - spriteId = GetMonIconSpriteId(ewram01000.unk0, gSprites[ewram01000.unk2].data[0]); - gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; - - SwapPokemon(&gPlayerParty[ewram01000.unk5], &gPlayerParty[ewram01000.unk6]); - - PartyMenuPrintMonLevelOrStatus(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); - TryPrintPartyMenuMonNickname(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); - PartyMenuTryPrintHP(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); - nullsub_12(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); - - PartyMenuPrintMonLevelOrStatus(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); - TryPrintPartyMenuMonNickname(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); - PartyMenuTryPrintHP(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); - nullsub_12(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); - - PartyMenuDrawHPBars(); - sub_806CC74(taskId); -} - -void SpriteCB_sub_806D37C(struct Sprite *sprite) -{ - UpdateMonIconFrame(sprite); - - if (sprite->pos2.x == sprite->data[2]) - { - sprite->data[0] *= -1; - sprite->data[2] = 0; - sprite->callback = UpdateMonIconFrame_806DA38; - } - else - { - sprite->pos2.x += sprite->data[0]; - } -} - -void sub_806D3B4(u8 taskId, u16 species1, u16 species2) -{ - const u8 *var1 = gUnknown_083769C0; - - sub_806BA34(var1[2] + gTasks[taskId].data[0], var1[3]); - sub_806BB3C(var1[8] + gTasks[taskId].data[0], var1[9]); - sub_806BB3C(var1[10] + gTasks[taskId].data[0], var1[11]); - - gTasks[taskId].data[0]--; - - sub_806B9A4(var1[2] + gTasks[taskId].data[0], var1[3], 4); - - if (species1) - sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 0, 4); - else - sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 1, 4); - - if (species2) - sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 0, 4); - else - sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 1, 4); -} - -void sub_806D4AC(u8 taskId, u16 species, u8 c) -{ - if (species) - { - u8 monIndex = c + 3; - u8 spriteId = GetMonIconSpriteId(taskId, monIndex); - - gSprites[spriteId].data[0] = -8; - gSprites[spriteId].data[2] = gTasks[taskId].data[0] * -8; - gSprites[spriteId].callback = SpriteCB_sub_806D37C; - } -} - -void sub_806D50C(u8 taskId, u8 monIndex) -{ - gSprites[GetMonIconSpriteId(taskId, monIndex)].pos1.x += 0xF0; -} - -void PrintPartyMenuPromptText(u8 textId, u8 b) -{ - if (textId != 0xFF) - { - switch (b) - { - case 0: - Menu_DrawStdWindowFrame(0, 16, 23, 19); - break; - case 1: - Menu_DrawStdWindowFrame(0, 16, 19, 19); - break; - case 2: - Menu_DrawStdWindowFrame(0, 16, 22, 19); - break; - case 3: - Menu_DrawStdWindowFrame(0, 16, 18, 19); - break; - } - - Menu_PrintText(PartyMenuPromptTexts[textId], 1, 17); - } -} - -void sub_806D5A4(void) -{ - Menu_EraseWindowRect(0, 16, 29, 19); -} - -void sub_806D5B8(u8 monIndex) -{ - u32 var1; - u8 left = gUnknown_08376948[IsDoubleBattle()][monIndex].left; - u8 top = gUnknown_08376948[IsDoubleBattle()][monIndex].top; - u8 right = gUnknown_08376948[IsDoubleBattle()][monIndex].right; - u8 bottom = gUnknown_08376948[IsDoubleBattle()][monIndex].bottom; - - Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); - - var1 = 0; - CpuFastSet(&var1, OBJ_VRAM1 + monIndex * 0x400, 0x1000100); -} - -void sub_806D668(u8 monIndex) -{ - u32 var1; - u8 left = gUnknown_08376978[IsDoubleBattle()][monIndex].left; - u8 top = gUnknown_08376978[IsDoubleBattle()][monIndex].top; - u8 right = gUnknown_08376978[IsDoubleBattle()][monIndex].right; - u8 bottom = gUnknown_08376978[IsDoubleBattle()][monIndex].bottom; - - Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); - - var1 = 0; - CpuFastSet(&var1, OBJ_VRAM1 + 0x300 + monIndex * 0x400, 0x1000040); -} - -bool8 LoadPartyMenuGraphics(u8 a) -{ - u16 palette = 0x7FFF; - bool8 retVal = FALSE; - - if (a < 2) - LZDecompressVram(gPartyMenuMisc_Gfx, (void *)BG_VRAM); - - if (a == 2 || a == 0) - LZDecompressVram(gPartyMenuMisc_Tilemap, (void *)(BG_VRAM + 0x3800)); - - if (a == 3 || a == 0) - LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160); - - if (a == 4 || a == 0) - { - LoadPalette(&palette, 0, 2); - LoadPalette(gFontDefaultPalette, 0xF0, 0x20); - } - - if (a == 5 || a == 0) - LZDecompressVram(gPartyMenuHpBar_Gfx, (void *)(BG_VRAM + 0x6000)); - - if (a == 6 || a == 0) - LZDecompressVram(gPartyMenuOrderText_Gfx, (void *)(BG_VRAM + 0x6180)); - - if (a == 7 || a == 0) - LZDecompressVram(gStatusGfx_Icons, (void *)(BG_VRAM + 0x7180)); - - if (a == 8 || a == 0) - { - LoadCompressedPalette(gStatusPal_Icons, 0xB0, 0x20); - retVal = TRUE; - } - - return retVal; -} - -void SetMonIconAnimByHP(u8 spriteId, u16 currentHP, u16 maxHP) -{ - u8 hpBarLevel = GetHPBarLevel(currentHP, maxHP); - u8 animNum = 0; - - if (currentHP != maxHP) - { - if (hpBarLevel == 3) - animNum = 1; - else if (hpBarLevel == 2) - animNum = 2; - else if (hpBarLevel == 1) - animNum = 3; - else - animNum = 4; - } - - sub_809D824(&gSprites[spriteId], animNum); -} - -void SetMonIconAnim(u8 spriteId, struct Pokemon *pokemon) -{ - u16 currentHP = GetMonData(pokemon, MON_DATA_HP); - u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); - - SetMonIconAnimByHP(spriteId, currentHP, maxHP); -} - -void CreatePartyMenuMonIcon(u8 taskId, u8 monIndex, u8 menuType, struct Pokemon *pokemon) -{ - u8 x = gUnknown_08376678[menuType][monIndex].x; - u8 y = gUnknown_08376678[menuType][monIndex].y; - - u16 species2 = GetMonData(pokemon, MON_DATA_SPECIES2); - u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY); - - u8 spriteId = CreateMonIcon(species2, sub_809D62C, x, y, 5, personality); - SetMonIconSpriteId(taskId, monIndex, spriteId); - SetMonIconAnim(spriteId, pokemon); -} - -void TryCreatePartyMenuMonIcon(u8 taskId, u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES)) - { - if (IsLinkDoubleBattle() == TRUE) - CreatePartyMenuMonIcon(taskId, monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - else - CreatePartyMenuMonIcon(taskId, monIndex, IsDoubleBattle(), pokemon); - } -} - -void unref_sub_806D964(u8 taskId) -{ - u8 i; - - for (i = 0; i < gPlayerPartyCount; i++) - TryCreatePartyMenuMonIcon(taskId, i, &gPlayerParty[i]); -} - -void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct UnknownPokemonStruct2 *pokemon) -{ - u8 x = gUnknown_08376678[menuType][monIndex].x; - u8 y = gUnknown_08376678[menuType][monIndex].y; - - u8 spriteId = CreateMonIcon(pokemon->species, sub_809D62C, x, y, 5, pokemon->personality); - SetMonIconSpriteId(taskId, monIndex, spriteId); - SetMonIconAnimByHP(spriteId, pokemon->hp, pokemon->maxhp); -} - -void UpdateMonIconFrame_806DA0C(struct Sprite *sprite) -{ - u8 var1 = UpdateMonIconFrame(sprite); - - if (var1) - { - if (var1 & 1) - sprite->pos2.y = -3; - else - sprite->pos2.y = 1; - } -} - -void UpdateMonIconFrame_806DA38(struct Sprite *sprite) -{ - UpdateMonIconFrame(sprite); -} - -void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c) -{ - u8 spriteId; - - if (monIndex < PARTY_SIZE) - { - spriteId = GetMonIconSpriteId(taskId, monIndex); - gSprites[spriteId].pos2.y = 0; - gSprites[spriteId].data[0] = 0; - - if (!c) - gSprites[spriteId].callback = UpdateMonIconFrame_806DA38; - else - gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; - } -} - -void LoadHeldItemIconGraphics(void) -{ - LoadSpriteSheet(&HeldItemsSpriteSheet); - LoadSpritePalette(&HeldItemsPalette); -} - -void SpriteCB_HeldItemIcon(struct Sprite *sprite) -{ - u8 data7 = sprite->data[7]; - - if (gSprites[data7].invisible) - { - sprite->invisible = 1; - } - else - { - sprite->invisible = 0; - sprite->pos1.x = gSprites[data7].pos1.x + gSprites[data7].pos2.x; - sprite->pos1.y = gSprites[data7].pos1.y + gSprites[data7].pos2.y; - } -} - -void CreateHeldItemIcon(u8 a, u8 b) -{ - u8 subPriority; - u8 spriteId; - - subPriority = gSprites[a].subpriority; - spriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, subPriority - 1); - - gSprites[spriteId].pos2.x = 4; - gSprites[spriteId].pos2.y = 10; - gSprites[spriteId].callback = SpriteCB_HeldItemIcon; - gSprites[spriteId].data[7] = a; - - StartSpriteAnim(&gSprites[spriteId], b); - gSprites[spriteId].callback(&gSprites[spriteId]); -} - -void CreateHeldItemIcons(u8 *a, u8 *b, u8 c) -{ - u16 i; - u16 heldItem; - - switch (c) - { - case 0: - for (i = 0; i < a[0]; i++) - { - heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - if (heldItem) - CreateHeldItemIcon(b[i], ItemIsMail(heldItem)); - } - break; - case 1: - for (i = 0; i < a[1]; i++) - { - heldItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); - if (heldItem) - CreateHeldItemIcon(b[i + 6], ItemIsMail(heldItem)); - } - break; - } -} - -void CreateHeldItemIcons_806DC34(u8 taskId) -{ - u8 i; - u8 monIconSpriteId; - u8 heldItemSpriteId; - - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) - { - monIconSpriteId = GetMonIconSpriteId(taskId, i); - heldItemSpriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, 4); - - gSprites[heldItemSpriteId].pos2.x = 4; - gSprites[heldItemSpriteId].pos2.y = 10; - gSprites[heldItemSpriteId].data[7] = monIconSpriteId; - gSprites[monIconSpriteId].data[7] = heldItemSpriteId; - - SetHeldItemIconVisibility(taskId, i); - gSprites[heldItemSpriteId].callback(&gSprites[heldItemSpriteId]); - } - } -} - -#ifdef NONMATCHING -void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) -{ - u8 monIconSpriteId; - u8 heldItemSpriteId; - - monIconSpriteId = GetMonIconSpriteId(taskId, monIndex); - heldItemSpriteId = CreateSprite(gSpriteTemplate_837660C, 0xFA, 0xAA, 4); - - gSprites[heldItemSpriteId].pos2.x = 4; - gSprites[heldItemSpriteId].pos2.y = 10; - gSprites[heldItemSpriteId].data[7] = monIconSpriteId; - gSprites[monIconSpriteId].data[7] = heldItemSpriteId; - - if (!item) - { - gSprites[heldItemSpriteId].invisible = 1; - } - else - { - if (ItemIsMail(item)) - StartSpriteAnim(&gSprites[heldItemSpriteId], 1); - else - StartSpriteAnim(&gSprites[heldItemSpriteId], 0); - - gSprites[heldItemSpriteId].invisible = 0; - } - - gSprites[heldItemSpriteId].callback(&gSprites[heldItemSpriteId]); -} -#else -__attribute__((naked)) -void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - lsls r2, 16\n\ - lsrs r7, r2, 16\n\ - bl GetMonIconSpriteId\n\ - adds r4, r0, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - ldr r0, _0806DD2C @ =gSpriteTemplate_837660C\n\ - movs r1, 0xFA\n\ - movs r2, 0xAA\n\ - movs r3, 0x4\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r1, _0806DD30 @ =gSprites\n\ - lsls r0, r6, 4\n\ - adds r0, r6\n\ - lsls r0, 2\n\ - adds r5, r0, r1\n\ - movs r0, 0x4\n\ - strh r0, [r5, 0x24]\n\ - movs r0, 0xA\n\ - strh r0, [r5, 0x26]\n\ - strh r4, [r5, 0x3C]\n\ - lsls r0, r4, 4\n\ - adds r0, r4\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - strh r6, [r0, 0x3C]\n\ - cmp r7, 0\n\ - bne _0806DD34\n\ - adds r0, r5, 0\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r2, 0x4\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _0806DD5C\n\ - .align 2, 0\n\ -_0806DD2C: .4byte gSpriteTemplate_837660C\n\ -_0806DD30: .4byte gSprites\n\ -_0806DD34:\n\ - adds r0, r7, 0\n\ - bl ItemIsMail\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0806DD46\n\ - adds r0, r5, 0\n\ - movs r1, 0x1\n\ - b _0806DD4A\n\ -_0806DD46:\n\ - adds r0, r5, 0\n\ - movs r1, 0\n\ -_0806DD4A:\n\ - bl StartSpriteAnim\n\ - adds r2, r5, 0\n\ - adds r2, 0x3E\n\ - ldrb r1, [r2]\n\ - movs r0, 0x5\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ -_0806DD5C:\n\ - ldr r2, _0806DD78 @ =gSprites\n\ - lsls r0, r6, 4\n\ - adds r0, r6\n\ - lsls r0, 2\n\ - adds r1, r2, 0\n\ - adds r1, 0x1C\n\ - adds r1, r0, r1\n\ - adds r0, r2\n\ - ldr r1, [r1]\n\ - bl _call_via_r1\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806DD78: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite) -{ - u8 spriteId = sprite->data[7]; - - sprite->pos1.x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; - sprite->pos1.y = gSprites[spriteId].pos1.y; -} - -u8 GetMonIconSpriteId(u8 taskId, u8 monIndex) -{ - switch (monIndex) - { - case 1: - return gTasks[taskId].data[0]; - break; - case 2: - return gTasks[taskId].data[1] >> 8; - break; - case 3: - return gTasks[taskId].data[1]; - break; - case 4: - return gTasks[taskId].data[2] >> 8; - break; - case 5: - return gTasks[taskId].data[2]; - break; - case 0: - default: - return gTasks[taskId].data[0] >> 8; - break; - } -} - -void SetMonIconSpriteId(u8 taskId, u8 monIndex, u8 spriteId) -{ - switch (monIndex) - { - case 0: - gTasks[taskId].data[0] = (u8)gTasks[taskId].data[0] | (spriteId << 8); - break; - case 1: - gTasks[taskId].data[0] = (gTasks[taskId].data[0] & -0x100) | spriteId; - break; - case 2: - gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1] | (spriteId << 8); - break; - case 3: - gTasks[taskId].data[1] = (gTasks[taskId].data[1] & -0x100) | spriteId; - break; - case 4: - gTasks[taskId].data[2] = (u8)gTasks[taskId].data[2] | (spriteId << 8); - break; - case 5: - gTasks[taskId].data[2] = (gTasks[taskId].data[2] & -0x100) | spriteId; - break; - } -} - -u16 GetMonHeldItemIconSpriteId(u8 taskId, u8 monIndex) -{ - u8 spriteId = GetMonIconSpriteId(taskId, monIndex); - u8 retVal = gSprites[spriteId].data[7]; - return retVal; -} - -#ifdef NONMATCHING -void SetHeldItemIconVisibility(u8 taskId, u8 monIndex) -{ - u8 spriteId; - u16 heldItem; - - spriteId = GetMonHeldItemIconSpriteId(taskId, monIndex); - if (!GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM)) - { - gSprites[spriteId].invisible = 1; - } - else - { - struct Sprite *sprite; - - heldItem = GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM); - sprite = &gSprites[spriteId]; - if (ItemIsMail(heldItem)) - { - StartSpriteAnim(sprite, 1); - } - else - { - StartSpriteAnim(sprite, 0); - } - - sprite->invisible = 0; - } -} -#else -__attribute__((naked)) -void SetHeldItemIconVisibility(u8 a, u8 monIndex) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - adds r4, r1, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r1, r4, 0\n\ - bl GetMonHeldItemIconSpriteId\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - adds r6, r5, 0\n\ - movs r0, 0x64\n\ - adds r1, r4, 0\n\ - muls r1, r0\n\ - ldr r0, _0806DFA4 @ =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0806DFAC\n\ - ldr r1, _0806DFA8 @ =gSprites\n\ - lsls r0, r5, 4\n\ - adds r0, r5\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - adds r0, 0x3E\n\ - ldrb r1, [r0]\n\ - movs r2, 0x4\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - b _0806DFF6\n\ - .align 2, 0\n\ -_0806DFA4: .4byte gPlayerParty\n\ -_0806DFA8: .4byte gSprites\n\ -_0806DFAC:\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl ItemIsMail\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0806DFD8\n\ - lsls r4, r5, 4\n\ - adds r4, r5\n\ - lsls r4, 2\n\ - ldr r0, _0806DFD4 @ =gSprites\n\ - adds r4, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0x1\n\ - b _0806DFE6\n\ - .align 2, 0\n\ -_0806DFD4: .4byte gSprites\n\ -_0806DFD8:\n\ - lsls r4, r6, 4\n\ - adds r4, r6\n\ - lsls r4, 2\n\ - ldr r0, _0806DFFC @ =gSprites\n\ - adds r4, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0\n\ -_0806DFE6:\n\ - bl StartSpriteAnim\n\ - adds r4, 0x3E\n\ - ldrb r1, [r4]\n\ - movs r0, 0x5\n\ - negs r0, r0\n\ - ands r0, r1\n\ - strb r0, [r4]\n\ -_0806DFF6:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806DFFC: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer) -{ - u32 var1 = 0; - CpuFastSet(&var1, gTileBuffer, 0x1000100); - Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gTileBuffer, nameBuffer); - CpuFastSet(gTileBuffer, OBJ_VRAM1 + (monIndex * 0x400), 128); -} - -void PrintPartyMenuMonNickname(u8 monIndex, u8 b, struct Pokemon *pokemon) -{ - u8 nameBuffer[12]; - GetMonNickname(pokemon, nameBuffer); - PartyMenuDoPrintMonNickname(monIndex, b, nameBuffer); -} - -void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES)) - { - if (IsLinkDoubleBattle() == TRUE) - PrintPartyMenuMonNickname(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - else - PrintPartyMenuMonNickname(monIndex, IsDoubleBattle(), pokemon); - } -} - -void PrintPartyMenuMonNicknames(void) -{ - u8 i; - - for (i = 0; i < PARTY_SIZE; i++) - TryPrintPartyMenuMonNickname(i, &gPlayerParty[i]); -} - -u8 *GetMonNickname(struct Pokemon *pokemon, u8 *stringBuffer) -{ - GetMonData(pokemon, MON_DATA_NICKNAME, stringBuffer); - return StringGetEnd10(stringBuffer); -} - -void PartyMenuPutStatusTilemap(u8 monIndex, u8 menuLayout, u8 status) -{ - u8 i; - u8 x = gUnknown_08376738[menuLayout][monIndex].x - 1; - u8 y = gUnknown_08376738[menuLayout][monIndex].y + 1; - u16 *vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); - u8 var1 = status * 4; - - for (i = 0; i < 4; i++) - vramPtr[i] = (0x18C + var1 + i) | -0x5000; -} - -static void PartyMenuClearLevelStatusTilemap(u8 monIndex) -{ - u8 menuLayout; - u8 x; - u8 y; - u16 *vramPtr; - u8 i; - - if (IsLinkDoubleBattle() == TRUE) - menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; - else - menuLayout = IsDoubleBattle(); - - x = gUnknown_08376738[menuLayout][monIndex].x - 1; - y = gUnknown_08376738[menuLayout][monIndex].y + 1; - - vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); - for (i = 0; i < 4; i++) - vramPtr[i] = 0; -} - -static void PartyMenuWriteTilemap(u8 a, u8 x, u8 y) -{ - u16 *vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); - *vramPtr = a + 0x10C; -} - -void PartyMenuDoPrintLevel(u8 monIndex, u8 menuLayout, u8 level) -{ - u8 *stringVar; - u32 var1; - u8 x = gUnknown_08376738[menuLayout][monIndex].x; - u8 y = gUnknown_08376738[menuLayout][monIndex].y; - - PartyMenuWriteTilemap(0x40, x - 1, y + 1); - - stringVar = gStringVar1; - stringVar[0] = 0xFC; - stringVar[1] = 0x12; - stringVar[2] = 0x8; - - ConvertIntToDecimalString(&stringVar[3], level); - - var1 = 0; - CpuFastSet(&var1, gUnknown_02039460, 0x1000020); - Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); - CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x200 + (monIndex * 0x400), 32); -} - -void PartyMenuPrintLevel(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) -{ - u16 level = GetMonData(pokemon, MON_DATA_LEVEL); - PartyMenuDoPrintLevel(monIndex, menuLayout, level); -} - -void PartyMenuPrintMonLevelOrStatus(u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) - { - u8 statusAndPkrs = GetMonStatusAndPokerus(pokemon); - u8 menuLayout; - - if (IsLinkDoubleBattle() == TRUE) - menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; - else - menuLayout = IsDoubleBattle(); - - if (statusAndPkrs != 0 && statusAndPkrs != 6) - PartyMenuPutStatusTilemap(monIndex, menuLayout, statusAndPkrs - 1); - else - PartyMenuPrintLevel(monIndex, menuLayout, pokemon); - - PartyMenuPrintGenderIcon(monIndex, menuLayout, pokemon); - } -} - -void PartyMenuPrintMonsLevelOrStatus(void) -{ - u8 i; - - for (i = 0; i < PARTY_SIZE; i++) - PartyMenuPrintMonLevelOrStatus(i, &gPlayerParty[i]); -} - -void PartyMenuDoPrintGenderIcon(u16 species, u8 gender, u8 menuLayout, u8 monIndex, u8 *nickname) -{ - if (!ShouldHideGenderIcon(species, nickname)) - { - u8 x = gUnknown_08376738[menuLayout][monIndex].x + 3; - u8 y = gUnknown_08376738[menuLayout][monIndex].y + 1; - - switch (gender) - { - case MON_MALE: - PartyMenuWriteTilemap(0x42, x, y); - break; - case MON_FEMALE: - PartyMenuWriteTilemap(0x44, x, y); - break; - } - } -} - -void PartyMenuPrintGenderIcon(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) -{ - u16 species2; - u8 gender; - - GetMonNickname(pokemon, gStringVar1); - species2 = GetMonData(pokemon, MON_DATA_SPECIES2); - gender = GetMonGender(pokemon); - PartyMenuDoPrintGenderIcon(species2, gender, menuLayout, monIndex, gStringVar1); -} - -void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP) -{ - u32 *var; - register u8 *stringVar1 asm("r2") = gStringVar1; - register u8 *textPtr asm("r2") = sub_8072C14(stringVar1, currentHP, 15, 1); - textPtr[0] = CHAR_SLASH; - - sub_8072C14(++textPtr, maxHP, 35, 1); - var = 0; - - CpuFastSet(&var, gUnknown_02039460, 0x1000040); - Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); - CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x300 + (monIndex * 0x400), 64); -} - -void PartyMenuPrintHP(u8 monIndex, u8 b, struct Pokemon *pokemon) -{ - u16 currentHP = GetMonData(pokemon, MON_DATA_HP); - u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); - - PartyMenuDoPrintHP(monIndex, b, currentHP, maxHP); -} - -void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) - { - if (IsLinkDoubleBattle() == TRUE) - PartyMenuPrintHP(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - else - PartyMenuPrintHP(monIndex, IsDoubleBattle(), pokemon); - } -} - -void PartyMenuTryPrintMonsHP(void) -{ - u8 i; - - for (i = 0; i < PARTY_SIZE; i++) - PartyMenuTryPrintHP(i, &gPlayerParty[i]); -} - -void unref_sub_806E564(void) { } -void unref_sub_806E568(void) { } -void nullsub_12(u8 monIndex, struct Pokemon *pokemon) { } -void nullsub_13(void) { } - -void PartyMenuDoDrawHPBar(u8 monIndex, u8 menuLayout, u16 currentHP, u16 maxHP) -{ - u8 hpBarLevel; - u16 *vramPtr; - int var = -32768; - struct BattleInterfaceStruct1 battleInterface; - battleInterface.unk0 = maxHP; - battleInterface.unk4 = currentHP; - battleInterface.unk8 = 0; - - hpBarLevel = GetHPBarLevel(currentHP, maxHP); - if (hpBarLevel > 2) - battleInterface.unkC_0 = 4; - if (hpBarLevel == 2) - battleInterface.unkC_0 = 5; - if (hpBarLevel < 2) - battleInterface.unkC_0 = 6; - - battleInterface.unk10 = 0x100; - - vramPtr = gUnknown_08376858[menuLayout][monIndex]; - sub_80460C8(&battleInterface, &var, vramPtr, 0); - - vramPtr -= 2; - - vramPtr[0] = 0x3109; - vramPtr[1] = 0x310A; - vramPtr[8] = 0x310B; -} - -void PartyMenuDrawHPBar(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) -{ - u16 currentHP = GetMonData(pokemon, MON_DATA_HP); - u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); - - PartyMenuDoDrawHPBar(monIndex, menuLayout, currentHP, maxHP); -} - -void PartyMenuTryDrawHPBar(u8 monIndex, struct Pokemon *pokemon) -{ - if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) - { - if (IsLinkDoubleBattle() == TRUE) - PartyMenuDrawHPBar(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); - else - PartyMenuDrawHPBar(monIndex, IsDoubleBattle(), pokemon); - } -} - -void PartyMenuDrawHPBars(void) -{ - u8 i; - - for (i = 0; i < PARTY_SIZE; i++) - PartyMenuTryDrawHPBar(i, &gPlayerParty[i]); -} - -void SwapPokemon(struct Pokemon *a, struct Pokemon *b) -{ - struct Pokemon temp = *a; - *a = *b; - *b = temp; -} - -void SetPartyPopupMenuOffsets(u8 menuIndex, u8 *left, u8 *top, const struct PartyPopupMenu *menu) -{ - u8 bottomOffset = (2 * menu[menuIndex].numChoices) + 2; - u8 rightOffset = menu[menuIndex].width + 1; - - *left = 30 - rightOffset; - *top = 20 - bottomOffset; -} - -void ShowPartyPopupMenu(u8 menuIndex, const struct PartyPopupMenu *menu, const struct MenuAction2 *menuActions, u8 cursorPos) -{ - u8 left; - u8 top; - - SetPartyPopupMenuOffsets(menuIndex, &left, &top, menu); - sub_8089C50(left, top, menu[menuIndex].width, menu[menuIndex].numChoices, menuActions, menu[menuIndex].items); - - InitMenu(0, left + 1, top + 1, menu[menuIndex].numChoices, cursorPos, menu[menuIndex].width - 1); -} - -void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu) -{ - u8 left; - u8 top; - - SetPartyPopupMenuOffsets(index, &left, &top, menu); - - Menu_EraseWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1); - Menu_DestroyCursor(); -} - -TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex) -{ - u8 action = menus[menuIndex].items[itemIndex]; - return menuActions[action].func; -} - -u8 sub_806E834(const u8 *message, u8 arg1) -{ - u8 taskId; - - gUnknown_0202E8F6 = 1; - - Menu_DrawStdWindowFrame(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - MenuPrintMessage(message, WINDOW_LEFT + 1, 15); - - taskId = CreateTask(sub_806E884, 1); - gTasks[taskId].data[0] = arg1; - - return taskId; -} - -static void sub_806E884(u8 taskId) -{ - if (Menu_UpdateWindowText()) - { - gUnknown_0202E8F6 = 0; - if (gTasks[taskId].data[0] == 0) - Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - DestroyTask(taskId); - } -} - -void sub_806E8D0(u8 taskId, u16 b, TaskFunc c) -{ - ewram1C000.unk10 = c; - ewram1C000.unk4 = taskId; - ewram1C000.unk5 = sub_806CA38(taskId); - ewram1C000.unk6 = b; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; -} - -bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item) -{ - u8 itemData[2]; - - if (ItemIsMail(item) == TRUE) - { - if (GiveMailToMon(pkmn, item) == 0xFF) - return TRUE; - gUnknown_0202E8F4 = 2; - } - else - { - gUnknown_0202E8F4 = 1; - } - - itemData[0] = item; - itemData[1] = item >> 8; - SetMonData(pkmn, MON_DATA_HELD_ITEM, itemData); - return FALSE; -} - -void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c) -{ - u16 currentItem; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, newItem, c); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - gUnknown_0202E8F4 = 0; - gUnknown_0202E8F8 = 0; - if (currentItem != 0) - { - if (ItemIsMail(currentItem) == TRUE) - { - sub_806E834(gOtherText_MailMustBeRemoved, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - GetMonNickname(ewram1C000.pokemon, gStringVar1); - CopyItemName(currentItem, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyHolding); - sub_806E834(gStringVar4, 1); - CreateTask(Task_ConfirmGiveHeldItem, 5); - if (ItemIsMail(newItem) == TRUE) - gUnknown_0202E8F8 = currentItem; - } - } - else - { - PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, newItem); - RemoveBagItem(newItem, 1); - if (ItemIsMail(newItem)) - { - gTasks[taskId].func = c; - } - else - { - DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - } -} - -void party_menu_link_mon_held_item_object(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } -} - -void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - u16 currentItem; - - Menu_EraseWindowRect(23, 8, 29, 13); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - RemoveBagItem(ewram1C000.unk6, 1); - if (AddBagItem(currentItem, 1) == TRUE) - { - PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6); - if (ItemIsMail(ewram1C000.unk6)) - { - DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1); - } - else - { - CopyItemName(ewram1C000.unk6, gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced); - sub_806E834(gStringVar4, 1); - } - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - AddBagItem(ewram1C000.unk6, 1); - } - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - } - gTasks[taskId].func = party_menu_link_mon_held_item_object; -} - -void Task_ConfirmGiveHeldItem(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = PartyMenuTryGiveMonHeldItem_806EACC; - } -} - -void DisplayGiveHeldItemMessage(u8 a, u16 b, u8 c) -{ - GetMonNickname(&gPlayerParty[a], gStringVar1); - CopyItemName(b, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasGivenToHold); - sub_806E834(gStringVar4, c); -} - -void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) -{ - u32 var1; - u16 currentItem; - struct MailStruct *mail; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - gUnknown_0202E8F4 = 0; - var1 = ewram1FE00.unkE00 + 6; - mail = &gSaveBlock1.mail[var1 + ewram1FE00.unkE02]; - - if (currentItem != 0) - { - sub_806E834(gOtherText_PokeHoldingItemCantMail, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - GiveMailToMon2(ewram1C000.pokemon, mail); - ClearMailStruct(mail); - sub_806E834(gOtherText_MailTransferredMailbox, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } -} - -void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func) -{ - u16 currentItem; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - if (currentItem == 0) - { - StringExpandPlaceholders(gStringVar4, gOtherText_NotHoldingAnything); - sub_806E834(gStringVar4, 0); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - u8 itemData[2]; - - itemData[0] = 0; - itemData[1] = 0; - if (AddBagItem(currentItem, 1) == TRUE) - { - if (ItemIsMail(currentItem) == TRUE) - TakeMailFromMon(ewram1C000.pokemon); - DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0); - SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData); - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - } - CreateTask(party_menu_link_mon_held_item_object, 5); - } -} - -void DisplayTakeHeldItemMessage(u8 a, u16 b, u8 c) -{ - GetMonNickname(&gPlayerParty[a], gStringVar1); - CopyItemName(b, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_ReceivedTheThingFrom); - sub_806E834(gStringVar4, c); -} - -void DoTakeMail(u8 taskId, TaskFunc func) -{ - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - sub_806E834(gOtherText_SendRemovedMailPrompt, 1); - CreateTask(Task_ConfirmTakeHeldMail, 5); -} - -void Task_LoseMailMessage(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - if (AddBagItem(ewram1C000.unk6, 1) == TRUE) - { - TakeMailFromMon(ewram1C000.pokemon); - sub_806E834(gOtherText_MailTaken, 0); - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - } - Menu_EraseWindowRect(23, 8, 29, 13); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } -} - -void Task_ConfirmLoseMailMessage(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = Task_LoseMailMessage; - } -} - -void Task_TakeHeldMail(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - Menu_EraseWindowRect(23, 8, 29, 13); - if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) - sub_806E834(gOtherText_MailWasSent, 0); - else - sub_806E834(gOtherText_MailboxIsFull, 0); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - sub_806E834(gOtherText_MailRemovedMessageLost, 1); - gTasks[taskId].func = Task_ConfirmLoseMailMessage; - } -} - -void Task_ConfirmTakeHeldMail(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = Task_TakeHeldMail; - } -} - -u16 ItemIdToBattleMoveId(u16 item) -{ - u16 machineNumber = item - ITEM_TM01_FOCUS_PUNCH; - return TMHMMoves[machineNumber]; -} - -bool8 pokemon_has_move(struct Pokemon *pkmn, u16 move) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - if (GetMonData(pkmn, MON_DATA_MOVE1 + i) == move) - return TRUE; - } - return FALSE; -} - -void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) -{ - PlaySE(SE_SELECT); - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, move, func); - CreateTask(Task_TeamMonTMMove, 5); -} - -#if DEBUG -extern u8 gUnknown_020297ED; -#endif - -void Task_TeamMonTMMove(u8 taskId) -{ - GetMonNickname(ewram1C000.pokemon, gStringVar1); - ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - ewram1B000.unk282 = 0; - if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8)) - { - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyKnows); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if ( -#if DEBUG - !gUnknown_020297ED && -#endif - !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) - { - StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (GiveMoveToMon(ewram1C000.pokemon, ewram1C000.unk8) != 0xFFFF) - { - Task_TeamMonTMMove2(taskId); - } - else - { - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F358; - } - } - } -} - -void Task_TeamMonTMMove2(u8 taskId) -{ - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - AdjustFriendship(ewram1C000.pokemon, 4); - if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152) - RemoveBagItem(ewram1C000.unk6, 1); - gTasks[taskId].func = Task_TeamMonTMMove3; -} - -void Task_TeamMonTMMove3(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - PlayFanfare(BGM_FANFA1); - gTasks[taskId].func = Task_TeamMonTMMove4; - } -} - -void Task_TeamMonTMMove4(u8 taskId) -{ - if (IsFanfareTaskInactive()) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - if (ewram1B000.unk282 == 1) - { - TeachMonMoveInPartyMenu(taskId); - } - else - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } - } - } -} - -void sub_806F2FC(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - if (ewram1B000.unk282 == 1) - { - TeachMonMoveInPartyMenu(taskId); - } - else - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } - } -} - -void sub_806F358(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = sub_806F390; - } -} - -void sub_806F390(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - Menu_EraseWindowRect(23, 8, 29, 13); - sub_806E834(gOtherText_WhichMoveToForget2, 1); - gTasks[taskId].func = sub_806F44C; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - StopTryingToTeachMove_806F614(taskId); - } -} - -void sub_806F3FC(u8 taskId) -{ - if (!gPaletteFade.active) - { - ShowSelectMovePokemonSummaryScreen(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); - DestroyTask(taskId); - } -} - -void sub_806F44C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_806F3FC; - } -} - -void TaughtMove(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 moveIndex; - u16 r4; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, gSpecialVar_ItemId, sub_808B508); - moveIndex = sub_809FA30(); - r4 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + moveIndex); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[r4]); - StringExpandPlaceholders(gStringVar4, gOtherText_ForgetMove123_2); - sub_806E834(gStringVar4, 1); - CreateTask(TMMoveUpdateMoveSlot, 5); - } -} - -void TMMoveUpdateMoveSlot(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - RemoveMonPPBonus(ewram1C000.pokemon, sub_809FA30()); - SetMonMoveSlot(ewram1C000.pokemon, ewram1C000.unk8, sub_809FA30()); - Task_TeamMonTMMove2(taskId); - } -} - -void StopTryingToTeachMove_806F588(u8 taskId) -{ - if (!gPaletteFade.active) - { - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, gSpecialVar_ItemId, sub_808B508); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); - sub_806E834(gStringVar4, 1); - CreateTask(StopTryingToTeachMove_806F67C, 5); - } -} - -void StopTryingToTeachMove_806F614(u8 taskId) -{ - Menu_EraseWindowRect(23, 8, 29, 13); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = StopTryingToTeachMove_806F67C; -} - -void StopTryingToTeachMove_806F67C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = StopTryingToTeachMove_806F6B4; - } -} - -void StopTryingToTeachMove_806F6B4(u8 taskId) -{ - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - Menu_EraseWindowRect(23, 8, 29, 13); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F2FC; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F358; - } -} - -bool8 IsHMMove(u16 move) -{ - u8 i; - - for (i = 0; i < NUM_HIDDEN_MACHINES; i++) - { - if (TMHMMoves[NUM_TECHNICAL_MACHINES + i] == move) - return TRUE; - } - - return FALSE; -} - -s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c) -{ - s16 *taskData; - u8 hpBarLevel; - void *vramPtr; - - taskData = gTasks[taskId].data; - - b->unk0 = taskData[10]; - b->unk4 = taskData[11]; - b->unk8 = taskData[12] * c; - b->unk10 = 0x100; - hpBarLevel = GetHPBarLevel(ewram1B000.unk282, b->unk0); - if (hpBarLevel > 2) - b->unkC_0 = 4; - if (hpBarLevel == 2) - b->unkC_0 = 5; - if (hpBarLevel < 2) - b->unkC_0 = 6; - vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5]; - return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0); -} - -void sub_806F8AC(u8 taskId) -{ - struct BattleInterfaceStruct1 sp0; - u16 sp14; - - ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, -1); - if (ewram1B000.unk282 == -1) - { - ewram1C000.unkC = 0; - if (-sp0.unk8 + sp0.unk4 > sp0.unk0) - sp14 = sp0.unk0 - sp0.unk4; - else - sp14 = -sp0.unk8; - gBattleMoveDamage = -sp14; - GetMonNickname(ewram1C000.pokemon, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, sp14, 0, 3); - if (gTasks[taskId].data[14] == 0) - StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy); - else - StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth); - SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon); - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7); - ewram1B000.unk261 = 2; - sub_806E834(gStringVar4, 1); - sp14 += sp0.unk4; - SetMonData(ewram1C000.pokemon, MON_DATA_HP, &sp14); - RemoveBagItem(ewram1C000.unk6, 1); - sub_8032638(); - gTasks[taskId].func = sub_806FB44; - } - else - { - PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); - } -} - -void sub_806FA18(u8 taskId) -{ - struct BattleInterfaceStruct1 sp0; - - ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, 1); - if (ewram1B000.unk282 == -1) - { - PlaySE(SE_KAIFUKU); - ewram1C000.unkC = 0; - gTasks[taskId].data[11] -= gTasks[taskId].data[12]; - SetMonData(ewram1C000.pokemon, MON_DATA_HP, &gTasks[taskId].data[11]); - SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon); - ewram1C000.unk5 = gSprites[ewram01000.unk2].data[0]; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; - gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - ewram1C000.unkC = -32768; - ewram1C000.unk14 = ewram1C000.unk10; - gTasks[taskId].func = sub_806F8AC; - ewram1B000.unk282 = gTasks[taskId].data[11]; - } - else - { - PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); - } -} - -void sub_806FB0C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } -} - -void sub_806FB44(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk14; - DestroyTask(taskId); - } -} - -bool8 IsHPRecoveryItem(u16 item) -{ - const u8 *itemEffect; - - if (item == ITEM_ENIGMA_BERRY) - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffect = gItemEffectTable[item - ITEM_POTION]; - - if (itemEffect[4] & 4) - return TRUE; - else - return FALSE; -} - -void PartyMenuUpdateLevelOrStatus(struct Pokemon *pkmn, u8 monIndex) -{ - PartyMenuClearLevelStatusTilemap(monIndex); - PartyMenuPrintMonLevelOrStatus(monIndex, pkmn); -} - -void GetMedicineItemEffectMessage(u16 item) -{ - switch (GetItemEffectType(item)) - { - case 3: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); - break; - case 4: - StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); - break; - case 5: - StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); - break; - case 6: - StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); - break; - case 7: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); - break; - case 8: - StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); - break; - case 9: - StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); - break; - case 11: - StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); - break; - case 13: - StringCopy(gStringVar2, gOtherText_Hp2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 12: - StringCopy(gStringVar2, gOtherText_Attack); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 17: - StringCopy(gStringVar2, gOtherText_Defense); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 16: - StringCopy(gStringVar2, gOtherText_Speed); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 14: - StringCopy(gStringVar2, gOtherText_SpAtk2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 15: - StringCopy(gStringVar2, gOtherText_SpDef2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 19: - case 20: - StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); - break; - case 21: - StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); - break; - default: - StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); - break; - } -} - -bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item) -{ - if (GetItemEffectType(item) == 13 - && GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA) - return TRUE; - else - return FALSE; -} - -bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c) -{ - if (gMain.inBattle) - return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c); - else - return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c); -} - -void UseMedicine(u8 taskId, u16 item, TaskFunc func) -{ - u8 r7; - bool8 r9 = FALSE; - bool8 r0; - - gTasks[taskId].func = TaskDummy; - r7 = CreateTask(TaskDummy, 5); - sub_806E8D0(taskId, item, func); - if (!IsMedicineIneffective(ewram1C000.pokemon, item)) - { - r9 = IsHPRecoveryItem(item); - if (r9 == TRUE) - { - gTasks[r7].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - gTasks[r7].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - if (gTasks[r7].data[10] == gTasks[r7].data[11]) - { - r9 = FALSE; - gTasks[r7].data[10] = 0; - gTasks[r7].data[11] = 0; - } - } - r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0); - } - else - { - r0 = TRUE; - } - - if (r0) - { - gUnknown_0202E8F4 = 0; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - gTasks[r7].func = sub_806FB0C; - } - else - { - u8 statusAndPkrs; - - gUnknown_0202E8F4 = 1; - if (!IsBlueYellowRedFlute(item)) - PlaySE(SE_KAIFUKU); - else - PlaySE(SE_BIDORO); - statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon); - if (statusAndPkrs == 6 || statusAndPkrs == 0) - PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); - if (r9 == TRUE) - { - gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11]; - ewram1C000.unkC = -32768; - if (gTasks[r7].data[11] == 0) - gTasks[r7].data[14] = 1; - else - gTasks[r7].data[14] = 0; - ewram1C000.unk14 = ewram1C000.unk10; - gTasks[r7].func = sub_806F8AC; - ewram1B000.unk282 = gTasks[r7].data[11]; - } - else - { - GetMonNickname(ewram1C000.pokemon, gStringVar1); - if (!IsBlueYellowRedFlute(item)) - RemoveBagItem(item, 1); - GetMedicineItemEffectMessage(item); - TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon); - sub_806E834(gStringVar4, 1); - gTasks[r7].func = sub_806FB0C; - } - } -} - -bool8 IsBlueYellowRedFlute(u16 item) -{ - if (item == ITEM_BLUE_FLUTE - || item == ITEM_RED_FLUTE - || item == ITEM_YELLOW_FLUTE) - return TRUE; - else - return FALSE; -} - -void sub_8070048(u8 taskId, u16 item, TaskFunc func) -{ - ewram1C000.unk10 = func; - ewram1C000.unk4 = taskId; - ewram1C000.unk6 = item; - ewram1C000.unk5 = 0; - ewram1C000.unk14 = sub_80701DC; - ewram1B000.unk27E = 0; - ewram1B000.unk280 = 0; - sub_8070088(taskId); -} - -void sub_8070088(u8 taskId) -{ - u8 taskId2; - - gTasks[taskId].func = TaskDummy; - if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0) - { - gTasks[taskId].func = sub_80701DC; - } - else - { - s16 *taskData; - - taskId2 = CreateTask(TaskDummy, 5); - taskData = gTasks[taskId2].data; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; - taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0)) - { - DestroyTask(taskId2); - gTasks[taskId].func = sub_80701DC; - } - else - { - gUnknown_0202E8F4 = 1; - Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - PlaySE(SE_KAIFUKU); - PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9); - ewram1B000.unk261 = 2; - taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11]; - taskData[14] = 1; - ewram1B000.unk27E = 1; - ewram1B000.unk280 = 1; - ewram1B000.unk282 = taskData[11]; - ewram1C000.unkC = -32768; - gTasks[taskId2].func = sub_806F8AC; - } - } -} - -void sub_80701DC(u8 taskId) -{ - if (ewram1B000.unk27E == 1) - { - AddBagItem(ewram1C000.unk6, 1); - if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0) - { - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3); - ewram1B000.unk261 = 2; - } - ewram1B000.unk27E = 0; - } - ewram1C000.unk5++; - if (ewram1C000.unk5 == 6) - { - gUnknown_0202E8F4 = 0; - if (ewram1B000.unk280 == 0) - { - gTasks[taskId].func = TaskDummy; - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - CreateTask(sub_806FB0C, 8); - } - else - { - RemoveBagItem(ewram1C000.unk6, 1); - gTasks[taskId].func = ewram1C000.unk10; - } - gLastFieldPokeMenuOpened = 0; - } - else - { - sub_8070088(taskId); - } -} - -void CreateItemUseMoveMenu(u8 partyMonIndex) -{ - u8 r6; - u8 i; - - r6 = 0; - Menu_DrawStdWindowFrame(19, 10, 29, 19); - for (i = 0; i < 4; i++) - { - u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i); - - Menu_PrintText(gMoveNames[move], 20, i * 2 + 11); - if (move != 0) - r6++; - } - InitMenu(0, 20, 11, r6, 0, 9); -} - -void Task_HandleItemUseMoveMenuInput(u8 taskId) -{ - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - else if (gMain.newKeys & A_BUTTON) - { - gUnknown_08376B54[0](taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_08376B54[1](taskId); - } -} - -void DoPPRecoveryItemEffect(u8 taskId, u16 item, TaskFunc c) -{ - const u8 *itemEffect; - u8 taskId2; - - if (item == ITEM_ENIGMA_BERRY) - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffect = gItemEffectTable[item - ITEM_POTION]; - gTasks[taskId].func = TaskDummy; - taskId2 = CreateTask(TaskDummy, 5); - sub_806E8D0(taskId, item, c); - if (!(itemEffect[4] & 0x10)) - { - gTasks[taskId2].data[11] = 0; - DoRecoverPP(taskId2); - } - else - { - PlaySE(SE_SELECT); - PrintPartyMenuPromptText(10, 3); - CreateItemUseMoveMenu(ewram1C000.unk5); - gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput; - gMain.newKeys = 0; - } -} - -void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(19, 10, 29, 19); - sub_806D5A4(); - gTasks[taskId].data[11] = Menu_GetCursorPos(); - DoRecoverPP(taskId); -} - -void ItemUseMoveMenu_HandleCancel(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(19, 10, 29, 19); - if (gMain.inBattle) - gTasks[ewram1C000.unk4].func = HandleBattlePartyMenu; - else - gTasks[ewram1C000.unk4].func = sub_808B0C0; - PrintPartyMenuPromptText(3, 0); - DestroyTask(taskId); -} - -void DoRecoverPP(u8 taskId) -{ - u16 r5 = 0; - - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11])) - { - gUnknown_0202E8F4 = r5; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - } - else - { - gUnknown_0202E8F4 = 1; - PlaySE(SE_KAIFUKU); - RemoveBagItem(ewram1C000.unk6, 1); - r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]); - StringCopy(gStringVar1, gMoveNames[r5]); - GetMedicineItemEffectMessage(ewram1C000.unk6); - sub_806E834(gStringVar4, 1); - } - gTasks[taskId].func = sub_806FB0C; -} - -void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, b, c); - PlaySE(SE_SELECT); - PrintPartyMenuPromptText(11, 3); - CreateItemUseMoveMenu(ewram1C000.unk5); - CreateTask(Task_HandleItemUseMoveMenuInput, 5); - gMain.newKeys = 0; -} - -static const u8 *const StatNames[] = -{ - gOtherText_HP, - gOtherText_Attack, - gOtherText_Defense, - gOtherText_SpAtk, - gOtherText_SpDef, - gOtherText_Speed, -}; - -static const u8 StatDataTypes[] = -{ - MON_DATA_MAX_HP, - MON_DATA_ATK, - MON_DATA_DEF, - MON_DATA_SPATK, - MON_DATA_SPDEF, - MON_DATA_SPEED, -}; - -#if DEBUG - -const u8 gUnknown_Debug_839B6CE[] = {0x40, 0, 0, 0, 0x44, 0, 0xFF, 0, 0, 0}; - -const u8 gUnknown_Debug_839B6D8[] = _( - "{STR_VAR_1}かい じっこう\n" - "{STR_VAR_2}たんいじかん しょうひ"); - -#endif - -void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - u8 i; - bool8 r0; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, b, c); - - if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100) - { - for (i = 0; i < 6; i++) - ewram1B000.statGrowths[i] = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); - r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0); - } - else - r0 = TRUE; - - if (r0) - { - gUnknown_0202E8F4 = 0; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - CreateTask(sub_806FB0C, 5); - } - else - { - u8 level; - - gUnknown_0202E8F4 = 1; - PlayFanfareByFanfareNum(0); - RedrawPokemonInfoInMenu(ewram1C000.unk5, ewram1C000.pokemon); - RemoveBagItem(b, 1); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL); - ConvertIntToDecimalStringN(gStringVar2, level, 0, 3); - StringExpandPlaceholders(gStringVar4, gOtherText_ElevatedTo); - sub_806E834(gStringVar4, 1); - CreateTask(Task_RareCandy1, 5); - } -} - -void Task_RareCandy1(u8 taskId) -{ - if (WaitFanfare(0) && gUnknown_0202E8F6 == 0) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - PlaySE(SE_SELECT); - PrintStatGrowthsInLevelUpWindow(taskId); - gTasks[taskId].func = Task_RareCandy2; - } - } -} - -void Task_RareCandy2(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - PlaySE(SE_SELECT); - PrintNewStatsInLevelUpWindow(taskId); - gTasks[taskId].func = Task_RareCandy3; - } -} - -void PrintStatGrowthsInLevelUpWindow(u8 taskId) -{ - u8 i; - - Menu_DrawStdWindowFrame(11, 0, 29, 7); - - for (i = 0; i < NUM_STATS; i++) - { - u8 x; - u8 y; - u32 stat; -#if GERMAN - u8 *ptr; -#endif - - stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); - - ewram1B000.statGrowths[i + NUM_STATS] = stat; - ewram1B000.statGrowths[i] = stat - ewram1B000.statGrowths[i]; - - x = (i / 3) * 9 + 11; - y = ((i % 3) << 1) + 1; - -#if GERMAN - ptr = StringCopy(gStringVar1, StatNames[i]); - *ptr++ = EXT_CTRL_CODE_BEGIN; - *ptr++ = 0x13; - *ptr++ = 0x2E; - ptr = StringCopy(ptr, gOtherText_TallPlusAndRightArrow); - *ptr++ = EXT_CTRL_CODE_BEGIN; - *ptr++ = 0x13; - *ptr++ = 0x34; - ConvertIntToDecimalStringN(ptr, ewram1B000.statGrowths[i], 1, 2); - Menu_PrintText(gStringVar1, x + 1, y); -#else - Menu_PrintTextPixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); - if (i == 2) - Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); - else - Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 0x06; - ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[i], 1, 2); - Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); -#endif - } -} - -void PrintNewStatsInLevelUpWindow(u8 taskId) -{ - u8 i; - - for (i = 0; i < NUM_STATS; i++) - { - u8 x; - u8 y; - u32 stat; - u32 newStatIndex; - - stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); - newStatIndex = i + 6; - ewram1B000.statGrowths[newStatIndex] = stat; - - x = ((i / 3) * 9) + 11; - y = ((i % 3) << 1) + 1; - - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 0x06; - - ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[newStatIndex], 1, 3); - Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0); - } -} - -void RedrawPokemonInfoInMenu(u8 monIndex, struct Pokemon *pokemon) -{ - u8 statusAndPkrs = GetMonStatusAndPokerus(pokemon); - u8 icon; - - if (statusAndPkrs == 0 || statusAndPkrs == 6) - PartyMenuUpdateLevelOrStatus(pokemon, monIndex); - - PartyMenuDoPrintHP(monIndex, IsDoubleBattle(), GetMonData(pokemon, MON_DATA_HP), GetMonData(pokemon, MON_DATA_MAX_HP)); - PartyMenuTryDrawHPBar(monIndex, pokemon); - - icon = GetMonIconSpriteId(ewram1C000.unk4, monIndex); - SetMonIconAnim(icon, pokemon); - - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + monIndex * 2], 7); - ewram1B000.unk261 = 2; -} - -void Task_RareCandy3(u8 taskId) -{ - if (WaitFanfare(0)) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - u16 learnedMove; - u16 evolutionSpecies; - - Menu_EraseWindowRect(11, 0, 29, 7); - - learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, TRUE); - ewram1B000.unk282 = 1; - - switch (learnedMove) - { - case 0: - // No move is learned. - evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); - if (evolutionSpecies != 0) - { - gCB2_AfterEvolution = sub_80A53F8; - BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); - DestroyTask(taskId); - } - else - { - sub_8070D90(taskId); - } - break; - case 0xFFFF: - // Mon already knows 4 moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); - - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - - ewram1C000.unk8 = gMoveToLearn; - gTasks[taskId].func = sub_806F358; - break; - case 0xFFFE: - // Move was already known by the mon. - gTasks[taskId].func = TeachMonMoveInPartyMenu; - break; - default: - // Mon automatically learned a move because it knew less than four moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[learnedMove]); - - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - - gTasks[taskId].func = Task_TeamMonTMMove3; - break; - } - } - } -} - -void TeachMonMoveInPartyMenu(u8 taskId) -{ - u16 learnedMove; - u16 evolutionSpecies; - - learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, FALSE); - switch (learnedMove) - { - case 0: - // No move is learned. - evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); - if (evolutionSpecies != 0) - { - gCB2_AfterEvolution = sub_80A53F8; - BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); - DestroyTask(taskId); - } - else - { - sub_8070D90(taskId); - } - break; - case 0xFFFF: - // Mon already knows 4 moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); - - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - - ewram1C000.unk8 = gMoveToLearn; - gTasks[taskId].func = sub_806F358; - break; - case 0xFFFE: - // Move was already known by the mon. Go on the the next move to be learned. - TeachMonMoveInPartyMenu(taskId); - break; - default: - // Mon automatically learned a move because it knew less than four moves. - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[learnedMove]); - - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - - gTasks[taskId].func = Task_TeamMonTMMove3; - break; - } -} - -static void sub_8070D90(u8 taskId) -{ - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); -} - -void DoEvolutionStoneItemEffect(u8 taskId, u16 evolutionStoneItem, TaskFunc c) -{ - PlaySE(SE_SELECT); - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, evolutionStoneItem, c); - - gCB2_AfterEvolution = sub_80A53F8; - - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, evolutionStoneItem, 0)) - { - gUnknown_0202E8F4 = 0; - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - - CreateTask(sub_806FB0C, 5); - } - else - { - RemoveBagItem(evolutionStoneItem, 1); - } -} - -#ifdef NONMATCHING -u8 GetItemEffectType(u16 item) -{ - const u8 *itemEffect; - register u8 itemEffect0 asm("r1"); - u8 mask; - - // Read the item's effect properties. - if (item == ITEM_ENIGMA_BERRY) - { - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - } - else - { - itemEffect = gItemEffectTable[item - ITEM_POTION]; - } - - itemEffect0 = itemEffect[0]; - mask = 0x3F; - - if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & 0x80)) - { - return 0; - } - else if (itemEffect0 & 0x40) - { - return 10; - } - else if (itemEffect[3] & 0x40) - { - return 1; - } - else if ((itemEffect[3] & mask) || (itemEffect0 >> 7)) - { - if ((itemEffect[3] & mask) == 0x20) - { - return 4; - } - else if ((itemEffect[3] & mask) == 0x10) - { - return 3; - } - else if ((itemEffect[3] & mask) == 0x8) - { - return 5; - } - else if ((itemEffect[3] & mask) == 0x4) - { - return 6; - } - else if ((itemEffect[3] & mask) == 0x2) - { - return 7; - } - else if ((itemEffect[3] & mask) == 0x1) - { - return 8; - } - else if ((itemEffect0 >> 7) != 0 && (itemEffect[3] & mask) == 0) - { - return 9; - } - else - { - return 11; - } - } - else if (itemEffect[4] & 0x44) - { - return 2; - } - else if (itemEffect[4] & 0x2) - { - return 12; - } - else if (itemEffect[4] & 0x1) - { - return 13; - } - else if (itemEffect[5] & 0x8) - { - return 14; - } - else if (itemEffect[5] & 0x4) - { - return 15; - } - else if (itemEffect[5] & 0x2) - { - return 16; - } - else if (itemEffect[5] & 0x1) - { - return 17; - } - else if (itemEffect[4] & 0x80) - { - return 18; - } - else if (itemEffect[4] & 0x20) - { - return 19; - } - else if (itemEffect[5] & 0x10) - { - return 20; - } - else if (itemEffect[4] & 0x18) - { - return 21; - } - else - { - return 22; - } -} -#else -__attribute__((naked)) -u8 GetItemEffectType(u16 item) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0xAF\n\ - bne _08070E5C\n\ - ldr r4, _08070E58 @ =gSaveBlock1 + 0x3676\n\ - b _08070E66\n\ - .align 2, 0\n\ -_08070E58: .4byte gSaveBlock1 + 0x3676\n\ -_08070E5C:\n\ - ldr r1, _08070E8C @ =gItemEffectTable\n\ - subs r0, 0xD\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r4, [r0]\n\ -_08070E66:\n\ - ldrb r1, [r4]\n\ - movs r5, 0x3F\n\ - adds r0, r5, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08070E88\n\ - ldrb r0, [r4, 0x1]\n\ - cmp r0, 0\n\ - bne _08070E88\n\ - ldrb r0, [r4, 0x2]\n\ - cmp r0, 0\n\ - bne _08070E88\n\ - ldrb r3, [r4, 0x3]\n\ - movs r0, 0x80\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08070E90\n\ -_08070E88:\n\ - movs r0, 0\n\ - b _08070F8A\n\ - .align 2, 0\n\ -_08070E8C: .4byte gItemEffectTable\n\ -_08070E90:\n\ - movs r2, 0x40\n\ - adds r0, r2, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070E9E\n\ - movs r0, 0xA\n\ - b _08070F8A\n\ -_08070E9E:\n\ - adds r0, r2, 0\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08070EAA\n\ - movs r0, 0x1\n\ - b _08070F8A\n\ -_08070EAA:\n\ - adds r2, r5, 0\n\ - ands r2, r3\n\ - cmp r2, 0\n\ - bne _08070EB8\n\ - lsrs r0, r1, 7\n\ - cmp r0, 0\n\ - beq _08070EFA\n\ -_08070EB8:\n\ - cmp r2, 0x20\n\ - bne _08070EC0\n\ - movs r0, 0x4\n\ - b _08070F8A\n\ -_08070EC0:\n\ - cmp r2, 0x10\n\ - bne _08070EC8\n\ - movs r0, 0x3\n\ - b _08070F8A\n\ -_08070EC8:\n\ - cmp r2, 0x8\n\ - bne _08070ED0\n\ - movs r0, 0x5\n\ - b _08070F8A\n\ -_08070ED0:\n\ - cmp r2, 0x4\n\ - bne _08070ED8\n\ - movs r0, 0x6\n\ - b _08070F8A\n\ -_08070ED8:\n\ - cmp r2, 0x2\n\ - bne _08070EE0\n\ - movs r0, 0x7\n\ - b _08070F8A\n\ -_08070EE0:\n\ - cmp r2, 0x1\n\ - bne _08070EE8\n\ - movs r0, 0x8\n\ - b _08070F8A\n\ -_08070EE8:\n\ - lsrs r0, r1, 7\n\ - cmp r0, 0\n\ - beq _08070EF6\n\ - cmp r2, 0\n\ - bne _08070EF6\n\ - movs r0, 0x9\n\ - b _08070F8A\n\ -_08070EF6:\n\ - movs r0, 0xB\n\ - b _08070F8A\n\ -_08070EFA:\n\ - ldrb r1, [r4, 0x4]\n\ - movs r0, 0x44\n\ - ands r0, r1\n\ - adds r2, r1, 0\n\ - cmp r0, 0\n\ - beq _08070F0A\n\ - movs r0, 0x2\n\ - b _08070F8A\n\ -_08070F0A:\n\ - movs r5, 0x2\n\ - adds r0, r5, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08070F18\n\ - movs r0, 0xC\n\ - b _08070F8A\n\ -_08070F18:\n\ - movs r3, 0x1\n\ - adds r0, r3, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08070F26\n\ - movs r0, 0xD\n\ - b _08070F8A\n\ -_08070F26:\n\ - ldrb r1, [r4, 0x5]\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F34\n\ - movs r0, 0xE\n\ - b _08070F8A\n\ -_08070F34:\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F40\n\ - movs r0, 0xF\n\ - b _08070F8A\n\ -_08070F40:\n\ - adds r0, r5, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F4C\n\ - movs r0, 0x10\n\ - b _08070F8A\n\ -_08070F4C:\n\ - adds r0, r3, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F58\n\ - movs r0, 0x11\n\ - b _08070F8A\n\ -_08070F58:\n\ - movs r0, 0x80\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08070F64\n\ - movs r0, 0x12\n\ - b _08070F8A\n\ -_08070F64:\n\ - movs r0, 0x20\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08070F70\n\ - movs r0, 0x13\n\ - b _08070F8A\n\ -_08070F70:\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08070F7C\n\ - movs r0, 0x14\n\ - b _08070F8A\n\ -_08070F7C:\n\ - movs r0, 0x18\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _08070F88\n\ - movs r0, 0x16\n\ - b _08070F8A\n\ -_08070F88:\n\ - movs r0, 0x15\n\ -_08070F8A:\n\ - pop {r4,r5}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - - -// Maybe this goes in start_menu.c -#if !DEBUG -void unref_sub_8070F90(void) -{ - FlagSet(FLAG_SYS_POKEDEX_GET); - FlagSet(FLAG_SYS_POKEMON_GET); - FlagSet(FLAG_SYS_POKENAV_GET); -} -#endif diff --git a/src/field/pc_screen_effect.c b/src/field/pc_screen_effect.c deleted file mode 100644 index dcc3bc9c9..000000000 --- a/src/field/pc_screen_effect.c +++ /dev/null @@ -1,117 +0,0 @@ -#include "global.h" -#include "main.h" -#include "palette.h" -#include "sprite.h" -#include "pc_screen_effect.h" - -void sub_80C603C(void); -void sub_80C6078(void); -void sub_80C60CC(struct Sprite *); -void sub_80C6130(struct Sprite *); -void sub_80C61B0(IntrFunc); -void ClearGpuRegBits(void); - -extern const struct OamData gOamData_83D18D8; - -extern const union AnimCmd *const gSpriteAnimTable_83D18E8[]; - -extern const u16 gUnknownPal_083D18EC[16]; - -extern const u8 gUnknownGfx_083D190C[128]; - -EWRAM_DATA struct PCScreenEffectStruct *gUnknown_020387EC = NULL; - -const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 }; - -const struct SpritePalette gUnknown_083D18A0 = { gUnknownPal_083D18EC, 0 }; - -const struct SpriteTemplate gSpriteTemplate_83D18A8 = -{ - 0, - 0, - &gOamData_83D18D8, - gSpriteAnimTable_83D18E8, - NULL, - gDummySpriteAffineAnimTable, - sub_80C60CC, -}; - -const struct SpriteTemplate gSpriteTemplate_83D18C0 = -{ - 0, - 0, - &gOamData_83D18D8, - gSpriteAnimTable_83D18E8, - NULL, - gDummySpriteAffineAnimTable, - sub_80C6130, -}; - -void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct) -{ - u16 i; - - struct SpriteSheet sprSheet = gUnknown_083D1898; - struct SpritePalette sprPalette = gUnknown_083D18A0; - struct SpriteTemplate sprTemplate = gSpriteTemplate_83D18A8; - - sprSheet.tag = unkStruct->tileTag; - sprTemplate.tileTag = unkStruct->tileTag; - sprPalette.tag = unkStruct->paletteTag; - sprTemplate.paletteTag = unkStruct->paletteTag; - - LoadSpriteSheet(&sprSheet); - LoadSpritePalette(&sprPalette); - - unkStruct->unk0C = 1; - unkStruct->unk0A = 0; - unkStruct->unk08 = 0; - unkStruct->selectedPalettes = ~(0x10000 << IndexOfSpritePaletteTag(unkStruct->paletteTag)) & 0xFFFF0000; - - if (unkStruct->unk04 == 0) - unkStruct->unk04 = 16; - - if (unkStruct->unk06 == 0) - unkStruct->unk06 = 20; - - gUnknown_020387EC = unkStruct; - - for (i = 0; i < 8; i++) - { - u8 spriteId = CreateSprite(&sprTemplate, 32 * i + 8, 80, 0); - if (spriteId == MAX_SPRITES) - break; - gSprites[spriteId].data[0] = (i < 4) ? -unkStruct->unk04 : unkStruct->unk04; - } - - REG_BLDCNT = 191; - REG_BLDY = 16; -} - -bool8 sub_80C5DCC(void) -{ - if (gUnknown_020387EC->unk08 == 0) - { - BlendPalettes(gUnknown_020387EC->selectedPalettes, 0x10, 0xFFFF); - sub_80C61B0(sub_80C603C); - gUnknown_020387EC->unk08++; - } - - if (gUnknown_020387EC->unk0A < 8) - return FALSE; - - gUnknown_020387EC->unk0C += gUnknown_020387EC->unk06; - - if (gUnknown_020387EC->unk0C >= 80) - { - gUnknown_020387EC->unk0C = 80; - REG_BLDCNT = 0; - REG_BLDY = 0; - ClearGpuRegBits(); - return TRUE; - } - else - { - return FALSE; - } -} diff --git a/src/field/player_pc.c b/src/field/player_pc.c deleted file mode 100644 index 27427ecaa..000000000 --- a/src/field/player_pc.c +++ /dev/null @@ -1,1337 +0,0 @@ -#include "global.h" -#include "player_pc.h" -#include "decoration.h" -#include "field_fadetransition.h" -#include "field_weather.h" -#include "item.h" -#include "item_menu.h" -#include "constants/items.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "palette.h" -#include "script.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "constants/songs.h" -#include "name_string_util.h" -#include "mail.h" -#include "overworld.h" -#include "player_pc.h" -#include "ewram.h" - -extern void DisplayItemMessageOnField(u8, const u8*, TaskFunc, u16); -extern void DoPlayerPCDecoration(u8); -extern void BuyMenuFreeMemory(void); -extern void DestroyVerticalScrollIndicator(u8); -extern void PauseVerticalScrollIndicator(u8); -extern void LoadScrollIndicatorPalette(void); -extern void ClearMailStruct(struct MailStruct *); -extern u8 IsWeatherNotFadingIn(void); -extern void sub_808B020(void); -extern void ClearVerticalScrollIndicatorPalettes(void); - -static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL; - -static u8 gPcItemMenuOptionsNum; - -extern u8 gUnknown_02038561; - -// event scripts -extern u8 gBrendanHouse_TurnPCOff[]; -extern u8 gMayHouse_TurnPCOff[]; - -extern void (*gFieldCallback)(void); - -static void InitPlayerPCMenu(u8 taskId); -static void PlayerPCProcessMenuInput(u8 taskId); -static void InitItemStorageMenu(u8); -static void ItemStorageMenuPrint(const u8 *); -static void ItemStorageMenuProcessInput(u8); -static void ItemStorage_ProcessInput(u8); -static void ItemStorage_SetItemAndMailCount(u8); -static void ItemStorage_DoItemAction(u8); -static void ItemStorage_GoBackToPlayerPCMenu(u8); -static void ItemStorage_HandleQuantityRolling(u8); -static void ItemStorage_DoItemWithdraw(u8); -static void ItemStorage_DoItemToss(u8); -static void ItemStorage_HandleRemoveItem(u8); -static void ItemStorage_WaitPressHandleResumeProcessInput(u8); -static void ItemStorage_HandleResumeProcessInput(u8); -static void ItemStorage_DoItemSwap(u8, bool8); -static void ItemStorage_DrawItemList(u8); -static void ItemStorage_PrintItemPcResponse(u16); -static void ItemStorage_DrawBothListAndDescription(u8); -static void ItemStorage_GoBackToItemPCMenu(u8, u8); -static void ItemStorage_LoadPalette(void); -static u8 GetMailboxMailCount(void); -static void Mailbox_UpdateMailList(void); -static void Mailbox_DrawMailboxMenu(u8); -static void Mailbox_ProcessInput(u8); -static void Mailbox_CloseScrollIndicators(void); -static void Mailbox_PrintWhatToDoWithPlayerMailText(u8); -static void Mailbox_TurnOff(u8); -static void Mailbox_PrintMailOptions(u8); -static void Mailbox_MailOptionsProcessInput(u8); -static void Mailbox_FadeAndReadMail(u8); -static void Mailbox_ReturnToFieldFromReadMail(void); -static void Mailbox_DrawYesNoBeforeMove(u8); -static void Mailbox_DoGiveMailPokeMenu(u8); -static void Mailbox_NoPokemonForMail(u8); -static void Mailbox_Cancel(u8); -static void Mailbox_DrawMailMenuAndDoProcessInput(u8); -static void PlayerPC_ItemStorage(u8 taskId); -static void PlayerPC_Mailbox(u8 taskId); -static void PlayerPC_Decoration(u8 var); -static void PlayerPC_TurnOff(u8 taskId); -static void ItemStorage_Withdraw(u8); -static void ItemStorage_Deposit(u8); -static void ItemStorage_Toss(u8); -static void ItemStorage_Exit(u8); -static void ItemStorage_ResumeInputFromYesToss(u8); -static void ItemStorage_ResumeInputFromNoToss(u8); -static void Mailbox_DoMailMoveToBag(u8); -static void Mailbox_ReturnToInputAfterNo(u8); -static void Mailbox_DoMailRead(u8); -static void Mailbox_MoveToBag(u8); -static void Mailbox_Give(u8); -static void Mailbox_Cancel(u8); - -static const u8 *const gPCText_OptionDescList[] = -{ - PCText_TakeOutItems, - PCText_StoreItems, - PCText_ThrowAwayItems, - gMenuText_GoBackToPrev -}; - -static const struct MenuAction2 sPlayerPCMenuActions[] = -{ - { SecretBaseText_ItemStorage, PlayerPC_ItemStorage }, - { gPCText_Mailbox, PlayerPC_Mailbox }, - { SecretBaseText_Decoration, PlayerPC_Decoration }, - { SecretBaseText_TurnOff, PlayerPC_TurnOff } -}; - -static const u8 gBedroomPC_OptionOrder[] = -{ - PLAYERPC_MENU_ITEMSTORAGE, - PLAYERPC_MENU_MAILBOX, - PLAYERPC_MENU_DECORATION, - PLAYERPC_MENU_TURNOFF -}; - -static const u8 gPlayerPC_OptionOrder[] = -{ - PLAYERPC_MENU_ITEMSTORAGE, - PLAYERPC_MENU_MAILBOX, - PLAYERPC_MENU_TURNOFF -}; - -static const struct MenuAction2 gPCText_ItemPCOptionsText[] = -{ - { PCText_WithdrawItem, ItemStorage_Withdraw }, - { PCText_DepositItem, ItemStorage_Deposit }, - { PCText_TossItem, ItemStorage_Toss }, - { gUnknownText_Exit, ItemStorage_Exit } -}; - -static const struct YesNoFuncTable ResumeFromTossYesNoFuncList[] = // ResumeFromTossYesNoFuncList -{ - ItemStorage_ResumeInputFromYesToss, - ItemStorage_ResumeInputFromNoToss -}; - -static const struct YesNoFuncTable ResumeFromWithdrawYesNoFuncList[] = // ResumeFromWithdrawYesNoFuncList -{ - Mailbox_DoMailMoveToBag, - Mailbox_ReturnToInputAfterNo -}; - -// the use of this struct is meant to be an ItemSlot struct, but NewGameInitPCItems refuses to match without a weird pointer access. -static const struct ItemSlot gNewGamePCItems[] = -{ - { ITEM_POTION, 1 }, - { ITEM_NONE, 0 } -}; - -static const struct MenuAction2 gMailboxMailOptions[] = -{ - { OtherText_Read, Mailbox_DoMailRead }, - { gOtherText_MoveToBag, Mailbox_MoveToBag }, - { OtherText_Give, Mailbox_Give }, - { gOtherText_CancelNoTerminator, Mailbox_Cancel } -}; - -static const u8 gNonSelectedItemFormattedText[] = _("{STR_VAR_1}{CLEAR_TO 80}"); -static const u8 gSelectedItemFormattedText[] = _("{COLOR RED}{STR_VAR_1}{CLEAR_TO 80}"); -static const u8 gNonSelectedItemQuantityFormatText[] = _("{STR_VAR_1}"); -static const u8 gSelectedItemQuantityFormatText[] = _("{COLOR RED}{STR_VAR_1}"); -static const u8 gUnknown_08406330[] = _("{CLEAR_TO 32}"); - -extern u8 *gUnknown_02039314; -extern struct MenuAction gUnknown_08406298[]; - -extern u8 gUnknown_084062B8[]; -extern u8 gUnknown_084062BC[]; -extern u8 gUnknown_0840632A[]; -extern u8 gUnknown_08406327[]; -extern u8 gUnknown_0840631E[]; -extern u8 gUnknown_08406318[]; - -extern u8 gUnknown_030007B4; -extern u8 unk_201FE00[]; - -extern u8 gUnknown_08152850; -extern u8 gUnknown_08152C75; - -extern u32 gUnknown_08406288[]; -extern const struct MenuAction gUnknown_084062C0[]; -extern const struct YesNoFuncTable gUnknown_084062E0; - -void NewGameInitPCItems(void) -{ - u8 i; - - // because Game Freak don't know how to use a struct or a 2d array - for(i = 0, ClearItemSlots(gSaveBlock1.pcItems, ARRAY_COUNT(gSaveBlock1.pcItems)); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) && - AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++) - ; -} - -void BedroomPC(void) -{ - gPcItemMenuOptionOrder = gBedroomPC_OptionOrder; - gPcItemMenuOptionsNum = 4; - DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); -} - -void PlayerPC(void) -{ - gPcItemMenuOptionOrder = gPlayerPC_OptionOrder; - gPcItemMenuOptionsNum = 3; - DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); -} - -static void InitPlayerPCMenu(u8 taskId) -{ - Menu_DrawStdWindowFrame(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1); - Menu_PrintItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder); - InitMenu(0, 1, 1, gPcItemMenuOptionsNum, 0, 9); - TASK.FUNC = PlayerPCProcessMenuInput; -} - -static void PlayerPCProcessMenuInput(u8 taskId) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - else if (gMain.newKeys & A_BUTTON) - { - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - sPlayerPCMenuActions[gPcItemMenuOptionOrder[Menu_GetCursorPos()]].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - sPlayerPCMenuActions[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT. - } -} - -void ReshowPlayerPC(u8 var) -{ - DisplayItemMessageOnField(var, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); -} - -static void PlayerPC_ItemStorage(u8 taskId) -{ - InitItemStorageMenu(ITEMPC_MENU_WITHDRAW); - TASK.FUNC = ItemStorageMenuProcessInput; -} - -static void PlayerPC_Mailbox(u8 taskId) -{ - Menu_EraseWindowRect(0, 0, 10, 9); - eMailboxInfo.count = GetMailboxMailCount(); - - if (eMailboxInfo.count == 0) - DisplayItemMessageOnField(taskId, gOtherText_NoMailHere, ReshowPlayerPC, 0); - else - { - eMailboxInfo.cursorPos = 0; - eMailboxInfo.itemsAbove = 0; - Mailbox_UpdateMailList(); - ItemStorage_SetItemAndMailCount(taskId); - Mailbox_DrawMailboxMenu(taskId); - TASK.FUNC = Mailbox_ProcessInput; - } -} - -static void PlayerPC_Decoration(u8 var) -{ - Menu_EraseWindowRect(0, 0, 10, 9); - DoPlayerPCDecoration(var); -} - -static void PlayerPC_TurnOff(u8 taskId) -{ - if (gPcItemMenuOptionsNum == 4) // if the option count is 4, we are at the bedroom PC and not player PC, so do gender specific handling. - { - Menu_EraseWindowRect(0, 0, 0x1D, 0x13); - - if (gSaveBlock2.playerGender == MALE) - ScriptContext1_SetupScript(gBrendanHouse_TurnPCOff); - else - ScriptContext1_SetupScript(gMayHouse_TurnPCOff); - } - else - { - Menu_EraseWindowRect(0, 0, 10, 9); - EnableBothScriptContexts(); - } - DestroyTask(taskId); -} - -static void InitItemStorageMenu(u8 var) -{ - Menu_EraseWindowRect(0, 0, 10, 9); - Menu_DrawStdWindowFrame(0, 0, 11, 9); - Menu_PrintItems(1, 1, 4, (struct MenuAction *)gPCText_ItemPCOptionsText); - InitMenu(0, 1, 1, 4, var, 10); - ItemStorageMenuPrint(gPCText_OptionDescList[var]); -} - -static void ItemStorageMenuPrint(const u8 *textPtr) -{ - Menu_BlankWindowRect(2, 15, 27, 18); - Menu_PrintText(textPtr, 2, 15); -} - -static void ItemStorageMenuProcessInput(u8 var) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gPCText_ItemPCOptionsText[Menu_GetCursorPos()].func(var); - } - else if (gMain.newKeys & B_BUTTON) - { - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - gPCText_ItemPCOptionsText[ITEMPC_MENU_EXIT].func(var); - } -} - -static void Task_ItemStorage_Deposit(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_80A6A30(); - DestroyTask(taskId); - } -} - -static void ItemStorage_Deposit(u8 taskId) -{ - TASK.FUNC = Task_ItemStorage_Deposit; - FadeScreen(1, 0); -} - -static void ItemStorage_HandleReturnToProcessInput(u8 taskId) -{ - if (IsWeatherNotFadingIn() == TRUE) - TASK.FUNC = ItemStorageMenuProcessInput; -} - -void ItemStorage_ReturnToMenuAfterDeposit(void) -{ - Menu_DisplayDialogueFrame(); - InitItemStorageMenu(ITEMPC_MENU_DEPOSIT); - CreateTask(ItemStorage_HandleReturnToProcessInput, 0); - pal_fill_black(); -} - -static void ItemStorage_Withdraw(u8 taskId) -{ - s16 *data = TASK.data; - - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 11, 9); - NUM_ITEMS = CountUsedPCItemSlots(); - - if (NUM_ITEMS != 0) - { - Menu_EraseWindowRect(0, 14, 29, 19); - CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_WITHDRAW; - PAGE_INDEX = 0; - ITEMS_ABOVE_TOP = 0; - ItemStorage_SetItemAndMailCount(taskId); - ItemStorage_GoBackToItemPCMenu(taskId, 0); - TASK.FUNC = ItemStorage_ProcessInput; - } - else - DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0); -} - -static void ItemStorage_Toss(u8 taskId) -{ - s16 *data = TASK.data; - - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 11, 9); - NUM_ITEMS = CountUsedPCItemSlots(); - - if (NUM_ITEMS) - { - Menu_EraseWindowRect(0, 14, 29, 19); - CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_TOSS; - PAGE_INDEX = 0; - ITEMS_ABOVE_TOP = 0; - ItemStorage_SetItemAndMailCount(taskId); - ItemStorage_GoBackToItemPCMenu(taskId, 2); - TASK.FUNC = ItemStorage_ProcessInput; - } - else - DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0); -} - -static void ItemStorage_Exit(u8 var) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 11, 9); - ReshowPlayerPC(var); -} - -static void ItemStorage_SetItemAndMailCount(u8 taskId) -{ - s16 *data = TASK.data; - - if (NUM_ITEMS > 7) // we have a full page, so set the num of page items appropriately. - NUM_PAGE_ITEMS = 8; - else - NUM_PAGE_ITEMS = NUM_ITEMS + 1; // there are not enough items to fill a full page; take the # of items and add 1 for the cancel button. - - if (eMailboxInfo.count > 7) - eMailboxInfo.pageItems = 8; - else - eMailboxInfo.pageItems = eMailboxInfo.count + 1; -} - -static void ItemStorage_ProcessInput(u8 taskId) -{ - s16 *data = TASK.data; - s16 trueIndex; - - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if(PAGE_INDEX != 0) // did the cursor move physically upwards? - { - PlaySE(SE_SELECT); - PAGE_INDEX = Menu_MoveCursor(-1); - trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; - if (SWITCH_MODE_ACTIVE == FALSE) // are we not currently switching items? - { - if (trueIndex == NUM_ITEMS) // if the cursor is on top of cancel, print the go back to prev description. - { - ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); - } - else - { - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); - } - } - } - else // the page cursor is at the top. but we may not be at the top of the true index list, so do another check. - { - if (ITEMS_ABOVE_TOP == 0) // did the cursor not move due to being at the top of the list? - return; - - PlaySE(SE_SELECT); - ITEMS_ABOVE_TOP--; - ItemStorage_DrawBothListAndDescription(taskId); - - if (SWITCH_MODE_ACTIVE != FALSE) - Menu_MoveCursor(0); // don't move the cursor. it's at the top of the page index, but not the true index. - } - } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _0813A306 - { - if(PAGE_INDEX != NUM_PAGE_ITEMS - 1) - { - PlaySE(SE_SELECT); - PAGE_INDEX = Menu_MoveCursor(1); - trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; - - if(SWITCH_MODE_ACTIVE != FALSE) - return; - - if (trueIndex == NUM_ITEMS) - ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); // probably further down - else - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); - } - else if(ITEMS_ABOVE_TOP + PAGE_INDEX != NUM_ITEMS) - { - PlaySE(SE_SELECT); - ITEMS_ABOVE_TOP++; - ItemStorage_DrawBothListAndDescription(taskId); - - if (SWITCH_MODE_ACTIVE != FALSE) - Menu_MoveCursor(0); - } - } - else if(gMain.newKeys & SELECT_BUTTON) // _0813A3A0 - { - if (SWITCH_MODE_ACTIVE == FALSE) - { - if (PAGE_INDEX + ITEMS_ABOVE_TOP != NUM_ITEMS) // you cannot swap the Cancel button. - { - PlaySE(SE_SELECT); - SWITCH_MODE_ACTIVE = TRUE; - SWAP_ITEM_INDEX = ITEMS_ABOVE_TOP + PAGE_INDEX; - ItemStorage_PrintItemPcResponse(ITEMPC_SWITCH_WHICH_ITEM); - } - // _0813A3DC - ItemStorage_DrawItemList(taskId); - } - else // _0813A3E8 - { - PlaySE(SE_SELECT); - ItemStorage_DoItemSwap(taskId, FALSE); - ItemStorage_DrawBothListAndDescription(taskId); - } - } - else if(gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if(SWITCH_MODE_ACTIVE == FALSE) - { - if(ITEMS_ABOVE_TOP + PAGE_INDEX != NUM_ITEMS) - { - ItemStorage_DoItemAction(taskId); - } - else - { - ItemStorage_GoBackToPlayerPCMenu(taskId); - } - } - else - { - ItemStorage_DoItemSwap(taskId, FALSE); - ItemStorage_DrawBothListAndDescription(taskId); - } - } - else if(gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - if(SWITCH_MODE_ACTIVE == FALSE) - { - Menu_DestroyCursor(); - ItemStorage_GoBackToPlayerPCMenu(taskId); - } - else - { - ItemStorage_DoItemSwap(taskId, TRUE); - ItemStorage_DrawBothListAndDescription(taskId); - } - } -} - -static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) -{ - BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(TOP_ARROW); - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - Menu_EraseWindowRect(0, 0, 29, 19); - Menu_DisplayDialogueFrame(); - InitItemStorageMenu(TASK.CURRENT_ITEM_STORAGE_MENU); - TASK.FUNC = ItemStorageMenuProcessInput; -} - -static void ItemStorage_DoItemAction(u8 taskId) -{ - s16 *data = TASK.data; - u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; - - PauseVerticalScrollIndicator(TOP_ARROW); - PauseVerticalScrollIndicator(BOTTOM_ARROW); - - if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) - { - if(gSaveBlock1.pcItems[trueIndex].quantity == 1) - { - NUM_QUANTITY_ROLLER = 1; - ItemStorage_DoItemWithdraw(taskId); - return; - } - else // _0813A50C - { - ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_WITHDRAW); - } - } - else if(gSaveBlock1.pcItems[trueIndex].quantity == 1) // _0813A518 - { - NUM_QUANTITY_ROLLER = 1; - ItemStorage_DoItemToss(taskId); - return; - } - else - { - ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS); - } - NUM_QUANTITY_ROLLER = 1; - Menu_DrawStdWindowFrame(6, 8, 13, 11); - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); - TASK.FUNC = ItemStorage_HandleQuantityRolling; -} - -static void ItemStorage_HandleQuantityRolling(u8 taskId) -{ - s16 *data = TASK.data; - u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; - - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - if(NUM_QUANTITY_ROLLER != gSaveBlock1.pcItems[trueIndex].quantity) - NUM_QUANTITY_ROLLER++; - else - NUM_QUANTITY_ROLLER = 1; // you are at the max amount of items you have when you press Up, set your quantity back to 1. - - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? - } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if(NUM_QUANTITY_ROLLER != 1) - NUM_QUANTITY_ROLLER--; - else - NUM_QUANTITY_ROLLER = gSaveBlock1.pcItems[trueIndex].quantity; // you are at 0 when you press down, set your quantity to the amount you have. - - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? - } - else if(gMain.newAndRepeatedKeys & DPAD_LEFT) // reduce by 10. - { - NUM_QUANTITY_ROLLER -= 10; - - if(NUM_QUANTITY_ROLLER <= 0) - NUM_QUANTITY_ROLLER = 1; // dont underflow or allow 0! - - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? - } - else if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // add 10. - { - NUM_QUANTITY_ROLLER += 10; - - if(NUM_QUANTITY_ROLLER > gSaveBlock1.pcItems[trueIndex].quantity) - NUM_QUANTITY_ROLLER = gSaveBlock1.pcItems[trueIndex].quantity; // dont overflow! - - sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? - } - else if(gMain.newKeys & A_BUTTON) // confirm quantity. - { - PlaySE(SE_SELECT); - Menu_EraseWindowRect(6, 6, 0xD, 0xB); - - if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) - ItemStorage_DoItemWithdraw(taskId); - else - ItemStorage_DoItemToss(taskId); - } - else if(gMain.newKeys & B_BUTTON) // cancel quantity. - { - PlaySE(SE_SELECT); - Menu_EraseWindowRect(6, 6, 0xD, 0xB); - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); // why not use trueIndex? - TASK.FUNC = ItemStorage_ProcessInput; - } -} - -static void ItemStorage_DoItemWithdraw(u8 taskId) -{ - s16 *data = TASK.data; - u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; - - if(AddBagItem(gSaveBlock1.pcItems[trueIndex].itemId, NUM_QUANTITY_ROLLER) == TRUE) // add item works. - { - CopyItemName(gSaveBlock1.pcItems[trueIndex].itemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, NUM_QUANTITY_ROLLER, 0, 3); - ItemStorage_PrintItemPcResponse(ITEMPC_WITHDREW_THING); - TASK.FUNC = ItemStorage_HandleRemoveItem; - } - else - { - NUM_QUANTITY_ROLLER = 0; - ItemStorage_PrintItemPcResponse(ITEMPC_NO_MORE_ROOM); - TASK.FUNC = ItemStorage_WaitPressHandleResumeProcessInput; - } -} - -static void ItemStorage_DoItemToss(u8 taskId) -{ - s16 *data = TASK.data; - u8 var = PAGE_INDEX + ITEMS_ABOVE_TOP; - - if(ItemId_GetImportance(gSaveBlock1.pcItems[var].itemId) == FALSE) - { - CopyItemName(gSaveBlock1.pcItems[var].itemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, NUM_QUANTITY_ROLLER, 0, 3); - ItemStorage_PrintItemPcResponse(ITEMPC_OKAY_TO_THROW_AWAY); - DisplayYesNoMenu(7, 6, 1); - DoYesNoFuncWithChoice(taskId, (struct YesNoFuncTable *)&ResumeFromTossYesNoFuncList); - } - else - { - NUM_QUANTITY_ROLLER = 0; - ItemStorage_PrintItemPcResponse(ITEMPC_TOO_IMPORTANT); - TASK.FUNC = ItemStorage_HandleRemoveItem; - } -} - -static void ItemStorage_ResumeInputFromYesToss(u8 taskId) -{ - Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); - ItemStorage_PrintItemPcResponse(ITEMPC_THREW_AWAY_ITEM); - TASK.FUNC = ItemStorage_HandleRemoveItem; -} - -static void ItemStorage_ResumeInputFromNoToss(u8 taskId) -{ - s16 *data = TASK.data; - - Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); - InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); - TASK.FUNC = ItemStorage_ProcessInput; -} - -static void ItemStorage_HandleRemoveItem(u8 taskId) -{ - s16 *data = TASK.data; - s16 oldNumItems; - - if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) - { - RemovePCItem(PAGE_INDEX + ITEMS_ABOVE_TOP, NUM_QUANTITY_ROLLER); - oldNumItems = NUM_ITEMS; - NUM_ITEMS = CountUsedPCItemSlots(); - - if(oldNumItems != NUM_ITEMS && oldNumItems < NUM_PAGE_ITEMS + ITEMS_ABOVE_TOP && ITEMS_ABOVE_TOP != 0) - ITEMS_ABOVE_TOP--; - - ItemStorage_SetItemAndMailCount(taskId); - ItemStorage_HandleResumeProcessInput(taskId); - InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); - } -} - -static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId) -{ - s16 *data = TASK.data; - - if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) - { - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - TASK.FUNC = ItemStorage_ProcessInput; - } -} - -static void ItemStorage_HandleResumeProcessInput(u8 taskId) -{ - Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - ItemStorage_DrawBothListAndDescription(taskId); - TASK.FUNC = ItemStorage_ProcessInput; -} - -static void ItemStorage_DoItemSwap(u8 taskId, bool8 switchModeDisabled) -{ - s16 *data = TASK.data; - u8 trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; - - SWITCH_MODE_ACTIVE = FALSE; - - if((u8)NUM_ITEMS > trueIndex && (u8)SWAP_ITEM_INDEX != trueIndex && switchModeDisabled == FALSE) - { - struct ItemSlot itemSlot = gSaveBlock1.pcItems[SWAP_ITEM_INDEX]; // backup the itemSlot before swapping the two. - - gSaveBlock1.pcItems[SWAP_ITEM_INDEX] = gSaveBlock1.pcItems[trueIndex]; - gSaveBlock1.pcItems[trueIndex] = itemSlot; - return; - } - else if(trueIndex == NUM_ITEMS) - { - ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); - } - else - { - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); - } - - /* - THEORY: This check produces essentially dead code, but it might have been working in an earlier build - in which case it allows a programmer to easily duplicate items without the use of a debug menu. - This gets the page index of the swap index for some reason. It is currently unknown what it would have been used - for, but perhaps it was used to increase the quantity of the item without a debug menu. - With the removal of a lot of the debug menus close to release, a programmer may have added this to - help test things with a low key (such as planting a lot of duplicated berries, which requires this lazy "cheat") - without bringing the relevent debug menus back. The commented out line is intentionally left in below to show - what it may have looked like. - */ - if(SWAP_ITEM_INDEX - ITEMS_ABOVE_TOP <= 0) { // this check is arbitrary and used to generate the correct assembly using the subtraction, which is what matters. the 0 check doesn't. - //gSaveBlock1.pcItems[SWAP_ITEM_INDEX].quantity += 100; - gSaveBlock1.pcItems[SWAP_ITEM_INDEX].quantity += 0; // do not enforce item cap. - } -} - -static void ItemStorage_DrawItemQuantity(u16 arg1, enum StringConvertMode arg2, u8 arg3, u8 arg4, int isSwapSelected) -{ - sub_80A4164(gStringVar1, arg1, arg2, arg4); - - if(isSwapSelected != FALSE) - Menu_PrintText(gSelectedItemQuantityFormatText, 0x1A, arg3); - else - Menu_PrintText(gNonSelectedItemQuantityFormatText, 0x1A, arg3); -} - -static void ItemStorage_DrawItemVoidQuantity(u8 var) -{ - Menu_PrintText(gUnknown_08406330, 0x19, var); -} - -static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSwapSelected) -{ - CopyItemName(itemSlot->itemId, gStringVar1); - - if(isSwapSelected != FALSE) - Menu_PrintText(gSelectedItemFormattedText, 16, var); - else - Menu_PrintText(gNonSelectedItemFormattedText, 16, var); -} - -static void ItemStorage_DrawNormalItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) -{ - ItemStorage_DrawItemName(itemSlot, var, var2); - ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); -} - -static void ItemStorage_DrawKeyItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) -{ - ItemStorage_DrawItemName(itemSlot, var, var2); - ItemStorage_DrawItemVoidQuantity(var); -} - -static void ItemStorage_DrawTMHMEntry(struct ItemSlot *itemSlot, u8 var, int var2) -{ - ItemStorage_DrawItemName(itemSlot, var, var2); - - if(itemSlot->itemId < ITEM_HM01_CUT) - ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); - else - ItemStorage_DrawItemVoidQuantity(var); // HMs do not have a quantity. -} - -static void ItemStorage_DrawItemList(u8 taskId) -{ - s16 *data = TASK.data; - int tempArg; - u16 i; - u16 yCoord = 0; - - for (i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++) - { - yCoord = (i - ITEMS_ABOVE_TOP) * 2; - - if (i == NUM_ITEMS) - { - sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1); - break; - } - else - { - tempArg = 0; - - if (SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX) - tempArg = 1; - - switch (GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1) - { - case 0: - case 1: - case 3: - ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; - case 4: - ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; - case 2: - ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; - } - } - } - - if (i - ITEMS_ABOVE_TOP < 8) - Menu_BlankWindowRect(16, yCoord + 4, 0x1C, 0x12); - - if (ITEMS_ABOVE_TOP != 0) - CreateVerticalScrollIndicators(TOP_ARROW, 0xB8, 8); - else - DestroyVerticalScrollIndicator(TOP_ARROW); - - if (ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS) - CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xB8, 0x98); - else - DestroyVerticalScrollIndicator(BOTTOM_ARROW); -} - -static void ItemStorage_PrintItemPcResponse(u16 itemId) -{ - const u8 *string; - - switch(itemId) - { - case ITEMPC_GO_BACK_TO_PREV: - string = gMenuText_GoBackToPrev; - break; - case ITEMPC_HOW_MANY_TO_WITHDRAW: - string = gOtherText_HowManyToWithdraw; - break; - case ITEMPC_WITHDREW_THING: - string = gOtherText_WithdrewThing; - break; - case ITEMPC_HOW_MANY_TO_TOSS: - string = gOtherText_HowManyToToss; - break; - case ITEMPC_THREW_AWAY_ITEM: - string = gOtherText_ThrewAwayItem; - break; - case ITEMPC_NO_MORE_ROOM: - string = gOtherText_NoMoreRoom; - break; - case ITEMPC_TOO_IMPORTANT: - string = gOtherText_TooImportant; - break; - case ITEMPC_OKAY_TO_THROW_AWAY: - string = gOtherText_OkayToThrowAwayPrompt; - break; - case ITEMPC_SWITCH_WHICH_ITEM: - string = gOtherText_SwitchWhichItem; - break; - default: - string = ItemId_GetDescription(itemId); - break; - } - - sub_8072AB0(string, 8, 0x68, 0x68, 0x30, 1); -} - -static void ItemStorage_DrawBothListAndDescription(u8 taskId) -{ - s16 *data = TASK.data; - s16 trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; - - ItemStorage_DrawItemList(taskId); - - if(SWITCH_MODE_ACTIVE == FALSE) - { - if(trueIndex == NUM_ITEMS) - ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); - else - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); - } -} - -static void ItemStorage_GoBackToItemPCMenu(u8 taskId, u8 var) -{ - s16 *data = TASK.data; - - ClearVerticalScrollIndicatorPalettes(); - LoadScrollIndicatorPalette(); - ItemStorage_LoadPalette(); - Menu_DrawStdWindowFrame(0xF, 0, 0x1D, 0x13); - Menu_DrawStdWindowFrame(0, 0xC, 0xE, 0x13); - Menu_DrawStdWindowFrame(0, 0, 0xB, 3); - ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[0].itemId); - Menu_PrintText(gPCText_ItemPCOptionsText[var].text, 1, 1); - ItemStorage_DrawItemList(taskId); - InitMenu(0, 0x10, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); -} - -static void ItemStorage_LoadPalette(void) -{ - u16 arr[] = { - 0x5294, - 0x6B5A, - 0x7FFF - }; - - LoadPalette(&arr[2], 0xDF, 2); - LoadPalette(&arr[1], 0xD1, 2); - LoadPalette(&arr[0], 0xD8, 2); -} - -static u8 GetMailboxMailCount(void) -{ - u8 i, j; - - for(i = 0, j = 6; j < 16; j++) - if(gSaveBlock1.mail[j].itemId != 0) - i++; - - return i; -} - -static void Mailbox_UpdateMailList(void) -{ - struct MailStruct mailBuffer; - u8 i, j; - - for (i=6; i<15; i++) - { - for (j=i+1; j<16; j++) - { - if (gSaveBlock1.mail[i].itemId == 0) - { - mailBuffer = gSaveBlock1.mail[i]; - gSaveBlock1.mail[i] = gSaveBlock1.mail[j]; - gSaveBlock1.mail[j] = mailBuffer; - } - } - } -} - -static void Mailbox_DrawMailList(u8 taskId) // taskId is unused -{ - u16 yCoord = 0; - u16 i; - - for (i = eMailboxInfo.itemsAbove; i < eMailboxInfo.itemsAbove + eMailboxInfo.pageItems; i++) - { - yCoord = (i - eMailboxInfo.itemsAbove) * 2; - Menu_BlankWindowRect(0x15, yCoord + 2, 0x1C, yCoord + 3); - if (i == eMailboxInfo.count) - { - Menu_PrintText(gOtherText_CancelNoTerminator, 0x15, yCoord + 2); - break; - } - else - { - StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName); - SanitizeNameString(gStringVar1); - Menu_PrintText(gStringVar1, 0x15, yCoord + 2); - } - } - - if (i - eMailboxInfo.itemsAbove != 8) - Menu_BlankWindowRect(0x15, yCoord + 4, 0x1C, 0x12); - - if (eMailboxInfo.itemsAbove != 0) - CreateVerticalScrollIndicators(TOP_ARROW, 0xC8, 8); - else - DestroyVerticalScrollIndicator(TOP_ARROW); - - if (eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count) - CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xC8, 0x98); - else - DestroyVerticalScrollIndicator(BOTTOM_ARROW); -} - -static void Mailbox_DrawMailboxMenu(u8 taskId) -{ - ClearVerticalScrollIndicatorPalettes(); - LoadScrollIndicatorPalette(); - Menu_EraseWindowRect(0, 0, 0x1D, 0x13); - Menu_DrawStdWindowFrame(0, 0, 0x8, 0x3); - Menu_PrintText(gPCText_Mailbox, 1, 1); - Menu_DrawStdWindowFrame(0x14, 0, 0x1D, 0x13); - Mailbox_DrawMailList(taskId); - InitMenu(0, 0x15, 2, eMailboxInfo.pageItems, eMailboxInfo.cursorPos, 8); -} - -// Mailbox_ProcessInput -static void Mailbox_ProcessInput(u8 taskId) -{ - if(!gPaletteFade.active) - { - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - if(eMailboxInfo.cursorPos != 0) - { - PlaySE(SE_SELECT); - eMailboxInfo.cursorPos = Menu_MoveCursor(-1); - } - else if(eMailboxInfo.itemsAbove != 0) - { - PlaySE(SE_SELECT); - eMailboxInfo.itemsAbove--; - Mailbox_DrawMailList(taskId); - } - } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if(eMailboxInfo.cursorPos != eMailboxInfo.pageItems - 1) - { - PlaySE(SE_SELECT); - eMailboxInfo.cursorPos = Menu_MoveCursor(1); - } - else if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos != eMailboxInfo.count) - { - PlaySE(SE_SELECT); - eMailboxInfo.itemsAbove++; - Mailbox_DrawMailList(taskId); - } - } - else if(gMain.newKeys & A_BUTTON) - { - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - - if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos == eMailboxInfo.count) - { - Mailbox_TurnOff(taskId); - } - else - { - Mailbox_CloseScrollIndicators(); - TASK.FUNC = Mailbox_PrintWhatToDoWithPlayerMailText; - } - } - else if(gMain.newKeys & B_BUTTON) - { - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - Mailbox_TurnOff(taskId); - } - } -} - -static void Mailbox_CloseScrollIndicators(void) -{ - BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(TOP_ARROW); - DestroyVerticalScrollIndicator(BOTTOM_ARROW); -} - -static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) -{ - Menu_EraseWindowRect(0, 0, 0x1D, 0x13); - StringCopy(gStringVar1, gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos].playerName); - SanitizeNameString(gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail); - DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions, 0); -} - -static void Mailbox_ReturnToPlayerPC(u8 taskId) -{ - Menu_EraseWindowRect(0, 0, 0x1D, 0x13); - ReshowPlayerPC(taskId); -} - -static void Mailbox_TurnOff(u8 taskId) -{ - Mailbox_CloseScrollIndicators(); - TASK.FUNC = Mailbox_ReturnToPlayerPC; -} - -static void Mailbox_PrintMailOptions(u8 taskId) // Mailbox_PrintMailOptions -{ - Menu_DrawStdWindowFrame(0, 0, 0xC, 0x9); - Menu_PrintItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions); - InitMenu(0, 1, 1, 4, 0, 0xB); - TASK.FUNC = Mailbox_MailOptionsProcessInput; -} - -static void Mailbox_MailOptionsProcessInput(u8 taskId) -{ - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - else if(gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gMailboxMailOptions[Menu_GetCursorPos()].func(taskId); - } - else if(gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - Mailbox_Cancel(taskId); - } -} - -static void Mailbox_DoMailRead(u8 taskId) -{ - FadeScreen(1, 0); - TASK.FUNC = Mailbox_FadeAndReadMail; -} - -static void Mailbox_FadeAndReadMail(u8 taskId) -{ - if(!gPaletteFade.active) - { - HandleReadMail(&gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos], Mailbox_ReturnToFieldFromReadMail, 1); - DestroyTask(taskId); - } -} - -static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput -{ - if (IsWeatherNotFadingIn() == TRUE) // is black fade finished? why not gPaletteFade.active? - TASK.FUNC = Mailbox_ProcessInput; -} - -static void Mailbox_DoRedrawMailboxMenuAfterReturn(void) -{ - Mailbox_DrawMailboxMenu(CreateTask(Mailbox_HandleReturnToProcessInput, 0)); - pal_fill_black(); -} - -static void Mailbox_ReturnToFieldFromReadMail(void) -{ - gFieldCallback = Mailbox_DoRedrawMailboxMenuAfterReturn; - SetMainCallback2(c2_exit_to_overworld_2_switch); -} - -static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}"); - -static void Mailbox_MoveToBag(u8 taskId) -{ - Menu_DestroyCursor(); - StringCopy(gStringVar1, gOtherText_MoveToBag); - Menu_PrintText(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText - DisplayItemMessageOnField(taskId, gOtherText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove, 0); -} - -static void Mailbox_DrawYesNoBeforeMove(u8 taskId) -{ - DisplayYesNoMenu(0x14, 0x8, 0x1); - DoYesNoFuncWithChoice(taskId, (struct YesNoFuncTable *)&ResumeFromWithdrawYesNoFuncList); -} - -static void Mailbox_DoMailMoveToBag(u8 taskId) -{ - struct MailStruct *mail = &gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos]; - - Menu_EraseWindowRect(0x14, 8, 0x1A, 0xD); - - if(AddBagItem(mail->itemId, 1) == FALSE) - { - DisplayItemMessageOnField(taskId, gOtherText_BagIsFull, Mailbox_DrawMailMenuAndDoProcessInput, 0); - } - else - { - DisplayItemMessageOnField(taskId, gOtherText_MailWasReturned, Mailbox_DrawMailMenuAndDoProcessInput, 0); - ClearMailStruct(mail); - Mailbox_UpdateMailList(); - - eMailboxInfo.count--; - - if(eMailboxInfo.count < eMailboxInfo.pageItems + eMailboxInfo.itemsAbove && eMailboxInfo.itemsAbove != 0) - eMailboxInfo.itemsAbove--; - - ItemStorage_SetItemAndMailCount(taskId); - } -} - -static void Mailbox_ReturnToInputAfterNo(u8 taskId) // Mailbox_ReturnToInputAfterNo -{ - Menu_EraseWindowRect(0x14, 0x8, 0x1A, 0xD); - Mailbox_DrawMailMenuAndDoProcessInput(taskId); -} - -static void Mailbox_Give(u8 taskId) -{ - if(CalculatePlayerPartyCount() == 0) - Mailbox_NoPokemonForMail(taskId); // cannot be reached normally - else - { - FadeScreen(1, 0); - TASK.FUNC = Mailbox_DoGiveMailPokeMenu; - } -} - -static void Mailbox_DoGiveMailPokeMenu(u8 taskId) // Mailbox_DoGiveMailPokeMenu -{ - if(!gPaletteFade.active) - { - SetMainCallback2(sub_808B020); - gUnknown_02038561 = 3; - DestroyTask(taskId); - } -} - -static void Mailbox_UpdateMailListAfterDeposit(void) -{ - u8 taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); - u8 oldCount = eMailboxInfo.count; - - eMailboxInfo.count = GetMailboxMailCount(); - Mailbox_UpdateMailList(); - - if(oldCount != eMailboxInfo.count && eMailboxInfo.count < eMailboxInfo.pageItems + eMailboxInfo.itemsAbove && eMailboxInfo.itemsAbove != 0) // did the count update? - eMailboxInfo.itemsAbove--; - - ItemStorage_SetItemAndMailCount(taskId); - Mailbox_DrawMailboxMenu(taskId); - pal_fill_black(); -} - -void Mailbox_ReturnToMailListAfterDeposit(void) -{ - gFieldCallback = Mailbox_UpdateMailListAfterDeposit; - SetMainCallback2(c2_exit_to_overworld_2_switch); -} - -// you always have at least 1 POKeMON and you cannot receive mail before you leave Littleroot: therefore this function cannot be reached normally. -static void Mailbox_NoPokemonForMail(u8 taskId) -{ - DisplayItemMessageOnField(taskId, gOtherText_NoPokemon, Mailbox_DrawMailMenuAndDoProcessInput, 0); -} - -static void Mailbox_Cancel(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 0xC, 0x9); - Mailbox_DrawMailMenuAndDoProcessInput(taskId); -} - -static void Mailbox_DrawMailMenuAndDoProcessInput(u8 taskId) -{ - Mailbox_DrawMailboxMenu(taskId); - TASK.FUNC = Mailbox_ProcessInput; -} diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c deleted file mode 100644 index 6804f55d6..000000000 --- a/src/field/pokeblock.c +++ /dev/null @@ -1,1147 +0,0 @@ -#include "global.h" -#include "overworld.h" -#include "sprite.h" -#include "script.h" -#include "strings.h" -#include "task.h" -#include "scanline_effect.h" -#include "text.h" -#include "main.h" -#include "menu.h" -#include "field_fadetransition.h" -#include "palette.h" -#include "graphics.h" -#include "decompress.h" -#include "menu_helpers.h" -#include "battle.h" -#include "item_menu.h" -#include "item_use.h" -#include "item.h" -#include "constants/items.h" -#include "sound.h" -#include "constants/songs.h" -#include "safari_zone.h" -#include "event_data.h" -#include "pokeblock.h" -#include "ewram.h" - -struct UnkPokeblockStruct -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -}; - -static EWRAM_DATA u8 gUnknown_02039244 = 0; -static EWRAM_DATA struct UnkPokeblockStruct gUnknown_02039248 = {0}; -static EWRAM_DATA u8 gUnknown_0203924C = 0; - -// function declarations - -// gUnknown_083F7EF4 -static void sub_810C508(u8); -static void sub_810C5C0(u8); -static void sub_810C748(u8); -static void sub_810C788(u8); -static void sub_810C854(u8); - -// gUnknown_083F7F24 -static void sub_810C610(u8); -static void sub_810C668(u8); - -// sub_810B6C0 -static bool8 sub_810B998(void); -static void sub_810BC98(void); -static void sub_810BD08(void); -static void sub_810BB0C(void); -static void sub_810BB30(void); -static void sub_810BC84(u8); - -// sub_810B96C -static void sub_810BF7C(u8); - -// sub_810BC84 -static void sub_810BDAC(bool8); - -// sub_810BF38 -static void sub_810C8D4(struct Sprite *); - -// sub_810BF7C -static void sub_810C0C8(u8); -static void sub_810C31C(u8); -static void sub_810C368(u8); - -// sub_810C0C8 -static void sub_810C1C8(u8, u8); -static void sub_810C23C(u8); - -// sub_810C368 -static void sub_810C40C(u8); - -// sub_810C540 -static void sub_810C5EC(u8); - -// sub_810C610 -static void sub_810C704(u8); - -static const u8 *gUnknown_03000758; - -// rodata - -#define GFX_TAG_POKEBLOCK_CASE 14800 - -const s8 gPokeblockFlavorCompatibilityTable[] = -{ - // Cool, Beauty, Cute, Smart, Tough - 0, 0, 0, 0, 0, // Hardy - 1, 0, 0, 0, -1, // Lonely - 1, 0, -1, 0, 0, // Brave - 1, -1, 0, 0, 0, // Adamant - 1, 0, 0, -1, 0, // Naughty - -1, 0, 0, 0, 1, // Bold - 0, 0, 0, 0, 0, // Docile - 0, 0, -1, 0, 1, // Relaxed - 0, -1, 0, 0, 1, // Impish - 0, 0, 0, -1, 1, // Lax - -1, 0, 1, 0, 0, // Timid - 0, 0, 1, 0, -1, // Hasty - 0, 0, 0, 0, 0, // Serious - 0, -1, 1, 0, 0, // Jolly - 0, 0, 1, -1, 0, // Naive - -1, 1, 0, 0, 0, // Modest - 0, 1, 0, 0, -1, // Mild - 0, 1, -1, 0, 0, // Quiet - 0, 0, 0, 0, 0, // Bashful - 0, 1, 0, -1, 0, // Rash - -1, 0, 0, 1, 0, // Calm - 0, 0, 0, 1, -1, // Gentle - 0, 0, -1, 1, 0, // Sassy - 0, -1, 0, 1, 0, // Careful - 0, 0, 0, 0, 0 // Quirky -}; - -void (*const gUnknown_083F7EA8[])(void) = -{ - sub_80A5B40, - c2_exit_to_overworld_2_switch, - sub_802E424, - c2_exit_to_overworld_2_switch -}; - -const u8 *const gPokeblockNames[] = -{ - NULL, - ContestStatsText_RedPokeBlock, - ContestStatsText_BluePokeBlock, - ContestStatsText_PinkPokeBlock, - ContestStatsText_GreenPokeBlock, - ContestStatsText_YellowPokeBlock, - ContestStatsText_PurplePokeBlock, - ContestStatsText_IndigoPokeBlock, - ContestStatsText_BrownPokeBlock, - ContestStatsText_LiteBluePokeBlock, - ContestStatsText_OlivePokeBlock, - ContestStatsText_GrayPokeBlock, - ContestStatsText_BlackPokeBlock, - ContestStatsText_WhitePokeBlock, - ContestStatsText_GoldPokeBlock -}; - -const struct MenuAction2 gUnknown_083F7EF4[] = -{ - {OtherText_Use, sub_810C508}, - {OtherText_Toss, sub_810C5C0}, - {gOtherText_CancelNoTerminator, sub_810C748}, - {OtherText_Use, sub_810C788}, - {OtherText_Use, sub_810C854}, -}; - -const u8 gUnknown_083F7F1C[] = {0, 1, 2}; -const u8 gUnknown_083F7F1F[] = {3, 2}; -const u8 gUnknown_083F7F21[] = {4, 2}; - -const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668}; - -const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f}; - -const struct OamData gOamData_83F7F34 = -{ - .size = 3, - .priority = 2 -}; - -const union AnimCmd gSpriteAnim_83F7F3C[] = -{ - ANIMCMD_FRAME(.imageValue = 0, .duration = 0), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83F7F44[] = -{ - gSpriteAnim_83F7F3C -}; - -const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = -{ - AFFINEANIMCMD_FRAME(0, 0, -2, 2), - AFFINEANIMCMD_FRAME(0, 0, 2, 4), - AFFINEANIMCMD_FRAME(0, 0, -2, 4), - AFFINEANIMCMD_FRAME(0, 0, 2, 2), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = -{ - gSpriteAffineAnim_83F7F48 -}; - -const struct CompressedSpriteSheet gUnknown_083F7F74 = -{ - gMenuPokeblockDevice_Gfx, - 0x800, - GFX_TAG_POKEBLOCK_CASE -}; - -const struct CompressedSpritePalette gUnknown_083F7F7C = -{ - gMenuPokeblockDevice_Pal, - GFX_TAG_POKEBLOCK_CASE -}; - -const struct SpriteTemplate gSpriteTemplate_83F7F84 = -{ - GFX_TAG_POKEBLOCK_CASE, - GFX_TAG_POKEBLOCK_CASE, - &gOamData_83F7F34, - gSpriteAnimTable_83F7F44, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -const struct Pokeblock gUnknown_083F7F9C[] = -{ - { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20 }, - { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20 }, - { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20 }, - { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20 }, - { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20 }, -#if DEBUG - { PBLOCK_CLR_PURPLE, 20, 0, 20, 0, 0, 20 }, - { PBLOCK_CLR_INDIGO, 0, 20, 0, 20, 0, 20 }, - { PBLOCK_CLR_BROWN, 0, 0, 20, 0, 20, 20 }, - { PBLOCK_CLR_LITEBLUE, 20, 0, 0, 20, 0, 20 }, - { PBLOCK_CLR_OLIVE, 0, 20, 0, 0, 20, 20 }, - { PBLOCK_CLR_GRAY, 0, 2, 0, 2, 2, 0 }, - { PBLOCK_CLR_BLACK, 3, 3, 3, 4, 3, 0 }, - { PBLOCK_CLR_WHITE, 1, 1, 1, 1, 1, 1 }, - { PBLOCK_CLR_GOLD, 20, 0, 0, 0, 0, 20 }, - { 0 }, -#endif -}; - -// text - -static void sub_810B674(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -static void sub_810B68C(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x7800), sizeof gBGTilemapBuffers[2]); -} - -static bool8 sub_810B6C0(void) -{ - u16 ime; - switch (gMain.state) - { - case 0: - ClearVideoCallbacks(); - sub_80F9368(); - REG_BG2CNT = BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_PRIORITY(2); - REG_BLDCNT = 0; - gMain.state++; - break; - case 1: - ScanlineEffect_Stop(); - gMain.state++; - break; - case 2: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = TRUE; - gMain.state++; - break; - case 3: - ResetSpriteData(); - gMain.state++; - break; - case 4: - if (gUnknown_02039244 != 2) - { - ResetTasks(); - } - gMain.state++; - break; - case 5: - Text_LoadWindowTemplate(&gWindowTemplate_81E6E34); - gMain.state++; - break; - case 6: - Text_LoadWindowTemplate(&gWindowTemplate_81E6E50); - gMain.state++; - break; - case 7: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E34); - gMain.state++; - break; - case 8: - if (MultistepInitMenuWindowContinue()) - { - gMain.state++; - } - break; - case 9: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50); - gMain.state++; - break; - case 10: - if (MultistepInitMenuWindowContinue()) - { - ewram1FFFF = 0; - gMain.state++; - } - break; - case 11: - if (sub_810B998()) - { - gMain.state++; - } - break; - case 12: - ClearVerticalScrollIndicatorPalettes(); - LoadScrollIndicatorPalette(); - CreateVerticalScrollIndicators(TOP_ARROW, 0xb0, 0x08); - CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xb0, 0x98); - gMain.state++; - break; - case 13: - ewram1FFFE = sub_810BA50(0x38, 0x40, 0); - gMain.state++; - break; - case 14: - sub_810BC98(); - sub_810BD08(); - gMain.state++; - break; - case 15: - sub_810BB0C(); - sub_810BB30(); - sub_810BC84(gUnknown_02039248.unk1); - gMain.state++; - break; - case 16: - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(sub_810B68C); - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; - gMain.state++; - break; - case 17: - if (sub_8055870() != TRUE) - { - gMain.state++; - } - break; - case 18: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gPaletteFade.bufferTransferDisabled = FALSE; - SetMainCallback2(sub_810B674); - return TRUE; - } - return FALSE; -} - -void sub_810B96C(void) -{ - do { - if (sub_810B6C0() == TRUE) - { - CreateTask(sub_810BF7C, 0); - break; - } - } while (sub_80F9344() != TRUE); -} - -static bool8 sub_810B998(void) -{ - switch (ewram1FFFF) - { - case 0: - LZDecompressVram(gMenuPokeblock_Gfx, BG_CHAR_ADDR(2)); - ewram1FFFF++; - break; - case 1: - LZDecompressWram(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]); - ewram1FFFF++; - break; - case 2: - LoadCompressedPalette(gMenuPokeblock_Pal, 0, 0xc0); - ewram1FFFF++; - break; - case 3: - LoadCompressedObjectPic(&gUnknown_083F7F74); - ewram1FFFF++; - break; - case 4: - LoadCompressedObjectPalette(&gUnknown_083F7F7C); - ewram1FFFF = 0; - return TRUE; - } - return FALSE; -} - -u8 sub_810BA50(s16 x, s16 y, u8 subpriority) -{ - return CreateSprite(&gSpriteTemplate_83F7F84, x, y, subpriority); -} - -void sub_810BA7C(u8 a0) -{ - gUnknown_02039244 = a0; - switch (gUnknown_02039244) - { - default: - gUnknown_03000758 = gUnknown_083F7F1C; - gUnknown_0203924C = sizeof gUnknown_083F7F1C; - break; - case 2: - gUnknown_03000758 = gUnknown_083F7F1F; - gUnknown_0203924C = sizeof gUnknown_083F7F1F; - break; - case 3: - gUnknown_03000758 = gUnknown_083F7F21; - gUnknown_0203924C = sizeof gUnknown_083F7F21; - break; - } -} - -void sub_810BADC(void) -{ - sub_810BA7C(2); - SetMainCallback2(sub_810B96C); -} - -void OpenPokeblockCaseOnFeeder(void) -{ - sub_810BA7C(3); - SetMainCallback2(sub_810B96C); -} - -#if DEBUG -void debug_sub_8120F98(void) -{ - u8 i; - - for (i = 0; i < 40 && gUnknown_083F7F9C[i].color != 0; i++) - gSaveBlock1.pokeblocks[i] = gUnknown_083F7F9C[i]; -} -#endif - -static void sub_810BB0C(void) -{ - BasicInitMenuWindow(&gWindowTemplate_81E6E34); - sub_8072BD8(ItemId_GetName(ITEM_POKEBLOCK_CASE), 2, 1, 0x48); -} - -static void sub_810BB30(void) -{ - BasicInitMenuWindow(&gWindowTemplate_81E6E34); - Menu_PrintText(gContestStatsText_Spicy, 2, 13); - Menu_PrintText(gContestStatsText_Dry, 2, 15); - Menu_PrintText(gContestStatsText_Sweet, 2, 17); - Menu_PrintText(gContestStatsText_Bitter, 8, 13); - Menu_PrintText(gContestStatsText_Sour, 8, 15); -} - -static void sub_810BB88(u8 a0) -{ - u8 i; - u8 y; - u8 *buf; - BasicInitMenuWindow(&gWindowTemplate_81E6E34); - for (i = a0; i <= a0 + 8; i++) - { - y = (i - a0) << 1; - if (i == gUnknown_02039248.unk2) - { - buf = sub_8072C74(gStringVar1, gContestStatsText_StowCase, 0x78, 0); - Menu_PrintText(gStringVar1, 15, y + 1); - if (i != a0 + 8) - { - Menu_EraseWindowRect(15, y + 3, 29, 18); - } - break; - } - buf = sub_8072C74(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[i].color], 0x5e, 0); - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x14; - buf[2] = 0x06; - buf += 3; - ConvertIntToDecimalStringN(buf, sub_810C9B0(&gSaveBlock1.pokeblocks[i]), STR_CONV_MODE_RIGHT_ALIGN, 3); - Menu_PrintText(gStringVar1, 15, y + 1); - } -} - -static void sub_810BC84(u8 a0) -{ - sub_810BB88(a0); - sub_810BDAC(FALSE); -} - -static void sub_810BC98(void) -{ - u16 i, j; - struct Pokeblock buf; - for (i=0; i<39; i++) - { - for (j=i+1; j<40; j++) - { - if (gSaveBlock1.pokeblocks[i].color == 0) - { - buf = gSaveBlock1.pokeblocks[i]; - gSaveBlock1.pokeblocks[i] = gSaveBlock1.pokeblocks[j]; - gSaveBlock1.pokeblocks[j] = buf; - } - } - } -} - -static void sub_810BD08(void) -{ - u8 i; - gUnknown_02039248.unk2 = 0; - for (i=0; i<40; i++) - { - if (gSaveBlock1.pokeblocks[i].color != 0) - gUnknown_02039248.unk2++; - } - if (gUnknown_02039248.unk2 < 8) - { - gUnknown_02039248.unk3 = gUnknown_02039248.unk2; - } - else - { - gUnknown_02039248.unk3 = 8; - } - if (gUnknown_02039248.unk1 + 8 > gUnknown_02039248.unk2 && gUnknown_02039248.unk1 != 0) - { - gUnknown_02039248.unk1--; - } -} - -static void sub_810BD64(u16 a0, u16 a1) -{ - u8 i; - int y; - for (i=0; i<14; i++) - { - gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 1) * 32 + (y = i + 15)] = a0; - gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 2) * 32 + y] = a0; - } -} - -static void sub_810BDAC(bool8 flag) -{ - u8 i; - u16 v0; - if (!flag) - { - sub_810BD64(0x1005, 0x1014); - } - else - { - sub_810BD64(0x2005, 0x2014); - } - if (gUnknown_02039248.unk1) - { - SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); - } - else - { - SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); - } - if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) - { - SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); - } - else - { - SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); - } - for (i=0; i<5; i++) - { - v0 = ((i % 3) << 6) + 0x1a1 + (i / 3) * 6; - if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2) - { - if (GetPokeblockData(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1], i + 1) > 0) - { - gBGTilemapBuffers[2][v0] = (i << 12) + 23; - gBGTilemapBuffers[2][v0 + 32] = (i << 12) + 24; - } - else - { - gBGTilemapBuffers[2][v0] = 15; - gBGTilemapBuffers[2][v0 + 32] = 15; - } - } - else - { - gBGTilemapBuffers[2][v0] = 15; - gBGTilemapBuffers[2][v0 + 32] = 15; - } - } - BasicInitMenuWindow(&gWindowTemplate_81E6E34); - if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2) - { - sub_8072C14(gStringVar1, sub_810C9E8(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1]), 16, 1); - Menu_PrintText(gStringVar1, 11, 17); - } - else - { - Menu_EraseWindowRect(11, 17, 12, 18); - } -} - -static void sub_810BF38(bool8 flag) -{ - PlaySE(SE_SELECT); - gSprites[ewram1FFFE].callback = sub_810C8D4; - sub_810BDAC(flag); -} - -static void sub_810BF7C(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (gUnknown_02039248.unk0 != 0) - { - sub_810BD64(5, 20); - gUnknown_02039248.unk0--; - sub_810BF38(FALSE); - } - else if (gUnknown_02039248.unk1 != 0) - { - gUnknown_02039248.unk1--; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BF38(FALSE); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3) - { - sub_810BD64(5, 20); - gUnknown_02039248.unk0++; - sub_810BF38(FALSE); - } - else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) - { - gUnknown_02039248.unk1++; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BF38(FALSE); - } - } - else if (gMain.newKeys & SELECT_BUTTON) - { - if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) - { - PlaySE(SE_SELECT); - sub_810BDAC(TRUE); - gTasks[taskId].data[0] = gUnknown_02039248.unk1 + gUnknown_02039248.unk0; - gTasks[taskId].func = sub_810C0C8; - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 == gUnknown_02039248.unk2) - { - gSpecialVar_Result = 0xffff; - sub_810C31C(taskId); - } - else - { - sub_810C368(taskId); - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gSpecialVar_Result = 0xffff; - sub_810C31C(taskId); - } - } -} - -static void sub_810C0C8(u8 taskId) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (gUnknown_02039248.unk0 != 0) - { - sub_810BD64(5, 20); - gUnknown_02039248.unk0--; - sub_810BF38(TRUE); - sub_810C1C8(taskId, 1); - } - else if (gUnknown_02039248.unk1 != 0) - { - sub_810C1C8(taskId, 0); - gUnknown_02039248.unk1--; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BF38(TRUE); - sub_810C1C8(taskId, 1); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3) - { - sub_810BD64(5, 20); - gUnknown_02039248.unk0++; - sub_810BF38(TRUE); - sub_810C1C8(taskId, 1); - } - else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) - { - sub_810C1C8(taskId, 0); - gUnknown_02039248.unk1++; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BF38(TRUE); - sub_810C1C8(taskId, 1); - } - } - else if (gMain.newKeys & A_BUTTON || gMain.newKeys & SELECT_BUTTON) - { - PlaySE(SE_SELECT); - sub_810C1C8(taskId, 0); - sub_810C23C(taskId); - gTasks[taskId].func = sub_810BF7C; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_810C1C8(taskId, 0); - sub_810BDAC(0); - gTasks[taskId].func = sub_810BF7C; - } -} - -static void sub_810C1C8(u8 taskId, u8 flag) -{ - u8 i; - u32 x; - s16 y; - u16 v0 = 0x1005; - if (!flag) - { - v0 = 0x0005; - } - y = gTasks[taskId].data[0] - gUnknown_02039248.unk1; - if ((u16)y <= 8 && y != gUnknown_02039248.unk0) - { - for (i=0; i<14; i++) - { - gBGTilemapBuffers[2][(2 * y + 1) * 32 + (x = i + 15)] = v0; - gBGTilemapBuffers[2][(2 * y + 2) * 32 + x] = v0; - } - } -} - -static void sub_810C23C(u8 taskId) -{ - struct Pokeblock buf; - u8 selidx = gUnknown_02039248.unk1 + gUnknown_02039248.unk0; - if (selidx == gUnknown_02039248.unk2) - { - sub_810BDAC(FALSE); - } - else - { - buf = gSaveBlock1.pokeblocks[selidx]; - gSaveBlock1.pokeblocks[selidx] = gSaveBlock1.pokeblocks[gTasks[taskId].data[0]]; - gSaveBlock1.pokeblocks[gTasks[taskId].data[0]] = buf; - sub_810BB88(gUnknown_02039248.unk1); - sub_810BDAC(FALSE); - } -} - -static void sub_810C2B0(void) -{ - DestroyVerticalScrollIndicator(TOP_ARROW); - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - BuyMenuFreeMemory(); -} - -static void sub_810C2C8(u8 taskId) -{ - if (!gPaletteFade.active) - { - if (gUnknown_02039244 == 3) - { - gFieldCallback = sub_8080990; - } - sub_810C2B0(); - SetMainCallback2(gUnknown_083F7EA8[gUnknown_02039244]); - DestroyTask(taskId); - } -} - -static void sub_810C31C(u8 taskId) -{ - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - if (gUnknown_02039244 > 1) - { - gSpecialVar_ItemId = ITEM_NONE; - } - gTasks[taskId].func = sub_810C2C8; -} - -static void sub_810C368(u8 taskId) -{ - int v0 = 0; - if (gUnknown_02039244 > 1) - v0 = 2; - StopVerticalScrollIndicators(TOP_ARROW); - StopVerticalScrollIndicators(BOTTOM_ARROW); - BasicInitMenuWindow(&gWindowTemplate_81E6E50); - Menu_DrawStdWindowFrame(7, v0 + 4, 13, 11); - Menu_PrintItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758); - InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5); - gSpecialVar_ItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1; - gTasks[taskId].func = sub_810C40C; -} - -static void sub_810C40C(u8 taskId) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (Menu_GetCursorPos()) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (Menu_GetCursorPos() != gUnknown_0203924C - 1) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(+1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_083F7EF4[gUnknown_03000758[Menu_GetCursorPos()]].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_810C748(taskId); - } -} - -static void sub_810C4C4(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_810C2B0(); - sub_8136130(&gSaveBlock1.pokeblocks[gSpecialVar_ItemId], sub_810B96C); - DestroyTask(taskId); - } -} - -static void sub_810C508(u8 taskId) -{ - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_810C4C4; -} - -static void sub_810C540(u8 taskId) -{ - BasicInitMenuWindow(&gWindowTemplate_81E6E50); - Menu_DestroyCursor(); - Menu_EraseWindowRect(7, 4, 13, 11); - StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1].color]); - StringExpandPlaceholders(gStringVar4, gContestStatsText_ThrowAwayPrompt); - DisplayItemMessageOnField(taskId, gStringVar4, sub_810C5EC, 0); -} - -static void sub_810C5C0(u8 taskId) -{ - SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); - gTasks[taskId].func = sub_810C540; -} - -static void sub_810C5EC(u8 taskId) -{ - DisplayYesNoMenu(7, 6, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083F7F24); -} - -static void sub_810C610(u8 taskId) -{ - Menu_EraseWindowRect(7, 6, 13, 11); - PokeblockClearIfExists((gUnknown_02039248.unk0 + gUnknown_02039248.unk1)); - StringExpandPlaceholders(gStringVar4, gContestStatsText_WasThrownAway); - DisplayItemMessageOnField(taskId, gStringVar4, sub_810C704, 0); - sub_810BC98(); - sub_810BD08(); -} - -static void sub_810C668(u8 taskId) -{ - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) - { - SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); - } - BasicInitMenuWindow(&gWindowTemplate_81E6E50); - Menu_EraseWindowRect(7, 6, 13, 11); - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskId].func = sub_810BF7C; -} - -static void sub_810C6DC(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - { - sub_810C668(taskId); - } -} - -static void sub_810C704(u8 taskId) -{ - BasicInitMenuWindow(&gWindowTemplate_81E6E34); - sub_810BC84(gUnknown_02039248.unk1); - SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); - gTasks[taskId].func = sub_810C6DC; -} - -static void sub_810C748(u8 taskId) -{ - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - Menu_DestroyCursor(); - Menu_EraseWindowRect(7, 4, 13, 11); - gTasks[taskId].func = sub_810BF7C; -} - -static void sub_810C788(u8 taskId) -{ - s16 v0 = PokeblockGetGain(GetNature(&gEnemyParty[0]), &gSaveBlock1.pokeblocks[gSpecialVar_ItemId]); - StringCopy(gBattleTextBuff1, gPokeblockNames[gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color]); - PokeblockClearIfExists(gSpecialVar_ItemId); - gSpecialVar_ItemId = gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color << 8; - if (v0 == 0) - { - gSpecialVar_ItemId += 1; - } - if (v0 > 0) - { - gSpecialVar_ItemId += 2; - } - if (v0 < 0) - { - gSpecialVar_ItemId += 3; - } - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_810C2C8; -} - -static void sub_810C854(u8 taskId) -{ - SafariZoneActivatePokeblockFeeder(gSpecialVar_ItemId); - StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color]); - gSpecialVar_Result = gSpecialVar_ItemId; - PokeblockClearIfExists(gSpecialVar_ItemId); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_810C2C8; -} - -static void sub_810C8D4(struct Sprite *sprite) -{ - if (sprite->data[0] > 1) - { - sprite->data[0] = 0; - } - switch (sprite->data[0]) - { - case 0: - sprite->oam.affineMode = 1; - sprite->affineAnims = gSpriteAffineAnimTable_83F7F70; - InitSpriteAffineAnim(sprite); - sprite->data[0] = 1; - sprite->data[1] = 0; - break; - case 1: - if (++sprite->data[1] > 11) - { - sprite->oam.affineMode = 0; - sprite->data[0] = 0; - sprite->data[1] = 0; - FreeOamMatrix(sprite->oam.matrixNum); - sprite->callback = SpriteCallbackDummy; - } - break; - } -} - -static void ClearPokeblock(u8 pokeblockIdx) -{ - gSaveBlock1.pokeblocks[pokeblockIdx].color = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].spicy = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].dry = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].sweet = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].bitter = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].sour = 0; - gSaveBlock1.pokeblocks[pokeblockIdx].feel = 0; -} - -void ClearPokeblocks(void) -{ - u8 pokeblockIdx; - for (pokeblockIdx=0; pokeblockIdx 99) - feel = 99; - return feel; -} - -s8 GetFirstFreePokeblockSlot(void) -{ - u8 i; - for (i=0; icolor; - if (field == PBLOCK_SPICY) - return pokeblock->spicy; - if (field == PBLOCK_DRY) - return pokeblock->dry; - if (field == PBLOCK_SWEET) - return pokeblock->sweet; - if (field == PBLOCK_BITTER) - return pokeblock->bitter; - if (field == PBLOCK_SOUR) - return pokeblock->sour; - if (field == PBLOCK_FEEL) - return pokeblock->feel; - return 0; -} - -s16 PokeblockGetGain(u8 nature, const struct Pokeblock *pokeblock) -{ - u8 flavor; - s16 curGain; - s16 totalGain = 0; - for (flavor=0; flavor<5; flavor++) - { - curGain = GetPokeblockData(pokeblock, flavor + 1); - if (curGain > 0) - { - totalGain += curGain * gPokeblockFlavorCompatibilityTable[5 * nature + flavor]; - } - } - return totalGain; -} - -void PokeblockCopyName(struct Pokeblock *pokeblock, u8 *dest) -{ - u8 color = GetPokeblockData(pokeblock, PBLOCK_COLOR); - StringCopy(dest, gPokeblockNames[color]); -} - -bool8 sub_810CB68(u8 nature, u8 *dest) -{ - u8 flavor; - for (flavor=0; flavor<5; flavor++) - { - if (PokeblockGetGain(nature, &gUnknown_083F7F9C[flavor]) > 0) - { - StringCopy(dest, gPokeblockNames[flavor + 1]); - return TRUE; - } - } - return FALSE; -} diff --git a/src/field/pokedex_area_screen.c b/src/field/pokedex_area_screen.c deleted file mode 100644 index 67ca276c4..000000000 --- a/src/field/pokedex_area_screen.c +++ /dev/null @@ -1,20 +0,0 @@ - -// Includes -#include "global.h" - -// Static type declarations - -// Static RAM declarations - -EWRAM_DATA u16 gUnknown_02039260 = 0; -EWRAM_DATA u16 gUnknown_02039262 = 0; -EWRAM_DATA u16 gUnknown_02039264 = 0; -EWRAM_DATA u16 gUnknown_02039266 = 0; -EWRAM_DATA u16 gUnknown_02039268 = 0; -EWRAM_DATA u16 gUnknown_0203926A = 0; - -// Static ROM declarations - -// .rodata - -// .text diff --git a/src/field/pokenav.c b/src/field/pokenav.c deleted file mode 100644 index f57a98df6..000000000 --- a/src/field/pokenav.c +++ /dev/null @@ -1,16 +0,0 @@ - -// Includes -#include "global.h" - -// Static type declarations - -// Static RAM declarations - -EWRAM_DATA u8 gUnknown_020388B0[4] = {}; -EWRAM_DATA u16 gUnknown_020388B4 = 0; - -// Static ROM declarations - -// .rodata - -// .text diff --git a/src/field/region_map.c b/src/field/region_map.c deleted file mode 100644 index 6d50701d6..000000000 --- a/src/field/region_map.c +++ /dev/null @@ -1,1971 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "field_effect.h" -#include "field_specials.h" -#include "m4a.h" -#include "main.h" -#include "constants/maps.h" -#include "menu.h" -#include "palette.h" -#include "pokemon_menu.h" -#include "region_map.h" -#include "overworld.h" -#include "secret_base.h" -#include "constants/songs.h" -#include "sprite.h" -#include "strings.h" -#include "string_util.h" -#include "text.h" -#include "trig.h" -#include "ewram.h" - -// Map Section IDs -#define MAPSEC_LITTLEROOT_TOWN 0 -#define MAPSEC_OLDALE_TOWN 1 -#define MAPSEC_DEWFORD_TOWN 2 -#define MAPSEC_LAVARIDGE_TOWN 3 -#define MAPSEC_FALLARBOR_TOWN 4 -#define MAPSEC_VERDANTURF_TOWN 5 -#define MAPSEC_PACIFIDLOG_TOWN 6 -#define MAPSEC_PETALBURG_CITY 7 -#define MAPSEC_SLATEPORT_CITY 8 -#define MAPSEC_MAUVILLE_CITY 9 -#define MAPSEC_RUSTBORO_CITY 10 -#define MAPSEC_FORTREE_CITY 11 -#define MAPSEC_LILYCOVE_CITY 12 -#define MAPSEC_MOSSDEEP_CITY 13 -#define MAPSEC_SOOTOPOLIS_CITY 14 -#define MAPSEC_EVER_GRANDE_CITY 15 -#define MAPSEC_ROUTE_101 0x10 -#define MAPSEC_ROUTE_102 0x11 -#define MAPSEC_ROUTE_103 0x12 -#define MAPSEC_ROUTE_104 0x13 -#define MAPSEC_ROUTE_105 0x14 -#define MAPSEC_ROUTE_106 0x15 -#define MAPSEC_ROUTE_107 0x16 -#define MAPSEC_ROUTE_108 0x17 -#define MAPSEC_ROUTE_109 0x18 -#define MAPSEC_ROUTE_110 0x19 -#define MAPSEC_ROUTE_111 0x1A -#define MAPSEC_ROUTE_112 0x1B -#define MAPSEC_ROUTE_113 0x1C -#define MAPSEC_ROUTE_114 0x1D -#define MAPSEC_ROUTE_115 0x1E -#define MAPSEC_ROUTE_116 0x1F -#define MAPSEC_ROUTE_117 0x20 -#define MAPSEC_ROUTE_118 0x21 -#define MAPSEC_ROUTE_119 0x22 -#define MAPSEC_ROUTE_120 0x23 -#define MAPSEC_ROUTE_121 0x24 -#define MAPSEC_ROUTE_122 0x25 -#define MAPSEC_ROUTE_123 0x26 -#define MAPSEC_ROUTE_124 0x27 -#define MAPSEC_ROUTE_125 0x28 -#define MAPSEC_ROUTE_126 0x29 -#define MAPSEC_ROUTE_127 0x2A -#define MAPSEC_ROUTE_128 0x2B -#define MAPSEC_ROUTE_129 0x2C -#define MAPSEC_ROUTE_130 0x2D -#define MAPSEC_ROUTE_131 0x2E -#define MAPSEC_ROUTE_132 0x2F -#define MAPSEC_ROUTE_133 0x30 -#define MAPSEC_ROUTE_134 0x31 -#define MAPSEC_UNDERWATER1 0x32 -#define MAPSEC_UNDERWATER2 0x33 -#define MAPSEC_UNDERWATER3 0x34 -#define MAPSEC_UNDERWATER4 0x35 -#define MAPSEC_UNDERWATER5 0x36 -#define MAPSEC_GRANITE_CAVE 0x37 -#define MAPSEC_MT_CHIMNEY 0x38 -#define MAPSEC_SAFARI_ZONE 0x39 -#define MAPSEC_BATTLE_TOWER 0x3A -#define MAPSEC_PETALBURG_WOODS 0x3B -#define MAPSEC_RUSTURF_TUNNEL 0x3C -#define MAPSEC_ABANDONED_SHIP 0x3D -#define MAPSEC_NEW_MAUVILLE 0x3E -#define MAPSEC_METEOR_FALLS_1 0x3F -#define MAPSEC_METEOR_FALLS_2 0x40 -#define MAPSEC_MT_PYRE 0x41 -#define MAPSEC_EVIL_TEAM_HIDEOUT 0x42 -#define MAPSEC_SHOAL_CAVE 0x43 -#define MAPSEC_SEAFLOOR_CAVERN 0x44 -#define MAPSEC_UNDERWATER6 0x45 -#define MAPSEC_VICTORY_ROAD 0x46 -#define MAPSEC_MIRAGE_ISLAND 0x47 -#define MAPSEC_CAVE_OF_ORIGIN 0x48 -#define MAPSEC_SOUTHERN_ISLAND 0x49 -#define MAPSEC_FIERY_PATH_1 0x4A -#define MAPSEC_FIERY_PATH_2 0x4B -#define MAPSEC_JAGGED_PASS_1 0x4C -#define MAPSEC_JAGGED_PASS_2 0x4D -#define MAPSEC_SEALED_CHAMBER 0x4E -#define MAPSEC_UNDERWATER7 0x4F -#define MAPSEC_SCORCHED_SLAB 0x50 -#define MAPSEC_ISLAND_CAVE 0x51 -#define MAPSEC_DESERT_RUINS 0x52 -#define MAPSEC_ANCIENT_TOMB 0x53 -#define MAPSEC_INSIDE_OF_TRUCK 0x54 -#define MAPSEC_SKY_PILLAR 0x55 -#define MAPSEC_SECRET_BASE 0x56 -#define MAPSEC_UNK_0x57 0x57 -#define MAPSEC_NONE 0x58 - -#define MAP_WIDTH 28 -#define MAP_HEIGHT 15 -#define MAPCURSOR_X_MIN 1 -#define MAPCURSOR_Y_MIN 2 -#define MAPCURSOR_X_MAX (MAPCURSOR_X_MIN + MAP_WIDTH - 1) -#define MAPCURSOR_Y_MAX (MAPCURSOR_Y_MIN + MAP_HEIGHT - 1) - -// Input events -enum -{ - INPUT_EVENT_NONE, - INPUT_EVENT_DPAD, - INPUT_EVENT_2, - INPUT_EVENT_3, - INPUT_EVENT_A_BUTTON, - INPUT_EVENT_B_BUTTON, -}; - -static EWRAM_DATA struct RegionMap *gRegionMap = NULL; - -static const u16 sRegionMapCursor_Pal[] = INCBIN_U16("graphics/pokenav/cursor.gbapal"); -static const u8 sRegionMapCursorSmall_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_small.4bpp.lz"); -static const u8 sRegionMapCursorLarge_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_large.4bpp.lz"); -static const u16 sRegionMapBrendanIcon_Pal[] = INCBIN_U16("graphics/pokenav/brendan_icon.gbapal"); -static const u8 sRegionMapBrendanIcon_Image[] = INCBIN_U8("graphics/pokenav/brendan_icon.4bpp"); -static const u16 sRegionMapMayIcon_Pal[] = INCBIN_U16("graphics/pokenav/may_icon.gbapal"); -static const u8 sRegionMapMayIcon_Image[] = INCBIN_U8("graphics/pokenav/may_icon.4bpp"); -static const u16 sRegionMapBkgnd_Pal[] = INCBIN_U16("graphics/pokenav/region_map.gbapal"); -static const u8 sRegionMapBkgnd_ImageLZ[] = INCBIN_U8("graphics/pokenav/region_map.8bpp.lz"); -static const u8 sRegionMapBkgnd_TilemapLZ[] = INCBIN_U8("graphics/pokenav/region_map_map.bin.lz"); - -#include "../data/region_map_layout.h" - -#if ENGLISH -#include "../data/region_map_names_en.h" -#elif GERMAN -#include "../data/region_map_names_de.h" -#endif - -struct RegionMapLocation -{ - u8 x, y; - u8 width, height; - const u8 *regionMapSectionId; -}; - -const struct RegionMapLocation gRegionMapLocations[] = -{ - { 4, 11, 1, 1, gMapName_LittlerootTown}, - { 4, 9, 1, 1, gMapName_OldaleTown}, - { 2, 14, 1, 1, gMapName_DewfordTown}, - { 5, 3, 1, 1, gMapName_LavaridgeTown}, - { 3, 0, 1, 1, gMapName_FallarborTown}, - { 4, 6, 1, 1, gMapName_VerdanturfTown}, - {17, 10, 1, 1, gMapName_PacifidlogTown}, - { 1, 9, 1, 1, gMapName_PetalburgCity}, - { 8, 10, 1, 2, gMapName_SlateportCity}, - { 8, 6, 2, 1, gMapName_MauvilleCity}, - { 0, 5, 1, 2, gMapName_RustboroCity}, - {12, 0, 1, 1, gMapName_FortreeCity}, - {18, 3, 2, 1, gMapName_LilycoveCity}, - {24, 5, 2, 1, gMapName_MossdeepCity}, - {21, 7, 1, 1, gMapName_SootopolisCity}, - {27, 8, 1, 2, gMapName_EverGrandeCity}, - { 4, 10, 1, 1, gMapName_Route101}, - { 2, 9, 2, 1, gMapName_Route102}, - { 4, 8, 4, 1, gMapName_Route103}, - { 0, 7, 1, 3, gMapName_Route104}, - { 0, 10, 1, 3, gMapName_Route105}, - { 0, 13, 2, 1, gMapName_Route106}, - { 3, 14, 3, 1, gMapName_Route107}, - { 6, 14, 2, 1, gMapName_Route108}, - { 8, 12, 1, 3, gMapName_Route109}, - { 8, 7, 1, 3, gMapName_Route110}, - { 8, 0, 1, 6, gMapName_Route111}, - { 6, 3, 2, 1, gMapName_Route112}, - { 4, 0, 4, 1, gMapName_Route113}, - { 1, 0, 2, 3, gMapName_Route114}, - { 0, 2, 1, 3, gMapName_Route115}, - { 1, 5, 4, 1, gMapName_Route116}, - { 5, 6, 3, 1, gMapName_Route117}, - {10, 6, 2, 1, gMapName_Route118}, - {11, 0, 1, 6, gMapName_Route119}, - {13, 0, 1, 4, gMapName_Route120}, - {14, 3, 4, 1, gMapName_Route121}, - {16, 4, 1, 2, gMapName_Route122}, - {12, 6, 5, 1, gMapName_Route123}, - {20, 3, 4, 3, gMapName_Route124}, - {24, 3, 2, 2, gMapName_Route125}, - {20, 6, 3, 3, gMapName_Route126}, - {23, 6, 3, 3, gMapName_Route127}, - {23, 9, 4, 1, gMapName_Route128}, - {24, 10, 2, 1, gMapName_Route129}, - {21, 10, 3, 1, gMapName_Route130}, - {18, 10, 3, 1, gMapName_Route131}, - {15, 10, 2, 1, gMapName_Route132}, - {12, 10, 3, 1, gMapName_Route133}, - { 9, 10, 3, 1, gMapName_Route134}, - {20, 3, 4, 3, gMapName_Underwater}, - {20, 6, 3, 3, gMapName_Underwater}, - {23, 6, 3, 3, gMapName_Underwater}, - {23, 9, 4, 1, gMapName_Underwater}, - {21, 7, 1, 1, gMapName_Underwater}, - { 1, 13, 1, 1, gMapName_GraniteCave}, - { 6, 2, 1, 1, gMapName_MtChimney}, - {16, 2, 1, 1, gMapName_SafariZone}, - {22, 12, 1, 1, gMapName_BattleTower}, - { 0, 8, 1, 1, gMapName_PetalburgWoods}, - { 2, 5, 1, 1, gMapName_RusturfTunnel}, - { 6, 14, 1, 1, gMapName_AbandonedShip}, - { 8, 7, 1, 1, gMapName_NewMauville}, - { 0, 3, 1, 1, gMapName_MeteorFalls}, - { 1, 2, 1, 1, gMapName_MeteorFalls}, - {16, 4, 1, 1, gMapName_MtPyre}, - {19, 3, 1, 1, gMapName_EvilTeamHideout}, - {24, 4, 1, 1, gMapName_ShoalCave}, - {24, 9, 1, 1, gMapName_SeafloorCavern}, - {24, 9, 1, 1, gMapName_Underwater}, - {27, 9, 1, 1, gMapName_VictoryRoad}, - {17, 10, 1, 1, gMapName_MirageIsland}, - {21, 7, 1, 1, gMapName_CaveOfOrigin}, - {12, 14, 1, 1, gMapName_SouthernIsland}, - { 6, 3, 1, 1, gMapName_FieryPath}, - { 7, 3, 1, 1, gMapName_FieryPath}, - { 6, 3, 1, 1, gMapName_JaggedPass}, - { 7, 2, 1, 1, gMapName_JaggedPass}, - {11, 10, 1, 1, gMapName_SealedChamber}, - {11, 10, 1, 1, gMapName_Underwater}, - {13, 0, 1, 1, gMapName_ScorchedSlab}, - {0, 10, 1, 1, gMapName_IslandCave}, - { 8, 3, 1, 1, gMapName_DesertRuins}, - {13, 2, 1, 1, gMapName_AncientTomb}, - { 0, 0, 1, 1, gMapName_InsideOfTruck}, - {19, 10, 1, 1, gMapName_SkyPillar}, - { 0, 0, 1, 1, gMapName_SecretBase}, - { 0, 0, 1, 1, gMapName_None}, -}; - -static const u16 gUnknown_083E7684[][2] = -{ - {MAPSEC_UNDERWATER1, MAPSEC_ROUTE_124}, - {MAPSEC_UNDERWATER2, MAPSEC_ROUTE_126}, - {MAPSEC_UNDERWATER3, MAPSEC_ROUTE_127}, - {MAPSEC_UNDERWATER4, MAPSEC_ROUTE_128}, - {MAPSEC_UNDERWATER5, MAPSEC_SOOTOPOLIS_CITY}, - {MAPSEC_UNDERWATER6, MAPSEC_ROUTE_128}, - {MAPSEC_EVIL_TEAM_HIDEOUT, MAPSEC_LILYCOVE_CITY}, - {MAPSEC_UNDERWATER7, MAPSEC_ROUTE_134}, - {MAPSEC_PETALBURG_WOODS, MAPSEC_ROUTE_104}, - {MAPSEC_JAGGED_PASS_1, MAPSEC_ROUTE_112}, - {MAPSEC_MT_PYRE, MAPSEC_ROUTE_122}, - {MAPSEC_SKY_PILLAR, MAPSEC_ROUTE_131}, - {MAPSEC_NONE, MAPSEC_NONE}, -}; - -static u8 sub_80FAB78(void); -static u8 _swiopen(void); -static u8 sub_80FAD04(void); -static u8 sub_80FADE4(void); -static void CalcZoomScrollParams(s16, s16, s16, s16, u16, u16, u8); -static void sub_80FB238(s16, s16); -void UpdateRegionMapVideoRegs(void); -static u16 GetRegionMapSectionAt(u16, u16); -static void InitializeCursorPosition(void); -static void sub_80FB600(void); -static u16 sub_80FB758(u16); -static u16 sub_80FB9C0(u16); -static void sub_80FBA18(void); -static bool8 sub_80FBAA0(u16); -void CreateRegionMapCursor(u16, u16); -void sub_80FBCA0(void); -static void sub_80FBDF8(void); -static void sub_80FBE24(void); -static void SpriteCB_PlayerIconZoomedOut(struct Sprite *); -static void UpdateIconBlink(struct Sprite *); -static void SpriteCB_PlayerIconZoomedIn(struct Sprite *); -const u8 *GetMapSectionName(u8 *, u16, u16); -static void VBlankCB_FlyRegionMap(void); -void CB2_FlyRegionMap(void); -void sub_80FC244(void (*func)(void)); -static void PrintFlyTargetName(void); -static void CreateFlyTargetGraphics(void); -static void CreateCityTownFlyTargetIcons(void); -static void CreateSpecialAreaFlyTargetIcons(void); -static void SpriteCB_FlyTargetIcons(struct Sprite *); -static void sub_80FC5B4(void); -static void sub_80FC600(void); -void sub_80FC69C(void); - -void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed) -{ - sub_80FA904(regionMap, zoomed); - while (sub_80FA940()) - ; -} - -void sub_80FA904(struct RegionMap *regionMap, bool8 zoomed) -{ - gRegionMap = regionMap; - gRegionMap->initStep = 0; - gRegionMap->zoomed = zoomed; - gRegionMap->inputCallback = (zoomed == 0) ? sub_80FAB78 : sub_80FAD04; -} - -bool8 sub_80FA940(void) -{ - switch (gRegionMap->initStep) - { - case 0: - LZ77UnCompVram(sRegionMapBkgnd_ImageLZ, (void *)(VRAM + 0x8000)); - break; - case 1: - LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (void *)(VRAM + 0xE000)); - break; - case 2: - LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60); // Why isn't this the right size? - break; - case 3: - LZ77UnCompWram(sRegionMapCursorSmall_ImageLZ, gRegionMap->cursorSmallImage); - break; - case 4: - LZ77UnCompWram(sRegionMapCursorLarge_ImageLZ, gRegionMap->cursorLargeImage); - break; - case 5: - InitializeCursorPosition(); - gRegionMap->unk74 = gRegionMap->cursorPosX; - gRegionMap->unk76 = gRegionMap->cursorPosY; - gRegionMap->unk16 = sub_80FB758(gRegionMap->mapSectionId); - gRegionMap->mapSectionId = sub_80FB9C0(gRegionMap->mapSectionId); - GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16); - break; - case 6: - if (gRegionMap->zoomed == FALSE) - { - CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0); - } - else - { - gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 52; - gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 68; - gRegionMap->unk64 = gRegionMap->cursorPosX; - gRegionMap->unk66 = gRegionMap->cursorPosY; - CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0); - } - break; - case 7: - sub_80FBA18(); - UpdateRegionMapVideoRegs(); - gRegionMap->cursorSprite = NULL; - gRegionMap->playerIconSprite = NULL; - gRegionMap->unk7A = 0; - gRegionMap->blinkPlayerIcon = FALSE; - REG_BG2CNT = 0xBC8A; - gRegionMap->initStep++; - default: - return FALSE; - } - gRegionMap->initStep++; - return TRUE; -} - -void FreeRegionMapIconResources(void) -{ - if (gRegionMap->cursorSprite != NULL) - { - DestroySprite(gRegionMap->cursorSprite); - FreeSpriteTilesByTag(gRegionMap->cursorTileTag); - FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag); - } - if (gRegionMap->playerIconSprite != NULL) - { - DestroySprite(gRegionMap->playerIconSprite); - FreeSpriteTilesByTag(gRegionMap->playerIconTileTag); - FreeSpritePaletteByTag(gRegionMap->playerIconPaletteTag); - } -} - -u8 sub_80FAB60(void) -{ - return gRegionMap->inputCallback(); -} - -static u8 sub_80FAB78(void) -{ - u8 event = INPUT_EVENT_NONE; - - gRegionMap->cursorDeltaX = 0; - gRegionMap->cursorDeltaY = 0; - if ((gMain.heldKeys & DPAD_UP) && gRegionMap->cursorPosY > MAPCURSOR_Y_MIN) - { - gRegionMap->cursorDeltaY = -1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->cursorPosY < MAPCURSOR_Y_MAX) - { - gRegionMap->cursorDeltaY = 1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->cursorPosX > MAPCURSOR_X_MIN) - { - gRegionMap->cursorDeltaX = -1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->cursorPosX < MAPCURSOR_X_MAX) - { - gRegionMap->cursorDeltaX = 1; - event = INPUT_EVENT_DPAD; - } - - if (gMain.newKeys & A_BUTTON) - event = INPUT_EVENT_A_BUTTON; - else if (gMain.newKeys & B_BUTTON) - event = INPUT_EVENT_B_BUTTON; - - if (event == INPUT_EVENT_DPAD) - { - gRegionMap->unk7A = 4; - gRegionMap->inputCallback = _swiopen; - } - return event; -} - -static u8 _swiopen(void) -{ - u16 mapSectionId; - - if (gRegionMap->unk7A != 0) - return INPUT_EVENT_2; - - if (gRegionMap->cursorDeltaX > 0) - gRegionMap->cursorPosX++; - - if (gRegionMap->cursorDeltaX < 0) - gRegionMap->cursorPosX--; - - if (gRegionMap->cursorDeltaY > 0) - gRegionMap->cursorPosY++; - - if (gRegionMap->cursorDeltaY < 0) - gRegionMap->cursorPosY--; - - mapSectionId = GetRegionMapSectionAt(gRegionMap->cursorPosX, gRegionMap->cursorPosY); - gRegionMap->unk16 = sub_80FB758(mapSectionId); - if (mapSectionId != gRegionMap->mapSectionId) - { - gRegionMap->mapSectionId = mapSectionId; - GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16); - } - sub_80FBA18(); - gRegionMap->inputCallback = sub_80FAB78; - return INPUT_EVENT_3; -} - -static u8 sub_80FAD04(void) -{ - u8 event = INPUT_EVENT_NONE; - - gRegionMap->unk6A = 0; - gRegionMap->unk68 = 0; - if ((gMain.heldKeys & DPAD_UP) && gRegionMap->scrollY > -52) - { - gRegionMap->unk68 = -1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->scrollY < 60) - { - gRegionMap->unk68 = 1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->scrollX > -44) - { - gRegionMap->unk6A = -1; - event = INPUT_EVENT_DPAD; - } - if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->scrollX < 172) - { - gRegionMap->unk6A = 1; - event = INPUT_EVENT_DPAD; - } - - if (gMain.newKeys & A_BUTTON) - event = INPUT_EVENT_A_BUTTON; - if (gMain.newKeys & B_BUTTON) - event = INPUT_EVENT_B_BUTTON; - - if (event == INPUT_EVENT_DPAD) - { - gRegionMap->inputCallback = sub_80FADE4; - gRegionMap->unk6C = 0; - } - return event; -} - -static u8 sub_80FADE4(void) -{ - gRegionMap->scrollY += gRegionMap->unk68; - gRegionMap->scrollX += gRegionMap->unk6A; - sub_80FB238(gRegionMap->scrollX, gRegionMap->scrollY); - gRegionMap->unk6C++; - if (gRegionMap->unk6C == 8) - { - u16 r3 = (gRegionMap->scrollX + 44) / 8 + 1; - u16 r1 = (gRegionMap->scrollY + 52) / 8 + 2; - - if (r3 != gRegionMap->unk64 || r1 != gRegionMap->unk66) - { - u16 mapSectionId; - - gRegionMap->unk64 = r3; - gRegionMap->unk66 = r1; - mapSectionId = GetRegionMapSectionAt(r3, r1); - gRegionMap->unk16 = sub_80FB758(mapSectionId); - if (mapSectionId != gRegionMap->mapSectionId) - { - gRegionMap->mapSectionId = mapSectionId; - GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16); - } - sub_80FBA18(); - } - gRegionMap->unk6C = 0; - gRegionMap->inputCallback = sub_80FAD04; - return INPUT_EVENT_3; - } - return INPUT_EVENT_2; -} - -void sub_80FAEC4(void) -{ - if (gRegionMap->zoomed == FALSE) - { - gRegionMap->scrollY = 0; - gRegionMap->scrollX = 0; - gRegionMap->unk40 = 0; - gRegionMap->unk3C = 0; - gRegionMap->unk60 = gRegionMap->cursorPosX * 8 - 52; - gRegionMap->unk62 = gRegionMap->cursorPosY * 8 - 68; - gRegionMap->unk44 = (gRegionMap->unk60 << 8) / 16; - gRegionMap->unk48 = (gRegionMap->unk62 << 8) / 16; - gRegionMap->unk64 = gRegionMap->cursorPosX; - gRegionMap->unk66 = gRegionMap->cursorPosY; - gRegionMap->unk4C = (256 << 8); - gRegionMap->unk50 = -0x800; - } - else - { - gRegionMap->unk3C = gRegionMap->scrollX * 256; - gRegionMap->unk40 = gRegionMap->scrollY * 256; - gRegionMap->unk60 = 0; - gRegionMap->unk62 = 0; - gRegionMap->unk44 = -(gRegionMap->unk3C / 16); - gRegionMap->unk48 = -(gRegionMap->unk40 / 16); - gRegionMap->cursorPosX = gRegionMap->unk64; - gRegionMap->cursorPosY = gRegionMap->unk66; - gRegionMap->unk4C = (128 << 8); - gRegionMap->unk50 = 0x800; - } - gRegionMap->unk6E = 0; - sub_80FBCA0(); - sub_80FBDF8(); -} - -u8 sub_80FAFC0(void) -{ - u8 r4; - - if (gRegionMap->unk6E >= 16) - return 0; - gRegionMap->unk6E++; - if (gRegionMap->unk6E == 16) - { - gRegionMap->unk44 = 0; - gRegionMap->unk48 = 0; - gRegionMap->scrollX = gRegionMap->unk60; - gRegionMap->scrollY = gRegionMap->unk62; - gRegionMap->unk4C = (gRegionMap->zoomed == FALSE) ? (128 << 8) : (256 << 8); - gRegionMap->zoomed = !gRegionMap->zoomed; - gRegionMap->inputCallback = (gRegionMap->zoomed == FALSE) ? sub_80FAB78 : sub_80FAD04; - CreateRegionMapCursor(gRegionMap->cursorTileTag, gRegionMap->cursorPaletteTag); - sub_80FBE24(); - r4 = 0; - } - else - { - gRegionMap->unk3C += gRegionMap->unk44; - gRegionMap->unk40 += gRegionMap->unk48; - gRegionMap->scrollX = gRegionMap->unk3C >> 8; - gRegionMap->scrollY = gRegionMap->unk40 >> 8; - gRegionMap->unk4C += gRegionMap->unk50; - if ((gRegionMap->unk44 < 0 && gRegionMap->scrollX < gRegionMap->unk60) - || (gRegionMap->unk44 > 0 && gRegionMap->scrollX > gRegionMap->unk60)) - { - gRegionMap->scrollX = gRegionMap->unk60; - gRegionMap->unk44 = 0; - } - if ((gRegionMap->unk48 < 0 && gRegionMap->scrollY < gRegionMap->unk62) - || (gRegionMap->unk48 > 0 && gRegionMap->scrollY > gRegionMap->unk62)) - { - gRegionMap->scrollY = gRegionMap->unk62; - gRegionMap->unk48 = 0; - } - if (gRegionMap->zoomed == FALSE) - { - if (gRegionMap->unk4C < (128 << 8)) - { - gRegionMap->unk4C = (128 << 8); - gRegionMap->unk50 = 0; - } - } - else - { - if (gRegionMap->unk4C > (256 << 8)) - { - gRegionMap->unk4C = (256 << 8); - gRegionMap->unk50 = 0; - } - } - r4 = 1; - } - CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, gRegionMap->unk4C >> 8, gRegionMap->unk4C >> 8, 0); - return r4; -} - -static void CalcZoomScrollParams(s16 a, s16 b, s16 c, s16 d, u16 e, u16 f, u8 rotation) -{ - s32 var1; - s32 var2; - s32 var3; - s32 var4; - - gRegionMap->unk2C = e * gSineTable[rotation + 64] >> 8; - gRegionMap->unk30 = e * -gSineTable[rotation] >> 8; - gRegionMap->unk34 = f * gSineTable[rotation] >> 8; - gRegionMap->unk38 = f * gSineTable[rotation + 64] >> 8; - - var1 = (a << 8) + (c << 8); - var2 = d * gRegionMap->unk34 + gRegionMap->unk2C * c; - gRegionMap->bg2x = var1 - var2; - - var3 = (b << 8) + (d << 8); - var4 = gRegionMap->unk38 * d + gRegionMap->unk30 * c; - gRegionMap->bg2y = var3 - var4; - - gRegionMap->needUpdateVideoRegs = TRUE; -} - -static void sub_80FB238(s16 x, s16 y) -{ - gRegionMap->bg2x = (0x1C << 8) + (x << 8); - gRegionMap->bg2y = (0x24 << 8) + (y << 8); - gRegionMap->needUpdateVideoRegs = TRUE; -} - -void UpdateRegionMapVideoRegs(void) -{ - if (gRegionMap->needUpdateVideoRegs) - { - REG_BG2PA = gRegionMap->unk2C; - REG_BG2PB = gRegionMap->unk34; - REG_BG2PC = gRegionMap->unk30; - REG_BG2PD = gRegionMap->unk38; - REG_BG2X = gRegionMap->bg2x; - REG_BG2Y = gRegionMap->bg2y; - gRegionMap->needUpdateVideoRegs = FALSE; - } -} - -void sub_80FB2A4(s16 a, s16 b) -{ - CalcZoomScrollParams(a, b, 0x38, 0x48, 0x100, 0x100, 0); - UpdateRegionMapVideoRegs(); - if (gRegionMap->playerIconSprite != NULL) - { - gRegionMap->playerIconSprite->pos2.x = -a; - gRegionMap->playerIconSprite->pos2.y = -b; - } -} - -static u16 GetRegionMapSectionAt(u16 x, u16 y) -{ - if (y < MAPCURSOR_Y_MIN || y > MAPCURSOR_Y_MAX || x < MAPCURSOR_X_MIN || x > MAPCURSOR_X_MAX) - return MAPSEC_NONE; - y -= MAPCURSOR_Y_MIN; - x -= MAPCURSOR_X_MIN; - return sRegionMapLayout[x + y * 28]; -} - -static void InitializeCursorPosition(void) -{ - struct MapHeader *mapHeader; - u16 mapWidth; - u16 mapHeight; - u16 x; - u16 y; - u16 r1; - u16 r9; - - if (gSaveBlock1.location.mapGroup == 25 - && (gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR) - || gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_LOWER_DECK) - || gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_ROOMS))) - { - sub_80FB600(); - return; - } - - switch (GetMapTypeByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) - 1) - { - default: - case 0: - case 1: - case 2: - case 4: - case 5: - gRegionMap->mapSectionId = gMapHeader.regionMapSectionId; - gRegionMap->playerIsInCave = FALSE; - mapWidth = gMapHeader.mapData->width; - mapHeight = gMapHeader.mapData->height; - x = gSaveBlock1.pos.x; - y = gSaveBlock1.pos.y; - if (gRegionMap->mapSectionId == MAPSEC_UNDERWATER6) - gRegionMap->playerIsInCave = TRUE; - break; - case 3: - case 6: - mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp4.mapGroup, gSaveBlock1.warp4.mapNum); - gRegionMap->mapSectionId = mapHeader->regionMapSectionId; - gRegionMap->playerIsInCave = TRUE; - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; - x = gSaveBlock1.warp4.x; - y = gSaveBlock1.warp4.y; - break; - case 8: - mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum); - gRegionMap->mapSectionId = mapHeader->regionMapSectionId; - gRegionMap->playerIsInCave = TRUE; - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; - x = gSaveBlock1.warp2.x; - y = gSaveBlock1.warp2.y; - break; - case 7: - { - struct WarpData *r4; - - gRegionMap->mapSectionId = gMapHeader.regionMapSectionId; - if (gRegionMap->mapSectionId != MAPSEC_UNK_0x57) - { - r4 = &gSaveBlock1.warp4; - mapHeader = Overworld_GetMapHeaderByGroupAndId(r4->mapGroup, r4->mapNum); - } - else - { - r4 = &gSaveBlock1.warp2; - mapHeader = Overworld_GetMapHeaderByGroupAndId(r4->mapGroup, r4->mapNum); - gRegionMap->mapSectionId = mapHeader->regionMapSectionId; - } - gRegionMap->playerIsInCave = FALSE; - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; - x = r4->x; - y = r4->y; - } - break; - } - - r9 = x; - - r1 = mapWidth / gRegionMapLocations[gRegionMap->mapSectionId].width; - if (r1 == 0) - r1 = 1; - x /= r1; - if (x >= gRegionMapLocations[gRegionMap->mapSectionId].width) - x = gRegionMapLocations[gRegionMap->mapSectionId].width - 1; - - r1 = mapHeight / gRegionMapLocations[gRegionMap->mapSectionId].height; - if (r1 == 0) - r1 = 1; - y /= r1; - if (y >= gRegionMapLocations[gRegionMap->mapSectionId].height) - y = gRegionMapLocations[gRegionMap->mapSectionId].height - 1; - - switch (gRegionMap->mapSectionId) - { - case MAPSEC_ROUTE_114: - if (y != 0) - x = 0; - break; - case MAPSEC_ROUTE_126: - case MAPSEC_UNDERWATER2: - x = 0; - if (gSaveBlock1.pos.x > 32) - x = 1; - if (gSaveBlock1.pos.x > 0x33) - x++; - y = 0; - if (gSaveBlock1.pos.y > 0x25) - y = 1; - if (gSaveBlock1.pos.y > 0x38) - y++; - break; - case MAPSEC_ROUTE_121: - x = 0; - if (r9 > 14) - x = 1; - if (r9 > 0x1C) - x++; - if (r9 > 0x36) - x++; - break; - } - gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSectionId].x + x + MAPCURSOR_X_MIN; - gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSectionId].y + y + MAPCURSOR_Y_MIN; -} - -static void sub_80FB600(void) -{ - u16 y = 0; - u16 x = 0; - u8 mapGroup; - u8 mapNum; - s16 sp2; - s16 sp4; - - switch (GetSSTidalLocation(&mapGroup, &mapNum, &sp2, &sp4)) - { - case 1: - gRegionMap->mapSectionId = MAPSEC_SLATEPORT_CITY; - break; - case 2: - gRegionMap->mapSectionId = MAPSEC_LILYCOVE_CITY; - break; - case 3: - gRegionMap->mapSectionId = MAPSEC_ROUTE_124; - break; - case 4: - gRegionMap->mapSectionId = MAPSEC_ROUTE_131; - break; - default: - case 0: - { - struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); - u16 r1; - - gRegionMap->mapSectionId = mapHeader->regionMapSectionId; - r1 = mapHeader->mapData->width / gRegionMapLocations[gRegionMap->mapSectionId].width; - if (r1 == 0) - r1 = 1; - x = sp2 / r1; - if (x >= gRegionMapLocations[gRegionMap->mapSectionId].width) - x = gRegionMapLocations[gRegionMap->mapSectionId].width - 1; - - r1 = mapHeader->mapData->height / gRegionMapLocations[gRegionMap->mapSectionId].height; - if (r1 == 0) - r1 = 1; - y = sp4 / r1; - if (y >= gRegionMapLocations[gRegionMap->mapSectionId].height) - y = gRegionMapLocations[gRegionMap->mapSectionId].height - 1; - } - break; - } - gRegionMap->playerIsInCave = FALSE; - gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSectionId].x + x + MAPCURSOR_X_MIN; - gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSectionId].y + y + MAPCURSOR_Y_MIN; -} - -static u16 sub_80FB758(u16 mapSectionId) -{ - switch (mapSectionId) - { - case MAPSEC_NONE: - return 0; - case MAPSEC_LITTLEROOT_TOWN: - return FlagGet(FLAG_VISITED_LITTLEROOT_TOWN) ? 2 : 3; - case MAPSEC_OLDALE_TOWN: - return FlagGet(FLAG_VISITED_OLDALE_TOWN) ? 2 : 3; - case MAPSEC_DEWFORD_TOWN: - return FlagGet(FLAG_VISITED_DEWFORD_TOWN) ? 2 : 3; - case MAPSEC_LAVARIDGE_TOWN: - return FlagGet(FLAG_VISITED_LAVARIDGE_TOWN) ? 2 : 3; - case MAPSEC_FALLARBOR_TOWN: - return FlagGet(FLAG_VISITED_FALLARBOR_TOWN) ? 2 : 3; - case MAPSEC_VERDANTURF_TOWN: - return FlagGet(FLAG_VISITED_VERDANTURF_TOWN) ? 2 : 3; - case MAPSEC_PACIFIDLOG_TOWN: - return FlagGet(FLAG_VISITED_PACIFIDLOG_TOWN) ? 2 : 3; - case MAPSEC_PETALBURG_CITY: - return FlagGet(FLAG_VISITED_PETALBURG_CITY) ? 2 : 3; - case MAPSEC_SLATEPORT_CITY: - return FlagGet(FLAG_VISITED_SLATEPORT_CITY) ? 2 : 3; - case MAPSEC_MAUVILLE_CITY: - return FlagGet(FLAG_VISITED_MAUVILLE_CITY) ? 2 : 3; - case MAPSEC_RUSTBORO_CITY: - return FlagGet(FLAG_VISITED_RUSTBORO_CITY) ? 2 : 3; - case MAPSEC_FORTREE_CITY: - return FlagGet(FLAG_VISITED_FORTREE_CITY) ? 2 : 3; - case MAPSEC_LILYCOVE_CITY: - return FlagGet(FLAG_VISITED_LILYCOVE_CITY) ? 2 : 3; - case MAPSEC_MOSSDEEP_CITY: - return FlagGet(FLAG_VISITED_MOSSDEEP_CITY) ? 2 : 3; - case MAPSEC_SOOTOPOLIS_CITY: - return FlagGet(FLAG_VISITED_SOOTOPOLIS_CITY) ? 2 : 3; - case MAPSEC_EVER_GRANDE_CITY: - return FlagGet(FLAG_VISITED_EVER_GRANDE_CITY) ? 2 : 3; - - case MAPSEC_BATTLE_TOWER: - return FlagGet(FLAG_LANDMARK_BATTLE_TOWER) ? 4 : 0; - case MAPSEC_SOUTHERN_ISLAND: - return FlagGet(FLAG_LANDMARK_SOUTHERN_ISLAND) ? 1 : 0; - default: - return 1; - } -} - -u16 GetRegionMapSectionAt_(u16 x, u16 y) -{ - return GetRegionMapSectionAt(x, y); -} - -static u16 sub_80FB9C0(u16 mapSectionId) -{ - u16 i; - - for (i = 0; gUnknown_083E7684[i][0] != MAPSEC_NONE; i++) - { - if (gUnknown_083E7684[i][0] == mapSectionId) - return gUnknown_083E7684[i][1]; - } - return mapSectionId; -} - -u16 sub_80FBA04(u16 mapSectionId) -{ - return sub_80FB9C0(mapSectionId); -} - -static void sub_80FBA18(void) -{ - u16 x; - u16 y; - u16 i; - - if (gRegionMap->mapSectionId == MAPSEC_NONE) - { - gRegionMap->everGrandeCityArea = 0; - return; - } - - if (gRegionMap->zoomed == FALSE) - { - x = gRegionMap->cursorPosX; - y = gRegionMap->cursorPosY; - } - else - { - x = gRegionMap->unk64; - y = gRegionMap->unk66; - } - - i = 0; - while (1) - { - if (x <= 1) - { - if (sub_80FBAA0(y)) - { - y--; - x = 0x1D; - } - else - { - break; - } - } - else - { - x--; - if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSectionId) - i++; - } - } - - gRegionMap->everGrandeCityArea = i; -} - -static bool8 sub_80FBAA0(u16 a) -{ - u16 x; - u16 y; - - y = a - 1; - if (y == 0xFFFF) - return FALSE; - - for (x = MAPCURSOR_X_MIN; x <= MAPCURSOR_X_MAX; x++) - { - if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSectionId) - return TRUE; - } - return FALSE; -} - -static const struct OamData sCursorOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sCursorAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_FRAME(4, 20), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sCursorAnimSeq1[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_FRAME(16, 10), - ANIMCMD_FRAME(32, 10), - ANIMCMD_FRAME(16, 10), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd *const sCursorAnimTable[] = -{ - sCursorAnimSeq0, - sCursorAnimSeq1, -}; - -static void SpriteCB_Cursor(struct Sprite *sprite) -{ - if (gRegionMap->unk7A != 0) - { - sprite->pos1.x += gRegionMap->cursorDeltaX * 2; - sprite->pos1.y += gRegionMap->cursorDeltaY * 2; - gRegionMap->unk7A--; - } -} - -static void nullsub_66(struct Sprite *sprite) -{ -} - -void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) -{ - u8 spriteId; - struct SpriteSheet spriteSheet; - struct SpritePalette spritePalette = - { - .data = sRegionMapCursor_Pal, - }; - struct SpriteTemplate spriteTemplate = - { - .oam = &sCursorOamData, - .anims = sCursorAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_Cursor, - }; - - spriteSheet.tag = tileTag; - spriteTemplate.tileTag = tileTag; - gRegionMap->cursorTileTag = tileTag; - - spritePalette.tag = paletteTag; - spriteTemplate.paletteTag = paletteTag; - gRegionMap->cursorPaletteTag = paletteTag; - - if (gRegionMap->zoomed == FALSE) - { - spriteSheet.data = gRegionMap->cursorSmallImage; - spriteSheet.size = 0x100; - spriteTemplate.callback = SpriteCB_Cursor; - } - else - { - spriteSheet.data = gRegionMap->cursorLargeImage; - spriteSheet.size = 0x600; - spriteTemplate.callback = nullsub_66; - } - LoadSpriteSheet(&spriteSheet); - LoadSpritePalette(&spritePalette); - spriteId = CreateSprite(&spriteTemplate, 0x38, 0x48, 0); - if (spriteId != 64) - { - gRegionMap->cursorSprite = &gSprites[spriteId]; - if (gRegionMap->zoomed == TRUE) - { - gRegionMap->cursorSprite->oam.size = 2; - gRegionMap->cursorSprite->pos1.x -= 8; - gRegionMap->cursorSprite->pos1.y -= 8; - StartSpriteAnim(gRegionMap->cursorSprite, 1); - } - else - { - gRegionMap->cursorSprite->oam.size = 1; - gRegionMap->cursorSprite->pos1.x = gRegionMap->cursorPosX * 8 + 4; - gRegionMap->cursorSprite->pos1.y = gRegionMap->cursorPosY * 8 + 4; - } - gRegionMap->cursorSprite->data[1] = 2; - gRegionMap->cursorSprite->data[2] = IndexOfSpritePaletteTag(paletteTag) * 16 + 0x0101; - gRegionMap->cursorSprite->data[3] = 1; - } -} - -void sub_80FBCA0(void) -{ - if (gRegionMap->cursorSprite != NULL) - { - DestroySprite(gRegionMap->cursorSprite); - FreeSpriteTilesByTag(gRegionMap->cursorTileTag); - FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag); - } -} - -void unref_sub_80FBCD0(void) -{ - gRegionMap->cursorSprite->data[3] = 1; -} - -void unref_sub_80FBCE0(void) -{ - gRegionMap->cursorSprite->data[3] = 0; -} - -static const struct OamData sPlayerIconOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sPlayerIconAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd *const sPlayerIconAnimTable[] = -{ - sPlayerIconAnimSeq0, -}; - -void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag) -{ - u8 spriteId; - struct SpriteSheet playerIconSpriteSheet = - { - .data = sRegionMapBrendanIcon_Image, - .size = 128, - .tag = tileTag, - }; - struct SpritePalette playerIconSpritePalette = - { - .data = sRegionMapBrendanIcon_Pal, - .tag = paletteTag, - }; - struct SpriteTemplate playerIconSpriteTemplate = - { - .tileTag = tileTag, - .paletteTag = paletteTag, - .oam = &sPlayerIconOamData, - .anims = sPlayerIconAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, - }; - - if (gSaveBlock2.playerGender == FEMALE) - { - playerIconSpriteSheet.data = sRegionMapMayIcon_Image; - playerIconSpritePalette.data = sRegionMapMayIcon_Pal; - } - LoadSpriteSheet(&playerIconSpriteSheet); - LoadSpritePalette(&playerIconSpritePalette); - spriteId = CreateSprite(&playerIconSpriteTemplate, 0, 0, 1); - gRegionMap->playerIconSprite = &gSprites[spriteId]; - if (gRegionMap->zoomed == FALSE) - { - gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4; - gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4; - gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut; - } - else - { - gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48; - gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66; - gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn; - } -} - -static void sub_80FBDF8(void) -{ - if (gRegionMap->playerIconSprite != NULL) - { - gRegionMap->playerIconSprite->invisible = TRUE; - gRegionMap->playerIconSprite->callback = SpriteCallbackDummy; - } -} - -static void sub_80FBE24(void) -{ - if (gRegionMap->playerIconSprite != NULL) - { - if (gRegionMap->zoomed == TRUE) - { - gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48; - gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66; - gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn; - gRegionMap->playerIconSprite->invisible = FALSE; - } - else - { - gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4; - gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4; - gRegionMap->playerIconSprite->pos2.x = 0; - gRegionMap->playerIconSprite->pos2.y = 0; - gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut; - gRegionMap->playerIconSprite->invisible = FALSE; - } - } -} - -static void SpriteCB_PlayerIconZoomedIn(struct Sprite *sprite) -{ - sprite->pos2.x = -(gRegionMap->scrollX * 2); - sprite->pos2.y = -(gRegionMap->scrollY * 2); - sprite->data[0] = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - sprite->data[1] = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - - // Determine if sprite is on screen - if (sprite->data[0] < -8 || sprite->data[0] > 0xA8 || sprite->data[1] < -8 || sprite->data[1] > 0xF8) - sprite->data[2] = FALSE; - else - sprite->data[2] = TRUE; - - if (sprite->data[2] == TRUE) - UpdateIconBlink(sprite); - else - sprite->invisible = TRUE; -} - -static void SpriteCB_PlayerIconZoomedOut(struct Sprite *sprite) -{ - UpdateIconBlink(sprite); -} - -static void UpdateIconBlink(struct Sprite *sprite) -{ - if (gRegionMap->blinkPlayerIcon) - { - // Toggle visibility every 16 frames - sprite->data[7]++; - if (sprite->data[7] > 16) - { - sprite->data[7] = 0; - sprite->invisible = !sprite->invisible; - } - } - else - { - sprite->invisible = FALSE; - } -} - -void sub_80FBF94(void) -{ - if (gRegionMap->playerIsInCave) - gRegionMap->blinkPlayerIcon = TRUE; -} - -const u8 *GetMapSectionName(u8 *dest, u16 mapSectionId, u16 length) -{ - if (mapSectionId == MAPSEC_SECRET_BASE) - return GetSecretBaseMapName(dest); - if (mapSectionId < MAPSEC_NONE) - return StringCopy(dest, gRegionMapLocations[mapSectionId].regionMapSectionId); - if (length == 0) - length = 18; - return StringFill(dest, CHAR_SPACE, length); -} - -const u8 *CopyMapName(u8 *dest, u16 mapSectionId) -{ - switch (mapSectionId) - { - case MAPSEC_UNK_0x57: - return StringCopy(dest, gOtherText_Ferry); - case MAPSEC_SECRET_BASE: - return StringCopy(dest, gOtherText_SecretBase); - default: - return GetMapSectionName(dest, mapSectionId, 0); - } -} - -const u8 *CopyLocationName(u8 *dest, u16 mapSectionId) -{ - if (mapSectionId == MAPSEC_EVIL_TEAM_HIDEOUT) - return StringCopy(dest, gOtherText_Hideout); - else - return CopyMapName(dest, mapSectionId); -} - -static void GetRegionMapLocationPosition(u16 mapSectionId, u16 *x, u16 *y, u16 *width, u16 *height) -{ - *x = gRegionMapLocations[mapSectionId].x; - *y = gRegionMapLocations[mapSectionId].y; - *width = gRegionMapLocations[mapSectionId].width; - *height = gRegionMapLocations[mapSectionId].height; -} - -struct UnknownStruct3 -{ - void (*unk0)(void); - u16 unk4; - u16 unk6; - struct RegionMap regionMap; -}; - -static const u16 sFlyRegionMapFrame_Pal[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal"); -static const u8 sFlyRegionMapFrame_ImageLZ[] = INCBIN_U8("graphics/pokenav/map_frame.4bpp.lz"); -static const u8 sFlyRegionMapFrame_TilemapLZ[] = INCBIN_U8("graphics/pokenav/map_frame.bin.lz"); -static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/fly_target_icons.gbapal"); -static const u8 sFlyTargetIcons_ImageLZ[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz"); - -static const u8 sUnknown_083E7920[][3] = -{ - {0, 9, 1}, - {0, 10, 14}, - {0, 11, 15}, - {0, 12, 16}, - {0, 13, 17}, - {0, 14, 18}, - {0, 15, 19}, - {0, 0, 3}, - {0, 1, 4}, - {0, 2, 5}, - {0, 3, 6}, - {0, 4, 7}, - {0, 5, 8}, - {0, 6, 9}, - {0, 7, 10}, - {0, 8, 11}, - {0, 16, 0}, - {0, 17, 0}, - {0, 18, 0}, - {0, 19, 0}, - {0, 20, 0}, - {0, 21, 0}, - {0, 22, 0}, - {0, 23, 0}, - {0, 24, 0}, - {0, 25, 0}, - {0, 26, 0}, - {0, 27, 0}, - {0, 28, 0}, - {0, 29, 0}, - {0, 30, 0}, - {0, 31, 0}, - {0, 32, 0}, - {0, 33, 0}, - {0, 34, 0}, - {0, 35, 0}, - {0, 36, 0}, - {0, 37, 0}, - {0, 38, 0}, - {0, 39, 0}, - {0, 40, 0}, - {0, 41, 0}, - {0, 42, 0}, - {0, 43, 0}, - {0, 44, 0}, - {0, 45, 0}, - {0, 46, 0}, - {0, 47, 0}, - {0, 48, 0}, - {0, 49, 0}, -}; - -static const u8 *const sEverGrandeCityAreaNames[] = -{ - OtherText_PokeLeague, - OtherText_PokeCenter, -}; - -struct MultiPartMapSection -{ - const u8 *const *partNames; - u16 mapSectionId; - u16 requiredFlag; -}; - -// Map sections that are divided into multiple parts. Ever Grande City is the only one. -static const struct MultiPartMapSection sMultiPartMapSections[1] = -{ - {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY}, -}; - -static struct UnknownStruct3 *const sFlyDataPtr = (struct UnknownStruct3 *)gSharedMem; - -static const struct SpritePalette sFlyTargetIconSpritePalette = {sFlyTargetIcons_Pal, 2}; - -// Fly targets that are not cities or towns -static const u16 sSpecialFlyAreas[][2] = -{ - // flag, mapSectionId - {0x848, MAPSEC_BATTLE_TOWER}, - {0xFFFF, MAPSEC_NONE}, -}; - -static const struct OamData sFlyTargetOamData = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sFlyTargetAnimSeq0[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq1[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq2[] = -{ - ANIMCMD_FRAME(3, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq3[] = -{ - ANIMCMD_FRAME(5, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq4[] = -{ - ANIMCMD_FRAME(6, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq5[] = -{ - ANIMCMD_FRAME(8, 5), - ANIMCMD_END, -}; - -static const union AnimCmd sFlyTargetAnimSeq6[] = -{ - ANIMCMD_FRAME(10, 5), - ANIMCMD_END, -}; - -static const union AnimCmd *const sFlyTargetAnimTable[] = -{ - sFlyTargetAnimSeq0, - sFlyTargetAnimSeq1, - sFlyTargetAnimSeq2, - sFlyTargetAnimSeq3, - sFlyTargetAnimSeq4, - sFlyTargetAnimSeq5, - sFlyTargetAnimSeq6, -}; - -static const struct SpriteTemplate gFlyTargetSpriteTemplate = -{ - .tileTag = 2, - .paletteTag = 2, - .oam = &sFlyTargetOamData, - .anims = sFlyTargetAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -void CB2_InitFlyRegionMap(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2VOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - ResetPaletteFade(); - ResetSpriteData(); - FreeSpriteTileRanges(); - FreeAllSpritePalettes(); - break; - case 1: - Text_LoadWindowTemplate(&gWindowTemplate_81E7224); - break; - case 2: - InitMenuWindow(&gWindowTemplate_81E7224); - Menu_EraseScreen(); - break; - case 3: - InitRegionMap(&sFlyDataPtr->regionMap, 0); - CreateRegionMapCursor(0, 0); - CreateRegionMapPlayerIcon(1, 1); - sFlyDataPtr->unk6 = sFlyDataPtr->regionMap.mapSectionId; - StringFill(ewramBlankMapName, CHAR_SPACE, 12); - PrintFlyTargetName(); - break; - case 4: - LZ77UnCompVram(sFlyRegionMapFrame_ImageLZ, (void *)(VRAM + 0xC000)); - break; - case 5: - LZ77UnCompVram(sFlyRegionMapFrame_TilemapLZ, (void *)(VRAM + 0xF000)); - break; - case 6: - LoadPalette(sFlyRegionMapFrame_Pal, 16, 32); - Menu_PrintTextPixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1); - break; - case 7: - CreateFlyTargetGraphics(); - break; - case 8: - BlendPalettes(0xFFFFFFFF, 16, 0); - SetVBlankCallback(VBlankCB_FlyRegionMap); - break; - case 9: - REG_BLDCNT = 0; - REG_BG1CNT = 0x1E0D; - REG_DISPCNT = 0x1741; - sub_80FC244(sub_80FC5B4); - SetMainCallback2(CB2_FlyRegionMap); - break; - default: - return; - } - gMain.state++; -} - -static void VBlankCB_FlyRegionMap(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void CB2_FlyRegionMap(void) -{ - sFlyDataPtr->unk0(); - AnimateSprites(); - BuildOamBuffer(); -} - -void sub_80FC244(void (*func)(void)) -{ - sFlyDataPtr->unk0 = func; - sFlyDataPtr->unk4 = 0; -} - -static void PrintFlyTargetName(void) -{ - if (sFlyDataPtr->regionMap.unk16 == 2 || sFlyDataPtr->regionMap.unk16 == 4) - { - bool8 drawFrameDisabled = FALSE; - u16 i; - - for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++) - { - if (sFlyDataPtr->regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) - { - if (FlagGet(sMultiPartMapSections[i].requiredFlag)) - { - Menu_DrawStdWindowFrame(16, 14, 29, 19); - Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 15); - MenuPrint_RightAligned(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea], 29, 17); - drawFrameDisabled = TRUE; - } - break; - } - } - - if (!drawFrameDisabled) - { - Menu_DrawStdWindowFrame(16, 16, 29, 19); - Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 17); - Menu_EraseWindowRect(16, 14, 29, 15); - } - } - else - { - Menu_DrawStdWindowFrame(16, 16, 29, 19); - Menu_PrintText(ewramBlankMapName, 17, 17); - Menu_EraseWindowRect(16, 14, 29, 15); - } -} - -static void CreateFlyTargetGraphics(void) -{ - struct SpriteSheet spriteSheet; - - LZ77UnCompWram(sFlyTargetIcons_ImageLZ, ewram888); - spriteSheet.data = ewram888; - spriteSheet.size = 0x1C0; - spriteSheet.tag = 2; - LoadSpriteSheet(&spriteSheet); - LoadSpritePalette(&sFlyTargetIconSpritePalette); - CreateCityTownFlyTargetIcons(); - CreateSpecialAreaFlyTargetIcons(); -} - -// Draws a light overlay on cities and towns that the player can fly to -static void CreateCityTownFlyTargetIcons(void) -{ - u16 canFlyFlag = 0x80F; - u16 i; - - for (i = 0; i < 16; i++) - { - u16 x; - u16 y; - u16 width; - u16 height; - u16 r7; - u8 spriteId; - - GetRegionMapLocationPosition(i, &x, &y, &width, &height); - x = (x + 1) * 8 + 4; - y = (y + 2) * 8 + 4; - if (width == 2) - r7 = 1; - else if (height == 2) - r7 = 2; - else - r7 = 0; - spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10); - if (spriteId != 64) - { - gSprites[spriteId].oam.shape = r7; - if (FlagGet(canFlyFlag)) - gSprites[spriteId].callback = SpriteCB_FlyTargetIcons; - else - r7 += 3; - StartSpriteAnim(&gSprites[spriteId], r7); - gSprites[spriteId].data[0] = i; - } - canFlyFlag++; - } -} - -// Draws a red box on other fly targets -// The Battle Tower is the only one of these -static void CreateSpecialAreaFlyTargetIcons(void) -{ - u16 i; - - for (i = 0; sSpecialFlyAreas[i][1] != MAPSEC_NONE; i++) - { - u16 x; - u16 y; - u16 width; - u16 height; - - if (FlagGet(sSpecialFlyAreas[i][0])) - { - u16 mapSectionId = sSpecialFlyAreas[i][1]; - u8 spriteId; - - GetRegionMapLocationPosition(mapSectionId, &x, &y, &width, &height); - x = (x + 1) * 8; - y = (y + 2) * 8; - spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10); - if (spriteId != 64) - { - gSprites[spriteId].oam.size = 1; - gSprites[spriteId].callback = SpriteCB_FlyTargetIcons; - StartSpriteAnim(&gSprites[spriteId], 6); - gSprites[spriteId].data[0] = mapSectionId; - } - } - } -} - -static void SpriteCB_FlyTargetIcons(struct Sprite *sprite) -{ - // Blink if our mapSectionId is the one selected on the map - if (sFlyDataPtr->regionMap.mapSectionId == sprite->data[0]) - { - // Toggle visibility every 16 frames - sprite->data[1]++; - if (sprite->data[1] > 16) - { - sprite->data[1] = 0; - sprite->invisible = !sprite->invisible; - } - } - else - { - sprite->data[1] = 16; - sprite->invisible = FALSE; - } -} - -static void sub_80FC5B4(void) -{ - switch (sFlyDataPtr->unk4) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - sFlyDataPtr->unk4++; - break; - case 1: - if (UpdatePaletteFade() != 0) - break; - sub_80FC244(sub_80FC600); - break; - } -} - -static void sub_80FC600(void) -{ - if (sFlyDataPtr->unk4 == 0) - { - switch (sub_80FAB60()) - { - case INPUT_EVENT_NONE: - case INPUT_EVENT_DPAD: - case INPUT_EVENT_2: - break; - case INPUT_EVENT_3: - PrintFlyTargetName(); - break; - case INPUT_EVENT_A_BUTTON: - if (sFlyDataPtr->regionMap.unk16 == 2 || sFlyDataPtr->regionMap.unk16 == 4) - { - m4aSongNumStart(SE_SELECT); - ewramA6E = 1; - sub_80FC244(sub_80FC69C); - } - break; - case INPUT_EVENT_B_BUTTON: - m4aSongNumStart(SE_SELECT); - ewramA6E = 0; - sub_80FC244(sub_80FC69C); - break; - } - } -} - -void sub_80FC69C(void) -{ - switch (sFlyDataPtr->unk4) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - sFlyDataPtr->unk4++; - break; - case 1: - if (UpdatePaletteFade() != 0) - break; - FreeRegionMapIconResources(); - if (ewramA6E != 0) - { - switch (sFlyDataPtr->regionMap.mapSectionId) - { - case MAPSEC_SOUTHERN_ISLAND: - sub_8053538(22); - break; - case MAPSEC_BATTLE_TOWER: - sub_8053538(21); - break; - case MAPSEC_LITTLEROOT_TOWN: - sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13); - break; - case MAPSEC_EVER_GRANDE_CITY: - sub_8053538((FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && sFlyDataPtr->regionMap.everGrandeCityArea == 0) ? 20 : 11); - break; - default: - if (sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][2] != 0) - sub_8053538(sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][2]); - else - warp1_set_2(sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][0], sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][1], -1); - break; - } - sub_80865BC(); - } - else - { - SetMainCallback2(sub_808AD58); - } - break; - } -} - -#if DEBUG - -void debug_sub_8110CCC(void) -{ - bool8 r7 = FALSE; - u16 i; - s16 indent; - - for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++) - { - if (sFlyDataPtr->regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) - { - if (FlagGet(sMultiPartMapSections[i].requiredFlag)) - { - indent = 12 - StringLength(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea]); - if (indent < 0) - indent = 0; - r7 = TRUE; - Menu_DrawStdWindowFrame(16, 14, 29, 19); - Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 15); - Menu_PrintText(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea], 17 + indent, 17); - } - break; - } - } - if (!r7) - { - Menu_DrawStdWindowFrame(16, 16, 29, 19); - Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 17); - Menu_EraseWindowRect(16, 14, 29, 15); - } -} - -void debug_sub_8110D84(void) -{ - switch (sFlyDataPtr->unk4) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - sFlyDataPtr->unk4++; - break; - case 1: - if (!UpdatePaletteFade()) - sFlyDataPtr->unk4++; - break; - case 2: - switch (sub_80FAB60()) - { - case 0: - break; - case 3: - debug_sub_8110CCC(); - break; - case 4: - if (sFlyDataPtr->regionMap.unk16 != 0) - { - m4aSongNumStart(SE_SELECT); - gSharedMem[0xA6E] = 1; // TODO: what is this? - sub_80FC244(sub_80FC69C); - } - break; - case 5: - m4aSongNumStart(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - sFlyDataPtr->unk4++; - break; - } - break; - case 3: - if (!UpdatePaletteFade()) - SetMainCallback2(sub_805469C); - break; - case 4: - if (sub_80FAB60() != 0) - { - debug_sub_8110CCC(); - } - else if (gMain.newKeys & A_BUTTON) - { - sub_80FBCA0(); - sub_80FAEC4(); - sFlyDataPtr->unk4++; - } - break; - case 5: - if (sub_80FAFC0() == 0) - { - CreateRegionMapCursor(0, 0); - sFlyDataPtr->unk4++; - } - break; - case 6: - if (sub_80FAB60() != 0) - { - debug_sub_8110CCC(); - } - if (gMain.newKeys & A_BUTTON) // no "else if" like above? - { - sub_80FBCA0(); - sub_80FAEC4(); - sFlyDataPtr->unk4++; - } - break; - case 7: - if (sub_80FAFC0() == 0) - { - CreateRegionMapCursor(0, 0); - sFlyDataPtr->unk4 = 3; - } - break; - } -} - -void debug_sub_8110F28(void) -{ - CB2_InitFlyRegionMap(); - - if (gMain.callback2 == CB2_FlyRegionMap) - { - sub_80FBF94(); - sub_80FC244(debug_sub_8110D84); - debug_sub_8110CCC(); - } -} - -#endif - diff --git a/src/field/roamer.c b/src/field/roamer.c deleted file mode 100644 index 6ed5b6c89..000000000 --- a/src/field/roamer.c +++ /dev/null @@ -1,245 +0,0 @@ -#include "global.h" -#include "debug.h" -#include "roamer.h" -#include "pokemon.h" -#include "random.h" -#include "region_map.h" -#include "constants/species.h" - -#ifdef SAPPHIRE -#define ROAMER_SPECIES SPECIES_LATIAS -#else -#define ROAMER_SPECIES SPECIES_LATIOS -#endif - -enum -{ - MAP_GRP = 0, // map group - MAP_NUM = 1, // map number -}; - -EWRAM_DATA static u8 sLocationHistory[3][2] = {0}; -EWRAM_DATA static u8 sRoamerLocation[2] = {0}; - -static const u8 sRoamerLocations[][6] = -{ - { 0x19, 0x1A, 0x20, 0x21, 0x31, 0xFF }, - { 0x1A, 0x19, 0x20, 0x21, 0xFF, 0xFF }, - { 0x20, 0x1A, 0x19, 0x21, 0xFF, 0xFF }, - { 0x21, 0x20, 0x19, 0x1A, 0x22, 0x26 }, - { 0x22, 0x21, 0x23, 0xFF, 0xFF, 0xFF }, - { 0x23, 0x22, 0x24, 0xFF, 0xFF, 0xFF }, - { 0x24, 0x23, 0x25, 0x26, 0xFF, 0xFF }, - { 0x25, 0x24, 0x26, 0xFF, 0xFF, 0xFF }, - { 0x26, 0x25, 0x21, 0xFF, 0xFF, 0xFF }, - { 0x27, 0x24, 0x28, 0x29, 0xFF, 0xFF }, - { 0x28, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, - { 0x29, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, - { 0x2A, 0x28, 0x29, 0x2B, 0xFF, 0xFF }, - { 0x2B, 0x2A, 0x2C, 0xFF, 0xFF, 0xFF }, - { 0x2C, 0x2B, 0x2D, 0xFF, 0xFF, 0xFF }, - { 0x2D, 0x2C, 0x2E, 0xFF, 0xFF, 0xFF }, - { 0x2E, 0x2D, 0x2F, 0xFF, 0xFF, 0xFF }, - { 0x2F, 0x2E, 0x30, 0xFF, 0xFF, 0xFF }, - { 0x30, 0x2F, 0x31, 0xFF, 0xFF, 0xFF }, - { 0x31, 0x30, 0x19, 0xFF, 0xFF, 0xFF }, - { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, -}; - -void ClearRoamerData(void) -{ - memset(&gSaveBlock1.roamer, 0, sizeof(gSaveBlock1.roamer)); -} - -void ClearRoamerLocationData(void) -{ - u8 i; - - for (i = 0; i < 3; i++) - { - sLocationHistory[i][MAP_GRP] = 0; - sLocationHistory[i][MAP_NUM] = 0; - } - - sRoamerLocation[MAP_GRP] = 0; - sRoamerLocation[MAP_NUM] = 0; -} - -void CreateInitialRoamerMon(void) -{ - struct Roamer *roamer; - CreateMon(&gEnemyParty[0], ROAMER_SPECIES, 40, 0x20, 0, 0, 0, 0); - roamer = &gSaveBlock1.roamer; - roamer->species = ROAMER_SPECIES; - roamer->level = 40; - roamer->status = 0; - roamer->active = TRUE; - roamer->ivs = GetMonData(&gEnemyParty[0], MON_DATA_IVS); - roamer->personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY); - roamer->hp = GetMonData(&gEnemyParty[0], MON_DATA_MAX_HP); - roamer->cool = GetMonData(&gEnemyParty[0], MON_DATA_COOL); - roamer->beauty = GetMonData(&gEnemyParty[0], MON_DATA_BEAUTY); - roamer->cute = GetMonData(&gEnemyParty[0], MON_DATA_CUTE); - roamer->smart = GetMonData(&gEnemyParty[0], MON_DATA_SMART); - roamer->tough = GetMonData(&gEnemyParty[0], MON_DATA_TOUGH); - sRoamerLocation[MAP_GRP] = 0; - sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % 20][0]; -} - -void InitRoamer(void) -{ - ClearRoamerData(); - ClearRoamerLocationData(); - CreateInitialRoamerMon(); -} - -void UpdateLocationHistoryForRoamer(void) -{ - sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP]; - sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM]; - - sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP]; - sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM]; - - sLocationHistory[0][MAP_GRP] = gSaveBlock1.location.mapGroup; - sLocationHistory[0][MAP_NUM] = gSaveBlock1.location.mapNum; -} - -void RoamerMoveToOtherLocationSet(void) -{ - u8 val = 0; - struct Roamer *roamer = &gSaveBlock1.roamer; - - if (!roamer->active) - return; - - sRoamerLocation[MAP_GRP] = val; - - while (1) - { - val = sRoamerLocations[Random() % 20][0]; - if (sRoamerLocation[MAP_NUM] != val) - { - sRoamerLocation[MAP_NUM] = val; - return; - } - } -} - -void RoamerMove(void) -{ - u8 locSet = 0; - - if ((Random() % 16) == 0) - { - RoamerMoveToOtherLocationSet(); - } - else - { - struct Roamer *roamer = &gSaveBlock1.roamer; - - if (!roamer->active) - return; - - while (locSet < 20) - { - if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0]) - { - u8 mapNum; - while (1) - { - mapNum = sRoamerLocations[locSet][(Random() % 5) + 1]; - if (!(sLocationHistory[2][MAP_GRP] == 0 && sLocationHistory[2][MAP_NUM] == mapNum) && mapNum != 0xFF) - break; - } - sRoamerLocation[MAP_NUM] = mapNum; - return; - } - locSet++; - } - } -} - -bool8 IsRoamerAt(u8 mapGroup, u8 mapNum) -{ - struct Roamer *roamer = &gSaveBlock1.roamer; - - if (roamer->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM]) - return TRUE; - else - return FALSE; -} - -void CreateRoamerMonInstance(void) -{ - struct Pokemon *mon = &gEnemyParty[0]; - struct Roamer *roamer = &gSaveBlock1.roamer; - CreateMonWithIVsPersonality(mon, roamer->species, roamer->level, roamer->ivs, roamer->personality); - SetMonData(mon, MON_DATA_STATUS, &roamer->status); - SetMonData(mon, MON_DATA_HP, &roamer->hp); - SetMonData(mon, MON_DATA_COOL, &roamer->cool); - SetMonData(mon, MON_DATA_BEAUTY, &roamer->beauty); - SetMonData(mon, MON_DATA_CUTE, &roamer->cute); - SetMonData(mon, MON_DATA_SMART, &roamer->smart); - SetMonData(mon, MON_DATA_TOUGH, &roamer->tough); -} - -bool8 TryStartRoamerEncounter(void) -{ - if (IsRoamerAt(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) == TRUE && (Random() % 4) == 0) - { - CreateRoamerMonInstance(); - return TRUE; - } - else - { - return FALSE; - } -} - -void UpdateRoamerHPStatus(struct Pokemon *mon) -{ - struct Roamer *roamer; - u16 hp; - u8 status; - - hp = GetMonData(mon, MON_DATA_HP); - - roamer = &gSaveBlock1.roamer; - roamer->hp = hp; - - status = GetMonData(mon, MON_DATA_STATUS); - - roamer->status = status; - - RoamerMoveToOtherLocationSet(); -} - -void SetRoamerInactive(void) -{ - struct Roamer *roamer = &gSaveBlock1.roamer; - roamer->active = FALSE; -} - -void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) -{ - *mapGroup = sRoamerLocation[MAP_GRP]; - *mapNum = sRoamerLocation[MAP_NUM]; -} - -#if DEBUG -void debug_sub_814A714(void) -{ - if (gSaveBlock1.location.mapGroup == 0) - { - CreateInitialRoamerMon(); - sRoamerLocation[0] = 0; - sRoamerLocation[1] = gSaveBlock1.location.mapNum; - } -} - -void debug_sub_814A73C(u8* str) -{ - GetMapSectionName(str, sRoamerLocation[1], 0); -} -#endif diff --git a/src/field/rotating_gate.c b/src/field/rotating_gate.c deleted file mode 100644 index 69f655a65..000000000 --- a/src/field/rotating_gate.c +++ /dev/null @@ -1,1155 +0,0 @@ -#include "global.h" -#include "bike.h" -#include "event_data.h" -#include "event_object_movement.h" -#include "fieldmap.h" -#include "constants/maps.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" - -#define ROTATING_GATE_TILE_TAG 0x1300 -#define ROTATING_GATE_PUZZLE_MAX 14 -#define GATE_ARM_MAX_LENGTH 2 - -#define GATE_ROT(rotationDirection, arm, longArm) \ - ((rotationDirection & 15) << 4) | ((arm & 7) << 1) | (longArm & 1) -#define GATE_ROT_CW(arm, longArm) GATE_ROT(ROTATE_CLOCKWISE, arm, longArm) -#define GATE_ROT_ACW(arm, longArm) GATE_ROT(ROTATE_ANTICLOCKWISE, arm, longArm) -#define GATE_ROT_NONE 255 - -static void SpriteCallback_RotatingGate(struct Sprite *sprite); -static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY); -static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite); - -enum -{ - /* - * | - * +-- - */ - GATE_SHAPE_L1, - - /* - * | - * | - * +-- - */ - GATE_SHAPE_L2, - - /* - * | - * +---- - */ - GATE_SHAPE_L3, - - /* - * | - * | - * +---- - */ - GATE_SHAPE_L4, - - /* - * | - * +-- - * | - */ - GATE_SHAPE_T1, - - /* - * | - * | - * +-- - * | - */ - GATE_SHAPE_T2, - - /* - * | - * +---- - * | - */ - GATE_SHAPE_T3, - - /* - * An unused T-shape gate - * | - * +-- - * | - * | - */ - GATE_SHAPE_T4, - - /* - * An unused T-shape gate - * | - * | - * +---- - * | - */ - GATE_SHAPE_UNUSED_T1, - - /* - * An unused T-shape gate - * | - * | - * +-- - * | - * | - */ - GATE_SHAPE_UNUSED_T2, - - /* - * An unused T-shape gate - * | - * +---- - * | - * | - */ - GATE_SHAPE_UNUSED_T3, - - /* - * An unused T-shape gate - * | - * | - * +---- - * | - * | - */ - GATE_SHAPE_UNUSED_T4, -}; - -enum -{ - /* - * 0 degrees (clockwise) - * | - * +-- - * | - */ - GATE_ORIENTATION_0, - - /* - * 90 degress (clockwise) - * --+-- - * | - */ - GATE_ORIENTATION_90, - - /* - * 180 degrees (clockwise) - * | - * --+ - * | - */ - GATE_ORIENTATION_180, - - /* - * 270 degrees (clockwise) - * | - * --+-- - */ - GATE_ORIENTATION_270, - - GATE_ORIENTATION_MAX, -}; - -// Describes the location of the gates "arms" when the gate has not -// been rotated (i.e. rotated 0 degrees) -enum -{ - GATE_ARM_NORTH, - GATE_ARM_EAST, - GATE_ARM_SOUTH, - GATE_ARM_WEST, -}; - -enum -{ - ROTATE_NONE, - ROTATE_ANTICLOCKWISE, - ROTATE_CLOCKWISE, -}; - -enum -{ - PUZZLE_NONE, - PUZZLE_FORTREE_CITY_GYM, - PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6, -}; - -struct RotatingGatePuzzle -{ - s16 x; - s16 y; - u8 shape; - u8 orientation; -}; - -struct Coords8 -{ - s8 deltaX; - s8 deltaY; -}; - -// Fortree -static const struct RotatingGatePuzzle sRotatingGate_FortreePuzzleConfig[] = -{ - {12, 5, GATE_SHAPE_L4, GATE_ORIENTATION_0}, - {14, 7, GATE_SHAPE_L4, GATE_ORIENTATION_270}, - {16, 4, GATE_SHAPE_T2, GATE_ORIENTATION_90}, - {15, 14, GATE_SHAPE_L2, GATE_ORIENTATION_0}, - {18, 13, GATE_SHAPE_T1, GATE_ORIENTATION_180}, - { 8, 20, GATE_SHAPE_T1, GATE_ORIENTATION_180}, - {16, 20, GATE_SHAPE_T4, GATE_ORIENTATION_90}, -}; - -// Trickhouse -static const struct RotatingGatePuzzle sRotatingGate_TrickHousePuzzleConfig[] = -{ - {13, 3, GATE_SHAPE_T1, GATE_ORIENTATION_270}, - {12, 6, GATE_SHAPE_T1, GATE_ORIENTATION_180}, - { 3, 6, GATE_SHAPE_T1, GATE_ORIENTATION_180}, - { 3, 9, GATE_SHAPE_T2, GATE_ORIENTATION_270}, - { 8, 8, GATE_SHAPE_L1, GATE_ORIENTATION_90}, - { 2, 12, GATE_SHAPE_T3, GATE_ORIENTATION_180}, - { 9, 13, GATE_SHAPE_L2, GATE_ORIENTATION_0}, - { 3, 14, GATE_SHAPE_L3, GATE_ORIENTATION_90}, - { 9, 15, GATE_SHAPE_L4, GATE_ORIENTATION_180}, - { 3, 18, GATE_SHAPE_T2, GATE_ORIENTATION_180}, - { 2, 19, GATE_SHAPE_T1, GATE_ORIENTATION_0}, - { 5, 21, GATE_SHAPE_L1, GATE_ORIENTATION_0}, - { 9, 19, GATE_SHAPE_L4, GATE_ORIENTATION_270}, - {12, 20, GATE_SHAPE_T1, GATE_ORIENTATION_90}, -}; - -static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/rotating_gates/1.4bpp"); -static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/rotating_gates/2.4bpp"); -static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/rotating_gates/3.4bpp"); -static const u8 sRotatingGateTiles_5[] = INCBIN_U8("graphics/rotating_gates/5.4bpp"); -static const u8 sRotatingGateTiles_6[] = INCBIN_U8("graphics/rotating_gates/6.4bpp"); -static const u8 sRotatingGateTiles_7[] = INCBIN_U8("graphics/rotating_gates/7.4bpp"); -static const u8 sRotatingGateTiles_0[] = INCBIN_U8("graphics/rotating_gates/0.4bpp"); -static const u8 sRotatingGateTiles_4[] = INCBIN_U8("graphics/rotating_gates/4.4bpp"); - -static const struct OamData sOamData_RotatingGateLarge = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_NORMAL, - .objMode = 0, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 2, - .paletteNum = 5, - .affineParam = 0, -}; - -static const struct OamData sOamData_RotatingGateRegular = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_NORMAL, - .objMode = 0, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 2, - .paletteNum = 5, - .affineParam = 0, -}; - -static const struct SpriteSheet sRotatingGatesGraphicsTable[] = -{ - {sRotatingGateTiles_0, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L1}, - {sRotatingGateTiles_1, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L2}, - {sRotatingGateTiles_2, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L3}, - {sRotatingGateTiles_3, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L4}, - {sRotatingGateTiles_4, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T1}, - {sRotatingGateTiles_5, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T2}, - {sRotatingGateTiles_6, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T3}, - {sRotatingGateTiles_7, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T4}, - {NULL}, -}; - -static const union AnimCmd sSpriteAnim_RotatingGateLarge[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_RotatingGateRegular[] = -{ - ANIMCMD_FRAME(0, 0), ANIMCMD_END, -}; - -static const union AnimCmd *const sSpriteAnimTable_RotatingGateLarge[] = -{ - sSpriteAnim_RotatingGateLarge, -}; - -static const union AnimCmd *const sSpriteAnimTable_RotatingGateRegular[] = -{ - sSpriteAnim_RotatingGateRegular, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_Rotated0[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sSpriteAffineAnim_Rotated90[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sSpriteAffineAnim_Rotated180[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sSpriteAffineAnim_Rotated270[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_JUMP(0), -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90Faster[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180Faster[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270Faster[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360Faster[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270Faster[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180Faster[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90Faster[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0Faster[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_RotatingGate[] = -{ - sSpriteAffineAnim_Rotated0, - sSpriteAffineAnim_Rotated90, - sSpriteAffineAnim_Rotated180, - sSpriteAffineAnim_Rotated270, - sSpriteAffineAnim_RotatingAnticlockwise360to270, - sSpriteAffineAnim_RotatingAnticlockwise90to0, - sSpriteAffineAnim_RotatingAnticlockwise180to90, - sSpriteAffineAnim_RotatingAnticlockwise270to180, - sSpriteAffineAnim_RotatingClockwise0to90, - sSpriteAffineAnim_RotatingClockwise90to180, - sSpriteAffineAnim_RotatingClockwise180to270, - sSpriteAffineAnim_RotatingClockwise270to360, - sSpriteAffineAnim_RotatingAnticlockwise360to270Faster, - sSpriteAffineAnim_RotatingAnticlockwise90to0Faster, - sSpriteAffineAnim_RotatingAnticlockwise180to90Faster, - sSpriteAffineAnim_RotatingAnticlockwise270to180Faster, - sSpriteAffineAnim_RotatingClockwise0to90Faster, - sSpriteAffineAnim_RotatingClockwise90to180Faster, - sSpriteAffineAnim_RotatingClockwise180to270Faster, - sSpriteAffineAnim_RotatingClockwise270to360Faster, -}; - -static const struct SpriteTemplate sSpriteTemplate_RotatingGateLarge = -{ - .tileTag = ROTATING_GATE_TILE_TAG, - .paletteTag = 0xFFFF, - .oam = &sOamData_RotatingGateLarge, - .anims = sSpriteAnimTable_RotatingGateLarge, - .images = NULL, - .affineAnims = sSpriteAffineAnimTable_RotatingGate, - .callback = SpriteCallback_RotatingGate, -}; - -static const struct SpriteTemplate sSpriteTemplate_RotatingGateRegular = -{ - .tileTag = ROTATING_GATE_TILE_TAG, - .paletteTag = 0xFFFF, - .oam = &sOamData_RotatingGateRegular, - .anims = sSpriteAnimTable_RotatingGateRegular, - .images = NULL, - .affineAnims = sSpriteAffineAnimTable_RotatingGate, - .callback = SpriteCallback_RotatingGate, -}; - -// These structures describe what happens to the gate if you hit it at -// a given coordinate in a 4x4 grid when walking in the specified -// direction. Either the gate does not rotate, or it rotates in the -// given direction. This information is compared against the gate -// "arm" layout to see if there is an arm at the position in order to -// produce the final rotation. -static const u8 sRotatingGate_RotationInfoNorth[4 * 4] = -{ - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, - GATE_ROT_CW(GATE_ARM_WEST, 1), GATE_ROT_CW(GATE_ARM_WEST, 0), GATE_ROT_ACW(GATE_ARM_EAST, 0), GATE_ROT_ACW(GATE_ARM_EAST, 1), - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, -}; - -static const u8 sRotatingGate_RotationInfoSouth[4 * 4] = -{ - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, - GATE_ROT_ACW(GATE_ARM_WEST, 1), GATE_ROT_ACW(GATE_ARM_WEST, 0), GATE_ROT_CW(GATE_ARM_EAST, 0), GATE_ROT_CW(GATE_ARM_EAST, 1), - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, -}; - -static const u8 sRotatingGate_RotationInfoWest[4 * 4] = -{ - GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_NORTH, 1), GATE_ROT_NONE, GATE_ROT_NONE, - GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_NORTH, 0), GATE_ROT_NONE, GATE_ROT_NONE, - GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_SOUTH, 0), GATE_ROT_NONE, GATE_ROT_NONE, - GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_SOUTH, 1), GATE_ROT_NONE, GATE_ROT_NONE, -}; - -static const u8 sRotatingGate_RotationInfoEast[4 * 4] = -{ - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_NORTH, 1), GATE_ROT_NONE, - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_NORTH, 0), GATE_ROT_NONE, - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_SOUTH, 0), GATE_ROT_NONE, - GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_SOUTH, 1), GATE_ROT_NONE, -}; - -// These tables describe the relative coordinate positions the arms -// must move through in order to be rotated. -static const struct Coords8 sRotatingGate_ArmPositionsClockwiseRotation[] = { - { 0, -1 }, { 1, -2 }, { 0, 0 }, { 1, 0 }, { -1, 0 }, { -1, 1 }, { -1, -1 }, { -2, -1 }, -}; - -static const struct Coords8 sRotatingGate_ArmPositionsAntiClockwiseRotation[] = { - { -1, -1 }, { -1, -2 }, { 0, -1 }, { 1, -1 }, { 0, 0 }, { 0, 1 }, { -1, 0 }, { -2, 0 }, -}; - -// Describes where the gates "arms" are in the order north, east, south, west. -// These are adjusted using the current orientation to perform collision checking -static const u8 sRotatingGate_ArmLayout[][4 * 2] = -{ - // L-shape gates - { - 1, 0, - 1, 0, - 0, 0, - 0, 0, - }, - { - 1, 1, - 1, 0, - 0, 0, - 0, 0, - }, - { - 1, 0, - 1, 1, - 0, 0, - 0, 0, - }, - { - 1, 1, - 1, 1, - 0, 0, - 0, 0, - }, - - // T-shape gates - { - 1, 0, - 1, 0, - 1, 0, - 0, 0, - }, - { - 1, 1, - 1, 0, - 1, 0, - 0, 0, - }, - { - 1, 0, - 1, 1, - 1, 0, - 0, 0, - }, - { - 1, 0, - 1, 0, - 1, 1, - 0, 0, - }, - - // Unused T-shape gates - // These have 2-3 long arms and cannot actually be used anywhere - // since configuration for them is missing from the other tables. - { - 1, 1, - 1, 1, - 1, 0, - 0, 0, - }, - { - 1, 1, - 1, 0, - 1, 1, - 0, 0, - }, - { - 1, 0, - 1, 1, - 1, 1, - 0, 0, - }, - { - 1, 1, - 1, 1, - 1, 1, - 0, 0, - }, -}; - -static EWRAM_DATA u8 gRotatingGate_GateSpriteIds[ROTATING_GATE_PUZZLE_MAX] = {0}; -static EWRAM_DATA const struct RotatingGatePuzzle *gRotatingGate_PuzzleConfig = NULL; -static EWRAM_DATA u8 gRotatingGate_PuzzleCount = 0; - -static int GetCurrentMapRotatingGatePuzzleType(void) -{ - if (gSaveBlock1.location.mapGroup == MAP_GROUP(FORTREE_CITY_GYM) && - gSaveBlock1.location.mapNum == MAP_NUM(FORTREE_CITY_GYM)) - { - return PUZZLE_FORTREE_CITY_GYM; - } - - if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE110_TRICK_HOUSE_PUZZLE6) && - gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_TRICK_HOUSE_PUZZLE6)) - { - return PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6; - } - - return PUZZLE_NONE; -} - -static void RotatingGate_ResetAllGateOrientations(void) -{ - int i; - u8 *ptr; - - ptr = (u8 *)GetVarPointer(0x4000); - - for (i = 0; i < gRotatingGate_PuzzleCount; i++) - { - ptr[i] = gRotatingGate_PuzzleConfig[i].orientation; - } -} - -static int RotatingGate_GetGateOrientation(u8 gateId) -{ - return ((u8 *)GetVarPointer(0x4000))[gateId]; -} - -static void RotatingGate_SetGateOrientation(u8 gateId, u8 orientation) -{ - ((u8 *)GetVarPointer(0x4000))[gateId] = orientation; -} - -static void RotatingGate_RotateInDirection(u8 gateId, u32 rotationDirection) -{ - u8 orientation = RotatingGate_GetGateOrientation(gateId); - - if (rotationDirection == ROTATE_ANTICLOCKWISE) - { - if (orientation) - { - orientation--; - } - else - { - orientation = GATE_ORIENTATION_270; - } - } - else - { - orientation = ++orientation % GATE_ORIENTATION_MAX; - } - - RotatingGate_SetGateOrientation(gateId, orientation); -} - -static void RotatingGate_LoadPuzzleConfig(void) -{ - int puzzleType = GetCurrentMapRotatingGatePuzzleType(); - u32 i; - - switch (puzzleType) - { - case PUZZLE_FORTREE_CITY_GYM: - gRotatingGate_PuzzleConfig = sRotatingGate_FortreePuzzleConfig; - gRotatingGate_PuzzleCount = - sizeof(sRotatingGate_FortreePuzzleConfig) / sizeof(struct RotatingGatePuzzle); - break; - case PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6: - gRotatingGate_PuzzleConfig = sRotatingGate_TrickHousePuzzleConfig; - gRotatingGate_PuzzleCount = - sizeof(sRotatingGate_TrickHousePuzzleConfig) / sizeof(struct RotatingGatePuzzle); - break; - case PUZZLE_NONE: - default: - return; - } - - for (i = 0; i < ROTATING_GATE_PUZZLE_MAX; i++) - { - gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; - } -} - -static void RotatingGate_CreateGatesWithinViewport(s16 deltaX, s16 deltaY) -{ - u8 i; - - // Calculate the bounding box of the camera - // Same as RotatingGate_DestroyGatesOutsideViewport - s16 x = gSaveBlock1.pos.x - 2; - s16 x2 = gSaveBlock1.pos.x + 0x11; - s16 y = gSaveBlock1.pos.y - 2; - s16 y2 = gSaveBlock1.pos.y + 0xe; - - s16 x3, y3; - - for (i = 0; i < gRotatingGate_PuzzleCount; i++) - { - x3 = gRotatingGate_PuzzleConfig[i].x + 7; - y3 = gRotatingGate_PuzzleConfig[i].y + 7; - - if (y <= y3 && y2 >= y3 && x <= x3 && x2 >= x3 && - gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) - { - gRotatingGate_GateSpriteIds[i] = RotatingGate_CreateGate(i, deltaX, deltaY); - } - } -} - -static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) -{ - struct Sprite *sprite; - struct SpriteTemplate template; - const struct RotatingGatePuzzle *gate; - u8 spriteId; - s16 x, y; - - gate = &gRotatingGate_PuzzleConfig[gateId]; - - if (gate->shape == GATE_SHAPE_L1 || gate->shape == GATE_SHAPE_T1) - template = sSpriteTemplate_RotatingGateRegular; - else - template = sSpriteTemplate_RotatingGateLarge; - - template.tileTag = gate->shape + ROTATING_GATE_TILE_TAG; - - spriteId = CreateSprite(&template, 0, 0, 0x94); - if (spriteId == MAX_SPRITES) - return MAX_SPRITES; - - x = gate->x + 7; - y = gate->y + 7; - - sprite = &gSprites[spriteId]; - sprite->data[0] = gateId; - sprite->coordOffsetEnabled = 1; - - sub_8060388(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y); - RotatingGate_HideGatesOutsideViewport(sprite); - StartSpriteAffineAnim(sprite, RotatingGate_GetGateOrientation(gateId)); - - return spriteId; -} - -static void SpriteCallback_RotatingGate(struct Sprite *sprite) -{ - u8 rotationDirection; - u8 orientation; - u8 affineAnimation; - - rotationDirection = sprite->data[1]; - orientation = sprite->data[2]; - - RotatingGate_HideGatesOutsideViewport(sprite); - - if (rotationDirection == ROTATE_ANTICLOCKWISE) - { - affineAnimation = orientation + 4; - - if (GetPlayerSpeed() != 1) - affineAnimation += 8; - - PlaySE(SE_HI_TURUN); - StartSpriteAffineAnim(sprite, affineAnimation); - } - else if (rotationDirection == ROTATE_CLOCKWISE) - { - affineAnimation = orientation + 8; - - if (GetPlayerSpeed() != 1) - affineAnimation += 8; - - PlaySE(SE_HI_TURUN); - StartSpriteAffineAnim(sprite, affineAnimation); - } - - sprite->data[1] = ROTATE_NONE; -} - -static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite) -{ - u16 x; - s16 x2; - u16 y; - s16 y2; - - sprite->invisible = FALSE; - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - - x2 = x + 0x40; // Dimensions of the rotating gate - y2 = y + 0x40; - - if ((s16)x > DISPLAY_WIDTH + 0x10 - 1 || x2 < -0x10) - { - sprite->invisible = TRUE; - } - - if ((s16)y > DISPLAY_HEIGHT + 0x10 - 1 || y2 < -0x10) - { - sprite->invisible = TRUE; - } -} - -static void LoadRotatingGatePics(void) -{ - LoadSpriteSheets(sRotatingGatesGraphicsTable); -} - -static void RotatingGate_DestroyGatesOutsideViewport(void) -{ - s16 x; - s16 x2; - s16 y; - s16 y2; - s16 xGate; - s16 yGate; - int i; - struct Sprite *sprite; - - // Same as RotatingGate_CreateGatesWithinViewport - x = gSaveBlock1.pos.x - 2; - x2 = gSaveBlock1.pos.x + 0x11; - y = gSaveBlock1.pos.y - 2; - y2 = gSaveBlock1.pos.y + 0xe; - - for (i = 0; i < gRotatingGate_PuzzleCount; i++) - { - xGate = gRotatingGate_PuzzleConfig[i].x + 7; - yGate = gRotatingGate_PuzzleConfig[i].y + 7; - - if (gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) - continue; - - if (xGate < x || xGate > x2 || yGate < y || yGate > y2) - { - sprite = &gSprites[gRotatingGate_GateSpriteIds[i]]; - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); - gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; - } - } -} - -#ifdef NONMATCHING -static int RotatingGate_CanRotate(u8 gateId, int rotationDirection) -{ - const struct Coords8 *armPos; - u8 orientation; - s16 x; - s16 y; - int shape; - int i; - int j; - int armOrientation; - const u8 *gateArmCollisionData; - u8 armIndex; - - if (rotationDirection == ROTATE_ANTICLOCKWISE) - armPos = sRotatingGate_ArmPositionsAntiClockwiseRotation; - else if (rotationDirection == ROTATE_CLOCKWISE) - armPos = sRotatingGate_ArmPositionsClockwiseRotation; - else - return 0; - - orientation = RotatingGate_GetGateOrientation(gateId); - - shape = gRotatingGate_PuzzleConfig[gateId].shape; - x = gRotatingGate_PuzzleConfig[gateId].x + 7; - y = gRotatingGate_PuzzleConfig[gateId].y + 7; - - // Loop through the gate's "arms" clockwise (north, south, east, west) - for (i = GATE_ARM_NORTH; i <= GATE_ARM_WEST; i++) - { - armOrientation = orientation + i; - gateArmCollisionData = sRotatingGate_ArmLayout[shape][i]; - - // Ensure that no part of the arm collides with the map - for (j = 0; j < GATE_ARM_MAX_LENGTH; j++) - { - armIndex = 2 * (armOrientation % 4) + j; - - if (*gateArmCollisionData) - { - if (MapGridIsImpassableAt( - armPos[armIndex].deltaX + x, armPos[armIndex].deltaY + y) == 1) - return 0; - } - gateArmCollisionData++; - } - } - - return 1; -} -#else -__attribute__((naked)) -static int RotatingGate_CanRotate(u8 a, int puzzleType) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r1, 0x1\n\ - bne _080C7EAC\n\ - ldr r0, _080C7EA8 @ =sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ - mov r10, r0\n\ - b _080C7EB8\n\ - .align 2, 0\n\ -_080C7EA8: .4byte sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ -_080C7EAC:\n\ - cmp r1, 0x2\n\ - beq _080C7EB4\n\ -_080C7EB0:\n\ - movs r0, 0\n\ - b _080C7F48\n\ -_080C7EB4:\n\ - ldr r1, _080C7F58 @ =sRotatingGate_ArmPositionsClockwiseRotation\n\ - mov r10, r1\n\ -_080C7EB8:\n\ - adds r0, r4, 0\n\ - bl RotatingGate_GetGateOrientation\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp]\n\ - ldr r0, _080C7F5C @ =gRotatingGate_PuzzleConfig\n\ - ldr r1, [r0]\n\ - lsls r0, r4, 3\n\ - adds r0, r1\n\ - ldrb r2, [r0, 0x4]\n\ - ldrh r1, [r0]\n\ - adds r1, 0x7\n\ - ldrh r0, [r0, 0x2]\n\ - adds r0, 0x7\n\ - movs r3, 0\n\ - lsls r2, 3\n\ - str r2, [sp, 0x4]\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - mov r9, r1\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - mov r8, r0\n\ -_080C7EE8:\n\ - movs r6, 0\n\ - ldr r2, [sp]\n\ - adds r7, r2, r3\n\ - lsls r0, r3, 1\n\ - adds r5, r7, 0\n\ - ldr r1, [sp, 0x4]\n\ - adds r0, r1\n\ - ldr r2, _080C7F60 @ =sRotatingGate_ArmLayout\n\ - adds r4, r0, r2\n\ -_080C7EFA:\n\ - adds r0, r5, 0\n\ - cmp r5, 0\n\ - bge _080C7F02\n\ - adds r0, r7, 0x3\n\ -_080C7F02:\n\ - asrs r0, 2\n\ - lsls r0, 2\n\ - subs r0, r5, r0\n\ - lsls r0, 1\n\ - adds r0, r6\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - beq _080C7F38\n\ - lsls r1, 2\n\ - add r1, r10\n\ - movs r0, 0\n\ - ldrsb r0, [r1, r0]\n\ - add r0, r9\n\ - ldrb r1, [r1, 0x1]\n\ - lsls r1, 24\n\ - asrs r1, 24\n\ - add r1, r8\n\ - str r3, [sp, 0x8]\n\ - bl MapGridIsImpassableAt\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldr r3, [sp, 0x8]\n\ - cmp r0, 0x1\n\ - beq _080C7EB0\n\ -_080C7F38:\n\ - adds r4, 0x1\n\ - adds r6, 0x1\n\ - cmp r6, 0x1\n\ - ble _080C7EFA\n\ - adds r3, 0x1\n\ - cmp r3, 0x3\n\ - ble _080C7EE8\n\ - movs r0, 0x1\n\ -_080C7F48:\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080C7F58: .4byte sRotatingGate_ArmPositionsClockwiseRotation\n\ -_080C7F5C: .4byte gRotatingGate_PuzzleConfig\n\ -_080C7F60: .4byte sRotatingGate_ArmLayout\n\ -.syntax divided\n"); -} -#endif - -static int RotatingGate_HasArm(u8 gateId, u8 armInfo) -{ - int isLongArm; - s8 armOrientation; - int arm; - int shape; - - arm = armInfo >> 1; - isLongArm = armInfo & 1; - - armOrientation = (arm - RotatingGate_GetGateOrientation(gateId) + 4) % 4; - shape = gRotatingGate_PuzzleConfig[gateId].shape; - return sRotatingGate_ArmLayout[shape][armOrientation * 2 + isLongArm]; -} - -static void RotatingGate_TriggerRotationAnimation(u8 gateId, int rotationDirection) -{ - struct Sprite *sprite; - - if (gRotatingGate_GateSpriteIds[gateId] != MAX_SPRITES) - { - sprite = &gSprites[gRotatingGate_GateSpriteIds[gateId]]; - sprite->data[1] = rotationDirection; - sprite->data[2] = RotatingGate_GetGateOrientation(gateId); - } -} - -static u8 RotatingGate_GetRotationInfo(u8 direction, s16 x, s16 y) -{ - register const u8 *ptr; - - if (direction == DIR_NORTH) - ptr = sRotatingGate_RotationInfoNorth; - else if (direction == DIR_SOUTH) - ptr = sRotatingGate_RotationInfoSouth; - else if (direction == DIR_WEST) - ptr = sRotatingGate_RotationInfoWest; - else if (direction == DIR_EAST) - ptr = sRotatingGate_RotationInfoEast; - else - return GATE_ROT_NONE; - - return ptr[y * 4 + x]; -} - -void RotatingGate_InitPuzzle(void) -{ - if (GetCurrentMapRotatingGatePuzzleType()) - { - RotatingGate_LoadPuzzleConfig(); - RotatingGate_ResetAllGateOrientations(); - } -} - -void RotatingGatePuzzleCameraUpdate(u16 deltaX, u16 deltaY) -{ - if (GetCurrentMapRotatingGatePuzzleType()) - { - RotatingGate_CreateGatesWithinViewport(deltaX, deltaY); - RotatingGate_DestroyGatesOutsideViewport(); - } -} - -void RotatingGate_InitPuzzleAndGraphics(void) -{ - if (GetCurrentMapRotatingGatePuzzleType()) - { - LoadRotatingGatePics(); - RotatingGate_LoadPuzzleConfig(); - RotatingGate_CreateGatesWithinViewport(0, 0); - } -} - -bool8 CheckForRotatingGatePuzzleCollision(u8 direction, s16 x, s16 y) -{ - int i; - - if (!GetCurrentMapRotatingGatePuzzleType()) - return FALSE; - for (i = 0; i < gRotatingGate_PuzzleCount; i++) - { - s16 gateX = gRotatingGate_PuzzleConfig[i].x + 7; - s16 gateY = gRotatingGate_PuzzleConfig[i].y + 7; - - if (gateX - 2 <= x && x <= gateX + 1 && gateY - 2 <= y && y <= gateY + 1) - { - s16 centerX = x - gateX + 2; - s16 centerY = y - gateY + 2; - u8 rotationInfo = RotatingGate_GetRotationInfo(direction, centerX, centerY); - - if (rotationInfo != GATE_ROT_NONE) - { - u8 rotationDirection = ((rotationInfo & 0xF0) >> 4); - u8 armInfo = rotationInfo & 0xF; - - if (RotatingGate_HasArm(i, armInfo)) - { - if (RotatingGate_CanRotate(i, rotationDirection)) - { - RotatingGate_TriggerRotationAnimation(i, rotationDirection); - RotatingGate_RotateInDirection(i, rotationDirection); - return FALSE; - } - return TRUE; - } - } - } - } - return FALSE; -} diff --git a/src/field/safari_zone.c b/src/field/safari_zone.c deleted file mode 100644 index f371b08b3..000000000 --- a/src/field/safari_zone.c +++ /dev/null @@ -1,253 +0,0 @@ -#include "global.h" -#include "safari_zone.h" -#include "event_data.h" -#include "field_fadetransition.h" -#include "field_player_avatar.h" -#include "main.h" -#include "overworld.h" -#include "script.h" -#include "string_util.h" -#include "text.h" - -struct PokeblockFeeder -{ - /*0x00*/ s16 x; - /*0x02*/ s16 y; - /*0x04*/ s8 mapNum; - /*0x05*/ u8 stepCounter; - /*0x08*/ struct Pokeblock pokeblock; -}; - -#define NUM_POKEBLOCK_FEEDERS 10 - -static void ClearAllPokeblockFeeders(void); -static void DecrementFeederStepCounters(void); - -extern u8 gBattleOutcome; - -EWRAM_DATA u8 gNumSafariBalls = 0; -EWRAM_DATA u16 gSafariZoneStepCounter = 0; -EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0}; - -extern void (*gFieldCallback)(void); - -extern u8 gUnknown_081C340A; -extern u8 gUnknown_081C342D; -extern u8 gUnknown_081C3448; -extern u8 gUnknown_081C3459; -extern u8 *gPokeblockNames[]; - -extern u16 gSpecialVar_Result; - -bool32 GetSafariZoneFlag(void) -{ - return FlagGet(FLAG_SYS_SAFARI_MODE); -} - -void SetSafariZoneFlag(void) -{ - FlagSet(FLAG_SYS_SAFARI_MODE); -} - -void ResetSafariZoneFlag(void) -{ - FlagClear(FLAG_SYS_SAFARI_MODE); -} - -void EnterSafariMode(void) -{ - IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE); - SetSafariZoneFlag(); - ClearAllPokeblockFeeders(); - gNumSafariBalls = 30; - gSafariZoneStepCounter = 500; -} - -void ExitSafariMode(void) -{ - ResetSafariZoneFlag(); - ClearAllPokeblockFeeders(); - gNumSafariBalls = 0; - gSafariZoneStepCounter = 0; -} - -bool8 SafariZoneTakeStep(void) -{ - if (GetSafariZoneFlag() == FALSE) - { - return FALSE; - } - - DecrementFeederStepCounters(); - gSafariZoneStepCounter--; - if (gSafariZoneStepCounter == 0) - { - ScriptContext1_SetupScript(&gUnknown_081C3448); - return TRUE; - } - return FALSE; -} - -void SafariZoneRetirePrompt(void) -{ - ScriptContext1_SetupScript(&gUnknown_081C342D); -} - -void sub_80C824C(void) -{ - if (gNumSafariBalls != 0) - { - SetMainCallback2(c2_exit_to_overworld_2_switch); - } - else if (gBattleOutcome == 8) - { - ScriptContext2_RunNewScript(&gUnknown_081C340A); - warp_in(); - gFieldCallback = sub_8080E44; - SetMainCallback2(CB2_LoadMap); - } - else if (gBattleOutcome == 7) - { - ScriptContext1_SetupScript(&gUnknown_081C3459); - ScriptContext1_Stop(); - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - } -} - -static void ClearPokeblockFeeder(u8 index) -{ - memset(&gPokeblockFeeders[index], 0, sizeof(struct PokeblockFeeder)); -} - -static void ClearAllPokeblockFeeders(void) -{ - memset(gPokeblockFeeders, 0, sizeof(gPokeblockFeeders)); -} - -void SafariZoneGetPokeblockNameInFeeder(void) -{ - s16 x, y; - u16 i; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - - for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) - { - if (gSaveBlock1.location.mapNum == gPokeblockFeeders[i].mapNum - && gPokeblockFeeders[i].x == x - && gPokeblockFeeders[i].y == y) - { - gSpecialVar_Result = i; - StringCopy(gStringVar1, gPokeblockNames[gPokeblockFeeders[i].pokeblock.color]); - return; - } - } - - gSpecialVar_Result = -1; -} - -static void GetPokeblockFeederWithinRange(void) -{ - s16 x, y; - u16 i; - - PlayerGetDestCoords(&x, &y); - - for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) - { - if (gSaveBlock1.location.mapNum == gPokeblockFeeders[i].mapNum) - { - //Get absolute value of x and y distance from Pokeblock feeder on current map - x -= gPokeblockFeeders[i].x; - y -= gPokeblockFeeders[i].y; - if (x < 0) - x *= -1; - if (y < 0) - y *= -1; - if ((x + y) <= 5) - { - gSpecialVar_Result = i; - return; - } - } - } - - gSpecialVar_Result = -1; -} - -struct Pokeblock *unref_sub_80C8418(void) -{ - SafariZoneGetPokeblockNameInFeeder(); - - if (gSpecialVar_Result == 0xFFFF) - return NULL; - else - return &gPokeblockFeeders[gSpecialVar_Result].pokeblock; -} - - -struct Pokeblock *SafariZoneGetActivePokeblock(void) -{ - GetPokeblockFeederWithinRange(); - - if (gSpecialVar_Result == 0xFFFF) - return NULL; - else - return &gPokeblockFeeders[gSpecialVar_Result].pokeblock; -} - - -void SafariZoneActivatePokeblockFeeder(u8 pokeblock_index) -{ - s16 x, y; - u8 i; - - for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) - { - //Find free entry in gPokeblockFeeders - if (gPokeblockFeeders[i].mapNum == 0 - && gPokeblockFeeders[i].x == 0 - && gPokeblockFeeders[i].y == 0) - { - //Initialize Pokeblock feeder - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - gPokeblockFeeders[i].mapNum = gSaveBlock1.location.mapNum; - gPokeblockFeeders[i].pokeblock = gSaveBlock1.pokeblocks[pokeblock_index]; - gPokeblockFeeders[i].stepCounter = 100; - gPokeblockFeeders[i].x = x; - gPokeblockFeeders[i].y = y; - break; - } - } -} - -static void DecrementFeederStepCounters(void) -{ - u8 i; - - for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) - { - if (gPokeblockFeeders[i].stepCounter != 0) - { - gPokeblockFeeders[i].stepCounter--; - if (gPokeblockFeeders[i].stepCounter == 0) - ClearPokeblockFeeder(i); - } - } -} - -bool8 unref_sub_80C853C(void) -{ - SafariZoneGetPokeblockNameInFeeder(); - - if (gSpecialVar_Result == 0xFFFF) - { - return FALSE; - } - - ConvertIntToDecimalStringN(gStringVar2, - gPokeblockFeeders[gSpecialVar_Result].stepCounter, - STR_CONV_MODE_LEADING_ZEROS, 3); - - return TRUE; -} diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c deleted file mode 100644 index e5272bc9c..000000000 --- a/src/field/scrcmd.c +++ /dev/null @@ -1,2019 +0,0 @@ -#include "global.h" -#include "battle_setup.h" -#include "berry.h" -#include "clock.h" -#include "coins.h" -#include "contest_link_80C2020.h" -#include "contest_painting.h" -#include "data2.h" -#include "decoration.h" -#include "decoration_inventory.h" -#include "event_data.h" -#include "field_door.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "event_object_movement.h" -#include "field_message_box.h" -#include "field_player_avatar.h" -#include "field_screen_effect.h" -#include "field_specials.h" -#include "field_tasks.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "item.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "money.h" -#include "mystery_event_script.h" -#include "palette.h" -#include "party_menu.h" -#include "pokemon.h" -#include "random.h" -#include "overworld.h" -#include "rtc.h" -#include "script.h" -#include "script_menu.h" -#include "script_movement.h" -#include "script_pokemon_80C4.h" -#include "script_pokemon_80F9.h" -#include "shop.h" -#include "slot_machine.h" -#include "sound.h" -#include "string_util.h" -#include "tv.h" - -typedef u16 (*SpecialFunc)(void); -typedef void (*NativeFunc)(void); - -extern u32 gUnknown_0202E8AC; - -static EWRAM_DATA u32 gUnknown_0202E8B0 = 0; -static EWRAM_DATA u16 sPauseCounter = 0; -static EWRAM_DATA u16 sMovingNpcId = 0; -static EWRAM_DATA u16 sMovingNpcMapBank = 0; -static EWRAM_DATA u16 sMovingNpcMapId = 0; -static EWRAM_DATA u16 sFieldEffectScriptId = 0; - -extern u16 gSpecialVar_0x8000; -extern u16 gSpecialVar_0x8001; -extern u16 gSpecialVar_0x8002; -extern u16 gSpecialVar_0x8004; - -extern u16 gSpecialVar_Result; - -extern u16 gSpecialVar_ContestCategory; - -extern SpecialFunc gSpecials[]; -extern u8 *gStdScripts[]; -extern u8 *gStdScripts_End[]; - -// This is defined in here so the optimizer can't see its value when compiling -// script.c. -void * const gNullScriptPtr = NULL; - -static const u8 sScriptConditionTable[6][3] = -{ -// < = > - 1, 0, 0, // < - 0, 1, 0, // = - 0, 0, 1, // > - 1, 1, 0, // <= - 0, 1, 1, // >= - 1, 0, 1, // != -}; - -static u8 * const sScriptStringVars[] = -{ - gStringVar1, - gStringVar2, - gStringVar3, -}; - -bool8 ScrCmd_nop(struct ScriptContext *ctx) -{ - return FALSE; -} - -bool8 ScrCmd_nop1(struct ScriptContext *ctx) -{ - return FALSE; -} - -bool8 ScrCmd_end(struct ScriptContext *ctx) -{ - StopScript(ctx); - return FALSE; -} - -bool8 ScrCmd_gotonative(struct ScriptContext *ctx) -{ - bool8 (*addr)(void) = (bool8 (*)(void))ScriptReadWord(ctx); - - SetupNativeScript(ctx, addr); - return TRUE; -} - -bool8 ScrCmd_special(struct ScriptContext *ctx) -{ - u16 index = ScriptReadHalfword(ctx); - - gSpecials[index](); - return FALSE; -} - -bool8 ScrCmd_specialvar(struct ScriptContext *ctx) -{ - u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); - - *var = gSpecials[ScriptReadHalfword(ctx)](); - return FALSE; -} - -bool8 ScrCmd_callnative(struct ScriptContext *ctx) -{ - NativeFunc func = (NativeFunc)ScriptReadWord(ctx); - - func(); - return FALSE; -} - -bool8 ScrCmd_waitstate(struct ScriptContext *ctx) -{ - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_goto(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)ScriptReadWord(ctx); - - ScriptJump(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_return(struct ScriptContext *ctx) -{ - ScriptReturn(ctx); - return FALSE; -} - -bool8 ScrCmd_call(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)ScriptReadWord(ctx); - - ScriptCall(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_goto_if(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 *ptr = (u8 *)ScriptReadWord(ctx); - - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - ScriptJump(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_call_if(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 *ptr = (u8 *)ScriptReadWord(ctx); - - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - ScriptCall(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) -{ - u32 addr1 = (u32)ctx->scriptPtr - 1; - u32 addr2 = ScriptReadWord(ctx); - - gUnknown_0202E8B0 = addr2 - addr1; - return FALSE; -} - -bool8 ScrCmd_vgoto(struct ScriptContext *ctx) -{ - u32 addr = ScriptReadWord(ctx); - - ScriptJump(ctx, (u8 *)(addr - gUnknown_0202E8B0)); - return FALSE; -} - -bool8 ScrCmd_vcall(struct ScriptContext *ctx) -{ - u32 addr = ScriptReadWord(ctx); - - ScriptCall(ctx, (u8 *)(addr - gUnknown_0202E8B0)); - return FALSE; -} - -bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); - - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - ScriptJump(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_vcall_if(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); - - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - ScriptCall(ctx, ptr); - return FALSE; -} - -bool8 ScrCmd_gotostd(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - u8 **ptr = &gStdScripts[index]; - - if (ptr < gStdScripts_End) - ScriptJump(ctx, *ptr); - return FALSE; -} - -bool8 ScrCmd_callstd(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - u8 **ptr = &gStdScripts[index]; - - if (ptr < gStdScripts_End) - ScriptCall(ctx, *ptr); - return FALSE; -} - -bool8 ScrCmd_gotostd_if(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 index = ScriptReadByte(ctx); - - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - { - u8 **ptr = &gStdScripts[index]; - if (ptr < gStdScripts_End) - ScriptJump(ctx, *ptr); - } - return FALSE; -} - -bool8 ScrCmd_callstd_if(struct ScriptContext *ctx) -{ - u8 condition = ScriptReadByte(ctx); - u8 index = ScriptReadByte(ctx); - - if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) - { - u8 **ptr = &gStdScripts[index]; - if (ptr < gStdScripts_End) - ScriptCall(ctx, *ptr); - } - return FALSE; -} - -bool8 ScrCmd_gotoram(struct ScriptContext *ctx) -{ - ScriptJump(ctx, (u8 *)gUnknown_0202E8AC); - return FALSE; -} - -bool8 ScrCmd_killscript(struct ScriptContext *ctx) -{ - ClearRamScript(); - StopScript(ctx); - return TRUE; -} - -bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext *ctx) -{ - u8 value = ScriptReadByte(ctx); - - SetMysteryEventScriptStatus(value); - return FALSE; -} - -bool8 ScrCmd_loadword(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - - ctx->data[index] = ScriptReadWord(ctx); - return FALSE; -} - -bool8 ScrCmd_loadbytefromaddr(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - - ctx->data[index] = *(u8 *)ScriptReadWord(ctx); - return FALSE; -} - -bool8 ScrCmd_writebytetoaddr(struct ScriptContext *ctx) -{ - u8 value = ScriptReadByte(ctx); - - *(u8 *)ScriptReadWord(ctx) = value; - return FALSE; -} - -bool8 ScrCmd_loadbyte(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - - ctx->data[index] = ScriptReadByte(ctx); - return FALSE; -} - -bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx) -{ - u8 index = ScriptReadByte(ctx); - - *(u8 *)ScriptReadWord(ctx) = ctx->data[index]; - return FALSE; -} - -bool8 ScrCmd_copylocal(struct ScriptContext *ctx) -{ - u8 destIndex = ScriptReadByte(ctx); - u8 srcIndex = ScriptReadByte(ctx); - - ctx->data[destIndex] = ctx->data[srcIndex]; - return FALSE; -} - -bool8 ScrCmd_copybyte(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)ScriptReadWord(ctx); - *ptr = *(u8 *)ScriptReadWord(ctx); - return FALSE; -} - -bool8 ScrCmd_setvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr = ScriptReadHalfword(ctx); - return FALSE; -} - -bool8 ScrCmd_copyvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr = *GetVarPointer(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_setorcopyvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr = VarGet(ScriptReadHalfword(ctx)); - return FALSE; -} - -u8 compare_012(u16 a1, u16 a2) -{ - if (a1 < a2) - return 0; - if (a1 == a2) - return 1; - return 2; -} - -// comparelocaltolocal -bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx) -{ - u8 value1 = ctx->data[ScriptReadByte(ctx)]; - u8 value2 = ctx->data[ScriptReadByte(ctx)]; - - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -// comparelocaltoimm -bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx) -{ - u8 value1 = ctx->data[ScriptReadByte(ctx)]; - u8 value2 = ScriptReadByte(ctx); - - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compare_local_to_addr(struct ScriptContext *ctx) -{ - u8 value1 = ctx->data[ScriptReadByte(ctx)]; - u8 value2 = *(u8 *)ScriptReadWord(ctx); - - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx) -{ - u8 value1 = *(u8 *)ScriptReadWord(ctx); - u8 value2 = ctx->data[ScriptReadByte(ctx)]; - - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compare_addr_to_value(struct ScriptContext *ctx) -{ - u8 value1 = *(u8 *)ScriptReadWord(ctx); - u8 value2 = ScriptReadByte(ctx); - - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx) -{ - u8 value1 = *(u8 *)ScriptReadWord(ctx); - u8 value2 = *(u8 *)ScriptReadWord(ctx); - - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx) -{ - u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); - u16 value2 = ScriptReadHalfword(ctx); - - ctx->comparisonResult = compare_012(value1, value2); - return FALSE; -} - -bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx) -{ - u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); - u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); - - ctx->comparisonResult = compare_012(*ptr1, *ptr2); - return FALSE; -} - -bool8 ScrCmd_addvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr += ScriptReadHalfword(ctx); - return FALSE; -} - -bool8 ScrCmd_subvar(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr -= VarGet(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_random(struct ScriptContext *ctx) -{ - u16 max = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = Random() % max; - return FALSE; -} - -bool8 ScrCmd_giveitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u32 quantity = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = AddBagItem(itemId, (u8)quantity); - return FALSE; -} - -bool8 ScrCmd_takeitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u32 quantity = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = RemoveBagItem(itemId, (u8)quantity); - return FALSE; -} - -bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u32 quantity = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = CheckBagHasSpace(itemId, (u8)quantity); - return FALSE; -} - -bool8 ScrCmd_checkitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u32 quantity = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = CheckBagHasItem(itemId, (u8)quantity); - return FALSE; -} - -bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = GetPocketByItemId(itemId); - return FALSE; -} - -bool8 ScrCmd_givepcitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u16 quantity = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = AddPCItem(itemId, quantity); - return FALSE; -} - -bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) -{ - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - u16 quantity = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = CheckPCHasItem(itemId, quantity); - return FALSE; -} - -bool8 ScrCmd_givedecoration(struct ScriptContext *ctx) -{ - u32 decoration = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = IsThereStorageSpaceForDecoration(decoration); - return FALSE; -} - -bool8 ScrCmd_takedecoration(struct ScriptContext *ctx) -{ - u32 decoration = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = sub_81340A8(decoration); - return FALSE; -} - -bool8 ScrCmd_checkdecorspace(struct ScriptContext *ctx) -{ - u32 decorId = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = sub_8134074(decorId); - return FALSE; -} - -bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) -{ - u32 decorId = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = sub_8133FE4(decorId); - return FALSE; -} - -bool8 ScrCmd_setflag(struct ScriptContext *ctx) -{ - FlagSet(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_clearflag(struct ScriptContext *ctx) -{ - FlagClear(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_checkflag(struct ScriptContext *ctx) -{ - ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_incrementgamestat(struct ScriptContext *ctx) -{ - IncrementGameStat(ScriptReadByte(ctx)); - return FALSE; -} - -bool8 ScrCmd_animateflash(struct ScriptContext *ctx) -{ - sub_8081594(ScriptReadByte(ctx)); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_setflashradius(struct ScriptContext *ctx) -{ - u16 flashLevel = VarGet(ScriptReadHalfword(ctx)); - - Overworld_SetFlashLevel(flashLevel); - return FALSE; -} - -bool8 IsPaletteNotActive(void) -{ - if (!gPaletteFade.active) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) -{ - FadeScreen(ScriptReadByte(ctx), 0); - SetupNativeScript(ctx, IsPaletteNotActive); - return TRUE; -} - -bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) -{ - u8 duration = ScriptReadByte(ctx); - u8 delay = ScriptReadByte(ctx); - - FadeScreen(duration, delay); - SetupNativeScript(ctx, IsPaletteNotActive); - return TRUE; -} - -bool8 RunPauseTimer() -{ - sPauseCounter--; - - if (sPauseCounter == 0) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_delay(struct ScriptContext *ctx) -{ - sPauseCounter = ScriptReadHalfword(ctx); - SetupNativeScript(ctx, RunPauseTimer); - return TRUE; -} - -bool8 ScrCmd_initclock(struct ScriptContext *ctx) -{ - u8 hour = VarGet(ScriptReadHalfword(ctx)); - u8 minute = VarGet(ScriptReadHalfword(ctx)); - - RtcInitLocalTimeOffset(hour, minute); - return FALSE; -} - -bool8 ScrCmd_dodailyevents(struct ScriptContext *ctx) -{ - DoTimeBasedEvents(); - return FALSE; -} - -bool8 ScrCmd_gettime(struct ScriptContext *ctx) -{ - RtcCalcLocalTime(); - gSpecialVar_0x8000 = gLocalTime.hours; - gSpecialVar_0x8001 = gLocalTime.minutes; - gSpecialVar_0x8002 = gLocalTime.seconds; - return FALSE; -} - -bool8 ScrCmd_setweather(struct ScriptContext *ctx) -{ - u16 weather = VarGet(ScriptReadHalfword(ctx)); - - SetSav1Weather(weather); - return FALSE; -} - -bool8 ScrCmd_resetweather(struct ScriptContext *ctx) -{ - SetSav1WeatherFromCurrMapHeader(); - return FALSE; -} - -bool8 ScrCmd_doweather(struct ScriptContext *ctx) -{ - DoCurrentWeather(); - return FALSE; -} - -bool8 ScrCmd_setstepcallback(struct ScriptContext *ctx) -{ - ActivatePerStepCallback(ScriptReadByte(ctx)); - return FALSE; -} - -bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx) -{ - u16 value = VarGet(ScriptReadHalfword(ctx)); - - sub_8053D14(value); - return FALSE; -} - -bool8 ScrCmd_warp(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_8080E88(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warpsilent(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sp13E_warp_to_last_warp(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warpdoor(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_8080EF0(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warphole(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u16 x; - u16 y; - - PlayerGetDestCoords(&x, &y); - if (mapGroup == 0xFF && mapNum == 0xFF) - sub_8053720(x - 7, y - 7); - else - Overworld_SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7); - sp13F_fall_to_last_warp(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_8080F68(); - player_avatar_init_params_reset(); - return TRUE; -} - -bool8 ScrCmd_setwarp(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - return FALSE; -} - -bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - saved_warp2_set_2(0, mapGroup, mapNum, warpId, x, y); - return FALSE; -} - -bool8 ScrCmd_setdivewarp(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - sub_8053690(mapGroup, mapNum, warpId, x, y); - return FALSE; -} - -bool8 ScrCmd_setholewarp(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - sub_80536E4(mapGroup, mapNum, warpId, x, y); - return FALSE; -} - -bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx) -{ - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 warpId = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - sub_805363C(mapGroup, mapNum, warpId, x, y); - return FALSE; -} - -bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx) -{ - u16 *pX = GetVarPointer(ScriptReadHalfword(ctx)); - u16 *pY = GetVarPointer(ScriptReadHalfword(ctx)); - - *pX = gSaveBlock1.pos.x; - *pY = gSaveBlock1.pos.y; - return FALSE; -} - -bool8 ScrCmd_getpartysize(struct ScriptContext *ctx) -{ - gSpecialVar_Result = CalculatePlayerPartyCount(); - return FALSE; -} - -bool8 ScrCmd_playse(struct ScriptContext *ctx) -{ - PlaySE(ScriptReadHalfword(ctx)); - return FALSE; -} - -static bool8 WaitForSoundEffectFinish(void) -{ - if (!IsSEPlaying()) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_waitse(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, WaitForSoundEffectFinish); - return TRUE; -} - -bool8 ScrCmd_playfanfare(struct ScriptContext *ctx) -{ - PlayFanfare(ScriptReadHalfword(ctx)); - return FALSE; -} - -static bool8 WaitForFanfareFinish(void) -{ - return IsFanfareTaskInactive(); -} - -bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, WaitForFanfareFinish); - return TRUE; -} - -bool8 ScrCmd_playbgm(struct ScriptContext *ctx) -{ - u16 songId = ScriptReadHalfword(ctx); - bool8 val = ScriptReadByte(ctx); - - if (val == TRUE) - Overworld_SetSavedMusic(songId); - PlayNewMapMusic(songId); - return FALSE; -} - -bool8 ScrCmd_savebgm(struct ScriptContext *ctx) -{ - Overworld_SetSavedMusic(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_fadedefaultbgm(struct ScriptContext *ctx) -{ - Overworld_ChangeMusicToDefault(); - return FALSE; -} - -bool8 ScrCmd_fadenewbgm(struct ScriptContext *ctx) -{ - Overworld_ChangeMusicTo(ScriptReadHalfword(ctx)); - return FALSE; -} - -bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx) -{ - u8 speed = ScriptReadByte(ctx); - - if (speed != 0) - FadeOutBGMTemporarily(4 * speed); - else - FadeOutBGMTemporarily(4); - SetupNativeScript(ctx, IsBGMPausedOrStopped); - return TRUE; -} - -bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx) -{ - u8 speed = ScriptReadByte(ctx); - - if (speed != 0) - FadeInBGM(4 * speed); - else - FadeInBGM(4); - return FALSE; -} - -bool8 ScrCmd_applymovement(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - void *movementScript = (void *)ScriptReadWord(ctx); - - ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, movementScript); - sMovingNpcId = localId; - return FALSE; -} - -bool8 ScrCmd_applymovement_at(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - void *movementScript = (void *)ScriptReadWord(ctx); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - - ScriptMovement_StartObjectMovementScript(localId, mapNum, mapGroup, movementScript); - sMovingNpcId = localId; - return FALSE; -} - -static bool8 WaitForMovementFinish(void) -{ - return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapId, sMovingNpcMapBank); -} - -bool8 ScrCmd_waitmovement(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - - if (localId != 0) - sMovingNpcId = localId; - sMovingNpcMapBank = gSaveBlock1.location.mapGroup; - sMovingNpcMapId = gSaveBlock1.location.mapNum; - SetupNativeScript(ctx, WaitForMovementFinish); - return TRUE; -} - -bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u8 mapBank; - u8 mapId; - - if (localId != 0) - sMovingNpcId = localId; - mapBank = ScriptReadByte(ctx); - mapId = ScriptReadByte(ctx); - sMovingNpcMapBank = mapBank; - sMovingNpcMapId = mapId; - SetupNativeScript(ctx, WaitForMovementFinish); - return TRUE; -} - -bool8 ScrCmd_removeobject(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - - RemoveFieldObjectByLocalIdAndMap(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - return FALSE; -} - -bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx) -{ - u16 objectId = VarGet(ScriptReadHalfword(ctx)); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - - RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup); - return FALSE; -} - -bool8 ScrCmd_addobject(struct ScriptContext *ctx) -{ - u16 objectId = VarGet(ScriptReadHalfword(ctx)); - - show_sprite(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - return FALSE; -} - -bool8 ScrCmd_addobject_at(struct ScriptContext *ctx) -{ - u16 objectId = VarGet(ScriptReadHalfword(ctx)); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - - show_sprite(objectId, mapNum, mapGroup); - return FALSE; -} - -bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - sub_805C0F8(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); - return FALSE; -} - -bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - Overworld_SetMapObjTemplateCoords(localId, x, y); - return FALSE; -} - -bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - - sub_805C78C(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - return FALSE; -} - -bool8 ScrCmd_showobjectat(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - - npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 0); - return FALSE; -} - -bool8 ScrCmd_hideobjectat(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - - npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 1); - return FALSE; -} - -bool8 ScrCmd_setobjectpriority(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - u8 priority = ScriptReadByte(ctx); - - sub_805BCF0(localId, mapNum, mapGroup, priority + 83); - return FALSE; -} - -bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u8 mapGroup = ScriptReadByte(ctx); - u8 mapNum = ScriptReadByte(ctx); - - sub_805BD48(localId, mapNum, mapGroup); - return FALSE; -} - -bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) -{ - if (gMapObjects[gSelectedMapObject].active) - { - FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], - player_get_direction_lower_nybble()); - } - return FALSE; -} - -bool8 ScrCmd_turnobject(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u8 direction = ScriptReadByte(ctx); - - FieldObjectTurnByLocalIdAndMap(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, direction); - return FALSE; -} - -bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx) -{ - u16 localId = VarGet(ScriptReadHalfword(ctx)); - u8 movementType = ScriptReadByte(ctx); - - Overworld_SetMapObjTemplateMovementType(localId, movementType); - return FALSE; -} - -bool8 ScrCmd_createvobject(struct ScriptContext *ctx) -{ - u8 graphicsId = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u16 x = VarGet(ScriptReadHalfword(ctx)); - u32 y = VarGet(ScriptReadHalfword(ctx)); - u8 elevation = ScriptReadByte(ctx); - u8 direction = ScriptReadByte(ctx); - - sub_805B410(graphicsId, v2, x, y, elevation, direction); - return FALSE; -} - -bool8 ScrCmd_turnvobject(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - u8 direction = ScriptReadByte(ctx); - - sub_8064990(v1, direction); - return FALSE; -} - -bool8 ScrCmd_lockall(struct ScriptContext *ctx) -{ - if (is_c1_link_related_active()) - { - return FALSE; - } - else - { - ScriptFreezeMapObjects(); - SetupNativeScript(ctx, sub_8064CFC); - return TRUE; - } -} - -bool8 ScrCmd_lock(struct ScriptContext *ctx) -{ - if (is_c1_link_related_active()) - { - return FALSE; - } - else - { - if (gMapObjects[gSelectedMapObject].active) - { - LockSelectedMapObject(); - SetupNativeScript(ctx, sub_8064DB4); - } - else - { - ScriptFreezeMapObjects(); - SetupNativeScript(ctx, sub_8064CFC); - } - return TRUE; - } -} - -bool8 ScrCmd_releaseall(struct ScriptContext *ctx) -{ - u8 objectId; - - HideFieldMessageBox(); - objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); - sub_80A2178(); - UnfreezeMapObjects(); - return FALSE; -} - -bool8 ScrCmd_release(struct ScriptContext *ctx) -{ - u8 objectId; - - HideFieldMessageBox(); - if (gMapObjects[gSelectedMapObject].active) - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); - objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); - sub_80A2178(); - UnfreezeMapObjects(); - return FALSE; -} - -bool8 ScrCmd_message(struct ScriptContext *ctx) -{ - u8 *msg = (u8 *)ScriptReadWord(ctx); - - if (msg == NULL) - msg = (u8 *)ctx->data[0]; - ShowFieldMessage(msg); - return FALSE; -} - -bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx) -{ - u8 *msg = (u8 *)ScriptReadWord(ctx); - - if (msg == NULL) - msg = (u8 *)ctx->data[0]; - ShowFieldAutoScrollMessage(msg); - return FALSE; -} - -bool8 ScrCmd_waitmessage(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, IsFieldMessageBoxHidden); - return TRUE; -} - -bool8 ScrCmd_closemessage(struct ScriptContext *ctx) -{ - HideFieldMessageBox(); - return FALSE; -} - -static bool8 WaitForAorBPress(void) -{ - if (gMain.newKeys & A_BUTTON) - return TRUE; - if (gMain.newKeys & B_BUTTON) - return TRUE; - return FALSE; -} - -bool8 ScrCmd_waitbuttonpress(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, WaitForAorBPress); - return TRUE; -} - -bool8 ScrCmd_yesnobox(struct ScriptContext *ctx) -{ - u8 left = ScriptReadByte(ctx); - u8 top = ScriptReadByte(ctx); - - if (ScriptMenu_YesNo(left, top) == TRUE) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_multichoice(struct ScriptContext *ctx) -{ - u8 left = ScriptReadByte(ctx); - u8 top = ScriptReadByte(ctx); - u8 multichoiceId = ScriptReadByte(ctx); - u8 ignoreBPress = ScriptReadByte(ctx); - - if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx) -{ - u8 left = ScriptReadByte(ctx); - u8 top = ScriptReadByte(ctx); - u8 multichoiceId = ScriptReadByte(ctx); - u8 defaultChoice = ScriptReadByte(ctx); - u8 ignoreBPress = ScriptReadByte(ctx); - - if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_drawbox(struct ScriptContext *ctx) -{ - u8 left = ScriptReadByte(ctx); - u8 top = ScriptReadByte(ctx); - u8 right = ScriptReadByte(ctx); - u8 bottom = ScriptReadByte(ctx); - - Menu_DrawStdWindowFrame(left, top, right, bottom); - return FALSE; -} - -bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx) -{ - u8 left = ScriptReadByte(ctx); - u8 top = ScriptReadByte(ctx); - u8 multichoiceId = ScriptReadByte(ctx); - u8 numColumns = ScriptReadByte(ctx); - u8 ignoreBPress = ScriptReadByte(ctx); - - if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_erasebox(struct ScriptContext *ctx) -{ - u8 left = ScriptReadByte(ctx); - u8 top = ScriptReadByte(ctx); - u8 right = ScriptReadByte(ctx); - u8 bottom = ScriptReadByte(ctx); - - Menu_EraseWindowRect(left, top, right, bottom); - return FALSE; -} - -// unused -bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx) -{ - u8 left = ScriptReadByte(ctx); - u8 top = ScriptReadByte(ctx); - u8 multichoiceId = ScriptReadByte(ctx); - u8 ignoreBPress = ScriptReadByte(ctx); - - if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) - { - ScriptContext1_Stop(); - return TRUE; - } - else - { - return FALSE; - } -} - -bool8 ScrCmd_drawmonpic(struct ScriptContext *ctx) -{ - u16 species = VarGet(ScriptReadHalfword(ctx)); - u8 x = ScriptReadByte(ctx); - u8 y = ScriptReadByte(ctx); - - ScriptMenu_ShowPokemonPic(species, x, y); - return FALSE; -} - -bool8 ScrCmd_erasemonpic(struct ScriptContext *ctx) -{ - bool8 (*func)(void) = ScriptMenu_GetPicboxWaitFunc(); - - if (func == NULL) - return FALSE; - SetupNativeScript(ctx, func); - return TRUE; -} - -bool8 ScrCmd_drawcontestwinner(struct ScriptContext *ctx) -{ - u8 v1 = ScriptReadByte(ctx); - - if (v1) - sub_8106630(v1); - ShowContestWinner(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)ScriptReadWord(ctx); - - u8 v2 = ptr[0]; - u8 v3 = ptr[1]; - u8 v4 = ptr[2]; - u8 v5 = ptr[3]; - u8 v6 = ptr[4]; - u8 v7 = ptr[5]; - StringBraille(gStringVar4, ptr + 6); - Menu_DrawStdWindowFrame(v2, v3, v4, v5); - Menu_PrintText(gStringVar4, v6, v7); - return FALSE; -} - -bool8 ScrCmd_vmessage(struct ScriptContext *ctx) -{ - u32 v1 = ScriptReadWord(ctx); - - ShowFieldMessage((u8 *)(v1 - gUnknown_0202E8B0)); - return FALSE; -} - -bool8 ScrCmd_bufferspeciesname(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 species = VarGet(ScriptReadHalfword(ctx)); - - StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]); - return FALSE; -} - -bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - - u8 *dest = sScriptStringVars[stringVarIndex]; - u8 partyIndex = GetLeadMonIndex(); - u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); - StringCopy(dest, gSpeciesNames[species]); - return FALSE; -} - -bool8 ScrCmd_bufferpartymonnick(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); - - GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); - StringGetEnd10(sScriptStringVars[stringVarIndex]); - return FALSE; -} - -bool8 ScrCmd_bufferitemname(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 itemId = VarGet(ScriptReadHalfword(ctx)); - - CopyItemName(itemId, sScriptStringVars[stringVarIndex]); - return FALSE; -} - -bool8 ScrCmd_bufferdecorationname(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 decorId = VarGet(ScriptReadHalfword(ctx)); - - StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name); - return FALSE; -} - -bool8 ScrCmd_buffermovename(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 moveId = VarGet(ScriptReadHalfword(ctx)); - - StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]); - return FALSE; -} - -bool8 ScrCmd_buffernumberstring(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = sub_80BF0B8(v1); - - ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2); - return FALSE; -} - -bool8 ScrCmd_bufferstdstring(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u16 index = VarGet(ScriptReadHalfword(ctx)); - - StringCopy(sScriptStringVars[stringVarIndex], gUnknown_083CE048[index]); - return FALSE; -} - -bool8 ScrCmd_bufferstring(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u8 *text = (u8 *)ScriptReadWord(ctx); - - StringCopy(sScriptStringVars[stringVarIndex], text); - return FALSE; -} - -bool8 ScrCmd_vloadptr(struct ScriptContext *ctx) -{ - u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); - - StringExpandPlaceholders(gStringVar4, ptr); - return FALSE; -} - -bool8 ScrCmd_vbufferstring(struct ScriptContext *ctx) -{ - u8 stringVarIndex = ScriptReadByte(ctx); - u32 addr = ScriptReadWord(ctx); - - u8 *src = (u8 *)(addr - gUnknown_0202E8B0); - u8 *dest = sScriptStringVars[stringVarIndex]; - StringCopy(dest, src); - return FALSE; -} - -bool8 ScrCmd_givemon(struct ScriptContext *ctx) -{ - u16 species = VarGet(ScriptReadHalfword(ctx)); - u8 level = ScriptReadByte(ctx); - u16 item = VarGet(ScriptReadHalfword(ctx)); - u32 unkParam1 = ScriptReadWord(ctx); - u32 unkParam2 = ScriptReadWord(ctx); - u8 unkParam3 = ScriptReadByte(ctx); - - gSpecialVar_Result = ScriptGiveMon(species, level, item, unkParam1, unkParam2, unkParam3); - return FALSE; -} - -bool8 ScrCmd_giveegg(struct ScriptContext *ctx) -{ - u16 species = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = ScriptGiveEgg(species); - return FALSE; -} - -bool8 ScrCmd_setmonmove(struct ScriptContext *ctx) -{ - u8 partyIndex = ScriptReadByte(ctx); - u8 slot = ScriptReadByte(ctx); - u16 move = ScriptReadHalfword(ctx); - - ScriptSetMonMoveSlot(partyIndex, move, slot); - return FALSE; -} - -bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) -{ - u8 i; - u16 moveId = ScriptReadHalfword(ctx); - - gSpecialVar_Result = 6; - for (i = 0; i < PARTY_SIZE; i++) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); - if (!species) - break; - // UB: GetMonData() arguments don't match function definition - if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && pokemon_has_move(&gPlayerParty[i], moveId) == TRUE) - { - gSpecialVar_Result = i; - gSpecialVar_0x8004 = species; - break; - } - } - return FALSE; -} - -bool8 ScrCmd_givemoney(struct ScriptContext *ctx) -{ - u32 amount = ScriptReadWord(ctx); - u8 ignore = ScriptReadByte(ctx); - - if (!ignore) - AddMoney(&gSaveBlock1.money, amount); - return FALSE; -} - -bool8 ScrCmd_takemoney(struct ScriptContext *ctx) -{ - u32 amount = ScriptReadWord(ctx); - u8 ignore = ScriptReadByte(ctx); - - if (!ignore) - RemoveMoney(&gSaveBlock1.money, amount); - return FALSE; -} - -bool8 ScrCmd_checkmoney(struct ScriptContext *ctx) -{ - u32 amount = ScriptReadWord(ctx); - u8 ignore = ScriptReadByte(ctx); - - if (!ignore) - gSpecialVar_Result = IsEnoughMoney(gSaveBlock1.money, amount); - return FALSE; -} - -bool8 ScrCmd_showmoneybox(struct ScriptContext *ctx) -{ - u8 x = ScriptReadByte(ctx); - u8 y = ScriptReadByte(ctx); - u8 ignore = ScriptReadByte(ctx); - - if (!ignore) - OpenMoneyWindow(gSaveBlock1.money, x, y); - return FALSE; -} - -bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx) -{ - u8 x = ScriptReadByte(ctx); - u8 y = ScriptReadByte(ctx); - - CloseMoneyWindow(x, y); - return FALSE; -} - -bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx) -{ - u8 x = ScriptReadByte(ctx); - u8 y = ScriptReadByte(ctx); - u8 ignore = ScriptReadByte(ctx); - - if (!ignore) - UpdateMoneyWindow(gSaveBlock1.money, x, y); - return FALSE; -} - -bool8 ScrCmd_showcoinsbox(struct ScriptContext *ctx) -{ - u8 x = ScriptReadByte(ctx); - u8 y = ScriptReadByte(ctx); - - ShowCoinsWindow(gSaveBlock1.coins, x, y); - return FALSE; -} - -bool8 ScrCmd_hidecoinsbox(struct ScriptContext *ctx) -{ - u8 x = ScriptReadByte(ctx); - u8 y = ScriptReadByte(ctx); - - HideCoinsWindow(x, y); - return FALSE; -} - -bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx) -{ - u8 x = ScriptReadByte(ctx); - u8 y = ScriptReadByte(ctx); - - UpdateCoinsWindow(gSaveBlock1.coins, x, y); - return FALSE; -} - -bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) -{ - ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr); - return FALSE; -} - -bool8 ScrCmd_trainerbattlebegin(struct ScriptContext *ctx) -{ - BattleSetup_StartTrainerBattle(); - return TRUE; -} - -bool8 ScrCmd_gotopostbattlescript(struct ScriptContext *ctx) -{ - ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle(); - return FALSE; -} - -bool8 ScrCmd_gotobeatenscript(struct ScriptContext *ctx) -{ - ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript(); - return FALSE; -} - -bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) -{ - u16 index = VarGet(ScriptReadHalfword(ctx)); - - ctx->comparisonResult = HasTrainerAlreadyBeenFought(index); - return FALSE; -} - -bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) -{ - u16 index = VarGet(ScriptReadHalfword(ctx)); - - SetTrainerFlag(index); - return FALSE; -} - -bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) -{ - u16 index = VarGet(ScriptReadHalfword(ctx)); - - ClearTrainerFlag(index); - return FALSE; -} - -bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx) -{ - u16 species = ScriptReadHalfword(ctx); - u8 level = ScriptReadByte(ctx); - u16 item = ScriptReadHalfword(ctx); - - CreateScriptedWildMon(species, level, item); - return FALSE; -} - -bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx) -{ - BattleSetup_StartScriptedWildBattle(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_pokemart(struct ScriptContext *ctx) -{ - void *ptr = (void *)ScriptReadWord(ctx); - - Shop_CreatePokemartMenu(ptr); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx) -{ - void *ptr = (void *)ScriptReadWord(ctx); - - Shop_CreateDecorationShop1Menu(ptr); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx) -{ - void *ptr = (void *)ScriptReadWord(ctx); - - Shop_CreateDecorationShop2Menu(ptr); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx) -{ - u8 v2 = VarGet(ScriptReadHalfword(ctx)); - - PlaySlotMachine(v2, c2_exit_to_overworld_1_continue_scripts_restart_music); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_setberrytree(struct ScriptContext *ctx) -{ - u8 treeId = ScriptReadByte(ctx); - u8 berry = ScriptReadByte(ctx); - u8 growthStage = ScriptReadByte(ctx); - - if (berry == 0) - PlantBerryTree(treeId, 0, growthStage, FALSE); - else - PlantBerryTree(treeId, berry, growthStage, FALSE); - return FALSE; -} - -bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx) -{ - u16 value = VarGet(ScriptReadHalfword(ctx)); - - gSpecialVar_Result = GetPriceReduction(value); - return FALSE; -} - -bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx) -{ - sub_80F99CC(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_startcontest(struct ScriptContext *ctx) -{ - sub_80C48C8(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx) -{ - sub_80C4940(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) -{ - sub_80C4980(gSpecialVar_ContestCategory); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx) -{ - u16 effectId = VarGet(ScriptReadHalfword(ctx)); - - sFieldEffectScriptId = effectId; - FieldEffectStart(sFieldEffectScriptId); - return FALSE; -} - -bool8 ScrCmd_setfieldeffectargument(struct ScriptContext *ctx) -{ - u8 argNum = ScriptReadByte(ctx); - - gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx)); - return FALSE; -} - -static bool8 sub_8067B48() -{ - if (!FieldEffectActiveListContains(sFieldEffectScriptId)) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_waitfieldeffect(struct ScriptContext *ctx) -{ - sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx)); - SetupNativeScript(ctx, sub_8067B48); - return TRUE; -} - -bool8 ScrCmd_setrespawn(struct ScriptContext *ctx) -{ - u16 healLocationId = VarGet(ScriptReadHalfword(ctx)); - - Overworld_SetHealLocationWarp(healLocationId); - return FALSE; -} - -bool8 ScrCmd_checkplayergender(struct ScriptContext *ctx) -{ - gSpecialVar_Result = gSaveBlock2.playerGender; - return FALSE; -} - -bool8 ScrCmd_playmoncry(struct ScriptContext *ctx) -{ - u16 species = VarGet(ScriptReadHalfword(ctx)); - u16 mode = VarGet(ScriptReadHalfword(ctx)); - - PlayCry5(species, mode); - return FALSE; -} - -bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, IsCryFinished); - return TRUE; -} - -bool8 ScrCmd_setmetatile(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - u16 metatileId = VarGet(ScriptReadHalfword(ctx)); - u16 v8 = VarGet(ScriptReadHalfword(ctx)); - - x += 7; - y += 7; - if (!v8) - MapGridSetMetatileIdAt(x, y, metatileId); - else - MapGridSetMetatileIdAt(x, y, metatileId | 0xC00); - return FALSE; -} - -bool8 ScrCmd_opendoor(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - x += 7; - y += 7; - PlaySE(GetDoorSoundEffect(x, y)); - FieldAnimateDoorOpen(x, y); - return FALSE; -} - -bool8 ScrCmd_closedoor(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - x += 7; - y += 7; - FieldAnimateDoorClose(x, y); - return FALSE; -} - -static bool8 IsDoorAnimationStopped() -{ - if (!FieldIsDoorAnimationRunning()) - return TRUE; - else - return FALSE; -} - -bool8 ScrCmd_waitdooranim(struct ScriptContext *ctx) -{ - SetupNativeScript(ctx, IsDoorAnimationStopped); - return TRUE; -} - -bool8 ScrCmd_setdooropen(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - x += 7; - y += 7; - FieldSetDoorOpened(x, y); - return FALSE; -} - -bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) -{ - u16 x = VarGet(ScriptReadHalfword(ctx)); - u16 y = VarGet(ScriptReadHalfword(ctx)); - - x += 7; - y += 7; - FieldSetDoorClosed(x, y); - return FALSE; -} - -bool8 ScrCmd_addelevmenuitem(struct ScriptContext *ctx) -{ - u8 v3 = ScriptReadByte(ctx); - u16 v5 = VarGet(ScriptReadHalfword(ctx)); - u16 v7 = VarGet(ScriptReadHalfword(ctx)); - u16 v9 = VarGet(ScriptReadHalfword(ctx)); - - ScriptAddElevatorMenuItem(v3, v5, v7, v9); - return FALSE; -} - -bool8 ScrCmd_showelevmenu(struct ScriptContext *ctx) -{ - ScriptShowElevatorMenu(); - ScriptContext1_Stop(); - return TRUE; -} - -bool8 ScrCmd_checkcoins(struct ScriptContext *ctx) -{ - u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr = GetCoins(); - return FALSE; -} - -bool8 ScrCmd_givecoins(struct ScriptContext *ctx) -{ - u16 coins = VarGet(ScriptReadHalfword(ctx)); - - if (GiveCoins(coins) == TRUE) - gSpecialVar_Result = 0; - else - gSpecialVar_Result = 1; - return FALSE; -} - -bool8 ScrCmd_takecoins(struct ScriptContext *ctx) -{ - u16 coins = VarGet(ScriptReadHalfword(ctx)); - - if (TakeCoins(coins) == TRUE) - gSpecialVar_Result = 0; - else - gSpecialVar_Result = 1; - return FALSE; -} diff --git a/src/field/script_menu.c b/src/field/script_menu.c deleted file mode 100644 index 9d901a03c..000000000 --- a/src/field/script_menu.c +++ /dev/null @@ -1,1178 +0,0 @@ -#include "global.h" -#include "script.h" -#include "script_menu.h" -#include "event_data.h" -#include "field_effect.h" -#include "menu.h" -#include "palette.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "strings.h" -#include "task.h" - -// multichoice lists -const struct MenuAction MultichoiceList_00[] = -{ - {OtherText_Petalburg, NULL}, - {OtherText_Slateport, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_02[] = -{ - {OtherText_Enter, NULL}, - {OtherText_Info3, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_03[] = -{ - {OtherText_WhatsAContest, NULL}, - {OtherText_TypesOfContest, NULL}, - {OtherText_Ranks, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_04[] = -{ - {OtherText_CoolContest, NULL}, - {OtherText_BeautyContest, NULL}, - {OtherText_CuteContest, NULL}, - {OtherText_SmartContest, NULL}, - {OtherText_ToughContest, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_06[] = -{ - {OtherText_Decoration, NULL}, - {OtherText_PackUp, NULL}, - {OtherText_Registry, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_05[] = -{ - {OtherText_Decoration, NULL}, - {OtherText_PackUp, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_07[] = -{ - {OtherText_Register, NULL}, - {OtherText_Registry, NULL}, - {OtherText_Information, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_12[] = -{ - {OtherText_Mach, NULL}, - {OtherText_Acro, NULL}, -}; - -const struct MenuAction MultichoiceList_13[] = -{ - {OtherText_Poison, NULL}, - {OtherText_Paralysis, NULL}, - {OtherText_Sleep, NULL}, - {OtherText_Burn, NULL}, - {OtherText_Frozen, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_14[] = -{ - {OtherText_Dewford, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_16[] = -{ - {OtherText_SawIt, NULL}, - {OtherText_NotYet, NULL}, -}; - -const struct MenuAction MultichoiceList_17[] = -{ - {OtherText_Yes, NULL}, - {OtherText_No, NULL}, - {OtherText_Info3, NULL}, -}; - -const struct MenuAction MultichoiceList_18[] = -{ - {OtherText_SingleBattle, NULL}, - {OtherText_DoubleBattle, NULL}, - {OtherText_MultiBattle, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_19[] = -{ - {OtherText_Littleroot, NULL}, - {OtherText_Slateport, NULL}, - {OtherText_Lilycove, NULL}, -}; - -const struct MenuAction MultichoiceList_20[] = -{ - {OtherText_Yes, NULL}, - {OtherText_No, NULL}, - {OtherText_Info3, NULL}, -}; - -const struct MenuAction MultichoiceList_23[] = -{ - {OtherText_MakeAChallenge, NULL}, - {OtherText_ObtainInformation, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_24[] = -{ - {OtherText_Lv50_2, NULL}, - {OtherText_Lv100_2, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_25[] = -{ - {OtherText_Zigzagoon, NULL}, - {OtherText_Nincada, NULL}, - {OtherText_Poochyena, NULL}, -}; - -const struct MenuAction MultichoiceList_26[] = -{ - {OtherText_Nincada2, NULL}, - {OtherText_Lotad, NULL}, - {OtherText_Roselia, NULL}, -}; - -const struct MenuAction MultichoiceList_27[] = -{ - {OtherText_Shroomish, NULL}, - {OtherText_Nincada3, NULL}, - {OtherText_Surskit, NULL}, -}; - -const struct MenuAction MultichoiceList_28[] = -{ - {OtherText_Treecko, NULL}, - {OtherText_Torchic, NULL}, - {OtherText_Mudkip, NULL}, -}; - -const struct MenuAction MultichoiceList_29[] = -{ - {OtherText_Seedot, NULL}, - {OtherText_Shroomish2, NULL}, - {OtherText_Spinda, NULL}, -}; - -const struct MenuAction MultichoiceList_30[] = -{ - {OtherText_Shroomish3, NULL}, - {OtherText_Zigzagoon2, NULL}, - {OtherText_Wurmple, NULL}, -}; - -const struct MenuAction MultichoiceList_31[] = -{ - {OtherText_PokeBall, NULL}, - {OtherText_SuperPotion, NULL}, - {OtherText_SamePrice, NULL}, -}; - -const struct MenuAction MultichoiceList_32[] = -{ - {OtherText_Yen135, NULL}, - {OtherText_Yen155, NULL}, - {OtherText_Yen175, NULL}, -}; - -const struct MenuAction MultichoiceList_33[] = -{ - {OtherText_CostMore, NULL}, - {OtherText_CostLess, NULL}, - {OtherText_SamePrice2, NULL}, -}; - -const struct MenuAction MultichoiceList_34[] = -{ - {OtherText_MaleSymbol, NULL}, - {OtherText_FemaleSymbol, NULL}, - {OtherText_Neither, NULL}, -}; - -const struct MenuAction MultichoiceList_35[] = -{ - {OtherText_Males, NULL}, - {OtherText_Females, NULL}, - {OtherText_SameNumber, NULL}, -}; - -const struct MenuAction MultichoiceList_36[] = -{ - {OtherText_Male, NULL}, - {OtherText_Female, NULL}, - {OtherText_ItDepends, NULL}, -}; - -const struct MenuAction MultichoiceList_37[] = -{ - {OtherText_Six2, NULL}, - {OtherText_Eight2, NULL}, - {OtherText_Ten, NULL}, -}; - -const struct MenuAction MultichoiceList_38[] = -{ - {OtherText_One, NULL}, - {OtherText_Two, NULL}, - {OtherText_Three, NULL}, -}; - -const struct MenuAction MultichoiceList_39[] = -{ - {OtherText_Six, NULL}, - {OtherText_Seven, NULL}, - {OtherText_Eight, NULL}, -}; - -const struct MenuAction MultichoiceList_42[] = -{ - {OtherText_FreshWater, NULL}, - {OtherText_SodaPop, NULL}, - {OtherText_Lemonade, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_43[] = -{ - {OtherText_HowToRide, NULL}, - {OtherText_HowToTurn, NULL}, - {OtherText_SandySlopes, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_44[] = -{ - {OtherText_Wheelies, NULL}, - {OtherText_BunnyHops, NULL}, - {OtherText_Jumping, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_45[] = -{ - {OtherText_Satisfied, NULL}, - {OtherText_Dissatisfied, NULL}, -}; - -const struct MenuAction MultichoiceList_46[] = -{ - {OtherText_Deepseatooth, NULL}, - {OtherText_Deepseascale, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_47[] = -{ - {OtherText_BlueFlute2, NULL}, - {OtherText_YellowFlute2, NULL}, - {OtherText_RedFlute2, NULL}, - {OtherText_WhiteFlute2, NULL}, - {OtherText_BlackFlute2, NULL}, - {OtherText_GlassChair, NULL}, - {OtherText_GlassDesk, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_48[] = -{ - {OtherText_TreeckoDoll, NULL}, - {OtherText_TorchicDoll, NULL}, - {OtherText_MudkipDoll, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_55[] = -{ - {OtherText_TM32, NULL}, - {OtherText_TM29, NULL}, - {OtherText_TM35, NULL}, - {OtherText_TM24, NULL}, - {OtherText_TM13, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_49[] = -{ - {OtherText_50Coins, NULL}, - {OtherText_500Coins, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_50[] = -{ - {OtherText_Excellent, NULL}, - {OtherText_NotSoHot, NULL}, -}; - -const struct MenuAction MultichoiceList_52[] = -{ - {OtherText_Lilycove, NULL}, - {OtherText_BattleTower, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_53[] = -{ - {OtherText_Slateport, NULL}, - {OtherText_Lilycove, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_54[] = -{ - {OtherText_Right, NULL}, - {OtherText_Left, NULL}, -}; - -const struct MenuAction MultichoiceList_56[] = -{ - {OtherText_Slateport, NULL}, - {OtherText_BattleTower, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_57[] = -{ - {OtherText_1F_2, NULL}, - {OtherText_2F_2, NULL}, - {OtherText_3F_2, NULL}, - {OtherText_4F_2, NULL}, - {OtherText_5F_2, NULL}, -}; - -const struct MenuAction MultichoiceList_58[] = -{ - {OtherText_RedShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_59[] = -{ - {OtherText_YellowShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_60[] = -{ - {OtherText_RedShard, NULL}, - {OtherText_YellowShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_61[] = -{ - {OtherText_BlueShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_62[] = -{ - {OtherText_RedShard, NULL}, - {OtherText_BlueShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_63[] = -{ - {OtherText_YellowShard, NULL}, - {OtherText_BlueShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_64[] = -{ - {OtherText_RedShard, NULL}, - {OtherText_YellowShard, NULL}, - {OtherText_BlueShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_65[] = -{ - {OtherText_GreenShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_66[] = -{ - {OtherText_RedShard, NULL}, - {OtherText_GreenShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_67[] = -{ - {OtherText_YellowShard, NULL}, - {OtherText_GreenShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_68[] = -{ - {OtherText_RedShard, NULL}, - {OtherText_YellowShard, NULL}, - {OtherText_GreenShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_69[] = -{ - {OtherText_BlueShard, NULL}, - {OtherText_GreenShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_70[] = -{ - {OtherText_RedShard, NULL}, - {OtherText_BlueShard, NULL}, - {OtherText_GreenShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_71[] = -{ - {OtherText_YellowShard, NULL}, - {OtherText_BlueShard, NULL}, - {OtherText_GreenShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_72[] = -{ - {OtherText_RedShard, NULL}, - {OtherText_YellowShard, NULL}, - {OtherText_BlueShard, NULL}, - {OtherText_GreenShard, NULL}, - {gOtherText_CancelNoTerminator, NULL}, -}; - -const struct MenuAction MultichoiceList_01[] = -{ - {gOtherText_CancelNoTerminator, NULL}, -}; - -struct MultichoiceListStruct -{ - const struct MenuAction *list; - u8 count; -}; - -const struct MultichoiceListStruct gMultichoiceLists[] = -{ - {MultichoiceList_00, ARRAY_COUNT(MultichoiceList_00)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_02, ARRAY_COUNT(MultichoiceList_02)}, - {MultichoiceList_03, ARRAY_COUNT(MultichoiceList_03)}, - {MultichoiceList_04, ARRAY_COUNT(MultichoiceList_04)}, - {MultichoiceList_05, ARRAY_COUNT(MultichoiceList_05)}, - {MultichoiceList_06, ARRAY_COUNT(MultichoiceList_06)}, - {MultichoiceList_07, ARRAY_COUNT(MultichoiceList_07)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_12, ARRAY_COUNT(MultichoiceList_12)}, - {MultichoiceList_13, ARRAY_COUNT(MultichoiceList_13)}, - {MultichoiceList_14, ARRAY_COUNT(MultichoiceList_14)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_16, ARRAY_COUNT(MultichoiceList_16)}, - {MultichoiceList_17, ARRAY_COUNT(MultichoiceList_17)}, - {MultichoiceList_18, ARRAY_COUNT(MultichoiceList_18)}, - {MultichoiceList_19, ARRAY_COUNT(MultichoiceList_19)}, - {MultichoiceList_20, ARRAY_COUNT(MultichoiceList_20)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_23, ARRAY_COUNT(MultichoiceList_23)}, - {MultichoiceList_24, ARRAY_COUNT(MultichoiceList_24)}, - {MultichoiceList_25, ARRAY_COUNT(MultichoiceList_25)}, - {MultichoiceList_26, ARRAY_COUNT(MultichoiceList_26)}, - {MultichoiceList_27, ARRAY_COUNT(MultichoiceList_27)}, - {MultichoiceList_28, ARRAY_COUNT(MultichoiceList_28)}, - {MultichoiceList_29, ARRAY_COUNT(MultichoiceList_29)}, - {MultichoiceList_30, ARRAY_COUNT(MultichoiceList_30)}, - {MultichoiceList_31, ARRAY_COUNT(MultichoiceList_31)}, - {MultichoiceList_32, ARRAY_COUNT(MultichoiceList_32)}, - {MultichoiceList_33, ARRAY_COUNT(MultichoiceList_33)}, - {MultichoiceList_34, ARRAY_COUNT(MultichoiceList_34)}, - {MultichoiceList_35, ARRAY_COUNT(MultichoiceList_35)}, - {MultichoiceList_36, ARRAY_COUNT(MultichoiceList_36)}, - {MultichoiceList_37, ARRAY_COUNT(MultichoiceList_37)}, - {MultichoiceList_38, ARRAY_COUNT(MultichoiceList_38)}, - {MultichoiceList_39, ARRAY_COUNT(MultichoiceList_39)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_42, ARRAY_COUNT(MultichoiceList_42)}, - {MultichoiceList_43, ARRAY_COUNT(MultichoiceList_43)}, - {MultichoiceList_44, ARRAY_COUNT(MultichoiceList_44)}, - {MultichoiceList_45, ARRAY_COUNT(MultichoiceList_45)}, - {MultichoiceList_46, ARRAY_COUNT(MultichoiceList_46)}, - {MultichoiceList_47, ARRAY_COUNT(MultichoiceList_47)}, - {MultichoiceList_48, ARRAY_COUNT(MultichoiceList_48)}, - {MultichoiceList_49, ARRAY_COUNT(MultichoiceList_49)}, - {MultichoiceList_50, ARRAY_COUNT(MultichoiceList_50)}, - {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, - {MultichoiceList_52, ARRAY_COUNT(MultichoiceList_52)}, - {MultichoiceList_53, ARRAY_COUNT(MultichoiceList_53)}, - {MultichoiceList_54, ARRAY_COUNT(MultichoiceList_54)}, - {MultichoiceList_55, ARRAY_COUNT(MultichoiceList_55)}, - {MultichoiceList_56, ARRAY_COUNT(MultichoiceList_56)}, - {MultichoiceList_57, ARRAY_COUNT(MultichoiceList_57)}, - {MultichoiceList_58, ARRAY_COUNT(MultichoiceList_58)}, - {MultichoiceList_59, ARRAY_COUNT(MultichoiceList_59)}, - {MultichoiceList_60, ARRAY_COUNT(MultichoiceList_60)}, - {MultichoiceList_61, ARRAY_COUNT(MultichoiceList_61)}, - {MultichoiceList_62, ARRAY_COUNT(MultichoiceList_62)}, - {MultichoiceList_63, ARRAY_COUNT(MultichoiceList_63)}, - {MultichoiceList_64, ARRAY_COUNT(MultichoiceList_64)}, - {MultichoiceList_65, ARRAY_COUNT(MultichoiceList_65)}, - {MultichoiceList_66, ARRAY_COUNT(MultichoiceList_66)}, - {MultichoiceList_67, ARRAY_COUNT(MultichoiceList_67)}, - {MultichoiceList_68, ARRAY_COUNT(MultichoiceList_68)}, - {MultichoiceList_69, ARRAY_COUNT(MultichoiceList_69)}, - {MultichoiceList_70, ARRAY_COUNT(MultichoiceList_70)}, - {MultichoiceList_71, ARRAY_COUNT(MultichoiceList_71)}, - {MultichoiceList_72, ARRAY_COUNT(MultichoiceList_72)}, -}; - -const u8 *const gUnknown_083CE048[] = -{ - OtherText_Cool2, - OtherText_Beauty3, - OtherText_Cute2, - OtherText_Smart2, - OtherText_Tough2, - OtherText_Normal, - OtherText_Super, - OtherText_Hyper, - OtherText_Master, - OtherText_Cool3, - OtherText_Beauty4, - OtherText_Cute3, - OtherText_Smart3, - OtherText_Tough3, - OtherText_Items, - OtherText_KeyItems, - OtherText_Balls, - OtherText_TMsHMs, - OtherText_Berries, -}; - -extern u8 gPCText_WhichPCShouldBeAccessed[]; - -extern u16 gSpecialVar_Result; - -static void Task_HandleMultichoiceInput(u8); -static void Task_HandleYesNoInput(u8); -static void Task_HandleMultichoiceGridInput(u8); -static u16 GetStringWidthInTilesForScriptMenu(const u8 *str); -static void DrawMultichoiceMenu(u8, u8, u8, const struct MenuAction *list, u8, u8); -static void StartScriptMenuTask(u8, u8, u8, u8, u8, u8); -static void sub_80B53B4(u8, u8, u8, const struct MenuAction *list, u8); -static bool8 IsPicboxClosed(void); - -bool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress) -{ - if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE) - { - return FALSE; - } - else - { - gSpecialVar_Result = 0xFF; - DrawMultichoiceMenu(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress, 0); - return TRUE; - } -} - -bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress, u8 defaultChoice) -{ - if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE) - { - return FALSE; - } - else - { - gSpecialVar_Result = 0xFF; - DrawMultichoiceMenu(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress, defaultChoice); - return TRUE; - } -} - -static u16 GetStringWidthInTilesForScriptMenu(const u8 *str) -{ - // each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8. - return (Text_GetStringWidthFromWindowTemplate((struct WindowTemplate *)&gWindowTemplate_81E6CE4, str) + 7) / 8; -} - -static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress, u8 cursorPos) -{ - u16 width = GetStringWidthInTilesForScriptMenu(list[0].text); - u16 newWidth; - u8 i; - u8 right; - u8 bottom; - - for (i = 1; i < count; i++) - { - newWidth = GetStringWidthInTilesForScriptMenu(list[i].text); - if (width < newWidth) - width = newWidth; - } - - right = width; - right = (right + left) + 1; - - if (right > 29) - { - left = left + (29 - right); - right = 29; - } - - bottom = top + (2 * count + 1); - - Menu_DrawStdWindowFrame(left, top, right, bottom); - Menu_PrintItems(left + 1, top + 1, count, list); - InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1); - StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count); -} - -#define tLeft data[0] -#define tTop data[1] -#define tRight data[2] -#define tBottom data[3] -#define tIgnoreBPress data[4] -#define tDoWrap data[5] - -static void StartScriptMenuTask(u8 left, u8 top, u8 right, u8 bottom, u8 ignoreBPress, u8 count) -{ - u8 taskId = CreateTask(Task_HandleMultichoiceInput, 80); - - gTasks[taskId].tLeft = left; - gTasks[taskId].tTop = top; - gTasks[taskId].tRight = right; - gTasks[taskId].tBottom = bottom; - gTasks[taskId].tIgnoreBPress = ignoreBPress; - - if (count > 3) - gTasks[taskId].tDoWrap = TRUE; - else - gTasks[taskId].tDoWrap = FALSE; -} - -static void Task_HandleMultichoiceInput(u8 taskId) -{ - s8 selection; - - if (!gPaletteFade.active) - { - if (!gTasks[taskId].tDoWrap) - selection = Menu_ProcessInputNoWrap(); - else - selection = Menu_ProcessInput(); - - if (selection != -2) - { - if (selection == -1) - { - if (gTasks[taskId].tIgnoreBPress) - return; - PlaySE(SE_SELECT); - gSpecialVar_Result = 127; - } - else - { - gSpecialVar_Result = selection; - } - Menu_DestroyCursor(); - Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); - DestroyTask(taskId); - EnableBothScriptContexts(); - } - } -} - -bool8 Multichoice(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress) -{ - if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE) - { - return FALSE; - } - else - { - gSpecialVar_Result = 0xFF; - sub_80B53B4(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress); - return TRUE; - } -} - -static void sub_80B53B4(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress) -{ - u16 width = GetStringWidthInTilesForScriptMenu(list[0].text); - u16 newWidth; - u8 i; - u8 right; - u8 bottom; - - for (i = 1; i < count; i++) - { - newWidth = GetStringWidthInTilesForScriptMenu(list[i].text); - if (width < newWidth) - width = newWidth; - } - - right = width; - right = (right + left) + 2; - bottom = top + (2 * count + 1); - - Menu_PrintItems(left, top, count, list); - InitMenu(0, left, top, count, 0, right - left - 1); - StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count); -} - -bool8 ScriptMenu_YesNo(u8 left, u8 top) -{ - u8 taskId; - - if (FuncIsActiveTask(Task_HandleYesNoInput) == TRUE) - { - return FALSE; - } - else - { - gSpecialVar_Result = 0xFF; - DisplayYesNoMenu(left, top, 1); - taskId = CreateTask(Task_HandleYesNoInput, 0x50); - gTasks[taskId].tLeft = left; - gTasks[taskId].tTop = top; - return TRUE; - } -} - -// unused -bool8 IsScriptActive(void) -{ - if (gSpecialVar_Result == 0xFF) - return FALSE; - else - return TRUE; -} - -static void Task_HandleYesNoInput(u8 taskId) -{ - u8 left, top; - - if (gTasks[taskId].tRight < 5) - { - gTasks[taskId].tRight++; - return; - } - - switch (Menu_ProcessInputNoWrap()) - { - case -2: - return; - case -1: - case 1: - PlaySE(SE_SELECT); - gSpecialVar_Result = 0; - break; - case 0: - gSpecialVar_Result = 1; - break; - } - - left = gTasks[taskId].tLeft; - top = gTasks[taskId].tTop; - - Menu_EraseWindowRect(left, top, left + 6, top + 5); - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress, u8 columnCount) -{ - u8 bottom = 0; - - if (FuncIsActiveTask(Task_HandleMultichoiceGridInput) == TRUE) - { - return FALSE; - } - else - { - u8 taskId; - u8 width; - - gSpecialVar_Result = 0xFF; - - sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0); - - taskId = CreateTask(Task_HandleMultichoiceGridInput, 80); - - if (!((gMultichoiceLists[multichoiceId].count >> 1) < columnCount || (gMultichoiceLists[multichoiceId].count & 1)) - || columnCount == 1 || gMultichoiceLists[multichoiceId].count == columnCount) - { - bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 1 + top; - } - else - { - bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top; - } - - width = Menu_GetColumnXCoord(columnCount); - gTasks[taskId].tLeft = left; - gTasks[taskId].tTop = top; - gTasks[taskId].tRight = width + left + 2; - gTasks[taskId].tBottom = bottom; - gTasks[taskId].tIgnoreBPress = ignoreBPress; - return TRUE; - } -} - -static void Task_HandleMultichoiceGridInput(u8 taskId) -{ - s8 selection = Menu_ProcessInputGridLayout(); - - if (selection != -2) - { - if (selection == -1) - { - if (gTasks[taskId].tIgnoreBPress) - return; - PlaySE(SE_SELECT); - gSpecialVar_Result = 127; - } - else - { - gSpecialVar_Result = selection; - } - Menu_DestroyCursor(); - Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); - DestroyTask(taskId); - EnableBothScriptContexts(); - } -} - -#undef tLeft -#undef tTop -#undef tRight -#undef tBottom -#undef tIgnoreBPress -#undef tDoWrap - -bool8 ScrSpecial_CreatePCMenu(void) -{ - if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE) - { - return FALSE; - } - else - { - gSpecialVar_Result = 0xFF; - ScriptMenu_CreatePCMenu(); - return TRUE; - } -} - -#if ENGLISH -void ScriptMenu_CreatePCMenu(void) -{ - u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC); - u8 width; - u8 numChoices; - - if (playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC)) - width = playersPCWidth; - else - width = 8; - - if (FlagGet(FLAG_SYS_GAME_CLEAR)) // player has cleared game? - { - numChoices = 4; - Menu_DrawStdWindowFrame(0, 0, width + 2, 9); - Menu_PrintText(gPCText_HallOfFame, 1, 5); - Menu_PrintText(gPCText_LogOff, 1, 7); - } - else - { - numChoices = 3; - Menu_DrawStdWindowFrame(0, 0, width + 2, 7); - Menu_PrintText(gPCText_LogOff, 1, 5); - } - - if (FlagGet(FLAG_SYS_PC_LANETTE)) // player met lanette? - Menu_PrintText(gPCText_LanettesPC, 1, 1); - else - Menu_PrintText(gPCText_SomeonesPC, 1, 1); - - Menu_PrintText(gPCText_PlayersPC, 1, 3); - InitMenu(0, 1, 1, numChoices, 0, width + 1); - StartScriptMenuTask(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices); -} -#elif GERMAN -__attribute__((naked)) -void ScriptMenu_CreatePCMenu(void) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - sub sp, 0x18\n\ - ldr r0, _080B5748 @ =0x0000084b\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080B5750\n\ - ldr r0, _080B574C @ =gPCText_LanettesPC\n\ - b _080B5752\n\ - .align 2, 0\n\ -_080B5748: .4byte 0x0000084b\n\ -_080B574C: .4byte gPCText_LanettesPC\n\ -_080B5750:\n\ - ldr r0, _080B57E8 @ =gPCText_SomeonesPC\n\ -_080B5752:\n\ - bl GetStringWidthInTilesForScriptMenu\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - movs r4, 0x1\n\ - ldr r0, _080B57EC @ =gPCText_PlayersPC\n\ - bl GetStringWidthInTilesForScriptMenu\n\ - lsls r1, r4, 2\n\ - add r1, sp\n\ - adds r1, 0x8\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [r1]\n\ - ldr r0, _080B57F0 @ =gPCText_LogOff\n\ - bl GetStringWidthInTilesForScriptMenu\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x10]\n\ - movs r4, 0x3\n\ - ldr r0, _080B57F4 @ =0x00000804\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080B5798\n\ - ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ - bl GetStringWidthInTilesForScriptMenu\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x14]\n\ - movs r4, 0x4\n\ -_080B5798:\n\ - movs r5, 0\n\ - cmp r5, r4\n\ - bge _080B57B4\n\ - add r2, sp, 0x8\n\ - adds r1, r4, 0\n\ -_080B57A2:\n\ - ldr r0, [r2]\n\ - cmp r5, r0\n\ - bge _080B57AC\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ -_080B57AC:\n\ - adds r2, 0x4\n\ - subs r1, 0x1\n\ - cmp r1, 0\n\ - bne _080B57A2\n\ -_080B57B4:\n\ - ldr r0, _080B57F4 @ =0x00000804\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080B57FC\n\ - movs r7, 0x4\n\ - adds r4, r5, 0x2\n\ - lsls r2, r4, 24\n\ - lsrs r2, 24\n\ - movs r0, 0\n\ - movs r1, 0\n\ - movs r3, 0x9\n\ - bl Menu_DrawStdWindowFrame\n\ - ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ - movs r1, 0x1\n\ - movs r2, 0x5\n\ - bl Menu_PrintText\n\ - ldr r0, _080B57F0 @ =gPCText_LogOff\n\ - movs r1, 0x1\n\ - movs r2, 0x7\n\ - bl Menu_PrintText\n\ - b _080B5818\n\ - .align 2, 0\n\ -_080B57E8: .4byte gPCText_SomeonesPC\n\ -_080B57EC: .4byte gPCText_PlayersPC\n\ -_080B57F0: .4byte gPCText_LogOff\n\ -_080B57F4: .4byte 0x00000804\n\ -_080B57F8: .4byte gPCText_HallOfFame\n\ -_080B57FC:\n\ - movs r7, 0x3\n\ - adds r4, r5, 0x2\n\ - lsls r2, r4, 24\n\ - lsrs r2, 24\n\ - movs r0, 0\n\ - movs r1, 0\n\ - movs r3, 0x7\n\ - bl Menu_DrawStdWindowFrame\n\ - ldr r0, _080B5834 @ =gPCText_LogOff\n\ - movs r1, 0x1\n\ - movs r2, 0x5\n\ - bl Menu_PrintText\n\ -_080B5818:\n\ - adds r6, r4, 0\n\ - ldr r0, _080B5838 @ =0x0000084b\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080B5840\n\ - ldr r0, _080B583C @ =gPCText_LanettesPC\n\ - movs r1, 0x1\n\ - movs r2, 0x1\n\ - bl Menu_PrintText\n\ - b _080B584A\n\ - .align 2, 0\n\ -_080B5834: .4byte gPCText_LogOff\n\ -_080B5838: .4byte 0x0000084b\n\ -_080B583C: .4byte gPCText_LanettesPC\n\ -_080B5840:\n\ - ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\ - movs r1, 0x1\n\ - movs r2, 0x1\n\ - bl Menu_PrintText\n\ -_080B584A:\n\ - ldr r0, _080B588C @ =gPCText_PlayersPC\n\ - movs r1, 0x1\n\ - movs r2, 0x3\n\ - bl Menu_PrintText\n\ - movs r4, 0\n\ - str r4, [sp]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - movs r0, 0\n\ - movs r1, 0x1\n\ - movs r2, 0x1\n\ - adds r3, r7, 0\n\ - bl InitMenu\n\ - lsls r2, r6, 24\n\ - lsrs r2, 24\n\ - lsls r3, r7, 1\n\ - adds r3, 0x1\n\ - str r4, [sp]\n\ - str r7, [sp, 0x4]\n\ - movs r0, 0\n\ - movs r1, 0\n\ - bl StartScriptMenuTask\n\ - add sp, 0x18\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B5888: .4byte gPCText_SomeonesPC\n\ -_080B588C: .4byte gPCText_PlayersPC\n\ - .syntax divided\n"); -} -#endif - -void ScriptMenu_DisplayPCStartupPrompt(void) -{ - Menu_DisplayDialogueFrame(); - Menu_PrintText(gPCText_WhichPCShouldBeAccessed, 2, 15); -} - -#define tState data[0] -#define tMonSpecies data[1] -#define tMonSpriteId data[2] -#define tWindowX data[3] -#define tWindowY data[4] - -static void Task_PokemonPicWindow(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->tState) - { - case 0: - task->tState++; - break; - case 1: - break; - case 2: - FreeResourcesAndDestroySprite(&gSprites[task->tMonSpriteId]); - task->tState++; - break; - case 3: - Menu_EraseWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10); - DestroyTask(taskId); - break; - } -} - -bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y) -{ - u8 taskId; - u8 spriteId; - - if (FindTaskIdByFunc(Task_PokemonPicWindow) != 0xFF) - { - return FALSE; - } - else - { - Menu_DrawStdWindowFrame(x, y, x + 9, y + 10); - taskId = CreateTask(Task_PokemonPicWindow, 0x50); - gTasks[taskId].tState = 0; - gTasks[taskId].tMonSpecies = species; - spriteId = CreateMonSprite_PicBox(species, x * 8 + 40, y * 8 + 40, 0); - gTasks[taskId].tMonSpriteId = spriteId; - gTasks[taskId].tWindowX = x; - gTasks[taskId].tWindowY = y; - gSprites[spriteId].callback = SpriteCallbackDummy; - gSprites[spriteId].oam.priority = 0; - return TRUE; - } -} - -bool8 (*ScriptMenu_GetPicboxWaitFunc(void))(void) -{ - u8 taskId = FindTaskIdByFunc(Task_PokemonPicWindow); - - if (taskId == 0xFF) - return NULL; - gTasks[taskId].tState++; - return IsPicboxClosed; -} - -static bool8 IsPicboxClosed(void) -{ - if (FindTaskIdByFunc(Task_PokemonPicWindow) == 0xFF) - return TRUE; - else - return FALSE; -} - -#undef tState -#undef tMonSpecies -#undef tMonSpriteId -#undef tWindowX -#undef tWindowY diff --git a/src/field/script_movement.c b/src/field/script_movement.c deleted file mode 100644 index 653dffcbf..000000000 --- a/src/field/script_movement.c +++ /dev/null @@ -1,227 +0,0 @@ -#include "global.h" -#include "script_movement.h" -#include "event_object_movement.h" -#include "task.h" -#include "util.h" - -static EWRAM_DATA const u8 *gUnknown_020384F8[16] = {0}; - -static void sub_80A2198(u8); -static u8 sub_80A21E0(void); -static bool8 sub_80A21F4(u8, u8, const u8 *); -static u8 sub_80A2260(u8, u8); -static bool8 sub_80A2370(u8, u8); -static void sub_80A23C8(u8, u8, u8, const u8 *); -static void UnfreezeObjects(u8); -static void Task_80A244C(u8); -static void sub_80A2490(u8, u8, u8, const u8 *); - -bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript) -{ - u8 mapObjId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjId)) - return TRUE; - if (!FuncIsActiveTask(Task_80A244C)) - sub_80A2198(50); - return sub_80A21F4(sub_80A21E0(), mapObjId, movementScript); -} - -bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapBank) -{ - u8 mapObjId; - u8 r4; - u8 r1; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapBank, &mapObjId)) - return TRUE; - r4 = sub_80A21E0(); - r1 = sub_80A2260(r4, mapObjId); - if (r1 == 16) - return TRUE; - return sub_80A2370(r4, r1); -} - -void sub_80A2178(void) -{ - u8 taskId; - - taskId = sub_80A21E0(); - if (taskId != 0xFF) - { - UnfreezeObjects(taskId); - DestroyTask(taskId); - } -} - -static void sub_80A2198(u8 priority) -{ - u8 taskId; - u8 i; - - taskId = CreateTask(Task_80A244C, priority); - for (i = 1; i < 16; i++) - gTasks[taskId].data[i] = 0xFFFF; -} - -static u8 sub_80A21E0(void) -{ - return FindTaskIdByFunc(Task_80A244C); -} - -static bool8 sub_80A21F4(u8 taskId, u8 mapObjId, const u8 *movementScript) -{ - u8 r4; - - r4 = sub_80A2260(taskId, mapObjId); - if (r4 != 16) - { - if (sub_80A2370(taskId, r4) == 0) - { - return TRUE; - } - else - { - sub_80A23C8(taskId, r4, mapObjId, movementScript); - return FALSE; - } - } - r4 = sub_80A2260(taskId, 0xFF); - if (r4 == 16) - { - return TRUE; - } - else - { - sub_80A23C8(taskId, r4, mapObjId, movementScript); - return FALSE; - } -} - -static u8 sub_80A2260(u8 taskId, u8 b) -{ - u8 *ptr; - u8 i; - - ptr = (u8 *)&gTasks[taskId].data[1]; - for (i = 0; i < 16; i++, ptr++) - { - if (*ptr == b) - return i; - } - return 16; -} - -static void sub_80A229C(u8 taskId, u8 b, u8 **c) -{ - u8 i; - - *c = (u8 *)&gTasks[taskId].data[1]; - for (i = 0; i < b; i++, (*c)++) - ; -} - -static void sub_80A22D0(u8 taskId, u8 b, u8 c) -{ - u8 *ptr; - - sub_80A229C(taskId, b, &ptr); - *ptr = c; //what is this supposed to do? -} - -static void sub_80A22F4(u8 taskId, u8 b, u8 *c) -{ - u8 *ptr; - - sub_80A229C(taskId, b, &ptr); - *c = *ptr; -} - -static void sub_80A2318(u8 a, u8 b) -{ - u16 var = ~gBitTable[b]; - - gTasks[a].data[0] &= var; -} - -static void sub_80A2348(u8 taskId, u8 b) -{ - gTasks[taskId].data[0] |= gBitTable[b]; -} - -static bool8 sub_80A2370(u8 taskId, u8 b) -{ - u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b]; - - if (var != 0) - return TRUE; - else - return FALSE; -} - -static void npc_obj_offscreen_culling_and_flag_update(u8 a, const u8 *movementScript) -{ - gUnknown_020384F8[a] = movementScript; -} - -static const u8 *sub_80A23B8(u8 a) -{ - return gUnknown_020384F8[a]; -} - -static void sub_80A23C8(u8 taskId, u8 b, u8 mapObjId, const u8 *movementScript) -{ - sub_80A2318(taskId, b); - npc_obj_offscreen_culling_and_flag_update(b, movementScript); - sub_80A22D0(taskId, b, mapObjId); -} - -static void UnfreezeObjects(u8 taskId) -{ - u8 *pMapObjId; - u8 i; - - pMapObjId = (u8 *)&gTasks[taskId].data[1]; - for (i = 0; i < 16; i++, pMapObjId++) - { - if (*pMapObjId != 0xFF) - UnfreezeMapObject(&gMapObjects[*pMapObjId]); - } -} - -static void Task_80A244C(u8 taskId) -{ - u8 i; - u8 var; - - for (i = 0; i < 16; i++) - { - sub_80A22F4(taskId, i, &var); - if (var != 0xFF) - sub_80A2490(taskId, i, var, sub_80A23B8(i)); - } -} - -static void sub_80A2490(u8 taskId, u8 b, u8 mapObjId, const u8 *d) -{ - u8 var; - - if (FieldObjectIsSpecialAnimActive(&gMapObjects[mapObjId]) - && !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId])) - return; - - var = *d; - if (var == 0xFE) - { - sub_80A2348(taskId, b); - FreezeMapObject(&gMapObjects[mapObjId]); - } - else - { - if (!FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], var)) - { - d++; - npc_obj_offscreen_culling_and_flag_update(b, d); - } - } -} diff --git a/src/field/secret_base.c b/src/field/secret_base.c deleted file mode 100644 index 210d49835..000000000 --- a/src/field/secret_base.c +++ /dev/null @@ -1,1716 +0,0 @@ -#include "global.h" -#include "constants/decorations.h" -#include "secret_base.h" -#include "decoration.h" -#include "constants/species.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_fadetransition.h" -#include "field_player_avatar.h" -#include "field_specials.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "fldeff_decoration.h" -#include "link.h" -#include "main.h" -#include "sound.h" -#include "constants/songs.h" -#include "constants/maps.h" -#include "map_name_popup.h" -#include "menu.h" -#include "menu_helpers.h" -#include "metatile_behavior.h" -#include "new_game.h" -#include "palette.h" -#include "pokemon.h" -#include "overworld.h" -#include "script.h" -#include "sound.h" -#include "constants/species.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "constants/vars.h" - - -static void sub_80BC7D8(u8 taskId); -static void sub_80BC824(u8 taskId); -static u8 sub_80BC948(u8 a); -static void sub_80BC980(u8 taskId); -static void sub_80BC9E4(u8 taskId); -static void sub_80BCA84(u8); -static void sub_80BCAEC(u8 taskId); -static void sub_80BCB90(u8); -static void sub_80BCBC0(u8); -static void sub_80BCBF8(u8 taskId); -static void sub_80BCC54(u8 taskId); -static void Task_SecretBasePC_Registry(u8 taskId); - -extern u8 gUnknown_0815F399[]; -extern u8 gUnknown_0815F49A[]; -EWRAM_DATA u8 gUnknown_020387DC = 0; - -const struct -{ - u16 unk_083D1358_0; - u16 unk_083D1358_1; -} gUnknown_083D1358[] = { - {0x26, 0x36}, - {0x27, 0x37}, - {0x1a0, 0x1a1}, - {0x1a8, 0x1a9}, - {0x1b0, 0x1b1}, - {0x208, 0x210}, - {0x271, 0x278} -}; - - -const u8 gUnknown_083D1374[] = { - MAP_NUM(SECRET_BASE_RED_CAVE1), 0, 1, 3, - MAP_NUM(SECRET_BASE_RED_CAVE2), 0, 5, 9, - MAP_NUM(SECRET_BASE_RED_CAVE3), 0, 1, 3, - MAP_NUM(SECRET_BASE_RED_CAVE4), 0, 7, 13, - MAP_NUM(SECRET_BASE_BROWN_CAVE1), 0, 2, 3, - MAP_NUM(SECRET_BASE_BROWN_CAVE2), 0, 9, 2, - MAP_NUM(SECRET_BASE_BROWN_CAVE3), 0, 13, 4, - MAP_NUM(SECRET_BASE_BROWN_CAVE4), 0, 1, 2, - MAP_NUM(SECRET_BASE_BLUE_CAVE1), 0, 1, 3, - MAP_NUM(SECRET_BASE_BLUE_CAVE2), 0, 1, 2, - MAP_NUM(SECRET_BASE_BLUE_CAVE3), 0, 3, 15, - MAP_NUM(SECRET_BASE_BLUE_CAVE4), 0, 3, 14, - MAP_NUM(SECRET_BASE_YELLOW_CAVE1), 0, 9, 3, - MAP_NUM(SECRET_BASE_YELLOW_CAVE2), 0, 8, 7, - MAP_NUM(SECRET_BASE_YELLOW_CAVE3), 0, 3, 6, - MAP_NUM(SECRET_BASE_YELLOW_CAVE4), 0, 5, 9, - MAP_NUM(SECRET_BASE_TREE1), 0, 2, 3, - MAP_NUM(SECRET_BASE_TREE2), 0, 5, 6, - MAP_NUM(SECRET_BASE_TREE3), 0, 15, 3, - MAP_NUM(SECRET_BASE_TREE4), 0, 4, 10, - MAP_NUM(SECRET_BASE_SHRUB1), 0, 3, 3, - MAP_NUM(SECRET_BASE_SHRUB2), 0, 1, 2, - MAP_NUM(SECRET_BASE_SHRUB3), 0, 7, 8, - MAP_NUM(SECRET_BASE_SHRUB4), 0, 9, 6 -}; - -const struct MenuAction2 gUnknown_083D13D4[] = { - {SecretBaseText_DelRegist, sub_80BCA84}, - {gUnknownText_Exit, sub_80BCBF8} -}; - -const struct YesNoFuncTable gUnknown_083D13E4 = { - sub_80BCB90, - sub_80BCBC0 -}; - -const u8 gUnknown_083D13EC[] = { - 0x23,0x24,0xF,0x1F,0x21,0x2F,0xE,0x14,0x20,0x22,0x0,0x0 -}; - -extern void *gUnknown_0300485C; -extern u8 gUnknown_081A2E14[]; -extern u8 UnknownString_81A1BB2[]; -extern u8 UnknownString_81A1F67[]; -extern u8 UnknownString_81A2254[]; -extern u8 UnknownString_81A25C3[]; -extern u8 UnknownString_81A2925[]; -extern u8 UnknownString_81A1D74[]; -extern u8 UnknownString_81A20C9[]; -extern u8 UnknownString_81A2439[]; -extern u8 UnknownString_81A2B2A[]; -extern u8 UnknownString_81A2754[]; - - -void ClearSecretBase(struct SecretBaseRecord *record) -{ - u16 i; - u16 j; - - record->secretBaseId = 0; - for (i = 0; i < OT_NAME_LENGTH; i++) - record->playerName[i] = 0xff; - for (i = 0; i < 4; i++) - record->trainerId[i] = 0x00; - record->sbr_field_e = 0; - record->sbr_field_10 = 0; - record->sbr_field_11 = 0; - record->sbr_field_1_0 = 0; - record->gender = 0; - record->sbr_field_1_5 = 0; - record->sbr_field_1_6 = 0; - for (i = 0; i < 16; i++) - { - record->decorations[i] = 0; - record->decorationPos[i] = 0; - } - for (i = 0; i < 6; i++) - { - for (j = 0; j < 4; j++) - record->partyMoves[i * 4 + j] = 0; - record->partyPersonality[i] = 0; - record->partyEVs[i] = 0; - record->partySpecies[i] = 0; - record->partyHeldItems[i] = 0; - record->partyLevels[i] = 0; - } -} - -void ResetSecretBase(u8 idx) -{ - ClearSecretBase(&gSaveBlock1.secretBases[idx]); -} - -void ResetSecretBases(void) -{ - u16 i; - for (i = 0; i < MAX_SECRET_BASES; i++) - ResetSecretBase(i); -} - -void sub_80BB5D0(void) -{ - gUnknown_020387DC = gSpecialVar_0x8004; -} - -void sub_80BB5E4(void) -{ - u16 i; - - gSpecialVar_Result = 0; - for (i = 0; i < MAX_SECRET_BASES; i++) - { - if (gUnknown_020387DC == gSaveBlock1.secretBases[i].secretBaseId) - { - gSpecialVar_Result = 1; - VarSet(VAR_CURRENT_SECRET_BASE, i); - break; - } - } -} - -void sub_80BB63C(void) -{ - if (gSaveBlock1.secretBases[0].secretBaseId) - gSpecialVar_Result = 1; - else - gSpecialVar_Result = 0; -} - -u8 sub_80BB66C(void) -{ - s16 x, y; - s16 v0; - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF; - if (v0 == 0x90 || v0 == 0x91) - return 1; - else if (v0 == 0x92 || v0 == 0x93) - return 2; - else if (v0 == 0x9a || v0 == 0x9b) - return 3; - else if (v0 == 0x94 || v0 == 0x95) - return 4; - else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d) - return 5; - else if (v0 == 0x98 || v0 == 0x99) - return 6; - return 0; -} - -void sub_80BB70C(void) -{ - gSpecialVar_0x8007 = sub_80BB66C(); -} - -s16 unref_sub_80BB724(u16 *a0, u8 a1) -{ - u16 v2; - - for (v2 = 0; v2 < 0x200; v2++) - { - if ((a0[v2] & 0xFFF) == a1) - return v2; - } - return -1; -} - -void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) -{ - s16 x, y; - - for (y=0; yheight; y++) - { - for (x=0; xwidth; x++) - { - if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) - { - *arg1 = x; - *arg2 = y; - return; - } - } - } -} - -void sub_80BB800(void) -{ - s16 x, y; - s16 tile_id; - u16 idx; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - tile_id = MapGridGetMetatileIdAt(x, y); - for (idx = 0; idx < 7; idx++) - { - if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) - { - MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); - CurrentMapDrawMetatileAt(x, y); - return; - } - } - for (idx = 0; idx < 7; idx++) - { - if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) - { - MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); - CurrentMapDrawMetatileAt(x, y); - return; - } - } -} - -u8 sub_80BB8A8(u8 *arg1) -{ - u8 idx; - - for (idx=0; idx<7; idx++) - { - if (arg1[idx] == EOS) - return idx; - } - return 7; -} - -void sub_80BB8CC(void) -{ - u8 nameLength; - u16 idx; - - gSaveBlock1.secretBases[0].secretBaseId = gUnknown_020387DC; - for (idx=0; idx<4; idx++) - gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; - VarSet(VAR_CURRENT_SECRET_BASE, 0); - nameLength = sub_80BB8A8(gSaveBlock2.playerName); - memset(gSaveBlock1.secretBases[0].playerName, 0xFF, OT_NAME_LENGTH); - StringCopyN(gSaveBlock1.secretBases[0].playerName, gSaveBlock2.playerName, nameLength); - gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender; - VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); -} - -void sub_80BB970(struct MapEvents *events) -{ - u16 bgevidx, idx, jdx; - s16 tile_id; - - for (bgevidx = 0; bgevidx < events->bgEventCount; bgevidx++) - { - if (events->bgEvents[bgevidx].kind == 8) - { - for (jdx = 0; jdx < MAX_SECRET_BASES; jdx++) - { - if (gSaveBlock1.secretBases[jdx].secretBaseId == events->bgEvents[bgevidx].bgUnion.secretBaseId) - { - tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); - for (idx = 0; idx < 7; idx++) - { - if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) - { - MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); - break; - } - } - break; - } - } - } - } -} - -void sub_80BBA14(void) -{ - s8 idx = 4 * (gUnknown_020387DC / 10); - warp1_set_2(MAP_GROUP(SECRET_BASE_RED_CAVE1), gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); -} - -void sub_80BBA48(u8 taskid) -{ - u16 curbaseid; - switch (gTasks[taskid].data[0]) - { - case 0: - gTasks[taskid].data[0] = 1; - break; - case 1: - if (!gPaletteFade.active) - gTasks[taskid].data[0] = 2; - break; - case 2: - curbaseid = VarGet(VAR_CURRENT_SECRET_BASE); - if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) - gSaveBlock1.secretBases[curbaseid].sbr_field_10++; - sub_80BBA14(); - warp_in(); - gFieldCallback = sub_8080990; - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskid); - break; - } -} - -void sub_80BBAF0(void) -{ - CreateTask(sub_80BBA48, 0); - FadeScreen(1, 0); - saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); -} - -bool8 sub_80BBB24(void) -{ - if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE && VarGet(VAR_0x4097) == 0) - return FALSE; - return TRUE; -} - -void sub_80BBB50(u8 taskid) -{ - FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); - if (IsWeatherNotFadingIn() == 1) - { - EnableBothScriptContexts(); - DestroyTask(taskid); - } -} - -void sub_80BBB90(void) -{ - s16 x, y; - - ScriptContext2_Enable(); - HideMapNamePopup(); - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20); - CurrentMapDrawMetatileAt(x + 7, y + 7); - pal_fill_black(); - CreateTask(sub_80BBB50, 0); -} - -void sub_80BBBEC(u8 taskid) -{ - s8 idx; - - if (!gPaletteFade.active) - { - idx = 4 * (gUnknown_020387DC / 10); - Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); - warp_in(); - gFieldCallback = sub_80BBB90; - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskid); - } -} - -void sub_80BBC78(void) -{ - u8 taskid = CreateTask(sub_80BBBEC, 0); - gTasks[taskid].data[0] = 0; - FadeScreen(1, 0); -} - -bool8 CurrentMapIsSecretBase(void) -{ - if (gSaveBlock1.location.mapGroup == MAP_GROUP(SECRET_BASE_SHRUB4) && (u8)(gSaveBlock1.location.mapNum) <= MAP_NUM(SECRET_BASE_SHRUB4)) - return TRUE; - return FALSE; -} - -void sub_80BBCCC(u8 flagIn) -{ - u16 curBaseId; - u16 x, y; - - if (CurrentMapIsSecretBase()) - { - curBaseId = VarGet(VAR_CURRENT_SECRET_BASE); - for (x = 0; x < 16; x++) - { - if (gSaveBlock1.secretBases[curBaseId].decorations[x] > 0 - && gSaveBlock1.secretBases[curBaseId].decorations[x] <= 0x78 - && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].permission != DECORPERM_SOLID_MAT) - { - sub_80FF394( - (gSaveBlock1.secretBases[curBaseId].decorationPos[x] >> 4) + 7, - (gSaveBlock1.secretBases[curBaseId].decorationPos[x] & 0xF) + 7, - gSaveBlock1.secretBases[curBaseId].decorations[x]); - } - } - if (curBaseId != 0) - { - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); - } - else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) - { - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); - } - } -} - -void sub_80BBDD0(void) -{ - u8 *roomdecor; - u8 *roomdecorpos; - u8 decidx; - u8 objid = 0; - u8 metatile; - u8 permission; - u8 ndecor; - u16 curBase = VarGet(VAR_CURRENT_SECRET_BASE); - - if (!CurrentMapIsSecretBase()) - { - roomdecor = gSaveBlock1.playerRoomDecor; - roomdecorpos = gSaveBlock1.playerRoomDecorPos; - ndecor = 12; - } - else - { - roomdecor = gSaveBlock1.secretBases[curBase].decorations; - roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; - ndecor = 16; - } - for (decidx = 0; decidx < ndecor; decidx++) - { - if (roomdecor[decidx] != DECOR_NONE) - { - permission = gDecorations[roomdecor[decidx]].permission; - if (permission == DECORPERM_SOLID_MAT) - { - for (objid = 0; objid < gMapHeader.events->mapObjectCount; objid++) - { - if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) - break; - } - if (objid != gMapHeader.events->mapObjectCount) - { - gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; - gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; - metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); - if (sub_80572D8(metatile) == TRUE || sub_80572EC(metatile) == TRUE) - { - gSpecialVar_Result = gMapHeader.events->mapObjects[objid].graphicsId + VAR_0x3F20; - VarSet(gSpecialVar_Result, gDecorations[roomdecor[decidx]].tiles[0]); - gSpecialVar_Result = gMapHeader.events->mapObjects[objid].localId; - FlagClear(gSpecialVar_0x8004 + 0xAE); - show_sprite(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - sub_805C0F8(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); - sub_805C78C(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - gSpecialVar_0x8004 ++; - } - } - } - } - } -} - -void sub_80BBFA4(void) -{ - int curBase = VarGet(VAR_CURRENT_SECRET_BASE); - VarSet(VAR_OBJ_GFX_ID_F, gUnknown_083D13EC[sub_80BCCA4(curBase)]); -} - -void sub_80BBFD8(struct MapPosition *position, struct MapEvents *events) -{ - s16 bgevtidx; - - for (bgevtidx = 0; bgevtidx < events->bgEventCount; bgevtidx++) - { - if (events->bgEvents[bgevtidx].kind == 8 && position->x == events->bgEvents[bgevtidx].x + 7 - && position->y == events->bgEvents[bgevtidx].y + 7) - { - gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; - break; - } - } -} - -void sub_80BC038(struct MapPosition *position, struct MapEvents *events) -{ - sub_80BBFD8(position, events); - sub_80BB5E4(); - ScriptContext1_SetupScript(gUnknown_081A2E14); -} - -bool8 sub_80BC050(void) -{ - sub_80BB5D0(); - sub_80BB5E4(); - if (gSpecialVar_Result == 1) - return FALSE; - return TRUE; -} - -void sub_80BC074(u8 taskid) -{ - switch (gTasks[taskid].data[0]) - { - case 0: - ScriptContext2_Enable(); - gTasks[taskid].data[0] = 1; - break; - case 1: - if (!gPaletteFade.active) - gTasks[taskid].data[0] = 2; - break; - case 2: - copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); - warp_in(); - gFieldCallback = mapldr_default; - SetMainCallback2(CB2_LoadMap); - ScriptContext2_Disable(); - DestroyTask(taskid); - break; - } -} - -void sub_80BC0F8(void) -{ - CreateTask(sub_80BC074, 0); - FadeScreen(1, 0); -} - -void sub_80BC114(void) -{ - if (gSaveBlock1.secretBases[0].secretBaseId != gUnknown_020387DC) - gSpecialVar_Result = 1; - else - gSpecialVar_Result = 0; -} - -u8 sub_80BC14C(u8 sbid) -{ - s16 idx; - - for (idx = 0; idx < MAX_SECRET_BASES; idx++) - { - if (gSaveBlock1.secretBases[idx].secretBaseId == sbid) - return idx; - } - return 0; -} - -u8 *sub_80BC190(u8 *dest, u8 arg1) -{ - u8 local1; - u8 *str; - - local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].playerName); - - str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].playerName, local1); - str[0] = EOS; - -#if ENGLISH - return StringAppend(dest, gOtherText_PlayersBase); -#elif GERMAN - return de_sub_8073174(dest, gOtherText_PlayersBase); -#endif -} - -u8 *GetSecretBaseMapName(u8 *dest) -{ - gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].secretBaseId; - return sub_80BC190(dest, VarGet(VAR_CURRENT_SECRET_BASE)); -} - -void BufferSecretBaseOwnerName(void) -{ - u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_CURRENT_SECRET_BASE)].playerName; - u8 *var1 = gStringVar1; - u8 var2 = sub_80BB8A8(var0); - u8 *var3 = StringCopyN(var1, var0, var2); - *var3 = EOS; -} - -bool8 sub_80BC268(u8 i) -{ - if (gSaveBlock1.secretBases[i].sbr_field_1_6) - return TRUE; - else - return FALSE; -} - -u8 sub_80BC298(struct Pokemon *mon) -{ - u16 evsum = GetMonData(mon, MON_DATA_HP_EV); - evsum += GetMonData(mon, MON_DATA_ATK_EV); - evsum += GetMonData(mon, MON_DATA_DEF_EV); - evsum += GetMonData(mon, MON_DATA_SPEED_EV); - evsum += GetMonData(mon, MON_DATA_SPATK_EV); - evsum += GetMonData(mon, MON_DATA_SPDEF_EV); - return (u8)(evsum / 6); -} - -#ifdef NONMATCHING -// So much is wrong with this function. -// The compiler likes to store pointers in temp variables. That's not what it's supposed to do. -void sub_80BC300(void) -{ - u16 partyidx; - u16 moveidx; - u16 sbpartyidx = 0; - for (partyidx=0; partyidxbgEventCount; eventId++) - { - if (mapEvents->bgEvents[eventId].kind == 8 - && gSaveBlock1.secretBases[0].secretBaseId == mapEvents->bgEvents[eventId].bgUnion.secretBaseId) - { - u16 i; - s16 tileId = MapGridGetMetatileIdAt(mapEvents->bgEvents[eventId].x + 7, mapEvents->bgEvents[eventId].y + 7); - - for (i = 0; i < 7; i++) - { - if (gUnknown_083D1358[i].unk_083D1358_1 == tileId) - { - MapGridSetMetatileIdAt( - mapEvents->bgEvents[eventId].x + 7, - mapEvents->bgEvents[eventId].y + 7, - gUnknown_083D1358[i].unk_083D1358_0 | 0xc00); - break; - } - } - - DrawWholeMapView(); - break; - } - } -} - -void MoveSecretBase(void) -{ - u16 backupValue; - sub_80BC474(); - IncrementGameStat(GAME_STAT_MOVED_SECRET_BASE); - - backupValue = gSaveBlock1.secretBases[0].sbr_field_e; - ResetSecretBase(0); - gSaveBlock1.secretBases[0].sbr_field_e = backupValue; -} - -u8 sub_80BC538(void) -{ - s16 secretBaseIndex; - u8 retVal = 0; - - for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) - { - if (sub_80BC268(secretBaseIndex) == TRUE) - retVal++; - } - return retVal; -} - -void sub_80BC56C(void) -{ - if (sub_80BC268(sub_80BC14C(gUnknown_020387DC)) == TRUE) - gSpecialVar_Result = 1; - else if (sub_80BC538() > 9) - gSpecialVar_Result = 2; - else - gSpecialVar_Result = 0; -} - -void sub_80BC5BC(void) -{ - gSaveBlock1.secretBases[sub_80BC14C(gUnknown_020387DC)].sbr_field_1_6 ^= 1; - FlagSet(FLAG_DECORATION_16); -} - -void SecretBasePC_Decoration(void) -{ - CreateTask(Task_SecretBasePC_Decoration, 0); -} - -void SecretBasePC_Registry(void) -{ - CreateTask(Task_SecretBasePC_Registry, 0); -} - -void Task_SecretBasePC_Registry(u8 taskId) -{ - s16 *taskData; - - ScriptContext2_Enable(); - ClearVerticalScrollIndicatorPalettes(); - LoadScrollIndicatorPalette(); - - taskData = gTasks[taskId].data; - taskData[0] = sub_80BC538(); - if (taskData[0] != 0) - { - if (taskData[0] > 7) - taskData[3] = 7; - else - taskData[3] = taskData[0]; - - taskData[1] = 0; - taskData[2] = 0; - - Menu_EraseWindowRect(0, 0, 29, 19); - sub_80BC7D8(taskId); - - gTasks[taskId].func = sub_80BC824; - } - else - { - DisplayItemMessageOnField(taskId, gSecretBaseText_NoRegistry, sub_80BCC54, 0); - } -} - -void sub_80BC6B0(u8 taskId) -{ - u8 i; - s16 *taskData = gTasks[taskId].data; - u8 m = 0; - u8 n = 0; - - for (i = 1; i < MAX_SECRET_BASES; i++) - { - if (m == taskData[2]) - { - m = i; - break; - } - - if (sub_80BC268(i) == TRUE) - m++; - } - - for (i = m; i < MAX_SECRET_BASES; i++) - { - if (sub_80BC268(i) == TRUE) - { - sub_80BC190(gStringVar1, i); - Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3); - Menu_PrintText(gStringVar1, 18, 2 * n + 2); - if (++n == 8) - break; - } - } - - if (n < 8) - { - Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3); - Menu_PrintText(gUnknownText_Exit, 18, 2 * n + 2); - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - if (n != 7) - Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match - } - else - { - CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xbc, 0x98); - } - - if (taskData[2] == 0) - DestroyVerticalScrollIndicator(TOP_ARROW); - else - CreateVerticalScrollIndicators(TOP_ARROW, 0xbc, 0x08); -} - -void sub_80BC7D8(u8 taskId) -{ - u16 *taskData = gTasks[taskId].data; - Menu_DrawStdWindowFrame(17, 0, 29, 19); - InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); - - sub_80BC6B0(taskId); -} - -void sub_80BC824(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (taskData[1]) - { - PlaySE(SE_SELECT); - taskData[1] = Menu_MoveCursor(-1); - } - else if (taskData[2]) - { - PlaySE(SE_SELECT); - taskData[2]--; - sub_80BC6B0(taskId); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (taskData[1] == taskData[3]) - { - if (taskData[2] + taskData[1] != taskData[0]) - { - PlaySE(SE_SELECT); - taskData[2]++; - sub_80BC6B0(taskId); - } - } - else - { - PlaySE(SE_SELECT); - taskData[1] = Menu_MoveCursor(1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (taskData[1] + taskData[2] == taskData[0]) - { - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 29, 19); - sub_80BCC54(taskId); - } - else - { - Menu_DestroyCursor(); - taskData[4] = sub_80BC948(taskData[1] + taskData[2]); - sub_80BC980(taskId); - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 29, 19); - sub_80BCC54(taskId); - } -} - -u8 sub_80BC948(u8 a) -{ - u8 secretBaseIndex; - u8 count = 0; - - for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) - { - if (sub_80BC268(secretBaseIndex) == TRUE) - { - if (a == count) - { - return secretBaseIndex; - } - - count++; - } - } - - return 0; -} - -void sub_80BC980(u8 taskId) -{ - PauseVerticalScrollIndicator(TOP_ARROW); - PauseVerticalScrollIndicator(BOTTOM_ARROW); - Menu_DrawStdWindowFrame(1, 0, 12, 5); - Menu_PrintItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4); - InitMenu(0, 2, 1, 2, 0, 10); - gTasks[taskId].func = sub_80BC9E4; -} - -void sub_80BC9E4(u8 taskId) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (Menu_GetCursorPos()) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (Menu_GetCursorPos() != 1) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_083D13D4[Menu_GetCursorPos()].func(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_80BCBF8(taskId); - } -} - -void sub_80BCA84(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - DestroyVerticalScrollIndicator(TOP_ARROW); - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 29, 19); - - sub_80BC190(gStringVar1, taskData[4]); - StringExpandPlaceholders(gStringVar4, gOtherText_OkayToDeleteFromRegistry); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80BCAEC, 0); -} - -void sub_80BCAEC(u8 taskId) -{ - DisplayYesNoMenu(20, 8, 1); - DoYesNoFuncWithChoice(taskId, &gUnknown_083D13E4); -} - -void sub_80BCB10(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - Menu_EraseWindowRect(0, 0, 29, 19); - - gSaveBlock1.secretBases[taskData[4]].sbr_field_1_6 = 0; - taskData[0]--; - - if (taskData[2] > 0) - taskData[2]--; - - if (taskData[0] < 8) - taskData[3]--; - - sub_80BC7D8(taskId); - gTasks[taskId].func = sub_80BC824; -} - -void sub_80BCB90(u8 taskId) -{ - Menu_EraseWindowRect(20, 8, 26, 13); - DisplayItemMessageOnField(taskId, gOtherText_RegisteredDataDeleted, sub_80BCB10, 0); -} - -void sub_80BCBC0(u8 taskId) -{ - Menu_EraseWindowRect(0, 0, 29, 19); - - sub_80BC7D8(taskId); - gTasks[taskId].func = sub_80BC824; -} - -void sub_80BCBF8(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); - Menu_EraseWindowRect(1, 0, 12, 5); - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - - gTasks[taskId].func = sub_80BC824; -} - -void sub_80BCC54(u8 taskId) -{ - u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); - - BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(TOP_ARROW); - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - - if (curBaseIndex == 0) - ScriptContext1_SetupScript(gUnknown_0815F399); - else - ScriptContext1_SetupScript(gUnknown_0815F49A); - - DestroyTask(taskId); -} - -u8 sub_80BCCA4(u8 secretBaseIndex) -{ - return (gSaveBlock1.secretBases[secretBaseIndex].playerName[OT_NAME_LENGTH] % 5) - + gSaveBlock1.secretBases[secretBaseIndex].gender * 5; -} - -const u8 *GetSecretBaseTrainerLoseText(void) -{ - u8 param = sub_80BCCA4(VarGet(VAR_CURRENT_SECRET_BASE)); - if (param == 0) return UnknownString_81A1BB2; - if (param == 1) return UnknownString_81A1F67; - if (param == 2) return UnknownString_81A2254; - if (param == 3) return UnknownString_81A25C3; - if (param == 4) return UnknownString_81A2925; - if (param == 5) return UnknownString_81A1D74; - if (param == 6) return UnknownString_81A20C9; - if (param == 7) return UnknownString_81A2439; - if (param == 8) return UnknownString_81A2754; - return UnknownString_81A2B2A; -} - -// Debugging function to test secret base battles. -void unref_sub_80BCD7C(u8 secretBaseIndex) -{ - u16 i; - - for (i = 0; i < 1; i++) - { - gSaveBlock1.secretBases[secretBaseIndex].partyPersonality[i] = i + 1; - gSaveBlock1.secretBases[secretBaseIndex].partyMoves[i * 4] = i + 1; - gSaveBlock1.secretBases[secretBaseIndex].partySpecies[i] = SPECIES_TREECKO; - gSaveBlock1.secretBases[secretBaseIndex].partyHeldItems[i] = i + 1; - gSaveBlock1.secretBases[secretBaseIndex].partyLevels[i] = i + 5; - gSaveBlock1.secretBases[secretBaseIndex].partyEVs[i] = i * 5; - } -} - -void sub_80BCE1C(void) -{ - u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); - - sub_810FB10(1); - CreateSecretBaseEnemyParty(&gSaveBlock1.secretBases[curBaseIndex]); -} - -void sub_80BCE4C() -{ - gSaveBlock1.secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].sbr_field_1_5 = gSpecialVar_Result; -} - -void sub_80BCE90() -{ - u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); - - if (!FlagGet(FLAG_DAILY_UNKNOWN_8C2)) - { - u8 i; - - for (i = 0; i < MAX_SECRET_BASES; i++) - gSaveBlock1.secretBases[i].sbr_field_1_5 = 0; - - FlagSet(FLAG_DAILY_UNKNOWN_8C2); - } - - gSpecialVar_0x8004 = sub_80BCCA4(curBaseIndex); - gSpecialVar_Result = gSaveBlock1.secretBases[curBaseIndex].sbr_field_1_5; -} - -void sub_80BCF1C(u8 taskId) -{ - s16 x, y; - u32 behavior; - s16 *taskData = gTasks[taskId].data; - - switch (taskData[1]) - { - case 0: - PlayerGetDestCoords(&taskData[2], &taskData[3]); - taskData[1] = 1; - break; - case 1: - PlayerGetDestCoords(&x, &y); - if (x != taskData[2] || y != taskData[3]) - { - taskData[2] = x; - taskData[3] = y; - - behavior = MapGridGetMetatileBehaviorAt(x, y); - if (sub_8057350(behavior) == TRUE) - DoYellowCave4Sparkle(); - else if (sub_8057314(behavior) == TRUE) - sub_80C68A4(MapGridGetMetatileIdAt(x, y), x, y); - else if (sub_8057328(behavior) == TRUE) - sub_80C6A54(x, y); - else if (sub_805733C(behavior) == TRUE) - DoDecorationSoundEffect(MapGridGetMetatileIdAt(x, y)); - } - break; - case 2: - if (!FieldEffectActiveListContains(taskData[4])) - taskData[1] = 1; - break; - } -} - -void sub_80BD034(u8 i, struct SecretBaseRecord *secretBase) -{ - gSaveBlock1.secretBases[i] = *secretBase; - gSaveBlock1.secretBases[i].sbr_field_1_6 = 2; -} - -bool8 sub_80BD070(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - if (baseA->trainerId[i] != baseB->trainerId[i]) - return FALSE; - } - - return TRUE; -} - -bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) -{ - u8 i; - - for (i = 0; i < OT_NAME_LENGTH && (baseA->playerName[i] != 0xFF || baseB->playerName[i] != 0xFF); i++) - { - if (baseA->playerName[i] != baseB->playerName[i]) - return FALSE; - } - - return TRUE; -} - -bool8 sub_80BD0EC(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) -{ - if (baseA->gender == baseB->gender && sub_80BD070(baseA, baseB) && sub_80BD0A0(baseA, baseB)) - return TRUE; - else - return FALSE; -} - -s16 sub_80BD12C(u8 secretBaseId) -{ - s16 i; - - for (i = 0; i < MAX_SECRET_BASES; i++) - { - if (gSaveBlock1.secretBases[i].secretBaseId == secretBaseId) - return i; - } - - return -1; -} - -u8 sub_80BD170(void) -{ - s16 i; - - for (i = 1; i < MAX_SECRET_BASES; i++) - { - if (gSaveBlock1.secretBases[i].secretBaseId == 0) - return i; - } - - return 0; -} - -u8 sub_80BD1B0(void) -{ - s16 i; - - for (i = 1; i < MAX_SECRET_BASES; i++) - { - if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 0 && gSaveBlock1.secretBases[i].sbr_field_1_0 == 0) - return i; - } - - return 0; -} - -u8 sub_80BD1FC(struct SecretBaseRecord *secretBase) -{ - s16 secretBaseIndex; - - if (secretBase->secretBaseId == 0) - return 0; - - secretBaseIndex = sub_80BD12C(secretBase->secretBaseId); - if (secretBaseIndex != 0) - { - if (secretBaseIndex != -1) - { - if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_0 == 1) - return 0; - if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_6 != 2 - || secretBase->sbr_field_1_0 == 1) - { - sub_80BD034(secretBaseIndex, secretBase); - return secretBaseIndex; - } - } - else - { - secretBaseIndex = sub_80BD170(); - if (secretBaseIndex != 0) - { - sub_80BD034(secretBaseIndex, secretBase); - return secretBaseIndex; - } - secretBaseIndex = sub_80BD1B0(); - if (secretBaseIndex) - { - sub_80BD034(secretBaseIndex, secretBase); - return secretBaseIndex; - } - } - } - - return 0; -} - -void sub_80BD280(void) -{ - u8 i; - u8 j; - struct SecretBaseRecord temp; - struct SecretBaseRecord *secretBases = gSaveBlock1.secretBases; - - for (i = 1; i < MAX_SECRET_BASES - 1; i++) - { - for (j = i + 1; j < MAX_SECRET_BASES; j++) - { - if ((!secretBases[i].sbr_field_1_6 && secretBases[j].sbr_field_1_6 == 1) - || (secretBases[i].sbr_field_1_6 == 2 && secretBases[j].sbr_field_1_6 != 2)) - { - temp = secretBases[i]; - secretBases[i] = secretBases[j]; - secretBases[j] = temp; - } - } - } -} - -void sub_80BD328(struct SecretBaseRecord *secretBases, u8 b) -{ - u16 i; - - for (i = 1; i < MAX_SECRET_BASES; i++) - { - if (secretBases[i].sbr_field_1_6 == b) - sub_80BD1FC(&secretBases[i]); - } -} - -bool8 sub_80BD358(struct SecretBaseRecord *secretBase) -{ - u8 i; - - if (!secretBase->secretBaseId) - return FALSE; - - if (secretBase->secretBaseId && secretBase->gender != gSaveBlock2.playerGender) - return FALSE; - - // Check if the player's trainer Id matches the secret base's id. - for (i = 0; i < 4; i++) - { - if (secretBase->trainerId[i] != gSaveBlock2.playerTrainerId[i]) - return FALSE; - } - - for (i = 0; i < OT_NAME_LENGTH && (secretBase->playerName[i] != 0xFF || gSaveBlock2.playerName[i] != 0xFF); i++) - { - if (secretBase->playerName[i] != gSaveBlock2.playerName[i]) - return FALSE; - } - - return TRUE; -} - -void sub_80BD3DC(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) -{ - u8 i; - u8 var1 = 0; - - for (i = 0; i < MAX_SECRET_BASES; i++) - { - if ((var1 & 1) == 0) - { - if (sub_80BD358(&basesA[i]) == TRUE) - { - ClearSecretBase(&basesA[i]); - var1 |= 1; - } - } - - if ((var1 & 2) == 0) - { - if (sub_80BD358(&basesB[i]) == TRUE) - { - ClearSecretBase(&basesB[i]); - var1 |= 2; - } - } - - if ((var1 & 4) == 0) - { - if (sub_80BD358(&basesC[i]) == TRUE) - { - ClearSecretBase(&basesC[i]); - var1 |= 4; - } - } - - if (var1 == 7) - break; - } -} - -bool8 sub_80BD494(struct SecretBaseRecord *base, struct SecretBaseRecord *secretBases, u8 c) -{ - u8 i; - - for (i = 0; i < MAX_SECRET_BASES; i++) - { - if (secretBases[i].secretBaseId) - { - if (sub_80BD0EC(base, &secretBases[i]) == TRUE) - { - if (c == 0) - { - ClearSecretBase(&secretBases[i]); - return FALSE; - } - - if (base->sbr_field_e > secretBases[i].sbr_field_e) - { - ClearSecretBase(&secretBases[i]); - return FALSE; - } - - secretBases[i].sbr_field_1_0 = base->sbr_field_1_0; - - ClearSecretBase(base); - return TRUE; - } - } - } - - return FALSE; -} - -void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC, struct SecretBaseRecord *basesD) -{ - u8 i; - - for (i = 1; i < MAX_SECRET_BASES; i++) - { - if (basesA[i].secretBaseId) - { - if (basesA[i].sbr_field_1_6 == 1) - basesA[i].sbr_field_1_0 = 1; - - if (!sub_80BD494(&basesA[i], basesB, i)) - { - if (!sub_80BD494(&basesA[i], basesC, i)) - sub_80BD494(&basesA[i], basesD, i); - } - } - } - - for (i = 0; i < MAX_SECRET_BASES; i++) - { - if (basesB[i].secretBaseId) - { - basesB[i].sbr_field_1_5 = 0; - - if (!sub_80BD494(&basesB[i], basesC, i)) - sub_80BD494(&basesB[i], basesD, i); - } - } - - for (i = 0; i < MAX_SECRET_BASES; i++) - { - if (basesC[i].secretBaseId) - { - basesC[i].sbr_field_1_5 = 0; - sub_80BD494(&basesC[i], basesD, i); - } - - if (basesD[i].secretBaseId) - basesD[i].sbr_field_1_5 = 0; - } -} - -void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) -{ - sub_80BD3DC(basesA, basesB, basesC); - sub_80BD514(gSaveBlock1.secretBases, basesA, basesB, basesC); - - sub_80BD1FC(basesA); - sub_80BD1FC(basesB); - sub_80BD1FC(basesC); - - sub_80BD328(basesA, 1); - sub_80BD328(basesB, 1); - sub_80BD328(basesC, 1); - - sub_80BD328(basesA, 0); - sub_80BD328(basesB, 0); - sub_80BD328(basesC, 0); -} - -void sub_80BD674(void *playerRecords, u32 size, u8 c) -{ - if ( -#if DEBUG - gUnknown_020297ED != 0 || -#endif - FlagGet(FLAG_RECEIVED_SECRET_POWER)) - { - u16 i; - - u8 numLinkedPlayers = GetLinkPlayerCount(); - switch (numLinkedPlayers) - { - case 2: - memset(playerRecords + size * 2, 0, size); - memset(playerRecords + size * 3, 0, size); - break; - case 3: - memset(playerRecords + size * 3, 0, size); - break; - } - - switch (c) - { - case 0: - sub_80BD610(playerRecords + size, playerRecords + size * 2, playerRecords + size * 3); - break; - case 1: - sub_80BD610(playerRecords + size * 2, playerRecords + size * 3, playerRecords); - break; - case 2: - sub_80BD610(playerRecords + size * 3, playerRecords, playerRecords + size); - break; - case 3: - sub_80BD610(playerRecords, playerRecords + size, playerRecords + size * 2); - break; - } - - for (i = 1; i < MAX_SECRET_BASES; i++) - { - if (gSaveBlock1.secretBases[i].sbr_field_1_0 == 1) - { - gSaveBlock1.secretBases[i].sbr_field_1_6 = 1; - gSaveBlock1.secretBases[i].sbr_field_1_0 = 0; - } - } - - sub_80BD280(); - - for (i = 1; i < MAX_SECRET_BASES; i++) - { - if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 2) - gSaveBlock1.secretBases[i].sbr_field_1_6 = 0; - } - - if (gSaveBlock1.secretBases[0].sbr_field_e != 0xFFFF) - gSaveBlock1.secretBases[0].sbr_field_e++; - } -} diff --git a/src/field/shop.c b/src/field/shop.c deleted file mode 100644 index 87dbbeb97..000000000 --- a/src/field/shop.c +++ /dev/null @@ -1,1251 +0,0 @@ -#include "global.h" -#include "shop.h" -#include "decompress.h" -#include "field_fadetransition.h" -#include "field_weather.h" -#include "item_menu.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "money.h" -#include "palette.h" -#include "script.h" -#include "sound.h" -#include "sprite.h" -#include "strings.h" -#include "task.h" -#include "tv.h" -#include "scanline_effect.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "item.h" -#include "decoration.h" -#include "constants/items.h" -#include "constants/songs.h" -#include "overworld.h" -#include "decoration_inventory.h" -#include "field_camera.h" -#include "ewram.h" - -extern bool8 SellMenu_QuantityRoller(u8, u8); - -extern u8 gBuyMenuFrame_Gfx[]; -extern u16 gBuyMenuFrame_Tilemap[]; -extern u16 gMenuMoneyPal[16]; - -static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode); -static void Shop_PrintItemDescText(void); -static void Task_ReturnToBuyMenu(u8); -static void Task_ExitBuyMenu(u8); -static void Task_ExitBuyMenuDoFade(u8); -static void Task_UpdatePurchaseHistory(u8); -static void Task_HandleShopMenuBuy(u8 taskId); -static void Task_HandleShopMenuSell(u8 taskId); -static void Task_HandleShopMenuQuit(u8 taskId); -static void Task_DoItemPurchase(u8 taskId); -static void Task_CancelItemPurchase(u8 taskId); -static void Task_DoBuySellMenu(u8); -static void Shop_FadeAndRunBuySellCallback(u8); -static void BuyMenuDrawGraphics(void); -static void sub_80B3240(void); -static void DrawFirstMartScrollIndicators(void); -static void Shop_DrawViewport(void); -static void Shop_InitMenus(int, int); -static void Shop_PrintItemDesc(void); -static void Shop_DoCursorAction(u8); -static void Shop_LoadViewportObjects(void); -static void Shop_AnimViewportObjects(void); - -// iwram -static struct MartInfo gMartInfo; - -// ewram -EWRAM_DATA u32 gMartTotalCost = 0; -EWRAM_DATA s16 gMartViewportObjects[16][4] = {0}; -EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0}; -EWRAM_DATA u8 gMartPurchaseHistoryId = 0; - -EWRAM_DATA u8 gUnknown_02038731 = 0; // This really should be in fldeff_escalator, but being in a new file aligns the ewram, which doesnt match the ROM. - -// rodata -static const struct MenuAction2 sBuySellQuitMenuActions[] = -{ - { MartText_Buy, Task_HandleShopMenuBuy }, - { MartText_Sell, Task_HandleShopMenuSell }, - { MartText_Quit2, Task_HandleShopMenuQuit }, -}; - -static const u8 gMartBuySellOptionList[] = {SHOP_BUY, SHOP_SELL, SHOP_EXIT}; -static const u8 gMartBuyNoSellOptionList[] = {SHOP_BUY, SHOP_EXIT}; - -static const u16 gUnusedMartArray[] = {0x2, 0x3, 0x4, 0xD, 0x121, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x0, 0x0}; - -static const struct YesNoFuncTable sShopPurchaseYesNoFuncs[] = -{ - Task_DoItemPurchase, - Task_CancelItemPurchase -}; - -static u8 CreateShopMenu(u8 martType) -{ - ScriptContext2_Enable(); - gMartInfo.martType = martType; - gMartInfo.cursor = 0; - - if (martType == MART_TYPE_0) - { - gMartInfo.numChoices = 2; - Menu_DrawStdWindowFrame(0, 0, 10, 7); - Menu_PrintItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gMartBuySellOptionList); - } - else - { - gMartInfo.numChoices = 1; - Menu_DrawStdWindowFrame(0, 0, 10, 5); - Menu_PrintItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gMartBuyNoSellOptionList); - } - InitMenu(0, 1, 1, gMartInfo.numChoices + 1, 0, 9); // add 1 for cancel - - return CreateTask(Task_DoBuySellMenu, 8); -} - -static void SetShopMenuCallback(void *callbackPtr) -{ - gMartInfo.callback = callbackPtr; -} - -static void SetShopItemsForSale(const u16 *items) -{ - u16 i = 0; - - gMartInfo.itemList = items; - gMartInfo.itemCount = 0; - - while (gMartInfo.itemList[i]) - { - gMartInfo.itemCount++; - i++; - } -} - -static void Task_DoBuySellMenu(u8 taskId) -{ - const u8 taskIdConst = taskId; // why is a local const needed to match? - - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (gMartInfo.cursor) // can move cursor up? - { - PlaySE(SE_SELECT); - gMartInfo.cursor = Menu_MoveCursor(-1); - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down? - { - PlaySE(SE_SELECT); - gMartInfo.cursor = Menu_MoveCursor(1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gMartInfo.martType == MART_TYPE_0) - sBuySellQuitMenuActions[gMartBuySellOptionList[gMartInfo.cursor]].func(taskIdConst); - else - sBuySellQuitMenuActions[gMartBuyNoSellOptionList[gMartInfo.cursor]].func(taskIdConst); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - Task_HandleShopMenuQuit(taskIdConst); - } -} - -static void Task_HandleShopMenuBuy(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16; - gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics; - gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; - FadeScreen(1, 0); -} - -static void Task_HandleShopMenuSell(u8 taskId) -{ - gTasks[taskId].data[8] = (u32)ItemMenu_LoadSellMenu >> 16; - gTasks[taskId].data[9] = (u32)ItemMenu_LoadSellMenu; - gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; - FadeScreen(1, 0); -} - -static void Task_HandleShopMenuQuit(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 11, 8); - sub_80BE3BC(); - ScriptContext2_Disable(); - DestroyTask(taskId); - - if (gMartInfo.callback) - gMartInfo.callback(); // run the callback if it exists. -} - -static void Shop_FadeAndRunBuySellCallback(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2((void *)((u16)gTasks[taskId].data[8] << 16 | (u16)gTasks[taskId].data[9])); - DestroyTask(taskId); - } -} - -static void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) -{ - CreateShopMenu(gMartInfo.martType); - DestroyTask(taskId); -} - -static void Task_ReturnToMartMenu(u8 taskId) -{ - if (IsWeatherNotFadingIn() == 1) - { - if (gMartInfo.martType == MART_TYPE_2) - DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); - else - DisplayItemMessageOnField(taskId, gOtherText_AnythingElse, ReturnToShopMenuAfterExitingSellMenu, 0); - } -} - -void Shop_FadeReturnToMartMenu(void) -{ - pal_fill_black(); - CreateTask(Task_ReturnToMartMenu, 0x8); -} - -void Shop_RunExitSellMenuTask(u8 taskId) -{ - Task_ReturnToMartMenu(taskId); -} - -// unused -void Shop_LoadExitSellMenuTask(u8 taskId) -{ - gTasks[taskId].func = Task_ReturnToMartMenu; -} - -static void MainCB2(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -static void VBlankCB(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800); - DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800); - DmaCopy16Defvars(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800); -} - -static void BuyMenuDrawGraphics(void) -{ - ClearVideoCallbacks(); - ScanlineEffect_Stop(); - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - gPaletteFade.bufferTransferDisabled = 1; - - /* - THEORY: This seemingly useless loop is required in order to match this - function without hacks. The reason is because it alters the 0 optimization - of a later assignment into using 2 different 0s instead of the same register. - It is speculated that at some point Game Freak insert an artificial - breakpoint here in order to look at the contents of OAM before it is cleared, - possibly because a programmer made a mistake in shop.c which corrupted its - contents. There may have been a macro here which at one point idled on the - while(1) but was changed to 0 for release due to a define somewhere. A - while(0) also matches, but it is more correct to use do {} while(0) as it - was a fix to prevent compiler warnings on older compilers. - */ - do {} while(0); - - DmaFill32Defvars(3, 0, (void*)OAM, OAM_SIZE); - LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00)); - LZDecompressWram(gBuyMenuFrame_Tilemap, ewram18000_2); - LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal)); - FreeAllSpritePalettes(); - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); - InitMenuWindow(&gWindowTemplate_81E6DFC); - Shop_DrawViewport(); - gMartInfo.cursor = 0; - gMartInfo.choicesAbove = 0; - Menu_EraseWindowRect(0, 0, 0x20, 0x20); - OpenMoneyWindow(gSaveBlock1.money, 0, 0); - Shop_InitMenus(0, 7); - Shop_PrintItemDesc(); - DrawFirstMartScrollIndicators(); - CreateTask(Shop_DoCursorAction, 0x8); - sub_80B3240(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - SetVBlankCallback(VBlankCB); - SetMainCallback2(MainCB2); -} - -static void sub_80B3240(void) -{ - u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; - - LoadPalette(&colors[1], 0xD1, sizeof colors[1]); - LoadPalette(&colors[0], 0xD8, sizeof colors[0]); -} - -static void DrawFirstMartScrollIndicators(void) -{ - ClearVerticalScrollIndicatorPalettes(); - - if (gMartInfo.itemCount > 7) - { - CreateVerticalScrollIndicators(TOP_ARROW, 172, 12); - CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148); - SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); - } -} - -static void Shop_TryDrawVerticalScrollIndicators(void) -{ - if (gMartInfo.choicesAbove == 0) - SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); - else - SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); - - if (gMartInfo.choicesAbove + 7 >= gMartInfo.itemCount) - SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); - else - SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); -} - -// what is the point of this function? the tiles always get overwritten by BuyMenuDrawTextboxBG. -static void BuyMenuDrawTextboxBG_Old(u16 *array, s16 offset1, s16 offset2) -{ - array[offset1 + offset2] = 0xC3E1; - array[offset1 + offset2 + 1] = 0xC3E1; -} - -static void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2) -{ - // This function draws a whole 2x2 metatile. - array[offset1 + offset2] = array2[0]; // top left - array[offset1 + offset2 + 1] = array2[1]; // top right - array[offset1 + offset2 + 32] = array2[2]; // bottom left - array[offset1 + offset2 + 33] = array2[3]; // bottom right -} - -static void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) -{ - u8 tempVar4 = var4; - s16 offset1 = var1 * 2; - s16 offset2 = (var2 * 0x40) + 0x40; - - switch (tempVar4) - { - case 0: - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3); - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); - break; - case 1: - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); - break; - case 2: - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); - break; - } -} - -// used to draw the border tiles around the viewport. -static void BuyMenuDrawMapPartialMetatile(s16 var1, int var2, u16 *var3) -{ - s16 offset1 = var1 * 2; - s16 offset2 = (var2 * 0x40) + 0x40; - - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); - BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); -} - -static void Shop_DrawViewportTiles(void) -{ - s16 facingX; - s16 facingY; - s16 x; - s16 y; - - GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); - facingX -= 3; - facingY -= 3; - - for (y = 0; y < 6; y++) - { - for (x = 0; x < 7; x++) - { - u16 metatileId = MapGridGetMetatileIdAt(facingX + x, facingY + y); - - if (y != 5 && x != 6) - { - s32 r3 = MapGridGetMetatileLayerTypeAt(facingX + x, facingY + y); - - if (metatileId < 512) - BuyMenuDrawMapMetatile(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8, r3); - else - BuyMenuDrawMapMetatile(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8, r3); - } - else - { - if (metatileId < 512) - BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8); - else - BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8); - } - - if (y == 0 && x != 0 && x != 6) - BuyMenuDrawTextboxBG_Old(gBGTilemapBuffers[1], x * 2, 64); - } - } -} - -static void Shop_DrawViewport(void) -{ - ClearBGTilemapBuffers(); - Shop_LoadViewportObjects(); - Shop_AnimViewportObjects(); - Shop_DrawViewportTiles(); -} - -static void Shop_LoadViewportObjects(void) -{ - s16 facingX; - s16 facingY; - u8 playerHeight; - u8 y; - u8 x; - u8 r8 = 0; - - GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); - playerHeight = PlayerGetZCoord(); - for (y = 0; y < 16; y++) - gMartViewportObjects[y][MAP_OBJ_ID] = 16; - for (y = 0; y < 5; y++) - { - for (x = 0; x < 7; x++) - { - u8 mapObjId = GetFieldObjectIdByXYZ(facingX - 3 + x, facingY - 2 + y, playerHeight); - - if (mapObjId != 16) - { - gMartViewportObjects[r8][MAP_OBJ_ID] = mapObjId; - gMartViewportObjects[r8][X_COORD] = x; - gMartViewportObjects[r8][Y_COORD] = y; - if (gMapObjects[mapObjId].mapobj_unk_18 == 1) - gMartViewportObjects[r8][ANIM_NUM] = 0; - if (gMapObjects[mapObjId].mapobj_unk_18 == 2) - gMartViewportObjects[r8][ANIM_NUM] = 1; - if (gMapObjects[mapObjId].mapobj_unk_18 == 3) - gMartViewportObjects[r8][ANIM_NUM] = 2; - if (gMapObjects[mapObjId].mapobj_unk_18 == 4) - gMartViewportObjects[r8][ANIM_NUM] = 3; - r8++; - } - } - } -} - -static void Shop_AnimViewportObjects(void) -{ - u8 i; - - for (i = 0; i < 16; i++) // max objects? - { - if (gMartViewportObjects[i][MAP_OBJ_ID] == 16) - continue; - - StartSpriteAnim(&gSprites[AddPseudoFieldObject( - gMapObjects[gMartViewportObjects[i][MAP_OBJ_ID]].graphicsId, - SpriteCallbackDummy, - (u16)gMartViewportObjects[i][X_COORD] * 16 + 8, - (u16)gMartViewportObjects[i][Y_COORD] * 16 + 32, - 2)], - gMartViewportObjects[i][ANIM_NUM]); - } -} - -static void BuyMenuDrawTextboxBG(void) -{ - s16 i; - - for (i = 0; i < 0x400; i++) - { - if (ewram18000[i] != 0) - gBGTilemapBuffers[1][i] = ewram18000[i] + 0xC3E0; - } -} - -static void Shop_InitMenus(int firstItemId, int lastItemId) -{ - BuyMenuDrawTextboxBG(); - Shop_DisplayPriceInList(firstItemId, lastItemId, 0); - InitMenu(0, 0xE, 0x2, 0x8, gMartInfo.cursor, 0xF); -} - -// after printing the item quantity and price, restore the textbox tiles before the Yes/No prompt. -static void BuyMenuDrawTextboxBG_Restore(void) -{ - u16 i, j; - - for (i = 0; i < 8; i++) - for (j = 0; j < 14; j++) - gBGTilemapBuffers[1][32 * (i + 12) + j] = ewram18300[32 * i + j] + 0xC3E0; -} - -static void Shop_PrintItemDesc(void) -{ - Shop_PrintItemDescText(); -} - -#define tItemCount data[1] - -static void Shop_DisplayPriceInCheckoutWindow(u8 taskId) -{ - u16 itemListIndex = gMartInfo.choicesAbove + gMartInfo.cursor; - u16 itemId = gMartInfo.itemList[itemListIndex]; - u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); - - PrintMoneyAmount(gTasks[taskId].tItemCount * price, 6, 6, 11); - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 0x6; - ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].tItemCount, 1, 2); - Menu_PrintText(gOtherText_xString1, 1, 11); - sub_80A3FA0(gBGTilemapBuffers[1], 1, 11, 12, 2, 0xC3E1); -} - -static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControlCode) -{ - u8 *stringPtr = gStringVar1; - - if (hasControlCode) - { - stringPtr[0] = EXT_CTRL_CODE_BEGIN; - stringPtr[1] = 0x1; - stringPtr[2] = 0x2; - stringPtr += 3; - } - - CopyItemName(itemId, stringPtr); - - sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); - stringPtr = gStringVar1; - - if (hasControlCode) - stringPtr = &gStringVar1[3]; - - GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4); - Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1); -} - -static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasControlCode) -{ - u8 *stringPtr = gStringVar1; - - if (hasControlCode) - { - stringPtr[0] = EXT_CTRL_CODE_BEGIN; - stringPtr[1] = 0x1; - stringPtr[2] = 0x2; - stringPtr += 3; - } - - StringCopy(stringPtr, gDecorations[itemId].name); - sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); - stringPtr = gStringVar1; - - if (hasControlCode) - stringPtr = &gStringVar1[3]; - - // some names are the maximum string length for a shop item. Because there is no room for - // a 6 character price (including the currency), a sprite is instead used for anything that - // is the maximum decoration price in order to fit it on screen. - if (gDecorations[itemId].price == 10000) - { - Draw10000Sprite(0x19, var2, hasControlCode); - } - else - { - GetMoneyAmountText(stringPtr, gDecorations[itemId].price, 0x4); - Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1); - } -} - -static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode) -{ - u8 i; - - for (i = firstItemId; i <= lastItemId && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) - { - if (gMartInfo.martType == MART_TYPE_0) - Shop_DisplayNormalPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); - else - Shop_DisplayDecorationPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); - } - - if (i != 8 && gMartInfo.choicesAbove + i == gMartInfo.itemCount) - { - Menu_BlankWindowRect(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3); - Menu_PrintText(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2); - } -} - -static void Shop_PrintItemDescText(void) -{ - if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) - { - if (gMartInfo.martType == MART_TYPE_0) - { - sub_8072AB0(ItemId_GetDescription(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]), - 0x4, 0x68, 0x68, 0x30, 0); - } - else - { - sub_8072AB0(gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].description, - 0x4, 0x68, 0x68, 0x30, 0); - } - } - else - { - sub_8072AB0(gOtherText_QuitShopping, 0x4, 0x68, 0x68, 0x30, 0); - } -} - -static void Shop_DoPremierBallCheck(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - { - Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); - PlaySE(SE_SELECT); - - if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].tItemCount >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) - DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, Task_ReturnToBuyMenu, 0xC3E1); - else - Task_ReturnToBuyMenu(taskId); - } -} - -static void Shop_DoItemTransaction(u8 taskId) -{ - IncrementGameStat(GAME_STAT_SHOPPED); - RemoveMoney(&gSaveBlock1.money, gMartTotalCost); - PlaySE(SE_REGI); - UpdateMoneyWindow(gSaveBlock1.money, 0, 0); - gTasks[taskId].func = Shop_DoPremierBallCheck; -} - -static void Shop_DoPricePrintAndReturnToBuyMenu(u8 taskId) -{ - Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); - Task_ReturnToBuyMenu(taskId); -} - -static void Task_DoItemPurchase(u8 taskId) -{ - Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD); - sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0); - BuyMenuDrawTextboxBG_Restore(); - Shop_DrawViewportTiles(); - - if (IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) - { - if (gMartInfo.martType == MART_TYPE_0) - { - if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].tItemCount)) - { - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, Shop_DoItemTransaction, 0xC3E1); - Task_UpdatePurchaseHistory(taskId); - } - else - { - DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); - } - } - else // a normal mart is only type 0, so types 1 and 2 are decoration marts. - { - if (IsThereStorageSpaceForDecoration(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor])) - { - if (gMartInfo.martType == MART_TYPE_1) - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, Shop_DoItemTransaction, 0xC3E1); - else - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, Shop_DoItemTransaction, 0xC3E1); - } - else - { - StringExpandPlaceholders(gStringVar4, gOtherText_SpaceForIsFull); - DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); - } - } - } - else - { - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); - } -} - -static void Shop_DoYesNoPurchase(u8 taskId) -{ - DisplayYesNoMenu(7, 8, 1); - sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0xC3E1); - DoYesNoFuncWithChoice(taskId, sShopPurchaseYesNoFuncs); -} - -static void Task_CancelItemPurchase(u8 taskId) -{ - Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); - Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD); - sub_80A3FA0(gBGTilemapBuffers[1], 0x8, 0x9, 0x4, 0x4, 0); - Task_ReturnToBuyMenu(taskId); -} - -static void Shop_PrintPrice(u8 taskId) -{ - if (SellMenu_QuantityRoller(taskId, gMartInfo.curItemCount) == TRUE) - Shop_DisplayPriceInCheckoutWindow(taskId); - - if (gMain.newKeys & A_BUTTON) - { - gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].tItemCount; // set total cost of your purchase. - Menu_EraseWindowRect(0, 0xA, 0xD, 0xD); - sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); - BuyMenuDrawTextboxBG_Restore(); - Shop_DrawViewportTiles(); - CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].tItemCount, 0, 0x2); - ConvertIntToDecimalStringN(gStringVar3, gMartTotalCost, 0, 0x8); - StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe); - DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); - } - else if (gMain.newKeys & B_BUTTON) - { - Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); - Task_ReturnToBuyMenu(taskId); - } -} - -// set the item count in the mart info to the maximum allowed by the player's budget. -static void Shop_UpdateCurItemCountToMax(u8 taskId) -{ - u16 var; - - gTasks[taskId].tItemCount = 1; - Menu_DrawStdWindowFrame(0, 0xA, 0xD, 0xD); - Shop_DisplayPriceInCheckoutWindow(taskId); - - var = gSaveBlock1.money / (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); - if (var > 99) - gMartInfo.curItemCount = 99; - else - gMartInfo.curItemCount = var; - - gTasks[taskId].func = Shop_PrintPrice; -} - -#ifdef NONMATCHING -static void Shop_MoveItemListUp(void) -{ - u16 *r1; - u16 *r2; - register u8 *r10 asm("r10"); - s32 i; - s32 j; - struct Window *r8 = &gMenuWindow; - - r1 = r8->tilemap; - r1 += 0x1EF; - r2 = r1; - r2 += 64; - r10 = r8->tileData; - - for (i = 0; i < 14; i++) - { - for (j = 0; j < 15; j++) - { - if ((r1[j] & 0x3FF) <= r8->tileDataStartOffset + 1) - r2[j] = r8->tileDataStartOffset + 1; - else - r2[j] = r1[j] + 0x3C; - } - - r1 -= 32; - r2 -= 32; - } - - { - u8 *r1 = r10 + 0x3A20; - u8 *r2 = r1 + 0x780; - for (i = 0; i < 14; i++) - { - DmaCopy16(3, r1, r2, 0x1E0); - r2 -= 0x3C0; - r1 -= 0x3C0; - } - } -} -#else -__attribute__((naked)) -static void Shop_MoveItemListUp(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r0, _080B4020 @ =gMenuWindow\n\ - mov r8, r0\n\ - ldr r1, [r0, 0x28]\n\ - ldr r3, _080B4024 @ =0x000003de\n\ - adds r1, r3\n\ - adds r2, r1, 0\n\ - adds r2, 0x80\n\ - ldr r7, [r0, 0x24]\n\ - mov r10, r7\n\ - ldr r0, _080B4028 @ =0x000003ff\n\ - mov r9, r0\n\ - movs r6, 0xD\n\ -_080B3FAC:\n\ - adds r3, r2, 0\n\ - subs r3, 0x40\n\ - str r3, [sp]\n\ - movs r7, 0x40\n\ - negs r7, r7\n\ - adds r7, r1\n\ - mov r12, r7\n\ - adds r3, r2, 0\n\ - adds r4, r1, 0\n\ - movs r5, 0xE\n\ -_080B3FC0:\n\ - ldrh r2, [r4]\n\ - mov r1, r9\n\ - ands r1, r2\n\ - mov r7, r8\n\ - ldrh r0, [r7, 0x1A]\n\ - adds r0, 0x1\n\ - cmp r1, r0\n\ - ble _080B3FD4\n\ - adds r0, r2, 0\n\ - adds r0, 0x3C\n\ -_080B3FD4:\n\ - strh r0, [r3]\n\ - adds r3, 0x2\n\ - adds r4, 0x2\n\ - subs r5, 0x1\n\ - cmp r5, 0\n\ - bge _080B3FC0\n\ - ldr r2, [sp]\n\ - mov r1, r12\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080B3FAC\n\ - ldr r1, _080B402C @ =0x00003a20\n\ - add r1, r10\n\ - movs r0, 0xF0\n\ - lsls r0, 3\n\ - adds r2, r1, r0\n\ - ldr r3, _080B4030 @ =0x040000d4\n\ - ldr r5, _080B4034 @ =0x800000f0\n\ - ldr r4, _080B4038 @ =0xfffffc40\n\ - movs r6, 0xD\n\ -_080B3FFC:\n\ - str r1, [r3]\n\ - str r2, [r3, 0x4]\n\ - str r5, [r3, 0x8]\n\ - ldr r0, [r3, 0x8]\n\ - adds r2, r4\n\ - adds r1, r4\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080B3FFC\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B4020: .4byte gMenuWindow\n\ -_080B4024: .4byte 0x000003de\n\ -_080B4028: .4byte 0x000003ff\n\ -_080B402C: .4byte 0x00003a20\n\ -_080B4030: .4byte 0x040000d4\n\ -_080B4034: .4byte 0x800000f0\n\ -_080B4038: .4byte 0xfffffc40\n\ - .syntax divided"); -} -#endif - -#ifdef NONMATCHING -static void Shop_MoveItemListDown(void) -{ - u16 *r1; - u16 *r2; - u8 *r10; - s32 i; - s32 j; - struct Window *r8 = &gMenuWindow; - - r1 = r8->tilemap; - r1 += 0x4F; - r2 = r1; - r2 += 64; - r10 = r8->tileData; - - for (i = 0; i < 14; i++) - { - for (j = 0; j < 15; j++) - { - if ((r1[j] & 0x3FF) <= r8->tileDataStartOffset + 1) - r2[j] = r8->tileDataStartOffset + 1; - else - r2[j] = r1[j] + 0x3C; - } - - r1 += 32; - r2 += 32; - } - - { - register u8 *r1 asm("r1") = r10 + 0x960; - register u8 *r2 asm("r2") = r1; - - r1 += 0x780; - for (i = 0; i < 14; i++) - { - DmaCopy16(3, r1, r2, 0x1E0); - r1 += 0x3C0; - r2 += 0x3C0; - } - } -} -#else -__attribute__((naked)) -static void Shop_MoveItemListDown(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r0, _080B40D8 @ =gMenuWindow\n\ - mov r8, r0\n\ - ldr r2, [r0, 0x28]\n\ - adds r1, r2, 0\n\ - adds r1, 0x9E\n\ - adds r2, r1, 0\n\ - adds r1, 0x80\n\ - ldr r3, [r0, 0x24]\n\ - mov r10, r3\n\ - ldr r7, _080B40DC @ =0x000003ff\n\ - mov r9, r7\n\ - movs r6, 0xD\n\ -_080B4060:\n\ - adds r0, r2, 0\n\ - adds r0, 0x40\n\ - str r0, [sp]\n\ - movs r3, 0x40\n\ - adds r3, r1\n\ - mov r12, r3\n\ - adds r3, r2, 0\n\ - adds r4, r1, 0\n\ - movs r5, 0xE\n\ -_080B4072:\n\ - ldrh r2, [r4]\n\ - mov r1, r9\n\ - ands r1, r2\n\ - mov r7, r8\n\ - ldrh r0, [r7, 0x1A]\n\ - adds r0, 0x1\n\ - cmp r1, r0\n\ - ble _080B4086\n\ - adds r0, r2, 0\n\ - subs r0, 0x3C\n\ -_080B4086:\n\ - strh r0, [r3]\n\ - adds r3, 0x2\n\ - adds r4, 0x2\n\ - subs r5, 0x1\n\ - cmp r5, 0\n\ - bge _080B4072\n\ - ldr r2, [sp]\n\ - mov r1, r12\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080B4060\n\ - movs r1, 0x96\n\ - lsls r1, 4\n\ - add r1, r10\n\ - adds r2, r1, 0\n\ - movs r0, 0xF0\n\ - lsls r0, 3\n\ - adds r1, r0\n\ - ldr r3, _080B40E0 @ =0x040000d4\n\ - ldr r5, _080B40E4 @ =0x800000f0\n\ - movs r4, 0xF0\n\ - lsls r4, 2\n\ - movs r6, 0xD\n\ -_080B40B4:\n\ - str r1, [r3]\n\ - str r2, [r3, 0x4]\n\ - str r5, [r3, 0x8]\n\ - ldr r0, [r3, 0x8]\n\ - adds r2, r4\n\ - adds r1, r4\n\ - subs r6, 0x1\n\ - cmp r6, 0\n\ - bge _080B40B4\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B40D8: .4byte gMenuWindow\n\ -_080B40DC: .4byte 0x000003ff\n\ -_080B40E0: .4byte 0x040000d4\n\ -_080B40E4: .4byte 0x800000f0\n\ - .syntax divided"); -} -#endif - -static void Shop_DoCursorAction(u8 taskId) -{ - if (!gPaletteFade.active) - { - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) // only up can be pressed - { - if (gMartInfo.cursor == 0) - { - if (gMartInfo.choicesAbove == 0) // if there are no choices above, dont bother - return; - - PlaySE(SE_SELECT); - gMartInfo.choicesAbove--; // since cursor is at the top and there are choices above the top, scroll the menu up by updating choicesAbove. - Shop_MoveItemListUp(); - Shop_DisplayPriceInList(0, 0, 0); - Shop_PrintItemDescText(); - Shop_TryDrawVerticalScrollIndicators(); - } - else // if the cursor is not 0, choicesAbove cannot be updated yet since the cursor is at the top of the menu, so update cursor. - { - PlaySE(SE_SELECT); - gMartInfo.cursor = Menu_MoveCursor(-1); // move cursor up - Shop_PrintItemDescText(); - } - } - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) // only down can be pressed - { - if (gMartInfo.cursor == 7) // are you at the bottom of the menu? - { - if (gMartInfo.choicesAbove + gMartInfo.cursor == gMartInfo.itemCount) // are you at cancel? - return; - - PlaySE(SE_SELECT); - gMartInfo.choicesAbove++; - Shop_MoveItemListDown(); - Shop_DisplayPriceInList(7, 7, 0); - Shop_PrintItemDescText(); - Shop_TryDrawVerticalScrollIndicators(); - } - else if (gMartInfo.cursor != gMartInfo.itemCount) - { - PlaySE(SE_SELECT); - gMartInfo.cursor = Menu_MoveCursor(1); - Shop_PrintItemDescText(); - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - - if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) // did you not hit CANCEL? - { - PauseVerticalScrollIndicator(TOP_ARROW); - PauseVerticalScrollIndicator(BOTTOM_ARROW); - SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); - Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 1); - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0xC, 0xD, 0x13); - - if (gMartInfo.martType == MART_TYPE_0) - { - gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); // set 1x price - if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) - { - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge - } - else // _080B42BA - { - CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_HowManyYouWant); - DisplayItemMessageOnField(taskId, gStringVar4, Shop_UpdateCurItemCountToMax, 0xC3E1); - } - } - else // _080B428C - { - gMartTotalCost = gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].price; - - if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) - { - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge - } - else - { - StringCopy(gStringVar1, gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].name); - ConvertIntToDecimalStringN(gStringVar2, gMartTotalCost, 0, 0x8); - - if (gMartInfo.martType == MART_TYPE_1) - StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe2); - else - StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe3); - DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); - } - } - } - else - { - Task_ExitBuyMenu(taskId); - } - } - else if (gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu - { - PlaySE(SE_SELECT); - Task_ExitBuyMenu(taskId); - } - } -} - -static void Task_ReturnToBuyMenu(u8 taskId) -{ - Menu_EraseWindowRect(0, 0xE, 0x1D, 0x13); - Menu_EraseWindowRect(0, 0xA, 0xD, 0xD); - sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); - Shop_DrawViewportTiles(); - Shop_InitMenus(6, 7); - Shop_PrintItemDesc(); - StartVerticalScrollIndicators(TOP_ARROW); - StartVerticalScrollIndicators(BOTTOM_ARROW); - Shop_TryDrawVerticalScrollIndicators(); - gTasks[taskId].func = Shop_DoCursorAction; -} - -static void Task_ExitBuyMenu(u8 taskId) -{ - gFieldCallback = Shop_FadeReturnToMartMenu; - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_ExitBuyMenuDoFade; -} - -static void Task_ExitBuyMenuDoFade(u8 taskId) -{ - if (!gPaletteFade.active) - { - CloseMoneyWindow(0, 0); - BuyMenuFreeMemory(); - SetMainCallback2(c2_exit_to_overworld_2_switch); - DestroyTask(taskId); - } -} - -// Task_UpdatePurchaseHistory -static void Task_UpdatePurchaseHistory(u8 taskId) -{ - u16 i; - - for (i = 0; i < 3; i++) - { - if (gMartPurchaseHistory[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] - && gMartPurchaseHistory[i].quantity != 0) - { - if (gMartPurchaseHistory[i].quantity + gTasks[taskId].tItemCount > 255) - gMartPurchaseHistory[i].quantity = 255; - else - gMartPurchaseHistory[i].quantity += gTasks[taskId].tItemCount; - return; - } - } - - if (gMartPurchaseHistoryId < 3) - { - gMartPurchaseHistory[gMartPurchaseHistoryId].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]; - gMartPurchaseHistory[gMartPurchaseHistoryId].quantity = gTasks[taskId].tItemCount; - gMartPurchaseHistoryId++; - } -} - -#undef tItemCount - -static void ClearItemPurchases(void) -{ - gMartPurchaseHistoryId = 0; - ClearItemSlots(gMartPurchaseHistory, 3); -} - -void Shop_CreatePokemartMenu(u16 *itemList) -{ - CreateShopMenu(MART_TYPE_0); - SetShopItemsForSale(itemList); - ClearItemPurchases(); - SetShopMenuCallback(EnableBothScriptContexts); -} - -void Shop_CreateDecorationShop1Menu(u16 *itemList) -{ - CreateShopMenu(MART_TYPE_1); - SetShopItemsForSale(itemList); - SetShopMenuCallback(EnableBothScriptContexts); -} - -void Shop_CreateDecorationShop2Menu(u16 *itemList) -{ - CreateShopMenu(MART_TYPE_2); - SetShopItemsForSale(itemList); - SetShopMenuCallback(EnableBothScriptContexts); -} - -#if DEBUG - -void debug_sub_80C2818(void) -{ - CreateShopMenu(MART_TYPE_0); - SetShopItemsForSale(gUnusedMartArray); - SetShopMenuCallback(NULL); -} - -#endif diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c deleted file mode 100644 index 8075f24e4..000000000 --- a/src/field/slot_machine.c +++ /dev/null @@ -1,5947 +0,0 @@ -#include "global.h" -#include "constants/songs.h" -#include "strings2.h" -#include "overworld.h" -#include "menu_cursor.h" -#include "field_effect.h" -#include "random.h" -#include "sound.h" -#include "main.h" -#include "slot_machine.h" -#include "string_util.h" -#include "decompress.h" -#include "trig.h" -#include "graphics.h" -#include "palette.h" -#include "util.h" -#include "text.h" -#include "menu.h" -#include "ewram.h" - -enum -{ - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_REPLAY -}; - -enum -{ - SLOT_MACHINE_MATCHED_1CHERRY, - SLOT_MACHINE_MATCHED_2CHERRY, - SLOT_MACHINE_MATCHED_REPLAY, - SLOT_MACHINE_MATCHED_LOTAD, - SLOT_MACHINE_MATCHED_AZURILL, - SLOT_MACHINE_MATCHED_POWER, - SLOT_MACHINE_MATCHED_777_MIXED, - SLOT_MACHINE_MATCHED_777_RED, - SLOT_MACHINE_MATCHED_777_BLUE, - SLOT_MACHINE_MATCHED_NONE -}; - -struct SlotMachineEwramStruct -{ - /*0x00*/ u8 state; - /*0x01*/ u8 unk01; - /*0x02*/ u8 pikaPower; - /*0x03*/ u8 unk03; - /*0x04*/ u8 unk04; - /*0x05*/ u8 unk05; - /*0x06*/ u8 unk06; - /*0x07*/ u8 unk07; - /*0x08*/ u16 matchedSymbols; - /*0x0A*/ u8 unk0A; - /*0x0B*/ u8 unk0B; - /*0x0C*/ s16 coins; - /*0x0E*/ s16 payout; - /*0x10*/ s16 unk10; - /*0x12*/ s16 bet; - /*0x14*/ s16 unk14; - /*0x16*/ s16 unk16; - /*0x18*/ s16 unk18; - /*0x1A*/ s16 unk1A; - /*0x1C*/ s16 unk1C[3]; - /*0x22*/ u16 unk22[3]; - /*0x28*/ s16 reelPositions[3]; - /*0x2E*/ s16 unk2E[3]; - /*0x34*/ s16 unk34[3]; - /*0x3A*/ u8 reelTasks[3]; - /*0x3D*/ u8 unk3D; - /*0x3E*/ u8 unk3E; - /*0x3F*/ u8 unk3F; - /*0x40*/ u8 unk40; - /*0x41*/ u8 unk41; - /*0x42*/ u8 unk42; - /*0x43*/ u8 unk43; - /*0x44*/ u8 unk44[5]; - /*0x49*/ u8 unk49[2]; - /*0x49*/ u8 unk4B[3]; - /*0x4E*/ u8 unk4E[2]; - /*0x50*/ u8 unk50[2]; - /*0x52*/ u8 unk52[2]; - /*0x54*/ u8 unk54[4]; - /*0x58*/ u16 win0h; - /*0x5a*/ u16 win0v; - /*0x5c*/ u16 winIn; - /*0x5e*/ u16 winOut; - /*0x60*/ u16 backupMapMusic; - /*0x64*/ MainCallback prevMainCb; -#if DEBUG - u32 unk68; - u32 unk6C; - u32 unk70; - u32 unk74; - u32 unk78; - u32 unk7C; - u32 unk80; - u32 unk84; - u32 unk88; - u32 unk8C; - s32 unk90; -#endif -}; - -struct UnkStruct1 -{ - /*0x00*/ u8 unk00; - /*0x01*/ u8 unk01; - /*0x02*/ s16 unk02; -}; - -#if ENGLISH -#define SLOTMACHINE_GFX_TILES 233 -#elif GERMAN -#define SLOTMACHINE_GFX_TILES 236 -#endif - -static void CB2_SlotMachineSetup(void); -static void CB2_SlotMachineLoop(void); -static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb); -static void SlotMachineDummyTask(u8 taskId); -static void SlotMachineSetup_0_0(void); -static void SlotMachineSetup_6_2(void); -static void SlotMachineSetup_1_0(void); -static void SlotMachineSetup_2_0(void); -static void SlotMachineSetup_2_1(void); -static void SlotMachineSetup_0_1(void); -static void SlotMachineSetup_3_0(void); -static void SlotMachineSetup_4_0(void); -static void SlotMachineSetup_5_0(void); -static void SlotMachineSetup_6_0(void); -static void SlotMachineSetup_6_1(void); -static void sub_8101D04(void); -static void sub_8101D24(u8 taskId); -static bool8 sub_8101D5C(struct Task *task); -static bool8 sub_8101D8C(struct Task *task); -static bool8 sub_8101DB0(struct Task *task); -static bool8 sub_8101DF4(struct Task *task); -static bool8 sub_8101E10(struct Task *task); -static bool8 sub_8101E3C(struct Task *task); -static bool8 sub_8101F44(struct Task *task); -static bool8 sub_8101F60(struct Task *task); -static bool8 sub_8101F88(struct Task *task); -static bool8 sub_8101FA4(struct Task *task); -static bool8 sub_8102008(struct Task *task); -static bool8 sub_8102034(struct Task *task); -static bool8 sub_8102058(struct Task *task); -static bool8 sub_8102090(struct Task *task); -bool8 sub_81020C8(struct Task *task); -static bool8 sub_81021E0(struct Task *task); -static bool8 sub_81021FC(struct Task *task); -static bool8 sub_8102264(struct Task *task); -static bool8 sub_81022A0(struct Task *task); -static bool8 sub_81022CC(struct Task *task); -static bool8 sub_81022F0(struct Task *task); -static bool8 sub_8102318(struct Task *task); -static bool8 sub_8102344(struct Task *task); -static bool8 sub_810239C(struct Task *task); -static bool8 sub_81023B8(struct Task *task); -static bool8 sub_81023E0(struct Task *task); -static bool8 sub_81023FC(struct Task *task); -static bool8 sub_8102424(struct Task *task); -static bool8 sub_8102460(struct Task *task); -#if DEBUG -static bool8 debug_sub_8116E74(struct Task *); -#endif -static void sub_8102484(void); -static void sub_81024F0(void); -static bool8 sub_8102540(void); -static u8 sub_8102578(void); -static u16 dp15_jump_random_unknown(void); -static u8 sub_81025BC(void); -static void CheckMatch(void); -static void CheckMatch_CenterRow(void); -static void CheckMatch_TopAndBottom(void); -static void CheckMatch_Diagonals(void); -static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3); -static void sub_8102A24(void); -static void sub_8102A64(u8 taskId); -static bool8 sub_8102A44(void); -static bool8 sub_8102A9C(struct Task *task); -static bool8 sub_8102AD0(struct Task *task); -static bool8 sub_8102B80(struct Task *task); -static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y); -static void sub_8102DA8(void); -static void sub_8102DEC(u8 a0); -static void sub_8102E1C(u8 a0); -static bool8 sub_8102E40(u8 a0); -static void sub_8102E68(u8 taskId); -static bool8 sub_8102EA0(struct Task *task); -static bool8 sub_8102EA4(struct Task *task); -static bool8 sub_8102EC0(struct Task *task); -static bool8 sub_8102F4C(struct Task *task); -static bool8 sub_8103008(struct Task *task); -static bool8 sub_810305C(void); -static bool8 sub_8103154(u8 a0, u8 a1); -static bool8 sub_81031B4(u8 a0, u8 a1); -static bool8 sub_81032C0(void); -static bool8 sub_81032E8(void); -static bool8 sub_810333C(void); -static bool8 sub_81033DC(void); -static bool8 sub_810341C(u8 a0); -static bool8 sub_810347C(u8 a0); -static void sub_81034F4(void); -static void sub_8103540(void); -static void sub_8103564(void); -static void j5_08111E84(void); -static void sub_8103668(void); -static void sub_810380C(void); -static void sub_8103830(void); -static void sub_8103910(void); -static void sub_8103A78(void); -static void sub_8103C14(u8 a0); -static void sub_8103C48(u8 taskId); -static void sub_8103D50(u8 a0); -static void sub_8103C78(struct Task *task, u8 taskId); -static void sub_8103CAC(struct Task *task, u8 taskId); -static void sub_8103CC8(struct Task *task, u8 taskId); -static void sub_8103D8C(u8 a0); -static void sub_8103DC8(void); -static void sub_8103E04(u8 a0); -static bool8 sub_8103E38(void); -static bool8 sub_8103E7C(void); -static bool8 sub_8103EAC(u8 spriteId); -static void sub_8103EE4(struct Sprite *sprite); -static void sub_8103F70(void); -static bool8 sub_8103FA0(void); -static void sub_8103FE8(u8 taskId); -static void sub_8104048(void); -static void sub_8104064(u8 pikaPower); -static bool8 sub_81040C8(void); -static void sub_81040E8(u8 taskId); -static void nullsub_68(struct Task *task); -static void sub_810411C(struct Task *task); -static void sub_8104144(struct Task *task); -static void sub_81041AC(struct Task *task); -static void sub_810421C(struct Task *task); -static void sub_810423C(u8 pikaPower); -static void sub_810430C(void); -static bool8 sub_810432C(void); -static void sub_810434C(u8 taskId); -static void sub_810437C(struct Task *task); -static void sub_81043EC(struct Task *task); -static void sub_8104468(struct Task *task); -static void sub_8104498(struct Task *task); -static void sub_8104548(struct Task *task); -static void sub_8104598(struct Task *task); -static void sub_81045CC(struct Task *task); -static void sub_810463C(struct Task *task); -static void sub_81046C0(struct Task *task); -static void sub_8104764(struct Task *task); -static void sub_8104794(struct Task *task); -static void sub_81047EC(struct Task *task); -static void sub_8104860(struct Task *task); -static void sub_81048A8(struct Task *task); -static void sub_81048CC(struct Task *task); -static void sub_8104940(struct Task *task); -static void sub_81049C8(struct Task *task); -static void sub_81049F8(struct Task *task); -static void sub_8104A40(s16 a0, s16 a1); -static void sub_8104A88(s16 a0); -static void sub_8104AB8(u8 a0); -static bool8 sub_8104AEC(void); -static void sub_8104B0C(u8 taskId); -static void sub_8104B3C(struct Task *task); -static void sub_8104B60(struct Task *task); -static void sub_8104B80(struct Task *task); -static void sub_8104BC8(struct Task *task); -static void sub_8104BFC(struct Task *task); -static void sub_8104C44(struct Task *task); -static void sub_8104C5C(void); -static void sub_8104CAC(u8 arg0); -static bool8 sub_8104E18(void); -static void nullsub_69(struct Task *task); -static void sub_8104E74(u8 taskId); -static void sub_8104EA8(void); -static void sub_8104F8C(void); -static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3); -static void sub_81050C4(void); -static void sub_8105100(void); -static void sub_810514C(void); -static void sub_81051C0(void); -static void sub_8105284(void); -static void sub_81052EC(void); -static void sub_81053A0(void); -static void sub_810545C(void); -static void sub_81054B8(void); -static void sub_8105524(void); -static void sub_8105554(void); -static void sub_8105578(void); -static void sub_8105688(s16 a0); -static void sub_81056C0(void); -static void sub_81056F0(void); -static void sub_81057E8(s16 a0); -static void sub_8105804(void); -static void sub_8105854(void); -static void sub_81058A0(void); -static void sub_81058C4(void); -static void sub_81059B8(void); -static void sub_81059E8(void); -static bool8 sub_8105ACC(void); -static void sub_8105AEC(void); -static u8 sub_8105B1C(s16 x, s16 y); -static void sub_8105B88(u8 spriteId); -static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4); -static void sub_81063C0(void); -static void sub_8106404(void); -static void sub_8106448(void); -static void sub_81064B8(void); -static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4); -static void sub_81065DC(void); - -#if DEBUG -static void debug_sub_811B5D0(void); -static void debug_sub_811B620(void); -static void debug_sub_811B5B4(s32 *, s32); -static void debug_sub_811B894(void); -static u8 debug_sub_811B634(void); -static void debug_sub_811B654(u8 taskId); -#endif - -#if DEBUG -static u8 unk_debug_bss_1_0; -static u8 unk_debug_bss_1_1; -static u8 unk_debug_bss_1_2; -static u8 unk_debug_bss_1_3; -static u8 unk_debug_bss_1_4; -static u32 unk_debug_bss_1_8; -#endif - -static const struct UnkStruct1 *const gUnknown_083ED048[]; -static const u16 gPalette_83EDE24[]; -static const u8 gUnknown_083ECD04[][3]; -static const u8 gUnknown_083ECE3A[]; -static const u16 gUnknown_083ECE42[]; -static const u16 gUnknown_083ECE48[]; - -void PlaySlotMachine(u8 arg0, MainCallback cb) -{ -#if DEBUG - unk_debug_bss_1_1 = 0; -#endif - PlaySlotMachine_Internal(arg0, cb); - SetMainCallback2(CB2_SlotMachineSetup); -} - -#if DEBUG -void debug_sub_811609C(u8 a, void (*func)(void)) -{ - unk_debug_bss_1_1 = 1; - PlaySlotMachine_Internal(a, func); - SetMainCallback2(CB2_SlotMachineSetup); -} -#endif - -static void CB2_SlotMachineSetup(void) -{ - switch (gMain.state) - { - case 0: - SlotMachineSetup_0_0(); - SlotMachineSetup_0_1(); - gMain.state++; - break; - case 1: - SlotMachineSetup_1_0(); - gMain.state++; - break; - case 2: - SlotMachineSetup_2_0(); - SlotMachineSetup_2_1(); - gMain.state++; - break; - case 3: - SlotMachineSetup_3_0(); - gMain.state++; - break; - case 4: - SlotMachineSetup_4_0(); - gMain.state++; - break; - case 5: - SlotMachineSetup_5_0(); - gMain.state++; - break; - case 6: - SlotMachineSetup_6_0(); - SlotMachineSetup_6_1(); - SlotMachineSetup_6_2(); - SetMainCallback2(CB2_SlotMachineLoop); - break; - } -} - -static void CB2_SlotMachineLoop(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void SlotMachine_VBlankCallback(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - REG_WIN0H = eSlotMachine->win0h; - REG_WIN0V = eSlotMachine->win0v; - REG_WININ = eSlotMachine->winIn; - REG_WINOUT = eSlotMachine->winOut; -} - -static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb) -{ - struct Task *task = gTasks + CreateTask(SlotMachineDummyTask, 0xFF); - task->data[0] = arg0; - StoreWordInTwoHalfwords(task->data + 1, (intptr_t)cb); -} - -static void sub_81019EC(void) -{ - struct Task *task = gTasks + FindTaskIdByFunc(SlotMachineDummyTask); - eSlotMachine->unk01 = task->data[0]; - LoadWordFromTwoHalfwords((u16 *)(task->data + 1), (u32 *)&eSlotMachine->prevMainCb); -} - -static void SlotMachineDummyTask(u8 taskId) -{ -} - -static void SlotMachineSetup_0_0(void) -{ - SetVBlankCallback(NULL); - SetHBlankCallback(NULL); - REG_DISPCNT = 0; -} - -static void SlotMachineSetup_6_2(void) -{ - u16 imeBak; - SetVBlankCallback(SlotMachine_VBlankCallback); - imeBak = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = imeBak; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; -} - -static void SlotMachineSetup_1_0(void) -{ - DmaClearLarge16(3, (u16 *)(BG_VRAM), BG_VRAM_SIZE, 0x1000); -} - -static void SlotMachineSetup_2_0(void) -{ - DmaClear16(3, (u16 *)OAM, OAM_SIZE); -} - -static void SlotMachineSetup_2_1(void) -{ - REG_BG0CNT = 0; - REG_BG1CNT = 0; - REG_BG2CNT = 0; - REG_BG3CNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_CHARBASE(2); - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28); - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29); - REG_BG3CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(30); - REG_WININ = 0x3f; - REG_WINOUT = 0x3f; - REG_BLDCNT = BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_OBJ; - REG_BLDALPHA = 0x809; -} - -static const s16 gUnknown_083ECCF8[][2]; - -static void SlotMachineSetup_0_1(void) -{ - u8 i; - - sub_81019EC(); - eSlotMachine->state = 0; - eSlotMachine->pikaPower = 0; - eSlotMachine->unk03 = Random() & 1; - eSlotMachine->unk04 = 0; - eSlotMachine->matchedSymbols = 0; - eSlotMachine->unk0A = 0; - eSlotMachine->unk0B = 0; - eSlotMachine->coins = gSaveBlock1.coins; - eSlotMachine->payout = 0; - eSlotMachine->unk10 = 0; - eSlotMachine->bet = 0; - eSlotMachine->unk18 = 0; - eSlotMachine->unk1A = 8; - eSlotMachine->win0h = 0xf0; - eSlotMachine->win0v = 0xa0; - eSlotMachine->winIn = 0x3f; - eSlotMachine->winOut = 0x3f; - eSlotMachine->backupMapMusic = GetCurrentMapMusic(); - for (i = 0; i < 3; i++) - { - eSlotMachine->unk22[i] = 0; - eSlotMachine->reelPositions[i] = gUnknown_083ECCF8[i][eSlotMachine->unk03] % 21; - eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->reelPositions[i] * 24; - eSlotMachine->unk1C[i] %= 0x1f8; - } -#if DEBUG - debug_sub_811B5D0(); - if (unk_debug_bss_1_1 != 0) - eSlotMachine->coins = 1000; -#endif -} - -static void SlotMachineSetup_3_0(void) -{ - Text_LoadWindowTemplate(&gWindowTemplate_81E7128); - InitMenuWindow(&gWindowTemplate_81E7128); -} - -static void SlotMachineSetup_4_0(void) -{ - ResetPaletteFade(); - ResetSpriteData(); - gOamLimit = 128; - FreeAllSpritePalettes(); - ResetTasks(); -} - -static void SlotMachineSetup_5_0(void) -{ - sub_8106448(); - sub_81064B8(); - sub_81063C0(); -} - -static void SlotMachineSetup_6_0(void) -{ - sub_8104EA8(); - sub_8104F8C(); - sub_8103DC8(); - sub_81050C4(); -} - -static void SlotMachineSetup_6_1(void) -{ - sub_8104048(); - sub_8102DA8(); - sub_8104C5C(); - sub_8101D04(); -} - -static void sub_8101D04(void) -{ - sub_8101D24(CreateTask(sub_8101D24, 0)); -} - -static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = -{ - sub_8101D5C, - sub_8101D8C, - sub_8101DB0, - sub_8101DF4, - sub_8101E10, - sub_8101E3C, - sub_8101F44, - sub_8101F60, - sub_8101F88, - sub_8101FA4, - sub_8102008, - sub_8102034, - sub_8102058, - sub_8102090, - sub_81020C8, - sub_81021E0, - sub_81021FC, - sub_8102264, - sub_81022A0, - sub_81022CC, - sub_81022F0, - sub_8102318, - sub_8102344, - sub_810239C, - sub_81023B8, - sub_81023E0, - sub_81023FC, - sub_8102424, - sub_8102460, -#if DEBUG - debug_sub_8116E74, -#endif -}; - -static void sub_8101D24(u8 taskId) -{ - while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId)) - ; -} - -static bool8 sub_8101D5C(struct Task *task) -{ - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - sub_810423C(eSlotMachine->pikaPower); - eSlotMachine->state++; - return FALSE; -} - -static bool8 sub_8101D8C(struct Task *task) -{ - if (!gPaletteFade.active) - eSlotMachine->state++; - return FALSE; -} - -static bool8 sub_8101DB0(struct Task *task) -{ - eSlotMachine->payout = 0; - eSlotMachine->bet = 0; - eSlotMachine->unk18 = 0; - eSlotMachine->unk04 &= 0xc0; - eSlotMachine->state = 4; - if (eSlotMachine->coins <= 0) - { - eSlotMachine->state = 25; - } - else if (eSlotMachine->unk0A) - { - eSlotMachine->state = 3; - sub_8104CAC(4); - } - return TRUE; -} - -static bool8 sub_8101DF4(struct Task *task) -{ - if (sub_8104E18()) - eSlotMachine->state = 4; - return FALSE; -} - -static bool8 sub_8101E10(struct Task *task) -{ - sub_8104CAC(0); - eSlotMachine->state = 5; - if ( -#if DEBUG - (unk_debug_bss_1_1 == 0 || unk_debug_bss_1_4 == 0) && -#endif - eSlotMachine->coins >= 9999) - eSlotMachine->state = 23; - return TRUE; -} - -static bool8 sub_8101E3C(struct Task *task) -{ - s16 i; - -#if DEBUG - if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) - { - if (eSlotMachine->coins <= 3 || (gMain.heldKeys & B_BUTTON)) - { - unk_debug_bss_1_4 = 0; - } - else - { - sub_8103D50(0); - sub_8103D50(1); - sub_8103D50(2); - eSlotMachine->coins -= 3; - eSlotMachine->bet = 3; - eSlotMachine->state = 9; - return 0; - } - } - if (unk_debug_bss_1_1 != 0 && (gMain.newKeys & 8)) - { - debug_sub_811B620(); - eSlotMachine->state = 29; - return 0; - } -#endif - - if (gMain.newKeys & SELECT_BUTTON) - { - sub_8104AB8(0); - eSlotMachine->state = 8; - } - else if (gMain.newKeys & R_BUTTON) - { - if (eSlotMachine->coins - (3 - eSlotMachine->bet) >= 0) - { - for (i = eSlotMachine->bet; i < 3; i++) - sub_8103D50(i); - eSlotMachine->coins -= (3 - eSlotMachine->bet); - eSlotMachine->bet = 3; - eSlotMachine->state = 9; - PlaySE(SE_REGI); - } - else - { - eSlotMachine->state = 6; - } - } - else - { - if (gMain.newKeys & DPAD_DOWN && eSlotMachine->coins != 0) - { - PlaySE(SE_REGI); - sub_8103D50(eSlotMachine->bet); - eSlotMachine->coins--; - eSlotMachine->bet++; - } - if (eSlotMachine->bet >= 3 || (eSlotMachine->bet != 0 && gMain.newKeys & A_BUTTON)) - eSlotMachine->state = 9; - if (gMain.newKeys & B_BUTTON) - eSlotMachine->state = 21; - } - return FALSE; -} - -static void sub_8101F2C(const u8 *str) -{ - Menu_DisplayDialogueFrame(); - Menu_PrintText(str, 2, 15); -} - -static bool8 sub_8101F44(struct Task *task) -{ - sub_8101F2C(gOtherText_DontHaveThreeCoins); - eSlotMachine->state = 7; - return FALSE; -} - -static bool8 sub_8101F60(struct Task *task) -{ - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - Menu_EraseScreen(); - eSlotMachine->state = 5; - } - return FALSE; -} - -static bool8 sub_8101F88(struct Task *task) -{ - if (sub_8104AEC()) - eSlotMachine->state = 5; - return FALSE; -} - -static bool8 sub_8101FA4(struct Task *task) -{ - sub_8102484(); - sub_8104DA4(); - sub_8102DEC(0); - sub_8102DEC(1); - sub_8102DEC(2); - task->data[0] = 0; - if (eSlotMachine->unk04 & 0x20) - { - sub_810430C(); - eSlotMachine->state = 10; - } - else - { - sub_8104CAC(1); - eSlotMachine->state = 11; - } - eSlotMachine->unk1A = 8; - if (eSlotMachine->unk0A) - eSlotMachine->unk1A = dp15_jump_random_unknown(); -#if DEBUG - if (unk_debug_bss_1_1 != 0) - debug_sub_811B5B4(&eSlotMachine->unk68, 1); -#endif - return FALSE; -} - -static bool8 sub_8102008(struct Task *task) -{ - if (sub_810432C()) - { - sub_8104CAC(1); - eSlotMachine->unk04 &= 0xDF; - eSlotMachine->state = 11; - } - return FALSE; -} - -static bool8 sub_8102034(struct Task *task) -{ - if (++task->data[0] >= 30) - { -#if DEBUG - if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) - unk_debug_bss_1_8 = (Random() & 0x1F) + 1; -#endif - sub_81024F0(); - eSlotMachine->state = 12; - } - return FALSE; -} - -static bool8 sub_8102058(struct Task *task) -{ -#if DEBUG - if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) - { - unk_debug_bss_1_8--; - if (unk_debug_bss_1_8 == 0) - { - PlaySE(0x18); - sub_8102E1C(eSlotMachine->unk18); - sub_8103C14(eSlotMachine->unk18); - unk_debug_bss_1_8 = (Random() & 0x1F) + 1; - eSlotMachine->state = 13; - } - return FALSE; - } -#endif - - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_JYUNI); - sub_8102E1C(eSlotMachine->unk18); - sub_8103C14(eSlotMachine->unk18); - eSlotMachine->state = 13; - } - return FALSE; -} - -static bool8 sub_8102090(struct Task *task) -{ - if (!sub_8102E40(eSlotMachine->unk18)) - { - eSlotMachine->unk18++; - eSlotMachine->state = 12; - if (eSlotMachine->unk18 > 2) - { - eSlotMachine->state = 14; -#if DEBUG - switch (unk_debug_bss_1_0) - { - case 2: - eSlotMachine->reelPositions[0] = 20; - eSlotMachine->reelPositions[1] = 20; - eSlotMachine->reelPositions[2] = 18; - break; - case 1: - eSlotMachine->reelPositions[0] = 20; - eSlotMachine->reelPositions[1] = 20; - eSlotMachine->reelPositions[2] = 18; - break; - case 4: - eSlotMachine->reelPositions[0] = 3; - eSlotMachine->reelPositions[1] = 1; - eSlotMachine->reelPositions[2] = 2; - break; - case 8: - eSlotMachine->reelPositions[0] = 0; - eSlotMachine->reelPositions[1] = 2; - eSlotMachine->reelPositions[2] = 3; - break; - case 0x10: - eSlotMachine->reelPositions[0] = 2; - eSlotMachine->reelPositions[1] = 5; - eSlotMachine->reelPositions[2] = 20; - break; - case 0x40: - eSlotMachine->reelPositions[0] = 19; - eSlotMachine->reelPositions[1] = 19; - eSlotMachine->reelPositions[2] = 0; - break; - case 0x80: - eSlotMachine->reelPositions[0] = 19; - eSlotMachine->reelPositions[1] = 19; - eSlotMachine->reelPositions[2] = 19; - break; - } -#endif - } - return TRUE; - } - return FALSE; -} - -bool8 sub_81020C8(struct Task *task) -{ - eSlotMachine->unk04 &= 0xc0; - CheckMatch(); - if (eSlotMachine->unk0A) - { - eSlotMachine->unk0A--; - eSlotMachine->unk0B++; - } -#if DEBUG - else - { - debug_sub_811B894(); - } -#endif - - if (eSlotMachine->matchedSymbols) - { -#if DEBUG - debug_sub_811B5B4(&eSlotMachine->unk6C, eSlotMachine->payout); -#endif - eSlotMachine->state = 15; - sub_8102A24(); - sub_8103F70(); - if ((eSlotMachine->unk10 -= eSlotMachine->payout) < 0) - { - eSlotMachine->unk10 = 0; - } - if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) - { - PlayFanfare(BGM_ME_B_BIG); - sub_8104CAC(6); - } - else if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_MIXED)) - { - PlayFanfare(BGM_ME_B_BIG); - sub_8104CAC(5); - } - else - { - PlayFanfare(BGM_ME_B_SMALL); - sub_8104CAC(2); - } - if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_MIXED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) - { - eSlotMachine->unk04 &= 0x3f; - if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) - { - eSlotMachine->unk0A = 0; - eSlotMachine->unk0B = 0; - eSlotMachine->unk03 = 0; - if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_BLUE)) - eSlotMachine->unk03 = 1; - } - } - if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER) && eSlotMachine->pikaPower < 16) - { - eSlotMachine->pikaPower++; - sub_8104064(eSlotMachine->pikaPower); - } - } - else - { - sub_8104CAC(3); - eSlotMachine->state = 20; - if ((eSlotMachine->unk10 += eSlotMachine->bet) > 9999) - eSlotMachine->unk10 = 9999; - } - return FALSE; -} - -static bool8 sub_81021E0(struct Task *task) -{ - if (sub_8102A44()) - eSlotMachine->state = 16; - return FALSE; -} - -static bool8 sub_81021FC(struct Task *task) -{ - if (sub_8103FA0()) - { - eSlotMachine->state = 19; - if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_RED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE))) - IncrementGameStat(GAME_STAT_SLOT_JACKPOTS); - if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) - { - eSlotMachine->unk18 = 0; - eSlotMachine->state = 9; - } - if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER)) - eSlotMachine->state = 17; - if (eSlotMachine->unk0A && eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) - { - sub_8104CAC(4); - eSlotMachine->state = 18; - } - } - return FALSE; -} - -static bool8 sub_8102264(struct Task *task) -{ - if (!sub_81040C8()) - { - eSlotMachine->state = 19; - if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) - { - eSlotMachine->state = 9; - if (eSlotMachine->unk0A) - { - sub_8104CAC(4); - eSlotMachine->state = 18; - } - } - } - return FALSE; -} - -static bool8 sub_81022A0(struct Task *task) -{ - if (sub_8104E18()) - { - eSlotMachine->state = 19; - if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) - { - eSlotMachine->state = 9; - } - } - return FALSE; -} - -static bool8 sub_81022CC(struct Task *task) -{ - sub_8103D8C(0); - sub_8103D8C(1); - sub_8103D8C(2); - eSlotMachine->state = 2; - return FALSE; -} - -static bool8 sub_81022F0(struct Task *task) -{ - if (++task->data[1] > 64) - { - task->data[1] = 0; - eSlotMachine->state = 19; - } - return FALSE; -} - -static bool8 sub_8102318(struct Task *task) -{ - sub_8101F2C(gOtherText_QuitGamePrompt); - DisplayYesNoMenu(21, 7, 1); - sub_814AB84(); - eSlotMachine->state = 22; - return FALSE; -} - -static bool8 sub_8102344(struct Task *task) -{ - s8 input = Menu_ProcessInputNoWrap_(); - if (input == 0) - { - Menu_EraseScreen(); - sub_8103D8C(0); - sub_8103D8C(1); - sub_8103D8C(2); - eSlotMachine->coins += eSlotMachine->bet; - eSlotMachine->state = 27; - } - else if (input == 1 || input == -1) - { - Menu_EraseScreen(); - eSlotMachine->state = 5; - } - return FALSE; -} - -static bool8 sub_810239C(struct Task *task) -{ - sub_8101F2C(gOtherText_MaxCoins); - eSlotMachine->state = 24; - return FALSE; -} - -static bool8 sub_81023B8(struct Task *task) -{ - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - Menu_EraseScreen(); - eSlotMachine->state = 5; - } - return FALSE; -} - -static bool8 sub_81023E0(struct Task *task) -{ - sub_8101F2C(gOtherText_OutOfCoins); - eSlotMachine->state = 26; - return FALSE; -} - -static bool8 sub_81023FC(struct Task *task) -{ - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - Menu_EraseScreen(); - eSlotMachine->state = 27; - } - return FALSE; -} - -static bool8 sub_8102424(struct Task *task) -{ -#if DEBUG - if (unk_debug_bss_1_1 == 0) - gSaveBlock1.coins = eSlotMachine->coins; -#else - gSaveBlock1.coins = eSlotMachine->coins; -#endif - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - eSlotMachine->state++; - return FALSE; -} - -static bool8 sub_8102460(struct Task *task) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(eSlotMachine->prevMainCb); - } - return FALSE; -} - -#if DEBUG - -static bool8 debug_sub_8116E74(struct Task *task) -{ - if (debug_sub_811B634() != 0) - eSlotMachine->state = 5; - return FALSE; -} - -#endif - -static void sub_8102484(void) -{ - u8 r3; - - if (eSlotMachine->unk0A == 0) - { -#if DEBUG - if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_2 != 0) - { - eSlotMachine->unk04 = unk_debug_bss_1_3; - unk_debug_bss_1_2 = 0; - unk_debug_bss_1_3 = 0; - if (eSlotMachine->unk04 & 0x80) - debug_sub_811B5B4(&eSlotMachine->unk88, 1); - if (eSlotMachine->unk04 & 0x40) - debug_sub_811B5B4(&eSlotMachine->unk84, 1); - if (eSlotMachine->unk04 & 0x20) - debug_sub_811B5B4(&eSlotMachine->unk8C, 1); - if (eSlotMachine->unk04 & 0x10) - debug_sub_811B5B4(&eSlotMachine->unk80, 1); - if (eSlotMachine->unk04 & 8) - debug_sub_811B5B4(&eSlotMachine->unk7C, 1); - if (eSlotMachine->unk04 & 4) - debug_sub_811B5B4(&eSlotMachine->unk78, 1); - if (eSlotMachine->unk04 & 1) - debug_sub_811B5B4(&eSlotMachine->unk74, 1); - if (eSlotMachine->unk04 & 2) - debug_sub_811B5B4(&eSlotMachine->unk70, 1); - return; - } -#endif - if (!(eSlotMachine->unk04 & 0xc0)) - { - if (sub_8102540()) - { - r3 = sub_8102578(); - if (r3 != 3) - { - eSlotMachine->unk04 |= gUnknown_083ECE42[r3]; -#if DEBUG - if (eSlotMachine->unk04 & 0x80) - debug_sub_811B5B4(&eSlotMachine->unk88, 1); - if (eSlotMachine->unk04 & 0x40) - debug_sub_811B5B4(&eSlotMachine->unk84, 1); - if (eSlotMachine->unk04 & 0x20) - debug_sub_811B5B4(&eSlotMachine->unk8C, 1); -#endif - if (r3 != 1) - { - return; - } - } - } - r3 = sub_81025BC(); - if (r3 != 5) - { - eSlotMachine->unk04 |= gUnknown_083ECE48[r3]; -#if DEBUG - if (eSlotMachine->unk04 & 0x10) - debug_sub_811B5B4(&eSlotMachine->unk80, 1); - if (eSlotMachine->unk04 & 8) - debug_sub_811B5B4(&eSlotMachine->unk7C, 1); - if (eSlotMachine->unk04 & 4) - debug_sub_811B5B4(&eSlotMachine->unk78, 1); - if (eSlotMachine->unk04 & 1) - debug_sub_811B5B4(&eSlotMachine->unk74, 1); - if (eSlotMachine->unk04 & 2) - debug_sub_811B5B4(&eSlotMachine->unk70, 1); -#endif - } - } - } -} - -/* -static void sub_8102484(void) -{ - u8 r3; - - if (eSlotMachine->unk0A == 0 && !(eSlotMachine->unk04 & 0xc0)) - { - if (sub_8102540()) - { - r3 = sub_8102578(); - if (r3 != 3) - { - eSlotMachine->unk04 |= gUnknown_083ECE42[r3]; - if (r3 != 1) - { - return; - } - } - } - r3 = sub_81025BC(); - if (r3 != 5) - { - eSlotMachine->unk04 |= gUnknown_083ECE48[r3]; - } - } -} -*/ - -static void sub_81024F0(void) -{ - eSlotMachine->unk06 = 0; - if (eSlotMachine->unk04) - eSlotMachine->unk06 = 1; -} - -static u8 sub_810250C(u8 a0) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - if (a0 & 1) - return gUnknown_083ECE3A[i]; - a0 >>= 1; - } - return 0; -} - -static bool8 sub_8102540(void) -{ - u8 rval = Random(); - if (gUnknown_083ECD04[eSlotMachine->unk01][eSlotMachine->bet - 1] > rval) - return TRUE; - return FALSE; -} - -static const u8 gUnknown_083ECD16[][6]; - -static u8 sub_8102578(void) -{ - s16 i; - - for (i = 0; i < 3; i++) - { - s16 rval = Random() & 0xff; - s16 value = gUnknown_083ECD16[i][eSlotMachine->unk01]; - if (value > rval) - break; - } - return i; -} - -static const u8 gUnknown_083ECD28[][6]; - -static u8 sub_81025BC(void) -{ - s16 i; - - for (i = 0; i < 5; i++) - { - s16 rval = Random() & 0xff; - s16 r3 = gUnknown_083ECD28[i][eSlotMachine->unk01]; - if (i == 0 && eSlotMachine->unk03 == 1) - { - r3 += 10; - if (r3 > 0x100) - r3 = 0x100; - } - else if (i == 4 && eSlotMachine->unk03 == 1) - { - r3 -= 10; - if (r3 < 0) - r3 = 0; - } - if (r3 > rval) - break; - } - return i; -} - -static const u8 gUnknown_083ECD46[][17]; -static const u8 gUnknown_083ECDAC[][17]; - -static u8 sub_810264C(u8 a0) -{ - if (eSlotMachine->unk03 == 0) - return gUnknown_083ECD46[a0][eSlotMachine->pikaPower]; - else - return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower]; -} - -static void sub_8102680(void) -{ - u8 rval; - s16 i; - - eSlotMachine->unk05 = 0; - rval = Random(); - if (rval < sub_810264C(0)) - return; - for (i = 5; i > 0; i--) - { - rval = Random(); - if (rval < sub_810264C(i)) - break; - } - eSlotMachine->unk05 = i; -} - -static const u16 gUnknown_083ECE12[]; - -static bool8 sub_81026DC(u16 a0) -{ - u16 rval = Random() & 0xff; - if (rval < gUnknown_083ECE12[a0]) - return TRUE; - else - return FALSE; -} - -static const u16 gUnknown_083ECE1C[][2]; -static const u16 gUnknown_083ECE30[]; - -static u16 dp15_jump_random_unknown(void) -{ - u8 r4 = 0; - u8 rval; - u8 value; - if (eSlotMachine->unk10 >= 300) - r4 = 4; - else if (eSlotMachine->unk10 >= 250) - r4 = 3; - else if (eSlotMachine->unk10 >= 200) - r4 = 2; - else if (eSlotMachine->unk10 >= 150) - r4 = 1; - rval = Random() % 100; - value = gUnknown_083ECE1C[r4][0]; - if (rval < value) - return 4; - rval = Random() % 100; - value = gUnknown_083ECE1C[r4][1] + gUnknown_083ECE30[eSlotMachine->unk0B]; - if (rval < value) - return 2; - return 8; -} - -static void CheckMatch(void) -{ - eSlotMachine->matchedSymbols = 0; - CheckMatch_CenterRow(); - if (eSlotMachine->bet > 1) - CheckMatch_TopAndBottom(); - if (eSlotMachine->bet > 2) - CheckMatch_Diagonals(); -} - -static const u16 sSlotMatchFlags[]; -static const u16 sSlotPayouts[]; - -static void CheckMatch_CenterRow(void) -{ - u8 c1, c2, c3, match; - - c1 = GetTagOfReelSymbolOnScreenAtPos(0, 2); - c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); - c3 = GetTagOfReelSymbolOnScreenAtPos(2, 2); - match = GetMatchFromSymbolsInRow(c1, c2, c3); - if (match != SLOT_MACHINE_MATCHED_NONE) - { - eSlotMachine->payout += sSlotPayouts[match]; - eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; - sub_8103E04(0); - } -} - -static void CheckMatch_TopAndBottom(void) -{ - u8 c1, c2, c3, match; - - c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); - c2 = GetTagOfReelSymbolOnScreenAtPos(1, 1); - c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1); - match = GetMatchFromSymbolsInRow(c1, c2, c3); - if (match != SLOT_MACHINE_MATCHED_NONE) - { - if (match == SLOT_MACHINE_MATCHED_1CHERRY) - match = SLOT_MACHINE_MATCHED_2CHERRY; - eSlotMachine->payout += sSlotPayouts[match]; - eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; - sub_8103E04(1); - } - c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3); - c2 = GetTagOfReelSymbolOnScreenAtPos(1, 3); - c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); - match = GetMatchFromSymbolsInRow(c1, c2, c3); - if (match != SLOT_MACHINE_MATCHED_NONE) - { - if (match == SLOT_MACHINE_MATCHED_1CHERRY) - match = SLOT_MACHINE_MATCHED_2CHERRY; - eSlotMachine->payout += sSlotPayouts[match]; - eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; - sub_8103E04(2); - } -} - -static void CheckMatch_Diagonals(void) -{ - u8 c1, c2, c3, match; - - c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); - c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); - c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); - match = GetMatchFromSymbolsInRow(c1, c2, c3); - if (match != SLOT_MACHINE_MATCHED_NONE) - { - if (match != SLOT_MACHINE_MATCHED_1CHERRY) - { - eSlotMachine->payout += sSlotPayouts[match]; - eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; - } - sub_8103E04(3); - } - c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3); - c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); - c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1); - match = GetMatchFromSymbolsInRow(c1, c2, c3); - if (match != SLOT_MACHINE_MATCHED_NONE) - { - if (match != SLOT_MACHINE_MATCHED_1CHERRY) - { - eSlotMachine->payout += sSlotPayouts[match]; - eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; - } - sub_8103E04(4); - } -} - -static const u8 sSym2Match[]; - -static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3) -{ - if (c1 == c2 && c1 == c3) - return sSym2Match[c1]; - if (c1 == SLOT_MACHINE_TAG_7_RED && c2 == SLOT_MACHINE_TAG_7_RED && c3 == SLOT_MACHINE_TAG_7_BLUE) - return SLOT_MACHINE_MATCHED_777_MIXED; - if (c1 == SLOT_MACHINE_TAG_7_BLUE && c2 == SLOT_MACHINE_TAG_7_BLUE && c3 == SLOT_MACHINE_TAG_7_RED) - return SLOT_MACHINE_MATCHED_777_MIXED; - if (c1 == SLOT_MACHINE_TAG_CHERRY) - return SLOT_MACHINE_MATCHED_1CHERRY; - return SLOT_MACHINE_MATCHED_NONE; -} - -static void sub_8102A24(void) -{ - sub_8102A64(CreateTask(sub_8102A64, 4)); -} - -static bool8 sub_8102A44(void) -{ - if (FindTaskIdByFunc(sub_8102A64) == 0xff) - return TRUE; - else - return FALSE; -} - -static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = -{ - sub_8102A9C, - sub_8102AD0, - sub_8102B80 -}; - -static void sub_8102A64(u8 taskId) -{ - while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId)) - ; -} - -static bool8 sub_8102A9C(struct Task *task) -{ - if (sub_8103E38()) - { - task->data[0]++; - if (eSlotMachine->payout == 0) - { - task->data[0] = 2; - return TRUE; - } - } - return FALSE; -} - -static bool8 sub_8102AD0(struct Task *task) -{ - if (!task->data[1]--) - { - if (IsFanfareTaskInactive()) - PlaySE(SE_PIN); - eSlotMachine->payout--; - if (eSlotMachine->coins < 9999) - eSlotMachine->coins++; - task->data[1] = 8; - if (gMain.heldKeys & A_BUTTON) - task->data[1] = 4; - } - if (IsFanfareTaskInactive() && gMain.newKeys & START_BUTTON) - { - PlaySE(SE_PIN); - eSlotMachine->coins += eSlotMachine->payout; - if (eSlotMachine->coins > 9999) - eSlotMachine->coins = 9999; - eSlotMachine->payout = 0; - } - if (eSlotMachine->payout == 0) - task->data[0]++; - return FALSE; -} - -static bool8 sub_8102B80(struct Task *task) -{ - if (sub_8103E7C()) - DestroyTask(FindTaskIdByFunc(sub_8102A64)); - return FALSE; -} - -static const u8 sReelSymbols[][21]; - -static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y) -{ - s16 offset = (eSlotMachine->reelPositions[x] + y) % 21; - if (offset < 0) - offset += 21; - return sReelSymbols[x][offset]; -} - -static u8 GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(u8 x, s16 y) -{ - s16 r6 = 0; - if ((eSlotMachine->unk1C[x]) % 24) - r6 = -1; - return GetTagOfReelSymbolOnScreenAtPos(x, y + r6); -} - -static const u8 gUnknown_083ECCF1[]; - -static u8 sub_8102C48(s16 a0) -{ - s16 r1 = (eSlotMachine->unk16 + a0) % 6; - if (r1 < 0) - r1 += 6; - return gUnknown_083ECCF1[r1]; -} - -static void sub_8102C84(u8 a0, s16 a1) -{ - eSlotMachine->unk1C[a0] += a1; - eSlotMachine->unk1C[a0] %= 504; - eSlotMachine->reelPositions[a0] = 21 - eSlotMachine->unk1C[a0] / 24; -} - -static s16 sub_8102CCC(u8 a0, s16 a1) -{ - s16 r1 = eSlotMachine->unk1C[a0] % 24; - if (r1 != 0) - { - if (r1 < a1) - a1 = r1; - sub_8102C84(a0, a1); - r1 = eSlotMachine->unk1C[a0] % 24; - } - return r1; -} - -static void sub_8102D28(s16 a0) -{ - eSlotMachine->unk14 += a0; - eSlotMachine->unk14 %= 120; - eSlotMachine->unk16 = 6 - eSlotMachine->unk14 / 20; -} - -static s16 sub_8102D5C(s16 a0) -{ - s16 r1 = eSlotMachine->unk14 % 20; - if (r1 != 0) - { - if (r1 < a0) - a0 = r1; - sub_8102D28(a0); - r1 = eSlotMachine->unk14 % 20; - } - return r1; -} - -static void sub_8102DA8(void) -{ - u8 i; - for (i = 0; i < 3; i++) - { - u8 taskId = CreateTask(sub_8102E68, 2); - gTasks[taskId].data[15] = i; - eSlotMachine->reelTasks[i] = taskId; - sub_8102E68(taskId); - } -} - -static void sub_8102DEC(u8 a0) -{ - gTasks[eSlotMachine->reelTasks[a0]].data[0] = 1; - gTasks[eSlotMachine->reelTasks[a0]].data[14] = 1; -} - -static void sub_8102E1C(u8 a0) -{ - gTasks[eSlotMachine->reelTasks[a0]].data[0] = 2; -} - -static bool8 sub_8102E40(u8 a0) -{ - return gTasks[eSlotMachine->reelTasks[a0]].data[14]; -} - -static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = -{ - sub_8102EA0, - sub_8102EA4, - sub_8102EC0, - sub_8102F4C, - sub_8103008 -}; - -static void sub_8102E68(u8 taskId) -{ - while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId)) - ; -} - -static bool8 sub_8102EA0(struct Task *task) -{ - return FALSE; -} - -static bool8 sub_8102EA4(struct Task *task) -{ - sub_8102C84(task->data[15], eSlotMachine->unk1A); - return FALSE; -} - -static bool8 (*const gUnknown_083ECB40[])(void) = -{ - sub_810305C, - sub_81032C0, - sub_81033DC -}; - -static void (*const gUnknown_083ECB4C[])(void) = -{ - sub_81034F4, - sub_8103540, - sub_810380C -}; - -static bool8 sub_8102EC0(struct Task *task) -{ - task->data[0]++; - eSlotMachine->unk34[task->data[15]] = 0; - eSlotMachine->unk2E[task->data[15]] = 0; - if (eSlotMachine->unk0A == 0 && (eSlotMachine->unk04 == 0 || eSlotMachine->unk06 == 0 || !gUnknown_083ECB40[task->data[15]]())) - { - eSlotMachine->unk06 = 0; - gUnknown_083ECB4C[task->data[15]](); - } - task->data[1] = eSlotMachine->unk2E[task->data[15]]; - return TRUE; -} - -static bool8 sub_8102F4C(struct Task *task) -{ - u16 sp[] = {2, 4, 4, 4, 8}; - s16 r2 = eSlotMachine->unk1C[task->data[15]] % 24; - if (r2 != 0) - r2 = sub_8102CCC(task->data[15], eSlotMachine->unk1A); - else if (eSlotMachine->unk2E[task->data[15]]) - { - eSlotMachine->unk2E[task->data[15]]--; - sub_8102C84(task->data[15], eSlotMachine->unk1A); - r2 = eSlotMachine->unk1C[task->data[15]] % 24; - } - if (r2 == 0 && eSlotMachine->unk2E[task->data[15]] == 0) - { - task->data[0]++; - task->data[1] = sp[task->data[1]]; - task->data[2] = 0; - } - return FALSE; -} - -static bool8 sub_8103008(struct Task *task) -{ - eSlotMachine->unk22[task->data[15]] = task->data[1]; - task->data[1] = -task->data[1]; - task->data[2]++; - if ((task->data[2] & 0x3) == 0) - task->data[1] >>= 1; - if (task->data[1] == 0) - { - task->data[0] = 0; - task->data[14] = 0; - eSlotMachine->unk22[task->data[15]] = 0; - } - return FALSE; -} - -static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = -{ - sub_8103154, - sub_81031B4, - sub_81031B4 -}; - -static bool8 sub_810305C(void) -{ - u8 r3 = sub_810250C(eSlotMachine->unk04); - u8 r5 = r3; - if (eSlotMachine->unk04 & 0xc0) - { - r5 = 0; - r3 = 1; - } - return gUnknown_083ECB64[eSlotMachine->bet - 1](r5, r3); -} - -static bool8 sub_81030A4(s16 y, u8 tag1, u8 tag2) -{ - u8 tag = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, y); - if (tag == tag1 || tag == tag2) - { - eSlotMachine->unk07 = tag; - return TRUE; - } - return FALSE; -} - -static bool8 sub_81030E0(s16 y) -{ - if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - y) == 4) - return TRUE; - else - return FALSE; -} - -static bool8 sub_8103134(void) -{ - if (eSlotMachine->unk04 & 0xc2) - return TRUE; - else - return FALSE; -} - -static bool8 sub_8103154(u8 a0, u8 a1) -{ - s16 i; - - for (i = 0; i < 5; i++) - { - if (sub_81030A4(2 - i, a0, a1)) - { - eSlotMachine->unk34[0] = 2; - eSlotMachine->unk2E[0] = i; - return TRUE; - } - } - return FALSE; -} - -static bool8 sub_81031B4(u8 tag1, u8 tag2) -{ - s16 i; - bool8 r6 = sub_8103134(); - if (r6 || !sub_81030E0(0)) - { - for (i = 1; i < 4; i++) - { - if (sub_81030A4(i, tag1, tag2)) - { - eSlotMachine->unk34[0] = i; - eSlotMachine->unk2E[0] = 0; - return TRUE; - } - } - } - for (i = 1; i < 5; i++) - { - bool8 r7 = r6; - if (r7 || !sub_81030E0(i)) - { - if (sub_81030A4(1 - i, tag1, tag2)) - { - if (i == 1 && (r7 || !sub_81030E0(3))) - { - eSlotMachine->unk34[0] = 3; - eSlotMachine->unk2E[0] = 3; - return TRUE; - } - if (i < 4 && (r7 || !sub_81030E0(i + 1))) - { - eSlotMachine->unk34[0] = 2; - eSlotMachine->unk2E[0] = i + 1; - return TRUE; - } - eSlotMachine->unk34[0] = 1; - eSlotMachine->unk2E[0] = i; - return TRUE; - } - } - } - return FALSE; -} - -static bool8 (*const gUnknown_083ECB70[])(void) = -{ - sub_81032E8, - sub_81032E8, - sub_810333C -}; - -static bool8 sub_81032C0(void) -{ - return gUnknown_083ECB70[eSlotMachine->bet - 1](); -} - -static bool8 sub_81032E8(void) -{ - s16 i; - s16 unk34_0 = eSlotMachine->unk34[0]; - - for (i = 0; i < 5; i++) - { - if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, unk34_0 - i) == eSlotMachine->unk07) - { - eSlotMachine->unk34[1] = unk34_0; - eSlotMachine->unk2E[1] = i; - return TRUE; - } - } - return FALSE; -} - -static bool8 sub_810333C(void) -{ - s16 i; - if (sub_81032E8()) - { - if (eSlotMachine->unk34[0] != 2 && eSlotMachine->unk2E[1] > 1 && eSlotMachine->unk2E[1] != 4) - { - for (i = 0; i < 5; i++) - { - if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07) - { - eSlotMachine->unk34[1] = 2; - eSlotMachine->unk2E[1] = i; - break; - } - } - } - return TRUE; - } - if (eSlotMachine->unk34[0] != 2) - { - for (i = 0; i < 5; i++) - { - if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07) - { - eSlotMachine->unk34[1] = 2; - eSlotMachine->unk2E[1] = i; - return TRUE; - } - } - } - return FALSE; -} - -static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = -{ - sub_810341C, - sub_810341C, - sub_810347C -}; - -static bool8 sub_81033DC(void) -{ - u8 r3 = eSlotMachine->unk07; - if (eSlotMachine->unk04 & 0x40) - { - r3 = 0; - if (eSlotMachine->unk07 == 0) - { - r3 = 1; - } - } - return gUnknown_083ECB7C[eSlotMachine->bet - 1](r3); -} - -static bool8 sub_810341C(u8 a0) -{ - s16 i; - s16 unk34_1 = eSlotMachine->unk34[1]; - - for (i = 0; i < 5; i++) - { - if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, unk34_1 - i) == a0) - { - eSlotMachine->unk34[2] = unk34_1; - eSlotMachine->unk2E[2] = i; - return TRUE; - } - } - return FALSE; -} - -static bool8 sub_810347C(u8 a0) -{ - s16 i; - s16 r8; - if (eSlotMachine->unk34[0] == eSlotMachine->unk34[1]) - return sub_810341C(a0); - if (eSlotMachine->unk34[0] == 1) - r8 = 3; - else - r8 = 1; - for (i = 0; i < 5; i++) - { - if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - i) == a0) - { - eSlotMachine->unk2E[2] = i; - eSlotMachine->unk34[2] = r8; - return TRUE; - } - } - return FALSE; -} - -static void sub_81034F4(void) -{ - s16 i = 0; - - while (sub_81030E0(i) != 0) - i++; - eSlotMachine->unk2E[0] = i; -} - -static bool8 sub_8103520(u8 *a0) -{ - if (*a0 == 0) - { - *a0 = 1; - return TRUE; - } - if (*a0 == 1) - { - *a0 = 0; - return TRUE; - } - return FALSE; -} - -static void (*const gUnknown_083ECB88[])(void) = -{ - sub_8103564, - j5_08111E84, - sub_8103668 -}; - -static void sub_8103540(void) -{ - gUnknown_083ECB88[eSlotMachine->bet - 1](); -} - -static void sub_8103564(void) -{ - if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) - { - u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]); - if (sub_8103520(&sp0)) - { - s16 i; - for (i = 0; i < 5; i++) - { - if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i)) - { - eSlotMachine->unk34[1] = 2; - eSlotMachine->unk2E[1] = i; - break; - } - } - } - } -} - -static void j5_08111E84(void) -{ - if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) - { - u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); - if (sub_8103520(&sp0)) - { - s16 i; - for (i = 0; i < 5; i++) - { - if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - i)) - { - eSlotMachine->unk34[1] = eSlotMachine->unk34[0]; - eSlotMachine->unk2E[1] = i; - break; - } - } - } - } -} - -static void sub_8103668(void) -{ - s16 i; - s16 j; - if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) - { - if (eSlotMachine->unk34[0] == 2) - { - j5_08111E84(); - } - else - { - u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); - if (sub_8103520(&sp0)) - { - j = 2; - if (eSlotMachine->unk34[0] == 3) - j = 3; - for (i = 0; i < 2; i++, j--) - { - if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, j)) - { - eSlotMachine->unk34[1] = j; - eSlotMachine->unk2E[1] = 0; - return; - } - } - for (j = 1; j < 5; j++) - { - if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - j)) - { - if (eSlotMachine->unk34[0] == 1) - { - if (j < 3) - { - eSlotMachine->unk34[1] = 2; - eSlotMachine->unk2E[1] = j + 1; - } - else - { - eSlotMachine->unk34[1] = 1; - eSlotMachine->unk2E[1] = j; - } - } - else - { - if (j < 3) - { - eSlotMachine->unk34[1] = 3; - eSlotMachine->unk2E[1] = j; - } - else - { - eSlotMachine->unk34[1] = 2; - eSlotMachine->unk2E[1] = j - 1; - } - } - return; - } - } - } - } - } -} - -static bool8 sub_8103764(u8 a0, u8 a1) -{ - if ((a0 == 0 && a1 == 1) || (a0 == 1 && a1 == 0)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_810378C(u8 a0, u8 a1, u8 a2) -{ - if ((a0 == 0 && a1 == 1 && a2 == 0) || (a0 == 1 && a1 == 0 && a2 == 1)) - return TRUE; - else - return FALSE; -} - -static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2) -{ - if ((a0 == 0 && a1 == 1 && a2 == 0) || - (a0 == 1 && a1 == 0 && a2 == 1) || - (a0 == 0 && a1 == 0 && a2 == 1) || - (a0 == 1 && a1 == 1 && a2 == 0) || - (a0 == a1 && a0 == a2)) - { - return FALSE; - } - return TRUE; -} - -static void (*const gUnknown_083ECB94[])(void) = -{ - sub_8103830, - sub_8103910, - sub_8103A78 -}; - -static void sub_810380C(void) -{ - gUnknown_083ECB94[eSlotMachine->bet - 1](); -} - -static void sub_8103830(void) -{ - s16 i = 0; - u8 r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]); - u8 r1 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); - if (r5 == r1) - { - while (1) - { - u8 r0; - if (!(r5 == (r0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) || (r5 == 0 && r0 == 1) || (r5 == 1 && r0 == 0))) - break; - i++; - } - } - else if (sub_8103764(r5, r1)) - { - if (eSlotMachine->unk04 & 0x80) - { - for (i = 0; i < 5; i++) - { - if (r5 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) - { - eSlotMachine->unk2E[2] = i; - return; - } - } - } - i = 0; - while (1) - { - if (r5 != GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) - break; - i++; - } - } - eSlotMachine->unk2E[2] = i; -} - -static void sub_8103910(void) -{ - s16 sp0 = 0; - s16 i; - u8 r7; - u8 r6; - u8 r4; - - if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] == eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80) - { - r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); - r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]); - if (sub_8103764(r7, r6)) - { - for (i = 0; i < 5; i++) - { - r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, eSlotMachine->unk34[1] - i); - if (r7 == r4) - { - sp0 = i; - break; - } - } - } - } - while (1) - { - s16 r8; - for (i = 1, r8 = 0; i < 4; i++) - { - r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, i - eSlotMachine->unk2E[0]); - r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, i - eSlotMachine->unk2E[1]); - r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, i - sp0); - if (!sub_81037BC(r7, r6, r4) && (!sub_810378C(r7, r6, r4) || !(eSlotMachine->unk04 & 0x80))) - { - r8++; - break; - } - } - if (r8 == 0) - break; - sp0++; - } - eSlotMachine->unk2E[2] = sp0; -} - -static void sub_8103A78(void) -{ - u8 r6; - u8 r5; - u8 r4; - s16 r8; - s16 i; - - sub_8103910(); - if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] != eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80) - { - r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); - r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]); - if (sub_8103764(r6, r5)) - { - r8 = 1; - if (eSlotMachine->unk34[0] == 1) - r8 = 3; - for (i = 0; i < 5; i++) - { - r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - (eSlotMachine->unk2E[2] + i)); - if (r6 == r4) - { - eSlotMachine->unk2E[2] += i; - break; - } - } - } - } - while (1) - { - r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - eSlotMachine->unk2E[0]); - r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); - r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 3 - eSlotMachine->unk2E[2]); - if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80)) - break; - eSlotMachine->unk2E[2]++; - } - while (1) - { - r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - eSlotMachine->unk2E[0]); - r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); - r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 1 - eSlotMachine->unk2E[2]); - if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80)) - break; - eSlotMachine->unk2E[2]++; - } -} - -static void sub_8103C14(u8 a0) -{ - u8 taskId = CreateTask(sub_8103C48, 5); - gTasks[taskId].data[15] = a0; - sub_8103C48(taskId); -} - -static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = -{ - sub_8103C78, - sub_8103CAC, - sub_8103CC8 -}; - -static void sub_8103C48(u8 taskId) -{ - gUnknown_083ECBA0[gTasks[taskId].data[0]](gTasks + taskId, taskId); -} - -static const s16 gUnknown_083ECBAC[] = {5, 10, 15}; - -static void sub_8103C78(struct Task *task, u8 taskId) -{ - sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x62, 0x63, 0x72, 0x73); - task->data[0]++; -} - -static void sub_8103CAC(struct Task *task, u8 taskId) -{ - if (++task->data[1] > 11) - task->data[0]++; -} - -static void sub_8103CC8(struct Task *task, u8 taskId) -{ - sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x42, 0x43, 0x52, 0x53); - DestroyTask(taskId); -} - -static const u16 *const gUnknown_083EDD08[]; -static const u16 *const gUnknown_083EDD1C[]; -static const u8 gUnknown_083EDD30[]; - -static void sub_8103D00(u8 a0) -{ - LoadPalette(gUnknown_083EDD08[a0], gUnknown_083EDD30[a0], 2); -} - -static void sub_8103D28(u8 a0) -{ - LoadPalette(gUnknown_083EDD1C[a0], gUnknown_083EDD30[a0], 2); -} - -static const u8 gUnknown_083EDD35[][2]; -static const u8 gUnknown_083EDD3B[]; - -static void sub_8103D50(u8 a0) -{ - u8 i; - for (i = 0; i < gUnknown_083EDD3B[a0]; i++) - sub_8103D00(gUnknown_083EDD35[a0][i]); -} - -static void sub_8103D8C(u8 a0) -{ - u8 i; - for (i = 0; i < gUnknown_083EDD3B[a0]; i++) - sub_8103D28(gUnknown_083EDD35[a0][i]); -} - -static void sub_8103DC8(void) -{ - u8 i; - for (i = 0; i < 5; i++) - { - u8 spriteId = CreateInvisibleSprite(sub_8103EE4); - gSprites[spriteId].data[0] = i; - eSlotMachine->unk44[i] = spriteId; - } -} - -static void sub_8103E04(u8 a0) -{ - struct Sprite *sprite = gSprites + eSlotMachine->unk44[a0]; - sprite->data[1] = 1; - sprite->data[2] = 4; - sprite->data[3] = 0; - sprite->data[4] = 0; - sprite->data[5] = 2; - sprite->data[7] = 0; -} - -static bool8 sub_8103E38(void) -{ - u8 i; - for (i = 0; i < 5; i++) - { - struct Sprite *sprite = &gSprites[eSlotMachine->unk44[i]]; - if (sprite->data[1] && sprite->data[2]) - return FALSE; - } - return TRUE; -} - -static bool8 sub_8103E7C(void) -{ - u8 i; - for (i = 0; i < 5; i++) - { - if (!sub_8103EAC(eSlotMachine->unk44[i])) - return FALSE; - } - return TRUE; -} - -static bool8 sub_8103EAC(u8 spriteId) -{ - struct Sprite *sprite = gSprites + spriteId; - if (!sprite->data[1]) - return TRUE; - if (sprite->data[7]) - sprite->data[1] = 0; - return sprite->data[7]; -} - -static void sub_8103EE4(struct Sprite *sprite) -{ - s16 r4; - if (sprite->data[1]) - { - if (!sprite->data[3]--) - { - sprite->data[7] = 0; - sprite->data[3] = 1; - sprite->data[4] += sprite->data[5]; - r4 = 4; - if (sprite->data[2]) - r4 = 8; - if (sprite->data[4] <= 0) - { - sprite->data[7] = 1; - sprite->data[5] = -sprite->data[5]; - if (sprite->data[2]) - sprite->data[2]--; - } - else if (sprite->data[4] >= r4) - sprite->data[5] = -sprite->data[5]; - if (sprite->data[2]) - sprite->data[3] <<= 1; - } - MultiplyPaletteRGBComponents(gUnknown_083EDD30[sprite->data[0]], sprite->data[4], sprite->data[4], sprite->data[4]); - } -} - -static void sub_8103F70(void) -{ - u8 taskId = CreateTask(sub_8103FE8, 6); - gTasks[taskId].data[3] = 1; - sub_8103FE8(taskId); -} - -static const u16 *const gUnknown_083EDDA0[]; -static const u16 *const gUnknown_083EDDAC; - -static bool8 sub_8103FA0(void) -{ - u8 taskId = FindTaskIdByFunc(sub_8103FE8); - if (!gTasks[taskId].data[2]) - { - DestroyTask(taskId); - LoadPalette(gUnknown_083EDDAC, 0x10, 0x20); - return TRUE; - } - return FALSE; -} - -static void sub_8103FE8(u8 taskId) -{ - struct Task *task = gTasks + taskId; - if (!task->data[1]--) - { - task->data[1] = 4; - task->data[2] += task->data[3]; - if (task->data[2] == 0 || task->data[2] == 2) - task->data[3] = -task->data[3]; - } - LoadPalette(gUnknown_083EDDA0[task->data[2]], 0x10, 0x20); -} - -static void sub_8104048(void) -{ - eSlotMachine->unk3E = CreateTask(sub_81040E8, 8); -} - -static void sub_8104064(u8 pikaPower) -{ - struct Task *task = gTasks + eSlotMachine->unk3E; - sub_810421C(task); - task->data[0] = 1; - task->data[1]++; - task->data[15] = 1; -} - -static void sub_8104098(void) -{ - struct Task *task = gTasks + eSlotMachine->unk3E; - sub_810421C(task); - task->data[0] = 3; - task->data[15] = 1; -} - -static bool8 sub_81040C8(void) -{ - return gTasks[eSlotMachine->unk3E].data[15]; -} - -static void (*const gUnknown_083ECBB4[])(struct Task *task) = -{ - nullsub_68, - sub_810411C, - sub_8104144, - sub_81041AC -}; - -static void sub_81040E8(u8 taskId) -{ - gUnknown_083ECBB4[gTasks[taskId].data[0]](gTasks + taskId); -} - -static void nullsub_68(struct Task *task) -{ -} - -static void sub_810411C(struct Task *task) -{ - task->data[2] = sub_8105B1C((task->data[1] << 3) + 20, 20); - task->data[0]++; -} - -static const u16 gUnknown_083ECBC4[][2] = -{ - {0x9e, 0x6e}, - {0x9f, 0x6f}, - {0xaf, 0x7f}, -}; - -static void sub_8104144(struct Task *task) -{ - u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); - if (gSprites[task->data[2]].data[7]) - { - s16 r2 = task->data[1] + 2; - u8 r0 = 0; - if (task->data[1] == 1) - r0 = 1; - else if (task->data[1] == 16) - r0 = 2; - vaddr[r2 + 0x40] = gUnknown_083ECBC4[r0][0]; - sub_8105B88(task->data[2]); - task->data[0] = 0; - task->data[15] = 0; - } -} - -static void sub_81041AC(struct Task *task) -{ - u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); - s16 r4 = task->data[1] + 2; - u8 r2 = 0; - if (task->data[1] == 1) - r2 = 1; - else if (task->data[1] == 16) - r2 = 2; - if (task->data[2] == 0) - { - vaddr[r4 + 0x40] = gUnknown_083ECBC4[r2][1]; - task->data[1]--; - } - if (++task->data[2] >= 20) - task->data[2] = 0; - if (task->data[1] == 0) - { - task->data[0] = 0; - task->data[15] = 0; - } -} - -static void sub_810421C(struct Task *task) -{ - u8 i; - - for (i = 2; i < 16; i++) - task->data[i] = 0; -} - -static void sub_810423C(u8 pikaPower) -{ - s16 i; - u8 r3; - s16 r2 = 3; - u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); - for (i = 0; i < pikaPower; i++, r2++) - { - r3 = 0; - if (i == 0) - r3 = 1; - else if (i == 15) - r3 = 2; - vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][0]; - } - for (; i < 16; i++, r2++) - { - r3 = 0; - if (i == 0) - r3 = 1; - else if (i == 15) - r3 = 2; - vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][1]; - } - gTasks[eSlotMachine->unk3E].data[1] = pikaPower; -} - -static void sub_810430C(void) -{ - u8 taskId = CreateTask(sub_810434C, 7); - sub_810434C(taskId); -} - -static bool8 sub_810432C(void) -{ - if (FindTaskIdByFunc(sub_810434C) == 0xFF) - return TRUE; - return FALSE; -} - -static void (*const gUnknown_083ECBD0[])(struct Task *task) = -{ - sub_810437C, - sub_81043EC, - sub_8104468, - sub_8104498, - sub_8104548, - sub_8104598, - sub_81045CC, - sub_810463C, - sub_81046C0, - sub_8104764, - sub_8104794, - sub_81047EC, - sub_8104860, - sub_81048A8, - sub_81048CC, - sub_8104940, - sub_81049C8, - sub_8104794, - sub_81049F8 -}; - -static void sub_810434C(u8 taskId) -{ - gUnknown_083ECBD0[gTasks[taskId].data[0]](gTasks + taskId); -} - -static void sub_810437C(struct Task *task) -{ - eSlotMachine->unk0A = 0; - eSlotMachine->unk14 = 0; - eSlotMachine->unk16 = 0; - task->data[0]++; - task->data[1] = 0; - task->data[2] = 30; - task->data[4] = 1280; - gSpriteCoordOffsetX = 0; - gSpriteCoordOffsetY = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - sub_8104A40(30, 0); - sub_81051C0(); - sub_8105100(); - sub_81052EC(); - sub_81053A0(); - sub_810545C(); - sub_8102680(); - StopMapMusic(); - PlayNewMapMusic(BGM_BD_TIME); -} - -static void sub_81043EC(struct Task *task) -{ - s16 r3; - gSpriteCoordOffsetX -= 8; - task->data[1] += 8; - r3 = ((task->data[1] + 240) & 0xff) >> 3; - REG_BG1HOFS = task->data[1] & 0x1ff; - if (r3 != task->data[2] && task->data[3] <= 18) - { - task->data[2] = r3; - task->data[3] = task->data[1] >> 3; - sub_8104A40(r3, task->data[3]); - } - if (task->data[1] >= 200) - { - task->data[0]++; - task->data[3] = 0; - } - sub_8102D28(task->data[4] >> 8); -} - -static void sub_8104468(struct Task *task) -{ - sub_8102D28(task->data[4] >> 8); - if (++task->data[5] >= 60) - { - task->data[0]++; - sub_8105578(); - sub_81056F0(); - } -} - -static void sub_8104498(struct Task *task) -{ - int r5; - u8 sp0[] = {1, 1, 2, 2}; - s16 sp4[] = {0x40, 0x30, 0x18, 0x08}; - s16 spC[] = {10, 8, 6, 4}; - - sub_8102D28(task->data[4] >> 8); - task->data[4] -= 4; - r5 = 4 - (task->data[4] >> 8); - sub_8105688(sp4[r5]); - sub_81057E8(spC[r5]); - StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, sp0[r5]); - if (task->data[4] <= 0x100) - { - task->data[0]++; - task->data[4] = 0x100; - task->data[5] = 0; - } -} - -static void sub_8104548(struct Task *task) -{ - sub_8102D28(task->data[4] >> 8); - if (++task->data[5] >= 80) - { - task->data[0]++; - task->data[5] = 0; - sub_81057E8(2); - StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 3); - } -} - -static void sub_8104598(struct Task *task) -{ - sub_8102D28(task->data[4] >> 8); - task->data[4] = (u8)task->data[4] + 0x80; - if (++task->data[5] >= 80) - { - task->data[0]++; - task->data[5] = 0; - } -} - -static void sub_81045CC(struct Task *task) -{ - sub_8102D28(task->data[4] >> 8); - task->data[4] = (u8)task->data[4] + 0x40; - if (++task->data[5] >= 40) - { - task->data[5] = 0; - if (eSlotMachine->unk05) - { - if (eSlotMachine->unk0A <= task->data[6]) - task->data[0]++; - } - else if (task->data[6] > 3) - { - task->data[0]++; - } - else if (sub_81026DC(task->data[6])) - { - task->data[0] = 14; - } - task->data[6]++; - } -} - -static void sub_810463C(struct Task *task) -{ - s16 r5 = eSlotMachine->unk14 % 20; - if (r5) - { - r5 = sub_8102D5C(task->data[4] >> 8); - task->data[4] = (u8)task->data[4] + 0x40; - } - else if (sub_8102C48(1) != eSlotMachine->unk05) - { - sub_8102D28(task->data[4] >> 8); - r5 = eSlotMachine->unk14 % 20; - task->data[4] = (u8)task->data[4] + 0x40; - } - if (r5 == 0 && sub_8102C48(1) == eSlotMachine->unk05) - { - task->data[4] = 0; - task->data[0]++; - } -} - -static void sub_81046C0(struct Task *task) -{ - if (++task->data[4] >= 60) - { - StopMapMusic(); - sub_81056C0(); - sub_8105804(); - task->data[0]++; - if(eSlotMachine->unk05 == 0) - { - task->data[4] = 0xa0; - StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5); - PlayFanfare(BGM_ME_ZANNEN); - } - else - { - task->data[4] = 0xc0; - StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 4); - gSprites[eSlotMachine->unk3F].animCmdIndex = 0; - if (eSlotMachine->pikaPower) - { - sub_8104098(); - eSlotMachine->pikaPower = 0; - } - PlayFanfare(BGM_ME_B_SMALL); - } - } -} - -static void sub_8104764(struct Task *task) -{ - if ((task->data[4] == 0 || --task->data[4] == 0) && !sub_81040C8()) - task->data[0]++; -} - -static void sub_8104794(struct Task *task) -{ - s16 r4; - gSpriteCoordOffsetX -= 8; - task->data[1] += 8; - task->data[3] += 8; - r4 = ((task->data[1] - 8) & 0xff) >> 3; - REG_BG1HOFS = task->data[1] & 0x1ff; - if (task->data[3] >> 3 <= 25) - sub_8104A88(r4); - else - task->data[0]++; -} - -static void sub_81047EC(struct Task *task) -{ - eSlotMachine->unk0B = 0; - eSlotMachine->unk0A = eSlotMachine->unk05; - gSpriteCoordOffsetX = 0; - REG_BG1HOFS = 0; - eSlotMachine->unk1A = 8; - sub_810514C(); - sub_81054B8(); - sub_8105524(); - PlayNewMapMusic(eSlotMachine->backupMapMusic); - if (eSlotMachine->unk0A == 0) - { - DestroyTask(FindTaskIdByFunc(sub_810434C)); - } - else - { - sub_8104CAC(4); - task->data[1] = dp15_jump_random_unknown(); - task->data[2] = 0; - task->data[3] = 0; - task->data[0]++; - } -} - -static void sub_8104860(struct Task *task) -{ - if (eSlotMachine->unk1A == task->data[1]) - task->data[0]++; - else if (eSlotMachine->unk1C[0] % 24 == 0 && (++task->data[2]& 0x07) == 0) - eSlotMachine->unk1A >>= 1; -} - -static void sub_81048A8(struct Task *task) -{ - if (sub_8104E18()) - DestroyTask(FindTaskIdByFunc(sub_810434C)); -} - -static void sub_81048CC(struct Task *task) -{ - sub_81054B8(); - sub_81056C0(); - sub_8105804(); - sub_8105854(); - gSprites[eSlotMachine->unk4E[0]].invisible = TRUE; - StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5); - task->data[0]++; - task->data[4] = 4; - task->data[5] = 0; - StopMapMusic(); - PlayFanfare(BGM_ME_ZANNEN); - PlaySE(SE_W153); -} - -static void sub_8104940(struct Task *task) -{ - gSpriteCoordOffsetY = task->data[4]; - REG_BG1VOFS = task->data[4]; - if (task->data[5] & 0x01) - task->data[4] = -task->data[4]; - if ((++task->data[5] & 0x1f) == 0) - task->data[4] >>= 1; - if (task->data[4] == 0) - { - sub_81058A0(); - sub_81058C4(); - sub_8105284(); - sub_81059E8(); - gSprites[eSlotMachine->unk4E[0]].invisible = FALSE; - task->data[0]++; - task->data[5] = 0; - } -} - -static void sub_81049C8(struct Task *task) -{ - gSpriteCoordOffsetY = 0; - REG_BG1VOFS = 0; - if (sub_8105ACC()) - { - task->data[0]++; - sub_8105AEC(); - } -} - -static void sub_81049F8(struct Task *task) -{ - gSpriteCoordOffsetX = 0; - REG_BG1HOFS = 0; - PlayNewMapMusic(eSlotMachine->backupMapMusic); - sub_810514C(); - sub_8105554(); - sub_8105524(); - sub_81059B8(); - DestroyTask(FindTaskIdByFunc(sub_810434C)); -} - -static const u16 sReelTimeWindowTilemap[]; - -static void sub_8104A40(s16 a0, s16 a1) -{ - s16 i; - - for (i = 4; i < 15; i++) - { - u16 tile = sReelTimeWindowTilemap[a1 + (i - 4) * 20]; - ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = tile; - } -} - -static void sub_8104A88(s16 a0) -{ - s16 i; - - for (i = 4; i < 15; i++) - { - ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = 0; - } -} - -static void sub_8104AB8(u8 a0) -{ - u8 taskId = CreateTask(sub_8104B0C, 1); - gTasks[taskId].data[1] = a0; - sub_8104B0C(taskId); -} - -static bool8 sub_8104AEC(void) -{ - if (FindTaskIdByFunc(sub_8104B0C) == 0xFF) - return TRUE; - else - return FALSE; -} - -static void (*const gUnknown_083ECC30[])(struct Task *task) = -{ - sub_8104B3C, - sub_8104B60, - sub_8104B80, - sub_8104B60, - sub_8104BC8, - sub_8104B60, - sub_8104BFC, - sub_8104B60, - sub_8104C44 -}; - -static void sub_8104B0C(u8 taskId) -{ - gUnknown_083ECC30[gTasks[taskId].data[0]](gTasks + taskId); -} - -static void sub_8104B3C(struct Task *task) -{ - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - task->data[0]++; -} - -static void sub_8104B60(struct Task *task) -{ - if (!gPaletteFade.active) - task->data[0]++; -} - -static void sub_8104B80(struct Task *task) -{ - sub_8104DA4(); - sub_81065DC(); - BasicInitMenuWindow(&gWindowTemplate_81E7144); - Menu_PrintTextPixelCoords(gOtherText_ReelTime, 10, 32, 1); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - task->data[0]++; -} - -static void sub_8104BC8(struct Task *task) -{ - if (gMain.newKeys & (B_BUTTON | SELECT_BUTTON)) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - task->data[0]++; - } -} - -static void sub_8104BFC(struct Task *task) -{ - Menu_EraseScreen(); - BasicInitMenuWindow(&gWindowTemplate_81E7128); - sub_81064B8(); - sub_8104CAC(task->data[1]); - sub_810423C(eSlotMachine->pikaPower); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - task->data[0]++; -} - -static void sub_8104C44(struct Task *task) -{ - DestroyTask(FindTaskIdByFunc(sub_8104B0C)); -} - -static void sub_8104C5C(void) -{ - u8 i; - struct Task *task; - i = CreateTask(sub_8104E74, 3); - eSlotMachine->unk3D = i; - task = gTasks + i; - task->data[1] = -1; - for (i = 4; i < 16; i++) - task->data[i] = MAX_SPRITES; -} - -static void LoadSlotMachineWheelOverlay(void); - -static void sub_8104CAC(u8 arg0) -{ - u8 i; - struct Task *task; - - sub_8104DA4(); - - task = gTasks + eSlotMachine->unk3D; - task->data[1] = arg0; - - for (i = 0; gUnknown_083ED048[arg0][i].unk00 != 0xFF; i++) - { - u8 spriteId; - spriteId = sub_8105BB4( - gUnknown_083ED048[arg0][i].unk00, - gUnknown_083ED048[arg0][i].unk01, - gUnknown_083ED048[arg0][i].unk02 - ); - task->data[4 + i] = spriteId; - -#ifdef GERMAN - if (arg0 == 5 && i <= 2) - gSprites[spriteId].invisible = TRUE; -#endif - } -} - -static void sub_8104D30(u8 a0, SpriteCallback a1, s16 a2, s16 a3, s16 a4) -{ - u8 i; - struct Task *task = gTasks + eSlotMachine->unk3D; - for (i = 4; i < 16; i++) - { - if (task->data[i] == MAX_SPRITES) - { - task->data[i] = sub_8105BF8(a0, a1, a2, a3, a4); - break; - } - } -} - -static void (*const gUnknown_083ED064[])(void); - -void sub_8104DA4(void) -{ - u8 i; - struct Task *task = gTasks + eSlotMachine->unk3D; - if ((u16)task->data[1] != 0xFFFF) - gUnknown_083ED064[task->data[1]](); - for (i = 4; i < 16; i++) - { - if (task->data[i] != MAX_SPRITES) - { - DestroySprite(gSprites + task->data[i]); - task->data[i] = MAX_SPRITES; - } - } -} - -static bool8 sub_8104E18(void) -{ - u8 i; - struct Task *task = gTasks + eSlotMachine->unk3D; - for (i = 4; i < 16; i++) - { - if (task->data[i] != MAX_SPRITES) - { - if (gSprites[task->data[i]].data[7]) - return FALSE; - } - } - return TRUE; -} - -static void (*const gUnknown_083ECC54[])(struct Task *task) = -{ - nullsub_69, -}; - -static void sub_8104E74(u8 taskId) -{ - gUnknown_083ECC54[gTasks[taskId].data[0]](gTasks + taskId); -} - -static void nullsub_69(struct Task *task) -{ -} - -static const struct SpriteTemplate gSpriteTemplate_83ED414; - -static void sub_8104EA8(void) -{ - s16 i; - s16 j; - s16 x; - for (i = 0, x = 0x30; i < 3; i++, x += 0x28) - { - for (j = 0; j < 120; j += 24) - { - struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED414, x, 0, 14); - sprite->oam.priority = 3; - sprite->data[0] = i; - sprite->data[1] = j; - sprite->data[3] = -1; - } - } -} - -static void sub_8104F18(struct Sprite *sprite) -{ - sprite->data[2] = eSlotMachine->unk1C[sprite->data[0]] + sprite->data[1]; - sprite->data[2] %= 120; - sprite->pos1.y = eSlotMachine->unk22[sprite->data[0]] + 28 + sprite->data[2]; - sprite->sheetTileStart = GetSpriteTileStartByTag(GetTagOfReelSymbolOnScreenAtPos(sprite->data[0], sprite->data[2] / 24)); - SetSpriteSheetFrameTileNum(sprite); -} - -static void sub_8104F8C(void) -{ - s16 i; - s16 x; - - for (x = 203, i = 1; i < 10000; i *= 10, x -= 7) - sub_8104FF4(x, 23, 0, i); - for (x = 235, i = 1; i < 10000; i *= 10, x -= 7) - sub_8104FF4(x, 23, 1, i); -} - -static const struct SpriteTemplate gSpriteTemplate_83ED42C; - -static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3) -{ - struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED42C, x, y, 13); - sprite->oam.priority = 2; - sprite->data[0] = a2; - sprite->data[1] = a3; - sprite->data[2] = a3 * 10; - sprite->data[3] = -1; -} - -static void sub_810506C(struct Sprite *sprite) -{ - u16 tag = eSlotMachine->coins; - if (sprite->data[0]) - tag = eSlotMachine->payout; - if (sprite->data[3] != tag) - { - sprite->data[3] = tag; - tag %= (u16)sprite->data[2]; - tag /= (u16)sprite->data[1]; - tag += 7; - sprite->sheetTileStart = GetSpriteTileStartByTag(tag); - SetSpriteSheetFrameTileNum(sprite); - } -} - -static const struct SpriteTemplate gSpriteTemplate_83ED444; -static const struct SubspriteTable gSubspriteTables_83ED704[]; - -static void sub_81050C4(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED444, 0x58, 0x48, 15); - gSprites[spriteId].oam.priority = 3; - SetSubspriteTables(gSprites + spriteId, gSubspriteTables_83ED704); -} - -static const struct SpriteTemplate gSpriteTemplate_83ED45C; - -static void sub_8105100(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED45C, 0x118, 0x50, 1); - gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].coordOffsetEnabled = TRUE; - eSlotMachine->unk3F = spriteId; -} - -static void sub_810514C(void) -{ - DestroySprite(gSprites + eSlotMachine->unk3F); -} - -static void sub_8105170(struct Sprite *sprite) -{ - sprite->pos2.y = sprite->pos2.x = 0; - if (sprite->animNum == 4) - { - sprite->pos2.y = sprite->pos2.x = 8; - if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0)) - sprite->pos2.y = -8; - } -} - -static const struct SpriteTemplate gSpriteTemplate_83ED474; -static const struct SpriteTemplate gSpriteTemplate_83ED48C; -static const struct SubspriteTable gSubspriteTables_83ED73C[]; -static const struct SubspriteTable gSubspriteTables_83ED75C[]; - -static void sub_81051C0(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED474, 0x170, 0x34, 7); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - sprite->coordOffsetEnabled = TRUE; - SetSubspriteTables(sprite, gSubspriteTables_83ED73C); - eSlotMachine->unk49[0] = spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83ED48C, 0x170, 0x54, 7); - sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - sprite->coordOffsetEnabled = TRUE; - SetSubspriteTables(sprite, gSubspriteTables_83ED75C); - eSlotMachine->unk49[1] = spriteId; -} - -static const struct SpriteTemplate gSpriteTemplate_83ED4A4; -static const struct SubspriteTable gSubspriteTables_83ED78C[]; - -static void sub_8105284(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4A4, 0xa8 - gSpriteCoordOffsetX, 0x50, 7); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - sprite->coordOffsetEnabled = TRUE; - SetSubspriteTables(sprite, gSubspriteTables_83ED78C); - eSlotMachine->unk42 = spriteId; -} - -static const struct SpriteTemplate gSpriteTemplate_83ED4BC; - -static void sub_81052EC(void) -{ - u8 i; - s16 r5; - for (i = 0, r5 = 0; i < 3; i++, r5 += 20) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4BC, 0x170, 0x00, 10); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - sprite->coordOffsetEnabled = TRUE; - sprite->data[7] = r5; - eSlotMachine->unk4B[i] = spriteId; - } -} - -static void sub_810535C(struct Sprite *sprite) -{ - s16 r0 = (u16)(eSlotMachine->unk14 + sprite->data[7]); - r0 %= 40; - sprite->pos1.y = r0 + 59; - StartSpriteAnimIfDifferent(sprite, sub_8102C48(r0 / 20)); -} - -static const struct SpriteTemplate gSpriteTemplate_83ED4D4; -static const struct SubspriteTable gSubspriteTables_83ED7B4[]; - -static void sub_81053A0(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x170, 0x64, 9); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = 1; - SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); - eSlotMachine->unk4E[0] = spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x120, 0x68, 4); - sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = 1; - SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); - eSlotMachine->unk4E[1] = spriteId; -} - -static const struct SpriteTemplate gSpriteTemplate_83ED4EC; -static const struct SubspriteTable gSubspriteTables_83ED7D4[]; - -static void sub_810545C(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4EC, 0x170, 0x4c, 11); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->coordOffsetEnabled = TRUE; - sprite->oam.priority = 1; - SetSubspriteTables(sprite, gSubspriteTables_83ED7D4); - eSlotMachine->unk40 = spriteId; -} - -static void sub_81054B8(void) -{ - u8 i; - - DestroySprite(&gSprites[eSlotMachine->unk40]); - for (i = 0; i < 2; i++) - DestroySprite(&gSprites[eSlotMachine->unk49[i]]); - for (i = 0; i < 3; i++) - DestroySprite(&gSprites[eSlotMachine->unk4B[i]]); -} - -static void sub_8105524(void) -{ - u8 i; - - for (i = 0; i < 2; i++) - DestroySprite(&gSprites[eSlotMachine->unk4E[i]]); -} - -static void sub_8105554(void) -{ - DestroySprite(&gSprites[eSlotMachine->unk42]); -} - -static const struct SpriteTemplate gSpriteTemplate_83ED504; - -static void sub_8105578(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0x98, 0x20, 5); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - sprite->hFlip = TRUE; - eSlotMachine->unk50[0] = spriteId; - sprite->data[0] = 8; - sprite->data[1] = -1; - sprite->data[2] = -1; - sprite->data[7] = 0x20; - - spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0xb8, 0x20, 5); - sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - eSlotMachine->unk50[1] = spriteId; - sprite->data[1] = 1; - sprite->data[2] = -1; - sprite->data[7] = 0x20; -} - -static void sub_810562C(struct Sprite *sprite) -{ - if (sprite->data[0] != 0) - { - sprite->data[0]--; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->invisible = TRUE; - } - else - { - sprite->invisible = FALSE; - sprite->pos2.x += sprite->data[1]; - sprite->pos2.y += sprite->data[2]; - if (++sprite->data[3] >= 8) - { - sprite->data[0] = sprite->data[7]; - sprite->data[3] = 0; - } - } -} - -static void sub_8105688(s16 a0) -{ - gSprites[eSlotMachine->unk50[0]].data[7] = a0; - gSprites[eSlotMachine->unk50[1]].data[7] = a0; -} - -static void sub_81056C0(void) -{ - u8 i; - - for (i = 0; i < 2; i++) - DestroySprite(&gSprites[eSlotMachine->unk50[i]]); -} - -static const struct SpriteTemplate gSpriteTemplate_83ED51C; - -static void sub_81056F0(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x48, 0x50, 3); - gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].data[0] = 1; - gSprites[spriteId].data[5] = 0; - gSprites[spriteId].data[6] = 16; - gSprites[spriteId].data[7] = 8; - eSlotMachine->unk52[0] = spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x68, 0x50, 3); - gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].hFlip = TRUE; - eSlotMachine->unk52[1] = spriteId; -} - -static const u8 gUnknown_083ECC58[2]; // don't remove this until decompiled through gUnknown_083ECCF8 - -static void sub_8105784(struct Sprite *sprite) -{ - u8 sp[] = {16, 0}; - if (sprite->data[0] && --sprite->data[6] <= 0) - { - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, sp[sprite->data[5]], sp[sprite->data[5]], sp[sprite->data[5]]); - ++sprite->data[5]; - sprite->data[5] &= 1; - sprite->data[6] = sprite->data[7]; - } -} - -static void sub_81057E8(s16 a0) -{ - gSprites[eSlotMachine->unk52[0]].data[7] = a0; -} - -static void sub_8105804(void) -{ - u8 i; - MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, 0, 0, 0); - for (i = 0; i < 2; i++) - DestroySprite(&gSprites[eSlotMachine->unk52[i]]); -} - -static const struct SpriteTemplate gSpriteTemplate_83ED534; - -static void sub_8105854(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED534, 0xa8, 0x50, 6); - gSprites[spriteId].oam.priority = 1; - eSlotMachine->unk41 = spriteId; -} - -static void sub_8105894(struct Sprite *sprite) -{ - sprite->pos2.y = gSpriteCoordOffsetY; -} - -static void sub_81058A0(void) -{ - DestroySprite(&gSprites[eSlotMachine->unk41]); -} - -static const struct SpriteTemplate gSpriteTemplate_83ED54C; - -static void sub_81058C4(void) -{ - u8 i; - u16 sp[] = {0x0, 0x40, 0x80, 0xC0}; - for (i = 0; i < 4; i++) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED54C, 0x50 - gSpriteCoordOffsetX, 0x44, 0); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = sp[i]; - eSlotMachine->unk54[i] = spriteId; - } -} - -static void sub_810594C(struct Sprite *sprite) -{ - sprite->data[0] -= 2; - sprite->data[0] &= 0xff; - sprite->pos2.x = Cos(sprite->data[0], 20); - sprite->pos2.y = Sin(sprite->data[0], 6); - sprite->subpriority = 0; - if (sprite->data[0] >= 0x80) - { - sprite->subpriority = 2; - } - if (++sprite->data[1] >= 16) - { - sprite->hFlip ^= 1; - sprite->data[1] = 0; - } -} - -static void sub_81059B8(void) -{ - u8 i; - for (i = 0; i < 4; i++) - { - DestroySprite(&gSprites[eSlotMachine->unk54[i]]); - } -} - -static const struct SpriteTemplate gSpriteTemplate_83ED564; - -static void sub_81059E8(void) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED564, 0xa8, 0x3c, 8); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.priority = 1; - sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; - InitSpriteAffineAnim(sprite); - eSlotMachine->unk43 = spriteId; -} - -static void sub_8105A38(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - { - if (sprite->affineAnimEnded) - sprite->data[0]++; - } - else if (sprite->data[0] == 1) - { - sprite->invisible ^= 1; - if (++sprite->data[2] >= 24) - { - sprite->data[0]++; - sprite->data[2] = 0; - } - } - else - { - sprite->invisible = TRUE; - if (++sprite->data[2] >= 16) - sprite->data[7] = 1; - } - sprite->data[1] &= 0xff; - sprite->data[1] += 16; - sprite->pos2.y -= (sprite->data[1] >> 8); -} - -u8 sub_8105ACC(void) -{ - return gSprites[eSlotMachine->unk43].data[7]; -} - -static void sub_8105AEC(void) -{ - struct Sprite *sprite = &gSprites[eSlotMachine->unk43]; - FreeOamMatrix(sprite->oam.matrixNum); - DestroySprite(sprite); -} - -static const struct SpriteTemplate gSpriteTemplate_83ED6CC; - -static u8 sub_8105B1C(s16 x, s16 y) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83ED6CC, x, y, 12); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.priority = 2; - sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; - InitSpriteAffineAnim(sprite); - return spriteId; -} - -static void sub_8105B70(struct Sprite *sprite) -{ - if (sprite->affineAnimEnded) - sprite->data[7] = 1; -} - -static void sub_8105B88(u8 spriteId) -{ - struct Sprite *sprite = &gSprites[spriteId]; - FreeOamMatrix(sprite->oam.matrixNum); - DestroySprite(sprite); -} - -static const s16 gUnknown_083ECE7E[][2]; -static const SpriteCallback gUnknown_083ECF0C[]; - -u8 sub_8105BB4(u8 templateIdx, u8 cbAndCoordsIdx, s16 a2) -{ - return sub_8105BF8(templateIdx, gUnknown_083ECF0C[cbAndCoordsIdx], gUnknown_083ECE7E[cbAndCoordsIdx][0], gUnknown_083ECE7E[cbAndCoordsIdx][1], a2); -} - -static const struct SpriteTemplate *const gUnknown_083EDB5C[]; -static const struct SubspriteTable *const gUnknown_083EDBC4[]; - -static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4) -{ - u8 spriteId = CreateSprite(gUnknown_083EDB5C[templateIdx], x, y, 16); - struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.priority = 3; - sprite->callback = callback; - sprite->data[6] = a4; - sprite->data[7] = 1; - if (gUnknown_083EDBC4[templateIdx]) - SetSubspriteTables(sprite, gUnknown_083EDBC4[templateIdx]); - return spriteId; -} - -static void sub_8105C64(struct Sprite *sprite) -{ - sprite->data[7] = 0; -} - -static void sub_8105C6C(struct Sprite *sprite) -{ - s16 sp0[] = {4, -4, 4, -4}; - s16 sp8[] = {4, 4, -4, -4}; - - if (sprite->data[1]++ >= 16) - { - sprite->subspriteTableNum ^= 1; - sprite->data[1] = 0; - } - sprite->pos2.x = 0; - sprite->pos2.y = 0; - if (sprite->subspriteTableNum != 0) - { - sprite->pos2.x = sp0[sprite->data[6]]; - sprite->pos2.y = sp8[sprite->data[6]]; - } -} - -static void sub_8105CF0(struct Sprite *sprite) -{ - sprite->hFlip = TRUE; - sub_8105C6C(sprite); -} - -static void sub_8105D08(struct Sprite *sprite) -{ - sprite->vFlip = TRUE; - sub_8105C6C(sprite); -} - -static void sub_8105D20(struct Sprite *sprite) -{ - sprite->hFlip = TRUE; - sprite->vFlip = TRUE; - sub_8105C6C(sprite); -} - -static void sub_8105D3C(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->pos1.x += 4; - if (sprite->pos1.x >= 0xd0) - { - sprite->pos1.x = 0xd0; - sprite->data[0]++; - } - break; - case 1: - if (++sprite->data[1] > 90) - sprite->data[0]++; - break; - case 2: - sprite->pos1.x += 4; - if (sprite->pos1.x >= 0x110) - sprite->data[0]++; - break; - case 3: - sprite->data[7] = 0; - break; - } -} - -static void sub_8105DA4(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->pos1.x -= 4; - if (sprite->pos1.x <= 0xd0) - { - sprite->pos1.x = 0xd0; - sprite->data[0]++; - } - break; - case 1: - if (++sprite->data[1] > 90) - sprite->data[0]++; - break; - case 2: - sprite->pos1.x -= 4; - if (sprite->pos1.x <= 0x90) - sprite->data[0]++; - break; - case 3: - sprite->data[7] = 0; - break; - } -} - -static void sub_8105E08(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - StartSpriteAnim(sprite, eSlotMachine->unk0A - 1); - sprite->data[0]++; - // fallthrough - case 1: - if (++sprite->data[1] >= 4) - { - sprite->data[0]++; - sprite->data[1] = 0; - } - break; - case 2: - sprite->pos1.x += 4; - if (sprite->pos1.x >= 0xd0) - { - sprite->pos1.x = 0xd0; - sprite->data[0]++; - } - break; - case 3: - if (++sprite->data[1] > 90) - sprite->data[0]++; - break; - case 4: - sprite->pos1.x += 4; - if (sprite->pos1.x >= 0xf8) - sprite->data[0]++; - break; - case 5: - sprite->data[7] = 0; - break; - } -} - -static void sub_8105EB4(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->animPaused = TRUE; - sprite->data[0]++; - // fallthrough - case 1: - sprite->pos1.y += 8; - if (sprite->pos1.y >= 0x70) - { - sprite->pos1.y = 0x70; - sprite->data[1] = 16; - sprite->data[0]++; - } - break; - case 2: - if (sprite->data[2] == 0) - { - sprite->pos1.y -= sprite->data[1]; - sprite->data[1] = -sprite->data[1]; - if (++sprite->data[3] >= 2) - { - sprite->data[1] >>= 2; - sprite->data[3] = 0; - if (sprite->data[1] == 0) - { - sprite->data[0]++; - sprite->data[7] = 0; - sprite->animPaused = FALSE; - } - } - } - sprite->data[2]++; - sprite->data[2] &= 0x07; - break; - } -} - -static void sub_8105F54(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - if (++sprite->data[1] > 8) - sprite->data[0]++; - break; - case 1: - sprite->pos1.y += 2; - if (sprite->pos1.y >= 0x30) - { - sprite->pos1.y = 0x30; - sprite->data[0]++; - sprite->data[7] = 0; - } - break; - } -} - -static void sub_8105F9C(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->invisible = TRUE; - if (++sprite->data[1] > 0x20) - { - sprite->data[0]++; - sprite->data[1] = 5; - sprite->oam.mosaic = TRUE; - sprite->invisible = FALSE; - StartSpriteAnim(sprite, 1); - REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; - } - break; - case 1: - sprite->data[1] -= (sprite->data[2] >> 8); - if (sprite->data[1] < 0) - sprite->data[1] = 0; - REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; - sprite->data[2] &= 0xff; - sprite->data[2] += 0x80; - if (sprite->data[1] == 0) - { - sprite->data[0]++; - sprite->data[7] = 0; - sprite->oam.mosaic = FALSE; - StartSpriteAnim(sprite, 0); - } - break; - } -} - -static const u16 *const gUnknown_083EDE10[]; - -static void sub_8106058(struct Sprite *sprite) -{ - if (sprite->data[1] < 3) - { - LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); - if (++sprite->data[2] >= 4) - { - sprite->data[1]++; - sprite->data[2] = 0; - } - } - else - { - LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); - if (++sprite->data[2] >= 25) - { - sprite->data[1] = 0; - sprite->data[2] = 0; - } - } - StartSpriteAnimIfDifferent(sprite, 1); - sprite->data[7] = 0; -} - -static void sub_81060FC(struct Sprite *sprite) -{ - s16 sp00[] = {0, -40, 0, 0, 48, 0, 24, 0}; - s16 sp10[] = {-32, 0, -32, -48, 0, -48, 0, -48}; - s16 sp20[] = {16, 12, 16, 0, 0, 4, 8, 8}; - - switch (sprite->data[0]) - { - case 0: - sprite->pos2.x = sp00[sprite->data[6]]; - sprite->pos2.y = sp10[sprite->data[6]]; - sprite->data[1] = sp20[sprite->data[6]]; - sprite->data[0]++; - // fallthrough - case 1: - if (sprite->data[1]-- == 0) - sprite->data[0]++; - break; - case 2: - if (sprite->pos2.x > 0) - sprite->pos2.x -= 4; - else if (sprite->pos2.x < 0) - sprite->pos2.x += 4; - - if (sprite->pos2.y > 0) - sprite->pos2.y -= 4; - else if (sprite->pos2.y < 0) - sprite->pos2.y += 4; - - if (sprite->pos2.x == 0 && sprite->pos2.y == 0) - sprite->data[0]++; - break; - } -} - -static void sub_81061C8(struct Sprite *sprite) -{ - s16 sp0[] = {160, 192, 224, 104, 80, 64, 48, 24}; - - if (sprite->data[0] == 0) - { - sprite->data[0]++; - sprite->data[1] = 12; - } - sprite->pos2.x = Cos(sp0[sprite->data[6]], sprite->data[1]); - sprite->pos2.y = Sin(sp0[sprite->data[6]], sprite->data[1]); - if (sprite->data[1] != 0) - sprite->data[1]--; -} - -static void sub_8106230(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - eSlotMachine->winIn = 0x2f; - eSlotMachine->winOut = 0x3f; - eSlotMachine->win0v = 0x2088; - sprite->invisible = TRUE; - sprite->data[0]++; - // fallthrough - case 1: - sprite->data[1] += 2; - sprite->data[2] = sprite->data[1] + 0xb0; - sprite->data[3] = 0xf0 - sprite->data[1]; - if (sprite->data[2] > 0xd0) - sprite->data[2] = 0xd0; - if (sprite->data[3] < 0xd0) - sprite->data[3] = 0xd0; - eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; - if (sprite->data[1] > 0x33) - { - sprite->data[0]++; - eSlotMachine->winIn = 0x3f; - } - break; - case 2: - if (eSlotMachine->bet == 0) - break; - sub_8104D30(5, SpriteCallbackDummy, 0xd0, 0x74, 0); - eSlotMachine->win0h = 0xc0e0; - eSlotMachine->win0v = 0x6880; - eSlotMachine->winIn = 0x2f; - sprite->data[0]++; - sprite->data[1] = 0; - // fallthrough - case 3: - sprite->data[1] += 2; - sprite->data[2] = sprite->data[1] + 0xc0; - sprite->data[3] = 0xe0 - sprite->data[1]; - if (sprite->data[2] > 0xd0) - sprite->data[2] = 0xd0; - if (sprite->data[3] < 0xd0) - sprite->data[3] = 0xd0; - eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; - if (sprite->data[1] > 0x0f) - { - sprite->data[0]++; - eSlotMachine->winIn = 0x3f; - } - break; - } -} - -static void nullsub_70(void) -{ -} - -static void sub_8106364(void) -{ - REG_MOSAIC = 0; -} - -static const u16 *const gUnknown_083EDE20; - -static void sub_8106370(void) -{ - LoadPalette(gUnknown_083EDE20, (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); -} - -static void sub_810639C(void) -{ - eSlotMachine->win0h = 0xf0; - eSlotMachine->win0v = 0xa0; - eSlotMachine->winIn = 0x3f; - eSlotMachine->winOut = 0x3f; -} - -static const u8 sReelTimeGfx[]; -static const struct SpriteSheet sSlotMachineSpriteSheets[]; -static const struct SpritePalette gSlotMachineSpritePalettes[]; - -static void sub_81063C0(void) -{ - sub_8106404(); - LZDecompressWram(gSlotMachineReelTimeLights_Gfx, eSlotMachineGfxBuffer); - LZDecompressWram(sReelTimeGfx, eSlotMachineReelTimeGfxBuffer); - LoadSpriteSheets(sSlotMachineSpriteSheets); - LoadSpritePalettes(gSlotMachineSpritePalettes); -} - -static const u8 *const gUnknown_083EDCE4; -static const struct SpriteSheet gUnknown_083EDCDC; - -static void sub_8106404(void) -{ - u8 *dest = eSlotMachineGfxBuffer; - u8 i = 0; - const struct SpriteSheet *sheet = &gUnknown_083EDCDC; - const u8 *src = gUnknown_083EDCE4; - for (i = 0; i < 0x40; i++) - { - u8 j; - for (j = 0; j < 0x20; j++, dest++) - *dest = src[j]; - } - LoadSpriteSheet(sheet); -} - -static void sub_8106448(void) -{ - LZDecompressWram(gSlotMachine_Gfx, eSlotMachineGfxBuffer); - - DmaCopyLarge16(3, eSlotMachineGfxBuffer, BG_VRAM, SLOTMACHINE_GFX_TILES * 32, 0x1000); - - LoadPalette(gUnknown_08E95A18, 0, 160); - LoadPalette(gPalette_83EDE24, 208, 32); -} - -static void sub_81064B8(void) -{ - CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); - LoadSlotMachineWheelOverlay(); -} - -static void LoadSlotMachineWheelOverlay(void) -{ - s16 x, y, dx; - u16 *screen; - - screen = BG_SCREEN_ADDR(30); - - for (x = 4; x < 18; x += 5) - { - for (dx = 0; dx < 4; dx++) - { - screen[5 * 32 + dx + x] = 0x2051; - screen[13 * 32 + dx + x] = 0x2851; - screen[6 * 32 + dx + x] = 0x2061; - screen[12 * 32 + dx + x] = 0x2861; - } - - screen[6 * 32 + x] = 0x20BE; - screen[12 * 32 + x] = 0x28BE; - - for (y = 7; y <= 11; y++) - screen[y * 32 + x] = 0x20BF; - } -} - -static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) -{ - u16 *vram = BG_SCREEN_ADDR(29); - - vram[15 * 32 + arg0] = arg1; - vram[15 * 32 + 1 + arg0] = arg2; - vram[16 * 32 + arg0] = arg3; - vram[16 * 32 + 1 + arg0] = arg4; -} - -static void sub_81065DC(void) -{ - s16 y, x; - u16 *screen; - - CpuCopy16(gUnknown_08E95FB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); - - screen = BG_SCREEN_ADDR(30); - for (y = 0; y < 20; y++) - { - for (x = 0; x < 30; x++) - screen[x + y * 32] = 0; - } -} - -static const u8 sReelSymbols[][21] = -{ - { - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY - }, - { - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_CHERRY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_CHERRY - }, - { - SLOT_MACHINE_TAG_7_RED, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_7_BLUE, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_AZURILL, - SLOT_MACHINE_TAG_POWER, - SLOT_MACHINE_TAG_REPLAY, - SLOT_MACHINE_TAG_LOTAD, - SLOT_MACHINE_TAG_CHERRY - }, -}; - -static const u8 gUnknown_083ECCF1[] = { - 1, 0, 5, 4, 3, 2 -}; - -static const s16 gUnknown_083ECCF8[][2] = { - {0, 6}, - {0, 10}, - {0, 2} -}; - -static const u8 gUnknown_083ECD04[][3] = { - {1, 1, 12}, - {1, 1, 14}, - {2, 2, 14}, - {2, 2, 14}, - {2, 3, 16}, - {3, 3, 16} -}; - -static const u8 gUnknown_083ECD16[][6] = { - {25, 25, 30, 40, 40, 50}, - {25, 25, 30, 30, 35, 35}, - {25, 25, 30, 25, 25, 30} -}; - -static const u8 gUnknown_083ECD28[][6] = { - {20, 25, 25, 20, 25, 25}, - {12, 15, 15, 18, 19, 22}, - {25, 25, 25, 30, 30, 40}, - {25, 25, 20, 20, 15, 15}, - {40, 40, 35, 35, 40, 40} -}; - -static const u8 gUnknown_083ECD46[][17] = { - {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5}, - { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5}, - { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40}, - { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100}, - { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6} -}; - -static const u8 gUnknown_083ECDAC[][17] = { - { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5}, - { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6}, - { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35}, - { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50}, - { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60} -}; - -static const u16 gUnknown_083ECE12[] = { - 0x80, 0xaf, 0xc8, 0xe1, 0x100 -}; - -static const u16 gUnknown_083ECE1C[][2] = { - {10, 5}, - {10, 10}, - {10, 15}, - {10, 25}, - {10, 35} -}; - -static const u16 gUnknown_083ECE30[] = { - 0, 5, 10, 15, 20 -}; - - -static const u8 gUnknown_083ECE3A[] = { - 6, 4, 3, 2, 5, 0, 0, 0 -}; - -static const u16 gUnknown_083ECE42[] = { - 0x80, 0x20, 0x40 -}; - -static const u16 gUnknown_083ECE48[] = { - 0x10, 0x08, 0x04, 0x02, 0x01 -}; - -static const u8 sSym2Match[] = { - SLOT_MACHINE_MATCHED_777_RED, - SLOT_MACHINE_MATCHED_777_BLUE, - SLOT_MACHINE_MATCHED_AZURILL, - SLOT_MACHINE_MATCHED_LOTAD, - SLOT_MACHINE_MATCHED_1CHERRY, - SLOT_MACHINE_MATCHED_POWER, - SLOT_MACHINE_MATCHED_REPLAY -}; - -static const u16 sSlotMatchFlags[] = { - 1 << SLOT_MACHINE_MATCHED_1CHERRY, - 1 << SLOT_MACHINE_MATCHED_2CHERRY, - 1 << SLOT_MACHINE_MATCHED_REPLAY, - 1 << SLOT_MACHINE_MATCHED_LOTAD, - 1 << SLOT_MACHINE_MATCHED_AZURILL, - 1 << SLOT_MACHINE_MATCHED_POWER, - 1 << SLOT_MACHINE_MATCHED_777_MIXED, - 1 << SLOT_MACHINE_MATCHED_777_RED, - 1 << SLOT_MACHINE_MATCHED_777_BLUE -}; - -static const u16 sSlotPayouts[] = { - 2, 4, 0, 6, 12, 3, 90, 300, 300 -}; - -static const s16 gUnknown_083ECE7E[][2] = { - { 0xd0, 0x38}, - { 0xb8, 0x00}, - { 0xc8, 0x08}, - { 0xd8, 0x10}, - { 0xe8, 0x18}, - { 0xd0, 0x48}, - { 0xd0, 0x08}, - { 0xd0, 0x40}, - { 0xd0, 0x38}, - { 0xc0, 0x58}, - { 0xe0, 0x58}, - { 0xc0, 0x78}, - { 0xe0, 0x78}, - { 0x90, 0x38}, - {0x110, 0x58}, - { 0xa8, 0x70}, - { 0xd0, 0x54}, - { 0xd0, 0x70}, - { 0xbc, 0x34}, - { 0xd0, 0x34}, - { 0xe4, 0x34}, - { 0xb8, 0x48}, - { 0xc4, 0x48}, - { 0xd0, 0x48}, - { 0xdc, 0x48}, - { 0xe8, 0x48}, - { 0xbc, 0x34}, - { 0xd0, 0x34}, - { 0xe4, 0x34}, - { 0xb8, 0x48}, - { 0xc4, 0x48}, - { 0xd0, 0x48}, - { 0xdc, 0x48}, - { 0xe8, 0x48}, - { 0x00, 0x00} -}; - -static const SpriteCallback gUnknown_083ECF0C[] = { - sub_8105C64, - sub_8105F54, - sub_8105F54, - sub_8105F54, - sub_8105F54, - sub_8105F9C, - sub_8105EB4, - sub_8105C64, - sub_8105C64, - sub_8105C6C, - sub_8105CF0, - sub_8105D08, - sub_8105D20, - sub_8105D3C, - sub_8105DA4, - sub_8105E08, - sub_8105C64, - sub_8106058, - sub_81060FC, - sub_81060FC, - sub_81060FC, - sub_81060FC, - sub_81060FC, - sub_81060FC, - sub_81060FC, - sub_81060FC, - sub_81061C8, - sub_81061C8, - sub_81061C8, - sub_81061C8, - sub_81061C8, - sub_81061C8, - sub_81061C8, - sub_81061C8, - sub_8106230 -}; - -static const struct UnkStruct1 Unknown_83ECF98[] = { - {25, 34, 0}, - {2, 0, 0}, - {9, 16, 0}, - {255, 0, 0} -}; - -static const struct UnkStruct1 Unknown_83ECFA8[] = { - {10, 1, 0}, - {11, 2, 0}, - {12, 3, 0}, - {13, 4, 0}, - {5, 5, 0}, - {8, 6, 0}, - {255, 0, 0} -}; - -static const struct UnkStruct1 Unknown_83ECFC4[] = { - {3, 7, 0}, - {8, 17, 0}, - {255, 0, 0} -}; - -static const struct UnkStruct1 Unknown_83ECFD0[] = { - {4, 8, 0}, - {6, 9, 0}, - {6, 10, 1}, - {6, 11, 2}, - {6, 12, 3}, - {255, 0, 0} -}; - -static const struct UnkStruct1 Unknown_83ECFE8[] = { - {0, 13, 0}, - {1, 14, 0}, - {7, 15, 0}, - {255, 0, 0} -}; - -static const struct UnkStruct1 Unknown_83ECFF8[] = { - {19, 26, 0}, - {20, 27, 1}, - {21, 28, 2}, - {14, 29, 3}, - {15, 30, 4}, - {16, 31, 5}, - {17, 32, 6}, - {18, 33, 7}, - {8, 17, 0}, - {255, 0, 0} -}; - -static const struct UnkStruct1 Unknown_83ED020[] = { - {22, 18, 0}, - {23, 19, 1}, - {24, 20, 2}, - {14, 21, 3}, - {15, 22, 4}, - {16, 23, 5}, - {17, 24, 6}, - {18, 25, 7}, - {8, 17, 0}, - {255, 0, 0} -}; - -static const struct UnkStruct1 *const gUnknown_083ED048[] = { - Unknown_83ECF98, - Unknown_83ECFA8, - Unknown_83ECFC4, - Unknown_83ECFD0, - Unknown_83ECFE8, - Unknown_83ED020, - Unknown_83ECFF8 -}; - -static void (*const gUnknown_083ED064[])(void) = { - sub_810639C, - sub_8106364, - sub_8106370, - nullsub_70, - nullsub_70, - sub_8106370, - sub_8106370 -}; - - -static const struct OamData gOamData_83ED080 = { - .y = 0x0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, - .x = 0x0, - .matrixNum = 0, - .size = 0, - .tileNum = 0x0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData gOamData_83ED088 = { - .y = 0x0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_V_RECTANGLE, - .x = 0x0, - .matrixNum = 0, - .size = 0, - .tileNum = 0x0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData gOamData_83ED090 = { - .y = 0x0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, - .x = 0x0, - .matrixNum = 0, - .size = 1, - .tileNum = 0x0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData gOamData_83ED098 = { - .y = 0x0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_V_RECTANGLE, - .x = 0x0, - .matrixNum = 0, - .size = 2, - .tileNum = 0x0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData gOamData_83ED0A0 = { - .y = 0x0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, - .x = 0x0, - .matrixNum = 0, - .size = 2, - .tileNum = 0x0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData gOamData_83ED0A8 = { - .y = 0x0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_V_RECTANGLE, - .x = 0x0, - .matrixNum = 0, - .size = 3, - .tileNum = 0x0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData gOamData_83ED0B0 = { - .y = 0x0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_H_RECTANGLE, - .x = 0x0, - .matrixNum = 0, - .size = 3, - .tileNum = 0x0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData gOamData_83ED0B8 = { - .y = 0x0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, - .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, - .x = 0x0, - .matrixNum = 0, - .size = 3, - .tileNum = 0x0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED0C0[] = { - {eSlotMachineReelTimeGfxBuffer + 0x0000, 0x800}, - {eSlotMachineReelTimeGfxBuffer + 0x0800, 0x800}, - {eSlotMachineReelTimeGfxBuffer + 0x1000, 0x800}, - {eSlotMachineReelTimeGfxBuffer + 0x1800, 0x800}, - {eSlotMachineReelTimeGfxBuffer + 0x2000, 0x800} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED0E8[] = { - {eSlotMachineReelTimeGfxBuffer + 0x2800, 0x300} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED0F0[] = { - {eSlotMachineReelTimeGfxBuffer + 0x2B00, 0x500} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED0F8[] = { - {eSlotMachineReelTimeGfxBuffer + 0x3000, 0x600} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED100[] = { - {gSpriteImage_8E988E8, 0x80}, - {gSpriteImage_8E98968, 0x80}, - {gSpriteImage_8E989E8, 0x80}, - {gSpriteImage_8E98A68, 0x80}, - {gSpriteImage_8E98AE8, 0x80}, - {gSpriteImage_8E98B68, 0x80} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED130[] = { - {gSpriteImage_8E991E8, 0x200} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED138[] = { - {gSpriteImage_8E99808, 0x40} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED140[] = { - {gSpriteImage_8E98BE8, 0x100}, - {gSpriteImage_8E98CE8, 0x100} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED150[] = { - {gSpriteImage_8E993E8, 0x400} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED158[] = { - {gSpriteImage_8E98DE8, 0x200}, - {gSpriteImage_8E98FE8, 0x200} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED168[] = { - {gSpriteImage_8E98848, 0x20} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED170[] = { - {gSpriteImage_8E98868, 0x80} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED178[] = { - {eSlotMachineGfxBuffer + 0x0000, 0x600} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED180[] = { - {eSlotMachineGfxBuffer + 0x0600, 0x200} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED188[] = { - {eSlotMachineGfxBuffer + 0x0800, 0x200} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED190[] = { - {eSlotMachineGfxBuffer + 0x0A00, 0x200} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED198[] = { - {eSlotMachineGfxBuffer + 0x0C00, 0x300} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED1A0[] = { - {eSlotMachineGfxBuffer + 0x1000, 0x400} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED1A8[] = { - {eSlotMachineGfxBuffer + 0x1400, 0x200} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED1B0[] = { - {eSlotMachineGfxBuffer + 0x1600, 0x300} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED1B8[] = { - {eSlotMachineGfxBuffer + 0x1900, 0x300} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED1C0[] = { - {eSlotMachineGfxBuffer + 0x1C00, 0x200}, - {eSlotMachineGfxBuffer + 0x1E00, 0x200}, - {eSlotMachineGfxBuffer + 0x1E00, 0x200} // is this a typo? -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED1D8[] = { - {eSlotMachineGfxBuffer + 0x2000, 0x280} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED1E0[] = { - {eSlotMachineGfxBuffer + 0x2280, 0x80}, - {eSlotMachineGfxBuffer + 0x2300, 0x80}, - {eSlotMachineGfxBuffer + 0x2380, 0x80}, - {eSlotMachineGfxBuffer + 0x2400, 0x80}, - {eSlotMachineGfxBuffer + 0x2480, 0x80} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED208[] = { - {eSlotMachineGfxBuffer + 0x2600, 0x480}, - {eSlotMachineGfxBuffer + 0x2A80, 0x480} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED218[] = { - {eSlotMachineGfxBuffer + 0x2F00, 0x180}, - {eSlotMachineGfxBuffer + 0x3080, 0x180} -}; - -static const struct SpriteFrameImage gSpriteImageTable_83ED228[] = { - {gSpriteImage_8E98828, 0x20} -}; - -static const union AnimCmd gSpriteAnim_83ED230[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED238[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED240[] = { - ANIMCMD_FRAME(0, 16), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED248[] = { - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED254[] = { - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED260[] = { - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED26C[] = { - ANIMCMD_FRAME(2, 32), - ANIMCMD_FRAME(3, 32), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED278[] = { - ANIMCMD_FRAME(4, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED280[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED288[] = { - ANIMCMD_FRAME(1, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED290[] = { - ANIMCMD_FRAME(2, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED298[] = { - ANIMCMD_FRAME(3, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED2A0[] = { - ANIMCMD_FRAME(4, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED2A8[] = { - ANIMCMD_FRAME(5, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED2B0[] = { - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(1, 4), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED2BC[] = { - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED2C8[] = { - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED2D4[] = { - ANIMCMD_FRAME(1, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED2DC[] = { - ANIMCMD_FRAME(0, 30), - ANIMCMD_FRAME(1, 30), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED2E8[] = { - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16, .hFlip = TRUE), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd gSpriteAnim_83ED2FC[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED304[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED30C[] = { - ANIMCMD_FRAME(1, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED314[] = { - ANIMCMD_FRAME(2, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED31C[] = { - ANIMCMD_FRAME(3, 1), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_83ED324[] = { - ANIMCMD_FRAME(4, 1), - ANIMCMD_END -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED32C[] = { - gSpriteAnim_83ED230 -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED330[] = { - gSpriteAnim_83ED238 -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED334[] = { - gSpriteAnim_83ED240, - gSpriteAnim_83ED248, - gSpriteAnim_83ED254, - gSpriteAnim_83ED260, - gSpriteAnim_83ED26C, - gSpriteAnim_83ED278 -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED34C[] = { - gSpriteAnim_83ED280, - gSpriteAnim_83ED288, - gSpriteAnim_83ED290, - gSpriteAnim_83ED298, - gSpriteAnim_83ED2A0, - gSpriteAnim_83ED2A8 -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED364[] = { - gSpriteAnim_83ED2B0 -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED368[] = { - gSpriteAnim_83ED2BC -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED36C[] = { - gSpriteAnim_83ED2C8, - gSpriteAnim_83ED2D4 -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED374[] = { - gSpriteAnim_83ED2DC -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED378[] = { - gSpriteAnim_83ED2E8, - gSpriteAnim_83ED2FC -}; - -static const union AnimCmd *const gSpriteAnimTable_83ED380[] = { - gSpriteAnim_83ED304, - gSpriteAnim_83ED30C, - gSpriteAnim_83ED314, - gSpriteAnim_83ED31C, - gSpriteAnim_83ED324 -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83ED394[] = { - AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), - AFFINEANIMCMD_LOOP(0), - AFFINEANIMCMD_FRAME(0x1, 0x1, 0, 1), - AFFINEANIMCMD_LOOP(255), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED3BC[] = { - gSpriteAffineAnim_83ED394 -}; - -static const union AffineAnimCmd gSpriteAffineAnim_83ED3C0[] = { - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 32), - AFFINEANIMCMD_FRAME(0x0, 0x0, 6, 32), - AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), - AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), - AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4), - AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), - AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), - AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4), - AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED410[] = { - gSpriteAffineAnim_83ED3C0 -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED414 = { - 0, 0, &gOamData_83ED0A0, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_8104F18 -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED42C = { - 7, 4, &gOamData_83ED088, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_810506C -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED444 = { - 17, 0, &gOamData_83ED0B8, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED45C = { - 0xFFFF, 1, &gOamData_83ED0B8, gSpriteAnimTable_83ED334, gSpriteImageTable_83ED0C0, gDummySpriteAffineAnimTable, sub_8105170 -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED474 = { - 0xFFFF, 2, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0E8, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED48C = { - 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F0, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED4A4 = { - 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F8, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED4BC = { - 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED34C, gSpriteImageTable_83ED100, gDummySpriteAffineAnimTable, sub_810535C -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED4D4 = { - 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED130, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED4EC = { - 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED138, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED504 = { - 0xFFFF, 4, &gOamData_83ED098, gSpriteAnimTable_83ED364, gSpriteImageTable_83ED140, gDummySpriteAffineAnimTable, sub_810562C -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED51C = { - 0xFFFF, 7, &gOamData_83ED0A8, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED150, gDummySpriteAffineAnimTable, sub_8105784 -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED534 = { - 0xFFFF, 5, &gOamData_83ED0A0, gSpriteAnimTable_83ED368, gSpriteImageTable_83ED158, gDummySpriteAffineAnimTable, sub_8105894 -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED54C = { - 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED330, gSpriteImageTable_83ED168, gDummySpriteAffineAnimTable, sub_810594C -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED564 = { - 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED170, gSpriteAffineAnimTable_83ED3BC, sub_8105A38 -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED57C = { - 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED178, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED594 = { - 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED180, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED5AC = { - 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED188, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED5C4 = { - 18, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED190, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED5DC = { - 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED198, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED5F4 = { - 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A0, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED60C = { - 19, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A8, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED624 = { - 20, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B0, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED63C = { - 21, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B8, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED654 = { - 0xFFFF, 6, &gOamData_83ED0A0, gSpriteAnimTable_83ED36C, gSpriteImageTable_83ED1C0, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED66C = { - 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1D8, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED684 = { - 0xFFFF, 6, &gOamData_83ED090, gSpriteAnimTable_83ED380, gSpriteImageTable_83ED1E0, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED69C = { - 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED378, gSpriteImageTable_83ED208, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED6B4 = { - 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED374, gSpriteImageTable_83ED218, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct SpriteTemplate gSpriteTemplate_83ED6CC = { - 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED228, gSpriteAffineAnimTable_83ED410, sub_8105B70 -}; - -static const struct Subsprite gSubspriteTable_83ED6E4[] = { - {-64, -64, ST_OAM_SQUARE, 3, 0x0, 3}, - {0, -64, ST_OAM_SQUARE, 3, 0x0, 3}, - {-64, 0, ST_OAM_SQUARE, 3, 0x0, 3}, - {0, 0, ST_OAM_SQUARE, 3, 0x0, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED704[] = { - {4, gSubspriteTable_83ED6E4} -}; - -static const struct Subsprite gSubspriteTable_83ED70C[] = { - {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 1}, - {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 1}, - {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 1}, - {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 1}, - {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 1}, - {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 1} -}; - -static const struct SubspriteTable gSubspriteTables_83ED73C[] = { - {6, gSubspriteTable_83ED70C} -}; - -static const struct Subsprite gSubspriteTable_83ED744[] = { - {-32, -20, ST_OAM_H_RECTANGLE, 3, 0x0, 1}, - {-32, 12, ST_OAM_H_RECTANGLE, 1, 0x20, 1}, - {0, 12, ST_OAM_H_RECTANGLE, 1, 0x24, 1} -}; - -static const struct SubspriteTable gSubspriteTables_83ED75C[] = { - {3, gSubspriteTable_83ED744} -}; - -static const struct Subsprite gSubspriteTable_83ED764[] = { - {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 1}, - {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 1}, - {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 1}, - {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 1}, - {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 1} -}; - -static const struct SubspriteTable gSubspriteTables_83ED78C[] = { - {5, gSubspriteTable_83ED764} -}; - -static const struct Subsprite gSubspriteTable_83ED794[] = { - {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 1}, - {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 1}, - {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 1}, - {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 1} -}; - -static const struct SubspriteTable gSubspriteTables_83ED7B4[] = { - {4, gSubspriteTable_83ED794} -}; - -static const struct Subsprite gSubspriteTable_83ED7BC[] = { - {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 1}, - {-8, -4, ST_OAM_H_RECTANGLE, 0, 0x0, 1}, - {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x0, 1} -}; - -static const struct SubspriteTable gSubspriteTables_83ED7D4[] = { - {3, gSubspriteTable_83ED7BC} -}; - -static const struct Subsprite gSubspriteTable_83ED7DC[] = { - {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 3}, - {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 3}, - {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 3}, - {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 3}, - {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED804[] = { - {5, gSubspriteTable_83ED7DC} -}; - -static const struct Subsprite gSubspriteTable_83ED80C[] = { - {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, - {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, - {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, - {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED82C[] = { - {4, gSubspriteTable_83ED80C} -}; - -static const struct Subsprite gSubspriteTable_83ED834[] = { - {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, - {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, - {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, - {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED854[] = { - {4, gSubspriteTable_83ED834} -}; - -static const struct Subsprite gSubspriteTable_83ED85C[] = { - {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, - {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, - {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, - {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED87C[] = { - {4, gSubspriteTable_83ED85C} -}; - -static const struct Subsprite gSubspriteTable_83ED884[] = { - {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, - {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, - {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, - {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 3}, - {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 3}, - {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED8B4[] = { - {6, gSubspriteTable_83ED884} -}; - -static const struct Subsprite gSubspriteTable_83ED8BC[] = { - {-16, -16, ST_OAM_SQUARE, 2, 0x0, 3} -}; - -static const struct Subsprite gSubspriteTable_83ED8C4[] = { - {-8, -8, ST_OAM_SQUARE, 1, 0x10, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED8CC[] = { - {1, gSubspriteTable_83ED8BC}, - {1, gSubspriteTable_83ED8C4} -}; - -static const struct Subsprite gSubspriteTable_83ED8DC[] = { - {-24, -24, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, - {8, -24, ST_OAM_H_RECTANGLE, 0, 0x4, 3}, - {-24, -16, ST_OAM_H_RECTANGLE, 1, 0x6, 3}, - {8, -16, ST_OAM_H_RECTANGLE, 0, 0xa, 3}, - {-24, -8, ST_OAM_H_RECTANGLE, 1, 0xc, 3}, - {8, -8, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, - {-24, 0, ST_OAM_H_RECTANGLE, 1, 0x12, 3}, - {8, 0, ST_OAM_H_RECTANGLE, 0, 0x16, 3}, - {-24, 8, ST_OAM_H_RECTANGLE, 1, 0x18, 3}, - {8, 8, ST_OAM_H_RECTANGLE, 0, 0x1c, 3}, - {-24, 16, ST_OAM_H_RECTANGLE, 1, 0x1e, 3}, - {8, 16, ST_OAM_H_RECTANGLE, 0, 0x22, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED93C[] = { - 12, gSubspriteTable_83ED8DC -}; - -static const struct Subsprite gSubspriteTable_83ED944[] = { - {-16, -12, ST_OAM_H_RECTANGLE, 2, 0x0, 3}, - {-16, 4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, - {0, 4, ST_OAM_H_RECTANGLE, 0, 0xa, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED95C[] = { - {3, gSubspriteTable_83ED944} -}; - -static const struct Subsprite gSubspriteTable_83ED964[] = { - {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, - {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED974[] = { - {2, gSubspriteTable_83ED964} -}; - -static const struct Subsprite gSubspriteTable_83ED97C[] = { - {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x2, 3}, - {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xa, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED98C[] = { - {2, gSubspriteTable_83ED97C} -}; - -static const struct Subsprite gSubspriteTable_83ED994[] = { - {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x4, 3}, - {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xc, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED9A4[] = { - {2, gSubspriteTable_83ED994} -}; - -static const struct Subsprite gSubspriteTable_83ED9AC[] = { - {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3}, - {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED9BC[] = { - {2, gSubspriteTable_83ED9AC} -}; - -static const struct Subsprite gSubspriteTable_83ED9C4[] = { - {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, - {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED9D4[] = { - {2, gSubspriteTable_83ED9C4} -}; - -static const struct Subsprite gSubspriteTable_83ED9DC[] = { - {-4, -8, ST_OAM_SQUARE, 0, 0x2, 3}, - {-4, 0, ST_OAM_SQUARE, 0, 0xa, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83ED9EC[] = { - {2, gSubspriteTable_83ED9DC} -}; - -static const struct Subsprite gSubspriteTable_83ED9F4[] = { - {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, - {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xb, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDA04[] = { - {2, gSubspriteTable_83ED9F4} -}; - -static const struct Subsprite gSubspriteTable_83EDA0C[] = { - {-4, -8, ST_OAM_SQUARE, 0, 0x5, 3}, - {-4, 0, ST_OAM_SQUARE, 0, 0xd, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDA1C[] = { - {2, gSubspriteTable_83EDA0C} -}; - -static const struct Subsprite gSubspriteTable_83EDA24[] = { - {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3}, - {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDA34[] = { - {2, gSubspriteTable_83EDA24} -}; - -static const struct Subsprite gSubspriteTable_83EDA3C[] = { - {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, - {4, -12, ST_OAM_SQUARE, 0, 0x2, 3}, - {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, - {4, -4, ST_OAM_SQUARE, 0, 0xa, 3}, - {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, - {4, 4, ST_OAM_SQUARE, 0, 0x12, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDA6C[] = { - {6, gSubspriteTable_83EDA3C} -}; - -static const struct Subsprite gSubspriteTable_83EDA74[] = { - {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, - {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3}, - {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDA8C[] = { - {3, gSubspriteTable_83EDA74} -}; - -static const struct Subsprite gSubspriteTable_83EDA94[] = { - {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3}, - {4, -12, ST_OAM_SQUARE, 0, 0x7, 3}, - {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3}, - {4, -4, ST_OAM_SQUARE, 0, 0xf, 3}, - {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3}, - {4, 4, ST_OAM_SQUARE, 0, 0x17, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDAC4[] = { - {6, gSubspriteTable_83EDA94} -}; - -static const struct Subsprite gSubspriteTable_83EDACC[] = { - {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, - {4, -12, ST_OAM_SQUARE, 0, 0x2, 3}, - {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, - {4, -4, ST_OAM_SQUARE, 0, 0xa, 3}, - {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, - {4, 4, ST_OAM_SQUARE, 0, 0x12, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDAFC[] = { - {6, gSubspriteTable_83EDACC} -}; - -static const struct Subsprite gSubspriteTable_83EDB04[] = { - {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, - {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3}, - {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDB1C[] = { - {3, gSubspriteTable_83EDB04} -}; - -static const struct Subsprite gSubspriteTable_83EDB24[] = { - {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3}, - {4, -12, ST_OAM_SQUARE, 0, 0x7, 3}, - {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3}, - {4, -4, ST_OAM_SQUARE, 0, 0xf, 3}, - {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3}, - {4, 4, ST_OAM_SQUARE, 0, 0x17, 3} -}; - -static const struct SubspriteTable gSubspriteTables_83EDB54[] = { - {6, gSubspriteTable_83EDB24} -}; - -static const struct SpriteTemplate *const gUnknown_083EDB5C[] = { - &gSpriteTemplate_83ED57C, - &gSpriteTemplate_83ED594, - &gSpriteTemplate_83ED5AC, - &gSpriteTemplate_83ED5DC, - &gSpriteTemplate_83ED5F4, - &gSpriteTemplate_83ED654, - &gSpriteTemplate_83ED66C, - &gSpriteTemplate_83ED684, - &gSpriteTemplate_83ED69C, - &gSpriteTemplate_83ED6B4, - &gSpriteTemplate_83ED5C4, - &gSpriteTemplate_83ED5C4, - &gSpriteTemplate_83ED5C4, - &gSpriteTemplate_83ED5C4, - &gSpriteTemplate_83ED60C, - &gSpriteTemplate_83ED60C, - &gSpriteTemplate_83ED60C, - &gSpriteTemplate_83ED60C, - &gSpriteTemplate_83ED60C, - &gSpriteTemplate_83ED624, - &gSpriteTemplate_83ED624, - &gSpriteTemplate_83ED624, - &gSpriteTemplate_83ED63C, - &gSpriteTemplate_83ED63C, - &gSpriteTemplate_83ED63C, - &gDummySpriteTemplate -}; - -static const struct SubspriteTable *const gUnknown_083EDBC4[] = { - gSubspriteTables_83ED804, - gSubspriteTables_83ED82C, - gSubspriteTables_83ED854, - gSubspriteTables_83ED8B4, - NULL, - NULL, - gSubspriteTables_83ED8CC, - NULL, - gSubspriteTables_83ED93C, - gSubspriteTables_83ED95C, - gSubspriteTables_83ED974, - gSubspriteTables_83ED98C, - gSubspriteTables_83ED9A4, - gSubspriteTables_83ED9BC, - gSubspriteTables_83ED9D4, - gSubspriteTables_83ED9EC, - gSubspriteTables_83EDA04, - gSubspriteTables_83EDA1C, - gSubspriteTables_83EDA34, - gSubspriteTables_83EDA6C, - gSubspriteTables_83EDA8C, - gSubspriteTables_83EDAC4, - gSubspriteTables_83EDAFC, - gSubspriteTables_83EDB1C, - gSubspriteTables_83EDB54, - NULL -}; - -static const struct SpriteSheet sSlotMachineSpriteSheets[] = { - {gSlotMachineReelSymbol1Tiles, 0x200, 0}, - {gSlotMachineReelSymbol2Tiles, 0x200, 1}, - {gSlotMachineReelSymbol3Tiles, 0x200, 2}, - {gSlotMachineReelSymbol4Tiles, 0x200, 3}, - {gSlotMachineReelSymbol5Tiles, 0x200, 4}, - {gSlotMachineReelSymbol6Tiles, 0x200, 5}, - {gSlotMachineReelSymbol7Tiles, 0x200, 6}, - {gSlotMachineNumber0Tiles, 0x40, 7}, - {gSlotMachineNumber1Tiles, 0x40, 8}, - {gSlotMachineNumber2Tiles, 0x40, 9}, - {gSlotMachineNumber3Tiles, 0x40, 10}, - {gSlotMachineNumber4Tiles, 0x40, 11}, - {gSlotMachineNumber5Tiles, 0x40, 12}, - {gSlotMachineNumber6Tiles, 0x40, 13}, - {gSlotMachineNumber7Tiles, 0x40, 14}, - {gSlotMachineNumber8Tiles, 0x40, 15}, - {gSlotMachineNumber9Tiles, 0x40, 16}, - {eSlotMachineGfxBuffer + 0x0A00, 0x200, 18}, - {eSlotMachineGfxBuffer + 0x1400, 0x200, 19}, - {eSlotMachineGfxBuffer + 0x1600, 0x300, 20}, - {eSlotMachineGfxBuffer + 0x1900, 0x300, 21}, - {} -}; - -static const struct SpriteSheet gUnknown_083EDCDC = { - eSlotMachineGfxBuffer + 0x0000, 0x800, 17 -}; - -static const u8 *const gUnknown_083EDCE4 = gUnknownPalette_08E997E8; - -#ifdef SAPPHIRE -static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/sapphire_83EDD40.gbapal"); -#elif defined(RUBY) -static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/ruby_83EDCE8.gbapal"); -#endif // RS - -static const u16 *const gUnknown_083EDD08[] = { - UnknownPalette_83EDCE8 + 10, - UnknownPalette_83EDCE8 + 11, - UnknownPalette_83EDCE8 + 12, - UnknownPalette_83EDCE8 + 13, - UnknownPalette_83EDCE8 + 14 -}; - -static const u16 *const gUnknown_083EDD1C[] = { - gUnknown_08E95A18 + 74, - gUnknown_08E95A18 + 75, - gUnknown_08E95A18 + 76, - gUnknown_08E95A18 + 77, - gUnknown_08E95A18 + 78 -}; - -static const u8 gUnknown_083EDD30[] = { - 0x4a, 0x4b, 0x4c, 0x4e, 0x4d -}; - -static const u8 gUnknown_083EDD35[][2] = { - {0, 0}, - {1, 2}, - {3, 4} -}; -static const u8 gUnknown_083EDD3B[] = {1, 2, 2}; - -#ifdef SAPPHIRE -static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/sapphire_83EDD96.gbapal"); -static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDB6.gbapal"); -static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDD6.gbapal"); -#elif defined (RUBY) -static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/ruby_83EDD3E.gbapal"); -static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/ruby_83EDD5E.gbapal"); -static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/ruby_83EDD7E.gbapal"); -#endif // RS - -static const u16 *const gUnknown_083EDDA0[] = { - Unknown_83EDD3E, - Unknown_83EDD5E, - Unknown_83EDD7E -}; - -static const u16 *const gUnknown_083EDDAC = gUnknown_08E95A18 + 16; - -static const u16 Palette_83EDDB0[] = INCBIN_U16("graphics/slot_machine/83EDDB0.gbapal"); -static const u16 Palette_83EDDD0[] = INCBIN_U16("graphics/slot_machine/83EDDD0.gbapal"); -static const u16 Palette_83EDDF0[] = INCBIN_U16("graphics/slot_machine/83EDDF0.gbapal"); - -static const u16 *const gUnknown_083EDE10[] = { - Palette_83EDDB0, - Palette_83EDDD0, - Palette_83EDDF0, - gSlotMachineSpritePalette6 -}; - -static const u16 *const gUnknown_083EDE20 = gSlotMachineSpritePalette6; - -static const u16 gPalette_83EDE24[] = INCBIN_U16("graphics/slot_machine/83EDE24_pal.bin"); - -static const struct SpritePalette gSlotMachineSpritePalettes[] = { - {gSlotMachineSpritePalette0, 0}, - {gSlotMachineSpritePalette1, 1}, - {gSlotMachineSpritePalette2, 2}, - {gSlotMachineSpritePalette3, 3}, - {gSlotMachineSpritePalette4, 4}, - {gSlotMachineSpritePalette5, 5}, - {gSlotMachineSpritePalette6, 6}, - {gSlotMachineSpritePalette4, 7}, - {} -}; - -static const u8 sReelTimeGfx[] = INCBIN_U8("graphics/slot_machine/reel_time.4bpp.lz"); - -static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin"); - -#if DEBUG - -static void debug_sub_811B1C4(void) -{ - unk_debug_bss_1_3 |= 2; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 2) ? 0 : 2; -} - -static void debug_sub_811B1EC(void) -{ - unk_debug_bss_1_3 |= 1; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 1) ? 0 : 1; -} - -static void debug_sub_811B210(void) -{ - unk_debug_bss_1_3 |= 4; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 4) ? 0 : 4; -} - -static void debug_sub_811B238(void) -{ - unk_debug_bss_1_3 |= 8; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 8) ? 0 : 8; -} - -static void debug_sub_811B260(void) -{ - unk_debug_bss_1_3 |= 0x10; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x10) ? 0 : 0x10; -} - -static void debug_sub_811B288(void) -{ - unk_debug_bss_1_3 |= 0x40; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x40) ? 0 : 0x40; -} - -static void debug_sub_811B2B0(void) -{ - unk_debug_bss_1_3 |= 0x80; - unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x80) ? 0 : 0x80; -} - -static void debug_sub_811B2D8(void) -{ - unk_debug_bss_1_3 |= 0x20; -} - -static void debug_sub_811B2E8(void) -{ - u8 text[2]; - - ConvertIntToDecimalStringN(text, eSlotMachine->unk01 + 1, 2, 1); - Menu_PrintText(text, 6, 1); -} - -static const u8 Str_841B1C4[] = _("SETTEI"); -static const u8 Str_841B1CB[] = _("MAWASITA"); -static const u8 Str_841B1D4[] = _("MODOSI"); -static const u8 Str_841B1DB[] = _("NOMARE"); -static const u8 Str_841B1E2[] = _("MAE 7"); -static const u8 Str_841B1E8[] = _("LR  HENKOU"); -static const u8 Str_841B1F3[] = _("START  JIDOUSU"); -static const u8 Str_841B202[] = _("SELECT  SETTEI"); -static const u8 Str_841B211[] = _("TYUHSEN"); -static const u8 Str_841B219[] = _("CHERRY"); -static const u8 Str_841B220[] = _("REPLAY"); -static const u8 Str_841B227[] = _("HASUBO"); -static const u8 Str_841B22E[] = _("RURIRI"); -static const u8 Str_841B235[] = _("INAZU"); -static const u8 Str_841B23B[] = _("REG"); -static const u8 Str_841B23F[] = _("BIG"); -static const u8 Str_841B243[] = _("BD"); -static const u8 Str_841B246[] = _("R7"); -static const u8 Str_841B249[] = _("B7"); -static const u8 Str_841B24C[] = _("A  COIN"); -static const u8 Str_841B254[] = _("TYUHSEN"); -static const u8 Str_841B25C[] = _("UD  100"); -static const u8 Str_841B264[] = _("LR  1000"); -static const u8 Str_841B26D[] = _("×"); - -void debug_sub_811B310(void) -{ - u8 text[5]; - - Menu_PrintText(Str_841B1C4, 1, 1); - Menu_PrintText(Str_841B1CB, 1, 3); - Menu_PrintText(Str_841B1D4, 1, 5); - Menu_PrintText(Str_841B1DB, 1, 7); - Menu_PrintText(Str_841B1E2, 1, 9); - Menu_PrintText(Str_841B1E8, 1, 11); - Menu_PrintText(Str_841B1F3, 1, 13); - Menu_PrintText(Str_841B202, 1, 15); - Menu_PrintText(Str_841B24C, 1, 17); - Menu_PrintText(Str_841B211, 15, 1); - Menu_PrintText(Str_841B219, 15, 3); - Menu_PrintText(Str_841B220, 15, 5); - Menu_PrintText(Str_841B227, 15, 7); - Menu_PrintText(Str_841B22E, 15, 9); - Menu_PrintText(Str_841B235, 15, 11); - Menu_PrintText(Str_841B23B, 15, 13); - Menu_PrintText(Str_841B23F, 15, 15); - Menu_PrintText(Str_841B243, 15, 17); - if (eSlotMachine->unk03 == 0) - Menu_PrintText(Str_841B246, 10, 9); - else - Menu_PrintText(Str_841B249, 10, 9); - -#define PRINT_NUMBER(n, x, y) \ - ConvertIntToDecimalStringN(text, n, 2, 4); \ - Menu_PrintText(text, x, y); - - PRINT_NUMBER(eSlotMachine->unk68, 10, 3); - PRINT_NUMBER(eSlotMachine->unk6C, 10, 5); - PRINT_NUMBER(eSlotMachine->unk10, 10, 7); - PRINT_NUMBER(eSlotMachine->unk70, 20, 3); - PRINT_NUMBER(eSlotMachine->unk74, 20, 5); - PRINT_NUMBER(eSlotMachine->unk78, 20, 7); - PRINT_NUMBER(eSlotMachine->unk7C, 20, 9); - PRINT_NUMBER(eSlotMachine->unk80, 20, 11); - PRINT_NUMBER(eSlotMachine->unk84, 20, 13); - PRINT_NUMBER(eSlotMachine->unk88, 20, 15); - PRINT_NUMBER(eSlotMachine->unk8C, 20, 17); - -#undef PRINT_NUMBER - - if (unk_debug_bss_1_0 != 0) - { - u8 y = 0; - - switch (unk_debug_bss_1_0) - { - case 2: - y = 3; - break; - case 1: - y = 5; - break; - case 4: - y = 7; - break; - case 8: - y = 9; - break; - case 16: - y = 11; - break; - case 64: - y = 13; - break; - case 128: - y = 15; - break; - } - Menu_PrintText(Str_841B26D, 23, y); - } - debug_sub_811B2E8(); -} - -static void debug_sub_811B5B4(s32 *a, s32 b) -{ - *a += b; - if (*a > 9999) - *a = 9999; -} - -static void debug_sub_811B5D0(void) -{ - unk_debug_bss_1_0 = 0; - unk_debug_bss_1_2 = 0; - unk_debug_bss_1_3 = 0; - unk_debug_bss_1_4 = 0; - eSlotMachine->unk68 = 0; - eSlotMachine->unk6C = 0; - eSlotMachine->unk70 = 0; - eSlotMachine->unk74 = 0; - eSlotMachine->unk78 = 0; - eSlotMachine->unk7C = 0; - eSlotMachine->unk80 = 0; - eSlotMachine->unk84 = 0; - eSlotMachine->unk88 = 0; - eSlotMachine->unk8C = 0; - eSlotMachine->unk90 = 0; -} - -static void debug_sub_811B620(void) -{ - CreateTask(debug_sub_811B654, 0); -} - -static u8 debug_sub_811B634(void) -{ - if (FindTaskIdByFunc(debug_sub_811B654) == 0xFF) - return 1; - else - return 0; -} - -static const struct {const u8 *text; void (*func)();} _841B270[] = -{ - {Str_841B219, debug_sub_811B1C4}, - {Str_841B220, debug_sub_811B1EC}, - {Str_841B227, debug_sub_811B210}, - {Str_841B22E, debug_sub_811B238}, - {Str_841B235, debug_sub_811B260}, - {Str_841B23B, debug_sub_811B288}, - {Str_841B23F, debug_sub_811B2B0}, - {Str_841B243, debug_sub_811B2D8}, -}; - -static void debug_sub_811B654(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - s8 selection; - - switch (task->data[0]) - { - case 0: - Menu_DrawStdWindowFrame(0, 0, 24, 19); - debug_sub_811B310(); - task->data[0]++; - break; - case 1: - if (gMain.newKeys & B_BUTTON) - { - Menu_EraseScreen(); - DestroyTask(taskId); - break; - } - if (gMain.newKeys & 0x20) - { - eSlotMachine->unk01--; - if ((s8)eSlotMachine->unk01 < 0) // Why? It's unsigned - eSlotMachine->unk01 = 5; - debug_sub_811B2E8(); - break; - } - if (gMain.newKeys & 0x10) - { - eSlotMachine->unk01++; - if (eSlotMachine->unk01 > 5) - eSlotMachine->unk01 = 0; - debug_sub_811B2E8(); - break; - } - if (gMain.newKeys & A_BUTTON) - { - task->data[0] = 3; - Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 9, 5); - Menu_PrintText(Str_841B25C, 1, 1); - Menu_PrintText(Str_841B264, 1, 3); - break; - } - if (gMain.newKeys & 4) - { - unk_debug_bss_1_2 = 0; - unk_debug_bss_1_3 = 0; - Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 10, 19); - Menu_PrintText(Str_841B254, 1, 1); - Menu_PrintItems(2, 3, 8, (void *)_841B270); - InitMenu(0, 1, 3, 8, 0, 9); - task->data[0]++; - } - if (gMain.newKeys & 8) - { - unk_debug_bss_1_4 = 1; - Menu_EraseScreen(); - DestroyTask(taskId); - } - break; - case 2: - selection = Menu_ProcessInput(); - if (selection == -2) - break; - if (selection != -1) - { - unk_debug_bss_1_2 = 1; - _841B270[selection].func(); - } - Menu_EraseScreen(); - DestroyTask(taskId); - break; - case 3: - if (gMain.newAndRepeatedKeys & 0x80) - { - eSlotMachine->coins += 100; - if (eSlotMachine->coins > 9999) - eSlotMachine->coins = 9999; - break; - } - if (gMain.newAndRepeatedKeys & 0x40) - { - eSlotMachine->coins -= 100; - if (eSlotMachine->coins <= 0) - eSlotMachine->coins = 9999; - break; - } - if (gMain.newAndRepeatedKeys & 0x20) - { - eSlotMachine->coins -= 1000; - if (eSlotMachine->coins <= 0) - eSlotMachine->coins = 9999; - break; - } - if (gMain.newAndRepeatedKeys & 0x10) - { - eSlotMachine->coins += 1000; - if (eSlotMachine->coins > 9999) - eSlotMachine->coins = 9999; - break; - } - if (gMain.newKeys & B_BUTTON) - { - Menu_EraseScreen(); - DestroyTask(taskId); - } - break; - } -} - -static const u8 Str_841B2B0[] = _("·カウントエラーがおきました"); -static const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました"); -static const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました"); -static const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました"); - -static void debug_sub_811B894(void) -{ - if (eSlotMachine->matchedSymbols & 0x180) - { - eSlotMachine->unk90++; - if (eSlotMachine->unk90 > 9999) - eSlotMachine->unk90 = 9999; - if (eSlotMachine->unk90 != eSlotMachine->unk88) - { - Menu_PrintText(Str_841B2B0, 4, 15); - unk_debug_bss_1_4 = 0; - } - if (!(eSlotMachine->unk04 & 0x80)) - { - Menu_PrintText(Str_841B2D3, 4, 17); - unk_debug_bss_1_4 = 0; - } - } - else if (eSlotMachine->matchedSymbols != 0) - { - if ((eSlotMachine->unk04 & 0x80) && !(eSlotMachine->matchedSymbols & 3)) - { - Menu_PrintText(Str_841B2E4, 4, 2); - unk_debug_bss_1_4 = 0; - } - } - if (eSlotMachine->matchedSymbols == 0 && eSlotMachine->bet == 3 && !(eSlotMachine->unk04 & 0x80)) - { - u8 sym_0_1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); - u8 sym_0_2 = GetTagOfReelSymbolOnScreenAtPos(0, 2); - u8 sym_0_3 = GetTagOfReelSymbolOnScreenAtPos(0, 3); - - u8 sym_1_1 = GetTagOfReelSymbolOnScreenAtPos(1, 1); - u8 sym_1_2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); - u8 sym_1_3 = GetTagOfReelSymbolOnScreenAtPos(1, 3); - - u8 sym_2_1 = GetTagOfReelSymbolOnScreenAtPos(2, 1); - u8 sym_2_2 = GetTagOfReelSymbolOnScreenAtPos(2, 2); - u8 sym_2_3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); - - if ((sym_0_1 == 0 && sym_1_1 == 1 && sym_2_1 == 0) - || (sym_0_2 == 0 && sym_1_2 == 1 && sym_2_2 == 0) - || (sym_0_3 == 0 && sym_1_3 == 1 && sym_2_3 == 0) - || (sym_0_1 == 0 && sym_1_2 == 1 && sym_2_3 == 0) - || (sym_0_3 == 0 && sym_1_2 == 1 && sym_2_1 == 0) - || (sym_0_1 == 1 && sym_1_1 == 0 && sym_2_1 == 1) - || (sym_0_2 == 1 && sym_1_2 == 0 && sym_2_2 == 1) - || (sym_0_3 == 1 && sym_1_3 == 0 && sym_2_3 == 1) - || (sym_0_1 == 1 && sym_1_2 == 0 && sym_2_3 == 1) - || (sym_0_3 == 1 && sym_1_2 == 0 && sym_2_1 == 1)) - { - Menu_PrintText(Str_841B2BF, 4, 0); - unk_debug_bss_1_4 = 0; - } - } -} - -#endif diff --git a/src/field/start_menu.c b/src/field/start_menu.c deleted file mode 100644 index f2d53eb7f..000000000 --- a/src/field/start_menu.c +++ /dev/null @@ -1,941 +0,0 @@ -#include "global.h" -#include "battle_tower.h" -#include "start_menu.h" -#include "event_data.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "item_menu.h" -#include "load_save.h" -#include "m4a.h" -#include "main.h" -#include "map_obj_lock.h" -#include "menu.h" -#include "new_game.h" -#include "option_menu.h" -#include "palette.h" -#include "pokedex.h" -#include "pokemon_menu.h" -#include "pokenav.h" -#include "overworld.h" -#include "safari_zone.h" -#include "save.h" -#include "save_menu_util.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "task.h" -#include "trainer_card.h" -#include "scanline_effect.h" - -//Menu actions -enum { - MENU_ACTION_POKEDEX, - MENU_ACTION_POKEMON, - MENU_ACTION_BAG, - MENU_ACTION_POKENAV, - MENU_ACTION_PLAYER, - MENU_ACTION_SAVE, - MENU_ACTION_OPTION, - MENU_ACTION_EXIT, - MENU_ACTION_RETIRE, - MENU_ACTION_PLAYER_LINK -}; - -#if DEBUG -static u32 _debugStartMenu_0 __attribute__((unused)); -static u32 _debugStartMenu_1 __attribute__((unused)); -#endif - -static u8 (*saveDialogCallback)(void); -static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed -static bool8 savingComplete; - -extern bool8 gDifferentSaveFile; -extern u16 gSaveFileStatus; -extern u16 gSpecialVar_Result; - -extern u8 gUnknown_03004860; - -u8 (*gMenuCallback)(void); - -EWRAM_DATA static u8 sStartMenuCursorPos = 0; -EWRAM_DATA static u8 sNumStartMenuActions = 0; -EWRAM_DATA static u8 sCurrentStartMenuActions[10] = {0}; - -//Text strings -extern u8 gSaveText_PlayerSavedTheGame[]; -extern u8 gSaveText_DontTurnOff[]; -extern u8 gSaveText_ThereIsAlreadyAFile[]; -extern u8 gSaveText_ThereIsADifferentFile[]; -extern u8 gSaveText_WouldYouLikeToSave[]; - -static u8 StartMenu_PokedexCallback(void); -static u8 StartMenu_PokemonCallback(void); -static u8 StartMenu_BagCallback(void); -static u8 StartMenu_PokenavCallback(void); -static u8 StartMenu_PlayerCallback(void); -static u8 StartMenu_SaveCallback(void); -static u8 StartMenu_OptionCallback(void); -static u8 StartMenu_ExitCallback(void); -static u8 StartMenu_RetireCallback(void); -static u8 StartMenu_PlayerLinkCallback(void); - -static const struct MenuAction sStartMenuItems[] = -{ - { SystemText_Pokedex, StartMenu_PokedexCallback }, - { SystemText_Pokemon, StartMenu_PokemonCallback }, - { SystemText_BAG, StartMenu_BagCallback }, - { SystemText_Pokenav, StartMenu_PokenavCallback }, - { SystemText_Player, StartMenu_PlayerCallback }, - { SystemText_Save, StartMenu_SaveCallback }, - { SystemText_Option, StartMenu_OptionCallback }, - { SystemText_Exit, StartMenu_ExitCallback }, - { SystemText_Retire, StartMenu_RetireCallback }, - { SystemText_Player, StartMenu_PlayerLinkCallback }, -}; - -//Private functions -static void BuildStartMenuActions(void); -static void AddStartMenuAction(u8 action); -static void BuildStartMenuActions_Normal(void); -static void BuildStartMenuActions_SafariZone(void); -static void BuildStartMenuActions_Link(void); -static void DisplaySafariBallsWindow(void); -static bool32 PrintStartMenuItemsMultistep(s16 *a, u32 b); -static bool32 InitStartMenuMultistep(s16 *a, s16 *b); -static void Task_StartMenu(u8 taskId); -static u8 StartMenu_InputProcessCallback(void); -static u8 SaveCallback1(void); -static u8 SaveCallback2(void); -static void sub_807160C(void); -static u8 RunSaveDialogCallback(void); -static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)); -static void Task_SaveDialog(u8 taskId); -static void sub_8071700(void); -static void HideSaveDialog(void); -static void SaveDialogStartTimeout(void); -static u8 SaveDialogCheckForTimeoutOrKeypress(void); -static u8 SaveDialogCheckForTimeoutAndKeypress(void); -static u8 SaveDialogCheckForTimeoutAndKeypress(void); -static u8 SaveDialogCB_DisplayConfirmMessage(void); -static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void); -static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void); -static u8 SaveDialogCB_SaveFileExists(void); -static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void); -static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void); -static u8 SaveDialogCB_DisplaySavingMessage(void); -static u8 SaveDialogCB_DoSave(void); -static u8 SaveDialogCB_SaveSuccess(void); -static u8 SaveDialogCB_ReturnSuccess(void); -static u8 SaveDialogCB_SaveError(void); -static u8 SaveDialogCB_ReturnError(void); -static void sub_80719F0(void); -static bool32 sub_80719FC(u8 *ptr); -static void sub_8071B54(void); -static void Task_8071B64(u8 taskId); - -#if DEBUG - -void debug_sub_8075D9C(void); - -u8 debug_sub_8075C30(void) -{ - CloseMenu(); - debug_sub_8075D9C(); - return 1; -} - -extern const u8 gUnknown_Debug_839B6D8[]; - -void debug_sub_8075C40(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - u16 savedIme; - s32 i; - - switch (data[0]) - { - case 0: - m4aSoundVSyncOff(); - data[0]++; - break; - case 1: - savedIme = REG_IME; - REG_IME = 0; - REG_TM2CNT_L = 0; - REG_TM2CNT = 0x830000; - for (i = 0; i < 0xC350; i++) - { - DmaSet( - 0, - gScanlineEffectRegBuffers, - ®_WIN0H, - ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) | 1); - DmaStop(0); - } - REG_TM2CNT_H = 0; - _debugStartMenu_0 = REG_TM2CNT_L; - REG_TM2CNT_L = 0; - REG_IME = savedIme; - _debugStartMenu_1 = i; - m4aSoundVSyncOn(); - data[0]++; - break; - case 2: - PlaySE(0x15); - ConvertIntToDecimalStringN(gStringVar1, _debugStartMenu_1, 1, 8); - ConvertIntToDecimalStringN(gStringVar2, _debugStartMenu_0, 1, 8); - Menu_DisplayDialogueFrame(); - Menu_PrintText(gUnknown_Debug_839B6D8, 2, 15); - data[0]++; - break; - case 3: - if (gMain.newKeys & A_BUTTON) - { - Menu_EraseScreen(); - ScriptContext2_Disable(); - DestroyTask(taskId); - } - break; - } -} - -void debug_sub_8075D9C(void) -{ - CreateTask(debug_sub_8075C40, 10); - ScriptContext2_Enable(); -} - -void debug_sub_8075DB4(struct BattleTowerEReaderTrainer *ereaderTrainer, const u8 *b, u32 trainerId) -{ - s32 i; - s32 r3; - - ereaderTrainer->trainerClass = trainerId % 77; - write_word_to_mem(trainerId, ereaderTrainer->trainerId); - StringCopy8(ereaderTrainer->name, b); - r3 = 7; - for (i = 0; i < 6; i++) - { - ereaderTrainer->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; - ereaderTrainer->farewellPlayerLost[i] = r3; - ereaderTrainer->farewellPlayerWon[i] = r3 + 6; - r3++; - } - for (i = 0; i < 3; i++) - sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]); - SetEReaderTrainerChecksum(ereaderTrainer); -} - -void unref_sub_8070F90(void) -{ - FlagSet(FLAG_SYS_POKEDEX_GET); - FlagSet(FLAG_SYS_POKEMON_GET); - FlagSet(FLAG_SYS_POKENAV_GET); -} - -#endif - -static void BuildStartMenuActions(void) -{ - sNumStartMenuActions = 0; - if (is_c1_link_related_active() == TRUE) - BuildStartMenuActions_Link(); - else - { - if (GetSafariZoneFlag() == TRUE) - BuildStartMenuActions_SafariZone(); - else - BuildStartMenuActions_Normal(); - } -} - -static void AddStartMenuAction(u8 action) -{ - AppendToList(sCurrentStartMenuActions, &sNumStartMenuActions, action); -} - -static void BuildStartMenuActions_Normal(void) -{ - if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKEDEX); - if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKENAV); - AddStartMenuAction(MENU_ACTION_PLAYER); - AddStartMenuAction(MENU_ACTION_SAVE); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -static void BuildStartMenuActions_SafariZone(void) -{ - AddStartMenuAction(MENU_ACTION_RETIRE); - AddStartMenuAction(MENU_ACTION_POKEDEX); - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - AddStartMenuAction(MENU_ACTION_PLAYER); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -static void BuildStartMenuActions_Link(void) -{ - AddStartMenuAction(MENU_ACTION_POKEMON); - AddStartMenuAction(MENU_ACTION_BAG); - if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) - AddStartMenuAction(MENU_ACTION_POKENAV); - AddStartMenuAction(MENU_ACTION_PLAYER_LINK); - AddStartMenuAction(MENU_ACTION_OPTION); - AddStartMenuAction(MENU_ACTION_EXIT); -} - -//Show number of safari balls left -static void DisplaySafariBallsWindow(void) -{ - sub_8072C44(gStringVar1, gNumSafariBalls, 12, 1); - Menu_DrawStdWindowFrame(0, 0, 10, 5); - Menu_PrintText(gOtherText_SafariStock, 1, 1); -} - -//Prints n menu items starting at *index -static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) -{ - int _index = *index; - - do - { - Menu_PrintText(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); - _index++; - if (_index >= sNumStartMenuActions) - { - *index = _index; - return TRUE; - } - } - while (--n != 0); - *index = _index; - return FALSE; -} - -static bool32 InitStartMenuMultistep(s16 *step, s16 *index) -{ - switch (*step) - { - case 1: - BuildStartMenuActions(); - (*step)++; - break; - case 2: - Menu_DrawStdWindowFrame(22, 0, 29, sNumStartMenuActions * 2 + 3); - *index = 0; - (*step)++; - break; - case 3: - if (GetSafariZoneFlag()) - DisplaySafariBallsWindow(); - (*step)++; - break; - case 4: - if (PrintStartMenuItemsMultistep(index, 2)) - (*step)++; - break; - case 0: - (*step)++; - break; - case 5: - sStartMenuCursorPos = InitMenu(0, 0x17, 2, sNumStartMenuActions, sStartMenuCursorPos, 6); - return TRUE; - } - return FALSE; -} - -static void InitStartMenu(void) -{ - s16 step = 0; - s16 index = 0; - - while (InitStartMenuMultistep(&step, &index) == FALSE) - ; -} - -static void Task_StartMenu(u8 taskId) -{ - if (InitStartMenuMultistep(gTasks[taskId].data, gTasks[taskId].data + 1) == TRUE) - { - *gTasks[taskId].data = 0; - SwitchTaskToFollowupFunc(taskId); - } -} - -void CreateStartMenuTask(void (*func)(u8)) -{ - u8 taskId; - - InitMenuWindow(&gWindowTemplate_81E6CE4); - taskId = CreateTask(Task_StartMenu, 0x50); - SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func); -} - -void sub_80712B4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - - switch (task->data[0]) - { - case 0: - gMenuCallback = StartMenu_InputProcessCallback; - task->data[0]++; - break; - case 1: - if (gMenuCallback() == 1) - DestroyTask(taskId); - break; - } -} - -void sub_8071310(void) -{ - if (!is_c1_link_related_active()) - { - FreezeMapObjects(); - sub_80594C0(); - sub_80597F4(); - } - CreateStartMenuTask(sub_80712B4); - ScriptContext2_Enable(); -} - -static u8 StartMenu_InputProcessCallback(void) -{ - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - sStartMenuCursorPos = Menu_MoveCursor(-1); - } - if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - sStartMenuCursorPos = Menu_MoveCursor(1); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func == StartMenu_PokedexCallback) - { - if (GetNationalPokedexCount(0) == 0) - return 0; - } - gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func; - if (gMenuCallback != StartMenu_SaveCallback && - gMenuCallback != StartMenu_ExitCallback && - gMenuCallback != StartMenu_RetireCallback) - FadeScreen(1, 0); - return 0; - } - if (gMain.newKeys & (START_BUTTON | B_BUTTON)) - { - CloseMenu(); - return 1; - } - return 0; -} - -//When player selects POKEDEX -static u8 StartMenu_PokedexCallback(void) -{ - if (!gPaletteFade.active) - { - IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); - PlayRainSoundEffect(); - SetMainCallback2(CB2_InitPokedex); - return 1; - } - return 0; -} - -//When player selects POKEMON -static u8 StartMenu_PokemonCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_8089A70); - return 1; - } - return 0; -} - -//When player selects BAG -static u8 StartMenu_BagCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_80A53F8); - return 1; - } - return 0; -} - -//When player selects POKENAV -static u8 StartMenu_PokenavCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(sub_80EBA5C); - return 1; - } - return 0; -} - -//When player selects his/her name -static u8 StartMenu_PlayerCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - TrainerCard_ShowPlayerCard(sub_805469C); - return 1; - } - return 0; -} - -//When player selects SAVE -static u8 StartMenu_SaveCallback(void) -{ - Menu_DestroyCursor(); - gMenuCallback = SaveCallback1; - return 0; -} - -//When player selects OPTION -static u8 StartMenu_OptionCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - SetMainCallback2(CB2_InitOptionMenu); - gMain.savedCallback = sub_805469C; - return 1; - } - return 0; -} - -//When player selects EXIT -static u8 StartMenu_ExitCallback(void) -{ - CloseMenu(); - return 1; -} - -//When player selects RETIRE -static u8 StartMenu_RetireCallback(void) -{ - CloseMenu(); - SafariZoneRetirePrompt(); - return 1; -} - -//When player selects their name in multiplayer mode -static u8 StartMenu_PlayerLinkCallback(void) -{ - if (!gPaletteFade.active) - { - PlayRainSoundEffect(); - TrainerCard_ShowLinkCard(gUnknown_03004860, sub_805469C); - return 1; - } - return 0; -} - -//Save dialog status -enum -{ - SAVE_IN_PROGRESS, - SAVE_SUCCESS, - SAVE_CANCELED, - SAVE_ERROR, -}; - -static u8 SaveCallback1(void) -{ - sub_807160C(); - gMenuCallback = SaveCallback2; - return FALSE; -} - -static u8 SaveCallback2(void) -{ - switch (RunSaveDialogCallback()) - { - case SAVE_IN_PROGRESS: - return FALSE; - case SAVE_CANCELED: - //Go back to start menu - Menu_EraseScreen(); - InitStartMenu(); - gMenuCallback = StartMenu_InputProcessCallback; - return FALSE; - case SAVE_SUCCESS: - case SAVE_ERROR: - Menu_EraseScreen(); - sub_8064E2C(); - ScriptContext2_Disable(); - return TRUE; - } - return FALSE; -} - -static void sub_807160C(void) -{ - save_serialize_map(); - saveDialogCallback = SaveDialogCB_DisplayConfirmMessage; - savingComplete = FALSE; -} - -static u8 RunSaveDialogCallback(void) -{ - if (savingComplete) - { - if (!Menu_UpdateWindowText()) - return 0; - } - savingComplete = FALSE; - return saveDialogCallback(); -} - -void ScrSpecial_DoSaveDialog(void) -{ - sub_807160C(); - CreateTask(Task_SaveDialog, 0x50); -} - -static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)) -{ - StringExpandPlaceholders(gStringVar4, ptr); - Menu_DisplayDialogueFrame(); - MenuPrintMessageDefaultCoords(gStringVar4); - savingComplete = TRUE; - saveDialogCallback = func; -} - -static void Task_SaveDialog(u8 taskId) -{ - u8 status = RunSaveDialogCallback(); - - switch (status) - { - case SAVE_CANCELED: - case SAVE_ERROR: - gSpecialVar_Result = 0; - break; - case SAVE_SUCCESS: - gSpecialVar_Result = status; - break; - case SAVE_IN_PROGRESS: - return; - } - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -static void sub_8071700(void) -{ - HandleCloseSaveWindow(0, 0); -} - -static void HideSaveDialog(void) -{ - Menu_EraseWindowRect(20, 8, 26, 13); -} - -static void SaveDialogStartTimeout(void) -{ - saveDialogTimer = 60; -} - -static bool8 SaveDialogCheckForTimeoutOrKeypress(void) -{ - saveDialogTimer--; - if (gMain.heldKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - return TRUE; - } - else if (saveDialogTimer == 0) - return TRUE; - return FALSE; -} - -static bool8 SaveDialogCheckForTimeoutAndKeypress(void) -{ - if (saveDialogTimer != 0) - saveDialogTimer--; - else if (gMain.heldKeys & A_BUTTON) - return TRUE; - return FALSE; -} - -static u8 SaveDialogCB_DisplayConfirmMessage(void) -{ - Menu_EraseScreen(); - HandleDrawSaveWindowInfo(0, 0); - DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void) -{ - DisplayYesNoMenu(20, 8, 1); - saveDialogCallback = SaveDialogCB_ProcessConfirmYesNoMenu; - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void) -{ - switch (Menu_ProcessInputNoWrap_()) - { - case 0: //YES - HideSaveDialog(); - switch (gSaveFileStatus) - { - case 0: - case 2: - if (gDifferentSaveFile == FALSE) - { - saveDialogCallback = SaveDialogCB_SaveFileExists; - return SAVE_IN_PROGRESS; - } - saveDialogCallback = SaveDialogCB_DisplaySavingMessage; - return SAVE_IN_PROGRESS; - default: - saveDialogCallback = SaveDialogCB_SaveFileExists; - return SAVE_IN_PROGRESS; - } - break; - case -1: //B button - case 1: //NO - HideSaveDialog(); - sub_8071700(); - return SAVE_CANCELED; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveFileExists(void) -{ - DisplaySaveMessageWithCallback( - gDifferentSaveFile == TRUE ? gSaveText_ThereIsADifferentFile : gSaveText_ThereIsAlreadyAFile, - SaveDialogCB_DisplayOverwriteYesNoMenu); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void) -{ - DisplayYesNoMenu(20, 8, 1); - saveDialogCallback = SaveDialogCB_ProcessOverwriteYesNoMenu; - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void) -{ - switch (Menu_ProcessInputNoWrap_()) - { - case 0: //YES - HideSaveDialog(); - saveDialogCallback = SaveDialogCB_DisplaySavingMessage; - break; - case -1: //B button - case 1: //NO - HideSaveDialog(); - sub_8071700(); - return SAVE_CANCELED; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DisplaySavingMessage(void) -{ - //"SAVING... DON'T TURN OFF THE POWER." - DisplaySaveMessageWithCallback(gSaveText_DontTurnOff, SaveDialogCB_DoSave); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_DoSave(void) -{ - u8 saveStatus; - - IncrementGameStat(GAME_STAT_SAVED_GAME); - if (gDifferentSaveFile == TRUE) - { - saveStatus = Save_WriteData(SAVE_OVERWRITE_DIFFERENT_FILE); - gDifferentSaveFile = FALSE; - } - else - { - saveStatus = Save_WriteData(SAVE_NORMAL); - } - - if (saveStatus == SAVE_STATUS_OK) - { - //"(Player) saved the game." - DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess); - } - else - { - //"Save error. Please exchange the backup memory." - DisplaySaveMessageWithCallback(gSystemText_SaveErrorExchangeBackup, SaveDialogCB_SaveError); - } - - SaveDialogStartTimeout(); - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveSuccess(void) -{ - if (Menu_UpdateWindowText()) - { - PlaySE(SE_SAVE); - saveDialogCallback = SaveDialogCB_ReturnSuccess; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ReturnSuccess(void) -{ - if (!IsSEPlaying() && SaveDialogCheckForTimeoutOrKeypress()) - { - sub_8071700(); - return SAVE_SUCCESS; - } - else - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_SaveError(void) -{ - if (Menu_UpdateWindowText()) - { - PlaySE(SE_BOO); - saveDialogCallback = SaveDialogCB_ReturnError; - } - return SAVE_IN_PROGRESS; -} - -static u8 SaveDialogCB_ReturnError(void) -{ - if (!SaveDialogCheckForTimeoutAndKeypress()) - return SAVE_IN_PROGRESS; - else - { - sub_8071700(); - return SAVE_ERROR; - } -} - -static void sub_80719F0(void) -{ - TransferPlttBuffer(); -} - -static bool32 sub_80719FC(u8 *step) -{ - switch (*step) - { - case 0: - REG_DISPCNT = 0; - SetVBlankCallback(NULL); - ScanlineEffect_Stop(); - DmaClear16(3, PLTT, PLTT_SIZE); - DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); - break; - case 1: - ResetSpriteData(); - ResetTasks(); - ResetPaletteFade(); - ScanlineEffect_Clear(); - break; - case 2: - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON; - break; - case 3: - { - u32 savedIme; - - BlendPalettes(-1, 0x10, 0); - SetVBlankCallback(sub_80719F0); - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIme; - break; - } - case 4: - return TRUE; - } - (*step)++; - return FALSE; -} - -void sub_8071B28(void) -{ - if (sub_80719FC(&gMain.state)) - { - CreateTask(Task_8071B64, 0x50); - SetMainCallback2(sub_8071B54); - } -} - -static void sub_8071B54(void) -{ - RunTasks(); - UpdatePaletteFade(); -} - -static void Task_8071B64(u8 taskId) -{ - s16 *step = gTasks[taskId].data; - - if (!gPaletteFade.active) - { - switch (*step) - { - case 0: - Menu_DisplayDialogueFrame(); - Menu_PrintText(gSystemText_Saving, 2, 15); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - (*step)++; - break; - case 1: - SetSecretBase2Field_9_AndHideBG(); - sub_8125E2C(); - (*step)++; - break; - case 2: - if (!sub_8125E6C()) - break; - ClearSecretBase2Field_9_2(); - (*step)++; - break; - case 3: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - (*step)++; - break; - case 4: - SetMainCallback2(gMain.savedCallback); - DestroyTask(taskId); - break; - } - } -} diff --git a/src/field/starter_choose.c b/src/field/starter_choose.c deleted file mode 100644 index 418488774..000000000 --- a/src/field/starter_choose.c +++ /dev/null @@ -1,757 +0,0 @@ -#include "global.h" -#include "starter_choose.h" -#include "data2.h" -#include "decompress.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokedex.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "trig.h" -#include "scanline_effect.h" - -extern u16 gSpecialVar_Result; -extern struct SpriteTemplate gUnknown_02024E8C; - -//-------------------------------------------------- -// Graphics Data -//-------------------------------------------------- - -const u16 gBirchBagGrassPal[2][16] = -{ - INCBIN_U16("graphics/misc/birch_bag.gbapal"), - INCBIN_U16("graphics/misc/birch_grass.gbapal"), -}; -static const u16 gBirchBallarrow_Pal[] = INCBIN_U16("graphics/misc/birch_ballarrow.gbapal"); -static const u16 gBirchCircle_Pal[] = INCBIN_U16("graphics/misc/birch_circle.gbapal"); -const u8 gBirchBagTilemap[] = INCBIN_U8("graphics/misc/birch_bag_map.bin.lz"); -const u8 gBirchGrassTilemap[] = INCBIN_U8("graphics/misc/birch_grass_map.bin.lz"); -const u8 gBirchHelpGfx[] = INCBIN_U8("graphics/misc/birch_help.4bpp.lz"); -static const u8 gBirchBallarrow_Gfx[] = INCBIN_U8("graphics/misc/birch_ballarrow.4bpp.lz"); -static const u8 gBirchCircle_Gfx[] = INCBIN_U8("graphics/misc/birch_circle.4bpp.lz"); -static const u8 gStarterChoose_PokeballCoords[][2] = -{ - {60, 64}, - {120, 88}, - {180, 64}, -}; -static const u8 gStarterChoose_LabelCoords[][2] = -{ - {0, 9}, - {16, 10}, - {8, 4}, -}; -static const u16 sStarterMons[] = {SPECIES_TREECKO, SPECIES_TORCHIC, SPECIES_MUDKIP}; -static const struct OamData gOamData_83F76CC = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83F76D4 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83F76DC = -{ - .y = 160, - .affineMode = 3, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const u8 gUnknown_083F76E4[][2] = -{ - {60, 32}, - {120, 56}, - {180, 32}, - {0, 0}, -}; -static const union AnimCmd gSpriteAnim_83F76EC[] = -{ - ANIMCMD_FRAME(48, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83F76F4[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83F76FC[] = -{ - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(0, 32), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd gSpriteAnim_83F7744[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_83F774C[] = -{ - gSpriteAnim_83F76EC, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7750[] = -{ - gSpriteAnim_83F76F4, - gSpriteAnim_83F76FC, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7758[] = -{ - gSpriteAnim_83F7744, -}; -static const union AffineAnimCmd gSpriteAffineAnim_83F775C[] = -{ - AFFINEANIMCMD_FRAME(16, 16, 0, 0), - AFFINEANIMCMD_FRAME(16, 16, 0, 15), - AFFINEANIMCMD_END, -}; -static const union AffineAnimCmd gSpriteAffineAnim_83F7774[] = -{ - AFFINEANIMCMD_FRAME(20, 20, 0, 0), - AFFINEANIMCMD_FRAME(20, 20, 0, 15), - AFFINEANIMCMD_END, -}; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F778C[] = -{ - gSpriteAffineAnim_83F775C, -}; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7790[] = -{ - gSpriteAffineAnim_83F7774, -}; -static const struct CompressedSpriteSheet gUnknown_083F7794[] = -{ - {gBirchBallarrow_Gfx, 0x0800, 0x1000}, - {NULL}, -}; -static const struct CompressedSpriteSheet gUnknown_083F77A4[] = -{ - {gBirchCircle_Gfx, 0x0800, 0x1001}, - {NULL}, -}; -const struct SpritePalette gUnknown_083F77B4[] = -{ - {gBirchBallarrow_Pal, 0x1000}, - {gBirchCircle_Pal, 0x1001}, - {NULL}, -}; -static void sub_810A62C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F77CC = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83F76CC, - .anims = gSpriteAnimTable_83F774C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810A62C, -}; -static void sub_810A68C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F77E4 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83F76D4, - .anims = gSpriteAnimTable_83F7750, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810A68C, -}; -static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F77FC = -{ - .tileTag = 4097, - .paletteTag = 4097, - .oam = &gOamData_83F76DC, - .anims = gSpriteAnimTable_83F7758, - .images = NULL, - .affineAnims = gSpriteAffineAnimTable_83F7790, - .callback = StarterPokemonSpriteAnimCallback, -}; - -static void MainCallback2(void); -static void Task_StarterChoose1(u8 taskId); -static void Task_StarterChoose2(u8 taskId); -static void Task_StarterChoose3(u8 taskId); -static void Task_StarterChoose4(u8 taskId); -static void Task_StarterChoose5(u8 taskId); -static void Task_StarterChoose6(u8 taskId); - -static void CreateStarterPokemonLabel(u8, u8); -static u8 CreatePokemonFrontSprite(u16, u8, u8); - -//Position of the sprite of the selected starter Pokemon -#define STARTER_PKMN_POS_X 120 -#define STARTER_PKMN_POS_Y 64 - -//Retrieves one of the available starter Pokemon -u16 GetStarterPokemon(u16 n) -{ - if (n > 3) - n = 0; - return sStarterMons[n]; -} - -static void VblankCallback(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -#define tStarterSelection data[0] -#define tPkmnSpriteId data[1] -#define tCircleSpriteId data[2] - -void CB2_ChooseStarter(void) -{ - u16 savedIme; - u8 taskId; - u8 spriteId; - - SetVBlankCallback(NULL); - - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - - LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); - LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); - LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - FreeAllSpritePalettes(); - LoadPalette(gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); - LoadCompressedObjectPic(&gUnknown_083F7794[0]); - LoadCompressedObjectPic(&gUnknown_083F77A4[0]); - LoadSpritePalettes(gUnknown_083F77B4); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - SetVBlankCallback(VblankCallback); - SetMainCallback2(MainCallback2); - - REG_WININ = 0x3F; - REG_WINOUT = 0x1F; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_BLDCNT = 0xFE; - REG_BLDALPHA = 0; - REG_BLDY = 0x7; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; - - taskId = CreateTask(Task_StarterChoose1, 0); - gTasks[taskId].tStarterSelection = 1; - - //Create hand sprite - spriteId = CreateSprite(&gSpriteTemplate_83F77CC, 120, 56, 2); - gSprites[spriteId].data[0] = taskId; - - //Create three Pokeball sprites - spriteId = CreateSprite( - &gSpriteTemplate_83F77E4, - gStarterChoose_PokeballCoords[0][0], gStarterChoose_PokeballCoords[0][1], 2); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = 0; - spriteId = CreateSprite( - &gSpriteTemplate_83F77E4, - gStarterChoose_PokeballCoords[1][0], gStarterChoose_PokeballCoords[1][1], 2); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = 1; - spriteId = CreateSprite( - &gSpriteTemplate_83F77E4, - gStarterChoose_PokeballCoords[2][0], gStarterChoose_PokeballCoords[2][1], 2); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = 2; -} - -static void MainCallback2(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void Task_StarterChoose1(u8 taskId) -{ - CreateStarterPokemonLabel(0xFF, gTasks[taskId].tStarterSelection); - Menu_DrawStdWindowFrame(2, 14, 27, 19); - Menu_PrintText(gOtherText_BirchInTrouble, 3, 15); - gTasks[taskId].func = Task_StarterChoose2; -} - -static void Task_StarterChoose2(u8 taskId) -{ - u8 selection = gTasks[taskId].tStarterSelection; - - if (gMain.newKeys & A_BUTTON) - { - u8 spriteId; - - Menu_EraseWindowRect( - gStarterChoose_LabelCoords[selection][0], - gStarterChoose_LabelCoords[selection][1], - gStarterChoose_LabelCoords[selection][0] + 13, - gStarterChoose_LabelCoords[selection][1] + 3); - - REG_WIN0H = 0; - REG_WIN0V = 0; - - //Create white circle background - spriteId = CreateSprite( - &gSpriteTemplate_83F77FC, - gStarterChoose_PokeballCoords[selection][0], - gStarterChoose_PokeballCoords[selection][1], - 1); - gTasks[taskId].tCircleSpriteId = spriteId; - - //Create Pokemon sprite - spriteId = CreatePokemonFrontSprite( - GetStarterPokemon(gTasks[taskId].tStarterSelection), - gStarterChoose_PokeballCoords[selection][0], - gStarterChoose_PokeballCoords[selection][1]); - gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_83F778C; - gSprites[spriteId].callback = StarterPokemonSpriteAnimCallback; - gTasks[taskId].tPkmnSpriteId = spriteId; - - gTasks[taskId].func = Task_StarterChoose3; - } - else - { - if ((gMain.newKeys & DPAD_LEFT) && selection > 0) - { - gTasks[taskId].tStarterSelection--; - CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection); - } - else if ((gMain.newKeys & DPAD_RIGHT) && selection < 2) - { - gTasks[taskId].tStarterSelection++; - CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection); - } - } -} - -static void Task_StarterChoose3(u8 taskId) -{ - if (gSprites[gTasks[taskId].tCircleSpriteId].affineAnimEnded && - gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X && - gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y) - { - gTasks[taskId].func = Task_StarterChoose4; - } -} - -static void Task_StarterChoose4(u8 taskId) -{ - PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0); - Menu_DrawStdWindowFrame(2, 14, 27, 19); - //"Do you choose this POKEMON?" - Menu_PrintText(gOtherText_DoYouChoosePoke, 3, 15); - DisplayYesNoMenu(21, 7, 1); - gTasks[taskId].func = Task_StarterChoose5; -} - -static void Task_StarterChoose5(u8 taskId) -{ - u8 spriteId; - - switch (Menu_ProcessInputNoWrap_()) - { - case 0: // YES - //Return the starter choice and exit. - gSpecialVar_Result = gTasks[taskId].tStarterSelection; - SetMainCallback2(gMain.savedCallback); - break; - case 1: // NO - case -1: // B button - PlaySE(SE_SELECT); - Menu_EraseWindowRect(21, 7, 27, 12); - - spriteId = gTasks[taskId].tPkmnSpriteId; - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum)); - FreeOamMatrix(gSprites[spriteId].oam.matrixNum); - DestroySprite(&gSprites[spriteId]); - - spriteId = gTasks[taskId].tCircleSpriteId; - FreeOamMatrix(gSprites[spriteId].oam.matrixNum); - DestroySprite(&gSprites[spriteId]); - gTasks[taskId].func = Task_StarterChoose6; - break; - } -} - -static void Task_StarterChoose6(u8 taskId) -{ - gTasks[taskId].func = Task_StarterChoose1; -} - -void AddTextColorCtrlCode(u8 *string, u8 bgColor, u8 textColor, u8 shadowColor) -{ - *(string++) = EXT_CTRL_CODE_BEGIN; - *(string++) = 4; - *(string++) = textColor; - *(string++) = bgColor; - *(string++) = shadowColor; -} - -#define SET_CHAR(str, index, c) \ -{ \ - u8 *p = str + index; \ - *p = c; \ -} - - -#if ENGLISH -static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) -{ - u8 labelText[72]; - const u8 *category; - u8 srcIndex; - u8 dstIndex; - u16 species; - - u8 labelLeft; - u8 labelRight; - u8 labelTop; - u8 labelBottom; - - if (prevSelection != 0xFF) - { - //Remove the old Pokemon label - Menu_EraseWindowRect( - gStarterChoose_LabelCoords[prevSelection][0], - gStarterChoose_LabelCoords[prevSelection][1], - gStarterChoose_LabelCoords[prevSelection][0] + 13, - gStarterChoose_LabelCoords[prevSelection][1] + 3); - REG_WIN0H = 0; - REG_WIN0V = 0; - } - species = GetStarterPokemon(selection); - category = GetPokemonCategory(SpeciesToNationalPokedexNum(species)); - AddTextColorCtrlCode(labelText, 0, 15, 8); - dstIndex = 5; - SET_CHAR(labelText, 5, EXT_CTRL_CODE_BEGIN); - SET_CHAR(labelText, 6, 0x11); - SET_CHAR(labelText, 7, dstIndex); - - //Copy category string to label - dstIndex = 8; - srcIndex = 0; - while (category[srcIndex] != EOS && srcIndex <= 10) - { - labelText[dstIndex] = category[srcIndex]; - srcIndex++; - dstIndex++; - } - labelText[dstIndex++] = CHAR_SPACE; - - //Copy POKEMON string to label - StringCopy(labelText + dstIndex, gOtherText_Poke); - Menu_PrintText( - labelText, - gStarterChoose_LabelCoords[selection][0], - gStarterChoose_LabelCoords[selection][1]); - AddTextColorCtrlCode(labelText, 0, 15, 8); - - //Copy Pokemon name to label - sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1); - Menu_PrintText( - labelText, - gStarterChoose_LabelCoords[selection][0], - gStarterChoose_LabelCoords[selection][1] + 2); - - labelLeft = gStarterChoose_LabelCoords[selection][0] * 8 + 4; - labelRight = (gStarterChoose_LabelCoords[selection][0] + 13) * 8 + 4; - labelTop = gStarterChoose_LabelCoords[selection][1] * 8; - labelBottom = (gStarterChoose_LabelCoords[selection][1] + 4) * 8; - REG_WIN0H = WIN_RANGE(labelLeft, labelRight); - REG_WIN0V = WIN_RANGE(labelTop, labelBottom); -} -#elif GERMAN -__attribute__((naked)) -static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - sub sp, 0x48\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - cmp r0, 0xFF\n\ - beq _0810A872\n\ - ldr r1, _0810A960 @ =gStarterChoose_LabelCoords\n\ - lsls r2, r0, 1\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - adds r1, 0x1\n\ - adds r2, r1\n\ - ldrb r1, [r2]\n\ - adds r2, r0, 0\n\ - adds r2, 0xD\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - adds r3, r1, 0x3\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - bl Menu_EraseWindowRect\n\ - ldr r0, _0810A964 @ =0x04000040\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - adds r0, 0x4\n\ - strh r1, [r0]\n\ -_0810A872:\n\ - adds r0, r5, 0\n\ - bl GetStarterPokemon\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - adds r0, r6, 0\n\ - bl SpeciesToNationalPokedexNum\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl GetPokemonCategory\n\ - adds r4, r0, 0\n\ - mov r0, sp\n\ - movs r1, 0\n\ - movs r2, 0xF\n\ - movs r3, 0x8\n\ - bl AddTextColorCtrlCode\n\ - movs r2, 0x8\n\ - movs r3, 0\n\ - ldrb r0, [r4]\n\ - lsls r5, 1\n\ - mov r7, sp\n\ - adds r7, 0x5\n\ - cmp r0, 0xFF\n\ - beq _0810A8CA\n\ -_0810A8A8:\n\ - mov r0, sp\n\ - adds r1, r0, r2\n\ - adds r0, r4, r3\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - adds r0, r2, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - adds r0, r4, r3\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xFF\n\ - beq _0810A8CA\n\ - cmp r3, 0xA\n\ - bls _0810A8A8\n\ -_0810A8CA:\n\ - mov r0, sp\n\ - adds r1, r0, r2\n\ - movs r0, 0xFF\n\ - strb r0, [r1]\n\ - mov r1, sp\n\ - movs r0, 0xFC\n\ - strb r0, [r1, 0x5]\n\ - movs r0, 0x11\n\ - strb r0, [r1, 0x6]\n\ - mov r2, sp\n\ - lsls r1, r3, 1\n\ - adds r1, r3\n\ - lsls r1, 1\n\ - movs r0, 0x70\n\ - subs r0, r1\n\ - asrs r0, 1\n\ - strb r0, [r2, 0x7]\n\ - ldr r0, _0810A960 @ =gStarterChoose_LabelCoords\n\ - adds r1, r5, r0\n\ - ldrb r4, [r1]\n\ - adds r0, 0x1\n\ - adds r0, r5, r0\n\ - ldrb r5, [r0]\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - adds r2, r5, 0\n\ - bl Menu_PrintText\n\ - mov r0, sp\n\ - movs r1, 0\n\ - movs r2, 0xF\n\ - movs r3, 0x8\n\ - bl AddTextColorCtrlCode\n\ - movs r0, 0xB\n\ - adds r1, r6, 0\n\ - muls r1, r0\n\ - ldr r0, _0810A968 @ =gSpeciesNames\n\ - adds r1, r0\n\ - adds r0, r7, 0\n\ - movs r2, 0x70\n\ - movs r3, 0x2\n\ - bl sub_8072C74\n\ - adds r2, r5, 0x2\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl Menu_PrintText\n\ - lsls r0, r4, 3\n\ - adds r0, 0x4\n\ - lsls r0, 24\n\ - adds r4, 0xD\n\ - lsls r4, 3\n\ - adds r4, 0x4\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - lsls r1, r5, 27\n\ - adds r5, 0x4\n\ - lsls r5, 27\n\ - lsrs r5, 24\n\ - ldr r2, _0810A964 @ =0x04000040\n\ - lsrs r0, 16\n\ - orrs r0, r4\n\ - strh r0, [r2]\n\ - ldr r0, _0810A96C @ =0x04000044\n\ - lsrs r1, 16\n\ - orrs r1, r5\n\ - strh r1, [r0]\n\ - add sp, 0x48\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0810A960: .4byte gStarterChoose_LabelCoords\n\ -_0810A964: .4byte 0x04000040\n\ -_0810A968: .4byte gSpeciesNames\n\ -_0810A96C: .4byte 0x04000044\n\ - .syntax divided\n"); -} -#endif - -static void nullsub_72(struct Sprite *sprite) -{ -} - -static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y) -{ - u8 spriteId; - - DecompressPicFromTable_2( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, - gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], - species); - LoadCompressedObjectPalette(&gMonPaletteTable[species]); - GetMonSpriteTemplate_803C56C(species, 1); - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].callback = nullsub_72; - gSprites[spriteId].oam.priority = 0; - return spriteId; -} - -//Sprite callback -static void sub_810A62C(struct Sprite *sprite) -{ - sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data[0]].tStarterSelection][0]; - sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data[0]].tStarterSelection][1]; - sprite->pos2.y = Sin(sprite->data[1], 8); - sprite->data[1] = (u8)sprite->data[1] + 4; -} - -//Sprite callback -static void sub_810A68C(struct Sprite *sprite) -{ - if (gTasks[sprite->data[0]].tStarterSelection == sprite->data[1]) - StartSpriteAnimIfDifferent(sprite, 1); - else - StartSpriteAnimIfDifferent(sprite, 0); -} - -//Sprite callback -static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite) -{ - //Move sprite to upper center of screen - if (sprite->pos1.x > STARTER_PKMN_POS_X) - sprite->pos1.x -= 4; - if (sprite->pos1.x < STARTER_PKMN_POS_X) - sprite->pos1.x += 4; - if (sprite->pos1.y > STARTER_PKMN_POS_Y) - sprite->pos1.y -= 2; - if (sprite->pos1.y < STARTER_PKMN_POS_Y) - sprite->pos1.y += 2; -} diff --git a/src/field/trader.c b/src/field/trader.c deleted file mode 100644 index 885557d5a..000000000 --- a/src/field/trader.c +++ /dev/null @@ -1,263 +0,0 @@ -#include "global.h" -#include "constants/decorations.h" -#include "decoration.h" -#include "decoration_inventory.h" -#include "event_data.h" -#include "main.h" -#include "mauville_man.h" -#include "menu.h" -#include "menu_helpers.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" - -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -static const u8 * const gUnknown_083F62D8[] = -{ - SecretBaseText_Tristan, - SecretBaseText_Philip, - SecretBaseText_Dennis, - SecretBaseText_Roberto, -}; - -static const u8 gTraderDecorations[] = -{ - DECOR_DUSKULL_DOLL, - DECOR_BALL_CUSHION, - DECOR_TIRE, - DECOR_PRETTY_FLOWERS, -}; - -void sub_810993C(void) -{ - u8 i, j; - u8 buffer[12]; - struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; - - for (i = 0; i < 3; i++) - { - for (j = i + 1; j < 4; j++) - { - if (trader->unk1[i] == 0) - { - u8 temp = trader->unk1[i]; - trader->unk1[i] = trader->unk1[j]; - trader->unk1[j] = temp; - StringCopy(buffer, trader->unk5[i]); - StringCopy(trader->unk5[i], trader->unk5[j]); - StringCopy(trader->unk5[j], buffer); - } - } - } -} - -void TraderSetup(void) -{ - u8 i; - struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; - - trader->id = MAUVILLE_MAN_TRADER; - trader->alreadyTraded = FALSE; - - for (i = 0; i < 4; i++) - { - StringCopy(trader->unk5[i], gUnknown_083F62D8[i]); - trader->unk1[i] = gTraderDecorations[i]; - } - - sub_810993C(); -} - -void sub_8109A20(void) -{ - struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; - trader->alreadyTraded = FALSE; -} - -void sub_8109A30(u8 value) -{ - VarSet(VAR_RECYCLE_GOODS, value); -} - -void CreateAvailableDecorationsMenu(u8 taskId) -{ - u8 i; - u8 numChoices = 1; - u8 numDecorations = 0; - struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; - - for (i = 0; i < 4; i++) - { - if (trader->unk1[i]) - { - numChoices++; - } - } - - Menu_DrawStdWindowFrame(0, 1, 12, numChoices * 2 + 2); - - for (i = 0; i < 4; i++) - { - if (trader->unk1[i]) - { - if (trader->unk1[i] > DECOR_REGISTEEL_DOLL) - { - Menu_PrintText(gOtherText_FiveQuestions, 1, numDecorations * 2 + 2); - } - else - { - Menu_PrintText(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2); - } - - numDecorations++; - } - } - - Menu_PrintText(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2); - InitMenu(0, 1, 2, numChoices, 0, 11); - gTasks[taskId].data[1] = numDecorations; -} - -void sub_8109B34(u8 taskId, u8 decorationId) -{ - if (decorationId > DECOR_REGISTEEL_DOLL) - { - gSpecialVar_0x8004 = 0xFFFF; - } - else - { - gSpecialVar_0x8004 = decorationId; - } - - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 1, 12, 12); - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void Task_HandleGetDecorationMenuInput(u8 taskId) -{ - struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; - - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(-1); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Menu_MoveCursor(1); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gSpecialVar_0x8005 = Menu_GetCursorPos(); - if (gTasks[taskId].data[1] == gSpecialVar_0x8005) - { - sub_8109B34(taskId, 0); - } - else - { - StringCopy(gStringVar1, trader->unk5[gSpecialVar_0x8005]); - sub_8109B34(taskId, trader->unk1[gSpecialVar_0x8005]); - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_8109B34(taskId, 0); - } -} - -void ScrSpecial_GetTraderTradedFlag(void) -{ - struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; - gSpecialVar_Result = trader->alreadyTraded; -} - -void ScrSpecial_DoesPlayerHaveNoDecorations(void) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - if (sub_8134194(i)) - { - gSpecialVar_Result = FALSE; - return; - } - } - gSpecialVar_Result = TRUE; -} - -void ScrSpecial_IsDecorationFull(void) -{ - gSpecialVar_Result = FALSE; - if (gDecorations[gSpecialVar_0x8004].category != gDecorations[gSpecialVar_0x8006].category - && sub_8133F9C(gDecorations[gSpecialVar_0x8004].category) == -1) - { - sub_80FE7D4(gStringVar2, gDecorations[gSpecialVar_0x8004].category); - gSpecialVar_Result = TRUE; - } -} - -void ScrSpecial_TraderMenuGiveDecoration(void) -{ - CreateTask(sub_80FE7A8, 0); -} - -void sub_8109D04(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 29, 19); - DestroyVerticalScrollIndicator(TOP_ARROW); - DestroyVerticalScrollIndicator(BOTTOM_ARROW); - sub_80F9520(gUnknown_020388F7, 8); - BuyMenuFreeMemory(); - if (sub_80FEFA4() == TRUE) - { - gSpecialVar_0x8006 = gUnknown_020388D0[gUnknown_020388F5]; - StringCopy(gStringVar3, gDecorations[gSpecialVar_0x8004].name); - StringCopy(gStringVar2, gDecorations[gSpecialVar_0x8006].name); - } - else - { - gSpecialVar_0x8006 = 0xFFFF; - } - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void sub_8109DAC(u8 taskId) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 29, 19); - gSpecialVar_0x8006 = 0; - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -void ScrSpecial_TraderDoDecorationTrade(void) -{ - struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; - - sub_81340A8(gSpecialVar_0x8006); - IsThereStorageSpaceForDecoration(gSpecialVar_0x8004); - StringCopy(trader->unk5[gSpecialVar_0x8005], gSaveBlock2.playerName); - trader->unk1[gSpecialVar_0x8005] = gSpecialVar_0x8006; - sub_810993C(); - trader->alreadyTraded = TRUE; -} - -void ScrSpecial_TraderMenuGetDecoration(void) -{ - u8 taskId = CreateTask(Task_HandleGetDecorationMenuInput, 0); - CreateAvailableDecorationsMenu(taskId); -} diff --git a/src/field/trainer_see.c b/src/field/trainer_see.c deleted file mode 100644 index 2913a0a5a..000000000 --- a/src/field/trainer_see.c +++ /dev/null @@ -1,559 +0,0 @@ -#include "global.h" -#include "trainer_see.h" -#include "battle_setup.h" -#include "field_effect.h" -#include "event_object_movement.h" -#include "field_player_avatar.h" -#include "script.h" -#include "sprite.h" -#include "task.h" -#include "util.h" - -static bool8 CheckTrainer(u8); -static void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3); -static void objc_exclamation_mark_probably(struct Sprite *sprite); -static bool8 TrainerCanApproachPlayer(struct MapObject *); -static void sub_80842C8(struct MapObject *, u8); -static bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction); -static void RunTrainerSeeFuncList(u8 taskId); - -const u8 gSpriteImage_839B308[] = INCBIN_U8("graphics/unknown_sprites/839B4E0/0.4bpp"); -const u8 gSpriteImage_839B388[] = INCBIN_U8("graphics/unknown_sprites/839B4E0/1.4bpp"); -const u8 gSpriteImage_839B408[] = INCBIN_U8("graphics/unknown_sprites/839B408.4bpp"); - -static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y); - -static u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *, s16, s16, s16) = -{ - GetTrainerApproachDistanceSouth, - GetTrainerApproachDistanceNorth, - GetTrainerApproachDistanceWest, - GetTrainerApproachDistanceEast, -}; - -bool8 CheckTrainers(void) -{ - u8 mapObjId; - - for (mapObjId = 0; mapObjId < 16; mapObjId++) - { - if (gMapObjects[mapObjId].active - && (gMapObjects[mapObjId].trainerType == 1 || gMapObjects[mapObjId].trainerType == 3) - && CheckTrainer(mapObjId)) - return TRUE; - } - return FALSE; -} - -static bool8 CheckTrainer(u8 mapObjId) -{ - u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(mapObjId); - - if (GetTrainerFlagFromScriptPointer(scriptPtr)) - { - return FALSE; - } - else - { - struct MapObject *trainerObj = &gMapObjects[mapObjId]; - bool8 canApproach = TrainerCanApproachPlayer(trainerObj); - - if (canApproach) - { - TrainerWantsBattle(mapObjId, scriptPtr); - sub_80842C8(trainerObj, (canApproach - 1)); - return TRUE; - } - else - { - return FALSE; - } - } -} - -static bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj) -{ - s16 x, y; - u8 i; - u8 approachDistance; - - PlayerGetDestCoords(&x, &y); - if (trainerObj->trainerType == 1) // can only see in one direction - { - approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); - return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->mapobj_unk_18); - } - else // can see in all directions - { - for (i = 0; i < 4; i++) - { - approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); - if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east - return approachDistance; - } - } - return FALSE; -} - -// Returns how far south the player is from trainer. 0 if out of trainer's sight. -static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) -{ - if (trainerObj->coords2.x == x - && y > trainerObj->coords2.y - && y <= trainerObj->coords2.y + range) - return (y - trainerObj->coords2.y); - else - return 0; -} - -// Returns how far north the player is from trainer. 0 if out of trainer's sight. -static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) -{ - if (trainerObj->coords2.x == x - && y < trainerObj->coords2.y - && y >= trainerObj->coords2.y - range) - return (trainerObj->coords2.y - y); - else - return 0; -} - -// Returns how far west the player is from trainer. 0 if out of trainer's sight. -static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y) -{ - if (trainerObj->coords2.y == y - && x < trainerObj->coords2.x - && x >= trainerObj->coords2.x - range) - return (trainerObj->coords2.x - x); - else - return 0; -} - -// Returns how far east the player is from trainer. 0 if out of trainer's sight. -static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y) -{ - if (trainerObj->coords2.y == y - && x > trainerObj->coords2.x - && x <= trainerObj->coords2.x + range) - return (x - trainerObj->coords2.x); - else - return 0; -} - -#ifdef BUGFIX_TRAINERAPPROACH -#define COLLISION_MASK ~1 -#else -#define COLLISION_MASK 1 -#endif - -static bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction) -{ - s16 x, y; - u8 unk19_temp; - u8 unk19b_temp; - u8 i; - u8 collision; - - if (approachDistance == 0) - return FALSE; - - x = trainerObj->coords2.x; - y = trainerObj->coords2.y; - - for (i = 0; i <= approachDistance - 1; i++, MoveCoords(direction, &x, &y)) - { - collision = sub_8060024(trainerObj, x, y, direction); - if (collision != 0 && (collision & COLLISION_MASK)) - return FALSE; - } - - // preserve mapobj_unk_19 before clearing. - unk19_temp = trainerObj->range.as_nybbles.x; - unk19b_temp = trainerObj->range.as_nybbles.y; - trainerObj->range.as_nybbles.x = 0; - trainerObj->range.as_nybbles.y = 0; - - collision = npc_block_way((struct MapObject *)trainerObj, x, y, direction); - - trainerObj->range.as_nybbles.x = unk19_temp; - trainerObj->range.as_nybbles.y = unk19b_temp; - if (collision == 4) - return approachDistance; - - return FALSE; -} - -#define tTrainerObjHi data[1] -#define tTrainerObjLo data[2] - -static void sub_80842C8(struct MapObject *trainerObj, u8 b) -{ - u8 taskId = CreateTask(RunTrainerSeeFuncList, 0x50); - struct Task *task = &gTasks[taskId]; - - task->tTrainerObjHi = (u32)(trainerObj) >> 16; - task->tTrainerObjLo = (u32)(trainerObj); - task->data[3] = b; -} - -static void sub_80842FC(TaskFunc followupFunc) -{ - TaskFunc taskFunc = RunTrainerSeeFuncList; - u8 taskId = FindTaskIdByFunc(taskFunc); - - SetTaskFuncWithFollowupFunc(taskId, taskFunc, followupFunc); - gTasks[taskId].data[0] = 1; - taskFunc(taskId); -} - -static bool8 sub_8084394(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj); - -static bool8 (*const gTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = -{ - sub_8084394, - sub_8084398, - sub_80843DC, - sub_808441C, - sub_8084478, - sub_8084534, - sub_8084578, - sub_80845AC, - sub_80845C8, - sub_80845FC, - sub_8084654, - sub_80846C8, -}; - -static void RunTrainerSeeFuncList(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - struct MapObject *trainerObj = (struct MapObject *)((task->tTrainerObjHi << 16) | (task->tTrainerObjLo)); - - if (!trainerObj->active) - { - SwitchTaskToFollowupFunc(taskId); - } - else - { - while (gTrainerSeeFuncList[task->data[0]](taskId, task, trainerObj)) - ; - } -} - -static bool8 sub_8084394(u8 taskId, struct Task *task, struct MapObject *trainerObj) // cant be void because it is called with RunTrainerSeeFuncList with arguments. -{ - return FALSE; -} - -static bool8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - u8 direction; - - FieldObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); - direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); - FieldObjectSetSpecialAnim(trainerObj, direction); - task->data[0]++; - return TRUE; -} - -static bool8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (FieldEffectActiveListContains(0)) - { - return FALSE; - } - else - { - task->data[0]++; - if (trainerObj->animPattern == 57 || trainerObj->animPattern == 58) - task->data[0] = 6; - if (trainerObj->animPattern == 63) - task->data[0] = 8; - return TRUE; - } -} - -static bool8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - { - if (task->data[3]) - { - FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18)); - task->data[3]--; - } - else - { - FieldObjectSetSpecialAnim(trainerObj, 0x3E); - task->data[0]++; - } - } - return FALSE; -} - -static bool8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - struct MapObject *playerObj; - - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - return FALSE; - - npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); - sub_805C774(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); - sub_805C754(trainerObj); - - playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) - return FALSE; - - sub_80597E8(); - FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18))); - task->data[0]++; - return FALSE; -} - -static bool8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // technically only 1 parameter, but needs all 3 for TrainerSeeFuncList call. -{ - struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) - SwitchTaskToFollowupFunc(taskId); - return FALSE; -} - -static bool8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - { - FieldObjectSetSpecialAnim(trainerObj, 0x59); - task->data[0]++; - } - return FALSE; -} - -static bool8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - task->data[0] = 3; - - return FALSE; -} - -static bool8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) - { - FieldObjectSetSpecialAnim(trainerObj, 0x3E); - task->data[0]++; - } - return FALSE; -} - -static bool8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) - { - gFieldEffectArguments[0] = trainerObj->coords2.x; - gFieldEffectArguments[1] = trainerObj->coords2.y; - gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1; - gFieldEffectArguments[3] = 2; - task->data[4] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); - task->data[0]++; - } - return FALSE; -} - -static bool8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - struct Sprite *sprite; - - if (gSprites[task->data[4]].animCmdIndex == 2) - { - trainerObj->mapobj_bit_26 = 0; - trainerObj->mapobj_bit_2 = 1; - - sprite = &gSprites[trainerObj->spriteId]; - sprite->oam.priority = 2; - FieldObjectClearAnimIfSpecialAnimFinished(trainerObj); - FieldObjectSetSpecialAnim(trainerObj, sub_806084C(trainerObj->mapobj_unk_18)); - task->data[0]++; - } - return FALSE; -} - -static bool8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) -{ - if (!FieldEffectActiveListContains(49)) - task->data[0] = 3; - - return FALSE; -} - -static bool8 (*const gTrainerSeeFuncList2[])(u8, struct Task *, struct MapObject *) = -{ - sub_80845C8, - sub_80845FC, - sub_8084654, - sub_80846C8, -}; - -void sub_80846E4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - struct MapObject *mapObj; - - // another mapObj loaded into by loadword? - LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj); - if (!task->data[7]) - { - FieldObjectClearAnim(mapObj); - task->data[7]++; - } - gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); - if (task->data[0] == 3 && !FieldEffectActiveListContains(49)) - { - npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); - sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); - DestroyTask(taskId); - } - else - mapObj->mapobj_bit_7 = 0; -} - -void sub_8084794(struct MapObject *var) -{ - StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], (u32)var); -} - -static void Task_DestroyTrainerApproachTask(u8); - -void ScrSpecial_EndTrainerApproach(void) -{ - sub_80842FC(Task_DestroyTrainerApproachTask); -} - -static void Task_DestroyTrainerApproachTask(u8 taskId) -{ - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -static const struct OamData gOamData_839B4D8 = { - .size = 1, .priority = 1 -}; - -static const struct SpriteFrameImage gSpriteImageTable_839B4E0[] = { - { gSpriteImage_839B308, sizeof gSpriteImage_839B308 }, - { gSpriteImage_839B388, sizeof gSpriteImage_839B388 } -}; - -static const struct SpriteFrameImage gSpriteImageTable_839B4F0[] = { - { gSpriteImage_839B408, sizeof gSpriteImage_839B408 } -}; - -static const union AnimCmd gSpriteAnim_839B4F8[] = { - ANIMCMD_FRAME(0, 60), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_839B500[] = { - ANIMCMD_FRAME(1, 60), - ANIMCMD_END -}; - -static const union AnimCmd *const gSpriteAnimTable_839B508[] = { - gSpriteAnim_839B4F8, - gSpriteAnim_839B500 -}; - -static const struct SpriteTemplate gSpriteTemplate_839B510 = { - 0xffff, 0xffff, &gOamData_839B4D8, gSpriteAnimTable_839B508, gSpriteImageTable_839B4E0, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably -}; -static const struct SpriteTemplate gSpriteTemplate_839B528 = { - 0xffff, 4100, &gOamData_839B4D8, gSpriteAnimTable_839B508, gSpriteImageTable_839B4F0, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably -}; - -u8 FldEff_ExclamationMarkIcon1(void) -{ - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x53); - - if (spriteId != 64) - sub_8084894(&gSprites[spriteId], 0, 0); - - return 0; -} - -u8 FldEff_ExclamationMarkIcon2(void) -{ - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x52); - - if (spriteId != 64) - sub_8084894(&gSprites[spriteId], 33, 1); - - return 0; -} - -u8 FldEff_HeartIcon(void) -{ - u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B528, 0, 0, 0x52); - - if (spriteId != 64) - sub_8084894(&gSprites[spriteId], 46, 0); - - return 0; -} - -static void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3) -{ - sprite->oam.priority = 1; - sprite->coordOffsetEnabled = 1; - - sprite->data[0] = gFieldEffectArguments[0]; - sprite->data[1] = gFieldEffectArguments[1]; - sprite->data[2] = gFieldEffectArguments[2]; - sprite->data[3] = -5; - sprite->data[7] = a2; - - StartSpriteAnim(sprite, a3); -} - -static void objc_exclamation_mark_probably(struct Sprite *sprite) -{ - u8 mapObjId; - - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjId) - || sprite->animEnded) - { - FieldEffectStop(sprite, (u8)sprite->data[7]); - } - else - { - struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId]; - sprite->data[4] += sprite->data[3]; - sprite->pos1.x = mapObjSprite->pos1.x; - sprite->pos1.y = mapObjSprite->pos1.y - 16; - sprite->pos2.x = mapObjSprite->pos2.x; - sprite->pos2.y = mapObjSprite->pos2.y + sprite->data[4]; - if (sprite->data[4]) - sprite->data[3]++; - else - sprite->data[3] = 0; - } -} diff --git a/src/field/tv.c b/src/field/tv.c deleted file mode 100644 index 6c24170ae..000000000 --- a/src/field/tv.c +++ /dev/null @@ -1,3589 +0,0 @@ -#include "global.h" -#include "tv.h" -#include "battle_tower.h" -#include "contest_painting.h" -#include "data2.h" -#include "easy_chat.h" -#include "event_data.h" -#include "fieldmap.h" -#include "field_message_box.h" -#include "field_camera.h" -#include "constants/flags.h" -#include "random.h" -#include "string_util.h" -#include "text.h" -#include "constants/species.h" -#include "pokedex.h" -#include "naming_screen.h" -#include "overworld.h" -#include "constants/maps.h" -#include "strings.h" -#include "battle.h" -#include "link.h" -#include "constants/easy_chat.h" -#include "event_object_movement.h" -#include "field_specials.h" -#include "item.h" -#include "constants/items.h" -#include "link.h" -#include "constants/maps.h" -#include "naming_screen.h" -#include "pokedex.h" -#include "region_map.h" -#include "random.h" -#include "overworld.h" -#include "rtc.h" -#include "script_menu.h" -#include "constants/species.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" -#include "ewram.h" -#include "constants/moves.h" -#include "region_map_sections.h" - -struct UnkTvStruct -{ - s8 var0; -}; - -struct OutbreakPokemon -{ - /*0x00*/ u16 species; - /*0x02*/ u16 moves[4]; - /*0x0A*/ u8 level; - /*0x0B*/ u8 location; -}; - -struct TVSaleItem { - u16 item_id; - u16 item_amount; -}; - -extern u8 gUnknown_02038694; - -extern struct TVSaleItem gMartPurchaseHistory[3]; - -struct UnkTvStruct gUnknown_03005D38; - -extern u16 gSpecialVar_LastTalked; - -extern u8 gSpecialVar_ContestCategory; -extern u8 gSpecialVar_ContestRank; -extern u8 gUnknown_03004316[11]; -extern u8 gBattleOutcome; - -extern u16 gLastUsedItem; - -static EWRAM_DATA u16 gUnknown_020387E0 = 0; -static EWRAM_DATA u16 gUnknown_020387E2 = 0; -static EWRAM_DATA u8 gUnknown_020387E4 = 0; -static EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0; // why is this aligned to a 4-byte boundary? - -static u8 gUnknown_03000720; -static u8 gUnknown_03000721; -static s8 gUnknown_03000722; - -const struct OutbreakPokemon gPokeOutbreakSpeciesList[5] = -{ - { - .species = SPECIES_SURSKIT, - .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE}, - .level = 3, - .location = MAPSEC_Route102, - }, - { - .species = SPECIES_SURSKIT, - .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE}, - .level = 15, - .location = MAPSEC_Route114, - }, - { - .species = SPECIES_SURSKIT, - .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE}, - .level = 15, - .location = MAPSEC_Route117, - }, - { - .species = SPECIES_SURSKIT, - .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE}, - .level = 28, - .location = MAPSEC_Route120, - }, - { - .species = SPECIES_SKITTY, - .moves = {MOVE_GROWL, MOVE_TACKLE, MOVE_NONE, MOVE_NONE}, - .level = 15, - .location = MAPSEC_Route116, - }, -}; - -extern const u8 gTVNewsText_EnergyGuru1[]; -extern const u8 gTVNewsText_GameCorner1[]; -extern const u8 gTVNewsText_LilycoveDepartment1[]; -extern const u8 gTVNewsText_EnergyGuru2[]; -extern const u8 gTVNewsText_GameCorner2[]; -extern const u8 gTVNewsText_LilycoveDepartment2[]; -extern const u8 gTVNewsText_EnergyGuru3[]; -extern const u8 gTVNewsText_GameCorner3[]; -extern const u8 gTVNewsText_LilycoveDepartment3[]; -extern const u8 gTVFanClubText1[]; -extern const u8 gTVFanClubText2[]; -extern const u8 gTVFanClubText3[]; -extern const u8 gTVFanClubText4[]; -extern const u8 gTVFanClubText5[]; -extern const u8 gTVFanClubText6[]; -extern const u8 gTVFanClubText7[]; -extern const u8 gTVFanClubText8[]; -extern const u8 gTVRecentHappeningsText1[]; -extern const u8 gTVRecentHappeningsText2[]; -extern const u8 gTVRecentHappeningsText3[]; -extern const u8 gTVRecentHappeningsText4[]; -extern const u8 gTVRecentHappeningsText5[]; -extern const u8 gTVRecentHappeningsText6[]; -extern const u8 gTVFanClubOpinionsText1[]; -extern const u8 gTVFanClubOpinionsText2[]; -extern const u8 gTVFanClubOpinionsText3[]; -extern const u8 gTVFanClubOpinionsText4[]; -extern const u8 gTVFanClubOpinionsText5[]; -extern const u8 gTVPokemonOutbreakText[]; -extern const u8 gTVPokemonTodayText1[]; -extern const u8 gTVPokemonTodayText2[]; -extern const u8 gTVPokemonTodayText3[]; -extern const u8 gTVPokemonTodayText4[]; -extern const u8 gTVPokemonTodayText5[]; -extern const u8 gTVPokemonTodayText6[]; -extern const u8 gTVPokemonTodayText7[]; -extern const u8 gTVPokemonTodayText8[]; -extern const u8 gTVPokemonTodayText9[]; -extern const u8 gTVPokemonTodayText10[]; -extern const u8 gTVPokemonTodayText11[]; -extern const u8 gTVPokemonTodayText12[]; -extern const u8 gTVSmartShopperText1[]; -extern const u8 gTVSmartShopperText2[]; -extern const u8 gTVSmartShopperText3[]; -extern const u8 gTVSmartShopperText4[]; -extern const u8 gTVSmartShopperText5[]; -extern const u8 gTVSmartShopperText6[]; -extern const u8 gTVSmartShopperText7[]; -extern const u8 gTVSmartShopperText8[]; -extern const u8 gTVSmartShopperText9[]; -extern const u8 gTVSmartShopperText10[]; -extern const u8 gTVSmartShopperText11[]; -extern const u8 gTVSmartShopperText12[]; -extern const u8 gTVSmartShopperText13[]; -extern const u8 gTVBravoTrainerText1[]; -extern const u8 gTVBravoTrainerText2[]; -extern const u8 gTVBravoTrainerText3[]; -extern const u8 gTVBravoTrainerText4[]; -extern const u8 gTVBravoTrainerText5[]; -extern const u8 gTVBravoTrainerText6[]; -extern const u8 gTVBravoTrainerText7[]; -extern const u8 gTVBravoTrainerText8[]; -extern const u8 gTVBravoTrainerText9[]; -extern const u8 gTVBravoTrainerBattleTowerText1[]; -extern const u8 gTVBravoTrainerBattleTowerText2[]; -extern const u8 gTVBravoTrainerBattleTowerText3[]; -extern const u8 gTVBravoTrainerBattleTowerText4[]; -extern const u8 gTVBravoTrainerBattleTowerText5[]; -extern const u8 gTVBravoTrainerBattleTowerText6[]; -extern const u8 gTVBravoTrainerBattleTowerText7[]; -extern const u8 gTVBravoTrainerBattleTowerText8[]; -extern const u8 gTVBravoTrainerBattleTowerText9[]; -extern const u8 gTVBravoTrainerBattleTowerText10[]; -extern const u8 gTVBravoTrainerBattleTowerText11[]; -extern const u8 gTVBravoTrainerBattleTowerText12[]; -extern const u8 gTVBravoTrainerBattleTowerText13[]; -extern const u8 gTVBravoTrainerBattleTowerText14[]; -extern const u8 gTVBravoTrainerBattleTowerText15[]; -extern const u8 gTVNameRaterText1[]; -extern const u8 gTVNameRaterText2[]; -extern const u8 gTVNameRaterText3[]; -extern const u8 gTVNameRaterText4[]; -extern const u8 gTVNameRaterText5[]; -extern const u8 gTVNameRaterText6[]; -extern const u8 gTVNameRaterText7[]; -extern const u8 gTVNameRaterText8[]; -extern const u8 gTVNameRaterText9[]; -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 gTVNameRaterText19[]; -extern const u8 gTVPokemonTodayFailedCaptureText1[]; -extern const u8 gTVPokemonTodayFailedCaptureText2[]; -extern const u8 gTVPokemonTodayFailedCaptureText3[]; -extern const u8 gTVPokemonTodayFailedCaptureText4[]; -extern const u8 gTVPokemonTodayFailedCaptureText5[]; -extern const u8 gTVPokemonTodayFailedCaptureText6[]; -extern const u8 gTVPokemonTodayFailedCaptureText7[]; -extern const u8 gTVFishingGuruAdviceText1[]; -extern const u8 gTVFishingGuruAdviceText2[]; -extern const u8 gTVWorldOfMastersText1[]; -extern const u8 gTVWorldOfMastersText2[]; -extern const u8 gTVWorldOfMastersText3[]; -extern const u8 gTVGabbyAndTyText1[]; -extern const u8 gTVGabbyAndTyText2[]; -extern const u8 gTVGabbyAndTyText3[]; -extern const u8 gTVGabbyAndTyText4[]; -extern const u8 gTVGabbyAndTyText5[]; -extern const u8 gTVGabbyAndTyText6[]; -extern const u8 gTVGabbyAndTyText7[]; -extern const u8 gTVGabbyAndTyText8[]; -extern const u8 gTVGabbyAndTyText9[]; - -const u8 *const gTVNewsTextGroup1[] = -{ - NULL, - gTVNewsText_EnergyGuru1, - gTVNewsText_GameCorner1, - gTVNewsText_LilycoveDepartment1, -}; - -const u8 *const gTVNewsTextGroup2[] = -{ - NULL, - gTVNewsText_EnergyGuru2, - gTVNewsText_GameCorner2, - gTVNewsText_LilycoveDepartment2, -}; - -const u8 *const gTVNewsTextGroup3[] = -{ - NULL, - gTVNewsText_EnergyGuru3, - gTVNewsText_GameCorner3, - gTVNewsText_LilycoveDepartment3, -}; - -u8 *const gUnknown_083D1464[] = -{ - gStringVar1, - gStringVar2, - gStringVar3, -}; - -const u8 *const gTVFanClubTextGroup[] = -{ - gTVFanClubText1, - gTVFanClubText2, - gTVFanClubText3, - gTVFanClubText4, - gTVFanClubText5, - gTVFanClubText6, - gTVFanClubText7, - gTVFanClubText8, -}; - -const u8 *const gTVRecentHappeningsTextGroup[] = -{ - gTVRecentHappeningsText1, - gTVRecentHappeningsText2, - gTVRecentHappeningsText3, - gTVRecentHappeningsText4, - gTVRecentHappeningsText5, - gTVRecentHappeningsText6, -}; - -const u8 *const gTVFanClubOpinionsTextGroup[] = -{ - gTVFanClubOpinionsText1, - gTVFanClubOpinionsText2, - gTVFanClubOpinionsText3, - gTVFanClubOpinionsText4, - gTVFanClubOpinionsText5, -}; - -const u8 *const gTVPokemonOutbreakTextGroup[] = -{ - gTVPokemonOutbreakText, -}; - -const u8 *const gTVPokemonTodayTextGroup[] = -{ - gTVPokemonTodayText1, - gTVPokemonTodayText2, - gTVPokemonTodayText3, - gTVPokemonTodayText4, - gTVPokemonTodayText5, - gTVPokemonTodayText6, - gTVPokemonTodayText7, - gTVPokemonTodayText8, - gTVPokemonTodayText9, - gTVPokemonTodayText10, - gTVPokemonTodayText11, - gTVPokemonTodayText12, -}; - -const u8 *const gTVSmartShopperTextGroup[] = -{ - gTVSmartShopperText1, - gTVSmartShopperText2, - gTVSmartShopperText3, - gTVSmartShopperText4, - gTVSmartShopperText5, - gTVSmartShopperText6, - gTVSmartShopperText7, - gTVSmartShopperText8, - gTVSmartShopperText9, - gTVSmartShopperText10, - gTVSmartShopperText11, - gTVSmartShopperText12, - gTVSmartShopperText13, -}; - -const u8 *const gTVBravoTrainerTextGroup[] = -{ - gTVBravoTrainerText1, - gTVBravoTrainerText2, - gTVBravoTrainerText3, - gTVBravoTrainerText4, - gTVBravoTrainerText5, - gTVBravoTrainerText6, - gTVBravoTrainerText7, - gTVBravoTrainerText8, - gTVBravoTrainerText9, -}; - -const u8 *const gTVBravoTrainerBattleTowerTextGroup[] = -{ - gTVBravoTrainerBattleTowerText1, - gTVBravoTrainerBattleTowerText2, - gTVBravoTrainerBattleTowerText3, - gTVBravoTrainerBattleTowerText4, - gTVBravoTrainerBattleTowerText5, - gTVBravoTrainerBattleTowerText6, - gTVBravoTrainerBattleTowerText7, - gTVBravoTrainerBattleTowerText8, - gTVBravoTrainerBattleTowerText9, - gTVBravoTrainerBattleTowerText10, - gTVBravoTrainerBattleTowerText11, - gTVBravoTrainerBattleTowerText12, - gTVBravoTrainerBattleTowerText13, - gTVBravoTrainerBattleTowerText14, - gTVBravoTrainerBattleTowerText15, -}; - -const u8 *const gTVNameRaterTextGroup[] = -{ - gTVNameRaterText1, - gTVNameRaterText2, - gTVNameRaterText3, - gTVNameRaterText4, - gTVNameRaterText5, - gTVNameRaterText6, - gTVNameRaterText7, - gTVNameRaterText8, - gTVNameRaterText9, - gTVNameRaterText10, - gTVNameRaterText11, - gTVNameRaterText12, - gTVNameRaterText13, - gTVNameRaterText14, - gTVNameRaterText15, - gTVNameRaterText16, - gTVNameRaterText17, - gTVNameRaterText18, - gTVNameRaterText19, -}; - -const u8 *const gTVPokemonTodayFailedCaptureTextGroup[] = -{ - gTVPokemonTodayFailedCaptureText1, - gTVPokemonTodayFailedCaptureText2, - gTVPokemonTodayFailedCaptureText3, - gTVPokemonTodayFailedCaptureText4, - gTVPokemonTodayFailedCaptureText5, - gTVPokemonTodayFailedCaptureText6, - gTVPokemonTodayFailedCaptureText7, -}; - -const u8 *const gTVFishingGuruAdviceTextGroup[] = -{ - gTVFishingGuruAdviceText1, - gTVFishingGuruAdviceText2, -}; - -const u8 *const gTVWorldOfMastersTextGroup[] = -{ - gTVWorldOfMastersText1, - gTVWorldOfMastersText2, - gTVWorldOfMastersText3, -}; - -const u8 *const gTVGabbyAndTyTextGroup[] = -{ - gTVGabbyAndTyText1, - gTVGabbyAndTyText2, - gTVGabbyAndTyText3, - gTVGabbyAndTyText4, - gTVGabbyAndTyText5, - gTVGabbyAndTyText6, - gTVGabbyAndTyText7, - gTVGabbyAndTyText8, - gTVGabbyAndTyText9, -}; - -void ClearTVShowData(void) -{ - u8 showidx; - u8 extradataidx; - for (showidx=0; showidx<25; showidx++) { - gSaveBlock1.tvShows[showidx].common.kind = 0; - gSaveBlock1.tvShows[showidx].common.active = 0; - for (extradataidx=0; extradataidx<34; extradataidx++) { - gSaveBlock1.tvShows[showidx].common.pad02[extradataidx] = 0; - } - } - sub_80BEBF4(); -} - -bool8 sub_80BF1B4(u8); -void sub_80BF20C(void); -extern u8 gSpecialVar_ContestCategory; -extern u8 gSpecialVar_ContestRank; -extern u8 gUnknown_03004316[11]; -extern u8 gBattleOutcome; - -void InterviewBefore_FanClubLetter(void); -void InterviewBefore_RecentHappenings(void); -void InterviewBefore_PkmnFanClubOpinions(void); -void InterviewBefore_Dummy(void); -void InterviewBefore_NameRater(void); -void InterviewBefore_BravoTrainerPkmnProfile(void); -void InterviewBefore_BravoTrainerBTProfile(void); - -void sub_80BE028(void); -void sub_80BE074(void); -void sub_80BE778(void); -void sub_80BEB20(void); - -u8 GetTVChannelByShowType(u8); - -s8 sub_80BF74C(TVShow tvShow[]); - -void sub_80BF55C(TVShow tvShow[], u8 showidx); -void sub_80BEA88(void); - -void sub_80BE138(TVShow *show); -void sub_80BE160(TVShow *show); -extern u16 gLastUsedItem; - -void InterviewAfter_FanClubLetter(void); -void InterviewAfter_RecentHappenings(void); -void InterviewAfter_PkmnFanClubOpinions(void); -void InterviewAfter_DummyShow4(void); -void InterviewAfter_BravoTrainerPokemonProfile(void); -void InterviewAfter_BravoTrainerBattleTowerProfile(void); - -u8 special_0x44(void) -{ - u8 i; - u8 j; - u8 selIdx; - TVShow *show; - - for (i = 5; i < ARRAY_COUNT(gSaveBlock1.tvShows) - 1; i++) - { - if (gSaveBlock1.tvShows[i].common.kind == 0) - { - break; - } - } - - j = Random() % i; - selIdx = j; - - do - { - if (GetTVChannelByShowType(gSaveBlock1.tvShows[j].common.kind) != 4) - { - if (gSaveBlock1.tvShows[j].common.active == TRUE) - { - return j; - } - } - else - { - show = &gSaveBlock1.tvShows[j]; - if (show->massOutbreak.daysLeft == 0 && show->massOutbreak.active == TRUE) - { - return j; - } - } - if (j == 0) - { - j = ARRAY_COUNT(gSaveBlock1.tvShows) - 2; - } - else - { - j--; - } - } while (j != selIdx); - - return 0xFF; -} - -u8 FindNonMassOutbreakActiveTVShow(void); - -u8 sub_80BD8B8(void) -{ - u8 retval = special_0x44(); - - if (retval == 0xff) - return 0xff; - if (gSaveBlock1.outbreakPokemonSpecies != 0 && gSaveBlock1.tvShows[retval].common.kind == TVSHOW_MASS_OUTBREAK) - return FindNonMassOutbreakActiveTVShow(); - return retval; -} - -u8 CheckForBigMovieOrEmergencyNewsOnTV(void); -void SetTVMetatilesOnMap(int, int, u16); -bool8 FindAnyTVNewsOnTheAir(void); -bool8 IsTVShowInSearchOfTrainersAiring(void); - -void UpdateTVScreensOnMap(int width, int height) -{ - FlagSet(FLAG_SYS_TV_WATCH); - switch (CheckForBigMovieOrEmergencyNewsOnTV()) - { - case 1: - SetTVMetatilesOnMap(width, height, 0x3); - break; - case 2: - break; - default: - if (gSaveBlock1.location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F) - && gSaveBlock1.location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F)) - { - SetTVMetatilesOnMap(width, height, 0x3); - } - else if (FlagGet(FLAG_SYS_TV_START) && (sub_80BD8B8() != 0xff || FindAnyTVNewsOnTheAir() != 0xff || IsTVShowInSearchOfTrainersAiring())) - { - FlagClear(FLAG_SYS_TV_WATCH); - SetTVMetatilesOnMap(width, height, 0x3); - } - break; - } -} - -void SetTVMetatilesOnMap(int width, int height, u16 tileId) -{ - int x; - int y; - - for (y=0; ycommon.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1.outbreakPokemonSpecies) - return FindNonMassOutbreakActiveTVShow(); - return gSpecialVar_0x8004; -} - -void ResetGabbyAndTy(void) -{ - gSaveBlock1.gabbyAndTyData.mon1 = 0; - gSaveBlock1.gabbyAndTyData.mon2 = 0; - gSaveBlock1.gabbyAndTyData.lastMove = 0; - gSaveBlock1.gabbyAndTyData.quote = 0xffff; - gSaveBlock1.gabbyAndTyData.valA_0 = 0; - gSaveBlock1.gabbyAndTyData.valA_1 = 0; - gSaveBlock1.gabbyAndTyData.valA_2 = 0; - gSaveBlock1.gabbyAndTyData.valA_3 = 0; - gSaveBlock1.gabbyAndTyData.valA_4 = 0; - gSaveBlock1.gabbyAndTyData.valA_5 = 0; - gSaveBlock1.gabbyAndTyData.valB_0 = 0; - gSaveBlock1.gabbyAndTyData.valB_1 = 0; - gSaveBlock1.gabbyAndTyData.valB_2 = 0; - gSaveBlock1.gabbyAndTyData.valB_3 = 0; - gSaveBlock1.gabbyAndTyData.valB_4 = 0; - gSaveBlock1.gabbyAndTyData.valB_5 = 0; - gSaveBlock1.gabbyAndTyData.mapnum = 0; - gSaveBlock1.gabbyAndTyData.battleNum = 0; -} - -void TakeTVShowInSearchOfTrainersOffTheAir(void); - -void GabbyAndTyBeforeInterview(void) -{ - u8 i; - - gSaveBlock1.gabbyAndTyData.mon1 = gBattleResults.poke1Species; - gSaveBlock1.gabbyAndTyData.mon2 = gBattleResults.opponentSpecies; - gSaveBlock1.gabbyAndTyData.lastMove = gBattleResults.lastUsedMove; - if (gSaveBlock1.gabbyAndTyData.battleNum != 0xff) - gSaveBlock1.gabbyAndTyData.battleNum ++; - gSaveBlock1.gabbyAndTyData.valA_0 = gBattleResults.unk5_0; - - if (gBattleResults.playerFaintCounter) - gSaveBlock1.gabbyAndTyData.valA_1 = 1; - else - gSaveBlock1.gabbyAndTyData.valA_1 = 0; - - if (gBattleResults.unk3) - gSaveBlock1.gabbyAndTyData.valA_2 = 1; - else - gSaveBlock1.gabbyAndTyData.valA_2 = 0; - - if (!gBattleResults.unk5_1) - { - for (i=0; i<11; i++) - { - if (gBattleResults.unk36[i] != 0) - { - gSaveBlock1.gabbyAndTyData.valA_3 = 1; - break; - } - } - } - else - { - gSaveBlock1.gabbyAndTyData.valA_3 = 1; - } - - TakeTVShowInSearchOfTrainersOffTheAir(); - if (gSaveBlock1.gabbyAndTyData.lastMove == 0) - FlagSet(FLAG_TEMP_1); -} - -void GabbyAndTyAfterInterview(void) -{ - gSaveBlock1.gabbyAndTyData.valB_0 = gSaveBlock1.gabbyAndTyData.valA_0; - gSaveBlock1.gabbyAndTyData.valB_1 = gSaveBlock1.gabbyAndTyData.valA_1; - gSaveBlock1.gabbyAndTyData.valB_2 = gSaveBlock1.gabbyAndTyData.valA_2; - gSaveBlock1.gabbyAndTyData.valB_3 = gSaveBlock1.gabbyAndTyData.valA_3; - gSaveBlock1.gabbyAndTyData.valA_4 = 1; - gSaveBlock1.gabbyAndTyData.mapnum = gMapHeader.regionMapSectionId; - IncrementGameStat(GAME_STAT_GOT_INTERVIEWED); -} - -void TakeTVShowInSearchOfTrainersOffTheAir(void) -{ - gSaveBlock1.gabbyAndTyData.valA_4 = 0; -} - -u8 GabbyAndTyGetBattleNum(void) -{ - if (gSaveBlock1.gabbyAndTyData.battleNum >= 6) - return (gSaveBlock1.gabbyAndTyData.battleNum % 3) + 6; - else - return gSaveBlock1.gabbyAndTyData.battleNum; -} - -bool8 IsTVShowInSearchOfTrainersAiring(void) -{ - return gSaveBlock1.gabbyAndTyData.valA_4; -} - -bool8 GabbyAndTyGetLastQuote(void) -{ - if (gSaveBlock1.gabbyAndTyData.quote == 0xffff) - return FALSE; - - EasyChat_GetWordText(gStringVar1, gSaveBlock1.gabbyAndTyData.quote); - gSaveBlock1.gabbyAndTyData.quote |= 0xffff; - return TRUE; -} - -u8 GabbyAndTyGetLastBattleTrivia(void) -{ - if (!gSaveBlock1.gabbyAndTyData.valB_0) - return 1; - if (gSaveBlock1.gabbyAndTyData.valB_3) - return 2; - if (gSaveBlock1.gabbyAndTyData.valB_2) - return 3; - if (gSaveBlock1.gabbyAndTyData.valB_1) - return 4; - return 0; -} - -void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void) -{ - switch (GabbyAndTyGetBattleNum()) - { - case 1: - gSpecialVar_0x8004 = 0xE; - gSpecialVar_0x8005 = 0xD; - break; - case 2: - gSpecialVar_0x8004 = 0x5; - gSpecialVar_0x8005 = 0x6; - break; - case 3: - gSpecialVar_0x8004 = 0x12; - gSpecialVar_0x8005 = 0x11; - break; - case 4: - gSpecialVar_0x8004 = 0x15; - gSpecialVar_0x8005 = 0x16; - break; - case 5: - gSpecialVar_0x8004 = 0x8; - gSpecialVar_0x8005 = 0x9; - break; - case 6: - gSpecialVar_0x8004 = 0x13; - gSpecialVar_0x8005 = 0x14; - break; - case 7: - gSpecialVar_0x8004 = 0x17; - gSpecialVar_0x8005 = 0x18; - break; - case 8: - gSpecialVar_0x8004 = 0xA; - gSpecialVar_0x8005 = 0xB; - break; - } -} - -void InterviewAfter(void) -{ - switch (gSpecialVar_0x8005) - { - case TVSHOW_FAN_CLUB_LETTER: - InterviewAfter_FanClubLetter(); - break; - case TVSHOW_RECENT_HAPPENINGS: - InterviewAfter_RecentHappenings(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - InterviewAfter_PkmnFanClubOpinions(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - InterviewAfter_DummyShow4(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - InterviewAfter_BravoTrainerPokemonProfile(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - InterviewAfter_BravoTrainerBattleTowerProfile(); - break; - } -} - -u8 sub_80BDEAC(u8 *a0) -{ - u8 lang = GAME_LANGUAGE; - - if (a0[0] == EXT_CTRL_CODE_BEGIN && a0[1] == 0x15) - lang = LANGUAGE_JAPANESE; - return lang; -} - -void PutPokemonTodayCaughtOnAir(void) -{ - u8 i; - u16 total; - u16 item; - - total = 0; - sub_80BEB20(); - sub_80BE778(); - - if (gBattleResults.caughtPoke == 0) - { - sub_80BE074(); - } - else - { - sub_80BE028(); - if (sub_80BF77C(0xffff) == 0 && StringCompareWithoutExtCtrlCodes(gSpeciesNames[gBattleResults.caughtPoke], gBattleResults.caughtNick) != 0) - { - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_CAUGHT) != 1) - { - for (i = 0; i < 11; i++) - total += gBattleResults.unk36[i]; - if (total != 0 || gBattleResults.unk5_1 != 0) - { - struct TVShowPokemonToday *pokemonToday; - - total = 0; - pokemonToday = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonToday; - pokemonToday->kind = TVSHOW_POKEMON_TODAY_CAUGHT; - pokemonToday->active = total; - if (gBattleResults.unk5_1 != 0) - { - total = 1; - item = ITEM_MASTER_BALL; - } - else - { - for (i = 0; i < 11; i++) - total += gBattleResults.unk36[i]; - if (total > 0xff) - total = 0xff; - item = gLastUsedItem; - } - pokemonToday->var12 = total; - pokemonToday->ball = item; - StringCopy(pokemonToday->playerName, gSaveBlock2.playerName); - StringCopy(pokemonToday->nickname, gBattleResults.caughtNick); - pokemonToday->species = gBattleResults.caughtPoke; - sub_80BE138((TVShow *)pokemonToday); - pokemonToday->language = GAME_LANGUAGE; - pokemonToday->language2 = sub_80BDEAC(pokemonToday->nickname); - Text_StripExtCtrlCodes(pokemonToday->nickname); - } - } - } - } -} - -void sub_80BE028(void) -{ - struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters; - - if (worldOfMasters->kind != TVSHOW_WORLD_OF_MASTERS) - { - sub_80BF55C(gSaveBlock1.tvShows, 24); - worldOfMasters->var06 = GetGameStat(GAME_STAT_STEPS); - worldOfMasters->kind = TVSHOW_WORLD_OF_MASTERS; - } - worldOfMasters->var02++; - worldOfMasters->var04 = gBattleResults.caughtPoke; - worldOfMasters->var08 = gBattleResults.poke1Species; - worldOfMasters->var0a = gMapHeader.regionMapSectionId; -} - -void sub_80BE074(void) -{ - u8 i; - u16 total; - u8 zero = 0; - - if (sub_80BF77C(0xffff) == 0) - { - for (i = 0, total = 0; i < ARRAY_COUNT(gUnknown_03004316); i++) - total += gUnknown_03004316[i]; - if (total > 0xff) - total = 0xff; - if (total > 2 && gBattleOutcome == 1) - { - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_FAILED) != 1) - { - struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonTodayFailed; - - zero = 0; - pokemonTodayFailed->kind = TVSHOW_POKEMON_TODAY_FAILED; - pokemonTodayFailed->active = zero; - pokemonTodayFailed->species = gBattleResults.poke1Species; - pokemonTodayFailed->species2 = gBattleResults.lastOpponentSpecies; - pokemonTodayFailed->var10 = total; - pokemonTodayFailed->var11 = gBattleOutcome; - pokemonTodayFailed->var12 = gMapHeader.regionMapSectionId; - StringCopy(pokemonTodayFailed->playerName, gSaveBlock2.playerName); - sub_80BE138((TVShow *)pokemonTodayFailed); - pokemonTodayFailed->language = GAME_LANGUAGE; - } - } - } -} - - -void sub_80BE138(TVShow *show) -{ - u32 playerId = GetPlayerTrainerId(); - - show->common.srcTrainerId2Lo = playerId & 0xFF; - show->common.srcTrainerId2Hi = playerId >> 8; - show->common.srcTrainerIdLo = playerId & 0xFF; - show->common.srcTrainerIdHi = playerId >> 8; - show->common.trainerIdLo = playerId & 0xFF; - show->common.trainerIdHi = playerId >> 8; -} - -void sub_80BE160(TVShow *show) -{ - u32 playerId = GetPlayerTrainerId(); - - show->common.srcTrainerIdLo = playerId & 0xFF; - show->common.srcTrainerIdHi = playerId >> 8; - show->common.trainerIdLo = playerId & 0xFF; - show->common.trainerIdHi = playerId >> 8; -} - -void InterviewAfter_BravoTrainerPokemonProfile(void) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainerSrc = &gSaveBlock1.tvShows[24].bravoTrainer; - - if (bravoTrainerSrc->kind == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE) - { - struct TVShowBravoTrainerPokemonProfiles *bravoTrainerNew = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer; - - bravoTrainerNew->kind = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; - bravoTrainerNew->active = 1; - bravoTrainerNew->species = bravoTrainerSrc->species; - StringCopy(bravoTrainerNew->playerName, gSaveBlock2.playerName); - StringCopy(bravoTrainerNew->pokemonNickname, bravoTrainerSrc->pokemonNickname); - bravoTrainerNew->contestCategory = bravoTrainerSrc->contestCategory; - bravoTrainerNew->contestRank = bravoTrainerSrc->contestRank; - bravoTrainerNew->var14 = bravoTrainerSrc->var14; - bravoTrainerNew->contestResult = bravoTrainerSrc->contestResult; - bravoTrainerNew->contestCategory = bravoTrainerSrc->contestCategory; - sub_80BE160((TVShow *)bravoTrainerNew); - bravoTrainerNew->language = GAME_LANGUAGE; - bravoTrainerNew->var1f = sub_80BDEAC(bravoTrainerNew->pokemonNickname); - Text_StripExtCtrlCodes(bravoTrainerNew->pokemonNickname); - } -} - -void sub_80BE23C(u16 a0) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer; - - InterviewBefore_BravoTrainerPkmnProfile(); - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1) - { - sub_80BF55C(gSaveBlock1.tvShows, 24); - bravoTrainer->var14 = a0; - bravoTrainer->kind = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; - } -} - -void sub_80BE284(u8 a0) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer; - - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1) - { - bravoTrainer->contestResult = a0; - bravoTrainer->contestCategory = gSpecialVar_ContestCategory; - bravoTrainer->contestRank = gSpecialVar_ContestRank; - bravoTrainer->species = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_SPECIES, NULL); - GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_NICKNAME, bravoTrainer->pokemonNickname); - } -} - -void InterviewAfter_BravoTrainerBattleTowerProfile(void) -{ - struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower; - - bravoTrainerTower->kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; - bravoTrainerTower->active = 1; - StringCopy(bravoTrainerTower->trainerName, gSaveBlock2.playerName); - StringCopy(bravoTrainerTower->pokemonName, gSaveBlock2.battleTower.defeatedByTrainerName); - bravoTrainerTower->species = gSaveBlock2.battleTower.firstMonSpecies; - bravoTrainerTower->defeatedSpecies = gSaveBlock2.battleTower.defeatedBySpecies; - bravoTrainerTower->var16 = GetCurrentBattleTowerWinStreak(gSaveBlock2.battleTower.lastStreakLevelType); - bravoTrainerTower->var1c = gSaveBlock2.battleTower.battleOutcome; - if (gSaveBlock2.battleTower.lastStreakLevelType == 0) - bravoTrainerTower->btLevel = 50; - else - bravoTrainerTower->btLevel = 100; - bravoTrainerTower->var1b = gSpecialVar_0x8004; - sub_80BE160((TVShow *)bravoTrainerTower); - bravoTrainerTower->language = GAME_LANGUAGE; -} - -void sub_80BE3BC(void) -{ - u8 rval; - u8 i; - - rval = sub_80BF77C(0x5555); - if (rval == 0) - { - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1) - { - sub_80BF20C(); - if (gMartPurchaseHistory[0].item_amount >= 20) - { - struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].smartshopperShow; - - smartShopper->kind = TVSHOW_SMART_SHOPPER; - smartShopper->active = rval; - smartShopper->shopLocation = gMapHeader.regionMapSectionId; - for (i=0; i<3; i++) - { - smartShopper->itemIds[i] = gMartPurchaseHistory[i].item_id; - smartShopper->itemAmounts[i] = gMartPurchaseHistory[i].item_amount; - } - smartShopper->priceReduced = GetPriceReduction(1); - StringCopy(smartShopper->playerName, gSaveBlock2.playerName); - sub_80BE138((TVShow *)smartShopper); - smartShopper->language = GAME_LANGUAGE; - } - } - } -} - -void sub_80BE478(void) -{ - InterviewBefore_NameRater(); - if (gSpecialVar_Result == 1) - return; - - GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1); - if (StringLength(gSaveBlock2.playerName) > 1 && StringLength(gStringVar1) > 1) - { - struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].nameRaterShow; - - nameRaterShow->kind = TVSHOW_NAME_RATER_SHOW; - nameRaterShow->active = 1; - nameRaterShow->species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL); - nameRaterShow->random = Random() % 3; - nameRaterShow->random2 = Random() % 2; - nameRaterShow->var1C = sub_80BF674(nameRaterShow->species); - StringCopy(nameRaterShow->trainerName, gSaveBlock2.playerName); - GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, nameRaterShow->pokemonName); - sub_80BE160((TVShow *)nameRaterShow); - nameRaterShow->language = GAME_LANGUAGE; - nameRaterShow->pokemonNameLanguage = sub_80BDEAC(nameRaterShow->pokemonName); - Text_StripExtCtrlCodes(nameRaterShow->pokemonName); - } -} - -void StartMassOutbreak(void) -{ - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[gSpecialVar_0x8004].massOutbreak; - - gSaveBlock1.outbreakPokemonSpecies = massOutbreak->species; - gSaveBlock1.outbreakLocationMapNum = massOutbreak->locationMapNum; - gSaveBlock1.outbreakLocationMapGroup = massOutbreak->locationMapGroup; - gSaveBlock1.outbreakPokemonLevel = massOutbreak->level; - gSaveBlock1.outbreakUnk1 = massOutbreak->var02; - gSaveBlock1.outbreakUnk2 = massOutbreak->var0E; - gSaveBlock1.outbreakPokemonMoves[0] = massOutbreak->moves[0]; - gSaveBlock1.outbreakPokemonMoves[1] = massOutbreak->moves[1]; - gSaveBlock1.outbreakPokemonMoves[2] = massOutbreak->moves[2]; - gSaveBlock1.outbreakPokemonMoves[3] = massOutbreak->moves[3]; - gSaveBlock1.outbreakUnk4 = massOutbreak->var03; - gSaveBlock1.outbreakPokemonProbability = massOutbreak->probability; - gSaveBlock1.outbreakUnk5 = 2; -} - -void InterviewAfter_FanClubLetter(void) -{ - struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter; - - fanclubLetter->kind = TVSHOW_FAN_CLUB_LETTER; - fanclubLetter->active = 1; - StringCopy(fanclubLetter->playerName, gSaveBlock2.playerName); - fanclubLetter->species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); - sub_80BE160((TVShow *)fanclubLetter); - fanclubLetter->language = GAME_LANGUAGE; -} - -void InterviewAfter_RecentHappenings(void) -{ - struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings; - - recentHappenings->kind = TVSHOW_RECENT_HAPPENINGS; - recentHappenings->active = 1; - StringCopy(recentHappenings->playerName, gSaveBlock2.playerName); - recentHappenings->var02 = 0; - sub_80BE160((TVShow *)recentHappenings); - recentHappenings->language = GAME_LANGUAGE; -} - -void InterviewAfter_PkmnFanClubOpinions(void) -{ - u8 monIndex; - struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions; - - fanclubOpinions->kind = TVSHOW_PKMN_FAN_CLUB_OPINIONS; - fanclubOpinions->active = 1; - monIndex = GetLeadMonIndex(); - fanclubOpinions->var04A = GetMonData(&gPlayerParty[monIndex], MON_DATA_FRIENDSHIP, NULL) / 16; - fanclubOpinions->var04B = gSpecialVar_0x8007; - StringCopy(fanclubOpinions->playerName, gSaveBlock2.playerName); - GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, fanclubOpinions->var10); - fanclubOpinions->var02 = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); - sub_80BE160((TVShow *)fanclubOpinions); - fanclubOpinions->language = GAME_LANGUAGE; - fanclubOpinions->var0E = sub_80BDEAC(fanclubOpinions->var10); - Text_StripExtCtrlCodes(fanclubOpinions->var10); -} - -void InterviewAfter_DummyShow4(void) -{ -} - -void sub_80BE778(void) -{ - if (FlagGet(FLAG_SYS_GAME_CLEAR)) - { - u8 i; - - for (i = 0; i < 24; i++) - { - if (gSaveBlock1.tvShows[i].massOutbreak.kind == TVSHOW_MASS_OUTBREAK) - return; - } - if (sub_80BF77C(0x147)) - return; - - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1) - { - u16 rand = Random(); - u16 val = rand % 5; - s32 val2 = gUnknown_03005D38.var0; - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[val2].massOutbreak; - - massOutbreak->kind = TVSHOW_MASS_OUTBREAK; - massOutbreak->active = 1; - massOutbreak->level = gPokeOutbreakSpeciesList[val].level; - massOutbreak->var02 = 0; - massOutbreak->var03 = 0; - massOutbreak->species = gPokeOutbreakSpeciesList[val].species; - massOutbreak->var0E = 0; - massOutbreak->moves[0] = gPokeOutbreakSpeciesList[val].moves[0]; - massOutbreak->moves[1] = gPokeOutbreakSpeciesList[val].moves[1]; - massOutbreak->moves[2] = gPokeOutbreakSpeciesList[val].moves[2]; - massOutbreak->moves[3] = gPokeOutbreakSpeciesList[val].moves[3]; - massOutbreak->locationMapNum = gPokeOutbreakSpeciesList[val].location; - massOutbreak->locationMapGroup = 0; - massOutbreak->var12 = 0; - massOutbreak->probability = 0x32; - massOutbreak->var15 = 0; - massOutbreak->daysLeft = 0x01; - sub_80BE160((TVShow *)massOutbreak); - massOutbreak->language = GAME_LANGUAGE; - } - } -} - -void EndMassOutbreak(void) -{ - gSaveBlock1.outbreakPokemonSpecies = 0; - gSaveBlock1.outbreakLocationMapNum = 0; - gSaveBlock1.outbreakLocationMapGroup = 0; - gSaveBlock1.outbreakPokemonLevel = 0; - gSaveBlock1.outbreakUnk1 = 0; - gSaveBlock1.outbreakUnk2 = 0; - gSaveBlock1.outbreakPokemonMoves[0] = 0; - gSaveBlock1.outbreakPokemonMoves[1] = 0; - gSaveBlock1.outbreakPokemonMoves[2] = 0; - gSaveBlock1.outbreakPokemonMoves[3] = 0; - gSaveBlock1.outbreakUnk4 = 0; - gSaveBlock1.outbreakPokemonProbability = 0; - gSaveBlock1.outbreakUnk5 = 0; -} - -void UpdateTVShowsPerDay(u16 arg0) -{ - sub_80BE8EC(arg0); - UpdateMassOutbreakTimeLeft(arg0); - sub_80BEE84(arg0); - sub_80BEA5C(arg0); -} - -void sub_80BE8EC(u16 arg0) -{ - u8 showidx; - - if (gSaveBlock1.outbreakPokemonSpecies == 0) - { - for (showidx=0; showidx<24; showidx++) - { - if (gSaveBlock1.tvShows[showidx].massOutbreak.kind == TVSHOW_MASS_OUTBREAK - && gSaveBlock1.tvShows[showidx].massOutbreak.active == 0x01) - { - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[showidx].massOutbreak; - - if (massOutbreak->daysLeft < arg0) - massOutbreak->daysLeft = 0; - else - massOutbreak->daysLeft -= arg0; - break; - } - } - } -} - -void UpdateMassOutbreakTimeLeft(u16 arg0) -{ - if (gSaveBlock1.outbreakUnk5 <= arg0) - EndMassOutbreak(); - else - gSaveBlock1.outbreakUnk5 -= arg0; -} - -void sub_80BE97C(bool8 flag) -{ - u8 var0, var1; - - if (flag) - { - var0 = gUnknown_020387E2 >> 8; - if (var0 > 4) - sub_80BE9D4(); - gUnknown_020387E2 &= 0xFF; - var1 = gUnknown_020387E2 & 0xFF; - if (var1 != 0xFF) - gUnknown_020387E2++; - } - else - { - var0 = gUnknown_020387E2 & 0xFF; - if (var0 > 4) - sub_80BE9D4(); - gUnknown_020387E2 &= 0xFF00; - var1 = gUnknown_020387E2 >> 8; - if (var1 != 0xFF) - gUnknown_020387E2 += 0x100; - } -} - -void sub_80BE9D4(void) -{ - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_FISHING_ADVICE) != 1) - { - struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonAngler; - register u8 zero asm("r1") = 0; - - asm(""::"r"(zero)); - pokemonAngler->kind = TVSHOW_FISHING_ADVICE; - pokemonAngler->active = zero; - pokemonAngler->var02 = gUnknown_020387E2 & 0xFF; - pokemonAngler->var03 = gUnknown_020387E2 >> 8; - pokemonAngler->var04 = gUnknown_020387E0; - StringCopy(pokemonAngler->playerName, gSaveBlock2.playerName); - sub_80BE138((TVShow *)pokemonAngler); - pokemonAngler->language = GAME_LANGUAGE; - } -} - -void sub_80BEA50(u16 var) -{ - gUnknown_020387E0 = var; -} - -void sub_80BEA88(void); - -void sub_80BEA5C(u16 arg0) -{ - struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters; - - if (worldOfMasters->kind == TVSHOW_WORLD_OF_MASTERS) - { - if (worldOfMasters->var02 < 20) - sub_80BF55C(gSaveBlock1.tvShows, 0x18); - else - sub_80BEA88(); - } -} -void sub_80BEA88(void) -{ - struct TVShowWorldOfMasters *worldOfMastersSrc = &gSaveBlock1.tvShows[24].worldOfMasters; - - if (sub_80BF77C(0xFFFF) == 0) - { - gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); - if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_WORLD_OF_MASTERS) != 1) - { - struct TVShowWorldOfMasters *worldOfMastersDst = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].worldOfMasters; - - worldOfMastersDst->kind = TVSHOW_WORLD_OF_MASTERS; - worldOfMastersDst->active = 0; - worldOfMastersDst->var02 = worldOfMastersSrc->var02; - worldOfMastersDst->var06 = GetGameStat(GAME_STAT_STEPS) - worldOfMastersSrc->var06; - worldOfMastersDst->var04 = worldOfMastersSrc->var04; - worldOfMastersDst->var08 = worldOfMastersSrc->var08; - worldOfMastersDst->var0a = worldOfMastersSrc->var0a; - StringCopy(worldOfMastersDst->playerName, gSaveBlock2.playerName); - sub_80BE138((TVShow *)worldOfMastersDst); - worldOfMastersDst->language = GAME_LANGUAGE; - } - } -} - -void sub_80BEB20(void) -{ - u16 rval; - - if (FlagGet(FLAG_SYS_GAME_CLEAR) != 0) - { - gUnknown_03005D38.var0 = sub_80BEBC8(gSaveBlock1.pokeNews); - if (gUnknown_03005D38.var0 != -1 && sub_80BF77C(0x28f) != 1) - { - rval = (Random() % 3) + 1; - if (sub_80BEE48(rval) != 1) - { - gSaveBlock1.pokeNews[gUnknown_03005D38.var0].kind = rval; - gSaveBlock1.pokeNews[gUnknown_03005D38.var0].days = 4; - gSaveBlock1.pokeNews[gUnknown_03005D38.var0].state = 1; - } - } - } -} - -int sub_80BEBC8(struct PokeNews *pokeNews) -{ - s8 i; - - for (i = 0; i < 16; i++) - { - if (pokeNews[i].kind == 0) - return i; - } - return -1; -} - -void sub_80BEBF4(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - sub_80BEC10(i); -} - -void sub_80BEC10(u8 arg0) -{ - gSaveBlock1.pokeNews[arg0].kind = 0; - gSaveBlock1.pokeNews[arg0].state = 0; - gSaveBlock1.pokeNews[arg0].days = 0; -} - -void sub_80BEC40(void) -{ - u8 i, j; - - for (i = 0; i < 15; i++) - { - if (gSaveBlock1.pokeNews[i].kind == 0) - { - for (j = i + 1; j < 16; j++) - { - if (gSaveBlock1.pokeNews[j].kind != 0) - { - gSaveBlock1.pokeNews[i] = gSaveBlock1.pokeNews[j]; - sub_80BEC10(j); - break; - } - } - } - } -} - -u8 FindAnyTVNewsOnTheAir(void) -{ - u8 i; - for (i = 0; i < 16; i++) - { - if (gSaveBlock1.pokeNews[i].kind != 0 - && gSaveBlock1.pokeNews[i].state == 1 - && gSaveBlock1.pokeNews[i].days < 3) - return i; - } - return 0xFF; -} - -void DoPokeNews(void) -{ - u8 i; - i = FindAnyTVNewsOnTheAir(); - if (i == 0xff) - { - gSpecialVar_Result = 0; - return; - } - if (gSaveBlock1.pokeNews[i].days == 0) - { - gSaveBlock1.pokeNews[i].state = 2; - if (gLocalTime.hours < 20) - ShowFieldMessage(gTVNewsTextGroup2[gSaveBlock1.pokeNews[i].kind]); - else - ShowFieldMessage(gTVNewsTextGroup3[gSaveBlock1.pokeNews[i].kind]); - } - else - { - u16 value = gSaveBlock1.pokeNews[i].days; - - ConvertIntToDecimalStringN(gStringVar1, value, 0, 1); - gSaveBlock1.pokeNews[i].state = 0; - ShowFieldMessage(gTVNewsTextGroup1[gSaveBlock1.pokeNews[i].kind]); - } - gSpecialVar_Result = 1; -} - -bool8 GetPriceReduction(u8 arg0) -{ - u8 i; - - if (arg0 == 0) - return FALSE; - for (i=0; i<16; i++) - { - if (gSaveBlock1.pokeNews[i].kind == arg0) - { - if (gSaveBlock1.pokeNews[i].state == 2 && IsPriceDiscounted(arg0) != 0) - return TRUE; - else - return FALSE; - } - } - return FALSE; -} - -bool8 IsPriceDiscounted(u8 arg0) -{ - switch (arg0) - { - case 1: - if (gSaveBlock1.location.mapGroup == MAP_GROUP(SLATEPORT_CITY) - && gSaveBlock1.location.mapNum == MAP_NUM(SLATEPORT_CITY) - && gSpecialVar_LastTalked == 0x1a) - return TRUE; - else - return FALSE; - break; - case 3: - if (gSaveBlock1.location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) - && gSaveBlock1.location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)) - return TRUE; - else - return FALSE; - break; - default: - return TRUE; - } -} - -bool8 sub_80BEE48(u8 arg0) -{ - u8 i; - - if (arg0 == 0) - return TRUE; - for (i=0; i<16; i++) - { - if (gSaveBlock1.pokeNews[i].kind == arg0) - return TRUE; - } - return FALSE; -} - -void sub_80BEE84(u16 var0) -{ - u8 i; - - for (i=0; i<16; i++) - { - if (gSaveBlock1.pokeNews[i].kind) - { - if (gSaveBlock1.pokeNews[i].days < var0) - { - sub_80BEC10(i); - } - else - { - if (!gSaveBlock1.pokeNews[i].state && FlagGet(FLAG_SYS_GAME_CLEAR) == 1) - gSaveBlock1.pokeNews[i].state = 1; - gSaveBlock1.pokeNews[i].days -= var0; - } - } - } - sub_80BEC40(); -} - -void sub_80BEF10(u8 strvaridx, u8 rank) -{ - switch (rank) - { - case NORMAL_RANK: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[NORMAL_RANK + 5]); - break; - case SUPER_RANK: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[SUPER_RANK + 5]); - break; - case HYPER_RANK: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[HYPER_RANK + 5]); - break; - case MASTER_RANK: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[MASTER_RANK + 5]); - break; - } -} - -void CopyContestCategoryToStringVar(u8 strvaridx, u8 category) -{ - switch (category) - { - case CONTEST_COOL: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_COOL]); - break; - case CONTEST_BEAUTY: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_BEAUTY]); - break; - case CONTEST_CUTE: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_CUTE]); - break; - case CONTEST_SMART: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_SMART]); - break; - case CONTEST_TOUGH: - StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_TOUGH]); - break; - } -} - -void SetContestCategoryStringVarForInterview(void) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer; - - CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); -} - -void sub_80BF088(u8 arg0, s32 price) -{ - size_t log10val = sub_80BF0B8(price); - - ConvertIntToDecimalStringN(gUnknown_083D1464[arg0], price, 0, log10val); -} - -size_t sub_80BF0B8(int value) -{ - if (value / 10 == 0) - return 1; - else if (value / 100 == 0) - return 2; - else if (value / 1000 == 0) - return 3; - else if (value / 10000 == 0) - return 4; - else if (value / 100000 == 0) - return 5; - else if (value / 1000000 == 0) - return 6; - else if (value / 10000000 == 0) - return 7; - else if (value / 100000000 == 0) - return 8; - else - return 1; -} - -void sub_80BF154(u8 arg0, struct TVShowSmartShopper *arg1) -{ - u8 i; - s32 price; - price = 0; - - for (i = 0; i < 3; i++) - { - if (arg1->itemIds[i]) - price += ItemId_GetPrice(arg1->itemIds[i]) * arg1->itemAmounts[i]; - } - if (arg1->priceReduced == 1) - sub_80BF088(arg0, price >> 1); - else - sub_80BF088(arg0, price); -} - -bool8 sub_80BF1B4(u8 showIdx) -{ - u8 i; - //TVShow *tvShows; - TVShow *tvShows = gSaveBlock1.tvShows; - u32 trainerId = GetPlayerTrainerId(); - - for (i = 5; i < 24; i++) - { - if (tvShows[i].common.kind == showIdx) - { - if ((trainerId & 0xFF) == tvShows[i].common.trainerIdLo && ((trainerId >> 8) & 0xFF) == tvShows[i].common.trainerIdHi) - return TRUE; - } - } - return FALSE; -} - -void sub_80BF20C(void) -{ - u8 i, j; - u16 tmpId, tmpAmount; - - for (i = 0; i < 2; i++) - { - for (j = i + 1; j < 3; j++) - { - if (gMartPurchaseHistory[i].item_amount < gMartPurchaseHistory[j].item_amount) - { - tmpId = gMartPurchaseHistory[i].item_id; - tmpAmount = gMartPurchaseHistory[i].item_amount; - gMartPurchaseHistory[i].item_id = gMartPurchaseHistory[j].item_id; - gMartPurchaseHistory[i].item_amount = gMartPurchaseHistory[j].item_amount; - gMartPurchaseHistory[j].item_id = tmpId; - gMartPurchaseHistory[j].item_amount = tmpAmount; - } - } - } -} - -void sub_80BF25C(u8 showType) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (gSaveBlock1.tvShows[i].common.kind == showType) - { - if(gSaveBlock1.tvShows[i].common.active == 1) - { - gSpecialVar_Result = 1; - } - else - { - sub_80BF55C(gSaveBlock1.tvShows, i); - sub_80BF588(gSaveBlock1.tvShows); - sub_80BF6D8(); - } - return; - } - } - sub_80BF6D8(); -} - -void InterviewBefore(void) -{ - gSpecialVar_Result = FALSE; - switch (gSpecialVar_0x8005) - { - case TVSHOW_FAN_CLUB_LETTER: - InterviewBefore_FanClubLetter(); - break; - case TVSHOW_RECENT_HAPPENINGS: - InterviewBefore_RecentHappenings(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - InterviewBefore_PkmnFanClubOpinions(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - InterviewBefore_Dummy(); - break; - case TVSHOW_NAME_RATER_SHOW: - InterviewBefore_NameRater(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - InterviewBefore_BravoTrainerPkmnProfile(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - InterviewBefore_BravoTrainerBTProfile(); - break; - } -} - -void InterviewBefore_FanClubLetter(void) -{ - struct TVShowFanClubLetter *fanclubLetter; - - sub_80BF25C(TVSHOW_FAN_CLUB_LETTER); - if (gSpecialVar_Result == 0) - { - StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); - fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter; - sub_80EB6FC(fanclubLetter->pad04, 6); - } -} - -void InterviewBefore_RecentHappenings(void) -{ - struct TVShowRecentHappenings *recentHappenings; - - sub_80BF25C(TVSHOW_RECENT_HAPPENINGS); - if (gSpecialVar_Result == 0) - { - recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings; - sub_80EB6FC(recentHappenings->var04, 6); - } -} - -void InterviewBefore_PkmnFanClubOpinions(void) -{ - struct TVShowFanclubOpinions *fanclubOpinions; - - sub_80BF25C(TVSHOW_PKMN_FAN_CLUB_OPINIONS); - if (gSpecialVar_Result == 0) - { - StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); - GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2); - StringGetEnd10(gStringVar2); - fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions; - sub_80EB6FC(fanclubOpinions->var1C, 2); - } -} - -void InterviewBefore_Dummy(void) -{ - gSpecialVar_Result = 1; -} - -void InterviewBefore_NameRater(void) -{ - sub_80BF25C(TVSHOW_NAME_RATER_SHOW); -} - -void InterviewBefore_BravoTrainerPkmnProfile(void) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer; - - sub_80BF25C(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE); - if (gSpecialVar_Result == 0) - { - bravoTrainer = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer; - sub_80EB6FC(bravoTrainer->var04, 2); - } -} - -void InterviewBefore_BravoTrainerBTProfile(void) -{ - struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower; - - sub_80BF25C(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE); - if (gSpecialVar_Result == 0) - { - bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower; - sub_80EB6FC(bravoTrainerTower->var18, 1); // wrong struct ident, fix later - } -} - -#if ENGLISH -u8 NicknameDiffersFromSpeciesName(u8 monIndex) -{ - u32 species; - - GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, &gStringVar1); - species = GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES, NULL); - if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == 0) - return FALSE; - - return TRUE; -} -#elif GERMAN -u8 NicknameDiffersFromSpeciesName(u8 monIndex) -{ - u8 langData[4]; - u32 species; - u8 *tmp; - - GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, &gStringVar1); - - tmp = langData; - tmp[0] = GetMonData(&gPlayerParty[monIndex], MON_DATA_LANGUAGE, &langData); - if (tmp[0] != GAME_LANGUAGE) - return TRUE; - - species = GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES, NULL); - if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1)) - return TRUE; - - return FALSE; -} -#endif - -u8 LeadMonNicknamed(void) -{ - return NicknameDiffersFromSpeciesName(GetLeadMonIndex()); -} - -void sub_80BF55C(TVShow tvShow[], u8 showidx) -{ - u8 idx; - - tvShow[showidx].common.kind = 0; - tvShow[showidx].common.active = 0; - for (idx = 0; idx < 34; idx++) - tvShow[showidx].common.pad02[idx] = 0; -} - -void sub_80BF588(TVShow tvShow[]) -{ - u8 showidx; - u8 showidx2; - - for (showidx = 0; showidx < 4; showidx++) - { - if (tvShow[showidx].common.kind == 0) - { - for (showidx2 = showidx + 1; showidx2 < 5; showidx2++) - { - if (tvShow[showidx2].common.kind != 0) - { - tvShow[showidx] = tvShow[showidx2]; - sub_80BF55C(tvShow, showidx2); - break; - } - } - } - } - for (showidx = 5; showidx < 24; showidx++) - { - if (tvShow[showidx].common.kind == 0) - { - for (showidx2 = showidx + 1; showidx2 < 24; showidx2++) - { - if (tvShow[showidx2].common.kind != 0) - { - tvShow[showidx] = tvShow[showidx2]; - sub_80BF55C(gSaveBlock1.tvShows, showidx2); - break; - } - } - } - } -} - -u16 sub_80BF638(u8 arg0, u16 arg1) -{ - u16 retval = sub_80BF674(arg1); - - StringCopy(gUnknown_083D1464[arg0], gSpeciesNames[retval]); - return retval; -} - -u16 sub_80BF674(u16 species) -{ - u16 rspecies; - u16 cspecies; - - rspecies = (Random() % (NUM_SPECIES - 1)) + 1; - cspecies = rspecies; - while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) - { - if (cspecies == SPECIES_BULBASAUR) - cspecies = NUM_SPECIES - 1; - else - cspecies --; - if (cspecies == rspecies) - { - cspecies = species; - return cspecies; - } - } - return cspecies; -} - -void sub_80BF6D8(void) -{ - gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); - gSpecialVar_0x8006 = gUnknown_03005D38.var0; - if (gUnknown_03005D38.var0 == -1) - gSpecialVar_Result = 1; - else - gSpecialVar_Result = 0; -} - -s8 sub_80BF720(TVShow tvShow[]) -{ - u8 idx; - - for (idx = 0; idx < 5; idx++) - { - if (tvShow[idx].common.kind == 0) - return idx; - } - return -1; -} - -s8 sub_80BF74C(TVShow tvShow[]) -{ - s8 idx; - - for (idx = 5; idx < 24; idx++) - { - if (tvShow[idx].common.kind == 0) - return idx; - } - return -1; -} - -bool8 sub_80BF77C(u16 value) -{ - if (Random() <= value) - return FALSE; - return TRUE; -} - -void sub_80BF79C(TVShow *arg0) -{ - u8 i = Random() % 6; - - while (1) - { - if (i == 6) - i = 0; - if (arg0->recentHappenings.var04[i] != 0xFFFF) - break; - i++; - } - EasyChat_GetWordText(gStringVar3, arg0->recentHappenings.var04[i]); -} - -u8 sub_80BF7E8(struct TVShowNameRaterShow *arg0) -{ - u16 flagsum = 0; - u8 i = 0; - - if (arg0->pokemonName[0] != 0xFF) - { - while (i < 11 && arg0->pokemonName[i] != 0xFF) - { - flagsum += arg0->pokemonName[i]; - i++; - } - } - return flagsum & 0x7; -} - - -void sub_80BF820(u8 arg0, u8 arg1, u8 arg2, u16 arg3, u16 arg4, struct TVShowNameRaterShow *tvShow) -{ - u8 flags[3]; - u16 nameLength; - u8 i; - - for (i = 0; i < 3; i++) - flags[i] = EOS; - - if (arg3 == 0) - { - nameLength = StringLength(tvShow->trainerName); - if (arg2 == 0) - { - flags[0] = tvShow->trainerName[arg1]; - } - else if (arg2 == 1) - { - flags[0] = tvShow->trainerName[nameLength - arg1]; - } - else if (arg2 == 2) { - flags[0] = tvShow->trainerName[arg1]; - flags[1] = tvShow->trainerName[arg1 + 1]; - } - else - { - flags[0] = tvShow->trainerName[nameLength - (arg1 + 2)]; - flags[1] = tvShow->trainerName[nameLength - (arg1 + 1)]; - } - } - else if (arg3 == 1) - { - nameLength = StringLength(tvShow->pokemonName); - if (arg2 == 0) - { - flags[0] = tvShow->pokemonName[arg1]; - } - else if (arg2 == 1) - { - flags[0] = tvShow->pokemonName[nameLength - arg1]; - } - else if (arg2 == 2) - { - flags[0] = tvShow->pokemonName[arg1]; - flags[1] = tvShow->pokemonName[arg1 + 1]; - } - else - { - flags[0] = tvShow->pokemonName[nameLength - (arg1 + 2)]; - flags[1] = tvShow->pokemonName[nameLength - (arg1 + 1)]; - } - } - else - { - nameLength = StringLength(gSpeciesNames[arg4]); - if (arg2 == 0) - { - flags[0] = gSpeciesNames[arg4][arg1]; - } - else if (arg2 == 1) - { - flags[0] = gSpeciesNames[arg4][nameLength - arg1]; - } - else if (arg2 == 2) - { - flags[0] = gSpeciesNames[arg4][arg1]; - flags[1] = gSpeciesNames[arg4][arg1 + 1]; - } - else - { - flags[0] = gSpeciesNames[arg4][nameLength - (arg1 + 2)]; - flags[1] = gSpeciesNames[arg4][nameLength - (arg1 + 1)]; - } - } - StringCopy(gUnknown_083D1464[arg0], flags); -} - -bool8 TV_IsScriptShowKindAlreadyInQueue(void) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (gSaveBlock1.tvShows[i].common.kind == gSpecialVar_0x8004) - return TRUE; - } - return FALSE; -} - -bool8 TV_PutNameRaterShowOnTheAirIfNicnkameChanged(void) -{ - GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); - if (!StringCompareWithoutExtCtrlCodes(gStringVar3, gStringVar1)) - return FALSE; - sub_80BE478(); - return TRUE; -} - -void ChangePokemonNickname_CB(void); - -void ChangePokemonNickname(void) -{ - u16 spec; - u16 gender; - u32 pval; - - GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar3); - GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar2); - spec = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_SPECIES, 0); - gender = GetMonGender(&(gPlayerParty[gSpecialVar_0x8004])); - pval = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_PERSONALITY, 0); - DoNamingScreen(3, gStringVar2, spec, gender, pval, ChangePokemonNickname_CB); -} - -void ChangePokemonNickname_CB(void) -{ - SetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, gStringVar2); - c2_exit_to_overworld_1_continue_scripts_restart_music(); -} - -void TV_CopyNicknameToStringVar1AndEnsureTerminated(void) -{ - GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); - StringGetEnd10(gStringVar1); -} - -void TV_CheckMonOTIDEqualsPlayerID(void) -{ - if (GetPlayerTrainerId() == GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_OT_ID, 0)) - gSpecialVar_Result = 0; - else - gSpecialVar_Result = 1; -} - -u8 GetTVChannelByShowType(u8 arg0) -{ - if (arg0 == 0) - return 0; - else if (arg0 > 0 && arg0 <= 20) - return 2; - else if (arg0 > 20 && arg0 <= 40) - return 3; - else if (arg0 > 40 && arg0 <= 60) - return 4; - else - return 0; -} - -u32 GetPlayerTrainerId(void) -{ - return (gSaveBlock2.playerTrainerId[3] << 24) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[0]); -} - -u8 CheckForBigMovieOrEmergencyNewsOnTV(void) -{ - if (gSaveBlock1.location.mapGroup != MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) - return 0; - if (gSaveBlock2.playerGender == MALE) - { - if (gSaveBlock1.location.mapNum != MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) - return 0; - } - else - { - if (gSaveBlock1.location.mapNum != MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) - return 0; - } - if (FlagGet(FLAG_SYS_TV_LATI) == 1) - return 1; - if (FlagGet(FLAG_SYS_TV_HOME) == 1) - return 2; - return 1; -} - -void GetMomOrDadStringForTVMessage(void) -{ - if (gSaveBlock1.location.mapGroup == MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) - { - if (gSaveBlock2.playerGender == MALE) - { - if (gSaveBlock1.location.mapNum == MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) - { - StringCopy(gStringVar1, gOtherText_Mom); - VarSet(VAR_TEMP_3, 1); - } - } - else - { - if (gSaveBlock1.location.mapNum == MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) - { - StringCopy(gStringVar1, gOtherText_Mom); - VarSet(VAR_TEMP_3, 1); - } - } - } - if (VarGet(VAR_TEMP_3) == 1) - { - StringCopy(gStringVar1, gOtherText_Mom); - } - else if (VarGet(VAR_TEMP_3) == 2) - { - StringCopy(gStringVar1, gOtherText_Dad); - } - else if (VarGet(VAR_TEMP_3) > 2) - { - if (VarGet(VAR_TEMP_3) % 2 == 0) - StringCopy(gStringVar1, gOtherText_Mom); - else - StringCopy(gStringVar1, gOtherText_Dad); - } - else - { - if (Random() % 2 != 0) - { - StringCopy(gStringVar1, gOtherText_Mom); - VarSet(VAR_TEMP_3, 1); - } - else - { - StringCopy(gStringVar1, gOtherText_Dad); - VarSet(VAR_TEMP_3, 2); - } - } -} - -void sub_80BFD20(void) -{ - VarSet(VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, 0); - RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); -} - -typedef union ewramStruct_02007000 -{ - TVShow tvshows[4][25]; - struct PokeNews pokeNews[4][16]; -} ewramStruct_02007000; - -void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]); - -void sub_80C04A0(void); -void sub_80C01D4(void); -void sub_80C0408(void); - -void sub_80BFD44(u8 *arg0, u32 arg1, u8 arg2) -{ - u8 i; - ewramStruct_02007000 *ewramTVShows; - - for (i = 0; i < 4; i++) - memcpy(&gUnknown_02007000.tvshows[i], &arg0[i * arg1], 25 * sizeof(TVShow)); - ewramTVShows = &gUnknown_02007000; - switch (arg2) - { - case 0: - sub_80BFE24(gSaveBlock1.tvShows, ewramTVShows->tvshows[1], ewramTVShows->tvshows[2], ewramTVShows->tvshows[3]); - break; - case 1: - sub_80BFE24(ewramTVShows->tvshows[0], gSaveBlock1.tvShows, ewramTVShows->tvshows[2], ewramTVShows->tvshows[3]); - break; - case 2: - sub_80BFE24(ewramTVShows->tvshows[0], ewramTVShows->tvshows[1], gSaveBlock1.tvShows, ewramTVShows->tvshows[3]); - break; - case 3: - sub_80BFE24(ewramTVShows->tvshows[0], ewramTVShows->tvshows[1], ewramTVShows->tvshows[2], gSaveBlock1.tvShows); - break; - } - sub_80BF588(gSaveBlock1.tvShows); - sub_80C04A0(); - sub_80BF588(gSaveBlock1.tvShows); - sub_80C01D4(); - sub_80C0408(); -} - -s8 sub_80C019C(TVShow tvShows[]); -bool8 sub_80BFF68(TVShow * tv1[25], TVShow * tv2[25], u8 idx); -u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx); -u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx); -u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx); - -void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]) -{ - u8 i, j; - TVShow **argslist[4]; - - argslist[0] = &arg0; - argslist[1] = &arg1; - argslist[2] = &arg2; - argslist[3] = &arg3; - gUnknown_03000720 = GetLinkPlayerCount(); - while (1) - { - for (i=0; icommon.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - return FALSE; - tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; - tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; - tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; - tv2->common.srcTrainerIdHi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.active = 1; - return TRUE; -} - -u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx) -{ - u32 linkTrainerId = GetLinkPlayerTrainerId(idx); - if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi) - return FALSE; - if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - return FALSE; - tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo; - tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi; - tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF; - tv2->common.srcTrainerId2Hi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.active = 1; - return TRUE; -} - -u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx) -{ - u32 linkTrainerId = GetLinkPlayerTrainerId(idx); - if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - return FALSE; - tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; - tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; - tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; - tv2->common.srcTrainerIdHi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.active = 1; - tv1->common.var16[0] = 1; - return TRUE; -} - -s8 sub_80C019C(TVShow tvShows[]) -{ - u8 i; - for (i = 0; i < 24; i++) - { - if (tvShows[i].common.active == 0 && (u8)(tvShows[i].common.kind - 1) < 60) - return i; - } - return -1; -} - -#ifdef NONMATCHING -void sub_80C01D4(void) -{ - u16 i; - for (i=0; i<24; i++) - { - switch (gSaveBlock1.tvShows[i].common.kind) - { - case 0: - case TVSHOW_RECENT_HAPPENINGS: - case TVSHOW_SMART_SHOPPER: - case TVSHOW_MASS_OUTBREAK: - break; - case TVSHOW_FAN_CLUB_LETTER: - sub_80C03C8((&gSaveBlock1.tvShows[i])->fanclubLetter.species, i); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - sub_80C03C8((&gSaveBlock1.tvShows[i])->fanclubOpinions.var02, i); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - sub_80C03C8((&gSaveBlock1.tvShows[i])->unkShow04.var06, i); - break; - case TVSHOW_NAME_RATER_SHOW: - sub_80C03C8((&gSaveBlock1.tvShows[i])->nameRaterShow.species, i); - sub_80C03C8((&gSaveBlock1.tvShows[i])->nameRaterShow.var1C, i); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainer.species, i); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainerTower.species, i); - sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainerTower.defeatedSpecies, i); - break; - case TVSHOW_POKEMON_TODAY_CAUGHT: - sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonToday.species, i); - break; - case TVSHOW_POKEMON_TODAY_FAILED: - sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonTodayFailed.species, i); - sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonTodayFailed.species2, i); - break; - case TVSHOW_FISHING_ADVICE: - sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonAngler.var04, i); - break; - case TVSHOW_WORLD_OF_MASTERS: - sub_80C03C8((&gSaveBlock1.tvShows[i])->worldOfMasters.var08, i); - sub_80C03C8((&gSaveBlock1.tvShows[i])->worldOfMasters.var04, i); - break; - default: - sub_80C03A8(i); - } - } -} -#else -__attribute__((naked)) -void sub_80C01D4(void) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - movs r6, 0\n\ -_080C01D8:\n\ - ldr r0, _080C01F8 @ =gSaveBlock1\n\ - lsls r2, r6, 3\n\ - adds r1, r2, r6\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldr r0, _080C01FC @ =0x00002738\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x29\n\ - bls _080C01EE\n\ - b _default\n\ -_080C01EE:\n\ - lsls r0, 2\n\ - ldr r1, _080C0200 @ =_080C0204\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_080C01F8: .4byte gSaveBlock1\n\ -_080C01FC: .4byte 0x00002738\n\ -_080C0200: .4byte _080C0204\n\ - .align 2, 0\n\ -_080C0204:\n\ - .4byte _break\n\ - .4byte _fanclubLetter @ TVSHOW_FAN_CLUB_LETTER\n\ - .4byte _break @ TVSHOW_RECENT_HAPPENINGS\n\ - .4byte _fanclubOpinions @ TVSHOW_PKMN_FAN_CLUB_OPINIONS\n\ - .4byte _showtype4 @ TVSHOW_UNKN_SHOWTYPE_04\n\ - .4byte _nameRater @ TVSHOW_NAME_RATER_SHOW\n\ - .4byte _bravoTrainerContest @ TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE\n\ - .4byte _bravoTrainerTower @ TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _pokemonTodayS @ TVSHOW_POKEMON_TODAY_CAUGHT\n\ - .4byte _break @ TVSHOW_SMART_SHOPPER\n\ - .4byte _pokemonTodayF @ TVSHOW_POKEMON_TODAY_FAILED\n\ - .4byte _fishing @ TVSHOW_FISHING_ADVICE\n\ - .4byte _worldOfMasters @ TVSHOW_WORLD_OF_MASTERS\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _default\n\ - .4byte _break @ TVSHOW_MASS_OUTBREAK\n\ -_fanclubLetter:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C02B8 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x2]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C02B8: .4byte gSaveBlock1 + 0x2738\n\ -_fanclubOpinions:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C02C8 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x2]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C02C8: .4byte gSaveBlock1 + 0x2738\n\ -_showtype4:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C02D8 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x6]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C02D8: .4byte gSaveBlock1 + 0x2738\n\ -_nameRater:\n\ - adds r4, r2, r6\n\ - lsls r4, 2\n\ - ldr r0, _080C02F4 @ =gSaveBlock1 + 0x2738\n\ - adds r4, r0\n\ - ldrh r0, [r4, 0x2]\n\ - lsls r5, r6, 24\n\ - lsrs r5, 24\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - ldrh r0, [r4, 0x1C]\n\ - b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C02F4: .4byte gSaveBlock1 + 0x2738\n\ -_bravoTrainerContest:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C0304 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x2]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C0304: .4byte gSaveBlock1 + 0x2738\n\ -_bravoTrainerTower:\n\ - adds r4, r2, r6\n\ - lsls r4, 2\n\ - ldr r0, _080C0320 @ =gSaveBlock1 + 0x2738\n\ - adds r4, r0\n\ - ldrh r0, [r4, 0xA]\n\ - lsls r5, r6, 24\n\ - lsrs r5, 24\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - ldrh r0, [r4, 0x14]\n\ - b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C0320: .4byte gSaveBlock1 + 0x2738\n\ -_pokemonTodayS:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C0330 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x10]\n\ - b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C0330: .4byte gSaveBlock1 + 0x2738\n\ -_pokemonTodayF:\n\ - adds r4, r2, r6\n\ - lsls r4, 2\n\ - ldr r0, _080C034C @ =gSaveBlock1 + 0x2738\n\ - adds r4, r0\n\ - ldrh r0, [r4, 0xC]\n\ - lsls r5, r6, 24\n\ - lsrs r5, 24\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - ldrh r0, [r4, 0xE]\n\ - b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ - .align 2, 0\n\ -_080C034C: .4byte gSaveBlock1 + 0x2738\n\ -_fishing:\n\ - adds r0, r2, r6\n\ - lsls r0, 2\n\ - ldr r1, _080C0364 @ =gSaveBlock1 + 0x2738\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x4]\n\ -_checkSpecies1:\n\ - lsls r1, r6, 24\n\ - lsrs r1, 24\n\ - bl sub_80C03C8\n\ - b _break\n\ - .align 2, 0\n\ -_080C0364: .4byte gSaveBlock1 + 0x2738\n\ -_worldOfMasters:\n\ - adds r4, r2, r6\n\ - lsls r4, 2\n\ - ldr r0, _080C0388 @ =gSaveBlock1 + 0x2738\n\ - adds r4, r0\n\ - ldrh r0, [r4, 0x8]\n\ - lsls r5, r6, 24\n\ - lsrs r5, 24\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - ldrh r0, [r4, 0x4]\n\ -_checkSpecies2:\n\ - adds r1, r5, 0\n\ - bl sub_80C03C8\n\ - b _break\n\ - .align 2, 0\n\ -_080C0388: .4byte gSaveBlock1 + 0x2738\n\ -_default:\n\ - lsls r0, r6, 24\n\ - lsrs r0, 24\n\ - bl sub_80C03A8\n\ -_break:\n\ - adds r0, r6, 0x1\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - cmp r6, 0x17\n\ - bhi _080C03A0\n\ - b _080C01D8\n\ -_080C03A0:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ -.syntax divided\n"); -} -#endif - -void sub_80C03A8(u8 showidx) -{ - gSaveBlock1.tvShows[showidx].common.active = 0; -} - -void sub_80C03C8(u16 species, u8 showidx) -{ - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) - gSaveBlock1.tvShows[showidx].common.active = 0; -} - -void sub_80C0408(void) -{ - u16 i; - - if (FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE) - return; - for (i = 0; i < 24; i++) - { - if (gSaveBlock1.tvShows[i].common.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) - gSaveBlock1.tvShows[i].common.active = 0; - else if (gSaveBlock1.tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK) - gSaveBlock1.tvShows[i].common.active = 0; - } -} - -void sub_80C045C(void) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (GetTVChannelByShowType(gSaveBlock1.tvShows[i].common.kind) == 2) - gSaveBlock1.tvShows[i].common.active = 0; - } -} - -void sub_80C04A0(void) -{ - s8 showIdx; - s8 count; - count = 0; - - for (showIdx = 5; showIdx < 24; showIdx++) - { - if (gSaveBlock1.tvShows[showIdx].common.kind == 0) - count++; - } - for (showIdx = 0; showIdx < 5 - count; showIdx++) - sub_80BF55C(gSaveBlock1.tvShows, showIdx+5); -} - -void sub_80C05C4(struct PokeNews[16], struct PokeNews[16], struct PokeNews[16], struct PokeNews[16]); -void sub_80C0750(void); -void sub_80C0788(void); -s8 sub_80C0730(struct PokeNews[16], u8); -void sub_80C06BC(struct PokeNews *[16], struct PokeNews *[16]); - -void sub_80C0514(void *a0, u32 a1, u8 a2) -{ - ewramStruct_02007000 *struct02007000; - u8 i; - - for (i = 0; i < 4; i++) - memcpy(gUnknown_02007000.pokeNews[i], a0 + i * a1, 64); - struct02007000 = &gUnknown_02007000; - switch (a2) - { - case 0: - sub_80C05C4(gSaveBlock1.pokeNews, struct02007000->pokeNews[1], struct02007000->pokeNews[2], struct02007000->pokeNews[3]); - break; - case 1: - sub_80C05C4(struct02007000->pokeNews[0], gSaveBlock1.pokeNews, struct02007000->pokeNews[2], struct02007000->pokeNews[3]); - break; - case 2: - sub_80C05C4(struct02007000->pokeNews[0], struct02007000->pokeNews[1], gSaveBlock1.pokeNews, struct02007000->pokeNews[3]); - break; - case 3: - sub_80C05C4(struct02007000->pokeNews[0], struct02007000->pokeNews[1], struct02007000->pokeNews[2], gSaveBlock1.pokeNews); - break; - } - sub_80C0750(); - sub_80C0788(); -} - -void sub_80C05C4(struct PokeNews a0[16], struct PokeNews a1[16], struct PokeNews a2[16], struct PokeNews a3[16]) -{ - u8 i; - u8 j; - u8 k; - struct PokeNews ** arglist[4]; - - arglist[0] = &a0; - arglist[1] = &a1; - arglist[2] = &a2; - arglist[3] = &a3; - gUnknown_03000721 = GetLinkPlayerCount(); - for (i = 0; i < 16; i++) - { - for (j = 0; j < gUnknown_03000721; j++) - { - gUnknown_03000722 = sub_80C0730(*arglist[j], i); - if (gUnknown_03000722 != -1) - { - for (k = 0; k < gUnknown_03000721-1; k++) - { - gUnknown_03005D38.var0 = sub_80BEBC8(*arglist[(j + k + 1) % gUnknown_03000721]); - if (gUnknown_03005D38.var0 != -1) - sub_80C06BC(arglist[(j + k + 1) % gUnknown_03000721], arglist[j]); - } - } - } - } -} - -void sub_80C06BC(struct PokeNews *arg0[16], struct PokeNews *arg1[16]) -{ - struct PokeNews *str0; - struct PokeNews *str1; - - str0 = arg0[0]; - str1 = arg1[0]; - str1 += gUnknown_03000722; - sub_80C06E8(str0, str1, gUnknown_03005D38.var0); -} - -bool8 sub_80C06E8(struct PokeNews *arg0, struct PokeNews *arg1, s8 arg2) -{ - u8 i; - - if (arg1->kind == 0) - return FALSE; - for (i = 0; i < 16; i++) - { - if (arg0[i].kind == arg1->kind) - return FALSE; - } - arg0[arg2].kind = arg1->kind; - arg0[arg2].state = 1; - arg0[arg2].days = arg1->days; - return TRUE; -} - -s8 sub_80C0730(struct PokeNews *arg0, u8 arg1) -{ - if (arg0[arg1].kind == 0) - return -1; - return arg1; -} - -void sub_80C0750(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - { - if (gSaveBlock1.pokeNews[i].kind > 3) - sub_80BEC10(i); - } - sub_80BEC40(); -} - -void sub_80C0788(void) -{ - u8 i; - - if (FlagGet(FLAG_SYS_GAME_CLEAR) != 1) - { - for (i = 0; i < 16; i++) - gSaveBlock1.pokeNews[i].state = 0; - } -} - -void DoTVShow(void) -{ - if (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.active != 0) - { - switch (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.kind) - { - case TVSHOW_FAN_CLUB_LETTER: - DoTVShowPokemonFanClubLetter(); - break; - case TVSHOW_RECENT_HAPPENINGS: - DoTVShowRecentHappenings(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - DoTVShowPokemonFanClubOpinions(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - nullsub_22(); - break; - case TVSHOW_MASS_OUTBREAK: - DoTVShowPokemonNewsMassOutbreak(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - DoTVShowBravoTrainerPokemonProfile(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - DoTVShowBravoTrainerBattleTowerProfile(); - break; - case TVSHOW_POKEMON_TODAY_CAUGHT: - DoTVShowPokemonTodaySuccessfulCapture(); - break; - case TVSHOW_SMART_SHOPPER: - DoTVShowTodaysSmartShopper(); - break; - case TVSHOW_NAME_RATER_SHOW: - DoTVShowTheNameRaterShow(); - break; - case TVSHOW_POKEMON_TODAY_FAILED: - DoTVShowPokemonTodayFailedCapture(); - break; - case TVSHOW_FISHING_ADVICE: - DoTVShowPokemonAngler(); - break; - case TVSHOW_WORLD_OF_MASTERS: - DoTVShowTheWorldOfMasters(); - break; - } - } -} - -void TVShowConvertInternationalString(u8 *dest, u8 *src, u8 language) -{ - StringCopy(dest, src); - if (language < LANGUAGE_ENGLISH) - ConvertInternationalString(dest, LANGUAGE_JAPANESE); -} - -void DoTVShowBravoTrainerPokemonProfile(void) -{ - struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch(state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); - sub_80BEF10(2, bravoTrainer->contestRank); - if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[bravoTrainer->species], bravoTrainer->pokemonNickname)) - sTVShowState = 8; - else - sTVShowState = 1; - break; - case 1: - StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); - TVShowConvertInternationalString(gStringVar2, bravoTrainer->pokemonNickname, bravoTrainer->var1f); - CopyContestCategoryToStringVar(2, bravoTrainer->contestCategory); - sTVShowState = 2; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - if (bravoTrainer->contestResult == 0) // placed first - sTVShowState = 3; - else - sTVShowState = 4; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - EasyChat_GetWordText(gStringVar2, bravoTrainer->var04[0]); - sub_80BF088(2, bravoTrainer->contestResult + 1); - sTVShowState = 5; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - EasyChat_GetWordText(gStringVar2, bravoTrainer->var04[0]); - sub_80BF088(2, bravoTrainer->contestResult + 1); - sTVShowState = 5; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); - EasyChat_GetWordText(gStringVar3, bravoTrainer->var04[1]); - if (bravoTrainer->var14) - sTVShowState = 6; - else - sTVShowState = 7; - break; - case 6: - StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); - StringCopy(gStringVar2, gMoveNames[bravoTrainer->var14]); - EasyChat_GetWordText(gStringVar3, bravoTrainer->var04[1]); - sTVShowState = 7; - break; - case 7: - TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainer->species]); - TVShowDone(); - break; - case 8: - StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); - sTVShowState = 2; - break; - } - ShowFieldMessage(gTVBravoTrainerTextGroup[state]); -} - -void DoTVShowBravoTrainerBattleTowerProfile(void) -{ - struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainerTower; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch(state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]); - if (bravoTrainerTower->var16 >= 7) - sTVShowState = 1; - else - sTVShowState = 2; - break; - case 1: - sub_80BF088(0, bravoTrainerTower->btLevel); - sub_80BF088(1, bravoTrainerTower->var16); - if (bravoTrainerTower->var1c == 1) - sTVShowState = 3; - else - sTVShowState = 4; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - sub_80BF088(1, bravoTrainerTower->var16 + 1); - if (bravoTrainerTower->var1b == 0) - sTVShowState = 5; - else - sTVShowState = 6; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]); - if (bravoTrainerTower->var1b == 0) - sTVShowState = 5; - else - sTVShowState = 6; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]); - if (bravoTrainerTower->var1b == 0) - sTVShowState = 5; - else - sTVShowState = 6; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - sTVShowState = 11; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - sTVShowState = 11; - break; - case 7: - sTVShowState = 11; - break; - case 8: - case 9: - case 10: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); - sTVShowState = 11; - break; - case 11: - EasyChat_GetWordText(gStringVar1, bravoTrainerTower->var18[0]); - if (bravoTrainerTower->var1b == 0) - sTVShowState = 12; - else - sTVShowState = 13; - break; - case 12: - case 13: - EasyChat_GetWordText(gStringVar1, bravoTrainerTower->var18[0]); - TVShowConvertInternationalString(gStringVar2, bravoTrainerTower->trainerName, bravoTrainerTower->language); - TVShowConvertInternationalString(gStringVar3, bravoTrainerTower->pokemonName, bravoTrainerTower->language); - sTVShowState = 14; - break; - case 14: - TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); - StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]); - TVShowDone(); - break; - } - ShowFieldMessage(gTVBravoTrainerBattleTowerTextGroup[state]); -} - -void DoTVShowTodaysSmartShopper(void) -{ - struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gSpecialVar_0x8004].smartshopperShow; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch(state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - GetMapSectionName(gStringVar2, smartShopper->shopLocation, 0); - if (smartShopper->itemAmounts[0] >= 0xff) - sTVShowState = 11; - else - sTVShowState = 1; - break; - case 1: - TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[0])); - sub_80BF088(2, smartShopper->itemAmounts[0]); - sTVShowState += (Random() % 4) + 1; - break; - case 2: - case 4: - case 5: - if (smartShopper->itemIds[1] != 0) - sTVShowState = 6; - else - sTVShowState = 10; - break; - case 3: - sub_80BF088(2, smartShopper->itemAmounts[0] + 1); - if (smartShopper->itemIds[1] != 0) - sTVShowState = 6; - else - sTVShowState = 10; - break; - case 6: - StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[1])); - sub_80BF088(2, smartShopper->itemAmounts[1]); - if (smartShopper->itemIds[2] != 0) - sTVShowState = 7; - else if (smartShopper->priceReduced == 1) - sTVShowState = 8; - else - sTVShowState = 9; - break; - case 7: - StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[2])); - sub_80BF088(2, smartShopper->itemAmounts[2]); - if (smartShopper->priceReduced == 1) - sTVShowState = 8; - else - sTVShowState = 9; - break; - case 8: - if (smartShopper->itemAmounts[0] < 0xff) - sTVShowState = 9; - else - sTVShowState = 12; - break; - case 9: - sub_80BF154(1, smartShopper); - TVShowDone(); - break; - case 10: - if (smartShopper->priceReduced == 1) - sTVShowState = 8; - else - sTVShowState = 9; - break; - case 11: - TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[0])); - if (smartShopper->priceReduced == 1) - sTVShowState = 8; - else - sTVShowState = 12; - break; - case 12: - TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); - TVShowDone(); - break; - } - ShowFieldMessage(gTVSmartShopperTextGroup[state]); -} - -void DoTVShowTheNameRaterShow(void) -{ - struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004].nameRaterShow; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); - StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]); - TVShowConvertInternationalString(gStringVar3, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); - sTVShowState = sub_80BF7E8(nameRaterShow) + 1; - break; - case 1: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - if (nameRaterShow->random == 0) - sTVShowState = 9; - else if (nameRaterShow->random == 1) - sTVShowState = 10; - else if (nameRaterShow->random == 2) - sTVShowState = 11; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); - if (nameRaterShow->random == 0) - sTVShowState = 9; - else if (nameRaterShow->random == 1) - sTVShowState = 10; - else if (nameRaterShow->random == 2) - sTVShowState = 11; - break; - case 9: - case 10: - case 11: - sub_80BF820(0, 1, 0, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); - sub_80BF820(0, 0, 0, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage); - TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); - sTVShowState = 12; - break; - case 13: - sub_80BF820(0, 0, 3, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); - sub_80BF820(0, 0, 2, 0, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->language); - TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); - sTVShowState = 14; - break; - case 14: - sub_80BF820(0, 0, 3, 0, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->language); - sub_80BF820(0, 0, 2, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage); - TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); - sTVShowState = 18; - break; - case 15: - sub_80BF820(1, 0, 2, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage); - StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]); - sub_80BF820(2, 0, 3, 2, nameRaterShow->species, nameRaterShow); - sTVShowState = 16; - break; - case 16: - sub_80BF820(0, 0, 3, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); - sub_80BF820(0, 0, 2, 2, nameRaterShow->species, nameRaterShow); - sTVShowState = 17; - break; - case 17: - sub_80BF820(1, 0, 2, 1, 0, nameRaterShow); - TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage); - sub_80BF820(2, 0, 3, 2, nameRaterShow->var1C, nameRaterShow); - StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->var1C]); - sTVShowState = 18; - break; - case 12: - state = 18; - sTVShowState = 18; - case 18: - TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); - TVShowConvertInternationalString(gStringVar2, nameRaterShow->trainerName, nameRaterShow->language); - TVShowDone(); - break; - } - ShowFieldMessage(gTVNameRaterTextGroup[state]); -} - -void DoTVShowPokemonTodaySuccessfulCapture(void) -{ - struct TVShowPokemonToday *pokemonToday = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonToday; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); - if (pokemonToday->ball == ITEM_MASTER_BALL) - sTVShowState = 5; - else - sTVShowState = 1; - break; - case 1: - sTVShowState = 2; - break; - case 2: - StringCopy(gStringVar2, ItemId_GetName(pokemonToday->ball)); - sub_80BF088(2, pokemonToday->var12); - if (pokemonToday->var12 < 4) - sTVShowState = 3; - else - sTVShowState = 4; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); - sTVShowState = 6; - break; - case 4: - sTVShowState = 6; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); - sTVShowState = 6; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); - sTVShowState += (Random() % 4) + 1; - break; - case 7: - case 8: - StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2); - sub_80BF638(2, pokemonToday->species); - sTVShowState = 11; - break; - case 9: - case 10: - StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]); - TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2); - sTVShowState = 11; - break; - case 11: - TVShowDone(); - break; - } - ShowFieldMessage(gTVPokemonTodayTextGroup[state]); -} - -void DoTVShowPokemonTodayFailedCapture(void) -{ - struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonTodayFailed; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonTodayFailed->species]); - sTVShowState = 1; - break; - case 1: - TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); - GetMapSectionName(gStringVar2, pokemonTodayFailed->var12, 0); - StringCopy(gStringVar3, gSpeciesNames[pokemonTodayFailed->species2]); - if (pokemonTodayFailed->var11 == 1) - sTVShowState = 3; - else - sTVShowState = 2; - break; - case 2: - case 3: - TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); - sub_80BF088(1, pokemonTodayFailed->var10); - if ((Random() % 3) == 0) - sTVShowState = 5; - else - sTVShowState = 4; - break; - case 4: - case 5: - TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); - sTVShowState = 6; - break; - case 6: - TVShowDone(); - break; - } - ShowFieldMessage(gTVPokemonTodayFailedCaptureTextGroup[state]); -} - -void DoTVShowPokemonFanClubLetter(void) -{ - struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubLetter; - u8 state; - u16 rval; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, fanclubLetter->playerName, fanclubLetter->language); - StringCopy(gStringVar2, gSpeciesNames[fanclubLetter->species]); - sTVShowState = 50; - break; - case 1: - rval = (Random() % 4) + 1; - if (rval == 1) - sTVShowState = 2; - else - sTVShowState = rval + 2; - break; - case 2: - sTVShowState = 51; - break; - case 3: - sTVShowState += (Random() % 3) + 1; - break; - case 4: - case 5: - case 6: - sub_80BF79C((TVShow *)fanclubLetter); - sTVShowState = 7; - break; - case 7: - rval = (Random() % 0x1f) + 0x46; - sub_80BF088(2, rval); - TVShowDone(); - break; - case 50: - ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2); - ShowFieldMessage(gStringVar4); - sTVShowState = 1; - return; - case 51: - ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2); - ShowFieldMessage(gStringVar4); - sTVShowState = 3; - return; - } - ShowFieldMessage(gTVFanClubTextGroup[state]); -} - -void DoTVShowRecentHappenings(void) -{ - struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gSpecialVar_0x8004].recentHappenings; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, recentHappenings->playerName, recentHappenings->language); - sub_80BF79C((TVShow *)recentHappenings); - sTVShowState = 50; - break; - case 1: - sTVShowState += 1 + (Random() % 3); - break; - case 2: - case 3: - case 4: - sTVShowState = 5; - break; - case 5: - TVShowDone(); - break; - case 50: - ConvertEasyChatWordsToString(gStringVar4, recentHappenings->var04, 2, 2); - ShowFieldMessage(gStringVar4); - sTVShowState = 1; - return; - } - ShowFieldMessage(gTVRecentHappeningsTextGroup[state]); -} - -void DoTVShowPokemonFanClubOpinions(void) -{ - struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubOpinions; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); - StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]); - TVShowConvertInternationalString(gStringVar3, fanclubOpinions->var10, fanclubOpinions->var0E); - sTVShowState = fanclubOpinions->var04B + 1; - break; - case 1: - case 2: - case 3: - TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); - StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]); - EasyChat_GetWordText(gStringVar3, fanclubOpinions->var1C[0]); - sTVShowState = 4; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); - EasyChat_GetWordText(gStringVar3, fanclubOpinions->var1C[1]); - TVShowDone(); - break; - } - ShowFieldMessage(gTVFanClubOpinionsTextGroup[state]); -} - -void nullsub_22(void) -{ -} - -void DoTVShowPokemonNewsMassOutbreak(void) -{ - struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[gSpecialVar_0x8004].massOutbreak; - - GetMapSectionName(gStringVar1, massOutbreak->locationMapNum, 0); - StringCopy(gStringVar2, gSpeciesNames[massOutbreak->species]); - TVShowDone(); - StartMassOutbreak(); - ShowFieldMessage(gTVPokemonOutbreakTextGroup[sTVShowState]); -} - -void DoTVShowInSearchOfTrainers(void) -{ - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch (state) - { - case 0: - GetMapSectionName(gStringVar1, gSaveBlock1.gabbyAndTyData.mapnum, 0); - if (gSaveBlock1.gabbyAndTyData.battleNum > 1) - sTVShowState = 1; - else - sTVShowState = 2; - break; - case 1: - sTVShowState = 2; - break; - case 2: - if (gSaveBlock1.gabbyAndTyData.valA_0 == 0) - sTVShowState = 4; - else if (gSaveBlock1.gabbyAndTyData.valA_3 != 0) - sTVShowState = 5; - else if (gSaveBlock1.gabbyAndTyData.valA_2 != 0) - sTVShowState = 6; - else if (gSaveBlock1.gabbyAndTyData.valA_1 != 0) - sTVShowState = 7; - else - sTVShowState = 3; - break; - case 3: - StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); - StringCopy(gStringVar2, gMoveNames[gSaveBlock1.gabbyAndTyData.lastMove]); - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); - sTVShowState = 8; - break; - case 4: - case 5: - case 6: - case 7: - sTVShowState = 8; - break; - case 8: - EasyChat_GetWordText(gStringVar1, gSaveBlock1.gabbyAndTyData.quote); - StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); - gSpecialVar_Result = 1; - sTVShowState = 0;; - TakeTVShowInSearchOfTrainersOffTheAir(); - break; - } - ShowFieldMessage(gTVGabbyAndTyTextGroup[state]); -} - -void DoTVShowPokemonAngler(void) -{ - struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonAngler; - u8 state; - - gSpecialVar_Result = 0; - if (pokemonAngler->var02 < pokemonAngler->var03) - sTVShowState = 0; - else - sTVShowState = 1; - state = sTVShowState; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, pokemonAngler->playerName, pokemonAngler->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonAngler->var04]); - sub_80BF088(2, pokemonAngler->var03); - TVShowDone(); - break; - case 1: - TVShowConvertInternationalString(gStringVar1, pokemonAngler->playerName, pokemonAngler->language); - StringCopy(gStringVar2, gSpeciesNames[pokemonAngler->var04]); - sub_80BF088(2, pokemonAngler->var02); - TVShowDone(); - break; - } - ShowFieldMessage(gTVFishingGuruAdviceTextGroup[state]); -} - -void DoTVShowTheWorldOfMasters(void) -{ - struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[gSpecialVar_0x8004].worldOfMasters; - u8 state; - - gSpecialVar_Result = 0; - state = sTVShowState; - switch (state) - { - case 0: - TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName, - worldOfMasters->language); - sub_80BF088(1, worldOfMasters->var06); - sub_80BF088(2, worldOfMasters->var02); - sTVShowState = 1; - break; - case 1: - StringCopy(gStringVar1, gSpeciesNames[worldOfMasters->var08]); - sTVShowState = 2; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName, - worldOfMasters->language); - GetMapSectionName(gStringVar2, worldOfMasters->var0a, 0); - StringCopy(gStringVar3, gSpeciesNames[worldOfMasters->var04]); - TVShowDone(); - break; - } - ShowFieldMessage(gTVWorldOfMastersTextGroup[state]); -} - -void TVShowDone(void) -{ - gSpecialVar_Result = 1; - sTVShowState = 0; - gSaveBlock1.tvShows[gSpecialVar_0x8004].common.active = 0; -} - -void ResetTVShowState(void) -{ - sTVShowState = 0; -} diff --git a/src/field/use_pokeblock.c b/src/field/use_pokeblock.c deleted file mode 100644 index 8ea93aab8..000000000 --- a/src/field/use_pokeblock.c +++ /dev/null @@ -1,904 +0,0 @@ -// - -// Modified by Dizzy Egg on 8/15/17. -// - -#include "global.h" -#include "main.h" -#include "overworld.h" -#include "string_util.h" -#include "strings.h" -#include "sprite.h" -#include "pokemon.h" -#include "pokenav.h" -#include "palette.h" -#include "text.h" -#include "menu.h" -#include "sound.h" -#include "constants/songs.h" -#include "pokeblock.h" - -#define GFX_TAG_CONDITIONUPDOWN 0 - -#ifdef GERMAN -extern const u16 ConditionUpDownPalette[16]; -extern const u8 ConditionUpDownTiles[0x200]; -#else -const u16 ConditionUpDownPalette[] = INCBIN_U16("graphics/misc/condition_up_down.gbapal"); -const u8 ConditionUpDownTiles[] = INCBIN_U8("graphics/misc/condition_up_down.4bpp"); -#endif - -static const u32 sContestStatsMonData[] = { - MON_DATA_COOL, - MON_DATA_TOUGH, - MON_DATA_SMART, - MON_DATA_CUTE, - MON_DATA_BEAUTY -}; - -static const u8 gUnknown_0840612C[] = { - 0, 4, 3, 2, 1 -}; - -static const u8 *const sContextStatNames[] = { - OtherText_Coolness, - OtherText_Toughness, - OtherText_Smartness, - OtherText_Cuteness, - OtherText_Beauty -}; - -static const struct SpriteSheet gSpriteSheet_ConditionUpDown = { - ConditionUpDownTiles, - sizeof ConditionUpDownTiles, - GFX_TAG_CONDITIONUPDOWN -}; - -static const struct SpritePalette gSpritePalette_ConditionUpDown = { - ConditionUpDownPalette, - GFX_TAG_CONDITIONUPDOWN -}; - -static const s16 gUnknown_08406158[][2] = { - {0x9c, 0x1e}, - {0x75, 0x35}, - {0x75, 0x70}, - {0xc5, 0x70}, - {0xc5, 0x35} -}; - -static const struct OamData gOamData_840616C = { - .shape = 1, - .size = 2, - .priority = 1 -}; - -static const union AnimCmd gSpriteAnim_8406174[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -static const union AnimCmd gSpriteAnim_840617C[] = { - ANIMCMD_FRAME(8, 5), - ANIMCMD_END -}; - -static const union AnimCmd *const gSpriteAnimTable_8406184[] = { - gSpriteAnim_8406174, - gSpriteAnim_840617C -}; - -static const struct SpriteTemplate gSpriteTemplate_840618C = { - GFX_TAG_CONDITIONUPDOWN, - GFX_TAG_CONDITIONUPDOWN, - &gOamData_840616C, - gSpriteAnimTable_8406184, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -static EWRAM_DATA struct UnkPokenavStruct_Sub1 *gUnknown_02039304 = NULL; -static EWRAM_DATA MainCallback gUnknown_02039308 = NULL; -static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL; -EWRAM_DATA u8 gPokeblockMonID = 0; -EWRAM_DATA s16 gPokeblockGain = 0; - -extern u16 gSpecialVar_ItemId; // FIXME: remove after merge of #349 Pokeblock - -static void launch_c3_walk_stairs_and_run_once(void (*const)(void)); -static void sub_81361E4(void); -static void sub_813622C(void); -static void sub_8136244(void); -static void sub_8136264(void); -static void sub_8136294(void); -static void sub_81365A0(void); -static void sub_81365C8(void); -static void sub_8136638(void); -static void sub_81368A4(void); -void ScanlineEffect_InitHBlankDmaTransfer(void); -static void sub_8136B44(void); -static u8 sub_81370E4(u8); -static void sub_8136BB8(void); -static s8 sub_8136C40(void); -static bool8 sub_8137058(void); -static void sub_8136D60(void); -static void sub_8136808(void); -static void sub_8136D8C(void); -static u8 sub_81370A4(u8); -static void sub_81369CC(void); -static void sub_8136EF0(void); -static void sub_8137138(void); -static void sub_8136C6C(void); -static bool8 sub_8136D00(void); -static void Pokeblock_BufferEnhancedStatText(u8 *, u8, s16); -static void Pokeblock_MenuWindowTextPrint(const u8 *); -static void sub_8136F74(struct Pokeblock *, struct Pokemon *); -static void sub_81371DC(struct Sprite *); - -void sub_8136130(struct Pokeblock *pokeblock, MainCallback callback) -{ - gUnknown_02039304 = &gUnknown_083DFEC4->unkD164; - gUnknown_02039304->pokeblock = pokeblock; - gUnknown_02039304->callback = callback; - gUnknown_083DFEC4->unkD162[0] = 2; - launch_c3_walk_stairs_and_run_once(sub_8136294); - SetMainCallback2(sub_8136244); -} - -static void sub_8136174(void) -{ - gUnknown_02039304->pokeblock = gUnknown_0203930C; - gUnknown_02039304->callback = gUnknown_02039308; - gPokeblockMonID = sub_81370E4(gPokeblockMonID); - gUnknown_02039304->unk56 = gPokeblockMonID < 4 ? 0 : 1; - gUnknown_083DFEC4->unkD162[0] = 2; - launch_c3_walk_stairs_and_run_once(sub_8136294); - SetMainCallback2(sub_81361E4); -} - -static void sub_81361E4(void) -{ - gUnknown_02039304->unk0(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - if (gUnknown_02039304->unk0 == sub_81365C8) - { - REG_DISPCNT = 0; - gUnknown_02039304->unk50 = 0; - SetMainCallback2(sub_813622C); - } -} - -static void sub_813622C(void) -{ - sub_81368A4(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_8136244(void) -{ - gUnknown_02039304->unk0(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_8136264(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - sub_80F5CDC(6); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -static void launch_c3_walk_stairs_and_run_once(void (*const func)(void)) -{ - gUnknown_02039304->unk0 = func; - gUnknown_02039304->unk50 = 0; -} - -static void sub_8136294(void) -{ - bool32 c1LinkRelatedActive; - switch (gUnknown_02039304->unk50) - { - case 0: - c1LinkRelatedActive = is_c1_link_related_active(); - gUnknown_083DFEC4->unk6DAC = c1LinkRelatedActive; - if ((bool8)c1LinkRelatedActive == FALSE) - { - gUnknown_02039304->unk55 = 0; - launch_c3_walk_stairs_and_run_once(sub_81365A0); - gUnknown_02039304->unk50++; - } - break; - case 1: - ResetSpriteData(); - FreeAllSpritePalettes(); - gUnknown_02039304->unk50++; - break; - case 2: - SetVBlankCallback(NULL); - gUnknown_02039304->unk50++; - break; - case 3: - Text_LoadWindowTemplate(&gWindowTemplate_81E7080); - gUnknown_02039304->unk50++; - break; - case 4: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E7080); - gUnknown_02039304->unk50++; - break; - case 5: - if (MultistepInitMenuWindowContinue()) - { - gUnknown_02039304->unk50++; - } - break; - case 6: - gUnknown_083DFEC4->unk76AA = 0; - gUnknown_083DFEC4->unk87E0 = NULL; - gUnknown_083DFEC4->unk030C.val = 0x20; - gUnknown_02039304->unk50++; - break; - case 7: - sub_80F2688(); - gUnknown_02039304->unk50++; - // fallthrough - case 8: - if (!sub_80F26BC()) - { - gUnknown_02039304->unk50++; - } - break; - case 9: - sub_80F2C80(1); - gUnknown_02039304->unk50++; - // fallthrough - case 10: - if (!sub_80F2CBC(1)) - { - gUnknown_02039304->unk50++; - } - break; - case 11: - gKeyRepeatStartDelay = 20; - gUnknown_083DFEC4->unk8828 = CalculatePlayerPartyCount(); - gUnknown_083DFEC4->unk9344 = 0; - gUnknown_083DFEC4->unk8768 = NULL; - sub_80F4BD0(); - gUnknown_083DFEC4->unkD160 = 0; - gUnknown_02039304->unk50++; - break; - case 12: - if (!sub_80F1778()) - { - REG_BG2VOFS = 6; - REG_BG3VOFS = 6; - gUnknown_02039304->unk50++; - } - break; - case 13: - sub_80F2E18(0); - gUnknown_083DFEC4->unk8768->unk26 = 0xffd8; - gUnknown_02039304->unk50++; - break; - case 14: - if (!sub_80F170C()) - { - gUnknown_02039304->unk50++; - } - break; - case 15: - sub_80F33A8(); - gUnknown_02039304->unk50++; - break; - case 16: - DmaClear32(3, BG_SCREEN_ADDR(31), 0x800); - REG_BG1VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1CNT = BGCNT_SCREENBASE(31); - gUnknown_02039304->unk50++; - break; - case 17: - sub_80F567C(&gUnknown_083DFEC4->unk8ff0, gUnknown_083DFEC4->unk9004); - sub_80F5B38(); - gUnknown_02039304->unk50++; - break; - case 18: - if (!sub_80F5B50()) - { - gUnknown_02039304->unk50++; - } - break; - case 19: - sub_80F556C(gUnknown_083DFEC4->unk9004); - gUnknown_02039304->unk50++; - break; - case 20: - sub_80F1934(); - gUnknown_02039304->unk50++; - break; - case 21: - REG_WIN0H = 0xf0; - REG_WIN1H = 0x9b; - REG_WIN0V = 0x3273; - REG_WIN1V = 0x3273; - REG_WININ = 0x3f3f; - REG_WINOUT = 0x1b; - REG_BG0VOFS = 0x28; - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; - // fallthrough - case 22: - gUnknown_02039304->unk55 = 1; - launch_c3_walk_stairs_and_run_once(sub_81365C8); - break; - } -} - -static void sub_81365A0(void) -{ - while (!gUnknown_02039304->unk55) - { - sub_8136294(); - } -} - -static void sub_81365C8(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - SetVBlankCallback(sub_8136264); - gUnknown_02039304->unk50++; - break; - case 1: - if (!gPaletteFade.active) - { - sub_80F3C94(); - sub_80F3D00(); - launch_c3_walk_stairs_and_run_once(sub_8136638); - } - break; - } -} - -static void sub_8136638(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - if (gMain.heldKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - sub_80F5060(TRUE); - move_anim_execute(); - gUnknown_02039304->unk50 = 1; - } - else if (gMain.heldKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - sub_80F5060(FALSE); - move_anim_execute(); - gUnknown_02039304->unk50 = 1; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_02039304->unk50 = 3; - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (gUnknown_083DFEC4->unk87DC == gUnknown_083DFEC4->unk87DA - 1) - { - gUnknown_02039304->unk50 = 3; - } - else - { - gUnknown_02039304->unk50 = 5; - } - } - break; - case 1: - if (!gpu_sync_bg_show()) - { - gUnknown_02039304->unk50++; - } - break; - case 2: - if (!sub_8055870()) - { - sub_80F1934(); - sub_80F3D00(); - gUnknown_02039304->unk50 = 0; - } - break; - case 3: - launch_c3_walk_stairs_and_run_once(sub_8136B44); - break; - case 4: - break; - case 5: - sub_8136BB8(); - gUnknown_02039304->unk50++; - break; - case 6: - switch (sub_8136C40()) - { - case 1: - case -1: - gUnknown_02039304->unk50 = 0; - break; - case 0: - if (sub_8137058()) - { - sub_8136D60(); - gUnknown_02039304->unk50 = 7; - } - else - { - launch_c3_walk_stairs_and_run_once(sub_8136808); - } - break; - } - break; - case 7: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8136D8C(); - gUnknown_02039304->unk50 = 0; - } - break; - } -} - -static void sub_8136808(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - gPokeblockMonID = sub_81370A4(gUnknown_083DFEC4->unk87DC); - gUnknown_02039308 = gUnknown_02039304->callback; - gUnknown_0203930C = gUnknown_02039304->pokeblock; - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_02039304->unk50++; - break; - case 1: - if (!gPaletteFade.active) - { - gMain.savedCallback = sub_8136174; - SetMainCallback2(CB2_PreparePokeblockFeedScene); - } - break; - } -} - -static void sub_81368A4(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - if (gUnknown_083DFEC4->unk87DC != gPokeblockMonID) - { - sub_80F5060(gUnknown_02039304->unk56); - gUnknown_02039304->unk50++; - } - else - { - gUnknown_02039304->unk50 = 3; - } - break; - case 1: - if (!gpu_sync_bg_show()) - { - gUnknown_02039304->unk50++; - } - break; - case 2: - if (!sub_8055870()) - { - sub_80F1934(); - gUnknown_02039304->unk50 = 0; - } - break; - case 3: - BlendPalettes(-1, 16, 0); - gUnknown_02039304->unk50++; - break; - case 4: - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; - gUnknown_02039304->unk50++; - break; - case 5: - SetVBlankCallback(sub_8136264); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gUnknown_02039304->unk50++; - break; - case 6: - if (!gPaletteFade.active) - { - sub_80F3C94(); - sub_80F3D00(); - launch_c3_walk_stairs_and_run_once(sub_81369CC); - SetMainCallback2(sub_8136244); - } - break; - } -} - -static void sub_81369CC(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - gUnknown_02039304->pokemon = &gPlayerParty[0]; - gUnknown_02039304->pokemon = &gPlayerParty[gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx]; - move_anim_execute(); - gUnknown_02039304->unk50++; - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - gUnknown_02039304->unk50++; - break; - case 2: - sub_8136EF0(); - sub_80F567C(gUnknown_02039304->unk5c, gUnknown_083DFEC4->unk9040); - sub_80F5550(gUnknown_083DFEC4->unk9004[gUnknown_083DFEC4->unk8fe9], gUnknown_083DFEC4->unk9040); - sub_8137138(); - gUnknown_02039304->unk50++; - break; - case 3: - if (!sub_80F555C()) - { - sub_80F7224(sub_81370A4(gUnknown_083DFEC4->unk87DC)); - sub_80F3D00(); - gUnknown_02039304->unk52 = 0; - gUnknown_02039304->unk50++; - } - break; - case 4: - if ((++gUnknown_02039304->unk52) > 16) - { - sub_8136C6C(); - gUnknown_02039304->unk50++; - } - break; - case 5: - if (gMain.newKeys & (A_BUTTON | B_BUTTON) && !sub_8136D00()) - { - PokeblockClearIfExists((u8)gSpecialVar_ItemId); - launch_c3_walk_stairs_and_run_once(sub_8136B44); - } - break; - } -} - -static void sub_8136B44(void) -{ - switch (gUnknown_02039304->unk50) - { - case 0: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_02039304->unk50++; - break; - case 1: - if (!gPaletteFade.active) - { - gUnknown_02039304->unk50 = 2; - } - break; - case 2: - sub_80F5BDC(); - gUnknown_02039304->unk50++; - break; - case 3: - SetMainCallback2(gUnknown_02039304->callback); - break; - } -} - -static void sub_8136BB8(void) -{ - GetMonData(&gPlayerParty[sub_81370A4(gUnknown_083DFEC4->unk87DC)], MON_DATA_NICKNAME, gUnknown_02039304->stringBuffer); - StringGetEnd10(gUnknown_02039304->stringBuffer); - StringAppend(gUnknown_02039304->stringBuffer, gOtherText_GetsAPokeBlock); - BasicInitMenuWindow(&gWindowTemplate_81E709C); - Menu_DrawStdWindowFrame(0, 16, 29, 19); - Menu_PrintText(gUnknown_02039304->stringBuffer, 1, 17); - DisplayYesNoMenu(23, 10, 1); - Menu_MoveCursor(0); -} - -static s8 sub_8136C40(void) -{ - s8 retval = Menu_ProcessInputNoWrap(); - if ((u8)(retval + 1) < 3) - { - Menu_EraseScreen(); - BasicInitMenuWindow(&gWindowTemplate_81E7080); - } - return retval; -} - -static void sub_8136C6C(void) -{ - BasicInitMenuWindow(&gWindowTemplate_81E709C); - Menu_DrawStdWindowFrame(0, 16, 29, 19); - for (gUnknown_02039304->unk53 = 0; gUnknown_02039304->unk53 < 5 && gUnknown_02039304->unk61[gUnknown_02039304->unk53] == 0; gUnknown_02039304->unk53++); - if (gUnknown_02039304->unk53 < 5) - { - Pokeblock_BufferEnhancedStatText(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, gUnknown_02039304->unk61[gUnknown_02039304->unk53]); - } - else - { - Pokeblock_BufferEnhancedStatText(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, 0); - } - Pokeblock_MenuWindowTextPrint(gUnknown_02039304->stringBuffer); -} - -static bool8 sub_8136D00(void) -{ - while (1) - { - gUnknown_02039304->unk53++; - if (gUnknown_02039304->unk53 < 5) - { - if (gUnknown_02039304->unk61[gUnknown_02039304->unk53] != 0) - break; - } - else - { - gUnknown_02039304->unk53 = 5; - return FALSE; - } - } - Pokeblock_BufferEnhancedStatText(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, gUnknown_02039304->unk61[gUnknown_02039304->unk53]); - Pokeblock_MenuWindowTextPrint(gUnknown_02039304->stringBuffer); - return TRUE; -} - -static void sub_8136D60(void) -{ - BasicInitMenuWindow(&gWindowTemplate_81E709C); - Menu_DrawStdWindowFrame(0, 16, 29, 19); - Menu_PrintText(gOtherText_WontEat, 1, 17); -} - -static void sub_8136D8C(void) -{ - Menu_EraseScreen(); - BasicInitMenuWindow(&gWindowTemplate_81E7080); -} - -static void Pokeblock_MenuWindowTextPrint(const u8 *message) -{ - Menu_DrawStdWindowFrame(0, 16, 29, 19); - Menu_PrintText(message, 1, 17); -} - -#ifdef NONMATCHING -static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 statID, s16 a2) -{ - if (a2 != 0) - { - StringCopy(dest, sContextStatNames[statID]); - StringAppend(dest, gOtherText_WasEnhanced); - } - else - { - StringCopy(dest, gOtherText_NothingChanged); - } -} -#else -__attribute__((naked)) -static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 a1, s16 a2) -{ - asm_unified("\tpush {r4,lr}\n" - "\tadds r4, r0, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r3, r1, 24\n" - "\tlsls r2, 16\n" - "\tlsrs r0, r2, 16\n" - "\tasrs r2, 16\n" - "\tcmp r2, 0\n" - "\tbeq _08136DFC\n" - "\tcmp r2, 0\n" - "\tble _08136DD8\n" - "\tmovs r0, 0\n" - "_08136DD8:\n" - "\tlsls r0, 16\n" - "\tldr r1, _08136DF4 @ =sContextStatNames\n" - "\tlsls r0, r3, 2\n" - "\tadds r0, r1\n" - "\tldr r1, [r0]\n" - "\tadds r0, r4, 0\n" - "\tbl StringCopy\n" - "\tldr r1, _08136DF8 @ =gOtherText_WasEnhanced\n" - "\tadds r0, r4, 0\n" - "\tbl StringAppend\n" - "\tb _08136E04\n" - "\t.align 2, 0\n" - "_08136DF4: .4byte sContextStatNames\n" - "_08136DF8: .4byte gOtherText_WasEnhanced\n" - "_08136DFC:\n" - "\tldr r1, _08136E0C @ =gOtherText_NothingChanged\n" - "\tadds r0, r4, 0\n" - "\tbl StringCopy\n" - "_08136E04:\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08136E0C: .4byte gOtherText_NothingChanged"); -} -#endif - -static void Pokeblock_GetMonContestStats(struct Pokemon *pokemon, u8 *data) -{ - u16 i; - for (i=0; i<5; i++) - { - data[i] = GetMonData(pokemon, sContestStatsMonData[i]); - } -} - -static void sub_8136E40(struct Pokeblock *pokeblock, struct Pokemon *pokemon) -{ - u16 i; - s16 cstat; - u8 data; - if (GetMonData(pokemon, MON_DATA_SHEEN) != 255) - { - sub_8136F74(pokeblock, pokemon); - for (i=0; i<5; i++) - { - data = GetMonData(pokemon, sContestStatsMonData[i]); - cstat = data + gUnknown_02039304->unk66[i]; - if (cstat < 0) - cstat = 0; - if (cstat > 255) - cstat = 255; - data = cstat; - SetMonData(pokemon, sContestStatsMonData[i], &data); - } - cstat = (u8)GetMonData(pokemon, MON_DATA_SHEEN); - cstat = cstat + pokeblock->feel; - if (cstat > 255) - cstat = 255; - data = cstat; - SetMonData(pokemon, MON_DATA_SHEEN, &data); - } -} - -static void sub_8136EF0(void) -{ - u16 i; - struct Pokemon *pokemon = gPlayerParty; - pokemon += gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx; - Pokeblock_GetMonContestStats(pokemon, gUnknown_02039304->unk57); - sub_8136E40(gUnknown_02039304->pokeblock, pokemon); - Pokeblock_GetMonContestStats(pokemon, gUnknown_02039304->unk5c); - for (i=0; i<5; i++) - { - gUnknown_02039304->unk61[i] = gUnknown_02039304->unk5c[i] - gUnknown_02039304->unk57[i]; - } -} - -static void sub_8136F74(struct Pokeblock *pokeblock, struct Pokemon *pokemon) -{ - s8 direction; - s8 i; - s16 amount; - s8 boost; - s8 taste; - gUnknown_02039304->unk66[0] = pokeblock->spicy; - gUnknown_02039304->unk66[1] = pokeblock->sour; - gUnknown_02039304->unk66[2] = pokeblock->bitter; - gUnknown_02039304->unk66[3] = pokeblock->sweet; - gUnknown_02039304->unk66[4] = pokeblock->dry; - if (gPokeblockGain > 0) - direction = 1; - else if (gPokeblockGain < 0) - direction = -1; - else - return; - for (i=0; i<5; i++) - { - amount = gUnknown_02039304->unk66[i]; - boost = amount / 10; - if (amount % 10 >= 5) // round to the nearest - boost++; - taste = sub_8040A54(pokemon, gUnknown_0840612C[i]); - if (taste == direction) - { - gUnknown_02039304->unk66[i] += boost * taste; - } - } -} - -static bool8 sub_8137058(void) -{ - struct Pokemon *pokemon = gPlayerParty; - pokemon += gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx; - if (GetMonData(pokemon, MON_DATA_SHEEN) == 255) - return TRUE; - return FALSE; -} - -static u8 sub_81370A4(u8 a0) -{ - u8 i; - for (i=0; iunk54 = 0; - for (flavor=0; flavor<5; flavor++) - { - if (gUnknown_02039304->unk61[flavor] != 0) - { - spriteidx = CreateSprite(&gSpriteTemplate_840618C, gUnknown_08406158[flavor][0], gUnknown_08406158[flavor][1], 0); - if (spriteidx != MAX_SPRITES) - { - if (gUnknown_02039304->unk61[flavor] != 0) - { - gSprites[spriteidx].callback = sub_81371DC; - } - gUnknown_02039304->unk54++; - } - } - } -} - -static void sub_81371DC(struct Sprite *sprite) -{ - if (sprite->data[0] <= 5) - sprite->pos2.y -= 2; - else if (sprite->data[0] <= 11) - sprite->pos2.y += 2; - if ((++sprite->data[0]) > 60) - { - DestroySprite(sprite); - gUnknown_02039304->unk54--; - } -} diff --git a/src/field/wallclock.c b/src/field/wallclock.c deleted file mode 100644 index 1f743a61a..000000000 --- a/src/field/wallclock.c +++ /dev/null @@ -1,1046 +0,0 @@ -#include "global.h" -#include "wallclock.h" -#include "decompress.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "rtc.h" -#include "constants/songs.h" -#include "sound.h" -#include "strings2.h" -#include "task.h" -#include "trig.h" -#include "scanline_effect.h" - -extern u16 gSpecialVar_0x8004; -extern u8 gMiscClock_Gfx[]; -extern u8 gUnknown_08E95774[]; -extern u8 gUnknown_08E954B0[]; -extern u16 gMiscClockMale_Pal[]; -extern u16 gMiscClockFemale_Pal[]; - -//-------------------------------------------------- -// Graphics Data -//-------------------------------------------------- - -static const u8 ClockGfx_Misc[] = INCBIN_U8("graphics/misc/clock_misc.4bpp.lz"); -static const struct CompressedSpriteSheet gUnknown_083F7A90[] = -{ - {ClockGfx_Misc, 0x2000, 0x1000}, - {NULL}, -}; -static const struct SpritePalette gUnknown_083F7AA0[] = -{ - {gMiscClockMale_Pal, 0x1000}, - {gMiscClockFemale_Pal, 0x1001}, - {NULL}, -}; -static const struct OamData gOamData_83F7AB8 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_83F7AC0[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83F7AC8[] = -{ - ANIMCMD_FRAME(64, 30), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7AD0[] = -{ - gSpriteAnim_83F7AC0, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7AD4[] = -{ - gSpriteAnim_83F7AC8, -}; -static void sub_810B05C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F7AD8 = -{ - .tileTag = 0x1000, - .paletteTag = 0x1000, - .oam = &gOamData_83F7AB8, - .anims = gSpriteAnimTable_83F7AD0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B05C, -}; -static void sub_810B0F4(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F7AF0 = -{ - .tileTag = 0x1000, - .paletteTag = 0x1000, - .oam = &gOamData_83F7AB8, - .anims = gSpriteAnimTable_83F7AD4, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B0F4, -}; -static const struct OamData gOamData_83F7B08 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_83F7B10[] = -{ - ANIMCMD_FRAME(132, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83F7B18[] = -{ - ANIMCMD_FRAME(128, 30), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7B20[] = -{ - gSpriteAnim_83F7B10, -}; -static const union AnimCmd *const gSpriteAnimTable_83F7B24[] = -{ - gSpriteAnim_83F7B18, -}; -static void sub_810B18C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F7B28 = -{ - .tileTag = 0x1000, - .paletteTag = 0x1000, - .oam = &gOamData_83F7B08, - .anims = gSpriteAnimTable_83F7B20, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B18C, -}; -static void sub_810B230(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_83F7B40 = -{ - .tileTag = 0x1000, - .paletteTag = 0x1000, - .oam = &gOamData_83F7B08, - .anims = gSpriteAnimTable_83F7B24, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B230, -}; - -static void WallClockVblankCallback(void); -static void LoadWallClockGraphics(void); -static void WallClockMainCallback(void); -static void WallClockInit(void); -static void Task_SetClock1(u8 taskId); -static void Task_SetClock2(u8 taskId); -static void Task_SetClock3(u8 taskId); -static void Task_SetClock4(u8 taskId); -static void Task_SetClock5(u8 taskId); -static void Task_SetClock6(u8 taskId); -static void Task_ViewClock1(u8 taskId); -static void Task_ViewClock2(u8 taskId); -static void Task_ViewClock3(u8 taskId); -static void Task_ViewClock4(u8 taskId); -static u8 CalcMinHandDelta(u16 speed); -static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed); -static u8 AdvanceClock(u8 taskId, u8 direction); -static void UpdateClockPeriod(u8 taskId, u8 direction); -static void InitClockWithRtc(u8 taskId); - -enum -{ - PERIOD_AM, - PERIOD_PM, -}; - -enum -{ - MVMT_NONE, - MVMT_BACKWARD, - MVMT_FORWARD, -}; - -static void WallClockVblankCallback(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void LoadWallClockGraphics(void) -{ - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - - LZ77UnCompVram(gMiscClock_Gfx, (void *)VRAM); - if (gSpecialVar_0x8004 == MALE) - LoadPalette(gMiscClockMale_Pal, 0, 32); - else - LoadPalette(gMiscClockFemale_Pal, 0, 32); - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - FreeAllSpritePalettes(); - LoadCompressedObjectPic(&gUnknown_083F7A90[0]); - LoadSpritePalettes(gUnknown_083F7AA0); - Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); - InitMenuWindow(&gWindowTemplate_81E6CE4); -} - -static void WallClockInit(void) -{ - u16 ime; - - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(WallClockVblankCallback); - SetMainCallback2(WallClockMainCallback); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | - DISPCNT_BG3_ON | DISPCNT_OBJ_ON; -} - -#define tMinuteHandAngle data[0] -#define tHourHandAngle data[1] -#define tHours data[2] -#define tMinutes data[3] -#define tMvmtDir data[4] -#define tPeriod data[5] -#define tMvmtSpeed data[6] - -//Allow player to set the clock -void CB2_StartWallClock(void) -{ - u8 taskId; - u8 spriteId; - - LoadWallClockGraphics(); - LZ77UnCompVram(&gUnknown_08E954B0, (void *)(VRAM + 0x3800)); - - taskId = CreateTask(Task_SetClock1, 0); - gTasks[taskId].tHours = 10; - gTasks[taskId].tMinutes = 0; - gTasks[taskId].tMvmtDir = MVMT_NONE; - gTasks[taskId].tPeriod = PERIOD_AM; - gTasks[taskId].tMvmtSpeed = 0; - gTasks[taskId].tMinuteHandAngle = 0; - gTasks[taskId].tHourHandAngle = 300; - - spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 1); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].oam.matrixNum = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].oam.matrixNum = 1; - - spriteId = CreateSprite(&gSpriteTemplate_83F7B28, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = 45; - - spriteId = CreateSprite(&gSpriteTemplate_83F7B40, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = 90; - - WallClockInit(); -} - -//View, but don't set, the clock -void CB2_ViewWallClock(void) -{ - u8 taskId; - s16 angle1; - s16 angle2; - u8 spriteId; - - LoadWallClockGraphics(); - LZ77UnCompVram(gUnknown_08E95774, (void *)(VRAM + 0x3800)); - - taskId = CreateTask(Task_ViewClock1, 0); - InitClockWithRtc(taskId); - if (gTasks[taskId].tPeriod == PERIOD_AM) - { - angle1 = 45; - angle2 = 90; - } - else - { - angle1 = 90; - angle2 = 135; - } - - spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, 120, 80, 1); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].oam.matrixNum = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, 120, 80, 0); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].oam.matrixNum = 1; - - spriteId = CreateSprite(&gSpriteTemplate_83F7B28, 120, 80, 2); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = angle1; - - spriteId = CreateSprite(&gSpriteTemplate_83F7B40, 120, 80, 2); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = angle2; - - WallClockInit(); -} - -static void WallClockMainCallback(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void Task_SetClock1(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_SetClock2; -} - -//Handle keypresses when setting clock -static void Task_SetClock2(u8 taskId) -{ - if (gTasks[taskId].tMinuteHandAngle % 6) - { - gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle( - gTasks[taskId].tMinuteHandAngle, - gTasks[taskId].tMvmtDir, - gTasks[taskId].tMvmtSpeed); - } - else - { - gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; - gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; - if (gMain.newKeys & A_BUTTON) - { - gTasks[taskId].func = Task_SetClock3; - return; - } - else - { - gTasks[taskId].tMvmtDir = gMain.newKeys & A_BUTTON; - if (gMain.heldKeys & DPAD_LEFT) - gTasks[taskId].tMvmtDir = MVMT_BACKWARD; - if (gMain.heldKeys & DPAD_RIGHT) - gTasks[taskId].tMvmtDir = MVMT_FORWARD; - if (gTasks[taskId].tMvmtDir) - { - if (gTasks[taskId].tMvmtSpeed < 0xFF) - gTasks[taskId].tMvmtSpeed++; - gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle( - gTasks[taskId].tMinuteHandAngle, - gTasks[taskId].tMvmtDir, - gTasks[taskId].tMvmtSpeed); - AdvanceClock(taskId, gTasks[taskId].tMvmtDir); - } - else - { - gTasks[taskId].tMvmtSpeed = 0; - } - } - } -} - -//Ask player "Is this the correct time?" -static void Task_SetClock3(u8 taskId) -{ - Menu_DrawStdWindowFrame(2, 16, 27, 19); - Menu_PrintText(gOtherText_CorrectTimePrompt, 3, 17); - Menu_DrawStdWindowFrame(23, 8, 29, 13); - Menu_PrintItems(24, 9, 2, gMenuYesNoItems); - InitMenu(0, 24, 9, 2, 1, 5); - gTasks[taskId].func = Task_SetClock4; -} - -//Get menu selection -static void Task_SetClock4(u8 taskId) -{ - switch (Menu_ProcessInputNoWrap_()) - { - case 0: //YES - PlaySE(SE_SELECT); - gTasks[taskId].func = Task_SetClock5; //Move on - return; - case -1: //B button - case 1: //NO - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - Menu_EraseWindowRect(23, 8, 29, 13); - Menu_EraseWindowRect(2, 16, 27, 19); - gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock - } -} - -//Set the time offset based on the wall clock's time -static void Task_SetClock5(u8 taskId) -{ - RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = Task_SetClock6; -} - -static void Task_SetClock6(u8 taskId) -{ - if (!gPaletteFade.active) - SetMainCallback2((MainCallback)gMain.savedCallback); -} - -static void Task_ViewClock1(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_ViewClock2; -} - -//Wait for A or B press -static void Task_ViewClock2(u8 taskId) -{ - InitClockWithRtc(taskId); - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - gTasks[taskId].func = Task_ViewClock3; -} - -static void Task_ViewClock3(u8 taskId) -{ - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = Task_ViewClock4; -} - -static void Task_ViewClock4(u8 taskId) -{ - if (!gPaletteFade.active) - SetMainCallback2((MainCallback)gMain.savedCallback); -} - -static u8 CalcMinHandDelta(u16 speed) -{ - if (speed > 60) - return 6; - else if (speed > 30) - return 3; - else if (speed > 10) - return 2; - else - return 1; -} - -//Calculates the new angle of the minute hand when setting the clock -static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed) -{ - u8 delta = CalcMinHandDelta(speed); - - switch (direction) - { - case MVMT_BACKWARD: - if (angle) - angle = angle - delta; - else - angle = 360 - delta; - break; - case MVMT_FORWARD: - if (angle < 360 - delta) - angle = angle + delta; - else - angle = 0; - break; - } - return angle; -} - -//Advances clock forward or backward by 1 minute -static u8 AdvanceClock(u8 taskId, u8 direction) -{ - switch (direction) - { - case MVMT_BACKWARD: - if (gTasks[taskId].tMinutes > 0) - gTasks[taskId].tMinutes--; - else - { - gTasks[taskId].tMinutes = 59; - if (gTasks[taskId].tHours > 0) - gTasks[taskId].tHours--; - else - gTasks[taskId].tHours = 23; - UpdateClockPeriod(taskId, direction); - } - break; - case MVMT_FORWARD: - if (gTasks[taskId].tMinutes < 59) - gTasks[taskId].tMinutes++; - else - { - gTasks[taskId].tMinutes = 0; - if (gTasks[taskId].tHours < 23) - gTasks[taskId].tHours++; - else - gTasks[taskId].tHours = 0; - UpdateClockPeriod(taskId, direction); - } - break; - } - return 0; -} - -//Updates the clock period (AM/PM) if it needs to change -static void UpdateClockPeriod(u8 taskId, u8 direction) -{ - u8 hours = gTasks[taskId].tHours; - - switch (direction) - { - case MVMT_BACKWARD: - switch (hours) - { - case 11: - gTasks[taskId].tPeriod = PERIOD_AM; - break; - case 23: - gTasks[taskId].tPeriod = PERIOD_PM; - break; - } - break; - case MVMT_FORWARD: - switch (hours) - { - case 0: - gTasks[taskId].tPeriod = PERIOD_AM; - break; - case 12: - gTasks[taskId].tPeriod = PERIOD_PM; - break; - } - break; - } -} - -static void InitClockWithRtc(u8 taskId) -{ - RtcCalcLocalTime(); - gTasks[taskId].tHours = gLocalTime.hours; - gTasks[taskId].tMinutes = gLocalTime.minutes; - gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; - gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; - if (gLocalTime.hours <= 11) - gTasks[taskId].tPeriod = PERIOD_AM; - else - gTasks[taskId].tPeriod = PERIOD_PM; -} - -static const s8 gClockHandCoords[][2] = -{ - { 0, -24}, - { 1, -25}, - { 1, -25}, - { 2, -25}, - { 2, -25}, - { 2, -25}, - { 3, -24}, - { 3, -25}, - { 4, -25}, - { 4, -25}, - { 4, -25}, - { 5, -25}, - { 5, -25}, - { 6, -24}, - { 6, -24}, - { 6, -24}, - { 7, -24}, - { 7, -24}, - { 7, -24}, - { 8, -24}, - { 8, -24}, - { 9, -24}, - { 9, -24}, - { 10, -23}, - { 10, -23}, - { 11, -22}, - { 11, -22}, - { 11, -22}, - { 12, -22}, - { 12, -21}, - { 13, -21}, - { 13, -21}, - { 13, -21}, - { 14, -21}, - { 14, -21}, - { 14, -20}, - { 14, -20}, - { 15, -20}, - { 15, -19}, - { 16, -19}, - { 16, -19}, - { 16, -19}, - { 16, -18}, - { 16, -18}, - { 17, -18}, - { 17, -17}, - { 17, -17}, - { 18, -17}, - { 18, -17}, - { 18, -16}, - { 18, -16}, - { 19, -16}, - { 19, -15}, - { 19, -15}, - { 20, -15}, - { 20, -14}, - { 20, -14}, - { 20, -13}, - { 20, -13}, - { 21, -13}, - { 21, -13}, - { 21, -12}, - { 22, -12}, - { 22, -12}, - { 22, -11}, - { 22, -11}, - { 22, -10}, - { 23, -10}, - { 23, -9}, - { 23, -9}, - { 23, -9}, - { 23, -9}, - { 23, -8}, - { 23, -8}, - { 23, -7}, - { 23, -7}, - { 23, -6}, - { 24, -6}, - { 24, -6}, - { 25, -5}, - { 25, -5}, - { 24, -4}, - { 25, -4}, - { 24, -3}, - { 25, -3}, - { 25, -3}, - { 25, -2}, - { 25, -2}, - { 24, -1}, - { 25, -1}, - { 24, 0}, - { 24, 0}, - { 24, 0}, - { 24, 1}, - { 24, 1}, - { 25, 2}, - { 24, 2}, - { 25, 2}, - { 24, 3}, - { 24, 3}, - { 25, 4}, - { 24, 4}, - { 24, 5}, - { 24, 5}, - { 24, 5}, - { 24, 6}, - { 23, 6}, - { 23, 6}, - { 23, 7}, - { 23, 8}, - { 23, 8}, - { 23, 8}, - { 23, 9}, - { 23, 9}, - { 23, 10}, - { 22, 10}, - { 22, 10}, - { 22, 11}, - { 22, 11}, - { 22, 11}, - { 22, 12}, - { 21, 12}, - { 21, 12}, - { 21, 13}, - { 20, 13}, - { 20, 13}, - { 19, 13}, - { 19, 13}, - { 19, 14}, - { 19, 14}, - { 19, 15}, - { 19, 15}, - { 18, 15}, - { 18, 16}, - { 17, 16}, - { 17, 16}, - { 17, 17}, - { 17, 17}, - { 16, 17}, - { 16, 18}, - { 16, 18}, - { 15, 18}, - { 14, 18}, - { 15, 19}, - { 14, 19}, - { 14, 19}, - { 13, 19}, - { 13, 20}, - { 13, 20}, - { 13, 20}, - { 12, 20}, - { 12, 20}, - { 12, 21}, - { 11, 21}, - { 11, 21}, - { 11, 21}, - { 10, 21}, - { 10, 22}, - { 10, 22}, - { 9, 22}, - { 9, 22}, - { 8, 22}, - { 7, 22}, - { 7, 23}, - { 7, 23}, - { 6, 23}, - { 6, 23}, - { 5, 23}, - { 5, 23}, - { 5, 24}, - { 4, 24}, - { 4, 24}, - { 4, 24}, - { 3, 24}, - { 2, 24}, - { 2, 24}, - { 1, 24}, - { 1, 24}, - { 0, 24}, - { 0, 24}, - { -1, 23}, - { 0, 24}, - { 0, 24}, - { -1, 24}, - { -1, 24}, - { -2, 24}, - { -2, 24}, - { -3, 24}, - { -3, 24}, - { -4, 24}, - { -4, 24}, - { -5, 24}, - { -5, 23}, - { -5, 23}, - { -6, 23}, - { -6, 23}, - { -7, 23}, - { -7, 23}, - { -7, 23}, - { -8, 23}, - { -8, 22}, - { -9, 22}, - { -9, 22}, - {-10, 22}, - {-10, 22}, - {-10, 21}, - {-11, 21}, - {-11, 21}, - {-11, 21}, - {-11, 20}, - {-12, 20}, - {-12, 20}, - {-13, 20}, - {-13, 20}, - {-13, 19}, - {-14, 19}, - {-14, 19}, - {-14, 19}, - {-14, 18}, - {-15, 18}, - {-15, 18}, - {-15, 17}, - {-16, 17}, - {-16, 17}, - {-17, 17}, - {-17, 16}, - {-17, 16}, - {-18, 16}, - {-17, 15}, - {-18, 15}, - {-18, 15}, - {-19, 15}, - {-19, 14}, - {-19, 14}, - {-19, 13}, - {-19, 13}, - {-20, 13}, - {-20, 12}, - {-20, 12}, - {-21, 12}, - {-21, 12}, - {-21, 11}, - {-21, 11}, - {-21, 10}, - {-21, 10}, - {-21, 9}, - {-22, 9}, - {-22, 9}, - {-22, 8}, - {-22, 8}, - {-22, 7}, - {-23, 7}, - {-23, 7}, - {-23, 6}, - {-23, 6}, - {-23, 5}, - {-24, 5}, - {-23, 4}, - {-23, 4}, - {-24, 4}, - {-24, 4}, - {-24, 3}, - {-24, 3}, - {-24, 2}, - {-24, 2}, - {-24, 1}, - {-24, 1}, - {-24, 1}, - {-24, 0}, - {-25, 0}, - {-24, -1}, - {-25, -1}, - {-24, -1}, - {-24, -2}, - {-24, -2}, - {-24, -3}, - {-24, -3}, - {-24, -4}, - {-24, -4}, - {-24, -4}, - {-24, -5}, - {-24, -5}, - {-24, -6}, - {-24, -6}, - {-23, -6}, - {-23, -7}, - {-23, -7}, - {-23, -8}, - {-23, -8}, - {-23, -9}, - {-23, -9}, - {-22, -9}, - {-22, -9}, - {-22, -10}, - {-22, -10}, - {-21, -10}, - {-21, -11}, - {-22, -11}, - {-22, -12}, - {-21, -12}, - {-21, -13}, - {-21, -13}, - {-20, -13}, - {-21, -14}, - {-20, -14}, - {-20, -14}, - {-19, -14}, - {-19, -15}, - {-19, -15}, - {-18, -16}, - {-18, -16}, - {-18, -16}, - {-18, -17}, - {-18, -17}, - {-17, -17}, - {-17, -18}, - {-17, -18}, - {-16, -18}, - {-16, -18}, - {-16, -19}, - {-16, -19}, - {-15, -19}, - {-15, -19}, - {-15, -20}, - {-14, -20}, - {-14, -20}, - {-14, -21}, - {-13, -21}, - {-13, -21}, - {-13, -21}, - {-12, -21}, - {-12, -22}, - {-11, -22}, - {-11, -22}, - {-11, -22}, - {-10, -22}, - {-10, -22}, - { -9, -22}, - { -9, -23}, - { -9, -23}, - { -8, -23}, - { -8, -23}, - { -7, -23}, - { -7, -23}, - { -7, -24}, - { -6, -24}, - { -6, -24}, - { -5, -24}, - { -5, -24}, - { -4, -24}, - { -4, -24}, - { -4, -24}, - { -4, -25}, - { -3, -25}, - { -2, -25}, - { -2, -24}, - { -2, -24}, - { -1, -25}, - { -1, -25}, - { 0, -25}, -}; - -static void sub_810B05C(struct Sprite *sprite) -{ - u16 angle; - s16 sin; - s16 cos; - u16 x; - u16 y; - - angle = gTasks[sprite->data[0]].tMinuteHandAngle; - sin = Sin2(angle) / 16; - cos = Cos2(angle) / 16; - SetOamMatrix(0, cos, sin, -sin, cos); - x = gClockHandCoords[angle][0]; - y = gClockHandCoords[angle][1]; - - //Manual sign extension - if (x > 0x80) - x |= 0xFF00; - if (y > 0x80) - y |= 0xFF00; - - sprite->pos2.x = x; - sprite->pos2.y = y; -} - -static void sub_810B0F4(struct Sprite *sprite) -{ - u16 angle; - s16 sin; - s16 cos; - u16 x; - u16 y; - - angle = gTasks[sprite->data[0]].tHourHandAngle; - sin = Sin2(angle) / 16; - cos = Cos2(angle) / 16; - SetOamMatrix(1, cos, sin, -sin, cos); - x = gClockHandCoords[angle][0]; - y = gClockHandCoords[angle][1]; - - //Manual sign extension - if (x > 0x80) - x |= 0xFF00; - if (y > 0x80) - y |= 0xFF00; - - sprite->pos2.x = x; - sprite->pos2.y = y; -} - -static void sub_810B18C(struct Sprite *sprite) -{ - s16 sin; - s16 cos; - - if (gTasks[sprite->data[0]].tPeriod != PERIOD_AM) - { - if (sprite->data[1] >= 60 && sprite->data[1] < 90) - sprite->data[1] += 5; - if (sprite->data[1] < 60) - sprite->data[1]++; - } - else - { - if (sprite->data[1] > 45 && sprite->data[1] <= 75) - sprite->data[1] -= 5; - if (sprite->data[1] > 75) - sprite->data[1]--; - } - cos = Cos2((u16)sprite->data[1]); - sprite->pos2.x = cos * 30 / 4096; - sin = Sin2((u16)sprite->data[1]); - sprite->pos2.y = sin * 30 / 4096; -} - -static void sub_810B230(struct Sprite *sprite) -{ - s16 sin; - s16 cos; - - if (gTasks[sprite->data[0]].tPeriod != PERIOD_AM) - { - if (sprite->data[1] >= 105 && sprite->data[1] < 135) - sprite->data[1] += 5; - if (sprite->data[1] < 105) - sprite->data[1]++; - } - else - { - if (sprite->data[1] > 90 && sprite->data[1] <= 120) - sprite->data[1] -= 5; - if (sprite->data[1] > 120) - sprite->data[1]--; - } - cos = Cos2((u16)sprite->data[1]); - sprite->pos2.x = cos * 30 / 4096; - sin = Sin2((u16)sprite->data[1]); - sprite->pos2.y = sin * 30 / 4096; -} diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c deleted file mode 100644 index 19778e29b..000000000 --- a/src/field/wild_encounter.c +++ /dev/null @@ -1,4398 +0,0 @@ -#include "global.h" -#include "wild_encounter.h" -#include "constants/abilities.h" -#include "battle_setup.h" -#include "event_data.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "constants/maps.h" -#include "metatile_behavior.h" -#include "pokeblock.h" -#include "random.h" -#include "roamer.h" -#include "overworld.h" -#include "safari_zone.h" -#include "script.h" -#include "constants/species.h" -#include "tv.h" - -const struct WildPokemon PetalburgCity_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, -}; -const struct WildPokemonInfo PetalburgCity_WaterMonsInfo = {1, PetalburgCity_WaterMons}; - -const struct WildPokemon PetalburgCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_CORPHISH}, - {25, 30, SPECIES_CORPHISH}, - {30, 35, SPECIES_CORPHISH}, - {20, 25, SPECIES_CORPHISH}, - {35, 40, SPECIES_CORPHISH}, - {40, 45, SPECIES_CORPHISH}, -}; -const struct WildPokemonInfo PetalburgCity_FishingMonsInfo = {10, PetalburgCity_FishingMons}; - -const struct WildPokemon SlateportCity_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo SlateportCity_WaterMonsInfo = {4, SlateportCity_WaterMons}; - -const struct WildPokemon SlateportCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo SlateportCity_FishingMonsInfo = {10, SlateportCity_FishingMons}; - -const struct WildPokemon LilycoveCity_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo LilycoveCity_WaterMonsInfo = {4, LilycoveCity_WaterMons}; - -const struct WildPokemon LilycoveCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_STARYU}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo LilycoveCity_FishingMonsInfo = {10, LilycoveCity_FishingMons}; - -const struct WildPokemon MossdeepCity_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo MossdeepCity_WaterMonsInfo = {4, MossdeepCity_WaterMons}; - -const struct WildPokemon MossdeepCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo MossdeepCity_FishingMonsInfo = {10, MossdeepCity_FishingMons}; - -const struct WildPokemon SootopolisCity_WaterMons [] = -{ - {5, 35, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {15, 25, SPECIES_MAGIKARP}, - {25, 30, SPECIES_MAGIKARP}, - {25, 30, SPECIES_MAGIKARP}, -}; -const struct WildPokemonInfo SootopolisCity_WaterMonsInfo = {1, SootopolisCity_WaterMons}; - -const struct WildPokemon SootopolisCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, -#ifdef SAPPHIRE - {5, 10, SPECIES_TENTACOOL}, -#else - {10, 15, SPECIES_MAGIKARP}, -#endif - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {30, 35, SPECIES_MAGIKARP}, - {30, 35, SPECIES_MAGIKARP}, - {35, 40, SPECIES_GYARADOS}, - {35, 45, SPECIES_GYARADOS}, - {5, 45, SPECIES_GYARADOS}, -}; -const struct WildPokemonInfo SootopolisCity_FishingMonsInfo = {10, SootopolisCity_FishingMons}; - -const struct WildPokemon EverGrandeCity_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo EverGrandeCity_WaterMonsInfo = {4, EverGrandeCity_WaterMons}; - -const struct WildPokemon EverGrandeCity_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_LUVDISC}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_LUVDISC}, - {30, 35, SPECIES_WAILMER}, - {30, 35, SPECIES_CORSOLA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo EverGrandeCity_FishingMonsInfo = {10, EverGrandeCity_FishingMons}; - -const struct WildPokemon MeteorFalls_1F_1R_LandMons [] = -{ - {16, 16, SPECIES_ZUBAT}, - {17, 17, SPECIES_ZUBAT}, - {18, 18, SPECIES_ZUBAT}, - {15, 15, SPECIES_ZUBAT}, - {14, 14, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {16, 16, SPECIES_LUNATONE}, - {18, 18, SPECIES_LUNATONE}, - {14, 14, SPECIES_LUNATONE}, -#else - {16, 16, SPECIES_SOLROCK}, - {18, 18, SPECIES_SOLROCK}, - {14, 14, SPECIES_SOLROCK}, -#endif - {19, 19, SPECIES_ZUBAT}, - {20, 20, SPECIES_ZUBAT}, - {19, 19, SPECIES_ZUBAT}, - {20, 20, SPECIES_ZUBAT}, -}; -const struct WildPokemonInfo MeteorFalls_1F_1R_LandMonsInfo = {10, MeteorFalls_1F_1R_LandMons}; - -const struct WildPokemon MeteorFalls_1F_1R_WaterMons [] = -{ - {5, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {25, 35, SPECIES_LUNATONE}, - {15, 25, SPECIES_LUNATONE}, - {5, 15, SPECIES_LUNATONE}, -#else - {25, 35, SPECIES_SOLROCK}, - {15, 25, SPECIES_SOLROCK}, - {5, 15, SPECIES_SOLROCK}, -#endif -}; -const struct WildPokemonInfo MeteorFalls_1F_1R_WaterMonsInfo = {4, MeteorFalls_1F_1R_WaterMons}; - -const struct WildPokemon MeteorFalls_1F_1R_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {20, 25, SPECIES_BARBOACH}, - {35, 40, SPECIES_BARBOACH}, - {40, 45, SPECIES_BARBOACH}, -}; -const struct WildPokemonInfo MeteorFalls_1F_1R_FishingMonsInfo = {30, MeteorFalls_1F_1R_FishingMons}; - -const struct WildPokemon MeteorFalls_1F_2R_LandMons [] = -{ - {33, 33, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {35, 35, SPECIES_LUNATONE}, - {33, 33, SPECIES_LUNATONE}, - {37, 37, SPECIES_LUNATONE}, -#else - {35, 35, SPECIES_SOLROCK}, - {33, 33, SPECIES_SOLROCK}, - {37, 37, SPECIES_SOLROCK}, -#endif - {35, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {39, 39, SPECIES_LUNATONE}, -#else - {39, 39, SPECIES_SOLROCK}, -#endif - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo MeteorFalls_1F_2R_LandMonsInfo = {10, MeteorFalls_1F_2R_LandMons}; - -const struct WildPokemon MeteorFalls_1F_2R_WaterMons [] = -{ - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {25, 35, SPECIES_LUNATONE}, - {15, 25, SPECIES_LUNATONE}, - {5, 15, SPECIES_LUNATONE}, -#else - {25, 35, SPECIES_SOLROCK}, - {15, 25, SPECIES_SOLROCK}, - {5, 15, SPECIES_SOLROCK}, -#endif -}; -const struct WildPokemonInfo MeteorFalls_1F_2R_WaterMonsInfo = {4, MeteorFalls_1F_2R_WaterMons}; - -const struct WildPokemon MeteorFalls_1F_2R_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {30, 35, SPECIES_WHISCASH}, - {35, 40, SPECIES_WHISCASH}, - {40, 45, SPECIES_WHISCASH}, -}; -const struct WildPokemonInfo MeteorFalls_1F_2R_FishingMonsInfo = {30, MeteorFalls_1F_2R_FishingMons}; - -const struct WildPokemon MeteorFalls_B1F_1R_LandMons [] = -{ - {33, 33, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {35, 35, SPECIES_LUNATONE}, - {33, 33, SPECIES_LUNATONE}, - {37, 37, SPECIES_LUNATONE}, -#else - {35, 35, SPECIES_SOLROCK}, - {33, 33, SPECIES_SOLROCK}, - {37, 37, SPECIES_SOLROCK}, -#endif - {35, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {39, 39, SPECIES_LUNATONE}, -#else - {39, 39, SPECIES_SOLROCK}, -#endif - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo MeteorFalls_B1F_1R_LandMonsInfo = {10, MeteorFalls_B1F_1R_LandMons}; - -const struct WildPokemon MeteorFalls_B1F_1R_WaterMons [] = -{ - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {25, 35, SPECIES_LUNATONE}, - {15, 25, SPECIES_LUNATONE}, - {5, 15, SPECIES_LUNATONE}, -#else - {25, 35, SPECIES_SOLROCK}, - {15, 25, SPECIES_SOLROCK}, - {5, 15, SPECIES_SOLROCK}, -#endif -}; -const struct WildPokemonInfo MeteorFalls_B1F_1R_WaterMonsInfo = {4, MeteorFalls_B1F_1R_WaterMons}; - -const struct WildPokemon MeteorFalls_B1F_1R_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {30, 35, SPECIES_WHISCASH}, - {35, 40, SPECIES_WHISCASH}, - {40, 45, SPECIES_WHISCASH}, -}; -const struct WildPokemonInfo MeteorFalls_B1F_1R_FishingMonsInfo = {30, MeteorFalls_B1F_1R_FishingMons}; - -const struct WildPokemon MeteorFalls_B1F_2R_LandMons [] = -{ - {33, 33, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {30, 30, SPECIES_BAGON}, -#ifdef SAPPHIRE - {35, 35, SPECIES_LUNATONE}, -#else - {35, 35, SPECIES_SOLROCK}, -#endif - {35, 35, SPECIES_BAGON}, -#ifdef SAPPHIRE - {37, 37, SPECIES_LUNATONE}, -#else - {37, 37, SPECIES_SOLROCK}, -#endif - {25, 25, SPECIES_BAGON}, -#ifdef SAPPHIRE - {39, 39, SPECIES_LUNATONE}, -#else - {39, 39, SPECIES_SOLROCK}, -#endif - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, - {38, 38, SPECIES_GOLBAT}, - {40, 40, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo MeteorFalls_B1F_2R_LandMonsInfo = {10, MeteorFalls_B1F_2R_LandMons}; - -const struct WildPokemon MeteorFalls_B1F_2R_WaterMons [] = -{ - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {25, 35, SPECIES_LUNATONE}, - {15, 25, SPECIES_LUNATONE}, - {5, 15, SPECIES_LUNATONE}, -#else - {25, 35, SPECIES_SOLROCK}, - {15, 25, SPECIES_SOLROCK}, - {5, 15, SPECIES_SOLROCK}, -#endif -}; -const struct WildPokemonInfo MeteorFalls_B1F_2R_WaterMonsInfo = {4, MeteorFalls_B1F_2R_WaterMons}; - -const struct WildPokemon MeteorFalls_B1F_2R_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {30, 35, SPECIES_WHISCASH}, - {35, 40, SPECIES_WHISCASH}, - {40, 45, SPECIES_WHISCASH}, -}; -const struct WildPokemonInfo MeteorFalls_B1F_2R_FishingMonsInfo = {30, MeteorFalls_B1F_2R_FishingMons}; - -const struct WildPokemon RusturfTunnel_LandMons [] = -{ - {6, 6, SPECIES_WHISMUR}, - {7, 7, SPECIES_WHISMUR}, - {6, 6, SPECIES_WHISMUR}, - {6, 6, SPECIES_WHISMUR}, - {7, 7, SPECIES_WHISMUR}, - {7, 7, SPECIES_WHISMUR}, - {5, 5, SPECIES_WHISMUR}, - {8, 8, SPECIES_WHISMUR}, - {5, 5, SPECIES_WHISMUR}, - {8, 8, SPECIES_WHISMUR}, - {5, 5, SPECIES_WHISMUR}, - {8, 8, SPECIES_WHISMUR}, -}; -const struct WildPokemonInfo RusturfTunnel_LandMonsInfo = {10, RusturfTunnel_LandMons}; - -const struct WildPokemon GraniteCave_1F_LandMons [] = -{ - {7, 7, SPECIES_ZUBAT}, - {8, 8, SPECIES_MAKUHITA}, - {7, 7, SPECIES_MAKUHITA}, - {8, 8, SPECIES_ZUBAT}, - {9, 9, SPECIES_MAKUHITA}, - {8, 8, SPECIES_ABRA}, - {10, 10, SPECIES_MAKUHITA}, - {6, 6, SPECIES_MAKUHITA}, - {7, 7, SPECIES_GEODUDE}, - {8, 8, SPECIES_GEODUDE}, - {6, 6, SPECIES_GEODUDE}, - {9, 9, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo GraniteCave_1F_LandMonsInfo = {10, GraniteCave_1F_LandMons}; - -const struct WildPokemon GraniteCave_B1F_LandMons [] = -{ - {9, 9, SPECIES_ZUBAT}, - {10, 10, SPECIES_ARON}, - {9, 9, SPECIES_ARON}, - {11, 11, SPECIES_ARON}, - {10, 10, SPECIES_ZUBAT}, - {9, 9, SPECIES_ABRA}, - {10, 10, SPECIES_MAKUHITA}, - {11, 11, SPECIES_MAKUHITA}, -#ifdef SAPPHIRE - {10, 10, SPECIES_SABLEYE}, - {10, 10, SPECIES_SABLEYE}, - {9, 9, SPECIES_SABLEYE}, - {11, 11, SPECIES_SABLEYE}, -#else - {10, 10, SPECIES_MAWILE}, - {10, 10, SPECIES_MAWILE}, - {9, 9, SPECIES_MAWILE}, - {11, 11, SPECIES_MAWILE}, -#endif -}; -const struct WildPokemonInfo GraniteCave_B1F_LandMonsInfo = {10, GraniteCave_B1F_LandMons}; - -const struct WildPokemon GraniteCave_B2F_LandMons [] = -{ - {10, 10, SPECIES_ZUBAT}, - {11, 11, SPECIES_ARON}, - {10, 10, SPECIES_ARON}, - {11, 11, SPECIES_ZUBAT}, - {12, 12, SPECIES_ARON}, - {10, 10, SPECIES_ABRA}, -#ifdef SAPPHIRE - {10, 10, SPECIES_SABLEYE}, - {11, 11, SPECIES_SABLEYE}, - {12, 12, SPECIES_SABLEYE}, - {10, 10, SPECIES_SABLEYE}, - {12, 12, SPECIES_SABLEYE}, - {10, 10, SPECIES_SABLEYE}, -#else - {10, 10, SPECIES_MAWILE}, - {11, 11, SPECIES_MAWILE}, - {12, 12, SPECIES_MAWILE}, - {10, 10, SPECIES_MAWILE}, - {12, 12, SPECIES_MAWILE}, - {10, 10, SPECIES_MAWILE}, -#endif -}; -const struct WildPokemonInfo GraniteCave_B2F_LandMonsInfo = {10, GraniteCave_B2F_LandMons}; - -const struct WildPokemon GraniteCave_B2F_RockSmashMons [] = -{ - {10, 15, SPECIES_GEODUDE}, - {10, 20, SPECIES_NOSEPASS}, - {5, 10, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo GraniteCave_B2F_RockSmashMonsInfo = {20, GraniteCave_B2F_RockSmashMons}; - -const struct WildPokemon GraniteCave_StevensRoom_LandMons [] = -{ - {7, 7, SPECIES_ZUBAT}, - {8, 8, SPECIES_MAKUHITA}, - {7, 7, SPECIES_MAKUHITA}, - {8, 8, SPECIES_ZUBAT}, - {9, 9, SPECIES_MAKUHITA}, - {8, 8, SPECIES_ABRA}, - {10, 10, SPECIES_MAKUHITA}, - {6, 6, SPECIES_MAKUHITA}, - {7, 7, SPECIES_ARON}, - {8, 8, SPECIES_ARON}, - {7, 7, SPECIES_ARON}, - {8, 8, SPECIES_ARON}, -}; -const struct WildPokemonInfo GraniteCave_StevensRoom_LandMonsInfo = {10, GraniteCave_StevensRoom_LandMons}; - -const struct WildPokemon PetalburgWoods_LandMons [] = -{ - {5, 5, SPECIES_ZIGZAGOON}, - {5, 5, SPECIES_WURMPLE}, - {5, 5, SPECIES_SHROOMISH}, - {6, 6, SPECIES_ZIGZAGOON}, - {5, 5, SPECIES_SILCOON}, - {5, 5, SPECIES_CASCOON}, - {6, 6, SPECIES_WURMPLE}, - {6, 6, SPECIES_SHROOMISH}, - {5, 5, SPECIES_TAILLOW}, - {5, 5, SPECIES_SLAKOTH}, - {6, 6, SPECIES_TAILLOW}, - {6, 6, SPECIES_SLAKOTH}, -}; -const struct WildPokemonInfo PetalburgWoods_LandMonsInfo = {20, PetalburgWoods_LandMons}; - -//Jagged Pass Pokemon are 2 levels higher on Sapphire -#ifdef SAPPHIRE -#define JAGGED_PASS_LEVEL_DIFF 2 -#else -#define JAGGED_PASS_LEVEL_DIFF 0 -#endif - -const struct WildPokemon JaggedPass_LandMons [] = -{ - {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, - {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, - {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, - {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, - {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, -}; -const struct WildPokemonInfo JaggedPass_LandMonsInfo = {20, JaggedPass_LandMons}; - -const struct WildPokemon FieryPath_LandMons [] = -{ - {15, 15, SPECIES_NUMEL}, -#ifdef SAPPHIRE - {15, 15, SPECIES_GRIMER}, -#else - {15, 15, SPECIES_KOFFING}, -#endif - {16, 16, SPECIES_NUMEL}, - {15, 15, SPECIES_MACHOP}, - {15, 15, SPECIES_TORKOAL}, - {15, 15, SPECIES_SLUGMA}, -#ifdef SAPPHIRE - {16, 16, SPECIES_GRIMER}, -#else - {16, 16, SPECIES_KOFFING}, -#endif - {16, 16, SPECIES_MACHOP}, - {14, 14, SPECIES_TORKOAL}, - {16, 16, SPECIES_TORKOAL}, -#ifdef SAPPHIRE - {14, 14, SPECIES_KOFFING}, - {14, 14, SPECIES_KOFFING}, -#else - {14, 14, SPECIES_GRIMER}, - {14, 14, SPECIES_GRIMER}, -#endif -}; -const struct WildPokemonInfo FieryPath_LandMonsInfo = {10, FieryPath_LandMons}; - -const struct WildPokemon MtPyre_1F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, -#endif -}; -const struct WildPokemonInfo MtPyre_1F_LandMonsInfo = {10, MtPyre_1F_LandMons}; - -const struct WildPokemon MtPyre_2F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, -#endif -}; -const struct WildPokemonInfo MtPyre_2F_LandMonsInfo = {10, MtPyre_2F_LandMons}; - -const struct WildPokemon MtPyre_3F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, -#endif -}; -const struct WildPokemonInfo MtPyre_3F_LandMonsInfo = {10, MtPyre_3F_LandMons}; - -const struct WildPokemon MtPyre_4F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {27, 27, SPECIES_DUSKULL}, - {27, 27, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {27, 27, SPECIES_SHUPPET}, - {27, 27, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, -#endif -}; -const struct WildPokemonInfo MtPyre_4F_LandMonsInfo = {10, MtPyre_4F_LandMons}; - -const struct WildPokemon MtPyre_5F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {27, 27, SPECIES_DUSKULL}, - {27, 27, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {27, 27, SPECIES_SHUPPET}, - {27, 27, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, -#endif -}; -const struct WildPokemonInfo MtPyre_5F_LandMonsInfo = {10, MtPyre_5F_LandMons}; - -const struct WildPokemon MtPyre_6F_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {23, 23, SPECIES_SHUPPET}, - {22, 22, SPECIES_SHUPPET}, - {27, 27, SPECIES_DUSKULL}, - {27, 27, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, -#else - {27, 27, SPECIES_DUSKULL}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {23, 23, SPECIES_DUSKULL}, - {22, 22, SPECIES_DUSKULL}, - {27, 27, SPECIES_SHUPPET}, - {27, 27, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, -#endif -}; -const struct WildPokemonInfo MtPyre_6F_LandMonsInfo = {10, MtPyre_6F_LandMons}; - -const struct WildPokemon MtPyre_Exterior_LandMons [] = -{ -#ifdef SAPPHIRE - {27, 27, SPECIES_SHUPPET}, -#else - {27, 27, SPECIES_DUSKULL}, -#endif - {27, 27, SPECIES_MEDITITE}, -#ifdef SAPPHIRE - {28, 28, SPECIES_SHUPPET}, -#else - {28, 28, SPECIES_DUSKULL}, -#endif - {29, 29, SPECIES_MEDITITE}, -#ifdef SAPPHIRE - {29, 29, SPECIES_SHUPPET}, -#else - {29, 29, SPECIES_DUSKULL}, -#endif - {27, 27, SPECIES_VULPIX}, - {29, 29, SPECIES_VULPIX}, - {25, 25, SPECIES_VULPIX}, - {27, 27, SPECIES_WINGULL}, - {27, 27, SPECIES_WINGULL}, - {26, 26, SPECIES_WINGULL}, - {28, 28, SPECIES_WINGULL}, -}; -const struct WildPokemonInfo MtPyre_Exterior_LandMonsInfo = {10, MtPyre_Exterior_LandMons}; - -const struct WildPokemon MtPyre_Summit_LandMons [] = -{ -#ifdef SAPPHIRE - {28, 28, SPECIES_SHUPPET}, - {29, 29, SPECIES_SHUPPET}, - {27, 27, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {30, 30, SPECIES_SHUPPET}, - {25, 25, SPECIES_SHUPPET}, - {24, 24, SPECIES_SHUPPET}, - {28, 28, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {30, 30, SPECIES_DUSKULL}, -#else - {28, 28, SPECIES_DUSKULL}, - {29, 29, SPECIES_DUSKULL}, - {27, 27, SPECIES_DUSKULL}, - {26, 26, SPECIES_DUSKULL}, - {30, 30, SPECIES_DUSKULL}, - {25, 25, SPECIES_DUSKULL}, - {24, 24, SPECIES_DUSKULL}, - {28, 28, SPECIES_SHUPPET}, - {26, 26, SPECIES_SHUPPET}, - {30, 30, SPECIES_SHUPPET}, -#endif - {28, 28, SPECIES_CHIMECHO}, - {28, 28, SPECIES_CHIMECHO}, -}; -const struct WildPokemonInfo MtPyre_Summit_LandMonsInfo = {10, MtPyre_Summit_LandMons}; - -const struct WildPokemon SeafloorCavern_Entrance_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Entrance_WaterMonsInfo = {4, SeafloorCavern_Entrance_WaterMons}; - -const struct WildPokemon SeafloorCavern_Entrance_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo SeafloorCavern_Entrance_FishingMonsInfo = {10, SeafloorCavern_Entrance_FishingMons}; - -const struct WildPokemon SeafloorCavern_Room1_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room1_LandMonsInfo = {4, SeafloorCavern_Room1_LandMons}; - -const struct WildPokemon SeafloorCavern_Room2_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room2_LandMonsInfo = {4, SeafloorCavern_Room2_LandMons}; - -const struct WildPokemon SeafloorCavern_Room3_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room3_LandMonsInfo = {4, SeafloorCavern_Room3_LandMons}; - -const struct WildPokemon SeafloorCavern_Room4_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room4_LandMonsInfo = {4, SeafloorCavern_Room4_LandMons}; - -const struct WildPokemon SeafloorCavern_Room5_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room5_LandMonsInfo = {4, SeafloorCavern_Room5_LandMons}; - -const struct WildPokemon SeafloorCavern_Room6_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room6_LandMonsInfo = {4, SeafloorCavern_Room6_LandMons}; - -const struct WildPokemon SeafloorCavern_Room6_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room6_WaterMonsInfo = {4, SeafloorCavern_Room6_WaterMons}; - -const struct WildPokemon SeafloorCavern_Room6_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo SeafloorCavern_Room6_FishingMonsInfo = {10, SeafloorCavern_Room6_FishingMons}; - -const struct WildPokemon SeafloorCavern_Room7_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room7_LandMonsInfo = {4, SeafloorCavern_Room7_LandMons}; - -const struct WildPokemon SeafloorCavern_Room7_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_ZUBAT}, - {30, 35, SPECIES_GOLBAT}, - {30, 35, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room7_WaterMonsInfo = {4, SeafloorCavern_Room7_WaterMons}; - -const struct WildPokemon SeafloorCavern_Room7_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo SeafloorCavern_Room7_FishingMonsInfo = {10, SeafloorCavern_Room7_FishingMons}; - -const struct WildPokemon SeafloorCavern_Room8_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo SeafloorCavern_Room8_LandMonsInfo = {4, SeafloorCavern_Room8_LandMons}; - -const struct WildPokemon CaveOfOrigin_Entrance_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, - {33, 33, SPECIES_ZUBAT}, - {28, 28, SPECIES_ZUBAT}, - {29, 29, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {35, 35, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_Entrance_LandMonsInfo = {4, CaveOfOrigin_Entrance_LandMons}; - -const struct WildPokemon CaveOfOrigin_1F_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {30, 30, SPECIES_SABLEYE}, - {32, 32, SPECIES_SABLEYE}, - {34, 34, SPECIES_SABLEYE}, -#else - {30, 30, SPECIES_MAWILE}, - {32, 32, SPECIES_MAWILE}, - {34, 34, SPECIES_MAWILE}, -#endif - {33, 33, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_1F_LandMonsInfo = {4, CaveOfOrigin_1F_LandMons}; - -const struct WildPokemon CaveOfOrigin_B1F_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {30, 30, SPECIES_SABLEYE}, - {32, 32, SPECIES_SABLEYE}, - {34, 34, SPECIES_SABLEYE}, -#else - {30, 30, SPECIES_MAWILE}, - {32, 32, SPECIES_MAWILE}, - {34, 34, SPECIES_MAWILE}, -#endif - {33, 33, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_B1F_LandMonsInfo = {4, CaveOfOrigin_B1F_LandMons}; - -const struct WildPokemon CaveOfOrigin_B2F_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {30, 30, SPECIES_SABLEYE}, - {32, 32, SPECIES_SABLEYE}, - {34, 34, SPECIES_SABLEYE}, -#else - {30, 30, SPECIES_MAWILE}, - {32, 32, SPECIES_MAWILE}, - {34, 34, SPECIES_MAWILE}, -#endif - {33, 33, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_B2F_LandMonsInfo = {4, CaveOfOrigin_B2F_LandMons}; - -const struct WildPokemon CaveOfOrigin_B3F_LandMons [] = -{ - {30, 30, SPECIES_ZUBAT}, - {31, 31, SPECIES_ZUBAT}, - {32, 32, SPECIES_ZUBAT}, -#ifdef SAPPHIRE - {30, 30, SPECIES_SABLEYE}, - {32, 32, SPECIES_SABLEYE}, - {34, 34, SPECIES_SABLEYE}, -#else - {30, 30, SPECIES_MAWILE}, - {32, 32, SPECIES_MAWILE}, - {34, 34, SPECIES_MAWILE}, -#endif - {33, 33, SPECIES_ZUBAT}, - {34, 34, SPECIES_ZUBAT}, - {34, 34, SPECIES_GOLBAT}, - {35, 35, SPECIES_GOLBAT}, - {33, 33, SPECIES_GOLBAT}, - {36, 36, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo CaveOfOrigin_B3F_LandMonsInfo = {4, CaveOfOrigin_B3F_LandMons}; - -const struct WildPokemon VictoryRoad_1F_LandMons [] = -{ - {40, 40, SPECIES_GOLBAT}, - {40, 40, SPECIES_HARIYAMA}, - {40, 40, SPECIES_LAIRON}, - {40, 40, SPECIES_LOUDRED}, - {36, 36, SPECIES_ZUBAT}, - {36, 36, SPECIES_MAKUHITA}, - {38, 38, SPECIES_GOLBAT}, - {38, 38, SPECIES_HARIYAMA}, - {36, 36, SPECIES_ARON}, - {36, 36, SPECIES_WHISMUR}, - {36, 36, SPECIES_ARON}, - {36, 36, SPECIES_WHISMUR}, -}; -const struct WildPokemonInfo VictoryRoad_1F_LandMonsInfo = {10, VictoryRoad_1F_LandMons}; - -const struct WildPokemon VictoryRoad_B1F_LandMons [] = -{ - {40, 40, SPECIES_GOLBAT}, - {40, 40, SPECIES_HARIYAMA}, - {40, 40, SPECIES_LAIRON}, - {40, 40, SPECIES_MEDICHAM}, - {38, 38, SPECIES_GOLBAT}, - {38, 38, SPECIES_HARIYAMA}, - {42, 42, SPECIES_GOLBAT}, - {42, 42, SPECIES_HARIYAMA}, - {42, 42, SPECIES_LAIRON}, - {38, 38, SPECIES_MEDITITE}, - {42, 42, SPECIES_LAIRON}, - {38, 38, SPECIES_MEDITITE}, -}; -const struct WildPokemonInfo VictoryRoad_B1F_LandMonsInfo = {10, VictoryRoad_B1F_LandMons}; - -const struct WildPokemon VictoryRoad_B1F_RockSmashMons [] = -{ - {30, 40, SPECIES_GRAVELER}, - {30, 40, SPECIES_GEODUDE}, - {35, 40, SPECIES_GRAVELER}, - {35, 40, SPECIES_GRAVELER}, - {35, 40, SPECIES_GRAVELER}, -}; -const struct WildPokemonInfo VictoryRoad_B1F_RockSmashMonsInfo = {20, VictoryRoad_B1F_RockSmashMons}; - -const struct WildPokemon VictoryRoad_B2F_LandMons [] = -{ - {40, 40, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {40, 40, SPECIES_SABLEYE}, -#else - {40, 40, SPECIES_MAWILE}, -#endif - {40, 40, SPECIES_LAIRON}, - {40, 40, SPECIES_MEDICHAM}, - {42, 42, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {42, 42, SPECIES_SABLEYE}, -#else - {42, 42, SPECIES_MAWILE}, -#endif - {44, 44, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {44, 44, SPECIES_SABLEYE}, -#else - {44, 44, SPECIES_MAWILE}, -#endif - {42, 42, SPECIES_LAIRON}, - {42, 42, SPECIES_MEDICHAM}, - {44, 44, SPECIES_LAIRON}, - {44, 44, SPECIES_MEDICHAM}, -}; -const struct WildPokemonInfo VictoryRoad_B2F_LandMonsInfo = {10, VictoryRoad_B2F_LandMons}; - -const struct WildPokemon VictoryRoad_B2F_WaterMons [] = -{ - {30, 35, SPECIES_GOLBAT}, - {25, 30, SPECIES_GOLBAT}, - {35, 40, SPECIES_GOLBAT}, - {35, 40, SPECIES_GOLBAT}, - {35, 40, SPECIES_GOLBAT}, -}; -const struct WildPokemonInfo VictoryRoad_B2F_WaterMonsInfo = {4, VictoryRoad_B2F_WaterMons}; - -const struct WildPokemon VictoryRoad_B2F_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {30, 35, SPECIES_WHISCASH}, - {35, 40, SPECIES_WHISCASH}, - {40, 45, SPECIES_WHISCASH}, -}; -const struct WildPokemonInfo VictoryRoad_B2F_FishingMonsInfo = {30, VictoryRoad_B2F_FishingMons}; - -const struct WildPokemon ShoalCave_LowTideEntranceRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {32, 32, SPECIES_ZUBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_LandMonsInfo = {10, ShoalCave_LowTideEntranceRoom_LandMons}; - -const struct WildPokemon ShoalCave_LowTideEntranceRoom_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {25, 30, SPECIES_SPHEAL}, - {25, 30, SPECIES_SPHEAL}, - {25, 35, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_WaterMonsInfo = {4, ShoalCave_LowTideEntranceRoom_WaterMons}; - -const struct WildPokemon ShoalCave_LowTideEntranceRoom_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_FishingMonsInfo = {10, ShoalCave_LowTideEntranceRoom_FishingMons}; - -const struct WildPokemon ShoalCave_LowTideInnerRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {32, 32, SPECIES_ZUBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_LandMonsInfo = {10, ShoalCave_LowTideInnerRoom_LandMons}; - -const struct WildPokemon ShoalCave_LowTideInnerRoom_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_ZUBAT}, - {25, 30, SPECIES_SPHEAL}, - {25, 30, SPECIES_SPHEAL}, - {25, 35, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_WaterMonsInfo = {4, ShoalCave_LowTideInnerRoom_WaterMons}; - -const struct WildPokemon ShoalCave_LowTideInnerRoom_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_FishingMonsInfo = {10, ShoalCave_LowTideInnerRoom_FishingMons}; - -const struct WildPokemon ShoalCave_LowTideStairsRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {32, 32, SPECIES_ZUBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideStairsRoom_LandMonsInfo = {10, ShoalCave_LowTideStairsRoom_LandMons}; - -const struct WildPokemon ShoalCave_LowTideLowerRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {32, 32, SPECIES_ZUBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, - {32, 32, SPECIES_GOLBAT}, - {32, 32, SPECIES_SPHEAL}, -}; -const struct WildPokemonInfo ShoalCave_LowTideLowerRoom_LandMonsInfo = {10, ShoalCave_LowTideLowerRoom_LandMons}; - -const struct WildPokemon ShoalCave_LowTideIceRoom_LandMons [] = -{ - {26, 26, SPECIES_ZUBAT}, - {26, 26, SPECIES_SPHEAL}, - {28, 28, SPECIES_ZUBAT}, - {28, 28, SPECIES_SPHEAL}, - {30, 30, SPECIES_ZUBAT}, - {30, 30, SPECIES_SPHEAL}, - {26, 26, SPECIES_SNORUNT}, - {32, 32, SPECIES_SPHEAL}, - {30, 30, SPECIES_GOLBAT}, - {28, 28, SPECIES_SNORUNT}, - {32, 32, SPECIES_GOLBAT}, - {30, 30, SPECIES_SNORUNT}, -}; -const struct WildPokemonInfo ShoalCave_LowTideIceRoom_LandMonsInfo = {10, ShoalCave_LowTideIceRoom_LandMons}; - -const struct WildPokemon NewMauville_Entrance_LandMons [] = -{ - {24, 24, SPECIES_VOLTORB}, - {24, 24, SPECIES_MAGNEMITE}, - {25, 25, SPECIES_VOLTORB}, - {25, 25, SPECIES_MAGNEMITE}, - {23, 23, SPECIES_VOLTORB}, - {23, 23, SPECIES_MAGNEMITE}, - {26, 26, SPECIES_VOLTORB}, - {26, 26, SPECIES_MAGNEMITE}, - {22, 22, SPECIES_VOLTORB}, - {22, 22, SPECIES_MAGNEMITE}, - {22, 22, SPECIES_VOLTORB}, - {22, 22, SPECIES_MAGNEMITE}, -}; -const struct WildPokemonInfo NewMauville_Entrance_LandMonsInfo = {10, NewMauville_Entrance_LandMons}; - -const struct WildPokemon NewMauville_Inside_LandMons [] = -{ - {24, 24, SPECIES_VOLTORB}, - {24, 24, SPECIES_MAGNEMITE}, - {25, 25, SPECIES_VOLTORB}, - {25, 25, SPECIES_MAGNEMITE}, - {23, 23, SPECIES_VOLTORB}, - {23, 23, SPECIES_MAGNEMITE}, - {26, 26, SPECIES_VOLTORB}, - {26, 26, SPECIES_MAGNEMITE}, - {22, 22, SPECIES_VOLTORB}, - {22, 22, SPECIES_MAGNEMITE}, - {26, 26, SPECIES_ELECTRODE}, - {26, 26, SPECIES_MAGNETON}, -}; -const struct WildPokemonInfo NewMauville_Inside_LandMonsInfo = {10, NewMauville_Inside_LandMons}; - -const struct WildPokemon AbandonedShip_Rooms_B1F_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACRUEL}, -}; -const struct WildPokemonInfo AbandonedShip_Rooms_B1F_WaterMonsInfo = {4, AbandonedShip_Rooms_B1F_WaterMons}; - -const struct WildPokemon AbandonedShip_Rooms_B1F_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_TENTACOOL}, - {25, 30, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACRUEL}, - {25, 30, SPECIES_TENTACRUEL}, - {20, 25, SPECIES_TENTACRUEL}, -}; -const struct WildPokemonInfo AbandonedShip_Rooms_B1F_FishingMonsInfo = {20, AbandonedShip_Rooms_B1F_FishingMons}; - -const struct WildPokemon AbandonedShip_HiddenFloorCorridors_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {5, 35, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACRUEL}, -}; -const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_WaterMonsInfo = {4, AbandonedShip_HiddenFloorCorridors_WaterMons}; - -const struct WildPokemon AbandonedShip_HiddenFloorCorridors_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_TENTACOOL}, - {25, 30, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACOOL}, - {30, 35, SPECIES_TENTACRUEL}, - {25, 30, SPECIES_TENTACRUEL}, - {20, 25, SPECIES_TENTACRUEL}, -}; -const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_FishingMonsInfo = {20, AbandonedShip_HiddenFloorCorridors_FishingMons}; - -const struct WildPokemon SkyPillar_1F_LandMons [] = -{ -#ifdef SAPPHIRE - {48, 48, SPECIES_SABLEYE}, -#else - {48, 48, SPECIES_MAWILE}, -#endif - {48, 48, SPECIES_GOLBAT}, - {50, 50, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {50, 50, SPECIES_SABLEYE}, -#else - {50, 50, SPECIES_MAWILE}, -#endif - {48, 48, SPECIES_CLAYDOL}, -#ifdef SAPPHIRE - {48, 48, SPECIES_BANETTE}, - {50, 50, SPECIES_BANETTE}, -#else - {48, 48, SPECIES_DUSCLOPS}, - {50, 50, SPECIES_DUSCLOPS}, -#endif - {49, 49, SPECIES_CLAYDOL}, - {47, 47, SPECIES_CLAYDOL}, - {50, 50, SPECIES_CLAYDOL}, - {47, 47, SPECIES_CLAYDOL}, - {50, 50, SPECIES_CLAYDOL}, -}; -const struct WildPokemonInfo SkyPillar_1F_LandMonsInfo = {10, SkyPillar_1F_LandMons}; - -const struct WildPokemon SkyPillar_3F_LandMons [] = -{ -#ifdef SAPPHIRE - {51, 51, SPECIES_SABLEYE}, -#else - {51, 51, SPECIES_MAWILE}, -#endif - {51, 51, SPECIES_GOLBAT}, - {53, 53, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {53, 53, SPECIES_SABLEYE}, -#else - {53, 53, SPECIES_MAWILE}, -#endif - {51, 51, SPECIES_CLAYDOL}, -#ifdef SAPPHIRE - {51, 51, SPECIES_BANETTE}, - {53, 53, SPECIES_BANETTE}, -#else - {51, 51, SPECIES_DUSCLOPS}, - {53, 53, SPECIES_DUSCLOPS}, -#endif - {52, 52, SPECIES_CLAYDOL}, - {50, 50, SPECIES_CLAYDOL}, - {53, 53, SPECIES_CLAYDOL}, - {50, 50, SPECIES_CLAYDOL}, - {53, 53, SPECIES_CLAYDOL}, -}; -const struct WildPokemonInfo SkyPillar_3F_LandMonsInfo = {10, SkyPillar_3F_LandMons}; - -const struct WildPokemon SkyPillar_5F_LandMons [] = -{ -#ifdef SAPPHIRE - {54, 54, SPECIES_SABLEYE}, -#else - {54, 54, SPECIES_MAWILE}, -#endif - {54, 54, SPECIES_GOLBAT}, - {56, 56, SPECIES_GOLBAT}, -#ifdef SAPPHIRE - {56, 56, SPECIES_SABLEYE}, -#else - {56, 56, SPECIES_MAWILE}, -#endif - {54, 54, SPECIES_CLAYDOL}, -#ifdef SAPPHIRE - {54, 54, SPECIES_BANETTE}, - {56, 56, SPECIES_BANETTE}, -#else - {54, 54, SPECIES_DUSCLOPS}, - {56, 56, SPECIES_DUSCLOPS}, -#endif - {55, 55, SPECIES_CLAYDOL}, - {56, 56, SPECIES_CLAYDOL}, - {57, 57, SPECIES_ALTARIA}, - {54, 54, SPECIES_ALTARIA}, - {60, 60, SPECIES_ALTARIA}, -}; -const struct WildPokemonInfo SkyPillar_5F_LandMonsInfo = {10, SkyPillar_5F_LandMons}; - -const struct WildPokemon Route101_LandMons [] = -{ - {2, 2, SPECIES_WURMPLE}, - {2, 2, SPECIES_ZIGZAGOON}, - {2, 2, SPECIES_WURMPLE}, - {3, 3, SPECIES_WURMPLE}, - {3, 3, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_WURMPLE}, - {3, 3, SPECIES_ZIGZAGOON}, - {2, 2, SPECIES_POOCHYENA}, - {2, 2, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, -}; -const struct WildPokemonInfo Route101_LandMonsInfo = {20, Route101_LandMons}; - -const struct WildPokemon Route102_LandMons [] = -{ - {3, 3, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_WURMPLE}, - {4, 4, SPECIES_ZIGZAGOON}, - {4, 4, SPECIES_WURMPLE}, -#ifdef SAPPHIRE - {3, 3, SPECIES_LOTAD}, - {4, 4, SPECIES_LOTAD}, -#else - {3, 3, SPECIES_SEEDOT}, - {4, 4, SPECIES_SEEDOT}, -#endif - {3, 3, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, - {4, 4, SPECIES_POOCHYENA}, - {4, 4, SPECIES_RALTS}, - {4, 4, SPECIES_POOCHYENA}, - {3, 3, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route102_LandMonsInfo = {20, Route102_LandMons}; - -const struct WildPokemon Route102_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route102_WaterMonsInfo = {4, Route102_WaterMons}; - -const struct WildPokemon Route102_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_CORPHISH}, - {25, 30, SPECIES_CORPHISH}, - {30, 35, SPECIES_CORPHISH}, - {20, 25, SPECIES_CORPHISH}, - {35, 40, SPECIES_CORPHISH}, - {40, 45, SPECIES_CORPHISH}, -}; -const struct WildPokemonInfo Route102_FishingMonsInfo = {30, Route102_FishingMons}; - -const struct WildPokemon Route103_LandMons [] = -{ - {2, 2, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_ZIGZAGOON}, - {3, 3, SPECIES_ZIGZAGOON}, - {4, 4, SPECIES_ZIGZAGOON}, - {2, 2, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, - {3, 3, SPECIES_POOCHYENA}, - {4, 4, SPECIES_POOCHYENA}, - {3, 3, SPECIES_WINGULL}, - {3, 3, SPECIES_WINGULL}, - {2, 2, SPECIES_WINGULL}, - {4, 4, SPECIES_WINGULL}, -}; -const struct WildPokemonInfo Route103_LandMonsInfo = {20, Route103_LandMons}; - -const struct WildPokemon Route103_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route103_WaterMonsInfo = {4, Route103_WaterMons}; - -const struct WildPokemon Route103_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route103_FishingMonsInfo = {30, Route103_FishingMons}; - -const struct WildPokemon Route104_LandMons [] = -{ - {4, 4, SPECIES_ZIGZAGOON}, - {4, 4, SPECIES_WURMPLE}, - {5, 5, SPECIES_ZIGZAGOON}, - {5, 5, SPECIES_WURMPLE}, - {4, 4, SPECIES_ZIGZAGOON}, - {5, 5, SPECIES_ZIGZAGOON}, - {4, 4, SPECIES_TAILLOW}, - {5, 5, SPECIES_TAILLOW}, - {4, 4, SPECIES_WINGULL}, - {4, 4, SPECIES_WINGULL}, - {3, 3, SPECIES_WINGULL}, - {5, 5, SPECIES_WINGULL}, -}; -const struct WildPokemonInfo Route104_LandMonsInfo = {20, Route104_LandMons}; - -const struct WildPokemon Route104_WaterMons [] = -{ - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route104_WaterMonsInfo = {4, Route104_WaterMons}; - -const struct WildPokemon Route104_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_MAGIKARP}, - {25, 30, SPECIES_MAGIKARP}, - {30, 35, SPECIES_MAGIKARP}, - {20, 25, SPECIES_MAGIKARP}, - {35, 40, SPECIES_MAGIKARP}, - {40, 45, SPECIES_MAGIKARP}, -}; -const struct WildPokemonInfo Route104_FishingMonsInfo = {30, Route104_FishingMons}; - -const struct WildPokemon Route105_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route105_WaterMonsInfo = {4, Route105_WaterMons}; - -const struct WildPokemon Route105_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route105_FishingMonsInfo = {30, Route105_FishingMons}; - -const struct WildPokemon Route106_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route106_WaterMonsInfo = {4, Route106_WaterMons}; - -const struct WildPokemon Route106_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route106_FishingMonsInfo = {30, Route106_FishingMons}; - -const struct WildPokemon Route107_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route107_WaterMonsInfo = {4, Route107_WaterMons}; - -const struct WildPokemon Route107_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route107_FishingMonsInfo = {30, Route107_FishingMons}; - -const struct WildPokemon Route108_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route108_WaterMonsInfo = {4, Route108_WaterMons}; - -const struct WildPokemon Route108_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route108_FishingMonsInfo = {30, Route108_FishingMons}; - -const struct WildPokemon Route109_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route109_WaterMonsInfo = {4, Route109_WaterMons}; - -const struct WildPokemon Route109_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route109_FishingMonsInfo = {30, Route109_FishingMons}; - -const struct WildPokemon Route110_LandMons [] = -{ - {12, 12, SPECIES_ZIGZAGOON}, - {12, 12, SPECIES_ELECTRIKE}, - {12, 12, SPECIES_GULPIN}, - {13, 13, SPECIES_ELECTRIKE}, -#ifdef SAPPHIRE - {13, 13, SPECIES_PLUSLE}, -#else - {13, 13, SPECIES_MINUN}, -#endif - {13, 13, SPECIES_ODDISH}, -#ifdef SAPPHIRE - {13, 13, SPECIES_PLUSLE}, -#else - {13, 13, SPECIES_MINUN}, -#endif - {13, 13, SPECIES_GULPIN}, - {12, 12, SPECIES_WINGULL}, - {12, 12, SPECIES_WINGULL}, -#ifdef SAPPHIRE - {12, 12, SPECIES_MINUN}, - {13, 13, SPECIES_MINUN}, -#else - {12, 12, SPECIES_PLUSLE}, - {13, 13, SPECIES_PLUSLE}, -#endif -}; -const struct WildPokemonInfo Route110_LandMonsInfo = {20, Route110_LandMons}; - -const struct WildPokemon Route110_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route110_WaterMonsInfo = {4, Route110_WaterMons}; - -const struct WildPokemon Route110_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route110_FishingMonsInfo = {30, Route110_FishingMons}; - -const struct WildPokemon Route111_LandMons [] = -{ - {20, 20, SPECIES_SANDSHREW}, - {20, 20, SPECIES_TRAPINCH}, - {21, 21, SPECIES_SANDSHREW}, - {21, 21, SPECIES_TRAPINCH}, - {19, 19, SPECIES_CACNEA}, - {21, 21, SPECIES_CACNEA}, - {19, 19, SPECIES_SANDSHREW}, - {19, 19, SPECIES_TRAPINCH}, - {20, 20, SPECIES_BALTOY}, - {20, 20, SPECIES_BALTOY}, - {22, 22, SPECIES_BALTOY}, - {22, 22, SPECIES_BALTOY}, -}; -const struct WildPokemonInfo Route111_LandMonsInfo = {10, Route111_LandMons}; - -const struct WildPokemon Route111_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route111_WaterMonsInfo = {4, Route111_WaterMons}; - -const struct WildPokemon Route111_RockSmashMons [] = -{ - {10, 15, SPECIES_GEODUDE}, - {5, 10, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo Route111_RockSmashMonsInfo = {20, Route111_RockSmashMons}; - -const struct WildPokemon Route111_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {20, 25, SPECIES_BARBOACH}, - {35, 40, SPECIES_BARBOACH}, - {40, 45, SPECIES_BARBOACH}, -}; -const struct WildPokemonInfo Route111_FishingMonsInfo = {30, Route111_FishingMons}; - -const struct WildPokemon Route112_LandMons [] = -{ - {15, 15, SPECIES_NUMEL}, - {15, 15, SPECIES_NUMEL}, - {15, 15, SPECIES_MACHOP}, - {14, 14, SPECIES_NUMEL}, - {14, 14, SPECIES_NUMEL}, - {14, 14, SPECIES_MACHOP}, - {16, 16, SPECIES_NUMEL}, - {16, 16, SPECIES_MACHOP}, - {16, 16, SPECIES_NUMEL}, - {16, 16, SPECIES_NUMEL}, - {16, 16, SPECIES_NUMEL}, - {16, 16, SPECIES_NUMEL}, -}; -const struct WildPokemonInfo Route112_LandMonsInfo = {20, Route112_LandMons}; - -const struct WildPokemon Route113_LandMons [] = -{ - {15, 15, SPECIES_SPINDA}, - {15, 15, SPECIES_SPINDA}, - {15, 15, SPECIES_SANDSHREW}, - {14, 14, SPECIES_SPINDA}, - {14, 14, SPECIES_SPINDA}, - {14, 14, SPECIES_SANDSHREW}, - {16, 16, SPECIES_SPINDA}, - {16, 16, SPECIES_SANDSHREW}, - {16, 16, SPECIES_SPINDA}, - {16, 16, SPECIES_SKARMORY}, - {16, 16, SPECIES_SPINDA}, - {16, 16, SPECIES_SKARMORY}, -}; -const struct WildPokemonInfo Route113_LandMonsInfo = {20, Route113_LandMons}; - -const struct WildPokemon Route114_LandMons [] = -{ - {16, 16, SPECIES_SWABLU}, -#ifdef SAPPHIRE - {16, 16, SPECIES_LOTAD}, -#else - {16, 16, SPECIES_SEEDOT}, -#endif - {17, 17, SPECIES_SWABLU}, - {15, 15, SPECIES_SWABLU}, -#ifdef SAPPHIRE - {15, 15, SPECIES_LOTAD}, - {16, 16, SPECIES_SEVIPER}, - {16, 16, SPECIES_LOMBRE}, - {18, 18, SPECIES_LOMBRE}, - {17, 17, SPECIES_SEVIPER}, - {15, 15, SPECIES_SEVIPER}, - {17, 17, SPECIES_SEVIPER}, -#else - {15, 15, SPECIES_SEEDOT}, - {16, 16, SPECIES_ZANGOOSE}, - {16, 16, SPECIES_NUZLEAF}, - {18, 18, SPECIES_NUZLEAF}, - {17, 17, SPECIES_ZANGOOSE}, - {15, 15, SPECIES_ZANGOOSE}, - {17, 17, SPECIES_ZANGOOSE}, -#endif - {15, 15, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route114_LandMonsInfo = {20, Route114_LandMons}; - -const struct WildPokemon Route114_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route114_WaterMonsInfo = {4, Route114_WaterMons}; - -const struct WildPokemon Route114_RockSmashMons [] = -{ - {10, 15, SPECIES_GEODUDE}, - {5, 10, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo Route114_RockSmashMonsInfo = {20, Route114_RockSmashMons}; - -const struct WildPokemon Route114_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {20, 25, SPECIES_BARBOACH}, - {35, 40, SPECIES_BARBOACH}, - {40, 45, SPECIES_BARBOACH}, -}; -const struct WildPokemonInfo Route114_FishingMonsInfo = {30, Route114_FishingMons}; - -const struct WildPokemon Route115_LandMons [] = -{ - {23, 23, SPECIES_SWABLU}, - {23, 23, SPECIES_TAILLOW}, - {25, 25, SPECIES_SWABLU}, - {24, 24, SPECIES_TAILLOW}, - {25, 25, SPECIES_TAILLOW}, - {25, 25, SPECIES_SWELLOW}, - {24, 24, SPECIES_JIGGLYPUFF}, - {25, 25, SPECIES_JIGGLYPUFF}, - {24, 24, SPECIES_WINGULL}, - {24, 24, SPECIES_WINGULL}, - {26, 26, SPECIES_WINGULL}, - {25, 25, SPECIES_WINGULL}, -}; -const struct WildPokemonInfo Route115_LandMonsInfo = {20, Route115_LandMons}; - -const struct WildPokemon Route115_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route115_WaterMonsInfo = {4, Route115_WaterMons}; - -const struct WildPokemon Route115_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route115_FishingMonsInfo = {30, Route115_FishingMons}; - -const struct WildPokemon Route116_LandMons [] = -{ - {6, 6, SPECIES_ZIGZAGOON}, - {6, 6, SPECIES_WHISMUR}, - {6, 6, SPECIES_NINCADA}, - {7, 7, SPECIES_WHISMUR}, - {7, 7, SPECIES_NINCADA}, - {6, 6, SPECIES_TAILLOW}, - {7, 7, SPECIES_TAILLOW}, - {8, 8, SPECIES_TAILLOW}, - {7, 7, SPECIES_ZIGZAGOON}, - {8, 8, SPECIES_ZIGZAGOON}, - {7, 7, SPECIES_SKITTY}, - {8, 8, SPECIES_SKITTY}, -}; -const struct WildPokemonInfo Route116_LandMonsInfo = {20, Route116_LandMons}; - -const struct WildPokemon Route117_LandMons [] = -{ - {13, 13, SPECIES_ZIGZAGOON}, - {13, 13, SPECIES_ROSELIA}, - {14, 14, SPECIES_ZIGZAGOON}, - {14, 14, SPECIES_ROSELIA}, - {13, 13, SPECIES_MARILL}, - {13, 13, SPECIES_ODDISH}, -#ifdef SAPPHIRE - {13, 13, SPECIES_VOLBEAT}, - {13, 13, SPECIES_VOLBEAT}, - {14, 14, SPECIES_VOLBEAT}, - {14, 14, SPECIES_VOLBEAT}, - {13, 13, SPECIES_ILLUMISE}, -#else - {13, 13, SPECIES_ILLUMISE}, - {13, 13, SPECIES_ILLUMISE}, - {14, 14, SPECIES_ILLUMISE}, - {14, 14, SPECIES_ILLUMISE}, - {13, 13, SPECIES_VOLBEAT}, -#endif - {13, 13, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route117_LandMonsInfo = {20, Route117_LandMons}; - -const struct WildPokemon Route117_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route117_WaterMonsInfo = {4, Route117_WaterMons}; - -const struct WildPokemon Route117_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_CORPHISH}, - {25, 30, SPECIES_CORPHISH}, - {30, 35, SPECIES_CORPHISH}, - {20, 25, SPECIES_CORPHISH}, - {35, 40, SPECIES_CORPHISH}, - {40, 45, SPECIES_CORPHISH}, -}; -const struct WildPokemonInfo Route117_FishingMonsInfo = {30, Route117_FishingMons}; - -const struct WildPokemon Route118_LandMons [] = -{ - {24, 24, SPECIES_ZIGZAGOON}, - {24, 24, SPECIES_ELECTRIKE}, - {26, 26, SPECIES_ZIGZAGOON}, - {26, 26, SPECIES_ELECTRIKE}, - {26, 26, SPECIES_LINOONE}, - {26, 26, SPECIES_MANECTRIC}, - {25, 25, SPECIES_WINGULL}, - {25, 25, SPECIES_WINGULL}, - {26, 26, SPECIES_WINGULL}, - {26, 26, SPECIES_WINGULL}, - {27, 27, SPECIES_WINGULL}, - {25, 25, SPECIES_KECLEON}, -}; -const struct WildPokemonInfo Route118_LandMonsInfo = {20, Route118_LandMons}; - -const struct WildPokemon Route118_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route118_WaterMonsInfo = {4, Route118_WaterMons}; - -const struct WildPokemon Route118_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_CARVANHA}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_CARVANHA}, - {20, 25, SPECIES_CARVANHA}, - {35, 40, SPECIES_CARVANHA}, - {40, 45, SPECIES_CARVANHA}, -}; -const struct WildPokemonInfo Route118_FishingMonsInfo = {30, Route118_FishingMons}; - -const struct WildPokemon Route119_LandMons [] = -{ - {25, 25, SPECIES_ZIGZAGOON}, - {25, 25, SPECIES_LINOONE}, - {27, 27, SPECIES_ZIGZAGOON}, - {25, 25, SPECIES_ODDISH}, - {27, 27, SPECIES_LINOONE}, - {26, 26, SPECIES_ODDISH}, - {27, 27, SPECIES_ODDISH}, - {24, 24, SPECIES_ODDISH}, - {25, 25, SPECIES_TROPIUS}, - {26, 26, SPECIES_TROPIUS}, - {27, 27, SPECIES_TROPIUS}, - {25, 25, SPECIES_KECLEON}, -}; -const struct WildPokemonInfo Route119_LandMonsInfo = {15, Route119_LandMons}; - -const struct WildPokemon Route119_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route119_WaterMonsInfo = {4, Route119_WaterMons}; - -const struct WildPokemon Route119_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_CARVANHA}, - {25, 30, SPECIES_CARVANHA}, - {30, 35, SPECIES_CARVANHA}, - {20, 25, SPECIES_CARVANHA}, - {35, 40, SPECIES_CARVANHA}, - {40, 45, SPECIES_CARVANHA}, -}; -const struct WildPokemonInfo Route119_FishingMonsInfo = {30, Route119_FishingMons}; - -const struct WildPokemon Route120_LandMons [] = -{ - {25, 25, SPECIES_ZIGZAGOON}, - {25, 25, SPECIES_LINOONE}, - {27, 27, SPECIES_LINOONE}, - {25, 25, SPECIES_ODDISH}, - {25, 25, SPECIES_MARILL}, - {26, 26, SPECIES_ODDISH}, - {27, 27, SPECIES_ODDISH}, - {27, 27, SPECIES_MARILL}, - {25, 25, SPECIES_ABSOL}, - {27, 27, SPECIES_ABSOL}, - {25, 25, SPECIES_KECLEON}, - {25, 25, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route120_LandMonsInfo = {20, Route120_LandMons}; - -const struct WildPokemon Route120_WaterMons [] = -{ - {20, 30, SPECIES_MARILL}, - {10, 20, SPECIES_MARILL}, - {30, 35, SPECIES_MARILL}, - {5, 10, SPECIES_MARILL}, - {20, 30, SPECIES_SURSKIT}, -}; -const struct WildPokemonInfo Route120_WaterMonsInfo = {4, Route120_WaterMons}; - -const struct WildPokemon Route120_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_GOLDEEN}, - {10, 30, SPECIES_BARBOACH}, - {25, 30, SPECIES_BARBOACH}, - {30, 35, SPECIES_BARBOACH}, - {20, 25, SPECIES_BARBOACH}, - {35, 40, SPECIES_BARBOACH}, - {40, 45, SPECIES_BARBOACH}, -}; -const struct WildPokemonInfo Route120_FishingMonsInfo = {30, Route120_FishingMons}; - -const struct WildPokemon Route121_LandMons [] = -{ - {26, 26, SPECIES_ZIGZAGOON}, -#ifdef SAPPHIRE - {26, 26, SPECIES_SHUPPET}, -#else - {26, 26, SPECIES_DUSKULL}, -#endif - {26, 26, SPECIES_LINOONE}, -#ifdef SAPPHIRE - {28, 28, SPECIES_SHUPPET}, -#else - {28, 28, SPECIES_DUSKULL}, -#endif - {28, 28, SPECIES_LINOONE}, - {26, 26, SPECIES_ODDISH}, - {28, 28, SPECIES_ODDISH}, - {28, 28, SPECIES_GLOOM}, - {26, 26, SPECIES_WINGULL}, - {27, 27, SPECIES_WINGULL}, - {28, 28, SPECIES_WINGULL}, - {25, 25, SPECIES_KECLEON}, -}; -const struct WildPokemonInfo Route121_LandMonsInfo = {20, Route121_LandMons}; - -const struct WildPokemon Route121_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route121_WaterMonsInfo = {4, Route121_WaterMons}; - -const struct WildPokemon Route121_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route121_FishingMonsInfo = {30, Route121_FishingMons}; - -const struct WildPokemon Route122_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route122_WaterMonsInfo = {4, Route122_WaterMons}; - -const struct WildPokemon Route122_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route122_FishingMonsInfo = {30, Route122_FishingMons}; - -const struct WildPokemon Route123_LandMons [] = -{ - {26, 26, SPECIES_ZIGZAGOON}, -#ifdef SAPPHIRE - {26, 26, SPECIES_SHUPPET}, -#else - {26, 26, SPECIES_DUSKULL}, -#endif - {26, 26, SPECIES_LINOONE}, -#ifdef SAPPHIRE - {28, 28, SPECIES_SHUPPET}, -#else - {28, 28, SPECIES_DUSKULL}, -#endif - {28, 28, SPECIES_LINOONE}, - {26, 26, SPECIES_ODDISH}, - {28, 28, SPECIES_ODDISH}, - {28, 28, SPECIES_GLOOM}, - {26, 26, SPECIES_WINGULL}, - {27, 27, SPECIES_WINGULL}, - {28, 28, SPECIES_WINGULL}, - {25, 25, SPECIES_KECLEON}, -}; -const struct WildPokemonInfo Route123_LandMonsInfo = {20, Route123_LandMons}; - -const struct WildPokemon Route123_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route123_WaterMonsInfo = {4, Route123_WaterMons}; - -const struct WildPokemon Route123_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route123_FishingMonsInfo = {30, Route123_FishingMons}; - -const struct WildPokemon Route124_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route124_WaterMonsInfo = {4, Route124_WaterMons}; - -const struct WildPokemon Route124_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route124_FishingMonsInfo = {30, Route124_FishingMons}; - -const struct WildPokemon Route125_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route125_WaterMonsInfo = {4, Route125_WaterMons}; - -const struct WildPokemon Route125_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route125_FishingMonsInfo = {30, Route125_FishingMons}; - -const struct WildPokemon Route126_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route126_WaterMonsInfo = {4, Route126_WaterMons}; - -const struct WildPokemon Route126_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route126_FishingMonsInfo = {30, Route126_FishingMons}; - -const struct WildPokemon Route127_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route127_WaterMonsInfo = {4, Route127_WaterMons}; - -const struct WildPokemon Route127_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route127_FishingMonsInfo = {30, Route127_FishingMons}; - -const struct WildPokemon Route128_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route128_WaterMonsInfo = {4, Route128_WaterMons}; - -const struct WildPokemon Route128_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_LUVDISC}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_LUVDISC}, - {30, 35, SPECIES_WAILMER}, - {30, 35, SPECIES_CORSOLA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route128_FishingMonsInfo = {30, Route128_FishingMons}; - -const struct WildPokemon Route129_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, -#ifdef SAPPHIRE - {25, 30, SPECIES_WAILORD}, -#else - {35, 40, SPECIES_WAILORD}, -#endif -}; -const struct WildPokemonInfo Route129_WaterMonsInfo = {4, Route129_WaterMons}; - -const struct WildPokemon Route129_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route129_FishingMonsInfo = {30, Route129_FishingMons}; - -const struct WildPokemon Route130_LandMons [] = -{ - {30, 30, SPECIES_WYNAUT}, - {35, 35, SPECIES_WYNAUT}, - {25, 25, SPECIES_WYNAUT}, - {40, 40, SPECIES_WYNAUT}, - {20, 20, SPECIES_WYNAUT}, - {45, 45, SPECIES_WYNAUT}, - {15, 15, SPECIES_WYNAUT}, - {50, 50, SPECIES_WYNAUT}, - {10, 10, SPECIES_WYNAUT}, - {5, 5, SPECIES_WYNAUT}, - {10, 10, SPECIES_WYNAUT}, - {5, 5, SPECIES_WYNAUT}, -}; -const struct WildPokemonInfo Route130_LandMonsInfo = {20, Route130_LandMons}; - -const struct WildPokemon Route130_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route130_WaterMonsInfo = {4, Route130_WaterMons}; - -const struct WildPokemon Route130_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route130_FishingMonsInfo = {30, Route130_FishingMons}; - -const struct WildPokemon Route131_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route131_WaterMonsInfo = {4, Route131_WaterMons}; - -const struct WildPokemon Route131_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route131_FishingMonsInfo = {30, Route131_FishingMons}; - -const struct WildPokemon Route132_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route132_WaterMonsInfo = {4, Route132_WaterMons}; - -const struct WildPokemon Route132_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_HORSEA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route132_FishingMonsInfo = {30, Route132_FishingMons}; - -const struct WildPokemon Route133_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route133_WaterMonsInfo = {4, Route133_WaterMons}; - -const struct WildPokemon Route133_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_HORSEA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route133_FishingMonsInfo = {30, Route133_FishingMons}; - -const struct WildPokemon Route134_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo Route134_WaterMonsInfo = {4, Route134_WaterMons}; - -const struct WildPokemon Route134_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_HORSEA}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo Route134_FishingMonsInfo = {30, Route134_FishingMons}; - -const struct WildPokemon SafariZone_Northwest_LandMons [] = -{ - {27, 27, SPECIES_RHYHORN}, - {27, 27, SPECIES_ODDISH}, - {29, 29, SPECIES_RHYHORN}, - {29, 29, SPECIES_ODDISH}, - {27, 27, SPECIES_DODUO}, - {29, 29, SPECIES_GLOOM}, - {31, 31, SPECIES_GLOOM}, - {29, 29, SPECIES_DODUO}, - {29, 29, SPECIES_DODRIO}, - {27, 27, SPECIES_PINSIR}, - {31, 31, SPECIES_DODRIO}, - {29, 29, SPECIES_PINSIR}, -}; -const struct WildPokemonInfo SafariZone_Northwest_LandMonsInfo = {25, SafariZone_Northwest_LandMons}; - -const struct WildPokemon SafariZone_Northwest_WaterMons [] = -{ - {20, 30, SPECIES_PSYDUCK}, - {20, 30, SPECIES_PSYDUCK}, - {30, 35, SPECIES_PSYDUCK}, - {30, 35, SPECIES_GOLDUCK}, - {25, 40, SPECIES_GOLDUCK}, -}; -const struct WildPokemonInfo SafariZone_Northwest_WaterMonsInfo = {9, SafariZone_Northwest_WaterMons}; - -const struct WildPokemon SafariZone_Northwest_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 25, SPECIES_GOLDEEN}, - {10, 30, SPECIES_GOLDEEN}, - {25, 30, SPECIES_GOLDEEN}, - {30, 35, SPECIES_GOLDEEN}, - {30, 35, SPECIES_SEAKING}, - {35, 40, SPECIES_SEAKING}, - {25, 30, SPECIES_SEAKING}, -}; -const struct WildPokemonInfo SafariZone_Northwest_FishingMonsInfo = {35, SafariZone_Northwest_FishingMons}; - -const struct WildPokemon SafariZone_Northeast_LandMons [] = -{ - {27, 27, SPECIES_PHANPY}, - {27, 27, SPECIES_ODDISH}, - {29, 29, SPECIES_PHANPY}, - {29, 29, SPECIES_ODDISH}, - {27, 27, SPECIES_NATU}, - {29, 29, SPECIES_GLOOM}, - {31, 31, SPECIES_GLOOM}, - {29, 29, SPECIES_NATU}, - {29, 29, SPECIES_XATU}, - {27, 27, SPECIES_HERACROSS}, - {31, 31, SPECIES_XATU}, - {29, 29, SPECIES_HERACROSS}, -}; -const struct WildPokemonInfo SafariZone_Northeast_LandMonsInfo = {25, SafariZone_Northeast_LandMons}; - -const struct WildPokemon SafariZone_Northeast_RockSmashMons [] = -{ - {10, 15, SPECIES_GEODUDE}, - {5, 10, SPECIES_GEODUDE}, - {15, 20, SPECIES_GEODUDE}, - {20, 25, SPECIES_GEODUDE}, - {25, 30, SPECIES_GEODUDE}, -}; -const struct WildPokemonInfo SafariZone_Northeast_RockSmashMonsInfo = {25, SafariZone_Northeast_RockSmashMons}; - -const struct WildPokemon SafariZone_Southwest_LandMons [] = -{ - {25, 25, SPECIES_ODDISH}, - {27, 27, SPECIES_ODDISH}, - {25, 25, SPECIES_GIRAFARIG}, - {27, 27, SPECIES_GIRAFARIG}, - {25, 25, SPECIES_NATU}, -#ifdef SAPPHIRE - {27, 27, SPECIES_DODUO}, -#else - {25, 25, SPECIES_DODUO}, -#endif - {25, 25, SPECIES_GLOOM}, - {27, 27, SPECIES_WOBBUFFET}, - {25, 25, SPECIES_PIKACHU}, - {27, 27, SPECIES_WOBBUFFET}, - {27, 27, SPECIES_PIKACHU}, - {29, 29, SPECIES_WOBBUFFET}, -}; -const struct WildPokemonInfo SafariZone_Southwest_LandMonsInfo = {25, SafariZone_Southwest_LandMons}; - -const struct WildPokemon SafariZone_Southwest_WaterMons [] = -{ - {20, 30, SPECIES_PSYDUCK}, - {20, 30, SPECIES_PSYDUCK}, - {30, 35, SPECIES_PSYDUCK}, - {30, 35, SPECIES_PSYDUCK}, - {30, 35, SPECIES_PSYDUCK}, -}; -const struct WildPokemonInfo SafariZone_Southwest_WaterMonsInfo = {9, SafariZone_Southwest_WaterMons}; - -const struct WildPokemon SafariZone_Southwest_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_GOLDEEN}, - {10, 30, SPECIES_MAGIKARP}, - {10, 25, SPECIES_GOLDEEN}, - {10, 30, SPECIES_GOLDEEN}, - {25, 30, SPECIES_GOLDEEN}, - {30, 35, SPECIES_GOLDEEN}, - {30, 35, SPECIES_SEAKING}, - {35, 40, SPECIES_SEAKING}, - {25, 30, SPECIES_SEAKING}, -}; -const struct WildPokemonInfo SafariZone_Southwest_FishingMonsInfo = {35, SafariZone_Southwest_FishingMons}; - -const struct WildPokemon SafariZone_Southeast_LandMons [] = -{ - {25, 25, SPECIES_ODDISH}, - {27, 27, SPECIES_ODDISH}, - {25, 25, SPECIES_GIRAFARIG}, - {27, 27, SPECIES_GIRAFARIG}, - {25, 25, SPECIES_NATU}, - {25, 25, SPECIES_DODUO}, - {25, 25, SPECIES_GLOOM}, - {27, 27, SPECIES_WOBBUFFET}, - {25, 25, SPECIES_PIKACHU}, - {27, 27, SPECIES_WOBBUFFET}, - {27, 27, SPECIES_PIKACHU}, - {29, 29, SPECIES_WOBBUFFET}, -}; -const struct WildPokemonInfo SafariZone_Southeast_LandMonsInfo = {25, SafariZone_Southeast_LandMons}; - -const struct WildPokemon DewfordTown_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo DewfordTown_WaterMonsInfo = {4, DewfordTown_WaterMons}; - -const struct WildPokemon DewfordTown_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_WAILMER}, - {20, 25, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo DewfordTown_FishingMonsInfo = {10, DewfordTown_FishingMons}; - -const struct WildPokemon PacifidlogTown_WaterMons [] = -{ - {5, 35, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WINGULL}, - {15, 25, SPECIES_WINGULL}, - {25, 30, SPECIES_PELIPPER}, - {25, 30, SPECIES_PELIPPER}, -}; -const struct WildPokemonInfo PacifidlogTown_WaterMonsInfo = {4, PacifidlogTown_WaterMons}; - -const struct WildPokemon PacifidlogTown_FishingMons [] = -{ - {5, 10, SPECIES_MAGIKARP}, - {5, 10, SPECIES_TENTACOOL}, - {10, 30, SPECIES_MAGIKARP}, - {10, 30, SPECIES_TENTACOOL}, - {10, 30, SPECIES_WAILMER}, - {30, 35, SPECIES_SHARPEDO}, - {30, 35, SPECIES_WAILMER}, - {25, 30, SPECIES_WAILMER}, - {35, 40, SPECIES_WAILMER}, - {40, 45, SPECIES_WAILMER}, -}; -const struct WildPokemonInfo PacifidlogTown_FishingMonsInfo = {10, PacifidlogTown_FishingMons}; - -const struct WildPokemon Underwater1_WaterMons [] = -{ - {20, 30, SPECIES_CLAMPERL}, - {20, 30, SPECIES_CHINCHOU}, - {30, 35, SPECIES_CLAMPERL}, - {30, 35, SPECIES_RELICANTH}, - {30, 35, SPECIES_RELICANTH}, -}; -const struct WildPokemonInfo Underwater1_WaterMonsInfo = {4, Underwater1_WaterMons}; - -const struct WildPokemon Underwater2_WaterMons [] = -{ - {20, 30, SPECIES_CLAMPERL}, - {20, 30, SPECIES_CHINCHOU}, - {30, 35, SPECIES_CLAMPERL}, - {30, 35, SPECIES_RELICANTH}, - {30, 35, SPECIES_RELICANTH}, -}; -const struct WildPokemonInfo Underwater2_WaterMonsInfo = {4, Underwater2_WaterMons}; - -const struct WildPokemonHeader gWildMonHeaders[] = -{ - { - .mapGroup = MAP_GROUP(PETALBURG_CITY), - .mapNum = MAP_NUM(PETALBURG_CITY), - .landMonsInfo = NULL, - .waterMonsInfo = &PetalburgCity_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &PetalburgCity_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SLATEPORT_CITY), - .mapNum = MAP_NUM(SLATEPORT_CITY), - .landMonsInfo = NULL, - .waterMonsInfo = &SlateportCity_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &SlateportCity_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(LILYCOVE_CITY), - .mapNum = MAP_NUM(LILYCOVE_CITY), - .landMonsInfo = NULL, - .waterMonsInfo = &LilycoveCity_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &LilycoveCity_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(MOSSDEEP_CITY), - .mapNum = MAP_NUM(MOSSDEEP_CITY), - .landMonsInfo = NULL, - .waterMonsInfo = &MossdeepCity_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &MossdeepCity_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SOOTOPOLIS_CITY), - .mapNum = MAP_NUM(SOOTOPOLIS_CITY), - .landMonsInfo = NULL, - .waterMonsInfo = &SootopolisCity_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &SootopolisCity_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(EVER_GRANDE_CITY), - .mapNum = MAP_NUM(EVER_GRANDE_CITY), - .landMonsInfo = NULL, - .waterMonsInfo = &EverGrandeCity_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &EverGrandeCity_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(METEOR_FALLS_1F_1R), - .mapNum = MAP_NUM(METEOR_FALLS_1F_1R), - .landMonsInfo = &MeteorFalls_1F_1R_LandMonsInfo, - .waterMonsInfo = &MeteorFalls_1F_1R_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &MeteorFalls_1F_1R_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(METEOR_FALLS_1F_2R), - .mapNum = MAP_NUM(METEOR_FALLS_1F_2R), - .landMonsInfo = &MeteorFalls_1F_2R_LandMonsInfo, - .waterMonsInfo = &MeteorFalls_1F_2R_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &MeteorFalls_1F_2R_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(METEOR_FALLS_B1F_1R), - .mapNum = MAP_NUM(METEOR_FALLS_B1F_1R), - .landMonsInfo = &MeteorFalls_B1F_1R_LandMonsInfo, - .waterMonsInfo = &MeteorFalls_B1F_1R_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &MeteorFalls_B1F_1R_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(METEOR_FALLS_B1F_2R), - .mapNum = MAP_NUM(METEOR_FALLS_B1F_2R), - .landMonsInfo = &MeteorFalls_B1F_2R_LandMonsInfo, - .waterMonsInfo = &MeteorFalls_B1F_2R_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &MeteorFalls_B1F_2R_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(RUSTURF_TUNNEL), - .mapNum = MAP_NUM(RUSTURF_TUNNEL), - .landMonsInfo = &RusturfTunnel_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(GRANITE_CAVE_1F), - .mapNum = MAP_NUM(GRANITE_CAVE_1F), - .landMonsInfo = &GraniteCave_1F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(GRANITE_CAVE_B1F), - .mapNum = MAP_NUM(GRANITE_CAVE_B1F), - .landMonsInfo = &GraniteCave_B1F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(GRANITE_CAVE_B2F), - .mapNum = MAP_NUM(GRANITE_CAVE_B2F), - .landMonsInfo = &GraniteCave_B2F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = &GraniteCave_B2F_RockSmashMonsInfo, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(GRANITE_CAVE_STEVENS_ROOM), - .mapNum = MAP_NUM(GRANITE_CAVE_STEVENS_ROOM), - .landMonsInfo = &GraniteCave_StevensRoom_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(PETALBURG_WOODS), - .mapNum = MAP_NUM(PETALBURG_WOODS), - .landMonsInfo = &PetalburgWoods_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(JAGGED_PASS), - .mapNum = MAP_NUM(JAGGED_PASS), - .landMonsInfo = &JaggedPass_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(FIERY_PATH), - .mapNum = MAP_NUM(FIERY_PATH), - .landMonsInfo = &FieryPath_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(MT_PYRE_1F), - .mapNum = MAP_NUM(MT_PYRE_1F), - .landMonsInfo = &MtPyre_1F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(MT_PYRE_2F), - .mapNum = MAP_NUM(MT_PYRE_2F), - .landMonsInfo = &MtPyre_2F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(MT_PYRE_3F), - .mapNum = MAP_NUM(MT_PYRE_3F), - .landMonsInfo = &MtPyre_3F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(MT_PYRE_4F), - .mapNum = MAP_NUM(MT_PYRE_4F), - .landMonsInfo = &MtPyre_4F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(MT_PYRE_5F), - .mapNum = MAP_NUM(MT_PYRE_5F), - .landMonsInfo = &MtPyre_5F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(MT_PYRE_6F), - .mapNum = MAP_NUM(MT_PYRE_6F), - .landMonsInfo = &MtPyre_6F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(MT_PYRE_EXTERIOR), - .mapNum = MAP_NUM(MT_PYRE_EXTERIOR), - .landMonsInfo = &MtPyre_Exterior_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(MT_PYRE_SUMMIT), - .mapNum = MAP_NUM(MT_PYRE_SUMMIT), - .landMonsInfo = &MtPyre_Summit_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ENTRANCE), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ENTRANCE), - .landMonsInfo = NULL, - .waterMonsInfo = &SeafloorCavern_Entrance_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &SeafloorCavern_Entrance_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM1), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM1), - .landMonsInfo = &SeafloorCavern_Room1_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM2), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM2), - .landMonsInfo = &SeafloorCavern_Room2_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM3), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM3), - .landMonsInfo = &SeafloorCavern_Room3_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM4), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM4), - .landMonsInfo = &SeafloorCavern_Room4_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM5), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM5), - .landMonsInfo = &SeafloorCavern_Room5_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM6), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM6), - .landMonsInfo = &SeafloorCavern_Room6_LandMonsInfo, - .waterMonsInfo = &SeafloorCavern_Room6_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &SeafloorCavern_Room6_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM7), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM7), - .landMonsInfo = &SeafloorCavern_Room7_LandMonsInfo, - .waterMonsInfo = &SeafloorCavern_Room7_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &SeafloorCavern_Room7_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM8), - .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM8), - .landMonsInfo = &SeafloorCavern_Room8_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_ENTRANCE), - .mapNum = MAP_NUM(CAVE_OF_ORIGIN_ENTRANCE), - .landMonsInfo = &CaveOfOrigin_Entrance_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_1F), - .mapNum = MAP_NUM(CAVE_OF_ORIGIN_1F), - .landMonsInfo = &CaveOfOrigin_1F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B1F), - .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B1F), - .landMonsInfo = &CaveOfOrigin_B1F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B2F), - .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B2F), - .landMonsInfo = &CaveOfOrigin_B2F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B3F), - .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B3F), - .landMonsInfo = &CaveOfOrigin_B3F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(VICTORY_ROAD_1F), - .mapNum = MAP_NUM(VICTORY_ROAD_1F), - .landMonsInfo = &VictoryRoad_1F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(VICTORY_ROAD_B1F), - .mapNum = MAP_NUM(VICTORY_ROAD_B1F), - .landMonsInfo = &VictoryRoad_B1F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = &VictoryRoad_B1F_RockSmashMonsInfo, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(VICTORY_ROAD_B2F), - .mapNum = MAP_NUM(VICTORY_ROAD_B2F), - .landMonsInfo = &VictoryRoad_B2F_LandMonsInfo, - .waterMonsInfo = &VictoryRoad_B2F_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &VictoryRoad_B2F_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM), - .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM), - .landMonsInfo = &ShoalCave_LowTideEntranceRoom_LandMonsInfo, - .waterMonsInfo = &ShoalCave_LowTideEntranceRoom_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &ShoalCave_LowTideEntranceRoom_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_INNER_ROOM), - .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_INNER_ROOM), - .landMonsInfo = &ShoalCave_LowTideInnerRoom_LandMonsInfo, - .waterMonsInfo = &ShoalCave_LowTideInnerRoom_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &ShoalCave_LowTideInnerRoom_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM), - .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM), - .landMonsInfo = &ShoalCave_LowTideStairsRoom_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_LOWER_ROOM), - .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_LOWER_ROOM), - .landMonsInfo = &ShoalCave_LowTideLowerRoom_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ICE_ROOM), - .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ICE_ROOM), - .landMonsInfo = &ShoalCave_LowTideIceRoom_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(NEW_MAUVILLE_ENTRANCE), - .mapNum = MAP_NUM(NEW_MAUVILLE_ENTRANCE), - .landMonsInfo = &NewMauville_Entrance_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(NEW_MAUVILLE_INSIDE), - .mapNum = MAP_NUM(NEW_MAUVILLE_INSIDE), - .landMonsInfo = &NewMauville_Inside_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(ABANDONED_SHIP_ROOMS_B1F), - .mapNum = MAP_NUM(ABANDONED_SHIP_ROOMS_B1F), - .landMonsInfo = NULL, - .waterMonsInfo = &AbandonedShip_Rooms_B1F_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &AbandonedShip_Rooms_B1F_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS), - .mapNum = MAP_NUM(ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS), - .landMonsInfo = NULL, - .waterMonsInfo = &AbandonedShip_HiddenFloorCorridors_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &AbandonedShip_HiddenFloorCorridors_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SKY_PILLAR_1F), - .mapNum = MAP_NUM(SKY_PILLAR_1F), - .landMonsInfo = &SkyPillar_1F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SKY_PILLAR_3F), - .mapNum = MAP_NUM(SKY_PILLAR_3F), - .landMonsInfo = &SkyPillar_3F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SKY_PILLAR_5F), - .mapNum = MAP_NUM(SKY_PILLAR_5F), - .landMonsInfo = &SkyPillar_5F_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(ROUTE101), - .mapNum = MAP_NUM(ROUTE101), - .landMonsInfo = &Route101_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(ROUTE102), - .mapNum = MAP_NUM(ROUTE102), - .landMonsInfo = &Route102_LandMonsInfo, - .waterMonsInfo = &Route102_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route102_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE103), - .mapNum = MAP_NUM(ROUTE103), - .landMonsInfo = &Route103_LandMonsInfo, - .waterMonsInfo = &Route103_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route103_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE104), - .mapNum = MAP_NUM(ROUTE104), - .landMonsInfo = &Route104_LandMonsInfo, - .waterMonsInfo = &Route104_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route104_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE105), - .mapNum = MAP_NUM(ROUTE105), - .landMonsInfo = NULL, - .waterMonsInfo = &Route105_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route105_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE106), - .mapNum = MAP_NUM(ROUTE106), - .landMonsInfo = NULL, - .waterMonsInfo = &Route106_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route106_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE107), - .mapNum = MAP_NUM(ROUTE107), - .landMonsInfo = NULL, - .waterMonsInfo = &Route107_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route107_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE108), - .mapNum = MAP_NUM(ROUTE108), - .landMonsInfo = NULL, - .waterMonsInfo = &Route108_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route108_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE109), - .mapNum = MAP_NUM(ROUTE109), - .landMonsInfo = NULL, - .waterMonsInfo = &Route109_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route109_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE110), - .mapNum = MAP_NUM(ROUTE110), - .landMonsInfo = &Route110_LandMonsInfo, - .waterMonsInfo = &Route110_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route110_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE111), - .mapNum = MAP_NUM(ROUTE111), - .landMonsInfo = &Route111_LandMonsInfo, - .waterMonsInfo = &Route111_WaterMonsInfo, - .rockSmashMonsInfo = &Route111_RockSmashMonsInfo, - .fishingMonsInfo = &Route111_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE112), - .mapNum = MAP_NUM(ROUTE112), - .landMonsInfo = &Route112_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(ROUTE113), - .mapNum = MAP_NUM(ROUTE113), - .landMonsInfo = &Route113_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(ROUTE114), - .mapNum = MAP_NUM(ROUTE114), - .landMonsInfo = &Route114_LandMonsInfo, - .waterMonsInfo = &Route114_WaterMonsInfo, - .rockSmashMonsInfo = &Route114_RockSmashMonsInfo, - .fishingMonsInfo = &Route114_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE115), - .mapNum = MAP_NUM(ROUTE115), - .landMonsInfo = &Route115_LandMonsInfo, - .waterMonsInfo = &Route115_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route115_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE116), - .mapNum = MAP_NUM(ROUTE116), - .landMonsInfo = &Route116_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(ROUTE117), - .mapNum = MAP_NUM(ROUTE117), - .landMonsInfo = &Route117_LandMonsInfo, - .waterMonsInfo = &Route117_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route117_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE118), - .mapNum = MAP_NUM(ROUTE118), - .landMonsInfo = &Route118_LandMonsInfo, - .waterMonsInfo = &Route118_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route118_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE119), - .mapNum = MAP_NUM(ROUTE119), - .landMonsInfo = &Route119_LandMonsInfo, - .waterMonsInfo = &Route119_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route119_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE120), - .mapNum = MAP_NUM(ROUTE120), - .landMonsInfo = &Route120_LandMonsInfo, - .waterMonsInfo = &Route120_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route120_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE121), - .mapNum = MAP_NUM(ROUTE121), - .landMonsInfo = &Route121_LandMonsInfo, - .waterMonsInfo = &Route121_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route121_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE122), - .mapNum = MAP_NUM(ROUTE122), - .landMonsInfo = NULL, - .waterMonsInfo = &Route122_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route122_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE123), - .mapNum = MAP_NUM(ROUTE123), - .landMonsInfo = &Route123_LandMonsInfo, - .waterMonsInfo = &Route123_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route123_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE124), - .mapNum = MAP_NUM(ROUTE124), - .landMonsInfo = NULL, - .waterMonsInfo = &Route124_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route124_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE125), - .mapNum = MAP_NUM(ROUTE125), - .landMonsInfo = NULL, - .waterMonsInfo = &Route125_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route125_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE126), - .mapNum = MAP_NUM(ROUTE126), - .landMonsInfo = NULL, - .waterMonsInfo = &Route126_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route126_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE127), - .mapNum = MAP_NUM(ROUTE127), - .landMonsInfo = NULL, - .waterMonsInfo = &Route127_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route127_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE128), - .mapNum = MAP_NUM(ROUTE128), - .landMonsInfo = NULL, - .waterMonsInfo = &Route128_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route128_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE129), - .mapNum = MAP_NUM(ROUTE129), - .landMonsInfo = NULL, - .waterMonsInfo = &Route129_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route129_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE130), - .mapNum = MAP_NUM(ROUTE130), - .landMonsInfo = &Route130_LandMonsInfo, - .waterMonsInfo = &Route130_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route130_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE131), - .mapNum = MAP_NUM(ROUTE131), - .landMonsInfo = NULL, - .waterMonsInfo = &Route131_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route131_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE132), - .mapNum = MAP_NUM(ROUTE132), - .landMonsInfo = NULL, - .waterMonsInfo = &Route132_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route132_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE133), - .mapNum = MAP_NUM(ROUTE133), - .landMonsInfo = NULL, - .waterMonsInfo = &Route133_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route133_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(ROUTE134), - .mapNum = MAP_NUM(ROUTE134), - .landMonsInfo = NULL, - .waterMonsInfo = &Route134_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &Route134_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHWEST), - .mapNum = MAP_NUM(SAFARI_ZONE_NORTHWEST), - .landMonsInfo = &SafariZone_Northwest_LandMonsInfo, - .waterMonsInfo = &SafariZone_Northwest_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &SafariZone_Northwest_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHEAST), - .mapNum = MAP_NUM(SAFARI_ZONE_NORTHEAST), - .landMonsInfo = &SafariZone_Northeast_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = &SafariZone_Northeast_RockSmashMonsInfo, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHWEST), - .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHWEST), - .landMonsInfo = &SafariZone_Southwest_LandMonsInfo, - .waterMonsInfo = &SafariZone_Southwest_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &SafariZone_Southwest_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHEAST), - .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHEAST), - .landMonsInfo = &SafariZone_Southeast_LandMonsInfo, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(DEWFORD_TOWN), - .mapNum = MAP_NUM(DEWFORD_TOWN), - .landMonsInfo = NULL, - .waterMonsInfo = &DewfordTown_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &DewfordTown_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(PACIFIDLOG_TOWN), - .mapNum = MAP_NUM(PACIFIDLOG_TOWN), - .landMonsInfo = NULL, - .waterMonsInfo = &PacifidlogTown_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = &PacifidlogTown_FishingMonsInfo, - }, - { - .mapGroup = MAP_GROUP(UNDERWATER1), - .mapNum = MAP_NUM(UNDERWATER1), - .landMonsInfo = NULL, - .waterMonsInfo = &Underwater1_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(UNDERWATER2), - .mapNum = MAP_NUM(UNDERWATER2), - .landMonsInfo = NULL, - .waterMonsInfo = &Underwater2_WaterMonsInfo, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, - { - .mapGroup = MAP_GROUP(UNDEFINED), - .mapNum = MAP_NUM(UNDEFINED), - .landMonsInfo = NULL, - .waterMonsInfo = NULL, - .rockSmashMonsInfo = NULL, - .fishingMonsInfo = NULL, - }, -}; - -const struct WildPokemon gWildFeebasRoute119Data = {20, 25, SPECIES_FEEBAS}; - -const u16 gRoute119WaterTileData[] = -{ - 0, 0x2D, 0, - 0x2E, 0x5B, 0x83, - 0x5C, 0x8B, 0x12A, -}; - -extern u16 gSpecialVar_Result; -extern u8 S_RepelWoreOff[]; - -EWRAM_DATA u8 sWildEncountersDisabled = 0; -EWRAM_DATA static u32 sFeebasRngValue = 0; - -#define NUM_FEEBAS_SPOTS 6 - -u16 FeebasRandom(void); -void FeebasSeedRng(u16 seed); - -static bool8 IsWildLevelAllowedByRepel(u8 level); -static void ApplyFluteEncounterRateMod(u32 *encRate); -static void ApplyCleanseTagEncounterRateMod(u32 *encRate); - -void DisableWildEncounters(bool8 disabled) -{ - sWildEncountersDisabled = disabled; -} - -static u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section) -{ - u16 xCur; - u16 yCur; - u16 yMin = gRoute119WaterTileData[section * 3 + 0]; - u16 yMax = gRoute119WaterTileData[section * 3 + 1]; - u16 tileNum = gRoute119WaterTileData[section * 3 + 2]; - - for (yCur = yMin; yCur <= yMax; yCur++) - { - for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++) - { - if (sub_805759C(MapGridGetMetatileBehaviorAt(xCur + 7, yCur + 7)) == TRUE) - { - tileNum++; - if (x == xCur && y == yCur) - return tileNum; - } - } - } - return tileNum + 1; -} - -static bool8 CheckFeebas(void) -{ - u8 i; - u16 feebasSpots[6]; - s16 x; - s16 y; - u8 route119section = 0; - u16 waterTileNum; - - if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE119) - && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE119)) - { - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - x -= 7; - y -= 7; - -#ifdef NONMATCHING - if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1]) - route119section = 1; - if (y >= gRoute119WaterTileData[3 * 2 + 0] && y <= gRoute119WaterTileData[3 * 2 + 1]) - route119section = 2; -#else - { - register const u16 *arr asm("r0"); - if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1]) - route119section = 1; - if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1]) - route119section = 2; - } -#endif - - if (Random() % 100 > 49) //50% chance of encountering Feebas - return FALSE; - - FeebasSeedRng(gSaveBlock1.easyChatPairs[0].unk2); - for (i = 0; i != NUM_FEEBAS_SPOTS;) - { - feebasSpots[i] = FeebasRandom() % 447; - if (feebasSpots[i] == 0) - feebasSpots[i] = 447; - if (feebasSpots[i] < 1 || feebasSpots[i] >= 4) - i++; - } - waterTileNum = GetRoute119WaterTileNum(x, y, route119section); - for (i = 0; i < NUM_FEEBAS_SPOTS; i++) - { - if (waterTileNum == feebasSpots[i]) - return TRUE; - } - } - return FALSE; -} - -u16 FeebasRandom(void) -{ - sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue; - return sFeebasRngValue >> 16; -} - -void FeebasSeedRng(u16 seed) -{ - sFeebasRngValue = seed; -} - -#if DEBUG -u16 debug_sub_8092344(u8 arg0) -{ - if (arg0 == 0) - return 131; - if (arg0 == 1) - return 167; - if (arg0 == 2) - return 149; - return 0; -} -#endif - -static u8 ChooseWildMonIndex_Land(void) -{ - u8 rand = Random() % 100; - - if (rand < 20) //20% chance - return 0; - if (rand >= 20 && rand < 40) //20% chance - return 1; - if (rand >= 40 && rand < 50) //10% chance - return 2; - if (rand >= 50 && rand < 60) //10% chance - return 3; - if (rand >= 60 && rand < 70) //10% chance - return 4; - if (rand >= 70 && rand < 80) //10% chance - return 5; - if (rand >= 80 && rand < 85) //5% chance - return 6; - if (rand >= 85 && rand < 90) //5% chance - return 7; - if (rand >= 90 && rand < 94) //4% chance - return 8; - if (rand >= 94 && rand < 98) //4% chance - return 9; - if (rand == 98) //1% chance - return 10; - else //1% chance - return 11; -} - -static u8 ChooseWildMonIndex_Water(void) -{ - u8 rand = Random() % 100; - - if (rand < 60) //60% chance - return 0; - if (rand >= 60 && rand < 90) //30% chance - return 1; - if (rand >= 90 && rand < 95) //5% chance - return 2; - if (rand >= 95 && rand < 99) //4% chance - return 3; - else //1% chance - return 4; -} - -enum -{ - OLD_ROD, - GOOD_ROD, - SUPER_ROD -}; - -static u8 ChooseWildMonIndex_Fishing(u8 rod) -{ - u8 wildMonIndex = 0; - u8 rand = Random() % 100; - - switch (rod) - { - case OLD_ROD: - if (rand < 70) //70% chance - wildMonIndex = 0; - else //30% chance - wildMonIndex = 1; - break; - case GOOD_ROD: - if (rand < 60) //60% chance - wildMonIndex = 2; - if (rand >= 60 && rand < 80) //20% chance - wildMonIndex = 3; - if (rand >= 80 && rand < 100) //20% chance - wildMonIndex = 4; - break; - case SUPER_ROD: - if (rand < 40) //40% chance - wildMonIndex = 5; - if (rand >= 40 && rand < 80) //40% chance - wildMonIndex = 6; - if (rand >= 80 && rand < 95) //15% chance - wildMonIndex = 7; - if (rand >= 95 && rand < 99) //4% chance - wildMonIndex = 8; - if (rand == 99) //1% chance - wildMonIndex = 9; - break; - } - return wildMonIndex; -} - -static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon) -{ - u8 min; - u8 max; - u8 range; - u8 rand; - - //Make sure minimum level is less than maximum level - if (wildPokemon->maxLevel >= wildPokemon->minLevel) - { - min = wildPokemon->minLevel; - max = wildPokemon->maxLevel; - } - else - { - min = wildPokemon->maxLevel; - max = wildPokemon->minLevel; - } - range = max - min + 1; - rand = Random() % range; - return min + rand; -} - -static u16 GetCurrentMapWildMonHeader(void) -{ - u16 i; - - for (i = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++) - { - if (gWildMonHeaders[i].mapGroup == gSaveBlock1.location.mapGroup && - gWildMonHeaders[i].mapNum == gSaveBlock1.location.mapNum) - return i; - } - return -1; -} - -static u8 PickWildMonNature(void) -{ - u8 i; - u8 j; - struct Pokeblock *safariPokeblock; - u8 natures[25]; - - if (GetSafariZoneFlag() == TRUE && Random() % 100 < 80) - { - safariPokeblock = SafariZoneGetActivePokeblock(); - if (safariPokeblock != NULL) - { - for (i = 0; i < 25; i++) - natures[i] = i; - for (i = 0; i < 24; i++) - { - for (j = i + 1; j < 25; j++) - { - if (Random() & 1) - { - u8 temp = natures[i]; - - natures[i] = natures[j]; - natures[j] = temp; - } - } - } - for (i = 0; i < 25; i++) - { - if (PokeblockGetGain(natures[i], safariPokeblock) > 0) - return natures[i]; - } - } - } - return Random() % 25; -} - -static void CreateWildMon(u16 species, u8 b) -{ - ZeroEnemyPartyMons(); - CreateMonWithNature(&gEnemyParty[0], species, b, 0x20, PickWildMonNature()); -} - -static bool8 GenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 area, bool8 checkRepel) -{ - u8 wildMonIndex = 0; - u8 level; - - switch (area) - { - case 0: - wildMonIndex = ChooseWildMonIndex_Land(); - break; - case 1: - wildMonIndex = ChooseWildMonIndex_Water(); - break; - case 2: - wildMonIndex = ChooseWildMonIndex_Water(); - break; - } - level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); - if (checkRepel == TRUE && IsWildLevelAllowedByRepel(level) == FALSE) - return FALSE; - else - { - CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); - return TRUE; - } -} - -static u16 GenerateFishingWildMon(const struct WildPokemonInfo *wildMonInfo, u8 rod) -{ - u8 wildMonIndex = ChooseWildMonIndex_Fishing(rod); - u8 level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); - - CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); - return wildMonInfo->wildPokemon[wildMonIndex].species; -} - -static bool8 SetUpMassOutbreakEncounter(bool8 checkRepel) -{ - u16 i; - - if (checkRepel == TRUE && IsWildLevelAllowedByRepel(gSaveBlock1.outbreakPokemonLevel) == FALSE) - return FALSE; - else - { - CreateWildMon(gSaveBlock1.outbreakPokemonSpecies, gSaveBlock1.outbreakPokemonLevel); - for (i = 0; i < 4; i++) - SetMonMoveSlot(&gEnemyParty[0], gSaveBlock1.outbreakPokemonMoves[i], i); - return TRUE; - } -} - -static bool8 DoMassOutbreakEncounterTest(void) -{ - if (gSaveBlock1.outbreakPokemonSpecies != 0 - && gSaveBlock1.location.mapNum == gSaveBlock1.outbreakLocationMapNum - && gSaveBlock1.location.mapGroup == gSaveBlock1.outbreakLocationMapGroup) - { - if (Random() % 100 < gSaveBlock1.outbreakPokemonProbability) - return TRUE; - } - return FALSE; -} - -static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) -{ - if (Random() % 2880 < encounterRate) - return TRUE; - else - return FALSE; -} - -#if DEBUG -u16 debug_sub_809283C(u16 attempts) -{ - u16 retval = 0; - u16 i = 0; - - while (i < attempts) - { - if (DoWildEncounterRateDiceRoll(320) == TRUE) - retval++; - - i++; - } - - return retval; -} -#endif - -static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility) -{ - encounterRate *= 16; - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - encounterRate = encounterRate * 80 / 100; - ApplyFluteEncounterRateMod(&encounterRate); - ApplyCleanseTagEncounterRateMod(&encounterRate); - if (!ignoreAbility) - { - // UB: Too few arguments for function 'GetMonData' - if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) - { - u32 ability = GetMonAbility(&gPlayerParty[0]); - if (ability == ABILITY_STENCH) - encounterRate /= 2; - if (ability == ABILITY_ILLUMINATE) - encounterRate *= 2; - } - } - if (encounterRate > 2880) - encounterRate = 2880; - return DoWildEncounterRateDiceRoll(encounterRate); -} - -static bool8 DoGlobalWildEncounterDiceRoll(void) -{ - if (Random() % 100 >= 60) - return FALSE; - else - return TRUE; -} - -bool8 StandardWildEncounter(u16 a, u16 b) -{ - u16 headerNum; - struct Roamer *roamer; - - if (sWildEncountersDisabled == TRUE) - return 0; - else - { - headerNum = GetCurrentMapWildMonHeader(); - if (headerNum != 0xFFFF) - { - if (MetatileBehavior_IsLandWildEncounter(a) == TRUE) - { - if (gWildMonHeaders[headerNum].landMonsInfo) - { - if (b != a && !DoGlobalWildEncounterDiceRoll()) - return 0; - - if (DoWildEncounterTest(gWildMonHeaders[headerNum].landMonsInfo->encounterRate, 0) == TRUE) - { - if (TryStartRoamerEncounter() == TRUE) - { - roamer = &gSaveBlock1.roamer; - if (IsWildLevelAllowedByRepel(roamer->level)) - { - BattleSetup_StartRoamerBattle(); - return 1; - } - } - else - { - if (DoMassOutbreakEncounterTest() == TRUE && SetUpMassOutbreakEncounter(1) == TRUE) - { - BattleSetup_StartWildBattle(); - return 1; - } - if (GenerateWildMon(gWildMonHeaders[headerNum].landMonsInfo, 0, TRUE) == TRUE) - { - goto label; - } - } - } - } - } - else if (MetatileBehavior_IsWaterWildEncounter(a) == TRUE - || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(a) == TRUE)) - { - if (gWildMonHeaders[headerNum].waterMonsInfo) - { - if (b != a && !DoGlobalWildEncounterDiceRoll()) - return 0; - - if (DoWildEncounterTest(gWildMonHeaders[headerNum].waterMonsInfo->encounterRate, 0) == TRUE) - { - if (TryStartRoamerEncounter() == TRUE) - { - roamer = &gSaveBlock1.roamer; - if (IsWildLevelAllowedByRepel(roamer->level)) - { - BattleSetup_StartRoamerBattle(); - return 1; - } - } - else - { - //_08085268 - if (GenerateWildMon(gWildMonHeaders[headerNum].waterMonsInfo, 1, TRUE) == TRUE) - { - label: - //_0808527A - BattleSetup_StartWildBattle(); - return 1; - } - } - } - } - } - } - } - return 0; -} - -void ScrSpecial_RockSmashWildEncounter(void) -{ - u16 headerNum = GetCurrentMapWildMonHeader(); - - if (headerNum != 0xFFFF) - { - const struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerNum].rockSmashMonsInfo; - - if (wildPokemonInfo == NULL) - { - gSpecialVar_Result = 0; - return; - } - else if (DoWildEncounterTest(wildPokemonInfo->encounterRate, 1) == TRUE - && GenerateWildMon(wildPokemonInfo, 2, TRUE) == TRUE) - { - BattleSetup_StartWildBattle(); - gSpecialVar_Result = 1; - return; - } - } - gSpecialVar_Result = 0; - return; -} - -bool8 SweetScentWildEncounter(void) -{ - s16 x; - s16 y; - u16 headerNum; - const struct WildPokemonInfo *wildPokemonInfo; - - PlayerGetDestCoords(&x, &y); - if ((headerNum = GetCurrentMapWildMonHeader()) != 0xFFFF) - { - if (MetatileBehavior_IsLandWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1) - { - wildPokemonInfo = gWildMonHeaders[headerNum].landMonsInfo; - if (wildPokemonInfo == NULL) - return FALSE; - if (TryStartRoamerEncounter() == TRUE) - { - BattleSetup_StartRoamerBattle(); - return TRUE; - } - if (DoMassOutbreakEncounterTest() == TRUE) - SetUpMassOutbreakEncounter(FALSE); - else - GenerateWildMon(wildPokemonInfo, 0, FALSE); - BattleSetup_StartWildBattle(); - return TRUE; - } - else if (MetatileBehavior_IsWaterWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1) - { - wildPokemonInfo = gWildMonHeaders[headerNum].waterMonsInfo; - if (wildPokemonInfo == NULL) - return FALSE; - if (TryStartRoamerEncounter() == TRUE) - { - BattleSetup_StartRoamerBattle(); - return TRUE; - } - GenerateWildMon(wildPokemonInfo, 1, FALSE); - BattleSetup_StartWildBattle(); - return TRUE; - } - } - return FALSE; -} - -bool8 DoesCurrentMapHaveFishingMons(void) -{ - u16 headerNum = GetCurrentMapWildMonHeader(); - - if (headerNum != 0xFFFF && gWildMonHeaders[headerNum].fishingMonsInfo != NULL) - return TRUE; - else - return FALSE; -} - -void FishingWildEncounter(u8 rod) -{ - u16 species; - - if (CheckFeebas() == TRUE) - { - u8 level = ChooseWildMonLevel(&gWildFeebasRoute119Data); - - species = gWildFeebasRoute119Data.species; - CreateWildMon(species, level); - } - else - { - species = GenerateFishingWildMon( - gWildMonHeaders[GetCurrentMapWildMonHeader()].fishingMonsInfo, - rod); - } - IncrementGameStat(GAME_STAT_FISHING_CAPTURES); - sub_80BEA50(species); - BattleSetup_StartWildBattle(); -} - -u16 GetLocalWildMon(bool8 *isWaterMon) -{ - u16 headerNum; - const struct WildPokemonInfo *landMonsInfo; - const struct WildPokemonInfo *waterMonsInfo; - - *isWaterMon = FALSE; - headerNum = GetCurrentMapWildMonHeader(); - if (headerNum == 0xFFFF) - return 0; - landMonsInfo = gWildMonHeaders[headerNum].landMonsInfo; - waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; - //Neither - if (landMonsInfo == NULL && waterMonsInfo == NULL) - return 0; - //Land Pokemon - if (landMonsInfo != NULL && waterMonsInfo == NULL) - return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; - //Water Pokemon - if (landMonsInfo == NULL && waterMonsInfo != NULL) - { - *isWaterMon = TRUE; - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; - } - //Either land or water Pokemon - if ((Random() % 100) < 80) - return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; - else - { - *isWaterMon = TRUE; - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; - } -} - -u16 GetLocalWaterMon(void) -{ - u16 headerNum = GetCurrentMapWildMonHeader(); - - if (headerNum != 0xFFFF) - { - const struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; - - if (waterMonsInfo) - return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; - } - return 0; -} - -bool8 UpdateRepelCounter(void) -{ - u16 steps = VarGet(VAR_REPEL_STEP_COUNT); - - if (steps != 0) - { - steps--; - VarSet(VAR_REPEL_STEP_COUNT, steps); - if (steps == 0) - { - ScriptContext1_SetupScript(S_RepelWoreOff); - return TRUE; - } - } - return FALSE; -} - -static bool8 IsWildLevelAllowedByRepel(u8 wildLevel) -{ - u8 i; - - if (!VarGet(VAR_REPEL_STEP_COUNT)) - { - return TRUE; - } - else - { - for (i = 0; i < 6; i++) - { - // UB: Too few arguments for function 'GetMonData' - if (GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) - { - u8 ourLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - - if (wildLevel < ourLevel) - return FALSE; - else - return TRUE; - } - } - return FALSE; - } -} - -static void ApplyFluteEncounterRateMod(u32 *encRate) -{ - if (FlagGet(FLAG_SYS_ENC_UP_ITEM) == TRUE) - *encRate += *encRate / 2; - else if (FlagGet(FLAG_SYS_ENC_DOWN_ITEM) == TRUE) - *encRate = *encRate / 2; -} - -static void ApplyCleanseTagEncounterRateMod(u32 *encRate) -{ - // UB: Too few arguments for function 'GetMonData' - if (GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM) == 0xBE) - *encRate = *encRate * 2 / 3; -} diff --git a/src/field_camera.c b/src/field_camera.c new file mode 100644 index 000000000..8384ad8d1 --- /dev/null +++ b/src/field_camera.c @@ -0,0 +1,496 @@ +#include "global.h" +#include "field_camera.h" +#include "berry.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "rotating_gate.h" +#include "sprite.h" +#include "text.h" + +EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE; + +struct UnknownStruct +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + bool8 unk4; +}; + +static struct UnknownStruct gUnknown_03000590; +static u16 gUnknown_03000598; +static s16 gUnknown_0300059A; +static u8 gUnknown_0300059C; +static void (*gUnknown_030005A0)(void); + +struct CameraSomething gUnknown_03004880; +u16 gUnknown_03004898; +u16 gUnknown_0300489C; + +static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData); +static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData); +static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData); +static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData); +static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y); + +static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData); +static void DrawMetatileAt(struct MapData *mapData, u16, int, int); +static void DrawMetatile(s32 a, u16 *b, u16 c); +static void CameraPanningCB_PanAhead(void); + +static void move_tilemap_camera_to_upper_left_corner_(struct UnknownStruct *a) +{ + a->unk2 = 0; + a->unk3 = 0; + a->unk0 = 0; + a->unk1 = 0; + a->unk4 = TRUE; +} + +static void tilemap_move_something(struct UnknownStruct *a, u32 b, u32 c) +{ + a->unk2 += b; + a->unk2 %= 32; + a->unk3 += c; + a->unk3 %= 32; +} + +static void coords8_add(struct UnknownStruct *a, u32 b, u32 c) +{ + a->unk0 += b; + a->unk1 += c; +} + +void move_tilemap_camera_to_upper_left_corner(void) +{ + move_tilemap_camera_to_upper_left_corner_(&gUnknown_03000590); + CpuFill16(0, gBGTilemapBuffers[2], 0x800); + CpuFill16(0, gBGTilemapBuffers[1], 0x800); + CpuFill16(0x3014, gBGTilemapBuffers[3], 0x800); +} + +void sub_8057A58(void) +{ + *gBGHOffsetRegs[1] = gUnknown_03000590.unk0 + gUnknown_03000598; + *gBGVOffsetRegs[1] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; + *gBGHOffsetRegs[2] = gUnknown_03000590.unk0 + gUnknown_03000598; + *gBGVOffsetRegs[2] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; + *gBGHOffsetRegs[3] = gUnknown_03000590.unk0 + gUnknown_03000598; + *gBGVOffsetRegs[3] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; + + if (gUnknown_03000590.unk4) + { + DmaCopy16(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800); + DmaCopy16(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800); + DmaCopy16(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800); + gUnknown_03000590.unk4 = FALSE; + } +} + +void sub_8057B14(u16 *a, u16 *b) +{ + *a = gUnknown_03000590.unk0 + gUnknown_03000598; + *b = gUnknown_03000590.unk1 + gUnknown_0300059A + 8; +} + +void DrawWholeMapView(void) +{ + DrawWholeMapViewInternal(gSaveBlock1.pos.x, gSaveBlock1.pos.y, gMapHeader.mapData); + gUnknown_03000590.unk4 = TRUE; +} + +static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData) +{ + u8 i; + u8 j; + u32 r6; + u8 temp; + + for (i = 0; i < 32; i += 2) + { + temp = gUnknown_03000590.unk3 + i; + if (temp >= 32) + temp -= 32; + r6 = temp * 32; + for (j = 0; j < 32; j += 2) + { + temp = gUnknown_03000590.unk2 + j; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, r6 + temp, x + j / 2, y + i / 2); + } + } +} + +static void RedrawMapSlicesForCameraUpdate(struct UnknownStruct *a, int x, int y) +{ + struct MapData *mapData = gMapHeader.mapData; + + if (x > 0) + RedrawMapSliceWest(a, mapData); + if (x < 0) + RedrawMapSliceEast(a, mapData); + if (y > 0) + RedrawMapSliceNorth(a, mapData); + if (y < 0) + RedrawMapSliceSouth(a, mapData); + a->unk4 = TRUE; +} + +static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData) +{ + u8 i; + u8 temp; + u32 r7; + + temp = a->unk3 + 28; + if (temp >= 32) + temp -= 32; + r7 = temp * 32; + for (i = 0; i < 32; i += 2) + { + temp = a->unk2 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y + 14); + } +} + +static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData) +{ + u8 i; + u8 temp; + u32 r7 = a->unk3 * 32; + + for (i = 0; i < 32; i += 2) + { + temp = a->unk2 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y); + } +} + +static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData) +{ + u8 i; + u8 temp; + u32 r6 = a->unk2; + + for (i = 0; i < 32; i += 2) + { + temp = a->unk3 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, temp * 32 + r6, gSaveBlock1.pos.x, gSaveBlock1.pos.y + i / 2); + } +} + +static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData) +{ + u8 i; + u8 temp; + u8 r5 = a->unk2 + 28; + + if (r5 >= 32) + r5 -= 32; + for (i = 0; i < 32; i += 2) + { + temp = a->unk3 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapData, temp * 32 + r5, gSaveBlock1.pos.x + 14, gSaveBlock1.pos.y + i / 2); + } +} + +void CurrentMapDrawMetatileAt(int a, int b) +{ + int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, a, b); + + if (offset >= 0) + { + DrawMetatileAt(gMapHeader.mapData, offset, a, b); + gUnknown_03000590.unk4 = TRUE; + } +} + +void DrawDoorMetatileAt(int x, int y, u16 *arr) +{ + int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, x, y); + + if (offset >= 0) + { + DrawMetatile(1, arr, offset); + gUnknown_03000590.unk4 = TRUE; + } +} + +static void DrawMetatileAt(struct MapData *mapData, u16 b, int c, int d) +{ + u16 metatileId = MapGridGetMetatileIdAt(c, d); + u16 *metatiles; + + if (metatileId > 1024) + metatileId = 0; + if (metatileId < 512) + metatiles = mapData->primaryTileset->metatiles; + else + { + metatiles = mapData->secondaryTileset->metatiles; + metatileId -= 512; + } + DrawMetatile(MapGridGetMetatileLayerTypeAt(c, d), metatiles + metatileId * 8, b); +} + +static void DrawMetatile(s32 a, u16 *b, u16 c) +{ + switch (a) + { + case 2: + gBGTilemapBuffers[3][c] = b[0]; + gBGTilemapBuffers[3][c + 1] = b[1]; + gBGTilemapBuffers[3][c + 0x20] = b[2]; + gBGTilemapBuffers[3][c + 0x21] = b[3]; + + gBGTilemapBuffers[2][c] = 0; + gBGTilemapBuffers[2][c + 1] = 0; + gBGTilemapBuffers[2][c + 0x20] = 0; + gBGTilemapBuffers[2][c + 0x21] = 0; + + gBGTilemapBuffers[1][c] = b[4]; + gBGTilemapBuffers[1][c + 1] = b[5]; + gBGTilemapBuffers[1][c + 0x20] = b[6]; + gBGTilemapBuffers[1][c + 0x21] = b[7]; + break; + case 1: + gBGTilemapBuffers[3][c] = b[0]; + gBGTilemapBuffers[3][c + 1] = b[1]; + gBGTilemapBuffers[3][c + 0x20] = b[2]; + gBGTilemapBuffers[3][c + 0x21] = b[3]; + + gBGTilemapBuffers[2][c] = b[4]; + gBGTilemapBuffers[2][c + 1] = b[5]; + gBGTilemapBuffers[2][c + 0x20] = b[6]; + gBGTilemapBuffers[2][c + 0x21] = b[7]; + + gBGTilemapBuffers[1][c] = 0; + gBGTilemapBuffers[1][c + 1] = 0; + gBGTilemapBuffers[1][c + 0x20] = 0; + gBGTilemapBuffers[1][c + 0x21] = 0; + break; + case 0: + gBGTilemapBuffers[3][c] = 0x3014; + gBGTilemapBuffers[3][c + 1] = 0x3014; + gBGTilemapBuffers[3][c + 0x20] = 0x3014; + gBGTilemapBuffers[3][c + 0x21] = 0x3014; + + gBGTilemapBuffers[2][c] = b[0]; + gBGTilemapBuffers[2][c + 1] = b[1]; + gBGTilemapBuffers[2][c + 0x20] = b[2]; + gBGTilemapBuffers[2][c + 0x21] = b[3]; + + gBGTilemapBuffers[1][c] = b[4]; + gBGTilemapBuffers[1][c + 1] = b[5]; + gBGTilemapBuffers[1][c + 0x20] = b[6]; + gBGTilemapBuffers[1][c + 0x21] = b[7]; + break; + } +} + +static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y) +{ + x -= gSaveBlock1.pos.x; + x *= 2; + if (x >= 32 || x < 0) + return -1; + x = x + a->unk2; + if (x >= 32) + x -= 32; + + y = (y - gSaveBlock1.pos.y) * 2; + if (y >= 32 || y < 0) + return -1; + y = y + a->unk3; + if (y >= 32) + y -= 32; + + return y * 32 + x; +} + +static void CameraUpdateCallback(struct CameraSomething *a) +{ + if (a->unk4 != 0) + { + a->unk8 = gSprites[a->unk4].data[2]; + a->unkC = gSprites[a->unk4].data[3]; + } +} + +void ResetCameraUpdateInfo(void) +{ + gUnknown_03004880.unk8 = 0; + gUnknown_03004880.unkC = 0; + gUnknown_03004880.unk10 = 0; + gUnknown_03004880.unk14 = 0; + gUnknown_03004880.unk4 = 0; + gUnknown_03004880.callback = NULL; +} + +u32 InitCameraUpdateCallback(u8 a) +{ + if (gUnknown_03004880.unk4 != 0) + DestroySprite(&gSprites[gUnknown_03004880.unk4]); + gUnknown_03004880.unk4 = AddCameraObject(a); + gUnknown_03004880.callback = CameraUpdateCallback; + return 0; +} + +void CameraUpdate(void) +{ + int deltaX; + int deltaY; + int r0; + int r1; + int r7; + int r8; + + if (gUnknown_03004880.callback != NULL) + gUnknown_03004880.callback(&gUnknown_03004880); + r7 = gUnknown_03004880.unk8; + r8 = gUnknown_03004880.unkC; + deltaX = 0; + deltaY = 0; + r1 = gUnknown_03004880.unk10; + r0 = gUnknown_03004880.unk14; + + + if (r1 == 0 && r7 != 0) + { + if (r7 > 0) + deltaX = 1; + else + deltaX = -1; + } + if (r0 == 0 && r8 != 0) + { + if (r8 > 0) + deltaY = 1; + else + deltaY = -1; + } + if (r1 != 0 && r1 == -r7) + { + if (r7 > 0) + deltaX = 1; + else + deltaX = -1; + } + if (r0 != 0 && r0 == -r8) + { + if (r8 > 0) + deltaX = 1; + else + deltaX = -1; + } + + gUnknown_03004880.unk10 += r7; + gUnknown_03004880.unk10 = gUnknown_03004880.unk10 - 16 * (gUnknown_03004880.unk10 / 16); + gUnknown_03004880.unk14 += r8; + gUnknown_03004880.unk14 = gUnknown_03004880.unk14 - 16 * (gUnknown_03004880.unk14 / 16); + + if (deltaX != 0 || deltaY != 0) + { + CameraMove(deltaX, deltaY); + UpdateFieldObjectsForCameraUpdate(deltaX, deltaY); + RotatingGatePuzzleCameraUpdate(deltaX, deltaY); + ResetBerryTreeSparkleFlags(); + tilemap_move_something(&gUnknown_03000590, deltaX * 2, deltaY * 2); + RedrawMapSlicesForCameraUpdate(&gUnknown_03000590, deltaX * 2, deltaY * 2); + } + + coords8_add(&gUnknown_03000590, r7, r8); + gUnknown_0300489C -= r7; + gUnknown_03004898 -= r8; +} + +void camera_move_and_redraw(int a, int b) +{ + CameraMove(a, b); + UpdateFieldObjectsForCameraUpdate(a, b); + DrawWholeMapView(); + gUnknown_0300489C -= a * 16; + gUnknown_03004898 -= b * 16; +} + +void SetCameraPanningCallback(void (*a)(void)) +{ + gUnknown_030005A0 = a; +} + +void SetCameraPanning(s16 a, s16 b) +{ + gUnknown_03000598 = a; + gUnknown_0300059A = b + 32; +} + +void InstallCameraPanAheadCallback(void) +{ + gUnknown_030005A0 = CameraPanningCB_PanAhead; + gUnknown_0300059C = 0; + gUnknown_03000598 = 0; + gUnknown_0300059A = 32; +} + +void UpdateCameraPanning(void) +{ + if (gUnknown_030005A0 != NULL) + gUnknown_030005A0(); + //Update sprite offset of overworld objects + gSpriteCoordOffsetX = gUnknown_0300489C - gUnknown_03000598; + gSpriteCoordOffsetY = gUnknown_03004898 - gUnknown_0300059A - 8; +} + +static void CameraPanningCB_PanAhead(void) +{ + u8 var; + + if (gUnusedBikeCameraAheadPanback == FALSE) + { + InstallCameraPanAheadCallback(); + } + else + { + // this code is never reached. + if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) + { + gUnknown_0300059C ^= 1; + if (gUnknown_0300059C == 0) + return; + } + else + { + gUnknown_0300059C = 0; + } + + var = player_get_direction_upper_nybble(); + if (var == 2) + { + if (gUnknown_0300059A > -8) + gUnknown_0300059A -= 2; + } + else if (var == 1) + { + if (gUnknown_0300059A < 72) + gUnknown_0300059A += 2; + } + else if (gUnknown_0300059A < 32) + { + gUnknown_0300059A += 2; + } + else if (gUnknown_0300059A > 32) + { + gUnknown_0300059A -= 2; + } + } +} diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c new file mode 100644 index 000000000..3ae422512 --- /dev/null +++ b/src/field_control_avatar.c @@ -0,0 +1,934 @@ +#include "global.h" +#include "field_control_avatar.h" +#include "battle_setup.h" +#include "bike.h" +#include "coord_event_weather.h" +#include "daycare.h" +#include "debug.h" +#include "event_data.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "field_poison.h" +#include "field_specials.h" +#include "fieldmap.h" +#include "constants/flags.h" +#include "item_menu.h" +#include "metatile_behavior.h" +#include "overworld.h" +#include "safari_zone.h" +#include "script.h" +#include "secret_base.h" +#include "constants/songs.h" +#include "sound.h" +#include "start_menu.h" +#include "trainer_see.h" +#include "constants/vars.h" +#include "wild_encounter.h" + +struct Coords32 +{ + s32 x; + s32 y; +}; + +extern u16 gSpecialVar_LastTalked; +extern u16 gSpecialVar_Facing; +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u8 gUnknown_020297ED; + +static EWRAM_DATA u8 gUnknown_0202E8C0 = 0; +static EWRAM_DATA u16 gUnknown_0202E8C2 = 0; + +u8 gSelectedMapObject; + +//scripts +extern u8 gUnknown_081A2C51[]; +extern u8 gUnknown_0815281E[]; +extern u8 gUnknown_08152C39[]; +extern u8 gUnknown_0815F36C[]; +extern u8 gUnknown_0815F43A[]; +extern u8 gUnknown_081A0009[]; +extern u8 gUnknown_081C6C02[]; +extern u8 HiddenItemScript[]; +extern u8 Event_TV[]; +extern u8 gUnknown_081A0009[]; +extern u8 ClosedSootopolisGymDoorScript[]; +extern u8 gUnknown_081A4363[]; +extern u8 gUnknown_081C346A[]; +extern u8 gUnknown_081616E1[]; +extern u8 Event_WorldMap[]; +extern u8 S_RunningShoesManual[]; +extern u8 PictureBookShelfScript[]; +extern u8 BookshelfScript[]; +extern u8 PokemonCenterBookshelfScript[]; +extern u8 VaseScript[]; +extern u8 TrashCanScript[]; +extern u8 ShopShelfScript[]; +extern u8 BlueprintScript[]; +extern u8 gUnknown_0815F36C[]; +extern u8 gUnknown_0815F43A[]; +extern u8 gUnknown_0815F523[]; +extern u8 gUnknown_0815F528[]; +extern u8 UseSurfScript[]; +extern u8 S_UseWaterfall[]; +extern u8 S_CannotUseWaterfall[]; +extern u8 UseDiveScript[]; +extern u8 S_UseDiveUnderwater[]; +extern u8 S_FallDownHole[]; +extern u8 gUnknown_081A14B8[]; +extern u8 S_EggHatch[]; +extern u8 gUnknown_0815FD0D[]; +extern u8 gUnknown_081C6BDE[]; + +static void player_get_pos_to_and_height(struct MapPosition *); +static void player_get_next_pos_and_height(struct MapPosition *); +static u16 cur_mapdata_block_role_at_player_pos(int); +static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c); +static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c); +static u8 *sub_8068364(struct MapPosition *, u8, u8); +static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *, u8, u8 c); +static u8 *sub_8068500(struct MapPosition *, u8, u8); +static u8 *TryGetFieldMoveScript(struct MapPosition *, u8, u8); +static bool32 sub_8068770(void); +static bool32 sub_80687A4(void); +static bool8 sub_80687E4(struct MapPosition *, u16, u16); +static void happiness_algorithm_step(void); +static bool8 overworld_poison_step(void); +static bool8 is_it_battle_time_3(u16); +static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); +static bool8 sub_8068B30(u16); +static bool8 is_non_stair_warp_tile(u16, u8); +static s8 map_warp_check_packed(struct MapHeader *, struct MapPosition *); +static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *); +static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); +static s8 map_warp_check(struct MapHeader *, u16, u16, u8); +static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8); +static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);; + +void FieldClearPlayerInput(struct FieldInput *input) +{ + input->pressedAButton = 0; + input->input_field_0_1 = 0; + input->pressedStartButton = 0; + input->pressedSelectButton = 0; + input->input_field_0_4 = 0; + input->input_field_0_5 = 0; + input->input_field_0_6 = 0; + input->pressedBButton = 0; + input->input_field_1_0 = 0; + input->input_field_1_1 = 0; + input->input_field_1_2 = 0; + input->input_field_1_3 = 0; + input->dpadDirection = 0; +} + +void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) +{ + u8 r6 = gPlayerAvatar.tileTransitionState; + u8 r9 = gPlayerAvatar.runningState; + bool8 forcedMove = MetatileBehavior_IsMoveTile(cur_mapdata_block_role_at_player_pos(r9)); + + if ((r6 == 2 && forcedMove == FALSE) || r6 == 0) + { + if (GetPlayerSpeed() != 4) + { + if (newKeys & START_BUTTON) + input->pressedStartButton = TRUE; + if (newKeys & SELECT_BUTTON) + input->pressedSelectButton = TRUE; + if (newKeys & A_BUTTON) + input->pressedAButton = TRUE; + if (newKeys & B_BUTTON) + input->pressedBButton = TRUE; + } + if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT)) + { + input->input_field_0_4 = TRUE; + input->input_field_0_5 = TRUE; + } + } + if (forcedMove == FALSE) + { + if (r6 == 2 && r9 == 2) + input->input_field_0_6 = TRUE; + if (forcedMove == FALSE && r6 == 2) + input->input_field_0_1 = TRUE; + } + if (heldKeys & DPAD_UP) + input->dpadDirection = DIR_NORTH; + else if (heldKeys & DPAD_DOWN) + input->dpadDirection = DIR_SOUTH; + else if (heldKeys & DPAD_LEFT) + input->dpadDirection = DIR_WEST; + else if (heldKeys & DPAD_RIGHT) + input->dpadDirection = DIR_EAST; +#if DEBUG + if ((heldKeys & R_BUTTON) && input->pressedStartButton) + { + input->input_field_1_2 = TRUE; + input->pressedStartButton = FALSE; + } + if (gUnknown_020297ED) + { + if (heldKeys & R_BUTTON) + { + input->input_field_1_1 = TRUE; + input->input_field_0_6 = FALSE; + input->input_field_0_1 = FALSE; + input->input_field_0_4 = FALSE; + input->input_field_0_5 = FALSE; + if (newKeys & SELECT_BUTTON) + { + input->input_field_1_0 = TRUE; + input->pressedSelectButton = FALSE; + } + } + if (heldKeys & L_BUTTON) + input->input_field_1_3 = TRUE; + } +#endif +} + +int sub_8068024(struct FieldInput *input) +{ + struct MapPosition position; + u8 r6; + u16 r4; + + r6 = player_get_direction_lower_nybble(); + player_get_pos_to_and_height(&position); + r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); +#if DEBUG + if (input->input_field_1_3 && dive_warp(&position, r4) == TRUE) + return TRUE; +#endif + + if ( +#if DEBUG + !input->input_field_1_1 && +#endif + CheckTrainers() == TRUE) + return TRUE; + + if ( +#if DEBUG + !input->input_field_1_1 && +#endif + mapheader_run_first_tag2_script_list_match() == 1) + return TRUE; + + if (input->pressedBButton && sub_80687A4() == 1) + return TRUE; + if (input->input_field_0_6) + { + IncrementGameStat(GAME_STAT_STEPS); + if (sub_80687E4(&position, r4, r6) == 1) + return TRUE; + } + if (input->input_field_0_1 && is_it_battle_time_3(r4) == 1) + return TRUE; + if (input->input_field_0_4 && input->dpadDirection == r6) + { + if (mapheader_run_first_tag2_script_list_match_conditionally(&position, r4, r6) == 1) + return TRUE; + } + player_get_next_pos_and_height(&position); + r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (input->pressedAButton && sub_80681F0(&position, r4, r6) == 1) + return TRUE; + if (input->input_field_0_5 && input->dpadDirection == r6) + { + if (map_warp_consider_2_to_inside(&position, r4, r6) == 1) + return TRUE; + } + if (input->pressedAButton && sub_8068770() == 1) + return TRUE; + if (input->pressedStartButton) + { + PlaySE(SE_WIN_OPEN); + sub_8071310(); + return TRUE; + } + if (input->pressedSelectButton && sub_80A6D1C() == TRUE) + return TRUE; + +#if DEBUG + if (input->input_field_1_0) + { + debug_sub_80888D8(); + return TRUE; + } + if (input->input_field_1_2) + { + PlaySE(SE_WIN_OPEN); + DebugMenu_8077048(); + return TRUE; + } +#endif + + return FALSE; +} + +static void player_get_pos_to_and_height(struct MapPosition *position) +{ + PlayerGetDestCoords(&position->x, &position->y); + position->height = PlayerGetZCoord(); +} + +static void player_get_next_pos_and_height(struct MapPosition *position) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y); + PlayerGetDestCoords(&x, &y); + if (MapGridGetZCoordAt(x, y) != 0) + position->height = PlayerGetZCoord(); + else + position->height = 0; +} + +static u16 cur_mapdata_block_role_at_player_pos(int unused) +{ + s16 x, y; + + PlayerGetDestCoords(&x, &y); + return MapGridGetMetatileBehaviorAt(x, y); +} + +static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c) +{ + u8 *script = TryGetScriptOnPressingA(position, b, c); + + if (script == NULL) + return FALSE; + + if (script != gUnknown_0815281E + && script != gUnknown_08152C39 + && script != gUnknown_0815F36C + && script != gUnknown_0815F43A + && script != gUnknown_081A0009) + PlaySE(5); + + ScriptContext1_SetupScript(script); + return TRUE; +} + +static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c) +{ + u8 *script; + + script = sub_8068364(position, b, c); + if (script != NULL) + return script; + script = TryGetInvisibleMapObjectScript(position, b, c); + if (script != NULL) + return script; + script = sub_8068500(position, b, c); + if (script != NULL) + return script; + script = TryGetFieldMoveScript(position, b, c); + if (script != NULL) + return script; + + return NULL; +} + +u8 *sub_80682A8(struct MapPosition *position, u8 unused, u8 c) +{ + u8 r3; + s32 i; + + if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y))) + r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height); + else + r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height); + if (r3 == 16 || gMapObjects[r3].localId == 0xFF) + return NULL; + for (i = 0; i < 4; i++) + { + if (gLinkPlayerMapObjects[i].active == TRUE && gLinkPlayerMapObjects[i].mapObjId == r3) + return NULL; + } + gSelectedMapObject = r3; + gSpecialVar_LastTalked = gMapObjects[r3].localId; + gSpecialVar_Facing = c; + return GetFieldObjectScriptPointerByFieldObjectId(r3); +} + +static u8 *sub_8068364(struct MapPosition *position, u8 b, u8 c) +{ + u8 r3; + u8 *script; + + r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height); + if (r3 == 16 || gMapObjects[r3].localId == 0xFF) + { + if (MetatileBehavior_IsCounter(b) != TRUE) + return NULL; + r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height); + if (r3 == 16 || gMapObjects[r3].localId == 0xFF) + return NULL; + } + //_080683E8 + gSelectedMapObject = r3; + gSpecialVar_LastTalked = gMapObjects[r3].localId; + gSpecialVar_Facing = c; + script = GetFieldObjectScriptPointerByFieldObjectId(r3); + script = GetRamScript(gSpecialVar_LastTalked, script); + return script; +} + +static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *position, u8 unused, u8 c) +{ + struct BgEvent *bgEvent = FindInvisibleMapObjectByPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); + + if (bgEvent == NULL) + return NULL; + if (bgEvent->bgUnion.script == NULL) + return gUnknown_081C6C02; + switch (bgEvent->kind) + { + case 0: + default: + return bgEvent->bgUnion.script; + case 1: + if (c != 2) + return NULL; + break; + case 2: + if (c != 1) + return NULL; + break; + case 3: + if (c != 4) + return NULL; + break; + case 4: + if (c != 3) + return NULL; + break; + case 5: + case 6: + case 7: + gSpecialVar_0x8004 = ((u32)bgEvent->bgUnion.script >> 16) + FLAG_HIDDEN_ITEMS_START; + gSpecialVar_0x8005 = (u32)bgEvent->bgUnion.script; + if (FlagGet(gSpecialVar_0x8004) == TRUE) + return NULL; + return HiddenItemScript; + case 8: + if (c == 2) + { + gSpecialVar_0x8004 = bgEvent->bgUnion.secretBaseId; + if (sub_80BC050()) + return gUnknown_081A2C51; + } + return NULL; + } + return bgEvent->bgUnion.script; +} + +static u8 *sub_8068500(struct MapPosition *position, u8 b, u8 c) +{ + s8 height; + + if (MetatileBehavior_IsPlayerFacingTVScreen(b, c) == TRUE) + return Event_TV; + if (MetatileBehavior_IsPC(b) == TRUE) + return gUnknown_081A0009; + if (MetatileBehavior_IsClosedSootopolisGymDoor(b) == TRUE) + return ClosedSootopolisGymDoorScript; + if (is_tile_x84(b) == TRUE) + return gUnknown_081A4363; + if (MetatileBehavior_IsPokeblockFeeder(b) == TRUE) + return gUnknown_081C346A; + if (MetatileBehavior_IsTrickHousePuzzleDoor(b) == TRUE) + return gUnknown_081616E1; + if (MetatileBehavior_IsRegionMap(b) == TRUE) + return Event_WorldMap; + if (sub_805791C(b) == TRUE) + return S_RunningShoesManual; + if (MetatileBehavior_IsPictureBookShelf(b) == TRUE) + return PictureBookShelfScript; + if (MetatileBehavior_IsBookShelf(b) == TRUE) + return BookshelfScript; + if (MetatileBehavior_IsPokeCenterBookShelf(b) == TRUE) + return PokemonCenterBookshelfScript; + if (MetatileBehavior_IsVase(b) == TRUE) + return VaseScript; + if (MetatileBehavior_IsTrashCan(b) == TRUE) + return TrashCanScript; + if (MetatileBehavior_IsShopShelf(b) == TRUE) + return ShopShelfScript; + if (MetatileBehavior_IsBlueprint(b) == TRUE) + return BlueprintScript; + height = position->height; + if (height == MapGridGetZCoordAt(position->x, position->y)) + { + if (MetatileBehavior_IsSecretBasePC(b) == TRUE) + return gUnknown_0815F36C; + if (sub_805724C(b) == TRUE) + return gUnknown_0815F43A; + if (sub_8057364(b) == TRUE) + return gUnknown_0815F523; + if (sub_8057378(b) == TRUE) + return gUnknown_0815F528; + } + return NULL; +} + +static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2) +{ + if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) + return UseSurfScript; + if (MetatileBehavior_IsWaterfall(b) == TRUE) + { + if (FlagGet(FLAG_BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) + return S_UseWaterfall; + else + return S_CannotUseWaterfall; + } + return NULL; +} + +static bool32 sub_8068770(void) +{ + if (FlagGet(FLAG_BADGE07_GET) && sub_8068F18() == 2) + { + ScriptContext1_SetupScript(UseDiveScript); + return TRUE; + } + return FALSE; +} + +static bool32 sub_80687A4(void) +{ + if (FlagGet(FLAG_BADGE07_GET) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_8068F18() == 1) + { + ScriptContext1_SetupScript(S_UseDiveUnderwater); + return TRUE; + } + return FALSE; +} + +static bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused) +{ + if (mapheader_trigger_activate_at__run_now(position) == TRUE) + return TRUE; + if (sub_8068A64(position, b) == TRUE) + return TRUE; + if (sub_8068870(b) == TRUE) + return TRUE; + if (sub_8068894() == TRUE) + return TRUE; + if (UpdateRepelCounter() == TRUE) + return TRUE; + return FALSE; +} + +bool8 mapheader_trigger_activate_at__run_now(struct MapPosition *position) +{ + u8 *script = mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height); + + if (script == NULL) + return FALSE; + ScriptContext1_SetupScript(script); + return TRUE; +} + +//can be u8, u16, or u32 +bool8 sub_8068870(u16 a) +{ + if (MetatileBehavior_IsCrackedFloorHole(a)) + { + ScriptContext1_SetupScript(S_FallDownHole); + return TRUE; + } + return FALSE; +} + +bool8 sub_8068894(void) +{ + IncrementRematchStepCounter(); + happiness_algorithm_step(); + if (overworld_poison_step() == TRUE) + { + ScriptContext1_SetupScript(gUnknown_081A14B8); + return TRUE; + } + if (ShouldEggHatch()) + { + IncrementGameStat(GAME_STAT_HATCHED_EGGS); + ScriptContext1_SetupScript(S_EggHatch); + return TRUE; + } + if (SafariZoneTakeStep() == TRUE) + return TRUE; + if (CountSSTidalStep(1) == TRUE) + { + ScriptContext1_SetupScript(gUnknown_0815FD0D); + return TRUE; + } + return FALSE; +} + +void unref_sub_80688F8(void) +{ + VarSet(VAR_HAPPINESS_STEP_COUNTER, 0); +} + +static void happiness_algorithm_step(void) +{ + u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER); + int i; + + (*ptr)++; + (*ptr) %= 128; + if (*ptr == 0) + { + struct Pokemon *pkmn = gPlayerParty; + + for (i = 0; i < 6; i++) + { + AdjustFriendship(pkmn, 5); + pkmn++; + } + } +} + +void overworld_poison_timer_set(void) +{ + VarSet(VAR_POISON_STEP_COUNTER, 0); +} + +static bool8 overworld_poison_step(void) +{ + u16 *ptr; + + if (gMapHeader.mapType != MAP_TYPE_SECRET_BASE) + { + ptr = GetVarPointer(VAR_POISON_STEP_COUNTER); + (*ptr)++; + (*ptr) %= 4; + if (*ptr == 0) + { + switch (DoPoisonFieldEffect()) + { + case 0: + return FALSE; + case 1: + return FALSE; + case 2: + return TRUE; + } + } + } + return FALSE; +} + +void prev_quest_postbuffer_cursor_backup_reset(void) +{ + gUnknown_0202E8C0 = 0; +} + +static bool8 is_it_battle_time_3(u16 a) +{ + if (gUnknown_0202E8C0 < 4) + { + gUnknown_0202E8C0++; + gUnknown_0202E8C2 = a; + return FALSE; + } + if (StandardWildEncounter(a, gUnknown_0202E8C2) == TRUE) + { + gUnknown_0202E8C0 = 0; + gUnknown_0202E8C2 = a; + return TRUE; + } + else + { + gUnknown_0202E8C2 = a; + return FALSE; + } +} + +static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c) +{ + s8 r6 = map_warp_check_packed(&gMapHeader, position); + + if (is_non_stair_warp_tile(b, c) == TRUE && r6 != -1) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sub_8068C30(&gMapHeader, r6, position); + sub_8080E88(); + return TRUE; + } + return FALSE; +} + +bool8 sub_8068A64(struct MapPosition *position, u16 b) +{ + s8 r4 = map_warp_check_packed(&gMapHeader, position); + + if (r4 != -1 && sub_8068B30(b) == TRUE) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sub_8068C30(&gMapHeader, r4, position); + if (MetatileBehavior_IsEscalator(b) == TRUE) + { + sub_8080F2C(b); + return TRUE; + } + if (MetatileBehavior_IsLavaridgeB1FWarp(b) == TRUE) + { + sub_8080F48(); + return TRUE; + } + if (MetatileBehavior_IsLavaridge1FWarp(b) == TRUE) + { + sub_8080F58(); + return TRUE; + } + if (MetatileBehavior_IsAquaHideoutWarp(b) == TRUE) + { + sub_8080F68(); + return TRUE; + } + if (MetatileBehavior_IsMtPyreHole(b) == TRUE) + { + ScriptContext1_SetupScript(gUnknown_081C6BDE); + return TRUE; + } + sub_8080E88(); + return TRUE; + } + return FALSE; +} + +static bool8 sub_8068B30(u16 a) +{ + if (MetatileBehavior_IsWarpDoor(a) != TRUE + && MetatileBehavior_IsLadder(a) != TRUE + && MetatileBehavior_IsEscalator(a) != TRUE + && MetatileBehavior_IsNonAnimDoor(a) != TRUE + && MetatileBehavior_IsLavaridgeB1FWarp(a) != TRUE + && MetatileBehavior_IsLavaridge1FWarp(a) != TRUE + && MetatileBehavior_IsAquaHideoutWarp(a) != TRUE + && MetatileBehavior_IsMtPyreHole(a) != TRUE) + return FALSE; + return TRUE; +} + +static bool8 is_non_stair_warp_tile(u16 a, u8 b) +{ + switch (b) + { + case 2: + return MetatileBehavior_IsNorthArrowWarp(a); + case 1: + return MetatileBehavior_IsSouthArrowWarp(a); + case 3: + return MetatileBehavior_IsWestArrowWarp(a); + case 4: + return MetatileBehavior_IsEastArrowWarp(a); + } + return FALSE; +} + +static s8 map_warp_check_packed(struct MapHeader *mapHeader, struct MapPosition *position) +{ + return map_warp_check(mapHeader, position->x - 7, position->y - 7, position->height); +} + +static void sub_8068C30(struct MapHeader *unused, s8 b, struct MapPosition *position) +{ + struct WarpEvent *warpEvent = &gMapHeader.events->warps[b]; + + if (warpEvent->mapNum == 0x7F) + { + copy_saved_warp2_bank_and_enter_x_to_warp1(warpEvent->mapGroup); + } + else + { + struct MapHeader *mapHeader; + + warp1_set_2(warpEvent->unk7, warpEvent->mapNum, warpEvent->mapGroup); + sub_80535C4(position->x, position->y); + mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->unk7, warpEvent->mapNum); + if (mapHeader->events->warps[warpEvent->mapGroup].mapNum == 0x7F) + saved_warp2_set(mapHeader->events->warps[b].mapGroup, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, b); + } +} + +static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c) +{ + s8 r4; + + if (c == 2) + { + if (sub_80571C0(b) == TRUE) + { + sub_80BC038(position, gMapHeader.events); + return TRUE; + } + if (MetatileBehavior_IsWarpDoor(b) == TRUE) + { + r4 = map_warp_check_packed(&gMapHeader, position); + if (r4 != -1 && sub_8068B30(b) == TRUE) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sub_8068C30(&gMapHeader, r4, position); + sub_8080EF0(); + return TRUE; + } + } + } + return FALSE; +} + +static s8 map_warp_check(struct MapHeader *mapHeader, u16 x, u16 y, u8 warpId) +{ + s32 i; + struct WarpEvent *warpEvent = mapHeader->events->warps; + u8 warpCount = mapHeader->events->warpCount; + + for (i = 0; i < warpCount; i++, warpEvent++) + { + if ((u16)warpEvent->x == x && (u16)warpEvent->y == y) + { + if ((u8)warpEvent->warpId == warpId || (u8)warpEvent->warpId == 0) + return i; + } + } + return -1; +} + +static u8 *trigger_activate(struct CoordEvent *coordEvent) +{ + if (coordEvent != NULL) + { + if (coordEvent->script == NULL) + { + DoCoordEventWeather(coordEvent->trigger); + return NULL; + } + if (coordEvent->trigger == 0) + { + ScriptContext2_RunNewScript(coordEvent->script); + return NULL; + } + if (VarGet(coordEvent->trigger) == (u8)coordEvent->index) + return coordEvent->script; + } + return NULL; +} + +static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) +{ + s32 i; + struct CoordEvent *coordEvents = mapHeader->events->coordEvents; + u8 coordEventCount = mapHeader->events->coordEventCount; + + for (i = 0; i < coordEventCount; i++) + { + if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y) + { + if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0) + { + u8 *script = trigger_activate(&coordEvents[i]); + if (script != NULL) + return script; + } + } + } + return NULL; +} + +u8 *sub_8068E24(struct MapPosition *position) +{ + return mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height); +} + +static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHeader, u16 b, u16 c, u8 d) +{ + u8 i; + struct BgEvent *bgEvents = mapHeader->events->bgEvents; + u8 bgEventCount = mapHeader->events->bgEventCount; + + for (i = 0; i < bgEventCount; i++) + { + if ((u16)bgEvents[i].x == b && (u16)bgEvents[i].y == c) + { + if (bgEvents[i].unk4 == d || bgEvents[i].unk4 == 0) + return &bgEvents[i]; + } + } + return NULL; +} + +bool8 dive_warp(struct MapPosition *position, u16 b) +{ + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(b) == 0) + { + if (sub_80538B0(position->x - 7, position->y - 7)) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sp13E_warp_to_last_warp(); + PlaySE(SE_W291); + return TRUE; + } + } + else if (sub_80574EC(b) == TRUE) + { + if (sub_80538D0(position->x - 7, position->y - 7)) + { + walkrun_find_lowest_active_bit_in_bitfield(); + sp13E_warp_to_last_warp(); + PlaySE(SE_W291); + return TRUE; + } + } + return FALSE; +} + +u8 sub_8068F18(void) +{ + s16 x, y; + u8 r5; + + PlayerGetDestCoords(&x, &y); + r5 = MapGridGetMetatileBehaviorAt(x, y); + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(r5) == 0) + { + if (sub_80538B0(x - 7, y - 7) == TRUE) + return 1; + } + else if (sub_80574EC(r5) == TRUE) + { + if (sub_80538D0(x - 7, y - 7) == TRUE) + return 2; + } + return 0; +} + +u8 *GetFieldObjectScriptPointerPlayerFacing(void) +{ + u8 r4; + struct MapPosition position; + + r4 = player_get_direction_upper_nybble(); + player_get_next_pos_and_height(&position); + return sub_8068364(&position, MapGridGetMetatileBehaviorAt(position.x, position.y), r4); +} + +int SetCableClubWarp(void) +{ + struct MapPosition position; + + player_get_direction_upper_nybble(); //unnecessary + player_get_pos_to_and_height(&position); + MapGridGetMetatileBehaviorAt(position.x, position.y); //unnecessary + sub_8068C30(&gMapHeader, map_warp_check_packed(&gMapHeader, &position), &position); + return 0; +} diff --git a/src/field_door.c b/src/field_door.c new file mode 100644 index 000000000..89dae725c --- /dev/null +++ b/src/field_door.c @@ -0,0 +1,603 @@ +#include "global.h" +#include "field_door.h" +#include "field_camera.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "constants/songs.h" +#include "task.h" + +const u8 DoorAnimTiles_04[][0x100] = +{ + INCBIN_U8("graphics/door_anims/04/0.4bpp"), + INCBIN_U8("graphics/door_anims/04/1.4bpp"), + INCBIN_U8("graphics/door_anims/04/2.4bpp"), +}; + +// TODO: Make these blank palette includes? +asm(".space 32"); + +const u8 DoorAnimTiles_05[][0x100] = +{ + INCBIN_U8("graphics/door_anims/05/0.4bpp"), + INCBIN_U8("graphics/door_anims/05/1.4bpp"), + INCBIN_U8("graphics/door_anims/05/2.4bpp"), +}; + +const u8 DoorAnimTiles_08[][0x100] = +{ + INCBIN_U8("graphics/door_anims/08/0.4bpp"), + INCBIN_U8("graphics/door_anims/08/1.4bpp"), + INCBIN_U8("graphics/door_anims/08/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_15[][0x100] = +{ + INCBIN_U8("graphics/door_anims/15/0.4bpp"), + INCBIN_U8("graphics/door_anims/15/1.4bpp"), + INCBIN_U8("graphics/door_anims/15/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_16[][0x100] = +{ + INCBIN_U8("graphics/door_anims/16/0.4bpp"), + INCBIN_U8("graphics/door_anims/16/1.4bpp"), + INCBIN_U8("graphics/door_anims/16/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_00[][0x100] = +{ + INCBIN_U8("graphics/door_anims/00/0.4bpp"), + INCBIN_U8("graphics/door_anims/00/1.4bpp"), + INCBIN_U8("graphics/door_anims/00/2.4bpp"), +}; + +const u8 DoorAnimTiles_01[][0x100] = +{ + INCBIN_U8("graphics/door_anims/01/0.4bpp"), + INCBIN_U8("graphics/door_anims/01/1.4bpp"), + INCBIN_U8("graphics/door_anims/01/2.4bpp"), +}; + +const u8 DoorAnimTiles_02[][0x100] = +{ + INCBIN_U8("graphics/door_anims/02/0.4bpp"), + INCBIN_U8("graphics/door_anims/02/1.4bpp"), + INCBIN_U8("graphics/door_anims/02/2.4bpp"), +}; + +const u8 DoorAnimTiles_03[][0x100] = +{ + INCBIN_U8("graphics/door_anims/03/0.4bpp"), + INCBIN_U8("graphics/door_anims/03/1.4bpp"), + INCBIN_U8("graphics/door_anims/03/2.4bpp"), +}; + +const u8 DoorAnimTiles_06[][0x100] = +{ + INCBIN_U8("graphics/door_anims/06/0.4bpp"), + INCBIN_U8("graphics/door_anims/06/1.4bpp"), + INCBIN_U8("graphics/door_anims/06/2.4bpp"), +}; + +const u8 DoorAnimTiles_07[][0x100] = +{ + INCBIN_U8("graphics/door_anims/07/0.4bpp"), + INCBIN_U8("graphics/door_anims/07/1.4bpp"), + INCBIN_U8("graphics/door_anims/07/2.4bpp"), +}; + +const u8 DoorAnimTiles_09[][0x100] = +{ + INCBIN_U8("graphics/door_anims/09/0.4bpp"), + INCBIN_U8("graphics/door_anims/09/1.4bpp"), + INCBIN_U8("graphics/door_anims/09/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_10[][0x100] = +{ + INCBIN_U8("graphics/door_anims/10/0.4bpp"), + INCBIN_U8("graphics/door_anims/10/1.4bpp"), + INCBIN_U8("graphics/door_anims/10/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_11[][0x100] = +{ + INCBIN_U8("graphics/door_anims/11/0.4bpp"), + INCBIN_U8("graphics/door_anims/11/1.4bpp"), + INCBIN_U8("graphics/door_anims/11/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_12[][0x100] = +{ + INCBIN_U8("graphics/door_anims/12/0.4bpp"), + INCBIN_U8("graphics/door_anims/12/1.4bpp"), + INCBIN_U8("graphics/door_anims/12/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_13[][0x100] = +{ + INCBIN_U8("graphics/door_anims/13/0.4bpp"), + INCBIN_U8("graphics/door_anims/13/1.4bpp"), + INCBIN_U8("graphics/door_anims/13/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_14[][0x100] = +{ + INCBIN_U8("graphics/door_anims/14/0.4bpp"), + INCBIN_U8("graphics/door_anims/14/1.4bpp"), + INCBIN_U8("graphics/door_anims/14/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_17[][0x100] = +{ + INCBIN_U8("graphics/door_anims/17/0.4bpp"), + INCBIN_U8("graphics/door_anims/17/1.4bpp"), + INCBIN_U8("graphics/door_anims/17/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_18[][0x100] = +{ + INCBIN_U8("graphics/door_anims/18/0.4bpp"), + INCBIN_U8("graphics/door_anims/18/1.4bpp"), + INCBIN_U8("graphics/door_anims/18/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_19[][0x100] = +{ + INCBIN_U8("graphics/door_anims/19/0.4bpp"), + INCBIN_U8("graphics/door_anims/19/1.4bpp"), + INCBIN_U8("graphics/door_anims/19/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_20[][0x100] = +{ + INCBIN_U8("graphics/door_anims/20/0.4bpp"), + INCBIN_U8("graphics/door_anims/20/1.4bpp"), + INCBIN_U8("graphics/door_anims/20/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_21[][0x100] = +{ + INCBIN_U8("graphics/door_anims/21/0.4bpp"), + INCBIN_U8("graphics/door_anims/21/1.4bpp"), + INCBIN_U8("graphics/door_anims/21/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_22[][0x100] = +{ + INCBIN_U8("graphics/door_anims/22/0.4bpp"), + INCBIN_U8("graphics/door_anims/22/1.4bpp"), + INCBIN_U8("graphics/door_anims/22/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_23[][0x100] = +{ + INCBIN_U8("graphics/door_anims/23/0.4bpp"), + INCBIN_U8("graphics/door_anims/23/1.4bpp"), + INCBIN_U8("graphics/door_anims/23/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_24[][0x100] = +{ + INCBIN_U8("graphics/door_anims/24/0.4bpp"), + INCBIN_U8("graphics/door_anims/24/1.4bpp"), + INCBIN_U8("graphics/door_anims/24/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_25[][0x100] = +{ + INCBIN_U8("graphics/door_anims/25/0.4bpp"), + INCBIN_U8("graphics/door_anims/25/1.4bpp"), + INCBIN_U8("graphics/door_anims/25/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_26[][0x100] = +{ + INCBIN_U8("graphics/door_anims/26/0.4bpp"), + INCBIN_U8("graphics/door_anims/26/1.4bpp"), + INCBIN_U8("graphics/door_anims/26/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_27[][0x100] = +{ + INCBIN_U8("graphics/door_anims/27/0.4bpp"), + INCBIN_U8("graphics/door_anims/27/1.4bpp"), + INCBIN_U8("graphics/door_anims/27/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_28[][0x100] = +{ + INCBIN_U8("graphics/door_anims/28/0.4bpp"), + INCBIN_U8("graphics/door_anims/28/1.4bpp"), + INCBIN_U8("graphics/door_anims/28/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_29[][0x100] = +{ + INCBIN_U8("graphics/door_anims/29/0.4bpp"), + INCBIN_U8("graphics/door_anims/29/1.4bpp"), + INCBIN_U8("graphics/door_anims/29/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_30[][0x100] = +{ + INCBIN_U8("graphics/door_anims/30/0.4bpp"), + INCBIN_U8("graphics/door_anims/30/1.4bpp"), + INCBIN_U8("graphics/door_anims/30/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_31[][0x100] = +{ + INCBIN_U8("graphics/door_anims/31/0.4bpp"), + INCBIN_U8("graphics/door_anims/31/1.4bpp"), + INCBIN_U8("graphics/door_anims/31/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_32[][0x100] = +{ + INCBIN_U8("graphics/door_anims/32/0.4bpp"), + INCBIN_U8("graphics/door_anims/32/1.4bpp"), + INCBIN_U8("graphics/door_anims/32/2.4bpp"), +}; + +asm(".space 32"); + +const u8 DoorAnimTiles_33[][0x100] = +{ + INCBIN_U8("graphics/door_anims/33/0.4bpp"), + INCBIN_U8("graphics/door_anims/33/1.4bpp"), + INCBIN_U8("graphics/door_anims/33/2.4bpp"), +}; + +asm(".space 32"); + +static const struct DoorAnimFrame gDoorOpenAnimFrames[] = +{ + {4, -1}, + {4, 0}, + {4, 0x100}, + {4, 0x200}, + {0, 0}, +}; + +static const struct DoorAnimFrame gDoorCloseAnimFrames[] = +{ + {4, 0x200}, + {4, 0x100}, + {4, 0}, + {4, -1}, + {0, 0}, +}; + +const u8 DoorAnimPalettes_830F8A4[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 00 +const u8 DoorAnimPalettes_830F8AC[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 01 +const u8 DoorAnimPalettes_830F8B4[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 02 +const u8 DoorAnimPalettes_830F8BC[] = {0, 0, 1, 1, 1, 1, 1, 1}; // door 03 +const u8 DoorAnimPalettes_830F8C4[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 04 +const u8 DoorAnimPalettes_830F8CC[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 05 +const u8 DoorAnimPalettes_830F8D4[] = {11, 11, 11, 11, 11, 11, 11, 11}; // door 06 +const u8 DoorAnimPalettes_830F8DC[] = {10, 10, 10, 10, 10, 10, 10, 10}; // door 07 +const u8 DoorAnimPalettes_830F8E4[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 08 +const u8 DoorAnimPalettes_830F8EC[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 09 +const u8 DoorAnimPalettes_830F8F4[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 10 +const u8 DoorAnimPalettes_830F8FC[] = {9, 9, 1, 1, 1, 1, 1, 1}; // door 11 +const u8 DoorAnimPalettes_830F904[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 12 +const u8 DoorAnimPalettes_830F90C[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 13 +const u8 DoorAnimPalettes_830F914[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 14 +const u8 DoorAnimPalettes_830F91C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 15 +const u8 DoorAnimPalettes_830F924[] = {0, 0, 5, 5, 5, 5, 5, 5}; // door 16 +const u8 DoorAnimPalettes_830F92C[] = {6, 6, 1, 1, 1, 1, 1, 1}; // door 17 +const u8 DoorAnimPalettes_830F934[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 18 +const u8 DoorAnimPalettes_830F93C[] = {6, 6, 5, 5, 5, 5, 5, 5}; // door 19 +const u8 DoorAnimPalettes_830F944[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 20 +const u8 DoorAnimPalettes_830F94C[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 21 +const u8 DoorAnimPalettes_830F954[] = {6, 6, 7, 7, 7, 7, 7, 7}; // door 22 +const u8 DoorAnimPalettes_830F95C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 23 +const u8 DoorAnimPalettes_830F964[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 24 +const u8 DoorAnimPalettes_830F96C[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 25 +const u8 DoorAnimPalettes_830F974[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 26 +const u8 DoorAnimPalettes_830F97C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 27 +const u8 DoorAnimPalettes_830F984[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 28 +const u8 DoorAnimPalettes_830F98C[] = {11, 11, 7, 7, 7, 7, 7, 7}; // door 29 +const u8 DoorAnimPalettes_830F994[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 30 +const u8 DoorAnimPalettes_830F99C[] = {6, 6, 7, 7, 7, 7, 7, 7}; // door 31 +const u8 DoorAnimPalettes_830F9A4[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 32 +const u8 DoorAnimPalettes_830F9AC[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 33 + +static const struct DoorGraphics gDoorAnimGraphicsTable[] = +{ + {0x021, 0, DoorAnimTiles_00, DoorAnimPalettes_830F8A4}, // door 00 + {0x061, 1, DoorAnimTiles_01, DoorAnimPalettes_830F8AC}, // door 01 + {0x1CD, 1, DoorAnimTiles_02, DoorAnimPalettes_830F8B4}, // door 02 + {0x041, 1, DoorAnimTiles_03, DoorAnimPalettes_830F8BC}, // door 03 + {0x248, 0, DoorAnimTiles_04, DoorAnimPalettes_830F8C4}, // door 04 + {0x249, 0, DoorAnimTiles_05, DoorAnimPalettes_830F8CC}, // door 05 + {0x22F, 0, DoorAnimTiles_06, DoorAnimPalettes_830F8D4}, // door 06 + {0x21F, 0, DoorAnimTiles_07, DoorAnimPalettes_830F8DC}, // door 07 + {0x2A5, 0, DoorAnimTiles_08, DoorAnimPalettes_830F8E4}, // door 08 + {0x287, 0, DoorAnimTiles_09, DoorAnimPalettes_830F8F4}, // door 09 + {0x2AC, 0, DoorAnimTiles_10, DoorAnimPalettes_830F934}, // door 10 + {0x3A1, 0, DoorAnimTiles_11, DoorAnimPalettes_830F93C}, // door 11 + {0x2DC, 0, DoorAnimTiles_12, DoorAnimPalettes_830F92C}, // door 12 + {0x225, 0, DoorAnimTiles_13, DoorAnimPalettes_830F924}, // door 13 + {0x1DB, 1, DoorAnimTiles_14, DoorAnimPalettes_830F94C}, // door 14 + {0x246, 0, DoorAnimTiles_15, DoorAnimPalettes_830F8EC}, // door 15 + {0x28E, 0, DoorAnimTiles_16, DoorAnimPalettes_830F944}, // door 16 + {0x2A1, 0, DoorAnimTiles_17, DoorAnimPalettes_830F8FC}, // door 17 + {0x21C, 0, DoorAnimTiles_18, DoorAnimPalettes_830F914}, // door 18 + {0x21E, 0, DoorAnimTiles_19, DoorAnimPalettes_830F91C}, // door 19 + {0x21D, 1, DoorAnimTiles_20, DoorAnimPalettes_830F904}, // door 20 + {0x21A, 0, DoorAnimTiles_21, DoorAnimPalettes_830F90C}, // door 21 + {0x224, 0, DoorAnimTiles_22, DoorAnimPalettes_830F954}, // door 22 + {0x289, 0, DoorAnimTiles_23, DoorAnimPalettes_830F95C}, // door 23 + {0x30C, 1, DoorAnimTiles_24, DoorAnimPalettes_830F964}, // door 24 + {0x32D, 1, DoorAnimTiles_25, DoorAnimPalettes_830F96C}, // door 25 + {0x2ED, 1, DoorAnimTiles_26, DoorAnimPalettes_830F974}, // door 26 + {0x264, 1, DoorAnimTiles_27, DoorAnimPalettes_830F97C}, // door 27 + {0x22B, 0, DoorAnimTiles_28, DoorAnimPalettes_830F984}, // door 28 + {0x2F7, 0, DoorAnimTiles_29, DoorAnimPalettes_830F98C}, // door 29 + {0x297, 0, DoorAnimTiles_30, DoorAnimPalettes_830F994}, // door 30 + {0x285, 1, DoorAnimTiles_31, DoorAnimPalettes_830F99C}, // door 31 + {0x25D, 1, DoorAnimTiles_32, DoorAnimPalettes_830F9A4}, // door 32 + {0x20E, 1, DoorAnimTiles_33, DoorAnimPalettes_830F9AC}, // door 33 + {0, 0, NULL, NULL}, +}; + +static void CopyDoorTilesToVram(const void *src) +{ + CpuFastSet(src, (void *)(VRAM + 0x7F00), 0x40); +} + +static void door_build_blockdef(u16 *a, u16 b, const u8 *c) +{ + int i; + u16 unk; + + for (i = 0; i < 4; i++) + { + unk = *(c++) << 12; + a[i] = unk | (b + i); + } + for (; i < 8; i++) + { + unk = *(c++) << 12; + a[i] = unk; + } +} + +static void DrawCurrentDoorAnimFrame(u32 x, u32 y, const u8 *c) +{ + u16 arr[8]; + + door_build_blockdef(arr, 0x3F8, c); + DrawDoorMetatileAt(x, y - 1, arr); + door_build_blockdef(arr, 0x3FC, c + 4); + DrawDoorMetatileAt(x, y, arr); +} + +static void DrawClosedDoorTiles(u32 x, u32 y) +{ + CurrentMapDrawMetatileAt(x, y - 1); + CurrentMapDrawMetatileAt(x, y); +} + +static void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frame, u32 x, u32 y) +{ + if (frame->offset == 0xFFFF) + DrawClosedDoorTiles(x, y); + else + { + CopyDoorTilesToVram(gfx->tiles + frame->offset); + DrawCurrentDoorAnimFrame(x, y, gfx->palette); + } +} + +enum +{ + TD_FRAMELIST = 0, + TD_GFX = 2, + TD_FRAME = 4, + TD_COUNTER, + TD_X, + TD_Y +}; + +static bool32 sub_8058464(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData) +{ + if (taskData[TD_COUNTER] == 0) + DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]); + if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time) + { + taskData[TD_COUNTER] = 0; + taskData[TD_FRAME]++; + if (frames[taskData[TD_FRAME]].time == 0) + return FALSE; + else + return TRUE; + } + taskData[TD_COUNTER]++; + return TRUE; +} + +static void Task_AnimateDoor(u8 taskId) +{ + u16 *taskData = gTasks[taskId].data; + struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]); + struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]); + + if (sub_8058464(gfx, frames, taskData) == FALSE) + DestroyTask(taskId); +} + +static const struct DoorAnimFrame *GetLastDoorFrame(const struct DoorAnimFrame *frame, const void *unused) +{ + while (frame->time != 0) + frame++; + return frame - 1; +} + +static const struct DoorGraphics *GetDoorGraphics(const struct DoorGraphics *gfx, u16 metatileNum) +{ + while (gfx->tiles != NULL) + { + if (gfx->metatileNum == metatileNum) + return gfx; + gfx++; + } + return NULL; +} + +static s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, u32 x, u32 y) +{ + if (FuncIsActiveTask(Task_AnimateDoor) == TRUE) + return -1; + else + { + u8 taskId = CreateTask(Task_AnimateDoor, 0x50); + s16 *taskData = gTasks[taskId].data; + + taskData[TD_X] = x; + taskData[TD_Y] = y; + + taskData[TD_FRAMELIST + 1] = (u32)frames; + taskData[TD_FRAMELIST] = (u32)frames >> 16; + + taskData[TD_GFX + 1] = (u32)gfx; + taskData[TD_GFX] = (u32)gfx >> 16; + + return taskId; + } +} + +static void DrawClosedDoor(const struct DoorGraphics *unused, u32 x, u32 y) +{ + DrawClosedDoorTiles(x, y); +} + +static void DrawOpenedDoor(const struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx != NULL) + DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y); +} + +static s8 StartDoorOpenAnimation(const struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y); +} + +static s8 StartDoorCloseAnimation(const struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y); +} + +static s8 cur_mapdata_get_door_x2_at(const struct DoorGraphics *gfx, u32 x, u32 y) +{ + gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y)); + if (gfx == NULL) + return -1; + else + return gfx->unk2; +} + +void unref_sub_805869C(u32 x, u32 y) +{ + StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); +} + +void FieldSetDoorOpened(u32 x, u32 y) +{ + if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + DrawOpenedDoor(gDoorAnimGraphicsTable, x, y); +} + +void FieldSetDoorClosed(u32 x, u32 y) +{ + if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + DrawClosedDoor(gDoorAnimGraphicsTable, x, y); +} + +s8 FieldAnimateDoorClose(u32 x, u32 y) +{ + if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + return -1; + else + return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y); +} + +s8 FieldAnimateDoorOpen(u32 x, u32 y) +{ + if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y))) + return -1; + else + return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y); +} + +bool8 FieldIsDoorAnimationRunning(void) +{ + return FuncIsActiveTask(Task_AnimateDoor); +} + +u32 GetDoorSoundEffect(u32 x, u32 y) +{ + if (cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y) == 0) + return SE_DOOR; + else + return SE_JIDO_DOA; +} diff --git a/src/field_effect.c b/src/field_effect.c new file mode 100644 index 000000000..f85bc520e --- /dev/null +++ b/src/field_effect.c @@ -0,0 +1,3385 @@ +#include "global.h" +#include "data2.h" +#include "script.h" +#include "trig.h" +#include "main.h" +#include "field_weather.h" +#include "decompress.h" +#include "sprite.h" +#include "menu.h" +#include "palette.h" +#include "text.h" +#include "overworld.h" +#include "task.h" +#include "sound.h" +#include "constants/songs.h" +#include "decoration.h" +#include "field_player_avatar.h" +#include "event_object_movement.h" +#include "metatile_behavior.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "fieldmap.h" +#include "util.h" +#include "field_effect_helpers.h" +#include "pokemon_storage_system.h" + +#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} + +EWRAM_DATA s32 gFieldEffectArguments[8] = {0}; + +const u32 gSpriteImage_839DC14[] = INCBIN_U32("graphics/birch_speech/birch.4bpp"); +const u16 gBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal"); +const u32 gSpriteImage_839E434[] = INCBIN_U32("graphics/misc/pokeball_glow.4bpp"); +const u16 gFieldEffectObjectPalette4[16] = INCBIN_U16("graphics/field_effect_objects/palettes/04.gbapal"); +const u32 gSpriteImage_839E474[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp"); +const u32 gSpriteImage_839E534[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp"); +const u32 gSpriteImage_839E5F4[] = INCBIN_U32("graphics/misc/big_hof_monitor.4bpp"); +const u8 gSpriteImage_839E7F4[] = INCBIN_U8("graphics/misc/small_hof_monitor.4bpp"); +const u16 gFieldEffectObjectPalette5[16] = INCBIN_U16("graphics/field_effect_objects/palettes/05.gbapal"); + +// Graphics for the lights streaking past your Pokemon when it uses a field move. +const u32 gFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/field_move_streaks.4bpp"); +const u16 gFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/field_move_streaks.gbapal"); +const u16 gFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/field_move_streaks_map.bin"); + +// The following light streaks effect is used when the map is dark (e.g. a cave). +const u32 gDarknessFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/darkness_field_move_streaks.4bpp"); +const u16 gDarknessFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/darkness_field_move_streaks.gbapal"); +const u16 gDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/darkness_field_move_streaks_map.bin"); + +bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *) = { + FieldEffectCmd_loadtiles, + FieldEffectCmd_loadfadedpal, + FieldEffectCmd_loadpal, + FieldEffectCmd_callnative, + FieldEffectCmd_end, + FieldEffectCmd_loadgfx_callnative, + FieldEffectCmd_loadtiles_callnative, + FieldEffectCmd_loadfadedpal_callnative, +}; + +const struct OamData gOamData_839F0F4 = {.size = 3}; +const struct OamData gOamData_839F0FC = {.size = 0}; +const struct OamData gOamData_839F104 = {.size = 1}; + +const struct SpriteFrameImage gSpriteImageTable_839F10C[] = { + obj_frame_tiles(gSpriteImage_839DC14) +}; +const struct SpritePalette gUnknown_0839F114 = {.data = gBirchPalette, .tag = 0x1006}; + +const union AnimCmd gSpriteAnim_839F11C[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 1), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_839F124[] = { + gSpriteAnim_839F11C +}; + +const struct SpriteTemplate gSpriteTemplate_839F128 = { + .tileTag = 0xffff, + .paletteTag = 4102, + .oam = &gOamData_839F0F4, + .anims = (const union AnimCmd *const *)&gSpriteAnimTable_839F124, + .images = gSpriteImageTable_839F10C, + .affineAnims = (const union AffineAnimCmd *const *)&gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo4 = {.data = gFieldEffectObjectPalette4, .tag = 0x1007}; +const struct SpritePalette gFieldEffectObjectPaletteInfo5 = {.data = gFieldEffectObjectPalette5, .tag = 0x1010}; +const struct OamData gOamData_839F150 = { + .shape = 1, + .size = 2 +}; + +const struct SpriteFrameImage gSpriteImageTable_839F158[] = { + obj_frame_tiles(gSpriteImage_839E434) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F160[] = { + obj_frame_tiles(gSpriteImage_839E474), + obj_frame_tiles(gSpriteImage_839E534) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F170[] = { + obj_frame_tiles(gSpriteImage_839E5F4) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F178[] = { + {.data = gSpriteImage_839E7F4, .size = 0x200} // the macro breaks down here +}; + +const struct Subsprite Unknown_39F180[] = { + {.x = -12, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 0}, + {.x = 4, .y = -8, .priority = 2, .tileOffset = 2, .shape = 0, .size = 0}, + {.x = -12, .y = 0, .priority = 2, .tileOffset = 3, .shape = 1, .size = 0}, + {.x = 4, .y = 0, .priority = 2, .tileOffset = 5, .shape = 0, .size = 0} +}; + +const struct SubspriteTable gUnknown_0839F1A0 = subsprite_table(Unknown_39F180); + +const struct Subsprite Unknown_39F1A8[] = { + {.x = -32, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 1}, + {.x = 0, .y = -8, .priority = 2, .tileOffset = 4, .shape = 1, .size = 1}, + {.x = -32, .y = 0, .priority = 2, .tileOffset = 8, .shape = 1, .size = 1}, + {.x = 0, .y = 0, .priority = 2, .tileOffset = 12, .shape = 1, .size = 1} +}; + +const struct SubspriteTable gUnknown_0839F1C8 = subsprite_table(Unknown_39F1A8); + +const union AnimCmd gSpriteAnim_839F1D0[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gSpriteAnim_839F1D8[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_839F1FC[] = { + gSpriteAnim_839F1D0, + gSpriteAnim_839F1D8 +}; + +const union AnimCmd *const gSpriteAnimTable_839F204[] = { + gSpriteAnim_839F1D0 +}; + +const struct SpriteTemplate gSpriteTemplate_839F208 = { + .tileTag = 0xffff, + .paletteTag = 4103, + .oam = &gOamData_839F0FC, + .anims = gSpriteAnimTable_839F1FC, + .images = gSpriteImageTable_839F158, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokeballGlow +}; + + +const struct SpriteTemplate gSpriteTemplate_839F220 = { + .tileTag = 0xffff, + .paletteTag = 4100, + .oam = &gOamData_839F104, + .anims = gSpriteAnimTable_839F1FC, + .images = gSpriteImageTable_839F160, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokecenterMonitor +}; + + +const struct SpriteTemplate gSpriteTemplate_839F238 = { + .tileTag = 0xffff, + .paletteTag = 4112, + .oam = &gOamData_839F104, + .anims = gSpriteAnimTable_839F204, + .images = gSpriteImageTable_839F170, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + + +const struct SpriteTemplate gSpriteTemplate_839F250 = { + .tileTag = 0xffff, + .paletteTag = 4112, + .oam = &gOamData_839F150, + .anims = gSpriteAnimTable_839F204, + .images = gSpriteImageTable_839F178, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + +void (*const gUnknown_0839F268[])(struct Task *) = { + PokecenterHealEffect_0, + PokecenterHealEffect_1, + PokecenterHealEffect_2, + PokecenterHealEffect_3 +}; + +void (*const gUnknown_0839F278[])(struct Task *) = { + HallOfFameRecordEffect_0, + HallOfFameRecordEffect_1, + HallOfFameRecordEffect_2, + HallOfFameRecordEffect_3 +}; + +void (*const gUnknown_0839F288[])(struct Sprite *) = { + PokeballGlowEffect_0, + PokeballGlowEffect_1, + PokeballGlowEffect_2, + PokeballGlowEffect_3, + PokeballGlowEffect_4, + PokeballGlowEffect_5, + PokeballGlowEffect_6, + PokeballGlowEffect_7 +}; + +const struct Coords16 gUnknown_0839F2A8[] = { + {.x = 0, .y = 0}, + {.x = 6, .y = 0}, + {.x = 0, .y = 4}, + {.x = 6, .y = 4}, + {.x = 0, .y = 8}, + {.x = 6, .y = 8} +}; + +const u8 gUnknown_0839F2C0[] = {16, 12, 8, 0}; +const u8 gUnknown_0839F2C4[] = {16, 12, 8, 0}; +const u8 gUnknown_0839F2C8[] = { 0, 0, 0, 0}; + +bool8 (*const gUnknown_0839F2CC[])(struct Task *) = { + sub_80867AC, + sub_8086854, + sub_8086870, + sub_80868E4, + sub_808699C, + sub_80869B8, + sub_80869F8 +}; + +bool8 (*const gUnknown_0839F2E8[])(struct Task *) = { + sub_8086AA0, + sub_8086AC0, + sub_8086B30, + sub_8086B54, + sub_8086B64, + sub_8086B88 +}; + +bool8 (*const gUnknown_0839F300[])(struct Task *) = { + sub_8086CF4, + sub_8086D70, + sub_8086DB0, + sub_8086E10, + sub_8086E50, + sub_8086EB0, + sub_8086ED4 +}; + +bool8 (*const gUnknown_0839F31C[])(struct Task *, struct MapObject *) = { + sub_8086FB0, + waterfall_1_do_anim_probably, + waterfall_2_wait_anim_finish_probably, + sub_8087030, + sub_8087058 +}; + +bool8 (*const gUnknown_0839F330[])(struct Task *) = { + sub_8087124, + dive_2_unknown, + dive_3_unknown +}; + +bool8 (*const gUnknown_0839F33C[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_808722C, + sub_8087264, + sub_8087298, + sub_80872E4, + sub_80873D8, + sub_80873F4 +}; + +bool8 (*const gUnknown_0839F354[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_80874CC, + sub_80874FC, + sub_8087548, + sub_808759C +}; + +bool8 (*const gUnknown_0839F364[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_80876C8, + sub_80876F8, + sub_8087774, + sub_80877AC, + sub_80877D4 +}; + +void (*const gUnknown_0839F378[])(struct Task *) = { + sub_80878F4, + sub_8087914 +}; + +static u8 sActiveList[32]; + +extern u8 *gFieldEffectScriptPointers[]; + +u32 FieldEffectStart(u8 id) +{ + u8 *script; + u32 val; + + FieldEffectActiveListAdd(id); + + script = gFieldEffectScriptPointers[id]; + + while (gFieldEffectScriptFuncs[*script](&script, &val)) + ; + + return val; +} + +bool8 FieldEffectCmd_loadtiles(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + return TRUE; +} + +bool8 FieldEffectCmd_loadfadedpal(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadFadedPalette(script); + return TRUE; +} + +bool8 FieldEffectCmd_loadpal(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadPalette(script); + return TRUE; +} + +bool8 FieldEffectCmd_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_end(u8 **script, u32 *val) +{ + return FALSE; +} + +bool8 FieldEffectCmd_loadgfx_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + FieldEffectScript_LoadFadedPalette(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_loadtiles_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_loadfadedpal_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadFadedPalette(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +u32 FieldEffectScript_ReadWord(u8 **script) +{ + return (*script)[0] + + ((*script)[1] << 8) + + ((*script)[2] << 16) + + ((*script)[3] << 24); +} + +void FieldEffectScript_LoadTiles(u8 **script) +{ + struct SpriteSheet *sheet = (struct SpriteSheet *)FieldEffectScript_ReadWord(script); + if (GetSpriteTileStartByTag(sheet->tag) == 0xFFFF) + LoadSpriteSheet(sheet); + (*script) += 4; +} + +void FieldEffectScript_LoadFadedPalette(u8 **script) +{ + struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); + LoadSpritePalette(palette); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); + (*script) += 4; +} + +void FieldEffectScript_LoadPalette(u8 **script) +{ + struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); + LoadSpritePalette(palette); + (*script) += 4; +} + +void FieldEffectScript_CallNative(u8 **script, u32 *val) +{ + u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script); + *val = func(); + (*script) += 4; +} + +void FieldEffectFreeGraphicsResources(struct Sprite *sprite) +{ + u16 sheetTileStart = sprite->sheetTileStart; + u32 paletteNum = sprite->oam.paletteNum; + DestroySprite(sprite); + FieldEffectFreeTilesIfUnused(sheetTileStart); + FieldEffectFreePaletteIfUnused(paletteNum); +} + +void FieldEffectStop(struct Sprite *sprite, u8 id) +{ + FieldEffectFreeGraphicsResources(sprite); + FieldEffectActiveListRemove(id); +} + +void FieldEffectFreeTilesIfUnused(u16 tileStart) +{ + u8 i; + u16 tag = GetSpriteTileTagByTileStart(tileStart); + + if (tag != 0xFFFF) + { + for (i = 0; i < MAX_SPRITES; i++) + if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart) + return; + FreeSpriteTilesByTag(tag); + } +} + +void FieldEffectFreePaletteIfUnused(u8 paletteNum) +{ + u8 i; + u16 tag = GetSpritePaletteTagByPaletteNum(paletteNum); + + if (tag != 0xFFFF) + { + for (i = 0; i < MAX_SPRITES; i++) + if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum) + return; + FreeSpritePaletteByTag(tag); + } +} + +void FieldEffectActiveListClear(void) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + sActiveList[i] = 0xFF; +} + +void FieldEffectActiveListAdd(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + { + if (sActiveList[i] == 0xFF) + { + sActiveList[i] = id; + return; + } + } +} + +void FieldEffectActiveListRemove(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + { + if (sActiveList[i] == id) + { + sActiveList[i] = 0xFF; + return; + } + } +} + +bool8 FieldEffectActiveListContains(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + if (sActiveList[i] == id) + return TRUE; + return FALSE; +} + +u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer) +{ + struct SpriteTemplate spriteTemplate; + LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer); + LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer); + spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag; + spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag; + spriteTemplate.oam = &gOamData_839F0F4; + spriteTemplate.anims = gDummySpriteAnimTable; + spriteTemplate.images = NULL; + spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + spriteTemplate.callback = SpriteCallbackDummy; + return CreateSprite(&spriteTemplate, x, y, subpriority); +} + +void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) +{ + LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); + LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20); +} + +u8 CreateBirchSprite(s16 x, s16 y, u8 subpriority) +{ + LoadSpritePalette(&gUnknown_0839F114); + return CreateSprite(&gSpriteTemplate_839F128, x, y, subpriority); +} + +u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) +{ + DecompressPicFromTable_2(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, gUnknown_081FAF4C[3], gUnknown_081FAF4C[3], species); + LoadCompressedObjectPalette(&gMonPaletteTable[species]); + GetMonSpriteTemplate_803C56C(species, 3); + gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; + PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); + return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); +} + +u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) +{ + const struct CompressedSpritePalette *spritePalette; + + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); + spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g); + LoadCompressedObjectPalette(spritePalette); + GetMonSpriteTemplate_803C56C(species, 3); + gUnknown_02024E8C.paletteTag = spritePalette->tag; + PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); +} + +void FreeResourcesAndDestroySprite(struct Sprite *sprite) +{ + ResetPreservedPalettesInWeather(); + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + if (sprite->oam.affineMode != 0) + { + FreeOamMatrix(sprite->oam.matrixNum); + } + DestroySprite(sprite); +} + +#ifdef NONMATCHING +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed += (((0x1f - curRed) * r) >> 4); + curGreen += (((0x1f - curGreen) * g) >> 4); + curBlue += (((0x1f - curBlue) * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} + +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed -= ((curRed * r) >> 4); + curGreen -= ((curGreen * g) >> 4); + curBlue -= ((curBlue * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} +#else +__attribute__((naked)) +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r9, r5\n" + "\tmov r8, r4\n" + "\tmov r6, r8\n" + "\tands r6, r5\n" + "\tmov r8, r6\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 2\n" + "\tands r6, r4\n" + "\tlsrs r6, 5\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 7\n" + "\tands r4, r5\n" + "\tlsrs r4, 10\n" + "\tmov r7, r9\n" + "\tmov r5, r8\n" + "\tsubs r7, r5\n" + "\tmov r12, r7\n" + "\tmov r7, r12\n" + "\tmuls r7, r1\n" + "\tadds r1, r7, 0\n" + "\tasrs r1, 4\n" + "\tadd r8, r1\n" + "\tmov r5, r9\n" + "\tsubs r1, r5, r6\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tadds r6, r1\n" + "\tsubs r5, r4\n" + "\tmov r9, r5\n" + "\tmov r1, r9\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tadds r4, r1\n" + "\tmov r7, r8\n" + "\tlsls r7, 16\n" + "\tlsls r6, 21\n" + "\torrs r6, r7\n" + "\tlsls r4, 26\n" + "\torrs r4, r6\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D04 @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D00: .4byte gPlttBufferUnfaded\n" + "_08085D04: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} + +__attribute__((naked)) +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r6,lr}\n" + "\tmov r6, r8\n" + "\tpush {r6}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r8, r5\n" + "\tmov r6, r8\n" + "\tands r6, r4\n" + "\tmov r8, r6\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 2\n" + "\tands r5, r4\n" + "\tlsrs r5, 5\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 7\n" + "\tands r4, r6\n" + "\tlsrs r4, 10\n" + "\tmov r6, r8\n" + "\tmuls r6, r1\n" + "\tadds r1, r6, 0\n" + "\tasrs r1, 4\n" + "\tmov r6, r8\n" + "\tsubs r6, r1\n" + "\tadds r1, r5, 0\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tsubs r5, r1\n" + "\tadds r1, r4, 0\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tsubs r4, r1\n" + "\tlsls r6, 16\n" + "\tlsls r5, 21\n" + "\torrs r5, r6\n" + "\tlsls r4, 26\n" + "\torrs r4, r5\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D7C @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D78: .4byte gPlttBufferUnfaded\n" + "_08085D7C: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} +#endif + +void Task_PokecenterHeal(u8 taskId); +u8 CreatePokeballGlowSprite(s16, s16, s16, u16); +u8 PokecenterHealEffectHelper(s16, s16); + +bool8 FldEff_PokecenterHeal(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x5d; + task->data[3] = 0x24; + task->data[4] = 0x7c; + task->data[5] = 0x18; + return FALSE; +} + +void Task_PokecenterHeal(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0839F268[task->data[0]](task); +} + +void PokecenterHealEffect_0(struct Task *task) +{ + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 1); + task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]); +} + +void PokecenterHealEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 1) + { + gSprites[task->data[7]].data[0]++; + task->data[0]++; + } +} + +void PokecenterHealEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 4) + { + task->data[0]++; + } +} + +void PokecenterHealEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); + DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); + } +} + +void Task_HallOfFameRecord(u8 taskId); +void HallOfFameRecordEffectHelper(s16, s16, s16, u8); + +bool8 FldEff_HallOfFameRecord(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x75; + task->data[3] = 0x34; + return FALSE; +} + +void Task_HallOfFameRecord(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0839F278[task->data[0]](task); +} + +void HallOfFameRecordEffect_0(struct Task *task) +{ + u8 taskId; + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 0); + taskId = FindTaskIdByFunc(Task_HallOfFameRecord); + HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0); + HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1); +} + +void HallOfFameRecordEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 1) + { + task->data[15]++; // was this ever initialized? is this ever used? + task->data[0]++; + } +} + +void HallOfFameRecordEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 4) + { + task->data[0]++; + } +} + +void HallOfFameRecordEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); + DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); + } +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *); + +u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); + sprite = &gSprites[spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + sprite->data[5] = data5; + sprite->data[6] = data6; + sprite->data[7] = spriteId; + return spriteId; +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *sprite) +{ + gUnknown_0839F288[sprite->data[0]](sprite); +} + +void PokeballGlowEffect_0(struct Sprite *sprite) +{ + u8 endSpriteId; + if (sprite->data[1] == 0 || (--sprite->data[1]) == 0) + { + sprite->data[1] = 25; + endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_839F208, gUnknown_0839F2A8[sprite->data[2]].x + sprite->pos2.x, gUnknown_0839F2A8[sprite->data[2]].y + sprite->pos2.y, 0); + gSprites[endSpriteId].oam.priority = 2; + gSprites[endSpriteId].data[0] = sprite->data[7]; + sprite->data[2]++; + sprite->data[6]--; + PlaySE(SE_BOWA); + } + if (sprite->data[6] == 0) + { + sprite->data[1] = 32; + sprite->data[0]++; + } +} + +void PokeballGlowEffect_1(struct Sprite *sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->data[0]++; + sprite->data[1] = 8; + sprite->data[2] = 0; + sprite->data[3] = 0; + if (sprite->data[5]) + { + PlayFanfare(BGM_ME_ASA); + } + } +} + +void PokeballGlowEffect_2(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data[1]) == 0) + { + sprite->data[1] = 8; + sprite->data[2]++; + sprite->data[2] &= 3; + if (sprite->data[2] == 0) + { + sprite->data[3]++; + } + } + phase = (sprite->data[2] + 3) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = (sprite->data[2] + 2) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = (sprite->data[2] + 1) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = sprite->data[2]; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + if (sprite->data[3] > 2) + { + sprite->data[0]++; + sprite->data[1] = 8; + sprite->data[2] = 0; + } +} + +void PokeballGlowEffect_3(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data[1]) == 0) + { + sprite->data[1] = 8; + sprite->data[2]++; + sprite->data[2] &= 3; + if (sprite->data[2] == 3) + { + sprite->data[0]++; + sprite->data[1] = 30; + } + } + phase = sprite->data[2]; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); +} + +void PokeballGlowEffect_4(struct Sprite *sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->data[0]++; + } +} + +void PokeballGlowEffect_5(struct Sprite *sprite) +{ + sprite->data[0]++; +} + +void PokeballGlowEffect_6(struct Sprite *sprite) +{ + if (sprite->data[5] == 0 || IsFanfareTaskInactive()) + { + sprite->data[0]++; + } +} + +void PokeballGlowEffect_7(struct Sprite *sprite) +{ +} + +void SpriteCB_PokeballGlow(struct Sprite *sprite) +{ + if (gSprites[sprite->data[0]].data[0] > 4) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +u8 PokecenterHealEffectHelper(s16 x, s16 y) +{ + u8 spriteIdAtEnd; + struct Sprite *sprite; + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F220, x, y, 0); + sprite = &gSprites[spriteIdAtEnd]; + sprite->oam.priority = 2; + sprite->invisible = 1; + SetSubspriteTables(sprite, &gUnknown_0839F1A0); + return spriteIdAtEnd; +} + +void SpriteCB_PokecenterMonitor(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + { + sprite->data[0] = 0; + sprite->invisible = 0; + StartSpriteAnim(sprite, 1); + } + if (sprite->animEnded) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3) +{ + u8 spriteIdAtEnd; + if (!a3) + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F238, a1, a2, 0); + SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0839F1C8); + } else + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F250, a1, a2, 0); + } + gSprites[spriteIdAtEnd].invisible = 1; + gSprites[spriteIdAtEnd].data[0] = a0; +} + +void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) +{ + if (gTasks[sprite->data[0]].data[15]) + { + if (sprite->data[1] == 0 || (--sprite->data[1]) == 0) + { + sprite->data[1] = 16; + sprite->invisible ^= 1; + } + sprite->data[2]++; + } + if (sprite->data[2] > 127) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void mapldr_080842E8(void); +void mapldr_08084390(void); +void task00_8084310(u8); +void c3_080843F8(u8); + +void sub_80865BC(void) +{ + SetMainCallback2(c2_exit_to_overworld_2_switch); + gFieldCallback = mapldr_080842E8; +} + +void mapldr_080842E8(void) +{ + pal_fill_black(); + CreateTask(task00_8084310, 0); + ScriptContext2_Enable(); + FreezeMapObjects(); + gFieldCallback = NULL; +} + +void task00_8084310(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (!task->data[0]) + { + if (!IsWeatherNotFadingIn()) + { + return; + } + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + if ((int)gFieldEffectArguments[0] > 5) + { + gFieldEffectArguments[0] = 0; + } + FieldEffectStart(FLDEFF_USE_FLY); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) + { + Overworld_ResetStateAfterFly(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gFieldCallback = mapldr_08084390; + DestroyTask(taskId); + } +} + +void mapldr_08084390(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_black(); + CreateTask(c3_080843F8, 0); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + if (gPlayerAvatar.flags & 0x08) + { + FieldObjectTurn(&gMapObjects[gPlayerAvatar.mapObjectId], DIR_WEST); + } + ScriptContext2_Enable(); + FreezeMapObjects(); + gFieldCallback = NULL; +} + +void c3_080843F8(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (task->data[0] == 0) + { + if (gPaletteFade.active) + { + return; + } + FieldEffectStart(FLDEFF_FLY_IN); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_FLY_IN)) + { + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(taskId); + } +} + +extern void pal_fill_for_map_transition(void); +void sub_8086774(u8); +extern void CameraObjectReset2(void); +extern void CameraObjectReset1(void); + +void sub_8086748(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + CreateTask(sub_8086774, 0); + gFieldCallback = NULL; +} + +void sub_8086774(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2CC[task->data[0]](task)); // return code signifies whether to continue blocking here +} + +bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] +{ + struct MapObject *playerObject; + struct Sprite *playerSprite; + playerObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + playerSprite = &gSprites[gPlayerAvatar.spriteId]; + CameraObjectReset2(); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + gPlayerAvatar.preventStep = TRUE; + FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[4] = playerSprite->subspriteMode; + playerObject->mapobj_bit_26 = 1; + playerSprite->oam.priority = 1; + playerSprite->subspriteMode = 2; + task->data[0]++; + return TRUE; +} + +bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] +{ + if (IsWeatherNotFadingIn()) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + task->data[1] = 1; + task->data[2] = 0; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + PlaySE(SE_RU_HYUU); + task->data[0]++; + return FALSE; +} + +bool8 sub_80868E4(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y += task->data[1]; + if (task->data[1] < 8) + { + task->data[2] += task->data[1]; + if (task->data[2] & 0xf) + { + task->data[1] <<= 1; + } + } + if (task->data[3] == 0 && sprite->pos2.y >= -16) + { + task->data[3]++; + mapObject->mapobj_bit_26 = 0; + sprite->subspriteMode = task->data[4]; + mapObject->mapobj_bit_2 = 1; + } + if (sprite->pos2.y >= 0) + { + PlaySE(SE_W070); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_808699C(struct Task *task) +{ + task->data[0]++; + task->data[1] = 4; + task->data[2] = 0; + SetCameraPanningCallback(NULL); + return TRUE; +} + +bool8 sub_80869B8(struct Task *task) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 3) == 0) + { + task->data[1] >>= 1; + } + if (task->data[1] == 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80869F8(struct Task *task) +{ + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + InstallCameraPanAheadCallback(); + DestroyTask(FindTaskIdByFunc(sub_8086774)); + return FALSE; +} + +void sub_8086A68(u8); +extern void sub_80B4824(u8); +extern void sub_8053FF8(void); +extern void fade_8080918(void); + +void sub_8086B98(struct Task *); +void sub_8086BE4(struct Task *); +void sub_8086C30(void); +void sub_8086C40(void); +bool8 sub_8054034(void); +void sub_8086C94(void); +void sub_80B483C(void); +void sub_8086CBC(u8); + +void sub_8086A2C(u8 a0, u8 priority) +{ + u8 taskId; + taskId = CreateTask(sub_8086A68, priority); + gTasks[taskId].data[1] = 0; + if (a0 == 0x6a) + { + gTasks[taskId].data[1] = 1; + } +} + +void sub_8086A68(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2E8[task->data[0]](task)); +} + +bool8 sub_8086AA0(struct Task *task) +{ + FreezeMapObjects(); + CameraObjectReset2(); + sub_80B4824(task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086AC0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[0]++; + task->data[2] = 0; + task->data[3] = 0; + if ((u8)task->data[1] == 0) + { + task->data[0] = 4; + } + PlaySE(SE_ESUKA); + } + return FALSE; +} + +bool8 sub_8086B30(struct Task *task) +{ + sub_8086B98(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B54(struct Task *task) +{ + sub_8086B98(task); + sub_8086C40(); + return FALSE; +} + +bool8 sub_8086B64(struct Task *task) +{ + sub_8086BE4(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B88(struct Task *task) +{ + sub_8086BE4(task); + sub_8086C40(); + return FALSE; +} + +void sub_8086B98(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[2]); + sprite->pos2.y = Sin(0x94, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +void sub_8086BE4(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[2]); + sprite->pos2.y = Sin(0x76, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +void sub_8086C30(void) +{ + sub_8053FF8(); + fade_8080918(); +} + +void sub_8086C40(void) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + sub_80B483C(); + warp_in(); + gFieldCallback = sub_8086C94; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_8086A68)); + } +} + +void sub_8086C94(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + CreateTask(sub_8086CBC, 0); + gFieldCallback = NULL; +} + +void sub_8086CBC(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F300[task->data[0]](task)); +} + +bool8 sub_8086CF4(struct Task *task) +{ + struct MapObject *mapObject; + s16 x; + s16 y; + u8 behavior; + CameraObjectReset2(); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(DIR_EAST)); + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + task->data[0]++; + task->data[1] = 16; + if (behavior == 0x6b) + { + behavior = 1; + task->data[0] = 3; + } else + { + behavior = 0; + } + sub_80B4824(behavior); + return TRUE; +} + +bool8 sub_8086D70(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086DB0(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0] = 5; + } + return FALSE; +} + +bool8 sub_8086E10(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086E50(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +extern bool8 sub_80B4850(void); + +bool8 sub_8086EB0(struct Task *task) +{ + if (sub_80B4850()) + { + return FALSE; + } + sub_80B483C(); + task->data[0]++; + return TRUE; +} + +bool8 sub_8086ED4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + CameraObjectReset1(); + ScriptContext2_Disable(); + FieldObjectSetSpecialAnim(mapObject, GetGoSpeed0AnimId(DIR_EAST)); + DestroyTask(FindTaskIdByFunc(sub_8086CBC)); + } + return FALSE; +} + +void sub_8086F64(u8); + +bool8 FldEff_UseWaterfall(void) +{ + u8 taskId; + taskId = CreateTask(sub_8086F64, 0xff); + gTasks[taskId].data[1] = gFieldEffectArguments[0]; + sub_8086F64(taskId); + return FALSE; +} + +void sub_8086F64(u8 taskId) +{ + while (gUnknown_0839F31C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])); +} + +bool8 sub_8086FB0(struct Task *task, struct MapObject *mapObject) +{ + ScriptContext2_Enable(); + gPlayerAvatar.preventStep = TRUE; + task->data[0]++; + return FALSE; +} + +bool8 waterfall_1_do_anim_probably(struct Task *task, struct MapObject *mapObject) +{ + ScriptContext2_Enable(); + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) + { + FieldObjectClearAnimIfSpecialAnimFinished(mapObject); + gFieldEffectArguments[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } + return FALSE; +} + +bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct MapObject *mapObject) +{ + if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + return FALSE; + } + task->data[0]++; + return TRUE; +} + +bool8 sub_8087030(struct Task *task, struct MapObject *mapObject) +{ + FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(DIR_NORTH)); + task->data[0]++; + return FALSE; +} + +bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) +{ + if (!FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + return FALSE; + } + if (MetatileBehavior_IsWaterfall(mapObject->mapobj_unk_1E)) + { + task->data[0] = 3; + return TRUE; + } + ScriptContext2_Disable(); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(FindTaskIdByFunc(sub_8086F64)); + FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); + return FALSE; +} + +void Task_Dive(u8); +extern int dive_warp(struct MapPosition *, u16); + +bool8 FldEff_UseDive(void) +{ + u8 taskId; + taskId = CreateTask(Task_Dive, 0xff); + gTasks[taskId].data[15] = gFieldEffectArguments[0]; + gTasks[taskId].data[14] = gFieldEffectArguments[1]; + Task_Dive(taskId); + return FALSE; +} + +void Task_Dive(u8 taskId) +{ + while (gUnknown_0839F330[gTasks[taskId].data[0]](&gTasks[taskId])); +} + +bool8 sub_8087124(struct Task *task) +{ + gPlayerAvatar.preventStep = TRUE; + task->data[0]++; + return FALSE; +} + +bool8 dive_2_unknown(struct Task *task) +{ + ScriptContext2_Enable(); + gFieldEffectArguments[0] = task->data[15]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + return FALSE; +} + +bool8 dive_3_unknown(struct Task *task) +{ + struct MapPosition mapPosition; + PlayerGetDestCoords(&mapPosition.x, &mapPosition.y); + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + dive_warp(&mapPosition, gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E); + DestroyTask(FindTaskIdByFunc(Task_Dive)); + FieldEffectActiveListRemove(FLDEFF_USE_DIVE); + } + return FALSE; +} + +void sub_80871D0(u8); +void mapldr_080851BC(void); + +void sub_80871B8(u8 priority) +{ + CreateTask(sub_80871D0, priority); +} + +void sub_80871D0(u8 taskId) +{ + while (gUnknown_0839F33C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_808722C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + FreezeMapObjects(); + CameraObjectReset2(); + SetCameraPanningCallback(NULL); + gPlayerAvatar.preventStep = TRUE; + mapObject->mapobj_bit_26 = 1; + task->data[1] = 1; + task->data[0]++; + return TRUE; +} + +bool8 sub_8087264(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if (task->data[2] > 7) + { + task->data[2] = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8087298(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->pos2.y = 0; + task->data[3] = 1; + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP); + PlaySE(SE_W153); + task->data[0]++; + return TRUE; +} + +bool8 sub_80872E4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + s16 centerToCornerVecY; + SetCameraPanning(0, task->data[1]); + if (task->data[1] = -task->data[1], ++task->data[2] <= 17) + { + if (!(task->data[2] & 1) && (task->data[1] <= 3)) + { + task->data[1] <<= 1; + } + } else if (!(task->data[2] & 4) && (task->data[1] > 0)) + { + task->data[1] >>= 1; + } + if (task->data[2] > 6) + { + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY)) + { + sprite->pos2.y -= task->data[3]; + if (task->data[3] <= 7) + { + task->data[3]++; + } + } else + { + task->data[4] = 1; + } + } + if (task->data[5] == 0 && sprite->pos2.y < -0x10) + { + task->data[5]++; + mapObject->mapobj_bit_26 = 1; + sprite->oam.priority = 1; + sprite->subspriteMode = 2; + } + if (task->data[1] == 0 && task->data[4] != 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80873D8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8053FF8(); + fade_8080918(); + task->data[0]++; + return FALSE; +} + +bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + warp_in(); + gFieldCallback = mapldr_080851BC; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80871D0)); + } + return FALSE; +} + +void sub_8087470(u8); + +void mapldr_080851BC(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + gFieldCallback = NULL; + CreateTask(sub_8087470, 0); +} + +void sub_8087470(u8 taskId) +{ + while (gUnknown_0839F354[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + CameraObjectReset2(); + FreezeMapObjects(); + gPlayerAvatar.preventStep = TRUE; + mapObject->mapobj_bit_13 = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (IsWeatherNotFadingIn()) + { + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8087548(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite = &gSprites[task->data[1]]; + if (sprite->animCmdIndex > 1) + { + task->data[0]++; + mapObject->mapobj_bit_13 = 0; + CameraObjectReset1(); + PlaySE(SE_W091); + FieldObjectSetSpecialAnim(mapObject, sub_80608A4(DIR_EAST)); + } + return FALSE; +} + +bool8 sub_808759C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087470)); + } + return FALSE; +} + +extern void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy); +extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; + +u8 FldEff_LavaridgeGymWarp(void) +{ + u8 spriteId; + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_8087638(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); + } +} + +void sub_808766C(u8); + +void sub_8087654(u8 priority) +{ + CreateTask(sub_808766C, priority); +} + +void sub_808766C(u8 taskId) +{ + while(gUnknown_0839F364[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80876C8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + FreezeMapObjects(); + CameraObjectReset2(); + gPlayerAvatar.preventStep = TRUE; + mapObject->mapobj_bit_26 = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80876F8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + if (task->data[1] > 3) + { + gFieldEffectArguments[0] = mapObject->coords2.x; + gFieldEffectArguments[1] = mapObject->coords2.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } else + { + task->data[1]++; + FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); + PlaySE(SE_FU_ZUZUZU); + } + } + return FALSE; +} + +bool8 sub_8087774(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gSprites[task->data[1]].animCmdIndex == 2) + { + mapObject->mapobj_bit_13 = 1; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80877AC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) + { + sub_8053FF8(); + fade_8080918(); + task->data[0]++; + } + return FALSE; +} + +void sub_80878C4(u8); +void mapldr_080859D4(void); + +bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + warp_in(); + gFieldCallback = sub_8086748; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_808766C)); + } + return FALSE; +} + +u8 FldEff_PopOutOfAsh(void) +{ + u8 spriteId; + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_808788C(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH); + } +} + +void sub_80878A8(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + CreateTask(sub_80878C4, 0x50); +} + +void sub_80878C4(u8 taskId) +{ + gUnknown_0839F378[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80878F4(struct Task *task) +{ + task->data[0]++; + task->data[14] = 64; + task->data[15] = player_get_direction_lower_nybble(); +} + +void sub_8087914(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; + if (task->data[14] != 0 && (--task->data[14]) == 0) + { + sub_8053FF8(); + fade_8080918(); + } + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + if (task->data[14] == 0 && !gPaletteFade.active && sub_8054034() == TRUE) + { + FieldObjectSetDirection(mapObject, task->data[15]); + sub_8053678(); + warp_in(); + gFieldCallback = mapldr_080859D4; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80878C4)); + } else if (task->data[1] == 0 || (--task->data[1]) == 0) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); + if (task->data[2] < 12) + { + task->data[2]++; + } + task->data[1] = 8 >> (task->data[2] >> 2); + } + } +} + +void (*const gUnknown_0839F388[])(struct Task *) = { + sub_8087AA4, + sub_8087AC8 +}; + +void sub_8087A74(u8); + +void mapldr_080859D4(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + gFieldCallback = NULL; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + CreateTask(sub_8087A74, 0); +} + +void sub_8087A74(u8 taskId) +{ + gUnknown_0839F388[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087AA4(struct Task *task) +{ + if (IsWeatherNotFadingIn()) + { + task->data[0]++; + task->data[15] = player_get_direction_lower_nybble(); + } +} + +void sub_8087AC8(struct Task *task) +{ + u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; + struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) && !FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + return; + } + if (task->data[2] >= 32 && task->data[15] == player_get_direction_lower_nybble()) + { + mapObject->mapobj_bit_13 = 0; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087A74)); + return; + } + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); + if (task->data[2] < 32) + { + task->data[2]++; + } + task->data[1] = task->data[2] >> 2; + } + mapObject->mapobj_bit_13 ^= 1; +} + +void sub_8087BBC(u8); +void mapldr_08085D88(void); + +void sub_8087BA8(void) +{ + CreateTask(sub_8087BBC, 0); +} + +void (*const gUnknown_0839F390[])(struct Task *) = { + sub_8087BEC, + sub_8087C14, + sub_8087CA4, + sub_8087D78 +}; + +void sub_8087BBC(u8 taskId) +{ + gUnknown_0839F390[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087BEC(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + CameraObjectReset2(); + task->data[15] = player_get_direction_lower_nybble(); + task->data[0]++; +} + +void sub_8087C14(struct Task *task) +{ + u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; + struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + task->data[1] = 8; + task->data[2]++; + } + if (task->data[2] > 7 && task->data[15] == mapObject->mapobj_unk_18) + { + task->data[0]++; + task->data[1] = 4; + task->data[2] = 8; + task->data[3] = 1; + PlaySE(SE_TK_WARPIN); + } +} + +void sub_8087CA4(struct Task *task) +{ + u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; + struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((--task->data[1]) <= 0) + { + task->data[1] = 4; + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + } + sprite->pos1.y -= task->data[3]; + task->data[4] += task->data[3]; + if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8)) + { + task->data[3] <<= 1; + } + if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != 0)) + { + sprite->subspriteMode = 2; + } + if (task->data[4] >= 0xa8) + { + task->data[0]++; + sub_8053FF8(); + fade_8080918(); + } +} + +void sub_8087D78(struct Task *task) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + Overworld_SetWarpDestToLastHealLoc(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gFieldCallback = mapldr_08085D88; + DestroyTask(FindTaskIdByFunc(sub_8087BBC)); + } +} + +void sub_8087E1C(u8); + +void mapldr_08085D88(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + gFieldCallback = NULL; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + CameraObjectReset2(); + CreateTask(sub_8087E1C, 0); +} + +void (*const gUnknown_0839F3A0[])(struct Task *) = { + sub_8087E4C, + sub_8087ED8, + sub_8087FDC +}; + +void sub_8087E1C(u8 taskId) +{ + gUnknown_0839F3A0[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087E4C(struct Task *task) +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + if (IsWeatherNotFadingIn()) + { + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + task->data[0]++; + task->data[1] = 8; + task->data[2] = 1; + task->data[14] = sprite->subspriteMode; + task->data[15] = player_get_direction_lower_nybble(); + PlaySE(SE_TK_WARPIN); + } +} + +void sub_8087ED8(struct Task *task) +{ + u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; + struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((sprite->pos2.y += task->data[1]) >= -8) + { + if (task->data[13] == 0) + { + task->data[13]++; + mapObject->mapobj_bit_2 = 1; + sprite->subspriteMode = task->data[14]; + } + } else + { + sprite->oam.priority = 1; + if (sprite->subspriteMode != 0) + { + sprite->subspriteMode = 2; + } + } + if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1)) + { + task->data[1]--; + } + if ((--task->data[2]) == 0) + { + task->data[2] = 4; + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + } + if (sprite->pos2.y >= 0) + { + sprite->pos2.y = 0; + task->data[0]++; + task->data[1] = 1; + task->data[2] = 0; + } +} + +void sub_8087FDC(struct Task *task) +{ + u8 unknown_0839F380[5] = {1, 3, 4, 2, 1}; + struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if ((--task->data[1]) == 0) + { + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + task->data[1] = 8; + if ((++task->data[2]) > 4 && task->data[14] == mapObject->mapobj_unk_18) + { + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087E1C)); + } + } +} + +void sub_8088120(u8); +void sub_808847C(u8); +u8 sub_8088830(u32, u32, u32); +void sub_80883DC(void); +void sub_808843C(u16); +void sub_8088890(struct Sprite *); + +bool8 FldEff_FieldMoveShowMon(void) +{ + u8 taskId; + if (is_map_type_1_2_3_5_or_6(Overworld_GetMapTypeOfSaveblockLocation()) == TRUE) + { + taskId = CreateTask(sub_8088120, 0xff); + } else + { + taskId = CreateTask(sub_808847C, 0xff); + } + gTasks[taskId].data[15] = sub_8088830(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + return FALSE; +} + +bool8 FldEff_FieldMoveShowMonInit(void) +{ + struct Pokemon *pokemon; + u32 flag = gFieldEffectArguments[0] & 0x80000000; + pokemon = &gPlayerParty[(u8)gFieldEffectArguments[0]]; + gFieldEffectArguments[0] = GetMonData(pokemon, MON_DATA_SPECIES); + gFieldEffectArguments[1] = GetMonData(pokemon, MON_DATA_OT_ID); + gFieldEffectArguments[2] = GetMonData(pokemon, MON_DATA_PERSONALITY); + gFieldEffectArguments[0] |= flag; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + return FALSE; +} + +void (*const gUnknown_0839F3AC[])(struct Task *) = { + sub_8088150, + sub_80881C0, + sub_8088228, + sub_80882B4, + sub_80882E4, + sub_8088338, + sub_8088380 +}; + +void sub_8088120(u8 taskId) +{ + gUnknown_0839F3AC[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088150(struct Task *task) +{ + task->data[11] = REG_WININ; + task->data[12] = REG_WINOUT; + StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback); + task->data[1] = 0xf0f1; + task->data[2] = 0x5051; + task->data[3] = 0x3f; + task->data[4] = 0x3e; + REG_WIN0H = task->data[1]; + REG_WIN0V = task->data[2]; + REG_WININ = task->data[3]; + REG_WINOUT = task->data[4]; + SetVBlankCallback(sub_80883DC); + task->data[0]++; +} + +void sub_80881C0(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x200); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); + sub_808843C(delta); + task->data[0]++; +} + +void sub_8088228(struct Task *task) +{ + s16 v0; + s16 v2; + s16 v3; + task->data[5] -= 16; + v0 = ((u16)task->data[1] >> 8); + v2 = ((u16)task->data[2] >> 8); + v3 = ((u16)task->data[2] & 0xff); + v0 -= 16; + v2 -= 2; + v3 += 2; + if (v0 < 0) + { + v0 = 0; + } + if (v2 < 0x28) + { + v2 = 0x28; + } + if (v3 > 0x78) + { + v3 = 0x78; + } + task->data[1] = (v0 << 8) | (task->data[1] & 0xff); + task->data[2] = (v2 << 8) | v3; + if (v0 == 0 && v2 == 0x28 && v3 == 0x78) + { + gSprites[task->data[15]].callback = sub_8088890; + task->data[0]++; + } +} + +void sub_80882B4(struct Task *task) +{ + task->data[5] -= 16; + if (gSprites[task->data[15]].data[7]) + { + task->data[0]++; + } +} + +void sub_80882E4(struct Task *task) +{ + s16 v2; + s16 v3; + task->data[5] -= 16; + v2 = (task->data[2] >> 8); + v3 = (task->data[2] & 0xff); + v2 += 6; + v3 -= 6; + if (v2 > 0x50) + { + v2 = 0x50; + } + if (v3 < 0x51) + { + v3 = 0x51; + } + task->data[2] = (v2 << 8) | v3; + if (v2 == 0x50 && v3 == 0x51) + { + task->data[0]++; + } +} + +void sub_8088338(struct Task *task) +{ + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + task->data[1] = 0xf1; + task->data[2] = 0xa1; + task->data[3] = task->data[11]; + task->data[4] = task->data[12]; + task->data[0]++; +} + +void sub_8088380(struct Task *task) +{ + IntrCallback callback; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + SetVBlankCallback(callback); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_8088120)); +} + +void sub_80883DC(void) +{ + struct Task *task; + IntrCallback callback; + task = &gTasks[FindTaskIdByFunc(sub_8088120)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + callback(); + REG_WIN0H = task->data[1]; + REG_WIN0V = task->data[2]; + REG_WININ = task->data[3]; + REG_WINOUT = task->data[4]; + REG_BG0HOFS = task->data[5]; + REG_BG0VOFS = task->data[6]; +} + +void sub_808843C(u16 offs) +{ + u16 i; + u16 *dest; + dest = (u16 *)(VRAM + 0x140 + offs); + for (i=0; i<0x140; i++, dest++) + { + *dest = gFieldMoveStreaksTilemap[i] | 0xf000; + } +} + +void sub_80886B0(void); +bool8 sub_8088708(struct Task *); +void sub_80886F8(struct Task *); +bool8 sub_80887C0(struct Task *); + +void (*const gUnknown_0839F3C8[])(struct Task *) = { + sub_80884AC, + sub_80884E8, + sub_8088554, + sub_80885A8, + sub_80885D8, + sub_808860C, + sub_808862C +}; + +void sub_808847C(u8 taskId) +{ + gUnknown_0839F3C8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80884AC(struct Task *task) +{ + REG_BG0HOFS = task->data[1]; + REG_BG0VOFS = task->data[2]; + StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); + SetVBlankCallback(sub_80886B0); + task->data[0]++; +} + +void sub_80884E8(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + task->data[12] = delta; + CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x80); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20); + task->data[0]++; +} + +void sub_8088554(struct Task *task) +{ + if (sub_8088708(task)) + { + REG_WIN1H = 0x00f0; + REG_WIN1V = 0x2878; + gSprites[task->data[15]].callback = sub_8088890; + task->data[0]++; + } + sub_80886F8(task); +} + +void sub_80885A8(struct Task *task) +{ + sub_80886F8(task); + if (gSprites[task->data[15]].data[7]) + { + task->data[0]++; + } +} + +void sub_80885D8(struct Task *task) +{ + sub_80886F8(task); + task->data[3] = task->data[1] & 7; + task->data[4] = 0; + REG_WIN1H = 0xffff; + REG_WIN1V = 0xffff; + task->data[0]++; +} + +void sub_808860C(struct Task *task) +{ + sub_80886F8(task); + if (sub_80887C0(task)) + { + task->data[0]++; + } +} + +void sub_808862C(struct Task *task) +{ + IntrCallback intrCallback; + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + SetVBlankCallback(intrCallback); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_808847C)); +} + +void sub_80886B0(void) +{ + IntrCallback intrCallback; + struct Task *task; + task = &gTasks[FindTaskIdByFunc(sub_808847C)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + intrCallback(); + REG_BG0HOFS = task->data[1]; + REG_BG0VOFS = task->data[2]; +} + +void sub_80886F8(struct Task *task) +{ + task->data[1] -= 16; + task->data[3] += 16; +} + +#ifdef NONMATCHING +bool8 sub_8088708(struct Task *task) +{ + u16 i; + u16 srcOffs; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = (task->data[3] >> 3) & 0x1f; + if (dstOffs >= task->data[4]) + { + dstOffs = (32 - dstOffs) & 0x1f; + srcOffs = (32 - task->data[4]) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32] | 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} +#else +__attribute__((naked)) +bool8 sub_8088708(struct Task *task) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x4\n" + "\tadds r5, r0, 0\n" + "\tldrh r2, [r5, 0x10]\n" + "\tmovs r1, 0x10\n" + "\tldrsh r0, [r5, r1]\n" + "\tcmp r0, 0x1F\n" + "\tble _08088724\n" + "\tmovs r0, 0x1\n" + "\tb _080887A8\n" + "_08088724:\n" + "\tldrh r0, [r5, 0xE]\n" + "\tlsls r0, 16\n" + "\tasrs r3, r0, 19\n" + "\tmovs r1, 0x1F\n" + "\tands r3, r1\n" + "\tmovs r4, 0x10\n" + "\tldrsh r0, [r5, r4]\n" + "\tcmp r3, r0\n" + "\tblt _080887A6\n" + "\tmovs r0, 0x20\n" + "\tsubs r3, r0, r3\n" + "\tands r3, r1\n" + "\tsubs r0, r2\n" + "\tmov r12, r0\n" + "\tmov r7, r12\n" + "\tands r7, r1\n" + "\tmov r12, r7\n" + "\tldrh r0, [r5, 0x20]\n" + "\tldr r1, _080887B8 @ =0x06000140\n" + "\tadds r1, r0\n" + "\tmov r8, r1\n" + "\tmovs r4, 0\n" + "\tldr r7, _080887BC @ =gDarknessFieldMoveStreaksTilemap\n" + "\tmov r10, r7\n" + "\tmovs r0, 0xF0\n" + "\tlsls r0, 8\n" + "\tmov r9, r0\n" + "\tadds r1, r3, 0x1\n" + "\tmovs r0, 0x1F\n" + "\tands r1, r0\n" + "\tstr r1, [sp]\n" + "\tmov r6, r12\n" + "\tadds r6, 0x1\n" + "\tands r6, r0\n" + "_08088768:\n" + "\tlsls r1, r4, 5\n" + "\tadds r2, r1, r3\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tmov r7, r12\n" + "\tadds r0, r7, r1\n" + "\tlsls r0, 1\n" + "\tadd r0, r10\n" + "\tldrh r0, [r0]\n" + "\tmov r7, r9\n" + "\torrs r0, r7\n" + "\tstrh r0, [r2]\n" + "\tldr r0, [sp]\n" + "\tadds r2, r1, r0\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tadds r1, r6, r1\n" + "\tlsls r1, 1\n" + "\tadd r1, r10\n" + "\tldrh r0, [r1]\n" + "\tmov r1, r9\n" + "\torrs r0, r1\n" + "\tstrh r0, [r2]\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tcmp r4, 0x9\n" + "\tbls _08088768\n" + "\tldrh r0, [r5, 0x10]\n" + "\tadds r0, 0x2\n" + "\tstrh r0, [r5, 0x10]\n" + "_080887A6:\n" + "\tmovs r0, 0\n" + "_080887A8:\n" + "\tadd sp, 0x4\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_080887B8: .4byte 0x06000140\n" + "_080887BC: .4byte gDarknessFieldMoveStreaksTilemap"); +} +#endif + +bool8 sub_80887C0(struct Task *task) +{ + u16 i; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = task->data[3] >> 3; + if (dstOffs >= task->data[4]) + { + dstOffs = (task->data[1] >> 3) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} + +u8 sub_8088830(u32 a0, u32 a1, u32 a2) +{ + u16 v0; + u8 monSprite; + struct Sprite *sprite; + v0 = (a0 & 0x80000000) >> 16; + a0 &= 0x7fffffff; + monSprite = CreateMonSprite_FieldMove(a0, a1, a2, 0x140, 0x50, 0); + sprite = &gSprites[monSprite]; + sprite->callback = SpriteCallbackDummy; + sprite->oam.priority = 0; + sprite->data[0] = a0; + sprite->data[6] = v0; + return monSprite; +} + +void sub_80888D4(struct Sprite *); + +void sub_8088890(struct Sprite *sprite) +{ + if ((sprite->pos1.x -= 20) <= 0x78) + { + sprite->pos1.x = 0x78; + sprite->data[1] = 30; + sprite->callback = sub_80888D4; + if (sprite->data[6]) + { + PlayCry2(sprite->data[0], 0, 0x7d, 0xa); + } else + { + PlayCry1(sprite->data[0], 0); + } + } +} + +void sub_80888F0(struct Sprite *); + +void sub_80888D4(struct Sprite *sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->callback = sub_80888F0; + } +} + +void sub_80888F0(struct Sprite *sprite) +{ + if (sprite->pos1.x < -0x40) + { + sprite->data[7] = 1; + } else + { + sprite->pos1.x -= 20; + } +} + +void sub_8088954(u8); + +u8 FldEff_UseSurf(void) +{ + u8 taskId; + taskId = CreateTask(sub_8088954, 0xff); + gTasks[taskId].data[15] = gFieldEffectArguments[0]; + Overworld_ClearSavedMusic(); + Overworld_ChangeMusicTo(0x016d); + return FALSE; +} + +void (*const gUnknown_0839F3E4[])(struct Task *) = { + sub_8088984, + sub_80889E4, + sub_8088A30, + sub_8088A78, + sub_8088AF4 +}; + +void sub_8088954(u8 taskId) +{ + gUnknown_0839F3E4[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088984(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(8); + PlayerGetDestCoords(&task->data[1], &task->data[2]); + MoveCoords(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18, &task->data[1], &task->data[2]); + task->data[0]++; +} + +void sub_80889E4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_8088A30(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject)) + { + gFieldEffectArguments[0] = task->data[15] | 0x80000000; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } +} + +void sub_8088A78(struct Task *task) +{ + struct MapObject *mapObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(3)); + FieldObjectClearAnimIfSpecialAnimFinished(mapObject); + FieldObjectSetSpecialAnim(mapObject, sub_80608D0(mapObject->placeholder18)); + gFieldEffectArguments[0] = task->data[1]; + gFieldEffectArguments[1] = task->data[2]; + gFieldEffectArguments[2] = gPlayerAvatar.mapObjectId; + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_SURF_BLOB); + task->data[0]++; + } +} + +void sub_8088AF4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + gPlayerAvatar.preventStep = FALSE; + gPlayerAvatar.flags &= 0xdf; + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(mapObject->placeholder18)); + sub_8127ED0(mapObject->mapobj_unk_1A, 1); + UnfreezeMapObjects(); + ScriptContext2_Disable(); + FieldEffectActiveListRemove(FLDEFF_USE_SURF); + DestroyTask(FindTaskIdByFunc(sub_8088954)); + } +} + +void sub_8088BC4(struct Sprite *); + +u8 FldEff_NPCFlyOut(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_8088BC4; + sprite->data[1] = gFieldEffectArguments[0]; + PlaySE(SE_W019); + return spriteId; +} + +void sub_8088BC4(struct Sprite *sprite) +{ + struct Sprite *npcSprite; + sprite->pos2.x = Cos(sprite->data[2], 0x8c); + sprite->pos2.y = Sin(sprite->data[2], 0x48); + sprite->data[2] = (sprite->data[2] + 4) & 0xff; + if (sprite->data[0]) + { + npcSprite = &gSprites[sprite->data[1]]; + npcSprite->coordOffsetEnabled = 0; + npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x; + npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + npcSprite->pos2.x = 0; + npcSprite->pos2.y = 0; + } + if (sprite->data[2] >= 0x80) + { + FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); + } +} + +void sub_8088C70(u8); +extern void sub_8127EFC(u8, u8); +u8 sub_8088F60(void); +bool8 sub_8088FA4(u8); +void sub_8088FC0(u8); +void sub_8088FFC(u8, u8); +void sub_8089018(struct Sprite *); +void sub_80890D8(struct Sprite *); + +u8 FldEff_UseFly(void) +{ + u8 taskId; + taskId = CreateTask(sub_8088C70, 0xfe); + gTasks[taskId].data[1] = gFieldEffectArguments[0]; + return 0; +} + +void (*const gUnknown_0839F3F8[])(struct Task *) = { + sub_8088CA0, + sub_8088CF8, + sub_8088D3C, + sub_8088D94, + sub_8088DD8, + sub_8088E2C, + sub_8088EB4, + sub_8088F10, + sub_8088F30 +}; + +void sub_8088C70(u8 taskId) +{ + gUnknown_0839F3F8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088CA0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(1); + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_8088CF8(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + gFieldEffectArguments[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + } +} + +void sub_8088D3C(struct Task *task) +{ + struct MapObject *mapObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[15] & 0x08) + { + sub_8127ED0(mapObject->mapobj_unk_1A, 2); + sub_8127EFC(mapObject->mapobj_unk_1A, 0); + } + task->data[1] = sub_8088F60(); + task->data[0]++; + } +} + +void sub_8088D94(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + task->data[0]++; + task->data[2] = 16; + SetPlayerAvatarTransitionFlags(0x01); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], 0x02); + } +} + +void sub_8088DD8(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if ((task->data[2] == 0 || (--task->data[2]) == 0) && FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + PlaySE(SE_W019); + sub_8088FC0(task->data[1]); + } +} + +void sub_8088E2C(struct Task *task) +{ + struct MapObject *mapObject; + if ((++task->data[2]) >= 8) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x03)); + StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); + mapObject->mapobj_bit_12 = 1; + FieldObjectSetSpecialAnim(mapObject, 0x48); + if (task->data[15] & 0x08) + { + DestroySprite(&gSprites[mapObject->mapobj_unk_1A]); + } + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_8088EB4(struct Task *task) +{ + struct MapObject *mapObject; + if ((++task->data[2]) >= 10) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + mapObject->mapobj_bit_12 = 0; + mapObject->mapobj_bit_22 = 0; + sub_8088FFC(task->data[1], mapObject->spriteId); + CameraObjectReset2(); + task->data[0]++; + } +} + +void sub_8088F10(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + fade_8080918(); + task->data[0]++; + } +} + +void sub_8088F30(struct Task *task) +{ + if (!gPaletteFade.active) + { + FieldEffectActiveListRemove(FLDEFF_USE_FLY); + DestroyTask(FindTaskIdByFunc(sub_8088C70)); + } +} + +u8 sub_8088F60(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_8089018; + return spriteId; +} + +u8 sub_8088FA4(u8 spriteId) +{ + return gSprites[spriteId].data[7]; +} + +void sub_8088FC0(u8 spriteId) +{ + struct Sprite *sprite; + sprite = &gSprites[spriteId]; + sprite->callback = sub_80890D8; + sprite->pos1.x = 0x78; + sprite->pos1.y = 0x00; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */); + sprite->data[6] = 0x40; +} + +void sub_8088FFC(u8 a0, u8 a1) +{ + gSprites[a0].data[6] = a1; +} + +const union AffineAnimCmd SpriteAffineAnim_839F41C[] = { + AFFINEANIMCMD_FRAME(8, 8, -30, 0), + AFFINEANIMCMD_FRAME(28, 28, 0, 30), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd SpriteAffineAnim_839F434[] = { + AFFINEANIMCMD_FRAME(256, 256, 64, 0), + AFFINEANIMCMD_FRAME(-10, -10, 0, 22), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_0839F44C[] = { + SpriteAffineAnim_839F41C, + SpriteAffineAnim_839F434 +}; + +void sub_8089018(struct Sprite *sprite) +{ + if (sprite->data[7] == 0) + { + if (sprite->data[0] == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 0); + sprite->pos1.x = 0x76; + sprite->pos1.y = -0x30; + sprite->data[0]++; + sprite->data[1] = 0x40; + sprite->data[2] = 0x100; + } + sprite->data[1] += (sprite->data[2] >> 8); + sprite->pos2.x = Cos(sprite->data[1], 0x78); + sprite->pos2.y = Sin(sprite->data[1], 0x78); + if (sprite->data[2] < 0x800) + { + sprite->data[2] += 0x60; + } + if (sprite->data[1] > 0x81) + { + sprite->data[7]++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0); + } + } +} + +void sub_80890D8(struct Sprite *sprite) +{ + struct Sprite *sprite1; + sprite->pos2.x = Cos(sprite->data[2], 0x8c); + sprite->pos2.y = Sin(sprite->data[2], 0x48); + sprite->data[2] = (sprite->data[2] + 4) & 0xff; + if (sprite->data[6] != 0x40) + { + sprite1 = &gSprites[sprite->data[6]]; + sprite1->coordOffsetEnabled = 0; + sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x; + sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + sprite1->pos2.x = 0; + sprite1->pos2.y = 0; + } + if (sprite->data[2] >= 0x80) + { + sprite->data[7] = 1; + } +} + +void sub_808914C(struct Sprite *sprite) +{ + if (sprite->data[7] == 0) + { + if (sprite->data[0] == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 1); + sprite->pos1.x = 0x5e; + sprite->pos1.y = -0x20; + sprite->data[0]++; + sprite->data[1] = 0xf0; + sprite->data[2] = 0x800; + sprite->data[4] = 0x80; + } + sprite->data[1] += sprite->data[2] >> 8; + sprite->data[3] += sprite->data[2] >> 8; + sprite->data[1] &= 0xff; + sprite->pos2.x = Cos(sprite->data[1], 0x20); + sprite->pos2.y = Sin(sprite->data[1], 0x78); + if (sprite->data[2] > 0x100) + { + sprite->data[2] -= sprite->data[4]; + } + if (sprite->data[4] < 0x100) + { + sprite->data[4] += 24; + } + if (sprite->data[2] < 0x100) + { + sprite->data[2] = 0x100; + } + if (sprite->data[3] >= 60) + { + sprite->data[7]++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->invisible = 1; + } + } +} + +void sub_8089230(u8 spriteId) +{ + sub_8088FC0(spriteId); + gSprites[spriteId].callback = sub_808914C; +} + +void sub_8089270(u8); + +u8 FldEff_FlyIn(void) +{ + CreateTask(sub_8089270, 0xfe); + return 0; +} + +void (*const gUnknown_0839F454[])(struct Task *) = { + sub_80892A0, + sub_8089354, + sub_80893C0, + sub_8089414, + sub_808948C, + sub_80894C4, + fishE +}; + +void sub_8089270(u8 taskId) +{ + gUnknown_0839F454[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80892A0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + task->data[2] = 17; + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(0x01); + if (task->data[15] & 0x08) + { + sub_8127ED0(mapObject->mapobj_unk_1A, 0); + } + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x3)); + CameraObjectReset2(); + FieldObjectTurn(mapObject, DIR_WEST); + StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); + mapObject->mapobj_bit_13 = 0; + task->data[1] = sub_8088F60(); + sub_8088FC0(task->data[1]); + sub_8088FFC(task->data[1], mapObject->spriteId); + } +} + +void sub_8089354(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + if (task->data[2] == 0 || (--task->data[2]) == 0) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + sub_8088FFC(task->data[1], 0x40); + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_80893C0(struct Task *task) +{ + s16 unknown_0839F470[18] = { + -2, + -4, + -5, + -6, + -7, + -8, + -8, + -8, + -7, + -7, + -6, + -5, + -3, + -2, + 0, + 2, + 4, + 8 + }; + struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y = unknown_0839F470[task->data[2]]; + if ((++task->data[2]) >= 18) + { + task->data[0]++; + } +} + +void sub_8089414(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + if (sub_8088FA4(task->data[1])) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + mapObject->mapobj_bit_12 = 0; + sub_805C058(mapObject, mapObject->coords2.x, mapObject->coords2.y); + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->coordOffsetEnabled = 1; + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_808948C(struct Task *task) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gPlayerAvatar.mapObjectId])) + { + task->data[0]++; + sub_8089230(task->data[1]); + } +} + +void sub_80894C4(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + DestroySprite(&gSprites[task->data[1]]); + task->data[0]++; + task->data[1] = 0x10; + } +} + +void fishE(struct Task *task) +{ + u8 state; + struct MapObject *mapObject; + if ((--task->data[1]) == 0) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + state = 0; + if (task->data[15] & 0x08) + { + state = 3; + sub_8127ED0(mapObject->mapobj_unk_1A, 1); + } + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(state)); + FieldObjectTurn(mapObject, DIR_SOUTH); + gPlayerAvatar.flags = task->data[15]; + gPlayerAvatar.preventStep = FALSE; + FieldEffectActiveListRemove(FLDEFF_FLY_IN); + DestroyTask(FindTaskIdByFunc(sub_8089270)); + } +} diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c new file mode 100644 index 000000000..bc4a1770e --- /dev/null +++ b/src/field_effect_helpers.c @@ -0,0 +1,1602 @@ +#include "global.h" +#include "sprite.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "constants/songs.h" +#include "sound.h" +#include "event_object_movement.h" +#include "field_camera.h" +#include "field_weather.h" +#include "field_effect.h" +#include "field_effect_helpers.h" + +static void sub_81269E0(struct Sprite *); +static void npc_pal_op(struct MapObject *mapObject, struct Sprite *sprite); +static void npc_pal_op_A(struct MapObject *, u8); +static void npc_pal_op_B(struct MapObject *, u8); +static void sub_81275A0(struct Sprite *); +static void sub_81275C4(struct Sprite *); +static void sub_8127DA0(struct Sprite *); +static void sub_8127DD0(struct Sprite *); +static void sub_8127E30(struct Sprite *); +static void sub_812882C(struct Sprite *, u8, u8); +static void sub_81278D8(struct Sprite *); +static void sub_8127FD4(struct MapObject *, struct Sprite *); +static void sub_812800C(struct MapObject *, struct Sprite *); +static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *); +static void sub_8128174(struct Sprite *); +static u32 ShowDisguiseFieldEffect(u8, u8, u8); + +void SetUpReflection(struct MapObject *mapObject, struct Sprite *sprite, bool8 flag) +{ + struct Sprite *newSprite; + + newSprite = &gSprites[obj_unfreeze(sprite, sprite->pos1.x, sprite->pos1.y, 0x98)]; + newSprite->callback = sub_81269E0; + newSprite->oam.priority = 3; + newSprite->oam.paletteNum = gUnknown_0830FD14[newSprite->oam.paletteNum]; + newSprite->usingSheet = TRUE; + newSprite->anims = gDummySpriteAnimTable; + StartSpriteAnim(newSprite, 0); + newSprite->affineAnims = gDummySpriteAffineAnimTable; + newSprite->affineAnimBeginning = TRUE; + newSprite->subspriteMode = 0; + newSprite->data[0] = sprite->data[0]; + newSprite->data[1] = mapObject->localId; + newSprite->data[7] = flag; + npc_pal_op(mapObject, newSprite); + if (!flag) + { + newSprite->oam.affineMode = 1; + } +} + +static s16 sub_81268D0(struct MapObject *mapObject) +{ + return GetFieldObjectGraphicsInfo(mapObject->graphicsId)->height - 2; +} + +static void npc_pal_op(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 whichElement; + u16 unk_8041e2c[] = {0x0c, 0x1c, 0x2c}; + sprite->data[2] = 0; + if (!GetFieldObjectGraphicsInfo(mapObject->graphicsId)->disableReflectionPaletteLoad && ((whichElement = sub_8057450(mapObject->mapobj_unk_1F)) || (whichElement = sub_8057450(mapObject->mapobj_unk_1E)))) + { + sprite->data[2] = unk_8041e2c[whichElement - 1]; + npc_pal_op_A(mapObject, sprite->oam.paletteNum); + } + else + { + npc_pal_op_B(mapObject, sprite->oam.paletteNum); + } +} + +static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum) +{ + const struct MapObjectGraphicsInfo *graphicsInfo; + + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (graphicsInfo->paletteTag2 != 0x11ff) + { + if (graphicsInfo->paletteSlot == 0) + { + npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, paletteNum); + } + else if (graphicsInfo->paletteSlot == 10) + { + npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, paletteNum); + } + else + { + pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum); + } + UpdateSpritePaletteWithWeather(paletteNum); + } +} + +static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum) +{ + const struct MapObjectGraphicsInfo *graphicsInfo; + + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (graphicsInfo->paletteTag2 != 0x11ff) + { + pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum); + UpdateSpritePaletteWithWeather(paletteNum); + } +} + +static void sub_81269E0(struct Sprite *sprite) +{ + struct MapObject *mapObject; + struct Sprite *oldSprite; + + mapObject = &gMapObjects[sprite->data[0]]; + oldSprite = &gSprites[mapObject->spriteId]; + if (!mapObject->active || !mapObject->mapobj_bit_17 || mapObject->localId != sprite->data[1]) + { + sprite->inUse = FALSE; + } + else + { + sprite->oam.paletteNum = gUnknown_0830FD14[oldSprite->oam.paletteNum]; + sprite->oam.shape = oldSprite->oam.shape; + sprite->oam.size = oldSprite->oam.size; + sprite->oam.matrixNum = oldSprite->oam.matrixNum | 0x10; + sprite->oam.tileNum = oldSprite->oam.tileNum; + sprite->subspriteTables = oldSprite->subspriteTables; + sprite->subspriteTableNum = oldSprite->subspriteTableNum; + sprite->invisible = oldSprite->invisible; + sprite->pos1.x = oldSprite->pos1.x; + sprite->pos1.y = oldSprite->pos1.y + sub_81268D0(mapObject) + sprite->data[2]; + sprite->centerToCornerVecX = oldSprite->centerToCornerVecX; + sprite->centerToCornerVecY = oldSprite->centerToCornerVecY; + sprite->pos2.x = oldSprite->pos2.x; + sprite->pos2.y = -oldSprite->pos2.y; + sprite->coordOffsetEnabled = oldSprite->coordOffsetEnabled; + if (sprite->data[7] == FALSE) + { + sprite->oam.matrixNum = 0; + if (oldSprite->oam.matrixNum & 0x8) + { + sprite->oam.matrixNum = 1; + } + } + } +} + +u8 sub_8126B54(void) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[8] /*gFieldEffectSpriteTemplate_Arrow*/, 0, 0, 0x52); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->invisible = TRUE; + } + return spriteId; +} + +void objid_set_invisible(u8 spriteId) +{ + gSprites[spriteId].invisible = TRUE; +} + +void sub_8126BC4(u8 spriteId, u8 animNum, s16 x, s16 y) +{ + s16 x2; + s16 y2; + struct Sprite *sprite; + + sprite = &gSprites[spriteId]; + if (sprite->invisible || sprite->data[0] != x || sprite->data[1] != y) + { + sub_80603CC(x, y, &x2, &y2); + sprite = &gSprites[spriteId]; + sprite->pos1.x = x2 + 8; + sprite->pos1.y = y2 + 8; + sprite->invisible = FALSE; + sprite->data[0] = x; + sprite->data[1] = y; + StartSpriteAnim(sprite, animNum - 1); + } +} + +const u8 gUnknown_08401E32[] = { + 0, + 1, + 2, + 3 +}; + +const u16 gUnknown_08401E36[] = { + 4, + 4, + 4, + 16 +}; + +u32 FldEff_Shadow(void) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + u8 spriteId; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[gUnknown_08401E32[graphicsInfo->shadowSize]], 0, 0, 0x94); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].coordOffsetEnabled = TRUE; + gSprites[spriteId].data[0] = gFieldEffectArguments[0]; + gSprites[spriteId].data[1] = gFieldEffectArguments[1]; + gSprites[spriteId].data[2] = gFieldEffectArguments[2]; + gSprites[spriteId].data[3] = (graphicsInfo->height >> 1) - gUnknown_08401E36[graphicsInfo->shadowSize]; + } + return 0; +} + +void oamc_shadow(struct Sprite *sprite) +{ + u8 mapObjectId; + struct MapObject *mapObject; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId)) + { + FieldEffectStop(sprite, FLDEFF_SHADOW); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->oam.priority = linkedSprite->oam.priority; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y + sprite->data[3]; + if (!mapObject->active || !mapObject->mapobj_bit_22 || MetatileBehavior_IsPokeGrass(mapObject->mapobj_unk_1E) || MetatileBehavior_IsSurfableWaterOrUnderwater(mapObject->mapobj_unk_1E) || MetatileBehavior_IsSurfableWaterOrUnderwater(mapObject->mapobj_unk_1F) || MetatileBehavior_IsReflective(mapObject->mapobj_unk_1E) || MetatileBehavior_IsReflective(mapObject->mapobj_unk_1F)) + { + FieldEffectStop(sprite, FLDEFF_SHADOW); + } + } +} + +u32 FldEff_TallGrass(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[4], x, y, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = gFieldEffectArguments[0]; + sprite->data[2] = gFieldEffectArguments[1]; + sprite->data[3] = gFieldEffectArguments[4]; + sprite->data[4] = gFieldEffectArguments[5]; + sprite->data[5] = gFieldEffectArguments[6]; + if (gFieldEffectArguments[7]) + { + SeekSpriteAnim(sprite, 4); + } + } + return 0; +} + +void unc_grass_normal(struct Sprite *sprite) +{ + u8 mapNum; + u8 mapGroup; + u8 metatileBehavior; + u8 localId; + u8 mapObjectId; + struct MapObject *mapObject; + + mapNum = sprite->data[5] >> 8; + mapGroup = sprite->data[5]; + if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup)) + { + sprite->data[1] -= gCamera.x; + sprite->data[2] -= gCamera.y; + sprite->data[5] = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup; + } + localId = sprite->data[3] >> 8; + mapNum = sprite->data[3]; + mapGroup = sprite->data[4]; + metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded)) + { + FieldEffectStop(sprite, FLDEFF_TALL_GRASS); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + if ((mapObject->coords2.x != sprite->data[1] || mapObject->coords2.y != sprite->data[2]) && (mapObject->coords3.x != sprite->data[1] || mapObject->coords3.y != sprite->data[2])) + { + sprite->data[7] = TRUE; + } + metatileBehavior = 0; + if (sprite->animCmdIndex == 0) + { + metatileBehavior = 4; + } + sub_806487C(sprite, 0); + sub_812882C(sprite, sprite->data[0], metatileBehavior); + } +} + +u32 FldEff_JumpTallGrass(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[10], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = 12; + } + return 0; +} + +u8 sub_8126FF0(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + struct Sprite *sprite; + u8 i; + + for (i = 0; i < MAX_SPRITES; i ++) + { + if (gSprites[i].inUse) + { + sprite = &gSprites[i]; + if (sprite->callback == unc_grass_normal && (x == sprite->data[1] && y == sprite->data[2]) && (localId == (u8)(sprite->data[3] >> 8) && mapNum == (sprite->data[3] & 0xFF) && mapGroup == sprite->data[4])) + { + return i; + } + } + } + return MAX_SPRITES; +} + +u32 FldEff_LongGrass(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[15], x, y, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = ZCoordToPriority(gFieldEffectArguments[2]); + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = gFieldEffectArguments[0]; + sprite->data[2] = gFieldEffectArguments[1]; + sprite->data[3] = gFieldEffectArguments[4]; + sprite->data[4] = gFieldEffectArguments[5]; + sprite->data[5] = gFieldEffectArguments[6]; + if (gFieldEffectArguments[7]) + { + SeekSpriteAnim(sprite, 6); + } + } + return 0; +} + +void unc_grass_tall(struct Sprite *sprite) +{ + u8 mapNum; + u8 mapGroup; + u8 metatileBehavior; + u8 localId; + u8 mapObjectId; + struct MapObject *mapObject; + + mapNum = sprite->data[5] >> 8; + mapGroup = sprite->data[5]; + if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup)) + { + sprite->data[1] -= gCamera.x; + sprite->data[2] -= gCamera.y; + sprite->data[5] = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup; + } + localId = sprite->data[3] >> 8; + mapNum = sprite->data[3]; + mapGroup = sprite->data[4]; + metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded)) + { + FieldEffectStop(sprite, FLDEFF_LONG_GRASS); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + if ((mapObject->coords2.x != sprite->data[1] || mapObject->coords2.y != sprite->data[2]) && (mapObject->coords3.x != sprite->data[1] || mapObject->coords3.y != sprite->data[2])) + { + sprite->data[7] = TRUE; + } + sub_806487C(sprite, 0); + sub_812882C(sprite, sprite->data[0], 0); + } +} + +u32 FldEff_JumpLongGrass(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[16], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = 18; + } + return 0; +} + +u32 FldEff_ShortGrass(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[30], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &(gSprites[spriteId]); + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data[0] = gFieldEffectArguments[0]; + sprite->data[1] = gFieldEffectArguments[1]; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = gSprites[mapObject->spriteId].pos1.x; + sprite->data[4] = gSprites[mapObject->spriteId].pos1.y; + } + return 0; +} + +void sub_8127334(struct Sprite *sprite) +{ + u8 mapObjectId; + s16 x; + s16 y; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_18) + { + FieldEffectStop(sprite, FLDEFF_SHORT_GRASS); + } + else + { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + y = linkedSprite->pos1.y; + x = linkedSprite->pos1.x; + if (x != sprite->data[3] || y != sprite->data[4]) + { + sprite->data[3] = x; + sprite->data[4] = y; + if (sprite->animEnded) + { + StartSpriteAnim(sprite, 0); + } + } + sprite->pos1.x = x; + sprite->pos1.y = y; + sprite->pos2.y = (graphicsInfo->height >> 1) - 8; + sprite->subpriority = linkedSprite->subpriority - 1; + sprite->oam.priority = linkedSprite->oam.priority; + sub_806487C(sprite, linkedSprite->invisible); + } +} + +u32 FldEff_SandFootprints(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[11], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[7] = FLDEFF_SAND_FOOTPRINTS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return 0; +} + +u32 FldEff_DeepSandFootprints(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[23], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[7] = FLDEFF_DEEP_SAND_FOOTPRINTS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return spriteId; +} + +u32 FldEff_BikeTireTracks(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[27], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[7] = FLDEFF_BIKE_TIRE_TRACKS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return spriteId; +} + +void (*const gUnknown_08401E40[])(struct Sprite *) = { + sub_81275A0, + sub_81275C4 +}; + +void sub_8127584(struct Sprite *sprite) +{ + gUnknown_08401E40[sprite->data[0]](sprite); +} + +static void sub_81275A0(struct Sprite *sprite) +{ + if (++sprite->data[1] > 40) + { + sprite->data[0] = 1; + } + sub_806487C(sprite, FALSE); +} + +static void sub_81275C4(struct Sprite *sprite) +{ + sprite->invisible ^= 1; + sprite->data[1] ++; + sub_806487C(sprite, sprite->invisible); + if (sprite->data[1] > 56) + { + FieldEffectStop(sprite, sprite->data[7]); + } +} + +u32 FldEff_Splash(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->oam.priority = linkedSprite->oam.priority; + sprite->data[0] = gFieldEffectArguments[0]; + sprite->data[1] = gFieldEffectArguments[1]; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->pos2.y = (graphicsInfo->height >> 1) - 4; + PlaySE(SE_MIZU); + } + return 0; +} + +void sub_81276B4(struct Sprite *sprite) +{ + u8 mapObjectId; + + if (sprite->animEnded || TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId)) + { + FieldEffectStop(sprite, FLDEFF_SPLASH); + } + else + { + sprite->pos1.x = gSprites[gMapObjects[mapObjectId].spriteId].pos1.x; + sprite->pos1.y = gSprites[gMapObjects[mapObjectId].spriteId].pos1.y; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_JumpSmallSplash(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[14], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = FLDEFF_JUMP_SMALL_SPLASH; + } + return 0; +} + +u32 FldEff_JumpBigSplash(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[12], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = FLDEFF_JUMP_BIG_SPLASH; + } + return 0; +} + +u32 FldEff_FeetInFlowingWater(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->callback = sub_81278D8; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data[0] = gFieldEffectArguments[0]; + sprite->data[1] = gFieldEffectArguments[1]; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = -1; + sprite->data[4] = -1; + sprite->pos2.y = (graphicsInfo->height >> 1) - 4; + StartSpriteAnim(sprite, 1); + } + return 0; +} + +static void sub_81278D8(struct Sprite *sprite) +{ + u8 mapObjectId; + struct Sprite *linkedSprite; + struct MapObject *mapObject; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_19) + { + FieldEffectStop(sprite, FLDEFF_FEET_IN_FLOWING_WATER); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y; + sprite->subpriority = linkedSprite->subpriority; + sub_806487C(sprite, FALSE); + if (mapObject->coords2.x != sprite->data[3] || mapObject->coords2.y != sprite->data[4]) + { + sprite->data[3] = mapObject->coords2.x; + sprite->data[4] = mapObject->coords2.y; + if (!sprite->invisible) + { + PlaySE(SE_MIZU); + } + } + } +} + +u32 FldEff_Ripple(void) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[5], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = FLDEFF_RIPPLE; + } + return 0; +} + +u32 FldEff_HotSpringsWater(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[31], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data[0] = gFieldEffectArguments[0]; + sprite->data[1] = gFieldEffectArguments[1]; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = gSprites[mapObject->spriteId].pos1.x; + sprite->data[4] = gSprites[mapObject->spriteId].pos1.y; + } + return 0; +} + +void sub_8127A7C(struct Sprite *sprite) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_21) + { + FieldEffectStop(sprite, FLDEFF_HOT_SPRINGS_WATER); + } + else + { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 8; + sprite->subpriority = linkedSprite->subpriority - 1; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_Unknown19(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[17], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = FLDEFF_UNKNOWN_19; + } + return 0; +} + +u32 FldEff_Unknown20(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[18], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = FLDEFF_UNKNOWN_20; + } + return 0; +} + +u32 FldEff_Unknown21(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[19], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = FLDEFF_UNKNOWN_21; + } + return 0; +} + +u32 FldEff_Unknown22(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[20], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = FLDEFF_UNKNOWN_22; + } + return 0; +} + +void ash(s16 x, s16 y, u16 c, s16 d) +{ + gFieldEffectArguments[0] = x; + gFieldEffectArguments[1] = y; + gFieldEffectArguments[2] = 0x52; + gFieldEffectArguments[3] = 1; + gFieldEffectArguments[4] = c; + gFieldEffectArguments[5] = d; + FieldEffectStart(FLDEFF_ASH); +} + +u32 FldEff_Ash(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[6], x, y, gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[1] = gFieldEffectArguments[0]; + sprite->data[2] = gFieldEffectArguments[1]; + sprite->data[3] = gFieldEffectArguments[4]; + sprite->data[4] = gFieldEffectArguments[5]; + } + return 0; +} + +void (*const gUnknown_08401E48[])(struct Sprite *) = { + sub_8127DA0, + sub_8127DD0, + sub_8127E30 +}; + +void sub_8127D84(struct Sprite *sprite) +{ + gUnknown_08401E48[sprite->data[0]](sprite); +} + +static void sub_8127DA0(struct Sprite *sprite) +{ + sprite->invisible = TRUE; + sprite->animPaused = TRUE; + if (--sprite->data[4] == 0) + { + sprite->data[0] = 1; + } +} + +static void sub_8127DD0(struct Sprite *sprite) +{ + sprite->invisible = FALSE; + sprite->animPaused = FALSE; + MapGridSetMetatileIdAt(sprite->data[1], sprite->data[2], sprite->data[3]); + CurrentMapDrawMetatileAt(sprite->data[1], sprite->data[2]); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_2 = TRUE; + sprite->data[0] = 2; +} + +static void sub_8127E30(struct Sprite *sprite) +{ + sub_806487C(sprite, FALSE); + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_ASH); + } +} + +u32 FldEff_SurfBlob(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[7], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); + if (spriteId !=MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.paletteNum = 0; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = -1; + sprite->data[6] = -1; + sprite->data[7] = -1; + } + FieldEffectActiveListRemove(FLDEFF_SURF_BLOB); + return spriteId; +} + +void sub_8127ED0(u8 spriteId, u8 value) +{ + gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (value & 0xF); +} + +void sub_8127EFC(u8 spriteId, u8 value) +{ + gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((value & 0xF) << 4); +} + +void sub_8127F28(u8 spriteId, u8 value, s16 data1) +{ + gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((value & 0xF) << 8); + gSprites[spriteId].data[1] = data1; +} + +static u8 sub_8127F5C(struct Sprite *sprite) +{ + return sprite->data[0] & 0xF; +} + +static u8 sub_8127F64(struct Sprite *sprite) +{ + return (sprite->data[0] & 0xF0) >> 4; +} + +static u8 sub_8127F70(struct Sprite *sprite) +{ + return (sprite->data[0] & 0xF00) >> 8; +} + +void sub_8127F7C(struct Sprite *sprite) +{ + struct MapObject *mapObject; + struct Sprite *linkedSprite; + + mapObject = &gMapObjects[sprite->data[2]]; + linkedSprite = &gSprites[mapObject->spriteId]; + sub_8127FD4(mapObject, sprite); + sub_812800C(mapObject, sprite); + sub_81280A0(mapObject, linkedSprite, sprite); + sprite->oam.priority = linkedSprite->oam.priority; +} + +static void sub_8127FD4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 unk_8041E54[] = {0, 0, 1, 2, 3}; + if (sub_8127F64(sprite) == 0) + { + StartSpriteAnimIfDifferent(sprite, unk_8041E54[mapObject->placeholder18]); + } +} + +#ifdef NONMATCHING +static void sub_812800C(struct MapObject *mapObject, struct Sprite *sprite) +{ + s16 x; + s16 y; + u8 i; + + x = mapObject->coords2.x; + y = mapObject->coords2.y; + if (sprite->pos2.y == 0 && (x != sprite->data[6] || y != sprite->data[7])) + { + sprite->data[5] = sprite->pos2.y; + for (sprite->data[6] = x, sprite->data[7] = y, i = DIR_SOUTH; i <= DIR_EAST; i ++, x = sprite->data[6], y = sprite->data[7]) + { + MoveCoords(i, &x, &y); + if (MapGridGetZCoordAt(x, y) == 3) + { + sprite->data[5] ++; + break; + } + } + } +} +#else +__attribute__((naked)) static void sub_812800C(struct MapObject *mapObject, struct Sprite *sprite) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tsub sp, 0x4\n" + "\tadds r4, r1, 0\n" + "\tldrh r2, [r0, 0x10]\n" + "\tmov r1, sp\n" + "\tstrh r2, [r1]\n" + "\tldrh r1, [r0, 0x12]\n" + "\tmov r0, sp\n" + "\tadds r0, 0x2\n" + "\tstrh r1, [r0]\n" + "\tmovs r2, 0x26\n" + "\tldrsh r3, [r4, r2]\n" + "\tmov r8, r0\n" + "\tcmp r3, 0\n" + "\tbne _08128094\n" + "\tmov r0, sp\n" + "\tmovs r5, 0\n" + "\tldrsh r2, [r0, r5]\n" + "\tmovs r5, 0x3A\n" + "\tldrsh r0, [r4, r5]\n" + "\tcmp r2, r0\n" + "\tbne _08128048\n" + "\tlsls r0, r1, 16\n" + "\tasrs r0, 16\n" + "\tmovs r5, 0x3C\n" + "\tldrsh r1, [r4, r5]\n" + "\tcmp r0, r1\n" + "\tbeq _08128094\n" + "_08128048:\n" + "\tstrh r3, [r4, 0x38]\n" + "\tstrh r2, [r4, 0x3A]\n" + "\tmov r1, r8\n" + "\tmovs r2, 0\n" + "\tldrsh r0, [r1, r2]\n" + "\tstrh r0, [r4, 0x3C]\n" + "\tmovs r5, 0x1\n" + "\tmov r7, r8\n" + "\tmov r6, sp\n" + "_0812805A:\n" + "\tadds r0, r5, 0\n" + "\tmov r1, sp\n" + "\tadds r2, r7, 0\n" + "\tbl MoveCoords\n" + "\tmovs r1, 0\n" + "\tldrsh r0, [r6, r1]\n" + "\tmovs r2, 0\n" + "\tldrsh r1, [r7, r2]\n" + "\tbl MapGridGetZCoordAt\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x3\n" + "\tbne _08128080\n" + "\tldrh r0, [r4, 0x38]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r4, 0x38]\n" + "\tb _08128094\n" + "_08128080:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldrh r0, [r4, 0x3A]\n" + "\tstrh r0, [r6]\n" + "\tldrh r0, [r4, 0x3C]\n" + "\tmov r1, r8\n" + "\tstrh r0, [r1]\n" + "\tcmp r5, 0x4\n" + "\tbls _0812805A\n" + "_08128094:\n" + "\tadd sp, 0x4\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +static void sub_81280A0(struct MapObject *mapObject, struct Sprite *linkedSprite, struct Sprite *sprite) +{ + u16 unk_8401E5A[] = {3, 7}; + u8 v0 = sub_8127F5C(sprite); + if (v0 != 0) + { + if (((u16)(++ sprite->data[4]) & unk_8401E5A[sprite->data[5]]) == 0) + { + sprite->pos2.y += sprite->data[3]; + } + if ((sprite->data[4] & 0x0F) == 0) + { + sprite->data[3] = -sprite->data[3]; + } + if (v0 != 2) + { + if (sub_8127F70(sprite) == 0) + { + linkedSprite->pos2.y = sprite->pos2.y; + } + else + { + linkedSprite->pos2.y = sprite->data[1] + sprite->pos2.y; + } + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y + 8; + } + } +} + +u8 sub_8128124(u8 oldSpriteId) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1); + sprite = &gSprites[spriteId]; + sprite->callback = sub_8128174; + sprite->invisible = TRUE; + sprite->data[0] = oldSpriteId; + sprite->data[1] = 1; + return spriteId; +} + +static void sub_8128174(struct Sprite *sprite) +{ + struct Sprite *oldSprite; + + oldSprite = &gSprites[sprite->data[0]]; + if (((sprite->data[2]++) & 0x03) == 0) + { + oldSprite->pos2.y += sprite->data[1]; + } + if ((sprite->data[2] & 0x0F) == 0) + { + sprite->data[1] = -sprite->data[1]; + } +} + +u32 FldEff_Dust(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[9], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data[0] = gFieldEffectArguments[2]; + sprite->data[1] = 10; + } + return 0; +} + +u32 FldEff_SandPile(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[29], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data[0] = gFieldEffectArguments[0]; + sprite->data[1] = gFieldEffectArguments[1]; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = gSprites[mapObject->spriteId].pos1.x; + sprite->data[4] = gSprites[mapObject->spriteId].pos1.y; + sprite->pos2.y = (graphicsInfo->height >> 1) - 2; + SeekSpriteAnim(sprite, 2); + } + return 0; +} + +void sub_81282E0(struct Sprite *sprite) +{ + u8 mapObjectId; + s16 x; + s16 y; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_20) + { + FieldEffectStop(sprite, FLDEFF_SAND_PILE); + } + else + { + y = gSprites[gMapObjects[mapObjectId].spriteId].pos1.y; + x = gSprites[gMapObjects[mapObjectId].spriteId].pos1.x; + if (x != sprite->data[3] || y != sprite->data[4]) + { + sprite->data[3] = x; + sprite->data[4] = y; + if (sprite->animEnded) + { + StartSpriteAnim(sprite, 0); + } + } + sprite->pos1.x = x; + sprite->pos1.y = y; + sprite->subpriority = gSprites[gMapObjects[mapObjectId].spriteId].subpriority; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_Bubbles(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[34], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + } + return 0; +} + +void sub_8128410(struct Sprite *sprite) +{ + sprite->data[0] += 0x80; + sprite->data[0] &= 0x100; + sprite->pos1.y -= sprite->data[0] >> 8; + sub_806487C(sprite, FALSE); + if (sprite->invisible || sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_BUBBLES); + } +} + +u32 FldEff_BerryTreeGrowthSparkle(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->oam.paletteNum = 5; + sprite->data[0] = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; + } + return 0; +} + +u32 FldEff_TreeDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, 0x18, 0x04); +} + + +u32 FldEff_MountainDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, 0x19, 0x03); +} + + +u32 FldEff_SandDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 0x1C, 0x02); +} + +static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum) +{ + u8 spriteId; + struct Sprite *sprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &spriteId)) + { + FieldEffectActiveListRemove(fldEff); + return MAX_SPRITES; + } + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[templateIdx], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled ++; + sprite->oam.paletteNum = paletteNum; + sprite->data[1] = fldEff; + sprite->data[2] = gFieldEffectArguments[0]; + sprite->data[3] = gFieldEffectArguments[1]; + sprite->data[4] = gFieldEffectArguments[2]; + } + return spriteId; +} + +void sub_81285AC(struct Sprite *sprite) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &mapObjectId)) + { + FieldEffectStop(sprite, sprite->data[1]); + } + // else { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->invisible = linkedSprite->invisible; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16; + sprite->subpriority = linkedSprite->subpriority - 1; + if (sprite->data[0] == 1) + { + sprite->data[0] ++; + StartSpriteAnim(sprite, 1); + } + if (sprite->data[0] == 2 && sprite->animEnded) + { + sprite->data[7] = 1; + } + if (sprite->data[0] == 3) + { + FieldEffectStop(sprite, sprite->data[1]); + } + // } +} + +void sub_812869C(struct MapObject *mapObject) +{ + if (mapObject->mapobj_unk_21 == 1) + { + gSprites[mapObject->mapobj_unk_1A].data[0] ++; + } +} + +bool8 sub_81286C4(struct MapObject *mapObject) +{ + struct Sprite *sprite; + + if (mapObject->mapobj_unk_21 == 2) + { + return TRUE; + } + if (mapObject->mapobj_unk_21 == 0) + { + return TRUE; + } + sprite = &gSprites[mapObject->mapobj_unk_1A]; + if (sprite->data[7]) + { + mapObject->mapobj_unk_21 = 2; + sprite->data[0] ++; + return TRUE; + } + return FALSE; +} + +u32 FldEff_Sparkle(void) +{ + u8 spriteId; + + gFieldEffectArguments[0] += 7; + gFieldEffectArguments[1] += 7; + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[35], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = gFieldEffectArguments[2]; + gSprites[spriteId].coordOffsetEnabled = TRUE; + } + return 0; +} + +void sub_8128774(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (sprite->animEnded) + { + sprite->invisible = TRUE; + sprite->data[0] ++; + } + if (sprite->data[0] == 0) + { + return; + } + } + if (++ sprite->data[1] >= 35) + { + FieldEffectStop(sprite, FLDEFF_SPARKLE); + } +} + +void sub_81287C4(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, sprite->data[1]); + } + else + { + sub_806487C(sprite, FALSE); + SetObjectSubpriorityByZCoord(sprite->data[0], sprite, 0); + } +} + +void sub_8128800(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, sprite->data[0]); + } + else + { + sub_806487C(sprite, FALSE); + } +} + +#ifdef NONMATCHING +static void sub_812882C(struct Sprite *sprite /*r6*/, u8 z, u8 offset) +{ + u8 i; + s16 xlo; + s16 xhi; + s16 lx; + s16 lyhi; + s16 ly; + s16 ylo; + s16 yhi; + struct MapObject *mapObject; // r4 + const struct MapObjectGraphicsInfo *graphicsInfo; // destroyed + struct Sprite *linkedSprite; // r5 + + SetObjectSubpriorityByZCoord(z, sprite, offset); + for (i = 0; i < 16; i ++) + { + mapObject = &gMapObjects[i]; + if (mapObject->active) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + linkedSprite = &gSprites[mapObject->spriteId]; + xhi = sprite->pos1.x + sprite->centerToCornerVecX; + xlo = sprite->pos1.x - sprite->centerToCornerVecX; + lx = linkedSprite->pos1.x; + if (xhi < lx && xlo > lx) + { + lyhi = linkedSprite->pos1.y + linkedSprite->centerToCornerVecY; + ly = linkedSprite->pos1.y; + ylo = sprite->pos1.y - sprite->centerToCornerVecY; + yhi = ylo + linkedSprite->centerToCornerVecY; + if ((lyhi < yhi || lyhi < ylo) && ly > yhi) + { + if (sprite->subpriority <= linkedSprite->subpriority) + { + sprite->subpriority = linkedSprite->subpriority + 2; + break; + } + } + } + } + } +} +#else +__attribute__((naked)) static void sub_812882C(struct Sprite *sprite /*r6*/, u8 z, u8 offset) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tadds r6, r0, 0\n" + "\tadds r0, r1, 0\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tadds r1, r6, 0\n" + "\tbl SetObjectSubpriorityByZCoord\n" + "\tmovs r7, 0\n" + "_08128842:\n" + "\tlsls r0, r7, 3\n" + "\tadds r0, r7\n" + "\tlsls r0, 2\n" + "\tldr r1, _081288DC @ =gMapObjects\n" + "\tadds r4, r0, r1\n" + "\tldrb r0, [r4]\n" + "\tlsls r0, 31\n" + "\tcmp r0, 0\n" + "\tbeq _081288E4\n" + "\tldrb r0, [r4, 0x5]\n" + "\tbl GetFieldObjectGraphicsInfo\n" + "\tldrb r1, [r4, 0x4]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _081288E0 @ =gSprites\n" + "\tadds r5, r0, r1\n" + "\tadds r0, r6, 0\n" + "\tadds r0, 0x28\n" + "\tmovs r2, 0\n" + "\tldrsb r2, [r0, r2]\n" + "\tldrh r0, [r6, 0x20]\n" + "\tadds r1, r0, r2\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tlsls r1, 16\n" + "\tasrs r1, 16\n" + "\tmovs r0, 0x20\n" + "\tldrsh r2, [r5, r0]\n" + "\tcmp r1, r2\n" + "\tbge _081288E4\n" + "\tlsls r0, r4, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, r2\n" + "\tble _081288E4\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x29\n" + "\tmovs r3, 0\n" + "\tldrsb r3, [r0, r3]\n" + "\tldrh r2, [r5, 0x22]\n" + "\tadds r2, r3\n" + "\tldrh r4, [r5, 0x22]\n" + "\tadds r0, r6, 0\n" + "\tadds r0, 0x29\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r0, r1]\n" + "\tldrh r0, [r6, 0x22]\n" + "\tsubs r0, r1\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tadds r3, r0, r3\n" + "\tlsls r2, 16\n" + "\tasrs r2, 16\n" + "\tlsls r3, 16\n" + "\tasrs r3, 16\n" + "\tcmp r2, r3\n" + "\tblt _081288BC\n" + "\tcmp r2, r0\n" + "\tbge _081288E4\n" + "_081288BC:\n" + "\tlsls r0, r4, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, r3\n" + "\tble _081288E4\n" + "\tadds r2, r6, 0\n" + "\tadds r2, 0x43\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x43\n" + "\tldrb r1, [r0]\n" + "\tldrb r0, [r2]\n" + "\tcmp r0, r1\n" + "\tbhi _081288E4\n" + "\tadds r0, r1, 0x2\n" + "\tstrb r0, [r2]\n" + "\tb _081288EE\n" + "\t.align 2, 0\n" + "_081288DC: .4byte gMapObjects\n" + "_081288E0: .4byte gSprites\n" + "_081288E4:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tcmp r7, 0xF\n" + "\tbls _08128842\n" + "_081288EE:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c new file mode 100644 index 000000000..35ea3952a --- /dev/null +++ b/src/field_fadetransition.c @@ -0,0 +1,641 @@ +#include "global.h" +#include "cable_club.h" +#include "fieldmap.h" +#include "field_door.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "field_special_scene.h" +#include "field_weather.h" +#include "fldeff_flash.h" +#include "link.h" +#include "main.h" +#include "map_obj_lock.h" +#include "metatile_behavior.h" +#include "palette.h" +#include "overworld.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "start_menu.h" +#include "task.h" + +void sub_8080B9C(u8); +void task_map_chg_seq_0807E20C(u8); +void task_map_chg_seq_0807E2CC(u8); +void task0A_fade_n_map_maybe(u8); +void sub_808115C(u8); + +void palette_bg_fill_white(void) +{ + CpuFastFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); +} + +void palette_bg_fill_black(void) +{ + CpuFastFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); +} + +void pal_fill_for_map_transition(void) +{ + u8 map_light = get_map_type_from_warp0(); + switch (fade_type_for_given_maplight_pair(map_light, Overworld_GetMapTypeOfSaveblockLocation())) + { + case 0: + FadeScreen(0, 0); + palette_bg_fill_black(); + break; + case 1: + FadeScreen(2, 0); + palette_bg_fill_white(); + } +} + +void pal_fill_black(void) +{ + FadeScreen(0, 0); + palette_bg_fill_black(); +} + +void fade_8080918(void) +{ + u8 light_level = Overworld_GetMapTypeOfSaveblockLocation(); + switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) + { + case 0: + FadeScreen(1, 0); + break; + case 1: + FadeScreen(3, 0); + } +} + +void sub_8080958(u8 arg) +{ + sub_8059B88(!arg); +} + +void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID) +{ + if (sub_8080E70() == TRUE) + { + DestroyTask(taskID); + EnableBothScriptContexts(); + } +} + +void sub_8080990(void) +{ + ScriptContext2_Enable(); + Overworld_PlaySpecialMapMusic(); + pal_fill_black(); + CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); +} + +void sub_80809B0(void) +{ + ScriptContext2_Enable(); + pal_fill_black(); + CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); +} + +void task_mpl_807DD60(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[1] = sub_8083664(); + task->data[0]++; + break; + case 1: + if (gTasks[task->data[1]].isActive != TRUE) + { + pal_fill_for_map_transition(); + task->data[0]++; + } + break; + case 2: + if (sub_8080E70() == TRUE) + { + ScriptContext2_Disable(); + DestroyTask(taskId); + } + } +} + +void sub_8080A3C(void) +{ + ScriptContext2_Enable(); + Overworld_PlaySpecialMapMusic(); + palette_bg_fill_black(); + CreateTask(task_mpl_807DD60, 10); +} + +void sub_8080A5C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + sub_80084A4(); + task->data[0]++; + break; + case 1: + if (IsLinkTaskFinished()) + { + pal_fill_for_map_transition(); + task->data[0]++; + } + break; + case 2: + if (sub_8080E70() == TRUE) + { + sub_8007B14(); + ScriptContext2_Disable(); + DestroyTask(taskId); + } + } +} + +void sub_8080AC4(void) +{ + ScriptContext2_Enable(); + Overworld_PlaySpecialMapMusic(); + palette_bg_fill_black(); + CreateTask(sub_8080A5C, 10); +} + +void sub_8080AE4(void) +{ + s16 x, y; + u8 behavior; + TaskFunc func; + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsDoor(behavior) == TRUE) + func = sub_8080B9C; + else if (MetatileBehavior_IsNonAnimDoor(behavior) == TRUE) + func = task_map_chg_seq_0807E20C; + else + func = task_map_chg_seq_0807E2CC; + CreateTask(func, 10); +} + +void mapldr_default(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_map_transition(); + sub_8080AE4(); + ScriptContext2_Enable(); +} + +void sub_8080B60(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_black(); + sub_8080AE4(); + ScriptContext2_Enable(); +} + +void sub_8080B78(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_map_transition(); + PlaySE(SE_TK_WARPOUT); + CreateTask(task_map_chg_seq_0807E2CC, 10); + ScriptContext2_Enable(); +} + +void sub_8080B9C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s16 *x = &task->data[2]; + s16 *y = &task->data[3]; + + switch (task->data[0]) + { + case 0: + sub_8080958(0); + FreezeMapObjects(); + PlayerGetDestCoords(x, y); + FieldSetDoorOpened(*x, *y); + task->data[0] = 1; + break; + case 1: + if (sub_8080E70()) + { + u8 mapObjId; + sub_8080958(1); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 8); + task->data[0] = 2; + } + break; + case 2: + if (walkrun_is_standing_still()) + { + u8 mapObjId; + task->data[1] = FieldAnimateDoorClose(*x, *y); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]); + task->data[0] = 3; + } + break; + case 3: + if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) + { + UnfreezeMapObjects(); + task->data[0] = 4; + } + break; + case 4: + ScriptContext2_Disable(); + DestroyTask(taskId); + break; + } +} + +void task_map_chg_seq_0807E20C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s16 *x = &task->data[2]; + s16 *y = &task->data[3]; + + switch (task->data[0]) + { + case 0: + sub_8080958(0); + FreezeMapObjects(); + PlayerGetDestCoords(x, y); + task->data[0] = 1; + break; + case 1: + if (sub_8080E70()) + { + u8 mapObjId; + sub_8080958(1); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], GetGoSpeed0AnimId(player_get_direction_lower_nybble())); + task->data[0] = 2; + } + break; + case 2: + if (walkrun_is_standing_still()) + { + UnfreezeMapObjects(); + task->data[0] = 3; + } + break; + case 3: + ScriptContext2_Disable(); + DestroyTask(taskId); + break; + } +} + +void task_map_chg_seq_0807E2CC(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + FreezeMapObjects(); + ScriptContext2_Enable(); + gTasks[taskId].data[0]++; + break; + case 1: + if (sub_8080E70()) + { + UnfreezeMapObjects(); + ScriptContext2_Disable(); + DestroyTask(taskId); + } + break; + } +} + +void sub_8080DC4(u8 taskId) +{ + if (sub_8080E70() == TRUE) + { + DestroyTask(taskId); + CreateTask(sub_80712B4, 80); + } +} + +void atk17_seteffectsecondary(void) +{ + pal_fill_black(); + CreateStartMenuTask(sub_8080DC4); + ScriptContext2_Enable(); +} + +void task_mpl_807E3C8(u8 taskId) +{ + if (sub_8080E70() == 1) + { + ScriptContext2_Disable(); + DestroyTask(taskId); + sub_8064E2C(); + } +} + +void sub_8080E28(void) +{ + ScriptContext2_Enable(); + pal_fill_black(); + CreateTask(task_mpl_807E3C8, 10); +} + +void sub_8080E44(void) +{ + ScriptContext2_Enable(); + Overworld_PlaySpecialMapMusic(); + pal_fill_black(); + CreateTask(task_mpl_807E3C8, 10); +} + +bool32 sub_8080E64(void) +{ + return gPaletteFade.active; +} + +bool32 sub_8080E70(void) +{ + if (IsWeatherNotFadingIn() == TRUE) + return TRUE; + else + return FALSE; +} + +void sub_8080E88(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlayRainSoundEffect(); + PlaySE(SE_KAIDAN); + gFieldCallback = mapldr_default; + CreateTask(task0A_fade_n_map_maybe, 10); +} + +void sp13E_warp_to_last_warp(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlayRainSoundEffect(); + gFieldCallback = mapldr_default; + CreateTask(task0A_fade_n_map_maybe, 10); +} + +void sub_8080EF0(void) +{ + ScriptContext2_Enable(); + gFieldCallback = mapldr_default; + CreateTask(sub_808115C, 10); +} + +void sp13F_fall_to_last_warp(void) +{ + sp13E_warp_to_last_warp(); + gFieldCallback = sub_8086748; +} + +void sub_8080F2C(u8 metatileBehavior) +{ + ScriptContext2_Enable(); + sub_8086A2C(metatileBehavior, 10); +} + +void sub_8080F48(void) +{ + ScriptContext2_Enable(); + sub_80871B8(10); +} + +void sub_8080F58(void) +{ + ScriptContext2_Enable(); + sub_8087654(10); +} + +void sub_8080F68(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlaySE(SE_TK_WARPIN); + CreateTask(task0A_fade_n_map_maybe, 10); + gFieldCallback = sub_8080B78; +} + +void sub_8080F9C(void) +{ + ScriptContext2_Enable(); + fade_8080918(); + CreateTask(task0A_fade_n_map_maybe, 10); + gFieldCallback = sub_80C791C; +} + +void sub_8080FC4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + ScriptContext2_Enable(); + task->data[0]++; + break; + case 1: + if (!sub_8080E64() && sub_8054034()) + { + task->data[0]++; + } + break; + case 2: + warp_in(); + SetMainCallback2(sub_8054588); + DestroyTask(taskId); + break; + } +} + +void DoCableClubWarp(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlaySE(SE_KAIDAN); + CreateTask(sub_8080FC4, 10); +} + +void sub_8081050(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + ClearLinkCallback_2(); + FadeScreen(1, 0); + sub_8053FF8(); + PlaySE(SE_KAIDAN); + data[0]++; + break; + case 1: + if (!sub_8080E64() && sub_8054034()) + { + sub_800832C(); + data[0]++; + } + break; + case 2: + if (!gReceivedRemoteLinkPlayers) + { + warp_in(); + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskId); + } + break; + } +} + +void sub_80810DC(void) +{ + CreateTask(sub_8081050, 10); +} + +#if DEBUG + +__attribute__((naked)) +void debug_sub_80888D8() +{ + asm("\ + PUSH {LR}\n\ + BL debug_sub_8052E04\n\ + BL sub_8080E88\n\ + BL ScriptContext2_Enable\n\ + POP {R0}\n\ + BX R0"); +} + +#endif + +void task0A_fade_n_map_maybe(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + FreezeMapObjects(); + ScriptContext2_Enable(); + task->data[0]++; + break; + case 1: + if (!sub_8080E64() && sub_8054034()) + { + task->data[0]++; + } + break; + case 2: + warp_in(); + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskId); + break; + } +} + +void sub_808115C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s16 *x = &task->data[2]; + s16 *y = &task->data[3]; + + switch (task->data[0]) + { + case 0: + FreezeMapObjects(); + PlayerGetDestCoords(x, y); + PlaySE(GetDoorSoundEffect(*x, *y - 1)); + task->data[1] = FieldAnimateDoorOpen(*x, *y - 1); + task->data[0] = 1; + break; + case 1: + if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) + { + u8 mapObjId; + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[mapObjId]); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 9); + task->data[0] = 2; + } + break; + case 2: + if (walkrun_is_standing_still()) + { + u8 mapObjId; + task->data[1] = FieldAnimateDoorClose(*x, *y - 1); + mapObjId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]); + sub_8080958(0); + task->data[0] = 3; + } + break; + case 3: + if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) + { + task->data[0] = 4; + } + break; + case 4: + sub_8053FF8(); + fade_8080918(); + PlayRainSoundEffect(); + task->data[0] = 0; + task->func = task0A_fade_n_map_maybe; + break; + } +} + +void sub_80812C8(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + FreezeMapObjects(); + ScriptContext2_Enable(); + task->data[0]++; + break; + case 1: + if (!sub_8080E64() && sub_8054034()) + { + task->data[0]++; + } + break; + case 2: + warp_in(); + SetMainCallback2(sub_8054534); + DestroyTask(taskId); + break; + } +} + +void sub_8081334(void) +{ + ScriptContext2_Enable(); + sub_8053FF8(); + fade_8080918(); + PlayRainSoundEffect(); + PlaySE(SE_KAIDAN); + gFieldCallback = sub_8080B60; + CreateTask(sub_80812C8, 10); +} diff --git a/src/field_message_box.c b/src/field_message_box.c new file mode 100644 index 000000000..5eec7a14b --- /dev/null +++ b/src/field_message_box.c @@ -0,0 +1,155 @@ +#include "global.h" +#include "field_message_box.h" +#include "menu.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "text_window.h" + +static EWRAM_DATA struct Window gFieldMessageBoxWindow = {0}; + +static u8 sMessageBoxMode; + +static void Task_FieldMessageBox(u8 taskId); +static void CreateFieldMessageBoxTask(void); +static void DestroyFieldMessageBoxTask(void); +static void PrintFieldMessage(const u8 *message); +static void PrintFieldMessageFromStringVar4(void); + +void InitFieldMessageBox(void) +{ + sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; + TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); + Text_InitWindowWithTemplate(&gFieldMessageBoxWindow, &gWindowTemplate_81E6CE4); +} + +static void Task_FieldMessageBox(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + case 0: + TextWindow_LoadDialogueFrameTiles(&gFieldMessageBoxWindow); + task->data[0]++; + break; + case 1: + TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow); + task->data[0]++; + break; + case 2: + switch (sMessageBoxMode) + { + case FIELD_MESSAGE_BOX_NORMAL: + if (!Text_UpdateWindow(&gFieldMessageBoxWindow)) + return; + break; + case FIELD_MESSAGE_BOX_AUTO_SCROLL: + if (!Text_UpdateWindowAutoscroll(&gFieldMessageBoxWindow)) + return; + break; + } + sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; + DestroyTask(taskId); + } +} + +static void CreateFieldMessageBoxTask(void) +{ + CreateTask(Task_FieldMessageBox, 80); +} + +static void DestroyFieldMessageBoxTask(void) +{ + u8 taskId = FindTaskIdByFunc(Task_FieldMessageBox); + if (taskId != 0xFF) + DestroyTask(taskId); +} + +bool8 ShowFieldMessage(const u8 *message) +{ + if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) + { + return FALSE; + } + else + { + PrintFieldMessage(message); + sMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; + return TRUE; + } +} + +bool8 ShowFieldAutoScrollMessage(const u8 *message) +{ + if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) + { + return FALSE; + } + else + { + sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; + PrintFieldMessage(message); + return TRUE; + } +} + +bool8 unref_sub_8064BB8(const u8 *message) +{ + sMessageBoxMode = FIELD_MESSAGE_BOX_AUTO_SCROLL; + PrintFieldMessage(message); + return TRUE; +} + +bool8 unref_sub_8064BD0(const u8 *message) +{ + if (sMessageBoxMode != FIELD_MESSAGE_BOX_HIDDEN) + { + return FALSE; + } + else + { + sMessageBoxMode = FIELD_MESSAGE_BOX_NORMAL; + PrintFieldMessageFromStringVar4(); + return TRUE; + } +} + +static void PrintFieldMessage(const u8 *message) +{ + StringExpandPlaceholders(gStringVar4, message); + Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); + CreateFieldMessageBoxTask(); +} + +static void PrintFieldMessageFromStringVar4(void) +{ + Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); + CreateFieldMessageBoxTask(); +} + +void HideFieldMessageBox(void) +{ + DestroyFieldMessageBoxTask(); + TextWindow_EraseDialogueFrame(&gFieldMessageBoxWindow); + sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; +} + +u8 GetFieldMessageBoxMode(void) +{ + return sMessageBoxMode; +} + +bool8 IsFieldMessageBoxHidden(void) +{ + if (sMessageBoxMode == FIELD_MESSAGE_BOX_HIDDEN) + return TRUE; + else + return FALSE; +} + +void unref_sub_8064CA0(void) +{ + DestroyFieldMessageBoxTask(); + TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow); + sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; +} diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c new file mode 100644 index 000000000..1552381b2 --- /dev/null +++ b/src/field_player_avatar.c @@ -0,0 +1,1797 @@ +#include "global.h" +#include "field_player_avatar.h" +#include "bike.h" +#include "event_data.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "main.h" +#include "constants/map_objects.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "new_game.h" +#include "party_menu.h" +#include "random.h" +#include "overworld.h" +#include "rotating_gate.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "strings2.h" +#include "task.h" +#include "tv.h" +#include "wild_encounter.h" + +EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {0}; + +//Functions +static bool8 sub_8058854(struct MapObject *, u8); +static void npc_clear_strange_bits(struct MapObject *a); +static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); +static void PlayerAllowForcedMovementIfMovingSameDirection(void); +static bool8 TryDoMetatileBehaviorForcedMovement(void); +static u8 GetForcedMovementByMetatileBehavior(void); +static void MovePlayerNotOnBike(u8 a, u16 b); +static u8 CheckMovementInputNotOnBike(u8 a); +static u8 CheckForPlayerAvatarCollision(u8 a); +static u8 sub_8058EF0(s16 a, s16 b, u8 c); +static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c); +static u8 sub_8058F6C(s16 a, s16 b, u8 c); +static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d); +static void DoPlayerAvatarTransition(void); +static bool8 player_is_anim_in_certain_ranges(void); +static bool8 sub_80592A4(void); +static bool8 PlayerIsAnimActive(void); +static bool8 PlayerCheckIfAnimFinishedOrInactive(void); +static void PlayerNotOnBikeCollide(u8 a); +static void PlayCollisionSoundIfNotFacingWarp(u8 a); +static void sub_8059D60(struct MapObject *a); +static void StartStrengthAnim(u8 a, u8 b); +static void DoPlayerMatJump(void); +static void sub_805A06C(void); +u8 debug_sub_805F2B0(u8); +u8 debug_sub_805F2DC(u8); + +static bool8 (*const gUnknown_0830FB58[])(u8) = +{ + MetatileBehavior_IsTrickHouseSlipperyFloor, + MetatileBehavior_IsIce_2, + MetatileBehavior_IsWalkSouth, + MetatileBehavior_IsWalkNorth, + MetatileBehavior_IsWalkWest, + MetatileBehavior_IsWalkEast, + MetatileBehavior_IsSouthwardCurrent, + MetatileBehavior_IsNorthwardCurrent, + MetatileBehavior_IsWestwardCurrent, + MetatileBehavior_IsEastwardCurrent, + MetatileBehavior_IsSlideSouth, + MetatileBehavior_IsSlideNorth, + MetatileBehavior_IsSlideWest, + MetatileBehavior_IsSlideEast, + MetatileBehavior_IsWaterfall, + MetatileBehavior_0xBB, + MetatileBehavior_0xBC, + MetatileBehavior_IsMuddySlope, +}; +static bool8 (*const gUnknown_0830FBA0[])(void) = +{ + ForcedMovement_None, + ForcedMovement_Slip, + ForcedMovement_Slip, + sub_8058AAC, + sub_8058AC4, + sub_8058ADC, + sub_8058AF4, + sub_8058B0C, + sub_8058B24, + sub_8058B3C, + sub_8058B54, + ForcedMovement_SlideSouth, + ForcedMovement_SlideNorth, + ForcedMovement_SlideWest, + ForcedMovement_SlideEast, + sub_8058B0C, + ForcedMovement_MatJump, + sub_8058C10, + ForcedMovement_MuddySlope, +}; +static void (*const gUnknown_0830FBEC[])(u8, u16) = +{ + PlayerNotOnBikeNotMoving, + PlayerNotOnBikeTurningInPlace, + sub_8058D0C, +}; +static bool8 (*const gUnknown_0830FBF8[])(u8) = +{ + MetatileBehavior_IsBumpySlope, + MetatileBehavior_IsIsolatedVerticalRail, + MetatileBehavior_IsIsolatedHorizontalRail, + MetatileBehavior_IsVerticalRail, + MetatileBehavior_IsHorizontalRail, +}; +static const u8 gUnknown_0830FC0C[] = {9, 10, 11, 12, 13}; +static void (*const gUnknown_0830FC14[])(struct MapObject *) = +{ + PlayerAvatarTransition_Normal, + PlayerAvatarTransition_MachBike, + PlayerAvatarTransition_AcroBike, + PlayerAvatarTransition_Surfing, + PlayerAvatarTransition_Underwater, + sub_80591F4, + nullsub_49, + nullsub_49, +}; +static bool8 (*const gUnknown_0830FC34[])(u8) = +{ + MetatileBehavior_IsSouthArrowWarp, + MetatileBehavior_IsNorthArrowWarp, + MetatileBehavior_IsWestArrowWarp, + MetatileBehavior_IsEastArrowWarp, +}; +static const u8 sRivalAvatarGfxIds[][2] = +{ + {MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, MAP_OBJ_GFX_RIVAL_MAY_NORMAL}, + {MAP_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE}, + {MAP_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE}, + {MAP_OBJ_GFX_RIVAL_BRENDAN_SURFING, MAP_OBJ_GFX_RIVAL_MAY_SURFING}, + {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER}, + {MAP_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE}, + {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING}, + {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING}, +}; +static const u8 sPlayerAvatarGfxIds[][2] = +{ + {MAP_OBJ_GFX_BRENDAN_NORMAL, MAP_OBJ_GFX_MAY_NORMAL}, + {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_MAY_MACH_BIKE}, + {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_MAY_ACRO_BIKE}, + {MAP_OBJ_GFX_BRENDAN_SURFING, MAP_OBJ_GFX_MAY_SURFING}, + {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER}, + {MAP_OBJ_GFX_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_MAY_FIELD_MOVE}, + {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING}, + {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING}, +}; +static const u8 gUnknown_0830FC64[2][5][2] = +{ + //male + { + {MAP_OBJ_GFX_BRENDAN_NORMAL, 1}, + {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, 2}, + {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, 4}, + {MAP_OBJ_GFX_BRENDAN_SURFING, 8}, + {MAP_OBJ_GFX_BRENDAN_UNDERWATER, 16}, + }, + //female + { + {MAP_OBJ_GFX_MAY_NORMAL, 1}, + {MAP_OBJ_GFX_MAY_MACH_BIKE, 2}, + {MAP_OBJ_GFX_MAY_ACRO_BIKE, 4}, + {MAP_OBJ_GFX_MAY_SURFING, 8}, + {MAP_OBJ_GFX_MAY_UNDERWATER, 16}, + } +}; +static bool8 (*const gUnknown_0830FC78[])(u8) = //Duplicate of gUnknown_0830FC34 +{ + MetatileBehavior_IsSouthArrowWarp, + MetatileBehavior_IsNorthArrowWarp, + MetatileBehavior_IsWestArrowWarp, + MetatileBehavior_IsEastArrowWarp, +}; +static u8 (*const gUnknown_0830FC88[])(struct Task *, struct MapObject *, struct MapObject *) = +{ + sub_8059E84, + sub_8059EA4, + sub_8059F40, +}; +static u8 (*const sPlayerAvatarSecretBaseMatJump[])(struct Task *, struct MapObject *) = +{ + PlayerAvatar_DoSecretBaseMatJump, +}; +static u8 (*const gUnknown_0830FC98[])(struct Task *, struct MapObject *) = +{ + sub_805A0D8, + sub_805A100, + sub_805A178, + sub_805A1B8, +}; + +fieldmap_object_null_cb(sub_80587B4, sub_80587D8); + +void player_step(u8 direction, u16 newKeys, u16 heldKeys) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + sub_8059D60(playerMapObj); + if (gPlayerAvatar.preventStep == FALSE) + { + Bike_TryAcroBikeHistoryUpdate(newKeys, heldKeys); + if (!sub_8058854(playerMapObj, direction)) + { + npc_clear_strange_bits(playerMapObj); + DoPlayerAvatarTransition(); + if (TryDoMetatileBehaviorForcedMovement() == 0) + { + MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys); + PlayerAllowForcedMovementIfMovingSameDirection(); + } + } + } +} + +static bool8 sub_8058854(struct MapObject *playerMapObj, u8 direction) +{ + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj) + && !FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) + { + u8 specialAnim = FieldObjectGetSpecialAnim(playerMapObj); + + if (specialAnim > 24 && specialAnim < 29 && direction != DIR_NONE && playerMapObj->placeholder18 != direction) + { + FieldObjectClearAnim(playerMapObj); + return FALSE; + } + else + { + return TRUE; + } + } + return FALSE; +} + +static void npc_clear_strange_bits(struct MapObject *a) +{ + a->mapobj_bit_12 = 0; + a->mapobj_bit_10 = 0; + a->mapobj_bit_9 = 0; + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_DASH; +} + +static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys) +{ + if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + || (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)) + MovePlayerOnBike(direction, newKeys, heldKeys); + else + MovePlayerNotOnBike(direction, heldKeys); +} + +static void PlayerAllowForcedMovementIfMovingSameDirection(void) +{ + if (gPlayerAvatar.runningState == MOVING) + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; +} + +static bool8 TryDoMetatileBehaviorForcedMovement(void) +{ +#if DEBUG + if (gUnknown_020297ED != 0 && (gMain.heldKeys & 0x100)) + return 0; +#endif + return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); +} + +static u8 GetForcedMovementByMetatileBehavior(void) +{ + u8 i; + + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_5)) + { + u8 r5 = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E; + + for (i = 0; i < 18; i++) + { + if (gUnknown_0830FB58[i](r5)) + return i + 1; + } + } + return 0; +} + +bool8 ForcedMovement_None(void) +{ + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_6) + { + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_9 = 0; + playerMapObj->mapobj_bit_11 = 1; + FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_6; + } + return FALSE; +} + +static u8 DoForcedMovement(u8 direction, void (*b)(u8)) +{ + struct PlayerAvatar *playerAvatar = &gPlayerAvatar; + u8 collisionType = CheckForPlayerAvatarCollision(direction); + + playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; + if (collisionType != 0) + { + ForcedMovement_None(); + if (collisionType <= 4) + { + return 0; + } + else + { + if (collisionType == COLLISION_LEDGE_JUMP) + PlayerJumpLedge(direction); + playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; + playerAvatar->runningState = MOVING; + return 1; + } + } + else + { + playerAvatar->runningState = MOVING; + b(direction); + return 1; + } +} + +static u8 DoForcedMovementInCurrentDirection(void (*a)(u8)) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_10 = 1; + return DoForcedMovement(playerMapObj->placeholder18, a); +} + +bool8 ForcedMovement_Slip(void) +{ + return DoForcedMovementInCurrentDirection(PlayerGoSpeed2); +} + +bool8 sub_8058AAC(void) +{ + return DoForcedMovement(1, PlayerGoSpeed1); +} + +bool8 sub_8058AC4(void) +{ + return DoForcedMovement(2, PlayerGoSpeed1); +} + +bool8 sub_8058ADC(void) +{ + return DoForcedMovement(3, PlayerGoSpeed1); +} + +bool8 sub_8058AF4(void) +{ + return DoForcedMovement(4, PlayerGoSpeed1); +} + +bool8 sub_8058B0C(void) +{ + return DoForcedMovement(1, npc_use_some_d2s); +} + +bool8 sub_8058B24(void) +{ + return DoForcedMovement(2, npc_use_some_d2s); +} + +bool8 sub_8058B3C(void) +{ + return DoForcedMovement(3, npc_use_some_d2s); +} + +bool8 sub_8058B54(void) +{ + return DoForcedMovement(4, npc_use_some_d2s); +} + +static u8 ForcedMovement_Slide(u8 direction, void (*b)(u8)) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_10 = 1; + playerMapObj->mapobj_bit_9 = 1; + return DoForcedMovement(direction, b); +} + +bool8 ForcedMovement_SlideSouth(void) +{ + return ForcedMovement_Slide(1, PlayerGoSpeed2); +} + +bool8 ForcedMovement_SlideNorth(void) +{ + return ForcedMovement_Slide(2, PlayerGoSpeed2); +} + +bool8 ForcedMovement_SlideWest(void) +{ + return ForcedMovement_Slide(3, PlayerGoSpeed2); +} + +bool8 ForcedMovement_SlideEast(void) +{ + return ForcedMovement_Slide(4, PlayerGoSpeed2); +} + +bool8 ForcedMovement_MatJump(void) +{ + DoPlayerMatJump(); + return TRUE; +} + +bool8 sub_8058C10(void) +{ + sub_805A06C(); + return TRUE; +} + +bool8 ForcedMovement_MuddySlope(void) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (playerMapObj->placeholder18 != 2 || GetPlayerSpeed() <= 3) + { + Bike_UpdateBikeCounterSpeed(0); + playerMapObj->mapobj_bit_9 = 1; + return DoForcedMovement(1, PlayerGoSpeed2); + } + else + { + return FALSE; + } +} + +static void MovePlayerNotOnBike(u8 direction, u16 heldKeys) +{ +#if DEBUG + if (gUnknown_020297ED != 0 && debug_sub_805F2B0(direction) != 0) + return; +#endif + gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys); +} + +static u8 CheckMovementInputNotOnBike(u8 direction) +{ + if (direction == DIR_NONE) + { + gPlayerAvatar.runningState = NOT_MOVING; + return 0; + } + else if (direction != player_get_direction_upper_nybble() && gPlayerAvatar.runningState != MOVING) + { + gPlayerAvatar.runningState = TURN_DIRECTION; + return 1; + } + else + { + gPlayerAvatar.runningState = MOVING; + return 2; + } +} + +void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys) +{ + PlayerFaceDirection(player_get_direction_lower_nybble()); +} + +void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys) +{ + PlayerTurnInPlace(direction); +} + +void sub_8058D0C(u8 direction, u16 heldKeys) +{ + u8 r1 = CheckForPlayerAvatarCollision(direction); + + switch (r1) + { + case 6: + PlayerJumpLedge(direction); + return; + default: + if (r1 > 8 || r1 < 5) + PlayerNotOnBikeCollide(direction); + return; + case 0: + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + { + // speed 2 is fast, same speed as running + PlayerGoSpeed2(direction); + return; + } + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(FLAG_SYS_B_DASH) + && IsRunningDisallowed(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0) + { + sub_805940C(direction); + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; + } + else + { + PlayerGoSpeed1(direction); + } + } +} + +static u8 CheckForPlayerAvatarCollision(u8 direction) +{ + s16 x, y; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + x = playerMapObj->coords2.x; + y = playerMapObj->coords2.y; + MoveCoords(direction, &x, &y); + return CheckForFieldObjectCollision(playerMapObj, x, y, direction, MapGridGetMetatileBehaviorAt(x, y)); +} + +u8 CheckForFieldObjectCollision(struct MapObject *a, s16 x, s16 y, u8 direction, u8 e) +{ + u8 collision; + + collision = npc_block_way(a, x, y, direction); + if (collision == 3 && sub_8058EF0(x, y, direction)) + return 5; + if (ShouldJumpLedge(x, y, direction)) + { + IncrementGameStat(GAME_STAT_JUMPED_DOWN_LEDGES); + return COLLISION_LEDGE_JUMP; + } + if (collision == 4 && sub_8058F6C(x, y, direction)) + return 7; + + if (collision == 0) + { + if (CheckForRotatingGatePuzzleCollision(direction, x, y)) + return 8; + check_acro_bike_metatile(x, y, e, &collision); + } + return collision; +} + +static u8 sub_8058EF0(s16 a, s16 b, u8 c) +{ + if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + && MapGridGetZCoordAt(a, b) == 3 + && GetFieldObjectIdByXYZ(a, b, 3) == 16) + { + sub_805A20C(c); + return 1; + } + else + { + return 0; + } +} + +static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c) +{ + if (GetLedgeJumpDirection(a, b, c) != 0) + return 1; + else + return 0; +} + +static u8 sub_8058F6C(s16 a, s16 b, u8 c) +{ + if (FlagGet(FLAG_SYS_USE_STRENGTH)) + { + u8 mapObjectId = GetFieldObjectIdByXY(a, b); + + if (mapObjectId != 16) + { + if (gMapObjects[mapObjectId].graphicsId == 0x57) + { + a = gMapObjects[mapObjectId].coords2.x; + b = gMapObjects[mapObjectId].coords2.y; + MoveCoords(c, &a, &b); + if (npc_block_way(&gMapObjects[mapObjectId], a, b, c) == 0 + && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(a, b)) == 0) + { + StartStrengthAnim(mapObjectId, c); + return 1; + } + } + } + } + return 0; +} + +static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (gUnknown_0830FBF8[i](c)) + { + *d = gUnknown_0830FC0C[i]; + return; + } + } +} + +void SetPlayerAvatarTransitionFlags(u16 a) +{ + gPlayerAvatar.unk1 |= a; + DoPlayerAvatarTransition(); +} + +static void DoPlayerAvatarTransition(void) +{ + u8 i; + u32 flags = gPlayerAvatar.unk1; + + if (flags != 0) + { + for (i = 0; i < 8; i++, flags >>= 1) + { +#ifdef NONMATCHING + if (flags & 1) + { + gUnknown_0830FC14[i](&gMapObjects[gPlayerAvatar.mapObjectId]); + } +#else + if (flags & 1) + { + register void (*const *funcs)(struct MapObject *) asm("r0") = gUnknown_0830FC14; + funcs[i](&gMapObjects[gPlayerAvatar.mapObjectId]); + } +#endif + } + gPlayerAvatar.unk1 = 0; + } +} + +void nullsub_49(struct MapObject *a) +{ +} + +void PlayerAvatarTransition_Normal(struct MapObject *a) +{ + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(0)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(1); +} + +void PlayerAvatarTransition_MachBike(struct MapObject *a) +{ + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(1)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(2); + BikeClearState(0, 0); +} + +void PlayerAvatarTransition_AcroBike(struct MapObject *a) +{ + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(2)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(4); + BikeClearState(0, 0); + Bike_HandleBumpySlopeJump(); +} + +void PlayerAvatarTransition_Surfing(struct MapObject *a) +{ + u8 unk; + + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(3)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(8); + gFieldEffectArguments[0] = a->coords2.x; + gFieldEffectArguments[1] = a->coords2.y; + gFieldEffectArguments[2] = gPlayerAvatar.mapObjectId; + unk = FieldEffectStart(FLDEFF_SURF_BLOB); + a->mapobj_unk_1A = unk; + sub_8127ED0(unk, 1); +} + +void PlayerAvatarTransition_Underwater(struct MapObject *a) +{ + sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(4)); + FieldObjectTurn(a, a->placeholder18); + SetPlayerAvatarStateMask(16); + a->mapobj_unk_1A = sub_8128124(a->spriteId); +} + +void sub_80591F4(struct MapObject *a) +{ + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_5; +} + +void sub_8059204(void) +{ + gPlayerAvatar.tileTransitionState = T_NOT_MOVING; + if (PlayerIsAnimActive()) + { + if (!PlayerCheckIfAnimFinishedOrInactive()) + { + if (!player_is_anim_in_certain_ranges()) + gPlayerAvatar.tileTransitionState = T_TILE_TRANSITION; + } + else + { + if (!sub_80592A4()) + gPlayerAvatar.tileTransitionState = T_TILE_CENTER; + } + } +} + +static bool8 player_is_anim_in_certain_ranges(void) +{ + u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C; + + if (unk < 4 + || (unk >= 16 && unk < 0x15) + || (unk >= 25 && unk < 41) + || (unk >= 98 && unk < 110) + || (unk >= 122 && unk < 126)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80592A4(void) +{ + if (player_is_anim_in_certain_ranges() && gPlayerAvatar.runningState != TURN_DIRECTION) + return TRUE; + else + return FALSE; +} + +static bool8 PlayerIsAnimActive(void) +{ + return FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[gPlayerAvatar.mapObjectId]); +} + +static bool8 PlayerCheckIfAnimFinishedOrInactive(void) +{ + return FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]); +} + +static void player_set_x22(u8 a) +{ + gMapObjects[gPlayerAvatar.mapObjectId].animId = a; +} + +u8 player_get_x22(void) +{ + return gMapObjects[gPlayerAvatar.mapObjectId].animId; +} + +static void sub_8059348(u8 a) +{ + FieldObjectForceSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], a); +} + +void PlayerSetAnimId(u8 animId, u8 b) +{ + if (!PlayerIsAnimActive()) + { + player_set_x22(b); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], animId); + } +} + +// normal speed (1 speed) +void PlayerGoSpeed1(u8 a) +{ + PlayerSetAnimId(GetGoSpeed0AnimId(a), 2); +} + +// fast speed (2 speed) +void PlayerGoSpeed2(u8 a) +{ + PlayerSetAnimId(sub_8060744(a), 2); +} + +void npc_use_some_d2s(u8 a) +{ + PlayerSetAnimId(d2s_08064034(a), 2); +} + +// fastest speed (4 speed) +void PlayerGoSpeed4(u8 a) +{ + PlayerSetAnimId(sub_806079C(a), 2); +} + +void sub_805940C(u8 a) +{ + PlayerSetAnimId(sub_80607F4(a), 2); +} + +void PlayerOnBikeCollide(u8 a) +{ + PlayCollisionSoundIfNotFacingWarp(a); + PlayerSetAnimId(GetStepInPlaceDelay16AnimId(a), 2); +} + +static void PlayerNotOnBikeCollide(u8 a) +{ + PlayCollisionSoundIfNotFacingWarp(a); + PlayerSetAnimId(GetStepInPlaceDelay32AnimId(a), 2); +} + +void PlayerFaceDirection(u8 direction) +{ + PlayerSetAnimId(GetFaceDirectionAnimId(direction), 1); +} + +void PlayerTurnInPlace(u8 direction) +{ + PlayerSetAnimId(GetStepInPlaceDelay8AnimId(direction), 1); +} + +void PlayerJumpLedge(u8 direction) +{ + PlaySE(SE_DANSA); + PlayerSetAnimId(GetJumpLedgeAnimId(direction), 8); +} + +void sub_80594C0(void) +{ + if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING) + { + if (player_should_look_direction_be_enforced_upon_movement()) + sub_8059348(GetFaceDirectionAnimId(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18)); + } +} + +// wheelie idle +void PlayerIdleWheelie(u8 a) +{ + PlayerSetAnimId(sub_80609D8(a), 1); +} + +// normal to wheelie +void PlayerStartWheelie(u8 a) +{ + PlayerSetAnimId(sub_8060A04(a), 1); +} + +// wheelie to normal +void PlayerEndWheelie(u8 a) +{ + PlayerSetAnimId(sub_8060A30(a), 1); +} + +// wheelie hopping standing +void PlayerStandingHoppingWheelie(u8 a) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(sub_8060A5C(a), 1); +} + +// wheelie hopping moving +void PlayerMovingHoppingWheelie(u8 a) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(sub_8060A88(a), 2); +} + +// wheelie hopping ledge +void PlayerLedgeHoppingWheelie(u8 a) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(sub_8060AB4(a), 8); +} + +// acro turn jump +void PlayerAcroTurnJump(u8 direction) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(sub_8060878(direction), 1); +} + +void sub_80595DC(u8 direction) +{ + PlaySE(SE_WALL_HIT); + PlayerSetAnimId(sub_8060AE0(direction), 2); +} + +void sub_8059600(u8 a) +{ + PlayerSetAnimId(sub_8060B0C(a), 2); +} + +void sub_8059618(u8 a) +{ + PlayerSetAnimId(sub_8060B38(a), 2); +} + +void sub_8059630(u8 a) +{ + PlayerSetAnimId(sub_8060B64(a), 2); +} + +static void PlayCollisionSoundIfNotFacingWarp(u8 a) +{ + s16 x, y; + u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E; + + if (!gUnknown_0830FC34[a - 1](unk)) + { + if (a == 2) + { + PlayerGetDestCoords(&x, &y); + MoveCoords(2, &x, &y); + if (MetatileBehavior_IsWarpDoor(MapGridGetMetatileBehaviorAt(x, y))) + return; + } + PlaySE(SE_WALL_HIT); + } +} + +void GetXYCoordsOneStepInFrontOfPlayer(s16 *x, s16 *y) +{ + *x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; + *y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; + MoveCoords(player_get_direction_lower_nybble(), x, y); +} + +void PlayerGetDestCoords(s16 *x, s16 *y) +{ + *x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; + *y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; +} + +u8 player_get_direction_lower_nybble(void) +{ + return gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18; +} + +u8 player_get_direction_upper_nybble(void) +{ + return gMapObjects[gPlayerAvatar.mapObjectId].placeholder18; +} + +u8 PlayerGetZCoord(void) +{ + return gMapObjects[gPlayerAvatar.mapObjectId].elevation; +} + +void unref_sub_8059790(s16 a, s16 b) +{ + sub_805C058(&gMapObjects[gPlayerAvatar.mapObjectId], a, b); +} + +u8 TestPlayerAvatarFlags(u8 a) +{ + return gPlayerAvatar.flags & a; +} + +u8 sub_80597D0(void) +{ + return gPlayerAvatar.flags; +} + +u8 GetPlayerAvatarObjectId(void) +{ + return gPlayerAvatar.spriteId; +} + +void sub_80597E8(void) +{ + ForcedMovement_None(); +} + +void sub_80597F4(void) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + npc_clear_strange_bits(playerMapObj); + FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + Bike_HandleBumpySlopeJump(); + Bike_UpdateBikeCounterSpeed(0); + } +} + +u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +{ + return sRivalAvatarGfxIds[state][gender]; +} + +static u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +{ + return sPlayerAvatarGfxIds[state][gender]; +} + +u8 GetPlayerAvatarGraphicsIdByStateId(u8 state) +{ + return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); +} + +u8 unref_GetRivalAvatarGenderByGraphcsId(u8 gfxId) +{ + switch (gfxId) + { + case MAP_OBJ_GFX_RIVAL_MAY_NORMAL: + case MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE: + case MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE: + case MAP_OBJ_GFX_RIVAL_MAY_SURFING: + case MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE: + case MAP_OBJ_GFX_MAY_UNDERWATER: + case MAP_OBJ_GFX_MAY_FISHING: + case MAP_OBJ_GFX_MAY_WATERING: + return FEMALE; + default: + return MALE; + } +} + +u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) +{ + switch (gfxId) + { + case MAP_OBJ_GFX_MAY_NORMAL: + case MAP_OBJ_GFX_MAY_MACH_BIKE: + case MAP_OBJ_GFX_MAY_ACRO_BIKE: + case MAP_OBJ_GFX_MAY_SURFING: + case MAP_OBJ_GFX_MAY_FIELD_MOVE: + case MAP_OBJ_GFX_MAY_UNDERWATER: + case MAP_OBJ_GFX_MAY_FISHING: + case MAP_OBJ_GFX_MAY_WATERING: + return FEMALE; + default: + return MALE; + } +} + +bool8 PartyHasMonWithSurf(void) +{ + u8 i; + + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + { + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0) + break; + if (pokemon_has_move(&gPlayerParty[i], 0x39)) + return TRUE; + } + } + return FALSE; +} + +bool8 IsPlayerSurfingNorth(void) +{ + if (player_get_direction_upper_nybble() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + return TRUE; + else + return FALSE; +} + +bool8 IsPlayerFacingSurfableFishableWater(void) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + s16 x = playerMapObj->coords2.x; + s16 y = playerMapObj->coords2.y; + + MoveCoords(playerMapObj->mapobj_unk_18, &x, &y); + if (npc_block_way(playerMapObj, x, y, playerMapObj->mapobj_unk_18) == 3 && PlayerGetZCoord() == 3 + && MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(x, y))) + return TRUE; + else + return FALSE; +} + +void ClearPlayerAvatarInfo(void) +{ + memset(&gPlayerAvatar, 0, sizeof(struct PlayerAvatar)); +} + +void SetPlayerAvatarStateMask(u8 a) +{ + gPlayerAvatar.flags &= 0xE0; + gPlayerAvatar.flags |= a; +} + +static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 a, u8 gender) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (gUnknown_0830FC64[gender][i][0] == a) + return gUnknown_0830FC64[gender][i][1]; + } + return 1; +} + +u8 GetPlayerAvatarGraphicsIdByCurrentState(void) +{ + u8 i; + u8 r5 = gPlayerAvatar.flags; + + for (i = 0; i < 5; i++) + { + if (gUnknown_0830FC64[gPlayerAvatar.gender][i][1] & r5) + return gUnknown_0830FC64[gPlayerAvatar.gender][i][0]; + } + return 0; +} + +void SetPlayerAvatarExtraStateTransition(u8 a, u8 b) +{ + u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(a, gPlayerAvatar.gender); + + gPlayerAvatar.unk1 |= unk | b; + DoPlayerAvatarTransition(); +} + +void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) +{ + struct MapObjectTemplate playerMapObjTemplate; + u8 mapObjectId; + struct MapObject *mapObject; + + playerMapObjTemplate.localId = 0xFF; + playerMapObjTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(0, gender); + playerMapObjTemplate.x = x - 7; + playerMapObjTemplate.y = y - 7; + playerMapObjTemplate.elevation = 0; + playerMapObjTemplate.movementType = 11; + playerMapObjTemplate.unkA_0 = 0; + playerMapObjTemplate.unkA_4 = 0; + playerMapObjTemplate.unkC = 0; + playerMapObjTemplate.unkE = 0; + playerMapObjTemplate.script = NULL; + playerMapObjTemplate.flagId = 0; + mapObjectId = SpawnSpecialFieldObject(&playerMapObjTemplate); + mapObject = &gMapObjects[mapObjectId]; + mapObject->mapobj_bit_16 = 1; + mapObject->mapobj_unk_1B = sub_8126B54(); + FieldObjectTurn(mapObject, direction); + ClearPlayerAvatarInfo(); + gPlayerAvatar.runningState = NOT_MOVING; + gPlayerAvatar.tileTransitionState = T_NOT_MOVING; + gPlayerAvatar.mapObjectId = mapObjectId; + gPlayerAvatar.spriteId = mapObject->spriteId; + gPlayerAvatar.gender = gender; + SetPlayerAvatarStateMask(0x21); +} + +void sub_8059B88(u8 a) +{ + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = a; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + gSprites[gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A].invisible = a; +} + +void sub_8059BF4(void) +{ + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(5)); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 0); +} + +void sub_8059C3C(u8 a) +{ + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(6)); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDE8(a)); +} + +void sub_8059C94(u8 a) +{ + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(2)); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FD98(a)); + SeekSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 1); +} + +void sub_8059D08(u8 a) +{ + sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByStateId(7)); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], FieldObjectDirectionToImageAnimId(a)); +} + +static void sub_8059D60(struct MapObject *a) +{ + s16 x; + s16 y; + u8 r6; + u8 r8 = a->mapobj_unk_1E; + + for (x = 0, r6 = 1; x < 4; x++, r6++) + { + if (gUnknown_0830FC78[x](r8) && r6 == a->placeholder18) + { + x = a->coords2.x; + y = a->coords2.y; + MoveCoords(r6, &x, &y); + sub_8126BC4(a->mapobj_unk_1B, r6, x, y); + return; + } + } + objid_set_invisible(a->mapobj_unk_1B); +} + +/* Strength */ + +static void sub_8059E2C(u8 taskId); + +static void StartStrengthAnim(u8 a, u8 b) +{ + u8 taskId = CreateTask(sub_8059E2C, 0xFF); + + gTasks[taskId].data[1] = a; + gTasks[taskId].data[2] = b; + sub_8059E2C(taskId); +} + +static void sub_8059E2C(u8 taskId) +{ + while (gUnknown_0830FC88[gTasks[taskId].data[0]](&gTasks[taskId], + &gMapObjects[gPlayerAvatar.mapObjectId], + &gMapObjects[gTasks[taskId].data[1]])) + ; +} + +u8 sub_8059E84(struct Task *task, struct MapObject *b, struct MapObject *c) +{ + ScriptContext2_Enable(); + gPlayerAvatar.preventStep = TRUE; + task->data[0]++; + return 0; +} + +u8 sub_8059EA4(struct Task *task, struct MapObject *b, struct MapObject *c) +{ + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(b) + && !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(c)) + { + FieldObjectClearAnimIfSpecialAnimFinished(b); + FieldObjectClearAnimIfSpecialAnimFinished(c); + FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId((u8)task->data[2])); + FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId((u8)task->data[2])); + gFieldEffectArguments[0] = c->coords2.x; + gFieldEffectArguments[1] = c->coords2.y; + gFieldEffectArguments[2] = c->elevation; + gFieldEffectArguments[3] = gSprites[c->spriteId].oam.priority; + FieldEffectStart(FLDEFF_DUST); + PlaySE(SE_W070); + task->data[0]++; + } + return 0; +} + +u8 sub_8059F40(struct Task *task, struct MapObject *b, struct MapObject *c) +{ + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(b) + && FieldObjectCheckIfSpecialAnimFinishedOrInactive(c)) + { + FieldObjectClearAnimIfSpecialAnimFinished(b); + FieldObjectClearAnimIfSpecialAnimFinished(c); + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + DestroyTask(FindTaskIdByFunc(sub_8059E2C)); + } + return 0; +} + +/* Some field effect */ + +static void DoPlayerAvatarSecretBaseMatJump(u8 taskId); + +static void DoPlayerMatJump(void) +{ + DoPlayerAvatarSecretBaseMatJump(CreateTask(DoPlayerAvatarSecretBaseMatJump, 0xFF)); +} + +static void DoPlayerAvatarSecretBaseMatJump(u8 taskId) +{ + while (sPlayerAvatarSecretBaseMatJump[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) + ; +} + +// because data[0] is used to call this, it can be inferred that there may have been multiple mat jump functions at one point, so the name for these groups of functions is appropriate in assuming the sole use of mat jump. +u8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct MapObject *mapObject) +{ + gPlayerAvatar.preventStep = TRUE; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + PlaySE(SE_DANSA); + FieldObjectSetSpecialAnim(mapObject, sub_806084C(mapObject->mapobj_unk_18)); + task->data[1]++; + if (task->data[1] > 1) + { + gPlayerAvatar.preventStep = FALSE; + gPlayerAvatar.unk1 |= 0x20; + DestroyTask(FindTaskIdByFunc(DoPlayerAvatarSecretBaseMatJump)); + } + } + return 0; +} + +/* Some field effect */ + +static void sub_805A08C(u8 taskId); + +static void sub_805A06C(void) +{ + u8 taskId = CreateTask(sub_805A08C, 0xFF); + + sub_805A08C(taskId); +} + +static void sub_805A08C(u8 taskId) +{ + while (gUnknown_0830FC98[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) + ; +} + +u8 sub_805A0D8(struct Task *task, struct MapObject *mapObject) +{ + task->data[0]++; + task->data[1] = mapObject->placeholder18; + gPlayerAvatar.preventStep = TRUE; + ScriptContext2_Enable(); + PlaySE(SE_TK_WARPIN); + return 1; +} + +u8 sub_805A100(struct Task *task, struct MapObject *mapObject) +{ + u8 directions[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; + + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + u8 direction; + + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(direction = directions[mapObject->placeholder18 - 1])); + if (direction == (u8)task->data[1]) + task->data[2]++; + task->data[0]++; + if (task->data[2] > 3 && direction == GetOppositeDirection(task->data[1])) + task->data[0]++; + } + return 0; +} + +u8 sub_805A178(struct Task *task, struct MapObject *mapObject) +{ + const u8 arr[] = {16, 16, 17, 18, 19}; + + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, arr[task->data[2]]); + task->data[0] = 1; + } + return 0; +} + +u8 sub_805A1B8(struct Task *task, struct MapObject *mapObject) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(GetOppositeDirection(task->data[1]))); + ScriptContext2_Disable(); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(FindTaskIdByFunc(sub_805A08C)); + } + return 0; +} + +/* Some Field effect */ + +static void taskFF_0805D1D4(u8 taskId); +static void sub_805A2D0(u8 taskId); + +void sub_805A20C(u8 a) +{ + u8 taskId; + + ScriptContext2_Enable(); + Overworld_ClearSavedMusic(); + Overworld_ChangeMusicToDefault(); + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; + gPlayerAvatar.preventStep = TRUE; + taskId = CreateTask(taskFF_0805D1D4, 0xFF); + gTasks[taskId].data[0] = a; + taskFF_0805D1D4(taskId); +} + +static void taskFF_0805D1D4(u8 taskId) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj)) + { + if (!FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) + return; + } + sub_8127ED0(playerMapObj->mapobj_unk_1A, 2); + FieldObjectSetSpecialAnim(playerMapObj, sub_80608D0((u8)gTasks[taskId].data[0])); + gTasks[taskId].func = sub_805A2D0; +} + +static void sub_805A2D0(u8 taskId) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj)) + { + sub_805B980(playerMapObj, GetPlayerAvatarGraphicsIdByStateId(0)); + FieldObjectSetSpecialAnim(playerMapObj, GetFaceDirectionAnimId(playerMapObj->mapobj_unk_18)); + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + DestroySprite(&gSprites[playerMapObj->mapobj_unk_1A]); + DestroyTask(taskId); + } +} + +/* Fishing */ + +static u8 (*const sFishingStateFuncs[])(struct Task *) = +{ + Fishing1, + Fishing2, + Fishing3, + Fishing4, + Fishing5, + Fishing6, + Fishing7, + Fishing8, + Fishing9, + Fishing10, + Fishing11, + Fishing12, + Fishing13, + Fishing14, + Fishing15, + Fishing16, +}; + +static void Task_Fishing(u8 taskId); +static void sub_805A954(void); + +#define tStep data[0] +#define tFrameCounter data[1] +#define tNumDots data[2] +#define tDotsRequired data[3] +#define tRoundsPlayed data[12] +#define tMinRoundsRequired data[13] +#define tPlayerGfxId data[14] +#define tFishingRod data[15] + +#define FISHING_START_ROUND 3 +#define FISHING_GOT_BITE 6 +#define FISHING_ON_HOOK 9 +#define FISHING_NO_BITE 11 +#define FISHING_GOT_AWAY 12 +#define FISHING_SHOW_RESULT 13 + +void StartFishing(u8 rod) +{ + u8 taskId = CreateTask(Task_Fishing, 0xFF); + + gTasks[taskId].tFishingRod = rod; + Task_Fishing(taskId); +} + +static void Task_Fishing(u8 taskId) +{ + while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId])) + ; +} + +u8 Fishing1(struct Task *task) +{ + ScriptContext2_Enable(); + gPlayerAvatar.preventStep = TRUE; + task->tStep++; + return 0; +} + +u8 Fishing2(struct Task *task) +{ + struct MapObject *playerMapObj; + const s16 arr1[] = {1, 1, 1}; + const s16 arr2[] = {1, 3, 6}; + + task->tRoundsPlayed = 0; + task->tMinRoundsRequired = arr1[task->tFishingRod] + (Random() % arr2[task->tFishingRod]); + task->tPlayerGfxId = gMapObjects[gPlayerAvatar.mapObjectId].graphicsId; + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectClearAnimIfSpecialAnimActive(playerMapObj); + playerMapObj->mapobj_bit_11 = 1; + sub_8059C3C(playerMapObj->mapobj_unk_18); + task->tStep++; + return 0; +} + +u8 Fishing3(struct Task *task) +{ + sub_805A954(); + + // Wait one second before starting dot game + task->tFrameCounter++; + if (task->tFrameCounter >= 60) + task->tStep++; + return 0; +} + +u8 Fishing4(struct Task *task) +{ + u32 randVal; + + Menu_DisplayDialogueFrame(); + task->tStep++; + task->tFrameCounter = 0; + task->tNumDots = 0; + randVal = Random(); + randVal %= 10; + task->tDotsRequired = randVal + 1; + if (task->tRoundsPlayed == 0) + task->tDotsRequired = randVal + 4; + if (task->tDotsRequired >= 10) + task->tDotsRequired = 10; + return 1; +} + +// Play a round of the dot game +u8 Fishing5(struct Task *task) +{ + const u8 dot[] = _("·"); + + sub_805A954(); + task->tFrameCounter++; + if (gMain.newKeys & A_BUTTON) + { + task->tStep = FISHING_NO_BITE; + if (task->tRoundsPlayed != 0) + task->tStep = FISHING_GOT_AWAY; + return 1; + } + else + { + if (task->tFrameCounter >= 20) + { + task->tFrameCounter = 0; + if (task->tNumDots >= task->tDotsRequired) + { + task->tStep++; + if (task->tRoundsPlayed != 0) + task->tStep++; + task->tRoundsPlayed++; + } + else + { + Menu_PrintText(dot, task->tNumDots + 4, 15); + task->tNumDots++; + } + } + return 0; + } +} + +// Determine if fish bites +u8 Fishing6(struct Task *task) +{ + sub_805A954(); + task->tStep++; + if (!DoesCurrentMapHaveFishingMons() || (Random() & 1)) + task->tStep = FISHING_NO_BITE; + else + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FE08(player_get_direction_lower_nybble())); + return 1; +} + +// Oh! A Bite! +u8 Fishing7(struct Task *task) +{ + sub_805A954(); + Menu_PrintText(gOtherText_OhABite, 4, 17); + task->tStep++; + task->tFrameCounter = 0; + return 0; +} + +// We have a bite. Now, wait for the player to press A, or the timer to expire. +u8 Fishing8(struct Task *task) +{ + const s16 reelTimeouts[3] = {36, 33, 30}; + + sub_805A954(); + task->tFrameCounter++; + if (task->tFrameCounter >= reelTimeouts[task->tFishingRod]) + task->tStep = FISHING_GOT_AWAY; + else if (gMain.newKeys & A_BUTTON) + task->tStep++; + return 0; +} + +// Determine if we're going to play the dot game again +u8 Fishing9(struct Task *task) +{ + const s16 arr[][2] = + { + {0, 0}, + {40, 10}, + {70, 30} + }; + + sub_805A954(); + task->tStep++; + if (task->tRoundsPlayed < task->tMinRoundsRequired) + { + task->tStep = FISHING_START_ROUND; + } + else if (task->tRoundsPlayed < 2) + { + // probability of having to play another round + s16 probability = Random() % 100; + + if (arr[task->tFishingRod][task->tRoundsPlayed] > probability) + task->tStep = FISHING_START_ROUND; + } + return 0; +} + +u8 Fishing10(struct Task *task) +{ + sub_805A954(); + MenuPrintMessageDefaultCoords(gOtherText_PokeOnHook); + Menu_DisplayDialogueFrame(); + task->tStep++; + task->tFrameCounter = 0; + return 0; +} + +u8 Fishing11(struct Task *task) +{ + if (task->tFrameCounter == 0) + sub_805A954(); + + if (task->tFrameCounter == 0) + { + if (Menu_UpdateWindowText()) + { + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + sub_805B980(playerMapObj, task->tPlayerGfxId); + FieldObjectTurn(playerMapObj, playerMapObj->placeholder18); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); + gSprites[gPlayerAvatar.spriteId].pos2.x = 0; + gSprites[gPlayerAvatar.spriteId].pos2.y = 0; + Menu_EraseScreen(); + task->tFrameCounter++; + return 0; + } + } + + if (task->tFrameCounter != 0) + { + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + FishingWildEncounter(task->tFishingRod); + sub_80BE97C(1); + DestroyTask(FindTaskIdByFunc(Task_Fishing)); + } + return 0; +} + +// Not even a nibble +u8 Fishing12(struct Task *task) +{ + sub_805A954(); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble())); + MenuPrintMessageDefaultCoords(gOtherText_NotEvenANibble); + task->tStep = FISHING_SHOW_RESULT; + return 1; +} + +// It got away +u8 Fishing13(struct Task *task) +{ + sub_805A954(); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble())); + MenuPrintMessageDefaultCoords(gOtherText_ItGotAway); + task->tStep++; + return 1; +} + +// Display the message +u8 Fishing14(struct Task *task) +{ + sub_805A954(); + Menu_DisplayDialogueFrame(); + task->tStep++; + return 0; +} + +u8 Fishing15(struct Task *task) +{ + sub_805A954(); + if (gSprites[gPlayerAvatar.spriteId].animEnded) + { + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + sub_805B980(playerMapObj, task->tPlayerGfxId); + FieldObjectTurn(playerMapObj, playerMapObj->placeholder18); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); + gSprites[gPlayerAvatar.spriteId].pos2.x = 0; + gSprites[gPlayerAvatar.spriteId].pos2.y = 0; + task->tStep++; + } + return 0; +} + +u8 Fishing16(struct Task *task) +{ + if (Menu_UpdateWindowText()) + { + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + Menu_EraseScreen(); + sub_80BE97C(0); + DestroyTask(FindTaskIdByFunc(Task_Fishing)); + } + return 0; +} + +#undef tStep +#undef tFrameCounter +#undef tFishingRod + +static void sub_805A954(void) +{ + struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; + u8 animCmdIndex; + u8 animType; + + AnimateSprite(playerSprite); + playerSprite->pos2.x = 0; + playerSprite->pos2.y = 0; + animCmdIndex = playerSprite->animCmdIndex; + if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) + { + animCmdIndex--; + } + else + { + playerSprite->animDelayCounter++; + if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) + animCmdIndex--; + } + animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; + if (animType == 1 || animType == 2 || animType == 3) + { + playerSprite->pos2.x = 8; + if (player_get_direction_lower_nybble() == 3) + playerSprite->pos2.x = -8; + } + if (animType == 5) + playerSprite->pos2.y = -8; + if (animType == 10 || animType == 11) + playerSprite->pos2.y = 8; + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y); +} + +#if DEBUG + +u8 debug_sub_805F2B0(u8 a) +{ + if (gMain.heldKeys & 0x100) + return debug_sub_805F2DC(a); + else + return 0; +} + +u8 debug_sub_805F2DC(u8 a) +{ + if (a == 0) + PlayerFaceDirection(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18); + else if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 && !CanCameraMoveInDirection(a)) + PlayerOnBikeCollide(a); + else + PlayerGoSpeed4(a); + return 1; +} + +#endif diff --git a/src/field_poison.c b/src/field_poison.c new file mode 100644 index 000000000..8365351f9 --- /dev/null +++ b/src/field_poison.c @@ -0,0 +1,146 @@ +#include "global.h" +#include "field_poison.h" +#include "field_message_box.h" +#include "fldeff_poison.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "script.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + +extern u16 gSpecialVar_Result; +extern u8 fieldPoisonText_PokemonFainted[]; + +bool32 CheckMonIsValid(struct Pokemon *pkmn) +{ + // UB: Too few arguments for function 'GetMonData' + u16 species2 = GetMonData(pkmn, MON_DATA_SPECIES2); + + if (species2 == 0 || species2 == 0x19C) + return FALSE; + else + return TRUE; +} + +bool32 AllMonsFainted(void) +{ + struct Pokemon *pkmn = &gPlayerParty[0]; + int i; + + for (i = 0; i < 6; i++, pkmn++) + { + // UB: Too few arguments for function 'GetMonData' + if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) != 0) + return FALSE; + } + return TRUE; +} + +void MonFaintFromPoisonOnField(u8 partyMember) +{ + struct Pokemon *pkmn = &gPlayerParty[partyMember]; + u32 val = 0; + + AdjustFriendship(pkmn, 7); + SetMonData(pkmn, MON_DATA_STATUS, &val); + GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1); + StringGetEnd10(gStringVar1); +} + +bool32 CheckMonFaintedFromPoison(u8 partyMember) +{ + struct Pokemon *pkmn = &gPlayerParty[partyMember]; + + // UB: Too few arguments for function 'GetMonData' + if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) == 0 + && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) + return TRUE; + else + return FALSE; +} + +#define tState data[0] +#define tPartyMember data[1] + +void Task_WhiteOut(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (tState) + { + case 0: + // Check if any Pokemon have fainted due to poison + while (tPartyMember < 6) + { + if (CheckMonFaintedFromPoison(tPartyMember)) + { + // Show message about fainted mon + MonFaintFromPoisonOnField(tPartyMember); + ShowFieldMessage(fieldPoisonText_PokemonFainted); + tState++; + return; + } + tPartyMember++; + } + tState = 2; + break; + case 1: // Wait for message box to disappear + if (IsFieldMessageBoxHidden()) + tState--; // Go to previous step and check next party member + break; + case 2: // done checking all mons + if (AllMonsFainted()) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +#undef tState +#undef tPartyMember + +void ExecuteWhiteOut(void) +{ + CreateTask(Task_WhiteOut, 0x50); + ScriptContext1_Stop(); +} + +s32 DoPoisonFieldEffect(void) +{ + struct Pokemon *pkmn = &gPlayerParty[0]; + u32 numPoisoned = 0; + u32 numFainting = 0; + int i; + + // count the number of mons that are poisoned and fainting from poison, + // and decrement HP of all poisoned mons + for (i = 0; i < 6; i++) + { + u32 hp; + + if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0 + && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) + { + // decrement HP of poisoned mon + hp = GetMonData(pkmn, MON_DATA_HP); + if (hp != 0) + hp--; + if (hp == 0) + numFainting++; + SetMonData(pkmn, MON_DATA_HP, &hp); + numPoisoned++; + } + pkmn++; + } + if (numFainting != 0 || numPoisoned != 0) + FldeffPoison_Start(); + if (numFainting != 0) + return 2; + if (numPoisoned != 0) + return 1; + return 0; +} diff --git a/src/field_region_map.c b/src/field_region_map.c new file mode 100644 index 000000000..54091459f --- /dev/null +++ b/src/field_region_map.c @@ -0,0 +1,123 @@ +#include "global.h" +#include "field_region_map.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "region_map.h" +#include "sprite.h" +#include "strings2.h" +#include "text.h" +#include "ewram.h" + +struct RegionMapStruct +{ + u8 str[0x16]; + u8 unk16; + u8 filler[0x869]; +}; + +struct UnkStruct +{ + MainCallback callback; + u8 filler[4]; + // This should be RegionMap, but I can't do that because it overlaps unk888. + struct RegionMapStruct unk8; + u16 unk888; +}; + +void FieldInitRegionMap(MainCallback callback) +{ + SetVBlankCallback(NULL); + ewram0_5.unk888 = 0; + ewram0_5.callback = callback; + SetMainCallback2(CB2_FieldInitRegionMap); +} + +void CB2_FieldInitRegionMap(void) +{ + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + ResetSpriteData(); + FreeAllSpritePalettes(); + // TODO: remove this cast + InitRegionMap((void *)&ewram0_5.unk8, 0); + CreateRegionMapPlayerIcon(0, 0); + CreateRegionMapCursor(1, 1); + Text_LoadWindowTemplate(&gWindowTemplate_81E709C); + InitMenuWindow(&gWindowTemplate_81E709C); + Menu_EraseScreen(); + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + Menu_DrawStdWindowFrame(21, 0, 29, 3); + sub_8072BD8(gOtherText_Hoenn, 0x16, 1, 0x38); + Menu_DrawStdWindowFrame(16, 16, 29, 19); + sub_813F0C8(); + SetMainCallback2(CB2_FieldRegionMap); + SetVBlankCallback(VBlankCB_FieldRegionMap); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); +} + +void VBlankCB_FieldRegionMap(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_FieldRegionMap(void) +{ + sub_813EFDC(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_813EFDC(void) +{ + switch (ewram0_5.unk888) + { + case 0: + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + ewram0_5.unk888++; + break; + case 1: + if (!gPaletteFade.active) + ewram0_5.unk888++; + break; + case 2: + switch (sub_80FAB60()) + { + case 3: + sub_813F0C8(); + break; + case 4: + case 5: + ewram0_5.unk888++; + } + break; + case 3: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + ewram0_5.unk888++; + break; + case 4: + if (!gPaletteFade.active) + { + FreeRegionMapIconResources(); + SetMainCallback2(ewram0_5.callback); + } + break; + } +} + +void sub_813F0C8(void) +{ + Menu_BlankWindowRect(17, 17, 28, 18); + if (ewram0_5.unk8.unk16) + Menu_PrintText(ewram0_5.unk8.str, 17, 17); +} diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c new file mode 100644 index 000000000..61301c5a9 --- /dev/null +++ b/src/field_screen_effect.c @@ -0,0 +1,331 @@ +#include "global.h" +#include "event_data.h" +#include "field_camera.h" +#include "menu.h" +#include "palette.h" +#include "overworld.h" +#include "script.h" +#include "task.h" +#include "text.h" +#include "scanline_effect.h" + +const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 }; + +const s32 gMaxFlashLevel = 4; + +const static struct ScanlineEffectParams gUnknown_0839ACEC = +{ + (void *)REG_ADDR_WIN0H, + ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, + 1 +}; + +static void sub_808136C(u16 *dest, u32 a2, s32 a3, s32 a4) +{ + if (a2 <= 0xA0) + { + if (a3 < 0) + a3 = 0; + if (a3 > 255) + a3 = 255; + if (a4 < 0) + a4 = 0; + if (a4 > 255) + a4 = 255; + dest[a2] = (a3 << 8) | a4; + } +} + +static void sub_8081398(u16 *dest, s32 a2, s32 a3, s32 a4) +{ + s32 v1 = a4; + s32 v2 = a4; + s32 v3 = 0; + while (v1 >= v3) + { + sub_808136C(dest, a3 - v3, a2 - v1, a2 + v1); + sub_808136C(dest, a3 + v3, a2 - v1, a2 + v1); + sub_808136C(dest, a3 - v1, a2 - v3, a2 + v3); + sub_808136C(dest, a3 + v1, a2 - v3, a2 + v3); + v2 -= (v3 * 2) - 1; + v3++; + if (v2 < 0) + { + v2 += 2 * (v1 - 1); + v1--; + } + } +} + +static void sub_8081424(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]); + data[0] = 1; + break; + case 1: + sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]); + data[0] = 0; + data[3] += data[5]; + if (data[3] > data[4]) + { + if (data[6] == 1) + { + ScanlineEffect_Stop(); + data[0] = 2; + } + else + { + DestroyTask(taskId); + } + } + break; + case 2: + ScanlineEffect_Clear(); + DestroyTask(taskId); + break; + } +} + +static void sub_80814E8(u8 taskId) +{ + if (!FuncIsActiveTask(sub_8081424)) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } +} + +static void sub_8081510(void) +{ + if (!FuncIsActiveTask(sub_80814E8)) + CreateTask(sub_80814E8, 80); +} + +static u8 sub_8081534(s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, u8 a6) +{ + u8 taskId = CreateTask(sub_8081424, 80); + s16 *data = gTasks[taskId].data; + + data[3] = a3; + data[4] = a4; + data[1] = a1; + data[2] = a2; + data[6] = a5; + + if (a3 < a4) + data[5] = a6; + else + data[5] = -a6; + + return taskId; +} + +void sub_8081594(u8 a1) +{ + u8 flashLevel = Overworld_GetFlashLevel(); + u8 value = 0; + if (!a1) + value = 1; + sub_8081534(120, 80, gUnknown_0839ACDC[flashLevel], gUnknown_0839ACDC[a1], value, 1); + sub_8081510(); + ScriptContext2_Enable(); +} + +void sub_80815E0(u8 a1) +{ + if (a1) + { + sub_8081398(&gScanlineEffectRegBuffers[0][0], 120, 80, gUnknown_0839ACDC[a1]); + CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); + } +} + +static void sub_808161C(u8 a1) +{ + int i; + u16 color[1]; + + if (!a1) + color[0] = 0x1F; + else + color[0] = 0x7C00; + + for (i = 0; i < 16; i++) + { + LoadPalette(color, 0xF0 + i, 2); + } +} + +static bool8 sub_8081658(u16 a1) +{ + u8 lo = REG_BLDALPHA & 0xFF; + u8 hi = REG_BLDALPHA >> 8; + + if (a1) + { + if (lo) + { + lo--; + } + } + else + { + if (hi < 0x10) + { + hi++; + } + } + + REG_BLDALPHA = (hi << 8) | lo; + + if (lo == 0 && hi == 0x10) + { + return TRUE; + } + + return FALSE; +} + +static void sub_80816A8(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[6] = REG_DISPCNT; + data[7] = REG_BLDCNT; + data[8] = REG_BLDALPHA; + data[9] = REG_WININ; + data[10] = REG_WINOUT; + REG_DISPCNT &= 0xBFFF; + REG_BLDCNT |= gUnknown_081E29E8[0]; + REG_BLDALPHA = 1804; + REG_WININ = 63; + REG_WINOUT = 30; + sub_8081398(&gScanlineEffectRegBuffers[0][0], data[2], data[3], 1); + CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); + //ScanlineEffect_SetParams(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]); + ScanlineEffect_SetParams(gUnknown_0839ACEC); + data[0] = 1; + break; + case 1: + Menu_BlankWindowRect(0, 0, 29, 19); + sub_808161C(data[1]); + sub_8081534(data[2], data[3], 1, 160, 1, 2); + data[0] = 2; + break; + case 2: + if (!FuncIsActiveTask(sub_8081424)) + { + EnableBothScriptContexts(); + data[0] = 3; + } + break; + case 3: + InstallCameraPanAheadCallback(); + SetCameraPanningCallback(NULL); + data[5] = 0; + data[4] = 4; + data[0] = 4; + break; + case 4: + data[4]--; + if (!data[4]) + { + s32 panning; + data[4] = 4; + data[5] ^= 1; + if (data[5]) + panning = 4; + else + panning = -4; + SetCameraPanning(0, panning); + } + break; + case 6: + InstallCameraPanAheadCallback(); + data[4] = 8; + data[0] = 7; + break; + case 7: + data[4]--; + if (!data[4]) + { + data[4] = 8; + data[5] ^= 1; + if (sub_8081658(data[5]) == TRUE) + data[0] = 5; + } + break; + case 5: + Menu_EraseWindowRect(0, 0, 29, 19); + LoadFontDefaultPalette(&gWindowTemplate_81E6CE4); + REG_WIN0H = 255; + REG_DISPCNT = data[6]; + REG_BLDCNT = data[7]; + REG_BLDALPHA = data[8]; + REG_WININ = data[9]; + REG_WINOUT = data[10]; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +void sub_80818A4(void) +{ + u8 taskId = CreateTask(sub_80816A8, 80); + s16 *data = gTasks[taskId].data; + + if (gSpecialVar_Result == 0) + { + data[1] = 0; + data[2] = 104; + } + else if (gSpecialVar_Result == 1) + { + data[1] = 1; + data[2] = 104; + } + else if (gSpecialVar_Result == 2) + { + data[1] = 0; + data[2] = 120; + } + else + { + data[1] = 1; + data[2] = 120; + } + + data[3] = 80; +} + +void sub_80818FC(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80816A8); + gTasks[taskId].data[0] = 6; +} + +static void task50_0807F0C8(u8); + +void sub_8081924(void) +{ + Overworld_FadeOutMapMusic(); + CreateTask(task50_0807F0C8, 80); +} + +static void task50_0807F0C8(u8 taskId) +{ + if (sub_8054034() == TRUE) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + } +} diff --git a/src/field_special_scene.c b/src/field_special_scene.c new file mode 100644 index 000000000..2010ebcf4 --- /dev/null +++ b/src/field_special_scene.c @@ -0,0 +1,382 @@ +#include "global.h" +#include "field_special_scene.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_fadetransition.h" +#include "event_object_movement.h" +#include "field_specials.h" +#include "fieldmap.h" +#include "main.h" +#include "palette.h" +#include "overworld.h" +#include "script.h" +#include "script_movement.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" + +#define SECONDS(value) ((signed) (60.0 * value + 0.5)) + +// TODO: Move somewhere else +enum +{ + STEP_17 = 0x17, + STEP_18, + STEP_END = 0xFE, +}; + +const u32 gMapObjectPic_MovingBox[] = INCBIN_U32("graphics/map_objects/pics/misc/moving_box.4bpp"); +const u16 gMapObjectPalette19[] = INCBIN_U16("graphics/map_objects/palettes/19.gbapal"); + +static const s8 gTruckCamera_HorizontalTable[] = +{ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + -1, + -1, + -1, + 0, +}; + +const u8 gUnknown_083D295F[] = +{ + STEP_18, + STEP_END, +}; + +const u8 gUnknown_083D2961[] = +{ + STEP_17, + STEP_END, +}; + +// porthole states +enum +{ + INIT_PORTHOLE, + IDLE_CHECK, + EXECUTE_MOVEMENT, + EXIT_PORTHOLE, +}; + +s16 GetTruckCameraBobbingY(int a1) +{ + if (!(a1 % 120)) + return -1; + else if ((a1 % 10) <= 4) + return 1; + + return 0; +} + +s16 GetTruckBoxMovement(int a1) // for the box movement? +{ + if (!((a1 + 120) % 180)) + return -1; + + return 0; +} + +void Task_Truck1(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 cameraYpan, cameraXpan = 0; + s16 box1, box2, box3; + + box1 = GetTruckBoxMovement(data[0] + 30) * 4; // top box. + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, box1 + 3); + box2 = GetTruckBoxMovement(data[0]) * 2; // bottom left box. + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, box2 - 3); + box3 = GetTruckBoxMovement(data[0]) * 4; // bottom right box. + sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, box3); + + if (++data[0] == SECONDS(500)) // this will never run + data[0] = 0; // reset the timer if it gets stuck. + + // this also matches with directly calling GetTruckCameraBobbingY within SetCameraPanning, but this is consistent with a later function that requires a temp variable. + cameraYpan = GetTruckCameraBobbingY(data[0]); + SetCameraPanning(cameraXpan, cameraYpan); +} + +void Task_Truck2(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 cameraYpan; + s16 cameraXpan; + s16 box1, box2, box3; + + data[0]++; + data[2]++; + + if (data[0] > 5) + { + data[0] = 0; + data[1]++; + } + if ((u16)data[1] == 19) + { + DestroyTask(taskId); + } + else + { + if (gTruckCamera_HorizontalTable[data[1]] == 2) + gTasks[taskId].func = Task_Truck3; + + cameraXpan = gTruckCamera_HorizontalTable[data[1]]; + cameraYpan = GetTruckCameraBobbingY(data[2]); + SetCameraPanning(cameraXpan, cameraYpan); + box1 = GetTruckBoxMovement(data[2] + 30) * 4; + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, box1 + 3); + box2 = GetTruckBoxMovement(data[2]) * 2; + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, box2 - 3); + box3 = GetTruckBoxMovement(data[2]) * 4; + sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, box3); + } +} + +void Task_Truck3(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 cameraXpan; + s16 cameraYpan; + + data[0]++; + + if (data[0] > 5) + { + data[0] = 0; + data[1]++; + } + + if ((u16)data[1] == 19) + { + DestroyTask(taskId); + } + else + { + cameraXpan = gTruckCamera_HorizontalTable[data[1]]; + cameraYpan = 0; + SetCameraPanning(cameraXpan, cameraYpan); + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, cameraYpan + 3); + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, cameraYpan - 3); + sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, cameraYpan); + } +} + +void Task_HandleTruckSequence(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + /* + Each case has a timer which is handled with data[1], incrementing + until it reaches the if function's condition, which sets the next task up. + */ + case 0: + data[1]++; + if (data[1] == SECONDS(1.5)) + { + SetCameraPanningCallback(0); + data[1] = 0; // reset the timer. + data[2] = CreateTask(Task_Truck1, 0xA); + data[0] = 1; // run the next case. + PlaySE(SE_TRACK_MOVE); + } + break; + case 1: + data[1]++; + if (data[1] == SECONDS(2.5)) + { + pal_fill_black(); + data[1] = 0; + data[0] = 2; + } + break; + case 2: + data[1]++; + if (!gPaletteFade.active && data[1] > SECONDS(5)) + { + data[1] = 0; + DestroyTask(data[2]); + data[3] = CreateTask(Task_Truck2, 0xA); + data[0] = 3; + PlaySE(SE_TRACK_STOP); + } + break; + case 3: + if (!gTasks[data[3]].isActive) // is Truck2 no longer active (is Truck3 active?) + { + InstallCameraPanAheadCallback(); + data[1] = 0; + data[0] = 4; + } + break; + case 4: + data[1]++; + if (data[1] == 90) + { + PlaySE(SE_TRACK_HAIK); + data[1] = 0; + data[0] = 5; + } + break; + case 5: + data[1]++; + if (data[1] == 120) + { + MapGridSetMetatileIdAt(11, 8, 520); + MapGridSetMetatileIdAt(11, 9, 528); + MapGridSetMetatileIdAt(11, 10, 536); + DrawWholeMapView(); + PlaySE(SE_TRACK_DOOR); + DestroyTask(taskId); + ScriptContext2_Disable(); + } + break; + } +} + +void ExecuteTruckSequence(void) +{ + MapGridSetMetatileIdAt(11, 8, 525); + MapGridSetMetatileIdAt(11, 9, 533); + MapGridSetMetatileIdAt(11, 10, 541); + DrawWholeMapView(); + ScriptContext2_Enable(); + CpuFastFill(0, gPlttBufferFaded, 0x400); + CreateTask(Task_HandleTruckSequence, 0xA); +} + +void EndTruckSequence(u8 taskId) +{ + if (!FuncIsActiveTask(Task_HandleTruckSequence)) + { + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3, 3); + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 0, -3); + sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3, 0); + } +} + +bool8 sub_80C7754(void) +{ + s8 mapGroup, mapNum; + s16 x, y; + + if (GetSSTidalLocation(&mapGroup, &mapNum, &x, &y)) + { + return FALSE; + } + else + { + Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y); + return TRUE; + } +} + +void Task_HandlePorthole(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 *var = GetVarPointer(VAR_PORTHOLE_STATE); + struct WarpData *location = &gSaveBlock1.location; + + switch (data[0]) + { + case INIT_PORTHOLE: // finish fading before making porthole finish. + if (!gPaletteFade.active) + { + data[1] = 0; + data[0] = EXECUTE_MOVEMENT; // execute movement before checking if should be exited. strange? + } + break; + case IDLE_CHECK: // idle and move. + if (gMain.newKeys & A_BUTTON) + data[1] = 1; + if (!ScriptMovement_IsObjectMovementFinished(0xFF, location->mapNum, location->mapGroup)) + return; + if (CountSSTidalStep(1) == TRUE) + { + if (*var == 2) + *var = 9; + else + *var = 10; + data[0] = 3; + return; + } + data[0] = 2; + case EXECUTE_MOVEMENT: // execute movement. + if (data[1]) + { + data[0] = EXIT_PORTHOLE; // exit porthole. + return; + } + // run this once. + if (*var == 2) // which direction? + { + ScriptMovement_StartObjectMovementScript(0xFF, location->mapNum, location->mapGroup, gUnknown_083D295F); + data[0] = IDLE_CHECK; // run case 1. + } + else + { + ScriptMovement_StartObjectMovementScript(0xFF, location->mapNum, location->mapGroup, gUnknown_083D2961); + data[0] = IDLE_CHECK; // run case 1. + } + break; + case EXIT_PORTHOLE: // exit porthole. + FlagClear(FLAG_SPECIAL_FLAG_1); + FlagClear(FLAG_SPECIAL_FLAG_0); + copy_saved_warp2_bank_and_enter_x_to_warp1(0); + sp13E_warp_to_last_warp(); + DestroyTask(taskId); + break; + } +} + +void sub_80C78A0(void) +{ + u8 spriteId = AddPseudoFieldObject(0x8C, SpriteCallbackDummy, 112, 80, 0); + + gSprites[spriteId].coordOffsetEnabled = FALSE; + + if (VarGet(VAR_PORTHOLE_STATE) == 2) + { + StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(4)); + } + else + { + StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(3)); + } +} + +void sub_80C791C(void) +{ + sub_80C78A0(); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = TRUE; + pal_fill_black(); + CreateTask(Task_HandlePorthole, 80); + ScriptContext2_Enable(); +} + +void sub_80C7958(void) +{ + FlagSet(FLAG_SYS_CRUISE_MODE); + FlagSet(FLAG_SPECIAL_FLAG_1); + FlagSet(FLAG_SPECIAL_FLAG_0); + saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); + sub_80C7754(); + sub_8080F9C(); +} diff --git a/src/field_specials.c b/src/field_specials.c new file mode 100644 index 000000000..715086f00 --- /dev/null +++ b/src/field_specials.c @@ -0,0 +1,2381 @@ +#include "global.h" +#include "field_specials.h" +#include "diploma.h" +#include "fieldmap.h" +#include "event_data.h" +#include "battle_tower.h" +#include "event_object_movement.h" +#include "region_map.h" +#include "field_region_map.h" +#include "field_message_box.h" +#include "field_camera.h" +#include "field_player_avatar.h" +#include "main.h" +#include "constants/maps.h" +#include "overworld.h" +#include "script.h" +#include "constants/songs.h" +#include "string_util.h" +#include "strings.h" +#include "pokeblock.h" +#include "constants/species.h" +#include "constants/abilities.h" +#include "constants/moves.h" +#include "text.h" +#include "wallclock.h" +#include "tv.h" +#include "rtc.h" +#include "link.h" +#include "constants/songs.h" +#include "sound.h" +#include "menu.h" +#include "starter_choose.h" +#include "menu_helpers.h" +#include "battle_tower.h" +#include "field_weather.h" +#include "pokemon_summary_screen.h" +#include "random.h" + +#if ENGLISH +#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD +#elif GERMAN +#define CHAR_DECIMAL_SEPARATOR CHAR_COMMA +#endif + +extern struct WarpData gUnknown_020297F0; +extern u8 gBattleOutcome; +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_Result; + +extern u8 *const gUnknown_083D1464[3]; + +EWRAM_DATA bool8 gBikeCyclingChallenge = FALSE; +EWRAM_DATA u8 gBikeCollisions = 0; +EWRAM_DATA u32 gBikeCyclingTimer = 0; +EWRAM_DATA u8 gUnknown_02039258 = 0; +EWRAM_DATA u8 gUnknown_02039259 = 0; +EWRAM_DATA u8 gUnknown_0203925A = 0; +EWRAM_DATA u8 gUnknown_0203925B = 0; +EWRAM_DATA u8 gUnknown_0203925C = 0; + +static void RecordCyclingRoadResults(u32, u8); + +static struct ElevatorMenu gUnknown_03000760[20]; + +void ScrSpecial_ShowDiploma(void) +{ + SetMainCallback2(CB2_ShowDiploma); + ScriptContext2_Enable(); +} + +void ScrSpecial_ViewWallClock(void) +{ + gMain.savedCallback = c2_exit_to_overworld_2_switch; + SetMainCallback2(CB2_ViewWallClock); + ScriptContext2_Enable(); +} + +void ResetCyclingRoadChallengeData(void) +{ + gBikeCyclingChallenge = FALSE; + gBikeCollisions = 0; + gBikeCyclingTimer = 0; +} + +void ScrSpecial_BeginCyclingRoadChallenge(void) +{ + gBikeCyclingChallenge = TRUE; + gBikeCollisions = 0; + gBikeCyclingTimer = gMain.vblankCounter1; +} + +u16 GetPlayerAvatarBike(void) +{ + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) + return 1; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) + return 2; + return 0; +} + +static void DetermineCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) +{ + u8 result; + + if (numBikeCollisions <= 99) + { + ConvertIntToDecimalStringN(gStringVar1, numBikeCollisions, STR_CONV_MODE_LEFT_ALIGN, 2); + StringAppend(gStringVar1, gOtherText_Times); + } + else + { + StringCopy(gStringVar1, gOtherText_99Times); + } + + if (numFrames < 3600) + { + ConvertIntToDecimalStringN(gStringVar2, numFrames / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); + gStringVar2[2] = CHAR_DECIMAL_SEPARATOR; + ConvertIntToDecimalStringN(&gStringVar2[3], ((numFrames % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(gStringVar2, gOtherText_Seconds); + } + else + { + StringCopy(gStringVar2, gOtherText_1Minute); + } + + result = 0; + if (numBikeCollisions == 0) + { + result = 5; + } + else if (numBikeCollisions < 4) + { + result = 4; + } + else if (numBikeCollisions < 10) + { + result = 3; + } + else if (numBikeCollisions < 20) + { + result = 2; + } + else if (numBikeCollisions < 100) + { + result = 1; + } + + if (numFrames / 60 <= 10) + { + result += 5; + } + else if (numFrames / 60 <= 15) + { + result += 4; + } + else if (numFrames / 60 <= 20) + { + result += 3; + } + else if (numFrames / 60 <= 40) + { + result += 2; + } + else if (numFrames / 60 < 60) + { + result += 1; + } + + + gSpecialVar_Result = result; +} + +void FinishCyclingRoadChallenge(void) { + const u32 numFrames = gMain.vblankCounter1 - gBikeCyclingTimer; + + DetermineCyclingRoadResults(numFrames, gBikeCollisions); + RecordCyclingRoadResults(numFrames, gBikeCollisions); +} + +static void RecordCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) { + u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L); + u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H); + u32 framesRecord = low + (high << 16); + + if (framesRecord > numFrames || framesRecord == 0) + { + VarSet(VAR_CYCLING_ROAD_RECORD_TIME_L, numFrames); + VarSet(VAR_CYCLING_ROAD_RECORD_TIME_H, numFrames >> 16); + VarSet(VAR_CYCLING_ROAD_RECORD_COLLISIONS, numBikeCollisions); + } +} + +u16 GetRecordedCyclingRoadResults(void) { + u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L); + u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H); + u32 framesRecord = low + (high << 16); + + if (framesRecord == 0) + { + return FALSE; + } + + DetermineCyclingRoadResults(framesRecord, VarGet(VAR_CYCLING_ROAD_RECORD_COLLISIONS)); + return TRUE; +} + +void UpdateCyclingRoadState(void) { + if (gUnknown_020297F0.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE) && gUnknown_020297F0.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE)) + { + return; + } + + if (VarGet(VAR_CYCLING_CHALLENGE_STATE) == 2 || VarGet(VAR_CYCLING_CHALLENGE_STATE) == 3) + { + VarSet(VAR_CYCLING_CHALLENGE_STATE, 0); + Overworld_SetSavedMusic(SE_STOP); + } +} + +void SetSSTidalFlag(void) +{ + FlagSet(FLAG_SYS_CRUISE_MODE); + *GetVarPointer(VAR_CRUISE_STEP_COUNT) = 0; +} + +void ResetSSTidalFlag(void) +{ + FlagClear(FLAG_SYS_CRUISE_MODE); +} + +bool32 CountSSTidalStep(u16 delta) +{ + if (!FlagGet(FLAG_SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) <= 0xcc) + { + return FALSE; + } + return TRUE; +} + +u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) +{ + u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT); + switch (*GetVarPointer(VAR_PORTHOLE_STATE)) + { + case 1: + case 8: + return 1; + case 3: + case 9: + return 4; + case 4: + case 5: + return 2; + case 6: + case 10: + return 3; + case 2: + if (*varCruiseStepCount < 60) + { + *mapNum = MAP_NUM(ROUTE134); + *x = *varCruiseStepCount + 19; + } + else if (*varCruiseStepCount < 140) + { + *mapNum = MAP_NUM(ROUTE133); + *x = *varCruiseStepCount - 60; + } + else + { + *mapNum = MAP_NUM(ROUTE132); + *x = *varCruiseStepCount - 140; + } + break; + case 7: + if (*varCruiseStepCount < 66) + { + *mapNum = MAP_NUM(ROUTE132); + *x = 65 - *varCruiseStepCount; + } + else if (*varCruiseStepCount < 146) { + *mapNum = MAP_NUM(ROUTE133); + *x = 145 - *varCruiseStepCount; + } + else + { + *mapNum = MAP_NUM(ROUTE134); + *x = 224 - *varCruiseStepCount; + } + break; + } + *mapGroup = MAP_GROUP(ROUTE132); + *y = 20; + return 0; +} + +u8 GetLinkPartnerNames(void) +{ + u8 i; + u8 j = 0; + u8 myLinkPlayerNumber = sub_8008218(); + u8 nLinkPlayers = sub_800820C(); + for (i=0; i=0; i--) + { + MapGridSetMetatileIdAt(switchCoords->x, switchCoords->y, 0x206); + switchCoords++; + } + for (y=12; y<24; y++) + { + for (x=7; x<16; x++) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x220: + MapGridSetMetatileIdAt(x, y, 0x230); + break; + case 0x221: + MapGridSetMetatileIdAt(x, y, 0x231); + break; + case 0x228: + MapGridSetMetatileIdAt(x, y, 0x238); + break; + case 0x229: + MapGridSetMetatileIdAt(x, y, 0x239); + break; + case 0x222: + MapGridSetMetatileIdAt(x, y, 0x232); + break; + case 0x223: + MapGridSetMetatileIdAt(x, y, 0x233); + break; + case 0x22a: + MapGridSetMetatileIdAt(x, y, 0x23a); + break; + case 0x22b: + MapGridSetMetatileIdAt(x, y, 0x23b); + break; + case 0x240: + MapGridSetMetatileIdAt(x, y, 0xe42); + break; + case 0x241: + MapGridSetMetatileIdAt(x, y, 0xe43); + break; + case 0x248: + case 0x249: + MapGridSetMetatileIdAt(x, y, 0x21a); + break; + case 0x250: + MapGridSetMetatileIdAt(x, y, 0x251); + break; + } + } + } +} + +static void Task_PetalburgGym(u8); +static void PetalburgGymFunc(u8, u16); +const u8 gUnknown_083F8370[] = {0, 1, 1, 1, 1}; +const u16 gUnknown_083F8376[] = {0x218, 0x219, 0x21a, 0x21b, 0x21c}; + +void PetalburgGymSpecial1(void) +{ + gUnknown_02039258 = 0; + gUnknown_02039259 = 0; + PlaySE(SE_KI_GASYAN); + CreateTask(Task_PetalburgGym, 8); +} + +static void Task_PetalburgGym(u8 taskId) +{ + if (gUnknown_083F8370[gUnknown_02039259] == gUnknown_02039258) + { + PetalburgGymFunc(gSpecialVar_0x8004, gUnknown_083F8376[gUnknown_02039259]); + gUnknown_02039258 = 0; + if ((++gUnknown_02039259) == 5) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + } + } + else + { + gUnknown_02039258++; + } +} + +static void PetalburgGymFunc(u8 a0, u16 a1) +{ + u16 x[4]; + u16 y[4]; + u8 i; + u8 nDoors = 0; + switch (a0) + { + case 1: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x68; + y[1] = 0x68; + break; + case 2: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x4e; + y[1] = 0x4e; + break; + case 3: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x5b; + y[1] = 0x5b; + break; + case 4: + nDoors = 1; + x[0] = 7; + y[0] = 0x27; + break; + case 5: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x34; + y[1] = 0x34; + break; + case 6: + nDoors = 1; + x[0] = 1; + y[0] = 0x41; + break; + case 7: + nDoors = 1; + x[0] = 7; + y[0] = 0xd; + break; + case 8: + nDoors = 1; + x[0] = 1; + y[0] = 0x1a; + break; + } + for (i=0; i 9999) + { + weekCount = 9999; + } + return weekCount; +} + +u8 GetLeadMonFriendshipScore(void) +{ + struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()]; + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255) + { + return 6; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200) + { + return 5; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150) + { + return 4; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100) + { + return 3; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50) + { + return 2; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1) + { + return 1; + } + return 0; +} + +void CB2_FieldShowRegionMap(void) +{ + FieldInitRegionMap(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void FieldShowRegionMap(void) +{ + SetMainCallback2(CB2_FieldShowRegionMap); +} + +static void Task_PCTurnOnEffect(u8); +static void PCTurnOffEffect_0(struct Task *); +static void PCTurnOffEffect_1(s16, s8, s8); +static void PCTurnOffEffect(void); + +void DoPCTurnOnEffect(void) +{ + if (FuncIsActiveTask(Task_PCTurnOnEffect) != TRUE) + { + u8 taskId = CreateTask(Task_PCTurnOnEffect, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = taskId; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + } +} + +static void Task_PCTurnOnEffect(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + if (task->data[0] == 0) + { + PCTurnOffEffect_0(task); + } +} + +static void PCTurnOffEffect_0(struct Task *task) +{ + u8 playerDirectionLowerNybble; + s8 dx = 0; + s8 dy = 0; + if (task->data[3] == 6) + { + task->data[3] = 0; + playerDirectionLowerNybble = player_get_direction_lower_nybble(); + switch (playerDirectionLowerNybble) + { + case DIR_NORTH: + dx = 0; + dy = -1; + break; + case DIR_WEST: + dx = -1; + dy = -1; + break; + case DIR_EAST: + dx = 1; + dy = -1; + break; + } + PCTurnOffEffect_1(task->data[4], dx, dy); + DrawWholeMapView(); + task->data[4] ^= 1; + if ((++task->data[2]) == 5) + { + DestroyTask(task->data[1]); + } + } + task->data[3]++; +} + +static void PCTurnOffEffect_1(s16 flag, s8 dx, s8 dy) +{ + u16 tileId = 0; + if (flag != 0) + { + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x4; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x25a; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x259; + } + } + else + { + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x5; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x27f; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x27e; + } + } + MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); +} + +void DoPCTurnOffEffect(void) +{ + PCTurnOffEffect(); +} + +static void PCTurnOffEffect(void) +{ + s8 dx = 0; + s8 dy = 0; + u16 tileId = 0; + u8 playerDirectionLowerNybble = player_get_direction_lower_nybble(); + switch (playerDirectionLowerNybble) + { + case DIR_NORTH: + dx = 0; + dy = -1; + break; + case DIR_WEST: + dx = -1; + dy = -1; + break; + case DIR_EAST: + dx = 1; + dy = -1; + break; + } + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x4; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x25a; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x259; + } + MapGridSetMetatileIdAt(gSaveBlock1.pos.x + dx + 7, gSaveBlock1.pos.y + dy + 7, tileId | 0xc00); + DrawWholeMapView(); +} + +static void Task_LotteryCornerComputerEffect(u8); +static void LotteryCornerComputerEffect(struct Task *); + +void DoLotteryCornerComputerEffect(void) +{ + if (FuncIsActiveTask(Task_LotteryCornerComputerEffect) != TRUE) + { + u8 taskId = CreateTask(Task_LotteryCornerComputerEffect, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = taskId; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + } +} + +static void Task_LotteryCornerComputerEffect(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + if (task->data[0] == 0) + { + LotteryCornerComputerEffect(task); + } +} + +static void LotteryCornerComputerEffect(struct Task *task) +{ + if (task->data[3] == 6) + { + task->data[3] = 0; + if (task->data[4] != 0) + { + MapGridSetMetatileIdAt(18, 8, 0xe9d); + MapGridSetMetatileIdAt(18, 9, 0xea5); + } + else + { + MapGridSetMetatileIdAt(18, 8, 0xe58); + MapGridSetMetatileIdAt(18, 9, 0xe60); + } + DrawWholeMapView(); + task->data[4] ^= 1; + if ((++task->data[2]) == 5) + { + DestroyTask(task->data[1]); + } + } + task->data[3]++; +} + +void EndLotteryCornerComputerEffect(void) +{ + MapGridSetMetatileIdAt(18, 8, 0xe9d); + MapGridSetMetatileIdAt(18, 9, 0xea5); + DrawWholeMapView(); +} + +static void sub_810E874(void); +void DisplayCurrentElevatorFloor(void); +void sub_810E984(u8); +bool8 sub_810EAC8(u8, u8); +void sub_810EB90(u8, u8); +void ShakeScreenInElevator(void); +void sub_810EC34(u8); +void sub_810EC9C(u8); +void sub_810ECB0(void); +void sub_810ECD4(void); +void sub_810ECFC(void); +void sub_810ED40(u8); +void sub_810ED60(struct Task *); +void sub_810EEDC(void); + +const u8 *const gUnknown_083F8380[] = { + OtherText_1F, + OtherText_2F, + OtherText_3F, + OtherText_4F, + OtherText_5F, + OtherText_6F, + OtherText_7F, + OtherText_8F, + OtherText_9F, + OtherText_10F, + OtherText_11F, + OtherText_B1F, + OtherText_B2F, + OtherText_B3F, + OtherText_B4F, + OtherText_Rooftop +}; + +void SetDepartmentStoreFloorVar(void) +{ + u8 deptStoreFloor; + switch (gSaveBlock1.warp2.mapNum) + { + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F): + deptStoreFloor = 0; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F): + deptStoreFloor = 1; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F): + deptStoreFloor = 2; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F): + deptStoreFloor = 3; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F): + deptStoreFloor = 4; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP): + deptStoreFloor = 15; + break; + default: + deptStoreFloor = 0; + break; + } + VarSet(VAR_DEPT_STORE_FLOOR, deptStoreFloor); +} + +void ScriptAddElevatorMenuItem(u8 a0, u8 a1, u8 a2, u8 a3) +{ + u8 i; + if (gSpecialVar_0x8004 == 0) + { + for (i=0; i<20; i++) + { + gUnknown_03000760[i].var0 = 16; + } + } + gUnknown_03000760[gSpecialVar_0x8004].var0 = a0; + gUnknown_03000760[gSpecialVar_0x8004].var1 = a1; + gUnknown_03000760[gSpecialVar_0x8004].var2 = a2; + gUnknown_03000760[gSpecialVar_0x8004].var3 = a3; + gSpecialVar_0x8004++; +} + +void ScriptShowElevatorMenu(void) +{ + u8 i = 0; + gUnknown_0203925A = 0; + gUnknown_0203925B = 0; + ScriptAddElevatorMenuItem(16, 0, 0, 0); + while (gUnknown_03000760[i].var0 != 16) + { + gUnknown_0203925A++; + i++; + } + sub_810E874(); +} + +static void sub_810E874(void) +{ + u8 i; + ScriptContext2_Enable(); + if (gUnknown_0203925A > 5) + { + Menu_DrawStdWindowFrame(0, 0, 8, 11); + InitMenu(0, 1, 1, 5, 0, 7); + gUnknown_0203925C = 0; + ClearVerticalScrollIndicatorPalettes(); + LoadScrollIndicatorPalette(); + sub_810ECD4(); + } + else + { + Menu_DrawStdWindowFrame(0, 0, 8, 2 * gUnknown_0203925A + 1); + InitMenu(0, 1, 1, gUnknown_0203925A, 0, 7); + } + for (i = 0; i < 5 && gUnknown_03000760[i].var0 != 16; i ++) + { + Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1); + } + DisplayCurrentElevatorFloor(); + CreateTask(sub_810E984, 8); +} + +void DisplayCurrentElevatorFloor(void) +{ + Menu_DrawStdWindowFrame(20, 0, 29, 5); + sub_8072BD8(gOtherText_NowOn, 21, 1, 64); + sub_8072BD8(gUnknown_083F8380[gSpecialVar_0x8005], 21, 3, 64); +} + +void sub_810E984(u8 taskId) +{ + u8 curMenuPos; + if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) + { + gUnknown_0203925B--; + curMenuPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(-1); + sub_810EAC8(curMenuPos, DPAD_UP); + } + if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) + { + gUnknown_0203925B++; + curMenuPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(+1); + sub_810EAC8(curMenuPos, DPAD_DOWN); + } + if (gMain.newKeys & A_BUTTON) + { + saved_warp2_set_2(0, gUnknown_03000760[gUnknown_0203925B].var1, gUnknown_03000760[gUnknown_0203925B].var2, -1, 2, 1); + if (gSpecialVar_0x8005 == gUnknown_0203925B) + { + gSpecialVar_Result = 0; + PlaySE(SE_SELECT); + Menu_EraseWindowRect(0, 0, 29, 12); + sub_810EC9C(taskId); + } + else + { + gSpecialVar_Result = 1; + gSpecialVar_0x8005 = gUnknown_0203925B; + ShakeScreenInElevator(); + FieldObjectTurnByLocalIdAndMap(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH); + sub_810EEDC(); + Menu_EraseScreen(); + DestroyTask(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + gSpecialVar_Result = 0; + PlaySE(SE_SELECT); + sub_810EEDC(); + Menu_EraseWindowRect(0, 0, 29, 12); + sub_810EC9C(taskId); + } +} + +// This function, as written, swaps the roles of r4 and r5 throughout. +#ifdef NONMATCHING +bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) +{ + u8 i; + bool8 flag = 0; + u8 newPos = 0; + if (gUnknown_0203925A < 5) + { + return FALSE; + } + if (dpadInput == DPAD_UP) + { + if (prevMenuPos == 0) + { + newPos = gUnknown_0203925B; + flag = 1; + } + } + else if (dpadInput == DPAD_DOWN) + { + if (prevMenuPos == 4) + { + newPos = gUnknown_0203925B - 4; + flag = 1; + } + } + if (flag) + { + sub_810EB90(newPos, 5); + Menu_BlankWindowRect(2, 1, 7, 10); + for (i=0; i<5 && gUnknown_03000760[newPos].var0 != 16; newPos++, i++) + { + Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1); + } + } + return flag; +} +#else +__attribute__((naked)) +bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tlsls r0, 24\n" + "\tlsrs r2, r0, 24\n" + "\tadds r5, r2, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tadds r3, r1, 0\n" + "\tmovs r7, 0\n" + "\tmovs r4, 0\n" + "\tldr r0, _0810EAEC @ =gUnknown_0203925A\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x4\n" + "\tbhi _0810EAF0\n" + "\tmovs r0, 0\n" + "\tb _0810EB78\n" + "\t.align 2, 0\n" + "_0810EAEC: .4byte gUnknown_0203925A\n" + "_0810EAF0:\n" + "\tcmp r1, 0x40\n" + "\tbne _0810EB04\n" + "\tcmp r2, 0\n" + "\tbne _0810EB18\n" + "\tldr r0, _0810EB00 @ =gUnknown_0203925B\n" + "\tldrb r4, [r0]\n" + "\tmovs r7, 0x1\n" + "\tb _0810EB1C\n" + "\t.align 2, 0\n" + "_0810EB00: .4byte gUnknown_0203925B\n" + "_0810EB04:\n" + "\tcmp r3, 0x80\n" + "\tbne _0810EB18\n" + "\tcmp r5, 0x4\n" + "\tbne _0810EB18\n" + "\tldr r0, _0810EB84 @ =gUnknown_0203925B\n" + "\tldrb r0, [r0]\n" + "\tsubs r0, 0x4\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tmovs r7, 0x1\n" + "_0810EB18:\n" + "\tcmp r7, 0\n" + "\tbeq _0810EB76\n" + "_0810EB1C:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x5\n" + "\tbl sub_810EB90\n" + "\tmovs r0, 0x2\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x7\n" + "\tmovs r3, 0xA\n" + "\tbl Menu_BlankWindowRect\n" + "\tmovs r5, 0\n" + "\tldr r2, _0810EB88 @ =gUnknown_03000760\n" + "\tlsls r1, r4, 2\n" + "\tadds r0, r1, r2\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x10\n" + "\tbeq _0810EB76\n" + "\tldr r0, _0810EB8C @ =gUnknown_083F8380\n" + "\tmov r8, r0\n" + "\tadds r6, r2, 0\n" + "_0810EB44:\n" + "\tadds r0, r1, r6\n" + "\tldrb r0, [r0]\n" + "\tlsls r0, 2\n" + "\tadd r0, r8\n" + "\tldr r0, [r0]\n" + "\tlsls r2, r5, 1\n" + "\tadds r2, 0x1\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tmovs r1, 0x1\n" + "\tbl Menu_PrintText\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tcmp r5, 0x4\n" + "\tbhi _0810EB76\n" + "\tlsls r1, r4, 2\n" + "\tadds r0, r1, r6\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x10\n" + "\tbne _0810EB44\n" + "_0810EB76:\n" + "\tadds r0, r7, 0\n" + "_0810EB78:\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_0810EB84: .4byte gUnknown_0203925B\n" + "_0810EB88: .4byte gUnknown_03000760\n" + "_0810EB8C: .4byte gUnknown_083F8380"); +} +#endif + +void sub_810EB90(u8 newPos, u8 maxItems) +{ + if (newPos == 0) + { + gUnknown_0203925C ^= 0x02; + DestroyVerticalScrollIndicator(TOP_ARROW); + } + else + { + sub_810ECB0(); + } + if (newPos + maxItems < gUnknown_0203925A) + { + sub_810ECD4(); + } + else if (newPos + maxItems == gUnknown_0203925A) + { + gUnknown_0203925C ^= 0x01; + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + } +} + +void ShakeScreenInElevator(void) +{ + u8 taskId = CreateTask(sub_810EC34, 9); + gTasks[taskId].data[0] = 1; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 1; + gTasks[taskId].data[5] = 3; + SetCameraPanningCallback(NULL); + sub_810ECFC(); + PlaySE(SE_ELEBETA); +} + +void sub_810EC34(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + task->data[1] ++; + if (task->data[1] % task->data[5] == 0) + { + task->data[1] = 0; + task->data[2] ++; + if (task->data[3] == 0) + { + task->data[4] = -task->data[4]; + SetCameraPanning(0, task->data[4]); + if (task->data[2] == 23) + { + PlaySE(SE_PINPON); + sub_810EC9C(taskId); + InstallCameraPanAheadCallback(); + } + } + } +} + +void sub_810EC9C(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void sub_810ECB0(void) +{ + if (gUnknown_0203925C >> 1 != 1) + { + gUnknown_0203925C |= 0x2; + CreateVerticalScrollIndicators(TOP_ARROW, 0x24, 0x08); + } +} + +void sub_810ECD4(void) +{ + if ((gUnknown_0203925C & 1) == 0) + { + gUnknown_0203925C |= 0x1; + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x24, 0x48); + } +} + +void sub_810ECFC(void) +{ + if (FuncIsActiveTask(sub_810ED40) != TRUE) + { + u8 taskId = CreateTask(sub_810ED40, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = taskId; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + } +} + +void sub_810ED40(u8 taskId) +{ + sub_810ED60(&gTasks[taskId]); +} + +void sub_810ED60(struct Task *task) +{ + if (task->data[3] == 8) + { + task->data[3] = 0; + if (task->data[4] != 0) + { + MapGridSetMetatileIdAt( 7, 7, 0xe68); + MapGridSetMetatileIdAt( 8, 7, 0xe69); + MapGridSetMetatileIdAt( 9, 7, 0xe69); + MapGridSetMetatileIdAt(10, 7, 0xe6a); + MapGridSetMetatileIdAt( 7, 8, 0xe70); + MapGridSetMetatileIdAt( 8, 8, 0xe71); + MapGridSetMetatileIdAt( 9, 8, 0xe71); + MapGridSetMetatileIdAt(10, 8, 0xe72); + MapGridSetMetatileIdAt( 7, 9, 0xe78); + MapGridSetMetatileIdAt( 8, 9, 0xe79); + MapGridSetMetatileIdAt( 9, 9, 0xe79); + MapGridSetMetatileIdAt(10, 9, 0xe7a); + } + else + { + MapGridSetMetatileIdAt( 7, 7, 0xe6b); + MapGridSetMetatileIdAt( 8, 7, 0xe6c); + MapGridSetMetatileIdAt( 9, 7, 0xe6c); + MapGridSetMetatileIdAt(10, 7, 0xe6d); + MapGridSetMetatileIdAt( 7, 8, 0xe73); + MapGridSetMetatileIdAt( 8, 8, 0xe74); + MapGridSetMetatileIdAt( 9, 8, 0xe74); + MapGridSetMetatileIdAt(10, 8, 0xe75); + MapGridSetMetatileIdAt( 7, 9, 0xe7b); + MapGridSetMetatileIdAt( 8, 9, 0xe7c); + MapGridSetMetatileIdAt( 9, 9, 0xe7c); + MapGridSetMetatileIdAt(10, 9, 0xe7d); + } + DrawWholeMapView(); + task->data[4] ^= 1; + task->data[2]++; + if (task->data[2] == 8) + { + DestroyTask(task->data[1]); + } + } + task->data[3]++; +} + +void sub_810EEDC(void) +{ + if ((gUnknown_0203925C & 1) != 0) + { + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + } + if ((gUnknown_0203925C >> 1) == 1) + { + DestroyVerticalScrollIndicator(TOP_ARROW); + } + BuyMenuFreeMemory(); +} + +void SetTrickHouseEndRoomFlag(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = 0x259; + *specVar = flag; + FlagSet(flag); +} + +void ResetTrickHouseEndRoomFlag(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = 0x259; + *specVar = flag; + FlagClear(flag); +} + +bool8 CheckLeadMonCool(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_COOL) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonBeauty(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_BEAUTY) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonCute(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_CUTE) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonSmart(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SMART) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonTough(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_TOUGH) < 200) + { + return FALSE; + } + return TRUE; +} + +void IsGrassTypeInParty(void) +{ + u8 i; + u16 species; + struct Pokemon *pokemon; + for (i=0; i> 1 != 1) + { + gUnknown_0203925C |= 0x02; + CreateVerticalScrollIndicators(TOP_ARROW, 0x2c, 0x08); + } +} + +void sub_810F2B4(void) +{ + if (!(gUnknown_0203925C & 0x01)) + { + gUnknown_0203925C |= 0x01; + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x2c, 0x58); + } +} + +void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) +{ + if (newPos == 0) + { + gUnknown_0203925C ^= 0x02; + DestroyVerticalScrollIndicator(TOP_ARROW); + } + else + { + sub_810F290(); + } + if (newPos + maxItems < gUnknown_0203925A) + { + sub_810F2B4(); + } + else if (newPos + maxItems == gUnknown_0203925A) + { + gUnknown_0203925C ^= 0x01; + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + } +} + +void SpawnCameraDummy(void) +{ + u8 mapObjectId = SpawnSpecialFieldObjectParametrized(7, 8, 0x7f, gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7, 3); + gMapObjects[mapObjectId].mapobj_bit_13 = 1; + CameraObjectSetFollowedObjectId(gMapObjects[mapObjectId].spriteId); +} + +void RemoveCameraDummy(void) +{ + CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); + RemoveFieldObjectByLocalIdAndMap(0x7f, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); +} + +u8 GetPokeblockNameByMonNature(void) +{ + return sub_810CB68(GetNature(&gPlayerParty[GetLeadMonIndex()]), gStringVar1); +} + +void GetSecretBaseNearbyMapName(void) +{ + GetMapSectionName(gStringVar1, VarGet(VAR_SECRET_BASE_MAP), 0); +} + +u16 GetBestBattleTowerStreak(void) +{ + return GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK); +} + +void BufferEReaderTrainerName(void) +{ + SetEReaderTrainerName(gStringVar1); +} + +const u8 gUnknown_083F83E0[] = {12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6}; +const u8 gUnknown_083F83EC[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5}; +const u8 gUnknown_083F83F8[] = {3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5}; + +u8 GetSlotMachineId(void) +{ + u32 v0 = gSaveBlock1.easyChatPairs[0].unk0_0 + gSaveBlock1.easyChatPairs[0].unk2 + gUnknown_083F83E0[gSpecialVar_0x8004]; + if (GetPriceReduction(2)) + { + return gUnknown_083F83F8[v0 % 12]; + } + return gUnknown_083F83EC[v0 % 12]; +} + +bool8 FoundAbandonedShipRoom1Key(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_HIDDEN_ITEM_1F; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 FoundAbandonedShipRoom2Key(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_HIDDEN_ITEM_20; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 FoundAbandonedShipRoom4Key(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_HIDDEN_ITEM_21; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 FoundAbandonedShipRoom6Key(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_HIDDEN_ITEM_22; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 LeadMonHasEffortRibbon(void) +{ + return GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, NULL); +} + +void GivLeadMonEffortRibbon(void) +{ + bool8 ribbonSet; + IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); + FlagSet(FLAG_SYS_RIBBON_GET); + ribbonSet = TRUE; + SetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, &ribbonSet); +} + +bool8 ScrSpecial_AreLeadMonEVsMaxedOut(void) +{ + if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= 510) + { + return TRUE; + } + return FALSE; +} + +u8 TryUpdateRusturfTunnelState(void) +{ + if (!FlagGet(FLAG_RUSTURF_TUNNEL_OPENED) && gSaveBlock1.location.mapGroup == MAP_GROUP(RUSTURF_TUNNEL) && gSaveBlock1.location.mapNum == MAP_NUM(RUSTURF_TUNNEL)) + { + if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1)) + { + VarSet(VAR_RUSTURF_TUNNEL_STATE, 4); + return TRUE; + } + else if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2)) + { + VarSet(VAR_RUSTURF_TUNNEL_STATE, 5); + return TRUE; + } + } + return FALSE; +} + +void SetShoalItemFlag(u16 v0) +{ + FlagSet(0x85f); +} + +void PutZigzagoonInPlayerParty(void) +{ + u16 monData; + CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0); + monData = TRUE; + SetMonData(&gPlayerParty[0], MON_DATA_ALT_ABILITY, &monData); + monData = MOVE_TACKLE; + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, &monData); + monData = MOVE_NONE; + SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, &monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, &monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, &monData); +} + +bool8 IsStarterInParty(void) +{ + u8 i; + u16 starter = GetStarterPokemon(VarGet(VAR_STARTER_MON)); + u8 partyCount = CalculatePlayerPartyCount(); + for (i = 0; i < partyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == starter) + { + return TRUE; + } + } + return FALSE; +} + +bool8 CheckFreePokemonStorageSpace(void) +{ + u16 i, j; + for (i=0; i<14; i++) + { + for (j=0; j<30; j++) + { + if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + { + return TRUE; + } + } + } + return FALSE; +} + +bool8 IsPokerusInParty(void) +{ + if (!CheckPartyPokerus(gPlayerParty, 0x3f)) + { + return FALSE; + } + return TRUE; +} + +static void sub_810F7A8(u8); +static void sub_810F814(u8); + +void sub_810F758(void) +{ + u8 taskId = CreateTask(sub_810F7A8, 9); + gTasks[taskId].data[0] = gSpecialVar_0x8005; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = gSpecialVar_0x8004; + gTasks[taskId].data[5] = 5; + SetCameraPanningCallback(NULL); + PlaySE(SE_W070); +} + +static void sub_810F7A8(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + task->data[1]++; + if ((task->data[1] % task->data[5]) == 0) + { + task->data[1] = 0; + task->data[2]++; + if (task->data[3] == 0) + { + task->data[0] = -task->data[0]; + task->data[4] = -task->data[4]; + SetCameraPanning(task->data[0], task->data[4]); + if (task->data[2] == 8) + { + sub_810F814(taskId); + InstallCameraPanAheadCallback(); + } + } + } +} + +static void sub_810F814(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +bool8 FoundBlackGlasses(void) +{ + return FlagGet(FLAG_HIDDEN_ITEM_BLACK_GLASSES); +} + +void SetRoute119Weather(void) +{ + if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()) != TRUE) + { + SetSav1Weather(0x14); + } +} + +void SetRoute123Weather(void) +{ + if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()) != TRUE) + { + SetSav1Weather(0x15); + } +} + +u8 GetLeadMonIndex(void) +{ + u8 i; + u8 partyCount = CalculatePlayerPartyCount(); + for (i=0; i= 7) + { + return 0; + } + else if (gLocalTime.days < 0) + { + return 8; + } + return 7 - (gLocalTime.days - tmReceivedDay); +} + +u16 SetPacifidlogTMReceivedDay(void) +{ + VarSet(VAR_PACIFIDLOG_TM_RECEIVED_DAY, gLocalTime.days); + return gLocalTime.days; +} + +bool8 MonOTNameMatchesPlayer(void) +{ + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); + if (!StringCompareWithoutExtCtrlCodes(gSaveBlock2.playerName, gStringVar1)) + { + return FALSE; + } + return TRUE; +} + +void BufferLottoTicketNumber(void) +{ + if (gSpecialVar_Result >= 10000) + { + sub_80BF088(0, gSpecialVar_Result); + } + else if (gSpecialVar_Result >= 1000) + { + gStringVar1[0] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 1, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); + } + else if (gSpecialVar_Result >= 100) + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 2, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); + } + else if (gSpecialVar_Result >= 10) + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + gStringVar1[2] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 3, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); + } + else + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + gStringVar1[2] = CHAR_0; + gStringVar1[3] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 4, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result)); + } +} + +const u8 gUnknown_083F8404[] = {2, 1, 2, 1}; +const u8 gUnknown_083F8408[] = {8, 9, 10, 11, 12, 13, 14, 15}; +const u8 gUnknown_083F8410[] = {8, 13, 14, 11, 10, 12, 15, 9}; + +bool8 sub_810FF30(void); +void UpdateMovedLilycoveFanClubMembers(void); +void sub_810FF48(void); +void sub_810FD80(void); +u16 GetNumMovedLilycoveFanClubMembers(void); +int sub_810FB9C(void); + +void ResetFanClub(void) +{ + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = 0; + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = 0; +} + +void sub_810FA74(void) +{ + if (sub_810FF30()) + { + UpdateMovedLilycoveFanClubMembers(); + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; + } +} + +void sub_810FAA0(void) +{ + if (!((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 1)) + { + sub_810FF48(); + sub_810FD80(); + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; + FlagClear(FLAG_HIDE_FANCLUB_OLD_LADY); + FlagClear(FLAG_HIDE_FANCLUB_BOY); + FlagClear(FLAG_HIDE_FANCLUB_LITTLE_BOY); + FlagClear(FLAG_HIDE_FANCLUB_LADY); + VarSet(VAR_LILYCOVE_FAN_CLUB_STATE, 1); + } +} + +u8 sub_810FB10(u8 a0) +{ + if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) + { + if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7f) + gUnknown_083F8404[a0] >= 20) + { + if (GetNumMovedLilycoveFanClubMembers() < 3) + { + sub_810FB9C(); + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] &= 0xff80; + } + else + { + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0xff80) | 20; + } + } + else + { + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] += gUnknown_083F8404[a0]; + } + } + return gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7f; +} + +int sub_810FB9C(void) +{ + u8 i; + int retval = 0; + for (i=0; i<8; i++) + { + if (!((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8408[i]) & 0x01)) + { + retval = i; + if (Random() & 1) + { + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= (1 << gUnknown_083F8408[i]); + return retval; + } + } + } + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= (1 << gUnknown_083F8408[retval]); + return retval; +} + +int sub_810FC18(void) +{ + u8 i; + int retval = 0; + if (GetNumMovedLilycoveFanClubMembers() == 1) + { + return 0; + } + for (i=0; i<8; i++) + { + if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8410[i]) & 1) + { + retval = i; + if (Random() & 1) + { + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= (1 << gUnknown_083F8410[i]); + return retval; + } + } + } + if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8410[retval]) & 1) + { + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= (1 << gUnknown_083F8410[retval]); + } + return retval; +} + +u16 GetNumMovedLilycoveFanClubMembers(void) +{ + u8 i; + u8 retval = 0; + for (i = 0; i < 8; i++) + { + if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> (i + 8)) & 1) + { + retval++; + } + } + + return retval; +} + +void UpdateMovedLilycoveFanClubMembers(void) +{ + u8 i = 0; + if (gSaveBlock2.playTimeHours < 999) + { + while (1) + { + if (GetNumMovedLilycoveFanClubMembers() < 5) + { + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours; + break; + } + else if (i == 8) + { + break; + } + else if (gSaveBlock2.playTimeHours - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] < 12) + { + return; + } + sub_810FC18(); + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] += 12; + i++; + } + } +} + +bool8 ShouldMoveLilycoveFanClubMember(void) +{ + return (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gSpecialVar_0x8004) & 0x01; +} + +void sub_810FD80(void) +{ + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x2000; + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x100; + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x400; +} + +void sub_810FE1C(void *, u8, u8); + +void BufferStreakTrainerText(void) +{ + u8 a = 0; + u8 b = 0; + switch (gSpecialVar_0x8004) + { + case 8: + break; + case 9: + break; + case 10: + a = 0; + b = 3; + break; + case 11: + a = 0; + b = 1; + break; + case 12: + a = 1; + b = 0; + break; + case 13: + a = 0; + b = 4; + break; + case 14: + a = 1; + b = 5; + break; + case 15: + break; + } + sub_810FE1C(gSaveBlock1.linkBattleRecords, a, b); +} + +void sub_810FE1C(void *linkRecords, u8 a, u8 b) +{ + u8 *curRecord = (linkRecords + 16 * a); + if (*curRecord == EOS) + { + switch (b) + { + case 0: + StringCopy(gStringVar1, gOtherText_Wallace); + break; + case 1: + StringCopy(gStringVar1, gOtherText_Steven); + break; + case 2: + StringCopy(gStringVar1, gOtherText_Brawly); + break; + case 3: + StringCopy(gStringVar1, gOtherText_Winona); + break; + case 4: + StringCopy(gStringVar1, gOtherText_Phoebe); + break; + case 5: + StringCopy(gStringVar1, gOtherText_Glacia); + break; + default: + StringCopy(gStringVar1, gOtherText_Wallace); + break; + } + } + else + { + StringCopyN(gStringVar1, curRecord, 7); + gStringVar1[7] = EOS; + if (gStringVar1[0] == 0xfc && gStringVar1[1] == 0x15) + { + ConvertInternationalString(gStringVar1, 1); + } + } +} + +void sub_810FEFC(void) +{ + if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) + { + sub_810FA74(); + if (gBattleOutcome == 1) + { + sub_810FB9C(); + } + else + { + sub_810FC18(); + } + } +} + +bool8 sub_810FF30(void) +{ + return (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 0x01; +} + +void sub_810FF48(void) +{ + gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x80; +} + +u8 sub_810FF60(void) +{ + return sub_810FB10(gSpecialVar_0x8004); +} diff --git a/src/field_tasks.c b/src/field_tasks.c new file mode 100644 index 000000000..ce5fc6c0e --- /dev/null +++ b/src/field_tasks.c @@ -0,0 +1,864 @@ +#include "global.h" +#include "task.h" +#include "main.h" +#include "constants/vars.h" +#include "bike.h" +#include "item.h" +#include "constants/items.h" +#include "event_data.h" +#include "overworld.h" +#include "clock.h" +#include "script.h" +#include "field_special_scene.h" +#include "field_effect_helpers.h" +#include "secret_base.h" +#include "metatile_behavior.h" +#include "fieldmap.h" +#include "field_player_avatar.h" +#include "field_camera.h" +#include "constants/songs.h" +#include "sound.h" +#include "field_tasks.h" + +void DummyPerStepCallback(u8); +void PerStepCallback_8069F64(u8); +void PerStepCallback_8069AA0(u8); +void PerStepCallback_8069864(u8); +void PerStepCallback_8069DD4(u8); +void PerStepCallback_806A07C(u8); + +void (*const gUnknown_08376364[])(u8) = { + DummyPerStepCallback, + PerStepCallback_8069F64, + PerStepCallback_8069AA0, + PerStepCallback_8069864, + PerStepCallback_8069DD4, + EndTruckSequence, + sub_80BCF1C, + PerStepCallback_806A07C +}; + +void Task_RunPerStepCallback(u8 taskId) +{ + int idx = gTasks[taskId].data[0]; + gUnknown_08376364[idx](taskId); +} + +#define tState data[0] +#define tAmbientCryState data[1] +#define tAmbientCryDelay data[2] + +static void RunTimeBasedEvents(s16 *data) +{ + switch (tState) + { + case 0: + if (gMain.vblankCounter1 & 0x1000) + { + DoTimeBasedEvents(); + tState++; + } + break; + case 1: + if (!(gMain.vblankCounter1 & 0x1000)) + { + tState--; + } + break; + } +} + +void Task_RunTimeBasedEvents(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (!ScriptContext2_IsEnabled()) + { + RunTimeBasedEvents(data); + UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay); + } +} + +#undef tState +#undef tAmbientCryState +#undef tAmbientCryDelay + +void Task_MuddySlope(u8); + +void SetUpFieldTasks(void) +{ + if (!FuncIsActiveTask(Task_RunPerStepCallback)) + { + u8 taskId = CreateTask(Task_RunPerStepCallback, 0x50); + gTasks[taskId].data[0] = 0; + } + if (!FuncIsActiveTask(Task_MuddySlope)) + { + CreateTask(Task_MuddySlope, 0x50); + } + if (!FuncIsActiveTask(Task_RunTimeBasedEvents)) + { + CreateTask(Task_RunTimeBasedEvents, 0x50); + } +} + +void ActivatePerStepCallback(u8 callback) +{ + s16 *dataPointer; + s16 *dataStart; + s16 zero; + u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); + if (taskId != 0xff) + { + dataStart = gTasks[taskId].data; + zero = 0; + dataPointer = &dataStart[15]; + do + { + *dataPointer-- = zero; + } while ((int)dataPointer >= (int)dataStart); + if (callback >= ARRAY_COUNT(gUnknown_08376364)) + { + *dataStart = 0; + } + else + { + *dataStart = callback; + } + } +} + +void ResetFieldTasksArgs(void) +{ + u8 taskId; + s16 *taskData; + taskId = FindTaskIdByFunc(Task_RunPerStepCallback); + if (taskId != 0xff) + { + taskData = gTasks[taskId].data; + } + taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); + if (taskId != 0xff) + { + taskData = gTasks[taskId].data; + taskData[1] = 0; + taskData[2] = 0; + } +} + +const struct MetatileOffset gUnknown_08376384[][2] = { + {{ 0, 0,0x259}, { 0, 1,0x261}}, + {{ 0, -1,0x259}, { 0, 0,0x261}}, + {{ 0, 0,0x252}, { 1, 0,0x253}}, + {{ -1, 0,0x252}, { 0, 0,0x253}} +}; + +const struct MetatileOffset gUnknown_083763A4[][2] = { + {{ 0, 0,0x25A}, { 0, 1,0x262}}, + {{ 0, -1,0x25A}, { 0, 0,0x262}}, + {{ 0, 0,0x254}, { 1, 0,0x255}}, + {{ -1, 0,0x254}, { 0, 0,0x255}} +}; + +const struct MetatileOffset gUnknown_083763C4[][2] = { + {{ 0, 0,0x258}, { 0, 1,0x260}}, + {{ 0, -1,0x258}, { 0, 0,0x260}}, + {{ 0, 0,0x250}, { 1, 0,0x251}}, + {{ -1, 0,0x250}, { 0, 0,0x251}} +}; + +void DummyPerStepCallback(u8 taskId) {} + +const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8 a1) +{ + if (sub_80576A0(a1)) + { + return a0[0]; + } + else if (sub_80576B4(a1)) + { + return a0[1]; + } + else if (sub_80576C8(a1)) + { + return a0[2]; + } + else if (sub_80576DC(a1)) + { + return a0[3]; + } + else + { + return NULL; + } +} + +#ifdef NONMATCHING +void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) +{ + const struct MetatileOffset *offsetData = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y)); + const struct MetatileOffset *offsetdata2 = offsetData; + if (offsetData != NULL) + { + MapGridSetMetatileIdAt(x + offsetData[0].x, y + offsetData[0].y, offsetData[0].tileId); + if (flag) + { + CurrentMapDrawMetatileAt(x + offsetData[0].x, y + offsetData[0].y); + } + MapGridSetMetatileIdAt(x + offsetdata2[1].x, y + offsetdata2[1].y, offsetdata2[1].tileId); + if (flag) + { + CurrentMapDrawMetatileAt(x + offsetdata2[1].x, y + offsetdata2[1].y); + } + } +} +#else +__attribute__((naked)) +void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tadds r5, r0, 0\n" + "\tmov r8, r3\n" + "\tlsls r1, 16\n" + "\tasrs r6, r1, 16\n" + "\tlsls r2, 16\n" + "\tasrs r7, r2, 16\n" + "\tadds r0, r6, 0\n" + "\tadds r1, r7, 0\n" + "\tbl MapGridGetMetatileBehaviorAt\n" + "\tadds r1, r0, 0\n" + "\tlsls r1, 16\n" + "\tlsrs r1, 16\n" + "\tadds r0, r5, 0\n" + "\tbl sub_80695E0\n" + "\tadds r4, r0, 0\n" + "\tadds r5, r4, 0\n" + "\tcmp r4, 0\n" + "\tbeq _080696B6\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r4, r0]\n" + "\tadds r0, r6, r0\n" + "\tmovs r1, 0x1\n" + "\tldrsb r1, [r4, r1]\n" + "\tadds r1, r7, r1\n" + "\tldrh r2, [r4, 0x2]\n" + "\tbl MapGridSetMetatileIdAt\n" + "\tmov r0, r8\n" + "\tcmp r0, 0\n" + "\tbeq _0806968E\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r4, r0]\n" + "\tadds r0, r6, r0\n" + "\tmovs r1, 0x1\n" + "\tldrsb r1, [r4, r1]\n" + "\tadds r1, r7, r1\n" + "\tbl CurrentMapDrawMetatileAt\n" + "_0806968E:\n" + "\tmovs r0, 0x4\n" + "\tldrsb r0, [r5, r0]\n" + "\tadds r0, r6, r0\n" + "\tmovs r1, 0x5\n" + "\tldrsb r1, [r5, r1]\n" + "\tadds r1, r7, r1\n" + "\tldrh r2, [r5, 0x6]\n" + "\tbl MapGridSetMetatileIdAt\n" + "\tmov r0, r8\n" + "\tcmp r0, 0\n" + "\tbeq _080696B6\n" + "\tmovs r0, 0x4\n" + "\tldrsb r0, [r5, r0]\n" + "\tadds r0, r6, r0\n" + "\tmovs r1, 0x5\n" + "\tldrsb r1, [r5, r1]\n" + "\tadds r1, r7, r1\n" + "\tbl CurrentMapDrawMetatileAt\n" + "_080696B6:\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +void sub_80696C0(s16 x, s16 y, bool32 flag) +{ + sub_8069638(gUnknown_08376384, x, y, flag); +} + +void sub_80696E4(s16 x, s16 y, bool32 flag) +{ + sub_8069638(gUnknown_083763A4, x, y, flag); +} + +void sub_8069708(s16 x, s16 y, bool32 flag) +{ + sub_8069638(gUnknown_083763C4, x, y, flag); +} + +bool32 sub_806972C(s16 x1, s16 y1, s16 x2, s16 y2) +{ + s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x2, y2); + if (sub_80576A0(metatileBehavior)) + { + if (y1 > y2) + { + return FALSE; + } + } + else if (sub_80576B4(metatileBehavior)) + { + if (y1 < y2) + { + return FALSE; + } + } + else if (sub_80576C8(metatileBehavior)) + { + if (x1 > x2) + { + return FALSE; + } + } + else if (sub_80576DC(metatileBehavior)) + { + if (x1 < x2) + { + return FALSE; + } + } + return TRUE; +} + +bool32 sub_80697C8(s16 x1, s16 y1, s16 x2, s16 y2) +{ + s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x1, y1); + if (sub_80576A0(metatileBehavior)) + { + if (y1 < y2) + { + return FALSE; + } + } + else if (sub_80576B4(metatileBehavior)) + { + if (y1 > y2) + { + return FALSE; + } + } + else if (sub_80576C8(metatileBehavior)) + { + if (x1 < x2) + { + return FALSE; + } + } + else if (sub_80576DC(metatileBehavior)) + { + if (x1 > x2) + { + return FALSE; + } + } + return TRUE; +} + +void PerStepCallback_8069864(u8 taskId) +{ + s16 *data; + s16 x, y; + data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + switch (data[1]) + { + case 0: + data[2] = x; + data[3] = y; + sub_80696E4(x, y, TRUE); + data[1] = 1; + break; + case 1: + if (x != data[2] || y != data[3]) + { + if (sub_806972C(x, y, data[2], data[3])) + { + sub_80696C0(data[2], data[3], TRUE); + sub_8069708(data[2], data[3], FALSE); + data[4] = data[2]; + data[5] = data[3]; + data[1] = 2; + data[6] = 8; + } + else + { + data[4] = -1; + data[5] = -1; + } + if (sub_80697C8(x, y, data[2], data[3])) + { + sub_80696C0(x, y, TRUE); + data[1] = 2; + data[6] = 8; + } + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsPacifidlogLog(MapGridGetMetatileBehaviorAt(x, y))) + { + PlaySE(SE_MIZU); + } + } + break; + case 2: + if ((--data[6]) == 0) + { + sub_80696E4(x, y, TRUE); + if (data[4] != -1 && data[5] != -1) + { + sub_8069708(data[4], data[5], TRUE); + } + data[1] = 1; + } + break; + } +} + +void sub_80699D8(s16 x, s16 y) +{ + u8 z = PlayerGetZCoord(); + if (!(z & 0x01)) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x24e: + MapGridSetMetatileIdAt(x, y, 0x24f); + break; + case 0x256: + MapGridSetMetatileIdAt(x, y, 0x257); + break; + } + } +} + +void sub_8069A3C(s16 x, s16 y) +{ + u8 z = PlayerGetZCoord(); + if (!(z & 0x01)) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x24f: + MapGridSetMetatileIdAt(x, y, 0x24e); + break; + case 0x257: + MapGridSetMetatileIdAt(x, y, 0x256); + break; + } + } +} + +void PerStepCallback_8069AA0(u8 taskId) +{ + bool8 isFortreeBridgeCur; + bool8 isFortreeBridgePrev; + u8 z, flag; + s16 x, y, x2, y2; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + switch (data[1]) + { + default: + break; + case 0: + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y))) + { + sub_80699D8(x, y); + CurrentMapDrawMetatileAt(x, y); + } + data[1] = 1; + break; + case 1: + x2 = data[2]; + y2 = data[3]; + if (x == x2 && y == y2) + { + break; + } + isFortreeBridgeCur = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y)); + isFortreeBridgePrev = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x2, y2)); + z = PlayerGetZCoord(); + flag = 0; + if ((u8)(z & 1) == 0) + { + flag = 1; + } + if (flag && (isFortreeBridgeCur == 1 || isFortreeBridgePrev == 1)) + { + PlaySE(SE_HASHI); + } + if (isFortreeBridgePrev) + { + sub_8069A3C(x2, y2); + CurrentMapDrawMetatileAt(x2, y2); + sub_80699D8(x, y); + CurrentMapDrawMetatileAt(x, y); + } + data[4] = x2; + data[5] = y2; + data[2] = x; + data[3] = y; + if (!isFortreeBridgePrev) + { + break; + } + data[6] = 16; + data[1] = 2; + // fallthrough + case 2: + data[6]--; + x2 = data[4]; + y2 = data[5]; + switch (data[6] % 7) + { + case 0: + CurrentMapDrawMetatileAt(x2, y2); + case 1: + case 2: + case 3: + break; + case 4: + sub_80699D8(x2, y2); + CurrentMapDrawMetatileAt(x2, y2); + sub_8069A3C(x2, y2); + case 5: + case 6: + case 7: + break; + } + if (data[6] == 0) + { + data[1] = 1; + } + break; + } +} + +const u16 gUnknown_083763E4[] = { + 0, + 0, + 0, + 0, + 0, + 0, + VAR_TEMP_1, + VAR_TEMP_2, + VAR_TEMP_3, + VAR_TEMP_4, + 0, + 0, + VAR_TEMP_5, + VAR_TEMP_6, + VAR_TEMP_7, + 0, + 0, + VAR_TEMP_8, + VAR_TEMP_9, + VAR_TEMP_A, + 0, + 0, + 0, + 0, + 0, + 0 +}; + +bool32 sub_8069CB8(s16 x, s16 y) +{ + if ((u16)(x - 3) < 11 && (u16)(y - 6) < 14 && gUnknown_083763E4[y]) + { + return TRUE; + } + return FALSE; +} + +void sub_8069CFC(s16 x, s16 y) +{ + if (sub_8069CB8(x, y)) + { + *GetVarPointer(gUnknown_083763E4[y]) |= (1 << (x - 3)); + } +} + +bool32 sub_8069D34(s16 x, s16 y) +{ + u32 var; + if (!sub_8069CB8(x, y)) + { + return FALSE; + } + var = VarGet(gUnknown_083763E4[y]) << 16; + if (((1 << 16) << (x - 3)) & var) + { + return TRUE; + } + return FALSE; +} + +void SetSootopolisGymCrackedIceMetatiles(void) +{ + s32 x, y; + s32 width = gMapHeader.mapData->width; + s32 height = gMapHeader.mapData->height; + for (x = 0; x < width; x++) + { + for (y = 0; y < height; y++) + { + if (sub_8069D34(x, y) == TRUE) + { + MapGridSetMetatileIdAt(x + 7, y + 7, 0x20e); + } + } + } +} + +void PerStepCallback_8069DD4(u8 taskId) +{ + s16 x, y; + u16 tileBehavior; + u16 *var; + s16 *data = gTasks[taskId].data; + switch (data[1]) + { + case 0: + PlayerGetDestCoords(&x, &y); + data[2] = x; + data[3] = y; + data[1] = 1; + break; + case 1: + PlayerGetDestCoords(&x, &y); + if (x != data[2] || y != data[3]) + { + data[2] = x; + data[3] = y; + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + var = GetVarPointer(VAR_ICE_STEP_COUNT); + if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE) + { + (*var)++; + data[6] = 4; + data[1] = 2; + data[4] = x; + data[5] = y; + } + else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE) + { + *var = 0; + data[6] = 4; + data[1] = 3; + data[4] = x; + data[5] = y; + } + } + break; + case 2: + if (data[6] != 0) + { + data[6]--; + } + else + { + x = data[4]; + y = data[5]; + PlaySE(SE_RU_BARI); + MapGridSetMetatileIdAt(x, y, 0x20e); + CurrentMapDrawMetatileAt(x, y); + sub_8069CFC(x - 7, y - 7); + data[1] = 1; + } + break; + case 3: + if (data[6] != 0) + { + data[6]--; + } + else + { + x = data[4]; + y = data[5]; + PlaySE(SE_RU_GASYAN); + MapGridSetMetatileIdAt(x, y, 0x206); + CurrentMapDrawMetatileAt(x, y); + data[1] = 1; + } + break; + } +} + +void PerStepCallback_8069F64(u8 taskId) +{ + s16 x, y; + u16 *var; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + if (x != data[1] || y != data[2]) + { + data[1] = x; + data[2] = y; + if (MetatileBehavior_IsAshGrass(MapGridGetMetatileBehaviorAt(x, y))) + { + if (MapGridGetMetatileIdAt(x, y) == 0x20a) + { + ash(x, y, 0x212, 4); + } + else + { + ash(x, y, 0x206, 4); + } + if (CheckBagHasItem(ITEM_SOOT_SACK, 1)) + { + var = GetVarPointer(VAR_ASH_GATHER_COUNT); + if (*var < 9999) + { + (*var)++; + } + } + } + } +} + +void sub_806A040(s16 x, s16 y) +{ + MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == 0x22f ? 0x206 : 0x237); + CurrentMapDrawMetatileAt(x, y); +} + +void PerStepCallback_806A07C(u8 taskId) +{ + s16 x, y; + u16 behavior; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + if (data[4] != 0 && (--data[4]) == 0) + { + sub_806A040(data[5], data[6]); + } + if (data[7] != 0 && (--data[7]) == 0) + { + sub_806A040(data[8], data[9]); + } + if (MetatileBehavior_IsCrackedFloorHole(behavior)) + { + VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty + } + if ((x != data[2] || y != data[3])) + { + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsCrackedFloor(behavior)) + { + if (GetPlayerSpeed() != 4) + { + VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty + } + if (data[4] == 0) + { + data[4] = 3; + data[5] = x; + data[6] = y; + } + else if (data[7] == 0) + { + data[7] = 3; + data[8] = x; + data[9] = y; + } + } + } +} + +const u16 gUnknown_08376418[] = {0xe8, 0xeb, 0xea, 0xe9}; + +void sub_806A18C(s16 *data, s16 x, s16 y) +{ + u16 tile; + if ((--data[0]) == 0) + { + tile = 0xe8; + } + else + { + tile = gUnknown_08376418[data[0] / 8]; + } + MapGridSetMetatileIdAt(x, y, tile); + CurrentMapDrawMetatileAt(x, y); + MapGridSetMetatileIdAt(x, y, 0xe8); +} + +void Task_MuddySlope(u8 taskId) +{ + s16 x, y, x2, y2; + int i; + u16 mapIndices; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + mapIndices = (gSaveBlock1.location.mapGroup << 8) | gSaveBlock1.location.mapNum; + switch (data[1]) + { + case 0: + data[0] = mapIndices; + data[2] = x; + data[3] = y; + data[1] = 1; + data[4] = 0; + data[7] = 0; + data[10] = 0; + data[13] = 0; + break; + case 1: + if (data[2] != x || data[3] != y) + { + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsMuddySlope(MapGridGetMetatileBehaviorAt(x, y))) + { + for (i=4; i<14; i+=3) + { + if (data[i] == 0) + { + data[i] = 32; + data[i + 1] = x; + data[i + 2] = y; + break; + } + } + } + } + break; + } + if (gCamera.field_0 && mapIndices != data[0]) + { + data[0] = mapIndices; + x2 = gCamera.x; + y2 = gCamera.y; + } + else + { + x2 = 0; + y2 = 0; + } + for (i=4; i<14; i+=3) + { + if (data[i]) + { + data[i + 1] -= x2; + data[i + 2] -= y2; + sub_806A18C(&data[i], data[i + 1], data[i + 2]); + } + } +} diff --git a/src/field_weather.c b/src/field_weather.c new file mode 100644 index 000000000..5857145ef --- /dev/null +++ b/src/field_weather.c @@ -0,0 +1,1310 @@ +#include "global.h" +#include "constants/songs.h" +#include "constants/weather.h" +#include "blend_palette.h" +#include "event_object_movement.h" +#include "field_weather.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "random.h" +#include "script.h" +#include "start_menu.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "ewram.h" + +#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) + +enum +{ + GAMMA_NONE, + GAMMA_NORMAL, + GAMMA_ALT, +}; + +struct RGBColor +{ + u16 r:5; + u16 g:5; + u16 b:5; +}; + +struct WeatherPaletteData +{ + u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes. +}; + +struct WeatherCallbacks +{ + void (*initVars)(void); + void (*main)(void); + void (*initAll)(void); + bool8 (*finish)(void); +}; + +EWRAM_DATA struct Weather gWeather = {0}; +EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0}; +EWRAM_DATA u16 gUnknown_0202FF58 = 0; + +static const u8 *sPaletteGammaTypes; + +const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz"); +const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz"); +const u8 DroughtPaletteData_2[] = INCBIN_U8("graphics/weather/drought2.bin.lz"); +const u8 DroughtPaletteData_3[] = INCBIN_U8("graphics/weather/drought3.bin.lz"); +const u8 DroughtPaletteData_4[] = INCBIN_U8("graphics/weather/drought4.bin.lz"); +const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz"); + +static const u8 *const sCompressedDroughtPalettes[] = +{ + DroughtPaletteData_0, + DroughtPaletteData_1, + DroughtPaletteData_2, + DroughtPaletteData_3, + DroughtPaletteData_4, + DroughtPaletteData_5, + (u8*)eDroughtPaletteData.gammaShiftColors, +}; + +// This is a pointer to gWeather. All code in this file accesses gWeather directly, +// while code in other field weather files accesses gWeather through this pointer. +// This is likely the result of compiler optimization, since using the pointer in +// this file produces the same result as accessing gWeather directly. +struct Weather *const gWeatherPtr = &gWeather; + +static bool8 LightenSpritePaletteInFog(u8); +static void BuildGammaShiftTables(void); +static void UpdateWeatherGammaShift(void); +static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex); +static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void ApplyFogBlend(u8 blendCoeff, u16 blendColor); +static bool8 FadeInScreen_RainShowShade(void); +static bool8 FadeInScreen_Drought(void); +static bool8 FadeInScreen_Fog1(void); +static void FadeInScreenWithWeather(void); +static void DoNothing(void); +void None_Init(void); +void None_Main(void); +bool8 None_Finish(void); +void Clouds_InitVars(void); +void Clouds_Main(void); +void Clouds_InitAll(void); +bool8 Clouds_Finish(void); +void Weather2_InitVars(void); +void Weather2_Main(void); +void Weather2_InitAll(void); +bool8 Weather2_Finish(void); +void LightRain_InitVars(void); +void LightRain_Main(void); +void LightRain_InitAll(void); +bool8 LightRain_Finish(void); +void Snow_InitVars(void); +void Snow_Main(void); +void Snow_InitAll(void); +bool8 Snow_Finish(void); +void MedRain_InitVars(void); +void Rain_Main(void); +void MedRain_InitAll(void); +bool8 Rain_Finish(void); +void Fog1_InitVars(void); +void Fog1_Main(void); +void Fog1_InitAll(void); +bool8 Fog1_Finish(void); +void Ash_InitVars(void); +void Ash_Main(void); +void Ash_InitAll(void); +bool8 Ash_Finish(void); +void Sandstorm_InitVars(void); +void Sandstorm_Main(void); +void Sandstorm_InitAll(void); +bool8 Sandstorm_Finish(void); +void Fog2_InitVars(void); +void Fog2_Main(void); +void Fog2_InitAll(void); +bool8 Fog2_Finish(void); +void Fog1_InitVars(void); +void Fog1_Main(void); +void Fog1_InitAll(void); +bool8 Fog1_Finish(void); +void Shade_InitVars(void); +void Shade_Main(void); +void Shade_InitAll(void); +bool8 Shade_Finish(void); +void Drought_InitVars(void); +void Drought_Main(void); +void Drought_InitAll(void); +bool8 Drought_Finish(void); +void HeavyRain_InitVars(void); +void Rain_Main(void); +void HeavyRain_InitAll(void); +bool8 Rain_Finish(void); +void Bubbles_InitVars(void); +void Bubbles_Main(void); +void Bubbles_InitAll(void); +bool8 Bubbles_Finish(void); + +static const struct WeatherCallbacks sWeatherFuncs[] = +{ + {None_Init, None_Main, None_Init, None_Finish}, + {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish}, + {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish}, + {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, + {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish}, + {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish}, + {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, + {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish}, + {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish}, + {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish}, + {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, + {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish}, + {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish}, + {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish}, + {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish}, +}; + +void (*const gWeatherPalStateFuncs[])(void) = +{ + UpdateWeatherGammaShift, // WEATHER_PAL_STATE_CHANGING_WEATHER + FadeInScreenWithWeather, // WEATHER_PAL_STATE_SCREEN_FADING_IN + DoNothing, // WEATHER_PAL_STATE_SCREEN_FADING_OUT + DoNothing, // WEATHER_PAL_STATE_IDLE +}; + +// This table specifies which of the gamma shift tables should be +// applied to each of the background and sprite palettes. +static const u8 sBasePaletteGammaTypes[32] = +{ + // background palettes + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NONE, + GAMMA_NONE, + // sprite palettes + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, +}; + +#if DEBUG + +static const u8 sDebugText_Weather_None[] = _("なし   "); // "none" +static const u8 sDebugText_Weather_Clear[] = _("はれ   "); // "clear" +static const u8 sDebugText_Weather_Clear2[] = _("はれ2  "); // "clear2" +static const u8 sDebugText_Weather_Rain[] = _("あめ   "); // "rain" +static const u8 sDebugText_Weather_Snow[] = _("ゆき   "); // "snow" +static const u8 sDebugText_Weather_Lightning[] = _("かみなり "); // "lightning" +static const u8 sDebugText_Weather_Fog[] = _("きり   "); // "fog" +static const u8 sDebugText_Weather_VolcanicAsh[] = _("かざんばい"); // "volcanic ash" +static const u8 sDebugText_Weather_Sandstorm[] = _("すなあらし"); // "sandstorm +static const u8 sDebugText_Weather_Fog2[] = _("きり2  "); // "fog2" +static const u8 sDebugText_Weather_Underwater[] = _("かいてい "); // "undersea" +static const u8 sDebugText_Weather_Cloudy[] = _("くもり  "); // "cloudy" +static const u8 sDebugText_Weather_Clear3[] = _("はれ3  "); // "clear3" +static const u8 sDebugText_Weather_HeavyRain[] = _("おおあめ"); // "heavy rain" +static const u8 sDebugText_Weather_Underwater2[] = _("かいてい2"); // "undersea2" + +static const u8 *const sDebugText_Weather[] = +{ + [WEATHER_NONE] = sDebugText_Weather_None, + [WEATHER_CLOUDS] = sDebugText_Weather_Clear, + [WEATHER_SUNNY] = sDebugText_Weather_Clear2, + [WEATHER_RAIN_LIGHT] = sDebugText_Weather_Rain, + [WEATHER_SNOW] = sDebugText_Weather_Snow, + [WEATHER_RAIN_MED] = sDebugText_Weather_Lightning, + [WEATHER_FOG_1] = sDebugText_Weather_Fog, + [WEATHER_ASH] = sDebugText_Weather_VolcanicAsh, + [WEATHER_SANDSTORM] = sDebugText_Weather_Sandstorm, + [WEATHER_FOG_2] = sDebugText_Weather_Fog2, + [WEATHER_FOG_3] = sDebugText_Weather_Underwater, + [WEATHER_SHADE] = sDebugText_Weather_Cloudy, + [WEATHER_DROUGHT] = sDebugText_Weather_Clear3, + [WEATHER_RAIN_HEAVY] = sDebugText_Weather_HeavyRain, + [WEATHER_BUBBLES] = sDebugText_Weather_Underwater2, +}; + +#endif + +const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); + +void StartWeather(void) +{ + u8 index; + + if (!FuncIsActiveTask(Task_WeatherMain)) + { + index = AllocSpritePalette(0x1200); + CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); + BuildGammaShiftTables(); + gWeatherPtr->altGammaSpritePalIndex = index; + gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(0x1201); + gWeatherPtr->rainSpriteCount = 0; + gWeatherPtr->unknown_6D8 = 0; + gWeatherPtr->cloudSpritesCreated = 0; + gWeatherPtr->snowflakeSpriteCount = 0; + gWeatherPtr->ashSpritesCreated = 0; + gWeatherPtr->fog1SpritesCreated = 0; + gWeatherPtr->fog2SpritesCreated = 0; + gWeatherPtr->sandstormSprites1Created = 0; + gWeatherPtr->sandstormSprites2Created = 0; + gWeatherPtr->unknown_72E = 0; + gWeatherPtr->lightenedFogSpritePalsCount = 0; + Weather_SetBlendCoeffs(16, 0); + gWeatherPtr->currWeather = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + gWeatherPtr->readyForInit = FALSE; + gWeatherPtr->weatherChangeComplete = TRUE; + gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80); + } +} + +void ChangeWeather(u8 weather) +{ + if (weather != WEATHER_RAIN_LIGHT && weather != WEATHER_RAIN_MED && weather != WEATHER_RAIN_HEAVY) + { + PlayRainSoundEffect(); + } + + if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather) + { + sWeatherFuncs[weather].initVars(); + } + + gWeatherPtr->weatherChangeComplete = FALSE; + gWeatherPtr->nextWeather = weather; + gWeatherPtr->finishStep = 0; +} + +void sub_807C988(u8 weather) +{ + PlayRainSoundEffect(); + gWeatherPtr->currWeather = weather; + gWeatherPtr->nextWeather = weather; +} + +void sub_807C9B4(u8 weather) +{ + PlayRainSoundEffect(); + gWeatherPtr->currWeather = weather; + gWeatherPtr->nextWeather = weather; + gWeatherPtr->readyForInit = TRUE; +} + +void Task_WeatherInit(u8 taskId) +{ + // Waits until it's ok to initialize weather. + // When the screen fades in, this is set to TRUE. + if (gWeatherPtr->readyForInit) + { + sWeatherFuncs[gWeatherPtr->currWeather].initAll(); + gTasks[taskId].func = Task_WeatherMain; + } +} + +void Task_WeatherMain(u8 taskId) +{ + if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather) + { + if (!sWeatherFuncs[gWeatherPtr->currWeather].finish()) + { + // Finished cleaning up previous weather. Now transition to next weather. + sWeatherFuncs[gWeatherPtr->nextWeather].initVars(); + gWeatherPtr->gammaStepFrameCounter = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; + gWeatherPtr->currWeather = gWeatherPtr->nextWeather; + gWeatherPtr->weatherChangeComplete = TRUE; + } + } + else + { + sWeatherFuncs[gWeatherPtr->currWeather].main(); + } + + gWeatherPalStateFuncs[gWeatherPtr->palProcessingState](); +} + +void None_Init(void) +{ + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 0; +} + +void None_Main(void) +{ +} + +u8 None_Finish(void) +{ + return 0; +} + +// Builds two tables that contain gamma shifts for palette colors. +// It's unclear why the two tables aren't declared as const arrays, since +// this function always builds the same two tables. +static void BuildGammaShiftTables(void) +{ + u16 v0; + u8 (*v1)[32]; + u16 v2; + u16 v4; + u16 v5; + u16 v6; + u16 v9; + u32 v10; + u16 v11; + s16 dunno; + + sPaletteGammaTypes = sBasePaletteGammaTypes; + for (v0 = 0; v0 <= 1; v0++) + { + if (v0 == 0) + v1 = gWeatherPtr->gammaShifts; + else + v1 = gWeatherPtr->altGammaShifts; + + for (v2 = 0; v2 < 32; v2++) + { + v4 = v2 << 8; + if (v0 == 0) + v5 = (v2 << 8) / 16; + else + v5 = 0; + for (v6 = 0; v6 <= 2; v6++) + { + v4 = (v4 - v5); + v1[v6][v2] = v4 >> 8; + } + v9 = v4; + v10 = 0x1f00 - v4; + if ((0x1f00 - v4) < 0) + { + v10 += 0xf; + } + v11 = v10 >> 4; + if (v2 < 12) + { + for (; v6 < 19; v6++) + { + v4 += v11; + dunno = v4 - v9; + if (dunno > 0) + v4 -= (dunno + ((u16)dunno >> 15)) >> 1; + v1[v6][v2] = v4 >> 8; + if (v1[v6][v2] > 0x1f) + v1[v6][v2] = 0x1f; + } + } + else + { + for (; v6 < 19; v6++) + { + v4 += v11; + v1[v6][v2] = v4 >> 8; + if (v1[v6][v2] > 0x1f) + v1[v6][v2] = 0x1f; + } + } + } + } +} + +// When the weather is changing, it gradually updates the palettes +// towards the desired gamma shift. +static void UpdateWeatherGammaShift(void) +{ + if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) + { + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + } + else + { + if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay) + { + gWeatherPtr->gammaStepFrameCounter = 0; + if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex) + gWeatherPtr->gammaIndex++; + else + gWeatherPtr->gammaIndex--; + + ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex); + } + } +} + +static void FadeInScreenWithWeather(void) +{ + if (++gWeatherPtr->unknown_6CB > 1) + gWeatherPtr->unknown_6CA = 0; + + switch (gWeatherPtr->currWeather) + { + case WEATHER_RAIN_LIGHT: + case WEATHER_RAIN_MED: + case WEATHER_RAIN_HEAVY: + case WEATHER_SNOW: + case WEATHER_SHADE: + if (FadeInScreen_RainShowShade() == FALSE) + { + gWeatherPtr->gammaIndex = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + } + break; + case WEATHER_DROUGHT: + if (FadeInScreen_Drought() == FALSE) + { + gWeatherPtr->gammaIndex = -6; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + } + break; + case WEATHER_FOG_1: + if (FadeInScreen_Fog1() == FALSE) + { + gWeatherPtr->gammaIndex = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + } + break; + case WEATHER_ASH: + case WEATHER_SANDSTORM: + case WEATHER_FOG_2: + case WEATHER_FOG_3: + default: + if (!gPaletteFade.active) + { + gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + } + break; + } +} + +bool8 FadeInScreen_RainShowShade(void) +{ + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + if (++gWeatherPtr->fadeScreenCounter >= 16) + { + ApplyGammaShift(0, 32, 3); + gWeatherPtr->fadeScreenCounter = 16; + return FALSE; + } + + ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; +} + +bool8 FadeInScreen_Drought(void) +{ + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + if (++gWeatherPtr->fadeScreenCounter >= 16) + { + ApplyGammaShift(0, 32, -6); + gWeatherPtr->fadeScreenCounter = 16; + return FALSE; + } + + ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; +} + +bool8 FadeInScreen_Fog1(void) +{ + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + gWeatherPtr->fadeScreenCounter++; + ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; +} + +static void DoNothing(void) +{ } + +static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) +{ + u16 curPalIndex; + u16 palOffset; + u8 *gammaTable; + u16 i; + + if (gammaIndex > 0) + { + gammaIndex--; + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + curPalIndex = startPalIndex; + + // Loop through the speficied palette range and apply necessary gamma shifts to the colors. + while (curPalIndex < numPalettes) + { + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) + { + // No palette change. + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); + palOffset += 16; + } + else + { + u8 r, g, b; + + if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex) + gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; + else + gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; + + if (curPalIndex == 16 || curPalIndex > 27) + { + for (i = 0; i < 16; i++) + { + if (gPlttBufferUnfaded[palOffset] == RGB(31, 12, 11)) + { + // Skip gamma shift for this specific color. (Why?) + palOffset++; + } + else + { + // Apply gamma shift to the original color. + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r = gammaTable[baseColor.r]; + g = gammaTable[baseColor.g]; + b = gammaTable[baseColor.b]; + gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; + } + } + } + else + { + for (i = 0; i < 16; i++) + { + // Apply gamma shift to the original color. + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r = gammaTable[baseColor.r]; + g = gammaTable[baseColor.g]; + b = gammaTable[baseColor.b]; + gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; + } + } + } + + curPalIndex++; + } + } + else if (gammaIndex < 0) + { + // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables. + gammaIndex = -gammaIndex - 1; + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + curPalIndex = startPalIndex; + + while (curPalIndex < numPalettes) + { + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) + { + // No palette change. + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); + palOffset += 16; + } + else + { + if (curPalIndex == 16 || curPalIndex > 27) + { + for (i = 0; i < 16; i++) + { + // Skip gamma shift for this specific color. (Why?) + if (gPlttBufferUnfaded[palOffset] != RGB(31, 12, 11)) + gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; + + palOffset++; + } + } + else + { + for (i = 0; i < 16; i++) + { + gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; + palOffset++; + } + } + } + + curPalIndex++; + } + } + else + { + // No palette blending. + CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); + } +} + +static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) +{ + u16 palOffset; + u16 curPalIndex; + u16 i; + struct RGBColor color = *(struct RGBColor *)&blendColor; + u8 rBlend = color.r; + u8 gBlend = color.g; + u8 bBlend = color.b; + + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + gammaIndex--; + curPalIndex = startPalIndex; + + while (curPalIndex < numPalettes) + { + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) + { + // No gamma shift. Simply blend the colors. + BlendPalette(palOffset, 16, blendCoeff, blendColor); + palOffset += 16; + } + else + { + u8 *gammaTable; + + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL) + gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; + else + gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; + + for (i = 0; i < 16; i++) + { + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + u8 r = gammaTable[baseColor.r]; + u8 g = gammaTable[baseColor.g]; + u8 b = gammaTable[baseColor.b]; + + // Apply gamma shift and target blend color to the original color. + r += ((rBlend - r) * blendCoeff) >> 4; + g += ((gBlend - g) * blendCoeff) >> 4; + b += ((bBlend - b) * blendCoeff) >> 4; + gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; + } + } + + curPalIndex++; + } +} + +void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor) +{ + struct RGBColor color; + u8 rBlend; + u8 gBlend; + u8 bBlend; + u16 curPalIndex; + u16 palOffset; + u16 i; + + gammaIndex = -gammaIndex - 1; + color = *(struct RGBColor *)&blendColor; + rBlend = color.r; + gBlend = color.g; + bBlend = color.b; + palOffset = 0; + for (curPalIndex = 0; curPalIndex < 32; curPalIndex++) + { + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) + { + // No gamma shift. Simply blend the colors. + BlendPalette(palOffset, 16, blendCoeff, blendColor); + palOffset += 16; + } + else + { + for (i = 0; i < 16; i++) + { + u32 offset; + struct RGBColor color1; + struct RGBColor color2; + u8 r1, g1, b1; + u8 r2, g2, b2; + + color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r1 = color1.r; + g1 = color1.g; + b1 = color1.b; + + offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1); + color2 = *(struct RGBColor *)&eDroughtPaletteData.gammaShiftColors[gammaIndex][offset]; + r2 = color2.r; + g2 = color2.g; + b2 = color2.b; + + r2 += ((rBlend - r2) * blendCoeff) >> 4; + g2 += ((gBlend - g2) * blendCoeff) >> 4; + b2 += ((bBlend - b2) * blendCoeff) >> 4; + + gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2; + } + } + } +} + +void ApplyFogBlend(u8 blendCoeff, u16 blendColor) +{ + struct RGBColor color; + u8 rBlend; + u8 gBlend; + u8 bBlend; + u16 curPalIndex; + + BlendPalette(0, 0x100, blendCoeff, blendColor); + color = *(struct RGBColor *)&blendColor; + rBlend = color.r; + gBlend = color.g; + bBlend = color.b; + + for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) + { + if (LightenSpritePaletteInFog(curPalIndex)) + { + u16 palEnd = (curPalIndex + 1) * 16; + u16 palOffset = curPalIndex * 16; + + while (palOffset < palEnd) + { + struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + u8 r = color.r; + u8 g = color.g; + u8 b = color.b; + + r += ((28 - r) * 3) >> 2; + g += ((31 - g) * 3) >> 2; + b += ((28 - b) * 3) >> 2; + + r += ((rBlend - r) * blendCoeff) >> 4; + g += ((gBlend - g) * blendCoeff) >> 4; + b += ((bBlend - b) * blendCoeff) >> 4; + + gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; + palOffset++; + } + } + else + { + BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor); + } + } +} + +static void MarkFogSpritePalToLighten(u8 paletteIndex) +{ + if (gWeatherPtr->lightenedFogSpritePalsCount < 6) + { + gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex; + gWeatherPtr->lightenedFogSpritePalsCount++; + } +} + +static bool8 LightenSpritePaletteInFog(u8 paletteIndex) +{ + u16 i; + + for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) + { + if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) + return TRUE; + } + + return FALSE; +} + +void sub_807D5BC(s8 gammaIndex) +{ + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) + { + ApplyGammaShift(0, 32, gammaIndex); + gWeatherPtr->gammaIndex = gammaIndex; + } +} + +void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) +{ + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) + { + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; + gWeatherPtr->gammaIndex = gammaIndex; + gWeatherPtr->gammaTargetIndex = gammaTargetIndex; + gWeatherPtr->gammaStepFrameCounter = 0; + gWeatherPtr->gammaStepDelay = gammaStepDelay; + sub_807D5BC(gammaIndex); + } +} + +void FadeScreen(u8 mode, u8 delay) +{ + u32 fadeColor; + bool8 fadeOut; + bool8 useWeatherPal; + + switch (mode) + { + case FADE_FROM_BLACK: + fadeColor = 0; + fadeOut = FALSE; + break; + case FADE_FROM_WHITE: + fadeColor = 0xFFFF; + fadeOut = FALSE; + break; + case FADE_TO_BLACK: + fadeColor = 0; + fadeOut = TRUE; + break; + case FADE_TO_WHITE: + fadeColor = 0xFFFF; + fadeOut = TRUE; + break; + default: + return; + } + + switch (gWeatherPtr->currWeather) + { + case WEATHER_RAIN_LIGHT: + case WEATHER_RAIN_MED: + case WEATHER_RAIN_HEAVY: + case WEATHER_SNOW: + case WEATHER_FOG_1: + case WEATHER_SHADE: + case WEATHER_DROUGHT: + useWeatherPal = TRUE; + break; + default: + useWeatherPal = FALSE; + break; + } + + if (fadeOut) + { + if (useWeatherPal) + CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); + + BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; + } + else + { + gWeatherPtr->fadeDestColor = fadeColor; + if (useWeatherPal) + gWeatherPtr->fadeScreenCounter = 0; + else + BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); + + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; + gWeatherPtr->unknown_6CA = 1; + gWeatherPtr->unknown_6CB = 0; + Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); + gWeatherPtr->readyForInit = TRUE; + } +} + +bool8 IsWeatherNotFadingIn(void) +{ + return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); +} + +void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) +{ + u16 paletteIndex = 16 + spritePaletteIndex; + u16 i; + + switch (gWeatherPtr->palProcessingState) + { + case WEATHER_PAL_STATE_SCREEN_FADING_IN: + if (gWeatherPtr->unknown_6CA != 0) + { + if (gWeatherPtr->currWeather == WEATHER_FOG_1) + MarkFogSpritePalToLighten(paletteIndex); + paletteIndex *= 16; + for (i = 0; i < 16; i++) + gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; + } + break; + case WEATHER_PAL_STATE_SCREEN_FADING_OUT: + paletteIndex *= 16; + CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32); + BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); + break; + // WEATHER_PAL_STATE_CHANGING_WEATHER + // WEATHER_PAL_STATE_CHANGING_IDLE + default: + if (gWeatherPtr->currWeather != WEATHER_FOG_1) + { + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); + } + else + { + paletteIndex *= 16; + BlendPalette(paletteIndex, 16, 12, 0x73FC); + } + break; + } +} + +void ApplyWeatherGammaShiftToPal(u8 paletteIndex) +{ + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); +} + +u8 unref_sub_807D894(void) +{ + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) + return gWeatherPtr->unknown_6CA; + else + return 0; +} + +void LoadCustomWeatherSpritePalette(const u16 *palette) +{ + LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); + UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); +} + +static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b) +{ + u8 gammaIndex = *gammaIndexPtr; + u16 i; + + if (gammaIndex < 7) + { + gammaIndex--; + LZ77UnCompWram(sCompressedDroughtPalettes[gammaIndex], eDroughtPaletteData.gammaShiftColors[gammaIndex]); + if (gammaIndex == 0) + { + eDroughtPaletteData.gammaShiftColors[gammaIndex][0] = RGB(1, 1, 1); + for (i = 1; i < 0x1000; i++) + eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex][i - 1]; + } + else + { + for (i = 0; i < 0x1000; i++) + eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex - 1][i]; + } + if (++(*gammaIndexPtr) == 7) + { + *gammaIndexPtr = 32; + *b = 32; + } + } +} + +void ResetDroughtWeatherPaletteLoading(void) +{ + gWeatherPtr->loadDroughtPalsIndex = 1; + gWeatherPtr->loadDroughtPalsOffset = 1; +} + +bool8 LoadDroughtWeatherPalettes(void) +{ + if (gWeatherPtr->loadDroughtPalsIndex < 32) + { + LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset); + if (gWeatherPtr->loadDroughtPalsIndex < 32) + return TRUE; + } + return FALSE; +} + +void sub_807DA04(s8 gammaIndex) +{ + sub_807D5BC(-gammaIndex - 1); +} + +void sub_807DA14(void) +{ + gWeatherPtr->unknown_73C = 0; + gWeatherPtr->unknown_740 = 0; + gWeatherPtr->unknown_742 = 0; + gWeatherPtr->unknown_73E = 0; + gUnknown_0202FF58 = 5; +} + +void sub_807DA4C(void) +{ + switch (gWeatherPtr->unknown_742) + { + case 0: + if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58) + { + gWeatherPtr->unknown_740 = 0; + sub_807DA04(gWeatherPtr->unknown_73C++); + if (gWeatherPtr->unknown_73C > 5) + { + gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; + gWeatherPtr->unknown_742 = 1; + gWeatherPtr->unknown_740 = 0x3C; + } + } + break; + case 1: + gWeatherPtr->unknown_740 = (gWeatherPtr->unknown_740 + 3) & 0x7F; + gWeatherPtr->unknown_73C = ((gSineTable[gWeatherPtr->unknown_740] - 1) >> 6) + 2; + if (gWeatherPtr->unknown_73C != gWeatherPtr->unknown_73E) + sub_807DA04(gWeatherPtr->unknown_73C); + gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; + break; + case 2: + if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58) + { + gWeatherPtr->unknown_740 = 0; + sub_807DA04(--gWeatherPtr->unknown_73C); + if (gWeatherPtr->unknown_73C == 3) + gWeatherPtr->unknown_742 = 0; + } + break; + } +} + +void Weather_SetBlendCoeffs(u8 eva, u8 evb) +{ + gWeatherPtr->currBlendEVA = eva; + gWeatherPtr->currBlendEVB = evb; + gWeatherPtr->targetBlendEVA = eva; + gWeatherPtr->targetBlendEVB = evb; + REG_BLDALPHA = BLDALPHA_BLEND(eva, evb); +} + +void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay) +{ + gWeatherPtr->targetBlendEVA = eva; + gWeatherPtr->targetBlendEVB = evb; + gWeatherPtr->blendDelay = delay; + gWeatherPtr->blendFrameCounter = 0; + gWeatherPtr->blendUpdateCounter = 0; +} + +bool8 Weather_UpdateBlend(void) +{ + if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA + && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) + return TRUE; + + if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay) + { + gWeatherPtr->blendFrameCounter = 0; + gWeatherPtr->blendUpdateCounter++; + + // Update currBlendEVA and currBlendEVB on alternate frames + if (gWeatherPtr->blendUpdateCounter & 1) + { + if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA) + gWeatherPtr->currBlendEVA++; + else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA) + gWeatherPtr->currBlendEVA--; + } + else + { + if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB) + gWeatherPtr->currBlendEVB++; + else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB) + gWeatherPtr->currBlendEVB--; + } + } + + REG_BLDALPHA = BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); + + if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA + && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) + return TRUE; + + return FALSE; +} + +void unref_sub_807DCB4(u8 a) +{ + switch (a) + { + case 1: + SetWeather(WEATHER_CLOUDS); + break; + case 2: + SetWeather(WEATHER_SUNNY); + break; + case 3: + SetWeather(WEATHER_RAIN_LIGHT); + break; + case 4: + SetWeather(WEATHER_SNOW); + break; + case 5: + SetWeather(WEATHER_RAIN_MED); + break; + case 6: + SetWeather(WEATHER_FOG_1); + break; + case 7: + SetWeather(WEATHER_FOG_2); + break; + case 8: + SetWeather(WEATHER_ASH); + break; + case 9: + SetWeather(WEATHER_SANDSTORM); + break; + case 10: + SetWeather(WEATHER_SHADE); + break; + } +} + +u8 GetCurrentWeather(void) +{ + return gWeatherPtr->currWeather; +} + +void SetRainStrengthFromSoundEffect(u16 soundEffect) +{ + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) + { + switch (soundEffect) + { + case SE_T_KOAME: + gWeatherPtr->rainStrength = 0; + break; + case SE_T_OOAME: + gWeatherPtr->rainStrength = 1; + break; + case SE_T_AME: + gWeatherPtr->rainStrength = 2; + break; + default: + return; + } + + PlaySE(soundEffect); + } +} + +void PlayRainSoundEffect(void) +{ + if (IsSpecialSEPlaying()) + { + switch (gWeatherPtr->rainStrength) + { + case 0: + PlaySE(SE_T_KOAME_E); + break; + case 1: + PlaySE(SE_T_OOAME_E); + break; + case 2: + default: + PlaySE(SE_T_AME_E); + break; + } + } +} + +u8 IsWeatherChangeComplete(void) +{ + return gWeatherPtr->weatherChangeComplete; +} + +void SetWeatherScreenFadeOut(void) +{ + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; +} + +void unref_sub_807DE24(void) +{ + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; +} + +void PreservePaletteInWeather(u8 preservedPalIndex) +{ + CpuCopy16(sBasePaletteGammaTypes, gFieldEffectPaletteGammaTypes, 32); + gFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE; + sPaletteGammaTypes = gFieldEffectPaletteGammaTypes; +} + +void ResetPreservedPalettesInWeather(void) +{ + sPaletteGammaTypes = sBasePaletteGammaTypes; +} + +#if DEBUG + +EWRAM_DATA static u8 sSelectedDebugWeather = 0; + +bool8 debug_sub_8085564(void) +{ + bool8 changed = FALSE; + + if (gMain.newKeys & R_BUTTON) + { + sSelectedDebugWeather++; + if (sSelectedDebugWeather == 15) + sSelectedDebugWeather = 0; + changed = TRUE; + } + if (gMain.newKeys & L_BUTTON) + { + if (sSelectedDebugWeather != 0) + sSelectedDebugWeather--; + else + sSelectedDebugWeather = 14; + changed = TRUE; + } + + if (changed) + { + Menu_BlankWindowRect(22, 1, 28, 2); + Menu_PrintText(sDebugText_Weather[sSelectedDebugWeather], 23, 1); + } + + if (gMain.newKeys & A_BUTTON) + { + ChangeWeather(sSelectedDebugWeather); + CloseMenu(); + return TRUE; + } + + return FALSE; +} + +bool8 debug_sub_808560C(void) +{ + sSelectedDebugWeather = gWeather.currWeather; + Menu_EraseScreen(); + Menu_BlankWindowRect(22, 1, 28, 2); + Menu_PrintText(sDebugText_Weather[sSelectedDebugWeather], 23, 1); + gMenuCallback = debug_sub_8085564; + return FALSE; +} + +#endif diff --git a/src/field_weather_effects.c b/src/field_weather_effects.c new file mode 100644 index 000000000..386925531 --- /dev/null +++ b/src/field_weather_effects.c @@ -0,0 +1,2381 @@ +#include "global.h" +#include "event_object_movement.h" +#include "field_weather.h" +#include "overworld.h" +#include "random.h" +#include "script.h" +#include "constants/weather.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" + +extern struct Weather *const gWeatherPtr; + +const u16 gUnknown_08397108[] = INCBIN_U16("graphics/weather/1.gbapal"); +const u16 gUnknown_08397128[] = INCBIN_U16("graphics/weather/2.gbapal"); +const u8 gWeatherFog2Tiles[] = INCBIN_U8("graphics/weather/fog2.4bpp"); +const u8 gWeatherFog1Tiles[] = INCBIN_U8("graphics/weather/fog1.4bpp"); +const u8 gWeatherCloudTiles[] = INCBIN_U8("graphics/weather/cloud.4bpp"); +const u8 gWeatherSnow1Tiles[] = INCBIN_U8("graphics/weather/snow0.4bpp"); +const u8 gWeatherSnow2Tiles[] = INCBIN_U8("graphics/weather/snow1.4bpp"); +const u8 gWeatherBubbleTiles[] = INCBIN_U8("graphics/weather/bubble.4bpp"); +const u8 gWeatherAshTiles[] = INCBIN_U8("graphics/weather/ash.4bpp"); +const u8 gWeatherRainTiles[] = INCBIN_U8("graphics/weather/rain.4bpp"); +const u8 gWeatherSandstormTiles[] = INCBIN_U8("graphics/weather/sandstorm.4bpp"); + +static const struct Coords16 gUnknown_0839A9C8[] = +{ + { 0, 66}, + { 5, 73}, + {10, 78}, +}; + +static const struct SpriteSheet sCloudSpriteSheet = {gWeatherCloudTiles, sizeof(gWeatherCloudTiles), 0x1200}; + +static const struct OamData gOamData_839A9DC = +{ + .y = 0, + .affineMode = 0, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 3, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_839A9E4[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_839A9EC[] = +{ + gSpriteAnim_839A9E4, +}; + +void sub_807E0F4(struct Sprite *); +static const struct SpriteTemplate sCloudSpriteTemplate = +{ + .tileTag = 4608, + .paletteTag = 4609, + .oam = &gOamData_839A9DC, + .anims = gSpriteAnimTable_839A9EC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_807E0F4, +}; + +extern void sub_807D5BC(s8 gammaIndex); +extern void sub_807DA14(void); +extern void sub_807DA4C(void); +extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c); +extern bool8 Weather_UpdateBlend(void); +extern void SetRainStrengthFromSoundEffect(u16 sndEff); +extern void sub_807D5F0(u8 a, u8 b, u8 c); + +//------------------------------------------------------------------------------ +// Clouds +//------------------------------------------------------------------------------ + +void Clouds_InitVars(void) +{ + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; + gWeatherPtr->weatherGfxLoaded = FALSE; + gWeatherPtr->initStep = 0; + if (gWeatherPtr->cloudSpritesCreated == FALSE) + Weather_SetBlendCoeffs(0, 16); +} + +void Clouds_Main(void); + +void Clouds_InitAll(void) +{ + Clouds_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Clouds_Main(); +} + +void CreateCloudSprites(void); + +void Clouds_Main(void) +{ + switch (gWeatherPtr->initStep) + { + case 0: + CreateCloudSprites(); + gWeatherPtr->initStep++; + break; + case 1: + Weather_SetTargetBlendCoeffs(12, 8, 1); + gWeatherPtr->initStep++; + break; + case 2: + if (Weather_UpdateBlend()) + { + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + } + break; + } +} + +void sub_807E0A0(void); + +bool8 Clouds_Finish(void) +{ + switch (gWeatherPtr->finishStep) + { + case 0: + Weather_SetTargetBlendCoeffs(0, 16, 1); + gWeatherPtr->finishStep++; + return TRUE; + case 1: + if (Weather_UpdateBlend()) + { + sub_807E0A0(); + gWeatherPtr->finishStep++; + } + return TRUE; + } + return FALSE; +} + +//------------------------------------------------------------------------------ +// Weather 2 +//------------------------------------------------------------------------------ + +void Weather2_InitVars(void) +{ + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; +} + +void Weather2_InitAll(void) +{ + Weather2_InitVars(); +} + +void Weather2_Main(void) +{ +} + +int Weather2_Finish(void) +{ + return 0; +} + +void CreateCloudSprites(void) +{ + u16 i; + + if (gWeatherPtr->cloudSpritesCreated == TRUE) + return; + LoadSpriteSheet(&sCloudSpriteSheet); + LoadCustomWeatherSpritePalette(gUnknown_08397108); + for (i = 0; i < 3; i++) + { + u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF); + + if (spriteId != 64) + { + struct Sprite *sprite; + + gWeatherPtr->sprites.s1.cloudSprites[i] = &gSprites[spriteId]; + sprite = gWeatherPtr->sprites.s1.cloudSprites[i]; + sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y); + sprite->coordOffsetEnabled = TRUE; + } + else + { + gWeatherPtr->sprites.s1.cloudSprites[i] = NULL; + } + } + gWeatherPtr->cloudSpritesCreated = TRUE; +} + +void sub_807E0A0(void) +{ + u16 i; + + if (gWeatherPtr->cloudSpritesCreated == FALSE) + return; + for (i = 0; i < 3; i++) + { + if (gWeatherPtr->sprites.s1.cloudSprites[i] != NULL) + DestroySprite(gWeatherPtr->sprites.s1.cloudSprites[i]); + } + FreeSpriteTilesByTag(0x1200); + gWeatherPtr->cloudSpritesCreated = FALSE; +} + +void sub_807E0F4(struct Sprite *sprite) +{ + sprite->data[0] = (sprite->data[0] + 1) & 1; + if (sprite->data[0] != 0) + sprite->pos1.x--; +} + +//------------------------------------------------------------------------------ +// Drought +//------------------------------------------------------------------------------ + +void Drought_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = FALSE; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 0; +} + +void Drought_Main(void); + +void Drought_InitAll(void) +{ + Drought_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Drought_Main(); +} + +void Drought_Main(void) +{ + switch (gWeatherPtr->initStep) + { + case 0: + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) + gWeatherPtr->initStep++; + break; + case 1: + ResetDroughtWeatherPaletteLoading(); + gWeatherPtr->initStep++; + break; + case 2: + if (LoadDroughtWeatherPalettes() == FALSE) + gWeatherPtr->initStep++; + break; + case 3: + sub_807DA14(); + gWeatherPtr->initStep++; + break; + case 4: + sub_807DA4C(); + if (gWeatherPtr->unknown_73C == 6) + { + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + } + break; + default: + sub_807DA4C(); + break; + } +} + +int Drought_Finish(void) +{ + return 0; +} + +void task50_0807B6D4(u8); + +void sub_807E25C(void) +{ + CreateTask(task50_0807B6D4, 0x50); +} + +#define tState data[0] +#define tBlendY data[1] +#define tBlendDelay data[2] +#define tWinRange data[3] + +void task50_0807B6D4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->tState) + { + case 0: + task->tBlendY = 0; + task->tBlendDelay = 0; + task->tWinRange = REG_WININ; + REG_WININ = WIN_RANGE(63, 63); + REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ + | BLDCNT_EFFECT_LIGHTEN; + REG_BLDY = 0; + task->tState++; + // fall through + case 1: + task->tBlendY += 3; + if (task->tBlendY > 16) + task->tBlendY = 16; + REG_BLDY = task->tBlendY; + if (task->tBlendY >= 16) + task->tState++; + break; + case 2: + task->tBlendDelay++; + if (task->tBlendDelay > 9) + { + task->tBlendDelay = 0; + task->tBlendY--; + if (task->tBlendY <= 0) + { + task->tBlendY = 0; + task->tState++; + } + REG_BLDY = task->tBlendY; + } + break; + case 3: + REG_BLDCNT = 0; + REG_BLDY = 0; + REG_WININ = task->tWinRange; + task->tState++; + break; + case 4: + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +#undef tState +#undef tBlendY +#undef tBlendDelay +#undef tWinRange + +//------------------------------------------------------------------------------ +// Light Rain +//------------------------------------------------------------------------------ + +void LightRain_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = FALSE; + gWeatherPtr->unknown_6D6 = 0; + gWeatherPtr->unknown_6DB = 8; + gWeatherPtr->unknown_6DC = 0; + gWeatherPtr->unknown_6D9 = 10; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; + SetRainStrengthFromSoundEffect(SE_T_KOAME); +} + +void LightRain_Main(void); + +void LightRain_InitAll(void) +{ + LightRain_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + LightRain_Main(); +} + +void LoadRainSpriteSheet(void); +u8 CreateRainSprite(void); +u8 sub_807E8E8(void); + +void LightRain_Main(void) +{ + switch (gWeatherPtr->initStep) + { + case 0: + LoadRainSpriteSheet(); + gWeatherPtr->initStep++; + break; + case 1: + if (CreateRainSprite() == 0) + gWeatherPtr->initStep++; + break; + case 2: + if (sub_807E8E8() == FALSE) + { + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + } + break; + } +} + +void DestroyRainSprites(void); + +bool8 LightRain_Finish(void) +{ + switch (gWeatherPtr->finishStep) + { + case 0: + if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT + || gWeatherPtr->nextWeather == WEATHER_RAIN_MED + || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY) + { + gWeatherPtr->finishStep = 0xFF; + return FALSE; + } + else + { + gWeatherPtr->unknown_6D9 = 0; + gWeatherPtr->finishStep++; + } + // fall through + case 1: + if (sub_807E8E8() == FALSE) + { + DestroyRainSprites(); + gWeatherPtr->finishStep++; + return FALSE; + } + return TRUE; + } + return FALSE; +} + +// defined below +extern const s16 gUnknown_0839AABC[][2]; +extern const u16 gUnknown_0839AAC4[][2]; + +void sub_807E4EC(struct Sprite *sprite) +{ + u32 randVal; + u16 r6; + s32 r4; + s32 r0; + + if (sprite->data[1] == 0) + sprite->data[1] = 361; + randVal = sprite->data[1] * 1103515245 + 12345; + sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600; + + r6 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0]; + + r4 = sprite->data[1] % 30; + sprite->data[2] = r4 * 8; // useless assignment + + r0 = sprite->data[1] / 30; + sprite->data[3] = r0 * 8; // useless assignment + + sprite->data[2] = r4; + sprite->data[2] <<= 7; + + sprite->data[3] = r0; + sprite->data[3] <<= 7; + + sprite->data[2] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0] * r6; + sprite->data[3] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1] * r6; + + StartSpriteAnim(sprite, 0); + sprite->data[4] = 0; + sprite->coordOffsetEnabled = FALSE; + sprite->data[0] = r6; +} + +void sub_807E5C0(struct Sprite *sprite) +{ + if (sprite->data[4] == 0) + { + sprite->data[2] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0]; + sprite->data[3] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1]; + sprite->pos1.x = sprite->data[2] >> 4; + sprite->pos1.y = sprite->data[3] >> 4; + + if (sprite->data[5] != 0 + && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248) + && sprite->pos1.y >= -16 && sprite->pos1.y <= 176) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + + sprite->data[0]--; + if (sprite->data[0] == 0) + { + StartSpriteAnim(sprite, gWeatherPtr->unknown_6DC + 1); + sprite->data[4] = 1; + sprite->pos1.x -= gSpriteCoordOffsetX; + sprite->pos1.y -= gSpriteCoordOffsetY; + sprite->coordOffsetEnabled = TRUE; + } + } + else if (sprite->animEnded) + { + sprite->invisible = TRUE; + sub_807E4EC(sprite); + } +} + +void sub_807E6C4(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + sub_807E4EC(sprite); + sprite->callback = sub_807E5C0; + } + else + { + sprite->data[0]--; + } +} + +void sub_807E6F0(struct Sprite *sprite, u16 b) +{ + u16 r8 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0]; + u16 r6 = b / (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8); + u16 r4 = b % (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8); + + while (--r6 != 0xFFFF) + sub_807E4EC(sprite); + if (r4 < r8) + { + while (--r4 != 0xFFFF) + sub_807E5C0(sprite); + sprite->data[6] = 0; + } + else + { + sprite->data[0] = r4 - r8; + sprite->invisible = TRUE; + sprite->data[6] = 1; + } +} + +extern const struct SpriteSheet sRainSpriteSheet; // defined below + +void LoadRainSpriteSheet(void) +{ + LoadSpriteSheet(&sRainSpriteSheet); +} + +static const struct Coords16 sRainSpriteCoords[] = +{ + { 0, 0}, + { 0, 160}, + { 0, 64}, + {144, 224}, + {144, 128}, + { 32, 32}, + { 32, 192}, + { 32, 96}, + { 72, 128}, + { 72, 32}, + { 72, 192}, + {216, 96}, + {216, 0}, + {104, 160}, + {104, 64}, + {104, 224}, + {144, 0}, + {144, 160}, + {144, 64}, + { 32, 224}, + { 32, 128}, + { 72, 32}, + { 72, 192}, + { 48, 96}, +}; + +static const struct OamData gOamData_839AA68 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 2, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 2, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_839AA70[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd gSpriteAnim_839AA78[] = +{ + ANIMCMD_FRAME(8, 3), + ANIMCMD_FRAME(32, 2), + ANIMCMD_FRAME(40, 2), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_839AA88[] = +{ + ANIMCMD_FRAME(8, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(24, 4), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_839AA98[] = +{ + gSpriteAnim_839AA70, + gSpriteAnim_839AA78, + gSpriteAnim_839AA88, +}; + +static const struct SpriteTemplate sRainSpriteTemplate = +{ + .tileTag = 4614, + .paletteTag = 4608, + .oam = &gOamData_839AA68, + .anims = gSpriteAnimTable_839AA98, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_807E5C0, +}; + + +const s16 gUnknown_0839AABC[][2] = +{ + {-104, 208}, + {-160, 320}, +}; + +const u16 gUnknown_0839AAC4[][2] = +{ + {18, 7}, + {12, 10}, +}; + +static const struct SpriteSheet sRainSpriteSheet = {gWeatherRainTiles, sizeof(gWeatherRainTiles), 0x1206}; + +static const struct OamData gOamData_839AAD4 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteFrameImage gSpriteImageTable_839AADC[] = +{ + {gWeatherSnow1Tiles, sizeof(gWeatherSnow1Tiles)}, + {gWeatherSnow2Tiles, sizeof(gWeatherSnow2Tiles)}, +}; + +static const union AnimCmd gSpriteAnim_839AAEC[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_839AAF4[] = +{ + ANIMCMD_FRAME(1, 16), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_839AAFC[] = +{ + gSpriteAnim_839AAEC, + gSpriteAnim_839AAF4, +}; + +void sub_807ED48(struct Sprite *); +static const struct SpriteTemplate sSnowflakeSpriteTemplate = +{ + .tileTag = 0xFFFF, + .paletteTag = 4608, + .oam = &gOamData_839AAD4, + .anims = gSpriteAnimTable_839AAFC, + .images = gSpriteImageTable_839AADC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_807ED48, +}; + +// unused data +static const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300}; + +static const struct OamData gOamData_839AB2C = +{ + .y = 0, + .affineMode = 0, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_839AB34[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_839AB3C[] = +{ + ANIMCMD_FRAME(32, 16), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_839AB44[] = +{ + ANIMCMD_FRAME(64, 16), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_839AB4C[] = +{ + ANIMCMD_FRAME(96, 16), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_839AB54[] = +{ + ANIMCMD_FRAME(128, 16), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_839AB5C[] = +{ + ANIMCMD_FRAME(160, 16), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_839AB64[] = +{ + gSpriteAnim_839AB34, + gSpriteAnim_839AB3C, + gSpriteAnim_839AB44, + gSpriteAnim_839AB4C, + gSpriteAnim_839AB54, + gSpriteAnim_839AB5C, +}; + +static const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] = +{ + AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] = +{ + gSpriteAffineAnim_839AB7C, +}; + +static void Fog1SpriteCallback(struct Sprite *); +static const struct SpriteTemplate sFog1SpriteTemplate = +{ + .tileTag = 4609, + .paletteTag = 4608, + .oam = &gOamData_839AB2C, + .anims = gSpriteAnimTable_839AB64, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_839AB8C, + .callback = Fog1SpriteCallback, +}; + +bool8 CreateRainSprite(void) +{ + u8 spriteNum; + u8 spriteId; + + if (gWeatherPtr->rainSpriteCount == 24) + return FALSE; + + spriteNum = gWeatherPtr->rainSpriteCount; + spriteId = CreateSpriteAtEnd(&sRainSpriteTemplate, + sRainSpriteCoords[spriteNum].x, sRainSpriteCoords[spriteNum].y, 78); + if (spriteId != 64) + { + gSprites[spriteId].data[5] = 0; + gSprites[spriteId].data[1] = spriteNum * 145; + while (gSprites[spriteId].data[1] >= 600) + gSprites[spriteId].data[1] -= 600; + sub_807E4EC(&gSprites[spriteId]); + sub_807E6F0(&gSprites[spriteId], spriteNum * 9); + gSprites[spriteId].invisible = TRUE; + gWeatherPtr->sprites.s1.rainSprites[spriteNum] = &gSprites[spriteId]; + } + else + { + gWeatherPtr->sprites.s1.rainSprites[spriteNum] = NULL; + } + + if (++gWeatherPtr->rainSpriteCount == 24) + { + u16 i; + + for (i = 0; i < 24; i++) + { + if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL) + { + if (gWeatherPtr->sprites.s1.rainSprites[i]->data[6] == 0) + gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E5C0; + else + gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E6C4; + } + } + return FALSE; + } + return TRUE; +} + +bool8 sub_807E8E8(void) +{ + if (gWeatherPtr->unknown_6D8 == gWeatherPtr->unknown_6D9) + return FALSE; + + if (++gWeatherPtr->unknown_6D6 > gWeatherPtr->unknown_6DB) + { + gWeatherPtr->unknown_6D6 = 0; + if (gWeatherPtr->unknown_6D8 < gWeatherPtr->unknown_6D9) + { + gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8++]->data[5] = 1; + } + else + { + gWeatherPtr->unknown_6D8--; + gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->data[5] = 0; + gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->invisible = TRUE; + } + } + return TRUE; +} + +void DestroyRainSprites(void) +{ + u16 i; + + for (i = 0; i < gWeatherPtr->rainSpriteCount; i++) + { + if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL) + DestroySprite(gWeatherPtr->sprites.s1.rainSprites[i]); + } + gWeatherPtr->rainSpriteCount = 0; + FreeSpriteTilesByTag(0x1206); +} + +//------------------------------------------------------------------------------ +// Snow +//------------------------------------------------------------------------------ + +void Snow_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = FALSE; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; + gWeatherPtr->unknown_6E5 = 16; + gWeatherPtr->unknown_6E0 = 0; +} + +void Snow_Main(void); +void sub_807ED48(struct Sprite *); + +void Snow_InitAll(void) +{ + Snow_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + { + u16 i; + + Snow_Main(); + for (i = 0; i < gWeatherPtr->snowflakeSpriteCount; i++) + { + sub_807ED48(gWeatherPtr->sprites.s1.snowflakeSprites[i]); + } + } +} + +u8 snowflakes_progress(void); + +void Snow_Main(void) +{ + if (gWeatherPtr->initStep == 0 && snowflakes_progress() == FALSE) + { + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + } +} + +bool8 Snow_Finish(void) +{ + switch (gWeatherPtr->finishStep) + { + case 0: + gWeatherPtr->unknown_6E5 = 0; + gWeatherPtr->unknown_6E0 = 0; + gWeatherPtr->finishStep++; + // fall through + case 1: + if (snowflakes_progress() == FALSE) + { + gWeatherPtr->finishStep++; + return FALSE; + } + return TRUE; + } + return FALSE; +} + +bool8 CreateSnowflakeSprite(void); +bool8 RemoveSnowflakeSprite(void); + +bool8 snowflakes_progress(void) +{ + if (gWeatherPtr->snowflakeSpriteCount == gWeatherPtr->unknown_6E5) + return FALSE; + + gWeatherPtr->unknown_6E0++; + if (gWeatherPtr->unknown_6E0 > 36) + { + gWeatherPtr->unknown_6E0 = 0; + if (gWeatherPtr->snowflakeSpriteCount < gWeatherPtr->unknown_6E5) + CreateSnowflakeSprite(); + else + RemoveSnowflakeSprite(); + } + return (gWeatherPtr->snowflakeSpriteCount != gWeatherPtr->unknown_6E5); +} + +void sub_807EC40(struct Sprite *); + +bool8 CreateSnowflakeSprite(void) +{ + u8 spriteId = CreateSpriteAtEnd(&sSnowflakeSpriteTemplate, 0, 0, 78); + + if (spriteId == 64) + return FALSE; + gSprites[spriteId].data[4] = gWeatherPtr->snowflakeSpriteCount; + sub_807EC40(&gSprites[spriteId]); + gSprites[spriteId].coordOffsetEnabled = TRUE; + gWeatherPtr->sprites.s1.snowflakeSprites[gWeatherPtr->snowflakeSpriteCount++] = &gSprites[spriteId]; + return TRUE; +} + +bool8 RemoveSnowflakeSprite(void) +{ + if (gWeatherPtr->snowflakeSpriteCount != 0) + { + DestroySprite(gWeatherPtr->sprites.s1.snowflakeSprites[--gWeatherPtr->snowflakeSpriteCount]); + return TRUE; + } + return FALSE; +} + +void sub_807EC40(struct Sprite *sprite) +{ + u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30); + u16 r6; + + sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); + sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); + sprite->data[0] = sprite->pos1.y * 128; + sprite->pos2.x = 0; + r6 = Random(); + sprite->data[1] = (r6 & 3) * 5 + 64; + sprite->data[7] = (r6 & 3) * 5 + 64; + StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1); + sprite->data[3] = 0; + sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1; + sprite->data[6] = (r6 & 0x1F) + 210; + sprite->data[5] = 0; +} + +void sub_807ECEC(struct Sprite *sprite) +{ + if (gWeatherPtr->unknown_6E2 > 18) + { + sprite->invisible = FALSE; + sprite->callback = sub_807ED48; + sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); + sprite->data[0] = sprite->pos1.y * 128; + gWeatherPtr->unknown_6E2 = 0; + } +} + +void sub_807ED48(struct Sprite *sprite) +{ + s16 r3; + s16 r2; + + sprite->data[0] += sprite->data[1]; + sprite->pos1.y = sprite->data[0] >> 7; + sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF; + sprite->pos2.x = gSineTable[sprite->data[3]] / 64; + + r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF; + if (r3 & 0x100) + r3 = -0x100 | r3; // hmm... what is this? + if (r3 < -3) + sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); + else if (r3 > 242) + sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX); + + r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF; + if (r2 > 163 && r2 < 171) + { + sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); + sprite->data[0] = sprite->pos1.y * 128; + sprite->data[5] = 0; + sprite->data[6] = 220; + } + else if (r2 > 242 && r2 < 250) + { + sprite->pos1.y = 163; + sprite->data[0] = sprite->pos1.y * 128; + sprite->data[5] = 0; + sprite->data[6] = 220; + sprite->invisible = TRUE; + sprite->callback = sub_807ECEC; + } + + sprite->data[5]++; + if (sprite->data[5] == sprite->data[6]) + { + sub_807EC40(sprite); + sprite->pos1.y = 250; + sprite->invisible = TRUE; + sprite->callback = sub_807ECEC; + } +} + +//------------------------------------------------------------------------------ +// Medium Rain +//------------------------------------------------------------------------------ + +void MedRain_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = FALSE; + gWeatherPtr->unknown_6D6 = 0; + gWeatherPtr->unknown_6DB = 4; + gWeatherPtr->unknown_6DC = 0; + gWeatherPtr->unknown_6D9 = 16; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; + gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment + gWeatherPtr->unknown_6ED = 0; + SetRainStrengthFromSoundEffect(SE_T_AME); +} + +void Rain_Main(void); + +void MedRain_InitAll(void) +{ + MedRain_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Rain_Main(); +} + +//------------------------------------------------------------------------------ +// Heavy Rain +//------------------------------------------------------------------------------ + +void HeavyRain_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = FALSE; + gWeatherPtr->unknown_6D6 = 0; + gWeatherPtr->unknown_6DB = 4; + gWeatherPtr->unknown_6DC = 1; + gWeatherPtr->unknown_6D9 = 24; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; + gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment + SetRainStrengthFromSoundEffect(SE_T_OOAME); +} + +void HeavyRain_InitAll(void) +{ + HeavyRain_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Rain_Main(); +} + +void UpdateThunderSound(void); +void SetThunderCounter(u16); + +void Rain_Main(void) +{ + UpdateThunderSound(); + switch (gWeatherPtr->initStep) + { + case 0: + LoadRainSpriteSheet(); + gWeatherPtr->initStep++; + break; + case 1: + if (CreateRainSprite()) + break; + gWeatherPtr->initStep++; + break; + case 2: + if (sub_807E8E8()) + break; + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + break; + case 3: + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_CHANGING_WEATHER) + break; + gWeatherPtr->initStep = 6; + break; + case 4: + gWeatherPtr->unknown_6EA = 1; + gWeatherPtr->unknown_6E6 = (Random() % 360) + 360; + gWeatherPtr->initStep++; + // fall through + case 5: + if (--gWeatherPtr->unknown_6E6 != 0) + break; + gWeatherPtr->initStep++; + break; + case 6: + gWeatherPtr->unknown_6EA = 1; + gWeatherPtr->unknown_6EB = Random() % 2; + gWeatherPtr->initStep++; + break; + case 7: + gWeatherPtr->unknown_6EC = (Random() & 1) + 1; + gWeatherPtr->initStep++; + // fall through + case 8: + sub_807D5BC(19); + if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1) + SetThunderCounter(20); + gWeatherPtr->unknown_6E6 = (Random() % 3) + 6; + gWeatherPtr->initStep++; + break; + case 9: + if (--gWeatherPtr->unknown_6E6 != 0) + break; + sub_807D5BC(3); + gWeatherPtr->unknown_6EA = 1; + if (--gWeatherPtr->unknown_6EC != 0) + { + gWeatherPtr->unknown_6E6 = (Random() % 16) + 60; + gWeatherPtr->initStep = 10; + } + else if (gWeatherPtr->unknown_6EB == 0) + { + gWeatherPtr->initStep = 4; + } + else + { + gWeatherPtr->initStep = 11; + } + break; + case 10: + if (--gWeatherPtr->unknown_6E6 != 0) + break; + gWeatherPtr->initStep = 8; + break; + case 11: + gWeatherPtr->unknown_6E6 = (Random() % 16) + 60; + gWeatherPtr->initStep++; + break; + case 12: + if (--gWeatherPtr->unknown_6E6 != 0) + break; + SetThunderCounter(100); + sub_807D5BC(19); + // Why use "% 16" everywhere else and "& 0xF" here. So dumb. + gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30; + gWeatherPtr->initStep++; + break; + case 13: + if (--gWeatherPtr->unknown_6E6 != 0) + break; + sub_807D5F0(19, 3, 5); + gWeatherPtr->initStep++; + break; + case 14: + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_IDLE) + break; + gWeatherPtr->unknown_6EA = 1; + gWeatherPtr->initStep = 4; + break; + } +} + +bool8 Rain_Finish(void) +{ + switch (gWeatherPtr->finishStep) + { + case 0: + gWeatherPtr->unknown_6EA = 0; + gWeatherPtr->finishStep++; + // fall through + case 1: + Rain_Main(); + if (gWeatherPtr->unknown_6EA != 0) + { + if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT + || gWeatherPtr->nextWeather == WEATHER_RAIN_MED + || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY) + return FALSE; + gWeatherPtr->unknown_6D9 = 0; + gWeatherPtr->finishStep++; + } + break; + case 2: + if (sub_807E8E8()) + break; + DestroyRainSprites(); + gWeatherPtr->unknown_6ED = 0; + gWeatherPtr->finishStep++; + return FALSE; + default: + return FALSE; + } + return TRUE; +} + +void SetThunderCounter(u16 max) +{ + if (gWeatherPtr->unknown_6ED == 0) + { + gWeatherPtr->thunderCounter = Random() % max; + gWeatherPtr->unknown_6ED = 1; + } +} + +void UpdateThunderSound(void) +{ + if (gWeatherPtr->unknown_6ED == 1) + { + if (gWeatherPtr->thunderCounter == 0) + { + if (IsSEPlaying()) + return; + if (Random() & 1) + PlaySE(SE_T_KAMI); + else + PlaySE(SE_T_KAMI2); + gWeatherPtr->unknown_6ED = 0; + } + else + { + gWeatherPtr->thunderCounter--; + } + } +} + +//------------------------------------------------------------------------------ +// Fog 1 +//------------------------------------------------------------------------------ + +void Fog1_Main(void); +static void CreateFog1Sprites(void); +static void DestroyFog1Sprites(void); + +void Fog1_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = FALSE; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; + if (gWeatherPtr->fog1SpritesCreated == 0) + { + gWeatherPtr->unknown_6F0 = 0; + gWeatherPtr->unknown_6F2 = 0; + gWeatherPtr->fog1ScrollPosX = 0; + Weather_SetBlendCoeffs(0, 16); + } +} + +void Fog1_InitAll(void) +{ + Fog1_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Fog1_Main(); +} + +void Fog1_Main(void) +{ + gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF; + if (++gWeatherPtr->unknown_6F0 > 3) + { + gWeatherPtr->unknown_6F0 = 0; + gWeatherPtr->unknown_6F2++; + } + switch (gWeatherPtr->initStep) + { + case 0: + CreateFog1Sprites(); + if (gWeatherPtr->currWeather == WEATHER_FOG_1) + Weather_SetTargetBlendCoeffs(12, 8, 3); + else + Weather_SetTargetBlendCoeffs(4, 16, 0); + gWeatherPtr->initStep++; + break; + case 1: + if (Weather_UpdateBlend()) + { + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + } + break; + } +} + +bool8 Fog1_Finish(void) +{ + gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF; + if (++gWeatherPtr->unknown_6F0 > 3) + { + gWeatherPtr->unknown_6F0 = 0; + gWeatherPtr->unknown_6F2++; + } + switch (gWeatherPtr->finishStep) + { + case 0: + Weather_SetTargetBlendCoeffs(0, 16, 3); + gWeatherPtr->finishStep++; + break; + case 1: + if (!Weather_UpdateBlend()) + break; + gWeatherPtr->finishStep++; + break; + case 2: + DestroyFog1Sprites(); + gWeatherPtr->finishStep++; + break; + default: + return FALSE; + } + return TRUE; +} + +#define sprColumn data[0] + +static void Fog1SpriteCallback(struct Sprite *sprite) +{ + sprite->pos2.y = (u8)gSpriteCoordOffsetY; + sprite->pos1.x = gWeatherPtr->fog1ScrollPosX + 32 + sprite->sprColumn * 64; + if (sprite->pos1.x > 0x10F) + { + sprite->pos1.x = 480 + gWeatherPtr->fog1ScrollPosX - (4 - sprite->sprColumn) * 64; + sprite->pos1.x &= 0x1FF; + } +} + +static void CreateFog1Sprites(void) +{ + u16 i; + + if (!gWeatherPtr->fog1SpritesCreated) + { + struct SpriteSheet fog1SpriteSheet = {gWeatherFog1Tiles, sizeof(gWeatherFog1Tiles), 0x1201}; + + LoadSpriteSheet(&fog1SpriteSheet); + for (i = 0; i < 20; i++) + { + u8 spriteId = CreateSpriteAtEnd(&sFog1SpriteTemplate, 0, 0, 0xFF); + + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sprite->sprColumn = i % 5; + sprite->pos1.x = (i % 5) * 64 + 32; + sprite->pos1.y = (i / 5) * 64 + 32; + gWeatherPtr->sprites.s2.fog1Sprites[i] = sprite; + } + else + { + gWeatherPtr->sprites.s2.fog1Sprites[i] = NULL; + } + } + gWeatherPtr->fog1SpritesCreated = TRUE; + } +} + +#undef sprColumn + +static void DestroyFog1Sprites(void) +{ + u16 i; + + if (gWeatherPtr->fog1SpritesCreated) + { + for (i = 0; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.fog1Sprites[i] != NULL) + DestroySprite(gWeatherPtr->sprites.s2.fog1Sprites[i]); + } + FreeSpriteTilesByTag(0x1201); + gWeatherPtr->fog1SpritesCreated = 0; + } +} + +//------------------------------------------------------------------------------ +// Volcanic ash +//------------------------------------------------------------------------------ + +void Ash_Main(void); +void LoadAshSpriteSheet(void); +void CreateAshSprites(void); +void DestroyAshSprites(void); + +void Ash_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = FALSE; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; + gWeatherPtr->unknown_6FE = 20; + if (!gWeatherPtr->ashSpritesCreated) + { + Weather_SetBlendCoeffs(0, 16); + REG_BLDALPHA = BLDALPHA_BLEND(64, 63); // Those aren't even valid coefficients! + } +} + +void Ash_InitAll(void) +{ + Ash_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Ash_Main(); +} + +void Ash_Main(void) +{ + gWeatherPtr->unknown_6FC = gSpriteCoordOffsetX & 0x1FF; + while (gWeatherPtr->unknown_6FC > 0xEF) + gWeatherPtr->unknown_6FC -= 0xF0; + switch (gWeatherPtr->initStep) + { + case 0: + LoadAshSpriteSheet(); + gWeatherPtr->initStep++; + break; + case 1: + if (!gWeatherPtr->ashSpritesCreated) + CreateAshSprites(); + Weather_SetTargetBlendCoeffs(16, 0, 1); + gWeatherPtr->initStep++; + break; + case 2: + if (!Weather_UpdateBlend()) + break; + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + break; + default: + Weather_UpdateBlend(); + break; + } +} + +bool8 Ash_Finish(void) +{ + switch (gWeatherPtr->finishStep) + { + case 0: + Weather_SetTargetBlendCoeffs(0, 16, 1); + gWeatherPtr->finishStep++; + break; + case 1: + if (!Weather_UpdateBlend()) + break; + DestroyAshSprites(); + gWeatherPtr->finishStep++; + break; + case 2: + REG_BLDALPHA = 0; + gWeatherPtr->finishStep++; + return FALSE; + default: + return FALSE; + } + return TRUE; +} + +static const struct SpriteSheet sAshSpriteSheet = {gWeatherAshTiles, sizeof(gWeatherAshTiles), 0x1202}; + +void LoadAshSpriteSheet(void) +{ + LoadSpriteSheet(&sAshSpriteSheet); +} + +const struct OamData gOamData_839ABB8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 15, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_839ABC0[] = +{ + ANIMCMD_FRAME(0, 60), + ANIMCMD_FRAME(64, 60), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_839ABCC[] = +{ + gSpriteAnim_839ABC0, +}; + +void sub_807FAA8(struct Sprite *); +static const struct SpriteTemplate sAshSpriteTemplate = +{ + .tileTag = 4610, + .paletteTag = 4608, + .oam = &gOamData_839ABB8, + .anims = gSpriteAnimTable_839ABCC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_807FAA8, +}; + +void CreateAshSprites(void) +{ + u8 i; + + if (!gWeatherPtr->ashSpritesCreated) + { + for (i = 0; i < 20; i++) + { + u8 spriteId = CreateSpriteAtEnd(&sAshSpriteTemplate, 0, 0, 0x4E); + + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sprite->data[1] = 0; + sprite->data[2] = (u8)(i % 5); + sprite->data[3] = (u8)(i / 5); + sprite->data[0] = sprite->data[3] * 64 + 32; + gWeatherPtr->sprites.s2.ashSprites[i] = sprite; + } + else + { + gWeatherPtr->sprites.s2.ashSprites[i] = NULL; + } + } + gWeatherPtr->ashSpritesCreated = TRUE; + } +} + +void DestroyAshSprites(void) +{ + u16 i; + + if (gWeatherPtr->ashSpritesCreated) + { + for (i = 0; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) + DestroySprite(gWeatherPtr->sprites.s2.ashSprites[i]); + } + FreeSpriteTilesByTag(0x1202); + gWeatherPtr->ashSpritesCreated = FALSE; + } +} + +void sub_807FAA8(struct Sprite *sprite) +{ + sprite->data[1]++; + if (sprite->data[1] > 5) + { + sprite->data[1] = 0; + sprite->data[0]++; + } + sprite->pos1.y = gSpriteCoordOffsetY + sprite->data[0]; + sprite->pos1.x = gWeatherPtr->unknown_6FC + 32 + sprite->data[2] * 64; + if (sprite->pos1.x > 271) + { + sprite->pos1.x = gWeatherPtr->unknown_6FC + 0x1E0 - (4 - sprite->data[2]) * 64; + sprite->pos1.x &= 0x1FF; + } +} + +//------------------------------------------------------------------------------ +// Fog 2 +//------------------------------------------------------------------------------ + +void Fog2_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = 0; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; + gWeatherPtr->unknown_6F0 = 0; + gWeatherPtr->unknown_6F2 = 1; + if (gWeatherPtr->fog2SpritesCreated == 0) + { + gWeatherPtr->unknown_71C = 0; + gWeatherPtr->unknown_71E = 0; + gWeatherPtr->unknown_720 = 0; + gWeatherPtr->unknown_722 = 0; + gWeatherPtr->unknown_718 = 0; + gWeatherPtr->unknown_71A = 0; + Weather_SetBlendCoeffs(0, 16); + } +} + +void Fog2_Main(void); + +void Fog2_InitAll(void) +{ + Fog2_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Fog2_Main(); +} + +void sub_807FC9C(void); +void CreateFog2Sprites(void); + +void Fog2_Main(void) +{ + sub_807FC9C(); + switch (gWeatherPtr->initStep) + { + case 0: + CreateFog2Sprites(); + gWeatherPtr->initStep++; + break; + case 1: + Weather_SetTargetBlendCoeffs(12, 8, 8); + gWeatherPtr->initStep++; + break; + case 2: + if (!Weather_UpdateBlend()) + break; + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + break; + } +} + +void DestroyFog2Sprites(void); + +bool8 Fog2_Finish(void) +{ + sub_807FC9C(); + switch (gWeatherPtr->finishStep) + { + case 0: + Weather_SetTargetBlendCoeffs(0, 16, 1); + gWeatherPtr->finishStep++; + break; + case 1: + if (!Weather_UpdateBlend()) + break; + gWeatherPtr->finishStep++; + break; + case 2: + DestroyFog2Sprites(); + gWeatherPtr->finishStep++; + break; + default: + return FALSE; + } + return TRUE; +} + +void sub_807FC9C(void) +{ + if (++gWeatherPtr->unknown_71C > 2) + { + gWeatherPtr->unknown_720++; + gWeatherPtr->unknown_71C = 0; + } + + if (++gWeatherPtr->unknown_71E > 4) + { + gWeatherPtr->unknown_722++; + gWeatherPtr->unknown_71E = 0; + } + + gWeatherPtr->unknown_718 = (gSpriteCoordOffsetX - gWeatherPtr->unknown_720) & 0xFF; + gWeatherPtr->unknown_71A = gSpriteCoordOffsetY + gWeatherPtr->unknown_722; +} + +extern const struct SpriteTemplate sFog2SpriteTemplate; // defined below + +void CreateFog2Sprites(void) +{ + u16 i; + + if (!gWeatherPtr->fog2SpritesCreated) + { + struct SpriteSheet fog2SpriteSheet = {gWeatherFog2Tiles, sizeof(gWeatherFog2Tiles), 0x1203}; + + LoadSpriteSheet(&fog2SpriteSheet); + for (i = 0; i < 20; i++) + { + u8 spriteId = CreateSpriteAtEnd(&sFog2SpriteTemplate, 0, (i / 5) * 64, 0xFF); + + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[spriteId]; + + sprite->data[0] = i % 5; + sprite->data[1] = i / 5; + gWeatherPtr->sprites.s2.fog2Sprites[i] = sprite; + } + else + { + gWeatherPtr->sprites.s2.fog2Sprites[i] = NULL; + } + } + gWeatherPtr->fog2SpritesCreated = TRUE; + } +} + +const struct OamData gOamData_839ABF0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_839ABF8[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_839AC00[] = +{ + gSpriteAnim_839ABF8, +}; + +void Fog2SpriteCallback(struct Sprite *); +const struct SpriteTemplate sFog2SpriteTemplate = +{ + .tileTag = 4611, + .paletteTag = 4608, + .oam = &gOamData_839ABF0, + .anims = gSpriteAnimTable_839AC00, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = Fog2SpriteCallback, +}; + +void DestroyFog2Sprites(void) +{ + u16 i; + + if (gWeatherPtr->fog2SpritesCreated) + { + for (i = 0; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.fog2Sprites[i] != NULL) + DestroySprite(gWeatherPtr->sprites.s2.fog2Sprites[i]); + } + FreeSpriteTilesByTag(0x1203); + gWeatherPtr->fog2SpritesCreated = FALSE; + } +} + +void Fog2SpriteCallback(struct Sprite *sprite) +{ + sprite->pos2.y = gWeatherPtr->unknown_71A; + sprite->pos1.x = gWeatherPtr->unknown_718 + 32 + sprite->data[0] * 64; + if (sprite->pos1.x > 271) + { + sprite->pos1.x = gWeatherPtr->unknown_718 + 0x1E0 - (4 - sprite->data[0]) * 64; + sprite->pos1.x &= 0x1FF; + } +} + +//------------------------------------------------------------------------------ +// Sandstorm +//------------------------------------------------------------------------------ + +void Sandstorm_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->weatherGfxLoaded = 0; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; + if (gWeatherPtr->sandstormSprites1Created == 0) + { + gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0; + gWeatherPtr->unknown_712 = 8; + gWeatherPtr->unknown_714 = 0; + // Dead code. How does the compiler not optimize this out? + if (gWeatherPtr->unknown_712 > 0x5F) + gWeatherPtr->unknown_712 = 0x80 - gWeatherPtr->unknown_712; + Weather_SetBlendCoeffs(0, 16); + } +} + +void Sandstorm_Main(void); + +void Sandstorm_InitAll(void) +{ + Sandstorm_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Sandstorm_Main(); +} + +void sub_808002C(void); +void sub_8080064(void); +void CreateSandstormSprites_1(void); +void CreateSandstormSprites_2(void); + +void Sandstorm_Main(void) +{ + sub_8080064(); + sub_808002C(); + if (gWeatherPtr->unknown_712 > 0x5F) + gWeatherPtr->unknown_712 = 32; + switch (gWeatherPtr->initStep) + { + case 0: + CreateSandstormSprites_1(); + CreateSandstormSprites_2(); + gWeatherPtr->initStep++; + break; + case 1: + Weather_SetTargetBlendCoeffs(16, 0, 0); + gWeatherPtr->initStep++; + break; + case 2: + if (!Weather_UpdateBlend()) + break; + gWeatherPtr->weatherGfxLoaded = TRUE; + gWeatherPtr->initStep++; + break; + } +} + +void sub_80800E4(void); + +bool8 Sandstorm_Finish(void) +{ + sub_8080064(); + sub_808002C(); + switch (gWeatherPtr->finishStep) + { + case 0: + Weather_SetTargetBlendCoeffs(0, 16, 0); + gWeatherPtr->finishStep++; + break; + case 1: + if (!Weather_UpdateBlend()) + break; + gWeatherPtr->finishStep++; + break; + case 2: + sub_80800E4(); + gWeatherPtr->finishStep++; + break; + default: + return FALSE; + } + return TRUE; +} + +void sub_808002C(void) +{ + if (gWeatherPtr->unknown_714++ > 4) + { + gWeatherPtr->unknown_712++; + gWeatherPtr->unknown_714 = 0; + } +} + +void sub_8080064(void) +{ + gWeatherPtr->unknown_704 -= gSineTable[gWeatherPtr->unknown_712] * 4; + gWeatherPtr->unknown_708 -= gSineTable[gWeatherPtr->unknown_712]; + gWeatherPtr->unknown_70E = (gSpriteCoordOffsetX + (gWeatherPtr->unknown_704 >> 8)) & 0xFF; + gWeatherPtr->unknown_710 = gSpriteCoordOffsetY + (gWeatherPtr->unknown_708 >> 8); +} + +void sub_80800E4(void) +{ + u16 i; + + if (gWeatherPtr->sandstormSprites1Created) + { + for (i = 0; i < 20; i++) + { + if (gWeatherPtr->sprites.s2.sandstormSprites1[i] != NULL) + DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites1[i]); + } + gWeatherPtr->sandstormSprites1Created = FALSE; + FreeSpriteTilesByTag(0x1204); + } + + if (gWeatherPtr->sandstormSprites2Created) + { + for (i = 0; i < 5; i++) + { + if (gWeatherPtr->sprites.s2.sandstormSprites2[i] != NULL) + DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites2[i]); + } + gWeatherPtr->sandstormSprites2Created = FALSE; + } +} + +const struct OamData gOamData_839AC1C = +{ + .y = 0, + .affineMode = 0, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_839AC24[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_839AC2C[] = +{ + ANIMCMD_FRAME(64, 3), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_839AC34[] = +{ + gSpriteAnim_839AC24, + gSpriteAnim_839AC2C, +}; + +void SandstormSpriteCallback1(struct Sprite *); +const struct SpriteTemplate sSandstormSpriteTemplate = +{ + .tileTag = 4612, + .paletteTag = 4609, + .oam = &gOamData_839AC1C, + .anims = gSpriteAnimTable_839AC34, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SandstormSpriteCallback1, +}; + +static const struct SpriteSheet sSandstormSpriteSheet = {gWeatherSandstormTiles, sizeof(gWeatherSandstormTiles), 0x1204}; + +void CreateSandstormSprites_1(void) +{ + u16 i; + + if (!gWeatherPtr->sandstormSprites1Created) + { + LoadSpriteSheet(&sSandstormSpriteSheet); + LoadCustomWeatherSpritePalette(gUnknown_08397128); + for (i = 0; i < 20; i++) + { + u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1); + + if (spriteId != MAX_SPRITES) + { + gWeatherPtr->sprites.s2.sandstormSprites1[i] = &gSprites[spriteId]; + gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[0] = i % 5; + gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[1] = i / 5; + } + else + { + gWeatherPtr->sprites.s2.sandstormSprites1[i] = NULL; + } + } + gWeatherPtr->sandstormSprites1Created = TRUE; + } +} + +const u16 gUnknown_0839AC5C[] = {0, 120, 80, 160, 40, 0}; + +void SandstormSpriteCallback2(struct Sprite *); + +void CreateSandstormSprites_2(void) +{ + u16 i; + + if (!gWeatherPtr->sandstormSprites2Created) + { + for (i = 0; i < 5; i++) + { + u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, i * 48 + 0x18, 0xD0, 1); + + if (spriteId != MAX_SPRITES) + { + gWeatherPtr->sprites.s2.sandstormSprites2[i] = &gSprites[spriteId]; + gWeatherPtr->sprites.s2.sandstormSprites2[i]->oam.size = 2; + gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[1] = i * 51; + gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[0] = 8; + gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[2] = 0; + gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[4] = 0x6730; + gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[3] = gUnknown_0839AC5C[i]; + StartSpriteAnim(gWeatherPtr->sprites.s2.sandstormSprites2[i], 1); + CalcCenterToCornerVec(gWeatherPtr->sprites.s2.sandstormSprites2[i], 0, 2, 0); + gWeatherPtr->sprites.s2.sandstormSprites2[i]->callback = SandstormSpriteCallback2; + } + else + { + gWeatherPtr->sprites.s2.sandstormSprites2[i] = NULL; + } + gWeatherPtr->sandstormSprites2Created = TRUE; + } + } +} + +void SandstormSpriteCallback1(struct Sprite *sprite) +{ + sprite->pos2.y = gWeatherPtr->unknown_710; + sprite->pos1.x = gWeatherPtr->unknown_70E + 32 + sprite->data[0] * 64; + if (sprite->pos1.x > 271) + { + sprite->pos1.x = gWeatherPtr->unknown_70E + 0x1E0 - (4 - sprite->data[0]) * 64; + sprite->pos1.x &= 0x1FF; + } +} + +void SandstormSpriteCallback3(struct Sprite *); + +void SandstormSpriteCallback2(struct Sprite *sprite) +{ + if (--sprite->data[3] == -1) + sprite->callback = SandstormSpriteCallback3; +} + +void SandstormSpriteCallback3(struct Sprite *sprite) +{ + u32 x; + u32 y; + + if (--sprite->pos1.y < -48) + { + sprite->pos1.y = 208; + sprite->data[0] = 4; + } + x = sprite->data[0] * gSineTable[sprite->data[1]]; + y = sprite->data[0] * gSineTable[sprite->data[1] + 64]; + sprite->pos2.x = x >> 8; + sprite->pos2.y = y >> 8; + sprite->data[1] = (sprite->data[1] + 10) & 0xFF; + if (++sprite->data[2] > 8) + { + sprite->data[2] = 0; + sprite->data[0]++; + } +} + +//------------------------------------------------------------------------------ +// Shade +//------------------------------------------------------------------------------ + +void Shade_InitVars(void) +{ + gWeatherPtr->initStep = 0; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; +} + +void Shade_InitAll(void) +{ + Shade_InitVars(); +} + +void Shade_Main(void) +{ +} + +bool8 Shade_Finish(void) +{ + return FALSE; +} + +//------------------------------------------------------------------------------ +// Weather 14 +//------------------------------------------------------------------------------ + +const u8 gUnknown_0839AC68[] = {40, 90, 60, 90, 2, 60, 40, 30}; + +const struct SpriteSheet gWeatherBubbleSpriteSheet = {gWeatherBubbleTiles, sizeof(gWeatherBubbleTiles), 0x1205}; + +void Bubbles_InitVars(void) +{ + Fog1_InitVars(); + if (gWeatherPtr->unknown_72E == 0) + { + LoadSpriteSheet(&gWeatherBubbleSpriteSheet); + gWeatherPtr->unknown_728 = 0; + gWeatherPtr->unknown_726 = gUnknown_0839AC68[0]; + gWeatherPtr->unknown_72A = 0; + gWeatherPtr->unknown_72C = 0; + } +} + +void Bubbles_Main(void); + +void Bubbles_InitAll(void) +{ + Bubbles_InitVars(); + while (gWeatherPtr->weatherGfxLoaded == FALSE) + Bubbles_Main(); +} + +void sub_8080588(u16); + +void Bubbles_Main(void) +{ + Fog1_Main(); + if (++gWeatherPtr->unknown_726 > gUnknown_0839AC68[gWeatherPtr->unknown_728]) + { + gWeatherPtr->unknown_726 = 0; + if (++gWeatherPtr->unknown_728 > 7) + gWeatherPtr->unknown_728 = 0; + sub_8080588(gWeatherPtr->unknown_72A); + if (++gWeatherPtr->unknown_72A > 12) + gWeatherPtr->unknown_72A = 0; + } +} + +void sub_8080610(void); + +bool8 Bubbles_Finish(void) +{ + if (!Fog1_Finish()) + { + sub_8080610(); + return FALSE; + } + return TRUE; +} + +const s16 gUnknown_0839AC78[][2] = +{ + {120, 160}, + {376, 160}, + { 40, 140}, + {296, 140}, + {180, 130}, + {436, 130}, + { 60, 160}, + {436, 160}, + {220, 180}, + {476, 180}, + { 10, 90}, + {266, 90}, + {256, 160}, +}; + +const union AnimCmd gSpriteAnim_839ACAC[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_839ACB8[] = +{ + gSpriteAnim_839ACAC, +}; + +extern const struct OamData gOamData_837DF24; + +void unc_0807DAB4(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_839ACBC = +{ + .tileTag = 4613, + .paletteTag = 4608, + .oam = &gOamData_837DF24, + .anims = gSpriteAnimTable_839ACB8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = unc_0807DAB4, +}; + +void sub_8080588(u16 a) +{ + s16 x = gUnknown_0839AC78[a][0]; + s16 y = gUnknown_0839AC78[a][1] - gSpriteCoordOffsetY; + u8 spriteId = CreateSpriteAtEnd( + &gSpriteTemplate_839ACBC, + x, + y, + 0); + + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].coordOffsetEnabled = TRUE; + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].data[2] = 0; + gWeatherPtr->unknown_72C++; + } +} + +void sub_8080610(void) +{ + u16 i; + + for (i = 0; i < 64; i++) + { + if (gSprites[i].template == &gSpriteTemplate_839ACBC) + DestroySprite(&gSprites[i]); + } + FreeSpriteTilesByTag(0x1205); +} + +void unc_0807DAB4(struct Sprite *sprite) +{ + ++sprite->data[0]; + if (++sprite->data[0] > 8) // double increment + { + sprite->data[0] = 0; + if (sprite->data[1] == 0) + { + if (++sprite->pos2.x > 4) + sprite->data[1] = 1; + } + else + { + if (--sprite->pos2.x <= 0) + sprite->data[1] = 0; + } + } + sprite->pos1.y -= 3; + if (++sprite->data[2] > 0x77) + DestroySprite(sprite); +} + +//------------------------------------------------------------------------------ + +u8 TranslateWeatherNum(u8); +void UpdateRainCounter(u8, u8); + +void SetSav1Weather(u32 weather) +{ + u8 oldWeather = gSaveBlock1.weather; + + gSaveBlock1.weather = TranslateWeatherNum(weather); + UpdateRainCounter(gSaveBlock1.weather, oldWeather); +} + +u8 GetSav1Weather(void) +{ + return gSaveBlock1.weather; +} + +void SetSav1WeatherFromCurrMapHeader(void) +{ + u8 oldWeather = gSaveBlock1.weather; + + gSaveBlock1.weather = TranslateWeatherNum(gMapHeader.weather); + UpdateRainCounter(gSaveBlock1.weather, oldWeather); +} + +void SetWeather(u32 weather) +{ + SetSav1Weather(weather); + ChangeWeather(GetSav1Weather()); +} + +void SetWeather_Unused(u32 weather) +{ + SetSav1Weather(weather); + sub_807C988(GetSav1Weather()); +} + +void DoCurrentWeather(void) +{ + ChangeWeather(GetSav1Weather()); +} + +void sub_8080750(void) +{ + sub_807C988(GetSav1Weather()); +} + +static const u8 sWeatherCycle1[] = {2, 3, 5, 3}; +static const u8 sWeatherCycle2[] = {2, 2, 3, 2}; + +u8 TranslateWeatherNum(u8 weather) +{ + switch (weather) + { + case 0: return 0; + case 1: return 1; + case 2: return 2; + case 3: return 3; + case 4: return 4; + case 5: return 5; + case 6: return 6; + case 7: return 7; + case 8: return 8; + case 9: return 9; + case 10: return 10; + case 11: return 11; + case 12: return 12; + case 13: return 13; + case 14: return 14; + case 20: return sWeatherCycle1[gSaveBlock1.filler_2F]; + case 21: return sWeatherCycle2[gSaveBlock1.filler_2F]; + default: return 0; + } +} + +void UpdateWeatherPerDay(u16 increment) +{ + u16 weatherStage = gSaveBlock1.filler_2F + increment; + weatherStage %= 4; + gSaveBlock1.filler_2F = weatherStage; +} + +void UpdateRainCounter(u8 newWeather, u8 oldWeather) +{ + if (newWeather != oldWeather + && (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED)) + IncrementGameStat(GAME_STAT_GOT_RAINED_ON); +} diff --git a/src/fieldmap.c b/src/fieldmap.c new file mode 100644 index 000000000..7383bb174 --- /dev/null +++ b/src/fieldmap.c @@ -0,0 +1,957 @@ +#include "global.h" +#include "fieldmap.h" +#include "palette.h" +#include "overworld.h" +#include "script.h" +#include "secret_base.h" +#include "tv.h" + +struct ConnectionFlags +{ + u8 south:1; + u8 north:1; + u8 west:1; + u8 east:1; +}; + +struct Coords32 +{ + s32 x; + s32 y; +}; + +EWRAM_DATA static u16 gUnknown_02029828[0x2800] = {0}; +EWRAM_DATA struct MapHeader gMapHeader = {0}; +EWRAM_DATA struct Camera gCamera = {0}; +EWRAM_DATA static struct ConnectionFlags gUnknown_0202E850 = {0}; + +struct BackupMapData gUnknown_03004870; + +static const struct ConnectionFlags sDummyConnectionFlags = {0}; + +struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection) +{ + return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum); +} + +void not_trainer_hill_battle_pyramid(void) +{ + mapheader_copy_mapdata_with_padding(&gMapHeader); + sub_80BB970(gMapHeader.events); + mapheader_run_script_with_tag_x1(); +} + +void sub_8055FC0(void) +{ + mapheader_copy_mapdata_with_padding(&gMapHeader); + sub_80BBCCC(0); + sub_80BB970(gMapHeader.events); + sub_8056670(); + mapheader_run_script_with_tag_x1(); + UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); +} + +void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader) +{ + struct MapData *mapData; + int width; + int height; + mapData = mapHeader->mapData; + CpuFastFill16(0x03ff, gUnknown_02029828, sizeof(gUnknown_02029828)); + gUnknown_03004870.map = gUnknown_02029828; + width = mapData->width + 15; + gUnknown_03004870.width = width; + height = mapData->height + 14; + gUnknown_03004870.height = height; + if (width * height <= 0x2800) + { + map_copy_with_padding(mapData->map, mapData->width, mapData->height); + sub_80560AC(mapHeader); + } +} + +void map_copy_with_padding(u16 *map, u16 width, u16 height) +{ + u16 *dest; + int y; + dest = gUnknown_03004870.map; + dest += gUnknown_03004870.width * 7 + 7; + for (y = 0; y < height; y++) + { + CpuCopy16(map, dest, width * 2); + dest += width + 0xf; + map += width; + } +} + +void sub_80560AC(struct MapHeader *mapHeader) +{ + // BUG: This results in a null pointer dereference when mapHeader->connections + // is NULL, causing count to be assigned a garbage value. This garbage value + // just so happens to have the most significant bit set, so it is treated as + // negative and the loop below thankfully never executes in this scenario. + int count = mapHeader->connections->count; + struct MapConnection *connection = mapHeader->connections->connections; + int i; + + gUnknown_0202E850 = sDummyConnectionFlags; + for (i = 0; i < count; i++, connection++) + { + struct MapHeader *cMap = mapconnection_get_mapheader(connection); + u32 offset = connection->offset; + + switch (connection->direction) + { + case CONNECTION_SOUTH: + fillSouthConnection(mapHeader, cMap, offset); + gUnknown_0202E850.south = 1; + break; + case CONNECTION_NORTH: + fillNorthConnection(mapHeader, cMap, offset); + gUnknown_0202E850.north = 1; + break; + case CONNECTION_WEST: + fillWestConnection(mapHeader, cMap, offset); + gUnknown_0202E850.west = 1; + break; + case CONNECTION_EAST: + fillEastConnection(mapHeader, cMap, offset); + gUnknown_0202E850.east = 1; + break; + } + } +} + +void sub_8056134(int x, int y, struct MapHeader *mapHeader, int x2, int y2, int width, int height) +{ + int i; + u16 *src; + u16 *dest; + int mapWidth; + + mapWidth = mapHeader->mapData->width; + src = &mapHeader->mapData->map[mapWidth * y2 + x2]; + dest = &gUnknown_03004870.map[gUnknown_03004870.width * y + x]; + + for (i = 0; i < height; i++) + { + CpuCopy16(src, dest, width * 2); + dest += gUnknown_03004870.width; + src += mapWidth; + } +} + +void fillSouthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) +{ + int x, y; + int x2; + int width; + int cWidth; + + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapData->width; + x = offset + 7; + y = mapHeader->mapData->height + 7; + if (x < 0) + { + x2 = -x; + x += cWidth; + if (x < gUnknown_03004870.width) + { + width = x; + } + else + { + width = gUnknown_03004870.width; + } + x = 0; + } + else + { + x2 = 0; + if (x + cWidth < gUnknown_03004870.width) + { + width = cWidth; + } + else + { + width = gUnknown_03004870.width - x; + } + } + sub_8056134( + x, y, + connectedMapHeader, + x2, /*y2*/ 0, + width, /*height*/ 7); + } +} + +void fillNorthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) +{ + int x; + int x2, y2; + int width; + int cWidth, cHeight; + + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapData->width; + cHeight = connectedMapHeader->mapData->height; + x = offset + 7; + y2 = cHeight - 7; + if (x < 0) + { + x2 = -x; + x += cWidth; + if (x < gUnknown_03004870.width) + { + width = x; + } + else + { + width = gUnknown_03004870.width; + } + x = 0; + } + else + { + x2 = 0; + if (x + cWidth < gUnknown_03004870.width) + { + width = cWidth; + } + else + { + width = gUnknown_03004870.width - x; + } + } + + sub_8056134( + x, /*y*/ 0, + connectedMapHeader, + x2, y2, + width, /*height*/ 7); + + } +} + + +void fillWestConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) +{ + int y; + int x2, y2; + int height; + int cWidth, cHeight; + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapData->width; + cHeight = connectedMapHeader->mapData->height; + y = offset + 7; + x2 = cWidth - 7; + if (y < 0) + { + y2 = -y; + if (y + cHeight < gUnknown_03004870.height) + { + height = y + cHeight; + } + else + { + height = gUnknown_03004870.height; + } + y = 0; + } + else + { + y2 = 0; + if (y + cHeight < gUnknown_03004870.height) + { + height = cHeight; + } + else + { + height = gUnknown_03004870.height - y; + } + } + + sub_8056134( + /*x*/ 0, y, + connectedMapHeader, + x2, y2, + /*width*/ 7, height); + } +} + +void fillEastConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) +{ + int x, y; + int y2; + int height; + int cHeight; + if (connectedMapHeader) + { + cHeight = connectedMapHeader->mapData->height; + x = mapHeader->mapData->width + 7; + y = offset + 7; + if (y < 0) + { + y2 = -y; + if (y + cHeight < gUnknown_03004870.height) + { + height = y + cHeight; + } + else + { + height = gUnknown_03004870.height; + } + y = 0; + } + else + { + y2 = 0; + if (y + cHeight < gUnknown_03004870.height) + { + height = cHeight; + } + else + { + height = gUnknown_03004870.height - y; + } + } + + sub_8056134( + x, y, + connectedMapHeader, + /*x2*/ 0, y2, + /*width*/ 8, height); + } +} + +union Block +{ + struct + { + u16 block:10; + u16 collision:2; + u16 elevation:4; + } block; + u16 value; +}; + +u8 MapGridGetZCoordAt(int x, int y) +{ + u16 block; + int i; + u16 *border; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } + else + { + border = gMapHeader.mapData->border; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = gMapHeader.mapData->border[i]; + block |= 0xc00; + } + if (block == 0x3ff) + { + return 0; + } + return block >> 12; +} + +u8 MapGridIsImpassableAt(int x, int y) +{ + u16 block; + int i; + u16 *border; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } + else + { + border = gMapHeader.mapData->border; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = gMapHeader.mapData->border[i]; + block |= 0xc00; + } + if (block == 0x3ff) + { + return 1; + } + return (block & 0xc00) >> 10; +} + +u32 MapGridGetMetatileIdAt(int x, int y) +{ + u16 block; + int i; + int j; + struct MapData *mapData; + u16 *border; + u16 block2; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } + else + { + mapData = gMapHeader.mapData; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = mapData->border[i] | 0xc00; + } + if (block == 0x3ff) + { + border = gMapHeader.mapData->border; + j = (x + 1) & 1; + j += ((y + 1) & 1) * 2; + block2 = gMapHeader.mapData->border[j]; + block2 |= 0xc00; + return block2 & block; + } + return block & 0x3ff; +} + +u32 MapGridGetMetatileBehaviorAt(int x, int y) +{ + u16 metatile; + metatile = MapGridGetMetatileIdAt(x, y); + return GetBehaviorByMetatileId(metatile) & 0xff; +} + +u8 MapGridGetMetatileLayerTypeAt(int x, int y) +{ + u16 metatile; + metatile = MapGridGetMetatileIdAt(x, y); + return (GetBehaviorByMetatileId(metatile) & 0xf000) >> 12; +} + +void MapGridSetMetatileIdAt(int x, int y, u16 metatile) +{ + int i; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + i = x + y * gUnknown_03004870.width; + gUnknown_03004870.map[i] = (gUnknown_03004870.map[i] & 0xf000) | (metatile & 0xfff); + } +} + +void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) +{ + int i; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + i = x + gUnknown_03004870.width * y; + gUnknown_03004870.map[i] = metatile; + } +} + +u32 GetBehaviorByMetatileId(u16 metatile) +{ + u16 *attributes; + if (metatile <= 0x1ff) + { + attributes = gMapHeader.mapData->primaryTileset->metatileAttributes; + return attributes[metatile]; + } + else if (metatile <= 0x3ff) + { + attributes = gMapHeader.mapData->secondaryTileset->metatileAttributes; + return attributes[metatile - 0x200]; + } + else + { + return 0xff; + } +} + +void save_serialize_map(void) +{ + int i, j; + int x, y; + u16 *mapView; + int width; + mapView = gSaveBlock1.mapView; + width = gUnknown_03004870.width; + x = gSaveBlock1.pos.x; + y = gSaveBlock1.pos.y; + for (i = y; i < y + 14; i++) + { + for (j = x; j < x + 15; j++) + { + *mapView++ = gUnknown_02029828[width * i + j]; + } + } +} + +int sub_8056618(void) +{ + u16 i; + u32 r2; + r2 = 0; + for (i = 0; i < 0x200; i++) + { + r2 |= gSaveBlock1.mapView[i]; + } + if (r2 == 0) + { + return 1; + } + return 0; +} + +void sav2_mapdata_clear(void) +{ + CpuFill16(0, gSaveBlock1.mapView, sizeof(gSaveBlock1.mapView)); +} + +void sub_8056670(void) +{ + int i, j; + int x, y; + u16 *mapView; + int width; + mapView = gSaveBlock1.mapView; + if (!sub_8056618()) + { + width = gUnknown_03004870.width; + x = gSaveBlock1.pos.x; + y = gSaveBlock1.pos.y; + for (i = y; i < y + 14; i++) + { + for (j = x; j < x + 15; j++) + { + gUnknown_02029828[width * i + j] = *mapView++; + } + } + sav2_mapdata_clear(); + } +} + +void sub_80566F0(u8 a1) +{ + u16 *mapView; + int width; + int x0, y0; + int x2, y2; + u16 *src, *dest; + int srci, desti; + int r9, r8; + int x, y; + int i, j; + mapView = gSaveBlock1.mapView; + width = gUnknown_03004870.width; + r9 = 0; + r8 = 0; + x0 = gSaveBlock1.pos.x; + y0 = gSaveBlock1.pos.y; + x2 = 15; + y2 = 14; + switch (a1) + { + case CONNECTION_NORTH: + y0 += 1; + y2 = 13; + break; + case CONNECTION_SOUTH: + r8 = 1; + y2 = 13; + break; + case CONNECTION_WEST: + x0 += 1; + x2 = 14; + break; + case CONNECTION_EAST: + r9 = 1; + x2 = 14; + break; + } + for (y = 0; y < y2; y++) + { + i = 0; + j = 0; + for (x = 0; x < x2; x++) + { + desti = width * (y + y0); + srci = (y + r8) * 15 + r9; + src = &mapView[srci + i]; + dest = &gUnknown_02029828[x0 + desti + j]; + *dest = *src; + i++; + j++; + } + } + sav2_mapdata_clear(); +} + +int GetMapBorderIdAt(int x, int y) +{ + struct MapData *mapData; + u16 block, block2; + int i, j; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) + { + i = gUnknown_03004870.width; + i *= y; + block = gUnknown_03004870.map[x + i]; + if (block == 0x3ff) + { + goto fail; + } + } + else + { + mapData = gMapHeader.mapData; + j = (x + 1) & 1; + j += ((y + 1) & 1) * 2; + block2 = 0xc00 | mapData->border[j]; + if (block2 == 0x3ff) + { + goto fail; + } + } + goto success; +fail: + return -1; +success: + + if (x >= (gUnknown_03004870.width - 8)) + { + if (!gUnknown_0202E850.east) + { + return -1; + } + return CONNECTION_EAST; + } + else if (x < 7) + { + if (!gUnknown_0202E850.west) + { + return -1; + } + return CONNECTION_WEST; + } + else if (y >= (gUnknown_03004870.height - 7)) + { + if (!gUnknown_0202E850.south) + { + return -1; + } + return CONNECTION_SOUTH; + } + else if (y < 7) + { + if (!gUnknown_0202E850.north) + { + return -1; + } + return CONNECTION_NORTH; + } + else + { + return 0; + } +} + +int GetPostCameraMoveMapBorderId(int x, int y) +{ + return GetMapBorderIdAt(gSaveBlock1.pos.x + 7 + x, gSaveBlock1.pos.y + 7 + y); +} + +int CanCameraMoveInDirection(int direction) +{ + int x, y; + x = gSaveBlock1.pos.x + 7 + gUnknown_0821664C[direction].x; + y = gSaveBlock1.pos.y + 7 + gUnknown_0821664C[direction].y; + if (GetMapBorderIdAt(x, y) == -1) + { + return 0; + } + return 1; +} + +void sub_8056918(struct MapConnection *connection, int direction, int x, int y) +{ + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (direction) + { + case CONNECTION_EAST: + gSaveBlock1.pos.x = -x; + gSaveBlock1.pos.y -= connection->offset; + break; + case CONNECTION_WEST: + gSaveBlock1.pos.x = mapHeader->mapData->width; + gSaveBlock1.pos.y -= connection->offset; + break; + case CONNECTION_SOUTH: + gSaveBlock1.pos.x -= connection->offset; + gSaveBlock1.pos.y = -y; + break; + case CONNECTION_NORTH: + gSaveBlock1.pos.x -= connection->offset; + gSaveBlock1.pos.y = mapHeader->mapData->height; + break; + } +} + +bool8 CameraMove(int x, int y) +{ + unsigned int direction; + struct MapConnection *connection; + int old_x, old_y; + gCamera.field_0 = FALSE; + direction = GetPostCameraMoveMapBorderId(x, y); + if (direction + 1 <= 1) + { + gSaveBlock1.pos.x += x; + gSaveBlock1.pos.y += y; + } + else + { + save_serialize_map(); + old_x = gSaveBlock1.pos.x; + old_y = gSaveBlock1.pos.y; + connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y); + sub_8056918(connection, direction, x, y); + sub_80538F0(connection->mapGroup, connection->mapNum); + gCamera.field_0 = TRUE; + gCamera.x = old_x - gSaveBlock1.pos.x; + gCamera.y = old_y - gSaveBlock1.pos.y; + gSaveBlock1.pos.x += x; + gSaveBlock1.pos.y += y; + sub_80566F0(direction); + } + return gCamera.field_0; +} + +struct MapConnection *sub_8056A64(u8 direction, int x, int y) +{ + int count; + struct MapConnection *connection; + int i; + count = gMapHeader.connections->count; + connection = gMapHeader.connections->connections; + for (i = 0; i < count; i++, connection++) + { + if (connection->direction == direction) + { + if (sub_8056ABC(direction, x, y, connection) == TRUE) + { + return connection; + } + } + } + return NULL; +} + +bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection) +{ + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (direction) + { + case CONNECTION_SOUTH: + case CONNECTION_NORTH: + return sub_8056B20(x, gMapHeader.mapData->width, mapHeader->mapData->width, connection->offset); + case CONNECTION_WEST: + case CONNECTION_EAST: + return sub_8056B20(y, gMapHeader.mapData->height, mapHeader->mapData->height, connection->offset); + } + return FALSE; +} + +bool8 sub_8056B20(int x, int src_width, int dest_width, int offset) +{ + int offset2; + offset2 = offset; + if (offset2 < 0) + { + offset2 = 0; + } + if (dest_width + offset < src_width) + { + src_width = dest_width + offset; + } + if (offset2 <= x && x <= src_width) + { + return TRUE; + } + return FALSE; +} + +int sub_8056B4C(int x, int width) +{ + if (x >= 0 && x < width) + { + return TRUE; + } + return FALSE; +} + +int sub_8056B60(struct MapConnection *connection, int x, int y) +{ + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (connection->direction) + { + case CONNECTION_SOUTH: + case CONNECTION_NORTH: + return sub_8056B4C(x - connection->offset, mapHeader->mapData->width); + case CONNECTION_WEST: + case CONNECTION_EAST: + return sub_8056B4C(y - connection->offset, mapHeader->mapData->height); + } + return FALSE; +} + +struct MapConnection *sub_8056BA0(s16 x, s16 y) +{ + int count; + struct MapConnection *connection; + int i; + u8 direction; + if (!gMapHeader.connections) + { + return NULL; + } + else + { + count = gMapHeader.connections->count; + connection = gMapHeader.connections->connections; + for (i = 0; i < count; i++, connection++) + { + direction = connection->direction; + if ((direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE) + || (direction == CONNECTION_NORTH && y > 6) + || (direction == CONNECTION_SOUTH && y < gMapHeader.mapData->height + 7) + || (direction == CONNECTION_WEST && x > 6) + || (direction == CONNECTION_EAST && x < gMapHeader.mapData->width + 7)) + { + continue; + } + if (sub_8056B60(connection, x - 7, y - 7) == TRUE) + { + return connection; + } + } + } + return NULL; +} + +void sub_8056C50(u16 x, u16 y) +{ + gSaveBlock1.pos.x = x - 7; + gSaveBlock1.pos.y = y - 7; +} + +void sav1_camera_get_focus_coords(u16 *x, u16 *y) +{ + *x = gSaveBlock1.pos.x + 7; + *y = gSaveBlock1.pos.y + 7; +} + +void unref_sub_8056C7C(u16 x, u16 y) +{ + gSaveBlock1.pos.x = x; + gSaveBlock1.pos.y = y; +} + +void GetCameraCoords(u16 *x, u16 *y) +{ + *x = gSaveBlock1.pos.x; + *y = gSaveBlock1.pos.y; +} + +void sub_8056C98(struct Tileset *tileset, void *src) +{ + if (tileset) + { + if (!tileset->isCompressed) + { + CpuFastSet(tileset->tiles, src, 0x1000); + } + else + { + LZ77UnCompVram(tileset->tiles, src); + } + } +} + +void sub_8056CBC(struct Tileset *tileset, int offset, int size) +{ + u16 black; + if (tileset) + { + if (tileset->isSecondary == FALSE) + { + black = 0; + LoadPalette(&black, offset, 2); + LoadPalette(tileset->palettes + 2, offset + 1, size - 2); + } + else if (tileset->isSecondary == TRUE) + { + LoadPalette(tileset->palettes + 0xc0, offset, size); + } + else + { + LZ77UnCompVram(tileset->palettes, (void*)0x2000000); + LoadPalette((void*)0x2000000, offset, size); + } + } +} + +void sub_8056D28(struct MapData *mapData) +{ + void *src = (void*)(BG_VRAM); + sub_8056C98(mapData->primaryTileset, src); +} + +void sub_8056D38(struct MapData *mapData) +{ + void *src = (void*)(BG_VRAM + 0x4000); + sub_8056C98(mapData->secondaryTileset, src); +} + +void apply_map_tileset1_palette(struct MapData *mapData) +{ + sub_8056CBC(mapData->primaryTileset, 0, 0xc0); +} + +void apply_map_tileset2_palette(struct MapData *mapData) +{ + sub_8056CBC(mapData->secondaryTileset, 0x60, 0xc0); +} + +void copy_map_tileset1_tileset2_to_vram(struct MapData *mapData) +{ + if (mapData) + { + sub_8056D28(mapData); + sub_8056D38(mapData); + } +} + +void apply_map_tileset1_tileset2_palette(struct MapData *mapData) +{ + if (mapData) + { + apply_map_tileset1_palette(mapData); + apply_map_tileset2_palette(mapData); + } +} diff --git a/src/fldeff_berrytree.c b/src/fldeff_berrytree.c new file mode 100644 index 000000000..6b03e9952 --- /dev/null +++ b/src/fldeff_berrytree.c @@ -0,0 +1,56 @@ +#include "global.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "script.h" + +static void Task_WateringBerryTreeAnim_0(u8); +static void Task_WateringBerryTreeAnim_1(u8); +static void Task_WateringBerryTreeAnim_2(u8); +static void Task_WateringBerryTreeAnim_3(u8); + +static void Task_WateringBerryTreeAnim_0(u8 taskId) +{ + gTasks[taskId].func = Task_WateringBerryTreeAnim_1; +} + +static void Task_WateringBerryTreeAnim_1(u8 taskId) +{ + struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) + || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + sub_8059D08(player_get_direction_lower_nybble()); + FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay16AnimId(player_get_direction_lower_nybble())); + gTasks[taskId].func = Task_WateringBerryTreeAnim_2; + } +} + +static void Task_WateringBerryTreeAnim_2(u8 taskId) +{ + struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + s16 value = gTasks[taskId].data[1]++; + + if (value < 10) + { + FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay16AnimId(player_get_direction_lower_nybble())); + } + else + { + gTasks[taskId].func = Task_WateringBerryTreeAnim_3; + } + } +} + +static void Task_WateringBerryTreeAnim_3(u8 taskId) +{ + SetPlayerAvatarTransitionFlags(sub_80597D0()); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void DoWateringBerryTreeAnim(void) +{ + CreateTask(Task_WateringBerryTreeAnim_0, 80); +} diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c new file mode 100644 index 000000000..c8f942fe5 --- /dev/null +++ b/src/fldeff_cut.c @@ -0,0 +1,369 @@ +#include "global.h" +#include "fldeff_cut.h" +#include "field_camera.h" +#include "field_effect.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "map_obj_lock.h" +#include "metatile_behavior.h" +#include "metatile_behaviors.h" +#include "pokemon_menu.h" +#include "overworld.h" +#include "rom6.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "ewram.h" + +extern void (*gFieldCallback)(void); +extern void (*gUnknown_03005CE4)(void); +extern u8 gLastFieldPokeMenuOpened; + +extern const u8 S_UseCut[]; + +const struct OamData gOamData_CutGrass = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 1, + .priority = 1, + .paletteNum = 1, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_CutGrass[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_CutGrass[] = +{ + gSpriteAnim_CutGrass, +}; + +const struct SpriteFrameImage gSpriteImageTable_CutGrass[] = +{ + {gFieldEffectPic_CutGrass, 0x20}, +}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo6 = {gFieldEffectObjectPalette6, 0x1000}; + +static void sub_80A2A48(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_CutGrass = +{ + .tileTag = 0xFFFF, + .paletteTag = 0x1000, + .oam = &gOamData_CutGrass, + .anims = gSpriteAnimTable_CutGrass, + .images = gSpriteImageTable_CutGrass, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A2A48, +}; + +#if DEBUG + +void debug_sub_80AFEE4(void) +{ + s16 x, y; + u8 i, j; + u8 metatile; + + if (npc_before_player_of_type(0x52) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + sub_80A2634(); + return; + } + + PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + for (i = 0; i < 3; i++) + { + y = i - 1 + gUnknown_0203923C.y; + for (j = 0; j < 3; j++) + { + x = j - 1 + gUnknown_0203923C.x; + if (MapGridGetZCoordAt(x, y) == gUnknown_0203923C.height) + { + metatile = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsPokeGrass(metatile) == TRUE + || MetatileBehavior_IsAshGrass(metatile) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + sub_80A25E8(); + return; + } + } + } + } + ScriptContext2_Disable(); +} + +#endif + +bool8 SetUpFieldMove_Cut(void) +{ + s16 x, y; + u8 i, j; + u8 tileBehavior; + + if(npc_before_player_of_type(0x52) == TRUE) // is in front of tree? + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_80A2634; + return TRUE; + } + else // is in ash or grass to cut? + { + PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + for(i = 0; i < 3; i++) + { + y = i - 1 + gUnknown_0203923C.y; + for(j = 0; j < 3; j++) + { + x = j - 1 + gUnknown_0203923C.x; + if(MapGridGetZCoordAt(x, y) == gUnknown_0203923C.height) + { + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if(MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE + || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_80A25E8; + return TRUE; + } + } + } + } + return FALSE; // do not use cut + } +} + +void sub_80A25E8(void) +{ + FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS); + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; +} + +bool8 FldEff_UseCutOnGrass(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_80A2684 >> 16; + gTasks[taskId].data[9] = (u32)sub_80A2684; + IncrementGameStat(GAME_STAT_USED_CUT); + return FALSE; +} + +void sub_80A2634(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(S_UseCut); +} + +bool8 FldEff_UseCutOnTree(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_80A2B00 >> 16; + gTasks[taskId].data[9] = (u32)sub_80A2B00; + IncrementGameStat(GAME_STAT_USED_CUT); + return FALSE; +} + +void sub_80A2684(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS); + FieldEffectStart(FLDEFF_CUT_GRASS); +} + +bool8 FldEff_CutGrass(void) +{ + s16 x, y; + u8 tileBehavior; + u8 i, j; // not in for loop? + + for(i = 0, PlaySE(SE_W015), PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); i < 3; i++) + { + y = i - 1 + gUnknown_0203923C.y; + for(j = 0; j < 3; j++) + { + x = j - 1 + gUnknown_0203923C.x; + if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height) + { + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if(MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE) + { + sub_80A27A8(x, y); + sub_805BCC0(x, y); + } + } + } + } + sub_80A28F4(gUnknown_0203923C.x - 1, gUnknown_0203923C.y - 2); + DrawWholeMapView(); + + // populate sprite ID array + for(i = 0; i < 8; i++) + { + eCutGrassSpriteArray[i] = CreateSprite((struct SpriteTemplate *)&gSpriteTemplate_CutGrass, + gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); + gSprites[eCutGrassSpriteArray[i]].data[2] = 32 * i; + } + return 0; +} + +// set map grid metatile depending on x, y +// TODO: enum for metatile IDs +void sub_80A27A8(s16 x, s16 y) +{ + int metatileId = MapGridGetMetatileIdAt(x, y); + + switch(metatileId) + { + case 0x208: + case 0x15: + case 0xD: + MapGridSetMetatileIdAt(x, y, 0x1); + break; + case 0x1C6: + MapGridSetMetatileIdAt(x, y, 0x1CE); + break; + case 0x1C7: + MapGridSetMetatileIdAt(x, y, 0x1CF); + break; + case 0x281: + MapGridSetMetatileIdAt(x, y, 0x279); + break; + case 0x282: + MapGridSetMetatileIdAt(x, y, 0x27A); + break; + case 0x283: + MapGridSetMetatileIdAt(x, y, 0x27B); + break; + case 0x206: + case 0x207: + MapGridSetMetatileIdAt(x, y, 0x271); + break; + case 0x212: + case 0x20A: + MapGridSetMetatileIdAt(x, y, 0x218); + break; + case 0x25: + MapGridSetMetatileIdAt(x, y, 0xE); + break; + } +} + +s32 sub_80A28A0(s16 x, s16 y) +{ + u16 metatileId = MapGridGetMetatileIdAt(x, y); + + if(metatileId == 1) + return 1; + else if(metatileId == 633) + return 2; + else if(metatileId == 634) + return 3; + else if(metatileId == 635) + return 4; + else + return 0; +} + +void sub_80A28F4(s16 x, s16 y) +{ + s16 i; + u16 lowerY = y + 3; + + for(i = 0; i < 3; i++) + { + u16 currentX = x + i; + s16 currentXsigned = x + i; + if(MapGridGetMetatileIdAt(currentXsigned, y) == 21) + { + switch((u8)sub_80A28A0(currentXsigned, y + 1)) + { + case 1: + MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x208); + break; + case 2: + MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x281); + break; + case 3: + MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x282); + break; + case 4: + MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x283); + break; + } + } + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY) == 1) + { + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x208) + MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x1); + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x281) + MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x279); + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x282) + MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27A); + if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x283) + MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27B); + } + } +} + +static void sub_80A2A48(struct Sprite *sprite) +{ + sprite->data[0] = 8; + sprite->data[1] = 0; + sprite->data[3] = 0; + sprite->callback = (void *)objc_8097BBC; +} + +void objc_8097BBC(struct Sprite *sprite) +{ + u16 tempdata; + u16 tempdata2; + + sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]); + sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]); + + sprite->data[2] = (sprite->data[2] + 8) & 0xFF; + sprite->data[0] += ((tempdata2 = sprite->data[3]) << 16 >> 18) + 1; // what? + sprite->data[3] = tempdata2 + 1; + + tempdata = sprite->data[1]; + if((s16)tempdata != 28) // done rotating the grass, execute clean up function + sprite->data[1]++; + else + sprite->callback = (void *)sub_80A2AB8; +} + +void sub_80A2AB8(void) +{ + u8 i; + + for (i = 1; i < 8; i++) + DestroySprite(&gSprites[eCutGrassSpriteArray[i]]); + FieldEffectStop(&gSprites[eCutGrassSpriteArray[0]], FLDEFF_CUT_GRASS); + sub_8064E2C(); + ScriptContext2_Disable(); +} + +void sub_80A2B00(void) +{ + PlaySE(SE_W015); + FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE); + EnableBothScriptContexts(); +} diff --git a/src/fldeff_decoration.c b/src/fldeff_decoration.c new file mode 100644 index 000000000..1859fc00b --- /dev/null +++ b/src/fldeff_decoration.c @@ -0,0 +1,364 @@ +#include "global.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" + +extern const u8 gSpriteImage_83D21EC[]; +extern const u8 gSpriteImage_83D22EC[]; +extern const u8 gSpriteImage_83D23EC[]; +extern const u16 gTilesetPalettes_SecretBase[][16]; + +const struct OamData gOamData_83D266C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 2, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83D2674[] = +{ + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D2684[] = +{ + gSpriteAnim_83D2674, +}; + +const struct SpriteFrameImage gSpriteImageTable_83D2688[] = +{ + {gSpriteImage_83D21EC, 0x100}, + {gSpriteImage_83D22EC, 0x100}, + {gSpriteImage_83D23EC, 0x100}, +}; + +void SpriteCB_SandPillar_0(struct Sprite *); +void SpriteCB_SandPillar_1(struct Sprite *); +void SpriteCB_SandPillar_2(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_83D26A0 = +{ + .tileTag = 0xFFFF, + .paletteTag = 4110, + .oam = &gOamData_83D266C, + .anims = gSpriteAnimTable_83D2684, + .images = gSpriteImageTable_83D2688, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_SandPillar_0, +}; + +// This uses one of the secret base palettes, so there is no "09.pal" file. +const struct SpritePalette gFieldEffectObjectPaletteInfo9 = {gTilesetPalettes_SecretBase[5], 0x100E}; + +extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; + +static void sub_80C68EC(u8); +static void DoBalloonSoundEffect(s16); + +void sub_80C68A4(s16 metatileId, s16 x, s16 y) +{ + u8 taskId = CreateTask(sub_80C68EC, 0); + + gTasks[taskId].data[0] = metatileId; + gTasks[taskId].data[1] = x; + gTasks[taskId].data[2] = y; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 1; +} + +static void sub_80C68EC(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[3] == 6) + data[3] = 0; + else + data[3]++; + + if (data[3] == 0) + { + if (data[4] == 2) + DoBalloonSoundEffect(data[0]); + MapGridSetMetatileIdAt(data[1], data[2], data[0] + data[4]); + CurrentMapDrawMetatileAt(data[1], data[2]); + if (data[4] == 3) + DestroyTask(taskId); + else + data[4]++; + } +} + +static void DoBalloonSoundEffect(s16 metatileId) +{ + switch (metatileId) + { + case 824: + PlaySE(SE_FUUSEN1); + break; + case 828: + PlaySE(SE_FUUSEN2); + break; + case 832: + PlaySE(SE_FUUSEN3); + break; + case 552: + PlaySE(SE_TOY_DANGO); + break; + } +} + +bool8 FldEff_Nop47(void) +{ + return FALSE; +} + +bool8 FldEff_Nop48(void) +{ + return FALSE; +} + +static void sub_80C69C4(s16 x, s16 y) +{ + PlaySE(SE_TOY_KABE); + MapGridSetMetatileIdAt(x, y, 630); + MapGridSetMetatileIdAt(x, y - 1, 622); + CurrentMapDrawMetatileAt(x, y); + CurrentMapDrawMetatileAt(x, y - 1); +} + +static void sub_80C6A14(u8 taskId) +{ + if (gTasks[taskId].data[0] == 7) + { + sub_80C69C4(gTasks[taskId].data[1], gTasks[taskId].data[2]); + DestroyTask(taskId); + } + else + { + gTasks[taskId].data[0]++; + } +} + +void sub_80C6A54(s16 x, s16 y) +{ + u8 dir = player_get_direction_lower_nybble(); + if (dir == DIR_SOUTH) + { + sub_80C69C4(x, y); + } + else if (dir == DIR_NORTH) + { + u8 taskId = CreateTask(sub_80C6A14, 5); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = x; + gTasks[taskId].data[2] = y; + } +} + +static void Task_DecorationSoundEffect(u8 taskId) +{ + if (gTasks[taskId].data[1] == 7) + { + switch (gTasks[taskId].data[0]) + { + case 632: + PlaySE(SE_TOY_C); + break; + case 633: + PlaySE(SE_TOY_D); + break; + case 634: + PlaySE(SE_TOY_E); + break; + case 635: + PlaySE(SE_TOY_F); + break; + case 636: + PlaySE(SE_TOY_G); + break; + case 637: + PlaySE(SE_TOY_A); + break; + case 638: + PlaySE(SE_TOY_B); + break; + case 691: + PlaySE(SE_TOY_C1); + break; + } + + DestroyTask(taskId); + } + else + { + gTasks[taskId].data[1]++; + } +} + +void DoDecorationSoundEffect(s16 arg) +{ + u8 taskId = CreateTask(Task_DecorationSoundEffect, 5); + gTasks[taskId].data[0] = arg; + gTasks[taskId].data[1] = 0; +} + +void SpriteCB_YellowCave4Sparkle(struct Sprite *sprite) +{ + sprite->data[0]++; + if (sprite->data[0] == 8) + PlaySE(SE_W215); + if (sprite->data[0] >= 32) + DestroySprite(sprite); +} + +void DoYellowCave4Sparkle(void) +{ + s16 x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x; + s16 y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y; + u8 spriteId; + + sub_8060470(&x, &y, 8, 4); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], x, y, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].coordOffsetEnabled = TRUE; + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].oam.paletteNum = 5; + gSprites[spriteId].callback = SpriteCB_YellowCave4Sparkle; + gSprites[spriteId].data[0] = 0; + } +} + +bool8 FldEff_SandPillar(void) +{ + s16 x, y; + + ScriptContext2_Enable(); + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + gFieldEffectArguments[5] = x; + gFieldEffectArguments[6] = y; + + switch (player_get_direction_lower_nybble()) + { + case DIR_SOUTH: + CreateSprite( + &gSpriteTemplate_83D26A0, + gSprites[gPlayerAvatar.spriteId].oam.x + 8, + gSprites[gPlayerAvatar.spriteId].oam.y + 32, + 0); + break; + case DIR_NORTH: + CreateSprite( + &gSpriteTemplate_83D26A0, + gSprites[gPlayerAvatar.spriteId].oam.x + 8, + gSprites[gPlayerAvatar.spriteId].oam.y, + 148); + break; + case DIR_WEST: + CreateSprite( + &gSpriteTemplate_83D26A0, + gSprites[gPlayerAvatar.spriteId].oam.x - 8, + gSprites[gPlayerAvatar.spriteId].oam.y + 16, + 148); + break; + case DIR_EAST: + CreateSprite( + &gSpriteTemplate_83D26A0, + gSprites[gPlayerAvatar.spriteId].oam.x + 24, + gSprites[gPlayerAvatar.spriteId].oam.y + 16, + 148); + break; + } + + return FALSE; +} + +void SpriteCB_SandPillar_0(struct Sprite *sprite) +{ + PlaySE(SE_W088); + if (MapGridGetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1) == 646) + MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 3586); + else + MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 644); + MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 522); + CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1); + CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]); + sprite->data[0] = 0; + sprite->callback = SpriteCB_SandPillar_1; +} + +void SpriteCB_SandPillar_1(struct Sprite *sprite) +{ + if (sprite->data[0] < 18) + { + sprite->data[0]++; + } + else + { + MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 3724); + CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]); + sprite->data[0] = 0; + sprite->callback = SpriteCB_SandPillar_2; + } +} + +void SpriteCB_SandPillar_2(struct Sprite *sprite) +{ + FieldEffectStop(sprite, FLDEFF_SAND_PILLAR); + EnableBothScriptContexts(); +} + +void GetShieldToyTVDecorationInfo(void) +{ + s16 x, y; + s32 metatileId; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + + metatileId = MapGridGetMetatileIdAt(x, y); + + switch (metatileId) + { + case 822: + ConvertIntToDecimalStringN(gStringVar1, 100, STR_CONV_MODE_LEFT_ALIGN, 3); + StringCopy(gStringVar2, gSecretBaseText_GoldRank); + gSpecialVar_Result = 0; + break; + case 734: + ConvertIntToDecimalStringN(gStringVar1, 50, STR_CONV_MODE_LEFT_ALIGN, 2); + StringCopy(gStringVar2, gSecretBaseText_SilverRank); + gSpecialVar_Result = 0; + break; + case 756: + gSpecialVar_Result = 1; + break; + case 757: + gSpecialVar_Result = 2; + break; + case 758: + gSpecialVar_Result = 3; + break; + } +} diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c new file mode 100644 index 000000000..981233480 --- /dev/null +++ b/src/fldeff_escalator.c @@ -0,0 +1,132 @@ +#include "global.h" +#include "task.h" +#include "fieldmap.h" +#include "field_camera.h" +#include "field_player_avatar.h" + +extern u8 gUnknown_02038731; + +void sub_80B45B4(u8 taskId, const s16 *list, u16 c) +{ + s16 r5 = gTasks[taskId].data[4] - 1; + s16 r3 = gTasks[taskId].data[5] - 1; + s16 r4 = gTasks[taskId].data[1]; + s16 y; + s16 x; + + if (gTasks[taskId].data[2] == 0) + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]); + } + } + } + } + else + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[2 - r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]); + } + } + } + } +} + +const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; +const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; +const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; +const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; +const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; +const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; +const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; + +void sub_80B4710(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + data[3] = 1; + + switch (data[0]) + { + case 0: + sub_80B45B4(taskId, gUnknown_083CC714, 0); + break; + case 1: + sub_80B45B4(taskId, gUnknown_083CC71A, 0); + break; + case 2: + sub_80B45B4(taskId, gUnknown_083CC720, 0xC00); + break; + case 3: + sub_80B45B4(taskId, gUnknown_083CC726, 0); + break; + case 4: + sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00); + break; + case 5: + sub_80B45B4(taskId, gUnknown_083CC732, 0); + break; + case 6: + sub_80B45B4(taskId, gUnknown_083CC738, 0); + break; + } + + data[0] = (data[0] + 1) & 7; + if (!data[0]) + { + DrawWholeMapView(); + data[1] = (data[1] + 1) % 3; + data[3] = 0; + } +} + +u8 sub_80B47D8(u16 var) +{ + u8 taskId = CreateTask(sub_80B4710, 0); + s16 *data = gTasks[taskId].data; + + PlayerGetDestCoords(&data[4], &data[5]); + data[0] = 0; + data[1] = 0; + data[2] = var; + sub_80B4710(taskId); + return taskId; +} + +void sub_80B4824(u8 var) +{ + gUnknown_02038731 = sub_80B47D8(var); +} + +void sub_80B483C(void) +{ + DestroyTask(gUnknown_02038731); +} + +bool8 sub_80B4850(void) +{ + if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) + return FALSE; + else + return TRUE; +} diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c new file mode 100644 index 000000000..30ddd0f6c --- /dev/null +++ b/src/fldeff_flash.c @@ -0,0 +1,342 @@ +#include "global.h" +#include "event_data.h" +#include "field_effect.h" +#include "main.h" +#include "palette.h" +#include "pokemon_menu.h" +#include "overworld.h" +#include "rom6.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" + +struct FlashStruct +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + void (*func)(void); +}; + +extern u8 gLastFieldPokeMenuOpened; +extern void (*gUnknown_03005CE4)(void); + +extern u8 gUnknown_081B694A[]; + +void sub_810CBFC(void); +void sub_810CC34(void); +bool8 sub_810CD5C(void); +void sub_810CE5C(u8); +void sub_810CE78(u8); +void sub_810CF18(u8); +void sub_810CF5C(u8); +void sub_810CFC4(u8); +void sub_810D00C(u8); +void sub_810D028(u8); +void sub_810D0C4(u8); +void sub_810D128(u8); +void sub_810CFF8(void); +void sub_810CE48(void); + +static const struct FlashStruct gUnknown_083F7FC4[] = +{ + {1, 4, 1, 0, sub_810CFF8}, + {2, 4, 1, 0, sub_810CFF8}, + {3, 4, 1, 0, sub_810CFF8}, + {5, 4, 1, 0, sub_810CFF8}, + {6, 4, 1, 0, sub_810CFF8}, + {7, 4, 1, 0, sub_810CFF8}, + {8, 4, 1, 0, sub_810CFF8}, + {9, 4, 1, 0, sub_810CFF8}, + {4, 1, 0, 1, sub_810CE48}, + {4, 2, 0, 1, sub_810CE48}, + {4, 3, 0, 1, sub_810CE48}, + {4, 5, 0, 1, sub_810CE48}, + {4, 6, 0, 1, sub_810CE48}, + {4, 7, 0, 1, sub_810CE48}, + {4, 8, 0, 1, sub_810CE48}, + {4, 9, 0, 1, sub_810CE48}, + {0, 0, 0, 0, NULL}, +}; + +// TODO: Make these extracted palettes? +static const u16 gCaveTransitionPalette_White[] = {0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF}; +static const u16 gCaveTransitionPalette_Black[] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}; + +static const u16 gUnknown_083F808C[] = INCBIN_U16("graphics/misc/83F808C.gbapal"); +static const u16 gUnknown_083F809C[] = INCBIN_U16("graphics/misc/83F809C.gbapal"); +static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz"); +static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz"); + +#if DEBUG + +void debug_sub_8122080(void) +{ + if (gMapHeader.cave == 1 && !FlagGet(FLAG_SYS_USE_FLASH)) + sub_810CBFC(); + else + ScriptContext2_Disable(); +} + +#endif + +bool8 SetUpFieldMove_Flash(void) +{ + if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH)) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_810CBFC; + return TRUE; + } + + return FALSE; +} + +void sub_810CBFC(void) +{ + u8 taskId = oei_task_add(); + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + gTasks[taskId].data[8] = (uintptr_t)sub_810CC34 >> 16; + gTasks[taskId].data[9] = (uintptr_t)sub_810CC34; +} + +void sub_810CC34(void) +{ + PlaySE(SE_W115); + FlagSet(FLAG_SYS_USE_FLASH); + ScriptContext1_SetupScript(gUnknown_081B694A); +} + +void sub_810CC54(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_810CC80(void) +{ + u16 ime; + + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + ResetPaletteFade(); + ResetTasks(); + ResetSpriteData(); + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + SetVBlankCallback(VBlankCB); + SetMainCallback2(sub_810CC54); + if (!sub_810CD5C()) + SetMainCallback2(gMain.savedCallback); +} + +bool8 sub_810CD5C(void) +{ + u8 i; + u8 v0 = get_map_type_from_warp0(); + u8 v1 = Overworld_GetMapTypeOfSaveblockLocation(); + + for (i = 0; gUnknown_083F7FC4[i].unk0; i++) + { + if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) + { + gUnknown_083F7FC4[i].func(); + return TRUE; + } + } + + return FALSE; +} + +u8 sub_810CDB8(u8 a1, u8 a2) +{ + u8 i; + u8 v0 = a1; + u8 v1 = a2; + + for (i = 0; gUnknown_083F7FC4[i].unk0; i++) + { + if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) + { + return gUnknown_083F7FC4[i].unk2; + } + } + + return FALSE; +} + +u8 fade_type_for_given_maplight_pair(u8 a1, u8 a2) +{ + u8 i; + u8 v0 = a1; + u8 v1 = a2; + + for (i = 0; gUnknown_083F7FC4[i].unk0; i++) + { + if (gUnknown_083F7FC4[i].unk0 == v0 && gUnknown_083F7FC4[i].unk1 == v1) + { + return gUnknown_083F7FC4[i].unk3; + } + } + + return FALSE; +} + +void sub_810CE48(void) +{ + CreateTask(sub_810CE5C, 0); +} + +void sub_810CE5C(u8 taskId) +{ + gTasks[taskId].func = sub_810CE78; +} + +void sub_810CE78(u8 taskId) +{ + REG_DISPCNT = 0; + LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000); + LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800); + LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); + LoadPalette(gUnknown_083F809C, 0xE0, 0x10); + REG_BLDCNT = 15937; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG0CNT = 7948; + REG_DISPCNT = 4416; + gTasks[taskId].func = sub_810CF18; + gTasks[taskId].data[0] = 16; + gTasks[taskId].data[1] = 0; +} + +void sub_810CF18(u8 taskId) +{ + u16 count = gTasks[taskId].data[1]; + u16 blend = count + 0x1000; + REG_BLDALPHA = blend; + if (count <= 0x10) + { + gTasks[taskId].data[1]++; + } + else + { + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_810CF5C; + } +} + +void sub_810CF5C(u8 taskId) +{ + u16 count; + + REG_BLDALPHA = 4112; + + count = gTasks[taskId].data[2]; + + if (count < 8) + { + gTasks[taskId].data[2]++; + LoadPalette(&gUnknown_083F809C[count], 0xE0, 16 - 2 * count); + } + else + { + LoadPalette(gCaveTransitionPalette_White, 0, 0x20); + gTasks[taskId].func = sub_810CFC4; + gTasks[taskId].data[2] = 8; + } +} + +void sub_810CFC4(u8 taskId) +{ + if (gTasks[taskId].data[2]) + gTasks[taskId].data[2]--; + else + SetMainCallback2(gMain.savedCallback); +} + +void sub_810CFF8(void) +{ + CreateTask(sub_810D00C, 0); +} + +void sub_810D00C(u8 taskId) +{ + gTasks[taskId].func = sub_810D028; +} + +void sub_810D028(u8 taskId) +{ + REG_DISPCNT = 0; + LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000); + LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG0CNT = 7948; + REG_DISPCNT = 4416; + LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); + LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); + gTasks[taskId].func = sub_810D0C4; + gTasks[taskId].data[0] = 16; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; +} + +void sub_810D0C4(u8 taskId) +{ + u16 count = gTasks[taskId].data[2]; + if (count < 16) + { + gTasks[taskId].data[2]++; + gTasks[taskId].data[2]++; + LoadPalette(&gUnknown_083F808C[15 - count], 0xE0, 2 * (count + 1)); + } + else + { + REG_BLDALPHA = 4112; + REG_BLDCNT = 15937; + gTasks[taskId].func = sub_810D128; + } +} + +void sub_810D128(u8 taskId) +{ + u16 count = 16 - gTasks[taskId].data[1]; + u16 blend = count + 0x1000; + REG_BLDALPHA = blend; + if (count) + { + gTasks[taskId].data[1]++; + } + else + { + LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); + SetMainCallback2(gMain.savedCallback); + } +} diff --git a/src/fldeff_poison.c b/src/fldeff_poison.c new file mode 100644 index 000000000..52afc2516 --- /dev/null +++ b/src/fldeff_poison.c @@ -0,0 +1,44 @@ +#include "global.h" +#include "fldeff_poison.h" +#include "task.h" +#include "constants/songs.h" +#include "sound.h" + +static void Task_FieldPoisonEffect(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[1] += 2; + if (data[1] > 8) + { + data[0]++; + } + break; + case 1: + data[1] -= 2; + if (data[1] == 0) + { + data[0]++; + } + break; + case 2: + DestroyTask(taskId); + return; + } + + REG_MOSAIC = (data[1] << 4) | data[1]; +} + +void FldeffPoison_Start(void) +{ + PlaySE(SE_DOKU); + CreateTask(Task_FieldPoisonEffect, 80); +} + +bool32 FldeffPoison_IsActive(void) +{ + return FuncIsActiveTask(Task_FieldPoisonEffect); +} diff --git a/src/fldeff_recordmixing.c b/src/fldeff_recordmixing.c new file mode 100644 index 000000000..716447f9c --- /dev/null +++ b/src/fldeff_recordmixing.c @@ -0,0 +1,83 @@ +#include "global.h" +#include "event_object_movement.h" +#include "fldeff_recordmixing.h" +#include "sprite.h" + +extern const struct OamData gFieldOamData_32x8; + +static const u8 sSpriteImage_83D26C0[] = INCBIN_U8("graphics/unknown_sprites/83D2860/0.4bpp"); +static const u8 sSpriteImage_83D2740[] = INCBIN_U8("graphics/unknown_sprites/83D2860/1.4bpp"); +static const u8 sSpriteImage_83D27C0[] = INCBIN_U8("graphics/unknown_sprites/83D2860/2.4bpp"); +static const u16 sPalette_3D2840[] = INCBIN_U16("graphics/unknown/unknown_3D2840.gbapal"); + + +static const struct SpriteFrameImage sSpriteImageTable_83FD950[] = +{ + { sSpriteImage_83D26C0, sizeof(sSpriteImage_83D26C0) }, + { sSpriteImage_83D2740, sizeof(sSpriteImage_83D2740) }, + { sSpriteImage_83D27C0, sizeof(sSpriteImage_83D27C0) }, +}; + +static const struct SpritePalette sUnknown_083D2878 = { sPalette_3D2840, 0x1000 }; + +static const union AnimCmd sSpriteAnim_83D2880[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_FRAME(2, 30), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sSpriteAnimTable_83D2890[] = +{ + sSpriteAnim_83D2880, +}; + +static const struct SpriteTemplate sSpriteTemplate_83D2894 = +{ + .tileTag = 0xFFFF, + .paletteTag = 0x1000, + .oam = &gFieldOamData_32x8, + .anims = sSpriteAnimTable_83D2890, + .images = sSpriteImageTable_83FD950, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +u8 CreateRecordMixingSprite(void) +{ + u8 spriteId; + + LoadSpritePalette(&sUnknown_083D2878); + + spriteId = CreateSprite(&sSpriteTemplate_83D2894, 0, 0, 82); + + if (spriteId == MAX_SPRITES) + { + return MAX_SPRITES; + } + else + { + struct Sprite *sprite = &gSprites[spriteId]; + sub_8060388(16, 13, &sprite->pos1.x, &sprite->pos1.y); + sprite->coordOffsetEnabled = TRUE; + sprite->pos1.x += 16; + sprite->pos1.y += 2; + } + + return spriteId; +} + +void DestroyRecordMixingSprite(void) +{ + int i; + + for (i = 0; i < MAX_SPRITES; i++) + { + if (gSprites[i].template == &sSpriteTemplate_83D2894) + { + FreeSpritePalette(&gSprites[i]); + DestroySprite(&gSprites[i]); + } + } +} diff --git a/src/fldeff_secret_base_pc.c b/src/fldeff_secret_base_pc.c new file mode 100644 index 000000000..394c4bc56 --- /dev/null +++ b/src/fldeff_secret_base_pc.c @@ -0,0 +1,69 @@ +#include "global.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "task.h" + +static void Task_SecretBasePCTurnOn(u8); + +u32 FldEff_SecretBasePCTurnOn(void) +{ + s16 x, y; + u8 taskId; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + taskId = CreateTask(Task_SecretBasePCTurnOn, 0); + gTasks[taskId].data[0] = x; + gTasks[taskId].data[1] = y; + gTasks[taskId].data[2] = 0; + + return 0; +} + +static void Task_SecretBasePCTurnOn(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[2]) + { + case 4: + case 12: + MapGridSetMetatileIdAt(data[0], data[1], 548); + CurrentMapDrawMetatileAt(data[0], data[1]); + break; + case 8: + case 16: + MapGridSetMetatileIdAt(data[0], data[1], 544); + CurrentMapDrawMetatileAt(data[0], data[1]); + break; + case 20: + MapGridSetMetatileIdAt(data[0], data[1], 548); + CurrentMapDrawMetatileAt(data[0], data[1]); + FieldEffectActiveListRemove(FLDEFF_SECRET_BASE_PC_TURN_ON); + EnableBothScriptContexts(); + DestroyTask(taskId); + return; + } + + data[2]++; +} + +void DoSecretBasePCTurnOffEffect(void) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + PlaySE(SE_PC_OFF); + + if (!VarGet(VAR_CURRENT_SECRET_BASE)) + MapGridSetMetatileIdAt(x, y, 3616); + else + MapGridSetMetatileIdAt(x, y, 3617); + + CurrentMapDrawMetatileAt(x, y); +} diff --git a/src/fldeff_secretpower.c b/src/fldeff_secretpower.c new file mode 100644 index 000000000..d1df03d84 --- /dev/null +++ b/src/fldeff_secretpower.c @@ -0,0 +1,526 @@ +#include "global.h" +#include "event_data.h" +#include "fieldmap.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "metatile_behavior.h" +#include "metatile_behaviors.h" +#include "overworld.h" +#include "pokemon_menu.h" +#include "rom6.h" +#include "script.h" +#include "secret_base.h" +#include "constants/songs.h" +#include "sound.h" + +extern u8 gUnknown_081A2CE6[]; +extern u8 gUnknown_081A2D3E[]; +extern u8 gUnknown_081A2D96[]; + +const u8 gSpriteImage_83D198C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/0.4bpp"); +const u8 gSpriteImage_83D1A0C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/1.4bpp"); +const u8 gSpriteImage_83D1A8C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/2.4bpp"); +const u8 gSpriteImage_83D1B0C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/3.4bpp"); +const u8 gSpriteImage_83D1B8C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/4.4bpp"); +const u8 gUnusedEmptySpace_83D1C0C[32] = {0}; +const u16 gFieldEffectObjectPalette7[] = INCBIN_U16("graphics/field_effect_objects/palettes/07.gbapal"); +const u8 gSpriteImage_83D1C4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/0.4bpp"); +const u8 gSpriteImage_83D1CCC[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/1.4bpp"); +const u8 gSpriteImage_83D1D4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/2.4bpp"); +const u8 gSpriteImage_83D1DCC[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/3.4bpp"); +const u8 gSpriteImage_83D1E4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/4.4bpp"); +const u8 gSpriteImage_83D1ECC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/0.4bpp"); +const u8 gSpriteImage_83D1F4C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/1.4bpp"); +const u8 gSpriteImage_83D1FCC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/2.4bpp"); +const u8 gSpriteImage_83D204C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/3.4bpp"); +const u8 gSpriteImage_83D20CC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/4.4bpp"); +const u8 gSpriteImage_83D214C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/5.4bpp"); // unused +const u16 gFieldEffectObjectPalette8[] = INCBIN_U16("graphics/field_effect_objects/palettes/08.gbapal"); +const u8 gSpriteImage_83D21EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/0.4bpp"); +const u8 gSpriteImage_83D22EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/1.4bpp"); +const u8 gSpriteImage_83D23EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/2.4bpp"); + +const struct OamData gOamData_83D24EC = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83D24F4[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D250C[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D2524[] = +{ + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D253C[] = +{ + ANIMCMD_FRAME(0, 8, .hFlip = TRUE), + ANIMCMD_FRAME(1, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(3, 8, .hFlip = TRUE), + ANIMCMD_FRAME(4, 8, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D2554[] = +{ + ANIMCMD_FRAME(4, 8, .hFlip = TRUE), + ANIMCMD_FRAME(3, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(1, 8, .hFlip = TRUE), + ANIMCMD_FRAME(0, 8, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D256C[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D2584[] = +{ + gSpriteAnim_83D24F4, +}; + +const union AnimCmd *const gSpriteAnimTable_83D2588[] = +{ + gSpriteAnim_83D250C, + gSpriteAnim_83D2524, + gSpriteAnim_83D253C, + gSpriteAnim_83D2554, +}; + +const union AnimCmd *const gSpriteAnimTable_83D2598[] = +{ + gSpriteAnim_83D256C, +}; + +const struct SpriteFrameImage gSpriteImageTable_83D259C[] = +{ + {gSpriteImage_83D198C, 0x80}, + {gSpriteImage_83D1A0C, 0x80}, + {gSpriteImage_83D1A8C, 0x80}, + {gSpriteImage_83D1B0C, 0x80}, + {gSpriteImage_83D1B8C, 0x80}, +}; + +const struct SpriteFrameImage gSpriteImageTable_83D25C4[] = +{ + {gSpriteImage_83D1ECC, 0x80}, + {gSpriteImage_83D1F4C, 0x80}, + {gSpriteImage_83D1FCC, 0x80}, + {gSpriteImage_83D204C, 0x80}, + {gSpriteImage_83D20CC, 0x80}, +}; + +const struct SpriteFrameImage gSpriteImageTable_83D25EC[] = +{ + {gSpriteImage_83D1C4C, 0x80}, + {gSpriteImage_83D1CCC, 0x80}, + {gSpriteImage_83D1D4C, 0x80}, + {gSpriteImage_83D1DCC, 0x80}, + {gSpriteImage_83D1E4C, 0x80}, +}; + +void sub_80C644C(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_83D2614 = +{ + .tileTag = 0xFFFF, + .paletteTag = 4099, + .oam = &gOamData_83D24EC, + .anims = gSpriteAnimTable_83D2584, + .images = gSpriteImageTable_83D259C, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80C644C, +}; + +void sub_80C6598(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_83D262C = +{ + .tileTag = 0xFFFF, + .paletteTag = 4104, + .oam = &gOamData_83D24EC, + .anims = gSpriteAnimTable_83D2588, + .images = gSpriteImageTable_83D25C4, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80C6598, +}; + +void sub_80C66BC(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_83D2644 = +{ + .tileTag = 0xFFFF, + .paletteTag = 4104, + .oam = &gOamData_83D24EC, + .anims = gSpriteAnimTable_83D2598, + .images = gSpriteImageTable_83D25EC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80C66BC, +}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo7 = {gFieldEffectObjectPalette7, 0x1003}; +const struct SpritePalette gFieldEffectObjectPaletteInfo8 = {gFieldEffectObjectPalette8, 0x1008}; + +void sub_80C639C(void); +void sub_80C63E8(void); +void sub_80C6468(struct Sprite *); +void sub_80C6498(struct Sprite *); +void sub_80C64A8(void); +void sub_80C64F4(void); +void sub_80C65C4(struct Sprite *); +void sub_80C65FC(struct Sprite *); +void sub_80C660C(void); +void sub_80C6658(void); +void sub_80C66D8(struct Sprite *sprite); +void sub_80C6708(struct Sprite *sprite); + +void sub_80C6264(void) +{ + sub_80BBFD8(&gUnknown_0203923C, gMapHeader.events); + sub_80BB5E4(); +} + +void sub_80C6280(void) +{ + switch (gFieldEffectArguments[1]) + { + case 1: + gFieldEffectArguments[5] = 8; + gFieldEffectArguments[6] = 40; + break; + case 2: + gFieldEffectArguments[5] = 8; + gFieldEffectArguments[6] = 8; + break; + case 3: + gFieldEffectArguments[5] = -8; + gFieldEffectArguments[6] = 24; + break; + case 4: + gFieldEffectArguments[5] = 24; + gFieldEffectArguments[6] = 24; + break; + } +} + +#if DEBUG + +void debug_sub_80D93F4(void) +{ + u8 metatile; + + sub_80BB63C(); + + if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != 2) + { + ScriptContext2_Disable(); + return; + } + + GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + metatile = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y); + if (MetatileBehavior_IsSecretBaseCave(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C639C(); + } + else if (MetatileBehavior_IsSecretBaseTree(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C64A8(); + } + else if (MetatileBehavior_IsSecretBaseShrub(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C660C(); + } + else + { + ScriptContext2_Disable(); + } +} + +#endif + +bool8 SetUpFieldMove_SecretPower(void) +{ + u8 behavior; + + sub_80BB63C(); + + if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != DIR_NORTH) + return FALSE; + + GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y); + + if (MetatileBehavior_IsSecretBaseCave(behavior) == TRUE) + { + sub_80C6264(); + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_80C639C; + return TRUE; + } + + if (MetatileBehavior_IsSecretBaseTree(behavior) == TRUE) + { + sub_80C6264(); + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_80C64A8; + return TRUE; + } + + if (MetatileBehavior_IsSecretBaseShrub(behavior) == TRUE) + { + sub_80C6264(); + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_80C660C; + return TRUE; + } + + return FALSE; +} + +void sub_80C639C(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(gUnknown_081A2CE6); +} + +bool8 FldEff_UseSecretPowerCave(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (uintptr_t)sub_80C63E8 >> 16; + gTasks[taskId].data[9] = (uintptr_t)sub_80C63E8; + + return FALSE; +} + +void sub_80C63E8(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_CAVE); + FieldEffectStart(FLDEFF_SECRET_POWER_CAVE); +} + +bool8 FldEff_SecretPowerCave(void) +{ + sub_80C6280(); + CreateSprite( + &gSpriteTemplate_83D2614, + gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5], + gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6], + 148); + return FALSE; +} + +void sub_80C644C(struct Sprite *sprite) +{ + PlaySE(SE_W088); + sprite->data[0] = 0; + sprite->callback = sub_80C6468; +} + +void sub_80C6468(struct Sprite *sprite) +{ + if (sprite->data[0] < 40) + { + sprite->data[0]++; + if (sprite->data[0] == 20 ) + sub_80BB800(); + } + else + { + sprite->data[0] = 0; + sprite->callback = sub_80C6498; + } +} + +void sub_80C6498(struct Sprite *sprite) +{ + FieldEffectStop(sprite, FLDEFF_SECRET_POWER_CAVE); + EnableBothScriptContexts(); +} + +void sub_80C64A8(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(gUnknown_081A2D3E); +} + +bool8 FldEff_UseSecretPowerTree(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (uintptr_t)sub_80C64F4 >> 16; + gTasks[taskId].data[9] = (uintptr_t)sub_80C64F4; + + return FALSE; +} + +void sub_80C64F4(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_TREE); + FieldEffectStart(FLDEFF_SECRET_POWER_TREE); +} + +bool8 FldEff_SecretPowerTree(void) +{ + s16 behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y) & 0xFFF; + + if (behavior == MB_SECRET_BASE_SPOT_TREE_1) + { + gFieldEffectArguments[7] = 0; + } + + if (behavior == MB_SECRET_BASE_SPOT_TREE_2) + { + gFieldEffectArguments[7] = 2; + } + + sub_80C6280(); + + CreateSprite( + &gSpriteTemplate_83D262C, + gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5], + gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6], + 148); + + if (gFieldEffectArguments[7] == 1 || gFieldEffectArguments[7] == 3) + sub_80BB800(); + + return FALSE; +} + +void sub_80C6598(struct Sprite *sprite) +{ + PlaySE(SE_W010); + sprite->animNum = gFieldEffectArguments[7]; + sprite->data[0] = 0; + sprite->callback = sub_80C65C4; +} + +void sub_80C65C4(struct Sprite *sprite) +{ + sprite->data[0]++; + + if (sprite->data[0] >= 40) + { + if (gFieldEffectArguments[7] == 0 || gFieldEffectArguments[7] == 2) + sub_80BB800(); + sprite->data[0] = 0; + sprite->callback = sub_80C65FC; + } +} + + +void sub_80C65FC(struct Sprite *sprite) +{ + FieldEffectStop(sprite, FLDEFF_SECRET_POWER_TREE); + EnableBothScriptContexts(); +} + +void sub_80C660C(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(gUnknown_081A2D96); +} + +bool8 FldEff_UseSecretPowerShrub(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (uintptr_t)sub_80C6658 >> 16; + gTasks[taskId].data[9] = (uintptr_t)sub_80C6658; + + return FALSE; +} + +void sub_80C6658(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_SHRUB); + FieldEffectStart(FLDEFF_SECRET_POWER_SHRUB); +} + +bool8 FldEff_SecretPowerShrub(void) +{ + sub_80C6280(); + CreateSprite( + &gSpriteTemplate_83D2644, + gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5], + gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6], + 148); + return FALSE; +} + +void sub_80C66BC(struct Sprite *sprite) +{ + PlaySE(SE_W077); + sprite->data[0] = 0; + sprite->callback = sub_80C66D8; +} + +void sub_80C66D8(struct Sprite *sprite) +{ + if (sprite->data[0] < 40) + { + sprite->data[0]++; + if (sprite->data[0] == 20 ) + sub_80BB800(); + } + else + { + sprite->data[0] = 0; + sprite->callback = sub_80C6708; + } +} + + +void sub_80C6708(struct Sprite *sprite) +{ + FieldEffectStop(sprite, FLDEFF_SECRET_POWER_SHRUB); + EnableBothScriptContexts(); +} diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c new file mode 100644 index 000000000..3c64ec520 --- /dev/null +++ b/src/fldeff_softboiled.c @@ -0,0 +1,148 @@ +#include "global.h" +#include "fldeff_softboiled.h" +#include "menu.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_menu.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "task.h" +#include "ewram.h" + +struct Struct2001000 { + u8 unk0; + u8 unk1; + u8 unk2; + u8 filler3[9]; + void *unkC; +}; + +struct Struct201C000 { + struct Pokemon *unk0; + u8 filler4[1]; + u8 unk5; + u16 unk6; + u8 filler8[4]; + s32 unkC; + void* unk10; + u8 filler14[26]; + s16 unk2E; +}; + +#if ENGLISH +#define WINDOW_LEFT 3 +#define WINDOW_RIGHT 26 +#elif GERMAN +#define WINDOW_LEFT 0 +#define WINDOW_RIGHT 29 +#endif + +// extern +extern u8 gUnknown_0202E8F6; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gUnknown_0202E8F4; + +// Static +static void sub_8133D50(u8 taskId); +static void sub_8133E74(u8 taskId); +static void sub_8133EB8(u8 taskId); +static void sub_8133EF8(void); + +bool8 SetUpFieldMove_SoftBoiled(void) { + u16 maxHp; + u16 hp; + u16 minHp; + + maxHp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAX_HP); + hp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HP); + + minHp = (maxHp / 5); + if (hp >= minHp) + { + return TRUE; + } + + return FALSE; +} + +void sub_8133D28(u8 taskid) { + EWRAM_1000.unkC = sub_8133D50; + EWRAM_1B000_2.unk272 = 3; + DoPokemonMenu_Switch(taskid); +} + +static void sub_8133D50(u8 taskId) { + u8 unk1, unk2; + u16 hp; + struct Pokemon *pokemon; + //struct Task *task; + + struct Sprite *sprites = gSprites; + + + unk1 = sprites[EWRAM_1000.unk1].data[0]; + unk2 = sprites[EWRAM_1000.unk2].data[0]; + + if (unk1 > 5 || unk2 > 5) + { + sub_806CD44(taskId); + return; + } + + EWRAM_1C000.unk0 = &gPlayerParty[sprites[EWRAM_1000.unk2].data[0]]; + hp = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP); + + if (hp == 0 || unk1 == unk2 || GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP) == hp) + { + sub_8133EB8(taskId); + return; + } + + PlaySE(SE_KAIFUKU); + + EWRAM_1C000.unk5 = gSprites[EWRAM_1000.unk1].data[0]; + + pokemon = &gPlayerParty[EWRAM_1C000.unk5]; + EWRAM_1C000.unk0 = pokemon; + EWRAM_1C000.unk6 = 0; + EWRAM_1C000.unkC = -0x8000; + EWRAM_1C000.unk10 = sub_8133EF8; + + + gTasks[taskId].data[10] = GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP); + gTasks[taskId].data[11] = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP); + gTasks[taskId].data[12] = gTasks[taskId].data[10] / 5; + + sub_806D5A4(); + gTasks[taskId].func = sub_806FA18; + EWRAM_1B000_2.unk282 = gTasks[taskId].data[11]; +} + +static void sub_8133E74(u8 taskId) { + if (gUnknown_0202E8F6) + { + return; + } + + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + PrintPartyMenuPromptText(3, 0); + gTasks[taskId].func = HandlePartyMenuSwitchPokemonInput; +} + +static void sub_8133EB8(u8 taskId) { + gUnknown_0202E8F4 = 0; + sub_806D5A4(); + sub_806E834(gOtherText_CantUseOnPoke, 1); + gTasks[taskId].func = sub_8133E74; +} + +static void sub_8133EF8(void) { + sub_806CCE4(); + EWRAM_1B000_2.unk261 = 2; + DestroySprite(&gSprites[EWRAM_1000.unk1]); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + PrintPartyMenuPromptText(0, 0); + SwitchTaskToFollowupFunc(EWRAM_1000.unk0); +} diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c new file mode 100644 index 000000000..9f9cd4013 --- /dev/null +++ b/src/fldeff_strength.c @@ -0,0 +1,99 @@ +#include "global.h" +#include "constants/map_objects.h" +#include "braille_puzzles.h" +#include "field_effect.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_menu.h" +#include "rom6.h" +#include "script.h" +#include "task.h" +#include "text.h" + +static void sub_811AA18(void); +static void sub_811AA38(void); +static void sub_811AA9C(void); + +extern u8 gLastFieldPokeMenuOpened; +extern u16 gSpecialVar_Result; +extern void (*gFieldCallback)(void); +extern void (*gUnknown_03005CE4)(void); + +extern u8 S_UseStrength[]; + +#if DEBUG +void debug_sub_8130318(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + gLastFieldPokeMenuOpened = 0; + gSpecialVar_Result = 0; + sub_811AA38(); + } + else if (npc_before_player_of_type(MAP_OBJ_GFX_PUSHABLE_BOULDER) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + gSpecialVar_Result = 0; + sub_811AA18(); + } + else + { + ScriptContext2_Disable(); + } +} +#endif + +bool8 SetUpFieldMove_Strength(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + gSpecialVar_Result = gLastFieldPokeMenuOpened; + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_811AA38; + } + else + { + if (npc_before_player_of_type(87) != TRUE) + return 0; + gSpecialVar_Result = gLastFieldPokeMenuOpened; + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_811AA18; + } + + return TRUE; +} + +static void sub_811AA18(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + ScriptContext1_SetupScript(S_UseStrength); +} + +static void sub_811AA38(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + FieldEffectStart(FLDEFF_USE_STRENGTH); +} + +bool8 FldEff_UseStrength(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_811AA9C >> 16; + gTasks[taskId].data[9] = (u32)sub_811AA9C; + GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1); + return FALSE; +} + +static void sub_811AA9C(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + DoBrailleStrengthEffect(); + } + else + { + FieldEffectActiveListRemove(40); + EnableBothScriptContexts(); + } +} diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c new file mode 100644 index 000000000..b9dbf619d --- /dev/null +++ b/src/fldeff_sweetscent.c @@ -0,0 +1,88 @@ +#include "global.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "palette.h" +#include "pokemon_menu.h" +#include "rom6.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "wild_encounter.h" + +static void sub_812BFD4(void); +static void sub_812C01C(void); +static void sub_812C084(u8); +static void sub_812C118(u8); + +extern u8 gLastFieldPokeMenuOpened; +extern void (*gFieldCallback)(void); +extern void (*gUnknown_03005CE4)(void); + +extern u8 SweetScentNothingHereScript[]; + +bool8 SetUpFieldMove_SweetScent(void) +{ + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_812BFD4; + return TRUE; +} + +static void sub_812BFD4(void) +{ + FieldEffectStart(FLDEFF_SWEET_SCENT); + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; +} + +bool8 FldEff_SweetScent() +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_812C01C >> 16; + gTasks[taskId].data[9] = (u32)sub_812C01C; + return FALSE; +} + +static void sub_812C01C(void) +{ + u8 taskId; + + PlaySE(0xEC); + BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, 0x1F); + taskId = CreateTask(sub_812C084, 0); + gTasks[taskId].data[0] = 0; + FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT); +} + +static void sub_812C084(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gTasks[taskId].data[0] == 64) + { + gTasks[taskId].data[0] = 0; + if (SweetScentWildEncounter() == TRUE) + { + DestroyTask(taskId); + } + else + { + gTasks[taskId].func = sub_812C118; + BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, 0x1F); + } + } + else + { + gTasks[taskId].data[0]++; + } + } +} + +static void sub_812C118(u8 taskId) +{ + if (!gPaletteFade.active) + { + ScriptContext1_SetupScript(SweetScentNothingHereScript); + DestroyTask(taskId); + } +} diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c new file mode 100644 index 000000000..af48fb414 --- /dev/null +++ b/src/fldeff_teleport.c @@ -0,0 +1,46 @@ +#include "global.h" +#include "fldeff_teleport.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "pokemon_menu.h" +#include "overworld.h" +#include "rom6.h" +#include "task.h" + +extern void (*gFieldCallback)(void); +extern u8 gLastFieldPokeMenuOpened; +extern void (*gUnknown_03005CE4)(void); + +bool8 SetUpFieldMove_Teleport(void) +{ + if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = hm_teleport_run_dp02scr; + return TRUE; + } + + return FALSE; +} + +void hm_teleport_run_dp02scr(void) +{ + Overworld_ResetStateAfterTeleport(); + FieldEffectStart(FLDEFF_USE_TELEPORT); + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; +} + +bool8 FldEff_UseTeleport(void) +{ + u8 taskId = oei_task_add(); + gTasks[taskId].data[8] = (u32)sub_814A404 >> 16; + gTasks[taskId].data[9] = (u32)sub_814A404; + SetPlayerAvatarTransitionFlags(1); + return 0; +} + +void sub_814A404(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT); + sub_8087BA8(); +} diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c new file mode 100644 index 000000000..2b790e97d --- /dev/null +++ b/src/hall_of_fame.c @@ -0,0 +1,1366 @@ +#include "global.h" +#include "main.h" +#include "task.h" +#include "palette.h" +#include "sound.h" +#include "constants/songs.h" +#include "pokemon.h" +#include "text.h" +#include "strings.h" +#include "string_util.h" +#include "menu.h" +#include "save.h" +#include "constants/species.h" +#include "overworld.h" +#include "m4a.h" +#include "data2.h" +#include "decompress.h" +#include "random.h" +#include "scanline_effect.h" +#include "trig.h" +#include "hof_pc.h" +#include "credits.h" +#include "pc_screen_effect.h" +#include "ewram.h" + +static EWRAM_DATA u32 sUnknown_0203931C = 0; + +extern bool8 gUnknown_02039324; // has hall of fame records +extern void (*gGameContinueCallback)(void); +extern struct MusicPlayerInfo gMPlay_BGM; +extern u8 gReservedSpritePaletteCount; +extern struct SpriteTemplate gUnknown_02024E8C; + +extern const u8 gContestConfetti_Gfx[]; +extern const u8 gContestConfetti_Pal[]; +extern const u8 gHallOfFame_Gfx[]; +extern const u16 gHallOfFame_Pal[]; + +struct HallofFameMon +{ + u32 tid; + u32 personality; + u16 species : 9; + u16 lvl : 7; + u8 nick[10]; +}; + +struct HallofFameMons +{ + struct HallofFameMon mons[6]; +}; + +#define HALL_OF_FAME_MAX_TEAMS 50 + +static void sub_8141FF8(u8 taskID); +static void sub_81422E8(u8 taskID); +static void sub_814217C(u8 taskID); +static void sub_8142274(u8 taskID); +static void sub_81422B8(u8 taskID); +static void sub_8142320(u8 taskID); +static void sub_8142404(u8 taskID); +static void sub_8142484(u8 taskID); +static void sub_8142570(u8 taskID); +static void sub_8142618(u8 taskID); +static void sub_81426F8(u8 taskID); +static void sub_8142738(u8 taskID); +static void sub_8142794(u8 taskID); +static void sub_8142818(u8 taskID); +static void sub_8142850(u8 taskID); +static void sub_81428A0(u8 taskID); +static void sub_8142A28(u8 taskID); +static void sub_8142FEC(u8 taskID); +static void sub_8142B04(u8 taskID); +static void sub_8142CC8(u8 taskID); +static void sub_8142DF4(u8 taskID); +static void sub_8142F78(u8 taskID); +static void sub_8142FCC(u8 taskID); +static void sub_814302C(u8 taskID); + +static void sub_81435DC(struct Sprite* sprite); +static void sub_814386C(struct Sprite* sprite); +static void SpriteCB_HallOfFame_Dummy(struct Sprite* sprite); + +static void sub_8143068(u8 a0, u8 a1); +static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 a1, u8 a2); +static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1); +static void sub_81433E0(void); +static void sub_8143570(void); +static void sub_81435B8(void); +static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 pid); +static u32 HallOfFame_LoadTrainerPic(u16 trainerPicID, s16 posX, s16 posY, u16 a3); +static bool8 sub_81438C4(void); + +// data and gfx + +static const struct CompressedSpriteSheet sHallOfFame_ConfettiSpriteSheet = +{ + gContestConfetti_Gfx, 0x220, 1001 +}; + +static const u8 sUnused0[8] = {}; + +static const struct CompressedSpritePalette sHallOfFame_ConfettiSpritePalette = +{ + gContestConfetti_Pal, 1001 +}; + +static const u8 sUnused1[8] = {}; + +static const s16 sHallOfFame_MonsFullTeamPositions[6][4] = +{ + {120, 210, 120, 40}, + {326, 220, 56, 40}, + {-86, 220, 184, 40}, + {120, -62, 120, 88}, + {-25, -62, 200, 88}, + {265, -62, 40, 88} +}; + +static const s16 sHallOfFame_MonsHalfTeamPositions[3][4] = +{ + {120, 214, 120, 64}, + {281, 214, 56, 64}, + {-41, 214, 184, 64} +}; + +static const struct PCScreenEffectStruct sPCScreenEffectTemplate = { + .tileTag = 0x3ea, + .paletteTag = 0x3ea +}; + +static const u8 sUnused2[6] = {2, 1, 3, 6, 4, 5}; + +static const struct OamData sOamData_840B598 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +void* const gUnknown_0840B5A0[] = +{ + ewram8000, + ewramA000, + ewramC000, + ewramE000, + ewram10000, + ewram14000, + ewram18000_2 +}; + +static const struct SpriteFrameImage sSpriteImageTable_840B5BC[] = +{ + {ewram8000, 0x800}, + {ewram8800, 0x800}, + {ewram9000, 0x800}, + {ewram9800, 0x800} +}; + +static const struct SpriteFrameImage sSpriteImageTable_840B5DC[] = +{ + {ewramA000, 0x800}, + {ewramA800, 0x800}, + {ewramB000, 0x800}, + {ewramB800, 0x800} +}; + +static const struct SpriteFrameImage sSpriteImageTable_840B5FC[] = +{ + {ewramC000, 0x800}, + {ewramC800, 0x800}, + {ewramD000, 0x800}, + {ewramD800, 0x800} +}; + +static const struct SpriteFrameImage sSpriteImageTable_840B61C[] = +{ + {ewramE000, 0x800}, + {ewramE800, 0x800}, + {ewramF000, 0x800}, + {ewramF800, 0x800} +}; + +static const struct SpriteFrameImage sSpriteImageTable_840B63C[] = +{ + {ewram10000, 0x800}, + {ewram10800, 0x800}, + {ewram11000, 0x800}, + {ewram11800, 0x800} +}; + +static const struct SpriteFrameImage sSpriteImageTable_840B65C[] = +{ + {ewram14000, 0x800}, + {ewram14800, 0x800}, + {ewram15000, 0x800}, + {ewram15800, 0x800} +}; + +static const struct SpriteFrameImage sSpriteImageTable_840B67C[] = +{ + {ewram18000_2, 0x800}, + {ewram18800, 0x800}, + {ewram19000, 0x800}, + {ewram19800, 0x800} +}; + +static const struct SpriteFrameImage* const sUnknown_0840B69C[7] = +{ + sSpriteImageTable_840B5BC, + sSpriteImageTable_840B5DC, + sSpriteImageTable_840B5FC, + sSpriteImageTable_840B61C, + sSpriteImageTable_840B63C, + sSpriteImageTable_840B65C, + sSpriteImageTable_840B67C +}; + +static const struct SpriteTemplate sUnknown_0840B6B8 = +{ + .tileTag = -1, + .paletteTag = -1, + .oam = &sOamData_840B598, + .anims = NULL, + .images = sSpriteImageTable_840B5BC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFame_Dummy +}; + +static const struct OamData sOamData_840B6D0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_840B6D8[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B6E0[] = +{ + ANIMCMD_FRAME(1, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B6E8[] = +{ + ANIMCMD_FRAME(2, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B6F0[] = +{ + ANIMCMD_FRAME(3, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B6F8[] = +{ + ANIMCMD_FRAME(4, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B700[] = +{ + ANIMCMD_FRAME(5, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B708[] = +{ + ANIMCMD_FRAME(6, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B710[] = +{ + ANIMCMD_FRAME(7, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B718[] = +{ + ANIMCMD_FRAME(8, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B720[] = +{ + ANIMCMD_FRAME(9, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B728[] = +{ + ANIMCMD_FRAME(10, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B730[] = +{ + ANIMCMD_FRAME(11, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B738[] = +{ + ANIMCMD_FRAME(12, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B740[] = +{ + ANIMCMD_FRAME(13, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B748[] = +{ + ANIMCMD_FRAME(14, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B750[] = +{ + ANIMCMD_FRAME(15, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_840B758[] = +{ + ANIMCMD_FRAME(16, 30), + ANIMCMD_END +}; + +static const union AnimCmd* const sSpriteAnimTable_840B760[] = +{ + sSpriteAnim_840B6D8, + sSpriteAnim_840B6E0, + sSpriteAnim_840B6E8, + sSpriteAnim_840B6F0, + sSpriteAnim_840B6F8, + sSpriteAnim_840B700, + sSpriteAnim_840B708, + sSpriteAnim_840B710, + sSpriteAnim_840B718, + sSpriteAnim_840B720, + sSpriteAnim_840B728, + sSpriteAnim_840B730, + sSpriteAnim_840B738, + sSpriteAnim_840B740, + sSpriteAnim_840B748, + sSpriteAnim_840B750, + sSpriteAnim_840B758 +}; + +static const struct SpriteTemplate sSpriteTemplate_840B7A4 = +{ + .tileTag = 1001, + .paletteTag = 1001, + .oam = &sOamData_840B6D0, + .anims = sSpriteAnimTable_840B760, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_814386C +}; + +// code + +#define tDisplayedPoke data[1] +#define tPokesNumber data[2] +#define tFrameCount data[3] +#define tPlayerSpriteID data[4] +#define tMonSpriteID(i) data[i + 5] + +static void VBlankCB_HallOfFame(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void CB2_HallOfFame(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static bool8 sub_8141E64(void) +{ + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + sub_81433E0(); + gMain.state = 1; + break; + case 1: + sub_8143570(); + gMain.state++; + break; + case 2: + { + u16 saved_IME; + + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + SetVBlankCallback(VBlankCB_HallOfFame); + saved_IME = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = saved_IME; + REG_DISPSTAT |= 8; + gMain.state++; + } + break; + case 3: + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x710; + REG_BLDY = 0; + sub_81435B8(); + gMain.state++; + break; + case 4: + UpdatePaletteFade(); + if (!gPaletteFade.active) + { + SetMainCallback2(CB2_HallOfFame); + PlayBGM(BGM_DENDOU); + return 0; + } + break; + } + return 1; +} + +void sub_8141F90(void) +{ + if (sub_8141E64() == 0) + { + u8 taskID = CreateTask(sub_8141FF8, 0); + gTasks[taskID].data[0] = 0; + } +} + +static void sub_8141FC4(void) +{ + if (sub_8141E64() == 0) + { + u8 taskID = CreateTask(sub_8141FF8, 0); + gTasks[taskID].data[0] = 1; + } +} + +static void sub_8141FF8(u8 taskID) +{ + u16 i, j; + struct HallofFameMons* fameMons = eHallOfFameMons1; + + gTasks[taskID].tPokesNumber = 0; // valid pokes + for (i = 0; i < 6; i++) + { + u8 nick[12]; + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + { + fameMons->mons[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + fameMons->mons[i].tid = GetMonData(&gPlayerParty[i], MON_DATA_OT_ID); + fameMons->mons[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); + fameMons->mons[i].lvl = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); + GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nick); + for (j = 0; j < 10; j++) + { + fameMons->mons[i].nick[j] = nick[j]; + } + gTasks[taskID].tPokesNumber++; + } + else + { + fameMons->mons[i].species = 0; + fameMons->mons[i].tid = 0; + fameMons->mons[i].personality = 0; + fameMons->mons[i].lvl = 0; + fameMons->mons[i].nick[0] = EOS; + } + } + sUnknown_0203931C = 0; + gTasks[taskID].tDisplayedPoke = 0; + gTasks[taskID].data[4] = 0xFF; + for (i = 0; i < 6; i++) + { + gTasks[taskID].tMonSpriteID(i) = 0xFF; + } + if (gTasks[taskID].data[0]) + gTasks[taskID].func = sub_81422E8; + else + gTasks[taskID].func = sub_814217C; +} + +static void sub_814217C(u8 taskID) +{ + u16 i; + struct HallofFameMons* fameMons = eHallOfFameMons1; + struct HallofFameMons* lastSavedTeam = eHallOfFameMons2; + + if (gUnknown_02039324 == FALSE) + { + for (i = 0; i < 0x2000; i++) + ewram1E000(i) = 0; + } + else + Save_LoadGameData(SAVE_HALL_OF_FAME); + + for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++) + { + if (lastSavedTeam->mons[0].species == 0) + break; + } + if (i >= HALL_OF_FAME_MAX_TEAMS) + { + struct HallofFameMons* r5 = eHallOfFameMons2; + struct HallofFameMons* r6 = eHallOfFameMons2; + r5++; + for (i = 0; i < HALL_OF_FAME_MAX_TEAMS - 1; i++, r6++, r5++) + { + *r6 = *r5; + } + lastSavedTeam--; + } + *lastSavedTeam = *fameMons; + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gMenuText_HOFSaving, 3, 15); + gTasks[taskID].func = sub_8142274; +} + +static void sub_8142274(u8 taskID) +{ + gGameContinueCallback = sub_8141FC4; + Save_WriteData(3); + PlaySE(SE_SAVE); + gTasks[taskID].func = sub_81422B8; + gTasks[taskID].tFrameCount = 32; +} + +static void sub_81422B8(u8 taskID) +{ + if (gTasks[taskID].tFrameCount) + gTasks[taskID].tFrameCount--; + else + gTasks[taskID].func = sub_81422E8; +} + +static void sub_81422E8(u8 taskID) +{ + Text_LoadWindowTemplate(&gWindowTemplate_81E7198); + InitMenuWindow(&gWindowTemplate_81E7198); + gTasks[taskID].func = sub_8142320; +} + +static void sub_8142320(u8 taskID) +{ + u8 spriteID; + s16 xPos, yPos, field4, field6; + + struct HallofFameMons* fameMons = eHallOfFameMons1; + u16 currPokeID = gTasks[taskID].tDisplayedPoke; + struct HallofFameMon* currMon = &fameMons->mons[currPokeID]; + + if (gTasks[taskID].tPokesNumber > 3) + { + xPos = sHallOfFame_MonsFullTeamPositions[currPokeID][0]; + yPos = sHallOfFame_MonsFullTeamPositions[currPokeID][1]; + field4 = sHallOfFame_MonsFullTeamPositions[currPokeID][2]; + field6 = sHallOfFame_MonsFullTeamPositions[currPokeID][3]; + } + else + { + xPos = sHallOfFame_MonsHalfTeamPositions[currPokeID][0]; + yPos = sHallOfFame_MonsHalfTeamPositions[currPokeID][1]; + field4 = sHallOfFame_MonsHalfTeamPositions[currPokeID][2]; + field6 = sHallOfFame_MonsHalfTeamPositions[currPokeID][3]; + } + + spriteID = HallOfFame_LoadPokemonPic(currMon->species, xPos, yPos, currPokeID, currMon->tid, currMon->personality); + gSprites[spriteID].data[1] = field4; + gSprites[spriteID].data[2] = field6; + gSprites[spriteID].data[0] = 0; + gSprites[spriteID].callback = sub_81435DC; + gTasks[taskID].tMonSpriteID(currPokeID) = spriteID; + Menu_EraseWindowRect(0, 14, 29, 19); + gTasks[taskID].func = sub_8142404; +} + +static void sub_8142404(u8 taskID) +{ + struct HallofFameMons* fameMons = eHallOfFameMons1; + u16 currPokeID = gTasks[taskID].tDisplayedPoke; + struct HallofFameMon* currMon = &fameMons->mons[currPokeID]; + + if (gSprites[gTasks[taskID].tMonSpriteID(currPokeID)].data[0] != 0) + { + if (currMon->species != SPECIES_EGG) + PlayCry1(currMon->species, 0); + HallOfFame_PrintMonInfo(currMon, 0, 14); + gTasks[taskID].tFrameCount = 120; + gTasks[taskID].func = sub_8142484; + } +} + +static void sub_8142484(u8 taskID) +{ + struct HallofFameMons* fameMons = eHallOfFameMons1; + u16 currPokeID = gTasks[taskID].tDisplayedPoke; + struct HallofFameMon* currMon = &fameMons->mons[currPokeID]; + + if (gTasks[taskID].tFrameCount != 0) + gTasks[taskID].tFrameCount--; + else + { + sUnknown_0203931C |= (0x10000 << gSprites[gTasks[taskID].tMonSpriteID(currPokeID)].oam.paletteNum); + if (gTasks[taskID].tDisplayedPoke <= 4 && currMon[1].species != 0) // there is another pokemon to display + { + gTasks[taskID].tDisplayedPoke++; + BeginNormalPaletteFade(sUnknown_0203931C, 0, 12, 12, 0x735F); + gSprites[gTasks[taskID].tMonSpriteID(currPokeID)].oam.priority = 1; + gTasks[taskID].func = sub_8142320; + } + else + gTasks[taskID].func = sub_8142570; + } +} + +static void sub_8142570(u8 taskID) +{ + u16 i; + + BeginNormalPaletteFade(0xFFFF0000, 0, 0, 0, 0); + for (i = 0; i < 6; i++) + { + if (gTasks[taskID].tMonSpriteID(i) != 0xFF) + gSprites[gTasks[taskID].tMonSpriteID(i)].oam.priority = 0; + } + Menu_EraseWindowRect(0, 14, 29, 19); + sub_8143068(0, 15); + PlaySE(SE_DENDOU); + gTasks[taskID].tFrameCount = 400; + gTasks[taskID].func = sub_8142618; +} + +static void sub_8142618(u8 taskID) +{ + if (gTasks[taskID].tFrameCount != 0) + { + gTasks[taskID].tFrameCount--; + if ((gTasks[taskID].tFrameCount & 3) == 0 && gTasks[taskID].tFrameCount > 110) + sub_81438C4(); + } + else + { + u16 i; + for (i = 0; i < 6; i++) + { + if (gTasks[taskID].tMonSpriteID(i) != 0xFF) + gSprites[gTasks[taskID].tMonSpriteID(i)].oam.priority = 1; + } + BeginNormalPaletteFade(sUnknown_0203931C, 0, 12, 12, 0x735F); + Menu_EraseWindowRect(0, 14, 29, 19); + gTasks[taskID].tFrameCount = 7; + gTasks[taskID].func = sub_81426F8; + } +} + +static void sub_81426F8(u8 taskID) +{ + if (gTasks[taskID].tFrameCount >= 16) + gTasks[taskID].func = sub_8142738; + else + { + gTasks[taskID].tFrameCount++; + REG_BLDALPHA = gTasks[taskID].tFrameCount * 256; + } +} + +static void sub_8142738(u8 taskID) +{ + REG_DISPCNT = 0x1940; + Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); + InitMenuWindow(&gWindowTemplate_81E71B4); + + gTasks[taskID].tPlayerSpriteID = HallOfFame_LoadTrainerPic(gSaveBlock2.playerGender, 120, 72, 6); + gTasks[taskID].tFrameCount = 120; + gTasks[taskID].func = sub_8142794; +} + +static void sub_8142794(u8 taskID) +{ + if (gTasks[taskID].tFrameCount != 0) + gTasks[taskID].tFrameCount--; + else + { + if (gSprites[gTasks[taskID].tPlayerSpriteID].pos1.x != 160) + gSprites[gTasks[taskID].tPlayerSpriteID].pos1.x++; + else + { + Menu_DrawStdWindowFrame(1, 2, 15, 9); + HallOfFame_PrintPlayerInfo(1, 2); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gMenuText_HOFCongratulations, 4, 15); + gTasks[taskID].func = sub_8142818; + } + } +} + +static void sub_8142818(u8 taskID) +{ + if (gMain.newKeys & A_BUTTON) + { + FadeOutBGM(4); + gTasks[taskID].func = sub_8142850; + } +} + +static void sub_8142850(u8 taskID) +{ + CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200); + BeginNormalPaletteFade(-1, 8, 0, 0x10, 0); + gTasks[taskID].func = sub_81428A0; +} + +static void sub_81428A0(u8 taskID) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskID); + SetMainCallback2(sub_81439D0); + } +} + +#undef tDisplayedPoke +#undef tPokesNumber +#undef tFrameCount +#undef tPlayerSpriteID +#undef tMonSpriteID + +void sub_81428CC(void) +{ + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + sub_81433E0(); + gMain.state = 1; + break; + case 1: + sub_8143570(); + gMain.state++; + break; + case 2: + { + u16 savedIme; + + SetVBlankCallback(VBlankCB_HallOfFame); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + REG_DISPSTAT |= 8; + gMain.state++; + } + break; + case 3: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + sub_81435B8(); + + eHOFPCScreenEffect = sPCScreenEffectTemplate; + + sub_80C5CD4(&eHOFPCScreenEffect); + gMain.state++; + break; + case 4: + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + if (sub_80C5DCC()) + gMain.state++; + break; + case 5: + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x710; + REG_BLDY = 0; + CreateTask(sub_8142A28, 0); + SetMainCallback2(CB2_HallOfFame); + break; + } +} + +#define tCurrTeamNo data[0] +#define tCurrPageNo data[1] +#define tCurrPokeID data[2] +#define tPokesNo data[4] +#define tMonSpriteID(i) data[i + 5] + +static void sub_8142A28(u8 taskID) +{ + if (Save_LoadGameData(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK) + gTasks[taskID].func = sub_8142FEC; + else + { + u16 *vram1, *vram2; + + u16 i; + struct HallofFameMons* savedTeams = eHallOfFameMons2; + for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, savedTeams++) + { + if (savedTeams->mons[0].species == 0) + break; + } + if (i < HALL_OF_FAME_MAX_TEAMS) + gTasks[taskID].tCurrTeamNo = i - 1; + else + gTasks[taskID].tCurrTeamNo = HALL_OF_FAME_MAX_TEAMS - 1; + gTasks[taskID].tCurrPageNo = GetGameStat(10); + + for (i = 0, vram1 = (u16*)(VRAM + 0x381A), vram2 = (u16*)(VRAM + 0x385A); i <= 16; i++) + { + *(vram1 + i) = i + 3; + *(vram2 + i) = i + 20; + } + Text_LoadWindowTemplate(&gWindowTemplate_81E7198); + InitMenuWindow(&gWindowTemplate_81E7198); + gTasks[taskID].func = sub_8142B04; + } +} + +static void sub_8142B04(u8 taskID) +{ + struct HallofFameMons* savedTeams = eHallOfFameMons2; + struct HallofFameMon* currMon; + u16 i; + u8* stringPtr; + + for (i = 0; i < gTasks[taskID].tCurrTeamNo; i++) + savedTeams++; + + currMon = &savedTeams->mons[0]; + sUnknown_0203931C = 0; + gTasks[taskID].tCurrPokeID = 0; + gTasks[taskID].tPokesNo = 0; + + for (i = 0; i < 6; i++, currMon++) + { + if (currMon->species != 0) + gTasks[taskID].tPokesNo++; + } + + currMon = &savedTeams->mons[0]; + + for (i = 0; i < 6; i++, currMon++) + { + if (currMon->species != 0) + { + u16 spriteID; + s16 posX, posY; + if (gTasks[taskID].tPokesNo > 3) + { + posX = sHallOfFame_MonsFullTeamPositions[i][2]; + posY = sHallOfFame_MonsFullTeamPositions[i][3]; + } + else + { + posX = sHallOfFame_MonsHalfTeamPositions[i][2]; + posY = sHallOfFame_MonsHalfTeamPositions[i][3]; + } + spriteID = HallOfFame_LoadPokemonPic(currMon->species, posX, posY, i, currMon->tid, currMon->personality); + gSprites[spriteID].oam.priority = 1; + gTasks[taskID].tMonSpriteID(i) = spriteID; + } + else + gTasks[taskID].tMonSpriteID(i) = 0xFF; + } + + BlendPalettes(0xFFFF0000, 0xC, 0x735F); + + stringPtr = gStringVar1; + stringPtr = StringCopy(stringPtr, gMenuText_HOFNumber); + stringPtr[0] = 0xFC; + stringPtr[1] = 0x14; + stringPtr[2] = 0x6; + stringPtr += 3; + stringPtr = ConvertIntToDecimalString(stringPtr, gTasks[taskID].tCurrPageNo); + stringPtr[0] = 0xFC; + stringPtr[1] = 0x13; + stringPtr[2] = 0xF0; + stringPtr[3] = EOS; + Menu_PrintText(gStringVar1, 0, 0); + + gTasks[taskID].func = sub_8142CC8; +} + +static void sub_8142CC8(u8 taskID) +{ + struct HallofFameMons* savedTeams = eHallOfFameMons2; + struct HallofFameMon* currMon; + u16 i; + u16 currMonID; + + for (i = 0; i < gTasks[taskID].tCurrTeamNo; i++) + savedTeams++; + + for (i = 0; i < 6; i++) + { + u16 spriteID = gTasks[taskID].tMonSpriteID(i); + if (spriteID != 0xFF) + gSprites[spriteID].oam.priority = 1; + } + + currMonID = gTasks[taskID].tMonSpriteID(gTasks[taskID].tCurrPokeID); + gSprites[currMonID].oam.priority = 0; + sUnknown_0203931C = (0x10000 << gSprites[currMonID].oam.paletteNum) ^ 0xFFFF0000; + BlendPalettesUnfaded(sUnknown_0203931C, 0xC, 0x735F); + + currMon = &savedTeams->mons[gTasks[taskID].tCurrPokeID]; + if (currMon->species != SPECIES_EGG) + { + StopCryAndClearCrySongs(); + PlayCry1(currMon->species, 0); + } + HallOfFame_PrintMonInfo(currMon, 0, 14); + + gTasks[taskID].func = sub_8142DF4; +} + +static void sub_8142DF4(u8 taskID) +{ + u16 i; + if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskID].tCurrTeamNo != 0) // prepare another team to view + { + gTasks[taskID].tCurrTeamNo--; + for (i = 0; i < 6; i++) + { + u8 spriteID = gTasks[taskID].tMonSpriteID(i); + if (spriteID != 0xFF) + { + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteID].oam.paletteNum)); + DestroySprite(&gSprites[spriteID]); + } + } + if (gTasks[taskID].tCurrPageNo != 0) + gTasks[taskID].tCurrPageNo--; + gTasks[taskID].func = sub_8142B04; + } + else // no more teams to view, turn off hall of fame PC + { + if (IsCryPlayingOrClearCrySongs()) + { + StopCryAndClearCrySongs(); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + } + gTasks[taskID].func = sub_8142F78; + } + } + else if (gMain.newKeys & B_BUTTON) // turn off hall of fame PC + { + if (IsCryPlayingOrClearCrySongs()) + { + StopCryAndClearCrySongs(); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + } + gTasks[taskID].func = sub_8142F78; + } + else if (gMain.newKeys & DPAD_UP && gTasks[taskID].tCurrPokeID != 0) // change poke -1 + { + gTasks[taskID].tCurrPokeID--; + gTasks[taskID].func = sub_8142CC8; + } + else if (gMain.newKeys & DPAD_DOWN && gTasks[taskID].tCurrPokeID < gTasks[taskID].tPokesNo - 1) // change poke +1 + { + gTasks[taskID].tCurrPokeID++; + gTasks[taskID].func = sub_8142CC8; + } +} + +static void sub_8142F78(u8 taskID) +{ + CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200); + eHOFPCScreenEffect = sPCScreenEffectTemplate; + sub_80C5E38(&eHOFPCScreenEffect); + gTasks[taskID].func = sub_8142FCC; +} + +static void sub_8142FCC(u8 taskID) +{ + if (sub_80C5F98()) + { + DestroyTask(taskID); + ReturnFromHallOfFamePC(); + } +} + +static void sub_8142FEC(u8 taskID) +{ + Menu_DrawStdWindowFrame(2, 14, 27, 19); + MenuPrintMessage(gMenuText_HOFCorrupt, 3, 15); + gTasks[taskID].func = sub_814302C; +} + +static void sub_814302C(u8 taskID) +{ + if (Menu_UpdateWindowText() && gMain.newKeys & A_BUTTON) + gTasks[taskID].func = sub_8142F78; +} + +#undef tCurrTeamNo +#undef tCurrPageNo +#undef tCurrPokeID +#undef tPokesNo +#undef tMonSpriteID + +static void sub_8143068(u8 a0, u8 a1) +{ + sub_8072BD8(gMenuText_WelcomeToHOFAndDexRating, 0, a1 + 1, 0xF0); +} + +static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 a1, u8 a2) +{ + u8* stringPtr; + u16 monData; + u16 i; + + stringPtr = gStringVar1; + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x13; + stringPtr[2] = 0x28; + stringPtr[3] = EOS; + + if (currMon->species != SPECIES_EGG) + { + monData = SpeciesToPokedexNum(currMon->species); + if (monData != 0xFFFF) + { + stringPtr = StringCopy(stringPtr, gOtherText_Number2); + ConvertIntToDecimalStringN(stringPtr, monData, 2, 3); + } + } + + Menu_PrintText(gStringVar1, a1 + 4, a2 + 1); + stringPtr = gStringVar1; + + for (i = 0; i < 10 && currMon->nick[i] != EOS; stringPtr[i] = currMon->nick[i], i++) {} + stringPtr += i; + stringPtr[0] = EOS; + + if (currMon->species == SPECIES_EGG) + { + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x13; + stringPtr[2] = 0xA0; + stringPtr[3] = EOS; + Menu_PrintText(gStringVar1, a1 + 9, a2 + 1); + Menu_EraseWindowRect(0, a2 + 3, 29, a2 + 4); + } + else + { + + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x13; + stringPtr[2] = 0x3E; + stringPtr += 3; + + stringPtr[0] = CHAR_SLASH; + stringPtr++; + + for (i = 0; i < 10 && gSpeciesNames[currMon->species][i] != EOS; stringPtr[i] = gSpeciesNames[currMon->species][i], i++) {} + + stringPtr += i; + stringPtr[0] = CHAR_SPACE; + stringPtr++; + + if (currMon->species != SPECIES_NIDORAN_M && currMon->species != SPECIES_NIDORAN_F) + { + switch (GetGenderFromSpeciesAndPersonality(currMon->species, currMon->personality)) + { + case MON_MALE: + stringPtr[0] = CHAR_MALE; + stringPtr++; + break; + case MON_FEMALE: + stringPtr[0] = CHAR_FEMALE; + stringPtr++; + break; + } + } + + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x13; + stringPtr[2] = 0xA0; + stringPtr[3] = EOS; + + Menu_PrintText(gStringVar1, a1 + 9, a2 + 1); + + monData = currMon->lvl; + + stringPtr = StringCopy(gStringVar1, gOtherText_Level3); + + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x14; + stringPtr[2] = 6; + stringPtr += 3; + + stringPtr = ConvertIntToDecimalStringN(stringPtr, monData, 0, 3); + + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x13; + stringPtr[2] = 0x30; + stringPtr[3] = EOS; + + Menu_PrintText(gStringVar1, a1 + 7, a2 + 3); + + monData = currMon->tid; + + stringPtr = StringCopy(gStringVar1, gOtherText_IDNumber); + ConvertIntToDecimalStringN(stringPtr, monData, 2, 5); + + Menu_PrintText(gStringVar1, a1 + 13, a2 + 3); + } +} + +#define ByteRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) + +static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1) +{ + u8* stringPtr; + u16 visibleTid; + + Menu_PrintText(gOtherText_Name, a0 + 1, a1 + 1); + MenuPrint_RightAligned(gSaveBlock2.playerName, a0 + 14, a1 + 1); + + Menu_PrintText(gOtherText_IDNumber2, a0 + 1, a1 + 3); + visibleTid = ByteRead16(gSaveBlock2.playerTrainerId); + ConvertIntToDecimalStringN(gStringVar1, visibleTid, 2, 5); + + MenuPrint_RightAligned(gStringVar1, a0 + 14, a1 + 3); + Menu_PrintText(gMainMenuString_Time, a0 + 1, a1 + 5); + + stringPtr = ConvertIntToDecimalString(gStringVar1, gSaveBlock2.playTimeHours); + stringPtr[0] = CHAR_SPACE; + stringPtr[1] = CHAR_COLON; + stringPtr[2] = CHAR_SPACE; + stringPtr += 3; + + stringPtr = ConvertIntToDecimalStringN(stringPtr, gSaveBlock2.playTimeMinutes, 2, 2); + stringPtr[0] = EOS; + + MenuPrint_RightAligned(gStringVar1, a0 + 14, a1 + 5); +} + +static void sub_81433E0(void) +{ + u16 i; + + REG_DISPCNT = 0; + + REG_BG0CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + REG_BG1CNT = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + + REG_BG2CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + + REG_BG3CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + + DmaFill16Large(3, 0, VRAM, 0x18000, 0x1000); + DmaFill32Defvars(3, 0, OAM, OAM_SIZE); + DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); + + LZ77UnCompVram(gHallOfFame_Gfx, (void*)(VRAM)); + + for (i = 0; i < 64; i++) + { + *((u16*)(VRAM + 0x3800) + i) = 1; + } + for (i = 0; i < 192; i++) + { + *((u16*)(VRAM + 0x3B80) + i) = 1; + } + for (i = 0; i < 1024; i++) + { + *((u16*)(VRAM + 0x3000) + i) = 2; + } + + DmaFill16Large(3, 0, ewram0_6, 0x4000, 0x1000); + ResetPaletteFade(); + LoadPalette(gHallOfFame_Pal, 0, 0x20); +} + +static void sub_8143570(void) +{ + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LoadCompressedObjectPic(&sHallOfFame_ConfettiSpriteSheet); + LoadCompressedObjectPalette(&sHallOfFame_ConfettiSpritePalette); + Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); + InitMenuWindow(&gWindowTemplate_81E71B4); +} + +static void sub_81435B8(void) +{ + REG_BG1CNT = 0x700; + REG_BG3CNT = 0x603; + REG_DISPCNT = 0x1B40; +} + +static void sub_81435DC(struct Sprite* sprite) +{ + u32 spritePos = *(u32*)(&sprite->pos1); + u32 dataPos = *(u32*)(&sprite->data[1]); + if (spritePos != dataPos) + { + if (sprite->pos1.x < sprite->data[1]) + sprite->pos1.x += 15; + if (sprite->pos1.x > sprite->data[1]) + sprite->pos1.x -= 15; + + if (sprite->pos1.y < sprite->data[2]) + sprite->pos1.y += 10; + if (sprite->pos1.y > sprite->data[2]) + sprite->pos1.y -= 10; + } + else + { + sprite->data[0] = 1; + sprite->callback = SpriteCB_HallOfFame_Dummy; + } +} + +static void SpriteCB_HallOfFame_Dummy(struct Sprite* sprite) +{ + +} + +void sub_8143648(u16 paletteTag, u8 animID) +{ + gUnknown_02024E8C = sUnknown_0840B6B8; + gUnknown_02024E8C.paletteTag = paletteTag; + gUnknown_02024E8C.images = sUnknown_0840B69C[animID]; + gUnknown_02024E8C.anims = gSpriteAnimTable_81E7C64; +} + +void sub_8143680(u16 paletteTag, u8 animID) +{ + gUnknown_02024E8C = sUnknown_0840B6B8; + gUnknown_02024E8C.paletteTag = paletteTag; + gUnknown_02024E8C.images = sUnknown_0840B69C[animID]; + gUnknown_02024E8C.anims = gUnknown_081EC2A4[0]; +} + +static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 pid) +{ + u8 spriteID; + const u8* pokePal; + + LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[pokeID], species, pid, 1); + + pokePal = GetMonSpritePalFromOtIdPersonality(species, tid, pid); + LoadCompressedPalette(pokePal, 16 * pokeID + 256, 0x20); + + sub_8143648(pokeID, pokeID); + spriteID = CreateSprite(&gUnknown_02024E8C, posX, posY, 10 - pokeID); + gSprites[spriteID].oam.paletteNum = pokeID; + return spriteID; +} + +static u32 HallOfFame_LoadTrainerPic(u16 trainerPicID, s16 posX, s16 posY, u16 a3) +{ + u8 spriteID; + + DecompressPicFromTable_2(&gTrainerFrontPicTable[trainerPicID], gTrainerFrontPicCoords[trainerPicID].coords, gTrainerFrontPicCoords[trainerPicID].y_offset, (void*) 0x2000000, gUnknown_0840B5A0[a3], trainerPicID); + + LoadCompressedPalette(gTrainerFrontPicPaletteTable[trainerPicID].data, 16 * a3 + 256, 0x20); + sub_8143680(a3, a3); + + spriteID = CreateSprite(&gUnknown_02024E8C, posX, posY, 1); + gSprites[spriteID].oam.paletteNum = a3; + + return spriteID; +} + +static void sub_814386C(struct Sprite* sprite) +{ + if (sprite->pos2.y > 120) + DestroySprite(sprite); + else + { + u16 rand; + u8 tableID; + + sprite->pos2.y++; + sprite->pos2.y += sprite->data[1]; + + tableID = sprite->data[0]; + rand = (Random() % 4) + 8; + sprite->pos2.x = rand * gSineTable[tableID] / 256; + + sprite->data[0] += 4; + } +} + +static bool8 sub_81438C4(void) +{ + u8 spriteID; + struct Sprite* sprite; + + s16 posX = Random() % 240; + s16 posY = -(Random() % 8); + + spriteID = CreateSprite(&sSpriteTemplate_840B7A4, posX, posY, 0); + sprite = &gSprites[spriteID]; + + StartSpriteAnim(sprite, Random() % 17); + + if (Random() & 3) + sprite->data[1] = 0; + else + sprite->data[1] = 1; + + return 0; +} diff --git a/src/heal_location.c b/src/heal_location.c new file mode 100644 index 000000000..a10c7a7b8 --- /dev/null +++ b/src/heal_location.c @@ -0,0 +1,63 @@ +#include "global.h" +#include "heal_location.h" +#include "constants/maps.h" + +#define NUM_HEAL_LOCATIONS 22 + +static const struct HealLocation sHealLocations[] = +{ + {MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), 4, 2}, + {MAP_GROUP(LITTLEROOT_TOWN_MAYS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_2F), 4, 2}, + {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), 20, 17}, + {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), 19, 20}, + {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), 22, 6}, + {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), 16, 39}, + {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), 5, 7}, + {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), 24, 15}, + {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), 28, 17}, + {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), 43, 32}, + {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 27, 49}, + {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 5, 9}, + {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 14, 9}, + {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), 6, 17}, + {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), 2, 11}, + {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), 9, 7}, + {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), 14, 8}, + {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), 16, 4}, + {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), 8, 16}, + {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 18, 6}, + {MAP_GROUP(BATTLE_TOWER_OUTSIDE), MAP_NUM(BATTLE_TOWER_OUTSIDE), 14, 9}, + {MAP_GROUP(SOUTHERN_ISLAND_EXTERIOR), MAP_NUM(SOUTHERN_ISLAND_EXTERIOR), 15, 20}, +}; + +u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum) +{ + u32 i; + + for (i = 0; i < NUM_HEAL_LOCATIONS; i++) + { + if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum) + return i + 1; + } + return 0; +} + +const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum) +{ + u32 index = GetHealLocationIndexByMap(mapGroup, mapNum); + + if (index == 0) + return NULL; + else + return &sHealLocations[index - 1]; +} + +const struct HealLocation *GetHealLocation(u32 index) +{ + if (index == 0) + return NULL; + else if (index > NUM_HEAL_LOCATIONS) + return NULL; + else + return &sHealLocations[index - 1]; +} diff --git a/src/hof_pc.c b/src/hof_pc.c new file mode 100644 index 000000000..267ed4274 --- /dev/null +++ b/src/hof_pc.c @@ -0,0 +1,42 @@ +#include "global.h" +#include "hall_of_fame.h" +#include "main.h" +#include "palette.h" +#include "overworld.h" +#include "script.h" +#include "script_menu.h" +#include "task.h" + +extern void (*gFieldCallback)(void); +extern void (*gUnknown_0300485C)(void); + +static void ReshowPCMenuAfterHallOfFamePC(void); +static void Task_WaitForPaletteFade(u8); + +void AccessHallOfFamePC(void) +{ + SetMainCallback2(sub_81428CC); + ScriptContext2_Enable(); +} + +void ReturnFromHallOfFamePC(void) +{ + SetMainCallback2(c2_exit_to_overworld_2_switch); + gFieldCallback = ReshowPCMenuAfterHallOfFamePC; +} + +static void ReshowPCMenuAfterHallOfFamePC(void) +{ + ScriptContext2_Enable(); + Overworld_PlaySpecialMapMusic(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + ScrSpecial_CreatePCMenu(); + ScriptMenu_DisplayPCStartupPrompt(); + CreateTask(Task_WaitForPaletteFade, 10); +} + +static void Task_WaitForPaletteFade(u8 taskId) +{ + if (!gPaletteFade.active) + DestroyTask(taskId); +} diff --git a/src/intro.c b/src/intro.c new file mode 100644 index 000000000..5c0e7a67d --- /dev/null +++ b/src/intro.c @@ -0,0 +1,2810 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "intro.h" +#include "data2.h" +#include "decompress.h" +#include "hall_of_fame.h" +#include "intro_credits_graphics.h" +#include "libgncmultiboot.h" +#include "link.h" +#include "m4a.h" +#include "main.h" +#include "new_game.h" +#include "palette.h" +#include "random.h" +#include "save.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "task.h" +#include "title_screen.h" +#include "trig.h" +#include "scanline_effect.h" +#include "ewram.h" + +extern struct SpriteTemplate gUnknown_02024E8C; +extern u16 gUnknown_02039358; +extern u16 gUnknown_0203935A; +extern u16 gSaveFileStatus; +extern u8 gReservedSpritePaletteCount; +extern const u8 gInterfaceGfx_PokeBall[]; +extern const u8 gInterfacePal_PokeBall[]; +extern const u8 gIntroCopyright_Gfx[]; +extern const u16 gIntroCopyright_Pal[]; +extern const u16 gIntroCopyright_Tilemap[]; +extern void *const gUnknown_0840B5A0[]; + +static EWRAM_DATA u16 gUnknown_02039318 = 0; +static EWRAM_DATA u16 gUnknown_0203931A = 0; + +u32 gIntroFrameCounter; +struct GcmbStruct gMultibootProgramStruct; + +//-------------------------------------------------- +// Graphics Data +//-------------------------------------------------- + +static const u16 Palette_406340[] = INCBIN_U16("graphics/intro/unknown1.gbapal"); +static const u16 Palette_406360[] = INCBIN_U16("graphics/intro/unknown2.gbapal"); +#if ENGLISH +static const u8 gIntroTiles[] = INCBIN_U8("graphics/intro/intro.4bpp.lz"); +#elif GERMAN +extern const u8 gIntroTiles[]; +#endif +static const u16 gIntro1BGPals[][16] = +{ + INCBIN_U16("graphics/intro/intro1_bgpal1.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal2.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal3.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal4.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal5.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal6.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal7.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal8.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal9.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal10.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal11.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal12.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal13.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal14.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal15.gbapal"), + INCBIN_U16("graphics/intro/intro1_bgpal16.gbapal"), +}; +static const u8 gIntro1BG0_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg0_map.bin.lz"); +static const u8 gIntro1BG1_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg1_map.bin.lz"); +static const u8 gIntro1BG2_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg2_map.bin.lz"); +static const u8 gIntro1BG3_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg3_map.bin.lz"); +static const u8 gIntro1BGLeavesGfx[] = INCBIN_U8("graphics/intro/introgfx.4bpp.lz"); +static const u16 gIntro3PokeballPal[] = INCBIN_U16("graphics/intro/intro3_pokeball.gbapal"); +static const u8 gIntro3Pokeball_Tilemap[] = INCBIN_U8("graphics/intro/intro3_pokeball_map.bin.lz"); +static const u8 gIntro3Pokeball_Gfx[] = INCBIN_U8("graphics/intro/intro3_pokeball.8bpp.lz"); +static const u16 gIntro3Streaks_Pal[] = INCBIN_U16("graphics/intro/intro3_streaks.gbapal"); +static const u8 gIntro3Streaks_Gfx[] = INCBIN_U8("graphics/intro/intro3_streaks.4bpp.lz"); +static const u8 gIntro3Streaks_Tilemap[] = INCBIN_U8("graphics/intro/intro3_streaks_map.bin.lz"); +static const u16 gIntro3Misc1Palette[] = INCBIN_U16("graphics/intro/intro3_misc1.gbapal"); +static const u16 gIntro3Misc2Palette[] = INCBIN_U16("graphics/intro/intro3_misc2.gbapal"); +static const u8 gIntro3MiscTiles[] = INCBIN_U8("graphics/intro/intro3_misc.4bpp.lz"); +static const u16 gIntro1EonPalette[] = INCBIN_U16("graphics/intro/intro1_eon.gbapal"); +static const u8 gIntro1EonTiles[] = INCBIN_U8("graphics/intro/intro1_eon.4bpp.lz"); +static const struct OamData gOamData_840ADE8 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840ADF0[] = +{ + ANIMCMD_FRAME(16, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840ADF8[] = +{ + ANIMCMD_FRAME(24, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AE00[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AE08[] = +{ + ANIMCMD_FRAME(48, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840AE10[] = +{ + gSpriteAnim_840ADF0, + gSpriteAnim_840ADF8, + gSpriteAnim_840AE00, + gSpriteAnim_840AE08, +}; +static void sub_813D208(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840AE20 = +{ + .tileTag = 2000, + .paletteTag = 2000, + .oam = &gOamData_840ADE8, + .anims = gSpriteAnimTable_840AE10, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813D208, +}; +static const union AnimCmd Unknown_40AE38[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(128, 4), + ANIMCMD_FRAME(192, 4), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd Unknown_40AE4C[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd Unknown_40AE60[] = +{ + ANIMCMD_FRAME(256, 4), + ANIMCMD_FRAME(0x140, 4), + ANIMCMD_FRAME(0x180, 4), + ANIMCMD_END, +}; +static const union AnimCmd Unknown_40AE70[] = +{ + ANIMCMD_FRAME(0x180, 16), + ANIMCMD_FRAME(0x140, 16), + ANIMCMD_FRAME(256, 16), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_0840AE80[] = +{ + Unknown_40AE38, + Unknown_40AE4C, + Unknown_40AE60, + Unknown_40AE70, +}; +static const struct OamData gOamData_840AE90 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_840AE98 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_840AEA0 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 2, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840AEA8[] = +{ + ANIMCMD_FRAME(80, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEB0[] = +{ + ANIMCMD_FRAME(84, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEB8[] = +{ + ANIMCMD_FRAME(88, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEC0[] = +{ + ANIMCMD_FRAME(92, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEC8[] = +{ + ANIMCMD_FRAME(96, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AED0[] = +{ + ANIMCMD_FRAME(100, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AED8[] = +{ + ANIMCMD_FRAME(104, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEE0[] = +{ + ANIMCMD_FRAME(112, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEE8[] = +{ + ANIMCMD_FRAME(113, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEF0[] = +{ + ANIMCMD_FRAME(114, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AEF8[] = +{ + ANIMCMD_FRAME(115, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AF00[] = +{ + ANIMCMD_FRAME(116, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AF08[] = +{ + ANIMCMD_FRAME(117, 8), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_840AF10[] = +{ + ANIMCMD_FRAME(128, 8), + ANIMCMD_END, +}; +#if GERMAN +static const union AnimCmd gSpriteAnim_8416DA4[] = +{ + ANIMCMD_FRAME(118, 8), + ANIMCMD_END, +}; +#endif +static const union AnimCmd *const gSpriteAnimTable_840AF18[] = +{ + gSpriteAnim_840AEA8, + gSpriteAnim_840AEB0, + gSpriteAnim_840AEB8, + gSpriteAnim_840AEC0, + gSpriteAnim_840AEC8, + gSpriteAnim_840AED0, + gSpriteAnim_840AED8, +}; +static const union AnimCmd *const gSpriteAnimTable_840AF34[] = +{ + gSpriteAnim_840AEE0, + gSpriteAnim_840AEE8, + gSpriteAnim_840AEF0, + gSpriteAnim_840AEF8, + gSpriteAnim_840AF00, + gSpriteAnim_840AF08, +#if GERMAN + gSpriteAnim_8416DA4, +#endif +}; +static const union AnimCmd *const gSpriteAnimTable_840AF4C[] = +{ + gSpriteAnim_840AF10, +}; +static const s16 gUnknown_0840AF50[][2] = +{ + {0, -72}, + {1, -56}, + {2, -40}, + {3, -24}, + {4, 8}, + {5, 24}, + {3, 40}, + {1, 56}, + {6, 72}, +}; +static const s16 gUnknown_0840AF74[][2] = +{ + {0, -28}, + {1, -20}, + {2, -12}, + {3, -4}, + {2, 4}, + {4, 12}, + {5, 20}, + {3, 28}, +}; +static void sub_813D908(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840AF94 = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gOamData_840AE90, + .anims = gSpriteAnimTable_840AF18, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813D908, +}; +static const struct SpriteTemplate gSpriteTemplate_840AFAC = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gOamData_840AE98, + .anims = gSpriteAnimTable_840AF34, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813D908, +}; +static const struct SpriteTemplate gSpriteTemplate_840AFC4 = +{ + .tileTag = 2000, + .paletteTag = 2001, + .oam = &gOamData_840AEA0, + .anims = gSpriteAnimTable_840AF4C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813D908, +}; +static const struct OamData gOamData_840AFDC = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840AFE4[] = +{ + ANIMCMD_FRAME(0, 10), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const gSpriteAnimTable_840AFEC[] = +{ + gSpriteAnim_840AFE4, +}; +static void sub_813DA64(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840AFF0 = +{ + .tileTag = 2002, + .paletteTag = 2002, + .oam = &gOamData_840AFDC, + .anims = gSpriteAnimTable_840AFEC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813DA64, +}; +const struct CompressedSpriteSheet gUnknown_0840B008[] = +{ + {gIntroTiles, 0x1400, 2000}, + {NULL}, +}; +const struct CompressedSpriteSheet gUnknown_0840B018[] = +{ + {gIntro1EonTiles, 0x400, 2002}, + {NULL}, +}; +const struct SpritePalette gUnknown_0840B028[] = +{ + {Palette_406340, 2000}, + {Palette_406360, 2001}, + {gIntro1EonPalette, 2002}, + {NULL}, +}; +static const union AnimCmd gUnknown_0840B048[] = +{ + ANIMCMD_FRAME(3, 0), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_0840B050[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd gUnknown_0840B058[] = +{ + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gUnknown_0840B064[] = +{ + gUnknown_0840B048, + gUnknown_0840B050, + gUnknown_0840B058, +}; +static const struct OamData gOamData_840B070 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B078[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B080[] = +{ + gSpriteAnim_840B078, +}; +static void sub_813E30C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B084 = +{ + .tileTag = 2002, + .paletteTag = 2002, + .oam = &gOamData_840B070, + .anims = gSpriteAnimTable_840B080, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E30C, +}; +static const struct OamData gOamData_840B09C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B0A4[] = +{ + ANIMCMD_FRAME(1, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B0AC[] = +{ + gSpriteAnim_840B0A4, +}; +static void sub_813E4B8(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B0B0 = +{ + .tileTag = 2003, + .paletteTag = 2003, + .oam = &gOamData_840B09C, + .anims = gSpriteAnimTable_840B0AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E4B8, +}; +static const struct OamData gOamData_840B0C8 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B0D0[] = +{ + ANIMCMD_FRAME(14, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B0D8[] = +{ + gSpriteAnim_840B0D0, +}; +static void sub_813E5E0(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B0DC = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B0C8, + .anims = gSpriteAnimTable_840B0D8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E5E0, +}; +static void sub_813E6C0(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B0F4 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B0C8, + .anims = gSpriteAnimTable_840B0D8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E6C0, +}; +static const struct OamData gOamData_840B10C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B114[] = +{ + ANIMCMD_FRAME(6, 8), + ANIMCMD_FRAME(6, 8, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const gSpriteAnimTable_840B120[] = +{ + gSpriteAnim_840B114, +}; +static void sub_813E804(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B124 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B10C, + .anims = gSpriteAnimTable_840B120, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E804, +}; +static const struct OamData gOamData_840B13C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B144[] = +{ + ANIMCMD_FRAME(10, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B14C[] = +{ + gSpriteAnim_840B144, +}; +static void sub_813E980(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B150 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B13C, + .anims = gSpriteAnimTable_840B14C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813E980, +}; +static const u8 gUnknown_0840B168[] = {0xE6, 0xEB, 0xE4, 0xEA, 0xE5, 0xE9, 0xE7, 0xE8}; +static void sub_813EA60(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B170 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B13C, + .anims = gSpriteAnimTable_840B14C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813EA60, +}; +static const u16 gUnknown_0840B188[] = {0x200, 0x1C0, 0x180, 0x140, 0x100, 0xE0, 0xC0, 0xA0, 0x80, 0x80}; +static const struct OamData gOamData_840B19C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B1A4[] = +{ + ANIMCMD_FRAME(2, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B1AC[] = +{ + gSpriteAnim_840B1A4, +}; +static void sub_813EBBC(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B1B0 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B19C, + .anims = gSpriteAnimTable_840B1AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813EBBC, +}; +static void sub_813EC90(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B1C8 = +{ + .tileTag = 2003, + .paletteTag = 2004, + .oam = &gOamData_840B19C, + .anims = gSpriteAnimTable_840B1AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813EC90, +}; +static const struct OamData gOamData_840B1E0 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_840B1E8[] = +{ + ANIMCMD_FRAME(16, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_840B1F0[] = +{ + gSpriteAnim_840B1E8, +}; +static void sub_813EDFC(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_840B1F4 = +{ + .tileTag = 2003, + .paletteTag = 2003, + .oam = &gOamData_840B1E0, + .anims = gSpriteAnimTable_840B1F0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_813EDFC, +}; +const struct CompressedSpriteSheet gIntro3PokeballGfx_Table[] = +{ + {gInterfaceGfx_PokeBall, 0x100, 2002}, + {NULL}, +}; +const struct CompressedSpriteSheet gIntro3MiscGfx_Table[] = +{ + {gIntro3MiscTiles, 0xa00, 2003}, + {NULL}, +}; +const struct CompressedSpritePalette gInterfacePokeballPal_Table[] = +{ + {gInterfacePal_PokeBall, 2002}, + {NULL}, +}; +const struct SpritePalette gIntro3MiscPal_Table[] = +{ + {gIntro3Misc1Palette, 2003}, + {gIntro3Misc2Palette, 2004}, + {NULL}, +}; + +// Game Freak probably used the raw address here. +// Treating this like a u8 * causes the compiler +// to remove it at link time. +const u32 unusedSharedMemPtr = (u32)gSharedMem; + +static void MainCB2_EndIntro(void); +void Task_IntroLoadPart1Graphics(u8); +static void Task_IntroFadeIn(u8); +static void Task_IntroWaterDrops(u8); +static void Task_IntroScrollDownAndShowEon(u8); +static void Task_IntroWaitToSetupPart2(u8); +static void Task_IntroLoadPart2Graphics(u8); +static void Task_IntroStartBikeRide(u8); +static void Task_IntroHandleBikeAndEonMovement(u8); +static void Task_IntroWaitToSetupPart3(u8); +static void Task_IntroLoadPart3Graphics(u8); +static void Task_IntroSpinAndZoomPokeball(u8); +static void Task_IntroWaitToSetupPart3DoubleFight(u8); +static void Task_IntroLoadPart3Streaks(u8); +static void task_intro_14(u8); +static void task_intro_15(u8); +static void task_intro_16(u8); +static void task_intro_17(u8); +static void Task_IntroPokemonBattle(u8); +static void task_intro_19(u8); +static void task_intro_20(u8); +static void intro_reset_and_hide_bgs(void); +static void sub_813CCE8(u8); +static u16 sub_813CE88(u16, s16, s16, u16, u8); +static u8 sub_813CFA8(u16, u16, u16, u16); +static void sub_813D084(u8); +static void sub_813D220(struct Sprite *); +static void sub_813D368(struct Sprite *); +static void sub_813D414(struct Sprite *); +static void SpriteCB_WaterDropFall(struct Sprite *); +static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8); +static void sub_813D788(struct Sprite *); +static void sub_813D880(struct Sprite *); +static u8 CreateGameFreakLogo(s16, s16, u8); +static void sub_813DB9C(struct Sprite *); +static void sub_813DE70(struct Sprite *); +static void sub_813E10C(struct Sprite *); +static void sub_813E210(struct Sprite *); +static void sub_813E580(u16, u16); +static void sub_813E7C0(u8); +static void sub_813E930(u8); +static void InitIntroTorchicAttackAnim(u8); +static void InitIntroMudkipAttackAnim(u8); + +static void VBlankCB_Intro(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void MainCB2_Intro(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + if (gMain.newKeys && !gPaletteFade.active) + SetMainCallback2(MainCB2_EndIntro); + else if (gIntroFrameCounter != -1) + gIntroFrameCounter++; +} + +static void MainCB2_EndIntro(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitTitleScreen); +} + +static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteAddress) +{ + LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); + LoadPalette(gIntroCopyright_Pal, paletteAddress, 0x20); + CpuCopy16(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress), 0x500); +} + +static void SerialCB_CopyrightScreen(void) +{ + GameCubeMultiBoot_HandleSerialInterrupt(&gMultibootProgramStruct); +} + +static u8 SetUpCopyrightScreen(void) +{ + u16 ime; + + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + *(u16 *)PLTT = 0x7FFF; + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + ResetPaletteFade(); + LoadCopyrightGraphics(0, 0x3800, 0); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); + REG_BG0CNT = BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(7) + | BGCNT_16COLOR + | BGCNT_TXT256x256; + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(VBlankCB_Intro); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + SetSerialCallback(SerialCB_CopyrightScreen); + GameCubeMultiBoot_Init(&gMultibootProgramStruct); + default: + UpdatePaletteFade(); + gMain.state++; + GameCubeMultiBoot_Main(&gMultibootProgramStruct); + break; + case 140: + GameCubeMultiBoot_Main(&gMultibootProgramStruct); + if (gMultibootProgramStruct.gcmb_field_2 != 1) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gMain.state++; + } + break; + case 141: + if (UpdatePaletteFade()) + break; + CreateTask(Task_IntroLoadPart1Graphics, 0); + SetMainCallback2(MainCB2_Intro); + if (gMultibootProgramStruct.gcmb_field_2) + { + GameCubeMultiBoot_ExecuteProgram(&gMultibootProgramStruct); + } + else + { + GameCubeMultiBoot_Quit(); + SetSerialCallback(SerialCB); + } + return 0; + } + + return 1; +} + +void CB2_InitCopyrightScreenAfterBootup(void) +{ + if (!SetUpCopyrightScreen()) + { + sub_8052E4C(); + Save_ResetSaveCounters(); + Save_LoadGameData(SAVE_NORMAL); + if (gSaveFileStatus == 0 || gSaveFileStatus == 2) + ClearSav2(); + SetPokemonCryStereo(gSaveBlock2.optionsSound); + } +} + +void CB2_InitCopyrightScreenAfterTitleScreen(void) +{ + SetUpCopyrightScreen(); +} + +void Task_IntroLoadPart1Graphics(u8 taskId) +{ + SetVBlankCallback(NULL); + gUnknown_02039318 = Random() & 1; + intro_reset_and_hide_bgs(); + REG_BG3VOFS = 0; + REG_BG2VOFS = 0x50; + REG_BG1VOFS = 0x18; + REG_BG0VOFS = 0x28; + LZ77UnCompVram(gIntro1BGLeavesGfx, (void *)VRAM); + LZ77UnCompVram(gIntro1BG0_Tilemap, (void *)(VRAM + 0x8000)); + DmaClear16(3, VRAM + 0x8800, 0x800); + LZ77UnCompVram(gIntro1BG1_Tilemap, (void *)(VRAM + 0x9000)); + DmaClear16(3, VRAM + 0x9800, 0x800); + LZ77UnCompVram(gIntro1BG2_Tilemap, (void *)(VRAM + 0xA000)); + DmaClear16(3, VRAM + 0xA800, 0x800); + LZ77UnCompVram(gIntro1BG3_Tilemap, (void *)(VRAM + 0xB000)); + DmaClear16(3, VRAM + 0xB800, 0x800); + LoadPalette(gIntro1BGPals, 0, sizeof(gIntro1BGPals)); + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512; + LoadCompressedObjectPic(&gUnknown_0840B008[0]); + LoadCompressedObjectPic(&gUnknown_0840B018[0]); + LoadSpritePalettes(gUnknown_0840B028); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1D2, 0x1C); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1C3, 0x1A); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1B4, 0x18); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1A5, 0x16); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x196, 0x14); + gTasks[taskId].data[0] = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE); + gTasks[taskId].func = Task_IntroFadeIn; +} + +static void Task_IntroFadeIn(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + SetVBlankCallback(VBlankCB_Intro); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gTasks[taskId].func = Task_IntroWaterDrops; + gIntroFrameCounter = 0; + m4aSongNumStart(0x19E); + ResetSerial(); +} + +static void Task_IntroWaterDrops(u8 taskId) +{ + //start moving rock + if (gIntroFrameCounter == 76) + gSprites[gTasks[taskId].data[0]].data[0] = 1; + + //drop rock + if (gIntroFrameCounter == 251) + gSprites[gTasks[taskId].data[0]].data[0] = 2; + + if (gIntroFrameCounter == 368) + CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE); + if (gIntroFrameCounter == 384) + CreateWaterDrop(200, 60, 0x400, 9, 0x80, TRUE); + + if (gIntroFrameCounter == 560) + CreateGameFreakLogo(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, CreateTask(sub_813CCE8, 0)); + + if (gIntroFrameCounter > 739) + { + gTasks[taskId].data[1] = 0x50; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0x18; + gTasks[taskId].data[4] = 0; + gTasks[taskId].data[5] = 0x28; + gTasks[taskId].data[6] = 0; + gTasks[taskId].func = Task_IntroScrollDownAndShowEon; + } +} + +static void Task_IntroScrollDownAndShowEon(u8 taskId) +{ + if (gIntroFrameCounter < 904) + { + s32 r2; + + //slide backgrounds downward + r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2] - 0xC000; + gTasks[taskId].data[1] = r2 >> 16; + gTasks[taskId].data[2] = r2; + REG_BG2VOFS = gTasks[taskId].data[1]; + r2 = (gTasks[taskId].data[3] << 16) + (u16)gTasks[taskId].data[4] - 0x10000; + gTasks[taskId].data[3] = r2 >> 16; + gTasks[taskId].data[4] = r2; + REG_BG1VOFS = gTasks[taskId].data[3]; + r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - 0x18000; + gTasks[taskId].data[5] = r2 >> 16; + gTasks[taskId].data[6] = r2; + REG_BG0VOFS = gTasks[taskId].data[5]; + + //show Lati@s sprite + if (gIntroFrameCounter == 880) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_840AFF0, 200, 160, 10); + + gSprites[spriteId].invisible = 1; + } + } + else + { + //fade to white + if (gIntroFrameCounter > 1007) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0xFFFF); + gTasks[taskId].func = Task_IntroWaitToSetupPart2; + } + } +} + +static void Task_IntroWaitToSetupPart2(u8 taskId) +{ + if (gIntroFrameCounter > 1026) + gTasks[taskId].func = Task_IntroLoadPart2Graphics; +} + +static void Task_IntroLoadPart2Graphics(u8 taskId) +{ + intro_reset_and_hide_bgs(); + SetVBlankCallback(NULL); + ResetSpriteData(); + FreeAllSpritePalettes(); + gUnknown_02039358 = 0; + gUnknown_0203935A = 0; +#ifdef SAPPHIRE + load_intro_part2_graphics(0); +#else + load_intro_part2_graphics(1); +#endif + gTasks[taskId].func = Task_IntroStartBikeRide; +} + +static void Task_IntroStartBikeRide(u8 taskId) +{ + u8 spriteId; + + if (gUnknown_02039318 == 0) + LoadCompressedObjectPic(gIntro2BrendanSpriteSheet); + else + LoadCompressedObjectPic(gIntro2MaySpriteSheet); + LoadCompressedObjectPic(gIntro2BicycleSpriteSheet); +#ifdef SAPPHIRE + LoadCompressedObjectPic(gIntro2LatiasSpriteSheet); +#else + LoadCompressedObjectPic(gIntro2LatiosSpriteSheet); +#endif + LoadSpritePalettes(gIntro2SpritePalettes); + if (gUnknown_02039318 == 0) + spriteId = intro_create_brendan_sprite(0x110, 100); + else + spriteId = intro_create_may_sprite(0x110, 100); + gSprites[spriteId].callback = sub_813D788; + gSprites[spriteId].anims = gUnknown_0840AE80; + gTasks[taskId].data[1] = spriteId; +#ifdef SAPPHIRE + spriteId = intro_create_latias_sprite(-0x40, 0x3C); +#else + spriteId = intro_create_latios_sprite(-0x40, 0x3C); +#endif + gSprites[spriteId].callback = sub_813D880; + gTasks[taskId].data[2] = spriteId; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0xFFFF); + SetVBlankCallback(VBlankCB_Intro); +#ifdef SAPPHIRE + gTasks[taskId].data[0] = sub_8148EC0(0, 0x4000, 0x40, 0x10); + sub_8148C78(0); +#else + gTasks[taskId].data[0] = sub_8148EC0(1, 0x4000, 0x400, 0x10); + sub_8148C78(1); +#endif + gTasks[taskId].func = Task_IntroHandleBikeAndEonMovement; +} + +static void Task_IntroHandleBikeAndEonMovement(u8 taskId) +{ + s16 a; + u16 sine; + + if (gIntroFrameCounter > 1823) + { + BeginNormalPaletteFade(0xFFFFFFFF, 16, 0, 16, 0xFFFF); + gTasks[taskId].func = Task_IntroWaitToSetupPart3; + } + if (gIntroFrameCounter == 1109) + gSprites[gTasks[taskId].data[1]].data[0] = 1; + if (gIntroFrameCounter == 1214) + gSprites[gTasks[taskId].data[1]].data[0] = 0; + if (gIntroFrameCounter == 1394) + gSprites[gTasks[taskId].data[2]].data[0] = 1; + if (gIntroFrameCounter == 1398) + gSprites[gTasks[taskId].data[1]].data[0] = 2; + if (gIntroFrameCounter == 1586) + gSprites[gTasks[taskId].data[1]].data[0] = 3; + if (gIntroFrameCounter == 1727) + gSprites[gTasks[taskId].data[1]].data[0] = 4; + + //TODO: Clean this up + a = (((u16)gTasks[taskId].data[3] << 16) >> 18) & 0x7F; + sine = Sin(a, 48); + gUnknown_0203935A = sine; + if (gTasks[taskId].data[3] < 512) + gTasks[taskId].data[3]++; +#ifdef SAPPHIRE + sub_8149020(0); +#else + sub_8149020(1); +#endif +} + +static void Task_IntroWaitToSetupPart3(u8 taskId) +{ + if (gIntroFrameCounter > 2068) + { + DestroyTask(gTasks[taskId].data[0]); + gTasks[taskId].func = Task_IntroLoadPart3Graphics; + } +} + +static void Task_IntroLoadPart3Graphics(u8 taskId) +{ + intro_reset_and_hide_bgs(); + LZ77UnCompVram(gIntro3Pokeball_Gfx, (void *)VRAM); + LZ77UnCompVram(gIntro3Pokeball_Tilemap, (void *)(VRAM + 0x4000)); + LoadPalette(gIntro3PokeballPal, 0, 0x200); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + sub_813CE30(0x78, 0x50, 0, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_256COLOR | BGCNT_AFF256x256; + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + gTasks[taskId].func = Task_IntroSpinAndZoomPokeball; + gIntroFrameCounter = 0; + m4aSongNumStart(0x1BA); +} + +static void Task_IntroSpinAndZoomPokeball(u8 taskId) +{ + gTasks[taskId].data[0] += 0x400; + if (gTasks[taskId].data[1] <= 0x6BF) + { + gTasks[taskId].data[1] += gTasks[taskId].data[2]; + gTasks[taskId].data[2]++; + } + else + { + gTasks[taskId].func = Task_IntroWaitToSetupPart3DoubleFight; + } + sub_813CE30(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]); + if (gIntroFrameCounter == 44) + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); +} + +static void Task_IntroWaitToSetupPart3DoubleFight(u8 taskId) +{ + if (gIntroFrameCounter > 59) + gTasks[taskId].func = Task_IntroLoadPart3Streaks; +} + +//extern u8 gSharedMem[][32]; + +static void Task_IntroLoadPart3Streaks(u8 taskId) +{ + u16 i; + + intro_reset_and_hide_bgs(); + for (i = 0; i < 32; i++) + { + ewram0arr[0][i] = 0; + ewram0arr[1][i] = 17; + ewram0arr[2][i] = 34; + } + DmaCopy16Defvars(3, gSharedMem, (void *)(VRAM + 0x0), 0x60); + for (i = 0; i < 0x280; i++) + ((u16 *)(VRAM + 0x3000))[i] = 0xF001; + for (i = 0; i < 0x80; i++) + ((u16 *)(VRAM + 0x3800))[i] = 0xF002; + for (i = 0; i < 0x180; i++) + ((u16 *)(VRAM + 0x3900))[i] = 0xF000; + for (i = 0; i < 0x80; i++) + ((u16 *)(VRAM + 0x3C00))[i] = 0xF002; + gPlttBufferUnfaded[0xF0] = RGB_WHITE; + gPlttBufferFaded[0xF0] = RGB_WHITE; + sub_813D084(1); + gPlttBufferUnfaded[0xF2] = RGB_BLACK; + gPlttBufferFaded[0xF2] = RGB_BLACK; + LZ77UnCompVram(gIntro3Streaks_Gfx, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(gIntro3Streaks_Tilemap, (void *)(VRAM + 0x7000)); + LoadPalette(gIntro3Streaks_Pal, 0, 0x20); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LoadCompressedObjectPic(&gIntro3PokeballGfx_Table[0]); + LoadCompressedObjectPic(&gIntro3MiscGfx_Table[0]); + LoadCompressedObjectPalette(&gInterfacePokeballPal_Table[0]); + LoadSpritePalettes(gIntro3MiscPal_Table); + gTasks[taskId].func = task_intro_14; +} + +static void task_intro_14(u8 taskId) +{ + REG_WIN0H = 0xF0; + REG_WIN0V = 0xA0; + REG_WININ = 0x1C; + REG_WINOUT = 0x1D; + REG_BG3CNT = BGCNT_PRIORITY(3) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(6) + | BGCNT_16COLOR + | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) + | BGCNT_CHARBASE(0) + | BGCNT_SCREENBASE(7) + | BGCNT_16COLOR + | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; + gTasks[taskId].data[15] = CreateTask(task_intro_20, 0); + gTasks[gTasks[taskId].data[15]].data[0] = 0; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = task_intro_15; +} + +static void task_intro_15(u8 taskId) +{ + u16 foo = gTasks[taskId].data[0]; + + if (gTasks[taskId].data[0] != 32) + { + u32 bar; //needed to match for some reason + + gTasks[taskId].data[0] += 4; + REG_WIN0V = (gTasks[taskId].data[0] * 256) - (bar = foo - 0x9C); + } + else + { + REG_WIN0V = 0x2080; + gTasks[taskId].func = task_intro_16; + } +} + +static void task_intro_16(u8 taskId) +{ + gTasks[taskId].func = task_intro_17; +} + +static void task_intro_17(u8 taskId) +{ + gUnknown_0203931A = 0; + gTasks[taskId].func = Task_IntroPokemonBattle; +} + +static void Task_IntroPokemonBattle(u8 taskId) +{ + u8 spriteId; + + if (gIntroFrameCounter == 80) + { + spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xF0, 0xA0, 5, 1); + gSprites[spriteId].callback = sub_813DB9C; + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].data[2] = 0; + } + if (gIntroFrameCounter == 152) + { + spriteId = sub_813CE88(SPECIES_DUSKULL, 0, 0xA0, 4, 1); + gSprites[spriteId].callback = sub_813DB9C; + gSprites[spriteId].data[1] = 2; + gSprites[spriteId].data[2] = 1; + } + if (gIntroFrameCounter == 219) + { + sub_813D084(0); + spriteId = sub_813CFA8(gUnknown_02039318, 0x110, 0x60, 6); + gSprites[spriteId].callback = sub_813DE70; + gTasks[taskId].data[1] = spriteId; + } + if (gIntroFrameCounter == 304) + { + gTasks[gTasks[taskId].data[15]].data[0] = 4; + gSprites[gTasks[taskId].data[1]].data[0] = 2; + } + if (gIntroFrameCounter == 384) + { + gTasks[gTasks[taskId].data[15]].data[0] = 0; + gSprites[gTasks[taskId].data[1]].data[0] = 4; + } + if (gIntroFrameCounter == 400) + { + BeginNormalPaletteFade(0xFF0000, 0, 0x10, 0, 0x7EFF); + } + if (gIntroFrameCounter == 432) + { + gSprites[gTasks[taskId].data[1]].data[0] = 5; + } + if (gIntroFrameCounter == 462) + { + gSprites[gTasks[taskId].data[1]].data[0] = 6; + gTasks[gTasks[taskId].data[15]].data[0] = 2; + } + if (gIntroFrameCounter == 463) + { + sub_813D084(1); + spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xD0, 8, 5, 1); + gSprites[spriteId].callback = sub_813E10C; + gTasks[taskId].data[2] = spriteId; + sub_813E7C0(spriteId); + } + if (gIntroFrameCounter == 539) + { + spriteId = sub_813CE88(SPECIES_DUSKULL, 0xF8, 0x10, 4, 1); + gSprites[spriteId].callback = sub_813E10C; + gTasks[taskId].data[3] = spriteId; + sub_813E930(spriteId); + } + if (gIntroFrameCounter == 623) + { + gSprites[gTasks[taskId].data[2]].data[0] = 2; + gSprites[gTasks[taskId].data[3]].data[0] = 2; + gTasks[gTasks[taskId].data[15]].data[0] = 3; + } + if (gIntroFrameCounter == 624) + { + sub_813D084(0); + spriteId = sub_813CE88(SPECIES_MUDKIP, 0x20, 0x98, 0, 0); + gSprites[spriteId].callback = sub_813E210; + gTasks[taskId].data[4] = spriteId; + InitIntroMudkipAttackAnim(spriteId); + } + if (gIntroFrameCounter == 700) + { + spriteId = sub_813CE88(SPECIES_TORCHIC, -8, 0x90, 1, 0); + gSprites[spriteId].callback = sub_813E210; + gTasks[taskId].data[5] = spriteId; + InitIntroTorchicAttackAnim(spriteId); + } + if (gIntroFrameCounter == 776) + { + gUnknown_0203931A = 1; + gSprites[gTasks[taskId].data[4]].data[0] = 2; + gSprites[gTasks[taskId].data[5]].data[0] = 2; + gTasks[gTasks[taskId].data[15]].data[0] = 0; + } + if (gIntroFrameCounter == 781) + { + sub_813D084(2); + gSprites[gTasks[taskId].data[2]].data[0] = 3; + gSprites[gTasks[taskId].data[3]].data[0] = 3; + gSprites[gTasks[taskId].data[4]].data[0] = 3; + gSprites[gTasks[taskId].data[5]].data[0] = 3; + spriteId = CreateSprite(&gSpriteTemplate_840B1F4, 0x78, 0x50, 15); + gSprites[spriteId].invisible = 1; + } + if (gIntroFrameCounter == 800) + PlaySE(SE_OP_BASYU); + if (gIntroFrameCounter == 850) + BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0xFFFF); + if (gIntroFrameCounter == 946) + gTasks[taskId].func = task_intro_19; +} + +static void task_intro_19(u8 taskId) +{ + DestroyTask(taskId); + SetMainCallback2(MainCB2_EndIntro); +} + +static void task_intro_20(u8 taskId) +{ +#define BG2_FLAGS (BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256) +#define DISPCNT_FLAGS (DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON) + + gTasks[taskId].data[15]++; + switch (gTasks[taskId].data[0]) + { + case 0: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; + REG_BG2CNT = 0; + gTasks[taskId].data[0] = 0xFF; + break; + case 2: + BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF); + REG_BG2CNT = BG2_FLAGS; + REG_DISPCNT = DISPCNT_FLAGS; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[0] = 20; + //fall through + case 20: + REG_BG2VOFS = gTasks[taskId].data[1]; + REG_BG2HOFS = gTasks[taskId].data[2]; + gTasks[taskId].data[1] += 6; + gTasks[taskId].data[2] -= 8; + break; + case 3: + BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF); + REG_BG2CNT = BG2_FLAGS; + REG_DISPCNT = DISPCNT_FLAGS; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[0] = 0x1E; + //fall through + case 0x1E: + REG_BG2VOFS = gTasks[taskId].data[1]; + REG_BG2HOFS = gTasks[taskId].data[2]; + gTasks[taskId].data[1] -= 6; + gTasks[taskId].data[2] += 8; + break; + case 4: + BeginNormalPaletteFade(1, 5, 0, 0x10, 0x37F7); + REG_BG2CNT = BG2_FLAGS; + REG_DISPCNT = DISPCNT_FLAGS; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 8; + gTasks[taskId].data[0] = 0x28; + //fall through + case 0x28: + REG_BG2VOFS = gTasks[taskId].data[1]; + REG_BG2HOFS = gTasks[taskId].data[2]; + gTasks[taskId].data[1] -= gTasks[taskId].data[3]; + gTasks[taskId].data[2] += gTasks[taskId].data[3]; + if (!(gTasks[taskId].data[15] & 7) && gTasks[taskId].data[3] != 0) + gTasks[taskId].data[3]--; + break; + case 0xFF: //needed to prevent jump table optimization + break; + } + +#undef BG2_FLAGS +#undef DISPCNT_FLAGS +} + +static void intro_reset_and_hide_bgs(void) +{ + REG_DISPCNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; +} + +static void sub_813CCE8(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + default: + case 0: + REG_BLDCNT = 0x3F50; + REG_BLDALPHA = 0x1000; + REG_BLDY = 0; + gTasks[taskId].data[1] = 0x40; + gTasks[taskId].data[0] = 1; + break; + case 1: + if (gTasks[taskId].data[1] != 0) + { + u8 foo; + + gTasks[taskId].data[1]--; + foo = gTasks[taskId].data[1] / 2; + REG_BLDALPHA = gUnknown_08393E64[foo]; + } + else + { + REG_BLDALPHA = gUnknown_08393E64[0]; + gTasks[taskId].data[1] = 0x80; + gTasks[taskId].data[0]++; + } + break; + case 2: + if (gTasks[taskId].data[1] != 0) + { + //tail merge at _0813CE0E + gTasks[taskId].data[1]--; + } + else + { + gTasks[taskId].data[1] = 0; //redundant? + gTasks[taskId].data[0]++; + } + break; + case 3: + if (gTasks[taskId].data[1] <= 0x3D) + { + u8 foo; + + gTasks[taskId].data[1]++; + foo = gTasks[taskId].data[1] / 2; + REG_BLDALPHA = gUnknown_08393E64[foo]; + } + else + { + //_0813CDE0 + REG_BLDALPHA = gUnknown_08393E64[0x1F]; + gTasks[taskId].data[1] = 0x10; + gTasks[taskId].data[0]++; + } + break; + case 4: + if (gTasks[taskId].data[1] != 0) + { + gTasks[taskId].data[1]--; + } + else + { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + DestroyTask(taskId); + } + break; + } +} + +void sub_813CE30(u16 scrX, u16 scrY, u16 zoom, u16 alpha) +{ + struct BgAffineSrcData src; + struct BgAffineDstData dest; + + src.texX = 0x8000; + src.texY = 0x8000; + src.scrX = scrX; + src.scrY = scrY; + src.sx = zoom; + src.sy = zoom; + src.alpha = alpha; + BgAffineSet(&src, &dest, 1); + REG_BG2PA = dest.pa; + REG_BG2PB = dest.pb; + REG_BG2PC = dest.pc; + REG_BG2PD = dest.pd; + REG_BG2X = dest.dx; + REG_BG2Y = dest.dy; +} + +static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front) +{ + const u8 *lzPaletteData; + u8 spriteId; + + if (front) + LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1); + else + LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF); + LoadCompressedPalette(lzPaletteData, 0x100 + d * 0x10, 0x20); + sub_8143648(d, d); + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, (d + 1) * 4); + gSprites[spriteId].oam.paletteNum = d; + gSprites[spriteId].oam.priority = 1; + return spriteId; +} + +static u8 sub_813CFA8(u16 a, u16 b, u16 c, u16 d) +{ + u8 spriteId; + + DecompressPicFromTable_2(&gTrainerBackPicTable[a], gTrainerBackPicCoords[a].coords, gTrainerBackPicCoords[a].y_offset, (void *)0x2000000, gUnknown_0840B5A0[d], a); + LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + d * 0x10, 0x20); + sub_8143680(d, d); + gUnknown_02024E8C.anims = gUnknown_0840B064; + spriteId = CreateSprite(&gUnknown_02024E8C, b, c, 1); + gSprites[spriteId].oam.paletteNum = d; + gSprites[spriteId].oam.priority = 1; + return spriteId; +} + +static void sub_813D084(u8 a) +{ + u16 color; + + switch (a) + { + default: + case 0: + color = RGB(22, 31, 15); + break; + case 1: + color = RGB(31, 14, 12); + break; + case 2: + color = RGB(12, 12, 20); + break; + } + gPlttBufferUnfaded[241] = color; + gPlttBufferFaded[241] = color; +} + +static void sub_813D0CC(struct Sprite *sprite) +{ + u8 r0; + + if (sprite->data[2] >= 192) + { + if (sprite->data[3] != 0) + { + sprite->data[3]--; + } + else + { + sprite->invisible = FALSE; + SetOamMatrix(sprite->data[1], sprite->data[2], 0, 0, sprite->data[2]); + sprite->data[2] = (sprite->data[2] * 95) / 100; + r0 = (sprite->data[2] - 192) / 128 + 9; + if (r0 > 15) + r0 = 15; + sprite->oam.paletteNum = r0; + } + } + else + { + DestroySprite(sprite); + } +} + +static void sub_813D158(struct Sprite *sprite) +{ + if (gSprites[sprite->data[7]].data[7] != 0) + { + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data[2] = 1024; + sprite->data[3] = 8 * (sprite->data[1] & 3); + sprite->callback = sub_813D0CC; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } + else + { + sprite->pos2.x = gSprites[sprite->data[7]].pos2.x; + sprite->pos2.y = gSprites[sprite->data[7]].pos2.y; + sprite->pos1.x = gSprites[sprite->data[7]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[7]].pos1.y; + } +} + +static void sub_813D208(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + sprite->callback = sub_813D220; +} + +static void sub_813D220(struct Sprite *sprite) +{ + if (sprite->pos1.x <= 116) + { + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos1.x += 4; + sprite->pos2.x = -4; + sprite->data[4] = 128; + sprite->callback = sub_813D368; + } + else + { + u16 data2; + u16 data3; + u16 data4; + s16 sin1; + s16 sin2; + s16 sin3; + s16 sin4; + s16 var1; + s16 var2; + s16 var3; + s16 var4; + s16 temp; + + data4 = sprite->data[4]; + sin1 = gSineTable[(u8)data4]; + sin2 = gSineTable[(u8)(data4 + 64)]; + sprite->data[4] += 2; + sprite->pos2.y = sin1 / 32; + sprite->pos1.x--; + if (sprite->pos1.x & 1) + sprite->pos1.y++; + temp = -sin2 / 16; + data2 = sprite->data[2]; + data3 = sprite->data[3]; + sin3 = gSineTable[(u8)(temp - 16)]; + sin4 = gSineTable[(u8)(temp + 48)]; + var1 = sin4 * data2 / 256; + var2 = -sin3 * data3 / 256; + var3 = sin3 * data2 / 256; + var4 = sin4 * data3 / 256; + SetOamMatrix(sprite->data[1], data2, 0, 0, data3); + SetOamMatrix(sprite->data[1] + 1, var1, var3, var2, var4); + SetOamMatrix(sprite->data[1] + 2, var1, var3, var2 * 2, var4 * 2); + } +} + +static void sub_813D368(struct Sprite *sprite) +{ + SetOamMatrix(sprite->data[1], sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); + SetOamMatrix(sprite->data[1] + 1, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); + SetOamMatrix(sprite->data[1] + 2, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); + if (sprite->data[4] != 64) + { + u16 data4; + + sprite->data[4] -= 8; + data4 = sprite->data[4]; + sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64; + sprite->pos2.y = gSineTable[(u8)data4] / 64; + } + else + { + sprite->data[4] = 0; + sprite->callback = sub_813D414; + } +} + +static void sub_813D414(struct Sprite *sprite) +{ + if (sprite->data[0] != 2) + { + s16 r2; + + sprite->data[4] += 8; + r2 = gSineTable[(u8)sprite->data[4]] / 16 + 64; + sprite->pos2.x = gSineTable[(u8)(r2 + 64)] / 64; + sprite->pos2.y = gSineTable[(u8)r2] / 64; + } + else + { + sprite->callback = SpriteCB_WaterDropFall; + } +} + +static void SpriteCB_WaterDropFall(struct Sprite *sprite) +{ + if (sprite->pos1.y < sprite->data[5]) + { + sprite->pos1.y += 4; + } + else + { + sprite->data[7] = 1; + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data[2] = 1024; + sprite->data[3] = 8 * (sprite->data[1] & 3); + sprite->callback = sub_813D0CC; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } +} + +//Duplicate function +static void SpriteCB_WaterDropFall_2(struct Sprite *sprite) +{ + if (sprite->pos1.y < sprite->data[5]) + { + sprite->pos1.y += 4; + } + else + { + sprite->data[7] = 1; + sprite->invisible = TRUE; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + StartSpriteAnim(sprite, 3); + sprite->data[2] = 1024; + sprite->data[3] = 8 * (sprite->data[1] & 3); + sprite->callback = sub_813D0CC; + sprite->oam.shape = 1; + sprite->oam.size = 3; + CalcCenterToCornerVec(sprite, 1, 3, 2); + } +} + +static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately) +{ + u8 spriteId; + u8 oldSpriteId; + + spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[7] = 0; + gSprites[spriteId].data[1] = d; + gSprites[spriteId].data[2] = c; + gSprites[spriteId].data[3] = c; + gSprites[spriteId].data[5] = e; + gSprites[spriteId].data[6] = c; + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + StartSpriteAnim(&gSprites[spriteId], 2); + if (!fallImmediately) + gSprites[spriteId].callback = sub_813D208; + else + gSprites[spriteId].callback = SpriteCB_WaterDropFall_2; + oldSpriteId = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); + gSprites[spriteId].data[7] = oldSpriteId; + gSprites[spriteId].data[1] = d + 1; + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d + 1; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + gSprites[spriteId].callback = sub_813D158; + + spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); + gSprites[spriteId].data[7] = oldSpriteId; + gSprites[spriteId].data[1] = d + 2; + StartSpriteAnim(&gSprites[spriteId], 1); + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = d + 2; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); + gSprites[spriteId].callback = sub_813D158; + + SetOamMatrix(d, c + 32, 0, 0, c + 32); + SetOamMatrix(d + 1, c + 32, 0, 0, c + 32); + SetOamMatrix(d + 2, c + 32, 0, 0, 2 * (c + 32)); + + return oldSpriteId; +} + +static void sub_813D788(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + StartSpriteAnimIfDifferent(sprite, 0); + sprite->pos1.x--; + break; + case 1: + StartSpriteAnimIfDifferent(sprite, 0); + if (gIntroFrameCounter & 7) + return; + sprite->pos1.x++; + break; + case 2: + StartSpriteAnimIfDifferent(sprite, 2); + if (sprite->pos1.x <= 120 || (gIntroFrameCounter & 7)) + sprite->pos1.x++; + break; + case 3: + StartSpriteAnimIfDifferent(sprite, 3); + break; + case 4: + StartSpriteAnimIfDifferent(sprite, 0); + if (sprite->pos1.x > -32) + sprite->pos1.x -= 2; + break; + } + if (gIntroFrameCounter & 7) + return; + if (sprite->pos2.y != 0) + { + sprite->pos2.y = 0; + } + else + { + switch (Random() & 3) + { + case 0: + sprite->pos2.y = -1; + break; + case 1: + sprite->pos2.y = 1; + break; + case 2: + case 3: + sprite->pos2.y = 0; + break; + } + } +} + +static void sub_813D880(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + break; + case 1: + if (sprite->pos2.x + sprite->pos1.x < 304) + sprite->pos2.x += 8; + else + sprite->data[0] = 2; + break; + case 2: + if (sprite->pos2.x + sprite->pos1.x > 120) + sprite->pos2.x -= 1; + else + sprite->data[0] = 3; + break; + case 3: + if (sprite->pos2.x > 0) + sprite->pos2.x -= 2; + break; + } + sprite->pos2.y = Sin((u8)sprite->data[1], 8) - gUnknown_0203935A; + sprite->data[1] += 4; +} + +static void sub_813D908(struct Sprite *sprite) +{ + if (gTasks[sprite->data[0]].data[0] == 0) + { + sprite->invisible = TRUE; + } + else if (gTasks[sprite->data[0]].data[0] != 4) + { + sprite->invisible = FALSE; + } + else + { + DestroySprite(sprite); + } +} + +static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c) +{ + u8 spriteId; + u16 i; + + for (i = 0; i < 9; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840AF94, gUnknown_0840AF50[i][1] + a, b - 4, 0); + gSprites[spriteId].data[0] = c; + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF50[i][0]); + } + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840AFAC, gUnknown_0840AF74[i][1] + a, b + 12, 0); + gSprites[spriteId].data[0] = c; + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF74[i][0]); + } + spriteId = CreateSprite(&gSpriteTemplate_840AFC4, 120, b - 4, 0); + gSprites[spriteId].data[0] = c; + + return spriteId; +} + +static void sub_813DA64(struct Sprite *sprite) +{ + sprite->data[7]++; + + switch (sprite->data[0]) + { + case 0: + default: + sprite->oam.affineMode = 3; + sprite->oam.matrixNum = 1; + CalcCenterToCornerVec(sprite, 1, 3, 3); + sprite->invisible = FALSE; + sprite->data[0] = 1; + sprite->data[1] = 128; + sprite->data[2] = -24; + sprite->data[3] = 0; + break; + case 1: + { + s16 sin; + s16 cos; + s16 a; + s16 b; + s16 c; + s16 d; + + if (sprite->data[3] < 0x50) + { + sprite->pos2.y = -Sin((u8)sprite->data[3], 0x78); + sprite->pos2.x = -Sin((u8)sprite->data[3], 0x8C); + if (sprite->data[3] > 64) + sprite->oam.priority = 3; + } + sin = gSineTable[(u8)sprite->data[2]]; + cos = gSineTable[(u8)(sprite->data[2] + 64)]; + d = cos * sprite->data[1] / 256; + c = -sin * sprite->data[1] / 256; + b = sin * sprite->data[1] / 256; + a = cos * sprite->data[1] / 256; + + SetOamMatrix(1, a, b, c, d); + + if (sprite->data[1] < 0x100) + sprite->data[1] += 8; + else + sprite->data[1] += 32; + if (sprite->data[2] < 0x18) + sprite->data[2] += 1; + if (sprite->data[3] < 64) + sprite->data[3] += 2; + else if (!(sprite->data[7] & 3)) + sprite->data[3] += 1; + break; + } + } +} + +static void sub_813DB9C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + default: + if (sprite->data[2] != 0) + sprite->hFlip = TRUE; + else + sprite->hFlip = FALSE; + sprite->data[0] = 1; + //fall through + case 1: + if (sprite->pos1.y > 96) + { + sprite->pos1.y -= 4; + if (sprite->data[2] != 0) + sprite->pos1.x += 2; + else + sprite->pos1.x -= 2; + } + else + { + sprite->data[0]++; + sprite->data[3] = 8; + } + break; + case 2: + if (sprite->data[3] != 0) + { + sprite->data[3]--; + } + else + { + sprite->data[0]++; + sprite->data[3] = 0; //redundant? + } + break; + case 3: + sprite->oam.affineMode = 3; + sprite->oam.matrixNum = sprite->data[1]; + CalcCenterToCornerVec(sprite, 0, 3, 3); + if (sprite->data[2] != 0) + SetOamMatrix(sprite->data[1], -256, 0, 0, 256); + else + SetOamMatrix(sprite->data[1], 256, 0, 0, 256); + sprite->data[0]++; + sprite->data[4] = 0; + break; + case 4: + sprite->data[4]++; + if (sprite->pos1.y + sprite->pos2.y > -32 + && sprite->pos1.x + sprite->pos2.x > -64) + { + u16 r2; + + sprite->pos2.y = -(sprite->data[4] * sprite->data[4]) / 8; + if (sprite->data[2] != 0) + sprite->pos2.x += sprite->data[4]; + else + sprite->pos2.x -= sprite->data[4]; + if (sprite->data[3] < 128) + sprite->data[3] += 8; + r2 = 256 - sprite->data[3]; + if (sprite->data[2] != 0) + SetOamMatrix(sprite->data[1], -r2, 0, 0, r2); + else + SetOamMatrix(sprite->data[1], r2, 0, 0, r2); + } + else + { + DestroySprite(sprite); + } + } +} + +static void sub_813DD58(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + default: + sprite->invisible = FALSE; + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = sprite->data[1]; + sprite->data[3] = 2048; + sprite->data[0] = 1; + //fall through + case 1: + if (sprite->data[3] > 256) + { + sprite->data[3] -= 128; + if (sprite->data[2] != 0) + SetOamMatrix(sprite->data[1], -sprite->data[3], 0, 0, sprite->data[3]); + else + SetOamMatrix(sprite->data[1], sprite->data[3], 0, 0, sprite->data[3]); + } + else + { + if (sprite->data[2] != 0) + SetOamMatrix(sprite->data[1], -256, 0, 0, 256); + else + SetOamMatrix(sprite->data[1], 256, 0, 0, 256); + sprite->data[0]++; + } + break; + case 2: + break; + case 3: + sprite->data[4]++; + sprite->pos2.y = sprite->data[4] * sprite->data[4] / 32; + if (sprite->data[2] != 0) + sprite->pos2.x = sprite->data[4] / 4; + else + sprite->pos2.x = -(sprite->data[4] / 4); + break; + } +} + +static void sub_813DE70(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + default: + if (sprite->pos1.x > 40) + { + sprite->pos1.x -= 4; + } + else + { + StartSpriteAnim(sprite, 1); + sprite->data[6] = CreateSprite(&gSpriteTemplate_840B084, 16, 104, 100); + sprite->data[7] = CreateSprite(&gSpriteTemplate_840B084, 12, 106, 101); + sprite->data[0] = 1; + } + break; + case 1: + break; + case 2: + StartSpriteAnim(sprite, 2); + gSprites[sprite->data[6]].data[0] = 1; + gSprites[sprite->data[7]].data[0] = 2; + sprite->data[0]++; + break; + case 3: + if (sprite->pos1.y > 160) + { + sprite->invisible = 1; + sprite->data[0] = 1; + } + else + { + sprite->pos1.y += 2; + sprite->pos1.x--; + } + break; + case 4: + { + s16 r4, r5; + + r5 = gSprites[sprite->data[6]].pos1.x + gSprites[sprite->data[6]].pos2.x; + r4 = gSprites[sprite->data[6]].pos1.y + gSprites[sprite->data[6]].pos2.y; + DestroySprite(&gSprites[sprite->data[6]]); + sprite->data[6] = sub_813CE88(SPECIES_TORCHIC, r5, r4, 2, 1); + gSprites[sprite->data[6]].callback = sub_813DD58; + gSprites[sprite->data[6]].invisible = TRUE; + gSprites[sprite->data[6]].data[1] = 1; + gSprites[sprite->data[6]].data[2] = 1; + sub_813E580(r5, r4); + + r5 = gSprites[sprite->data[7]].pos1.x + gSprites[sprite->data[7]].pos2.x; + r4 = gSprites[sprite->data[7]].pos1.y + gSprites[sprite->data[7]].pos2.y; + DestroySprite(&gSprites[sprite->data[7]]); + sprite->data[7] = sub_813CE88(SPECIES_MUDKIP, r5, r4, 3, 1); + gSprites[sprite->data[7]].callback = sub_813DD58; + gSprites[sprite->data[7]].invisible = TRUE; + gSprites[sprite->data[7]].data[1] = 2; + gSprites[sprite->data[7]].data[2] = 0; + sub_813E580(r5, r4); + + BeginNormalPaletteFade(0xFF0000, 0, 16, 16, RGB(31, 23, 31)); + sprite->data[0] = 1; + break; + } + case 5: + gSprites[sprite->data[6]].data[0] = 3; + gSprites[sprite->data[7]].data[0] = 3; + break; + case 6: + DestroySprite(&gSprites[sprite->data[6]]); + DestroySprite(&gSprites[sprite->data[7]]); + DestroySprite(sprite); + break; + } +} + +static void sub_813E10C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + default: + if (sprite->pos2.x > -56) + { + sprite->pos2.x -= 8; + sprite->pos2.y += 6; + } + else + { + sprite->data[6] = sprite->pos1.x; + sprite->data[7] = sprite->pos1.y; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data[0] = 1; + sprite->data[1] = 0; + } + break; + case 1: + if (!(sprite->data[1] & 1)) + { + if (sprite->data[1] & 2) + { + sprite->pos2.x = -1; + sprite->pos2.y = 1; + } + else + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + } + } + sprite->data[1]++; + break; + case 2: + sprite->invisible = TRUE; + sprite->pos1.x = sprite->data[6]; + sprite->pos1.y = sprite->data[7]; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + break; + case 3: + sprite->invisible = FALSE; + sprite->data[1]++; + //fall through + case 4: + if (sprite->pos2.x > -56) + { + sprite->pos2.x -= 4; + sprite->pos2.y += 3; + } + else + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data[0] = 1; + } + break; + } +} + +static void sub_813E210(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + default: + if (sprite->pos2.x < 56) + { + sprite->pos2.x += 8; + sprite->pos2.y -= 6; + } + else + { + sprite->data[6] = sprite->pos1.x; + sprite->data[7] = sprite->pos1.y; + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data[0] = 1; + sprite->data[1] = 0; + } + break; + case 1: + if (!(sprite->data[1] & 1)) + { + if (sprite->data[1] & 2) + { + sprite->pos2.x = 1; + sprite->pos2.y = -1; + } + else + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + } + } + sprite->data[1]++; + break; + case 2: + sprite->invisible = TRUE; + sprite->pos1.x = sprite->data[6]; + sprite->pos1.y = sprite->data[7]; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + break; + case 3: + sprite->invisible = FALSE; + sprite->data[1]++; + //fall through + case 4: + if (sprite->pos2.x < 56) + { + sprite->pos2.x += 4; + sprite->pos2.y -= 3; + } + else + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->data[0] = 1; + } + break; + } +} + +static void sub_813E30C(struct Sprite *sprite) +{ + u16 r4, r1; + + sprite->data[7]++; + switch (sprite->data[0]) + { + case 0: + default: + break; + case 1: + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = 1; + sprite->data[0] = 10; + sprite->data[4] = 36; + //fall through + case 10: + if (sprite->pos1.x <= 144) + { + sprite->pos1.x += 4; + sprite->pos1.y -= 1; + sprite->pos2.y = -Sin((u8)sprite->data[2], 24); + sprite->data[2] += 4; + } + sprite->data[3] -= sprite->data[4]; + if ((sprite->data[7] & 1) && sprite->data[4] != 0) + sprite->data[4]--; + r4 = gSineTable[(u8)sprite->data[3]]; + r1 = gSineTable[(u8)(sprite->data[3] + 64)]; + SetOamMatrix(1, r1, r4, -r4, r1); + break; + case 2: + sprite->oam.affineMode = 1; + sprite->oam.matrixNum = 2; + sprite->data[0] = 20; + sprite->data[4] = 36; + //fall through + case 20: + if (sprite->pos1.x <= 96) + { + sprite->pos1.x += 3; + sprite->pos1.y -= 1; + sprite->pos2.y = -Sin((u8)sprite->data[2], 24); + sprite->data[2] += 4; + } + sprite->data[3] -= sprite->data[4]; + if ((sprite->data[7] & 1) && sprite->data[4] != 0) + sprite->data[4]--; + r4 = gSineTable[(u8)sprite->data[3]]; + r1 = gSineTable[(u8)(sprite->data[3] + 64)]; + SetOamMatrix(2, r1, r4, -r4, r1); + break; + } +} + +static void sub_813E4B8(struct Sprite *sprite) +{ + u16 r4; + u16 r2; + u16 r1; + + sprite->data[7]++; + if (sprite->data[7] & 1) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + if (sprite->data[2] >= 64) + { + DestroySprite(sprite); + return; + } + sprite->data[2] += 2; + r4 = Sin((u8)sprite->data[2], 40); + sprite->pos2.x = Cos((u8)(sprite->data[0] * 32), r4); + sprite->pos2.y = Sin((u8)(sprite->data[0] * 32), r4); + if (sprite->data[0] == 0) + { + sprite->data[3] -= sprite->data[1]; + if ((sprite->data[7] & 1) && sprite->data[1] != 0) + sprite->data[1]--; + r2 = gSineTable[(u8)sprite->data[3]]; + r1 = gSineTable[(u8)(sprite->data[3] + 64)]; + SetOamMatrix(16, r1, r2, -r2, r1); + } +} + +static void sub_813E580(u16 x, u16 y) +{ + u8 i; + u8 spriteId; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B0B0, x, y, 0); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 16; + gSprites[spriteId].data[0] = i; + gSprites[spriteId].data[1] = 32; + } +} + +static void sub_813E5E0(struct Sprite *sprite) +{ + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->invisible = gSprites[sprite->data[0]].invisible; + if (sprite->data[7] < 12) + sprite->data[7]++; + sprite->data[6] += 4; + sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256; + //This useless '+ 0' is needed to make the asm match + sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256; + sprite->pos2.y = gSineTable[(u8)(sprite->data[1] + 0)] * sprite->data[7] / 256; + sprite->data[1] += 16; + if (sprite->pos1.y > sprite->data[2]) + DestroySprite(sprite); + } +} + +static void sub_813E6C0(struct Sprite *sprite) +{ + u8 spriteId; + u8 i; + s16 var1; + s16 var2; + + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->data[7]++; + sprite->invisible = TRUE; + if (gSprites[sprite->data[0]].data[0] == 1 && !(sprite->data[7] & 3)) + { + var1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x; + var2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y; + for (i = 0; i < 3; i++) + { + u8 r3 = gSprites[sprite->data[0]].subpriority - 1; + //Make redundant copies of these variables to get the asm to match + s16 _var1 = var1; + s16 _var2 = var2; + + spriteId = CreateSprite(&gSpriteTemplate_840B0DC, _var1, _var2, r3); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = sprite->data[0]; + gSprites[spriteId].data[1] = (((sprite->data[7] >> 2) & 7) << 5) + i * 85; + gSprites[spriteId].data[2] = sprite->data[3]; + gSprites[spriteId].data[3] = 104; + gSprites[spriteId].data[4] = var1; + gSprites[spriteId].data[5] = var2; + gSprites[spriteId].data[6] = 0; + } + } + } + } +} + +static void sub_813E7C0(u8 a) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_840B0F4, 0, 0, 0); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = a; + gSprites[spriteId].data[1] = -12; + gSprites[spriteId].data[2] = 0; + gSprites[spriteId].data[3] = 136; + } +} + +static void sub_813E804(struct Sprite *sprite) +{ + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->data[7]++; + if (sprite->data[3] < 40) + sprite->data[3] += 2; + //This useless '+ 0' is needed to make the asm match + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x + gSprites[sprite->data[0]].pos2.x + gSineTable[(u8)(sprite->data[1] + 64)] * sprite->data[3] / 256; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + gSprites[sprite->data[0]].pos2.y + gSineTable[(u8)(sprite->data[1] + 0)] * sprite->data[3] / 512; + sprite->data[1] += 2; + sprite->pos2.y = gSineTable[(u8)(sprite->data[2] + 0)] / 32; + sprite->data[2] += 8; + if ((sprite->data[1] & 0xFF) < 128) + sprite->subpriority = gSprites[sprite->data[0]].subpriority - 1; + else + sprite->subpriority = gSprites[sprite->data[0]].subpriority + 1; + } +} + +static void sub_813E930(u8 a) +{ + u8 i; + u8 spriteId; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B124, gSprites[a].pos1.x, gSprites[a].pos1.y, 0); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = a; + gSprites[spriteId].data[1] = i * 32; + } + } +} + +static void sub_813E980(struct Sprite *sprite) +{ + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + u8 r0; + u16 matrixNum; + + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->data[7]++; + sprite->data[6] += 8; + sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256; + sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256; + r0 = sprite->data[6] / 16; + if (r0 > 9) + r0 = 9; + matrixNum = (r0 + 18) & 31; + sprite->oam.matrixNum = matrixNum; + if (sprite->data[6] > 160) + DestroySprite(sprite); + } +} + +static void sub_813EA60(struct Sprite *sprite) +{ + bool32 r6; + s16 r1, r2; + u8 spriteId; + + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->data[7]++; + sprite->invisible = TRUE; + if (gSprites[sprite->data[0]].data[0] == 1) + { + r6 = (sprite->data[7] & 1); + if (!r6) + { + r1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x; + r2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y; + spriteId = CreateSprite(&gSpriteTemplate_840B150, r1, r2, gSprites[sprite->data[0]].subpriority + 1); + if (spriteId != 64) + { + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = 18; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3); + gSprites[spriteId].data[0] = sprite->data[0]; + gSprites[spriteId].data[3] = gUnknown_0840B168[(sprite->data[7] >> 1) & 7]; + gSprites[spriteId].data[4] = r1; + gSprites[spriteId].data[5] = r2; + gSprites[spriteId].data[6] = r6; + } + } + } + } +} + +static void InitIntroTorchicAttackAnim(u8 a) +{ + u8 spriteId; + u8 i; + + spriteId = CreateSprite(&gSpriteTemplate_840B170, 0, 0, 0); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = a; + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].data[2] = 8; + gSprites[spriteId].data[3] = 24; + } + for (i = 0; i < 10; i++) + { + SetOamMatrix(18 + i, gUnknown_0840B188[i], 0, 0, gUnknown_0840B188[i]); + } +} + +static void sub_813EBBC(struct Sprite *sprite) +{ + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->data[7] += 1; + sprite->data[6] += 8; + sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256; + sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256; + sprite->pos2.y = gSineTable[(u8)(sprite->data[1] + 0)] / 64; + sprite->data[1] += 16; + if (sprite->pos1.y < sprite->data[2]) + DestroySprite(sprite); + } +} + +static void sub_813EC90(struct Sprite *sprite) +{ + bool32 r6; + s16 r1, r2; + u8 spriteId; + u16 foo; + + if (gUnknown_0203931A != 0) + { + DestroySprite(sprite); + } + else + { + sprite->data[7]++; + sprite->invisible = TRUE; + if (gSprites[sprite->data[0]].data[0] == 1) + { + r6 = sprite->data[7] & 1; + if (!r6) + { + r1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x; + r2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y; + spriteId = CreateSprite(&gSpriteTemplate_840B1B0, r1, r2, gSprites[sprite->data[0]].subpriority + 1); + if (spriteId != 64) + { + gSprites[spriteId].oam.affineMode = 3; + gSprites[spriteId].oam.matrixNum = 17; + CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3); + gSprites[spriteId].data[0] = sprite->data[0]; + gSprites[spriteId].data[1] = ((sprite->data[7] >> 2) & 7) << 5; + gSprites[spriteId].data[2] = sprite->data[3]; + gSprites[spriteId].data[3] = 232; + gSprites[spriteId].data[4] = r1; + gSprites[spriteId].data[5] = r2; + gSprites[spriteId].data[6] = r6; + } + } + if (sprite->data[6] < 112) + sprite->data[6] += 4; + } + foo = 256 - gSineTable[(u8)sprite->data[6]] / 2; + SetOamMatrix(17, foo, 0, 0, foo); + } +} + +static void InitIntroMudkipAttackAnim(u8 a) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_840B1C8, 0, 0, 0); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = a; + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].data[2] = 12; + gSprites[spriteId].data[3] = 24; + } +} + +static void sub_813EDFC(struct Sprite *sprite) +{ + u16 foo; + + //I'm not sure why a switch statement was used here. + //if (sprite->data[0] != 1) would have been more appropriate. + switch (sprite->data[0]) + { + case 0: + default: + sprite->invisible = FALSE; + sprite->oam.affineMode = 3; + sprite->oam.matrixNum = 18; + CalcCenterToCornerVec(sprite, 0, 3, 3); + sprite->data[1] = 0; + sprite->data[0] = 1; + //fall through + case 1: + break; + } + sprite->data[7]++; + if (sprite->data[7] & 1) + { + sprite->invisible = TRUE; + } + else + { + sprite->invisible = FALSE; + if (sprite->data[1] < 64) + sprite->data[1]++; + } + foo = 256 - gSineTable[(u8)sprite->data[1]] / 2; + SetOamMatrix(18, foo, 0, 0, foo); +} diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c new file mode 100644 index 000000000..6aadafc58 --- /dev/null +++ b/src/intro_credits_graphics.c @@ -0,0 +1,645 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "intro.h" +#include "data2.h" +#include "decompress.h" +#include "hall_of_fame.h" +#include "intro_credits_graphics.h" +#include "libgncmultiboot.h" +#include "link.h" +#include "m4a.h" +#include "main.h" +#include "new_game.h" +#include "palette.h" +#include "random.h" +#include "save.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "task.h" +#include "title_screen.h" +#include "trig.h" +#include "scanline_effect.h" + +// define register constants for the inline asm +asm(".include \"constants/gba_constants.inc\"\n"); + +struct IntroCreditsSpriteMetadata +{ + u8 animNum:4; + u8 shape:2; + u8 size:2; + u8 x; + u8 y; + u8 subpriority; + u16 xOff; +}; + +const u16 gUnknown_084121FC[] = INCBIN_U16("graphics/intro/intro2_grass.gbapal"); +const u16 gUnknown_0841221C[] = INCBIN_U16("graphics/intro/intro2_grass_afternoon.gbapal"); +const u16 gUnknown_0841223C[] = INCBIN_U16("graphics/intro/intro2_grass_night.gbapal"); +const u8 gUnknown_0841225C[] = INCBIN_U8("graphics/intro/intro2_grass.4bpp.lz"); +const u8 gUnknown_084126DC[] = INCBIN_U8("graphics/intro/intro2_grass_map.bin.lz"); +const u16 gUnknown_08412818[] = INCBIN_U16("graphics/intro/8412818.gbapal"); +const u16 gUnknown_08412878[] = INCBIN_U16("graphics/intro/8412878.gbapal"); +const u8 gUnknown_084128D8[] = INCBIN_U8("graphics/intro/intro2_bgclouds.4bpp.lz"); +const u8 gUnknown_08412EB4[] = INCBIN_U8("graphics/intro/intro2_bgclouds_map.bin.lz"); +const u16 gUnknown_08413184[] = INCBIN_U16("graphics/intro/intro2_bgclouds.gbapal"); +const u16 gUnknown_084131A4[] = INCBIN_U16("graphics/intro/intro2_bgclouds_afternoon.gbapal"); +const u8 gUnknown_084131C4[] = INCBIN_U8("graphics/intro/intro2_bgclouds2.4bpp.lz"); +const u16 gUnknown_08413300[] = INCBIN_U16("graphics/intro/intro2_bgtrees2.gbapal"); +const u16 gUnknown_08413320[] = INCBIN_U16("graphics/intro/intro2_bgtrees2_afternoon.gbapal"); +const u8 gUnknown_08413340[] = INCBIN_U8("graphics/intro/intro2_bgtrees.4bpp.lz"); +const u8 gUnknown_084139C8[] = INCBIN_U8("graphics/intro/intro2_bgtrees_map.bin.lz"); +const u16 gUnknown_08413CCC[] = INCBIN_U16("graphics/intro/intro2_bgtrees.gbapal"); +const u8 gIntro2TreeTiles[] = INCBIN_U8("graphics/intro/intro2_bgtreessmall.4bpp.lz"); +const u16 gUnknown_08413E38[] = INCBIN_U16("graphics/intro/8413E38.gbapal"); +const u8 gUnknown_08413E78[] = INCBIN_U8("graphics/intro/intro2_bgnight.4bpp.lz"); // only used in credits, coupled with intro because bicycle sequence +const u16 gUnknown_08414064[] = INCBIN_U16("graphics/intro/intro2_bgnight.gbapal"); +const u8 gUnknown_08414084[] = INCBIN_U8("graphics/intro/intro2_bgnight_map.bin.lz"); +const u8 gIntro2NightTiles[] = INCBIN_U8("graphics/intro/intro2_night.4bpp.lz"); +const u16 gIntro2BrendanPalette[] = INCBIN_U16("graphics/intro/intro2_brendan.gbapal"); +const u8 gIntro2BrendanTiles[] = INCBIN_U8("graphics/intro/intro2_brendan.4bpp.lz"); +const u16 gIntro2MayPalette[] = INCBIN_U16("graphics/intro/intro2_may.gbapal"); +const u16 gUnknown_08414F90[0xF0] = {0}; +const u8 gIntro2MayTiles[] = INCBIN_U8("graphics/intro/intro2_may.4bpp.lz"); +const u8 gIntro2BicycleTiles[] = INCBIN_U8("graphics/intro/intro2_bicycle.4bpp.lz"); +const u16 gIntro2LatiosPalette[] = INCBIN_U16("graphics/intro/intro2_latios.gbapal"); +const u8 gIntro2LatiosTiles[] = INCBIN_U8("graphics/intro/intro2_latios.4bpp.lz"); +const u16 gIntro2LatiasPalette[] = INCBIN_U16("graphics/intro/intro2_latias.gbapal"); +const u8 gIntro2LatiasTiles[] = INCBIN_U8("graphics/intro/intro2_latias.4bpp.lz"); + +void sub_814910C(struct Sprite *sprite); +void nullsub_82(struct Sprite *sprite); +void sub_81492A0(struct Sprite *sprite); +void nullsub_83(struct Sprite *sprite); + +const struct SpriteTemplate gSpriteTemplate_8416B3C = { + 2000, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_814910C +}; + +const struct CompressedSpriteSheet gUnknown_08416B54[] = { + { gUnknown_084131C4, 0x400, 2000 }, + {} +}; + +const union AnimCmd gSpriteAnim_8416B64[] = { + ANIMCMD_FRAME( 0, 30), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8416B6C[] = { + ANIMCMD_FRAME(16, 30), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8416B74[] = { + ANIMCMD_FRAME(20, 30), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8416B7C[] = { + ANIMCMD_FRAME(22, 30), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8416B84[] = { + gSpriteAnim_8416B64, + gSpriteAnim_8416B6C, + gSpriteAnim_8416B74, + gSpriteAnim_8416B7C +}; + +const struct IntroCreditsSpriteMetadata gUnknown_08416B94[] = { + { 0, ST_OAM_SQUARE, 2, 72, 32, 100, 0xc00 }, + { 0, ST_OAM_SQUARE, 2, 158, 32, 100, 0xc00 }, + { 1, ST_OAM_SQUARE, 1, 192, 40, 101, 0x800 }, + { 1, ST_OAM_SQUARE, 1, 56, 40, 101, 0x800 }, + { 2, ST_OAM_H_RECTANGLE, 0, 100, 44, 102, 0x400 }, + { 2, ST_OAM_H_RECTANGLE, 0, 152, 44, 102, 0x400 }, + { 3, ST_OAM_H_RECTANGLE, 0, 8, 46, 103, 0x100 }, + { 3, ST_OAM_H_RECTANGLE, 0, 56, 46, 103, 0x100 }, + { 3, ST_OAM_H_RECTANGLE, 0, 240, 46, 103, 0x100 }, +}; + +const struct CompressedSpriteSheet gUnknown_08416BDC[] = { + { gIntro2TreeTiles, 0x400, 2000 }, + {} +}; + +const union AnimCmd gSpriteAnim_8416BEC[] = { + ANIMCMD_FRAME( 0, 30), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8416BF4[] = { + ANIMCMD_FRAME(16, 30), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8416BFC[] = { + ANIMCMD_FRAME(24, 30), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8416C04[] = { + gSpriteAnim_8416BEC, + gSpriteAnim_8416BF4, + gSpriteAnim_8416BFC +}; + +const struct IntroCreditsSpriteMetadata gUnknown_08416C10[] = { + { 0, ST_OAM_SQUARE, 2, 16, 88, 100, 0x2000 }, + { 0, ST_OAM_SQUARE, 2, 80, 88, 100, 0x2000 }, + { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x2000 }, + { 0, ST_OAM_SQUARE, 2, 208, 88, 100, 0x2000 }, + { 1, ST_OAM_V_RECTANGLE, 2, 40, 88, 101, 0x1000 }, + { 1, ST_OAM_V_RECTANGLE, 2, 104, 88, 101, 0x1000 }, + { 1, ST_OAM_V_RECTANGLE, 2, 168, 88, 101, 0x1000 }, + { 1, ST_OAM_V_RECTANGLE, 2, 232, 88, 101, 0x1000 }, + { 2, ST_OAM_V_RECTANGLE, 2, 56, 88, 102, 0x800 }, + { 2, ST_OAM_V_RECTANGLE, 2, 120, 88, 102, 0x800 }, + { 2, ST_OAM_V_RECTANGLE, 2, 184, 88, 102, 0x800 }, + { 2, ST_OAM_V_RECTANGLE, 2, 248, 88, 102, 0x800 }, +}; + +const struct CompressedSpriteSheet gUnknown_08416C70[] = { + { gIntro2NightTiles, 0x400, 2000 }, + {} +}; + +const union AnimCmd gSpriteAnim_8416C80[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8416C88[] = { + gSpriteAnim_8416C80 +}; + +const struct IntroCreditsSpriteMetadata gUnknown_08416C8C[] = { + { 0, ST_OAM_SQUARE, 2, 24, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 64, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 104, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 184, 88, 100, 0x1000 }, + { 0, ST_OAM_SQUARE, 2, 224, 88, 100, 0x1000 }, +}; + +const struct OamData gOamData_8416CBC = { + .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8416CC4[] = { + ANIMCMD_FRAME( 0, 8), + ANIMCMD_FRAME( 64, 8), + ANIMCMD_FRAME(128, 8), + ANIMCMD_FRAME(192, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gSpriteAnimTable_8416CD8[] = { + gSpriteAnim_8416CC4 +}; + +const struct SpriteTemplate gSpriteTemplate_8416CDC = { + 1002, 1002, &gOamData_8416CBC, gSpriteAnimTable_8416CD8, NULL, gDummySpriteAffineAnimTable, nullsub_82 +}; + +const struct SpriteTemplate gSpriteTemplate_8416CF4 = { + 1003, 1003, &gOamData_8416CBC, gSpriteAnimTable_8416CD8, NULL, gDummySpriteAffineAnimTable, nullsub_82 +}; + +const struct OamData gOamData_8416D0C = { + .y = 160, .shape = ST_OAM_H_RECTANGLE, .size = 3, .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8416D14[] = { + ANIMCMD_FRAME( 0, 8), + ANIMCMD_FRAME( 32, 8), + ANIMCMD_FRAME( 64, 8), + ANIMCMD_FRAME( 96, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gSpriteAnimTable_8416D28[] = { + gSpriteAnim_8416D14 +}; + +const struct SpriteTemplate gSpriteTemplate_Brendan = { + 1001, 1002, &gOamData_8416D0C, gSpriteAnimTable_8416D28, NULL, gDummySpriteAffineAnimTable, sub_81492A0 +}; + +const struct SpriteTemplate gSpriteTemplate_May = { + 1001, 1003, &gOamData_8416D0C, gSpriteAnimTable_8416D28, NULL, gDummySpriteAffineAnimTable, sub_81492A0 +}; + +const struct OamData gOamData_8416D5C = { + .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8416D64[] = { + ANIMCMD_FRAME( 0, 16), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_8416D6C[] = { + ANIMCMD_FRAME( 64, 16), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8416D74[] = { + gSpriteAnim_8416D64, + gSpriteAnim_8416D6C +}; + +const struct SpriteTemplate gSpriteTemplate_8416D7C = { + 1004, 1004, &gOamData_8416D5C, gSpriteAnimTable_8416D74, NULL, gDummySpriteAffineAnimTable, nullsub_83 +}; + +const struct SpriteTemplate gSpriteTemplate_8416D94 = { + 1005, 1005, &gOamData_8416D5C, gSpriteAnimTable_8416D74, NULL, gDummySpriteAffineAnimTable, nullsub_83 +}; + +const struct CompressedSpriteSheet gIntro2BrendanSpriteSheet[] = { + { gIntro2BrendanTiles, 0x3800, 1002 }, + {} +}; +const struct CompressedSpriteSheet gIntro2MaySpriteSheet[] = { + { gIntro2MayTiles, 0x3800, 1003 }, + {} +}; +const struct CompressedSpriteSheet gIntro2BicycleSpriteSheet[] = { + { gIntro2BicycleTiles, 0x1000, 1001 }, + {} +}; +const struct CompressedSpriteSheet gIntro2LatiosSpriteSheet[] = { + { gIntro2LatiosTiles, 0x1000, 1004 }, + {} +}; +const struct CompressedSpriteSheet gIntro2LatiasSpriteSheet[] = { + { gIntro2LatiasTiles, 0x1000, 1005 }, + {} +}; + +const struct SpritePalette gIntro2SpritePalettes[] = { + {gIntro2BrendanPalette, 1002}, + {gIntro2MayPalette, 1003}, + {gIntro2LatiosPalette, 1004}, + {gIntro2LatiasPalette, 1005}, + {} +}; + +const struct CompressedSpriteSheet gUnknown_08416E24[] = { + { gIntro2BrendanTiles, 0x2000, 1002}, + {} +}; + +const struct CompressedSpriteSheet gUnknown_08416E34[] = { + { gIntro2MayTiles, 0x2000, 1003}, + {} +}; + + +EWRAM_DATA u16 gUnknown_02039358 = 0; +EWRAM_DATA s16 gUnknown_0203935A = 0; +EWRAM_DATA s16 gUnknown_0203935C = 0; + +extern u8 gReservedSpritePaletteCount; + +void sub_8149248(); +void sub_8149264(); + +void load_intro_part2_graphics(u8 a) +{ + LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800)); + LoadPalette(&gUnknown_084121FC, 240, 32); + switch (a) + { + case 0: + default: + LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_08412818, 0, 96); + LoadCompressedObjectPic(gUnknown_08416B54); + LoadPalette(&gUnknown_08413184, 256, 32); + sub_8149248(); + break; + case 1: + LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_08413300, 0, 32); + LoadCompressedObjectPic(gUnknown_08416BDC); + LoadPalette(&gUnknown_08413CCC, 256, 32); + sub_8149264(); + break; + } + gUnknown_0203935C = 0; + gReservedSpritePaletteCount = 8; +} + +void sub_8148C78(u8 a) +{ + if (a == 1) + { + REG_BG3CNT = 0x603; + REG_BG2CNT = 0x702; + REG_BG1CNT = 0xF05; + REG_DISPCNT = 0x1E40; + } + else + { + REG_BG3CNT = 0x603; + REG_BG2CNT = 0x702; + REG_BG1CNT = 0xF05; + REG_DISPCNT = 0x1E40; + } +} + +void sub_8149280(); + +void sub_8148CB0(u8 a) +{ + LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800)); + switch (a) + { + case 0: + default: + LoadPalette(&gUnknown_084121FC, 240, 32); + LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_08412818, 0, 96); + LoadCompressedObjectPic(gUnknown_08416B54); + LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000)); + LoadPalette(&gUnknown_08413184, 256, 32); + sub_8149248(); + break; + case 1: + LoadPalette(&gUnknown_0841221C, 240, 32); + LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_08412878, 0, 96); + LoadCompressedObjectPic(gUnknown_08416B54); + LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000)); + LoadPalette(&gUnknown_084131A4, 256, 32); + sub_8149248(); + break; + case 2: + case 3: + LoadPalette(&gUnknown_0841221C, 240, 32); + LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_08413320, 0, 32); + LoadCompressedObjectPic(gUnknown_08416BDC); + LoadPalette(&gUnknown_08413320, 256, 32); + sub_8149264(); + break; + case 4: + LoadPalette(&gUnknown_0841223C, 240, 32); + LZ77UnCompVram(&gUnknown_08413E78, (void *)(VRAM)); + LZ77UnCompVram(&gUnknown_08414084, (void *)(VRAM + 0x3000)); + LoadPalette(&gUnknown_08413E38, 0, 64); + LoadCompressedObjectPic(gUnknown_08416C70); + LoadPalette(&gUnknown_08414064, 256, 32); + sub_8149280(); + break; + } + gReservedSpritePaletteCount = 8; + gUnknown_0203935C = 0; +} + +void sub_8148E90(u8 a) +{ + REG_BG3CNT = 0x603; + REG_BG2CNT = 0x702; + REG_BG1CNT = 0xF05; + REG_DISPCNT = 0x1F40; +} + +u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d) +{ + u8 taskId = CreateTask(&sub_8148F3C, 0); + + gTasks[taskId].data[0] = a; + gTasks[taskId].data[1] = b; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = c; + gTasks[taskId].data[5] = 0; + gTasks[taskId].data[6] = 0; + gTasks[taskId].data[7] = d; + gTasks[taskId].data[8] = 8; + gTasks[taskId].data[9] = 0; + sub_8148F3C(taskId); + return taskId; +} + +void sub_8148F3C(u8 taskId) +{ + s16 r4; + s32 r2; + + r4 = gTasks[taskId].data[1]; + if (r4 != 0) + { + r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3]; + r2 -= 16 * (u16)r4; + gTasks[taskId].data[2] = r2 >> 16; + gTasks[taskId].data[3] = r2; + REG_BG1HOFS = gTasks[taskId].data[2]; + REG_BG1VOFS = gUnknown_02039358 + gUnknown_0203935A; + } + + r4 = gTasks[taskId].data[4]; + if (r4 != 0) + { + r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; + r2 -= 16 * (u16)r4; + gTasks[taskId].data[5] = r2 >> 16; + gTasks[taskId].data[6] = r2; + REG_BG2HOFS = gTasks[taskId].data[5]; + if (gTasks[taskId].data[0] != 0) + REG_BG2VOFS = gUnknown_02039358 + gUnknown_0203935A; + else + REG_BG2VOFS = gUnknown_02039358; + } + + r4 = gTasks[taskId].data[7]; + if (r4 != 0) + { + r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9]; + r2 -= 16 * (u16)r4; + gTasks[taskId].data[8] = r2 >> 16; + gTasks[taskId].data[9] = r2; + REG_BG3HOFS = gTasks[taskId].data[8]; + REG_BG3VOFS = gUnknown_02039358; + } +} + +void sub_8149020(u8 mode) +{ + u16 x; + u16 y; + switch (mode) + { + case 0: + default: + /* stuff */ + if (gMain.vblankCounter1 & 3 || gPaletteFade.active) + break; + if (gMain.vblankCounter1 & 4) + { + x = gPlttBufferUnfaded[9]; + y = gPlttBufferUnfaded[10]; + } + else + { + x = gPlttBufferUnfaded[10]; + y = gPlttBufferUnfaded[9]; + } + LoadPalette(&x, 9, 2); + LoadPalette(&y, 10, 2); + break; + case 2: + if (gMain.vblankCounter1 & 3 || gPaletteFade.active) + break; + if (gMain.vblankCounter1 & 4) + { + x = 0x3D27; + y = 0x295; + } + else + { + x = 0x31C; + y = 0x3D27; + } + LoadPalette(&x, 12, 2); + LoadPalette(&y, 13, 2); + break; + case 1: + break; + } +} + +void sub_814910C(struct Sprite *sprite) +{ + if (gUnknown_0203935C) + { + DestroySprite(sprite); + } + else + { + s32 var = ((sprite->pos1.x << 16) | (u16)sprite->data[2]) + (u16)sprite->data[1]; + sprite->pos1.x = var >> 16; + sprite->data[2] = var; + if (sprite->pos1.x > 255) sprite->pos1.x = 0xFFE0; + if (sprite->data[0]) + { + sprite->pos2.y = -(gUnknown_02039358 + gUnknown_0203935A); + } + else + { + sprite->pos2.y = -gUnknown_02039358; + } + } +} + +void sub_8149174(u8 a, const struct IntroCreditsSpriteMetadata *b, const union AnimCmd *const *c, u8 d) +{ + u8 i; + + for(i = 0; i < d; i++) + { + u8 sprite = CreateSprite(&gSpriteTemplate_8416B3C, b[i].x, b[i].y, b[i].subpriority); + CalcCenterToCornerVec(&gSprites[sprite], b[i].shape, b[i].size, 0); + gSprites[sprite].oam.priority = 3; + gSprites[sprite].oam.shape = b[i].shape; + gSprites[sprite].oam.size = b[i].size; + gSprites[sprite].oam.paletteNum = 0; + gSprites[sprite].anims = c; + StartSpriteAnim(&gSprites[sprite], b[i].animNum); + gSprites[sprite].data[0] = a; + gSprites[sprite].data[1] = b[i].xOff; + gSprites[sprite].data[2] = 0; + } +} + +void sub_8149248() +{ + sub_8149174(0, gUnknown_08416B94, gSpriteAnimTable_8416B84, 9); +} + +void sub_8149264() +{ + sub_8149174(1, gUnknown_08416C10, gSpriteAnimTable_8416C04, 12); +} + +void sub_8149280() +{ + sub_8149174(1, gUnknown_08416C8C, gSpriteAnimTable_8416C88, 6); +} + +void nullsub_82(struct Sprite *sprite) +{ +} + +void sub_81492A0(struct Sprite* sprite) +{ + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + 8; + sprite->pos2.x = gSprites[sprite->data[0]].pos2.x; + sprite->pos2.y = gSprites[sprite->data[0]].pos2.y; +} + + + +u8 intro_create_brendan_sprite(s16 a, s16 b) +{ + u8 sprite = CreateSprite(&gSpriteTemplate_8416CDC, a, b, 0); + u8 brendan = CreateSprite(&gSpriteTemplate_Brendan, a, b + 8, 1); + gSprites[brendan].data[0] = sprite; + return sprite; +} + +u8 intro_create_may_sprite(s16 a, s16 b) +{ + u8 sprite = CreateSprite(&gSpriteTemplate_8416CF4, a, b, 0); + u8 may = CreateSprite(&gSpriteTemplate_May, a, b + 8, 1); + gSprites[may].data[0] = sprite; + return sprite; +} + +void nullsub_83(struct Sprite *sprite) +{ +} + +void sub_81493C4(struct Sprite* sprite) +{ + sprite->invisible = gSprites[sprite->data[0]].invisible; + sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->pos2.x = gSprites[sprite->data[0]].pos2.x; + sprite->pos2.y = gSprites[sprite->data[0]].pos2.y; +} + +u8 intro_create_latios_sprite(s16 a, s16 b) +{ + u8 sprite = CreateSprite(&gSpriteTemplate_8416D7C, a - 32, b, 2); + u8 latios = CreateSprite(&gSpriteTemplate_8416D7C, a + 32, b, 2); + gSprites[latios].data[0] = sprite; + StartSpriteAnim(&gSprites[latios], 1); + gSprites[latios].callback = &sub_81493C4; + return sprite; +} + +u8 intro_create_latias_sprite(s16 a, s16 b) +{ + u8 sprite = CreateSprite(&gSpriteTemplate_8416D94, a - 32, b, 2); + u8 latios = CreateSprite(&gSpriteTemplate_8416D94, a + 32, b, 2); + gSprites[latios].data[0] = sprite; + StartSpriteAnim(&gSprites[latios], 1); + gSprites[latios].callback = &sub_81493C4; + return sprite; +} diff --git a/src/item.c b/src/item.c new file mode 100644 index 000000000..41cbb7a1e --- /dev/null +++ b/src/item.c @@ -0,0 +1,697 @@ +#include "global.h" +#include "constants/hold_effects.h" +#include "item.h" +#include "constants/items.h" +#include "item_menu.h" +#include "item_use.h" +#include "berry.h" +#include "string_util.h" +#include "strings.h" + +struct Item +{ + u8 name[14]; + u16 itemId; + u16 price; + u8 holdEffect; + u8 holdEffectParam; + const u8 *description; + u8 importance; + u8 unk19; + u8 pocket; + u8 type; + ItemUseFunc fieldUseFunc; + u8 battleUsage; + ItemUseFunc battleUseFunc; + u8 secondaryId; +}; + +extern u8 gUnknown_02038560; +extern struct BagPocket gBagPockets[NUM_BAG_POCKETS]; + +// These constants are used in gItems +enum +{ + POCKET_NONE, + POCKET_ITEMS, + POCKET_POKE_BALLS, + POCKET_TM_HM, + POCKET_BERRIES, + POCKET_KEY_ITEMS, +}; + +enum +{ + ITEMS_POCKET, + BALLS_POCKET, + TMHM_POCKET, + BERRIES_POCKET, + KEYITEMS_POCKET +}; + +#if ENGLISH +#include "data/item_descriptions_en.h" +#include "data/items_en.h" +#elif GERMAN +#include "data/item_descriptions_de.h" +#include "data/items_de.h" +#endif + +static void CompactPCItems(void); + +void CopyItemName(u16 itemId, u8 *string) +{ + if (itemId == ITEM_ENIGMA_BERRY) + { + StringCopy(string, GetBerryInfo(0x2B)->name); // berry 0x2b = enigma berry + StringAppend(string, gOtherText_Berry2); + } + else + { + StringCopy(string, ItemId_GetName(itemId)); + } +} + +//Unreferenced +s8 CountUsedBagPocketSlots(u8 pocket) +{ + u8 i; + + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == 0) + return i; + } + return -1; +} + +bool8 IsBagPocketNonEmpty(u8 pocket) +{ + u8 i; + + for (i = 0; i < gBagPockets[pocket - 1].capacity; i++) + { + if (gBagPockets[pocket - 1].itemSlots[i].itemId != 0) + return TRUE; + } + return FALSE; +} + +bool8 CheckBagHasItem(u16 itemId, u16 count) +{ + u8 i; + u8 pocket; + + if (ItemId_GetPocket(itemId) == 0) + return FALSE; + pocket = ItemId_GetPocket(itemId) - 1; + //Check for item slots that contain the item + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + { + //Does this item slot contain enough of the item? + if (gBagPockets[pocket].itemSlots[i].quantity >= count) + return TRUE; + count -= gBagPockets[pocket].itemSlots[i].quantity; + //Does this item slot and all previous slots contain enough of the item? + if (count == 0) + return TRUE; + } + } + return FALSE; +} + +bool8 CheckBagHasSpace(u16 itemId, u16 count) +{ + u8 i; + u8 pocket; + u16 slotCapacity; + + if (ItemId_GetPocket(itemId) == 0) + return FALSE; + pocket = ItemId_GetPocket(itemId) - 1; + if (pocket != BERRIES_POCKET) + slotCapacity = 99; + else + slotCapacity = 999; + + //Check space in any existing item slots that already contain this item + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + { + if (gBagPockets[pocket].itemSlots[i].quantity + count <= slotCapacity) + return TRUE; + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + return FALSE; + count -= slotCapacity - gBagPockets[pocket].itemSlots[i].quantity; + if (count == 0) + return TRUE; + } + } + + //Check space in empty item slots + if (count > 0) + { + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == 0) + { + if (count <= slotCapacity) + return TRUE; + else + count -= slotCapacity; + } + } + if (count > 0) + return FALSE; //No more item slots. The bag is full + } + + return TRUE; +} + +// This function matches if gBagPockets is declared non-const, +// but it should be fixed anyway. +//#ifdef NONMATCHING +bool8 AddBagItem(u16 itemId, u16 count) +{ + u8 i; + u8 pocket; + u16 slotCapacity; + struct ItemSlot newItems[64]; + + if (ItemId_GetPocket(itemId) == 0) + return FALSE; + pocket = ItemId_GetPocket(itemId) - 1; + //Copy the bag pocket + memcpy(newItems, gBagPockets[pocket].itemSlots, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); + if (pocket != BERRIES_POCKET) + slotCapacity = 99; + else + slotCapacity = 999; + + //Use any item slots that already contain this item + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (newItems[i].itemId == itemId) + { + if (newItems[i].quantity + count <= slotCapacity) + { + newItems[i].quantity += count; + //Copy pocket back into the bag. + memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); + return TRUE; + } + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + return FALSE; + count -= slotCapacity - newItems[i].quantity; + newItems[i].quantity = slotCapacity; + if (count == 0) + goto copy_items; + } + } + + //Put any remaining items into new item slots. + if (count > 0) + { + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (newItems[i].itemId == 0) + { + newItems[i].itemId = itemId; + if (count <= slotCapacity) + { + newItems[i].quantity = count; + goto copy_items; + } + count -= slotCapacity; + newItems[i].quantity = slotCapacity; + } + } + if (count > 0) + return FALSE; //No more empty item slots. The bag is full. + } + + copy_items: + //Copy pocket back into the bag. + memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); + return TRUE; +} +//#else +//__attribute__((naked)) +//bool8 AddBagItem(u16 itemId, u16 count) +//{ +// asm(".syntax unified\n\ +// push {r4-r7,lr}\n\ +// mov r7, r9\n\ +// mov r6, r8\n\ +// push {r6,r7}\n\ +// sub sp, 0x100\n\ +// lsls r0, 16\n\ +// lsrs r0, 16\n\ +// mov r8, r0\n\ +// lsls r1, 16\n\ +// lsrs r4, r1, 16\n\ +// bl ItemId_GetPocket\n\ +// lsls r0, 24\n\ +// cmp r0, 0\n\ +// beq _080A9510\n\ +// mov r0, r8\n\ +// bl ItemId_GetPocket\n\ +// subs r0, 0x1\n\ +// lsls r0, 24\n\ +// lsrs r6, r0, 24\n\ +// ldr r1, _080A94F8 @ =gBagPockets\n\ +// lsls r0, r6, 3\n\ +// adds r5, r0, r1\n\ +// ldr r1, [r5]\n\ +// ldrb r2, [r5, 0x4]\n\ +// lsls r2, 2\n\ +// mov r0, sp\n\ +// bl memcpy\n\ +// ldr r7, _080A94FC @ =0x000003e7\n\ +// cmp r6, 0x3\n\ +// beq _080A9468\n\ +// movs r7, 0x63\n\ +//_080A9468:\n\ +// movs r1, 0\n\ +// ldrb r0, [r5, 0x4]\n\ +// cmp r1, r0\n\ +// bcs _080A94B2\n\ +// subs r0, r6, 0x2\n\ +// lsls r0, 24\n\ +// lsrs r0, 24\n\ +// mov r12, r0\n\ +//_080A9478:\n\ +// lsls r0, r1, 2\n\ +// mov r2, sp\n\ +// adds r3, r2, r0\n\ +// ldrh r0, [r3]\n\ +// cmp r0, r8\n\ +// bne _080A94A6\n\ +// ldrh r2, [r3, 0x2]\n\ +// adds r0, r2, r4\n\ +// cmp r0, r7\n\ +// ble _080A9500\n\ +// mov r0, r12\n\ +// cmp r0, 0x1\n\ +// bls _080A9510\n\ +// subs r0, r7, r2\n\ +// subs r0, r4, r0\n\ +// lsls r0, 16\n\ +// lsrs r4, r0, 16\n\ +// strh r7, [r3, 0x2]\n\ +// ldr r2, _080A94F8 @ =gBagPockets\n\ +// mov r9, r2\n\ +// lsls r3, r6, 3\n\ +// cmp r4, 0\n\ +// beq _080A9516\n\ +//_080A94A6:\n\ +// adds r0, r1, 0x1\n\ +// lsls r0, 24\n\ +// lsrs r1, r0, 24\n\ +// ldrb r0, [r5, 0x4]\n\ +// cmp r1, r0\n\ +// bcc _080A9478\n\ +//_080A94B2:\n\ +// ldr r2, _080A94F8 @ =gBagPockets\n\ +// mov r9, r2\n\ +// lsls r3, r6, 3\n\ +// cmp r4, 0\n\ +// beq _080A9516\n\ +// movs r1, 0\n\ +// adds r0, r3, r2\n\ +// ldrb r0, [r0, 0x4]\n\ +// cmp r1, r0\n\ +// bcs _080A94F2\n\ +// mov r6, r9\n\ +// adds r5, r3, r6\n\ +//_080A94CA:\n\ +// lsls r0, r1, 2\n\ +// mov r6, sp\n\ +// adds r2, r6, r0\n\ +// ldrh r0, [r2]\n\ +// cmp r0, 0\n\ +// bne _080A94E6\n\ +// mov r0, r8\n\ +// strh r0, [r2]\n\ +// cmp r4, r7\n\ +// bls _080A9514\n\ +// subs r0, r4, r7\n\ +// lsls r0, 16\n\ +// lsrs r4, r0, 16\n\ +// strh r7, [r2, 0x2]\n\ +//_080A94E6:\n\ +// adds r0, r1, 0x1\n\ +// lsls r0, 24\n\ +// lsrs r1, r0, 24\n\ +// ldrb r2, [r5, 0x4]\n\ +// cmp r1, r2\n\ +// bcc _080A94CA\n\ +//_080A94F2:\n\ +// cmp r4, 0\n\ +// beq _080A9516\n\ +// b _080A9510\n\ +// .align 2, 0\n\ +//_080A94F8: .4byte gBagPockets\n\ +//_080A94FC: .4byte 0x000003e7\n\ +//_080A9500:\n\ +// strh r0, [r3, 0x2]\n\ +// ldr r0, _080A950C @ =gBagPockets\n\ +// lsls r1, r6, 3\n\ +// adds r1, r0\n\ +// b _080A951A\n\ +// .align 2, 0\n\ +//_080A950C: .4byte gBagPockets\n\ +//_080A9510:\n\ +// movs r0, 0\n\ +// b _080A9528\n\ +//_080A9514:\n\ +// strh r4, [r2, 0x2]\n\ +//_080A9516:\n\ +// mov r6, r9\n\ +// adds r1, r3, r6\n\ +//_080A951A:\n\ +// ldr r0, [r1]\n\ +// ldrb r2, [r1, 0x4]\n\ +// lsls r2, 2\n\ +// mov r1, sp\n\ +// bl memcpy\n\ +// movs r0, 0x1\n\ +//_080A9528:\n\ +// add sp, 0x100\n\ +// pop {r3,r4}\n\ +// mov r8, r3\n\ +// mov r9, r4\n\ +// pop {r4-r7}\n\ +// pop {r1}\n\ +// bx r1\n\ +// .syntax divided\n"); +//} +//#endif + +bool8 RemoveBagItem(u16 itemId, u16 count) +{ + u8 i; + u8 pocket; + u16 totalQuantity = 0; + + if (ItemId_GetPocket(itemId) == 0 || itemId == 0) + return FALSE; + pocket = ItemId_GetPocket(itemId) - 1; + + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + totalQuantity += gBagPockets[pocket].itemSlots[i].quantity; + } + if (totalQuantity < count) + return FALSE; //We don't have enough of the item + + if (gBagPockets[pocket].capacity > gUnknown_02038560 + && gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId == itemId) + { + if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity >= count) + { + gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity -= count; + count = 0; + } + else + { + count -= gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity; + gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity = 0; + } + if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity == 0) + gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId = 0; + if (count == 0) + return TRUE; + } + + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + { + if (gBagPockets[pocket].itemSlots[i].quantity >= count) + { + gBagPockets[pocket].itemSlots[i].quantity -= count; + count = 0; + } + else + { + count -= gBagPockets[pocket].itemSlots[i].quantity; + gBagPockets[pocket].itemSlots[i].quantity = 0; + } + if (gBagPockets[pocket].itemSlots[i].quantity == 0) + gBagPockets[pocket].itemSlots[i].itemId = 0; + if (count == 0) + return TRUE; + } + } + return TRUE; +} + +u8 GetPocketByItemId(u16 itemId) +{ + return ItemId_GetPocket(itemId); +} + +void ClearItemSlots(struct ItemSlot *itemSlots, u8 b) +{ + u16 i; + + for (i = 0; i < b; i++) + { + itemSlots[i].itemId = 0; + itemSlots[i].quantity = 0; + } +} + +static s32 FindFreePCItemSlot(void) +{ + s8 i; + + for (i = 0; i < 50; i++) + { + if (gSaveBlock1.pcItems[i].itemId == 0) + return i; + } + return -1; +} + +u8 CountUsedPCItemSlots(void) +{ + u8 usedSlots = 0; + u8 i; + + for (i = 0; i < 50; i++) + { + if (gSaveBlock1.pcItems[i].itemId != 0) + usedSlots++; + } + return usedSlots; +} + +bool8 CheckPCHasItem(u16 itemId, u16 count) +{ + u8 i; + + for (i = 0; i < 50; i++) + { + if (gSaveBlock1.pcItems[i].itemId == itemId && gSaveBlock1.pcItems[i].quantity >= count) + return TRUE; + } + return FALSE; +} + +bool8 AddPCItem(u16 itemId, u16 count) +{ + u8 i; + s8 freeSlot; + struct ItemSlot newItems[50]; + + //Copy PC items + memcpy(newItems, gSaveBlock1.pcItems, sizeof(newItems)); + + //Use any item slots that already contain this item + for (i = 0; i < 50; i++) + { + if (newItems[i].itemId == itemId) + { + if (newItems[i].quantity + count <= 999) + { + newItems[i].quantity += count; + memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); + return TRUE; + } + count += newItems[i].quantity - 999; + newItems[i].quantity = 999; + if (count == 0) + { + memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); + return TRUE; + } + } + } + + //Put any remaining items into a new item slot. + if (count > 0) + { + freeSlot = FindFreePCItemSlot(); + if (freeSlot == -1) + return FALSE; + newItems[freeSlot].itemId = itemId; + newItems[freeSlot].quantity = count; + } + + //Copy items back to the PC + memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems)); + return TRUE; +} + +void RemovePCItem(u8 index, u16 count) +{ + gSaveBlock1.pcItems[index].quantity -= count; + if (gSaveBlock1.pcItems[index].quantity == 0) + { + gSaveBlock1.pcItems[index].itemId = 0; + CompactPCItems(); + } +} + +static void CompactPCItems(void) +{ + u16 i; + u16 j; + + for (i = 0; i < 49; i++) + { + for (j = i + 1; j <= 49; j++) + { + if (gSaveBlock1.pcItems[i].itemId == 0) + { + struct ItemSlot temp = gSaveBlock1.pcItems[i]; + gSaveBlock1.pcItems[i] = gSaveBlock1.pcItems[j]; + gSaveBlock1.pcItems[j] = temp; + } + } + } +} + +void SwapRegisteredBike(void) +{ + switch (gSaveBlock1.registeredItem) + { + case 0x103: + gSaveBlock1.registeredItem = 0x110; + break; + case 0x110: + gSaveBlock1.registeredItem = 0x103; + break; + } +} + +static u16 SanitizeItemId(u16 itemId) +{ + if (itemId >= ARRAY_COUNT(gItems)) + return 0; + else + return itemId; +} + +const u8 *ItemId_GetName(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].name; +} + +u16 ItemId_GetId(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].itemId; +} + +u16 ItemId_GetPrice(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].price; +} + +u8 ItemId_GetHoldEffect(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].holdEffect; +} + +u8 ItemId_GetHoldEffectParam(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].holdEffectParam; +} + +const u8 *ItemId_GetDescription(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].description; +} + +bool32 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c) +{ + u32 r5 = c + 1; + const u8 *description = gItems[SanitizeItemId(itemId)].description; + u8 *str = a; + + for (;;) + { + if (*description == 0xFF || *description == 0xFE) + { + r5--; + if (r5 == 0) + { + *str = 0xFF; + return TRUE; + } + if (*description == 0xFF) + return FALSE; + str = a; + description++; + } + else + *(str++) = *(description++); + } +} + +u8 ItemId_GetImportance(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].importance; +} + +// unused +u8 ItemId_GetUnknownValue(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].unk19; +} + +u8 ItemId_GetPocket(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].pocket; +} + +u8 ItemId_GetType(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].type; +} + +ItemUseFunc ItemId_GetFieldFunc(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].fieldUseFunc; +} + +u8 ItemId_GetBattleUsage(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].battleUsage; +} + +ItemUseFunc ItemId_GetBattleFunc(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].battleUseFunc; +} + +u8 ItemId_GetSecondaryId(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].secondaryId; +} diff --git a/src/item_menu.c b/src/item_menu.c new file mode 100644 index 000000000..32b14e021 --- /dev/null +++ b/src/item_menu.c @@ -0,0 +1,4607 @@ +#include "global.h" +#include "berry.h" +#include "berry_tag_screen.h" +#include "data2.h" +#include "decompress.h" +#include "field_effect.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "graphics.h" +#include "item.h" +#include "constants/items.h" +#include "item_menu.h" +#include "item_use.h" +#include "link.h" +#include "mail_data.h" +#include "main.h" +#include "map_name_popup.h" +#include "menu.h" +#include "menu_cursor.h" +#include "menu_helpers.h" +#include "money.h" +#include "palette.h" +#include "party_menu.h" +#include "player_pc.h" +#include "pokemon_menu.h" +#include "overworld.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "strings2.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "scanline_effect.h" +#include "menu_helpers.h" +#include "ewram.h" + +// External stuff +extern void gpu_pal_allocator_reset__manage_upper_four(void); +extern void SetVerticalScrollIndicatorPriority(); +extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16); +extern void PauseVerticalScrollIndicator(); +extern u8 sub_80F9284(void); +extern void sub_808B5B4(); +extern u8 sub_80F92F4(); +extern void sub_80C9C7C(u8); +extern void pal_fill_black(void); +extern bool8 IsWeatherNotFadingIn(void); +extern u8 sub_80F931C(); +extern void sub_808A3F8(u8); +extern void Shop_FadeReturnToMartMenu(void); +extern void sub_80546B8(u8); +extern void sub_804E990(u8); +extern void sub_802E424(u8); +extern void sub_8064E2C(void); + +struct UnknownStruct2 +{ + u8 unk0; + u8 textLine; + u8 unk2; +}; + +struct UnknownStruct3 +{ + u8 unk0; + u8 unk1; + u8 unk2; +}; + +struct UnknownStruct4 +{ + u8 unk0; + u8 unk1; + u16 unk2; + const u8 *unk4; + TaskFunc unk8; +}; + +struct UnknownStruct5 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; +}; + +struct UnknownStruct6 +{ + u8 unk0; +}; + +enum +{ + BAG_POCKET_ITEMS, // 0 + BAG_POCKET_POKE_BALLS, // 1 + BAG_POCKET_TMs_HMs, // 2 + BAG_POCKET_BERRIES, // 3 + BAG_POCKET_KEY_ITEMS, // 4 +}; + +enum +{ + RETURN_TO_FIELD_0, + RETURN_TO_BATTLE, + RETURN_TO_PKMN_LIST, + RETURN_TO_SHOP, + RETURN_TO_FIELD_4, + RETURN_TO_FIELD_5, + RETURN_TO_PC, + RETURN_TO_WALLY_BATTLE, +}; + +enum +{ + ITEM_ACTION_USE_0, // 0 + ITEM_ACTION_TOSS, // 1 + ITEM_ACTION_CANCEL_2, // 2 + ITEM_ACTION_REGISTER, // 3 + ITEM_ACTION_USE_4, // 4 + ITEM_ACTION_CANCEL_5, // 5 + ITEM_ACTION_GIVE, // 6 + ITEM_ACTION_CHECK_TAG, // 7 + ITEM_ACTION_NONE, // 8 + ITEM_ACTION_CONFIRM, // 9 +}; + +// ewram +EWRAM_DATA static struct UnknownStruct2 gUnknown_0203853C = {0}; +EWRAM_DATA static struct UnknownStruct3 gUnknown_02038540 = {0}; +EWRAM_DATA static struct UnknownStruct4 gUnknown_02038544 = {0}; +EWRAM_DATA static struct UnknownStruct5 gUnknown_02038550 = {0}; +EWRAM_DATA static struct UnknownStruct6 gUnknown_02038554 = {0}; // There are 3 bytes of padding after this, so I assume it's a struct +EWRAM_DATA static u8 gUnknown_02038558 = 0; +EWRAM_DATA static s8 sCurrentBagPocket = 0; +EWRAM_DATA static u8 gUnknown_0203855A = 0; +EWRAM_DATA static s8 gUnknown_0203855B = 0; +EWRAM_DATA static s8 gUnknown_0203855C = 0; +EWRAM_DATA u16 gSpecialVar_ItemId = 0; +EWRAM_DATA u8 gUnknown_02038560 = 0; +EWRAM_DATA u8 gUnknown_02038561 = 0; +EWRAM_DATA static u8 gUnknown_02038562 = 0; +EWRAM_DATA static u8 gUnknown_02038563 = 0; +EWRAM_DATA static u8 gUnknown_02038564 = 0; +EWRAM_DATA static u8 sPokeballSpriteId ALIGNED(4) = 0; // HACK: why is there a space before this variable? + +// bss +static u8 sPopupMenuSelection; +static u8 sReturnLocation; +static const u8 *sPopupMenuActionList; + +// common +void (*gFieldItemUseCallback)(u8) = NULL; +extern u16 gBattle_BG1_Y; +extern struct PocketScrollState gBagPocketScrollStates[]; +extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots +extern const u8 Event_NoRegisteredItem[]; + +// TODO: decompile the debug code so we can use static in this file +#define static + +extern const struct CompressedSpriteSheet sMaleBagSpriteSheet; +extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet; +extern const struct CompressedSpritePalette sBagSpritePalette; + +const struct BagPocket gBagPockets[NUM_BAG_POCKETS] = +{ + {gSaveBlock1.bagPocket_Items, 20}, + {gSaveBlock1.bagPocket_PokeBalls, 16}, + {gSaveBlock1.bagPocket_TMHM, 64}, + {gSaveBlock1.bagPocket_Berries, 46}, + {gSaveBlock1.bagPocket_KeyItems, 20}, +}; + +static void HandlePopupMenuAction_UseOnField(u8); +static void HandlePopupMenuAction_Toss(u8); +static void sub_80A5F80(u8); +static void HandlePopupMenuAction_Register(u8); +static void HandlePopupMenuAction_UseInBattle(u8); +static void sub_80A7124(u8); +static void HandlePopupMenuAction_Give(u8); +static void HandlePopupMenuAction_CheckTag(u8); +static void HandlePopupMenuAction_Confirm(u8); + +static const struct MenuAction2 sItemPopupMenuActions[] = +{ + {OtherText_Use, HandlePopupMenuAction_UseOnField}, + {OtherText_Toss, HandlePopupMenuAction_Toss}, + {gOtherText_CancelNoTerminator, sub_80A5F80}, + {OtherText_Register, HandlePopupMenuAction_Register}, + {OtherText_Use, HandlePopupMenuAction_UseInBattle}, + {gOtherText_CancelNoTerminator, sub_80A7124}, + {OtherText_Give2, HandlePopupMenuAction_Give}, + {OtherText_CheckTag, HandlePopupMenuAction_CheckTag}, + {gOtherText_CancelWithTerminator, NULL}, + {OtherText_Confirm, HandlePopupMenuAction_Confirm}, +}; + +static const u8 sItemPopupMenuChoicesTable[][6] = +{ + [BAG_POCKET_ITEMS] = + { + ITEM_ACTION_USE_0, + ITEM_ACTION_TOSS, + ITEM_ACTION_GIVE, + ITEM_ACTION_CANCEL_2, + }, + + [BAG_POCKET_POKE_BALLS] = + { + ITEM_ACTION_GIVE, + ITEM_ACTION_TOSS, + ITEM_ACTION_NONE, + ITEM_ACTION_CANCEL_2, + }, + + [BAG_POCKET_TMs_HMs] = + { + ITEM_ACTION_USE_0, + ITEM_ACTION_NONE, + ITEM_ACTION_GIVE, + ITEM_ACTION_CANCEL_2, + }, + + [BAG_POCKET_BERRIES] = + { + ITEM_ACTION_CHECK_TAG, + ITEM_ACTION_USE_0, + ITEM_ACTION_TOSS, + ITEM_ACTION_NONE, + ITEM_ACTION_GIVE, + ITEM_ACTION_CANCEL_2 + }, + + [BAG_POCKET_KEY_ITEMS] = + { + ITEM_ACTION_USE_0, + ITEM_ACTION_NONE, + ITEM_ACTION_REGISTER, + ITEM_ACTION_CANCEL_2, + }, +}; + +const u8 gUnknown_083C16AE[][2] = +{ + {6, 2}, + {6, 2}, + {6, 2}, + {6, 2}, + {2, 0}, +}; + +const u8 gUnknown_083C16B8[] = {7, 9, 8, 2}; + +static void OnItemSelect_Field05(u8); +static void OnBagClose_Field0(u8); +static void OnBagClose_PkmnList(u8); +static void OnItemSelect_PkmnList(u8); +static void OnBagClose_Shop(u8); +static void OnItemSelect_Shop(u8); +static void OnBagClose_Field4(u8); +static void OnItemSelect_Field4(u8); +static void OnBagClose_Field5(u8); +static void OnBagClose_PC(u8); +static void OnItemSelect_PC(u8); +static void OnItemSelect_Battle(u8); +static void OnBagClose_Battle(u8); + +static const struct {TaskFunc onItemSelect; TaskFunc onBagClose;} gUnknown_083C16BC[] = +{ + [RETURN_TO_FIELD_0] = {OnItemSelect_Field05, OnBagClose_Field0}, + [RETURN_TO_BATTLE] = {OnItemSelect_Battle, OnBagClose_Battle}, + [RETURN_TO_PKMN_LIST] = {OnItemSelect_PkmnList, OnBagClose_PkmnList}, + [RETURN_TO_SHOP] = {OnItemSelect_Shop, OnBagClose_Shop}, + [RETURN_TO_FIELD_4] = {OnItemSelect_Field4, OnBagClose_Field4}, + [RETURN_TO_FIELD_5] = {OnItemSelect_Field05, OnBagClose_Field5}, + [RETURN_TO_PC] = {OnItemSelect_PC, OnBagClose_PC}, +}; + +static void sub_80A5E60(u8); +static void sub_80A5E90(u8); + +static const struct YesNoFuncTable gUnknown_083C16F4 = {sub_80A5E60, sub_80A5E90}; + +static void sub_80A65AC(u8); +static void sub_80A6618(u8); + +const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618}; + +void sub_80A34E8(void); +static bool8 LoadBagGraphicsMultistep(void); +static void sub_80A362C(void); +static void sub_80A3740(void); +static void sub_80A396C(u16 *, u8, u8, u8); +static void sub_80A39B8(u16 *, u8); +static void sub_80A39E4(u16 *, u8, u8, s8); +static void DrawPocketIndicatorDots(u16 *, u8); +static void SortItemSlots(struct BagPocket); +static void UpdateAllBagPockets(void); +static void sub_80A3D24(u8); +static void sub_80A3D40(void); +static void RemoveSelectIconFromRegisteredItem(void); +static void sub_80A48E8(u16, int, int); +static void ItemListMenu_InitDescription(s16); +static void ItemListMenu_ChangeDescription(s16, int); +static void sub_80A4F68(u8); +static void sub_80A50C8(u8); +static void sub_80A5AE4(u8); +static void sub_80A5BF8(u8); +static void Task_CallItemUseOnFieldCallback(u8); +static void sub_80A6444(u8); +static void sub_80A648C(u8); +static void Task_BuyHowManyDialogueHandleInput(u8); +static void BuyMenuPrintItemQuantityAndPrice(u8); +static void BuyMenuDisplayMessage(u16, u16); +static void sub_80A683C(void); +static void sub_80A6870(u16, u8); +static void sub_80A699C(void); +static void sub_80A7230(u8); +static void ItemListMenu_InitMenu(void); +static void sub_80A73C0(void); +static void sub_80A73F0(void); +static void sub_80A73FC(void); +static void sub_80A740C(void); +static void sub_80A7420(void); +static void sub_80A751C(void); +static void sub_80A7528(u8); +static void sub_80A7590(void); +static void sub_80A75E4(void); +static void sub_80A7630(void); +static void sub_80A763C(void); +static void sub_80A76A0(void); +static void sub_80A770C(void); +static void DisplayCannotUseItemMessage(int, const u8 *, TaskFunc, int); +static void sub_80A7768(void); +static void sub_80A7828(void); +static void sub_80A7834(int, int); +static bool32 sub_80A78A0(void); +static void sub_80A78B8(void); +static bool32 sub_80A78C4(void); +static void sub_80A78E8(void); +static int sub_80A78F4(void); +static void sub_80A7918(void); +static int sub_80A7924(void); +static int sub_80A7958(void); +static void sub_80A7970(void); +static void sub_80A797C(void); +static int sub_80A7988(void); +static void sub_80A79B4(struct Sprite *); +static void sub_80A79EC(struct Sprite *); +static void sub_80A7A94(struct Sprite *); +static void sub_80A7AE4(struct Sprite *); +static void CreateBagSprite(void); +static void sub_80A7B6C(struct Sprite *); +static void CreateBagPokeballSprite(u8); +static void sub_80A7C64(void); + +static void sub_80A3118(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + sub_80A740C(); + UpdatePaletteFade(); +} + +static void sub_80A3134(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0x2000), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x6000), 0x800); +} + +static bool8 SetupBagMultistep(void) +{ + u32 index; + u16 savedIme; + + switch (gMain.state) + { + case 0: + ClearVideoCallbacks(); + sub_80A34E8(); + gMain.state++; + break; + case 1: + ScanlineEffect_Stop(); + gMain.state++; + break; + case 2: + gpu_pal_allocator_reset__manage_upper_four(); + gMain.state++; + break; + case 3: + ClearBGTilemapBuffers(); + ewramBagSetupStep = 0; + gMain.state++; + break; + case 4: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = TRUE; + gMain.state++; + break; + case 5: + ResetSpriteData(); + gMain.state++; + break; + case 6: + if (LoadBagGraphicsMultistep() == FALSE) + break; + gMain.state++; + break; + case 7: + Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); + gMain.state++; + break; + case 8: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC); + gMain.state++; + break; + case 9: + if (!MultistepInitMenuWindowContinue()) + break; + gMain.state++; + break; + case 10: + ClearVerticalScrollIndicatorPalettes(); + LoadScrollIndicatorPalette(); + CreateVerticalScrollIndicators(TOP_ARROW, 172, 12); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148); + CreateVerticalScrollIndicators(LEFT_ARROW, 28, 88); + CreateVerticalScrollIndicators(RIGHT_ARROW, 100, 88); + SetVerticalScrollIndicatorPriority(TOP_ARROW, 2); + SetVerticalScrollIndicatorPriority(BOTTOM_ARROW, 2); + SetVerticalScrollIndicatorPriority(LEFT_ARROW, 2); + SetVerticalScrollIndicatorPriority(RIGHT_ARROW, 2); + if (sReturnLocation == RETURN_TO_FIELD_4 || sReturnLocation == RETURN_TO_FIELD_5) + { + SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE); + } + gMain.state++; + break; + case 11: + gUnknown_0203855A = 16; + sub_80A39B8(gBGTilemapBuffers[2], sCurrentBagPocket + 1); + DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); + UpdateAllBagPockets(); + SortItemSlots(gBagPockets[2]); + SortItemSlots(gBagPockets[3]); + sub_80A3D40(); + gCurrentBagPocketItemSlots = gBagPockets[sCurrentBagPocket].itemSlots; + sub_80A362C(); + gMain.state++; + break; + case 12: + sub_80A48E8(0xFFFF, 0, 7); + index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + ItemListMenu_InitDescription(gCurrentBagPocketItemSlots[index].itemId); + ItemListMenu_InitMenu(); + gUnknown_0203855B = sCurrentBagPocket + 1; + gUnknown_0203855C = 0; + gMain.state++; + break; + case 13: + CreateBagSprite(); + CreateBagPokeballSprite(0); + sub_80A3740(); + gMain.state++; + break; + case 14: + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = FALSE; + gMain.state++; + break; + case 15: + if (sub_8055870() == TRUE) + break; + gMain.state++; + break; + case 16: + SetVBlankCallback(sub_80A3134); + SetMainCallback2(sub_80A3118); + sub_80A751C(); + sub_80A7630(); + sub_80A770C(); + sub_80A7828(); + sub_80A78B8(); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0xF5E0), 0x8000, (void *)(VRAM + 0xF800), 0); +#endif + return TRUE; + } + return FALSE; +} + +static bool8 sub_80A34B4(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + sPopupMenuSelection = 0; + ResetTasks(); + return TRUE; + } + if (sub_80F9344() == TRUE) + break; + } + return FALSE; +} + + +void sub_80A34E8(void) +{ + sub_80F9368(); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(4) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_BLDCNT = 0; +} + +static bool8 LoadBagGraphicsMultistep(void) +{ + switch (ewramBagSetupStep) + { + case 0: + LZDecompressVram(gBagScreen_Gfx, (void *)(VRAM + 0x4000)); + ewramBagSetupStep++; + break; + case 1: + CpuCopy16(gUnknown_08E77004, gBGTilemapBuffers[2], 0x800); + ewramBagSetupStep++; + break; + case 2: + if (gSaveBlock2.playerGender == MALE || sReturnLocation == RETURN_TO_WALLY_BATTLE) + LoadCompressedPalette(gBagScreenMale_Pal, 0, 64); + else + LoadCompressedPalette(gBagScreenFemale_Pal, 0, 64); + ewramBagSetupStep++; + break; + case 3: + if (gSaveBlock2.playerGender == MALE || sReturnLocation == RETURN_TO_WALLY_BATTLE) + LoadCompressedObjectPic(&sMaleBagSpriteSheet); + else + LoadCompressedObjectPic(&sFemaleBagSpriteSheet); + ewramBagSetupStep++; + break; + case 4: + LoadCompressedObjectPalette(&sBagSpritePalette); + ewramBagSetupStep = 0; + return TRUE; + } + return FALSE; +} + +static void sub_80A362C(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + u8 r3; + + if (sReturnLocation == RETURN_TO_FIELD_5) + r3 = gBagPocketScrollStates[i].numSlots - 1; + else + r3 = gBagPocketScrollStates[i].numSlots; + + if (gBagPocketScrollStates[i].scrollTop != 0) + { + if (gBagPocketScrollStates[i].scrollTop + gBagPocketScrollStates[i].cursorMax > r3) + gBagPocketScrollStates[i].scrollTop = r3 - gBagPocketScrollStates[i].cursorMax; + } + else + { + if (gBagPocketScrollStates[i].cursorPos > r3) + gBagPocketScrollStates[i].cursorPos = r3; + } + } +} + +void ResetBagScrollPositions(void) +{ + u16 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + { + gBagPocketScrollStates[i].cursorPos = 0; + gBagPocketScrollStates[i].scrollTop = 0; + gBagPocketScrollStates[i].numSlots = 0; + gBagPocketScrollStates[i].cursorMax = 0; + } + sCurrentBagPocket = 0; +} + +static void sub_80A36B8(u16 *a, u8 b, u8 c, u8 d, u8 e) +{ + u16 i; + u16 j; + + for (i = c; i <= c + e; i++) + { + for (j = b; j <= b + d; j++) + { + u32 index = j + i * 32; + + a[index] = 0; + } + } +} + +void ClearBag(void) +{ + u16 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); + ResetBagScrollPositions(); +} + +#if DEBUG + +const struct ItemSlot gUnknown_Debug_083EBC68[60] = +{ + {ITEM_POKE_BALL, 10}, + {ITEM_ULTRA_BALL, 15}, + {ITEM_GREAT_BALL, 20}, + {ITEM_MASTER_BALL, 25}, + {ITEM_ACRO_BIKE, 1 }, + {ITEM_OLD_ROD, 1 }, + {ITEM_GOOD_ROD, 1 }, + {ITEM_SUPER_ROD, 1 }, + {ITEM_POKEBLOCK_CASE, 1 }, + {ITEM_WAILMER_PAIL, 1 }, + {ITEM_ITEMFINDER, 1 }, + {ITEM_NONE, 1 }, +}; + +void debug_sub_80A3714(void) +{ + u16 arr[5]; + u16 i; + + for (i = 0; i < 5; i++) + arr[i] = 0; + for (i = 0; i < ARRAY_COUNT(gUnknown_Debug_083EBC68); i++) + { + u16 pocket; + + if (gUnknown_Debug_083EBC68[i].itemId == ITEM_NONE) + break; + pocket = ItemId_GetPocket(gUnknown_Debug_083EBC68[i].itemId) - 1; + gBagPockets[pocket].itemSlots[arr[pocket]] = gUnknown_Debug_083EBC68[i]; + arr[pocket]++; + } +} + +#endif + +static void sub_80A3740(void) +{ + const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; + + LoadPalette(&colors[1], 0xD1, sizeof(colors[1])); + LoadPalette(&colors[0], 0xD8, sizeof(colors[0])); +} + +static void sub_80A3770(void) +{ + if (sReturnLocation == RETURN_TO_FIELD_0) + { + sPopupMenuActionList = sItemPopupMenuChoicesTable[sCurrentBagPocket]; + if (sCurrentBagPocket != BAG_POCKET_BERRIES) + gUnknown_02038564 = 4; + else + gUnknown_02038564 = 6; + } +} + +static void sub_80A37C0(u8 taskId) +{ + gTasks[taskId].func = sub_80A50C8; + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + StartVerticalScrollIndicators(LEFT_ARROW); + StartVerticalScrollIndicators(RIGHT_ARROW); +} + +static void sub_80A37F8(u8 taskId) +{ + u8 r5 = gUnknown_0203855A; + + if (r5 < 16) + { + gUnknown_0203855A++; + sub_80A396C(gBGTilemapBuffers[2], r5, gUnknown_0203855A, 0x4F); + sub_80A39E4(gBGTilemapBuffers[2], sCurrentBagPocket + 1, gUnknown_0203855A / 2, gTasks[taskId].data[5]); + gUnknown_02038558 = 1; + sub_80A48E8(taskId, r5 / 2, gUnknown_0203855A / 2 - 1); + gUnknown_02038558 = 0; + return; + } + + if (gLinkOpen == TRUE) + { + u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + + ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, gUnknown_02038562); + gUnknown_02038562++; + } + else + { + while (gUnknown_02038562 < 3) + { + u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + + ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, gUnknown_02038562); + gUnknown_02038562++; + } + } + if (gUnknown_02038562 == 3) + { + gUnknown_0203855A = 16; + gUnknown_0203855B = sCurrentBagPocket + 1; + sub_80A37C0(FindTaskIdByFunc(sub_80A4F68)); + DestroyTask(taskId); + ItemListMenu_InitMenu(); + SetVerticalScrollIndicators(LEFT_ARROW, VISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, VISIBLE); + } +} + +static void sub_80A3954(u16 *a) +{ + CpuCopy16(gUnknown_08E77004, a, 0x800); +} + +static void sub_80A396C(u16 *a, u8 b, u8 c, u8 d) +{ + u16 *dst = a + 14 + (b + 2) * 32; + u16 i; + + while (c > b++) + { + for (i = 0; i < 15; i++) + dst[i] = d; + dst += 32; + } +} + +static void sub_80A39B8(u16 *a, u8 b) +{ + u8 var = b * 2; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, 0, var, 8, 2); +} + +static void sub_80A39E4(u16 *a, u8 b, u8 c, s8 d) +{ + u16 r2 = b * 2; + u16 r7; + + if (d == -1) + { + r7 = (b + 1) * 2; + if (b == 5) + r7 = 2; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, 8 - c, r2, c, 2); + sub_809D104(a, c + 4, 10, gUnknown_08E96EC8, 0, r7, 8 - c, 2); + } + else if (d == 1) + { + r7 = (b - 1) * 2; + if (b == 1) + r7 = 10; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, c, r7, 8 - c, 2); + sub_809D104(a, 12 - c, 10, gUnknown_08E96EC8, 0, r2, c, 2); + } +} + +// Draws dots under the bag sprite, showing which pocket is selected +static void DrawPocketIndicatorDots(u16 *tileMapBuffer, u8 selectedPocket) +{ + u8 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + { + if (i == selectedPocket) + tileMapBuffer[0x125 + i] = 0x107D; + else + tileMapBuffer[0x125 + i] = 0x107C; + } +} + +static void ChangePocket(u16 *tileMapBuffer, s8 delta) +{ + u8 taskId; + + sCurrentBagPocket += delta; + // Wrap around + if (sCurrentBagPocket >= NUM_BAG_POCKETS) + sCurrentBagPocket = 0; + if (sCurrentBagPocket < 0) + sCurrentBagPocket = NUM_BAG_POCKETS - 1; + + sub_80A76A0(); + sub_80A7590(); + gCurrentBagPocketItemSlots = gBagPockets[sCurrentBagPocket].itemSlots; + sub_80A3D24(sCurrentBagPocket); + gUnknown_0203855A = 0; + sub_80A3954(tileMapBuffer); + sub_80A396C(tileMapBuffer, 0, 16, 3); + sub_80A39B8(tileMapBuffer, 0); + gUnknown_0203855B = 6; + gUnknown_02038562 = 0; + taskId = FindTaskIdByFunc(sub_80A37F8); + if (taskId == 0xFF) + taskId = CreateTask(sub_80A37F8, 8); + gTasks[taskId].data[5] = delta; +} + +static void SwapItemSlots(struct ItemSlot *a, struct ItemSlot *b) +{ + struct ItemSlot temp = *a; + + *a = *b; + *b = temp; +} + +static void RemoveEmptyItemSlots(struct BagPocket pocket) +{ + u16 i; + u16 j; + + for (i = 0; i < pocket.capacity - 1; i++) + { + for (j = i + 1; j < pocket.capacity; j++) + { + if (pocket.itemSlots[i].quantity == 0) + SwapItemSlots(&pocket.itemSlots[i], &pocket.itemSlots[j]); + } + } +} + +static void SortItemSlots(struct BagPocket pocket) +{ + u16 i; + u16 j; + + for (i = 0; i < pocket.capacity; i++) + { + for (j = i + 1; j < pocket.capacity; j++) + { + if (pocket.itemSlots[i].quantity != 0 && pocket.itemSlots[j].quantity != 0 + && pocket.itemSlots[i].itemId > pocket.itemSlots[j].itemId) + SwapItemSlots(&pocket.itemSlots[i], &pocket.itemSlots[j]); + } + } +} + +static void UpdateBagPocket(u8 pocketNum) +{ + u16 i; + + gBagPocketScrollStates[pocketNum].numSlots = 0; + for (i = 0; i < gBagPockets[pocketNum].capacity; i++) + { + if (gBagPockets[pocketNum].itemSlots[i].quantity != 0) + gBagPocketScrollStates[pocketNum].numSlots++; + } + RemoveEmptyItemSlots(gBagPockets[pocketNum]); +} + +static void UpdateAllBagPockets(void) +{ + u8 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + UpdateBagPocket(i); +} + +static void sub_80A3D24(u8 pocketNum) +{ + if (gBagPocketScrollStates[pocketNum].numSlots >= 7) + gBagPocketScrollStates[pocketNum].cursorMax = 7; + else + gBagPocketScrollStates[pocketNum].cursorMax = gBagPocketScrollStates[pocketNum].numSlots; +} + +static void sub_80A3D40(void) +{ + u8 i; + + for (i = 0; i < NUM_BAG_POCKETS; i++) + sub_80A3D24(i); +} + +static void sub_80A3D5C(u8 taskId) +{ + u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + + gCurrentBagPocketItemSlots[index].quantity -= gTasks[taskId].data[1]; + if (gCurrentBagPocketItemSlots[index].quantity == 0) // item slot will be removed if the quantity is zero + { + // Un-register the item if registered + if (gSaveBlock1.registeredItem == gCurrentBagPocketItemSlots[index].itemId) + { + RemoveSelectIconFromRegisteredItem(); + gSaveBlock1.registeredItem = ITEM_NONE; + } + + gCurrentBagPocketItemSlots[index].itemId = ITEM_NONE; + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 7 == gBagPocketScrollStates[sCurrentBagPocket].numSlots + && gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) + gBagPocketScrollStates[sCurrentBagPocket].scrollTop--; + UpdateBagPocket(sCurrentBagPocket); + } + sub_80A3D24(sCurrentBagPocket); +} + +void sub_80A3E0C(void) +{ + u32 index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + + if (gCurrentBagPocketItemSlots[index].quantity == 0) + { + gCurrentBagPocketItemSlots[index].itemId = 0; + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 7 == gBagPocketScrollStates[sCurrentBagPocket].numSlots + && gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) + gBagPocketScrollStates[sCurrentBagPocket].scrollTop--; + UpdateBagPocket(sCurrentBagPocket); + } + sub_80A3D24(sCurrentBagPocket); +} + +static void nullsub_16(void) +{ +} + +static void sub_80A3E70(u8 a, u8 b) +{ + struct ItemSlot temp = gCurrentBagPocketItemSlots[a]; + + gCurrentBagPocketItemSlots[a] = gCurrentBagPocketItemSlots[b]; + gCurrentBagPocketItemSlots[b] = temp; +} + +static void sub_80A3E90(u8 taskId) +{ + PlaySE(SE_SELECT); + nullsub_16(); + sub_80A3E70( + gTasks[taskId].data[10] - 1, + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + gBagPocketScrollStates[sCurrentBagPocket].scrollTop); + gTasks[taskId].data[10] = 0; + sub_80A763C(); + sub_80A7528(0); + ItemListMenu_InitMenu(); +} + +static void sub_80A3EF4(u8 taskId) +{ + u8 r2; + + PlaySE(SE_SELECT); + nullsub_16(); + r2 = gTasks[taskId].data[10] - gBagPocketScrollStates[sCurrentBagPocket].scrollTop - 1; + gTasks[taskId].data[10] = 0; + if (r2 < 8) + sub_80A48E8(taskId, r2, r2); + sub_80A7528(0); +} + +static void sub_80A3F50(u8 taskId) +{ + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A7528(1); +} + +void sub_80A3FA0(u16 *a, u8 b, u8 c, u8 d, u8 e, u16 f) +{ + s16 i; + s16 j; + + for (i = c; i < c + e; i++) + { + for (j = b; j < b + d; j++) + { + u32 index = j + i * 32; + + a[index] = f; + } + } +} + +static void sub_80A4008(u16 *a, u8 b, u8 c, u8 d, u8 e) +{ + sub_80A3FA0(a, b, c, d, e, 1); +} + +static void DrawSelectIcon(u32 itemPos) +{ + u16 *ptr1 = gBGTilemapBuffers[2] + 0x5A; + + ptr1 += itemPos * 64; + ptr1[0] = 0x5A; + ptr1[1] = 0x5B; + ptr1[2] = 0x5C; + ptr1[32] = 0x6A; + ptr1[33] = 0x6B; + ptr1[34] = 0x6C; +} + +static void MoveSelectIcon(u8 itemPos) +{ + u16 i; + u16 *ptr; + + ptr = gBGTilemapBuffers[2] + 0x5A; + for (i = 0; i < 16; i++) + { + ptr[0] = 0x4F; + ptr[1] = 0x4F; + ptr[2] = 0x4F; + ptr += 32; + } + + ptr = gBGTilemapBuffers[2] + 0x5A + itemPos * 64; + ptr[0] = 0x5A; + ptr[1] = 0x5B; + ptr[2] = 0x5C; + ptr[32] = 0x6A; + ptr[33] = 0x6B; + ptr[34] = 0x6C; +} + +static void EraseSelectIcon(u8 itemPos) +{ + u16 *ptr = gBGTilemapBuffers[2] + 0x5A; + + ptr += itemPos * 64; + ptr[0] = 0x4F; + ptr[1] = 0x4F; + ptr[2] = 0x4F; + ptr[32] = 0x4F; + ptr[33] = 0x4F; + ptr[34] = 0x4F; +} + +static void RemoveSelectIconFromRegisteredItem(void) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + break; + if (gCurrentBagPocketItemSlots[gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i].itemId == gSaveBlock1.registeredItem) + { + EraseSelectIcon(i); + break; + } + } +} + +static void AddSelectIconToRegisteredItem(void) +{ + RemoveSelectIconFromRegisteredItem(); + MoveSelectIcon(gBagPocketScrollStates[sCurrentBagPocket].cursorPos); +} + +void sub_80A4164(u8 *dest, u16 value, enum StringConvertMode mode, u8 digits) +{ + *dest++ = CHAR_MULT_SIGN; + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 0x14; + dest[2] = 6; + dest += 3; + ConvertIntToDecimalStringN(dest, value, mode, digits); +} + +void sub_80A418C(u16 value, enum StringConvertMode mode, u8 c, u8 d, u8 digits) +{ + sub_80A4164(gStringVar1, value, mode, digits); + Menu_PrintText(gStringVar1, c, d); +} + +static void sub_80A41D4(u8 taskId) +{ + sub_80A763C(); +} + +static void sub_80A41E0(u8 *a, u16 b, const u8 *c, u16 d, u8 e) +{ + a[0] = EXT_CTRL_CODE_BEGIN; + a[1] = 0x13; + a[2] = 8; + a += 3; + a = ConvertIntToDecimalStringN(a, b, STR_CONV_MODE_LEADING_ZEROS, 2); + a[0] = EXT_CTRL_CODE_BEGIN; + a[1] = 0x13; + a[2] = 0x18; + a += 3; + a = sub_8072C74(a, c, 0x78 - (e + 1) * 6, 0); + *a++ = CHAR_MULT_SIGN; + sub_8072C14(a, d, 0x78, 1); +} + +static u8 *sub_80A425C(u8 taskId, u8 *text, u8 c) +{ + if (gTasks[taskId].data[10] - gBagPocketScrollStates[sCurrentBagPocket].scrollTop - 1 == c) + { + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 1; + text[2] = 2; + text += 3; + } + return text; +} + +static bool8 sub_80A42B0(u8 itemPos, int b) +{ + u8 r5; + u16 *ptr; + struct UnknownStruct3 *r8 = &gUnknown_02038540; + + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + itemPos > gBagPocketScrollStates[sCurrentBagPocket].numSlots) + return TRUE; + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + itemPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + if (sReturnLocation == RETURN_TO_FIELD_5) + return TRUE; + r5 = itemPos * 2 + 2; + sub_8072C74(gStringVar1, gOtherText_CloseBag, 0x78, 0); + Menu_PrintText(gStringVar1, 14, r5); + ptr = gBGTilemapBuffers[2] + 14 + r5 * 32; + ptr[0] = 0x4F; + ptr[1] = 0x4F; + ptr[32] = 0x4F; + ptr[33] = 0x4F; + if (itemPos == 7) + return TRUE; + if ((b == 1 && r8->unk2 != 0) || b == 2) + Menu_BlankWindowRect(14, r5 + 2, 29, 13); + else + Menu_BlankWindowRect(14, r5 + 2, 29, 17); + return TRUE; + } + return FALSE; +} + +static void sub_80A4380(u16 a, int b, int c, int d) +{ + u8 i; + + for (i = b; i <= c; i++) + { + u8 r4; + u8 r5; + u8 *text; + + if (sub_80A42B0(i, d) == TRUE) + break; + r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; + r5 = i * 2 + 2; + text = gStringVar1; + text = sub_80A425C(a, text, i); + text = sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x66, 0); + *text++ = CHAR_MULT_SIGN; + sub_8072C14(text, gCurrentBagPocketItemSlots[r4].quantity, 0x78, 1); + Menu_PrintText(gStringVar1, 14, r5); + } +} + +static void sub_80A444C(u16 a, int b, int c, int d) +{ + u8 i; + + for (i = b; i <= c; i++) + { + u8 r4; + u8 r5; + u8 *text; + + if (sub_80A42B0(i, d) == TRUE) + break; + r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; + r5 = i * 2 + 2; + text = gStringVar1; + text = sub_80A425C(a, text, i); +#if ENGLISH + sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x60, 0); +#else + sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x63, 0); +#endif + Menu_PrintText(gStringVar1, 14, r5); + if (gUnknown_02038558 != 0) + { + if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) + DrawSelectIcon(i); + } + else + { + if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) + MoveSelectIcon(i); + else + EraseSelectIcon(i); + } + } +} + +// more gBGTilemapBuffers shenanigans +#ifdef NONMATCHING +static void sub_80A4548(u16 a, int b, int c, int d) +{ + u8 i; + + for (i = b; i <= c; i++) + { + u8 r4; + u8 sp10; + u32 r5; + u8 *text; + + if (sub_80A42B0(i, d) == TRUE) + break; + r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; + sp10 = i * 2 + 2; + r5 = sp10 * 32 + 14; + text = gStringVar1; + text = sub_80A425C(a, text, i); + if (gCurrentBagPocketItemSlots[r4].itemId < 0x153) + { + const u8 *r2; + + gBGTilemapBuffers[2][r5 + 0] = 0x59; + gBGTilemapBuffers[2][r5 + 1] = 0x4F; + gBGTilemapBuffers[2][r5 + 32] = 0x69; + gBGTilemapBuffers[2][r5 + 33] = 0x4F; + r2 = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; + sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 288, r2, gCurrentBagPocketItemSlots[r4].quantity, 2); + } + else + { + const u8 *moveName; + + gBGTilemapBuffers[2][r5 + 0] = 0x105D; + gBGTilemapBuffers[2][r5 + 1] = 0x105E; + gBGTilemapBuffers[2][r5 + 32] = 0x106D; + gBGTilemapBuffers[2][r5 + 33] = 0x106E; + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 0x13; + text[2] = 0x11; + text += 3; + text = ConvertIntToDecimalString(text, gCurrentBagPocketItemSlots[r4].itemId); + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 0x13; + text[2] = 0x18; + text += 3; + moveName = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; + sub_8072C74(text, moveName, 0x78, 0); + } + Menu_PrintText(gStringVar1, 14, sp10); + } +} +#else +__attribute__((naked)) +static void sub_80A4548(u16 a, int b, int c, int d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + str r2, [sp, 0x8]\n\ + str r3, [sp, 0xC]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x4]\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r8, r1\n\ + ldr r0, _080A456C @ =gBGTilemapBuffers + 0x1000\n\ + mov r9, r0\n\ + b _080A46C2\n\ + .align 2, 0\n\ +_080A456C: .4byte gBGTilemapBuffers + 0x1000\n\ +_080A4570:\n\ + ldr r1, _080A461C @ =gBagPocketScrollStates\n\ + ldr r0, _080A4620 @ =sCurrentBagPocket\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r4, [r0, 0x1]\n\ + add r4, r8\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + mov r1, r8\n\ + lsls r0, r1, 25\n\ + movs r3, 0x80\n\ + lsls r3, 18\n\ + adds r0, r3\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x10]\n\ + lsls r0, 5\n\ + adds r0, 0xE\n\ + adds r5, r0, 0\n\ + ldr r6, _080A4624 @ =gStringVar1\n\ + ldr r1, [sp, 0x4]\n\ + lsls r0, r1, 24\n\ + lsrs r0, 24\n\ + adds r1, r6, 0\n\ + mov r2, r8\n\ + bl sub_80A425C\n\ + adds r6, r0, 0\n\ + ldr r3, _080A4628 @ =gCurrentBagPocketItemSlots\n\ + mov r10, r3\n\ + ldr r0, [r3]\n\ + lsls r7, r4, 2\n\ + adds r3, r7, r0\n\ + ldrh r1, [r3]\n\ + movs r0, 0xA9\n\ + lsls r0, 1\n\ + cmp r1, r0\n\ + bhi _080A4634\n\ + lsls r0, r5, 1\n\ + add r0, r9\n\ + movs r1, 0x59\n\ + strh r1, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 1\n\ + add r0, r9\n\ + movs r2, 0x4F\n\ + strh r2, [r0]\n\ + adds r0, r5, 0\n\ + adds r0, 0x20\n\ + lsls r0, 1\n\ + add r0, r9\n\ + movs r1, 0x69\n\ + strh r1, [r0]\n\ + adds r0, r5, 0\n\ + adds r0, 0x21\n\ + lsls r0, 1\n\ + add r0, r9\n\ + strh r2, [r0]\n\ + ldrh r0, [r3]\n\ + bl ItemIdToBattleMoveId\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0xD\n\ + adds r2, r0, 0\n\ + muls r2, r1\n\ + ldr r0, _080A462C @ =gMoveNames\n\ + adds r2, r0\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + adds r0, r7, r0\n\ + ldr r3, _080A4630 @ =0xfffffee0\n\ + adds r1, r3, 0\n\ + ldrh r3, [r0]\n\ + adds r1, r3\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + ldrh r3, [r0, 0x2]\n\ + movs r0, 0x2\n\ + str r0, [sp]\n\ + adds r0, r6, 0\n\ + bl sub_80A41E0\n\ + b _080A46AE\n\ + .align 2, 0\n\ +_080A461C: .4byte gBagPocketScrollStates\n\ +_080A4620: .4byte sCurrentBagPocket\n\ +_080A4624: .4byte gStringVar1\n\ +_080A4628: .4byte gCurrentBagPocketItemSlots\n\ +_080A462C: .4byte gMoveNames\n\ +_080A4630: .4byte 0xfffffee0\n\ +_080A4634:\n\ + lsls r0, r5, 1\n\ + add r0, r9\n\ + ldr r1, _080A46EC @ =0x0000105d\n\ + strh r1, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 1\n\ + add r0, r9\n\ + adds r1, 0x1\n\ + strh r1, [r0]\n\ + adds r0, r5, 0\n\ + adds r0, 0x20\n\ + lsls r0, 1\n\ + add r0, r9\n\ + adds r1, 0xF\n\ + strh r1, [r0]\n\ + adds r0, r5, 0\n\ + adds r0, 0x21\n\ + lsls r0, 1\n\ + add r0, r9\n\ + adds r1, 0x1\n\ + strh r1, [r0]\n\ + movs r0, 0xFC\n\ + strb r0, [r6]\n\ + movs r4, 0x13\n\ + strb r4, [r6, 0x1]\n\ + movs r0, 0x11\n\ + strb r0, [r6, 0x2]\n\ + adds r6, 0x3\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + adds r0, r7, r0\n\ + ldrh r1, [r0]\n\ + ldr r3, _080A46F0 @ =0xfffffeae\n\ + adds r1, r3\n\ + adds r0, r6, 0\n\ + bl ConvertIntToDecimalString\n\ + adds r6, r0, 0\n\ + movs r0, 0xFC\n\ + strb r0, [r6]\n\ + strb r4, [r6, 0x1]\n\ + movs r0, 0x18\n\ + strb r0, [r6, 0x2]\n\ + adds r6, 0x3\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + adds r0, r7, r0\n\ + ldrh r0, [r0]\n\ + bl ItemIdToBattleMoveId\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0xD\n\ + muls r1, r0\n\ + ldr r0, _080A46F4 @ =gMoveNames\n\ + adds r1, r0\n\ + adds r0, r6, 0\n\ + movs r2, 0x78\n\ + movs r3, 0\n\ + bl sub_8072C74\n\ +_080A46AE:\n\ + ldr r0, _080A46F8 @ =gStringVar1\n\ + movs r1, 0xE\n\ + ldr r2, [sp, 0x10]\n\ + bl Menu_PrintText\n\ + mov r0, r8\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ +_080A46C2:\n\ + ldr r3, [sp, 0x8]\n\ + cmp r8, r3\n\ + bgt _080A46DA\n\ + mov r0, r8\n\ + ldr r1, [sp, 0xC]\n\ + bl sub_80A42B0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _080A46DA\n\ + b _080A4570\n\ +_080A46DA:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A46EC: .4byte 0x0000105d\n\ +_080A46F0: .4byte 0xfffffeae\n\ +_080A46F4: .4byte gMoveNames\n\ +_080A46F8: .4byte gStringVar1\n\ + .syntax divided\n"); +} +#endif + +static void sub_80A46FC(u16 a, int b, int c, int d) +{ + u8 i; + + for (i = b; i <= c; i++) + { + u8 r4; + u8 r5; + u8 *text; + register int var asm("r0"); + + if (sub_80A42B0(i, d) == TRUE) + break; + r4 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + i; + r5 = i * 2 + 2; + + var = 14 + r5 * 32; + gBGTilemapBuffers[2][var] = 0x59; + var += 32; + gBGTilemapBuffers[2][var] = 0x69; + + text = gStringVar1; + text = sub_80A425C(a, text, i); + CopyItemName(gCurrentBagPocketItemSlots[r4].itemId, gStringVar2); + sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 0x84, gStringVar2, gCurrentBagPocketItemSlots[r4].quantity, 3); + Menu_PrintText(gStringVar1, 14, r5); + } +} + +static void sub_80A47E8(u16 a, int b, int c, int d) +{ + switch (sCurrentBagPocket) + { + case BAG_POCKET_ITEMS: + case BAG_POCKET_POKE_BALLS: + sub_80A4380(a, b, c, d); + break; + case BAG_POCKET_KEY_ITEMS: + sub_80A444C(a, b, c, d); + break; + case BAG_POCKET_TMs_HMs: + sub_80A4548(a, b, c, d); + break; + case BAG_POCKET_BERRIES: + sub_80A46FC(a, b, c, d); + break; + } + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); + else + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); + if ((sReturnLocation != RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots + 1) + || (sReturnLocation == RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots)) + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); + else + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); +} + +static void sub_80A48E8(u16 taskId, int b, int c) +{ + sub_80A47E8(taskId, b, c, 0); +} + +static void sub_80A48F8(u16 taskId) +{ + sub_80A47E8(taskId, 0, 5, 2); +} + +static void ItemListMenu_InitDescription(s16 itemId) +{ + u8 r5; + + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + r5 = sub_8072A18(gOtherText_ReturnTo, 4, 0x68, 0x68, 1); + r5 += sub_8072A18(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0x68, 1); + } + else + { + r5 = sub_8072A18(ItemId_GetDescription(itemId), 4, 0x68, 0x68, 1); + } + + if (r5 < 3) + Menu_EraseWindowRect(0, 13 + r5 * 2, 13, 20); +} + +static void ItemListMenu_ChangeDescription(s16 itemId, int b) +{ + u8 description[100]; + + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + if (b == 0) + { + Menu_EraseWindowRect(0, 13, 13, 20); + Menu_PrintTextPixelCoords(gOtherText_ReturnTo, 4, 0x68, 0); + } + else if (b == 1) + { + Menu_PrintTextPixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0); + } + } + else + { + if (b == 0) + Menu_EraseWindowRect(0, 13, 13, 20); + if (ItemId_CopyDescription(description, itemId, b)) + Menu_PrintTextPixelCoords(description, 4, 104 + b * 16, 0); + } +} + +static bool32 CopyTextLine(u8 *destination, const u8 *source, u32 c) +{ + u32 r4 = c + 1; + const u8 *src = source; + u8 *dst = destination; + + while (1) + { + if (*src == CHAR_NEWLINE || *src == EOS) + { + r4--; + if (r4 == 0) + { + *dst = EOS; + return TRUE; + } + if (*src == EOS) + return FALSE; + // got a new line - reset dst pointer + dst = destination; + src++; + } + else + { + *dst++ = *src++; + } + } +} + +static void sub_80A4A98(const u8 *text, u32 line) +{ + u8 buffer[100]; + + if (line == 0) + Menu_EraseWindowRect(0, 13, 13, 20); + if (CopyTextLine(buffer, text, line)) + Menu_PrintTextPixelCoords(buffer, 4, 104 + line * 16, 0); +} + +static void sub_80A4ADC(u8 taskId) +{ + if (gTasks[taskId].data[10] == 0) + sub_80A7528(0); + PlaySE(SE_SELECT); + gUnknown_0203855C = 1; +} + +static void sub_80A4B14(s8 a, u8 b) +{ + gBagPocketScrollStates[sCurrentBagPocket].scrollTop += a; + Menu_MoveCursor(0); + sub_80A73C0(); + sub_80A763C(); + sub_80A4ADC(b); +} + +static void sub_80A4B58(s8 delta, u8 b) +{ + gBagPocketScrollStates[sCurrentBagPocket].cursorPos = Menu_MoveCursor(delta); + sub_80A73C0(); + sub_80A4ADC(b); +} + +static const u8 *sub_80A4B90(u16 itemId) +{ + if (TestPlayerAvatarFlags(6)) + { + if (itemId == ITEM_MACH_BIKE || itemId == ITEM_ACRO_BIKE) + return gOtherText_Walk; + } + if (ItemIsMail(itemId) == TRUE) + return gOtherText_Check; + return sItemPopupMenuActions[sPopupMenuActionList[0]].text; +} + +static void sub_80A4BF0(u16 *a) +{ + u8 i; + + if (gUnknown_02038564 == 4) + { + Menu_DrawStdWindowFrame(0, 7, 13, 12); + sub_80A4008(a, 1, 8, 12, 4); + if (sub_80F9344() == TRUE && sReturnLocation == RETURN_TO_FIELD_5) + { + sub_80A7834(1, 0); + } + else + { + for (i = 0; i < gUnknown_02038564; i++) + { + const u8 *text; + + if (i == 0) + text = sub_80A4B90(gSpecialVar_ItemId); + else + text = sItemPopupMenuActions[sPopupMenuActionList[i]].text; + Menu_PrintText(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2); + } + } + if (sReturnLocation == RETURN_TO_FIELD_5) + InitMenu(0, 1, 8, gUnknown_02038564, sPopupMenuSelection, 1); + else + InitMenu(0, 1, 8, gUnknown_02038564, 0, 1); + sub_8072DCC(0x2F); + } + else + { + Menu_DrawStdWindowFrame(0, 5, 13, 12); + sub_80A4008(a, 1, 6, 12, 6); + for (i = 0; i < gUnknown_02038564; i++) + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[i]].text, 1 + (i / 3) * 6, 6 + (i % 3) * 2); + InitMenu(0, 1, 6, gUnknown_02038564, 0, 1); + sub_8072DCC(0x2F); + } + sub_80A7528(2); +} + +static void sub_80A4DA4(u16 *a) +{ + sub_80A73FC(); + sub_80A36B8(a, 0, 6, 13, 6); + Menu_EraseWindowRect(0, 5, 13, 12); + sub_80A7590(); +} + +static void sub_80A4DD8(u8 taskId, u8 b, u8 c, u8 d, u8 e, u8 digits) +{ + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = b + 2; + gTasks[taskId].data[3] = c + 1; + Menu_DrawStdWindowFrame(b, c, b + d, c + e); + sub_80A4008(gBGTilemapBuffers[1], b + 1, c + 1, d - 1, e - 1); + sub_80A418C(1, 1, b + 2, c + 1, digits); +} + +static void sub_80A4E8C(s8 delta, u8 b) +{ + PlaySE(SE_SELECT); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE); + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + PauseVerticalScrollIndicator(LEFT_ARROW); + PauseVerticalScrollIndicator(RIGHT_ARROW); + ChangePocket(gBGTilemapBuffers[2], delta); + DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); + sub_80A3770(); + sub_80A7C64(); + CreateBagPokeballSprite(b); +} + +static bool8 sub_80A4F0C(void) +{ + if (sReturnLocation == RETURN_TO_FIELD_5 || sReturnLocation == RETURN_TO_FIELD_4) + return FALSE; + if (gMain.newKeys == DPAD_RIGHT || sub_80F9284() == 2) + { + sub_80A4E8C(1, 2); + return TRUE; + } + if (gMain.newKeys == DPAD_LEFT || sub_80F9284() == 1) + { + sub_80A4E8C(-1, 1); + return TRUE; + } + return FALSE; +} + +static void sub_80A4F68(u8 taskId) +{ + sub_80A4F0C(); +} + +static bool8 sub_80A4F74(u8 a) +{ + bool8 retVal = FALSE; + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos != 0) + sub_80A4B58(-1, a); + else if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) + sub_80A4B14(-1, a); + if (gLinkOpen == TRUE && gMain.keyRepeatCounter == 5) + gMain.keyRepeatCounter = 11; + retVal = TRUE; + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + if (sReturnLocation != RETURN_TO_FIELD_5) + { + if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].cursorMax) + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) + sub_80A4B14(1, a); + } + else + { + sub_80A4B58(1, a); + } + } + else + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots - 1) + { + if (gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].cursorMax) + sub_80A4B58(1, a); + else + sub_80A4B14(1, a); + } + } + retVal = TRUE; + if (gLinkOpen == TRUE && gMain.keyRepeatCounter == 5) + gMain.keyRepeatCounter = 11; + } + else + { + if (gTasks[a].data[10] == 0 && sub_80A4F0C() == TRUE) + { + sub_80A73F0(); + gTasks[a].func = sub_80A4F68; + retVal = TRUE; + } + else + { + sub_80A73C0(); + } + } + return retVal; +} + +static void sub_80A50C8(u8 taskId) +{ + s16 *r5 = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + if (sub_80A4F74(taskId) == TRUE) + { + sub_808B5B4(taskId); + return; + } + + if ((gMain.newKeys & SELECT_BUTTON) + && !(sCurrentBagPocket == BAG_POCKET_BERRIES || sCurrentBagPocket == BAG_POCKET_TMs_HMs) + && (sReturnLocation == RETURN_TO_FIELD_0 || sReturnLocation == RETURN_TO_BATTLE)) + { + if (r5[10] == 0) + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + PlaySE(SE_SELECT); + sub_80A3F50(taskId); + } + sub_808B5B4(taskId); + } + else + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos != gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + PlaySE(SE_SELECT); + sub_80A3E90(taskId); + } + else + { + sub_80A3EF4(taskId); + } + sub_808B5B4(taskId); + } + return; + } + + if (gMain.newKeys & A_BUTTON) + { + if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos == gBagPocketScrollStates[sCurrentBagPocket].numSlots) + { + if (r5[10] == 0) + { + gSpecialVar_ItemId = 0; + gUnknown_083C16BC[sReturnLocation].onBagClose(taskId); + } + else + { + sub_80A3EF4(taskId); + } + sub_808B5B4(taskId); + } + else + { + if (r5[10] == 0) + { + PlaySE(SE_SELECT); + gUnknown_02038560 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId; + gUnknown_083C16BC[sReturnLocation].onItemSelect(taskId); + StopVerticalScrollIndicators(TOP_ARROW); + StopVerticalScrollIndicators(BOTTOM_ARROW); + StopVerticalScrollIndicators(LEFT_ARROW); + StopVerticalScrollIndicators(RIGHT_ARROW); + sub_80A797C(); + } + else + { + sub_80A3E90(taskId); + } + sub_808B5B4(taskId); + } + return; + } + + if (gMain.newKeys & B_BUTTON) + { + if (r5[10] == 0) + { + if (sReturnLocation != RETURN_TO_FIELD_5) + { + gSpecialVar_ItemId = 0; + gUnknown_083C16BC[sReturnLocation].onBagClose(taskId); + } + } + else + { + sub_80A3EF4(taskId); + } + sub_808B5B4(taskId); + return; + } + } +} + +bool8 SellMenu_QuantityRoller(u8 taskId, u16 b) +{ + s16 *taskData = gTasks[taskId].data; + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + if (taskData[1] != b) + taskData[1]++; + else + taskData[1] = 1; + return TRUE; + } + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + if (taskData[1] != 1) + taskData[1]--; + else + taskData[1] = b; + return TRUE; + } + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_RIGHT) + { + if (taskData[1] + 10 < b) + taskData[1] += 10; + else + taskData[1] = b; + return TRUE; + } + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_LEFT) + { + if (taskData[1] > 10) + taskData[1] -= 10; + else + taskData[1] = 1; + return TRUE; + } + + return FALSE; +} + +static bool8 sub_80A5350(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (SellMenu_QuantityRoller(taskId, gCurrentBagPocketItemSlots[gUnknown_02038560].quantity) == TRUE) + { + // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way + if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) + sub_80A418C(taskData[1], 1, taskData[2], taskData[3], 3); + else + sub_80A418C(taskData[1], 1, taskData[2], taskData[3], 2); + return TRUE; + } + return FALSE; +} + +static void sub_80A53CC(void) +{ + if (sub_80A34B4() == TRUE) + { + sub_80A3770(); + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + } +} + +void sub_80A53F8(void) +{ + sReturnLocation = RETURN_TO_FIELD_0; + SetMainCallback2(sub_80A53CC); +} + +#ifdef NONMATCHING +static void sub_80A5414(u8 taskId) +{ + TaskFunc r5 = NULL; + + if (sub_80A78A0() != 0) + { + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x40) + { + if ((sPopupMenuSelection & 1) && sPopupMenuActionList[sPopupMenuSelection - 1] == 8) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor3(-1); + } + } + //_080A546C + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x80) + { + if (!(sPopupMenuSelection & 1) && sPopupMenuActionList[sPopupMenuSelection + 1] != 8) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor3(1); + } + } + //_080A549C + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x20) + { + if (sPopupMenuSelection > 1 && sPopupMenuActionList[sPopupMenuSelection - 2] != 8) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor3(-2); + } + } + //_080A54CC + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == 0x10) + { + if (sPopupMenuSelection <= 1 && sPopupMenuActionList[sPopupMenuSelection + 2] != 8) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = MoveMenuCursor3(2); + } + } + //_080A5500 + else if (!(gMain.newKeys & A_BUTTON)) + { + if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A4DA4(gBGTilemapBuffers[1]); + r5 = sItemPopupMenuActions[sPopupMenuActionList[3]].func; + r5(taskId); + } + } + else + { + //_080A5590 + gTasks[taskId].data[10] = 0; + sub_80A4DA4(gBGTilemapBuffers[1]); + r5 = sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func; + r5(taskId); + } + } + //_080A5552 + if (r5 == NULL) + { + if (sReturnLocation == RETURN_TO_FIELD_5) + { + if (sPopupMenuSelection == 0) + { + sub_8072DDC(12); + return; + } + //_080A55D4 + //else + //{ + if (sPopupMenuSelection == 0 || sPopupMenuSelection == 1) + sub_8072DCC(0x2F); + else + sub_8072DCC(0x30); + //} + } + //_080A55E0 + else + { + if (sPopupMenuSelection == 0 || sPopupMenuSelection == 1) + sub_8072DCC(0x2F); + else + sub_8072DCC(0x30); + } + } +} +#else +__attribute__((naked)) +static void sub_80A5414(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + movs r5, 0\n\ + bl sub_80A78A0\n\ + cmp r0, 0\n\ + bne _080A5426\n\ + b _080A5552\n\ +_080A5426:\n\ + ldr r2, _080A5460 @ =gMain\n\ + ldrh r0, [r2, 0x30]\n\ + movs r1, 0xF0\n\ + ands r1, r0\n\ + cmp r1, 0x40\n\ + bne _080A546C\n\ + ldr r4, _080A5464 @ =sPopupMenuSelection\n\ + ldrb r1, [r4]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080A5440\n\ + b _080A5552\n\ +_080A5440:\n\ + ldrb r1, [r4]\n\ + ldr r0, _080A5468 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + subs r1, 0x1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x8\n\ + bne _080A5452\n\ + b _080A5552\n\ +_080A5452:\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _080A54EE\n\ + .align 2, 0\n\ +_080A5460: .4byte gMain\n\ +_080A5464: .4byte sPopupMenuSelection\n\ +_080A5468: .4byte sPopupMenuActionList\n\ +_080A546C:\n\ + cmp r1, 0x80\n\ + bne _080A549C\n\ + ldr r4, _080A5494 @ =sPopupMenuSelection\n\ + ldrb r1, [r4]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080A5552\n\ + ldrb r1, [r4]\n\ + ldr r0, _080A5498 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x1]\n\ + cmp r0, 0x8\n\ + beq _080A5552\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + b _080A54EE\n\ + .align 2, 0\n\ +_080A5494: .4byte sPopupMenuSelection\n\ +_080A5498: .4byte sPopupMenuActionList\n\ +_080A549C:\n\ + cmp r1, 0x20\n\ + bne _080A54CC\n\ + ldr r4, _080A54C4 @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x1\n\ + bls _080A5552\n\ + adds r1, r0, 0\n\ + ldr r0, _080A54C8 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + subs r1, 0x2\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x8\n\ + beq _080A5552\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + b _080A54EE\n\ + .align 2, 0\n\ +_080A54C4: .4byte sPopupMenuSelection\n\ +_080A54C8: .4byte sPopupMenuActionList\n\ +_080A54CC:\n\ + cmp r1, 0x10\n\ + bne _080A5500\n\ + ldr r4, _080A54F8 @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x1\n\ + bhi _080A5552\n\ + adds r1, r0, 0\n\ + ldr r0, _080A54FC @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x2]\n\ + cmp r0, 0x8\n\ + beq _080A5552\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x2\n\ +_080A54EE:\n\ + bl MoveMenuCursor3\n\ + strb r0, [r4]\n\ + b _080A5552\n\ + .align 2, 0\n\ +_080A54F8: .4byte sPopupMenuSelection\n\ +_080A54FC: .4byte sPopupMenuActionList\n\ +_080A5500:\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080A5590\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080A5552\n\ + ldr r1, _080A5570 @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x1C]\n\ + ldr r1, _080A5574 @ =gBagPocketScrollStates\n\ + ldr r0, _080A5578 @ =sCurrentBagPocket\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r2, [r0]\n\ + adds r0, r4, 0\n\ + adds r1, r2, 0\n\ + bl sub_80A48E8\n\ + ldr r0, _080A557C @ =gBGTilemapBuffers + 0x800\n\ + bl sub_80A4DA4\n\ + ldr r1, _080A5580 @ =sItemPopupMenuActions\n\ + ldr r0, _080A5584 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x3]\n\ + lsls r0, 3\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r5, [r0]\n\ + adds r0, r4, 0\n\ + bl _call_via_r5\n\ +_080A5552:\n\ + cmp r5, 0\n\ + bne _080A55FA\n\ + ldr r0, _080A5588 @ =sReturnLocation\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x5\n\ + bne _080A55E0\n\ + ldr r0, _080A558C @ =sPopupMenuSelection\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080A55D4\n\ + movs r0, 0xC\n\ + bl sub_8072DDC\n\ + b _080A55FA\n\ + .align 2, 0\n\ +_080A5570: .4byte gTasks\n\ +_080A5574: .4byte gBagPocketScrollStates\n\ +_080A5578: .4byte sCurrentBagPocket\n\ +_080A557C: .4byte gBGTilemapBuffers + 0x800\n\ +_080A5580: .4byte sItemPopupMenuActions\n\ +_080A5584: .4byte sPopupMenuActionList\n\ +_080A5588: .4byte sReturnLocation\n\ +_080A558C: .4byte sPopupMenuSelection\n\ +_080A5590:\n\ + ldr r1, _080A55C0 @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x1C]\n\ + ldr r0, _080A55C4 @ =gBGTilemapBuffers + 0x800\n\ + bl sub_80A4DA4\n\ + ldr r1, _080A55C8 @ =sItemPopupMenuActions\n\ + ldr r0, _080A55CC @ =sPopupMenuSelection\n\ + ldrb r2, [r0]\n\ + ldr r0, _080A55D0 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 3\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r5, [r0]\n\ + adds r0, r4, 0\n\ + bl _call_via_r5\n\ + b _080A5552\n\ + .align 2, 0\n\ +_080A55C0: .4byte gTasks\n\ +_080A55C4: .4byte gBGTilemapBuffers + 0x800\n\ +_080A55C8: .4byte sItemPopupMenuActions\n\ +_080A55CC: .4byte sPopupMenuSelection\n\ +_080A55D0: .4byte sPopupMenuActionList\n\ +_080A55D4:\n\ + cmp r0, 0x1\n\ + bls _080A55E8\n\ + movs r0, 0x30\n\ + bl sub_8072DCC\n\ + b _080A55FA\n\ +_080A55E0:\n\ + ldr r0, _080A55F0 @ =sPopupMenuSelection\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bhi _080A55F4\n\ +_080A55E8:\n\ + movs r0, 0x2F\n\ + bl sub_8072DCC\n\ + b _080A55FA\n\ + .align 2, 0\n\ +_080A55F0: .4byte sPopupMenuSelection\n\ +_080A55F4:\n\ + movs r0, 0x30\n\ + bl sub_8072DCC\n\ +_080A55FA:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +__attribute__((naked)) +static void sub_80A5600(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + movs r5, 0\n\ + ldr r2, _080A563C @ =gMain\n\ + ldrh r0, [r2, 0x30]\n\ + movs r1, 0xF0\n\ + ands r1, r0\n\ + cmp r1, 0x40\n\ + bne _080A5648\n\ + ldr r4, _080A5640 @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0\n\ + bne _080A561E\n\ + b _080A5736\n\ +_080A561E:\n\ + adds r1, r0, 0\n\ + ldr r0, _080A5644 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + subs r1, 0x1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x8\n\ + bne _080A5630\n\ + b _080A5736\n\ +_080A5630:\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _080A56D2\n\ + .align 2, 0\n\ +_080A563C: .4byte gMain\n\ +_080A5640: .4byte sPopupMenuSelection\n\ +_080A5644: .4byte sPopupMenuActionList\n\ +_080A5648:\n\ + cmp r1, 0x80\n\ + bne _080A5680\n\ + ldr r4, _080A5674 @ =sPopupMenuSelection\n\ + ldrb r1, [r4]\n\ + ldr r0, _080A5678 @ =gUnknown_02038564\n\ + ldrb r0, [r0]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + beq _080A5736\n\ + cmp r1, 0x2\n\ + beq _080A5736\n\ + ldr r0, _080A567C @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r0, r1, r0\n\ + ldrb r0, [r0, 0x1]\n\ + cmp r0, 0x8\n\ + beq _080A5736\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x1\n\ + b _080A56D2\n\ + .align 2, 0\n\ +_080A5674: .4byte sPopupMenuSelection\n\ +_080A5678: .4byte gUnknown_02038564\n\ +_080A567C: .4byte sPopupMenuActionList\n\ +_080A5680:\n\ + cmp r1, 0x20\n\ + bne _080A56B0\n\ + ldr r4, _080A56A8 @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x2\n\ + bls _080A5736\n\ + adds r1, r0, 0\n\ + ldr r0, _080A56AC @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + subs r1, 0x3\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x8\n\ + beq _080A5736\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x3\n\ + negs r0, r0\n\ + b _080A56D2\n\ + .align 2, 0\n\ +_080A56A8: .4byte sPopupMenuSelection\n\ +_080A56AC: .4byte sPopupMenuActionList\n\ +_080A56B0:\n\ + cmp r1, 0x10\n\ + bne _080A56E4\n\ + ldr r4, _080A56DC @ =sPopupMenuSelection\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x2\n\ + bhi _080A5736\n\ + adds r1, r0, 0\n\ + ldr r0, _080A56E0 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x3]\n\ + cmp r0, 0x8\n\ + beq _080A5736\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r0, 0x3\n\ +_080A56D2:\n\ + bl MoveMenuCursor3\n\ + strb r0, [r4]\n\ + b _080A5736\n\ + .align 2, 0\n\ +_080A56DC: .4byte sPopupMenuSelection\n\ +_080A56E0: .4byte sPopupMenuActionList\n\ +_080A56E4:\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080A5768\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080A5736\n\ + ldr r1, _080A574C @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x1C]\n\ + ldr r1, _080A5750 @ =gBagPocketScrollStates\n\ + ldr r0, _080A5754 @ =sCurrentBagPocket\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r2, [r0]\n\ + adds r0, r4, 0\n\ + adds r1, r2, 0\n\ + bl sub_80A48E8\n\ + ldr r0, _080A5758 @ =gBGTilemapBuffers + 0x800\n\ + bl sub_80A4DA4\n\ + ldr r1, _080A575C @ =sItemPopupMenuActions\n\ + ldr r0, _080A5760 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x5]\n\ + lsls r0, 3\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r5, [r0]\n\ + adds r0, r4, 0\n\ + bl _call_via_r5\n\ +_080A5736:\n\ + cmp r5, 0\n\ + bne _080A57BE\n\ + ldr r0, _080A5764 @ =sPopupMenuSelection\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080A57AC\n\ + movs r0, 0xC\n\ + bl sub_8072DDC\n\ + b _080A57BE\n\ + .align 2, 0\n\ +_080A574C: .4byte gTasks\n\ +_080A5750: .4byte gBagPocketScrollStates\n\ +_080A5754: .4byte sCurrentBagPocket\n\ +_080A5758: .4byte gBGTilemapBuffers + 0x800\n\ +_080A575C: .4byte sItemPopupMenuActions\n\ +_080A5760: .4byte sPopupMenuActionList\n\ +_080A5764: .4byte sPopupMenuSelection\n\ +_080A5768:\n\ + ldr r1, _080A5798 @ =gTasks\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r5, [r0, 0x1C]\n\ + ldr r0, _080A579C @ =gBGTilemapBuffers + 0x800\n\ + bl sub_80A4DA4\n\ + ldr r1, _080A57A0 @ =sItemPopupMenuActions\n\ + ldr r0, _080A57A4 @ =sPopupMenuSelection\n\ + ldrb r2, [r0]\n\ + ldr r0, _080A57A8 @ =sPopupMenuActionList\n\ + ldr r0, [r0]\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 3\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r5, [r0]\n\ + adds r0, r4, 0\n\ + bl _call_via_r5\n\ + b _080A5736\n\ + .align 2, 0\n\ +_080A5798: .4byte gTasks\n\ +_080A579C: .4byte gBGTilemapBuffers + 0x800\n\ +_080A57A0: .4byte sItemPopupMenuActions\n\ +_080A57A4: .4byte sPopupMenuSelection\n\ +_080A57A8: .4byte sPopupMenuActionList\n\ +_080A57AC:\n\ + cmp r0, 0x2\n\ + bhi _080A57B8\n\ + movs r0, 0x2F\n\ + bl sub_8072DCC\n\ + b _080A57BE\n\ +_080A57B8:\n\ + movs r0, 0x30\n\ + bl sub_8072DCC\n\ +_080A57BE:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} + +static void sub_80A57C4(void) +{ + u8 r5; + + sPopupMenuActionList = gUnknown_083C16AE[sCurrentBagPocket]; + if (sCurrentBagPocket == BAG_POCKET_KEY_ITEMS) + { + gUnknown_02038564 = 1; + r5 = 9; + } + else if (sub_80F92F4(gSpecialVar_ItemId) == 0) + { + sPopupMenuActionList = gUnknown_083C16AE[4]; + gUnknown_02038564 = 1; + r5 = 9; + } + else + { + gUnknown_02038564 = 2; + r5 = 7; + } + sub_80A4008(gBGTilemapBuffers[1], 7, r5 + 1, 6, gUnknown_02038564 * 2); + Menu_DrawStdWindowFrame(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5); + sub_80A7834(0, r5); + InitMenu(0, 7, r5 + 1, gUnknown_02038564, 0, 6); +} + +static void sub_80A5888(u8 taskId) +{ + if (sub_80A78A0() != 0) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (sPopupMenuSelection != 0) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = Menu_MoveCursor(-1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (sPopupMenuSelection != gUnknown_02038564 - 1) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = Menu_MoveCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A4DA4(gBGTilemapBuffers[1]); + sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A4DA4(gBGTilemapBuffers[1]); + sItemPopupMenuActions[2].func(taskId); + } + } +} + +static void OnBagClose_Field0(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_805469C >> 16; + gTasks[taskId].data[9] = (u32)sub_805469C; + gLastFieldPokeMenuOpened = 0; + sub_80A5AE4(taskId); +} + +static void OnItemSelect_Field05(u8 taskId) +{ + sPopupMenuSelection = 0; + if (sReturnLocation == RETURN_TO_FIELD_5) + sPopupMenuSelection = 1; + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + if (sub_80F9344() == TRUE && sReturnLocation != RETURN_TO_FIELD_5) + { + sub_80A57C4(); + gTasks[taskId].func = sub_80A5888; + } + else + { + sub_80A4BF0(gBGTilemapBuffers[1]); + if (sCurrentBagPocket != BAG_POCKET_BERRIES || sReturnLocation == RETURN_TO_FIELD_5) + gTasks[taskId].func = sub_80A5414; + else + gTasks[taskId].func = sub_80A5600; + } +} + +static void sub_80A5AAC(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = HandleItemMenuPaletteFade; +} + +static void sub_80A5AE4(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_80A5AAC(taskId); +} + +void HandleItemMenuPaletteFade(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + MainCallback cb = (MainCallback)((u16)taskData[8] << 16 | (u16)taskData[9]); + + SetMainCallback2(cb); + gpu_pal_allocator_reset__manage_upper_four(); + DestroyTask(taskId); + } +} + +void sub_80A5B40(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + ResetTasks(); + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +static void HandlePopupMenuAction_UseOnField(u8 taskId) +{ + if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL) + { + PlaySE(SE_SELECT); + if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1) + { + sub_80A5BF8(taskId); + } + else + { + gTasks[taskId].data[2] = 0; + if (sCurrentBagPocket != BAG_POCKET_BERRIES) + ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); + else + sub_80C9C7C(taskId); + } + } +} + +static void sub_80A5BF8(u8 taskId) +{ + sub_80A73FC(); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gOtherText_NoPokemon, CleanUpItemMenuMessage, 1); +} + +static void sub_80A5C24(u8 taskId) +{ + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +void CleanUpItemMenuMessage(u8 taskId) +{ + sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); + Menu_EraseWindowRect(7, 7, 13, 12); + Menu_EraseWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_80A5C24; +} + +void CleanUpOverworldMessage(u8 taskId) +{ + Menu_EraseWindowRect(0, 13, 29, 19); + DestroyTask(taskId); + sub_8064E2C(); + ScriptContext2_Disable(); +} + +void ExecuteItemUseFromBlackPalette(void) +{ + pal_fill_black(); + CreateTask(Task_CallItemUseOnFieldCallback, 8); +} + +static void Task_CallItemUseOnFieldCallback(u8 taskId) +{ + if (IsWeatherNotFadingIn() == TRUE) + gFieldItemUseCallback(taskId); +} + +void sub_80A5D04(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +static void sub_80A5D38(u8 taskId) +{ + gTasks[taskId].data[1] = 0; + sub_80A4DA4(gBGTilemapBuffers[1]); + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A5D78(void) +{ + sub_80A4008(gBGTilemapBuffers[1], 8, 8, 5, 4); + DisplayYesNoMenu(7, 7, 1); +} + +static void sub_80A5DA0(u16 itemId, u16 quantity) +{ + CopyItemName(itemId, gStringVar1); + if (quantity >= 100) + ConvertIntToDecimalStringN(gStringVar2, quantity, STR_CONV_MODE_LEFT_ALIGN, 3); + else + ConvertIntToDecimalStringN(gStringVar2, quantity, STR_CONV_MODE_LEFT_ALIGN, 2); + sub_80A4DA4(gBGTilemapBuffers[1]); + sub_80A7528(5); + sub_80A5D78(); +} + +static void sub_80A5DF8(void) +{ + sub_80A4DA4(gBGTilemapBuffers[1]); + Menu_EraseWindowRect(7, 6, 11, 13); + sub_80A7528(4); +} + +static void sub_80A5E1C(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + gTasks[taskId].data[10] = 0; + sub_80A41D4(taskId); + sub_80A5D38(taskId); + } +} + +static void sub_80A5E60(u8 taskId) +{ + sub_80A5DF8(); + sub_80A3D5C(taskId); + gTasks[taskId].func = sub_80A5E1C; +} + +static void sub_80A5E90(u8 taskId) +{ + sub_80A5D38(taskId); +} + +static void sub_80A5EA0(u8 taskId) +{ + if (sub_80A5350(taskId) == TRUE) + return; + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80A5DA0(gSpecialVar_ItemId, gTasks[taskId].data[1]); + DoYesNoFuncWithChoice(taskId, &gUnknown_083C16F4); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80A5D38(taskId); + } +} + +static void HandlePopupMenuAction_Toss(u8 taskId) +{ + PlaySE(SE_SELECT); + gTasks[taskId].func = sub_80A5EA0; + sub_80A7528(3); + // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way + if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) + sub_80A4DD8(taskId, 6, 9, 7, 3, 3); + else + sub_80A4DD8(taskId, 7, 9, 6, 3, 2); +} + +static void sub_80A5F80(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void HandlePopupMenuAction_Register(u8 taskId) +{ + PlaySE(SE_SELECT); + if (gSaveBlock1.registeredItem == gSpecialVar_ItemId) + { + // Un-register the registered item + RemoveSelectIconFromRegisteredItem(); + gSaveBlock1.registeredItem = 0; + } + else + { + AddSelectIconToRegisteredItem(); + gSaveBlock1.registeredItem = gSpecialVar_ItemId; + } + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A6000(u8 taskId) +{ + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A6024(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); + Menu_EraseWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_80A6000; + } +} + +static void DisplayCannotBeHeldMessage(u8 taskId) +{ + sub_80A73FC(); + CopyItemName(gSpecialVar_ItemId, gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeld); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1); +} + +static void HandlePopupMenuAction_Give(u8 taskId) +{ + PlaySE(SE_SELECT); + if (sub_80F931C(gSpecialVar_ItemId) == 0) + { + sub_80A73FC(); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1); + } + else if (ItemId_GetImportance(gSpecialVar_ItemId) == 0) + { + if (CalculatePlayerPartyCount() == 0) + { + sub_80A5BF8(taskId); + } + else + { + gTasks[taskId].data[8] = (u32)sub_808B020 >> 16; + gTasks[taskId].data[9] = (u32)sub_808B020; + gTasks[taskId].func = HandleItemMenuPaletteFade; + gUnknown_02038561 = 1; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + } + } + else + { + DisplayCannotBeHeldMessage(taskId); + } +} + +static void HandlePopupMenuAction_CheckTag(u8 taskId) +{ + sub_80A5AE4(taskId); + gTasks[taskId].data[8] = (u32)BerryTagScreen_814625C >> 16; + gTasks[taskId].data[9] = (u32)BerryTagScreen_814625C; +} + +static void sub_80A61A8(void) +{ + if (sub_80A34B4() == TRUE) + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); +} + +void sub_80A61D0(void) +{ + sReturnLocation = RETURN_TO_PKMN_LIST; + SetMainCallback2(sub_80A61A8); +} + +static void OnBagClose_PkmnList(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16; + gTasks[taskId].data[9] = (u32)sub_808A3F8; + sub_80A5AE4(taskId); +} + +static void OnItemSelect_PkmnList(u8 taskId) +{ + u8 r6 = sCurrentBagPocket + 1; + + if (sub_80F931C(gSpecialVar_ItemId) == 0) + { + sub_80A73FC(); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1); + } + else if (sub_80F92F4(gSpecialVar_ItemId) == 0) + { + sub_80A73FC(); + CopyItemName(gSpecialVar_ItemId, gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeldHere); + sub_80A7590(); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1); + } + else if (r6 != 5 && ItemId_GetImportance(gSpecialVar_ItemId) == 0) + { + gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16; + gTasks[taskId].data[9] = (u32)sub_808A3F8; + sub_80A5AAC(taskId); + } + else + { + DisplayCannotBeHeldMessage(taskId); + } +} + +static void sub_80A62D8(void) +{ + if (sub_80A34B4() == TRUE) + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); +} + +void ItemMenu_LoadSellMenu(void) +{ + sReturnLocation = RETURN_TO_SHOP; + SetMainCallback2(sub_80A62D8); +} + +static void OnBagClose_Shop(u8 taskId) +{ + gFieldCallback = Shop_FadeReturnToMartMenu; + gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; + gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; + sub_80A5AE4(taskId); +} + +static void OnItemSelect_Shop(u8 taskId) +{ + sub_80A7590(); + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + CopyItemName(gSpecialVar_ItemId, gStringVar2); + if (ItemId_GetPrice(gSpecialVar_ItemId) == 0) + { + StringExpandPlaceholders(gStringVar4, gOtherText_CantBuyThat); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6444, 1); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_HowManyToSell); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A648C, 1); + } +} + +static void sub_80A640C(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A6444(u8 taskId) +{ + sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); + Menu_EraseWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_80A640C; +} + +static void sub_80A648C(u8 taskId) +{ + gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; + sub_80A4008(gBGTilemapBuffers[1], 1, 11, 12, 2); + Menu_DrawStdWindowFrame(0, 10, 13, 13); + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = 1; + gTasks[taskId].data[3] = 11; + // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way + if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) + sub_80A418C(1, 1, 1, 11, 3); + else + sub_80A418C(1, 1, 1, 11, 2); + BuyMenuDisplayMessage(gSpecialVar_ItemId, 1); + sub_80A683C(); +} + +static void sub_80A6520(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + BuyMenuPrintItemQuantityAndPrice(taskId); + } +} + +static void sub_80A6548(u8 taskId) +{ + sub_80A48F8(taskId); + gTasks[taskId].func = sub_80A6520; +} + +static void sub_80A6574(u8 taskId) +{ + PlaySE(SE_REGI); + sub_80A6870(gSpecialVar_ItemId, gTasks[taskId].data[1]); + gTasks[taskId].func = sub_80A6548; +} + +static void sub_80A65AC(u8 taskId) +{ + Menu_EraseWindowRect(7, 6, 13, 12); + sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); + CopyItemName(gSpecialVar_ItemId, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_SoldItem); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6574, 1); + sub_80A3D5C(taskId); +} + +static void sub_80A6618(u8 taskId) +{ + Menu_EraseWindowRect(7, 6, 13, 12); + sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); + BuyMenuPrintItemQuantityAndPrice(taskId); +} + +static void sub_80A6650(u8 taskId) +{ + sub_80A5D78(); + DoYesNoFuncWithChoice(taskId, &gUnknown_083C16FC); +} + +static void Task_BuyHowManyDialogueHandleInput(u8 taskId) +{ + if (sub_80A5350(taskId) == TRUE) + { + Menu_EraseWindowRect(6, 11, 12, 11); + BuyMenuDisplayMessage(gSpecialVar_ItemId, gTasks[taskId].data[1]); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + Menu_EraseWindowRect(0, 10, 13, 13); + sub_80A36B8(gBGTilemapBuffers[1], 0, 10, 13, 3); + ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6); + StringExpandPlaceholders(gStringVar4, gOtherText_CanPay); + DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6650, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + BuyMenuPrintItemQuantityAndPrice(taskId); + } +} + +static void sub_80A6760(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) +{ + sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); + CloseMoneyWindow(0, 0); + Menu_EraseWindowRect(0, 4, 13, 13); + Menu_EraseWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_80A6760; +} + +static void BuyMenuDisplayMessage(u16 itemId, u16 quantity) +{ + PrintMoneyAmount(ItemId_GetPrice(itemId) / 2 * quantity, 6, 6, 11); + ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(itemId) / 2 * quantity, STR_CONV_MODE_LEFT_ALIGN, 6); +} + +static void sub_80A683C(void) +{ + OpenMoneyWindow(gSaveBlock1.money, 0, 0); + sub_80A4008(gBGTilemapBuffers[1], 1, 1, 12, 2); +} + +static void sub_80A6870(u16 itemId, u8 quantity) +{ + AddMoney(&gSaveBlock1.money, ItemId_GetPrice(itemId) / 2 * quantity); + UpdateMoneyWindow(gSaveBlock1.money, 0, 0); +} + +static void sub_80A68A4(void) +{ + if (sub_80A34B4() == TRUE) + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); +} + +void sub_80A68CC(void) +{ + sCurrentBagPocket = BAG_POCKET_BERRIES; + sReturnLocation = RETURN_TO_FIELD_4; + SetMainCallback2(sub_80A68A4); +} + +static void OnBagClose_Field4(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_80546B8 >> 16; + gTasks[taskId].data[9] = (u32)sub_80546B8; + sub_80A5AE4(taskId); +} + +static void OnItemSelect_Field4(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_80546B8 >> 16; + gTasks[taskId].data[9] = (u32)sub_80546B8; + sub_80A5AAC(taskId); +} + +static void sub_80A6940(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + sub_80A699C(); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_80A6978(void) +{ + sCurrentBagPocket = BAG_POCKET_BERRIES; + sReturnLocation = RETURN_TO_FIELD_5; + SetMainCallback2(sub_80A6940); +} + +static void sub_80A699C(void) +{ + sPopupMenuActionList = gUnknown_083C16B8; + gUnknown_02038564 = 4; +} + +static void OnBagClose_Field5(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_804E990 >> 16; + gTasks[taskId].data[9] = (u32)sub_804E990; + sub_80A5AE4(taskId); +} + +static void HandlePopupMenuAction_Confirm(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_804E990 >> 16; + gTasks[taskId].data[9] = (u32)sub_804E990; + sub_80A5AAC(taskId); +} + +static void sub_80A6A08(void) +{ + if (sub_80A34B4() == TRUE) + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); +} + +void sub_80A6A30(void) +{ + sReturnLocation = RETURN_TO_PC; + SetMainCallback2(sub_80A6A08); +} + +static void OnBagClose_PC(u8 taskId) +{ + gFieldCallback = ItemStorage_ReturnToMenuAfterDeposit; + gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; + gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; + sub_80A5AE4(taskId); +} + +static void sub_80A6A84(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + sub_80A4DA4(gBGTilemapBuffers[1]); + CopyItemName(gSpecialVar_ItemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, taskData[1], STR_CONV_MODE_LEFT_ALIGN, 3); + Menu_EraseWindowRect(7, 6, 11, 13); + sub_80A7528(7); + sub_80A3D5C(taskId); + gTasks[taskId].func = sub_80A5E1C; +} + +static void sub_80A6B00(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + PlaySE(SE_SELECT); + sub_80A5D38(taskId); + } +} + +static void sub_80A6B64(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (ItemId_GetImportance(gSpecialVar_ItemId) == 2) + { + gTasks[taskId].func = sub_80A6B00; + sub_80A7528(9); + } + else + { + if (AddPCItem(gSpecialVar_ItemId, taskData[1]) == TRUE) + { + sub_80A6A84(taskId); + } + else + { + gTasks[taskId].func = sub_80A6B00; + sub_80A7528(8); + } + } +} + +static void sub_80A6BE0(u8 taskId) +{ + if (sub_80A5350(taskId) == TRUE) + return; + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_80A4DA4(gBGTilemapBuffers[1]); + sub_80A6B64(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + PlaySE(SE_SELECT); + sub_80A5D38(taskId); + } +} + +static void OnItemSelect_PC(u8 taskId) +{ + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + PlaySE(SE_SELECT); + sub_80A7590(); + if (sCurrentBagPocket != BAG_POCKET_KEY_ITEMS) + { + gTasks[taskId].func = sub_80A6BE0; + sub_80A7528(6); + // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way + if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) + sub_80A4DD8(taskId, 6, 9, 7, 3, 3); + else + sub_80A4DD8(taskId, 7, 9, 6, 3, 2); + } + else + { + gTasks[taskId].data[1] = 1; + sub_80A6B64(taskId); + } +} + +bool32 sub_80A6D1C(void) +{ + HideMapNamePopup(); + if (gSaveBlock1.registeredItem != 0) + { + if (CheckBagHasItem(gSaveBlock1.registeredItem, 1) == TRUE) + { + u8 taskId; + + ScriptContext2_Enable(); + FreezeMapObjects(); + sub_80594C0(); + sub_80597F4(); + gSpecialVar_ItemId = gSaveBlock1.registeredItem; + taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1.registeredItem), 8); + gTasks[taskId].data[2] = 1; + return TRUE; + } + gSaveBlock1.registeredItem = 0; + } + ScriptContext1_SetupScript(Event_NoRegisteredItem); + return TRUE; +} + +static void sub_80A6D98(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + gUnknown_02038563 = CreateTask(sub_80A50C8, 0); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_80A6DCC(void) +{ + sPopupMenuSelection = 0; + sReturnLocation = RETURN_TO_BATTLE; + SetMainCallback2(sub_80A6D98); +} + +static void sub_80A6DF0(u16 *a) +{ + u8 r6 = (gUnknown_02038564 - 1) * 2; + + Menu_DrawStdWindowFrame(7, 9 - r6, 13, 12); + sub_80A4008(a, 8, 10 - r6, 5, r6 + 2); + if (gUnknown_02038564 == 1) + { + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 10); + } + else + { + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10); + } + InitMenu(0, 8, 10 - r6, gUnknown_02038564, 0, 5); + sub_80A7528(2); +} + +static void sub_80A6EB8(u8 taskId) +{ + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + if (sPopupMenuSelection == 1) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = Menu_MoveCursor(-1); + } + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + if (sPopupMenuSelection + 1 < gUnknown_02038564) + { + PlaySE(SE_SELECT); + sPopupMenuSelection = Menu_MoveCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A4DA4(gBGTilemapBuffers[1]); + sItemPopupMenuActions[sPopupMenuActionList[sPopupMenuSelection]].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].data[10] = 0; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A4DA4(gBGTilemapBuffers[1]); + sItemPopupMenuActions[5].func(taskId); + } +} + +static const u8 gUnknown_083C1708[] = {4, 5}; +static const u8 gUnknown_083C170A[] = {5, 0}; + +static void sub_80A6FDC(void) +{ + if (ItemId_GetBattleUsage(gSpecialVar_ItemId) != 0) + { + sPopupMenuActionList = gUnknown_083C1708; + gUnknown_02038564 = 2; + } + else + { + sPopupMenuActionList = gUnknown_083C170A; + gUnknown_02038564 = 1; + } +} + +static void OnItemSelect_Battle(u8 taskId) +{ + sPopupMenuSelection = 0; + sub_80A6FDC(); + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + sub_80A6DF0(gBGTilemapBuffers[1]); + gTasks[taskId].func = sub_80A6EB8; +} + +void sub_80A7094(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)sub_802E424 >> 16; + gTasks[taskId].data[9] = (u32)sub_802E424; + gTasks[taskId].func = HandleItemMenuPaletteFade; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +static void OnBagClose_Battle(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_80A7094(taskId); +} + +static void HandlePopupMenuAction_UseInBattle(u8 taskId) +{ + if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL) + { + PlaySE(SE_SELECT); + ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); + } +} + +static void sub_80A7124(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_80A7528(0); + sub_80A41D4(taskId); + ItemListMenu_InitMenu(); + sub_80A37C0(taskId); +} + +static void sub_80A7150(void) +{ + while (1) + { + if (SetupBagMultistep() == TRUE) + { + gUnknown_02038563 = CreateTask(sub_80A7230, 0); + gTasks[gUnknown_02038563].data[15] = 0; + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void PrepareBagForWallyTutorial(void) +{ + u8 i; + + sPopupMenuSelection = 0; + sCurrentBagPocket = BAG_POCKET_ITEMS; + for (i = 0; i < 5; i++) + { + gBagPocketScrollStates[i].cursorPos = 0; + gBagPocketScrollStates[i].scrollTop = 0; + } + + // Save player's items + memcpy(ewramSavedItemsPocket, gSaveBlock1.bagPocket_Items, sizeof(gSaveBlock1.bagPocket_Items)); + memcpy(ewramSavedPokeballsPocket, gSaveBlock1.bagPocket_PokeBalls, sizeof(gSaveBlock1.bagPocket_PokeBalls)); + + // Add Wally's items to the bag + ClearItemSlots(gSaveBlock1.bagPocket_Items, ARRAY_COUNT(gSaveBlock1.bagPocket_Items)); + ClearItemSlots(gSaveBlock1.bagPocket_PokeBalls, ARRAY_COUNT(gSaveBlock1.bagPocket_PokeBalls)); + AddBagItem(ITEM_POTION, 1); + AddBagItem(ITEM_POKE_BALL, 1); + + sReturnLocation = RETURN_TO_WALLY_BATTLE; + SetMainCallback2(sub_80A7150); +} + +static void sub_80A7230(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + switch (taskData[15]) + { + case 102: + PlaySE(SE_SELECT); + sub_80A4E8C(1, 2); + break; + case 204: + PlaySE(SE_SELECT); + StopVerticalScrollIndicators(LEFT_ARROW); + StopVerticalScrollIndicators(RIGHT_ARROW); + gSpecialVar_ItemId = ITEM_POKE_BALL; + sPopupMenuActionList = gUnknown_083C1708; + gUnknown_02038564 = 2; + gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1; + sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos); + sub_80A73FC(); + sub_80A6DF0(gBGTilemapBuffers[1]); + break; + case 306: + PlaySE(SE_SELECT); + sub_80A4DA4(gBGTilemapBuffers[1]); + + // Restore player's items + memcpy(gSaveBlock1.bagPocket_Items, ewramSavedItemsPocket, sizeof(gSaveBlock1.bagPocket_Items)); + memcpy(gSaveBlock1.bagPocket_PokeBalls, ewramSavedPokeballsPocket, sizeof(gSaveBlock1.bagPocket_PokeBalls)); + + taskData[8] = (u32)sub_802E424 >> 16; + taskData[9] = (u32)sub_802E424; + gTasks[taskId].func = HandleItemMenuPaletteFade; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + return; + } + taskData[15]++; +} + +static void ItemListMenu_InitMenu(void) +{ + InitMenu(0, 14, 2, gBagPocketScrollStates[sCurrentBagPocket].cursorMax + 1, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, 0); + CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 15); + sub_80A73C0(); +} + +static void sub_80A73C0(void) +{ + MenuCursor_SetPos814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16); +} + +static void sub_80A73F0(void) +{ + sub_814ADC8(); +} + +static void sub_80A73FC(void) +{ + Menu_DestroyCursor(); + MenuCursor_Destroy814AD44(); +} + +static void sub_80A740C(void) +{ + sub_80A75E4(); + sub_80A7768(); + sub_80A7420(); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 0); +#endif +} + +static void sub_80A7420(void) +{ + struct UnknownStruct2 *unkStruct = &gUnknown_0203853C; + int index; + + switch (unkStruct->unk0) + { + case 3: + unkStruct->unk0 = 2; + break; + case 2: + switch (unkStruct->unk2) + { + case 0: + index = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; + ItemListMenu_ChangeDescription(gCurrentBagPocketItemSlots[index].itemId, unkStruct->textLine); + break; + case 1: + sub_80A4A98(gOtherText_SwitchWhichItem, unkStruct->textLine); + break; + case 2: + sub_80A4A98(gOtherText_WhatWillYouDo2, unkStruct->textLine); + break; + case 3: + sub_80A4A98(gOtherText_HowManyToToss, unkStruct->textLine); + break; + case 4: + sub_80A4A98(gOtherText_ThrewAwayItem, unkStruct->textLine); + break; + case 5: + sub_80A4A98(gOtherText_OkayToThrowAwayPrompt, unkStruct->textLine); + break; + case 6: + sub_80A4A98(gOtherText_HowManyToDeposit, unkStruct->textLine); + break; + case 7: + sub_80A4A98(gOtherText_DepositedItems, unkStruct->textLine); + break; + case 8: + sub_80A4A98(gOtherText_NoRoomForItems, unkStruct->textLine); + break; + case 9: + sub_80A4A98(gOtherText_CantStoreSomeoneItem, unkStruct->textLine); + break; + } + unkStruct->textLine++; + if (unkStruct->textLine == 3) + { + unkStruct->unk0 = 0; + sub_80A7918(); + } + break; + } +} + +static void sub_80A751C(void) +{ + gUnknown_0203853C.unk0 = 0; +} + +static void sub_80A7528(u8 a) +{ + gUnknown_0203853C.textLine = 0; + gUnknown_0203853C.unk2 = a; + switch (sub_80A78F4()) + { + case 0: + gUnknown_0203853C.unk0 = 2; + while (gUnknown_0203853C.unk0 != 0) + sub_80A7420(); + break; + case 1: + gUnknown_0203853C.unk0 = 3; + break; + case 2: + gUnknown_0203853C.unk0 = 1; + break; + } +} + +static void sub_80A756C(void) +{ + if (gUnknown_0203853C.unk0 == 2 || gUnknown_0203853C.unk0 == 3) + sub_80A7918(); + gUnknown_0203853C.unk0 = 0; +} + +static void sub_80A7590(void) +{ + Menu_EraseWindowRect(0, 13, 13, 20); + sub_80A756C(); +} + +static void sub_80A75A8(void) +{ + if (gUnknown_0203853C.unk0 == 2 || gUnknown_0203853C.unk0 == 3) + gUnknown_0203853C.unk0 = 1; +} + +static void sub_80A75C4(void) +{ + switch (gUnknown_0203853C.unk0) + { + case 1: + gUnknown_0203853C.unk0 = 3; + break; + case 0: + sub_80A7918(); + break; + } +} + +static void sub_80A75E4(void) +{ + if (gUnknown_02038540.unk0 == 1 && sub_80A7988() == 0) + { + int r1; + + sub_80A47E8(gUnknown_02038563, gUnknown_02038540.unk1, gUnknown_02038540.unk1, 1); + gUnknown_02038540.unk1++; + if (gUnknown_02038540.unk2 != 0) + r1 = 5; + else + r1 = 7; + if (r1 < gUnknown_02038540.unk1) + { + gUnknown_02038540.unk0 = 0; + sub_80A78E8(); + } + } +} + +static void sub_80A7630(void) +{ + gUnknown_02038540.unk0 = 0; +} + +static void sub_80A763C(void) +{ + struct UnknownStruct3 *r4 = &gUnknown_02038540; + + switch (sub_80A78C4()) + { + case FALSE: + sub_80A48E8(gUnknown_02038563, 0, 7); + break; + case TRUE: + r4->unk0 = 1; + r4->unk1 = 0; + r4->unk2 = 0; + break; + } +} + +static void sub_80A7678(void) +{ + if (gUnknown_02038540.unk0 == 1) + sub_80A78E8(); + gUnknown_02038540.unk0 = 0; +} + +static void sub_80A7694(void) +{ + gUnknown_02038540.unk2 = 1; +} + +static void sub_80A76A0(void) +{ + Menu_EraseWindowRect(14, 2, 29, 18); + sub_80A7678(); +} + +static bool32 sub_80A76B8(void) +{ + struct UnknownStruct3 *s = &gUnknown_02038540; + + return (s->unk0 == 0); +} + +static bool32 sub_80A76D0(void) +{ + struct UnknownStruct3 *s = &gUnknown_02038540; + + return (s->unk1 > 5); +} + +static void sub_80A76E8(void) +{ + if (gUnknown_02038544.unk0 == 1) + { + DisplayItemMessageOnField( + gUnknown_02038544.unk1, + gUnknown_02038544.unk4, + gUnknown_02038544.unk8, + gUnknown_02038544.unk2); + gUnknown_02038544.unk0 = 0; + } +} + +static void sub_80A770C(void) +{ + gUnknown_02038544.unk0 = 0; +} + +static void DisplayCannotUseItemMessage(int a, const u8 *b, TaskFunc func, int d) +{ + struct UnknownStruct4 *r4 = &gUnknown_02038544; + + switch (sub_80A7924()) + { + case 0: + DisplayItemMessageOnField(a, b, func, d); + break; + case 2: + r4->unk0 = 1; + r4->unk1 = a; + r4->unk4 = b; + r4->unk8 = func; + r4->unk2 = d; + break; + } +} + +static void sub_80A7768(void) +{ + struct UnknownStruct5 *r4 = &gUnknown_02038550; + + if (r4->unk0 == 2) + { + if (r4->unk1 != 0) + { + if (r4->unk2 != 1) + { + const u8 *text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; + int var = r4->unk1 - 1; + + Menu_PrintText(text, 7, var * 2 + 1 + r4->unk3); + } + else + { + const u8 *text; + int var; + + if (r4->unk1 == 1) + text = sub_80A4B90(gSpecialVar_ItemId); + else + text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; + var = r4->unk1 - 1; + Menu_PrintText(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8); + } + if (r4->unk1 == gUnknown_02038564) + { + r4->unk0 = 0; + sub_80A7970(); + } + } + r4->unk1++; + } +} + +static void sub_80A7828(void) +{ + gUnknown_02038550.unk0 = 0; +} + +static void sub_80A7834(int a, int b) +{ + struct UnknownStruct5 *r4 = &gUnknown_02038550; + + switch (sub_80A7958()) + { + case 1: + r4->unk0 = 2; + r4->unk1 = 0; + r4->unk2 = a; + r4->unk3 = b; + break; + case 2: + r4->unk0 = 1; + r4->unk1 = 0; + r4->unk2 = a; + r4->unk3 = b; + break; + } +} + +static void sub_80A7868(void) +{ + if (gUnknown_02038550.unk0 == 2) + gUnknown_02038550.unk0 = 1; +} + +static void sub_80A7880(void) +{ + switch (gUnknown_02038550.unk0) + { + case 1: + gUnknown_02038550.unk0 = 2; + break; + case 0: + sub_80A7970(); + break; + } +} + +static bool32 sub_80A78A0(void) +{ + struct UnknownStruct5 *r0 = &gUnknown_02038550; + + return (r0->unk0 == 0); +} + +static void sub_80A78B8(void) +{ + gUnknown_02038554.unk0 = 0; +} + +static bool32 sub_80A78C4(void) +{ + bool32 retVal; + + if (gLinkOpen == TRUE) + { + sub_80A7868(); + sub_80A75A8(); + retVal = TRUE; + } + else + { + retVal = FALSE; + } + return retVal; +} + +static void sub_80A78E8(void) +{ + sub_80A7880(); +} + +static int sub_80A78F4(void) +{ + int retVal; + + if (gLinkOpen == TRUE) + { + if (sub_80A76B8() != 0) + retVal = 1; + else + retVal = 2; + } + else + { + retVal = 0; + } + return retVal; +} + +static void sub_80A7918(void) +{ + sub_80A76E8(); +} + +static int sub_80A7924(void) +{ + if (gLinkOpen == TRUE && sub_80A76B8() == 0) + { + if (sub_80A76D0() != 0) + { + sub_80A7678(); + return 0; + } + } + else + { + return 0; + } + sub_80A7694(); + return 2; +} + +static int sub_80A7958(void) +{ + if (sub_80A76B8() == 0) + return 2; + sub_80A75A8(); + return 1; +} + +static void sub_80A7970(void) +{ + sub_80A75C4(); +} + +static void sub_80A797C(void) +{ + gUnknown_02038554.unk0 = 1; +} + +static int sub_80A7988(void) +{ + int val = gUnknown_02038554.unk0; + + gUnknown_02038554.unk0 = 0; + return val; +} + +static const u16 gPalette_83C170C[] = INCBIN_U16("graphics/unknown/83C170C.gbapal"); +static const u8 gSpriteImage_83C172C[] = INCBIN_U8("graphics/unknown_sprites/83C172C.4bpp"); + +const u8 gSpriteImage_UnusedCherry[] = INCBIN_U8("graphics/unused/cherry.4bpp"); +const u16 gSpritePalette_UnusedCherry[] = INCBIN_U16("graphics/unused/cherry.gbapal"); + +//------------------------------------------------------------------------------ +// Bag Sprite +//------------------------------------------------------------------------------ + +static const struct OamData sBagSpriteOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 7, + .affineParam = 0, +}; + +static const union AnimCmd sBagSpriteAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq1[] = +{ + ANIMCMD_FRAME(64, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq5[] = +{ + ANIMCMD_FRAME(128, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq2[] = +{ + ANIMCMD_FRAME(192, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq3[] = +{ + ANIMCMD_FRAME(256, 4), + ANIMCMD_END, +}; + +static const union AnimCmd sBagSpriteAnimSeq4[] = +{ + ANIMCMD_FRAME(320, 4), + ANIMCMD_END, +}; + +static const union AnimCmd *const sBagSpriteAnimTable[] = +{ + sBagSpriteAnimSeq0, + sBagSpriteAnimSeq1, + sBagSpriteAnimSeq2, + sBagSpriteAnimSeq3, + sBagSpriteAnimSeq4, + sBagSpriteAnimSeq5, +}; + +static const union AffineAnimCmd sBagSpriteAffineAnimSeq[] = +{ + AFFINEANIMCMD_FRAME(0, 0, -2, 2), + AFFINEANIMCMD_FRAME(0, 0, 2, 4), + AFFINEANIMCMD_FRAME(0, 0, -2, 4), + AFFINEANIMCMD_FRAME(0, 0, 2, 2), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sBagSpriteAffineAnimTable[] = +{ + sBagSpriteAffineAnimSeq, +}; + +static const struct CompressedSpriteSheet sMaleBagSpriteSheet = {gBagMaleTiles, 0x3000, 30000}; +static const struct CompressedSpriteSheet sFemaleBagSpriteSheet = {gBagFemaleTiles, 0x3000, 30000}; +static const struct CompressedSpritePalette sBagSpritePalette = {gBagPalette, 30000}; + +static void sub_80A7998(struct Sprite *sprite) +{ + sprite->animNum = 0; + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = 0; + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->callback = sub_80A79B4; +} + +static void sub_80A79B4(struct Sprite *sprite) +{ + if (gUnknown_0203855B != -1) + sub_80A79EC(sprite); + if (gUnknown_0203855C != 0) + sub_80A7A94(sprite); +} + +static void sub_80A79EC(struct Sprite *sprite) +{ + switch (sprite->data[3]) + { + case 0: + if (gUnknown_0203855B != 6) + { + sprite->animBeginning = TRUE; + sprite->animNum = gUnknown_0203855B; + gUnknown_0203855B = -1; + } + else + { + sprite->animBeginning = TRUE; + sprite->animNum = 0; + sprite->pos1.y -= 4; + sprite->data[0] = 4; + sprite->data[3] = 1; + sub_80A7AE4(sprite); + } + break; + case 1: + if (sprite->data[0] != 0) + { + if (sprite->data[1] != 0) + { + sprite->pos1.y++; + sprite->data[0]--; + } + sprite->data[1] = (sprite->data[1] + 1) & 1; + } + else + { + gUnknown_0203855B = -1; + sprite->data[1] = 0; + sprite->data[3] = 0; + } + break; + } +} + +static void sub_80A7A94(struct Sprite *sprite) +{ + switch (sprite->data[4]) + { + case 0: + sprite->oam.affineMode = 1; + sprite->affineAnims = sBagSpriteAffineAnimTable; + InitSpriteAffineAnim(sprite); + sprite->data[4] = 1; + break; + case 1: + sprite->data[2]++; + if (sprite->data[2] == 12) + sub_80A7AE4(sprite); + break; + } +} + +static void sub_80A7AE4(struct Sprite *sprite) +{ + gUnknown_0203855C = 0; + sprite->oam.affineMode = 0; + sprite->data[2] = 0; + sprite->data[4] = 0; + FreeOamMatrix(sprite->oam.matrixNum); +} + +static const struct SpriteTemplate sBagSpriteTemplate = +{ + .tileTag = 30000, + .paletteTag = 30000, + .oam = &sBagSpriteOamData, + .anims = sBagSpriteAnimTable, + .images = NULL, + .affineAnims = sBagSpriteAffineAnimTable, + .callback = sub_80A7998, +}; + +static void CreateBagSprite(void) +{ + CreateSprite(&sBagSpriteTemplate, 58, 40, 0); +} + +//------------------------------------------------------------------------------ +// Pokeball Sprite +//------------------------------------------------------------------------------ + +static const struct OamData gOamData_83C1CF8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 4, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 8, + .affineParam = 0, +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83C1D00[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 8, 32), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83C1D10[] = +{ + AFFINEANIMCMD_FRAME(0, 0, -8, 32), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83C1D20[] = +{ + gSpriteAffineAnim_83C1D00, + gSpriteAffineAnim_83C1D10, +}; + +static const struct SpriteFrameImage gSpriteImageTable_83C1D28[] = +{ + {gSpriteImage_83C172C, sizeof(gSpriteImage_83C172C)}, +}; + +static const struct SpritePalette sPokeballSpritePalette = {gPalette_83C170C, 8}; + +static void sub_80A7B28(struct Sprite *sprite) +{ + sprite->data[3] = 0; + sprite->data[0] = 0; + sub_80A7B6C(sprite); + sprite->callback = sub_80A7B6C; +} + +static void sub_80A7B48(struct Sprite *sprite) +{ + sprite->centerToCornerVecX = sprite->data[5] - ((sprite->data[0] + 1) & 1); + sprite->centerToCornerVecY = sprite->data[6] - ((sprite->data[0] + 1) & 1); +} + +static void sub_80A7B6C(struct Sprite *sprite) +{ + if (sprite->data[7] != 0) + { + switch (sprite->data[3]) + { + case 0: + sprite->oam.affineMode = 1; + if (sprite->data[7] == 1) + sprite->affineAnims = gSpriteAffineAnimTable_83C1D20; + else + sprite->affineAnims = gSpriteAffineAnimTable_83C1D20 + 1; + InitSpriteAffineAnim(sprite); + sprite->data[3] = 1; + sprite->data[5] = sprite->centerToCornerVecX; + sprite->data[6] = sprite->centerToCornerVecY; + sub_80A7B48(sprite); + break; + case 1: + sprite->data[0]++; + sub_80A7B48(sprite); + if (sprite->data[0] == 32) + { + sprite->data[0] = 0; + sprite->data[3] = 0; + sprite->centerToCornerVecX = sprite->data[5]; + sprite->centerToCornerVecY = sprite->data[6]; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + sprite->callback = SpriteCallbackDummy; + } + break; + } + } +} + +static const struct SpriteTemplate sPokeballSpriteTemplate = +{ + .tileTag = 0xFFFF, + .paletteTag = 8, + .oam = &gOamData_83C1CF8, + .anims = sBagSpriteAnimTable, + .images = gSpriteImageTable_83C1D28, + .affineAnims = gSpriteAffineAnimTable_83C1D20, + .callback = sub_80A7B28, +}; + +static void CreateBagPokeballSprite(u8 a) +{ + LoadSpritePalette(&sPokeballSpritePalette); + sPokeballSpriteId = CreateSprite(&sPokeballSpriteTemplate, 16, 88, 0); + gSprites[sPokeballSpriteId].data[7] = a; +} + +static void sub_80A7C64(void) +{ + FreeSpritePaletteByTag(8); + FreeOamMatrix(gSprites[sPokeballSpriteId].oam.matrixNum); + DestroySprite(&gSprites[sPokeballSpriteId]); +} + +static const struct OamData sBerrySpriteOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 7, + .affineParam = 0, +}; + +static const struct OamData gOamData_83C1D58 = +{ + .y = 0, + .affineMode = 3, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 7, + .affineParam = 0, +}; + +static const union AnimCmd sBerrySpriteAnimSeq[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const sBerrySpriteAnimTable[] = +{ + sBerrySpriteAnimSeq, +}; + +static const struct SpriteFrameImage sBerrySpriteImageTable[] = +{ + {ewramBerryPic, 0x800}, +}; + +static void SpriteCB_BerrySprite(struct Sprite *); +static const struct SpriteTemplate sBerrySpriteTemplate = +{ + .tileTag = 0xFFFF, + .paletteTag = 30020, + .oam = &sBerrySpriteOamData, + .anims = sBerrySpriteAnimTable, + .images = sBerrySpriteImageTable, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_BerrySprite, +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83C1D8C[] = +{ + AFFINEANIMCMD_FRAME(-1, -1, -3, 96), + AFFINEANIMCMD_FRAME(0, 0, 0, 16), + AFFINEANIMCMD_FRAME(-2, -2, -1, 64), + AFFINEANIMCMD_FRAME(-8, 0, 0, 16), + AFFINEANIMCMD_FRAME(0, -8, 0, 16), + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83C1DC4[] = +{ + AFFINEANIMCMD_FRAME(-1, -1, 3, 96), + AFFINEANIMCMD_FRAME(0, 0, 0, 16), + AFFINEANIMCMD_FRAME(-2, -2, 1, 64), + AFFINEANIMCMD_FRAME(-8, 0, 0, 16), + AFFINEANIMCMD_FRAME(0, -8, 0, 16), + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83C1DFC[] = +{ + gSpriteAffineAnim_83C1D8C, + gSpriteAffineAnim_83C1DC4, +}; + +static const struct SpriteTemplate gSpriteTemplate_83C1E04 = +{ + .tileTag = 0xFFFF, + .paletteTag = 30020, + .oam = &gOamData_83C1D58, + .anims = sBerrySpriteAnimTable, + .images = sBerrySpriteImageTable, + .affineAnims = gSpriteAffineAnimTable_83C1DFC, + .callback = SpriteCallbackDummy, +}; + +static const struct {const u8 *lzPic; const u8 *lzPalette;} sBerryGraphicsTable[] = +{ + {gBerryPic_Cheri, gBerryPalette_Cheri}, + {gBerryPic_Chesto, gBerryPalette_Chesto}, + {gBerryPic_Pecha, gBerryPalette_Pecha}, + {gBerryPic_Rawst, gBerryPalette_Rawst}, + {gBerryPic_Aspear, gBerryPalette_Aspear}, + {gBerryPic_Leppa, gBerryPalette_Leppa}, + {gBerryPic_Oran, gBerryPalette_Oran}, + {gBerryPic_Persim, gBerryPalette_Persim}, + {gBerryPic_Lum, gBerryPalette_Lum}, + {gBerryPic_Sitrus, gBerryPalette_Sitrus}, + {gBerryPic_Figy, gBerryPalette_Figy}, + {gBerryPic_Wiki, gBerryPalette_Wiki}, + {gBerryPic_Mago, gBerryPalette_Mago}, + {gBerryPic_Aguav, gBerryPalette_Aguav}, + {gBerryPic_Iapapa, gBerryPalette_Iapapa}, + {gBerryPic_Razz, gBerryPalette_Razz}, + {gBerryPic_Bluk, gBerryPalette_Bluk}, + {gBerryPic_Nanab, gBerryPalette_Nanab}, + {gBerryPic_Wepear, gBerryPalette_Wepear}, + {gBerryPic_Pinap, gBerryPalette_Pinap}, + {gBerryPic_Pomeg, gBerryPalette_Pomeg}, + {gBerryPic_Kelpsy, gBerryPalette_Kelpsy}, + {gBerryPic_Qualot, gBerryPalette_Qualot}, + {gBerryPic_Hondew, gBerryPalette_Hondew}, + {gBerryPic_Grepa, gBerryPalette_Grepa}, + {gBerryPic_Tamato, gBerryPalette_Tamato}, + {gBerryPic_Cornn, gBerryPalette_Cornn}, + {gBerryPic_Magost, gBerryPalette_Magost}, + {gBerryPic_Rabuta, gBerryPalette_Rabuta}, + {gBerryPic_Nomel, gBerryPalette_Nomel}, + {gBerryPic_Spelon, gBerryPalette_Spelon}, + {gBerryPic_Pamtre, gBerryPalette_Pamtre}, + {gBerryPic_Watmel, gBerryPalette_Watmel}, + {gBerryPic_Durin, gBerryPalette_Durin}, + {gBerryPic_Belue, gBerryPalette_Belue}, + {gBerryPic_Liechi, gBerryPalette_Liechi}, + {gBerryPic_Ganlon, gBerryPalette_Ganlon}, + {gBerryPic_Salac, gBerryPalette_Salac}, + {gBerryPic_Petaya, gBerryPalette_Petaya}, + {gBerryPic_Apicot, gBerryPalette_Apicot}, + {gBerryPic_Lansat, gBerryPalette_Lansat}, + {gBerryPic_Starf, gBerryPalette_Starf}, + {gBerryPic_Enigma, gBerryPalette_Enigma}, +}; + +static void DrawBerryPic(const u8 *src, u8 *dst) +{ + u8 i; + u8 j; + + memset(dst, 0, 0x800); + dst += 0x100; + for (i = 0; i < 6; i++) + { + dst += 32; + for (j = 0; j < 6; j++) + { + memcpy(dst, src, 32); + dst += 32; + src += 32; + } + if (i != 5) + dst += 32; + } +} + +static void LoadBerryPic(u8 berryId) +{ + struct SpritePalette spritePal; + + if (berryId == 0x2A && IsEnigmaBerryValid() == TRUE) + { + DrawBerryPic(gSaveBlock1.enigmaBerry.pic, ewramBerryPic); + spritePal.data = gSaveBlock1.enigmaBerry.palette; + spritePal.tag = 0x7544; + LoadSpritePalette(&spritePal); + } + else + { + spritePal.data = (u16 *)sBerryGraphicsTable[berryId].lzPalette; + spritePal.tag = 0x7544; + LoadCompressedObjectPalette((struct CompressedSpritePalette *)&spritePal); + LZDecompressWram(sBerryGraphicsTable[berryId].lzPic, ewramBerryPicTemp); + DrawBerryPic(ewramBerryPicTemp, ewramBerryPic); + } +} + +u8 CreateBerrySprite(u8 berryId, s16 x, s16 y) +{ + LoadBerryPic(berryId); + return CreateSprite(&sBerrySpriteTemplate, x, y, 0); +} + +static void SpriteCB_BerrySprite(struct Sprite *sprite) +{ + sprite->pos2.y = -gBattle_BG1_Y; +} + +void sub_80A7DD4(void) +{ + FreeSpritePaletteByTag(0x7544); + FreeSpritePaletteByTag(8); +} + +u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate) +{ + u8 spriteId; + + FreeSpritePaletteByTag(0x7544); + LoadBerryPic(berryId); + spriteId = CreateSprite(&gSpriteTemplate_83C1E04, x, y, 0); + if (animate == TRUE) + StartSpriteAffineAnim(&gSprites[spriteId], 1); + return spriteId; +} + +const struct CompressedSpriteSheet gUnknown_083C1F74 = {gBerryCheckCircle_Gfx, 2048, 0x2710}; + +const struct CompressedSpritePalette gUnknown_083C1F7C = {gBerryCheck_Pal, 0x2710}; + +static const struct OamData gOamData_83C1F84 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_83C1F8C[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_83C1F94[] = +{ + gSpriteAnim_83C1F8C, +}; + +static const struct SpriteTemplate gSpriteTemplate_83C1F98 = +{ + .tileTag = 10000, + .paletteTag = 10000, + .oam = &gOamData_83C1F84, + .anims = gSpriteAnimTable_83C1F94, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_BerrySprite, +}; + +u8 sub_80A7E5C(s16 x) +{ + return CreateSprite(&gSpriteTemplate_83C1F98, x, 99, 0); +} diff --git a/src/item_use.c b/src/item_use.c new file mode 100644 index 000000000..a0fbb13b2 --- /dev/null +++ b/src/item_use.c @@ -0,0 +1,1200 @@ +#include "global.h" +#include "item_use.h" +#include "battle.h" +#include "berry.h" +#include "bike.h" +#include "coins.h" +#include "data2.h" +#include "event_data.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "item.h" +#include "item_menu.h" +#include "constants/flags.h" +#include "constants/items.h" +#include "mail.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu.h" +#include "menu_helpers.h" +#include "metatile_behavior.h" +#include "palette.h" +#include "party_menu.h" +#include "pokeblock.h" +#include "pokemon_item_effect.h" +#include "pokemon_menu.h" +#include "overworld.h" +#include "rom_8094928.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "constants/vars.h" + +extern void (*gFieldItemUseCallback)(u8); +extern void (*gFieldCallback)(void); +extern void (*gUnknown_0300485C)(void); +extern void (*gPokemonItemUseCallback)(u8, u16, TaskFunc); + +extern u8 gUnknown_02038561; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gBankInMenu; + +extern u8 gUnknown_081A1654[]; +extern u8 gUnknown_081A168F[]; + +extern u16 gBattlePartyID[]; + +extern u16 gBattleTypeFlags; + +static const u8 gSSTidalBetaString[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); +static const u8 gSSTidalBetaString2[] = _("この チケットで ふねに のりほうだい\nはやく のってみたいな"); + +static const u8 *const gUnknown_083D61DC[2] = +{ + gSSTidalBetaString, + gSSTidalBetaString2, +}; + +static const MainCallback gExitToOverworldFuncList[] = +{ + sub_808B020, + c2_exit_to_overworld_2_switch, + sub_810B96C, +}; + +static const u8 gItemFinderDirections[] = { DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST }; + +static const struct YesNoFuncTable gUnknown_083D61F4 = +{ + .yesFunc = sub_80C9FC0, + .noFunc = CleanUpItemMenuMessage, +}; + +void ExecuteSwitchToOverworldFromItemUse(u8 taskId) +{ + u8 taskData; + + if (gSpecialVar_ItemId == 0xAF) + taskData = gTasks[taskId].data[15] - 1; + else + taskData = ItemId_GetType(gSpecialVar_ItemId) - 1; + + gTasks[taskId].data[8] = (u32)gExitToOverworldFuncList[taskData] >> 16; + gTasks[taskId].data[9] = (u32)gExitToOverworldFuncList[taskData]; + gTasks[taskId].func = HandleItemMenuPaletteFade; +} + +void ItemMenu_ConfirmNormalFade(u8 var) +{ + ExecuteSwitchToOverworldFromItemUse(var); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void ItemMenu_ConfirmComplexFade(u8 var) +{ + ExecuteSwitchToOverworldFromItemUse(var); + FadeScreen(1, 0); +} + +void SetUpItemUseOnFieldCallback(u8 taskId) +{ + if (gTasks[taskId].data[2] != 1) + { + gFieldCallback = ExecuteItemUseFromBlackPalette; + ItemMenu_ConfirmNormalFade(taskId); + } + else + { + gFieldItemUseCallback(taskId); + } +} + +void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) +{ + StringExpandPlaceholders(gStringVar4, text); + + switch (playerMenuStatus) + { + case 0: // Item Menu + Menu_EraseWindowRect(0, 13, 13, 20); + DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1); + break; + default: // Field + DisplayItemMessageOnField(var1, gStringVar4, CleanUpOverworldMessage, 0); + break; + } +} + +void DisplayDadsAdviceCannotUseItemMessage(u8 var1, u8 playerMenuStatus) +{ + HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_DadsAdvice); +} + +void DisplayCantGetOffBikeItemMessage(u8 var1, u8 playerMenuStatus) +{ + HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_CantGetOffBike); +} + +u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId) +{ + if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM) + return 1; + else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone) + return 2; + else + return 0; +} + +void ItemMenu_ReadMail(u8 taskId) +{ + struct MailStruct mailStruct; + + if (!gPaletteFade.active) + { + mailStruct.itemId = gSpecialVar_ItemId; + HandleReadMail(&mailStruct, sub_80A5D04, 0); + DestroyTask(taskId); + } +} + +void ItemUseOutOfBattle_Mail(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = ItemMenu_ReadMail; +} + +void ItemUseOutOfBattle_Bike(u8 taskId) +{ + s16 x, y; + u8 tileBehavior; + + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + + if (FlagGet(FLAG_SYS_CYCLING_ROAD) == TRUE // on cycling road? + || MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE + || MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE + || MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE + || MetatileBehavior_IsIsolatedHorizontalRail(tileBehavior) == TRUE) + { + DisplayCantGetOffBikeItemMessage(taskId, gTasks[taskId].data[2]); + } + else + { + if (Overworld_IsBikingAllowed() == TRUE && IsBikingDisallowedByPlayer() == FALSE) + { + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Bike; + SetUpItemUseOnFieldCallback(taskId); + } + else + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void ItemUseOnFieldCB_Bike(u8 taskId) +{ + if (ItemId_GetSecondaryId(gSpecialVar_ItemId) == 0) + GetOnOffBike(2); + if (ItemId_GetSecondaryId(gSpecialVar_ItemId) == 1) + GetOnOffBike(4); + + sub_8064E2C(); + ScriptContext2_Disable(); + DestroyTask(taskId); +} + +bool32 CanFish(void) +{ + s16 x, y; + u16 tileBehavior; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + + if (MetatileBehavior_IsWaterfall(tileBehavior)) + return FALSE; + + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) + return FALSE; + + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + { + if (IsPlayerFacingSurfableFishableWater()) + return TRUE; + } + else + { + if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior) && !MapGridIsImpassableAt(x, y)) + return TRUE; + if (MetatileBehavior_IsBridge(tileBehavior) == TRUE) + return TRUE; + } + + return FALSE; +} + +void ItemUseOutOfBattle_Rod(u8 taskId) +{ + if (CanFish() == TRUE) + { + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Rod; + SetUpItemUseOnFieldCallback(taskId); + } + else + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); +} + +void ItemUseOnFieldCB_Rod(u8 taskId) +{ + StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId)); + DestroyTask(taskId); +} + +void ItemUseOutOfBattle_Itemfinder(u8 var) +{ + IncrementGameStat(GAME_STAT_USED_ITEMFINDER); + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Itemfinder; + SetUpItemUseOnFieldCallback(var); +} + +void ItemUseOnFieldCB_Itemfinder(u8 taskId) +{ + if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE) + gTasks[taskId].func = RunItemfinderResults; + else + DisplayItemMessageOnField(taskId, gOtherText_NoResponse, ExitItemfinder, 0); +} + +void RunItemfinderResults(u8 taskId) +{ + u8 playerDir; + u8 playerDirToItem; + u8 i; + s16 *data = gTasks[taskId].data; + + if (!data[3]) + { + if (data[4] == 4) + { + playerDirToItem = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]); + if (playerDirToItem) + { + SetPlayerDirectionTowardsItem(gItemFinderDirections[playerDirToItem - 1]); + gTasks[taskId].func = DisplayItemRespondingMessageAndExitItemfinder; + } + else // player is above hidden item. + { + playerDir = player_get_direction_lower_nybble(); + + // rotate player clockwise depending on current direction. + for (i = 0; i < 4; i++) + if (playerDir == gItemFinderDirections[i]) + data[5] = (i + 1) & 3; + + gTasks[taskId].func = RotatePlayerAndExitItemfinder; + data[3] = 0; + data[2] = 0; + } + return; + } + PlaySE(SE_DAUGI); // play the itemfinder jingle 4 times before executing the itemfinder. + data[4]++; + } + data[3] = (data[3] + 1) & 0x1F; +} + +void ExitItemfinder(u8 taskId) +{ + Menu_EraseWindowRect(0, 14, 29, 19); + sub_8064E2C(); + ScriptContext2_Disable(); + DestroyTask(taskId); +} + +bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId) +{ + int distanceX, distanceY; + u16 x, y; + s16 newDistanceX, newDistanceY, i; + + PlayerGetDestCoords(&x, &y); + gTasks[taskId].data[2] = FALSE; + + for (i = 0; i < events->bgEventCount; i++) + { + if ((events -> bgEvents[i].kind == 7) && !FlagGet(events -> bgEvents[i].bgUnion.hiddenItem.hiddenItemId + FLAG_HIDDEN_ITEMS_START)) + { + // do a distance lookup of each item so long as the index remains less than the objects on the current map. + distanceX = (u16)events -> bgEvents[i].x + 7; + newDistanceX = distanceX - x; + distanceY = (u16)events -> bgEvents[i].y + 7; + newDistanceY = distanceY - y; + + // is item in range? + if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6)) + sub_80C9838(taskId, newDistanceX, newDistanceY); // send coordinates of the item relative to the player + } + } + sub_80C9720(taskId); + + // hidden item detected? + if (gTasks[taskId].data[2] == TRUE) + return TRUE; + else + return FALSE; +} + +bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y) +{ + u8 bgEventCount = events->bgEventCount; + struct BgEvent *bgEvent = events->bgEvents; + int i; + + for (i = 0; i < bgEventCount; i++) + { + if (bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed? + { + if (!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + FLAG_HIDDEN_ITEMS_START)) + return TRUE; + else + return FALSE; + } + } + return FALSE; +} + +bool8 sub_80C9688(struct MapConnection *connection, int x, int y) +{ + struct MapHeader *mapHeader; + u16 localX, localY; + u32 localOffset; + s32 localLength; + + mapHeader = mapconnection_get_mapheader(connection); + + switch (connection->direction) + { + // same weird temp variable behavior seen in HiddenItemAtPos + case 2: + localOffset = connection->offset + 7; + localX = x - localOffset; + localLength = mapHeader->mapData->height - 7; + localY = localLength + y; // additions are reversed for some reason + break; + case 1: + localOffset = connection->offset + 7; + localX = x - localOffset; + localLength = gMapHeader.mapData->height + 7; + localY = y - localLength; + break; + case 3: + localLength = mapHeader->mapData->width - 7; + localX = localLength + x; // additions are reversed for some reason + localOffset = connection->offset + 7; + localY = y - localOffset; + break; + case 4: + localLength = gMapHeader.mapData->width + 7; + localX = x - localLength; + localOffset = connection->offset + 7; + localY = y - localOffset; + break; + default: + return FALSE; + } + return HiddenItemAtPos(mapHeader->events, localX, localY); +} + +// weird math +#ifdef NONMATCHING +void sub_80C9720(u8 taskId) +{ + s16 x, y; + s16 curX, curY; + s16 width = gMapHeader.mapData->width + 7; + s16 height = gMapHeader.mapData->height + 7; + + PlayerGetDestCoords(&x, &y); + + for (curX = x - 7; curX <= x + 7; curX++) + { + for (curY = y - 5; curY <= y + 5; curY++) + { + if (7 > curX + || curX >= width + || 7 > curY + || curY >= height) + { + struct MapConnection *conn = sub_8056BA0(curX, curY); + if (conn && sub_80C9688(conn, curX, curY) == TRUE) + sub_80C9838(taskId, curX - x, curY - y); + } + } + } +} +#else +__attribute__((naked)) +void sub_80C9720(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x4]\n\ + ldr r0, _080C9834 @ =gMapHeader\n\ + ldr r1, [r0]\n\ + ldr r0, [r1]\n\ + adds r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x8]\n\ + ldr r0, [r1, 0x4]\n\ + adds r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0xC]\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl PlayerGetDestCoords\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + subs r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + mov r1, sp\n\ + movs r2, 0\n\ + ldrsh r1, [r1, r2]\n\ + adds r1, 0x7\n\ + cmp r0, r1\n\ + bgt _080C9824\n\ +_080C976E:\n\ + mov r5, sp\n\ + ldrh r0, [r5, 0x2]\n\ + subs r0, 0x5\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r2, r4, 16\n\ + asrs r1, r2, 16\n\ + movs r6, 0x2\n\ + ldrsh r0, [r5, r6]\n\ + adds r0, 0x5\n\ + lsls r3, 16\n\ + mov r8, r3\n\ + cmp r1, r0\n\ + bgt _080C980E\n\ + movs r0, 0x7\n\ + str r0, [sp, 0x10]\n\ + mov r1, r8\n\ + asrs r1, 16\n\ + mov r9, r1\n\ + mov r10, r0\n\ +_080C9796:\n\ + ldr r3, [sp, 0x10]\n\ + cmp r3, r9\n\ + bgt _080C97B8\n\ + ldr r5, [sp, 0x8]\n\ + lsls r0, r5, 16\n\ + asrs r0, 16\n\ + cmp r9, r0\n\ + bge _080C97B8\n\ + asrs r1, r2, 16\n\ + cmp r10, r1\n\ + bgt _080C97B8\n\ + ldr r6, [sp, 0xC]\n\ + lsls r0, r6, 16\n\ + asrs r0, 16\n\ + lsls r7, r4, 16\n\ + cmp r1, r0\n\ + blt _080C97F6\n\ +_080C97B8:\n\ + mov r0, r8\n\ + asrs r5, r0, 16\n\ + lsls r4, 16\n\ + asrs r6, r4, 16\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl sub_8056BA0\n\ + adds r7, r4, 0\n\ + cmp r0, 0\n\ + beq _080C97F6\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + bl sub_80C9688\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080C97F6\n\ + mov r0, sp\n\ + ldrh r1, [r0]\n\ + subs r1, r5, r1\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + ldrh r2, [r0, 0x2]\n\ + subs r2, r6, r2\n\ + lsls r2, 16\n\ + asrs r2, 16\n\ + ldr r0, [sp, 0x4]\n\ + bl sub_80C9838\n\ +_080C97F6:\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r0, r7, r1\n\ + lsrs r4, r0, 16\n\ + lsls r2, r4, 16\n\ + asrs r1, r2, 16\n\ + mov r3, sp\n\ + movs r5, 0x2\n\ + ldrsh r0, [r3, r5]\n\ + adds r0, 0x5\n\ + cmp r1, r0\n\ + ble _080C9796\n\ +_080C980E:\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + add r1, r8\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + mov r0, sp\n\ + movs r6, 0\n\ + ldrsh r0, [r0, r6]\n\ + adds r0, 0x7\n\ + cmp r1, r0\n\ + ble _080C976E\n\ +_080C9824:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080C9834: .4byte gMapHeader\n\ + .syntax divided"); +} +#endif + +void sub_80C9838(u8 taskId, s16 x, s16 y) +{ + s16 *data = gTasks[taskId].data; + s16 var1, var2, var3, var4; + + if (data[2] == FALSE) + { + data[0] = x; + data[1] = y; + data[2] = TRUE; + } + else + { + // data[0] and data[1] contain the player's coordinates. + // x and y contain the item's coordinates. + if (data[0] < 0) + var1 = data[0] * -1; // item is to the left + else + var1 = data[0]; // item is to the right + + if (data[1] < 0) + var2 = data[1] * -1; // item is to the north + else + var2 = data[1]; // item is to the south + + if (x < 0) + var3 = x * -1; + else + var3 = x; + + if (y < 0) + var4 = y * -1; + else + var4 = y; + + if (var1 + var2 > var3 + var4) + { + data[0] = x; + data[1] = y; + } + else + { + if (var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y))) + { + data[0] = x; + data[1] = y; + } + } + } +} + +u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY) +{ + s16 abX, abY; + + if (itemX == 0 && itemY == 0) + return DIR_NONE; // player is standing on the item. + + // get absolute X distance. + if (itemX < 0) + abX = itemX * -1; + else + abX = itemX; + + // get absolute Y distance. + if (itemY < 0) + abY = itemY * -1; + else + abY = itemY; + + if (abX > abY) + { + if (itemX < 0) + return DIR_EAST; + else + return DIR_NORTH; + } + else + { + if (abX < abY) + { + if (itemY < 0) + return DIR_SOUTH; + else + return DIR_WEST; + } + if (abX == abY) + { + if (itemY < 0) + return DIR_SOUTH; + else + return DIR_WEST; + } + return DIR_NONE; // should never get here. return something so it doesnt crash. + } +} + +void SetPlayerDirectionTowardsItem(u8 direction) +{ + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + UnfreezeMapObject(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + PlayerTurnInPlace(direction); +} + +void DisplayItemRespondingMessageAndExitItemfinder(u8 taskId) +{ + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) + DisplayItemMessageOnField(taskId, gOtherText_ItemfinderResponding, ExitItemfinder, 0); +} + +void RotatePlayerAndExitItemfinder(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE + || data[2] == FALSE) + { + SetPlayerDirectionTowardsItem(gItemFinderDirections[data[5]]); + data[2] = 1; + data[5] = (data[5] + 1) & 3; + data[3]++; + + if (data[3] == 4) + DisplayItemMessageOnField(taskId, gOtherText_ItemfinderItemUnderfoot, ExitItemfinder, 0); + } +} + +void ItemUseOutOfBattle_PokeblockCase(u8 taskId) +{ + if (sub_80F9344() == TRUE) + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } + else if (gTasks[taskId].data[2] != TRUE) + { + sub_810BA7C(0); + ItemMenu_ConfirmNormalFade(taskId); + } + else + { + gFieldCallback = (void *)sub_8080E28; + sub_810BA7C(1); + ItemMenu_ConfirmComplexFade(taskId); + } +} + +void ItemUseOutOfBattle_CoinCase(u8 taskId) +{ + ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins3); + + if (!gTasks[taskId].data[2]) + { + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); + } + else + { + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpOverworldMessage, 0); + } +} + +void sub_80C9BB8(u8 var) +{ + if (gMain.newKeys & A_BUTTON) + CleanUpItemMenuMessage(var); +} + +void sub_80C9BD8(u8 var) +{ + if (gMain.newKeys & A_BUTTON) + CleanUpOverworldMessage(var); +} + +// unused +void ItemUseOutOfBattle_SSTicket(u8 taskId) +{ + if (gTasks[taskId].data[2] == 0) + { + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BB8, 1); + } + else + { + DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BD8, 0); + } +} + +void sub_80C9C7C(u8 taskId) +{ + if (IsPlayerFacingUnplantedSoil() == TRUE) + { + gFieldItemUseCallback = sub_80C9D00; + gFieldCallback = ExecuteItemUseFromBlackPalette; + gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; + gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; + gTasks[taskId].func = HandleItemMenuPaletteFade; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + } + else + { + ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); + } +} + +void sub_80C9D00(u8 taskId) +{ + RemoveBagItem(gSpecialVar_ItemId, 1); + ScriptContext2_Enable(); + ScriptContext1_SetupScript(gUnknown_081A1654); + DestroyTask(taskId); +} + +void ItemUseOutOfBattle_WailmerPail(u8 taskId) +{ + if (TryToWaterBerryTree() == TRUE) + { + gFieldItemUseCallback = sub_80C9D74; + SetUpItemUseOnFieldCallback(taskId); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void sub_80C9D74(u8 taskId) +{ + ScriptContext2_Enable(); + ScriptContext1_SetupScript(gUnknown_081A168F); + DestroyTask(taskId); +} + +void sub_80C9D98(u8 taskId) +{ + gUnknown_02038561 = 0; + ItemMenu_ConfirmNormalFade(taskId); +} + +void ItemUseOutOfBattle_Medicine(u8 taskId) +{ + gPokemonItemUseCallback = UseMedicine; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_SacredAsh(u8 taskId) +{ + u8 i; + + gLastFieldPokeMenuOpened = 0; + + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) + { + gLastFieldPokeMenuOpened = i; + break; + } + } + gPokemonItemUseCallback = sub_8070048; + gUnknown_02038561 = 4; + ItemMenu_ConfirmNormalFade(taskId); +} + +void ItemUseOutOfBattle_PPRecovery(u8 taskId) +{ + gPokemonItemUseCallback = DoPPRecoveryItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_PPUp(u8 taskId) +{ + gPokemonItemUseCallback = DoPPUpItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_RareCandy(u8 taskId) +{ + gPokemonItemUseCallback = DoRareCandyItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_TMHM(u8 taskId) +{ + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); + + if (gSpecialVar_ItemId >= ITEM_HM01_CUT) + DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM + else + DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM +} + +void sub_80C9EE4(u8 taskId) +{ + PlaySE(SE_PC_LOGON); + gTasks[taskId].func = sub_80C9F10; +} + +void sub_80C9F10(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_ItemId)]); + StringExpandPlaceholders(gStringVar4, gOtherText_ContainsMove); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80C9F80, 1); + } +} + +void sub_80C9F80(u8 var) +{ + DisplayYesNoMenu(7, 7, 1); + sub_80A3FA0(gBGTilemapBuffers[1], 8, 8, 5, 4, 1); + DoYesNoFuncWithChoice(var, &gUnknown_083D61F4); +} + +void sub_80C9FC0(u8 var) +{ + gPokemonItemUseCallback = TeachMonTMMove; + sub_80C9D98(var); +} + +static void PrepareItemUseMessage(void) +{ + RemoveBagItem(gSpecialVar_ItemId, 1); + sub_80A3E0C(); + CopyItemName(gSpecialVar_ItemId, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedItem); +} + +void ItemUseOutOfBattle_Repel(u8 var) +{ + if (VarGet(VAR_REPEL_STEP_COUNT) == 0) + { + VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId)); + PrepareItemUseMessage(); + DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1); + } + else + { + DisplayItemMessageOnField(var, gOtherText_RepelLingers, CleanUpItemMenuMessage, 1); + } +} + +void sub_80CA07C(void) +{ + sub_80A3E0C(); + CopyItemName(gSpecialVar_ItemId, gStringVar2); +} + +void sub_80CA098(u8 taskId) +{ + if(++gTasks[taskId].data[15] > 7) + { + PlaySE(SE_BIDORO); + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); + } +} + +void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId) +{ + if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE) + { + FlagSet(FLAG_SYS_ENC_UP_ITEM); + FlagClear(FLAG_SYS_ENC_DOWN_ITEM); + sub_80CA07C(); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedFlute); + gTasks[taskId].func = sub_80CA098; + gTasks[taskId].data[15] = 0; + } + else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE) + { + FlagSet(FLAG_SYS_ENC_DOWN_ITEM); + FlagClear(FLAG_SYS_ENC_UP_ITEM); + sub_80CA07C(); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedRepel); + gTasks[taskId].func = sub_80CA098; + gTasks[taskId].data[15] = 0; + } +} + +void task08_080A1C44(u8 taskId) +{ + player_avatar_init_params_reset(); + sub_80878A8(); + DestroyTask(taskId); +} + +void EscapeRopeCallback(u8 taskId) +{ + Overworld_ResetStateAfterDigEscRope(); + PrepareItemUseMessage(); + gTasks[taskId].data[0] = 0; + DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44, 0); +} + +bool8 CanUseEscapeRopeOnCurrMap(void) +{ + if (gMapHeader.mapType == MAP_TYPE_UNDERGROUND) + return TRUE; + else + return FALSE; +} + +void ItemUseOutOfBattle_EscapeRope(u8 taskId) +{ + if (CanUseEscapeRopeOnCurrMap() == TRUE) + { + gFieldItemUseCallback = EscapeRopeCallback; + SetUpItemUseOnFieldCallback(taskId); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void ItemUseOutOfBattle_EvolutionStone(u8 var) +{ + gPokemonItemUseCallback = DoEvolutionStoneItemEffect; + sub_80C9D98(var); +} + +void ItemUseInBattle_PokeBall(u8 var) +{ + if (PlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? + { + RemoveBagItem(gSpecialVar_ItemId, 1); + sub_80A7094(var); + } + else + { + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1); + } +} + +void sub_80CA294(u8 var) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + sub_80A7094(var); +} + +void sub_80CA2BC(u8 taskId) +{ + if(++gTasks[taskId].data[15] > 7) + { + PlaySE(SE_KAIFUKU); + RemoveBagItem(gSpecialVar_ItemId, 1); + DisplayItemMessageOnField(taskId, sub_803F378(gSpecialVar_ItemId), sub_80CA294, 1); + } +} + +void ItemUseInBattle_StatIncrease(u8 taskId) +{ + u16 partyId = gBattlePartyID[gBankInMenu]; + + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); + + if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE) + { + DisplayItemMessageOnField(taskId, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); + } + else + { + gTasks[taskId].func = sub_80CA2BC; + gTasks[taskId].data[15] = 0; + } +} + +void sub_80CA394(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_8094E4C(); + gpu_pal_allocator_reset__manage_upper_four(); + DestroyTask(taskId); + } +} + +void sub_80CA3C0(u8 taskId) +{ + gTasks[taskId].func = sub_80CA394; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void ItemUseInBattle_Medicine(u8 var) +{ + gPokemonItemUseCallback = UseMedicine; + sub_80CA3C0(var); +} + +void unref_sub_80CA410(u8 var) +{ + gPokemonItemUseCallback = sub_8070048; + sub_80CA3C0(var); +} + +void ItemUseInBattle_PPRecovery(u8 var) +{ + gPokemonItemUseCallback = DoPPRecoveryItemEffect; + sub_80CA3C0(var); +} + +void unref_sub_80CA448(u8 var) +{ + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); + + if (ExecuteTableBasedItemEffect__(0, gSpecialVar_ItemId, 0) == FALSE) + { + RemoveBagItem(gSpecialVar_ItemId, 1); + GetMonNickname(&gPlayerParty[0], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); + DisplayItemMessageOnField(var, gStringVar4, sub_80A7094, 1); + } + else + { + DisplayItemMessageOnField(var, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); + } +} + +void ItemUseInBattle_Escape(u8 taskId) +{ + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); + + if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) + { + PrepareItemUseMessage(); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) +{ + switch (GetItemEffectType(gSpecialVar_ItemId) - 1) + { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_Medicine(taskId); + break; + case 9: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_SacredAsh(taskId); + break; + case 0: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_RareCandy(taskId); + break; + case 18: + case 19: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_PPUp(taskId); + break; + case 20: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_PPRecovery(taskId); + break; + default: + gTasks[taskId].data[15] = 4; + ItemUseOutOfBattle_CannotUse(taskId); + } +} + +void ItemUseInBattle_EnigmaBerry(u8 taskId) +{ + switch (GetItemEffectType(gSpecialVar_ItemId)) + { + case 0: + ItemUseInBattle_StatIncrease(taskId); + break; + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 11: + ItemUseInBattle_Medicine(taskId); + break; + case 21: + ItemUseInBattle_PPRecovery(taskId); + break; + default: + ItemUseOutOfBattle_CannotUse(taskId); + } +} + +void ItemUseOutOfBattle_CannotUse(u8 taskId) +{ + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); +} diff --git a/src/landmark.c b/src/landmark.c new file mode 100644 index 000000000..476821ec6 --- /dev/null +++ b/src/landmark.c @@ -0,0 +1,417 @@ +#include "global.h" +#include "landmark.h" +#include "event_data.h" +#include "region_map_sections.h" + +struct Landmark +{ + const u8 *name; + u16 flag; +}; + +struct LandmarkList +{ + u8 mapSection; + u8 id; + const struct Landmark *const *landmarks; +}; + +extern const u8 gLandmarkName_FlowerShop[]; +extern const u8 gLandmarkName_PetalburgWoods[]; +extern const u8 gLandmarkName_MrBrineysCottage[]; +extern const u8 gLandmarkName_AbandonedShip[]; +extern const u8 gLandmarkName_SeashoreHouse[]; +extern const u8 gLandmarkName_SlateportBeach[]; +extern const u8 gLandmarkName_CyclingRoad[]; +extern const u8 gLandmarkName_NewMauville[]; +extern const u8 gLandmarkName_TrickHouse[]; +extern const u8 gLandmarkName_OldLadysRestShop[]; +extern const u8 gLandmarkName_Desert[]; +extern const u8 gLandmarkName_WinstrateFamily[]; +extern const u8 gLandmarkName_CableCar[]; +extern const u8 gLandmarkName_GlassWorkshop[]; +extern const u8 gLandmarkName_WeatherInstitute[]; +extern const u8 gLandmarkName_MeteorFalls[]; +extern const u8 gLandmarkName_TunnelersRestHouse[]; +extern const u8 gLandmarkName_RusturfTunnel[]; +extern const u8 gLandmarkName_PokemonDayCare[]; +extern const u8 gLandmarkName_SafariZoneEntrance[]; +extern const u8 gLandmarkName_MtPyre[]; +extern const u8 gLandmarkName_ShoalCave[]; +extern const u8 gLandmarkName_SeafloorCavern[]; +extern const u8 gLandmarkName_GraniteCave[]; +extern const u8 gLandmarkName_OceanCurrent[]; +extern const u8 gLandmarkName_LanettesHouse[]; +extern const u8 gLandmarkName_FieryPath[]; +extern const u8 gLandmarkName_JaggedPass[]; +extern const u8 gLandmarkName_BerryMastersHouse[]; +extern const u8 gLandmarkName_IslandCave[]; +extern const u8 gLandmarkName_DesertRuins[]; +extern const u8 gLandmarkName_ScorchedSlab[]; +extern const u8 gLandmarkName_AncientTomb[]; +extern const u8 gLandmarkName_SealedChamber[]; +extern const u8 gLandmarkName_FossilManiacsHouse[]; +extern const u8 gLandmarkName_HuntersHouse[]; +extern const u8 gLandmarkName_SkyPillar[]; + +static const struct Landmark Landmark_FlowerShop = {gLandmarkName_FlowerShop, FLAG_LANDMARK_FLOWER_SHOP}; +static const struct Landmark Landmark_PetalburgWoods = {gLandmarkName_PetalburgWoods, -1}; +static const struct Landmark Landmark_MrBrineysCottage = {gLandmarkName_MrBrineysCottage, FLAG_LANDMARK_MR_BRINEY_HOUSE}; +static const struct Landmark Landmark_AbandonedShip = {gLandmarkName_AbandonedShip, FLAG_LANDMARK_ABANDONED_SHIP}; +static const struct Landmark Landmark_SeashoreHouse = {gLandmarkName_SeashoreHouse, FLAG_LANDMARK_SEASHORE_HOUSE}; +static const struct Landmark Landmark_SlateportBeach = {gLandmarkName_SlateportBeach, -1}; +static const struct Landmark Landmark_CyclingRoad = {gLandmarkName_CyclingRoad, -1}; +static const struct Landmark Landmark_NewMauville = {gLandmarkName_NewMauville, FLAG_LANDMARK_NEW_MAUVILLE}; +static const struct Landmark Landmark_TrickHouse = {gLandmarkName_TrickHouse, FLAG_LANDMARK_TRICK_HOUSE}; +static const struct Landmark Landmark_OldLadysRestShop = {gLandmarkName_OldLadysRestShop, FLAG_LANDMARK_OLD_LADY_REST_SHOP}; +static const struct Landmark Landmark_Desert = {gLandmarkName_Desert, -1}; +static const struct Landmark Landmark_WinstrateFamily = {gLandmarkName_WinstrateFamily, FLAG_LANDMARK_WINSTRATE_FAMILY}; +static const struct Landmark Landmark_CableCar = {gLandmarkName_CableCar, -1}; +static const struct Landmark Landmark_GlassWorkshop = {gLandmarkName_GlassWorkshop, FLAG_LANDMARK_GLASS_WORKSHOP}; +static const struct Landmark Landmark_WeatherInstitute = {gLandmarkName_WeatherInstitute, -1}; +static const struct Landmark Landmark_MeteorFalls = {gLandmarkName_MeteorFalls, -1}; +static const struct Landmark Landmark_TunnelersRestHouse = {gLandmarkName_TunnelersRestHouse, FLAG_LANDMARK_TUNNELERS_REST_HOUSE}; +static const struct Landmark Landmark_RusturfTunnel = {gLandmarkName_RusturfTunnel, -1}; +static const struct Landmark Landmark_PokemonDayCare = {gLandmarkName_PokemonDayCare, FLAG_LANDMARK_POKEMON_DAYCARE}; +static const struct Landmark Landmark_SafariZoneEntrance = {gLandmarkName_SafariZoneEntrance, -1}; +static const struct Landmark Landmark_MtPyre = {gLandmarkName_MtPyre, -1}; +static const struct Landmark Landmark_ShoalCave = {gLandmarkName_ShoalCave, -1}; +static const struct Landmark Landmark_SeafloorCavern = {gLandmarkName_SeafloorCavern, FLAG_LANDMARK_SEAFLOOR_CAVERN}; +static const struct Landmark Landmark_GraniteCave = {gLandmarkName_GraniteCave, -1}; +static const struct Landmark Landmark_OceanCurrent = {gLandmarkName_OceanCurrent, -1}; +static const struct Landmark Landmark_LanettesHouse = {gLandmarkName_LanettesHouse, FLAG_LANDMARK_LANETTES_HOUSE}; +static const struct Landmark Landmark_FieryPath = {gLandmarkName_FieryPath, FLAG_LANDMARK_FIERY_PATH}; +static const struct Landmark Landmark_JaggedPass = {gLandmarkName_JaggedPass, -1}; +static const struct Landmark Landmark_BerryMastersHouse = {gLandmarkName_BerryMastersHouse, FLAG_LANDMARK_BERRY_MASTERS_HOUSE}; +static const struct Landmark Landmark_IslandCave = {gLandmarkName_IslandCave, FLAG_LANDMARK_ISLAND_CAVE}; +static const struct Landmark Landmark_DesertRuins = {gLandmarkName_DesertRuins, FLAG_LANDMARK_DESERT_RUINS}; +static const struct Landmark Landmark_ScorchedSlab = {gLandmarkName_ScorchedSlab, FLAG_LANDMARK_SCORCHED_SLAB}; +static const struct Landmark Landmark_AncientTomb = {gLandmarkName_AncientTomb, FLAG_LANDMARK_ANCIENT_TOMB}; +static const struct Landmark Landmark_SealedChamber = {gLandmarkName_SealedChamber, FLAG_LANDMARK_SEALED_CHAMBER}; +static const struct Landmark Landmark_FossilManiacsHouse = {gLandmarkName_FossilManiacsHouse, FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE}; +static const struct Landmark Landmark_HuntersHouse = {gLandmarkName_HuntersHouse, FLAG_LANDMARK_HUNTERS_HOUSE}; +static const struct Landmark Landmark_SkyPillar = {gLandmarkName_SkyPillar, FLAG_LANDMARK_SKY_PILLAR}; + +static const struct Landmark *const Landmarks_Route104_0[] = +{ + &Landmark_FlowerShop, + NULL, +}; + +static const struct Landmark *const Landmarks_Route104_1[] = +{ + &Landmark_PetalburgWoods, + &Landmark_MrBrineysCottage, + NULL, +}; + +static const struct Landmark *const Landmarks_Route105_0[] = +{ + &Landmark_IslandCave, + NULL, +}; + +static const struct Landmark *const Landmarks_Route106_1[] = +{ + &Landmark_GraniteCave, + NULL, +}; + +static const struct Landmark *const Landmarks_Route108_0[] = +{ + &Landmark_AbandonedShip, + NULL, +}; + +static const struct Landmark *const Landmarks_Route109_0[] = +{ + &Landmark_SeashoreHouse, + &Landmark_SlateportBeach, + NULL, +}; + +static const struct Landmark *const Landmarks_Route110_0[] = +{ + &Landmark_CyclingRoad, + &Landmark_NewMauville, + NULL, +}; + +static const struct Landmark *const Landmarks_Route110_1[] = +{ + &Landmark_CyclingRoad, + NULL, +}; + +static const struct Landmark *const Landmarks_Route110_2[] = +{ + &Landmark_CyclingRoad, + &Landmark_TrickHouse, + NULL, +}; + +static const struct Landmark *const Landmarks_Route111_0[] = +{ + &Landmark_OldLadysRestShop, + NULL, +}; + +static const struct Landmark *const Landmarks_Route111_1[] = +{ + &Landmark_Desert, + NULL, +}; + +static const struct Landmark *const Landmarks_Route111_3[] = +{ + &Landmark_DesertRuins, + &Landmark_Desert, + NULL, +}; + +static const struct Landmark *const Landmarks_Route111_4[] = +{ + &Landmark_WinstrateFamily, + &Landmark_Desert, + NULL, +}; + +static const struct Landmark *const Landmarks_Route112_0[] = +{ + &Landmark_FieryPath, + &Landmark_JaggedPass, + NULL, +}; + +static const struct Landmark *const Landmarks_Route112_1[] = +{ + &Landmark_CableCar, + &Landmark_FieryPath, + NULL, +}; + +static const struct Landmark *const Landmarks_Route113_1[] = +{ + &Landmark_GlassWorkshop, + NULL, +}; + +static const struct Landmark *const Landmarks_Route114_1[] = +{ + &Landmark_FossilManiacsHouse, + NULL, +}; + +static const struct Landmark *const Landmarks_Route114_2[] = +{ + &Landmark_LanettesHouse, + NULL, +}; + +static const struct Landmark *const Landmarks_MeteorFalls[] = +{ + &Landmark_MeteorFalls, + NULL, +}; + +static const struct Landmark *const Landmarks_Route116_1[] = +{ + &Landmark_TunnelersRestHouse, + &Landmark_RusturfTunnel, + NULL, +}; + +static const struct Landmark *const Landmarks_Route116_2[] = +{ + &Landmark_RusturfTunnel, + NULL, +}; + +static const struct Landmark *const Landmarks_Route117_2[] = +{ + &Landmark_PokemonDayCare, + NULL, +}; + +static const struct Landmark *const Landmarks_Route119_1[] = +{ + &Landmark_WeatherInstitute, + NULL, +}; + +static const struct Landmark *const Landmarks_Route120_0[] = +{ + &Landmark_ScorchedSlab, + NULL, +}; + +static const struct Landmark *const Landmarks_Route120_2[] = +{ + &Landmark_AncientTomb, + NULL, +}; + +static const struct Landmark *const Landmarks_Route121_2[] = +{ + &Landmark_SafariZoneEntrance, + NULL, +}; + +static const struct Landmark *const Landmarks_Route122_0[] = +{ + &Landmark_MtPyre, + NULL, +}; + +static const struct Landmark *const Landmarks_Route123_0[] = +{ + &Landmark_BerryMastersHouse, + NULL, +}; + +static const struct Landmark *const Landmarks_Route124_7[] = +{ + &Landmark_HuntersHouse, + NULL, +}; + +static const struct Landmark *const Landmarks_Route125_2[] = +{ + &Landmark_ShoalCave, + NULL, +}; + +static const struct Landmark *const Landmarks_Route128_1[] = +{ + &Landmark_SeafloorCavern, + NULL, +}; + +static const struct Landmark *const Landmarks_Route131_1[] = +{ + &Landmark_SkyPillar, + NULL, +}; + +static const struct Landmark *const Landmarks_OceanCurrent[] = +{ + &Landmark_OceanCurrent, + NULL, +}; + +static const struct Landmark *const Landmarks_Route134_2[] = +{ + &Landmark_SealedChamber, + &Landmark_OceanCurrent, + NULL, +}; + +static const struct Landmark *const Landmarks_MtChimney_2[] = +{ + &Landmark_CableCar, + &Landmark_JaggedPass, + NULL, +}; + +static const struct LandmarkList gLandmarkLists[] = +{ + {MAPSEC_Route104, 0, Landmarks_Route104_0}, + {MAPSEC_Route104, 1, Landmarks_Route104_1}, + {MAPSEC_Route105, 0, Landmarks_Route105_0}, + {MAPSEC_Route106, 1, Landmarks_Route106_1}, + {MAPSEC_Route108, 0, Landmarks_Route108_0}, + {MAPSEC_Route109, 0, Landmarks_Route109_0}, + {MAPSEC_Route110, 0, Landmarks_Route110_0}, + {MAPSEC_Route110, 1, Landmarks_Route110_1}, + {MAPSEC_Route110, 2, Landmarks_Route110_2}, + {MAPSEC_Route111, 0, Landmarks_Route111_0}, + {MAPSEC_Route111, 1, Landmarks_Route111_1}, + {MAPSEC_Route111, 2, Landmarks_Route111_1}, + {MAPSEC_Route111, 3, Landmarks_Route111_3}, + {MAPSEC_Route111, 4, Landmarks_Route111_4}, + {MAPSEC_Route112, 0, Landmarks_Route112_0}, + {MAPSEC_Route112, 1, Landmarks_Route112_1}, + {MAPSEC_Route113, 1, Landmarks_Route113_1}, + {MAPSEC_Route114, 1, Landmarks_Route114_1}, + {MAPSEC_Route114, 2, Landmarks_Route114_2}, + {MAPSEC_Route114, 3, Landmarks_MeteorFalls}, + {MAPSEC_Route115, 0, Landmarks_MeteorFalls}, + {MAPSEC_Route115, 1, Landmarks_MeteorFalls}, + {MAPSEC_Route116, 1, Landmarks_Route116_1}, + {MAPSEC_Route116, 2, Landmarks_Route116_2}, + {MAPSEC_Route117, 2, Landmarks_Route117_2}, + {MAPSEC_Route119, 1, Landmarks_Route119_1}, + {MAPSEC_Route120, 0, Landmarks_Route120_0}, + {MAPSEC_Route120, 2, Landmarks_Route120_2}, + {MAPSEC_Route121, 2, Landmarks_Route121_2}, + {MAPSEC_Route122, 0, Landmarks_Route122_0}, + {MAPSEC_Route123, 0, Landmarks_Route123_0}, + {MAPSEC_Route122, 1, Landmarks_Route122_0}, + {MAPSEC_Route124, 7, Landmarks_Route124_7}, + {MAPSEC_Route125, 2, Landmarks_Route125_2}, + {MAPSEC_Route128, 1, Landmarks_Route128_1}, + {MAPSEC_Route131, 1, Landmarks_Route131_1}, + {MAPSEC_Route132, 0, Landmarks_OceanCurrent}, + {MAPSEC_Route132, 1, Landmarks_OceanCurrent}, + {MAPSEC_Route133, 0, Landmarks_OceanCurrent}, + {MAPSEC_Route133, 1, Landmarks_OceanCurrent}, + {MAPSEC_Route133, 2, Landmarks_OceanCurrent}, + {MAPSEC_Route134, 0, Landmarks_OceanCurrent}, + {MAPSEC_Route134, 1, Landmarks_OceanCurrent}, + {MAPSEC_Route134, 2, Landmarks_Route134_2}, + {MAPSEC_MtChimney, 2, Landmarks_MtChimney_2}, + {MAPSEC_Nothing, 0, NULL}, +}; + +static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id); + +const u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count) +{ + const struct Landmark *const *landmarks = GetLandmarks(mapSection, id); + + if (!landmarks) + return NULL; + + while (1) + { + const struct Landmark *landmark = *landmarks; + + if (landmark->flag == 0xFFFF || FlagGet(landmark->flag) == TRUE) + { + if (count == 0) + break; + else + count--; + } + + landmarks++; + if (!*landmarks) + return NULL; + } + + return (*landmarks)->name; +} + +static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id) +{ + u16 i = 0; + + for (; gLandmarkLists[i].mapSection != MAPSEC_Nothing; i++) + { + if (gLandmarkLists[i].mapSection > mapSection) + return NULL; + if (gLandmarkLists[i].mapSection == mapSection) + break; + } + + if (gLandmarkLists[i].mapSection == MAPSEC_Nothing) + return NULL; + + for (; gLandmarkLists[i].mapSection == mapSection; i++) + { + if (gLandmarkLists[i].id == id) + return gLandmarkLists[i].landmarks; + } + + return NULL; +} diff --git a/src/learn_move.c b/src/learn_move.c new file mode 100644 index 000000000..356a31b00 --- /dev/null +++ b/src/learn_move.c @@ -0,0 +1,1066 @@ +#include "global.h" +#include "contest.h" +#include "data2.h" +#include "field_fadetransition.h" +#include "main.h" +#include "menu.h" +#include "menu_cursor.h" +#include "learn_move.h" +#include "palette.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "overworld.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "strings2.h" +#include "task.h" +#include "trig.h" +#include "ewram.h" + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u8 gTileBuffer[]; + +extern const struct WindowTemplate gWindowTemplate_81E6CE4; +extern const struct WindowTemplate gWindowTemplate_81E7240; +extern const u8 *const gContestEffectStrings[]; +extern const u8 *const gMoveDescriptions[]; +extern const u8 gTypeNames[][7]; +extern const u8 *const gUnknown_083CAF70[]; + +#ifdef GERMAN +extern const u8 deuOtherText_ForgotAndLearned[]; +#endif + + +struct LearnMoveStruct +{ + u8 state; + u8 filler1; + u8 unk2; + u8 spriteIDs[20]; + u8 filler17[1]; + u8 unk18; + u8 unk19; + u8 numMenuChoices; + u8 menuSelection; + u8 unk1C; + bool8 unk1D; + u8 unk1E; + u8 filler1F; + /*0x020*/ u16 movesToLearn[20]; + u8 filler48[0x52-0x48]; + u8 moveNames[6][0x19]; + u8 fillerE8[0x2C3-0xE8]; + bool8 unk2C3; + bool8 showContestInfo; + /*0x2C5*/ u8 partyMon; + u8 unk2C6; +}; + +static struct LearnMoveStruct *sLearnMoveStruct; + +const u16 gDexArrows_Pal[] = INCBIN_U16("graphics/pokedex/arrows.gbapal"); + +const u8 gDexArrows_Gfx[] = INCBIN_U8("graphics/pokedex/arrows.4bpp"); + +const u8 gUnknown_08402CF8[][4] = +{ + { 0, 0, 9, 13}, + {10, 0, 29, 7}, + { 2, 14, 27, 19}, + {10, 8, 29, 13}, +}; + +struct UnknownStruct1 +{ + const u8 *unk0; + u8 unk4; + u8 unk5; + u8 unk6; +}; + +const struct UnknownStruct1 gUnknown_08402D08[][4] = +{ + { + {OtherText_Battle, 1, 1, 0}, + {OtherText_Power, 1, 4, 1}, + {OtherText_Accuracy, 1, 9, 2}, + {NULL, 0, 0, 0}, + }, + { + {OtherText_Contest, 1, 1, 0}, + {OtherText_Appeal, 1, 4, 1}, + {OtherText_Jam, 1, 9, 2}, + {NULL, 0, 0, 0}, + }, +}; + +// XXX: What are these for? +const u32 unkDataFF00FFEF = 0xFF00FFEF; +const u8 *const gTileBuffer_ = gTileBuffer; + +const struct OamData gOamData_8402D50 = {.shape = 0}; +const struct OamData gOamData_8402D58 = {.shape = 2}; +const struct OamData gOamData_8402D60 = {.shape = 1}; + +const union AnimCmd gSpriteAnim_8402D68[] = +{ + ANIMCMD_FRAME(2, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_8402D70[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_8402D78[] = +{ + gSpriteAnim_8402D68, + gSpriteAnim_8402D70, +}; + +const struct SpriteSheet gUnknown_08402D80 = {gDexArrows_Gfx, sizeof(gDexArrows_Gfx), 5525}; +const struct SpritePalette gUnknown_08402D88 = {gDexArrows_Pal, 5526}; + +void sub_8133300(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_8402D90 = +{ + .tileTag = 5525, + .paletteTag = 5526, + .oam = &gOamData_8402D58, + .anims = gSpriteAnimTable_8402D78, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8133300, +}; + +const union AnimCmd gSpriteAnim_8402DA8[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_8402DB0[] = +{ + ANIMCMD_FRAME(6, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_8402DB8[] = +{ + gSpriteAnim_8402DA8, + gSpriteAnim_8402DB0, +}; + +const struct SpriteTemplate gSpriteTemplate_8402DC0 = +{ + .tileTag = 5525, + .paletteTag = 5526, + .oam = &gOamData_8402D60, + .anims = gSpriteAnimTable_8402DB8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8133300, +}; + +const union AnimCmd gSpriteAnim_8402DD8[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_8402DE0[] = +{ + ANIMCMD_FRAME(9, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_8402DE8[] = +{ + ANIMCMD_FRAME(10, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_8402DF0[] = +{ + ANIMCMD_FRAME(11, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_8402DF8[] = +{ + gSpriteAnim_8402DD8, + gSpriteAnim_8402DE0, + gSpriteAnim_8402DE8, + gSpriteAnim_8402DF0, +}; + +const struct SpriteTemplate gSpriteTemplate_8402E08 = +{ + .tileTag = 5525, + .paletteTag = 5526, + .oam = &gOamData_8402D50, + .anims = gSpriteAnimTable_8402DF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8133300, +}; + +const u8 gString_AkitoMori[] = _("あきと"); // programmer Akito Mori? + +void sub_813269C(u8); +void CB2_InitLearnMove(void); +void CB2_LearnMove(void); +void LearnMoveMain(void); +void DrawLearnMoveMenuWindow(void); +void sub_8133030(bool8); +u8 sub_81330E8(void); +void sub_8133140(u8); +u8 sub_8133248(void); +void ClearLearnMoveVars(void); +void sub_8133358(void); +void sub_8133558(void); +void sub_813362C(void); +void sub_8133800(void); +void sub_8133AEC(bool8, int); +void sub_8133CA4(void); + +void VBlankCB_LearnMove(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void TeachMoveTutorMove(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_813269C, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void sub_813269C(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CB2_InitLearnMove); + gFieldCallback = sub_8080990; + DestroyTask(taskId); + } +} + +void CB2_InitLearnMove(void) +{ + REG_DISPCNT = 0; + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + sLearnMoveStruct = eLearnMoveStruct; + ClearLearnMoveVars(); + sLearnMoveStruct->partyMon = gSpecialVar_0x8004; + sub_8133558(); + SetVBlankCallback(VBlankCB_LearnMove); + + Text_LoadWindowTemplate(&gWindowTemplate_81E7240); + InitMenuWindow(&gWindowTemplate_81E7240); + Menu_EraseScreen(); + + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + + REG_BG0VOFS = 0; + REG_BG0VOFS = 0; // huh? + REG_BG1HOFS = 0; + REG_BG1HOFS = 0; // huh? + + LoadSpriteSheet(&gUnknown_08402D80); + LoadSpritePalette(&gUnknown_08402D88); + sub_8133358(); + FillPalette(0, 0, 2); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + SetMainCallback2(CB2_LearnMove); +} + +void sub_81327A4(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + sLearnMoveStruct = eLearnMoveStruct; + sub_8133558(); + sLearnMoveStruct->unk2C6 = gSpecialVar_0x8005; + SetVBlankCallback(VBlankCB_LearnMove); + + Text_LoadWindowTemplate(&gWindowTemplate_81E7240); + InitMenuWindow(&gWindowTemplate_81E7240); + Menu_EraseScreen(); + + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + + REG_DISPCNT = 0x1340; + REG_BG0VOFS = 0; + REG_BG0HOFS = 0; + REG_BG1HOFS = 0; + REG_BG1HOFS = 0; // huh? + + LoadSpriteSheet(&gUnknown_08402D80); + LoadSpritePalette(&gUnknown_08402D88); + sub_8133358(); + FillPalette(0, 0, 2); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + SetMainCallback2(CB2_LearnMove); +} + +void CB2_LearnMove(void) +{ + LearnMoveMain(); + if (sLearnMoveStruct->unk1D) + { + sLearnMoveStruct->unk1D = FALSE; + MenuCursor_SetPos814AD7C(0x58, (sLearnMoveStruct->unk18 * 2 + 1) * 8); + } + if (sLearnMoveStruct->unk1E != 0) + { + sLearnMoveStruct->unk1E = 0; + sub_8133800(); + } + if (sLearnMoveStruct->unk2C3) + { + sub_8133AEC(sLearnMoveStruct->showContestInfo, 1); + sLearnMoveStruct->unk2C3 = FALSE; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_81328E8(const u8 *a) +{ + StringExpandPlaceholders(gStringVar4, a); + MenuPrintMessage(gStringVar4, 3, 15); +} + +void LearnMoveMain(void) +{ + switch (sLearnMoveStruct->state) + { + case 0: + sLearnMoveStruct->state++; + DrawLearnMoveMenuWindow(); + sub_8133030(FALSE); + sub_8133800(); + gSprites[1].pos1.x = 0x48; + sLearnMoveStruct->unk2C3 = TRUE; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + REG_DISPCNT = 0x1340; + break; + case 1: + if (!gPaletteFade.active) + sLearnMoveStruct->state = 4; + break; + case 2: + sLearnMoveStruct->state++; + break; + case 3: + sub_8133030(FALSE); + sub_8133800(); + sLearnMoveStruct->unk2C3 = TRUE; + sLearnMoveStruct->state++; + gSprites[1].pos1.x = 0x48; + break; + case 4: + if (sub_81330E8() == 0) + sub_813362C(); + return; + case 5: + sub_8133140(0); + sub_8133800(); + sLearnMoveStruct->unk2C3 = TRUE; + gSprites[1].pos1.x = 0x48; + sLearnMoveStruct->state++; + break; + case 6: + if (sub_8133248() == 0) + sub_813362C(); + break; + case 8: + if (Menu_UpdateWindowText()) + { + DisplayYesNoMenu(21, 7, 1); + sLearnMoveStruct->state++; + } + break; + case 9: + { + s8 selection = Menu_ProcessInputNoWrap_(); + + if (selection == 0) + { + sub_8133CA4(); + if (GiveMoveToMon(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]) != 0xFFFF) + { + sub_81328E8(gOtherText_PokeLearnedMove); + gSpecialVar_0x8004 = 1; + sLearnMoveStruct->state = 31; + } + else + { + sLearnMoveStruct->state = 16; + } + } + else if (selection == -1 || selection == 1) + { + sub_8133CA4(); + if (sLearnMoveStruct->showContestInfo == FALSE) + sLearnMoveStruct->state = 3; + if (sLearnMoveStruct->showContestInfo == TRUE) + sLearnMoveStruct->state = 5; + } + } + break; + case 12: + if (Menu_UpdateWindowText()) + { + DisplayYesNoMenu(21, 7, 1); + sLearnMoveStruct->state++; + } + break; + case 13: + { + s8 selection = Menu_ProcessInputNoWrap_(); + + if (selection == 0) + { + sub_8133CA4(); + gSpecialVar_0x8004 = selection; + sLearnMoveStruct->state = 14; + } + else if (selection == -1 || selection == 1) + { + sub_8133CA4(); + if (sLearnMoveStruct->showContestInfo == FALSE) + sLearnMoveStruct->state = 3; + if (sLearnMoveStruct->showContestInfo == TRUE) + sLearnMoveStruct->state = 5; + } + } + break; + case 16: + sub_81328E8(gOtherText_DeleteOlderMove); + sLearnMoveStruct->state++; + break; + case 17: + if (Menu_UpdateWindowText()) + { + DisplayYesNoMenu(21, 7, 1); + sLearnMoveStruct->state = 18; + } + break; + case 18: + { + s8 var = Menu_ProcessInputNoWrap_(); + + if (var == 0) + { + sub_8133CA4(); + sub_81328E8(gOtherText_WhichMoveToForget); + sLearnMoveStruct->state = 19; + } + else if (var == -1 || var == 1) + { + sub_8133CA4(); + sLearnMoveStruct->state = 24; + } + } + break; + case 24: + sub_81328E8(gOtherText_StopLearningMove); + sLearnMoveStruct->state++; + break; + case 25: + if (Menu_UpdateWindowText()) + { + sLearnMoveStruct->state = 26; + DisplayYesNoMenu(21, 7, 1); + } + break; + case 26: + { + s8 var = Menu_ProcessInputNoWrap_(); + + if (var == 0) + { + sub_8133CA4(); + sLearnMoveStruct->state = 27; + } + else if (var == -1 || var == 1) + { + sub_8133CA4(); + + // What's the point? It gets set to 16, anyway. + if (sLearnMoveStruct->showContestInfo == FALSE) + sLearnMoveStruct->state = 3; + if (sLearnMoveStruct->showContestInfo == TRUE) + sLearnMoveStruct->state = 5; + sLearnMoveStruct->state = 16; + } + } + break; + case 27: + if (Menu_UpdateWindowText()) + { + if (sLearnMoveStruct->showContestInfo == FALSE) + sLearnMoveStruct->state = 3; + if (sLearnMoveStruct->showContestInfo == TRUE) + sLearnMoveStruct->state = 5; + } + break; + case 19: + if (Menu_UpdateWindowText()) + { + sLearnMoveStruct->state = 20; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + } + break; + case 20: + if (!gPaletteFade.active) + { + ShowSelectMovePokemonSummaryScreen(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, sub_81327A4, sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]); + sLearnMoveStruct->state = 28; + } + break; + case 21: + if (Menu_UpdateWindowText()) + sLearnMoveStruct->state = 14; + break; + case 22: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + break; + case 14: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + sLearnMoveStruct->state++; + break; + case 15: + if (!gPaletteFade.active) + SetMainCallback2(c2_exit_to_overworld_2_switch); + break; + case 28: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + sLearnMoveStruct->state++; + DrawLearnMoveMenuWindow(); + sub_8133800(); + if (sLearnMoveStruct->showContestInfo == FALSE) + sub_8133030(TRUE); + if (sLearnMoveStruct->showContestInfo == TRUE) + { + gSprites[1].pos1.x = 0x48; + sub_8133140(1); + } + sub_8133AEC(sLearnMoveStruct->showContestInfo, 1); + break; + case 29: + if (!gPaletteFade.active) + { + if (sLearnMoveStruct->unk2C6 == 4) + { + sLearnMoveStruct->state = 24; + } + else + { + u16 moveId = GetMonData(&gPlayerParty[sLearnMoveStruct->partyMon], MON_DATA_MOVE1 + sLearnMoveStruct->unk2C6); + + StringCopy(gStringVar3, gMoveNames[moveId]); + RemoveMonPPBonus(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->unk2C6); + SetMonMoveSlot(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection], sLearnMoveStruct->unk2C6); + StringCopy(gStringVar2, gMoveNames[sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]]); + sub_81328E8(gOtherText_ForgotMove123); + sLearnMoveStruct->state = 30; + gSpecialVar_0x8004 = 1; + } + } + break; + case 30: + if (Menu_UpdateWindowText()) + { +#ifdef ENGLISH + sub_81328E8(gOtherText_ForgotOrDidNotLearnMove); +#else + sub_81328E8(deuOtherText_ForgotAndLearned); +#endif + sLearnMoveStruct->state = 31; + PlayFanfare(BGM_FANFA1); + } + break; + case 31: + if (Menu_UpdateWindowText()) + { + PlayFanfare(BGM_FANFA1); + sLearnMoveStruct->state = 32; + } + break; + case 32: + if (IsFanfareTaskInactive()) + sLearnMoveStruct->state = 33; + break; + case 33: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sLearnMoveStruct->state = 14; + } + break; + } +} + +void DrawLearnMoveMenuWindow(void) +{ + u32 i; + + BasicInitMenuWindow(&gWindowTemplate_81E7240); + for (i = 0; i < 4; i++) + { + Menu_DrawStdWindowFrame( + gUnknown_08402CF8[i][0], + gUnknown_08402CF8[i][1], + gUnknown_08402CF8[i][2], + gUnknown_08402CF8[i][3]); + } + BasicInitMenuWindow(&gWindowTemplate_81E6CE4); +} + +void sub_8133030(bool8 a) +{ + s32 i; + + gSprites[sLearnMoveStruct->spriteIDs[0]].invisible = FALSE; + gSprites[sLearnMoveStruct->spriteIDs[1]].invisible = FALSE; + + for (i = 0; i < 16; i++) + gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = TRUE; + + for (i = 0; gUnknown_08402D08[0][i].unk0 != NULL; i++) + { + sub_8072C74(gTileBuffer, gUnknown_08402D08[0][i].unk0, 64, 2); + Menu_PrintText(gTileBuffer, gUnknown_08402D08[0][i].unk4, gUnknown_08402D08[0][i].unk5); + } + + if (!a) + sub_8072AB0(gOtherText_TeachWhichMove, 24, 120, 192, 32, 1); +} + +u8 sub_81330E8(void) +{ + u32 result = (gMain.newKeys & DPAD_LEFT) || (gMain.newKeys & DPAD_RIGHT); + + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR + && ((gMain.newKeys & L_BUTTON) || (gMain.newKeys & R_BUTTON))) + result++; + + if (result != 0) + { + PlaySE(SE_SELECT); + sLearnMoveStruct->state = 5; + sLearnMoveStruct->showContestInfo = TRUE; + } + + return result; +} + +void sub_8133140(bool8 a) +{ + s32 i; + + gSprites[sLearnMoveStruct->spriteIDs[0]].invisible = FALSE; + gSprites[sLearnMoveStruct->spriteIDs[1]].invisible = FALSE; + + for (i = 0; i < 16; i++) + gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = FALSE; + + for (i = 0; gUnknown_08402D08[0][i].unk0 != NULL; i++) + { + sub_8072C74(gTileBuffer, gUnknown_08402D08[1][i].unk0, 64, 2); + Menu_PrintText(gTileBuffer, gUnknown_08402D08[1][i].unk4, gUnknown_08402D08[1][i].unk5); + if (i != 0) + { + Menu_EraseWindowRect( + gUnknown_08402D08[1][i].unk4, + gUnknown_08402D08[1][i].unk5 + 2, + gUnknown_08402D08[1][i].unk4 + 7, + gUnknown_08402D08[1][i].unk5 + 3); + } + } + + if (!a) + sub_8072AB0(gOtherText_TeachWhichMove, 24, 120, 192, 32, 1); +} + +u8 sub_8133248(void) +{ + u32 result = (gMain.newKeys & DPAD_LEFT) || (gMain.newKeys & DPAD_RIGHT); + + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR + && ((gMain.newKeys & L_BUTTON) || (gMain.newKeys & R_BUTTON))) + result++; + + if (result != 0) + { + PlaySE(SE_SELECT); + sLearnMoveStruct->state = 3; + sLearnMoveStruct->showContestInfo = FALSE; + } + + return result; +} + +void ClearLearnMoveVars(void) +{ + s32 i; + + sLearnMoveStruct->state = 0; + sLearnMoveStruct->unk2 = 0; + sLearnMoveStruct->unk19 = 0; + sLearnMoveStruct->unk18 = 0; + sLearnMoveStruct->unk1C = 0; + sLearnMoveStruct->numMenuChoices = 0; + sLearnMoveStruct->menuSelection = 0; + sLearnMoveStruct->unk1D = FALSE; + sLearnMoveStruct->unk1E = 0; + sLearnMoveStruct->unk2C3 = FALSE; + sLearnMoveStruct->showContestInfo = FALSE; + for (i = 0; i < 20; i++) + sLearnMoveStruct->movesToLearn[i] = 0; +} + +void sub_8133300(struct Sprite *sprite) +{ + s16 var = (sprite->data[1] * 10) & 0xFF; + + switch (sprite->data[0]) + { + case 0: + break; + case 1: + sprite->pos2.x = Sin(var, 3) * sprite->data[2]; + break; + case 2: + sprite->pos2.y = Sin(var, 1) * sprite->data[2]; + break; + } + sprite->data[1]++; +} + +void sub_8133358(void) +{ + s32 i; + + sLearnMoveStruct->spriteIDs[0] = CreateSprite(&gSpriteTemplate_8402D90, 8, 16, 0); + gSprites[sLearnMoveStruct->spriteIDs[0]].data[0] = 1; + gSprites[sLearnMoveStruct->spriteIDs[0]].data[2] = -1; + + sLearnMoveStruct->spriteIDs[1] = CreateSprite(&gSpriteTemplate_8402D90, 72, 16, 0); + StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[1]], 1); + gSprites[sLearnMoveStruct->spriteIDs[1]].data[0] = 1; + gSprites[sLearnMoveStruct->spriteIDs[1]].data[2] = 1; + + sLearnMoveStruct->spriteIDs[2] = CreateSprite(&gSpriteTemplate_8402DC0, 160, 4, 0); + StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[2]], 1); + gSprites[sLearnMoveStruct->spriteIDs[2]].data[0] = 2; + gSprites[sLearnMoveStruct->spriteIDs[2]].data[2] = -1; + + sLearnMoveStruct->spriteIDs[3] = CreateSprite(&gSpriteTemplate_8402DC0, 160, 60, 0); + gSprites[sLearnMoveStruct->spriteIDs[3]].data[0] = 2; + gSprites[sLearnMoveStruct->spriteIDs[3]].data[2] = 1; + + for (i = 0; i < 8; i++) + { + sLearnMoveStruct->spriteIDs[i + 4] = CreateSprite(&gSpriteTemplate_8402E08, (i - (i / 4) * 4) * 8 + 0x1C, (i / 4) * 8 + 0x34, 0); + StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 4]], 2); + } + + for (i = 0; i < 8; i++) + { + sLearnMoveStruct->spriteIDs[i + 12] = CreateSprite(&gSpriteTemplate_8402E08, (i - (i / 4) * 4) * 8 + 0x1C, (i / 4) * 8 + 0x5C, 0); + StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 12]], 2); + } + + for (i = 0; i < 20; i++) + gSprites[sLearnMoveStruct->spriteIDs[i]].invisible = TRUE; + + CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 18); +} + +void sub_8133558(void) +{ + s32 i; + u8 nickname[POKEMON_NAME_LENGTH + 1]; + + sLearnMoveStruct->numMenuChoices = GetMoveRelearnerMoves(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->movesToLearn); + for (i = 0; i < sLearnMoveStruct->numMenuChoices; i++) + StringCopy(sLearnMoveStruct->moveNames[i], gMoveNames[sLearnMoveStruct->movesToLearn[i]]); + GetMonData(&gPlayerParty[sLearnMoveStruct->partyMon], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar1, nickname); + StringCopy(sLearnMoveStruct->moveNames[sLearnMoveStruct->numMenuChoices], gUnknownText_Exit); + sLearnMoveStruct->numMenuChoices++; +} + +void sub_813360C(s8 delta) +{ + sLearnMoveStruct->unk1C = sLearnMoveStruct->unk18; + sLearnMoveStruct->unk18 += delta; + sLearnMoveStruct->unk1D = TRUE; +} + +void sub_813362C(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (sLearnMoveStruct->menuSelection != 0) + { + PlaySE(SE_SELECT); + sLearnMoveStruct->menuSelection--; + sLearnMoveStruct->unk2C3 = TRUE; + if (sLearnMoveStruct->unk18 != 0) + { + sub_813360C(-1); + } + else if (sLearnMoveStruct->unk19 != 0) + { + sLearnMoveStruct->unk19--; + sLearnMoveStruct->unk1E++; + } + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (sLearnMoveStruct->menuSelection < sLearnMoveStruct->numMenuChoices - 1) + { + PlaySE(SE_SELECT); + sLearnMoveStruct->menuSelection++; + sLearnMoveStruct->unk2C3 = TRUE; + if (sLearnMoveStruct->unk18 != 2) + { + sub_813360C(1); + } + else if (sLearnMoveStruct->unk19 != sLearnMoveStruct->numMenuChoices - 3) + { + sLearnMoveStruct->unk19++; + sLearnMoveStruct->unk1E++; + } + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (sLearnMoveStruct->menuSelection != sLearnMoveStruct->numMenuChoices - 1) + { + sLearnMoveStruct->state = 8; + StringCopy(gStringVar2, sLearnMoveStruct->moveNames[sLearnMoveStruct->menuSelection]); + StringExpandPlaceholders(gStringVar4, gOtherText_TeachSpecificMove); + MenuPrintMessage(gStringVar4, 3, 15); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_GiveUpTeachingMove); + MenuPrintMessage(gStringVar4, 3, 15); + sLearnMoveStruct->state = 12; + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sLearnMoveStruct->state = 12; + StringExpandPlaceholders(gStringVar4, gOtherText_GiveUpTeachingMove); + MenuPrintMessage(gStringVar4, 3, 15); + } + if (sLearnMoveStruct->numMenuChoices > 3) + { + gSprites[2].invisible = FALSE; + gSprites[3].invisible = FALSE; + if (sLearnMoveStruct->unk19 == 0) + gSprites[2].invisible = TRUE; + else if (sLearnMoveStruct->unk19 == sLearnMoveStruct->numMenuChoices - 3) + gSprites[3].invisible = TRUE; + } +} + +void sub_8133800(void) +{ + u8 r6 = sLearnMoveStruct->unk19; + u8 *str = gTileBuffer; + s32 i; + + for (i = 0; i < 3; i++) + { + if (r6 >= sLearnMoveStruct->numMenuChoices) + { + str = sub_8072C74(str, gEmptyString_81E72B0, 0x90, 0); + } + else if (r6 == sLearnMoveStruct->numMenuChoices - 1) + { + str = sub_8072C74(str, gUnknownText_Exit, 0x90, 0); + } + else + { + u16 moveId = sLearnMoveStruct->movesToLearn[r6]; + + if (sLearnMoveStruct->showContestInfo) + str = sub_8072C74(str, gUnknown_083CAF70[gContestMoves[moveId].contestCategory], 0x27, 0); + else + str = sub_8072C74(str, gTypeNames[gBattleMoves[moveId].type], 0x27, 0); + + str = sub_8072C74(str, sLearnMoveStruct->moveNames[r6], 0x72, 0); + + str[0] = CHAR_P; + str[1] = CHAR_P; + str[2] = CHAR_SLASH; + str += 3; + + str = sub_8072C14(str, gBattleMoves[moveId].pp, 0x90, 0); + } + *str++ = CHAR_NEWLINE; + r6++; + } + *str = EOS; + Menu_PrintText(gTileBuffer, 11, 1); + sub_813360C(0); +} + +const u8 gUnknown_08402E24[7][3] = +{ + {11, 1, 1}, + { 3, 6, 2}, + {24, 1, 3}, + { 3, 11, 4}, + { 5, 4, 5}, + { 3, 6, 6}, + { 3, 11, 7}, +}; + +const u8 gUnknown_08402E39[] = {0, 1, 2, 3}; +const u8 gUnknown_08402E3D[] = {4, 5, 6}; + +void PrintMoveInfo(u16 moveId, const u8 *b) +{ + u8 str[0x34]; + u8 numHearts; + u8 i; + + StringCopy(str, gExpandedPlaceholder_Empty); + switch (b[2]) + { + case 1: + break; + case 2: + if (gBattleMoves[moveId].power < 2) + sub_8072C74(str, gOtherText_ThreeDashes2, 32, 2); + else + sub_8072C14(str, gBattleMoves[moveId].power, 32, 2); + Menu_PrintText(str, b[0], b[1]); + break; + case 4: + if (gBattleMoves[moveId].accuracy == 0) + sub_8072C74(str, gOtherText_ThreeDashes2, 32, 2); + else + sub_8072C14(str, gBattleMoves[moveId].accuracy, 32, 2); + Menu_PrintText(str, b[0], b[1]); + break; + case 6: + Menu_EraseWindowRect(b[0], b[1], b[0], b[1] + 1); + numHearts = gContestEffects[gContestMoves[moveId].effect].appeal / 10; + if (numHearts == 255) + numHearts = 0; + for (i = 0; i < 8; i++) + { + if (i < numHearts) + StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 4]], 1); + else + StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 4]], 0); + } + break; + case 7: + Menu_EraseWindowRect(b[0], b[1], b[0], b[1] + 1); + numHearts = gContestEffects[gContestMoves[moveId].effect].jam / 10; + if (numHearts == 255) + numHearts = 0; + for (i = 0; i < 8; i++) + { + if (i < numHearts) + StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 12]], 3); + else + StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 12]], 2); + } + break; + } +} + +void sub_8133AEC(bool8 contestInfo, int unused) +{ + u16 i; + + if (sLearnMoveStruct->menuSelection != sLearnMoveStruct->numMenuChoices - 1) + { + u16 moveId = sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]; + + if (contestInfo) + { + for (i = 0; i < 16; i++) + gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = FALSE; + for (i = 0; i < 3; i++) + PrintMoveInfo(moveId, gUnknown_08402E24[gUnknown_08402E3D[i]]); + sub_8072AB0(gContestEffectStrings[gContestMoves[moveId].effect], 0x58, 0x48, 0x90, 32, 1); + } + else + { + u8 var; + + for (i = 0; i < 4; i++) + PrintMoveInfo(moveId, gUnknown_08402E24[gUnknown_08402E39[i]]); + var = sub_8072A18(gMoveDescriptions[moveId - 1], 0x58, 0x48, 0x90, 1); + if (var < 2) + { + u8 r1 = var * 2 + 9; + + Menu_BlankWindowRect(11, r1, 28, 12); + } + } + } + else + { + if (contestInfo) + { + Menu_EraseWindowRect(gUnknown_08402E24[5][0], gUnknown_08402E24[5][1], gUnknown_08402E24[5][0], gUnknown_08402E24[5][1] + 1); + Menu_EraseWindowRect(gUnknown_08402E24[6][0], gUnknown_08402E24[6][1], gUnknown_08402E24[6][0], gUnknown_08402E24[6][1] + 1); + for (i = 0; i < 16; i++) + gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = TRUE; + } + else + { + Menu_EraseWindowRect(gUnknown_08402E24[1][0], gUnknown_08402E24[1][1], gUnknown_08402E24[1][0] + 3, gUnknown_08402E24[1][1] + 1); + Menu_EraseWindowRect(gUnknown_08402E24[3][0], gUnknown_08402E24[3][1], gUnknown_08402E24[3][0] + 3, gUnknown_08402E24[3][1] + 1); + } + Menu_EraseWindowRect(11, 9, 28, 12); + } +} + +void sub_8133CA4(void) +{ + Menu_EraseWindowRect(21, 7, 27, 12); + sub_8133AEC(sLearnMoveStruct->showContestInfo, 0); +} diff --git a/src/link.c b/src/link.c new file mode 100644 index 000000000..45807830a --- /dev/null +++ b/src/link.c @@ -0,0 +1,1888 @@ +#include "global.h" +#include "cable_club.h" +#include "link.h" +#include "battle.h" +#include "berry.h" +#include "hall_of_fame.h" +#include "item_use.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "random.h" +#include "save.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "ewram.h" + +#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT) + +struct BlockTransfer +{ + u16 pos; + u16 size; + void *src; + bool8 active; + u8 multiplayerId; +}; + +struct LinkTestBGInfo +{ + u32 screenBaseBlock; + u32 paletteNum; + u32 dummy_8; + u32 dummy_C; +}; + +extern u16 gBattleTypeFlags; + +extern u16 word_3004858; + +extern void Blender_SetBankBerryData(u8 bank, u16 itemID); + +static void InitLinkTestBG(u8, u8, u8, u8); +void LinkTestScreen(); +static void InitLocalLinkPlayer(void); +static void VBlankCB_LinkTest(void); +static void InitLink(void); +static void Task_TriggerHandshake(u8); +static void TestBlockTransfer(u32, u32, u32); +static void LinkTestProcessKeyInput(void); +static void CB2_LinkTest(void); +static void HandleReceiveRemoteLinkPlayer(u8); +static void ProcessRecvCmds(u8); +static void BuildSendCmd(u16); +static void sub_8007B44(void); +static void ResetBlockSend(void); +static bool8 InitBlockSend(void *, u32); +static void LinkCB_BlockSendBegin(void); +static void LinkCB_BlockSend(void); +static void LinkCB_BlockSendEnd(void); +static void sub_8007E04(void); +u32 sub_8007E40(void); +static void SetBlockReceivedFlag(u8); +static u16 LinkTestCalcBlockChecksum(void *, u16); +static void PrintHexDigit(u8, u8, u8); +static void LinkCB_RequestPlayerDataExchange(void); +static void Task_PrintTestData(u8); +bool8 sub_8008224(void); +u8 GetDummy2(void); +static void sub_8008350(void); +static void sub_800837C(void); +static void sub_80083E0(void); +static void sub_8008454(void); +static void sub_80084C8(void); +static void sub_80084F4(void); + +static void CheckErrorStatus(void); +void CB2_PrintErrorMessage(void); +static u8 IsSioMultiMaster(void); +static void DisableSerial(void); +static void EnableSerial(void); +static void CheckMasterOrSlave(void); +static void InitTimer(void); +static void EnqueueSendCmd(u16 *); +static void DequeueRecvCmds(u16[CMD_LENGTH][MAX_LINK_PLAYERS]); +static void StartTransfer(void); +static bool8 DoHandshake(void); +static void DoRecv(void); +static void DoSend(void); +static void StopTimer(void); +static void SendRecvDone(void); +void ResetSendBuffer(void); +void ResetRecvBuffer(void); + +static struct BlockTransfer sBlockSend; +static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS]; +static u32 sBlockSendDelayCounter; +static u32 sDummy1; +static u8 sDummy2; +static u32 sPlayerDataExchangeStatus; +static u32 sErrorLinkStatus; +static u32 sErrorLastRecvQueueCount; +static u32 sErrorLastSendQueueCount; +static u32 sDummy3; +static u8 sLinkTestLastBlockSendPos; +static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS]; +static u8 sNumVBlanksWithoutSerialIntr; +static bool8 sSendBufferEmpty; +static u16 sSendNonzeroCheck; +static u16 sRecvNonzeroCheck; +static u8 sChecksumAvailable; +static u8 sHandshakePlayerCount; + +u16 word_3002910[MAX_LINK_PLAYERS]; +u32 gLinkDebugValue1; +struct LinkPlayerBlock localLinkPlayerBlock; +bool8 gLinkErrorOccurred; +u32 gLinkDebugValue2; +bool8 gLinkPlayerPending[MAX_LINK_PLAYERS]; +struct LinkPlayer gLinkPlayers[MAX_LINK_PLAYERS]; +bool8 gBlockReceived[MAX_LINK_PLAYERS]; +u16 gLinkHeldKeys; +u16 gLinkTimeOutCounter; +struct LinkPlayer localLinkPlayer; +u16 gRecvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]; +u32 gLinkStatus; +bool8 gLinkDummyBool; +u8 byte_3002A68; +u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE]; +bool8 u8_array_3002B70[MAX_LINK_PLAYERS]; +u16 gLinkType; +bool8 u8_array_3002B78[MAX_LINK_PLAYERS]; +u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; +bool8 gSuppressLinkErrorMessage; +u8 gSavedLinkPlayerCount; +u16 gSendCmd[CMD_LENGTH]; +u8 gSavedMultiplayerId; +bool8 gReceivedRemoteLinkPlayers; +struct LinkTestBGInfo gLinkTestBGInfo; +void (*gLinkCallback)(void); +struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS]; +u8 gShouldAdvanceLinkState; +u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS]; +#if DEBUG +u8 gUnknown_Debug_30030E0; +#endif +u8 gBlockRequestType; +u8 gLastSendQueueCount; +struct Link gLink; +u8 gLastRecvQueueCount; +u16 gLinkSavedIme; + +#ifdef GERMAN +u8 deUnkValue1; +u8 deUnkValue2; +#endif + +EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = 0; +EWRAM_DATA bool8 gLinkTestDummyBool = 0; +EWRAM_DATA u32 gFiller_20238B8 = 0; +EWRAM_DATA u32 dword_20238BC = 0; +EWRAM_DATA bool8 gLinkOpen = 0; + +static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); +static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp"); + +static const u8 sDebugMessages[7][12] = +{ + _("せつぞく ちゅうです"), + _("せつぞく できません"), + _("かくにん ちゅうです"), + _("かくにん できました"), + _("かくにん できません"), + _("かくにん を かくにん"), + _("かくにん は しっぱい"), +}; + +static const u8 sColorCodes[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE2}"); + +const struct BlockRequest sBlockRequestLookupTable[5] = +{ + {gBlockSendBuffer, 200}, + {gBlockSendBuffer, 200}, + {gBlockSendBuffer, 100}, + {gBlockSendBuffer, 220}, + {gBlockSendBuffer, 40}, +}; + +static const u8 sTestString[] = _("テストな"); + +const u8 sMagic[] = "GameFreak inc."; + +const u8 sEmptyString[] = _(" "); + +void Task_DestroySelf(u8 taskId) +{ + DestroyTask(taskId); +} + +static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) +{ + LoadPalette(sLinkTestDigitPalette, 16 * paletteNum, 32); + DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220); + + gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; + gLinkTestBGInfo.paletteNum = paletteNum; + + switch (bgNum) + { + case 1: + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); + break; + case 2: + REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); + break; + case 3: + REG_BG3CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock); + break; + } +} + +void InitLinkTestBG_Unused(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) +{ + LoadPalette(sLinkTestDigitPalette, 16 * paletteNum, 32); + DmaCopy16(3, sLinkTestDigitTiles, BG_CHAR_ADDR(charBaseBlock), 0x220); + + gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; + gLinkTestBGInfo.paletteNum = paletteNum; + + *gBGControlRegs[bgNum] = (screenBaseBlock << 8) | (charBaseBlock << 2); +} + +void LinkTestScreen(void) +{ + s32 i; + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB_LinkTest); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); + ResetBlockSend(); + gLinkType = 0x1111; + OpenLink(); + SeedRng(gMain.vblankCounter1); + + for (i = 0; i < 4; i++) + { + // Very weird code, but nothing else seems to match. + // The following would have the same effect: + // gSaveBlock2.playerTrainerId[i] = Random(); + u8 *trainerId = gSaveBlock2.playerTrainerId; + s32 r; + s32 mask = 0xFF; + trainerId[i] = (r = Random()) & mask; + } + + InitLinkTestBG(0, 2, 4, 0); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_1D_MAP; + CreateTask(Task_DestroySelf, 0); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + sDummy3 = 0; + InitLocalLinkPlayer(); + CreateTask(Task_PrintTestData, 0); + SetMainCallback2(CB2_LinkTest); +} + +void sub_8007270(u8 a1) +{ + localLinkPlayer.lp_field_18 = a1; +} + +static void InitLocalLinkPlayer(void) +{ + s32 i; + + localLinkPlayer.trainerId = gSaveBlock2.playerTrainerId[0] + | (gSaveBlock2.playerTrainerId[1] << 8) + | (gSaveBlock2.playerTrainerId[2] << 16) + | (gSaveBlock2.playerTrainerId[3] << 24); + + for (i = 0; i < (s32)sizeof(localLinkPlayer.name); i++) + localLinkPlayer.name[i] = gSaveBlock2.playerName[i]; // UB: reads past the end of "playerName" array + + localLinkPlayer.gender = gSaveBlock2.playerGender; + localLinkPlayer.linkType = gLinkType; + localLinkPlayer.language = gGameLanguage; + localLinkPlayer.version = gGameVersion + 0x4000; + localLinkPlayer.lp_field_2 = 0; +} + +static void VBlankCB_LinkTest(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void InitLink(void) +{ + s32 i; + + for (i = 0; i < CMD_LENGTH; i++) + gSendCmd[i] = 0xEFFF; + + gLinkOpen = TRUE; + EnableSerial(); +} + +static void Task_TriggerHandshake(u8 taskId) +{ + gTasks[taskId].data[0]++; + + if (gTasks[taskId].data[0] == 5) + { + gShouldAdvanceLinkState = 1; + DestroyTask(taskId); + } +} + +void OpenLink(void) +{ + s32 i; + + ResetSerial(); + InitLink(); + + gLinkCallback = LinkCB_RequestPlayerDataExchange; + gLinkVSyncDisabled = FALSE; + gLinkErrorOccurred = FALSE; + gSuppressLinkErrorMessage = FALSE; + + ResetBlockReceivedFlags(); + + sDummy1 = 0; + byte_3002A68 = 0; + gLinkDummyBool = FALSE; + gReceivedRemoteLinkPlayers = FALSE; + + for (i = 0; i < 4; i++) + { + gLinkPlayerPending[i] = TRUE; + u8_array_3002B78[i] = 0; + u8_array_3002B70[i] = 0; + } + + CreateTask(Task_TriggerHandshake, 2); +} + +void CloseLink(void) +{ + gReceivedRemoteLinkPlayers = FALSE; + gLinkOpen = FALSE; + DisableSerial(); +} + +static void TestBlockTransfer(u32 a1, u32 a2, u32 a3) +{ + u8 i; + u8 val; + + if (sLinkTestLastBlockSendPos != sBlockSend.pos) + { + PrintHex(sBlockSend.pos, 2, 3, 2); + sLinkTestLastBlockSendPos = sBlockSend.pos; + } + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) + { + PrintHex(sBlockRecv[i].pos, 2, i + 4, 2); + sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos; + } + } + + val = GetBlockReceivedStatus(); + + if (val == 0xF) + { + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if ((val >> i) & 1) + { + gLinkTestBlockChecksums[i] = LinkTestCalcBlockChecksum(&gBlockRecvBuffer[i], sBlockRecv[i].size); + ResetBlockReceivedFlag(i); + if (gLinkTestBlockChecksums[i] != 834) + { + gLinkTestDebugValuesEnabled = FALSE; + gLinkTestDummyBool = FALSE; + } + } + } + } +} + +static void LinkTestProcessKeyInput(void) +{ + if (gMain.newKeys & A_BUTTON) + gShouldAdvanceLinkState = 1; + if (gMain.heldKeys & B_BUTTON) + InitBlockSend(ewram4000, 0x2004); + if (gMain.newKeys & L_BUTTON) + BeginNormalPaletteFade(-1, 0, 0x10, 0, 2); + if (gMain.newKeys & START_BUTTON) + SetSuppressLinkErrorMessage(TRUE); + if (gMain.newKeys & R_BUTTON) + Save_WriteData(SAVE_LINK); + if (gMain.newKeys & SELECT_BUTTON) + sub_800832C(); + if (gLinkTestDebugValuesEnabled) + { + u32 vblankCounter1 = gMain.vblankCounter1; + u8 val = gLinkVSyncDisabled; + if (!gLinkCallback) + val = gLinkVSyncDisabled | 0x10; + SetLinkDebugValues(vblankCounter1, val); + } +} + +static void CB2_LinkTest(void) +{ + LinkTestProcessKeyInput(); + TestBlockTransfer(1, 1, 0); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +u16 LinkMain2(u16 *heldKeys) +{ + u8 i; + + if (!gLinkOpen) + return 0; + + for (i = 0; i < CMD_LENGTH; i++) + gSendCmd[i] = 0; + + gLinkHeldKeys = *heldKeys; + + if (gLinkStatus & LINK_STAT_CONN_ESTABLISHED) + { + ProcessRecvCmds(SIO_MULTI_CNT->id); + if (gLinkCallback) + gLinkCallback(); + CheckErrorStatus(); + } + + return gLinkStatus; +} + +static void HandleReceiveRemoteLinkPlayer(u8 multiplayerId) +{ + u32 pendingLinkPlayerCount = 0; + s32 i; + + gLinkPlayerPending[multiplayerId] = FALSE; + + for (i = 0; i < GetLinkPlayerCount_2(); i++) + pendingLinkPlayerCount += gLinkPlayerPending[i]; + + if (pendingLinkPlayerCount == 0 && !gReceivedRemoteLinkPlayers) + gReceivedRemoteLinkPlayers = TRUE; +} + +static void ProcessRecvCmds(u8 unusedParam) +{ + u16 i; + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + word_3002910[i] = 0; + if (!gRecvCmds[0][i]) + continue; + switch (gRecvCmds[0][i]) + { + case 0x2222: + InitLocalLinkPlayer(); + localLinkPlayerBlock.linkPlayer = localLinkPlayer; + memcpy(localLinkPlayerBlock.magic1, sMagic, sizeof(localLinkPlayerBlock.magic1) - 1); + memcpy(localLinkPlayerBlock.magic2, sMagic, sizeof(localLinkPlayerBlock.magic2) - 1); + InitBlockSend(&localLinkPlayerBlock, sizeof(localLinkPlayerBlock)); + break; + case 0x4444: + word_3002910[i] = gRecvCmds[1][i]; + break; + case 0x5555: + byte_3002A68 = 1; + break; + case 0x5566: + byte_3002A68 = 1; + break; + case 0xBBBB: + { + struct BlockTransfer *blockRecv = &sBlockRecv[i]; + blockRecv->pos = 0; + blockRecv->size = gRecvCmds[1][i]; + blockRecv->multiplayerId = gRecvCmds[2][i]; + break; + } + case 0x8888: + if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE) + { + u16 *buffer = (u16 *)gSharedMem; + u16 j; + for (j = 0; j < CMD_LENGTH - 1; j++) + buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i]; + } + else + { + u16 j; + for (j = 0; j < CMD_LENGTH - 1; j++) + gBlockRecvBuffer[i][(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i]; + } + + sBlockRecv[i].pos += (CMD_LENGTH - 1) * 2; + + if (sBlockRecv[i].pos >= sBlockRecv[i].size) + { + if (gLinkPlayerPending[i] == TRUE) + { + struct LinkPlayerBlock *block = (struct LinkPlayerBlock *)&gBlockRecvBuffer[i]; + struct LinkPlayer *linkPlayer = &gLinkPlayers[i]; + *linkPlayer = block->linkPlayer; + + if (strcmp(block->magic1, sMagic) + || strcmp(block->magic2, sMagic)) + { + SetMainCallback2(CB2_LinkError); + } + else + { + HandleReceiveRemoteLinkPlayer(i); + } + + ConvertInternationalString(gLinkPlayers[i].name, gLinkPlayers[i].language); + } + else + { + SetBlockReceivedFlag(i); +#if DEBUG + debug_sub_808B838(i); +#endif + } + } + break; + case 0x5FFF: + u8_array_3002B78[i] = 1; + break; + case 0x2FFE: + u8_array_3002B70[i] = 1; + break; + case 0xAAAA: + sub_8007E24(); + break; + case 0xAAAB: + Blender_SetBankBerryData(i, gRecvCmds[1][i]); + break; + case 0xCCCC: +#if defined(ENGLISH) + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); +#elif defined(GERMAN) + if (deUnkValue2 == 1) + { + deUnkValue2 = 2; + deUnkValue1 = gRecvCmds[1][i]; + } + else if (deUnkValue2 == 2 || deUnkValue2 == 3) + { + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); + + if (deUnkValue2 == 2) + deUnkValue2 = 1; + else + deUnkValue2 = 0; + } + else + { + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); + } +#endif + break; + case 0xCAFE: + word_3002910[i] = gRecvCmds[1][i]; + break; + } + } +} + +static void BuildSendCmd(u16 code) +{ + switch (code) + { + case 0x2222: + gSendCmd[0] = 0x2222; + gSendCmd[1] = gLinkType; + break; + case 0x2FFE: + gSendCmd[0] = 0x2FFE; + break; + case 0x4444: + gSendCmd[0] = 0x4444; + gSendCmd[1] = gMain.heldKeys; + break; + case 0x5555: + gSendCmd[0] = 0x5555; + break; + case 0x5566: + gSendCmd[0] = 0x5566; + break; + case 0x6666: + gSendCmd[0] = 0x6666; + gSendCmd[1] = 0; + break; + case 0x7777: + { + u8 i; + + gSendCmd[0] = 0x7777; + + for (i = 0; i < 5; i++) + gSendCmd[i + 1] = 0xEE; + + break; + } + case 0xBBBB: + gSendCmd[0] = 0xBBBB; + gSendCmd[1] = sBlockSend.size; + gSendCmd[2] = sBlockSend.multiplayerId + 128; + break; + case 0xAAAA: + gSendCmd[0] = 0xAAAA; + break; + case 0xAAAB: + gSendCmd[0] = 0xAAAB; + gSendCmd[1] = gSpecialVar_ItemId; + break; + case 0xCCCC: + gSendCmd[0] = 0xCCCC; + gSendCmd[1] = gBlockRequestType; + break; + case 0x5FFF: + gSendCmd[0] = 0x5FFF; + break; + case 0xCAFE: + if (!word_3004858 || gLinkTransferringData) + break; + gSendCmd[0] = 0xCAFE; + gSendCmd[1] = word_3004858; + break; + } +} + +void sub_8007B14(void) +{ + gLinkCallback = sub_8007B44; +} + +bool32 sub_8007B24(void) +{ + if (gLinkCallback == sub_8007B44) + return TRUE; + else + return FALSE; +} + +static void sub_8007B44(void) +{ + if (gReceivedRemoteLinkPlayers == TRUE) + BuildSendCmd(0xCAFE); +} + +void ClearLinkCallback(void) +{ + gLinkCallback = NULL; +} + +void ClearLinkCallback_2(void) +{ + gLinkCallback = NULL; +} + +u8 GetLinkPlayerCount(void) +{ + return EXTRACT_PLAYER_COUNT(gLinkStatus); +} + +void OpenLinkTimed(void) +{ + sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED; + gLinkTimeOutCounter = 0; +#if defined(GERMAN) + ResetBlockSend(); +#endif + OpenLink(); +} + +u8 GetLinkPlayerDataExchangeStatusTimed(void) +{ + s32 i; + s32 count = 0; + u32 index; + + if (gReceivedRemoteLinkPlayers == TRUE) + { + if (GetLinkPlayerCount() == 0) + { + gLinkErrorOccurred = TRUE; + CloseLink(); + } + + i = 0; + index = 0; + + while (i < GetLinkPlayerCount()) + { + if (gLinkPlayers[index].linkType == gLinkPlayers[0].linkType) + ++count; + ++index; + ++i; + } + + if (count == GetLinkPlayerCount()) + sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; + else + sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; + } + else + { + gLinkTimeOutCounter++; + if (gLinkTimeOutCounter > 600) + sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT; + } + + return sPlayerDataExchangeStatus; +} + +bool8 IsLinkPlayerDataExchangeComplete(void) +{ + u8 i; + u8 count = 0; + u8 isComplete; + + for (i = 0; i < GetLinkPlayerCount(); i++) + if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType) + count++; + + if (count == GetLinkPlayerCount()) + { + isComplete = TRUE; + sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; + } + else + { + isComplete = FALSE; + sPlayerDataExchangeStatus = EXCHANGE_IN_PROGRESS; + } + + return isComplete; +} + +u32 GetLinkPlayerTrainerId(u8 multiplayerId) +{ + return gLinkPlayers[multiplayerId].trainerId; +} + +void ResetLinkPlayers(void) +{ + s32 i; + for (i = 0; i < 4; i++) + memset(&gLinkPlayers[i], 0, sizeof(struct LinkPlayer)); +} + +static void ResetBlockSend(void) +{ + sBlockSend.active = FALSE; + sBlockSend.pos = 0; + sBlockSend.size = 0; + sBlockSend.src = NULL; +} + +static bool8 InitBlockSend(void *data, u32 size) +{ + if (sBlockSend.active) + { + return FALSE; + } + else + { + sBlockSend.multiplayerId = GetMultiplayerId(); + sBlockSend.active = TRUE; + sBlockSend.size = size; + sBlockSend.pos = 0; + + if (size > BLOCK_BUFFER_SIZE) + { + sBlockSend.src = data; + } + else + { + if (data != gBlockSendBuffer) + memcpy(gBlockSendBuffer, data, size); + sBlockSend.src = gBlockSendBuffer; + } + + BuildSendCmd(0xBBBB); + gLinkCallback = LinkCB_BlockSendBegin; + sBlockSendDelayCounter = 0; + return TRUE; + } +} + +static void LinkCB_BlockSendBegin(void) +{ + sBlockSendDelayCounter++; + if (sBlockSendDelayCounter > 2) + gLinkCallback = LinkCB_BlockSend; +} + +static void LinkCB_BlockSend(void) +{ + s32 i; + u8 *buffer = sBlockSend.src; + + gSendCmd[0] = 0x8888; + + for (i = 0; i < CMD_LENGTH - 1; i++) + { + s32 offset = sBlockSend.pos + 2 * i; + gSendCmd[i + 1] = (buffer[offset + 1] << 8) | buffer[offset]; + } + + sBlockSend.pos += (CMD_LENGTH - 1) * 2; + + if (sBlockSend.size <= sBlockSend.pos) + { + sBlockSend.active = FALSE; + gLinkCallback = LinkCB_BlockSendEnd; + } +} + +static void LinkCB_BlockSendEnd(void) +{ + gLinkCallback = NULL; +} + +static void sub_8007E04(void) +{ + GetMultiplayerId(); // whats the point of calling this if you dont use the multiplayer ID? + BuildSendCmd(0x4444); + dword_20238BC++; +} + +void sub_8007E24(void) +{ + dword_20238BC = 0; + gLinkCallback = sub_8007E04; +} + +u32 sub_8007E40(void) +{ + return dword_20238BC; +} + +void sub_8007E4C(void) +{ + BuildSendCmd(0xAAAA); +} + +u8 GetMultiplayerId(void) +{ + return SIO_MULTI_CNT->id; +} + +u8 bitmask_all_link_players_but_self(void) +{ + return ((1 << GetMultiplayerId()) ^ 0xF); +} + +bool8 SendBlock(u8 a1, void *a2, u16 a3) +{ + return InitBlockSend(a2, a3); +} + +bool8 sub_8007E9C(u8 a1) +{ + if (!gLinkCallback) + { + gBlockRequestType = a1; + BuildSendCmd(0xCCCC); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 IsLinkTaskFinished(void) +{ + return gLinkCallback == NULL; +} + +u8 GetBlockReceivedStatus(void) +{ + return (gBlockReceived[3] << 3) + | (gBlockReceived[2] << 2) + | (gBlockReceived[1] << 1) + | gBlockReceived[0]; +} + +static void SetBlockReceivedFlag(u8 multiplayerId) +{ + gBlockReceived[multiplayerId] = TRUE; +} + +void ResetBlockReceivedFlags(void) +{ + s32 i; + for (i = 0; i < 4; i++) + gBlockReceived[i] = FALSE; +} + +void ResetBlockReceivedFlag(u8 multiplayerId) +{ + if (gBlockReceived[multiplayerId]) + gBlockReceived[multiplayerId] = FALSE; +} + +void sub_8007F4C(void) +{ + if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1) + gShouldAdvanceLinkState = 1; +} + +static u16 LinkTestCalcBlockChecksum(void *data, u16 size) +{ + u16 sum = 0; + u16 i; + + for (i = 0; i < size / 2; i++) + sum += ((u16 *)data)[i]; + + return sum; +} + +static void PrintHexDigit(u8 tileNum, u8 x, u8 y) +{ + u16 *tilemap = BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); + tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1); +} + +void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits) +{ + u8 buffer[16]; + s32 i; + + for (i = 0; i < maxDigits; i++) + { + buffer[i] = num & 0xF; + num >>= 4; + } + + for (i = maxDigits - 1; i >= 0; i--) + { + PrintHexDigit(buffer[i], x, y); + x++; + } +} + +#if DEBUG + +EWRAM_DATA uintptr_t debugCharacterBase = 0; +EWRAM_DATA uintptr_t unk_20238C8 = 0; +EWRAM_DATA u16 *debugTileMap = NULL; +EWRAM_DATA u32 unk_20238D0 = 0; + +void debug_sub_8008218(u16 *buffer, u32 arg1, u16 *arg2, u32 arg3) +{ + CpuSet(sLinkTestDigitTiles, buffer, 272); + debugCharacterBase = (uintptr_t)buffer; + unk_20238C8 = (uintptr_t)arg1; + debugTileMap = arg2; + unk_20238D0 = arg3; +} + +void debug_sub_8008264(u32 value, int left, int top, int d, int e) +{ + s32 i; + u32 buffer[8]; + + if (unk_20238D0 == e) + { + u32 *ptr; + u16 *tilemapDest; + + if (d > 8) + d = 8; + ptr = buffer; + for (i = 0; i < d; i++) + { + *ptr++ = value & 0xF; + value >>= 4; + } + + tilemapDest = (u16 *)debugTileMap + top * 0x20 + left; + ptr = buffer + d - 1; + for (i = 0; i < d; i++) + { + *tilemapDest = (debugCharacterBase - unk_20238C8) / 32 + *ptr + 1; + ptr--; + tilemapDest++; + } + } +} + +#endif + +static void LinkCB_RequestPlayerDataExchange(void) +{ + // Only one request needs to be sent, so only the master sends it. + if (gLinkStatus & LINK_STAT_MASTER) + BuildSendCmd(0x2222); + gLinkCallback = NULL; +} + +void Task_PrintTestData(u8 taskId) +{ + s32 i; + + PrintHex(gShouldAdvanceLinkState, 2, 1, 2); + PrintHex(gLinkStatus, 15, 1, 8); + PrintHex(gLink.state, 2, 10, 2); + PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2); + PrintHex(GetMultiplayerId(), 15, 12, 2); + PrintHex(gLastSendQueueCount, 25, 1, 2); + PrintHex(gLastRecvQueueCount, 25, 2, 2); + PrintHex(GetBlockReceivedStatus(), 15, 5, 2); + PrintHex(gLinkDebugValue1, 2, 12, 8); + PrintHex(gLinkDebugValue2, 2, 13, 8); + PrintHex(GetSioMultiSI(), 25, 5, 1); + PrintHex(IsSioMultiMaster(), 25, 6, 1); + PrintHex(IsLinkConnectionEstablished(), 25, 7, 1); + PrintHex(HasLinkErrorOccurred(), 25, 8, 1); + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); +} + +void SetLinkDebugValues(u32 value1, u32 value2) +{ + gLinkDebugValue1 = value1; + gLinkDebugValue2 = value2; +} + +u8 sub_8008198(void) +{ + u8 result = 0; + s32 i; + + for (i = 0; i < gSavedLinkPlayerCount; i++) + result |= (1 << i); + + return result; +} + +void sub_80081C8(u8 playerCount) +{ + s32 i; + + gSavedLinkPlayerCount = playerCount; + gSavedMultiplayerId = GetMultiplayerId(); + + for (i = 0; i < 4; i++) + gSavedLinkPlayers[i] = gLinkPlayers[i]; +} + +u8 sub_800820C(void) +{ + return gSavedLinkPlayerCount; +} + +u8 sub_8008218(void) +{ + return gSavedMultiplayerId; +} + +bool8 sub_8008224(void) +{ + s32 count = 0; + s32 i; + + for (i = 0; i < gSavedLinkPlayerCount; i++) + if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) + count++; + + if (count == gSavedLinkPlayerCount) + return TRUE; + else + return FALSE; +} + +void sub_800826C(void) +{ + u8 i; + + for (i = 0; i < gSavedLinkPlayerCount; i++) + { + if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId + || StringCompareWithoutExtCtrlCodes(gSavedLinkPlayers[i].name, gLinkPlayers[i].name)) + { + gLinkErrorOccurred = TRUE; + CloseLink(); + SetMainCallback2(CB2_LinkError); + } + } +} + +void sub_80082EC(void) +{ + gSavedLinkPlayerCount = 0; + gSavedMultiplayerId = 0; +} + +u8 GetLinkPlayerCount_2(void) +{ + return EXTRACT_PLAYER_COUNT(gLinkStatus); +} + +bool8 IsLinkMaster(void) +{ + return EXTRACT_MASTER(gLinkStatus); +} + +u8 GetDummy2(void) +{ + return sDummy2; +} + +void sub_800832C(void) +{ + if (!gLinkCallback) + { + gLinkCallback = sub_8008350; + gLinkDummyBool = FALSE; + } +} + +static void sub_8008350(void) +{ + if (gLastRecvQueueCount == 0) + { + BuildSendCmd(0x5FFF); + gLinkCallback = sub_800837C; + } +} + +static void sub_800837C(void) +{ + s32 i; + s32 totalCount = GetLinkPlayerCount(); + s32 count = 0; + + for (i = 0; i < totalCount; i++) + if (u8_array_3002B78[i]) + count++; + + if (count == totalCount) + { + gBattleTypeFlags &= ~BATTLE_TYPE_20; + gLinkVSyncDisabled = TRUE; + CloseLink(); + gLinkCallback = NULL; + gLinkDummyBool = TRUE; + } +} + +static void sub_80083E0(void) +{ + s32 i; + s32 totalCount = GetLinkPlayerCount(); + s32 count = 0; + + for (i = 0; i < totalCount; i++) + { + if (gLinkPlayers[i].language == 1) + count++; + else if (u8_array_3002B78[i]) + count++; + } + + if (count == totalCount) + { + gBattleTypeFlags &= ~BATTLE_TYPE_20; + gLinkVSyncDisabled = TRUE; + CloseLink(); + gLinkCallback = 0; + gLinkDummyBool = TRUE; + } +} + +static void sub_8008454(void) +{ + if (gLastRecvQueueCount == 0) + { + BuildSendCmd(0x5FFF); + gLinkCallback = sub_80083E0; + } +} + +void sub_8008480(void) +{ + if (!gLinkCallback) + { + gLinkCallback = sub_8008454; + gLinkDummyBool = FALSE; + } +} + +void sub_80084A4(void) +{ + if (!gLinkCallback) + gLinkCallback = sub_80084C8; + gLinkDummyBool = FALSE; +} + +static void sub_80084C8(void) +{ + if (gLastRecvQueueCount == 0) + { + BuildSendCmd(0x2FFE); + gLinkCallback = sub_80084F4; + } +} + +static void sub_80084F4(void) +{ + u8 totalCount = GetLinkPlayerCount(); + u8 count = 0; + + while (count < totalCount && u8_array_3002B70[count]) + count++; + + if (count == totalCount) + { + u8 i; + for (i = 0; i < 4; i++) + u8_array_3002B70[i] = 0; + gLinkCallback = NULL; + } +} + +static void CheckErrorStatus(void) +{ + if (gLinkOpen) + { + if (gLinkStatus & LINK_STAT_ERRORS) + { + if (!gSuppressLinkErrorMessage) + { + sErrorLinkStatus = gLinkStatus; + sErrorLastRecvQueueCount = gLastRecvQueueCount; + sErrorLastSendQueueCount = gLastSendQueueCount; + SetMainCallback2(CB2_LinkError); + } + gLinkErrorOccurred = TRUE; + CloseLink(); + } + } +} + +void CB2_LinkError(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetPaletteFadeControl(); + FillPalette(0, 0, 2); + ResetTasks(); + SetVBlankCallback(VBlankCB_LinkTest); + Text_LoadWindowTemplate(&gWindowTemplate_81E7198); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E7198); + Menu_EraseScreen(); + REG_BLDALPHA = 0; + REG_BG0VOFS = 0; + REG_BG0HOFS = 0; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + gSoftResetDisabled = FALSE; + CreateTask(Task_DestroySelf, 0); + StopMapMusic(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + SetMainCallback2(CB2_PrintErrorMessage); +} + +void CB2_PrintErrorMessage(void) +{ + u8 array[32] __attribute__((unused)); // unused + u8 array2[32] __attribute__((unused)); // unused + + switch (gMain.state) + { + case 0: + Menu_PrintTextPixelCoords(gMultiText_LinkError, 20, 56, 1); +#if DEBUG + StringCopy(array, sColorCodes); + + ConvertIntToHexStringN(array2, sErrorLinkStatus, STR_CONV_MODE_LEADING_ZEROS, 8); + StringAppend(array, array2); + + StringAppend(array, sEmptyString); + + ConvertIntToHexStringN(array2, sErrorLastSendQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(array, array2); + + StringAppend(array, sEmptyString); + + ConvertIntToHexStringN(array2, sErrorLastRecvQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(array, array2); + + Menu_PrintText(array, 2, 15); +#endif + break; + case 30: + case 60: + PlaySE(SE_BOO); + break; + case 90: + PlaySE(SE_BOO); + break; + } + + if (gMain.state != 200) + gMain.state++; +} + +u8 GetSioMultiSI(void) +{ + return (REG_SIOCNT >> SIO_MULTI_SI_SHIFT) & SIO_MULTI_SI_MASK; +} + +static bool8 IsSioMultiMaster(void) +{ + bool8 isMaster = FALSE; + + if ((REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI)) + isMaster = TRUE; + + return isMaster; +} + +bool8 IsLinkConnectionEstablished(void) +{ + return EXTRACT_CONN_ESTABLISHED(gLinkStatus); +} + +void SetSuppressLinkErrorMessage(bool8 value) +{ + gSuppressLinkErrorMessage = value; +} + +bool8 HasLinkErrorOccurred(void) +{ + return gLinkErrorOccurred; +} + +static void DisableSerial(void) +{ + gLinkSavedIme = REG_IME; + REG_IME = 0; + REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + REG_IME = gLinkSavedIme; + + REG_SIOCNT = 0; + REG_TM3CNT_H = 0; + REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL; + + CpuFill32(0, &gLink, sizeof(gLink)); +} + +static void EnableSerial(void) +{ + gLinkSavedIme = REG_IME; + REG_IME = 0; + REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + REG_IME = gLinkSavedIme; + + REG_RCNT = 0; + + REG_SIOCNT = SIO_MULTI_MODE; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_115200_BPS; + + gLinkSavedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = gLinkSavedIme; + + REG_SIOMLT_SEND = 0; + + CpuFill32(0, &gLink, sizeof(gLink)); + + sNumVBlanksWithoutSerialIntr = 0; + sSendNonzeroCheck = 0; + sRecvNonzeroCheck = 0; + sChecksumAvailable = FALSE; + sHandshakePlayerCount = 0; + gLastSendQueueCount = 0; + gLastRecvQueueCount = 0; +} + +void ResetSerial(void) +{ + EnableSerial(); + DisableSerial(); +} + +u32 LinkMain1(u8 *shouldAdvanceLinkState, u16 *sendCmd, u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]) +{ + u32 retVal; + u32 retVal2; + + switch (gLink.state) + { + case LINK_STATE_START0: + DisableSerial(); + gLink.state = LINK_STATE_START1; + break; + case LINK_STATE_START1: + if (*shouldAdvanceLinkState == 1) + { + EnableSerial(); + gLink.state = LINK_STATE_HANDSHAKE; + } + break; + case LINK_STATE_HANDSHAKE: + switch (*shouldAdvanceLinkState) + { + case 1: + if (gLink.isMaster == 8 && gLink.playerCount > 1) + gLink.handshakeAsMaster = TRUE; + break; + case 2: + gLink.state = LINK_STATE_START0; + REG_SIOMLT_SEND = 0; + break; + default: + CheckMasterOrSlave(); + break; + } + break; + case LINK_STATE_INIT_TIMER: + InitTimer(); + gLink.state = LINK_STATE_CONN_ESTABLISHED; + case LINK_STATE_CONN_ESTABLISHED: + EnqueueSendCmd(sendCmd); + DequeueRecvCmds(recvCmds); + break; + } + + *shouldAdvanceLinkState = 0; + + retVal = gLink.localId; + retVal |= (gLink.playerCount << 2); + + if (gLink.isMaster == 8) + retVal |= 0x20; + + { + u32 receivedNothing = gLink.receivedNothing << 8; + u32 link_field_F = gLink.link_field_F << 9; + u32 hardwareError = gLink.hardwareError << 12; + u32 badChecksum = gLink.badChecksum << 13; + u32 queueFull = gLink.queueFull << 14; + u32 val; + + if (gLink.state == LINK_STATE_CONN_ESTABLISHED) + { + val = 0x40; + val |= receivedNothing; + val |= retVal; + val |= link_field_F; + val |= hardwareError; + val |= badChecksum; + val |= queueFull; + } + else + { + val = retVal; + val |= receivedNothing; + val |= link_field_F; + val |= hardwareError; + val |= badChecksum; + val |= queueFull; + } + + retVal = val; + } + + if (gLink.lag == LAG_MASTER) + retVal |= 0x10000; + + if (gLink.localId > 3) + retVal |= 0x20000; + + retVal2 = retVal; + if (gLink.lag == LAG_SLAVE) + retVal2 |= 0x40000; + + return retVal2; +} + +static void CheckMasterOrSlave(void) +{ + u32 terminals = *(u32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SD | SIO_MULTI_SI); + + if (terminals == SIO_MULTI_SD && !gLink.localId) + gLink.isMaster = 8; + else + gLink.isMaster = 0; +} + +static void InitTimer(void) +{ + if (gLink.isMaster) + { + REG_TM3CNT_L = 65339; + REG_TM3CNT_H = TIMER_INTR_ENABLE | TIMER_64CLK; + + gLinkSavedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_TIMER3; + REG_IME = gLinkSavedIme; + } +} + +static void EnqueueSendCmd(u16 *sendCmd) +{ + gLinkSavedIme = REG_IME; + REG_IME = 0; + + if (gLink.sendQueue.count < QUEUE_CAPACITY) + { + u8 i; + u8 offset = gLink.sendQueue.pos + gLink.sendQueue.count; + + if (offset >= QUEUE_CAPACITY) + offset -= QUEUE_CAPACITY; + + for (i = 0; i < CMD_LENGTH; i++) + { + sSendNonzeroCheck |= *sendCmd; + gLink.sendQueue.data[i][offset] = *sendCmd; + *sendCmd = 0; + sendCmd++; + } + } + else + { + gLink.queueFull = QUEUE_FULL_SEND; + } + + if (sSendNonzeroCheck) + { + gLink.sendQueue.count++; + sSendNonzeroCheck = 0; + } + + REG_IME = gLinkSavedIme; + gLastSendQueueCount = gLink.sendQueue.count; +} + +void DequeueRecvCmds(u16 recvCmds[CMD_LENGTH][MAX_LINK_PLAYERS]) +{ + u8 i; + u8 j; + + gLinkSavedIme = REG_IME; + REG_IME = 0; + + if (gLink.recvQueue.count == 0) + { + for (i = 0; i < CMD_LENGTH; i++) + for (j = 0; j < gLink.playerCount; j++) + recvCmds[i][j] = 0; + + gLink.receivedNothing = TRUE; + } + else + { + for (i = 0; i < CMD_LENGTH; i++) + for (j = 0; j < gLink.playerCount; j++) + recvCmds[i][j] = gLink.recvQueue.data[j][i][gLink.recvQueue.pos]; + + gLink.recvQueue.count--; + gLink.recvQueue.pos++; + + if (gLink.recvQueue.pos >= QUEUE_CAPACITY) + gLink.recvQueue.pos = 0; + + gLink.receivedNothing = FALSE; + } + + REG_IME = gLinkSavedIme; +} + +void LinkVSync(void) +{ + if (gLink.isMaster) + { + switch (gLink.state) + { + case LINK_STATE_HANDSHAKE: + StartTransfer(); + break; + case LINK_STATE_CONN_ESTABLISHED: + if (gLink.serialIntrCounter > 8) + { + if (gLink.lag == LAG_MASTER) + return; + gLink.serialIntrCounter = 0; + } + else if (gLink.hardwareError != TRUE) + { + gLink.lag = LAG_MASTER; + return; + } + StartTransfer(); + break; + } + } + else if (gLink.state == LINK_STATE_CONN_ESTABLISHED + || gLink.state == LINK_STATE_HANDSHAKE) + { + sNumVBlanksWithoutSerialIntr++; + + if (sNumVBlanksWithoutSerialIntr > 10) + { + if (gLink.state == LINK_STATE_CONN_ESTABLISHED) + gLink.lag = LAG_SLAVE; + + if (gLink.state == LINK_STATE_HANDSHAKE) + { + gLink.playerCount = 0; + gLink.link_field_F = 0; + } + } + } +} + +void Timer3Intr(void) +{ + StopTimer(); + StartTransfer(); +} + +void SerialCB(void) +{ + gLink.localId = SIO_MULTI_CNT->id; + + switch (gLink.state) + { + case LINK_STATE_CONN_ESTABLISHED: + gLink.hardwareError = SIO_MULTI_CNT->error; + DoRecv(); + DoSend(); + SendRecvDone(); + break; + case LINK_STATE_HANDSHAKE: + if (DoHandshake()) + { + if (gLink.isMaster) + { + gLink.state = LINK_STATE_INIT_TIMER; + gLink.serialIntrCounter = 8; + } + else + { + gLink.state = LINK_STATE_CONN_ESTABLISHED; + } + } + break; + } + + gLink.serialIntrCounter++; + sNumVBlanksWithoutSerialIntr = 0; + + if (gLink.serialIntrCounter == 8) + gLastRecvQueueCount = gLink.recvQueue.count; +} + +static void StartTransfer(void) +{ + REG_SIOCNT |= SIO_START; +} + +static bool8 DoHandshake(void) +{ + u8 i; + u8 playerCount = 0; + u16 minRecv = 0xFFFF; + + if (gLink.handshakeAsMaster == TRUE) + REG_SIOMLT_SEND = MASTER_HANDSHAKE; + else + REG_SIOMLT_SEND = SLAVE_HANDSHAKE; + + *(u64 *)&gLink.tempRecvBuffer[0] = REG_SIOMLT_RECV; + REG_SIOMLT_RECV = 0; + + gLink.handshakeAsMaster = FALSE; + + for (i = 0; i < 4; i++) + { + if ((gLink.tempRecvBuffer[i] & ~0x3) == SLAVE_HANDSHAKE + || gLink.tempRecvBuffer[i] == MASTER_HANDSHAKE) + { + playerCount++; + + if (minRecv > gLink.tempRecvBuffer[i] && gLink.tempRecvBuffer[i] != 0) + minRecv = gLink.tempRecvBuffer[i]; + } + else + { + if (gLink.tempRecvBuffer[i] != 0xFFFF) + playerCount = 0; + break; + } + } + + gLink.playerCount = playerCount; + + // The handshake is successful when: + // 1. There are multiple players. + // 2. The number of players agrees with the last attempt. + // 3. Player no. 0 is identifying as the master. + if (gLink.playerCount > 1 + && gLink.playerCount == sHandshakePlayerCount + && gLink.tempRecvBuffer[0] == MASTER_HANDSHAKE) + return TRUE; + + if (gLink.playerCount > 1) + gLink.link_field_F = (minRecv & 3) + 1; + else + gLink.link_field_F = 0; + + sHandshakePlayerCount = gLink.playerCount; + + return FALSE; +} + +static void DoRecv(void) +{ + u16 recvBuffer[4]; + u8 i; + + *(u64 *)&recvBuffer[0] = REG_SIOMLT_RECV; + + if (gLink.sendCmdIndex == 0) + { + for (i = 0; i < gLink.playerCount; i++) + if (gLink.checksum != recvBuffer[i] && sChecksumAvailable) + gLink.badChecksum = TRUE; + + gLink.checksum = 0; + sChecksumAvailable = TRUE; + } + else + { + u8 index = gLink.recvQueue.pos + gLink.recvQueue.count; + + if (index >= QUEUE_CAPACITY) + index -= QUEUE_CAPACITY; + + if (gLink.recvQueue.count < QUEUE_CAPACITY) + { + for (i = 0; i < gLink.playerCount; i++) + { + gLink.checksum += recvBuffer[i]; + sRecvNonzeroCheck |= recvBuffer[i]; + gLink.recvQueue.data[i][gLink.recvCmdIndex][index] = recvBuffer[i]; + } + } + else + { + gLink.queueFull = QUEUE_FULL_RECV; + } + + gLink.recvCmdIndex++; + + if (gLink.recvCmdIndex == CMD_LENGTH && sRecvNonzeroCheck) + { + gLink.recvQueue.count++; + sRecvNonzeroCheck = 0; + } + } +} + +static void DoSend(void) +{ + if (gLink.sendCmdIndex == CMD_LENGTH) + { + REG_SIOMLT_SEND = gLink.checksum; + + if (!sSendBufferEmpty) + { + gLink.sendQueue.count--; + gLink.sendQueue.pos++; + + if (gLink.sendQueue.pos >= QUEUE_CAPACITY) + gLink.sendQueue.pos = 0; + } + else + { + sSendBufferEmpty = FALSE; + } + } + else + { + if (!sSendBufferEmpty && gLink.sendQueue.count == 0) + sSendBufferEmpty = TRUE; + + if (sSendBufferEmpty) + REG_SIOMLT_SEND = 0; + else + REG_SIOMLT_SEND = gLink.sendQueue.data[gLink.sendCmdIndex][gLink.sendQueue.pos]; + + gLink.sendCmdIndex++; + } +} + +static void StopTimer(void) +{ + if (gLink.isMaster) + { + REG_TM3CNT_H &= ~TIMER_ENABLE; + REG_TM3CNT_L = 65339; + } +} + +static void SendRecvDone(void) +{ + if (gLink.recvCmdIndex == CMD_LENGTH) + { + gLink.sendCmdIndex = 0; + gLink.recvCmdIndex = 0; + } + else if (gLink.isMaster) + { + REG_TM3CNT_H |= TIMER_ENABLE; + } +} + +void ResetSendBuffer(void) +{ + u8 i; + u8 j; + + gLink.sendQueue.count = 0; + gLink.sendQueue.pos = 0; + + for (i = 0; i < CMD_LENGTH; i++) + for (j = 0; j < QUEUE_CAPACITY; j++) + gLink.sendQueue.data[i][j] = 0xEFFF; +} + +void ResetRecvBuffer(void) +{ + u8 i; + u8 j; + u8 k; + + gLink.recvQueue.count = 0; + gLink.recvQueue.pos = 0; + + for (i = 0; i < 4; i++) + for (j = 0; j < CMD_LENGTH; j++) + for (k = 0; k < QUEUE_CAPACITY; k++) + gLink.recvQueue.data[i][j][k] = 0xEFFF; +} diff --git a/src/load_save.c b/src/load_save.c new file mode 100644 index 000000000..8424b1121 --- /dev/null +++ b/src/load_save.c @@ -0,0 +1,168 @@ +#include "global.h" +#include "gba/flash_internal.h" +#include "load_save.h" +#include "main.h" +#include "pokemon.h" +#include "overworld.h" + +extern u8 gPlayerPartyCount; + +bool32 gFlashMemoryPresent; + +struct LoadedSaveData +{ + struct ItemSlot items[20]; + struct ItemSlot keyItems[20]; + struct ItemSlot pokeBalls[16]; + struct ItemSlot TMsHMs[64]; + struct ItemSlot berries[46]; + struct MailStruct mail[16]; +}; + +EWRAM_DATA struct SaveBlock2 gSaveBlock2 = {0}; +EWRAM_DATA struct SaveBlock1 gSaveBlock1 = {0}; + +static EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0}; + +void CheckForFlashMemory(void) +{ + if (!IdentifyFlash()) + { + gFlashMemoryPresent = TRUE; + InitFlashTimer(); + } + else + gFlashMemoryPresent = FALSE; +} + +bool32 GetSecretBase2Field_9(void) +{ + return gSaveBlock2.specialSaveWarp; +} + +void ClearSecretBase2Field_9(void) +{ + gSaveBlock2.specialSaveWarp = 0; +} + +void SetSecretBase2Field_9(void) +{ + gSaveBlock2.specialSaveWarp = 1; +} + +void SetSecretBase2Field_9_AndHideBG(void) // note: no other function sets specialSaveWarp to values other than 0 or 1, hence clear and set distinctions. +{ + gpu_sync_bg_hide(0); // the function doesn't use the parameter passed to it, but this is necessary to match. + gSaveBlock2.specialSaveWarp = 1; +} + +void ClearSecretBase2Field_9_2(void) // duplicate function +{ + gSaveBlock2.specialSaveWarp = 0; +} + +void SavePlayerParty(void) +{ + int i; + + gSaveBlock1.playerPartyCount = gPlayerPartyCount; + + for (i = 0; i < 6; i++) + gSaveBlock1.playerParty[i] = gPlayerParty[i]; +} + +void LoadPlayerParty(void) +{ + int i; + + gPlayerPartyCount = gSaveBlock1.playerPartyCount; + + for (i = 0; i < 6; i++) + gPlayerParty[i] = gSaveBlock1.playerParty[i]; +} + +static void SaveMapObjects(void) +{ + int i; + + for (i = 0; i < 16; i++) + gSaveBlock1.mapObjects[i] = gMapObjects[i]; +} + +static void LoadMapObjects(void) +{ + int i; + + for (i = 0; i < 16; i++) + gMapObjects[i] = gSaveBlock1.mapObjects[i]; +} + +void SaveSerializedGame(void) +{ + SavePlayerParty(); + SaveMapObjects(); +} + +void LoadSerializedGame(void) +{ + LoadPlayerParty(); + LoadMapObjects(); +} + +void LoadPlayerBag(void) +{ + int i; + + // load player items. + for (i = 0; i < 20; i++) + gLoadedSaveData.items[i] = gSaveBlock1.bagPocket_Items[i]; + + // load player key items. + for (i = 0; i < 20; i++) + gLoadedSaveData.keyItems[i] = gSaveBlock1.bagPocket_KeyItems[i]; + + // load player pokeballs. + for (i = 0; i < 16; i++) + gLoadedSaveData.pokeBalls[i] = gSaveBlock1.bagPocket_PokeBalls[i]; + + // load player TMs and HMs. + for (i = 0; i < 64; i++) + gLoadedSaveData.TMsHMs[i] = gSaveBlock1.bagPocket_TMHM[i]; + + // load player berries. + for (i = 0; i < 46; i++) + gLoadedSaveData.berries[i] = gSaveBlock1.bagPocket_Berries[i]; + + // load mail. + for (i = 0; i < 16; i++) + gLoadedSaveData.mail[i] = gSaveBlock1.mail[i]; +} + +void SavePlayerBag(void) +{ + int i; + + // save player items. + for (i = 0; i < 20; i++) + gSaveBlock1.bagPocket_Items[i] = gLoadedSaveData.items[i]; + + // save player key items. + for (i = 0; i < 20; i++) + gSaveBlock1.bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i]; + + // save player pokeballs. + for (i = 0; i < 16; i++) + gSaveBlock1.bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; + + // save player TMs and HMs. + for (i = 0; i < 64; i++) + gSaveBlock1.bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i]; + + // save player berries. + for (i = 0; i < 46; i++) + gSaveBlock1.bagPocket_Berries[i] = gLoadedSaveData.berries[i]; + + // save mail. + for (i = 0; i < 16; i++) + gSaveBlock1.mail[i] = gLoadedSaveData.mail[i]; +} diff --git a/src/lottery_corner.c b/src/lottery_corner.c new file mode 100644 index 000000000..03de26054 --- /dev/null +++ b/src/lottery_corner.c @@ -0,0 +1,174 @@ +#include "global.h" +#include "lottery_corner.h" +#include "event_data.h" +#include "constants/items.h" +#include "random.h" +#include "constants/species.h" +#include "string_util.h" +#include "text.h" + +extern u16 gSpecialVar_Result; +extern u16 gSpecialVar_0x8004; +extern struct PokemonStorage gPokemonStorage; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; +static EWRAM_DATA u16 sWinNumberDigit = 0; +static EWRAM_DATA u16 sOtIdDigit = 0; + +static const u16 sLotteryPrizes[] = +{ + ITEM_PP_UP, + ITEM_EXP_SHARE, + ITEM_MAX_REVIVE, + ITEM_MASTER_BALL, +}; + +static u8 GetMatchingDigits(u16, u16); + +void ResetLotteryCorner(void) +{ + u16 rand = Random(); + + SetLotteryNumber((Random() << 16) | rand); + VarSet(VAR_LOTTERY_PRIZE, 0); +} + +void SetRandomLotteryNumber(u16 i) +{ + u32 var = Random(); + + while (--i != 0xFFFF) + var = var * 1103515245 + 12345; + + SetLotteryNumber(var); +} + +void RetrieveLotteryNumber(void) +{ + u16 lottoNumber = GetLotteryNumber(); + gSpecialVar_Result = lottoNumber; +} + +void PickLotteryCornerTicket(void) +{ + u16 i; + u16 j; + u32 box; + u32 slot; + + gSpecialVar_0x8004 = 0; + slot = 0; + box = 0; + for (i = 0; i < 6; i++) + { + struct Pokemon *pkmn = &gPlayerParty[i]; + + // UB: Too few arguments for function GetMonData + if (GetMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE) + { + // do not calculate ticket values for eggs. + if (!GetMonData(pkmn, MON_DATA_IS_EGG)) + { + u32 otId = GetMonData(pkmn, MON_DATA_OT_ID); + u8 numMatchingDigits = GetMatchingDigits(gSpecialVar_Result, otId); + + if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1) + { + gSpecialVar_0x8004 = numMatchingDigits - 1; + box = 14; + slot = i; + } + } + } + else // pokemon are always arranged from populated spots first to unpopulated, so the moment a NONE species is found, that's the end of the list. + break; + } + + // player has 14 boxes. + for (i = 0; i < 14; i++) + { + // player has 30 slots per box. + for (j = 0; j < 30; j++) + { + struct BoxPokemon *pkmn = &gPokemonStorage.boxes[i][j]; + + // UB: Too few arguments for function GetMonData + if (GetBoxMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE && + !GetBoxMonData(pkmn, MON_DATA_IS_EGG)) + { + u32 otId = GetBoxMonData(pkmn, MON_DATA_OT_ID); + u8 numMatchingDigits = GetMatchingDigits(gSpecialVar_Result, otId); + + if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1) + { + gSpecialVar_0x8004 = numMatchingDigits - 1; + box = i; + slot = j; + } + } + } + } + + if (gSpecialVar_0x8004 != 0) + { + gSpecialVar_0x8005 = sLotteryPrizes[gSpecialVar_0x8004 - 1]; + + if (box == 14) + { + gSpecialVar_0x8006 = 0; + GetMonData(&gPlayerParty[slot], MON_DATA_NICKNAME, gStringVar1); + } + else + { + gSpecialVar_0x8006 = 1; + GetBoxMonData(&gPokemonStorage.boxes[box][slot], MON_DATA_NICKNAME, gStringVar1); + } + StringGetEnd10(gStringVar1); + } +} + +static u8 GetMatchingDigits(u16 winNumber, u16 otId) +{ + u8 i; + u8 matchingDigits = 0; + + for (i = 0; i < 5; i++) + { + sWinNumberDigit = winNumber % 10; + sOtIdDigit = otId % 10; + + if (sWinNumberDigit == sOtIdDigit) + { + winNumber = winNumber / 10; + otId = otId / 10; + matchingDigits++; + } + else + break; + } + return matchingDigits; +} + +// lottery numbers go from 0 to 99999, not 65535 (0xFFFF). interestingly enough, the function that calls GetLotteryNumber shifts to u16, so it cant be anything above 65535 anyway. +void SetLotteryNumber(u32 lotteryNum) +{ + u16 high = lotteryNum >> 16; + u16 low = lotteryNum; + + VarSet(VAR_LOTTERY_RND_L, low); + VarSet(VAR_LOTTERY_RND_H, high); +} + +u32 GetLotteryNumber(void) +{ + u16 low = VarGet(VAR_LOTTERY_RND_L); + u16 high = VarGet(VAR_LOTTERY_RND_H); + + return (high << 16) | low; +} + +// interestingly, this may have been the original lottery number set function, but GF tried to change it to 32-bit later but didnt finish changing all calls as one GetLotteryNumber still shifts to u16. +void SetLotteryNumber16_Unused(u16 lotteryNum) +{ + SetLotteryNumber(lotteryNum); +} diff --git a/src/mail.c b/src/mail.c new file mode 100644 index 000000000..4497c98fb --- /dev/null +++ b/src/mail.c @@ -0,0 +1,1159 @@ +#include "global.h" +#include "mail.h" +#include "data2.h" +#include "easy_chat.h" +#include "constants/items.h" +#include "constants/species.h" +#include "field_fadetransition.h" +#include "graphics.h" +#include "mail_data.h" +#include "menu.h" +#include "menu_helpers.h" +#include "name_string_util.h" +#include "palette.h" +#include "pokemon_icon.h" +#include "overworld.h" +#include "script.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "scanline_effect.h" +#include "ewram.h" + +extern u8 (*gMenuCallback)(void); + +struct UnkMailStruct +{ + u8 unk_0_0:2; + u8 unk_0_2:2; + u8 unk_0_4:4; +}; + +struct MailLayout +{ + u8 var0; + u8 var1; + u8 var2; + u8 var3_0:4; + u8 var3_4:4; + const struct UnkMailStruct *var4; +}; + +struct Unk2000000 +{ + /* 0x00*/ u8 words[8][27]; + /* 0xD8*/ u8 varD8[20]; + /* 0xEC*/ MainCallback varEC; + /* 0xF0*/ MainCallback varF0; + /* 0xF4*/ struct MailStruct *varF4; + /* 0xF8*/ u8 varF8; + /* 0xF9*/ u8 varF9; + /* 0xFA*/ u8 varFA; + /* 0xFB*/ u8 varFB; + /* 0xFC*/ u8 varFC; + u8 padFD[1]; + /* 0xFE*/ u8 varFE; + /* 0xFF*/ u8 varFF; + /*0x100*/ u8 var100; + u8 pad101[3]; + /*0x104*/ MainCallback var104; + /*0x108*/ MainCallback var108; + /*0x10C*/ const struct MailLayout *var10C; +}; + +struct MailGraphics +{ + const u16 *palette; + const u8 *tiles; + const u8 *tileMap; + u16 var0C; + u16 var0E; + u16 color10; + u16 color12; +}; + +const u16 gUnknown_083E562C[][2] = +{ + {0x6ACD, 0x51A5}, + {0x45FC, 0x38D4}, +}; + +const struct MailGraphics gMailGraphicsTable[] = +{ + { + .palette = gMailPalette_Orange, + .tiles = gMailTiles_Orange, + .tileMap = gMailTilemap_Orange, + .var0C = 0x2C0, + .var0E = 0, + .color10 = 0x294A, + .color12 = 0x6739, + }, + { + .palette = gMailPalette_Harbor, + .tiles = gMailTiles_Harbor, + .tileMap = gMailTilemap_Harbor, + .var0C = 0x2E0, + .var0E = 0, + .color10 = 0x7FFF, + .color12 = 0x4631, + }, + { + .palette = gMailPalette_Glitter, + .tiles = gMailTiles_Glitter, + .tileMap = gMailTilemap_Glitter, + .var0C = 0x400, + .var0E = 0, + .color10 = 0x294A, + .color12 = 0x6739, + }, + { + .palette = gMailPalette_Mech, + .tiles = gMailTiles_Mech, + .tileMap = gMailTilemap_Mech, + .var0C = 0x1E0, + .var0E = 0, + .color10 = 0x7FFF, + .color12 = 0x4631, + }, + { + .palette = gMailPalette_Wood, + .tiles = gMailTiles_Wood, + .tileMap = gMailTilemap_Wood, + .var0C = 0x2E0, + .var0E = 0, + .color10 = 0x7FFF, + .color12 = 0x4631, + }, + { + .palette = gMailPalette_Wave, + .tiles = gMailTiles_Wave, + .tileMap = gMailTilemap_Wave, + .var0C = 0x300, + .var0E = 0, + .color10 = 0x294A, + .color12 = 0x6739, + }, + { + .palette = gMailPalette_Bead, + .tiles = gMailTiles_Bead, + .tileMap = gMailTilemap_Bead, + .var0C = 0x140, + .var0E = 0, + .color10 = 0x7FFF, + .color12 = 0x4631, + }, + { + .palette = gMailPalette_Shadow, + .tiles = gMailTiles_Shadow, + .tileMap = gMailTilemap_Shadow, + .var0C = 0x300, + .var0E = 0, + .color10 = 0x7FFF, + .color12 = 0x4631, + }, + { + .palette = gMailPalette_Tropic, + .tiles = gMailTiles_Tropic, + .tileMap = gMailTilemap_Tropic, + .var0C = 0x220, + .var0E = 0, + .color10 = 0x294A, + .color12 = 0x6739, + }, + { + .palette = gMailPalette_Dream, + .tiles = gMailTiles_Dream, + .tileMap = gMailTilemap_Dream, + .var0C = 0x340, + .var0E = 0, + .color10 = 0x294A, + .color12 = 0x6739, + }, + { + .palette = gMailPalette_Fab, + .tiles = gMailTiles_Fab, + .tileMap = gMailTilemap_Fab, + .var0C = 0x2A0, + .var0E = 0, + .color10 = 0x294A, + .color12 = 0x6739, + }, + { + .palette = gMailPalette_Retro, + .tiles = gMailTiles_Retro, + .tileMap = gMailTilemap_Retro, + .var0C = 0x520, + .var0E = 0, + .color10 = 0x294A, + .color12 = 0x6739, + }, +}; + +const struct UnkMailStruct Unknown_3E5724[] = +{ + {0, 3, 0}, + {0, 3, 0}, + {0, 3, 0}, +}; + +const struct MailLayout gUnknown_083E5730[] = +{ + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, + {3, 16, 27, 4, 3, Unknown_3E5724}, + {3, 15, 27, 4, 3, Unknown_3E5724}, +}; + +const struct UnkMailStruct Unknown_3E5790[] = +{ + {0, 2, 0}, + {0, 2, 0}, + {0, 2, 0}, + {0, 2, 0}, + {0, 1, 0}, +}; + +const struct MailLayout gUnknown_083E57A4[] = +{ + {5, 15, 15, 4, 3, Unknown_3E5790}, + {5, 15, 15, 4, 3, Unknown_3E5790}, + {5, 15, 16, 4, 3, Unknown_3E5790}, + {5, 15, 15, 4, 3, Unknown_3E5790}, + {5, 15, 15, 4, 3, Unknown_3E5790}, + {5, 15, 16, 4, 3, Unknown_3E5790}, + {5, 15, 16, 4, 3, Unknown_3E5790}, + {5, 15, 15, 4, 3, Unknown_3E5790}, + {5, 15, 15, 4, 3, Unknown_3E5790}, + {5, 15, 15, 4, 3, Unknown_3E5790}, + {5, 16, 15, 4, 3, Unknown_3E5790}, + {5, 15, 15, 4, 3, Unknown_3E5790}, +}; + +#if DEBUG + +const u8 Str_8411540[] = _("レイアウトを にほんごで ひょうじ?"); // Display using Japanese layout? +const u8 Str_8411553[] = _("にほんご "); // Japanese +const u8 Str_8411559[] = _("かいがい "); // Overseas + +const u8 *const _8411560[] = +{ + Str_8411553, + Str_8411559, +}; + +const u8 Str_8411568[] = _("イメージ タイプを えらんでね"); // Choose an image type +const u8 Str_8411578[] = _("{STR_VAR_1}"); +const u8 Str_841157B[] = _("オレンジ "); // Orange +const u8 Str_8411581[] = _("ハーバー "); // Harbor +const u8 Str_8411587[] = _("キラキラ "); // Glitter +const u8 Str_841158D[] = _("メカニカル"); // Mech +const u8 Str_8411593[] = _("ウッディー"); // Wood +const u8 Str_8411599[] = _("クロス  "); // Wave +const u8 Str_841159F[] = _("トレジャー"); // Bead +const u8 Str_84115A5[] = _("シャドウ "); // Shadow +const u8 Str_84115AB[] = _("トロピカル"); // Tropic +const u8 Str_84115B1[] = _("ドリーム "); // Dream +const u8 Str_84115B7[] = _("ミラクル "); // Fab +const u8 Str_84115BD[] = _("レトロ  "); // Retro + +const u8 *const _84115C4[] = +{ + Str_841157B, + Str_8411581, + Str_8411587, + Str_841158D, + Str_8411593, + Str_8411599, + Str_841159F, + Str_84115A5, + Str_84115AB, + Str_84115B1, + Str_84115B7, + Str_84115BD, +}; + +const u8 Str_84115F4[] = _("メールをみる"); // View Mail +const u8 Str_84115FB[] = _("メールとうろく"); // Register Mail +const u8 Str_8411603[] = _("もたせる"); // Give to Pokémon +const u8 Str_8411608[] = _("メールをけす"); // Delete Mail + +#endif + +// XXX: what is this? +static u8 *const sSharedMemPtr = gSharedMem; + +static u8 sub_80F8A28(void); +static void sub_80F8D50(void); +static void sub_80F8DA0(void); +static void sub_80F8E80(void); +static void sub_80F8F18(void); +static void sub_80F8F2C(void); +static void sub_80F8F58(void); +static void sub_80F8F78(void); +static void sub_80F8FB4(void); + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +#if DEBUG +static u8 gUnknown_Debug_0300079C; +#endif + +void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) +{ + u16 buffer[2]; + u16 species; + +#if DEBUG + if (gUnknown_Debug_0300079C != 0) + { + ewram0_4.varFF = GAME_LANGUAGE; + ewram0_4.var100 = gSpecialVar_0x8004; + ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; + ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; + ewram0_4.varFA = gSpecialVar_0x8006; + } + else +#endif + { + ewram0_4.varFF = GAME_LANGUAGE; + ewram0_4.var100 = 1; + ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; + ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; + if (IS_ITEM_MAIL(arg0->itemId)) + { + ewram0_4.varFA = arg0->itemId - 0x79; + } + else + { + ewram0_4.varFA = 0; + arg2 = FALSE; + } + } + + switch (ewram0_4.var100) + { + case 0: + default: + ewram0_4.var10C = &gUnknown_083E5730[ewram0_4.varFA]; + break; + case 1: + ewram0_4.var10C = &gUnknown_083E57A4[ewram0_4.varFA]; + break; + } + + species = MailSpeciesToSpecies(arg0->species, buffer); + if (species >= 1 && species <= 411) + { + switch (ewram0_4.varFA) + { + case 6: + ewram0_4.varFB = 1; + break; + case 9: + ewram0_4.varFB = 2; + break; + default: + ewram0_4.varFB = 0; + break; + } + } + else + { + ewram0_4.varFB = 0; + } + + ewram0_4.varF4 = arg0; + ewram0_4.varEC = arg1; + ewram0_4.varF8 = arg2; + + SetMainCallback2(sub_80F8D50); +} + +#define RETURN_UP_STATE break +#define RETURN_SKIP_STATE return FALSE + +static u8 sub_80F8A28(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + REG_DISPCNT = 0; + RETURN_UP_STATE; + + case 1: CpuFill16(0, (void *)OAM, OAM_SIZE); + RETURN_UP_STATE; + + case 2: + ResetPaletteFade(); + RETURN_UP_STATE; + + case 3: + ResetTasks(); + RETURN_UP_STATE; + + case 4: + ResetSpriteData(); + RETURN_UP_STATE; + + case 5: + FreeAllSpritePalettes(); + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + RETURN_UP_STATE; + + case 6: + Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); + RETURN_UP_STATE; + + case 7: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC); + RETURN_UP_STATE; + + case 8: + if (MultistepInitMenuWindowContinue() == 0) + { + return FALSE; + } + RETURN_UP_STATE; + + case 9: + Menu_EraseScreen(); + RETURN_UP_STATE; + + case 10: CpuFill16(1, (void *)(VRAM + 0x4800), 0x800); + RETURN_UP_STATE; + + case 11: + LoadPalette(gMailGraphicsTable[ewram0_4.varFA].palette, 0, 16 * 2); + RETURN_UP_STATE; + + case 12: + LZ77UnCompVram(gMailGraphicsTable[ewram0_4.varFA].tileMap, (void *)(VRAM + 0x4000)); + RETURN_UP_STATE; + + case 13: + LZ77UnCompVram(gMailGraphicsTable[ewram0_4.varFA].tiles, (void *)(VRAM)); + + gPlttBufferUnfaded[241] = gMailGraphicsTable[ewram0_4.varFA].color10; + gPlttBufferUnfaded[248] = gMailGraphicsTable[ewram0_4.varFA].color12; + gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0]; + gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1]; + RETURN_UP_STATE; + + case 14: + if (ewram0_4.varF8 != 0) + { + sub_80F8DA0(); + } + RETURN_UP_STATE; + + case 15: + if (ewram0_4.varF8 != 0) + { + sub_80F8E80(); + } + + SetVBlankCallback(sub_80F8F18); + gPaletteFade.bufferTransferDisabled = 1; + RETURN_UP_STATE; + + case 16: + { + u16 local1; + + local1 = sub_809D4A8(ewram0_4.varF4->species); + + switch (ewram0_4.varFB) + { + case 1: + sub_809D580(local1); + ewram0_4.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0); + break; + + case 2: + sub_809D580(local1); + ewram0_4.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0); + break; + } + RETURN_UP_STATE; + } + + case 17: + if (sub_8055870() != TRUE) + { + RETURN_UP_STATE; + } + RETURN_SKIP_STATE; + + case 18: + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x512; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BLDCNT = 0; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + ewram0_4.varF0 = sub_80F8F58; + return TRUE; + + default: + return FALSE; + } + + gMain.state += 1; + return FALSE; +} + +static void sub_80F8D50(void) +{ + do + { + if (sub_80F8A28() == 1) + { + SetMainCallback2(sub_80F8F2C); + return; + } + } while (sub_80F9344() != 1); +} + +static u8 *sub_80F8D7C(u8 *dest, u8 *src) +{ + u16 length; + + StringCopy(dest, src); + SanitizeNameString(dest); + + length = StringLength(dest); + + return dest + length; +} + +static void sub_80F8DA0(void) +{ + u16 i; + u8 r6; + u8 *ptr; + + r6 = 0; + for (i = 0; i < ewram0_4.var10C->var0; i++) + { + ConvertEasyChatWordsToString(ewram0_4.words[i], &ewram0_4.varF4->words[r6], ewram0_4.var10C->var4[i].unk_0_2, 1); + r6 += ewram0_4.var10C->var4[i].unk_0_2; + } + ptr = ewram0_4.varD8; + if (ewram0_4.var100 == 0) + { + ptr = sub_80F8D7C(ptr, ewram0_4.varF4->playerName); + StringCopy(ptr, gOtherText_From); + ewram0_4.varF9 = ewram0_4.var10C->var2 - StringLength(ewram0_4.varD8); + + } + else + { + ptr = StringCopy(ptr, gOtherText_From); + sub_80F8D7C(ptr, ewram0_4.varF4->playerName); + ewram0_4.varF9 = ewram0_4.var10C->var2; + } +} + +static void sub_80F8E80(void) +{ + u16 pos; + u8 x; + u8 y = 0; + + for (pos = 0; pos < ewram0_4.var10C->var0; pos++) + { + if (ewram0_4.words[pos][0] == 0xFF) + { + continue; + } + + if (ewram0_4.words[pos][0] == 0x00) + { + continue; + } + + x = ewram0_4.var10C->var4[pos].unk_0_4; + y += ewram0_4.var10C->var4[pos].unk_0_0; + Menu_PrintText(ewram0_4.words[pos], ewram0_4.var10C->var3_4 + x, ewram0_4.var10C->var3_0 + y); + y += 2; + } + + Menu_PrintText(ewram0_4.varD8, ewram0_4.varF9, ewram0_4.var10C->var1); +} + +static void sub_80F8F18(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_80F8F2C(void) +{ + if (ewram0_4.varFB != 0) + { + AnimateSprites(); + BuildOamBuffer(); + } + + ewram0_4.varF0(); +} + +static void sub_80F8F58(void) +{ + u8 local0; + + local0 = UpdatePaletteFade(); + if (local0 == 0) + { + ewram0_4.varF0 = sub_80F8F78; + } +} + +static void sub_80F8F78(void) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + ewram0_4.varF0 = sub_80F8FB4; + } +} + +static void sub_80F8FB4(void) +{ + if (!UpdatePaletteFade()) + { + SetMainCallback2(ewram0_4.varEC); + switch (ewram0_4.varFB) + { + case 2: + case 1: + sub_809D608(sub_809D4A8(ewram0_4.varF4->species)); + sub_809D510(&gSprites[ewram0_4.varFC]); + break; + } +#if !DEBUG + memset(&ewram0_4, 0, 0x110); +#endif + ResetPaletteFade(); + } +} + +#if DEBUG + +void debug_sub_810CA7C(u8); +void debug_sub_810CE1C(u8); +void debug_sub_810D388(void); +void debug_sub_810D340(void); + +void debug_sub_810C910(u8 taskId) +{ + if (!gPaletteFade.active) + { + gUnknown_Debug_0300079C = 1; + Menu_EraseScreen(); + DestroyTask(taskId); + if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId == 0) + HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 0); + else + HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 1); + } +} + +void debug_sub_810C990(u8 taskId) +{ + if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN)) + { + gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 11) % 12; + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + } + else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT)) + { + gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 1) % 12; + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + } + else if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = debug_sub_810C910; + } + else if (gMain.newKeys & B_BUTTON) + { + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411540, 4, 15); + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + gTasks[taskId].func = debug_sub_810CA7C; + } +} + +void debug_sub_810CA7C(u8 taskId) +{ + if (gMain.newKeys & 0xF0) + { + gSpecialVar_0x8004 ^= 1; + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + } + else if (gMain.newKeys & A_BUTTON) + { + if (gMain.watchedKeysPressed) + { + gMain.watchedKeysPressed = FALSE; + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411540, 4, 15); + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); + } + else + { + Menu_DisplayDialogueFrame(); + Menu_PrintText(Str_8411568, 4, 15); + Menu_DrawStdWindowFrame(1, 1, 10, 4); + Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); + gTasks[taskId].func = debug_sub_810C990; + } + } +} + +void debug_sub_810CB50(u8 taskId) +{ + u8 sp0[] = _("{STR_VAR_1} {STR_VAR_2}"); + u8 sp8[] = _("メール{STR_VAR_1} {STR_VAR_2}"); + bool8 r2 = FALSE; + + if (gMain.newKeys & A_BUTTON) + { + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 2, 1); + StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]); + gSaveBlock1.mail[gSpecialVar_0x8005].species = gTasks[taskId].data[0]; + StringExpandPlaceholders(gStringVar4, sp8); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + DestroyTask(taskId); + CreateTask(debug_sub_810CE1C, 0); + debug_sub_810D340(); + return; + } + else if (gMain.newKeys & B_BUTTON) + { + DestroyTask(taskId); + Menu_EraseScreen(); + CreateTask(debug_sub_810CE1C, 0); + debug_sub_810D340(); + return; + } + else if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN)) + { + gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 0x19B) % 0x19C; + r2 = TRUE; + } + else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT)) + { + gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 1) % 0x19C; + r2 = TRUE; + } + + if (r2) + { + ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[0], 2, 3); + StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]); + StringExpandPlaceholders(gStringVar4, sp0); + Menu_DrawStdWindowFrame(0, 0, 12, 3); + Menu_PrintText(gStringVar4, 1, 1); + } +} + +void debug_sub_810CCEC(u8 taskId) +{ + u8 string1[] = _("メール{STR_VAR_1}を だれに もたせる?"); + u8 string2[] = _("000 {STR_VAR_1}"); + + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1); + StringExpandPlaceholders(gStringVar4, string1); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + + StringCopy(gStringVar1, gSpeciesNames[0]); + StringExpandPlaceholders(gStringVar4, string2); + Menu_DrawStdWindowFrame(0, 0, 12, 3); + Menu_PrintText(string2, 1, 1); // This probably should have been gStringVar4 + + gTasks[taskId].func = debug_sub_810CB50; +} + +u8 debug_sub_810CD9C(void) +{ + CloseMenu(); + ScriptContext1_Stop(); + ScriptContext2_Enable(); + gUnknown_Debug_0300079C = 0; + gSpecialVar_0x8004 = gSpecialVar_0x8005 = gSpecialVar_0x8006 = 0; + SetMainCallback2(debug_sub_810D388); + return 1; +} + +void debug_sub_810CDE0(void) +{ + UpdatePaletteFade(); + RunTasks(); +} + +void debug_sub_810CDF0(void) +{ + gMain.watchedKeysPressed = 0; + gMain.watchedKeysMask = 0; + gFieldCallback = mapldr_default; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +void debug_sub_810CE1C(u8 taskId) +{ + if (gMenuCallback() == TRUE) + { + CloseMenu(); + DestroyTask(taskId); + } +} + +u8 debug_sub_810CE48(void) +{ + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + gSpecialVar_0x8006 %= 12; + CreateTask(debug_sub_810CA7C, 0); + gMain.watchedKeysPressed = TRUE; // huh? + gMain.watchedKeysMask = 0; + return 1; + } +} + +u8 debug_sub_810CEA4(void) +{ + if (!gPaletteFade.active) + { + gSpecialVar_0x8004 = 4; + sub_80E60D8(); + return 1; + } + return 0; +} + +u8 debug_sub_810CED0(void) +{ + u8 text[] = _("せいきの データが とうろくずみ です\n" + "しんき とうろく できません"); + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + Menu_EraseScreen(); + break; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId)) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text, 4, 15); + } + else + { + gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0xFFFF; + StringCopy(gSaveBlock1.mail[gSpecialVar_0x8005].playerName, gSaveBlock2.playerName); + *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = *(u32 *)gSaveBlock2.playerTrainerId; + gMenuCallback = debug_sub_810CEA4; + return 0; + } + break; + } + debug_sub_810D340(); + return 0; +} + +u8 debug_sub_810CFA4(void) +{ + u8 text[] = _("せいきに とうろくされたメールデータは\n" + "へんこう できません"); + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId)) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text, 4, 15); + debug_sub_810D340(); + return 0; + } + else + { + CreateTask(debug_sub_810CCEC, 0); + return 1; + } + } +} + +u8 debug_sub_810D030(void) +{ + const u8 text1[] = _("メール{STR_VAR_1} とうろく かいじょ"); + const u8 text2[] = _("デバッグメニューから とうろくした\n" + "メール いがいは けせません"); + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + Menu_EraseScreen(); + debug_sub_810D340(); + return 0; + case -2: + return 0; + default: + gSpecialVar_0x8005 = input; + if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0xFFFF + && gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0) + { + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(text2, 4, 15); + debug_sub_810D340(); + return 0; + } + else + { + s8 i; + + gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0; + gSaveBlock1.mail[gSpecialVar_0x8005].species = 0; + gSaveBlock1.mail[gSpecialVar_0x8005].playerName[0] = EOS; + *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = 0; + for (i = 0; i < 9; i++) + gSaveBlock1.mail[gSpecialVar_0x8005].words[i] = 0xFFFF; + ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1); + StringExpandPlaceholders(gStringVar4, text1); + Menu_EraseScreen(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gStringVar4, 4, 15); + debug_sub_810D340(); + return 0; + } + } +} + +void debug_sub_810D174(u8 a) +{ + u8 string[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); + u8 buffer[9][20]; + struct MenuAction menuActions[9]; + u8 i; + + for (i = 0; i < 9; i++) + { + ConvertIntToDecimalStringN(gStringVar1, i, 1, 1); + if (gSaveBlock1.mail[i].itemId == 0xFFFF) + { + ConvertIntToDecimalStringN(gStringVar2, 1, 1, 1); + } + else if (IS_ITEM_MAIL(gSaveBlock1.mail[i].itemId)) + { + ConvertIntToDecimalStringN(gStringVar2, 2, 1, 1); + } + else + { + ConvertIntToDecimalStringN(gStringVar2, 0, 1, 1); + gSaveBlock1.mail[i].itemId = 0; + } + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.mail[i].species]); + StringExpandPlaceholders(buffer[i], string); + menuActions[i].text = buffer[i]; + menuActions[i].func = NULL; + } + Menu_DrawStdWindowFrame(0, 0, 16, 19); + Menu_PrintItems(2, 1, 9, menuActions); + InitMenu(0, 1, 1, 9, 0, 15); + switch (a) + { + case 0: + gMenuCallback = debug_sub_810CE48; + break; + case 1: + gMenuCallback = debug_sub_810CED0; + break; + case 2: + gMenuCallback = debug_sub_810CFA4; + break; + case 3: + gMenuCallback = debug_sub_810D030; + break; + } +} + +u8 debug_sub_810D2F4(void) +{ + s8 input = Menu_ProcessInput(); + + switch (input) + { + case -1: + SetMainCallback2(debug_sub_810CDF0); + return 1; + case -2: + return 0; + } + + switch (input) + { + case 0: + debug_sub_810D174(input); + return 0; + case 1: + debug_sub_810D174(input); + return 0; + case 2: + debug_sub_810D174(input); + return 0; + case 3: + debug_sub_810D174(input); + return 0; + } + + return 1; +} + +const struct MenuAction _84116BC[] = +{ + {Str_84115F4, NULL}, + {Str_84115FB, NULL}, + {Str_8411603, NULL}, + {Str_8411608, NULL}, +}; + +void debug_sub_810D340(void) +{ + Menu_DrawStdWindowFrame(0, 0, 9, 9); + Menu_PrintItems(2, 1, 4, _84116BC); + InitMenu(0, 1, 1, 4, 0, 8); + gMenuCallback = debug_sub_810D2F4; +} + +void debug_sub_810D388(void) +{ + switch (gMain.state) + { + case 0: + if (gUnknown_Debug_0300079C != 0) + { + gMain.state = 2; + gUnknown_Debug_0300079C = 0; + return; + } + else + { + ScanlineEffect_Stop(); + ResetPaletteFade(); + SetVBlankCallback(sub_80F8F18); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + } + break; + case 1: + if (UpdatePaletteFade()) + return; + break; + case 2: + SetVBlankCallback(NULL); + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + break; + case 3: + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + break; + case 4: + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + break; + case 5: + LoadPalette(gMailGraphicsTable[0].palette, 0, 32); + LZ77UnCompVram(gMailGraphicsTable[0].tiles, (void *)VRAM); + DmaFill16(3, 1, (void *)(VRAM + 0x4000), 0x500); + break; + case 6: + REG_BG0CNT = 0x9F08; + REG_BG1CNT = 0x0801; + REG_BLDCNT = 0; + REG_DISPCNT = 0x0340; + debug_sub_810D340(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + SetVBlankCallback(sub_80F8F18); + break; + case 7: + if (!UpdatePaletteFade()) + return; + break; + case 8: + CreateTask(debug_sub_810CE1C, 0); + SetMainCallback2(debug_sub_810CDE0); + break; + default: + return; + } + gMain.state++; +} + +#endif diff --git a/src/mail_data.c b/src/mail_data.c new file mode 100644 index 000000000..4249b9f48 --- /dev/null +++ b/src/mail_data.c @@ -0,0 +1,208 @@ +#include "global.h" +#include "mail_data.h" +#include "constants/items.h" +#include "name_string_util.h" +#include "pokemon.h" +#include "pokemon_icon.h" +#include "constants/species.h" +#include "text.h" + +void ClearMailData(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + ClearMailStruct(&gSaveBlock1.mail[i]); +} + +void ClearMailStruct(struct MailStruct *mail) +{ + int i; + + for (i = 0; i < 9; i++) + mail->words[i] = -1; + + for (i = 0; i < 8; i++) + mail->playerName[i] = -1; + + for (i = 0; i < 4; i++) + mail->trainerId[i] = 0; + + mail->species = 1; + mail->itemId = 0; +} + +bool8 MonHasMail(struct Pokemon *mon) +{ + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) + return TRUE; + else + return FALSE; +} + +u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) +{ + u16 _itemId; + u8 heldItem[2]; + u8 id; + u8 i; + u16 species; + u32 personality; + + _itemId = itemId; + heldItem[0] = _itemId; + heldItem[1] = _itemId >> 8; + id = 0; + + while (id < 6) + { + if (gSaveBlock1.mail[id].itemId == 0) + { + for (i = 0; i < 9; i++) + gSaveBlock1.mail[id].words[i] = -1; + + for (i = 0; i < 7; i++) + gSaveBlock1.mail[id].playerName[i] = gSaveBlock2.playerName[i]; + gSaveBlock1.mail[id].playerName[i] = EOS; + PadNameString(gSaveBlock1.mail[id].playerName, 0); + + for (i = 0; i < 4; i++) + gSaveBlock1.mail[id].trainerId[i] = gSaveBlock2.playerTrainerId[i]; + + species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); + personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); + gSaveBlock1.mail[id].species = SpeciesToMailSpecies(species, personality); + gSaveBlock1.mail[id].itemId = _itemId; + SetMonData(mon, MON_DATA_MAIL, &id); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + return id; + } + id++; + } + + return -1; +} + +u16 SpeciesToMailSpecies(u16 species, u32 personality) +{ + if (species == SPECIES_UNOWN) + { + int mailSpecies = GetUnownLetterByPersonality(personality) + 30000; + return mailSpecies; + } + + return species; +} + +u16 MailSpeciesToSpecies(u16 a1, u16 *a2) +{ + u16 result; + + if (a1 >= 30000 && a1 < (30000 + UNOWN_FORM_COUNT)) + { + result = SPECIES_UNOWN; + *a2 = a1 - 30000; + } + else + { + result = a1; + } + + return result; +} + +u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail) +{ + u8 heldItem[2]; + u16 itemId = mail->itemId; + u8 mailId = GiveMailToMon(mon, itemId); + + if (mailId == 0xFF) + return 0xFF; + + gSaveBlock1.mail[mailId] = *mail; + + SetMonData(mon, MON_DATA_MAIL, &mailId); + + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + + return mailId; +} + +int unref_sub_80A2DF4(void) +{ + return 0; +} + +void TakeMailFromMon(struct Pokemon *mon) +{ + u8 heldItem[2]; + u8 mailId; + + if (MonHasMail(mon)) + { + mailId = GetMonData(mon, MON_DATA_MAIL); + gSaveBlock1.mail[mailId].itemId = 0; + mailId = 0xFF; + heldItem[0] = 0; + heldItem[1] = 0; + SetMonData(mon, MON_DATA_MAIL, &mailId); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + } +} + +void DeleteMail(u8 mailId) +{ + gSaveBlock1.mail[mailId].itemId = 0; +} + +u8 TakeMailFromMon2(struct Pokemon *mon) +{ + u8 i; + u8 newHeldItem[2]; + u8 newMailId; + + newHeldItem[0] = 0; + newHeldItem[1] = 0; + newMailId = 0xFF; + + for (i = 6; i < 16; i++) + { + if (gSaveBlock1.mail[i].itemId == 0) + { + memcpy(&gSaveBlock1.mail[i], &gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct)); + gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)].itemId = 0; + SetMonData(mon, MON_DATA_MAIL, &newMailId); + SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); + return i; + } + } + + return 0xFF; +} + +bool8 ItemIsMail(u16 itemId) +{ + switch (itemId) + { + case ITEM_ORANGE_MAIL: + case ITEM_HARBOR_MAIL: + case ITEM_GLITTER_MAIL: + case ITEM_MECH_MAIL: + case ITEM_WOOD_MAIL: + case ITEM_WAVE_MAIL: + case ITEM_BEAD_MAIL: + case ITEM_SHADOW_MAIL: + case ITEM_TROPIC_MAIL: + case ITEM_DREAM_MAIL: + case ITEM_FAB_MAIL: + case ITEM_RETRO_MAIL: + return TRUE; + default: + return FALSE; + } +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 000000000..54a443e80 --- /dev/null +++ b/src/main.c @@ -0,0 +1,376 @@ +#include "global.h" +#include "gba/flash_internal.h" +#include "gba/m4a_internal.h" +#include "main.h" +#include "intro.h" +#include "link.h" +#include "load_save.h" +#include "m4a.h" +#include "play_time.h" +#include "random.h" +#include "rom3.h" +#include "overworld.h" +#include "rtc.h" +#include "siirtc.h" +#include "sound.h" +#include "scanline_effect.h" + +extern struct SoundInfo gSoundInfo; +extern u32 IntrMain[]; + +static void VBlankIntr(void); +static void HBlankIntr(void); +static void VCountIntr(void); +static void SerialIntr(void); +static void IntrDummy(void); + +#ifdef SAPPHIRE +#define GAME_VERSION VERSION_SAPPHIRE +#else +#define GAME_VERSION VERSION_RUBY +#endif + +const u8 gGameVersion = GAME_VERSION; + +const u8 gGameLanguage = GAME_LANGUAGE; + +#if defined(ENGLISH) +const char BuildDateTime[] = "2002 10 15 20:34"; +#elif defined(GERMAN) +const char BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $"; +#endif + +const IntrFunc gIntrTableTemplate[] = +{ + SerialIntr, // Serial interrupt + Timer3Intr, // Timer 3 interrupt + HBlankIntr, // H-blank interrupt + VBlankIntr, // V-blank interrupt + VCountIntr, // V-count interrupt + IntrDummy, // Timer 0 interrupt + IntrDummy, // Timer 1 interrupt + IntrDummy, // Timer 2 interrupt + IntrDummy, // DMA 0 interrupt + IntrDummy, // DMA 1 interrupt + IntrDummy, // DMA 2 interrupt + IntrDummy, // DMA 3 interrupt + IntrDummy, // Key interrupt + IntrDummy, // Game Pak interrupt +}; + +#define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc))) + +u16 gKeyRepeatStartDelay; +bool8 gLinkTransferringData; +struct Main gMain; +u16 gKeyRepeatContinueDelay; +u8 gSoftResetDisabled; +IntrFunc gIntrTable[INTR_COUNT]; +bool8 gLinkVSyncDisabled; +u32 IntrMain_Buffer[0x200]; +u8 gPcmDmaCounter; + +EWRAM_DATA u8 gSharedMem[0x20000] = {0}; +EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL; + +static void UpdateLinkAndCallCallbacks(void); +static void InitMainCallbacks(void); +static void CallCallbacks(void); +static void SeedRngWithRtc(void); +static void ReadKeys(void); +static void InitIntrHandlers(void); +static void WaitForVBlank(void); + +#define B_START_SELECT (B_BUTTON | START_BUTTON | SELECT_BUTTON) + +#ifndef NDEBUG + #include // don't include if not needed. +#endif + +void AgbMain() +{ + RegisterRamReset(RESET_ALL); + REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; + InitKeys(); + InitIntrHandlers(); + m4aSoundInit(); + RtcInit(); + CheckForFlashMemory(); + InitMainCallbacks(); + InitMapMusic(); + SeedRngWithRtc(); + + gSoftResetDisabled = FALSE; + +// In Fire Red, AGBPrintInit is called at this spot. For user convenience, I +// opt to initialize the print area here. It is up to the user where they choose +// to print stuff from, as anything else declared is NOT authoritative. +#ifndef NDEBUG + AGBPrintInit(); + __mb_cur_max = 1; // fix for AGBPrintf +#endif + + if (gFlashMemoryPresent != TRUE) + SetMainCallback2(NULL); + + gLinkTransferringData = FALSE; + + for (;;) + { + ReadKeys(); + + if (gSoftResetDisabled == FALSE + && (gMain.heldKeysRaw & A_BUTTON) + && (gMain.heldKeysRaw & B_START_SELECT) == B_START_SELECT) + DoSoftReset(); + + if (gLink.sendQueue.count > 1 && sub_8055910() == 1) + { + gLinkTransferringData = TRUE; + UpdateLinkAndCallCallbacks(); + gLinkTransferringData = FALSE; + } + else + { + gLinkTransferringData = FALSE; + UpdateLinkAndCallCallbacks(); + + if (gLink.recvQueue.count > 1) + { + if (sub_80558AC() == 1) + { + gMain.newKeys = 0; + gLinkTransferringData = TRUE; + UpdateLinkAndCallCallbacks(); + gLinkTransferringData = FALSE; + } + } + } + + PlayTimeCounter_Update(); + MapMusicMain(); + WaitForVBlank(); + } +} + +static void UpdateLinkAndCallCallbacks(void) +{ + gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); + LinkMain2(&gMain.heldKeys); + if (!(gLinkStatus & LINK_STAT_RECEIVED_NOTHING) || sub_8055940() != 1) + CallCallbacks(); +} + +static void InitMainCallbacks(void) +{ + gMain.vblankCounter1 = 0; + gMain.vblankCounter2 = 0; + gMain.callback1 = NULL; + SetMainCallback2(CB2_InitCopyrightScreenAfterBootup); +} + +static void CallCallbacks(void) +{ + if (gMain.callback1) + gMain.callback1(); + + if (gMain.callback2) + gMain.callback2(); +} + +void SetMainCallback2(MainCallback callback) +{ + gMain.callback2 = callback; + gMain.state = 0; +} + +static void SeedRngWithRtc(void) +{ + u32 seed = RtcGetMinuteCount(); + seed = (seed >> 16) ^ (seed & 0xFFFF); + SeedRng(seed); +} + +void InitKeys(void) +{ + gKeyRepeatContinueDelay = 5; + gKeyRepeatStartDelay = 40; + + gMain.heldKeys = 0; + gMain.newKeys = 0; + gMain.newAndRepeatedKeys = 0; + gMain.heldKeysRaw = 0; + gMain.newKeysRaw = 0; +} + +static void ReadKeys(void) +{ + u16 keyInput = REG_KEYINPUT ^ KEYS_MASK; + gMain.newKeysRaw = keyInput & ~gMain.heldKeysRaw; + gMain.newKeys = gMain.newKeysRaw; + gMain.newAndRepeatedKeys = gMain.newKeysRaw; + + // BUG: Key repeat won't work when pressing L using L=A button mode + // because it compares the raw key input with the remapped held keys. + // Note that newAndRepeatedKeys is never remapped either. + + if (keyInput != 0 && gMain.heldKeys == keyInput) + { + gMain.keyRepeatCounter--; + + if (gMain.keyRepeatCounter == 0) + { + gMain.newAndRepeatedKeys = keyInput; + gMain.keyRepeatCounter = gKeyRepeatContinueDelay; + } + } + else + { + // If there is no input or the input has changed, reset the counter. + gMain.keyRepeatCounter = gKeyRepeatStartDelay; + } + + gMain.heldKeysRaw = keyInput; + gMain.heldKeys = gMain.heldKeysRaw; + + // Remap L to A if the L=A option is enabled. + if (gSaveBlock2.optionsButtonMode == 2) + { + if (gMain.newKeys & L_BUTTON) + gMain.newKeys |= A_BUTTON; + + if (gMain.heldKeys & L_BUTTON) + gMain.heldKeys |= A_BUTTON; + } + + if (gMain.newKeys & gMain.watchedKeysMask) + gMain.watchedKeysPressed = TRUE; +} + +static void InitIntrHandlers(void) +{ + int i; + + for (i = 0; i < INTR_COUNT; i++) + gIntrTable[i] = gIntrTableTemplate[i]; + + DmaCopy32(3, IntrMain, IntrMain_Buffer, sizeof(IntrMain_Buffer)); + + INTR_VECTOR = IntrMain_Buffer; + + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + SetSerialCallback(NULL); + + REG_IME = 1; + REG_IE = INTR_FLAG_VBLANK; + REG_DISPSTAT = DISPSTAT_VBLANK_INTR; + REG_IE |= INTR_FLAG_VBLANK; +} + +void SetVBlankCallback(IntrCallback callback) +{ + gMain.vblankCallback = callback; +} + +void SetHBlankCallback(IntrCallback callback) +{ + gMain.hblankCallback = callback; +} + +void SetVCountCallback(IntrCallback callback) +{ + gMain.vcountCallback = callback; +} + +void SetSerialCallback(IntrCallback callback) +{ + gMain.serialCallback = callback; +} + +static void VBlankIntr(void) +{ + u16 savedIme; + + if (!gLinkVSyncDisabled) + LinkVSync(); + + savedIme = REG_IME; + REG_IME = 0; + m4aSoundVSync(); + REG_IME = savedIme; + + gMain.vblankCounter1++; + + if (gMain.vblankCallback) + gMain.vblankCallback(); + + gMain.vblankCounter2++; + + gPcmDmaCounter = gSoundInfo.pcmDmaCounter; + + m4aSoundMain(); + sub_800C35C(); + Random(); + + INTR_CHECK |= INTR_FLAG_VBLANK; + gMain.intrCheck |= INTR_FLAG_VBLANK; +} + +void InitFlashTimer(void) +{ + SetFlashTimerIntr(2, gFlashTimerIntrFunc); +} + +static void HBlankIntr(void) +{ + if (gMain.hblankCallback) + gMain.hblankCallback(); + + INTR_CHECK |= INTR_FLAG_HBLANK; + gMain.intrCheck |= INTR_FLAG_HBLANK; +} + +static void VCountIntr(void) +{ + if (gMain.vcountCallback) + gMain.vcountCallback(); + + INTR_CHECK |= INTR_FLAG_VCOUNT; + gMain.intrCheck |= INTR_FLAG_VCOUNT; +} + +static void SerialIntr(void) +{ + if (gMain.serialCallback) + gMain.serialCallback(); + + INTR_CHECK |= INTR_FLAG_SERIAL; + gMain.intrCheck |= INTR_FLAG_SERIAL; +} + +static void IntrDummy(void) +{} + +static void WaitForVBlank(void) +{ + gMain.intrCheck &= ~INTR_FLAG_VBLANK; + VBlankIntrWait(); +} + +void DoSoftReset(void) +{ + REG_IME = 0; + m4aSoundVSyncOff(); + ScanlineEffect_Stop(); + DmaStop(1); + DmaStop(2); + DmaStop(3); + SiiRtcProtect(); + SoftReset(RESET_ALL); +} + +void ClearPokemonCrySongs(void) +{ + CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong)); +} diff --git a/src/main_menu.c b/src/main_menu.c new file mode 100644 index 000000000..5a3f55b29 --- /dev/null +++ b/src/main_menu.c @@ -0,0 +1,1705 @@ +#include "global.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "main_menu.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "field_effect.h" +#include "menu.h" +#include "mystery_event_menu.h" +#include "naming_screen.h" +#include "option_menu.h" +#include "palette.h" +#include "pokeball.h" +#include "overworld.h" +#include "rtc.h" +#include "save_menu_util.h" +#include "save.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "title_screen.h" +#include "scanline_effect.h" +#include "ewram.h" + +#define BirchSpeechUpdateWindowText() ((u8)Menu_UpdateWindowTextOverrideLineLength(24)) + +extern struct PaletteFadeControl gPaletteFade; + +extern const u8 gBirchSpeech_Welcome[]; +extern const u8 gBirchSpeech_ThisIsPokemon[]; +extern const u8 gBirchSpeech_WorldInhabitedByPokemon[]; +extern const u8 gBirchSpeech_AndYouAre[]; +extern const u8 gBirchSpeech_AreYouBoyOrGirl[]; +extern const u8 gBirchSpeech_WhatsYourName[]; +extern u8 gBirchSpeech_SoItsPlayer[]; +extern u8 gBirchSpeech_AhOkayYouArePlayer[]; +extern u8 gBirchSpeech_AreYouReady[]; + +extern struct SpriteTemplate gUnknown_02024E8C; +extern const struct MenuAction gUnknown_081E79B0[]; +extern const struct MenuAction gMalePresetNames[]; +extern const struct MenuAction gFemalePresetNames[]; + +extern const u8 gUnknown_081E7834[]; + +extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[]; + +//Menu layouts +enum +{ + HAS_NO_SAVED_GAME, //NEW GAME, OPTION + HAS_SAVED_GAME, //CONTINUE, NEW GAME, OPTION + HAS_MYSTERY_GIFT, //CONTINUE, NEW GAME, MYSTERY EVENTS, OPTION +}; + +static void CB2_MainMenu(void); +static void VBlankCB_MainMenu(void); +static void CB2_InitMainMenuFromOptions(void); +static u32 InitMainMenu(bool8 a1); +static void Task_MainMenuCheckSave(u8 taskId); +static void Task_MainMenuWaitForSaveErrorAck(u8 taskId); +static void Task_MainMenuCheckRtc(u8 taskId); +static void Task_MainMenuWaitForRtcErrorAck(u8 taskId); +static void Task_MainMenuDraw(u8 taskId); +static void Task_MainMenuHighlight(u8 taskId); +static bool8 MainMenuProcessKeyInput(u8 taskId); +static void Task_MainMenuProcessKeyInput(u8 taskId); +static void Task_MainMenuPressedA(u8 taskId); +static void Task_MainMenuPressedB(u8 taskId); +static void HighlightCurrentMenuItem(u8 layout, u8 menuItem); +static void PrintMainMenuItem(const u8 *text, u8 left, u8 top); +static void PrintSaveFileInfo(void); +static void PrintPlayerName(void); +static void PrintPlayTime(void); +static void PrintPokedexCount(void); +static void PrintBadgeCount(void); +static void Task_NewGameSpeech1(u8 taskId); +static void Task_NewGameSpeech2(u8 taskId); +static void Task_NewGameSpeech3(u8 taskId); +static void Task_NewGameSpeech4(u8 taskId); +static void Task_NewGameSpeech5(u8 taskId); +static void Task_NewGameSpeech6(u8 taskId); +static void Task_NewGameSpeech7(u8 taskId); +static void Task_NewGameSpeech8(u8 taskId); +static void Task_NewGameSpeech9(u8 taskId); +static void Task_NewGameSpeech10(u8 taskId); +static void Task_NewGameSpeech11(u8 taskId); +static void Task_NewGameSpeech12(u8 taskId); +static void Task_NewGameSpeech13(u8 taskId); +static void Task_NewGameSpeech14(u8 taskId); +static void Task_NewGameSpeech15(u8 taskId); +static void Task_NewGameSpeech16(u8 taskId); +static void Task_NewGameSpeech17(u8 taskId); +static void Task_NewGameSpeech18(u8 taskId); +static void Task_NewGameSpeech19(u8 taskId); +static void Task_NewGameSpeech20(u8 taskId); +static void Task_NewGameSpeech21(u8 taskId); +static void Task_NewGameSpeech22(u8 taskId); +static void Task_NewGameSpeech23(u8 taskId); +static void Task_NewGameSpeech24(u8 taskId); +static void Task_NewGameSpeech25(u8 taskId); +static void Task_NewGameSpeech26(u8 taskId); +static void Task_NewGameSpeech27(u8 taskId); +static void Task_NewGameSpeech28(u8 taskId); +static void Task_NewGameSpeech29(u8 taskId); +static void Task_NewGameSpeech30(u8 taskId); +static void Task_NewGameSpeech31(u8 taskId); +static void Task_NewGameSpeech32(u8 taskId); +static void Task_NewGameSpeech33(u8 taskId); +static void CB_ContinueNewGameSpeechPart2(); +static void nullsub_34(struct Sprite *sprite); +static void ShrinkPlayerSprite(struct Sprite *sprite); +static u8 CreateAzurillSprite(u8 x, u8 y); +static void AddBirchSpeechObjects(u8 taskId); +static void Task_SpriteFadeOut(u8 taskId); +static void StartSpriteFadeOut(u8 taskId, u8 interval); +static void Task_SpriteFadeIn(u8 taskId); +static void StartSpriteFadeIn(u8 taskId, u8 interval); +static void HandleFloorShadowFadeOut(u8 taskId); +static void StartBackgroundFadeOut(u8 taskId, u8 interval); +static void HandleFloorShadowFadeIn(u8 taskId); +static void StartBackgroundFadeIn(u8 taskId, u8 interval); +static void CreateGenderMenu(u8 left, u8 top); +static s8 GenderMenuProcessInput(void); +static void CreateNameMenu(u8 left, u8 top); +static s8 NameMenuProcessInput(void); +static void SetPresetPlayerName(u8 index); + +static const u16 gUnknown_081E764C[][16] = +{ + INCBIN_U16("graphics/birch_speech/bg0.gbapal"), + INCBIN_U16("graphics/birch_speech/bg1.gbapal"), +}; + +static const u8 gBirchIntroShadowGfx[] = INCBIN_U8("graphics/birch_speech/shadow.4bpp.lz"); +static const u8 gUnknown_081E7834[] = INCBIN_U8("graphics/birch_speech/map.bin.lz"); +static const u16 gUnknown_081E795C[] = INCBIN_U16("graphics/birch_speech/bg2.gbapal"); +static const u16 gUnknown_081E796C[] = INCBIN_U16("graphics/birch_speech/blank_pal.gbapal"); +static const u16 gMainMenuPalette[] = INCBIN_U16("graphics/misc/main_menu.gbapal"); + +static const union AffineAnimCmd gSpriteAffineAnim_81E799C[] = +{ + AFFINEANIMCMD_FRAME(0xFFFE, 0xFFFE, 0, 48), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[] = +{ + gSpriteAffineAnim_81E799C, +}; + +static const struct MenuAction gUnknown_081E79B0[] = +{ + {gBirchText_Boy, NULL}, + {gBirchText_Girl, NULL}, +}; + +static const struct MenuAction gMalePresetNames[] = +{ + {gBirchText_NewName, NULL}, + {gDefaultBoyName1, NULL}, + {gDefaultBoyName2, NULL}, + {gDefaultBoyName3, NULL}, + {gDefaultBoyName4, NULL}, +}; + +static const struct MenuAction gFemalePresetNames[] = +{ + {gBirchText_NewName, NULL}, + {gDefaultGirlName1, NULL}, + {gDefaultGirlName2, NULL}, + {gDefaultGirlName3, NULL}, + {gDefaultGirlName4, NULL}, +}; + +static void CB2_MainMenu(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void VBlankCB_MainMenu(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_InitMainMenu(void) +{ + InitMainMenu(FALSE); +} + +static void CB2_InitMainMenuFromOptions(void) +{ + InitMainMenu(TRUE); +} + +#define tMenuLayout data[0] +#define tMenuSelection data[1] + +u32 InitMainMenu(u8 a1) +{ + u16 savedIme; + u8 taskId; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + + ResetPaletteFade(); + LoadPalette(gMainMenuPalette, 0, 32); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); + + if (a1) + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0x0000); // fade to black + else + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xFFFF); // fade to white + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + + SetVBlankCallback(VBlankCB_MainMenu); + SetMainCallback2(CB2_MainMenu); + + REG_DISPCNT = DISPCNT_MODE_0 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON; + + taskId = CreateTask(Task_MainMenuCheckSave, 0); + gTasks[taskId].tMenuSelection = 0; + + return 0; +} + +void Task_MainMenuCheckSave(u8 taskId) +{ + if (gPaletteFade.active) + return; + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + switch (gSaveFileStatus) + { + case SAVE_STATUS_OK: + if (IsMysteryGiftEnabled() == TRUE) + gTasks[taskId].tMenuLayout = HAS_MYSTERY_GIFT; + else + gTasks[taskId].tMenuLayout = HAS_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuCheckRtc; + break; + case 2: + Menu_DrawStdWindowFrame(2, 14, 27, 19); + MenuPrintMessage(gSaveFileDeletedMessage, 3, 15); + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(113, 159); + gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; + break; + case SAVE_STATUS_ERROR: + Menu_DrawStdWindowFrame(2, 14, 27, 19); + MenuPrintMessage(gSaveFileCorruptMessage, 3, 15); + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(113, 159); + gTasks[taskId].tMenuLayout = HAS_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; + + if (IsMysteryGiftEnabled() == TRUE) + gTasks[taskId].tMenuLayout = HAS_MYSTERY_GIFT; + else + gTasks[taskId].tMenuLayout = HAS_SAVED_GAME; + break; + case SAVE_STATUS_EMPTY: + default: + gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuCheckRtc; + break; + case SAVE_STATUS_NO_FLASH: + Menu_DrawStdWindowFrame(2, 14, 27, 19); + MenuPrintMessage(gBoardNotInstalledMessage, 3, 15); + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(113, 159); + gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME; + gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck; + return; + } +} + +void Task_MainMenuWaitForSaveErrorAck(u8 taskId) +{ + if (Menu_UpdateWindowText()) + { + if (gMain.newKeys & A_BUTTON) + { + Menu_EraseWindowRect(2, 14, 27, 19); + gTasks[taskId].func = Task_MainMenuCheckRtc; + } + } +} + +void Task_MainMenuCheckRtc(u8 taskId) +{ + if (!gPaletteFade.active) + { + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK)) + { + gTasks[taskId].func = Task_MainMenuDraw; + } + else + { + Menu_DrawStdWindowFrame(2, 14, 27, 19); + MenuPrintMessage(gBatteryDryMessage, 3, 15); + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(113, 159); + gTasks[taskId].func = Task_MainMenuWaitForRtcErrorAck; + } + } +} + +void Task_MainMenuWaitForRtcErrorAck(u8 taskId) +{ + if (Menu_UpdateWindowText()) + { + if ( gMain.newKeys & 1 ) + { + Menu_EraseWindowRect(2, 14, 27, 19); + gTasks[taskId].func = Task_MainMenuDraw; + } + } +} + +void Task_MainMenuDraw(u8 taskId) +{ + u16 palette; + + if (!gPaletteFade.active) + { + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + palette = RGB(0, 0, 0); + LoadPalette(&palette, 254, 2); + + if (gSaveBlock2.playerGender == MALE) + { + palette = RGB(4, 16, 31); + LoadPalette(&palette, 241, 2); + } + else + { + palette = RGB(31, 3, 21); + LoadPalette(&palette, 241, 2); + } + + switch (gTasks[taskId].tMenuLayout) + { + case HAS_NO_SAVED_GAME: + default: + Menu_DrawStdWindowFrame(1, 0, 28, 3); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 1); + Menu_DrawStdWindowFrame(1, 4, 28, 7); + PrintMainMenuItem(gMainMenuString_Option, 2, 5); + break; + case HAS_SAVED_GAME: + Menu_DrawStdWindowFrame(1, 0, 28, 7); + PrintMainMenuItem(gMainMenuString_Continue, 2, 1); + Menu_DrawStdWindowFrame(1, 8, 28, 11); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); + Menu_DrawStdWindowFrame(1, 12, 28, 15); + PrintMainMenuItem(gMainMenuString_Option, 2, 13); + PrintSaveFileInfo(); + break; + case HAS_MYSTERY_GIFT: + Menu_DrawStdWindowFrame(1, 0, 28, 7); + PrintMainMenuItem(gMainMenuString_Continue, 2, 1); + Menu_DrawStdWindowFrame(1, 8, 28, 11); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); + Menu_DrawStdWindowFrame(1, 12, 28, 15); + PrintMainMenuItem(gMainMenuString_MysteryEvents, 2, 13); + Menu_DrawStdWindowFrame(1, 16, 28, 19); + PrintMainMenuItem(gMainMenuString_Option, 2, 0x11); + PrintSaveFileInfo(); + break; + } + + gTasks[taskId].func = Task_MainMenuHighlight; + } +} + +void Task_MainMenuHighlight(u8 taskId) +{ + HighlightCurrentMenuItem(gTasks[taskId].tMenuLayout, gTasks[taskId].tMenuSelection); + gTasks[taskId].func = Task_MainMenuProcessKeyInput; +} + +bool8 MainMenuProcessKeyInput(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0x0000); + gTasks[taskId].func = Task_MainMenuPressedA; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); + REG_WIN0H = WIN_RANGE(0, 240); + REG_WIN0V = WIN_RANGE(0, 160); + gTasks[taskId].func = Task_MainMenuPressedB; + } + else + { + s32 menuItemCount; + + switch (gTasks[taskId].tMenuLayout) + { + case HAS_NO_SAVED_GAME: + default: + menuItemCount = 2; + break; + case HAS_SAVED_GAME: + menuItemCount = 3; + break; + case HAS_MYSTERY_GIFT: + menuItemCount = 4; + break; + } + + if (gMain.newKeys & DPAD_UP) + { + if (gTasks[taskId].tMenuSelection > 0) + { + gTasks[taskId].tMenuSelection--; + return TRUE; + } + } + if (gMain.newKeys & DPAD_DOWN) + { + if (gTasks[taskId].tMenuSelection < menuItemCount - 1) + { + gTasks[taskId].tMenuSelection++; + return TRUE; + } + } + } + + return FALSE; +} + +void Task_MainMenuProcessKeyInput(u8 taskId) +{ + bool8 currentMenuItemChanged = MainMenuProcessKeyInput(taskId); + if (currentMenuItemChanged) + gTasks[taskId].func = Task_MainMenuHighlight; +} + +void Task_MainMenuPressedA(u8 taskId) +{ + enum + { + NEW_GAME, + CONTINUE, + OPTION, + MYSTERY_EVENTS, + } action; + + if (gPaletteFade.active) + return; + + switch (gTasks[taskId].tMenuLayout) + { + case HAS_NO_SAVED_GAME: + default: + switch (gTasks[taskId].tMenuSelection) + { + case 0: + default: + action = NEW_GAME; + break; + case 1: + action = OPTION; + break; + } + break; + case HAS_SAVED_GAME: + switch (gTasks[taskId].tMenuSelection) + { + case 0: + default: + action = CONTINUE; + break; + case 1: + action = NEW_GAME; + break; + case 2: + action = OPTION; + break; + } + break; + case HAS_MYSTERY_GIFT: + switch (gTasks[taskId].tMenuSelection) + { + case 0: + default: + action = CONTINUE; + break; + case 1: + action = NEW_GAME; + break; + case 2: + action = MYSTERY_EVENTS; + break; + case 3: + action = OPTION; + break; + } + break; + } + + switch ((int)action) + { + case NEW_GAME: + default: + gPlttBufferUnfaded[0] = 0; + gPlttBufferFaded[0] = 0; + gTasks[taskId].func = Task_NewGameSpeech1; + break; + case CONTINUE: + gPlttBufferUnfaded[0] = 0; + gPlttBufferFaded[0] = 0; + SetMainCallback2(CB2_ContinueSavedGame); + DestroyTask(taskId); + break; + case OPTION: + gMain.savedCallback = CB2_InitMainMenuFromOptions; + SetMainCallback2(CB2_InitOptionMenu); + DestroyTask(taskId); + break; + case MYSTERY_EVENTS: + SetMainCallback2(CB2_InitMysteryEventMenu); + DestroyTask(taskId); + break; + } +} + +void Task_MainMenuPressedB(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CB2_InitTitleScreen); + DestroyTask(taskId); + } +} + +#undef tMenuLayout +#undef tMenuSelection + +void HighlightCurrentMenuItem(u8 layout, u8 menuItem) +{ + REG_WIN0H = WIN_RANGE(9, 231); + + switch (layout) + { + case HAS_NO_SAVED_GAME: + default: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = WIN_RANGE(1, 31); + break; + case 1: + REG_WIN0V = WIN_RANGE(33, 63); + break; + } + break; + case HAS_SAVED_GAME: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = WIN_RANGE(1, 63); + break; + case 1: + REG_WIN0V = WIN_RANGE(65, 95); + break; + case 2: + REG_WIN0V = WIN_RANGE(97, 127); + break; + } + break; + case HAS_MYSTERY_GIFT: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = WIN_RANGE(1, 63); + break; + case 1: + REG_WIN0V = WIN_RANGE(65, 95); + break; + case 2: + REG_WIN0V = WIN_RANGE(97, 127); + break; + case 3: + REG_WIN0V = WIN_RANGE(129, 159); + break; + } + break; + } +} + +void PrintMainMenuItem(const u8 *text, u8 left, u8 top) +{ + u8 i; + u8 buffer[32]; + + buffer[0] = 0xFC; + buffer[1] = 1; + buffer[2] = 14; + + for (i = 0; i < 26; i++) + buffer[3 + i] = text[i]; + + buffer[29] = EOS; + + Menu_PrintText(buffer, left, top); +} + +void PrintSaveFileInfo(void) +{ + PrintPlayerName(); + PrintPokedexCount(); + PrintPlayTime(); + PrintBadgeCount(); +} + +void PrintPlayerName(void) +{ + Menu_PrintText(gMainMenuString_Player, 2, 3); + Menu_PrintText(gSaveBlock2.playerName, 9, 3); +} + +void PrintPlayTime(void) +{ + u8 playTime[16]; + u8 alignedPlayTime[32]; + +#if defined(ENGLISH) + Menu_PrintText(gMainMenuString_Time, 16, 3); + FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); + sub_8072C74(alignedPlayTime, playTime, 48, 1); + Menu_PrintText(alignedPlayTime, 22, 3); +#elif defined(GERMAN) + Menu_PrintTextPixelCoords(gMainMenuString_Time, 124, 24, TRUE); + FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); + sub_8072C74(alignedPlayTime, playTime, 40, 1); + Menu_PrintText(alignedPlayTime, 23, 3); +#endif +} + +void PrintPokedexCount(void) +{ + u8 buffer[16]; + + Menu_PrintText(gMainMenuString_Pokedex, 2, 5); + sub_8072C14(buffer, GetPokedexSeenCount(), 18, 0); + Menu_PrintText(buffer, 9, 5); +} + +void PrintBadgeCount(void) +{ + u8 buffer[16]; + +#if defined(ENGLISH) + Menu_PrintText(gMainMenuString_Badges, 16, 5); +#elif defined(GERMAN) + Menu_PrintTextPixelCoords(gMainMenuString_Badges, 124, 40, TRUE); +#endif + ConvertIntToDecimalString(buffer, GetBadgeCount()); + Menu_PrintTextPixelCoords(buffer, 205, 40, 1); +} + +#define tTrainerSpriteId data[2] +#define tBGhofs data[4] +#define tSubtaskIsDone data[5] +#define tGenderSelection data[6] +#define tFrameCounter data[7] +#define tBirchSpriteId data[8] +#define tAzurillSpriteId data[9] +#define tBrendanSpriteId data[10] +#define tMaySpriteId data[11] + +static void Task_NewGameSpeech1(u8 taskId) +{ + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + LZ77UnCompVram(gBirchIntroShadowGfx, (void *)BG_VRAM); + LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); + LoadPalette(gUnknown_081E764C, 0, 0x40); + LoadPalette(gUnknown_081E796C, 1, 0x10); + ScanlineEffect_Stop(); + ResetSpriteData(); + FreeAllSpritePalettes(); + AddBirchSpeechObjects(taskId); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP; + gTasks[taskId].tBGhofs = 0; + gTasks[taskId].func = Task_NewGameSpeech2; + gTasks[taskId].tTrainerSpriteId = 0xFF; + gTasks[taskId].data[3] = 0xFF; + gTasks[taskId].tFrameCounter = 216; //Wait 3.6 seconds (216 frames) before starting speech + + PlayBGM(BGM_DOORO_X4); +} + +static void Task_NewGameSpeech2(u8 taskId) +{ + if (gTasks[taskId].tFrameCounter != 0) + { + gTasks[taskId].tFrameCounter--; + } + else + { + //Initialize Birch sprite + u8 spriteId = gTasks[taskId].tBirchSpriteId; + + gSprites[spriteId].pos1.x = 136; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = 0; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeIn(taskId, 10); + StartBackgroundFadeIn(taskId, 20); + gTasks[taskId].tFrameCounter = 80; + gTasks[taskId].func = Task_NewGameSpeech3; + } +} + +static void Task_NewGameSpeech3(u8 taskId) +{ + if (gTasks[taskId].tSubtaskIsDone) + { + gSprites[gTasks[taskId].tBirchSpriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + if (gTasks[taskId].tFrameCounter) + { + gTasks[taskId].tFrameCounter--; + } + else + { + Menu_DrawStdWindowFrame(2, 13, 27, 18); + //"Hi! Sorry to keep you waiting... + //...But everyone calls me the POKEMON PROFESSOR." + MenuPrintMessage(gBirchSpeech_Welcome, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech4; + } + } +} + +static void Task_NewGameSpeech4(u8 taskId) +{ + if (!gPaletteFade.active && BirchSpeechUpdateWindowText()) + { + gTasks[taskId].func = Task_NewGameSpeech5; + //"This is what we call a POKEMON." + MenuPrintMessage(gBirchSpeech_ThisIsPokemon, 3, 14); + } +} + +static void Task_NewGameSpeech5(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + gTasks[taskId].func = Task_NewGameSpeech6; +} + +static void Task_NewGameSpeech6(u8 taskId) +{ + u8 spriteId = gTasks[taskId].tAzurillSpriteId; + + gSprites[spriteId].pos1.x = 104; + gSprites[spriteId].pos1.y = 72; + gSprites[spriteId].invisible = 0; + gSprites[spriteId].data[0] = 0; + CreatePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 0x70, 0x3A, 0, 0, 0x20, 0x0000FFFF); + gTasks[taskId].func = Task_NewGameSpeech7; + gTasks[taskId].tFrameCounter = 0; +} + +static void Task_NewGameSpeech7(u8 taskId) +{ + if (IsCryFinished()) + { + //Go on to next sentence after frame 95 + if (gTasks[taskId].tFrameCounter > 95) + { + Menu_SetText(gSystemText_NewPara); + gTasks[taskId].func = Task_NewGameSpeech8; + } + } + + if (gTasks[taskId].tFrameCounter < 16384) + { + gTasks[taskId].tFrameCounter++; + //Play Azurill cry at frame 32 + if (gTasks[taskId].tFrameCounter == 32) + PlayCry1(SPECIES_AZURILL, 0); + } +} + +static void Task_NewGameSpeech8(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + //"This world is widely inhabited by POKEMON... + //...That's what I do." + MenuPrintMessage(gBirchSpeech_WorldInhabitedByPokemon, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech9; + } +} + +static void Task_NewGameSpeech9(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + Menu_DrawStdWindowFrame(2, 13, 27, 18); + //"And you are?" + MenuPrintMessage(gBirchSpeech_AndYouAre, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech10; + } +} + +static void Task_NewGameSpeech10(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + gSprites[gTasks[taskId].tBirchSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; + gSprites[gTasks[taskId].tAzurillSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeOut(taskId, 2); + StartBackgroundFadeOut(taskId, 1); + gTasks[taskId].tFrameCounter = 64; + gTasks[taskId].func = Task_NewGameSpeech11; + } +} + +//Slide platform away to the right +static void Task_NewGameSpeech11(u8 taskId) +{ + if (gTasks[taskId].tBGhofs != -60) + { + gTasks[taskId].tBGhofs -= 2; + REG_BG1HOFS = gTasks[taskId].tBGhofs; + } + else + { + gTasks[taskId].tBGhofs = -60; + gTasks[taskId].func = Task_NewGameSpeech12; + } +} + +static void Task_NewGameSpeech12(u8 taskId) +{ + if (gTasks[taskId].tSubtaskIsDone) + { + //Hide Birch and Azurill + gSprites[gTasks[taskId].tBirchSpriteId].invisible = TRUE; + gSprites[gTasks[taskId].tAzurillSpriteId].invisible = TRUE; + + if (gTasks[taskId].tFrameCounter) + { + gTasks[taskId].tFrameCounter--; + } + else + { + //Initialize Brendan sprite + u8 spriteId = gTasks[taskId].tBrendanSpriteId; + + gSprites[spriteId].pos1.x = 180; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + gTasks[taskId].tTrainerSpriteId = spriteId; + gTasks[taskId].tGenderSelection = 0; + StartSpriteFadeIn(taskId, 2); + StartBackgroundFadeIn(taskId, 1); + gTasks[taskId].func = Task_NewGameSpeech13; + } + } +} + +static void Task_NewGameSpeech13(u8 taskId) +{ + if (gTasks[taskId].tSubtaskIsDone) + { + gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + gTasks[taskId].func = Task_NewGameSpeech14; + } +} + +static void Task_NewGameSpeech14(u8 taskId) +{ + Menu_DrawStdWindowFrame(2, 13, 27, 18); + //"Are you a boy? Or are you a girl?" + MenuPrintMessage(gBirchSpeech_AreYouBoyOrGirl, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech15; +} + +static void Task_NewGameSpeech15(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + CreateGenderMenu(2, 4); + gTasks[taskId].func = Task_NewGameSpeech16; + } +} + +//Process gender menu +static void Task_NewGameSpeech16(u8 taskId) +{ + u8 cursorPos; + + switch (GenderMenuProcessInput()) + { + case MALE: + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + gSaveBlock2.playerGender = MALE; + Menu_EraseWindowRect(2, 4, 8, 9); + gTasks[taskId].func = Task_NewGameSpeech19; + break; + case FEMALE: + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + gSaveBlock2.playerGender = FEMALE; + Menu_EraseWindowRect(2, 4, 8, 9); + gTasks[taskId].func = Task_NewGameSpeech19; + break; + } + + cursorPos = Menu_GetCursorPos(); + + if (cursorPos != gTasks[taskId].tGenderSelection) + { + //Menu selection changed. Slide Brendan or May out and slide the other in + gTasks[taskId].tGenderSelection = cursorPos; + gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeOut(taskId, 0); + gTasks[taskId].func = Task_NewGameSpeech17; + } +} + +//Slide old trainer sprite off right of screen +static void Task_NewGameSpeech17(u8 taskId) +{ + u8 spriteId = gTasks[taskId].tTrainerSpriteId; + + if (gTasks[taskId].tSubtaskIsDone == FALSE) + { + gSprites[spriteId].pos1.x += 4; //Move sprite right + } + else + { + gSprites[spriteId].invisible = TRUE; + + //Set up new trainer sprite + if (gTasks[taskId].tGenderSelection) + spriteId = gTasks[taskId].tMaySpriteId; + else + spriteId = gTasks[taskId].tBrendanSpriteId; + gSprites[spriteId].pos1.x = 240; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = FALSE; + gTasks[taskId].tTrainerSpriteId = spriteId; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeIn(taskId, 0); + gTasks[taskId].func = Task_NewGameSpeech18; + } +} + +//Slide new trainer sprite from right of screen +static void Task_NewGameSpeech18(u8 taskId) +{ + u8 spriteId = gTasks[taskId].tTrainerSpriteId; + + if (gSprites[spriteId].pos1.x > 180) + { + gSprites[spriteId].pos1.x -= 4; //Move sprite left + } + else + { + gSprites[spriteId].pos1.x = 180; + if (gTasks[taskId].tSubtaskIsDone) + { + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + gTasks[taskId].func = Task_NewGameSpeech16; //Go back to gender menu + } + } +} + +static void Task_NewGameSpeech19(u8 taskId) +{ + Menu_DrawStdWindowFrame(2, 13, 27, 18); + //"All right. What's your name?" + MenuPrintMessage(gBirchSpeech_WhatsYourName, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech20; +} + +static void Task_NewGameSpeech20(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + CreateNameMenu(2, 1); + gTasks[taskId].func = Task_NewGameSpeech21; + } +} + +//Handle name menu selection +static void Task_NewGameSpeech21(u8 taskId) +{ + s8 selection = NameMenuProcessInput(); + + switch (selection) + { + case 1: //preset names + case 2: + case 3: + case 4: + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + Menu_EraseWindowRect(2, 1, 22, 12); + SetPresetPlayerName(selection); + gTasks[taskId].func = Task_NewGameSpeech23; + break; + case 0: //NEW NAME + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_NewGameSpeech22; + break; + case -1: //B button + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + Menu_EraseWindowRect(2, 1, 22, 12); + gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu + break; + } +} + +//Open naming screen +static void Task_NewGameSpeech22(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetPresetPlayerName(1); + DoNamingScreen(0, gSaveBlock2.playerName, gSaveBlock2.playerGender, 0, 0, CB_ContinueNewGameSpeechPart2); + } +} + +static void Task_NewGameSpeech23(u8 taskId) +{ + Menu_DrawStdWindowFrame(2, 13, 27, 18); + //"So it's (PLAYER)?" + StringExpandPlaceholders(gStringVar4, gBirchSpeech_SoItsPlayer); + MenuPrintMessage(gStringVar4, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech24; +} + +static void Task_NewGameSpeech24(u8 taskId) +{ + if (BirchSpeechUpdateWindowText()) + { + DisplayYesNoMenu(2, 1, 1); + gTasks[taskId].func = Task_NewGameSpeech25; + } +} + +//Handle yes/no menu selection +static void Task_NewGameSpeech25(u8 taskId) +{ + switch (Menu_ProcessInputNoWrap_()) + { + case 0: //YES + PlaySE(SE_SELECT); + Menu_EraseWindowRect(2, 1, 8, 7); + gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; + StartSpriteFadeOut(taskId, 2); + StartBackgroundFadeOut(taskId, 1); + gTasks[taskId].func = Task_NewGameSpeech26; //Continue + break; + case -1: //B button + case 1: //NO + PlaySE(SE_SELECT); + Menu_EraseWindowRect(2, 1, 8, 7); + gTasks[taskId].func = Task_NewGameSpeech14; //Go back to gender menu + break; + } +} + +static void Task_NewGameSpeech26(u8 taskId) +{ + if (gTasks[taskId].tBGhofs) + { + gTasks[taskId].tBGhofs += 2; + REG_BG1HOFS = gTasks[taskId].tBGhofs; + } + else + { + gTasks[taskId].func = Task_NewGameSpeech27; + } +} + +static void Task_NewGameSpeech27(u8 taskId) +{ + if (gTasks[taskId].tSubtaskIsDone) + { + s16 spriteId; + + //Hide Brendan and May sprites + spriteId = gTasks[taskId].tBrendanSpriteId; + gSprites[spriteId].invisible = TRUE; + spriteId = gTasks[taskId].tMaySpriteId; + gSprites[spriteId].invisible = TRUE; + + //Fade in Birch and Azurill + spriteId = (u8)gTasks[taskId].tBirchSpriteId; + gSprites[spriteId].pos1.x = 136; + gSprites[spriteId].pos1.y = 64; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + spriteId = (u8)gTasks[taskId].tAzurillSpriteId; + gSprites[spriteId].pos1.x = 104; + gSprites[spriteId].pos1.y = 72; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + + StartSpriteFadeIn(taskId, 2); + StartBackgroundFadeIn(taskId, 1); + Menu_DrawStdWindowFrame(2, 13, 27, 18); + StringExpandPlaceholders(gStringVar4, gBirchSpeech_AhOkayYouArePlayer); + //"Ah, okay! You're (PLAYER) who's moving... + //...I get it now!" + MenuPrintMessage(gStringVar4, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech28; + } +} + +static void Task_NewGameSpeech28(u8 taskId) +{ + if (gTasks[taskId].tSubtaskIsDone) + { + s16 spriteId; + + spriteId = gTasks[taskId].tBirchSpriteId; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + + spriteId = gTasks[taskId].tAzurillSpriteId; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + + if (BirchSpeechUpdateWindowText()) + { + //Fade out Birch and Azurill + spriteId = gTasks[taskId].tBirchSpriteId; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + spriteId = gTasks[taskId].tAzurillSpriteId; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + + StartSpriteFadeOut(taskId, 2); + StartBackgroundFadeOut(taskId, 1); + gTasks[taskId].tFrameCounter = 64; + gTasks[taskId].func = Task_NewGameSpeech29; + } + } +} + +static void Task_NewGameSpeech29(u8 taskId) +{ + if (gTasks[taskId].tSubtaskIsDone) + { + s16 spriteId; + + //Hide Birch and Azurill + spriteId = gTasks[taskId].tBirchSpriteId; + gSprites[spriteId].invisible = TRUE; + spriteId = gTasks[taskId].tAzurillSpriteId; + gSprites[spriteId].invisible = TRUE; + + if (gTasks[taskId].tFrameCounter) + { + gTasks[taskId].tFrameCounter--; + } + else + { + u8 spriteId; + + //Fade in trainer and background + if (gSaveBlock2.playerGender) + spriteId = (u8)gTasks[taskId].tMaySpriteId; + else + spriteId = (u8)gTasks[taskId].tBrendanSpriteId; + gSprites[spriteId].pos1.x = 120; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; + gTasks[taskId].tTrainerSpriteId = spriteId; + + StartSpriteFadeIn(taskId, 2); + StartBackgroundFadeIn(taskId, 1); + Menu_DrawStdWindowFrame(2, 13, 27, 18); + MenuPrintMessage(gBirchSpeech_AreYouReady, 3, 14); + gTasks[taskId].func = Task_NewGameSpeech30; + } + } +} + +static void Task_NewGameSpeech30(u8 taskId) +{ + if (gTasks[taskId].tSubtaskIsDone) + { + s16 spriteId; + + spriteId = gTasks[taskId].tTrainerSpriteId; + gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL; + + if (BirchSpeechUpdateWindowText()) + { + u8 spriteId; + + spriteId = gTasks[taskId].tTrainerSpriteId; + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E79AC; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 0); + gSprites[spriteId].callback = ShrinkPlayerSprite; + BeginNormalPaletteFade(0x0000FFFF, 0, 0, 0x10, 0); + FadeOutBGM(4); + gTasks[taskId].func = Task_NewGameSpeech31; + } + } +} + +static void Task_NewGameSpeech31(u8 taskId) +{ + u8 spriteId = gTasks[taskId].tTrainerSpriteId; + + if (gSprites[spriteId].affineAnimEnded) + gTasks[taskId].func = Task_NewGameSpeech32; +} + +static void Task_NewGameSpeech32(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 spriteId = gTasks[taskId].tTrainerSpriteId; + gSprites[spriteId].callback = nullsub_34; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON; + BeginNormalPaletteFade(0xFFFF0000, 0, 0, 0x10, 0xFFFF); + gTasks[taskId].func = Task_NewGameSpeech33; + } +} + +static void Task_NewGameSpeech33(u8 taskId) +{ + if (!gPaletteFade.active) + { + //We're finished setting up. Start the new game! + SetMainCallback2(CB2_NewGame); + DestroyTask(taskId); + } +} + +// Re-initializes graphics state after running the naming screen +// and continues the new game speech +void CB_ContinueNewGameSpeechPart2() +{ + u8 taskId; + u8 spriteId; + u16 savedIme; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)PLTT, PLTT_SIZE); + + ResetPaletteFade(); + + LZ77UnCompVram(gBirchIntroShadowGfx, (void *)BG_VRAM); + LZ77UnCompVram(gUnknown_081E7834, (void *)(BG_VRAM + 0x3800)); + + LoadPalette(gUnknown_081E764C, 0, 0x40); + + ResetTasks(); + + taskId = CreateTask(Task_NewGameSpeech23, 0); + + gTasks[taskId].tBGhofs = -60; + + ScanlineEffect_Stop(); + ResetSpriteData(); + FreeAllSpritePalettes(); + AddBirchSpeechObjects(taskId); + + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow((struct WindowTemplate *)&gWindowTemplate_81E6CE4); + + if (gSaveBlock2.playerGender != MALE) + { + gTasks[taskId].tGenderSelection = FEMALE; + spriteId = gTasks[taskId].tMaySpriteId; + } + else + { + gTasks[taskId].tGenderSelection = MALE; + spriteId = gTasks[taskId].tBrendanSpriteId; + } + + gSprites[spriteId].pos1.x = 180; + gSprites[spriteId].pos1.y = 60; + gSprites[spriteId].invisible = FALSE; + + gTasks[taskId].tTrainerSpriteId = spriteId; + + REG_BG1HOFS = -60; + + BeginNormalPaletteFade(0xFFFFFFFFu, 0, 0x10, 0, 0); + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + + SetVBlankCallback(VBlankCB_MainMenu); + SetMainCallback2(CB2_MainMenu); + REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | + DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; +} + +void nullsub_34(struct Sprite *sprite) +{ +} + +void ShrinkPlayerSprite(struct Sprite *sprite) +{ + u32 y = (sprite->pos1.y << 16) + sprite->data[0] + 0xC000; + sprite->pos1.y = y >> 16; + sprite->data[0] = y; +} + +u8 CreateAzurillSprite(u8 x, u8 y) +{ + DecompressPicFromTable_2( + &gMonFrontPicTable[SPECIES_AZURILL], + gMonFrontPicCoords[SPECIES_AZURILL].coords, + gMonFrontPicCoords[SPECIES_AZURILL].y_offset, + gUnknown_081FAF4C[0], + gUnknown_081FAF4C[1], + SPECIES_AZURILL); + LoadCompressedObjectPalette(&gMonPaletteTable[SPECIES_AZURILL]); + GetMonSpriteTemplate_803C56C(SPECIES_AZURILL, 1); + return CreateSprite(&gUnknown_02024E8C, x, y, 0); +} + +void AddBirchSpeechObjects(u8 taskId) +{ + u8 spriteId; + + spriteId = CreateBirchSprite(136, 60, 1); + gSprites[spriteId].callback = nullsub_34; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].invisible = 1; + gTasks[taskId].tBirchSpriteId = spriteId; + + spriteId = CreateAzurillSprite(0x68, 0x48); + gSprites[spriteId].callback = nullsub_34; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].invisible = 1; + gTasks[taskId].tAzurillSpriteId = spriteId; + + //Create Brendan sprite + spriteId = CreateTrainerSprite(0, 120, 60, 0, eBrendanSprite); + gSprites[spriteId].callback = nullsub_34; + gSprites[spriteId].invisible = 1; + gSprites[spriteId].oam.priority = 0; + gTasks[taskId].tBrendanSpriteId = spriteId; + + //Create May sprite + spriteId = CreateTrainerSprite(1, 120, 60, 0, eMaySprite); + gSprites[spriteId].callback = nullsub_34; + gSprites[spriteId].invisible = 1; + gSprites[spriteId].oam.priority = 0; + gTasks[taskId].tMaySpriteId = spriteId; +} + +#undef tTrainerSpriteId +#undef tBGhofs +//#undef tSubtaskIsDone +#undef tGenderSelection +#undef tFrameCounter +#undef tBirchSpriteId +#undef tAzurillSpriteId +#undef tBrendanSpriteId +#undef tMaySpriteId + + +// Sprite Fade task + +#define tMainTaskId data[0] +#define tBlendEVA data[1] +#define tBlendEVB data[2] +#define tUpdateInterval data[3] +#define tFrameCounter data[4] + +static void Task_SpriteFadeOut(u8 taskId) +{ + if (gTasks[taskId].tBlendEVA == 0) + { + gTasks[gTasks[taskId].tMainTaskId].tSubtaskIsDone = TRUE; + DestroyTask(taskId); + } + else + { + if (gTasks[taskId].tFrameCounter) + { + gTasks[taskId].tFrameCounter--; + } + else + { + gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval; + gTasks[taskId].tBlendEVA--; + gTasks[taskId].tBlendEVB++; + REG_BLDALPHA = gTasks[taskId].tBlendEVA + (gTasks[taskId].tBlendEVB * 256); + } + } +} + +//Launches a helper task to fade out sprites +static void StartSpriteFadeOut(u8 taskId, u8 interval) +{ + u8 newTaskId; + + REG_BLDCNT = 592; + REG_BLDALPHA = 16; + REG_BLDY = 0; + gTasks[taskId].tSubtaskIsDone = FALSE; + newTaskId = CreateTask(Task_SpriteFadeOut, 0); + + gTasks[newTaskId].tMainTaskId = taskId; + gTasks[newTaskId].tBlendEVA = 16; + gTasks[newTaskId].tBlendEVB = 0; + gTasks[newTaskId].tUpdateInterval = interval; + gTasks[newTaskId].tFrameCounter = interval; +} + +static void Task_SpriteFadeIn(u8 taskId) +{ + if (gTasks[taskId].tBlendEVA == 16) + { + gTasks[gTasks[taskId].tMainTaskId].tSubtaskIsDone = TRUE; + DestroyTask(taskId); + } + else if (gTasks[taskId].tFrameCounter) + { + gTasks[taskId].tFrameCounter--; + } + else + { + gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval; + gTasks[taskId].tBlendEVA++; + gTasks[taskId].tBlendEVB--; + REG_BLDALPHA = gTasks[taskId].tBlendEVA + (gTasks[taskId].tBlendEVB * 256); + } +} + +//Launches a helper task to fade in sprites +static void StartSpriteFadeIn(u8 taskId, u8 interval) +{ + u8 newTaskId; + + REG_BLDCNT = 592; + REG_BLDALPHA = 4096; + REG_BLDY = 0; + gTasks[taskId].tSubtaskIsDone = FALSE; + newTaskId = CreateTask(Task_SpriteFadeIn, 0); + + gTasks[newTaskId].tMainTaskId = taskId; + gTasks[newTaskId].tBlendEVA = 0; + gTasks[newTaskId].tBlendEVB = 16; + gTasks[newTaskId].tUpdateInterval = interval; + gTasks[newTaskId].tFrameCounter = interval; +} + +#undef tMainTaskId +#undef tBlendEVA +#undef tBlendEVB +#undef tUpdateInterval +#undef tFrameCounter + + +// Background fade task + +#define tMainTaskId data[0] +#define tFadeLevel data[1] +#define tDelay data[2] +#define tUpdateInterval data[3] +#define tFrameCounter data[4] + +static void HandleFloorShadowFadeOut(u8 taskId) +{ + if (gTasks[taskId].tDelay) + gTasks[taskId].tDelay--; + else + { + if (gTasks[taskId].tFadeLevel == 8) + DestroyTask(taskId); + else + { + if (gTasks[taskId].tFrameCounter) + gTasks[taskId].tFrameCounter--; + else + { + gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval; + gTasks[taskId].tFadeLevel++; + LoadPalette(&gUnknown_081E795C[gTasks[taskId].tFadeLevel], 1, 0x10); + } + } + } +} + +//Launches a helper task to fade out the background +static void StartBackgroundFadeOut(u8 taskId, u8 interval) +{ + u8 newTaskId = CreateTask(HandleFloorShadowFadeOut, 0); + gTasks[newTaskId].tMainTaskId = taskId; + gTasks[newTaskId].tFadeLevel = 0; + gTasks[newTaskId].tDelay = 8; + gTasks[newTaskId].tUpdateInterval = interval; + gTasks[newTaskId].tFrameCounter = interval; +} + +static void HandleFloorShadowFadeIn(u8 taskId) +{ + if (gTasks[taskId].tDelay) + gTasks[taskId].tDelay--; + else + { + if (gTasks[taskId].tFadeLevel == 0) + DestroyTask(taskId); + else + { + if (gTasks[taskId].tFrameCounter) + gTasks[taskId].tFrameCounter--; + else + { + gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval; + gTasks[taskId].tFadeLevel--; + LoadPalette(&gUnknown_081E795C[gTasks[taskId].tFadeLevel], 1, 0x10); + } + } + } +} + +//Launches a helper task to fade in the background +static void StartBackgroundFadeIn(u8 taskId, u8 interval) +{ + u8 newTaskId = CreateTask(HandleFloorShadowFadeIn, 0); + gTasks[newTaskId].tMainTaskId = taskId; + gTasks[newTaskId].tFadeLevel = 8; + gTasks[newTaskId].tDelay = 8; + gTasks[newTaskId].tUpdateInterval = interval; + gTasks[newTaskId].tFrameCounter = interval; +} + +#undef tMainTaskId +#undef tFadeLevel +#undef tDelay +#undef tUpdateInterval +#undef tFrameCounter + +static void CreateGenderMenu(u8 left, u8 top) +{ + u8 menuLeft, menuTop; + Menu_DrawStdWindowFrame(left, top, left + 6, top + 5); + menuLeft = left + 1; + menuTop = top + 1; + Menu_PrintItems(menuLeft, menuTop, 2, gUnknown_081E79B0); + InitMenu(0, menuLeft, menuTop, 2, 0, 5); +} + +static s8 GenderMenuProcessInput(void) +{ + return Menu_ProcessInputNoWrap(); +} + +static void CreateNameMenu(u8 left, u8 top) +{ + Menu_DrawStdWindowFrame(left, top, left + 10, top + 11); + + if (gSaveBlock2.playerGender == MALE) + Menu_PrintItems(left + 1, top + 1, 5, gMalePresetNames); + else + Menu_PrintItems(left + 1, top + 1, 5, gFemalePresetNames); + + InitMenu(0, left + 1, top + 1, 5, 0, 9); +} + +static s8 NameMenuProcessInput(void) +{ + return Menu_ProcessInput(); +} + +static void SetPresetPlayerName(u8 index) +{ + u8 i; + u8 *name; + + if (gSaveBlock2.playerGender == MALE) + name = (u8 *) gMalePresetNames[index].text; + else + name = (u8 *) gFemalePresetNames[index].text; + + for (i = 0; i < 7; i++) + gSaveBlock2.playerName[i] = name[i]; + + gSaveBlock2.playerName[i] = EOS; +} diff --git a/src/map_name_popup.c b/src/map_name_popup.c new file mode 100644 index 000000000..49a470cc1 --- /dev/null +++ b/src/map_name_popup.c @@ -0,0 +1,107 @@ +#include "global.h" +#include "map_name_popup.h" +#include "event_data.h" +#include "menu.h" +#include "region_map.h" +#include "task.h" + +EWRAM_DATA static u8 sTaskId = 0; + +static void Task_MapNamePopup(u8); +static void DrawMapNamePopup(void); + +bool8 unref_sub_80A2F44(void) +{ + CloseMenu(); + ShowMapNamePopup(); + return 1; +} + +void ShowMapNamePopup(void) +{ + if (FlagGet(FLAG_SPECIAL_FLAG_0) != TRUE) + { + if (!FuncIsActiveTask(Task_MapNamePopup)) + { + sTaskId = CreateTask(Task_MapNamePopup, 90); + REG_BG0VOFS = 32; + DrawMapNamePopup(); + gTasks[sTaskId].data[0] = 0; + gTasks[sTaskId].data[2] = 32; + } + else + { + if (gTasks[sTaskId].data[0] != 2) + gTasks[sTaskId].data[0] = 2; + gTasks[sTaskId].data[3] = 1; + } + } +} + +void Task_MapNamePopup(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[2] -= 2; + if (task->data[2] <= 0 ) + { + task->data[0] = 1; + gTasks[sTaskId].data[1] = 0; + } + break; + case 1: + task->data[1]++; + if (task->data[1] > 120 ) + { + task->data[1] = 0; + task->data[0] = 2; + } + break; + case 2: + task->data[2] += 2; + if (task->data[2] > 31) + { + if (task->data[3]) + { + DrawMapNamePopup(); + task->data[0] = 0; + task->data[3] = 0; + } + else + { + task->data[0] = 4; + return; + } + } + break; + case 4: + HideMapNamePopup(); + return; + } + + REG_BG0VOFS = task->data[2]; +} + +void HideMapNamePopup(void) +{ + if (FuncIsActiveTask(Task_MapNamePopup)) + { + Menu_LoadStdFrameGraphics(); + Menu_EraseWindowRect(0, 0, 13, 3); + REG_BG0VOFS = 0; + DestroyTask(sTaskId); + } +} + +void DrawMapNamePopup(void) +{ + u8 name[20]; + + Menu_LoadStdFrameGraphicsOverrideStyle(0); + GetMapSectionName(name, gMapHeader.regionMapSectionId, 0); + Menu_DrawStdWindowFrame(0, 0, 13, 3); + sub_8072BD8(name, 1, 1, 0x60); +} diff --git a/src/map_obj_lock.c b/src/map_obj_lock.c new file mode 100644 index 000000000..3bd25dbdf --- /dev/null +++ b/src/map_obj_lock.c @@ -0,0 +1,117 @@ +#include "global.h" +#include "map_obj_lock.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "script_movement.h" +#include "task.h" + +extern u16 gSpecialVar_Facing; + +bool8 walkrun_is_standing_still(void) +{ + if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) + return FALSE; + else + return TRUE; +} + +void sub_8064CDC(u8 taskId) +{ + if (walkrun_is_standing_still()) + { + sub_80594C0(); + DestroyTask(taskId); + } +} + +bool8 sub_8064CFC(void) +{ + if (FuncIsActiveTask(sub_8064CDC)) + { + return FALSE; + } + else + { + sub_80597F4(); + return TRUE; + } +} + +void ScriptFreezeMapObjects(void) +{ + FreezeMapObjects(); + CreateTask(sub_8064CDC, 80); +} + +void sub_8064D38(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (!task->data[0] && walkrun_is_standing_still() == TRUE) + { + sub_80594C0(); + task->data[0] = 1; + } + if (!task->data[1] && !gMapObjects[gSelectedMapObject].mapobj_bit_1) + { + FreezeMapObject(&gMapObjects[gSelectedMapObject]); + task->data[1] = 1; + } + if (task->data[0] && task->data[1]) + DestroyTask(taskId); +} + +bool8 sub_8064DB4(void) +{ + if (FuncIsActiveTask(sub_8064D38)) + { + return FALSE; + } + else + { + sub_80597F4(); + return TRUE; + } +} + +void LockSelectedMapObject(void) +{ + u8 taskId; + FreezeMapObjectsExceptOne(gSelectedMapObject); + taskId = CreateTask(sub_8064D38, 80); + if (!gMapObjects[gSelectedMapObject].mapobj_bit_1) + { + FreezeMapObject(&gMapObjects[gSelectedMapObject]); + gTasks[taskId].data[1] = 1; + } +} + +void sub_8064E2C(void) +{ + u8 objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + sub_80A2178(); + UnfreezeMapObjects(); +} + +void unref_sub_8064E5C(void) +{ + u8 objectId; + + if (gMapObjects[gSelectedMapObject].active) + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); + objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + sub_80A2178(); + UnfreezeMapObjects(); +} + +void sub_8064EAC(void) +{ + FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], gSpecialVar_Facing); +} + +void sub_8064ED4(void) +{ + FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[gSelectedMapObject]); +} diff --git a/src/mauville_man.c b/src/mauville_man.c new file mode 100644 index 000000000..a68d5071d --- /dev/null +++ b/src/mauville_man.c @@ -0,0 +1,1345 @@ +#include "global.h" +#include "bard_music.h" +#include "mauville_man.h" +#include "easy_chat.h" +#include "constants/easy_chat.h" +#include "event_data.h" +#include "field_message_box.h" +#include "m4a.h" +#include "menu.h" +#include "overworld.h" +#include "random.h" +#include "script.h" +#include "constants/map_objects.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "trader.h" + +#define MACRO1(a) (((a) % 4) + (((a) / 8) & 1)) + +extern struct MusicPlayerInfo gMPlay_SE2; + +extern u16 gSpecialVar_Result; +extern u16 gSpecialVar_0x8004; + +extern const u8 gTextStoryteller_Story1Title[]; +extern const u8 gTextStoryteller_Story1Action[]; +extern const u8 gTextStoryteller_Story1Text[]; +extern const u8 gTextStoryteller_Story2Title[]; +extern const u8 gTextStoryteller_Story2Action[]; +extern const u8 gTextStoryteller_Story2Text[]; +extern const u8 gTextStoryteller_Story3Title[]; +extern const u8 gTextStoryteller_Story3Action[]; +extern const u8 gTextStoryteller_Story3Text[]; +extern const u8 gTextStoryteller_Story4Title[]; +extern const u8 gTextStoryteller_Story4Action[]; +extern const u8 gTextStoryteller_Story4Text[]; +extern const u8 gTextStoryteller_Story5Title[]; +extern const u8 gTextStoryteller_Story5Action[]; +extern const u8 gTextStoryteller_Story5Text[]; +extern const u8 gTextStoryteller_Story6Title[]; +extern const u8 gTextStoryteller_Story6Action[]; +extern const u8 gTextStoryteller_Story6Text[]; +extern const u8 gTextStoryteller_Story7Title[]; +extern const u8 gTextStoryteller_Story7Action[]; +extern const u8 gTextStoryteller_Story7Text[]; +extern const u8 gTextStoryteller_Story8Title[]; +extern const u8 gTextStoryteller_Story8Action[]; +extern const u8 gTextStoryteller_Story8Text[]; +extern const u8 gTextStoryteller_Story9Title[]; +extern const u8 gTextStoryteller_Story9Action[]; +extern const u8 gTextStoryteller_Story9Text[]; +extern const u8 gTextStoryteller_Story10Title[]; +extern const u8 gTextStoryteller_Story10Action[]; +extern const u8 gTextStoryteller_Story10Text[]; +extern const u8 gTextStoryteller_Story11Title[]; +extern const u8 gTextStoryteller_Story11Action[]; +extern const u8 gTextStoryteller_Story11Text[]; +extern const u8 gTextStoryteller_Story12Title[]; +extern const u8 gTextStoryteller_Story12Action[]; +extern const u8 gTextStoryteller_Story12Text[]; +extern const u8 gTextStoryteller_Story13Title[]; +extern const u8 gTextStoryteller_Story13Action[]; +extern const u8 gTextStoryteller_Story13Text[]; +extern const u8 gTextStoryteller_Story14Title[]; +extern const u8 gTextStoryteller_Story14Action[]; +extern const u8 gTextStoryteller_Story14Text[]; +extern const u8 gTextStoryteller_Story15Title[]; +extern const u8 gTextStoryteller_Story15Action[]; +extern const u8 gTextStoryteller_Story15Text[]; +extern const u8 gTextStoryteller_Story16Title[]; +extern const u8 gTextStoryteller_Story16Action[]; +extern const u8 gTextStoryteller_Story16Text[]; +extern const u8 gTextStoryteller_Story17Title[]; +extern const u8 gTextStoryteller_Story17Action[]; +extern const u8 gTextStoryteller_Story17Text[]; +extern const u8 gTextStoryteller_Story18Title[]; +extern const u8 gTextStoryteller_Story18Action[]; +extern const u8 gTextStoryteller_Story18Text[]; +extern const u8 gTextStoryteller_Story19Title[]; +extern const u8 gTextStoryteller_Story19Action[]; +extern const u8 gTextStoryteller_Story19Text[]; +extern const u8 gTextStoryteller_Story20Title[]; +extern const u8 gTextStoryteller_Story20Action[]; +extern const u8 gTextStoryteller_Story20Text[]; +extern const u8 gTextStoryteller_Story21Title[]; +extern const u8 gTextStoryteller_Story21Action[]; +extern const u8 gTextStoryteller_Story21Text[]; +extern const u8 gTextStoryteller_Story22Title[]; +extern const u8 gTextStoryteller_Story22Action[]; +extern const u8 gTextStoryteller_Story22Text[]; +extern const u8 gTextStoryteller_Story23Title[]; +extern const u8 gTextStoryteller_Story23Action[]; +extern const u8 gTextStoryteller_Story23Text[]; +extern const u8 gTextStoryteller_Story24Title[]; +extern const u8 gTextStoryteller_Story24Action[]; +extern const u8 gTextStoryteller_Story24Text[]; +extern const u8 gTextStoryteller_Story25Title[]; +extern const u8 gTextStoryteller_Story25Action[]; +extern const u8 gTextStoryteller_Story25Text[]; +extern const u8 gTextStoryteller_Story26Title[]; +extern const u8 gTextStoryteller_Story26Action[]; +extern const u8 gTextStoryteller_Story26Text[]; +extern const u8 gTextStoryteller_Story27Title[]; +extern const u8 gTextStoryteller_Story27Action[]; +extern const u8 gTextStoryteller_Story27Text[]; +extern const u8 gTextStoryteller_Story28Title[]; +extern const u8 gTextStoryteller_Story28Action[]; +extern const u8 gTextStoryteller_Story28Text[]; +extern const u8 gTextStoryteller_Story29Title[]; +extern const u8 gTextStoryteller_Story29Action[]; +extern const u8 gTextStoryteller_Story29Text[]; +extern const u8 gTextStoryteller_Story30Title[]; +extern const u8 gTextStoryteller_Story30Action[]; +extern const u8 gTextStoryteller_Story30Text[]; +extern const u8 gTextStoryteller_Story31Title[]; +extern const u8 gTextStoryteller_Story31Action[]; +extern const u8 gTextStoryteller_Story31Text[]; +extern const u8 gTextStoryteller_Story32Title[]; +extern const u8 gTextStoryteller_Story32Action[]; +extern const u8 gTextStoryteller_Story32Text[]; +extern const u8 gTextStoryteller_Story33Title[]; +extern const u8 gTextStoryteller_Story33Action[]; +extern const u8 gTextStoryteller_Story33Text[]; +extern const u8 gTextStoryteller_Story34Title[]; +extern const u8 gTextStoryteller_Story34Action[]; +extern const u8 gTextStoryteller_Story34Text[]; +extern const u8 gTextStoryteller_Story35Title[]; +extern const u8 gTextStoryteller_Story35Action[]; +extern const u8 gTextStoryteller_Story35Text[]; +extern const u8 gTextStoryteller_Story36Title[]; +extern const u8 gTextStoryteller_Story36Action[]; +extern const u8 gTextStoryteller_Story36Text[]; + +extern struct BardSong gUnknown_03005DA0; + +EWRAM_DATA static u16 gUnknown_020388BC = 0; // set but not used? + +static const u16 sDefaultBardSongLyrics[] = +{ +#ifdef ENGLISH + EC_WORD_SISTER, + EC_WORD_EATS, + EC_WORD_SWEETS, + EC_WORD_VORACIOUS, + EC_WORD_AND, + EC_WORD_DROOLING, +#else + EC_WORD_SISTER, + EC_WORD_MUST_BE, + EC_WORD_SWEETS, + EC_WORD_VORACIOUS, + EC_WORD_DROOLING, + EC_WORD_THICK, +#endif +}; + +static const u8 *const sGiddyAdjectives[] = +{ + OtherText_SoPretty, + OtherText_SoDarling, + OtherText_SoRelaxed, + OtherText_SoSunny, + OtherText_SoDesirable, + OtherText_SoExciting, + OtherText_SoAmusing, + OtherText_SoMagical, +}; + +static const u8 *const sGiddyQuestions[] = +{ + OtherText_WantVacationNicePlace, + OtherText_BoughtCrayonsIsNice, + OtherText_IfWeCouldFloat, + OtherText_SandWashesAwayMakeSad, + OtherText_WhatsBottomSeaLike, + OtherText_SeeSettingSun, + OtherText_LyingInGreenGrass, + OtherText_SecretBasesWonderful, +}; + +static void sub_80F7DC0(void); +static void Task_BardSong(u8); +static void StartBardSong(u8); +static void StorytellerSetup(void); +static void sub_80F8428(void); + +static void SetupBard(void) +{ + u16 i; + struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; + + bard->id = MAUVILLE_MAN_BARD; + bard->hasChangedSong = FALSE; + for (i = 0; i < 6; i++) + bard->songLyrics[i] = sDefaultBardSongLyrics[i]; +} + +static void SetupHipster(void) +{ + struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster; + + hipster->id = MAUVILLE_MAN_HIPSTER; + hipster->alreadySpoken = FALSE; +} + +static void SetupStoryteller(void) +{ + StorytellerSetup(); +} + +static void SetupGiddy(void) +{ + struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; + + giddy->id = MAUVILLE_MAN_GIDDY; + giddy->taleCounter = 0; +} + +static void SetupTrader(void) +{ + TraderSetup(); +} + +void SetupMauvilleOldMan(void) +{ + u16 trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; + + // Determine man based on the last digit of the player's trainer ID. + switch ((trainerId % 10) / 2) + { + case MAUVILLE_MAN_BARD: + SetupBard(); + break; + case MAUVILLE_MAN_HIPSTER: + SetupHipster(); + break; + case MAUVILLE_MAN_TRADER: + SetupTrader(); + break; + case MAUVILLE_MAN_STORYTELLER: + SetupStoryteller(); + break; + case MAUVILLE_MAN_GIDDY: + SetupGiddy(); + break; + } + sub_80F83D0(); +} + +#if DEBUG +void debug_sub_810B32C(u8 a) +{ + u8 i; + u8 savedArr[8]; + + switch (a) + { + case 0: + SetupBard(); + break; + case 1: + for (i = 0; i < 8; i++) + savedArr[i] = gSaveBlock1.unk2D8C[i]; + SetupHipster(); + for (i = 0; i < 8; i++) + gSaveBlock1.unk2D8C[i] = savedArr[i]; + break; + case 2: + SetupTrader(); + break; + case 3: + SetupStoryteller(); + break; + case 4: + SetupGiddy(); + break; + } + sub_80F83D0(); +} +#endif + +u8 GetCurrentMauvilleOldMan(void) +{ + struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common; + + return common->id; +} + +void ScrSpecial_GetCurrentMauvilleMan(void) +{ + gSpecialVar_Result = GetCurrentMauvilleOldMan(); +} + +void ScrSpecial_HasBardSongBeenChanged(void) +{ + u16 *scriptResult = &gSpecialVar_Result; // why?? + struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; + + *scriptResult = bard->hasChangedSong; +} + +void ScrSpecial_SaveBardSongLyrics(void) +{ + u16 i; + struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; + + StringCopy(bard->playerName, gSaveBlock2.playerName); + + for (i = 0; i < 4; i++) + bard->playerTrainerId[i] = gSaveBlock2.playerTrainerId[i]; + + for (i = 0; i < 6; i++) + bard->songLyrics[i] = bard->temporaryLyrics[i]; + + bard->hasChangedSong = TRUE; +} + +// Copies lyrics into gStringVar4 +void PrepareSongText(void) +{ + struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; + u16 specialVar = gSpecialVar_0x8004; // It's a bit odd to use this temp variable, but it seems needed to match. + u16 *lyrics; + u16 lineNum; + u8 *wordEnd; + u8 *str; + + lyrics = bard->temporaryLyrics; + if (specialVar == 0) + lyrics = bard->songLyrics; + wordEnd = gStringVar4; + str = wordEnd; + // Put three words on each line + for (lineNum = 0; lineNum < 2; lineNum++) + { + wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++)); + while (wordEnd != str) + { + if (*str == CHAR_SPACE) + *str = CHAR_SONG_WORD_SEPARATOR; + str++; + } + + str++; + *(wordEnd++) = CHAR_SPACE; + + wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++)); + while (wordEnd != str) + { + if (*str == CHAR_SPACE) + *str = CHAR_SONG_WORD_SEPARATOR; + str++; + } + + str++; + *(wordEnd++) = CHAR_NEWLINE; + + wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++)); + while (wordEnd != str) + { + if (*str == CHAR_SPACE) + *str = CHAR_SONG_WORD_SEPARATOR; + str++; + } + + if (lineNum == 0) + { + *(wordEnd++) = EXT_CTRL_CODE_BEGIN; + *(wordEnd++) = 15; + } + } +} + +void ScrSpecial_PlayBardSong(void) +{ + StartBardSong(gSpecialVar_0x8004); + Menu_DisplayDialogueFrame(); + ScriptContext1_Stop(); +} + +void ScrSpecial_GetHipsterSpokenFlag(void) +{ + u16 *scriptResult = &gSpecialVar_Result; // again?? + struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster; + + *scriptResult = hipster->alreadySpoken; +} + +void ScrSpecial_SetHipsterSpokenFlag(void) +{ + struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster; + + hipster->alreadySpoken = TRUE; +} + +void ScrSpecial_HipsterTeachWord(void) +{ + u16 var = sub_80EB8EC(); + + if (var == 0xFFFF) + { + gSpecialVar_Result = FALSE; + } + else + { + EasyChat_GetWordText(gStringVar1, var); + gSpecialVar_Result = TRUE; + } +} + +void ScrSpecial_GiddyShouldTellAnotherTale(void) +{ + struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; + + if (giddy->taleCounter == 10) + { + gSpecialVar_Result = FALSE; + giddy->taleCounter = 0; + } + else + { + gSpecialVar_Result = TRUE; + } +} + +void ScrSpecial_GenerateGiddyLine(void) +{ + struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; + + if (giddy->taleCounter == 0) + sub_80F7DC0(); + + if (giddy->randomWords[giddy->taleCounter] != 0xFFFF) // is not the last element of the array? + { + u8 *stringPtr; + u32 adjective = Random(); + + adjective %= 8; + stringPtr = EasyChat_GetWordText(gStringVar4, giddy->randomWords[giddy->taleCounter]); + stringPtr = StringCopy(stringPtr, gOtherText_Is); + stringPtr = StringCopy(stringPtr, sGiddyAdjectives[adjective]); + StringCopy(stringPtr, gOtherText_DontYouAgree); + } + else + { + StringCopy(gStringVar4, sGiddyQuestions[giddy->questionList[giddy->questionNum++]]); + } + + if (!(Random() % 10)) + giddy->taleCounter = 10; + else + giddy->taleCounter++; + + gSpecialVar_Result = TRUE; +} + +#ifdef NONMATCHING +static void sub_80F7DC0(void) +{ + u16 arr[][2] = + { + { 0x0, 0}, + { 0xC, 0}, + { 0xD, 0}, + {0x12, 0}, + {0x13, 0}, + {0x15, 0}, + }; + u16 i; + u16 r10; + u16 r7; + + for (i = 0; i < 8; i++) + { + struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; + + //gSaveBlock1.mauvilleMan.giddy.questionList[i] = i; + giddy->questionList[i] = i; + } + + // Scramble questions + for (i = 0; i < 8; i++) + { + struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; + + /* + u16 r1 = Random() % (i + 1); + u8 r7 = gSaveBlock1.mauvilleMan.giddy.questionList[i]; + gSaveBlock1.mauvilleMan.giddy.questionList[i] = gSaveBlock1.mauvilleMan.giddy.questionList[r1]; + gSaveBlock1.mauvilleMan.giddy.questionList[r1] = r7; + */ + u16 r1 = Random() % (i + 1); + u8 r7 = giddy->questionList[i]; + giddy->questionList[i] = giddy->questionList[r1]; + giddy->questionList[r1] = r7; + } + + r10 = 0; + for (i = 0; i < 6; i++) + { + arr[i][1] = sub_80EAE88(arr[i][0]); + r10 += arr[i][1]; + } + + { + struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; + giddy->questionNum = 0; + } + //gSaveBlock1.mauvilleMan.giddy.questionNum = 0; + + r7 = 0; + for (i = 0; i < 10; i++) + { + struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy; + + u16 var = Random() % 10; + if (var < 3 && r7 < 8) + { + //gSaveBlock1.mauvilleMan.giddy.randomWords[i] = 0xFFFF; + giddy->randomWords[i] = 0xFFFF; + r7++; + } + //_080F7E90 + else + { + s16 r2 = Random() % r10; + + u16 r1 = 0; + + while (i < 6) // comparing the wrong variable + { + r2 = arr[r1][1] - r2; + if (r2 <= 0) + break; + r1++; + } + + if (r1 == 6) + r1 = 0; + //gSaveBlock1.mauvilleMan.giddy.randomWords[i] = sub_80EB784(arr[r1][0]); + giddy->randomWords[i] = sub_80EB784(arr[r1][0]); + } + } +} +#else + +static const u16 gUnknown_083E53C8[][2] = +{ + { 0x0, 0}, + { 0xC, 0}, + { 0xD, 0}, + {0x12, 0}, + {0x13, 0}, + {0x15, 0}, +}; + +__attribute__((naked)) +static void sub_80F7DC0(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x18\n\ + ldr r1, _080F7E84 @ =gUnknown_083E53C8\n\ + mov r0, sp\n\ + movs r2, 0x18\n\ + bl memcpy\n\ + movs r5, 0\n\ + movs r0, 0x2\n\ + add r0, sp\n\ + mov r8, r0\n\ + ldr r1, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\ + adds r1, 0x18\n\ + adds r3, r1, 0\n\ +_080F7DE4:\n\ + adds r0, r3, r5\n\ + strb r5, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0x7\n\ + bls _080F7DE4\n\ + movs r5, 0\n\ + ldr r2, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\ + adds r2, 0x4\n\ + mov r9, r2\n\ + adds r6, r1, 0\n\ +_080F7DFC:\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + adds r4, r5, 0x1\n\ + adds r1, r4, 0\n\ + bl __modsi3\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + adds r2, r6, r5\n\ + ldrb r7, [r2]\n\ + adds r1, r6, r1\n\ + ldrb r0, [r1]\n\ + strb r0, [r2]\n\ + strb r7, [r1]\n\ + lsls r4, 16\n\ + lsrs r5, r4, 16\n\ + cmp r5, 0x7\n\ + bls _080F7DFC\n\ + movs r3, 0\n\ + mov r10, r3\n\ + movs r5, 0\n\ +_080F7E2A:\n\ + lsls r4, r5, 2\n\ + mov r1, sp\n\ + adds r0, r1, r4\n\ + ldrb r0, [r0]\n\ + bl sub_80EAE88\n\ + add r4, r8\n\ + strh r0, [r4]\n\ + add r0, r10\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r10, r0\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0x5\n\ + bls _080F7E2A\n\ + movs r0, 0\n\ + ldr r2, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\ + strb r0, [r2, 0x2]\n\ + movs r7, 0\n\ + movs r5, 0\n\ +_080F7E56:\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0xA\n\ + bl __umodsi3\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + cmp r1, 0x2\n\ + bhi _080F7E90\n\ + cmp r7, 0x7\n\ + bhi _080F7E90\n\ + lsls r0, r5, 1\n\ + add r0, r9\n\ + ldr r1, _080F7E8C @ =0x0000ffff\n\ + strh r1, [r0]\n\ + adds r0, r7, 0x1\n\ + lsls r0, 16\n\ + lsrs r7, r0, 16\n\ + adds r4, r5, 0x1\n\ + b _080F7EE2\n\ + .align 2, 0\n\ +_080F7E84: .4byte gUnknown_083E53C8\n\ +_080F7E88: .4byte gSaveBlock1 + 0x2D94\n\ +_080F7E8C: .4byte 0x0000ffff\n\ +_080F7E90:\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r1, r10\n\ + bl __umodsi3\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + movs r1, 0\n\ + adds r4, r5, 0x1\n\ + lsls r6, r5, 1\n\ + cmp r5, 0x5\n\ + bhi _080F7ECC\n\ + mov r3, r8\n\ + ldrh r0, [r3]\n\ + b _080F7EC2\n\ +_080F7EB2:\n\ + adds r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + cmp r5, 0x5\n\ + bhi _080F7ECC\n\ + lsls r0, r1, 2\n\ + adds r0, r3, r0\n\ + ldrh r0, [r0]\n\ +_080F7EC2:\n\ + subs r0, r2, r0\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r0, 0\n\ + bgt _080F7EB2\n\ +_080F7ECC:\n\ + cmp r1, 0x6\n\ + bne _080F7ED2\n\ + movs r1, 0\n\ +_080F7ED2:\n\ + lsls r0, r1, 2\n\ + add r0, sp\n\ + ldrh r0, [r0]\n\ + bl sub_80EB784\n\ + mov r2, r9\n\ + adds r1, r2, r6\n\ + strh r0, [r1]\n\ +_080F7EE2:\n\ + lsls r0, r4, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0x9\n\ + bls _080F7E56\n\ + add sp, 0x18\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +static void sub_80F7EFC(void) +{ + struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; + + bard->hasChangedSong = FALSE; +} + +static void sub_80F7F0C(void) +{ + struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster; + + hipster->alreadySpoken = FALSE; +} + +static void sub_80F7F18(void) +{ + sub_8109A20(); +} + +static void sub_80F7F24(void) +{ + sub_80F8428(); +} + +void sub_80F7F30(void) +{ + switch (GetCurrentMauvilleOldMan()) + { + case MAUVILLE_MAN_BARD: + sub_80F7EFC(); + break; + case MAUVILLE_MAN_HIPSTER: + sub_80F7F0C(); + break; + case MAUVILLE_MAN_STORYTELLER: + sub_80F7F24(); + break; + case MAUVILLE_MAN_TRADER: + sub_80F7F18(); + break; + case MAUVILLE_MAN_GIDDY: + break; + } + sub_80F83D0(); +} + +#define tState data[0] +#define tCharIndex data[3] +#define tCurrWord data[4] +#define tUseTemporaryLyrics data[5] + +static void StartBardSong(bool8 useTemporaryLyrics) +{ + u8 taskId = CreateTask(Task_BardSong, 0x50); + + gTasks[taskId].tUseTemporaryLyrics = useTemporaryLyrics; +} + +static void BardSing(struct Task *task, struct BardSong *song) +{ + switch (task->tState) + { + case 0: // Initialize song + { + struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; + u16 *lyrics; + s32 i; + + // Copy lyrics + if (gSpecialVar_0x8004 == 0) + lyrics = bard->songLyrics; + else + lyrics = bard->temporaryLyrics; + for (i = 0; i < 6; i++) + song->lyrics[i] = lyrics[i]; + + // Clear phonemes + for (i = 0; i < 6; i++) + { + song->phonemes[i].sound = 0xFFFF; + song->phonemes[i].length = 0; + song->phonemes[i].pitch = 0; + song->phonemes[i].volume = 0; + } + song->currWord = 0; + song->currPhoneme = 0; + song->var04 = 0; + } + break; + case 1: // Wait for BGM to end + break; + case 2: // Initialize word + { + u16 word = song->lyrics[song->currWord]; + const struct BardSound *sounds = GetWordSounds(EC_GROUP(word), EC_INDEX(word)); + + song->var04 = 0; + GetWordPhonemes(song, sounds, MACRO1(word)); + } + break; + case 3: + case 4: + { + struct BardPhoneme *phoneme = &song->phonemes[song->currPhoneme]; + + switch (song->state) + { + case 0: + if (song->phonemeTimer == 0) // Timer has expired. Move to next phoneme + { + if (song->currPhoneme == 6 || phoneme->sound == 0xFF) + { + song->state = 0xFE; + break; + } + song->phonemeTimer = phoneme->length; + if (phoneme->sound <= 50) + { + u16 num = phoneme->sound / 3; + + m4aSongNumStart(249 + num * 3); + } + song->state = 1; + } + else + { + if (song->voiceInflection > 10) + song->volume -= 2; + if (song->voiceInflection & 1) + song->pitch += 64; + else + song->pitch -= 64; + m4aMPlayVolumeControl(&gMPlay_SE2, 0xFFFF, song->volume); + m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, song->pitch); + song->voiceInflection++; + } + song->phonemeTimer--; + break; + case 1: + song->currPhoneme++; + song->state = 0; + if (phoneme->sound <= 50) + { + song->volume = 0x100 + phoneme->volume * 16; + m4aMPlayVolumeControl(&gMPlay_SE2, 0xFFFF, song->volume); + song->pitch = 0x200 + phoneme->pitch; + m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, song->pitch); + } + break; + case 0xFE: + m4aMPlayStop(&gMPlay_SE2); + song->state = 0xFF; + break; + } + } + break; + case 5: + break; + } +} + +static void Task_BardSong(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; // r5 + + BardSing(task, &gUnknown_03005DA0); + switch (task->tState) + { + case 0: // Initialize song + PrepareSongText(); + Text_InitWindowWithTemplate(gMenuWindowPtr, &gWindowTemplate_81E6CE4); + Text_InitWindow8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15); + task->data[1] = 0; + task->data[2] = 0; + task->tCharIndex = 0; + task->tCurrWord = 0; + FadeOutBGMTemporarily(4); + task->tState = 1; + break; + case 1: // Wait for BGM to end + if (IsBGMPausedOrStopped()) + task->tState = 2; + break; + case 2: // Initialize word + { + struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard; + u8 *str = gStringVar4 + task->tCharIndex; + u16 wordLen = 0; + // Can't get it to match without hacking + u32 temp; + register s16 zero asm("r1"); + + while (*str != CHAR_SPACE + && *str != CHAR_NEWLINE + && *str != EXT_CTRL_CODE_BEGIN + && *str != EOS) + { + str++; + wordLen++; + } + if (!task->tUseTemporaryLyrics) + gUnknown_020388BC = MACRO1(bard->songLyrics[task->tCurrWord]); + else + gUnknown_020388BC = MACRO1(bard->temporaryLyrics[task->tCurrWord]); + temp = gUnknown_03005DA0.var04 / wordLen; + zero = 0; + gUnknown_03005DA0.var04 = temp; + if (gUnknown_03005DA0.var04 <= 0) + gUnknown_03005DA0.var04 = 1; + task->tCurrWord++; + if (task->data[2] == 0) + task->tState = 3; + else + task->tState = 5; + task->data[1] = zero; + } + break; + case 5: + if (task->data[2] == 0) + task->tState = 3; + else + task->data[2]--; + break; + case 3: + if (gStringVar4[task->tCharIndex] == EOS) + { + FadeInNewBGM(BGM_POKECEN, 6); + m4aMPlayFadeOutTemporarily(&gMPlay_SE2, 2); + EnableBothScriptContexts(); + DestroyTask(taskId); + } + else if (gStringVar4[task->tCharIndex] == CHAR_SPACE) + { + Text_PrintWindowSimple(gMenuWindowPtr); + task->tCharIndex++; + task->tState = 2; + task->data[2] = 0; + } + else if (gStringVar4[task->tCharIndex] == CHAR_NEWLINE) + { + task->tCharIndex++; + task->tState = 2; + task->data[2] = 0; + } + else if (gStringVar4[task->tCharIndex] == EXT_CTRL_CODE_BEGIN) + { + task->tCharIndex += 2; // skip over control codes + task->tState = 2; + task->data[2] = 8; + } + else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR) + { + gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space + Text_PrintWindowSimple(gMenuWindowPtr); + task->tCharIndex++; + task->data[2] = 0; + } + else + { + switch (task->data[1]) + { + case 0: + Text_PrintWindowSimple(gMenuWindowPtr); + task->data[1]++; + break; + case 1: + task->data[1]++; + break; + case 2: + task->tCharIndex++; + task->data[1] = 0; + task->data[2] = gUnknown_03005DA0.var04; + task->tState = 4; + break; + } + } + break; + case 4: + task->data[2]--; + if (task->data[2] == 0) + task->tState = 3; + break; + } +} + +void sub_80F83D0(void) +{ + VarSet(VAR_OBJ_GFX_ID_0, MAP_OBJ_GFX_BARD + GetCurrentMauvilleOldMan()); +} + +struct Story +{ + u8 stat; + u8 minVal; + const u8 *title; + const u8 *action; + const u8 *fullText; +}; + +static const struct Story sStorytellerStories[] = +{ + {0x32, 1, gTextStoryteller_Story1Title, gTextStoryteller_Story1Action, gTextStoryteller_Story1Text}, + {0x02, 1, gTextStoryteller_Story2Title, gTextStoryteller_Story2Action, gTextStoryteller_Story2Text}, + {0x03, 1, gTextStoryteller_Story3Title, gTextStoryteller_Story3Action, gTextStoryteller_Story3Text}, + {0x04, 1, gTextStoryteller_Story4Title, gTextStoryteller_Story4Action, gTextStoryteller_Story4Text}, + {0x06, 1, gTextStoryteller_Story5Title, gTextStoryteller_Story5Action, gTextStoryteller_Story5Text}, + {0x09, 1, gTextStoryteller_Story6Title, gTextStoryteller_Story6Action, gTextStoryteller_Story6Text}, + {0x0B, 1, gTextStoryteller_Story7Title, gTextStoryteller_Story7Action, gTextStoryteller_Story7Text}, + {0x0C, 1, gTextStoryteller_Story8Title, gTextStoryteller_Story8Action, gTextStoryteller_Story8Text}, + {0x0D, 1, gTextStoryteller_Story9Title, gTextStoryteller_Story9Action, gTextStoryteller_Story9Text}, + {0x0E, 1, gTextStoryteller_Story10Title, gTextStoryteller_Story10Action, gTextStoryteller_Story10Text}, + {0x0F, 1, gTextStoryteller_Story11Title, gTextStoryteller_Story11Action, gTextStoryteller_Story11Text}, + {0x10, 1, gTextStoryteller_Story12Title, gTextStoryteller_Story12Action, gTextStoryteller_Story12Text}, + {0x11, 1, gTextStoryteller_Story13Title, gTextStoryteller_Story13Action, gTextStoryteller_Story13Text}, + {0x12, 1, gTextStoryteller_Story14Title, gTextStoryteller_Story14Action, gTextStoryteller_Story14Text}, + {0x13, 1, gTextStoryteller_Story15Title, gTextStoryteller_Story15Action, gTextStoryteller_Story15Text}, + {0x14, 1, gTextStoryteller_Story16Title, gTextStoryteller_Story16Action, gTextStoryteller_Story16Text}, + {0x1A, 1, gTextStoryteller_Story17Title, gTextStoryteller_Story17Action, gTextStoryteller_Story17Text}, + {0x1B, 1, gTextStoryteller_Story18Title, gTextStoryteller_Story18Action, gTextStoryteller_Story18Text}, + {0x1C, 1, gTextStoryteller_Story19Title, gTextStoryteller_Story19Action, gTextStoryteller_Story19Text}, + {0x1D, 2, gTextStoryteller_Story20Title, gTextStoryteller_Story20Action, gTextStoryteller_Story20Text}, + {0x1E, 1, gTextStoryteller_Story21Title, gTextStoryteller_Story21Action, gTextStoryteller_Story21Text}, + {0x21, 1, gTextStoryteller_Story22Title, gTextStoryteller_Story22Action, gTextStoryteller_Story22Text}, + {0x24, 1, gTextStoryteller_Story23Title, gTextStoryteller_Story23Action, gTextStoryteller_Story23Text}, + {0x25, 1, gTextStoryteller_Story24Title, gTextStoryteller_Story24Action, gTextStoryteller_Story24Text}, + {0x26, 1, gTextStoryteller_Story25Title, gTextStoryteller_Story25Action, gTextStoryteller_Story25Text}, + {0x27, 1, gTextStoryteller_Story26Title, gTextStoryteller_Story26Action, gTextStoryteller_Story26Text}, + {0x28, 1, gTextStoryteller_Story27Title, gTextStoryteller_Story27Action, gTextStoryteller_Story27Text}, + {0x29, 1, gTextStoryteller_Story28Title, gTextStoryteller_Story28Action, gTextStoryteller_Story28Text}, + {0x2A, 1, gTextStoryteller_Story29Title, gTextStoryteller_Story29Action, gTextStoryteller_Story29Text}, + {0x2B, 1, gTextStoryteller_Story30Title, gTextStoryteller_Story30Action, gTextStoryteller_Story30Text}, + {0x2C, 1, gTextStoryteller_Story31Title, gTextStoryteller_Story31Action, gTextStoryteller_Story31Text}, + {0x2D, 1, gTextStoryteller_Story32Title, gTextStoryteller_Story32Action, gTextStoryteller_Story32Text}, + {0x2E, 1, gTextStoryteller_Story33Title, gTextStoryteller_Story33Action, gTextStoryteller_Story33Text}, + {0x2F, 1, gTextStoryteller_Story34Title, gTextStoryteller_Story34Action, gTextStoryteller_Story34Text}, + {0x30, 1, gTextStoryteller_Story35Title, gTextStoryteller_Story35Action, gTextStoryteller_Story35Text}, + {0x31, 1, gTextStoryteller_Story36Title, gTextStoryteller_Story36Action, gTextStoryteller_Story36Text}, +}; + +static void StorytellerSetup(void) +{ + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + s32 i; + + storyteller->id = MAUVILLE_MAN_STORYTELLER; + storyteller->alreadyRecorded = FALSE; + for (i = 0; i < 4; i++) + { + storyteller->gameStatIDs[i] = 0; + storyteller->trainerNames[0][i] = EOS; // Maybe they meant storyteller->trainerNames[i][0] instead? + } +} + +static void sub_80F8428(void) +{ + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + + storyteller->id = MAUVILLE_MAN_STORYTELLER; + storyteller->alreadyRecorded = FALSE; +} + +static u32 StorytellerGetGameStat(u8 stat) +{ + if (stat == NUM_GAME_STATS) + stat = 0; + return GetGameStat(stat); +} + +static const struct Story *GetStoryByStat(u32 stat) +{ + s32 i; + + for (i = 0; i < 36; i++) + { + if (sStorytellerStories[i].stat == stat) + return &sStorytellerStories[i]; + } + return &sStorytellerStories[35]; +} + +static const u8 *GetStoryTitleByStat(u32 stat) +{ + return GetStoryByStat(stat)->title; +} + +static const u8 *GetStoryTextByStat(u32 stat) +{ + return GetStoryByStat(stat)->fullText; +} + +static const u8 *GetStoryActionByStat(u32 stat) +{ + return GetStoryByStat(stat)->action; +} + +static u8 GetFreeStorySlot(void) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + + if (storyteller->gameStatIDs[i] == 0) + break; + } + return i; +} + +static u32 StorytellerGetRecordedTrainerStat(u32 trainer) +{ + u8 *ptr = gSaveBlock1.mauvilleMan.storyteller.statValues[trainer]; + + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); +} + +static void StorytellerSetRecordedTrainerStat(u32 trainer, u32 val) +{ + u8 *ptr = gSaveBlock1.mauvilleMan.storyteller.statValues[trainer]; + + ptr[0] = val; + ptr[1] = val >> 8; + ptr[2] = val >> 16; + ptr[3] = val >> 24; +} + +static bool32 HasTrainerStatIncreased(u32 trainer) +{ + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + + if (StorytellerGetGameStat(storyteller->gameStatIDs[trainer]) > StorytellerGetRecordedTrainerStat(trainer)) + return TRUE; + else + return FALSE; +} + +static void GetStoryByStattellerPlayerName(u32 player, void *dst) +{ + u8 *name = gSaveBlock1.mauvilleMan.storyteller.trainerNames[player]; + + memset(dst, EOS, 8); + memcpy(dst, name, 7); +} + +static void StorytellerSetPlayerName(u32 player, const u8 *src) +{ + u8 *name = gSaveBlock1.mauvilleMan.storyteller.trainerNames[player]; + u8 len = StringLength(src); + + memset(name, EOS, 7); + StringCopyN(name, src, len); +} + +static void StorytellerRecordNewStat(u32 player, u32 stat) +{ + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + + storyteller->gameStatIDs[player] = stat; + StorytellerSetPlayerName(player, gSaveBlock2.playerName); + StorytellerSetRecordedTrainerStat(player, StorytellerGetGameStat(stat)); + ConvertIntToDecimalStringN(gStringVar1, StorytellerGetGameStat(stat), 0, 10); + StringCopy(gStringVar2, GetStoryActionByStat(stat)); +} + +static void ScrambleStatList(u8 *arr, s32 count) +{ + s32 i; + + for (i = 0; i < count; i++) + arr[i] = i; + for (i = 0; i < count; i++) + { + u32 a = Random() % count; + u32 b = Random() % count; + u8 temp = arr[a]; + arr[a] = arr[b]; + arr[b] = temp; + } +} + +// What purpose does this struct even serve? Only the length field is used. +static const struct {u32 length; struct MauvilleManStoryteller *unused1; u32 unused2;} sStorytellerStuff = +{ + 36, + &gSaveBlock1.mauvilleMan.storyteller, // unused + 12, // unused +}; + +static bool8 StorytellerInitializeRandomStat(void) +{ + u8 arr[sStorytellerStuff.length]; + s32 i; + s32 j; + + ScrambleStatList(arr, 36); + for (i = 0; i < 36; i++) + { + u8 stat = sStorytellerStories[arr[i]].stat; + u8 minVal = sStorytellerStories[arr[i]].minVal; + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + + for (j = 0; j < 4; j++) + { + if (gSaveBlock1.mauvilleMan.storyteller.gameStatIDs[j] == stat) + break; + } + if (j == 4 && StorytellerGetGameStat(stat) >= minVal) + { + storyteller->alreadyRecorded = TRUE; + StorytellerRecordNewStat(GetFreeStorySlot(), stat); + return TRUE; + } + } + return FALSE; +} + +static void StorytellerDisplayStory(u32 player) +{ + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + u8 stat = storyteller->gameStatIDs[player]; + + ConvertIntToDecimalStringN(gStringVar1, StorytellerGetRecordedTrainerStat(player), 0, 10); + StringCopy(gStringVar2, GetStoryActionByStat(stat)); + GetStoryByStattellerPlayerName(player, gStringVar3); + ShowFieldMessage(GetStoryTextByStat(stat)); +} + +static void PrintStoryList(void) +{ + s32 i; + + Menu_DrawStdWindowFrame(0, 0, 25, 4 + GetFreeStorySlot() * 2); + for (i = 0; i < 4; i++) + { + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + u8 stat = storyteller->gameStatIDs[i]; + + if (stat == 0) + break; + Menu_PrintText(GetStoryTitleByStat(stat), 1, 2 + i * 2); + } + Menu_PrintText(gPCText_Cancel, 1, 2 + i * 2); +} + +static u8 gUnknown_03000748; + +static void Task_StoryListMenu(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s32 selection; + + switch (task->data[0]) + { + case 0: + PrintStoryList(); + InitMenu(0, 1, 2, GetFreeStorySlot() + 1, 0, 24); + task->data[0]++; + break; + case 1: + selection = Menu_ProcessInput(); + if (selection == -2) + break; + if (selection == -1 || selection == GetFreeStorySlot()) + { + gSpecialVar_Result = 0; + } + else + { + gSpecialVar_Result = 1; + gUnknown_03000748 = selection; + } + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 25, 12); + DestroyTask(taskId); + EnableBothScriptContexts(); + break; + } +} + +// Sets gSpecialVar_Result to TRUE if player selected a story +void ScrSpecial_StorytellerStoryListMenu(void) +{ + CreateTask(Task_StoryListMenu, 0x50); +} + +void ScrSpecial_StorytellerDisplayStory(void) +{ + StorytellerDisplayStory(gUnknown_03000748); +} + +u8 ScrSpecial_StorytellerGetFreeStorySlot(void) +{ + return GetFreeStorySlot(); +} + +// Returns TRUE if stat has increased +bool8 ScrSpecial_StorytellerUpdateStat(void) +{ + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + u8 r4 = storyteller->gameStatIDs[gUnknown_03000748]; + + if (HasTrainerStatIncreased(gUnknown_03000748) == TRUE) + { + StorytellerRecordNewStat(gUnknown_03000748, r4); + return TRUE; + } + return FALSE; +} + +bool8 ScrSpecial_HasStorytellerAlreadyRecorded(void) +{ + struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; + + if (storyteller->alreadyRecorded == FALSE) + return FALSE; + else + return TRUE; +} + +bool8 ScrSpecial_StorytellerInitializeRandomStat(void) +{ + return StorytellerInitializeRandomStat(); +} diff --git a/src/menu.c b/src/menu.c new file mode 100644 index 000000000..86e20d0eb --- /dev/null +++ b/src/menu.c @@ -0,0 +1,889 @@ +#include "global.h" +#include "menu.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu_cursor.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "strings.h" +#include "text.h" +#include "text_window.h" +#include "string_util.h" + +struct Menu +{ + u8 left; + u8 top; + s8 cursorPos; + s8 minCursorPos; + s8 maxCursorPos; + u8 width; + u8 height; + u8 menu_field_7; + u8 columnXCoords[8]; +}; + +static void MultistepInitMenuWindowInternal(const struct WindowTemplate *, u16); +static void InitMenuWindowInternal(const struct WindowTemplate *, u16); +static bool8 IsGridCursorMovementClamped(void); +static u8 sub_8072484(u8, u8, u8, u8, u8, u8, u32); +static u8 sub_80724F4(u8, u8, u8, const struct MenuAction[], u8); +static void sub_8072620(u8, u8, u8, const struct MenuAction[], u8); +static void sub_8072D18(u8, u8); +static void RedrawMenuCursor(u8, u8); + +static struct Menu gMenu; + +EWRAM_DATA struct Window gMenuWindow = {0}; +EWRAM_DATA u8 gFiller_202E908[0x90] = {0}; +EWRAM_DATA struct Window *gMenuWindowPtr = NULL; +EWRAM_DATA u8 gMenuMultistepInitState = 0; +EWRAM_DATA u16 gMenuTextTileOffset = 0; +EWRAM_DATA u16 gMenuTextWindowTileOffset = 0; +EWRAM_DATA u16 gMenuTextWindowContentTileOffset = 0; +EWRAM_DATA u16 gMenuMessageBoxContentTileOffset = 0; + +const struct MenuAction gMenuYesNoItems[] = +{ + { OtherText_Yes, NULL }, + { OtherText_No, NULL }, +}; + +void CloseMenu(void) +{ + PlaySE(SE_SELECT); + Menu_EraseScreen(); + sub_8064E2C(); + ScriptContext2_Disable(); + Menu_DestroyCursor(); +} + +void AppendToList(u8 *list, u8 *pindex, u32 value) +{ + list[*pindex] = value; + (*pindex)++; +} + +void InitMenuWindow(const struct WindowTemplate *winTemplate) +{ + InitMenuWindowInternal(winTemplate, 1); +} + +void MultistepInitMenuWindowBegin(const struct WindowTemplate *winTemplate) +{ + MultistepInitMenuWindowInternal(winTemplate, 1); +} + +static void MultistepInitMenuWindowInternal(const struct WindowTemplate *winTemplate, u16 tileOffset) +{ + gMenuMultistepInitState = 0; + gMenuTextTileOffset = tileOffset; + gMenuWindowPtr = &gMenuWindow; + Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); +} + +bool32 MultistepInitMenuWindowContinue(void) +{ + switch (gMenuMultistepInitState) + { + case 0: + gMenuMultistepInitState++; + return 0; + case 1: + gMenuTextWindowTileOffset = MultistepInitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); + goto next; + case 2: + if (!MultistepLoadFont()) + goto fail; + goto next; + case 3: + gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); + next: + gMenuMultistepInitState++; + return 0; + case 4: + TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); + gMenuMessageBoxContentTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); + return 1; + default: + fail: + return 0; + } +} + +static void InitMenuWindowInternal(const struct WindowTemplate *winTemplate, u16 tileOffset) +{ + gMenuWindowPtr = &gMenuWindow; + Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); + gMenuTextTileOffset = tileOffset; + gMenuTextWindowTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); + gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); + TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); + gMenuMessageBoxContentTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); +} + +void unref_sub_8071DA4(struct WindowTemplate *winTemplate, u16 tileOffset) +{ + gMenuWindowPtr = &gMenuWindow; + Text_InitWindowWithTemplate(&gMenuWindow, winTemplate); + gMenuTextWindowTileOffset = tileOffset; + gMenuTextWindowContentTileOffset = TextWindow_SetBaseTileNum(gMenuTextWindowTileOffset); + TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); + gMenuTextTileOffset = TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); + gMenuMessageBoxContentTileOffset = InitWindowTileData(gMenuWindowPtr, gMenuTextTileOffset); +} + +void Menu_LoadStdFrameGraphicsOverrideStyle(u8 frameType) +{ + TextWindow_LoadStdFrameGraphicsOverrideStyle(gMenuWindowPtr, frameType); +} + +void Menu_LoadStdFrameGraphics(void) +{ + TextWindow_LoadStdFrameGraphics(gMenuWindowPtr); +} + +void BasicInitMenuWindow(const struct WindowTemplate *winTemplate) +{ + Text_InitWindowWithTemplate(gMenuWindowPtr, winTemplate); + gMenuWindowPtr->tileDataStartOffset = gMenuTextTileOffset; +} + +// Prints +void Menu_PrintText(const u8 *str, u8 left, u8 top) +{ + Text_InitWindowAndPrintText(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); +} + +void Menu_EraseWindowRect(u8 left, u8 top, u8 right, u8 bottom) +{ + Text_EraseWindowRect(gMenuWindowPtr, left, top, right, bottom); +} + +void Menu_BlankWindowRect(u8 left, u8 top, u8 right, u8 bottom) +{ + Text_BlankWindowRect(gMenuWindowPtr, left, top, right, bottom); +} + +void Menu_EraseScreen(void) +{ + Menu_EraseWindowRect(0, 0, 29, 19); +} + +void Menu_DrawStdWindowFrame(u8 left, u8 top, u8 right, u8 bottom) +{ + TextWindow_DrawStdFrame(gMenuWindowPtr, left, top, right, bottom); +} + +void sub_8071F40(const u8 *str) +{ + Menu_DrawStdWindowFrame(2, 14, 28, 19); + Menu_PrintText(str, 3, 15); +} + +void sub_8071F60(u8 a1, u8 a2, u8 a3) +{ + sub_8003490(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3); +} + +u16 unref_sub_8071F98(u8 x, u8 y) +{ + return Text_GetWindowTilemapEntry(gMenuWindowPtr, x, y); +} + +void unref_sub_8071FBC(u16 a1, u8 a2, u8 a3, u8 a4, u8 a5) +{ + Text_FillWindowBorder(gMenuWindowPtr, a1, a2, a3, a4, a5); +} + +void Menu_DisplayDialogueFrame(void) +{ + TextWindow_DisplayDialogueFrame(gMenuWindowPtr); +} + +void MenuPrintMessage(const u8 *str, u8 left, u8 top) +{ + Text_InitWindow8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); +} + +void MenuPrintMessageDefaultCoords(const u8 *str) +{ + Text_InitWindow8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, 2, 15); +} + +void Menu_SetText(const u8 *str) +{ + Text_SetWindowText(gMenuWindowPtr, str); +} + +u8 Menu_UpdateWindowText(void) +{ + return Text_UpdateWindow(gMenuWindowPtr); +} + +u8 unref_sub_8072098(void) +{ + return Text_PrintWindowSimple(gMenuWindowPtr); +} + +void Menu_ClearWindowText(void) +{ + Text_ClearWindow(gMenuWindowPtr); +} + +u8 Menu_MoveCursor(s8 delta) +{ + s32 newPos = gMenu.cursorPos + delta; + + if (newPos < gMenu.minCursorPos) + gMenu.cursorPos = gMenu.maxCursorPos; + else if (newPos > gMenu.maxCursorPos) + gMenu.cursorPos = gMenu.minCursorPos; + else + gMenu.cursorPos += delta; + + RedrawMenuCursor(gMenu.left, 2 * gMenu.cursorPos + gMenu.top); + return gMenu.cursorPos; +} + +u8 Menu_MoveCursorNoWrap(s8 delta) +{ + s32 newPos = gMenu.cursorPos + delta; + + if (newPos < gMenu.minCursorPos) + gMenu.cursorPos = gMenu.minCursorPos; + else if (newPos > gMenu.maxCursorPos) + gMenu.cursorPos = gMenu.maxCursorPos; + else + gMenu.cursorPos += delta; + + RedrawMenuCursor(gMenu.left, 2 * gMenu.cursorPos + gMenu.top); + return gMenu.cursorPos; +} + +u8 Menu_GetCursorPos(void) +{ + return gMenu.cursorPos; +} + +s8 Menu_ProcessInput(void) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gMenu.menu_field_7) + Menu_DestroyCursor(); + return gMenu.cursorPos; + } + + if (gMain.newKeys & B_BUTTON) + { + if (gMenu.menu_field_7) + Menu_DestroyCursor(); + return -1; + } + + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + return -2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + return -2; + } + + return -2; +} + +s8 Menu_ProcessInputNoWrap(void) +{ + u8 cursorPos = gMenu.cursorPos; + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gMenu.menu_field_7) + Menu_DestroyCursor(); + return gMenu.cursorPos; + } + + if (gMain.newKeys & B_BUTTON) + { + if (gMenu.menu_field_7) + Menu_DestroyCursor(); + return -1; + } + + if (gMain.newKeys & DPAD_UP) + { + if (cursorPos != Menu_MoveCursorNoWrap(-1)) + PlaySE(SE_SELECT); + return -2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (cursorPos != Menu_MoveCursorNoWrap(1)) + PlaySE(SE_SELECT); + return -2; + } + + Menu_MoveCursorNoWrap(0); + return -2; +} + +u8 MoveMenuCursor3(s8 delta) +{ + u8 menuHeight = (gMenu.maxCursorPos + 1) >> 1; + s32 newPos = gMenu.cursorPos + delta; + + if (newPos < gMenu.minCursorPos) + gMenu.cursorPos = gMenu.maxCursorPos; + else if (newPos > gMenu.maxCursorPos) + gMenu.cursorPos = gMenu.minCursorPos; + else + gMenu.cursorPos += delta; + + RedrawMenuCursor( + 6 * (gMenu.cursorPos / menuHeight) + gMenu.left, + 2 * (gMenu.cursorPos % menuHeight) + gMenu.top); + + return gMenu.cursorPos; +} + +static u8 MoveMenuCursorGridLayout(s8 delta) +{ + // Don't move cursor if it is clamped + if (gMenu.cursorPos + delta <= gMenu.maxCursorPos) + { + if (IsGridCursorMovementClamped() == TRUE) + return gMenu.cursorPos; + } + else + { + return gMenu.cursorPos; + } + + gMenu.cursorPos += delta; + + if ((gMenu.maxCursorPos + 1) / gMenu.width == 0) + RedrawMenuCursor( + gMenu.left + gMenu.columnXCoords[gMenu.cursorPos % gMenu.width], + 2 * ((gMenu.cursorPos / gMenu.width) % gMenu.height) + gMenu.top); + else + RedrawMenuCursor( + gMenu.left + gMenu.columnXCoords[gMenu.cursorPos % gMenu.width], + 2 * (gMenu.cursorPos / gMenu.width) + gMenu.top); + + return gMenu.cursorPos; +} + +// Returns TRUE if the cursor is on an edge and cannot move in the pressed direction +static bool8 IsGridCursorMovementClamped(void) +{ + if (gMain.newKeys & DPAD_UP) + { + // is cursor on first row? + if (gMenu.cursorPos < gMenu.width) + return TRUE; + } + if (gMain.newKeys & DPAD_DOWN) + { + // is cursor on last row? + if (gMenu.cursorPos >= gMenu.maxCursorPos + 1 - gMenu.width) + return TRUE; + } + if (gMain.newKeys & DPAD_LEFT) + { + // is cursor on first column? + if ((gMenu.cursorPos - gMenu.cursorPos % gMenu.width) % gMenu.width == 1 // always false + || gMenu.cursorPos == 0 // redundant + || gMenu.cursorPos % gMenu.width == 0) + return TRUE; + } + if (gMain.newKeys & DPAD_RIGHT) + { + // is cursor on last column? + if (gMenu.cursorPos % gMenu.width == gMenu.width - 1) + return TRUE; + } + + return FALSE; +} + +static u8 sub_8072484(u8 a1, u8 a2, u8 menuItemCount, u8 a4, u8 width, u8 a6, u32 a7) +{ + u8 v7; + + gMenu.width = width; + gMenu.height = menuItemCount / width; + InitMenu(0, a1, a2, menuItemCount, a4, a6); + v7 = 0; + if (a7) + v7 = -1; + gMenu.menu_field_7 = v7; + return a4; +} + +static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) +{ + u8 i; + u8 maxWidth; + s32 height; + + for (i = 0; i < 7; i++) + gMenu.columnXCoords[i] = 0; + + maxWidth = 0; + for (i = 0; i < menuItemCount; i++) + { + u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; + + if (width > maxWidth) + maxWidth = width; + } + + for (i = 1; i <= columnCount; i++) + gMenu.columnXCoords[i] = maxWidth; + + for (i = 1; i <= columnCount; i++) + gMenu.columnXCoords[i] += 1 + gMenu.columnXCoords[i - 1]; + + gMenu.columnXCoords[columnCount]--; + + if (!((menuItemCount / 2) < columnCount || (menuItemCount % 2 != 0)) + || columnCount == 1 + || columnCount == menuItemCount) + { + height = 2 * (menuItemCount / columnCount) + 1; + } + else + { + height = 2 * ((menuItemCount / columnCount) + 1) + 1; + } + + { + // TODO: Make this code less hideous but still match the original asm. + u8 right; + u8 bottom; + u32 totalWidth; + register s32 val asm("r1"); + + val = (s8)top + height; + val = val << 24; + asm("" ::: "r3"); + bottom = val >> 24; + + totalWidth = (gMenu.columnXCoords[columnCount] + 1); + right = left + totalWidth; + + Menu_DrawStdWindowFrame(left, top, right, bottom); + } + + return maxWidth; +} + +static void sub_8072620(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) +{ + u8 i; + u8 maxWidth; + + for (i = 0; i < 7; i++) + gMenu.columnXCoords[i] = 0; + + maxWidth = 0; + for (i = 0; i < menuItemCount; i++) + { + u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; + + if (width > maxWidth) + maxWidth = width; + } + + for (i = 1; i <= columnCount; i++) + gMenu.columnXCoords[i] = maxWidth; + + for (i = 1; i <= columnCount; i++) + gMenu.columnXCoords[i] += 1 + gMenu.columnXCoords[i - 1]; + + gMenu.columnXCoords[columnCount]--; + + for (i = 0; i < columnCount; i++) + { + u8 row = 0; + u8 j; + for (j = 0; i + j < menuItemCount; j += columnCount, row++) + Menu_PrintText(menuItems[i + j].text, left + gMenu.columnXCoords[i % columnCount], top + 2 * row); + } +} + +void sub_807274C(u8 left, u8 top, u8 menuItemCount, u8 a4, const struct MenuAction menuItems[], u8 columnCount, u32 a7) +{ + u8 maxWidth = sub_80724F4(left, top, menuItemCount, menuItems, columnCount); + + sub_8072484(left + 1, top + 1, menuItemCount, a4, columnCount, maxWidth, a7); + sub_8072620(left + 1, top + 1, menuItemCount, menuItems, columnCount); +} + +s8 Menu_ProcessInputGridLayout(void) +{ + if (gMain.newKeys & A_BUTTON) + { + if (gMenu.menu_field_7) + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + return Menu_GetCursorPos(); + } + + if (gMain.newKeys & B_BUTTON) + { + if (gMenu.menu_field_7) + Menu_DestroyCursor(); + return -1; + } + + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + // Move up one whole row + MoveMenuCursorGridLayout(-gMenu.width); + return -2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + // Move down one whole column + MoveMenuCursorGridLayout(gMenu.width); + return -2; + } + else if (gMain.newKeys & DPAD_LEFT) + { + PlaySE(SE_SELECT); + MoveMenuCursorGridLayout(-1); + return -2; + } + else if (gMain.newKeys & DPAD_RIGHT) + { + PlaySE(SE_SELECT); + MoveMenuCursorGridLayout(1); + return -2; + } + + return -2; +} + +u8 Menu_GetColumnXCoord(u8 column) +{ + return gMenu.columnXCoords[column]; +} + +void Menu_PrintItems(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[]) +{ + u8 i; + + for (i = 0; i < menuItemCount; i++) + Menu_PrintText(menuItems[i].text, left, top + 2 * i); +} + +void Menu_PrintItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction2 menuItems[], const u8 *order) +{ + u8 i; + + for (i = 0; i < menuItemCount; i++) + Menu_PrintText(menuItems[order[i]].text, left, top + 2 * i); +} + +void InitYesNoMenu(u8 left, u8 top, u8 a3) +{ + Menu_PrintItems(left + 1, top + 1, 2, gMenuYesNoItems); + InitMenu(0, left + 1, top + 1, 2, 0, a3); +} + +void DisplayYesNoMenu(u8 left, u8 top, u32 a3) +{ + Menu_DrawStdWindowFrame(left, top, left + 6, top + 5); + InitYesNoMenu(left, top, 5); + gMenu.menu_field_7 = a3 ? -1 : 0; +} + +s8 Menu_ProcessInputNoWrap_(void) +{ + return Menu_ProcessInputNoWrap(); +} + +u8 Menu_PrintTextPixelCoords(const u8 *text, u8 left, u16 top, u8 a4) +{ + return Text_InitWindow8004D04(gMenuWindowPtr, text, gMenuTextTileOffset, left, top, a4); +} + +u8 sub_8072A18(const u8 *text, u8 left, u16 top, u8 width, u32 a5) +{ + return sub_8004FD0(gMenuWindowPtr, 0, text, gMenuTextTileOffset, left, top, width, a5); +} + +u8 unref_sub_8072A5C(u8 *dest, u8 *src, u8 left, u16 top, u8 width, u32 a6) +{ + return sub_8004FD0(gMenuWindowPtr, dest, src, gMenuTextTileOffset, left, top, width, a6); +} + +#if ENGLISH +int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) +{ + u8 newlineCount = sub_8004FD0(gMenuWindowPtr, NULL, str, gMenuTextTileOffset, left, top, width, a6); + + left /= 8; + top /= 8; + width = (width + 7) / 8; + height = (height + 7) / 8; + + if (newlineCount < height) + Menu_BlankWindowRect(left, top + 2 * newlineCount, left + width - 1, height + top - 1); +} +#elif GERMAN +__attribute__((naked)) +int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x10\n\ + mov r12, r0\n\ + ldr r0, [sp, 0x24]\n\ + ldr r4, [sp, 0x28]\n\ + str r4, [sp, 0xC]\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + lsls r2, 16\n\ + lsrs r4, r2, 16\n\ + lsls r3, 24\n\ + lsrs r6, r3, 24\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r0, _08072AF8 @ =gMenuWindowPtr\n\ + ldr r0, [r0]\n\ + ldr r1, _08072AFC @ =gMenuTextTileOffset\n\ + ldrh r3, [r1]\n\ + str r5, [sp]\n\ + str r4, [sp, 0x4]\n\ + str r6, [sp, 0x8]\n\ + movs r1, 0\n\ + mov r2, r12\n\ + bl sub_8004FD0\n\ + adds r1, r0, 0\n\ + lsls r1, 24\n\ + lsrs r2, r1, 24\n\ + movs r3, 0x7\n\ + ands r3, r5\n\ + cmp r3, 0\n\ + bne _08072B00\n\ + adds r1, r6, 0x7\n\ + asrs r1, 3\n\ + subs r1, 0x1\n\ + b _08072B0C\n\ + .align 2, 0\n\ +_08072AF8: .4byte gMenuWindowPtr\n\ +_08072AFC: .4byte gMenuTextTileOffset\n\ +_08072B00:\n\ + adds r3, r6, r3\n\ + subs r1, r3, 0x1\n\ + cmp r1, 0\n\ + bge _08072B0A\n\ + adds r1, r3, 0x6\n\ +_08072B0A:\n\ + asrs r1, 3\n\ +_08072B0C:\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r6, r1, 0\n\ + lsrs r5, 3\n\ + adds r1, r7, 0x7\n\ + asrs r1, 3\n\ + lsls r1, 24\n\ + lsrs r7, r1, 24\n\ + lsrs r4, 3\n\ + cmp r2, r7\n\ + bcs _08072B3E\n\ + lsls r1, r2, 1\n\ + adds r1, r4, r1\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r2, r5, r6\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r3, r7, r4\n\ + subs r3, 0x1\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + adds r0, r5, 0\n\ + bl Menu_BlankWindowRect\n\ +_08072B3E:\n\ + add sp, 0x10\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif + +void MenuPrint_RightAligned(const u8 *str, u8 left, u8 top) +{ + Text_InitWindow8004D38(gMenuWindowPtr, str, gMenuTextTileOffset, left, top); +} + +void sub_8072B80(const u8 *a1, u8 a2, u8 a3, const u8 *a4) +{ + u8 buffer[64]; + u8 width = GetStringWidth(gMenuWindowPtr, a4); + AlignString(gMenuWindowPtr, buffer, a1, width, 1); + Text_InitWindowAndPrintText(gMenuWindowPtr, buffer, gMenuTextTileOffset, a2, a3); +} + +void sub_8072BD8(const u8 *a1, u8 a2, u8 a3, u16 a4) +{ + Text_InitWindow8004DB0(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3, a4); +} + +u8 *sub_8072C14(u8 *a1, s32 a2, u8 a3, u8 a4) +{ + return AlignInt1(gMenuWindowPtr, a1, a2, a3, a4); +} + +u8 *sub_8072C44(u8 *a1, s32 a2, u8 a3, u8 a4) +{ + return AlignInt2(gMenuWindowPtr, a1, a2, a3, a4); +} + +u8 *sub_8072C74(u8 *a1, const u8 *a2, u8 a3, u8 a4) +{ + return AlignString(gMenuWindowPtr, a1, a2, a3, a4); +} + +u8 sub_8072CA4(const u8 *str) +{ + return GetStringWidth(gMenuWindowPtr, str); +} + +u8 Menu_GetTextWindowPaletteNum(void) +{ + return Text_GetWindowPaletteNum(gMenuWindowPtr); +} + +void Menu_GetTextColors(u8 *a1, u8 *a2, u8 *a3) +{ + Text_GetTextColors(gMenuWindowPtr, a1, a2, a3); +} + +u32 Menu_UpdateWindowTextOverrideLineLength(u8 lineLength) +{ + return Text_UpdateWindowOverrideLineLength(gMenuWindowPtr, lineLength); +} + +struct Window *unref_sub_8072D0C(void) +{ + return gMenuWindowPtr; +} + +static void sub_8072D18(u8 a1, u8 a2) +{ + MenuCursor_Create814A5C0(a1, 0xFFFF, 12, 11679, 8 * a2); +} + +u8 InitMenu(u8 cursorSubpriority, u8 left, u8 top, u8 numChoices, u8 cursorPos, u8 cursorWidth) +{ + s32 pos; + + if (cursorWidth) + sub_8072D18(cursorSubpriority, cursorWidth); + + gMenu.left = left - 1; + gMenu.top = top; + gMenu.minCursorPos = 0; + gMenu.maxCursorPos = numChoices - 1; + gMenu.menu_field_7 = 0; + + pos = cursorPos; + + if (pos < 0 || pos > gMenu.maxCursorPos) + pos = 0; + + gMenu.cursorPos = pos; + Menu_MoveCursor(0); + + return pos; +} + +static void RedrawMenuCursor(u8 x, u8 y) +{ + MenuCursor_SetPos814A880((x + 1) * 8, 8 * y); +} + +void unref_sub_8072DC0() +{ + sub_814A904(); +} + +void sub_8072DCC(u8 a1) +{ + sub_814A958(a1); +} + +void sub_8072DDC(u8 a1) +{ + sub_8072DCC(8 * a1); +} + +void Menu_DestroyCursor(void) +{ + DestroyMenuCursor(); +} + +#if GERMAN +void de_sub_8073110(u8 * buffer, u8 * name) { + u8 * ptr, *ptr2, *ptr3; + + ptr2 = buffer; + ptr = &gStringVar1[1 + StringLengthN(gStringVar1, 256)]; + ptr3 = ptr; + + for (;;) + { + if (*ptr2 == EOS) + break; + + if (*ptr2 == 0xFD) + { + + *ptr3 = EOS; + ptr2 += 2; + + StringAppend(ptr, name); + StringAppend(ptr, ptr2); + + buffer[0] = EOS; + StringAppend(buffer, ptr); + break; + } + + *ptr3 = *ptr2; + ptr2 += 1; + ptr3 += 1; + } +} + +u8 *de_sub_8073174(u8 *name, const u8 *format) { + u32 offset; + u8 *ptr; + + offset = StringLengthN(gStringVar2, 0x100); + ptr = &gStringVar2[1 + offset]; + + StringCopy(ptr, format); + + de_sub_8073110(ptr, name); + + return StringCopy(name, ptr); +} +#endif diff --git a/src/menu_cursor.c b/src/menu_cursor.c new file mode 100644 index 000000000..f2eb31f16 --- /dev/null +++ b/src/menu_cursor.c @@ -0,0 +1,781 @@ +#include "global.h" +#include "menu_cursor.h" +#include "palette.h" +#include "sprite.h" + +EWRAM_DATA static u16 gUnknown_0203A360[0x10] = {}; +EWRAM_DATA static struct Subsprite gMenuCursorSubsprites[10] = {0}; +EWRAM_DATA static u8 gUnknown_0203A3D0 = 0; +EWRAM_DATA static u8 gUnknown_0203A3D1 = 0; +EWRAM_DATA static u8 gUnknown_0203A3D2 = 0; +EWRAM_DATA static u8 gUnknown_0203A3D3 = 0; +EWRAM_DATA static u8 gUnknown_0203A3D4 = 0; + +#if ENGLISH +#include "data/menu_cursor_en.h" +#elif GERMAN +#include "data/menu_cursor_de.h" +#endif // ENGLISH/GERMAN + +void sub_814A590(void) +{ + gUnknown_0203A3D0 = 0x40; + gUnknown_0203A3D1 = 0x40; + gUnknown_0203A3D2 = 0x40; + gUnknown_0203A3D3 = 0; + gUnknown_0203A3D4 = 0; +} + +u8 MenuCursor_Create814A5C0(u8 subpriority, u16 paletteTag, u8 a3, u16 a4, u8 a5) +{ + int v9; + struct Sprite *v10; + + if (gUnknown_0203A3D0 != 0x40 || gUnknown_0203A3D1 != 0x40) + DestroyMenuCursor(); + + v9 = 1; + if (paletteTag == 0xFFFF) + { + gUnknown_0203A360[a3 & 0xF] = a4; + if (LoadSpritePalette(&gUnknown_0842F240) != 0xFF) + { + paletteTag = 0xFFF0; + v9 = 0; + } + } + + LoadSpriteSheetDeferred(&gUnknown_0842F140[a3 & 0xF]); + gUnknown_0203A3D0 = CreateSprite(&gSpriteTemplate_842F250[v9], 0, 160, subpriority); + gUnknown_0203A3D1 = CreateSprite(&gSpriteTemplate_842F250[2], 0, 160, subpriority); + if (gUnknown_0203A3D0 != 0x40) + { + v10 = &gSprites[gUnknown_0203A3D0]; + if (paletteTag == 0xFFFF) + v10->oam.paletteNum = 0; + else + v10->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); + } + if (gUnknown_0203A3D1 != 0x40) + { + v10 = &gSprites[gUnknown_0203A3D1]; + if (paletteTag == 0xFFFF) + v10->oam.paletteNum = 0; + else + v10->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); + + if (!(REG_DISPCNT & (DISPCNT_WIN0_ON | DISPCNT_WIN1_ON))) + *(u8 *)(REG_ADDR_WINOUT) |= 0x1F; + gUnknown_0203A3D3 = REG_DISPCNT >> 0xF; + gUnknown_0203A3D4 = *(u8 *)(REG_BASE + REG_OFFSET_WINOUT + 1); + REG_DISPCNT |= DISPCNT_OBJWIN_ON; + *(u8 *)(REG_ADDR_WINOUT + 1) = 0x10; + } + sub_814A958(a5); + return gUnknown_0203A3D0; +} + +// unused +u8 sub_814A758(u8 subpriority, u8 a2, u8 a3, u8 a4) +{ + u8 result; + struct Sprite *spr; + + result = MenuCursor_Create814A5C0(subpriority, 0, a3, 0, a4); + if (result != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + spr->oam.paletteNum = a2; + } + return result; +} + +u8 unref_sub_814A7AC(u8 a1, u16 a2, u8 a3) +{ + u16 i; + u8 val1 = 0; + u16 val2 = 0xF; + + for (i = 0; i <= 0xFF; i++) + { + if (gPlttBufferUnfaded[i] == a2) + { + val1 = (u8)(i >> 4); + val2 = i & 0xF; + } + } + + return sub_814A758(a1, val1, val2, a3); +} + +void DestroyMenuCursor(void) +{ + if (gUnknown_0203A3D0 != 0x40) + { + LoadTilesForSpriteSheet(&gUnknown_0842F140[0]); + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D0]); + gUnknown_0203A3D0 = 0x40; + } + + if (gUnknown_0203A3D1 != 0x40) + { + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D1]); + gUnknown_0203A3D1 = 0x40; + if (!gUnknown_0203A3D3) + REG_DISPCNT &= ~DISPCNT_OBJWIN_ON; + *(u8 *)(REG_BASE + REG_OFFSET_WINOUT + 1) = gUnknown_0203A3D4; + } + + return; +} + +void MenuCursor_SetPos814A880(u8 a1, u8 a2) +{ + struct Sprite *spr; + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + spr->invisible = 0; + spr->centerToCornerVecX = 0; + spr->centerToCornerVecY = 0; + spr->pos1.x = a1; + spr->pos1.y = a2; + } + + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + spr->invisible = 0; + spr->centerToCornerVecX = 0; + spr->centerToCornerVecY = 0; + spr->pos1.x = a1; + spr->pos1.y = a2; + } + + return; +} + +void sub_814A904(void) +{ + struct Sprite *spr; + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + spr->invisible = 1; + } + + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + spr->invisible = 1; + } + + return; +} + +#if ENGLISH +#ifdef NONMATCHING +// Fix pls +void sub_814A958(u8 a) +{ + u8 r7; + struct Subsprite *r4 = &gMenuCursorSubsprites[0]; + s16 r2 = -1; + s32 _a = a; + s16 r5; + s16 i; + + *r4 = (struct Subsprite){.x = 0, .y = 0, .shape = 2, .size = 0, .tileOffset = 0, .priority = 0}; + r4->x = r2; + r4++; + r7 = 1; + r2 = 1; + r5 = a; + i = r5; + while ((i -= r2) >= 8) + { + if (i > 0x1F) + { + *r4 = gUnknown_0842F780; + r4->x = r2; + r2 += 32; + r5 = a; + } + //_0814A9D4 + else + { + r5 = a; + if (_a > 0x27 && i > 8) + { + *r4 = gUnknown_0842F780; + r4->x = (r2 - 32) + (i & ~7); + r2 += i & 0x18; + } + //_0814AA0A + else + { + *r4 = gUnknown_0842F788; + r4->x = r2; + r2 += 8; + } + } + //_0814AA20 + r4++; + r7++; + i = r5; + } + //_0814AA3A + *r4 = gUnknown_0842F790; + r4->x = r2 - 7 + i; + r7++; + if (gUnknown_0203A3D0 != 64) + SetSubspriteTables(&gSprites[gUnknown_0203A3D0], gSubspriteTables_842F5C0 + r7); + if (gUnknown_0203A3D1 != 64) + SetSubspriteTables(&gSprites[gUnknown_0203A3D1], gSubspriteTables_842F5C0 + r7); +} +#else +__attribute__((naked)) +void sub_814A958(u8 a1) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + ldr r4, _0814A9C4\n\ + ldr r2, _0814A9C8\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r1, 0x2\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + adds r4, 0x8\n\ + movs r7, 0x1\n\ + movs r2, 0x1\n\ + ldr r1, [sp]\n\ + subs r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x7\n\ + ble _0814AA3A\n\ + ldr r0, _0814A9CC\n\ + mov r12, r0\n\ + mov r8, r1\n\ + movs r1, 0x8\n\ + negs r1, r1\n\ + mov r10, r1\n\ + ldr r5, _0814A9D0\n\ + mov r9, r5\n\ +_0814A99E:\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + cmp r3, 0x1F\n\ + ble _0814A9D4\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r1, 0x80\n\ + lsls r1, 14\n\ + adds r0, r1\n\ + lsrs r2, r0, 16\n\ + ldr r3, [sp]\n\ + lsls r5, r3, 16\n\ + b _0814AA20\n\ + .align 2, 0\n\ +_0814A9C4: .4byte gMenuCursorSubsprites\n\ +_0814A9C8: .4byte 0x0000ffff\n\ +_0814A9CC: .4byte gUnknown_0842F780\n\ +_0814A9D0: .4byte gUnknown_0842F788\n\ +_0814A9D4:\n\ + ldr r6, [sp]\n\ + lsls r5, r6, 16\n\ + mov r0, r8\n\ + cmp r0, 0x27\n\ + ble _0814AA0A\n\ + cmp r3, 0x8\n\ + ble _0814AA0A\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + adds r2, r1, 0\n\ + subs r2, 0x20\n\ + adds r0, r3, 0\n\ + mov r6, r10\n\ + ands r0, r6\n\ + adds r2, r0\n\ + strh r2, [r4]\n\ + movs r0, 0x18\n\ + ands r0, r3\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r2, r1, 16\n\ + b _0814AA20\n\ +_0814AA0A:\n\ + mov r3, r9\n\ + ldr r0, [r3]\n\ + ldr r1, [r3, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r6, 0x80\n\ + lsls r6, 12\n\ + adds r0, r6\n\ + lsrs r2, r0, 16\n\ +_0814AA20:\n\ + adds r4, 0x8\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + asrs r1, r5, 16\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + subs r1, r0\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x7\n\ + bgt _0814A99E\n\ +_0814AA3A:\n\ + ldr r5, _0814AAA8\n\ + ldr r0, [r5]\n\ + ldr r1, [r5, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + subs r1, 0x7\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + adds r0, r1\n\ + strh r0, [r4]\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r6, _0814AAAC\n\ + ldrb r0, [r6]\n\ + cmp r0, 0x40\n\ + beq _0814AA78\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB0\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB4\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA78:\n\ + ldr r1, _0814AAB8\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x40\n\ + beq _0814AA98\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB0\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB4\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA98:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0814AAA8: .4byte gUnknown_0842F790\n\ +_0814AAAC: .4byte gUnknown_0203A3D0\n\ +_0814AAB0: .4byte gSprites\n\ +_0814AAB4: .4byte gSubspriteTables_842F5C0\n\ +_0814AAB8: .4byte gUnknown_0203A3D1\n\ + .syntax divided\n"); +} +#endif +#elif GERMAN +__attribute__((naked)) +void sub_814A958(u8 a1) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + ldr r4, _0814A9C4 @ =gMenuCursorSubsprites\n\ + ldr r2, _0814A9C8 @ =0x0000ffff\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + ldr r0, _0814A9CC @ =gUnknown_0842F780\n\ + ldr r1, [r0, 0x4]\n\ + ldr r0, [r0]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + adds r4, 0x8\n\ + movs r7, 0x1\n\ + movs r2, 0x1\n\ + ldr r1, [sp]\n\ + subs r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x7\n\ + ble _0814AA3E\n\ + ldr r0, _0814A9D0 @ =gUnknown_0842F788\n\ + mov r12, r0\n\ + mov r8, r1\n\ + movs r1, 0x8\n\ + negs r1, r1\n\ + mov r10, r1\n\ + ldr r5, _0814A9D4 @ =gUnknown_0842F790\n\ + mov r9, r5\n\ +_0814A99E:\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + cmp r3, 0x1F\n\ + ble _0814A9D8\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r1, 0x80\n\ + lsls r1, 14\n\ + adds r0, r1\n\ + lsrs r2, r0, 16\n\ + ldr r3, [sp]\n\ + lsls r5, r3, 16\n\ + b _0814AA24\n\ + .align 2, 0\n\ +_0814A9C4: .4byte gMenuCursorSubsprites\n\ +_0814A9C8: .4byte 0x0000ffff\n\ +_0814A9CC: .4byte gUnknown_0842F780\n\ +_0814A9D0: .4byte gUnknown_0842F788\n\ +_0814A9D4: .4byte gUnknown_0842F790\n\ +_0814A9D8:\n\ + ldr r6, [sp]\n\ + lsls r5, r6, 16\n\ + mov r0, r8\n\ + cmp r0, 0x27\n\ + ble _0814AA0E\n\ + cmp r3, 0x8\n\ + ble _0814AA0E\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + adds r2, r1, 0\n\ + subs r2, 0x20\n\ + adds r0, r3, 0\n\ + mov r6, r10\n\ + ands r0, r6\n\ + adds r2, r0\n\ + strh r2, [r4]\n\ + movs r0, 0x18\n\ + ands r0, r3\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r2, r1, 16\n\ + b _0814AA24\n\ +_0814AA0E:\n\ + mov r3, r9\n\ + ldr r0, [r3]\n\ + ldr r1, [r3, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r6, 0x80\n\ + lsls r6, 12\n\ + adds r0, r6\n\ + lsrs r2, r0, 16\n\ +_0814AA24:\n\ + adds r4, 0x8\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + asrs r1, r5, 16\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + subs r1, r0\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x7\n\ + bgt _0814A99E\n\ +_0814AA3E:\n\ + ldr r5, _0814AAAC @ =gUnknown_0842F798\n\ + ldr r0, [r5]\n\ + ldr r1, [r5, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + subs r1, 0x7\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + adds r0, r1\n\ + strh r0, [r4]\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r6, _0814AAB0 @ =gUnknown_0203A3D0\n\ + ldrb r0, [r6]\n\ + cmp r0, 0x40\n\ + beq _0814AA7C\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB4 @ =gSprites\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA7C:\n\ + ldr r1, _0814AABC @ =gUnknown_0203A3D1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x40\n\ + beq _0814AA9C\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB4 @ =gSprites\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA9C:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0814AAAC: .4byte gUnknown_0842F798\n\ +_0814AAB0: .4byte gUnknown_0203A3D0\n\ +_0814AAB4: .4byte gSprites\n\ +_0814AAB8: .4byte gSubspriteTables_842F5C0\n\ +_0814AABC: .4byte gUnknown_0203A3D1\n\ + .syntax divided\n"); +} +#endif + +void sub_814AABC(void (*callback)(struct Sprite *)) +{ + struct Sprite *spr; + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + spr->callback = callback; + } + + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + spr->callback = callback; + } + + return; +} + +void sub_814AAF8(u16 a1) +{ + struct Sprite *spr; + u8 v2; + u8 v3; + u16 v4; + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + if (spr->template->paletteTag == 0xFFFF) + { + for (v2 = 0, v3 = 0xF, v4 = 0; v4 <= 0xFF; v4++) + { + if (gPlttBufferUnfaded[v4] == a1) + { + v2 = v4 >> 4; + v3 = v4 & 0xF; + } + } + spr->oam.paletteNum = v2; + RequestSpriteSheetCopy(&gUnknown_0842F140[v3 & 0xF]); + } + } + return; +} + +void sub_814AB84(void) +{ + struct Sprite *spr; + + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + FreeSpriteOamMatrix(spr); + DestroySprite(spr); + gUnknown_0203A3D1 = 0x40; + + if (!gUnknown_0203A3D3) + REG_DISPCNT &= ~DISPCNT_OBJWIN_ON; + *(u8 *)(REG_ADDR_WINOUT + 1) = gUnknown_0203A3D4; + } + return; +} + +void unref_sub_814ABE4(int a1) +{ + struct Sprite *spr; + + CpuCopy16(gUnknown_0842F5BC[a1], &gMenuCursorSubsprites, 80); + + if (gUnknown_0203A3D0 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D0]; + SetSubspriteTables(spr, &gUnknown_0842F758[a1]); + } + if (gUnknown_0203A3D1 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D1]; + SetSubspriteTables(spr, &gUnknown_0842F758[a1]); + } + return; +} + +u8 CreateBlendedOutlineCursor(u8 subpriority, u16 paletteTag, u8 a3, u16 a4, u8 a5) +{ + int v8; + struct Sprite *spr; + + if (gUnknown_0203A3D2 != 0x40) + MenuCursor_Destroy814AD44(); + + v8 = 1; + + if (paletteTag == 0xFFFF) + { + gUnknown_0203A360[a3 & 0xF] = a4; + if (LoadSpritePalette(&gUnknown_0842F248) != 0xFF ) + { + paletteTag = 0xFFF1; + v8 = 0; + } + } + + LoadSpriteSheetDeferred(&gUnknown_0842F1C0[a3 & 0xF]); +#if ENGLISH + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 160, subpriority); +#elif GERMAN + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 161, subpriority); +#endif + + if (gUnknown_0203A3D2 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D2]; + + if (paletteTag == 0xFFFF) + spr->oam.paletteNum = 0; + else + spr->oam.paletteNum = IndexOfSpritePaletteTag(paletteTag); + } + sub_814ADF4(a5); + + return gUnknown_0203A3D2; +} + +void MenuCursor_Destroy814AD44(void) +{ + if (gUnknown_0203A3D2 != 0x40) + { + LoadTilesForSpriteSheet(&gUnknown_0842F1C0[0]); + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203A3D2]); + gUnknown_0203A3D2 = 0x40; + } + return; +} + +void MenuCursor_SetPos814AD7C(u8 a1, u8 a2) +{ + struct Sprite *spr; + if (gUnknown_0203A3D2 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D2]; + spr->invisible = 0; + spr->centerToCornerVecX = 0; + spr->centerToCornerVecY = 0; + spr->pos1.x = a1; + spr->pos1.y = a2; + } + return; +} + +void sub_814ADC8() +{ + struct Sprite *spr; + if (gUnknown_0203A3D2 != 0x40) + { + spr = &gSprites[gUnknown_0203A3D2]; + spr->invisible = 1; + } + return; +} + +void sub_814ADF4(u8 a1) +{ + if (a1 > 0x12) + a1 = 0; + + if (gUnknown_0203A3D2 != 0x40) + SetSubspriteTables(&gSprites[gUnknown_0203A3D2], &gSubspriteTables_842F6C0[a1]); + return; +} + +#if GERMAN +void nullsub_814B200(void) +{ +} +#endif diff --git a/src/menu_helpers.c b/src/menu_helpers.c new file mode 100644 index 000000000..388d98ec7 --- /dev/null +++ b/src/menu_helpers.c @@ -0,0 +1,555 @@ +#include "global.h" +#include "item_menu.h" +#include "constants/items.h" +#include "link.h" +#include "mail_data.h" +#include "main.h" +#include "constants/maps.h" +#include "menu.h" +#include "menu_helpers.h" +#include "overworld.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "text.h" + +#define SCROLL_INDICATOR_PAL_TAG 6 + +static void sub_80F9834(struct Sprite *sprite); + +static EWRAM_DATA u8 gVerticalScrollIndicatorIds[4] = {0}; +static EWRAM_DATA struct YesNoFuncTable gUnknown_020388C4 = {0}; + +static TaskFunc gUnknown_0300074C; + +static const u8 gSpriteImage_83E5808[] = INCBIN_U8("graphics/unknown_sprites/83E59A0/0.4bpp"); + +static const u8 gSpriteImage_83E5848[] = INCBIN_U8("graphics/unknown_sprites/83E59A0/1.4bpp"); + +static const u8 gSpriteImage_83E5888[] = INCBIN_U8("graphics/unknown_sprites/83E59B0/0.4bpp"); + +static const u8 gSpriteImage_83E58C8[] = INCBIN_U8("graphics/unknown_sprites/83E59B0/1.4bpp"); + +static const u8 gSpriteImage_83E5908[] = INCBIN_U8("graphics/unknown_sprites/83E59C0/0.4bpp"); + +static const u8 gSpriteImage_83E5928[] = INCBIN_U8("graphics/unknown_sprites/83E59C0/1.4bpp"); + +static const u16 Palette_3E5948[] = INCBIN_U16("graphics/interface/83E5948.gbapal"); + +static const struct SpritePalette gUnknown_083E5968 = { Palette_3E5948, SCROLL_INDICATOR_PAL_TAG }; + +static const struct OamData gOamData_83E5970 = +{ + .tileNum = 1 +}; + +static const struct OamData gOamData_83E5978 = +{ + .shape = ST_OAM_H_RECTANGLE, + .tileNum = 1 +}; + +static const struct OamData gOamData_83E5980 = +{ + .shape = ST_OAM_V_RECTANGLE, + .tileNum = 1 +}; + +static const union AnimCmd gSpriteAnim_83E5988[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd gSpriteAnim_83E5990[] = +{ + ANIMCMD_FRAME(1, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const gSpriteAnimTable_83E5998[] = +{ + gSpriteAnim_83E5988, + gSpriteAnim_83E5990, +}; + +static const struct SpriteFrameImage gSpriteImageTable_83E59A0[] = +{ + { gSpriteImage_83E5808, 0x40 }, + { gSpriteImage_83E5848, 0x40 }, +}; + +static const struct SpriteFrameImage gSpriteImageTable_83E59B0[] = +{ + { gSpriteImage_83E5888, 0x40 }, + { gSpriteImage_83E58C8, 0x40 }, +}; + +static const struct SpriteFrameImage gSpriteImageTable_83E59C0[] = +{ + { gSpriteImage_83E5908, 0x20 }, + { gSpriteImage_83E5928, 0x20 }, +}; + +static const struct SpriteTemplate gSpriteTemplate_83E59D0 = +{ + .tileTag = 0xFFFF, + .paletteTag = SCROLL_INDICATOR_PAL_TAG, + .oam = &gOamData_83E5978, + .anims = gSpriteAnimTable_83E5998, + .images = gSpriteImageTable_83E59A0, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80F9834, +}; + +static const struct SpriteTemplate gSpriteTemplate_83E59E8 = +{ + .tileTag = 0xFFFF, + .paletteTag = SCROLL_INDICATOR_PAL_TAG, + .oam = &gOamData_83E5980, + .anims = gSpriteAnimTable_83E5998, + .images = gSpriteImageTable_83E59B0, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80F9834, +}; + +static const struct SpriteTemplate gSpriteTemplate_83E5A00 = +{ + .tileTag = 0xFFFF, + .paletteTag = SCROLL_INDICATOR_PAL_TAG, + .oam = &gOamData_83E5970, + .anims = gSpriteAnimTable_83E5998, + .images = gSpriteImageTable_83E59C0, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +void ClearBGTilemapBuffers(void) +{ + memset(&gBGTilemapBuffers[1], 0, 0x800); + memset(&gBGTilemapBuffers[2], 0, 0x800); + memset(&gBGTilemapBuffers[3], 0, 0x800); +} + +// display message box, fill box with tile if tile is not zero, print string +static void PrintMessage(const u8 *str, u16 tile) +{ + Menu_DisplayDialogueFrame(); + if (tile) + { + sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile); + } + MenuPrintMessageDefaultCoords(str); +} + +static void sub_80F9090(u8 taskId) +{ + if (Menu_UpdateWindowText() == TRUE) + { + gUnknown_0300074C(taskId); + } +} + +void DisplayItemMessageOnField(u8 taskId, const u8 *str, TaskFunc callback, u16 tile) +{ + PrintMessage(str, tile); + gUnknown_0300074C = callback; + gTasks[taskId].func = sub_80F9090; +} + +static void Task_CallYesOrNoCallback(u8 taskId) +{ + switch (Menu_ProcessInputNoWrap_()) + { + case 0: + PlaySE(SE_SELECT); + gUnknown_020388C4.yesFunc(taskId); + break; + case 1: + case -1: + PlaySE(SE_SELECT); + gUnknown_020388C4.noFunc(taskId); + } +} + +void DoYesNoFuncWithChoice(u8 taskId, const struct YesNoFuncTable *funcTable) +{ + gUnknown_020388C4 = *funcTable; + gTasks[taskId].func = Task_CallYesOrNoCallback; +} + +static void PrintStringWithPalette(const u8 *str, u8 paletteNum, u8 left, u8 top) +{ + u8 paletteStr[] = _("{PALETTE 0}"); + + if (paletteNum != 0xFF) + { + paletteStr[2] = paletteNum; + StringCopy(gStringVar4, paletteStr); + StringAppend(gStringVar4, str); + paletteStr[2] = gMenuWindowPtr->paletteNum; + StringAppend(gStringVar4, paletteStr); + } + else + { + StringCopy(gStringVar4, str); + } + + Menu_PrintText(gStringVar4, left, top); +} + +// unused +void PrintNumberWithPalette(s32 value, u8 paletteNum, u8 n, u8 mode, u8 left, u8 top) +{ + ConvertIntToDecimalStringN(gStringVar1, value, mode, n); + if (paletteNum != 0xFF) + { + PrintStringWithPalette(gStringVar1, paletteNum, left, top); + } + else + { + Menu_PrintText(gStringVar1, left, top); + } +} + +// unused +void PrintTriangleCursorWithPalette(u8 left, u8 top, u8 paletteNum) +{ + u8 cursorStr[] = _("▶"); + PrintStringWithPalette(cursorStr, paletteNum, left, top); +} + +u8 sub_80F9284(void) +{ + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.newKeys & L_BUTTON) + { + return 1; + } + if (gMain.newKeys & R_BUTTON) + { + return 2; + } + } + + return 0; +} + +u8 sub_80F92BC(void) +{ + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.newAndRepeatedKeys & L_BUTTON) + { + return 1; + } + if (gMain.newAndRepeatedKeys & R_BUTTON) + { + return 2; + } + } + + return 0; +} + +bool8 sub_80F92F4(u16 itemId) +{ + if (itemId != ITEM_ENIGMA_BERRY) + { + return TRUE; + } + + if (!(gSaveBlock1.location.mapGroup == MAP_GROUP(TRADE_CENTER) && gSaveBlock1.location.mapNum == MAP_NUM(TRADE_CENTER))) + { + return TRUE; + } + + return FALSE; +} + +bool8 sub_80F931C(u16 itemId) +{ + if (is_c1_link_related_active() != TRUE) + { + return TRUE; + } + + if (ItemIsMail(itemId) != TRUE) + { + return TRUE; + } + + return FALSE; +} + +bool8 sub_80F9344(void) +{ + if (is_c1_link_related_active() == TRUE || gReceivedRemoteLinkPlayers == 1) + { + return TRUE; + } + + return FALSE; +} + +void sub_80F9368(void) +{ + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); +} + +void ClearVideoCallbacks(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); +} + +void ClearVerticalScrollIndicatorPalettes(void) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + gVerticalScrollIndicatorIds[i] = 0xFF; + } + + FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); + LoadSpritePalette(&gUnknown_083E5968); +} + +void sub_80F9480(u8 *data, u8 n) +{ + u8 i; + + for (i = 0; i < n; i++) + { + data[i] = 0xFF; + } +} + +void sub_80F94A4(u8 animNum, u8 *spriteId, s16 x, s16 y) +{ + if (animNum <= 5) + { + if (*spriteId == 0xFF) + { + *spriteId = CreateSprite(&gSpriteTemplate_83E5A00, x, y, 0); + } + animNum -= 4; + StartSpriteAnim(&gSprites[*spriteId], animNum); + } +} + +void sub_80F94F8(u8 *spriteId) +{ + if (*spriteId != 0xFF) + { + DestroySprite(&gSprites[*spriteId]); + *spriteId = 0xFF; + } +} + +void sub_80F9520(u8 *data, u8 n) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + sub_80F94F8(&data[i]); + } +} + +void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y) +{ + if (id >= 4) + { + return; + } + + switch (id) + { + case TOP_ARROW: + if (gVerticalScrollIndicatorIds[TOP_ARROW] == 0xFF) + { + gVerticalScrollIndicatorIds[TOP_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[2] = -1; + if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] != 0xFF) + { + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y * -1; + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3]; + } + else + { + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = 0; + } + } + break; + + case BOTTOM_ARROW: + if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] == 0xFF) + { + gVerticalScrollIndicatorIds[BOTTOM_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[2] = 1; + if (gVerticalScrollIndicatorIds[TOP_ARROW] != 0xFF) + { + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y * -1; + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3]; + } + else + { + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = 0; + } + } + break; + + case LEFT_ARROW: + if (gVerticalScrollIndicatorIds[LEFT_ARROW] == 0xFF) + { + gVerticalScrollIndicatorIds[LEFT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[0] = -1; + if (gVerticalScrollIndicatorIds[RIGHT_ARROW] != 0xFF) + { + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x * -1; + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1]; + } + else + { + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = 0; + } + } + break; + + case RIGHT_ARROW: + if (gVerticalScrollIndicatorIds[RIGHT_ARROW] == 0xFF) + { + gVerticalScrollIndicatorIds[RIGHT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[0] = 1; + if (gVerticalScrollIndicatorIds[LEFT_ARROW] != 0xFF) + { + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x * -1; + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1]; + } + else + { + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = 0; + } + } + break; + } + + StartSpriteAnim(&gSprites[gVerticalScrollIndicatorIds[id]], id & 1); +} + +void SetVerticalScrollIndicators(u8 id, bool8 invisible) +{ + if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF) + { + gSprites[gVerticalScrollIndicatorIds[id]].invisible = invisible; + } +} + +void DestroyVerticalScrollIndicator(u8 id) +{ + if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF) + { + DestroySprite(&gSprites[gVerticalScrollIndicatorIds[id]]); + gVerticalScrollIndicatorIds[id] = 0xFF; + } +} + +void LoadScrollIndicatorPalette(void) +{ + LoadSpritePalette(&gUnknown_083E5968); +} + +void BuyMenuFreeMemory(void) +{ + FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); +} + +static void sub_80F9834(struct Sprite *sprite) +{ + if (sprite->data[1] == 0) + { + sprite->pos2.x += sprite->data[0]; + } + if (sprite->data[3] == 0) + { + sprite->pos2.y += sprite->data[2]; + } + sprite->data[1]++; + sprite->data[3]++; + if (sprite->data[1] > 2) + { + sprite->data[1] = 0; + } + if (sprite->data[3] > 2) + { + sprite->data[3] = 0; + } + if (sprite->pos2.x == 8 || sprite->pos2.x == -8) + { + sprite->pos2.x = 0; + } + if (sprite->pos2.y == 8 || sprite->pos2.y == -8) + { + sprite->pos2.y = 0; + } +} + +void StopVerticalScrollIndicators(u8 id) +{ + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) + { + gSprites[gVerticalScrollIndicatorIds[id]].callback = SpriteCallbackDummy; + } +} + +void StartVerticalScrollIndicators(u8 id) +{ + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) + { + gSprites[gVerticalScrollIndicatorIds[id]].callback = sub_80F9834; + } +} + +static void ResetVerticalScrollIndicators(u8 id) +{ + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) + { + gSprites[gVerticalScrollIndicatorIds[id]].pos2.x = 0; + gSprites[gVerticalScrollIndicatorIds[id]].pos2.y = 0; + gSprites[gVerticalScrollIndicatorIds[id]].data[1] = 0; + gSprites[gVerticalScrollIndicatorIds[id]].data[3] = 0; + } +} + +void PauseVerticalScrollIndicator(u8 id) +{ + StopVerticalScrollIndicators(id); + ResetVerticalScrollIndicators(id); +} + +void SetVerticalScrollIndicatorPriority(u8 id, u8 priority) +{ + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) + { + gSprites[gVerticalScrollIndicatorIds[id]].oam.priority = priority; + } +} diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c new file mode 100644 index 000000000..d05ba0b89 --- /dev/null +++ b/src/metatile_behavior.c @@ -0,0 +1,1308 @@ +#include "global.h" +#include "metatile_behavior.h" +#include "metatile_behaviors.h" + +#define TILE_ATTRIBUTES(three, two, one) (((one) ? 1 : 0) | ((two) ? 2 : 0) | ((three) ? 4 : 0)) + +static const u8 sTileBitAttributes[] = +{ + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, TRUE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, TRUE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(TRUE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE), + TILE_ATTRIBUTES(FALSE, FALSE, FALSE) +}; + +// only used as default case for checking jump landing in field_ground_effect. +bool8 MetatileBehavior_IsATile(u8 var) +{ + return TRUE; +} + +bool8 MetatileBehavior_IsEncounterTile(u8 var) +{ + if ((sTileBitAttributes[var] & 1) != 0) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsJumpEast(u8 var) +{ + if (var == MB_JUMP_EAST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsJumpWest(u8 var) +{ + if (var == MB_JUMP_WEST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsJumpNorth(u8 var) +{ + if (var == MB_JUMP_NORTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsJumpSouth(u8 var) +{ + if (var == MB_JUMP_SOUTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPokeGrass(u8 var) +{ + if (var == MB_TALL_GRASS || var == MB_LONG_GRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSandOrDeepSand(u8 var) +{ + if (var == MB_SAND || var == MB_DEEP_SAND) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDeepSand(u8 var) +{ + if (var == MB_DEEP_SAND) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsReflective(u8 var) +{ + if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_1A || var == MB_ICE || var == MB_SOOTOPOLIS_DEEP_WATER || var == MB_REFLECTION_UNDER_BRIDGE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsIce(u8 var) +{ + if (var == MB_ICE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWarpDoor(u8 var) +{ + if (var == MB_ANIMATED_DOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDoor(u8 var) +{ + if (var == MB_8D || var == MB_ANIMATED_DOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsEscalator(u8 var) +{ + if (var == MB_UP_ESCALATOR || var == MB_DOWN_ESCALATOR) + return TRUE; + else + return FALSE; +} + +bool8 unref_sub_8056EE0(u8 var) +{ + if (var == MB_04) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsLadder(u8 var) +{ + if (var == MB_LADDER) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsNonAnimDoor(u8 var) +{ + if (var == MB_NON_ANIMATED_DOOR || var == MB_WATER_DOOR || var == MB_DEEP_SOUTH_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsDeepSouthWarp(u8 var) +{ + if (var == MB_DEEP_SOUTH_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8 var) +{ + if ((sTileBitAttributes[var] & 2) != 0) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsEastArrowWarp(u8 var) +{ + if (var == MB_EAST_ARROW_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWestArrowWarp(u8 var) +{ + if (var == MB_WEST_ARROW_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsNorthArrowWarp(u8 var) +{ + if (var == MB_NORTH_ARROW_WARP || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSouthArrowWarp(u8 var) +{ + if (var == MB_SOUTH_ARROW_WARP || var == MB_WATER_SOUTH_ARROW_WARP || var == MB_SHOAL_CAVE_ENTRANCE) + return TRUE; + else + return FALSE; +} + +// unused +bool8 MetatileBehavior_IsArrowWarp(u8 var) +{ + u8 var2 = 0; + + if (MetatileBehavior_IsEastArrowWarp(var) + || MetatileBehavior_IsWestArrowWarp(var) + || MetatileBehavior_IsNorthArrowWarp(var) + || MetatileBehavior_IsSouthArrowWarp(var)) + { + var2 = 1; + } + return var2; +} + +bool8 MetatileBehavior_IsMoveTile(u8 var) +{ + if ((var >= MB_WALK_EAST && var <= MB_TRICK_HOUSE_PUZZLE_8_FLOOR) || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT) + || var == MB_MUDDY_SLOPE || var == MB_CRACKED_FLOOR || var == MB_WATERFALL || var == MB_ICE || var == MB_BB || var == MB_BC) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsIce_2(u8 var) +{ + if (var == MB_ICE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 var) +{ + if (var == MB_TRICK_HOUSE_PUZZLE_8_FLOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_0x05(u8 var) +{ + if (var == MB_05) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWalkNorth(u8 var) +{ + if (var == MB_WALK_NORTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWalkSouth(u8 var) +{ + if (var == MB_WALK_SOUTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWalkWest(u8 var) +{ + if (var == MB_WALK_WEST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWalkEast(u8 var) +{ + if (var == MB_WALK_EAST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsNorthwardCurrent(u8 var) +{ + if (var == MB_NORTHWARD_CURRENT) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSouthwardCurrent(u8 var) +{ + if (var == MB_SOUTHWARD_CURRENT) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWestwardCurrent(u8 var) +{ + if (var == MB_WESTWARD_CURRENT) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsEastwardCurrent(u8 var) +{ + if (var == MB_EASTWARD_CURRENT) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSlideNorth(u8 var) +{ + if (var == MB_SLIDE_NORTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSlideSouth(u8 var) +{ + if (var == MB_SLIDE_SOUTH) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSlideWest(u8 var) +{ + if (var == MB_SLIDE_WEST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSlideEast(u8 var) +{ + if (var == MB_SLIDE_EAST) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCounter(u8 var) +{ + if (var == MB_COUNTER) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 tile, u8 playerDir) +{ + if (playerDir != CONNECTION_NORTH) // if the player isn't facing north, forget about it. + return FALSE; + else if (tile == MB_TELEVISION) // is the player's north tile a TV? + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPC(u8 var) +{ + if (var == MB_PC) + return TRUE; + else + return FALSE; +} + +bool8 is_tile_x84(u8 var) +{ + if (var == MB_84) + return TRUE; + else + return FALSE; +} + +bool8 sub_80571C0(u8 var) +{ + if (var == MB_91 || var == MB_93 || var == MB_95 || var == MB_97 + || var == MB_99 || var == MB_9B || var == MB_9D) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSecretBaseCave(u8 var) +{ + if (var == MB_SECRET_BASE_SPOT_RED_CAVE || var == MB_SECRET_BASE_SPOT_BROWN_CAVE || var == MB_SECRET_BASE_SPOT_YELLOW_CAVE || var == MB_SECRET_BASE_SPOT_BLUE_CAVE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSecretBaseTree(u8 var) +{ + if (var == MB_SECRET_BASE_SPOT_TREE_1 || var == MB_SECRET_BASE_SPOT_TREE_2) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSecretBaseShrub(u8 var) +{ + if (var == MB_SECRET_BASE_SPOT_SHRUB) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSecretBasePC(u8 var) +{ + if (var == MB_SECRET_BASE_PC) + return TRUE; + else + return FALSE; +} + +bool8 sub_805724C(u8 var) +{ + if (var == MB_B1) + return TRUE; + else + return FALSE; +} + +bool8 unref_sub_8057260(u8 var) +{ + if (var == MB_B2) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057274(u8 var) +{ + if (var == MB_B3) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057288(u8 var) +{ + if (var == MB_B9) + return TRUE; + else + return FALSE; +} + +bool8 sub_805729C(u8 var) +{ + if (var == MB_NORMAL) + return TRUE; + else + return FALSE; +} + +bool8 sub_80572B0(u8 var) +{ + if (var == MB_B7) + return TRUE; + else + return FALSE; +} + +bool8 unref_sub_80572C4(u8 var) +{ + if (var == MB_B2) + return TRUE; + else + return FALSE; +} + +bool8 sub_80572D8(u8 var) +{ + if (var == MB_B5) + return TRUE; + else + return FALSE; +} + +bool8 sub_80572EC(u8 var) +{ + if (var == MB_C3) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057300(u8 var) +{ + if (var == MB_C2) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057314(u8 var) +{ + if (var == MB_B8) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057328(u8 var) +{ + if (var == MB_BE) + return TRUE; + else + return FALSE; +} + +bool8 sub_805733C(u8 var) +{ + if (var == MB_BD) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057350(u8 var) +{ + if (var == MB_BA) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057364(u8 var) +{ + if (var == MB_BF) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057378(u8 var) +{ + if (var == MB_C4) + return TRUE; + else + return FALSE; +} + +bool8 sub_805738C(u8 var) +{ + if (var == MB_C5) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_HasRipples(u8 var) +{ + if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_SOOTOPOLIS_DEEP_WATER) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPuddle(u8 var) +{ + if (var == MB_PUDDLE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsTallGrass(u8 var) +{ + if (var == MB_TALL_GRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsLongGrass(u8 var) +{ + if (var == MB_LONG_GRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBerryTreeSoil(u8 var) +{ + if (var == MB_BERRY_TREE_SOIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsAshGrass(u8 var) +{ + if (var == MB_ASHGRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsUnusedFootprintMetatile(u8 var) +{ + if (var == MB_25) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBridge(u8 var) +{ + if (var >= MB_WARP_OR_BRIDGE && var <= MB_ROUTE120_NORTH_BRIDGE_2) + return TRUE; + else + return FALSE; +} + +u8 sub_8057450(u8 var) +{ + u8 result = var - MB_WARP_OR_BRIDGE; + + if (result > 3) + result = 0; + + return result; +} + +bool8 MetatileBehavior_IsLandWildEncounter(u8 var) +{ + if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == FALSE && MetatileBehavior_IsEncounterTile(var) == TRUE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWaterWildEncounter(u8 var) +{ + if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == TRUE && MetatileBehavior_IsEncounterTile(var) == TRUE) + return TRUE; + else + return FALSE; +} + +bool8 sub_80574C4(u8 var) +{ + if (var == MB_0B) + return TRUE; + else + return FALSE; +} + +bool8 sub_80574D8(u8 var) +{ + if (var == MB_MOUNTAIN_TOP) + return TRUE; + else + return FALSE; +} + +bool8 sub_80574EC(u8 var) +{ + if (var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER) + return TRUE; + else + return FALSE; +} + +bool8 sub_805750C(u8 var) +{ + if (var == MB_NO_SURFACING || var == MB_SEAWEED_NO_SURFACING) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsShallowFlowingWater(u8 var) +{ + if (var == MB_SHALLOW_WATER || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP || var == MB_SHOAL_CAVE_ENTRANCE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsThinIce(u8 var) +{ + if (var == MB_THIN_ICE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCrackedIce(u8 var) +{ + if (var == MB_CRACKED_ICE) + return TRUE; + else + return FALSE; +} + +bool8 sub_8057568(u8 var) +{ + if (var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER) + return TRUE; + else + return FALSE; +} + +bool8 unref_sub_8057584(u8 var) +{ + if (var == MB_18 || var == MB_1A) + return TRUE; + else + return FALSE; +} + +bool8 sub_805759C(u8 var) +{ + if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) && MetatileBehavior_IsWaterfall(var) == FALSE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsEastBlocked(u8 var) +{ + if (var == MB_IMPASSABLE_EAST || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_SOUTHEAST || var == MB_C1 || var == MB_BE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWestBlocked(u8 var) +{ + if (var == MB_IMPASSABLE_WEST || var == MB_IMPASSABLE_NORTHWEST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_C1 || var == MB_BE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsNorthBlocked(u8 var) +{ + if (var == MB_IMPASSABLE_NORTH || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_NORTHWEST || var == MB_BED) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSouthBlocked(u8 var) +{ + if (var == MB_IMPASSABLE_SOUTH || var == MB_IMPASSABLE_SOUTHEAST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_BED) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsShortGrass(u8 var) +{ + if (var == MB_SHORT_GRASS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsHotSprings(u8 var) +{ + if (var == MB_HOT_SPRINGS) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsWaterfall(u8 var) +{ + if (var == MB_WATERFALL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsFortreeBridge(u8 var) +{ + if (var == MB_FORTREE_BRIDGE) + return TRUE; + else + return FALSE; +} + +bool8 sub_80576A0(u8 var) +{ + if (var == MB_PACIFIDLOG_VERTICAL_LOG_1) + return TRUE; + else + return FALSE; +} + +bool8 sub_80576B4(u8 var) +{ + if (var == MB_PACIFIDLOG_VERTICAL_LOG_2) + return TRUE; + else + return FALSE; +} + +bool8 sub_80576C8(u8 var) +{ + if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_1) + return TRUE; + else + return FALSE; +} + +bool8 sub_80576DC(u8 var) +{ + if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_2) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPacifidlogLog(u8 var) +{ + if (var >= MB_PACIFIDLOG_VERTICAL_LOG_1 && var <= MB_PACIFIDLOG_HORIZONTAL_LOG_2) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 var) +{ + if (var == MB_TRICK_HOUSE_PUZZLE_DOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsRegionMap(u8 var) +{ + if (var == MB_REGION_MAP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsClosedSootopolisGymDoor(u8 var) +{ + if (var == MB_CLOSED_SOOTOPOLIS_GYM_DOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsRoulette(u8 var) +{ + if (var == MB_ROULETTE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPokeblockFeeder(u8 var) +{ + if (var == MB_POKEBLOCK_FEEDER) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_0xBB(u8 var) +{ + if (var == MB_BB) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_0xBC(u8 var) +{ + if (var == MB_BC) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 var) +{ + if (var == MB_LAVARIDGE_GYM_B1F_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsLavaridge1FWarp(u8 var) +{ + if (var == MB_LAVARIDGE_GYM_1F_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsAquaHideoutWarp(u8 var) +{ + if (var == MB_AQUA_HIDEOUT_WARP) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSurfableFishableWater(u8 var) +{ + if (var == MB_POND_WATER || var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT)) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsMtPyreHole(u8 var) +{ + if (var == MB_MT_PYRE_HOLE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCrackedFloorHole(u8 var) +{ + if (var == MB_CRACKED_FLOOR_HOLE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCrackedFloor(u8 var) +{ + if (var == MB_CRACKED_FLOOR) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsMuddySlope(u8 var) +{ + if (var == MB_MUDDY_SLOPE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBumpySlope(u8 var) +{ + if (var == MB_BUMPY_SLOPE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 var) +{ + if (var == MB_ISOLATED_VERTICAL_RAIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 var) +{ + if (var == MB_ISOLATED_HORIZONTAL_RAIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsVerticalRail(u8 var) +{ + if (var == MB_VERTICAL_RAIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsHorizontalRail(u8 var) +{ + if (var == MB_HORIZONTAL_RAIL) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsSeaweed(u8 var) +{ + if (var == MB_SEAWEED || var == MB_SEAWEED_NO_SURFACING) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsRunningDisallowed(u8 var) +{ + if (var == MB_NO_RUNNING || var == MB_LONG_GRASS || var == MB_HOT_SPRINGS || MetatileBehavior_IsPacifidlogLog(var) != FALSE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsCuttableGrass(u8 var) +{ + if (var == MB_TALL_GRASS || var == MB_LONG_GRASS || var == MB_ASHGRASS || var == MB_LONG_GRASS_SOUTH_EDGE) + return TRUE; + else + return FALSE; +} + +bool8 sub_805791C(u8 var) +{ + if (var == MB_8E) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPictureBookShelf(u8 var) +{ + if (var == MB_PICTURE_BOOK_SHELF) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBookShelf(u8 var) +{ + if (var == MB_BOOKSHELF) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsPokeCenterBookShelf(u8 var) +{ + if (var == MB_POKEMON_CENTER_BOOKSHELF) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsVase(u8 var) +{ + if (var == MB_VASE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsTrashCan(u8 var) +{ + if (var == MB_TRASH_CAN) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsShopShelf(u8 var) +{ + if (var == MB_SHOP_SHELF) + return TRUE; + else + return FALSE; +} + +bool8 MetatileBehavior_IsBlueprint(u8 var) +{ + if (var == MB_BLUEPRINT) + return TRUE; + else + return FALSE; +} diff --git a/src/mon_markings.c b/src/mon_markings.c new file mode 100644 index 000000000..dcdc54434 --- /dev/null +++ b/src/mon_markings.c @@ -0,0 +1,617 @@ +#include "global.h" +#include "main.h" +#include "menu_cursor.h" +#include "text_window.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "mon_markings.h" + +#ifdef GERMAN +#define MENU_TEXT_SPRITE_X_OFFSET 24 +#else +#define MENU_TEXT_SPRITE_X_OFFSET 32 +#endif + +extern u8 gPokenavConditionMenuMisc_Gfx[]; +extern u16 gUnknown_08E966B8[]; + +const u16 gUnknown_083E49F4[] = INCBIN_U16("graphics/misc/mon_markings.gbapal"); +const u8 gUnknown_083E4A14[] = INCBIN_U8("graphics/misc/mon_markings.4bpp"); + +const struct OamData gOamData_83E5214 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83E521C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83E5224[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E522C[] = +{ + ANIMCMD_FRAME(1, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E5234[] = +{ + ANIMCMD_FRAME(2, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E523C[] = +{ + ANIMCMD_FRAME(3, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E5244[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E524C[] = +{ + ANIMCMD_FRAME(5, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E5254[] = +{ + ANIMCMD_FRAME(6, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E525C[] = +{ + ANIMCMD_FRAME(7, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E5264[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E526C[] = +{ + ANIMCMD_FRAME(9, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83E5274[] = +{ + gSpriteAnim_83E5224, + gSpriteAnim_83E522C, + gSpriteAnim_83E5234, + gSpriteAnim_83E523C, + gSpriteAnim_83E5244, + gSpriteAnim_83E524C, + gSpriteAnim_83E5254, + gSpriteAnim_83E525C, + gSpriteAnim_83E5264, + gSpriteAnim_83E526C, +}; + +const union AnimCmd gSpriteAnim_83E529C[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52A4[] = +{ + ANIMCMD_FRAME(64, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83E52AC[] = +{ + gSpriteAnim_83E529C, + gSpriteAnim_83E52A4, +}; + +const struct OamData gOamData_83E52B4 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83E52BC[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52C4[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52CC[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52D4[] = +{ + ANIMCMD_FRAME(12, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52DC[] = +{ + ANIMCMD_FRAME(16, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52E4[] = +{ + ANIMCMD_FRAME(20, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52EC[] = +{ + ANIMCMD_FRAME(24, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52F4[] = +{ + ANIMCMD_FRAME(28, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E52FC[] = +{ + ANIMCMD_FRAME(32, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E5304[] = +{ + ANIMCMD_FRAME(36, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E530C[] = +{ + ANIMCMD_FRAME(40, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E5314[] = +{ + ANIMCMD_FRAME(44, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E531C[] = +{ + ANIMCMD_FRAME(48, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E5324[] = +{ + ANIMCMD_FRAME(52, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E532C[] = +{ + ANIMCMD_FRAME(56, 5), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83E5334[] = +{ + ANIMCMD_FRAME(60, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83E533C[] = +{ + gSpriteAnim_83E52BC, + gSpriteAnim_83E52C4, + gSpriteAnim_83E52CC, + gSpriteAnim_83E52D4, + gSpriteAnim_83E52DC, + gSpriteAnim_83E52E4, + gSpriteAnim_83E52EC, + gSpriteAnim_83E52F4, + gSpriteAnim_83E52FC, + gSpriteAnim_83E5304, + gSpriteAnim_83E530C, + gSpriteAnim_83E5314, + gSpriteAnim_83E531C, + gSpriteAnim_83E5324, + gSpriteAnim_83E532C, + gSpriteAnim_83E5334, +}; + +static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL; + +static void sub_80F761C(s16, s16, u16, u16); +static void nullsub_65(struct Sprite *); +static void sub_80F78CC(struct Sprite *); +static void sub_80F7908(struct Sprite *); +static struct Sprite *sub_80F7960(u16, u16, const u16 *, u16); + +void sub_80F727C(struct PokemonMarkMenu *ptr) +{ + sMenu = ptr; + sMenu->spriteSheetLoadRequired = FALSE; +} + +void sub_80F728C(void) +{ + const struct FrameGraphics *frame = TextWindow_GetFrameGraphics(gSaveBlock2.optionsWindowFrameType); + sMenu->frameTiles = frame->tiles; + sMenu->framePalette = frame->palette; + sMenu->tileLoadState = 0; + CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles)); +} + +bool8 sub_80F72D4(void) +{ + u16 i; + u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100; + + switch (sMenu->tileLoadState) + { + case 0: + CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP); + for (i = 0; i < 6; i++) + { + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); + } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); + sMenu->tileLoadState++; + break; + default: + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP); + for (i = 0; i < 6; i++) + { + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); + } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); + sMenu->tileLoadState++; + break; + case 13: + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP); + for (i = 0; i < 6; i++) + { + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); + } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); + sMenu->tileLoadState++; + return FALSE; + case 14: + return FALSE; + } + + return TRUE; +} + +void sub_80F7404(void) +{ + sub_80F728C(); + while (sub_80F72D4()) + ; +} + +void sub_80F7418(u8 markings, s16 x, s16 y) +{ + u16 i; + sMenu->cursorPos = 0; + sMenu->markings = markings; + for (i = 0; i < 4; i++) + sMenu->markingsArray[i] = (sMenu->markings >> i) & 1; + DestroyMenuCursor(); + sub_80F761C(x, y, sMenu->baseTileTag, sMenu->basePaletteTag); +} + +void sub_80F7470(void) +{ + u16 i; + + for (i = 0; i < 3; i++) + { + FreeSpriteTilesByTag(sMenu->baseTileTag + i); + } + + FreeSpritePaletteByTag(sMenu->basePaletteTag); + FreeSpritePaletteByTag(sMenu->basePaletteTag + 1); + + for (i = 0; i < 2; i++) + { + if (!sMenu->menuWindowSprites[i]) + return; + DestroySprite(sMenu->menuWindowSprites[i]); + } + + for (i = 0; i < 4; i++) + { + if (!sMenu->menuMarkingSprites[i]) + return; + DestroySprite(sMenu->menuMarkingSprites[i]); + } + + DestroyMenuCursor(); + + if (sMenu->menuTextSprite) + DestroySprite(sMenu->menuTextSprite); +} + +bool8 sub_80F7500(void) +{ + u16 i; + struct SpriteSheet sheets[3] = + { + { sMenu->menuWindowSpriteTiles, 0x1000, sMenu->baseTileTag }, + { gPokenavConditionMenuMisc_Gfx, 0x520, sMenu->baseTileTag + 1 }, + { NULL, 0, 0 } + }; + + if (sMenu->spriteSheetLoadRequired) + { + LoadTilesForSpriteSheets(sheets); + sMenu->spriteSheetLoadRequired = FALSE; + } + + if (gMain.newKeys & DPAD_UP) + { + s8 pos; + PlaySE(SE_SELECT); + pos = --sMenu->cursorPos; + if (pos < 0) + sMenu->cursorPos = 5; + return TRUE; + } + + if (gMain.newKeys & DPAD_DOWN) + { + s8 pos; + PlaySE(SE_SELECT); + pos = ++sMenu->cursorPos; + if (pos > 5) + sMenu->cursorPos = 0; + return TRUE; + } + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + + switch (sMenu->cursorPos) + { + case 4: + sMenu->markings = 0; + for (i = 0; i < 4; i++) + sMenu->markings |= sMenu->markingsArray[i] << i; + return FALSE; + case 5: + return FALSE; + } + + sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos]; + return TRUE; + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + return FALSE; + } + + return TRUE; +} + +void sub_80F761C(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag) +{ + u16 i; + u8 spriteId; + + struct SpriteSheet sheets[] = + { + { sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag }, + { gPokenavConditionMenuMisc_Gfx, 0x520, baseTileTag + 1 }, + { NULL, 0 } + }; + + struct SpritePalette palettes[] = + { + { sMenu->framePalette, basePaletteTag }, + { gUnknown_08E966B8, basePaletteTag + 1}, + { NULL, 0 } + }; + + struct SpriteTemplate sprTemplate = + { + baseTileTag, + basePaletteTag, + &gOamData_83E5214, + gSpriteAnimTable_83E52AC, + NULL, + gDummySpriteAffineAnimTable, + nullsub_65, + }; + + sMenu->spriteSheetLoadRequired = TRUE; + AllocTilesForSpriteSheets(sheets); + LoadSpritePalettes(palettes); + + for (i = 0; i < 2; i++) + { + spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 2); + if (spriteId != 64) + { + sMenu->menuWindowSprites[i] = &gSprites[spriteId]; + StartSpriteAnim(&gSprites[spriteId], i); + } + else + { + sMenu->menuWindowSprites[i] = NULL; + return; + } + } + + sMenu->menuWindowSprites[1]->pos1.y = y + 96; + + sprTemplate.tileTag++; + sprTemplate.paletteTag++; + sprTemplate.anims = gSpriteAnimTable_83E5274; + sprTemplate.callback = sub_80F78CC; + sprTemplate.oam = &gOamData_83E521C; + + for (i = 0; i < 4; i++) + { + spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 1); + if (spriteId != 64) + { + sMenu->menuMarkingSprites[i] = &gSprites[spriteId]; + gSprites[spriteId].data[0] = i; + } + else + { + sMenu->menuMarkingSprites[i] = NULL; + return; + } + } + + sprTemplate.callback = SpriteCallbackDummy; + + spriteId = CreateSprite(&sprTemplate, 0, 0, 1); + + if (spriteId != 64) + { + sMenu->menuTextSprite = &gSprites[spriteId]; + sMenu->menuTextSprite->oam.shape = ST_OAM_H_RECTANGLE; + sMenu->menuTextSprite->oam.size = 3; + StartSpriteAnim(sMenu->menuTextSprite, 9); + sMenu->menuTextSprite->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET; + sMenu->menuTextSprite->pos1.y = y + 80; + CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0); + } + else + { + sMenu->menuTextSprite = NULL; + } + + sMenu->cursorBaseY = y + 8; + MenuCursor_Create814A5C0(0, basePaletteTag + 1, 15, 0, 0x30); + MenuCursor_SetPos814A880(x + 8, sMenu->cursorBaseY); + sub_814AABC(sub_80F7908); +} + +void nullsub_65(struct Sprite *sprite) +{ +} + +void sub_80F78CC(struct Sprite *sprite) +{ + if (sMenu->markingsArray[sprite->data[0]]) + StartSpriteAnim(sprite, 2 * sprite->data[0] + 1); + else + StartSpriteAnim(sprite, 2 * sprite->data[0]); +} + +void sub_80F7908(struct Sprite *sprite) +{ + sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY; +} + +struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, const u16 *palette) +{ + if (!palette) + palette = gUnknown_083E49F4; + return sub_80F7960(tileTag, paletteTag, palette, 16); +} + +struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, const u16 *palette) +{ + if (!palette) + palette = gUnknown_083E49F4; + return sub_80F7960(tileTag, paletteTag, palette, 1); +} + +struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size) +{ + u8 spriteId; + struct SpriteTemplate sprTemplate; + struct SpriteSheet sheet = { gUnknown_083E4A14, 0x80, tileTag }; + struct SpritePalette sprPalette = { palette, paletteTag }; + + sprTemplate.tileTag = tileTag; + sprTemplate.paletteTag = paletteTag; + sprTemplate.oam = &gOamData_83E52B4; + sprTemplate.anims = gSpriteAnimTable_83E533C; + sprTemplate.images = NULL; + sprTemplate.affineAnims = gDummySpriteAffineAnimTable; + sprTemplate.callback = nullsub_65; + + sheet.size = size * 0x80; + + LoadSpriteSheet(&sheet); + LoadSpritePalette(&sprPalette); + + spriteId = CreateSprite(&sprTemplate, 0, 0, 0); + if (spriteId != 64) + return &gSprites[spriteId]; + else + return NULL; +} + +void sub_80F7A10(u8 markings, void *dest) +{ + DmaCopy16Defvars(3, gUnknown_083E4A14 + markings * 0x80, dest, 0x80); +} diff --git a/src/money.c b/src/money.c new file mode 100644 index 000000000..3b7268dbc --- /dev/null +++ b/src/money.c @@ -0,0 +1,304 @@ +#include "global.h" +#include "money.h" +#include "decompress.h" +#include "menu.h" +#include "sprite.h" +#include "string_util.h" +#include "graphics.h" + +#define SPRITE_TAG_MONEY (0x2722) + +extern u16 gSpecialVar_0x8005; + +static EWRAM_DATA u8 gUnknown_02038734 = 0; + +static const struct OamData gOamData_83CF558 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83CF560[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83CF568[] = +{ + gSpriteAnim_83CF560, +}; + +const struct SpriteTemplate gSpriteTemplate_83CF56C = +{ + .tileTag = 10018, + .paletteTag = 10018, + .oam = &gOamData_83CF558, + .anims = gSpriteAnimTable_83CF568, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +const struct CompressedSpriteSheet gUnknown_083CF584[] = {gMenuMoneyGfx, 256, SPRITE_TAG_MONEY}; +const struct CompressedSpritePalette gUnknown_083CF58C[] = {gMenuMoneyPal, SPRITE_TAG_MONEY}; + +bool8 IsEnoughMoney(u32 budget, u32 cost) +{ + if (budget >= cost) + { + return TRUE; + } + + return FALSE; +} + +void AddMoney(u32 *arg0, u32 arg1) +{ + if (*arg0 > *arg0 + arg1) + { + *arg0 = 999999; + return; + } + + *arg0 = *arg0 + arg1; + if (*arg0 > 999999) + { + *arg0 = 999999; + } +} + +void RemoveMoney(u32 *arg0, u32 arg1) +{ + if (*arg0 < arg1) + { + *arg0 = 0; + } + else + { + *arg0 = *arg0 - arg1; + } +} + +void GetMoneyAmountText(u8 *buffer, u32 amount, u8 arg2) +{ + u8 width; + u8 i; + + if (amount > 999999) + width = 7; + else if (amount > 99999) + width = 6; + // A special sprite is used for 10000 in the decoration + // shop, so be sure to account for this. + else if (amount > 10000) + width = 5; + else if (amount > 999) + width = 4; + else if (amount > 99) + width = 3; + else if (amount > 9) + width = 2; + else + width = 1; + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x14; + buffer[2] = 0x06; + buffer += 3; + + for (i = 0; i < arg2 - width; i++) + { + buffer[0] = CHAR_SPACE; + buffer += 1; + } + + buffer[0] = CHAR_CURRENCY; + buffer += 1; + + buffer = ConvertIntToDecimalString(buffer, amount); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x14; + buffer[2] = 0x00; + buffer[3] = EOS; +} + +void PrintMoneyAmount(u32 amount, u8 size, u8 x, u8 y) +{ + u8 buffer[16]; + u8 stringWidth; + + GetMoneyAmountText(buffer, amount, size); + stringWidth = sub_8072CA4(buffer); + + if (stringWidth >= (size + 1) * 8) + { + Menu_PrintText(buffer, x, y); + } + else + { + int xPlusOne = x + 1; + Menu_PrintTextPixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1); + } +} + +void sub_80B7AEC(u32 arg0, u8 left, u8 top) +{ + u8 buffer[32]; + u8 *ptr; + + ptr = &buffer[0]; + + ptr[0] = CHAR_CURRENCY; + ptr++; + + ptr = ConvertIntToDecimalString(ptr, arg0); + + MenuPrint_RightAligned(buffer, left, top); + +#ifdef ENGLISH + ptr[0] = 0xFC; + ptr[1] = 0x14; + ptr[2] = 0x00; + ptr[3] = 0xFF; +#endif +} + +__attribute__((naked)) +void Draw10000Sprite(u8 var1, u8 var2, int var3) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x4\n\ + mov r8, r0\n\ + adds r5, r1, 0\n\ + mov r9, r2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + mov r1, r9\n\ + lsls r1, 8\n\ + mov r9, r1\n\ + ldr r4, _080B7BD8 @ =gDecoration10000_Gfx\n\ + adds r0, r1, r4\n\ + lsls r6, r5, 4\n\ + subs r6, r5\n\ + lsls r1, r6, 6\n\ + mov r3, r8\n\ + adds r3, 0x1\n\ + lsls r3, 5\n\ + ldr r2, _080B7BDC @ =0x06008000\n\ + adds r3, r2\n\ + adds r1, r3\n\ + movs r2, 0x20\n\ + str r3, [sp]\n\ + bl CpuFastSet\n\ + adds r4, 0x80\n\ + add r9, r4\n\ + adds r0, r5, 0x1\n\ + lsls r4, r0, 4\n\ + subs r4, r0\n\ + lsls r1, r4, 6\n\ + ldr r3, [sp]\n\ + adds r1, r3\n\ + mov r0, r9\n\ + movs r2, 0x20\n\ + bl CpuFastSet\n\ + movs r3, 0\n\ + lsls r5, 5\n\ + mov r0, r8\n\ + adds r7, r5, r0\n\ + lsls r6, 1\n\ + adds r6, 0x1\n\ + add r6, r8\n\ + ldr r1, _080B7BE0 @ =0xfffff000\n\ + adds r5, r1, 0\n\ + ldr r0, _080B7BE4 @ =0x0600f800\n\ + mov r12, r0\n\ + ldr r1, _080B7BE8 @ =0x0600f840\n\ + mov r9, r1\n\ + lsls r4, 1\n\ + adds r4, 0x1\n\ + add r4, r8\n\ +_080B7BAA:\n\ + adds r1, r7, r3\n\ + lsls r1, 1\n\ + mov r0, r12\n\ + adds r2, r1, r0\n\ + adds r0, r3, r6\n\ + adds r0, r5\n\ + strh r0, [r2]\n\ + add r1, r9\n\ + adds r0, r3, r4\n\ + adds r0, r5\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x3\n\ + bls _080B7BAA\n\ + add sp, 0x4\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B7BD8: .4byte gDecoration10000_Gfx\n\ +_080B7BDC: .4byte 0x06008000\n\ +_080B7BE0: .4byte 0xfffff000\n\ +_080B7BE4: .4byte 0x0600f800\n\ +_080B7BE8: .4byte 0x0600f840\n\ + .syntax divided\n"); +} + +void UpdateMoneyWindow(u32 amount, u8 x, u8 y) +{ + PrintMoneyAmount(amount, 6, x + 6, y + 1); +} + +void OpenMoneyWindow(u32 amount, u8 x, u8 y) +{ + Menu_DrawStdWindowFrame(x, y, x + 13, y + 3); + UpdateMoneyWindow(amount, x, y); + + LoadCompressedObjectPic(gUnknown_083CF584); + LoadCompressedObjectPalette(gUnknown_083CF58C); + + gUnknown_02038734 = CreateSprite(&gSpriteTemplate_83CF56C, x * 8 + 19, y * 8 + 11, 0); +} + +void CloseMoneyWindow(u8 x, u8 y) +{ + DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]); + FreeSpritePaletteByTag(SPRITE_TAG_MONEY); + Menu_EraseWindowRect(x, y, x + 13, y + 3); +} + +bool8 HasEnoughMoneyFor(void) +{ + return IsEnoughMoney(gSaveBlock1.money, gSpecialVar_0x8005); +} + +void PayMoneyFor(void) +{ + RemoveMoney(&gSaveBlock1.money, gSpecialVar_0x8005); +} diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c new file mode 100644 index 000000000..56801ff53 --- /dev/null +++ b/src/mystery_event_menu.c @@ -0,0 +1,494 @@ +#include "global.h" +#include "mystery_event_menu.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "mystery_event_script.h" +#include "palette.h" +#include "save.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "title_screen.h" +#include "ewram.h" + +static EWRAM_DATA u8 gUnknown_02039338 = 0; + +static void VBlankCB(void); +static bool8 CheckLanguageMatch(void); +static bool8 GetEventLoadMessage(u8 *dest, u32 status); +static void CB2_MysteryEventMenu(void); + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static bool8 CheckLanguageMatch(void) +{ + bool8 val = FALSE; + + if (gLinkPlayers[0].language == gLinkPlayers[1].language) + val = TRUE; + + return val; +} + +void CB2_InitMysteryEventMenu(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; + REG_BLDCNT = 0; + CreateTask(Task_DestroySelf, 0); + StopMapMusic(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + FillPalette(0, 0, 2); + SetMainCallback2(CB2_MysteryEventMenu); +} + +static bool8 GetEventLoadMessage(u8 *dest, u32 status) +{ + bool8 retVal = 1; + + if (status == 0) + { + StringCopy(dest, gSystemText_EventLoadSuccess); + retVal = 0; + } + + if (status == 2) + retVal = 0; + + if (status == 1) + StringCopy(dest, gSystemText_LoadingError); + + return retVal; +} + +static void CB2_MysteryEventMenu(void) +{ + u16 unkVal; + + switch (gMain.state) + { + case 0: + Menu_DrawStdWindowFrame(0, 14, 29, 19); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + gMain.state++; + break; + case 1: + if (gPaletteFade.active) + break; + MenuPrintMessageDefaultCoords(gSystemText_LinkStandby); + gMain.state++; + break; + case 2: + if (Menu_UpdateWindowText()) + { + gMain.state++; + gLinkType = 21761; + OpenLink(); + } + break; + case 3: + if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4) + { + PlaySE(SE_PIN); + MenuPrintMessageDefaultCoords(gSystemText_LoadEventPressA); + gMain.state++; + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + } + break; + case 4: + if (Menu_UpdateWindowText()) + gMain.state++; + break; +#ifdef NONMATCHING + case 5: + if (GetLinkPlayerCount_2() != 2) + { + GetEventLoadMessage(gStringVar4, 1); + MenuPrintMessageDefaultCoords(gStringVar4); + gMain.state = 13; + break; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_8007F4C(); + Menu_DrawStdWindowFrame(6, 5, 23, 8); + Menu_PrintText(gSystemText_LoadingEvent, 7, 6); + gMain.state++; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + } + break; + case 6: + if (IsLinkConnectionEstablished()) + { + if (!gReceivedRemoteLinkPlayers) + break; + + if (GetLinkPlayerDataExchangeStatusTimed() == 3) + { + sub_800832C(); + Menu_EraseWindowRect(6, 5, 23, 8); + GetEventLoadMessage(gStringVar4, 1); + MenuPrintMessageDefaultCoords(gStringVar4); + gMain.state = 13; + break; + } + else if (CheckLanguageMatch()) + { + MenuPrintMessageDefaultCoords(gSystemText_DontCutLink); + gMain.state++; + break; + } + else + { + CloseLink(); + Menu_EraseWindowRect(6, 5, 23, 8); + GetEventLoadMessage(gStringVar4, 1); + MenuPrintMessageDefaultCoords(gStringVar4); + gMain.state = 13; + break; + } + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + break; + } + break; +#else + case 5: + if (GetLinkPlayerCount_2() != 2) + { + goto label; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_8007F4C(); + Menu_DrawStdWindowFrame(6, 5, 23, 8); + Menu_PrintText(gSystemText_LoadingEvent, 7, 6); + gMain.state++; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + } + break; + case 6: + if (IsLinkConnectionEstablished()) + { + register u8 *ptr asm("r0"); + register u32 offset1 asm("r2"); + register u32 offset2 asm("r1"); + + if (!gReceivedRemoteLinkPlayers) + break; + + if (GetLinkPlayerDataExchangeStatusTimed() == 3) + { + sub_800832C(); + Menu_EraseWindowRect(6, 5, 23, 8); + GetEventLoadMessage(gStringVar4, 1); + MenuPrintMessageDefaultCoords(gStringVar4); + ptr = (u8 *)&gMain; + offset1 = offsetof(struct Main, state); + asm("" ::: "r1"); + ptr += offset1; + *ptr = 13; + } + else if (CheckLanguageMatch()) + { + register u8 *ptr2 asm("r1"); + register int offset3 asm("r0"); + register int dummy asm("r2"); + MenuPrintMessageDefaultCoords(gSystemText_DontCutLink); + ptr2 = (u8 *)&gMain; + offset3 = offsetof(struct Main, state); + if (dummy) + dummy++; + ptr2 += offset3; + (*ptr2)++; + break; + } + else + { + CloseLink(); + Menu_EraseWindowRect(6, 5, 23, 8); + label: + GetEventLoadMessage(gStringVar4, 1); + MenuPrintMessageDefaultCoords(gStringVar4); + ptr = (u8 *)&gMain; + offset2 = offsetof(struct Main, state); + ptr += offset2; + *ptr = 13; + } + break; + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + CloseLink(); + gMain.state = 15; + break; + } + break; +#endif + case 7: + if (Menu_UpdateWindowText()) + gMain.state++; + break; + case 8: + if (GetBlockReceivedStatus()) + { + ResetBlockReceivedFlags(); + gMain.state++; + } + break; + case 9: + gMain.state++; + break; + case 10: + sub_800832C(); + gMain.state++; + break; + case 11: + if (gReceivedRemoteLinkPlayers) + break; + unkVal = RunMysteryEventScript(gSharedMem); + CpuFill32(0, gSharedMem, 0x7D4); + if (!GetEventLoadMessage(gStringVar4, unkVal)) + Save_WriteData(SAVE_NORMAL); + gMain.state++; + break; + case 12: + MenuPrintMessageDefaultCoords(gStringVar4); + gMain.state++; + break; + case 13: + Menu_EraseWindowRect(6, 5, 23, 8); + if (Menu_UpdateWindowText()) + { + gMain.state++; + gUnknown_02039338 = 0; + } + break; + case 14: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gMain.state++; + } + break; + case 15: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gMain.state++; + break; + case 16: + if (!gPaletteFade.active) + DoSoftReset(); + break; + } + + if (gLinkStatus & 0x40) + { + if (!IsLinkMaster()) + { + CloseLink(); + Menu_EraseWindowRect(6, 5, 23, 8); + GetEventLoadMessage(gStringVar4, 1); + MenuPrintMessageDefaultCoords(gStringVar4); + gMain.state = 13; + } + } + + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +#if DEBUG + +static const u8 Str_843DA70[] = _("CARDーE emulation。。。"); +static const u8 Str_843DA84[] = _("LR: select A: send。"); +static const u8 Str_843DA98[] = _("sending。。。"); +static const u8 Str_843DAA3[] = _("completed。"); + +extern const struct {const u8 *text; void (*func)();} gUnknown_Debug_842E2D0[]; +extern const u8 gUnknown_Debug_842E350; + +void debug_sub_815D1D8(); + +void debug_sub_815D04C(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + Menu_DrawStdWindowFrame(4, 4, 13, 7); + Menu_PrintText(gUnknown_Debug_842E2D0[gTasks[taskId].data[1]].text, 5, 5); + gTasks[taskId].data[0]++; + } + + if (gMain.newKeys & 0x20) + { + if (gTasks[taskId].data[1] == 0) + gTasks[taskId].data[1] = gUnknown_Debug_842E350 - 1; + else + gTasks[taskId].data[1]--; + gTasks[taskId].data[0] = 0; + } + if (gMain.newKeys & 0x10) + { + if (gTasks[taskId].data[1] == gUnknown_Debug_842E350 - 1) + gTasks[taskId].data[1] = 0; + else + gTasks[taskId].data[1]++; + gTasks[taskId].data[0] = 0; + } + if (gMain.newKeys & A_BUTTON) + { + // TODO: fix this + s32 var = gTasks[taskId].data[1]; + asm(""::"r"(var * 8)); + gUnknown_Debug_842E2D0[var].func(gSharedMem + 0x4000); + + gMain.state++; + DestroyTask(taskId); + } +} + +void debug_sub_815D15C(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + SetVBlankCallback(VBlankCB); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_EraseScreen(); + REG_DISPCNT = DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; + REG_BLDCNT = 0; + + CreateTask(Task_DestroySelf, 0); + StopMapMusic(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + FillPalette(0, 0, 2); + SetMainCallback2(debug_sub_815D1D8); +} + +void debug_sub_815D1D8(void) +{ + switch (gMain.state) + { + case 0: + Menu_DrawStdWindowFrame(3, 14, 27, 19); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + gMain.state++; + break; + case 1: + if (!gPaletteFade.active) + { + if (gMain.heldKeys & 0x100) + gUnknown_Debug_30030E0++; + MenuPrintMessage(Str_843DA70, 4, 15); + gMain.state++; + } + break; + case 2: + if (Menu_UpdateWindowText()) + { + gMain.state++; + gLinkType = 0x5501; + OpenLink(); + } + break; + case 3: + if (gReceivedRemoteLinkPlayers != 0) + { + gMain.state++; + MenuPrintMessage(Str_843DA84, 4, 15); + } + break; + case 4: + if (Menu_UpdateWindowText()) + { + CreateTask(debug_sub_815D04C, 10); + gMain.state++; + } + break; + case 6: + MenuPrintMessage(Str_843DA98, 4, 15); + SendBlock(0, gSharedMem + 0x4000, 0x2004); + gMain.state++; + break; + case 7: + Menu_UpdateWindowText(); + if (IsLinkTaskFinished()) + gMain.state++; + break; + case 8: + sub_800832C(); + gMain.state++; + break; + case 9: + if (gReceivedRemoteLinkPlayers == 0) + { + Menu_BlankWindowRect(4, 15, 26, 18); + Menu_PrintText(Str_843DAA3, 4, 15); + gMain.state++; + } + break; + case 10: + if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gMain.state++; + } + break; + case 11: + if (!gPaletteFade.active) + SetMainCallback2(CB2_InitTitleScreen); + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +#endif diff --git a/src/mystery_event_msg.c b/src/mystery_event_msg.c new file mode 100644 index 000000000..03ef22727 --- /dev/null +++ b/src/mystery_event_msg.c @@ -0,0 +1,51 @@ +#include "global.h" + +#if ENGLISH + +const u8 gOtherText_BerryObtainedDadHasIt[] = _("Obtained a {STR_VAR_2} BERRY!\nDad has it at PETALBURG GYM."); + +const u8 gOtherText_BerryTransformed[] = _("The {STR_VAR_1} BERRY transformed into\none {STR_VAR_2} BERRY."); + +const u8 gOtherText_BerryAlreadyObtained[] = _("The {STR_VAR_1} BERRY has already been\nobtained."); + +const u8 gOtherText_SpecialRibbonReceived[] = _("A special RIBBON was awarded to your\nparty POKéMON."); + +const u8 gOtherText_DexUpgraded[] = _("The POKéDEX has been upgraded with\nthe NATIONAL MODE."); + +const u8 gOtherText_RareWordAdded[] = _("A rare word has been added."); + +const u8 gOtherText_PokeWasSentOver[] = _("{STR_VAR_1} was sent over!"); + +const u8 gOtherText_PartyIsFull[] = _("Your party is full.\n{STR_VAR_1} could not be sent over."); + +const u8 gOtherText_NewTrainerInHoenn[] = _("A new TRAINER has arrived in HOENN."); + +const u8 gOtherText_NewAdversaryInBattleTower[] = _("A new adversary has arrived in the\nBATTLE TOWER."); + +const u8 gOtherText_DataCannotUseVersion[] = _("This data cannot be used in\nthis version."); + +#elif GERMAN + +const u8 gOtherText_BerryObtainedDadHasIt[] = _("Eine {STR_VAR_2}BEERE! Vater in der \nARENA von BLÜTENBURG CITY besitzt\lauch eine."); + +const u8 gOtherText_BerryTransformed[] = _("Die {STR_VAR_1}BEERE verwandelte\nsich in eine {STR_VAR_2}BEERE!"); + +const u8 gOtherText_BerryAlreadyObtained[] = _("Du hast schon eine {STR_VAR_1}BEERE."); + +const u8 gOtherText_SpecialRibbonReceived[] = _("Ein besonderes BAND wurde deinem\nPOKéMON im Team verliehen."); + +const u8 gOtherText_DexUpgraded[] = _("Der POKéDEX wurde mit dem NATIONALEN\nMODUS ausgerüstet."); + +const u8 gOtherText_RareWordAdded[] = _("Ein seltenes Wort wurde hinzugefügt."); + +const u8 gOtherText_PokeWasSentOver[] = _("{STR_VAR_1} wurde gesendet!"); + +const u8 gOtherText_PartyIsFull[] = _("Dein Team ist bereits vollständig.\n{STR_VAR_1} kann nicht gesendet\lwerden."); + +const u8 gOtherText_NewTrainerInHoenn[] = _("Ein neuer TRAINER ist in HOENN\nangekommen."); + +const u8 gOtherText_NewAdversaryInBattleTower[] = _("Ein neuer Widersacher ist im DUELLTURM\neingetroffen."); + +const u8 gOtherText_DataCannotUseVersion[] = _("Die Daten können in dieser Edition\nnicht eingesetzt werden."); + +#endif // ENGLISH/GERMAN diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c new file mode 100644 index 000000000..6fcad66ac --- /dev/null +++ b/src/mystery_event_script.c @@ -0,0 +1,452 @@ +#include "global.h" +#include "berry.h" +#include "battle_tower.h" +#include "easy_chat.h" +#include "event_data.h" +#include "mail_data.h" +#include "mystery_event_script.h" +#include "pokedex.h" +#include "pokemon.h" +#include "pokemon_size_record.h" +#include "script.h" +#include "constants/species.h" +#include "strings.h" +#include "string_util.h" +#include "text.h" +#include "util.h" +#include "mystery_event_msg.h" + +#if ENGLISH +#define LANGUAGE_MASK 0x2 +#elif GERMAN +#define LANGUAGE_MASK 0x4 +#endif + +#ifdef SAPPHIRE +#define VERSION_MASK 0x100 +#else +#define VERSION_MASK 0x80 +#endif + +extern void party_compaction(void); + +extern ScrCmdFunc gMysteryEventScriptCmdTable[]; +extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[]; + +static EWRAM_DATA struct ScriptContext sMysteryEventScriptContext = {0}; + +static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4) +{ + if (!(a1 & LANGUAGE_MASK)) + return FALSE; + + if (!(a2 & LANGUAGE_MASK)) + return FALSE; + + if (!(a3 & 0x4)) + return FALSE; + + if (!(a4 & VERSION_MASK)) + return FALSE; + + return TRUE; +} + +static void SetIncompatible(void) +{ + StringExpandPlaceholders(gStringVar4, gOtherText_DataCannotUseVersion); + SetMysteryEventScriptStatus(3); +} + +static void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script) +{ + InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd); + SetupBytecodeScript(ctx, script); + ctx->data[0] = (u32)script; + ctx->data[1] = 0; + ctx->data[2] = 0; + ctx->data[3] = 0; +} + +static bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx) +{ + if (RunScriptCommand(ctx) && ctx->data[3]) + return TRUE; + else + return FALSE; +} + +u32 RunMysteryEventScript(u8 *script) +{ + struct ScriptContext *ctx = &sMysteryEventScriptContext; + InitMysteryEventScript(ctx, script); + while (RunMysteryEventScriptCommand(ctx)) + ; + return ctx->data[2]; +} + +void SetMysteryEventScriptStatus(u32 val) +{ + sMysteryEventScriptContext.data[2] = val; +} + +static int CalcChecksum(u8 *data, int size) +{ + unsigned int i; + int sum = 0; + + for (i = 0; i < size; i++) + sum += data[i]; + + return sum; +} + +static u32 GetWord(u8 *ptr) +{ + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); +} + +static void SetWord(u8 *ptr, u32 val) +{ + ptr[0] = val; + ptr[1] = val >> 8; + ptr[2] = val >> 16; + ptr[3] = val >> 24; +} + +bool8 unref_sub_81261B4(u8 *a1, int a2) +{ + if (a1[0x0] == 1 && a1[0x11] == 15 && !GetWord(a1 + 0x12)) + { + int v4 = GetWord(a1 + 0x16) - a2 + (int)a1; + int v5 = GetWord(a1 + 0x1A); + int v6 = CalcChecksum((u8*)v4, v5 - a2 + (int)a1 - v4); + SetWord(a1 + 0x12, v6); + return TRUE; + } + + return FALSE; +} + +bool8 unref_sub_812620C(u8 *a1, int a2) +{ + if (a1[0x0] == 1 && a1[0x11] == 16 && !GetWord(a1 + 0x12)) + { + int v4 = GetWord(a1 + 0x16) - a2 + (int)a1; + int v5 = GetWord(a1 + 0x1A); + int v6 = CalcCRC16((u8*)v4, v5 - a2 + (int)a1 - v4); + SetWord(a1 + 0x12, v6); + return TRUE; + } + + return FALSE; +} + +static u32 CalcRecordMixingGiftChecksum(void) +{ + u32 sum = 0; + int i; + char *data = (char *)&gSaveBlock1.recordMixingGift.data; + + for (i = 0; i < sizeof(gSaveBlock1.recordMixingGift.data); i++) + { + sum += data[i]; + } + + return sum; +} + +static bool32 IsRecordMixingGiftValid(void) +{ + struct RecordMixingGiftData *data = &gSaveBlock1.recordMixingGift.data; + + u32 checksum = CalcRecordMixingGiftChecksum(); + + if (!data->unk0) + return FALSE; + + if (!data->quantity) + return FALSE; + + if (!data->itemId) + return FALSE; + + if (checksum == 0) + return FALSE; + + if (checksum == gSaveBlock1.recordMixingGift.checksum) + return TRUE; + else + return FALSE; +} + +static void ClearRecordMixingGift(void) +{ + CpuFill16(0, &gSaveBlock1.recordMixingGift, sizeof(gSaveBlock1.recordMixingGift)); +} + +static void SetRecordMixingGift(u8 unk, u8 quantity, u16 itemId) +{ + if (!unk || !quantity || !itemId) + { + ClearRecordMixingGift(); + } + else + { + gSaveBlock1.recordMixingGift.data.unk0 = unk; + gSaveBlock1.recordMixingGift.data.quantity = quantity; + gSaveBlock1.recordMixingGift.data.itemId = itemId; + gSaveBlock1.recordMixingGift.checksum = CalcRecordMixingGiftChecksum(); + } +} + +u16 GetRecordMixingGift(void) +{ + struct RecordMixingGiftData *data = &gSaveBlock1.recordMixingGift.data; + + if (!IsRecordMixingGiftValid()) + { + ClearRecordMixingGift(); + return 0; + } + else + { + u16 itemId = data->itemId; + data->quantity--; + if (data->quantity == 0) + ClearRecordMixingGift(); + else + gSaveBlock1.recordMixingGift.checksum = CalcRecordMixingGiftChecksum(); + return itemId; + } +} + +bool8 MEScrCmd_end(struct ScriptContext *ctx) +{ + StopScript(ctx); + return TRUE; +} + +bool8 MEScrCmd_checkcompat(struct ScriptContext *ctx) +{ + u16 v1; + u32 v2; + u16 v3; + u32 v4; + + ctx->data[1] = ScriptReadWord(ctx); + v1 = ScriptReadHalfword(ctx); + v2 = ScriptReadWord(ctx); + v3 = ScriptReadHalfword(ctx); + v4 = ScriptReadWord(ctx); + + if (CheckCompatibility(v1, v2, v3, v4) == TRUE) + ctx->data[3] = 1; + else + SetIncompatible(); + + return TRUE; +} + +bool8 MEScrCmd_nop(struct ScriptContext *ctx) +{ + return FALSE; +} + +bool8 MEScrCmd_setstatus(struct ScriptContext *ctx) +{ + u8 value = ScriptReadByte(ctx); + ctx->data[2] = value; + return FALSE; +} + +bool8 MEScrCmd_setmsg(struct ScriptContext *ctx) +{ + u8 value = ScriptReadByte(ctx); + u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + if (value == 255 || value == ctx->data[2]) + StringExpandPlaceholders(gStringVar4, str); + return FALSE; +} + +bool8 MEScrCmd_runscript(struct ScriptContext *ctx) +{ + u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + ScriptContext2_RunNewScript(script); + return FALSE; +} + +bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx) +{ + u8 *str; + const u8 *message; + bool32 haveBerry = IsEnigmaBerryValid(); + u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + StringCopyN(gStringVar1, gSaveBlock1.enigmaBerry.berry.name, 7); + SetEnigmaBerry(berry); + StringCopyN(gStringVar2, gSaveBlock1.enigmaBerry.berry.name, 7); + + if (!haveBerry) + { + str = gStringVar4; + message = gOtherText_BerryObtainedDadHasIt; + } + else if (StringCompare(gStringVar1, gStringVar2)) + { + str = gStringVar4; + message = gOtherText_BerryTransformed; + } + else + { + str = gStringVar4; + message = gOtherText_BerryAlreadyObtained; + } + + StringExpandPlaceholders(str, message); + + ctx->data[2] = 2; + + if (IsEnigmaBerryValid() == TRUE) + VarSet(VAR_ENIGMA_BERRY_AVAILABLE, 1); + else + ctx->data[2] = 1; + + return FALSE; +} + +bool8 MEScrCmd_giveribbon(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + u8 ribbonId = ScriptReadByte(ctx); + GiveGiftRibbonToParty(index, ribbonId); + StringExpandPlaceholders(gStringVar4, gOtherText_SpecialRibbonReceived); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_initramscript(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 objectId = ScriptReadByte(ctx); + u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId); + return FALSE; +} + +bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx) +{ + EnableNationalPokedex(); + StringExpandPlaceholders(gStringVar4, gOtherText_DexUpgraded); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_addrareword(struct ScriptContext *ctx) +{ + sub_80EB890(ScriptReadByte(ctx)); + StringExpandPlaceholders(gStringVar4, gOtherText_RareWordAdded); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx) +{ + u8 unk = ScriptReadByte(ctx); + u8 quantity = ScriptReadByte(ctx); + u16 itemId = ScriptReadHalfword(ctx); + SetRecordMixingGift(unk, quantity, itemId); + return FALSE; +} + +bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) +{ + struct MailStruct mail; + struct Pokemon pokemon; + u16 species; + u16 heldItem; + u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; + void *pokemonPtr = (void *)data; + void *mailPtr = (void *)(data + sizeof(struct Pokemon)); + + pokemon = *(struct Pokemon *)pokemonPtr; + species = GetMonData(&pokemon, MON_DATA_SPECIES2); + + if (species == SPECIES_EGG) + StringCopyN(gStringVar1, gSystemText_Egg, 11); + else + StringCopyN(gStringVar1, gSystemText_Pokemon2, 11); + + if (gPlayerPartyCount == 6) + { + StringExpandPlaceholders(gStringVar4, gOtherText_PartyIsFull); + ctx->data[2] = 3; + } + else + { + memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon)); + memcpy(&mail, mailPtr, sizeof(struct MailStruct)); + + if (species != SPECIES_EGG) + { + u16 pokedexNum = SpeciesToNationalPokedexNum(species); + GetSetPokedexFlag(pokedexNum, 2); + GetSetPokedexFlag(pokedexNum, 3); + } + + heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM); + if (ItemIsMail(heldItem)) + GiveMailToMon2(&gPlayerParty[5], &mail); + party_compaction(); + CalculatePlayerPartyCount(); + StringExpandPlaceholders(gStringVar4, gOtherText_PokeWasSentOver); + ctx->data[2] = 2; + } + + return FALSE; +} + +bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx) +{ + u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; + memcpy(&gSaveBlock2.battleTower.ereaderTrainer, (void *)data, sizeof(gSaveBlock2.battleTower.ereaderTrainer)); + ValidateEReaderTrainer(); + StringExpandPlaceholders(gStringVar4, gOtherText_NewTrainerInHoenn); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx) +{ + EnableResetRTC(); + StringExpandPlaceholders(gStringVar4, gSystemText_ClockAdjustmentUsable); + ctx->data[2] = 2; + return FALSE; +} + +bool8 MEScrCmd_checksum(struct ScriptContext *ctx) +{ + int checksum = ScriptReadWord(ctx); + u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + if (checksum != CalcChecksum(data, dataEnd - data)) + { + ctx->data[3] = 0; + ctx->data[2] = 1; + } + return TRUE; +} + +bool8 MEScrCmd_crc(struct ScriptContext *ctx) +{ + int crc = ScriptReadWord(ctx); + u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]); + if (crc != CalcCRC16(data, dataEnd - data)) + { + ctx->data[3] = 0; + ctx->data[2] = 1; + } + return TRUE; +} diff --git a/src/name_string_util.c b/src/name_string_util.c new file mode 100644 index 000000000..32e9358e1 --- /dev/null +++ b/src/name_string_util.c @@ -0,0 +1,40 @@ +#include "global.h" +#include "name_string_util.h" +#include "string_util.h" +#include "text.h" + +void PadNameString(u8 *a1, u8 a2) +{ + u8 i; + + Text_StripExtCtrlCodes(a1); + i = StringLength(a1); + + if (a2 == 0xFC) + { + while (i < 6) + { + a1[i] = 0xFC; + a1[i + 1] = 7; + i += 2; + } + } + else + { + while (i < 6) + { + a1[i] = a2; + i++; + } + } + + a1[i] = EOS; +} + +void SanitizeNameString(u8 *a1) +{ + if (StringLength(a1) < 6) + ConvertInternationalString(a1, 1); + else + Text_StripExtCtrlCodes(a1); +} diff --git a/src/naming_screen.c b/src/naming_screen.c new file mode 100644 index 000000000..59b9b4d84 --- /dev/null +++ b/src/naming_screen.c @@ -0,0 +1,2167 @@ +#include "global.h" +#include "naming_screen.h" +#include "data2.h" +#include "graphics.h" +#include "field_effect.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokemon_icon.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "trig.h" +#include "util.h" +#include "ewram.h" + +#ifdef ENGLISH +#define COLUMN_COUNT 9 +#elif GERMAN +#define COLUMN_COUNT 10 +#endif + +extern u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality); + +const u8 gSpriteImage_83CE094[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp"); +const u8 gSpriteImage_83CE154[] = INCBIN_U8("graphics/naming_screen/pc_icon/1.4bpp"); + +struct NamingScreenData *const namingScreenDataPtr = &namingScreenData; + +extern const struct SubspriteTable gSubspriteTables_83CE558[]; +extern const struct SubspriteTable gSubspriteTables_83CE560[]; +extern const struct SubspriteTable gSubspriteTables_83CE578[]; +extern const struct SubspriteTable gSubspriteTables_83CE580[]; +extern const struct SpriteTemplate gSpriteTemplate_83CE5C8; +extern const struct SpriteTemplate gSpriteTemplate_83CE5E0; +extern const struct SpriteTemplate gSpriteTemplate_83CE5F8; +extern const struct SpriteTemplate gSpriteTemplate_83CE610; +extern const struct SpriteTemplate gSpriteTemplate_83CE628; +extern const struct SpriteTemplate gSpriteTemplate_83CE640; +extern const struct SpriteTemplate gSpriteTemplate_83CE658; +extern const struct SpriteTemplate gSpriteTemplate_83CE670; +extern const struct SpriteTemplate gSpriteTemplate_83CE688; +extern const struct SpriteSheet gUnknown_083CE6A0[]; +extern const struct SpritePalette gUnknown_083CE708[]; +extern const u8 gNamingScreenMenu_Gfx[]; +extern const u16 gUnknown_083CE748[]; +extern const u16 gUnknown_083CEBF8[]; +extern const u16 gUnknown_083CF0A8[]; +extern const u16 gUnknown_08E86258[]; + +static void C2_NamingScreen(void); +static void sub_80B5AA0(void); +static void StoreNamingScreenParameters(u8, u8 *, u16, u16, u32, MainCallback); +static void NamingScreen_TurnOffScreen(void); +static void NamingScreen_Init(void); +static void NamingScreen_ClearVram(void); +static void NamingScreen_ClearOam(void); +static void NamingScreen_SetUpVideoRegs(void); +static void NamingScreen_SetUpWindow(void); +static void NamingScreen_ResetObjects(void); +static void sub_80B5DFC(void); +static void sub_80B5E20(void); +static void sub_80B5E3C(void); +static void NamingScreen_InitDisplayMode(void); +static void Task_DoNothing(u8); +static void sub_80B7558(void); +static void sub_80B753C(void); +static void sub_80B7680(void); +static void sub_80B75C4(void); +static void sub_80B7794(void); +static void sub_80B78A8(void); +static void sub_80B7960(void); +static void CursorInit(void); +static void sub_80B6A80(void); +static void sub_80B6CA8(void); +static void sub_80B6D04(void); +static void sub_80B6E44(void); +static void InputInit(void); +static void sub_80B6438(void); +static void sub_80B5E50(void); +static void Task_NamingScreenMain(u8); +static void SetInputState(u8); +static void sub_80B68D8(u8); +static bool8 HandleKeyboardEvent(void); +static bool8 IsCursorAnimFinished(void); +static void MoveCursorToOKButton(void); +static void sub_80B6B14(void); +static void StartPageSwapAnim(void); +static void sub_80B6888(u8); +static void sub_80B6460(u8, u8, u8); +static bool8 IsPageSwapAnimNotInProgress(void); +static void sub_80B7614(void); +static void GetCursorPos(s16 *, s16 *); +static void SetCursorPos(s16, s16); +static void sub_80B77F8(void); +static void sub_80B74B0(void); +static void DisplaySentToPCMessage(void); +static u8 GetKeyRoleAtCursorPos(void); +static u8 sub_80B61C8(void); +static void DeleteTextCharacter(void); +static void sub_80B7090(void); +static u8 GetInputEvent(void); +static bool8 sub_80B7004(void); +static void sub_80B6914(void); +static void Task_HandlePageSwapAnim(u8); +static void sub_80B6C48(u8, struct Sprite *, struct Sprite *); +static u8 GetTextCaretPosition(void); +static u8 GetCharAtKeyboardPos(s16, s16); +static bool8 sub_80B7104(void); +static bool8 sub_80B713C(void); +static void AddTextCharacter(u8); +static bool8 sub_80B7198(u8); +static bool8 sub_80B7264(u8); +static void sub_80B7370(u8, u8); +static void sub_80B73CC(u8, u8); +static bool8 sub_80B71E4(u8); +static void sub_80B7474(u8, u8); +static void sub_80B72A4(u8, u8); +static bool8 sub_80B720C(u8); +static void sub_80B7568(void); +static void sub_80B75B0(void); +static void sub_80B7698(u16 *, const u16 *); +static void sub_80B76E0(); +static void nullsub_20(u8, u8); +static void PrintKeyboardCharacters(u8); + +void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +{ + StoreNamingScreenParameters(templateNum, destBuffer, c, d, e, returnCallback); + SetMainCallback2(C2_NamingScreen); +} + +static void C2_NamingScreen(void) +{ + switch (gMain.state) + { + case 0: + NamingScreen_TurnOffScreen(); + NamingScreen_Init(); + gMain.state++; + break; + case 1: + NamingScreen_ClearVram(); + gMain.state++; + break; + case 2: + NamingScreen_ClearOam(); + gMain.state++; + break; + case 3: + NamingScreen_SetUpVideoRegs(); + gMain.state++; + break; + case 4: + NamingScreen_SetUpWindow(); + gMain.state++; + break; + case 5: + NamingScreen_ResetObjects(); + gMain.state++; + break; + case 6: + sub_80B5DFC(); + gMain.state++; + break; + case 7: + sub_80B5E20(); + sub_80B5E3C(); + NamingScreen_InitDisplayMode(); + SetMainCallback2(sub_80B5AA0); + break; + } +} + +static void sub_80B5AA0(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB_NamingScreen(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_BG1VOFS = namingScreenDataPtr->bg1vOffset; + REG_BG2VOFS = namingScreenDataPtr->bg2vOffset; + REG_BG1CNT &= 0xFFFC; + REG_BG1CNT |= namingScreenDataPtr->unk8; + REG_BG2CNT &= 0xFFFC; + REG_BG2CNT |= namingScreenDataPtr->unkA; +} + +static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +{ + struct Task *task; + + //Create a task that does nothing, and use it as a temporary space to store parameters + task = &gTasks[CreateTask(Task_DoNothing, 0xFF)]; + task->data[0] = templateNum; + task->data[1] = c; + task->data[2] = d; + task->data[3] = e >> 16; + task->data[4] = e; + StoreWordInTwoHalfwords(&task->data[5], (u32)destBuffer); + StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback); +} + +static void GetNamingScreenParameters(void) +{ + u8 taskId; + struct Task *task; + + taskId = FindTaskIdByFunc(Task_DoNothing); + task = &gTasks[taskId]; + namingScreenDataPtr->templateNum = task->data[0]; + namingScreenDataPtr->unk3E = task->data[1]; + namingScreenDataPtr->unk40 = task->data[2]; + namingScreenDataPtr->unk42 = (task->data[3] << 16) | (u16)task->data[4]; + LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenDataPtr->destBuffer); + LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenDataPtr->returnCallback); + DestroyTask(taskId); +} + +static void Task_DoNothing(u8 taskId) +{ +} + +static void NamingScreen_TurnOffScreen(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +static void NamingScreen_InitDisplayMode(void) +{ + u16 savedIme; + + SetVBlankCallback(VBlankCB_NamingScreen); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +static void NamingScreen_ClearVram(void) +{ + DmaFill16Large(3, 0, (void *)VRAM, 0x10000, 0x1000); +} + +static void NamingScreen_ClearOam(void) +{ + DmaClear16(3, (void *)OAM, 0x400); +} + +static void NamingScreen_SetUpVideoRegs(void) +{ + REG_BG0CNT = 0; + REG_BG1CNT = 0; + REG_BG2CNT = 0; + REG_BG3CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(28) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(29) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BLDCNT = 0x640; + REG_BLDALPHA = 0x80C; +} + +static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; //forward declaration + +static void NamingScreen_Init(void) +{ + GetNamingScreenParameters(); + namingScreenDataPtr->state = 0; + namingScreenDataPtr->bg1vOffset = 0; + namingScreenDataPtr->bg2vOffset = 0; + namingScreenDataPtr->unk8 = 1; + namingScreenDataPtr->unkA = 2; + namingScreenDataPtr->unkC = 0; + namingScreenDataPtr->unkD = 1; + namingScreenDataPtr->template = sNamingScreenTemplates[namingScreenDataPtr->templateNum]; + namingScreenDataPtr->currentPage = namingScreenDataPtr->template->unk4; + namingScreenDataPtr->unk2 = 14 - namingScreenDataPtr->template->maxChars / 2; + namingScreenDataPtr->unk3C = gKeyRepeatStartDelay; + memset(namingScreenDataPtr->textBuffer, 0xFF, sizeof(namingScreenDataPtr->textBuffer)); + if (namingScreenDataPtr->template->unk0 != 0) + StringCopy(namingScreenDataPtr->textBuffer, namingScreenDataPtr->destBuffer); + gKeyRepeatStartDelay = 16; +} + +static void NamingScreen_SetUpWindow(void) +{ + Text_LoadWindowTemplate(&gWindowTemplate_81E6E88); + InitMenuWindow(&gWindowTemplate_81E6E88); +} + +static void NamingScreen_ResetObjects(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); +} + +static void sub_80B5DFC(void) +{ + sub_80B7558(); + sub_80B753C(); + sub_80B7680(); + sub_80B75C4(); + sub_80B7794(); + sub_80B78A8(); + sub_80B7960(); +} + +static void sub_80B5E20(void) +{ + CursorInit(); + sub_80B6A80(); + sub_80B6CA8(); + sub_80B6D04(); + sub_80B6E44(); +} + +static void sub_80B5E3C(void) +{ + InputInit(); + sub_80B6438(); + sub_80B5E50(); +} + +//-------------------------------------------------- +// Naming screen main +//-------------------------------------------------- + +static bool8 MainState_BeginFadeIn(struct Task *); +static bool8 MainState_WaitFadeIn(struct Task *); +static bool8 MainState_HandleInput(struct Task *); +static bool8 MainState_MoveToOKButton(struct Task *); +static bool8 MainState_StartPageSwap(struct Task *); +static bool8 MainState_WaitPageSwap(struct Task *); +static bool8 MainState_6(struct Task *); +static bool8 MainState_UpdateSentToPCMessage(struct Task *); +static bool8 MainState_BeginFadeInOut(struct Task *); +static bool8 MainState_WaitFadeOutAndExit(struct Task *); + +static bool8 (*const sMainStateFuncs[])(struct Task *) = +{ + MainState_BeginFadeIn, + MainState_WaitFadeIn, + MainState_HandleInput, + MainState_MoveToOKButton, + MainState_StartPageSwap, + MainState_WaitPageSwap, + MainState_6, + MainState_UpdateSentToPCMessage, + MainState_BeginFadeInOut, + MainState_WaitFadeOutAndExit, +}; + +static void sub_80B5E50(void) +{ + u8 taskId; + + taskId = CreateTask(Task_NamingScreenMain, 2); + Task_NamingScreenMain(taskId); +} + +static void Task_NamingScreenMain(u8 taskId) +{ + while (sMainStateFuncs[namingScreenDataPtr->state](&gTasks[taskId]) != 0) + ; +} + +static bool8 MainState_BeginFadeIn(struct Task *task) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + namingScreenDataPtr->state++; + return 0; +} + +static bool8 MainState_WaitFadeIn(struct Task *task) +{ + if (!gPaletteFade.active) + { + SetInputState(INPUT_STATE_ENABLED); + sub_80B68D8(1); + namingScreenDataPtr->state++; + } + return FALSE; +} + +static bool8 MainState_HandleInput(struct Task *task) +{ + return HandleKeyboardEvent(); +} + +static bool8 MainState_MoveToOKButton(struct Task *task) +{ + if (IsCursorAnimFinished()) + { + SetInputState(INPUT_STATE_ENABLED); + MoveCursorToOKButton(); + namingScreenDataPtr->state = MAIN_STATE_HANDLE_INPUT; + } + return FALSE; +} + +static bool8 MainState_StartPageSwap(struct Task *task) +{ + SetInputState(INPUT_STATE_DISABLED); + sub_80B6B14(); + StartPageSwapAnim(); + sub_80B6888(1); + sub_80B6460(0, 0, 1); + PlaySE(SE_WIN_OPEN); + namingScreenDataPtr->state = MAIN_STATE_WAIT_PAGE_SWAP; + return FALSE; +} + +static bool8 MainState_WaitPageSwap(struct Task *task) +{ + s16 cursorX; + s16 cursorY; + + if (IsPageSwapAnimNotInProgress()) + { + namingScreenDataPtr->state = MAIN_STATE_HANDLE_INPUT; + namingScreenDataPtr->currentPage++; + namingScreenDataPtr->currentPage %= 3; + sub_80B7614(); + sub_80B77F8(); + SetInputState(INPUT_STATE_ENABLED); + GetCursorPos(&cursorX, &cursorY); +#if ENGLISH + if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) + cursorX = 5; +#elif GERMAN + if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 7 || cursorX == 8)) + cursorX = 6; +#endif + SetCursorPos(cursorX, cursorY); + sub_80B6888(0); + } + return FALSE; +} + +static bool8 MainState_6(struct Task *task) +{ + sub_80B74B0(); + SetInputState(INPUT_STATE_DISABLED); + sub_80B68D8(0); + sub_80B6460(3, 0, 1); + gKeyRepeatStartDelay = namingScreenDataPtr->unk3C; + if (namingScreenDataPtr->templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME + && CalculatePlayerPartyCount() >= 6) + { + DisplaySentToPCMessage(); + namingScreenDataPtr->state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE; + return FALSE; + } + else + { + namingScreenDataPtr->state = MAIN_STATE_BEGIN_FADE_OUT; + return TRUE; //Exit the naming screen + } +} + +static bool8 MainState_UpdateSentToPCMessage(struct Task *task) +{ + if (Menu_UpdateWindowText()) + namingScreenDataPtr->state++; + return FALSE; +} + +static bool8 MainState_BeginFadeInOut(struct Task *task) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + namingScreenDataPtr->state++; + return FALSE; +} + +static bool8 MainState_WaitFadeOutAndExit(struct Task *task) +{ + if (!gPaletteFade.active) + SetMainCallback2(namingScreenDataPtr->returnCallback); + return FALSE; +} + +//-------------------------------------------------- +// Keyboard handling +//-------------------------------------------------- + +enum +{ + KEY_ROLE_CHAR, + KEY_ROLE_PAGE, + KEY_ROLE_BACKSPACE, + KEY_ROLE_OK, +}; + + +static bool8 KeyboardKeyHandler_Character(u8); +static bool8 KeyboardKeyHandler_Page(u8); +static bool8 KeyboardKeyHandler_Backspace(u8); +static bool8 KeyboardKeyHandler_OK(u8); + +static bool8 (*const sKeyboardKeyHandlers[])(u8) = +{ + KeyboardKeyHandler_Character, + KeyboardKeyHandler_Page, + KeyboardKeyHandler_Backspace, + KeyboardKeyHandler_OK, +}; + +static bool8 HandleKeyboardEvent(void) +{ + u8 event = GetInputEvent(); + u8 keyRole = GetKeyRoleAtCursorPos(); + + if (event == KBEVENT_PRESSED_SELECT) + return sub_80B61C8(); + else if (event == KBEVENT_PRESSED_B) + { + DeleteTextCharacter(); + return FALSE; + } + else if (event == 7) + { + sub_80B7090(); + return FALSE; + } + return sKeyboardKeyHandlers[keyRole](event); +} + +static bool8 KeyboardKeyHandler_Character(u8 event) +{ + sub_80B6460(3, 0, 0); + if (event == KBEVENT_PRESSED_A) + { + u8 var = sub_80B7004(); + + sub_80B6914(); + if (var) + { + SetInputState(INPUT_STATE_DISABLED); + namingScreenDataPtr->state = MAIN_STATE_MOVE_TO_OK_BUTTON; + } + } + return FALSE; +} + +static bool8 KeyboardKeyHandler_Page(u8 event) +{ + sub_80B6460(0, 1, 0); + if (event == KBEVENT_PRESSED_A) + return sub_80B61C8(); + else + return FALSE; +} + +static bool8 KeyboardKeyHandler_Backspace(u8 event) +{ + sub_80B6460(1, 1, 0); + if (event == KBEVENT_PRESSED_A) + DeleteTextCharacter(); + return FALSE; +} + +static bool8 KeyboardKeyHandler_OK(u8 event) +{ + sub_80B6460(2, 1, 0); + if (event == KBEVENT_PRESSED_A) + { + PlaySE(SE_SELECT); + namingScreenDataPtr->state = MAIN_STATE_6; + return TRUE; + } + else + return FALSE; +} + +static bool8 sub_80B61C8(void) +{ + namingScreenDataPtr->state = MAIN_STATE_START_PAGE_SWAP; + return TRUE; +} + +//-------------------------------------------------- +// Input handling +//-------------------------------------------------- + +enum +{ + FNKEY_CASE, + FNKEY_BACK, + FNKEY_OK, +}; + +#define tState data[0] +#define tKeyboardEvent data[1] +#define tKbFunctionKey data[2] + +static void InputState_Disabled(struct Task *); +static void InputState_Enabled(struct Task *); + +static void (*const sInputStateFuncs[])(struct Task *) = +{ + InputState_Disabled, + InputState_Enabled, +}; + +static void Task_HandleInput(u8); +static void HandleDpadMovement(struct Task *); + +static void InputInit(void) +{ + CreateTask(Task_HandleInput, 1); +} + +static u8 GetInputEvent(void) +{ + u8 taskId = FindTaskIdByFunc(Task_HandleInput); + + return gTasks[taskId].tKeyboardEvent; +} + +static void SetInputState(u8 state) +{ + u8 taskId = FindTaskIdByFunc(Task_HandleInput); + + gTasks[taskId].tState = state; +} + +static void Task_HandleInput(u8 taskId) +{ + sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]); +} + +static void InputState_Disabled(struct Task *task) +{ + task->tKeyboardEvent = 0; +} + +static void InputState_Enabled(struct Task *task) +{ + task->tKeyboardEvent = 0; + if (gMain.newKeys & A_BUTTON) + { + task->tKeyboardEvent = KBEVENT_PRESSED_A; + return; + } + if (gMain.newKeys & B_BUTTON) + { + task->tKeyboardEvent = KBEVENT_PRESSED_B; + return; + } + if (gMain.newKeys & SELECT_BUTTON) + { + task->tKeyboardEvent = KBEVENT_PRESSED_SELECT; + return; + } + if (gMain.newKeys & START_BUTTON) + { + task->tKeyboardEvent = KBEVENT_PRESSED_START; + MoveCursorToOKButton(); + return; + } + HandleDpadMovement(task); +} + +static const s16 sDpadDeltaX[] = +{ + 0, //none + 0, //up + 0, //down + -1, //left + 1 //right +}; + +static const s16 sDpadDeltaY[] = +{ + 0, //none + -1, //up + 1, //down + 0, //left + 0 //right +}; + +static const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2}; +static const s16 gUnknown_083CE274[] = {0, 0, 3, 0}; + +static void HandleDpadMovement(struct Task *task) +{ + s16 cursorX; + s16 cursorY; + u16 dpadDir; + s16 prevCursorX; + + GetCursorPos(&cursorX, &cursorY); + dpadDir = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + dpadDir = 1; + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + dpadDir = 2; + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + dpadDir = 3; + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + dpadDir = 4; + + //Get new cursor position + prevCursorX = cursorX; + cursorX += sDpadDeltaX[dpadDir]; + cursorY += sDpadDeltaY[dpadDir]; + + //Wrap cursor position in the X direction + if (cursorX < 0) + cursorX = COLUMN_COUNT - 1; + if (cursorX > COLUMN_COUNT - 1) + cursorX = 0; + + //Handle cursor movement in X direction + if (sDpadDeltaX[dpadDir] != 0) + { + //The "others" page only has 5 columns +#if ENGLISH + if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) +#elif GERMAN + if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7 || cursorX == 8)) +#endif + { + if (sDpadDeltaX[dpadDir] > 0) + cursorX = COLUMN_COUNT - 1; + else + cursorX = 5; + } + + if (cursorX == COLUMN_COUNT - 1) + { + //We are now on the last column + task->tKbFunctionKey = cursorY; + cursorY = s4RowTo3RowTableY[cursorY]; + } + else if (prevCursorX == COLUMN_COUNT - 1) + { + if (cursorY == 1) + cursorY = task->tKbFunctionKey; + else + cursorY = gUnknown_083CE274[cursorY]; + } + } + + if (cursorX == COLUMN_COUNT - 1) + { + //There are only 3 keys on the last column, unlike the others, + //so wrap Y accordingly + if (cursorY < 0) + cursorY = 2; + if (cursorY > 2) + cursorY = 0; + if (cursorY == 0) + task->tKbFunctionKey = FNKEY_BACK; + else if (cursorY == 2) + task->tKbFunctionKey = FNKEY_OK; + } + else + { + if (cursorY < 0) + cursorY = 3; + if (cursorY > 3) + cursorY = 0; + } + SetCursorPos(cursorX, cursorY); +} + +#undef tState +#undef tKeyboardEvent +#undef tKbFunctionKey + +//-------------------------------------------------- +// +//-------------------------------------------------- + +static void Task_80B64D4(u8); +static u16 sub_80B654C(u8); +static void sub_80B65AC(u8); +static void sub_80B65D4(struct Task *, u8, u8); + +static void sub_80B6438(void) +{ + u8 taskId; + + taskId = CreateTask(Task_80B64D4, 3); + gTasks[taskId].data[0] = 3; +} + +static void sub_80B6460(u8 a, u8 b, u8 c) +{ + struct Task *task = &gTasks[FindTaskIdByFunc(Task_80B64D4)]; + + if (a == task->data[0] && c == 0) + { + task->data[1] = b; + task->data[2] = 1; + return; + } + if (a == 3 && task->data[1] == 0 && c == 0) + return; + if (task->data[0] != 3) + sub_80B65AC(task->data[0]); + sub_80B65D4(task, a, b); +} + +static void Task_80B64D4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (task->data[0] == 3 || task->data[2] == 0) + return; + MultiplyInvertedPaletteRGBComponents(sub_80B654C(task->data[0]), task->data[3], task->data[3], task->data[3]); + if (task->data[5] != 0) + { + task->data[5]--; + if (task->data[5] != 0) + return; + } + task->data[5] = 2; + task->data[3] += task->data[4]; + if (task->data[3] == 16) + task->data[4] = -task->data[4]; + else if (task->data[3] == 0) + { + task->data[2] = task->data[1]; + task->data[4] = -task->data[4]; + } +} + +static u16 sub_80B654C(u8 a) +{ + const u16 arr[] = + { + IndexOfSpritePaletteTag(4) * 16 + 0x10E, + IndexOfSpritePaletteTag(6) * 16 + 0x10C, + IndexOfSpritePaletteTag(6) * 16 + 0x10E, + }; + + return arr[a]; +} + +static void sub_80B65AC(u8 a) +{ + u16 index = sub_80B654C(a); + + gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; +} + +static void sub_80B65D4(struct Task *task, u8 b, u8 c) +{ + task->data[0] = b; + task->data[1] = c; + task->data[2] = 1; + task->data[3] = 15; + task->data[4] = 1; + task->data[5] = 0; +} + +//-------------------------------------------------- +// Page Swap +//-------------------------------------------------- + +#define tState data[0] +#define tFrameCount data[1] + +static bool8 PageSwapAnimState_Init(struct Task *); +static bool8 PageSwapAnimState_1(struct Task *); +static bool8 PageSwapAnimState_2(struct Task *); +static bool8 PageSwapAnimState_Done(struct Task *); + +static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = +{ + PageSwapAnimState_Init, + PageSwapAnimState_1, + PageSwapAnimState_2, + PageSwapAnimState_Done, +}; + +static void StartPageSwapAnim(void) +{ + u8 taskId; + + taskId = CreateTask(Task_HandlePageSwapAnim, 0); + Task_HandlePageSwapAnim(taskId); +} + +static bool8 IsPageSwapAnimNotInProgress(void) +{ + if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF) + return TRUE; + else + return FALSE; +} + +static void Task_HandlePageSwapAnim(u8 taskId) +{ + while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0) + ; +} + +static bool8 PageSwapAnimState_Init(struct Task *task) +{ + namingScreenDataPtr->bg1vOffset = 0; + namingScreenDataPtr->bg2vOffset = 0; + task->tState++; + return 0; +} + +static bool8 PageSwapAnimState_1(struct Task *task) +{ + u16 *const arr[] = + { + &namingScreenDataPtr->bg2vOffset, + &namingScreenDataPtr->bg1vOffset + }; + + task->tFrameCount += 4; + *arr[namingScreenDataPtr->unkC] = Sin(task->tFrameCount, 40); + *arr[namingScreenDataPtr->unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); + if (task->tFrameCount >= 64) + { + u8 temp = namingScreenDataPtr->unk8; //Why u8 and not u16? + + namingScreenDataPtr->unk8 = namingScreenDataPtr->unkA; + namingScreenDataPtr->unkA = temp; + task->tState++; + } + return 0; +} + +static bool8 PageSwapAnimState_2(struct Task *task) +{ + u16 *const arr[] = {&namingScreenDataPtr->bg2vOffset, &namingScreenDataPtr->bg1vOffset}; + + task->tFrameCount += 4; + *arr[namingScreenDataPtr->unkC] = Sin(task->tFrameCount, 40); + *arr[namingScreenDataPtr->unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); + if (task->tFrameCount >= 128) + { + u8 temp = namingScreenDataPtr->unkC; + + namingScreenDataPtr->unkC = namingScreenDataPtr->unkD; + namingScreenDataPtr->unkD = temp; + task->tState++; + } + return 0; +} + +static bool8 PageSwapAnimState_Done(struct Task *task) +{ + DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim)); + return 0; +} + +#undef tState +#undef tFrameCount + +//-------------------------------------------------- +// Cursor +//-------------------------------------------------- + +static void CursorInit(void) +{ + namingScreenDataPtr->cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); + gSprites[namingScreenDataPtr->cursorSpriteId].oam.priority = 1; + gSprites[namingScreenDataPtr->cursorSpriteId].oam.objMode = 1; + gSprites[namingScreenDataPtr->cursorSpriteId].data[6] = 1; + gSprites[namingScreenDataPtr->cursorSpriteId].data[6] = 2; + SetCursorPos(0, 0); +} + +static const u8 sKeyboardSymbolPositions[][COLUMN_COUNT] = { +#if ENGLISH + {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Upper page + {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Lower page + {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page +#elif GERMAN + {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Upper page + {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Lower page + {1, 4, 7, 10, 13, 16, 16, 16, 16, 19}, //Others page +#endif +}; + +static u8 CursorColToKeyboardCol(s16 x) +{ + return sKeyboardSymbolPositions[namingScreenDataPtr->currentPage][x]; +} + +static void SetCursorPos(s16 x, s16 y) +{ + struct Sprite *cursorSprite = &gSprites[namingScreenDataPtr->cursorSpriteId]; + + cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27; + cursorSprite->pos1.y = y * 16 + 80; + cursorSprite->data[2] = cursorSprite->data[0]; + cursorSprite->data[3] = cursorSprite->data[1]; + cursorSprite->data[0] = x; + cursorSprite->data[1] = y; +} + +static void GetCursorPos(s16 *x, s16 *y) +{ + struct Sprite *cursorSprite = &gSprites[namingScreenDataPtr->cursorSpriteId]; + + *x = cursorSprite->data[0]; + *y = cursorSprite->data[1]; +} + +static void MoveCursorToOKButton(void) +{ + SetCursorPos(COLUMN_COUNT - 1, 2); +} + +static void sub_80B6888(u8 a) +{ + gSprites[namingScreenDataPtr->cursorSpriteId].data[4] &= -256; + gSprites[namingScreenDataPtr->cursorSpriteId].data[4] |= a; + StartSpriteAnim(&gSprites[namingScreenDataPtr->cursorSpriteId], 0); +} + +static void sub_80B68D8(u8 a) +{ + gSprites[namingScreenDataPtr->cursorSpriteId].data[4] &= 0xFF; + gSprites[namingScreenDataPtr->cursorSpriteId].data[4] |= a << 8; +} + +static void sub_80B6914(void) +{ + StartSpriteAnim(&gSprites[namingScreenDataPtr->cursorSpriteId], 1); +} + +static bool8 IsCursorAnimFinished(void) +{ + return gSprites[namingScreenDataPtr->cursorSpriteId].animEnded; +} + +static u8 GetKeyRoleAtCursorPos(void) +{ + const u8 keyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK}; + s16 cursorX; + s16 cursorY; + + GetCursorPos(&cursorX, &cursorY); + if (cursorX < COLUMN_COUNT - 1) + return KEY_ROLE_CHAR; + else + return keyRoles[cursorY]; +} + +void sub_80B6998(struct Sprite *sprite) +{ + if (sprite->animEnded) + StartSpriteAnim(sprite, 0); + sprite->invisible = (sprite->data[4] & 0xFF); + if (sprite->data[0] == COLUMN_COUNT - 1) + sprite->invisible = TRUE; + if (sprite->invisible || (sprite->data[4] & 0xFF00) == 0 + || sprite->data[0] != sprite->data[2] || sprite->data[1] != sprite->data[3]) + { + sprite->data[5] = 0; + sprite->data[6] = 1; + sprite->data[7] = 2; + } + sprite->data[7]--; + if (sprite->data[7] == 0) + { + sprite->data[5] += sprite->data[6]; + if (sprite->data[5] == 16 || sprite->data[5] == 0) + sprite->data[6] = -sprite->data[6]; + sprite->data[7] = 2; + } + if ((sprite->data[4] & 0xFF00) != 0) + { + s8 gb = sprite->data[5]; + s8 r = sprite->data[5] >> 1; + u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101; + + MultiplyInvertedPaletteRGBComponents(index, r, gb, gb); + } +} + +static void sub_80B6A80(void) +{ + u8 spriteId1; + u8 spriteId2; + u8 spriteId3; + + spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0); + namingScreenDataPtr->unk10 = spriteId1; + SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558); + + spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1); + gSprites[spriteId1].data[6] = spriteId2; + SetSubspriteTables(&gSprites[spriteId2], gSubspriteTables_83CE560); + + spriteId3 = CreateSprite(&gSpriteTemplate_83CE5E0, 0xCC, 0x4B, 2); + gSprites[spriteId3].oam.priority = 1; + gSprites[spriteId1].data[7] = spriteId3; +} + +static void sub_80B6B14(void) +{ + struct Sprite *sprite = &gSprites[namingScreenDataPtr->unk10]; + + sprite->data[0] = 2; + sprite->data[1] = namingScreenDataPtr->currentPage; +} + +static u8 sub_80B6B5C(struct Sprite *); +static u8 sub_80B6B98(struct Sprite *); +static u8 sub_80B6B9C(struct Sprite *); +static u8 sub_80B6C08(struct Sprite *); + +static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) = +{ + sub_80B6B5C, + sub_80B6B98, + sub_80B6B9C, + sub_80B6C08, +}; + +void sub_80B6B34(struct Sprite *sprite) +{ + while (gUnknown_083CE2B4[sprite->data[0]](sprite) != 0) + ; +} + +static u8 sub_80B6B5C(struct Sprite *sprite) +{ + struct Sprite *sprite1 = &gSprites[sprite->data[6]]; + struct Sprite *sprite2 = &gSprites[sprite->data[7]]; + + sub_80B6C48(namingScreenDataPtr->currentPage, sprite1, sprite2); + sprite->data[0]++; + return 0; +} + +static u8 sub_80B6B98(struct Sprite *sprite) +{ + return 0; +} + +static u8 sub_80B6B9C(struct Sprite *sprite) +{ + struct Sprite *r4 = &gSprites[sprite->data[6]]; + struct Sprite *r5 = &gSprites[sprite->data[7]]; + + r4->pos2.y++; + if (r4->pos2.y > 7) + { + sprite->data[0]++; + r4->pos2.y = -4; + r4->invisible = TRUE; + sub_80B6C48(((u8)sprite->data[1] + 1) % 3, r4, r5); + } + return 0; +} + +static u8 sub_80B6C08(struct Sprite *sprite) +{ + struct Sprite *r2 = &gSprites[sprite->data[6]]; + + r2->invisible = FALSE; + r2->pos2.y++; + if (r2->pos2.y >= 0) + { + r2->pos2.y = 0; + sprite->data[0] = 1; + } + return 0; +} + +static const u16 gUnknown_083CE2C4[] = {1, 3, 2}; +static const u16 gUnknown_083CE2CA[] = {4, 6, 5}; + +static void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) +{ + c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083CE2C4[a]); + b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_083CE2CA[a]); + b->subspriteTableNum = a; +} + +// + +static void sub_80B6CA8(void) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83CE610, 0xCC, 0x6C, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); + + spriteId = CreateSprite(&gSpriteTemplate_83CE628, 0xCC, 0x84, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); +} + +static void sub_80B6D04(void) +{ + u8 spriteId; + s16 r1; + u8 i; + + r1 = (namingScreenDataPtr->unk2 - 1) * 8 + 4; + spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0); + gSprites[spriteId].oam.priority = 3; + r1 = namingScreenDataPtr->unk2 * 8 + 4; + for (i = 0; i < namingScreenDataPtr->template->maxChars; i++, r1 += 8) + { + spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0); + gSprites[spriteId].oam.priority = 3; + gSprites[spriteId].data[0] = i; + } +} + +void sub_80B6D9C(struct Sprite *sprite) +{ + const s16 arr[] = {0, -4, -2, -1}; + + if (sprite->data[0] == 0 || --sprite->data[0] == 0) + { + sprite->data[0] = 8; + sprite->data[1] = (sprite->data[1] + 1) & 3; + } + sprite->pos2.x = arr[sprite->data[1]]; +} + +void sub_80B6DE8(struct Sprite *sprite) +{ + const s16 arr[] = {2, 3, 2, 1}; + u8 var; + + var = GetTextCaretPosition(); + if (var != (u8)sprite->data[0]) + { + sprite->pos2.y = 0; + sprite->data[1] = 0; + sprite->data[2] = 0; + } + else + { + sprite->pos2.y = arr[sprite->data[1]]; + sprite->data[2]++; + if (sprite->data[2] > 8) + { + sprite->data[1] = (sprite->data[1] + 1) & 3; + sprite->data[2] = 0; + } + } +} + +// + +static void nullsub_40(void); +static void sub_80B6E68(void); +static void sub_80B6EBC(void); +static void sub_80B6EFC(void); + +static void (*const gUnknown_083CE2E0[])(void) = +{ + nullsub_40, + sub_80B6E68, + sub_80B6EBC, + sub_80B6EFC, +}; + +static void sub_80B6E44(void) +{ + gUnknown_083CE2E0[namingScreenDataPtr->template->unk2](); +} + +static void nullsub_40(void) +{ +} + +static void sub_80B6E68(void) +{ + u8 rivalGfxId; + u8 spriteId; + + rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenDataPtr->unk3E); + spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0); + gSprites[spriteId].oam.priority = 3; + StartSpriteAnim(&gSprites[spriteId], 4); +} + +static void sub_80B6EBC(void) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83CE688, 0x34, 0x18, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE580); + gSprites[spriteId].oam.priority = 3; +} + +static void sub_80B6EFC(void) +{ + u8 spriteId; + + sub_809D51C(); + spriteId = CreateMonIcon(namingScreenDataPtr->unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenDataPtr->unk42); + gSprites[spriteId].oam.priority = 3; +} + +static u8 GetTextCaretPosition(void) +{ + u8 i; + + for (i = 0; i < namingScreenDataPtr->template->maxChars; i++) + { + if (namingScreenDataPtr->textBuffer[i] == EOS) + return i; + } + return namingScreenDataPtr->template->maxChars - 1; +} + +static u8 GetPreviousTextCaretPosition(void) +{ + s8 i; + + for (i = namingScreenDataPtr->template->maxChars - 1; i > 0; i--) + { + if (namingScreenDataPtr->textBuffer[i] != EOS) + return i; + } + return 0; +} + +static void DeleteTextCharacter(void) +{ + u8 index; + u8 var2; + + index = GetPreviousTextCaretPosition(); + namingScreenDataPtr->textBuffer[index] = 0; + sub_80B7960(); + namingScreenDataPtr->textBuffer[index] = EOS; + var2 = GetKeyRoleAtCursorPos(); + if (var2 == 0 || var2 == 2) + sub_80B6460(1, 0, 1); + PlaySE(SE_BOWA); +} + +static bool8 sub_80B7004(void) +{ + s16 x; + s16 y; + u8 ch; + bool8 r4; + + GetCursorPos(&x, &y); + x = CursorColToKeyboardCol(x); + ch = GetCharAtKeyboardPos(x, y); + r4 = 1; + if (ch == 0xFF) + r4 = sub_80B7104(); + else if (ch == 0xFE) + r4 = sub_80B713C(); + else + AddTextCharacter(ch); + sub_80B7960(); + PlaySE(SE_SELECT); + if (r4) + { + if (GetPreviousTextCaretPosition() == namingScreenDataPtr->template->maxChars - 1) + return TRUE; + } + return FALSE; +} + +static void sub_80B7090(void) // DoInput? +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenDataPtr->textBuffer[r5]; + if (sub_80B7198(r4)) + { + if (sub_80B7264(r4)) + sub_80B7370(r4, r5); + else + sub_80B73CC(r4, r5); + } + else + { + if (sub_80B71E4(r4)) + sub_80B7474(r4, r5); + else + sub_80B72A4(r4, r5); + } + sub_80B7960(); + PlaySE(SE_SELECT); +} + +static bool8 sub_80B7104(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenDataPtr->textBuffer[r5]; + if (sub_80B720C(r4)) + { + sub_80B72A4(r4, r5); + return TRUE; + } + return FALSE; +} + +static bool8 sub_80B713C(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenDataPtr->textBuffer[r5]; + if (sub_80B7264(r4)) + { + sub_80B7370(r4, r5); + return TRUE; + } + return FALSE; +} + +static void AddTextCharacter(u8 ch) +{ + u8 index = GetTextCaretPosition(); + + namingScreenDataPtr->textBuffer[index] = ch; +} + +static bool8 sub_80B7198(u8 a) +{ + if ((a >= 55 && a <= 74) + || (a >= 135 && a <= 139) + || (a >= 140 && a <= 144) + || (a >= 145 && a <= 149) + || (a >= 150 && a <= 154)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B71E4(u8 a) +{ + if ((a >= 75 && a <= 79) + || (a >= 155 && a <= 159)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B720C(u8 a) +{ + if ((a >= 6 && a <= 20) + || (a >= 26 && a <= 30) + || (a >= 75 && a <= 79) + || (a >= 86 && a <= 100) + || (a >= 106 && a <= 110) + || (a >= 155 && a <= 159)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B7264(u8 a) +{ + if ((a >= 26 && a <= 30) + || (a >= 70 && a <= 74) + || (a >= 106 && a <= 110) + || (a >= 150 && a <= 154)) + return TRUE; + else + return FALSE; +} + +static void sub_80B72A4(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 6 && a <= 10) + chr = a + 0x31; + else if (a >= 11 && a <= 15) + chr = a + 0x31; + else if (a >= 16 && a <= 20) + chr = a + 0x31; + else if (a >= 26 && a <= 30) + chr = a + 0x2C; + else if (a >= 75 && a <= 79) + chr = a + 0xFB; + else if (a >= 86 && a <= 90) + chr = a + 0x31; + else if (a >= 91 && a <= 95) + chr = a + 0x31; + else if (a >= 96 && a <= 100) + chr = a + 0x31; + else if (a >= 106 && a <= 110) + chr = a + 0x2C; + else if (a >= 155 && a <= 159) + chr = a + 0xFB; + namingScreenDataPtr->textBuffer[b] = chr; +} + +static void sub_80B7370(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 26 && a <= 30) + chr = a + 0x31; + else if (a >= 70 && a <= 74) + chr = a + 5; + else if (a >= 106 && a <= 110) + chr = a + 0x31; + else if (a >= 150 && a <= 154) + chr = a + 5; + namingScreenDataPtr->textBuffer[b] = chr; +} + +static void sub_80B73CC(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 55 && a <= 59) + chr = a + 0xCF; + else if (a >= 60 && a <= 64) + chr = a + 0xCF; + else if (a >= 65 && a <= 69) + chr = a + 0xCF; + else if (a >= 70 && a <= 74) + chr = a + 0xD4; + else if (a >= 135 && a <= 139) + chr = a + 0xCF; + else if (a >= 140 && a <= 144) + chr = a + 0xCF; + else if (a >= 145 && a <= 149) + chr = a + 0xCF; + else if (a >= 150 && a <= 154) + chr = a + 0xD4; + namingScreenDataPtr->textBuffer[b] = chr; +} + +static void sub_80B7474(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 75 && a <= 79) + chr = a + 0xCF; + else if (a >= 155 && a <= 159) + chr = a + 0xCF; + namingScreenDataPtr->textBuffer[b] = chr; +} + +static void sub_80B74B0(void) +{ + u8 i; + + for (i = 0; i < namingScreenDataPtr->template->maxChars; i++) + { + if (namingScreenDataPtr->textBuffer[i] != 0 && namingScreenDataPtr->textBuffer[i] != 0xFF) + { + StringCopyN(namingScreenDataPtr->destBuffer, namingScreenDataPtr->textBuffer, namingScreenDataPtr->template->maxChars + 1); + break; + } + } +} + +static void DisplaySentToPCMessage(void) +{ + StringCopy(gStringVar1, namingScreenDataPtr->destBuffer); + StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC); + BasicInitMenuWindow(&gWindowTemplate_81E6E88); + Menu_DisplayDialogueFrame(); + MenuPrintMessageDefaultCoords(gStringVar4); +} + +static void sub_80B753C(void) +{ + LoadSpriteSheets(gUnknown_083CE6A0); + LoadSpritePalettes(gUnknown_083CE708); +} + +static void sub_80B7558(void) +{ + sub_80B7568(); + sub_80B75B0(); +} + +static void sub_80B7568(void) +{ + DmaCopy16Defvars(3, gNamingScreenMenu_Gfx, (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32), 0x800); + DmaCopy16Defvars(3, gNamingScreenMenu_Gfx, (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32), 0x800); +} + +static void sub_80B75B0(void) +{ + LoadPalette(gNamingScreenPalettes, 0, 0x80); +} + +static void sub_80B7650(u16 *); +static void sub_80B7660(u16 *); +static void sub_80B7670(u16 *); + +static void (*const gUnknown_083CE2F0[][2])(u16 *) = +{ + {sub_80B7660, sub_80B7650}, + {sub_80B7650, sub_80B7670}, + {sub_80B7670, sub_80B7660}, +}; + +static void sub_80B75C4(void) +{ + u16 *const arr[] = + { + (u16 *)(VRAM + 0xE000), + (u16 *)(VRAM + 0xE800), + }; + + gUnknown_083CE2F0[namingScreenDataPtr->currentPage][0](arr[namingScreenDataPtr->unkC]); + gUnknown_083CE2F0[namingScreenDataPtr->currentPage][1](arr[namingScreenDataPtr->unkD]); +} + +static void sub_80B7614(void) +{ + u16 *const arr[] = + { + (u16 *)(VRAM + 0xE000), + (u16 *)(VRAM + 0xE800), + }; + + gUnknown_083CE2F0[namingScreenDataPtr->currentPage][1](arr[namingScreenDataPtr->unkD]); +} + +static void sub_80B7650(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CE748); +} + +static void sub_80B7660(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CEBF8); +} + +static void sub_80B7670(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CF0A8); +} + +static void sub_80B7680(void) +{ + sub_80B76E0(VRAM + 0xF000, gUnknown_08E86258); +} + +static void sub_80B7698(u16 *vramBuffer, const u16 *src) +{ + s16 i; + s16 j; + + for (i = 0; i < 20; i++) + { + for (j = 0; j < 30; j++, src++) + { + vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; + } + } +} + +static void sub_80B76E0(u16 *vramBuffer, const u16 *src) +{ + s16 i; + s16 j; + + for (i = 0; i < 20; i++) + { + for (j = 0; j < 30; j++, src++) + { + vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; + } + src += 2; + } +} + +static void sub_80B772C(void) +{ + nullsub_20(namingScreenDataPtr->currentPage, namingScreenDataPtr->unkC); +} + +static void sub_80B7740(void) +{ + nullsub_20((namingScreenDataPtr->currentPage + 1) % 3, namingScreenDataPtr->unkD); +} + +static void nullsub_20(u8 a, u8 b) +{ +} + +static void sub_80B7838(void); +static void sub_80B7844(void); +static void sub_80B7850(void); + +static void (*const gUnknown_083CE310[][2])(void) = +{ + sub_80B7844, + sub_80B7838, + sub_80B7838, + sub_80B7850, + sub_80B7850, + sub_80B7844, +}; + +static const struct WindowTemplate *const gUnknown_083CE328[][2][2] = +{ + { + {&gWindowTemplate_81E6EDC, &gWindowTemplate_81E6EF8}, + {&gWindowTemplate_81E6EA4, &gWindowTemplate_81E6EC0}, + }, + { + {&gWindowTemplate_81E6EA4, &gWindowTemplate_81E6EC0}, + {&gWindowTemplate_81E6F14, &gWindowTemplate_81E6F30}, + }, + { + {&gWindowTemplate_81E6F14, &gWindowTemplate_81E6F30}, + {&gWindowTemplate_81E6EDC, &gWindowTemplate_81E6EF8}, + }, +}; + +static void nullsub_61(void); +static void sub_80B78F8(void); + +static void (*const gUnknown_083CE358[])(void) = +{ + nullsub_61, + nullsub_61, + sub_80B78F8, + sub_80B78F8, +}; + +static void nullsub_62(void); +static void sub_80B7924(void); + +static void (*const gUnknown_083CE368[])(void) = +{ + nullsub_62, + sub_80B7924, +}; + +static const u8 sKeyboardCharacters[][4][20]; //forward declaration + +static u8 GetCharAtKeyboardPos(s16 a, s16 b) +{ + return sKeyboardCharacters[namingScreenDataPtr->currentPage][b][a]; +} + +static void sub_80B7794(void) +{ + BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][0][namingScreenDataPtr->unkC]); + gUnknown_083CE310[namingScreenDataPtr->currentPage][0](); + BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][1][namingScreenDataPtr->unkD]); + gUnknown_083CE310[namingScreenDataPtr->currentPage][1](); + sub_80B772C(); + sub_80B7740(); +} + +static void sub_80B77F8(void) +{ + BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][1][namingScreenDataPtr->unkD]); + gUnknown_083CE310[namingScreenDataPtr->currentPage][1](); + sub_80B7740(); +} + +static void sub_80B7838(void) +{ + PrintKeyboardCharacters(1); +} + +static void sub_80B7844(void) +{ + PrintKeyboardCharacters(0); +} + +static void sub_80B7850(void) +{ + PrintKeyboardCharacters(2); +} + +static void PrintKeyboardCharacters(u8 page) //print letters on page +{ + s16 i; + s16 r5; + + for (i = 0, r5 = 9; i < 4; i++, r5 += 2) + Menu_PrintText(sKeyboardCharacters[page][i], 3, r5); +} + +static void sub_80B78A8(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6F4C); + gUnknown_083CE358[namingScreenDataPtr->templateNum](); + gUnknown_083CE368[namingScreenDataPtr->template->unk3](); + Menu_PrintText(namingScreenDataPtr->template->title, 9, 2); +} + +static void nullsub_61(void) +{ +} + +static void sub_80B78F8(void) +{ + StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenDataPtr->unk3E]); +} + +static void nullsub_62(void) +{ +} + +static void sub_80B7924(void) +{ + u8 genderSymbol[2] = _("♂"); + + if ((s16)namingScreenDataPtr->unk40 != MON_GENDERLESS) + { + if ((s16)namingScreenDataPtr->unk40 == MON_FEMALE) + genderSymbol[0] = 0xB6; //female symbol + Menu_PrintText(genderSymbol, 0x14, 4); + } +} + +static void sub_80B7960(void) +{ + u8 *string = gStringVar1; + + string[0] = 0xFC; + string[1] = 0x14; + string[2] = 8; + string[3] = 0xFC; + string[4] = 0x11; + string[5] = 1; + string += 6; + StringCopy(string, namingScreenDataPtr->textBuffer); + BasicInitMenuWindow(&gWindowTemplate_81E6F4C); + Menu_PrintText(gStringVar1, namingScreenDataPtr->unk2, 4); +} + +//-------------------------------------------------- +// Forward-declared variables +//-------------------------------------------------- + +static const struct NamingScreenTemplate playerNamingScreenTemplate = +{ + .unk0 = 0, + .maxChars = 7, + .unk2 = 1, + .unk3 = 0, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_YourName, +}; + +static const struct NamingScreenTemplate pcBoxNamingTemplate = +{ + .unk0 = 0, + .maxChars = 8, + .unk2 = 2, + .unk3 = 0, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_BoxName, +}; + +static const struct NamingScreenTemplate monNamingScreenTemplate = +{ + .unk0 = 0, + .maxChars = 10, + .unk2 = 3, + .unk3 = 1, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_PokeName, +}; + +static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = +{ + &playerNamingScreenTemplate, + &pcBoxNamingTemplate, + &monNamingScreenTemplate, + &monNamingScreenTemplate, +}; + +static const u8 sKeyboardCharacters[][4][20] = +{ +#if ENGLISH + { + _(" A B C D E F . "), + _(" G H I J K L , "), + _(" M N O P Q R S "), + _(" T U V W X Y Z "), + }, + { + _(" a b c d e f . "), + _(" g h i j k l , "), + _(" m n o p q r s "), + _(" t u v w x y z "), + }, +#elif GERMAN + { + _(" ABCD EFGH . "), + _(" IJKL MNOP , "), + _(" QRST UVWX "), + _(" YZ ÄÖÜ "), + }, + { + _(" abcd efgh . "), + _(" ijkl mnop , "), + _(" qrst uvwx "), + _(" yz äöü "), + }, +#endif + { + _(" 0 1 2 3 4 "), + _(" 5 6 7 8 9 "), + _(" ! ? ♂ ♀ / - "), + _(" … “ ” ‘ ’ "), + }, +}; + +const struct OamData gOamData_83CE498 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83CE4A0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83CE4A8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + + +const struct Subsprite gSubspriteTable_83CE4B0[] = { + { -20, -16, ST_OAM_H_RECTANGLE, 1, 0, 1 }, + { 12, -16, ST_OAM_SQUARE, 0, 4, 1 }, + { -20, -8, ST_OAM_H_RECTANGLE, 1, 5, 1 }, + { 12, -8, ST_OAM_SQUARE, 0, 9, 1 }, + { -20, 0, ST_OAM_H_RECTANGLE, 1, 10, 1 }, + { 12, 0, ST_OAM_SQUARE, 0, 14, 1 }, + { -20, 8, ST_OAM_H_RECTANGLE, 1, 15, 1 }, + { 12, 8, ST_OAM_SQUARE, 0, 19, 1 } +}; + +const struct Subsprite gSubspriteTable_83CE4F0[] = { + { -12, -4, ST_OAM_SQUARE, 0, 0, 1 }, + { 4, -4, ST_OAM_SQUARE, 0, 1, 1 } +}; + +const struct Subsprite gSubspriteTable_83CE500[] = { + { -12, -4, ST_OAM_H_RECTANGLE, 0, 0, 1 }, + { 4, -4, ST_OAM_SQUARE, 0, 2, 1 } +}; + +const struct Subsprite gSubspriteTable_83CE510[] = { + { -20, -12, ST_OAM_H_RECTANGLE, 1, 0, 1 }, + { 12, -12, ST_OAM_SQUARE, 0, 4, 1 }, + { -20, -4, ST_OAM_H_RECTANGLE, 1, 5, 1 }, + { 12, -4, ST_OAM_SQUARE, 0, 9, 1 }, + { -20, 4, ST_OAM_H_RECTANGLE, 1, 10, 1 }, + { 12, 4, ST_OAM_SQUARE, 0, 14, 1 } +}; + +const struct Subsprite gSubspriteTable_83CE540[] = { + { -8, -12, ST_OAM_H_RECTANGLE, 0, 0, 3 }, + { -8, -4, ST_OAM_H_RECTANGLE, 0, 2, 3 }, + { -8, 4, ST_OAM_H_RECTANGLE, 0, 4, 3 } +}; + +const struct SubspriteTable gSubspriteTables_83CE558[] = { + { 8, gSubspriteTable_83CE4B0 } +}; + +const struct SubspriteTable gSubspriteTables_83CE560[] = { + { 2, gSubspriteTable_83CE500 }, + { 2, gSubspriteTable_83CE500 }, + { 2, gSubspriteTable_83CE500 } +}; + +const struct SubspriteTable gSubspriteTables_83CE578[] = { + { 6, gSubspriteTable_83CE510 } +}; + +const struct SubspriteTable gSubspriteTables_83CE580[] = { + { 3, gSubspriteTable_83CE540 } +}; + +const struct SpriteFrameImage gSpriteImageTable_83CE588[] = { + { gSpriteImage_83CE094, 0xc0 }, + { gSpriteImage_83CE154, 0xc0 } +}; + +const union AnimCmd gSpriteAnim_83CE598[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gSpriteAnim_83CE5A0[] = { + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(8, 8), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83CE5AC[] = { + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gSpriteAnimTable_83CE5B8[] = { + gSpriteAnim_83CE598 +}; + +const union AnimCmd *const gSpriteAnimTable_83CE5BC[] = { + gSpriteAnim_83CE598, + gSpriteAnim_83CE5A0 +}; + +const union AnimCmd *const gSpriteAnimTable_83CE5C4[] = { + gSpriteAnim_83CE5AC +}; + +const struct SpriteTemplate gSpriteTemplate_83CE5C8 = { + 2, 4, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6B34 +}; + +const struct SpriteTemplate gSpriteTemplate_83CE5E0 = { + 3, 1, &gOamData_83CE4A8, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +const struct SpriteTemplate gSpriteTemplate_83CE5F8 = { + 4, 4, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +const struct SpriteTemplate gSpriteTemplate_83CE610 = { + 0, 6, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +const struct SpriteTemplate gSpriteTemplate_83CE628 = { + 1, 6, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +const struct SpriteTemplate gSpriteTemplate_83CE640 = { + 7, 5, &gOamData_83CE4A0, gSpriteAnimTable_83CE5BC, NULL, gDummySpriteAffineAnimTable, sub_80B6998 +}; + +const struct SpriteTemplate gSpriteTemplate_83CE658 = { + 10, 3, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6D9C +}; + +const struct SpriteTemplate gSpriteTemplate_83CE670 = { + 11, 3, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6DE8 +}; + +const struct SpriteTemplate gSpriteTemplate_83CE688 = { + 0xFFFF, 0, &gOamData_83CE498, gSpriteAnimTable_83CE5C4, gSpriteImageTable_83CE588, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +const struct SpriteSheet gUnknown_083CE6A0[] = { + { gNamingScreenBackButtonTiles, 0x1E0, 0 }, + { gNamingScreenOKButtonTiles, 0x1E0, 1 }, + { gNamingScreenChangeKeyboardBoxTiles, 0x280, 2 }, + { gNamingScreenChangeKeyboardButtonTiles, 0x100, 3 }, + { gNamingScreenLowerTextTiles, 0x60, 4 }, + { gNamingScreenUpperTextTiles, 0x60, 5 }, + { gNamingScreenOthersTextTiles, 0x60, 6 }, + { gNamingScreenCursorTiles, 0x80, 7 }, + { gNamingScreenActiveCursorSmallTiles, 0x80, 8 }, + { gNamingScreenActiveCursorBigTiles, 0x80, 9 }, + { gNamingScreenRightPointingTriangleTiles, 0x20, 10 }, + { gNamingScreenUnderscoreTiles, 0x20, 11 }, + {} +}; + +const struct SpritePalette gUnknown_083CE708[] = { + {gNamingScreenPalettes[0], 0}, + {gNamingScreenPalettes[1], 1}, + {gNamingScreenPalettes[2], 2}, + {gNamingScreenPalettes[3], 3}, + {gNamingScreenPalettes[4], 4}, + {gNamingScreenPalettes[5], 5}, + {gNamingScreenPalettes[4], 6}, + {} +}; + +const u16 gUnknown_083CE748[] = INCBIN_U16("graphics/naming_screen/lower_keyboard_map.bin"); + +const u16 gUnknown_083CEBF8[] = INCBIN_U16("graphics/naming_screen/upper_keyboard_map.bin"); + +const u16 gUnknown_083CF0A8[] = INCBIN_U16("graphics/naming_screen/others_keyboard_map.bin"); + diff --git a/src/new_game.c b/src/new_game.c new file mode 100644 index 000000000..e64dc91e3 --- /dev/null +++ b/src/new_game.c @@ -0,0 +1,236 @@ +#include "global.h" +#include "constants/maps.h" +#include "constants/species.h" +#include "clock.h" +#include "new_game.h" +#include "battle_records.h" +#include "berry.h" +#include "contest.h" +#include "decoration_inventory.h" +#include "dewford_trend.h" +#include "easy_chat.h" +#include "event_data.h" +#include "field_specials.h" +#include "item_menu.h" +#include "lottery_corner.h" +#include "mail_data.h" +#include "mauville_man.h" +#include "play_time.h" +#include "player_pc.h" +#include "pokeblock.h" +#include "pokedex.h" +#include "pokemon_size_record.h" +#include "pokemon_storage_system.h" +#include "random.h" +#include "roamer.h" +#include "script_pokemon_80C4.h" +#include "overworld.h" +#include "rtc.h" +#include "script.h" +#include "secret_base.h" +#include "text.h" +#include "tv.h" + +EWRAM_DATA u8 gDifferentSaveFile = 0; +EWRAM_DATA u8 gUnknown_020297ED = 0; + +extern u8 gPlayerPartyCount; +extern u8 gUnknown_03005CE8; +extern u16 gSaveFileStatus; + +extern u8 gUnknown_0819FA81[]; + +static const struct ContestWinner sEmptyMuseumPortrait = +{ + .nickname = {EOS}, + .trainerName = {EOS}, +}; + +#if DEBUG +const s8 gUnknown_Debug_0823C788[][2] = +{ + { MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK) }, + { MAP_GROUP(OLDALE_TOWN_POKEMON_CENTER_2F), MAP_NUM(OLDALE_TOWN_POKEMON_CENTER_2F) }, + { MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN) }, + { MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F) } +}; + +const u8 gUnknown_Debug_0823C790[] = _("KRÖTE"); +#endif + +void write_word_to_mem(u32 var, u8 *dataPtr) +{ + dataPtr[0] = var; + dataPtr[1] = var >> 8; + dataPtr[2] = var >> 16; + dataPtr[3] = var >> 24; +} + +void copy_word_to_mem(u8 *copyTo, u8 *copyFrom) +{ + s32 i; + for (i = 0; i < 4; i++) + copyTo[i] = copyFrom[i]; +} + +void InitPlayerTrainerId(void) +{ + write_word_to_mem((Random() << 16) | Random(), gSaveBlock2.playerTrainerId); +} + +// L=A isnt set here for some reason. +void SetDefaultOptions(void) +{ + gSaveBlock2.optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; + gSaveBlock2.optionsWindowFrameType = 0; + gSaveBlock2.optionsSound = OPTIONS_SOUND_MONO; + gSaveBlock2.optionsBattleStyle = OPTIONS_BATTLE_STYLE_SHIFT; + gSaveBlock2.optionsBattleSceneOff = FALSE; + gSaveBlock2.regionMapZoom = FALSE; +} + +void ClearPokedexFlags(void) +{ + gUnknown_03005CE8 = 0; + memset(&gSaveBlock2.pokedex.owned, 0, sizeof(gSaveBlock2.pokedex.owned)); + memset(&gSaveBlock2.pokedex.seen, 0, sizeof(gSaveBlock2.pokedex.seen)); +} + +void ResetContestAndMuseumWinners(void) +{ + s32 i; + + Contest_ResetWinners(); + for (i = 0; i < 5; i++) + gSaveBlock1.museumPortraits[i] = sEmptyMuseumPortrait; +} + +void ZeroBattleTowerData(void) +{ + CpuFill32(0, &gSaveBlock2.battleTower, sizeof(gSaveBlock2.battleTower)); +} + +#if DEBUG +void debug_sub_8052E04() +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_Debug_0823C788[i][0] == gSaveBlock1.location.mapGroup && + gUnknown_Debug_0823C788[i][1] == gSaveBlock1.location.mapNum) + { + break; + } + } + + i++; + if (i >= 4) + { + i = 0; + } + + Overworld_SetWarpDestination(gUnknown_Debug_0823C788[i][0], gUnknown_Debug_0823C788[i][1], -1, -1, -1); +} +#endif + +void WarpToTruck(void) +{ + Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck + warp_in(); +} + +void ClearSav2(void) +{ + CpuFill16(0, &gSaveBlock2, sizeof(gSaveBlock2)); + SetDefaultOptions(); +} + +void sub_8052E4C(void) +{ + gDifferentSaveFile = 0; +#if DEBUG + gUnknown_020297ED = 0; +#endif + sub_808C0A0(); + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + ResetBagScrollPositions(); +} + +void NewGameInitData(void) +{ + if (gSaveFileStatus == 0 || gSaveFileStatus == 2) + RtcReset(); + + gDifferentSaveFile = 1; + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + ResetPokedex(); + ZeroBattleTowerData(); + memset(&gSaveBlock1, 0, sizeof(gSaveBlock1)); + ClearMailData(); + gSaveBlock2.specialSaveWarp = 0; + InitPlayerTrainerId(); + PlayTimeCounter_Reset(); + ClearPokedexFlags(); + InitEventData(); + ClearTVShowData(); + ResetGabbyAndTy(); + ResetSecretBases(); + ClearBerryTrees(); + gSaveBlock1.money = 3000; + ResetLinkContestBoolean(); + ResetGameStats(); + ResetContestAndMuseumWinners(); + InitLinkBattleRecords(); + InitShroomishSizeRecord(); + InitBarboachSizeRecord(); + gPlayerPartyCount = 0; + ZeroPlayerPartyMons(); + ResetPokemonStorageSystem(); + ClearRoamerData(); + ClearRoamerLocationData(); + gSaveBlock1.registeredItem = 0; + ClearBag(); + NewGameInitPCItems(); + ClearPokeblocks(); + ClearDecorationInventories(); + InitEasyChatPhrases(); + SetupMauvilleOldMan(); + InitDewfordTrend(); + ResetFanClub(); + ResetLotteryCorner(); + WarpToTruck(); + ScriptContext2_RunNewScript(gUnknown_0819FA81); +} + +#if DEBUG +extern void debug_sub_80A3904(void); +extern void debug_sub_80A3714(void); +extern void debug_sub_8120F98(void); +extern void unref_sub_8070F90(void); + +void debug_sub_8057508(bool32 arg0) +{ + gUnknown_020297ED = 1; + NewGameInitData(); + gSaveBlock1.money = 999999; + FlagSet(FLAG_SYS_POKEMON_GET); + FlagSet(FLAG_SYS_POKEDEX_GET); + FlagSet(FLAG_SYS_POKENAV_GET); + FlagSet(FLAG_SYS_B_DASH); + ScriptGiveMon(SPECIES_TREECKO, 99, 0, 0, 0, 0); + + if (arg0 == TRUE) + SetMonData(&gPlayerParty[0], MON_DATA_NICKNAME, gUnknown_Debug_0823C790); + + debug_sub_80A3904(); + debug_sub_80A3714(); + debug_sub_8120F98(); + FlagSet(FLAG_SYS_HIPSTER_MEET); + sub_80EB8EC(); + unref_sub_8070F90(); + InitTimeBasedEvents(); +} +#endif diff --git a/src/option_menu.c b/src/option_menu.c new file mode 100644 index 000000000..a2d32ffb6 --- /dev/null +++ b/src/option_menu.c @@ -0,0 +1,560 @@ +#include "global.h" +#include "option_menu.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "scanline_effect.h" +#include "sprite.h" +#include "strings2.h" +#include "task.h" + +extern void SetPokemonCryStereo(u32 val); + +// Menu items +enum +{ + MENUITEM_TEXTSPEED, + MENUITEM_BATTLESCENE, + MENUITEM_BATTLESTYLE, + MENUITEM_SOUND, + MENUITEM_BUTTONMODE, + MENUITEM_FRAMETYPE, + MENUITEM_CANCEL, +}; + +// Task data +#define tMenuSelection data[0] +#define tOptTextSpeed data[1] +#define tOptBattleScene data[2] +#define tOptBattleStyle data[3] +#define tOptSound data[4] +#define tOptButtonMode data[5] +#define tOptFrameType data[6] + +const u16 gUnknown_0839F5FC[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal"); +// note: this is only used in the Japanese release +const u8 gUnknown_0839F63C[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp"); + +static void Task_OptionMenuFadeIn(u8 taskId); +static void Task_OptionMenuProcessInput(u8 taskId); +static void Task_OptionMenuSave(u8 taskId); +static void Task_OptionMenuFadeOut(u8 taskId); +static void HighlightOptionMenuItem(u8 selection); +static u8 TextSpeed_ProcessInput(u8 selection); +static void TextSpeed_DrawChoices(u8 selection); +static u8 BattleScene_ProcessInput(u8 selection); +static void BattleScene_DrawChoices(u8 selection); +static u8 BattleStyle_ProcessInput(u8 selection); +static void BattleStyle_DrawChoices(u8 selection); +static u8 Sound_ProcessInput(u8 selection); +static void Sound_DrawChoices(u8 selection); +static u8 FrameType_ProcessInput(u8 selection); +static void FrameType_DrawChoices(u8 selection); +static u8 ButtonMode_ProcessInput(u8 selection); +static void ButtonMode_DrawChoices(u8 selection); + +static void MainCB(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_InitOptionMenu(void) +{ + switch (gMain.state) + { + default: + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state++; + break; + case 1: + ResetPaletteFade(); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + gMain.state++; + break; + case 2: + Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); + gMain.state++; + break; + case 3: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E71B4); + gMain.state++; + break; + case 4: + if (!MultistepInitMenuWindowContinue()) + return; + gMain.state++; + break; + case 5: + LoadPalette(gUnknown_0839F5FC, 0x80, 0x40); + CpuCopy16(gUnknown_0839F63C, (void *)0x0600BEE0, 0x40); + gMain.state++; + break; + case 6: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gMain.state++; + break; + case 7: + { + u16 savedIme; + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 0x31; + REG_BLDCNT = 0xE1; + REG_BLDALPHA = 0; + REG_BLDY = 7; + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(VBlankCB); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON | + DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; + gMain.state++; + break; + } + case 8: + { + u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0); + + gTasks[taskId].tMenuSelection = 0; + gTasks[taskId].tOptTextSpeed = gSaveBlock2.optionsTextSpeed; + gTasks[taskId].tOptBattleScene = gSaveBlock2.optionsBattleSceneOff; + gTasks[taskId].tOptBattleStyle = gSaveBlock2.optionsBattleStyle; + gTasks[taskId].tOptSound = gSaveBlock2.optionsSound; + gTasks[taskId].tOptButtonMode = gSaveBlock2.optionsButtonMode; + gTasks[taskId].tOptFrameType = gSaveBlock2.optionsWindowFrameType; + + Menu_DrawStdWindowFrame(2, 0, 27, 3); // title box + Menu_DrawStdWindowFrame(2, 4, 27, 19); // options list box + + Menu_PrintText(gSystemText_OptionMenu, 4, 1); + + Menu_PrintText(gSystemText_TextSpeed, 4, 5); + Menu_PrintText(gSystemText_BattleScene, 4, 7); + Menu_PrintText(gSystemText_BattleStyle, 4, 9); + Menu_PrintText(gSystemText_Sound, 4, 11); + Menu_PrintText(gSystemText_ButtonMode, 4, 13); + Menu_PrintText(gSystemText_Frame, 4, 15); + Menu_PrintText(gSystemText_Cancel, 4, 17); + + TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed); + BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene); + BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle); + Sound_DrawChoices(gTasks[taskId].tOptSound); + ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode); + FrameType_DrawChoices(gTasks[taskId].tOptFrameType); + + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); + gMain.state++; + break; + } + case 9: + SetMainCallback2(MainCB); + return; + } +} + +static void Task_OptionMenuFadeIn(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_OptionMenuProcessInput; +} + +static void Task_OptionMenuProcessInput(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskId].tMenuSelection == MENUITEM_CANCEL) + gTasks[taskId].func = Task_OptionMenuSave; + } + else if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].func = Task_OptionMenuSave; + } + else if (gMain.newKeys & DPAD_UP) + { + if (gTasks[taskId].tMenuSelection > 0) + gTasks[taskId].tMenuSelection--; + else + gTasks[taskId].tMenuSelection = 6; + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (gTasks[taskId].tMenuSelection < 6) + gTasks[taskId].tMenuSelection++; + else + gTasks[taskId].tMenuSelection = 0; + HighlightOptionMenuItem(gTasks[taskId].tMenuSelection); + } + else + { + switch (gTasks[taskId].tMenuSelection) + { + case MENUITEM_TEXTSPEED: + gTasks[taskId].tOptTextSpeed = TextSpeed_ProcessInput(gTasks[taskId].tOptTextSpeed); + TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed); + break; + case MENUITEM_BATTLESCENE: + gTasks[taskId].tOptBattleScene = BattleScene_ProcessInput(gTasks[taskId].tOptBattleScene); + BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene); + break; + case MENUITEM_BATTLESTYLE: + gTasks[taskId].tOptBattleStyle = BattleStyle_ProcessInput(gTasks[taskId].tOptBattleStyle); + BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle); + break; + case MENUITEM_SOUND: + gTasks[taskId].tOptSound = Sound_ProcessInput(gTasks[taskId].tOptSound); + Sound_DrawChoices(gTasks[taskId].tOptSound); + break; + case MENUITEM_BUTTONMODE: + gTasks[taskId].tOptButtonMode = ButtonMode_ProcessInput(gTasks[taskId].tOptButtonMode); + ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode); + break; + case MENUITEM_FRAMETYPE: + gTasks[taskId].tOptFrameType = FrameType_ProcessInput(gTasks[taskId].tOptFrameType); + FrameType_DrawChoices(gTasks[taskId].tOptFrameType); + break; + } + } +} + +static void Task_OptionMenuSave(u8 taskId) +{ + gSaveBlock2.optionsTextSpeed = gTasks[taskId].tOptTextSpeed; + gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].tOptBattleScene; + gSaveBlock2.optionsBattleStyle = gTasks[taskId].tOptBattleStyle; + gSaveBlock2.optionsSound = gTasks[taskId].tOptSound; + gSaveBlock2.optionsButtonMode = gTasks[taskId].tOptButtonMode; + gSaveBlock2.optionsWindowFrameType = gTasks[taskId].tOptFrameType; + + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_OptionMenuFadeOut; +} + +static void Task_OptionMenuFadeOut(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(gMain.savedCallback); + } +} + +//This version uses addition '+' instead of OR '|'. +#define WIN_RANGE_(a, b) (((a) << 8) + (b)) + +static void HighlightOptionMenuItem(u8 index) +{ + REG_WIN1H = WIN_RANGE(24, 215); + REG_WIN1V = WIN_RANGE_(index * 16 + 40, index * 16 + 56); +} + +static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style) +{ + u8 dst[15]; + u16 i; + + for (i = 0; *text != EOS && i < 15; i++) + dst[i] = *(text++); + + dst[2] = style; + dst[i] = EOS; + Menu_PrintTextPixelCoords(dst, x, y, 1); +} + +static u8 TextSpeed_ProcessInput(u8 selection) +{ + if (gMain.newKeys & DPAD_RIGHT) + { + if (selection < 2) + selection++; + else + selection = 0; + } + if (gMain.newKeys & DPAD_LEFT) + { + if (selection > 0) + selection--; + else + selection = 2; + } + return selection; +} + +#if ENGLISH +#define TEXTSPEED_SLOW_LEFT (120) +#define TEXTSPEED_MIX_LEFT (155) +#define TEXTSPEED_FAST_LEFT (184) +#endif +#if GERMAN +#define TEXTSPEED_SLOW_LEFT (120) +#define TEXTSPEED_MIX_LEFT (161) +#define TEXTSPEED_FAST_LEFT (202) +#endif + +static void TextSpeed_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[2] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]); + DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); + DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]); +} + +static u8 BattleScene_ProcessInput(u8 selection) +{ + if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + selection ^= 1; + return selection; +} + +static void BattleScene_DrawChoices(u8 selection) +{ + u8 styles[2]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); + DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]); +} + +static u8 BattleStyle_ProcessInput(u8 selection) +{ + if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + selection ^= 1; + return selection; +} + +#if ENGLISH +#define BATTLESTYLE_SHIFT (120) +#define BATTLESTYLE_SET (190) +#elif GERMAN +#define BATTLESTYLE_SHIFT (120) +#define BATTLESTYLE_SET (178) +#endif + +static void BattleStyle_DrawChoices(u8 selection) +{ + u8 styles[2]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]); + DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); +} + +static u8 Sound_ProcessInput(u8 selection) +{ + if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + { + selection ^= 1; + SetPokemonCryStereo(selection); + } + return selection; +} + +static void Sound_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); + DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]); +} + +static u8 FrameType_ProcessInput(u8 selection) +{ + if (gMain.newKeys & DPAD_RIGHT) + { + if (selection < 19) + selection++; + else + selection = 0; + Menu_LoadStdFrameGraphicsOverrideStyle(selection); + } + if (gMain.newKeys & DPAD_LEFT) + { + if (selection > 0) + selection--; + else + selection = 19; + Menu_LoadStdFrameGraphicsOverrideStyle(selection); + } + return selection; +} + +#define CHAR_0 0xA1 //Character code of '0' character + +#if ENGLISH +static void FrameType_DrawChoices(u8 selection) +{ + u8 text[6]; + u8 n = selection + 1; + u16 i; + + for (i = 0; gSystemText_Terminator[i] != EOS && i < 6; i++) + text[i] = gSystemText_Terminator[i]; + + //Convert number to decimal string + if (n / 10 != 0) + { + text[i] = n / 10 + CHAR_0; + i++; + text[i] = n % 10 + CHAR_0; + i++; + } + else + { + text[i] = n % 10 + CHAR_0; + i++; + text[i] = CHAR_SPACE; + i++; + } + + text[i] = EOS; + Menu_PrintText(gSystemText_Type, 15, 15); + Menu_PrintText(text, 18, 15); +} +#elif GERMAN +__attribute__((naked)) +static void FrameType_DrawChoices(u8 selection) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + sub sp, 0x10\n\ + lsls r0, 24\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + adds r0, r1\n\ + lsrs r5, r0, 24\n\ + ldr r1, _0808C368 @ =gSystemText_Type\n\ + mov r0, sp\n\ + bl StringCopy\n\ + ldr r1, _0808C36C @ =gSystemText_Terminator\n\ + mov r0, sp\n\ + bl StringAppend\n\ + adds r4, r0, 0\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __udivsi3\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 24\n\ + lsrs r6, r0, 24\n\ + cmp r6, 0\n\ + beq _0808C370\n\ + adds r0, r1, 0\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + adds r4, 0x1\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __umodsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + b _0808C380\n\ + .align 2, 0\n\ +_0808C368: .4byte gSystemText_Type\n\ +_0808C36C: .4byte gSystemText_Terminator\n\ +_0808C370:\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __umodsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + adds r4, 0x1\n\ + strb r6, [r4]\n\ +_0808C380:\n\ + adds r4, 0x1\n\ + movs r0, 0xFF\n\ + strb r0, [r4]\n\ + mov r0, sp\n\ + movs r1, 0xF\n\ + movs r2, 0xF\n\ + bl Menu_PrintText\n\ + add sp, 0x10\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +static u8 ButtonMode_ProcessInput(u8 selection) +{ + if (gMain.newKeys & DPAD_RIGHT) + { + if (selection < 2) + selection++; + else + selection = 0; + } + if (gMain.newKeys & DPAD_LEFT) + { + if (selection > 0) + selection--; + else + selection = 2; + } + return selection; +} + +static void ButtonMode_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[2] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]); + DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); + DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); +} diff --git a/src/overworld.c b/src/overworld.c new file mode 100644 index 000000000..6376aa1af --- /dev/null +++ b/src/overworld.c @@ -0,0 +1,2750 @@ +#include "global.h" +#include "overworld.h" +#include "battle_setup.h" +#include "berry.h" +#include "cable_club.h" +#include "clock.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_control_avatar.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "event_object_movement.h" +#include "field_message_box.h" +#include "field_player_avatar.h" +#include "field_screen_effect.h" +#include "field_special_scene.h" +#include "field_specials.h" +#include "field_tasks.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "fldeff_flash.h" +#include "heal_location.h" +#include "link.h" +#include "load_save.h" +#include "main.h" +#include "m4a.h" +#include "constants/maps.h" +#include "map_name_popup.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "new_game.h" +#include "palette.h" +#include "play_time.h" +#include "random.h" +#include "roamer.h" +#include "rotating_gate.h" +#include "safari_zone.h" +#include "script.h" +#include "script_pokemon_80C4.h" +#include "secret_base.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "start_menu.h" +#include "task.h" +#include "tileset_anim.h" +#include "time_events.h" +#include "tv.h" +#include "scanline_effect.h" +#include "wild_encounter.h" + +#ifdef SAPPHIRE +#define LEGENDARY_MUSIC BGM_OOAME // Heavy Rain +#else +#define LEGENDARY_MUSIC BGM_HIDERI // Drought +#endif + +struct UnkTVStruct +{ + u32 tv_field_0; + u32 tv_field_4; +}; + +extern u8 gUnknown_020297ED; +extern u16 gUnknown_03004898; +extern u16 gUnknown_0300489C; + +extern u8 S_WhiteOut[]; +extern u8 gUnknown_0819FC9F[]; +extern u8 SingleBattleColosseum_EventScript_1A436F[]; +extern u8 SingleBattleColosseum_EventScript_1A4379[]; +extern u8 DoubleBattleColosseum_EventScript_1A4383[]; +extern u8 DoubleBattleColosseum_EventScript_1A439E[]; +extern u8 DoubleBattleColosseum_EventScript_1A43B9[]; +extern u8 DoubleBattleColosseum_EventScript_1A43D4[]; +extern u8 TradeCenter_EventScript_1A43F0[]; +extern u8 TradeCenter_EventScript_1A43FA[]; +extern u8 RecordCorner_EventScript_1A4418[]; +extern u8 RecordCorner_EventScript_1A442D[]; +extern u8 RecordCorner_EventScript_1A4442[]; +extern u8 RecordCorner_EventScript_1A4457[]; +extern u8 TradeRoom_ReadTrainerCard1[]; +extern u8 TradeRoom_ReadTrainerCard2[]; +extern u8 TradeRoom_TooBusyToNotice[]; +extern u8 TradeRoom_PromptToCancelLink[]; +extern u8 TradeRoom_TerminateLink[]; +extern u8 gUnknown_081A4508[]; + +extern struct MapData * const gMapAttributes[]; +extern struct MapHeader * const * const gMapGroups[]; +extern s32 gMaxFlashLevel; + +EWRAM_DATA struct WarpData gUnknown_020297F0 = {0}; +EWRAM_DATA struct WarpData gWarpDestination = {0}; // new warp position +EWRAM_DATA struct WarpData gUnknown_02029800 = {0}; +EWRAM_DATA struct WarpData gUnknown_02029808 = {0}; +EWRAM_DATA struct UnkPlayerStruct gUnknown_02029810 = {0}; +EWRAM_DATA static u16 sAmbientCrySpecies = 0; +EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; +EWRAM_DATA struct LinkPlayerMapObject gLinkPlayerMapObjects[4] = {0}; + +static u8 gUnknown_03000580[4]; +static u16 (*gUnknown_03000584)(u32); +static u8 gUnknown_03000588; + +u16 word_3004858; +void (*gFieldCallback)(void); +u8 gUnknown_03004860; +u8 gFieldLinkPlayerCount; + +static const struct WarpData sDummyWarpData = +{ + .mapGroup = -1, + .mapNum = -1, + .warpId = -1, + .x = -1, + .y = -1, +}; + +static const u8 sUnusedData[] = +{ + 0xB0, 0x04, 0x00, 0x00, + 0x10, 0x0E, 0x00, 0x00, + 0xB0, 0x04, 0x00, 0x00, + 0x60, 0x09, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, + 0xD4, 0xFF, 0xFF, 0xFF, + 0x2C, 0x00, 0x00, 0x00, +}; + +const struct UCoords32 gUnknown_0821664C[] = +{ + { 0, 0}, + { 0, 1}, + { 0, -1}, + {-1, 0}, + { 1, 0}, + {-1, 1}, + { 1, 1}, + {-1, -1}, + { 1, -1}, +}; + +const struct ScanlineEffectParams gUnknown_08216694 = +{ + (void *)REG_ADDR_WIN0H, + ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, + 1, + 0, +}; + +static u8 sub_8055C68(struct LinkPlayerMapObject *, struct MapObject *, u8); +static u8 sub_8055C88(struct LinkPlayerMapObject *, struct MapObject *, u8); +static u8 sub_8055C8C(struct LinkPlayerMapObject *, struct MapObject *, u8); + +static u8 (*const gUnknown_082166A0[])(struct LinkPlayerMapObject *, struct MapObject *, u8) = +{ + sub_8055C68, + sub_8055C88, + sub_8055C8C, +}; + +static u8 sub_8055CAC(struct LinkPlayerMapObject *, struct MapObject *, u8); +static u8 sub_8055CB0(struct LinkPlayerMapObject *, struct MapObject *, u8); +static u8 sub_8055D18(struct LinkPlayerMapObject *, struct MapObject *, u8); + +static u8 (*const gUnknown_082166AC[])(struct LinkPlayerMapObject *, struct MapObject *, u8) = +{ + sub_8055CAC, + sub_8055CB0, + sub_8055CB0, + sub_8055CB0, + sub_8055CB0, + sub_8055CAC, + sub_8055CAC, + sub_8055D18, + sub_8055D18, + sub_8055D18, + sub_8055D18, +}; + +static void sub_8055D30(struct LinkPlayerMapObject *, struct MapObject *); +static void sub_8055D38(struct LinkPlayerMapObject *, struct MapObject *); + +static void (*const gUnknown_082166D8[])(struct LinkPlayerMapObject *, struct MapObject *) = +{ + sub_8055D30, + sub_8055D38, +}; + + +static void DoWhiteOut(void) +{ + ScriptContext2_RunNewScript(S_WhiteOut); + gSaveBlock1.money /= 2; + ScrSpecial_HealPlayerParty(); + Overworld_ResetStateAfterWhiteOut(); + Overworld_SetWarpDestToLastHealLoc(); + warp_in(); +} + +void Overworld_ResetStateAfterFly(void) +{ + player_avatar_init_params_reset(); + FlagClear(FLAG_SYS_CYCLING_ROAD); + FlagClear(FLAG_SYS_CRUISE_MODE); + FlagClear(FLAG_SYS_SAFARI_MODE); + FlagClear(FLAG_SYS_USE_STRENGTH); + FlagClear(FLAG_SYS_USE_FLASH); +} + +void Overworld_ResetStateAfterTeleport(void) +{ + player_avatar_init_params_reset(); + FlagClear(FLAG_SYS_CYCLING_ROAD); + FlagClear(FLAG_SYS_CRUISE_MODE); + FlagClear(FLAG_SYS_SAFARI_MODE); + FlagClear(FLAG_SYS_USE_STRENGTH); + FlagClear(FLAG_SYS_USE_FLASH); + ScriptContext2_RunNewScript(gUnknown_0819FC9F); +} + +void Overworld_ResetStateAfterDigEscRope(void) +{ + player_avatar_init_params_reset(); + FlagClear(FLAG_SYS_CYCLING_ROAD); + FlagClear(FLAG_SYS_CRUISE_MODE); + FlagClear(FLAG_SYS_SAFARI_MODE); + FlagClear(FLAG_SYS_USE_STRENGTH); + FlagClear(FLAG_SYS_USE_FLASH); +} + +void Overworld_ResetStateAfterWhiteOut(void) +{ + player_avatar_init_params_reset(); + FlagClear(FLAG_SYS_CYCLING_ROAD); + FlagClear(FLAG_SYS_CRUISE_MODE); + FlagClear(FLAG_SYS_SAFARI_MODE); + FlagClear(FLAG_SYS_USE_STRENGTH); + FlagClear(FLAG_SYS_USE_FLASH); +} + +void sub_805308C(void) +{ + FlagClear(FLAG_SYS_SAFARI_MODE); + ChooseAmbientCrySpecies(); + ResetCyclingRoadChallengeData(); + UpdateLocationHistoryForRoamer(); + RoamerMoveToOtherLocationSet(); +} + +void ResetGameStats(void) +{ + s32 i; + + for (i = 0; i < NUM_GAME_STATS; i++) + gSaveBlock1.gameStats[i] = 0; +} + +void IncrementGameStat(u8 index) +{ + if (index < NUM_GAME_STATS) + { + if (gSaveBlock1.gameStats[index] < 0xFFFFFF) + gSaveBlock1.gameStats[index]++; + else + gSaveBlock1.gameStats[index] = 0xFFFFFF; + } +} + +u32 GetGameStat(u8 index) +{ + if (index >= NUM_GAME_STATS) + return 0; + + return gSaveBlock1.gameStats[index]; +} + +void SetGameStat(u8 index, u32 value) +{ + if (index < NUM_GAME_STATS) + gSaveBlock1.gameStats[index] = value; +} + +void LoadMapObjTemplatesFromHeader(void) +{ + // Clear map object templates + CpuFill32(0, gSaveBlock1.mapObjectTemplates, sizeof(gSaveBlock1.mapObjectTemplates)); + + // Copy map header events to save block + CpuCopy32(gMapHeader.events->mapObjects, + gSaveBlock1.mapObjectTemplates, + gMapHeader.events->mapObjectCount * sizeof(struct MapObjectTemplate)); +} + +static void LoadSaveblockMapObjScripts(void) +{ + struct MapObjectTemplate *mapObjectTemplates = gSaveBlock1.mapObjectTemplates; + s32 i; + + for (i = 0; i < 64; i++) + mapObjectTemplates[i].script = gMapHeader.events->mapObjects[i].script; +} + +void Overworld_SetMapObjTemplateCoords(u8 localId, s16 x, s16 y) +{ + s32 i; + for (i = 0; i < 64; i++) + { + struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; + if (mapObjectTemplate->localId == localId) + { + mapObjectTemplate->x = x; + mapObjectTemplate->y = y; + return; + } + } +} + +void Overworld_SetMapObjTemplateMovementType(u8 localId, u8 movementType) +{ + s32 i; + + for (i = 0; i < 64; i++) + { + struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; + if (mapObjectTemplate->localId == localId) + { + mapObjectTemplate->movementType = movementType; + return; + } + } +} + +static void mapdata_load_assets_to_gpu_and_full_redraw(void) +{ + move_tilemap_camera_to_upper_left_corner(); + copy_map_tileset1_tileset2_to_vram(gMapHeader.mapData); + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + DrawWholeMapView(); + cur_mapheader_run_tileset_funcs_after_some_cpuset(); +} + +static struct MapData *get_mapdata_header(void) +{ + u16 mapDataId = gSaveBlock1.mapDataId; + if (mapDataId) + return gMapAttributes[mapDataId - 1]; + return NULL; +} + +static void ApplyCurrentWarp(void) +{ + gUnknown_020297F0 = gSaveBlock1.location; + gSaveBlock1.location = gWarpDestination; + gUnknown_02029800 = sDummyWarpData; + gUnknown_02029808 = sDummyWarpData; +} + +static void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp->mapGroup = mapGroup; + warp->mapNum = mapNum; + warp->warpId = warpId; + warp->x = x; + warp->y = y; +} + +static bool32 warp_data_is_not_neg_1(struct WarpData *warp) +{ + if (warp->mapGroup != -1) + return FALSE; + if (warp->mapNum != -1) + return FALSE; + if (warp->warpId != -1) + return FALSE; + if (warp->x != -1) + return FALSE; + if (warp->y != -1) + return FALSE; + return TRUE; +} + +struct MapHeader *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum) +{ + return gMapGroups[mapGroup][mapNum]; +} + +struct MapHeader *const warp1_get_mapheader(void) +{ + return Overworld_GetMapHeaderByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); +} + +static void set_current_map_header_from_sav1_save_old_name(void) +{ + gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + gSaveBlock1.mapDataId = gMapHeader.mapDataId; + gMapHeader.mapData = get_mapdata_header(); +} + +static void LoadSaveblockMapHeader(void) +{ + gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + gMapHeader.mapData = get_mapdata_header(); +} + +void sub_80533CC(void) +{ + if (gSaveBlock1.location.warpId >= 0 && gSaveBlock1.location.warpId < gMapHeader.events->warpCount) + { + gSaveBlock1.pos.x = gMapHeader.events->warps[gSaveBlock1.location.warpId].x; + gSaveBlock1.pos.y = gMapHeader.events->warps[gSaveBlock1.location.warpId].y; + } + else if (gSaveBlock1.location.x >= 0 && gSaveBlock1.location.y >= 0) + { + gSaveBlock1.pos.x = gSaveBlock1.location.x; + gSaveBlock1.pos.y = gSaveBlock1.location.y; + } + else + { + gSaveBlock1.pos.x = gMapHeader.mapData->width / 2; + gSaveBlock1.pos.y = gMapHeader.mapData->height / 2; + } +} + +void warp_in(void) +{ + ApplyCurrentWarp(); + set_current_map_header_from_sav1_save_old_name(); + sub_80533CC(); +} + +void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + SetWarpData(&gWarpDestination, mapGroup, mapNum, warpId, x, y); +} + +void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId) +{ + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, -1, -1); +} + +void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId) +{ + SetWarpData(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); +} + +void saved_warp2_set_2(int unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + SetWarpData(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); +} + +void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused) +{ + gWarpDestination = gSaveBlock1.warp2; +} + +void sub_8053538(u8 a1) +{ + const struct HealLocation *warp = GetHealLocation(a1); + + if (warp) + Overworld_SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y); +} + +void Overworld_SetWarpDestToLastHealLoc(void) +{ + gWarpDestination = gSaveBlock1.lastHealLocation; +} + +void Overworld_SetHealLocationWarp(u8 healLocationId) +{ + const struct HealLocation *healLocation = GetHealLocation(healLocationId); + + if (healLocation != NULL) + SetWarpData(&gSaveBlock1.lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y); +} + +void sub_80535C4(s16 a1, s16 a2) +{ + u8 currMapType = Overworld_GetMapTypeOfSaveblockLocation(); + u8 destMapType = GetMapTypeByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); + if (is_map_type_1_2_3_5_or_6(currMapType) && is_map_type_1_2_3_5_or_6(destMapType) != TRUE) + sub_805363C(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, a1 - 7, a2 - 6); +} + +void sub_805363C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + SetWarpData(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); +} + +void sub_8053678(void) +{ + gWarpDestination = gSaveBlock1.warp4; +} + +void sub_8053690(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + SetWarpData(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); +} + +static void warp1_set_to_warp2(void) +{ + gWarpDestination = gUnknown_02029800; +} + +void sub_80536E4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + SetWarpData(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); +} + +void sub_8053720(s16 x, s16 y) +{ + if (warp_data_is_not_neg_1(&gUnknown_02029808) == TRUE) + { + gWarpDestination = gUnknown_020297F0; + } + else + { + Overworld_SetWarpDestination(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); + } +} + +void sub_8053778(void) +{ + gWarpDestination = gSaveBlock1.warp1; +} + +void unref_sub_8053790(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + SetWarpData(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); +} + +void sub_80537CC(u8 a1) +{ + const struct HealLocation *warp = GetHealLocation(a1); + if (warp) + SetWarpData(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y); +} + +void gpu_sync_bg_hide() +{ + gSaveBlock1.warp1 = gSaveBlock1.warp2; +} + +struct MapConnection *GetMapConnection(u8 dir) +{ + s32 i; + s32 count = gMapHeader.connections->count; + struct MapConnection *connection = gMapHeader.connections->connections; + + if (connection == NULL) + return NULL; + + for(i = 0; i < count; i++, connection++) + if (connection->direction == dir) + return connection; + + return NULL; +} + +bool8 sub_8053850(u8 dir, u16 x, u16 y) +{ + struct MapConnection *connection = GetMapConnection(dir); + + if (connection != NULL) + { + Overworld_SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y); + } + else + { + mapheader_run_script_with_tag_x6(); + if (warp_data_is_not_neg_1(&gUnknown_02029800)) + return FALSE; + warp1_set_to_warp2(); + } + return TRUE; +} + +bool8 sub_80538B0(u16 x, u16 y) +{ + return sub_8053850(CONNECTION_EMERGE, x, y); +} + +bool8 sub_80538D0(u16 x, u16 y) +{ + return sub_8053850(CONNECTION_DIVE, x, y); +} + +void sub_80538F0(u8 mapGroup, u8 mapNum) +{ + s32 paletteIndex; + + Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1); + sub_8053F0C(); + ApplyCurrentWarp(); + set_current_map_header_from_sav1_save_old_name(); + LoadMapObjTemplatesFromHeader(); + ClearTempFieldEventData(); + ResetCyclingRoadChallengeData(); + prev_quest_postbuffer_cursor_backup_reset(); + TryUpdateRandomTrainerRematches(mapGroup, mapNum); + DoTimeBasedEvents(); + SetSav1WeatherFromCurrMapHeader(); + ChooseAmbientCrySpecies(); + SetDefaultFlashLevel(); + Overworld_ClearSavedMusic(); + mapheader_run_script_with_tag_x3(); + not_trainer_hill_battle_pyramid(); + sub_8056D38(gMapHeader.mapData); + apply_map_tileset2_palette(gMapHeader.mapData); + + for (paletteIndex = 6; paletteIndex < 12; paletteIndex++) + ApplyWeatherGammaShiftToPal(paletteIndex); + + sub_8072ED0(); + UpdateLocationHistoryForRoamer(); + RoamerMove(); + DoCurrentWeather(); + ResetFieldTasksArgs(); + mapheader_run_script_with_tag_x5(); + ShowMapNamePopup(); +} + +void sub_8053994(u32 a1) +{ + bool8 v2; + bool8 v3; + + set_current_map_header_from_sav1_save_old_name(); + LoadMapObjTemplatesFromHeader(); + v2 = is_map_type_1_2_3_5_or_6(gMapHeader.mapType); + v3 = Overworld_MapTypeIsIndoors(gMapHeader.mapType); + ClearTempFieldEventData(); + ResetCyclingRoadChallengeData(); + prev_quest_postbuffer_cursor_backup_reset(); + TryUpdateRandomTrainerRematches(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + if (a1 != 1) + DoTimeBasedEvents(); + SetSav1WeatherFromCurrMapHeader(); + ChooseAmbientCrySpecies(); + if (v2) + FlagClear(FLAG_SYS_USE_FLASH); + SetDefaultFlashLevel(); + Overworld_ClearSavedMusic(); + mapheader_run_script_with_tag_x3(); + UpdateLocationHistoryForRoamer(); + RoamerMoveToOtherLocationSet(); + not_trainer_hill_battle_pyramid(); + if (a1 != 1 && v3) + { + UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); + sub_80BBCCC(1); + } +} + +void player_avatar_init_params_reset(void) +{ + gUnknown_02029810.player_field_1 = 1; + gUnknown_02029810.player_field_0 = 1; +} + +void walkrun_find_lowest_active_bit_in_bitfield(void) +{ + gUnknown_02029810.player_field_1 = player_get_direction_lower_nybble(); + + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) + gUnknown_02029810.player_field_0 = 2; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) + gUnknown_02029810.player_field_0 = 4; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + gUnknown_02029810.player_field_0 = 8; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4)) + gUnknown_02029810.player_field_0 = 16; + else + gUnknown_02029810.player_field_0 = 1; +} + +struct UnkPlayerStruct *sub_8053AA8(void) +{ + struct UnkPlayerStruct playerStruct; + u8 mapType = Overworld_GetMapTypeOfSaveblockLocation(); + u16 v2 = cur_mapdata_block_role_at_screen_center_acc_to_sav1(); + u8 v4 = sub_8053B00(&gUnknown_02029810, v2, mapType); + playerStruct.player_field_0 = v4; + playerStruct.player_field_1 = sub_8053B60(&gUnknown_02029810, v4, v2, mapType); + gUnknown_02029810 = playerStruct; + return &gUnknown_02029810; +} + +u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3) +{ + if (a3 != 8 && FlagGet(FLAG_SYS_CRUISE_MODE)) + return 1; + if (a3 == 5) + return 16; + if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1) + return 8; + if (Overworld_IsBikingAllowed() != TRUE) + return 1; + if (playerStruct->player_field_0 == 2) + return 2; + if (playerStruct->player_field_0 != 4) + return 1; + return 4; +} + +u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4) +{ + if (FlagGet(FLAG_SYS_CRUISE_MODE) && a4 == 6) + return 4; + if (MetatileBehavior_IsDeepSouthWarp(a3) == TRUE) + return 2; + if (MetatileBehavior_IsNonAnimDoor(a3) == TRUE || MetatileBehavior_IsDoor(a3) == TRUE) + return 1; + if (MetatileBehavior_IsSouthArrowWarp(a3) == TRUE) + return 2; + if (MetatileBehavior_IsNorthArrowWarp(a3) == TRUE) + return 1; + if (MetatileBehavior_IsWestArrowWarp(a3) == TRUE) + return 4; + if (MetatileBehavior_IsEastArrowWarp(a3) == TRUE) + return 3; + if ((playerStruct->player_field_0 == 16 && a2 == 8) + || (playerStruct->player_field_0 == 8 && a2 == 16)) + return playerStruct->player_field_1; + if (MetatileBehavior_IsLadder(a3) == TRUE) + return playerStruct->player_field_1; + return 1; +} + +u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void) +{ + return MapGridGetMetatileBehaviorAt(gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7); +} + +bool32 Overworld_IsBikingAllowed(void) +{ + // is player in cycling road entrance? + if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE) + && (gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE) + || gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE))) + return TRUE; + + // is player indoor, in a secret base, or underwater? + if (gMapHeader.mapType == MAP_TYPE_INDOOR) + return FALSE; + if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE) + return FALSE; + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) + return FALSE; + + // Thou shalt not bike on the sacred resting grounds of Kyogre/Groudon. + if (gSaveBlock1.location.mapGroup == MAP_GROUP(SEAFLOOR_CAVERN_ROOM9) + && gSaveBlock1.location.mapNum == MAP_NUM(SEAFLOOR_CAVERN_ROOM9)) + return FALSE; + if (gSaveBlock1.location.mapGroup == MAP_GROUP(CAVE_OF_ORIGIN_B4F) + && gSaveBlock1.location.mapNum == MAP_NUM(CAVE_OF_ORIGIN_B4F)) + return FALSE; + + return TRUE; +} + +void SetDefaultFlashLevel(void) +{ + if (!gMapHeader.cave) + gSaveBlock1.flashLevel = 0; + else if (FlagGet(FLAG_SYS_USE_FLASH)) + gSaveBlock1.flashLevel = 1; + else + gSaveBlock1.flashLevel = gMaxFlashLevel; +} + +void Overworld_SetFlashLevel(s32 flashLevel) +{ + if (flashLevel < 0 || flashLevel > gMaxFlashLevel) + flashLevel = 0; + gSaveBlock1.flashLevel = flashLevel; +} + +u8 Overworld_GetFlashLevel(void) +{ + return gSaveBlock1.flashLevel; +} + +void sub_8053D14(u16 mapDataId) +{ + gSaveBlock1.mapDataId = mapDataId; + gMapHeader.mapData = get_mapdata_header(); +} + +static bool16 ShouldLegendaryMusicPlayAtLocation(struct WarpData *warp) +{ + if (!FlagGet(FLAG_SYS_WEATHER_CTRL)) + return FALSE; + if (warp->mapGroup == 0) + { + switch (warp->mapNum) + { + case MAP_NUM(LILYCOVE_CITY): + case MAP_NUM(MOSSDEEP_CITY): + case MAP_NUM(SOOTOPOLIS_CITY): + case MAP_NUM(EVER_GRANDE_CITY): + return TRUE; + case MAP_NUM(ROUTE124): + case MAP_NUM(ROUTE125): + case MAP_NUM(ROUTE126): + case MAP_NUM(ROUTE127): + case MAP_NUM(ROUTE128): + return TRUE; + } + } + return FALSE; +} + +static bool16 IsInfiltratedWeatherInstitute(struct WarpData *warp) +{ + if (VarGet(VAR_WEATHER_INSTITUTE_STATE)) + return FALSE; + if (warp->mapGroup != MAP_GROUP(ROUTE119_WEATHER_INSTITUTE_1F)) + return FALSE; + if (warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_1F) + || warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_2F)) + return TRUE; + return FALSE; +} + +static u16 GetLocationMusic(struct WarpData *warp) +{ + if (ShouldLegendaryMusicPlayAtLocation(warp) == TRUE) + return LEGENDARY_MUSIC; + else if (IsInfiltratedWeatherInstitute(warp) == TRUE) + return BGM_TOZAN; + else + return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music; +} + +u16 GetCurrLocationDefaultMusic(void) +{ + u16 music; + + // Play the desert music only when the sandstorm is active on Route 111. + if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE111) + && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE111) + && GetSav1Weather() == 8) + return BGM_ASHROAD; + + music = GetLocationMusic(&gSaveBlock1.location); + if (music != 0x7FFF) + { + return music; + } + else + { + if (gSaveBlock1.pos.x < 24) + return BGM_DOORO_X1; + else + return BGM_GRANROAD; + } +} + +u16 GetWarpDestinationMusic(void) +{ + u16 music = GetLocationMusic(&gWarpDestination); + if (music != 0x7FFF) + { + return music; + } + else + { + if (gSaveBlock1.location.mapGroup == MAP_GROUP(MAUVILLE_CITY) + && gSaveBlock1.location.mapNum == MAP_NUM(MAUVILLE_CITY)) + return BGM_DOORO_X1; + else + return BGM_GRANROAD; + } +} + +void Overworld_ResetMapMusic(void) +{ + ResetMapMusic(); +} + +void Overworld_PlaySpecialMapMusic(void) +{ + u16 music = GetCurrLocationDefaultMusic(); + + if (music != LEGENDARY_MUSIC) + { + if (gSaveBlock1.savedMusic) + music = gSaveBlock1.savedMusic; + else if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER) + music = BGM_DEEPDEEP; + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + music = BGM_NAMINORI; + } + + if (music != GetCurrentMapMusic()) + PlayNewMapMusic(music); +} + +void Overworld_SetSavedMusic(u16 songNum) +{ + gSaveBlock1.savedMusic = songNum; +} + +void Overworld_ClearSavedMusic(void) +{ + gSaveBlock1.savedMusic = 0; +} + +void sub_8053F0C(void) +{ + if (FlagGet(FLAG_SPECIAL_FLAG_1) != TRUE) + { + u16 newMusic = GetWarpDestinationMusic(); + u16 currentMusic = GetCurrentMapMusic(); + if (newMusic != LEGENDARY_MUSIC) + { + if (currentMusic == BGM_DEEPDEEP || currentMusic == BGM_NAMINORI) + return; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + newMusic = BGM_NAMINORI; + } + if (newMusic != currentMusic) + { + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + FadeOutAndFadeInNewMapMusic(newMusic, 4, 4); + else + FadeOutAndPlayNewMapMusic(newMusic, 8); + } + } +} + +void Overworld_ChangeMusicToDefault(void) +{ + u16 currentMusic = GetCurrentMapMusic(); + if (currentMusic != GetCurrLocationDefaultMusic()) + FadeOutAndPlayNewMapMusic(GetCurrLocationDefaultMusic(), 8); +} + +void Overworld_ChangeMusicTo(u16 newMusic) +{ + u16 currentMusic = GetCurrentMapMusic(); + if (currentMusic != newMusic && currentMusic != LEGENDARY_MUSIC) + FadeOutAndPlayNewMapMusic(newMusic, 8); +} + +u8 GetMapMusicFadeoutSpeed(void) +{ + struct MapHeader *mapHeader = warp1_get_mapheader(); + if (Overworld_MapTypeIsIndoors(mapHeader->mapType) == TRUE) + return 2; + else + return 4; +} + +void sub_8053FF8(void) +{ + u16 music = GetWarpDestinationMusic(); + if (FlagGet(FLAG_SPECIAL_FLAG_1) != TRUE && music != GetCurrentMapMusic()) + { + u8 speed = GetMapMusicFadeoutSpeed(); + FadeOutMapMusic(speed); + } +} + +bool8 sub_8054034(void) +{ + return IsNotWaitingForBGMStop(); +} + +void Overworld_FadeOutMapMusic(void) +{ + FadeOutMapMusic(4); +} + +static void PlayAmbientCry(void) +{ + s16 x, y; + s8 pan; + s8 volume; + + PlayerGetDestCoords(&x, &y); + if (sIsAmbientCryWaterMon == TRUE + && !MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) + return; + pan = (Random() % 88) + 212; + volume = (Random() % 30) + 50; + PlayCry2(sAmbientCrySpecies, pan, volume, 1); +} + +void UpdateAmbientCry(s16 *state, u16 *delayCounter) +{ + switch (*state) + { + case 0: + if (sAmbientCrySpecies == SPECIES_NONE) + *state = 4; + else + *state = 1; + break; + case 1: + *delayCounter = (Random() % 2400) + 1200; + *state = 3; + break; + case 2: + *delayCounter = (Random() % 1200) + 1200; + *state = 3; + break; + case 3: + (*delayCounter)--; + if (*delayCounter == 0) + { + PlayAmbientCry(); + *state = 2; + } + break; + case 4: + break; + } +} + +void ChooseAmbientCrySpecies(void) +{ + if ((gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE130) + && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE130)) + && !IsMirageIslandPresent()) + { + // Only play water pokemon cries on this route + // when Mirage Island is not present + sIsAmbientCryWaterMon = TRUE; + sAmbientCrySpecies = GetLocalWaterMon(); + } + else + { + sAmbientCrySpecies = GetLocalWildMon(&sIsAmbientCryWaterMon); + } +} + +u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum) +{ + return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->mapType; +} + +u8 GetMapTypeByWarpData(struct WarpData *warp) +{ + return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum); +} + +u8 Overworld_GetMapTypeOfSaveblockLocation(void) +{ + return GetMapTypeByWarpData(&gSaveBlock1.location); +} + +u8 get_map_type_from_warp0(void) +{ + return GetMapTypeByWarpData(&gUnknown_020297F0); +} + +bool8 is_map_type_1_2_3_5_or_6(u8 mapType) +{ + if (mapType == MAP_TYPE_ROUTE + || mapType == MAP_TYPE_TOWN + || mapType == MAP_TYPE_UNDERWATER + || mapType == MAP_TYPE_CITY + || mapType == MAP_TYPE_6) + return TRUE; + else + return FALSE; +} + +bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType) +{ + if (mapType == MAP_TYPE_ROUTE + || mapType == MAP_TYPE_TOWN + || mapType == MAP_TYPE_6 + || mapType == MAP_TYPE_CITY) + return TRUE; + else + return FALSE; +} + +bool8 Overworld_MapTypeIsIndoors(u8 mapType) +{ + if (mapType == MAP_TYPE_INDOOR + || mapType == MAP_TYPE_SECRET_BASE) + return TRUE; + else + return FALSE; +} + +u8 unref_sub_8054260(void) +{ + return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum)->regionMapSectionId; +} + +u8 sav1_map_get_name(void) +{ + return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->regionMapSectionId; +} + +u8 sav1_map_get_battletype(void) +{ + return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType; +} + +#if DEBUG + +void debug_sub_8076B68(void); + +void debug_sub_80589D8(void); + +void debug_sub_8058A50(void); + +void CB2_InitTestMenu(void) +{ + m4aSoundVSyncOff(); + SetVBlankCallback(NULL); + DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + ScanlineEffect_Stop(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + debug_sub_8076B68(); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + REG_IE |= 1; + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; + m4aSoundVSyncOn(); + SetVBlankCallback(debug_sub_8058A50); + m4aSongNumStart(0x19D); + SetMainCallback2(debug_sub_80589D8); +} + +void debug_sub_80589D8(void) +{ + if (UpdatePaletteFade()) + return; + + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); +} + +void debug_sub_80589F4(void) +{ + if (UpdatePaletteFade()) + return; + + SetVBlankCallback(NULL); + + DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); + + SetMainCallback2(gMain.savedCallback); +} + +void debug_sub_8058A50(void) +{ + ProcessSpriteCopyRequests(); + LoadOam(); + TransferPlttBuffer(); +} + +#endif + +void ResetSafariZoneFlag_(void) +{ + ResetSafariZoneFlag(); +} + +bool32 is_c1_link_related_active(void) +{ + if (gMain.callback1 == sub_8055354) + return TRUE; + else + return FALSE; +} + +void c1_overworld_normal(u16 newKeys, u16 heldKeys) +{ + struct FieldInput inputStruct; + + sub_8059204(); + FieldClearPlayerInput(&inputStruct); + FieldGetPlayerInput(&inputStruct, newKeys, heldKeys); + if (!ScriptContext2_IsEnabled()) + { + if (sub_8068024(&inputStruct) == 1) + { + ScriptContext2_Enable(); + HideMapNamePopup(); + } + else + { + player_step(inputStruct.dpadDirection, newKeys, heldKeys); + } + } +} + +void c1_overworld(void) +{ + if (gMain.callback2 == c2_overworld) + c1_overworld_normal(gMain.newKeys, gMain.heldKeys); +} + +void OverworldBasic(void) +{ + ScriptContext2_RunScript(); + RunTasks(); + AnimateSprites(); + CameraUpdate(); + UpdateCameraPanning(); + BuildOamBuffer(); + UpdatePaletteFade(); + sub_8072EDC(); +} + +// This CB2 is used when starting +void CB2_OverworldBasic(void) +{ + OverworldBasic(); +} + +void c2_overworld(void) +{ + int fading = (gPaletteFade.active != 0); + if (fading) + SetVBlankCallback(NULL); + OverworldBasic(); + if (fading) + SetFieldVBlankCallback(); +} + +void set_callback1(MainCallback cb) +{ + gMain.callback1 = cb; +} + +void sub_80543DC(u16 (*a1)(u32)) +{ + gUnknown_03000584 = a1; +} + +void sub_80543E8(void) +{ + if (gFieldCallback != NULL) + gFieldCallback(); + else + mapldr_default(); + gFieldCallback = NULL; +} + +void CB2_NewGame(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + NewGameInitData(); + player_avatar_init_params_reset(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + gFieldCallback = ExecuteTruckSequence; + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +#if DEBUG + +extern void (*gFieldCallback)(void); + +void debug_sub_8058C00(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + player_avatar_init_params_reset(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + + if (gMain.heldKeys & R_BUTTON) + gFieldCallback = ExecuteTruckSequence; + else + gFieldCallback = sub_8080B60; + + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +#endif + +void CB2_WhiteOut(void) +{ + u8 val; + gMain.state++; + if (gMain.state >= 120) + { + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + DoWhiteOut(); + player_avatar_init_params_reset(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + gFieldCallback = sub_8080B60; + val = 0; + do_load_map_stuff_loop(&val); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); + } +} + +void CB2_LoadMap(void) +{ + FieldClearVBlankHBlankCallbacks(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + set_callback1(NULL); + SetMainCallback2(sub_810CC80); + gMain.savedCallback = CB2_LoadMap2; +} + +void CB2_LoadMap2(void) +{ + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +void sub_8054534(void) +{ + if (!gMain.state) + { + FieldClearVBlankHBlankCallbacks(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + set_callback1(NULL); + } + if (sub_805493C(&gMain.state, 1)) + { + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); + } +} + +void sub_8054588(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = sub_8080AC4; + SetMainCallback2(c2_80567AC); +} + +void c2_80567AC(void) +{ + if (sub_805483C(&gMain.state)) + { + SetFieldVBlankCallback(); + set_callback1(sub_8055354); + sub_80543DC(sub_8055390); + SetMainCallback2(c2_overworld); + } +} + +void c2_exit_to_overworld_2_switch(void) +{ + if (is_c1_link_related_active() == TRUE) + { + SetMainCallback2(c2_exit_to_overworld_2_link); + } + else + { + FieldClearVBlankHBlankCallbacks(); + SetMainCallback2(c2_exit_to_overworld_2_local); + } +} + +void c2_exit_to_overworld_2_local(void) +{ + if (sub_8054A4C(&gMain.state)) + { + SetFieldVBlankCallback(); + SetMainCallback2(c2_overworld); + } +} + +void c2_exit_to_overworld_2_link(void) +{ + if (!sub_8055870() && sub_8054A9C(&gMain.state)) + SetMainCallback2(c2_overworld); +} + +void sub_805465C(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + sub_8054F70(); + set_callback1(sub_8055354); + sub_80543DC(sub_8055390); + gFieldCallback = sub_8080A3C; + ScriptContext1_Init(); + ScriptContext2_Disable(); + c2_exit_to_overworld_2_switch(); +} + +void sub_805469C(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = atk17_seteffectsecondary; + c2_exit_to_overworld_2_switch(); +} + +void sub_80546B8(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = sub_80809B0; + c2_exit_to_overworld_2_switch(); +} + +void c2_exit_to_overworld_1_continue_scripts_restart_music(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = sub_8080990; + c2_exit_to_overworld_2_switch(); +} + +void sub_80546F0(void) +{ + FieldClearVBlankHBlankCallbacks(); + gFieldCallback = sub_8080B60; + c2_exit_to_overworld_2_switch(); +} + +void sub_805470C(void) +{ + if (gMapHeader.flags == 1 && sub_80BBB24() == 1) + ShowMapNamePopup(); + sub_8080B60(); +} + +void CB2_ContinueSavedGame(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); +#if DEBUG + if (gMain.heldKeys & R_BUTTON) + gUnknown_020297ED = TRUE; +#endif + ResetSafariZoneFlag_(); + LoadSaveblockMapHeader(); + LoadSaveblockMapObjScripts(); + UnfreezeMapObjects(); + DoTimeBasedEvents(); + sub_805308C(); + sub_8055FC0(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + if (GetSecretBase2Field_9() == 1) + { + ClearSecretBase2Field_9(); + sub_8053778(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + } + else + { + gFieldCallback = sub_805470C; + set_callback1(c1_overworld); + c2_exit_to_overworld_2_switch(); + } +} + +void FieldClearVBlankHBlankCallbacks(void) +{ + u16 savedIme = REG_IME; + REG_IME = 0; + REG_IE &= ~INTR_FLAG_HBLANK; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); +} + +void SetFieldVBlankCallback(void) +{ + SetVBlankCallback(VBlankCB_Field); +} + +void VBlankCB_Field(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + ScanlineEffect_InitHBlankDmaTransfer(); + sub_8057A58(); + TransferPlttBuffer(); + sub_8072E74(); +} + +void sub_8054814(void) +{ + u8 val = Overworld_GetFlashLevel(); + if (val) + { + sub_80815E0(val); + ScanlineEffect_SetParams(gUnknown_08216694); + } +} + +bool32 sub_805483C(u8 *a1) +{ + switch (*a1) + { + case 0: + FieldClearVBlankHBlankCallbacks(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + sub_8054F70(); + sub_8054BA8(); + (*a1)++; + break; + case 1: + sub_8053994(1); + (*a1)++; + break; + case 2: + sub_8054D4C(1); + (*a1)++; + break; + case 3: + sub_8054E98(); + sub_8054D90(); + sub_8054EC8(); + sub_8054E60(); + (*a1)++; + break; + case 4: + sub_8054814(); + sub_8054C54(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + (*a1)++; + break; + case 5: + move_tilemap_camera_to_upper_left_corner(); + (*a1)++; + break; + case 6: + sub_8056D28(gMapHeader.mapData); + (*a1)++; + break; + case 7: + sub_8056D38(gMapHeader.mapData); + (*a1)++; + break; + case 8: + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + (*a1)++; + break; + case 9: + DrawWholeMapView(); + (*a1)++; + break; + case 10: + cur_mapheader_run_tileset_funcs_after_some_cpuset(); + (*a1)++; + break; + case 12: + sub_80543E8(); + (*a1)++; + break; + case 11: + (*a1)++; + break; + case 13: + return 1; + } + return 0; +} + +bool32 sub_805493C(u8 *a1, u32 a2) +{ + switch (*a1) + { + case 0: + FieldClearVBlankHBlankCallbacks(); + sub_8053994(a2); + (*a1)++; + break; + case 1: + sub_8054BA8(); + (*a1)++; + break; + case 2: + sub_8054D4C(a2); + (*a1)++; + break; + case 3: + mli4_mapscripts_and_other(); + sub_8054E34(); + (*a1)++; + break; + case 4: + sub_8054814(); + sub_8054C54(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + (*a1)++; + break; + case 5: + move_tilemap_camera_to_upper_left_corner(); + (*a1)++; + break; + case 6: + sub_8056D28(gMapHeader.mapData); + (*a1)++; + break; + case 7: + sub_8056D38(gMapHeader.mapData); + (*a1)++; + break; + case 8: + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + (*a1)++; + break; + case 9: + DrawWholeMapView(); + (*a1)++; + break; + case 10: + cur_mapheader_run_tileset_funcs_after_some_cpuset(); + (*a1)++; + break; + case 11: + if (gMapHeader.flags == 1 && sub_80BBB24() == 1) + ShowMapNamePopup(); + (*a1)++; + break; + case 12: + sub_80543E8(); + (*a1)++; + break; + case 13: + return 1; + } + return 0; +} + +bool32 sub_8054A4C(u8 *a1) +{ + switch (*a1) + { + case 0: + sub_8054BA8(); + sub_8054D4C(0); + sub_8054E20(); + sub_8054E34(); + (*a1)++; + break; + case 1: + sub_8054C2C(); + (*a1)++; + break; + case 2: + sub_80543E8(); + (*a1)++; + break; + case 3: + return 1; + } + return 0; +} + +bool32 sub_8054A9C(u8 *a1) +{ + switch (*a1) + { + case 0: + FieldClearVBlankHBlankCallbacks(); + sub_8054BA8(); + (*a1)++; + break; + case 1: + sub_8054D4C(1); + (*a1)++; + break; + case 2: + sub_8054F48(); + sub_8054E20(); + sub_8054E7C(); + (*a1)++; + break; + case 3: + sub_8054814(); + sub_8054C54(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + (*a1)++; + break; + case 4: + move_tilemap_camera_to_upper_left_corner(); + (*a1)++; + break; + case 5: + sub_8056D28(gMapHeader.mapData); + (*a1)++; + break; + case 6: + sub_8056D38(gMapHeader.mapData); + (*a1)++; + break; + case 7: + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + (*a1)++; + break; + case 8: + DrawWholeMapView(); + (*a1)++; + break; + case 9: + cur_mapheader_run_tileset_funcs_after_some_cpuset(); + (*a1)++; + break; + case 12: + sub_80543E8(); + (*a1)++; + break; + case 10: + case 11: + (*a1)++; + break; + case 13: + SetFieldVBlankCallback(); + (*a1)++; + return 1; + } + return 0; +} + +void do_load_map_stuff_loop(u8 *a1) +{ + while (!sub_805493C(a1, 0)) + ; +} + +void sub_8054BA8(void) +{ + REG_DISPCNT = 0; + + ScanlineEffect_Stop(); + + DmaClear16(3, PLTT + 2, PLTT_SIZE - 2); + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); + ResetOamRange(0, 128); + LoadOam(); +} + +void sub_8054C2C(void) +{ + sub_8054814(); + sub_8054C54(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + mapdata_load_assets_to_gpu_and_full_redraw(); +} + +void sub_8054C54(void) +{ + REG_MOSAIC = 0; + REG_WININ = 7967; + REG_WINOUT = 257; + REG_WIN0H = 255; + REG_WIN0V = 255; + REG_WIN1H = -1; + REG_WIN1V = -1; + REG_BLDCNT = gUnknown_081E29E0[1] | gUnknown_081E29E0[2] | gUnknown_081E29E0[3] | 0x1040; + REG_BLDALPHA = 1805; + *gBGHOffsetRegs[0] = 0; + *gBGVOffsetRegs[0] = 0; + *gBGControlRegs[0] = 0; + *gBGHOffsetRegs[1] = 0; + *gBGVOffsetRegs[1] = 0; + *gBGControlRegs[1] = 7489; + *gBGHOffsetRegs[2] = 0; + *gBGVOffsetRegs[2] = 0; + *gBGControlRegs[2] = 7234; + *gBGHOffsetRegs[3] = 0; + *gBGVOffsetRegs[3] = 0; + *gBGControlRegs[3] = 7747; + REG_DISPCNT = gUnknown_081E29D8[1] | 0x7060 | gUnknown_081E29D8[2] | gUnknown_081E29D8[0] | gUnknown_081E29D8[3]; +} + +void sub_8054D4C(u32 a1) +{ + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + ScanlineEffect_Clear(); + ResetCameraUpdateInfo(); + InstallCameraPanAheadCallback(); + sub_805C7C4(0); + FieldEffectActiveListClear(); + InitFieldMessageBox(); + StartWeather(); + sub_8080750(); + if (!a1) + SetUpFieldTasks(); + mapheader_run_script_with_tag_x5(); +} + +void sub_8054D90(void) +{ + gUnknown_0300489C = 0; + gUnknown_03004898 = 0; + sub_805AA98(); + sub_805B55C(0, 0); + mapheader_run_first_tag4_script_list_match(); +} + +void mli4_mapscripts_and_other(void) +{ + s16 x, y; + struct UnkPlayerStruct *player; + gUnknown_0300489C = 0; + gUnknown_03004898 = 0; + sub_805AA98(); + sav1_camera_get_focus_coords(&x, &y); + player = sub_8053AA8(); + InitPlayerAvatar(x, y, player->player_field_1, gSaveBlock2.playerGender); + SetPlayerAvatarTransitionFlags(player->player_field_0); + player_avatar_init_params_reset(); + sub_805B55C(0, 0); + ResetBerryTreeSparkleFlags(); + mapheader_run_first_tag4_script_list_match(); +} + +void sub_8054E20(void) +{ + sub_805B710(0, 0); + RotatingGate_InitPuzzleAndGraphics(); +} + +void sub_8054E34(void) +{ + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 = 1; + InitCameraUpdateCallback(gPlayerAvatar.spriteId); +} + +void sub_8054E60(void) +{ + InitCameraUpdateCallback(sub_8055AE8(gUnknown_03004860)); +} + +void sub_8054E7C(void) +{ + InitCameraUpdateCallback(sub_8055AE8(gUnknown_03004860)); +} + +void sub_8054E98(void) +{ + u16 x, y; + sav1_camera_get_focus_coords(&x, &y); + sub_8056C50(x + gUnknown_03004860, y); +} + +void sub_8054EC8(void) +{ + u16 i; + u16 x, y; + + sav1_camera_get_focus_coords(&x, &y); + x -= gUnknown_03004860; + + for (i = 0; i < gFieldLinkPlayerCount; i++) + { + SpawnLinkPlayerMapObject(i, i + x, y, gLinkPlayers[i].gender); + CreateLinkPlayerSprite(i); + } + + sub_8055340(word_3002910); +} + +void sub_8054F48(void) +{ + u16 i; + for (i = 0; i < gFieldLinkPlayerCount; i++) + CreateLinkPlayerSprite(i); +} + +void sub_8054F70(void) +{ + int i; + for (i = 0; i < 4; i++) + gUnknown_03000580[i] = 0x80; +} + +bool32 sub_8054F88(u16 a1) +{ + int i; + int count = gFieldLinkPlayerCount; + + for (i = 0; i < count; i++) + if (gUnknown_03000580[i] != a1) + return FALSE; + return TRUE; +} + +bool32 sub_8054FC0(u16 a1) +{ + int i; + int count = gFieldLinkPlayerCount; + + for (i = 0; i < count; i++) + if (gUnknown_03000580[i] == a1) + return TRUE; + return FALSE; +} + +void sub_8054FF8(u32 a1, u16 a2, struct UnkStruct_8054FF8 *a3, u16 *a4) +{ + u8 *script; + + if (gUnknown_03000580[a1] == 0x80) + { + script = sub_8055648(a3); + if (script) + { + *a4 = sub_8055758(script); + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_8055808(script); + } + return; + } + if (sub_8054FC0(0x83) == 1) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_805585C(); + } + return; + } + switch (a2) + { + case 24: + if (sub_8055630(a3)) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_80557F4(); + } + } + break; + case 18: + if (sub_8055660(a3) == 1) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_8055824(); + } + } + break; + case 25: + script = sub_805568C(a3); + if (script) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_80553E4); + sub_8055840(script); + } + } + break; + case 27: + if (sub_8055618(a3)) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_8055408); + sub_80557E8(); + } + } + break; + case 28: + if (sub_8055618(a3)) + { + gUnknown_03000580[a1] = 0x81; + if (a3->b) + { + sub_80543DC(sub_8055438); + sub_80557E8(); + } + } + break; + } + } + + switch (a2) + { + case 23: + gUnknown_03000580[a1] = 0x83; + break; + case 22: + gUnknown_03000580[a1] = 0x82; + break; + case 26: + gUnknown_03000580[a1] = 0x80; + if (a3->b) + sub_80543DC(sub_8055390); + break; + case 29: + if (gUnknown_03000580[a1] == 0x82) + gUnknown_03000580[a1] = 0x81; + break; + } +} + +void sub_8055218(u16 *a1, int a2) +{ + struct UnkStruct_8054FF8 st; + int i; + for (i = 0; i < 4; i++) + { + u16 v5 = a1[i]; + u16 v8 = 0; + sub_80555B0(i, a2, &st); + sub_8054FF8(i, v5, &st, &v8); + if (gUnknown_03000580[i] == 0x80) + v8 = sub_805530C(v5); + sub_8055BFC(i, v8); + } +} + +void sub_8055280(u16 a1) +{ + if (a1 >= 17 && a1 < 30) + word_3004858 = a1; + else + word_3004858 = 17; +} + +u16 sub_80552B0(u32 a1) +{ + if (gMain.heldKeys & DPAD_UP) + { + return 19; + } + else if (gMain.heldKeys & DPAD_DOWN) + { + return 18; + } + else if (gMain.heldKeys & DPAD_LEFT) + { + return 20; + } + else if (gMain.heldKeys & DPAD_RIGHT) + { + return 21; + } + else if (gMain.newKeys & START_BUTTON) + { + return 24; + } + else if (gMain.newKeys & A_BUTTON) + { + return 25; + } + else + { + return 17; + } +} + +u16 sub_805530C(u16 a1) +{ + switch (a1) + { + case 21: + return 4; + case 20: + return 3; + case 19: + return 1; + case 18: + return 2; + default: + return 0; + } +} + +void sub_8055340(u16 *a1) +{ + int i; + for (i = 0; i < 4; i++) + a1[i] = 17; +} + +void sub_8055354(void) +{ + u8 val = gUnknown_03004860; + sub_8055218(word_3002910, val); + sub_8055280(gUnknown_03000584(val)); + sub_8055340(word_3002910); +} + +u16 sub_8055390(u32 a1) +{ + if (ScriptContext2_IsEnabled() == 1) + return 17; + if (gLink.recvQueue.count > 4) + return 27; + if (gLink.sendQueue.count <= 4) + return sub_80552B0(a1); + return 28; +} + +u16 sub_80553E0(u32 a1) +{ + return 17; +} + +u16 sub_80553E4(u32 a1) +{ + u16 retVal; + if (ScriptContext2_IsEnabled() == 1) + { + retVal = 17; + } + else + { + retVal = 26; + sub_80543DC(sub_80553E0); + } + return retVal; +} + +u16 sub_8055408(u32 a1) +{ + u16 retVal; + if (gLink.recvQueue.count > 2) + { + retVal = 17; + } + else + { + retVal = 26; + ScriptContext2_Disable(); + sub_80543DC(sub_80553E0); + } + return retVal; +} + +u16 sub_8055438(u32 a1) +{ + u16 retVal; + if (gLink.sendQueue.count > 2) + { + retVal = 17; + } + else + { + retVal = 26; + ScriptContext2_Disable(); + sub_80543DC(sub_80553E0); + } + return retVal; +} + +u16 sub_8055468(u32 a1) +{ + return 17; +} + +u16 sub_805546C(u32 linkPlayerId) +{ + if (gUnknown_03000580[linkPlayerId] == 0x82 && (gMain.newKeys & B_BUTTON)) + { + sub_80543DC(sub_8055468); + return 29; + } + else + { + return 17; + } +} + +u16 sub_80554A4(u32 a1) +{ + sub_80543DC(sub_805546C); + return 22; +} + +u16 sub_80554B8(u32 a1) +{ + return 17; +} + +u16 sub_80554BC(u32 a1) +{ + if (sub_8054F88(0x83) == TRUE) + { + ScriptContext1_SetupScript(gUnknown_081A4508); + sub_80543DC(sub_80554B8); + } + return 17; +} + +u16 sub_80554E4(u32 a1) +{ + sub_80543DC(sub_80554BC); + return 23; +} + +s32 sub_80554F8(void) +{ + if (sub_8054FC0(0x83) == TRUE) + return 2; + if (gUnknown_03000584 == sub_805546C && gUnknown_03000580[gUnknown_03004860] != 0x82) + return 0; + if (gUnknown_03000584 == sub_8055468 && gUnknown_03000580[gUnknown_03004860] == 0x81) + return 2; + return sub_8054F88(0x82); +} + +bool32 unref_sub_8055568(void) +{ + return sub_8054FC0(0x83); +} + +u16 sub_8055574(void) +{ + sub_80543DC(sub_80554A4); + return 0; +} + +u16 sub_8055588(void) +{ + sub_80543DC(sub_80553E4); + return 0; +} + +u16 sub_805559C(void) +{ + sub_80543DC(sub_80554E4); + return 0; +} + +void sub_80555B0(int linkPlayerId, int a2, struct UnkStruct_8054FF8 *a3) +{ + s16 x, y; + + a3->a = linkPlayerId; + a3->b = (linkPlayerId == a2) ? 1 : 0; + a3->c = gLinkPlayerMapObjects[linkPlayerId].mode; + a3->d = sub_8055B30(linkPlayerId); + sub_8055B08(linkPlayerId, &x, &y); + a3->sub.x = x; + a3->sub.y = y; + a3->sub.height = sub_8055B50(linkPlayerId); + a3->field_C = MapGridGetMetatileBehaviorAt(x, y); +} + +bool32 sub_8055618(struct UnkStruct_8054FF8 *a1) +{ + u8 v1 = a1->c; + if (v1 == 2 || v1 == 0) + return TRUE; + else + return FALSE; +} + +bool32 sub_8055630(struct UnkStruct_8054FF8 *a1) +{ + u8 v1 = a1->c; + if (v1 == 2 || v1 == 0) + return TRUE; + else + return FALSE; +} + +u8 *sub_8055648(struct UnkStruct_8054FF8 *a1) +{ + if (a1->c != 2) + return 0; + return sub_8068E24(&a1->sub); +} + +bool32 sub_8055660(struct UnkStruct_8054FF8 *a1) +{ + if (a1->c != 2 && a1->c != 0) + return FALSE; + if (!MetatileBehavior_IsSouthArrowWarp(a1->field_C)) + return FALSE; + if (a1->d != 1) + return FALSE; + return TRUE; +} + +u8 *sub_805568C(struct UnkStruct_8054FF8 *a1) +{ + struct MapPosition unkStruct; + u8 linkPlayerId; + + if (a1->c && a1->c != 2) + return 0; + + unkStruct = a1->sub; + unkStruct.x += gUnknown_0821664C[a1->d].x; + unkStruct.y += gUnknown_0821664C[a1->d].y; + unkStruct.height = 0; + linkPlayerId = GetLinkPlayerIdAt(unkStruct.x, unkStruct.y); + + if (linkPlayerId != 4) + { + if (!a1->b) + return TradeRoom_TooBusyToNotice; + if (gUnknown_03000580[linkPlayerId] != 0x80) + return TradeRoom_TooBusyToNotice; + if (!sub_8083BF4(linkPlayerId)) + return TradeRoom_ReadTrainerCard1; + else + return TradeRoom_ReadTrainerCard2; + } + + return sub_80682A8(&unkStruct, a1->field_C, a1->d); +} + +u16 sub_8055758(u8 *script) +{ + if (script == DoubleBattleColosseum_EventScript_1A4383) + return 10; + if (script == DoubleBattleColosseum_EventScript_1A439E) + return 9; + if (script == DoubleBattleColosseum_EventScript_1A43B9) + return 10; + if (script == DoubleBattleColosseum_EventScript_1A43D4) + return 9; + if (script == RecordCorner_EventScript_1A4418) + return 10; + if (script == RecordCorner_EventScript_1A442D) + return 9; + if (script == RecordCorner_EventScript_1A4442) + return 10; + if (script == RecordCorner_EventScript_1A4457) + return 9; + if (script == SingleBattleColosseum_EventScript_1A436F) + return 10; + if (script == SingleBattleColosseum_EventScript_1A4379) + return 9; + if (script == TradeCenter_EventScript_1A43F0) + return 10; + if (script == TradeCenter_EventScript_1A43FA) + return 9; + return 0; +} + +void sub_80557E8(void) +{ + ScriptContext2_Enable(); +} + +void sub_80557F4(void) +{ + PlaySE(SE_WIN_OPEN); + sub_8071310(); + ScriptContext2_Enable(); +} + +void sub_8055808(u8 *script) +{ + PlaySE(SE_SELECT); + ScriptContext1_SetupScript(script); + ScriptContext2_Enable(); +} + +void sub_8055824(void) +{ + PlaySE(SE_WIN_OPEN); + ScriptContext1_SetupScript(TradeRoom_PromptToCancelLink); + ScriptContext2_Enable(); +} + +void sub_8055840(u8 *script) +{ + PlaySE(SE_SELECT); + ScriptContext1_SetupScript(script); + ScriptContext2_Enable(); +} + +void sub_805585C(void) +{ + ScriptContext1_SetupScript(TradeRoom_TerminateLink); + ScriptContext2_Enable(); +} + +bool32 sub_8055870(void) +{ + if (!is_c1_link_related_active()) + return 0; + if (gLink.recvQueue.count >= 3) + gUnknown_03000588 = 1; + else + gUnknown_03000588 = 0; + return gUnknown_03000588; +} + +bool32 sub_80558AC(void) +{ + u8 temp; + + if (is_c1_link_related_active() != TRUE) + return FALSE; + + if (sub_8007B24() != TRUE) + return FALSE; + + if (gUnknown_03000584 == sub_8055408) + return TRUE; + + if (gUnknown_03000584 != sub_80553E4) + return FALSE; + + temp = gUnknown_03000588; + gUnknown_03000588 = 0; + + if (temp == TRUE) + return TRUE; + + if (gPaletteFade.active && gPaletteFade.softwareFadeFinishing) + return TRUE; + + return FALSE; +} + +bool32 sub_8055910(void) +{ + if (is_c1_link_related_active() != TRUE) + return FALSE; + + if (sub_8007B24() != TRUE) + return FALSE; + + if (gUnknown_03000584 == sub_8055438) + return TRUE; + + return FALSE; +} + +bool32 sub_8055940(void) +{ + if (!sub_8007B24()) + return FALSE; + return TRUE; +} + +void ZeroLinkPlayerMapObject(struct LinkPlayerMapObject *linkPlayerMapObj) +{ + memset(linkPlayerMapObj, 0, sizeof(struct LinkPlayerMapObject)); +} + +void strange_npc_table_clear(void) +{ + memset(gLinkPlayerMapObjects, 0, sizeof(gLinkPlayerMapObjects)); +} + +void ZeroMapObject(struct MapObject *mapObj) +{ + memset(mapObj, 0, sizeof(struct MapObject)); +} + +void SpawnLinkPlayerMapObject(u8 linkPlayerId, s16 x, s16 y, u8 a4) +{ + u8 mapObjId = sub_805AB54(); + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + + ZeroLinkPlayerMapObject(linkPlayerMapObj); + ZeroMapObject(mapObj); + + linkPlayerMapObj->active = 1; + linkPlayerMapObj->linkPlayerId = linkPlayerId; + linkPlayerMapObj->mapObjId = mapObjId; + linkPlayerMapObj->mode = 0; + + mapObj->active = 1; + mapObj->mapobj_bit_1 = a4; + mapObj->range.as_byte = 2; + mapObj->spriteId = 64; + + InitLinkPlayerMapObjectPos(mapObj, x, y); +} + +void InitLinkPlayerMapObjectPos(struct MapObject *mapObj, s16 x, s16 y) +{ + mapObj->coords2.x = x; + mapObj->coords2.y = y; + mapObj->coords3.x = x; + mapObj->coords3.y = y; + sub_80603CC(x, y, &mapObj->coords1.x, &mapObj->coords1.y); + mapObj->coords1.x += 8; + FieldObjectUpdateZCoord(mapObj); +} + +void unref_sub_8055A6C(u8 linkPlayerId, u8 a2) +{ + if (gLinkPlayerMapObjects[linkPlayerId].active) + { + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + mapObj->range.as_byte = a2; + } +} + +void unref_sub_8055A9C(u8 linkPlayerId) +{ + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; + u8 mapObjId = linkPlayerMapObj->mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + if (mapObj->spriteId != 64 ) + DestroySprite(&gSprites[mapObj->spriteId]); + linkPlayerMapObj->active = 0; + mapObj->active = 0; +} + +u8 sub_8055AE8(u8 linkPlayerId) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + return mapObj->spriteId; +} + +void sub_8055B08(u8 linkPlayerId, u16 *x, u16 *y) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + *x = mapObj->coords2.x; + *y = mapObj->coords2.y; +} + +u8 sub_8055B30(u8 linkPlayerId) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + return mapObj->range.as_byte; +} + +u8 sub_8055B50(u8 linkPlayerId) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + return mapObj->mapobj_unk_0B_0; +} + +s32 unref_sub_8055B74(u8 linkPlayerId) +{ + u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + return 16 - (s8)mapObj->mapobj_unk_21; +} + +u8 GetLinkPlayerIdAt(s16 x, s16 y) +{ + u8 i; + for (i = 0; i < 4; i++) + { + if (gLinkPlayerMapObjects[i].active + && (gLinkPlayerMapObjects[i].mode == 0 || gLinkPlayerMapObjects[i].mode == 2)) + { + struct MapObject *mapObj = &gMapObjects[gLinkPlayerMapObjects[i].mapObjId]; + if (mapObj->coords2.x == x && mapObj->coords2.y == y) + return i; + } + } + return 4; +} + +void sub_8055BFC(u8 linkPlayerId, u8 a2) +{ + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; + u8 mapObjId = linkPlayerMapObj->mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + + if (linkPlayerMapObj->active) + { + if (a2 > 10) + mapObj->mapobj_bit_2 = 1; + else + gUnknown_082166D8[gUnknown_082166A0[linkPlayerMapObj->mode](linkPlayerMapObj, mapObj, a2)](linkPlayerMapObj, mapObj); + } +} + +static u8 sub_8055C68(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3); +} + +static u8 sub_8055C88(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + return 1; +} + +static u8 sub_8055C8C(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3); +} + +static u8 sub_8055CAC(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + return 0; +} + +static u8 sub_8055CB0(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + s16 x, y; + + mapObj->range.as_byte = npc_something3(a3, mapObj->range.as_byte); + FieldObjectMoveDestCoords(mapObj, mapObj->range.as_byte, &x, &y); + + if (LinkPlayerDetectCollision(linkPlayerMapObj->mapObjId, mapObj->range.as_byte, x, y)) + { + return 0; + } + else + { + mapObj->mapobj_unk_21 = 16; + npc_coords_shift(mapObj, x, y); + FieldObjectUpdateZCoord(mapObj); + return 1; + } +} + +static u8 sub_8055D18(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +{ + mapObj->range.as_byte = npc_something3(a3, mapObj->range.as_byte); + return 0; +} + +static void sub_8055D30(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) +{ + linkPlayerMapObj->mode = 0; +} + +static void sub_8055D38(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) +{ + mapObj->mapobj_unk_21--; + linkPlayerMapObj->mode = 1; + MoveCoords(mapObj->range.as_byte, &mapObj->coords1.x, &mapObj->coords1.y); + if (!mapObj->mapobj_unk_21) + { + npc_coords_shift_still(mapObj); + linkPlayerMapObj->mode = 2; + } +} + +u8 npc_something3(u8 a1, u8 a2) +{ + switch (a1 - 1) + { + case 0: + case 6: + return 2; + case 1: + case 7: + return 1; + case 2: + case 8: + return 3; + case 3: + case 9: + return 4; + } + return a2; +} + +u8 LinkPlayerDetectCollision(u8 selfMapObjId, u8 a2, s16 x, s16 y) +{ + u8 i; + for (i = 0; i < 16; i++) + { + if (i != selfMapObjId) + { + if ((gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) + || (gMapObjects[i].coords3.x == x && gMapObjects[i].coords3.y == y)) + { + return 1; + } + } + } + return MapGridIsImpassableAt(x, y); +} + +void CreateLinkPlayerSprite(u8 linkPlayerId) +{ + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; + u8 mapObjId = linkPlayerMapObj->mapObjId; + struct MapObject *mapObj = &gMapObjects[mapObjId]; + struct Sprite *sprite; + + if (linkPlayerMapObj->active) + { + u8 val = GetRivalAvatarGraphicsIdByStateIdAndGender(0, mapObj->mapobj_bit_1); + mapObj->spriteId = AddPseudoFieldObject(val, SpriteCB_LinkPlayer, 0, 0, 0); + sprite = &gSprites[mapObj->spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = linkPlayerId; + mapObj->mapobj_bit_2 = 0; + } +} + +void SpriteCB_LinkPlayer(struct Sprite *sprite) +{ + struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[sprite->data[0]]; + struct MapObject *mapObj = &gMapObjects[linkPlayerMapObj->mapObjId]; + sprite->pos1.x = mapObj->coords1.x; + sprite->pos1.y = mapObj->coords1.y; + SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); + sprite->oam.priority = ZCoordToPriority(mapObj->elevation); + if (!linkPlayerMapObj->mode) + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObj->range.as_byte)); + else + StartSpriteAnimIfDifferent(sprite, get_go_image_anim_num(mapObj->range.as_byte)); + sub_806487C(sprite, 0); + if (mapObj->mapobj_bit_2) + { + sprite->invisible = ((sprite->data[7] & 4) >> 2); + sprite->data[7]++; + } +} diff --git a/src/palette.c b/src/palette.c new file mode 100644 index 000000000..2a6602503 --- /dev/null +++ b/src/palette.c @@ -0,0 +1,832 @@ +#include "global.h" +#include "palette.h" +#include "blend_palette.h" +#include "decompress.h" + +enum +{ + NORMAL_FADE, + FAST_FADE, + HARDWARE_FADE, +}; + +// These are structs for some unused palette system. +// The full functionality of this system is unknown. + +struct PaletteStructTemplate +{ + u16 uid; + u16 *src; + u16 pst_field_8_0:1; + u16 pst_field_8_1:9; + u16 size:5; + u16 pst_field_9_7:1; + u8 pst_field_A; + u8 srcCount:5; + u8 pst_field_B_5:3; + u8 pst_field_C; +}; + +struct PaletteStruct +{ + const struct PaletteStructTemplate *base; + u32 ps_field_4_0:1; + u16 ps_field_4_1:1; + u32 baseDestOffset:9; + u16 destOffset:10; + u16 srcIndex:7; + u8 ps_field_8; + u8 ps_field_9; +}; + +EWRAM_DATA u16 gPlttBufferUnfaded[0x200] = {0}; +EWRAM_DATA u16 gPlttBufferFaded[0x200] = {0}; +EWRAM_DATA static struct PaletteStruct sPaletteStructs[0x10] = {0}; +EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; +EWRAM_DATA u32 gFiller_202F394 = 0; +EWRAM_DATA static u32 sPlttBufferTransferPending = 0; +EWRAM_DATA static u8 sPaletteDecompressionBuffer[0x400] = {0}; + +static const struct PaletteStructTemplate sDummyPaletteStructTemplate = +{ + 0xFFFF, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 +}; + +static void unused_sub_8073DFC(struct PaletteStruct *, u32 *); +static void unused_sub_8073F60(struct PaletteStruct *, u32 *); +static void unused_sub_8074020(struct PaletteStruct *); +static u8 GetPaletteNumByUid(u16); +static u8 UpdateNormalPaletteFade(void); +static void BeginFastPaletteFadeInternal(u8); +static u8 UpdateFastPaletteFade(void); +static u8 UpdateHardwarePaletteFade(void); +static void UpdateBlendRegisters(void); +static bool8 IsSoftwarePaletteFadeFinishing(void); + +void LoadCompressedPalette(const void *src, u16 offset, u16 size) +{ + LZDecompressWram(src, sPaletteDecompressionBuffer); + CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size); + CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferFaded + offset, size); +} + +void LoadPalette(const void *src, u16 offset, u16 size) +{ + CpuCopy16(src, gPlttBufferUnfaded + offset, size); + CpuCopy16(src, gPlttBufferFaded + offset, size); +} + +void FillPalette(u16 value, u16 offset, u16 size) +{ + CpuFill16(value, gPlttBufferUnfaded + offset, size); + CpuFill16(value, gPlttBufferFaded + offset, size); +} + +void TransferPlttBuffer(void) +{ + if (!gPaletteFade.bufferTransferDisabled) + { + void *src = gPlttBufferFaded; + void *dest = (void *)PLTT; + DmaCopy16(3, src, dest, PLTT_SIZE); + sPlttBufferTransferPending = 0; + if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) + UpdateBlendRegisters(); + } +} + +u8 UpdatePaletteFade(void) +{ + u8 result; + u8 dummy = 0; + + if (sPlttBufferTransferPending) + return -1; + + if (gPaletteFade.mode == NORMAL_FADE) + result = UpdateNormalPaletteFade(); + else if (gPaletteFade.mode == FAST_FADE) + result = UpdateFastPaletteFade(); + else + result = UpdateHardwarePaletteFade(); + + sPlttBufferTransferPending = gPaletteFade.multipurpose1 | dummy; + + return result; +} + +void ResetPaletteFade(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + ResetPaletteStruct(i); + + ResetPaletteFadeControl(); +} + +void ReadPlttIntoBuffers(void) +{ + u16 i; + u16 *pltt = (u16 *)PLTT; + + for (i = 0; i < PLTT_SIZE / 2; i++) + { + gPlttBufferUnfaded[i] = pltt[i]; + gPlttBufferFaded[i] = pltt[i]; + } +} + +bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor) +{ + u8 temp; + register u32 _blendColor asm("r8") = blendColor; + + if (gPaletteFade.active) + { + return FALSE; + } + else + { + gPaletteFade.deltaY = 2; + + if (delay < 0) + { + gPaletteFade.deltaY += (delay * -1); + delay = 0; + } + + gPaletteFade_selectedPalettes = selectedPalettes; + gPaletteFade.delayCounter = delay; + gPaletteFade_delay = delay; + gPaletteFade.y = startY; + gPaletteFade.targetY = targetY; + gPaletteFade.blendColor = _blendColor; + gPaletteFade.active = 1; + gPaletteFade.mode = NORMAL_FADE; + + if (startY < targetY) + gPaletteFade.yDec = 0; + else + gPaletteFade.yDec = 1; + + UpdatePaletteFade(); + + temp = gPaletteFade.bufferTransferDisabled; + gPaletteFade.bufferTransferDisabled = 0; + CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE); + sPlttBufferTransferPending = 0; + if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) + UpdateBlendRegisters(); + gPaletteFade.bufferTransferDisabled = temp; + return TRUE; + } +} + +bool8 unref_sub_8073D3C(u32 a1, u8 a2, u8 a3, u8 a4, u16 a5) +{ + ReadPlttIntoBuffers(); + return BeginNormalPaletteFade(a1, a2, a3, a4, a5); +} + +void unref_sub_8073D84(u8 a1, u32 *a2) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + struct PaletteStruct *palstruct = &sPaletteStructs[i]; + if (palstruct->ps_field_4_0) + { + if (palstruct->base->pst_field_8_0 == a1) + { + u8 val1 = palstruct->srcIndex; + u8 val2 = palstruct->base->srcCount; + if (val1 == val2) + { + unused_sub_8074020(palstruct); + if (!palstruct->ps_field_4_0) + continue; + } + if (palstruct->ps_field_8 == 0) + unused_sub_8073DFC(palstruct, a2); + else + palstruct->ps_field_8--; + + unused_sub_8073F60(palstruct, a2); + } + } + } +} + +static void unused_sub_8073DFC(struct PaletteStruct *a1, u32 *a2) +{ + s32 srcIndex; + s32 srcCount; + u8 i = 0; + u16 srcOffset = a1->srcIndex * a1->base->size; + + if (!a1->base->pst_field_8_0) + { + while (i < a1->base->size) + { + gPlttBufferUnfaded[a1->destOffset] = a1->base->src[srcOffset]; + gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset]; + i++; + a1->destOffset++; + srcOffset++; + } + } + else + { + while (i < a1->base->size) + { + gPlttBufferFaded[a1->destOffset] = a1->base->src[srcOffset]; + i++; + a1->destOffset++; + srcOffset++; + } + } + + a1->destOffset = a1->baseDestOffset; + a1->ps_field_8 = a1->base->pst_field_A; + a1->srcIndex++; + + srcIndex = a1->srcIndex; + srcCount = a1->base->srcCount; + + if (srcIndex >= srcCount) + { + if (a1->ps_field_9) + a1->ps_field_9--; + a1->srcIndex = 0; + } + + *a2 |= 1 << (a1->baseDestOffset >> 4); +} + +static void unused_sub_8073F60(struct PaletteStruct *a1, u32 *a2) +{ + if (gPaletteFade.active && ((1 << (a1->baseDestOffset >> 4)) & gPaletteFade_selectedPalettes)) + { + if (!a1->base->pst_field_8_0) + { + if (gPaletteFade.delayCounter != gPaletteFade_delay) + { + BlendPalette( + a1->baseDestOffset, + a1->base->size, + gPaletteFade.y, + gPaletteFade.blendColor); + } + } + else + { + if (!gPaletteFade.delayCounter) + { + if (a1->ps_field_8 != a1->base->pst_field_A) + { + u32 srcOffset = a1->srcIndex * a1->base->size; + u8 i; + + for (i = 0; i < a1->base->size; i++) + gPlttBufferFaded[a1->baseDestOffset + i] = a1->base->src[srcOffset + i]; + } + } + } + } +} + +static void unused_sub_8074020(struct PaletteStruct *a1) +{ + if (!a1->ps_field_9) + { + s32 val = a1->base->pst_field_B_5; + + if (!val) + { + a1->srcIndex = 0; + a1->ps_field_8 = a1->base->pst_field_A; + a1->ps_field_9 = a1->base->pst_field_C; + a1->destOffset = a1->baseDestOffset; + } + else + { + if (val < 0) + return; + if (val > 2) + return; + ResetPaletteStructByUid(a1->base->uid); + } + } + else + { + a1->ps_field_9--; + } +} + +void ResetPaletteStructByUid(u16 a1) +{ + u8 paletteNum = GetPaletteNumByUid(a1); + if (paletteNum != 16) + ResetPaletteStruct(paletteNum); +} + +void ResetPaletteStruct(u8 paletteNum) +{ + sPaletteStructs[paletteNum].base = &sDummyPaletteStructTemplate; + sPaletteStructs[paletteNum].ps_field_4_0 = 0; + sPaletteStructs[paletteNum].baseDestOffset = 0; + sPaletteStructs[paletteNum].destOffset = 0; + sPaletteStructs[paletteNum].srcIndex = 0; + sPaletteStructs[paletteNum].ps_field_4_1 = 0; + sPaletteStructs[paletteNum].ps_field_8 = 0; + sPaletteStructs[paletteNum].ps_field_9 = 0; +} + +void ResetPaletteFadeControl() +{ + gPaletteFade.multipurpose1 = 0; + gPaletteFade.multipurpose2 = 0; + gPaletteFade.delayCounter = 0; + gPaletteFade.y = 0; + gPaletteFade.targetY = 0; + gPaletteFade.blendColor = 0; + gPaletteFade.active = 0; + gPaletteFade.multipurpose2 = 0; // assign same value twice + gPaletteFade.yDec = 0; + gPaletteFade.bufferTransferDisabled = 0; + gPaletteFade.shouldResetBlendRegisters = 0; + gPaletteFade.hardwareFadeFinishing = 0; + gPaletteFade.softwareFadeFinishing = 0; + gPaletteFade.softwareFadeFinishingCounter = 0; + gPaletteFade.objPaletteToggle = 0; + gPaletteFade.deltaY = 2; +} + +void unref_sub_8074168(u16 uid) +{ + u8 paletteNum = GetPaletteNumByUid(uid); + if (paletteNum != 16) + sPaletteStructs[paletteNum].ps_field_4_1 = 1; +} + +void unref_sub_8074194(u16 uid) +{ + u8 paletteNum = GetPaletteNumByUid(uid); + if (paletteNum != 16) + sPaletteStructs[paletteNum].ps_field_4_1 = 0; +} + +static u8 GetPaletteNumByUid(u16 uid) +{ + u8 i; + + for (i = 0; i < 16; i++) + if (sPaletteStructs[i].base->uid == uid) + return i; + + return 16; +} + +static u8 UpdateNormalPaletteFade() +{ + u16 paletteOffset; + u16 selectedPalettes; + + if (!gPaletteFade.active) + return 0; + + if (IsSoftwarePaletteFadeFinishing()) + { + return gPaletteFade.active; + } + else + { + if (!gPaletteFade.objPaletteToggle) + { + if (gPaletteFade.delayCounter < gPaletteFade_delay) + { + gPaletteFade.delayCounter++; + return 2; + } + gPaletteFade.delayCounter = 0; + } + + paletteOffset = 0; + + if (!gPaletteFade.objPaletteToggle) + { + selectedPalettes = gPaletteFade_selectedPalettes; + } + else + { + selectedPalettes = gPaletteFade_selectedPalettes >> 16; + paletteOffset = 256; + } + + while (selectedPalettes) + { + if (selectedPalettes & 1) + BlendPalette( + paletteOffset, + 16, + gPaletteFade.y, + gPaletteFade.blendColor); + selectedPalettes >>= 1; + paletteOffset += 16; + } + + gPaletteFade.objPaletteToggle ^= 1; + + if (!gPaletteFade.objPaletteToggle) + { + if (gPaletteFade.y == gPaletteFade.targetY) + { + gPaletteFade_selectedPalettes = 0; + gPaletteFade.softwareFadeFinishing = 1; + } + else + { + s8 val; + + if (!gPaletteFade.yDec) + { + val = gPaletteFade.y; + val += gPaletteFade.deltaY; + if (val > gPaletteFade.targetY) + val = gPaletteFade.targetY; + gPaletteFade.y = val; + } + else + { + val = gPaletteFade.y; + val -= gPaletteFade.deltaY; + if (val < gPaletteFade.targetY) + val = gPaletteFade.targetY; + gPaletteFade.y = val; + } + } + } + + return gPaletteFade.active; + } +} + +void InvertPlttBuffer(u32 selectedPalettes) +{ + u16 paletteOffset = 0; + + while (selectedPalettes) + { + if (selectedPalettes & 1) + { + u8 i; + for (i = 0; i < 16; i++) + gPlttBufferFaded[paletteOffset + i] = ~gPlttBufferFaded[paletteOffset + i]; + } + selectedPalettes >>= 1; + paletteOffset += 16; + } +} + +void TintPlttBuffer(u32 selectedPalettes, s8 r, s8 g, s8 b) +{ + u16 paletteOffset = 0; + + while (selectedPalettes) + { + if (selectedPalettes & 1) + { + u8 i; + for (i = 0; i < 16; i++) + { + struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[paletteOffset + i]; + data->r += r; + data->g += g; + data->b += b; + } + } + selectedPalettes >>= 1; + paletteOffset += 16; + } +} + +void UnfadePlttBuffer(u32 selectedPalettes) +{ + u16 paletteOffset = 0; + + while (selectedPalettes) + { + if (selectedPalettes & 1) + { + u8 i; + for (i = 0; i < 16; i++) + gPlttBufferFaded[paletteOffset + i] = gPlttBufferUnfaded[paletteOffset + i]; + } + selectedPalettes >>= 1; + paletteOffset += 16; + } +} + +void BeginFastPaletteFade(u8 submode) +{ + gPaletteFade.deltaY = 2; + BeginFastPaletteFadeInternal(submode); +} + +static void BeginFastPaletteFadeInternal(u8 submode) +{ + gPaletteFade.y = 31; + gPaletteFade_submode = submode & 0x3F; + gPaletteFade.active = 1; + gPaletteFade.mode = FAST_FADE; + + if (submode == FAST_FADE_IN_FROM_BLACK) + CpuFill16(RGB_BLACK, gPlttBufferFaded, PLTT_SIZE); + + if (submode == FAST_FADE_IN_FROM_WHITE) + CpuFill16(RGB_WHITE, gPlttBufferFaded, PLTT_SIZE); + + UpdatePaletteFade(); +} + +static u8 UpdateFastPaletteFade(void) +{ + u16 i; + u16 paletteOffsetStart; + u16 paletteOffsetEnd; + s8 r0; + s8 g0; + s8 b0; + s8 r; + s8 g; + s8 b; + + if (!gPaletteFade.active) + return 0; + + if (IsSoftwarePaletteFadeFinishing()) + return gPaletteFade.active; + + if (gPaletteFade.objPaletteToggle) + { + paletteOffsetStart = 256; + paletteOffsetEnd = 512; + } + else + { + paletteOffsetStart = 0; + paletteOffsetEnd = 256; + } + + switch (gPaletteFade_submode) + { + case FAST_FADE_IN_FROM_WHITE: + for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) + { + struct PlttData *unfaded; + struct PlttData *faded; + + unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; + r0 = unfaded->r; + g0 = unfaded->g; + b0 = unfaded->b; + + faded = (struct PlttData *)&gPlttBufferFaded[i]; + r = faded->r - 2; + g = faded->g - 2; + b = faded->b - 2; + + if (r < r0) + r = r0; + if (g < g0) + g = g0; + if (b < b0) + b = b0; + + gPlttBufferFaded[i] = RGB(r, g, b); + } + break; + case FAST_FADE_OUT_TO_WHTIE: + for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) + { + struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; + r = data->r + 2; + g = data->g + 2; + b = data->b + 2; + + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + + gPlttBufferFaded[i] = RGB(r, g, b); + } + break; + case FAST_FADE_IN_FROM_BLACK: + for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) + { + struct PlttData *unfaded; + struct PlttData *faded; + + unfaded = (struct PlttData *)&gPlttBufferUnfaded[i]; + r0 = unfaded->r; + g0 = unfaded->g; + b0 = unfaded->b; + + faded = (struct PlttData *)&gPlttBufferFaded[i]; + r = faded->r + 2; + g = faded->g + 2; + b = faded->b + 2; + + if (r > r0) + r = r0; + if (g > g0) + g = g0; + if (b > b0) + b = b0; + + gPlttBufferFaded[i] = RGB(r, g, b); + } + break; + case FAST_FADE_OUT_TO_BLACK: + for (i = paletteOffsetStart; i < paletteOffsetEnd; i++) + { + struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i]; + r = data->r - 2; + g = data->g - 2; + b = data->b - 2; + + if (r < 0) + r = 0; + if (g < 0) + g = 0; + if (b < 0) + b = 0; + + gPlttBufferFaded[i] = RGB(r, g, b); + } + } + + gPaletteFade.objPaletteToggle ^= 1; + + if (gPaletteFade.objPaletteToggle) + return gPaletteFade.active; + + if (gPaletteFade.y - gPaletteFade.deltaY < 0) + gPaletteFade.y = 0; + else + gPaletteFade.y -= gPaletteFade.deltaY; + + if (gPaletteFade.y == 0) + { + switch (gPaletteFade_submode) + { + case FAST_FADE_IN_FROM_WHITE: + case FAST_FADE_IN_FROM_BLACK: + CpuCopy32(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); + break; + case FAST_FADE_OUT_TO_WHTIE: + CpuFill32(0xFFFFFFFF, gPlttBufferFaded, PLTT_SIZE); + break; + case FAST_FADE_OUT_TO_BLACK: + CpuFill32(0x00000000, gPlttBufferFaded, PLTT_SIZE); + break; + } + + gPaletteFade.mode = NORMAL_FADE; + gPaletteFade.softwareFadeFinishing = 1; + } + + return gPaletteFade.active; +} + +void BeginHardwarePaletteFade(u8 blendCnt, u8 delay, u8 y, u8 targetY, u8 shouldResetBlendRegisters) +{ + gPaletteFade_blendCnt = blendCnt; + gPaletteFade.delayCounter = delay; + gPaletteFade_delay = delay; + gPaletteFade.y = y; + gPaletteFade.targetY = targetY; + gPaletteFade.active = 1; + gPaletteFade.mode = HARDWARE_FADE; + gPaletteFade.shouldResetBlendRegisters = shouldResetBlendRegisters & 1; + gPaletteFade.hardwareFadeFinishing = 0; + + if (y < targetY) + gPaletteFade.yDec = 0; + else + gPaletteFade.yDec = 1; +} + +static u8 UpdateHardwarePaletteFade(void) +{ + if (!gPaletteFade.active) + return 0; + + if (gPaletteFade.delayCounter < gPaletteFade_delay) + { + gPaletteFade.delayCounter++; + return 2; + } + + gPaletteFade.delayCounter = 0; + + if (!gPaletteFade.yDec) + { + gPaletteFade.y++; + if (gPaletteFade.y > gPaletteFade.targetY) + { + gPaletteFade.hardwareFadeFinishing++; + gPaletteFade.y--; + } + } + else + { + s32 y = gPaletteFade.y--; + if (y - 1 < gPaletteFade.targetY) + { + gPaletteFade.hardwareFadeFinishing++; + gPaletteFade.y++; + } + } + + if (gPaletteFade.hardwareFadeFinishing) + { + if (gPaletteFade.shouldResetBlendRegisters) + { + gPaletteFade_blendCnt = 0; + gPaletteFade.y = 0; + } + gPaletteFade.shouldResetBlendRegisters = 0; + } + + return gPaletteFade.active; +} + +static void UpdateBlendRegisters(void) +{ + REG_BLDCNT = gPaletteFade_blendCnt; + REG_BLDY = gPaletteFade.y; + if (gPaletteFade.hardwareFadeFinishing) + { + gPaletteFade.hardwareFadeFinishing = 0; + gPaletteFade.mode = 0; + gPaletteFade_blendCnt = 0; + gPaletteFade.y = 0; + gPaletteFade.active = 0; + } +} + +static bool8 IsSoftwarePaletteFadeFinishing(void) +{ + if (gPaletteFade.softwareFadeFinishing) + { + if (gPaletteFade.softwareFadeFinishingCounter == 4) + { + gPaletteFade.active = 0; + gPaletteFade.softwareFadeFinishing = 0; + gPaletteFade.softwareFadeFinishingCounter = 0; + } + else + { + gPaletteFade.softwareFadeFinishingCounter++; + } + + return TRUE; + } + else + { + return FALSE; + } +} + +void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) +{ + u16 paletteOffset; + + for (paletteOffset = 0; selectedPalettes; paletteOffset += 16) + { + if (selectedPalettes & 1) + BlendPalette(paletteOffset, 16, coeff, color); + selectedPalettes >>= 1; + } +} + +void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) +{ + DmaCopy32Defvars(3, gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); + BlendPalettes(selectedPalettes, coeff, color); +} diff --git a/src/party_menu.c b/src/party_menu.c new file mode 100644 index 000000000..9caaa05b9 --- /dev/null +++ b/src/party_menu.c @@ -0,0 +1,5321 @@ +#include "global.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "party_menu.h" +#include "battle.h" +#include "battle_interface.h" +#include "battle_party_menu.h" +#include "choose_party.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "evolution_scene.h" +#include "item.h" +#include "item_use.h" +#include "item_menu.h" +#include "link.h" +#include "mail_data.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "palette.h" +#include "pokemon.h" +#include "pokemon_icon.h" +#include "pokemon_item_effect.h" +#include "pokemon_menu.h" +#include "pokemon_summary_screen.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "scanline_effect.h" +#include "util.h" +#include "script_pokemon_80F9.h" +#include "ewram.h" + +struct Coords8 +{ + u8 x; + u8 y; +}; + +struct PartyMenuWindowCoords +{ + u8 left; + u8 top; + u8 right; + u8 bottom; +}; + +struct PartyMonTextSettingsStruct +{ + u8 xOffset; + u8 yOffset; + const u16 *oamSettings; +}; + +struct PartyMenuHandlersStruct +{ + /*0x0*/TaskFunc menuHandler; + /*0x4*/bool8 (*menuSetup)(void); + /*0x8*/u8 initialPromptTextId; // element in PartyMenuPromptTexts +}; + +static void nullsub_12(u8 monIndex, struct Pokemon *pokemon); +static void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon); +static void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon); +static void sub_806D05C(u8 taskId); +static void sub_806D15C(u8 taskId); +static void sub_806D198(u8 taskId); +static void sub_806E884(u8 taskId); +static void sub_8070D90(u8 taskId); +static void sub_806D5B8(u8 taskId); +static void sub_806D014(u8 taskId); +static void sub_806D118(u8 taskId); +static void CB2_InitPartyMenu(void); +static void ReDrawPartyMonBackgrounds(void); +static void sub_806BA94(s16 a, u16 b, u8 c, u8 d); +static void sub_806B9A4(s16 a, u16 b, u8 c); +static void sub_806CA18(u8 taskId, u8 b); +static void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); +static void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); +static void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); +static void UpdateMonIconFrame_806DA0C(struct Sprite *sprite); +static void UpdateMonIconFrame_806DA38(struct Sprite *sprite); +static void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c); +static u8 sub_806CA00(u8 taskId); +static void SpriteCB_sub_806D37C(struct Sprite *sprite); +static u8 GetMonIconSpriteId(u8 taskId, u8 monIndex); +static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite); +static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId); +static void ItemUseMoveMenu_HandleCancel(u8 taskId); +static bool8 SetupDefaultPartyMenu(void); +/*static*/ void sub_806B4A8(void); +/*static*/ void VBlankCB_PartyMenu(void); +/*static*/ bool8 LoadPartyMenuGraphics(u8 a); +static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d); +static void sub_806BB9C(u8 a); +static void sub_806BBEC(u8 a); + +EWRAM_DATA u8 gUnknown_0202E8F4 = 0; +EWRAM_DATA u8 gUnknown_0202E8F5 = 0; +EWRAM_DATA u8 gUnknown_0202E8F6 = 0; +EWRAM_DATA u16 gUnknown_0202E8F8 = 0; +EWRAM_DATA u8 gPartyMenuType = 0; + +const u16 TMHMMoves[] = +{ + MOVE_FOCUS_PUNCH, + MOVE_DRAGON_CLAW, + MOVE_WATER_PULSE, + MOVE_CALM_MIND, + MOVE_ROAR, + MOVE_TOXIC, + MOVE_HAIL, + MOVE_BULK_UP, + MOVE_BULLET_SEED, + MOVE_HIDDEN_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_ICE_BEAM, + MOVE_BLIZZARD, + MOVE_HYPER_BEAM, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_GIGA_DRAIN, + MOVE_SAFEGUARD, + MOVE_FRUSTRATION, + MOVE_SOLAR_BEAM, + MOVE_IRON_TAIL, + MOVE_THUNDERBOLT, + MOVE_THUNDER, + MOVE_EARTHQUAKE, + MOVE_RETURN, + MOVE_DIG, + MOVE_PSYCHIC, + MOVE_SHADOW_BALL, + MOVE_BRICK_BREAK, + MOVE_DOUBLE_TEAM, + MOVE_REFLECT, + MOVE_SHOCK_WAVE, + MOVE_FLAMETHROWER, + MOVE_SLUDGE_BOMB, + MOVE_SANDSTORM, + MOVE_FIRE_BLAST, + MOVE_ROCK_TOMB, + MOVE_AERIAL_ACE, + MOVE_TORMENT, + MOVE_FACADE, + MOVE_SECRET_POWER, + MOVE_REST, + MOVE_ATTRACT, + MOVE_THIEF, + MOVE_STEEL_WING, + MOVE_SKILL_SWAP, + MOVE_SNATCH, + MOVE_OVERHEAT, + MOVE_CUT, + MOVE_FLY, + MOVE_SURF, + MOVE_STRENGTH, + MOVE_FLASH, + MOVE_ROCK_SMASH, + MOVE_WATERFALL, + MOVE_DIVE, +}; + +//FIXME +//const u8 *unrefTileBuffer = gTileBuffer; +asm(".4byte gTileBuffer\n"); + +static const u8 MenuGfx_HoldIcons[] = INCBIN_U8("graphics/interface/hold_icons.4bpp"); +static const u16 MenuPal_HoldIcons[] = INCBIN_U16("graphics/interface/hold_icons.gbapal"); + +static const struct SpriteSheet HeldItemsSpriteSheet = { + MenuGfx_HoldIcons, + sizeof MenuGfx_HoldIcons, + 0xd750 +}; + +static const struct SpritePalette HeldItemsPalette = { + MenuPal_HoldIcons, + 0xd750 +}; + +static const struct OamData gOamData_83765EC = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_83765F4[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83765FC[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8376604[] = { + gSpriteAnim_83765F4, + gSpriteAnim_83765FC, +}; + +static const struct SpriteTemplate gSpriteTemplate_837660C = { + 55120, + 55120, + &gOamData_83765EC, + gSpriteAnimTable_8376604, + NULL, + gDummySpriteAffineAnimTable, + SpriteCB_UpdateHeldItemIconPosition +}; + +// Texts that can be displayed in the bottom of the party menu. +static const u8 *const PartyMenuPromptTexts[] = { + OtherText_ChoosePoke, + OtherText_MovePokeTo, + OtherText_TeachWhat, + OtherText_UseWhat, + OtherText_GiveWhat, + OtherText_DoWhat, + OtherText_NothingToCut, + OtherText_CantSurf, + OtherText_AlreadySurfing, + OtherText_CantUseThatHere, + OtherText_RestoreWhatMove, + OtherText_BoostPP, + gOtherText_CancelWithTerminator, + OtherText_DoWhatWithItem, + OtherText_NoPokeForBattle, + OtherText_ChoosePoke2, + OtherText_NotEnoughHP, + OtherText_ThreePokeNeeded, + OtherText_PokeCantBeSame, + OtherText_NoIdenticalHoldItems, + OtherText_TeachWhichPoke, +}; + +static const struct Coords8 gUnknown_08376678[8][6] = { + {{16, 40}, {104, 18}, {104, 42}, {104, 66}, {104, 90}, {104, 114}}, // PARTY_MENU_TYPE_STANDARD + {{16, 24}, { 16, 80}, {104, 18}, {104, 50}, {104, 82}, {104, 114}}, // PARTY_MENU_TYPE_BATTLE + {{16, 24}, { 16, 80}, {104, 26}, {104, 50}, {104, 82}, {104, 106}}, // PARTY_MENU_TYPE_CONTEST + {{16, 24}, {104, 26}, {104, 50}, { 16, 80}, {104, 82}, {104, 106}}, // PARTY_MENU_TYPE_IN_GAME_TRADE + {{ 5, 4}, { 16, 1}, { 16, 4}, { 16, 7}, { 16, 10}, { 16, 13}}, // PARTY_MENU_TYPE_BATTLE_TOWER + {{ 5, 2}, { 5, 9}, { 16, 1}, { 16, 5}, { 16, 9}, { 16, 13}}, // PARTY_MENU_TYPE_LINK_MULTI_BATTLE + {{ 5, 2}, { 5, 9}, { 16, 2}, { 16, 5}, { 16, 9}, { 16, 12}}, // PARTY_MENU_TYPE_DAYCARE + {{ 5, 2}, { 16, 2}, { 16, 5}, { 5, 9}, { 16, 9}, { 16, 12}}, // PARTY_MENU_TYPE_MOVE_TUTOR +}; + +static const struct Coords8 gUnknown_08376738[12][6] = { + {{6, 5}, {17, 2}, {17, 5}, {17, 8}, {17, 11}, {17, 14}}, + {{6, 3}, { 6, 10}, {17, 2}, {17, 6}, {17, 10}, {17, 14}}, + {{6, 3}, { 6, 10}, {17, 3}, {17, 6}, {17, 10}, {17, 13}}, + {{6, 3}, {17, 3}, {17, 6}, { 6, 10}, {17, 10}, {17, 13}}, + {{3, 7}, {22, 2}, {22, 5}, {22, 8}, {22, 11}, {22, 14}}, + {{3, 5}, { 3, 12}, {22, 2}, {22, 6}, {22, 10}, {22, 14}}, + {{3, 5}, { 3, 12}, {22, 3}, {22, 6}, {22, 10}, {22, 13}}, + {{3, 5}, {22, 3}, {22, 6}, { 3, 12}, {22, 10}, {22, 13}}, + {{7, 7}, {26, 2}, {26, 5}, {26, 8}, {26, 11}, {26, 14}}, + {{7, 5}, { 7, 12}, {26, 2}, {26, 6}, {26, 10}, {26, 14}}, + {{7, 5}, { 7, 12}, {26, 3}, {26, 6}, {26, 10}, {26, 13}}, + {{7, 5}, {26, 3}, {26, 6}, { 7, 12}, {26, 10}, {26, 13}}, +}; + +static u16 *const gUnknown_08376858[4][6] = { + {(u16*)(BG_VRAM + 0xF1C8), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF16E), (u16*)(BG_VRAM + 0xF22E), (u16*)(BG_VRAM + 0xF2EE), (u16*)(BG_VRAM + 0xF3AE)}, // PARTY_MENU_STANDARD + {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF3AE)}, // PARTY_MENU_LAYOUT_DOUBLE_BATTLE + {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0EE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF36E)}, // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE + {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF0EE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF36E)}, // PARTY_MENU_LAYOUT_MULTI_BATTLE +}; + +static const struct Coords8 gUnknown_083768B8[3][8] = { + {{8, 44}, {92, 22}, {92, 46}, {92, 70}, {92, 94}, {92, 118}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_STANDARD + {{8, 28}, { 8, 84}, {92, 22}, {92, 54}, {92, 86}, {92, 118}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_DOUBLE_BATTLE + {{8, 28}, { 8, 84}, {92, 30}, {92, 54}, {92, 86}, {92, 110}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE +}; + +static u16 *const gUnknown_08376918[2][PARTY_SIZE] = { + {(u16*)(BG_VRAM + 0xF1C6), (u16*)(BG_VRAM + 0xF06C), (u16*)(BG_VRAM + 0xF12C), (u16*)(BG_VRAM + 0xF1EC), (u16*)(BG_VRAM + 0xF2AC), (u16*)(BG_VRAM + 0xF36C)}, + {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF3AE)}, +}; + +static const struct PartyMenuWindowCoords gUnknown_08376948[2][6] = { + {{2, 4, 10, 9}, {16, 1, 29, 3}, {16, 4, 29, 6}, {16, 7, 29, 9}, {16, 10, 29, 12}, {16, 13, 29, 15}}, + {{2, 2, 10, 7}, { 2, 9, 10, 14}, {16, 1, 29, 3}, {16, 5, 29, 7}, {16, 9, 29, 11}, {16, 13, 29, 15}}, +}; + +static const struct PartyMenuWindowCoords gUnknown_08376978[2][6] = { + {{2, 7, 10, 9}, {21, 1, 29, 3}, {21, 4, 29, 6}, {21, 7, 29, 9}, {21, 10, 29, 12}, {21, 13, 29, 15}}, + {{2, 2, 10, 7}, { 2, 9, 10, 14}, {16, 1, 29, 3}, {16, 5, 29, 7}, {16, 9, 29, 11}, {16, 13, 29, 15}}, +}; + +// This is actually a 2x6x2 array, but the code reads it as a flat array. +static const u8 gUnknown_083769A8[] = { + 0, 3, 11, 1, 11, 4, 11, 7, 11, 10, 11, 13, + 0, 1, 0, 8, 11, 1, 11, 5, 11, 9, 11, 13, // Double battle +}; + +// This is actually a 2x6x2 array, but the code reads it as a flat array. +//FIXME: sub_806B908() accesses this data via gUnknown_083769A8 (directly above this). This means these +// two arrays might be a struct, rather than separate arrays. +static const u8 gUnknown_083769C0[] = { + 0, 1, 0, 8, 11, 2, 11, 5, 11, 9, 11, 12, + 0, 1, 0, 8, 11, 2, 11, 5, 11, 9, 11, 12, // Double battle +}; + +static const u8 gUnknown_083769D8[] = { + 0x24,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x27, + 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, + 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, + 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, + 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x47, + 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x47, + 0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57, +}; + +static const u8 gUnknown_08376A25[] = { + 0x50,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x53, + 0x60,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x63, + 0x70,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x73, +}; + +static const u8 gUnknown_08376A5E[] = { + 0x20,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x23, + 0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33, + 0x40,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x43, +}; + +static const u8 gUnusedData_08376A97[] = { + 0x0C,0x0D,0x0E,0x0F,0x00,0x01,0x02,0x03,0x04,0x05,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x0F,0x06,0x05,0x01,0x07, + 0x08,0x09,0x0F,0x16,0x15,0x11,0x17,0x18,0x19,0x0F,0x09, + 0x0A,0x0B,0x05,0x0C,0x0F,0x0F,0x19,0x1A,0x1B,0x15,0x1C, + 0x0F,0x0F,0x0D,0x0B,0x05,0x0C,0x0F,0x0F,0x0F,0x1D,0x1B, + 0x15,0x1C,0x0F,0x0F,0x0F,0x06,0x05,0x0B,0x05,0x0C,0x0F, + 0x0F,0x16,0x15,0x1B,0x15,0x1C,0x0F,0x0F,0x0F,0x0F,0x20, + 0x0C,0x09,0x0F,0x0F,0x0F,0x1F,0x30,0x1C,0x19,0x0F,0x0F, + 0x0F,0x25,0x0F,0x22,0x24,0x0F,0x0F,0x0F,0x35,0x41,0x32, + 0x34,0x0F,0x0F,0x0F,0x26,0x0F,0x23,0x0E,0x0F,0x0F,0x0F, + 0x36,0x43,0x33,0x1E,0x0F,0x0F,0x27,0x28,0x29,0x03,0x2A, + 0x0F,0x0F,0x37,0x38,0x39,0x13,0x3A,0x0F,0x0F,0x27,0x28, + 0x29,0x03,0x04,0x05,0x0F,0x37,0x38,0x39,0x13,0x14,0x15, + 0x0F,0x2B,0x2C,0x02,0x28,0x29,0x2D,0x21,0x3B,0x3C,0x12, + 0x38,0x39,0x3D,0x31,0x2B,0x2C,0x02,0x28,0x29,0x08,0x09, + 0x3B,0x3C,0x12,0x38,0x39,0x18,0x19,0x2E,0x2F,0x2B,0x2C, + 0x02,0x27,0x2D,0x3E,0x3F,0x3B,0x3C,0x12,0x45,0x3D, +}; + +static const TaskFunc gUnknown_08376B54[] = { + ItemUseMoveMenu_HandleMoveSelection, + ItemUseMoveMenu_HandleCancel, +}; + +#define PartyMonOAMSettings(x, y, palette, shape, size, priority, tileOffset) \ + ((shape) << 14) | (y), \ + ((size) << 14) | (x), \ + ((palette) << 12) | ((priority) << 10) | (tileOffset) + +static const u16 PartyMonOAMSettings_LeftColumn[] = { + PartyMonOAMSettings(24, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 0), + PartyMonOAMSettings(56, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 4), + PartyMonOAMSettings(24, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 8), + PartyMonOAMSettings(56, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 12), + PartyMonOAMSettings(32, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 16), + PartyMonOAMSettings(37, 32, 15, ST_OAM_H_RECTANGLE, 1, 1, 24), + PartyMonOAMSettings(69, 32, 15, ST_OAM_H_RECTANGLE, 1, 1, 28), + 0xFFFF, +}; + +static const u16 PartyMonOAMSettings_RightColumn[] = { + PartyMonOAMSettings( 24, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 0), + PartyMonOAMSettings( 56, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 4), + PartyMonOAMSettings( 24, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 8), + PartyMonOAMSettings( 56, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 12), + PartyMonOAMSettings( 32, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 16), + PartyMonOAMSettings(101, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 24), + PartyMonOAMSettings(133, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 28), + 0xFFFF, +}; + +// Controls where and how the mons' text appears in the party menu screen (nickname, HP, and level). +static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = +{ + { // PARTY_MENU_LAYOUT_STANDARD + { 1, 4, PartyMonOAMSettings_LeftColumn}, + {12, 1, PartyMonOAMSettings_RightColumn}, + {12, 4, PartyMonOAMSettings_RightColumn}, + {12, 7, PartyMonOAMSettings_RightColumn}, + {12, 10, PartyMonOAMSettings_RightColumn}, + {12, 13, PartyMonOAMSettings_RightColumn}, + }, + { // PARTY_MENU_LAYOUT_DOUBLE_BATTLE + { 1, 2, PartyMonOAMSettings_LeftColumn}, + { 1, 9, PartyMonOAMSettings_LeftColumn}, + {12, 1, PartyMonOAMSettings_RightColumn}, + {12, 5, PartyMonOAMSettings_RightColumn}, + {12, 9, PartyMonOAMSettings_RightColumn}, + {12, 13, PartyMonOAMSettings_RightColumn}, + }, + { // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE + { 1, 2, PartyMonOAMSettings_LeftColumn}, + { 1, 9, PartyMonOAMSettings_LeftColumn}, + {12, 2, PartyMonOAMSettings_RightColumn}, + {12, 5, PartyMonOAMSettings_RightColumn}, + {12, 9, PartyMonOAMSettings_RightColumn}, + {12, 12, PartyMonOAMSettings_RightColumn}, + }, + { // PARTY_MENU_LAYOUT_MULTI_BATTLE + { 1, 2, PartyMonOAMSettings_LeftColumn}, + {12, 2, PartyMonOAMSettings_RightColumn}, + {12, 5, PartyMonOAMSettings_RightColumn}, + { 1, 9, PartyMonOAMSettings_LeftColumn}, + {12, 9, PartyMonOAMSettings_RightColumn}, + {12, 12, PartyMonOAMSettings_RightColumn}, + }, +}; + +static const struct PartyMenuHandlersStruct PartyMenuHandlers[] = +{ + {HandleDefaultPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_STANDARD + {HandleBattlePartyMenu, SetUpBattlePartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE + {HandleSelectPartyMenu, SetupContestPartyMenu, 0}, // PARTY_MENU_TYPE_CONTEST + {HandleSelectPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_IN_GAME_TRADE + {HandleBattleTowerPartyMenu, SetupBattleTowerPartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE_TOWER + {HandleLinkMultiBattlePartyMenu, SetupLinkMultiBattlePartyMenu, 0xFF}, // PARTY_MENU_TYPE_LINK_MULTI_BATTLE + {HandleDaycarePartyMenu, SetupDefaultPartyMenu, 0x0F}, // PARTY_MENU_TYPE_DAYCARE + {HandleMoveTutorPartyMenu, SetupMoveTutorPartyMenu, 0}, // PARTY_MENU_TYPE_MOVE_TUTOR +}; + +struct Unk201C000 +{ + /*0x00*/ struct Pokemon *pokemon; + /*0x04*/ u8 unk4; + /*0x05*/ u8 unk5; + /*0x06*/ u16 unk6; + /*0x08*/ u16 unk8; + /*0x0A*/ u8 pad_0A[2]; + /*0x0C*/ s32 unkC; + /*0x10*/ TaskFunc unk10; + /*0x14*/ TaskFunc unk14; +}; + +struct Unk201FE00 +{ + u8 unkE00; // not sure if this is an array or struct, or how big it is + u8 unkE01; + u8 unkE02; +}; + +extern u16 gBattleTypeFlags; +extern u8 gTileBuffer[]; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gPlayerPartyCount; +extern s32 gBattleMoveDamage; +extern u16 gMoveToLearn; + +extern u16 gUnknown_08E9A300[]; +extern struct Coords8 const gUnknown_08376738[12][6]; +extern const u8 gUnknown_083769C0[]; +extern u8 gUnknown_02039460[]; +extern struct Window gUnknown_03004210; + +extern const u8 gPartyMenuMisc_Gfx[]; +extern const u8 gPartyMenuMisc_Tilemap[]; +extern const u8 gPartyMenuMisc_Pal[]; +extern const u8 gFontDefaultPalette[]; +extern const u8 gPartyMenuHpBar_Gfx[]; +extern const u8 gPartyMenuOrderText_Gfx[]; +extern const u8 gStatusGfx_Icons[]; +extern const u8 gStatusPal_Icons[]; + +#if ENGLISH +#define WINDOW_LEFT (3) +#define WINDOW_RIGHT (26) +#elif GERMAN +#define WINDOW_LEFT (0) +#define WINDOW_RIGHT (29) +#endif + +void CB2_PartyMenuMain(void) +{ + const struct PartyMonTextSettingsStruct *textSettings; + s32 i; + + AnimateSprites(); + BuildOamBuffer(); + + textSettings = PartyMonTextSettings[gPartyMenuType]; + for (i = 0; i < PARTY_SIZE; i++) + { + // Draw mon name, level, and hp sprites + DrawPartyMenuMonText( + textSettings->xOffset * 8, + textSettings->yOffset * 8, + textSettings->oamSettings, + 0, + (i << 5) | 0x200); + textSettings++; + } + + RunTasks(); + UpdatePaletteFade(); + +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 2); +#endif +} + +void VBlankCB_PartyMenu(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ReDrawPartyMonBackgrounds(); +} + +void SetPartyMenuSettings(u8 menuType, u8 battleTypeFlags, TaskFunc menuHandlerFunc, u8 textId) +{ + if (battleTypeFlags != 0xFF) + { + gBattleTypeFlags = battleTypeFlags; + } + + ewram1B000.menuType = menuType; + ewram1B000.menuHandler = menuHandlerFunc; + ewram1B000.promptTextId = textId; +} + +void DoOpenPartyMenu(u8 menuType, u8 battleFlags, TaskFunc menuHandlerFunc, u8 textId) +{ + SetPartyMenuSettings(menuType, battleFlags, menuHandlerFunc, textId); + SetMainCallback2(CB2_InitPartyMenu); +} + +void OpenPartyMenu(u8 menuType, u8 battleFlags) +{ + DoOpenPartyMenu(menuType, battleFlags, PartyMenuHandlers[menuType].menuHandler, PartyMenuHandlers[menuType].initialPromptTextId); +} + +// This is a Task which is repeatedly called until it eventually returns TRUE when finished. +bool8 SetupDefaultPartyMenu(void) +{ + switch (ewram1B000_alt.setupState) + { + case 0: + if (ewram1B000_alt.monIndex < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); + ewram1B000_alt.monIndex++; + } + else + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.setupState++; + break; + case 2: + CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; + break; + case 3: + if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) != 1) + { + ewram1B000_alt.monIndex++; + } + else + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; + } + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + ewram1B000_alt.setupState++; + break; + case 5: + PrintPartyMenuMonNicknames(); + ewram1B000_alt.setupState++; + break; + case 6: + PartyMenuTryPrintMonsHP(); + ewram1B000_alt.setupState++; + break; + case 7: + nullsub_13(); + ewram1B000_alt.setupState++; + break; + case 8: + PartyMenuDrawHPBars(); + ewram1B000_alt.setupState++; + break; + case 9: + if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState = 0; + return TRUE; + } + else + { + ewram1B000_alt.monIndex++; + break; + } + } + + return FALSE; +} + +bool8 InitPartyMenu(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gPaletteFade.bufferTransferDisabled = 1; + gMain.state++; + break; + case 1: + ScanlineEffect_Stop(); + gMain.state++; + break; + case 2: + sub_806B4A8(); + ewram1B000_alt.setupState = 0; + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.unk268 = 0; + gMain.state++; + break; + case 3: + ResetSpriteData(); + gMain.state++; + break; + case 4: + if (ewram1B000.menuType != PARTY_MENU_TYPE_BATTLE && ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) + ResetTasks(); + gMain.state++; + break; + case 5: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 6: + ewram1B000.menuHandlerTaskId = CreateTask(ewram1B000.menuHandler, 0); + gMain.state++; + break; + case 7: + Text_LoadWindowTemplate(&gWindowTemplate_81E6C90); + gMain.state++; + break; + case 8: + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C90); + MultistepInitWindowTileData(&gUnknown_03004210, 1); + gMain.state++; + break; + case 9: + if (MultistepLoadFont()) + { + ewram1B000_alt.setupState = 1; + gMain.state++; + } + break; + case 10: + if (LoadPartyMenuGraphics(ewram1B000_alt.setupState) == TRUE) + { + ewram1B000_alt.setupState = 0; + gMain.state++; + } + else + { + ewram1B000_alt.setupState++; + } + break; + case 11: + sub_809D51C(); + gMain.state++; + break; + case 12: + if (PartyMenuHandlers[ewram1B000.menuType].menuSetup() == TRUE) + gMain.state++; + break; + case 13: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6CC8); + gMain.state++; + break; + case 14: + if (MultistepInitMenuWindowContinue()) + gMain.state++; + break; + case 15: + PrintPartyMenuPromptText(ewram1B000.promptTextId, 0); + gMain.state++; + break; + case 16: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + gMain.state++; + break; + case 17: + SetVBlankCallback(VBlankCB_PartyMenu); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0xE5E0), 0x8000, (void *)(VRAM + 0x7800), 2); +#endif + return TRUE; + } + + return FALSE; +} + +void CB2_InitPartyMenu(void) +{ + while (InitPartyMenu() != TRUE) + { + if (sub_80F9344() == TRUE) + return; + } + + if (ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) + ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); + + SetMainCallback2(CB2_PartyMenuMain); +} + +void sub_806B4A8(void) +{ + SetHBlankCallback(NULL); + REG_DISPCNT = 8000; + REG_BG0CNT = 0x1E05; + REG_BG1CNT = 0x703; + REG_BG2CNT = 0xF08; + REG_BG3CNT = 0x602; + REG_BLDCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG3VOFS = -1; +} + +bool8 IsLinkDoubleBattle() +{ + if ((gBattleTypeFlags & BATTLE_TYPE_LINK_DOUBLE) == BATTLE_TYPE_LINK_DOUBLE) + return TRUE; + else + return FALSE; +} + +// Draws the blue rectangular regions surrounding each of the party mons. +void ReDrawPartyMonBackgrounds(void) +{ + if (ewram1B000.unk261) + { + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(BG_VRAM + 0x3000), 0x800); + + if (ewram1B000.unk261 == 2) + ewram1B000.unk261 = 0; + } +} + +bool8 DrawPartyMonBackground(u8 monIndex) +{ + const u8 *arr; + + if (!IsDoubleBattle()) + gPartyMenuType = PARTY_MENU_LAYOUT_STANDARD; + else if (IsLinkDoubleBattle() == TRUE) + gPartyMenuType = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; + else + gPartyMenuType = PARTY_MENU_LAYOUT_DOUBLE_BATTLE; + + arr = &gUnknown_083769A8[gPartyMenuType * 12]; + + switch (monIndex) + { + case 0: + memset(&gBGTilemapBuffers[2], 0, 0x800); + break; + case 1: + sub_806B9A4(arr[0], arr[1], 3); + sub_806BF24(&arr[0], 0, 3, 0); + break; + case 2: + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 1) + { + sub_806BA94(arr[2], arr[3], 0, 3); + sub_806BF24(&arr[2], 1, 3, 0); + } + else + { + sub_806BA94(arr[2], arr[3], 1, 3); + } + } + else if (IsLinkDoubleBattle() == TRUE) + { + sub_806B9A4(arr[2], arr[3], 4); + sub_806BF24(&arr[2], 1, 4, 0); + } + else + { + sub_806B9A4(arr[2], arr[3], 3); + sub_806BF24(&arr[2], 1, 3, 0); + } + break; + case 3: + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 2) + { + sub_806BA94(arr[4], arr[5], 0, 3); + sub_806BF24(&arr[4], 2, 3, 0); + } + else + { + sub_806BA94(arr[4], arr[5], 1, 3); + } + } + else if (IsLinkDoubleBattle() == TRUE) + { + if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) + { + sub_806BA94(arr[4], arr[5], 0, 3); + sub_806BF24(&arr[4], 2, 3, 0); + } + else + { + sub_806BA94(arr[4], arr[5], 1, 3); + } + } + else if (gPlayerPartyCount > 2) + { + sub_806BA94(arr[4], arr[5], 0, 3); + sub_806BF24(&arr[4], 2, 3, 0); + } + else + { + sub_806BA94(arr[4], arr[5], 1, 3); + } + break; + case 4: + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 3) + { + sub_806BA94(arr[6], arr[7], 0, 3); + sub_806BF24(&arr[6], 3, 3, 0); + } + else + { + sub_806BA94(arr[6], arr[7], 1, 3); + } + } + else if (IsLinkDoubleBattle() == TRUE) + { + if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) + { + sub_806BA94(arr[6], arr[7], 0, 3); + sub_806BF24(&arr[6], 3, 3, 0); + } + else + { + sub_806BA94(arr[6], arr[7], 1, 3); + } + } + else if (gPlayerPartyCount > 3) + { + sub_806BA94(arr[6], arr[7], 0, 3); + sub_806BF24(&arr[6], 3, 3, 0); + } + else + { + sub_806BA94(arr[6], arr[7], 1, 3); + } + break; + case 5: + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 4) + { + sub_806BA94(arr[8], arr[9], 0, 3); + sub_806BF24(&arr[8], 4, 3, 0); + } + else + { + sub_806BA94(arr[8], arr[9], 1, 3); + } + } + else if (IsLinkDoubleBattle() == TRUE) + { + if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) + { + sub_806BA94(arr[8], arr[9], 0, 4); + sub_806BF24(&arr[8], 4, 4, 0); + } + else + { + sub_806BA94(arr[8], arr[9], 1, 4); + } + } + else if (gPlayerPartyCount > 4) + { + sub_806BA94(arr[8], arr[9], 0, 3); + sub_806BF24(&arr[8], 4, 3, 0); + } + else + { + sub_806BA94(arr[8], arr[9], 1, 3); + } + break; + case 6: + if (!IsDoubleBattle()) + { + if (gPlayerPartyCount > 5) + { + sub_806BA94(arr[10], arr[11], 0, 3); + sub_806BF24(&arr[10], 5, 3, 0); + } + else + { + sub_806BA94(arr[10], arr[11], 1, 3); + } + } + else if (IsLinkDoubleBattle() == TRUE) + { + if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) + { + sub_806BA94(arr[10], arr[11], 0, 4); + sub_806BF24(&arr[10], 5, 4, 0); + } + else + { + sub_806BA94(arr[10], arr[11], 1, 4); + } + } + else if (gPlayerPartyCount > 5) + { + sub_806BA94(arr[10], arr[11], 0, 3); + sub_806BF24(&arr[10], 5, 3, 0); + } + else + { + sub_806BA94(arr[10], arr[11], 1, 3); + } + break; + case 7: + if (ewram1B000.menuType == PARTY_MENU_TYPE_BATTLE_TOWER) + sub_806BB9C(1); + sub_806BBEC(1); + break; + case 8: + ewram1B000.unk261 = 2; + return TRUE; + } + + return FALSE; +} + +#ifdef NONMATCHING +void sub_806B908(void) +{ + memset(&gBGTilemapBuffers[2], 0, 0x800); + gPartyMenuType = PARTY_MENU_LAYOUT_MULTI_BATTLE; + sub_806B9A4(gUnknown_083769C0[12], gUnknown_083769C0[13], 3); + + if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES)) + sub_806BA94(gUnknown_083769C0[16], gUnknown_083769C0[17], 0, 3); + else + sub_806BA94(gUnknown_083769C0[16], gUnknown_083769C0[17], 1, 3); + + if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) + sub_806BA94(gUnknown_083769C0[18], gUnknown_083769C0[19], 0, 3); + else + sub_806BA94(gUnknown_083769C0[18], gUnknown_083769C0[19], 1, 3); + + ewram1B000.unk261 = 2; +} +#else +__attribute__((naked)) +void sub_806B908(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + ldr r0, _0806B948 @ =gBGTilemapBuffers + 0x1000\n\ + movs r2, 0x80\n\ + lsls r2, 4\n\ + movs r1, 0\n\ + bl memset\n\ + ldr r1, _0806B94C @ =gPartyMenuType\n\ + movs r0, 0x3\n\ + strb r0, [r1]\n\ + ldr r0, _0806B950 @ =gUnknown_083769A8\n\ + adds r4, r0, 0\n\ + adds r4, 0x24\n\ + ldr r5, _0806B954 @ =gPlayerParty + 1 * 0x64\n\ + ldrb r0, [r4]\n\ + ldrb r1, [r4, 0x1]\n\ + movs r2, 0x3\n\ + bl sub_806B9A4\n\ + adds r0, r5, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806B958\n\ + ldrb r0, [r4, 0x4]\n\ + ldrb r1, [r4, 0x5]\n\ + movs r2, 0\n\ + movs r3, 0x3\n\ + bl sub_806BA94\n\ + b _0806B964\n\ + .align 2, 0\n\ +_0806B948: .4byte gBGTilemapBuffers + 0x1000\n\ +_0806B94C: .4byte gPartyMenuType\n\ +_0806B950: .4byte gUnknown_083769A8\n\ +_0806B954: .4byte gPlayerParty + 1 * 0x64\n\ +_0806B958:\n\ + ldrb r0, [r4, 0x4]\n\ + ldrb r1, [r4, 0x5]\n\ + movs r2, 0x1\n\ + movs r3, 0x3\n\ + bl sub_806BA94\n\ +_0806B964:\n\ + adds r0, r5, 0\n\ + adds r0, 0x64\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806B980\n\ + ldrb r0, [r4, 0x6]\n\ + ldrb r1, [r4, 0x7]\n\ + movs r2, 0\n\ + movs r3, 0x3\n\ + bl sub_806BA94\n\ + b _0806B98C\n\ +_0806B980:\n\ + ldrb r0, [r4, 0x6]\n\ + ldrb r1, [r4, 0x7]\n\ + movs r2, 0x1\n\ + movs r3, 0x3\n\ + bl sub_806BA94\n\ +_0806B98C:\n\ + ldr r0, _0806B99C @ =gSharedMem + 0x1B000\n\ + ldr r1, _0806B9A0 @ =0x00000261\n\ + adds r0, r1\n\ + movs r1, 0x2\n\ + strb r1, [r0]\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806B99C: .4byte gSharedMem + 0x1B000\n\ +_0806B9A0: .4byte 0x00000261\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_806B9A4(s16 a, u16 b, u8 c) +{ + u8 i; + u16 var1 = b * 32; + + for (i = 0; i <= 6; i++) + { + u8 j = 0; + + if (a <= 0x1F) + { + for (; j <= 10 && a + j <= 0x1F; j++) + { + if (a + j >= 0) + gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (c << 12) | gUnknown_083769D8[i * 11 + j]; + } + } + } +} + +void sub_806BA34(s16 a, u16 b) +{ + u8 i; + u16 var1 = b * 32; + + for (i = 0; i <= 6; i++) + { + u8 j = 0; + + if (a <= 0x1F) + { + for (; j <= 10 && a + j <= 0x1F; j++) + { + if (a + j >= 0) + gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; + } + } + } +} + +void sub_806BA94(s16 a, u16 b, u8 c, u8 d) +{ + u8 i; + const u8 *arr; + u16 var1; + + if (c == 0) + arr = gUnknown_08376A25; + else + arr = gUnknown_08376A5E; + + var1 = b * 32; + + for (i = 0; i < 3; i++) + { + u8 j = 0; + + if (a <= 0x1F) + { + while (j <= 0x12 && a + j <= 0x1F) + { + if (a + j >= 0) + { + gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (d << 12) | arr[i * 19 + j]; + } + + j++; + } + } + } +} + +void sub_806BB3C(s16 a, u16 b) +{ + u8 i; + u16 var1 = (b * 32); + + for (i = 0; i < 3; i++) + { + u8 j = 0; + + if (a <= 0x1F) + { + for (; j <= 0x12 && a + j <= 0x1F; j++) + { + if (a + j >= 0) + { + gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; + } + } + } + } +} + +void sub_806BB9C(u8 a) +{ + u8 i; + u16 arr[12] = + { + 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + }; + u16 *vramPtr = (u16 *)(BG_VRAM + 0x3C30); + + for (i = 0; i < PARTY_SIZE; i++) + { + vramPtr[i] = arr[i] + (a << 12); + vramPtr[i + 0x20] = arr[i + PARTY_SIZE] + (a << 12); + } +} + +void sub_806BBEC(u8 a) +{ + u8 i; + u16 arr[12] = + { + 0x2A, 0x0B, 0x0C, 0x0D, 0x0E, 0x2F, + 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + }; + u16 *vramPtr = (u16 *)(BG_VRAM + 0x3CB0); + + for (i = 0; i < PARTY_SIZE; i++) + { + vramPtr[i] = arr[i] + (a << 12); + vramPtr[i + 0x20] = arr[i + PARTY_SIZE] + (a << 12); + } +} + +void sub_806BC3C(u8 monIndex, u8 b) +{ + u16 *vramPtr = gUnknown_08376918[IsDoubleBattle()][monIndex]; + u8 i; + u16 var1; + + for (i = 0, var1 = (b / 7) * 32; i <= PARTY_SIZE; i++) + { + u32 offset = i + var1; + vramPtr[i] = gUnknown_08E9A300[offset] + 0x10C; + vramPtr[i + 0x20] = gUnknown_08E9A300[offset + 0x20] + 0x10C; + } + + // Some dead code was likely optimized out, but the compiler still think r8 was used. + asm("":::"r8"); +} + +void unref_sub_806BCB8(u8 a) +{ + u8 i; + + for (i = 0; i < gPlayerPartyCount; i++) + sub_806BC3C(i, a); +} + +// This is ultimately unreferenced, since it's caller is unreferenced. +void sub_806BCE8() +{ + u8 i; + + for (i = 0; i < gPlayerPartyCount; i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + switch (GetMonGender(&gPlayerParty[i])) + { + case MON_MALE: + sub_806BC3C(i, 0x54); + break; + case MON_FEMALE: + sub_806BC3C(i, 0x62); + break; + default: + sub_806BC3C(i, 0x46); + break; + } + } + else + { + sub_806BC3C(i, 0x46); + } + } +} + +u8 sub_806BD58(u8 taskId, u8 b) +{ + u8 spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + sub_806CA18(taskId, spriteId); + return 1; +} + +#ifdef NONMATCHING +u16 HandleDefaultPartyMenuInput(u8 taskId) +{ + s8 menuDirectionPressed = 0x0; + + switch (gMain.newAndRepeatedKeys) + { + case DPAD_UP: + menuDirectionPressed = -1; + break; + case DPAD_DOWN: + menuDirectionPressed = 1; + break; + case DPAD_LEFT: + menuDirectionPressed = -2; + break; + case DPAD_RIGHT: + menuDirectionPressed = 2; + break; + } + + if (menuDirectionPressed == 0) + { + u8 var1 = sub_80F92BC(); + switch (var1) + { + case 1: + menuDirectionPressed = -1; + break; + case 2: + menuDirectionPressed = 1; + break; + } + + if (menuDirectionPressed == 0) + { + if ((gMain.newKeys & A_BUTTON) && gSprites[sub_806CA00(taskId)].data[0] == 7) + { + // Selected "CANCEL" + return B_BUTTON; + } + else + { + return gMain.newKeys & (A_BUTTON | B_BUTTON); + } + } + } + + ChangePartyMenuSelection(taskId, menuDirectionPressed); + return gMain.newAndRepeatedKeys; +} +#else +__attribute__((naked)) +u16 HandleDefaultPartyMenuInput(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + movs r4, 0\n\ + ldr r0, _0806BD9C @ =gMain\n\ + ldrh r0, [r0, 0x30]\n\ + cmp r0, 0x20\n\ + beq _0806BDB2\n\ + cmp r0, 0x20\n\ + bgt _0806BDA0\n\ + cmp r0, 0x10\n\ + beq _0806BDB6\n\ + b _0806BDB8\n\ + .align 2, 0\n\ +_0806BD9C: .4byte gMain\n\ +_0806BDA0:\n\ + cmp r0, 0x40\n\ + beq _0806BDAA\n\ + cmp r0, 0x80\n\ + beq _0806BDAE\n\ + b _0806BDB8\n\ +_0806BDAA:\n\ + movs r4, 0xFF\n\ + b _0806BDB8\n\ +_0806BDAE:\n\ + movs r4, 0x1\n\ + b _0806BDB8\n\ +_0806BDB2:\n\ + movs r4, 0xFE\n\ + b _0806BDB8\n\ +_0806BDB6:\n\ + movs r4, 0x2\n\ +_0806BDB8:\n\ + lsls r0, r4, 24\n\ + cmp r0, 0\n\ + bne _0806BDDC\n\ + bl sub_80F92BC\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _0806BDD0\n\ + cmp r0, 0x2\n\ + beq _0806BDD4\n\ + b _0806BDD6\n\ +_0806BDD0:\n\ + movs r4, 0xFF\n\ + b _0806BDD6\n\ +_0806BDD4:\n\ + movs r4, 0x1\n\ +_0806BDD6:\n\ + lsls r0, r4, 24\n\ + cmp r0, 0\n\ + beq _0806BDF0\n\ +_0806BDDC:\n\ + asrs r1, r0, 24\n\ + adds r0, r5, 0\n\ + bl ChangePartyMenuSelection\n\ + ldr r0, _0806BDEC @ =gMain\n\ + ldrh r0, [r0, 0x30]\n\ + b _0806BE2C\n\ + .align 2, 0\n\ +_0806BDEC: .4byte gMain\n\ +_0806BDF0:\n\ + ldr r0, _0806BE1C @ =gMain\n\ + ldrh r1, [r0, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0806BE24\n\ + ldr r4, _0806BE20 @ =gSprites\n\ + adds r0, r5, 0\n\ + bl sub_806CA00\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4\n\ + movs r2, 0x2E\n\ + ldrsh r0, [r1, r2]\n\ + cmp r0, 0x7\n\ + bne _0806BE24\n\ + movs r0, 0x2\n\ + b _0806BE2C\n\ + .align 2, 0\n\ +_0806BE1C: .4byte gMain\n\ +_0806BE20: .4byte gSprites\n\ +_0806BE24:\n\ + ldr r0, _0806BE34 @ =gMain\n\ + ldrh r1, [r0, 0x2E]\n\ + movs r0, 0x3\n\ + ands r0, r1\n\ +_0806BE2C:\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_0806BE34: .4byte gMain\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +u16 HandleBattleTowerPartyMenuInput(u8 taskId) +{ + u8 menuDirectionPressed = 0x0; + + switch (gMain.newAndRepeatedKeys) + { + case DPAD_UP: + menuDirectionPressed = 0xFF; + break; + case DPAD_DOWN: + menuDirectionPressed = 0x1; + break; + case DPAD_LEFT: + menuDirectionPressed = 0xFE; + break; + case DPAD_RIGHT: + menuDirectionPressed = 0x2; + break; + } + + if (menuDirectionPressed == 0) + { + switch (sub_80F92BC()) + { + case 1: + menuDirectionPressed = 0xFF; + break; + case 2: + menuDirectionPressed = 0x1; + break; + } + } + + if (gMain.newKeys & START_BUTTON) + { + SelectBattleTowerOKButton(taskId); + return START_BUTTON; + } + else + { + s8 signedMenuDirection = menuDirectionPressed; + if (signedMenuDirection) + { + ChangeBattleTowerPartyMenuSelection(taskId, signedMenuDirection); + return gMain.newAndRepeatedKeys; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + if (gSprites[sub_806CA00(taskId)].data[0] == 7) + return B_BUTTON; + } + } + } + + return gMain.newKeys & (A_BUTTON | B_BUTTON); +} + +void task_pc_turn_off(const u8 *a, u8 b) +{ + if (a[0]) + sub_806BA94(a[0], a[1], 0, b); + else + sub_806B9A4(a[0], a[1], b); +} + +void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d) +{ + if (GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES) && GetMonData(&gPlayerParty[monIndex], MON_DATA_HP) == 0) + c = PARTY_SIZE - 1; + + if (d == 1) + c += 4; + + task_pc_turn_off(a, c); +} + +void ChangePartyMenuSelection(u8 taskId, s8 directionPressed) +{ + bool8 isLinkDoubleBattle; + u8 spriteId = sub_806CA00(taskId); + u8 menuIndex = gSprites[spriteId].data[0]; + + UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); + + isLinkDoubleBattle = IsLinkDoubleBattle(); + if (isLinkDoubleBattle == 1) + { + if (menuIndex == 0 || menuIndex == 2 || menuIndex == 3) + sub_806BF24(&gUnknown_083769C0[menuIndex * 2], menuIndex, 3, 0); + if (menuIndex == 1 || menuIndex == 4 || menuIndex == 5) + sub_806BF24(&gUnknown_083769C0[menuIndex * 2], menuIndex, 4, 0); + if (menuIndex == 7) + sub_806BBEC(1); + + ChangeLinkDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); + + if (gSprites[spriteId].data[0] == 0 || gSprites[spriteId].data[0] == 2 || gSprites[spriteId].data[0] == 3) + sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1); + if (gSprites[spriteId].data[0] == 1 || gSprites[spriteId].data[0] == 4 || gSprites[spriteId].data[0] == 5) + sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 4, 1); + if (gSprites[spriteId].data[0] == 7) + sub_806BBEC(2); + + ewram1B000.unk261 = 2; + + gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data[0]].x; + gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data[0]].y; + } + else + { + u8 isDoubleBattle = IsDoubleBattle(); + + if (menuIndex < PARTY_SIZE) + sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + menuIndex * 2], menuIndex, 3, 0); + else + sub_806BBEC(1); + + if (!isDoubleBattle) + ChangeDefaultPartyMenuSelection(spriteId, menuIndex, directionPressed); + else + ChangeDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); + + if (gSprites[spriteId].data[0] < PARTY_SIZE) + sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1); + else + sub_806BBEC(2); + + ewram1B000.unk261 = 2; + + gSprites[spriteId].pos1.x = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data[0]].x; + gSprites[spriteId].pos1.y = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data[0]].y; + } + + UpdateMonIconFrame_806DA44(taskId, gSprites[spriteId].data[0], 1); + + if (menuIndex != gSprites[spriteId].data[0]) + PlaySE(SE_SELECT); +} + +void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) +{ + u8 nextIndex; + s8 menuMovement = directionPressed + 2; + + switch (menuMovement) + { + case 2: // no movement + gSprites[spriteId].data[1] = 0; + break; + case 1: // moving up + if (menuIndex == 0) + { + gSprites[spriteId].data[0] = 7; + } + else if (menuIndex == 7) + { + gSprites[spriteId].data[0] = gPlayerPartyCount - 1; + } + else + { + s8 diff = directionPressed; + gSprites[spriteId].data[0] += diff; + } + gSprites[spriteId].data[1] = 0; + break; + case 3: // moving down + if (menuIndex == gPlayerPartyCount - 1) + { + gSprites[spriteId].data[0] = 7; + } + else if (menuIndex == 7) + { + gSprites[spriteId].data[0] = 0; + } + else + { + s8 diff = directionPressed; + gSprites[spriteId].data[0] += diff; + } + gSprites[spriteId].data[1] = 0; + break; + case 4: // moving right + if (gPlayerPartyCount > 1 && menuIndex == 0) + { + if (gSprites[spriteId].data[1] == 0) + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; + } + break; + case 0: // moving left + // Only move the selection to the left side if one of the mons in the right-hand column are currently selected + nextIndex = menuIndex - 1; + if (nextIndex <= 4) + { + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = menuIndex; + } + break; + } +} + +void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) +{ + u8 var1; + s8 menuMovement = directionPressed + 2; + + switch(menuMovement) + { + case 2: // no movement + gSprites[spriteId].data[1] = 0; + break; + case 3: // moving down + if (menuIndex == 7) + { + gSprites[spriteId].data[0] = 0; + } + else if (menuIndex == gPlayerPartyCount - 1) + { + gSprites[spriteId].data[0] = 7; + } + else + { + s8 diff = directionPressed; + gSprites[spriteId].data[0] += diff; + } + gSprites[spriteId].data[1] = 0; + break; + case 1: // moving up + if (menuIndex == 0) + { + gSprites[spriteId].data[0] = 7; + } + else if (menuIndex == 7) + { + gSprites[spriteId].data[0] = gPlayerPartyCount - 1; + } + else + { + s8 diff = directionPressed; + gSprites[spriteId].data[0] += diff; + } + gSprites[spriteId].data[1] = 0; + break; + case 4: // moving right + if (menuIndex == 0) + { + if (gPlayerPartyCount > 2) + { + u16 var1 = gSprites[spriteId].data[1] - 2; + if (var1 > 1) + gSprites[spriteId].data[0] = 2; + else + gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; + } + } + else if (menuIndex == 1) + { + if (gPlayerPartyCount > 4) + { + u16 var1 = gSprites[spriteId].data[1] - 4; + if (var1 <= 1) + gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; + else + gSprites[spriteId].data[0] = 4; + } + } + break; + case 0: // moving left + var1 = menuIndex - 2; + if (var1 <= 1) + { + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = menuIndex; + } + else + { + u8 var2 = menuIndex - 4; + if (var2 <= 1) + { + gSprites[spriteId].data[0] = 1; + gSprites[spriteId].data[1] = menuIndex; + } + } + break; + } +} + +#ifdef NONMATCHING +void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) +{ + s8 menuMovement; + u16 var1; + u8 var2; + + menuMovement = directionPressed + 2; + switch (menuMovement) + { + case 2: // no movement + gSprites[spriteId].data[1] = 0; + break; + case 3: // moving down + if (menuIndex == 7) { + gSprites[spriteId].data[0] = 0; + } else { + while (menuIndex != PARTY_SIZE - 1) { + menuIndex++; + if (GetMonData(&gPlayerParty[menuIndex], MON_DATA_SPECIES)) + { + gSprites[spriteId].data[0] = menuIndex; + gSprites[spriteId].data[1] = 0; + return; + } + } + + gSprites[spriteId].data[0] = 7; + } + + gSprites[spriteId].data[1] = 0; + break; + case 1: // moving up + while (menuIndex != 0) { + menuIndex--; + if (menuIndex != PARTY_SIZE && GetMonData(gPlayerParty[menuIndex], MON_DATA_SPECIES)) + { + gSprites[spriteId].data[0] = menuIndex; + gSprites[spriteId].data[1] = 0; + return; + } + } + + gSprites[spriteId].data[0] = 7; + gSprites[spriteId].data[1] = 0; + break; + case 4: // moving right + if (menuIndex == 0) { + var1 = gSprites[spriteId].data[1] - 2; + if (var1 > 1) { + if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) { + gSprites[spriteId].data[0] = 2; + } else if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) { + gSprites[spriteId].data[0] = 3; + } + } else { + gSprites[spriteId].data[0] = 1; + } + } else if (menuIndex == 1) { + var1 = gSprites[spriteId].data[1] - 4; + if (var1 <= 1) { + gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; + } else { + if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) { + gSprites[spriteId].data[0] = 4; + } else if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) { + gSprites[spriteId].data[0] = 5; + } + } + } + break; + case 0: // moving left + var2 = menuIndex - 2; + if (var2 <= 1) { + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = menuIndex; + } else { + var2 = menuIndex - 4; + if (var2 <= 1) { + gSprites[spriteId].data[0] = 1; + gSprites[spriteId].data[1] = menuIndex; + } + } + + break; + } +} + +#else +__attribute__((naked)) +void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + lsls r1, 24\n\ + lsrs r4, r1, 24\n\ + lsls r2, 24\n\ + movs r0, 0x80\n\ + lsls r0, 18\n\ + adds r2, r0\n\ + asrs r0, r2, 24\n\ + cmp r0, 0x4\n\ + bls _0806C4AA\n\ + b _0806C64E\n\ +_0806C4AA:\n\ + lsls r0, 2\n\ + ldr r1, _0806C4B4 @ =_0806C4B8\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_0806C4B4: .4byte _0806C4B8\n\ + .align 2, 0\n\ +_0806C4B8:\n\ + .4byte _0806C618\n\ + .4byte _0806C524\n\ + .4byte _0806C4CC\n\ + .4byte _0806C4E0\n\ + .4byte _0806C57C\n\ +_0806C4CC:\n\ + ldr r0, _0806C4DC @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + movs r0, 0\n\ + strh r0, [r1, 0x30]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C4DC: .4byte gSprites\n\ +_0806C4E0:\n\ + cmp r4, 0x7\n\ + bne _0806C4FC\n\ + ldr r2, _0806C4F8 @ =gSprites\n\ + lsls r3, r5, 4\n\ + adds r0, r3, r5\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + movs r1, 0\n\ + strh r1, [r0, 0x2E]\n\ + adds r1, r2, 0\n\ + adds r6, r3, 0\n\ + b _0806C566\n\ + .align 2, 0\n\ +_0806C4F8: .4byte gSprites\n\ +_0806C4FC:\n\ + lsls r6, r5, 4\n\ + b _0806C518\n\ +_0806C500:\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + movs r0, 0x64\n\ + muls r0, r4\n\ + ldr r1, _0806C520 @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0806C528\n\ +_0806C518:\n\ + cmp r4, 0x5\n\ + bne _0806C500\n\ + b _0806C558\n\ + .align 2, 0\n\ +_0806C520: .4byte gPlayerParty\n\ +_0806C524:\n\ + lsls r6, r5, 4\n\ + b _0806C554\n\ +_0806C528:\n\ + ldr r1, _0806C534 @ =gSprites\n\ + adds r0, r6, r5\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + strh r4, [r0, 0x2E]\n\ + b _0806C566\n\ + .align 2, 0\n\ +_0806C534: .4byte gSprites\n\ +_0806C538:\n\ + subs r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x6\n\ + beq _0806C554\n\ + movs r0, 0x64\n\ + muls r0, r4\n\ + ldr r1, _0806C574 @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0806C528\n\ +_0806C554:\n\ + cmp r4, 0\n\ + bne _0806C538\n\ +_0806C558:\n\ + ldr r0, _0806C578 @ =gSprites\n\ + adds r1, r6, r5\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + movs r2, 0x7\n\ + strh r2, [r1, 0x2E]\n\ + adds r1, r0, 0\n\ +_0806C566:\n\ + adds r0, r6, r5\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strh r1, [r0, 0x30]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C574: .4byte gPlayerParty\n\ +_0806C578: .4byte gSprites\n\ +_0806C57C:\n\ + cmp r4, 0\n\ + bne _0806C5C8\n\ + ldr r0, _0806C5AC @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r4, r1, r0\n\ + ldrh r1, [r4, 0x30]\n\ + subs r0, r1, 0x2\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bls _0806C5E2\n\ + ldr r5, _0806C5B0 @ =gPlayerParty + 2 * 0x64\n\ + adds r0, r5, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806C5B4\n\ + movs r0, 0x2\n\ + strh r0, [r4, 0x2E]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C5AC: .4byte gSprites\n\ +_0806C5B0: .4byte gPlayerParty + 2 * 0x64\n\ +_0806C5B4:\n\ + adds r0, r5, 0\n\ + adds r0, 0x64\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806C64E\n\ + movs r0, 0x3\n\ + strh r0, [r4, 0x2E]\n\ + b _0806C64E\n\ +_0806C5C8:\n\ + cmp r4, 0x1\n\ + bne _0806C64E\n\ + ldr r0, _0806C5E8 @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r4, r1, r0\n\ + ldrh r1, [r4, 0x30]\n\ + subs r0, r1, 0x4\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _0806C5EC\n\ +_0806C5E2:\n\ + strh r1, [r4, 0x2E]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C5E8: .4byte gSprites\n\ +_0806C5EC:\n\ + ldr r5, _0806C600 @ =gPlayerParty + 4 * 0x64\n\ + adds r0, r5, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806C604\n\ + movs r0, 0x4\n\ + strh r0, [r4, 0x2E]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C600: .4byte gPlayerParty + 4 * 0x64\n\ +_0806C604:\n\ + adds r0, r5, 0\n\ + adds r0, 0x64\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806C64E\n\ + movs r0, 0x5\n\ + strh r0, [r4, 0x2E]\n\ + b _0806C64E\n\ +_0806C618:\n\ + subs r0, r4, 0x2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bhi _0806C634\n\ + ldr r0, _0806C630 @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + movs r0, 0\n\ + b _0806C64A\n\ + .align 2, 0\n\ +_0806C630: .4byte gSprites\n\ +_0806C634:\n\ + subs r0, r4, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bhi _0806C64E\n\ + ldr r0, _0806C654 @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + movs r0, 0x1\n\ +_0806C64A:\n\ + strh r0, [r1, 0x2E]\n\ + strh r4, [r1, 0x30]\n\ +_0806C64E:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806C654: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed) +{ + u16 newMenuIndex; + u8 newMenuIndex2; + u8 newMenuIndex3; + s8 menuMovement; + u8 spriteId = sub_806CA00(taskId); + u8 menuIndex = gSprites[spriteId].data[0]; + + UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); + + if (menuIndex < PARTY_SIZE) + sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); + else if (menuIndex == PARTY_SIZE) + sub_806BB9C(1); + else + sub_806BBEC(1); + + menuMovement = directionPressed + 2; + switch (menuMovement) + { + case 2: // no movement + gSprites[spriteId].data[1] = 0; + break; + case 1: // moving up + if (menuIndex == 0) + gSprites[spriteId].data[0] = 7; + else if (menuIndex == PARTY_SIZE) + gSprites[spriteId].data[0] = gPlayerPartyCount - 1; + else + gSprites[spriteId].data[0] += directionPressed; + gSprites[spriteId].data[1] = 0; + break; + case 3: // moving down + if (menuIndex == gPlayerPartyCount - 1) + gSprites[spriteId].data[0] = 6; + else if (menuIndex == 7) + gSprites[spriteId].data[0] = 0; + else + gSprites[spriteId].data[0] += directionPressed; + gSprites[spriteId].data[1] = 0; + break; + case 4: // moving right + if (gPlayerPartyCount > 1 && menuIndex == 0) + { + if (gSprites[spriteId].data[1] == 0) + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].data[0] = gSprites[spriteId].data[1]; + } + break; + case 0: // moving left + newMenuIndex3 = menuIndex - 1; + if (newMenuIndex3 <= 4) + { + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = menuIndex; + } + break; + } + + gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data[0]].x; + gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data[0]].y; + + + newMenuIndex = gSprites[spriteId].data[0]; + if (gSprites[spriteId].data[0] < PARTY_SIZE) + sub_806BF24(&gUnknown_083769A8[gSprites[spriteId].data[0] * 2], newMenuIndex, 3, 1); + else if (gSprites[spriteId].data[0] == PARTY_SIZE) + sub_806BB9C(2); + else + sub_806BBEC(2); + + ewram1B000.unk261 = 2; + + newMenuIndex2 = gSprites[spriteId].data[0]; + UpdateMonIconFrame_806DA44(taskId, newMenuIndex2, 1); + + if (menuIndex != gSprites[spriteId].data[0]) + PlaySE(SE_SELECT); +} + +// Selects the "OK" button in the Battle Tower party menu. +void SelectBattleTowerOKButton(u8 taskId) +{ + u8 spriteId = sub_806CA00(taskId); + + u8 menuIndex = gSprites[spriteId].data[0]; + if (menuIndex != 6) + { + UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); + + if (menuIndex < PARTY_SIZE) + sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); + else + sub_806BBEC(1); + + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].data[0] = 6; + gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][6].x; + gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][6].y; + + sub_806BB9C(2); + + ewram1B000.unk261 = 2; + PlaySE(SE_SELECT); + } +} + +void sub_806C92C(u8 spriteId) +{ + u8 menuIndex1 = gSprites[spriteId].data[0]; + u8 menuIndex2 = gSprites[spriteId].data[1]; + + if (!IsDoubleBattle()) + { + if (menuIndex1 < 1) + { + if (menuIndex2 < 1) + menuIndex2 = 1; + } + else + { + if (menuIndex2 >= 1) + menuIndex2 = 0; + } + } + else + { + if (menuIndex1 < 2) + { + if (menuIndex2 < 2) + menuIndex2 = 2; + } + else + { + if (menuIndex2 >= 2) + menuIndex2 = 0; + } + } + + gSprites[spriteId].data[1] = menuIndex2; +} + +void sub_806C994(u8 taskId, u8 b) +{ + u8 spriteId = sub_806CA00(taskId); + + gSprites[spriteId].data[0] = b; + sub_806C92C(spriteId); +} + +void sub_806C9C4(u8 taskId, u8 spriteId) +{ + u8 spriteId2 = sub_806CA00(taskId); + + gSprites[spriteId].pos1.x = gSprites[spriteId2].pos1.x; + gSprites[spriteId].pos1.y = gSprites[spriteId2].pos1.y; + gSprites[spriteId].data[0] = gSprites[spriteId2].data[0]; +} + +u8 sub_806CA00(u8 taskId) +{ + return gTasks[taskId].data[3] >> 8; +} + +void sub_806CA18(u8 taskId, u8 b) +{ + u8 var1 = gTasks[taskId].data[3]; + gTasks[taskId].data[3] = var1 | (b << 8); +} + +u8 sub_806CA38(u8 taskId) +{ + u8 spriteId = sub_806CA00(taskId); + return gSprites[spriteId].data[0]; +} + +void SetupDefaultPartyMenuSwitchPokemon(u8 taskId) +{ + gTasks[taskId].func = TaskDummy; + ewram01000.unk0 = taskId; + + CreateTask(HandlePartyMenuSwitchPokemonInput, 0); + ewram01000.unk1 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + + sub_806C9C4(taskId, ewram01000.unk1); + ewram01000.unk2 = sub_806CA00(taskId); + + PrintPartyMenuPromptText(ewram1B000_alt.unk272, 0); + + sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data[0] * 2], gSprites[ewram01000.unk1].data[0], 6, 0); + ewram1B000.unk261 = 2; +} + +// Handles changing the the current mon selection when choosing mons to swap places. +void ChangePartyMenuSwitchPokemonSelection(u8 taskId, s16 menuDirectionPressed) +{ + struct Sprite *sprite1 = &gSprites[ewram01000.unk1]; + struct Sprite *sprite2 = &gSprites[ewram01000.unk2]; + + ChangePartyMenuSelection(taskId, menuDirectionPressed); + + if (sprite1->data[0] != sprite2->data[0]) + sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 1); + else + sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 0); +} + +void HandlePartyMenuSwitchPokemonInput(u8 taskId) +{ + switch (gMain.newAndRepeatedKeys) + { + case DPAD_UP: + ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, -1); + break; + case DPAD_DOWN: + ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, 1); + break; + case DPAD_LEFT: + ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, -2); + break; + case DPAD_RIGHT: + ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, 2); + break; + } + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(5); + gTasks[taskId].func = ewram01000.unkC; + gTasks[taskId].func(taskId); + } + else if (gMain.newKeys == B_BUTTON) + { + PlaySE(5); + sub_806CD44(taskId); + } +} + +void sub_806CC2C(u8 taskId) +{ + DestroySprite(&gSprites[ewram01000.unk1]); + PrintPartyMenuPromptText(0, 0); + + ewram1B000.unk261 = 2; + SwitchTaskToFollowupFunc(ewram01000.unk0); + DestroyTask(taskId); +} + +void sub_806CC74(u8 taskId) +{ + sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk2].data[0] * 2], gSprites[ewram01000.unk2].data[0], 3, 1); + sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data[0] * 2], gSprites[ewram01000.unk1].data[0], 3, 0); + sub_806CC2C(taskId); +} + +void sub_806CCE4() +{ + u8 monIndex1 = gSprites[ewram01000.unk1].data[0]; + u8 monIndex2 = gSprites[ewram01000.unk2].data[0]; + + if (monIndex1 <= 5) + sub_806BF24(&gUnknown_083769A8[monIndex1 * 2], monIndex1, 3, 0); + if (monIndex2 <= 5) + sub_806BF24(&gUnknown_083769A8[monIndex2 * 2], monIndex2, 3, 1); +} + +void sub_806CD44(u8 taskId) +{ + sub_806CCE4(); + sub_806CC2C(taskId); +} + +void sub_806CD5C(u8 taskId) +{ + u8 monIndex1 = gSprites[ewram01000.unk1].data[0]; + u8 monIndex2 = gSprites[ewram01000.unk2].data[0]; + + if (monIndex1 == monIndex2 || monIndex1 == 7 || monIndex2 == 7) + { + sub_806CD44(taskId); + } + else + { + u8 var1; + + sub_806D5B8(monIndex1); + sub_806D5B8(monIndex2); + + if (monIndex1 > monIndex2) + { + ewram01000.unk5 = monIndex2; + ewram01000.unk6 = monIndex1; + } + else + { + ewram01000.unk5 = monIndex1; + ewram01000.unk6 = monIndex2; + } + + ewram01000.unk3 = GetMonIconSpriteId(ewram01000.unk0, ewram01000.unk5); + ewram01000.unk4 = GetMonIconSpriteId(ewram01000.unk0, ewram01000.unk6); + + var1 = ewram01000.unk5; + if (!var1) + { + gSprites[ewram01000.unk3].data[0] = -8; + gSprites[ewram01000.unk3].data[2] = -0xA8; + ewram01000.unk8 = var1; + ewram01000.unkA = 11; + + gTasks[taskId].func = sub_806D014; + ewram1B000.unk261 = 1; + } + else + { + gSprites[ewram01000.unk3].data[0] = 8; + gSprites[ewram01000.unk3].data[2] = 0xA8; + ewram01000.unk8 = 11; + ewram01000.unkA = 11; + + gTasks[taskId].func = sub_806D118; + ewram1B000.unk261 = 1; + } + + gSprites[ewram01000.unk3].callback = SpriteCB_sub_806D37C; + + gSprites[ewram01000.unk4].data[0] = 8; + gSprites[ewram01000.unk4].data[2] = 0xA8; + gSprites[ewram01000.unk4].callback = SpriteCB_sub_806D37C; + + gSprites[ewram01000.unk3].callback(&gSprites[ewram01000.unk3]); + gSprites[ewram01000.unk4].callback(&gSprites[ewram01000.unk4]); + } +} + +void SwapValues_s16(s16 *a, s16 *b) +{ + s16 temp = *a; + *a = *b; + *b = temp; +} + +#ifdef NONMATCHING +void sub_806CF04(void) +{ + SwapValues_s16(&gSprites[ewram01000.unk3].pos1.x, &gSprites[ewram01000.unk4].pos1.x); + SwapValues_s16(&gSprites[ewram01000.unk3].pos1.y, &gSprites[ewram01000.unk4].pos1.y); + SwapValues_s16(&gSprites[ewram01000.unk3].pos2.x, &gSprites[ewram01000.unk4].pos2.x); + SwapValues_s16(&gSprites[ewram01000.unk3].data[0], &gSprites[ewram01000.unk4].data[0]); + + gSprites[ewram01000.unk3].callback = SpriteCB_sub_806D37C; + gSprites[ewram01000.unk4].callback = SpriteCB_sub_806D37C; +} +#else +__attribute__((naked)) +void sub_806CF04(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + ldr r4, _0806CF94 @ =gSharedMem + 0x1000\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r5, _0806CF98 @ =gSprites + 0x20\n\ + adds r0, r5\n\ + ldrb r2, [r4, 0x4]\n\ + lsls r1, r2, 4\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + bl SwapValues_s16\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r3, r5, 0x2\n\ + adds r0, r3\n\ + ldrb r2, [r4, 0x4]\n\ + lsls r1, r2, 4\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r3\n\ + bl SwapValues_s16\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r3, r5, 0x4\n\ + adds r0, r3\n\ + ldrb r2, [r4, 0x4]\n\ + lsls r1, r2, 4\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r3\n\ + bl SwapValues_s16\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r3, r5, 0\n\ + adds r3, 0xE\n\ + adds r0, r3\n\ + ldrb r2, [r4, 0x4]\n\ + lsls r1, r2, 4\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r3\n\ + bl SwapValues_s16\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + subs r5, 0x4\n\ + adds r0, r5\n\ + ldr r2, _0806CF9C @ =SpriteCB_sub_806D37C\n\ + str r2, [r0]\n\ + ldrb r1, [r4, 0x4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + str r2, [r0]\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806CF94: .4byte gSharedMem + 0x1000\n\ +_0806CF98: .4byte gSprites + 0x20\n\ +_0806CF9C: .4byte SpriteCB_sub_806D37C\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_806CFA0(u8 taskId, u8 b) +{ + u8 var1 = ((ewram01000.unk6 - 1) * 3) + 1; + + sub_806BA34(ewram01000.unk8, 3); + sub_806BB3C(ewram01000.unkA, var1); + + if (!b) + { + ewram01000.unk8--; + ewram01000.unkA++; + } + else + { + ewram01000.unk8++; + ewram01000.unkA--; + } + + sub_806B9A4(ewram01000.unk8, 3, 10); + sub_806BA94(ewram01000.unkA, var1, 0, 10); +} + +void sub_806D014(u8 taskId) +{ + sub_806CFA0(taskId, 0); + + if (ewram01000.unk8 < -13 && ewram01000.unkA > 32) + { + sub_806CF04(); + gTasks[taskId].func = sub_806D05C; + } +} + +void sub_806D05C(u8 taskId) +{ + sub_806CFA0(taskId, 1); + + if (ewram01000.unk8 == 0 && ewram01000.unkA == 11) + gTasks[taskId].func = sub_806D198; +} + +void sub_806D098(u8 a, u8 b) +{ + u8 var1 = ((ewram01000.unk5 - 1) * 3) + 1; + u8 var2 = ((ewram01000.unk6 - 1) * 3) + 1; + + sub_806BB3C(ewram01000.unk8, var1); + sub_806BB3C(ewram01000.unkA, var2); + + if (!b) + { + ewram01000.unk8++; + ewram01000.unkA++; + } + else + { + ewram01000.unk8--; + ewram01000.unkA--; + } + + sub_806BA94(ewram01000.unk8, var1, 0, 10); + sub_806BA94(ewram01000.unkA, var2, 0, 10); +} + +void sub_806D118(u8 taskId) +{ + sub_806D098(taskId, 0); + + if (ewram01000.unk8 > 32 && ewram01000.unkA > 32) + { + sub_806CF04(); + gTasks[taskId].func = sub_806D15C; + } +} + +void sub_806D15C(u8 taskId) +{ + sub_806D098(taskId, 1); + + if (ewram01000.unk8 == 11 && ewram01000.unkA == 11) + gTasks[taskId].func = sub_806D198; +} + +void sub_806D198(u8 taskId) +{ + u8 spriteId; + + SetMonIconSpriteId(ewram01000.unk0, ewram01000.unk5, ewram01000.unk4); + SetMonIconSpriteId(ewram01000.unk0, ewram01000.unk6, ewram01000.unk3); + + gSprites[ewram01000.unk3].pos1.x = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk6].x; + gSprites[ewram01000.unk3].pos1.y = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk6].y; + gSprites[ewram01000.unk3].pos2.x = 0; + gSprites[ewram01000.unk3].pos2.y = 0; + gSprites[ewram01000.unk3].callback = UpdateMonIconFrame_806DA38; + + gSprites[ewram01000.unk4].pos1.x = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk5].x; + gSprites[ewram01000.unk4].pos1.y = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk5].y; + gSprites[ewram01000.unk4].pos2.x = 0; + gSprites[ewram01000.unk4].pos2.y = 0; + gSprites[ewram01000.unk4].callback = UpdateMonIconFrame_806DA38; + + spriteId = GetMonIconSpriteId(ewram01000.unk0, gSprites[ewram01000.unk2].data[0]); + gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; + + SwapPokemon(&gPlayerParty[ewram01000.unk5], &gPlayerParty[ewram01000.unk6]); + + PartyMenuPrintMonLevelOrStatus(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); + TryPrintPartyMenuMonNickname(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); + PartyMenuTryPrintHP(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); + nullsub_12(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); + + PartyMenuPrintMonLevelOrStatus(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); + TryPrintPartyMenuMonNickname(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); + PartyMenuTryPrintHP(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); + nullsub_12(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); + + PartyMenuDrawHPBars(); + sub_806CC74(taskId); +} + +void SpriteCB_sub_806D37C(struct Sprite *sprite) +{ + UpdateMonIconFrame(sprite); + + if (sprite->pos2.x == sprite->data[2]) + { + sprite->data[0] *= -1; + sprite->data[2] = 0; + sprite->callback = UpdateMonIconFrame_806DA38; + } + else + { + sprite->pos2.x += sprite->data[0]; + } +} + +void sub_806D3B4(u8 taskId, u16 species1, u16 species2) +{ + const u8 *var1 = gUnknown_083769C0; + + sub_806BA34(var1[2] + gTasks[taskId].data[0], var1[3]); + sub_806BB3C(var1[8] + gTasks[taskId].data[0], var1[9]); + sub_806BB3C(var1[10] + gTasks[taskId].data[0], var1[11]); + + gTasks[taskId].data[0]--; + + sub_806B9A4(var1[2] + gTasks[taskId].data[0], var1[3], 4); + + if (species1) + sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 0, 4); + else + sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 1, 4); + + if (species2) + sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 0, 4); + else + sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 1, 4); +} + +void sub_806D4AC(u8 taskId, u16 species, u8 c) +{ + if (species) + { + u8 monIndex = c + 3; + u8 spriteId = GetMonIconSpriteId(taskId, monIndex); + + gSprites[spriteId].data[0] = -8; + gSprites[spriteId].data[2] = gTasks[taskId].data[0] * -8; + gSprites[spriteId].callback = SpriteCB_sub_806D37C; + } +} + +void sub_806D50C(u8 taskId, u8 monIndex) +{ + gSprites[GetMonIconSpriteId(taskId, monIndex)].pos1.x += 0xF0; +} + +void PrintPartyMenuPromptText(u8 textId, u8 b) +{ + if (textId != 0xFF) + { + switch (b) + { + case 0: + Menu_DrawStdWindowFrame(0, 16, 23, 19); + break; + case 1: + Menu_DrawStdWindowFrame(0, 16, 19, 19); + break; + case 2: + Menu_DrawStdWindowFrame(0, 16, 22, 19); + break; + case 3: + Menu_DrawStdWindowFrame(0, 16, 18, 19); + break; + } + + Menu_PrintText(PartyMenuPromptTexts[textId], 1, 17); + } +} + +void sub_806D5A4(void) +{ + Menu_EraseWindowRect(0, 16, 29, 19); +} + +void sub_806D5B8(u8 monIndex) +{ + u32 var1; + u8 left = gUnknown_08376948[IsDoubleBattle()][monIndex].left; + u8 top = gUnknown_08376948[IsDoubleBattle()][monIndex].top; + u8 right = gUnknown_08376948[IsDoubleBattle()][monIndex].right; + u8 bottom = gUnknown_08376948[IsDoubleBattle()][monIndex].bottom; + + Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); + + var1 = 0; + CpuFastSet(&var1, OBJ_VRAM1 + monIndex * 0x400, 0x1000100); +} + +void sub_806D668(u8 monIndex) +{ + u32 var1; + u8 left = gUnknown_08376978[IsDoubleBattle()][monIndex].left; + u8 top = gUnknown_08376978[IsDoubleBattle()][monIndex].top; + u8 right = gUnknown_08376978[IsDoubleBattle()][monIndex].right; + u8 bottom = gUnknown_08376978[IsDoubleBattle()][monIndex].bottom; + + Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); + + var1 = 0; + CpuFastSet(&var1, OBJ_VRAM1 + 0x300 + monIndex * 0x400, 0x1000040); +} + +bool8 LoadPartyMenuGraphics(u8 a) +{ + u16 palette = 0x7FFF; + bool8 retVal = FALSE; + + if (a < 2) + LZDecompressVram(gPartyMenuMisc_Gfx, (void *)BG_VRAM); + + if (a == 2 || a == 0) + LZDecompressVram(gPartyMenuMisc_Tilemap, (void *)(BG_VRAM + 0x3800)); + + if (a == 3 || a == 0) + LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160); + + if (a == 4 || a == 0) + { + LoadPalette(&palette, 0, 2); + LoadPalette(gFontDefaultPalette, 0xF0, 0x20); + } + + if (a == 5 || a == 0) + LZDecompressVram(gPartyMenuHpBar_Gfx, (void *)(BG_VRAM + 0x6000)); + + if (a == 6 || a == 0) + LZDecompressVram(gPartyMenuOrderText_Gfx, (void *)(BG_VRAM + 0x6180)); + + if (a == 7 || a == 0) + LZDecompressVram(gStatusGfx_Icons, (void *)(BG_VRAM + 0x7180)); + + if (a == 8 || a == 0) + { + LoadCompressedPalette(gStatusPal_Icons, 0xB0, 0x20); + retVal = TRUE; + } + + return retVal; +} + +void SetMonIconAnimByHP(u8 spriteId, u16 currentHP, u16 maxHP) +{ + u8 hpBarLevel = GetHPBarLevel(currentHP, maxHP); + u8 animNum = 0; + + if (currentHP != maxHP) + { + if (hpBarLevel == 3) + animNum = 1; + else if (hpBarLevel == 2) + animNum = 2; + else if (hpBarLevel == 1) + animNum = 3; + else + animNum = 4; + } + + sub_809D824(&gSprites[spriteId], animNum); +} + +void SetMonIconAnim(u8 spriteId, struct Pokemon *pokemon) +{ + u16 currentHP = GetMonData(pokemon, MON_DATA_HP); + u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); + + SetMonIconAnimByHP(spriteId, currentHP, maxHP); +} + +void CreatePartyMenuMonIcon(u8 taskId, u8 monIndex, u8 menuType, struct Pokemon *pokemon) +{ + u8 x = gUnknown_08376678[menuType][monIndex].x; + u8 y = gUnknown_08376678[menuType][monIndex].y; + + u16 species2 = GetMonData(pokemon, MON_DATA_SPECIES2); + u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY); + + u8 spriteId = CreateMonIcon(species2, sub_809D62C, x, y, 5, personality); + SetMonIconSpriteId(taskId, monIndex, spriteId); + SetMonIconAnim(spriteId, pokemon); +} + +void TryCreatePartyMenuMonIcon(u8 taskId, u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES)) + { + if (IsLinkDoubleBattle() == TRUE) + CreatePartyMenuMonIcon(taskId, monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); + else + CreatePartyMenuMonIcon(taskId, monIndex, IsDoubleBattle(), pokemon); + } +} + +void unref_sub_806D964(u8 taskId) +{ + u8 i; + + for (i = 0; i < gPlayerPartyCount; i++) + TryCreatePartyMenuMonIcon(taskId, i, &gPlayerParty[i]); +} + +void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct UnknownPokemonStruct2 *pokemon) +{ + u8 x = gUnknown_08376678[menuType][monIndex].x; + u8 y = gUnknown_08376678[menuType][monIndex].y; + + u8 spriteId = CreateMonIcon(pokemon->species, sub_809D62C, x, y, 5, pokemon->personality); + SetMonIconSpriteId(taskId, monIndex, spriteId); + SetMonIconAnimByHP(spriteId, pokemon->hp, pokemon->maxhp); +} + +void UpdateMonIconFrame_806DA0C(struct Sprite *sprite) +{ + u8 var1 = UpdateMonIconFrame(sprite); + + if (var1) + { + if (var1 & 1) + sprite->pos2.y = -3; + else + sprite->pos2.y = 1; + } +} + +void UpdateMonIconFrame_806DA38(struct Sprite *sprite) +{ + UpdateMonIconFrame(sprite); +} + +void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c) +{ + u8 spriteId; + + if (monIndex < PARTY_SIZE) + { + spriteId = GetMonIconSpriteId(taskId, monIndex); + gSprites[spriteId].pos2.y = 0; + gSprites[spriteId].data[0] = 0; + + if (!c) + gSprites[spriteId].callback = UpdateMonIconFrame_806DA38; + else + gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; + } +} + +void LoadHeldItemIconGraphics(void) +{ + LoadSpriteSheet(&HeldItemsSpriteSheet); + LoadSpritePalette(&HeldItemsPalette); +} + +void SpriteCB_HeldItemIcon(struct Sprite *sprite) +{ + u8 data7 = sprite->data[7]; + + if (gSprites[data7].invisible) + { + sprite->invisible = 1; + } + else + { + sprite->invisible = 0; + sprite->pos1.x = gSprites[data7].pos1.x + gSprites[data7].pos2.x; + sprite->pos1.y = gSprites[data7].pos1.y + gSprites[data7].pos2.y; + } +} + +void CreateHeldItemIcon(u8 a, u8 b) +{ + u8 subPriority; + u8 spriteId; + + subPriority = gSprites[a].subpriority; + spriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, subPriority - 1); + + gSprites[spriteId].pos2.x = 4; + gSprites[spriteId].pos2.y = 10; + gSprites[spriteId].callback = SpriteCB_HeldItemIcon; + gSprites[spriteId].data[7] = a; + + StartSpriteAnim(&gSprites[spriteId], b); + gSprites[spriteId].callback(&gSprites[spriteId]); +} + +void CreateHeldItemIcons(u8 *a, u8 *b, u8 c) +{ + u16 i; + u16 heldItem; + + switch (c) + { + case 0: + for (i = 0; i < a[0]; i++) + { + heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + if (heldItem) + CreateHeldItemIcon(b[i], ItemIsMail(heldItem)); + } + break; + case 1: + for (i = 0; i < a[1]; i++) + { + heldItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); + if (heldItem) + CreateHeldItemIcon(b[i + 6], ItemIsMail(heldItem)); + } + break; + } +} + +void CreateHeldItemIcons_806DC34(u8 taskId) +{ + u8 i; + u8 monIconSpriteId; + u8 heldItemSpriteId; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + { + monIconSpriteId = GetMonIconSpriteId(taskId, i); + heldItemSpriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, 4); + + gSprites[heldItemSpriteId].pos2.x = 4; + gSprites[heldItemSpriteId].pos2.y = 10; + gSprites[heldItemSpriteId].data[7] = monIconSpriteId; + gSprites[monIconSpriteId].data[7] = heldItemSpriteId; + + SetHeldItemIconVisibility(taskId, i); + gSprites[heldItemSpriteId].callback(&gSprites[heldItemSpriteId]); + } + } +} + +#ifdef NONMATCHING +void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) +{ + u8 monIconSpriteId; + u8 heldItemSpriteId; + + monIconSpriteId = GetMonIconSpriteId(taskId, monIndex); + heldItemSpriteId = CreateSprite(gSpriteTemplate_837660C, 0xFA, 0xAA, 4); + + gSprites[heldItemSpriteId].pos2.x = 4; + gSprites[heldItemSpriteId].pos2.y = 10; + gSprites[heldItemSpriteId].data[7] = monIconSpriteId; + gSprites[monIconSpriteId].data[7] = heldItemSpriteId; + + if (!item) + { + gSprites[heldItemSpriteId].invisible = 1; + } + else + { + if (ItemIsMail(item)) + StartSpriteAnim(&gSprites[heldItemSpriteId], 1); + else + StartSpriteAnim(&gSprites[heldItemSpriteId], 0); + + gSprites[heldItemSpriteId].invisible = 0; + } + + gSprites[heldItemSpriteId].callback(&gSprites[heldItemSpriteId]); +} +#else +__attribute__((naked)) +void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + lsls r2, 16\n\ + lsrs r7, r2, 16\n\ + bl GetMonIconSpriteId\n\ + adds r4, r0, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + ldr r0, _0806DD2C @ =gSpriteTemplate_837660C\n\ + movs r1, 0xFA\n\ + movs r2, 0xAA\n\ + movs r3, 0x4\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldr r1, _0806DD30 @ =gSprites\n\ + lsls r0, r6, 4\n\ + adds r0, r6\n\ + lsls r0, 2\n\ + adds r5, r0, r1\n\ + movs r0, 0x4\n\ + strh r0, [r5, 0x24]\n\ + movs r0, 0xA\n\ + strh r0, [r5, 0x26]\n\ + strh r4, [r5, 0x3C]\n\ + lsls r0, r4, 4\n\ + adds r0, r4\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + strh r6, [r0, 0x3C]\n\ + cmp r7, 0\n\ + bne _0806DD34\n\ + adds r0, r5, 0\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r2, 0x4\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _0806DD5C\n\ + .align 2, 0\n\ +_0806DD2C: .4byte gSpriteTemplate_837660C\n\ +_0806DD30: .4byte gSprites\n\ +_0806DD34:\n\ + adds r0, r7, 0\n\ + bl ItemIsMail\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0806DD46\n\ + adds r0, r5, 0\n\ + movs r1, 0x1\n\ + b _0806DD4A\n\ +_0806DD46:\n\ + adds r0, r5, 0\n\ + movs r1, 0\n\ +_0806DD4A:\n\ + bl StartSpriteAnim\n\ + adds r2, r5, 0\n\ + adds r2, 0x3E\n\ + ldrb r1, [r2]\n\ + movs r0, 0x5\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r2]\n\ +_0806DD5C:\n\ + ldr r2, _0806DD78 @ =gSprites\n\ + lsls r0, r6, 4\n\ + adds r0, r6\n\ + lsls r0, 2\n\ + adds r1, r2, 0\n\ + adds r1, 0x1C\n\ + adds r1, r0, r1\n\ + adds r0, r2\n\ + ldr r1, [r1]\n\ + bl _call_via_r1\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806DD78: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite) +{ + u8 spriteId = sprite->data[7]; + + sprite->pos1.x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; + sprite->pos1.y = gSprites[spriteId].pos1.y; +} + +u8 GetMonIconSpriteId(u8 taskId, u8 monIndex) +{ + switch (monIndex) + { + case 1: + return gTasks[taskId].data[0]; + break; + case 2: + return gTasks[taskId].data[1] >> 8; + break; + case 3: + return gTasks[taskId].data[1]; + break; + case 4: + return gTasks[taskId].data[2] >> 8; + break; + case 5: + return gTasks[taskId].data[2]; + break; + case 0: + default: + return gTasks[taskId].data[0] >> 8; + break; + } +} + +void SetMonIconSpriteId(u8 taskId, u8 monIndex, u8 spriteId) +{ + switch (monIndex) + { + case 0: + gTasks[taskId].data[0] = (u8)gTasks[taskId].data[0] | (spriteId << 8); + break; + case 1: + gTasks[taskId].data[0] = (gTasks[taskId].data[0] & -0x100) | spriteId; + break; + case 2: + gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1] | (spriteId << 8); + break; + case 3: + gTasks[taskId].data[1] = (gTasks[taskId].data[1] & -0x100) | spriteId; + break; + case 4: + gTasks[taskId].data[2] = (u8)gTasks[taskId].data[2] | (spriteId << 8); + break; + case 5: + gTasks[taskId].data[2] = (gTasks[taskId].data[2] & -0x100) | spriteId; + break; + } +} + +u16 GetMonHeldItemIconSpriteId(u8 taskId, u8 monIndex) +{ + u8 spriteId = GetMonIconSpriteId(taskId, monIndex); + u8 retVal = gSprites[spriteId].data[7]; + return retVal; +} + +#ifdef NONMATCHING +void SetHeldItemIconVisibility(u8 taskId, u8 monIndex) +{ + u8 spriteId; + u16 heldItem; + + spriteId = GetMonHeldItemIconSpriteId(taskId, monIndex); + if (!GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM)) + { + gSprites[spriteId].invisible = 1; + } + else + { + struct Sprite *sprite; + + heldItem = GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM); + sprite = &gSprites[spriteId]; + if (ItemIsMail(heldItem)) + { + StartSpriteAnim(sprite, 1); + } + else + { + StartSpriteAnim(sprite, 0); + } + + sprite->invisible = 0; + } +} +#else +__attribute__((naked)) +void SetHeldItemIconVisibility(u8 a, u8 monIndex) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r4, r1, 0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r1, r4, 0\n\ + bl GetMonHeldItemIconSpriteId\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + adds r6, r5, 0\n\ + movs r0, 0x64\n\ + adds r1, r4, 0\n\ + muls r1, r0\n\ + ldr r0, _0806DFA4 @ =gPlayerParty\n\ + adds r4, r1, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0806DFAC\n\ + ldr r1, _0806DFA8 @ =gSprites\n\ + lsls r0, r5, 4\n\ + adds r0, r5\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r2, 0x4\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _0806DFF6\n\ + .align 2, 0\n\ +_0806DFA4: .4byte gPlayerParty\n\ +_0806DFA8: .4byte gSprites\n\ +_0806DFAC:\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl ItemIsMail\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0806DFD8\n\ + lsls r4, r5, 4\n\ + adds r4, r5\n\ + lsls r4, 2\n\ + ldr r0, _0806DFD4 @ =gSprites\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + b _0806DFE6\n\ + .align 2, 0\n\ +_0806DFD4: .4byte gSprites\n\ +_0806DFD8:\n\ + lsls r4, r6, 4\n\ + adds r4, r6\n\ + lsls r4, 2\n\ + ldr r0, _0806DFFC @ =gSprites\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ +_0806DFE6:\n\ + bl StartSpriteAnim\n\ + adds r4, 0x3E\n\ + ldrb r1, [r4]\n\ + movs r0, 0x5\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r4]\n\ +_0806DFF6:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806DFFC: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer) +{ + u32 var1 = 0; + CpuFastSet(&var1, gTileBuffer, 0x1000100); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gTileBuffer, nameBuffer); + CpuFastSet(gTileBuffer, OBJ_VRAM1 + (monIndex * 0x400), 128); +} + +void PrintPartyMenuMonNickname(u8 monIndex, u8 b, struct Pokemon *pokemon) +{ + u8 nameBuffer[12]; + GetMonNickname(pokemon, nameBuffer); + PartyMenuDoPrintMonNickname(monIndex, b, nameBuffer); +} + +void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES)) + { + if (IsLinkDoubleBattle() == TRUE) + PrintPartyMenuMonNickname(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); + else + PrintPartyMenuMonNickname(monIndex, IsDoubleBattle(), pokemon); + } +} + +void PrintPartyMenuMonNicknames(void) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + TryPrintPartyMenuMonNickname(i, &gPlayerParty[i]); +} + +u8 *GetMonNickname(struct Pokemon *pokemon, u8 *stringBuffer) +{ + GetMonData(pokemon, MON_DATA_NICKNAME, stringBuffer); + return StringGetEnd10(stringBuffer); +} + +void PartyMenuPutStatusTilemap(u8 monIndex, u8 menuLayout, u8 status) +{ + u8 i; + u8 x = gUnknown_08376738[menuLayout][monIndex].x - 1; + u8 y = gUnknown_08376738[menuLayout][monIndex].y + 1; + u16 *vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); + u8 var1 = status * 4; + + for (i = 0; i < 4; i++) + vramPtr[i] = (0x18C + var1 + i) | -0x5000; +} + +static void PartyMenuClearLevelStatusTilemap(u8 monIndex) +{ + u8 menuLayout; + u8 x; + u8 y; + u16 *vramPtr; + u8 i; + + if (IsLinkDoubleBattle() == TRUE) + menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; + else + menuLayout = IsDoubleBattle(); + + x = gUnknown_08376738[menuLayout][monIndex].x - 1; + y = gUnknown_08376738[menuLayout][monIndex].y + 1; + + vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); + for (i = 0; i < 4; i++) + vramPtr[i] = 0; +} + +static void PartyMenuWriteTilemap(u8 a, u8 x, u8 y) +{ + u16 *vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); + *vramPtr = a + 0x10C; +} + +void PartyMenuDoPrintLevel(u8 monIndex, u8 menuLayout, u8 level) +{ + u8 *stringVar; + u32 var1; + u8 x = gUnknown_08376738[menuLayout][monIndex].x; + u8 y = gUnknown_08376738[menuLayout][monIndex].y; + + PartyMenuWriteTilemap(0x40, x - 1, y + 1); + + stringVar = gStringVar1; + stringVar[0] = 0xFC; + stringVar[1] = 0x12; + stringVar[2] = 0x8; + + ConvertIntToDecimalString(&stringVar[3], level); + + var1 = 0; + CpuFastSet(&var1, gUnknown_02039460, 0x1000020); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); + CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x200 + (monIndex * 0x400), 32); +} + +void PartyMenuPrintLevel(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) +{ + u16 level = GetMonData(pokemon, MON_DATA_LEVEL); + PartyMenuDoPrintLevel(monIndex, menuLayout, level); +} + +void PartyMenuPrintMonLevelOrStatus(u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) + { + u8 statusAndPkrs = GetMonStatusAndPokerus(pokemon); + u8 menuLayout; + + if (IsLinkDoubleBattle() == TRUE) + menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; + else + menuLayout = IsDoubleBattle(); + + if (statusAndPkrs != 0 && statusAndPkrs != 6) + PartyMenuPutStatusTilemap(monIndex, menuLayout, statusAndPkrs - 1); + else + PartyMenuPrintLevel(monIndex, menuLayout, pokemon); + + PartyMenuPrintGenderIcon(monIndex, menuLayout, pokemon); + } +} + +void PartyMenuPrintMonsLevelOrStatus(void) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + PartyMenuPrintMonLevelOrStatus(i, &gPlayerParty[i]); +} + +void PartyMenuDoPrintGenderIcon(u16 species, u8 gender, u8 menuLayout, u8 monIndex, u8 *nickname) +{ + if (!ShouldHideGenderIcon(species, nickname)) + { + u8 x = gUnknown_08376738[menuLayout][monIndex].x + 3; + u8 y = gUnknown_08376738[menuLayout][monIndex].y + 1; + + switch (gender) + { + case MON_MALE: + PartyMenuWriteTilemap(0x42, x, y); + break; + case MON_FEMALE: + PartyMenuWriteTilemap(0x44, x, y); + break; + } + } +} + +void PartyMenuPrintGenderIcon(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) +{ + u16 species2; + u8 gender; + + GetMonNickname(pokemon, gStringVar1); + species2 = GetMonData(pokemon, MON_DATA_SPECIES2); + gender = GetMonGender(pokemon); + PartyMenuDoPrintGenderIcon(species2, gender, menuLayout, monIndex, gStringVar1); +} + +void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP) +{ + u32 *var; + register u8 *stringVar1 asm("r2") = gStringVar1; + register u8 *textPtr asm("r2") = sub_8072C14(stringVar1, currentHP, 15, 1); + textPtr[0] = CHAR_SLASH; + + sub_8072C14(++textPtr, maxHP, 35, 1); + var = 0; + + CpuFastSet(&var, gUnknown_02039460, 0x1000040); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); + CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x300 + (monIndex * 0x400), 64); +} + +void PartyMenuPrintHP(u8 monIndex, u8 b, struct Pokemon *pokemon) +{ + u16 currentHP = GetMonData(pokemon, MON_DATA_HP); + u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); + + PartyMenuDoPrintHP(monIndex, b, currentHP, maxHP); +} + +void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) + { + if (IsLinkDoubleBattle() == TRUE) + PartyMenuPrintHP(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); + else + PartyMenuPrintHP(monIndex, IsDoubleBattle(), pokemon); + } +} + +void PartyMenuTryPrintMonsHP(void) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + PartyMenuTryPrintHP(i, &gPlayerParty[i]); +} + +void unref_sub_806E564(void) { } +void unref_sub_806E568(void) { } +void nullsub_12(u8 monIndex, struct Pokemon *pokemon) { } +void nullsub_13(void) { } + +void PartyMenuDoDrawHPBar(u8 monIndex, u8 menuLayout, u16 currentHP, u16 maxHP) +{ + u8 hpBarLevel; + u16 *vramPtr; + int var = -32768; + struct BattleInterfaceStruct1 battleInterface; + battleInterface.unk0 = maxHP; + battleInterface.unk4 = currentHP; + battleInterface.unk8 = 0; + + hpBarLevel = GetHPBarLevel(currentHP, maxHP); + if (hpBarLevel > 2) + battleInterface.unkC_0 = 4; + if (hpBarLevel == 2) + battleInterface.unkC_0 = 5; + if (hpBarLevel < 2) + battleInterface.unkC_0 = 6; + + battleInterface.unk10 = 0x100; + + vramPtr = gUnknown_08376858[menuLayout][monIndex]; + sub_80460C8(&battleInterface, &var, vramPtr, 0); + + vramPtr -= 2; + + vramPtr[0] = 0x3109; + vramPtr[1] = 0x310A; + vramPtr[8] = 0x310B; +} + +void PartyMenuDrawHPBar(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) +{ + u16 currentHP = GetMonData(pokemon, MON_DATA_HP); + u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); + + PartyMenuDoDrawHPBar(monIndex, menuLayout, currentHP, maxHP); +} + +void PartyMenuTryDrawHPBar(u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) + { + if (IsLinkDoubleBattle() == TRUE) + PartyMenuDrawHPBar(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); + else + PartyMenuDrawHPBar(monIndex, IsDoubleBattle(), pokemon); + } +} + +void PartyMenuDrawHPBars(void) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + PartyMenuTryDrawHPBar(i, &gPlayerParty[i]); +} + +void SwapPokemon(struct Pokemon *a, struct Pokemon *b) +{ + struct Pokemon temp = *a; + *a = *b; + *b = temp; +} + +void SetPartyPopupMenuOffsets(u8 menuIndex, u8 *left, u8 *top, const struct PartyPopupMenu *menu) +{ + u8 bottomOffset = (2 * menu[menuIndex].numChoices) + 2; + u8 rightOffset = menu[menuIndex].width + 1; + + *left = 30 - rightOffset; + *top = 20 - bottomOffset; +} + +void ShowPartyPopupMenu(u8 menuIndex, const struct PartyPopupMenu *menu, const struct MenuAction2 *menuActions, u8 cursorPos) +{ + u8 left; + u8 top; + + SetPartyPopupMenuOffsets(menuIndex, &left, &top, menu); + sub_8089C50(left, top, menu[menuIndex].width, menu[menuIndex].numChoices, menuActions, menu[menuIndex].items); + + InitMenu(0, left + 1, top + 1, menu[menuIndex].numChoices, cursorPos, menu[menuIndex].width - 1); +} + +void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu) +{ + u8 left; + u8 top; + + SetPartyPopupMenuOffsets(index, &left, &top, menu); + + Menu_EraseWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1); + Menu_DestroyCursor(); +} + +TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex) +{ + u8 action = menus[menuIndex].items[itemIndex]; + return menuActions[action].func; +} + +u8 sub_806E834(const u8 *message, u8 arg1) +{ + u8 taskId; + + gUnknown_0202E8F6 = 1; + + Menu_DrawStdWindowFrame(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + MenuPrintMessage(message, WINDOW_LEFT + 1, 15); + + taskId = CreateTask(sub_806E884, 1); + gTasks[taskId].data[0] = arg1; + + return taskId; +} + +static void sub_806E884(u8 taskId) +{ + if (Menu_UpdateWindowText()) + { + gUnknown_0202E8F6 = 0; + if (gTasks[taskId].data[0] == 0) + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + DestroyTask(taskId); + } +} + +void sub_806E8D0(u8 taskId, u16 b, TaskFunc c) +{ + ewram1C000.unk10 = c; + ewram1C000.unk4 = taskId; + ewram1C000.unk5 = sub_806CA38(taskId); + ewram1C000.unk6 = b; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; +} + +bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item) +{ + u8 itemData[2]; + + if (ItemIsMail(item) == TRUE) + { + if (GiveMailToMon(pkmn, item) == 0xFF) + return TRUE; + gUnknown_0202E8F4 = 2; + } + else + { + gUnknown_0202E8F4 = 1; + } + + itemData[0] = item; + itemData[1] = item >> 8; + SetMonData(pkmn, MON_DATA_HELD_ITEM, itemData); + return FALSE; +} + +void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c) +{ + u16 currentItem; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, newItem, c); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + gUnknown_0202E8F4 = 0; + gUnknown_0202E8F8 = 0; + if (currentItem != 0) + { + if (ItemIsMail(currentItem) == TRUE) + { + sub_806E834(gOtherText_MailMustBeRemoved, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + GetMonNickname(ewram1C000.pokemon, gStringVar1); + CopyItemName(currentItem, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyHolding); + sub_806E834(gStringVar4, 1); + CreateTask(Task_ConfirmGiveHeldItem, 5); + if (ItemIsMail(newItem) == TRUE) + gUnknown_0202E8F8 = currentItem; + } + } + else + { + PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, newItem); + RemoveBagItem(newItem, 1); + if (ItemIsMail(newItem)) + { + gTasks[taskId].func = c; + } + else + { + DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + } +} + +void party_menu_link_mon_held_item_object(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } +} + +void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) +{ + s8 selection = Menu_ProcessInputNoWrap_(); + + if (selection == 0) + { + u16 currentItem; + + Menu_EraseWindowRect(23, 8, 29, 13); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + RemoveBagItem(ewram1C000.unk6, 1); + if (AddBagItem(currentItem, 1) == TRUE) + { + PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6); + if (ItemIsMail(ewram1C000.unk6)) + { + DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1); + } + else + { + CopyItemName(ewram1C000.unk6, gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced); + sub_806E834(gStringVar4, 1); + } + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + AddBagItem(ewram1C000.unk6, 1); + } + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + Menu_EraseWindowRect(23, 8, 29, 13); + } + gTasks[taskId].func = party_menu_link_mon_held_item_object; +} + +void Task_ConfirmGiveHeldItem(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = PartyMenuTryGiveMonHeldItem_806EACC; + } +} + +void DisplayGiveHeldItemMessage(u8 a, u16 b, u8 c) +{ + GetMonNickname(&gPlayerParty[a], gStringVar1); + CopyItemName(b, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasGivenToHold); + sub_806E834(gStringVar4, c); +} + +void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) +{ + u32 var1; + u16 currentItem; + struct MailStruct *mail; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + gUnknown_0202E8F4 = 0; + var1 = ewram1FE00.unkE00 + 6; + mail = &gSaveBlock1.mail[var1 + ewram1FE00.unkE02]; + + if (currentItem != 0) + { + sub_806E834(gOtherText_PokeHoldingItemCantMail, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + GiveMailToMon2(ewram1C000.pokemon, mail); + ClearMailStruct(mail); + sub_806E834(gOtherText_MailTransferredMailbox, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } +} + +void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func) +{ + u16 currentItem; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + if (currentItem == 0) + { + StringExpandPlaceholders(gStringVar4, gOtherText_NotHoldingAnything); + sub_806E834(gStringVar4, 0); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + u8 itemData[2]; + + itemData[0] = 0; + itemData[1] = 0; + if (AddBagItem(currentItem, 1) == TRUE) + { + if (ItemIsMail(currentItem) == TRUE) + TakeMailFromMon(ewram1C000.pokemon); + DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0); + SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData); + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + } + CreateTask(party_menu_link_mon_held_item_object, 5); + } +} + +void DisplayTakeHeldItemMessage(u8 a, u16 b, u8 c) +{ + GetMonNickname(&gPlayerParty[a], gStringVar1); + CopyItemName(b, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_ReceivedTheThingFrom); + sub_806E834(gStringVar4, c); +} + +void DoTakeMail(u8 taskId, TaskFunc func) +{ + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + sub_806E834(gOtherText_SendRemovedMailPrompt, 1); + CreateTask(Task_ConfirmTakeHeldMail, 5); +} + +void Task_LoseMailMessage(u8 taskId) +{ + s8 selection = Menu_ProcessInputNoWrap_(); + + if (selection == 0) + { + if (AddBagItem(ewram1C000.unk6, 1) == TRUE) + { + TakeMailFromMon(ewram1C000.pokemon); + sub_806E834(gOtherText_MailTaken, 0); + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + } + Menu_EraseWindowRect(23, 8, 29, 13); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + Menu_EraseWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(0, 14, 29, 19); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } +} + +void Task_ConfirmLoseMailMessage(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = Task_LoseMailMessage; + } +} + +void Task_TakeHeldMail(u8 taskId) +{ + s8 selection = Menu_ProcessInputNoWrap_(); + + if (selection == 0) + { + Menu_EraseWindowRect(23, 8, 29, 13); + if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) + sub_806E834(gOtherText_MailWasSent, 0); + else + sub_806E834(gOtherText_MailboxIsFull, 0); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + Menu_EraseWindowRect(23, 8, 29, 13); + sub_806E834(gOtherText_MailRemovedMessageLost, 1); + gTasks[taskId].func = Task_ConfirmLoseMailMessage; + } +} + +void Task_ConfirmTakeHeldMail(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = Task_TakeHeldMail; + } +} + +u16 ItemIdToBattleMoveId(u16 item) +{ + u16 machineNumber = item - ITEM_TM01_FOCUS_PUNCH; + return TMHMMoves[machineNumber]; +} + +bool8 pokemon_has_move(struct Pokemon *pkmn, u16 move) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (GetMonData(pkmn, MON_DATA_MOVE1 + i) == move) + return TRUE; + } + return FALSE; +} + +void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) +{ + PlaySE(SE_SELECT); + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, move, func); + CreateTask(Task_TeamMonTMMove, 5); +} + +#if DEBUG +extern u8 gUnknown_020297ED; +#endif + +void Task_TeamMonTMMove(u8 taskId) +{ + GetMonNickname(ewram1C000.pokemon, gStringVar1); + ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + ewram1B000.unk282 = 0; + if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8)) + { + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyKnows); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if ( +#if DEBUG + !gUnknown_020297ED && +#endif + !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) + { + StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (GiveMoveToMon(ewram1C000.pokemon, ewram1C000.unk8) != 0xFFFF) + { + Task_TeamMonTMMove2(taskId); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F358; + } + } + } +} + +void Task_TeamMonTMMove2(u8 taskId) +{ + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); + AdjustFriendship(ewram1C000.pokemon, 4); + if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152) + RemoveBagItem(ewram1C000.unk6, 1); + gTasks[taskId].func = Task_TeamMonTMMove3; +} + +void Task_TeamMonTMMove3(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + PlayFanfare(BGM_FANFA1); + gTasks[taskId].func = Task_TeamMonTMMove4; + } +} + +void Task_TeamMonTMMove4(u8 taskId) +{ + if (IsFanfareTaskInactive()) + { + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + if (ewram1B000.unk282 == 1) + { + TeachMonMoveInPartyMenu(taskId); + } + else + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } + } + } +} + +void sub_806F2FC(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + if (ewram1B000.unk282 == 1) + { + TeachMonMoveInPartyMenu(taskId); + } + else + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } + } +} + +void sub_806F358(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = sub_806F390; + } +} + +void sub_806F390(u8 taskId) +{ + s8 selection = Menu_ProcessInputNoWrap_(); + + if (selection == 0) + { + Menu_EraseWindowRect(23, 8, 29, 13); + sub_806E834(gOtherText_WhichMoveToForget2, 1); + gTasks[taskId].func = sub_806F44C; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + StopTryingToTeachMove_806F614(taskId); + } +} + +void sub_806F3FC(u8 taskId) +{ + if (!gPaletteFade.active) + { + ShowSelectMovePokemonSummaryScreen(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); + DestroyTask(taskId); + } +} + +void sub_806F44C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_806F3FC; + } +} + +void TaughtMove(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 moveIndex; + u16 r4; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, gSpecialVar_ItemId, sub_808B508); + moveIndex = sub_809FA30(); + r4 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + moveIndex); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[r4]); + StringExpandPlaceholders(gStringVar4, gOtherText_ForgetMove123_2); + sub_806E834(gStringVar4, 1); + CreateTask(TMMoveUpdateMoveSlot, 5); + } +} + +void TMMoveUpdateMoveSlot(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + RemoveMonPPBonus(ewram1C000.pokemon, sub_809FA30()); + SetMonMoveSlot(ewram1C000.pokemon, ewram1C000.unk8, sub_809FA30()); + Task_TeamMonTMMove2(taskId); + } +} + +void StopTryingToTeachMove_806F588(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, gSpecialVar_ItemId, sub_808B508); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); + sub_806E834(gStringVar4, 1); + CreateTask(StopTryingToTeachMove_806F67C, 5); + } +} + +void StopTryingToTeachMove_806F614(u8 taskId) +{ + Menu_EraseWindowRect(23, 8, 29, 13); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = StopTryingToTeachMove_806F67C; +} + +void StopTryingToTeachMove_806F67C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = StopTryingToTeachMove_806F6B4; + } +} + +void StopTryingToTeachMove_806F6B4(u8 taskId) +{ + s8 selection = Menu_ProcessInputNoWrap_(); + + if (selection == 0) + { + Menu_EraseWindowRect(23, 8, 29, 13); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F2FC; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + Menu_EraseWindowRect(23, 8, 29, 13); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F358; + } +} + +bool8 IsHMMove(u16 move) +{ + u8 i; + + for (i = 0; i < NUM_HIDDEN_MACHINES; i++) + { + if (TMHMMoves[NUM_TECHNICAL_MACHINES + i] == move) + return TRUE; + } + + return FALSE; +} + +s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c) +{ + s16 *taskData; + u8 hpBarLevel; + void *vramPtr; + + taskData = gTasks[taskId].data; + + b->unk0 = taskData[10]; + b->unk4 = taskData[11]; + b->unk8 = taskData[12] * c; + b->unk10 = 0x100; + hpBarLevel = GetHPBarLevel(ewram1B000.unk282, b->unk0); + if (hpBarLevel > 2) + b->unkC_0 = 4; + if (hpBarLevel == 2) + b->unkC_0 = 5; + if (hpBarLevel < 2) + b->unkC_0 = 6; + vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5]; + return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0); +} + +void sub_806F8AC(u8 taskId) +{ + struct BattleInterfaceStruct1 sp0; + u16 sp14; + + ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, -1); + if (ewram1B000.unk282 == -1) + { + ewram1C000.unkC = 0; + if (-sp0.unk8 + sp0.unk4 > sp0.unk0) + sp14 = sp0.unk0 - sp0.unk4; + else + sp14 = -sp0.unk8; + gBattleMoveDamage = -sp14; + GetMonNickname(ewram1C000.pokemon, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, sp14, 0, 3); + if (gTasks[taskId].data[14] == 0) + StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy); + else + StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth); + SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon); + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7); + ewram1B000.unk261 = 2; + sub_806E834(gStringVar4, 1); + sp14 += sp0.unk4; + SetMonData(ewram1C000.pokemon, MON_DATA_HP, &sp14); + RemoveBagItem(ewram1C000.unk6, 1); + sub_8032638(); + gTasks[taskId].func = sub_806FB44; + } + else + { + PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); + } +} + +void sub_806FA18(u8 taskId) +{ + struct BattleInterfaceStruct1 sp0; + + ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, 1); + if (ewram1B000.unk282 == -1) + { + PlaySE(SE_KAIFUKU); + ewram1C000.unkC = 0; + gTasks[taskId].data[11] -= gTasks[taskId].data[12]; + SetMonData(ewram1C000.pokemon, MON_DATA_HP, &gTasks[taskId].data[11]); + SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon); + ewram1C000.unk5 = gSprites[ewram01000.unk2].data[0]; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; + gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + ewram1C000.unkC = -32768; + ewram1C000.unk14 = ewram1C000.unk10; + gTasks[taskId].func = sub_806F8AC; + ewram1B000.unk282 = gTasks[taskId].data[11]; + } + else + { + PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); + } +} + +void sub_806FB0C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } +} + +void sub_806FB44(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk14; + DestroyTask(taskId); + } +} + +bool8 IsHPRecoveryItem(u16 item) +{ + const u8 *itemEffect; + + if (item == ITEM_ENIGMA_BERRY) + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + else + itemEffect = gItemEffectTable[item - ITEM_POTION]; + + if (itemEffect[4] & 4) + return TRUE; + else + return FALSE; +} + +void PartyMenuUpdateLevelOrStatus(struct Pokemon *pkmn, u8 monIndex) +{ + PartyMenuClearLevelStatusTilemap(monIndex); + PartyMenuPrintMonLevelOrStatus(monIndex, pkmn); +} + +void GetMedicineItemEffectMessage(u16 item) +{ + switch (GetItemEffectType(item)) + { + case 3: + StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); + break; + case 4: + StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); + break; + case 5: + StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); + break; + case 6: + StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); + break; + case 7: + StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); + break; + case 8: + StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); + break; + case 9: + StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); + break; + case 11: + StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); + break; + case 13: + StringCopy(gStringVar2, gOtherText_Hp2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 12: + StringCopy(gStringVar2, gOtherText_Attack); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 17: + StringCopy(gStringVar2, gOtherText_Defense); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 16: + StringCopy(gStringVar2, gOtherText_Speed); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 14: + StringCopy(gStringVar2, gOtherText_SpAtk2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 15: + StringCopy(gStringVar2, gOtherText_SpDef2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 19: + case 20: + StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); + break; + case 21: + StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); + break; + default: + StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); + break; + } +} + +bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item) +{ + if (GetItemEffectType(item) == 13 + && GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA) + return TRUE; + else + return FALSE; +} + +bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c) +{ + if (gMain.inBattle) + return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c); + else + return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c); +} + +void UseMedicine(u8 taskId, u16 item, TaskFunc func) +{ + u8 r7; + bool8 r9 = FALSE; + bool8 r0; + + gTasks[taskId].func = TaskDummy; + r7 = CreateTask(TaskDummy, 5); + sub_806E8D0(taskId, item, func); + if (!IsMedicineIneffective(ewram1C000.pokemon, item)) + { + r9 = IsHPRecoveryItem(item); + if (r9 == TRUE) + { + gTasks[r7].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + gTasks[r7].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + if (gTasks[r7].data[10] == gTasks[r7].data[11]) + { + r9 = FALSE; + gTasks[r7].data[10] = 0; + gTasks[r7].data[11] = 0; + } + } + r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0); + } + else + { + r0 = TRUE; + } + + if (r0) + { + gUnknown_0202E8F4 = 0; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + gTasks[r7].func = sub_806FB0C; + } + else + { + u8 statusAndPkrs; + + gUnknown_0202E8F4 = 1; + if (!IsBlueYellowRedFlute(item)) + PlaySE(SE_KAIFUKU); + else + PlaySE(SE_BIDORO); + statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon); + if (statusAndPkrs == 6 || statusAndPkrs == 0) + PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); + if (r9 == TRUE) + { + gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11]; + ewram1C000.unkC = -32768; + if (gTasks[r7].data[11] == 0) + gTasks[r7].data[14] = 1; + else + gTasks[r7].data[14] = 0; + ewram1C000.unk14 = ewram1C000.unk10; + gTasks[r7].func = sub_806F8AC; + ewram1B000.unk282 = gTasks[r7].data[11]; + } + else + { + GetMonNickname(ewram1C000.pokemon, gStringVar1); + if (!IsBlueYellowRedFlute(item)) + RemoveBagItem(item, 1); + GetMedicineItemEffectMessage(item); + TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon); + sub_806E834(gStringVar4, 1); + gTasks[r7].func = sub_806FB0C; + } + } +} + +bool8 IsBlueYellowRedFlute(u16 item) +{ + if (item == ITEM_BLUE_FLUTE + || item == ITEM_RED_FLUTE + || item == ITEM_YELLOW_FLUTE) + return TRUE; + else + return FALSE; +} + +void sub_8070048(u8 taskId, u16 item, TaskFunc func) +{ + ewram1C000.unk10 = func; + ewram1C000.unk4 = taskId; + ewram1C000.unk6 = item; + ewram1C000.unk5 = 0; + ewram1C000.unk14 = sub_80701DC; + ewram1B000.unk27E = 0; + ewram1B000.unk280 = 0; + sub_8070088(taskId); +} + +void sub_8070088(u8 taskId) +{ + u8 taskId2; + + gTasks[taskId].func = TaskDummy; + if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0) + { + gTasks[taskId].func = sub_80701DC; + } + else + { + s16 *taskData; + + taskId2 = CreateTask(TaskDummy, 5); + taskData = gTasks[taskId2].data; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; + taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0)) + { + DestroyTask(taskId2); + gTasks[taskId].func = sub_80701DC; + } + else + { + gUnknown_0202E8F4 = 1; + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + PlaySE(SE_KAIFUKU); + PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9); + ewram1B000.unk261 = 2; + taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11]; + taskData[14] = 1; + ewram1B000.unk27E = 1; + ewram1B000.unk280 = 1; + ewram1B000.unk282 = taskData[11]; + ewram1C000.unkC = -32768; + gTasks[taskId2].func = sub_806F8AC; + } + } +} + +void sub_80701DC(u8 taskId) +{ + if (ewram1B000.unk27E == 1) + { + AddBagItem(ewram1C000.unk6, 1); + if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0) + { + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3); + ewram1B000.unk261 = 2; + } + ewram1B000.unk27E = 0; + } + ewram1C000.unk5++; + if (ewram1C000.unk5 == 6) + { + gUnknown_0202E8F4 = 0; + if (ewram1B000.unk280 == 0) + { + gTasks[taskId].func = TaskDummy; + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + CreateTask(sub_806FB0C, 8); + } + else + { + RemoveBagItem(ewram1C000.unk6, 1); + gTasks[taskId].func = ewram1C000.unk10; + } + gLastFieldPokeMenuOpened = 0; + } + else + { + sub_8070088(taskId); + } +} + +void CreateItemUseMoveMenu(u8 partyMonIndex) +{ + u8 r6; + u8 i; + + r6 = 0; + Menu_DrawStdWindowFrame(19, 10, 29, 19); + for (i = 0; i < 4; i++) + { + u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i); + + Menu_PrintText(gMoveNames[move], 20, i * 2 + 11); + if (move != 0) + r6++; + } + InitMenu(0, 20, 11, r6, 0, 9); +} + +void Task_HandleItemUseMoveMenuInput(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + else if (gMain.newKeys & A_BUTTON) + { + gUnknown_08376B54[0](taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_08376B54[1](taskId); + } +} + +void DoPPRecoveryItemEffect(u8 taskId, u16 item, TaskFunc c) +{ + const u8 *itemEffect; + u8 taskId2; + + if (item == ITEM_ENIGMA_BERRY) + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + else + itemEffect = gItemEffectTable[item - ITEM_POTION]; + gTasks[taskId].func = TaskDummy; + taskId2 = CreateTask(TaskDummy, 5); + sub_806E8D0(taskId, item, c); + if (!(itemEffect[4] & 0x10)) + { + gTasks[taskId2].data[11] = 0; + DoRecoverPP(taskId2); + } + else + { + PlaySE(SE_SELECT); + PrintPartyMenuPromptText(10, 3); + CreateItemUseMoveMenu(ewram1C000.unk5); + gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput; + gMain.newKeys = 0; + } +} + +void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 10, 29, 19); + sub_806D5A4(); + gTasks[taskId].data[11] = Menu_GetCursorPos(); + DoRecoverPP(taskId); +} + +void ItemUseMoveMenu_HandleCancel(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 10, 29, 19); + if (gMain.inBattle) + gTasks[ewram1C000.unk4].func = HandleBattlePartyMenu; + else + gTasks[ewram1C000.unk4].func = sub_808B0C0; + PrintPartyMenuPromptText(3, 0); + DestroyTask(taskId); +} + +void DoRecoverPP(u8 taskId) +{ + u16 r5 = 0; + + if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11])) + { + gUnknown_0202E8F4 = r5; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + } + else + { + gUnknown_0202E8F4 = 1; + PlaySE(SE_KAIFUKU); + RemoveBagItem(ewram1C000.unk6, 1); + r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]); + StringCopy(gStringVar1, gMoveNames[r5]); + GetMedicineItemEffectMessage(ewram1C000.unk6); + sub_806E834(gStringVar4, 1); + } + gTasks[taskId].func = sub_806FB0C; +} + +void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) +{ + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, b, c); + PlaySE(SE_SELECT); + PrintPartyMenuPromptText(11, 3); + CreateItemUseMoveMenu(ewram1C000.unk5); + CreateTask(Task_HandleItemUseMoveMenuInput, 5); + gMain.newKeys = 0; +} + +static const u8 *const StatNames[] = +{ + gOtherText_HP, + gOtherText_Attack, + gOtherText_Defense, + gOtherText_SpAtk, + gOtherText_SpDef, + gOtherText_Speed, +}; + +static const u8 StatDataTypes[] = +{ + MON_DATA_MAX_HP, + MON_DATA_ATK, + MON_DATA_DEF, + MON_DATA_SPATK, + MON_DATA_SPDEF, + MON_DATA_SPEED, +}; + +#if DEBUG + +const u8 gUnknown_Debug_839B6CE[] = {0x40, 0, 0, 0, 0x44, 0, 0xFF, 0, 0, 0}; + +const u8 gUnknown_Debug_839B6D8[] = _( + "{STR_VAR_1}かい じっこう\n" + "{STR_VAR_2}たんいじかん しょうひ"); + +#endif + +void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) +{ + u8 i; + bool8 r0; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, b, c); + + if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100) + { + for (i = 0; i < 6; i++) + ewram1B000.statGrowths[i] = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); + r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0); + } + else + r0 = TRUE; + + if (r0) + { + gUnknown_0202E8F4 = 0; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + CreateTask(sub_806FB0C, 5); + } + else + { + u8 level; + + gUnknown_0202E8F4 = 1; + PlayFanfareByFanfareNum(0); + RedrawPokemonInfoInMenu(ewram1C000.unk5, ewram1C000.pokemon); + RemoveBagItem(b, 1); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL); + ConvertIntToDecimalStringN(gStringVar2, level, 0, 3); + StringExpandPlaceholders(gStringVar4, gOtherText_ElevatedTo); + sub_806E834(gStringVar4, 1); + CreateTask(Task_RareCandy1, 5); + } +} + +void Task_RareCandy1(u8 taskId) +{ + if (WaitFanfare(0) && gUnknown_0202E8F6 == 0) + { + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + PlaySE(SE_SELECT); + PrintStatGrowthsInLevelUpWindow(taskId); + gTasks[taskId].func = Task_RareCandy2; + } + } +} + +void Task_RareCandy2(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + PlaySE(SE_SELECT); + PrintNewStatsInLevelUpWindow(taskId); + gTasks[taskId].func = Task_RareCandy3; + } +} + +void PrintStatGrowthsInLevelUpWindow(u8 taskId) +{ + u8 i; + + Menu_DrawStdWindowFrame(11, 0, 29, 7); + + for (i = 0; i < NUM_STATS; i++) + { + u8 x; + u8 y; + u32 stat; +#if GERMAN + u8 *ptr; +#endif + + stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); + + ewram1B000.statGrowths[i + NUM_STATS] = stat; + ewram1B000.statGrowths[i] = stat - ewram1B000.statGrowths[i]; + + x = (i / 3) * 9 + 11; + y = ((i % 3) << 1) + 1; + +#if GERMAN + ptr = StringCopy(gStringVar1, StatNames[i]); + *ptr++ = EXT_CTRL_CODE_BEGIN; + *ptr++ = 0x13; + *ptr++ = 0x2E; + ptr = StringCopy(ptr, gOtherText_TallPlusAndRightArrow); + *ptr++ = EXT_CTRL_CODE_BEGIN; + *ptr++ = 0x13; + *ptr++ = 0x34; + ConvertIntToDecimalStringN(ptr, ewram1B000.statGrowths[i], 1, 2); + Menu_PrintText(gStringVar1, x + 1, y); +#else + Menu_PrintTextPixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); + if (i == 2) + Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); + else + Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); + gStringVar1[0] = EXT_CTRL_CODE_BEGIN; + gStringVar1[1] = 0x14; + gStringVar1[2] = 0x06; + ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[i], 1, 2); + Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); +#endif + } +} + +void PrintNewStatsInLevelUpWindow(u8 taskId) +{ + u8 i; + + for (i = 0; i < NUM_STATS; i++) + { + u8 x; + u8 y; + u32 stat; + u32 newStatIndex; + + stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); + newStatIndex = i + 6; + ewram1B000.statGrowths[newStatIndex] = stat; + + x = ((i / 3) * 9) + 11; + y = ((i % 3) << 1) + 1; + + gStringVar1[0] = EXT_CTRL_CODE_BEGIN; + gStringVar1[1] = 0x14; + gStringVar1[2] = 0x06; + + ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[newStatIndex], 1, 3); + Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0); + } +} + +void RedrawPokemonInfoInMenu(u8 monIndex, struct Pokemon *pokemon) +{ + u8 statusAndPkrs = GetMonStatusAndPokerus(pokemon); + u8 icon; + + if (statusAndPkrs == 0 || statusAndPkrs == 6) + PartyMenuUpdateLevelOrStatus(pokemon, monIndex); + + PartyMenuDoPrintHP(monIndex, IsDoubleBattle(), GetMonData(pokemon, MON_DATA_HP), GetMonData(pokemon, MON_DATA_MAX_HP)); + PartyMenuTryDrawHPBar(monIndex, pokemon); + + icon = GetMonIconSpriteId(ewram1C000.unk4, monIndex); + SetMonIconAnim(icon, pokemon); + + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + monIndex * 2], 7); + ewram1B000.unk261 = 2; +} + +void Task_RareCandy3(u8 taskId) +{ + if (WaitFanfare(0)) + { + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + u16 learnedMove; + u16 evolutionSpecies; + + Menu_EraseWindowRect(11, 0, 29, 7); + + learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, TRUE); + ewram1B000.unk282 = 1; + + switch (learnedMove) + { + case 0: + // No move is learned. + evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); + if (evolutionSpecies != 0) + { + gCB2_AfterEvolution = sub_80A53F8; + BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); + DestroyTask(taskId); + } + else + { + sub_8070D90(taskId); + } + break; + case 0xFFFF: + // Mon already knows 4 moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); + + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + + ewram1C000.unk8 = gMoveToLearn; + gTasks[taskId].func = sub_806F358; + break; + case 0xFFFE: + // Move was already known by the mon. + gTasks[taskId].func = TeachMonMoveInPartyMenu; + break; + default: + // Mon automatically learned a move because it knew less than four moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[learnedMove]); + + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); + + gTasks[taskId].func = Task_TeamMonTMMove3; + break; + } + } + } +} + +void TeachMonMoveInPartyMenu(u8 taskId) +{ + u16 learnedMove; + u16 evolutionSpecies; + + learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, FALSE); + switch (learnedMove) + { + case 0: + // No move is learned. + evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); + if (evolutionSpecies != 0) + { + gCB2_AfterEvolution = sub_80A53F8; + BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); + DestroyTask(taskId); + } + else + { + sub_8070D90(taskId); + } + break; + case 0xFFFF: + // Mon already knows 4 moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); + + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + + ewram1C000.unk8 = gMoveToLearn; + gTasks[taskId].func = sub_806F358; + break; + case 0xFFFE: + // Move was already known by the mon. Go on the the next move to be learned. + TeachMonMoveInPartyMenu(taskId); + break; + default: + // Mon automatically learned a move because it knew less than four moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[learnedMove]); + + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); + + gTasks[taskId].func = Task_TeamMonTMMove3; + break; + } +} + +static void sub_8070D90(u8 taskId) +{ + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); +} + +void DoEvolutionStoneItemEffect(u8 taskId, u16 evolutionStoneItem, TaskFunc c) +{ + PlaySE(SE_SELECT); + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, evolutionStoneItem, c); + + gCB2_AfterEvolution = sub_80A53F8; + + if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, evolutionStoneItem, 0)) + { + gUnknown_0202E8F4 = 0; + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + + CreateTask(sub_806FB0C, 5); + } + else + { + RemoveBagItem(evolutionStoneItem, 1); + } +} + +#ifdef NONMATCHING +u8 GetItemEffectType(u16 item) +{ + const u8 *itemEffect; + register u8 itemEffect0 asm("r1"); + u8 mask; + + // Read the item's effect properties. + if (item == ITEM_ENIGMA_BERRY) + { + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + } + else + { + itemEffect = gItemEffectTable[item - ITEM_POTION]; + } + + itemEffect0 = itemEffect[0]; + mask = 0x3F; + + if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & 0x80)) + { + return 0; + } + else if (itemEffect0 & 0x40) + { + return 10; + } + else if (itemEffect[3] & 0x40) + { + return 1; + } + else if ((itemEffect[3] & mask) || (itemEffect0 >> 7)) + { + if ((itemEffect[3] & mask) == 0x20) + { + return 4; + } + else if ((itemEffect[3] & mask) == 0x10) + { + return 3; + } + else if ((itemEffect[3] & mask) == 0x8) + { + return 5; + } + else if ((itemEffect[3] & mask) == 0x4) + { + return 6; + } + else if ((itemEffect[3] & mask) == 0x2) + { + return 7; + } + else if ((itemEffect[3] & mask) == 0x1) + { + return 8; + } + else if ((itemEffect0 >> 7) != 0 && (itemEffect[3] & mask) == 0) + { + return 9; + } + else + { + return 11; + } + } + else if (itemEffect[4] & 0x44) + { + return 2; + } + else if (itemEffect[4] & 0x2) + { + return 12; + } + else if (itemEffect[4] & 0x1) + { + return 13; + } + else if (itemEffect[5] & 0x8) + { + return 14; + } + else if (itemEffect[5] & 0x4) + { + return 15; + } + else if (itemEffect[5] & 0x2) + { + return 16; + } + else if (itemEffect[5] & 0x1) + { + return 17; + } + else if (itemEffect[4] & 0x80) + { + return 18; + } + else if (itemEffect[4] & 0x20) + { + return 19; + } + else if (itemEffect[5] & 0x10) + { + return 20; + } + else if (itemEffect[4] & 0x18) + { + return 21; + } + else + { + return 22; + } +} +#else +__attribute__((naked)) +u8 GetItemEffectType(u16 item) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0xAF\n\ + bne _08070E5C\n\ + ldr r4, _08070E58 @ =gSaveBlock1 + 0x3676\n\ + b _08070E66\n\ + .align 2, 0\n\ +_08070E58: .4byte gSaveBlock1 + 0x3676\n\ +_08070E5C:\n\ + ldr r1, _08070E8C @ =gItemEffectTable\n\ + subs r0, 0xD\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r4, [r0]\n\ +_08070E66:\n\ + ldrb r1, [r4]\n\ + movs r5, 0x3F\n\ + adds r0, r5, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08070E88\n\ + ldrb r0, [r4, 0x1]\n\ + cmp r0, 0\n\ + bne _08070E88\n\ + ldrb r0, [r4, 0x2]\n\ + cmp r0, 0\n\ + bne _08070E88\n\ + ldrb r3, [r4, 0x3]\n\ + movs r0, 0x80\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08070E90\n\ +_08070E88:\n\ + movs r0, 0\n\ + b _08070F8A\n\ + .align 2, 0\n\ +_08070E8C: .4byte gItemEffectTable\n\ +_08070E90:\n\ + movs r2, 0x40\n\ + adds r0, r2, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070E9E\n\ + movs r0, 0xA\n\ + b _08070F8A\n\ +_08070E9E:\n\ + adds r0, r2, 0\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08070EAA\n\ + movs r0, 0x1\n\ + b _08070F8A\n\ +_08070EAA:\n\ + adds r2, r5, 0\n\ + ands r2, r3\n\ + cmp r2, 0\n\ + bne _08070EB8\n\ + lsrs r0, r1, 7\n\ + cmp r0, 0\n\ + beq _08070EFA\n\ +_08070EB8:\n\ + cmp r2, 0x20\n\ + bne _08070EC0\n\ + movs r0, 0x4\n\ + b _08070F8A\n\ +_08070EC0:\n\ + cmp r2, 0x10\n\ + bne _08070EC8\n\ + movs r0, 0x3\n\ + b _08070F8A\n\ +_08070EC8:\n\ + cmp r2, 0x8\n\ + bne _08070ED0\n\ + movs r0, 0x5\n\ + b _08070F8A\n\ +_08070ED0:\n\ + cmp r2, 0x4\n\ + bne _08070ED8\n\ + movs r0, 0x6\n\ + b _08070F8A\n\ +_08070ED8:\n\ + cmp r2, 0x2\n\ + bne _08070EE0\n\ + movs r0, 0x7\n\ + b _08070F8A\n\ +_08070EE0:\n\ + cmp r2, 0x1\n\ + bne _08070EE8\n\ + movs r0, 0x8\n\ + b _08070F8A\n\ +_08070EE8:\n\ + lsrs r0, r1, 7\n\ + cmp r0, 0\n\ + beq _08070EF6\n\ + cmp r2, 0\n\ + bne _08070EF6\n\ + movs r0, 0x9\n\ + b _08070F8A\n\ +_08070EF6:\n\ + movs r0, 0xB\n\ + b _08070F8A\n\ +_08070EFA:\n\ + ldrb r1, [r4, 0x4]\n\ + movs r0, 0x44\n\ + ands r0, r1\n\ + adds r2, r1, 0\n\ + cmp r0, 0\n\ + beq _08070F0A\n\ + movs r0, 0x2\n\ + b _08070F8A\n\ +_08070F0A:\n\ + movs r5, 0x2\n\ + adds r0, r5, 0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08070F18\n\ + movs r0, 0xC\n\ + b _08070F8A\n\ +_08070F18:\n\ + movs r3, 0x1\n\ + adds r0, r3, 0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08070F26\n\ + movs r0, 0xD\n\ + b _08070F8A\n\ +_08070F26:\n\ + ldrb r1, [r4, 0x5]\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F34\n\ + movs r0, 0xE\n\ + b _08070F8A\n\ +_08070F34:\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F40\n\ + movs r0, 0xF\n\ + b _08070F8A\n\ +_08070F40:\n\ + adds r0, r5, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F4C\n\ + movs r0, 0x10\n\ + b _08070F8A\n\ +_08070F4C:\n\ + adds r0, r3, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F58\n\ + movs r0, 0x11\n\ + b _08070F8A\n\ +_08070F58:\n\ + movs r0, 0x80\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08070F64\n\ + movs r0, 0x12\n\ + b _08070F8A\n\ +_08070F64:\n\ + movs r0, 0x20\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08070F70\n\ + movs r0, 0x13\n\ + b _08070F8A\n\ +_08070F70:\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F7C\n\ + movs r0, 0x14\n\ + b _08070F8A\n\ +_08070F7C:\n\ + movs r0, 0x18\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _08070F88\n\ + movs r0, 0x16\n\ + b _08070F8A\n\ +_08070F88:\n\ + movs r0, 0x15\n\ +_08070F8A:\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + + +// Maybe this goes in start_menu.c +#if !DEBUG +void unref_sub_8070F90(void) +{ + FlagSet(FLAG_SYS_POKEDEX_GET); + FlagSet(FLAG_SYS_POKEMON_GET); + FlagSet(FLAG_SYS_POKENAV_GET); +} +#endif diff --git a/src/pc_screen_effect.c b/src/pc_screen_effect.c new file mode 100644 index 000000000..dcc3bc9c9 --- /dev/null +++ b/src/pc_screen_effect.c @@ -0,0 +1,117 @@ +#include "global.h" +#include "main.h" +#include "palette.h" +#include "sprite.h" +#include "pc_screen_effect.h" + +void sub_80C603C(void); +void sub_80C6078(void); +void sub_80C60CC(struct Sprite *); +void sub_80C6130(struct Sprite *); +void sub_80C61B0(IntrFunc); +void ClearGpuRegBits(void); + +extern const struct OamData gOamData_83D18D8; + +extern const union AnimCmd *const gSpriteAnimTable_83D18E8[]; + +extern const u16 gUnknownPal_083D18EC[16]; + +extern const u8 gUnknownGfx_083D190C[128]; + +EWRAM_DATA struct PCScreenEffectStruct *gUnknown_020387EC = NULL; + +const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 }; + +const struct SpritePalette gUnknown_083D18A0 = { gUnknownPal_083D18EC, 0 }; + +const struct SpriteTemplate gSpriteTemplate_83D18A8 = +{ + 0, + 0, + &gOamData_83D18D8, + gSpriteAnimTable_83D18E8, + NULL, + gDummySpriteAffineAnimTable, + sub_80C60CC, +}; + +const struct SpriteTemplate gSpriteTemplate_83D18C0 = +{ + 0, + 0, + &gOamData_83D18D8, + gSpriteAnimTable_83D18E8, + NULL, + gDummySpriteAffineAnimTable, + sub_80C6130, +}; + +void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct) +{ + u16 i; + + struct SpriteSheet sprSheet = gUnknown_083D1898; + struct SpritePalette sprPalette = gUnknown_083D18A0; + struct SpriteTemplate sprTemplate = gSpriteTemplate_83D18A8; + + sprSheet.tag = unkStruct->tileTag; + sprTemplate.tileTag = unkStruct->tileTag; + sprPalette.tag = unkStruct->paletteTag; + sprTemplate.paletteTag = unkStruct->paletteTag; + + LoadSpriteSheet(&sprSheet); + LoadSpritePalette(&sprPalette); + + unkStruct->unk0C = 1; + unkStruct->unk0A = 0; + unkStruct->unk08 = 0; + unkStruct->selectedPalettes = ~(0x10000 << IndexOfSpritePaletteTag(unkStruct->paletteTag)) & 0xFFFF0000; + + if (unkStruct->unk04 == 0) + unkStruct->unk04 = 16; + + if (unkStruct->unk06 == 0) + unkStruct->unk06 = 20; + + gUnknown_020387EC = unkStruct; + + for (i = 0; i < 8; i++) + { + u8 spriteId = CreateSprite(&sprTemplate, 32 * i + 8, 80, 0); + if (spriteId == MAX_SPRITES) + break; + gSprites[spriteId].data[0] = (i < 4) ? -unkStruct->unk04 : unkStruct->unk04; + } + + REG_BLDCNT = 191; + REG_BLDY = 16; +} + +bool8 sub_80C5DCC(void) +{ + if (gUnknown_020387EC->unk08 == 0) + { + BlendPalettes(gUnknown_020387EC->selectedPalettes, 0x10, 0xFFFF); + sub_80C61B0(sub_80C603C); + gUnknown_020387EC->unk08++; + } + + if (gUnknown_020387EC->unk0A < 8) + return FALSE; + + gUnknown_020387EC->unk0C += gUnknown_020387EC->unk06; + + if (gUnknown_020387EC->unk0C >= 80) + { + gUnknown_020387EC->unk0C = 80; + REG_BLDCNT = 0; + REG_BLDY = 0; + ClearGpuRegBits(); + return TRUE; + } + else + { + return FALSE; + } +} diff --git a/src/play_time.c b/src/play_time.c new file mode 100644 index 000000000..9882c9c4b --- /dev/null +++ b/src/play_time.c @@ -0,0 +1,73 @@ +#include "global.h" +#include "play_time.h" + +enum +{ + STOPPED, + RUNNING, + MAXED_OUT +}; + +static u8 sPlayTimeCounterState; + +void PlayTimeCounter_Reset() +{ + sPlayTimeCounterState = STOPPED; + + gSaveBlock2.playTimeHours = 0; + gSaveBlock2.playTimeMinutes = 0; + gSaveBlock2.playTimeSeconds = 0; + gSaveBlock2.playTimeVBlanks = 0; +} + +void PlayTimeCounter_Start() +{ + sPlayTimeCounterState = RUNNING; + + if (gSaveBlock2.playTimeHours > 999) + PlayTimeCounter_SetToMax(); +} + +void PlayTimeCounter_Stop() +{ + sPlayTimeCounterState = STOPPED; +} + +void PlayTimeCounter_Update() +{ + if (sPlayTimeCounterState == RUNNING) + { + gSaveBlock2.playTimeVBlanks++; + + if (gSaveBlock2.playTimeVBlanks > 59) + { + gSaveBlock2.playTimeVBlanks = 0; + gSaveBlock2.playTimeSeconds++; + + if (gSaveBlock2.playTimeSeconds > 59) + { + gSaveBlock2.playTimeSeconds = 0; + gSaveBlock2.playTimeMinutes++; + + if (gSaveBlock2.playTimeMinutes > 59) + { + gSaveBlock2.playTimeMinutes = 0; + gSaveBlock2.playTimeHours++; + + if (gSaveBlock2.playTimeHours > 999) + PlayTimeCounter_SetToMax(); + } + } + } + } +} + +void PlayTimeCounter_SetToMax() +{ + sPlayTimeCounterState = MAXED_OUT; + + gSaveBlock2.playTimeHours = 999; + gSaveBlock2.playTimeMinutes = 59; + gSaveBlock2.playTimeSeconds = 59; + gSaveBlock2.playTimeVBlanks = 59; +} diff --git a/src/player_pc.c b/src/player_pc.c new file mode 100644 index 000000000..27427ecaa --- /dev/null +++ b/src/player_pc.c @@ -0,0 +1,1337 @@ +#include "global.h" +#include "player_pc.h" +#include "decoration.h" +#include "field_fadetransition.h" +#include "field_weather.h" +#include "item.h" +#include "item_menu.h" +#include "constants/items.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "palette.h" +#include "script.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "constants/songs.h" +#include "name_string_util.h" +#include "mail.h" +#include "overworld.h" +#include "player_pc.h" +#include "ewram.h" + +extern void DisplayItemMessageOnField(u8, const u8*, TaskFunc, u16); +extern void DoPlayerPCDecoration(u8); +extern void BuyMenuFreeMemory(void); +extern void DestroyVerticalScrollIndicator(u8); +extern void PauseVerticalScrollIndicator(u8); +extern void LoadScrollIndicatorPalette(void); +extern void ClearMailStruct(struct MailStruct *); +extern u8 IsWeatherNotFadingIn(void); +extern void sub_808B020(void); +extern void ClearVerticalScrollIndicatorPalettes(void); + +static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL; + +static u8 gPcItemMenuOptionsNum; + +extern u8 gUnknown_02038561; + +// event scripts +extern u8 gBrendanHouse_TurnPCOff[]; +extern u8 gMayHouse_TurnPCOff[]; + +extern void (*gFieldCallback)(void); + +static void InitPlayerPCMenu(u8 taskId); +static void PlayerPCProcessMenuInput(u8 taskId); +static void InitItemStorageMenu(u8); +static void ItemStorageMenuPrint(const u8 *); +static void ItemStorageMenuProcessInput(u8); +static void ItemStorage_ProcessInput(u8); +static void ItemStorage_SetItemAndMailCount(u8); +static void ItemStorage_DoItemAction(u8); +static void ItemStorage_GoBackToPlayerPCMenu(u8); +static void ItemStorage_HandleQuantityRolling(u8); +static void ItemStorage_DoItemWithdraw(u8); +static void ItemStorage_DoItemToss(u8); +static void ItemStorage_HandleRemoveItem(u8); +static void ItemStorage_WaitPressHandleResumeProcessInput(u8); +static void ItemStorage_HandleResumeProcessInput(u8); +static void ItemStorage_DoItemSwap(u8, bool8); +static void ItemStorage_DrawItemList(u8); +static void ItemStorage_PrintItemPcResponse(u16); +static void ItemStorage_DrawBothListAndDescription(u8); +static void ItemStorage_GoBackToItemPCMenu(u8, u8); +static void ItemStorage_LoadPalette(void); +static u8 GetMailboxMailCount(void); +static void Mailbox_UpdateMailList(void); +static void Mailbox_DrawMailboxMenu(u8); +static void Mailbox_ProcessInput(u8); +static void Mailbox_CloseScrollIndicators(void); +static void Mailbox_PrintWhatToDoWithPlayerMailText(u8); +static void Mailbox_TurnOff(u8); +static void Mailbox_PrintMailOptions(u8); +static void Mailbox_MailOptionsProcessInput(u8); +static void Mailbox_FadeAndReadMail(u8); +static void Mailbox_ReturnToFieldFromReadMail(void); +static void Mailbox_DrawYesNoBeforeMove(u8); +static void Mailbox_DoGiveMailPokeMenu(u8); +static void Mailbox_NoPokemonForMail(u8); +static void Mailbox_Cancel(u8); +static void Mailbox_DrawMailMenuAndDoProcessInput(u8); +static void PlayerPC_ItemStorage(u8 taskId); +static void PlayerPC_Mailbox(u8 taskId); +static void PlayerPC_Decoration(u8 var); +static void PlayerPC_TurnOff(u8 taskId); +static void ItemStorage_Withdraw(u8); +static void ItemStorage_Deposit(u8); +static void ItemStorage_Toss(u8); +static void ItemStorage_Exit(u8); +static void ItemStorage_ResumeInputFromYesToss(u8); +static void ItemStorage_ResumeInputFromNoToss(u8); +static void Mailbox_DoMailMoveToBag(u8); +static void Mailbox_ReturnToInputAfterNo(u8); +static void Mailbox_DoMailRead(u8); +static void Mailbox_MoveToBag(u8); +static void Mailbox_Give(u8); +static void Mailbox_Cancel(u8); + +static const u8 *const gPCText_OptionDescList[] = +{ + PCText_TakeOutItems, + PCText_StoreItems, + PCText_ThrowAwayItems, + gMenuText_GoBackToPrev +}; + +static const struct MenuAction2 sPlayerPCMenuActions[] = +{ + { SecretBaseText_ItemStorage, PlayerPC_ItemStorage }, + { gPCText_Mailbox, PlayerPC_Mailbox }, + { SecretBaseText_Decoration, PlayerPC_Decoration }, + { SecretBaseText_TurnOff, PlayerPC_TurnOff } +}; + +static const u8 gBedroomPC_OptionOrder[] = +{ + PLAYERPC_MENU_ITEMSTORAGE, + PLAYERPC_MENU_MAILBOX, + PLAYERPC_MENU_DECORATION, + PLAYERPC_MENU_TURNOFF +}; + +static const u8 gPlayerPC_OptionOrder[] = +{ + PLAYERPC_MENU_ITEMSTORAGE, + PLAYERPC_MENU_MAILBOX, + PLAYERPC_MENU_TURNOFF +}; + +static const struct MenuAction2 gPCText_ItemPCOptionsText[] = +{ + { PCText_WithdrawItem, ItemStorage_Withdraw }, + { PCText_DepositItem, ItemStorage_Deposit }, + { PCText_TossItem, ItemStorage_Toss }, + { gUnknownText_Exit, ItemStorage_Exit } +}; + +static const struct YesNoFuncTable ResumeFromTossYesNoFuncList[] = // ResumeFromTossYesNoFuncList +{ + ItemStorage_ResumeInputFromYesToss, + ItemStorage_ResumeInputFromNoToss +}; + +static const struct YesNoFuncTable ResumeFromWithdrawYesNoFuncList[] = // ResumeFromWithdrawYesNoFuncList +{ + Mailbox_DoMailMoveToBag, + Mailbox_ReturnToInputAfterNo +}; + +// the use of this struct is meant to be an ItemSlot struct, but NewGameInitPCItems refuses to match without a weird pointer access. +static const struct ItemSlot gNewGamePCItems[] = +{ + { ITEM_POTION, 1 }, + { ITEM_NONE, 0 } +}; + +static const struct MenuAction2 gMailboxMailOptions[] = +{ + { OtherText_Read, Mailbox_DoMailRead }, + { gOtherText_MoveToBag, Mailbox_MoveToBag }, + { OtherText_Give, Mailbox_Give }, + { gOtherText_CancelNoTerminator, Mailbox_Cancel } +}; + +static const u8 gNonSelectedItemFormattedText[] = _("{STR_VAR_1}{CLEAR_TO 80}"); +static const u8 gSelectedItemFormattedText[] = _("{COLOR RED}{STR_VAR_1}{CLEAR_TO 80}"); +static const u8 gNonSelectedItemQuantityFormatText[] = _("{STR_VAR_1}"); +static const u8 gSelectedItemQuantityFormatText[] = _("{COLOR RED}{STR_VAR_1}"); +static const u8 gUnknown_08406330[] = _("{CLEAR_TO 32}"); + +extern u8 *gUnknown_02039314; +extern struct MenuAction gUnknown_08406298[]; + +extern u8 gUnknown_084062B8[]; +extern u8 gUnknown_084062BC[]; +extern u8 gUnknown_0840632A[]; +extern u8 gUnknown_08406327[]; +extern u8 gUnknown_0840631E[]; +extern u8 gUnknown_08406318[]; + +extern u8 gUnknown_030007B4; +extern u8 unk_201FE00[]; + +extern u8 gUnknown_08152850; +extern u8 gUnknown_08152C75; + +extern u32 gUnknown_08406288[]; +extern const struct MenuAction gUnknown_084062C0[]; +extern const struct YesNoFuncTable gUnknown_084062E0; + +void NewGameInitPCItems(void) +{ + u8 i; + + // because Game Freak don't know how to use a struct or a 2d array + for(i = 0, ClearItemSlots(gSaveBlock1.pcItems, ARRAY_COUNT(gSaveBlock1.pcItems)); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) && + AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++) + ; +} + +void BedroomPC(void) +{ + gPcItemMenuOptionOrder = gBedroomPC_OptionOrder; + gPcItemMenuOptionsNum = 4; + DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); +} + +void PlayerPC(void) +{ + gPcItemMenuOptionOrder = gPlayerPC_OptionOrder; + gPcItemMenuOptionsNum = 3; + DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); +} + +static void InitPlayerPCMenu(u8 taskId) +{ + Menu_DrawStdWindowFrame(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1); + Menu_PrintItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder); + InitMenu(0, 1, 1, gPcItemMenuOptionsNum, 0, 9); + TASK.FUNC = PlayerPCProcessMenuInput; +} + +static void PlayerPCProcessMenuInput(u8 taskId) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + else if (gMain.newKeys & A_BUTTON) + { + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + sPlayerPCMenuActions[gPcItemMenuOptionOrder[Menu_GetCursorPos()]].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + sPlayerPCMenuActions[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT. + } +} + +void ReshowPlayerPC(u8 var) +{ + DisplayItemMessageOnField(var, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); +} + +static void PlayerPC_ItemStorage(u8 taskId) +{ + InitItemStorageMenu(ITEMPC_MENU_WITHDRAW); + TASK.FUNC = ItemStorageMenuProcessInput; +} + +static void PlayerPC_Mailbox(u8 taskId) +{ + Menu_EraseWindowRect(0, 0, 10, 9); + eMailboxInfo.count = GetMailboxMailCount(); + + if (eMailboxInfo.count == 0) + DisplayItemMessageOnField(taskId, gOtherText_NoMailHere, ReshowPlayerPC, 0); + else + { + eMailboxInfo.cursorPos = 0; + eMailboxInfo.itemsAbove = 0; + Mailbox_UpdateMailList(); + ItemStorage_SetItemAndMailCount(taskId); + Mailbox_DrawMailboxMenu(taskId); + TASK.FUNC = Mailbox_ProcessInput; + } +} + +static void PlayerPC_Decoration(u8 var) +{ + Menu_EraseWindowRect(0, 0, 10, 9); + DoPlayerPCDecoration(var); +} + +static void PlayerPC_TurnOff(u8 taskId) +{ + if (gPcItemMenuOptionsNum == 4) // if the option count is 4, we are at the bedroom PC and not player PC, so do gender specific handling. + { + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); + + if (gSaveBlock2.playerGender == MALE) + ScriptContext1_SetupScript(gBrendanHouse_TurnPCOff); + else + ScriptContext1_SetupScript(gMayHouse_TurnPCOff); + } + else + { + Menu_EraseWindowRect(0, 0, 10, 9); + EnableBothScriptContexts(); + } + DestroyTask(taskId); +} + +static void InitItemStorageMenu(u8 var) +{ + Menu_EraseWindowRect(0, 0, 10, 9); + Menu_DrawStdWindowFrame(0, 0, 11, 9); + Menu_PrintItems(1, 1, 4, (struct MenuAction *)gPCText_ItemPCOptionsText); + InitMenu(0, 1, 1, 4, var, 10); + ItemStorageMenuPrint(gPCText_OptionDescList[var]); +} + +static void ItemStorageMenuPrint(const u8 *textPtr) +{ + Menu_BlankWindowRect(2, 15, 27, 18); + Menu_PrintText(textPtr, 2, 15); +} + +static void ItemStorageMenuProcessInput(u8 var) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gPCText_ItemPCOptionsText[Menu_GetCursorPos()].func(var); + } + else if (gMain.newKeys & B_BUTTON) + { + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + gPCText_ItemPCOptionsText[ITEMPC_MENU_EXIT].func(var); + } +} + +static void Task_ItemStorage_Deposit(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_80A6A30(); + DestroyTask(taskId); + } +} + +static void ItemStorage_Deposit(u8 taskId) +{ + TASK.FUNC = Task_ItemStorage_Deposit; + FadeScreen(1, 0); +} + +static void ItemStorage_HandleReturnToProcessInput(u8 taskId) +{ + if (IsWeatherNotFadingIn() == TRUE) + TASK.FUNC = ItemStorageMenuProcessInput; +} + +void ItemStorage_ReturnToMenuAfterDeposit(void) +{ + Menu_DisplayDialogueFrame(); + InitItemStorageMenu(ITEMPC_MENU_DEPOSIT); + CreateTask(ItemStorage_HandleReturnToProcessInput, 0); + pal_fill_black(); +} + +static void ItemStorage_Withdraw(u8 taskId) +{ + s16 *data = TASK.data; + + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); + NUM_ITEMS = CountUsedPCItemSlots(); + + if (NUM_ITEMS != 0) + { + Menu_EraseWindowRect(0, 14, 29, 19); + CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_WITHDRAW; + PAGE_INDEX = 0; + ITEMS_ABOVE_TOP = 0; + ItemStorage_SetItemAndMailCount(taskId); + ItemStorage_GoBackToItemPCMenu(taskId, 0); + TASK.FUNC = ItemStorage_ProcessInput; + } + else + DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0); +} + +static void ItemStorage_Toss(u8 taskId) +{ + s16 *data = TASK.data; + + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); + NUM_ITEMS = CountUsedPCItemSlots(); + + if (NUM_ITEMS) + { + Menu_EraseWindowRect(0, 14, 29, 19); + CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_TOSS; + PAGE_INDEX = 0; + ITEMS_ABOVE_TOP = 0; + ItemStorage_SetItemAndMailCount(taskId); + ItemStorage_GoBackToItemPCMenu(taskId, 2); + TASK.FUNC = ItemStorage_ProcessInput; + } + else + DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0); +} + +static void ItemStorage_Exit(u8 var) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); + ReshowPlayerPC(var); +} + +static void ItemStorage_SetItemAndMailCount(u8 taskId) +{ + s16 *data = TASK.data; + + if (NUM_ITEMS > 7) // we have a full page, so set the num of page items appropriately. + NUM_PAGE_ITEMS = 8; + else + NUM_PAGE_ITEMS = NUM_ITEMS + 1; // there are not enough items to fill a full page; take the # of items and add 1 for the cancel button. + + if (eMailboxInfo.count > 7) + eMailboxInfo.pageItems = 8; + else + eMailboxInfo.pageItems = eMailboxInfo.count + 1; +} + +static void ItemStorage_ProcessInput(u8 taskId) +{ + s16 *data = TASK.data; + s16 trueIndex; + + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if(PAGE_INDEX != 0) // did the cursor move physically upwards? + { + PlaySE(SE_SELECT); + PAGE_INDEX = Menu_MoveCursor(-1); + trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; + if (SWITCH_MODE_ACTIVE == FALSE) // are we not currently switching items? + { + if (trueIndex == NUM_ITEMS) // if the cursor is on top of cancel, print the go back to prev description. + { + ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); + } + else + { + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); + } + } + } + else // the page cursor is at the top. but we may not be at the top of the true index list, so do another check. + { + if (ITEMS_ABOVE_TOP == 0) // did the cursor not move due to being at the top of the list? + return; + + PlaySE(SE_SELECT); + ITEMS_ABOVE_TOP--; + ItemStorage_DrawBothListAndDescription(taskId); + + if (SWITCH_MODE_ACTIVE != FALSE) + Menu_MoveCursor(0); // don't move the cursor. it's at the top of the page index, but not the true index. + } + } + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _0813A306 + { + if(PAGE_INDEX != NUM_PAGE_ITEMS - 1) + { + PlaySE(SE_SELECT); + PAGE_INDEX = Menu_MoveCursor(1); + trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; + + if(SWITCH_MODE_ACTIVE != FALSE) + return; + + if (trueIndex == NUM_ITEMS) + ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); // probably further down + else + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); + } + else if(ITEMS_ABOVE_TOP + PAGE_INDEX != NUM_ITEMS) + { + PlaySE(SE_SELECT); + ITEMS_ABOVE_TOP++; + ItemStorage_DrawBothListAndDescription(taskId); + + if (SWITCH_MODE_ACTIVE != FALSE) + Menu_MoveCursor(0); + } + } + else if(gMain.newKeys & SELECT_BUTTON) // _0813A3A0 + { + if (SWITCH_MODE_ACTIVE == FALSE) + { + if (PAGE_INDEX + ITEMS_ABOVE_TOP != NUM_ITEMS) // you cannot swap the Cancel button. + { + PlaySE(SE_SELECT); + SWITCH_MODE_ACTIVE = TRUE; + SWAP_ITEM_INDEX = ITEMS_ABOVE_TOP + PAGE_INDEX; + ItemStorage_PrintItemPcResponse(ITEMPC_SWITCH_WHICH_ITEM); + } + // _0813A3DC + ItemStorage_DrawItemList(taskId); + } + else // _0813A3E8 + { + PlaySE(SE_SELECT); + ItemStorage_DoItemSwap(taskId, FALSE); + ItemStorage_DrawBothListAndDescription(taskId); + } + } + else if(gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if(SWITCH_MODE_ACTIVE == FALSE) + { + if(ITEMS_ABOVE_TOP + PAGE_INDEX != NUM_ITEMS) + { + ItemStorage_DoItemAction(taskId); + } + else + { + ItemStorage_GoBackToPlayerPCMenu(taskId); + } + } + else + { + ItemStorage_DoItemSwap(taskId, FALSE); + ItemStorage_DrawBothListAndDescription(taskId); + } + } + else if(gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + if(SWITCH_MODE_ACTIVE == FALSE) + { + Menu_DestroyCursor(); + ItemStorage_GoBackToPlayerPCMenu(taskId); + } + else + { + ItemStorage_DoItemSwap(taskId, TRUE); + ItemStorage_DrawBothListAndDescription(taskId); + } + } +} + +static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) +{ + BuyMenuFreeMemory(); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + Menu_EraseWindowRect(0, 0, 29, 19); + Menu_DisplayDialogueFrame(); + InitItemStorageMenu(TASK.CURRENT_ITEM_STORAGE_MENU); + TASK.FUNC = ItemStorageMenuProcessInput; +} + +static void ItemStorage_DoItemAction(u8 taskId) +{ + s16 *data = TASK.data; + u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; + + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + + if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) + { + if(gSaveBlock1.pcItems[trueIndex].quantity == 1) + { + NUM_QUANTITY_ROLLER = 1; + ItemStorage_DoItemWithdraw(taskId); + return; + } + else // _0813A50C + { + ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_WITHDRAW); + } + } + else if(gSaveBlock1.pcItems[trueIndex].quantity == 1) // _0813A518 + { + NUM_QUANTITY_ROLLER = 1; + ItemStorage_DoItemToss(taskId); + return; + } + else + { + ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS); + } + NUM_QUANTITY_ROLLER = 1; + Menu_DrawStdWindowFrame(6, 8, 13, 11); + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); + TASK.FUNC = ItemStorage_HandleQuantityRolling; +} + +static void ItemStorage_HandleQuantityRolling(u8 taskId) +{ + s16 *data = TASK.data; + u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; + + if(gMain.newAndRepeatedKeys & DPAD_UP) + { + if(NUM_QUANTITY_ROLLER != gSaveBlock1.pcItems[trueIndex].quantity) + NUM_QUANTITY_ROLLER++; + else + NUM_QUANTITY_ROLLER = 1; // you are at the max amount of items you have when you press Up, set your quantity back to 1. + + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? + } + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if(NUM_QUANTITY_ROLLER != 1) + NUM_QUANTITY_ROLLER--; + else + NUM_QUANTITY_ROLLER = gSaveBlock1.pcItems[trueIndex].quantity; // you are at 0 when you press down, set your quantity to the amount you have. + + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? + } + else if(gMain.newAndRepeatedKeys & DPAD_LEFT) // reduce by 10. + { + NUM_QUANTITY_ROLLER -= 10; + + if(NUM_QUANTITY_ROLLER <= 0) + NUM_QUANTITY_ROLLER = 1; // dont underflow or allow 0! + + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? + } + else if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // add 10. + { + NUM_QUANTITY_ROLLER += 10; + + if(NUM_QUANTITY_ROLLER > gSaveBlock1.pcItems[trueIndex].quantity) + NUM_QUANTITY_ROLLER = gSaveBlock1.pcItems[trueIndex].quantity; // dont overflow! + + sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); // print quantity? + } + else if(gMain.newKeys & A_BUTTON) // confirm quantity. + { + PlaySE(SE_SELECT); + Menu_EraseWindowRect(6, 6, 0xD, 0xB); + + if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) + ItemStorage_DoItemWithdraw(taskId); + else + ItemStorage_DoItemToss(taskId); + } + else if(gMain.newKeys & B_BUTTON) // cancel quantity. + { + PlaySE(SE_SELECT); + Menu_EraseWindowRect(6, 6, 0xD, 0xB); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); // why not use trueIndex? + TASK.FUNC = ItemStorage_ProcessInput; + } +} + +static void ItemStorage_DoItemWithdraw(u8 taskId) +{ + s16 *data = TASK.data; + u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; + + if(AddBagItem(gSaveBlock1.pcItems[trueIndex].itemId, NUM_QUANTITY_ROLLER) == TRUE) // add item works. + { + CopyItemName(gSaveBlock1.pcItems[trueIndex].itemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, NUM_QUANTITY_ROLLER, 0, 3); + ItemStorage_PrintItemPcResponse(ITEMPC_WITHDREW_THING); + TASK.FUNC = ItemStorage_HandleRemoveItem; + } + else + { + NUM_QUANTITY_ROLLER = 0; + ItemStorage_PrintItemPcResponse(ITEMPC_NO_MORE_ROOM); + TASK.FUNC = ItemStorage_WaitPressHandleResumeProcessInput; + } +} + +static void ItemStorage_DoItemToss(u8 taskId) +{ + s16 *data = TASK.data; + u8 var = PAGE_INDEX + ITEMS_ABOVE_TOP; + + if(ItemId_GetImportance(gSaveBlock1.pcItems[var].itemId) == FALSE) + { + CopyItemName(gSaveBlock1.pcItems[var].itemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, NUM_QUANTITY_ROLLER, 0, 3); + ItemStorage_PrintItemPcResponse(ITEMPC_OKAY_TO_THROW_AWAY); + DisplayYesNoMenu(7, 6, 1); + DoYesNoFuncWithChoice(taskId, (struct YesNoFuncTable *)&ResumeFromTossYesNoFuncList); + } + else + { + NUM_QUANTITY_ROLLER = 0; + ItemStorage_PrintItemPcResponse(ITEMPC_TOO_IMPORTANT); + TASK.FUNC = ItemStorage_HandleRemoveItem; + } +} + +static void ItemStorage_ResumeInputFromYesToss(u8 taskId) +{ + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); + ItemStorage_PrintItemPcResponse(ITEMPC_THREW_AWAY_ITEM); + TASK.FUNC = ItemStorage_HandleRemoveItem; +} + +static void ItemStorage_ResumeInputFromNoToss(u8 taskId) +{ + s16 *data = TASK.data; + + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); + InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); + TASK.FUNC = ItemStorage_ProcessInput; +} + +static void ItemStorage_HandleRemoveItem(u8 taskId) +{ + s16 *data = TASK.data; + s16 oldNumItems; + + if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) + { + RemovePCItem(PAGE_INDEX + ITEMS_ABOVE_TOP, NUM_QUANTITY_ROLLER); + oldNumItems = NUM_ITEMS; + NUM_ITEMS = CountUsedPCItemSlots(); + + if(oldNumItems != NUM_ITEMS && oldNumItems < NUM_PAGE_ITEMS + ITEMS_ABOVE_TOP && ITEMS_ABOVE_TOP != 0) + ITEMS_ABOVE_TOP--; + + ItemStorage_SetItemAndMailCount(taskId); + ItemStorage_HandleResumeProcessInput(taskId); + InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); + } +} + +static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId) +{ + s16 *data = TASK.data; + + if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) + { + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + TASK.FUNC = ItemStorage_ProcessInput; + } +} + +static void ItemStorage_HandleResumeProcessInput(u8 taskId) +{ + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + ItemStorage_DrawBothListAndDescription(taskId); + TASK.FUNC = ItemStorage_ProcessInput; +} + +static void ItemStorage_DoItemSwap(u8 taskId, bool8 switchModeDisabled) +{ + s16 *data = TASK.data; + u8 trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; + + SWITCH_MODE_ACTIVE = FALSE; + + if((u8)NUM_ITEMS > trueIndex && (u8)SWAP_ITEM_INDEX != trueIndex && switchModeDisabled == FALSE) + { + struct ItemSlot itemSlot = gSaveBlock1.pcItems[SWAP_ITEM_INDEX]; // backup the itemSlot before swapping the two. + + gSaveBlock1.pcItems[SWAP_ITEM_INDEX] = gSaveBlock1.pcItems[trueIndex]; + gSaveBlock1.pcItems[trueIndex] = itemSlot; + return; + } + else if(trueIndex == NUM_ITEMS) + { + ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); + } + else + { + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); + } + + /* + THEORY: This check produces essentially dead code, but it might have been working in an earlier build + in which case it allows a programmer to easily duplicate items without the use of a debug menu. + This gets the page index of the swap index for some reason. It is currently unknown what it would have been used + for, but perhaps it was used to increase the quantity of the item without a debug menu. + With the removal of a lot of the debug menus close to release, a programmer may have added this to + help test things with a low key (such as planting a lot of duplicated berries, which requires this lazy "cheat") + without bringing the relevent debug menus back. The commented out line is intentionally left in below to show + what it may have looked like. + */ + if(SWAP_ITEM_INDEX - ITEMS_ABOVE_TOP <= 0) { // this check is arbitrary and used to generate the correct assembly using the subtraction, which is what matters. the 0 check doesn't. + //gSaveBlock1.pcItems[SWAP_ITEM_INDEX].quantity += 100; + gSaveBlock1.pcItems[SWAP_ITEM_INDEX].quantity += 0; // do not enforce item cap. + } +} + +static void ItemStorage_DrawItemQuantity(u16 arg1, enum StringConvertMode arg2, u8 arg3, u8 arg4, int isSwapSelected) +{ + sub_80A4164(gStringVar1, arg1, arg2, arg4); + + if(isSwapSelected != FALSE) + Menu_PrintText(gSelectedItemQuantityFormatText, 0x1A, arg3); + else + Menu_PrintText(gNonSelectedItemQuantityFormatText, 0x1A, arg3); +} + +static void ItemStorage_DrawItemVoidQuantity(u8 var) +{ + Menu_PrintText(gUnknown_08406330, 0x19, var); +} + +static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSwapSelected) +{ + CopyItemName(itemSlot->itemId, gStringVar1); + + if(isSwapSelected != FALSE) + Menu_PrintText(gSelectedItemFormattedText, 16, var); + else + Menu_PrintText(gNonSelectedItemFormattedText, 16, var); +} + +static void ItemStorage_DrawNormalItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) +{ + ItemStorage_DrawItemName(itemSlot, var, var2); + ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); +} + +static void ItemStorage_DrawKeyItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) +{ + ItemStorage_DrawItemName(itemSlot, var, var2); + ItemStorage_DrawItemVoidQuantity(var); +} + +static void ItemStorage_DrawTMHMEntry(struct ItemSlot *itemSlot, u8 var, int var2) +{ + ItemStorage_DrawItemName(itemSlot, var, var2); + + if(itemSlot->itemId < ITEM_HM01_CUT) + ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); + else + ItemStorage_DrawItemVoidQuantity(var); // HMs do not have a quantity. +} + +static void ItemStorage_DrawItemList(u8 taskId) +{ + s16 *data = TASK.data; + int tempArg; + u16 i; + u16 yCoord = 0; + + for (i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++) + { + yCoord = (i - ITEMS_ABOVE_TOP) * 2; + + if (i == NUM_ITEMS) + { + sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1); + break; + } + else + { + tempArg = 0; + + if (SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX) + tempArg = 1; + + switch (GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1) + { + case 0: + case 1: + case 3: + ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; + case 4: + ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; + case 2: + ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; + } + } + } + + if (i - ITEMS_ABOVE_TOP < 8) + Menu_BlankWindowRect(16, yCoord + 4, 0x1C, 0x12); + + if (ITEMS_ABOVE_TOP != 0) + CreateVerticalScrollIndicators(TOP_ARROW, 0xB8, 8); + else + DestroyVerticalScrollIndicator(TOP_ARROW); + + if (ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS) + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xB8, 0x98); + else + DestroyVerticalScrollIndicator(BOTTOM_ARROW); +} + +static void ItemStorage_PrintItemPcResponse(u16 itemId) +{ + const u8 *string; + + switch(itemId) + { + case ITEMPC_GO_BACK_TO_PREV: + string = gMenuText_GoBackToPrev; + break; + case ITEMPC_HOW_MANY_TO_WITHDRAW: + string = gOtherText_HowManyToWithdraw; + break; + case ITEMPC_WITHDREW_THING: + string = gOtherText_WithdrewThing; + break; + case ITEMPC_HOW_MANY_TO_TOSS: + string = gOtherText_HowManyToToss; + break; + case ITEMPC_THREW_AWAY_ITEM: + string = gOtherText_ThrewAwayItem; + break; + case ITEMPC_NO_MORE_ROOM: + string = gOtherText_NoMoreRoom; + break; + case ITEMPC_TOO_IMPORTANT: + string = gOtherText_TooImportant; + break; + case ITEMPC_OKAY_TO_THROW_AWAY: + string = gOtherText_OkayToThrowAwayPrompt; + break; + case ITEMPC_SWITCH_WHICH_ITEM: + string = gOtherText_SwitchWhichItem; + break; + default: + string = ItemId_GetDescription(itemId); + break; + } + + sub_8072AB0(string, 8, 0x68, 0x68, 0x30, 1); +} + +static void ItemStorage_DrawBothListAndDescription(u8 taskId) +{ + s16 *data = TASK.data; + s16 trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; + + ItemStorage_DrawItemList(taskId); + + if(SWITCH_MODE_ACTIVE == FALSE) + { + if(trueIndex == NUM_ITEMS) + ItemStorage_PrintItemPcResponse(ITEMPC_GO_BACK_TO_PREV); + else + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[trueIndex].itemId); + } +} + +static void ItemStorage_GoBackToItemPCMenu(u8 taskId, u8 var) +{ + s16 *data = TASK.data; + + ClearVerticalScrollIndicatorPalettes(); + LoadScrollIndicatorPalette(); + ItemStorage_LoadPalette(); + Menu_DrawStdWindowFrame(0xF, 0, 0x1D, 0x13); + Menu_DrawStdWindowFrame(0, 0xC, 0xE, 0x13); + Menu_DrawStdWindowFrame(0, 0, 0xB, 3); + ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[0].itemId); + Menu_PrintText(gPCText_ItemPCOptionsText[var].text, 1, 1); + ItemStorage_DrawItemList(taskId); + InitMenu(0, 0x10, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); +} + +static void ItemStorage_LoadPalette(void) +{ + u16 arr[] = { + 0x5294, + 0x6B5A, + 0x7FFF + }; + + LoadPalette(&arr[2], 0xDF, 2); + LoadPalette(&arr[1], 0xD1, 2); + LoadPalette(&arr[0], 0xD8, 2); +} + +static u8 GetMailboxMailCount(void) +{ + u8 i, j; + + for(i = 0, j = 6; j < 16; j++) + if(gSaveBlock1.mail[j].itemId != 0) + i++; + + return i; +} + +static void Mailbox_UpdateMailList(void) +{ + struct MailStruct mailBuffer; + u8 i, j; + + for (i=6; i<15; i++) + { + for (j=i+1; j<16; j++) + { + if (gSaveBlock1.mail[i].itemId == 0) + { + mailBuffer = gSaveBlock1.mail[i]; + gSaveBlock1.mail[i] = gSaveBlock1.mail[j]; + gSaveBlock1.mail[j] = mailBuffer; + } + } + } +} + +static void Mailbox_DrawMailList(u8 taskId) // taskId is unused +{ + u16 yCoord = 0; + u16 i; + + for (i = eMailboxInfo.itemsAbove; i < eMailboxInfo.itemsAbove + eMailboxInfo.pageItems; i++) + { + yCoord = (i - eMailboxInfo.itemsAbove) * 2; + Menu_BlankWindowRect(0x15, yCoord + 2, 0x1C, yCoord + 3); + if (i == eMailboxInfo.count) + { + Menu_PrintText(gOtherText_CancelNoTerminator, 0x15, yCoord + 2); + break; + } + else + { + StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName); + SanitizeNameString(gStringVar1); + Menu_PrintText(gStringVar1, 0x15, yCoord + 2); + } + } + + if (i - eMailboxInfo.itemsAbove != 8) + Menu_BlankWindowRect(0x15, yCoord + 4, 0x1C, 0x12); + + if (eMailboxInfo.itemsAbove != 0) + CreateVerticalScrollIndicators(TOP_ARROW, 0xC8, 8); + else + DestroyVerticalScrollIndicator(TOP_ARROW); + + if (eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count) + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xC8, 0x98); + else + DestroyVerticalScrollIndicator(BOTTOM_ARROW); +} + +static void Mailbox_DrawMailboxMenu(u8 taskId) +{ + ClearVerticalScrollIndicatorPalettes(); + LoadScrollIndicatorPalette(); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); + Menu_DrawStdWindowFrame(0, 0, 0x8, 0x3); + Menu_PrintText(gPCText_Mailbox, 1, 1); + Menu_DrawStdWindowFrame(0x14, 0, 0x1D, 0x13); + Mailbox_DrawMailList(taskId); + InitMenu(0, 0x15, 2, eMailboxInfo.pageItems, eMailboxInfo.cursorPos, 8); +} + +// Mailbox_ProcessInput +static void Mailbox_ProcessInput(u8 taskId) +{ + if(!gPaletteFade.active) + { + if(gMain.newAndRepeatedKeys & DPAD_UP) + { + if(eMailboxInfo.cursorPos != 0) + { + PlaySE(SE_SELECT); + eMailboxInfo.cursorPos = Menu_MoveCursor(-1); + } + else if(eMailboxInfo.itemsAbove != 0) + { + PlaySE(SE_SELECT); + eMailboxInfo.itemsAbove--; + Mailbox_DrawMailList(taskId); + } + } + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if(eMailboxInfo.cursorPos != eMailboxInfo.pageItems - 1) + { + PlaySE(SE_SELECT); + eMailboxInfo.cursorPos = Menu_MoveCursor(1); + } + else if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos != eMailboxInfo.count) + { + PlaySE(SE_SELECT); + eMailboxInfo.itemsAbove++; + Mailbox_DrawMailList(taskId); + } + } + else if(gMain.newKeys & A_BUTTON) + { + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + + if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos == eMailboxInfo.count) + { + Mailbox_TurnOff(taskId); + } + else + { + Mailbox_CloseScrollIndicators(); + TASK.FUNC = Mailbox_PrintWhatToDoWithPlayerMailText; + } + } + else if(gMain.newKeys & B_BUTTON) + { + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + Mailbox_TurnOff(taskId); + } + } +} + +static void Mailbox_CloseScrollIndicators(void) +{ + BuyMenuFreeMemory(); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); +} + +static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) +{ + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); + StringCopy(gStringVar1, gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos].playerName); + SanitizeNameString(gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail); + DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions, 0); +} + +static void Mailbox_ReturnToPlayerPC(u8 taskId) +{ + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); + ReshowPlayerPC(taskId); +} + +static void Mailbox_TurnOff(u8 taskId) +{ + Mailbox_CloseScrollIndicators(); + TASK.FUNC = Mailbox_ReturnToPlayerPC; +} + +static void Mailbox_PrintMailOptions(u8 taskId) // Mailbox_PrintMailOptions +{ + Menu_DrawStdWindowFrame(0, 0, 0xC, 0x9); + Menu_PrintItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions); + InitMenu(0, 1, 1, 4, 0, 0xB); + TASK.FUNC = Mailbox_MailOptionsProcessInput; +} + +static void Mailbox_MailOptionsProcessInput(u8 taskId) +{ + if(gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + else if(gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gMailboxMailOptions[Menu_GetCursorPos()].func(taskId); + } + else if(gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + Mailbox_Cancel(taskId); + } +} + +static void Mailbox_DoMailRead(u8 taskId) +{ + FadeScreen(1, 0); + TASK.FUNC = Mailbox_FadeAndReadMail; +} + +static void Mailbox_FadeAndReadMail(u8 taskId) +{ + if(!gPaletteFade.active) + { + HandleReadMail(&gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos], Mailbox_ReturnToFieldFromReadMail, 1); + DestroyTask(taskId); + } +} + +static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput +{ + if (IsWeatherNotFadingIn() == TRUE) // is black fade finished? why not gPaletteFade.active? + TASK.FUNC = Mailbox_ProcessInput; +} + +static void Mailbox_DoRedrawMailboxMenuAfterReturn(void) +{ + Mailbox_DrawMailboxMenu(CreateTask(Mailbox_HandleReturnToProcessInput, 0)); + pal_fill_black(); +} + +static void Mailbox_ReturnToFieldFromReadMail(void) +{ + gFieldCallback = Mailbox_DoRedrawMailboxMenuAfterReturn; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}"); + +static void Mailbox_MoveToBag(u8 taskId) +{ + Menu_DestroyCursor(); + StringCopy(gStringVar1, gOtherText_MoveToBag); + Menu_PrintText(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText + DisplayItemMessageOnField(taskId, gOtherText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove, 0); +} + +static void Mailbox_DrawYesNoBeforeMove(u8 taskId) +{ + DisplayYesNoMenu(0x14, 0x8, 0x1); + DoYesNoFuncWithChoice(taskId, (struct YesNoFuncTable *)&ResumeFromWithdrawYesNoFuncList); +} + +static void Mailbox_DoMailMoveToBag(u8 taskId) +{ + struct MailStruct *mail = &gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos]; + + Menu_EraseWindowRect(0x14, 8, 0x1A, 0xD); + + if(AddBagItem(mail->itemId, 1) == FALSE) + { + DisplayItemMessageOnField(taskId, gOtherText_BagIsFull, Mailbox_DrawMailMenuAndDoProcessInput, 0); + } + else + { + DisplayItemMessageOnField(taskId, gOtherText_MailWasReturned, Mailbox_DrawMailMenuAndDoProcessInput, 0); + ClearMailStruct(mail); + Mailbox_UpdateMailList(); + + eMailboxInfo.count--; + + if(eMailboxInfo.count < eMailboxInfo.pageItems + eMailboxInfo.itemsAbove && eMailboxInfo.itemsAbove != 0) + eMailboxInfo.itemsAbove--; + + ItemStorage_SetItemAndMailCount(taskId); + } +} + +static void Mailbox_ReturnToInputAfterNo(u8 taskId) // Mailbox_ReturnToInputAfterNo +{ + Menu_EraseWindowRect(0x14, 0x8, 0x1A, 0xD); + Mailbox_DrawMailMenuAndDoProcessInput(taskId); +} + +static void Mailbox_Give(u8 taskId) +{ + if(CalculatePlayerPartyCount() == 0) + Mailbox_NoPokemonForMail(taskId); // cannot be reached normally + else + { + FadeScreen(1, 0); + TASK.FUNC = Mailbox_DoGiveMailPokeMenu; + } +} + +static void Mailbox_DoGiveMailPokeMenu(u8 taskId) // Mailbox_DoGiveMailPokeMenu +{ + if(!gPaletteFade.active) + { + SetMainCallback2(sub_808B020); + gUnknown_02038561 = 3; + DestroyTask(taskId); + } +} + +static void Mailbox_UpdateMailListAfterDeposit(void) +{ + u8 taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); + u8 oldCount = eMailboxInfo.count; + + eMailboxInfo.count = GetMailboxMailCount(); + Mailbox_UpdateMailList(); + + if(oldCount != eMailboxInfo.count && eMailboxInfo.count < eMailboxInfo.pageItems + eMailboxInfo.itemsAbove && eMailboxInfo.itemsAbove != 0) // did the count update? + eMailboxInfo.itemsAbove--; + + ItemStorage_SetItemAndMailCount(taskId); + Mailbox_DrawMailboxMenu(taskId); + pal_fill_black(); +} + +void Mailbox_ReturnToMailListAfterDeposit(void) +{ + gFieldCallback = Mailbox_UpdateMailListAfterDeposit; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +// you always have at least 1 POKeMON and you cannot receive mail before you leave Littleroot: therefore this function cannot be reached normally. +static void Mailbox_NoPokemonForMail(u8 taskId) +{ + DisplayItemMessageOnField(taskId, gOtherText_NoPokemon, Mailbox_DrawMailMenuAndDoProcessInput, 0); +} + +static void Mailbox_Cancel(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 0xC, 0x9); + Mailbox_DrawMailMenuAndDoProcessInput(taskId); +} + +static void Mailbox_DrawMailMenuAndDoProcessInput(u8 taskId) +{ + Mailbox_DrawMailboxMenu(taskId); + TASK.FUNC = Mailbox_ProcessInput; +} diff --git a/src/pokeblock.c b/src/pokeblock.c new file mode 100644 index 000000000..6804f55d6 --- /dev/null +++ b/src/pokeblock.c @@ -0,0 +1,1147 @@ +#include "global.h" +#include "overworld.h" +#include "sprite.h" +#include "script.h" +#include "strings.h" +#include "task.h" +#include "scanline_effect.h" +#include "text.h" +#include "main.h" +#include "menu.h" +#include "field_fadetransition.h" +#include "palette.h" +#include "graphics.h" +#include "decompress.h" +#include "menu_helpers.h" +#include "battle.h" +#include "item_menu.h" +#include "item_use.h" +#include "item.h" +#include "constants/items.h" +#include "sound.h" +#include "constants/songs.h" +#include "safari_zone.h" +#include "event_data.h" +#include "pokeblock.h" +#include "ewram.h" + +struct UnkPokeblockStruct +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; +}; + +static EWRAM_DATA u8 gUnknown_02039244 = 0; +static EWRAM_DATA struct UnkPokeblockStruct gUnknown_02039248 = {0}; +static EWRAM_DATA u8 gUnknown_0203924C = 0; + +// function declarations + +// gUnknown_083F7EF4 +static void sub_810C508(u8); +static void sub_810C5C0(u8); +static void sub_810C748(u8); +static void sub_810C788(u8); +static void sub_810C854(u8); + +// gUnknown_083F7F24 +static void sub_810C610(u8); +static void sub_810C668(u8); + +// sub_810B6C0 +static bool8 sub_810B998(void); +static void sub_810BC98(void); +static void sub_810BD08(void); +static void sub_810BB0C(void); +static void sub_810BB30(void); +static void sub_810BC84(u8); + +// sub_810B96C +static void sub_810BF7C(u8); + +// sub_810BC84 +static void sub_810BDAC(bool8); + +// sub_810BF38 +static void sub_810C8D4(struct Sprite *); + +// sub_810BF7C +static void sub_810C0C8(u8); +static void sub_810C31C(u8); +static void sub_810C368(u8); + +// sub_810C0C8 +static void sub_810C1C8(u8, u8); +static void sub_810C23C(u8); + +// sub_810C368 +static void sub_810C40C(u8); + +// sub_810C540 +static void sub_810C5EC(u8); + +// sub_810C610 +static void sub_810C704(u8); + +static const u8 *gUnknown_03000758; + +// rodata + +#define GFX_TAG_POKEBLOCK_CASE 14800 + +const s8 gPokeblockFlavorCompatibilityTable[] = +{ + // Cool, Beauty, Cute, Smart, Tough + 0, 0, 0, 0, 0, // Hardy + 1, 0, 0, 0, -1, // Lonely + 1, 0, -1, 0, 0, // Brave + 1, -1, 0, 0, 0, // Adamant + 1, 0, 0, -1, 0, // Naughty + -1, 0, 0, 0, 1, // Bold + 0, 0, 0, 0, 0, // Docile + 0, 0, -1, 0, 1, // Relaxed + 0, -1, 0, 0, 1, // Impish + 0, 0, 0, -1, 1, // Lax + -1, 0, 1, 0, 0, // Timid + 0, 0, 1, 0, -1, // Hasty + 0, 0, 0, 0, 0, // Serious + 0, -1, 1, 0, 0, // Jolly + 0, 0, 1, -1, 0, // Naive + -1, 1, 0, 0, 0, // Modest + 0, 1, 0, 0, -1, // Mild + 0, 1, -1, 0, 0, // Quiet + 0, 0, 0, 0, 0, // Bashful + 0, 1, 0, -1, 0, // Rash + -1, 0, 0, 1, 0, // Calm + 0, 0, 0, 1, -1, // Gentle + 0, 0, -1, 1, 0, // Sassy + 0, -1, 0, 1, 0, // Careful + 0, 0, 0, 0, 0 // Quirky +}; + +void (*const gUnknown_083F7EA8[])(void) = +{ + sub_80A5B40, + c2_exit_to_overworld_2_switch, + sub_802E424, + c2_exit_to_overworld_2_switch +}; + +const u8 *const gPokeblockNames[] = +{ + NULL, + ContestStatsText_RedPokeBlock, + ContestStatsText_BluePokeBlock, + ContestStatsText_PinkPokeBlock, + ContestStatsText_GreenPokeBlock, + ContestStatsText_YellowPokeBlock, + ContestStatsText_PurplePokeBlock, + ContestStatsText_IndigoPokeBlock, + ContestStatsText_BrownPokeBlock, + ContestStatsText_LiteBluePokeBlock, + ContestStatsText_OlivePokeBlock, + ContestStatsText_GrayPokeBlock, + ContestStatsText_BlackPokeBlock, + ContestStatsText_WhitePokeBlock, + ContestStatsText_GoldPokeBlock +}; + +const struct MenuAction2 gUnknown_083F7EF4[] = +{ + {OtherText_Use, sub_810C508}, + {OtherText_Toss, sub_810C5C0}, + {gOtherText_CancelNoTerminator, sub_810C748}, + {OtherText_Use, sub_810C788}, + {OtherText_Use, sub_810C854}, +}; + +const u8 gUnknown_083F7F1C[] = {0, 1, 2}; +const u8 gUnknown_083F7F1F[] = {3, 2}; +const u8 gUnknown_083F7F21[] = {4, 2}; + +const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668}; + +const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f}; + +const struct OamData gOamData_83F7F34 = +{ + .size = 3, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83F7F3C[] = +{ + ANIMCMD_FRAME(.imageValue = 0, .duration = 0), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83F7F44[] = +{ + gSpriteAnim_83F7F3C +}; + +const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = +{ + AFFINEANIMCMD_FRAME(0, 0, -2, 2), + AFFINEANIMCMD_FRAME(0, 0, 2, 4), + AFFINEANIMCMD_FRAME(0, 0, -2, 4), + AFFINEANIMCMD_FRAME(0, 0, 2, 2), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = +{ + gSpriteAffineAnim_83F7F48 +}; + +const struct CompressedSpriteSheet gUnknown_083F7F74 = +{ + gMenuPokeblockDevice_Gfx, + 0x800, + GFX_TAG_POKEBLOCK_CASE +}; + +const struct CompressedSpritePalette gUnknown_083F7F7C = +{ + gMenuPokeblockDevice_Pal, + GFX_TAG_POKEBLOCK_CASE +}; + +const struct SpriteTemplate gSpriteTemplate_83F7F84 = +{ + GFX_TAG_POKEBLOCK_CASE, + GFX_TAG_POKEBLOCK_CASE, + &gOamData_83F7F34, + gSpriteAnimTable_83F7F44, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct Pokeblock gUnknown_083F7F9C[] = +{ + { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20 }, + { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20 }, + { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20 }, + { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20 }, + { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20 }, +#if DEBUG + { PBLOCK_CLR_PURPLE, 20, 0, 20, 0, 0, 20 }, + { PBLOCK_CLR_INDIGO, 0, 20, 0, 20, 0, 20 }, + { PBLOCK_CLR_BROWN, 0, 0, 20, 0, 20, 20 }, + { PBLOCK_CLR_LITEBLUE, 20, 0, 0, 20, 0, 20 }, + { PBLOCK_CLR_OLIVE, 0, 20, 0, 0, 20, 20 }, + { PBLOCK_CLR_GRAY, 0, 2, 0, 2, 2, 0 }, + { PBLOCK_CLR_BLACK, 3, 3, 3, 4, 3, 0 }, + { PBLOCK_CLR_WHITE, 1, 1, 1, 1, 1, 1 }, + { PBLOCK_CLR_GOLD, 20, 0, 0, 0, 0, 20 }, + { 0 }, +#endif +}; + +// text + +static void sub_810B674(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); +} + +static void sub_810B68C(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x7800), sizeof gBGTilemapBuffers[2]); +} + +static bool8 sub_810B6C0(void) +{ + u16 ime; + switch (gMain.state) + { + case 0: + ClearVideoCallbacks(); + sub_80F9368(); + REG_BG2CNT = BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_PRIORITY(2); + REG_BLDCNT = 0; + gMain.state++; + break; + case 1: + ScanlineEffect_Stop(); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = TRUE; + gMain.state++; + break; + case 3: + ResetSpriteData(); + gMain.state++; + break; + case 4: + if (gUnknown_02039244 != 2) + { + ResetTasks(); + } + gMain.state++; + break; + case 5: + Text_LoadWindowTemplate(&gWindowTemplate_81E6E34); + gMain.state++; + break; + case 6: + Text_LoadWindowTemplate(&gWindowTemplate_81E6E50); + gMain.state++; + break; + case 7: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E34); + gMain.state++; + break; + case 8: + if (MultistepInitMenuWindowContinue()) + { + gMain.state++; + } + break; + case 9: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50); + gMain.state++; + break; + case 10: + if (MultistepInitMenuWindowContinue()) + { + ewram1FFFF = 0; + gMain.state++; + } + break; + case 11: + if (sub_810B998()) + { + gMain.state++; + } + break; + case 12: + ClearVerticalScrollIndicatorPalettes(); + LoadScrollIndicatorPalette(); + CreateVerticalScrollIndicators(TOP_ARROW, 0xb0, 0x08); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xb0, 0x98); + gMain.state++; + break; + case 13: + ewram1FFFE = sub_810BA50(0x38, 0x40, 0); + gMain.state++; + break; + case 14: + sub_810BC98(); + sub_810BD08(); + gMain.state++; + break; + case 15: + sub_810BB0C(); + sub_810BB30(); + sub_810BC84(gUnknown_02039248.unk1); + gMain.state++; + break; + case 16: + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(sub_810B68C); + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; + gMain.state++; + break; + case 17: + if (sub_8055870() != TRUE) + { + gMain.state++; + } + break; + case 18: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gPaletteFade.bufferTransferDisabled = FALSE; + SetMainCallback2(sub_810B674); + return TRUE; + } + return FALSE; +} + +void sub_810B96C(void) +{ + do { + if (sub_810B6C0() == TRUE) + { + CreateTask(sub_810BF7C, 0); + break; + } + } while (sub_80F9344() != TRUE); +} + +static bool8 sub_810B998(void) +{ + switch (ewram1FFFF) + { + case 0: + LZDecompressVram(gMenuPokeblock_Gfx, BG_CHAR_ADDR(2)); + ewram1FFFF++; + break; + case 1: + LZDecompressWram(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]); + ewram1FFFF++; + break; + case 2: + LoadCompressedPalette(gMenuPokeblock_Pal, 0, 0xc0); + ewram1FFFF++; + break; + case 3: + LoadCompressedObjectPic(&gUnknown_083F7F74); + ewram1FFFF++; + break; + case 4: + LoadCompressedObjectPalette(&gUnknown_083F7F7C); + ewram1FFFF = 0; + return TRUE; + } + return FALSE; +} + +u8 sub_810BA50(s16 x, s16 y, u8 subpriority) +{ + return CreateSprite(&gSpriteTemplate_83F7F84, x, y, subpriority); +} + +void sub_810BA7C(u8 a0) +{ + gUnknown_02039244 = a0; + switch (gUnknown_02039244) + { + default: + gUnknown_03000758 = gUnknown_083F7F1C; + gUnknown_0203924C = sizeof gUnknown_083F7F1C; + break; + case 2: + gUnknown_03000758 = gUnknown_083F7F1F; + gUnknown_0203924C = sizeof gUnknown_083F7F1F; + break; + case 3: + gUnknown_03000758 = gUnknown_083F7F21; + gUnknown_0203924C = sizeof gUnknown_083F7F21; + break; + } +} + +void sub_810BADC(void) +{ + sub_810BA7C(2); + SetMainCallback2(sub_810B96C); +} + +void OpenPokeblockCaseOnFeeder(void) +{ + sub_810BA7C(3); + SetMainCallback2(sub_810B96C); +} + +#if DEBUG +void debug_sub_8120F98(void) +{ + u8 i; + + for (i = 0; i < 40 && gUnknown_083F7F9C[i].color != 0; i++) + gSaveBlock1.pokeblocks[i] = gUnknown_083F7F9C[i]; +} +#endif + +static void sub_810BB0C(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6E34); + sub_8072BD8(ItemId_GetName(ITEM_POKEBLOCK_CASE), 2, 1, 0x48); +} + +static void sub_810BB30(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6E34); + Menu_PrintText(gContestStatsText_Spicy, 2, 13); + Menu_PrintText(gContestStatsText_Dry, 2, 15); + Menu_PrintText(gContestStatsText_Sweet, 2, 17); + Menu_PrintText(gContestStatsText_Bitter, 8, 13); + Menu_PrintText(gContestStatsText_Sour, 8, 15); +} + +static void sub_810BB88(u8 a0) +{ + u8 i; + u8 y; + u8 *buf; + BasicInitMenuWindow(&gWindowTemplate_81E6E34); + for (i = a0; i <= a0 + 8; i++) + { + y = (i - a0) << 1; + if (i == gUnknown_02039248.unk2) + { + buf = sub_8072C74(gStringVar1, gContestStatsText_StowCase, 0x78, 0); + Menu_PrintText(gStringVar1, 15, y + 1); + if (i != a0 + 8) + { + Menu_EraseWindowRect(15, y + 3, 29, 18); + } + break; + } + buf = sub_8072C74(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[i].color], 0x5e, 0); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x14; + buf[2] = 0x06; + buf += 3; + ConvertIntToDecimalStringN(buf, sub_810C9B0(&gSaveBlock1.pokeblocks[i]), STR_CONV_MODE_RIGHT_ALIGN, 3); + Menu_PrintText(gStringVar1, 15, y + 1); + } +} + +static void sub_810BC84(u8 a0) +{ + sub_810BB88(a0); + sub_810BDAC(FALSE); +} + +static void sub_810BC98(void) +{ + u16 i, j; + struct Pokeblock buf; + for (i=0; i<39; i++) + { + for (j=i+1; j<40; j++) + { + if (gSaveBlock1.pokeblocks[i].color == 0) + { + buf = gSaveBlock1.pokeblocks[i]; + gSaveBlock1.pokeblocks[i] = gSaveBlock1.pokeblocks[j]; + gSaveBlock1.pokeblocks[j] = buf; + } + } + } +} + +static void sub_810BD08(void) +{ + u8 i; + gUnknown_02039248.unk2 = 0; + for (i=0; i<40; i++) + { + if (gSaveBlock1.pokeblocks[i].color != 0) + gUnknown_02039248.unk2++; + } + if (gUnknown_02039248.unk2 < 8) + { + gUnknown_02039248.unk3 = gUnknown_02039248.unk2; + } + else + { + gUnknown_02039248.unk3 = 8; + } + if (gUnknown_02039248.unk1 + 8 > gUnknown_02039248.unk2 && gUnknown_02039248.unk1 != 0) + { + gUnknown_02039248.unk1--; + } +} + +static void sub_810BD64(u16 a0, u16 a1) +{ + u8 i; + int y; + for (i=0; i<14; i++) + { + gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 1) * 32 + (y = i + 15)] = a0; + gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 2) * 32 + y] = a0; + } +} + +static void sub_810BDAC(bool8 flag) +{ + u8 i; + u16 v0; + if (!flag) + { + sub_810BD64(0x1005, 0x1014); + } + else + { + sub_810BD64(0x2005, 0x2014); + } + if (gUnknown_02039248.unk1) + { + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); + } + else + { + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); + } + if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) + { + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); + } + else + { + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + } + for (i=0; i<5; i++) + { + v0 = ((i % 3) << 6) + 0x1a1 + (i / 3) * 6; + if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2) + { + if (GetPokeblockData(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1], i + 1) > 0) + { + gBGTilemapBuffers[2][v0] = (i << 12) + 23; + gBGTilemapBuffers[2][v0 + 32] = (i << 12) + 24; + } + else + { + gBGTilemapBuffers[2][v0] = 15; + gBGTilemapBuffers[2][v0 + 32] = 15; + } + } + else + { + gBGTilemapBuffers[2][v0] = 15; + gBGTilemapBuffers[2][v0 + 32] = 15; + } + } + BasicInitMenuWindow(&gWindowTemplate_81E6E34); + if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2) + { + sub_8072C14(gStringVar1, sub_810C9E8(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1]), 16, 1); + Menu_PrintText(gStringVar1, 11, 17); + } + else + { + Menu_EraseWindowRect(11, 17, 12, 18); + } +} + +static void sub_810BF38(bool8 flag) +{ + PlaySE(SE_SELECT); + gSprites[ewram1FFFE].callback = sub_810C8D4; + sub_810BDAC(flag); +} + +static void sub_810BF7C(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (gUnknown_02039248.unk0 != 0) + { + sub_810BD64(5, 20); + gUnknown_02039248.unk0--; + sub_810BF38(FALSE); + } + else if (gUnknown_02039248.unk1 != 0) + { + gUnknown_02039248.unk1--; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BF38(FALSE); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3) + { + sub_810BD64(5, 20); + gUnknown_02039248.unk0++; + sub_810BF38(FALSE); + } + else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) + { + gUnknown_02039248.unk1++; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BF38(FALSE); + } + } + else if (gMain.newKeys & SELECT_BUTTON) + { + if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) + { + PlaySE(SE_SELECT); + sub_810BDAC(TRUE); + gTasks[taskId].data[0] = gUnknown_02039248.unk1 + gUnknown_02039248.unk0; + gTasks[taskId].func = sub_810C0C8; + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 == gUnknown_02039248.unk2) + { + gSpecialVar_Result = 0xffff; + sub_810C31C(taskId); + } + else + { + sub_810C368(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gSpecialVar_Result = 0xffff; + sub_810C31C(taskId); + } + } +} + +static void sub_810C0C8(u8 taskId) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (gUnknown_02039248.unk0 != 0) + { + sub_810BD64(5, 20); + gUnknown_02039248.unk0--; + sub_810BF38(TRUE); + sub_810C1C8(taskId, 1); + } + else if (gUnknown_02039248.unk1 != 0) + { + sub_810C1C8(taskId, 0); + gUnknown_02039248.unk1--; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BF38(TRUE); + sub_810C1C8(taskId, 1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3) + { + sub_810BD64(5, 20); + gUnknown_02039248.unk0++; + sub_810BF38(TRUE); + sub_810C1C8(taskId, 1); + } + else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2) + { + sub_810C1C8(taskId, 0); + gUnknown_02039248.unk1++; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BF38(TRUE); + sub_810C1C8(taskId, 1); + } + } + else if (gMain.newKeys & A_BUTTON || gMain.newKeys & SELECT_BUTTON) + { + PlaySE(SE_SELECT); + sub_810C1C8(taskId, 0); + sub_810C23C(taskId); + gTasks[taskId].func = sub_810BF7C; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_810C1C8(taskId, 0); + sub_810BDAC(0); + gTasks[taskId].func = sub_810BF7C; + } +} + +static void sub_810C1C8(u8 taskId, u8 flag) +{ + u8 i; + u32 x; + s16 y; + u16 v0 = 0x1005; + if (!flag) + { + v0 = 0x0005; + } + y = gTasks[taskId].data[0] - gUnknown_02039248.unk1; + if ((u16)y <= 8 && y != gUnknown_02039248.unk0) + { + for (i=0; i<14; i++) + { + gBGTilemapBuffers[2][(2 * y + 1) * 32 + (x = i + 15)] = v0; + gBGTilemapBuffers[2][(2 * y + 2) * 32 + x] = v0; + } + } +} + +static void sub_810C23C(u8 taskId) +{ + struct Pokeblock buf; + u8 selidx = gUnknown_02039248.unk1 + gUnknown_02039248.unk0; + if (selidx == gUnknown_02039248.unk2) + { + sub_810BDAC(FALSE); + } + else + { + buf = gSaveBlock1.pokeblocks[selidx]; + gSaveBlock1.pokeblocks[selidx] = gSaveBlock1.pokeblocks[gTasks[taskId].data[0]]; + gSaveBlock1.pokeblocks[gTasks[taskId].data[0]] = buf; + sub_810BB88(gUnknown_02039248.unk1); + sub_810BDAC(FALSE); + } +} + +static void sub_810C2B0(void) +{ + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + BuyMenuFreeMemory(); +} + +static void sub_810C2C8(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gUnknown_02039244 == 3) + { + gFieldCallback = sub_8080990; + } + sub_810C2B0(); + SetMainCallback2(gUnknown_083F7EA8[gUnknown_02039244]); + DestroyTask(taskId); + } +} + +static void sub_810C31C(u8 taskId) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + if (gUnknown_02039244 > 1) + { + gSpecialVar_ItemId = ITEM_NONE; + } + gTasks[taskId].func = sub_810C2C8; +} + +static void sub_810C368(u8 taskId) +{ + int v0 = 0; + if (gUnknown_02039244 > 1) + v0 = 2; + StopVerticalScrollIndicators(TOP_ARROW); + StopVerticalScrollIndicators(BOTTOM_ARROW); + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_DrawStdWindowFrame(7, v0 + 4, 13, 11); + Menu_PrintItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758); + InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5); + gSpecialVar_ItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1; + gTasks[taskId].func = sub_810C40C; +} + +static void sub_810C40C(u8 taskId) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (Menu_GetCursorPos()) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (Menu_GetCursorPos() != gUnknown_0203924C - 1) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(+1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_083F7EF4[gUnknown_03000758[Menu_GetCursorPos()]].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_810C748(taskId); + } +} + +static void sub_810C4C4(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_810C2B0(); + sub_8136130(&gSaveBlock1.pokeblocks[gSpecialVar_ItemId], sub_810B96C); + DestroyTask(taskId); + } +} + +static void sub_810C508(u8 taskId) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_810C4C4; +} + +static void sub_810C540(u8 taskId) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_DestroyCursor(); + Menu_EraseWindowRect(7, 4, 13, 11); + StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1].color]); + StringExpandPlaceholders(gStringVar4, gContestStatsText_ThrowAwayPrompt); + DisplayItemMessageOnField(taskId, gStringVar4, sub_810C5EC, 0); +} + +static void sub_810C5C0(u8 taskId) +{ + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + gTasks[taskId].func = sub_810C540; +} + +static void sub_810C5EC(u8 taskId) +{ + DisplayYesNoMenu(7, 6, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083F7F24); +} + +static void sub_810C610(u8 taskId) +{ + Menu_EraseWindowRect(7, 6, 13, 11); + PokeblockClearIfExists((gUnknown_02039248.unk0 + gUnknown_02039248.unk1)); + StringExpandPlaceholders(gStringVar4, gContestStatsText_WasThrownAway); + DisplayItemMessageOnField(taskId, gStringVar4, sub_810C704, 0); + sub_810BC98(); + sub_810BD08(); +} + +static void sub_810C668(u8 taskId) +{ + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) + { + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); + } + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_EraseWindowRect(7, 6, 13, 11); + Menu_EraseWindowRect(0, 14, 29, 19); + gTasks[taskId].func = sub_810BF7C; +} + +static void sub_810C6DC(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + sub_810C668(taskId); + } +} + +static void sub_810C704(u8 taskId) +{ + BasicInitMenuWindow(&gWindowTemplate_81E6E34); + sub_810BC84(gUnknown_02039248.unk1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + gTasks[taskId].func = sub_810C6DC; +} + +static void sub_810C748(u8 taskId) +{ + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + Menu_DestroyCursor(); + Menu_EraseWindowRect(7, 4, 13, 11); + gTasks[taskId].func = sub_810BF7C; +} + +static void sub_810C788(u8 taskId) +{ + s16 v0 = PokeblockGetGain(GetNature(&gEnemyParty[0]), &gSaveBlock1.pokeblocks[gSpecialVar_ItemId]); + StringCopy(gBattleTextBuff1, gPokeblockNames[gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color]); + PokeblockClearIfExists(gSpecialVar_ItemId); + gSpecialVar_ItemId = gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color << 8; + if (v0 == 0) + { + gSpecialVar_ItemId += 1; + } + if (v0 > 0) + { + gSpecialVar_ItemId += 2; + } + if (v0 < 0) + { + gSpecialVar_ItemId += 3; + } + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_810C2C8; +} + +static void sub_810C854(u8 taskId) +{ + SafariZoneActivatePokeblockFeeder(gSpecialVar_ItemId); + StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color]); + gSpecialVar_Result = gSpecialVar_ItemId; + PokeblockClearIfExists(gSpecialVar_ItemId); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_810C2C8; +} + +static void sub_810C8D4(struct Sprite *sprite) +{ + if (sprite->data[0] > 1) + { + sprite->data[0] = 0; + } + switch (sprite->data[0]) + { + case 0: + sprite->oam.affineMode = 1; + sprite->affineAnims = gSpriteAffineAnimTable_83F7F70; + InitSpriteAffineAnim(sprite); + sprite->data[0] = 1; + sprite->data[1] = 0; + break; + case 1: + if (++sprite->data[1] > 11) + { + sprite->oam.affineMode = 0; + sprite->data[0] = 0; + sprite->data[1] = 0; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->callback = SpriteCallbackDummy; + } + break; + } +} + +static void ClearPokeblock(u8 pokeblockIdx) +{ + gSaveBlock1.pokeblocks[pokeblockIdx].color = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].spicy = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].dry = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].sweet = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].bitter = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].sour = 0; + gSaveBlock1.pokeblocks[pokeblockIdx].feel = 0; +} + +void ClearPokeblocks(void) +{ + u8 pokeblockIdx; + for (pokeblockIdx=0; pokeblockIdx 99) + feel = 99; + return feel; +} + +s8 GetFirstFreePokeblockSlot(void) +{ + u8 i; + for (i=0; icolor; + if (field == PBLOCK_SPICY) + return pokeblock->spicy; + if (field == PBLOCK_DRY) + return pokeblock->dry; + if (field == PBLOCK_SWEET) + return pokeblock->sweet; + if (field == PBLOCK_BITTER) + return pokeblock->bitter; + if (field == PBLOCK_SOUR) + return pokeblock->sour; + if (field == PBLOCK_FEEL) + return pokeblock->feel; + return 0; +} + +s16 PokeblockGetGain(u8 nature, const struct Pokeblock *pokeblock) +{ + u8 flavor; + s16 curGain; + s16 totalGain = 0; + for (flavor=0; flavor<5; flavor++) + { + curGain = GetPokeblockData(pokeblock, flavor + 1); + if (curGain > 0) + { + totalGain += curGain * gPokeblockFlavorCompatibilityTable[5 * nature + flavor]; + } + } + return totalGain; +} + +void PokeblockCopyName(struct Pokeblock *pokeblock, u8 *dest) +{ + u8 color = GetPokeblockData(pokeblock, PBLOCK_COLOR); + StringCopy(dest, gPokeblockNames[color]); +} + +bool8 sub_810CB68(u8 nature, u8 *dest) +{ + u8 flavor; + for (flavor=0; flavor<5; flavor++) + { + if (PokeblockGetGain(nature, &gUnknown_083F7F9C[flavor]) > 0) + { + StringCopy(dest, gPokeblockNames[flavor + 1]); + return TRUE; + } + } + return FALSE; +} diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c new file mode 100644 index 000000000..2f2ce2f8f --- /dev/null +++ b/src/pokeblock_feed.c @@ -0,0 +1,1012 @@ +#include "global.h" +#include "task.h" +#include "palette.h" +#include "main.h" +#include "menu_helpers.h" +#include "text.h" +#include "text_window.h" +#include "menu.h" +#include "overworld.h" +#include "decompress.h" +#include "data2.h" +#include "sprite.h" +#include "item_use.h" +#include "pokeblock.h" +#include "party_menu.h" +#include "strings.h" +#include "string_util.h" +#include "m4a.h" +#include "field_effect.h" +#include "sound.h" +#include "trig.h" +#include "ewram.h" + +extern struct MusicPlayerInfo gMPlay_BGM; +extern u8 gPokeblockMonID; +extern s16 gPokeblockGain; + +extern const u8 gPokeblockRed_Pal[]; +extern const u8 gPokeblockBlue_Pal[]; +extern const u8 gPokeblockPink_Pal[]; +extern const u8 gPokeblockGreen_Pal[]; +extern const u8 gPokeblockYellow_Pal[]; +extern const u8 gPokeblockPurple_Pal[]; +extern const u8 gPokeblockIndigo_Pal[]; +extern const u8 gPokeblockBrown_Pal[]; +extern const u8 gPokeblockLiteBlue_Pal[]; +extern const u8 gPokeblockOlive_Pal[]; +extern const u8 gPokeblockGray_Pal[]; +extern const u8 gPokeblockBlack_Pal[]; +extern const u8 gPokeblockWhite_Pal[]; +extern const u8 gPokeblockGold_Pal[]; +extern const u8 gPokeblock_Gfx[]; +extern const u8 gBattleTerrainTiles_Building[]; +extern const u8 gUnknown_08E782FC[]; +extern const u8 gBattleTerrainPalette_BattleTower[]; +extern const struct CompressedSpriteSheet gUnknown_083F7F74; +extern const struct CompressedSpritePalette gUnknown_083F7F7C; + +bool8 IsPokeSpriteNotFlipped(u16 species); + +// this file's functions +static void sub_8147B04(void); +static void sub_81481DC(void); +static void sub_814825C(void); +static u8 sub_81480B4(void); +static u8 CreatePokeblockSprite(void); +static u8 PokeblockFeed_CreatePokeSprite(struct Pokemon* mon); +static bool8 sub_8147B20(struct Pokemon* mon); +static void LaunchPokeblockFeedTask(u8); +static void sub_8148044(u8); +static void sub_8148078(struct Sprite* sprite); +static void Task_PrintAtePokeblockText(u8 taskID); +static void Task_PaletteFadeToReturn(u8 taskID); +static void SetPokeblockFeedSpritePal(u8); +static void sub_8148108(u8, bool8); +static bool8 sub_8148540(void); +static bool8 sub_81485CC(void); +static bool8 FreePokeSpriteMatrix(void); +void sub_8148710(void); +static void SpriteCB_ThrownPokeblock(struct Sprite* sprite); +static void sub_814862C(void); + +// EWRAM +EWRAM_DATA static struct CompressedSpritePalette sPokeblockFeedSpritePal = {0}; + +// IWRAM common +struct Sprite* gPokeblockFeedPokeSprite; +u16 gPokeblockFeedMonSpecies; +bool8 gPokeblockMonNotFlipped; +u8 gPokeblockFeedMonSpriteID; +u8 gPokeblockFeedMonNature; +u16 gUnknown_03005F34; +u8 gPokeblockFeedUnused0; +u8 gUnknown_03005F3C; +u8 gUnknown_03005F40; +struct Sprite gPokeblockFeedPokeSpriteCopy; +u16 gUnknown_03005F94; +s16 gUnknown_03005FA0[24]; + +// rodata + +static const u8 sNatureToMonPokeblockAnim[][2] = +{ + { 0, 0 }, // HARDY + { 3, 0 }, // LONELY + { 4, 1 }, // BRAVE + { 5, 0 }, // ADAMANT + { 10, 0 }, // NAUGHTY + { 13, 0 }, // BOLD + { 15, 0 }, // DOCILE + { 16, 2 }, // RELAXED + { 18, 0 }, // IMPISH + { 19, 0 }, // LAX + { 20, 0 }, // TIMID + { 25, 0 }, // HASTY + { 27, 3 }, // SERIOUS + { 28, 0 }, // JOLLY + { 29, 0 }, // NAIVE + { 33, 4 }, // MODEST + { 36, 0 }, // MILD + { 37, 0 }, // QUIET + { 39, 0 }, // BASHFUL + { 42, 0 }, // RASH + { 45, 0 }, // CALM + { 46, 5 }, // GENTLE + { 47, 6 }, // SASSY + { 48, 0 }, // CAREFUL + { 53, 0 }, // QUIRKY +}; + +static const s16 sMonPokeblockAnims[][10] = +{ + // HARDY + { 0, 4, 0, 8, 24, 0, 0, 0, 12, 0}, + { 0, 4, 0, 16, 24, 0, 0, 0, 12, 0}, + { 0, 4, 0, 32, 32, 0, 0, 0, 16, 1}, + + // LONELY + { 0, 3, 6, 0, 48, 0, 0, 0, 24, 1}, + + // BRAVE + { 64, 16, -24, 0, 32, 0, 0, 0, 0, 1}, + + // ADAMANT + { 0, 4, 8, 0, 16, 0, -8, 0, 0, 0}, + { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0}, + { 0, 4, 8, 0, 16, 0, -8, 0, 0, 0}, + { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0}, + { 0, 4, -16, 0, 4, 0, 16, 0, 0, 1}, + + // NAUGHTY + { 0, 3, 6, 0, 12, 0, 0, 0, 6, 0}, + { 0, 3, -6, 0, 12, 0, 0, 0, 6, 0}, + { 0, 16, 16, 0, 45, 1, 0, 0, 0, 1}, + + // BOLD + { 0, 16, 0, 24, 32, 0, 0, 0, 16, 0}, + { 0, 16, 0, 23, 32, 0, 0, 0, 16, 1}, + + // DOCILE + { 0, 0, 0, 0, 80, 0, 0, 0, 0, 1}, + + // RELAXED + { 0, 2, 8, 0, 32, 0, 0, 0, 0, 0}, + { 0, 2, -8, 0, 32, 0, 0, 0, 0, 1}, + + // IMPISH + { 0, 32, 2, 1, 48, 1, 0, 0, 24, 1}, + + // LAX + { 0, 2, 16, 16, 128, 0, 0, 0, 0, 1}, + + // TIMID + { 0, 2, -8, 0, 48, 0, -24, 0, 0, 0}, + { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, + { 64, 32, 2, 0, 36, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, + { 0, 2, 8, 0, 48, 0, 24, 0, 0, 1}, + + // HASTY + { 64, 24, 16, 0, 32, 0, 0, 0, 0, 0}, + { 0, 28, 2, 1, 32, 1, 0, 0, 16, 1}, + + // SERIOUS + { 0, 0, 0, 0, 32, 0, 0, 0, 0, 1}, + + // JOLLY + { 64, 16, -16, 2, 48, 0, 0, 0, 32, 1}, + + // NAIVE + { 0, 12, -8, 4, 24, 0, 8, 0, 12, 0}, + { 0, 12, 8, 8, 24, 0, -16, 0, 12, 0}, + { 0, 12, -8, 16, 24, 0, 16, 0, 12, 0}, + { 0, 12, 8, 28, 24, 0, -8, 0, 12, 1}, + + // MODEST + { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, + { 64, 16, -4, 0, 32, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 8, 0, 0, 0, 0, 1}, + + // MILD + { 128, 4, 0, 8, 64, 0, 0, 0, 0, 1}, + + // QUIET + { 0, 2, 16, 0, 48, 0, 0, 0, 0, 0}, + { 128, 2, 16, 0, 48, 0, 0, 0, 0, 1}, + + // BASHFUL + { 0, 2, -4, 0, 48, 0, -48, 0, 0, 0}, + { 0, 0, 0, 0, 80, 0, 0, 0, 0, 0}, + { 0, 2, 8, 0, 24, 0, 48, 0, 0, 1}, + + // RASH + { 64, 4, 64, 58, 52, 0, -88, 0, 0, 0}, + { 0, 0, 0, 0, 80, 0, 0, 0, 0, 0}, + { 0, 24, 80, 0, 32, 0, 88, 0, 0, 1}, + + // CALM + { 0, 2, 16, 4, 64, 0, 0, 0, 0, 1}, + + // GENTLE + { 0, 0, 0, 0, 32, 0, 0, 0, 0, 1}, + + // SASSY + { 0, 0, 0, 0, 42, 0, 0, 0, 0, 1}, + + // CAREFUL + { 0, 4, 0, 8, 24, 0, 0, 0, 12, 0}, + { 0, 0, 0, 0, 12, 0, 0, 0, 0, 0}, + { 0, 4, 0, 12, 24, 0, 0, 0, 12, 0}, + { 0, 0, 0, 0, 12, 0, 0, 0, 0, 0}, + { 0, 4, 0, 4, 24, 0, 0, 0, 12, 1}, + + // QUIRKY + { 0, 4, 16, 12, 64, 0, 0, 0, 0, 0}, + { 0, -4, 16, 12, 64, 0, 0, 0, 0, 1}, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411E90[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411EA0[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 12, 1), + AFFINEANIMCMD_FRAME(0, 0, 0, 30), + AFFINEANIMCMD_FRAME(0, 0, -12, 1), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411EC0[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 12, 1), + AFFINEANIMCMD_FRAME(0, 0, 0, 28), + AFFINEANIMCMD_FRAME(0, 0, -4, 3), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411EE8[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411F08[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411F30[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411F50[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411F78[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411F98[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411FC0[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 24), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 4), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8411FE0[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 24), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 4), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8412008[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 2), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8412028[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 2), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_8412050[] = +{ + sSpriteAffineAnim_8411E90, + sSpriteAffineAnim_8411EA0, + sSpriteAffineAnim_8411EE8, + sSpriteAffineAnim_8411F30, + sSpriteAffineAnim_8411F78, + sSpriteAffineAnim_8411FC0, + sSpriteAffineAnim_8412008, + sSpriteAffineAnim_8411E90, + sSpriteAffineAnim_8411E90, + sSpriteAffineAnim_8411E90, + sSpriteAffineAnim_8411E90, + sSpriteAffineAnim_8411EC0, + sSpriteAffineAnim_8411F08, + sSpriteAffineAnim_8411F50, + sSpriteAffineAnim_8411F98, + sSpriteAffineAnim_8411FE0, + sSpriteAffineAnim_8412028, + sSpriteAffineAnim_8411E90, + sSpriteAffineAnim_8411E90, + sSpriteAffineAnim_8411E90, + sSpriteAffineAnim_8411E90, +}; + +static const u8* const sPokeblocksPals[] = +{ + gPokeblockRed_Pal, + gPokeblockBlue_Pal, + gPokeblockPink_Pal, + gPokeblockGreen_Pal, + gPokeblockYellow_Pal, + gPokeblockPurple_Pal, + gPokeblockIndigo_Pal, + gPokeblockBrown_Pal, + gPokeblockLiteBlue_Pal, + gPokeblockOlive_Pal, + gPokeblockGray_Pal, + gPokeblockBlack_Pal, + gPokeblockWhite_Pal, + gPokeblockGold_Pal +}; + +static const union AffineAnimCmd sSpriteAffineAnim_84120DC[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_84120EC[] = +{ + sSpriteAffineAnim_84120DC +}; + +static const union AffineAnimCmd sSpriteAffineAnim_84120F0[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1), + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_8412148[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1), + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_84121A0[] = +{ + sSpriteAffineAnim_84120DC +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_84121A4[] = +{ + sSpriteAffineAnim_84120F0 +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_84121A8[] = +{ + sSpriteAffineAnim_8412148 +}; + +static const struct OamData sThrownPokeblockOamData = +{ + .y = 0, + .affineMode = 3, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sThrownPokeblockSpriteAnim[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sThrownPokeblockAnimTable[] = +{ + sThrownPokeblockSpriteAnim, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_84121C0[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(-8, -8, 0, 1), + AFFINEANIMCMD_JUMP(1) +}; + +static const union AffineAnimCmd *const sThrownPokeblockAffineAnimTable[] = +{ + sSpriteAffineAnim_84121C0 +}; + +static const struct CompressedSpriteSheet sUnknown_084121DC = +{ + gPokeblock_Gfx, 0x20, 14818 +}; + +static const struct SpriteTemplate sThrownPokeblockSpriteTemplate = +{ + .tileTag = 14818, + .paletteTag = 14818, + .oam = &sThrownPokeblockOamData, + .anims = sThrownPokeblockAnimTable, + .images = NULL, + .affineAnims = sThrownPokeblockAffineAnimTable, + .callback = SpriteCB_ThrownPokeblock +}; + +// code + +static void CB2_PokeblockFeed(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); +} + +static void VBlankCB_PokeblockFeed(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static bool8 TransitionToPokeblockFeedScene(void) +{ + switch (gMain.state) + { + case 0: + ClearVideoCallbacks(); + sub_80F9368(); + sub_8147B04(); + gMain.state++; + break; + case 1: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = 1; + gMain.state++; + break; + case 2: + ResetSpriteData(); + gMain.state++; + break; + case 3: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 4: + Text_LoadWindowTemplate(&gWindowTemplate_81E6E50); + gMain.state++; + break; + case 5: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50); + gMain.state++; + break; + case 6: + if (MultistepInitMenuWindowContinue()) + { + ewram1FFFF = 0; + gMain.state++; + } + break; + case 7: + if (sub_8147B20(&gPlayerParty[gPokeblockMonID])) + { + gMain.state++; + } + break; + case 8: + ewram1FFFD = sub_81480B4(); + gMain.state++; + break; + case 9: + ewram1FFFE = PokeblockFeed_CreatePokeSprite(&gPlayerParty[gPokeblockMonID]); + gMain.state++; + break; + case 10: + Menu_DrawStdWindowFrame(0, 14, 29, 19); + gMain.state++; + break; + case 11: + if (sub_8055870() != 1) + { + gMain.state++; + } + break; + case 12: + { + u16 savedIME = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIME; + REG_DISPSTAT |= 8; + SetVBlankCallback(VBlankCB_PokeblockFeed); + gMain.state++; + } + case 13: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + SetMainCallback2(CB2_PokeblockFeed); + return TRUE; + } + return FALSE; +} + +void CB2_PreparePokeblockFeedScene(void) +{ + while (1) + { + if (TransitionToPokeblockFeedScene() == 1) + { + LaunchPokeblockFeedTask(1); + break; + } + if (sub_80F9344() == 1) + break; + } +} + +static void sub_8147B04(void) +{ + REG_BG1CNT = 0x1D02l; + REG_DISPCNT = 0x1340; +} + +static bool8 sub_8147B20(struct Pokemon* mon) +{ + u16 species; + u32 PiD, TiD; + switch (ewram1FFFF) + { + case 0: + species = GetMonData(mon, MON_DATA_SPECIES2); + PiD = GetMonData(mon, MON_DATA_PERSONALITY); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_081FAF4C[1], species, PiD); + ewram1FFFF++; + break; + case 1: + { + const struct CompressedSpritePalette* palette; + + species = GetMonData(mon, MON_DATA_SPECIES2); + PiD = GetMonData(mon, MON_DATA_PERSONALITY); + TiD = GetMonData(mon, MON_DATA_OT_ID); + palette = GetMonSpritePalStructFromOtIdPersonality(species, TiD, PiD); + LoadCompressedObjectPalette(palette); + GetMonSpriteTemplate_803C56C(palette->tag, 1); + ewram1FFFF++; + } + break; + case 2: + LoadCompressedObjectPic(&gUnknown_083F7F74); + ewram1FFFF++; + break; + case 3: + LoadCompressedObjectPalette(&gUnknown_083F7F7C); + ewram1FFFF++; + break; + case 4: + LoadCompressedObjectPic(&sUnknown_084121DC); + ewram1FFFF++; + break; + case 5: + SetPokeblockFeedSpritePal(gSpecialVar_ItemId); + LoadCompressedObjectPalette(&sPokeblockFeedSpritePal); + ewram1FFFF++; + break; + case 6: + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM)); + ewram1FFFF++; + break; + case 7: + LZDecompressVram(gUnknown_08E782FC, (void*)(VRAM + 0xE800)); + ewram1FFFF++; + break; + case 8: + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + ewram1FFFF = 0; + return TRUE; + } + return FALSE; +} + +static void SetPokeblockFeedSpritePal(u8 pkbID) +{ + u8 color = GetPokeblockData(&gSaveBlock1.pokeblocks[pkbID], PBLOCK_COLOR); + sPokeblockFeedSpritePal.data = sPokeblocksPals[color - 1]; + sPokeblockFeedSpritePal.tag = 0x39E2; +} + +static void sub_8147CC8(u8 taskID) +{ + if (!gPaletteFade.active) + { + switch (gTasks[taskID].data[0]) + { + case 0: + gUnknown_03005F3C = 0; + gUnknown_03005F94 = 0; + sub_81481DC(); + break; + case 255: + sub_8148108(ewram1FFFD, gTasks[taskID].data[1]); + break; + case 269: + ewram1FFFC = CreatePokeblockSprite(); + break; + case 281: + sub_8148044(ewram1FFFE); + break; + case 297: + gTasks[taskID].func = Task_PrintAtePokeblockText; + return; + } + if (gUnknown_03005F94 < gUnknown_03005F34) + sub_814825C(); + else if (gUnknown_03005F94 == gUnknown_03005F34) + gTasks[taskID].data[0] = 254; + + gUnknown_03005F94++; + gTasks[taskID].data[0]++; + } +} + +static void LaunchPokeblockFeedTask(u8 a0) +{ + u8 taskID = CreateTask(sub_8147CC8, 0); + gTasks[taskID].data[0] = 0; + gTasks[taskID].data[1] = a0; +} + +static void Task_WaitForAtePokeblockText(u8 taskID) +{ + if (Menu_UpdateWindowText() == 1) + gTasks[taskID].func = Task_PaletteFadeToReturn; +} + +static void Task_PrintAtePokeblockText(u8 taskID) +{ + struct Pokemon* mon = &gPlayerParty[gPokeblockMonID]; + struct Pokeblock* pokeblock = &gSaveBlock1.pokeblocks[gSpecialVar_ItemId]; + + gPokeblockGain = PokeblockGetGain(GetNature(mon), pokeblock); + GetMonNickname(mon, gStringVar1); + PokeblockCopyName(pokeblock, gStringVar2); + + if (gPokeblockGain == 0) + StringExpandPlaceholders(gStringVar4, gContestStatsText_NormallyAte); + else if (gPokeblockGain > 0) + StringExpandPlaceholders(gStringVar4, gContestStatsText_HappilyAte); + else + StringExpandPlaceholders(gStringVar4, gContestStatsText_DisdainfullyAte); + + MenuPrintMessage(gStringVar4, 1, 15); + gTasks[taskID].func = Task_WaitForAtePokeblockText; +} + +static void Task_ReturnAfterPaletteFade(u8 taskID) +{ + if (!gPaletteFade.active) + { + m4aMPlayVolumeControl(&gMPlay_BGM, -1, 256); + SetMainCallback2(gMain.savedCallback); + DestroyTask(taskID); + } +} + +static void Task_PaletteFadeToReturn(u8 taskID) +{ + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = Task_ReturnAfterPaletteFade; +} + +static u8 PokeblockFeed_CreatePokeSprite(struct Pokemon* mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2); + u8 spriteID = CreateSprite(&gUnknown_02024E8C, 48, 80, 2); + + gPokeblockFeedMonSpecies = species; + gPokeblockFeedMonSpriteID = spriteID; + gPokeblockFeedMonNature = GetNature(mon); + gSprites[spriteID].data[2] = species; + gSprites[spriteID].callback = SpriteCallbackDummy; + gPokeblockMonNotFlipped = 1; + if (!IsPokeSpriteNotFlipped(species)) + { + gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84120EC; + gSprites[spriteID].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[spriteID], gSprites[spriteID].oam.shape, gSprites[spriteID].oam.size, gSprites[spriteID].oam.affineMode); + gPokeblockMonNotFlipped = 0; + } + return spriteID; +} + +static void sub_8148044(u8 spriteID) +{ + gSprites[spriteID].pos1.x = 48; + gSprites[spriteID].pos1.y = 80; + gSprites[spriteID].data[0] = -8; + gSprites[spriteID].data[1] = 1; + gSprites[spriteID].callback = sub_8148078; +} + +static void sub_8148078(struct Sprite* sprite) +{ + sprite->pos1.x += 4; + sprite->pos1.y += sprite->data[0]; + sprite->data[0] += sprite->data[1]; + if (sprite->data[0] == 0) + PlayCry1(sprite->data[2], 0); + if (sprite->data[0] == 9) + sprite->callback = SpriteCallbackDummy; +} + +static u8 sub_81480B4(void) +{ + u8 spriteID = sub_810BA50(188, 100, 2); + gSprites[spriteID].oam.affineMode = 1; + gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84121A0; + gSprites[spriteID].callback = SpriteCallbackDummy; + InitSpriteAffineAnim(&gSprites[spriteID]); + return spriteID; +} + +static void sub_8148108(u8 spriteID, bool8 a1) +{ + FreeOamMatrix(gSprites[spriteID].oam.matrixNum); + gSprites[spriteID].oam.affineMode = 3; + if (!a1) + gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84121A4; + else + gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84121A8; + InitSpriteAffineAnim(&gSprites[spriteID]); +} + +static u8 CreatePokeblockSprite(void) +{ + u8 spriteID = CreateSprite(&sThrownPokeblockSpriteTemplate, 174, 84, 1); + gSprites[spriteID].data[0] = -12; + gSprites[spriteID].data[1] = 1; + return spriteID; +} + +static void SpriteCB_ThrownPokeblock(struct Sprite* sprite) +{ + sprite->pos1.x -= 4; + sprite->pos1.y += sprite->data[0]; + sprite->data[0] += sprite->data[1]; + if (sprite->data[0] == 10) + DestroySprite(sprite); +} + +static void sub_81481DC(void) +{ + u8 animID, i; + + gUnknown_03005F34 = 1; + animID = sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][0]; + for (i = 0; i < 8; i++, animID++) + { + gUnknown_03005F34 += sMonPokeblockAnims[animID][4]; + if (sMonPokeblockAnims[animID][9] == 1) + break; + } +} + +static void sub_814825C(void) +{ + switch (gUnknown_03005F3C) + { + case 0: + gUnknown_03005F40 = sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][0]; + gPokeblockFeedPokeSprite = &gSprites[gPokeblockFeedMonSpriteID]; + gPokeblockFeedPokeSpriteCopy = *gPokeblockFeedPokeSprite; + gUnknown_03005F3C = 10; + break; + case 1 ... 9: + break; + case 10: + sub_8148540(); + if (sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][1] != 0) + { + gPokeblockFeedPokeSprite->oam.affineMode = 3; + gPokeblockFeedPokeSprite->oam.matrixNum = 0; + gPokeblockFeedPokeSprite->affineAnims = sSpriteAffineAnimTable_8412050; + InitSpriteAffineAnim(gPokeblockFeedPokeSprite); + } + gUnknown_03005F3C = 50; + case 50: + if (sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][1] != 0) + { + if (gPokeblockMonNotFlipped == 0) + StartSpriteAffineAnim(gPokeblockFeedPokeSprite, sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][1] + 10); + else + StartSpriteAffineAnim(gPokeblockFeedPokeSprite, sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][1]); + } + gUnknown_03005F3C = 60; + break; + case 60: + if (sub_81485CC() == 1) + { + if (gUnknown_03005FA0[9] == 0) + { + gUnknown_03005F40++; + sub_8148540(); + gUnknown_03005F3C = 60; + } + else + { + FreeOamMatrix(gPokeblockFeedPokeSprite->oam.matrixNum); + gUnknown_03005F3C = 70; + } + } + break; + case 70: + FreePokeSpriteMatrix(); + gUnknown_03005F40 = 0; + gUnknown_03005F3C = 0; + break; + case 71 ... 90: + break; + } +} + +static bool8 sub_8148540(void) +{ + u8 i; + for (i = 0; i < 10; i++) + gUnknown_03005FA0[i] = sMonPokeblockAnims[gUnknown_03005F40][i]; + if (gUnknown_03005FA0[4] == 0) + return TRUE; + else + { + gUnknown_03005FA0[10] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2]); + gUnknown_03005FA0[11] = Cos(gUnknown_03005FA0[0], gUnknown_03005FA0[3]); + gUnknown_03005FA0[12] = gUnknown_03005FA0[4]; + gUnknown_03005FA0[13] = gPokeblockFeedPokeSprite->pos2.x; + gUnknown_03005FA0[14] = gPokeblockFeedPokeSprite->pos2.y; + sub_8148710(); + gUnknown_03005FA0[4] = gUnknown_03005FA0[12]; + sub_814862C(); + gUnknown_03005FA0[4] = gUnknown_03005FA0[12]; + return FALSE; + } +} + +static bool8 sub_81485CC(void) +{ + u16 var = gUnknown_03005FA0[12] - gUnknown_03005FA0[4]; + + gPokeblockFeedPokeSprite->pos2.x = ewram1D000_2[var]; + gPokeblockFeedPokeSprite->pos2.y = ewram1D400[var]; + + if (--gUnknown_03005FA0[4] == 0) + return TRUE; + else + return FALSE; +} + +static bool8 FreePokeSpriteMatrix(void) +{ + FreeSpriteOamMatrix(gPokeblockFeedPokeSprite); + return FALSE; +} + +static void sub_814862C(void) +{ + u16 i; + u16 r8 = gUnknown_03005FA0[8]; + u16 r7 = gUnknown_03005FA0[12] - r8; + s16 var3 = gUnknown_03005FA0[13] + gUnknown_03005FA0[6]; + s16 r9 = gUnknown_03005FA0[14] + gUnknown_03005FA0[7]; + + for (i = 0; i < r7 - 1; i++) + { + s16* r3 = &ewram1D000_2[r8 + i]; + s16 r1 = *r3 - (var3); + + s16* r5 = &ewram1D400[r8 + i]; + s16 r4 = *r5 - r9; + + *r3 -= r1 * (i + 1) / r7; + *r5 -= r4 * (i + 1) / r7; + } + + ewram1D000_2[(r8 + r7) - 1] = var3; + ewram1D400[(r8 + r7) - 1] = r9; +} + +void sub_8148710(void) +{ + bool8 var_24 = FALSE; + s16 r8 = gUnknown_03005FA0[13] - gUnknown_03005FA0[10]; + s16 r7 = gUnknown_03005FA0[14] - gUnknown_03005FA0[11]; + while (1) + { + u16 r5; + u16 r4; + u16 var; + + var = abs(gUnknown_03005FA0[5]); + r5 = var + gUnknown_03005FA0[3]; + gUnknown_03005FA0[3] = r5; + + if (gUnknown_03005FA0[2] < 0) + var_24 = TRUE; + + r4 = gUnknown_03005FA0[12] - gUnknown_03005FA0[4]; + + if (gUnknown_03005FA0[4] == 0) + break; + + if (!var_24) + { + ewram1D000_2[r4] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2] + r5 / 256) + r8; + ewram1D400[r4] = Cos(gUnknown_03005FA0[0], gUnknown_03005FA0[3] + r5 / 256) + r7; + } + else + { + ewram1D000_2[r4] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2] - r5 / 256) + r8; + ewram1D400[r4] = Cos(gUnknown_03005FA0[0], gUnknown_03005FA0[3] - r5 / 256) + r7; + } + + gUnknown_03005FA0[0] += gUnknown_03005FA0[1]; + gUnknown_03005FA0[0] &= 0xFF; + gUnknown_03005FA0[4]--; + } +} diff --git a/src/pokedex.c b/src/pokedex.c new file mode 100644 index 000000000..711dc69fa --- /dev/null +++ b/src/pokedex.c @@ -0,0 +1,5519 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "pokedex.h" +#include "battle.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "graphics.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "menu_cursor.h" +#include "palette.h" +#include "pokedex_area_screen.h" +#include "pokedex_cry_screen.h" +#include "pokemon.h" +#include "random.h" +#include "overworld.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "trig.h" +#include "scanline_effect.h" +#include "ewram.h" + +#define NATIONAL_DEX_COUNT 386 + +struct PokedexListItem +{ + u16 dexNum; + u16 seen:1; + u16 owned:1; +}; + +struct PokedexView +{ + struct PokedexListItem unk0[NATIONAL_DEX_COUNT]; + u16 unk608; + u8 unk60A_1:1; + u8 unk60A_2:1; + u8 unk60B; + u16 pokemonListCount; + u16 selectedPokemon; + u16 unk610; + u16 dexMode; + u16 unk614; + u16 dexOrder; + u16 unk618; + u16 unk61A; + u16 unk61C; + u16 unk61E[4]; + u16 selectedMonSpriteId; + u16 unk628; + u16 unk62A; + u8 unk62C; + u8 unk62D; + u8 unk62E; + u8 unk62F; + s16 unk630; + s16 unk632; + u16 unk634; + u16 unk636; + u16 unk638; + u16 unk63A[4]; + u8 filler642[8]; + u8 unk64A; + u8 unk64B; + u8 unk64C_1:1; + u8 selectedScreen; + u8 descriptionPageNum; + u8 unk64F; + u8 menuIsOpen; //menuIsOpen + u8 unk651; + u16 menuCursorPos; //Menu cursor position + s16 menuY; //Menu Y position (inverted because we use REG_BG0VOFS for this) + u8 unk656[8]; + u8 unk65E[8]; +}; + +enum +{ + DEX_MODE_HOENN, + DEX_MODE_NATIONAL +}; + +enum +{ + PAGE_SCREEN, + AREA_SCREEN, + CRY_SCREEN, + SIZE_SCREEN +}; + +struct PokedexEntry +{ + /*0x00*/ u8 categoryName[12]; + /*0x0C*/ u16 height; //in decimeters + /*0x0E*/ u16 weight; //in hectograms + /*0x10*/ const u8 *descriptionPage1; + /*0x14*/ const u8 *descriptionPage2; + /*0x18*/ u16 unused; + /*0x1A*/ u16 pokemonScale; + /*0x1C*/ u16 pokemonOffset; + /*0x1E*/ u16 trainerScale; + /*0x20*/ u16 trainerOffset; +}; /*size = 0x24*/ + +struct UnknownStruct2 +{ + const u8 *text1; + const u8 *text2; +}; + +struct UnknownStruct1 +{ + const struct UnknownStruct2 *unk0; + u8 unk4; + u8 unk5; + u16 unk6; +}; + +struct UnknownStruct3 +{ + const u8 *text; + u8 unk4; + u8 unk5; + u8 unk6; +}; + +struct UnknownStruct4 +{ + const u8 *text; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; + u8 unk8; + u8 unk9; +}; + +extern struct MusicPlayerInfo gMPlay_BGM; +extern u8 gReservedSpritePaletteCount; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u8 gUnknown_03005E98; +extern const u8 gPokedexMenu_Gfx[]; +extern const u8 gUnknown_08E96738[]; +extern const u8 gUnknown_08E96888[]; +extern const u8 gUnknown_08E96994[]; +extern const u8 gUnknown_08E9C6DC[]; +extern const u8 gUnknown_08E96BD4[]; +extern const u8 gUnknown_08E96ACC[]; +extern const u8 gUnknown_08E96B58[]; +extern const u16 gPokedexMenu_Pal[]; +extern const u16 gPokedexMenu2_Pal[]; +extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; +extern const struct MonCoords gTrainerFrontPicCoords[]; +extern const struct PokedexEntry gPokedexEntries[]; +extern const u8 gPokedexMenuSearch_Gfx[]; +extern const u8 gUnknown_08E96D2C[]; +extern const u16 gPokedexMenuSearch_Pal[]; +extern const u8 gTypeNames[][7]; +extern const u8 gPokedexMenu2_Gfx[]; + +static EWRAM_DATA struct PokedexView *gPokedexView = NULL; +static EWRAM_DATA u16 gUnknown_0202FFB8 = 0; +static EWRAM_DATA u8 gUnknown_0202FFBA = 0; +static EWRAM_DATA struct PokedexListItem *gUnknown_0202FFBC = NULL; + +u8 gUnknown_03005CE8; +IntrCallback gUnknown_03005CEC; + +static u8 sub_8091E3C(void); + +static const u16 sPokedexSearchPalette[] = INCBIN_U16("graphics/pokedex/search.gbapal"); +static const u16 sNationalPokedexPalette[] = INCBIN_U16("graphics/pokedex/national.gbapal"); +const u8 gEmptySpacce_839F7FC[0xA4] = {0}; +static const u8 gUnknown_0839F8A0[] = INCBIN_U8("graphics/pokedex/pokedex_cry_layout.bin.lz"); +static const u8 gUnknown_0839F988[] = INCBIN_U8("graphics/pokedex/pokedex_size_layout.bin.lz"); +#if ENGLISH +static const u8 gUnknown_0839FA7C[] = INCBIN_U8("graphics/pokedex/noball.4bpp.lz"); +#elif GERMAN +extern const u8 gUnknown_0839FA7C[]; +#endif + +#include "data/pokedex_orders.h" +static const struct OamData gOamData_83A0404 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A040C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A0414 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A041C = +{ + .y = 160, + .affineMode = 0, + .objMode = 2, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A0424 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83A042C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 2, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_83A0434[] = +{ + ANIMCMD_FRAME(3, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A043C[] = +{ + ANIMCMD_FRAME(1, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0444[] = +{ + ANIMCMD_FRAME(16, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A044C[] = +{ + ANIMCMD_FRAME(32, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0454[] = +{ + ANIMCMD_FRAME(64, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A045C[] = +{ + ANIMCMD_FRAME(96, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0464[] = +{ + ANIMCMD_FRAME(128, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A046C[] = +{ + ANIMCMD_FRAME(160, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0474[] = +{ + ANIMCMD_FRAME(192, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A047C[] = +{ + ANIMCMD_FRAME(224, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0484[] = +{ + ANIMCMD_FRAME(226, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A048C[] = +{ + ANIMCMD_FRAME(228, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A0494[] = +{ + ANIMCMD_FRAME(230, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A049C[] = +{ + ANIMCMD_FRAME(232, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04A4[] = +{ + ANIMCMD_FRAME(234, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04AC[] = +{ + ANIMCMD_FRAME(236, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04B4[] = +{ + ANIMCMD_FRAME(238, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04BC[] = +{ + ANIMCMD_FRAME(240, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04C4[] = +{ + ANIMCMD_FRAME(242, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83A04CC[] = +{ + ANIMCMD_FRAME(4, 30), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04D4[] = +{ + gSpriteAnim_83A0434, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04D8[] = +{ + gSpriteAnim_83A043C, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04DC[] = +{ + gSpriteAnim_83A0444, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04E0[] = +{ + gSpriteAnim_83A044C, + gSpriteAnim_83A0454, + gSpriteAnim_83A045C, + gSpriteAnim_83A0464, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04F0[] = +{ + gSpriteAnim_83A046C, + gSpriteAnim_83A0474, +}; +static const union AnimCmd *const gSpriteAnimTable_83A04F8[] = +{ + gSpriteAnim_83A047C, + gSpriteAnim_83A0484, + gSpriteAnim_83A048C, + gSpriteAnim_83A0494, + gSpriteAnim_83A049C, + gSpriteAnim_83A04A4, + gSpriteAnim_83A04AC, + gSpriteAnim_83A04B4, + gSpriteAnim_83A04BC, + gSpriteAnim_83A04C4, +}; +static const union AnimCmd *const gSpriteAnimTable_83A0520[] = +{ + gSpriteAnim_83A04CC, +}; +static void sub_808EF38(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A0524 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A0404, + .anims = gSpriteAnimTable_83A04D4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808EF38, +}; +static void sub_808EF8C(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A053C = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A040C, + .anims = gSpriteAnimTable_83A04D8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808EF8C, +}; +static void sub_808F08C(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A0554 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A0414, + .anims = gSpriteAnimTable_83A04E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808F08C, +}; +static void sub_808F0B4(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A056C = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A041C, + .anims = gSpriteAnimTable_83A04DC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808F0B4, +}; +static void sub_808ED94(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A0584 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A0424, + .anims = gSpriteAnimTable_83A04F0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808ED94, +}; +static const struct SpriteTemplate gSpriteTemplate_83A059C = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A042C, + .anims = gSpriteAnimTable_83A04F8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808ED94, +}; +static void sub_808F168(struct Sprite *); +static const struct SpriteTemplate gSpriteTemplate_83A05B4 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83A042C, + .anims = gSpriteAnimTable_83A0520, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_808F168, +}; +static const struct CompressedSpriteSheet gUnknown_083A05CC[] = +{ + {gPokedexMenu2_Gfx, 0x1F00, 0x1000}, + {NULL, 0, 0}, +}; +static const struct SpritePalette gUnknown_083A05DC[] = +{ + {gPokedexMenu_Pal, 0x1000}, + {NULL, 0}, +}; +static const u8 gUnknown_083A05EC[] = {2, 4, 8, 16, 32}; +static const u8 gUnknown_083A05F1[] = {16, 8, 4, 2, 1}; +const u8 gEmptySpacce_83A05F6[] = {0, 0}; // Padding, maybe? +static const u8 gUnknown_083A05F8[] = _(""); +#if ENGLISH +#include "data/pokedex_entries_en.h" +#elif GERMAN +#include "data/pokedex_entries_de.h" +#endif +static const u16 gUnknown_083B4EC4[16] = {0}; +static const u8 *const sMonFootprintTable[] = +{ + gMonFootprint_Bulbasaur, + gMonFootprint_Bulbasaur, + gMonFootprint_Ivysaur, + gMonFootprint_Venusaur, + gMonFootprint_Charmander, + gMonFootprint_Charmeleon, + gMonFootprint_Charizard, + gMonFootprint_Squirtle, + gMonFootprint_Wartortle, + gMonFootprint_Blastoise, + gMonFootprint_Caterpie, + gMonFootprint_Metapod, + gMonFootprint_Butterfree, + gMonFootprint_Weedle, + gMonFootprint_Kakuna, + gMonFootprint_Beedrill, + gMonFootprint_Pidgey, + gMonFootprint_Pidgeotto, + gMonFootprint_Pidgeot, + gMonFootprint_Rattata, + gMonFootprint_Raticate, + gMonFootprint_Spearow, + gMonFootprint_Fearow, + gMonFootprint_Ekans, + gMonFootprint_Arbok, + gMonFootprint_Pikachu, + gMonFootprint_Raichu, + gMonFootprint_Sandshrew, + gMonFootprint_Sandslash, + gMonFootprint_NidoranF, + gMonFootprint_Nidorina, + gMonFootprint_Nidoqueen, + gMonFootprint_NidoranM, + gMonFootprint_Nidorino, + gMonFootprint_Nidoking, + gMonFootprint_Clefairy, + gMonFootprint_Clefable, + gMonFootprint_Vulpix, + gMonFootprint_Ninetales, + gMonFootprint_Jigglypuff, + gMonFootprint_Wigglytuff, + gMonFootprint_Zubat, + gMonFootprint_Golbat, + gMonFootprint_Oddish, + gMonFootprint_Gloom, + gMonFootprint_Vileplume, + gMonFootprint_Paras, + gMonFootprint_Parasect, + gMonFootprint_Venonat, + gMonFootprint_Venomoth, + gMonFootprint_Diglett, + gMonFootprint_Dugtrio, + gMonFootprint_Meowth, + gMonFootprint_Persian, + gMonFootprint_Psyduck, + gMonFootprint_Golduck, + gMonFootprint_Mankey, + gMonFootprint_Primeape, + gMonFootprint_Growlithe, + gMonFootprint_Arcanine, + gMonFootprint_Poliwag, + gMonFootprint_Poliwhirl, + gMonFootprint_Poliwrath, + gMonFootprint_Abra, + gMonFootprint_Kadabra, + gMonFootprint_Alakazam, + gMonFootprint_Machop, + gMonFootprint_Machoke, + gMonFootprint_Machamp, + gMonFootprint_Bellsprout, + gMonFootprint_Weepinbell, + gMonFootprint_Victreebel, + gMonFootprint_Tentacool, + gMonFootprint_Tentacruel, + gMonFootprint_Geodude, + gMonFootprint_Graveler, + gMonFootprint_Golem, + gMonFootprint_Ponyta, + gMonFootprint_Rapidash, + gMonFootprint_Slowpoke, + gMonFootprint_Slowbro, + gMonFootprint_Magnemite, + gMonFootprint_Magneton, + gMonFootprint_Farfetchd, + gMonFootprint_Doduo, + gMonFootprint_Dodrio, + gMonFootprint_Seel, + gMonFootprint_Dewgong, + gMonFootprint_Grimer, + gMonFootprint_Muk, + gMonFootprint_Shellder, + gMonFootprint_Cloyster, + gMonFootprint_Gastly, + gMonFootprint_Haunter, + gMonFootprint_Gengar, + gMonFootprint_Onix, + gMonFootprint_Drowzee, + gMonFootprint_Hypno, + gMonFootprint_Krabby, + gMonFootprint_Kingler, + gMonFootprint_Voltorb, + gMonFootprint_Electrode, + gMonFootprint_Exeggcute, + gMonFootprint_Exeggutor, + gMonFootprint_Cubone, + gMonFootprint_Marowak, + gMonFootprint_Hitmonlee, + gMonFootprint_Hitmonchan, + gMonFootprint_Lickitung, + gMonFootprint_Koffing, + gMonFootprint_Weezing, + gMonFootprint_Rhyhorn, + gMonFootprint_Rhydon, + gMonFootprint_Chansey, + gMonFootprint_Tangela, + gMonFootprint_Kangaskhan, + gMonFootprint_Horsea, + gMonFootprint_Seadra, + gMonFootprint_Goldeen, + gMonFootprint_Seaking, + gMonFootprint_Staryu, + gMonFootprint_Starmie, + gMonFootprint_Mrmime, + gMonFootprint_Scyther, + gMonFootprint_Jynx, + gMonFootprint_Electabuzz, + gMonFootprint_Magmar, + gMonFootprint_Pinsir, + gMonFootprint_Tauros, + gMonFootprint_Magikarp, + gMonFootprint_Gyarados, + gMonFootprint_Lapras, + gMonFootprint_Ditto, + gMonFootprint_Eevee, + gMonFootprint_Vaporeon, + gMonFootprint_Jolteon, + gMonFootprint_Flareon, + gMonFootprint_Porygon, + gMonFootprint_Omanyte, + gMonFootprint_Omastar, + gMonFootprint_Kabuto, + gMonFootprint_Kabutops, + gMonFootprint_Aerodactyl, + gMonFootprint_Snorlax, + gMonFootprint_Articuno, + gMonFootprint_Zapdos, + gMonFootprint_Moltres, + gMonFootprint_Dratini, + gMonFootprint_Dragonair, + gMonFootprint_Dragonite, + gMonFootprint_Mewtwo, + gMonFootprint_Mew, + gMonFootprint_Chikorita, + gMonFootprint_Bayleef, + gMonFootprint_Meganium, + gMonFootprint_Cyndaquil, + gMonFootprint_Quilava, + gMonFootprint_Typhlosion, + gMonFootprint_Totodile, + gMonFootprint_Croconaw, + gMonFootprint_Feraligatr, + gMonFootprint_Sentret, + gMonFootprint_Furret, + gMonFootprint_Hoothoot, + gMonFootprint_Noctowl, + gMonFootprint_Ledyba, + gMonFootprint_Ledian, + gMonFootprint_Spinarak, + gMonFootprint_Ariados, + gMonFootprint_Crobat, + gMonFootprint_Chinchou, + gMonFootprint_Lanturn, + gMonFootprint_Pichu, + gMonFootprint_Cleffa, + gMonFootprint_Igglybuff, + gMonFootprint_Togepi, + gMonFootprint_Togetic, + gMonFootprint_Natu, + gMonFootprint_Xatu, + gMonFootprint_Mareep, + gMonFootprint_Flaaffy, + gMonFootprint_Ampharos, + gMonFootprint_Bellossom, + gMonFootprint_Marill, + gMonFootprint_Azumarill, + gMonFootprint_Sudowoodo, + gMonFootprint_Politoed, + gMonFootprint_Hoppip, + gMonFootprint_Skiploom, + gMonFootprint_Jumpluff, + gMonFootprint_Aipom, + gMonFootprint_Sunkern, + gMonFootprint_Sunflora, + gMonFootprint_Yanma, + gMonFootprint_Wooper, + gMonFootprint_Quagsire, + gMonFootprint_Espeon, + gMonFootprint_Umbreon, + gMonFootprint_Murkrow, + gMonFootprint_Slowking, + gMonFootprint_Misdreavus, + gMonFootprint_Unown, + gMonFootprint_Wobbuffet, + gMonFootprint_Girafarig, + gMonFootprint_Pineco, + gMonFootprint_Forretress, + gMonFootprint_Dunsparce, + gMonFootprint_Gligar, + gMonFootprint_Steelix, + gMonFootprint_Snubbull, + gMonFootprint_Granbull, + gMonFootprint_Qwilfish, + gMonFootprint_Scizor, + gMonFootprint_Shuckle, + gMonFootprint_Heracross, + gMonFootprint_Sneasel, + gMonFootprint_Teddiursa, + gMonFootprint_Ursaring, + gMonFootprint_Slugma, + gMonFootprint_Magcargo, + gMonFootprint_Swinub, + gMonFootprint_Piloswine, + gMonFootprint_Corsola, + gMonFootprint_Remoraid, + gMonFootprint_Octillery, + gMonFootprint_Delibird, + gMonFootprint_Mantine, + gMonFootprint_Skarmory, + gMonFootprint_Houndour, + gMonFootprint_Houndoom, + gMonFootprint_Kingdra, + gMonFootprint_Phanpy, + gMonFootprint_Donphan, + gMonFootprint_Porygon2, + gMonFootprint_Stantler, + gMonFootprint_Smeargle, + gMonFootprint_Tyrogue, + gMonFootprint_Hitmontop, + gMonFootprint_Smoochum, + gMonFootprint_Elekid, + gMonFootprint_Magby, + gMonFootprint_Miltank, + gMonFootprint_Blissey, + gMonFootprint_Raikou, + gMonFootprint_Entei, + gMonFootprint_Suicune, + gMonFootprint_Larvitar, + gMonFootprint_Pupitar, + gMonFootprint_Tyranitar, + gMonFootprint_Lugia, + gMonFootprint_HoOh, + gMonFootprint_Celebi, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_QuestionMark, + gMonFootprint_Treecko, + gMonFootprint_Grovyle, + gMonFootprint_Sceptile, + gMonFootprint_Torchic, + gMonFootprint_Combusken, + gMonFootprint_Blaziken, + gMonFootprint_Mudkip, + gMonFootprint_Marshtomp, + gMonFootprint_Swampert, + gMonFootprint_Poochyena, + gMonFootprint_Mightyena, + gMonFootprint_Zigzagoon, + gMonFootprint_Linoone, + gMonFootprint_Wurmple, + gMonFootprint_Silcoon, + gMonFootprint_Beautifly, + gMonFootprint_Cascoon, + gMonFootprint_Dustox, + gMonFootprint_Lotad, + gMonFootprint_Lombre, + gMonFootprint_Ludicolo, + gMonFootprint_Seedot, + gMonFootprint_Nuzleaf, + gMonFootprint_Shiftry, + gMonFootprint_Nincada, + gMonFootprint_Ninjask, + gMonFootprint_Shedinja, + gMonFootprint_Taillow, + gMonFootprint_Swellow, + gMonFootprint_Shroomish, + gMonFootprint_Breloom, + gMonFootprint_Spinda, + gMonFootprint_Wingull, + gMonFootprint_Pelipper, + gMonFootprint_Surskit, + gMonFootprint_Masquerain, + gMonFootprint_Wailmer, + gMonFootprint_Wailord, + gMonFootprint_Skitty, + gMonFootprint_Delcatty, + gMonFootprint_Kecleon, + gMonFootprint_Baltoy, + gMonFootprint_Claydol, + gMonFootprint_Nosepass, + gMonFootprint_Torkoal, + gMonFootprint_Sableye, + gMonFootprint_Barboach, + gMonFootprint_Whiscash, + gMonFootprint_Luvdisc, + gMonFootprint_Corphish, + gMonFootprint_Crawdaunt, + gMonFootprint_Feebas, + gMonFootprint_Milotic, + gMonFootprint_Carvanha, + gMonFootprint_Sharpedo, + gMonFootprint_Trapinch, + gMonFootprint_Vibrava, + gMonFootprint_Flygon, + gMonFootprint_Makuhita, + gMonFootprint_Hariyama, + gMonFootprint_Electrike, + gMonFootprint_Manectric, + gMonFootprint_Numel, + gMonFootprint_Camerupt, + gMonFootprint_Spheal, + gMonFootprint_Sealeo, + gMonFootprint_Walrein, + gMonFootprint_Cacnea, + gMonFootprint_Cacturne, + gMonFootprint_Snorunt, + gMonFootprint_Glalie, + gMonFootprint_Lunatone, + gMonFootprint_Solrock, + gMonFootprint_Azurill, + gMonFootprint_Spoink, + gMonFootprint_Grumpig, + gMonFootprint_Plusle, + gMonFootprint_Minun, + gMonFootprint_Mawile, + gMonFootprint_Meditite, + gMonFootprint_Medicham, + gMonFootprint_Swablu, + gMonFootprint_Altaria, + gMonFootprint_Wynaut, + gMonFootprint_Duskull, + gMonFootprint_Dusclops, + gMonFootprint_Roselia, + gMonFootprint_Slakoth, + gMonFootprint_Vigoroth, + gMonFootprint_Slaking, + gMonFootprint_Gulpin, + gMonFootprint_Swalot, + gMonFootprint_Tropius, + gMonFootprint_Whismur, + gMonFootprint_Loudred, + gMonFootprint_Exploud, + gMonFootprint_Clamperl, + gMonFootprint_Huntail, + gMonFootprint_Gorebyss, + gMonFootprint_Absol, + gMonFootprint_Shuppet, + gMonFootprint_Banette, + gMonFootprint_Seviper, + gMonFootprint_Zangoose, + gMonFootprint_Relicanth, + gMonFootprint_Aron, + gMonFootprint_Lairon, + gMonFootprint_Aggron, + gMonFootprint_Castform, + gMonFootprint_Volbeat, + gMonFootprint_Illumise, + gMonFootprint_Lileep, + gMonFootprint_Cradily, + gMonFootprint_Anorith, + gMonFootprint_Armaldo, + gMonFootprint_Ralts, + gMonFootprint_Kirlia, + gMonFootprint_Gardevoir, + gMonFootprint_Bagon, + gMonFootprint_Shelgon, + gMonFootprint_Salamence, + gMonFootprint_Beldum, + gMonFootprint_Metang, + gMonFootprint_Metagross, + gMonFootprint_Regirock, + gMonFootprint_Regice, + gMonFootprint_Registeel, + gMonFootprint_Kyogre, + gMonFootprint_Groudon, + gMonFootprint_Rayquaza, + gMonFootprint_Latias, + gMonFootprint_Latios, + gMonFootprint_Jirachi, + gMonFootprint_Deoxys, + gMonFootprint_Chimecho, + gMonFootprint_Bulbasaur, +}; +static const u8 gUnknown_083B5558[] = _("{CLEAR_TO 0}"); +const u8 gUnknown_083B555C[] = INCBIN_U8("graphics/unknown/unknown_3B555C.bin"); +static const struct OamData gOamData_83B557C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static void *const gUnknown_083B5584[] = +{ + ePokedexPalAddr1, + ePokedexPalAddr2, + ePokedexPalAddr3, + ePokedexPalAddr4, +}; +static const struct SpriteFrameImage gSpriteImageTable_83B5594[] = +{ + {ewram8000, 0x800}, + {ewram8800, 0x800}, + {ewram9000, 0x800}, + {ewram9800, 0x800}, + {ewramA000, 0x800}, + {ewramA800, 0x800}, + {ewramB000, 0x800}, + {ewramB800, 0x800}, + {ewramC000, 0x800}, + {ewramC800, 0x800}, + {ewramD000, 0x800}, + {ewramD800, 0x800}, + {ewramE000, 0x800}, + {ewramE800, 0x800}, + {ewramF000, 0x800}, + {ewramF800, 0x800}, +}; +static const struct SpriteFrameImage gSpriteImageTable_83B5614[] = +{ + {ewramC000, 0x800}, + {ewramC800, 0x800}, + {ewramD000, 0x800}, + {ewramD800, 0x800}, + {ewramE000, 0x800}, + {ewramE800, 0x800}, + {ewramF000, 0x800}, + {ewramF800, 0x800}, + {ewram10000, 0x800}, + {ewram10800, 0x800}, + {ewram11000, 0x800}, + {ewram11800, 0x800}, + {ewram12000, 0x800}, + {ewram12800, 0x800}, + {ewram13000, 0x800}, + {ewram13800, 0x800}, +}; +static const struct SpriteFrameImage gSpriteImageTable_83B5694[] = +{ + {ewram10000, 0x800}, + {ewram10800, 0x800}, + {ewram11000, 0x800}, + {ewram11800, 0x800}, + {ewram12000, 0x800}, + {ewram12800, 0x800}, + {ewram13000, 0x800}, + {ewram13800, 0x800}, + {ewram14000, 0x800}, + {ewram14800, 0x800}, + {ewram15000, 0x800}, + {ewram15800, 0x800}, + {ewram16000_2, 0x800}, + {ewram16800, 0x800}, + {ewram17000, 0x800}, + {ewram17800_2, 0x800}, +}; +static const struct SpriteFrameImage gSpriteImageTable_83B5714[] = +{ + {ewram14000, 0x800}, + {ewram14800, 0x800}, + {ewram15000, 0x800}, + {ewram15800, 0x800}, + {ewram16000_2, 0x800}, + {ewram16800, 0x800}, + {ewram17000, 0x800}, + {ewram17800_2, 0x800}, + {ewram18000_2, 0x800}, + {ewram18800, 0x800}, + {ewram19000, 0x800}, + {ewram19800, 0x800}, + {ewram1A000, 0x800}, + {ewram1A800, 0x800}, + {ewram1B000_2, 0x800}, + {ewram1B800, 0x800}, +}; +static const struct SpriteFrameImage *const gUnknown_083B5794[] = +{ + gSpriteImageTable_83B5594, + gSpriteImageTable_83B5614, + gSpriteImageTable_83B5694, + gSpriteImageTable_83B5714, +}; +static void nullsub_59(struct Sprite *); +static const struct SpriteTemplate gUnknown_083B57A4 = +{ + .tileTag = 0xFFFF, + .paletteTag = 0, + .oam = &gOamData_83B557C, + .anims = NULL, + .images = gSpriteImageTable_83B5594, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = nullsub_59, +}; +static const u8 gUnknown_083B57BC[][4] = +{ + {0, 0, 0, 0}, + {CHAR_A, 3, CHAR_a, 3}, + {CHAR_D, 3, CHAR_d, 3}, + {CHAR_G, 3, CHAR_g, 3}, + {CHAR_J, 3, CHAR_j, 3}, + {CHAR_M, 3, CHAR_m, 3}, + {CHAR_P, 3, CHAR_p, 3}, + {CHAR_S, 3, CHAR_s, 3}, + {CHAR_V, 3, CHAR_v, 3}, + {CHAR_Y, 2, CHAR_y, 2}, +}; +static const struct UnknownStruct3 gUnknown_083B57E4[] = +{ + {DexText_SearchForPoke, 0, 0, 5}, + {DexText_SwitchDex, 6, 0, 5}, + {DexText_ReturnToDex, 12, 0, 5}, +}; +static const struct UnknownStruct4 gUnknown_083B57FC[] = +{ + {DexText_ListByABC, 0, 2, 5, 5, 2, 12}, + {DexText_ListByColor, 0, 4, 5, 5, 4, 12}, + {DexText_ListByType, 0, 6, 5, 5, 6, 6}, + {DexText_ListByType, 0, 6, 5, 11, 6, 6}, + {DexText_SelectDexList, 0, 8, 5, 5, 8, 12}, + {DexText_SelectDexMode, 0, 10, 5, 5, 10, 12}, + {DexText_ExecuteSearchSwitch, 0, 12, 5, 0, 0, 0}, +}; +static const u8 gUnknown_083B5850[][4] = +{ + {0xFF, 0xFF, 0xFF, 1}, + {0xFF, 0xFF, 0, 2}, + {0xFF, 3, 1, 4}, + { 2, 0xFF, 1, 4}, + {0xFF, 0xFF, 2, 5}, + {0xFF, 0xFF, 4, 6}, + {0xFF, 0xFF, 5, 0xFF}, +}; +static const u8 gUnknown_083B586C[][4] = +{ + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 5}, + {0xFF, 0xFF, 4, 6}, + {0xFF, 0xFF, 5, 0xFF}, +}; +static const u8 gUnknown_083B5888[][4] = +{ + {0xFF, 0xFF, 0xFF, 1}, + {0xFF, 0xFF, 0, 2}, + {0xFF, 3, 1, 4}, + { 2, 0xFF, 1, 4}, + {0xFF, 0xFF, 2, 6}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 4, 0xFF}, +}; +static const u8 gUnknown_083B58A4[][4] = +{ + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 6}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 4, 0xFF}, +}; +static const struct UnknownStruct2 gUnknown_083B58C0[] = +{ + {DexText_HoennDex2, DexText_HoennDex}, + {DexText_NationalDex2, DexText_NationalDex}, + {NULL, NULL}, +}; +static const struct UnknownStruct2 gUnknown_083B58D8[] = +{ + {DexText_ListByNumber, DexText_NumericalMode}, + {DexText_ListByABC2, DexText_ABCMode}, + {DexText_ListByHeavyToLightest, DexText_HeaviestMode}, + {DexText_ListByLightToHeaviest, DexText_LightestMode}, + {DexText_ListByTallToSmallest, DexText_TallestMode}, + {DexText_ListBySmallToTallest, DexText_SmallestMode}, + {NULL, NULL}, +}; +static const struct UnknownStruct2 gUnknown_083B5910[] = +{ + {DexText_Terminator5, DexText_DontSpecify}, + {DexText_Terminator5, DexText_ABC}, + {DexText_Terminator5, DexText_DEF}, + {DexText_Terminator5, DexText_GHI}, + {DexText_Terminator5, DexText_JKL}, + {DexText_Terminator5, DexText_MNO}, + {DexText_Terminator5, DexText_PQR}, + {DexText_Terminator5, DexText_STU}, + {DexText_Terminator5, DexText_VWX}, + {DexText_Terminator5, DexText_YZ}, + {NULL, NULL}, +}; +static const struct UnknownStruct2 gUnknown_083B5968[] = +{ + {DexText_Terminator5, DexText_DontSpecify}, + {DexText_Terminator5, DexText_Red}, + {DexText_Terminator5, DexText_Blue}, + {DexText_Terminator5, DexText_Yellow}, + {DexText_Terminator5, DexText_Green}, + {DexText_Terminator5, DexText_Black}, + {DexText_Terminator5, DexText_Brown}, + {DexText_Terminator5, DexText_Purple}, + {DexText_Terminator5, DexText_Gray}, + {DexText_Terminator5, DexText_White}, + {DexText_Terminator5, DexText_Pink}, + {NULL, NULL}, +}; +static const struct UnknownStruct2 gUnknown_083B59C8[] = +{ + {DexText_Terminator5, DexText_None}, + {DexText_Terminator5, gTypeNames[TYPE_NORMAL]}, + {DexText_Terminator5, gTypeNames[TYPE_FIGHTING]}, + {DexText_Terminator5, gTypeNames[TYPE_FLYING]}, + {DexText_Terminator5, gTypeNames[TYPE_POISON]}, + {DexText_Terminator5, gTypeNames[TYPE_GROUND]}, + {DexText_Terminator5, gTypeNames[TYPE_ROCK]}, + {DexText_Terminator5, gTypeNames[TYPE_BUG]}, + {DexText_Terminator5, gTypeNames[TYPE_GHOST]}, + {DexText_Terminator5, gTypeNames[TYPE_STEEL]}, + {DexText_Terminator5, gTypeNames[TYPE_FIRE]}, + {DexText_Terminator5, gTypeNames[TYPE_WATER]}, + {DexText_Terminator5, gTypeNames[TYPE_GRASS]}, + {DexText_Terminator5, gTypeNames[TYPE_ELECTRIC]}, + {DexText_Terminator5, gTypeNames[TYPE_PSYCHIC]}, + {DexText_Terminator5, gTypeNames[TYPE_ICE]}, + {DexText_Terminator5, gTypeNames[TYPE_DRAGON]}, + {DexText_Terminator5, gTypeNames[TYPE_DARK]}, + {NULL, NULL}, +}; +static const u8 gUnknown_083B5A60[] = {0, 1}; +static const u8 gUnknown_083B5A62[] = {0, 1, 2, 3, 4, 5}; +static const u8 gUnknown_083B5A68[] = {0xFF, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17}; +static const struct UnknownStruct1 gUnknown_083B5A7C[] = +{ + {gUnknown_083B5910, 6, 7, 10}, + {gUnknown_083B5968, 8, 9, 11}, + {gUnknown_083B59C8, 10, 11, 18}, + {gUnknown_083B59C8, 12, 13, 18}, + {gUnknown_083B58D8, 4, 5, 6}, + {gUnknown_083B58C0, 2, 3, 2}, +}; +static const u8 gUnknown_083B5AAC[] = _("{STR_VAR_1}{CLEAR_TO 43}"); +static const u8 gUnknown_083B5AB2[] = _("{STR_VAR_1}{CLEAR_TO 96}"); + +static void MainCB(void); +static void Task_PokedexShowMainScreen(u8 taskId); +static void Task_PokedexMainScreen(u8 taskId); +static void sub_808C898(u8 taskId); +static void Task_PokedexMainScreenMenu(u8 taskId); +static void sub_808CA64(u8 taskId); +static void sub_808CAE4(u8 taskId); +static void sub_808CB8C(u8 taskId); +static void Task_ClosePokedex(u8 taskId); +static void sub_808CCC4(u8 taskId); +static void Task_PokedexResultsScreen(u8 taskId); +static void sub_808CEF8(u8 taskId); +static void Task_PokedexResultsScreenMenu(u8 taskId); +static void sub_808D118(u8 taskId); +static void sub_808D198(u8 taskId); +static void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId); +static void Task_PokedexResultsScreenExitPokedex(u8 taskId); +static bool8 sub_808D344(u8 a); +static void sub_808D640(void); +static void SortPokedex(u8 dexMode, u8 sortMode); +static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d); +static void sub_808DF88(u16 a, u8 b, u8 c, u16 d); +static u8 sub_808DFE4(u16 num, u8 b, u8 c); +static void sub_808E090(u8 a, u8 b, u16 c); +static void sub_808E0CC(u16 a, u16 b); +static bool8 sub_808E208(u8 a, u8 b, u8 c); +static u16 sub_808E48C(u16 a, u16 b); +static void sub_808E6BC(void); +static u8 sub_808E71C(void); +static u8 sub_808E82C(void); +static u16 sub_808E888(u16 a1); +static u32 sub_808E8C8(u16 a, s16 b, s16 c); +static void sub_808E978(u8 a); +static void sub_808EDB8(struct Sprite *sprite); +static void sub_808EE28(struct Sprite *sprite); +static u8 sub_808F210(struct PokedexListItem *, u8); +static bool8 sub_808F250(u8 taskId); +static u8 sub_808F284(struct PokedexListItem *, u8); +static void Task_InitPageScreenMultistep(u8 taskId); +static void Task_PageScreenProcessInput(u8 taskId); +static void sub_808F888(u8 taskId); +static void Task_ClosePageScreen(u8 taskId); +static void Task_InitAreaScreenMultistep(u8 taskId); +static void Task_AreaScreenProcessInput(u8 taskId); +static void sub_808FA00(u8 taskId); +static void Task_InitCryScreenMultistep(u8 taskId); +static void Task_CryScreenProcessInput(u8 taskId); +static void sub_808FFBC(u8 taskId); +static void sub_8090040(u8 a); +static void Task_InitSizeScreenMultistep(u8 taskId); +static void Task_SizeScreenProcessInput(u8 taskId); +static void sub_8090498(u8 taskId); +static void sub_80904FC(u16 a); +static void sub_8090540(u16 a); +static void sub_8090584(u8 a, u16 b); +static void sub_8090644(u8 a, u16 b); +static void sub_8090750(u8); +static void sub_8090A3C(u8); +static void sub_8090B8C(u8); +static void sub_8090C28(struct Sprite *); +static void sub_8090C68(void); +static void sub_8091060(u16); +static void sub_8091154(u16 order, u8, u8); +static u8 sub_80911C8(u16 num, u8, u8); +static u8 sub_8091260(u16 num, u8, u8, u8); +static void sub_8091304(const u8 *name, u8, u8); +static void sub_8091458(u16 height, u8 i, u8 i1); +static void sub_8091564(u16 weight, u8 i, u8 i1); +void sub_8091738(u16, u16, u16); +static void sub_80917CC(u16 i, u16 i1); +static u16 sub_8091818(u8, u16, u16, u16); +u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d); +u8 sub_8091A4C(u16 gender, s16, s16, u16); +static void sub_8091E54(u8); +static void sub_809204C(u8); +static void sub_809207C(u8); +static void sub_809217C(u8); +static void sub_80921B0(u8); +static void sub_80923FC(u8); +static void sub_80924A4(u8); +static void sub_8092508(u8); +static void sub_80925CC(u8); +static void sub_8092644(u8); +static void sub_80927B8(u8); +static void sub_80927F0(u8); +static void sub_8092AB0(u8); +static void sub_8092AD4(u8, u8); +static void sub_8092B68(u8); +static void sub_8092C8C(u8); +static void sub_8092D78(u8); +static u8 sub_8092E10(u8, u8); +static void sub_8092EB0(u8); +static void sub_809308C(u8); + + +void ResetPokedex(void) +{ + u16 i; + + gUnknown_0202FFB8 = 0; + gUnknown_0202FFBA = 0x40; + gUnknown_03005CE8 = 0; + gSaveBlock2.pokedex.unknown1 = 0; + gSaveBlock2.pokedex.order = 0; + gSaveBlock2.pokedex.nationalMagic = 0; + gSaveBlock2.pokedex.unknown2 = 0; + gSaveBlock2.pokedex.unownPersonality = 0; + gSaveBlock2.pokedex.spindaPersonality = 0; + gSaveBlock2.pokedex.unknown3 = 0; + DisableNationalPokedex(); + for (i = 0; i <= 51; i++) + { + gSaveBlock2.pokedex.owned[i] = 0; + gSaveBlock2.pokedex.seen[i] = 0; + gSaveBlock1.dexSeen2[i] = 0; + gSaveBlock1.dexSeen3[i] = 0; + } +} + +void sub_808C0A0(void) +{ + gUnknown_0202FFB8 = 0; + gUnknown_0202FFBA = 0x40; +} + +static void sub_808C0B8(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void ClearPokedexView(struct PokedexView *pokedexView) +{ + u16 i; + + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + pokedexView->unk0[i].dexNum |= 0xFFFF; + pokedexView->unk0[i].seen = 0; + pokedexView->unk0[i].owned = 0; + } + pokedexView->unk608 = 0; + pokedexView->unk60A_1 = 0; + pokedexView->unk60A_2 = 0; + pokedexView->pokemonListCount = 0; + pokedexView->selectedPokemon = 0; + pokedexView->unk610 = 0; + pokedexView->dexMode = 0; + pokedexView->unk614 = 0; + pokedexView->dexOrder = 0; + pokedexView->unk618 = 0; + pokedexView->unk61A = 0; + pokedexView->unk61C = 0; + for (i = 0; i <= 3; i++) + pokedexView->unk61E[i] |= 0xFFFF; + pokedexView->unk628 = 0; + pokedexView->unk62A = 0; + pokedexView->unk62C = 0; + pokedexView->unk62D = 0; + pokedexView->unk62E = 0; + pokedexView->unk62F = 0; + pokedexView->unk630 = 0; + pokedexView->unk632 = 0; + pokedexView->unk634 = 0; + pokedexView->unk636 = 0; + pokedexView->unk638 = 0; + for (i = 0; i <= 3; i++) + pokedexView->unk63A[i] = 0; + pokedexView->unk64A = 0; + pokedexView->unk64B = 0; + pokedexView->unk64C_1 = 0; + pokedexView->selectedScreen = 0; + pokedexView->unk64F = 0; + pokedexView->menuIsOpen = 0; + pokedexView->menuCursorPos = 0; + pokedexView->menuY = 0; + for (i = 0; i <= 7; i++) + pokedexView->unk656[i] = 0; + for (i = 0; i <= 7; i++) + pokedexView->unk65E[i] = 0; +} + +void CB2_InitPokedex(void) +{ + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + sub_8091060(0); + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state = 1; + break; + case 1: + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + Text_LoadWindowTemplate(&gWindowTemplate_81E7048); + InitMenuWindow(&gWindowTemplate_81E7048); + gMain.state++; + break; + case 2: + switch (Random() & 3) + { + case 0: + default: + gPokedexView = ePokedexView1; + break; + case 1: + gPokedexView = ePokedexView2; + break; + case 2: + gPokedexView = ePokedexView3; + break; + case 3: + gPokedexView = ePokedexView4; + break; + } + ClearPokedexView(gPokedexView); + CreateTask(Task_PokedexShowMainScreen, 0); + gPokedexView->dexMode = gSaveBlock2.pokedex.unknown1; + if (!IsNationalPokedexEnabled()) + gPokedexView->dexMode = DEX_MODE_HOENN; + gPokedexView->dexOrder = gSaveBlock2.pokedex.order; + gPokedexView->selectedPokemon = gUnknown_0202FFB8; + gPokedexView->unk62C = gUnknown_0202FFBA; + gPokedexView->selectedScreen = PAGE_SCREEN; + gPokedexView->descriptionPageNum = 0; + if (!IsNationalPokedexEnabled()) + { + gPokedexView->unk61A = GetHoennPokedexCount(0); + gPokedexView->unk61C = GetHoennPokedexCount(1); + } + else + { + gPokedexView->unk61A = GetNationalPokedexCount(0); + gPokedexView->unk61C = GetNationalPokedexCount(1); + } + gPokedexView->unk62D = 8; + gMain.state++; + break; + case 3: + { + u16 savedIme; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + REG_DISPSTAT |= 8; + SetVBlankCallback(sub_808C0B8); + SetMainCallback2(MainCB); + SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x80); + } + break; + } +} + +u8 unref_sub_808C540(void (*func)(u8)) +{ + u16 savedIme; + u8 taskId; + + SetVBlankCallback(NULL); + sub_8091060(0x200); + ScanlineEffect_Stop(); + ResetTasks(); + ResetPaletteFade(); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + REG_DISPSTAT |= 0x8; + SetVBlankCallback(sub_808C0B8); + SetMainCallback2(MainCB); + if (!gPokedexView->unk64B) + taskId = CreateTask(sub_808CAE4, 0); + else + taskId = CreateTask(sub_808D198, 0); + gTasks[taskId].data[0] = CreateTask(func, 0); + return gTasks[taskId].data[0]; +} + +static void MainCB(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_PokedexShowMainScreen(u8 taskId) +{ + gPokedexView->unk64C_1 = 0; + if (sub_808D344(0)) + gTasks[taskId].func = Task_PokedexMainScreen; +} + +//Hide menu and process input on main screen +void Task_PokedexMainScreen(u8 taskId) +{ + REG_BG0VOFS = gPokedexView->menuY; + + //If menu is open, slide it down, off screen + if (gPokedexView->menuY) + gPokedexView->menuY -= 8; + else + { + if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen) + { + sub_808E6BC(); + BeginNormalPaletteFade( + ~(1 << (gSprites[gPokedexView->selectedMonSpriteId].oam.paletteNum + 16)), + 0, 0, 0x10, 0); + gSprites[gPokedexView->selectedMonSpriteId].callback = sub_808EDB8; + gTasks[taskId].func = sub_808CA64; + PlaySE(SE_PIN); + } + else if (gMain.newKeys & START_BUTTON) + { + //Open menu + gPokedexView->menuY = 0; + gPokedexView->menuIsOpen = 1; + gPokedexView->menuCursorPos = 0; + gTasks[taskId].func = Task_PokedexMainScreenMenu; + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].data[0] = sub_8091E3C(); + gPokedexView->unk64F = 0; + gPokedexView->unk62A = gPokedexView->unk62C; + gPokedexView->unk610 = gPokedexView->selectedPokemon; + gPokedexView->unk614 = gPokedexView->dexMode; + gPokedexView->unk618 = gPokedexView->dexOrder; + gTasks[taskId].func = sub_808CB8C; + PlaySE(SE_PC_LOGON); + } + else if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ClosePokedex; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE); + if (gPokedexView->unk62E) + gTasks[taskId].func = sub_808C898; + } + } +} + +static void sub_808C898(u8 taskId) +{ + if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636)) + gTasks[taskId].func = Task_PokedexMainScreen; +} + +//Bring up menu and process menu input +static void Task_PokedexMainScreenMenu(u8 taskId) +{ + REG_BG0VOFS = gPokedexView->menuY; + + //If menu is not open, slide it up, on screen + if (gPokedexView->menuY != 80) + gPokedexView->menuY += 8; + else + { + if (gMain.newKeys & A_BUTTON) + { + switch (gPokedexView->menuCursorPos) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 1: //LIST TOP + gPokedexView->selectedPokemon = 0; + gPokedexView->unk62C = 0x40; + sub_808E82C(); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 2: //LIST BOTTOM + gPokedexView->selectedPokemon = gPokedexView->pokemonListCount - 1; + gPokedexView->unk62C = gPokedexView->pokemonListCount * 16 + 0x30; + sub_808E82C(); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 3: //CLOSE POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ClosePokedex; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gPokedexView->menuIsOpen = 0; + gTasks[taskId].func = Task_PokedexMainScreen; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos != 0) + { + gPokedexView->menuCursorPos--; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 2) + { + gPokedexView->menuCursorPos++; + PlaySE(SE_SELECT); + } + } +} + +static void sub_808CA64(u8 taskId) +{ + if (gSprites[gPokedexView->selectedMonSpriteId].pos1.x == 48 + && gSprites[gPokedexView->selectedMonSpriteId].pos1.y == 56) + { + gPokedexView->unk64B = gPokedexView->unk64A; + gTasks[taskId].data[0] = sub_808F210(&gPokedexView->unk0[gPokedexView->selectedPokemon], gPokedexView->selectedMonSpriteId); + gTasks[taskId].func = sub_808CAE4; + } +} + +static void sub_808CAE4(u8 taskId) +{ + if (gTasks[gTasks[taskId].data[0]].isActive) + { + if (gPokedexView->unk64A == 1 && !sub_808F250(gTasks[taskId].data[0]) && sub_808E71C()) + sub_808F284(&gPokedexView->unk0[gPokedexView->selectedPokemon], gTasks[taskId].data[0]); + } + else + { + gUnknown_0202FFB8 = gPokedexView->selectedPokemon; + gUnknown_0202FFBA = gPokedexView->unk62C; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } +} + +static void sub_808CB8C(u8 taskId) +{ + bool8 isActive = gTasks[gTasks[taskId].data[0]].isActive; + + if (!isActive) + { + if (gPokedexView->unk64F != 0) + { + gPokedexView->selectedPokemon = isActive; + gPokedexView->unk62C = 0x40; + gTasks[taskId].func = sub_808CCC4; + } + else + { + gPokedexView->unk62C = gPokedexView->unk62A; + gPokedexView->selectedPokemon = gPokedexView->unk610; + gPokedexView->dexMode = gPokedexView->unk614; + if (!IsNationalPokedexEnabled()) + gPokedexView->dexMode = DEX_MODE_HOENN; + gPokedexView->dexOrder = gPokedexView->unk618; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } + } +} + +static void Task_ClosePokedex(u8 taskId) +{ + if (!gPaletteFade.active) + { + gSaveBlock2.pokedex.unknown1 = gPokedexView->dexMode; + if (!IsNationalPokedexEnabled()) + gSaveBlock2.pokedex.unknown1 = 0; + gSaveBlock2.pokedex.order = gPokedexView->dexOrder; + DestroyTask(taskId); + SetMainCallback2(sub_805469C); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + } +} + +static void sub_808CCC4(u8 taskId) +{ + gPokedexView->unk64C_1 = 1; + if (sub_808D344(3)) + gTasks[taskId].func = Task_PokedexResultsScreen; +} + +static void Task_PokedexResultsScreen(u8 taskId) +{ + REG_BG0VOFS = gPokedexView->menuY; + + if (gPokedexView->menuY) + { + gPokedexView->menuY -= 8; + } + else + { + if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen) + { + u32 a; + + sub_808E6BC(); + a = (1 << (gSprites[gPokedexView->selectedMonSpriteId].oam.paletteNum + 16)); + gSprites[gPokedexView->selectedMonSpriteId].callback = sub_808EDB8; + BeginNormalPaletteFade(~a, 0, 0, 0x10, 0); + gTasks[taskId].func = sub_808D118; + PlaySE(SE_PIN); + } + else if (gMain.newKeys & START_BUTTON) + { + gPokedexView->menuY = 0; + gPokedexView->menuIsOpen = 1; + gPokedexView->menuCursorPos = 0; + gTasks[taskId].func = Task_PokedexResultsScreenMenu; + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].data[0] = sub_8091E3C(); + gPokedexView->unk64F = 0; + gTasks[taskId].func = sub_808CB8C; + PlaySE(SE_PC_LOGON); + } + else if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE); + if (gPokedexView->unk62E) + gTasks[taskId].func = sub_808CEF8; + } + } +} + +static void sub_808CEF8(u8 taskId) +{ + if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636)) + gTasks[taskId].func = Task_PokedexResultsScreen; +} + +static void Task_PokedexResultsScreenMenu(u8 taskId) +{ + REG_BG0VOFS = gPokedexView->menuY; + + if (gPokedexView->menuY != 96) + { + gPokedexView->menuY += 8; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + switch (gPokedexView->menuCursorPos) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; + break; + case 1: //LIST TOP + gPokedexView->selectedPokemon = 0; + gPokedexView->unk62C = 0x40; + sub_808E82C(); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 2: //LIST BOTTOM + gPokedexView->selectedPokemon = gPokedexView->pokemonListCount - 1; + gPokedexView->unk62C = gPokedexView->pokemonListCount * 16 + 0x30; + sub_808E82C(); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 3: //BACK TO POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; + PlaySE(SE_TRACK_DOOR); + break; + case 4: //CLOSE POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenExitPokedex; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gPokedexView->menuIsOpen = 0; + gTasks[taskId].func = Task_PokedexResultsScreen; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos) + { + gPokedexView->menuCursorPos--; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 3) + { + gPokedexView->menuCursorPos++; + PlaySE(SE_SELECT); + } + } +} + +static void sub_808D118(u8 taskId) +{ + if (gSprites[gPokedexView->selectedMonSpriteId].pos1.x == 48 + && gSprites[gPokedexView->selectedMonSpriteId].pos1.y == 56) + { + gPokedexView->unk64B = gPokedexView->unk64A; + gTasks[taskId].data[0] = sub_808F210(&gPokedexView->unk0[gPokedexView->selectedPokemon], gPokedexView->selectedMonSpriteId); + gTasks[taskId].func = sub_808D198; + } +} + +static void sub_808D198(u8 taskId) +{ + if (gTasks[gTasks[taskId].data[0]].isActive) + { + if (gPokedexView->unk64A == 1 && !sub_808F250(gTasks[taskId].data[0]) && sub_808E71C()) + sub_808F284(&gPokedexView->unk0[gPokedexView->selectedPokemon], gTasks[taskId].data[0]); + } + else + { + gTasks[taskId].func = sub_808CCC4; + } +} + +static void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId) +{ + if (!gPaletteFade.active) + { + gPokedexView->unk62C = gPokedexView->unk62A; + gPokedexView->selectedPokemon = gPokedexView->unk610; + gPokedexView->dexMode = gPokedexView->unk614; + if (!IsNationalPokedexEnabled()) + gPokedexView->dexMode = DEX_MODE_HOENN; + gPokedexView->dexOrder = gPokedexView->unk618; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } +} + +static void Task_PokedexResultsScreenExitPokedex(u8 taskId) +{ + if (!gPaletteFade.active) + { + gPokedexView->unk62C = gPokedexView->unk62A; + gPokedexView->selectedPokemon = gPokedexView->unk610; + gPokedexView->dexMode = gPokedexView->unk614; + if (!IsNationalPokedexEnabled()) + gPokedexView->dexMode = DEX_MODE_HOENN; + gPokedexView->dexOrder = gPokedexView->unk618; + gTasks[taskId].func = Task_ClosePokedex; + } +} + +static bool8 sub_808D344(u8 a) +{ + switch (gMain.state) + { + case 0: + default: + if (gPaletteFade.active) + return 0; + SetVBlankCallback(NULL); + gPokedexView->unk64A = a; + sub_8091060(0); + REG_BG2VOFS = gPokedexView->unk62D; + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM)); + LZ77UnCompVram(gUnknown_08E96738, (void *)(VRAM + 0x6800)); + LZ77UnCompVram(gUnknown_08E9C6DC, (void *)(VRAM + 0x7800)); + DmaClear16(3, VRAM + 0x6000, 0x500); + if (a == 0) + LZ77UnCompVram(gUnknown_08E96888, (void *)(VRAM + 0x6500)); + else + LZ77UnCompVram(gUnknown_08E96994, (void *)(VRAM + 0x6500)); + ResetPaletteFade(); + if (a == 0) + gPokedexView->unk64C_1 = 0; + else + gPokedexView->unk64C_1 = 1; + sub_808D640(); + gMain.state = 1; + break; + case 1: + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LoadCompressedObjectPic(&gUnknown_083A05CC[0]); + LoadSpritePalettes(gUnknown_083A05DC); + sub_808E978(a); + gMain.state++; + break; + case 2: + Text_LoadWindowTemplate(&gWindowTemplate_81E7048); + InitMenuWindow(&gWindowTemplate_81E7048); + LZ77UnCompVram(gUnknown_0839FA7C, (void *)(VRAM + 0xFF80)); + gMain.state++; + break; + case 3: + if (a == 0) + SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder); + sub_808E0CC(gPokedexView->selectedPokemon, 0xE); + gPokedexView->menuIsOpen = 0; + gPokedexView->menuY = 0; + gMain.state++; + break; + case 4: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + SetVBlankCallback(sub_808C0B8); + gMain.state++; + break; + case 5: + REG_WININ = 0x3F3F; + REG_WINOUT = 0x1D3F; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON; + gMain.state++; + break; + case 6: + if (!gPaletteFade.active) + { + gMain.state = 0; + return TRUE; + } + break; + } + return FALSE; +} + +static void sub_808D640(void) +{ + if (gPokedexView->unk64C_1) + LoadPalette(sPokedexSearchPalette + 1, 1, sizeof(sPokedexSearchPalette) - sizeof(u16)); + else if (!IsNationalPokedexEnabled()) + LoadPalette(gPokedexMenu_Pal + 1, 1, 0xBE); + else + LoadPalette(sNationalPokedexPalette + 1, 1, sizeof(sNationalPokedexPalette) - sizeof(u16)); +} + +static void SortPokedex(u8 dexMode, u8 sortMode) +{ + u16 vars[3]; //I have no idea why three regular variables are stored in an array, but whatever. + s16 i; + + gPokedexView->pokemonListCount = 0; + + switch (dexMode) + { + default: + case DEX_MODE_HOENN: + vars[0] = 202; + vars[1] = 1; + break; + case DEX_MODE_NATIONAL: + if (IsNationalPokedexEnabled()) + { + vars[0] = NATIONAL_DEX_COUNT; + vars[1] = 0; + } + else + { + vars[0] = 202; + vars[1] = 1; + } + break; + } + + switch (sortMode) + { + case 0: + if (vars[1]) + { + for (i = 0; i < vars[0]; i++) + { + vars[2] = HoennToNationalOrder(i + 1); + gPokedexView->unk0[i].dexNum = vars[2]; + gPokedexView->unk0[i].seen = GetSetPokedexFlag(vars[2], 0); + gPokedexView->unk0[i].owned = GetSetPokedexFlag(vars[2], 1); + if (gPokedexView->unk0[i].seen) + gPokedexView->pokemonListCount = i + 1; + } + } + else + { + bool32 r10; + s16 r5; + + r10 = r5 = i = 0; + for (i = 0; i < vars[0]; i++) + { + vars[2] = i + 1; + if (GetSetPokedexFlag(vars[2], 0)) + r10 = 1; + if (r10) + { + asm(""); //Needed to match for some reason + gPokedexView->unk0[r5].dexNum = vars[2]; + gPokedexView->unk0[r5].seen = GetSetPokedexFlag(vars[2], 0); + gPokedexView->unk0[r5].owned = GetSetPokedexFlag(vars[2], 1); + if (gPokedexView->unk0[r5].seen) + gPokedexView->pokemonListCount = r5 + 1; + r5++; + } + } + } + break; + case 1: + for (i = 0; i < 411; i++) + { + vars[2] = gPokedexOrder_Alphabetical[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 0)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = GetSetPokedexFlag(vars[2], 1); + gPokedexView->pokemonListCount++; + } + } + break; + case 2: + for (i = NATIONAL_DEX_COUNT - 1; i >= 0; i--) + { + vars[2] = gPokedexOrder_Weight[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; + gPokedexView->pokemonListCount++; + } + } + break; + case 3: + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + vars[2] = gPokedexOrder_Weight[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; + gPokedexView->pokemonListCount++; + } + } + break; + case 4: + for (i = NATIONAL_DEX_COUNT - 1; i >=0; i--) + { + vars[2] = gPokedexOrder_Height[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; + gPokedexView->pokemonListCount++; + } + } + break; + case 5: + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + vars[2] = gPokedexOrder_Height[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; + gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; + gPokedexView->pokemonListCount++; + } + } + break; + } + + for (i = gPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) + { + gPokedexView->unk0[i].dexNum |= 0xFFFF; + gPokedexView->unk0[i].seen = 0; + gPokedexView->unk0[i].owned = 0; + } +} + +static void sub_808DBE8(u8 a, u16 b, u16 c) +{ + s16 _b; + u16 i; + u16 r2; + + switch (a) + { + case 0: + default: + _b = b - 5; + for (i = 0; i <= 10; i++) + { + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) + { + sub_808E090(0x11, i * 2, c); + } + else + { + sub_808E090(0x11, i * 2, c); + if (gPokedexView->unk0[_b].seen) + { + sub_808DEB0(_b, 0x12, i * 2, c); + sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, i * 2, c); + sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, i * 2); + } + else + { + sub_808DEB0(_b, 0x12, i * 2, c); + sub_808DF88(0, 0x11, i * 2, c); + sub_808DFE4(0, 0x17, i * 2); + } + } + _b++; + } + break; + case 1: + _b = b - 5; + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) + { + sub_808E090(0x11, gPokedexView->unk630 * 2, c); + } + else + { + sub_808E090(0x11, gPokedexView->unk630 * 2, c); + if (gPokedexView->unk0[_b].seen) + { + sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c); + sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, gPokedexView->unk630 * 2, c); + sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, gPokedexView->unk630 * 2); + } + else + { + sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c); + sub_808DF88(0, 0x11, gPokedexView->unk630 * 2, c); + sub_808DFE4(0, 0x17, gPokedexView->unk630 * 2); + } + } + break; + case 2: + _b = b + 5; + r2 = gPokedexView->unk630 + 10; + if (r2 > 15) + r2 -= 16; + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) + sub_808E090(0x11, r2 * 2, c); + else + { + sub_808E090(0x11, r2 * 2, c); + if (gPokedexView->unk0[_b].seen) + { + sub_808DEB0(_b, 0x12, r2 * 2, c); + sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, r2 * 2, c); + sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, r2 * 2); + } + else + { + sub_808DEB0(_b, 0x12, r2 * 2, c); + sub_808DF88(0, 0x11, r2 * 2, c); + sub_808DFE4(0, 0x17, r2 * 2); + } + } + break; + } +} + +static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d) +{ + u8 text[4]; + u16 unk[2]; + u16 r7 = gPokedexView->unk0[a].dexNum; + + if (gPokedexView->dexMode == DEX_MODE_HOENN) + r7 = NationalToHoennOrder(r7); + unk[0] = 0x3FC; + unk[1] = 0x3FD; + text[0] = CHAR_0 + r7 / 100; + text[1] = CHAR_0 + (r7 % 100) / 10; + text[2] = CHAR_0 + (r7 % 100) % 10; + text[3] = EOS; + *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; + *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; + Menu_PrintText(text, b - 15, c); +} + +static void sub_808DF88(u16 a, u8 b, u8 c, u16 d) +{ + u16 unk[2]; + + if (a) + { + unk[0] = 0x3FE; + unk[1] = 0x3FF; + } + else + { + unk[0] = 0; + unk[1] = 0; + } + *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; + *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; +} + +static u8 sub_808DFE4(u16 num, u8 b, u8 c) +{ + u8 text[10]; + u8 i; + + for (i = 0; i < 10; i++) + text[i] = CHAR_SPACE; + text[i] = EOS; + + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) + text[i] = gSpeciesNames[num][i]; + break; + case 0: + for (i = 0; i < 10; i++) + text[i] = CHAR_HYPHEN; + break; + } + Menu_PrintTextPixelCoords(text, (b - 0x11) * 8 + 0xFC, c * 8, 0); + return i; +} + +static void sub_808E090(u8 a, u8 b, u16 c) +{ + u8 i; + + for (i = 0; i < 12; i++) + { + *(u16 *)(VRAM + c * 0x800 + b * 64 + (a + i) * 2) = 0; + *(u16 *)(VRAM + c * 0x800 + (b + 1) * 64 + (a + i) * 2) = 0; + } +} + +static void sub_808E0CC(u16 a, u16 b) +{ + u8 i; + u16 unk; + u8 spriteId; + + for (i = 0; i < 4; i++) + gPokedexView->unk61E[i] = 0xFFFF; + gPokedexView->selectedMonSpriteId = 0xFFFF; + sub_808DBE8(0, a, b); + REG_BG2VOFS = gPokedexView->unk62D; + + unk = sub_808E888(a - 1); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data[5] = -32; + } + + unk = sub_808E888(a); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data[5] = 0; + } + + unk = sub_808E888(a + 1); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data[5] = 32; + } + + gPokedexView->unk630 = 0; + gPokedexView->unk632 = 0; +} + +static bool8 sub_808E208(u8 a, u8 b, u8 c) +{ + u16 i; + u8 foo; + + if (gPokedexView->unk62E) + { + gPokedexView->unk62E--; + switch (a) + { + case 1: + for (i = 0; i < 4; i++) + { + if (gPokedexView->unk61E[i] != 0xFFFF) + gSprites[gPokedexView->unk61E[i]].data[5] += b; + } + foo = 16 * (c - gPokedexView->unk62E) / c; + REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 - foo; + gPokedexView->unk62C -= gPokedexView->unk628; + break; + case 2: + for (i = 0; i < 4; i++) + { + if (gPokedexView->unk61E[i] != 0xFFFF) + gSprites[gPokedexView->unk61E[i]].data[5] -= b; + } + foo = 16 * (c - gPokedexView->unk62E) / c; + REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 + foo; + gPokedexView->unk62C += gPokedexView->unk628; + break; + } + return FALSE; + } + else + { + REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk630 * 16; + return TRUE; + } +} + +static void sub_808E398(u8 a, u16 b) +{ + u16 unk; + u8 spriteId; + + gPokedexView->unk632 = gPokedexView->unk630; + switch (a) + { + case 1: + unk = sub_808E888(b - 1); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data[5] = -64; + } + if (gPokedexView->unk630 > 0) + gPokedexView->unk630--; + else + gPokedexView->unk630 = 15; + break; + case 2: + unk = sub_808E888(b + 1); + if (unk != 0xFFFF) + { + spriteId = sub_808E8C8(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_808EE28; + gSprites[spriteId].data[5] = 0x40; + } + if (gPokedexView->unk630 <= 0xE) + gPokedexView->unk630++; + else + gPokedexView->unk630 = 0; + break; + } +} + +// Ugly, ugly, ugly. I couldn't get it to match otherwise. +static u16 sub_808E48C(u16 a, u16 b) +{ + u8 r3; + u8 r5; + u8 i; + u16 r6; + u8 r10 = 0; + + if (!((gMain.heldKeys & 0x40) && (a > 0))) + { + //_0808E4B6 + if (!((gMain.heldKeys & 0x80) && (a < gPokedexView->pokemonListCount - 1))) + //_0808E4CE + { + if ((gMain.newKeys & 0x20) && (a > 0)) + { + r6 = a; + //_0808E4E0 + for (i = 0; i < 7; i++) + a = sub_8091818(1, a, 0, gPokedexView->pokemonListCount - 1); + gPokedexView->unk62C += 16 * (a - r6); + sub_808E82C(); + sub_808E0CC(a, 0xE); + PlaySE(0x6D); + } + //_0808E53C + else if ((gMain.newKeys & 0x10) && (a < gPokedexView->pokemonListCount - 1)) + { + r6 = a; + for (i = 0; i < 7; i++) + a = sub_8091818(0, a, 0, gPokedexView->pokemonListCount - 1); + gPokedexView->unk62C += (a - r6) * 16; + sub_808E82C(); + sub_808E0CC(a, 0xE); + PlaySE(0x6D); + } + _0808E5A2: + if (r10 == 0) + { + gPokedexView->unk638 = 0; + return a; + } + } + else + { + // to _0808E5C4 + r10 = 2; + a = sub_8091818(0, a, 0, gPokedexView->pokemonListCount - 1); + sub_808E398(2, a); + //goto _0808E60E + sub_808DBE8(2, a, b); + PlaySE(0x6C); + goto _0808E5A2; + } + } + else + { + //to _0808E5E4 + r10 = 1; + a = sub_8091818(1, a, 0, gPokedexView->pokemonListCount - 1); + sub_808E398(1, a); + //_0808E60E + sub_808DBE8(1, a, b); + PlaySE(0x6C); + goto _0808E5A2; + } + //_0808E628 + r5 = gUnknown_083A05EC[gPokedexView->unk638 / 4]; + r3 = gUnknown_083A05F1[gPokedexView->unk638 / 4]; + gPokedexView->unk62E = r3; + gPokedexView->unk636 = r3; + gPokedexView->unk634 = r5; + gPokedexView->unk62F = r10; + gPokedexView->unk628 = r5 / 2; + sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636); + if (gPokedexView->unk638 <= 0xB) + gPokedexView->unk638++; + return a; +} + +static void sub_808E6BC(void) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + u16 spriteId = gPokedexView->unk61E[i]; + + if (gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF) + gPokedexView->selectedMonSpriteId = spriteId; + } +} + +static u8 sub_808E71C(void) +{ + u16 r2; + u16 r4 = gPokedexView->selectedPokemon; + + if ((gMain.newKeys & DPAD_UP) && r4) + { + r2 = r4; + while (r2 != 0) + { + r2 = sub_8091818(1, r2, 0, gPokedexView->pokemonListCount - 1); + + if (gPokedexView->unk0[r2].seen) + { + r4 = r2; + break; + } + } + + if (gPokedexView->selectedPokemon == r4) + return 0; + else + { + gPokedexView->selectedPokemon = r4; + gPokedexView->unk62C -= 16; + return 1; + } + } + else if ((gMain.newKeys & DPAD_DOWN) && r4 < gPokedexView->pokemonListCount - 1) + { + r2 = r4; + while (r2 < gPokedexView->pokemonListCount - 1) + { + r2 = sub_8091818(0, r2, 0, gPokedexView->pokemonListCount - 1); + + if (gPokedexView->unk0[r2].seen) + { + r4 = r2; + break; + } + } + + if (gPokedexView->selectedPokemon == r4) + return 0; + else + { + gPokedexView->selectedPokemon = r4; + gPokedexView->unk62C += 16; + return 1; + } + } + return 0; +} + +static u8 sub_808E82C(void) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + if (gPokedexView->unk61E[i] != 0xFFFF) + { + DestroySprite(&gSprites[gPokedexView->unk61E[i]]); + gPokedexView->unk61E[i] |= 0xFFFF; + } + } + return 0; +} + +static u16 sub_808E888(u16 a1) +{ + if (a1 >= NATIONAL_DEX_COUNT || gPokedexView->unk0[a1].dexNum == 0xFFFF) + return 0xFFFF; + else if (gPokedexView->unk0[a1].seen) + return gPokedexView->unk0[a1].dexNum; + else + return 0; +} + +static u32 sub_808E8C8(u16 a, s16 b, s16 c) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (gPokedexView->unk61E[i] == 0xFFFF) + { + u8 spriteId = sub_80918EC(a, b, c, i); + + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.priority = 3; + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = i; + gSprites[spriteId].data[2] = NationalPokedexNumToSpecies(a); + gPokedexView->unk61E[i] = spriteId; + return spriteId; + } + } + return 0xFFFF; +} + +static void sub_808E978(u8 a) +{ + u8 spriteId; + u16 r5; + + spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0); + gSprites[spriteId].data[1] = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 156, 0); + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].vFlip = TRUE; + + CreateSprite(&gSpriteTemplate_83A0524, 234, 20, 0); + CreateSprite(&gSpriteTemplate_83A0554, 16, 138, 0); + + spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 138, 0); + StartSpriteAnim(&gSprites[spriteId], 3); + + spriteId = CreateSprite(&gSpriteTemplate_83A0554, 16, 158, 0); + StartSpriteAnim(&gSprites[spriteId], 2); + gSprites[spriteId].data[2] = 0x80; + + spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 158, 0); + StartSpriteAnim(&gSprites[spriteId], 1); + + spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 30; + gSprites[spriteId].data[0] = 0x1E; + gSprites[spriteId].data[1] = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 31; + gSprites[spriteId].data[0] = 0x1F; + gSprites[spriteId].data[1] = 0x80; + + if (a == 0) + { + u32 _a; + + CreateSprite(&gSpriteTemplate_83A0584, 32, 40, 1); + + spriteId = CreateSprite(&gSpriteTemplate_83A0584, 32, 72, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + _a = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 28, 48, 1); + r5 = gPokedexView->unk61A / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 34, 48, 1); + r5 = (gPokedexView->unk61A % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 40, 48, 1); + r5 = (gPokedexView->unk61A % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + _a = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 28, 80, 1); + r5 = gPokedexView->unk61C / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 34, 80, 1); + r5 = (gPokedexView->unk61C % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gSpriteTemplate_83A059C, 40, 80, 1); + r5 = (gPokedexView->unk61C % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + + spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 140, 96, 1); + gSprites[spriteId].invisible = TRUE; + } + else + { + spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 140, 80, 1); + gSprites[spriteId].invisible = TRUE; + } +} + +static void nullsub_58(struct Sprite *sprite) +{ +} + +static void sub_808ED94(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0) + DestroySprite(sprite); +} + +//Move Pokemon into position for description page +static void sub_808EDB8(struct Sprite *sprite) +{ + sprite->oam.priority = 0; + sprite->oam.affineMode = 0; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + if (sprite->pos1.x != 48 || sprite->pos1.y != 56) + { + if (sprite->pos1.x > 48) + sprite->pos1.x--; + if (sprite->pos1.x < 48) + sprite->pos1.x++; + + if (sprite->pos1.y > 56) + sprite->pos1.y--; + if (sprite->pos1.y < 56) + sprite->pos1.y++; + } + else + { + sprite->callback = nullsub_58; + } +} + +static void sub_808EE28(struct Sprite *sprite) +{ + u8 data1 = sprite->data[1]; + + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + { + DestroySprite(sprite); + gPokedexView->unk61E[data1] = 0xFFFF; + } + else + { + u32 var; + + sprite->pos2.y = gSineTable[(u8)sprite->data[5]] * 76 / 256; + var = 0x10000 / gSineTable[sprite->data[5] + 0x40]; + if (var > 0xFFFF) + var = 0xFFFF; + SetOamMatrix(sprite->data[1] + 1, 0x100, 0, 0, var); + sprite->oam.matrixNum = data1 + 1; + + if (sprite->data[5] > -64 && sprite->data[5] < 64) + { + sprite->invisible = FALSE; + sprite->data[0] = 1; + } + else + { + sprite->invisible = TRUE; + } + + if ((sprite->data[5] <= -64 || sprite->data[5] >= 64) && sprite->data[0] != 0) + { + DestroySprite(sprite); + gPokedexView->unk61E[data1] = 0xFFFF; + } + } +} + +static void sub_808EF38(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + DestroySprite(sprite); + else + sprite->pos2.y = gPokedexView->selectedPokemon * 120 / (gPokedexView->pokemonListCount - 1); +} + +static void sub_808EF8C(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u8 r0; + + if (sprite->data[1] != 0) + { + if (gPokedexView->selectedPokemon == gPokedexView->pokemonListCount - 1) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + r0 = sprite->data[2]; + } + else + { + if (gPokedexView->selectedPokemon == 0) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + r0 = sprite->data[2] - 128; + } + sprite->pos2.y = gSineTable[r0] / 64; + sprite->data[2] = sprite->data[2] + 8; + if (gPokedexView->menuIsOpen == 0 && gPokedexView->menuY == 0 && sprite->invisible == 0) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + } +} + +static void sub_808F08C(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + DestroySprite(sprite); +} + +static void sub_808F0B4(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u8 val; + s16 r3; + s16 r0; + + val = gPokedexView->unk62C + sprite->data[1]; + r3 = gSineTable[val]; + r0 = gSineTable[val + 0x40]; + SetOamMatrix(sprite->data[0], r0, r3, -r3, r0); + + val = gPokedexView->unk62C + (sprite->data[1] + 0x40); + r3 = gSineTable[val]; + r0 = gSineTable[val + 0x40]; + sprite->pos2.x = r0 * 40 / 256; + sprite->pos2.y = r3 * 40 / 256; + } +} + +static void sub_808F168(struct Sprite *sprite) +{ + if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u16 r1 = gPokedexView->unk64A == 0 ? 80 : 96; + + if (gPokedexView->menuIsOpen != 0 && gPokedexView->menuY == r1) + { + sprite->invisible = FALSE; + sprite->pos2.y = gPokedexView->menuCursorPos * 16; + sprite->pos2.x = gSineTable[(u8)sprite->data[2]] / 64; + sprite->data[2] += 8; + } + else + { + sprite->invisible = TRUE; + } + } +} + +static u8 sub_808F210(struct PokedexListItem *item, u8 b) +{ + u8 taskId; + + gUnknown_0202FFBC = item; + taskId = CreateTask(Task_InitPageScreenMultistep, 0); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = b; + return taskId; +} + +static bool8 sub_808F250(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0 && gTasks[taskId].func == Task_PageScreenProcessInput) + return FALSE; + else + return TRUE; +} + +static u8 sub_808F284(struct PokedexListItem *item, u8 b) +{ + gUnknown_0202FFBC = item; + gTasks[b].data[0] = 1; + gTasks[b].data[1] = 0; + gTasks[b].data[2] = 0; + gTasks[b].data[3] = 0; + return b; +} + +#if ENGLISH +#define CATEGORY_LEFT (11) +#elif GERMAN +#define CATEGORY_LEFT (16) +#endif + +static void Task_InitPageScreenMultistep(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + u16 r2; + + gPokedexView->unk64A = 1; + gPokedexView->descriptionPageNum = 0; + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + r2 = 0; + if (gTasks[taskId].data[1] != 0) + r2 += 0x1000; + if (gTasks[taskId].data[2] != 0) + r2 |= 0x200; + sub_8091060(r2); + gMain.state = 1; + } + break; + case 1: + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); + LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800)); + sub_8091738(gUnknown_0202FFBC->dexNum, 2, 0x3FC); + gMain.state++; + break; + case 2: + sub_80904FC(0xD); + sub_8090584(gPokedexView->selectedScreen, 0xD); + sub_808D640(); + gMain.state++; + break; + case 3: + Text_LoadWindowTemplate(&gWindowTemplate_81E7064); + InitMenuWindow(&gWindowTemplate_81E7064); + gMain.state++; + break; + case 4: + if (gPokedexView->dexMode == DEX_MODE_HOENN) + sub_8091154(NationalToHoennOrder(gUnknown_0202FFBC->dexNum), 0xD, 3); + else + sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3); + sub_80911C8(gUnknown_0202FFBC->dexNum, 0x10, 3); + Menu_PrintText(gDexText_UnknownPoke, CATEGORY_LEFT, 5); + Menu_PrintText(gDexText_UnknownHeight, 16, 7); + Menu_PrintText(gDexText_UnknownWeight, 16, 9); + if (gUnknown_0202FFBC->owned) + { + sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, CATEGORY_LEFT, 5); + sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7); + sub_8091564(gPokedexEntries[gUnknown_0202FFBC->dexNum].weight, 16, 9); + Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); + sub_80917CC(14, 0x3FC); + } + else + { + Menu_PrintText(gUnknown_083A05F8, 2, 13); + LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E); + } + gMain.state++; + break; + case 5: + if (gTasks[taskId].data[1] == 0) + { + gTasks[taskId].data[4] = (u16)sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0); + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + } + gMain.state++; + break; + case 6: + { + u32 r3 = 0; + + if (gTasks[taskId].data[2] != 0) + r3 = 0x14; + if (gTasks[taskId].data[1] != 0) + r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 16)); + BeginNormalPaletteFade(~r3, 0, 16, 0, 0); + SetVBlankCallback(gUnknown_03005CEC); + gMain.state++; + } + break; + case 7: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + gMain.state++; + break; + case 8: + if (!gPaletteFade.active) + { + gMain.state++; + if (gTasks[taskId].data[3] == 0) + { + StopCryAndClearCrySongs(); + PlayCry2(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), 0, 0x7D, 0xA); + } + else + { + gMain.state++; + } + } + break; + case 9: + if (!IsCryPlayingOrClearCrySongs()) + gMain.state++; + break; + case 10: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 1; + gTasks[taskId].data[3] = 1; + gTasks[taskId].func = Task_PageScreenProcessInput; + gMain.state = 0; + break; + } +} + +static void Task_PageScreenProcessInput(u8 taskId) +{ + if (gTasks[taskId].data[0] != 0) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_808F888; + PlaySE(SE_Z_SCROLL); + return; + } + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_ClosePageScreen; + PlaySE(SE_PC_OFF); + return; + } + if (gMain.newKeys & A_BUTTON) + { + switch (gPokedexView->selectedScreen) + { + case PAGE_SCREEN: + sub_8090C68(); + break; + case AREA_SCREEN: + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_InitAreaScreenMultistep; + PlaySE(SE_PIN); + break; + case CRY_SCREEN: + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_InitCryScreenMultistep; + PlaySE(SE_PIN); + break; + case SIZE_SCREEN: + if (!gUnknown_0202FFBC->owned) + { + PlaySE(SE_HAZURE); + } + else + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_InitSizeScreenMultistep; + PlaySE(SE_PIN); + } + break; + } + return; + } + if (((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + && gPokedexView->selectedScreen > 0) + { + gPokedexView->selectedScreen--; + sub_8090584(gPokedexView->selectedScreen, 0xD); + PlaySE(SE_Z_PAGE); + return; + } + if (((gMain.newKeys & DPAD_RIGHT) + || ((gMain.newKeys & R_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + && gPokedexView->selectedScreen < 3) + { + gPokedexView->selectedScreen++; + sub_8090584(gPokedexView->selectedScreen, 0xD); + PlaySE(SE_Z_PAGE); + return; + } +} + +static void sub_808F888(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_InitPageScreenMultistep; +} + +static void Task_ClosePageScreen(u8 taskId) +{ + if (!gPaletteFade.active) + DestroyTask(taskId); +} + +static void Task_InitAreaScreenMultistep(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + gPokedexView->unk64A = 5; + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_8091060(0x200); + gPokedexView->selectedScreen = AREA_SCREEN; + gMain.state = 1; + } + break; + case 1: + sub_8090540(0xD); + sub_8090644(1, 0xD); + sub_808D640(); + REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; + gMain.state++; + break; + case 2: + ShowPokedexAreaScreen(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), &gPokedexView->unk64F); + SetVBlankCallback(gUnknown_03005CEC); + gPokedexView->unk64F = 0; + gMain.state = 0; + gTasks[taskId].func = Task_AreaScreenProcessInput; + break; + } +} + +static void Task_AreaScreenProcessInput(u8 taskId) +{ + if (gPokedexView->unk64F != 0) + gTasks[taskId].func = sub_808FA00; +} + +static void sub_808FA00(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (gPokedexView->unk64F) + { + case 1: + default: + gTasks[taskId].func = Task_InitPageScreenMultistep; + break; + case 2: + gTasks[taskId].func = Task_InitCryScreenMultistep; + break; + } + } +} + +static void Task_InitCryScreenMultistep(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + m4aMPlayStop(&gMPlay_BGM); + gPokedexView->unk64A = 6; + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_8091060(0x200); + gPokedexView->selectedScreen = CRY_SCREEN; + gMain.state = 1; + } + break; + case 1: + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); + LZ77UnCompVram(gUnknown_0839F8A0, (void *)(VRAM + 0x7000)); + gMain.state++; + break; + case 2: + sub_8090540(0xD); + sub_8090644(2, 0xD); + sub_808D640(); + DmaClear16(3, (void *)(VRAM + 0xF800), 0x500); + gMain.state++; + break; + case 3: + Text_LoadWindowTemplate(&gWindowTemplate_81E702C); + InitMenuWindow(&gWindowTemplate_81E702C); + ResetPaletteFade(); + gMain.state++; + break; + case 4: + Menu_PrintText(gDexText_CryOf, 10, 4); + sub_8091260(gUnknown_0202FFBC->dexNum, 10, 6, 2); + gMain.state++; + break; + case 5: + gTasks[taskId].data[4] = sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0); + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + gUnknown_03005E98 = 0; + gMain.state++; + break; + case 6: + { + struct CryRelatedStruct sp8; + + sp8.unk0 = 0x4020; + sp8.unk2 = 0x1F; + sp8.paletteNo = 8; + sp8.yPos = 0x1E; + sp8.xPos = 0xC; + if (sub_8119E3C(&sp8, 0) != 0) + { + gMain.state++; + gUnknown_03005E98 = 0; + } + } + break; + case 7: + { + struct CryRelatedStruct sp10; + + sp10.unk0 = 0x3000; + sp10.unk2 = 0xE; + sp10.paletteNo = 9; + sp10.xPos = 0x12; + sp10.yPos = 3; + if (ShowPokedexCryScreen(&sp10, 1) != 0) + gMain.state++; + } + break; + case 8: + BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); + SetVBlankCallback(gUnknown_03005CEC); + gMain.state++; + break; + case 9: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gMain.state++; + break; + case 10: + gPokedexView->unk64F = 0; + gMain.state = 0; + gTasks[taskId].func = Task_CryScreenProcessInput; + break; + } +} + +static void Task_CryScreenProcessInput(u8 taskId) +{ + sub_8119F88(0); + + if (IsCryPlaying()) + sub_8090040(1); + else + sub_8090040(0); + + if (gMain.newKeys & A_BUTTON) + { + sub_8090040(1); + sub_811A050(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum)); + return; + } + else if (!gPaletteFade.active) + { + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlay_BGM); + gPokedexView->unk64F = 1; + gTasks[taskId].func = sub_808FFBC; + PlaySE(SE_PC_OFF); + return; + } + if ((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlay_BGM); + gPokedexView->unk64F = 2; + gTasks[taskId].func = sub_808FFBC; + PlaySE(SE_Z_PAGE); + return; + } + if ((gMain.newKeys & DPAD_RIGHT) + || ((gMain.newKeys & R_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + if (!gUnknown_0202FFBC->owned) + { + PlaySE(SE_HAZURE); + } + else + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlay_BGM); + gPokedexView->unk64F = 3; + gTasks[taskId].func = sub_808FFBC; + PlaySE(SE_Z_PAGE); + } + return; + } + } +} + +static void sub_808FFBC(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyCryMeterNeedleSprite(); + switch (gPokedexView->unk64F) + { + default: + case 1: + gTasks[taskId].func = Task_InitPageScreenMultistep; + break; + case 2: + gTasks[taskId].func = Task_InitAreaScreenMultistep; + break; + case 3: + gTasks[taskId].func = Task_InitSizeScreenMultistep; + break; + } + } +} + +static void sub_8090040(u8 a) +{ + u16 unk; + + if (a != 0) + unk = 0x392; + else + unk = 0x2AF; + LoadPalette(&unk, 0x5D, 2); +} + +static void Task_InitSizeScreenMultistep(u8 taskId) +{ + u8 spriteId; + + switch (gMain.state) + { + default: + case 0: + if (!gPaletteFade.active) + { + gPokedexView->unk64A = 7; + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_8091060(0x200); + gPokedexView->selectedScreen = SIZE_SCREEN; + gMain.state = 1; + } + break; + case 1: + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); + LZ77UnCompVram(gUnknown_0839F988, (void *)(VRAM + 0x7000)); + gMain.state++; + break; + case 2: + sub_8090540(0xD); + sub_8090644(3, 0xD); + sub_808D640(); + gMain.state++; + break; + case 3: + { + u8 string[40]; //I hope this is the correct size + + Text_LoadWindowTemplate(&gWindowTemplate_81E702C); + InitMenuWindow(&gWindowTemplate_81E702C); + string[0] = EOS; + StringAppend(string, gDexText_SizeComparedTo); + StringAppend(string, gSaveBlock2.playerName); + sub_8072BD8(string, 3, 15, 0xC0); + gMain.state++; + } + break; + case 4: + ResetPaletteFade(); + gMain.state++; + break; + case 5: + spriteId = sub_8091A4C(gSaveBlock2.playerGender, 152, 56, 0); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 1; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerOffset; + SetOamMatrix(1, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale); + LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, sizeof(gUnknown_083B4EC4)); + gMain.state++; + break; + case 6: + spriteId = sub_80918EC(gUnknown_0202FFBC->dexNum, 88, 56, 1); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 2; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonOffset; + SetOamMatrix(2, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale); + LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, sizeof(gUnknown_083B4EC4)); + gMain.state++; + break; + case 7: + BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); + SetVBlankCallback(gUnknown_03005CEC); + gMain.state++; + break; + case 8: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + gMain.state++; + break; + case 9: + if (!gPaletteFade.active) + { + gPokedexView->unk64F = 0; + gMain.state = 0; + gTasks[taskId].func = Task_SizeScreenProcessInput; + } + break; + } +} + +static void Task_SizeScreenProcessInput(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gPokedexView->unk64F = 1; + gTasks[taskId].func = sub_8090498; + PlaySE(SE_PC_OFF); + } + else if ((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gPokedexView->unk64F = 2; + gTasks[taskId].func = sub_8090498; + PlaySE(SE_Z_PAGE); + } +} + +static void sub_8090498(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (gPokedexView->unk64F) + { + default: + case 1: + gTasks[taskId].func = Task_InitPageScreenMultistep; + break; + case 2: + gTasks[taskId].func = Task_InitCryScreenMultistep; + break; + } + } +} + +static void sub_80904FC(u16 a) +{ + LZ77UnCompVram(gUnknown_08E96ACC, (void *)(VRAM + a * 0x800)); + DmaClear16(3, (void *)(VRAM + a * 0x800 + 0xC0), 0x440); +} + +static void sub_8090540(u16 a) +{ + LZ77UnCompVram(gUnknown_08E96B58, (void *)(VRAM + a * 0x800)); + DmaClear16(3, (void *)(VRAM + a * 0x800 + 0xC0), 0x440); +} + +#ifdef NONMATCHING +static void sub_8090584(u8 a, u16 b) +{ + u8 i; //r1 + u8 j; //r3 + u32 r6; + register u8 r7; + + for (i = 0; i < 4; i++) + { + r7 = i * 5 + 1; + r6 = 0x4000; + + if (i == a) + r6 = 0x2000; + + for (j = 0; j < 5; j++) + { + u32 r0 = b * 0x800 + (r7 + j) * 2; + u8 *ptr; + + ptr = VRAM; + *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; + ptr = VRAM + 0x40; + *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; + } + } + r6 = 0x4000; + for (j = 0; j < 5; j++) + { + u32 r0 = b * 0x800 + j * 2; + u8 *ptr; + + ptr = VRAM + 0x32; + *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; + ptr = VRAM + 0x72; + *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; + } +} +#else +__attribute__((naked)) +static void sub_8090584(u8 a, u16 b) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r9, r1\n\ + movs r1, 0\n\ +_0809059C:\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + movs r6, 0x80\n\ + lsls r6, 7\n\ + cmp r1, r10\n\ + bne _080905B2\n\ + movs r6, 0x80\n\ + lsls r6, 6\n\ +_080905B2:\n\ + movs r3, 0\n\ + mov r0, r9\n\ + lsls r0, 11\n\ + mov r12, r0\n\ + adds r1, 0x1\n\ + mov r8, r1\n\ + mov r5, r12\n\ + ldr r4, _08090634 @ =0x00000fff\n\ +_080905C2:\n\ + adds r0, r7, r3\n\ + lsls r0, 1\n\ + adds r0, r5, r0\n\ + movs r2, 0xC0\n\ + lsls r2, 19\n\ + adds r1, r0, r2\n\ + ldrh r2, [r1]\n\ + ands r2, r4\n\ + orrs r2, r6\n\ + strh r2, [r1]\n\ + ldr r1, _08090638 @ =0x06000040\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ands r2, r4\n\ + orrs r2, r6\n\ + strh r2, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x4\n\ + bls _080905C2\n\ + mov r2, r8\n\ + lsls r0, r2, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x3\n\ + bls _0809059C\n\ + movs r6, 0x80\n\ + lsls r6, 7\n\ + movs r3, 0\n\ + mov r5, r12\n\ + ldr r4, _08090634 @ =0x00000fff\n\ +_08090600:\n\ + lsls r0, r3, 1\n\ + adds r0, r5, r0\n\ + ldr r2, _0809063C @ =0x06000032\n\ + adds r1, r0, r2\n\ + ldrh r2, [r1]\n\ + ands r2, r4\n\ + orrs r2, r6\n\ + strh r2, [r1]\n\ + ldr r1, _08090640 @ =0x06000072\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ands r2, r4\n\ + orrs r2, r6\n\ + strh r2, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x4\n\ + bls _08090600\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08090634: .4byte 0x00000fff\n\ +_08090638: .4byte 0x06000040\n\ +_0809063C: .4byte 0x06000032\n\ +_08090640: .4byte 0x06000072\n\ + .syntax divided\n"); +} +#endif + +//Nope, can't get this one to match, either. +#ifdef NONMATCHING +static void sub_8090644(u8 a, u16 b) +{ + u8 i; + u8 j; + + for (i = 0; i < 4; i++) + { + u8 r8 = i * 5 + 1; + u32 r5; + + if (i == a || i == 0) + r5 = 0x2000; + else if (a != 0) + r5 = 0x4000; + + for (j = 0; j < 5; j++) + { + u16 (*vramData)[0x400]; + + vramData = (u16 (*)[])VRAM; + vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5; + vramData = (u16 (*)[])(VRAM + 0x40); + vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5; + } + } + + for (j = 0; j < 5; j++) + { + u16 (*vramData)[0x400]; + + vramData = (u16 (*)[])(VRAM + 0x32); + vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000; + vramData = (u16 (*)[])(VRAM + 0x72); + vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000; + } +} +#else +__attribute__((naked)) +static void sub_8090644(u8 a, u16 b) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r9, r1\n\ + movs r1, 0\n\ +_0809065C:\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + cmp r1, r10\n\ + beq _08090670\n\ + cmp r1, 0\n\ + bne _08090676\n\ +_08090670:\n\ + movs r5, 0x80\n\ + lsls r5, 6\n\ + b _0809067A\n\ +_08090676:\n\ + movs r5, 0x80\n\ + lsls r5, 7\n\ +_0809067A:\n\ + movs r3, 0\n\ + mov r0, r9\n\ + lsls r7, r0, 11\n\ + adds r1, 0x1\n\ + mov r12, r1\n\ + adds r6, r7, 0\n\ + ldr r4, _080906FC @ =0x00000fff\n\ +_08090688:\n\ + mov r1, r8\n\ + adds r0, r1, r3\n\ + lsls r0, 1\n\ + adds r0, r6, r0\n\ + movs r2, 0xC0\n\ + lsls r2, 19\n\ + adds r1, r0, r2\n\ + ldrh r2, [r1]\n\ + ands r2, r4\n\ + orrs r2, r5\n\ + strh r2, [r1]\n\ + ldr r1, _08090700 @ =0x06000040\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ands r2, r4\n\ + orrs r2, r5\n\ + strh r2, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x4\n\ + bls _08090688\n\ + mov r2, r12\n\ + lsls r0, r2, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x3\n\ + bls _0809065C\n\ + movs r5, 0x80\n\ + lsls r5, 7\n\ + movs r3, 0\n\ + adds r6, r7, 0\n\ + ldr r4, _080906FC @ =0x00000fff\n\ +_080906C8:\n\ + lsls r0, r3, 1\n\ + adds r0, r6, r0\n\ + ldr r2, _08090704 @ =0x06000032\n\ + adds r1, r0, r2\n\ + ldrh r2, [r1]\n\ + ands r2, r4\n\ + orrs r2, r5\n\ + strh r2, [r1]\n\ + ldr r1, _08090708 @ =0x06000072\n\ + adds r0, r1\n\ + ldrh r2, [r0]\n\ + ands r2, r4\n\ + orrs r2, r5\n\ + strh r2, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x4\n\ + bls _080906C8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080906FC: .4byte 0x00000fff\n\ +_08090700: .4byte 0x06000040\n\ +_08090704: .4byte 0x06000032\n\ +_08090708: .4byte 0x06000072\n\ + .syntax divided\n"); +} +#endif + +u8 sub_809070C(u16 dexNum, u32 b, u32 c) +{ + u8 taskId = CreateTask(sub_8090750, 0); + + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = dexNum; + gTasks[taskId].data[12] = b; + gTasks[taskId].data[13] = b >> 16; + gTasks[taskId].data[14] = c; + gTasks[taskId].data[15] = c >> 16; + return taskId; +} + +static void sub_8090750(u8 taskId) +{ + u8 spriteId; + u16 dexNum = gTasks[taskId].data[1]; + u16 i; + + switch (gTasks[taskId].data[0]) + { + case 0: + default: + if (!gPaletteFade.active) + { + gUnknown_03005CEC = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_8091060(0x100); + gTasks[taskId].data[0] = 1; + } + break; + case 1: + LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800)); + for (i = 0; i < 0x280; i++) + { +#ifndef NONMATCHING + asm(""); +#endif + *(u16 *)(VRAM + 0x7800 + 2 * i) += 0x2000; + } + sub_8091738(gTasks[taskId].data[1], 2, 0x3FC); + ResetPaletteFade(); + LoadPalette(gPokedexMenu_Pal + 1, 0x21, 0x9E); + gTasks[taskId].data[0]++; + break; + case 2: + Text_LoadWindowTemplate(&gWindowTemplate_81E7064); + InitMenuWindow(&gWindowTemplate_81E7064); + DmaClear16(3, (void *)(VRAM + 0xC000), 0x200); + gTasks[taskId].data[0]++; + break; + case 3: + sub_8072BD8(gDexText_RegisterComplete, 2, 0, 0xD0); + if (!IsNationalPokedexEnabled()) + sub_8091154(NationalToHoennOrder(dexNum), 13, 3); + else + sub_8091154(dexNum, 13, 3); + sub_80911C8(dexNum, 16, 3); + Menu_PrintText(gDexText_UnknownPoke, CATEGORY_LEFT, 5); + Menu_PrintText(gDexText_UnknownHeight, 16, 7); + Menu_PrintText(gDexText_UnknownWeight, 16, 9); + sub_8091304(gPokedexEntries[dexNum].categoryName, CATEGORY_LEFT, 5); + sub_8091458(gPokedexEntries[dexNum].height, 16, 7); + sub_8091564(gPokedexEntries[dexNum].weight, 16, 9); + Menu_PrintText(gPokedexEntries[dexNum].descriptionPage1, 2, 13); + sub_80917CC(14, 0x3FC); + gTasks[taskId].data[0]++; + break; + case 4: + spriteId = sub_80918EC(dexNum, 0x30, 0x38, 0); + gSprites[spriteId].oam.priority = 0; + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + SetVBlankCallback(gUnknown_03005CEC); + gTasks[taskId].data[3] = spriteId; + gTasks[taskId].data[0]++; + break; + case 5: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + gTasks[taskId].data[0]++; + break; + case 6: + if (!gPaletteFade.active) + { + PlayCry1(NationalPokedexNumToSpecies(dexNum), 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[4] = 0; + gTasks[taskId].func = sub_8090A3C; + } + break; + } +} + +static void sub_8090A3C(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(0x0000FFFC, 0, 0, 16, 0); + gSprites[gTasks[taskId].data[3]].callback = sub_8090C28; + gTasks[taskId].func = sub_8090B8C; + return; + } + else if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskId].data[4] == 0) + { + u16 r4 = gTasks[taskId].data[1]; + + Menu_EraseWindowRect(2, 13, 27, 19); + Menu_PrintText(gPokedexEntries[r4].descriptionPage2, 2, 13); + (*(u16 *)(VRAM + 0x7ACA))++; + (*(u16 *)(VRAM + 0x7B0A))++; + gTasks[taskId].data[4] = 1; + PlaySE(SE_PIN); + } + else + { + BeginNormalPaletteFade(0x0000FFFC, 0, 0, 16, 0); + gSprites[gTasks[taskId].data[3]].callback = sub_8090C28; + gTasks[taskId].func = sub_8090B8C; + return; + } + } + gTasks[taskId].data[2]++; + if (gTasks[taskId].data[2] & 0x10) + LoadPalette(gPokedexMenu_Pal + 1, 0x51, 14); + else + LoadPalette(gPokedexMenu2_Pal + 1, 0x51, 14); +} + +static void sub_8090B8C(u8 taskId) +{ + if (!gPaletteFade.active) + { + u16 species; + u32 otId; + u32 personality; + u8 paletteNum; + const u8 *lzPaletteData; + + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; + CpuCopy16(gUnknown_08D00524, (void *)(VRAM + 0xC000), 0x1000); + sub_800D74C(); + species = NationalPokedexNumToSpecies(gTasks[taskId].data[1]); + otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12]; + personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14]; + paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum; + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personality); + LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32); + DestroyTask(taskId); + } +} + +static void sub_8090C28(struct Sprite *sprite) +{ + if (sprite->pos1.x < 0x78) + sprite->pos1.x += 2; + if (sprite->pos1.x > 0x78) + sprite->pos1.x -= 2; + + if (sprite->pos1.y < 0x50) + sprite->pos1.y += 1; + if (sprite->pos1.y > 0x50) + sprite->pos1.y -= 1; +} + +static void sub_8090C68(void) +{ + if (gUnknown_0202FFBC->owned) + { + if (gPokedexView->descriptionPageNum == 0) + { + Menu_EraseWindowRect(2, 13, 27, 19); + Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage2, 2, 13); + gPokedexView->descriptionPageNum = 1; + (*(u16 *)(VRAM + 0x7ACA))++; + (*(u16 *)(VRAM + 0x7B0A))++; + PlaySE(SE_PIN); + } + else + { + Menu_EraseWindowRect(2, 13, 27, 19); + Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); + gPokedexView->descriptionPageNum = 0; + (*(u16 *)(VRAM + 0x7ACA))--; + (*(u16 *)(VRAM + 0x7B0A))--; + PlaySE(SE_PIN); + } + } +} + +const u8 *GetPokemonCategory(u16 dexNum) +{ + return gPokedexEntries[dexNum].categoryName; +} + +u16 GetPokedexHeightWeight(u16 dexNum, u8 data) +{ + switch (data) + { + case 0: // height + return gPokedexEntries[dexNum].height; + case 1: // weight + return gPokedexEntries[dexNum].weight; + default: + return 1; + } +} + +s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID) +{ + u8 index; + u8 bit; + u8 mask; + s8 retVal; + + nationalDexNo--; + index = nationalDexNo / 8; + bit = nationalDexNo % 8; + mask = 1 << bit; + retVal = 0; + switch (caseID) + { + case FLAG_GET_SEEN: + if (gSaveBlock2.pokedex.seen[index] & mask) + { + if ((gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.dexSeen2[index] & mask) + && (gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.dexSeen3[index] & mask)) + retVal = 1; + else + { + gSaveBlock2.pokedex.seen[index] &= ~mask; + gSaveBlock1.dexSeen2[index] &= ~mask; + gSaveBlock1.dexSeen3[index] &= ~mask; + retVal = 0; + } + } + break; + case FLAG_GET_CAUGHT: + if (gSaveBlock2.pokedex.owned[index] & mask) + { + if ((gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock2.pokedex.seen[index] & mask) + && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.dexSeen2[index] & mask) + && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.dexSeen3[index] & mask)) + retVal = 1; + else + { + gSaveBlock2.pokedex.owned[index] &= ~mask; + gSaveBlock2.pokedex.seen[index] &= ~mask; + gSaveBlock1.dexSeen2[index] &= ~mask; + gSaveBlock1.dexSeen3[index] &= ~mask; + retVal = 0; + } + } + break; + case FLAG_SET_SEEN: + gSaveBlock2.pokedex.seen[index] |= mask; + gSaveBlock1.dexSeen2[index] |= mask; + gSaveBlock1.dexSeen3[index] |= mask; + break; + case FLAG_SET_CAUGHT: + gSaveBlock2.pokedex.owned[index] |= mask; + break; + } + return retVal; +} + +u16 GetNationalPokedexCount(u8 caseID) +{ + u16 count = 0; + u16 i; + + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + switch (caseID) + { + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) + count++; + break; + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) + count++; + break; + } + } + return count; +} + +u16 GetHoennPokedexCount(u8 caseID) +{ + u16 count = 0; + u16 i; + + for (i = 0; i < 202; i++) + { + switch (caseID) + { + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_SEEN)) + count++; + break; + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) + count++; + break; + } + } + return count; +} + +bool8 CompletedHoennPokedex(void) +{ + u16 i; + + for (i = 0; i < 200; i++) + { + if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) + return FALSE; + } + return TRUE; +} + +bool16 CompletedNationalPokedex(void) +{ + u16 i; + + // BUG: This function indexes pokemon checks by 0, but adds + // 1 before passing to GetSetPokedexFlag. Normally, this is + // fine, because GetSetPokedexFlag subtracts by 1 to get the + // array index value, but since the array is 0 indexed + // starting with Bulbasaur, values passed actually means that + // dex entries 152 (Chikorita) and 252 (Treecko) are skipped. + // Because an earlier Hoenn Dex check prevented Treecko from + // being skippable, it means that Chikorita is not required + // to obtain the National Diploma. This was fixed in Emerald. + for (i = 0; i < 150; i++) + { + if (GetSetPokedexFlag(i + 1, 1) == 0) + return FALSE; + } + for (i = 152; i < 250; i++) + { + if (GetSetPokedexFlag(i + 1, 1) == 0) + return FALSE; + } + for (i = 252; i < 384; i++) + { + if (GetSetPokedexFlag(i + 1, 1) == 0) + return FALSE; + } + return TRUE; +} + +static void sub_8091060(u16 a) +{ + if (!(a & 0x100)) + { + REG_DISPCNT &= 0xFEFF; + REG_BG0CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + } + if (!(a & 0x200)) + { + REG_DISPCNT &= 0xFDFF; + REG_BG1CNT = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + } + if (!(a & 0x400)) + { + REG_DISPCNT &= 0xFBFF; + REG_BG2CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + } + if (!(a & 0x800)) + { + REG_DISPCNT &= 0xF7FF; + REG_BG3CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + } + if (!(a & 0x1000)) + { + REG_DISPCNT &= 0xEFFF; + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + } +} + +static void sub_8091154(u16 order, u8 b, u8 c) +{ + u8 str[4]; + + str[0] = CHAR_0 + order / 100; + str[1] = CHAR_0 + (order % 100) / 10; + str[2] = CHAR_0 + (order % 100) % 10; + str[3] = EOS; + Menu_PrintText(str, b, c); +} + +static u8 sub_80911C8(u16 num, u8 b, u8 c) +{ + u8 str[11]; + u8 i; + + for (i = 0; i < 11; i++) + str[i] = EOS; + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) + str[i] = gSpeciesNames[num][i]; + break; + case 0: + for (i = 0; i < 10; i++) + str[i] = 0xAE; + break; + } + Menu_PrintText(str, b, c); + return i; +} + +static u8 sub_8091260(u16 num, u8 b, u8 c, u8 d) +{ + u8 str[40]; + u8 *end; + u8 i; + + end = StringCopy(str, gUnknown_083B5558); + str[2] = d; + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) + end[i] = gSpeciesNames[num][i]; + break; + case 0: + for (i = 0; i < 10; i++) + end[i] = 0xAE; + break; + } + end[i] = EOS; + Menu_PrintText(str, b, c); + return i; +} + +static void sub_8091304(const u8 *name, u8 left, u8 top) +{ + u8 str[32]; + u8 i; +#if ENGLISH + u8 j; +#endif + + for (i = 0; name[i] != EOS && i < 11; i++) + str[i] = name[i]; +#if ENGLISH + for (j = 0; gDexText_UnknownPoke[j] == 0xAC || gDexText_UnknownPoke[j] == 0; j++) + ; + j--; + while (gDexText_UnknownPoke[j] != EOS) + str[i++] = gDexText_UnknownPoke[j++]; +#endif + str[i] = EOS; + sub_8072B80(str, left, top, gDexText_UnknownPoke); +} + +#if ENGLISH +void unref_sub_80913A4(u16 a, u8 left, u8 top) +{ + u8 str[6]; + bool8 outputted = FALSE; + u8 result; + + result = a / 1000; + if (result == 0) + { + str[0] = CHAR_SPACE; + outputted = FALSE; + } + else + { + str[0] = CHAR_0 + result; + outputted = TRUE; + } + + result = (a % 1000) / 100; + if (result == 0 && !outputted) + { + str[1] = CHAR_SPACE; + outputted = FALSE; + } + else + { + str[1] = CHAR_0 + result; + outputted = TRUE; + } + + str[2] = CHAR_0 + ((a % 1000) % 100) / 10; + str[3] = CHAR_PERIOD; + str[4] = CHAR_0 + ((a % 1000) % 100) % 10; + str[5] = EOS; + Menu_PrintText(str, left, top); +} +#elif GERMAN +void unref_sub_80913A4(u16 arg0, u8 left, u8 top) { + u8 buffer[8]; + int offset; + u8 result; + + u8 r6 = 0; + offset = 0; + + + buffer[r6++] = 0xFC; + buffer[r6++] = 0x13; + r6++; + + result = (arg0 / 1000); + if (result == 0) + { + offset = 6; + } + else + { + buffer[r6++] = result + CHAR_0; + } + + + result = (arg0 % 1000) / 100; + + if (result == 0 && offset != 0) + { + offset += 6; + } + else + { + buffer[r6++] = result + CHAR_0; + } + + buffer[r6++] = (((arg0 % 1000) % 100) / 10) + CHAR_0; + buffer[r6++] = CHAR_COMMA; + buffer[r6++] = (((arg0 % 1000) % 100) % 10) + CHAR_0; + + buffer[r6++] = EOS; + buffer[2] = offset; + Menu_PrintText(buffer, left, top); +} +#endif + +#ifdef UNITS_IMPERIAL +#define CHAR_PRIME (0xB4) +#define CHAR_DOUBLE_PRIME (0xB2) +static void sub_8091458(u16 height, u8 left, u8 top) +{ + u8 buffer[16]; + u32 inches, feet; + u8 i = 0; + + inches = (height * 10000) / 254; + if (inches % 10 >= 5) + inches += 10; + feet = inches / 120; + inches = (inches - (feet * 120)) / 10; + + buffer[i++] = EXT_CTRL_CODE_BEGIN; + buffer[i++] = 0x13; + if (feet / 10 == 0) + { + buffer[i++] = 18; + buffer[i++] = feet + CHAR_0; + } + else + { + buffer[i++] = 12; + buffer[i++] = feet / 10 + CHAR_0; + buffer[i++] = (feet % 10) + CHAR_0; + } + buffer[i++] = CHAR_PRIME; + buffer[i++] = (inches / 10) + CHAR_0; + buffer[i++] = (inches % 10) + CHAR_0; + buffer[i++] = CHAR_DOUBLE_PRIME; + buffer[i++] = EOS; + Menu_PrintText(buffer, left, top); +} +#else +static void sub_8091458(u16 height, u8 left, u8 top) +{ + unref_sub_80913A4(height, left, top); +} +#endif + +#ifdef UNITS_IMPERIAL +static void sub_8091564(u16 weight, u8 left, u8 top) +{ + u8 buffer[16]; + u32 lbs; + u8 i = 0; + bool8 output; + + lbs = (weight * 100000) / 4536; + if (lbs % 10 >= 5) + lbs += 10; + output = FALSE; + + buffer[i] = (lbs / 100000) + CHAR_0; + if (buffer[i] == CHAR_0 && output == FALSE) + { + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_SPACE; + } + else + { + output = TRUE; + i++; + } + + lbs = (lbs % 100000); + buffer[i] = (lbs / 10000) + CHAR_0; + if (buffer[i] == CHAR_0 && output == FALSE) + { + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_SPACE; + } + else + { + output = TRUE; + i++; + } + + lbs = (lbs % 10000); + buffer[i] = (lbs / 1000) + CHAR_0; + if (buffer[i] == CHAR_0 && output == FALSE) + { + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_SPACE; + } + else + { + output = TRUE; + i++; + } + lbs = (lbs % 1000); + buffer[i++] = (lbs / 100) + CHAR_0; + lbs = (lbs % 100); + buffer[i++] = CHAR_PERIOD; + buffer[i++] = (lbs / 10) + CHAR_0; + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_l; + buffer[i++] = CHAR_b; + buffer[i++] = CHAR_s; + buffer[i++] = CHAR_PERIOD; + buffer[i++] = EOS; + Menu_PrintText(buffer, left, top); +} +#else +static void sub_8091564(u16 arg0, u8 left, u8 top) +{ + unref_sub_80913A4(arg0, left, top); +} +#endif + +void sub_8091738(u16 num, u16 b, u16 c) +{ + u8 arr[0x80]; + u16 i; + u16 j; + const u8 *r12; + u16 r7; + u8 r3; + + r12 = sMonFootprintTable[NationalPokedexNumToSpecies(num)]; + for (r7 = 0, i = 0; i < 32; i++) + { + r3 = r12[i]; + for (j = 0; j < 4; j++) + { + u32 r1 = j * 2; + s32 r2 = (r3 >> r1) & 1; + + if (r3 & (2 << r1)) + r2 |= 0x10; + +// Needed to match +#ifndef NONMATCHING + asm("");asm("");asm("");asm("");asm(""); +#endif + + arr[r7] = r2; + r7++; + } + } + CpuCopy16(arr, (u16 *)(VRAM + b * 0x4000 + c * 0x20), 0x80); +} + +static void sub_80917CC(u16 a, u16 b) +{ + *(u16 *)(VRAM + a * 0x800 + 0x232) = 0xF000 + b + 0; + *(u16 *)(VRAM + a * 0x800 + 0x234) = 0xF000 + b + 1; + *(u16 *)(VRAM + a * 0x800 + 0x272) = 0xF000 + b + 2; + *(u16 *)(VRAM + a * 0x800 + 0x274) = 0xF000 + b + 3; +} + +static u16 sub_8091818(u8 a, u16 b, u16 c, u16 d) +{ + switch (a) + { + case 1: + if (b > c) + b--; + break; + case 0: + if (b < d) + b++; + break; + case 3: + if (b > c) + b--; + else + b = d; + break; + case 2: + if (b < d) + b++; + else + b = c; + break; + } + return b; +} + +static void nullsub_59(struct Sprite *sprite) +{ +} + +static void sub_8091878(u16 a, u8 b) +{ + gUnknown_02024E8C = gUnknown_083B57A4; + gUnknown_02024E8C.paletteTag = a; + gUnknown_02024E8C.images = gUnknown_083B5794[b]; + gUnknown_02024E8C.anims = gSpriteAnimTable_81E7C64; +} + +static void sub_80918B0(u16 a, u8 b) +{ + gUnknown_02024E8C = gUnknown_083B57A4; + gUnknown_02024E8C.paletteTag = a; + gUnknown_02024E8C.images = gUnknown_083B5794[b]; + gUnknown_02024E8C.anims = gUnknown_081EC2A4[0]; +} + +u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum) +{ + u8 spriteId; + + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + DecompressPicFromTable_2( + &gMonFrontPicTable[num], + gMonFrontPicCoords[num].coords, + gMonFrontPicCoords[num].y_offset, + (void*)ewram_addr, + gUnknown_083B5584[paletteNum], + num); + break; + case SPECIES_SPINDA: + LoadSpecialPokePic( + &gMonFrontPicTable[num], + gMonFrontPicCoords[num].coords, + gMonFrontPicCoords[num].y_offset, + ewram_addr, + gUnknown_083B5584[paletteNum], + num, + gSaveBlock2.pokedex.spindaPersonality, + 1); + break; + case SPECIES_UNOWN: + LoadSpecialPokePic( + &gMonFrontPicTable[num], + gMonFrontPicCoords[num].coords, + gMonFrontPicCoords[num].y_offset, + ewram_addr, + gUnknown_083B5584[paletteNum], + num, + gSaveBlock2.pokedex.unownPersonality, + 1); + break; + } + LoadCompressedPalette(gMonPaletteTable[num].data, 0x100 + paletteNum * 16, 32); + sub_8091878(paletteNum, paletteNum); + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].oam.paletteNum = paletteNum; + return spriteId; +} + +u8 sub_8091A4C(u16 gender, s16 x, s16 y, u16 paletteNum) +{ + u8 spriteId; + + DecompressPicFromTable_2( + &gTrainerFrontPicTable[gender], + gTrainerFrontPicCoords[gender].coords, + gTrainerFrontPicCoords[gender].y_offset, + (void*)ewram_addr, + gUnknown_083B5584[0], + gender); + sub_80918B0(gender, 0); + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].oam.paletteNum = paletteNum; + return spriteId; +} + +int sub_8091AF8(u8 a, u8 b, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) +{ + u16 species; + u16 i; + u16 resultsCount; + u8 types[2]; + + SortPokedex(a, b); + + for (i = 0, resultsCount = 0; i < NATIONAL_DEX_COUNT; i++) + { + if (gPokedexView->unk0[i].seen) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + gPokedexView->pokemonListCount = resultsCount; + + // Search by name + if (abcGroup != 0xFF) + { + for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) + { + u8 r3; + + species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); + r3 = gSpeciesNames[species][0]; + if ((r3 >= gUnknown_083B57BC[abcGroup][0] && r3 < gUnknown_083B57BC[abcGroup][0] + gUnknown_083B57BC[abcGroup][1]) + || (r3 >= gUnknown_083B57BC[abcGroup][2] && r3 < gUnknown_083B57BC[abcGroup][2] + gUnknown_083B57BC[abcGroup][3])) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + gPokedexView->pokemonListCount = resultsCount; + } + + // Search by body color + if (bodyColor != 0xFF) + { + for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) + { + species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); + + if (bodyColor == gBaseStats[species].bodyColor) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + gPokedexView->pokemonListCount = resultsCount; + } + + // Search by type + if (type1 != 0xFF || type2 != 0xFF) + { + if (type1 == 0xFF) + { + type1 = type2; + type2 = 0xFF; + } + + if (type2 == 0xFF) + { + for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) + { + if (gPokedexView->unk0[i].owned) + { + species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); + + types[0] = gBaseStats[species].type1; + types[1] = gBaseStats[species].type2; + if (types[0] == type1 || types[1] == type1) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + } + } + else + { + for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) + { + if (gPokedexView->unk0[i].owned) + { + species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); + + types[0] = gBaseStats[species].type1; + types[1] = gBaseStats[species].type2; + if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) + { + gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; + resultsCount++; + } + } + } + } + gPokedexView->pokemonListCount = resultsCount; + } + + if (gPokedexView->pokemonListCount != 0) + { + for (i = gPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) + { + gPokedexView->unk0[i].dexNum = 0xFFFF; + gPokedexView->unk0[i].seen = FALSE; + gPokedexView->unk0[i].owned = FALSE; + + } + } + + return resultsCount; +} + +#if ENGLISH +#define SUB_8091E20_WIDTH (208) +#elif GERMAN +#define SUB_8091E20_WIDTH (216) +#endif + +void sub_8091E20(const u8 *str) +{ + sub_8072AB0(str, 9, 120, SUB_8091E20_WIDTH, 32, 1); +} + +u8 sub_8091E3C(void) +{ + return CreateTask(sub_8091E54, 0); +} + +static void sub_8091E54(u8 taskId) +{ + u16 i; + + switch (gMain.state) + { + default: + case 0: + if (!gPaletteFade.active) + { + gPokedexView->unk64A = 2; + sub_8091060(0); + LZ77UnCompVram(gPokedexMenuSearch_Gfx, (void *)VRAM); + LZ77UnCompVram(gUnknown_08E96D2C, (void *)(VRAM + 0x7800)); + LoadPalette(gPokedexMenuSearch_Pal + 1, 1, 0x7E); + if (!IsNationalPokedexEnabled()) + { + for (i = 0; i < 17; i++) + { + ((u16 *)(VRAM + 0x7A80))[i] = ((u16 *)(VRAM + 0x7B00))[i]; + ((u16 *)(VRAM + 0x7AC0))[i] = ((u16 *)(VRAM + 0x7B40))[i]; + ((u16 *)(VRAM + 0x7B00))[i] = 1; + ((u16 *)(VRAM + 0x7B40))[i] = 1; + } + } + gMain.state = 1; + } + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E7064); + InitMenuWindow(&gWindowTemplate_81E7064); + LoadCompressedObjectPic(&gUnknown_083A05CC[0]); + LoadSpritePalettes(gUnknown_083A05DC); + sub_809308C(taskId); + for (i = 0; i < 16; i++) + gTasks[taskId].data[i] = 0; + sub_8092EB0(taskId); + sub_8092AB0(0); + sub_8092B68(taskId); + gMain.state++; + break; + case 2: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + gMain.state++; + break; + case 3: + REG_BG3CNT = 0x0F03; + REG_DISPCNT = 0x1C40; + gMain.state++; + break; + case 4: + if (!gPaletteFade.active) + { + gTasks[taskId].func = sub_809204C; + gMain.state = 0; + } + break; + } +} + +static void sub_809204C(u8 taskId) +{ + sub_8092AB0(gTasks[taskId].data[0]); + sub_8092B68(taskId); + gTasks[taskId].func = sub_809207C; +} + +static void sub_809207C(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80927B8; + return; + } + if (gMain.newKeys & A_BUTTON) + { + switch (gTasks[taskId].data[0]) + { + case 0: + PlaySE(SE_PIN); + gTasks[taskId].data[1] = 0; + gTasks[taskId].func = sub_809217C; + break; + case 1: + PlaySE(SE_PIN); + gTasks[taskId].data[1] = 4; + gTasks[taskId].func = sub_809217C; + break; + case 2: + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80927B8; + break; + } + return; + } + if ((gMain.newKeys & DPAD_LEFT) && gTasks[taskId].data[0] > 0) + { + PlaySE(SE_Z_PAGE); + gTasks[taskId].data[0]--; + sub_8092AB0(gTasks[taskId].data[0]); + } + if ((gMain.newKeys & DPAD_RIGHT) && gTasks[taskId].data[0] < 2) + { + PlaySE(SE_Z_PAGE); + gTasks[taskId].data[0]++; + sub_8092AB0(gTasks[taskId].data[0]); + } +} + +static void sub_809217C(u8 taskId) +{ + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + sub_8092B68(taskId); + gTasks[taskId].func = sub_80921B0; +} + +static void sub_80921B0(u8 taskId) +{ + const u8 (*r6)[4]; + + if (gTasks[taskId].data[0] != 0) + { + if (!IsNationalPokedexEnabled()) + r6 = gUnknown_083B58A4; + else + r6 = gUnknown_083B586C; + } + else + { + if (!IsNationalPokedexEnabled()) + r6 = gUnknown_083B5888; + else + r6 = gUnknown_083B5850; + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_BOWA); + sub_8092EB0(taskId); + gTasks[taskId].func = sub_809204C; + return; + } + if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskId].data[1] == 6) + { + if (gTasks[taskId].data[0] != 0) + { + gUnknown_0202FFBA = 0x40; + gPokedexView->unk62A = 0x40; + gUnknown_0202FFB8 = 0; + gPokedexView->unk610 = 0; + gSaveBlock2.pokedex.unknown1 = sub_8092E10(taskId, 5); + if (!IsNationalPokedexEnabled()) + gSaveBlock2.pokedex.unknown1 = 0; + gPokedexView->unk614 = gSaveBlock2.pokedex.unknown1; + gSaveBlock2.pokedex.order = sub_8092E10(taskId, 4); + gPokedexView->unk618 = gSaveBlock2.pokedex.order; + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80927B8; + } + else + { + sub_8091E20(gDexText_Searching); + gTasks[taskId].func = sub_80923FC; + PlaySE(SE_Z_SEARCH); + } + } + else + { + PlaySE(SE_PIN); + gTasks[taskId].func = sub_80925CC; + } + return; + } + + if ((gMain.newKeys & DPAD_LEFT) && r6[gTasks[taskId].data[1]][0] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][0]; + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + } + if ((gMain.newKeys & DPAD_RIGHT) && r6[gTasks[taskId].data[1]][1] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][1]; + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + } + if ((gMain.newKeys & DPAD_UP) && r6[gTasks[taskId].data[1]][2] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][2]; + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + } + if ((gMain.newKeys & DPAD_DOWN) && r6[gTasks[taskId].data[1]][3] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][3]; + sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); + } +} + +static void sub_80923FC(u8 taskId) +{ + u8 r10 = sub_8092E10(taskId, 5); + u8 r9 = sub_8092E10(taskId, 4); + u8 r8 = sub_8092E10(taskId, 0); + u8 r6 = sub_8092E10(taskId, 1); + u8 r4 = sub_8092E10(taskId, 2); + u8 r0 = sub_8092E10(taskId, 3); + + sub_8091AF8(r10, r9, r8, r6, r4, r0); + gTasks[taskId].func = sub_80924A4; +} + +static void sub_80924A4(u8 taskId) +{ + if (!IsSEPlaying()) + { + if (gPokedexView->pokemonListCount != 0) + { + PlaySE(SE_SEIKAI); + sub_8091E20(gDexText_SearchComplete); + } + else + { + PlaySE(SE_HAZURE); + sub_8091E20(gDexText_NoMatching); + } + gTasks[taskId].func = sub_8092508; + } +} + +static void sub_8092508(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + if (gPokedexView->pokemonListCount != 0) + { + gPokedexView->unk64F = 1; + gPokedexView->dexMode = sub_8092E10(taskId, 5); + gPokedexView->dexOrder = sub_8092E10(taskId, 4); + gTasks[taskId].func = sub_80927B8; + PlaySE(SE_PC_OFF); + } + else + { + gTasks[taskId].func = sub_809217C; + PlaySE(SE_BOWA); + } + } +} + +static void sub_80925B4(u16 a, int unused) +{ + MenuCursor_SetPos814AD7C(0x90, (a * 2 + 1) * 8); +} + +static void sub_80925CC(u8 taskId) +{ + u8 r0; + u16 *p1; + u16 *p2; + + sub_8092C8C(0); + r0 = gTasks[taskId].data[1]; + p1 = &gTasks[taskId].data[gUnknown_083B5A7C[r0].unk4]; + p2 = &gTasks[taskId].data[gUnknown_083B5A7C[r0].unk5]; + gTasks[taskId].data[14] = *p1; + gTasks[taskId].data[15] = *p2; + sub_8092D78(taskId); + CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 11); + sub_80925B4(*p1, 1); + gTasks[taskId].func = sub_8092644; +} + +static void sub_8092644(u8 taskId) +{ + u8 r1; + const struct UnknownStruct2 *r8; + u16 *p1; + u16 *p2; + u16 r2; + bool8 r3; + + r1 = gTasks[taskId].data[1]; + r8 = gUnknown_083B5A7C[r1].unk0; + p1 = &gTasks[taskId].data[gUnknown_083B5A7C[r1].unk4]; + p2 = &gTasks[taskId].data[gUnknown_083B5A7C[r1].unk5]; + r2 = gUnknown_083B5A7C[r1].unk6 - 1; + if (gMain.newKeys & A_BUTTON) + { + sub_814ADC8(); + PlaySE(SE_PIN); + Menu_EraseWindowRect(18, 1, 28, 12); + sub_8092C8C(1); + gTasks[taskId].func = sub_809217C; + return; + } + if (gMain.newKeys & B_BUTTON) + { + sub_814ADC8(); + PlaySE(SE_BOWA); + Menu_EraseWindowRect(18, 1, 28, 12); + sub_8092C8C(1); + *p1 = gTasks[taskId].data[14]; + *p2 = gTasks[taskId].data[15]; + gTasks[taskId].func = sub_809217C; + return; + } + r3 = FALSE; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (*p1 != 0) + { + sub_80925B4(*p1, 0); + (*p1)--; + sub_80925B4(*p1, 1); + r3 = TRUE; + } + else if (*p2 != 0) + { + (*p2)--; + sub_8092D78(taskId); + sub_80925B4(*p1, 1); + r3 = TRUE; + } + if (r3) + { + PlaySE(SE_SELECT); + sub_8091E20(r8[*p1 + *p2].text1); + } + return; + } + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (*p1 < 5 && *p1 < r2) + { + sub_80925B4(*p1, 0); + (*p1)++; + sub_80925B4(*p1, 1); + r3 = TRUE; + } + else if (r2 > 5 && *p2 < r2 - 5) + { + (*p2)++; + sub_8092D78(taskId); + sub_80925B4(5, 1); + r3 = TRUE; + } + if (r3) + { + PlaySE(SE_SELECT); + sub_8091E20(r8[*p1 + *p2].text1); + } + return; + } +} + +static void sub_80927B8(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_80927F0; +} + +static void sub_80927F0(u8 taskId) +{ + if (!gPaletteFade.active) + DestroyTask(taskId); +} + +#ifdef NONMATCHING +void sub_8092810(u8 a, u8 b, u8 c, u8 d) +{ + u16 i; + + for (i = 0; i < d; i++) + { + ((u16 *)VRAM)[15 * 0x400 + c * 32 + i + b] &= 0xFFF; + ((u16 *)VRAM)[15 * 0x400 + c * 32 + i + b] |= a << 12; + + ((u16 *)VRAM)[15 * 0x400 + (c + 1) * 32 + i + b] &= 0xFFF; + ((u16 *)VRAM)[15 * 0x400 + (c + 1) * 32 + i + b] |= a << 12; + } +} +#else +__attribute__((naked)) +void sub_8092810(u8 a, u8 b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r12, r1\n\ + lsls r2, 24\n\ + lsrs r1, r2, 24\n\ + lsls r3, 24\n\ + lsrs r5, r3, 8\n\ + movs r3, 0\n\ + cmp r5, 0\n\ + beq _0809285A\n\ + lsls r7, r1, 6\n\ + ldr r6, _08092860 @ =0x00000fff\n\ + lsls r4, r0, 12\n\ +_08092830:\n\ + mov r0, r12\n\ + adds r1, r0, r3\n\ + lsls r1, 1\n\ + adds r1, r7, r1\n\ + ldr r0, _08092864 @ =0x06007800\n\ + adds r2, r1, r0\n\ + ldrh r0, [r2]\n\ + ands r0, r6\n\ + orrs r0, r4\n\ + strh r0, [r2]\n\ + ldr r0, _08092868 @ =0x06007840\n\ + adds r1, r0\n\ + ldrh r0, [r1]\n\ + ands r0, r6\n\ + orrs r0, r4\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r0, r5\n\ + bcc _08092830\n\ +_0809285A:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08092860: .4byte 0x00000fff\n\ +_08092864: .4byte 0x06007800\n\ +_08092868: .4byte 0x06007840\n\ + .syntax divided\n"); +} +#endif + +static void sub_809286C(u8 a, u8 b, u8 c) +{ + u8 r5 = (b & 1) | ((c & 1) << 1); + + switch (a) + { + case 0: + case 1: + case 2: + sub_8092810(r5, gUnknown_083B57E4[a].unk4, gUnknown_083B57E4[a].unk5, gUnknown_083B57E4[a].unk6); + break; + case 3: + case 4: + case 7: + case 8: + sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5, gUnknown_083B57FC[a - 3].unk6); + // fall through + case 5: + case 6: + sub_8092810(r5, gUnknown_083B57FC[a - 3].unk7, gUnknown_083B57FC[a - 3].unk8, gUnknown_083B57FC[a - 3].unk9); + break; + case 10: + sub_8092810(r5, gUnknown_083B57FC[2].unk4, gUnknown_083B57FC[2].unk5, gUnknown_083B57FC[2].unk6); + break; + case 9: + if (!IsNationalPokedexEnabled()) + sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5 - 2, gUnknown_083B57FC[a - 3].unk6); + else + sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5, gUnknown_083B57FC[a - 3].unk6); + break; + } +} + +static void sub_8092964(u8 a) +{ + switch (a) + { + case 0: + sub_809286C(0, 0, 0); + sub_809286C(1, 1, 0); + sub_809286C(2, 1, 0); + sub_809286C(3, 1, 0); + sub_809286C(4, 1, 0); + sub_809286C(10, 1, 0); + sub_809286C(5, 1, 0); + sub_809286C(6, 1, 0); + sub_809286C(7, 1, 0); + sub_809286C(8, 1, 0); + sub_809286C(9, 1, 0); + break; + case 1: + sub_809286C(0, 1, 0); + sub_809286C(1, 0, 0); + sub_809286C(2, 1, 0); + sub_809286C(3, 1, 1); + sub_809286C(4, 1, 1); + sub_809286C(10, 1, 1); + sub_809286C(5, 1, 1); + sub_809286C(6, 1, 1); + sub_809286C(7, 1, 0); + sub_809286C(8, 1, 0); + sub_809286C(9, 1, 0); + break; + case 2: + sub_809286C(0, 1, 0); + sub_809286C(1, 1, 0); + sub_809286C(2, 0, 0); + sub_809286C(3, 1, 1); + sub_809286C(4, 1, 1); + sub_809286C(10, 1, 1); + sub_809286C(5, 1, 1); + sub_809286C(6, 1, 1); + sub_809286C(7, 1, 1); + sub_809286C(8, 1, 1); + sub_809286C(9, 1, 1); + break; + } +} + +static void sub_8092AB0(u8 a) +{ + sub_8092964(a); + sub_8091E20(gUnknown_083B57E4[a].text); +} + +static void sub_8092AD4(u8 a, u8 b) +{ + sub_8092964(a); + switch (b) + { + case 0: + sub_809286C(3, 0, 0); + break; + case 1: + sub_809286C(4, 0, 0); + break; + case 2: + sub_809286C(10, 0, 0); + sub_809286C(5, 0, 0); + break; + case 3: + sub_809286C(10, 0, 0); + sub_809286C(6, 0, 0); + break; + case 4: + sub_809286C(7, 0, 0); + break; + case 5: + sub_809286C(8, 0, 0); + break; + case 6: + sub_809286C(9, 0, 0); + break; + } + sub_8091E20(gUnknown_083B57FC[b].text); +} + +static void sub_8092B68(u8 taskId) +{ + u16 var; + + var = gTasks[taskId].data[6] + gTasks[taskId].data[7]; + StringCopy(gStringVar1, gUnknown_083B5910[var].text2); + Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 16, 1); + + var = gTasks[taskId].data[8] + gTasks[taskId].data[9]; + StringCopy(gStringVar1, gUnknown_083B5968[var].text2); + Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 32, 1); + + var = gTasks[taskId].data[10] + gTasks[taskId].data[11]; + StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); + Menu_PrintTextPixelCoords(gUnknown_083B5AAC, 45, 48, 1); + + var = gTasks[taskId].data[12] + gTasks[taskId].data[13]; + StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); + Menu_PrintTextPixelCoords(gUnknown_083B5AAC, 93, 48, 1); + + var = gTasks[taskId].data[4] + gTasks[taskId].data[5]; + StringCopy(gStringVar1, gUnknown_083B58D8[var].text2); + Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 64, 1); + + if (IsNationalPokedexEnabled()) + { + var = gTasks[taskId].data[2] + gTasks[taskId].data[3]; + StringCopy(gStringVar1, gUnknown_083B58C0[var].text2); + Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 80, 1); + } +} + +static void sub_8092C8C(u8 a) +{ + u16 i; + u16 j; + + if (a == 0) + { + *((u16 *)(VRAM + 0x7800 + 0x22)) = 0xC0B; + for (i = 0x12; i < 0x1D; i++) + *((u16 *)(VRAM + 0x7800 + i * 2)) = 0x80D; + *((u16 *)(VRAM + 0x7800 + 0x3A)) = 0x80B; + for (j = 1; j < 13; j++) + { + *((u16 *)(VRAM + 0x7800 + 0x22 + j * 64)) = 0x40A; + for (i = 0x12; i < 0x1D; i++) + *((u16 *)(VRAM + 0x7800 + j * 64 + i * 2)) = 2; + *((u16 *)(VRAM + 0x7800 + 0x3A + j * 64)) = 0xA; + } + *((u16 *)(VRAM + 0x7800 + 0x362)) = 0x40B; + for (i = 0x12; i < 0x1D; i++) + *((u16 *)(VRAM + 0x7800 + 0x340 + i * 2)) = 0xD; + *((u16 *)(VRAM + 0x7800 + 0x37A)) = 0xB; + } + else + { + for (j = 0; j < 14; j++) + { + for (i = 0x11; i < 0x1E; i++) + { + *((u16 *)(VRAM + 0x7800 + j * 64 + i * 2)) = 0x4F; + } + } + } +} + +static void sub_8092D78(u8 taskId) +{ + const struct UnknownStruct2 *r6 = gUnknown_083B5A7C[gTasks[taskId].data[1]].unk0; + const u16 *r8 = &gTasks[taskId].data[gUnknown_083B5A7C[gTasks[taskId].data[1]].unk4]; + const u16 *r7 = &gTasks[taskId].data[gUnknown_083B5A7C[gTasks[taskId].data[1]].unk5]; + u16 i; + u16 j; + + Menu_EraseWindowRect(18, 1, 28, 12); + for (i = 0, j = *r7; i < 6 && r6[j].text2 != NULL; i++, j++) + { +#ifndef NONMATCHING + j += 0; // Useless statement needed to match +#endif + Menu_PrintText(r6[j].text2, 18, i * 2 + 1); + } + sub_8091E20(r6[*r8 + *r7].text1); +} + +static u8 sub_8092E10(u8 taskId, u8 b) +{ + const u16 *ptr1 = &gTasks[taskId].data[gUnknown_083B5A7C[b].unk4]; + const u16 *ptr2 = &gTasks[taskId].data[gUnknown_083B5A7C[b].unk5]; + u16 r2 = *ptr1 + *ptr2; + + switch (b) + { + default: + return 0; + case 5: + return gUnknown_083B5A60[r2]; + case 4: + return gUnknown_083B5A62[r2]; + case 0: + if (r2 == 0) + return 0xFF; + else + return r2; + case 1: + if (r2 == 0) + return 0xFF; + else + return r2 - 1; + case 2: + case 3: + return gUnknown_083B5A68[r2]; + } +} + +static void sub_8092EB0(u8 taskId) +{ + u16 r3; + + switch (gPokedexView->unk614) + { + default: + case 0: + r3 = 0; + break; + case 1: + r3 = 1; + break; + } + gTasks[taskId].data[2] = r3; + + switch (gPokedexView->unk618) + { + default: + case 0: + r3 = 0; + break; + case 1: + r3 = 1; + break; + case 2: + r3 = 2; + break; + case 3: + r3 = 3; + break; + case 4: + r3 = 4; + break; + case 5: + r3 = 5; + break; + } + gTasks[taskId].data[4] = r3; +} + +static bool8 sub_8092F44(u8 taskId) +{ + u8 val1 = gTasks[taskId].data[1]; + const u16 *ptr = &gTasks[taskId].data[gUnknown_083B5A7C[val1].unk5]; + u16 val2 = gUnknown_083B5A7C[val1].unk6 - 1; + + if (val2 > 5 && *ptr != 0) + return FALSE; + else + return TRUE; +} + +static bool8 sub_8092F8C(u8 taskId) +{ + u8 val1 = gTasks[taskId].data[1]; + const u16 *ptr = &gTasks[taskId].data[gUnknown_083B5A7C[val1].unk5]; + u16 val2 = gUnknown_083B5A7C[val1].unk6 - 1; + + if (val2 > 5 && *ptr < val2 - 5) + return FALSE; + else + return TRUE; +} + +static void sub_8092FD8(struct Sprite *sprite) +{ + if (gTasks[sprite->data[0]].func == sub_8092644) + { + u8 val; + + if (sprite->data[1] != 0) + { + if (sub_8092F8C(sprite->data[0])) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + else + { + if (sub_8092F44(sprite->data[0])) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + val = sprite->data[2] + sprite->data[1] * 128; + sprite->pos2.y = gSineTable[val] / 128; + sprite->data[2] += 8; + } + else + { + sprite->invisible = TRUE; + } +} + +static void sub_809308C(u8 taskId) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].callback = sub_8092FD8; + + spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 108, 0); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].vFlip = TRUE; + gSprites[spriteId].callback = sub_8092FD8; +} diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c new file mode 100644 index 000000000..67ca276c4 --- /dev/null +++ b/src/pokedex_area_screen.c @@ -0,0 +1,20 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u16 gUnknown_02039260 = 0; +EWRAM_DATA u16 gUnknown_02039262 = 0; +EWRAM_DATA u16 gUnknown_02039264 = 0; +EWRAM_DATA u16 gUnknown_02039266 = 0; +EWRAM_DATA u16 gUnknown_02039268 = 0; +EWRAM_DATA u16 gUnknown_0203926A = 0; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c new file mode 100644 index 000000000..912b9aabd --- /dev/null +++ b/src/pokedex_cry_screen.c @@ -0,0 +1,82 @@ +#include "global.h" +#include "pokedex_cry_screen.h" +#include "palette.h" +#include "sprite.h" +#include "ewram.h" + +struct Unk201C800 { + u8 unk_0; + u8 unk_1; + u8 unk_2; + u8 filler_3; + u16 unk_4; +}; + +extern u8 gUnknown_03005E98; + +// data/pokedex_cry_screen.o +extern const u16 gUnknown_083FAE7C[]; +extern const u16 gUnknown_083FAF1C[]; +extern const u8 gUnknown_083FAF3C[]; +extern struct SpriteTemplate gSpriteTemplate_83FB774; +extern const struct SpriteSheet gCryMeterNeedleSpriteSheets[]; +extern const struct SpritePalette gCryMeterNeedleSpritePalettes[]; + +#if ENGLISH +#define CRY_METER_MAP_WIDTH 10 +#elif GERMAN +#define CRY_METER_MAP_WIDTH 32 +#endif + +u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { + int returnVal = FALSE; + + switch (gUnknown_03005E98) + { + case 0: + LZ77UnCompVram(gUnknown_083FAF3C, (void *) (VRAM + cry->unk0)); + LoadPalette(&gUnknown_083FAF1C, cry->paletteNo * 16, 0x20); + gUnknown_03005E98 += 1; + break; + + case 1: + { + void *vram; + u8 row, col; + u32 r12; + int x, y; + + vram = BG_SCREEN_ADDR(cry->unk2); + + r12 = (u32) (cry->unk0 << 18) >> 23; + + for (row = 0; row < 8; row++) + { + for (col = 0; col < 10; col++) + { + y = row + cry->yPos; + x = col + cry->xPos; + *(u16 *) (vram + (y * 64 + x * 2)) = (gUnknown_083FAE7C[row * CRY_METER_MAP_WIDTH + col] | (cry->paletteNo << 12)) + r12; + } + } + + gUnknown_03005E98 += 1; + break; + } + + case 2: + { + LoadSpriteSheets(gCryMeterNeedleSpriteSheets); + LoadSpritePalettes(gCryMeterNeedleSpritePalettes); + EWRAM_1C800.unk_4 = CreateSprite(&gSpriteTemplate_83FB774, 40 + cry->xPos * 8, 56 + cry->yPos * 8, 1); + EWRAM_1C800.unk_0 = 0x20; + EWRAM_1C800.unk_1 = 0x20; + EWRAM_1C800.unk_2 = 0; + + returnVal = TRUE; + break; + } + } + + return returnVal; +} diff --git a/src/pokemon/learn_move.c b/src/pokemon/learn_move.c deleted file mode 100644 index 356a31b00..000000000 --- a/src/pokemon/learn_move.c +++ /dev/null @@ -1,1066 +0,0 @@ -#include "global.h" -#include "contest.h" -#include "data2.h" -#include "field_fadetransition.h" -#include "main.h" -#include "menu.h" -#include "menu_cursor.h" -#include "learn_move.h" -#include "palette.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "overworld.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "task.h" -#include "trig.h" -#include "ewram.h" - -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u8 gTileBuffer[]; - -extern const struct WindowTemplate gWindowTemplate_81E6CE4; -extern const struct WindowTemplate gWindowTemplate_81E7240; -extern const u8 *const gContestEffectStrings[]; -extern const u8 *const gMoveDescriptions[]; -extern const u8 gTypeNames[][7]; -extern const u8 *const gUnknown_083CAF70[]; - -#ifdef GERMAN -extern const u8 deuOtherText_ForgotAndLearned[]; -#endif - - -struct LearnMoveStruct -{ - u8 state; - u8 filler1; - u8 unk2; - u8 spriteIDs[20]; - u8 filler17[1]; - u8 unk18; - u8 unk19; - u8 numMenuChoices; - u8 menuSelection; - u8 unk1C; - bool8 unk1D; - u8 unk1E; - u8 filler1F; - /*0x020*/ u16 movesToLearn[20]; - u8 filler48[0x52-0x48]; - u8 moveNames[6][0x19]; - u8 fillerE8[0x2C3-0xE8]; - bool8 unk2C3; - bool8 showContestInfo; - /*0x2C5*/ u8 partyMon; - u8 unk2C6; -}; - -static struct LearnMoveStruct *sLearnMoveStruct; - -const u16 gDexArrows_Pal[] = INCBIN_U16("graphics/pokedex/arrows.gbapal"); - -const u8 gDexArrows_Gfx[] = INCBIN_U8("graphics/pokedex/arrows.4bpp"); - -const u8 gUnknown_08402CF8[][4] = -{ - { 0, 0, 9, 13}, - {10, 0, 29, 7}, - { 2, 14, 27, 19}, - {10, 8, 29, 13}, -}; - -struct UnknownStruct1 -{ - const u8 *unk0; - u8 unk4; - u8 unk5; - u8 unk6; -}; - -const struct UnknownStruct1 gUnknown_08402D08[][4] = -{ - { - {OtherText_Battle, 1, 1, 0}, - {OtherText_Power, 1, 4, 1}, - {OtherText_Accuracy, 1, 9, 2}, - {NULL, 0, 0, 0}, - }, - { - {OtherText_Contest, 1, 1, 0}, - {OtherText_Appeal, 1, 4, 1}, - {OtherText_Jam, 1, 9, 2}, - {NULL, 0, 0, 0}, - }, -}; - -// XXX: What are these for? -const u32 unkDataFF00FFEF = 0xFF00FFEF; -const u8 *const gTileBuffer_ = gTileBuffer; - -const struct OamData gOamData_8402D50 = {.shape = 0}; -const struct OamData gOamData_8402D58 = {.shape = 2}; -const struct OamData gOamData_8402D60 = {.shape = 1}; - -const union AnimCmd gSpriteAnim_8402D68[] = -{ - ANIMCMD_FRAME(2, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_8402D70[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_8402D78[] = -{ - gSpriteAnim_8402D68, - gSpriteAnim_8402D70, -}; - -const struct SpriteSheet gUnknown_08402D80 = {gDexArrows_Gfx, sizeof(gDexArrows_Gfx), 5525}; -const struct SpritePalette gUnknown_08402D88 = {gDexArrows_Pal, 5526}; - -void sub_8133300(struct Sprite *); -const struct SpriteTemplate gSpriteTemplate_8402D90 = -{ - .tileTag = 5525, - .paletteTag = 5526, - .oam = &gOamData_8402D58, - .anims = gSpriteAnimTable_8402D78, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8133300, -}; - -const union AnimCmd gSpriteAnim_8402DA8[] = -{ - ANIMCMD_FRAME(4, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_8402DB0[] = -{ - ANIMCMD_FRAME(6, 5), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_8402DB8[] = -{ - gSpriteAnim_8402DA8, - gSpriteAnim_8402DB0, -}; - -const struct SpriteTemplate gSpriteTemplate_8402DC0 = -{ - .tileTag = 5525, - .paletteTag = 5526, - .oam = &gOamData_8402D60, - .anims = gSpriteAnimTable_8402DB8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8133300, -}; - -const union AnimCmd gSpriteAnim_8402DD8[] = -{ - ANIMCMD_FRAME(8, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_8402DE0[] = -{ - ANIMCMD_FRAME(9, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_8402DE8[] = -{ - ANIMCMD_FRAME(10, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_8402DF0[] = -{ - ANIMCMD_FRAME(11, 5), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_8402DF8[] = -{ - gSpriteAnim_8402DD8, - gSpriteAnim_8402DE0, - gSpriteAnim_8402DE8, - gSpriteAnim_8402DF0, -}; - -const struct SpriteTemplate gSpriteTemplate_8402E08 = -{ - .tileTag = 5525, - .paletteTag = 5526, - .oam = &gOamData_8402D50, - .anims = gSpriteAnimTable_8402DF8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8133300, -}; - -const u8 gString_AkitoMori[] = _("あきと"); // programmer Akito Mori? - -void sub_813269C(u8); -void CB2_InitLearnMove(void); -void CB2_LearnMove(void); -void LearnMoveMain(void); -void DrawLearnMoveMenuWindow(void); -void sub_8133030(bool8); -u8 sub_81330E8(void); -void sub_8133140(u8); -u8 sub_8133248(void); -void ClearLearnMoveVars(void); -void sub_8133358(void); -void sub_8133558(void); -void sub_813362C(void); -void sub_8133800(void); -void sub_8133AEC(bool8, int); -void sub_8133CA4(void); - -void VBlankCB_LearnMove(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void TeachMoveTutorMove(void) -{ - ScriptContext2_Enable(); - CreateTask(sub_813269C, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); -} - -void sub_813269C(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(CB2_InitLearnMove); - gFieldCallback = sub_8080990; - DestroyTask(taskId); - } -} - -void CB2_InitLearnMove(void) -{ - REG_DISPCNT = 0; - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - sLearnMoveStruct = eLearnMoveStruct; - ClearLearnMoveVars(); - sLearnMoveStruct->partyMon = gSpecialVar_0x8004; - sub_8133558(); - SetVBlankCallback(VBlankCB_LearnMove); - - Text_LoadWindowTemplate(&gWindowTemplate_81E7240); - InitMenuWindow(&gWindowTemplate_81E7240); - Menu_EraseScreen(); - - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - Menu_EraseScreen(); - - REG_BG0VOFS = 0; - REG_BG0VOFS = 0; // huh? - REG_BG1HOFS = 0; - REG_BG1HOFS = 0; // huh? - - LoadSpriteSheet(&gUnknown_08402D80); - LoadSpritePalette(&gUnknown_08402D88); - sub_8133358(); - FillPalette(0, 0, 2); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - SetMainCallback2(CB2_LearnMove); -} - -void sub_81327A4(void) -{ - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - sLearnMoveStruct = eLearnMoveStruct; - sub_8133558(); - sLearnMoveStruct->unk2C6 = gSpecialVar_0x8005; - SetVBlankCallback(VBlankCB_LearnMove); - - Text_LoadWindowTemplate(&gWindowTemplate_81E7240); - InitMenuWindow(&gWindowTemplate_81E7240); - Menu_EraseScreen(); - - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - Menu_EraseScreen(); - - REG_DISPCNT = 0x1340; - REG_BG0VOFS = 0; - REG_BG0HOFS = 0; - REG_BG1HOFS = 0; - REG_BG1HOFS = 0; // huh? - - LoadSpriteSheet(&gUnknown_08402D80); - LoadSpritePalette(&gUnknown_08402D88); - sub_8133358(); - FillPalette(0, 0, 2); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - SetMainCallback2(CB2_LearnMove); -} - -void CB2_LearnMove(void) -{ - LearnMoveMain(); - if (sLearnMoveStruct->unk1D) - { - sLearnMoveStruct->unk1D = FALSE; - MenuCursor_SetPos814AD7C(0x58, (sLearnMoveStruct->unk18 * 2 + 1) * 8); - } - if (sLearnMoveStruct->unk1E != 0) - { - sLearnMoveStruct->unk1E = 0; - sub_8133800(); - } - if (sLearnMoveStruct->unk2C3) - { - sub_8133AEC(sLearnMoveStruct->showContestInfo, 1); - sLearnMoveStruct->unk2C3 = FALSE; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_81328E8(const u8 *a) -{ - StringExpandPlaceholders(gStringVar4, a); - MenuPrintMessage(gStringVar4, 3, 15); -} - -void LearnMoveMain(void) -{ - switch (sLearnMoveStruct->state) - { - case 0: - sLearnMoveStruct->state++; - DrawLearnMoveMenuWindow(); - sub_8133030(FALSE); - sub_8133800(); - gSprites[1].pos1.x = 0x48; - sLearnMoveStruct->unk2C3 = TRUE; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - REG_DISPCNT = 0x1340; - break; - case 1: - if (!gPaletteFade.active) - sLearnMoveStruct->state = 4; - break; - case 2: - sLearnMoveStruct->state++; - break; - case 3: - sub_8133030(FALSE); - sub_8133800(); - sLearnMoveStruct->unk2C3 = TRUE; - sLearnMoveStruct->state++; - gSprites[1].pos1.x = 0x48; - break; - case 4: - if (sub_81330E8() == 0) - sub_813362C(); - return; - case 5: - sub_8133140(0); - sub_8133800(); - sLearnMoveStruct->unk2C3 = TRUE; - gSprites[1].pos1.x = 0x48; - sLearnMoveStruct->state++; - break; - case 6: - if (sub_8133248() == 0) - sub_813362C(); - break; - case 8: - if (Menu_UpdateWindowText()) - { - DisplayYesNoMenu(21, 7, 1); - sLearnMoveStruct->state++; - } - break; - case 9: - { - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - sub_8133CA4(); - if (GiveMoveToMon(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]) != 0xFFFF) - { - sub_81328E8(gOtherText_PokeLearnedMove); - gSpecialVar_0x8004 = 1; - sLearnMoveStruct->state = 31; - } - else - { - sLearnMoveStruct->state = 16; - } - } - else if (selection == -1 || selection == 1) - { - sub_8133CA4(); - if (sLearnMoveStruct->showContestInfo == FALSE) - sLearnMoveStruct->state = 3; - if (sLearnMoveStruct->showContestInfo == TRUE) - sLearnMoveStruct->state = 5; - } - } - break; - case 12: - if (Menu_UpdateWindowText()) - { - DisplayYesNoMenu(21, 7, 1); - sLearnMoveStruct->state++; - } - break; - case 13: - { - s8 selection = Menu_ProcessInputNoWrap_(); - - if (selection == 0) - { - sub_8133CA4(); - gSpecialVar_0x8004 = selection; - sLearnMoveStruct->state = 14; - } - else if (selection == -1 || selection == 1) - { - sub_8133CA4(); - if (sLearnMoveStruct->showContestInfo == FALSE) - sLearnMoveStruct->state = 3; - if (sLearnMoveStruct->showContestInfo == TRUE) - sLearnMoveStruct->state = 5; - } - } - break; - case 16: - sub_81328E8(gOtherText_DeleteOlderMove); - sLearnMoveStruct->state++; - break; - case 17: - if (Menu_UpdateWindowText()) - { - DisplayYesNoMenu(21, 7, 1); - sLearnMoveStruct->state = 18; - } - break; - case 18: - { - s8 var = Menu_ProcessInputNoWrap_(); - - if (var == 0) - { - sub_8133CA4(); - sub_81328E8(gOtherText_WhichMoveToForget); - sLearnMoveStruct->state = 19; - } - else if (var == -1 || var == 1) - { - sub_8133CA4(); - sLearnMoveStruct->state = 24; - } - } - break; - case 24: - sub_81328E8(gOtherText_StopLearningMove); - sLearnMoveStruct->state++; - break; - case 25: - if (Menu_UpdateWindowText()) - { - sLearnMoveStruct->state = 26; - DisplayYesNoMenu(21, 7, 1); - } - break; - case 26: - { - s8 var = Menu_ProcessInputNoWrap_(); - - if (var == 0) - { - sub_8133CA4(); - sLearnMoveStruct->state = 27; - } - else if (var == -1 || var == 1) - { - sub_8133CA4(); - - // What's the point? It gets set to 16, anyway. - if (sLearnMoveStruct->showContestInfo == FALSE) - sLearnMoveStruct->state = 3; - if (sLearnMoveStruct->showContestInfo == TRUE) - sLearnMoveStruct->state = 5; - sLearnMoveStruct->state = 16; - } - } - break; - case 27: - if (Menu_UpdateWindowText()) - { - if (sLearnMoveStruct->showContestInfo == FALSE) - sLearnMoveStruct->state = 3; - if (sLearnMoveStruct->showContestInfo == TRUE) - sLearnMoveStruct->state = 5; - } - break; - case 19: - if (Menu_UpdateWindowText()) - { - sLearnMoveStruct->state = 20; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - } - break; - case 20: - if (!gPaletteFade.active) - { - ShowSelectMovePokemonSummaryScreen(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, sub_81327A4, sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]); - sLearnMoveStruct->state = 28; - } - break; - case 21: - if (Menu_UpdateWindowText()) - sLearnMoveStruct->state = 14; - break; - case 22: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - break; - case 14: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - sLearnMoveStruct->state++; - break; - case 15: - if (!gPaletteFade.active) - SetMainCallback2(c2_exit_to_overworld_2_switch); - break; - case 28: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - sLearnMoveStruct->state++; - DrawLearnMoveMenuWindow(); - sub_8133800(); - if (sLearnMoveStruct->showContestInfo == FALSE) - sub_8133030(TRUE); - if (sLearnMoveStruct->showContestInfo == TRUE) - { - gSprites[1].pos1.x = 0x48; - sub_8133140(1); - } - sub_8133AEC(sLearnMoveStruct->showContestInfo, 1); - break; - case 29: - if (!gPaletteFade.active) - { - if (sLearnMoveStruct->unk2C6 == 4) - { - sLearnMoveStruct->state = 24; - } - else - { - u16 moveId = GetMonData(&gPlayerParty[sLearnMoveStruct->partyMon], MON_DATA_MOVE1 + sLearnMoveStruct->unk2C6); - - StringCopy(gStringVar3, gMoveNames[moveId]); - RemoveMonPPBonus(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->unk2C6); - SetMonMoveSlot(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection], sLearnMoveStruct->unk2C6); - StringCopy(gStringVar2, gMoveNames[sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]]); - sub_81328E8(gOtherText_ForgotMove123); - sLearnMoveStruct->state = 30; - gSpecialVar_0x8004 = 1; - } - } - break; - case 30: - if (Menu_UpdateWindowText()) - { -#ifdef ENGLISH - sub_81328E8(gOtherText_ForgotOrDidNotLearnMove); -#else - sub_81328E8(deuOtherText_ForgotAndLearned); -#endif - sLearnMoveStruct->state = 31; - PlayFanfare(BGM_FANFA1); - } - break; - case 31: - if (Menu_UpdateWindowText()) - { - PlayFanfare(BGM_FANFA1); - sLearnMoveStruct->state = 32; - } - break; - case 32: - if (IsFanfareTaskInactive()) - sLearnMoveStruct->state = 33; - break; - case 33: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sLearnMoveStruct->state = 14; - } - break; - } -} - -void DrawLearnMoveMenuWindow(void) -{ - u32 i; - - BasicInitMenuWindow(&gWindowTemplate_81E7240); - for (i = 0; i < 4; i++) - { - Menu_DrawStdWindowFrame( - gUnknown_08402CF8[i][0], - gUnknown_08402CF8[i][1], - gUnknown_08402CF8[i][2], - gUnknown_08402CF8[i][3]); - } - BasicInitMenuWindow(&gWindowTemplate_81E6CE4); -} - -void sub_8133030(bool8 a) -{ - s32 i; - - gSprites[sLearnMoveStruct->spriteIDs[0]].invisible = FALSE; - gSprites[sLearnMoveStruct->spriteIDs[1]].invisible = FALSE; - - for (i = 0; i < 16; i++) - gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = TRUE; - - for (i = 0; gUnknown_08402D08[0][i].unk0 != NULL; i++) - { - sub_8072C74(gTileBuffer, gUnknown_08402D08[0][i].unk0, 64, 2); - Menu_PrintText(gTileBuffer, gUnknown_08402D08[0][i].unk4, gUnknown_08402D08[0][i].unk5); - } - - if (!a) - sub_8072AB0(gOtherText_TeachWhichMove, 24, 120, 192, 32, 1); -} - -u8 sub_81330E8(void) -{ - u32 result = (gMain.newKeys & DPAD_LEFT) || (gMain.newKeys & DPAD_RIGHT); - - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR - && ((gMain.newKeys & L_BUTTON) || (gMain.newKeys & R_BUTTON))) - result++; - - if (result != 0) - { - PlaySE(SE_SELECT); - sLearnMoveStruct->state = 5; - sLearnMoveStruct->showContestInfo = TRUE; - } - - return result; -} - -void sub_8133140(bool8 a) -{ - s32 i; - - gSprites[sLearnMoveStruct->spriteIDs[0]].invisible = FALSE; - gSprites[sLearnMoveStruct->spriteIDs[1]].invisible = FALSE; - - for (i = 0; i < 16; i++) - gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = FALSE; - - for (i = 0; gUnknown_08402D08[0][i].unk0 != NULL; i++) - { - sub_8072C74(gTileBuffer, gUnknown_08402D08[1][i].unk0, 64, 2); - Menu_PrintText(gTileBuffer, gUnknown_08402D08[1][i].unk4, gUnknown_08402D08[1][i].unk5); - if (i != 0) - { - Menu_EraseWindowRect( - gUnknown_08402D08[1][i].unk4, - gUnknown_08402D08[1][i].unk5 + 2, - gUnknown_08402D08[1][i].unk4 + 7, - gUnknown_08402D08[1][i].unk5 + 3); - } - } - - if (!a) - sub_8072AB0(gOtherText_TeachWhichMove, 24, 120, 192, 32, 1); -} - -u8 sub_8133248(void) -{ - u32 result = (gMain.newKeys & DPAD_LEFT) || (gMain.newKeys & DPAD_RIGHT); - - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR - && ((gMain.newKeys & L_BUTTON) || (gMain.newKeys & R_BUTTON))) - result++; - - if (result != 0) - { - PlaySE(SE_SELECT); - sLearnMoveStruct->state = 3; - sLearnMoveStruct->showContestInfo = FALSE; - } - - return result; -} - -void ClearLearnMoveVars(void) -{ - s32 i; - - sLearnMoveStruct->state = 0; - sLearnMoveStruct->unk2 = 0; - sLearnMoveStruct->unk19 = 0; - sLearnMoveStruct->unk18 = 0; - sLearnMoveStruct->unk1C = 0; - sLearnMoveStruct->numMenuChoices = 0; - sLearnMoveStruct->menuSelection = 0; - sLearnMoveStruct->unk1D = FALSE; - sLearnMoveStruct->unk1E = 0; - sLearnMoveStruct->unk2C3 = FALSE; - sLearnMoveStruct->showContestInfo = FALSE; - for (i = 0; i < 20; i++) - sLearnMoveStruct->movesToLearn[i] = 0; -} - -void sub_8133300(struct Sprite *sprite) -{ - s16 var = (sprite->data[1] * 10) & 0xFF; - - switch (sprite->data[0]) - { - case 0: - break; - case 1: - sprite->pos2.x = Sin(var, 3) * sprite->data[2]; - break; - case 2: - sprite->pos2.y = Sin(var, 1) * sprite->data[2]; - break; - } - sprite->data[1]++; -} - -void sub_8133358(void) -{ - s32 i; - - sLearnMoveStruct->spriteIDs[0] = CreateSprite(&gSpriteTemplate_8402D90, 8, 16, 0); - gSprites[sLearnMoveStruct->spriteIDs[0]].data[0] = 1; - gSprites[sLearnMoveStruct->spriteIDs[0]].data[2] = -1; - - sLearnMoveStruct->spriteIDs[1] = CreateSprite(&gSpriteTemplate_8402D90, 72, 16, 0); - StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[1]], 1); - gSprites[sLearnMoveStruct->spriteIDs[1]].data[0] = 1; - gSprites[sLearnMoveStruct->spriteIDs[1]].data[2] = 1; - - sLearnMoveStruct->spriteIDs[2] = CreateSprite(&gSpriteTemplate_8402DC0, 160, 4, 0); - StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[2]], 1); - gSprites[sLearnMoveStruct->spriteIDs[2]].data[0] = 2; - gSprites[sLearnMoveStruct->spriteIDs[2]].data[2] = -1; - - sLearnMoveStruct->spriteIDs[3] = CreateSprite(&gSpriteTemplate_8402DC0, 160, 60, 0); - gSprites[sLearnMoveStruct->spriteIDs[3]].data[0] = 2; - gSprites[sLearnMoveStruct->spriteIDs[3]].data[2] = 1; - - for (i = 0; i < 8; i++) - { - sLearnMoveStruct->spriteIDs[i + 4] = CreateSprite(&gSpriteTemplate_8402E08, (i - (i / 4) * 4) * 8 + 0x1C, (i / 4) * 8 + 0x34, 0); - StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 4]], 2); - } - - for (i = 0; i < 8; i++) - { - sLearnMoveStruct->spriteIDs[i + 12] = CreateSprite(&gSpriteTemplate_8402E08, (i - (i / 4) * 4) * 8 + 0x1C, (i / 4) * 8 + 0x5C, 0); - StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 12]], 2); - } - - for (i = 0; i < 20; i++) - gSprites[sLearnMoveStruct->spriteIDs[i]].invisible = TRUE; - - CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 18); -} - -void sub_8133558(void) -{ - s32 i; - u8 nickname[POKEMON_NAME_LENGTH + 1]; - - sLearnMoveStruct->numMenuChoices = GetMoveRelearnerMoves(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->movesToLearn); - for (i = 0; i < sLearnMoveStruct->numMenuChoices; i++) - StringCopy(sLearnMoveStruct->moveNames[i], gMoveNames[sLearnMoveStruct->movesToLearn[i]]); - GetMonData(&gPlayerParty[sLearnMoveStruct->partyMon], MON_DATA_NICKNAME, nickname); - StringCopy10(gStringVar1, nickname); - StringCopy(sLearnMoveStruct->moveNames[sLearnMoveStruct->numMenuChoices], gUnknownText_Exit); - sLearnMoveStruct->numMenuChoices++; -} - -void sub_813360C(s8 delta) -{ - sLearnMoveStruct->unk1C = sLearnMoveStruct->unk18; - sLearnMoveStruct->unk18 += delta; - sLearnMoveStruct->unk1D = TRUE; -} - -void sub_813362C(void) -{ - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (sLearnMoveStruct->menuSelection != 0) - { - PlaySE(SE_SELECT); - sLearnMoveStruct->menuSelection--; - sLearnMoveStruct->unk2C3 = TRUE; - if (sLearnMoveStruct->unk18 != 0) - { - sub_813360C(-1); - } - else if (sLearnMoveStruct->unk19 != 0) - { - sLearnMoveStruct->unk19--; - sLearnMoveStruct->unk1E++; - } - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (sLearnMoveStruct->menuSelection < sLearnMoveStruct->numMenuChoices - 1) - { - PlaySE(SE_SELECT); - sLearnMoveStruct->menuSelection++; - sLearnMoveStruct->unk2C3 = TRUE; - if (sLearnMoveStruct->unk18 != 2) - { - sub_813360C(1); - } - else if (sLearnMoveStruct->unk19 != sLearnMoveStruct->numMenuChoices - 3) - { - sLearnMoveStruct->unk19++; - sLearnMoveStruct->unk1E++; - } - } - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (sLearnMoveStruct->menuSelection != sLearnMoveStruct->numMenuChoices - 1) - { - sLearnMoveStruct->state = 8; - StringCopy(gStringVar2, sLearnMoveStruct->moveNames[sLearnMoveStruct->menuSelection]); - StringExpandPlaceholders(gStringVar4, gOtherText_TeachSpecificMove); - MenuPrintMessage(gStringVar4, 3, 15); - } - else - { - StringExpandPlaceholders(gStringVar4, gOtherText_GiveUpTeachingMove); - MenuPrintMessage(gStringVar4, 3, 15); - sLearnMoveStruct->state = 12; - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sLearnMoveStruct->state = 12; - StringExpandPlaceholders(gStringVar4, gOtherText_GiveUpTeachingMove); - MenuPrintMessage(gStringVar4, 3, 15); - } - if (sLearnMoveStruct->numMenuChoices > 3) - { - gSprites[2].invisible = FALSE; - gSprites[3].invisible = FALSE; - if (sLearnMoveStruct->unk19 == 0) - gSprites[2].invisible = TRUE; - else if (sLearnMoveStruct->unk19 == sLearnMoveStruct->numMenuChoices - 3) - gSprites[3].invisible = TRUE; - } -} - -void sub_8133800(void) -{ - u8 r6 = sLearnMoveStruct->unk19; - u8 *str = gTileBuffer; - s32 i; - - for (i = 0; i < 3; i++) - { - if (r6 >= sLearnMoveStruct->numMenuChoices) - { - str = sub_8072C74(str, gEmptyString_81E72B0, 0x90, 0); - } - else if (r6 == sLearnMoveStruct->numMenuChoices - 1) - { - str = sub_8072C74(str, gUnknownText_Exit, 0x90, 0); - } - else - { - u16 moveId = sLearnMoveStruct->movesToLearn[r6]; - - if (sLearnMoveStruct->showContestInfo) - str = sub_8072C74(str, gUnknown_083CAF70[gContestMoves[moveId].contestCategory], 0x27, 0); - else - str = sub_8072C74(str, gTypeNames[gBattleMoves[moveId].type], 0x27, 0); - - str = sub_8072C74(str, sLearnMoveStruct->moveNames[r6], 0x72, 0); - - str[0] = CHAR_P; - str[1] = CHAR_P; - str[2] = CHAR_SLASH; - str += 3; - - str = sub_8072C14(str, gBattleMoves[moveId].pp, 0x90, 0); - } - *str++ = CHAR_NEWLINE; - r6++; - } - *str = EOS; - Menu_PrintText(gTileBuffer, 11, 1); - sub_813360C(0); -} - -const u8 gUnknown_08402E24[7][3] = -{ - {11, 1, 1}, - { 3, 6, 2}, - {24, 1, 3}, - { 3, 11, 4}, - { 5, 4, 5}, - { 3, 6, 6}, - { 3, 11, 7}, -}; - -const u8 gUnknown_08402E39[] = {0, 1, 2, 3}; -const u8 gUnknown_08402E3D[] = {4, 5, 6}; - -void PrintMoveInfo(u16 moveId, const u8 *b) -{ - u8 str[0x34]; - u8 numHearts; - u8 i; - - StringCopy(str, gExpandedPlaceholder_Empty); - switch (b[2]) - { - case 1: - break; - case 2: - if (gBattleMoves[moveId].power < 2) - sub_8072C74(str, gOtherText_ThreeDashes2, 32, 2); - else - sub_8072C14(str, gBattleMoves[moveId].power, 32, 2); - Menu_PrintText(str, b[0], b[1]); - break; - case 4: - if (gBattleMoves[moveId].accuracy == 0) - sub_8072C74(str, gOtherText_ThreeDashes2, 32, 2); - else - sub_8072C14(str, gBattleMoves[moveId].accuracy, 32, 2); - Menu_PrintText(str, b[0], b[1]); - break; - case 6: - Menu_EraseWindowRect(b[0], b[1], b[0], b[1] + 1); - numHearts = gContestEffects[gContestMoves[moveId].effect].appeal / 10; - if (numHearts == 255) - numHearts = 0; - for (i = 0; i < 8; i++) - { - if (i < numHearts) - StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 4]], 1); - else - StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 4]], 0); - } - break; - case 7: - Menu_EraseWindowRect(b[0], b[1], b[0], b[1] + 1); - numHearts = gContestEffects[gContestMoves[moveId].effect].jam / 10; - if (numHearts == 255) - numHearts = 0; - for (i = 0; i < 8; i++) - { - if (i < numHearts) - StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 12]], 3); - else - StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[i + 12]], 2); - } - break; - } -} - -void sub_8133AEC(bool8 contestInfo, int unused) -{ - u16 i; - - if (sLearnMoveStruct->menuSelection != sLearnMoveStruct->numMenuChoices - 1) - { - u16 moveId = sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]; - - if (contestInfo) - { - for (i = 0; i < 16; i++) - gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = FALSE; - for (i = 0; i < 3; i++) - PrintMoveInfo(moveId, gUnknown_08402E24[gUnknown_08402E3D[i]]); - sub_8072AB0(gContestEffectStrings[gContestMoves[moveId].effect], 0x58, 0x48, 0x90, 32, 1); - } - else - { - u8 var; - - for (i = 0; i < 4; i++) - PrintMoveInfo(moveId, gUnknown_08402E24[gUnknown_08402E39[i]]); - var = sub_8072A18(gMoveDescriptions[moveId - 1], 0x58, 0x48, 0x90, 1); - if (var < 2) - { - u8 r1 = var * 2 + 9; - - Menu_BlankWindowRect(11, r1, 28, 12); - } - } - } - else - { - if (contestInfo) - { - Menu_EraseWindowRect(gUnknown_08402E24[5][0], gUnknown_08402E24[5][1], gUnknown_08402E24[5][0], gUnknown_08402E24[5][1] + 1); - Menu_EraseWindowRect(gUnknown_08402E24[6][0], gUnknown_08402E24[6][1], gUnknown_08402E24[6][0], gUnknown_08402E24[6][1] + 1); - for (i = 0; i < 16; i++) - gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = TRUE; - } - else - { - Menu_EraseWindowRect(gUnknown_08402E24[1][0], gUnknown_08402E24[1][1], gUnknown_08402E24[1][0] + 3, gUnknown_08402E24[1][1] + 1); - Menu_EraseWindowRect(gUnknown_08402E24[3][0], gUnknown_08402E24[3][1], gUnknown_08402E24[3][0] + 3, gUnknown_08402E24[3][1] + 1); - } - Menu_EraseWindowRect(11, 9, 28, 12); - } -} - -void sub_8133CA4(void) -{ - Menu_EraseWindowRect(21, 7, 27, 12); - sub_8133AEC(sLearnMoveStruct->showContestInfo, 0); -} diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c deleted file mode 100644 index 4497c98fb..000000000 --- a/src/pokemon/mail.c +++ /dev/null @@ -1,1159 +0,0 @@ -#include "global.h" -#include "mail.h" -#include "data2.h" -#include "easy_chat.h" -#include "constants/items.h" -#include "constants/species.h" -#include "field_fadetransition.h" -#include "graphics.h" -#include "mail_data.h" -#include "menu.h" -#include "menu_helpers.h" -#include "name_string_util.h" -#include "palette.h" -#include "pokemon_icon.h" -#include "overworld.h" -#include "script.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "scanline_effect.h" -#include "ewram.h" - -extern u8 (*gMenuCallback)(void); - -struct UnkMailStruct -{ - u8 unk_0_0:2; - u8 unk_0_2:2; - u8 unk_0_4:4; -}; - -struct MailLayout -{ - u8 var0; - u8 var1; - u8 var2; - u8 var3_0:4; - u8 var3_4:4; - const struct UnkMailStruct *var4; -}; - -struct Unk2000000 -{ - /* 0x00*/ u8 words[8][27]; - /* 0xD8*/ u8 varD8[20]; - /* 0xEC*/ MainCallback varEC; - /* 0xF0*/ MainCallback varF0; - /* 0xF4*/ struct MailStruct *varF4; - /* 0xF8*/ u8 varF8; - /* 0xF9*/ u8 varF9; - /* 0xFA*/ u8 varFA; - /* 0xFB*/ u8 varFB; - /* 0xFC*/ u8 varFC; - u8 padFD[1]; - /* 0xFE*/ u8 varFE; - /* 0xFF*/ u8 varFF; - /*0x100*/ u8 var100; - u8 pad101[3]; - /*0x104*/ MainCallback var104; - /*0x108*/ MainCallback var108; - /*0x10C*/ const struct MailLayout *var10C; -}; - -struct MailGraphics -{ - const u16 *palette; - const u8 *tiles; - const u8 *tileMap; - u16 var0C; - u16 var0E; - u16 color10; - u16 color12; -}; - -const u16 gUnknown_083E562C[][2] = -{ - {0x6ACD, 0x51A5}, - {0x45FC, 0x38D4}, -}; - -const struct MailGraphics gMailGraphicsTable[] = -{ - { - .palette = gMailPalette_Orange, - .tiles = gMailTiles_Orange, - .tileMap = gMailTilemap_Orange, - .var0C = 0x2C0, - .var0E = 0, - .color10 = 0x294A, - .color12 = 0x6739, - }, - { - .palette = gMailPalette_Harbor, - .tiles = gMailTiles_Harbor, - .tileMap = gMailTilemap_Harbor, - .var0C = 0x2E0, - .var0E = 0, - .color10 = 0x7FFF, - .color12 = 0x4631, - }, - { - .palette = gMailPalette_Glitter, - .tiles = gMailTiles_Glitter, - .tileMap = gMailTilemap_Glitter, - .var0C = 0x400, - .var0E = 0, - .color10 = 0x294A, - .color12 = 0x6739, - }, - { - .palette = gMailPalette_Mech, - .tiles = gMailTiles_Mech, - .tileMap = gMailTilemap_Mech, - .var0C = 0x1E0, - .var0E = 0, - .color10 = 0x7FFF, - .color12 = 0x4631, - }, - { - .palette = gMailPalette_Wood, - .tiles = gMailTiles_Wood, - .tileMap = gMailTilemap_Wood, - .var0C = 0x2E0, - .var0E = 0, - .color10 = 0x7FFF, - .color12 = 0x4631, - }, - { - .palette = gMailPalette_Wave, - .tiles = gMailTiles_Wave, - .tileMap = gMailTilemap_Wave, - .var0C = 0x300, - .var0E = 0, - .color10 = 0x294A, - .color12 = 0x6739, - }, - { - .palette = gMailPalette_Bead, - .tiles = gMailTiles_Bead, - .tileMap = gMailTilemap_Bead, - .var0C = 0x140, - .var0E = 0, - .color10 = 0x7FFF, - .color12 = 0x4631, - }, - { - .palette = gMailPalette_Shadow, - .tiles = gMailTiles_Shadow, - .tileMap = gMailTilemap_Shadow, - .var0C = 0x300, - .var0E = 0, - .color10 = 0x7FFF, - .color12 = 0x4631, - }, - { - .palette = gMailPalette_Tropic, - .tiles = gMailTiles_Tropic, - .tileMap = gMailTilemap_Tropic, - .var0C = 0x220, - .var0E = 0, - .color10 = 0x294A, - .color12 = 0x6739, - }, - { - .palette = gMailPalette_Dream, - .tiles = gMailTiles_Dream, - .tileMap = gMailTilemap_Dream, - .var0C = 0x340, - .var0E = 0, - .color10 = 0x294A, - .color12 = 0x6739, - }, - { - .palette = gMailPalette_Fab, - .tiles = gMailTiles_Fab, - .tileMap = gMailTilemap_Fab, - .var0C = 0x2A0, - .var0E = 0, - .color10 = 0x294A, - .color12 = 0x6739, - }, - { - .palette = gMailPalette_Retro, - .tiles = gMailTiles_Retro, - .tileMap = gMailTilemap_Retro, - .var0C = 0x520, - .var0E = 0, - .color10 = 0x294A, - .color12 = 0x6739, - }, -}; - -const struct UnkMailStruct Unknown_3E5724[] = -{ - {0, 3, 0}, - {0, 3, 0}, - {0, 3, 0}, -}; - -const struct MailLayout gUnknown_083E5730[] = -{ - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, - {3, 16, 27, 4, 3, Unknown_3E5724}, - {3, 15, 27, 4, 3, Unknown_3E5724}, -}; - -const struct UnkMailStruct Unknown_3E5790[] = -{ - {0, 2, 0}, - {0, 2, 0}, - {0, 2, 0}, - {0, 2, 0}, - {0, 1, 0}, -}; - -const struct MailLayout gUnknown_083E57A4[] = -{ - {5, 15, 15, 4, 3, Unknown_3E5790}, - {5, 15, 15, 4, 3, Unknown_3E5790}, - {5, 15, 16, 4, 3, Unknown_3E5790}, - {5, 15, 15, 4, 3, Unknown_3E5790}, - {5, 15, 15, 4, 3, Unknown_3E5790}, - {5, 15, 16, 4, 3, Unknown_3E5790}, - {5, 15, 16, 4, 3, Unknown_3E5790}, - {5, 15, 15, 4, 3, Unknown_3E5790}, - {5, 15, 15, 4, 3, Unknown_3E5790}, - {5, 15, 15, 4, 3, Unknown_3E5790}, - {5, 16, 15, 4, 3, Unknown_3E5790}, - {5, 15, 15, 4, 3, Unknown_3E5790}, -}; - -#if DEBUG - -const u8 Str_8411540[] = _("レイアウトを にほんごで ひょうじ?"); // Display using Japanese layout? -const u8 Str_8411553[] = _("にほんご "); // Japanese -const u8 Str_8411559[] = _("かいがい "); // Overseas - -const u8 *const _8411560[] = -{ - Str_8411553, - Str_8411559, -}; - -const u8 Str_8411568[] = _("イメージ タイプを えらんでね"); // Choose an image type -const u8 Str_8411578[] = _("{STR_VAR_1}"); -const u8 Str_841157B[] = _("オレンジ "); // Orange -const u8 Str_8411581[] = _("ハーバー "); // Harbor -const u8 Str_8411587[] = _("キラキラ "); // Glitter -const u8 Str_841158D[] = _("メカニカル"); // Mech -const u8 Str_8411593[] = _("ウッディー"); // Wood -const u8 Str_8411599[] = _("クロス  "); // Wave -const u8 Str_841159F[] = _("トレジャー"); // Bead -const u8 Str_84115A5[] = _("シャドウ "); // Shadow -const u8 Str_84115AB[] = _("トロピカル"); // Tropic -const u8 Str_84115B1[] = _("ドリーム "); // Dream -const u8 Str_84115B7[] = _("ミラクル "); // Fab -const u8 Str_84115BD[] = _("レトロ  "); // Retro - -const u8 *const _84115C4[] = -{ - Str_841157B, - Str_8411581, - Str_8411587, - Str_841158D, - Str_8411593, - Str_8411599, - Str_841159F, - Str_84115A5, - Str_84115AB, - Str_84115B1, - Str_84115B7, - Str_84115BD, -}; - -const u8 Str_84115F4[] = _("メールをみる"); // View Mail -const u8 Str_84115FB[] = _("メールとうろく"); // Register Mail -const u8 Str_8411603[] = _("もたせる"); // Give to Pokémon -const u8 Str_8411608[] = _("メールをけす"); // Delete Mail - -#endif - -// XXX: what is this? -static u8 *const sSharedMemPtr = gSharedMem; - -static u8 sub_80F8A28(void); -static void sub_80F8D50(void); -static void sub_80F8DA0(void); -static void sub_80F8E80(void); -static void sub_80F8F18(void); -static void sub_80F8F2C(void); -static void sub_80F8F58(void); -static void sub_80F8F78(void); -static void sub_80F8FB4(void); - -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; - -#if DEBUG -static u8 gUnknown_Debug_0300079C; -#endif - -void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) -{ - u16 buffer[2]; - u16 species; - -#if DEBUG - if (gUnknown_Debug_0300079C != 0) - { - ewram0_4.varFF = GAME_LANGUAGE; - ewram0_4.var100 = gSpecialVar_0x8004; - ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; - ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; - ewram0_4.varFA = gSpecialVar_0x8006; - } - else -#endif - { - ewram0_4.varFF = GAME_LANGUAGE; - ewram0_4.var100 = 1; - ewram0_4.var104 = (MainCallback)EasyChat_GetWordText; - ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString; - if (IS_ITEM_MAIL(arg0->itemId)) - { - ewram0_4.varFA = arg0->itemId - 0x79; - } - else - { - ewram0_4.varFA = 0; - arg2 = FALSE; - } - } - - switch (ewram0_4.var100) - { - case 0: - default: - ewram0_4.var10C = &gUnknown_083E5730[ewram0_4.varFA]; - break; - case 1: - ewram0_4.var10C = &gUnknown_083E57A4[ewram0_4.varFA]; - break; - } - - species = MailSpeciesToSpecies(arg0->species, buffer); - if (species >= 1 && species <= 411) - { - switch (ewram0_4.varFA) - { - case 6: - ewram0_4.varFB = 1; - break; - case 9: - ewram0_4.varFB = 2; - break; - default: - ewram0_4.varFB = 0; - break; - } - } - else - { - ewram0_4.varFB = 0; - } - - ewram0_4.varF4 = arg0; - ewram0_4.varEC = arg1; - ewram0_4.varF8 = arg2; - - SetMainCallback2(sub_80F8D50); -} - -#define RETURN_UP_STATE break -#define RETURN_SKIP_STATE return FALSE - -static u8 sub_80F8A28(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - ScanlineEffect_Stop(); - REG_DISPCNT = 0; - RETURN_UP_STATE; - - case 1: CpuFill16(0, (void *)OAM, OAM_SIZE); - RETURN_UP_STATE; - - case 2: - ResetPaletteFade(); - RETURN_UP_STATE; - - case 3: - ResetTasks(); - RETURN_UP_STATE; - - case 4: - ResetSpriteData(); - RETURN_UP_STATE; - - case 5: - FreeAllSpritePalettes(); - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2VOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - RETURN_UP_STATE; - - case 6: - Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); - RETURN_UP_STATE; - - case 7: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC); - RETURN_UP_STATE; - - case 8: - if (MultistepInitMenuWindowContinue() == 0) - { - return FALSE; - } - RETURN_UP_STATE; - - case 9: - Menu_EraseScreen(); - RETURN_UP_STATE; - - case 10: CpuFill16(1, (void *)(VRAM + 0x4800), 0x800); - RETURN_UP_STATE; - - case 11: - LoadPalette(gMailGraphicsTable[ewram0_4.varFA].palette, 0, 16 * 2); - RETURN_UP_STATE; - - case 12: - LZ77UnCompVram(gMailGraphicsTable[ewram0_4.varFA].tileMap, (void *)(VRAM + 0x4000)); - RETURN_UP_STATE; - - case 13: - LZ77UnCompVram(gMailGraphicsTable[ewram0_4.varFA].tiles, (void *)(VRAM)); - - gPlttBufferUnfaded[241] = gMailGraphicsTable[ewram0_4.varFA].color10; - gPlttBufferUnfaded[248] = gMailGraphicsTable[ewram0_4.varFA].color12; - gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0]; - gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1]; - RETURN_UP_STATE; - - case 14: - if (ewram0_4.varF8 != 0) - { - sub_80F8DA0(); - } - RETURN_UP_STATE; - - case 15: - if (ewram0_4.varF8 != 0) - { - sub_80F8E80(); - } - - SetVBlankCallback(sub_80F8F18); - gPaletteFade.bufferTransferDisabled = 1; - RETURN_UP_STATE; - - case 16: - { - u16 local1; - - local1 = sub_809D4A8(ewram0_4.varF4->species); - - switch (ewram0_4.varFB) - { - case 1: - sub_809D580(local1); - ewram0_4.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0); - break; - - case 2: - sub_809D580(local1); - ewram0_4.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0); - break; - } - RETURN_UP_STATE; - } - - case 17: - if (sub_8055870() != TRUE) - { - RETURN_UP_STATE; - } - RETURN_SKIP_STATE; - - case 18: - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x512; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BLDCNT = 0; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - ewram0_4.varF0 = sub_80F8F58; - return TRUE; - - default: - return FALSE; - } - - gMain.state += 1; - return FALSE; -} - -static void sub_80F8D50(void) -{ - do - { - if (sub_80F8A28() == 1) - { - SetMainCallback2(sub_80F8F2C); - return; - } - } while (sub_80F9344() != 1); -} - -static u8 *sub_80F8D7C(u8 *dest, u8 *src) -{ - u16 length; - - StringCopy(dest, src); - SanitizeNameString(dest); - - length = StringLength(dest); - - return dest + length; -} - -static void sub_80F8DA0(void) -{ - u16 i; - u8 r6; - u8 *ptr; - - r6 = 0; - for (i = 0; i < ewram0_4.var10C->var0; i++) - { - ConvertEasyChatWordsToString(ewram0_4.words[i], &ewram0_4.varF4->words[r6], ewram0_4.var10C->var4[i].unk_0_2, 1); - r6 += ewram0_4.var10C->var4[i].unk_0_2; - } - ptr = ewram0_4.varD8; - if (ewram0_4.var100 == 0) - { - ptr = sub_80F8D7C(ptr, ewram0_4.varF4->playerName); - StringCopy(ptr, gOtherText_From); - ewram0_4.varF9 = ewram0_4.var10C->var2 - StringLength(ewram0_4.varD8); - - } - else - { - ptr = StringCopy(ptr, gOtherText_From); - sub_80F8D7C(ptr, ewram0_4.varF4->playerName); - ewram0_4.varF9 = ewram0_4.var10C->var2; - } -} - -static void sub_80F8E80(void) -{ - u16 pos; - u8 x; - u8 y = 0; - - for (pos = 0; pos < ewram0_4.var10C->var0; pos++) - { - if (ewram0_4.words[pos][0] == 0xFF) - { - continue; - } - - if (ewram0_4.words[pos][0] == 0x00) - { - continue; - } - - x = ewram0_4.var10C->var4[pos].unk_0_4; - y += ewram0_4.var10C->var4[pos].unk_0_0; - Menu_PrintText(ewram0_4.words[pos], ewram0_4.var10C->var3_4 + x, ewram0_4.var10C->var3_0 + y); - y += 2; - } - - Menu_PrintText(ewram0_4.varD8, ewram0_4.varF9, ewram0_4.var10C->var1); -} - -static void sub_80F8F18(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void sub_80F8F2C(void) -{ - if (ewram0_4.varFB != 0) - { - AnimateSprites(); - BuildOamBuffer(); - } - - ewram0_4.varF0(); -} - -static void sub_80F8F58(void) -{ - u8 local0; - - local0 = UpdatePaletteFade(); - if (local0 == 0) - { - ewram0_4.varF0 = sub_80F8F78; - } -} - -static void sub_80F8F78(void) -{ - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - ewram0_4.varF0 = sub_80F8FB4; - } -} - -static void sub_80F8FB4(void) -{ - if (!UpdatePaletteFade()) - { - SetMainCallback2(ewram0_4.varEC); - switch (ewram0_4.varFB) - { - case 2: - case 1: - sub_809D608(sub_809D4A8(ewram0_4.varF4->species)); - sub_809D510(&gSprites[ewram0_4.varFC]); - break; - } -#if !DEBUG - memset(&ewram0_4, 0, 0x110); -#endif - ResetPaletteFade(); - } -} - -#if DEBUG - -void debug_sub_810CA7C(u8); -void debug_sub_810CE1C(u8); -void debug_sub_810D388(void); -void debug_sub_810D340(void); - -void debug_sub_810C910(u8 taskId) -{ - if (!gPaletteFade.active) - { - gUnknown_Debug_0300079C = 1; - Menu_EraseScreen(); - DestroyTask(taskId); - if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId == 0) - HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 0); - else - HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 1); - } -} - -void debug_sub_810C990(u8 taskId) -{ - if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN)) - { - gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 11) % 12; - Menu_DrawStdWindowFrame(1, 1, 10, 4); - Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); - } - else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT)) - { - gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 1) % 12; - Menu_DrawStdWindowFrame(1, 1, 10, 4); - Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); - } - else if (gMain.newKeys & A_BUTTON) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = debug_sub_810C910; - } - else if (gMain.newKeys & B_BUTTON) - { - Menu_DisplayDialogueFrame(); - Menu_PrintText(Str_8411540, 4, 15); - Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); - gTasks[taskId].func = debug_sub_810CA7C; - } -} - -void debug_sub_810CA7C(u8 taskId) -{ - if (gMain.newKeys & 0xF0) - { - gSpecialVar_0x8004 ^= 1; - Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); - } - else if (gMain.newKeys & A_BUTTON) - { - if (gMain.watchedKeysPressed) - { - gMain.watchedKeysPressed = FALSE; - Menu_DisplayDialogueFrame(); - Menu_PrintText(Str_8411540, 4, 15); - Menu_DrawStdWindowFrame(1, 1, 10, 4); - Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2); - } - else - { - Menu_DisplayDialogueFrame(); - Menu_PrintText(Str_8411568, 4, 15); - Menu_DrawStdWindowFrame(1, 1, 10, 4); - Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2); - gTasks[taskId].func = debug_sub_810C990; - } - } -} - -void debug_sub_810CB50(u8 taskId) -{ - u8 sp0[] = _("{STR_VAR_1} {STR_VAR_2}"); - u8 sp8[] = _("メール{STR_VAR_1} {STR_VAR_2}"); - bool8 r2 = FALSE; - - if (gMain.newKeys & A_BUTTON) - { - ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 2, 1); - StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]); - gSaveBlock1.mail[gSpecialVar_0x8005].species = gTasks[taskId].data[0]; - StringExpandPlaceholders(gStringVar4, sp8); - Menu_DisplayDialogueFrame(); - Menu_PrintText(gStringVar4, 4, 15); - DestroyTask(taskId); - CreateTask(debug_sub_810CE1C, 0); - debug_sub_810D340(); - return; - } - else if (gMain.newKeys & B_BUTTON) - { - DestroyTask(taskId); - Menu_EraseScreen(); - CreateTask(debug_sub_810CE1C, 0); - debug_sub_810D340(); - return; - } - else if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN)) - { - gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 0x19B) % 0x19C; - r2 = TRUE; - } - else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT)) - { - gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 1) % 0x19C; - r2 = TRUE; - } - - if (r2) - { - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[0], 2, 3); - StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]); - StringExpandPlaceholders(gStringVar4, sp0); - Menu_DrawStdWindowFrame(0, 0, 12, 3); - Menu_PrintText(gStringVar4, 1, 1); - } -} - -void debug_sub_810CCEC(u8 taskId) -{ - u8 string1[] = _("メール{STR_VAR_1}を だれに もたせる?"); - u8 string2[] = _("000 {STR_VAR_1}"); - - ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1); - StringExpandPlaceholders(gStringVar4, string1); - Menu_DisplayDialogueFrame(); - Menu_PrintText(gStringVar4, 4, 15); - - StringCopy(gStringVar1, gSpeciesNames[0]); - StringExpandPlaceholders(gStringVar4, string2); - Menu_DrawStdWindowFrame(0, 0, 12, 3); - Menu_PrintText(string2, 1, 1); // This probably should have been gStringVar4 - - gTasks[taskId].func = debug_sub_810CB50; -} - -u8 debug_sub_810CD9C(void) -{ - CloseMenu(); - ScriptContext1_Stop(); - ScriptContext2_Enable(); - gUnknown_Debug_0300079C = 0; - gSpecialVar_0x8004 = gSpecialVar_0x8005 = gSpecialVar_0x8006 = 0; - SetMainCallback2(debug_sub_810D388); - return 1; -} - -void debug_sub_810CDE0(void) -{ - UpdatePaletteFade(); - RunTasks(); -} - -void debug_sub_810CDF0(void) -{ - gMain.watchedKeysPressed = 0; - gMain.watchedKeysMask = 0; - gFieldCallback = mapldr_default; - SetMainCallback2(c2_exit_to_overworld_2_switch); -} - -void debug_sub_810CE1C(u8 taskId) -{ - if (gMenuCallback() == TRUE) - { - CloseMenu(); - DestroyTask(taskId); - } -} - -u8 debug_sub_810CE48(void) -{ - s8 input = Menu_ProcessInput(); - - switch (input) - { - case -1: - Menu_EraseScreen(); - debug_sub_810D340(); - return 0; - case -2: - return 0; - default: - gSpecialVar_0x8005 = input; - gSpecialVar_0x8006 %= 12; - CreateTask(debug_sub_810CA7C, 0); - gMain.watchedKeysPressed = TRUE; // huh? - gMain.watchedKeysMask = 0; - return 1; - } -} - -u8 debug_sub_810CEA4(void) -{ - if (!gPaletteFade.active) - { - gSpecialVar_0x8004 = 4; - sub_80E60D8(); - return 1; - } - return 0; -} - -u8 debug_sub_810CED0(void) -{ - u8 text[] = _("せいきの データが とうろくずみ です\n" - "しんき とうろく できません"); - s8 input = Menu_ProcessInput(); - - switch (input) - { - case -1: - Menu_EraseScreen(); - break; - case -2: - return 0; - default: - gSpecialVar_0x8005 = input; - if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId)) - { - Menu_EraseScreen(); - Menu_DisplayDialogueFrame(); - Menu_PrintText(text, 4, 15); - } - else - { - gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0xFFFF; - StringCopy(gSaveBlock1.mail[gSpecialVar_0x8005].playerName, gSaveBlock2.playerName); - *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = *(u32 *)gSaveBlock2.playerTrainerId; - gMenuCallback = debug_sub_810CEA4; - return 0; - } - break; - } - debug_sub_810D340(); - return 0; -} - -u8 debug_sub_810CFA4(void) -{ - u8 text[] = _("せいきに とうろくされたメールデータは\n" - "へんこう できません"); - s8 input = Menu_ProcessInput(); - - switch (input) - { - case -1: - Menu_EraseScreen(); - debug_sub_810D340(); - return 0; - case -2: - return 0; - default: - gSpecialVar_0x8005 = input; - if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId)) - { - Menu_EraseScreen(); - Menu_DisplayDialogueFrame(); - Menu_PrintText(text, 4, 15); - debug_sub_810D340(); - return 0; - } - else - { - CreateTask(debug_sub_810CCEC, 0); - return 1; - } - } -} - -u8 debug_sub_810D030(void) -{ - const u8 text1[] = _("メール{STR_VAR_1} とうろく かいじょ"); - const u8 text2[] = _("デバッグメニューから とうろくした\n" - "メール いがいは けせません"); - s8 input = Menu_ProcessInput(); - - switch (input) - { - case -1: - Menu_EraseScreen(); - debug_sub_810D340(); - return 0; - case -2: - return 0; - default: - gSpecialVar_0x8005 = input; - if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0xFFFF - && gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0) - { - Menu_EraseScreen(); - Menu_DisplayDialogueFrame(); - Menu_PrintText(text2, 4, 15); - debug_sub_810D340(); - return 0; - } - else - { - s8 i; - - gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0; - gSaveBlock1.mail[gSpecialVar_0x8005].species = 0; - gSaveBlock1.mail[gSpecialVar_0x8005].playerName[0] = EOS; - *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = 0; - for (i = 0; i < 9; i++) - gSaveBlock1.mail[gSpecialVar_0x8005].words[i] = 0xFFFF; - ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1); - StringExpandPlaceholders(gStringVar4, text1); - Menu_EraseScreen(); - Menu_DisplayDialogueFrame(); - Menu_PrintText(gStringVar4, 4, 15); - debug_sub_810D340(); - return 0; - } - } -} - -void debug_sub_810D174(u8 a) -{ - u8 string[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}"); - u8 buffer[9][20]; - struct MenuAction menuActions[9]; - u8 i; - - for (i = 0; i < 9; i++) - { - ConvertIntToDecimalStringN(gStringVar1, i, 1, 1); - if (gSaveBlock1.mail[i].itemId == 0xFFFF) - { - ConvertIntToDecimalStringN(gStringVar2, 1, 1, 1); - } - else if (IS_ITEM_MAIL(gSaveBlock1.mail[i].itemId)) - { - ConvertIntToDecimalStringN(gStringVar2, 2, 1, 1); - } - else - { - ConvertIntToDecimalStringN(gStringVar2, 0, 1, 1); - gSaveBlock1.mail[i].itemId = 0; - } - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.mail[i].species]); - StringExpandPlaceholders(buffer[i], string); - menuActions[i].text = buffer[i]; - menuActions[i].func = NULL; - } - Menu_DrawStdWindowFrame(0, 0, 16, 19); - Menu_PrintItems(2, 1, 9, menuActions); - InitMenu(0, 1, 1, 9, 0, 15); - switch (a) - { - case 0: - gMenuCallback = debug_sub_810CE48; - break; - case 1: - gMenuCallback = debug_sub_810CED0; - break; - case 2: - gMenuCallback = debug_sub_810CFA4; - break; - case 3: - gMenuCallback = debug_sub_810D030; - break; - } -} - -u8 debug_sub_810D2F4(void) -{ - s8 input = Menu_ProcessInput(); - - switch (input) - { - case -1: - SetMainCallback2(debug_sub_810CDF0); - return 1; - case -2: - return 0; - } - - switch (input) - { - case 0: - debug_sub_810D174(input); - return 0; - case 1: - debug_sub_810D174(input); - return 0; - case 2: - debug_sub_810D174(input); - return 0; - case 3: - debug_sub_810D174(input); - return 0; - } - - return 1; -} - -const struct MenuAction _84116BC[] = -{ - {Str_84115F4, NULL}, - {Str_84115FB, NULL}, - {Str_8411603, NULL}, - {Str_8411608, NULL}, -}; - -void debug_sub_810D340(void) -{ - Menu_DrawStdWindowFrame(0, 0, 9, 9); - Menu_PrintItems(2, 1, 4, _84116BC); - InitMenu(0, 1, 1, 4, 0, 8); - gMenuCallback = debug_sub_810D2F4; -} - -void debug_sub_810D388(void) -{ - switch (gMain.state) - { - case 0: - if (gUnknown_Debug_0300079C != 0) - { - gMain.state = 2; - gUnknown_Debug_0300079C = 0; - return; - } - else - { - ScanlineEffect_Stop(); - ResetPaletteFade(); - SetVBlankCallback(sub_80F8F18); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - } - break; - case 1: - if (UpdatePaletteFade()) - return; - break; - case 2: - SetVBlankCallback(NULL); - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2VOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - break; - case 3: - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - break; - case 4: - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - Menu_EraseScreen(); - break; - case 5: - LoadPalette(gMailGraphicsTable[0].palette, 0, 32); - LZ77UnCompVram(gMailGraphicsTable[0].tiles, (void *)VRAM); - DmaFill16(3, 1, (void *)(VRAM + 0x4000), 0x500); - break; - case 6: - REG_BG0CNT = 0x9F08; - REG_BG1CNT = 0x0801; - REG_BLDCNT = 0; - REG_DISPCNT = 0x0340; - debug_sub_810D340(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - SetVBlankCallback(sub_80F8F18); - break; - case 7: - if (!UpdatePaletteFade()) - return; - break; - case 8: - CreateTask(debug_sub_810CE1C, 0); - SetMainCallback2(debug_sub_810CDE0); - break; - default: - return; - } - gMain.state++; -} - -#endif diff --git a/src/pokemon/mail_data.c b/src/pokemon/mail_data.c deleted file mode 100644 index 4249b9f48..000000000 --- a/src/pokemon/mail_data.c +++ /dev/null @@ -1,208 +0,0 @@ -#include "global.h" -#include "mail_data.h" -#include "constants/items.h" -#include "name_string_util.h" -#include "pokemon.h" -#include "pokemon_icon.h" -#include "constants/species.h" -#include "text.h" - -void ClearMailData(void) -{ - u8 i; - - for (i = 0; i < 16; i++) - ClearMailStruct(&gSaveBlock1.mail[i]); -} - -void ClearMailStruct(struct MailStruct *mail) -{ - int i; - - for (i = 0; i < 9; i++) - mail->words[i] = -1; - - for (i = 0; i < 8; i++) - mail->playerName[i] = -1; - - for (i = 0; i < 4; i++) - mail->trainerId[i] = 0; - - mail->species = 1; - mail->itemId = 0; -} - -bool8 MonHasMail(struct Pokemon *mon) -{ - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); - if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) - return TRUE; - else - return FALSE; -} - -u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) -{ - u16 _itemId; - u8 heldItem[2]; - u8 id; - u8 i; - u16 species; - u32 personality; - - _itemId = itemId; - heldItem[0] = _itemId; - heldItem[1] = _itemId >> 8; - id = 0; - - while (id < 6) - { - if (gSaveBlock1.mail[id].itemId == 0) - { - for (i = 0; i < 9; i++) - gSaveBlock1.mail[id].words[i] = -1; - - for (i = 0; i < 7; i++) - gSaveBlock1.mail[id].playerName[i] = gSaveBlock2.playerName[i]; - gSaveBlock1.mail[id].playerName[i] = EOS; - PadNameString(gSaveBlock1.mail[id].playerName, 0); - - for (i = 0; i < 4; i++) - gSaveBlock1.mail[id].trainerId[i] = gSaveBlock2.playerTrainerId[i]; - - species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); - personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); - gSaveBlock1.mail[id].species = SpeciesToMailSpecies(species, personality); - gSaveBlock1.mail[id].itemId = _itemId; - SetMonData(mon, MON_DATA_MAIL, &id); - SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); - return id; - } - id++; - } - - return -1; -} - -u16 SpeciesToMailSpecies(u16 species, u32 personality) -{ - if (species == SPECIES_UNOWN) - { - int mailSpecies = GetUnownLetterByPersonality(personality) + 30000; - return mailSpecies; - } - - return species; -} - -u16 MailSpeciesToSpecies(u16 a1, u16 *a2) -{ - u16 result; - - if (a1 >= 30000 && a1 < (30000 + UNOWN_FORM_COUNT)) - { - result = SPECIES_UNOWN; - *a2 = a1 - 30000; - } - else - { - result = a1; - } - - return result; -} - -u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail) -{ - u8 heldItem[2]; - u16 itemId = mail->itemId; - u8 mailId = GiveMailToMon(mon, itemId); - - if (mailId == 0xFF) - return 0xFF; - - gSaveBlock1.mail[mailId] = *mail; - - SetMonData(mon, MON_DATA_MAIL, &mailId); - - heldItem[0] = itemId; - heldItem[1] = itemId >> 8; - - SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); - - return mailId; -} - -int unref_sub_80A2DF4(void) -{ - return 0; -} - -void TakeMailFromMon(struct Pokemon *mon) -{ - u8 heldItem[2]; - u8 mailId; - - if (MonHasMail(mon)) - { - mailId = GetMonData(mon, MON_DATA_MAIL); - gSaveBlock1.mail[mailId].itemId = 0; - mailId = 0xFF; - heldItem[0] = 0; - heldItem[1] = 0; - SetMonData(mon, MON_DATA_MAIL, &mailId); - SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); - } -} - -void DeleteMail(u8 mailId) -{ - gSaveBlock1.mail[mailId].itemId = 0; -} - -u8 TakeMailFromMon2(struct Pokemon *mon) -{ - u8 i; - u8 newHeldItem[2]; - u8 newMailId; - - newHeldItem[0] = 0; - newHeldItem[1] = 0; - newMailId = 0xFF; - - for (i = 6; i < 16; i++) - { - if (gSaveBlock1.mail[i].itemId == 0) - { - memcpy(&gSaveBlock1.mail[i], &gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct)); - gSaveBlock1.mail[GetMonData(mon, MON_DATA_MAIL)].itemId = 0; - SetMonData(mon, MON_DATA_MAIL, &newMailId); - SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); - return i; - } - } - - return 0xFF; -} - -bool8 ItemIsMail(u16 itemId) -{ - switch (itemId) - { - case ITEM_ORANGE_MAIL: - case ITEM_HARBOR_MAIL: - case ITEM_GLITTER_MAIL: - case ITEM_MECH_MAIL: - case ITEM_WOOD_MAIL: - case ITEM_WAVE_MAIL: - case ITEM_BEAD_MAIL: - case ITEM_SHADOW_MAIL: - case ITEM_TROPIC_MAIL: - case ITEM_DREAM_MAIL: - case ITEM_FAB_MAIL: - case ITEM_RETRO_MAIL: - return TRUE; - default: - return FALSE; - } -} diff --git a/src/pokemon/mon_markings.c b/src/pokemon/mon_markings.c deleted file mode 100644 index dcdc54434..000000000 --- a/src/pokemon/mon_markings.c +++ /dev/null @@ -1,617 +0,0 @@ -#include "global.h" -#include "main.h" -#include "menu_cursor.h" -#include "text_window.h" -#include "constants/songs.h" -#include "sound.h" -#include "sprite.h" -#include "mon_markings.h" - -#ifdef GERMAN -#define MENU_TEXT_SPRITE_X_OFFSET 24 -#else -#define MENU_TEXT_SPRITE_X_OFFSET 32 -#endif - -extern u8 gPokenavConditionMenuMisc_Gfx[]; -extern u16 gUnknown_08E966B8[]; - -const u16 gUnknown_083E49F4[] = INCBIN_U16("graphics/misc/mon_markings.gbapal"); -const u8 gUnknown_083E4A14[] = INCBIN_U8("graphics/misc/mon_markings.4bpp"); - -const struct OamData gOamData_83E5214 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const struct OamData gOamData_83E521C = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_83E5224[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E522C[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E5234[] = -{ - ANIMCMD_FRAME(2, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E523C[] = -{ - ANIMCMD_FRAME(3, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E5244[] = -{ - ANIMCMD_FRAME(4, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E524C[] = -{ - ANIMCMD_FRAME(5, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E5254[] = -{ - ANIMCMD_FRAME(6, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E525C[] = -{ - ANIMCMD_FRAME(7, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E5264[] = -{ - ANIMCMD_FRAME(8, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E526C[] = -{ - ANIMCMD_FRAME(9, 5), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_83E5274[] = -{ - gSpriteAnim_83E5224, - gSpriteAnim_83E522C, - gSpriteAnim_83E5234, - gSpriteAnim_83E523C, - gSpriteAnim_83E5244, - gSpriteAnim_83E524C, - gSpriteAnim_83E5254, - gSpriteAnim_83E525C, - gSpriteAnim_83E5264, - gSpriteAnim_83E526C, -}; - -const union AnimCmd gSpriteAnim_83E529C[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52A4[] = -{ - ANIMCMD_FRAME(64, 5), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_83E52AC[] = -{ - gSpriteAnim_83E529C, - gSpriteAnim_83E52A4, -}; - -const struct OamData gOamData_83E52B4 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -const union AnimCmd gSpriteAnim_83E52BC[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52C4[] = -{ - ANIMCMD_FRAME(4, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52CC[] = -{ - ANIMCMD_FRAME(8, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52D4[] = -{ - ANIMCMD_FRAME(12, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52DC[] = -{ - ANIMCMD_FRAME(16, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52E4[] = -{ - ANIMCMD_FRAME(20, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52EC[] = -{ - ANIMCMD_FRAME(24, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52F4[] = -{ - ANIMCMD_FRAME(28, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E52FC[] = -{ - ANIMCMD_FRAME(32, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E5304[] = -{ - ANIMCMD_FRAME(36, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E530C[] = -{ - ANIMCMD_FRAME(40, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E5314[] = -{ - ANIMCMD_FRAME(44, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E531C[] = -{ - ANIMCMD_FRAME(48, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E5324[] = -{ - ANIMCMD_FRAME(52, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E532C[] = -{ - ANIMCMD_FRAME(56, 5), - ANIMCMD_END, -}; - -const union AnimCmd gSpriteAnim_83E5334[] = -{ - ANIMCMD_FRAME(60, 5), - ANIMCMD_END, -}; - -const union AnimCmd *const gSpriteAnimTable_83E533C[] = -{ - gSpriteAnim_83E52BC, - gSpriteAnim_83E52C4, - gSpriteAnim_83E52CC, - gSpriteAnim_83E52D4, - gSpriteAnim_83E52DC, - gSpriteAnim_83E52E4, - gSpriteAnim_83E52EC, - gSpriteAnim_83E52F4, - gSpriteAnim_83E52FC, - gSpriteAnim_83E5304, - gSpriteAnim_83E530C, - gSpriteAnim_83E5314, - gSpriteAnim_83E531C, - gSpriteAnim_83E5324, - gSpriteAnim_83E532C, - gSpriteAnim_83E5334, -}; - -static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL; - -static void sub_80F761C(s16, s16, u16, u16); -static void nullsub_65(struct Sprite *); -static void sub_80F78CC(struct Sprite *); -static void sub_80F7908(struct Sprite *); -static struct Sprite *sub_80F7960(u16, u16, const u16 *, u16); - -void sub_80F727C(struct PokemonMarkMenu *ptr) -{ - sMenu = ptr; - sMenu->spriteSheetLoadRequired = FALSE; -} - -void sub_80F728C(void) -{ - const struct FrameGraphics *frame = TextWindow_GetFrameGraphics(gSaveBlock2.optionsWindowFrameType); - sMenu->frameTiles = frame->tiles; - sMenu->framePalette = frame->palette; - sMenu->tileLoadState = 0; - CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles)); -} - -bool8 sub_80F72D4(void) -{ - u16 i; - u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100; - - switch (sMenu->tileLoadState) - { - case 0: - CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP); - for (i = 0; i < 6; i++) - { - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); - sMenu->tileLoadState++; - break; - default: - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP); - for (i = 0; i < 6; i++) - { - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); - sMenu->tileLoadState++; - break; - case 13: - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP); - for (i = 0; i < 6; i++) - { - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } - CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); - sMenu->tileLoadState++; - return FALSE; - case 14: - return FALSE; - } - - return TRUE; -} - -void sub_80F7404(void) -{ - sub_80F728C(); - while (sub_80F72D4()) - ; -} - -void sub_80F7418(u8 markings, s16 x, s16 y) -{ - u16 i; - sMenu->cursorPos = 0; - sMenu->markings = markings; - for (i = 0; i < 4; i++) - sMenu->markingsArray[i] = (sMenu->markings >> i) & 1; - DestroyMenuCursor(); - sub_80F761C(x, y, sMenu->baseTileTag, sMenu->basePaletteTag); -} - -void sub_80F7470(void) -{ - u16 i; - - for (i = 0; i < 3; i++) - { - FreeSpriteTilesByTag(sMenu->baseTileTag + i); - } - - FreeSpritePaletteByTag(sMenu->basePaletteTag); - FreeSpritePaletteByTag(sMenu->basePaletteTag + 1); - - for (i = 0; i < 2; i++) - { - if (!sMenu->menuWindowSprites[i]) - return; - DestroySprite(sMenu->menuWindowSprites[i]); - } - - for (i = 0; i < 4; i++) - { - if (!sMenu->menuMarkingSprites[i]) - return; - DestroySprite(sMenu->menuMarkingSprites[i]); - } - - DestroyMenuCursor(); - - if (sMenu->menuTextSprite) - DestroySprite(sMenu->menuTextSprite); -} - -bool8 sub_80F7500(void) -{ - u16 i; - struct SpriteSheet sheets[3] = - { - { sMenu->menuWindowSpriteTiles, 0x1000, sMenu->baseTileTag }, - { gPokenavConditionMenuMisc_Gfx, 0x520, sMenu->baseTileTag + 1 }, - { NULL, 0, 0 } - }; - - if (sMenu->spriteSheetLoadRequired) - { - LoadTilesForSpriteSheets(sheets); - sMenu->spriteSheetLoadRequired = FALSE; - } - - if (gMain.newKeys & DPAD_UP) - { - s8 pos; - PlaySE(SE_SELECT); - pos = --sMenu->cursorPos; - if (pos < 0) - sMenu->cursorPos = 5; - return TRUE; - } - - if (gMain.newKeys & DPAD_DOWN) - { - s8 pos; - PlaySE(SE_SELECT); - pos = ++sMenu->cursorPos; - if (pos > 5) - sMenu->cursorPos = 0; - return TRUE; - } - - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - - switch (sMenu->cursorPos) - { - case 4: - sMenu->markings = 0; - for (i = 0; i < 4; i++) - sMenu->markings |= sMenu->markingsArray[i] << i; - return FALSE; - case 5: - return FALSE; - } - - sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos]; - return TRUE; - } - - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - return FALSE; - } - - return TRUE; -} - -void sub_80F761C(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag) -{ - u16 i; - u8 spriteId; - - struct SpriteSheet sheets[] = - { - { sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag }, - { gPokenavConditionMenuMisc_Gfx, 0x520, baseTileTag + 1 }, - { NULL, 0 } - }; - - struct SpritePalette palettes[] = - { - { sMenu->framePalette, basePaletteTag }, - { gUnknown_08E966B8, basePaletteTag + 1}, - { NULL, 0 } - }; - - struct SpriteTemplate sprTemplate = - { - baseTileTag, - basePaletteTag, - &gOamData_83E5214, - gSpriteAnimTable_83E52AC, - NULL, - gDummySpriteAffineAnimTable, - nullsub_65, - }; - - sMenu->spriteSheetLoadRequired = TRUE; - AllocTilesForSpriteSheets(sheets); - LoadSpritePalettes(palettes); - - for (i = 0; i < 2; i++) - { - spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 2); - if (spriteId != 64) - { - sMenu->menuWindowSprites[i] = &gSprites[spriteId]; - StartSpriteAnim(&gSprites[spriteId], i); - } - else - { - sMenu->menuWindowSprites[i] = NULL; - return; - } - } - - sMenu->menuWindowSprites[1]->pos1.y = y + 96; - - sprTemplate.tileTag++; - sprTemplate.paletteTag++; - sprTemplate.anims = gSpriteAnimTable_83E5274; - sprTemplate.callback = sub_80F78CC; - sprTemplate.oam = &gOamData_83E521C; - - for (i = 0; i < 4; i++) - { - spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 1); - if (spriteId != 64) - { - sMenu->menuMarkingSprites[i] = &gSprites[spriteId]; - gSprites[spriteId].data[0] = i; - } - else - { - sMenu->menuMarkingSprites[i] = NULL; - return; - } - } - - sprTemplate.callback = SpriteCallbackDummy; - - spriteId = CreateSprite(&sprTemplate, 0, 0, 1); - - if (spriteId != 64) - { - sMenu->menuTextSprite = &gSprites[spriteId]; - sMenu->menuTextSprite->oam.shape = ST_OAM_H_RECTANGLE; - sMenu->menuTextSprite->oam.size = 3; - StartSpriteAnim(sMenu->menuTextSprite, 9); - sMenu->menuTextSprite->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET; - sMenu->menuTextSprite->pos1.y = y + 80; - CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0); - } - else - { - sMenu->menuTextSprite = NULL; - } - - sMenu->cursorBaseY = y + 8; - MenuCursor_Create814A5C0(0, basePaletteTag + 1, 15, 0, 0x30); - MenuCursor_SetPos814A880(x + 8, sMenu->cursorBaseY); - sub_814AABC(sub_80F7908); -} - -void nullsub_65(struct Sprite *sprite) -{ -} - -void sub_80F78CC(struct Sprite *sprite) -{ - if (sMenu->markingsArray[sprite->data[0]]) - StartSpriteAnim(sprite, 2 * sprite->data[0] + 1); - else - StartSpriteAnim(sprite, 2 * sprite->data[0]); -} - -void sub_80F7908(struct Sprite *sprite) -{ - sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY; -} - -struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, const u16 *palette) -{ - if (!palette) - palette = gUnknown_083E49F4; - return sub_80F7960(tileTag, paletteTag, palette, 16); -} - -struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, const u16 *palette) -{ - if (!palette) - palette = gUnknown_083E49F4; - return sub_80F7960(tileTag, paletteTag, palette, 1); -} - -struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size) -{ - u8 spriteId; - struct SpriteTemplate sprTemplate; - struct SpriteSheet sheet = { gUnknown_083E4A14, 0x80, tileTag }; - struct SpritePalette sprPalette = { palette, paletteTag }; - - sprTemplate.tileTag = tileTag; - sprTemplate.paletteTag = paletteTag; - sprTemplate.oam = &gOamData_83E52B4; - sprTemplate.anims = gSpriteAnimTable_83E533C; - sprTemplate.images = NULL; - sprTemplate.affineAnims = gDummySpriteAffineAnimTable; - sprTemplate.callback = nullsub_65; - - sheet.size = size * 0x80; - - LoadSpriteSheet(&sheet); - LoadSpritePalette(&sprPalette); - - spriteId = CreateSprite(&sprTemplate, 0, 0, 0); - if (spriteId != 64) - return &gSprites[spriteId]; - else - return NULL; -} - -void sub_80F7A10(u8 markings, void *dest) -{ - DmaCopy16Defvars(3, gUnknown_083E4A14 + markings * 0x80, dest, 0x80); -} diff --git a/src/pokemon/pokeblock_feed.c b/src/pokemon/pokeblock_feed.c deleted file mode 100644 index 2f2ce2f8f..000000000 --- a/src/pokemon/pokeblock_feed.c +++ /dev/null @@ -1,1012 +0,0 @@ -#include "global.h" -#include "task.h" -#include "palette.h" -#include "main.h" -#include "menu_helpers.h" -#include "text.h" -#include "text_window.h" -#include "menu.h" -#include "overworld.h" -#include "decompress.h" -#include "data2.h" -#include "sprite.h" -#include "item_use.h" -#include "pokeblock.h" -#include "party_menu.h" -#include "strings.h" -#include "string_util.h" -#include "m4a.h" -#include "field_effect.h" -#include "sound.h" -#include "trig.h" -#include "ewram.h" - -extern struct MusicPlayerInfo gMPlay_BGM; -extern u8 gPokeblockMonID; -extern s16 gPokeblockGain; - -extern const u8 gPokeblockRed_Pal[]; -extern const u8 gPokeblockBlue_Pal[]; -extern const u8 gPokeblockPink_Pal[]; -extern const u8 gPokeblockGreen_Pal[]; -extern const u8 gPokeblockYellow_Pal[]; -extern const u8 gPokeblockPurple_Pal[]; -extern const u8 gPokeblockIndigo_Pal[]; -extern const u8 gPokeblockBrown_Pal[]; -extern const u8 gPokeblockLiteBlue_Pal[]; -extern const u8 gPokeblockOlive_Pal[]; -extern const u8 gPokeblockGray_Pal[]; -extern const u8 gPokeblockBlack_Pal[]; -extern const u8 gPokeblockWhite_Pal[]; -extern const u8 gPokeblockGold_Pal[]; -extern const u8 gPokeblock_Gfx[]; -extern const u8 gBattleTerrainTiles_Building[]; -extern const u8 gUnknown_08E782FC[]; -extern const u8 gBattleTerrainPalette_BattleTower[]; -extern const struct CompressedSpriteSheet gUnknown_083F7F74; -extern const struct CompressedSpritePalette gUnknown_083F7F7C; - -bool8 IsPokeSpriteNotFlipped(u16 species); - -// this file's functions -static void sub_8147B04(void); -static void sub_81481DC(void); -static void sub_814825C(void); -static u8 sub_81480B4(void); -static u8 CreatePokeblockSprite(void); -static u8 PokeblockFeed_CreatePokeSprite(struct Pokemon* mon); -static bool8 sub_8147B20(struct Pokemon* mon); -static void LaunchPokeblockFeedTask(u8); -static void sub_8148044(u8); -static void sub_8148078(struct Sprite* sprite); -static void Task_PrintAtePokeblockText(u8 taskID); -static void Task_PaletteFadeToReturn(u8 taskID); -static void SetPokeblockFeedSpritePal(u8); -static void sub_8148108(u8, bool8); -static bool8 sub_8148540(void); -static bool8 sub_81485CC(void); -static bool8 FreePokeSpriteMatrix(void); -void sub_8148710(void); -static void SpriteCB_ThrownPokeblock(struct Sprite* sprite); -static void sub_814862C(void); - -// EWRAM -EWRAM_DATA static struct CompressedSpritePalette sPokeblockFeedSpritePal = {0}; - -// IWRAM common -struct Sprite* gPokeblockFeedPokeSprite; -u16 gPokeblockFeedMonSpecies; -bool8 gPokeblockMonNotFlipped; -u8 gPokeblockFeedMonSpriteID; -u8 gPokeblockFeedMonNature; -u16 gUnknown_03005F34; -u8 gPokeblockFeedUnused0; -u8 gUnknown_03005F3C; -u8 gUnknown_03005F40; -struct Sprite gPokeblockFeedPokeSpriteCopy; -u16 gUnknown_03005F94; -s16 gUnknown_03005FA0[24]; - -// rodata - -static const u8 sNatureToMonPokeblockAnim[][2] = -{ - { 0, 0 }, // HARDY - { 3, 0 }, // LONELY - { 4, 1 }, // BRAVE - { 5, 0 }, // ADAMANT - { 10, 0 }, // NAUGHTY - { 13, 0 }, // BOLD - { 15, 0 }, // DOCILE - { 16, 2 }, // RELAXED - { 18, 0 }, // IMPISH - { 19, 0 }, // LAX - { 20, 0 }, // TIMID - { 25, 0 }, // HASTY - { 27, 3 }, // SERIOUS - { 28, 0 }, // JOLLY - { 29, 0 }, // NAIVE - { 33, 4 }, // MODEST - { 36, 0 }, // MILD - { 37, 0 }, // QUIET - { 39, 0 }, // BASHFUL - { 42, 0 }, // RASH - { 45, 0 }, // CALM - { 46, 5 }, // GENTLE - { 47, 6 }, // SASSY - { 48, 0 }, // CAREFUL - { 53, 0 }, // QUIRKY -}; - -static const s16 sMonPokeblockAnims[][10] = -{ - // HARDY - { 0, 4, 0, 8, 24, 0, 0, 0, 12, 0}, - { 0, 4, 0, 16, 24, 0, 0, 0, 12, 0}, - { 0, 4, 0, 32, 32, 0, 0, 0, 16, 1}, - - // LONELY - { 0, 3, 6, 0, 48, 0, 0, 0, 24, 1}, - - // BRAVE - { 64, 16, -24, 0, 32, 0, 0, 0, 0, 1}, - - // ADAMANT - { 0, 4, 8, 0, 16, 0, -8, 0, 0, 0}, - { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0}, - { 0, 4, 8, 0, 16, 0, -8, 0, 0, 0}, - { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0}, - { 0, 4, -16, 0, 4, 0, 16, 0, 0, 1}, - - // NAUGHTY - { 0, 3, 6, 0, 12, 0, 0, 0, 6, 0}, - { 0, 3, -6, 0, 12, 0, 0, 0, 6, 0}, - { 0, 16, 16, 0, 45, 1, 0, 0, 0, 1}, - - // BOLD - { 0, 16, 0, 24, 32, 0, 0, 0, 16, 0}, - { 0, 16, 0, 23, 32, 0, 0, 0, 16, 1}, - - // DOCILE - { 0, 0, 0, 0, 80, 0, 0, 0, 0, 1}, - - // RELAXED - { 0, 2, 8, 0, 32, 0, 0, 0, 0, 0}, - { 0, 2, -8, 0, 32, 0, 0, 0, 0, 1}, - - // IMPISH - { 0, 32, 2, 1, 48, 1, 0, 0, 24, 1}, - - // LAX - { 0, 2, 16, 16, 128, 0, 0, 0, 0, 1}, - - // TIMID - { 0, 2, -8, 0, 48, 0, -24, 0, 0, 0}, - { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, - { 64, 32, 2, 0, 36, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, - { 0, 2, 8, 0, 48, 0, 24, 0, 0, 1}, - - // HASTY - { 64, 24, 16, 0, 32, 0, 0, 0, 0, 0}, - { 0, 28, 2, 1, 32, 1, 0, 0, 16, 1}, - - // SERIOUS - { 0, 0, 0, 0, 32, 0, 0, 0, 0, 1}, - - // JOLLY - { 64, 16, -16, 2, 48, 0, 0, 0, 32, 1}, - - // NAIVE - { 0, 12, -8, 4, 24, 0, 8, 0, 12, 0}, - { 0, 12, 8, 8, 24, 0, -16, 0, 12, 0}, - { 0, 12, -8, 16, 24, 0, 16, 0, 12, 0}, - { 0, 12, 8, 28, 24, 0, -8, 0, 12, 1}, - - // MODEST - { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, - { 64, 16, -4, 0, 32, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 8, 0, 0, 0, 0, 1}, - - // MILD - { 128, 4, 0, 8, 64, 0, 0, 0, 0, 1}, - - // QUIET - { 0, 2, 16, 0, 48, 0, 0, 0, 0, 0}, - { 128, 2, 16, 0, 48, 0, 0, 0, 0, 1}, - - // BASHFUL - { 0, 2, -4, 0, 48, 0, -48, 0, 0, 0}, - { 0, 0, 0, 0, 80, 0, 0, 0, 0, 0}, - { 0, 2, 8, 0, 24, 0, 48, 0, 0, 1}, - - // RASH - { 64, 4, 64, 58, 52, 0, -88, 0, 0, 0}, - { 0, 0, 0, 0, 80, 0, 0, 0, 0, 0}, - { 0, 24, 80, 0, 32, 0, 88, 0, 0, 1}, - - // CALM - { 0, 2, 16, 4, 64, 0, 0, 0, 0, 1}, - - // GENTLE - { 0, 0, 0, 0, 32, 0, 0, 0, 0, 1}, - - // SASSY - { 0, 0, 0, 0, 42, 0, 0, 0, 0, 1}, - - // CAREFUL - { 0, 4, 0, 8, 24, 0, 0, 0, 12, 0}, - { 0, 0, 0, 0, 12, 0, 0, 0, 0, 0}, - { 0, 4, 0, 12, 24, 0, 0, 0, 12, 0}, - { 0, 0, 0, 0, 12, 0, 0, 0, 0, 0}, - { 0, 4, 0, 4, 24, 0, 0, 0, 12, 1}, - - // QUIRKY - { 0, 4, 16, 12, 64, 0, 0, 0, 0, 0}, - { 0, -4, 16, 12, 64, 0, 0, 0, 0, 1}, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411E90[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411EA0[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 12, 1), - AFFINEANIMCMD_FRAME(0, 0, 0, 30), - AFFINEANIMCMD_FRAME(0, 0, -12, 1), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411EC0[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 12, 1), - AFFINEANIMCMD_FRAME(0, 0, 0, 28), - AFFINEANIMCMD_FRAME(0, 0, -4, 3), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411EE8[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), - AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 32), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411F08[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), - AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 32), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411F30[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411F50[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411F78[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 32), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411F98[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 32), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 8), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411FC0[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 4), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 24), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 4), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8411FE0[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 4), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 24), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 4), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8412008[] = -{ - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), - AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 2), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8412028[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), - AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 2), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_8412050[] = -{ - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411EA0, - sSpriteAffineAnim_8411EE8, - sSpriteAffineAnim_8411F30, - sSpriteAffineAnim_8411F78, - sSpriteAffineAnim_8411FC0, - sSpriteAffineAnim_8412008, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411EC0, - sSpriteAffineAnim_8411F08, - sSpriteAffineAnim_8411F50, - sSpriteAffineAnim_8411F98, - sSpriteAffineAnim_8411FE0, - sSpriteAffineAnim_8412028, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, -}; - -static const u8* const sPokeblocksPals[] = -{ - gPokeblockRed_Pal, - gPokeblockBlue_Pal, - gPokeblockPink_Pal, - gPokeblockGreen_Pal, - gPokeblockYellow_Pal, - gPokeblockPurple_Pal, - gPokeblockIndigo_Pal, - gPokeblockBrown_Pal, - gPokeblockLiteBlue_Pal, - gPokeblockOlive_Pal, - gPokeblockGray_Pal, - gPokeblockBlack_Pal, - gPokeblockWhite_Pal, - gPokeblockGold_Pal -}; - -static const union AffineAnimCmd sSpriteAffineAnim_84120DC[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_84120EC[] = -{ - sSpriteAffineAnim_84120DC -}; - -static const union AffineAnimCmd sSpriteAffineAnim_84120F0[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), - AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, 16, 1), - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sSpriteAffineAnim_8412148[] = -{ - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), - AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1), - AFFINEANIMCMD_FRAME(0x0, 0x0, -16, 1), - AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_84121A0[] = -{ - sSpriteAffineAnim_84120DC -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_84121A4[] = -{ - sSpriteAffineAnim_84120F0 -}; - -static const union AffineAnimCmd *const sSpriteAffineAnimTable_84121A8[] = -{ - sSpriteAffineAnim_8412148 -}; - -static const struct OamData sThrownPokeblockOamData = -{ - .y = 0, - .affineMode = 3, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sThrownPokeblockSpriteAnim[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END -}; - -static const union AnimCmd *const sThrownPokeblockAnimTable[] = -{ - sThrownPokeblockSpriteAnim, -}; - -static const union AffineAnimCmd sSpriteAffineAnim_84121C0[] = -{ - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(-8, -8, 0, 1), - AFFINEANIMCMD_JUMP(1) -}; - -static const union AffineAnimCmd *const sThrownPokeblockAffineAnimTable[] = -{ - sSpriteAffineAnim_84121C0 -}; - -static const struct CompressedSpriteSheet sUnknown_084121DC = -{ - gPokeblock_Gfx, 0x20, 14818 -}; - -static const struct SpriteTemplate sThrownPokeblockSpriteTemplate = -{ - .tileTag = 14818, - .paletteTag = 14818, - .oam = &sThrownPokeblockOamData, - .anims = sThrownPokeblockAnimTable, - .images = NULL, - .affineAnims = sThrownPokeblockAffineAnimTable, - .callback = SpriteCB_ThrownPokeblock -}; - -// code - -static void CB2_PokeblockFeed(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTasks(); - UpdatePaletteFade(); -} - -static void VBlankCB_PokeblockFeed(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static bool8 TransitionToPokeblockFeedScene(void) -{ - switch (gMain.state) - { - case 0: - ClearVideoCallbacks(); - sub_80F9368(); - sub_8147B04(); - gMain.state++; - break; - case 1: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = 1; - gMain.state++; - break; - case 2: - ResetSpriteData(); - gMain.state++; - break; - case 3: - FreeAllSpritePalettes(); - gMain.state++; - break; - case 4: - Text_LoadWindowTemplate(&gWindowTemplate_81E6E50); - gMain.state++; - break; - case 5: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50); - gMain.state++; - break; - case 6: - if (MultistepInitMenuWindowContinue()) - { - ewram1FFFF = 0; - gMain.state++; - } - break; - case 7: - if (sub_8147B20(&gPlayerParty[gPokeblockMonID])) - { - gMain.state++; - } - break; - case 8: - ewram1FFFD = sub_81480B4(); - gMain.state++; - break; - case 9: - ewram1FFFE = PokeblockFeed_CreatePokeSprite(&gPlayerParty[gPokeblockMonID]); - gMain.state++; - break; - case 10: - Menu_DrawStdWindowFrame(0, 14, 29, 19); - gMain.state++; - break; - case 11: - if (sub_8055870() != 1) - { - gMain.state++; - } - break; - case 12: - { - u16 savedIME = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIME; - REG_DISPSTAT |= 8; - SetVBlankCallback(VBlankCB_PokeblockFeed); - gMain.state++; - } - case 13: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - SetMainCallback2(CB2_PokeblockFeed); - return TRUE; - } - return FALSE; -} - -void CB2_PreparePokeblockFeedScene(void) -{ - while (1) - { - if (TransitionToPokeblockFeedScene() == 1) - { - LaunchPokeblockFeedTask(1); - break; - } - if (sub_80F9344() == 1) - break; - } -} - -static void sub_8147B04(void) -{ - REG_BG1CNT = 0x1D02l; - REG_DISPCNT = 0x1340; -} - -static bool8 sub_8147B20(struct Pokemon* mon) -{ - u16 species; - u32 PiD, TiD; - switch (ewram1FFFF) - { - case 0: - species = GetMonData(mon, MON_DATA_SPECIES2); - PiD = GetMonData(mon, MON_DATA_PERSONALITY); - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_081FAF4C[1], species, PiD); - ewram1FFFF++; - break; - case 1: - { - const struct CompressedSpritePalette* palette; - - species = GetMonData(mon, MON_DATA_SPECIES2); - PiD = GetMonData(mon, MON_DATA_PERSONALITY); - TiD = GetMonData(mon, MON_DATA_OT_ID); - palette = GetMonSpritePalStructFromOtIdPersonality(species, TiD, PiD); - LoadCompressedObjectPalette(palette); - GetMonSpriteTemplate_803C56C(palette->tag, 1); - ewram1FFFF++; - } - break; - case 2: - LoadCompressedObjectPic(&gUnknown_083F7F74); - ewram1FFFF++; - break; - case 3: - LoadCompressedObjectPalette(&gUnknown_083F7F7C); - ewram1FFFF++; - break; - case 4: - LoadCompressedObjectPic(&sUnknown_084121DC); - ewram1FFFF++; - break; - case 5: - SetPokeblockFeedSpritePal(gSpecialVar_ItemId); - LoadCompressedObjectPalette(&sPokeblockFeedSpritePal); - ewram1FFFF++; - break; - case 6: - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM)); - ewram1FFFF++; - break; - case 7: - LZDecompressVram(gUnknown_08E782FC, (void*)(VRAM + 0xE800)); - ewram1FFFF++; - break; - case 8: - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - ewram1FFFF = 0; - return TRUE; - } - return FALSE; -} - -static void SetPokeblockFeedSpritePal(u8 pkbID) -{ - u8 color = GetPokeblockData(&gSaveBlock1.pokeblocks[pkbID], PBLOCK_COLOR); - sPokeblockFeedSpritePal.data = sPokeblocksPals[color - 1]; - sPokeblockFeedSpritePal.tag = 0x39E2; -} - -static void sub_8147CC8(u8 taskID) -{ - if (!gPaletteFade.active) - { - switch (gTasks[taskID].data[0]) - { - case 0: - gUnknown_03005F3C = 0; - gUnknown_03005F94 = 0; - sub_81481DC(); - break; - case 255: - sub_8148108(ewram1FFFD, gTasks[taskID].data[1]); - break; - case 269: - ewram1FFFC = CreatePokeblockSprite(); - break; - case 281: - sub_8148044(ewram1FFFE); - break; - case 297: - gTasks[taskID].func = Task_PrintAtePokeblockText; - return; - } - if (gUnknown_03005F94 < gUnknown_03005F34) - sub_814825C(); - else if (gUnknown_03005F94 == gUnknown_03005F34) - gTasks[taskID].data[0] = 254; - - gUnknown_03005F94++; - gTasks[taskID].data[0]++; - } -} - -static void LaunchPokeblockFeedTask(u8 a0) -{ - u8 taskID = CreateTask(sub_8147CC8, 0); - gTasks[taskID].data[0] = 0; - gTasks[taskID].data[1] = a0; -} - -static void Task_WaitForAtePokeblockText(u8 taskID) -{ - if (Menu_UpdateWindowText() == 1) - gTasks[taskID].func = Task_PaletteFadeToReturn; -} - -static void Task_PrintAtePokeblockText(u8 taskID) -{ - struct Pokemon* mon = &gPlayerParty[gPokeblockMonID]; - struct Pokeblock* pokeblock = &gSaveBlock1.pokeblocks[gSpecialVar_ItemId]; - - gPokeblockGain = PokeblockGetGain(GetNature(mon), pokeblock); - GetMonNickname(mon, gStringVar1); - PokeblockCopyName(pokeblock, gStringVar2); - - if (gPokeblockGain == 0) - StringExpandPlaceholders(gStringVar4, gContestStatsText_NormallyAte); - else if (gPokeblockGain > 0) - StringExpandPlaceholders(gStringVar4, gContestStatsText_HappilyAte); - else - StringExpandPlaceholders(gStringVar4, gContestStatsText_DisdainfullyAte); - - MenuPrintMessage(gStringVar4, 1, 15); - gTasks[taskID].func = Task_WaitForAtePokeblockText; -} - -static void Task_ReturnAfterPaletteFade(u8 taskID) -{ - if (!gPaletteFade.active) - { - m4aMPlayVolumeControl(&gMPlay_BGM, -1, 256); - SetMainCallback2(gMain.savedCallback); - DestroyTask(taskID); - } -} - -static void Task_PaletteFadeToReturn(u8 taskID) -{ - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = Task_ReturnAfterPaletteFade; -} - -static u8 PokeblockFeed_CreatePokeSprite(struct Pokemon* mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2); - u8 spriteID = CreateSprite(&gUnknown_02024E8C, 48, 80, 2); - - gPokeblockFeedMonSpecies = species; - gPokeblockFeedMonSpriteID = spriteID; - gPokeblockFeedMonNature = GetNature(mon); - gSprites[spriteID].data[2] = species; - gSprites[spriteID].callback = SpriteCallbackDummy; - gPokeblockMonNotFlipped = 1; - if (!IsPokeSpriteNotFlipped(species)) - { - gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84120EC; - gSprites[spriteID].oam.affineMode = 3; - CalcCenterToCornerVec(&gSprites[spriteID], gSprites[spriteID].oam.shape, gSprites[spriteID].oam.size, gSprites[spriteID].oam.affineMode); - gPokeblockMonNotFlipped = 0; - } - return spriteID; -} - -static void sub_8148044(u8 spriteID) -{ - gSprites[spriteID].pos1.x = 48; - gSprites[spriteID].pos1.y = 80; - gSprites[spriteID].data[0] = -8; - gSprites[spriteID].data[1] = 1; - gSprites[spriteID].callback = sub_8148078; -} - -static void sub_8148078(struct Sprite* sprite) -{ - sprite->pos1.x += 4; - sprite->pos1.y += sprite->data[0]; - sprite->data[0] += sprite->data[1]; - if (sprite->data[0] == 0) - PlayCry1(sprite->data[2], 0); - if (sprite->data[0] == 9) - sprite->callback = SpriteCallbackDummy; -} - -static u8 sub_81480B4(void) -{ - u8 spriteID = sub_810BA50(188, 100, 2); - gSprites[spriteID].oam.affineMode = 1; - gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84121A0; - gSprites[spriteID].callback = SpriteCallbackDummy; - InitSpriteAffineAnim(&gSprites[spriteID]); - return spriteID; -} - -static void sub_8148108(u8 spriteID, bool8 a1) -{ - FreeOamMatrix(gSprites[spriteID].oam.matrixNum); - gSprites[spriteID].oam.affineMode = 3; - if (!a1) - gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84121A4; - else - gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84121A8; - InitSpriteAffineAnim(&gSprites[spriteID]); -} - -static u8 CreatePokeblockSprite(void) -{ - u8 spriteID = CreateSprite(&sThrownPokeblockSpriteTemplate, 174, 84, 1); - gSprites[spriteID].data[0] = -12; - gSprites[spriteID].data[1] = 1; - return spriteID; -} - -static void SpriteCB_ThrownPokeblock(struct Sprite* sprite) -{ - sprite->pos1.x -= 4; - sprite->pos1.y += sprite->data[0]; - sprite->data[0] += sprite->data[1]; - if (sprite->data[0] == 10) - DestroySprite(sprite); -} - -static void sub_81481DC(void) -{ - u8 animID, i; - - gUnknown_03005F34 = 1; - animID = sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][0]; - for (i = 0; i < 8; i++, animID++) - { - gUnknown_03005F34 += sMonPokeblockAnims[animID][4]; - if (sMonPokeblockAnims[animID][9] == 1) - break; - } -} - -static void sub_814825C(void) -{ - switch (gUnknown_03005F3C) - { - case 0: - gUnknown_03005F40 = sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][0]; - gPokeblockFeedPokeSprite = &gSprites[gPokeblockFeedMonSpriteID]; - gPokeblockFeedPokeSpriteCopy = *gPokeblockFeedPokeSprite; - gUnknown_03005F3C = 10; - break; - case 1 ... 9: - break; - case 10: - sub_8148540(); - if (sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][1] != 0) - { - gPokeblockFeedPokeSprite->oam.affineMode = 3; - gPokeblockFeedPokeSprite->oam.matrixNum = 0; - gPokeblockFeedPokeSprite->affineAnims = sSpriteAffineAnimTable_8412050; - InitSpriteAffineAnim(gPokeblockFeedPokeSprite); - } - gUnknown_03005F3C = 50; - case 50: - if (sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][1] != 0) - { - if (gPokeblockMonNotFlipped == 0) - StartSpriteAffineAnim(gPokeblockFeedPokeSprite, sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][1] + 10); - else - StartSpriteAffineAnim(gPokeblockFeedPokeSprite, sNatureToMonPokeblockAnim[gPokeblockFeedMonNature][1]); - } - gUnknown_03005F3C = 60; - break; - case 60: - if (sub_81485CC() == 1) - { - if (gUnknown_03005FA0[9] == 0) - { - gUnknown_03005F40++; - sub_8148540(); - gUnknown_03005F3C = 60; - } - else - { - FreeOamMatrix(gPokeblockFeedPokeSprite->oam.matrixNum); - gUnknown_03005F3C = 70; - } - } - break; - case 70: - FreePokeSpriteMatrix(); - gUnknown_03005F40 = 0; - gUnknown_03005F3C = 0; - break; - case 71 ... 90: - break; - } -} - -static bool8 sub_8148540(void) -{ - u8 i; - for (i = 0; i < 10; i++) - gUnknown_03005FA0[i] = sMonPokeblockAnims[gUnknown_03005F40][i]; - if (gUnknown_03005FA0[4] == 0) - return TRUE; - else - { - gUnknown_03005FA0[10] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2]); - gUnknown_03005FA0[11] = Cos(gUnknown_03005FA0[0], gUnknown_03005FA0[3]); - gUnknown_03005FA0[12] = gUnknown_03005FA0[4]; - gUnknown_03005FA0[13] = gPokeblockFeedPokeSprite->pos2.x; - gUnknown_03005FA0[14] = gPokeblockFeedPokeSprite->pos2.y; - sub_8148710(); - gUnknown_03005FA0[4] = gUnknown_03005FA0[12]; - sub_814862C(); - gUnknown_03005FA0[4] = gUnknown_03005FA0[12]; - return FALSE; - } -} - -static bool8 sub_81485CC(void) -{ - u16 var = gUnknown_03005FA0[12] - gUnknown_03005FA0[4]; - - gPokeblockFeedPokeSprite->pos2.x = ewram1D000_2[var]; - gPokeblockFeedPokeSprite->pos2.y = ewram1D400[var]; - - if (--gUnknown_03005FA0[4] == 0) - return TRUE; - else - return FALSE; -} - -static bool8 FreePokeSpriteMatrix(void) -{ - FreeSpriteOamMatrix(gPokeblockFeedPokeSprite); - return FALSE; -} - -static void sub_814862C(void) -{ - u16 i; - u16 r8 = gUnknown_03005FA0[8]; - u16 r7 = gUnknown_03005FA0[12] - r8; - s16 var3 = gUnknown_03005FA0[13] + gUnknown_03005FA0[6]; - s16 r9 = gUnknown_03005FA0[14] + gUnknown_03005FA0[7]; - - for (i = 0; i < r7 - 1; i++) - { - s16* r3 = &ewram1D000_2[r8 + i]; - s16 r1 = *r3 - (var3); - - s16* r5 = &ewram1D400[r8 + i]; - s16 r4 = *r5 - r9; - - *r3 -= r1 * (i + 1) / r7; - *r5 -= r4 * (i + 1) / r7; - } - - ewram1D000_2[(r8 + r7) - 1] = var3; - ewram1D400[(r8 + r7) - 1] = r9; -} - -void sub_8148710(void) -{ - bool8 var_24 = FALSE; - s16 r8 = gUnknown_03005FA0[13] - gUnknown_03005FA0[10]; - s16 r7 = gUnknown_03005FA0[14] - gUnknown_03005FA0[11]; - while (1) - { - u16 r5; - u16 r4; - u16 var; - - var = abs(gUnknown_03005FA0[5]); - r5 = var + gUnknown_03005FA0[3]; - gUnknown_03005FA0[3] = r5; - - if (gUnknown_03005FA0[2] < 0) - var_24 = TRUE; - - r4 = gUnknown_03005FA0[12] - gUnknown_03005FA0[4]; - - if (gUnknown_03005FA0[4] == 0) - break; - - if (!var_24) - { - ewram1D000_2[r4] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2] + r5 / 256) + r8; - ewram1D400[r4] = Cos(gUnknown_03005FA0[0], gUnknown_03005FA0[3] + r5 / 256) + r7; - } - else - { - ewram1D000_2[r4] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2] - r5 / 256) + r8; - ewram1D400[r4] = Cos(gUnknown_03005FA0[0], gUnknown_03005FA0[3] - r5 / 256) + r7; - } - - gUnknown_03005FA0[0] += gUnknown_03005FA0[1]; - gUnknown_03005FA0[0] &= 0xFF; - gUnknown_03005FA0[4]--; - } -} diff --git a/src/pokemon/pokedex.c b/src/pokemon/pokedex.c deleted file mode 100644 index 090873f9d..000000000 --- a/src/pokemon/pokedex.c +++ /dev/null @@ -1,5519 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "pokedex.h" -#include "battle.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "graphics.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "menu_cursor.h" -#include "palette.h" -#include "pokedex_area_screen.h" -#include "pokedex_cry_screen.h" -#include "pokemon.h" -#include "random.h" -#include "overworld.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "trig.h" -#include "scanline_effect.h" -#include "ewram.h" - -#define NATIONAL_DEX_COUNT 386 - -struct PokedexListItem -{ - u16 dexNum; - u16 seen:1; - u16 owned:1; -}; - -struct PokedexView -{ - struct PokedexListItem unk0[NATIONAL_DEX_COUNT]; - u16 unk608; - u8 unk60A_1:1; - u8 unk60A_2:1; - u8 unk60B; - u16 pokemonListCount; - u16 selectedPokemon; - u16 unk610; - u16 dexMode; - u16 unk614; - u16 dexOrder; - u16 unk618; - u16 unk61A; - u16 unk61C; - u16 unk61E[4]; - u16 selectedMonSpriteId; - u16 unk628; - u16 unk62A; - u8 unk62C; - u8 unk62D; - u8 unk62E; - u8 unk62F; - s16 unk630; - s16 unk632; - u16 unk634; - u16 unk636; - u16 unk638; - u16 unk63A[4]; - u8 filler642[8]; - u8 unk64A; - u8 unk64B; - u8 unk64C_1:1; - u8 selectedScreen; - u8 descriptionPageNum; - u8 unk64F; - u8 menuIsOpen; //menuIsOpen - u8 unk651; - u16 menuCursorPos; //Menu cursor position - s16 menuY; //Menu Y position (inverted because we use REG_BG0VOFS for this) - u8 unk656[8]; - u8 unk65E[8]; -}; - -enum -{ - DEX_MODE_HOENN, - DEX_MODE_NATIONAL -}; - -enum -{ - PAGE_SCREEN, - AREA_SCREEN, - CRY_SCREEN, - SIZE_SCREEN -}; - -struct PokedexEntry -{ - /*0x00*/ u8 categoryName[12]; - /*0x0C*/ u16 height; //in decimeters - /*0x0E*/ u16 weight; //in hectograms - /*0x10*/ const u8 *descriptionPage1; - /*0x14*/ const u8 *descriptionPage2; - /*0x18*/ u16 unused; - /*0x1A*/ u16 pokemonScale; - /*0x1C*/ u16 pokemonOffset; - /*0x1E*/ u16 trainerScale; - /*0x20*/ u16 trainerOffset; -}; /*size = 0x24*/ - -struct UnknownStruct2 -{ - const u8 *text1; - const u8 *text2; -}; - -struct UnknownStruct1 -{ - const struct UnknownStruct2 *unk0; - u8 unk4; - u8 unk5; - u16 unk6; -}; - -struct UnknownStruct3 -{ - const u8 *text; - u8 unk4; - u8 unk5; - u8 unk6; -}; - -struct UnknownStruct4 -{ - const u8 *text; - u8 unk4; - u8 unk5; - u8 unk6; - u8 unk7; - u8 unk8; - u8 unk9; -}; - -extern struct MusicPlayerInfo gMPlay_BGM; -extern u8 gReservedSpritePaletteCount; -extern struct SpriteTemplate gUnknown_02024E8C; -extern u8 gUnknown_03005E98; -extern const u8 gPokedexMenu_Gfx[]; -extern const u8 gUnknown_08E96738[]; -extern const u8 gUnknown_08E96888[]; -extern const u8 gUnknown_08E96994[]; -extern const u8 gUnknown_08E9C6DC[]; -extern const u8 gUnknown_08E96BD4[]; -extern const u8 gUnknown_08E96ACC[]; -extern const u8 gUnknown_08E96B58[]; -extern const u16 gPokedexMenu_Pal[]; -extern const u16 gPokedexMenu2_Pal[]; -extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; -extern const struct MonCoords gTrainerFrontPicCoords[]; -extern const struct PokedexEntry gPokedexEntries[]; -extern const u8 gPokedexMenuSearch_Gfx[]; -extern const u8 gUnknown_08E96D2C[]; -extern const u16 gPokedexMenuSearch_Pal[]; -extern const u8 gTypeNames[][7]; -extern const u8 gPokedexMenu2_Gfx[]; - -static EWRAM_DATA struct PokedexView *gPokedexView = NULL; -static EWRAM_DATA u16 gUnknown_0202FFB8 = 0; -static EWRAM_DATA u8 gUnknown_0202FFBA = 0; -static EWRAM_DATA struct PokedexListItem *gUnknown_0202FFBC = NULL; - -u8 gUnknown_03005CE8; -IntrCallback gUnknown_03005CEC; - -static u8 sub_8091E3C(void); - -static const u16 sPokedexSearchPalette[] = INCBIN_U16("graphics/pokedex/search.gbapal"); -static const u16 sNationalPokedexPalette[] = INCBIN_U16("graphics/pokedex/national.gbapal"); -const u8 gEmptySpacce_839F7FC[0xA4] = {0}; -static const u8 gUnknown_0839F8A0[] = INCBIN_U8("graphics/pokedex/pokedex_cry_layout.bin.lz"); -static const u8 gUnknown_0839F988[] = INCBIN_U8("graphics/pokedex/pokedex_size_layout.bin.lz"); -#if ENGLISH -static const u8 gUnknown_0839FA7C[] = INCBIN_U8("graphics/pokedex/noball.4bpp.lz"); -#elif GERMAN -extern const u8 gUnknown_0839FA7C[]; -#endif - -#include "../data/pokedex_orders.h" -static const struct OamData gOamData_83A0404 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A040C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A0414 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A041C = -{ - .y = 160, - .affineMode = 0, - .objMode = 2, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A0424 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_83A042C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 2, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_83A0434[] = -{ - ANIMCMD_FRAME(3, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A043C[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0444[] = -{ - ANIMCMD_FRAME(16, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A044C[] = -{ - ANIMCMD_FRAME(32, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0454[] = -{ - ANIMCMD_FRAME(64, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A045C[] = -{ - ANIMCMD_FRAME(96, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0464[] = -{ - ANIMCMD_FRAME(128, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A046C[] = -{ - ANIMCMD_FRAME(160, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0474[] = -{ - ANIMCMD_FRAME(192, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A047C[] = -{ - ANIMCMD_FRAME(224, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0484[] = -{ - ANIMCMD_FRAME(226, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A048C[] = -{ - ANIMCMD_FRAME(228, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A0494[] = -{ - ANIMCMD_FRAME(230, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A049C[] = -{ - ANIMCMD_FRAME(232, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04A4[] = -{ - ANIMCMD_FRAME(234, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04AC[] = -{ - ANIMCMD_FRAME(236, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04B4[] = -{ - ANIMCMD_FRAME(238, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04BC[] = -{ - ANIMCMD_FRAME(240, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04C4[] = -{ - ANIMCMD_FRAME(242, 30), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_83A04CC[] = -{ - ANIMCMD_FRAME(4, 30), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04D4[] = -{ - gSpriteAnim_83A0434, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04D8[] = -{ - gSpriteAnim_83A043C, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04DC[] = -{ - gSpriteAnim_83A0444, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04E0[] = -{ - gSpriteAnim_83A044C, - gSpriteAnim_83A0454, - gSpriteAnim_83A045C, - gSpriteAnim_83A0464, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04F0[] = -{ - gSpriteAnim_83A046C, - gSpriteAnim_83A0474, -}; -static const union AnimCmd *const gSpriteAnimTable_83A04F8[] = -{ - gSpriteAnim_83A047C, - gSpriteAnim_83A0484, - gSpriteAnim_83A048C, - gSpriteAnim_83A0494, - gSpriteAnim_83A049C, - gSpriteAnim_83A04A4, - gSpriteAnim_83A04AC, - gSpriteAnim_83A04B4, - gSpriteAnim_83A04BC, - gSpriteAnim_83A04C4, -}; -static const union AnimCmd *const gSpriteAnimTable_83A0520[] = -{ - gSpriteAnim_83A04CC, -}; -static void sub_808EF38(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A0524 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A0404, - .anims = gSpriteAnimTable_83A04D4, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808EF38, -}; -static void sub_808EF8C(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A053C = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A040C, - .anims = gSpriteAnimTable_83A04D8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808EF8C, -}; -static void sub_808F08C(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A0554 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A0414, - .anims = gSpriteAnimTable_83A04E0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808F08C, -}; -static void sub_808F0B4(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A056C = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A041C, - .anims = gSpriteAnimTable_83A04DC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808F0B4, -}; -static void sub_808ED94(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A0584 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A0424, - .anims = gSpriteAnimTable_83A04F0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808ED94, -}; -static const struct SpriteTemplate gSpriteTemplate_83A059C = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A042C, - .anims = gSpriteAnimTable_83A04F8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808ED94, -}; -static void sub_808F168(struct Sprite *); -static const struct SpriteTemplate gSpriteTemplate_83A05B4 = -{ - .tileTag = 4096, - .paletteTag = 4096, - .oam = &gOamData_83A042C, - .anims = gSpriteAnimTable_83A0520, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_808F168, -}; -static const struct CompressedSpriteSheet gUnknown_083A05CC[] = -{ - {gPokedexMenu2_Gfx, 0x1F00, 0x1000}, - {NULL, 0, 0}, -}; -static const struct SpritePalette gUnknown_083A05DC[] = -{ - {gPokedexMenu_Pal, 0x1000}, - {NULL, 0}, -}; -static const u8 gUnknown_083A05EC[] = {2, 4, 8, 16, 32}; -static const u8 gUnknown_083A05F1[] = {16, 8, 4, 2, 1}; -const u8 gEmptySpacce_83A05F6[] = {0, 0}; // Padding, maybe? -static const u8 gUnknown_083A05F8[] = _(""); -#if ENGLISH -#include "../data/pokedex_entries_en.h" -#elif GERMAN -#include "../data/pokedex_entries_de.h" -#endif -static const u16 gUnknown_083B4EC4[16] = {0}; -static const u8 *const sMonFootprintTable[] = -{ - gMonFootprint_Bulbasaur, - gMonFootprint_Bulbasaur, - gMonFootprint_Ivysaur, - gMonFootprint_Venusaur, - gMonFootprint_Charmander, - gMonFootprint_Charmeleon, - gMonFootprint_Charizard, - gMonFootprint_Squirtle, - gMonFootprint_Wartortle, - gMonFootprint_Blastoise, - gMonFootprint_Caterpie, - gMonFootprint_Metapod, - gMonFootprint_Butterfree, - gMonFootprint_Weedle, - gMonFootprint_Kakuna, - gMonFootprint_Beedrill, - gMonFootprint_Pidgey, - gMonFootprint_Pidgeotto, - gMonFootprint_Pidgeot, - gMonFootprint_Rattata, - gMonFootprint_Raticate, - gMonFootprint_Spearow, - gMonFootprint_Fearow, - gMonFootprint_Ekans, - gMonFootprint_Arbok, - gMonFootprint_Pikachu, - gMonFootprint_Raichu, - gMonFootprint_Sandshrew, - gMonFootprint_Sandslash, - gMonFootprint_NidoranF, - gMonFootprint_Nidorina, - gMonFootprint_Nidoqueen, - gMonFootprint_NidoranM, - gMonFootprint_Nidorino, - gMonFootprint_Nidoking, - gMonFootprint_Clefairy, - gMonFootprint_Clefable, - gMonFootprint_Vulpix, - gMonFootprint_Ninetales, - gMonFootprint_Jigglypuff, - gMonFootprint_Wigglytuff, - gMonFootprint_Zubat, - gMonFootprint_Golbat, - gMonFootprint_Oddish, - gMonFootprint_Gloom, - gMonFootprint_Vileplume, - gMonFootprint_Paras, - gMonFootprint_Parasect, - gMonFootprint_Venonat, - gMonFootprint_Venomoth, - gMonFootprint_Diglett, - gMonFootprint_Dugtrio, - gMonFootprint_Meowth, - gMonFootprint_Persian, - gMonFootprint_Psyduck, - gMonFootprint_Golduck, - gMonFootprint_Mankey, - gMonFootprint_Primeape, - gMonFootprint_Growlithe, - gMonFootprint_Arcanine, - gMonFootprint_Poliwag, - gMonFootprint_Poliwhirl, - gMonFootprint_Poliwrath, - gMonFootprint_Abra, - gMonFootprint_Kadabra, - gMonFootprint_Alakazam, - gMonFootprint_Machop, - gMonFootprint_Machoke, - gMonFootprint_Machamp, - gMonFootprint_Bellsprout, - gMonFootprint_Weepinbell, - gMonFootprint_Victreebel, - gMonFootprint_Tentacool, - gMonFootprint_Tentacruel, - gMonFootprint_Geodude, - gMonFootprint_Graveler, - gMonFootprint_Golem, - gMonFootprint_Ponyta, - gMonFootprint_Rapidash, - gMonFootprint_Slowpoke, - gMonFootprint_Slowbro, - gMonFootprint_Magnemite, - gMonFootprint_Magneton, - gMonFootprint_Farfetchd, - gMonFootprint_Doduo, - gMonFootprint_Dodrio, - gMonFootprint_Seel, - gMonFootprint_Dewgong, - gMonFootprint_Grimer, - gMonFootprint_Muk, - gMonFootprint_Shellder, - gMonFootprint_Cloyster, - gMonFootprint_Gastly, - gMonFootprint_Haunter, - gMonFootprint_Gengar, - gMonFootprint_Onix, - gMonFootprint_Drowzee, - gMonFootprint_Hypno, - gMonFootprint_Krabby, - gMonFootprint_Kingler, - gMonFootprint_Voltorb, - gMonFootprint_Electrode, - gMonFootprint_Exeggcute, - gMonFootprint_Exeggutor, - gMonFootprint_Cubone, - gMonFootprint_Marowak, - gMonFootprint_Hitmonlee, - gMonFootprint_Hitmonchan, - gMonFootprint_Lickitung, - gMonFootprint_Koffing, - gMonFootprint_Weezing, - gMonFootprint_Rhyhorn, - gMonFootprint_Rhydon, - gMonFootprint_Chansey, - gMonFootprint_Tangela, - gMonFootprint_Kangaskhan, - gMonFootprint_Horsea, - gMonFootprint_Seadra, - gMonFootprint_Goldeen, - gMonFootprint_Seaking, - gMonFootprint_Staryu, - gMonFootprint_Starmie, - gMonFootprint_Mrmime, - gMonFootprint_Scyther, - gMonFootprint_Jynx, - gMonFootprint_Electabuzz, - gMonFootprint_Magmar, - gMonFootprint_Pinsir, - gMonFootprint_Tauros, - gMonFootprint_Magikarp, - gMonFootprint_Gyarados, - gMonFootprint_Lapras, - gMonFootprint_Ditto, - gMonFootprint_Eevee, - gMonFootprint_Vaporeon, - gMonFootprint_Jolteon, - gMonFootprint_Flareon, - gMonFootprint_Porygon, - gMonFootprint_Omanyte, - gMonFootprint_Omastar, - gMonFootprint_Kabuto, - gMonFootprint_Kabutops, - gMonFootprint_Aerodactyl, - gMonFootprint_Snorlax, - gMonFootprint_Articuno, - gMonFootprint_Zapdos, - gMonFootprint_Moltres, - gMonFootprint_Dratini, - gMonFootprint_Dragonair, - gMonFootprint_Dragonite, - gMonFootprint_Mewtwo, - gMonFootprint_Mew, - gMonFootprint_Chikorita, - gMonFootprint_Bayleef, - gMonFootprint_Meganium, - gMonFootprint_Cyndaquil, - gMonFootprint_Quilava, - gMonFootprint_Typhlosion, - gMonFootprint_Totodile, - gMonFootprint_Croconaw, - gMonFootprint_Feraligatr, - gMonFootprint_Sentret, - gMonFootprint_Furret, - gMonFootprint_Hoothoot, - gMonFootprint_Noctowl, - gMonFootprint_Ledyba, - gMonFootprint_Ledian, - gMonFootprint_Spinarak, - gMonFootprint_Ariados, - gMonFootprint_Crobat, - gMonFootprint_Chinchou, - gMonFootprint_Lanturn, - gMonFootprint_Pichu, - gMonFootprint_Cleffa, - gMonFootprint_Igglybuff, - gMonFootprint_Togepi, - gMonFootprint_Togetic, - gMonFootprint_Natu, - gMonFootprint_Xatu, - gMonFootprint_Mareep, - gMonFootprint_Flaaffy, - gMonFootprint_Ampharos, - gMonFootprint_Bellossom, - gMonFootprint_Marill, - gMonFootprint_Azumarill, - gMonFootprint_Sudowoodo, - gMonFootprint_Politoed, - gMonFootprint_Hoppip, - gMonFootprint_Skiploom, - gMonFootprint_Jumpluff, - gMonFootprint_Aipom, - gMonFootprint_Sunkern, - gMonFootprint_Sunflora, - gMonFootprint_Yanma, - gMonFootprint_Wooper, - gMonFootprint_Quagsire, - gMonFootprint_Espeon, - gMonFootprint_Umbreon, - gMonFootprint_Murkrow, - gMonFootprint_Slowking, - gMonFootprint_Misdreavus, - gMonFootprint_Unown, - gMonFootprint_Wobbuffet, - gMonFootprint_Girafarig, - gMonFootprint_Pineco, - gMonFootprint_Forretress, - gMonFootprint_Dunsparce, - gMonFootprint_Gligar, - gMonFootprint_Steelix, - gMonFootprint_Snubbull, - gMonFootprint_Granbull, - gMonFootprint_Qwilfish, - gMonFootprint_Scizor, - gMonFootprint_Shuckle, - gMonFootprint_Heracross, - gMonFootprint_Sneasel, - gMonFootprint_Teddiursa, - gMonFootprint_Ursaring, - gMonFootprint_Slugma, - gMonFootprint_Magcargo, - gMonFootprint_Swinub, - gMonFootprint_Piloswine, - gMonFootprint_Corsola, - gMonFootprint_Remoraid, - gMonFootprint_Octillery, - gMonFootprint_Delibird, - gMonFootprint_Mantine, - gMonFootprint_Skarmory, - gMonFootprint_Houndour, - gMonFootprint_Houndoom, - gMonFootprint_Kingdra, - gMonFootprint_Phanpy, - gMonFootprint_Donphan, - gMonFootprint_Porygon2, - gMonFootprint_Stantler, - gMonFootprint_Smeargle, - gMonFootprint_Tyrogue, - gMonFootprint_Hitmontop, - gMonFootprint_Smoochum, - gMonFootprint_Elekid, - gMonFootprint_Magby, - gMonFootprint_Miltank, - gMonFootprint_Blissey, - gMonFootprint_Raikou, - gMonFootprint_Entei, - gMonFootprint_Suicune, - gMonFootprint_Larvitar, - gMonFootprint_Pupitar, - gMonFootprint_Tyranitar, - gMonFootprint_Lugia, - gMonFootprint_HoOh, - gMonFootprint_Celebi, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_QuestionMark, - gMonFootprint_Treecko, - gMonFootprint_Grovyle, - gMonFootprint_Sceptile, - gMonFootprint_Torchic, - gMonFootprint_Combusken, - gMonFootprint_Blaziken, - gMonFootprint_Mudkip, - gMonFootprint_Marshtomp, - gMonFootprint_Swampert, - gMonFootprint_Poochyena, - gMonFootprint_Mightyena, - gMonFootprint_Zigzagoon, - gMonFootprint_Linoone, - gMonFootprint_Wurmple, - gMonFootprint_Silcoon, - gMonFootprint_Beautifly, - gMonFootprint_Cascoon, - gMonFootprint_Dustox, - gMonFootprint_Lotad, - gMonFootprint_Lombre, - gMonFootprint_Ludicolo, - gMonFootprint_Seedot, - gMonFootprint_Nuzleaf, - gMonFootprint_Shiftry, - gMonFootprint_Nincada, - gMonFootprint_Ninjask, - gMonFootprint_Shedinja, - gMonFootprint_Taillow, - gMonFootprint_Swellow, - gMonFootprint_Shroomish, - gMonFootprint_Breloom, - gMonFootprint_Spinda, - gMonFootprint_Wingull, - gMonFootprint_Pelipper, - gMonFootprint_Surskit, - gMonFootprint_Masquerain, - gMonFootprint_Wailmer, - gMonFootprint_Wailord, - gMonFootprint_Skitty, - gMonFootprint_Delcatty, - gMonFootprint_Kecleon, - gMonFootprint_Baltoy, - gMonFootprint_Claydol, - gMonFootprint_Nosepass, - gMonFootprint_Torkoal, - gMonFootprint_Sableye, - gMonFootprint_Barboach, - gMonFootprint_Whiscash, - gMonFootprint_Luvdisc, - gMonFootprint_Corphish, - gMonFootprint_Crawdaunt, - gMonFootprint_Feebas, - gMonFootprint_Milotic, - gMonFootprint_Carvanha, - gMonFootprint_Sharpedo, - gMonFootprint_Trapinch, - gMonFootprint_Vibrava, - gMonFootprint_Flygon, - gMonFootprint_Makuhita, - gMonFootprint_Hariyama, - gMonFootprint_Electrike, - gMonFootprint_Manectric, - gMonFootprint_Numel, - gMonFootprint_Camerupt, - gMonFootprint_Spheal, - gMonFootprint_Sealeo, - gMonFootprint_Walrein, - gMonFootprint_Cacnea, - gMonFootprint_Cacturne, - gMonFootprint_Snorunt, - gMonFootprint_Glalie, - gMonFootprint_Lunatone, - gMonFootprint_Solrock, - gMonFootprint_Azurill, - gMonFootprint_Spoink, - gMonFootprint_Grumpig, - gMonFootprint_Plusle, - gMonFootprint_Minun, - gMonFootprint_Mawile, - gMonFootprint_Meditite, - gMonFootprint_Medicham, - gMonFootprint_Swablu, - gMonFootprint_Altaria, - gMonFootprint_Wynaut, - gMonFootprint_Duskull, - gMonFootprint_Dusclops, - gMonFootprint_Roselia, - gMonFootprint_Slakoth, - gMonFootprint_Vigoroth, - gMonFootprint_Slaking, - gMonFootprint_Gulpin, - gMonFootprint_Swalot, - gMonFootprint_Tropius, - gMonFootprint_Whismur, - gMonFootprint_Loudred, - gMonFootprint_Exploud, - gMonFootprint_Clamperl, - gMonFootprint_Huntail, - gMonFootprint_Gorebyss, - gMonFootprint_Absol, - gMonFootprint_Shuppet, - gMonFootprint_Banette, - gMonFootprint_Seviper, - gMonFootprint_Zangoose, - gMonFootprint_Relicanth, - gMonFootprint_Aron, - gMonFootprint_Lairon, - gMonFootprint_Aggron, - gMonFootprint_Castform, - gMonFootprint_Volbeat, - gMonFootprint_Illumise, - gMonFootprint_Lileep, - gMonFootprint_Cradily, - gMonFootprint_Anorith, - gMonFootprint_Armaldo, - gMonFootprint_Ralts, - gMonFootprint_Kirlia, - gMonFootprint_Gardevoir, - gMonFootprint_Bagon, - gMonFootprint_Shelgon, - gMonFootprint_Salamence, - gMonFootprint_Beldum, - gMonFootprint_Metang, - gMonFootprint_Metagross, - gMonFootprint_Regirock, - gMonFootprint_Regice, - gMonFootprint_Registeel, - gMonFootprint_Kyogre, - gMonFootprint_Groudon, - gMonFootprint_Rayquaza, - gMonFootprint_Latias, - gMonFootprint_Latios, - gMonFootprint_Jirachi, - gMonFootprint_Deoxys, - gMonFootprint_Chimecho, - gMonFootprint_Bulbasaur, -}; -static const u8 gUnknown_083B5558[] = _("{CLEAR_TO 0}"); -const u8 gUnknown_083B555C[] = INCBIN_U8("graphics/unknown/unknown_3B555C.bin"); -static const struct OamData gOamData_83B557C = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static void *const gUnknown_083B5584[] = -{ - ePokedexPalAddr1, - ePokedexPalAddr2, - ePokedexPalAddr3, - ePokedexPalAddr4, -}; -static const struct SpriteFrameImage gSpriteImageTable_83B5594[] = -{ - {ewram8000, 0x800}, - {ewram8800, 0x800}, - {ewram9000, 0x800}, - {ewram9800, 0x800}, - {ewramA000, 0x800}, - {ewramA800, 0x800}, - {ewramB000, 0x800}, - {ewramB800, 0x800}, - {ewramC000, 0x800}, - {ewramC800, 0x800}, - {ewramD000, 0x800}, - {ewramD800, 0x800}, - {ewramE000, 0x800}, - {ewramE800, 0x800}, - {ewramF000, 0x800}, - {ewramF800, 0x800}, -}; -static const struct SpriteFrameImage gSpriteImageTable_83B5614[] = -{ - {ewramC000, 0x800}, - {ewramC800, 0x800}, - {ewramD000, 0x800}, - {ewramD800, 0x800}, - {ewramE000, 0x800}, - {ewramE800, 0x800}, - {ewramF000, 0x800}, - {ewramF800, 0x800}, - {ewram10000, 0x800}, - {ewram10800, 0x800}, - {ewram11000, 0x800}, - {ewram11800, 0x800}, - {ewram12000, 0x800}, - {ewram12800, 0x800}, - {ewram13000, 0x800}, - {ewram13800, 0x800}, -}; -static const struct SpriteFrameImage gSpriteImageTable_83B5694[] = -{ - {ewram10000, 0x800}, - {ewram10800, 0x800}, - {ewram11000, 0x800}, - {ewram11800, 0x800}, - {ewram12000, 0x800}, - {ewram12800, 0x800}, - {ewram13000, 0x800}, - {ewram13800, 0x800}, - {ewram14000, 0x800}, - {ewram14800, 0x800}, - {ewram15000, 0x800}, - {ewram15800, 0x800}, - {ewram16000_2, 0x800}, - {ewram16800, 0x800}, - {ewram17000, 0x800}, - {ewram17800_2, 0x800}, -}; -static const struct SpriteFrameImage gSpriteImageTable_83B5714[] = -{ - {ewram14000, 0x800}, - {ewram14800, 0x800}, - {ewram15000, 0x800}, - {ewram15800, 0x800}, - {ewram16000_2, 0x800}, - {ewram16800, 0x800}, - {ewram17000, 0x800}, - {ewram17800_2, 0x800}, - {ewram18000_2, 0x800}, - {ewram18800, 0x800}, - {ewram19000, 0x800}, - {ewram19800, 0x800}, - {ewram1A000, 0x800}, - {ewram1A800, 0x800}, - {ewram1B000_2, 0x800}, - {ewram1B800, 0x800}, -}; -static const struct SpriteFrameImage *const gUnknown_083B5794[] = -{ - gSpriteImageTable_83B5594, - gSpriteImageTable_83B5614, - gSpriteImageTable_83B5694, - gSpriteImageTable_83B5714, -}; -static void nullsub_59(struct Sprite *); -static const struct SpriteTemplate gUnknown_083B57A4 = -{ - .tileTag = 0xFFFF, - .paletteTag = 0, - .oam = &gOamData_83B557C, - .anims = NULL, - .images = gSpriteImageTable_83B5594, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_59, -}; -static const u8 gUnknown_083B57BC[][4] = -{ - {0, 0, 0, 0}, - {CHAR_A, 3, CHAR_a, 3}, - {CHAR_D, 3, CHAR_d, 3}, - {CHAR_G, 3, CHAR_g, 3}, - {CHAR_J, 3, CHAR_j, 3}, - {CHAR_M, 3, CHAR_m, 3}, - {CHAR_P, 3, CHAR_p, 3}, - {CHAR_S, 3, CHAR_s, 3}, - {CHAR_V, 3, CHAR_v, 3}, - {CHAR_Y, 2, CHAR_y, 2}, -}; -static const struct UnknownStruct3 gUnknown_083B57E4[] = -{ - {DexText_SearchForPoke, 0, 0, 5}, - {DexText_SwitchDex, 6, 0, 5}, - {DexText_ReturnToDex, 12, 0, 5}, -}; -static const struct UnknownStruct4 gUnknown_083B57FC[] = -{ - {DexText_ListByABC, 0, 2, 5, 5, 2, 12}, - {DexText_ListByColor, 0, 4, 5, 5, 4, 12}, - {DexText_ListByType, 0, 6, 5, 5, 6, 6}, - {DexText_ListByType, 0, 6, 5, 11, 6, 6}, - {DexText_SelectDexList, 0, 8, 5, 5, 8, 12}, - {DexText_SelectDexMode, 0, 10, 5, 5, 10, 12}, - {DexText_ExecuteSearchSwitch, 0, 12, 5, 0, 0, 0}, -}; -static const u8 gUnknown_083B5850[][4] = -{ - {0xFF, 0xFF, 0xFF, 1}, - {0xFF, 0xFF, 0, 2}, - {0xFF, 3, 1, 4}, - { 2, 0xFF, 1, 4}, - {0xFF, 0xFF, 2, 5}, - {0xFF, 0xFF, 4, 6}, - {0xFF, 0xFF, 5, 0xFF}, -}; -static const u8 gUnknown_083B586C[][4] = -{ - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 5}, - {0xFF, 0xFF, 4, 6}, - {0xFF, 0xFF, 5, 0xFF}, -}; -static const u8 gUnknown_083B5888[][4] = -{ - {0xFF, 0xFF, 0xFF, 1}, - {0xFF, 0xFF, 0, 2}, - {0xFF, 3, 1, 4}, - { 2, 0xFF, 1, 4}, - {0xFF, 0xFF, 2, 6}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 4, 0xFF}, -}; -static const u8 gUnknown_083B58A4[][4] = -{ - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 0xFF, 6}, - {0xFF, 0xFF, 0xFF, 0xFF}, - {0xFF, 0xFF, 4, 0xFF}, -}; -static const struct UnknownStruct2 gUnknown_083B58C0[] = -{ - {DexText_HoennDex2, DexText_HoennDex}, - {DexText_NationalDex2, DexText_NationalDex}, - {NULL, NULL}, -}; -static const struct UnknownStruct2 gUnknown_083B58D8[] = -{ - {DexText_ListByNumber, DexText_NumericalMode}, - {DexText_ListByABC2, DexText_ABCMode}, - {DexText_ListByHeavyToLightest, DexText_HeaviestMode}, - {DexText_ListByLightToHeaviest, DexText_LightestMode}, - {DexText_ListByTallToSmallest, DexText_TallestMode}, - {DexText_ListBySmallToTallest, DexText_SmallestMode}, - {NULL, NULL}, -}; -static const struct UnknownStruct2 gUnknown_083B5910[] = -{ - {DexText_Terminator5, DexText_DontSpecify}, - {DexText_Terminator5, DexText_ABC}, - {DexText_Terminator5, DexText_DEF}, - {DexText_Terminator5, DexText_GHI}, - {DexText_Terminator5, DexText_JKL}, - {DexText_Terminator5, DexText_MNO}, - {DexText_Terminator5, DexText_PQR}, - {DexText_Terminator5, DexText_STU}, - {DexText_Terminator5, DexText_VWX}, - {DexText_Terminator5, DexText_YZ}, - {NULL, NULL}, -}; -static const struct UnknownStruct2 gUnknown_083B5968[] = -{ - {DexText_Terminator5, DexText_DontSpecify}, - {DexText_Terminator5, DexText_Red}, - {DexText_Terminator5, DexText_Blue}, - {DexText_Terminator5, DexText_Yellow}, - {DexText_Terminator5, DexText_Green}, - {DexText_Terminator5, DexText_Black}, - {DexText_Terminator5, DexText_Brown}, - {DexText_Terminator5, DexText_Purple}, - {DexText_Terminator5, DexText_Gray}, - {DexText_Terminator5, DexText_White}, - {DexText_Terminator5, DexText_Pink}, - {NULL, NULL}, -}; -static const struct UnknownStruct2 gUnknown_083B59C8[] = -{ - {DexText_Terminator5, DexText_None}, - {DexText_Terminator5, gTypeNames[TYPE_NORMAL]}, - {DexText_Terminator5, gTypeNames[TYPE_FIGHTING]}, - {DexText_Terminator5, gTypeNames[TYPE_FLYING]}, - {DexText_Terminator5, gTypeNames[TYPE_POISON]}, - {DexText_Terminator5, gTypeNames[TYPE_GROUND]}, - {DexText_Terminator5, gTypeNames[TYPE_ROCK]}, - {DexText_Terminator5, gTypeNames[TYPE_BUG]}, - {DexText_Terminator5, gTypeNames[TYPE_GHOST]}, - {DexText_Terminator5, gTypeNames[TYPE_STEEL]}, - {DexText_Terminator5, gTypeNames[TYPE_FIRE]}, - {DexText_Terminator5, gTypeNames[TYPE_WATER]}, - {DexText_Terminator5, gTypeNames[TYPE_GRASS]}, - {DexText_Terminator5, gTypeNames[TYPE_ELECTRIC]}, - {DexText_Terminator5, gTypeNames[TYPE_PSYCHIC]}, - {DexText_Terminator5, gTypeNames[TYPE_ICE]}, - {DexText_Terminator5, gTypeNames[TYPE_DRAGON]}, - {DexText_Terminator5, gTypeNames[TYPE_DARK]}, - {NULL, NULL}, -}; -static const u8 gUnknown_083B5A60[] = {0, 1}; -static const u8 gUnknown_083B5A62[] = {0, 1, 2, 3, 4, 5}; -static const u8 gUnknown_083B5A68[] = {0xFF, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17}; -static const struct UnknownStruct1 gUnknown_083B5A7C[] = -{ - {gUnknown_083B5910, 6, 7, 10}, - {gUnknown_083B5968, 8, 9, 11}, - {gUnknown_083B59C8, 10, 11, 18}, - {gUnknown_083B59C8, 12, 13, 18}, - {gUnknown_083B58D8, 4, 5, 6}, - {gUnknown_083B58C0, 2, 3, 2}, -}; -static const u8 gUnknown_083B5AAC[] = _("{STR_VAR_1}{CLEAR_TO 43}"); -static const u8 gUnknown_083B5AB2[] = _("{STR_VAR_1}{CLEAR_TO 96}"); - -static void MainCB(void); -static void Task_PokedexShowMainScreen(u8 taskId); -static void Task_PokedexMainScreen(u8 taskId); -static void sub_808C898(u8 taskId); -static void Task_PokedexMainScreenMenu(u8 taskId); -static void sub_808CA64(u8 taskId); -static void sub_808CAE4(u8 taskId); -static void sub_808CB8C(u8 taskId); -static void Task_ClosePokedex(u8 taskId); -static void sub_808CCC4(u8 taskId); -static void Task_PokedexResultsScreen(u8 taskId); -static void sub_808CEF8(u8 taskId); -static void Task_PokedexResultsScreenMenu(u8 taskId); -static void sub_808D118(u8 taskId); -static void sub_808D198(u8 taskId); -static void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId); -static void Task_PokedexResultsScreenExitPokedex(u8 taskId); -static bool8 sub_808D344(u8 a); -static void sub_808D640(void); -static void SortPokedex(u8 dexMode, u8 sortMode); -static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d); -static void sub_808DF88(u16 a, u8 b, u8 c, u16 d); -static u8 sub_808DFE4(u16 num, u8 b, u8 c); -static void sub_808E090(u8 a, u8 b, u16 c); -static void sub_808E0CC(u16 a, u16 b); -static bool8 sub_808E208(u8 a, u8 b, u8 c); -static u16 sub_808E48C(u16 a, u16 b); -static void sub_808E6BC(void); -static u8 sub_808E71C(void); -static u8 sub_808E82C(void); -static u16 sub_808E888(u16 a1); -static u32 sub_808E8C8(u16 a, s16 b, s16 c); -static void sub_808E978(u8 a); -static void sub_808EDB8(struct Sprite *sprite); -static void sub_808EE28(struct Sprite *sprite); -static u8 sub_808F210(struct PokedexListItem *, u8); -static bool8 sub_808F250(u8 taskId); -static u8 sub_808F284(struct PokedexListItem *, u8); -static void Task_InitPageScreenMultistep(u8 taskId); -static void Task_PageScreenProcessInput(u8 taskId); -static void sub_808F888(u8 taskId); -static void Task_ClosePageScreen(u8 taskId); -static void Task_InitAreaScreenMultistep(u8 taskId); -static void Task_AreaScreenProcessInput(u8 taskId); -static void sub_808FA00(u8 taskId); -static void Task_InitCryScreenMultistep(u8 taskId); -static void Task_CryScreenProcessInput(u8 taskId); -static void sub_808FFBC(u8 taskId); -static void sub_8090040(u8 a); -static void Task_InitSizeScreenMultistep(u8 taskId); -static void Task_SizeScreenProcessInput(u8 taskId); -static void sub_8090498(u8 taskId); -static void sub_80904FC(u16 a); -static void sub_8090540(u16 a); -static void sub_8090584(u8 a, u16 b); -static void sub_8090644(u8 a, u16 b); -static void sub_8090750(u8); -static void sub_8090A3C(u8); -static void sub_8090B8C(u8); -static void sub_8090C28(struct Sprite *); -static void sub_8090C68(void); -static void sub_8091060(u16); -static void sub_8091154(u16 order, u8, u8); -static u8 sub_80911C8(u16 num, u8, u8); -static u8 sub_8091260(u16 num, u8, u8, u8); -static void sub_8091304(const u8 *name, u8, u8); -static void sub_8091458(u16 height, u8 i, u8 i1); -static void sub_8091564(u16 weight, u8 i, u8 i1); -void sub_8091738(u16, u16, u16); -static void sub_80917CC(u16 i, u16 i1); -static u16 sub_8091818(u8, u16, u16, u16); -u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d); -u8 sub_8091A4C(u16 gender, s16, s16, u16); -static void sub_8091E54(u8); -static void sub_809204C(u8); -static void sub_809207C(u8); -static void sub_809217C(u8); -static void sub_80921B0(u8); -static void sub_80923FC(u8); -static void sub_80924A4(u8); -static void sub_8092508(u8); -static void sub_80925CC(u8); -static void sub_8092644(u8); -static void sub_80927B8(u8); -static void sub_80927F0(u8); -static void sub_8092AB0(u8); -static void sub_8092AD4(u8, u8); -static void sub_8092B68(u8); -static void sub_8092C8C(u8); -static void sub_8092D78(u8); -static u8 sub_8092E10(u8, u8); -static void sub_8092EB0(u8); -static void sub_809308C(u8); - - -void ResetPokedex(void) -{ - u16 i; - - gUnknown_0202FFB8 = 0; - gUnknown_0202FFBA = 0x40; - gUnknown_03005CE8 = 0; - gSaveBlock2.pokedex.unknown1 = 0; - gSaveBlock2.pokedex.order = 0; - gSaveBlock2.pokedex.nationalMagic = 0; - gSaveBlock2.pokedex.unknown2 = 0; - gSaveBlock2.pokedex.unownPersonality = 0; - gSaveBlock2.pokedex.spindaPersonality = 0; - gSaveBlock2.pokedex.unknown3 = 0; - DisableNationalPokedex(); - for (i = 0; i <= 51; i++) - { - gSaveBlock2.pokedex.owned[i] = 0; - gSaveBlock2.pokedex.seen[i] = 0; - gSaveBlock1.dexSeen2[i] = 0; - gSaveBlock1.dexSeen3[i] = 0; - } -} - -void sub_808C0A0(void) -{ - gUnknown_0202FFB8 = 0; - gUnknown_0202FFBA = 0x40; -} - -static void sub_808C0B8(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void ClearPokedexView(struct PokedexView *pokedexView) -{ - u16 i; - - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - pokedexView->unk0[i].dexNum |= 0xFFFF; - pokedexView->unk0[i].seen = 0; - pokedexView->unk0[i].owned = 0; - } - pokedexView->unk608 = 0; - pokedexView->unk60A_1 = 0; - pokedexView->unk60A_2 = 0; - pokedexView->pokemonListCount = 0; - pokedexView->selectedPokemon = 0; - pokedexView->unk610 = 0; - pokedexView->dexMode = 0; - pokedexView->unk614 = 0; - pokedexView->dexOrder = 0; - pokedexView->unk618 = 0; - pokedexView->unk61A = 0; - pokedexView->unk61C = 0; - for (i = 0; i <= 3; i++) - pokedexView->unk61E[i] |= 0xFFFF; - pokedexView->unk628 = 0; - pokedexView->unk62A = 0; - pokedexView->unk62C = 0; - pokedexView->unk62D = 0; - pokedexView->unk62E = 0; - pokedexView->unk62F = 0; - pokedexView->unk630 = 0; - pokedexView->unk632 = 0; - pokedexView->unk634 = 0; - pokedexView->unk636 = 0; - pokedexView->unk638 = 0; - for (i = 0; i <= 3; i++) - pokedexView->unk63A[i] = 0; - pokedexView->unk64A = 0; - pokedexView->unk64B = 0; - pokedexView->unk64C_1 = 0; - pokedexView->selectedScreen = 0; - pokedexView->unk64F = 0; - pokedexView->menuIsOpen = 0; - pokedexView->menuCursorPos = 0; - pokedexView->menuY = 0; - for (i = 0; i <= 7; i++) - pokedexView->unk656[i] = 0; - for (i = 0; i <= 7; i++) - pokedexView->unk65E[i] = 0; -} - -void CB2_InitPokedex(void) -{ - switch (gMain.state) - { - case 0: - default: - SetVBlankCallback(NULL); - sub_8091060(0); - DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); - DmaClear32(3, OAM, OAM_SIZE); - DmaClear16(3, PLTT, PLTT_SIZE); - gMain.state = 1; - break; - case 1: - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - Text_LoadWindowTemplate(&gWindowTemplate_81E7048); - InitMenuWindow(&gWindowTemplate_81E7048); - gMain.state++; - break; - case 2: - switch (Random() & 3) - { - case 0: - default: - gPokedexView = ePokedexView1; - break; - case 1: - gPokedexView = ePokedexView2; - break; - case 2: - gPokedexView = ePokedexView3; - break; - case 3: - gPokedexView = ePokedexView4; - break; - } - ClearPokedexView(gPokedexView); - CreateTask(Task_PokedexShowMainScreen, 0); - gPokedexView->dexMode = gSaveBlock2.pokedex.unknown1; - if (!IsNationalPokedexEnabled()) - gPokedexView->dexMode = DEX_MODE_HOENN; - gPokedexView->dexOrder = gSaveBlock2.pokedex.order; - gPokedexView->selectedPokemon = gUnknown_0202FFB8; - gPokedexView->unk62C = gUnknown_0202FFBA; - gPokedexView->selectedScreen = PAGE_SCREEN; - gPokedexView->descriptionPageNum = 0; - if (!IsNationalPokedexEnabled()) - { - gPokedexView->unk61A = GetHoennPokedexCount(0); - gPokedexView->unk61C = GetHoennPokedexCount(1); - } - else - { - gPokedexView->unk61A = GetNationalPokedexCount(0); - gPokedexView->unk61C = GetNationalPokedexCount(1); - } - gPokedexView->unk62D = 8; - gMain.state++; - break; - case 3: - { - u16 savedIme; - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIme; - REG_DISPSTAT |= 8; - SetVBlankCallback(sub_808C0B8); - SetMainCallback2(MainCB); - SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x80); - } - break; - } -} - -u8 unref_sub_808C540(void (*func)(u8)) -{ - u16 savedIme; - u8 taskId; - - SetVBlankCallback(NULL); - sub_8091060(0x200); - ScanlineEffect_Stop(); - ResetTasks(); - ResetPaletteFade(); - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIme; - REG_DISPSTAT |= 0x8; - SetVBlankCallback(sub_808C0B8); - SetMainCallback2(MainCB); - if (!gPokedexView->unk64B) - taskId = CreateTask(sub_808CAE4, 0); - else - taskId = CreateTask(sub_808D198, 0); - gTasks[taskId].data[0] = CreateTask(func, 0); - return gTasks[taskId].data[0]; -} - -static void MainCB(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void Task_PokedexShowMainScreen(u8 taskId) -{ - gPokedexView->unk64C_1 = 0; - if (sub_808D344(0)) - gTasks[taskId].func = Task_PokedexMainScreen; -} - -//Hide menu and process input on main screen -void Task_PokedexMainScreen(u8 taskId) -{ - REG_BG0VOFS = gPokedexView->menuY; - - //If menu is open, slide it down, off screen - if (gPokedexView->menuY) - gPokedexView->menuY -= 8; - else - { - if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen) - { - sub_808E6BC(); - BeginNormalPaletteFade( - ~(1 << (gSprites[gPokedexView->selectedMonSpriteId].oam.paletteNum + 16)), - 0, 0, 0x10, 0); - gSprites[gPokedexView->selectedMonSpriteId].callback = sub_808EDB8; - gTasks[taskId].func = sub_808CA64; - PlaySE(SE_PIN); - } - else if (gMain.newKeys & START_BUTTON) - { - //Open menu - gPokedexView->menuY = 0; - gPokedexView->menuIsOpen = 1; - gPokedexView->menuCursorPos = 0; - gTasks[taskId].func = Task_PokedexMainScreenMenu; - PlaySE(SE_SELECT); - } - else if (gMain.newKeys & SELECT_BUTTON) - { - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].data[0] = sub_8091E3C(); - gPokedexView->unk64F = 0; - gPokedexView->unk62A = gPokedexView->unk62C; - gPokedexView->unk610 = gPokedexView->selectedPokemon; - gPokedexView->unk614 = gPokedexView->dexMode; - gPokedexView->unk618 = gPokedexView->dexOrder; - gTasks[taskId].func = sub_808CB8C; - PlaySE(SE_PC_LOGON); - } - else if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_ClosePokedex; - PlaySE(SE_PC_OFF); - } - else - { - //Handle D-pad - gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE); - if (gPokedexView->unk62E) - gTasks[taskId].func = sub_808C898; - } - } -} - -static void sub_808C898(u8 taskId) -{ - if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636)) - gTasks[taskId].func = Task_PokedexMainScreen; -} - -//Bring up menu and process menu input -static void Task_PokedexMainScreenMenu(u8 taskId) -{ - REG_BG0VOFS = gPokedexView->menuY; - - //If menu is not open, slide it up, on screen - if (gPokedexView->menuY != 80) - gPokedexView->menuY += 8; - else - { - if (gMain.newKeys & A_BUTTON) - { - switch (gPokedexView->menuCursorPos) - { - case 0: //BACK TO LIST - default: - gMain.newKeys |= START_BUTTON; //Exit menu - break; - case 1: //LIST TOP - gPokedexView->selectedPokemon = 0; - gPokedexView->unk62C = 0x40; - sub_808E82C(); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gMain.newKeys |= START_BUTTON; //Exit menu - break; - case 2: //LIST BOTTOM - gPokedexView->selectedPokemon = gPokedexView->pokemonListCount - 1; - gPokedexView->unk62C = gPokedexView->pokemonListCount * 16 + 0x30; - sub_808E82C(); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gMain.newKeys |= START_BUTTON; //Exit menu - break; - case 3: //CLOSE POKEDEX - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_ClosePokedex; - PlaySE(SE_PC_OFF); - break; - } - } - - //Exit menu when Start or B is pressed - if (gMain.newKeys & (START_BUTTON | B_BUTTON)) - { - gPokedexView->menuIsOpen = 0; - gTasks[taskId].func = Task_PokedexMainScreen; - PlaySE(SE_SELECT); - } - else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos != 0) - { - gPokedexView->menuCursorPos--; - PlaySE(SE_SELECT); - } - else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 2) - { - gPokedexView->menuCursorPos++; - PlaySE(SE_SELECT); - } - } -} - -static void sub_808CA64(u8 taskId) -{ - if (gSprites[gPokedexView->selectedMonSpriteId].pos1.x == 48 - && gSprites[gPokedexView->selectedMonSpriteId].pos1.y == 56) - { - gPokedexView->unk64B = gPokedexView->unk64A; - gTasks[taskId].data[0] = sub_808F210(&gPokedexView->unk0[gPokedexView->selectedPokemon], gPokedexView->selectedMonSpriteId); - gTasks[taskId].func = sub_808CAE4; - } -} - -static void sub_808CAE4(u8 taskId) -{ - if (gTasks[gTasks[taskId].data[0]].isActive) - { - if (gPokedexView->unk64A == 1 && !sub_808F250(gTasks[taskId].data[0]) && sub_808E71C()) - sub_808F284(&gPokedexView->unk0[gPokedexView->selectedPokemon], gTasks[taskId].data[0]); - } - else - { - gUnknown_0202FFB8 = gPokedexView->selectedPokemon; - gUnknown_0202FFBA = gPokedexView->unk62C; - gTasks[taskId].func = Task_PokedexShowMainScreen; - } -} - -static void sub_808CB8C(u8 taskId) -{ - bool8 isActive = gTasks[gTasks[taskId].data[0]].isActive; - - if (!isActive) - { - if (gPokedexView->unk64F != 0) - { - gPokedexView->selectedPokemon = isActive; - gPokedexView->unk62C = 0x40; - gTasks[taskId].func = sub_808CCC4; - } - else - { - gPokedexView->unk62C = gPokedexView->unk62A; - gPokedexView->selectedPokemon = gPokedexView->unk610; - gPokedexView->dexMode = gPokedexView->unk614; - if (!IsNationalPokedexEnabled()) - gPokedexView->dexMode = DEX_MODE_HOENN; - gPokedexView->dexOrder = gPokedexView->unk618; - gTasks[taskId].func = Task_PokedexShowMainScreen; - } - } -} - -static void Task_ClosePokedex(u8 taskId) -{ - if (!gPaletteFade.active) - { - gSaveBlock2.pokedex.unknown1 = gPokedexView->dexMode; - if (!IsNationalPokedexEnabled()) - gSaveBlock2.pokedex.unknown1 = 0; - gSaveBlock2.pokedex.order = gPokedexView->dexOrder; - DestroyTask(taskId); - SetMainCallback2(sub_805469C); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - } -} - -static void sub_808CCC4(u8 taskId) -{ - gPokedexView->unk64C_1 = 1; - if (sub_808D344(3)) - gTasks[taskId].func = Task_PokedexResultsScreen; -} - -static void Task_PokedexResultsScreen(u8 taskId) -{ - REG_BG0VOFS = gPokedexView->menuY; - - if (gPokedexView->menuY) - { - gPokedexView->menuY -= 8; - } - else - { - if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen) - { - u32 a; - - sub_808E6BC(); - a = (1 << (gSprites[gPokedexView->selectedMonSpriteId].oam.paletteNum + 16)); - gSprites[gPokedexView->selectedMonSpriteId].callback = sub_808EDB8; - BeginNormalPaletteFade(~a, 0, 0, 0x10, 0); - gTasks[taskId].func = sub_808D118; - PlaySE(SE_PIN); - } - else if (gMain.newKeys & START_BUTTON) - { - gPokedexView->menuY = 0; - gPokedexView->menuIsOpen = 1; - gPokedexView->menuCursorPos = 0; - gTasks[taskId].func = Task_PokedexResultsScreenMenu; - PlaySE(SE_SELECT); - } - else if (gMain.newKeys & SELECT_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].data[0] = sub_8091E3C(); - gPokedexView->unk64F = 0; - gTasks[taskId].func = sub_808CB8C; - PlaySE(SE_PC_LOGON); - } - else if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; - PlaySE(SE_PC_OFF); - } - else - { - //Handle D-pad - gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE); - if (gPokedexView->unk62E) - gTasks[taskId].func = sub_808CEF8; - } - } -} - -static void sub_808CEF8(u8 taskId) -{ - if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636)) - gTasks[taskId].func = Task_PokedexResultsScreen; -} - -static void Task_PokedexResultsScreenMenu(u8 taskId) -{ - REG_BG0VOFS = gPokedexView->menuY; - - if (gPokedexView->menuY != 96) - { - gPokedexView->menuY += 8; - } - else - { - if (gMain.newKeys & A_BUTTON) - { - switch (gPokedexView->menuCursorPos) - { - case 0: //BACK TO LIST - default: - gMain.newKeys |= START_BUTTON; - break; - case 1: //LIST TOP - gPokedexView->selectedPokemon = 0; - gPokedexView->unk62C = 0x40; - sub_808E82C(); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gMain.newKeys |= START_BUTTON; - break; - case 2: //LIST BOTTOM - gPokedexView->selectedPokemon = gPokedexView->pokemonListCount - 1; - gPokedexView->unk62C = gPokedexView->pokemonListCount * 16 + 0x30; - sub_808E82C(); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gMain.newKeys |= START_BUTTON; - break; - case 3: //BACK TO POKEDEX - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; - PlaySE(SE_TRACK_DOOR); - break; - case 4: //CLOSE POKEDEX - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_PokedexResultsScreenExitPokedex; - PlaySE(SE_PC_OFF); - break; - } - } - - //Exit menu when Start or B is pressed - if (gMain.newKeys & (START_BUTTON | B_BUTTON)) - { - gPokedexView->menuIsOpen = 0; - gTasks[taskId].func = Task_PokedexResultsScreen; - PlaySE(SE_SELECT); - } - else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos) - { - gPokedexView->menuCursorPos--; - PlaySE(SE_SELECT); - } - else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 3) - { - gPokedexView->menuCursorPos++; - PlaySE(SE_SELECT); - } - } -} - -static void sub_808D118(u8 taskId) -{ - if (gSprites[gPokedexView->selectedMonSpriteId].pos1.x == 48 - && gSprites[gPokedexView->selectedMonSpriteId].pos1.y == 56) - { - gPokedexView->unk64B = gPokedexView->unk64A; - gTasks[taskId].data[0] = sub_808F210(&gPokedexView->unk0[gPokedexView->selectedPokemon], gPokedexView->selectedMonSpriteId); - gTasks[taskId].func = sub_808D198; - } -} - -static void sub_808D198(u8 taskId) -{ - if (gTasks[gTasks[taskId].data[0]].isActive) - { - if (gPokedexView->unk64A == 1 && !sub_808F250(gTasks[taskId].data[0]) && sub_808E71C()) - sub_808F284(&gPokedexView->unk0[gPokedexView->selectedPokemon], gTasks[taskId].data[0]); - } - else - { - gTasks[taskId].func = sub_808CCC4; - } -} - -static void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId) -{ - if (!gPaletteFade.active) - { - gPokedexView->unk62C = gPokedexView->unk62A; - gPokedexView->selectedPokemon = gPokedexView->unk610; - gPokedexView->dexMode = gPokedexView->unk614; - if (!IsNationalPokedexEnabled()) - gPokedexView->dexMode = DEX_MODE_HOENN; - gPokedexView->dexOrder = gPokedexView->unk618; - gTasks[taskId].func = Task_PokedexShowMainScreen; - } -} - -static void Task_PokedexResultsScreenExitPokedex(u8 taskId) -{ - if (!gPaletteFade.active) - { - gPokedexView->unk62C = gPokedexView->unk62A; - gPokedexView->selectedPokemon = gPokedexView->unk610; - gPokedexView->dexMode = gPokedexView->unk614; - if (!IsNationalPokedexEnabled()) - gPokedexView->dexMode = DEX_MODE_HOENN; - gPokedexView->dexOrder = gPokedexView->unk618; - gTasks[taskId].func = Task_ClosePokedex; - } -} - -static bool8 sub_808D344(u8 a) -{ - switch (gMain.state) - { - case 0: - default: - if (gPaletteFade.active) - return 0; - SetVBlankCallback(NULL); - gPokedexView->unk64A = a; - sub_8091060(0); - REG_BG2VOFS = gPokedexView->unk62D; - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM)); - LZ77UnCompVram(gUnknown_08E96738, (void *)(VRAM + 0x6800)); - LZ77UnCompVram(gUnknown_08E9C6DC, (void *)(VRAM + 0x7800)); - DmaClear16(3, VRAM + 0x6000, 0x500); - if (a == 0) - LZ77UnCompVram(gUnknown_08E96888, (void *)(VRAM + 0x6500)); - else - LZ77UnCompVram(gUnknown_08E96994, (void *)(VRAM + 0x6500)); - ResetPaletteFade(); - if (a == 0) - gPokedexView->unk64C_1 = 0; - else - gPokedexView->unk64C_1 = 1; - sub_808D640(); - gMain.state = 1; - break; - case 1: - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - LoadCompressedObjectPic(&gUnknown_083A05CC[0]); - LoadSpritePalettes(gUnknown_083A05DC); - sub_808E978(a); - gMain.state++; - break; - case 2: - Text_LoadWindowTemplate(&gWindowTemplate_81E7048); - InitMenuWindow(&gWindowTemplate_81E7048); - LZ77UnCompVram(gUnknown_0839FA7C, (void *)(VRAM + 0xFF80)); - gMain.state++; - break; - case 3: - if (a == 0) - SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder); - sub_808E0CC(gPokedexView->selectedPokemon, 0xE); - gPokedexView->menuIsOpen = 0; - gPokedexView->menuY = 0; - gMain.state++; - break; - case 4: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - SetVBlankCallback(sub_808C0B8); - gMain.state++; - break; - case 5: - REG_WININ = 0x3F3F; - REG_WINOUT = 0x1D3F; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON; - gMain.state++; - break; - case 6: - if (!gPaletteFade.active) - { - gMain.state = 0; - return TRUE; - } - break; - } - return FALSE; -} - -static void sub_808D640(void) -{ - if (gPokedexView->unk64C_1) - LoadPalette(sPokedexSearchPalette + 1, 1, sizeof(sPokedexSearchPalette) - sizeof(u16)); - else if (!IsNationalPokedexEnabled()) - LoadPalette(gPokedexMenu_Pal + 1, 1, 0xBE); - else - LoadPalette(sNationalPokedexPalette + 1, 1, sizeof(sNationalPokedexPalette) - sizeof(u16)); -} - -static void SortPokedex(u8 dexMode, u8 sortMode) -{ - u16 vars[3]; //I have no idea why three regular variables are stored in an array, but whatever. - s16 i; - - gPokedexView->pokemonListCount = 0; - - switch (dexMode) - { - default: - case DEX_MODE_HOENN: - vars[0] = 202; - vars[1] = 1; - break; - case DEX_MODE_NATIONAL: - if (IsNationalPokedexEnabled()) - { - vars[0] = NATIONAL_DEX_COUNT; - vars[1] = 0; - } - else - { - vars[0] = 202; - vars[1] = 1; - } - break; - } - - switch (sortMode) - { - case 0: - if (vars[1]) - { - for (i = 0; i < vars[0]; i++) - { - vars[2] = HoennToNationalOrder(i + 1); - gPokedexView->unk0[i].dexNum = vars[2]; - gPokedexView->unk0[i].seen = GetSetPokedexFlag(vars[2], 0); - gPokedexView->unk0[i].owned = GetSetPokedexFlag(vars[2], 1); - if (gPokedexView->unk0[i].seen) - gPokedexView->pokemonListCount = i + 1; - } - } - else - { - bool32 r10; - s16 r5; - - r10 = r5 = i = 0; - for (i = 0; i < vars[0]; i++) - { - vars[2] = i + 1; - if (GetSetPokedexFlag(vars[2], 0)) - r10 = 1; - if (r10) - { - asm(""); //Needed to match for some reason - gPokedexView->unk0[r5].dexNum = vars[2]; - gPokedexView->unk0[r5].seen = GetSetPokedexFlag(vars[2], 0); - gPokedexView->unk0[r5].owned = GetSetPokedexFlag(vars[2], 1); - if (gPokedexView->unk0[r5].seen) - gPokedexView->pokemonListCount = r5 + 1; - r5++; - } - } - } - break; - case 1: - for (i = 0; i < 411; i++) - { - vars[2] = gPokedexOrder_Alphabetical[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 0)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = GetSetPokedexFlag(vars[2], 1); - gPokedexView->pokemonListCount++; - } - } - break; - case 2: - for (i = NATIONAL_DEX_COUNT - 1; i >= 0; i--) - { - vars[2] = gPokedexOrder_Weight[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; - gPokedexView->pokemonListCount++; - } - } - break; - case 3: - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - vars[2] = gPokedexOrder_Weight[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; - gPokedexView->pokemonListCount++; - } - } - break; - case 4: - for (i = NATIONAL_DEX_COUNT - 1; i >=0; i--) - { - vars[2] = gPokedexOrder_Height[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; - gPokedexView->pokemonListCount++; - } - } - break; - case 5: - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - vars[2] = gPokedexOrder_Height[i]; - - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) - { - gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; - gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = 1; - gPokedexView->pokemonListCount++; - } - } - break; - } - - for (i = gPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) - { - gPokedexView->unk0[i].dexNum |= 0xFFFF; - gPokedexView->unk0[i].seen = 0; - gPokedexView->unk0[i].owned = 0; - } -} - -static void sub_808DBE8(u8 a, u16 b, u16 c) -{ - s16 _b; - u16 i; - u16 r2; - - switch (a) - { - case 0: - default: - _b = b - 5; - for (i = 0; i <= 10; i++) - { - if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) - { - sub_808E090(0x11, i * 2, c); - } - else - { - sub_808E090(0x11, i * 2, c); - if (gPokedexView->unk0[_b].seen) - { - sub_808DEB0(_b, 0x12, i * 2, c); - sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, i * 2, c); - sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, i * 2); - } - else - { - sub_808DEB0(_b, 0x12, i * 2, c); - sub_808DF88(0, 0x11, i * 2, c); - sub_808DFE4(0, 0x17, i * 2); - } - } - _b++; - } - break; - case 1: - _b = b - 5; - if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) - { - sub_808E090(0x11, gPokedexView->unk630 * 2, c); - } - else - { - sub_808E090(0x11, gPokedexView->unk630 * 2, c); - if (gPokedexView->unk0[_b].seen) - { - sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c); - sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, gPokedexView->unk630 * 2, c); - sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, gPokedexView->unk630 * 2); - } - else - { - sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c); - sub_808DF88(0, 0x11, gPokedexView->unk630 * 2, c); - sub_808DFE4(0, 0x17, gPokedexView->unk630 * 2); - } - } - break; - case 2: - _b = b + 5; - r2 = gPokedexView->unk630 + 10; - if (r2 > 15) - r2 -= 16; - if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gPokedexView->unk0[_b].dexNum == 0xFFFF) - sub_808E090(0x11, r2 * 2, c); - else - { - sub_808E090(0x11, r2 * 2, c); - if (gPokedexView->unk0[_b].seen) - { - sub_808DEB0(_b, 0x12, r2 * 2, c); - sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, r2 * 2, c); - sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, r2 * 2); - } - else - { - sub_808DEB0(_b, 0x12, r2 * 2, c); - sub_808DF88(0, 0x11, r2 * 2, c); - sub_808DFE4(0, 0x17, r2 * 2); - } - } - break; - } -} - -static void sub_808DEB0(u16 a, u8 b, u8 c, u16 d) -{ - u8 text[4]; - u16 unk[2]; - u16 r7 = gPokedexView->unk0[a].dexNum; - - if (gPokedexView->dexMode == DEX_MODE_HOENN) - r7 = NationalToHoennOrder(r7); - unk[0] = 0x3FC; - unk[1] = 0x3FD; - text[0] = CHAR_0 + r7 / 100; - text[1] = CHAR_0 + (r7 % 100) / 10; - text[2] = CHAR_0 + (r7 % 100) % 10; - text[3] = EOS; - *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; - *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; - Menu_PrintText(text, b - 15, c); -} - -static void sub_808DF88(u16 a, u8 b, u8 c, u16 d) -{ - u16 unk[2]; - - if (a) - { - unk[0] = 0x3FE; - unk[1] = 0x3FF; - } - else - { - unk[0] = 0; - unk[1] = 0; - } - *(u16 *)(VRAM + d * 0x800 + c * 0x40 + b * 2) = unk[0]; - *(u16 *)(VRAM + d * 0x800 + (c + 1) * 0x40 + b * 2) = unk[1]; -} - -static u8 sub_808DFE4(u16 num, u8 b, u8 c) -{ - u8 text[10]; - u8 i; - - for (i = 0; i < 10; i++) - text[i] = CHAR_SPACE; - text[i] = EOS; - - num = NationalPokedexNumToSpecies(num); - switch (num) - { - default: - for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) - text[i] = gSpeciesNames[num][i]; - break; - case 0: - for (i = 0; i < 10; i++) - text[i] = CHAR_HYPHEN; - break; - } - Menu_PrintTextPixelCoords(text, (b - 0x11) * 8 + 0xFC, c * 8, 0); - return i; -} - -static void sub_808E090(u8 a, u8 b, u16 c) -{ - u8 i; - - for (i = 0; i < 12; i++) - { - *(u16 *)(VRAM + c * 0x800 + b * 64 + (a + i) * 2) = 0; - *(u16 *)(VRAM + c * 0x800 + (b + 1) * 64 + (a + i) * 2) = 0; - } -} - -static void sub_808E0CC(u16 a, u16 b) -{ - u8 i; - u16 unk; - u8 spriteId; - - for (i = 0; i < 4; i++) - gPokedexView->unk61E[i] = 0xFFFF; - gPokedexView->selectedMonSpriteId = 0xFFFF; - sub_808DBE8(0, a, b); - REG_BG2VOFS = gPokedexView->unk62D; - - unk = sub_808E888(a - 1); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data[5] = -32; - } - - unk = sub_808E888(a); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data[5] = 0; - } - - unk = sub_808E888(a + 1); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data[5] = 32; - } - - gPokedexView->unk630 = 0; - gPokedexView->unk632 = 0; -} - -static bool8 sub_808E208(u8 a, u8 b, u8 c) -{ - u16 i; - u8 foo; - - if (gPokedexView->unk62E) - { - gPokedexView->unk62E--; - switch (a) - { - case 1: - for (i = 0; i < 4; i++) - { - if (gPokedexView->unk61E[i] != 0xFFFF) - gSprites[gPokedexView->unk61E[i]].data[5] += b; - } - foo = 16 * (c - gPokedexView->unk62E) / c; - REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 - foo; - gPokedexView->unk62C -= gPokedexView->unk628; - break; - case 2: - for (i = 0; i < 4; i++) - { - if (gPokedexView->unk61E[i] != 0xFFFF) - gSprites[gPokedexView->unk61E[i]].data[5] -= b; - } - foo = 16 * (c - gPokedexView->unk62E) / c; - REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 + foo; - gPokedexView->unk62C += gPokedexView->unk628; - break; - } - return FALSE; - } - else - { - REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk630 * 16; - return TRUE; - } -} - -static void sub_808E398(u8 a, u16 b) -{ - u16 unk; - u8 spriteId; - - gPokedexView->unk632 = gPokedexView->unk630; - switch (a) - { - case 1: - unk = sub_808E888(b - 1); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data[5] = -64; - } - if (gPokedexView->unk630 > 0) - gPokedexView->unk630--; - else - gPokedexView->unk630 = 15; - break; - case 2: - unk = sub_808E888(b + 1); - if (unk != 0xFFFF) - { - spriteId = sub_808E8C8(unk, 0x60, 0x50); - gSprites[spriteId].callback = sub_808EE28; - gSprites[spriteId].data[5] = 0x40; - } - if (gPokedexView->unk630 <= 0xE) - gPokedexView->unk630++; - else - gPokedexView->unk630 = 0; - break; - } -} - -// Ugly, ugly, ugly. I couldn't get it to match otherwise. -static u16 sub_808E48C(u16 a, u16 b) -{ - u8 r3; - u8 r5; - u8 i; - u16 r6; - u8 r10 = 0; - - if (!((gMain.heldKeys & 0x40) && (a > 0))) - { - //_0808E4B6 - if (!((gMain.heldKeys & 0x80) && (a < gPokedexView->pokemonListCount - 1))) - //_0808E4CE - { - if ((gMain.newKeys & 0x20) && (a > 0)) - { - r6 = a; - //_0808E4E0 - for (i = 0; i < 7; i++) - a = sub_8091818(1, a, 0, gPokedexView->pokemonListCount - 1); - gPokedexView->unk62C += 16 * (a - r6); - sub_808E82C(); - sub_808E0CC(a, 0xE); - PlaySE(0x6D); - } - //_0808E53C - else if ((gMain.newKeys & 0x10) && (a < gPokedexView->pokemonListCount - 1)) - { - r6 = a; - for (i = 0; i < 7; i++) - a = sub_8091818(0, a, 0, gPokedexView->pokemonListCount - 1); - gPokedexView->unk62C += (a - r6) * 16; - sub_808E82C(); - sub_808E0CC(a, 0xE); - PlaySE(0x6D); - } - _0808E5A2: - if (r10 == 0) - { - gPokedexView->unk638 = 0; - return a; - } - } - else - { - // to _0808E5C4 - r10 = 2; - a = sub_8091818(0, a, 0, gPokedexView->pokemonListCount - 1); - sub_808E398(2, a); - //goto _0808E60E - sub_808DBE8(2, a, b); - PlaySE(0x6C); - goto _0808E5A2; - } - } - else - { - //to _0808E5E4 - r10 = 1; - a = sub_8091818(1, a, 0, gPokedexView->pokemonListCount - 1); - sub_808E398(1, a); - //_0808E60E - sub_808DBE8(1, a, b); - PlaySE(0x6C); - goto _0808E5A2; - } - //_0808E628 - r5 = gUnknown_083A05EC[gPokedexView->unk638 / 4]; - r3 = gUnknown_083A05F1[gPokedexView->unk638 / 4]; - gPokedexView->unk62E = r3; - gPokedexView->unk636 = r3; - gPokedexView->unk634 = r5; - gPokedexView->unk62F = r10; - gPokedexView->unk628 = r5 / 2; - sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636); - if (gPokedexView->unk638 <= 0xB) - gPokedexView->unk638++; - return a; -} - -static void sub_808E6BC(void) -{ - u16 i; - - for (i = 0; i < 4; i++) - { - u16 spriteId = gPokedexView->unk61E[i]; - - if (gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF) - gPokedexView->selectedMonSpriteId = spriteId; - } -} - -static u8 sub_808E71C(void) -{ - u16 r2; - u16 r4 = gPokedexView->selectedPokemon; - - if ((gMain.newKeys & DPAD_UP) && r4) - { - r2 = r4; - while (r2 != 0) - { - r2 = sub_8091818(1, r2, 0, gPokedexView->pokemonListCount - 1); - - if (gPokedexView->unk0[r2].seen) - { - r4 = r2; - break; - } - } - - if (gPokedexView->selectedPokemon == r4) - return 0; - else - { - gPokedexView->selectedPokemon = r4; - gPokedexView->unk62C -= 16; - return 1; - } - } - else if ((gMain.newKeys & DPAD_DOWN) && r4 < gPokedexView->pokemonListCount - 1) - { - r2 = r4; - while (r2 < gPokedexView->pokemonListCount - 1) - { - r2 = sub_8091818(0, r2, 0, gPokedexView->pokemonListCount - 1); - - if (gPokedexView->unk0[r2].seen) - { - r4 = r2; - break; - } - } - - if (gPokedexView->selectedPokemon == r4) - return 0; - else - { - gPokedexView->selectedPokemon = r4; - gPokedexView->unk62C += 16; - return 1; - } - } - return 0; -} - -static u8 sub_808E82C(void) -{ - u16 i; - - for (i = 0; i < 4; i++) - { - if (gPokedexView->unk61E[i] != 0xFFFF) - { - DestroySprite(&gSprites[gPokedexView->unk61E[i]]); - gPokedexView->unk61E[i] |= 0xFFFF; - } - } - return 0; -} - -static u16 sub_808E888(u16 a1) -{ - if (a1 >= NATIONAL_DEX_COUNT || gPokedexView->unk0[a1].dexNum == 0xFFFF) - return 0xFFFF; - else if (gPokedexView->unk0[a1].seen) - return gPokedexView->unk0[a1].dexNum; - else - return 0; -} - -static u32 sub_808E8C8(u16 a, s16 b, s16 c) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - if (gPokedexView->unk61E[i] == 0xFFFF) - { - u8 spriteId = sub_80918EC(a, b, c, i); - - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.priority = 3; - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = i; - gSprites[spriteId].data[2] = NationalPokedexNumToSpecies(a); - gPokedexView->unk61E[i] = spriteId; - return spriteId; - } - } - return 0xFFFF; -} - -static void sub_808E978(u8 a) -{ - u8 spriteId; - u16 r5; - - spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0); - gSprites[spriteId].data[1] = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 156, 0); - gSprites[spriteId].data[1] = 1; - gSprites[spriteId].vFlip = TRUE; - - CreateSprite(&gSpriteTemplate_83A0524, 234, 20, 0); - CreateSprite(&gSpriteTemplate_83A0554, 16, 138, 0); - - spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 138, 0); - StartSpriteAnim(&gSprites[spriteId], 3); - - spriteId = CreateSprite(&gSpriteTemplate_83A0554, 16, 158, 0); - StartSpriteAnim(&gSprites[spriteId], 2); - gSprites[spriteId].data[2] = 0x80; - - spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 158, 0); - StartSpriteAnim(&gSprites[spriteId], 1); - - spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 30; - gSprites[spriteId].data[0] = 0x1E; - gSprites[spriteId].data[1] = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 31; - gSprites[spriteId].data[0] = 0x1F; - gSprites[spriteId].data[1] = 0x80; - - if (a == 0) - { - u32 _a; - - CreateSprite(&gSpriteTemplate_83A0584, 32, 40, 1); - - spriteId = CreateSprite(&gSpriteTemplate_83A0584, 32, 72, 1); - StartSpriteAnim(&gSprites[spriteId], 1); - _a = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 28, 48, 1); - r5 = gPokedexView->unk61A / 100; - StartSpriteAnim(&gSprites[spriteId], r5); - if (r5 != 0) - _a = 1; - else - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 34, 48, 1); - r5 = (gPokedexView->unk61A % 100) / 10; - if (r5 != 0 || _a != 0) - StartSpriteAnim(&gSprites[spriteId], r5); - else - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 40, 48, 1); - r5 = (gPokedexView->unk61A % 100) % 10; - StartSpriteAnim(&gSprites[spriteId], r5); - _a = 0; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 28, 80, 1); - r5 = gPokedexView->unk61C / 100; - StartSpriteAnim(&gSprites[spriteId], r5); - if (r5 != 0) - _a = 1; - else - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 34, 80, 1); - r5 = (gPokedexView->unk61C % 100) / 10; - if (r5 != 0 || _a != 0) - StartSpriteAnim(&gSprites[spriteId], r5); - else - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSprite(&gSpriteTemplate_83A059C, 40, 80, 1); - r5 = (gPokedexView->unk61C % 100) % 10; - StartSpriteAnim(&gSprites[spriteId], r5); - - spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 140, 96, 1); - gSprites[spriteId].invisible = TRUE; - } - else - { - spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 140, 80, 1); - gSprites[spriteId].invisible = TRUE; - } -} - -static void nullsub_58(struct Sprite *sprite) -{ -} - -static void sub_808ED94(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0) - DestroySprite(sprite); -} - -//Move Pokemon into position for description page -static void sub_808EDB8(struct Sprite *sprite) -{ - sprite->oam.priority = 0; - sprite->oam.affineMode = 0; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - if (sprite->pos1.x != 48 || sprite->pos1.y != 56) - { - if (sprite->pos1.x > 48) - sprite->pos1.x--; - if (sprite->pos1.x < 48) - sprite->pos1.x++; - - if (sprite->pos1.y > 56) - sprite->pos1.y--; - if (sprite->pos1.y < 56) - sprite->pos1.y++; - } - else - { - sprite->callback = nullsub_58; - } -} - -static void sub_808EE28(struct Sprite *sprite) -{ - u8 data1 = sprite->data[1]; - - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - { - DestroySprite(sprite); - gPokedexView->unk61E[data1] = 0xFFFF; - } - else - { - u32 var; - - sprite->pos2.y = gSineTable[(u8)sprite->data[5]] * 76 / 256; - var = 0x10000 / gSineTable[sprite->data[5] + 0x40]; - if (var > 0xFFFF) - var = 0xFFFF; - SetOamMatrix(sprite->data[1] + 1, 0x100, 0, 0, var); - sprite->oam.matrixNum = data1 + 1; - - if (sprite->data[5] > -64 && sprite->data[5] < 64) - { - sprite->invisible = FALSE; - sprite->data[0] = 1; - } - else - { - sprite->invisible = TRUE; - } - - if ((sprite->data[5] <= -64 || sprite->data[5] >= 64) && sprite->data[0] != 0) - { - DestroySprite(sprite); - gPokedexView->unk61E[data1] = 0xFFFF; - } - } -} - -static void sub_808EF38(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - DestroySprite(sprite); - else - sprite->pos2.y = gPokedexView->selectedPokemon * 120 / (gPokedexView->pokemonListCount - 1); -} - -static void sub_808EF8C(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - { - DestroySprite(sprite); - } - else - { - u8 r0; - - if (sprite->data[1] != 0) - { - if (gPokedexView->selectedPokemon == gPokedexView->pokemonListCount - 1) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - r0 = sprite->data[2]; - } - else - { - if (gPokedexView->selectedPokemon == 0) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - r0 = sprite->data[2] - 128; - } - sprite->pos2.y = gSineTable[r0] / 64; - sprite->data[2] = sprite->data[2] + 8; - if (gPokedexView->menuIsOpen == 0 && gPokedexView->menuY == 0 && sprite->invisible == 0) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - } -} - -static void sub_808F08C(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - DestroySprite(sprite); -} - -static void sub_808F0B4(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - { - DestroySprite(sprite); - } - else - { - u8 val; - s16 r3; - s16 r0; - - val = gPokedexView->unk62C + sprite->data[1]; - r3 = gSineTable[val]; - r0 = gSineTable[val + 0x40]; - SetOamMatrix(sprite->data[0], r0, r3, -r3, r0); - - val = gPokedexView->unk62C + (sprite->data[1] + 0x40); - r3 = gSineTable[val]; - r0 = gSineTable[val + 0x40]; - sprite->pos2.x = r0 * 40 / 256; - sprite->pos2.y = r3 * 40 / 256; - } -} - -static void sub_808F168(struct Sprite *sprite) -{ - if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3) - { - DestroySprite(sprite); - } - else - { - u16 r1 = gPokedexView->unk64A == 0 ? 80 : 96; - - if (gPokedexView->menuIsOpen != 0 && gPokedexView->menuY == r1) - { - sprite->invisible = FALSE; - sprite->pos2.y = gPokedexView->menuCursorPos * 16; - sprite->pos2.x = gSineTable[(u8)sprite->data[2]] / 64; - sprite->data[2] += 8; - } - else - { - sprite->invisible = TRUE; - } - } -} - -static u8 sub_808F210(struct PokedexListItem *item, u8 b) -{ - u8 taskId; - - gUnknown_0202FFBC = item; - taskId = CreateTask(Task_InitPageScreenMultistep, 0); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 1; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = b; - return taskId; -} - -static bool8 sub_808F250(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0 && gTasks[taskId].func == Task_PageScreenProcessInput) - return FALSE; - else - return TRUE; -} - -static u8 sub_808F284(struct PokedexListItem *item, u8 b) -{ - gUnknown_0202FFBC = item; - gTasks[b].data[0] = 1; - gTasks[b].data[1] = 0; - gTasks[b].data[2] = 0; - gTasks[b].data[3] = 0; - return b; -} - -#if ENGLISH -#define CATEGORY_LEFT (11) -#elif GERMAN -#define CATEGORY_LEFT (16) -#endif - -static void Task_InitPageScreenMultistep(u8 taskId) -{ - switch (gMain.state) - { - case 0: - default: - if (!gPaletteFade.active) - { - u16 r2; - - gPokedexView->unk64A = 1; - gPokedexView->descriptionPageNum = 0; - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - r2 = 0; - if (gTasks[taskId].data[1] != 0) - r2 += 0x1000; - if (gTasks[taskId].data[2] != 0) - r2 |= 0x200; - sub_8091060(r2); - gMain.state = 1; - } - break; - case 1: - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); - LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800)); - sub_8091738(gUnknown_0202FFBC->dexNum, 2, 0x3FC); - gMain.state++; - break; - case 2: - sub_80904FC(0xD); - sub_8090584(gPokedexView->selectedScreen, 0xD); - sub_808D640(); - gMain.state++; - break; - case 3: - Text_LoadWindowTemplate(&gWindowTemplate_81E7064); - InitMenuWindow(&gWindowTemplate_81E7064); - gMain.state++; - break; - case 4: - if (gPokedexView->dexMode == DEX_MODE_HOENN) - sub_8091154(NationalToHoennOrder(gUnknown_0202FFBC->dexNum), 0xD, 3); - else - sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3); - sub_80911C8(gUnknown_0202FFBC->dexNum, 0x10, 3); - Menu_PrintText(gDexText_UnknownPoke, CATEGORY_LEFT, 5); - Menu_PrintText(gDexText_UnknownHeight, 16, 7); - Menu_PrintText(gDexText_UnknownWeight, 16, 9); - if (gUnknown_0202FFBC->owned) - { - sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, CATEGORY_LEFT, 5); - sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7); - sub_8091564(gPokedexEntries[gUnknown_0202FFBC->dexNum].weight, 16, 9); - Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); - sub_80917CC(14, 0x3FC); - } - else - { - Menu_PrintText(gUnknown_083A05F8, 2, 13); - LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E); - } - gMain.state++; - break; - case 5: - if (gTasks[taskId].data[1] == 0) - { - gTasks[taskId].data[4] = (u16)sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0); - gSprites[gTasks[taskId].data[4]].oam.priority = 0; - } - gMain.state++; - break; - case 6: - { - u32 r3 = 0; - - if (gTasks[taskId].data[2] != 0) - r3 = 0x14; - if (gTasks[taskId].data[1] != 0) - r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 16)); - BeginNormalPaletteFade(~r3, 0, 16, 0, 0); - SetVBlankCallback(gUnknown_03005CEC); - gMain.state++; - } - break; - case 7: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - gMain.state++; - break; - case 8: - if (!gPaletteFade.active) - { - gMain.state++; - if (gTasks[taskId].data[3] == 0) - { - StopCryAndClearCrySongs(); - PlayCry2(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), 0, 0x7D, 0xA); - } - else - { - gMain.state++; - } - } - break; - case 9: - if (!IsCryPlayingOrClearCrySongs()) - gMain.state++; - break; - case 10: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 1; - gTasks[taskId].data[3] = 1; - gTasks[taskId].func = Task_PageScreenProcessInput; - gMain.state = 0; - break; - } -} - -static void Task_PageScreenProcessInput(u8 taskId) -{ - if (gTasks[taskId].data[0] != 0) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_808F888; - PlaySE(SE_Z_SCROLL); - return; - } - if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = Task_ClosePageScreen; - PlaySE(SE_PC_OFF); - return; - } - if (gMain.newKeys & A_BUTTON) - { - switch (gPokedexView->selectedScreen) - { - case PAGE_SCREEN: - sub_8090C68(); - break; - case AREA_SCREEN: - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_InitAreaScreenMultistep; - PlaySE(SE_PIN); - break; - case CRY_SCREEN: - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_InitCryScreenMultistep; - PlaySE(SE_PIN); - break; - case SIZE_SCREEN: - if (!gUnknown_0202FFBC->owned) - { - PlaySE(SE_HAZURE); - } - else - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_InitSizeScreenMultistep; - PlaySE(SE_PIN); - } - break; - } - return; - } - if (((gMain.newKeys & DPAD_LEFT) - || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - && gPokedexView->selectedScreen > 0) - { - gPokedexView->selectedScreen--; - sub_8090584(gPokedexView->selectedScreen, 0xD); - PlaySE(SE_Z_PAGE); - return; - } - if (((gMain.newKeys & DPAD_RIGHT) - || ((gMain.newKeys & R_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - && gPokedexView->selectedScreen < 3) - { - gPokedexView->selectedScreen++; - sub_8090584(gPokedexView->selectedScreen, 0xD); - PlaySE(SE_Z_PAGE); - return; - } -} - -static void sub_808F888(u8 taskId) -{ - if (!gPaletteFade.active) - gTasks[taskId].func = Task_InitPageScreenMultistep; -} - -static void Task_ClosePageScreen(u8 taskId) -{ - if (!gPaletteFade.active) - DestroyTask(taskId); -} - -static void Task_InitAreaScreenMultistep(u8 taskId) -{ - switch (gMain.state) - { - case 0: - default: - if (!gPaletteFade.active) - { - gPokedexView->unk64A = 5; - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - sub_8091060(0x200); - gPokedexView->selectedScreen = AREA_SCREEN; - gMain.state = 1; - } - break; - case 1: - sub_8090540(0xD); - sub_8090644(1, 0xD); - sub_808D640(); - REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; - gMain.state++; - break; - case 2: - ShowPokedexAreaScreen(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), &gPokedexView->unk64F); - SetVBlankCallback(gUnknown_03005CEC); - gPokedexView->unk64F = 0; - gMain.state = 0; - gTasks[taskId].func = Task_AreaScreenProcessInput; - break; - } -} - -static void Task_AreaScreenProcessInput(u8 taskId) -{ - if (gPokedexView->unk64F != 0) - gTasks[taskId].func = sub_808FA00; -} - -static void sub_808FA00(u8 taskId) -{ - if (!gPaletteFade.active) - { - switch (gPokedexView->unk64F) - { - case 1: - default: - gTasks[taskId].func = Task_InitPageScreenMultistep; - break; - case 2: - gTasks[taskId].func = Task_InitCryScreenMultistep; - break; - } - } -} - -static void Task_InitCryScreenMultistep(u8 taskId) -{ - switch (gMain.state) - { - case 0: - default: - if (!gPaletteFade.active) - { - m4aMPlayStop(&gMPlay_BGM); - gPokedexView->unk64A = 6; - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - sub_8091060(0x200); - gPokedexView->selectedScreen = CRY_SCREEN; - gMain.state = 1; - } - break; - case 1: - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); - LZ77UnCompVram(gUnknown_0839F8A0, (void *)(VRAM + 0x7000)); - gMain.state++; - break; - case 2: - sub_8090540(0xD); - sub_8090644(2, 0xD); - sub_808D640(); - DmaClear16(3, (void *)(VRAM + 0xF800), 0x500); - gMain.state++; - break; - case 3: - Text_LoadWindowTemplate(&gWindowTemplate_81E702C); - InitMenuWindow(&gWindowTemplate_81E702C); - ResetPaletteFade(); - gMain.state++; - break; - case 4: - Menu_PrintText(gDexText_CryOf, 10, 4); - sub_8091260(gUnknown_0202FFBC->dexNum, 10, 6, 2); - gMain.state++; - break; - case 5: - gTasks[taskId].data[4] = sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0); - gSprites[gTasks[taskId].data[4]].oam.priority = 0; - gUnknown_03005E98 = 0; - gMain.state++; - break; - case 6: - { - struct CryRelatedStruct sp8; - - sp8.unk0 = 0x4020; - sp8.unk2 = 0x1F; - sp8.paletteNo = 8; - sp8.yPos = 0x1E; - sp8.xPos = 0xC; - if (sub_8119E3C(&sp8, 0) != 0) - { - gMain.state++; - gUnknown_03005E98 = 0; - } - } - break; - case 7: - { - struct CryRelatedStruct sp10; - - sp10.unk0 = 0x3000; - sp10.unk2 = 0xE; - sp10.paletteNo = 9; - sp10.xPos = 0x12; - sp10.yPos = 3; - if (ShowPokedexCryScreen(&sp10, 1) != 0) - gMain.state++; - } - break; - case 8: - BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); - SetVBlankCallback(gUnknown_03005CEC); - gMain.state++; - break; - case 9: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - gMain.state++; - break; - case 10: - gPokedexView->unk64F = 0; - gMain.state = 0; - gTasks[taskId].func = Task_CryScreenProcessInput; - break; - } -} - -static void Task_CryScreenProcessInput(u8 taskId) -{ - sub_8119F88(0); - - if (IsCryPlaying()) - sub_8090040(1); - else - sub_8090040(0); - - if (gMain.newKeys & A_BUTTON) - { - sub_8090040(1); - sub_811A050(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum)); - return; - } - else if (!gPaletteFade.active) - { - if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - m4aMPlayContinue(&gMPlay_BGM); - gPokedexView->unk64F = 1; - gTasks[taskId].func = sub_808FFBC; - PlaySE(SE_PC_OFF); - return; - } - if ((gMain.newKeys & DPAD_LEFT) - || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - m4aMPlayContinue(&gMPlay_BGM); - gPokedexView->unk64F = 2; - gTasks[taskId].func = sub_808FFBC; - PlaySE(SE_Z_PAGE); - return; - } - if ((gMain.newKeys & DPAD_RIGHT) - || ((gMain.newKeys & R_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - { - if (!gUnknown_0202FFBC->owned) - { - PlaySE(SE_HAZURE); - } - else - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - m4aMPlayContinue(&gMPlay_BGM); - gPokedexView->unk64F = 3; - gTasks[taskId].func = sub_808FFBC; - PlaySE(SE_Z_PAGE); - } - return; - } - } -} - -static void sub_808FFBC(u8 taskId) -{ - if (!gPaletteFade.active) - { - DestroyCryMeterNeedleSprite(); - switch (gPokedexView->unk64F) - { - default: - case 1: - gTasks[taskId].func = Task_InitPageScreenMultistep; - break; - case 2: - gTasks[taskId].func = Task_InitAreaScreenMultistep; - break; - case 3: - gTasks[taskId].func = Task_InitSizeScreenMultistep; - break; - } - } -} - -static void sub_8090040(u8 a) -{ - u16 unk; - - if (a != 0) - unk = 0x392; - else - unk = 0x2AF; - LoadPalette(&unk, 0x5D, 2); -} - -static void Task_InitSizeScreenMultistep(u8 taskId) -{ - u8 spriteId; - - switch (gMain.state) - { - default: - case 0: - if (!gPaletteFade.active) - { - gPokedexView->unk64A = 7; - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - sub_8091060(0x200); - gPokedexView->selectedScreen = SIZE_SCREEN; - gMain.state = 1; - } - break; - case 1: - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM); - LZ77UnCompVram(gUnknown_0839F988, (void *)(VRAM + 0x7000)); - gMain.state++; - break; - case 2: - sub_8090540(0xD); - sub_8090644(3, 0xD); - sub_808D640(); - gMain.state++; - break; - case 3: - { - u8 string[40]; //I hope this is the correct size - - Text_LoadWindowTemplate(&gWindowTemplate_81E702C); - InitMenuWindow(&gWindowTemplate_81E702C); - string[0] = EOS; - StringAppend(string, gDexText_SizeComparedTo); - StringAppend(string, gSaveBlock2.playerName); - sub_8072BD8(string, 3, 15, 0xC0); - gMain.state++; - } - break; - case 4: - ResetPaletteFade(); - gMain.state++; - break; - case 5: - spriteId = sub_8091A4C(gSaveBlock2.playerGender, 152, 56, 0); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 1; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerOffset; - SetOamMatrix(1, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale); - LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, sizeof(gUnknown_083B4EC4)); - gMain.state++; - break; - case 6: - spriteId = sub_80918EC(gUnknown_0202FFBC->dexNum, 88, 56, 1); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 2; - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonOffset; - SetOamMatrix(2, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale); - LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, sizeof(gUnknown_083B4EC4)); - gMain.state++; - break; - case 7: - BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); - SetVBlankCallback(gUnknown_03005CEC); - gMain.state++; - break; - case 8: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - gMain.state++; - break; - case 9: - if (!gPaletteFade.active) - { - gPokedexView->unk64F = 0; - gMain.state = 0; - gTasks[taskId].func = Task_SizeScreenProcessInput; - } - break; - } -} - -static void Task_SizeScreenProcessInput(u8 taskId) -{ - if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gPokedexView->unk64F = 1; - gTasks[taskId].func = sub_8090498; - PlaySE(SE_PC_OFF); - } - else if ((gMain.newKeys & DPAD_LEFT) - || ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) - { - BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); - gPokedexView->unk64F = 2; - gTasks[taskId].func = sub_8090498; - PlaySE(SE_Z_PAGE); - } -} - -static void sub_8090498(u8 taskId) -{ - if (!gPaletteFade.active) - { - switch (gPokedexView->unk64F) - { - default: - case 1: - gTasks[taskId].func = Task_InitPageScreenMultistep; - break; - case 2: - gTasks[taskId].func = Task_InitCryScreenMultistep; - break; - } - } -} - -static void sub_80904FC(u16 a) -{ - LZ77UnCompVram(gUnknown_08E96ACC, (void *)(VRAM + a * 0x800)); - DmaClear16(3, (void *)(VRAM + a * 0x800 + 0xC0), 0x440); -} - -static void sub_8090540(u16 a) -{ - LZ77UnCompVram(gUnknown_08E96B58, (void *)(VRAM + a * 0x800)); - DmaClear16(3, (void *)(VRAM + a * 0x800 + 0xC0), 0x440); -} - -#ifdef NONMATCHING -static void sub_8090584(u8 a, u16 b) -{ - u8 i; //r1 - u8 j; //r3 - u32 r6; - register u8 r7; - - for (i = 0; i < 4; i++) - { - r7 = i * 5 + 1; - r6 = 0x4000; - - if (i == a) - r6 = 0x2000; - - for (j = 0; j < 5; j++) - { - u32 r0 = b * 0x800 + (r7 + j) * 2; - u8 *ptr; - - ptr = VRAM; - *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; - ptr = VRAM + 0x40; - *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; - } - } - r6 = 0x4000; - for (j = 0; j < 5; j++) - { - u32 r0 = b * 0x800 + j * 2; - u8 *ptr; - - ptr = VRAM + 0x32; - *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; - ptr = VRAM + 0x72; - *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6; - } -} -#else -__attribute__((naked)) -static void sub_8090584(u8 a, u16 b) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - mov r9, r1\n\ - movs r1, 0\n\ -_0809059C:\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - movs r6, 0x80\n\ - lsls r6, 7\n\ - cmp r1, r10\n\ - bne _080905B2\n\ - movs r6, 0x80\n\ - lsls r6, 6\n\ -_080905B2:\n\ - movs r3, 0\n\ - mov r0, r9\n\ - lsls r0, 11\n\ - mov r12, r0\n\ - adds r1, 0x1\n\ - mov r8, r1\n\ - mov r5, r12\n\ - ldr r4, _08090634 @ =0x00000fff\n\ -_080905C2:\n\ - adds r0, r7, r3\n\ - lsls r0, 1\n\ - adds r0, r5, r0\n\ - movs r2, 0xC0\n\ - lsls r2, 19\n\ - adds r1, r0, r2\n\ - ldrh r2, [r1]\n\ - ands r2, r4\n\ - orrs r2, r6\n\ - strh r2, [r1]\n\ - ldr r1, _08090638 @ =0x06000040\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ands r2, r4\n\ - orrs r2, r6\n\ - strh r2, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x4\n\ - bls _080905C2\n\ - mov r2, r8\n\ - lsls r0, r2, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x3\n\ - bls _0809059C\n\ - movs r6, 0x80\n\ - lsls r6, 7\n\ - movs r3, 0\n\ - mov r5, r12\n\ - ldr r4, _08090634 @ =0x00000fff\n\ -_08090600:\n\ - lsls r0, r3, 1\n\ - adds r0, r5, r0\n\ - ldr r2, _0809063C @ =0x06000032\n\ - adds r1, r0, r2\n\ - ldrh r2, [r1]\n\ - ands r2, r4\n\ - orrs r2, r6\n\ - strh r2, [r1]\n\ - ldr r1, _08090640 @ =0x06000072\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ands r2, r4\n\ - orrs r2, r6\n\ - strh r2, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x4\n\ - bls _08090600\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08090634: .4byte 0x00000fff\n\ -_08090638: .4byte 0x06000040\n\ -_0809063C: .4byte 0x06000032\n\ -_08090640: .4byte 0x06000072\n\ - .syntax divided\n"); -} -#endif - -//Nope, can't get this one to match, either. -#ifdef NONMATCHING -static void sub_8090644(u8 a, u16 b) -{ - u8 i; - u8 j; - - for (i = 0; i < 4; i++) - { - u8 r8 = i * 5 + 1; - u32 r5; - - if (i == a || i == 0) - r5 = 0x2000; - else if (a != 0) - r5 = 0x4000; - - for (j = 0; j < 5; j++) - { - u16 (*vramData)[0x400]; - - vramData = (u16 (*)[])VRAM; - vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5; - vramData = (u16 (*)[])(VRAM + 0x40); - vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5; - } - } - - for (j = 0; j < 5; j++) - { - u16 (*vramData)[0x400]; - - vramData = (u16 (*)[])(VRAM + 0x32); - vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000; - vramData = (u16 (*)[])(VRAM + 0x72); - vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000; - } -} -#else -__attribute__((naked)) -static void sub_8090644(u8 a, u16 b) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - mov r9, r1\n\ - movs r1, 0\n\ -_0809065C:\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - cmp r1, r10\n\ - beq _08090670\n\ - cmp r1, 0\n\ - bne _08090676\n\ -_08090670:\n\ - movs r5, 0x80\n\ - lsls r5, 6\n\ - b _0809067A\n\ -_08090676:\n\ - movs r5, 0x80\n\ - lsls r5, 7\n\ -_0809067A:\n\ - movs r3, 0\n\ - mov r0, r9\n\ - lsls r7, r0, 11\n\ - adds r1, 0x1\n\ - mov r12, r1\n\ - adds r6, r7, 0\n\ - ldr r4, _080906FC @ =0x00000fff\n\ -_08090688:\n\ - mov r1, r8\n\ - adds r0, r1, r3\n\ - lsls r0, 1\n\ - adds r0, r6, r0\n\ - movs r2, 0xC0\n\ - lsls r2, 19\n\ - adds r1, r0, r2\n\ - ldrh r2, [r1]\n\ - ands r2, r4\n\ - orrs r2, r5\n\ - strh r2, [r1]\n\ - ldr r1, _08090700 @ =0x06000040\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ands r2, r4\n\ - orrs r2, r5\n\ - strh r2, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x4\n\ - bls _08090688\n\ - mov r2, r12\n\ - lsls r0, r2, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x3\n\ - bls _0809065C\n\ - movs r5, 0x80\n\ - lsls r5, 7\n\ - movs r3, 0\n\ - adds r6, r7, 0\n\ - ldr r4, _080906FC @ =0x00000fff\n\ -_080906C8:\n\ - lsls r0, r3, 1\n\ - adds r0, r6, r0\n\ - ldr r2, _08090704 @ =0x06000032\n\ - adds r1, r0, r2\n\ - ldrh r2, [r1]\n\ - ands r2, r4\n\ - orrs r2, r5\n\ - strh r2, [r1]\n\ - ldr r1, _08090708 @ =0x06000072\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ands r2, r4\n\ - orrs r2, r5\n\ - strh r2, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x4\n\ - bls _080906C8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080906FC: .4byte 0x00000fff\n\ -_08090700: .4byte 0x06000040\n\ -_08090704: .4byte 0x06000032\n\ -_08090708: .4byte 0x06000072\n\ - .syntax divided\n"); -} -#endif - -u8 sub_809070C(u16 dexNum, u32 b, u32 c) -{ - u8 taskId = CreateTask(sub_8090750, 0); - - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = dexNum; - gTasks[taskId].data[12] = b; - gTasks[taskId].data[13] = b >> 16; - gTasks[taskId].data[14] = c; - gTasks[taskId].data[15] = c >> 16; - return taskId; -} - -static void sub_8090750(u8 taskId) -{ - u8 spriteId; - u16 dexNum = gTasks[taskId].data[1]; - u16 i; - - switch (gTasks[taskId].data[0]) - { - case 0: - default: - if (!gPaletteFade.active) - { - gUnknown_03005CEC = gMain.vblankCallback; - SetVBlankCallback(NULL); - sub_8091060(0x100); - gTasks[taskId].data[0] = 1; - } - break; - case 1: - LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM + 0x4000)); - LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800)); - for (i = 0; i < 0x280; i++) - { -#ifndef NONMATCHING - asm(""); -#endif - *(u16 *)(VRAM + 0x7800 + 2 * i) += 0x2000; - } - sub_8091738(gTasks[taskId].data[1], 2, 0x3FC); - ResetPaletteFade(); - LoadPalette(gPokedexMenu_Pal + 1, 0x21, 0x9E); - gTasks[taskId].data[0]++; - break; - case 2: - Text_LoadWindowTemplate(&gWindowTemplate_81E7064); - InitMenuWindow(&gWindowTemplate_81E7064); - DmaClear16(3, (void *)(VRAM + 0xC000), 0x200); - gTasks[taskId].data[0]++; - break; - case 3: - sub_8072BD8(gDexText_RegisterComplete, 2, 0, 0xD0); - if (!IsNationalPokedexEnabled()) - sub_8091154(NationalToHoennOrder(dexNum), 13, 3); - else - sub_8091154(dexNum, 13, 3); - sub_80911C8(dexNum, 16, 3); - Menu_PrintText(gDexText_UnknownPoke, CATEGORY_LEFT, 5); - Menu_PrintText(gDexText_UnknownHeight, 16, 7); - Menu_PrintText(gDexText_UnknownWeight, 16, 9); - sub_8091304(gPokedexEntries[dexNum].categoryName, CATEGORY_LEFT, 5); - sub_8091458(gPokedexEntries[dexNum].height, 16, 7); - sub_8091564(gPokedexEntries[dexNum].weight, 16, 9); - Menu_PrintText(gPokedexEntries[dexNum].descriptionPage1, 2, 13); - sub_80917CC(14, 0x3FC); - gTasks[taskId].data[0]++; - break; - case 4: - spriteId = sub_80918EC(dexNum, 0x30, 0x38, 0); - gSprites[spriteId].oam.priority = 0; - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - SetVBlankCallback(gUnknown_03005CEC); - gTasks[taskId].data[3] = spriteId; - gTasks[taskId].data[0]++; - break; - case 5: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - gTasks[taskId].data[0]++; - break; - case 6: - if (!gPaletteFade.active) - { - PlayCry1(NationalPokedexNumToSpecies(dexNum), 0); - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[4] = 0; - gTasks[taskId].func = sub_8090A3C; - } - break; - } -} - -static void sub_8090A3C(u8 taskId) -{ - if (gMain.newKeys & B_BUTTON) - { - BeginNormalPaletteFade(0x0000FFFC, 0, 0, 16, 0); - gSprites[gTasks[taskId].data[3]].callback = sub_8090C28; - gTasks[taskId].func = sub_8090B8C; - return; - } - else if (gMain.newKeys & A_BUTTON) - { - if (gTasks[taskId].data[4] == 0) - { - u16 r4 = gTasks[taskId].data[1]; - - Menu_EraseWindowRect(2, 13, 27, 19); - Menu_PrintText(gPokedexEntries[r4].descriptionPage2, 2, 13); - (*(u16 *)(VRAM + 0x7ACA))++; - (*(u16 *)(VRAM + 0x7B0A))++; - gTasks[taskId].data[4] = 1; - PlaySE(SE_PIN); - } - else - { - BeginNormalPaletteFade(0x0000FFFC, 0, 0, 16, 0); - gSprites[gTasks[taskId].data[3]].callback = sub_8090C28; - gTasks[taskId].func = sub_8090B8C; - return; - } - } - gTasks[taskId].data[2]++; - if (gTasks[taskId].data[2] & 0x10) - LoadPalette(gPokedexMenu_Pal + 1, 0x51, 14); - else - LoadPalette(gPokedexMenu2_Pal + 1, 0x51, 14); -} - -static void sub_8090B8C(u8 taskId) -{ - if (!gPaletteFade.active) - { - u16 species; - u32 otId; - u32 personality; - u8 paletteNum; - const u8 *lzPaletteData; - - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - CpuCopy16(gUnknown_08D00524, (void *)(VRAM + 0xC000), 0x1000); - sub_800D74C(); - species = NationalPokedexNumToSpecies(gTasks[taskId].data[1]); - otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12]; - personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14]; - paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum; - lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personality); - LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32); - DestroyTask(taskId); - } -} - -static void sub_8090C28(struct Sprite *sprite) -{ - if (sprite->pos1.x < 0x78) - sprite->pos1.x += 2; - if (sprite->pos1.x > 0x78) - sprite->pos1.x -= 2; - - if (sprite->pos1.y < 0x50) - sprite->pos1.y += 1; - if (sprite->pos1.y > 0x50) - sprite->pos1.y -= 1; -} - -static void sub_8090C68(void) -{ - if (gUnknown_0202FFBC->owned) - { - if (gPokedexView->descriptionPageNum == 0) - { - Menu_EraseWindowRect(2, 13, 27, 19); - Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage2, 2, 13); - gPokedexView->descriptionPageNum = 1; - (*(u16 *)(VRAM + 0x7ACA))++; - (*(u16 *)(VRAM + 0x7B0A))++; - PlaySE(SE_PIN); - } - else - { - Menu_EraseWindowRect(2, 13, 27, 19); - Menu_PrintText(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); - gPokedexView->descriptionPageNum = 0; - (*(u16 *)(VRAM + 0x7ACA))--; - (*(u16 *)(VRAM + 0x7B0A))--; - PlaySE(SE_PIN); - } - } -} - -const u8 *GetPokemonCategory(u16 dexNum) -{ - return gPokedexEntries[dexNum].categoryName; -} - -u16 GetPokedexHeightWeight(u16 dexNum, u8 data) -{ - switch (data) - { - case 0: // height - return gPokedexEntries[dexNum].height; - case 1: // weight - return gPokedexEntries[dexNum].weight; - default: - return 1; - } -} - -s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID) -{ - u8 index; - u8 bit; - u8 mask; - s8 retVal; - - nationalDexNo--; - index = nationalDexNo / 8; - bit = nationalDexNo % 8; - mask = 1 << bit; - retVal = 0; - switch (caseID) - { - case FLAG_GET_SEEN: - if (gSaveBlock2.pokedex.seen[index] & mask) - { - if ((gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.dexSeen2[index] & mask) - && (gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.dexSeen3[index] & mask)) - retVal = 1; - else - { - gSaveBlock2.pokedex.seen[index] &= ~mask; - gSaveBlock1.dexSeen2[index] &= ~mask; - gSaveBlock1.dexSeen3[index] &= ~mask; - retVal = 0; - } - } - break; - case FLAG_GET_CAUGHT: - if (gSaveBlock2.pokedex.owned[index] & mask) - { - if ((gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock2.pokedex.seen[index] & mask) - && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.dexSeen2[index] & mask) - && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.dexSeen3[index] & mask)) - retVal = 1; - else - { - gSaveBlock2.pokedex.owned[index] &= ~mask; - gSaveBlock2.pokedex.seen[index] &= ~mask; - gSaveBlock1.dexSeen2[index] &= ~mask; - gSaveBlock1.dexSeen3[index] &= ~mask; - retVal = 0; - } - } - break; - case FLAG_SET_SEEN: - gSaveBlock2.pokedex.seen[index] |= mask; - gSaveBlock1.dexSeen2[index] |= mask; - gSaveBlock1.dexSeen3[index] |= mask; - break; - case FLAG_SET_CAUGHT: - gSaveBlock2.pokedex.owned[index] |= mask; - break; - } - return retVal; -} - -u16 GetNationalPokedexCount(u8 caseID) -{ - u16 count = 0; - u16 i; - - for (i = 0; i < NATIONAL_DEX_COUNT; i++) - { - switch (caseID) - { - case FLAG_GET_SEEN: - if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) - count++; - break; - case FLAG_GET_CAUGHT: - if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) - count++; - break; - } - } - return count; -} - -u16 GetHoennPokedexCount(u8 caseID) -{ - u16 count = 0; - u16 i; - - for (i = 0; i < 202; i++) - { - switch (caseID) - { - case FLAG_GET_SEEN: - if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_SEEN)) - count++; - break; - case FLAG_GET_CAUGHT: - if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) - count++; - break; - } - } - return count; -} - -bool8 CompletedHoennPokedex(void) -{ - u16 i; - - for (i = 0; i < 200; i++) - { - if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) - return FALSE; - } - return TRUE; -} - -bool16 CompletedNationalPokedex(void) -{ - u16 i; - - // BUG: This function indexes pokemon checks by 0, but adds - // 1 before passing to GetSetPokedexFlag. Normally, this is - // fine, because GetSetPokedexFlag subtracts by 1 to get the - // array index value, but since the array is 0 indexed - // starting with Bulbasaur, values passed actually means that - // dex entries 152 (Chikorita) and 252 (Treecko) are skipped. - // Because an earlier Hoenn Dex check prevented Treecko from - // being skippable, it means that Chikorita is not required - // to obtain the National Diploma. This was fixed in Emerald. - for (i = 0; i < 150; i++) - { - if (GetSetPokedexFlag(i + 1, 1) == 0) - return FALSE; - } - for (i = 152; i < 250; i++) - { - if (GetSetPokedexFlag(i + 1, 1) == 0) - return FALSE; - } - for (i = 252; i < 384; i++) - { - if (GetSetPokedexFlag(i + 1, 1) == 0) - return FALSE; - } - return TRUE; -} - -static void sub_8091060(u16 a) -{ - if (!(a & 0x100)) - { - REG_DISPCNT &= 0xFEFF; - REG_BG0CNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - } - if (!(a & 0x200)) - { - REG_DISPCNT &= 0xFDFF; - REG_BG1CNT = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - } - if (!(a & 0x400)) - { - REG_DISPCNT &= 0xFBFF; - REG_BG2CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - } - if (!(a & 0x800)) - { - REG_DISPCNT &= 0xF7FF; - REG_BG3CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - } - if (!(a & 0x1000)) - { - REG_DISPCNT &= 0xEFFF; - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - } -} - -static void sub_8091154(u16 order, u8 b, u8 c) -{ - u8 str[4]; - - str[0] = CHAR_0 + order / 100; - str[1] = CHAR_0 + (order % 100) / 10; - str[2] = CHAR_0 + (order % 100) % 10; - str[3] = EOS; - Menu_PrintText(str, b, c); -} - -static u8 sub_80911C8(u16 num, u8 b, u8 c) -{ - u8 str[11]; - u8 i; - - for (i = 0; i < 11; i++) - str[i] = EOS; - num = NationalPokedexNumToSpecies(num); - switch (num) - { - default: - for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) - str[i] = gSpeciesNames[num][i]; - break; - case 0: - for (i = 0; i < 10; i++) - str[i] = 0xAE; - break; - } - Menu_PrintText(str, b, c); - return i; -} - -static u8 sub_8091260(u16 num, u8 b, u8 c, u8 d) -{ - u8 str[40]; - u8 *end; - u8 i; - - end = StringCopy(str, gUnknown_083B5558); - str[2] = d; - num = NationalPokedexNumToSpecies(num); - switch (num) - { - default: - for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) - end[i] = gSpeciesNames[num][i]; - break; - case 0: - for (i = 0; i < 10; i++) - end[i] = 0xAE; - break; - } - end[i] = EOS; - Menu_PrintText(str, b, c); - return i; -} - -static void sub_8091304(const u8 *name, u8 left, u8 top) -{ - u8 str[32]; - u8 i; -#if ENGLISH - u8 j; -#endif - - for (i = 0; name[i] != EOS && i < 11; i++) - str[i] = name[i]; -#if ENGLISH - for (j = 0; gDexText_UnknownPoke[j] == 0xAC || gDexText_UnknownPoke[j] == 0; j++) - ; - j--; - while (gDexText_UnknownPoke[j] != EOS) - str[i++] = gDexText_UnknownPoke[j++]; -#endif - str[i] = EOS; - sub_8072B80(str, left, top, gDexText_UnknownPoke); -} - -#if ENGLISH -void unref_sub_80913A4(u16 a, u8 left, u8 top) -{ - u8 str[6]; - bool8 outputted = FALSE; - u8 result; - - result = a / 1000; - if (result == 0) - { - str[0] = CHAR_SPACE; - outputted = FALSE; - } - else - { - str[0] = CHAR_0 + result; - outputted = TRUE; - } - - result = (a % 1000) / 100; - if (result == 0 && !outputted) - { - str[1] = CHAR_SPACE; - outputted = FALSE; - } - else - { - str[1] = CHAR_0 + result; - outputted = TRUE; - } - - str[2] = CHAR_0 + ((a % 1000) % 100) / 10; - str[3] = CHAR_PERIOD; - str[4] = CHAR_0 + ((a % 1000) % 100) % 10; - str[5] = EOS; - Menu_PrintText(str, left, top); -} -#elif GERMAN -void unref_sub_80913A4(u16 arg0, u8 left, u8 top) { - u8 buffer[8]; - int offset; - u8 result; - - u8 r6 = 0; - offset = 0; - - - buffer[r6++] = 0xFC; - buffer[r6++] = 0x13; - r6++; - - result = (arg0 / 1000); - if (result == 0) - { - offset = 6; - } - else - { - buffer[r6++] = result + CHAR_0; - } - - - result = (arg0 % 1000) / 100; - - if (result == 0 && offset != 0) - { - offset += 6; - } - else - { - buffer[r6++] = result + CHAR_0; - } - - buffer[r6++] = (((arg0 % 1000) % 100) / 10) + CHAR_0; - buffer[r6++] = CHAR_COMMA; - buffer[r6++] = (((arg0 % 1000) % 100) % 10) + CHAR_0; - - buffer[r6++] = EOS; - buffer[2] = offset; - Menu_PrintText(buffer, left, top); -} -#endif - -#ifdef UNITS_IMPERIAL -#define CHAR_PRIME (0xB4) -#define CHAR_DOUBLE_PRIME (0xB2) -static void sub_8091458(u16 height, u8 left, u8 top) -{ - u8 buffer[16]; - u32 inches, feet; - u8 i = 0; - - inches = (height * 10000) / 254; - if (inches % 10 >= 5) - inches += 10; - feet = inches / 120; - inches = (inches - (feet * 120)) / 10; - - buffer[i++] = EXT_CTRL_CODE_BEGIN; - buffer[i++] = 0x13; - if (feet / 10 == 0) - { - buffer[i++] = 18; - buffer[i++] = feet + CHAR_0; - } - else - { - buffer[i++] = 12; - buffer[i++] = feet / 10 + CHAR_0; - buffer[i++] = (feet % 10) + CHAR_0; - } - buffer[i++] = CHAR_PRIME; - buffer[i++] = (inches / 10) + CHAR_0; - buffer[i++] = (inches % 10) + CHAR_0; - buffer[i++] = CHAR_DOUBLE_PRIME; - buffer[i++] = EOS; - Menu_PrintText(buffer, left, top); -} -#else -static void sub_8091458(u16 height, u8 left, u8 top) -{ - unref_sub_80913A4(height, left, top); -} -#endif - -#ifdef UNITS_IMPERIAL -static void sub_8091564(u16 weight, u8 left, u8 top) -{ - u8 buffer[16]; - u32 lbs; - u8 i = 0; - bool8 output; - - lbs = (weight * 100000) / 4536; - if (lbs % 10 >= 5) - lbs += 10; - output = FALSE; - - buffer[i] = (lbs / 100000) + CHAR_0; - if (buffer[i] == CHAR_0 && output == FALSE) - { - buffer[i++] = CHAR_SPACE; - buffer[i++] = CHAR_SPACE; - } - else - { - output = TRUE; - i++; - } - - lbs = (lbs % 100000); - buffer[i] = (lbs / 10000) + CHAR_0; - if (buffer[i] == CHAR_0 && output == FALSE) - { - buffer[i++] = CHAR_SPACE; - buffer[i++] = CHAR_SPACE; - } - else - { - output = TRUE; - i++; - } - - lbs = (lbs % 10000); - buffer[i] = (lbs / 1000) + CHAR_0; - if (buffer[i] == CHAR_0 && output == FALSE) - { - buffer[i++] = CHAR_SPACE; - buffer[i++] = CHAR_SPACE; - } - else - { - output = TRUE; - i++; - } - lbs = (lbs % 1000); - buffer[i++] = (lbs / 100) + CHAR_0; - lbs = (lbs % 100); - buffer[i++] = CHAR_PERIOD; - buffer[i++] = (lbs / 10) + CHAR_0; - buffer[i++] = CHAR_SPACE; - buffer[i++] = CHAR_l; - buffer[i++] = CHAR_b; - buffer[i++] = CHAR_s; - buffer[i++] = CHAR_PERIOD; - buffer[i++] = EOS; - Menu_PrintText(buffer, left, top); -} -#else -static void sub_8091564(u16 arg0, u8 left, u8 top) -{ - unref_sub_80913A4(arg0, left, top); -} -#endif - -void sub_8091738(u16 num, u16 b, u16 c) -{ - u8 arr[0x80]; - u16 i; - u16 j; - const u8 *r12; - u16 r7; - u8 r3; - - r12 = sMonFootprintTable[NationalPokedexNumToSpecies(num)]; - for (r7 = 0, i = 0; i < 32; i++) - { - r3 = r12[i]; - for (j = 0; j < 4; j++) - { - u32 r1 = j * 2; - s32 r2 = (r3 >> r1) & 1; - - if (r3 & (2 << r1)) - r2 |= 0x10; - -// Needed to match -#ifndef NONMATCHING - asm("");asm("");asm("");asm("");asm(""); -#endif - - arr[r7] = r2; - r7++; - } - } - CpuCopy16(arr, (u16 *)(VRAM + b * 0x4000 + c * 0x20), 0x80); -} - -static void sub_80917CC(u16 a, u16 b) -{ - *(u16 *)(VRAM + a * 0x800 + 0x232) = 0xF000 + b + 0; - *(u16 *)(VRAM + a * 0x800 + 0x234) = 0xF000 + b + 1; - *(u16 *)(VRAM + a * 0x800 + 0x272) = 0xF000 + b + 2; - *(u16 *)(VRAM + a * 0x800 + 0x274) = 0xF000 + b + 3; -} - -static u16 sub_8091818(u8 a, u16 b, u16 c, u16 d) -{ - switch (a) - { - case 1: - if (b > c) - b--; - break; - case 0: - if (b < d) - b++; - break; - case 3: - if (b > c) - b--; - else - b = d; - break; - case 2: - if (b < d) - b++; - else - b = c; - break; - } - return b; -} - -static void nullsub_59(struct Sprite *sprite) -{ -} - -static void sub_8091878(u16 a, u8 b) -{ - gUnknown_02024E8C = gUnknown_083B57A4; - gUnknown_02024E8C.paletteTag = a; - gUnknown_02024E8C.images = gUnknown_083B5794[b]; - gUnknown_02024E8C.anims = gSpriteAnimTable_81E7C64; -} - -static void sub_80918B0(u16 a, u8 b) -{ - gUnknown_02024E8C = gUnknown_083B57A4; - gUnknown_02024E8C.paletteTag = a; - gUnknown_02024E8C.images = gUnknown_083B5794[b]; - gUnknown_02024E8C.anims = gUnknown_081EC2A4[0]; -} - -u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum) -{ - u8 spriteId; - - num = NationalPokedexNumToSpecies(num); - switch (num) - { - default: - DecompressPicFromTable_2( - &gMonFrontPicTable[num], - gMonFrontPicCoords[num].coords, - gMonFrontPicCoords[num].y_offset, - (void*)ewram_addr, - gUnknown_083B5584[paletteNum], - num); - break; - case SPECIES_SPINDA: - LoadSpecialPokePic( - &gMonFrontPicTable[num], - gMonFrontPicCoords[num].coords, - gMonFrontPicCoords[num].y_offset, - ewram_addr, - gUnknown_083B5584[paletteNum], - num, - gSaveBlock2.pokedex.spindaPersonality, - 1); - break; - case SPECIES_UNOWN: - LoadSpecialPokePic( - &gMonFrontPicTable[num], - gMonFrontPicCoords[num].coords, - gMonFrontPicCoords[num].y_offset, - ewram_addr, - gUnknown_083B5584[paletteNum], - num, - gSaveBlock2.pokedex.unownPersonality, - 1); - break; - } - LoadCompressedPalette(gMonPaletteTable[num].data, 0x100 + paletteNum * 16, 32); - sub_8091878(paletteNum, paletteNum); - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].oam.paletteNum = paletteNum; - return spriteId; -} - -u8 sub_8091A4C(u16 gender, s16 x, s16 y, u16 paletteNum) -{ - u8 spriteId; - - DecompressPicFromTable_2( - &gTrainerFrontPicTable[gender], - gTrainerFrontPicCoords[gender].coords, - gTrainerFrontPicCoords[gender].y_offset, - (void*)ewram_addr, - gUnknown_083B5584[0], - gender); - sub_80918B0(gender, 0); - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].oam.paletteNum = paletteNum; - return spriteId; -} - -int sub_8091AF8(u8 a, u8 b, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) -{ - u16 species; - u16 i; - u16 resultsCount; - u8 types[2]; - - SortPokedex(a, b); - - for (i = 0, resultsCount = 0; i < NATIONAL_DEX_COUNT; i++) - { - if (gPokedexView->unk0[i].seen) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - gPokedexView->pokemonListCount = resultsCount; - - // Search by name - if (abcGroup != 0xFF) - { - for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) - { - u8 r3; - - species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); - r3 = gSpeciesNames[species][0]; - if ((r3 >= gUnknown_083B57BC[abcGroup][0] && r3 < gUnknown_083B57BC[abcGroup][0] + gUnknown_083B57BC[abcGroup][1]) - || (r3 >= gUnknown_083B57BC[abcGroup][2] && r3 < gUnknown_083B57BC[abcGroup][2] + gUnknown_083B57BC[abcGroup][3])) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - gPokedexView->pokemonListCount = resultsCount; - } - - // Search by body color - if (bodyColor != 0xFF) - { - for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) - { - species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); - - if (bodyColor == gBaseStats[species].bodyColor) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - gPokedexView->pokemonListCount = resultsCount; - } - - // Search by type - if (type1 != 0xFF || type2 != 0xFF) - { - if (type1 == 0xFF) - { - type1 = type2; - type2 = 0xFF; - } - - if (type2 == 0xFF) - { - for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) - { - if (gPokedexView->unk0[i].owned) - { - species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); - - types[0] = gBaseStats[species].type1; - types[1] = gBaseStats[species].type2; - if (types[0] == type1 || types[1] == type1) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - } - } - else - { - for (i = 0, resultsCount = 0; i < gPokedexView->pokemonListCount; i++) - { - if (gPokedexView->unk0[i].owned) - { - species = NationalPokedexNumToSpecies(gPokedexView->unk0[i].dexNum); - - types[0] = gBaseStats[species].type1; - types[1] = gBaseStats[species].type2; - if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) - { - gPokedexView->unk0[resultsCount] = gPokedexView->unk0[i]; - resultsCount++; - } - } - } - } - gPokedexView->pokemonListCount = resultsCount; - } - - if (gPokedexView->pokemonListCount != 0) - { - for (i = gPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) - { - gPokedexView->unk0[i].dexNum = 0xFFFF; - gPokedexView->unk0[i].seen = FALSE; - gPokedexView->unk0[i].owned = FALSE; - - } - } - - return resultsCount; -} - -#if ENGLISH -#define SUB_8091E20_WIDTH (208) -#elif GERMAN -#define SUB_8091E20_WIDTH (216) -#endif - -void sub_8091E20(const u8 *str) -{ - sub_8072AB0(str, 9, 120, SUB_8091E20_WIDTH, 32, 1); -} - -u8 sub_8091E3C(void) -{ - return CreateTask(sub_8091E54, 0); -} - -static void sub_8091E54(u8 taskId) -{ - u16 i; - - switch (gMain.state) - { - default: - case 0: - if (!gPaletteFade.active) - { - gPokedexView->unk64A = 2; - sub_8091060(0); - LZ77UnCompVram(gPokedexMenuSearch_Gfx, (void *)VRAM); - LZ77UnCompVram(gUnknown_08E96D2C, (void *)(VRAM + 0x7800)); - LoadPalette(gPokedexMenuSearch_Pal + 1, 1, 0x7E); - if (!IsNationalPokedexEnabled()) - { - for (i = 0; i < 17; i++) - { - ((u16 *)(VRAM + 0x7A80))[i] = ((u16 *)(VRAM + 0x7B00))[i]; - ((u16 *)(VRAM + 0x7AC0))[i] = ((u16 *)(VRAM + 0x7B40))[i]; - ((u16 *)(VRAM + 0x7B00))[i] = 1; - ((u16 *)(VRAM + 0x7B40))[i] = 1; - } - } - gMain.state = 1; - } - break; - case 1: - Text_LoadWindowTemplate(&gWindowTemplate_81E7064); - InitMenuWindow(&gWindowTemplate_81E7064); - LoadCompressedObjectPic(&gUnknown_083A05CC[0]); - LoadSpritePalettes(gUnknown_083A05DC); - sub_809308C(taskId); - for (i = 0; i < 16; i++) - gTasks[taskId].data[i] = 0; - sub_8092EB0(taskId); - sub_8092AB0(0); - sub_8092B68(taskId); - gMain.state++; - break; - case 2: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - gMain.state++; - break; - case 3: - REG_BG3CNT = 0x0F03; - REG_DISPCNT = 0x1C40; - gMain.state++; - break; - case 4: - if (!gPaletteFade.active) - { - gTasks[taskId].func = sub_809204C; - gMain.state = 0; - } - break; - } -} - -static void sub_809204C(u8 taskId) -{ - sub_8092AB0(gTasks[taskId].data[0]); - sub_8092B68(taskId); - gTasks[taskId].func = sub_809207C; -} - -static void sub_809207C(u8 taskId) -{ - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_PC_OFF); - gTasks[taskId].func = sub_80927B8; - return; - } - if (gMain.newKeys & A_BUTTON) - { - switch (gTasks[taskId].data[0]) - { - case 0: - PlaySE(SE_PIN); - gTasks[taskId].data[1] = 0; - gTasks[taskId].func = sub_809217C; - break; - case 1: - PlaySE(SE_PIN); - gTasks[taskId].data[1] = 4; - gTasks[taskId].func = sub_809217C; - break; - case 2: - PlaySE(SE_PC_OFF); - gTasks[taskId].func = sub_80927B8; - break; - } - return; - } - if ((gMain.newKeys & DPAD_LEFT) && gTasks[taskId].data[0] > 0) - { - PlaySE(SE_Z_PAGE); - gTasks[taskId].data[0]--; - sub_8092AB0(gTasks[taskId].data[0]); - } - if ((gMain.newKeys & DPAD_RIGHT) && gTasks[taskId].data[0] < 2) - { - PlaySE(SE_Z_PAGE); - gTasks[taskId].data[0]++; - sub_8092AB0(gTasks[taskId].data[0]); - } -} - -static void sub_809217C(u8 taskId) -{ - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - sub_8092B68(taskId); - gTasks[taskId].func = sub_80921B0; -} - -static void sub_80921B0(u8 taskId) -{ - const u8 (*r6)[4]; - - if (gTasks[taskId].data[0] != 0) - { - if (!IsNationalPokedexEnabled()) - r6 = gUnknown_083B58A4; - else - r6 = gUnknown_083B586C; - } - else - { - if (!IsNationalPokedexEnabled()) - r6 = gUnknown_083B5888; - else - r6 = gUnknown_083B5850; - } - - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_BOWA); - sub_8092EB0(taskId); - gTasks[taskId].func = sub_809204C; - return; - } - if (gMain.newKeys & A_BUTTON) - { - if (gTasks[taskId].data[1] == 6) - { - if (gTasks[taskId].data[0] != 0) - { - gUnknown_0202FFBA = 0x40; - gPokedexView->unk62A = 0x40; - gUnknown_0202FFB8 = 0; - gPokedexView->unk610 = 0; - gSaveBlock2.pokedex.unknown1 = sub_8092E10(taskId, 5); - if (!IsNationalPokedexEnabled()) - gSaveBlock2.pokedex.unknown1 = 0; - gPokedexView->unk614 = gSaveBlock2.pokedex.unknown1; - gSaveBlock2.pokedex.order = sub_8092E10(taskId, 4); - gPokedexView->unk618 = gSaveBlock2.pokedex.order; - PlaySE(SE_PC_OFF); - gTasks[taskId].func = sub_80927B8; - } - else - { - sub_8091E20(gDexText_Searching); - gTasks[taskId].func = sub_80923FC; - PlaySE(SE_Z_SEARCH); - } - } - else - { - PlaySE(SE_PIN); - gTasks[taskId].func = sub_80925CC; - } - return; - } - - if ((gMain.newKeys & DPAD_LEFT) && r6[gTasks[taskId].data[1]][0] != 0xFF) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][0]; - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - } - if ((gMain.newKeys & DPAD_RIGHT) && r6[gTasks[taskId].data[1]][1] != 0xFF) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][1]; - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - } - if ((gMain.newKeys & DPAD_UP) && r6[gTasks[taskId].data[1]][2] != 0xFF) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][2]; - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - } - if ((gMain.newKeys & DPAD_DOWN) && r6[gTasks[taskId].data[1]][3] != 0xFF) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][3]; - sub_8092AD4(gTasks[taskId].data[0], gTasks[taskId].data[1]); - } -} - -static void sub_80923FC(u8 taskId) -{ - u8 r10 = sub_8092E10(taskId, 5); - u8 r9 = sub_8092E10(taskId, 4); - u8 r8 = sub_8092E10(taskId, 0); - u8 r6 = sub_8092E10(taskId, 1); - u8 r4 = sub_8092E10(taskId, 2); - u8 r0 = sub_8092E10(taskId, 3); - - sub_8091AF8(r10, r9, r8, r6, r4, r0); - gTasks[taskId].func = sub_80924A4; -} - -static void sub_80924A4(u8 taskId) -{ - if (!IsSEPlaying()) - { - if (gPokedexView->pokemonListCount != 0) - { - PlaySE(SE_SEIKAI); - sub_8091E20(gDexText_SearchComplete); - } - else - { - PlaySE(SE_HAZURE); - sub_8091E20(gDexText_NoMatching); - } - gTasks[taskId].func = sub_8092508; - } -} - -static void sub_8092508(u8 taskId) -{ - if (gMain.newKeys & A_BUTTON) - { - if (gPokedexView->pokemonListCount != 0) - { - gPokedexView->unk64F = 1; - gPokedexView->dexMode = sub_8092E10(taskId, 5); - gPokedexView->dexOrder = sub_8092E10(taskId, 4); - gTasks[taskId].func = sub_80927B8; - PlaySE(SE_PC_OFF); - } - else - { - gTasks[taskId].func = sub_809217C; - PlaySE(SE_BOWA); - } - } -} - -static void sub_80925B4(u16 a, int unused) -{ - MenuCursor_SetPos814AD7C(0x90, (a * 2 + 1) * 8); -} - -static void sub_80925CC(u8 taskId) -{ - u8 r0; - u16 *p1; - u16 *p2; - - sub_8092C8C(0); - r0 = gTasks[taskId].data[1]; - p1 = &gTasks[taskId].data[gUnknown_083B5A7C[r0].unk4]; - p2 = &gTasks[taskId].data[gUnknown_083B5A7C[r0].unk5]; - gTasks[taskId].data[14] = *p1; - gTasks[taskId].data[15] = *p2; - sub_8092D78(taskId); - CreateBlendedOutlineCursor(16, 0xFFFF, 12, 0x2D9F, 11); - sub_80925B4(*p1, 1); - gTasks[taskId].func = sub_8092644; -} - -static void sub_8092644(u8 taskId) -{ - u8 r1; - const struct UnknownStruct2 *r8; - u16 *p1; - u16 *p2; - u16 r2; - bool8 r3; - - r1 = gTasks[taskId].data[1]; - r8 = gUnknown_083B5A7C[r1].unk0; - p1 = &gTasks[taskId].data[gUnknown_083B5A7C[r1].unk4]; - p2 = &gTasks[taskId].data[gUnknown_083B5A7C[r1].unk5]; - r2 = gUnknown_083B5A7C[r1].unk6 - 1; - if (gMain.newKeys & A_BUTTON) - { - sub_814ADC8(); - PlaySE(SE_PIN); - Menu_EraseWindowRect(18, 1, 28, 12); - sub_8092C8C(1); - gTasks[taskId].func = sub_809217C; - return; - } - if (gMain.newKeys & B_BUTTON) - { - sub_814ADC8(); - PlaySE(SE_BOWA); - Menu_EraseWindowRect(18, 1, 28, 12); - sub_8092C8C(1); - *p1 = gTasks[taskId].data[14]; - *p2 = gTasks[taskId].data[15]; - gTasks[taskId].func = sub_809217C; - return; - } - r3 = FALSE; - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (*p1 != 0) - { - sub_80925B4(*p1, 0); - (*p1)--; - sub_80925B4(*p1, 1); - r3 = TRUE; - } - else if (*p2 != 0) - { - (*p2)--; - sub_8092D78(taskId); - sub_80925B4(*p1, 1); - r3 = TRUE; - } - if (r3) - { - PlaySE(SE_SELECT); - sub_8091E20(r8[*p1 + *p2].text1); - } - return; - } - if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (*p1 < 5 && *p1 < r2) - { - sub_80925B4(*p1, 0); - (*p1)++; - sub_80925B4(*p1, 1); - r3 = TRUE; - } - else if (r2 > 5 && *p2 < r2 - 5) - { - (*p2)++; - sub_8092D78(taskId); - sub_80925B4(5, 1); - r3 = TRUE; - } - if (r3) - { - PlaySE(SE_SELECT); - sub_8091E20(r8[*p1 + *p2].text1); - } - return; - } -} - -static void sub_80927B8(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_80927F0; -} - -static void sub_80927F0(u8 taskId) -{ - if (!gPaletteFade.active) - DestroyTask(taskId); -} - -#ifdef NONMATCHING -void sub_8092810(u8 a, u8 b, u8 c, u8 d) -{ - u16 i; - - for (i = 0; i < d; i++) - { - ((u16 *)VRAM)[15 * 0x400 + c * 32 + i + b] &= 0xFFF; - ((u16 *)VRAM)[15 * 0x400 + c * 32 + i + b] |= a << 12; - - ((u16 *)VRAM)[15 * 0x400 + (c + 1) * 32 + i + b] &= 0xFFF; - ((u16 *)VRAM)[15 * 0x400 + (c + 1) * 32 + i + b] |= a << 12; - } -} -#else -__attribute__((naked)) -void sub_8092810(u8 a, u8 b, u8 c, u8 d) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r12, r1\n\ - lsls r2, 24\n\ - lsrs r1, r2, 24\n\ - lsls r3, 24\n\ - lsrs r5, r3, 8\n\ - movs r3, 0\n\ - cmp r5, 0\n\ - beq _0809285A\n\ - lsls r7, r1, 6\n\ - ldr r6, _08092860 @ =0x00000fff\n\ - lsls r4, r0, 12\n\ -_08092830:\n\ - mov r0, r12\n\ - adds r1, r0, r3\n\ - lsls r1, 1\n\ - adds r1, r7, r1\n\ - ldr r0, _08092864 @ =0x06007800\n\ - adds r2, r1, r0\n\ - ldrh r0, [r2]\n\ - ands r0, r6\n\ - orrs r0, r4\n\ - strh r0, [r2]\n\ - ldr r0, _08092868 @ =0x06007840\n\ - adds r1, r0\n\ - ldrh r0, [r1]\n\ - ands r0, r6\n\ - orrs r0, r4\n\ - strh r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r0, r5\n\ - bcc _08092830\n\ -_0809285A:\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08092860: .4byte 0x00000fff\n\ -_08092864: .4byte 0x06007800\n\ -_08092868: .4byte 0x06007840\n\ - .syntax divided\n"); -} -#endif - -static void sub_809286C(u8 a, u8 b, u8 c) -{ - u8 r5 = (b & 1) | ((c & 1) << 1); - - switch (a) - { - case 0: - case 1: - case 2: - sub_8092810(r5, gUnknown_083B57E4[a].unk4, gUnknown_083B57E4[a].unk5, gUnknown_083B57E4[a].unk6); - break; - case 3: - case 4: - case 7: - case 8: - sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5, gUnknown_083B57FC[a - 3].unk6); - // fall through - case 5: - case 6: - sub_8092810(r5, gUnknown_083B57FC[a - 3].unk7, gUnknown_083B57FC[a - 3].unk8, gUnknown_083B57FC[a - 3].unk9); - break; - case 10: - sub_8092810(r5, gUnknown_083B57FC[2].unk4, gUnknown_083B57FC[2].unk5, gUnknown_083B57FC[2].unk6); - break; - case 9: - if (!IsNationalPokedexEnabled()) - sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5 - 2, gUnknown_083B57FC[a - 3].unk6); - else - sub_8092810(r5, gUnknown_083B57FC[a - 3].unk4, gUnknown_083B57FC[a - 3].unk5, gUnknown_083B57FC[a - 3].unk6); - break; - } -} - -static void sub_8092964(u8 a) -{ - switch (a) - { - case 0: - sub_809286C(0, 0, 0); - sub_809286C(1, 1, 0); - sub_809286C(2, 1, 0); - sub_809286C(3, 1, 0); - sub_809286C(4, 1, 0); - sub_809286C(10, 1, 0); - sub_809286C(5, 1, 0); - sub_809286C(6, 1, 0); - sub_809286C(7, 1, 0); - sub_809286C(8, 1, 0); - sub_809286C(9, 1, 0); - break; - case 1: - sub_809286C(0, 1, 0); - sub_809286C(1, 0, 0); - sub_809286C(2, 1, 0); - sub_809286C(3, 1, 1); - sub_809286C(4, 1, 1); - sub_809286C(10, 1, 1); - sub_809286C(5, 1, 1); - sub_809286C(6, 1, 1); - sub_809286C(7, 1, 0); - sub_809286C(8, 1, 0); - sub_809286C(9, 1, 0); - break; - case 2: - sub_809286C(0, 1, 0); - sub_809286C(1, 1, 0); - sub_809286C(2, 0, 0); - sub_809286C(3, 1, 1); - sub_809286C(4, 1, 1); - sub_809286C(10, 1, 1); - sub_809286C(5, 1, 1); - sub_809286C(6, 1, 1); - sub_809286C(7, 1, 1); - sub_809286C(8, 1, 1); - sub_809286C(9, 1, 1); - break; - } -} - -static void sub_8092AB0(u8 a) -{ - sub_8092964(a); - sub_8091E20(gUnknown_083B57E4[a].text); -} - -static void sub_8092AD4(u8 a, u8 b) -{ - sub_8092964(a); - switch (b) - { - case 0: - sub_809286C(3, 0, 0); - break; - case 1: - sub_809286C(4, 0, 0); - break; - case 2: - sub_809286C(10, 0, 0); - sub_809286C(5, 0, 0); - break; - case 3: - sub_809286C(10, 0, 0); - sub_809286C(6, 0, 0); - break; - case 4: - sub_809286C(7, 0, 0); - break; - case 5: - sub_809286C(8, 0, 0); - break; - case 6: - sub_809286C(9, 0, 0); - break; - } - sub_8091E20(gUnknown_083B57FC[b].text); -} - -static void sub_8092B68(u8 taskId) -{ - u16 var; - - var = gTasks[taskId].data[6] + gTasks[taskId].data[7]; - StringCopy(gStringVar1, gUnknown_083B5910[var].text2); - Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 16, 1); - - var = gTasks[taskId].data[8] + gTasks[taskId].data[9]; - StringCopy(gStringVar1, gUnknown_083B5968[var].text2); - Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 32, 1); - - var = gTasks[taskId].data[10] + gTasks[taskId].data[11]; - StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); - Menu_PrintTextPixelCoords(gUnknown_083B5AAC, 45, 48, 1); - - var = gTasks[taskId].data[12] + gTasks[taskId].data[13]; - StringCopy(gStringVar1, gUnknown_083B59C8[var].text2); - Menu_PrintTextPixelCoords(gUnknown_083B5AAC, 93, 48, 1); - - var = gTasks[taskId].data[4] + gTasks[taskId].data[5]; - StringCopy(gStringVar1, gUnknown_083B58D8[var].text2); - Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 64, 1); - - if (IsNationalPokedexEnabled()) - { - var = gTasks[taskId].data[2] + gTasks[taskId].data[3]; - StringCopy(gStringVar1, gUnknown_083B58C0[var].text2); - Menu_PrintTextPixelCoords(gUnknown_083B5AB2, 45, 80, 1); - } -} - -static void sub_8092C8C(u8 a) -{ - u16 i; - u16 j; - - if (a == 0) - { - *((u16 *)(VRAM + 0x7800 + 0x22)) = 0xC0B; - for (i = 0x12; i < 0x1D; i++) - *((u16 *)(VRAM + 0x7800 + i * 2)) = 0x80D; - *((u16 *)(VRAM + 0x7800 + 0x3A)) = 0x80B; - for (j = 1; j < 13; j++) - { - *((u16 *)(VRAM + 0x7800 + 0x22 + j * 64)) = 0x40A; - for (i = 0x12; i < 0x1D; i++) - *((u16 *)(VRAM + 0x7800 + j * 64 + i * 2)) = 2; - *((u16 *)(VRAM + 0x7800 + 0x3A + j * 64)) = 0xA; - } - *((u16 *)(VRAM + 0x7800 + 0x362)) = 0x40B; - for (i = 0x12; i < 0x1D; i++) - *((u16 *)(VRAM + 0x7800 + 0x340 + i * 2)) = 0xD; - *((u16 *)(VRAM + 0x7800 + 0x37A)) = 0xB; - } - else - { - for (j = 0; j < 14; j++) - { - for (i = 0x11; i < 0x1E; i++) - { - *((u16 *)(VRAM + 0x7800 + j * 64 + i * 2)) = 0x4F; - } - } - } -} - -static void sub_8092D78(u8 taskId) -{ - const struct UnknownStruct2 *r6 = gUnknown_083B5A7C[gTasks[taskId].data[1]].unk0; - const u16 *r8 = &gTasks[taskId].data[gUnknown_083B5A7C[gTasks[taskId].data[1]].unk4]; - const u16 *r7 = &gTasks[taskId].data[gUnknown_083B5A7C[gTasks[taskId].data[1]].unk5]; - u16 i; - u16 j; - - Menu_EraseWindowRect(18, 1, 28, 12); - for (i = 0, j = *r7; i < 6 && r6[j].text2 != NULL; i++, j++) - { -#ifndef NONMATCHING - j += 0; // Useless statement needed to match -#endif - Menu_PrintText(r6[j].text2, 18, i * 2 + 1); - } - sub_8091E20(r6[*r8 + *r7].text1); -} - -static u8 sub_8092E10(u8 taskId, u8 b) -{ - const u16 *ptr1 = &gTasks[taskId].data[gUnknown_083B5A7C[b].unk4]; - const u16 *ptr2 = &gTasks[taskId].data[gUnknown_083B5A7C[b].unk5]; - u16 r2 = *ptr1 + *ptr2; - - switch (b) - { - default: - return 0; - case 5: - return gUnknown_083B5A60[r2]; - case 4: - return gUnknown_083B5A62[r2]; - case 0: - if (r2 == 0) - return 0xFF; - else - return r2; - case 1: - if (r2 == 0) - return 0xFF; - else - return r2 - 1; - case 2: - case 3: - return gUnknown_083B5A68[r2]; - } -} - -static void sub_8092EB0(u8 taskId) -{ - u16 r3; - - switch (gPokedexView->unk614) - { - default: - case 0: - r3 = 0; - break; - case 1: - r3 = 1; - break; - } - gTasks[taskId].data[2] = r3; - - switch (gPokedexView->unk618) - { - default: - case 0: - r3 = 0; - break; - case 1: - r3 = 1; - break; - case 2: - r3 = 2; - break; - case 3: - r3 = 3; - break; - case 4: - r3 = 4; - break; - case 5: - r3 = 5; - break; - } - gTasks[taskId].data[4] = r3; -} - -static bool8 sub_8092F44(u8 taskId) -{ - u8 val1 = gTasks[taskId].data[1]; - const u16 *ptr = &gTasks[taskId].data[gUnknown_083B5A7C[val1].unk5]; - u16 val2 = gUnknown_083B5A7C[val1].unk6 - 1; - - if (val2 > 5 && *ptr != 0) - return FALSE; - else - return TRUE; -} - -static bool8 sub_8092F8C(u8 taskId) -{ - u8 val1 = gTasks[taskId].data[1]; - const u16 *ptr = &gTasks[taskId].data[gUnknown_083B5A7C[val1].unk5]; - u16 val2 = gUnknown_083B5A7C[val1].unk6 - 1; - - if (val2 > 5 && *ptr < val2 - 5) - return FALSE; - else - return TRUE; -} - -static void sub_8092FD8(struct Sprite *sprite) -{ - if (gTasks[sprite->data[0]].func == sub_8092644) - { - u8 val; - - if (sprite->data[1] != 0) - { - if (sub_8092F8C(sprite->data[0])) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - } - else - { - if (sub_8092F44(sprite->data[0])) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - } - val = sprite->data[2] + sprite->data[1] * 128; - sprite->pos2.y = gSineTable[val] / 128; - sprite->data[2] += 8; - } - else - { - sprite->invisible = TRUE; - } -} - -static void sub_809308C(u8 taskId) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].callback = sub_8092FD8; - - spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 108, 0); - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = 1; - gSprites[spriteId].vFlip = TRUE; - gSprites[spriteId].callback = sub_8092FD8; -} diff --git a/src/pokemon/pokedex_cry_screen.c b/src/pokemon/pokedex_cry_screen.c deleted file mode 100644 index 912b9aabd..000000000 --- a/src/pokemon/pokedex_cry_screen.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "global.h" -#include "pokedex_cry_screen.h" -#include "palette.h" -#include "sprite.h" -#include "ewram.h" - -struct Unk201C800 { - u8 unk_0; - u8 unk_1; - u8 unk_2; - u8 filler_3; - u16 unk_4; -}; - -extern u8 gUnknown_03005E98; - -// data/pokedex_cry_screen.o -extern const u16 gUnknown_083FAE7C[]; -extern const u16 gUnknown_083FAF1C[]; -extern const u8 gUnknown_083FAF3C[]; -extern struct SpriteTemplate gSpriteTemplate_83FB774; -extern const struct SpriteSheet gCryMeterNeedleSpriteSheets[]; -extern const struct SpritePalette gCryMeterNeedleSpritePalettes[]; - -#if ENGLISH -#define CRY_METER_MAP_WIDTH 10 -#elif GERMAN -#define CRY_METER_MAP_WIDTH 32 -#endif - -u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { - int returnVal = FALSE; - - switch (gUnknown_03005E98) - { - case 0: - LZ77UnCompVram(gUnknown_083FAF3C, (void *) (VRAM + cry->unk0)); - LoadPalette(&gUnknown_083FAF1C, cry->paletteNo * 16, 0x20); - gUnknown_03005E98 += 1; - break; - - case 1: - { - void *vram; - u8 row, col; - u32 r12; - int x, y; - - vram = BG_SCREEN_ADDR(cry->unk2); - - r12 = (u32) (cry->unk0 << 18) >> 23; - - for (row = 0; row < 8; row++) - { - for (col = 0; col < 10; col++) - { - y = row + cry->yPos; - x = col + cry->xPos; - *(u16 *) (vram + (y * 64 + x * 2)) = (gUnknown_083FAE7C[row * CRY_METER_MAP_WIDTH + col] | (cry->paletteNo << 12)) + r12; - } - } - - gUnknown_03005E98 += 1; - break; - } - - case 2: - { - LoadSpriteSheets(gCryMeterNeedleSpriteSheets); - LoadSpritePalettes(gCryMeterNeedleSpritePalettes); - EWRAM_1C800.unk_4 = CreateSprite(&gSpriteTemplate_83FB774, 40 + cry->xPos * 8, 56 + cry->yPos * 8, 1); - EWRAM_1C800.unk_0 = 0x20; - EWRAM_1C800.unk_1 = 0x20; - EWRAM_1C800.unk_2 = 0; - - returnVal = TRUE; - break; - } - } - - return returnVal; -} diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c deleted file mode 100644 index 80d245b52..000000000 --- a/src/pokemon/pokemon_1.c +++ /dev/null @@ -1,774 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "constants/abilities.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "constants/species.h" -#include "main.h" -#include "pokemon.h" -#include "random.h" -#include "overworld.h" -#include "sprite.h" -#include "string_util.h" -#include "trainer.h" -#include "text.h" -#include "ewram.h" - -//Extracts the upper 16 bits of a 32-bit number -#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) - -//Extracts the lower 16 bits of a 32-bit number -#define LOHALF(n) ((n) & 0xFFFF) - -extern u16 gMoveToLearn; - -static EWRAM_DATA u8 sLearningMoveTableID = 0; - -u8 gPlayerPartyCount; -struct Pokemon gPlayerParty[6]; -u8 gEnemyPartyCount; -struct Pokemon gEnemyParty[6]; - -const u16 gSpeciesToHoennPokedexNum[] = {203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 156, 157, 112, 113, 227, 228, 229, 230, 231, 232, 233, 234, 153, 154, 138, 139, 63, 64, 88, 89, 90, 235, 236, 237, 238, 239, 240, 241, 242, 158, 159, 243, 244, 245, 246, 247, 248, 249, 39, 40, 41, 73, 74, 75, 250, 251, 252, 66, 67, 57, 58, 59, 253, 254, 255, 256, 82, 83, 257, 92, 93, 258, 259, 106, 107, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 84, 85, 270, 271, 272, 273, 274, 275, 276, 108, 109, 169, 170, 277, 278, 279, 184, 185, 50, 51, 143, 144, 280, 281, 282, 283, 284, 167, 285, 52, 53, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 65, 181, 182, 155, 324, 137, 325, 326, 162, 163, 327, 328, 329, 91, 55, 56, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 161, 164, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 168, 357, 358, 359, 103, 104, 360, 361, 180, 362, 363, 364, 365, 115, 366, 367, 186, 165, 166, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 42, 43, 44, 25, 26, 34, 35, 114, 27, 28, 32, 33, 99, 100, 61, 62, 145, 131, 132, 60, 105, 68, 127, 128, 183, 129, 130, 140, 141, 97, 98, 116, 117, 118, 48, 49, 78, 79, 101, 102, 173, 174, 175, 119, 120, 171, 172, 125, 126, 54, 110, 111, 80, 81, 69, 76, 77, 121, 122, 160, 148, 149, 94, 36, 37, 38, 95, 96, 150, 45, 46, 47, 176, 177, 178, 152, 146, 147, 124, 123, 179, 70, 71, 72, 142, 86, 87, 133, 134, 135, 136, 29, 30, 31, 187, 188, 189, 190, 191, 192, 193, 194, 195, 198, 199, 200, 196, 197, 201, 202, 151}; -const u16 gSpeciesToNationalPokedexNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 290, 291, 292, 276, 277, 285, 286, 327, 278, 279, 283, 284, 320, 321, 300, 301, 352, 343, 344, 299, 324, 302, 339, 340, 370, 341, 342, 349, 350, 318, 319, 328, 329, 330, 296, 297, 309, 310, 322, 323, 363, 364, 365, 331, 332, 361, 362, 337, 338, 298, 325, 326, 311, 312, 303, 307, 308, 333, 334, 360, 355, 356, 315, 287, 288, 289, 316, 317, 357, 293, 294, 295, 366, 367, 368, 359, 353, 354, 336, 335, 369, 304, 305, 306, 351, 313, 314, 345, 346, 347, 348, 280, 281, 282, 371, 372, 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, 380, 381, 385, 386, 358}; -const u16 gHoennToNationalOrder[] = {252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 63, 64, 65, 290, 291, 292, 293, 294, 295, 296, 297, 118, 119, 129, 130, 298, 183, 184, 74, 75, 76, 299, 300, 301, 41, 42, 169, 72, 73, 302, 303, 304, 305, 306, 66, 67, 68, 307, 308, 309, 310, 311, 312, 81, 82, 100, 101, 313, 314, 43, 44, 45, 182, 84, 85, 315, 316, 317, 318, 319, 320, 321, 322, 323, 218, 219, 324, 88, 89, 109, 110, 325, 326, 27, 28, 327, 227, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 174, 39, 40, 349, 350, 351, 120, 121, 352, 353, 354, 355, 356, 357, 358, 359, 37, 38, 172, 25, 26, 54, 55, 360, 202, 177, 178, 203, 231, 232, 127, 214, 111, 112, 361, 362, 363, 364, 365, 366, 367, 368, 369, 222, 170, 171, 370, 116, 117, 230, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 56, 57, 58, 59, 60, 61, 62, 69, 70, 71, 77, 78, 79, 80, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 122, 123, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 173, 175, 176, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 220, 221, 223, 224, 225, 226, 228, 229, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411}; - -const struct SpindaSpot gSpindaSpotGraphics[] = -{ - {16, 14, INCBIN_U16("graphics/spinda_spots/spot_0.bin")}, - {40, 15, INCBIN_U16("graphics/spinda_spots/spot_1.bin")}, - {22, 32, INCBIN_U16("graphics/spinda_spots/spot_2.bin")}, - {34, 33, INCBIN_U16("graphics/spinda_spots/spot_3.bin")} -}; - -#include "../data/pokemon/item_effects.h" - -const s8 gNatureStatTable[][5] = -{ - // Atk Def Spd Sp.Atk Sp.Def - { 0, 0, 0, 0, 0}, // Hardy - { +1, -1, 0, 0, 0}, // Lonely - { +1, 0, -1, 0, 0}, // Brave - { +1, 0, 0, -1, 0}, // Adamant - { +1, 0, 0, 0, -1}, // Naughty - { -1, +1, 0, 0, 0}, // Bold - { 0, 0, 0, 0, 0}, // Docile - { 0, +1, -1, 0, 0}, // Relaxed - { 0, +1, 0, -1, 0}, // Impish - { 0, +1, 0, 0, -1}, // Lax - { -1, 0, +1, 0, 0}, // Timid - { 0, -1, +1, 0, 0}, // Hasty - { 0, 0, 0, 0, 0}, // Serious - { 0, 0, +1, -1, 0}, // Jolly - { 0, 0, +1, 0, -1}, // Naive - { -1, 0, 0, +1, 0}, // Modest - { 0, -1, 0, +1, 0}, // Mild - { 0, 0, -1, +1, 0}, // Quiet - { 0, 0, 0, 0, 0}, // Bashful - { 0, 0, 0, +1, -1}, // Rash - { -1, 0, 0, 0, +1}, // Calm - { 0, -1, 0, 0, +1}, // Gentle - { 0, 0, -1, 0, +1}, // Sassy - { 0, 0, 0, -1, +1}, // Careful - { 0, 0, 0, 0, 0} // Quirky -}; - -#include "../data/pokemon/tmhm_learnsets.h" -#include "../data/pokemon/trainer_class_lookups.h" -#include "../data/pokemon/cry_ids.h" -#include "../data/pokemon/experience_tables.h" -#include "../data/pokemon/base_stats.h" -#include "../data/pokemon/level_up_learnsets.h" -#include "../data/pokemon/evolution.h" -#include "../data/pokemon/level_up_learnset_pointers.h" - -void ZeroBoxMonData(struct BoxPokemon *boxMon) -{ - u8 *raw = (u8 *)boxMon; - u32 i; - for (i = 0; i < sizeof(struct BoxPokemon); i++) - raw[i] = 0; -} - -void ZeroMonData(struct Pokemon *mon) -{ - u32 arg; - ZeroBoxMonData(&mon->box); - arg = 0; - SetMonData(mon, MON_DATA_STATUS, &arg); - SetMonData(mon, MON_DATA_LEVEL, &arg); - SetMonData(mon, MON_DATA_HP, &arg); - SetMonData(mon, MON_DATA_MAX_HP, &arg); - SetMonData(mon, MON_DATA_ATK, &arg); - SetMonData(mon, MON_DATA_DEF, &arg); - SetMonData(mon, MON_DATA_SPEED, &arg); - SetMonData(mon, MON_DATA_SPATK, &arg); - SetMonData(mon, MON_DATA_SPDEF, &arg); - arg = 255; - SetMonData(mon, MON_DATA_MAIL, &arg); -} - -void ZeroPlayerPartyMons(void) -{ - s32 i; - for (i = 0; i < 6; i++) - ZeroMonData(&gPlayerParty[i]); -} - -void ZeroEnemyPartyMons(void) -{ - s32 i; - for (i = 0; i < 6; i++) - ZeroMonData(&gEnemyParty[i]); -} - -void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) -{ - u32 arg; - - ZeroMonData(mon); - CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); - SetMonData(mon, MON_DATA_LEVEL, &level); - arg = 255; - SetMonData(mon, MON_DATA_MAIL, &arg); - CalculateMonStats(mon); -} - -void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) -{ - u8 speciesName[POKEMON_NAME_LENGTH + 1]; - u32 personality; - u32 value; - u16 checksum; - - ZeroBoxMonData(boxMon); - - if (hasFixedPersonality) - personality = fixedPersonality; - else - personality = Random32(); - - SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality); - - //Determine original trainer ID - if (otIdType == 2) //Pokemon cannot be shiny - { - u32 shinyValue; - do - { - value = Random32(); - shinyValue = HIHALF(value) ^ LOHALF(value) ^ HIHALF(personality) ^ LOHALF(personality); - } while (shinyValue < 8); - } - else if (otIdType == 1) //Pokemon has a preset OT ID - { - value = fixedOtId; - } - else //Player is the OT - { - value = gSaveBlock2.playerTrainerId[0] - | (gSaveBlock2.playerTrainerId[1] << 8) - | (gSaveBlock2.playerTrainerId[2] << 16) - | (gSaveBlock2.playerTrainerId[3] << 24); - } - - SetBoxMonData(boxMon, MON_DATA_OT_ID, &value); - - checksum = CalculateBoxMonChecksum(boxMon); - SetBoxMonData(boxMon, MON_DATA_CHECKSUM, &checksum); - EncryptBoxMon(boxMon); - GetSpeciesName(speciesName, species); - SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName); - SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage); - SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2.playerName); - SetBoxMonData(boxMon, MON_DATA_SPECIES, &species); - SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gBaseStats[species].growthRate][level]); - SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship); - value = sav1_map_get_name(); - SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value); - SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level); - SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion); - value = 4; - SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value); - SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); - - if (fixedIV < 32) - { - SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV); - } - else - { - u32 iv; - value = Random(); - - iv = value & 0x1F; - SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv); - iv = (value & 0x3E0) >> 5; - SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv); - iv = (value & 0x7C00) >> 10; - SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv); - - value = Random(); - - iv = value & 0x1F; - SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); - iv = (value & 0x3E0) >> 5; - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); - iv = (value & 0x7C00) >> 10; - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); - } - - if (gBaseStats[species].ability2) - { - value = personality & 1; - SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, &value); - } - - GiveBoxMonInitialMoveset(boxMon); -} - -void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature) -{ - u32 personality; - - do - { - personality = Random32(); - } - while (nature != GetNatureFromPersonality(personality)); - - CreateMon(mon, species, level, fixedIV, 1, personality, 0, 0); -} - -void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter) -{ - u32 personality; - - if ((u8)(unownLetter - 1) < 28) - { - u16 actualLetter; - - do - { - personality = Random32(); - actualLetter = ((((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 28); - } - while (nature != GetNatureFromPersonality(personality) - || gender != GetGenderFromSpeciesAndPersonality(species, personality) - || actualLetter != unownLetter - 1); - } - else - { - do - { - personality = Random32(); - } - while (nature != GetNatureFromPersonality(personality) - || gender != GetGenderFromSpeciesAndPersonality(species, personality)); - } - - CreateMon(mon, species, level, fixedIV, 1, personality, 0, 0); -} - -// This is only used to create Wally's Ralts. -void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level) -{ - u32 personality; - u32 otId; - - do - { - otId = Random32(); - personality = Random32(); - } - while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE); - CreateMon(mon, species, level, 32, 1, personality, 1, otId); -} - -void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) -{ - CreateMon(mon, species, level, 0, 1, personality, 0, 0); - SetMonData(mon, MON_DATA_IVS, &ivs); - CalculateMonStats(mon); -} - -void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) -{ - CreateMon(mon, species, level, 0, 0, 0, 1, otId); - SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); - SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]); - SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]); - SetMonData(mon, MON_DATA_SPEED_IV, &ivs[3]); - SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]); - SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]); - CalculateMonStats(mon); -} - -void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread) -{ - s32 i; - s32 statCount = 0; - u16 evAmount; - u8 temp; - - CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0); - - temp = evSpread; - - for (i = 0; i < 6; i++) - { - if (temp & 1) - statCount++; - temp >>= 1; - } - - evAmount = 510 / statCount; - - temp = 1; - - for (i = 0; i < 6; i++) - { - if (evSpread & temp) - SetMonData(mon, MON_DATA_HP_EV + i, &evAmount); - temp <<= 1; - } - - CalculateMonStats(mon); -} - -void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) -{ - s32 i; - u8 nickname[POKEMON_NAME_LENGTH + 1]; - u8 language; - u8 value; - - CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId); - - for (i = 0; i < 4; i++) - SetMonMoveSlot(mon, src->moves[i], i); - - SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses); - SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem); - - StringCopy(nickname, src->nickname); - - if (nickname[0] == 0xFC && nickname[1] == 0x15) - language = LANGUAGE_JAPANESE; - else - language = GAME_LANGUAGE; - - SetMonData(mon, MON_DATA_LANGUAGE, &language); - Text_StripExtCtrlCodes(nickname); - SetMonData(mon, MON_DATA_NICKNAME, nickname); - SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship); - SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); - SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV); - SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV); - SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV); - SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV); - SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV); - value = src->altAbility; - SetMonData(mon, MON_DATA_ALT_ABILITY, &value); - value = src->hpIV; - SetMonData(mon, MON_DATA_HP_IV, &value); - value = src->attackIV; - SetMonData(mon, MON_DATA_ATK_IV, &value); - value = src->defenseIV; - SetMonData(mon, MON_DATA_DEF_IV, &value); - value = src->speedIV; - SetMonData(mon, MON_DATA_SPEED_IV, &value); - value = src->spAttackIV; - SetMonData(mon, MON_DATA_SPATK_IV, &value); - value = src->spDefenseIV; - SetMonData(mon, MON_DATA_SPDEF_IV, &value); - CalculateMonStats(mon); -} - -void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest) -{ - s32 i; - u16 heldItem; - - dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL); - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); - - if (heldItem == ITEM_ENIGMA_BERRY) - heldItem = 0; - - dest->heldItem = heldItem; - - for (i = 0; i < 4; i++) - dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); - - dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL); - dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); - dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); - dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - dest->speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); - dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); - dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); - dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); - dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); - dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); - dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); - dest->speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); - dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); - dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); - dest->altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); - dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - GetMonData(mon, MON_DATA_NICKNAME, dest->nickname); -} - -u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) -{ - u16 checksum = 0; - union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0); - union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1); - union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2); - union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3); - s32 i; - - for (i = 0; i < 6; i++) - checksum += substruct0->raw[i]; - - for (i = 0; i < 6; i++) - checksum += substruct1->raw[i]; - - for (i = 0; i < 6; i++) - checksum += substruct2->raw[i]; - - for (i = 0; i < 6; i++) - checksum += substruct3->raw[i]; - - return checksum; -} - -#define CALC_STAT(base, iv, ev, statIndex, field) \ -{ \ - u8 baseStat = gBaseStats[species].base; \ - s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ - u8 nature = GetNature(mon); \ - n = nature_stat_mod(nature, n, statIndex); \ - SetMonData(mon, field, &n); \ -} - -void CalculateMonStats(struct Pokemon *mon) -{ - s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); - s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); - s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); - s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); - s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); - s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); - s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); - s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); - s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); - s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); - s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); - s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); - s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - s32 level = GetLevelFromMonExp(mon); - s32 newMaxHP; - - SetMonData(mon, MON_DATA_LEVEL, &level); - - if (species == SPECIES_SHEDINJA) - { - newMaxHP = 1; - } - else - { - s32 n = 2 * gBaseStats[species].baseHP + hpIV; - newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; - } - - eStatHp = newMaxHP - oldMaxHP; - if (eStatHp == 0) - eStatHp = 1; - - SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); - - CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) - CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) - CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED) - CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) - CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) - - if (species == SPECIES_SHEDINJA) - { - if (currentHP != 0 || oldMaxHP == 0) - currentHP = 1; - else - return; - } - else - { - if (currentHP == 0 && oldMaxHP == 0) - currentHP = newMaxHP; - else if (currentHP != 0) - currentHP += newMaxHP - oldMaxHP; - else - return; - } - - SetMonData(mon, MON_DATA_HP, ¤tHP); -} - -#if DEBUG -void debug_sub_803F55C(struct Pokemon *mon) -{ - s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); - s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); - s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); - s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); - s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); - s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); - s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); - s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); - s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); - s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); - s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); - s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - s32 level = GetLevelFromMonExp(mon); - s32 newMaxHP; - - SetMonData(mon, MON_DATA_LEVEL, &level); - - if (species == SPECIES_SHEDINJA) - { - newMaxHP = 1; - } - else - { - s32 n = 2 * gBaseStats[species].baseHP + hpIV; - newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; - } - - SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); - - CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) - CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) - CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED) - CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) - CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) - - if (newMaxHP < currentHP) - currentHP = newMaxHP; - - SetMonData(mon, MON_DATA_HP, ¤tHP); -} -#endif - -void ExpandBoxMon(const struct BoxPokemon *src, struct Pokemon *dest) -{ - u32 value = 0; - dest->box = *src; - SetMonData(dest, MON_DATA_STATUS, &value); - SetMonData(dest, MON_DATA_HP, &value); - SetMonData(dest, MON_DATA_MAX_HP, &value); - value = 255; - SetMonData(dest, MON_DATA_MAIL, &value); - CalculateMonStats(dest); -} - -u8 GetLevelFromMonExp(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); - s32 level = 1; - - while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) - level++; - - return level - 1; -} - -u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon) -{ - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); - u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL); - s32 level = 1; - - while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) - level++; - - return level - 1; -} - -u16 GiveMoveToMon(struct Pokemon *mon, u16 move) -{ - return GiveMoveToBoxMon(&mon->box, move); -} - -u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) -{ - s32 i; - for (i = 0; i < 4; i++) - { - u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); - if (!existingMove) - { - SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &move); - SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[move].pp); - return move; - } - if (existingMove == move) - return -2; - } - return -1; -} - -u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) -{ - s32 i; - - for (i = 0; i < 4; i++) - { - if (!mon->moves[i]) - { - mon->moves[i] = move; - mon->pp[i] = gBattleMoves[move].pp; - return move; - } - } - - return -1; -} - -void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot) -{ - SetMonData(mon, MON_DATA_MOVE1 + slot, &move); - SetMonData(mon, MON_DATA_PP1 + slot, &gBattleMoves[move].pp); -} - -void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot) -{ - mon->moves[slot] = move; - mon->pp[slot] = gBattleMoves[move].pp; -} - -void GiveMonInitialMoveset(struct Pokemon *mon) -{ - GiveBoxMonInitialMoveset(&mon->box); -} - -void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) -{ - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); - s32 level = GetLevelFromBoxMonExp(boxMon); - s32 i; - - for (i = 0; gLevelUpLearnsets[species][i] != (u16)-1; i++) - { - u16 moveLevel; - u16 move; - - moveLevel = (gLevelUpLearnsets[species][i] & 0xFE00); - - if (moveLevel > (level << 9)) - break; - - move = (gLevelUpLearnsets[species][i] & 0x1FF); - - if (GiveMoveToBoxMon(boxMon, move) == (u16)-1) - DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); - } -} - -u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) -{ - u32 retVal = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); - - // since you can learn more than one move per level - // the game needs to know whether you decided to - // learn it or keep the old set to avoid asking - // you to learn the same move over and over again - if (firstMove) - { - sLearningMoveTableID = 0; - - while ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) != (level << 9)) - { - sLearningMoveTableID++; - if (gLevelUpLearnsets[species][sLearningMoveTableID] == 0xFFFF) - return 0; - } - } - - if ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) == (level << 9)) - { - gMoveToLearn = (gLevelUpLearnsets[species][sLearningMoveTableID] & 0x1FF); - sLearningMoveTableID++; - retVal = GiveMoveToMon(mon, gMoveToLearn); - } - - return retVal; -} - -void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) -{ - s32 i; - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; - - for (i = 0; i < 3; i++) - { - moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL); - pp[i] = GetMonData(mon, MON_DATA_PP2 + i, NULL); - } - - ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - ppBonuses >>= 2; - moves[3] = move; - pp[3] = gBattleMoves[move].pp; - - for (i = 0; i < 4; i++) - { - SetMonData(mon, MON_DATA_MOVE1 + i, &moves[i]); - SetMonData(mon, MON_DATA_PP1 + i, &pp[i]); - } - - SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); -} - -void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) -{ - s32 i; - u16 moves[4]; - u8 pp[4]; - u8 ppBonuses; - - for (i = 0; i < 3; i++) - { - moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i, NULL); - pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i, NULL); - } - - ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL); - ppBonuses >>= 2; - moves[3] = move; - pp[3] = gBattleMoves[move].pp; - - for (i = 0; i < 4; i++) - { - SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]); - SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]); - } - - SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &ppBonuses); -} diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c deleted file mode 100644 index 7fd1aa7b2..000000000 --- a/src/pokemon/pokemon_2.c +++ /dev/null @@ -1,1237 +0,0 @@ -#include "global.h" -#include "constants/hold_effects.h" -#include "constants/moves.h" -#include "battle.h" -#include "battle_util.h" -#include "data2.h" -#include "event_data.h" -#include "main.h" -#include "pokemon.h" -#include "random.h" -#include "rom_8077ABC.h" -#include "constants/species.h" -#include "sprite.h" -#include "string_util.h" -#include "strings2.h" -#include "text.h" -#include "trainer.h" -#include "util.h" -#include "ewram.h" - -extern u8 gPlayerPartyCount; -extern u8 gEnemyPartyCount; - -extern u16 gBattleTypeFlags; -extern u8 gActiveBank; -extern struct BattlePokemon gBattleMons[4]; -extern u16 gCurrentMove; -extern u8 gLastUsedAbility; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gAbsentBankFlags; -extern u8 gXXX_CritRelated; -extern u16 gBattleWeather; -extern struct BattleEnigmaBerry gEnigmaBerries[]; -extern u16 gBattleMovePower; -extern u16 gTrainerBattleOpponent; -extern struct PokemonStorage gPokemonStorage; - -EWRAM_DATA struct SpriteTemplate gUnknown_02024E8C = {0}; - -extern u8 gBadEggNickname[]; -extern const struct SpriteTemplate gSpriteTemplate_8208288[]; -//array of pointers to arrays of pointers to union AnimCmd (We probably need to typedef this.) -extern u8 gTrainerClassToPicIndex[]; -extern u8 gTrainerClassToNameIndex[]; - -extern const u8 gUnknown_08208238[]; -extern const u8 gUnknown_0820823C[]; - -extern void sub_80105A0(struct Sprite *); -extern void oac_poke_opponent(struct Sprite *); - -u8 CountAliveMons(u8 a1) -{ - s32 i; - u8 retVal = 0; - - switch (a1) - { - case 0: - for (i = 0; i < 4; i++) - { - if (i != gActiveBank && !(gAbsentBankFlags & gBitTable[i])) - retVal++; - } - break; - case 1: - for (i = 0; i < 4; i++) - { - if (GetBankSide(i) == GetBankSide(gBankAttacker) && !(gAbsentBankFlags & gBitTable[i])) - retVal++; - } - break; - case 2: - for (i = 0; i < 4; i++) - { - if (GetBankSide(i) == GetBankSide(gBankTarget) && !(gAbsentBankFlags & gBitTable[i])) - retVal++; - } - break; - } - - return retVal; -} - -u8 sub_803C434(u8 a1) -{ - u8 status = GetBankIdentity(a1) & 1; - - status ^= 1; - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - return GetBankByIdentity(status); - if (CountAliveMons(0) > 1) - { - u8 val; - - if ((Random() & 1) == 0) - val = status ^ 2; - else - val = status; - return GetBankByIdentity(val); - } - else - { - if ((gAbsentBankFlags & gBitTable[status])) - return GetBankByIdentity(status ^ 2); - else - return GetBankByIdentity(status); - } -} - -u8 GetMonGender(struct Pokemon *mon) -{ - return GetBoxMonGender(&mon->box); -} - -u8 GetBoxMonGender(struct BoxPokemon *boxMon) -{ - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); - u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL); - - switch (gBaseStats[species].genderRatio) - { - case MON_MALE: - case MON_FEMALE: - case MON_GENDERLESS: - return gBaseStats[species].genderRatio; - } - - if (gBaseStats[species].genderRatio > (personality & 0xFF)) - return MON_FEMALE; - else - return MON_MALE; -} - -u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) -{ - switch (gBaseStats[species].genderRatio) - { - case MON_MALE: - case MON_FEMALE: - case MON_GENDERLESS: - return gBaseStats[species].genderRatio; - } - - if (gBaseStats[species].genderRatio > (personality & 0xFF)) - return MON_FEMALE; - else - return MON_MALE; -} - -const struct SpriteTemplate gSpriteTemplate_8208288[] = -{ - {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A10, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, - {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A30, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, - {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A50, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, - {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A70, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, -}; - -void GetMonSpriteTemplate_803C56C(u16 species, u8 a2) -{ - gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; - gUnknown_02024E8C.paletteTag = species; - gUnknown_02024E8C.anims = (const union AnimCmd *const *)gSpriteAnimTable_81E7C64; //Why do I have to cast this? -} - -void GetMonSpriteTemplate_803C5A0(u16 species, u8 a2) -{ - gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; - gUnknown_02024E8C.paletteTag = species; - if (a2 == 0 || a2 == 2) - gUnknown_02024E8C.anims = gUnknown_081ECACC[species]; - else - gUnknown_02024E8C.anims = gUnknown_081EC2A4[species]; -} - -void EncryptBoxMon(struct BoxPokemon *boxMon) -{ - u32 i; - for (i = 0; i < 12; i++) - { - boxMon->secure.raw[i] ^= boxMon->personality; - boxMon->secure.raw[i] ^= boxMon->otId; - } -} - -void DecryptBoxMon(struct BoxPokemon *boxMon) -{ - u32 i; - for (i = 0; i < 12; i++) - { - boxMon->secure.raw[i] ^= boxMon->otId; - boxMon->secure.raw[i] ^= boxMon->personality; - } -} - -#define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \ -case n: \ - switch (substructType) \ - { \ - case 0: \ - substruct = &substructs ## n [v1]; \ - break; \ - case 1: \ - substruct = &substructs ## n [v2]; \ - break; \ - case 2: \ - substruct = &substructs ## n [v3]; \ - break; \ - case 3: \ - substruct = &substructs ## n [v4]; \ - break; \ - } \ - break; - -union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) -{ - union PokemonSubstruct *substruct = NULL; - - union PokemonSubstruct *substructs0 = boxMon->secure.substructs; - union PokemonSubstruct *substructs1 = boxMon->secure.substructs; - union PokemonSubstruct *substructs2 = boxMon->secure.substructs; - union PokemonSubstruct *substructs3 = boxMon->secure.substructs; - union PokemonSubstruct *substructs4 = boxMon->secure.substructs; - union PokemonSubstruct *substructs5 = boxMon->secure.substructs; - union PokemonSubstruct *substructs6 = boxMon->secure.substructs; - union PokemonSubstruct *substructs7 = boxMon->secure.substructs; - union PokemonSubstruct *substructs8 = boxMon->secure.substructs; - union PokemonSubstruct *substructs9 = boxMon->secure.substructs; - union PokemonSubstruct *substructs10 = boxMon->secure.substructs; - union PokemonSubstruct *substructs11 = boxMon->secure.substructs; - union PokemonSubstruct *substructs12 = boxMon->secure.substructs; - union PokemonSubstruct *substructs13 = boxMon->secure.substructs; - union PokemonSubstruct *substructs14 = boxMon->secure.substructs; - union PokemonSubstruct *substructs15 = boxMon->secure.substructs; - union PokemonSubstruct *substructs16 = boxMon->secure.substructs; - union PokemonSubstruct *substructs17 = boxMon->secure.substructs; - union PokemonSubstruct *substructs18 = boxMon->secure.substructs; - union PokemonSubstruct *substructs19 = boxMon->secure.substructs; - union PokemonSubstruct *substructs20 = boxMon->secure.substructs; - union PokemonSubstruct *substructs21 = boxMon->secure.substructs; - union PokemonSubstruct *substructs22 = boxMon->secure.substructs; - union PokemonSubstruct *substructs23 = boxMon->secure.substructs; - - switch (personality % 24) - { - SUBSTRUCT_CASE( 0,0,1,2,3) - SUBSTRUCT_CASE( 1,0,1,3,2) - SUBSTRUCT_CASE( 2,0,2,1,3) - SUBSTRUCT_CASE( 3,0,3,1,2) - SUBSTRUCT_CASE( 4,0,2,3,1) - SUBSTRUCT_CASE( 5,0,3,2,1) - SUBSTRUCT_CASE( 6,1,0,2,3) - SUBSTRUCT_CASE( 7,1,0,3,2) - SUBSTRUCT_CASE( 8,2,0,1,3) - SUBSTRUCT_CASE( 9,3,0,1,2) - SUBSTRUCT_CASE(10,2,0,3,1) - SUBSTRUCT_CASE(11,3,0,2,1) - SUBSTRUCT_CASE(12,1,2,0,3) - SUBSTRUCT_CASE(13,1,3,0,2) - SUBSTRUCT_CASE(14,2,1,0,3) - SUBSTRUCT_CASE(15,3,1,0,2) - SUBSTRUCT_CASE(16,2,3,0,1) - SUBSTRUCT_CASE(17,3,2,0,1) - SUBSTRUCT_CASE(18,1,2,3,0) - SUBSTRUCT_CASE(19,1,3,2,0) - SUBSTRUCT_CASE(20,2,1,3,0) - SUBSTRUCT_CASE(21,3,1,2,0) - SUBSTRUCT_CASE(22,2,3,1,0) - SUBSTRUCT_CASE(23,3,2,1,0) - } - - return substruct; -} - -u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) -{ - switch (field) - { - case MON_DATA_STATUS: - return mon->status; - case MON_DATA_LEVEL: - return mon->level; - case MON_DATA_HP: - return mon->hp; - case MON_DATA_MAX_HP: - return mon->maxHP; - case MON_DATA_ATK: - return mon->attack; - case MON_DATA_DEF: - return mon->defense; - case MON_DATA_SPEED: - return mon->speed; - case MON_DATA_SPATK: - return mon->spAttack; - case MON_DATA_SPDEF: - return mon->spDefense; - case MON_DATA_MAIL: - return mon->mail; - default: - return GetBoxMonData(&mon->box, field, data); - } -} - -u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) -{ - u32 retVal = 0; - struct PokemonSubstruct0 *substruct0 = NULL; - struct PokemonSubstruct1 *substruct1 = NULL; - struct PokemonSubstruct2 *substruct2 = NULL; - struct PokemonSubstruct3 *substruct3 = NULL; - - if (field > MON_DATA_10) - { - substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); - substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); - substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); - substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); - - DecryptBoxMon(boxMon); - - if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) - { - boxMon->isBadEgg = 1; - boxMon->isEgg = 1; - substruct3->isEgg = 1; - } - } - - switch (field) - { - case MON_DATA_PERSONALITY: - retVal = boxMon->personality; - break; - case MON_DATA_OT_ID: - retVal = boxMon->otId; - break; - case MON_DATA_NICKNAME: - { - if (boxMon->isBadEgg) - { - StringCopy(data, gBadEggNickname); - retVal = StringLength(data); - } - else if (boxMon->isEgg) - { - StringCopy(data, gEggNickname); - retVal = StringLength(data); - } - else - { - retVal = 0; - - while (retVal < POKEMON_NAME_LENGTH && boxMon->nickname[retVal] != EOS) - { - data[retVal] = boxMon->nickname[retVal]; - retVal++; - } - - data[retVal] = EOS; - ConvertInternationalString(data, boxMon->language); - retVal = StringLength(data); - } - break; - } - case MON_DATA_LANGUAGE: - retVal = boxMon->language; - break; - case MON_DATA_SANITY_BIT1: - retVal = boxMon->isBadEgg; - break; - case MON_DATA_SANITY_BIT2: - retVal = boxMon->hasSpecies; - break; - case MON_DATA_SANITY_BIT3: - retVal = boxMon->isEgg; - break; - case MON_DATA_OT_NAME: - { - retVal = 0; - - while (retVal < OT_NAME_LENGTH && boxMon->otName[retVal] != EOS) - { - data[retVal] = boxMon->otName[retVal]; - retVal++; - } - - data[retVal] = EOS; - break; - } - case MON_DATA_MARKINGS: - retVal = boxMon->markings; - break; - case MON_DATA_CHECKSUM: - retVal = boxMon->checksum; - break; - case MON_DATA_10: - retVal = boxMon->unknown; - break; - case MON_DATA_SPECIES: - retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; - break; - case MON_DATA_HELD_ITEM: - retVal = substruct0->heldItem; - break; - case MON_DATA_EXP: - retVal = substruct0->experience; - break; - case MON_DATA_PP_BONUSES: - retVal = substruct0->ppBonuses; - break; - case MON_DATA_FRIENDSHIP: - retVal = substruct0->friendship; - break; - case MON_DATA_MOVE1: - case MON_DATA_MOVE2: - case MON_DATA_MOVE3: - case MON_DATA_MOVE4: - retVal = substruct1->moves[field - MON_DATA_MOVE1]; - break; - case MON_DATA_PP1: - case MON_DATA_PP2: - case MON_DATA_PP3: - case MON_DATA_PP4: - retVal = substruct1->pp[field - MON_DATA_PP1]; - break; - case MON_DATA_HP_EV: - retVal = substruct2->hpEV; - break; - case MON_DATA_ATK_EV: - retVal = substruct2->attackEV; - break; - case MON_DATA_DEF_EV: - retVal = substruct2->defenseEV; - break; - case MON_DATA_SPEED_EV: - retVal = substruct2->speedEV; - break; - case MON_DATA_SPATK_EV: - retVal = substruct2->spAttackEV; - break; - case MON_DATA_SPDEF_EV: - retVal = substruct2->spDefenseEV; - break; - case MON_DATA_COOL: - retVal = substruct2->cool; - break; - case MON_DATA_BEAUTY: - retVal = substruct2->beauty; - break; - case MON_DATA_CUTE: - retVal = substruct2->cute; - break; - case MON_DATA_SMART: - retVal = substruct2->smart; - break; - case MON_DATA_TOUGH: - retVal = substruct2->tough; - break; - case MON_DATA_SHEEN: - retVal = substruct2->sheen; - break; - case MON_DATA_POKERUS: - retVal = substruct3->pokerus; - break; - case MON_DATA_MET_LOCATION: - retVal = substruct3->metLocation; - break; - case MON_DATA_MET_LEVEL: - retVal = substruct3->metLevel; - break; - case MON_DATA_MET_GAME: - retVal = substruct3->metGame; - break; - case MON_DATA_POKEBALL: - retVal = substruct3->pokeball; - break; - case MON_DATA_OT_GENDER: - retVal = substruct3->otGender; - break; - case MON_DATA_HP_IV: - retVal = substruct3->hpIV; - break; - case MON_DATA_ATK_IV: - retVal = substruct3->attackIV; - break; - case MON_DATA_DEF_IV: - retVal = substruct3->defenseIV; - break; - case MON_DATA_SPEED_IV: - retVal = substruct3->speedIV; - break; - case MON_DATA_SPATK_IV: - retVal = substruct3->spAttackIV; - break; - case MON_DATA_SPDEF_IV: - retVal = substruct3->spDefenseIV; - break; - case MON_DATA_IS_EGG: - retVal = substruct3->isEgg; - break; - case MON_DATA_ALT_ABILITY: - retVal = substruct3->altAbility; - break; - case MON_DATA_COOL_RIBBON: - retVal = substruct3->coolRibbon; - break; - case MON_DATA_BEAUTY_RIBBON: - retVal = substruct3->beautyRibbon; - break; - case MON_DATA_CUTE_RIBBON: - retVal = substruct3->cuteRibbon; - break; - case MON_DATA_SMART_RIBBON: - retVal = substruct3->smartRibbon; - break; - case MON_DATA_TOUGH_RIBBON: - retVal = substruct3->toughRibbon; - break; - case MON_DATA_CHAMPION_RIBBON: - retVal = substruct3->championRibbon; - break; - case MON_DATA_WINNING_RIBBON: - retVal = substruct3->winningRibbon; - break; - case MON_DATA_VICTORY_RIBBON: - retVal = substruct3->victoryRibbon; - break; - case MON_DATA_ARTIST_RIBBON: - retVal = substruct3->artistRibbon; - break; - case MON_DATA_EFFORT_RIBBON: - retVal = substruct3->effortRibbon; - break; - case MON_DATA_GIFT_RIBBON_1: - retVal = substruct3->giftRibbon1; - break; - case MON_DATA_GIFT_RIBBON_2: - retVal = substruct3->giftRibbon2; - break; - case MON_DATA_GIFT_RIBBON_3: - retVal = substruct3->giftRibbon3; - break; - case MON_DATA_GIFT_RIBBON_4: - retVal = substruct3->giftRibbon4; - break; - case MON_DATA_GIFT_RIBBON_5: - retVal = substruct3->giftRibbon5; - break; - case MON_DATA_GIFT_RIBBON_6: - retVal = substruct3->giftRibbon6; - break; - case MON_DATA_GIFT_RIBBON_7: - retVal = substruct3->giftRibbon7; - break; - case MON_DATA_FATEFUL_ENCOUNTER: - retVal = substruct3->fatefulEncounter; - break; - case MON_DATA_SPECIES2: - retVal = substruct0->species; - if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) - retVal = SPECIES_EGG; - break; - case MON_DATA_IVS: - retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25); - break; - case MON_DATA_KNOWN_MOVES: - if (substruct0->species && !substruct3->isEgg) - { - u16 *moves = (u16 *)data; - s32 i = 0; - - while (moves[i] != NUM_MOVES) - { - u16 move = moves[i]; - if (substruct1->moves[0] == move - || substruct1->moves[1] == move - || substruct1->moves[2] == move - || substruct1->moves[3] == move) - retVal |= gBitTable[i]; - i++; - } - } - break; - case MON_DATA_RIBBON_COUNT: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) - { - retVal += substruct3->coolRibbon; - retVal += substruct3->beautyRibbon; - retVal += substruct3->cuteRibbon; - retVal += substruct3->smartRibbon; - retVal += substruct3->toughRibbon; - retVal += substruct3->championRibbon; - retVal += substruct3->winningRibbon; - retVal += substruct3->victoryRibbon; - retVal += substruct3->artistRibbon; - retVal += substruct3->effortRibbon; - retVal += substruct3->giftRibbon1; - retVal += substruct3->giftRibbon2; - retVal += substruct3->giftRibbon3; - retVal += substruct3->giftRibbon4; - retVal += substruct3->giftRibbon5; - retVal += substruct3->giftRibbon6; - retVal += substruct3->giftRibbon7; - } - break; - case MON_DATA_RIBBONS: - retVal = 0; - if (substruct0->species && !substruct3->isEgg) - { - retVal = substruct3->championRibbon - | (substruct3->coolRibbon << 1) - | (substruct3->beautyRibbon << 4) - | (substruct3->cuteRibbon << 7) - | (substruct3->smartRibbon << 10) - | (substruct3->toughRibbon << 13) - | (substruct3->winningRibbon << 16) - | (substruct3->victoryRibbon << 17) - | (substruct3->artistRibbon << 18) - | (substruct3->effortRibbon << 19) - | (substruct3->giftRibbon1 << 20) - | (substruct3->giftRibbon2 << 21) - | (substruct3->giftRibbon3 << 22) - | (substruct3->giftRibbon4 << 23) - | (substruct3->giftRibbon5 << 24) - | (substruct3->giftRibbon6 << 25) - | (substruct3->giftRibbon7 << 26); - } - break; - default: - break; - } - - if (field > MON_DATA_10) - EncryptBoxMon(boxMon); - - return retVal; -} - -#define SET8(lhs) (lhs) = *data -#define SET16(lhs) (lhs) = data[0] + (data[1] << 8) -#define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) - -void SetMonData(struct Pokemon *mon, s32 field, const u8 *data) -{ - switch (field) - { - case MON_DATA_STATUS: - SET32(mon->status); - break; - case MON_DATA_LEVEL: - SET8(mon->level); - break; - case MON_DATA_HP: - SET16(mon->hp); - break; - case MON_DATA_MAX_HP: - SET16(mon->maxHP); - break; - case MON_DATA_ATK: - SET16(mon->attack); - break; - case MON_DATA_DEF: - SET16(mon->defense); - break; - case MON_DATA_SPEED: - SET16(mon->speed); - break; - case MON_DATA_SPATK: - SET16(mon->spAttack); - break; - case MON_DATA_SPDEF: - SET16(mon->spDefense); - break; - case MON_DATA_MAIL: - SET8(mon->mail); - break; - case MON_DATA_SPECIES2: - break; - default: - SetBoxMonData(&mon->box, field, data); - break; - } -} - -void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data) -{ - struct PokemonSubstruct0 *substruct0 = NULL; - struct PokemonSubstruct1 *substruct1 = NULL; - struct PokemonSubstruct2 *substruct2 = NULL; - struct PokemonSubstruct3 *substruct3 = NULL; - - if (field > MON_DATA_10) - { - substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); - substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); - substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); - substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); - - DecryptBoxMon(boxMon); - - if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) - { - boxMon->isBadEgg = 1; - boxMon->isEgg = 1; - substruct3->isEgg = 1; - EncryptBoxMon(boxMon); - return; - } - } - - switch (field) - { - case MON_DATA_PERSONALITY: - SET32(boxMon->personality); - break; - case MON_DATA_OT_ID: - SET32(boxMon->otId); - break; - case MON_DATA_NICKNAME: - { - s32 i; - for (i = 0; i < POKEMON_NAME_LENGTH; i++) - boxMon->nickname[i] = data[i]; - break; - } - case MON_DATA_LANGUAGE: - SET8(boxMon->language); - break; - case MON_DATA_SANITY_BIT1: - SET8(boxMon->isBadEgg); - break; - case MON_DATA_SANITY_BIT2: - SET8(boxMon->hasSpecies); - break; - case MON_DATA_SANITY_BIT3: - SET8(boxMon->isEgg); - break; - case MON_DATA_OT_NAME: - { - s32 i; - for (i = 0; i < OT_NAME_LENGTH; i++) - boxMon->otName[i] = data[i]; - break; - } - case MON_DATA_MARKINGS: - SET8(boxMon->markings); - break; - case MON_DATA_CHECKSUM: - SET16(boxMon->checksum); - break; - case MON_DATA_10: - SET16(boxMon->unknown); - break; - case MON_DATA_SPECIES: - { - SET16(substruct0->species); - if (substruct0->species) - boxMon->hasSpecies = 1; - else - boxMon->hasSpecies = 0; - break; - } - case MON_DATA_HELD_ITEM: - SET16(substruct0->heldItem); - break; - case MON_DATA_EXP: - SET32(substruct0->experience); - break; - case MON_DATA_PP_BONUSES: - SET8(substruct0->ppBonuses); - break; - case MON_DATA_FRIENDSHIP: - SET8(substruct0->friendship); - break; - case MON_DATA_MOVE1: - case MON_DATA_MOVE2: - case MON_DATA_MOVE3: - case MON_DATA_MOVE4: - SET16(substruct1->moves[field - MON_DATA_MOVE1]); - break; - case MON_DATA_PP1: - case MON_DATA_PP2: - case MON_DATA_PP3: - case MON_DATA_PP4: - SET8(substruct1->pp[field - MON_DATA_PP1]); - break; - case MON_DATA_HP_EV: - SET8(substruct2->hpEV); - break; - case MON_DATA_ATK_EV: - SET8(substruct2->attackEV); - break; - case MON_DATA_DEF_EV: - SET8(substruct2->defenseEV); - break; - case MON_DATA_SPEED_EV: - SET8(substruct2->speedEV); - break; - case MON_DATA_SPATK_EV: - SET8(substruct2->spAttackEV); - break; - case MON_DATA_SPDEF_EV: - SET8(substruct2->spDefenseEV); - break; - case MON_DATA_COOL: - SET8(substruct2->cool); - break; - case MON_DATA_BEAUTY: - SET8(substruct2->beauty); - break; - case MON_DATA_CUTE: - SET8(substruct2->cute); - break; - case MON_DATA_SMART: - SET8(substruct2->smart); - break; - case MON_DATA_TOUGH: - SET8(substruct2->tough); - break; - case MON_DATA_SHEEN: - SET8(substruct2->sheen); - break; - case MON_DATA_POKERUS: - SET8(substruct3->pokerus); - break; - case MON_DATA_MET_LOCATION: - SET8(substruct3->metLocation); - break; - case MON_DATA_MET_LEVEL: - { - u8 metLevel = *data; - substruct3->metLevel = metLevel; - break; - } - case MON_DATA_MET_GAME: - SET8(substruct3->metGame); - break; - case MON_DATA_POKEBALL: - { - u8 pokeball = *data; - substruct3->pokeball = pokeball; - break; - } - case MON_DATA_OT_GENDER: - SET8(substruct3->otGender); - break; - case MON_DATA_HP_IV: - SET8(substruct3->hpIV); - break; - case MON_DATA_ATK_IV: - SET8(substruct3->attackIV); - break; - case MON_DATA_DEF_IV: - SET8(substruct3->defenseIV); - break; - case MON_DATA_SPEED_IV: - SET8(substruct3->speedIV); - break; - case MON_DATA_SPATK_IV: - SET8(substruct3->spAttackIV); - break; - case MON_DATA_SPDEF_IV: - SET8(substruct3->spDefenseIV); - break; - case MON_DATA_IS_EGG: - SET8(substruct3->isEgg); - if (substruct3->isEgg) - boxMon->isEgg = 1; - else - boxMon->isEgg = 0; - break; - case MON_DATA_ALT_ABILITY: - SET8(substruct3->altAbility); - break; - case MON_DATA_COOL_RIBBON: - SET8(substruct3->coolRibbon); - break; - case MON_DATA_BEAUTY_RIBBON: - SET8(substruct3->beautyRibbon); - break; - case MON_DATA_CUTE_RIBBON: - SET8(substruct3->cuteRibbon); - break; - case MON_DATA_SMART_RIBBON: - SET8(substruct3->smartRibbon); - break; - case MON_DATA_TOUGH_RIBBON: - SET8(substruct3->toughRibbon); - break; - case MON_DATA_CHAMPION_RIBBON: - SET8(substruct3->championRibbon); - break; - case MON_DATA_WINNING_RIBBON: - SET8(substruct3->winningRibbon); - break; - case MON_DATA_VICTORY_RIBBON: - SET8(substruct3->victoryRibbon); - break; - case MON_DATA_ARTIST_RIBBON: - SET8(substruct3->artistRibbon); - break; - case MON_DATA_EFFORT_RIBBON: - SET8(substruct3->effortRibbon); - break; - case MON_DATA_GIFT_RIBBON_1: - SET8(substruct3->giftRibbon1); - break; - case MON_DATA_GIFT_RIBBON_2: - SET8(substruct3->giftRibbon2); - break; - case MON_DATA_GIFT_RIBBON_3: - SET8(substruct3->giftRibbon3); - break; - case MON_DATA_GIFT_RIBBON_4: - SET8(substruct3->giftRibbon4); - break; - case MON_DATA_GIFT_RIBBON_5: - SET8(substruct3->giftRibbon5); - break; - case MON_DATA_GIFT_RIBBON_6: - SET8(substruct3->giftRibbon6); - break; - case MON_DATA_GIFT_RIBBON_7: - SET8(substruct3->giftRibbon7); - break; - case MON_DATA_FATEFUL_ENCOUNTER: - SET8(substruct3->fatefulEncounter); - break; - case MON_DATA_IVS: - { -#ifdef BUGFIX_SETMONIVS - u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); -#else - u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0. -#endif - substruct3->hpIV = ivs & 0x1F; - substruct3->attackIV = (ivs >> 5) & 0x1F; - substruct3->defenseIV = (ivs >> 10) & 0x1F; - substruct3->speedIV = (ivs >> 15) & 0x1F; - substruct3->spAttackIV = (ivs >> 20) & 0x1F; - substruct3->spDefenseIV = (ivs >> 25) & 0x1F; - break; - } - default: - break; - } - - if (field > MON_DATA_10) - { - boxMon->checksum = CalculateBoxMonChecksum(boxMon); - EncryptBoxMon(boxMon); - } -} - -void CopyMon(void *dest, void *src, size_t size) -{ - memcpy(dest, src, size); -} - -u8 GiveMonToPlayer(struct Pokemon *mon) -{ - s32 i; - - SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2.playerName); - SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); - SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2.playerTrainerId); - - i = 0; - - while (i < 6 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) - i++; - - if (i >= 6) - return SendMonToPC(mon); - - CopyMon(&gPlayerParty[i], mon, sizeof(*mon)); - gPlayerPartyCount = i + 1; - return 0; -} - -u8 SendMonToPC(struct Pokemon *mon) -{ - s32 i = gPokemonStorage.currentBox; - - do - { - s32 j; - for (j = 0; j < 30; j++) - { - if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) - { - MonRestorePP(mon); - CopyMon(&gPokemonStorage.boxes[i][j], &mon->box, sizeof(mon->box)); - return 1; - } - } - - i++; - if (i == 14) - i = 0; - } while (i != gPokemonStorage.currentBox); - - return 2; -} - -u8 CalculatePlayerPartyCount(void) -{ - gPlayerPartyCount = 0; - - while (gPlayerPartyCount < 6 - && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) - { - gPlayerPartyCount++; - } - - return gPlayerPartyCount; -} - -u8 CalculateEnemyPartyCount(void) -{ - gEnemyPartyCount = 0; - - while (gEnemyPartyCount < 6 - && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) - { - gEnemyPartyCount++; - } - - return gEnemyPartyCount; -} - -u8 sub_803DAA0(void) -{ - s32 aliveCount = 0; - s32 i; - CalculatePlayerPartyCount(); - - if (gPlayerPartyCount == 1) - return gPlayerPartyCount; - - for (i = 0; i < gPlayerPartyCount; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0 - && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_NONE - && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_EGG) - aliveCount++; - } - - return (aliveCount > 1) ? 0 : 2; -} - -u8 GetAbilityBySpecies(u16 species, bool8 altAbility) -{ - if (altAbility) - gLastUsedAbility = gBaseStats[species].ability2; - else - gLastUsedAbility = gBaseStats[species].ability1; - - return gLastUsedAbility; -} - -u8 GetMonAbility(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u8 altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); - return GetAbilityBySpecies(species, altAbility); -} - -void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) -{ - s32 i, j; - - ZeroEnemyPartyMons(); - *eSecretBaseRecord = *secretBaseRecord; - - for (i = 0; i < 6; i++) - { - if (eSecretBaseRecord->partySpecies[i]) - { - CreateMon(&gEnemyParty[i], - eSecretBaseRecord->partySpecies[i], - eSecretBaseRecord->partyLevels[i], - 15, - 1, - eSecretBaseRecord->partyPersonality[i], - 2, - 0); - - // these two SetMonData calls require the (u8 *) cast since SetMonData is declared in this function. - SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, (u8 *)&eSecretBaseRecord->partyHeldItems[i]); - - for (j = 0; j < 6; j++) - SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &eSecretBaseRecord->partyEVs[i]); - - for (j = 0; j < 4; j++) - { - SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, (u8 *)&eSecretBaseRecord->partyMoves[i * 4 + j]); - SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[eSecretBaseRecord->partyMoves[i * 4 + j]].pp); - } - } - } - - gBattleTypeFlags = 8; - gTrainerBattleOpponent = 1024; -} - -const u8 gSecretBaseTrainerClasses[][5] = { - // male - {FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_BUG_CATCHER, FACILITY_CLASS_RICH_BOY, FACILITY_CLASS_CAMPER, FACILITY_CLASS_COOL_TRAINER_M}, - // female - {FACILITY_CLASS_LASS, FACILITY_CLASS_SCHOOL_KID_F, FACILITY_CLASS_LADY, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_COOL_TRAINER_F} -}; - -u8 GetSecretBaseTrainerPicIndex(void) -{ - u8 trainerClass = gSecretBaseTrainerClasses[eSecretBaseRecord->gender][eSecretBaseRecord->trainerId[0] % 5]; - return gTrainerClassToPicIndex[trainerClass]; -} - -u8 GetSecretBaseTrainerNameIndex(void) -{ - u8 trainerClass = gSecretBaseTrainerClasses[eSecretBaseRecord->gender][eSecretBaseRecord->trainerId[0] % 5]; - return gTrainerClassToNameIndex[trainerClass]; -} - -u8 PlayerPartyAndPokemonStorageFull(void) -{ - s32 i; - - for (i = 0; i < 6; i++) - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) - return 0; - - return PokemonStorageFull(); -} - -u8 PokemonStorageFull(void) -{ - s32 i, j; - - for (i = 0; i < 14; i++) - for (j = 0; j < 30; j++) - if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) - return 0; - - return 1; -} - -void GetSpeciesName(u8 *name, u16 species) -{ - s32 i; - - for (i = 0; i <= POKEMON_NAME_LENGTH; i++) - { - if (species > NUM_SPECIES) - name[i] = gSpeciesNames[0][i]; - else - name[i] = gSpeciesNames[species][i]; - - if (name[i] == EOS) - break; - } - - name[i] = EOS; -} - -u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) -{ - u8 basePP = gBattleMoves[move].pp; - return basePP + ((basePP * 20 * ((gUnknown_08208238[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); -} - -void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex) -{ - u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - ppBonuses &= gUnknown_0820823C[moveIndex]; - SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); -} - -void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) -{ - mon->ppBonuses &= gUnknown_0820823C[moveIndex]; -} - -void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex) -{ - s32 i; - s8 nickname[POKEMON_NAME_LENGTH * 2]; - - gBattleMons[battleIndex].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); - gBattleMons[battleIndex].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); - - for (i = 0; i < 4; i++) - { - gBattleMons[battleIndex].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL); - gBattleMons[battleIndex].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL); - } - - gBattleMons[battleIndex].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL); - gBattleMons[battleIndex].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL); - gBattleMons[battleIndex].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL); - gBattleMons[battleIndex].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); - gBattleMons[battleIndex].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); - gBattleMons[battleIndex].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); - gBattleMons[battleIndex].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL); - gBattleMons[battleIndex].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); - gBattleMons[battleIndex].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); - gBattleMons[battleIndex].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); - gBattleMons[battleIndex].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL); - gBattleMons[battleIndex].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL); - gBattleMons[battleIndex].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL); - gBattleMons[battleIndex].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); - gBattleMons[battleIndex].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); - gBattleMons[battleIndex].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); - gBattleMons[battleIndex].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL); - gBattleMons[battleIndex].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); - gBattleMons[battleIndex].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); - gBattleMons[battleIndex].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); - gBattleMons[battleIndex].altAbility = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ALT_ABILITY, NULL); - gBattleMons[battleIndex].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); - gBattleMons[battleIndex].type1 = gBaseStats[gBattleMons[battleIndex].species].type1; - gBattleMons[battleIndex].type2 = gBaseStats[gBattleMons[battleIndex].species].type2; - gBattleMons[battleIndex].ability = GetAbilityBySpecies(gBattleMons[battleIndex].species, gBattleMons[battleIndex].altAbility); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); - StringCopy10(gBattleMons[battleIndex].nickname, nickname); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battleIndex].otName); - ewram160BC[GetBankSide(battleIndex)] = gBattleMons[battleIndex].hp; - - for (i = 0; i < 8; i++) - gBattleMons[battleIndex].statStages[i] = 6; - - gBattleMons[battleIndex].status2 = 0; - sub_80157C4(battleIndex); - sub_8032AA8(battleIndex, 0); -} diff --git a/src/pokemon/pokemon_3.c b/src/pokemon/pokemon_3.c deleted file mode 100644 index 9346031a6..000000000 --- a/src/pokemon/pokemon_3.c +++ /dev/null @@ -1,1401 +0,0 @@ -#include "global.h" -#include "constants/hold_effects.h" -#include "constants/items.h" -#include "constants/moves.h" -#include "battle.h" -#include "battle_message.h" -#include "data2.h" -#include "event_data.h" -#include "item.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "pokemon.h" -#include "random.h" -#include "overworld.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "rtc.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "sprite.h" -#include "string_util.h" -#include "text.h" -#include "util.h" -#include "ewram.h" - -extern u8 gPlayerPartyCount; -extern u8 gEnemyPartyCount; -extern struct BattlePokemon gBattleMons[4]; -extern u8 gActiveBank; -extern struct BattleEnigmaBerry gEnigmaBerries[]; -extern u16 gSpeciesToHoennPokedexNum[]; -extern u16 gSpeciesToNationalPokedexNum[]; -extern u16 gHoennToNationalOrder[]; -extern u16 gSpeciesIdToCryId[]; -extern u8 gBattleTextBuff1[]; -extern u8 gBattleTextBuff2[]; -extern u8 gDisplayedStringBattle[]; -extern u8 gBankAttacker; -extern u8 gBankTarget; -extern u8 gStringBank; -extern u8 gBankInMenu; -extern struct SpindaSpot gSpindaSpotGraphics[]; -extern s8 gNatureStatTable[][5]; -extern u16 gTrainerBattleOpponent; -extern u16 gBattleTypeFlags; -extern u32 gTMHMLearnsets[][2]; -extern u8 gBattleMonForms[]; -extern const u8 BattleText_Wally[]; -extern s8 gPokeblockFlavorCompatibilityTable[]; -extern u8 gLastUsedAbility; -extern const u8 BattleText_PreventedSwitch[]; -extern u16 gBattlePartyID[]; - -extern u8 BattleText_Rose[]; -extern u8 BattleText_UnknownString3[]; -extern u8 BattleText_MistShroud[]; -extern u8 BattleText_GetPumped[]; -extern u8 *gUnknown_08400F58[]; - -bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) -{ - u32 status = GetMonData(mon, MON_DATA_STATUS, 0); - - if (status & healMask) - { - status &= ~healMask; - SetMonData(mon, MON_DATA_STATUS, &status); - if (gMain.inBattle && battleId != 4) - gBattleMons[battleId].status1 &= ~healMask; - return FALSE; - } - else - { - return TRUE; - } -} - -u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) -{ - const u8 *temp; - const u8 *itemEffect; - u8 offset; - int i; - u8 j; - u8 val; - - offset = 6; - - temp = gItemEffectTable[itemId - 13]; - - if (!temp && itemId != ITEM_ENIGMA_BERRY) - return 0; - - if (itemId == ITEM_ENIGMA_BERRY) - { - temp = gEnigmaBerries[gActiveBank].itemEffect; - } - - itemEffect = temp; - - for (i = 0; i < 6; i++) - { - switch (i) - { - case 0: - case 1: - case 2: - case 3: - if (i == effectByte) - return 0; - break; - case 4: - val = itemEffect[4]; - if (val & 0x20) - val &= 0xDF; - j = 0; - while (val) - { - if (val & 1) - { - switch (j) - { - case 2: - if (val & 0x10) - val &= 0xEF; - case 0: - if (i == effectByte && (val & effectBit)) - return offset; - offset++; - break; - case 1: - if (i == effectByte && (val & effectBit)) - return offset; - offset++; - break; - case 3: - if (i == effectByte && (val & effectBit)) - return offset; - offset++; - break; - case 7: - if (i == effectByte) - return 0; - break; - } - } - j++; - val >>= 1; - if (i == effectByte) - effectBit >>= 1; - } - break; - case 5: - val = itemEffect[5]; - j = 0; - while (val) - { - if (val & 1) - { - switch (j) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - if (i == effectByte && (val & effectBit)) - return offset; - offset++; - break; - case 7: - if (i == effectByte) - return 0; - break; - } - } - j++; - val >>= 1; - if (i == effectByte) - effectBit >>= 1; - } - break; - } - } - - return offset; -} - -const u8 gUnknown_082082F8[] = {1, 1, 3, 2, 4, 6}; - -void sub_803F324(int stat) -{ - gBankTarget = gBankInMenu; - StringCopy(gBattleTextBuff1, gUnknown_08400F58[gUnknown_082082F8[stat]]); - StringCopy(gBattleTextBuff2, BattleText_Rose); - StrCpyDecodeToDisplayedStringBattle(BattleText_UnknownString3); -} - -u8 *sub_803F378(u16 itemId) -{ - int i; - const u8 *itemEffect; - - if (itemId == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - { - itemEffect = gEnigmaBerries[gBankInMenu].itemEffect; - } - else - { - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - } - } - else - { - itemEffect = gItemEffectTable[itemId - 13]; - } - - gStringBank = gBankInMenu; - - for (i = 0; i < 3; i++) - { - if (itemEffect[i] & 0xF) - sub_803F324(i * 2); - if (itemEffect[i] & 0xF0) - { - if (i) - { - sub_803F324(i * 2 + 1); - } - else - { - gBankAttacker = gBankInMenu; - StrCpyDecodeToDisplayedStringBattle(BattleText_GetPumped); - } - } - } - - if (itemEffect[3] & 0x80) - { - gBankAttacker = gBankInMenu; - StrCpyDecodeToDisplayedStringBattle(BattleText_MistShroud); - } - - return gDisplayedStringBattle; -} - -u8 GetNature(struct Pokemon *mon) -{ - return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25; -} - -u8 GetNatureFromPersonality(u32 personality) -{ - return personality % 25; -} - -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) -{ - int i; - u16 targetSpecies = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - u8 level; - u16 friendship; - u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); - u16 upperPersonality = personality >> 16; - u8 holdEffect; - - if (heldItem == ITEM_ENIGMA_BERRY) - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - else - holdEffect = ItemId_GetHoldEffect(heldItem); - - if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3) - return 0; - - switch (type) - { - case 0: - level = GetMonData(mon, MON_DATA_LEVEL, 0); - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - - for (i = 0; i < 5; i++) - { - switch (gEvolutionTable[species][i].method) - { - case EVO_FRIENDSHIP: - if (friendship >= 220) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_FRIENDSHIP_DAY: - RtcCalcLocalTime(); - if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_FRIENDSHIP_NIGHT: - RtcCalcLocalTime(); - if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_LEVEL: - if (gEvolutionTable[species][i].param <= level) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_LEVEL_ATK_GT_DEF: - if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_LEVEL_ATK_EQ_DEF: - if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_LEVEL_ATK_LT_DEF: - if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_LEVEL_SILCOON: - if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_LEVEL_CASCOON: - if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_LEVEL_NINJASK: - if (gEvolutionTable[species][i].param <= level) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_BEAUTY: - if (gEvolutionTable[species][i].param <= beauty) - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - } - } - break; - case 1: - for (i = 0; i < 5; i++) - { - switch (gEvolutionTable[species][i].method) - { - case EVO_TRADE: - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - case EVO_TRADE_ITEM: - if (gEvolutionTable[species][i].param == heldItem) - { - heldItem = 0; - SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem); - targetSpecies = gEvolutionTable[species][i].targetSpecies; - } - break; - } - } - break; - case 2: - case 3: - for (i = 0; i < 5; i++) - { - if (gEvolutionTable[species][i].method == EVO_ITEM - && gEvolutionTable[species][i].param == evolutionItem) - { - targetSpecies = gEvolutionTable[species][i].targetSpecies; - break; - } - } - break; - } - - return targetSpecies; -} - -u16 HoennPokedexNumToSpecies(u16 hoennNum) -{ - u16 species; - - if (!hoennNum) - return 0; - - species = 0; - - while (species < 411 && gSpeciesToHoennPokedexNum[species] != hoennNum) - species++; - - if (species == 411) - return 0; - - return species + 1; -} - -u16 NationalPokedexNumToSpecies(u16 nationalNum) -{ - u16 species; - - if (!nationalNum) - return 0; - - species = 0; - - while (species < 411 && gSpeciesToNationalPokedexNum[species] != nationalNum) - species++; - - if (species == 411) - return 0; - - return species + 1; -} - -u16 NationalToHoennOrder(u16 nationalNum) -{ - u16 hoennNum; - - if (!nationalNum) - return 0; - - hoennNum = 0; - - while (hoennNum < 411 && gHoennToNationalOrder[hoennNum] != nationalNum) - hoennNum++; - - if (hoennNum == 411) - return 0; - - return hoennNum + 1; -} - -u16 SpeciesToNationalPokedexNum(u16 species) -{ - if (!species) - return 0; - - return gSpeciesToNationalPokedexNum[species - 1]; -} - -u16 SpeciesToHoennPokedexNum(u16 species) -{ - if (!species) - return 0; - - return gSpeciesToHoennPokedexNum[species - 1]; -} - -u16 HoennToNationalOrder(u16 hoennNum) -{ - if (!hoennNum) - return 0; - - return gHoennToNationalOrder[hoennNum - 1]; -} - -u16 SpeciesToCryId(u16 species) -{ - if (species <= 250) - return species; - - if (species < 276) - return 200; - - return gSpeciesIdToCryId[species - 276]; -} - -void unref_sub_803F938(u16 species, u32 personality, u8 *dest) -{ - if (species == SPECIES_SPINDA && dest != gUnknown_081FAF4C[0] && dest != gUnknown_081FAF4C[2]) - { - int i; - for (i = 0; i < 4; i++) - { - int j; - u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); - u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); - - for (j = 0; j < 16; j++) - { - int k; - s32 row = gSpindaSpotGraphics[i].image[j]; - - for (k = x; k < x + 16; k++) - { - u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); - - if (row & 1) - { - if (k & 1) - { - if ((u8)((*val & 0xF0) - 0x10) <= 0x20) - *val += 0x40; - } - else - { - if ((u8)((*val & 0xF) - 0x01) <= 0x02) - *val += 0x04; - } - } - - row >>= 1; - } - - y++; - } - - personality >>= 8; - } - } -} - -void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4) -{ - if (species == SPECIES_SPINDA && a4) - { - int i; - for (i = 0; i < 4; i++) - { - int j; - u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); - u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); - - for (j = 0; j < 16; j++) - { - int k; - s32 row = gSpindaSpotGraphics[i].image[j]; - - for (k = x; k < x + 16; k++) - { - u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); - - if (row & 1) - { - if (k & 1) - { - if ((u8)((*val & 0xF0) - 0x10) <= 0x20) - *val += 0x40; - } - else - { - if ((u8)((*val & 0xF) - 0x01) <= 0x02) - *val += 0x04; - } - } - - row >>= 1; - } - - y++; - } - - personality >>= 8; - } - } -} - -void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) -{ -#ifdef BUGFIX_EVO_NAME - u8 language; - GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); - language = GetMonData(mon, MON_DATA_LANGUAGE, &language); - if (language == GAME_LANGUAGE && !StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) - SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); -#else - GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); - if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) - SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); -#endif -} - -bool8 sub_803FBBC(void) -{ - bool8 retVal = FALSE; - switch (gLinkPlayers[GetMultiplayerId()].lp_field_18) - { - case 0: - case 3: - retVal = FALSE; - break; - case 1: - case 2: - retVal = TRUE; - break; - } - return retVal; -} - -bool8 sub_803FBFC(u8 id) -{ - bool8 retVal = FALSE; - switch (gLinkPlayers[id].lp_field_18) - { - case 0: - case 3: - retVal = FALSE; - break; - case 1: - case 2: - retVal = TRUE; - break; - } - return retVal; -} - -s32 sub_803FC34(u16 a1) -{ - s32 id; - for (id = 0; id < MAX_LINK_PLAYERS; id++) - if (gLinkPlayers[id].lp_field_18 == a1) - break; - return id; -} - -u8 sub_803FC58(u16 trainer) -{ - return gTrainers[trainer].encounterMusic_gender & 0x7F; -} - -u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex) -{ - if (statIndex < 1 || statIndex > 5) - { - // should just be "return n", but it wouldn't match without this - u16 retVal = n; - retVal++; - retVal--; - return retVal; - } - - switch (gNatureStatTable[nature][statIndex - 1]) - { - case 1: - return (u16)(n * 110) / 100; - case -1: - return (u16)(n * 90) / 100; - } - - return n; -} - -const s8 gUnknown_082082FE[][3] = -{ - // Happiness deltas - { 5, 3, 2}, - { 5, 3, 2}, - { 1, 1, 0}, - { 3, 2, 1}, - { 1, 1, 0}, - { 1, 1, 1}, - {-1, -1, -1}, - {-5, -5, -10}, - {-5, -5, -10} -}; - -void AdjustFriendship(struct Pokemon *mon, u8 event) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - u8 holdEffect; - - if (heldItem == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - holdEffect = gEnigmaBerries[0].holdEffect; - else - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - } - else - { - holdEffect = ItemId_GetHoldEffect(heldItem); - } - - if (species && species != SPECIES_EGG) - { - u8 friendshipLevel = 0; - s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - if (friendship > 99) - friendshipLevel++; - if (friendship > 199) - friendshipLevel++; - if ((event != 5 || !(Random() & 1)) - && (event != 3 - || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && (gTrainers[gTrainerBattleOpponent].trainerClass == 24 - || gTrainers[gTrainerBattleOpponent].trainerClass == 25 - || gTrainers[gTrainerBattleOpponent].trainerClass == 32)))) - { - s8 mod = gUnknown_082082FE[event][friendshipLevel]; - if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - mod = (150 * mod) / 100; - friendship += mod; - if (mod > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; - SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); - } - } -} - -void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) -{ - u8 evs[NUM_STATS]; - u16 evIncrease = 0; - u16 totalEVs = 0; - u16 heldItem; - u8 holdEffect; - int i; - - for (i = 0; i < NUM_STATS; i++) - { - evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0); - totalEVs += evs[i]; - } - - for (i = 0; i < NUM_STATS; i++) - { - u8 hasHadPokerus; - int multiplier; - - if (totalEVs >= MAX_TOTAL_EVS) - break; - - hasHadPokerus = CheckPartyHasHadPokerus(mon, 0); - - if (hasHadPokerus) - multiplier = 2; - else - multiplier = 1; - - switch (i) - { - case 0: - evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier; - break; - case 1: - evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier; - break; - case 2: - evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier; - break; - case 3: - evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier; - break; - case 4: - evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier; - break; - case 5: - evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier; - break; - } - - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - - if (heldItem == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - holdEffect = gEnigmaBerries[0].holdEffect; - else - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - } - else - { - holdEffect = ItemId_GetHoldEffect(heldItem); - } - - if (holdEffect == HOLD_EFFECT_MACHO_BRACE) - evIncrease *= 2; - - if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS) - evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease); - - if (evs[i] + (s16)evIncrease > 255) - { - int val1 = (s16)evIncrease + 255; - int val2 = evs[i] + evIncrease; - evIncrease = val1 - val2; - } - - evs[i] += evIncrease; - totalEVs += evIncrease; - SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]); - } -} - -u16 GetMonEVCount(struct Pokemon *mon) -{ - int i; - u16 count = 0; - - for (i = 0; i < NUM_STATS; i++) - count += GetMonData(mon, MON_DATA_HP_EV + i, 0); - - return count; -} - -void RandomlyGivePartyPokerus(struct Pokemon *party) -{ - u16 rnd = Random(); - if (rnd == 0x4000 || rnd == 0x8000 || rnd == 0xC000) - { - struct Pokemon *mon; - - do - { - do - { - rnd = Random() % PARTY_SIZE; - mon = &party[rnd]; - } - while (!GetMonData(mon, MON_DATA_SPECIES, 0)); - } - while (GetMonData(mon, MON_DATA_IS_EGG, 0)); - - if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd]))) - { - u8 rnd2; - - do - { - rnd2 = Random(); - } - while (rnd2 == 0); - - if (rnd2 & 0xF0) - rnd2 &= 0x07; - - rnd2 |= (rnd2 << 4); - rnd2 &= 0xF3; - rnd2++; - - SetMonData(&party[rnd], MON_DATA_POKERUS, &rnd2); - } - } -} - -u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) -{ - u8 retVal; - - int partyIndex = 0; - unsigned curBit = 1; - retVal = 0; - - if (selection) - { - do - { - if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF)) - retVal |= curBit; - partyIndex++; - curBit <<= 1; - selection >>= 1; - } - while (selection); - } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF) - { - retVal = 1; - } - - return retVal; -} - -u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) -{ - u8 retVal; - - int partyIndex = 0; - unsigned curBit = 1; - retVal = 0; - - if (selection) - { - do - { - if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0)) - retVal |= curBit; - partyIndex++; - curBit <<= 1; - selection >>= 1; - } - while (selection); - } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0)) - { - retVal = 1; - } - - return retVal; -} - -void UpdatePartyPokerusTime(u16 days) -{ - int i; - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, 0)) - { - u8 pokerus = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS, 0); - if (pokerus & 0xF) - { - if ((pokerus & 0xF) < days || days > 4) - pokerus &= 0xF0; - else - pokerus -= days; - - SetMonData(&gPlayerParty[i], MON_DATA_POKERUS, &pokerus); - } - } - } -} - -void PartySpreadPokerus(struct Pokemon *party) -{ - if ((Random() % 3) == 0) - { - int i; - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES, 0)) - { - u8 pokerus = GetMonData(&party[i], MON_DATA_POKERUS, 0); - u8 curPokerus = pokerus; - if (pokerus) - { - if (pokerus & 0xF) - { - // spread to adjacent party members - if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0)) - SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus); - if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0)) - { - SetMonData(&party[i + 1], MON_DATA_POKERUS, &curPokerus); - i++; - } - } - } - } - } - } -} - -bool8 TryIncrementMonLevel(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 nextLevel = GetMonData(mon, MON_DATA_LEVEL, 0) + 1; - if (GetMonData(mon, MON_DATA_EXP, 0) > gExperienceTables[gBaseStats[species].growthRate][nextLevel]) - { - SetMonData(mon, MON_DATA_LEVEL, &nextLevel); - return TRUE; - } - else - { - return FALSE; - } -} - -u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - if (species == SPECIES_EGG) - { - return 0; - } - else if (tm < 32) - { - u32 mask = 1 << tm; - return gTMHMLearnsets[species][0] & mask; - } - else - { - u32 mask = 1 << (tm - 32); - return gTMHMLearnsets[species][1] & mask; - } -} - -u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) -{ - u16 learnedMoves[4]; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); - int i, j, k; - - for (i = 0; i < 4; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - - for (i = 0; i < 20; i++) - { - u16 moveLevel; - - if (gLevelUpLearnsets[species][i] == 0xFFFF) - break; - - moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; - - if (moveLevel <= (level << 9)) - { - for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) - ; - - if (j == 4) - { - for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) - ; - - if (k == numMoves) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; - } - } - } - - return numMoves; -} - -u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) -{ - u8 numMoves = 0; - int i; - - for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != 0xFFFF; i++) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; - - return numMoves; -} - -u8 sub_8040574(struct Pokemon *mon) -{ - u16 learnedMoves[4]; - u16 moves[20]; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); - int i, j, k; - - if (species == SPECIES_EGG) - return 0; - - for (i = 0; i < 4; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - - for (i = 0; i < 20; i++) - { - u16 moveLevel; - - if (gLevelUpLearnsets[species][i] == 0xFFFF) - break; - - moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; - - if (moveLevel <= (level << 9)) - { - for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) - ; - - if (j == 4) - { - for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) - ; - - if (k == numMoves) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; - } - } - } - - return numMoves; -} - -u16 SpeciesToPokedexNum(u16 species) -{ - if (IsNationalPokedexEnabled()) - { - return SpeciesToNationalPokedexNum(species); - } - else - { - species = SpeciesToHoennPokedexNum(species); - if (species <= 202) - return species; - return 0xFFFF; - } -} - -void ClearBattleMonForms(void) -{ - int i; - for (i = 0; i < 4; i++) - gBattleMonForms[i] = 0; -} - -u16 GetBGM_ForBattle(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) - return BGM_BATTLE34; - if (gBattleTypeFlags & BATTLE_TYPE_REGI) - return BGM_BATTLE36; - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - return BGM_BATTLE20; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - switch (gTrainers[gTrainerBattleOpponent].trainerClass) - { - case 2: - case 0x31: - return BGM_BATTLE30; - case 3: - case 4: - case 0x32: - case 0x33: - return BGM_BATTLE31; - case 0x19: - return BGM_BATTLE32; - case 0x20: - return BGM_BATTLE33; - case 0x2E: - if (!StringCompare(gTrainers[gTrainerBattleOpponent].trainerName, BattleText_Wally)) - return BGM_BATTLE20; - return BGM_BATTLE35; - case 0x18: - return BGM_BATTLE38; - default: - return BGM_BATTLE20; - } - } - return BGM_BATTLE27; -} - -void sub_80408BC(void) -{ - ResetMapMusic(); - m4aMPlayAllStop(); - PlayBGM(GetBGM_ForBattle()); -} - -void current_map_music_set__default_for_battle(u16 song) -{ - ResetMapMusic(); - m4aMPlayAllStop(); - if (song) - PlayNewMapMusic(song); - else - PlayNewMapMusic(GetBGM_ForBattle()); -} - -const u8 *GetMonSpritePal(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return GetMonSpritePalFromOtIdPersonality(species, otId, personality); -} - -//Extracts the upper 16 bits of a 32-bit number -#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) - -//Extracts the lower 16 bits of a 32-bit number -#define LOHALF(n) ((n) & 0xFFFF) - -const u8 *GetMonSpritePalFromOtIdPersonality(u16 species, u32 otId, u32 personality) -{ - u32 shinyValue; - - if (species > SPECIES_EGG) - return gMonPaletteTable[0].data; - - shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); - if (shinyValue < 8) - return gMonShinyPaletteTable[species].data; - else - return gMonPaletteTable[species].data; -} - -const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon) -{ - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); -} - -const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality) -{ - u32 shinyValue; - - shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); - if (shinyValue < 8) - return &gMonShinyPaletteTable[species]; - else - return &gMonPaletteTable[species]; -} - -const u16 gHMMoves[] = -{ - MOVE_CUT, - MOVE_FLY, - MOVE_SURF, - MOVE_STRENGTH, - MOVE_FLASH, - MOVE_ROCK_SMASH, - MOVE_WATERFALL, - MOVE_DIVE, - 0xffff -}; - -bool32 IsHMMove2(u16 move) -{ - int i = 0; - while (gHMMoves[i] != 0xFFFF) - { - if (gHMMoves[i++] == move) - return TRUE; - } - return FALSE; -} - -bool8 IsPokeSpriteNotFlipped(u16 species) -{ - return gBaseStats[species].noFlip; -} - -s8 sub_8040A54(struct Pokemon *mon, u8 a2) -{ - u8 nature = GetNature(mon); - return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; -} - -s8 GetPokeFlavourRelation(u32 personality, u8 a2) -{ - u8 nature = GetNatureFromPersonality(personality); - return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; -} - -bool8 IsTradedMon(struct Pokemon *mon) -{ - u8 otName[8]; - u32 otId; - GetMonData(mon, MON_DATA_OT_NAME, otName); - otId = GetMonData(mon, MON_DATA_OT_ID, 0); - return IsOtherTrainer(otId, otName); -} - -bool8 IsOtherTrainer(u32 otId, u8 *otName) -{ - if (otId == (gSaveBlock2.playerTrainerId[0] | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[3] << 24))) - { - int i; - - for (i = 0; otName[i] != EOS; i++) - if (otName[i] != gSaveBlock2.playerName[i]) - return TRUE; - return FALSE; - } - - return TRUE; -} - -void BoxMonRestorePP(struct BoxPokemon *); - -void MonRestorePP(struct Pokemon *mon) -{ - BoxMonRestorePP(&mon->box); -} - -void BoxMonRestorePP(struct BoxPokemon *boxMon) -{ - int i; - - for (i = 0; i < 4; i++) - { - if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0)) - { - u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0); - u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0); - u8 pp = CalculatePPWithBonus(move, bonus, i); - SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); - } - } -} - -void sub_8040B8C(void) -{ - gLastUsedAbility = gBattleStruct->unk160C0;; - gBattleTextBuff1[0] = 0xFD; - gBattleTextBuff1[1] = 4; - gBattleTextBuff1[2] = gBattleStruct->unk16054; - gBattleTextBuff1[4] = EOS; - if (!GetBankSide(gBattleStruct->unk16054)) - gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[gBattleStruct->unk16054]); - else - gBattleTextBuff1[3] = gBattlePartyID[gBattleStruct->unk16054]; - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 4; - gBattleTextBuff2[2] = gBankInMenu; - gBattleTextBuff2[3] = pokemon_order_func(gBattlePartyID[gBankInMenu]); - gBattleTextBuff2[4] = EOS; - StrCpyDecodeBattle(BattleText_PreventedSwitch, gStringVar4); -} - -void SetWildMonHeldItem(void) -{ - if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER))) - { - u16 rnd = Random() % 100; - u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); - if (gBaseStats[species].item1 == gBaseStats[species].item2) - { - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); - return; - } - - if (rnd > 44) - { - if (rnd <= 94) - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); - else - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2); - } - } -} - -bool8 IsShinyOtIdPersonality(u32, u32); - -bool8 IsShiny(struct Pokemon *mon) -{ - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return IsShinyOtIdPersonality(otId, personality); -} - -bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) -{ - bool8 retVal = FALSE; - u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); - if (shinyValue < 8) - retVal = TRUE; - return retVal; -} - -u8 *sub_8040D08(void) -{ - u8 id = GetMultiplayerId(); - return gLinkPlayers[sub_803FC34(gLinkPlayers[id].lp_field_18 ^ 2)].name; -} - -const u8 gJapaneseNidoranNames[][11] = {_("ニドラン♂"), _("ニドラン♀")}; - -bool32 ShouldHideGenderIconForLanguage(u16 species, u8 *name, u8 language) -{ - bool32 retVal = FALSE; - if (species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) - { - const u8 *speciesName; - if (language == GAME_LANGUAGE) - { - speciesName = gSpeciesNames[species]; - } - else - { - if (species == SPECIES_NIDORAN_M) - speciesName = gJapaneseNidoranNames[0]; - else - speciesName = gJapaneseNidoranNames[1]; - } - if (!StringCompareWithoutExtCtrlCodes(name, speciesName)) - retVal = TRUE; - else - retVal = FALSE; - } - return retVal; -} - -bool32 ShouldHideGenderIcon(u16 species, u8 *name) -{ - u8 language = GAME_LANGUAGE; - if (name[0] == 0xFC && name[1] == 21) - language = LANGUAGE_JAPANESE; - return ShouldHideGenderIconForLanguage(species, name, language); -} - -bool32 unref_sub_8040DAC(struct Pokemon *mon) -{ - u8 name[12]; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 language = GetMonData(mon, MON_DATA_LANGUAGE, 0); - GetMonData(mon, MON_DATA_NICKNAME, name); - return ShouldHideGenderIconForLanguage(species, name, language); -} diff --git a/src/pokemon/pokemon_icon.c b/src/pokemon/pokemon_icon.c deleted file mode 100644 index b1b462761..000000000 --- a/src/pokemon/pokemon_icon.c +++ /dev/null @@ -1,1276 +0,0 @@ -#include "global.h" -#include "graphics.h" -#include "mail_data.h" -#include "constants/species.h" -#include "sprite.h" - -#define POKE_ICON_BASE_PAL_TAG 56000 - -struct MonIconSpriteTemplate -{ - const struct OamData *oam; - const u8 *image; - const union AnimCmd *const *anims; - const union AffineAnimCmd *const *affineAnims; - void (*callback)(struct Sprite *); - u16 paletteTag; -}; - -const u8 * const gMonIconTable[] = -{ - gMonIcon_Bulbasaur, - gMonIcon_Bulbasaur, - gMonIcon_Ivysaur, - gMonIcon_Venusaur, - gMonIcon_Charmander, - gMonIcon_Charmeleon, - gMonIcon_Charizard, - gMonIcon_Squirtle, - gMonIcon_Wartortle, - gMonIcon_Blastoise, - gMonIcon_Caterpie, - gMonIcon_Metapod, - gMonIcon_Butterfree, - gMonIcon_Weedle, - gMonIcon_Kakuna, - gMonIcon_Beedrill, - gMonIcon_Pidgey, - gMonIcon_Pidgeotto, - gMonIcon_Pidgeot, - gMonIcon_Rattata, - gMonIcon_Raticate, - gMonIcon_Spearow, - gMonIcon_Fearow, - gMonIcon_Ekans, - gMonIcon_Arbok, - gMonIcon_Pikachu, - gMonIcon_Raichu, - gMonIcon_Sandshrew, - gMonIcon_Sandslash, - gMonIcon_NidoranF, - gMonIcon_Nidorina, - gMonIcon_Nidoqueen, - gMonIcon_NidoranM, - gMonIcon_Nidorino, - gMonIcon_Nidoking, - gMonIcon_Clefairy, - gMonIcon_Clefable, - gMonIcon_Vulpix, - gMonIcon_Ninetales, - gMonIcon_Jigglypuff, - gMonIcon_Wigglytuff, - gMonIcon_Zubat, - gMonIcon_Golbat, - gMonIcon_Oddish, - gMonIcon_Gloom, - gMonIcon_Vileplume, - gMonIcon_Paras, - gMonIcon_Parasect, - gMonIcon_Venonat, - gMonIcon_Venomoth, - gMonIcon_Diglett, - gMonIcon_Dugtrio, - gMonIcon_Meowth, - gMonIcon_Persian, - gMonIcon_Psyduck, - gMonIcon_Golduck, - gMonIcon_Mankey, - gMonIcon_Primeape, - gMonIcon_Growlithe, - gMonIcon_Arcanine, - gMonIcon_Poliwag, - gMonIcon_Poliwhirl, - gMonIcon_Poliwrath, - gMonIcon_Abra, - gMonIcon_Kadabra, - gMonIcon_Alakazam, - gMonIcon_Machop, - gMonIcon_Machoke, - gMonIcon_Machamp, - gMonIcon_Bellsprout, - gMonIcon_Weepinbell, - gMonIcon_Victreebel, - gMonIcon_Tentacool, - gMonIcon_Tentacruel, - gMonIcon_Geodude, - gMonIcon_Graveler, - gMonIcon_Golem, - gMonIcon_Ponyta, - gMonIcon_Rapidash, - gMonIcon_Slowpoke, - gMonIcon_Slowbro, - gMonIcon_Magnemite, - gMonIcon_Magneton, - gMonIcon_Farfetchd, - gMonIcon_Doduo, - gMonIcon_Dodrio, - gMonIcon_Seel, - gMonIcon_Dewgong, - gMonIcon_Grimer, - gMonIcon_Muk, - gMonIcon_Shellder, - gMonIcon_Cloyster, - gMonIcon_Gastly, - gMonIcon_Haunter, - gMonIcon_Gengar, - gMonIcon_Onix, - gMonIcon_Drowzee, - gMonIcon_Hypno, - gMonIcon_Krabby, - gMonIcon_Kingler, - gMonIcon_Voltorb, - gMonIcon_Electrode, - gMonIcon_Exeggcute, - gMonIcon_Exeggutor, - gMonIcon_Cubone, - gMonIcon_Marowak, - gMonIcon_Hitmonlee, - gMonIcon_Hitmonchan, - gMonIcon_Lickitung, - gMonIcon_Koffing, - gMonIcon_Weezing, - gMonIcon_Rhyhorn, - gMonIcon_Rhydon, - gMonIcon_Chansey, - gMonIcon_Tangela, - gMonIcon_Kangaskhan, - gMonIcon_Horsea, - gMonIcon_Seadra, - gMonIcon_Goldeen, - gMonIcon_Seaking, - gMonIcon_Staryu, - gMonIcon_Starmie, - gMonIcon_Mrmime, - gMonIcon_Scyther, - gMonIcon_Jynx, - gMonIcon_Electabuzz, - gMonIcon_Magmar, - gMonIcon_Pinsir, - gMonIcon_Tauros, - gMonIcon_Magikarp, - gMonIcon_Gyarados, - gMonIcon_Lapras, - gMonIcon_Ditto, - gMonIcon_Eevee, - gMonIcon_Vaporeon, - gMonIcon_Jolteon, - gMonIcon_Flareon, - gMonIcon_Porygon, - gMonIcon_Omanyte, - gMonIcon_Omastar, - gMonIcon_Kabuto, - gMonIcon_Kabutops, - gMonIcon_Aerodactyl, - gMonIcon_Snorlax, - gMonIcon_Articuno, - gMonIcon_Zapdos, - gMonIcon_Moltres, - gMonIcon_Dratini, - gMonIcon_Dragonair, - gMonIcon_Dragonite, - gMonIcon_Mewtwo, - gMonIcon_Mew, - gMonIcon_Chikorita, - gMonIcon_Bayleef, - gMonIcon_Meganium, - gMonIcon_Cyndaquil, - gMonIcon_Quilava, - gMonIcon_Typhlosion, - gMonIcon_Totodile, - gMonIcon_Croconaw, - gMonIcon_Feraligatr, - gMonIcon_Sentret, - gMonIcon_Furret, - gMonIcon_Hoothoot, - gMonIcon_Noctowl, - gMonIcon_Ledyba, - gMonIcon_Ledian, - gMonIcon_Spinarak, - gMonIcon_Ariados, - gMonIcon_Crobat, - gMonIcon_Chinchou, - gMonIcon_Lanturn, - gMonIcon_Pichu, - gMonIcon_Cleffa, - gMonIcon_Igglybuff, - gMonIcon_Togepi, - gMonIcon_Togetic, - gMonIcon_Natu, - gMonIcon_Xatu, - gMonIcon_Mareep, - gMonIcon_Flaaffy, - gMonIcon_Ampharos, - gMonIcon_Bellossom, - gMonIcon_Marill, - gMonIcon_Azumarill, - gMonIcon_Sudowoodo, - gMonIcon_Politoed, - gMonIcon_Hoppip, - gMonIcon_Skiploom, - gMonIcon_Jumpluff, - gMonIcon_Aipom, - gMonIcon_Sunkern, - gMonIcon_Sunflora, - gMonIcon_Yanma, - gMonIcon_Wooper, - gMonIcon_Quagsire, - gMonIcon_Espeon, - gMonIcon_Umbreon, - gMonIcon_Murkrow, - gMonIcon_Slowking, - gMonIcon_Misdreavus, - gMonIcon_UnownA, - gMonIcon_Wobbuffet, - gMonIcon_Girafarig, - gMonIcon_Pineco, - gMonIcon_Forretress, - gMonIcon_Dunsparce, - gMonIcon_Gligar, - gMonIcon_Steelix, - gMonIcon_Snubbull, - gMonIcon_Granbull, - gMonIcon_Qwilfish, - gMonIcon_Scizor, - gMonIcon_Shuckle, - gMonIcon_Heracross, - gMonIcon_Sneasel, - gMonIcon_Teddiursa, - gMonIcon_Ursaring, - gMonIcon_Slugma, - gMonIcon_Magcargo, - gMonIcon_Swinub, - gMonIcon_Piloswine, - gMonIcon_Corsola, - gMonIcon_Remoraid, - gMonIcon_Octillery, - gMonIcon_Delibird, - gMonIcon_Mantine, - gMonIcon_Skarmory, - gMonIcon_Houndour, - gMonIcon_Houndoom, - gMonIcon_Kingdra, - gMonIcon_Phanpy, - gMonIcon_Donphan, - gMonIcon_Porygon2, - gMonIcon_Stantler, - gMonIcon_Smeargle, - gMonIcon_Tyrogue, - gMonIcon_Hitmontop, - gMonIcon_Smoochum, - gMonIcon_Elekid, - gMonIcon_Magby, - gMonIcon_Miltank, - gMonIcon_Blissey, - gMonIcon_Raikou, - gMonIcon_Entei, - gMonIcon_Suicune, - gMonIcon_Larvitar, - gMonIcon_Pupitar, - gMonIcon_Tyranitar, - gMonIcon_Lugia, - gMonIcon_HoOh, - gMonIcon_Celebi, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_QuestionMark, - gMonIcon_Treecko, - gMonIcon_Grovyle, - gMonIcon_Sceptile, - gMonIcon_Torchic, - gMonIcon_Combusken, - gMonIcon_Blaziken, - gMonIcon_Mudkip, - gMonIcon_Marshtomp, - gMonIcon_Swampert, - gMonIcon_Poochyena, - gMonIcon_Mightyena, - gMonIcon_Zigzagoon, - gMonIcon_Linoone, - gMonIcon_Wurmple, - gMonIcon_Silcoon, - gMonIcon_Beautifly, - gMonIcon_Cascoon, - gMonIcon_Dustox, - gMonIcon_Lotad, - gMonIcon_Lombre, - gMonIcon_Ludicolo, - gMonIcon_Seedot, - gMonIcon_Nuzleaf, - gMonIcon_Shiftry, - gMonIcon_Nincada, - gMonIcon_Ninjask, - gMonIcon_Shedinja, - gMonIcon_Taillow, - gMonIcon_Swellow, - gMonIcon_Shroomish, - gMonIcon_Breloom, - gMonIcon_Spinda, - gMonIcon_Wingull, - gMonIcon_Pelipper, - gMonIcon_Surskit, - gMonIcon_Masquerain, - gMonIcon_Wailmer, - gMonIcon_Wailord, - gMonIcon_Skitty, - gMonIcon_Delcatty, - gMonIcon_Kecleon, - gMonIcon_Baltoy, - gMonIcon_Claydol, - gMonIcon_Nosepass, - gMonIcon_Torkoal, - gMonIcon_Sableye, - gMonIcon_Barboach, - gMonIcon_Whiscash, - gMonIcon_Luvdisc, - gMonIcon_Corphish, - gMonIcon_Crawdaunt, - gMonIcon_Feebas, - gMonIcon_Milotic, - gMonIcon_Carvanha, - gMonIcon_Sharpedo, - gMonIcon_Trapinch, - gMonIcon_Vibrava, - gMonIcon_Flygon, - gMonIcon_Makuhita, - gMonIcon_Hariyama, - gMonIcon_Electrike, - gMonIcon_Manectric, - gMonIcon_Numel, - gMonIcon_Camerupt, - gMonIcon_Spheal, - gMonIcon_Sealeo, - gMonIcon_Walrein, - gMonIcon_Cacnea, - gMonIcon_Cacturne, - gMonIcon_Snorunt, - gMonIcon_Glalie, - gMonIcon_Lunatone, - gMonIcon_Solrock, - gMonIcon_Azurill, - gMonIcon_Spoink, - gMonIcon_Grumpig, - gMonIcon_Plusle, - gMonIcon_Minun, - gMonIcon_Mawile, - gMonIcon_Meditite, - gMonIcon_Medicham, - gMonIcon_Swablu, - gMonIcon_Altaria, - gMonIcon_Wynaut, - gMonIcon_Duskull, - gMonIcon_Dusclops, - gMonIcon_Roselia, - gMonIcon_Slakoth, - gMonIcon_Vigoroth, - gMonIcon_Slaking, - gMonIcon_Gulpin, - gMonIcon_Swalot, - gMonIcon_Tropius, - gMonIcon_Whismur, - gMonIcon_Loudred, - gMonIcon_Exploud, - gMonIcon_Clamperl, - gMonIcon_Huntail, - gMonIcon_Gorebyss, - gMonIcon_Absol, - gMonIcon_Shuppet, - gMonIcon_Banette, - gMonIcon_Seviper, - gMonIcon_Zangoose, - gMonIcon_Relicanth, - gMonIcon_Aron, - gMonIcon_Lairon, - gMonIcon_Aggron, - gMonIcon_Castform, - gMonIcon_Volbeat, - gMonIcon_Illumise, - gMonIcon_Lileep, - gMonIcon_Cradily, - gMonIcon_Anorith, - gMonIcon_Armaldo, - gMonIcon_Ralts, - gMonIcon_Kirlia, - gMonIcon_Gardevoir, - gMonIcon_Bagon, - gMonIcon_Shelgon, - gMonIcon_Salamence, - gMonIcon_Beldum, - gMonIcon_Metang, - gMonIcon_Metagross, - gMonIcon_Regirock, - gMonIcon_Regice, - gMonIcon_Registeel, - gMonIcon_Kyogre, - gMonIcon_Groudon, - gMonIcon_Rayquaza, - gMonIcon_Latias, - gMonIcon_Latios, - gMonIcon_Jirachi, - gMonIcon_Deoxys, - gMonIcon_Chimecho, - gMonIcon_Egg, - gMonIcon_UnownB, - gMonIcon_UnownC, - gMonIcon_UnownD, - gMonIcon_UnownE, - gMonIcon_UnownF, - gMonIcon_UnownG, - gMonIcon_UnownH, - gMonIcon_UnownI, - gMonIcon_UnownJ, - gMonIcon_UnownK, - gMonIcon_UnownL, - gMonIcon_UnownM, - gMonIcon_UnownN, - gMonIcon_UnownO, - gMonIcon_UnownP, - gMonIcon_UnownQ, - gMonIcon_UnownR, - gMonIcon_UnownS, - gMonIcon_UnownT, - gMonIcon_UnownU, - gMonIcon_UnownV, - gMonIcon_UnownW, - gMonIcon_UnownX, - gMonIcon_UnownY, - gMonIcon_UnownZ, - gMonIcon_UnownExclamationMark, - gMonIcon_UnownQuestionMark, -}; - -const u8 gMonIconPaletteIndices[] = -{ - 0, // ?????????? - 1, // Bulbasaur - 1, // Ivysaur - 1, // Venusaur - 0, // Charmander - 0, // Charmeleon - 0, // Charizard - 0, // Squirtle - 2, // Wartortle - 2, // Blastoise - 1, // Caterpie - 1, // Metapod - 0, // Butterfree - 1, // Weedle - 2, // Kakuna - 2, // Beedrill - 0, // Pidgey - 0, // Pidgeotto - 0, // Pidgeot - 2, // Rattata - 1, // Raticate - 0, // Spearow - 0, // Fearow - 2, // Ekans - 2, // Arbok - 2, // Pikachu - 0, // Raichu - 2, // Sandshrew - 2, // Sandslash - 2, // Nidoran♀ - 2, // Nidorina - 2, // Nidoqueen - 2, // Nidoran♂ - 2, // Nidorino - 2, // Nidoking - 0, // Clefairy - 0, // Clefable - 2, // Vulpix - 1, // Ninetales - 0, // Jigglypuff - 0, // Wigglytuff - 2, // Zubat - 2, // Golbat - 1, // Oddish - 0, // Gloom - 0, // Vileplume - 0, // Paras - 0, // Parasect - 0, // Venonat - 2, // Venomoth - 2, // Diglett - 2, // Dugtrio - 1, // Meowth - 1, // Persian - 1, // Psyduck - 2, // Golduck - 1, // Mankey - 2, // Primeape - 0, // Growlithe - 0, // Arcanine - 0, // Poliwag - 0, // Poliwhirl - 0, // Poliwrath - 2, // Abra - 2, // Kadabra - 2, // Alakazam - 0, // Machop - 2, // Machoke - 0, // Machamp - 1, // Bellsprout - 1, // Weepinbell - 1, // Victreebel - 2, // Tentacool - 2, // Tentacruel - 1, // Geodude - 1, // Graveler - 1, // Golem - 0, // Ponyta - 0, // Rapidash - 0, // Slowpoke - 0, // Slowbro - 0, // Magnemite - 0, // Magneton - 1, // Farfetch'd - 2, // Doduo - 2, // Dodrio - 2, // Seel - 2, // Dewgong - 2, // Grimer - 2, // Muk - 2, // Shellder - 2, // Cloyster - 2, // Gastly - 2, // Haunter - 2, // Gengar - 2, // Onix - 2, // Drowzee - 1, // Hypno - 2, // Krabby - 2, // Kingler - 0, // Voltorb - 0, // Electrode - 0, // Exeggcute - 1, // Exeggutor - 1, // Cubone - 1, // Marowak - 2, // Hitmonlee - 2, // Hitmonchan - 1, // Lickitung - 2, // Koffing - 2, // Weezing - 1, // Rhyhorn - 1, // Rhydon - 0, // Chansey - 0, // Tangela - 1, // Kangaskhan - 0, // Horsea - 0, // Seadra - 0, // Goldeen - 0, // Seaking - 2, // Staryu - 2, // Starmie - 0, // Mr. mime - 1, // Scyther - 2, // Jynx - 1, // Electabuzz - 0, // Magmar - 2, // Pinsir - 2, // Tauros - 0, // Magikarp - 0, // Gyarados - 2, // Lapras - 2, // Ditto - 2, // Eevee - 0, // Vaporeon - 0, // Jolteon - 0, // Flareon - 0, // Porygon - 0, // Omanyte - 0, // Omastar - 2, // Kabuto - 2, // Kabutops - 0, // Aerodactyl - 1, // Snorlax - 0, // Articuno - 0, // Zapdos - 0, // Moltres - 0, // Dratini - 0, // Dragonair - 2, // Dragonite - 2, // Mewtwo - 0, // Mew - 1, // Chikorita - 1, // Bayleef - 1, // Meganium - 1, // Cyndaquil - 1, // Quilava - 1, // Typhlosion - 2, // Totodile - 2, // Croconaw - 2, // Feraligatr - 2, // Sentret - 2, // Furret - 2, // Hoothoot - 2, // Noctowl - 0, // Ledyba - 0, // Ledian - 1, // Spinarak - 0, // Ariados - 2, // Crobat - 2, // Chinchou - 0, // Lanturn - 0, // Pichu - 0, // Cleffa - 1, // Igglybuff - 2, // Togepi - 2, // Togetic - 0, // Natu - 0, // Xatu - 2, // Mareep - 0, // Flaaffy - 0, // Ampharos - 1, // Bellossom - 2, // Marill - 2, // Azumarill - 1, // Sudowoodo - 1, // Politoed - 1, // Hoppip - 1, // Skiploom - 2, // Jumpluff - 2, // Aipom - 1, // Sunkern - 1, // Sunflora - 1, // Yanma - 0, // Wooper - 0, // Quagsire - 2, // Espeon - 2, // Umbreon - 2, // Murkrow - 0, // Slowking - 0, // Misdreavus - 0, // Unown A - 0, // Wobbuffet - 1, // Girafarig - 0, // Pineco - 2, // Forretress - 2, // Dunsparce - 2, // Gligar - 0, // Steelix - 0, // Snubbull - 2, // Granbull - 0, // Qwilfish - 0, // Scizor - 1, // Shuckle - 2, // Heracross - 0, // Sneasel - 0, // Teddiursa - 2, // Ursaring - 0, // Slugma - 0, // Magcargo - 2, // Swinub - 2, // Piloswine - 0, // Corsola - 0, // Remoraid - 0, // Octillery - 0, // Delibird - 2, // Mantine - 0, // Skarmory - 0, // Houndour - 0, // Houndoom - 0, // Kingdra - 0, // Phanpy - 0, // Donphan - 0, // Porygon2 - 2, // Stantler - 1, // Smeargle - 2, // Tyrogue - 2, // Hitmontop - 1, // Smoochum - 1, // Elekid - 1, // Magby - 1, // Miltank - 1, // Blissey - 0, // Raikou - 2, // Entei - 0, // Suicune - 1, // Larvitar - 0, // Pupitar - 1, // Tyranitar - 0, // Lugia - 1, // Ho-Oh - 1, // Celebi - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 0, // ? - 1, // Treecko - 0, // Grovyle - 1, // Sceptile - 0, // Torchic - 0, // Combusken - 0, // Blaziken - 0, // Mudkip - 0, // Marshtomp - 0, // Swampert - 2, // Poochyena - 2, // Mightyena - 2, // Zigzagoon - 2, // Linoone - 0, // Wurmple - 2, // Silcoon - 0, // Beautifly - 2, // Cascoon - 1, // Dustox - 1, // Lotad - 1, // Lombre - 1, // Ludicolo - 1, // Seedot - 1, // Nuzleaf - 0, // Shiftry - 1, // Nincada - 1, // Ninjask - 1, // Shedinja - 2, // Taillow - 2, // Swellow - 1, // Shroomish - 1, // Breloom - 1, // Spinda - 0, // Wingull - 0, // Pelipper - 2, // Surskit - 0, // Masquerain - 2, // Wailmer - 0, // Wailord - 0, // Skitty - 2, // Delcatty - 1, // Kecleon - 1, // Baltoy - 0, // Claydol - 0, // Nosepass - 1, // Torkoal - 2, // Sableye - 0, // Barboach - 0, // Whiscash - 0, // Luvdisc - 0, // Corphish - 0, // Crawdaunt - 2, // Feebas - 0, // Milotic - 0, // Carvanha - 0, // Sharpedo - 1, // Trapinch - 1, // Vibrava - 1, // Flygon - 2, // Makuhita - 1, // Hariyama - 1, // Electrike - 0, // Manectric - 1, // Numel - 0, // Camerupt - 2, // Spheal - 2, // Sealeo - 0, // Walrein - 1, // Cacnea - 1, // Cacturne - 2, // Snorunt - 0, // Glalie - 1, // Lunatone - 0, // Solrock - 2, // Azurill - 0, // Spoink - 2, // Grumpig - 0, // Plusle - 0, // Minun - 2, // Mawile - 0, // Meditite - 0, // Medicham - 0, // Swablu - 0, // Altaria - 0, // Wynaut - 0, // Duskull - 0, // Dusclops - 0, // Roselia - 2, // Slakoth - 2, // Vigoroth - 1, // Slaking - 1, // Gulpin - 2, // Swalot - 1, // Tropius - 0, // Whismur - 2, // Loudred - 2, // Exploud - 0, // Clamperl - 0, // Huntail - 0, // Gorebyss - 0, // Absol - 0, // Shuppet - 0, // Banette - 2, // Seviper - 0, // Zangoose - 1, // Relicanth - 2, // Aron - 2, // Lairon - 2, // Aggron - 0, // Castform - 0, // Volbeat - 2, // Illumise - 2, // Lileep - 0, // Cradily - 0, // Anorith - 0, // Armaldo - 1, // Ralts - 1, // Kirlia - 1, // Gardevoir - 2, // Bagon - 2, // Shelgon - 0, // Salamence - 0, // Beldum - 0, // Metang - 0, // Metagross - 2, // Regirock - 2, // Regice - 2, // Registeel - 2, // Kyogre - 0, // Groudon - 1, // Rayquaza - 0, // Latias - 2, // Latios - 0, // Jirachi - 0, // Deoxys - 0, // Chimecho - 1, // Egg - 0, // Unown B - 0, // Unown C - 0, // Unown D - 0, // Unown E - 0, // Unown F - 0, // Unown G - 0, // Unown H - 0, // Unown I - 0, // Unown J - 0, // Unown K - 0, // Unown L - 0, // Unown M - 0, // Unown N - 0, // Unown O - 0, // Unown P - 0, // Unown Q - 0, // Unown R - 0, // Unown S - 0, // Unown T - 0, // Unown U - 0, // Unown V - 0, // Unown W - 0, // Unown X - 0, // Unown Y - 0, // Unown Z - 0, // Unown Exclamation Mark - 0, // Unown Question Mark -}; - -const struct SpritePalette gMonIconPaletteTable[] = -{ - { gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 }, - { gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 }, - { gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 }, - -// There are only 3 actual palettes. The following are unused -// and don't point to valid data. - { gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 }, - { gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 }, - { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 }, -}; - -static const struct OamData sMonIconOamData = -{ - .size = 2, - .priority = 1, -}; - -// fastest to slowest - -static const union AnimCmd sAnim_0[] = -{ - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sAnim_1[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sAnim_2[] = -{ - ANIMCMD_FRAME(0, 14), - ANIMCMD_FRAME(1, 14), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sAnim_3[] = -{ - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd sAnim_4[] = -{ - ANIMCMD_FRAME(0, 29), - ANIMCMD_FRAME(0, 29), // frame 0 is repeated - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd *const sMonIconAnims[] = -{ - sAnim_0, - sAnim_1, - sAnim_2, - sAnim_3, - sAnim_4, -}; - -static const union AffineAnimCmd sAffineAnim_0[] = -{ - AFFINEANIMCMD_FRAME(0, 0, 0, 10), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd sAffineAnim_1[] = -{ - AFFINEANIMCMD_FRAME(-2, -2, 0, 122), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const sMonIconAffineAnims[] = -{ - sAffineAnim_0, - sAffineAnim_1, -}; - -const u16 sSpriteImageSizes[3][4] = -{ - // square - { - 0x20, // 1×1 - 0x80, // 2×2 - 0x200, // 4×4 - 0x800, // 8×8 - }, - - // horizontal rectangle - { - 0x40, // 2×1 - 0x80, // 4×1 - 0x100, // 4×2 - 0x400, // 8×4 - }, - - // vertical rectangle - { - 0x40, // 1×2 - 0x80, // 1×4 - 0x100, // 2×4 - 0x400, // 4×8 - }, -}; - -u16 GetUnownLetterByPersonality(u32); -const u8 *GetMonIconPtr(u16, u32 personality); -u8 UpdateMonIconFrame(struct Sprite *); -u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); -void sub_809D7E8(struct Sprite *); - -// duplicate of sub_809D3A4 -u8 unref_sub_809D26C(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - u8 spriteId; - struct MonIconSpriteTemplate iconTemplate = - { - .oam = &sMonIconOamData, - .image = gMonIconTable[species], - .anims = sMonIconAnims, - .affineAnims = sMonIconAffineAnims, - .callback = callback, - .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], - }; - - spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); - - UpdateMonIconFrame(&gSprites[spriteId]); - - return spriteId; -} - -u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality) -{ - u8 spriteId; - struct MonIconSpriteTemplate iconTemplate = - { - .oam = &sMonIconOamData, - .image = GetMonIconPtr(species, personality), - .anims = sMonIconAnims, - .affineAnims = sMonIconAffineAnims, - .callback = callback, - .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], - }; - - if (species > SPECIES_EGG) - iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; - - spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); - - UpdateMonIconFrame(&gSprites[spriteId]); - - return spriteId; -} - -u8 sub_809D3A4(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - u8 spriteId; - struct MonIconSpriteTemplate iconTemplate = - { - .oam = &sMonIconOamData, - .image = gMonIconTable[species], - .anims = sMonIconAnims, - .affineAnims = sMonIconAffineAnims, - .callback = callback, - .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], - }; - - spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); - - UpdateMonIconFrame(&gSprites[spriteId]); - - return spriteId; -} - -u16 mon_icon_convert_unown_species_id(u16 species, u32 personality) -{ - u16 result; - - if (species == SPECIES_UNOWN) - { - u16 letter = GetUnownLetterByPersonality(personality); - if (letter == 0) - letter = SPECIES_UNOWN; - else - letter += (SPECIES_UNOWN_B - 1); - result = letter; - } - else - { - if (species > SPECIES_EGG) - result = 260; - else - result = species; - } - - return result; -} - -u16 GetUnownLetterByPersonality(u32 personality) -{ - return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; -} - -u16 sub_809D4A8(u16 species) -{ - u16 value; - - if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN) - { - if (value == 0) - value += SPECIES_UNOWN; - else - value += (SPECIES_UNOWN_B - 1); - return value; - } - else - { - return mon_icon_convert_unown_species_id(species, 0); - } -} - -const u8 *GetMonIconPtr(u16 species, u32 personality) -{ - u16 convertedSpecies = mon_icon_convert_unown_species_id(species, personality); - return gMonIconTable[convertedSpecies]; -} - -void sub_809D510(struct Sprite *sprite) -{ - sub_809D7E8(sprite); -} - -void sub_809D51C(void) -{ - u8 i; - for (i = 0; i < 6; i++) - LoadSpritePalette(&gMonIconPaletteTable[i]); -} - -// unused -void SafeLoadMonIconPalette(u16 species) -{ - u8 palIndex; - if (species > SPECIES_EGG) - species = 260; - palIndex = gMonIconPaletteIndices[species]; - if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) - LoadSpritePalette(&gMonIconPaletteTable[palIndex]); -} - -void sub_809D580(u16 species) -{ - u8 palIndex = gMonIconPaletteIndices[species]; - if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) - LoadSpritePalette(&gMonIconPaletteTable[palIndex]); -} - -// unused -void FreeMonIconPalettes(void) -{ - u8 i; - for (i = 0; i < 6; i++) - FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag); -} - -// unused -void SafeFreeMonIconPalette(u16 species) -{ - u8 palIndex; - if (species > SPECIES_EGG) - species = 260; - palIndex = gMonIconPaletteIndices[species]; - FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); -} - -void sub_809D608(u16 species) -{ - u8 palIndex; - palIndex = gMonIconPaletteIndices[species]; - FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); -} - -void sub_809D62C(struct Sprite *sprite) -{ - UpdateMonIconFrame(sprite); -} - -// TODO: try to find a way to avoid using asm statement -u8 UpdateMonIconFrame(struct Sprite *sprite) -{ - u8 result = 0; - - if (sprite->animDelayCounter == 0) - { - s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; - - switch (frame) - { - case -1: - break; - case -2: - sprite->animCmdIndex = 0; - break; - default: - RequestSpriteCopy( - // pointer arithmetic is needed to get the correct pointer to perform the sprite copy on. - // because sprite->images is a struct def, it has to be casted to (u8 *) before any - // arithmetic can be performed. - (u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame), - OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP, - sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]); - { - register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - sprite->animDelayCounter = duration; - } - sprite->animCmdIndex++; - result = sprite->animCmdIndex; - break; - } - } - else - { - sprite->animDelayCounter--; - } - return result; -} - -u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority) -{ - u8 spriteId; - - struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] }; - - struct SpriteTemplate spriteTemplate = - { - .tileTag = 0xFFFF, - .paletteTag = iconTemplate->paletteTag, - .oam = iconTemplate->oam, - .anims = iconTemplate->anims, - .images = &image, - .affineAnims = iconTemplate->affineAnims, - .callback = iconTemplate->callback, - }; - - spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); - gSprites[spriteId].animPaused = TRUE; - gSprites[spriteId].animBeginning = FALSE; - gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image; - return spriteId; -} - -void sub_809D7E8(struct Sprite *sprite) -{ - struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] }; - sprite->images = ℑ - DestroySprite(sprite); -} - -void sub_809D824(struct Sprite *sprite, u8 animNum) -{ - sprite->animNum = animNum; - sprite->animDelayCounter = 0; - sprite->animCmdIndex = 0; -} diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon/pokemon_item_effect.c deleted file mode 100644 index 4ebece3b3..000000000 --- a/src/pokemon/pokemon_item_effect.c +++ /dev/null @@ -1,550 +0,0 @@ -#include "global.h" -#include "constants/battle_constants.h" -#include "constants/hold_effects.h" -#include "constants/items.h" -#include "constants/species.h" -#include "battle.h" -#include "evolution_scene.h" -#include "ewram.h" -#include "item.h" -#include "main.h" -#include "overworld.h" -#include "pokemon.h" -#include "pokemon_item_effect.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "util.h" - -extern s32 gBattleMoveDamage; -extern u8 gAbsentBankFlags; -extern u8 gBankInMenu; -extern u8 gNoOfAllBanks; -extern u16 gBattlePartyID[]; -extern u8 gActiveBank; -extern u8 gStringBank; -extern struct BattlePokemon gBattleMons[]; -extern struct BattleEnigmaBerry gEnigmaBerries[]; - -static const u8 sGetMonDataEVConstants[] = -{ - MON_DATA_HP_EV, - MON_DATA_ATK_EV, - MON_DATA_DEF_EV, - MON_DATA_SPEED_EV, - MON_DATA_SPDEF_EV, - MON_DATA_SPATK_EV -}; - -extern u8 gUnknown_08208238[]; -extern u8 gUnknown_0820823C[]; -extern u8 gUnknown_08208240[]; - -bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e); - -bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex) -{ - return PokemonUseItemEffects(pkmn, item, partyIndex, moveIndex, 0); -} - -bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e) -{ - u32 data; - s32 friendship; - s32 cmdIndex; - bool8 retVal = TRUE; - const u8 *itemEffect; - u8 sp24 = 6; - u32 sp28; - s8 sp2C = 0; - u8 holdEffect; - u8 sp34 = 4; - u16 heldItem; - u8 r10; - u32 r4; - - heldItem = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); - if (heldItem == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - holdEffect = gEnigmaBerries[gBankInMenu].holdEffect; - else - holdEffect = gSaveBlock1.enigmaBerry.holdEffect; - } - else - { - holdEffect = ItemId_GetHoldEffect(heldItem); - } - - gStringBank = gBankInMenu; - if (gMain.inBattle) - { - gActiveBank = gBankInMenu; - cmdIndex = (GetBankSide(gActiveBank) != 0); - while (cmdIndex < gNoOfAllBanks) - { - if (gBattlePartyID[cmdIndex] == partyIndex) - { - sp34 = cmdIndex; - break; - } - cmdIndex += 2; - } - } - else - { - gActiveBank = 0; - sp34 = 4; - } - - if (!IS_POKEMON_ITEM(item)) - return TRUE; - if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY) - return TRUE; - - if (item == ITEM_ENIGMA_BERRY) - { - if (gMain.inBattle) - itemEffect = gEnigmaBerries[gActiveBank].itemEffect; - else - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - } - else - { - itemEffect = gItemEffectTable[item - 13]; - } - - for (cmdIndex = 0; cmdIndex < 6; cmdIndex++) - { - switch (cmdIndex) - { - // status healing effects - case 0: - if ((itemEffect[cmdIndex] & 0x80) - && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_INFATUATION)) - { - gBattleMons[sp34].status2 &= ~STATUS2_INFATUATION; - retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0x30) - && !(gBattleMons[gActiveBank].status2 & STATUS2_FOCUS_ENERGY)) - { - gBattleMons[gActiveBank].status2 |= STATUS2_FOCUS_ENERGY; - retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0xF) - && gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] < 12) - { - gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] += itemEffect[cmdIndex] & 0xF; - if (gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] > 12) - gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] = 12; - retVal = FALSE; - } - break; - // in-battle stat boosting effects? - case 1: - if ((itemEffect[cmdIndex] & 0xF0) - && gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] < 12) - { - gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4; - if (gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] > 12) - gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] = 12; - retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0xF) - && gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] < 12) - { - gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] += itemEffect[cmdIndex] & 0xF; - if (gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] > 12) - gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] = 12; - retVal = FALSE; - } - break; - // more stat boosting effects? - case 2: - if ((itemEffect[cmdIndex] & 0xF0) - && gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] < 12) - { - gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4; - if (gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] > 12) - gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] = 12; - retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0xF) - && gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] < 12) - { - gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] += itemEffect[cmdIndex] & 0xF; - if (gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] > 12) - gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] = 12; - retVal = FALSE; - } - break; - case 3: - if ((itemEffect[cmdIndex] & 0x80) - && gSideTimers[GetBankSide(gActiveBank)].mistTimer == 0) - { - gSideTimers[GetBankSide(gActiveBank)].mistTimer = 5; - retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0x40) // raise level - && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100) - { - data = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1]; - SetMonData(pkmn, MON_DATA_EXP, &data); - CalculateMonStats(pkmn); - retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0x20) - && HealStatusConditions(pkmn, partyIndex, 7, sp34) == 0) - { - if (sp34 != 4) - gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE; - retVal = FALSE; - } - if ((itemEffect[cmdIndex] & 0x10) && HealStatusConditions(pkmn, partyIndex, 0xF88, sp34) == 0) - retVal = FALSE; - if ((itemEffect[cmdIndex] & 8) && HealStatusConditions(pkmn, partyIndex, 16, sp34) == 0) - retVal = FALSE; - if ((itemEffect[cmdIndex] & 4) && HealStatusConditions(pkmn, partyIndex, 32, sp34) == 0) - retVal = FALSE; - if ((itemEffect[cmdIndex] & 2) && HealStatusConditions(pkmn, partyIndex, 64, sp34) == 0) - retVal = FALSE; - if ((itemEffect[cmdIndex] & 1) // heal confusion - && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_CONFUSION)) - { - gBattleMons[sp34].status2 &= ~STATUS2_CONFUSION; - retVal = FALSE; - } - break; - // EV, HP, and PP raising effects - case 4: - r10 = itemEffect[cmdIndex]; - if (r10 & 0x20) - { - r10 &= ~0x20; - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[moveIndex]) >> (moveIndex * 2); - sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); - if (data <= 2 && sp28 > 4) - { - data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_08208240[moveIndex]; - SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); - - data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28; - data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; - SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); - retVal = FALSE; - } - } - sp28 = 0; - while (r10 != 0) - { - if (r10 & 1) - { - u16 evCount; - s32 r5; - - switch (sp28) - { - case 0: - case 1: - evCount = GetMonEVCount(pkmn); - if (evCount >= 510) - return TRUE; - data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL); - if (data < 100) - { - if (data + itemEffect[sp24] > 100) - r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; - else - r4 = itemEffect[sp24]; - if (evCount + r4 > 510) - r4 += 510 - (evCount + r4); - data += r4; - SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data); - CalculateMonStats(pkmn); - sp24++; - retVal = FALSE; - } - break; - case 2: - // revive? - if (r10 & 0x10) - { - if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0) - { - sp24++; - break; - } - if (gMain.inBattle) - { - if (sp34 != 4) - { - gAbsentBankFlags &= ~gBitTable[sp34]; - CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlePartyID[sp34])); - if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) - gBattleResults.unk4++; - } - else - { - gAbsentBankFlags &= ~gBitTable[gActiveBank ^ 2]; - if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) - gBattleResults.unk4++; - } - } - } - else - { - if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0) - { - sp24++; - break; - } - } - data = itemEffect[sp24++]; - switch (data) - { - case 0xFF: - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); - break; - case 0xFE: - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2; - if (data == 0) - data = 1; - break; - case 0xFD: - data = eStatHp; - break; - } - if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL)) - { - if (e == 0) - { - data = GetMonData(pkmn, MON_DATA_HP, NULL) + data; - if (data > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) - data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL); - SetMonData(pkmn, MON_DATA_HP, &data); - if (gMain.inBattle && sp34 != 4) - { - gBattleMons[sp34].hp = data; - if (!(r10 & 0x10) && GetBankSide(gActiveBank) == 0) - { - if (gBattleResults.unk3 < 255) - gBattleResults.unk3++; - // I have to re-use this variable to match. - r5 = gActiveBank; - gActiveBank = sp34; - EmitGetAttributes(0, 0, 0); - MarkBufferBankForExecution(gActiveBank); - gActiveBank = r5; - } - } - } - else - { - gBattleMoveDamage = -data; - } - retVal = FALSE; - } - r10 &= 0xEF; - break; - case 3: - if (!(r10 & 2)) - { - for (r5 = 0; r5 < 4; r5++) - { - u16 r4; - - data = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL); - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) - { - data += itemEffect[sp24]; - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) - { - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); - data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5); - } - SetMonData(pkmn, MON_DATA_PP1 + r5, &data); - if (gMain.inBattle - && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) - && !(gDisableStructs[sp34].unk18_b & gBitTable[r5])) - gBattleMons[sp34].pp[r5] = data; - retVal = FALSE; - } - } - sp24++; - } - else - { - u16 r4; - - data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL); - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) - { - data += itemEffect[sp24++]; - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) - { - r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); - data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); - } - SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); - if (gMain.inBattle - && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) - && !(gDisableStructs[sp34].unk18_b & gBitTable[moveIndex])) - gBattleMons[sp34].pp[moveIndex] = data; - retVal = FALSE; - } - } - break; - case 7: - { - u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item); - - if (targetSpecies != SPECIES_NONE) - { - BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex); - return FALSE; - } - } - break; - } - } - sp28++; - r10 >>= 1; - } - break; - case 5: - r10 = itemEffect[cmdIndex]; - sp28 = 0; - while (r10 != 0) - { - if (r10 & 1) - { - u16 evCount; - - switch (sp28) - { - case 0: - case 1: - case 2: - case 3: - evCount = GetMonEVCount(pkmn); - if (evCount >= 510) - return TRUE; - data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL); - if (data < 100) - { - if (data + itemEffect[sp24] > 100) - r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; - else - r4 = itemEffect[sp24]; - if (evCount + r4 > 510) - r4 += 510 - (evCount + r4); - data += r4; - SetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], &data); - CalculateMonStats(pkmn); - retVal = FALSE; - sp24++; - } - break; - case 4: - data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[moveIndex]) >> (moveIndex * 2); - if (data < 3) - { - r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); - data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); - data &= gUnknown_0820823C[moveIndex]; - data += gUnknown_08208240[moveIndex] * 3; - - SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); - data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4; - data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; - SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); - retVal = FALSE; - } - break; - case 5: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0) - { - sp2C = itemEffect[sp24]; - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * sp2C / 100; - else - friendship += sp2C; - if (sp2C > 0) - { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); - } - sp24++; - break; - case 6: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200 - && retVal == 0 && sp2C == 0) - { - sp2C = itemEffect[sp24]; - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * sp2C / 100; - else - friendship += sp2C; - if (sp2C > 0) - { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); - } - sp24++; - break; - case 7: - if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0) - { - sp2C = itemEffect[sp24]; - friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); - if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * sp2C / 100; - else - friendship += sp2C; - if (sp2C > 0) - { - if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) - friendship++; - if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; - SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); - } - sp24++; - break; - } - } - sp28++; - r10 >>= 1; - } - break; - } - } - return retVal; -} diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c deleted file mode 100644 index 532340ce4..000000000 --- a/src/pokemon/pokemon_menu.c +++ /dev/null @@ -1,1220 +0,0 @@ -#include "global.h" -#include "easy_chat.h" -#include "pokemon.h" -#include "pokemon_menu.h" -#include "party_menu.h" -#include "palette.h" -#include "menu.h" -#include "mail_data.h" -#include "constants/songs.h" -#include "sound.h" -#include "main.h" -#include "overworld.h" -#include "menu_helpers.h" -#include "pokemon_summary_screen.h" -#include "constants/moves.h" -#include "data2.h" -#include "strings.h" -#include "item_use.h" -#include "item.h" -#include "event_data.h" -#include "mail.h" -#include "field_player_avatar.h" -#include "fldeff_softboiled.h" -#include "braille_puzzles.h" -#include "field_fadetransition.h" -#include "field_weather.h" -#include "field_effect.h" -#include "field_control_avatar.h" -#include "metatile_behavior.h" -#include "fieldmap.h" -#include "item_menu.h" -#include "player_pc.h" -#include "ewram.h" -#include "script.h" - -/* -Pokemon menu: - The menu that appears when you - click on a pokemon in - overworld 'pokemon' menu -*/ - -struct PokeMenuFieldMoveFunc -{ - bool8 (*func)(void); - u8 field_1; -}; - -extern u8 gUnknown_020297ED; -extern u8 gUnknown_020384F0; -extern u8 gUnknown_0202E8F4; -extern u8 gUnknown_0202E8F5; -extern u8 gUnknown_0202E8F6; -extern u8 gUnknown_02038561; -extern u16 gUnknown_0202E8F8; -extern void (*gPokemonItemUseCallback)(u8 taskID, u16 itemID, TaskFunc func); -extern TaskFunc gUnknown_03005CF0; - -void sub_808A520(void); -void sub_80A61D0(void); -void CB2_InitFlyRegionMap(void); -bool8 SetUpFieldMove_Cut(void); -bool8 SetUpFieldMove_Flash(void); -bool8 SetUpFieldMove_RockSmash(void); -bool8 SetUpFieldMove_Strength(void); -bool8 SetUpFieldMove_Teleport(void); -bool8 SetUpFieldMove_Dig(void); -bool8 SetUpFieldMove_SecretPower(void); -bool8 SetUpFieldMove_SoftBoiled(void); -bool8 SetUpFieldMove_SoftBoiled(void); -bool8 SetUpFieldMove_SweetScent(void); - -#define sFieldMovesTerminator 0xFF // note: should be changed to 0xFFFF, because currently it makes it impossible to add a field move with 0xFF index - -// this file's functions -static void sub_808A8A8(void); -static void sub_808B3EC(void); -static void sub_8089D94(u8 taskID); -static void sub_8089E4C(u8 taskID); -static void sub_808A5BC(u8 taskID); -static void sub_808A8D4(u8 taskID); -static void sub_808A73C(u8 taskID); -static void sub_808A848(u8 taskID); -static void sub_808AAF0(u8 taskID); -static void sub_808ABF4(u8 taskID); -static void sub_808AB34(u8 taskID); -static void sub_808ABA8(u8 taskID); -static void sub_808B224(u8 taskID); -static void sub_808B2EC(u8 taskID); -static void sub_808B2B4(u8 taskID); -static void sub_808B25C(u8 taskID); -static void sub_808B1EC(u8 taskID); -static void sub_808B338(u8 taskID); -static void sub_808B4A4(u8 taskID); -static void sub_808B4EC(u8 taskID); -static void sub_808B5E4(u8 taskID); -static void PokemonMenu_Summary(u8 taskID); -static void PokemonMenu_Switch(u8 taskID); -static void PokemonMenu_Item(u8 taskID); -static void PokemonMenu_Cancel(u8 taskID); -static void PokemonMenu_GiveItem(u8 taskID); -static void PokemonMenu_TakeItem(u8 taskID); -static void PokemonMenu_TakeMail(u8 taskID); -static void PokemonMenu_Mail(u8 taskID); -static void PokemonMenu_ReadMail(u8 taskID); -static void PokemonMenu_CancelSubmenu(u8 taskID); -static void PokemonMenu_FieldMove(u8 taskID); -static bool8 SetUpFieldMove_Waterfall(void); -static bool8 SetUpFieldMove_Surf(void); -static bool8 SetUpFieldMove_Fly(void); -static bool8 SetUpFieldMove_Dive(void); - -// ewram data - -EWRAM_DATA static u8 sPokeMenuCursorPos = 0; -EWRAM_DATA static u8 sPokeMenuOptionsNo = 0; -EWRAM_DATA static u8 sPokeMenuOptionsOrder[8] = {0}; // 4 possible field moves and 4 default options - -// iwram common -u8 gLastFieldPokeMenuOpened; -void (*gUnknown_03005CE4)(void); - -// const data - -static const struct MenuAction2 sPokemonMenuActions[] = -{ - {OtherText_Summary, PokemonMenu_Summary}, - {OtherText_Switch2, PokemonMenu_Switch}, - {OtherText_Item, PokemonMenu_Item}, - {gOtherText_CancelNoTerminator, PokemonMenu_Cancel}, - {OtherText_Give2, PokemonMenu_GiveItem}, - {OtherText_Take2, PokemonMenu_TakeItem}, - {OtherText_Take, PokemonMenu_TakeMail}, - {OtherText_Mail, PokemonMenu_Mail}, - {OtherText_Read2, PokemonMenu_ReadMail}, - {gOtherText_CancelNoTerminator, PokemonMenu_CancelSubmenu}, - {gMoveNames[MOVE_CUT], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_FLASH], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_ROCK_SMASH], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_STRENGTH], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_SURF], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_FLY], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_DIVE], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_WATERFALL], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_TELEPORT], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_DIG], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_SECRET_POWER], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_MILK_DRINK], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_SOFT_BOILED], PokemonMenu_FieldMove}, - {gMoveNames[MOVE_SWEET_SCENT], PokemonMenu_FieldMove}, -}; - -static const u16 sPokeMenuFieldMoves[] = -{ - MOVE_CUT, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_STRENGTH, - MOVE_SURF, MOVE_FLY, MOVE_DIVE, MOVE_WATERFALL, - MOVE_TELEPORT, MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, - MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, sFieldMovesTerminator, -}; - -static const u8 sUnknown_39F572[] = {4, 5, 9, 0}; -static const struct PartyPopupMenu sUnknown_0839F578 = {3, 6, sUnknown_39F572}; - -static const u8 sUnknown_39F580[] = {8, 6, 9, 0}; -static const struct PartyPopupMenu sUnknown_0839F584 = {3, 9, sUnknown_39F580}; - -static const struct PokeMenuFieldMoveFunc sFieldMoveFuncs[] = -{ - {SetUpFieldMove_Cut, 0x6}, - {SetUpFieldMove_Flash, 0x9}, - {SetUpFieldMove_RockSmash, 0x9}, - {SetUpFieldMove_Strength, 0x9}, - {SetUpFieldMove_Surf, 0x7}, - {SetUpFieldMove_Fly, 0x9}, - {SetUpFieldMove_Dive, 0x9}, - {SetUpFieldMove_Waterfall, 0x9}, - {SetUpFieldMove_Teleport, 0x9}, - {SetUpFieldMove_Dig, 0x9}, - {SetUpFieldMove_SecretPower, 0x9}, - {SetUpFieldMove_SoftBoiled, 0x10}, - {SetUpFieldMove_SoftBoiled, 0x10}, - {SetUpFieldMove_SweetScent, 0x9}, -}; - -void sub_8089A70(void) -{ - gPaletteFade.bufferTransferDisabled = 1; - OpenPartyMenu(PARTY_MENU_TYPE_STANDARD, 0); -} - -static void sub_8089A8C(void) -{ - sPokeMenuOptionsNo = 0; - // if checking pokemon is an egg, we can't give it an item and it doesn't know any move - if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) - { - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SUMMARY); - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SWITCH); - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_CANCEL); - } - else - { - u16 moveID, tableID; - for (moveID = 0; moveID < 4; moveID++) // 4, max number of possible field moves - { - for (tableID = 0; sPokeMenuFieldMoves[tableID] != sFieldMovesTerminator; tableID++) - { - if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MOVE1 + moveID) == sPokeMenuFieldMoves[tableID]) - { - u8 fieldID = tableID + POKEMENU_FIRST_FIELD_MOVE_ID; - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, fieldID); - break; - } - } - } - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SUMMARY); - - // can't switch a pokemon if it's the only one in the party - if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES) != 0) - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SWITCH); - - if (ItemIsMail(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM))) - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_MAIL); - else - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_ITEM); - - AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_CANCEL); - } -} - -static void sub_8089BDC(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order, u8 arg6) -{ - PrintPartyMenuPromptText(5, arg6); - Menu_DrawStdWindowFrame(arg0, arg1, arg0 + arg2, (noOfOptions * 2) + arg1 + 1); - Menu_PrintItemsReordered(arg0 + 1, arg1 + 1, noOfOptions, menuActions, order); -} - -void sub_8089C50(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order) -{ - sub_8089BDC(arg0, arg1, arg2, noOfOptions, menuActions, order, 1); -} - -static void sub_8089C7C(u8 arg0) -{ - u32 r4 = (u8)(18 - (sPokeMenuOptionsNo << 1)); - - sub_8089BDC(19, r4, 10, sPokeMenuOptionsNo, sPokemonMenuActions, sPokeMenuOptionsOrder, 3); - r4 |= 1; - InitMenu(0, 20, r4, sPokeMenuOptionsNo, arg0, 9); -} - -void HandleDefaultPartyMenu(u8 taskID) -{ - if (!gPaletteFade.active) - { - switch (HandleDefaultPartyMenuInput(taskID)) - { - case A_BUTTON: - PlaySE(SE_SELECT); - gLastFieldPokeMenuOpened = sub_806CA38(taskID); - GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); - sub_8089A8C(); - sPokeMenuCursorPos = 0; - sub_8089C7C(0); - gTasks[taskID].func = sub_8089D94; - sub_808B5B4(taskID); - break; - case B_BUTTON: - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = sub_8089E4C; - break; - } - } -} - -static void sub_8089D94(u8 taskID) -{ - if (!gPaletteFade.active) - { - if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) - { - PlaySE(SE_SELECT); - sPokeMenuCursorPos = Menu_MoveCursor(-1); - sub_808B5B4(taskID); - } - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) - { - PlaySE(SE_SELECT); - sPokeMenuCursorPos = Menu_MoveCursor(1); - sub_808B5B4(taskID); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sPokemonMenuActions[sPokeMenuOptionsOrder[sPokeMenuCursorPos]].func(taskID); - sub_808B5B4(taskID); - } - else if (gMain.newKeys & B_BUTTON) - { - PokemonMenu_Cancel(taskID); - sub_808B5B4(taskID); - } - } -} - -static void sub_8089E4C(u8 taskID) -{ - if (!gPaletteFade.active) - { - gLastFieldPokeMenuOpened = 0; - SetMainCallback2(sub_805469C); - DestroyTask(taskID); - } -} - -static void sub_8089E84(void) -{ - GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); - sub_8089A8C(); - sPokeMenuCursorPos = 0; - sub_8089C7C(0); -} - -static void sub_8089EBC(void) -{ - do - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); - ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); - gLastFieldPokeMenuOpened = gUnknown_020384F0; - sub_8089E84(); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - } while (sub_80F9344() != TRUE); -} - -static void sub_8089F14(void) -{ - gPaletteFade.bufferTransferDisabled = 1; - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_8089D94, 5); - SetMainCallback2(sub_8089EBC); -} - -static void sub_8089F44(u8 taskID) -{ - if (!gPaletteFade.active) - { - u8 spriteID = gSprites[gTasks[taskID].data[3] >> 8].data[0]; - DestroyTask(taskID); - ewram1B000_alt.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, spriteID, gPlayerPartyCount - 1, sub_8089F14, PSS_MODE_NORMAL); - } -} - -static void PokemonMenu_Summary(u8 taskID) -{ - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = sub_8089F44; -} - -void DoPokemonMenu_Switch(u8 taskID) -{ - SetTaskFuncWithFollowupFunc(taskID, SetupDefaultPartyMenuSwitchPokemon, HandleDefaultPartyMenu); - Menu_EraseWindowRect(19, 0, 29, 19); -} - -static void PokemonMenu_Switch(u8 taskID) -{ - Menu_DestroyCursor(); - ewram01000.unkC = sub_806CD5C; - ewram01000.array[53553] = 1; - DoPokemonMenu_Switch(taskID); -} - -static void sub_808A060(u8 taskID) -{ - if (gMain.newKeys == DPAD_UP && sPokeMenuCursorPos != 0) - { - sPokeMenuCursorPos = Menu_MoveCursor(-1); - PlaySE(SE_SELECT); - } - if (gMain.newKeys == DPAD_DOWN && sPokeMenuCursorPos != 2) - { - sPokeMenuCursorPos = Menu_MoveCursor(1); - PlaySE(SE_SELECT); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F578, sPokemonMenuActions, sPokeMenuCursorPos)(taskID); - } - else if (gMain.newKeys & B_BUTTON) - { - ClosePartyPopupMenu(0, &sUnknown_0839F578); - PokemonMenu_CancelSubmenu(taskID); - } -} - -static void sub_808A100(u8 taskID) -{ - ShowPartyPopupMenu(0, &sUnknown_0839F578, (void*)(sPokemonMenuActions), 0); - PrintPartyMenuPromptText(0xD, 2); - gTasks[taskID].func = sub_808A060; -} - -static void PokemonMenu_Item(u8 taskID) -{ - Menu_DestroyCursor(); - sPokeMenuCursorPos = 0; - Menu_EraseWindowRect(19, 0, 29, 19); - gTasks[taskID].func = sub_808A100; -} - -static void sub_808A180(u8 taskID) -{ - if (!gPaletteFade.active) - { - u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL); - DestroyTask(taskID); - sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808A520, 3); - } -} - -static void sub_808A1E0(u8 taskID) -{ - if (gUnknown_0202E8F6 != 1) - { - SetHeldItemIconVisibility(taskID, sub_806CA38(taskID)); - PrintPartyMenuPromptText(0, 0); - gTasks[taskID].func = HandleDefaultPartyMenu; - } -} - -static void sub_808A228(u8 taskID) -{ - if (ItemIsMail(gSpecialVar_ItemId) && gUnknown_0202E8F4 != 0) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = sub_808A180; - } - else - { - Menu_EraseWindowRect(0, 0, 29, 19); - PrintPartyMenuPromptText(0, 0); - gTasks[taskID].func = HandleDefaultPartyMenu; - } -} - -static void sub_808A2AC(u8 taskID) -{ - if (!gPaletteFade.active) - PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808A228); -} - -static void sub_808A2DC(u8 taskID) -{ - u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL); - DestroyTask(taskID); - sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808A520, 3); -} - -static void sub_808A330(u8 taskID) -{ - PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808A2DC); -} - -static void sub_808A34C(void) -{ - RunTasks(); -} - -static void sub_808A358(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); - ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -static void sub_808A3A4(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); - ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); - EWRAM_1B000.unk262 = 3; - sub_8089E84(); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_808A3F8(void) -{ - if (ItemIsMail(gSpecialVar_ItemId)) - { - u8 taskID = CreateTask(sub_808A330, 0); - gPaletteFade.bufferTransferDisabled = 1; - sub_806BD58(taskID, 0); - sub_806C994(taskID, gLastFieldPokeMenuOpened); - ChangePartyMenuSelection(taskID, 0); - if (!(bool8)(GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_HELD_ITEM))) - { - SetMainCallback2(sub_808A34C); - return; - } - else - DestroyTask(taskID); - } - gPaletteFade.bufferTransferDisabled = 1; - if (gSpecialVar_ItemId) - { - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_808A2AC, 0xFF); - SetMainCallback2(sub_808A358); - } - else - { - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_8089D94, 5); - SetMainCallback2(sub_808A3A4); - } -} - -static void sub_808A4D4(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); - ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_808A520(void) -{ - gPaletteFade.bufferTransferDisabled = 1; - if (gSpecialVar_Result == 0) - { - if (gUnknown_0202E8F8) - RemoveBagItem(gUnknown_0202E8F8, 1); - AddBagItem(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM), 1); - TakeMailFromMon(&gPlayerParty[gLastFieldPokeMenuOpened]); - SetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM, (void*) &gUnknown_0202E8F8); - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, HandleDefaultPartyMenu, 0); - } - else - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_808A5BC, 0xFF); - SetMainCallback2(sub_808A4D4); -} - -static void sub_808A5BC(u8 taskID) -{ - if (!gPaletteFade.active) - { - DisplayGiveHeldItemMessage(gLastFieldPokeMenuOpened, gSpecialVar_ItemId, 0); - gTasks[taskID].func = sub_808A1E0; - } -} - -static void sub_808A604(u8 taskID) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(sub_80A61D0); - DestroyTask(taskID); - } -} - -static void PokemonMenu_GiveItem(u8 taskID) -{ - gUnknown_0202E8F5 = sub_806CA38(taskID); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = sub_808A604; -} - -static void sub_808A678(u8 taskID) -{ - sub_808A8D4(taskID); -} - -static void PokemonMenu_TakeItem(u8 taskID) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(19, 0, 29, 19); - sub_806D5A4(); - PartyMenuTryGiveMonHeldItem_806ECE8(taskID, sub_808A678); -} - -static void PokemonMenu_TakeMail(u8 taskID) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(19, 0, 29, 19); - sub_806D5A4(); - DoTakeMail(taskID, sub_808A678); -} - -static void PokemonMenu_Mail(u8 taskID) -{ - Menu_DestroyCursor(); - sPokeMenuCursorPos = 0; - Menu_EraseWindowRect(19, 0, 29, 19); - ShowPartyPopupMenu(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, 0); - gTasks[taskID].func = sub_808A73C; -} - -static void sub_808A73C(u8 taskID) -{ - if (gMain.newAndRepeatedKeys == DPAD_UP) - { - PlaySE(SE_SELECT); - if (sPokeMenuCursorPos == 0) - sPokeMenuCursorPos = Menu_MoveCursor(sUnknown_0839F584.numChoices - 1); - else - sPokeMenuCursorPos = Menu_MoveCursor(-1); - } - if (gMain.newAndRepeatedKeys == DPAD_DOWN) - { - PlaySE(SE_SELECT); - if (sPokeMenuCursorPos == sUnknown_0839F584.numChoices - 1) - sPokeMenuCursorPos = Menu_MoveCursor(1 - sUnknown_0839F584.numChoices); - else - sPokeMenuCursorPos = Menu_MoveCursor(1); - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F584, sPokemonMenuActions, sPokeMenuCursorPos)(taskID); - } - else if (gMain.newKeys & B_BUTTON) - { - ClosePartyPopupMenu(0, &sUnknown_0839F584); - PokemonMenu_Cancel(taskID); - } -} - -static void PokemonMenu_ReadMail(u8 taskID) -{ - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = sub_808A848; -} - -static void sub_808A848(u8 taskID) -{ - if (!gPaletteFade.active) - { - u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL); - DestroyTask(taskID); - HandleReadMail(&gSaveBlock1.mail[mailID], sub_808A8A8, 1); - } -} - -static void sub_808A8A8(void) -{ - gUnknown_020384F0 = gLastFieldPokeMenuOpened; - ewram1B000.unk262 = 4; - sub_8089F14(); -} - -static void sub_808A8D4(u8 taskID) -{ - sPokeMenuCursorPos = 0; - Menu_EraseWindowRect(19, 0, 29, 19); - PrintPartyMenuPromptText(0, 0); - gTasks[taskID].func = HandleDefaultPartyMenu; -} - -static void PokemonMenu_Cancel(u8 taskID) -{ - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - sub_808A8D4(taskID); -} - -static void PokemonMenu_CancelSubmenu(u8 taskID) -{ - Menu_DestroyCursor(); - PlaySE(SE_SELECT); - Menu_EraseWindowRect(19, 0, 29, 19); - sub_806D5A4(); - sub_8089C7C(sPokeMenuCursorPos); - gTasks[taskID].func = sub_8089D94; -} - -#define IS_SOFTBOILED_MILKDRINK(ID)((ID == (POKEMENU_MILK_DRINK - POKEMENU_FIRST_FIELD_MOVE_ID) || ID == (POKEMENU_SOFT_BOILED - POKEMENU_FIRST_FIELD_MOVE_ID))) -#define IS_SURF(ID)((ID == (POKEMENU_SURF - POKEMENU_FIRST_FIELD_MOVE_ID))) -#define IS_FLY(ID)((ID == (POKEMENU_FLY - POKEMENU_FIRST_FIELD_MOVE_ID))) - -#define tFieldMoveId data[11] - -static void PokemonMenu_FieldMove(u8 taskID) -{ - s16* data = gTasks[taskID].data; - - Menu_DestroyCursor(); - tFieldMoveId = sPokeMenuOptionsOrder[sPokeMenuCursorPos] - POKEMENU_FIRST_FIELD_MOVE_ID; - if (sub_80F9344() == TRUE) - { - Menu_EraseWindowRect(19, 0, 29, 19); - if (IS_SOFTBOILED_MILKDRINK(tFieldMoveId)) - PrintPartyMenuPromptText(9, 0); - else - PrintPartyMenuPromptText(sFieldMoveFuncs[tFieldMoveId].field_1, 0); - gTasks[taskID].func = sub_808ABF4; - } - else if (tFieldMoveId <= 7 && FlagGet(FLAG_BADGE01_GET + tFieldMoveId) != TRUE) - { - // can't use a field HM move without a proper badge - Menu_EraseWindowRect(19, 0, 29, 19); - sub_806D5A4(); - sub_806E834(gOtherText_CantBeUsedBadge, 1); - gTasks[taskID].func = sub_808AAF0; - } - else - { - if (sFieldMoveFuncs[tFieldMoveId].func() == TRUE) - { - sPokeMenuCursorPos = 0; - if (!IS_SOFTBOILED_MILKDRINK(tFieldMoveId)) - { - gTasks[taskID].func = sub_808AB34; - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - } - else - sub_8133D28(taskID); - } - else - { - Menu_EraseWindowRect(19, 0, 29, 19); - if (IS_SURF(tFieldMoveId) && TestPlayerAvatarFlags(8)) - PrintPartyMenuPromptText(8, 0); - else - PrintPartyMenuPromptText(sFieldMoveFuncs[tFieldMoveId].field_1, 0); - gTasks[taskID].func = sub_808ABF4; - } - } -} - -static void sub_808AAF0(u8 taskID) -{ - if (gUnknown_0202E8F6 != 1 && (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)) - { - Menu_EraseWindowRect(0, 14, 29, 19); - PokemonMenu_Cancel(taskID); - } -} - -static void sub_808AB34(u8 taskID) -{ - if (!gPaletteFade.active) - { - if (!IS_FLY(gTasks[taskID].tFieldMoveId) || ShouldDoBrailleFlyEffect()) - SetMainCallback2(c2_exit_to_overworld_2_switch); - else - SetMainCallback2(CB2_InitFlyRegionMap); - DestroyTask(taskID); - } -} - -#undef tFieldMoveId - -void FieldCallback_Teleport(void) -{ - pal_fill_black(); - CreateTask(sub_808ABA8, 8); -} - -static void sub_808ABA8(u8 taskID) -{ - if (IsWeatherNotFadingIn() == TRUE) - { - gFieldEffectArguments[0] = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES); - gUnknown_03005CE4(); - DestroyTask(taskID); - } -} - -static void sub_808ABF4(u8 taskID) -{ - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) - { - Menu_EraseWindowRect(1, 17, 28, 18); - PokemonMenu_Cancel(taskID); - } -} - -static void sub_808AC2C(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - FieldEffectStart(FLDEFF_USE_SURF); -} - -static bool8 SetUpFieldMove_Surf(void) -{ - if (PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_808AC2C; - return TRUE; - } - else - return FALSE; -} - -static void sub_808AC8C(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - FieldEffectStart(FLDEFF_USE_FLY); -} - -static bool8 SetUpFieldMove_Fly(void) -{ - if (ShouldDoBrailleFlyEffect()) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = DoBrailleFlyEffect; - return TRUE; - } - if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_808AC8C; - return TRUE; - } - return FALSE; -} - -static void sub_808AD0C(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); - ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_808AD58(void) -{ - gPaletteFade.bufferTransferDisabled = 1; - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, HandleDefaultPartyMenu, 0); - SetMainCallback2(sub_808AD0C); -} - -u16 unref_sub_808AD88(void) -{ - return GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES); -} - -static void sub_808ADAC(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - FieldEffectStart(FLDEFF_USE_DIVE); -} - -static bool8 SetUpFieldMove_Dive(void) -{ - gFieldEffectArguments[1] = sub_8068F18(); - if (gFieldEffectArguments[1]) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_808ADAC; - return TRUE; - } - else - return FALSE; -} - -static void sub_808AE08(void) -{ - gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; - FieldEffectStart(FLDEFF_USE_WATERFALL); -} - -static bool8 SetUpFieldMove_Waterfall(void) -{ - s16 x, y; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE - && IsPlayerSurfingNorth() == TRUE) - { - gFieldCallback = FieldCallback_Teleport; - gUnknown_03005CE4 = sub_808AE08; - return TRUE; - } - else - return FALSE; -} - -#if DEBUG -void debug_sub_80986AC(void) -{ - s16 x, y; - - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE - && IsPlayerSurfingNorth() == TRUE) - sub_808AE08(); - else - ScriptContext2_Disable(); -} -#endif - -static void sub_808AE8C(void) -{ - u8 i; - u8 arg = gSpecialVar_ItemId - 33; - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) - { - sub_806D668(i); - if ( -#if DEBUG - gUnknown_020297ED == 0 && -#endif - (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg))) - sub_806BC3C(i, 0x9A); - else if (pokemon_has_move(&gPlayerParty[i], ItemIdToBattleMoveId(gSpecialVar_ItemId))) - sub_806BC3C(i, 0xA8); - else - sub_806BC3C(i, 0x8C); - } - } -} - -static void sub_808AF20(void) -{ - u8 i; - for (i = 0; i < 6; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !GetEvolutionTargetSpecies(&gPlayerParty[i], 3, gSpecialVar_ItemId)) - { - sub_806D668(i); - sub_806BC3C(i, 0); - } - } - } -} - -static void sub_808AF80(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - if (gUnknown_02038561 == 0) - { - switch (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId)) - { - case 1: - sub_808AE8C(); - break; - case 2: - sub_808AF20(); - break; - } - } - if (gLastFieldPokeMenuOpened > 5 || !GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES)) - gLastFieldPokeMenuOpened = 0; - sub_806C994(ewram1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); - ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_808B020(void) -{ - gPaletteFade.bufferTransferDisabled = 1; - switch (gUnknown_02038561) - { - case 0: - if (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId) == 1) - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 20); - else - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 3); - break; - case 4: - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B1EC, 0xFF); - break; - case 1: - case 3: - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 4); - break; - } - SetMainCallback2(sub_808AF80); -} - -void sub_808B0C0(u8 taskID) -{ - if (!gPaletteFade.active) - { - switch (HandleDefaultPartyMenuInput(taskID)) - { - case A_BUTTON: - gLastFieldPokeMenuOpened = sub_806CA38(taskID); - if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) - PlaySE(SE_HAZURE); - else - { - sub_806D5A4(); - if (gUnknown_02038561 == 0) - gPokemonItemUseCallback(taskID, gSpecialVar_ItemId, sub_808B224); - if (gUnknown_02038561 == 1) - { - PlaySE(SE_SELECT); - PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808B2EC); - } - if (gUnknown_02038561 == 3) - { - PlaySE(SE_SELECT); - PartyMenuTryGiveMonMail(taskID, sub_808B2B4); - } - } - break; - case B_BUTTON: - gLastFieldPokeMenuOpened = sub_806CA38(taskID); - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - if (gUnknown_02038561 == 0 || gUnknown_02038561 == 1) - gTasks[taskID].func = sub_808B25C; - if (gUnknown_02038561 == 3) - gTasks[taskID].func = sub_808B2B4; - break; - } - } -} - -static void sub_808B1EC(u8 taskID) -{ - if (!gPaletteFade.active) - gPokemonItemUseCallback(taskID, gSpecialVar_ItemId, sub_808B224); -} - -static void sub_808B224(u8 taskID) -{ - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = sub_808B25C; -} - -static void sub_808B25C(u8 taskID) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(sub_80A5B40); - DestroyTask(taskID); - } -} - -static void sub_808B288(u8 taskID) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(Mailbox_ReturnToMailListAfterDeposit); - DestroyTask(taskID); - } -} - -static void sub_808B2B4(u8 taskID) -{ - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = sub_808B288; -} - -static void sub_808B2EC(u8 taskID) -{ - if (gUnknown_0202E8F4 == 2) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].func = sub_808B338; - } - else - sub_808B224(taskID); -} - -static void sub_808B338(u8 taskID) -{ - if (!gPaletteFade.active) - { - u8 mailID; - - gLastFieldPokeMenuOpened = sub_806CA38(taskID); - mailID = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAIL); - DestroyTask(taskID); - sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808B3EC, 3); - } -} - -static void sub_808B3A0(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); - ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -static void sub_808B3EC(void) -{ - IntrCallback callback; - - gPaletteFade.bufferTransferDisabled = 1; - if (gSpecialVar_Result == 0) - { - if (gUnknown_0202E8F8) - RemoveBagItem(gUnknown_0202E8F8, 1); - AddBagItem(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM), 1); - TakeMailFromMon(&gPlayerParty[gLastFieldPokeMenuOpened]); - SetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM, (void*) &gUnknown_0202E8F8); - CreateTask(sub_808B25C, 5); - gPaletteFade.bufferTransferDisabled = 0; - callback = CB2_PartyMenuMain; - } - else - { - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B4A4, 0xFF); - callback = sub_808B3A0; - } - SetMainCallback2(callback); -} - -static void sub_808B4A4(u8 taskID) -{ - if (!gPaletteFade.active) - { - DisplayGiveHeldItemMessage(gLastFieldPokeMenuOpened, gSpecialVar_ItemId, 1); - gTasks[taskID].func = sub_808B4EC; - } -} - -static void sub_808B4EC(u8 taskID) -{ - if (gUnknown_0202E8F6 != 1) - sub_808B224(taskID); -} - -void sub_808B508(u8 taskID) -{ - sub_808B224(taskID); -} - -static void sub_808B518(void) -{ - while (1) - { - if (InitPartyMenu() == TRUE) - { - sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); - ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); - SetMainCallback2(CB2_PartyMenuMain); - break; - } - if (sub_80F9344() == TRUE) - break; - } -} - -void sub_808B564(void) -{ - gPaletteFade.bufferTransferDisabled = 1; - if (sub_809FA30() != 4) - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, TaughtMove, 0xFF); - else - SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, StopTryingToTeachMove_806F588, 0xFF); - SetMainCallback2(sub_808B518); -} - -void sub_808B5B4(u32 taskID) -{ - gUnknown_03005CF0 = gTasks[taskID].func; - gTasks[taskID].func = sub_808B5E4; - sub_808B5E4(taskID); -} - -static void sub_808B5E4(u8 taskID) -{ - if (sub_8055870() != TRUE) - gTasks[taskID].func = gUnknown_03005CF0; -} diff --git a/src/pokemon/pokemon_size_record.c b/src/pokemon/pokemon_size_record.c deleted file mode 100644 index f92a95bfb..000000000 --- a/src/pokemon/pokemon_size_record.c +++ /dev/null @@ -1,217 +0,0 @@ -#include "global.h" -#include "pokemon_size_record.h" -#include "data2.h" -#include "event_data.h" -#include "pokedex.h" -#include "constants/species.h" -#include "string_util.h" -#include "strings2.h" -#include "text.h" - -struct UnknownStruct -{ - u16 unk0; - u8 unk2; - u16 unk4; -}; - -extern u16 gSpecialVar_Result; - -static const struct UnknownStruct sBigMonSizeTable[] = -{ - { 290, 1, 0 }, - { 300, 1, 10 }, - { 400, 2, 110 }, - { 500, 4, 310 }, - { 600, 20, 710 }, - { 700, 50, 2710 }, - { 800, 100, 7710 }, - { 900, 150, 17710 }, - { 1000, 150, 32710 }, - { 1100, 100, -17826 }, - { 1200, 50, -7826 }, - { 1300, 20, -2826 }, - { 1400, 5, -826 }, - { 1500, 2, -326 }, - { 1600, 1, -126 }, - { 1700, 1, -26 }, -}; - -#define CM_PER_INCH 2.54 - -static u32 GetMonSizeHash(struct Pokemon *pkmn) -{ - // UB: Too few arguments for function 'GetMonData' - u16 personality = GetMonData(pkmn, MON_DATA_PERSONALITY); - u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF; - u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF; - u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF; - u16 speedIV = GetMonData(pkmn, MON_DATA_SPEED_IV) & 0xF; - u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF; - u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF; - u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF); - u32 lobyte = ((spAtkIV ^ spDefIV) * speedIV) ^ (personality >> 8); - - return (hibyte << 8) + lobyte; -} - -static u8 TranslateBigMonSizeTableIndex(u16 a) -{ - u8 i; - - for (i = 1; i < 15; i++) - { - if (a < sBigMonSizeTable[i].unk4) - return i - 1; - } - return i; -} - -static u32 GetMonSize(u16 species, u16 b) -{ - u64 unk2; - u64 unk4; - u64 unk0; - u32 height; - u32 var; - - height = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(species), 0); - var = TranslateBigMonSizeTableIndex(b); - unk0 = sBigMonSizeTable[var].unk0; - unk2 = sBigMonSizeTable[var].unk2; - unk4 = sBigMonSizeTable[var].unk4; - unk0 += (b - unk4) / unk2; - return height * unk0 / 10; -} - -static void FormatMonSizeRecord(u8 *string, u32 size) -{ -#if ENGLISH - u8 decimalPoint[] = _("."); -#elif GERMAN - u8 decimalPoint[] = _(","); -#endif - -#ifdef UNITS_IMPERIAL - //Convert size from centimeters to inches - size = (double)(size * 10) / (CM_PER_INCH * 10); -#endif - - string = ConvertIntToDecimalStringN(string, size / 10, 0, 8); - string = StringAppend(string, decimalPoint); - ConvertIntToDecimalStringN(string, size % 10, 0, 1); -} - -static u8 CompareMonSize(u16 species, u16 *sizeRecord) -{ - if (gSpecialVar_Result == 0xFF) - { - return 0; - } - else - { - struct Pokemon *pkmn = &gPlayerParty[gSpecialVar_Result]; - - // UB: Too few arguments for function 'GetMonData' - if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species) - { - return 1; - } - else - { - u32 oldSize; - u32 newSize; - u16 sizeParams; - - *(&sizeParams) = GetMonSizeHash(pkmn); - newSize = GetMonSize(species, sizeParams); - oldSize = GetMonSize(species, *sizeRecord); - FormatMonSizeRecord(gStringVar2, newSize); - if (newSize <= oldSize) - { - return 2; - } - else - { - *sizeRecord = sizeParams; - return 3; - } - } - } -} - -//Stores species name in gStringVar1, trainer's name in gStringVar2, and size in gStringVar3 -static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord) -{ - u32 size = GetMonSize(species, *sizeRecord); - - FormatMonSizeRecord(gStringVar3, size); - StringCopy(gStringVar1, gSpeciesNames[species]); - if (*sizeRecord == 0x8100) - StringCopy(gStringVar2, gOtherText_Marco); - else - StringCopy(gStringVar2, gSaveBlock2.playerName); -} - -void InitShroomishSizeRecord(void) -{ - VarSet(VAR_SHROOMISH_SIZE_RECORD, 0x8100); -} - -void GetShroomishSizeRecordInfo(void) -{ - u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD); - - GetMonSizeRecordInfo(SPECIES_SHROOMISH, sizeRecord); -} - -void CompareShroomishSize(void) -{ - u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD); - - gSpecialVar_Result = CompareMonSize(SPECIES_SHROOMISH, sizeRecord); -} - -void InitBarboachSizeRecord(void) -{ - VarSet(VAR_BARBOACH_SIZE_RECORD, 0x8100); -} - -void GetBarboachSizeRecordInfo(void) -{ - u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD); - - GetMonSizeRecordInfo(SPECIES_BARBOACH, sizeRecord); -} - -void CompareBarboachSize(void) -{ - u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD); - - gSpecialVar_Result = CompareMonSize(SPECIES_BARBOACH, sizeRecord); -} - -void GiveGiftRibbonToParty(u8 index, u8 ribbonId) -{ - s32 i; - bool32 gotRibbon = FALSE; - u8 data = 1; - u8 arr[] = { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E }; - - if (index < 11 && ribbonId < 65) - { - gSaveBlock1.giftRibbons[index] = ribbonId; - for (i = 0; i < 6; i++) - { - struct Pokemon *pkmn = &gPlayerParty[i]; - - if (GetMonData(pkmn, MON_DATA_SPECIES) != 0 && GetMonData(pkmn, MON_DATA_SANITY_BIT3) == 0) - { - SetMonData(pkmn, arr[index], &data); - gotRibbon = TRUE; - } - } - if (gotRibbon) - FlagSet(FLAG_SYS_RIBBON_GET); - } -} diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c deleted file mode 100644 index 1ea8bc205..000000000 --- a/src/pokemon/pokemon_storage_system.c +++ /dev/null @@ -1,784 +0,0 @@ -#include "global.h" -#include "palette.h" -#include "constants/songs.h" -#include "sound.h" -#include "field_weather.h" -#include "overworld.h" -#include "field_fadetransition.h" -#include "menu.h" -#include "main.h" -#include "strings.h" -#include "string_util.h" -#include "event_data.h" -#include "script.h" -#include "pokemon_storage_system.h" - -void StorageSystemCreatePrimaryMenu(u8 whichMenu); -void sub_80963D0(u8 curBox); -void sub_809658C(void); -void sub_80965F8(void); -void sub_809662C(void); -void sub_809665C(void); -void sub_80966F4(const u8 *sourceString, u16 x, u16 y); -void sub_8096784(struct Sprite *sprite); - -EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; -EWRAM_DATA u8 gUnknown_02038470[3] = {}; -EWRAM_DATA u8 gUnknown_02038473 = 0; -EWRAM_DATA u8 gUnknown_02038474 = 0; -EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478 = NULL; - -const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { - {PCText_WithdrawPoke, PCText_MovePokeToParty}, - {PCText_DepositPoke, PCText_StorePokeInBox}, - {PCText_MovePoke, PCText_OrganizeBoxesParty}, - {PCText_SeeYa, PCText_ReturnToPrevMenu} -}; - -#if DEBUG -const u16 gUnknown_Debug_083E05F0[2] = {0}; -#endif - -const union AnimCmd gSpriteAnim_83B602C[] = { - ANIMCMD_FRAME( 0, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83B6034[] = { - ANIMCMD_FRAME( 4, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83B603C[] = { - ANIMCMD_FRAME( 6, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83B6044[] = { - ANIMCMD_FRAME(10, 5), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83B604C[] = { - gSpriteAnim_83B602C, - gSpriteAnim_83B6034, - gSpriteAnim_83B603C, - gSpriteAnim_83B6044 -}; - -const union AffineAnimCmd gSpriteAffineAnim_83B605C[] = { - AFFINEANIMCMD_FRAME(0xe0, 0xe0, 0, 0), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_83B606C[] = { - gSpriteAffineAnim_83B605C -}; - -const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal"); - -const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); - -const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); - -u8 CountPokemonInBoxN(u8 boxId) -{ - u16 i; - u16 count; - - for (i = 0, count = 0; i < 30; i++) - { - if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) != 0) - count++; - } - return count; -} - -s16 GetIndexOfFirstEmptySpaceInBoxN(u8 boxId) -{ - u16 i; - - for (i = 0; i < 30; i++) - { - if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) == 0) - return i; - } - return -1; -} - -u8 GetNumValidDaycarePartyMons(void) -{ - u16 i; - u16 count; - - for (i = 0, count = 0; i < PARTY_SIZE; i++) - { - struct Pokemon *pokemon = gPlayerParty + i; - if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG)) - count++; - } - return count; -} - -u8 CountAlivePartyMonsExceptOne(u8 toSkip) -{ - u16 i; - u16 count; - - for (i = 0, count = 0; i < PARTY_SIZE; i++) - { - if (i != toSkip) - { - struct Pokemon *pokemon = gPlayerParty + i; - if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG) && GetMonData(pokemon, MON_DATA_HP) != 0) - count++; - } - } - return count; -} - -u8 CountAlivePartyMonsExceptSelectedOne(void) -{ - return CountAlivePartyMonsExceptOne(gSpecialVar_0x8004); -} - -u8 StorageSystemGetPartySize(void) -{ - u16 i; - u16 count; - - for (i = 0, count = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != 0) - count++; - } - return count; -} - -u8 *unref_sub_8095C60(u8 *dest, const u8 *src, u16 pad) -{ - u8 *_dest = StringCopy(dest, src); - while (_dest < dest + pad) - { - *_dest++ = CHAR_SPACE; - } - *_dest = EOS; - return _dest; -} - -void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) -{ - u16 i; - - dest_width *= 2; - dest += dest_top * 0x20 + dest_left; - src += src_top * src_width + src_left; - for (i = 0; i < dest_height; i++) - { - CpuCopy16(src, dest, dest_width); - dest += 0x20; - src += src_width; - } -} - -#define MAX_DMA_BLOCK_SIZE 0x1000 -#define Dma3FillLarge_(value, dest, size, bit) \ -{ \ - void *_dest = dest; \ - u32 _size = size; \ - while (1) \ - { \ - if (_size <= MAX_DMA_BLOCK_SIZE) \ - { \ - DmaFill##bit(3, value, _dest, _size); \ - break; \ - } \ - DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ - _dest += MAX_DMA_BLOCK_SIZE; \ - _size -= MAX_DMA_BLOCK_SIZE; \ - } \ -} - -#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) -#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) - -void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) -{ - u16 i; - - dest += dest_top * 0x20 + dest_left; - width *= 2; - for (i = 0; i < height; dest += 0x20, i++) - Dma3FillLarge16_(0, dest, width); -} - -s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) -{ - s16 i; - s16 direction; - if (mode == 0 || mode == 2) - { - direction = 1; - } - else - { - direction = -1; - } - if (mode == 2 || mode == 3) - { - for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction) - { - if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0) - return i; - } - } - else - { - for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction) - { - if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0 && !GetBoxMonData(box + i, MON_DATA_IS_EGG)) - return i; - } - } - return -1; -} - -void StorageSystemClearMessageWindow(void) -{ - Menu_BlankWindowRect(2, 15, 27, 18); -} - -void Task_PokemonStorageSystem(u8 taskId) -{ - struct Task *task = gTasks + taskId; - switch (task->data[0]) - { - case 0: - StorageSystemCreatePrimaryMenu(task->data[1]); - Menu_DisplayDialogueFrame(); - Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); - task->data[0]++; - break; - case 1: - if (IsWeatherNotFadingIn()) - { - task->data[0]++; - } - break; - case 2: - task->data[2] = Menu_ProcessInput(); - switch(task->data[2]) - { - case -2: - task->data[3] = task->data[1]; - if (gMain.newKeys & DPAD_UP && --task->data[3] < 0) - task->data[3] = 3; - - if (gMain.newKeys & DPAD_DOWN && ++task->data[3] > 3) - task->data[3] = 0; - if (task->data[1] != task->data[3]) - { - task->data[1] = task->data[3]; - StorageSystemClearMessageWindow(); - Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); - } - break; - case -1: - case 3: - Menu_DestroyCursor(); - Menu_EraseWindowRect(0, 0, 13, 9); - ScriptContext2_Disable(); - EnableBothScriptContexts(); - DestroyTask(taskId); - break; - default: - if (task->data[2] == 0 && StorageSystemGetPartySize() == PARTY_SIZE) - { - StorageSystemClearMessageWindow(); - Menu_PrintText(gPCText_PartyFull2, 2, 15); - task->data[0] = 3; - } - else if (task->data[2] == 1 && StorageSystemGetPartySize() == 1) - { - StorageSystemClearMessageWindow(); - Menu_PrintText(gPCText_OnlyOne, 2, 15); - task->data[0] = 3; - } - else - { - FadeScreen(1, 0); - task->data[0] = 4; - } - break; - } - break; - case 3: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - StorageSystemClearMessageWindow(); - Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); - task->data[0] = 2; - } - else if (gMain.newKeys & DPAD_UP) - { - if (--task->data[1] < 0) - task->data[1] = 3; - Menu_MoveCursor(-1); - task->data[1] = Menu_GetCursorPos(); - StorageSystemClearMessageWindow(); - Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); - task->data[0] = 2; - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (++task->data[1] > 3) - task->data[1] = 0; - Menu_MoveCursor(1); - task->data[1] = Menu_GetCursorPos(); - StorageSystemClearMessageWindow(); - Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); - task->data[0] = 2; - } - break; - case 4: - if (!gPaletteFade.active) - { - task_intro_29(task->data[2]); - DestroyTask(taskId); - } - break; - } -} - -void ShowPokemonStorageSystem(void) -{ - u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - ScriptContext2_Enable(); -} - -void FieldCB_ReturnToOverworld(void) -{ - u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = gUnknown_02038474; - pal_fill_black(); -} - -void StorageSystemCreatePrimaryMenu(u8 whichMenu) -{ - Menu_DrawStdWindowFrame(0, 0, 13, 9); - Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083B600C); - InitMenu(0, 1, 1, 4, whichMenu, 12); -} - -void sub_80961A8(void) -{ - gUnknown_02038474 = gPokemonStorageSystemPtr->unk_0005; - gFieldCallback = FieldCB_ReturnToOverworld; - SetMainCallback2(c2_exit_to_overworld_2_switch); -} - -void ResetPokemonStorageSystem(void) -{ - u16 boxId; - u16 boxMon; - - gPokemonStorage.currentBox = 0; - for (boxId = 0; boxId < 14; boxId++) - { - for (boxMon = 0; boxMon < 30; boxMon++) - { - ZeroBoxMonData(gPokemonStorage.boxes[boxId] + boxMon); - } - } - for (boxId = 0; boxId < 14; boxId++) - { - u8 *dest = StringCopy(gPokemonStorage.boxNames[boxId], gPCText_BOX); - ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2); - } - for (boxId = 0; boxId < 14; boxId++) - { - gPokemonStorage.wallpaper[boxId] = boxId & 0x03; - } -} - -#if DEBUG -__attribute__((naked)) -void debug_sub_80A3904(void) -{ - asm("\ - push {r4, r5, r6, r7, lr}\n\ - mov r7, sl\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5, r6, r7}\n\ - add sp, sp, #0xffffffe4\n\ - mov r0, #0x0\n\ - mov r8, r0\n\ - mov r7, r8\n\ - mov r1, #0x14\n\ - str r1, [sp, #0x18]\n\ - mov r2, #0xff\n\ - mov r9, r2\n\ -._162:\n\ - mov r5, #0x0\n\ - cmp r7, #0\n\ - beq ._160 @cond_branch\n\ - mov r0, #0xe\n\ - mov r8, r0\n\ - b ._158\n\ -._160:\n\ - bl Random\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - str r0, [sp, #0x14]\n\ - mov r2, r8\n\ - lsl r1, r2, #0x2\n\ - add r1, r1, r8\n\ - lsl r3, r1, #0x4\n\ - sub r3, r3, r1\n\ - lsl r3, r3, #0x5\n\ - lsl r1, r5, #0x2\n\ - add r1, r1, r5\n\ - lsl r1, r1, #0x4\n\ - ldr r2, ._163 @ gPokemonStorage\n\ - add r1, r1, r2\n\ - add r6, r3, r1\n\ - ldr r2, ._163 + 4 @ gUnknown_Debug_083E05F0\n\ - lsl r1, r7, #0x1\n\ - add r1, r1, r2\n\ - ldrh r4, [r1]\n\ - add r5, r5, #0x1\n\ - lsl r2, r5, #0x18\n\ - lsr r2, r2, #0x18\n\ - mov r1, #0x0\n\ - str r1, [sp]\n\ - str r1, [sp, #0x4]\n\ - mov r1, #0x1\n\ - mov sl, r1\n\ - str r1, [sp, #0x8]\n\ - str r0, [sp, #0xc]\n\ - add r0, r6, #0\n\ - add r1, r4, #0\n\ - mov r3, #0x20\n\ - bl CreateBoxMon\n\ - cmp r4, #0\n\ - beq ._157 @cond_branch\n\ - cmp r4, #0xac\n\ - bne ._156 @cond_branch\n\ - add r0, sp, #0x10\n\ - mov r2, sl\n\ - strb r2, [r0]\n\ - add r0, r6, #0\n\ - mov r1, #0x2d\n\ - add r2, sp, #0x10\n\ - bl SetBoxMonData\n\ -._156:\n\ - bl Random\n\ - mov r1, r9\n\ - and r1, r1, r0\n\ - str r1, [sp, #0x14]\n\ - add r4, sp, #0x14\n\ - add r0, r6, #0\n\ - mov r1, #0x16\n\ - add r2, r4, #0\n\ - bl SetBoxMonData\n\ - bl Random\n\ - mov r1, r9\n\ - and r1, r1, r0\n\ - str r1, [sp, #0x14]\n\ - add r0, r6, #0\n\ - mov r1, #0x17\n\ - add r2, r4, #0\n\ - bl SetBoxMonData\n\ - bl Random\n\ - mov r1, r9\n\ - and r1, r1, r0\n\ - str r1, [sp, #0x14]\n\ - add r0, r6, #0\n\ - mov r1, #0x18\n\ - add r2, r4, #0\n\ - bl SetBoxMonData\n\ - bl Random\n\ - mov r1, r9\n\ - and r1, r1, r0\n\ - str r1, [sp, #0x14]\n\ - add r0, r6, #0\n\ - mov r1, #0x21\n\ - add r2, r4, #0\n\ - bl SetBoxMonData\n\ - bl Random\n\ - mov r1, r9\n\ - and r1, r1, r0\n\ - str r1, [sp, #0x14]\n\ - add r0, r6, #0\n\ - mov r1, #0x2f\n\ - add r2, r4, #0\n\ - bl SetBoxMonData\n\ - bl Random\n\ - mov r1, r9\n\ - and r1, r1, r0\n\ - str r1, [sp, #0x14]\n\ - add r0, r6, #0\n\ - mov r1, #0x30\n\ - add r2, r4, #0\n\ - bl SetBoxMonData\n\ - ldr r0, [sp, #0x18]\n\ - cmp r0, #0\n\ - beq ._157 @cond_branch\n\ - sub r0, r0, #0x1\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - str r0, [sp, #0x18]\n\ - mov r1, sl\n\ - str r1, [sp, #0x14]\n\ - add r0, r6, #0\n\ - mov r1, #0x32\n\ - add r2, r4, #0\n\ - bl SetBoxMonData\n\ -._157:\n\ - add r0, r7, #1\n\ - lsl r0, r0, #0x10\n\ - lsr r7, r0, #0x10\n\ - lsl r0, r5, #0x10\n\ - lsr r5, r0, #0x10\n\ - cmp r5, #0x1d\n\ - bhi ._158 @cond_branch\n\ - cmp r7, #0\n\ - bne ._159 @cond_branch\n\ - b ._160\n\ -._159:\n\ - mov r2, #0xe\n\ - mov r8, r2\n\ -._158:\n\ - mov r0, r8\n\ - add r0, r0, #0x1\n\ - lsl r0, r0, #0x10\n\ - lsr r0, r0, #0x10\n\ - mov r8, r0\n\ - cmp r0, #0xd\n\ - bhi ._161 @cond_branch\n\ - b ._162\n\ -._161:\n\ - add sp, sp, #0x1c\n\ - pop {r3, r4, r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov sl, r5\n\ - pop {r4, r5, r6, r7}\n\ - pop {r0}\n\ - bx r0\n\ -._164:\n\ - .align 2, 0\n\ -._163:\n\ - .word gPokemonStorage+0x4\n\ - .word gUnknown_Debug_083E05F0"); -} -#endif - -void sub_8096264(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3) -{ - struct SpritePalette palette = { - gBoxSelectionPopupPalette, palTag - }; - struct SpriteSheet sheets[] = { - {gBoxSelectionPopupCenterTiles, 0x800, tileTag}, - {gBoxSelectionPopupSidesTiles, 0x180, tileTag + 1}, - {} - }; - LoadSpritePalette(&palette); - LoadSpriteSheets(sheets); - gUnknown_02038478 = a0; - a0->unk_0240 = tileTag; - a0->unk_0242 = palTag; - a0->unk_023e = a3; -} - -void sub_8096310(void) -{ - FreeSpritePaletteByTag(gUnknown_02038478->unk_0242); - FreeSpriteTilesByTag(gUnknown_02038478->unk_0240); - FreeSpriteTilesByTag(gUnknown_02038478->unk_0240 + 1); -} - -void sub_809634C(u8 curBox) -{ - sub_80963D0(curBox); -} - -void sub_809635C(void) -{ - sub_809658C(); -} - -u8 sub_8096368(void) -{ - if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - return 201; - } - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - return gUnknown_02038478->curBox; - } - if (gMain.newKeys & DPAD_LEFT) - { - PlaySE(SE_SELECT); - sub_809662C(); - } - else if (gMain.newKeys & DPAD_RIGHT) - { - PlaySE(SE_SELECT); - sub_80965F8(); - } - return 200; -} - -void sub_80963D0(u8 curBox) -{ - u16 i; - u8 spriteId; - struct SpriteTemplate template; - struct OamData oamData = {}; - oamData.size = 3; - oamData.paletteNum = 1; - template = (struct SpriteTemplate){ - 0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy - }; - - gUnknown_02038478->curBox = curBox; - template.tileTag = gUnknown_02038478->unk_0240; - template.paletteTag = gUnknown_02038478->unk_0242; - - spriteId = CreateSprite(&template, 0xA0, 0x60, 0); - gUnknown_02038478->unk_0000 = gSprites + spriteId; - - oamData.shape = ST_OAM_V_RECTANGLE; - oamData.size = 1; - template.tileTag = gUnknown_02038478->unk_0240 + 1; - template.anims = gSpriteAnimTable_83B604C; - for (i = 0; i < 4; i++) - { - u16 r5; - spriteId = CreateSprite(&template, 0x7c, 0x50, gUnknown_02038478->unk_023e); - gUnknown_02038478->unk_0004[i] = gSprites + spriteId; - r5 = 0; - if (i & 2) - { - gUnknown_02038478->unk_0004[i]->pos1.x = 0xc4; - r5 = 2; - } - if (i & 1) - { - gUnknown_02038478->unk_0004[i]->pos1.y = 0x70; - gUnknown_02038478->unk_0004[i]->oam.size = 0; - r5++; - } - StartSpriteAnim(gUnknown_02038478->unk_0004[i], r5); - } - for (i = 0; i < 2; i++) - { - gUnknown_02038478->unk_0020[i] = sub_809A9A0(72 * i + 0x7c, 0x58, i, 0, gUnknown_02038478->unk_023e); - if (gUnknown_02038478->unk_0020[i]) - { - gUnknown_02038478->unk_0020[i]->data[0] = (i == 0 ? -1 : 1); - gUnknown_02038478->unk_0020[i]->callback = sub_8096784; - } - } - sub_809665C(); -} - -void sub_809658C(void) -{ - u16 i; - if (gUnknown_02038478->unk_0000) - { - DestroySprite(gUnknown_02038478->unk_0000); - gUnknown_02038478->unk_0000 = NULL; - } - for (i = 0; i < 4; i++) - { - if (gUnknown_02038478->unk_0004[i]) - { - DestroySprite(gUnknown_02038478->unk_0004[i]); - gUnknown_02038478->unk_0004[i] = NULL; - } - } - for (i = 0; i < 2; i++) - { - if (gUnknown_02038478->unk_0020[i]) - DestroySprite(gUnknown_02038478->unk_0020[i]); - } -} - -void sub_80965F8(void) -{ - if (++gUnknown_02038478->curBox > 13) - gUnknown_02038478->curBox = 0; - sub_809665C(); -} - -void sub_809662C(void) -{ - gUnknown_02038478->curBox = (gUnknown_02038478->curBox == 0 ? 13 : gUnknown_02038478->curBox - 1); - sub_809665C(); -} - -void sub_809665C(void) -{ - u8 nPokemonInBox = CountPokemonInBoxN(gUnknown_02038478->curBox); - u8 *stringVar = gStringVar1; - - stringVar[0] = EXT_CTRL_CODE_BEGIN; - stringVar[1] = 0x04; // EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW - stringVar[2] = 0x0F; // TEXT_COLOR_WHITE2 - stringVar[3] = 0x01; // TEXT_COLOR_DARK_GREY - stringVar[4] = 0x0E; // TEXT_COLOR_LIGHT_BLUE - stringVar += 5; - - stringVar = StringCopy(stringVar, gPokemonStorage.boxNames[gUnknown_02038478->curBox]); - - stringVar[0] = CHAR_NEWLINE; - stringVar[1] = EXT_CTRL_CODE_BEGIN; - stringVar[2] = 0x11; // EXT_CTRL_CODE_CLEAR - if (nPokemonInBox < 10) - stringVar[3] = 0x28; - else - stringVar[3] = 0x22; - stringVar += 4; - - stringVar = ConvertIntToDecimalString(stringVar, nPokemonInBox); - - stringVar[0] = CHAR_SLASH; - stringVar[1] = CHAR_0 + 3; - stringVar[2] = CHAR_0 + 0; - stringVar[3] = EOS; - sub_80966F4(gStringVar1, 0, 1); -} - -void sub_80966F4(const u8 *sourceString, u16 x, u16 y) -{ - u16 *vdest = (u16 *)(BG_CHAR_ADDR(4) + (GetSpriteTileStartByTag(gUnknown_02038478->unk_0240) * 32) + y * 256 + x * 32); - u8 *tileBuff = gUnknown_083B6DB8; - DmaFill16(3, 0x1111, tileBuff, 0x400); - Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, tileBuff, sourceString); - DmaCopy16(3, tileBuff, vdest, 0x400); -} - -void sub_8096784(struct Sprite *sprite) -{ - if (++sprite->data[1] > 3) - { - sprite->data[1] = 0; - sprite->pos2.x += sprite->data[0]; - if (++sprite->data[2] > 5) - { - sprite->data[2] = 0; - sprite->pos2.x = 0; - } - } -} diff --git a/src/pokemon/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c deleted file mode 100644 index 0331abf3e..000000000 --- a/src/pokemon/pokemon_storage_system_2.c +++ /dev/null @@ -1,2121 +0,0 @@ - -// Includes -#include "global.h" -#include "decompress.h" -#include "constants/songs.h" -#include "constants/species.h" -#include "data2.h" -#include "sound.h" -#include "ewram.h" -#include "task.h" -#include "main.h" -#include "palette.h" -#include "menu.h" -#include "graphics.h" -#include "strings.h" -#include "string_util.h" -#include "pokemon_summary_screen.h" -#include "mail_data.h" -#include "naming_screen.h" -#include "pokemon_storage_system.h" - -// Static type declarations - -// Static RAM declarations - -EWRAM_DATA u8 gUnknown_0203847C = 0; -EWRAM_DATA u8 gUnknown_0203847D = 0; -EWRAM_DATA u8 gUnknown_0203847E = 0; -EWRAM_DATA u8 gUnknown_0203847F = 0; - -// Static ROM declarations - -void sub_8096884(void); -void sub_8096AFC(void); -void sub_8096B38(void); -void SetPSSCallback(void (*func)(void)); -void sub_8096BF0(void); -void sub_8096C68(void); -void sub_8096C84(void); -void sub_8096FC8(void); -void sub_8097004(void); -void sub_8097078(void); -void sub_80972A8(void); -void sub_80972FC(void); -void c3_0808DC50(void); -void sub_8097390(void); -void sub_809746C(void); -void sub_8097594(void); -void sub_8097788(void); -void sub_80977E4(void); -void sub_8097858(void); -void sub_809789C(void); -void sub_8097974(void); -void sub_8097A64(void); -void sub_8097B44(void); -void sub_8097BA0(void); -void sub_8097CC0(void); -void sub_8097DE0(void); -void sub_8097E44(void); -void sub_8097E70(void); -void sub_8097F58(void); -void sub_8097FB8(void); -void sub_809801C(void); -void BoxSetMosaic(void); -void sub_8098090(struct Sprite *sprite); -void sub_80980D4(void); -void sub_80981F0(u16 species, u32 pid); -void sub_80982B4(void); -void sub_8098350(void); -void sub_8098400(void); -void add_to_c3_somehow(void); -void sub_8098780(void); -void sub_8098690(bool8 flag); -bool8 sub_80985CC(void); -void sub_80986E8(void); -void sub_8098710(void); -void sub_8098734(void); -void sub_80987DC(void); -void sub_809880C(void); -bool8 sub_8098830(void); -void PrintStorageActionText(u8 index); -void sub_8098A38(s8); -void sub_8098A5C(void); -void sub_8098A80(void); -void sub_8098AA8(u8 a0); - -// .rodata - -const u16 gPokemonStorageScrollingBGPalette[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal"); - -const u16 gPokemonStorageScrollingBGTile[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.4bpp"); - -const u8 gPokemonStorageScrollingBGTilemap[] = INCBIN_U8("graphics/pokemon_storage/scrolling_bg_map.bin.lz"); - -const u16 sUnknownTilemap[] = { - 0x1281, - 0x1282, - 0x1283, - 0x1284, - 0x1285, - 0x1286, - 0x1287, - 0x1288, - 0x128C, - 0x128D, - 0x128E, - 0x128F, - 0x1290, - 0x1291, - 0x1292, - 0x1293, - 0x0281, - 0x0282, - 0x0283, - 0x0284, - 0x0285, - 0x0286, - 0x0287, - 0x0288, - 0x028C, - 0x028D, - 0x028E, - 0x028F, - 0x0290, - 0x0291, - 0x0292, - 0x0293, - 0x12AD, - 0x12AE, - 0x12A8, - 0x12A8 -}; - -const u16 WaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal"); - -const u8 WaveformTiles[] = INCBIN_U8("graphics/pokemon_storage/waveform.4bpp"); - -const u16 gUnknown_083B6D74[] = INCBIN_U16("graphics/pokemon_storage/83B6D74.gbapal"); - -const u16 gUnknown_083B6D94[] = INCBIN_U16("graphics/pokemon_storage/83B6D94.gbapal"); - -struct PokemonStorageSystemData *const gPokemonStorageSystemPtr = &ePokemonStorageSystem; - -u8 *const gUnknown_083B6DB8 = gTileBuffer; - -const struct SpritePalette gWaveformSpritePalette = { - WaveformPalette, 0xdacd -}; - -// .text - -void task_intro_29(u8 whichMenu) -{ - gUnknown_0203847D = whichMenu; - gPokemonStorageSystemPtr->unk_0005 = whichMenu; - SetMainCallback2(sub_8096884); -} - -void sub_80967DC(void) -{ - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2VOFS = 0; - REG_BG2HOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; -} - -void sub_8096804(void) -{ - ResetPaletteFade(); - ResetSpriteData(); - FreeSpriteTileRanges(); - FreeAllSpritePalettes(); - ResetTasks(); - gReservedSpriteTileCount = 0x280; - sub_809CFDC(&gPokemonStorageSystemPtr->unk_0020, gPokemonStorageSystemPtr->unk_0028, 8); - gKeyRepeatStartDelay = 20; -} - -void sub_8096848(void) -{ - sub_809B0D4(); - gUnknown_0203847C = (gPokemonStorageSystemPtr->unk_0005 == 1 ? 1 : 0); - gUnknown_0203847E = 0; -} - -void sub_8096874(void) -{ - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; -} - -extern u8 unk_2038790; - -void sub_8096884(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - sub_8096804(); -#if DEBUG - unk_2038790 = 0; -#endif - gMain.state++; - break; - case 1: - Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); - gMain.state++; - break; - case 2: - InitMenuWindow(&gWindowTemplate_81E6D00); - Menu_EraseScreen(); - gMain.state++; - break; - case 3: - sub_80967DC(); - sub_8096848(); - gMain.state++; - break; - case 4: - ResetPSSMonIconSprites(); - sub_809AA24(); - gMain.state++; - break; - case 5: - sub_8097DE0(); - gMain.state++; - break; - case 6: - sub_8097E70(); - gMain.state++; - break; - case 7: - sub_8098400(); - gMain.state++; - break; - case 8: - sub_8099BF8(gPokemonStorage.currentBox); - gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; - gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; - sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); - sub_80F7404(); - gMain.state++; - break; - case 9: - sub_8096874(); - SetPSSCallback(sub_8096BF0); - SetMainCallback2(sub_8096B38); - SetVBlankCallback(sub_8096AFC); - gMain.state++; - break; - } -} - -void sub_80969A0(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - gPokemonStorageSystemPtr->unk_0005 = gUnknown_0203847D; - sub_8096804(); - if (gUnknown_0203847F == 1) - sub_809BBC0(); - if (gUnknown_0203847F == 0) - sub_809BD14(); - gMain.state++; - break; - case 1: - Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); - gMain.state++; - break; - case 2: - InitMenuWindow(&gWindowTemplate_81E6D00); - Menu_EraseScreen(); - gMain.state++; - break; - case 3: - sub_80967DC(); - gMain.state++; - break; - case 4: - ResetPSSMonIconSprites(); - sub_809AA98(); - gMain.state++; - break; - case 5: - sub_8097DE0(); - gMain.state++; - break; - case 6: - sub_8097E70(); - gMain.state++; - break; - case 7: - sub_8098400(); - gMain.state++; - break; - case 8: - sub_8099BF8(gPokemonStorage.currentBox); - gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; - gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; - sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); - sub_80F7404(); - gMain.state++; - break; - case 9: - BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); - SetVBlankCallback(sub_8096AFC); - gMain.state++; - break; - case 10: - sub_8096874(); - SetPSSCallback(sub_8096C68); - SetMainCallback2(sub_8096B38); - gMain.state++; - break; - } -} - -#if DEBUG - -void debug_sub_80A4300(void) -{ - gUnknown_0203847D = 0; - gPokemonStorageSystemPtr->unk_0005 = 0; - sub_8096884(); - if (gMain.callback2 == sub_8096B38) - unk_2038790 = 1; -} - -extern void (*unk_2038794)(void); -extern u32 unk_2038798; - -extern void unref_sub_809CB94(); - -void debug_sub_80A433C(u32 a, void (*b)(void)) -{ - unk_2038794 = b; - unk_2038798 = a; - SetMainCallback2(debug_sub_80A4300); -} - -void debug_sub_80A435C(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - unref_sub_809CB94(unk_2038798); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!UpdatePaletteFade()) - unk_2038794(); - break; - } -} - -#endif - -void sub_8096AFC(void) -{ - REG_BG2HOFS = gPokemonStorageSystemPtr->unk_08b4; - REG_BG3HOFS = gPokemonStorageSystemPtr->unk_000a; - REG_BG3VOFS = gPokemonStorageSystemPtr->unk_0008; - LoadOam(); - ProcessSpriteCopyRequests(); - sub_809CFF0(); - TransferPlttBuffer(); -} - -void sub_8096B38(void) -{ - gPokemonStorageSystemPtr->unk_0000(); - sub_8097E44(); - sub_8098734(); - AnimateSprites(); - BuildOamBuffer(); -} - -void sub_8096B5C(void) -{ - switch (gPokemonStorageSystemPtr->unk_0006) - { - case 0: - ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690.pokemon, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e); - break; - case 1: - DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); - break; - } -} - -void SetPSSCallback(void (*func)(void)) -{ - gPokemonStorageSystemPtr->unk_0000 = func; - gPokemonStorageSystemPtr->unk_0004 = 0; -} - -void sub_8096BF0(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - BlendPalettes(0xffffffff, 16, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - PlaySE(SE_PC_LOGON); - gPokemonStorageSystemPtr->unk_000c.tileTag = 14; - gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; - gPokemonStorageSystemPtr->unk_000c.unk04 = 0; - gPokemonStorageSystemPtr->unk_000c.unk06 = 0; - sub_80C5CD4(&gPokemonStorageSystemPtr->unk_000c); - BlendPalettes(0xffffffff, 0, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 2: - if (sub_80C5DCC()) - SetPSSCallback(sub_8096C84); - break; - } -} - -void sub_8096C68(void) -{ - if (!UpdatePaletteFade()) - SetPSSCallback(sub_8096C84); -} - -void sub_8096C84(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - switch (sub_809CA40()) - { - case 1: - PlaySE(SE_SELECT); - gPokemonStorageSystemPtr->unk_0004 = 1; - break; - case 5: - if (gPokemonStorageSystemPtr->unk_0005 != 2) - { - PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); - gPokemonStorageSystemPtr->unk_0004 = 3; - } - else - { - sub_809B0D4(); - SetPSSCallback(sub_8096FC8); - } - break; - case 6: - if (gPokemonStorageSystemPtr->unk_0005 == 2) - { - if (sub_809BF20() && ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) - gPokemonStorageSystemPtr->unk_0004 = 5; - else - SetPSSCallback(sub_8097004); - } - break; - case 4: -#if DEBUG - if (unk_2038790 != 0) - break; -#endif - SetPSSCallback(sub_8097BA0); - break; - case 16: -#if DEBUG - if (unk_2038790 != 0) - break; -#endif - SetPSSCallback(sub_8097CC0); - break; - case 7: - PlaySE(SE_SELECT); - SetPSSCallback(sub_809789C); - break; - case 8: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097078); - break; - case 9: - PlaySE(SE_SELECT); - gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox + 1; - if (gPokemonStorageSystemPtr->unk_08b2 > 13) - gPokemonStorageSystemPtr->unk_08b2 = 0; - sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); - gPokemonStorageSystemPtr->unk_0004 = 2; - break; - case 10: - PlaySE(SE_SELECT); - gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox - 1; - if (gPokemonStorageSystemPtr->unk_08b2 < 0) - gPokemonStorageSystemPtr->unk_08b2 = 13; - sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); - gPokemonStorageSystemPtr->unk_0004 = 2; - break; - case 11: - if (!sub_809BE80()) - { - if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) - { - gPokemonStorageSystemPtr->unk_0004 = 5; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_809746C); - } - } - else - { - gPokemonStorageSystemPtr->unk_0004 = 4; - } - break; - case 13: - if (sub_809BE80()) - { - gPokemonStorageSystemPtr->unk_0004 = 4; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_80972A8); - } - break; - case 14: - if (!sub_809BEBC()) - { - gPokemonStorageSystemPtr->unk_0004 = 4; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(c3_0808DC50); - } - break; - case 12: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097390); - break; - case 15: - PlaySE(SE_SELECT); - SetPSSCallback(sub_80972FC); - break; - } - break; - case 1: - if (!sub_809AC00()) - { - if (sub_809BF48()) - sub_80986E8(); - else - sub_8098710(); - if (gPokemonStorageSystemPtr->unk_11f6) - BoxSetMosaic(); - gPokemonStorageSystemPtr->unk_0004 = 0; - } - break; - case 2: - if (!sub_8099D34()) - { - gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; - if (!gUnknown_0203847C && !sub_809BF20()) - { - sub_809B440(); - BoxSetMosaic(); - } - gPokemonStorageSystemPtr->unk_0004 = 0; - } - break; - case 3: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0004 = 0; - } - break; - case 4: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_LAST_POKE); - gPokemonStorageSystemPtr->unk_0004 = 6; - break; - case 5: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); - gPokemonStorageSystemPtr->unk_0004 = 6; - break; - case 6: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8096FC8(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - sub_809880C(); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_8098830()) - SetPSSCallback(sub_8096C84); - break; - } -} - -void sub_8097004(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - PlaySE(SE_SELECT); - add_to_c3_somehow(); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_80985CC()) - { - sub_809B0C0(sub_809B0F4()); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 2: - if (!sub_809AC00()) - { - if (gPokemonStorageSystemPtr->unk_11f6) - BoxSetMosaic(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097078(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_IS_SELECTED); - sub_809CE84(); - gPokemonStorageSystemPtr->unk_0004 = 1; - break; - case 1: - switch (sub_809CF30()) - { - case -1: - case 0: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 3: - if (sub_809BE80()) - { - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_80972A8); - } - break; - case 5: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_80972FC); - break; - case 4: - if (!sub_809BEBC()) - { - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(c3_0808DC50); - } - break; - case 2: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097390); - break; - case 1: - if (sub_809BE80()) - { - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) - { - gPokemonStorageSystemPtr->unk_0004 = 3; - } - else - { - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_809746C); - } - break; - case 7: - if (sub_809BE80()) - { - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else if (gPokemonStorageSystemPtr->unk_11f9) - { - gPokemonStorageSystemPtr->unk_0004 = 4; - } - else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) - { - gPokemonStorageSystemPtr->unk_0004 = 3; - } - else - { - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097594); - } - break; - case 6: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097788); - break; - case 8: - PlaySE(SE_SELECT); - SetPSSCallback(sub_80977E4); - break; -#if DEBUG - case 32: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(debug_sub_80A435C); - break; -#endif - } - break; - case 2: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_LAST_POKE); - gPokemonStorageSystemPtr->unk_0004 = 5; - break; - case 4: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); - gPokemonStorageSystemPtr->unk_0004 = 5; - break; - case 3: - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); - gPokemonStorageSystemPtr->unk_0004 = 5; - break; - case 5: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_80972A8(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - sub_809B100(0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - if (gUnknown_0203847C) - SetPSSCallback(sub_8097858); - else - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_80972FC(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - sub_809B100(1); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - if (gUnknown_0203847C) - SetPSSCallback(sub_8097858); - else - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void c3_0808DC50(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - sub_809B100(2); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_809B130()) - { - BoxSetMosaic(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097390(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - if (CalculatePlayerPartyCount() == 6) - { - PrintStorageActionText(PC_TEXT_PARTY_FULL); - gPokemonStorageSystemPtr->unk_0004 = 1; - } - else - { - sub_809B0E0(); - sub_809B100(0); - gPokemonStorageSystemPtr->unk_0004 = 2; - } - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - if (!sub_809B130()) - { - sub_809880C(); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 3: - if (!sub_8098830()) - { - sub_809B100(1); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 4: - if (!sub_809B130()) - { - sub_80987DC(); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 5: - SetPSSCallback(sub_8097004); - break; - } -} - -void sub_809746C(void) -{ - u8 r4; - - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); - sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); - sub_809634C(gUnknown_0203847E); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - r4 = sub_8096368(); - if (r4 == 200); - else if (r4 == 201) - { - sub_8098A5C(); - sub_809635C(); - sub_8096310(); - SetPSSCallback(sub_8096C84); - } - else - { - if (sub_809B62C(r4)) - { - sub_8098A5C(); - sub_809635C(); - sub_8096310(); - gPokemonStorageSystemPtr->unk_0004 = 2; - } - else - { - PrintStorageActionText(PC_TEXT_BOX_IS_FULL); - gPokemonStorageSystemPtr->unk_0004 = 4; - } - gUnknown_0203847E = r4; - } - break; - case 2: - party_compaction(); - sub_8099310(); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 3: - if (sub_8099374() == 0) - { - sub_809B6BC(); - BoxSetMosaic(); - sub_80987DC(); - SetPSSCallback(sub_8096C84); - } - break; - case 4: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); - gPokemonStorageSystemPtr->unk_0004 = 1; - } - break; - } -} - -void sub_8097594(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_RELEASE_POKE); - sub_8098A38(1); - gPokemonStorageSystemPtr->unk_0004++; - // fallthrough - case 1: - switch (Menu_ProcessInputNoWrap()) - { - case -1: - case 1: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 0: - sub_8098A5C(); - sub_809B7D4(); - sub_809B6DC(); - gPokemonStorageSystemPtr->unk_0004++; - break; - } - break; - case 2: - sub_809B960(); - if (!sub_809B734()) - { - while (1) - { - s8 r0 = sub_809B960(); - if (r0 == 1) - { - gPokemonStorageSystemPtr->unk_0004++; - break; - } - if (r0 == 0) - { - gPokemonStorageSystemPtr->unk_0004 = 8; - break; - } - } - } - break; - case 3: - sub_809B760(); - sub_809801C(); - PrintStorageActionText(PC_TEXT_WAS_RELEASED); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 4: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_BYE_BYE); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 5: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8098A5C(); - if (gUnknown_0203847C) - { - party_compaction(); - sub_8099310(); - gPokemonStorageSystemPtr->unk_0004++; - } - else - { - gPokemonStorageSystemPtr->unk_0004 = 7; - } - } - break; - case 6: - if (sub_8099374() == 0) - { - sub_809B440(); - BoxSetMosaic(); - sub_80987DC(); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 7: - SetPSSCallback(sub_8096C84); - break; - case 8: - PrintStorageActionText(PC_TEXT_WAS_RELEASED); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 9: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_SURPRISE); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 10: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8098A5C(); - sub_8099958(); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 11: - if (!sub_8099990()) - { - sub_809B7AC(); - PrintStorageActionText(PC_TEXT_CAME_BACK); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 12: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - PrintStorageActionText(PC_TEXT_WORRIED); - gPokemonStorageSystemPtr->unk_0004++; - } - break; - case 13: - if (gMain.newKeys & (A_BUTTON | B_BUTTON)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097788(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - sub_809BC18(); - BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!UpdatePaletteFade()) - { - gUnknown_0203847F = 0; - gPokemonStorageSystemPtr->unk_0006 = 0; - SetMainCallback2(sub_8096B5C); - } - break; - } -} - -void sub_80977E4(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_MARK_POKE); - gPokemonStorageSystemPtr->unk_12bc.markings = gPokemonStorageSystemPtr->unk_11f7; - sub_80F7418(gPokemonStorageSystemPtr->unk_11f7, 0xb0, 0x10); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!sub_80F7500()) - { - sub_80F7470(); - sub_8098A5C(); - sub_809BDD8(gPokemonStorageSystemPtr->unk_12bc.markings); - sub_809801C(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097858(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - party_compaction(); - sub_8099310(); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (sub_8099374() == 0) - { - sub_80987DC(); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_809789C(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); - sub_809CE84(); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - switch (sub_809CF30()) - { - case -1: - case 0: - sub_809A860(TRUE); - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 11: - PlaySE(SE_SELECT); - SetPSSCallback(sub_8097B44); - break; - case 10: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097974); - break; - case 9: - PlaySE(SE_SELECT); - sub_8098A5C(); - SetPSSCallback(sub_8097A64); - break; - } - break; - } -} - -void sub_8097974(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - sub_8098A80(); - PrintStorageActionText(PC_TEXT_PICK_A_THEME); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - gPokemonStorageSystemPtr->unk_0d5e = sub_809CF30(); - switch (gPokemonStorageSystemPtr->unk_0d5e) - { - case -1: - sub_809A860(TRUE); - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 12 ... 15: - PlaySE(SE_SELECT); - gPokemonStorageSystemPtr->unk_0d5e -= 12; - sub_8098AA8(gPokemonStorageSystemPtr->unk_0d5e); - PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); - gPokemonStorageSystemPtr->unk_0004++; - break; - } - break; - case 2: - gPokemonStorageSystemPtr->unk_0d60 = sub_809CF30(); - switch (gPokemonStorageSystemPtr->unk_0d60) - { - case -1: - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0004 = 0; - break; - case -2: - break; - default: - PlaySE(SE_SELECT); - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0d60 -= 16; - sub_8099DCC(gPokemonStorageSystemPtr->unk_0d60); - gPokemonStorageSystemPtr->unk_0004++; - break; - } - break; - case 3: - if (!sub_8099E08()) - { - sub_809A860(TRUE); - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097A64(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); - sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); - sub_809634C(gPokemonStorage.currentBox); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - gPokemonStorageSystemPtr->unk_08b2 = sub_8096368(); - switch (gPokemonStorageSystemPtr->unk_08b2) - { - case 200: - break; - default: - sub_8098A5C(); - sub_809635C(); - sub_8096310(); - if (gPokemonStorageSystemPtr->unk_08b2 == 201 || gPokemonStorageSystemPtr->unk_08b2 == gPokemonStorage.currentBox) - { - sub_809A860(TRUE); - SetPSSCallback(sub_8096C84); - } - else - { - gPokemonStorageSystemPtr->unk_0004++; - } - break; - } - break; - case 2: - sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 3: - if (!sub_8099D34()) - { - gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; - SetPSSCallback(sub_8096C84); - } - break; - } -} - -void sub_8097B44(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - sub_809BB90(); - BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 1: - if (!UpdatePaletteFade()) - { - gUnknown_0203847F = 1; - gPokemonStorageSystemPtr->unk_0006 = 1; - SetMainCallback2(sub_8096B5C); - } - break; - } -} - -void sub_8097BA0(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - if (sub_809BF20()) - { - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_HOLDING_POKE); - gPokemonStorageSystemPtr->unk_0004 = 1; - } - else - { - PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_EXIT_BOX); - sub_8098A38(0); - gPokemonStorageSystemPtr->unk_0004 = 2; - } - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - switch (Menu_ProcessInputNoWrap()) - { - case 1: - case -1: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case 0: - PlaySE(SE_PC_OFF); - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0004++; - break; - } - break; - case 3: - gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; - gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; - gPokemonStorageSystemPtr->unk_000c.unk04 = 20; - gPokemonStorageSystemPtr->unk_000c.unk06 = 0; - sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 4: - if (sub_80C5F98()) - { - gPlayerPartyCount = CalculatePlayerPartyCount(); - SetMainCallback2(sub_80961A8); - } - break; - } -} - -void sub_8097CC0(void) -{ - switch (gPokemonStorageSystemPtr->unk_0004) - { - case 0: - if (sub_809BF20()) - { - PlaySE(SE_HAZURE); - PrintStorageActionText(PC_TEXT_HOLDING_POKE); - gPokemonStorageSystemPtr->unk_0004 = 1; - } - else - { - PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_CONTINUE_BOX); - sub_8098A38(0); - gPokemonStorageSystemPtr->unk_0004 = 2; - } - break; - case 1: - if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) - { - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - } - break; - case 2: - switch (Menu_ProcessInputNoWrap()) - { - case 0: - sub_8098A5C(); - SetPSSCallback(sub_8096C84); - break; - case -1: - case 1: - PlaySE(SE_PC_OFF); - sub_8098A5C(); - gPokemonStorageSystemPtr->unk_0004++; - break; - } - break; - case 3: - gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; - gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; - gPokemonStorageSystemPtr->unk_000c.unk04 = 20; - gPokemonStorageSystemPtr->unk_000c.unk06 = 0; - sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); - gPokemonStorageSystemPtr->unk_0004++; - break; - case 4: - if (sub_80C5F98()) - { - gPlayerPartyCount = CalculatePlayerPartyCount(); - SetMainCallback2(sub_80961A8); - } - break; - } -} - -void sub_8097DE0(void) -{ - gPokemonStorageSystemPtr->unk_0007 = 0; - gPokemonStorageSystemPtr->unk_0008 = 0; - gPokemonStorageSystemPtr->unk_000a = 0; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(30); - DmaCopy16Defvars(3, gPokemonStorageScrollingBGTile, BG_SCREEN_ADDR(28), sizeof gPokemonStorageScrollingBGTile); - LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, BG_SCREEN_ADDR(30)); - LoadPalette(gPokemonStorageScrollingBGPalette, 0xd0, 0x10); -} - -void sub_8097E44(void) -{ - if (++gPokemonStorageSystemPtr->unk_0007 >= 2) - { - gPokemonStorageSystemPtr->unk_0007 = 0; - gPokemonStorageSystemPtr->unk_0008--; - gPokemonStorageSystemPtr->unk_000a++; - } -} - -void sub_8097E70(void) -{ - LZ77UnCompVram(gPSSMenuHeader_Gfx, BG_SCREEN_ADDR(10)); - LZ77UnCompWram(gPSSMenuHeader_Tilemap, gUnknown_02039760); - sub_809D034(BG_SCREEN_ADDR(15), 0, 0, gUnknown_02039760, 0, 0, 10, 20); - LoadPalette(gPSSMenu1_Pal, 0x10, 0x20); - LoadPalette(gPSSMenu2_Pal, 0x00, 0x20); - LoadPalette(gUnknown_083B6D74, 0xB0, 0x20); - LoadPalette(gUnknown_083B6D94, 0xC0, 0x20); - LoadPalette(gUnknownPalette_81E6692 + 1, 0xF1, 0x02); - LoadPalette(gUnknownPalette_81E6692 + 1, 0xF2, 0x02); - LoadPalette(gUnknownPalette_81E6692 + 5, 0xF3, 0x02); - LoadPalette(gUnknownPalette_81E6692 + 12, 0xF4, 0x04); - LoadPalette(gUnknownPalette_81E6692 + 10, 0xF6, 0x04); - LoadPalette(gUnknownPalette_81E6692 + 2, 0xFF, 0x02); - LoadSpritePalette(&gWaveformSpritePalette); - sub_80980D4(); - sub_8097F58(); - sub_8097FB8(); - sub_809801C(); -} - -void sub_8097F58(void) -{ - gPokemonStorageSystemPtr->unk_12ac = sub_80F7940(0x000d, 0xdace, 0); - gPokemonStorageSystemPtr->unk_12ac->oam.priority = 0; - gPokemonStorageSystemPtr->unk_12ac->subpriority = 1; - gPokemonStorageSystemPtr->unk_12ac->pos1.x = 0x28; - gPokemonStorageSystemPtr->unk_12ac->pos1.y = 0x95; - gPokemonStorageSystemPtr->unk_12b8 = BG_CHAR_ADDR(4) + 32 * GetSpriteTileStartByTag(0x000d); -} - -const struct SpriteTemplate gSpriteTemplate_83B6EFC; - -void sub_8097FB8(void) -{ - u16 i; - struct SpriteSheet sheet = {WaveformTiles, 0x1c0, 0x0005}; - - LoadSpriteSheet(&sheet); - for (i = 0; i < 2; i++) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_83B6EFC, i * 63 + 8, 9, 2); - gPokemonStorageSystemPtr->unk_12b0[i] = gSprites + spriteId; - } -} - -void sub_809801C(void) -{ - sub_80981F0(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec); - sub_80982B4(); - sub_8098350(); -} - -void BoxSetMosaic(void) -{ - sub_809801C(); - if (gPokemonStorageSystemPtr->unk_2700) - { - gPokemonStorageSystemPtr->unk_2700->oam.mosaic = TRUE; - gPokemonStorageSystemPtr->unk_2700->data[0] = 10; - gPokemonStorageSystemPtr->unk_2700->data[1] = 1; - gPokemonStorageSystemPtr->unk_2700->callback = sub_8098090; - REG_MOSAIC = (gPokemonStorageSystemPtr->unk_2700->data[0] << 12) | (gPokemonStorageSystemPtr->unk_2700->data[0] << 8); - } -} - -void sub_8098090(struct Sprite *sprite) -{ - sprite->data[0] -= sprite->data[1]; - if (sprite->data[0] < 0) - sprite->data[0] = 0; - REG_MOSAIC = (sprite->data[0] << 12) | (sprite->data[0] << 8); - if (sprite->data[0] == 0) - { - sprite->oam.mosaic = FALSE; - sprite->callback = SpriteCallbackDummy; - } -} - -// sub_80980D4 - -const struct OamData gOamData_83B6EAC; - -#ifdef NONMATCHING -void sub_80980D4(void) -{ - u16 i; - u16 tileStart; - u8 palSlot; - u8 spriteId; - struct SpriteSheet sheet = {gPokemonStorageSystemPtr->unk_2784, 0x800, 0x0002}; - struct SpritePalette palette = {gPokemonStorageSystemPtr->unk_2704, 0xdac7}; - struct SpriteTemplate template = { - 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy - }; - - for (i = 0; i < 0x800; i++) - gPokemonStorageSystemPtr->unk_2784[i] = 0; - for (i = 0; i < 0x10; i++) - gPokemonStorageSystemPtr->unk_2704[i] = 0; - - gPokemonStorageSystemPtr->unk_2700 = NULL; - if ((tileStart = LoadSpriteSheet(&sheet)) != 0 - && (palSlot = LoadSpritePalette(&palette)) != 0xff - && (spriteId = CreateSprite(&template, 0x28, 0x30, 0)) != MAX_SPRITES) - { - // FIXME this gets compiled as a separate block between the palSlot check and the spriteId check - gPokemonStorageSystemPtr->unk_2700 = gSprites + spriteId; - gPokemonStorageSystemPtr->unk_26fa = palSlot * 16 + 0x100; - gPokemonStorageSystemPtr->unk_26fc = BG_CHAR_ADDR(4) + tileStart * 32; - } - - if (gPokemonStorageSystemPtr->unk_2700 == NULL) - { - FreeSpriteTilesByTag(0x0002); - FreeSpritePaletteByTag(0xdac7); - } -} -#else - -const struct SpriteSheet gUnknown_083B6DCC = {ePokemonStorageSystem.unk_2784, 0x800, 0x0002}; -const struct SpritePalette gUnknown_083B6DD4 = {ePokemonStorageSystem.unk_2704, 0xdac7}; -const struct SpriteTemplate gSpriteTemplate_83B6DDC = { - 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -__attribute__((naked)) void sub_80980D4(void) -{ - asm_unified("\tpush {r4,r5,lr}\n" - "\tsub sp, 0x28\n" - "\tldr r0, _08098150 @ =gUnknown_083B6DCC\n" - "\tldr r1, [r0, 0x4]\n" - "\tldr r0, [r0]\n" - "\tstr r0, [sp, 0x18]\n" - "\tstr r1, [sp, 0x1C]\n" - "\tldr r0, _08098154 @ =gUnknown_083B6DD4\n" - "\tldr r1, [r0, 0x4]\n" - "\tldr r0, [r0]\n" - "\tstr r0, [sp, 0x20]\n" - "\tstr r1, [sp, 0x24]\n" - "\tmov r1, sp\n" - "\tldr r0, _08098158 @ =gSpriteTemplate_83B6DDC\n" - "\tldm r0!, {r2-r4}\n" - "\tstm r1!, {r2-r4}\n" - "\tldm r0!, {r2-r4}\n" - "\tstm r1!, {r2-r4}\n" - "\tmovs r1, 0\n" - "\tadd r5, sp, 0x18\n" - "\tldr r4, _0809815C @ =gSharedMem + 0x2784\n" - "\tmovs r3, 0\n" - "\tldr r2, _08098160 @ =0x000007ff\n" - "_08098102:\n" - "\tadds r0, r1, r4\n" - "\tstrb r3, [r0]\n" - "\tadds r0, r1, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r1, r0, 16\n" - "\tcmp r1, r2\n" - "\tbls _08098102\n" - "\tmovs r1, 0\n" - "\tldr r3, _08098164 @ =gSharedMem + 0x2704\n" - "\tmovs r2, 0\n" - "_08098116:\n" - "\tlsls r0, r1, 1\n" - "\tadds r0, r3\n" - "\tstrh r2, [r0]\n" - "\tadds r0, r1, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r1, r0, 16\n" - "\tcmp r1, 0xF\n" - "\tbls _08098116\n" - "\tldr r0, _08098168 @ =gSharedMem\n" - "\tmovs r1, 0x9C\n" - "\tlsls r1, 6\n" - "\tadds r0, r1\n" - "\tmovs r1, 0\n" - "\tstr r1, [r0]\n" - "\tadds r0, r5, 0\n" - "\tbl LoadSpriteSheet\n" - "\tlsls r0, 16\n" - "\tlsrs r5, r0, 16\n" - "\tcmp r5, 0\n" - "\tbeq _080981C4\n" - "\tadd r0, sp, 0x20\n" - "\tbl LoadSpritePalette\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r4, 0xFF\n" - "\tbeq _080981C4\n" - "\tb _080981B0\n" - "\t.align 2, 0\n" - "_08098150: .4byte gUnknown_083B6DCC\n" - "_08098154: .4byte gUnknown_083B6DD4\n" - "_08098158: .4byte gSpriteTemplate_83B6DDC\n" - "_0809815C: .4byte gSharedMem + 0x2784\n" - "_08098160: .4byte 0x000007ff\n" - "_08098164: .4byte gSharedMem + 0x2704\n" - "_08098168: .4byte gSharedMem\n" - "_0809816C:\n" - "\tldr r2, _0809819C @ =gSharedMem\n" - "\tmovs r0, 0x9C\n" - "\tlsls r0, 6\n" - "\tadds r3, r2, r0\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tldr r1, _080981A0 @ =gSprites\n" - "\tadds r0, r1\n" - "\tstr r0, [r3]\n" - "\tlsls r0, r4, 4\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 1\n" - "\tadds r0, r1\n" - "\tldr r3, _080981A4 @ =0x000026fa\n" - "\tadds r1, r2, r3\n" - "\tstrh r0, [r1]\n" - "\tldr r4, _080981A8 @ =0x000026fc\n" - "\tadds r2, r4\n" - "\tlsls r0, r5, 5\n" - "\tldr r1, _080981AC @ =0x06010000\n" - "\tadds r0, r1\n" - "\tstr r0, [r2]\n" - "\tb _080981C4\n" - "\t.align 2, 0\n" - "_0809819C: .4byte gSharedMem\n" - "_080981A0: .4byte gSprites\n" - "_080981A4: .4byte 0x000026fa\n" - "_080981A8: .4byte 0x000026fc\n" - "_080981AC: .4byte 0x06010000\n" - "_080981B0:\n" - "\tmov r0, sp\n" - "\tmovs r1, 0x28\n" - "\tmovs r2, 0x30\n" - "\tmovs r3, 0\n" - "\tbl CreateSprite\n" - "\tlsls r0, 24\n" - "\tlsrs r1, r0, 24\n" - "\tcmp r1, 0x40\n" - "\tbne _0809816C\n" - "_080981C4:\n" - "\tldr r0, _080981E8 @ =gSharedMem\n" - "\tmovs r2, 0x9C\n" - "\tlsls r2, 6\n" - "\tadds r0, r2\n" - "\tldr r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080981DE\n" - "\tmovs r0, 0x2\n" - "\tbl FreeSpriteTilesByTag\n" - "\tldr r0, _080981EC @ =0x0000dac7\n" - "\tbl FreeSpritePaletteByTag\n" - "_080981DE:\n" - "\tadd sp, 0x28\n" - "\tpop {r4,r5}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080981E8: .4byte gSharedMem\n" - "_080981EC: .4byte 0x0000dac7"); -} -#endif - -void sub_80981F0(u16 species, u32 pid) -{ - if (gPokemonStorageSystemPtr->unk_2700) - { - if (species != SPECIES_NONE) - { - HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, 1, (intptr_t)gPokemonStorageSystemPtr->unk_4784, gPokemonStorageSystemPtr->unk_2784, species, pid); - LZ77UnCompWram(gPokemonStorageSystemPtr->unk_11e8, gPokemonStorageSystemPtr->unk_2704); - CpuCopy32(gPokemonStorageSystemPtr->unk_2784, gPokemonStorageSystemPtr->unk_26fc, 0x800); - LoadPalette(gPokemonStorageSystemPtr->unk_2704, gPokemonStorageSystemPtr->unk_26fa, 0x20); - gPokemonStorageSystemPtr->unk_2700->invisible = FALSE; - } - else - { - gPokemonStorageSystemPtr->unk_2700->invisible = TRUE; - } - } -} - -void sub_80982B4(void) -{ - if (gPokemonStorageSystemPtr->unk_11f0) - { - sub_80F7A10(gPokemonStorageSystemPtr->unk_11f7, gPokemonStorageSystemPtr->unk_12b8); - gPokemonStorageSystemPtr->unk_12ac->invisible = FALSE; - } - else - { - gPokemonStorageSystemPtr->unk_12ac->invisible = TRUE; - } - Menu_EraseWindowRect(0, 11, 9, 17); - Menu_PrintText(gPokemonStorageSystemPtr->unk_127a, 1, 16); - Menu_PrintText(gPokemonStorageSystemPtr->unk_120f, 1, 11); - Menu_PrintText(gPokemonStorageSystemPtr->unk_1234, 0, 13); - Menu_PrintText(gPokemonStorageSystemPtr->unk_1259, 1, 15); -} - -void sub_8098350(void) -{ - u16 i; - - if (gPokemonStorageSystemPtr->unk_11f0) - { - sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 1, 0, 8, 2); - for (i = 0; i < 2; i++) - StartSpriteAnimIfDifferent(gPokemonStorageSystemPtr->unk_12b0[i], i * 2 + 1); - } - else - { - sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 10, 0, 8, 2); - for (i = 0; i < 2; i++) - StartSpriteAnim(gPokemonStorageSystemPtr->unk_12b0[i], i * 2); - } -} - -void sub_8098400(void) -{ - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(15); - LZ77UnCompVram(gPSSMenuMisc_Gfx, BG_SCREEN_ADDR(13)); - LZ77UnCompWram(gPSSMenuMisc_Tilemap, gPokemonStorageSystemPtr->unk_00a8); - LoadPalette(gPSSMenu3_Pal, 0x20, 0x20); - LoadPalette(gPSSMenu4_Pal, 0x30, 0x20); - DmaClear16(3, BG_SCREEN_ADDR(15), 0x800); - sub_8098780(); - if (gUnknown_0203847C) - { - sub_8098690(TRUE); - sub_8099200(TRUE); - sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); - } - else - { - sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 20, 12, 2); - sub_8098690(TRUE); - } - gPokemonStorageSystemPtr->unk_08af = 0; -} - -void sub_80984E8(void) -{ - gPokemonStorageSystemPtr->unk_08a8 = 20; - gPokemonStorageSystemPtr->unk_08aa = 2; - gPokemonStorageSystemPtr->unk_08ad = 0; - sub_8099200(FALSE); -} - -bool8 sub_8098520(void) -{ - if (gPokemonStorageSystemPtr->unk_08ad == 20) - return FALSE; - gPokemonStorageSystemPtr->unk_08a8--; - gPokemonStorageSystemPtr->unk_08aa++; - sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa); - sub_80994A8(8); - if (++gPokemonStorageSystemPtr->unk_08ad == 20) - { - gUnknown_0203847C = 1; - return FALSE; - } - return TRUE; -} - -void add_to_c3_somehow(void) -{ - gPokemonStorageSystemPtr->unk_08a8 = 0; - gPokemonStorageSystemPtr->unk_08aa = 22; - gPokemonStorageSystemPtr->unk_08ad = 0; -} - -bool8 sub_80985CC(void) -{ - if (gPokemonStorageSystemPtr->unk_08ad == 20) - return FALSE; - gPokemonStorageSystemPtr->unk_08a8++; - gPokemonStorageSystemPtr->unk_08aa--; - sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa); - sub_809D16C(BG_SCREEN_ADDR(15), 10, gPokemonStorageSystemPtr->unk_08aa, 12, 1); - sub_80994A8(-8); - if (++gPokemonStorageSystemPtr->unk_08ad == 20) - { - gUnknown_0203847C = 0; - sub_809954C(); - party_compaction(); - sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 1, 2); - return FALSE; - } - return TRUE; -} - -void sub_8098690(bool8 flag) -{ - if (flag) - sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 9, 2); - else - sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 2, 9, 2); -} - -void sub_80986E8(void) -{ - gPokemonStorageSystemPtr->unk_08af = 1; - gPokemonStorageSystemPtr->unk_08b0 = 30; - gPokemonStorageSystemPtr->unk_08b1 = 1; -} - -void sub_8098710(void) -{ - if (gPokemonStorageSystemPtr->unk_08af) - { - gPokemonStorageSystemPtr->unk_08af = 0; - sub_8098690(TRUE); - } -} - -void sub_8098734(void) -{ - if (gPokemonStorageSystemPtr->unk_08af && ++gPokemonStorageSystemPtr->unk_08b0 > 30) - { - gPokemonStorageSystemPtr->unk_08b0 = 0; - gPokemonStorageSystemPtr->unk_08b1 = gPokemonStorageSystemPtr->unk_08b1 ? FALSE : TRUE; - sub_8098690(gPokemonStorageSystemPtr->unk_08b1); - } -} - -void sub_8098780(void) -{ - int i; - - for (i = 1; i < PARTY_SIZE; i++) - { - u16 r1; - bool32 r0 = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); - if (r0) - r0 = TRUE; - r1 = r0 ? 12 : 16; - sub_809D104(gPokemonStorageSystemPtr->unk_00a8, 7, (i - 1) * 3 + 1, gPokemonStorageSystemPtr->unk_00a8, r1, 4, 4, 3); - } -} - -void sub_80987DC(void) -{ - sub_8098780(); - sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); -} - -void sub_809880C(void) -{ - gPokemonStorageSystemPtr->unk_08ae = 0; - PlaySE(SE_WIN_OPEN); - sub_80984E8(); -} - -bool8 sub_8098830(void) -{ - switch (gPokemonStorageSystemPtr->unk_08ae) - { - case 0: - if (!sub_8098520()) - { - sub_809B068(); - gPokemonStorageSystemPtr->unk_08ae++; - } - break; - case 1: - if (!sub_809AC00()) - { - if (gPokemonStorageSystemPtr->unk_11f6) - BoxSetMosaic(); - gPokemonStorageSystemPtr->unk_08ae++; - } - break; - case 2: - return FALSE; - } - return TRUE; -} - -const struct StorageAction gPCStorageActionTexts[] = -{ - {PCText_ExitBox, 0}, - {PCText_WhatYouDo, 0}, - {PCText_PickATheme, 0}, - {PCText_PickAWallpaper, 0}, - {PCText_IsSelected, 1}, - {PCText_JumpToWhichBox, 0}, - {PCText_DepositInWhichBox, 0}, - {PCText_WasDeposited, 1}, - {PCText_BoxIsFull, 0}, - {PCText_ReleasePoke, 0}, - {PCText_WasReleased, 4}, - {PCText_ByeBye, 6}, - {PCText_MarkPoke, 0}, - {PCText_LastPoke, 0}, - {PCText_PartyFull, 0}, - {PCText_HoldingPoke, 0}, - {PCText_WhichOneWillTake, 0}, - {PCText_CantReleaseEgg, 0}, - {PCText_ContinueBox, 0}, - {PCText_CameBack, 1}, - {PCText_Worried, 0}, - {PCText_Surprise, 0}, - {PCText_PleaseRemoveMail, 0} -}; - -void PrintStorageActionText(u8 index) -{ - u8 *ptr; - - Menu_DrawStdWindowFrame(10, 16, 29, 19); - - switch (gPCStorageActionTexts[index].format) - { - case PC_TEXT_FMT_UNK_02: - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); - break; - case PC_TEXT_FMT_UNK_05: - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_26e4); - break; - case PC_TEXT_FMT_MON_NAME: - // {var} + " is selected." - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_11fa); - ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); - break; - case PC_TEXT_FMT_MON_NAME_2: - // {var} + " was released." - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_26e4); -#if ENGLISH - ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); -#elif GERMAN - ptr = de_sub_8073174(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); -#endif - break; - case PC_TEXT_FMT_UNK_03: - { - const u8 *stringLength; - const u8 *text; - - text = gPCStorageActionTexts[index].text; - stringLength = &text[StringLength(text)] + 1; - - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); - ptr = StringCopy(ptr, stringLength); - } - break; - case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK: - { - const u8 *stringLength; - const u8 *text; - - text = gPCStorageActionTexts[index].text; - stringLength = &text[StringLength(text)] - 1; - - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); - ptr = StringCopy(ptr - 1, gPokemonStorageSystemPtr->unk_26e4); - ptr = StringCopy(ptr, stringLength); - } - break; - case PC_TEXT_FMT_NORMAL: - default: - ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); - break; - } - - while (ptr < gPokemonStorageSystemPtr->unk_26a6) - { - ptr[0] = CHAR_SPACE; - ptr++; - } - - ptr[0] = EOS; - Menu_PrintText(gPokemonStorageSystemPtr->unk_2694, 11, 17); -} - -const struct OamData gOamData_83B6EAC = { - .size = 3 -}; - -const struct OamData gOamData_83B6EB4 = { - .shape = ST_OAM_H_RECTANGLE -}; - -const union AnimCmd gSpriteAnim_83B6EBC[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83B6EC4[] = { - ANIMCMD_FRAME(2, 8), - ANIMCMD_FRAME(4, 8), - ANIMCMD_FRAME(6, 8), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd gSpriteAnim_83B6ED4[] = { - ANIMCMD_FRAME(8, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83B6EDC[] = { - ANIMCMD_FRAME(10, 8), - ANIMCMD_FRAME( 4, 8), - ANIMCMD_FRAME(12, 8), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd *const gSpriteAnimTable_83B6EEC[] = { - gSpriteAnim_83B6EBC, - gSpriteAnim_83B6EC4, - gSpriteAnim_83B6ED4, - gSpriteAnim_83B6EDC -}; - -const struct SpriteTemplate gSpriteTemplate_83B6EFC = { - 0x0005, - 0xdacd, - &gOamData_83B6EB4, - gSpriteAnimTable_83B6EEC, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -void sub_8098A38(s8 a0) -{ - DisplayYesNoMenu(23, 10, 0); - Menu_MoveCursor(a0); -} - -void sub_8098A5C(void) -{ - Menu_DestroyCursor(); - Menu_EraseWindowRect(10, 16, 29, 19); - Menu_EraseWindowRect(23, 10, 29, 15); -} - -void sub_8098A80(void) -{ - sub_809CDCC(); - sub_809CDEC(12); - sub_809CDEC(13); - sub_809CDEC(14); - sub_809CDEC(15); - sub_809CE84(); -} - -void sub_8098AA8(u8 a0) -{ - sub_809CDCC(); - switch (a0) - { - case 0: - sub_809CDEC(16); - sub_809CDEC(17); - sub_809CDEC(18); - sub_809CDEC(19); - break; - case 1: - sub_809CDEC(20); - sub_809CDEC(21); - sub_809CDEC(22); - sub_809CDEC(23); - break; - case 2: - sub_809CDEC(24); - sub_809CDEC(25); - sub_809CDEC(26); - sub_809CDEC(27); - break; - case 3: - sub_809CDEC(28); - sub_809CDEC(29); - sub_809CDEC(30); - sub_809CDEC(31); - break; - } - sub_809CE84(); -} diff --git a/src/pokemon/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c deleted file mode 100644 index da26c6fc5..000000000 --- a/src/pokemon/pokemon_storage_system_3.c +++ /dev/null @@ -1,655 +0,0 @@ - -// Includes -#include "global.h" -#include "constants/species.h" -#include "sprite.h" -#include "trig.h" -#include "pokemon_icon.h" -#include "pokemon_storage_system.h" - -// Static type declarations - -// Static RAM declarations - -// Static ROM declarations - -static void sub_8098E68(struct Sprite *sprite); -static void sub_8099388(struct Sprite *sprite, u16 a1); -static void sub_80993F4(struct Sprite *sprite); -static void sub_80999C4(struct Sprite *sprite); -static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority); -static void PSS_DestroyMonIconSprite(struct Sprite *sprite); - -// .rodata - -const struct OamData gOamData_83B6F2C; - -// .text - -u8 get_preferred_box(void) -{ - return gPokemonStorage.currentBox; -} - -void ResetPSSMonIconSprites(void) -{ - u16 i; - - sub_809D51C(); - for (i = 0; i < 40; i++) - gPokemonStorageSystemPtr->unk_10d0[i] = 0; - for (i = 0; i < 40; i++) - gPokemonStorageSystemPtr->unk_1120[i] = 0; - for (i = 0; i < 6; i++) - gPokemonStorageSystemPtr->unk_1038[i] = NULL; - for (i = 0; i < 30; i++) - gPokemonStorageSystemPtr->unk_1050[i] = NULL; - gPokemonStorageSystemPtr->unk_1034 = NULL; - gPokemonStorageSystemPtr->unk_0d5c = 0; -} - -void sub_8098BF0(void) -{ - u32 personality = GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_PERSONALITY); - gPokemonStorageSystemPtr->unk_1034 = PSS_SpawnMonIconSprite(GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_SPECIES2), personality, 0, 0, 1, 7); - gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; -} - -void SpawnBoxIconSprites(u8 boxId) -{ - struct BoxPokemon *box = gPokemonStorage.boxes[boxId]; - u16 i; - u16 k = 0; - for (i = 0; i < 5; i++) - { - u16 j; - for (j = 0; j < 6; j++) - { - u16 species = GetBoxMonData(box, MON_DATA_SPECIES2); - if (species != SPECIES_NONE) - gPokemonStorageSystemPtr->unk_1050[k] = PSS_SpawnMonIconSprite(species, GetBoxMonData(box, MON_DATA_PERSONALITY), 24 * j + 0x64, 24 * i + 0x2c, 2, 18 - j); - else - gPokemonStorageSystemPtr->unk_1050[k] = NULL; - box++; - k++; - } - } -} - -void sub_8098D20(u8 monId) -{ - struct BoxPokemon *mon = gPokemonStorage.boxes[get_preferred_box()] + monId; - u16 species = GetBoxMonData(mon, MON_DATA_SPECIES2); - if (species != SPECIES_NONE) - { - s16 x = 24 * (monId % 6) + 0x64; - s16 y = 24 * (monId / 6) + 0x2c; - gPokemonStorageSystemPtr->unk_1050[monId] = PSS_SpawnMonIconSprite(species, GetBoxMonData(mon, MON_DATA_PERSONALITY), x, y, 2, 18 - (monId % 6)); - } -} - -static void sub_8098DE0(s16 a0) -{ - u16 monId; - for (monId = 0; monId < 30; monId++) - { - if (gPokemonStorageSystemPtr->unk_1050[monId]) - { - gPokemonStorageSystemPtr->unk_1050[monId]->data[2] = a0; - gPokemonStorageSystemPtr->unk_1050[monId]->data[4] = 1; - gPokemonStorageSystemPtr->unk_1050[monId]->callback = sub_8098E68; - } - } -} - -static void sub_8098E24(struct Sprite *sprite) -{ - if (sprite->data[1] != 0) - { - sprite->data[1]--; - sprite->pos1.x += sprite->data[2]; - } - else - { - gPokemonStorageSystemPtr->unk_1178--; - sprite->pos1.x = sprite->data[3]; - sprite->callback = SpriteCallbackDummy; - } -} - -static void sub_8098E68(struct Sprite *sprite) -{ - if (sprite->data[4] != 0) - { - sprite->data[4]--; - } - else - { - sprite->pos1.x += sprite->data[2]; - sprite->data[5] = sprite->pos1.x + sprite->pos2.x; - if (sprite->data[5] < 0x45 || sprite->data[5] > 0xfb) - sprite->callback = SpriteCallbackDummy; - } -} - -static void sub_8098EA0(u8 col) -{ - u16 i; - - for (i = 0; i < 5; i++) - { - if (gPokemonStorageSystemPtr->unk_1050[col]) - { - PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1050[col]); - gPokemonStorageSystemPtr->unk_1050[col] = NULL; - } - col += 6; - } -} - -static u8 sub_8098EE0(u8 col, u16 a1, s16 a2) -{ - u16 i; - u16 x; - u16 y; - u8 count; - u8 x1; - u16 curX; - - y = 0x2c; - x = 24 * col + 0x64; - curX = x - (a1 + 1) * a2; - x1 = 18 - col; - count = 0; - - for (i = 0; i < 5; i++) - { - u16 species = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_SPECIES2); - if (species != SPECIES_NONE) - { - gPokemonStorageSystemPtr->unk_1050[col] = PSS_SpawnMonIconSprite(species, GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_PERSONALITY), curX, y, 2, x1); - if (gPokemonStorageSystemPtr->unk_1050[col]) - { - gPokemonStorageSystemPtr->unk_1050[col]->data[1] = a1; - gPokemonStorageSystemPtr->unk_1050[col]->data[2] = a2; - gPokemonStorageSystemPtr->unk_1050[col]->data[3] = x; - gPokemonStorageSystemPtr->unk_1050[col]->callback = sub_8098E24; - count++; - } - } - col += 6; - y += 24; - } - return count; -} - -void sub_809900C(u8 a0, s8 a1) -{ - gPokemonStorageSystemPtr->unk_117c = 0; - gPokemonStorageSystemPtr->unk_117d = a0; - gPokemonStorageSystemPtr->unk_117b = a1; - gPokemonStorageSystemPtr->unk_1172 = 32; - gPokemonStorageSystemPtr->unk_1176 = -6 * a1; - gPokemonStorageSystemPtr->unk_1178 = 0; - if (a1 > 0) - gPokemonStorageSystemPtr->unk_117a = 0; - else - gPokemonStorageSystemPtr->unk_117a = 5; - gPokemonStorageSystemPtr->unk_1174 = 24 * gPokemonStorageSystemPtr->unk_117a + 0x64; - sub_8098DE0(gPokemonStorageSystemPtr->unk_1176); -} - -bool8 sub_80990AC(void) -{ - if (gPokemonStorageSystemPtr->unk_1172) - gPokemonStorageSystemPtr->unk_1172--; - switch (gPokemonStorageSystemPtr->unk_117c) - { - case 0: - gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176; - if (gPokemonStorageSystemPtr->unk_1174 < 0x41 || gPokemonStorageSystemPtr->unk_1174 > 0xfb) - { - sub_8098EA0(gPokemonStorageSystemPtr->unk_117a); - gPokemonStorageSystemPtr->unk_1174 += 24 * gPokemonStorageSystemPtr->unk_117b; - gPokemonStorageSystemPtr->unk_117c++; - } - break; - case 1: - gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176; - gPokemonStorageSystemPtr->unk_1178 += sub_8098EE0(gPokemonStorageSystemPtr->unk_117a, gPokemonStorageSystemPtr->unk_1172, gPokemonStorageSystemPtr->unk_1176); - if ((gPokemonStorageSystemPtr->unk_117b > 0 && gPokemonStorageSystemPtr->unk_117a == 5) || (gPokemonStorageSystemPtr->unk_117b < 0 && gPokemonStorageSystemPtr->unk_117a == 0)) - { - gPokemonStorageSystemPtr->unk_117c++; - } - else - { - gPokemonStorageSystemPtr->unk_117a += gPokemonStorageSystemPtr->unk_117b; - gPokemonStorageSystemPtr->unk_117c = 0; - } - break; - case 2: - if (gPokemonStorageSystemPtr->unk_1178 == 0) - { - gPokemonStorageSystemPtr->unk_1172++; - return FALSE; - } - break; - default: - return FALSE; - } - return TRUE; -} - -void sub_8099200(bool8 a0) -{ - u16 count; - u16 i; - u16 species = GetMonData(gPlayerParty + 0, MON_DATA_SPECIES2); - u32 personality = GetMonData(gPlayerParty + 0, MON_DATA_PERSONALITY); - gPokemonStorageSystemPtr->unk_1038[0] = PSS_SpawnMonIconSprite(species, personality, 0x68, 0x40, 1, 11); - count = 1; - for (i = 1; i < PARTY_SIZE; i++) - { - species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES2); - if (species != SPECIES_NONE) - { - personality = GetMonData(gPlayerParty + i, MON_DATA_PERSONALITY); - gPokemonStorageSystemPtr->unk_1038[i] = PSS_SpawnMonIconSprite(species, personality, 0x98, (i - 1) * 24 + 0x10, 1, 11); - count++; - } - else - { - gPokemonStorageSystemPtr->unk_1038[i] = NULL; - } - } - if (!a0) - { - for (i = 0; i < count; i++) - { - // this routine assumes party_compaction has been called - gPokemonStorageSystemPtr->unk_1038[i]->pos1.y -= 0xa0; - gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE; - } - } -} - -void sub_8099310(void) -{ - u16 i; - u16 count; - - gPokemonStorageSystemPtr->unk_1171 = 0; - for (i = 0, count = 0; i < PARTY_SIZE; i++) - { - if (gPokemonStorageSystemPtr->unk_1038[i]) - { - if (i != count) - { - sub_8099388(gPokemonStorageSystemPtr->unk_1038[i], count); - gPokemonStorageSystemPtr->unk_1038[i] = NULL; - gPokemonStorageSystemPtr->unk_1171++; - } - count++; - } - } -} - -u8 sub_8099374(void) -{ - return gPokemonStorageSystemPtr->unk_1171; -} - -static void sub_8099388(struct Sprite *sprite, u16 a1) -{ - s16 r3; - s16 r4; - - sprite->data[1] = a1; - if (a1 == 0) - { - r3 = 0x68; - r4 = 0x40; - } - else - { - r3 = 0x98; - r4 = 24 * (a1 - 1) + 0x10; - } - sprite->data[2] = sprite->pos1.x << 3; - sprite->data[3] = sprite->pos1.y << 3; - sprite->data[4] = (r3 * 8 - sprite->data[2]) / 8; - sprite->data[5] = (r4 * 8 - sprite->data[3]) / 8; - sprite->data[6] = 8; - sprite->callback = sub_80993F4; -} - -static void sub_80993F4(struct Sprite *sprite) -{ - if (sprite->data[6]) - { - sprite->data[2] += sprite->data[4]; - sprite->data[3] += sprite->data[5]; - sprite->pos1.x = sprite->data[2] >> 3; - sprite->pos1.y = sprite->data[3] >> 3; - sprite->data[6]--; - } - else - { - if (sprite->data[1] == 0) - { - sprite->pos1.x = 0x68; - sprite->pos1.y = 0x40; - } - else - { - sprite->pos1.x = 0x98; - sprite->pos1.y = (sprite->data[1] - 1) * 24 + 0x10; - } - sprite->callback = SpriteCallbackDummy; - gPokemonStorageSystemPtr->unk_1038[sprite->data[1]] = sprite; - gPokemonStorageSystemPtr->unk_1171--; - } -} - -void sub_8099480(void) -{ - if (gPokemonStorageSystemPtr->unk_1034) - { - PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1034); - gPokemonStorageSystemPtr->unk_1034 = NULL; - } -} - -void sub_80994A8(s16 y) -{ - u16 i; - - for (i = 0; i < PARTY_SIZE; i++) - { - if (gPokemonStorageSystemPtr->unk_1038[i]) - { - s16 yy; - gPokemonStorageSystemPtr->unk_1038[i]->pos1.y += y; - yy = gPokemonStorageSystemPtr->unk_1038[i]->pos1.y + gPokemonStorageSystemPtr->unk_1038[i]->pos2.y + gPokemonStorageSystemPtr->unk_1038[i]->centerToCornerVecY; - if (yy < -0x10 || yy > 0xb0) - gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE; - else - gPokemonStorageSystemPtr->unk_1038[i]->invisible = FALSE; - } - } -} - -void sub_8099520(u8 a0) -{ - if (gPokemonStorageSystemPtr->unk_1038[a0]) - { - PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[a0]); - gPokemonStorageSystemPtr->unk_1038[a0] = NULL; - } -} - -void sub_809954C(void) -{ - u16 i; - - for (i = 0; i < PARTY_SIZE; i++) - { - if (gPokemonStorageSystemPtr->unk_1038[i]) - { - PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[i]); - gPokemonStorageSystemPtr->unk_1038[i] = NULL; - } - } -} - -void sub_8099584(u8 a0, u8 a1) -{ - if (a0 == 0) - { - gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1038[a1]; - gPokemonStorageSystemPtr->unk_1038[a1] = NULL; - } - else if (a0 == 1) - { - gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1050[a1]; - gPokemonStorageSystemPtr->unk_1050[a1] = NULL; - } - else - { - return; - } - gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; - gPokemonStorageSystemPtr->unk_1034->oam.priority = 1; - gPokemonStorageSystemPtr->unk_1034->subpriority = 7; -} - -void sub_809960C(u8 a0, u8 a1) -{ - if (a0 == 14) - { - gPokemonStorageSystemPtr->unk_1038[a1] = gPokemonStorageSystemPtr->unk_1034; - gPokemonStorageSystemPtr->unk_1038[a1]->oam.priority = 1; - gPokemonStorageSystemPtr->unk_1038[a1]->subpriority = 11; - } - else - { - gPokemonStorageSystemPtr->unk_1050[a1] = gPokemonStorageSystemPtr->unk_1034; - gPokemonStorageSystemPtr->unk_1050[a1]->oam.priority = 2; - gPokemonStorageSystemPtr->unk_1050[a1]->subpriority = 18 - (a1 % 6); - } - gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; - gPokemonStorageSystemPtr->unk_1034 = NULL; -} - -void sub_80996B0(u8 a0, u8 a1) -{ - if (a0 == 14) - gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1038 + a1; - else - gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1050 + a1; - gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; - gPokemonStorageSystemPtr->unk_1170 = 0; -} - -bool8 sub_809971C(void) -{ - if (gPokemonStorageSystemPtr->unk_1170 == 16) - return FALSE; - gPokemonStorageSystemPtr->unk_1170++; - if (gPokemonStorageSystemPtr->unk_1170 & 1) - { - (*gPokemonStorageSystemPtr->unk_10c8)->pos1.y--; - gPokemonStorageSystemPtr->unk_1034->pos1.y++; - } - (*gPokemonStorageSystemPtr->unk_10c8)->pos2.x = gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16; - gPokemonStorageSystemPtr->unk_1034->pos2.x = -(gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16); - if (gPokemonStorageSystemPtr->unk_1170 == 8) - { - gPokemonStorageSystemPtr->unk_1034->oam.priority = (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority; - gPokemonStorageSystemPtr->unk_1034->subpriority = (*gPokemonStorageSystemPtr->unk_10c8)->subpriority; - (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority = 1; - (*gPokemonStorageSystemPtr->unk_10c8)->subpriority = 7; - } - if (gPokemonStorageSystemPtr->unk_1170 == 16) - { - struct Sprite *sprite = gPokemonStorageSystemPtr->unk_1034; - gPokemonStorageSystemPtr->unk_1034 = *(gPokemonStorageSystemPtr->unk_10c8); - (*gPokemonStorageSystemPtr->unk_10c8) = sprite; - gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; - (*gPokemonStorageSystemPtr->unk_10c8)->callback = SpriteCallbackDummy; - } - return TRUE; -} - -const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[]; - -void sub_809981C(u8 mode, u8 idx) -{ - switch (mode) - { - case 0: - gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1038 + idx; - break; - case 1: - gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1050 + idx; - break; - case 2: - gPokemonStorageSystemPtr->unk_10cc = &gPokemonStorageSystemPtr->unk_1034; - break; - default: - return; - } - if (*gPokemonStorageSystemPtr->unk_10cc) - { - InitSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc); - (*gPokemonStorageSystemPtr->unk_10cc)->oam.affineMode = ST_OAM_AFFINE_NORMAL; - (*gPokemonStorageSystemPtr->unk_10cc)->affineAnims = gSpriteAffineAnimTable_83B6F5C; - StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 0); - } -} - -bool8 sub_80998D8(void) -{ - if (*gPokemonStorageSystemPtr->unk_10cc == NULL || (*gPokemonStorageSystemPtr->unk_10cc)->invisible) - return FALSE; - if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded) - { - (*gPokemonStorageSystemPtr->unk_10cc)->invisible = TRUE; - } - return TRUE; -} - -void sub_8099920(void) -{ - if (*gPokemonStorageSystemPtr->unk_10cc) - { - FreeOamMatrix((*gPokemonStorageSystemPtr->unk_10cc)->oam.matrixNum); - PSS_DestroyMonIconSprite(*gPokemonStorageSystemPtr->unk_10cc); - *gPokemonStorageSystemPtr->unk_10cc = NULL; - } -} - -void sub_8099958(void) -{ - if (*gPokemonStorageSystemPtr->unk_10cc) - { - (*gPokemonStorageSystemPtr->unk_10cc)->invisible = FALSE; - StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 1); - } -} - -bool8 sub_8099990(void) -{ - if (gPokemonStorageSystemPtr->unk_10cc == NULL) - return FALSE; - if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded) - gPokemonStorageSystemPtr->unk_10cc = NULL; - return TRUE; -} - -static void sub_80999C4(struct Sprite *sprite) -{ - sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x; - sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + gPokemonStorageSystemPtr->unk_11c0->pos2.y + 4; -} - -static u16 PSS_LoadSpeciesIconGfx(u16 a0) -{ - u16 i; - u16 retval; - - for (i = 0; i < 40; i++) - { - if (gPokemonStorageSystemPtr->unk_1120[i] == a0) - break; - } - if (i == 40) - { - for (i = 0; i < 40; i++) - { - if (gPokemonStorageSystemPtr->unk_1120[i] == 0) - break; - } - } - if (i != 40) - { - gPokemonStorageSystemPtr->unk_1120[i] = a0; - gPokemonStorageSystemPtr->unk_10d0[i]++; - retval = i * 16; - CpuCopy32(gMonIconTable[a0], BG_CHAR_ADDR(4) + 32 * retval, 0x200); - return retval; - } - return 0xFFFF; -} - -static void PSS_ForgetSpeciesIcon(u16 a0) -{ - u16 i; - - for (i = 0; i < 40; i++) - { - if (gPokemonStorageSystemPtr->unk_1120[i] == a0) - { - if (--gPokemonStorageSystemPtr->unk_10d0[i] == 0) - gPokemonStorageSystemPtr->unk_1120[i] = 0; - break; - } - } -} - -static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority) -{ - struct SpriteTemplate template = { - 0x000f, - 0xdac0, - &gOamData_83B6F2C, - gDummySpriteAnimTable, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy - }; - u16 tileNum; - u8 spriteId; - - species = mon_icon_convert_unown_species_id(species, personality); - template.paletteTag = 0xdac0 + gMonIconPaletteIndices[species]; - tileNum = PSS_LoadSpeciesIconGfx(species); - if (tileNum == 0xFFFF) - return NULL; - spriteId = CreateSprite(&template, x, y, subpriority); - if (spriteId == MAX_SPRITES) - { - PSS_ForgetSpeciesIcon(species); - return NULL; - } - gSprites[spriteId].oam.tileNum = tileNum; - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].data[0] = species; - return gSprites + spriteId; -} - -static void PSS_DestroyMonIconSprite(struct Sprite *sprite) -{ - PSS_ForgetSpeciesIcon(sprite->data[0]); - DestroySprite(sprite); -} - -const struct OamData gOamData_83B6F2C = { - .size = 2 -}; - -const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = { - AFFINEANIMCMD_FRAME(-2, -2, 0, 120), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = { - AFFINEANIMCMD_FRAME(16, 16, 0, 0), - AFFINEANIMCMD_FRAME(16, 16, 0, 15), - AFFINEANIMCMD_END -}; - -const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = { - gSpriteAffineAnim_83B6F34, - gSpriteAffineAnim_83B6F44 -}; diff --git a/src/pokemon/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c deleted file mode 100644 index 2f9f79a54..000000000 --- a/src/pokemon/pokemon_storage_system_4.c +++ /dev/null @@ -1,2849 +0,0 @@ - -// Includes -#include "global.h" -#include "ewram.h" -#include "data2.h" -#include "constants/moves.h" -#include "constants/species.h" -#include "palette.h" -#include "string_util.h" -#include "text.h" -#include "menu.h" -#include "item.h" -#include "pokemon_summary_screen.h" -#include "pokemon_storage_system.h" - -// Static type declarations - -struct WallpaperTable { - const u8 *tiles; - u32 size; - const u8 *tileMap; - const u16 *palettes; -}; - -// Static RAM declarations - -EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; -#if DEBUG -EWRAM_DATA u32 unk_2038790 = 0; -EWRAM_DATA u32 unk_2038794 = 0; -EWRAM_DATA u32 unk_2038798 = 0; -#endif -EWRAM_DATA s8 gUnknown_020384E4 = 0; -EWRAM_DATA s8 gUnknown_020384E5 = 0; -EWRAM_DATA bool8 gUnknown_020384E6 = FALSE; -EWRAM_DATA u8 gUnknown_020384E7 = 0; -EWRAM_DATA u8 gUnknown_020384E8 = 0; -EWRAM_DATA u8 gUnknown_020384E9 = 0; -EWRAM_DATA u8 gUnknown_020384EA = 0; - -// Static ROM declarations - -void sub_809900C(u8 boxId, s8 a1); -s8 sub_8099D90(u8 boxId); -void sub_8099EB0(u8 boxId, s8 a1); -void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3); -void sub_809A14C(u16 *vdest); -void sub_809A23C(u8 boxId); -void sub_809A3D0(u8 boxId, s8 a1); -void sub_809A598(void); -void sub_809A5E8(struct Sprite *sprite); -void sub_809A61C(struct Sprite *sprite); -void sub_809A654(void); -s16 sub_809A6D0(u8 width); -void sub_809A6DC(void); -void sub_809A774(s8 a0); -void sub_809A810(void); -void sub_809AFB8(void); -void sub_809A8C8(struct Sprite *sprite); -bool8 sub_809B150(void); -bool8 sub_809B1D8(void); -bool8 sub_809B24C(void); -bool8 sub_809B324(void); -bool8 sub_809B358(void); -void sub_809B384(void); -void sub_809B3E0(void); -void sub_809B44C(u8 a0, u8 a1); -void diegohint2(u8 a0, u8 a1); -void sub_809B548(u8 a0, u8 a1); -void diegohint1(u8 a0, u8 a1); -bool8 sub_809BF2C(void); -void sub_809BF74(void); -void sub_809C028(void); -void sub_809C04C(void *pokemon, u8 a1); -bool8 sub_809CAB0(void); -void sub_809CC04(void); -void sub_809CD88(void); -s8 sub_809CE4C(u8 a0); - -// .rodata - -const u16 gWallpaperPalettes_Forest[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Forest_2[] = INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal"); -const u16 gWallpaperPalettes_Forest_2_3[] = INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal"); - -const u8 gWallpaperTiles_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.4bpp.lz"); - -const u8 gWallpaperTilemap_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.bin.lz"); - -const u16 gWallpaperPalettes_City[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_City_2[] = INCBIN_U16("graphics/pokemon_storage/city_frame.gbapal"); -const u16 gWallpaperPalettes_City_2_3[] = INCBIN_U16("graphics/pokemon_storage/city_bg.gbapal"); - -const u8 gWallpaperTiles_City[] = INCBIN_U8("graphics/pokemon_storage/city.4bpp.lz"); - -const u8 gWallpaperTilemap_City[] = INCBIN_U8("graphics/pokemon_storage/city.bin.lz"); - -const u16 gWallpaperPalettes_Desert[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Desert_2[] = INCBIN_U16("graphics/pokemon_storage/desert_frame.gbapal"); -const u16 gWallpaperPalettes_Desert_2_3[] = INCBIN_U16("graphics/pokemon_storage/desert_bg.gbapal"); - -const u8 gWallpaperTiles_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.4bpp.lz"); - -const u8 gWallpaperTilemap_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.bin.lz"); - -const u16 gWallpaperPalettes_Savanna[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Savanna_2[] = INCBIN_U16("graphics/pokemon_storage/savanna_frame.gbapal"); -const u16 gWallpaperPalettes_Savanna_2_3[] = INCBIN_U16("graphics/pokemon_storage/savanna_bg.gbapal"); - -const u8 gWallpaperTiles_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.4bpp.lz"); - -const u8 gWallpaperTilemap_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.bin.lz"); - -const u16 gWallpaperPalettes_Crag[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Crag_2[] = INCBIN_U16("graphics/pokemon_storage/crag_frame.gbapal"); -const u16 gWallpaperPalettes_Crag_2_3[] = INCBIN_U16("graphics/pokemon_storage/crag_bg.gbapal"); - -const u8 gWallpaperTiles_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.4bpp.lz"); - -const u8 gWallpaperTilemap_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.bin.lz"); - -const u16 gWallpaperPalettes_Volcano[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Volcano_2[] = INCBIN_U16("graphics/pokemon_storage/volcano_frame.gbapal"); -const u16 gWallpaperPalettes_Volcano_2_3[] = INCBIN_U16("graphics/pokemon_storage/volcano_bg.gbapal"); - -const u8 gWallpaperTiles_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.4bpp.lz"); -const u32 filler_83b871c = 0; // needed to match but otherwise garbage - -const u8 gWallpaperTilemap_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.bin.lz"); - -const u16 gWallpaperPalettes_Snow[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Snow_2[] = INCBIN_U16("graphics/pokemon_storage/snow_frame.gbapal"); -const u16 gWallpaperPalettes_Snow_2_3[] = INCBIN_U16("graphics/pokemon_storage/snow_bg.gbapal"); - -const u8 gWallpaperTiles_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.4bpp.lz"); - -const u8 gWallpaperTilemap_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.bin.lz"); - -const u16 gWallpaperPalettes_Cave[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Cave_2[] = INCBIN_U16("graphics/pokemon_storage/cave_frame.gbapal"); -const u16 gWallpaperPalettes_Cave_2_3[] = INCBIN_U16("graphics/pokemon_storage/cave_bg.gbapal"); - -const u8 gWallpaperTiles_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.4bpp.lz"); - -const u8 gWallpaperTilemap_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.bin.lz"); - -const u16 gWallpaperPalettes_Beach[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Beach_2[] = INCBIN_U16("graphics/pokemon_storage/beach_frame.gbapal"); -const u16 gWallpaperPalettes_Beach_2_3[] = INCBIN_U16("graphics/pokemon_storage/beach_bg.gbapal"); - -const u8 gWallpaperTiles_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.4bpp.lz"); - -const u8 gWallpaperTilemap_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.bin.lz"); - -const u16 gWallpaperPalettes_Seafloor[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Seafloor_2[] = INCBIN_U16("graphics/pokemon_storage/seafloor_frame.gbapal"); -const u16 gWallpaperPalettes_Seafloor_2_3[] = INCBIN_U16("graphics/pokemon_storage/seafloor_bg.gbapal"); - -const u8 gWallpaperTiles_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.4bpp.lz"); - -const u8 gWallpaperTilemap_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.bin.lz"); - -const u16 gWallpaperPalettes_River[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_River_2[] = INCBIN_U16("graphics/pokemon_storage/river_frame.gbapal"); -const u16 gWallpaperPalettes_River_2_3[] = INCBIN_U16("graphics/pokemon_storage/river_bg.gbapal"); - -const u8 gWallpaperTiles_River[] = INCBIN_U8("graphics/pokemon_storage/river.4bpp.lz"); - -const u8 gWallpaperTilemap_River[] = INCBIN_U8("graphics/pokemon_storage/river.bin.lz"); - -const u16 gWallpaperPalettes_Sky[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); -const u16 gWallpaperPalettes_Sky_2[] = INCBIN_U16("graphics/pokemon_storage/sky_frame.gbapal"); -const u16 gWallpaperPalettes_Sky_2_3[] = INCBIN_U16("graphics/pokemon_storage/sky_bg.gbapal"); - -const u8 gWallpaperTiles_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.4bpp.lz"); - -const u8 gWallpaperTilemap_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.bin.lz"); - -const u16 gWallpaperPalettes_Polkadot[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal"); -const u16 gWallpaperPalettes_Polkadot_2[] = INCBIN_U16("graphics/pokemon_storage/polkadot_frame.gbapal"); -const u16 gWallpaperPalettes_Polkadot_2_3[] = INCBIN_U16("graphics/pokemon_storage/polkadot_bg.gbapal"); - -const u8 gWallpaperTiles_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.4bpp.lz"); - -const u8 gWallpaperTilemap_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.bin.lz"); - -const u16 gWallpaperPalettes_Pokecenter[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal"); -const u16 gWallpaperPalettes_Pokecenter_2[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_frame.gbapal"); -const u16 gWallpaperPalettes_Pokecenter_2_3[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_bg.gbapal"); - -const u8 gWallpaperTiles_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.4bpp.lz"); - -const u8 gWallpaperTilemap_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.bin.lz"); - -const u16 gWallpaperPalettes_Machine[] = INCBIN_U16("graphics/pokemon_storage/box_bg3.gbapal"); -const u16 gWallpaperPalettes_Machine_2[] = INCBIN_U16("graphics/pokemon_storage/machine_frame.gbapal"); -const u16 gWallpaperPalettes_Machine_2_3[] = INCBIN_U16("graphics/pokemon_storage/machine_bg.gbapal"); - -const u8 gWallpaperTiles_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.4bpp.lz"); - -const u8 gWallpaperTilemap_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.bin.lz"); - -const u16 gWallpaperPalettes_Plain[] = INCBIN_U16("graphics/pokemon_storage/box_bg4.gbapal"); -const u16 gWallpaperPalettes_Plain_2[] = INCBIN_U16("graphics/pokemon_storage/plain_frame.gbapal"); -const u16 gWallpaperPalettes_Plain_2_3[] = INCBIN_U16("graphics/pokemon_storage/plain_bg.gbapal"); - -const u8 gWallpaperTiles_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.4bpp.lz"); - -const u8 gWallpaperTilemap_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.bin.lz"); - -const u16 gUnknown_083BAEF8[] = INCBIN_U16("graphics/unused/tilemap_3BAEF8.bin"); - -const u16 gUnknown_083BB0A8[][2] = { - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF} -}; - -const struct WallpaperTable gWallpaperTable[] = { - {gWallpaperTiles_Forest, 0x3D0, gWallpaperTilemap_Forest, gWallpaperPalettes_Forest}, // Forest - {gWallpaperTiles_City, 0x208, gWallpaperTilemap_City, gWallpaperPalettes_City}, // City - {gWallpaperTiles_Desert, 0x2EC, gWallpaperTilemap_Desert, gWallpaperPalettes_Desert}, // Desert - {gWallpaperTiles_Savanna, 0x220, gWallpaperTilemap_Savanna, gWallpaperPalettes_Savanna}, // Savanna - {gWallpaperTiles_Crag, 0x350, gWallpaperTilemap_Crag, gWallpaperPalettes_Crag}, // Crag - {gWallpaperTiles_Volcano, 0x334, gWallpaperTilemap_Volcano, gWallpaperPalettes_Volcano}, // Volcano - {gWallpaperTiles_Snow, 0x2B8, gWallpaperTilemap_Snow, gWallpaperPalettes_Snow}, // Snow - {gWallpaperTiles_Cave, 0x344, gWallpaperTilemap_Cave, gWallpaperPalettes_Cave}, // Cave - {gWallpaperTiles_Beach, 0x384, gWallpaperTilemap_Beach, gWallpaperPalettes_Beach}, // Beach - {gWallpaperTiles_Seafloor, 0x2B4, gWallpaperTilemap_Seafloor, gWallpaperPalettes_Seafloor}, // Seafloor - {gWallpaperTiles_River, 0x294, gWallpaperTilemap_River, gWallpaperPalettes_River}, // River - {gWallpaperTiles_Sky, 0x298, gWallpaperTilemap_Sky, gWallpaperPalettes_Sky}, // Sky - {gWallpaperTiles_Polkadot, 0x1FC, gWallpaperTilemap_Polkadot, gWallpaperPalettes_Polkadot}, // Polkadot - {gWallpaperTiles_Pokecenter, 0x3A4, gWallpaperTilemap_Pokecenter, gWallpaperPalettes_Pokecenter}, // Pokecenter - {gWallpaperTiles_Machine, 0x2F0, gWallpaperTilemap_Machine, gWallpaperPalettes_Machine}, // Machine - {gWallpaperTiles_Plain, 0xFC, gWallpaperTilemap_Plain, gWallpaperPalettes_Plain} // Plain -}; - -const u16 PCPal_Arrow[] = INCBIN_U16("graphics/pokemon_storage/arrow.gbapal"); -const u8 PCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); - -const struct SpriteSheet gUnknown_083BB288 = {PCGfx_Arrow, 0x80, 6}; -const struct SpritePalette gUnknown_083BB290 = {PCPal_Arrow, 0xdacf}; - -const struct OamData gOamData_83BB298 = { - .shape = ST_OAM_H_RECTANGLE, - .size = 2, - .priority = 2 -}; - -const union AnimCmd gSpriteAnim_83BB2A0[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83BB2A8[] = { - ANIMCMD_FRAME(8, 5), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = { - gSpriteAnim_83BB2A0, - gSpriteAnim_83BB2A8 -}; - -const struct SpriteTemplate gSpriteTemplate_83BB2B8 = { - 3, - 0xdac8, - &gOamData_83BB298, - gSpriteAnimTable_83BB2B0, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy -}; - -const struct OamData gOamData_83BB2D0 = { - .shape = ST_OAM_V_RECTANGLE, - .priority = 2 -}; - -const union AnimCmd gSpriteAnim_83BB2D8[] = { - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_83BB2E0[] = { - ANIMCMD_FRAME(2, 5), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_83BB2E8[] = { - gSpriteAnim_83BB2D8, - gSpriteAnim_83BB2E0 -}; - -const struct SpriteTemplate gSpriteTemplate_83BB2F0 = { - 6, - 0xdacf, - &gOamData_83BB2D0, - gSpriteAnimTable_83BB2E8, - NULL, - gDummySpriteAffineAnimTable, - sub_809A8C8 -}; - -const u16 HandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_pal.bin"); -const u16 HandCursorAltPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_alt_pal.bin"); -const u8 HandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp"); -const u8 HandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp"); - -bool8 (*const gUnknown_083BBBC8[])(void) = { - sub_809B150, - sub_809B1D8, - sub_809B24C -}; -// .text - -void sub_8099BF8(u8 boxId) -{ - gPokemonStorageSystemPtr->unk_08ba = FALSE; - gPokemonStorageSystemPtr->unk_08b4 = 0; - DmaFill32(3, 0, BG_SCREEN_ADDR(26), 0x1000); - sub_8099EB0(boxId, 0); - sub_809A23C(boxId); - sub_809A6DC(); - SpawnBoxIconSprites(boxId); - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT512x256; -} - -void sub_8099C70(u8 whichBox) -{ - s8 r4 = sub_8099D90(whichBox); - sub_8099EB0(whichBox, r4); - gPokemonStorageSystemPtr->unk_08b6 = r4 * 6; - gPokemonStorageSystemPtr->unk_08b8 = 0x20; - gPokemonStorageSystemPtr->unk_08bb = whichBox; - gPokemonStorageSystemPtr->unk_08bc = r4 > 0 ? 0 : 5; - gPokemonStorageSystemPtr->unk_08be = r4; - gPokemonStorageSystemPtr->unk_08c0 = r4 > 0 ? 0x108 : 0x38; - gPokemonStorageSystemPtr->unk_08c2 = r4 > 0 ? 0 : 5; - gPokemonStorageSystemPtr->unk_08c4 = r4; - gPokemonStorageSystemPtr->unk_08c6 = 0; - gPokemonStorageSystemPtr->unk_08c8 = 2; - sub_809900C(whichBox, r4); - sub_809A3D0(whichBox, r4); - sub_809A774(r4); -} - -bool8 sub_8099D34(void) -{ - bool8 retVal = sub_80990AC(); - if (gPokemonStorageSystemPtr->unk_08b8 != 0) - { - gPokemonStorageSystemPtr->unk_08b4 += gPokemonStorageSystemPtr->unk_08b6; - gPokemonStorageSystemPtr->unk_08b4 &= 0x1ff; - if (--gPokemonStorageSystemPtr->unk_08b8 == 0) - { - sub_809A598(); - sub_809A810(); - } - return TRUE; - } - return retVal; -} - -s8 sub_8099D90(u8 boxId) -{ - u8 curBox = get_preferred_box(); - u8 i; - - for (i = 0; curBox != boxId; i++) - { - if (++curBox >= 14) - curBox = 0; - } - return i <= 6 ? 1 : -1; -} - -void sub_8099DCC(u8 wallpaperId) -{ - u8 curBox = get_preferred_box(); - gPokemonStorage.wallpaper[curBox] = wallpaperId; - gPokemonStorageSystemPtr->unk_1032 = 0; -} - -bool8 sub_8099E08(void) -{ - switch (gPokemonStorageSystemPtr->unk_1032) - { - case 0: - BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0, 0x10, 0xffff); - gPokemonStorageSystemPtr->unk_1032++; - break; - case 1: - if (!UpdatePaletteFade()) - { - u8 curBox = get_preferred_box(); - sub_8099EB0(curBox, 0); - sub_809A654(); - BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0x10, 0, 0xffff); - gPokemonStorageSystemPtr->unk_1032++; - } - break; - case 2: - if (!UpdatePaletteFade()) - gPokemonStorageSystemPtr->unk_1032++; - break; - case 3: - return FALSE; - } - return TRUE; -} - -void sub_8099EB0(u8 boxId, s8 a1) -{ - const struct WallpaperTable *wallpaperTable; - - if (a1) - { - gPokemonStorageSystemPtr->unk_08ba = gPokemonStorageSystemPtr->unk_08ba ? FALSE : TRUE; - sub_809A14C(BG_SCREEN_ADDR(26)); - } - wallpaperTable = gWallpaperTable +gPokemonStorage.wallpaper[boxId]; - LoadPalette(wallpaperTable->palettes, gPokemonStorageSystemPtr->unk_08ba * 0x30 + 0x40, 0x60); - LZ77UnCompWram(wallpaperTable->tileMap, gPokemonStorageSystemPtr->unk_0d62); - sub_8099F58(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); - LZ77UnCompVram(wallpaperTable->tiles, BG_CHAR_ADDR(2) + (gPokemonStorageSystemPtr->unk_08ba << 13)); -} - -#ifdef NONMATCHING -void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) -{ - s16 r6; - s16 r3; - u16 sp0 = a3 << 8; - u16 sp4 = (a3 * 3 + 4) << 12; - u16 *r4; - u16 *r7; - u16 i; - u16 j; - s16 sp8 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 10 + a2 * 24) & 0x3f; - if (sp8 < 13) - { - r6 = 20; - r3 = 0; - r4 = vdest + sp8 + 0x40; - r7 = NULL; - } - else if (sp8 < 32) - { - r6 = 32 - sp8; - r3 = 20 - r6; - r4 = vdest + sp8 + 0x40; - r7 = vdest + 0x440; - } - else if (sp8 < 45) - { - r6 = 20; - r3 = 0; - r4 = vdest + sp8 + 0x420; - r7 = NULL; - } - else - { - r6 = 64 - sp8; - r3 = 20 - r6; - r4 = vdest + sp8 + 0x420; - r7 = vdest + 0x40; - } - for (i = 0; i < 18; i++) - { - for (j = 0; j < r6; j++) - { - u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); - r4[j] = tile; - src++; - } - for (j = 0; j < r3; j++) - { - u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); - r7[j] = tile; - src++; - } - r4 += 0x20; - r7 += 0x20; - } - if (a2) - { - s16 r4_2; - u16 *r2; - if (a2 > 0) - r4_2 = (sp8 + 20) & 0x3f; - else - r4_2 = (sp8 - 4) & 0x3f; - r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; - for (i = 0; i < 4; i++) - { - for (j = 0; j < 18; j++) - { - *r2 = 0; - r2 += 0x20; - } - r4_2++; - r4_2 &= 0x3f; - r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; - } - } -} -#else -__attribute__((naked)) void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x20\n" - "\tmov r9, r0\n" - "\tadds r5, r1, 0\n" - "\tlsls r2, 24\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tlsls r0, r3, 8\n" - "\tstr r0, [sp]\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r3\n" - "\tadds r0, 0x4\n" - "\tlsls r0, 28\n" - "\tlsrs r0, 16\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r0, _08099FB8 @ =gPokemonStorageSystemPtr\n" - "\tldr r0, [r0]\n" - "\tldr r1, _08099FBC @ =0x000008b4\n" - "\tadds r0, r1\n" - "\tldrh r1, [r0]\n" - "\tlsrs r1, 3\n" - "\tadds r1, 0xA\n" - "\tlsrs r0, r2, 24\n" - "\tmov r8, r0\n" - "\tasrs r2, 24\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, r2\n" - "\tlsls r0, 3\n" - "\tadds r1, r0\n" - "\tmovs r0, 0x3F\n" - "\tands r1, r0\n" - "\tstr r1, [sp, 0x8]\n" - "\tadds r2, r1, 0\n" - "\tcmp r2, 0xC\n" - "\tbgt _08099FC0\n" - "\tmovs r6, 0x14\n" - "\tmovs r3, 0\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, 0x80\n" - "\tmov r1, r9\n" - "\tadds r4, r1, r0\n" - "\tmovs r7, 0\n" - "\tb _0809A020\n" - "\t.align 2, 0\n" - "_08099FB8: .4byte gPokemonStorageSystemPtr\n" - "_08099FBC: .4byte 0x000008b4\n" - "_08099FC0:\n" - "\tcmp r2, 0x1F\n" - "\tbgt _08099FE6\n" - "\tmovs r0, 0x20\n" - "\tsubs r0, r2\n" - "\tlsls r0, 16\n" - "\tmovs r1, 0x14\n" - "\tlsrs r6, r0, 16\n" - "\tasrs r0, 16\n" - "\tsubs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r3, r1, 16\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, 0x80\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmovs r7, 0x88\n" - "\tlsls r7, 4\n" - "\tadd r7, r9\n" - "\tb _0809A020\n" - "_08099FE6:\n" - "\tcmp r2, 0x2C\n" - "\tbgt _08099FFE\n" - "\tmovs r6, 0x14\n" - "\tmovs r3, 0\n" - "\tlsls r0, r2, 1\n" - "\tmovs r1, 0x84\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmovs r7, 0\n" - "\tb _0809A020\n" - "_08099FFE:\n" - "\tmovs r0, 0x40\n" - "\tsubs r0, r2\n" - "\tlsls r0, 16\n" - "\tmovs r1, 0x14\n" - "\tlsrs r6, r0, 16\n" - "\tasrs r0, 16\n" - "\tsubs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r3, r1, 16\n" - "\tlsls r0, r2, 1\n" - "\tmovs r1, 0x84\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "\tmov r2, r9\n" - "\tadds r4, r2, r0\n" - "\tmov r7, r9\n" - "\tadds r7, 0x80\n" - "_0809A020:\n" - "\tmovs r1, 0\n" - "\tmov r0, r8\n" - "\tlsls r0, 24\n" - "\tstr r0, [sp, 0x14]\n" - "\tlsls r0, r6, 16\n" - "\tasrs r0, 16\n" - "\tmov r8, r0\n" - "\tlsls r3, 16\n" - "\tstr r3, [sp, 0xC]\n" - "\tasrs r2, r3, 16\n" - "\tstr r2, [sp, 0x10]\n" - "_0809A036:\n" - "\tmovs r3, 0\n" - "\tadds r0, r4, 0\n" - "\tadds r0, 0x40\n" - "\tstr r0, [sp, 0x18]\n" - "\tadds r2, r7, 0\n" - "\tadds r2, 0x40\n" - "\tstr r2, [sp, 0x1C]\n" - "\tadds r1, 0x1\n" - "\tmov r10, r1\n" - "\tcmp r3, r8\n" - "\tbge _0809A07A\n" - "\tldr r0, _0809A0D4 @ =0x00000fff\n" - "\tmov r12, r0\n" - "\tmovs r6, 0xF0\n" - "\tlsls r6, 8\n" - "_0809A054:\n" - "\tldrh r2, [r5]\n" - "\tmov r0, r12\n" - "\tands r0, r2\n" - "\tldr r1, [sp]\n" - "\tadds r0, r1, r0\n" - "\tadds r1, r6, 0\n" - "\tands r1, r2\n" - "\tldr r2, [sp, 0x4]\n" - "\tadds r1, r2, r1\n" - "\torrs r1, r0\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r4\n" - "\tstrh r1, [r0]\n" - "\tadds r5, 0x2\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, r8\n" - "\tblt _0809A054\n" - "_0809A07A:\n" - "\tmovs r3, 0\n" - "\tldr r0, [sp, 0x10]\n" - "\tcmp r3, r0\n" - "\tbge _0809A0B4\n" - "\tldr r1, _0809A0D4 @ =0x00000fff\n" - "\tmov r12, r1\n" - "\tmovs r6, 0xF0\n" - "\tlsls r6, 8\n" - "\tldr r2, [sp, 0xC]\n" - "\tasrs r4, r2, 16\n" - "_0809A08E:\n" - "\tldrh r2, [r5]\n" - "\tmov r0, r12\n" - "\tands r0, r2\n" - "\tldr r1, [sp]\n" - "\tadds r0, r1, r0\n" - "\tadds r1, r6, 0\n" - "\tands r1, r2\n" - "\tldr r2, [sp, 0x4]\n" - "\tadds r1, r2, r1\n" - "\torrs r1, r0\n" - "\tlsls r0, r3, 1\n" - "\tadds r0, r7\n" - "\tstrh r1, [r0]\n" - "\tadds r5, 0x2\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, r4\n" - "\tblt _0809A08E\n" - "_0809A0B4:\n" - "\tldr r4, [sp, 0x18]\n" - "\tldr r7, [sp, 0x1C]\n" - "\tmov r1, r10\n" - "\tlsls r0, r1, 16\n" - "\tlsrs r1, r0, 16\n" - "\tcmp r1, 0x11\n" - "\tbls _0809A036\n" - "\tldr r0, [sp, 0x14]\n" - "\tasrs r2, r0, 24\n" - "\tcmp r2, 0\n" - "\tbeq _0809A13A\n" - "\tcmp r2, 0\n" - "\tble _0809A0D8\n" - "\tldr r1, [sp, 0x8]\n" - "\tadds r1, 0x14\n" - "\tb _0809A0DC\n" - "\t.align 2, 0\n" - "_0809A0D4: .4byte 0x00000fff\n" - "_0809A0D8:\n" - "\tldr r1, [sp, 0x8]\n" - "\tsubs r1, 0x4\n" - "_0809A0DC:\n" - "\tmovs r0, 0x3F\n" - "\tands r1, r0\n" - "\tadds r4, r1, 0\n" - "\tadds r0, r4, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A0EE\n" - "\tlsls r0, 1\n" - "\tadds r0, 0x80\n" - "\tb _0809A0F6\n" - "_0809A0EE:\n" - "\tlsls r0, 1\n" - "\tmovs r2, 0x84\n" - "\tlsls r2, 4\n" - "\tadds r0, r2\n" - "_0809A0F6:\n" - "\tmov r1, r9\n" - "\tadds r2, r1, r0\n" - "\tmovs r3, 0\n" - "\tmovs r6, 0\n" - "_0809A0FE:\n" - "\tmovs r1, 0\n" - "\tadds r5, r3, 0x1\n" - "\tlsls r3, r4, 16\n" - "_0809A104:\n" - "\tstrh r6, [r2]\n" - "\tadds r2, 0x40\n" - "\tadds r0, r1, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r1, r0, 16\n" - "\tcmp r1, 0x11\n" - "\tbls _0809A104\n" - "\tasrs r0, r3, 16\n" - "\tadds r4, r0, 0x1\n" - "\tmovs r0, 0x3F\n" - "\tands r4, r0\n" - "\tadds r0, r4, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A126\n" - "\tlsls r0, 1\n" - "\tadds r0, 0x80\n" - "\tb _0809A12E\n" - "_0809A126:\n" - "\tlsls r0, 1\n" - "\tmovs r2, 0x84\n" - "\tlsls r2, 4\n" - "\tadds r0, r2\n" - "_0809A12E:\n" - "\tmov r1, r9\n" - "\tadds r2, r1, r0\n" - "\tlsls r0, r5, 16\n" - "\tlsrs r3, r0, 16\n" - "\tcmp r3, 0x3\n" - "\tbls _0809A0FE\n" - "_0809A13A:\n" - "\tadd sp, 0x20\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif - -#ifdef NONMATCHING -void sub_809A14C(u16 *vdest) -{ - u16 *r2; - u16 i; - int r3 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 30) & 0x3f; - r2 = vdest + (r3 < 0x20 ? r3 + 0x260 : r3 + 0x640); - for (i = 0; i < 0x2b; i++) - { - *r2++ = 0; - r3++; - r3 &= 0x3f; - if (r3 == 0) - r2 -= 0x420; - if (r3 == 0x20) - r2 += 0x3e0; - } -} -#else -__attribute__((naked)) void sub_809A14C(u16 *vdest) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tadds r2, r0, 0\n" - "\tldr r0, _0809A174 @ =gPokemonStorageSystemPtr\n" - "\tldr r0, [r0]\n" - "\tldr r1, _0809A178 @ =0x000008b4\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0]\n" - "\tlsrs r0, 3\n" - "\tadds r3, r0, 0\n" - "\tadds r3, 0x1E\n" - "\tmovs r0, 0x3F\n" - "\tands r3, r0\n" - "\tadds r0, r3, 0\n" - "\tcmp r0, 0x1F\n" - "\tbgt _0809A17C\n" - "\tlsls r0, 1\n" - "\tmovs r6, 0x98\n" - "\tlsls r6, 3\n" - "\tadds r0, r6\n" - "\tb _0809A184\n" - "\t.align 2, 0\n" - "_0809A174: .4byte gPokemonStorageSystemPtr\n" - "_0809A178: .4byte 0x000008b4\n" - "_0809A17C:\n" - "\tlsls r0, 1\n" - "\tmovs r1, 0xC8\n" - "\tlsls r1, 4\n" - "\tadds r0, r1\n" - "_0809A184:\n" - "\tadds r2, r0\n" - "\tmovs r0, 0\n" - "\tmovs r5, 0\n" - "\tmovs r4, 0x3F\n" - "_0809A18C:\n" - "\tstrh r5, [r2]\n" - "\tadds r2, 0x2\n" - "\tadds r3, 0x1\n" - "\tands r3, r4\n" - "\tadds r1, r3, 0\n" - "\tcmp r1, 0\n" - "\tbne _0809A19E\n" - "\tldr r6, _0809A1B8 @ =0xfffff7c0\n" - "\tadds r2, r6\n" - "_0809A19E:\n" - "\tcmp r1, 0x20\n" - "\tbne _0809A1A8\n" - "\tmovs r1, 0xF8\n" - "\tlsls r1, 3\n" - "\tadds r2, r1\n" - "_0809A1A8:\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x2B\n" - "\tbls _0809A18C\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0809A1B8: .4byte 0xfffff7c0"); -} -#endif - -void sub_809A1BC(const u8 *a0, const u8 *text) -{ - u8 *r5 = gUnknown_083B6DB8; - DmaClear16(3, r5, 0x200); - Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, r5, text); - DmaCopy16(3, r5 + 0x000, a0 + 0x000, 0x80); - DmaCopy16(3, r5 + 0x100, a0 + 0x080, 0x80); - DmaCopy16(3, r5 + 0x080, a0 + 0x100, 0x80); - DmaCopy16(3, r5 + 0x180, a0 + 0x180, 0x80); -} - -const struct SpriteTemplate gSpriteTemplate_83BB2B8; - -void sub_809A23C(u8 boxId) -{ - u8 tagIdx; - s16 r6; - u16 i; - - struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3}; - struct SpritePalette palettes[] = { - {gPokemonStorageSystemPtr->unk_0ccc, 0xdac8}, - {gPokemonStorageSystemPtr->unk_0ccc, 0xdac9}, - {} - }; - - u16 wallpaper = gPokemonStorage.wallpaper[boxId]; - gPokemonStorageSystemPtr->unk_0ccc[14] = gUnknown_083BB0A8[wallpaper][0]; - gPokemonStorageSystemPtr->unk_0ccc[15] = gUnknown_083BB0A8[wallpaper][1]; - LoadSpritePalettes(palettes); - gPokemonStorageSystemPtr->unk_0d08 = 0x3f0; - tagIdx = IndexOfSpritePaletteTag(0xdac8); - gPokemonStorageSystemPtr->unk_0cec = 0x10e + 16 * tagIdx; - gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx; - tagIdx = IndexOfSpritePaletteTag(0xdac9); - gPokemonStorageSystemPtr->unk_0cee = 0x10e + 16 * tagIdx; - gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx; - sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]); - LoadSpriteSheet(&spriteSheet); - r6 = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId])); - for (i = 0; i < 2; i++) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2B8, r6 + i * 32, 0x1c, 23); - gPokemonStorageSystemPtr->unk_0cf0[i] = gSprites + spriteId; - StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf0[i], i); - } - gPokemonStorageSystemPtr->unk_0cca = 0; -} - -void sub_809A3D0(u8 boxId, s8 a1) -{ - u16 r8; - s16 x; - s16 x2; - u16 i; - struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3}; - struct SpriteTemplate template = gSpriteTemplate_83BB2B8; - - gPokemonStorageSystemPtr->unk_0cca = gPokemonStorageSystemPtr->unk_0cca ? FALSE : TRUE; - if (gPokemonStorageSystemPtr->unk_0cca == 0) - { - spriteSheet.tag = 3; - r8 = gPokemonStorageSystemPtr->unk_0cec; - } - else - { - spriteSheet.tag = 4; - r8 = gPokemonStorageSystemPtr->unk_0cec; - template.tileTag = 4; - template.paletteTag = 0xdac9; - } - sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]); - LoadSpriteSheet(&spriteSheet); - LoadPalette(gUnknown_083BB0A8[gPokemonStorage.wallpaper[boxId]], r8, 0x04); - x = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId])); - x2 = x + a1 * 192; - for (i = 0; i < 2; i++) - { - u8 spriteId = CreateSprite(&template, i * 32 + x2, 0x1c, 23); - gPokemonStorageSystemPtr->unk_0cf8[i] = gSprites + spriteId; - gPokemonStorageSystemPtr->unk_0cf8[i]->data[0] = (-a1) * 6; - gPokemonStorageSystemPtr->unk_0cf8[i]->data[1] = i * 32 + x; - gPokemonStorageSystemPtr->unk_0cf8[i]->data[2] = 1; - gPokemonStorageSystemPtr->unk_0cf8[i]->callback = sub_809A5E8; - StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf8[i], i); - gPokemonStorageSystemPtr->unk_0cf0[i]->data[0] = (-a1) * 6; - gPokemonStorageSystemPtr->unk_0cf0[i]->data[1] = 1; - gPokemonStorageSystemPtr->unk_0cf0[i]->callback = sub_809A61C; - } -} - -void sub_809A598(void) -{ - if (gPokemonStorageSystemPtr->unk_0cca == 0) - FreeSpriteTilesByTag(4); - else - FreeSpriteTilesByTag(3); - gPokemonStorageSystemPtr->unk_0cf0[0] = gPokemonStorageSystemPtr->unk_0cf8[0]; - gPokemonStorageSystemPtr->unk_0cf0[1] = gPokemonStorageSystemPtr->unk_0cf8[1]; -} - -void sub_809A5E8(struct Sprite *sprite) -{ - if (sprite->data[2]) - sprite->data[2]--; - else if ((sprite->pos1.x += sprite->data[0]) == sprite->data[1]) - sprite->callback = SpriteCallbackDummy; -} - -void sub_809A61C(struct Sprite *sprite) -{ - if (sprite->data[1]) - sprite->data[1]--; - else - { - sprite->pos1.x += sprite->data[0]; - sprite->data[2] = sprite->pos1.x + sprite->pos2.x; - if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100) - DestroySprite(sprite); - } -} - -void sub_809A654(void) -{ - u8 boxId = get_preferred_box(); - u8 wallpaperId = gPokemonStorage.wallpaper[boxId]; - if (gPokemonStorageSystemPtr->unk_0cca == 0) - CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cec, 4); - else - CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cee, 4); -} - -s16 sub_809A6D0(u8 width) -{ - return 0xb0 - width / 2; -} - -void sub_809A6DC(void) -{ - u16 i; - - LoadSpriteSheet(&gUnknown_083BB288); - LoadSpritePalette(&gUnknown_083BB290); - for (i = 0; i < 2; i++) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, 0x5c + i * 0x88, 0x1c, 21); - if (spriteId != MAX_SPRITES) - { - struct Sprite *sprite = gSprites + spriteId; - StartSpriteAnim(sprite, i); - sprite->data[3] = (i == 0) ? -1 : 1; - gPokemonStorageSystemPtr->unk_0d00[i] = sprite; - } - } - if (sub_809BF2C()) - sub_809A860(TRUE); -} - -void sub_809A774(s8 a0) -{ - u16 i; - - for (i = 0; i < 2; i++) - { - gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0; - gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 2; - } - if (a0 < 0) - { - gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 29; - gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 5; - gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0x48; - gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0x48; - } - else - { - gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 5; - gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 29; - gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0xF8; - gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0xF8; - } - gPokemonStorageSystemPtr->unk_0d00[0]->data[7] = 0; - gPokemonStorageSystemPtr->unk_0d00[1]->data[7] = 1; -} - -void sub_809A810(void) -{ - u16 i; - - for (i = 0; i < 2; i++) - { - gPokemonStorageSystemPtr->unk_0d00[i]->pos1.x = 0x88 * i + 0x5c; - gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0; - gPokemonStorageSystemPtr->unk_0d00[i]->invisible = FALSE; - } - sub_809A860(TRUE); -} - -void sub_809A860(bool8 a0) -{ - u16 i; - if (a0) - { - for (i = 0; i < 2; i++) - { - gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 1; - gPokemonStorageSystemPtr->unk_0d00[i]->data[1] = 0; - gPokemonStorageSystemPtr->unk_0d00[i]->data[2] = 0; - gPokemonStorageSystemPtr->unk_0d00[i]->data[4] = 0; - } - } - else - { - for (i = 0; i < 2; i++) - { - gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 0; - } - } -} - -void sub_809A8C8(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->pos2.x = 0; - break; - case 1: - if (++sprite->data[1] > 3) - { - sprite->data[1] = 0; - sprite->pos2.x += sprite->data[3]; - if (++sprite->data[2] > 5) - { - sprite->data[2] = 0; - sprite->pos2.x = 0; - } - } - break; - case 2: - sprite->data[0] = 3; - break; - case 3: - sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6; - if (sprite->pos1.x < 0x49 || sprite->pos1.x > 0xf7) - sprite->invisible = TRUE; - if (--sprite->data[1] == 0) - { - sprite->pos1.x = sprite->data[2]; - sprite->invisible = FALSE; - sprite->data[0] = 4; - } - break; - case 4: - sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6; - break; - } -} - -struct Sprite *sub_809A9A0(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority) -{ - u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, x, y, subpriority); - if (spriteId == MAX_SPRITES) - return NULL; - animId %= 2; - StartSpriteAnim(gSprites + spriteId, animId); - gSprites[spriteId].oam.priority = priority; - gSprites[spriteId].callback = SpriteCallbackDummy; - return gSprites + spriteId; -} - -void sub_809AA24(void) -{ - if (gPokemonStorageSystemPtr->unk_0005 != 1) - gUnknown_020384E4 = 0; - else - gUnknown_020384E4 = 1; - gUnknown_020384E5 = 0; - gUnknown_020384E6 = FALSE; - gUnknown_020384E7 = 0; - gUnknown_020384E8 = 0; - gUnknown_020384E9 = 0; - sub_809B0D4(); - sub_809CC04(); - gPokemonStorageSystemPtr->unk_11e2 = 1; - sub_809BF74(); -} - -void sub_809AA98(void) -{ - sub_809CC04(); - sub_809C028(); - gPokemonStorageSystemPtr->unk_11e2 = 1; - if (gUnknown_020384E6) - sub_8098BF0(); -} - -void sub_809AACC(u8 a0, u8 a1, u16 *a2, u16 *a3) -{ - switch (a0) - { - case 0: - *a2 = (a1 % 6) * 24 + 100; - *a3 = (a1 / 6) * 24 + 32; - break; - case 1: - if (a1 == 0) - { - *a2 = 0x68; - *a3 = 0x34; - } - else if (a1 == 6) - { - *a2 = 0x98; - *a3 = 0x84; - } - else - { - *a2 = 0x98; - *a3 = (a1 - 1) * 24 + 4; - } - break; - case 2: - *a2 = 0xa2; - *a3 = 0x0c; - break; - case 3: - *a3 = gUnknown_020384E6 ? 8 : 14; - *a2 = a1 * 0x58 + 0x78; - break; - case 4: - *a2 = 0xa0; - *a3 = 0x60; - break; - } -} - -u16 sub_809AB8C(void) -{ - switch (gUnknown_020384E4) - { - case 1: - return GetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_SPECIES); - case 0: - return GetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_SPECIES); - default: - return SPECIES_NONE; - } -} - -bool8 sub_809AC00(void) -{ - s16 tmp; - if (gPokemonStorageSystemPtr->unk_11dc == 0) - return FALSE; - if (--gPokemonStorageSystemPtr->unk_11dc) - { - gPokemonStorageSystemPtr->unk_11c8 += gPokemonStorageSystemPtr->unk_11d0; - gPokemonStorageSystemPtr->unk_11cc += gPokemonStorageSystemPtr->unk_11d4; - gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11c8 >> 8; - gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11cc >> 8; - if (gPokemonStorageSystemPtr->unk_11c0->pos1.x > 0x100) - { - tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.x - 0x100; - gPokemonStorageSystemPtr->unk_11c0->pos1.x = tmp + 0x40; - } - if (gPokemonStorageSystemPtr->unk_11c0->pos1.x < 0x40) - { - tmp = 0x40 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; - gPokemonStorageSystemPtr->unk_11c0->pos1.x = 0x100 - tmp; - } - if (gPokemonStorageSystemPtr->unk_11c0->pos1.y > 0xb0) - { - tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.y - 0xb0; - gPokemonStorageSystemPtr->unk_11c0->pos1.y = tmp - 0x10; - } - if (gPokemonStorageSystemPtr->unk_11c0->pos1.y < -0x10) - { - tmp = -0x10 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; - gPokemonStorageSystemPtr->unk_11c0->pos1.y = 0xb0 - tmp; - } - if (gPokemonStorageSystemPtr->unk_11e3 && --gPokemonStorageSystemPtr->unk_11e3 == 0) - gPokemonStorageSystemPtr->unk_11c0->vFlip = gPokemonStorageSystemPtr->unk_11c0->vFlip ? FALSE : TRUE; - } - else - { - gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11d8; - gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11da; - sub_809AFB8(); - } - return TRUE; -} - -void sub_809AD3C(u8 a0, u8 a1) -{ - u16 x; - u16 y; - - sub_809AACC(a0, a1, &x, &y); - gPokemonStorageSystemPtr->unk_11e0 = a0; - gPokemonStorageSystemPtr->unk_11e1 = a1; - gPokemonStorageSystemPtr->unk_11d8 = x; - gPokemonStorageSystemPtr->unk_11da = y; -} - -void sub_809AD94(void) -{ - int r7; - int r0; - - if (gPokemonStorageSystemPtr->unk_11de || gPokemonStorageSystemPtr->unk_11df) - gPokemonStorageSystemPtr->unk_11dc = 12; - else - gPokemonStorageSystemPtr->unk_11dc = 6; - if (gPokemonStorageSystemPtr->unk_11e3) - gPokemonStorageSystemPtr->unk_11e3 = gPokemonStorageSystemPtr->unk_11dc >> 1; - switch (gPokemonStorageSystemPtr->unk_11de) - { - default: - r7 = gPokemonStorageSystemPtr->unk_11da - gPokemonStorageSystemPtr->unk_11c0->pos1.y; - break; - case -1: - r7 = gPokemonStorageSystemPtr->unk_11da - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; - break; - case 1: - r7 = gPokemonStorageSystemPtr->unk_11da + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; - break; - } - switch (gPokemonStorageSystemPtr->unk_11df) - { - default: - r0 = gPokemonStorageSystemPtr->unk_11d8 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; - break; - case -1: - r0 = gPokemonStorageSystemPtr->unk_11d8 - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; - break; - case 1: - r0 = gPokemonStorageSystemPtr->unk_11d8 + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; - break; - } - r7 <<= 8; - r0 <<= 8; - gPokemonStorageSystemPtr->unk_11d0 = r0 / gPokemonStorageSystemPtr->unk_11dc; - gPokemonStorageSystemPtr->unk_11d4 = r7 / gPokemonStorageSystemPtr->unk_11dc; - gPokemonStorageSystemPtr->unk_11c8 = gPokemonStorageSystemPtr->unk_11c0->pos1.x << 8; - gPokemonStorageSystemPtr->unk_11cc = gPokemonStorageSystemPtr->unk_11c0->pos1.y << 8; -} - -void sub_809AF18(u8 a0, u8 a1) -{ - sub_809AD3C(a0, a1); - sub_809AD94(); - if (!gUnknown_020384E6) - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); - if (a0 == 1 && gUnknown_020384E4 != 1) - { - gPokemonStorageSystemPtr->unk_11e2 = a0; - gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE; - } - switch (a0) - { - case 0: - break; - case 1 ... 3: - gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE; - gPokemonStorageSystemPtr->unk_11c4->oam.priority = 1; - break; - } -} - -void sub_809AFB8(void) -{ - gUnknown_020384E4 = gPokemonStorageSystemPtr->unk_11e0; - gUnknown_020384E5 = gPokemonStorageSystemPtr->unk_11e1; - if (!gUnknown_020384E6) - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); - sub_809BF74(); - switch (gUnknown_020384E4) - { - case 2: - sub_809A860(TRUE); - break; - case 1: - gPokemonStorageSystemPtr->unk_11c4->subpriority = 12; - break; - case 0: - gPokemonStorageSystemPtr->unk_11c4->oam.priority = 2; - gPokemonStorageSystemPtr->unk_11c4->subpriority = 20; - gPokemonStorageSystemPtr->unk_11c4->invisible = FALSE; - break; - } -} - -void sub_809B068(void) -{ - u8 partyCount; - if (!gUnknown_020384E6) - partyCount = 0; - else - { - partyCount = CalculatePlayerPartyCount(); - if (partyCount > PARTY_SIZE - 1) - partyCount = PARTY_SIZE - 1; - } - if (gPokemonStorageSystemPtr->unk_11c0->vFlip) - gPokemonStorageSystemPtr->unk_11e3 = 1; - sub_809AF18(1, partyCount); -} - -void sub_809B0C0(u8 a0) -{ - sub_809AF18(0, a0); -} - -void sub_809B0D4(void) -{ - gUnknown_020384EA = 0; -} - -void sub_809B0E0(void) -{ - gUnknown_020384EA = gUnknown_020384E5; -} - -u8 sub_809B0F4(void) -{ - return gUnknown_020384EA; -} - -void sub_809B100(u8 a0) -{ - gPokemonStorageSystemPtr->unk_12a4 = gUnknown_083BBBC8[a0]; - gPokemonStorageSystemPtr->unk_12a8 = 0; -} - -bool8 sub_809B130(void) -{ - return gPokemonStorageSystemPtr->unk_12a4(); -} - -bool8 sub_809B150(void) -{ - switch (gPokemonStorageSystemPtr->unk_12a8) - { - case 0: - if (gUnknown_020384E6) - return FALSE; - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); - gPokemonStorageSystemPtr->unk_12a8++; - break; - case 1: - if (!sub_809B324()) - { - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); - sub_809B384(); - gPokemonStorageSystemPtr->unk_12a8++; - } - break; - case 2: - if (!sub_809B358()) - gPokemonStorageSystemPtr->unk_12a8++; - break; - case 3: - return FALSE; - } - return TRUE; -} - -bool8 sub_809B1D8(void) -{ - switch (gPokemonStorageSystemPtr->unk_12a8) - { - case 0: - if (!sub_809B324()) - { - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); - sub_809B3E0(); - gPokemonStorageSystemPtr->unk_12a8++; - } - break; - case 1: - if (!sub_809B358()) - { - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); - gPokemonStorageSystemPtr->unk_12a8++; - } - break; - case 2: - return FALSE; - } - return TRUE; -} - -bool8 sub_809B24C(void) -{ - switch (gPokemonStorageSystemPtr->unk_12a8) - { - case 0: - switch (gUnknown_020384E4) - { - case 1: - gPokemonStorageSystemPtr->unk_12a9 = 14; - break; - case 0: - gPokemonStorageSystemPtr->unk_12a9 = get_preferred_box(); - break; - default: - return FALSE; - } - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); - sub_80996B0(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5); - gPokemonStorageSystemPtr->unk_12a8++; - break; - case 1: - if (!sub_809971C()) - { - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); - diegohint1(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5); - gPokemonStorageSystemPtr->unk_12a8++; - } - break; - case 2: - return FALSE; - } - return TRUE; -} - -bool8 sub_809B324(void) -{ - switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y) - { - default: - gPokemonStorageSystemPtr->unk_11c0->pos2.y++; - break; - case 0: - gPokemonStorageSystemPtr->unk_11c0->pos2.y++; - break; - case 8: - return FALSE; - } - return TRUE; -} - -bool8 sub_809B358(void) -{ - switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y) - { - case 0: - return FALSE; - default: - gPokemonStorageSystemPtr->unk_11c0->pos2.y--; - break; - } - return TRUE; -} - -void sub_809B384(void) -{ - switch (gUnknown_020384E4) - { - case 1: - sub_809B44C(14, gUnknown_020384E5); - sub_8099584(0, gUnknown_020384E5); - break; - case 0: - sub_809B44C(get_preferred_box(), gUnknown_020384E5); - sub_8099584(1, gUnknown_020384E5); - break; - default: - return; - } - gUnknown_020384E6 = TRUE; -} - -void sub_809B3E0(void) -{ - u8 boxId; - switch (gUnknown_020384E4) - { - case 1: - diegohint2(14, gUnknown_020384E5); - sub_809960C(14, gUnknown_020384E5); - break; - case 0: - boxId = get_preferred_box(); - diegohint2(boxId, gUnknown_020384E5); - sub_809960C(boxId, gUnknown_020384E5); - break; - default: - return; - } - gUnknown_020384E6 = FALSE; -} - -void sub_809B440(void) -{ - sub_809BF74(); -} - -void sub_809B44C(u8 a0, u8 a1) -{ - if (a0 == 14) - gPokemonStorageSystemPtr->unk_25b4 = gPlayerParty[gUnknown_020384E5]; - else - ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_25b4); - sub_809B548(a0, a1); - gUnknown_020384E7 = a0; - gUnknown_020384E8 = a1; -} - -void diegohint2(u8 a0, u8 a1) -{ - if (a0 == 14) - { - gPlayerParty[a1] = gPokemonStorageSystemPtr->unk_25b4; - } - else - { - BoxMonRestorePP(&gPokemonStorageSystemPtr->unk_25b4.box); - gPokemonStorage.boxes[a0][a1] = gPokemonStorageSystemPtr->unk_25b4.box; - } -} - -void sub_809B548(u8 a0, u8 a1) -{ - if (a0 == 14) - ZeroMonData(gPlayerParty + a1); - else - ZeroBoxMonData(gPokemonStorage.boxes[a0] + a1); -} - -void diegohint1(u8 a0, u8 a1) -{ - if (a0 == 14) - gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[a1]; - else - ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_2618); - diegohint2(a0, a1); - gPokemonStorageSystemPtr->unk_25b4 = gPokemonStorageSystemPtr->unk_2618; - sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4, 0); - gUnknown_020384E7 = a0; - gUnknown_020384E8 = a1; -} - -bool8 sub_809B62C(u8 boxId) -{ - s16 monIdx = GetIndexOfFirstEmptySpaceInBoxN(boxId); - if (monIdx == -1) - return FALSE; - if (gUnknown_020384E6) - { - diegohint2(boxId, monIdx); - sub_8099480(); - gUnknown_020384E6 = FALSE; - } - else - { - sub_809B44C(14, gUnknown_020384E5); - diegohint2(boxId, monIdx); - sub_8099520(gUnknown_020384E5); - } - if (boxId == get_preferred_box()) - sub_8098D20(monIdx); - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); - return TRUE; -} - -void sub_809B6BC(void) -{ - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); - sub_809BF74(); -} - -void sub_809B6DC(void) -{ - u8 mode; - - if (gUnknown_020384E6) - mode = 2; - else if (gUnknown_020384E4 == 1) - mode = 0; - else - mode = 1; - sub_809981C(mode, gUnknown_020384E5); - StringCopy(gPokemonStorageSystemPtr->unk_26e4, gPokemonStorageSystemPtr->unk_11fa); -} - -bool8 sub_809B734(void) -{ - if (!sub_80998D8()) - { - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); - return FALSE; - } - return TRUE; -} - -void sub_809B760(void) -{ - sub_8099920(); - if (gUnknown_020384E6) - gUnknown_020384E6 = FALSE; - else - { - u8 boxId; - if (gUnknown_020384E4 == 1) - boxId = 14; - else - boxId = get_preferred_box(); - sub_809B548(boxId, gUnknown_020384E5); - } - sub_809BF74(); -} - -void sub_809B7AC(void) -{ - if (gUnknown_020384E6) - StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); -} - -void sub_809B7D4(void) -{ - u16 knownMoves; - if (gUnknown_020384E6) - { - gPokemonStorageSystemPtr->unk_2618 = gPokemonStorageSystemPtr->unk_25b4; - gPokemonStorageSystemPtr->unk_2682 = -1; - gPokemonStorageSystemPtr->unk_2683 = -1; - } - else - { - if (gUnknown_020384E4 == 1) - { - gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[gUnknown_020384E5]; - gPokemonStorageSystemPtr->unk_2682 = 14; - } - else - { - ExpandBoxMon(gPokemonStorage.boxes[gPokemonStorage.currentBox] + gUnknown_020384E5, &gPokemonStorageSystemPtr->unk_2618); - gPokemonStorageSystemPtr->unk_2682 = gPokemonStorage.currentBox; - } - gPokemonStorageSystemPtr->unk_2683 = gUnknown_020384E5; - } - gPokemonStorageSystemPtr->unk_267e = 0; - gPokemonStorageSystemPtr->unk_267f = 0; - gPokemonStorageSystemPtr->unk_2686[0] = MOVE_SURF; - gPokemonStorageSystemPtr->unk_2686[1] = MOVE_DIVE; - gPokemonStorageSystemPtr->unk_2686[2] = NUM_MOVES; - knownMoves = GetMonData(&gPokemonStorageSystemPtr->unk_2618, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); - gPokemonStorageSystemPtr->unk_267e = knownMoves & 1; - gPokemonStorageSystemPtr->unk_267f = (knownMoves >> 1) & 1; - if (gPokemonStorageSystemPtr->unk_267e || gPokemonStorageSystemPtr->unk_267f) - gPokemonStorageSystemPtr->unk_267d = 0; - else - { - gPokemonStorageSystemPtr->unk_267d = 1; - gPokemonStorageSystemPtr->unk_267c = 1; - } - gPokemonStorageSystemPtr->unk_2684 = 0; -} - -s8 sub_809B960(void) -{ - u16 i; - u16 knownMoves; - - if (gPokemonStorageSystemPtr->unk_267d) - return gPokemonStorageSystemPtr->unk_267c; - switch (gPokemonStorageSystemPtr->unk_2684) - { - case 0: - for (i = 0; i < PARTY_SIZE; i++) - { - if (gPokemonStorageSystemPtr->unk_2682 != 14 || gPokemonStorageSystemPtr->unk_2683 != i) - { - knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); - if (knownMoves & 1) - gPokemonStorageSystemPtr->unk_267e = 0; - if (knownMoves & 2) - gPokemonStorageSystemPtr->unk_267f = 0; - } - } - if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0) - { - gPokemonStorageSystemPtr->unk_267d = 1; - gPokemonStorageSystemPtr->unk_267c = 1; - } - else - { - gPokemonStorageSystemPtr->unk_2680 = 0; - gPokemonStorageSystemPtr->unk_2681 = 0; - gPokemonStorageSystemPtr->unk_2684++; - } - break; - case 1: - for (i = 0; i < 5; i++) - { - knownMoves = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_2680] + gPokemonStorageSystemPtr->unk_2681, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); - if (knownMoves && (gPokemonStorageSystemPtr->unk_2682 != gPokemonStorageSystemPtr->unk_2680 || gPokemonStorageSystemPtr->unk_2683 != gPokemonStorageSystemPtr->unk_2681)) - { - if (knownMoves & 1) - gPokemonStorageSystemPtr->unk_267e = 0; - if (knownMoves & 2) - gPokemonStorageSystemPtr->unk_267f = 0; - } - if (++gPokemonStorageSystemPtr->unk_2681 >= 30) - { - gPokemonStorageSystemPtr->unk_2681 = 0; - if (++gPokemonStorageSystemPtr->unk_2680 >= 14) - { - gPokemonStorageSystemPtr->unk_267d = 1; - gPokemonStorageSystemPtr->unk_267c = 0; - break; - } - } - } - if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0) - { - gPokemonStorageSystemPtr->unk_267d = 1; - gPokemonStorageSystemPtr->unk_267c = 1; - } - break; - } - return -1; -} - -void sub_809BB90(void) -{ - if (gUnknown_020384E6) - gUnknown_02038480 = gPokemonStorageSystemPtr->unk_25b4; -} - -void sub_809BBC0(void) -{ - if (gUnknown_020384E6) - { - if (gUnknown_020384E7 == 14) - gPokemonStorageSystemPtr->unk_25b4 = gUnknown_02038480; - else - gPokemonStorageSystemPtr->unk_25b4.box = gUnknown_02038480.box; - } -} - -void sub_809BC18(void) -{ - if (gUnknown_020384E6) - { - sub_809BB90(); - gPokemonStorageSystemPtr->unk_2690.pokemon = &gUnknown_02038480; - gPokemonStorageSystemPtr->unk_268d = 0; - gPokemonStorageSystemPtr->unk_268c = 0; - gPokemonStorageSystemPtr->unk_268e = 0; - } - else if (gUnknown_020384E4 == 1) - { - gPokemonStorageSystemPtr->unk_2690.pokemon = gPlayerParty; - gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5; - gPokemonStorageSystemPtr->unk_268c = StorageSystemGetPartySize() - 1; - gPokemonStorageSystemPtr->unk_268e = 0; - } - else - { - gPokemonStorageSystemPtr->unk_2690.box = gPokemonStorage.boxes[gPokemonStorage.currentBox]; - gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5; - gPokemonStorageSystemPtr->unk_268c = 30 - 1; - gPokemonStorageSystemPtr->unk_268e = 5; - } -} - -void sub_809BD14(void) -{ - if (gUnknown_020384E6) - sub_809BBC0(); - else - gUnknown_020384E5 = pssData.monIndex; -} - -s16 party_compaction(void) -{ - s16 retVal = -1; - u16 i; - u16 last; - - for (i = 0, last = 0; i < PARTY_SIZE; i++) - { - if ((u16)GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != SPECIES_NONE) - { - if (i != last) - gPlayerParty[last] = gPlayerParty[i]; - last++; - } - else if (retVal == -1) - retVal = i; - } - for (; last < PARTY_SIZE; last++) - ZeroMonData(gPlayerParty + last); - return retVal; -} - -void sub_809BDD8(u8 markings) -{ - gPokemonStorageSystemPtr->unk_11f7 = markings; - if (gUnknown_020384E6) - SetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_MARKINGS, &markings); - else - { - if (gUnknown_020384E4 == 1) - SetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_MARKINGS, &markings); - if (gUnknown_020384E4 == 0) - SetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_MARKINGS, &markings); - } -} - -bool8 sub_809BE80(void) -{ - if (gUnknown_020384E4 == 1 && !gUnknown_020384E6 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0) - return TRUE; - return FALSE; -} - -bool8 sub_809BEBC(void) -{ - if (gUnknown_020384E6) - { - if (gUnknown_020384E4 == 1 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0) - { - if (gPokemonStorageSystemPtr->unk_11f9 || GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_HP) == 0) - return FALSE; - } - return TRUE; - } - return FALSE; -} - -bool8 sub_809BF20(void) -{ - return gUnknown_020384E6; -} - -bool8 sub_809BF2C(void) -{ - return gUnknown_020384E4 == 2 ? TRUE : FALSE; -} - -bool8 sub_809BF48(void) -{ - return (gUnknown_020384E4 == 3 && gUnknown_020384E5 == 1) ? TRUE : FALSE; -} - -void sub_809BF74(void) -{ - gPokemonStorageSystemPtr->unk_11f6 = gUnknown_020384E6 ? 0 : 1; - if (!gUnknown_020384E6) - { - switch (gUnknown_020384E4) - { - case 1: - if (gUnknown_020384E5 < PARTY_SIZE) - { - sub_809C04C(gPlayerParty + gUnknown_020384E5, 0); - break; - } - // fallthrough - case 2: - case 3: - sub_809C04C(NULL, 2); - break; - case 0: - sub_809C04C(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, 1); - break; - } - } -} - -void sub_809C028(void) -{ - if (gUnknown_020384E6) - sub_809C04C(&gUnknown_02038480.box, 0); - else - sub_809BF74(); -} - -void sub_809C04C(void *pokemon, u8 a1) -{ - u8 *buf; - u16 gender = MON_MALE; - gPokemonStorageSystemPtr->unk_11f2 = 0; - if (a1 == 0) - { - struct Pokemon *pkmn = (struct Pokemon *)pokemon; - gPokemonStorageSystemPtr->unk_11f0 = GetMonData(pokemon, MON_DATA_SPECIES2); - if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE) - { - gPokemonStorageSystemPtr->unk_11f9 = GetMonData(pkmn, MON_DATA_IS_EGG); - GetMonData(pkmn, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa); - StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa); - gPokemonStorageSystemPtr->unk_11f8 = GetMonData(pkmn, MON_DATA_LEVEL); - gPokemonStorageSystemPtr->unk_11f7 = GetMonData(pkmn, MON_DATA_MARKINGS); - gPokemonStorageSystemPtr->unk_11ec = GetMonData(pkmn, MON_DATA_PERSONALITY); - gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePal(pkmn); - gender = GetMonGender(pkmn); - gPokemonStorageSystemPtr->unk_11f2 = GetMonData(pkmn, MON_DATA_HELD_ITEM); - } - } - else if (a1 == 1) - { - struct BoxPokemon *boxmon = (struct BoxPokemon *)pokemon; - gPokemonStorageSystemPtr->unk_11f0 = GetBoxMonData(pokemon, MON_DATA_SPECIES2); - if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE) - { - u32 otId = GetBoxMonData(boxmon, MON_DATA_OT_ID); - gPokemonStorageSystemPtr->unk_11f9 = GetBoxMonData(boxmon, MON_DATA_IS_EGG); - GetBoxMonData(boxmon, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa); - StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa); - gPokemonStorageSystemPtr->unk_11f8 = GetLevelFromBoxMonExp(boxmon); - gPokemonStorageSystemPtr->unk_11f7 = GetBoxMonData(boxmon, MON_DATA_MARKINGS); - gPokemonStorageSystemPtr->unk_11ec = GetBoxMonData(boxmon, MON_DATA_PERSONALITY); - gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePalFromOtIdPersonality(gPokemonStorageSystemPtr->unk_11f0, otId, gPokemonStorageSystemPtr->unk_11ec); - gender = GetGenderFromSpeciesAndPersonality(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec); - gPokemonStorageSystemPtr->unk_11f2 = GetBoxMonData(boxmon, MON_DATA_HELD_ITEM); - } - } - else - { - gPokemonStorageSystemPtr->unk_11f0 = SPECIES_NONE; - } - if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NONE) - { - gPokemonStorageSystemPtr->unk_11fa[0] = EOS; - gPokemonStorageSystemPtr->unk_120f[0] = EOS; - gPokemonStorageSystemPtr->unk_1234[0] = EOS; - gPokemonStorageSystemPtr->unk_1259[0] = EOS; - gPokemonStorageSystemPtr->unk_127a[0] = EOS; - } - else if (gPokemonStorageSystemPtr->unk_11f9) - { - buf = gPokemonStorageSystemPtr->unk_120f; - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW - buf[2] = 0x0F; // WHITE2 - buf[3] = 0x00; // TRANSPARENT - buf[4] = 0x01; // DARK_GREY - buf = gPokemonStorageSystemPtr->unk_120f + 5; - buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa); - gPokemonStorageSystemPtr->unk_1234[0] = EOS; - gPokemonStorageSystemPtr->unk_1259[0] = EOS; - gPokemonStorageSystemPtr->unk_127a[0] = EOS; - } - else - { - if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_M || gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_F) - gender = MON_GENDERLESS; - buf = gPokemonStorageSystemPtr->unk_120f; - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW - buf[2] = 0x0F; // WHITE2 - buf[3] = 0x00; // TRANSPARENT - buf[4] = 0x01; // DARK_GREY - buf = gPokemonStorageSystemPtr->unk_120f + 5; - buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa); - buf = gPokemonStorageSystemPtr->unk_1234; - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW - buf[2] = 0x0F; // WHITE2 - buf[3] = 0x00; // TRANSPARENT - buf[4] = 0x01; // DARK_GREY - buf[5] = EXT_CTRL_CODE_BEGIN; - buf[6] = 0x13; // CLEAR_TO - buf[7] = 7; - buf[8] = CHAR_SLASH; - buf = gPokemonStorageSystemPtr->unk_1234 + 9; - buf = StringCopy(buf, gSpeciesNames[gPokemonStorageSystemPtr->unk_11f0]); - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x13; // CLEAR_TO - buf[2] = 0x50; - buf[3] = EOS; - buf = gPokemonStorageSystemPtr->unk_1259; - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW - buf[2] = 0x0F; // WHITE2 - buf[3] = 0x00; // TRANSPARENT - buf[4] = 0x01; // DARK_GREY - buf[5] = EXT_CTRL_CODE_BEGIN; - buf[6] = 0x13; // CLEAR_TO - buf[7] = 8; - buf = gPokemonStorageSystemPtr->unk_1259 + 8; - buf[0] = 0x34; // LV - buf = gPokemonStorageSystemPtr->unk_1259 + 9; - buf = sub_8072C14(buf, gPokemonStorageSystemPtr->unk_11f8, 0x22, STR_CONV_MODE_RIGHT_ALIGN); - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x11; // CLEAR - buf[2] = 8; - buf += 3; - switch (gender) - { - case MON_MALE: - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW - buf[2] = 0x04; // BLUE - buf[3] = 0x00; // TRANSPARENT - buf[4] = 0x05; // YELLOW - buf[5] = CHAR_MALE; - buf += 6; - break; - case MON_FEMALE: - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW - buf[2] = 0x06; // CYAN - buf[3] = 0x00; // TRANSPARENT - buf[4] = 0x07; // MAGENTA - buf[5] = CHAR_FEMALE; - buf += 6; - break; - } - buf[0] = EOS; - buf = gPokemonStorageSystemPtr->unk_127a; - if (gPokemonStorageSystemPtr->unk_11f2) - { - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW - buf[2] = 0x0F; // WHITE2 - buf[3] = 0x00; // TRANSPARENT - buf[4] = 0x01; // DARK_GREY - buf = gPokemonStorageSystemPtr->unk_127a + 5; - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x06; // size - buf[2] = 0x04; - buf = gPokemonStorageSystemPtr->unk_127a + 8; - buf = StringCopy(buf, ItemId_GetName(gPokemonStorageSystemPtr->unk_11f2)); - buf[0] = EXT_CTRL_CODE_BEGIN; - buf[1] = 0x07; // UNKNOWN_7; - buf += 2; - } - buf[0] = EOS; - } -} - -#ifdef NONMATCHING -u8 sub_809C464(void) -{ - u8 r9; - s8 r8 = gUnknown_020384E4; - s8 r4 = gUnknown_020384E5; - gPokemonStorageSystemPtr->unk_11de = 0; - gPokemonStorageSystemPtr->unk_11df = 0; - gPokemonStorageSystemPtr->unk_11e3 = 0; - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - r9 = 1; - if (gUnknown_020384E5 >= 6) - { - r4 -= 6; - } - else - { - r8 = 2; - r4 = 0; - } - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - r9 = 1; - r4 += 6; - if (r4 >= 30) - { - r8 = 3; - r4 -= 30; - r4 /= 3; - gPokemonStorageSystemPtr->unk_11de = 1; - gPokemonStorageSystemPtr->unk_11e3 = 1; - } - } - else if (gMain.newAndRepeatedKeys & DPAD_LEFT) - { - r9 = 1; - if (gUnknown_020384E5 % 6) - r4--; - else - { - gPokemonStorageSystemPtr->unk_11df = -1; - r4 += 5; - } - } - else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) - { - r9 = 1; - if ((gUnknown_020384E5 + 1) % 6) - r4++; - else - { - gPokemonStorageSystemPtr->unk_11df = 1; - r4 -= 5; - } - } - else if (gMain.newKeys & START_BUTTON) - { - r9 = 1; - r8 = 2; - r4 = 0; - } - else - { - if ((gMain.newKeys & A_BUTTON) && sub_809CAB0()) - { - if (gUnknown_020384E9 == 0) - return 8; - switch (sub_809CE4C(0)) - { - case 1: - return 11; - case 2: - return 12; - case 3: - return 13; - case 4: - return 14; - case 5: - return 15; - } - } - if (gMain.newKeys & B_BUTTON) - return 16; - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) - { - if (gMain.heldKeys & L_BUTTON) - return 10; - if (gMain.heldKeys & R_BUTTON) - return 9; - } - if (gMain.newKeys & SELECT_BUTTON) - { - sub_809CD88(); - return 0; - } - r9 = 0; - } - if (r9) - sub_809AF18(r8, r4); - return r9; -} -#else -__attribute__((naked)) u8 sub_809C464(void) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tldr r0, _0809C4D8 @ =gUnknown_020384E4\n" - "\tldrb r0, [r0]\n" - "\tmov r8, r0\n" - "\tldr r2, _0809C4DC @ =gUnknown_020384E5\n" - "\tldrb r4, [r2]\n" - "\tldr r0, _0809C4E0 @ =gPokemonStorageSystemPtr\n" - "\tldr r1, [r0]\n" - "\tldr r0, _0809C4E4 @ =0x000011de\n" - "\tadds r7, r1, r0\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r7]\n" - "\tldr r3, _0809C4E8 @ =0x000011df\n" - "\tadds r5, r1, r3\n" - "\tstrb r0, [r5]\n" - "\tadds r3, 0x4\n" - "\tadds r6, r1, r3\n" - "\tstrb r0, [r6]\n" - "\tldr r0, _0809C4EC @ =gMain\n" - "\tmov r12, r0\n" - "\tldrh r1, [r0, 0x30]\n" - "\tmovs r0, 0x40\n" - "\tands r0, r1\n" - "\tadds r3, r2, 0\n" - "\tcmp r0, 0\n" - "\tbeq _0809C4A0\n" - "\tb _0809C62A\n" - "_0809C4A0:\n" - "\tmovs r0, 0x80\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C4F0\n" - "\tmovs r1, 0x1\n" - "\tmov r9, r1\n" - "\tlsls r0, r4, 24\n" - "\tmovs r3, 0xC0\n" - "\tlsls r3, 19\n" - "\tadds r0, r3\n" - "\tlsrs r4, r0, 24\n" - "\tasrs r0, 24\n" - "\tcmp r0, 0x1D\n" - "\tbgt _0809C4BE\n" - "\tb _0809C648\n" - "_0809C4BE:\n" - "\tmovs r1, 0x3\n" - "\tmov r8, r1\n" - "\tsubs r0, 0x1E\n" - "\tlsls r0, 24\n" - "\tasrs r0, 24\n" - "\tbl __divsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tmov r3, r9\n" - "\tstrb r3, [r7]\n" - "\tstrb r3, [r6]\n" - "\tb _0809C648\n" - "\t.align 2, 0\n" - "_0809C4D8: .4byte gUnknown_020384E4\n" - "_0809C4DC: .4byte gUnknown_020384E5\n" - "_0809C4E0: .4byte gPokemonStorageSystemPtr\n" - "_0809C4E4: .4byte 0x000011de\n" - "_0809C4E8: .4byte 0x000011df\n" - "_0809C4EC: .4byte gMain\n" - "_0809C4F0:\n" - "\tmovs r0, 0x20\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C524\n" - "\tmovs r0, 0x1\n" - "\tmov r9, r0\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r3, r0]\n" - "\tmovs r1, 0x6\n" - "\tbl __modsi3\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0809C514\n" - "\tlsls r0, r4, 24\n" - "\tmovs r1, 0xFF\n" - "\tlsls r1, 24\n" - "\tb _0809C63C\n" - "_0809C514:\n" - "\tmovs r0, 0xFF\n" - "\tstrb r0, [r5]\n" - "\tlsls r0, r4, 24\n" - "\tmovs r3, 0xA0\n" - "\tlsls r3, 19\n" - "\tadds r0, r3\n" - "\tlsrs r4, r0, 24\n" - "\tb _0809C648\n" - "_0809C524:\n" - "\tmovs r0, 0x10\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C554\n" - "\tmovs r0, 0x1\n" - "\tmov r9, r0\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r3, r0]\n" - "\tadds r0, 0x1\n" - "\tmovs r1, 0x6\n" - "\tbl __modsi3\n" - "\tcmp r0, 0\n" - "\tbeq _0809C548\n" - "\tlsls r0, r4, 24\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 17\n" - "\tb _0809C63C\n" - "_0809C548:\n" - "\tmov r3, r9\n" - "\tstrb r3, [r5]\n" - "\tlsls r0, r4, 24\n" - "\tmovs r1, 0xFB\n" - "\tlsls r1, 24\n" - "\tb _0809C63C\n" - "_0809C554:\n" - "\tmov r3, r12\n" - "\tldrh r1, [r3, 0x2E]\n" - "\tmovs r0, 0x8\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C56A\n" - "\tmovs r0, 0x1\n" - "\tmov r9, r0\n" - "\tmovs r1, 0x2\n" - "\tmov r8, r1\n" - "\tb _0809C646\n" - "_0809C56A:\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C5D4\n" - "\tbl sub_809CAB0\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0809C5D4\n" - "\tldr r0, _0809C588 @ =gUnknown_020384E9\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _0809C58C\n" - "\tmovs r0, 0x8\n" - "\tb _0809C658\n" - "\t.align 2, 0\n" - "_0809C588: .4byte gUnknown_020384E9\n" - "_0809C58C:\n" - "\tmovs r0, 0\n" - "\tbl sub_809CE4C\n" - "\tsubs r0, 0x1\n" - "\tlsls r0, 24\n" - "\tasrs r0, 24\n" - "\tcmp r0, 0x4\n" - "\tbhi _0809C5D4\n" - "\tlsls r0, 2\n" - "\tldr r1, _0809C5A8 @ =_0809C5AC\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_0809C5A8: .4byte _0809C5AC\n" - "\t.align 2, 0\n" - "_0809C5AC:\n" - "\t.4byte _0809C5C0\n" - "\t.4byte _0809C5C4\n" - "\t.4byte _0809C5C8\n" - "\t.4byte _0809C5CC\n" - "\t.4byte _0809C5D0\n" - "_0809C5C0:\n" - "\tmovs r0, 0xB\n" - "\tb _0809C658\n" - "_0809C5C4:\n" - "\tmovs r0, 0xC\n" - "\tb _0809C658\n" - "_0809C5C8:\n" - "\tmovs r0, 0xD\n" - "\tb _0809C658\n" - "_0809C5CC:\n" - "\tmovs r0, 0xE\n" - "\tb _0809C658\n" - "_0809C5D0:\n" - "\tmovs r0, 0xF\n" - "\tb _0809C658\n" - "_0809C5D4:\n" - "\tldr r2, _0809C5E4 @ =gMain\n" - "\tldrh r1, [r2, 0x2E]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C5E8\n" - "\tmovs r0, 0x10\n" - "\tb _0809C658\n" - "\t.align 2, 0\n" - "_0809C5E4: .4byte gMain\n" - "_0809C5E8:\n" - "\tldr r0, _0809C600 @ =gSaveBlock2\n" - "\tldrb r0, [r0, 0x13]\n" - "\tcmp r0, 0x1\n" - "\tbne _0809C612\n" - "\tldrh r1, [r2, 0x2C]\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C604\n" - "\tmovs r0, 0xA\n" - "\tb _0809C658\n" - "\t.align 2, 0\n" - "_0809C600: .4byte gSaveBlock2\n" - "_0809C604:\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C612\n" - "\tmovs r0, 0x9\n" - "\tb _0809C658\n" - "_0809C612:\n" - "\tldrh r1, [r2, 0x2E]\n" - "\tmovs r0, 0x4\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C624\n" - "\tbl sub_809CD88\n" - "\tmovs r0, 0\n" - "\tb _0809C658\n" - "_0809C624:\n" - "\tmovs r3, 0\n" - "\tmov r9, r3\n" - "\tb _0809C656\n" - "_0809C62A:\n" - "\tmovs r0, 0x1\n" - "\tmov r9, r0\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r2, r0]\n" - "\tcmp r0, 0x5\n" - "\tble _0809C642\n" - "\tlsls r0, r4, 24\n" - "\tmovs r1, 0xFA\n" - "\tlsls r1, 24\n" - "_0809C63C:\n" - "\tadds r0, r1\n" - "\tlsrs r4, r0, 24\n" - "\tb _0809C648\n" - "_0809C642:\n" - "\tmovs r3, 0x2\n" - "\tmov r8, r3\n" - "_0809C646:\n" - "\tmovs r4, 0\n" - "_0809C648:\n" - "\tmov r0, r9\n" - "\tcmp r0, 0\n" - "\tbeq _0809C656\n" - "\tmov r0, r8\n" - "\tadds r1, r4, 0\n" - "\tbl sub_809AF18\n" - "_0809C656:\n" - "\tmov r0, r9\n" - "_0809C658:\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif - -#ifdef NONMATCHING -u8 sub_809C664(void) -{ - s8 r10 = gUnknown_020384E4; - s8 r4 = gUnknown_020384E5; - u8 r8; - u8 r9; - - gPokemonStorageSystemPtr->unk_11df = 0; - gPokemonStorageSystemPtr->unk_11de = 0; - gPokemonStorageSystemPtr->unk_11e3 = 0; - r9 = FALSE; - r8 = 0; - if (gMain.newAndRepeatedKeys & DPAD_UP) - { - if (--r4 < 0) - r4 = 6; - if (r4 != gUnknown_020384E5) - r8 = 1; - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if (++r4 > 6) - r4 = 0; - if (r4 != gUnknown_020384E5) - r8 = 1; - } - else if ((gMain.newAndRepeatedKeys & DPAD_LEFT) && gUnknown_020384E5) - { - r8 = 1; - gPokemonStorageSystemPtr->unk_11e2 = gUnknown_020384E5; - r4 = 0; - } - else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) - { - if (gUnknown_020384E5 == 0) - { - r8 = 1; - r4 = gPokemonStorageSystemPtr->unk_11e2; - } - else - { - r8 = 6; - r10 = 0; - r4 = 0; - } - } - else - { - if (gMain.newKeys & A_BUTTON) - { - if (gUnknown_020384E5 == 6) - { - if (gPokemonStorageSystemPtr->unk_0005 == 1) - return 4; - r9 = TRUE; - } - else if (sub_809CAB0()) - { - if (gUnknown_020384E9 == 0) - return 8; - switch (sub_809CE4C(0)) - { - case 1: - return 11; - case 2: - return 12; - case 3: - return 13; - case 4: - return 14; - case 5: - return 15; - } - } - } - if (gMain.newKeys & B_BUTTON) - { - if (gPokemonStorageSystemPtr->unk_0005 == 1) - return 16; - r9 = TRUE; - } - if (!r9) - { - r8 = 6; - r10 = 0; - r4 = 0; - } - else if (gMain.newKeys & SELECT_BUTTON) - { - sub_809CD88(); - return 0; - } - } - if (r8) - sub_809AF18(r10, r4); - return r8; -} -#else -__attribute__((naked)) u8 sub_809C664(void) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tldr r0, _0809C6D8 @ =gUnknown_020384E4\n" - "\tldrb r0, [r0]\n" - "\tmov r10, r0\n" - "\tldr r7, _0809C6DC @ =gUnknown_020384E5\n" - "\tldrb r4, [r7]\n" - "\tldr r2, _0809C6E0 @ =gPokemonStorageSystemPtr\n" - "\tldr r5, [r2]\n" - "\tldr r1, _0809C6E4 @ =0x000011df\n" - "\tadds r0, r5, r1\n" - "\tmovs r1, 0\n" - "\tstrb r1, [r0]\n" - "\tldr r3, _0809C6E8 @ =0x000011de\n" - "\tadds r0, r5, r3\n" - "\tstrb r1, [r0]\n" - "\tadds r3, 0x5\n" - "\tadds r0, r5, r3\n" - "\tstrb r1, [r0]\n" - "\tmov r9, r1\n" - "\tmov r8, r1\n" - "\tldr r1, _0809C6EC @ =gMain\n" - "\tldrh r3, [r1, 0x30]\n" - "\tmovs r0, 0x40\n" - "\tands r0, r3\n" - "\tadds r6, r7, 0\n" - "\tmov r12, r2\n" - "\tadds r2, r1, 0\n" - "\tcmp r0, 0\n" - "\tbeq _0809C6A8\n" - "\tb _0809C81C\n" - "_0809C6A8:\n" - "\tmovs r0, 0x80\n" - "\tands r0, r3\n" - "\tcmp r0, 0\n" - "\tbeq _0809C6F0\n" - "\tlsls r0, r4, 24\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 17\n" - "\tadds r0, r1\n" - "\tlsrs r4, r0, 24\n" - "\tasrs r0, 24\n" - "\tcmp r0, 0x6\n" - "\tble _0809C6C2\n" - "\tmovs r4, 0\n" - "_0809C6C2:\n" - "\tlsls r0, r4, 24\n" - "\tasrs r0, 24\n" - "\tmovs r1, 0\n" - "\tldrsb r1, [r6, r1]\n" - "\tcmp r0, r1\n" - "\tbne _0809C6D0\n" - "\tb _0809C83C\n" - "_0809C6D0:\n" - "\tmovs r2, 0x1\n" - "\tmov r8, r2\n" - "\tb _0809C842\n" - "\t.align 2, 0\n" - "_0809C6D8: .4byte gUnknown_020384E4\n" - "_0809C6DC: .4byte gUnknown_020384E5\n" - "_0809C6E0: .4byte gPokemonStorageSystemPtr\n" - "_0809C6E4: .4byte 0x000011df\n" - "_0809C6E8: .4byte 0x000011de\n" - "_0809C6EC: .4byte gMain\n" - "_0809C6F0:\n" - "\tmovs r0, 0x20\n" - "\tands r0, r3\n" - "\tcmp r0, 0\n" - "\tbeq _0809C714\n" - "\tldrb r1, [r6]\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r6, r0]\n" - "\tcmp r0, 0\n" - "\tbeq _0809C714\n" - "\tmovs r3, 0x1\n" - "\tmov r8, r3\n" - "\tldr r2, _0809C710 @ =0x000011e2\n" - "\tadds r0, r5, r2\n" - "\tstrb r1, [r0]\n" - "\tmovs r4, 0\n" - "\tb _0809C83C\n" - "\t.align 2, 0\n" - "_0809C710: .4byte 0x000011e2\n" - "_0809C714:\n" - "\tldrh r1, [r2, 0x30]\n" - "\tmovs r0, 0x10\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C748\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r6, r0]\n" - "\tcmp r0, 0\n" - "\tbne _0809C73C\n" - "\tmovs r3, 0x1\n" - "\tmov r8, r3\n" - "\tmov r1, r12\n" - "\tldr r0, [r1]\n" - "\tldr r2, _0809C738 @ =0x000011e2\n" - "\tadds r0, r2\n" - "\tldrb r4, [r0]\n" - "\tb _0809C83C\n" - "\t.align 2, 0\n" - "_0809C738: .4byte 0x000011e2\n" - "_0809C73C:\n" - "\tmovs r3, 0x6\n" - "\tmov r8, r3\n" - "\tmovs r0, 0\n" - "\tmov r10, r0\n" - "\tmovs r4, 0\n" - "\tb _0809C83C\n" - "_0809C748:\n" - "\tldrh r1, [r2, 0x2E]\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C7D0\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r6, r0]\n" - "\tcmp r0, 0x6\n" - "\tbne _0809C76E\n" - "\tmov r1, r12\n" - "\tldr r0, [r1]\n" - "\tldrb r0, [r0, 0x5]\n" - "\tcmp r0, 0x1\n" - "\tbne _0809C768\n" - "\tmovs r0, 0x4\n" - "\tb _0809C84C\n" - "_0809C768:\n" - "\tmovs r2, 0x1\n" - "\tmov r9, r2\n" - "\tb _0809C7D0\n" - "_0809C76E:\n" - "\tbl sub_809CAB0\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0809C7D0\n" - "\tldr r0, _0809C784 @ =gUnknown_020384E9\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _0809C788\n" - "\tmovs r0, 0x8\n" - "\tb _0809C84C\n" - "\t.align 2, 0\n" - "_0809C784: .4byte gUnknown_020384E9\n" - "_0809C788:\n" - "\tmovs r0, 0\n" - "\tbl sub_809CE4C\n" - "\tsubs r0, 0x1\n" - "\tlsls r0, 24\n" - "\tasrs r0, 24\n" - "\tcmp r0, 0x4\n" - "\tbhi _0809C7D0\n" - "\tlsls r0, 2\n" - "\tldr r1, _0809C7A4 @ =_0809C7A8\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_0809C7A4: .4byte _0809C7A8\n" - "\t.align 2, 0\n" - "_0809C7A8:\n" - "\t.4byte _0809C7BC\n" - "\t.4byte _0809C7C0\n" - "\t.4byte _0809C7C4\n" - "\t.4byte _0809C7C8\n" - "\t.4byte _0809C7CC\n" - "_0809C7BC:\n" - "\tmovs r0, 0xB\n" - "\tb _0809C84C\n" - "_0809C7C0:\n" - "\tmovs r0, 0xC\n" - "\tb _0809C84C\n" - "_0809C7C4:\n" - "\tmovs r0, 0xD\n" - "\tb _0809C84C\n" - "_0809C7C8:\n" - "\tmovs r0, 0xE\n" - "\tb _0809C84C\n" - "_0809C7CC:\n" - "\tmovs r0, 0xF\n" - "\tb _0809C84C\n" - "_0809C7D0:\n" - "\tldr r2, _0809C7EC @ =gMain\n" - "\tldrh r1, [r2, 0x2E]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C7F8\n" - "\tldr r0, _0809C7F0 @ =gPokemonStorageSystemPtr\n" - "\tldr r0, [r0]\n" - "\tldrb r0, [r0, 0x5]\n" - "\tcmp r0, 0x1\n" - "\tbne _0809C7F4\n" - "\tmovs r0, 0x10\n" - "\tb _0809C84C\n" - "\t.align 2, 0\n" - "_0809C7EC: .4byte gMain\n" - "_0809C7F0: .4byte gPokemonStorageSystemPtr\n" - "_0809C7F4:\n" - "\tmovs r3, 0x1\n" - "\tmov r9, r3\n" - "_0809C7F8:\n" - "\tmov r0, r9\n" - "\tcmp r0, 0\n" - "\tbeq _0809C80A\n" - "\tmovs r1, 0x6\n" - "\tmov r8, r1\n" - "\tmovs r2, 0\n" - "\tmov r10, r2\n" - "\tmovs r4, 0\n" - "\tb _0809C83C\n" - "_0809C80A:\n" - "\tldrh r1, [r2, 0x2E]\n" - "\tmovs r0, 0x4\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0809C83C\n" - "\tbl sub_809CD88\n" - "\tmovs r0, 0\n" - "\tb _0809C84C\n" - "_0809C81C:\n" - "\tlsls r0, r4, 24\n" - "\tmovs r3, 0xFF\n" - "\tlsls r3, 24\n" - "\tadds r0, r3\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r0, 0\n" - "\tbge _0809C82C\n" - "\tmovs r4, 0x6\n" - "_0809C82C:\n" - "\tlsls r0, r4, 24\n" - "\tasrs r0, 24\n" - "\tmovs r1, 0\n" - "\tldrsb r1, [r7, r1]\n" - "\tcmp r0, r1\n" - "\tbeq _0809C83C\n" - "\tmovs r0, 0x1\n" - "\tmov r8, r0\n" - "_0809C83C:\n" - "\tmov r1, r8\n" - "\tcmp r1, 0\n" - "\tbeq _0809C84A\n" - "_0809C842:\n" - "\tmov r0, r10\n" - "\tadds r1, r4, 0\n" - "\tbl sub_809AF18\n" - "_0809C84A:\n" - "\tmov r0, r8\n" - "_0809C84C:\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif diff --git a/src/pokemon/pokemon_storage_system_5.c b/src/pokemon/pokemon_storage_system_5.c deleted file mode 100644 index b7c3d42f5..000000000 --- a/src/pokemon/pokemon_storage_system_5.c +++ /dev/null @@ -1,16 +0,0 @@ - -// Includes -#include "global.h" -#include "pokemon_storage_system.h" - -// Static type declarations - -// Static RAM declarations - -EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL; - -// Static ROM declarations - -// .rodata - -// .text diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c deleted file mode 100644 index 0acf465f6..000000000 --- a/src/pokemon/pokemon_summary_screen.c +++ /dev/null @@ -1,5074 +0,0 @@ -#include "global.h" -#include "constants/items.h" -#include "constants/songs.h" -#include "constants/species.h" -#include "battle.h" -#include "contest.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "ewram.h" -#include "item.h" -#include "learn_move.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "menu_helpers.h" -#include "overworld.h" -#include "palette.h" -#include "party_menu.h" -#include "pokeball.h" -#include "pokemon.h" -#include "pokemon_summary_screen.h" -#include "region_map.h" -#include "sound.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "task.h" -#include "tv.h" -#include "scanline_effect.h" - -static void sub_809FC0C(void); -static void sub_809FEB8(void); -static void sub_809F63C(struct Pokemon *); -static void sub_809F650(struct Pokemon *); -static void sub_809F664(struct Pokemon *); -static void sub_809FE6C(struct Pokemon *); -static void sub_80A0090(struct Pokemon *); -static void sub_80A015C(struct Pokemon *); -static void sub_809DE44(void); -static void sub_809EB40(u8); -static void sub_809EBC4(void); -static void sub_809E044(void); -static void sub_80A1D84(struct Pokemon *); -static void sub_80A18C4(void); -static bool8 LoadPokemonSummaryScreenGraphics(void); -static bool8 MonKnowsMultipleMoves(struct Pokemon *); -static void PrintSummaryWindowHeaderText(void); -static void sub_80A1DCC(struct Pokemon *); -static void sub_809FE80(void); -static void sub_80A00A4(void); -static void sub_80A0390(void); -extern u8 sub_80A1808(struct Pokemon *); -static void sub_80A1F98(s32, u8, u8, u8, u8, u16, s32); -static void sub_80A0958(struct Pokemon *); -static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *, u8, u8); -static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *, u8, u8); -static void sub_80A1EF8(const u8 *, u8, u8, u16, s32); -static void sub_80A1F48(const u8 *, u8, u8, u8, u16); -static void PrintHeldItemName(u16, u8, u8); -static void PrintNumRibbons(struct Pokemon *); -static void DrawExperienceProgressBar(struct Pokemon *, u8, u8); -static void sub_809E13C(u8 taskId); -static void sub_80A1950(void); -static void sub_809DE64(void); -static void SummaryScreenHandleAButton(u8); -static void SummaryScreenHandleUpDownInput(u8, s8); -static bool8 sub_809F7D0(u8); -static void sub_809F9D0(u8, u8); -static void sub_809EAC8(u8); -static void sub_809E534(u8); -static void sub_809E83C(u8, s8); -static void sub_80A1B40(u8); -static void sub_80A2078(int); -static void sub_809E3FC(u8); -static void SummaryScreenHandleKeyInput(u8); -static void sub_80A1B1C(u8); -static void sub_80A16CC(u8); -static void sub_80A1A30(u8); -static void DrawSummaryScreenNavigationDots(void); -static void sub_80A00F4(u8); -static void sub_80A029C(struct Pokemon *); -static void sub_809FBE4(void); -static void sub_80A1500(u8); -static void sub_80A1334(u8); -extern void sub_809F43C(u8); -extern s8 sub_809F284(s8); -extern s8 sub_809F3CC(s8); -static bool8 sub_809F5F8(void); -static void sub_80A1DE8(struct Pokemon *); -static u8 sub_809F6B4(struct Pokemon *, u8 *); -static void DrawPokerusSurvivorDot(struct Pokemon *); -static void sub_80A12D0(s8); -static void sub_809FAC8(struct Pokemon *); -static void SummaryScreenHandleLeftRightInput(u8, s8); -static void sub_809E8F0(); -static void sub_80A1654(s8, u8); -static void sub_80A1488(s8, u8); -static void sub_809FC34(struct Pokemon *); -static void sub_809FF64(struct Pokemon *); -static void sub_80A1918(u8, u8); -static void sub_80A198C(u8, u8, u8, u8); -static u16 GetMonMove(struct Pokemon *, u8); -static void sub_80A04CC(u16); -static void sub_80A057C(u16); -static void sub_80A0498(u16); -static void sub_80A046C(u16); -static void sub_80A20A8(u8); -static void sub_809F678(struct Pokemon *); -static void sub_80A1BC0(struct Sprite *sprite); -static void sub_80A1888(struct Sprite *); -static void sub_80A0428(struct Pokemon *, u8 *); -static void sub_80A18E4(u8); -static u8 *sub_80A1E58(u8 *, u8); -static void sub_80A0A2C(struct Pokemon *, u8, u8); -static void sub_80A1FF8(const u8 *, u8, u8, u8); - -extern u8 ball_number_to_ball_processing_index(u16); -extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8); - -extern struct MusicPlayerInfo gMPlay_BGM; -extern u8 gUnknown_08208238[]; -extern u16 gBattle_BG3_Y; -extern u16 gBattle_BG2_Y; -extern u16 gBattle_BG1_Y; -extern u16 gBattle_BG1_X; -extern u16 gBattle_BG2_X; -extern u16 gBattle_BG3_X; -extern TaskFunc gUnknown_03005CF0; -extern struct SpriteTemplate gUnknown_02024E8C; - -extern const u8 gStatusPal_Icons[]; -extern const u8 gStatusGfx_Icons[]; -extern const u8 gMenuSummaryPal[]; -extern const u8 gMenuSummaryGfx[]; -extern const u8 gMoveTypes_Gfx[]; -extern const u8 gMoveTypes_Pal[]; -extern const u8 gStatusScreen_Pal[]; -extern const u8 gStatusScreen_Tilemap[]; -extern const u8 gUnknown_08E74688[]; -extern const u8 gUnknown_08E74E88[]; -extern const u8 gUnknown_08E73508[]; -extern const u8 gStatusScreen_Gfx[]; -extern const u8 gFontDefaultPalette[]; -extern const u8 gAbilityNames[][13]; -extern const u8 * const gAbilityDescriptions[]; -extern const u8 * const gContestEffectStrings[]; -extern const struct ContestMove gContestMoves[]; -extern const struct ContestEffect gContestEffects[]; -extern const u16 gUnknown_08E94510[]; -extern const u16 gUnknown_08E94550[]; -extern const u16 gUnknown_08E94590[]; -extern const u8 gUnknown_08E73E88[]; - -EWRAM_DATA u8 gUnknown_020384F0 = 0; -EWRAM_DATA struct Sprite *gUnknown_020384F4 = NULL; - -#if ENGLISH -#include "../data/text/move_descriptions_en.h" -#include "../data/text/nature_names_en.h" -#elif GERMAN -#include "../data/text/move_descriptions_de.h" -#include "../data/text/nature_names_de.h" -#endif - -static const u8 * const sPageHeaderTexts[] = { - gEmptyString_81E72B0, - OtherText_PokeInfo, - OtherText_PokeSkills, - OtherText_BattleMoves, - OtherText_ContestMoves, - OtherText_Switch, - OtherText_Info, - gOtherText_CancelNoTerminator, -}; - -static const union AffineAnimCmd sUnusedSpriteAffineAnim[] = { - AFFINEANIMCMD_FRAME(0xFF00, 0x100, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd *const sUnsuedSpriteAffineAnimTable[] = { - sUnusedSpriteAffineAnim, -}; - -static const struct OamData sOamData_83C109C = { - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_83C10A4[] = { - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10AC[] = { - ANIMCMD_FRAME(8, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10B4[] = { - ANIMCMD_FRAME(16, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10BC[] = { - ANIMCMD_FRAME(24, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10C4[] = { - ANIMCMD_FRAME(32, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10CC[] = { - ANIMCMD_FRAME(40, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10D4[] = { - ANIMCMD_FRAME(48, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10DC[] = { - ANIMCMD_FRAME(56, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10E4[] = { - ANIMCMD_FRAME(64, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10EC[] = { - ANIMCMD_FRAME(72, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10F4[] = { - ANIMCMD_FRAME(80, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C10FC[] = { - ANIMCMD_FRAME(88, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1104[] = { - ANIMCMD_FRAME(96, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C110C[] = { - ANIMCMD_FRAME(104, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1114[] = { - ANIMCMD_FRAME(112, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C111C[] = { - ANIMCMD_FRAME(120, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1124[] = { - ANIMCMD_FRAME(128, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C112C[] = { - ANIMCMD_FRAME(136, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1134[] = { - ANIMCMD_FRAME(144, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C113C[] = { - ANIMCMD_FRAME(152, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1144[] = { - ANIMCMD_FRAME(160, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C114C[] = { - ANIMCMD_FRAME(168, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1154[] = { - ANIMCMD_FRAME(176, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const sSpriteAnimTable_83C115C[] = { - sSpriteAnim_83C10A4, - sSpriteAnim_83C10AC, - sSpriteAnim_83C10B4, - sSpriteAnim_83C10BC, - sSpriteAnim_83C10C4, - sSpriteAnim_83C10CC, - sSpriteAnim_83C10D4, - sSpriteAnim_83C10DC, - sSpriteAnim_83C10E4, - sSpriteAnim_83C10EC, - sSpriteAnim_83C10F4, - sSpriteAnim_83C10FC, - sSpriteAnim_83C1104, - sSpriteAnim_83C110C, - sSpriteAnim_83C1114, - sSpriteAnim_83C111C, - sSpriteAnim_83C1124, - sSpriteAnim_83C112C, - sSpriteAnim_83C1134, - sSpriteAnim_83C113C, - sSpriteAnim_83C1144, - sSpriteAnim_83C114C, - sSpriteAnim_83C1154, -}; - -static const struct CompressedSpriteSheet sUnknown_083C11B8 = { gMoveTypes_Gfx, 0x1700, 30002 }; - -static const struct SpriteTemplate sSpriteTemplate_83C11C0 = { - .tileTag = 30002, - .paletteTag = 30002, - .oam = &sOamData_83C109C, - .anims = sSpriteAnimTable_83C115C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const u8 sUnknown_PaletteNums[] = { 0xD, 0xD, 0xE, 0xE, 0xD, 0xD, 0xF, 0xE, 0xD, 0xF, 0xD, 0xE, 0xF, 0xD, 0xE, 0xE, 0xF, 0xD, 0xD, 0xE, 0xE, 0xF, 0xD }; - -static const struct OamData sOamData_83C11F0 = { - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_83C11F8[] = { - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1200[] = { - ANIMCMD_FRAME(4, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1208[] = { - ANIMCMD_FRAME(8, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1210[] = { - ANIMCMD_FRAME(12, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1218[] = { - ANIMCMD_FRAME(16, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1220[] = { - ANIMCMD_FRAME(16, 0, .hFlip = TRUE), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1228[] = { - ANIMCMD_FRAME(20, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1230[] = { - ANIMCMD_FRAME(24, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1238[] = { - ANIMCMD_FRAME(24, 0, .hFlip = TRUE), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C1240[] = { - ANIMCMD_FRAME(28, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const sSpriteAnimTable_83C1248[] = { - sSpriteAnim_83C11F8, - sSpriteAnim_83C1200, - sSpriteAnim_83C1208, - sSpriteAnim_83C1210, - sSpriteAnim_83C1218, - sSpriteAnim_83C1220, - sSpriteAnim_83C1228, - sSpriteAnim_83C1230, - sSpriteAnim_83C1238, - sSpriteAnim_83C1240, -}; - -static const struct CompressedSpriteSheet sUnknown_083C1270 = { gMenuSummaryGfx, 0x400, 30000 }; -static const struct CompressedSpritePalette sUnknown_083C1278 = { gMenuSummaryPal, 30000 }; - -static const struct SpriteTemplate sSpriteTemplate_83C1280 = { - .tileTag = 30000, - .paletteTag = 30000, - .oam = &sOamData_83C11F0, - .anims = sSpriteAnimTable_83C1248, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const struct OamData sOamData_83C1298 = { - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 3, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_83C12A0[] = { - ANIMCMD_FRAME(0, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C12A8[] = { - ANIMCMD_FRAME(4, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C12B0[] = { - ANIMCMD_FRAME(8, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C12B8[] = { - ANIMCMD_FRAME(12, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C12C0[] = { - ANIMCMD_FRAME(16, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C12C8[] = { - ANIMCMD_FRAME(20, 0), - ANIMCMD_END, -}; - -static const union AnimCmd sSpriteAnim_83C12D0[] = { - ANIMCMD_FRAME(24, 0), - ANIMCMD_END, -}; - -static const union AnimCmd *const sSpriteAnimTable_83C12D8[] = { - sSpriteAnim_83C12A0, - sSpriteAnim_83C12A8, - sSpriteAnim_83C12B0, - sSpriteAnim_83C12B8, - sSpriteAnim_83C12C0, - sSpriteAnim_83C12C8, - sSpriteAnim_83C12D0, -}; - -static const struct CompressedSpriteSheet sUnknown_083C12F4 = { gStatusGfx_Icons, 0x380, 30001 }; -static const struct CompressedSpritePalette sUnknown_083C12FC = { gStatusPal_Icons, 30001 }; - -static const struct SpriteTemplate sSpriteTemplate_83C1304 = { - .tileTag = 30001, - .paletteTag = 30001, - .oam = &sOamData_83C1298, - .anims = sSpriteAnimTable_83C12D8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const u16 sSummaryScreenMonMarkingsPalette[] = INCBIN_U16("graphics/summary_screen/mon_markings.gbapal"); - -#if ENGLISH -static const u16 gSummaryScreenTextTiles[] = INCBIN_U16("graphics/summary_screen/text.4bpp"); -#elif GERMAN -extern const u16 gSummaryScreenTextTiles[]; -#endif - -static const u16 sSummaryScreenButtonTiles[] = INCBIN_U16("graphics/summary_screen/buttons.4bpp"); - -static const u16 sUnknown_083C157C[] = { RGB(26, 26, 23) }; -static const u16 sUnknown_083C157E[] = { RGB(30, 30, 27) }; - -static void (*const sUnknown_083C1580[])(void) = { - sub_809FC0C, - sub_809FEB8, -}; - -static void (*const sUnknown_083C1588[])(struct Pokemon *) = { - sub_809F63C, - sub_809F650, - sub_809F664, - sub_809F664, -}; - -static void (*const sUnknown_083C1598[])(struct Pokemon *) = { - sub_809FE6C, - sub_80A0090, - sub_80A015C, - sub_80A015C, -}; - -static const u8 sDoubleBattlePartyOrder[] = { 0, 2, 3, 1, 4, 5 }; - -static const u8 sUnknown_083C15AE[] = _("{STR_VAR_1}{CLEAR_TO 64}"); -static const u8 sUnknown_083C15B4[] = _("{STR_VAR_1}{CLEAR_TO 72}"); - -asm(".align 2"); // TODO: this array is probably not correctly-typed -static const u8 sUnknown_083C15BC[] = { - 9, 1, 0, 2, - 10, 3, 0, 4, - 8, 5, 0, 6, - 11, 7, 0, 8, - 14, 9, 0, 10, - 12, 11, 0, 12, - 13, 13, 0, 14, - -1, 15, 0, 10, -}; - -void sub_809D844(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -#if DEBUG - if (gLinkOpen == TRUE) - debug_sub_8008264(gLink.recvQueue.count, 20, 1, 2, 3); -#endif -} - -void sub_809D85C(void) -{ - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gBattle_BG3_X; - REG_BG3VOFS = gBattle_BG3_Y; - - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void ShowPokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u8 mode) -{ - gPaletteFade.bufferTransferDisabled = 1; - - pssData.monList.partyMons = party; - pssData.mode = mode; - pssData.monIndex = monIndex; - pssData.maxMonIndex = maxMonIndex; - pssData.callback = callback; - pssData.loadGfxState = 0; - pssData.selectedMoveIndex = 4; - pssData.moveToLearn = 0; - pssData.bgToggle = 0; - pssData.disableMoveOrderEditing = FALSE; - - if (mode >= PSS_MODE_PC_NORMAL) - pssData.usingPC = TRUE; - else - pssData.usingPC = FALSE; - - switch (mode) - { - case PSS_MODE_NORMAL: - case PSS_MODE_PC_NORMAL: - pssData.firstPage = PSS_PAGE_INFO; - pssData.lastPage = PSS_PAGE_CONTEST_MOVES; - pssData.unk77 = 0; - pssData.unk78 = 0; - pssData.headerTextId = 1; - pssData.headerActionTextId = 7; - break; - case PSS_MODE_NO_MOVE_ORDER_EDIT: - pssData.firstPage = PSS_PAGE_INFO; - pssData.lastPage = PSS_PAGE_CONTEST_MOVES; - pssData.unk77 = 0; - pssData.unk78 = 0; - pssData.headerTextId = 1; - pssData.headerActionTextId = 7; - pssData.disableMoveOrderEditing = TRUE; - break; - case PSS_MODE_SELECT_MOVE: - pssData.firstPage = PSS_PAGE_BATTLE_MOVES; - pssData.lastPage = PSS_PAGE_CONTEST_MOVES; - pssData.unk77 = 1; - pssData.unk78 = 1; - pssData.headerTextId = 3; - pssData.headerActionTextId = 0; - pssData.selectedMoveIndex = 0; - break; - case PSS_MODE_MOVES_ONLY: - case PSS_MODE_PC_MOVES_ONLY: - pssData.firstPage = PSS_PAGE_BATTLE_MOVES; - pssData.lastPage = PSS_PAGE_CONTEST_MOVES; - pssData.unk77 = 1; - pssData.unk78 = 1; - break; - } - - pssData.page = pssData.firstPage; - SetMainCallback2(sub_809DE44); -} - -void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u16 move) -{ - ShowPokemonSummaryScreen(party, monIndex, maxMonIndex, callback, PSS_MODE_SELECT_MOVE); - pssData.moveToLearn = move; -} - -void sub_809DA1C(void) -{ - switch (pssData.mode) - { - case PSS_MODE_NORMAL: - case PSS_MODE_PC_NORMAL: - pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0); - break; - case PSS_MODE_NO_MOVE_ORDER_EDIT: - pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0); - break; - case PSS_MODE_SELECT_MOVE: - case PSS_MODE_UNKNOWN: - pssData.inputHandlingTaskId = CreateTask(sub_809EB40, 0); - break; - case PSS_MODE_MOVES_ONLY: - case PSS_MODE_PC_MOVES_ONLY: - pssData.inputHandlingTaskId = CreateTask(sub_809E3FC, 0); - break; - } -} - -bool8 sub_809DA84(void) -{ - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - ResetSpriteData(); - gMain.state++; - break; - case 1: - ScanlineEffect_Stop(); - gMain.state++; - break; - case 2: - FreeAllSpritePalettes(); - gMain.state++; - break; - case 3: - DmaClearLarge(3, (void *)(VRAM + 0x0), 0x10000, 0x1000, 32); - gMain.state++; - break; - case 4: - sub_809DE64(); - gMain.state++; - break; - case 5: - Text_LoadWindowTemplate(&gWindowTemplate_81E6E6C); - gMain.state++; - break; - case 6: - MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E6C); - gMain.state++; - break; - case 7: - if (MultistepInitMenuWindowContinue()) - gMain.state++; - break; - case 8: - sub_809DA1C(); - gMain.state++; - break; - case 9: - DmaCopy16Defvars(3, gSummaryScreenTextTiles, (void *)(VRAM + 0xD000), 320); - DmaCopy16Defvars(3, sSummaryScreenButtonTiles, (void *)(VRAM + 0xD140), 256); - pssData.loadGfxState = 0; - gMain.state++; - break; - case 10: - if (LoadPokemonSummaryScreenGraphics()) - { - pssData.loadGfxState = 0; - gMain.state++; - } - break; - case 11: - sub_80A18C4(); - gMain.state++; - break; - case 12: - sub_809F678(&pssData.loadedMon); - if (!GetMonStatusAndPokerus(&pssData.loadedMon)) - sub_80A12D0(0); - else - sub_80A12D0(10); - DrawPokerusSurvivorDot(&pssData.loadedMon); - gMain.state++; - break; - case 13: - sub_80A1950(); - sub_80A1D84(&pssData.loadedMon); - gMain.state++; - break; - case 14: - sub_80A1DE8(&pssData.loadedMon); - pssData.loadGfxState = 0; - gMain.state++; - break; - case 15: - if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF) - { - pssData.loadGfxState = 0; - gMain.state++; - } - break; - case 16: - sub_809E044(); - DrawSummaryScreenNavigationDots(); - gMain.state++; - break; - case 17: - if (pssData.page <= PSS_PAGE_SKILLS) - sUnknown_083C1580[pssData.page](); - gMain.state++; - break; - case 18: - sub_809FAC8(&pssData.loadedMon); - gMain.state++; - break; - case 19: - sUnknown_083C1598[pssData.page](&pssData.loadedMon); - gMain.state++; - break; - case 20: - if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) - gBattle_BG3_X = 256; - else - gBattle_BG3_X = 0; - gMain.state++; - break; - case 21: - sub_809EBC4(); - if (pssData.selectedMoveIndex != 0) - { - sub_80A1488(0, 0); - sub_80A1654(0, 0); - } - else - { - sub_80A1488(10, 0); - sub_80A1654(10, 0); - } - PrintSummaryWindowHeaderText(); - gMain.state++; - break; - case 22: - if (sub_8055870() != TRUE) - gMain.state++; - break; - default: - SetVBlankCallback(sub_809D85C); - BeginHardwarePaletteFade(0xFF, 0, 16, 0, 1); - SetMainCallback2(sub_809D844); - gPaletteFade.bufferTransferDisabled = 0; -#if DEBUG - if (gLinkOpen == TRUE) - debug_sub_8008218((void *)(VRAM + 0xDDE0), 0x8000, (void *)(VRAM + 0xF000), 3); -#endif - return TRUE; - } - - return FALSE; -} - -static void sub_809DE44(void) -{ - while (sub_809DA84() != TRUE && sub_80F9344() != TRUE) - ; -} - -static void sub_809DE64(void) -{ - REG_BG0CNT = 0x1E08; - REG_BG1CNT = 0x4801; - REG_BG2CNT = 0x4A02; - REG_BG3CNT = 0x5C03; - - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 0; - gBattle_BG3_Y = 0; - - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - - REG_BLDCNT = 0; - REG_DISPCNT = 0x1F40; -} - -static bool8 LoadPokemonSummaryScreenGraphics(void) -{ - switch (pssData.loadGfxState) - { - case 0: - LZDecompressVram(gStatusScreen_Gfx, (void *)VRAM + 0); - break; - case 1: - CpuSet(gUnknown_08E73508, (void *)VRAM + 0xE000, 0x400); - break; - case 2: - LZDecompressVram(gUnknown_08E74E88, (void *)VRAM + 0xE800); - break; - case 3: - LZDecompressVram(gStatusScreen_Tilemap, (void *)VRAM + 0x4800); - break; - case 4: - CpuSet(gUnknown_08E73E88, (void *)VRAM + 0x5800, 0x400); - break; - case 5: - CpuSet(gUnknown_08E74688, (void *)VRAM + 0x6800, 0x400); - break; - case 6: - LoadCompressedPalette(gStatusScreen_Pal, 0, 160); - break; - case 7: - LoadCompressedObjectPic(&sUnknown_083C11B8); - break; - case 8: - LoadCompressedObjectPic(&sUnknown_083C1270); - break; - case 9: - LoadCompressedObjectPic(&sUnknown_083C12F4); - break; - case 10: - LoadCompressedObjectPalette(&sUnknown_083C12FC); - break; - case 11: - LoadCompressedObjectPalette(&sUnknown_083C1278); - break; - case 12: - LoadCompressedPalette(gMoveTypes_Pal, 464, 96); - pssData.loadGfxState = 0; - return TRUE; - } - - pssData.loadGfxState++; - return FALSE; -} - -static void sub_809E044(void) -{ - LoadPalette(gUnknownPalette_81E6692 + 14, 129, 2); - LoadPalette(gUnknownPalette_81E6692 + 15, 136, 2); - LoadPalette(gUnknownPalette_81E6692 + 14, 143, 2); - LoadPalette(gUnknownPalette_81E6692 + 15, 137, 2); - LoadPalette(gUnknownPalette_81E6692 + 6, 209, 4); - LoadPalette(gUnknownPalette_81E6692 + 10, 211, 4); - LoadPalette(gUnknownPalette_81E6692 + 14, 213, 4); - LoadPalette(gUnknownPalette_81E6692 + 6, 215, 4); - LoadPalette(gUnknownPalette_81E6692 + 4, 217, 4); - LoadPalette(gUnknownPalette_81E6692 + 8, 219, 4); - LoadPalette(gUnknownPalette_81E6692 + 2, 221, 2); - LoadPalette(gUnknownPalette_81E6692 + 3, 222, 2); - LoadPalette(gUnknownPalette_81E6692 + 1, 223, 2); - LoadPalette(gFontDefaultPalette, 240, 32); - LoadPalette(gUnknownPalette_81E6692 + 3, 249, 2); -} - -static void SummaryScreenExit(u8 taskId) -{ - PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskId].func = sub_809E13C; -} - -static void sub_809E13C(u8 taskId) -{ - if (sub_8055870() != TRUE && !gPaletteFade.active) - { - gUnknown_020384F0 = pssData.monIndex; - - ResetSpriteData(); - FreeAllSpritePalettes(); - StopCryAndClearCrySongs(); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - SetMainCallback2(pssData.callback); - DestroyTask(taskId); - } -} - -static void SummaryScreenHandleKeyInput(u8 taskId) -{ - if (gPaletteFade.active) - return; - - if (gMain.newKeys & DPAD_UP) - { - SummaryScreenHandleUpDownInput(taskId, -1); - } - else if (gMain.newKeys & DPAD_DOWN) - { - SummaryScreenHandleUpDownInput(taskId, 1); - } - else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) - { - SummaryScreenHandleLeftRightInput(taskId, -1); - } - else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) - { - SummaryScreenHandleLeftRightInput(taskId, 1); - } - else if (gMain.newKeys & A_BUTTON) - { - if (pssData.page >= PSS_PAGE_BATTLE_MOVES) - SummaryScreenHandleAButton(taskId); - if (pssData.page == PSS_PAGE_INFO) - SummaryScreenExit(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - SummaryScreenExit(taskId); - } -} - -static void sub_809E260(u8 taskId) -{ - if (gPaletteFade.active) - return; - - if (gMain.newKeys & DPAD_UP) - { - gTasks[taskId].data[0] = 4; - sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex); - } - else if (gMain.newKeys & DPAD_DOWN) - { - gTasks[taskId].data[0] = 4; - sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex); - } - else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) - { - if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) - Menu_EraseWindowRect(0, 14, 9, 18); - SummaryScreenHandleLeftRightInput(taskId, -1); - } - else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) - { - if (pssData.page != pssData.lastPage) - { - if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) - Menu_EraseWindowRect(0, 14, 9, 18); - SummaryScreenHandleLeftRightInput(taskId, 1); - } - } - else if (gMain.newKeys & A_BUTTON) - { - if (sub_809F7D0(taskId) == TRUE || pssData.selectedMoveIndex == 4) - { - pssData.switchMoveIndex = pssData.selectedMoveIndex; - gSpecialVar_0x8005 = pssData.switchMoveIndex; - SummaryScreenExit(taskId); - } - else - { - PlaySE(SE_HAZURE); - sub_809F9D0(taskId, pssData.selectedMoveIndex); - } - } - else if (gMain.newKeys & B_BUTTON) - { - pssData.switchMoveIndex = 4; - gSpecialVar_0x8005 = 4; - SummaryScreenExit(taskId); - } -} - -static void sub_809E3FC(u8 taskId) -{ - if (gPaletteFade.active) - return; - - if (gMain.newKeys & DPAD_UP) - { - gTasks[taskId].data[0] = 4; - sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex); - } - else if (gMain.newKeys & DPAD_DOWN) - { - gTasks[taskId].data[0] = 4; - sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex); - } - else if (gMain.newKeys & A_BUTTON) - { - if (pssData.selectedMoveIndex != 4 && !pssData.disableMoveOrderEditing) - { - if (!MonKnowsMultipleMoves(&pssData.loadedMon)) - { - PlaySE(SE_HAZURE); - } - else - { - PlaySE(SE_SELECT); - - pssData.switchMoveIndex = pssData.selectedMoveIndex; - sub_80A1B40(1); - sub_80A1A30(19); - - gTasks[taskId].func = sub_809E534; - } - } - else - { - PlaySE(SE_SELECT); - sub_809EAC8(taskId); - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_809EAC8(taskId); - } - -} - -static bool8 MonKnowsMultipleMoves(struct Pokemon *mon) -{ - u8 i; - - for (i = 1; i < 4; i++) - { - if (GetMonMove(mon, i)) - return TRUE; - } - - return FALSE; -} - -static void sub_809E534(u8 taskId) -{ - if (gMain.newKeys & DPAD_UP) - { - gTasks[taskId].data[0] = 3; - sub_809E8F0(taskId, -1, &pssData.switchMoveIndex); - } - else if (gMain.newKeys & DPAD_DOWN) - { - gTasks[taskId].data[0] = 3; - sub_809E8F0(taskId, 1, &pssData.switchMoveIndex); - } - else if (gMain.newKeys & A_BUTTON) - { - sub_809E83C(taskId, 1); - } - else if (gMain.newKeys & B_BUTTON) - { - sub_809E83C(taskId, -1); - } -} - -static void sub_809E5C4(void) -{ - struct Pokemon *party = pssData.monList.partyMons; - struct Pokemon *pkmn = &party[pssData.monIndex]; - u8 moveIndex1 = pssData.selectedMoveIndex; - u8 moveIndex2 = pssData.switchMoveIndex; - - u16 move1 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1); - u16 move2 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2); - u8 move1pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex1); - u8 move2pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex2); - u8 ppBonuses = GetMonData(pkmn, MON_DATA_PP_BONUSES); - - // Calculate PP bonuses - u8 r9 = gUnknown_08208238[moveIndex1]; - u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2); - u8 r3 = gUnknown_08208238[moveIndex2]; - u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2); - ppBonuses &= ~r9; - ppBonuses &= ~r3; - ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2)); - - // Swap the moves - SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2); - SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1); - SetMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp); - SetMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp); - SetMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses); -} - -static void sub_809E6D8(void) -{ - struct BoxPokemon *boxMons = pssData.monList.boxMons; - struct BoxPokemon *pkmn = &boxMons[pssData.monIndex]; - u8 moveIndex1 = pssData.selectedMoveIndex; - u8 moveIndex2 = pssData.switchMoveIndex; - - u16 move1 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1); - u16 move2 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2); - u8 move1pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1); - u8 move2pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2); - u8 ppBonuses = GetBoxMonData(pkmn, MON_DATA_PP_BONUSES); - - // Calculate PP bonuses - u8 r9 = gUnknown_08208238[moveIndex1]; - u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2); - u8 r3 = gUnknown_08208238[moveIndex2]; - u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2); - ppBonuses &= ~r9; - ppBonuses &= ~r3; - ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2)); - - // Swap the moves - SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2); - SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1); - SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp); - SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp); - SetBoxMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses); -} - -void sub_809E7F0(u8 taskId) -{ - if (sub_809F5F8()) - { - pssData.loadGfxState = 0; - sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); - gTasks[taskId].func = sub_809E3FC; - sub_80A2078(taskId); - } -} - -static void sub_809E83C(u8 taskId, s8 b) -{ - PlaySE(SE_SELECT); - - sub_80A1B1C(19); - sub_80A1B40(0); - - if (b == 1) - { - if (pssData.selectedMoveIndex != pssData.switchMoveIndex) - { - if (pssData.usingPC == FALSE) - sub_809E5C4(); - else - sub_809E6D8(); - - pssData.selectedMoveIndex = pssData.switchMoveIndex; - sub_809F678(&pssData.loadedMon); - pssData.loadGfxState = 1; - - gTasks[taskId].func = sub_809E7F0; - return; - } - } - else - { - sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); - } - - gTasks[taskId].func = sub_809E3FC; - sub_80A2078(taskId); -} - -__attribute__((naked)) -static void sub_809E8F0(/*u8 taskId, s8 direction, u8 *c*/) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - adds r4, r1, 0\n\ - mov r9, r2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - movs r0, 0x1\n\ - str r0, [sp]\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - mov r1, r9\n\ - ldrb r6, [r1]\n\ - ldr r1, _0809E944 @ =gTasks\n\ - mov r2, r8\n\ - lsls r0, r2, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x8]\n\ - movs r2, 0\n\ - lsls r4, 24\n\ - asrs r4, 24\n\ - mov r10, r4\n\ - lsls r7, r0, 24\n\ -_0809E930:\n\ - lsls r0, r6, 24\n\ - asrs r0, 24\n\ - add r0, r10\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - asrs r1, r0, 24\n\ - cmp r0, r7\n\ - ble _0809E948\n\ - movs r6, 0\n\ - b _0809E94E\n\ - .align 2, 0\n\ -_0809E944: .4byte gTasks\n\ -_0809E948:\n\ - cmp r1, 0\n\ - bge _0809E94E\n\ - lsrs r6, r7, 24\n\ -_0809E94E:\n\ - lsls r4, r6, 24\n\ - lsrs r1, r4, 24\n\ - ldr r0, _0809EA10 @ =gSharedMem + 0x18010\n\ - str r2, [sp, 0x4]\n\ - bl GetMonMove\n\ - lsls r0, 16\n\ - adds r5, r4, 0\n\ - ldr r2, [sp, 0x4]\n\ - cmp r0, 0\n\ - bne _0809E97A\n\ - asrs r0, r5, 24\n\ - cmp r0, 0x4\n\ - beq _0809E97A\n\ - lsls r0, r2, 24\n\ - movs r3, 0x80\n\ - lsls r3, 17\n\ - adds r0, r3\n\ - lsrs r2, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _0809E930\n\ -_0809E97A:\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x4\n\ - bne _0809E996\n\ - asrs r0, r5, 24\n\ - cmp r0, 0x4\n\ - beq _0809E996\n\ - ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ - adds r0, 0x7C\n\ - ldrh r0, [r0]\n\ - mov r2, r8\n\ - lsls r7, r2, 2\n\ - cmp r0, 0\n\ - beq _0809E9AC\n\ -_0809E996:\n\ - ldr r2, _0809EA18 @ =gTasks\n\ - mov r3, r8\n\ - lsls r1, r3, 2\n\ - adds r0, r1, r3\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - movs r2, 0x22\n\ - ldrsh r0, [r0, r2]\n\ - adds r7, r1, 0\n\ - cmp r0, 0x1\n\ - bne _0809E9D0\n\ -_0809E9AC:\n\ - lsrs r4, r5, 24\n\ - movs r0, 0x2\n\ - adds r1, r4, 0\n\ - bl sub_80A1488\n\ - movs r0, 0x2\n\ - adds r1, r4, 0\n\ - bl sub_80A1654\n\ - ldr r1, _0809EA18 @ =gTasks\n\ - mov r3, r8\n\ - adds r0, r7, r3\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r1, 0\n\ - strh r1, [r0, 0x22]\n\ - movs r0, 0\n\ - str r0, [sp]\n\ -_0809E9D0:\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x4\n\ - beq _0809E9FE\n\ - asrs r0, r5, 24\n\ - cmp r0, 0x4\n\ - bne _0809E9FE\n\ - ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ - adds r0, 0x7C\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - bne _0809E9FE\n\ - movs r4, 0x2\n\ - negs r4, r4\n\ - lsrs r5, 24\n\ - adds r0, r4, 0\n\ - adds r1, r5, 0\n\ - bl sub_80A1488\n\ - adds r0, r4, 0\n\ - adds r1, r5, 0\n\ - bl sub_80A1654\n\ -_0809E9FE:\n\ - mov r2, r9\n\ - strb r6, [r2]\n\ - ldr r0, _0809EA1C @ =gSharedMem + 0x18079\n\ - cmp r9, r0\n\ - bne _0809EA20\n\ - movs r0, 0\n\ - bl sub_80A1C30\n\ - b _0809EA26\n\ - .align 2, 0\n\ -_0809EA10: .4byte gSharedMem + 0x18010\n\ -_0809EA14: .4byte gSharedMem + 0x18000\n\ -_0809EA18: .4byte gTasks\n\ -_0809EA1C: .4byte gSharedMem + 0x18079\n\ -_0809EA20:\n\ - movs r0, 0x1\n\ - bl sub_80A1C30\n\ -_0809EA26:\n\ - ldr r3, [sp]\n\ - cmp r3, 0\n\ - beq _0809EA34\n\ - ldr r0, _0809EA4C @ =gSharedMem + 0x18010\n\ - mov r1, r9\n\ - bl sub_80A0428\n\ -_0809EA34:\n\ - mov r0, r8\n\ - bl sub_80A2078\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0809EA4C: .4byte gSharedMem + 0x18010\n\ - .syntax divided\n"); -} - -static void SummaryScreenHandleAButton(u8 taskId) -{ - PlaySE(SE_SELECT); - - pssData.selectedMoveIndex = 0; - sub_80A1488(2, 0); - sub_80A1654(2, 0); - - if (!pssData.disableMoveOrderEditing) - { - pssData.headerActionTextId = 5; - PrintSummaryWindowHeaderText(); - } - - sub_80A16CC(0); - sub_80A029C(&pssData.loadedMon); - sub_80A1A30(9); - - gTasks[taskId].func = sub_809E3FC; - sub_80A2078(taskId); -} - -static void sub_809EAC8(u8 taskId) -{ - if (pssData.selectedMoveIndex != 4) - { - sub_80A1488(-2, 0); - sub_80A1654(-2, 0); - } - - sub_80A1B1C(9); - sub_80A16CC(1); - - Menu_EraseWindowRect(15, 12, 28, 13); - Menu_EraseWindowRect(11, 15, 28, 18); - - pssData.headerActionTextId = 6; - PrintSummaryWindowHeaderText(); - - gTasks[taskId].func = SummaryScreenHandleKeyInput; -} - -static void sub_809EB40(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 5: - sub_80A1A30(9); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_809E260; - break; - case 0: - pssData.selectedMoveIndex = 0; - if (pssData.moveToLearn != 0) - { - sub_80A1488(10, 0); - sub_80A1654(10, pssData.selectedMoveIndex); - } - - sub_80A16CC(0); - sub_80A029C(&pssData.loadedMon); - // fall through - default: - gTasks[taskId].data[0]++; - break; - } -} - -static void sub_809EBC4(void) -{ - if (pssData.page != PSS_PAGE_INFO) - { - DrawSummaryScreenNavigationDots(); - gBattle_BG1_X = 0x100; - - if (pssData.page == PSS_PAGE_SKILLS) - REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; - - if (pssData.page == PSS_PAGE_CONTEST_MOVES) - REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xC00; - } -} - -void sub_809EC38(u8 taskId) -{ - u8 minus2; - s16 *taskData = gTasks[taskId].data; - - switch (taskData[0]) - { - case 0: - if (pssData.bgToggle == 0) - { - if (pssData.page != PSS_PAGE_INFO) - gBattle_BG2_X = 0x100; - - if (pssData.page == PSS_PAGE_SKILLS) - REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0x800; - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0xA00; - } - else - { - if (pssData.page != PSS_PAGE_INFO) - gBattle_BG1_X = 0x100; - - if (pssData.page == PSS_PAGE_SKILLS) - REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; - } - - taskData[0]++; - break; - case 1: - if (pssData.bgToggle == 0) - { - int var2 = gBattle_BG1_X - 0x20; - gBattle_BG1_X = var2; - if (var2 << 16 == 0) - { - REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2; - REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 1; - taskData[0]++; - } - } - else - { - int var2 = gBattle_BG2_X - 0x20; - gBattle_BG2_X = var2; - if (var2 << 16 == 0) - { - REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 1; - REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2; - taskData[0]++; - } - } - break; - case 2: - pssData.headerTextId = pssData.page + 1; - minus2 = pssData.mode - 2; - if (minus2 < 2) - { - pssData.headerActionTextId = 0; - sub_80A029C(&pssData.loadedMon); - sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); - sub_80A00F4(pssData.selectedMoveIndex); - } - else - { - if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT)) - pssData.headerActionTextId = 6; - else if (pssData.page == PSS_PAGE_INFO) - pssData.headerActionTextId = 7; - else - pssData.headerActionTextId = 0; - } - taskData[0]++; - break; - case 3: - DrawSummaryScreenNavigationDots(); - PrintSummaryWindowHeaderText(); - taskData[0]++; - break; - case 4: - sUnknown_083C1598[pssData.page](&pssData.loadedMon); - pssData.bgToggle ^= 1; - taskData[0]++; - break; - case 5: - if (sub_8055870() != TRUE) - gTasks[taskId].func = gUnknown_03005CF0; - break; - } -} - -void sub_809EE74(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - switch (taskData[0]) - { - case 0: - if (pssData.bgToggle == 0) - { - gBattle_BG2_X = 0; - taskData[0]++; - } - else - { - gBattle_BG1_X = 0; - taskData[0]++; - } - break; - case 1: - if (pssData.bgToggle == 0) - { - if (pssData.page == PSS_PAGE_SKILLS) - REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0x801; - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xA01; - - if (pssData.page == PSS_PAGE_CONTEST_MOVES) - REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xC01; - - REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2; - } - else - { - if (pssData.page == PSS_PAGE_SKILLS) - REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0x801; - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xA01; - - if (pssData.page == PSS_PAGE_CONTEST_MOVES) - REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xC01; - - REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2; - } - - taskData[0]++; - break; - case 2: - if (pssData.bgToggle == 0) - { - gBattle_BG2_X += 32; - if (gBattle_BG2_X == 0x100) - taskData[0]++; - } - else - { - gBattle_BG1_X += 32; - if (gBattle_BG1_X == 0x100) - taskData[0]++; - } - break; - case 3: - pssData.headerTextId = pssData.page + 1; - if (pssData.mode == 2 || pssData.mode == 3) - { - pssData.headerActionTextId = 0; - sub_80A029C(&pssData.loadedMon); - sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); - sub_80A00F4(pssData.selectedMoveIndex); - } - else - { - if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT)) - pssData.headerActionTextId = 6; - else if (pssData.page == PSS_PAGE_INFO) - pssData.headerActionTextId = 7; - else - pssData.headerActionTextId = 0; - } - taskData[0]++; - break; - case 4: - DrawSummaryScreenNavigationDots(); - PrintSummaryWindowHeaderText(); - taskData[0]++; - break; - case 5: - sUnknown_083C1598[pssData.page](&pssData.loadedMon); - pssData.bgToggle ^= 1; - taskData[0]++; - break; - case 6: - if (sub_8055870() != TRUE) - gTasks[taskId].func = gUnknown_03005CF0; - break; - } -} - -void sub_809F0D0(u8 taskId, s8 direction) -{ - pssData.page += direction; - gUnknown_03005CF0 = gTasks[taskId].func; - sub_809FBE4(); - gTasks[taskId].data[0] = 0; - - if (direction == -1) - { - gTasks[taskId].func = sub_809EC38; - } - else - { - gTasks[taskId].func = sub_809EE74; - gTasks[taskId].func(taskId); - } -} - -static void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction) -{ - if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) - { - if (direction == -1 && pssData.page == pssData.firstPage) - return; - if (direction == 1 && pssData.page == pssData.lastPage) - return; - if (FindTaskIdByFunc(sub_80A1334) == 0xFF && FindTaskIdByFunc(sub_80A1500) == 0xFF) - { - PlaySE(SE_SELECT); - sub_809F0D0(taskId, direction); - } - } -} - -#ifdef NONMATCHING -static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) -{ - s8 var3; - u8 var1 = direction; - - if (pssData.usingPC == TRUE) - { - if (pssData.page != PSS_PAGE_INFO) - { - var1 = (direction == 1) ? 0 : 1; - } - else - { - var1 = (direction == 1) ? 2 : 3; - } - - var3 = StorageSystemGetNextMonIndex(pssData.monList.boxMons, pssData.monIndex, pssData.maxMonIndex, var1); - } - else - { - if (sub_80F9344() == TRUE && IsLinkDoubleBattle() == TRUE) - { - var3 = sub_809F3CC(var1); - } - else - { - var3 = sub_809F284(var1); - } - } - - if (var3 != -1) - { - PlaySE(SE_SELECT); - if (GetMonStatusAndPokerus(&pssData.loadedMon)) - { - sub_80A12D0(-2); - } - - pssData.monIndex = var3; - pssData.unk84 = gTasks[taskId].func; - gTasks[taskId].func = sub_809F43C; - } -} -#else -__attribute__((naked)) -static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - lsls r1, 24\n\ - lsrs r4, r1, 24\n\ - ldr r0, _0809F1E4 @ =gSharedMem + 0x18000\n\ - ldrb r1, [r0, 0xE]\n\ - adds r2, r0, 0\n\ - cmp r1, 0x1\n\ - bne _0809F202\n\ - ldrb r0, [r2, 0xB]\n\ - cmp r0, 0\n\ - beq _0809F1E8\n\ - lsls r1, r4, 24\n\ - asrs r1, 24\n\ - movs r4, 0x1\n\ - eors r1, r4\n\ - negs r0, r1\n\ - orrs r0, r1\n\ - lsrs r4, r0, 31\n\ - b _0809F1F4\n\ - .align 2, 0\n\ -_0809F1E4: .4byte gSharedMem + 0x18000\n\ -_0809F1E8:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r4, 0x3\n\ - cmp r0, 0x1\n\ - bne _0809F1F4\n\ - movs r4, 0x2\n\ -_0809F1F4:\n\ - ldr r0, [r2]\n\ - ldrb r1, [r2, 0x9]\n\ - ldrb r2, [r2, 0xA]\n\ - adds r3, r4, 0\n\ - bl StorageSystemGetNextMonIndex\n\ - b _0809F22C\n\ -_0809F202:\n\ - bl sub_80F9344\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0809F224\n\ - bl IsLinkDoubleBattle\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _0809F224\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - bl sub_809F3CC\n\ - b _0809F22C\n\ -_0809F224:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - bl sub_809F284\n\ -_0809F22C:\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - beq _0809F270\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - ldr r5, _0809F278 @ =gSharedMem + 0x18010\n\ - adds r0, r5, 0\n\ - bl GetMonStatusAndPokerus\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0809F258\n\ - movs r0, 0x2\n\ - negs r0, r0\n\ - bl sub_80A12D0\n\ -_0809F258:\n\ - adds r0, r5, 0\n\ - subs r0, 0x10\n\ - strb r4, [r0, 0x9]\n\ - ldr r1, _0809F27C @ =gTasks\n\ - lsls r0, r6, 2\n\ - adds r0, r6\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - str r1, [r5, 0x74]\n\ - ldr r1, _0809F280 @ =sub_809F43C\n\ - str r1, [r0]\n\ -_0809F270:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0809F278: .4byte gSharedMem + 0x18010\n\ -_0809F27C: .4byte gTasks\n\ -_0809F280: .4byte sub_809F43C\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -#ifdef NONMATCHING -s8 sub_809F284(s8 a) -{ - struct Pokemon *mons = pssData.monList.partyMons; - s8 r6 = 0; - - if (pssData.page == PSS_PAGE_INFO) - { - if (a == -1 && pssData.monIndex == 0) - return -1; - if (a == 1 && pssData.monIndex >= pssData.maxMonIndex) - return -1; - return pssData.monIndex + a; - } - else - { - do - { - r6 += a; - if (pssData.monIndex + r6 < 0 || pssData.monIndex + r6 > pssData.maxMonIndex) - return -1; - } while (GetMonData(&mons[pssData.monIndex + r6], MON_DATA_IS_EGG) != 0); - return pssData.monIndex + r6; - } -} -#else -__attribute__((naked)) -s8 sub_809F284(s8 a) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - ldr r0, _0809F2C0 @ =gSharedMem + 0x18000\n\ - ldr r7, [r0]\n\ - movs r6, 0\n\ - ldrb r1, [r0, 0xB]\n\ - adds r4, r0, 0\n\ - cmp r1, 0\n\ - bne _0809F2C4\n\ - lsls r0, r3, 24\n\ - asrs r2, r0, 24\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - adds r5, r0, 0\n\ - cmp r2, r1\n\ - bne _0809F2AC\n\ - ldrb r0, [r4, 0x9]\n\ - cmp r0, 0\n\ - beq _0809F2E4\n\ -_0809F2AC:\n\ - asrs r0, r5, 24\n\ - cmp r0, 0x1\n\ - bne _0809F2BA\n\ - ldrb r0, [r4, 0x9]\n\ - ldrb r1, [r4, 0xA]\n\ - cmp r0, r1\n\ - bcs _0809F2E4\n\ -_0809F2BA:\n\ - ldrb r0, [r4, 0x9]\n\ - adds r0, r3\n\ - b _0809F304\n\ - .align 2, 0\n\ -_0809F2C0: .4byte gSharedMem + 0x18000\n\ -_0809F2C4:\n\ - lsls r5, r3, 24\n\ -_0809F2C6:\n\ - lsls r0, r6, 24\n\ - asrs r0, 24\n\ - asrs r1, r5, 24\n\ - adds r0, r1\n\ - lsls r0, 24\n\ - ldr r4, _0809F2EC @ =gSharedMem + 0x18000\n\ - lsrs r6, r0, 24\n\ - asrs r0, 24\n\ - ldrb r2, [r4, 0x9]\n\ - adds r1, r0, r2\n\ - cmp r1, 0\n\ - blt _0809F2E4\n\ - ldrb r0, [r4, 0xA]\n\ - cmp r1, r0\n\ - ble _0809F2F0\n\ -_0809F2E4:\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - b _0809F308\n\ - .align 2, 0\n\ -_0809F2EC: .4byte gSharedMem + 0x18000\n\ -_0809F2F0:\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - adds r0, r7, r0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0809F2C6\n\ - ldrb r0, [r4, 0x9]\n\ - adds r0, r6\n\ -_0809F304:\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ -_0809F308:\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -bool8 sub_809F310(struct Pokemon *mon) -{ - if (GetMonData(mon, MON_DATA_SPECIES)) - { - if (pssData.page != PSS_PAGE_INFO || !GetMonData(mon, MON_DATA_IS_EGG)) - return TRUE; - } - return FALSE; -} - -s8 sub_809F344(u8 partyIndex) -{ - while (1) - { - partyIndex++; - if (partyIndex == PARTY_SIZE) - return -1; - if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE) - return sDoubleBattlePartyOrder[partyIndex]; - } -} - -s8 sub_809F388(u8 partyIndex) -{ - while (1) - { - if (partyIndex == 0) - return -1; - partyIndex--; - if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE) - return sDoubleBattlePartyOrder[partyIndex]; - } -} - -s8 sub_809F3CC(s8 direction) -{ - u8 i; - u8 monIndex = 0; - - for (i = 0; i < PARTY_SIZE; i++) - { - if (sDoubleBattlePartyOrder[i] == pssData.monIndex) - { - monIndex = i; - break; - } - } - - if ((direction == -1 && monIndex == 0) || (direction == 1 && monIndex == 5)) - return -1; - if (direction != 1) - return sub_809F388(monIndex); - else if (monIndex != 5) - return sub_809F344(monIndex); - - return -1; -} - -void sub_809F43C(u8 taskId) -{ - switch (gMain.state) - { - case 0: - StopCryAndClearCrySongs(); - gMain.state++; - break; - case 1: - DestroySpriteAndFreeResources(&gSprites[pssData.monSpriteId]); - gMain.state++; - break; - case 2: - DestroySpriteAndFreeResources(&gSprites[pssData.ballSpriteId]); - gMain.state++; - break; - case 3: - pssData.loadGfxState = 0; - pssData.selectedMoveIndex = 0; - gMain.state++; - break; - case 4: - sub_809F678(&pssData.loadedMon); - if (GetMonStatusAndPokerus(&pssData.loadedMon)) - sub_80A12D0(2); - DrawPokerusSurvivorDot(&pssData.loadedMon); - gMain.state++; - break; - case 5: - if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF) - { - pssData.loadGfxState = 0; - if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) - gBattle_BG3_X = 256; - else - gBattle_BG3_X = 0; - gMain.state++; - } - break; - case 6: - sub_80A1DCC(&pssData.loadedMon); - gMain.state++; - break; - case 7: - sub_80A1DE8(&pssData.loadedMon); - gMain.state++; - break; - case 8: - if (sub_809F5F8()) - { - pssData.loadGfxState = 0; - gMain.state++; - } - break; - default: - if (sub_8055870() != TRUE) - { - gMain.state = 0; - gTasks[taskId].func = pssData.unk84; - } - break; - } -} - -static bool8 sub_809F5F8(void) -{ - if (pssData.loadGfxState == 0) - { - sub_809FAC8(&pssData.loadedMon); - pssData.loadGfxState++; - return FALSE; - } - else - { - sUnknown_083C1588[pssData.page](&pssData.loadedMon); - return TRUE; - } -} - -static void sub_809F63C(struct Pokemon *mon) -{ - sub_809FE80(); - sub_809FC34(mon); -} - -static void sub_809F650(struct Pokemon *mon) -{ - sub_80A00A4(); - sub_809FF64(mon); -} - -static void sub_809F664(struct Pokemon *mon) -{ - sub_80A0390(); - sub_80A015C(mon); -} - -static void sub_809F678(struct Pokemon *mon) -{ - if (pssData.usingPC == FALSE) - { - struct Pokemon *mons = pssData.monList.partyMons; - *mon = mons[pssData.monIndex]; - } - else - { - struct BoxPokemon *mons = pssData.monList.boxMons; - ExpandBoxMon(&mons[pssData.monIndex], mon); - } -} - -static u8 sub_809F6B4(struct Pokemon *mon, u8 *b) -{ - u16 species; - u32 personality; - u32 otId; - const struct CompressedSpritePalette *palette; - - switch (*b) - { - default: - return sub_80A1808(mon); - case 0: - species = GetMonData(mon, MON_DATA_SPECIES2); - personality = GetMonData(mon, MON_DATA_PERSONALITY); - - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - ewram_addr, - gUnknown_081FAF4C[1], - species, - personality); - *b += 1; - return 0xFF; - case 1: - species = GetMonData(mon, MON_DATA_SPECIES2); - personality = GetMonData(mon, MON_DATA_PERSONALITY); - otId = GetMonData(mon, MON_DATA_OT_ID); - - palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); - LoadCompressedObjectPalette(palette); - GetMonSpriteTemplate_803C56C(palette->tag, 1); - *b += 1; - return 0xFF; - } -} - -static u16 GetMonMove(struct Pokemon *mon, u8 moveId) -{ - switch (moveId) - { - case 0: - return GetMonData(mon, MON_DATA_MOVE1); - case 1: - return GetMonData(mon, MON_DATA_MOVE2); - case 2: - return GetMonData(mon, MON_DATA_MOVE3); - default: - return GetMonData(mon, MON_DATA_MOVE4); - } -} - -static u16 GetMonMovePP(struct Pokemon *mon, u8 moveId) -{ - switch (moveId) - { - case 0: - return GetMonData(mon, MON_DATA_PP1); - case 1: - return GetMonData(mon, MON_DATA_PP2); - case 2: - return GetMonData(mon, MON_DATA_PP3); - default: - return GetMonData(mon, MON_DATA_PP4); - } -} - -static bool8 sub_809F7D0(u8 taskId) -{ - struct Pokemon mon; - u16 move; - - sub_809F678(&mon); - move = GetMonMove(&mon, pssData.selectedMoveIndex); - if (IsHMMove(move) == TRUE && pssData.mode != PSS_MODE_UNKNOWN) - return FALSE; - return TRUE; -} - -void sub_809F814(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - - if (taskData[14] < 4) - { - taskData[14]++; - } - else if (gMain.newKeys & DPAD_UP) - { - gTasks[taskId].func = sub_809E260; - taskData[0] = 4; - taskData[13] = 1; - pssData.selectedMoveIndex = taskData[15]; - sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex); - } - else if (gMain.newKeys & DPAD_DOWN) - { - gTasks[taskId].func = sub_809E260; - taskData[0] = 4; - taskData[13] = 1; - pssData.selectedMoveIndex = taskData[15]; - sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex); - } - else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) - { - if (pssData.page != PSS_PAGE_BATTLE_MOVES) - { - if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) - Menu_EraseWindowRect(0, 14, 9, 18); - - gTasks[taskId].func = sub_809E260; - - SummaryScreenHandleLeftRightInput(taskId, -1); - sub_80A1488(1, taskData[15]); - sub_80A1654(1, taskData[15]); - } - } - else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) - { - if (pssData.page != pssData.lastPage) - { - if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) - Menu_EraseWindowRect(0, 14, 9, 18); - - gTasks[taskId].func = sub_809E260; - - SummaryScreenHandleLeftRightInput(taskId, 1); - sub_80A1488(1, taskData[15]); - sub_80A1654(1, taskData[15]); - } - } - else if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - sub_80A1488(2, taskData[15]); - sub_80A1654(2, taskData[15]); - - gTasks[taskId].func = sub_809E260; - } -} - -static void sub_809F9D0(u8 taskId, u8 b) -{ - s16 *taskData = gTasks[taskId].data; - taskData[14] = 0; - taskData[15] = b; - - sub_80A1488(-2, 4); - sub_80A1654(-2, 4); - Menu_EraseWindowRect(11, 15, 28, 18); - Menu_PrintText(gOtherText_CantForgetHMs, 11, 15); - - gTasks[taskId].func = sub_809F814; -} - -u8 sub_809FA30(void) -{ - return pssData.switchMoveIndex; -} - -// void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d) -// { -// u16 *vramAddr = (u16 *)(VRAM + 0xF000); - -// vramAddr[(d * 32) + c] = (b * 0x1000) + (a * 2) + 0x200 + 0x80; -// vramAddr[(d * 32) + c + 32] = (b * 0x1000) + (a * 2) + 0x200 + 0x81; -// } -__attribute__((naked)) -void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsls r1, 24\n\ - lsls r2, 24\n\ - lsls r3, 24\n\ - lsrs r2, 23\n\ - lsrs r3, 18\n\ - ldr r4, _0809FA70 @ =0x0600f000\n\ - adds r3, r4\n\ - adds r2, r3\n\ - lsrs r1, 12\n\ - lsrs r0, 23\n\ - movs r4, 0x80\n\ - lsls r4, 2\n\ - adds r3, r4, 0\n\ - adds r0, r3\n\ - adds r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, 0x80\n\ - strh r0, [r2]\n\ - adds r2, 0x40\n\ - adds r1, 0x81\n\ - strh r1, [r2]\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0809FA70: .4byte 0x0600f000\n\ - .syntax divided\n"); -} - -void GetStringCenterAlignXOffset(u8 a, u8 b, u8 c) -{ - GetStringCenterAlignXOffsetWithLetterSpacing(a, 15, b, c); -} - -bool8 sub_809FA94(struct Pokemon *mon) -{ - if (!IsShiny(mon)) - { - LoadPalette(sUnknown_083C157C, 4, 2); - return FALSE; - } - else - { - LoadPalette(sUnknown_083C157E, 4, 2); - return TRUE; - } -} - -static void sub_809FAC8(struct Pokemon *mon) -{ - bool8 shinyDexNum; - u16 dexNum; - u8 *buffer; - - if (GetMonData(mon, MON_DATA_IS_EGG)) - { - Menu_EraseWindowRect(1, 2, 4, 3); - Menu_EraseWindowRect(3, 16, 9, 17); - Menu_EraseWindowRect(0, 12, 11, 15); - GetMonNickname(mon, gStringVar1); - sub_80A1FF8(gStringVar1, 13, 3, 16); - LoadPalette(sUnknown_083C157C, 4, 2); - } - else - { - shinyDexNum = sub_809FA94(mon); - dexNum = SpeciesToPokedexNum(GetMonData(mon, MON_DATA_SPECIES)); - if (dexNum != 0xFFFF) - { - if (!shinyDexNum) - { - GetStringCenterAlignXOffset(2, 1, 2); - sub_80A1F98(dexNum, 13, 3, 2, 17, 16, 1); - } - else - { - GetStringCenterAlignXOffsetWithLetterSpacing(2, 8, 1, 2); - sub_80A1F98(dexNum, 8, 3, 2, 17, 16, 1); - } - } - else - { - Menu_EraseWindowRect(1, 2, 4, 3); - } - - buffer = gStringVar1; - buffer = sub_80A1E58(buffer, 13); - buffer = GetMonNickname(mon, buffer); - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x13; - buffer[2] = 0x3C; - buffer[3] = EOS; - Menu_PrintText(gStringVar1, 1, 12); - - sub_80A0958(mon); - } -} - -static void sub_809FBE4(void) -{ - u8 i; - - for (i = 0; i < 28; i++) - sub_80A1918(i, 1); - - Menu_EraseWindowRect(11, 4, 29, 18); -} - -static void sub_809FC0C(void) -{ - Menu_PrintText(gOtherText_Type2, 11, 6); - GetStringCenterAlignXOffset(0, 22, 4); - GetStringCenterAlignXOffset(2, 23, 4); -} - -static void sub_809FC34(struct Pokemon *mon) -{ - u8 i; - u8 *buffer; - u16 friendship; - u8 language; - u16 species; - u8 ability; - - for (i = 0; i < 5; i++) - sub_80A1918(i, 1); - - Menu_EraseWindowRect(11, 9, 28, 12); - if (GetMonData(mon, MON_DATA_IS_EGG)) - { - buffer = gStringVar1; - buffer = sub_80A1E58(buffer, 13); - buffer = StringCopy(buffer, gOtherText_OriginalTrainer); - buffer = StringCopy(buffer, gOtherText_FiveQuestions); - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x13; - buffer[2] = 0x4E; - buffer[3] = EOS; - Menu_PrintText(gStringVar1, 11, 4); - - sub_80A1EF8(gOtherText_FiveQuestions, 13, 193, 32, 1); - sub_80A198C(9, 120, 48, 0); - - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); - if (friendship < 6) - Menu_PrintText(gOtherText_EggAbout, 11, 9); - else if (friendship < 11) - Menu_PrintText(gOtherText_EggSoon, 11, 9); - else if (friendship < 41) - Menu_PrintText(gOtherText_EggSomeTime, 11, 9); - else - Menu_PrintText(gOtherText_EggLongTime, 11, 9); - - PokemonSummaryScreen_PrintEggTrainerMemo(mon, 11, 14); - } - else - { - GetMonData(mon, MON_DATA_OT_NAME, gStringVar2); - language = GetMonData(mon, MON_DATA_LANGUAGE); - ConvertInternationalString(gStringVar2, language); - - buffer = gStringVar1; - buffer = sub_80A1E58(buffer, 13); - buffer = StringCopy(buffer, gOtherText_OriginalTrainer); - - if (GetMonData(mon, MON_DATA_OT_GENDER) == MALE) - buffer = sub_80A1E58(buffer, 9); - else - buffer = sub_80A1E58(buffer, 10); - - buffer = StringCopy(buffer, gStringVar2); - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x13; - buffer[2] = 0x4E; - buffer[3] = EOS; - Menu_PrintText(gStringVar1, 11, 4); - - sub_80A1F98(GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF, 13, 5, 2, 193, 32, 1); - - species = GetMonData(mon, MON_DATA_SPECIES); - sub_80A198C(gBaseStats[species].type1, 120, 48, 0); - if (gBaseStats[species].type1 != gBaseStats[species].type2) - sub_80A198C(gBaseStats[species].type2, 160, 48, 1); - - ability = GetAbilityBySpecies(GetMonData(mon, MON_DATA_SPECIES), GetMonData(mon, MON_DATA_ALT_ABILITY)); - sub_80A1FF8(gAbilityNames[ability], 13, 11, 9); - Menu_PrintText(gAbilityDescriptions[ability], 11, 11); - - PokemonSummaryScreen_PrintTrainerMemo(mon, 11, 14); - } -} - -static void sub_809FE6C(struct Pokemon *mon) -{ - sub_809FC0C(); - sub_809FC34(mon); -} - -static void sub_809FE80(void) -{ - Menu_EraseWindowRect(14, 4, 18, 5); - Menu_EraseWindowRect(25, 4, 30, 5); - Menu_EraseWindowRect(11, 9, 28, 12); - Menu_EraseWindowRect(11, 14, 28, 17); -} - -static void sub_809FEB8(void) -{ - sub_80A1FF8(gOtherText_ExpPoints, 13, 11, 14); - sub_80A1FF8(gOtherText_NextLv, 13, 11, 16); - Menu_PrintText(gOtherText_Terminator18, 21, 16); - - sub_80A1F48(gOtherText_HP, 13, 11, 7, 42); - sub_80A1F48(gOtherText_Attack, 13, 11, 9, 42); - sub_80A1F48(gOtherText_Defense, 13, 11, 11, 42); - sub_80A1F48(gOtherText_SpAtk, 13, 22, 7, 36); - sub_80A1F48(gOtherText_SpDef, 13, 22, 9, 36); - sub_80A1F48(gOtherText_Speed, 13, 22, 11, 36); -} - -static void sub_809FF64(struct Pokemon *mon) -{ - u8 i; - u16 heldItem; - u8 *buffer; - - for (i = 0; i < 5; i++) - sub_80A1918(i, 1); - - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); - PrintHeldItemName(heldItem, 11, 4); - PrintNumRibbons(mon); - - buffer = gStringVar1; - - ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_EXP)); - MenuPrint_RightAligned(buffer, 29, 14); - DrawExperienceProgressBar(mon, 23, 16); - - ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_ATK)); - sub_8072BD8(buffer, 16, 9, 50); - - ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_DEF)); - sub_8072BD8(buffer, 16, 11, 50); - - ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPATK)); - sub_8072BD8(buffer, 27, 7, 18); - - ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPDEF)); - sub_8072BD8(buffer, 27, 9, 18); - - ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPEED)); - sub_8072BD8(buffer, 27, 11, 18); - - buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_HP), 24, 1); - *buffer++ = CHAR_SLASH; - buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_MAX_HP), 48, 1); - - Menu_PrintTextPixelCoords(gStringVar1, 126, 56, 1); -} - -static void sub_80A0090(struct Pokemon *mon) -{ - sub_809FEB8(); - sub_809FF64(mon); -} - -static void sub_80A00A4(void) -{ - Menu_EraseWindowRect(11, 4, 19, 5); - Menu_EraseWindowRect(16, 7, 21, 8); - Menu_EraseWindowRect(17, 9, 21, 12); - Menu_EraseWindowRect(27, 7, 29, 12); - Menu_EraseWindowRect(22, 14, 28, 15); - Menu_EraseWindowRect(23, 16, 28, 17); -} - -static void sub_80A00F4(u8 a) -{ - if (pssData.moveToLearn != 0 || a != 4) - { - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - { - sub_80A1FF8(gOtherText_Power2, 13, 1, 15); - sub_80A1FF8(gOtherText_Accuracy2, 13, 1, 17); - } - else - { - sub_80A1FF8(gOtherText_Appeal2, 13, 1, 15); - sub_80A1FF8(gOtherText_Jam2, 13, 1, 17); - } - } -} - -static void sub_80A015C(struct Pokemon *mon) -{ - u8 i; - u16 move; - u16 curPP; - u8 ppBonuses; - u8 maxPP; - u8 *buffer; - - for (i = 0; i < 4; i++) - { - move = GetMonMove(mon, i); - curPP = GetMonMovePP(mon, i); - - if (move == 0) - { - sub_80A1918(i, 1); - sub_80A1FF8(gOtherText_OneDash, 13, 15, (2 * i) + 4); - Menu_PrintText(gOtherText_TwoDashes, 26, (2 * i) + 4); - } - else - { - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - sub_80A198C(gBattleMoves[move].type, 87, ((2 * i) + 4) * 8, i); - else - sub_80A198C(gContestMoves[move].contestCategory + 18, 87, ((2 * i) + 4) * 8, i); - - sub_80A1FF8(gMoveNames[move], 13, 15, (2 * i) + 4); - GetStringCenterAlignXOffset(1, 24, (2 * i) + 4); - - ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); - maxPP = CalculatePPWithBonus(move, ppBonuses, i); - - buffer = gStringVar1; - buffer = sub_8072C14(buffer, curPP, 14, 1); - *buffer++ = CHAR_SLASH; - sub_8072C14(buffer, maxPP, 32, 1); - Menu_PrintText(gStringVar1, 25, (2 * i) + 4); - } - } -} - -static void sub_80A029C(struct Pokemon *mon) -{ - u8 *buffer; - u16 move; - u8 pp; - - if (pssData.moveToLearn == 0) - { - sub_80A1FF8(gOtherText_CancelNoTerminator, 13, 15, 12); - return; - } - - move = pssData.moveToLearn; - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - sub_80A198C(gBattleMoves[move].type, 87, 96, 4); - else - sub_80A198C(gContestMoves[move].contestCategory + 18, 87, 96, 4); - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - sub_80A1FF8(gMoveNames[move], 10, 15, 12); - else - sub_80A1FF8(gMoveNames[move], 9, 15, 12); - - GetStringCenterAlignXOffset(1, 24, 12); - - buffer = gStringVar1; - pp = gBattleMoves[move].pp; - buffer = sub_8072C14(buffer, pp, 14, 1); - *buffer++ = CHAR_SLASH; - buffer = sub_8072C14(buffer, pp, 32, 1); - Menu_PrintText(gStringVar1, 25, 12); -} - -static void sub_80A0390(void) -{ - u8 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - Menu_EraseWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5); -} - -u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex) -{ - u16 move; - - if (selectedMoveIndex != MAX_MON_MOVES) - { - move = GetMonMove(mon, selectedMoveIndex); - } - else - { - if (pssData.moveToLearn != 0) - move = pssData.moveToLearn; - else - move = 0xFFFF; - } - - return move; -} - -void sub_80A03F0(struct Pokemon *mon, u8 *selectedMoveIndex) -{ - u16 move = sub_80A03BC(mon, *selectedMoveIndex); - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - { - sub_80A04CC(move); - sub_80A057C(0xFFFF); - } - else - { - sub_80A057C(move); - } -} - -static void sub_80A0428(struct Pokemon *mon, u8 *selectedMoveIndex) -{ - u16 move = sub_80A03BC(mon, *selectedMoveIndex); - Menu_EraseWindowRect(11, 15, 28, 18); - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - sub_80A046C(move); - else - sub_80A0498(move); - - sub_80A03F0(mon, selectedMoveIndex); -} - -static void sub_80A046C(u16 move) -{ - if (move != 0xFFFF) - Menu_PrintText(gMoveDescriptions[move - 1], 11, 15); -} - -static void sub_80A0498(u16 move) -{ - if (move != 0xFFFF) - Menu_PrintText(gContestEffectStrings[gContestMoves[move].effect], 11, 15); -} - -static void sub_80A04CC(u16 move) -{ - u8 *buffer; - - if (move != 0xFFFF) - { - if (gBattleMoves[move].power <= 1) - { - buffer = gStringVar1; - buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); - Menu_PrintText(gStringVar1, 7, 15); - } - else - { - buffer = gStringVar1; - buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1); - Menu_PrintText(gStringVar1, 7, 15); - } - - if (gBattleMoves[move].accuracy == 0) - { - buffer = gStringVar1; - buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); - Menu_PrintText(gStringVar1, 7, 17); - } - else - { - buffer = gStringVar1; - buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1); - Menu_PrintText(gStringVar1, 7, 17); - } - } -} - -#ifdef NONMATCHING // The two vramAddr lines are non-matching. -static void sub_80A057C(u16 move) -{ - u8 appeal; - u8 jam; - u8 i; - u16 *vramAddr = (u16 *)(VRAM + 0x6800); - - if (move == 0xFFFF) return; - - appeal = gContestEffects[gContestMoves[move].effect].appeal; - if (appeal != 0xFF) - appeal = appeal / 10; - - for (i = 0; i < 8; i++) - { - u16 tile = 0x1039; - int and = 3; - int offset = 0x3CC / 2; - if (appeal != 0xFF && i < appeal) - tile = 0x103A; - - *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile; - } - - if (move == 0xFFFF) return; - - jam = gContestEffects[gContestMoves[move].effect].jam; - if (jam != 0xFF) - { - jam = jam / 10; - } - - for (i = 0; i < 8; i++) - { - u16 tile = 0x103D; - int and = 3; - int offset = 0x226; - if (jam != 0xFF && i < jam) - { - tile = 0x103C; - } - - *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile; - } -} -#else -__attribute__((naked)) -static void sub_80A057C(u16 move) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - ldr r0, _080A0648 @ =0x06006800\n\ - mov r8, r0\n\ - ldr r0, _080A064C @ =0x0000ffff\n\ - cmp r5, r0\n\ - beq _080A063A\n\ - ldr r1, _080A0650 @ =gContestEffects\n\ - ldr r2, _080A0654 @ =gContestMoves\n\ - lsls r3, r5, 3\n\ - adds r0, r3, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x1]\n\ - mov r10, r2\n\ - mov r9, r3\n\ - cmp r4, 0xFF\n\ - beq _080A05B8\n\ - adds r0, r4, 0\n\ - movs r1, 0xA\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ -_080A05B8:\n\ - movs r2, 0\n\ - movs r7, 0x3\n\ - movs r6, 0xF3\n\ - lsls r6, 2\n\ -_080A05C0:\n\ - ldr r3, _080A0658 @ =0x00001039\n\ - cmp r4, 0xFF\n\ - beq _080A05CC\n\ - cmp r2, r4\n\ - bcs _080A05CC\n\ - adds r3, 0x1\n\ -_080A05CC:\n\ - lsrs r0, r2, 2\n\ - lsls r0, 5\n\ - adds r1, r2, 0\n\ - ands r1, r7\n\ - adds r1, r0\n\ - lsls r1, 1\n\ - add r1, r8\n\ - adds r1, r6\n\ - strh r3, [r1]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r2, 0x7\n\ - bls _080A05C0\n\ - ldr r0, _080A064C @ =0x0000ffff\n\ - cmp r5, r0\n\ - beq _080A063A\n\ - mov r0, r9\n\ - add r0, r10\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - ldr r1, _080A0650 @ =gContestEffects\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x2]\n\ - cmp r4, 0xFF\n\ - beq _080A060C\n\ - adds r0, r4, 0\n\ - movs r1, 0xA\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ -_080A060C:\n\ - movs r2, 0\n\ - movs r6, 0x3\n\ - ldr r5, _080A065C @ =0x0000044c\n\ -_080A0612:\n\ - ldr r3, _080A0660 @ =0x0000103d\n\ - cmp r4, 0xFF\n\ - beq _080A061E\n\ - cmp r2, r4\n\ - bcs _080A061E\n\ - subs r3, 0x1\n\ -_080A061E:\n\ - lsrs r0, r2, 2\n\ - lsls r0, 5\n\ - adds r1, r2, 0\n\ - ands r1, r6\n\ - adds r1, r0\n\ - lsls r1, 1\n\ - add r1, r8\n\ - adds r1, r5\n\ - strh r3, [r1]\n\ - adds r0, r2, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r2, 0x7\n\ - bls _080A0612\n\ -_080A063A:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A0648: .4byte 0x06006800\n\ -_080A064C: .4byte 0x0000ffff\n\ -_080A0650: .4byte gContestEffects\n\ -_080A0654: .4byte gContestMoves\n\ -_080A0658: .4byte 0x00001039\n\ -_080A065C: .4byte 0x0000044c\n\ -_080A0660: .4byte 0x0000103d\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon) -{ - u32 trainerId; - - if (ewram18000_3 == gEnemyParty) - { - u8 enemyId = GetMultiplayerId() ^ 1; - trainerId = gLinkPlayers[enemyId].trainerId & 0xFFFF; - StringCopy(gStringVar1, gLinkPlayers[enemyId].name); - Text_StripExtCtrlCodes(gStringVar1); - } - else - { - trainerId = GetPlayerTrainerId() & 0xFFFF; - StringCopy(gStringVar1, gSaveBlock2.playerName); - } - - if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF)) - return FALSE; - - GetMonData(mon, MON_DATA_OT_NAME, gStringVar2); - - if (!StringCompareWithoutExtCtrlCodes(gStringVar1, gStringVar2)) - return TRUE; - - return FALSE; -} - -static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top) -{ - u8 locationMet; - u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME); - - if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) - { - Menu_PrintText(gOtherText_EggObtainedInTrade, left, top); - return; - } - - locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); - - if (locationMet == 255) - { - // Eggs received from Pokemon Box. - Menu_PrintText(gOtherText_EggNicePlace, left, top); - return; - } - - if (!PokemonSummaryScreen_CheckOT(mon)) - { - Menu_PrintText(gOtherText_EggObtainedInTrade, left, top); - return; - } - - asm(""); // needed to match for some reason - - if (locationMet == 253) - { - Menu_PrintText(gOtherText_EggHotSprings, left, top); - return; - } - - Menu_PrintText(gOtherText_EggDayCare, left, top); -} - -static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left, u8 top) -{ - u8 locationMet; - u8 gameMet; - u8 *ptr = gStringVar4; - u8 nature = GetNature(mon); - -#if ENGLISH - ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); - if (nature != NATURE_BOLD && nature != NATURE_GENTLE) - ptr = StringCopy(ptr, gOtherText_Terminator4); - ptr = StringCopy(ptr, gOtherText_Nature); -#elif GERMAN - ptr = StringCopy(gStringVar4, gOtherText_Nature); - ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); - ptr = StringCopy(ptr, gOtherText_Terminator4); -#endif - - if (PokemonSummaryScreen_CheckOT(mon) == TRUE) - { - locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); - - if (GetMonData(mon, MON_DATA_MET_LEVEL) == 0) - { - ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5); - *ptr = CHAR_NEWLINE; - ptr++; - - CopyLocationName(gStringVar1, locationMet); - ptr = sub_80A1E9C(ptr, gStringVar1, 14); - StringCopy(ptr, gOtherText_Egg2); - } - else if (locationMet >= 88) - { - *ptr = CHAR_NEWLINE; - ptr++; - - StringCopy(ptr, gOtherText_ObtainedInTrade); - } - else - { - u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); - - ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); - *ptr = CHAR_NEWLINE; - ptr++; - - CopyLocationName(gStringVar1, locationMet); - ptr = sub_80A1E9C(ptr, gStringVar1, 14); - StringCopy(ptr, gOtherText_Met); - } - } - else - { - gameMet = GetMonData(mon, MON_DATA_MET_GAME); - - if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) - { - *ptr = CHAR_NEWLINE; - ptr++; - - StringCopy(ptr, gOtherText_ObtainedInTrade); - } - else - { - locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); - if (locationMet == 0xFF) - { - u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); - - ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); - *ptr = CHAR_NEWLINE; - ptr++; - - StringCopy(ptr, gOtherText_FatefulEncounter); - } - else if (locationMet >= 88) - { - *ptr = CHAR_NEWLINE; - ptr++; - - StringCopy(ptr, gOtherText_ObtainedInTrade); - } - else - { - u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); - - ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); - *ptr = CHAR_NEWLINE; - ptr++; - - CopyLocationName(gStringVar1, locationMet); - ptr = sub_80A1E9C(ptr, gStringVar1, 14); - StringCopy(ptr, gOtherText_Met2); - } - } - } - - Menu_PrintText(gStringVar4, left++, top++); -} - -static void sub_80A0958(struct Pokemon *mon) -{ - u16 species; - u8 *buffer; - u8 level; - - species = GetMonData(mon, MON_DATA_SPECIES); - - buffer = gStringVar1; - buffer = sub_80A1E58(buffer, 13); - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x11; - buffer[2] = 0x7; - buffer[3] = CHAR_SLASH; - buffer += 4; - buffer = StringCopy(buffer, gSpeciesNames[species]); - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x13; - buffer[2] = 0x50; - buffer[3] = EOS; - - Menu_PrintText(gStringVar1, 0, 14); - Menu_EraseWindowRect(3, 16, 9, 17); - - level = GetMonData(mon, MON_DATA_LEVEL); - - buffer = sub_80A1E58(gStringVar1, 13); - buffer[0] = 0x34; - buffer += 1; - buffer = ConvertIntToDecimalString(buffer, level); - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x13; - buffer[2] = 0x20; - buffer[3] = EOS; - - Menu_PrintText(gStringVar1, 3, 16); - sub_80A0A2C(mon, 7, 16); -} - -static void sub_80A0A2C(struct Pokemon *mon, u8 left, u8 top) -{ - const u8 *genderSymbol; - u8 var1; - u8 bottom; - u16 species = GetMonData(mon, MON_DATA_SPECIES2); - - if (species != SPECIES_NIDORAN_M && species != SPECIES_NIDORAN_F) - { - u8 gender = GetMonGender(mon); - switch (gender) - { - default: - bottom = top + 1; - Menu_EraseWindowRect(left, top, left, bottom); - return; - case MON_MALE: - genderSymbol = gOtherText_MaleSymbol2; - var1 = 11; - break; - case MON_FEMALE: - genderSymbol = gOtherText_FemaleSymbolAndLv; - var1 = 12; - break; - } - - sub_80A1FF8(genderSymbol, var1, left, top); - } -} - -u8 GetNumRibbons(struct Pokemon *mon) -{ - u8 numRibbons = GetMonData(mon, MON_DATA_COOL_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_BEAUTY_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_CUTE_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_SMART_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_TOUGH_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_CHAMPION_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_WINNING_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_VICTORY_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_ARTIST_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_EFFORT_RIBBON); - numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_1); - numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_2); - numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_3); - numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_4); - numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_5); - numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_6); - numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_7); - - return numRibbons; -} - -static void PrintNumRibbons(struct Pokemon *mon) -{ - u8 numRibbons = GetNumRibbons(mon); - - if (numRibbons == 0) - { - StringCopy(gStringVar1, gOtherText_None); - } - else - { - u8 ribbonsStringLength; - u8 *text; - - StringCopy(gStringVar1, gOtherText_Ribbons00); - ribbonsStringLength = StringLength(gStringVar1); - - text = &gStringVar1[ribbonsStringLength - 2]; - - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 0x14; - text[2] = 6; - ConvertIntToDecimalStringN(&text[3], numRibbons, 1, 2); - } - - Menu_PrintText(sUnknown_083C15AE, 21, 4); -} - -static void PrintHeldItemName(u16 itemId, u8 left, u8 top) -{ - if (itemId == ITEM_ENIGMA_BERRY - && sub_80F9344() == TRUE - && IsLinkDoubleBattle() == TRUE - && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5)) - StringCopy(gStringVar1, ItemId_GetName(itemId)); - else if (itemId == 0) - StringCopy(gStringVar1, gOtherText_None); - else - CopyItemName(itemId, gStringVar1); - - Menu_PrintText(sUnknown_083C15B4, left, top); -} - -static void DrawExperienceProgressBar(struct Pokemon *mon, u8 left, u8 top) -{ - u32 curExperience; - u8 level; - u16 species; - u8 i; - u16 *vramAddr; - u32 expToNextLevel = 0; - s64 numExpProgressBarTicks = 0; - - curExperience = GetMonData(mon, MON_DATA_EXP); - level = GetMonData(mon, MON_DATA_LEVEL); - species = GetMonData(mon, MON_DATA_SPECIES); - - // The experience progress bar is shown as empty when the Pokemon is already level 100. - if (level < 100) - { - u32 nextLevelExp; - u32 expSinceLastLevel; - u32 expBetweenLevels; - u32 curLevelExperience; - - nextLevelExp = gExperienceTables[gBaseStats[species].growthRate][level + 1]; - expToNextLevel = nextLevelExp - curExperience; - curLevelExperience = gExperienceTables[gBaseStats[species].growthRate][level]; - expBetweenLevels = (nextLevelExp - curLevelExperience); - expSinceLastLevel = curExperience - curLevelExperience; - - // Calculate the number of 1-pixel "ticks" to illuminate in the experience progress bar. - // There are 8 tiles that make up the bar, and each tile has 8 "ticks". Hence, the numerator - // is multiplied by 64. - numExpProgressBarTicks = (expSinceLastLevel * 64) / expBetweenLevels; - if (numExpProgressBarTicks == 0 && expSinceLastLevel != 0) - { - // Ensure sure some exp. gain is visible in the progress bar. - numExpProgressBarTicks = 1; - } - } - - ConvertIntToDecimalString(gStringVar1, expToNextLevel); - MenuPrint_RightAligned(gStringVar1, left + 6, top); - - - // Draw each of the 8 tiles that make up the experience progress bar. - vramAddr = (u16 *)(VRAM + 0x4CAA); - for (i = 0; i < 8; i++) - { - u16 tile; - u16 baseTile = 0x2062; - - if (numExpProgressBarTicks > 7) - tile = 0x206A; // full exp. bar block - else - tile = (numExpProgressBarTicks % 8) + baseTile; - - vramAddr[i] = tile; - - numExpProgressBarTicks -= 8; - if (numExpProgressBarTicks < 0) - { - numExpProgressBarTicks = 0; - } - } -} - -// Prints the text displayed in the top-left or top-right of the screen. -// Each of the 4 summary screens displays different text. -static void PrintSummaryWindowHeaderText(void) -{ - u8 *buffer = gStringVar1; - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x12; - buffer[2] = 0x2; - - buffer += 3; - buffer = sub_80A1E58(buffer, 13); - buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerTextId]); - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x13; - buffer[2] = 0x58; - buffer[3] = EOS; - - Menu_PrintText(gStringVar1, 0, 0); - - if (pssData.headerActionTextId != 0) - { - GetStringCenterAlignXOffset(5, 23, 0); - GetStringCenterAlignXOffset(6, 24, 0); - } - else - { - Menu_EraseWindowRect(23, 0, 24, 1); - } - - buffer = gStringVar1; - buffer = sub_80A1E58(buffer, 13); - buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerActionTextId]); - - buffer[0] = EXT_CTRL_CODE_BEGIN; - buffer[1] = 0x13; - buffer[2] = 0x28; - buffer[3] = EOS; - - Menu_PrintText(gStringVar1, 25, 0); -} - -// If the given pokemon previously had the pokerus virus, a small -// dot will be drawn in between the pokeball and the mon's level. -static void DrawPokerusSurvivorDot(struct Pokemon *mon) -{ - u16 *vram1 = (u16 *)(VRAM + 0xE444); - u16 *vram2 = (u16 *)(VRAM + 0xEC44); - - if (!CheckPartyPokerus(mon, 0) && CheckPartyHasHadPokerus(mon, 0)) - { - *vram1 = 0x2C; - *vram2 = 0x2C; - } - else - { - *vram1 = 0x081A; - *vram2 = 0x081A; - } -} - -// Draws the 4 small navigation circles at the top of the pokemon summary screen. -#ifdef NONMATCHING -static void DrawSummaryScreenNavigationDots(void) -{ - void *dest; - u16 arr[8]; - u8 i = 0; - struct PokemonSummaryScreenStruct *SS = (struct PokemonSummaryScreenStruct *)(gSharedMem + 0x18000); - u16 var1 = 0x4040; - u16 var2 = 0x404A; - - for (i = 0; i < 4; i++) - { - if (i < SS->unk75) - { - arr[i * 2] = var1; - arr[(i * 2) + 1] = var1 + 1; - } - else if (i > SS->unk76) - { - arr[i * 2] = var2; - arr[(i * 2) + 1] = var2 + 1; - } - else - { - if (i < SS->unkB) - { - arr[i * 2] = 0x4046; - arr[(i * 2) + 1] = 0x4046 + 1; - } - - if (i == SS->unkB) - { - if (i != SS->unk76) - { - arr[i * 2] = 0x4041; - arr[(i * 2) + 1] = 0x4041 + 1; - } - else - { - arr[i * 2] = 0x404B; - arr[(i * 2) + 1] = 0x404B + 1; - } - } - - if (i > SS->unkB) - { - if (i != SS->unk76) - { - arr[i * 2] = 0x4043; - arr[(i * 2) + 1] = 0x4043 + 1; - } - else - { - arr[i * 2] = 0x4048; - arr[(i * 2) + 1] = 0x4048 + 1; - } - } - } - } - - DmaCopy16Defvars(3, arr, (void *)(VRAM + 0xE016), 16); - - for (i = 0; i < 8; i++) - { - arr[i] += 0x10; - } - - DmaCopy16Defvars(3, arr, (void *)(VRAM + 0xE056), 16); -} -#else -__attribute__((naked)) -static void DrawSummaryScreenNavigationDots(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x10\n\ - movs r3, 0\n\ - ldr r6, _080A0F24 @ =gSharedMem + 0x18000\n\ - adds r5, r6, 0\n\ - ldr r1, _080A0F28 @ =0x00004040\n\ - mov r8, r1\n\ - ldr r2, _080A0F2C @ =0x0000404a\n\ - mov r10, r2\n\ -_080A0F02:\n\ - adds r0, r5, 0\n\ - adds r0, 0x75\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - bcs _080A0F30\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - add r0, sp\n\ - mov r4, r8\n\ - strh r4, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - mov r7, sp\n\ - adds r0, r7, r1\n\ - strh r4, [r0]\n\ - b _080A0FE2\n\ - .align 2, 0\n\ -_080A0F24: .4byte gSharedMem + 0x18000\n\ -_080A0F28: .4byte 0x00004040\n\ -_080A0F2C: .4byte 0x0000404a\n\ -_080A0F30:\n\ - movs r0, 0x76\n\ - adds r0, r6\n\ - mov r12, r0\n\ - ldrb r1, [r0]\n\ - cmp r3, r1\n\ - bls _080A0F52\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - add r0, sp\n\ - mov r2, r10\n\ - strh r2, [r0]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - mov r4, sp\n\ - adds r0, r4, r1\n\ - strh r2, [r0]\n\ - b _080A0FE2\n\ -_080A0F52:\n\ - ldrb r4, [r5, 0xB]\n\ - cmp r3, r4\n\ - bcs _080A0F6E\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r7, sp\n\ - adds r2, r7, r0\n\ - ldr r0, _080A0F88 @ =0x00004046\n\ - strh r0, [r2]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - add r1, sp\n\ - adds r0, 0x1\n\ - strh r0, [r1]\n\ -_080A0F6E:\n\ - cmp r3, r4\n\ - bne _080A0FA6\n\ - mov r0, r12\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - beq _080A0F90\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r4, sp\n\ - adds r2, r4, r0\n\ - ldr r0, _080A0F8C @ =0x00004041\n\ - b _080A0F9A\n\ - .align 2, 0\n\ -_080A0F88: .4byte 0x00004046\n\ -_080A0F8C: .4byte 0x00004041\n\ -_080A0F90:\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r7, sp\n\ - adds r2, r7, r0\n\ - ldr r0, _080A0FC4 @ =0x0000404b\n\ -_080A0F9A:\n\ - strh r0, [r2]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - add r1, sp\n\ - adds r0, 0x1\n\ - strh r0, [r1]\n\ -_080A0FA6:\n\ - ldrb r0, [r5, 0xB]\n\ - cmp r3, r0\n\ - bls _080A0FE2\n\ - adds r0, r6, 0\n\ - adds r0, 0x76\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - beq _080A0FCC\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r4, sp\n\ - adds r2, r4, r0\n\ - ldr r0, _080A0FC8 @ =0x00004043\n\ - b _080A0FD6\n\ - .align 2, 0\n\ -_080A0FC4: .4byte 0x0000404b\n\ -_080A0FC8: .4byte 0x00004043\n\ -_080A0FCC:\n\ - lsls r1, r3, 1\n\ - lsls r0, r3, 2\n\ - mov r7, sp\n\ - adds r2, r7, r0\n\ - ldr r0, _080A1034 @ =0x00004048\n\ -_080A0FD6:\n\ - strh r0, [r2]\n\ - adds r1, 0x1\n\ - lsls r1, 1\n\ - add r1, sp\n\ - adds r0, 0x1\n\ - strh r0, [r1]\n\ -_080A0FE2:\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x3\n\ - bls _080A0F02\n\ - ldr r1, _080A1038 @ =0x0600e016\n\ - ldr r0, _080A103C @ =0x040000d4\n\ - mov r2, sp\n\ - str r2, [r0]\n\ - str r1, [r0, 0x4]\n\ - ldr r1, _080A1040 @ =0x80000008\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - movs r3, 0\n\ -_080A0FFE:\n\ - lsls r0, r3, 1\n\ - mov r4, sp\n\ - adds r1, r4, r0\n\ - ldrh r0, [r1]\n\ - adds r0, 0x10\n\ - strh r0, [r1]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r3, 0x7\n\ - bls _080A0FFE\n\ - ldr r1, _080A1044 @ =0x0600e056\n\ - ldr r0, _080A103C @ =0x040000d4\n\ - str r4, [r0]\n\ - str r1, [r0, 0x4]\n\ - ldr r1, _080A1040 @ =0x80000008\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - add sp, 0x10\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A1034: .4byte 0x00004048\n\ -_080A1038: .4byte 0x0600e016\n\ -_080A103C: .4byte 0x040000d4\n\ -_080A1040: .4byte 0x80000008\n\ -_080A1044: .4byte 0x0600e056\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -__attribute__((naked)) -void sub_80A1048(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - lsls r0, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - ldr r1, _080A10A0 @ =gTasks + 0x8\n\ - adds r6, r0, r1\n\ - ldrh r0, [r6]\n\ - ldrh r1, [r6, 0x2]\n\ - adds r0, r1\n\ - strh r0, [r6, 0x2]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080A106E\n\ - b _080A1224\n\ -_080A106E:\n\ - movs r5, 0x2\n\ - ldrsh r2, [r6, r5]\n\ - ldr r0, _080A10A4 @ =0x0000024a\n\ - subs r0, r2\n\ - lsls r0, 1\n\ - ldr r1, _080A10A8 @ =gUnknown_08E73508\n\ - adds r4, r0, r1\n\ - ldr r5, _080A10AC @ =0x0600e480\n\ - lsls r2, 1\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - adds r7, r1, 0\n\ - cmp r2, r0\n\ - bhi _080A10B4\n\ - ldr r0, _080A10B0 @ =0x040000d4\n\ - str r4, [r0]\n\ - str r5, [r0, 0x4]\n\ - lsrs r1, r2, 1\n\ - movs r2, 0x80\n\ - lsls r2, 24\n\ - orrs r1, r2\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - b _080A10E0\n\ - .align 2, 0\n\ -_080A10A0: .4byte gTasks + 0x8\n\ -_080A10A4: .4byte 0x0000024a\n\ -_080A10A8: .4byte gUnknown_08E73508\n\ -_080A10AC: .4byte 0x0600e480\n\ -_080A10B0: .4byte 0x040000d4\n\ -_080A10B4:\n\ - ldr r3, _080A110C @ =0x040000d4\n\ - str r4, [r3]\n\ - str r5, [r3, 0x4]\n\ - ldr r0, _080A1110 @ =0x80000800\n\ - str r0, [r3, 0x8]\n\ - ldr r0, [r3, 0x8]\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - adds r4, r0\n\ - adds r5, r0\n\ - ldr r1, _080A1114 @ =0xfffff000\n\ - adds r2, r1\n\ - cmp r2, r0\n\ - bhi _080A10B4\n\ - str r4, [r3]\n\ - str r5, [r3, 0x4]\n\ - lsrs r0, r2, 1\n\ - movs r1, 0x80\n\ - lsls r1, 24\n\ - orrs r0, r1\n\ - str r0, [r3, 0x8]\n\ - ldr r0, [r3, 0x8]\n\ -_080A10E0:\n\ - movs r5, 0x2\n\ - ldrsh r0, [r6, r5]\n\ - ldr r1, _080A1118 @ =0x0000026a\n\ - subs r1, r0\n\ - lsls r1, 1\n\ - adds r3, r1, r7\n\ - ldr r4, _080A111C @ =0x0600e4c0\n\ - lsls r1, r0, 1\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - cmp r1, r0\n\ - bhi _080A1120\n\ - ldr r0, _080A110C @ =0x040000d4\n\ - str r3, [r0]\n\ - str r4, [r0, 0x4]\n\ - lsrs r1, 1\n\ - movs r2, 0x80\n\ - lsls r2, 24\n\ - orrs r1, r2\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - b _080A114C\n\ - .align 2, 0\n\ -_080A110C: .4byte 0x040000d4\n\ -_080A1110: .4byte 0x80000800\n\ -_080A1114: .4byte 0xfffff000\n\ -_080A1118: .4byte 0x0000026a\n\ -_080A111C: .4byte 0x0600e4c0\n\ -_080A1120:\n\ - ldr r2, _080A1178 @ =0x040000d4\n\ - str r3, [r2]\n\ - str r4, [r2, 0x4]\n\ - ldr r0, _080A117C @ =0x80000800\n\ - str r0, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - adds r3, r0\n\ - adds r4, r0\n\ - ldr r5, _080A1180 @ =0xfffff000\n\ - adds r1, r5\n\ - cmp r1, r0\n\ - bhi _080A1120\n\ - str r3, [r2]\n\ - str r4, [r2, 0x4]\n\ - lsrs r0, r1, 1\n\ - movs r1, 0x80\n\ - lsls r1, 24\n\ - orrs r0, r1\n\ - str r0, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ -_080A114C:\n\ - movs r1, 0x2\n\ - ldrsh r0, [r6, r1]\n\ - ldr r1, _080A1184 @ =0x0000024a\n\ - subs r1, r0\n\ - lsls r1, 1\n\ - adds r3, r1, r7\n\ - ldr r4, _080A1188 @ =0x0600ec80\n\ - lsls r1, r0, 1\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - cmp r1, r0\n\ - bhi _080A118C\n\ - ldr r0, _080A1178 @ =0x040000d4\n\ - str r3, [r0]\n\ - str r4, [r0, 0x4]\n\ - lsrs r1, 1\n\ - movs r2, 0x80\n\ - lsls r2, 24\n\ - orrs r1, r2\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - b _080A11B8\n\ - .align 2, 0\n\ -_080A1178: .4byte 0x040000d4\n\ -_080A117C: .4byte 0x80000800\n\ -_080A1180: .4byte 0xfffff000\n\ -_080A1184: .4byte 0x0000024a\n\ -_080A1188: .4byte 0x0600ec80\n\ -_080A118C:\n\ - ldr r2, _080A11E4 @ =0x040000d4\n\ - str r3, [r2]\n\ - str r4, [r2, 0x4]\n\ - ldr r0, _080A11E8 @ =0x80000800\n\ - str r0, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - adds r3, r0\n\ - adds r4, r0\n\ - ldr r5, _080A11EC @ =0xfffff000\n\ - adds r1, r5\n\ - cmp r1, r0\n\ - bhi _080A118C\n\ - str r3, [r2]\n\ - str r4, [r2, 0x4]\n\ - lsrs r0, r1, 1\n\ - movs r1, 0x80\n\ - lsls r1, 24\n\ - orrs r0, r1\n\ - str r0, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ -_080A11B8:\n\ - movs r1, 0x2\n\ - ldrsh r0, [r6, r1]\n\ - ldr r1, _080A11F0 @ =0x0000026a\n\ - subs r1, r0\n\ - lsls r1, 1\n\ - adds r3, r1, r7\n\ - ldr r4, _080A11F4 @ =0x0600ecc0\n\ - lsls r1, r0, 1\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - cmp r1, r0\n\ - bhi _080A11F8\n\ - ldr r0, _080A11E4 @ =0x040000d4\n\ - str r3, [r0]\n\ - str r4, [r0, 0x4]\n\ - lsrs r1, 1\n\ - movs r2, 0x80\n\ - lsls r2, 24\n\ - orrs r1, r2\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - b _080A1224\n\ - .align 2, 0\n\ -_080A11E4: .4byte 0x040000d4\n\ -_080A11E8: .4byte 0x80000800\n\ -_080A11EC: .4byte 0xfffff000\n\ -_080A11F0: .4byte 0x0000026a\n\ -_080A11F4: .4byte 0x0600ecc0\n\ -_080A11F8:\n\ - ldr r2, _080A12B0 @ =0x040000d4\n\ - str r3, [r2]\n\ - str r4, [r2, 0x4]\n\ - ldr r0, _080A12B4 @ =0x80000800\n\ - str r0, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - adds r3, r0\n\ - adds r4, r0\n\ - ldr r5, _080A12B8 @ =0xfffff000\n\ - adds r1, r5\n\ - cmp r1, r0\n\ - bhi _080A11F8\n\ - str r3, [r2]\n\ - str r4, [r2, 0x4]\n\ - lsrs r0, r1, 1\n\ - movs r1, 0x80\n\ - lsls r1, 24\n\ - orrs r0, r1\n\ - str r0, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ -_080A1224:\n\ - ldrb r4, [r6, 0x2]\n\ - ldrh r7, [r6, 0x2]\n\ - ldrh r0, [r6]\n\ - mov r12, r0\n\ - cmp r4, 0x9\n\ - bhi _080A1272\n\ - adds r3, r6, 0x4\n\ - ldr r2, _080A12B0 @ =0x040000d4\n\ - ldr r5, _080A12BC @ =0x80000001\n\ -_080A1236:\n\ - lsls r1, r4, 1\n\ - ldr r6, _080A12C0 @ =0x0600e480\n\ - adds r0, r1, r6\n\ - str r3, [r2]\n\ - str r0, [r2, 0x4]\n\ - str r5, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ - adds r6, 0x40\n\ - adds r0, r1, r6\n\ - str r3, [r2]\n\ - str r0, [r2, 0x4]\n\ - str r5, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ - ldr r6, _080A12C4 @ =0x0600ec80\n\ - adds r0, r1, r6\n\ - str r3, [r2]\n\ - str r0, [r2, 0x4]\n\ - str r5, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ - ldr r0, _080A12C8 @ =0x0600ecc0\n\ - adds r1, r0\n\ - str r3, [r2]\n\ - str r1, [r2, 0x4]\n\ - str r5, [r2, 0x8]\n\ - ldr r0, [r2, 0x8]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x9\n\ - bls _080A1236\n\ -_080A1272:\n\ - mov r1, r12\n\ - lsls r0, r1, 16\n\ - cmp r0, 0\n\ - beq _080A1286\n\ - lsls r0, r7, 16\n\ - asrs r0, 16\n\ - cmp r0, 0\n\ - ble _080A1286\n\ - cmp r0, 0x9\n\ - ble _080A12A4\n\ -_080A1286:\n\ - lsls r0, r7, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x9\n\ - ble _080A129A\n\ - ldr r0, _080A12CC @ =gOtherText_Status\n\ - movs r1, 0xD\n\ - movs r2, 0x1\n\ - movs r3, 0x12\n\ - bl sub_80A1FF8\n\ -_080A129A:\n\ - bl sub_80A1D18\n\ - mov r0, r8\n\ - bl DestroyTask\n\ -_080A12A4:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A12B0: .4byte 0x040000d4\n\ -_080A12B4: .4byte 0x80000800\n\ -_080A12B8: .4byte 0xfffff000\n\ -_080A12BC: .4byte 0x80000001\n\ -_080A12C0: .4byte 0x0600e480\n\ -_080A12C4: .4byte 0x0600ec80\n\ -_080A12C8: .4byte 0x0600ecc0\n\ -_080A12CC: .4byte gOtherText_Status\n\ - .syntax divided\n"); -} - -static void sub_80A12D0(s8 a) -{ - u8 newTaskId; - - Menu_EraseWindowRect(1, 18, 5, 19); - sub_80A18E4(29); - - newTaskId = CreateTask(sub_80A1048, 0); - gTasks[newTaskId].data[0] = a; - - if (a < 0) - gTasks[newTaskId].data[1] = 10; - else - gTasks[newTaskId].data[1] = 0; - - gTasks[newTaskId].data[2] = 1; -} - -// void sub_80A1334(u8 taskId) -// { -// u8 i; -// s16 var1; - -// gTasks[taskId].data[1] += gTasks[taskId].data[0]; - -// var1 = 0; -// if (gTasks[taskId].data[1] >= 0) -// { -// var1 = 10; -// if (gTasks[taskId].data[1] < 10) -// { -// var1 = gTasks[taskId].data[1]; -// } -// } - -// if (var1 > 0) -// { -// u8 *vramAddr = (u8 *)(VRAM + 0x5B40); -// for (i = 0; i < 7; i++) -// { -// CpuSet(&gUnknown_08E73E88[(i + 13) * 64], vramAddr, var1 & 0x1FFFFF); -// vramAddr += 64; -// } -// } - -// if (var1 <= 9) -// { -// u8 *vramAddr = (u8 *)(VRAM + 0x5B40); -// for (i = 0; i < 64; i++) -// { -// u16 val = gTasks[taskId].data[2]; -// CpuSet(&val, vramAddr, ((10 - var1) & 0x1FFFFF) | 0x800000); -// } -// } -// else -// { -// Menu_EraseWindowRect(0, 19, 9, 19); -// } - -// if (gTasks[taskId].data[0] == 0 || gTasks[taskId].data[1] < 0) -// { -// if (pssData.page == PSS_PAGE_BATTLE_MOVES) -// { -// Menu_EraseWindowRect(0, 14, 9, 18); -// sub_80A0958(pssData.loadedMon); - -// if (GetMonStatusAndPokerus(pssData.loadedMon)) -// { -// sub_80A1FF8(gOtherText_Status, 13, 1, 18); -// } - -// DestroyTask(taskId); -// } -// } - -// if (gTasks[taskId].data[1] > 9) -// { -// if (pssData.page == PSS_PAGE_BATTLE_MOVES) -// { -// sub_80A00F4(gTasks[taskId].data[3]); -// } - -// sub_80A0428(pssData.loadedMon, &gTasks[taskId].data[3]); -// DestroyTask(taskId); -// } -// } -__attribute__((naked)) -static void sub_80A1334(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - lsls r0, 2\n\ - add r0, r10\n\ - lsls r0, 3\n\ - ldr r1, _080A13E4 @ =gTasks + 0x8\n\ - adds r7, r0, r1\n\ - ldrh r0, [r7]\n\ - ldrh r1, [r7, 0x2]\n\ - adds r0, r1\n\ - strh r0, [r7, 0x2]\n\ - lsls r0, 16\n\ - asrs r1, r0, 16\n\ - movs r0, 0\n\ - cmp r1, 0\n\ - blt _080A136A\n\ - movs r0, 0xA\n\ - cmp r1, 0xA\n\ - bgt _080A136A\n\ - ldrh r0, [r7, 0x2]\n\ -_080A136A:\n\ - lsls r0, 16\n\ - asrs r2, r0, 16\n\ - mov r9, r0\n\ - cmp r2, 0\n\ - ble _080A13A6\n\ - movs r0, 0xA\n\ - subs r0, r2\n\ - lsls r0, 1\n\ - ldr r1, _080A13E8 @ =0x06005b40\n\ - adds r4, r0, r1\n\ - movs r5, 0\n\ - adds r6, r2, 0\n\ - ldr r0, _080A13EC @ =0x001fffff\n\ - mov r8, r0\n\ -_080A1386:\n\ - adds r0, r5, 0\n\ - adds r0, 0xD\n\ - lsls r0, 6\n\ - ldr r1, _080A13F0 @ =gUnknown_08E73E88\n\ - adds r0, r1\n\ - adds r1, r4, 0\n\ - mov r2, r8\n\ - ands r2, r6\n\ - bl CpuSet\n\ - adds r4, 0x40\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x6\n\ - bls _080A1386\n\ -_080A13A6:\n\ - mov r1, r9\n\ - asrs r2, r1, 16\n\ - cmp r2, 0x9\n\ - bgt _080A13F4\n\ - ldr r4, _080A13E8 @ =0x06005b40\n\ - movs r5, 0\n\ - mov r8, sp\n\ - movs r0, 0xA\n\ - subs r6, r0, r2\n\ - ldr r0, _080A13EC @ =0x001fffff\n\ - ands r6, r0\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - mov r9, r0\n\ -_080A13C2:\n\ - ldrh r0, [r7, 0x4]\n\ - mov r1, r8\n\ - strh r0, [r1]\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - mov r2, r9\n\ - orrs r2, r6\n\ - bl CpuSet\n\ - adds r4, 0x40\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x6\n\ - bls _080A13C2\n\ - b _080A1400\n\ - .align 2, 0\n\ -_080A13E4: .4byte gTasks + 0x8\n\ -_080A13E8: .4byte 0x06005b40\n\ -_080A13EC: .4byte 0x001fffff\n\ -_080A13F0: .4byte gUnknown_08E73E88\n\ -_080A13F4:\n\ - movs r0, 0\n\ - movs r1, 0x13\n\ - movs r2, 0x9\n\ - movs r3, 0x13\n\ - bl Menu_EraseWindowRect\n\ -_080A1400:\n\ - movs r1, 0\n\ - ldrsh r0, [r7, r1]\n\ - cmp r0, 0\n\ - beq _080A1410\n\ - movs r1, 0x2\n\ - ldrsh r0, [r7, r1]\n\ - cmp r0, 0\n\ - bge _080A144A\n\ -_080A1410:\n\ - ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\ - ldrb r0, [r4, 0xB]\n\ - cmp r0, 0x2\n\ - bne _080A1444\n\ - movs r0, 0\n\ - movs r1, 0xE\n\ - movs r2, 0x9\n\ - movs r3, 0x12\n\ - bl Menu_EraseWindowRect\n\ - adds r4, 0x10\n\ - adds r0, r4, 0\n\ - bl sub_80A0958\n\ - adds r0, r4, 0\n\ - bl GetMonStatusAndPokerus\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080A1444\n\ - ldr r0, _080A1484 @ =gOtherText_Status\n\ - movs r1, 0xD\n\ - movs r2, 0x1\n\ - movs r3, 0x12\n\ - bl sub_80A1FF8\n\ -_080A1444:\n\ - mov r0, r10\n\ - bl DestroyTask\n\ -_080A144A:\n\ - movs r1, 0x2\n\ - ldrsh r0, [r7, r1]\n\ - cmp r0, 0x9\n\ - ble _080A1470\n\ - ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\ - ldrb r0, [r4, 0xB]\n\ - cmp r0, 0x2\n\ - bne _080A1460\n\ - ldrb r0, [r7, 0x6]\n\ - bl sub_80A00F4\n\ -_080A1460:\n\ - adds r0, r4, 0\n\ - adds r0, 0x10\n\ - adds r1, r7, 0x6\n\ - bl sub_80A0428\n\ - mov r0, r10\n\ - bl DestroyTask\n\ -_080A1470:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A1480: .4byte gSharedMem + 0x18000\n\ -_080A1484: .4byte gOtherText_Status\n\ - .syntax divided\n"); -} - -// Related to re-drawing the summary area underneath the pokemon's picture -// in all of the summary screen tabs. -static void sub_80A1488(s8 a, u8 b) -{ - u8 taskId; - - if (pssData.page == PSS_PAGE_BATTLE_MOVES) - Menu_EraseWindowRect(0, 14, 9, 19); - - taskId = FindTaskIdByFunc(sub_80A1334); - if (taskId == 0xFF) - taskId = CreateTask(sub_80A1334, 0); - - gTasks[taskId].data[0] = a; - - if (a < 0) - gTasks[taskId].data[1] = 10; - else - gTasks[taskId].data[1] = 0; - - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = b; -} - -__attribute__((naked)) -static void sub_80A1500(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - lsls r0, 2\n\ - add r0, r10\n\ - lsls r0, 3\n\ - ldr r1, _080A15B0 @ =gTasks + 0x8\n\ - adds r7, r0, r1\n\ - ldrh r0, [r7]\n\ - ldrh r1, [r7, 0x2]\n\ - adds r0, r1\n\ - strh r0, [r7, 0x2]\n\ - lsls r0, 16\n\ - asrs r1, r0, 16\n\ - movs r0, 0\n\ - cmp r1, 0\n\ - blt _080A1536\n\ - movs r0, 0xA\n\ - cmp r1, 0xA\n\ - bgt _080A1536\n\ - ldrh r0, [r7, 0x2]\n\ -_080A1536:\n\ - lsls r0, 16\n\ - asrs r2, r0, 16\n\ - mov r9, r0\n\ - cmp r2, 0\n\ - ble _080A1572\n\ - movs r0, 0xA\n\ - subs r0, r2\n\ - lsls r0, 1\n\ - ldr r1, _080A15B4 @ =0x06006b40\n\ - adds r4, r0, r1\n\ - movs r5, 0\n\ - adds r6, r2, 0\n\ - ldr r0, _080A15B8 @ =0x001fffff\n\ - mov r8, r0\n\ -_080A1552:\n\ - adds r0, r5, 0\n\ - adds r0, 0xD\n\ - lsls r0, 6\n\ - ldr r1, _080A15BC @ =gUnknown_08E74688\n\ - adds r0, r1\n\ - adds r1, r4, 0\n\ - mov r2, r8\n\ - ands r2, r6\n\ - bl CpuSet\n\ - adds r4, 0x40\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x6\n\ - bls _080A1552\n\ -_080A1572:\n\ - mov r1, r9\n\ - asrs r2, r1, 16\n\ - cmp r2, 0x9\n\ - bgt _080A15C0\n\ - ldr r4, _080A15B4 @ =0x06006b40\n\ - movs r5, 0\n\ - mov r8, sp\n\ - movs r0, 0xA\n\ - subs r6, r0, r2\n\ - ldr r0, _080A15B8 @ =0x001fffff\n\ - ands r6, r0\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - mov r9, r0\n\ -_080A158E:\n\ - ldrh r0, [r7, 0x4]\n\ - mov r1, r8\n\ - strh r0, [r1]\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - mov r2, r9\n\ - orrs r2, r6\n\ - bl CpuSet\n\ - adds r4, 0x40\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x6\n\ - bls _080A158E\n\ - b _080A15CC\n\ - .align 2, 0\n\ -_080A15B0: .4byte gTasks + 0x8\n\ -_080A15B4: .4byte 0x06006b40\n\ -_080A15B8: .4byte 0x001fffff\n\ -_080A15BC: .4byte gUnknown_08E74688\n\ -_080A15C0:\n\ - movs r0, 0\n\ - movs r1, 0x13\n\ - movs r2, 0x9\n\ - movs r3, 0x13\n\ - bl Menu_EraseWindowRect\n\ -_080A15CC:\n\ - movs r1, 0\n\ - ldrsh r0, [r7, r1]\n\ - cmp r0, 0\n\ - beq _080A15DC\n\ - movs r1, 0x2\n\ - ldrsh r0, [r7, r1]\n\ - cmp r0, 0\n\ - bge _080A1616\n\ -_080A15DC:\n\ - ldr r4, _080A164C @ =gSharedMem + 0x18000\n\ - ldrb r0, [r4, 0xB]\n\ - cmp r0, 0x3\n\ - bne _080A1610\n\ - movs r0, 0\n\ - movs r1, 0xE\n\ - movs r2, 0x9\n\ - movs r3, 0x12\n\ - bl Menu_EraseWindowRect\n\ - adds r4, 0x10\n\ - adds r0, r4, 0\n\ - bl sub_80A0958\n\ - adds r0, r4, 0\n\ - bl GetMonStatusAndPokerus\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080A1610\n\ - ldr r0, _080A1650 @ =gOtherText_Status\n\ - movs r1, 0xD\n\ - movs r2, 0x1\n\ - movs r3, 0x12\n\ - bl sub_80A1FF8\n\ -_080A1610:\n\ - mov r0, r10\n\ - bl DestroyTask\n\ -_080A1616:\n\ - movs r1, 0x2\n\ - ldrsh r0, [r7, r1]\n\ - cmp r0, 0x9\n\ - ble _080A163C\n\ - ldr r4, _080A164C @ =gSharedMem + 0x18000\n\ - ldrb r0, [r4, 0xB]\n\ - cmp r0, 0x3\n\ - bne _080A162C\n\ - ldrb r0, [r7, 0x6]\n\ - bl sub_80A00F4\n\ -_080A162C:\n\ - adds r0, r4, 0\n\ - adds r0, 0x10\n\ - adds r1, r7, 0x6\n\ - bl sub_80A0428\n\ - mov r0, r10\n\ - bl DestroyTask\n\ -_080A163C:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A164C: .4byte gSharedMem + 0x18000\n\ -_080A1650: .4byte gOtherText_Status\n\ - .syntax divided\n"); -} - -static void sub_80A1654(s8 a, u8 b) -{ - u8 taskId; - - if (pssData.page == PSS_PAGE_CONTEST_MOVES) - Menu_EraseWindowRect(0, 14, 9, 19); - - taskId = FindTaskIdByFunc(sub_80A1500); - if (taskId == 0xFF) - taskId = CreateTask(sub_80A1500, 0); - - gTasks[taskId].data[0] = a; - - if (a < 0) - gTasks[taskId].data[1] = 10; - else - gTasks[taskId].data[1] = 0; - - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = b; -} - -#ifdef NONMATCHING -static void sub_80A16CC(u8 a) -{ - u8 i; - u16 *vramAddr = (u16 *)(VRAM + 0x6AD4); - - if (a == 0) - { - for (i = 0; i < 20; i++) - { - vramAddr[i] = gUnknown_08E94510[i] + 0x1000; - vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x1000; - vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x1000; - } - } - else - { - i = 0; - for (i = 0; i < 20; i++) - { - vramAddr[i] = gUnknown_08E94550[i] + 0x1000; - vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x1000; - vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x1000; - } - } - - vramAddr = (u16 *)(VRAM + 0x5AD4); - - if (a == 0) - { - for (i = 0; i < 20; i++) - { - vramAddr[i] = gUnknown_08E94510[i] + 0x3000; - vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x3000; - vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x3000; - } - } - else - { - for (i = 0; i < 20; i++) - { - vramAddr[i] = gUnknown_08E94550[i] + 0x3000; - vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x3000; - vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x3000; - } - } -} -#else -__attribute__((naked)) -static void sub_80A16CC(u8 a) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ - ldr r0, _080A1724 @ =0x06006ad4\n\ - mov r12, r0\n\ - mov r1, r9\n\ - cmp r1, 0\n\ - bne _080A172C\n\ - movs r5, 0\n\ - ldr r7, _080A1728 @ =gUnknown_08E94510\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - adds r6, r0, 0\n\ - movs r1, 0x40\n\ - adds r1, r7\n\ - mov r8, r1\n\ -_080A16F4:\n\ - lsls r2, r5, 1\n\ - mov r0, r12\n\ - adds r3, r2, r0\n\ - adds r4, r2, r7\n\ - ldrh r1, [r4]\n\ - adds r0, r6, r1\n\ - strh r0, [r3]\n\ - adds r1, r3, 0\n\ - adds r1, 0x40\n\ - ldrh r4, [r4]\n\ - adds r0, r6, r4\n\ - strh r0, [r1]\n\ - adds r3, 0x80\n\ - add r2, r8\n\ - ldrh r2, [r2]\n\ - adds r0, r6, r2\n\ - strh r0, [r3]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x13\n\ - bls _080A16F4\n\ - b _080A1768\n\ - .align 2, 0\n\ -_080A1724: .4byte 0x06006ad4\n\ -_080A1728: .4byte gUnknown_08E94510\n\ -_080A172C:\n\ - movs r5, 0\n\ - ldr r6, _080A17B0 @ =gUnknown_08E94550\n\ - movs r7, 0x80\n\ - lsls r7, 5\n\ - adds r4, r7, 0\n\ - movs r0, 0x40\n\ - adds r0, r6\n\ - mov r8, r0\n\ -_080A173C:\n\ - lsls r1, r5, 1\n\ - mov r7, r12\n\ - adds r2, r1, r7\n\ - adds r0, r1, r6\n\ - ldrh r0, [r0]\n\ - adds r0, r4, r0\n\ - strh r0, [r2]\n\ - adds r3, r2, 0\n\ - adds r3, 0x40\n\ - add r1, r8\n\ - ldrh r7, [r1]\n\ - adds r0, r4, r7\n\ - strh r0, [r3]\n\ - adds r2, 0x80\n\ - ldrh r1, [r1]\n\ - adds r0, r4, r1\n\ - strh r0, [r2]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x13\n\ - bls _080A173C\n\ -_080A1768:\n\ - ldr r0, _080A17B4 @ =0x06005ad4\n\ - mov r12, r0\n\ - mov r1, r9\n\ - cmp r1, 0\n\ - bne _080A17BC\n\ - movs r5, 0\n\ - ldr r7, _080A17B8 @ =gUnknown_08E94510\n\ - movs r0, 0xC0\n\ - lsls r0, 6\n\ - adds r6, r0, 0\n\ - movs r1, 0x40\n\ - adds r1, r7\n\ - mov r8, r1\n\ -_080A1782:\n\ - lsls r2, r5, 1\n\ - mov r0, r12\n\ - adds r3, r2, r0\n\ - adds r4, r2, r7\n\ - ldrh r1, [r4]\n\ - adds r0, r6, r1\n\ - strh r0, [r3]\n\ - adds r1, r3, 0\n\ - adds r1, 0x40\n\ - ldrh r4, [r4]\n\ - adds r0, r6, r4\n\ - strh r0, [r1]\n\ - adds r3, 0x80\n\ - add r2, r8\n\ - ldrh r2, [r2]\n\ - adds r0, r6, r2\n\ - strh r0, [r3]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x13\n\ - bls _080A1782\n\ - b _080A17F8\n\ - .align 2, 0\n\ -_080A17B0: .4byte gUnknown_08E94550\n\ -_080A17B4: .4byte 0x06005ad4\n\ -_080A17B8: .4byte gUnknown_08E94510\n\ -_080A17BC:\n\ - movs r5, 0\n\ - ldr r6, _080A1804 @ =gUnknown_08E94550\n\ - movs r7, 0xC0\n\ - lsls r7, 6\n\ - adds r4, r7, 0\n\ - movs r0, 0x40\n\ - adds r0, r6\n\ - mov r8, r0\n\ -_080A17CC:\n\ - lsls r1, r5, 1\n\ - mov r7, r12\n\ - adds r2, r1, r7\n\ - adds r0, r1, r6\n\ - ldrh r0, [r0]\n\ - adds r0, r4, r0\n\ - strh r0, [r2]\n\ - adds r3, r2, 0\n\ - adds r3, 0x40\n\ - add r1, r8\n\ - ldrh r7, [r1]\n\ - adds r0, r4, r7\n\ - strh r0, [r3]\n\ - adds r2, 0x80\n\ - ldrh r1, [r1]\n\ - adds r0, r4, r1\n\ - strh r0, [r2]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x13\n\ - bls _080A17CC\n\ -_080A17F8:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A1804: .4byte gUnknown_08E94550\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -u8 sub_80A1808(struct Pokemon *mon) -{ - u16 species; - u8 spriteId; - - species = GetMonData(mon, MON_DATA_SPECIES2); - spriteId = CreateSprite(&gUnknown_02024E8C, 40, 64, 5); - - FreeSpriteOamMatrix(&gSprites[spriteId]); - - gSprites[spriteId].data[0] = species; - gSprites[spriteId].callback = sub_80A1888; - - if (!IsPokeSpriteNotFlipped(species)) - gSprites[spriteId].hFlip = TRUE; - else - gSprites[spriteId].hFlip = FALSE; - - return spriteId; -} - -static void sub_80A1888(struct Sprite *sprite) -{ - if (!gPaletteFade.active) - { - sprite->callback = SpriteCallbackDummy; - - if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) - PlayCry1(sprite->data[0], 0); - } -} - -static void sub_80A18C4(void) -{ - u8 i; - - for (i = 0; i < 30; i++) - ewram1A000[i] = 0xFF; -} - -static void sub_80A18E4(u8 a) -{ - if (ewram1A000[a] != 0xFF) - { - DestroySprite(&gSprites[ewram1A000[a]]); - ewram1A000[a] = 0xFF; - } -} - -static void sub_80A1918(u8 a, u8 invisible) -{ - gSprites[ewram1A000[a]].invisible = invisible; -} - -static void sub_80A1950(void) -{ - u8 i; - - for (i = 0; i < 5; i++) - { - if (ewram1A000[i] == 0xFF) - ewram1A000[i] = CreateSprite(&sSpriteTemplate_83C11C0, 0, 0, 2); - - sub_80A1918(i, 1); - } -} - -static void sub_80A198C(u8 animNum, u8 x, u8 y, u8 d) -{ - StartSpriteAnim(&gSprites[ewram1A000[d]], animNum); - - gSprites[ewram1A000[d]].oam.paletteNum = sUnknown_PaletteNums[animNum]; - gSprites[ewram1A000[d]].pos1.x = x + 16; - gSprites[ewram1A000[d]].pos1.y = y + 8; - - sub_80A1918(d, 0); -} - -static void sub_80A1A30(u8 a) -{ - u8 i; - s16 x; - u8 subPriority = 0; - - if (pssData.page >= PSS_PAGE_BATTLE_MOVES) - { - if (a == 9) - subPriority = 1; - - for (i = 0; i < 10; i++) - { - x = (i * 16) + 0x58; - ewram1A000[a + i] = CreateSprite(&sSpriteTemplate_83C1280, x, 40, subPriority); - - if (i == 0) - StartSpriteAnim(&gSprites[ewram1A000[a]], 4); - else if (i == 9) - StartSpriteAnim(&gSprites[ewram1A000[a + i]], 5); - else - StartSpriteAnim(&gSprites[ewram1A000[a + i]], 6); - - gSprites[ewram1A000[a + i]].callback = sub_80A1BC0; - gSprites[ewram1A000[a + i]].data[0] = a; - gSprites[ewram1A000[a + i]].data[1] = 0; - } - } -} - -static void sub_80A1B1C(u8 a) -{ - u8 i; - - for (i = 0; i < 10; i++) - sub_80A18E4(a + i); -} - -static void sub_80A1B40(u8 a) -{ - u8 i; - a *= 3; - - StartSpriteAnim(&gSprites[ewram1A000[9]], a + 4); - - for (i = 0; i < 8; i++) - StartSpriteAnim(&gSprites[ewram1A000[10 + i]], a + 6); - - StartSpriteAnim(&gSprites[ewram1A000[18]], a + 5); -} - -static void sub_80A1BC0(struct Sprite *sprite) -{ - if (sprite->animNum == 4 || sprite->animNum == 5 || sprite->animNum == 6) - { - sprite->data[1] = (sprite->data[1] + 1) & 0x1F; - - if (sprite->data[1] > 24) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - } - else - { - sprite->data[1] = 0; - sprite->invisible = 0; - } - - if (sprite->data[0] == 9) - sprite->pos2.y = pssData.selectedMoveIndex * 16; - else - sprite->pos2.y = pssData.switchMoveIndex * 16; -} - -#define shared1A009 ((u8 *)(gSharedMem + 0x1A009)) - -void sub_80A1C30(u8 a) -{ - u8 r3; - - a *= 10; - for (r3 = a; r3 < a + 10; r3++) - { - gSprites[shared1A009[r3]].data[1] = 0; - gSprites[shared1A009[r3]].invisible = FALSE; - } -} - -u8 pokemon_ailments_get_primary(u32 status) -{ - if (status & 0x88) - return 1; - if (status & 0x40) - return 2; - if (status & 0x7) - return 3; - if (status & 0x20) - return 4; - if (status & 0x10) - return 5; - - return 0; -} - -u8 GetMonStatusAndPokerus(struct Pokemon *mon) -{ - u8 statusAilment; - - if (GetMonData(mon, MON_DATA_HP) == 0) - return 7; - - statusAilment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)); - if (statusAilment == 0) - { - if (!CheckPartyPokerus(mon, 0)) - return 0; - else - return 6; - } - - return statusAilment; -} - -#ifdef NONMATCHING -void sub_80A1D18(void) -{ - struct Pokemon mon; - u8 statusAndPkrs; - u8 statusAndPkrs2; - - sub_809F678(&mon); - statusAndPkrs = GetMonStatusAndPokerus(&mon); - - if (statusAndPkrs) - { - statusAndPkrs2 = statusAndPkrs - 1; - - if (ewram1A000[29] == 0xFF) - ewram1A000[29] = CreateSprite(&sSpriteTemplate_83C1304, 64, 152, 0); - } - else - { - sub_80A18E4(29); - return; - } - - StartSpriteAnim(&gSprites[ewram1A000[29]], statusAndPkrs2); -} -#else -__attribute__((naked)) -void sub_80A1D18(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - sub sp, 0x64\n\ - mov r0, sp\n\ - bl sub_809F678\n\ - mov r0, sp\n\ - bl GetMonStatusAndPokerus\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - beq _080A1D58\n\ - subs r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - ldr r4, _080A1D50 @ =gSharedMem + 0x1A01D\n\ - ldrb r0, [r4]\n\ - cmp r0, 0xFF\n\ - bne _080A1D60\n\ - ldr r0, _080A1D54 @ =sSpriteTemplate_83C1304\n\ - movs r1, 0x40\n\ - movs r2, 0x98\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - strb r0, [r4]\n\ - b _080A1D60\n\ - .align 2, 0\n\ -_080A1D50: .4byte gSharedMem + 0x1A01D\n\ -_080A1D54: .4byte sSpriteTemplate_83C1304\n\ -_080A1D58:\n\ - movs r0, 0x1D\n\ - bl sub_80A18E4\n\ - b _080A1D74\n\ -_080A1D60:\n\ - ldr r0, _080A1D7C @ =gSharedMem + 0x1A01D\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _080A1D80 @ =gSprites\n\ - adds r0, r1\n\ - adds r1, r5, 0\n\ - bl StartSpriteAnim\n\ -_080A1D74:\n\ - add sp, 0x64\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080A1D7C: .4byte gSharedMem + 0x1A01D\n\ -_080A1D80: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif // NONMATCHING - -static void sub_80A1D84(struct Pokemon *mon) -{ - struct Sprite *sprite; - - sprite = sub_80F7920(0x7533, 0x7533, sSummaryScreenMonMarkingsPalette); - gUnknown_020384F4 = sprite; - - if (sprite != NULL) - { - u8 markings = GetMonData(mon, MON_DATA_MARKINGS); - StartSpriteAnim(sprite, markings); - - gUnknown_020384F4->pos1.x = 60; - gUnknown_020384F4->pos1.y = 26; - } -} - -static void sub_80A1DCC(struct Pokemon *mon) -{ - DestroySprite(gUnknown_020384F4); - sub_80A1D84(mon); -} - -static void sub_80A1DE8(struct Pokemon *mon) -{ - u8 ball = ball_number_to_ball_processing_index(GetMonData(mon, MON_DATA_POKEBALL)); - sub_80478DC(ball); - - pssData.ballSpriteId = CreateSprite(&gBallSpriteTemplates[ball], 6, 136, 0); - gSprites[pssData.ballSpriteId].callback = SpriteCallbackDummy; - gSprites[pssData.ballSpriteId].oam.priority = 3; -} - -static u8 *sub_80A1E58(u8 *text, u8 id) -{ - if (id != 0xFF) - { - const u8 *ptr = sUnknown_083C15BC; - - while (*ptr != 0xFF && *ptr != id) - ptr += 4; - - text[0] = EXT_CTRL_CODE_BEGIN; - text[1] = 4; - text[2] = ptr[1]; - text[3] = ptr[2]; - text[4] = ptr[3]; - - text += 5; - } - - return text; -} - -u8 *sub_80A1E9C(u8 *dest, const u8 *src, u8 id) -{ - u8 arr[3]; - - Menu_GetTextColors(&arr[0], &arr[1], &arr[2]); - - dest = sub_80A1E58(dest, id); - dest = StringCopy(dest, src); - - if (id != 0xFF) - { - dest[0] = EXT_CTRL_CODE_BEGIN; - dest[1] = 4; - dest[2] = arr[0]; - dest[3] = arr[1]; - dest[4] = arr[2]; - dest[5] = 0xFF; - - dest += 5; - } - - return dest; -} - -static void sub_80A1EF8(const u8 *text, u8 id, u8 left, u16 top, s32 e) -{ - sub_80A1E9C(gStringVar4, text, id); - Menu_PrintTextPixelCoords(gStringVar4, left, top, (bool8)e); -} - -static void sub_80A1F48(const u8 *text, u8 id, u8 c, u8 d, u16 e) -{ - sub_80A1E9C(gStringVar4, text, id); - sub_8072BD8(gStringVar4, c, d, e); -} - -static void sub_80A1F98(s32 value, u8 id, u8 n, u8 mode, u8 left, u16 top, s32 e) -{ - ConvertIntToDecimalStringN(gStringVar1, value, mode, n); - sub_80A1EF8(gStringVar1, id, left, top, e); -} - -static void sub_80A1FF8(const u8 *text, u8 id, u8 left, u8 top) -{ - sub_80A1E9C(gStringVar4, text, id); - Menu_PrintText(gStringVar4, left, top); -} - -u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level) -{ - u8 buffer[12]; - - dest[0] = 0x34; - dest++; - - if (level == 0) - level = 5; - - ConvertIntToDecimalString(buffer, level); - dest = sub_80A1E9C(dest, buffer, 14); - dest = StringCopy(dest, gOtherText_Comma); - - return dest; -} - -static void sub_80A2078(int taskId) -{ - gUnknown_03005CF0 = gTasks[taskId].func; - gTasks[taskId].func = sub_80A20A8; - gTasks[taskId].func((u8)taskId); -} - -static void sub_80A20A8(u8 taskId) -{ - if (sub_8055870() != TRUE) - gTasks[taskId].func = gUnknown_03005CF0; -} diff --git a/src/pokemon_1.c b/src/pokemon_1.c new file mode 100644 index 000000000..a23bb3324 --- /dev/null +++ b/src/pokemon_1.c @@ -0,0 +1,774 @@ +#include "global.h" +#include "data2.h" +#include "constants/abilities.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "main.h" +#include "pokemon.h" +#include "random.h" +#include "overworld.h" +#include "sprite.h" +#include "string_util.h" +#include "trainer.h" +#include "text.h" +#include "ewram.h" + +//Extracts the upper 16 bits of a 32-bit number +#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) + +//Extracts the lower 16 bits of a 32-bit number +#define LOHALF(n) ((n) & 0xFFFF) + +extern u16 gMoveToLearn; + +static EWRAM_DATA u8 sLearningMoveTableID = 0; + +u8 gPlayerPartyCount; +struct Pokemon gPlayerParty[6]; +u8 gEnemyPartyCount; +struct Pokemon gEnemyParty[6]; + +const u16 gSpeciesToHoennPokedexNum[] = {203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 156, 157, 112, 113, 227, 228, 229, 230, 231, 232, 233, 234, 153, 154, 138, 139, 63, 64, 88, 89, 90, 235, 236, 237, 238, 239, 240, 241, 242, 158, 159, 243, 244, 245, 246, 247, 248, 249, 39, 40, 41, 73, 74, 75, 250, 251, 252, 66, 67, 57, 58, 59, 253, 254, 255, 256, 82, 83, 257, 92, 93, 258, 259, 106, 107, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 84, 85, 270, 271, 272, 273, 274, 275, 276, 108, 109, 169, 170, 277, 278, 279, 184, 185, 50, 51, 143, 144, 280, 281, 282, 283, 284, 167, 285, 52, 53, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 65, 181, 182, 155, 324, 137, 325, 326, 162, 163, 327, 328, 329, 91, 55, 56, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 161, 164, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 168, 357, 358, 359, 103, 104, 360, 361, 180, 362, 363, 364, 365, 115, 366, 367, 186, 165, 166, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 42, 43, 44, 25, 26, 34, 35, 114, 27, 28, 32, 33, 99, 100, 61, 62, 145, 131, 132, 60, 105, 68, 127, 128, 183, 129, 130, 140, 141, 97, 98, 116, 117, 118, 48, 49, 78, 79, 101, 102, 173, 174, 175, 119, 120, 171, 172, 125, 126, 54, 110, 111, 80, 81, 69, 76, 77, 121, 122, 160, 148, 149, 94, 36, 37, 38, 95, 96, 150, 45, 46, 47, 176, 177, 178, 152, 146, 147, 124, 123, 179, 70, 71, 72, 142, 86, 87, 133, 134, 135, 136, 29, 30, 31, 187, 188, 189, 190, 191, 192, 193, 194, 195, 198, 199, 200, 196, 197, 201, 202, 151}; +const u16 gSpeciesToNationalPokedexNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 290, 291, 292, 276, 277, 285, 286, 327, 278, 279, 283, 284, 320, 321, 300, 301, 352, 343, 344, 299, 324, 302, 339, 340, 370, 341, 342, 349, 350, 318, 319, 328, 329, 330, 296, 297, 309, 310, 322, 323, 363, 364, 365, 331, 332, 361, 362, 337, 338, 298, 325, 326, 311, 312, 303, 307, 308, 333, 334, 360, 355, 356, 315, 287, 288, 289, 316, 317, 357, 293, 294, 295, 366, 367, 368, 359, 353, 354, 336, 335, 369, 304, 305, 306, 351, 313, 314, 345, 346, 347, 348, 280, 281, 282, 371, 372, 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, 380, 381, 385, 386, 358}; +const u16 gHoennToNationalOrder[] = {252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 63, 64, 65, 290, 291, 292, 293, 294, 295, 296, 297, 118, 119, 129, 130, 298, 183, 184, 74, 75, 76, 299, 300, 301, 41, 42, 169, 72, 73, 302, 303, 304, 305, 306, 66, 67, 68, 307, 308, 309, 310, 311, 312, 81, 82, 100, 101, 313, 314, 43, 44, 45, 182, 84, 85, 315, 316, 317, 318, 319, 320, 321, 322, 323, 218, 219, 324, 88, 89, 109, 110, 325, 326, 27, 28, 327, 227, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 174, 39, 40, 349, 350, 351, 120, 121, 352, 353, 354, 355, 356, 357, 358, 359, 37, 38, 172, 25, 26, 54, 55, 360, 202, 177, 178, 203, 231, 232, 127, 214, 111, 112, 361, 362, 363, 364, 365, 366, 367, 368, 369, 222, 170, 171, 370, 116, 117, 230, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 56, 57, 58, 59, 60, 61, 62, 69, 70, 71, 77, 78, 79, 80, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 122, 123, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 173, 175, 176, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 220, 221, 223, 224, 225, 226, 228, 229, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411}; + +const struct SpindaSpot gSpindaSpotGraphics[] = +{ + {16, 14, INCBIN_U16("graphics/spinda_spots/spot_0.bin")}, + {40, 15, INCBIN_U16("graphics/spinda_spots/spot_1.bin")}, + {22, 32, INCBIN_U16("graphics/spinda_spots/spot_2.bin")}, + {34, 33, INCBIN_U16("graphics/spinda_spots/spot_3.bin")} +}; + +#include "data/pokemon/item_effects.h" + +const s8 gNatureStatTable[][5] = +{ + // Atk Def Spd Sp.Atk Sp.Def + { 0, 0, 0, 0, 0}, // Hardy + { +1, -1, 0, 0, 0}, // Lonely + { +1, 0, -1, 0, 0}, // Brave + { +1, 0, 0, -1, 0}, // Adamant + { +1, 0, 0, 0, -1}, // Naughty + { -1, +1, 0, 0, 0}, // Bold + { 0, 0, 0, 0, 0}, // Docile + { 0, +1, -1, 0, 0}, // Relaxed + { 0, +1, 0, -1, 0}, // Impish + { 0, +1, 0, 0, -1}, // Lax + { -1, 0, +1, 0, 0}, // Timid + { 0, -1, +1, 0, 0}, // Hasty + { 0, 0, 0, 0, 0}, // Serious + { 0, 0, +1, -1, 0}, // Jolly + { 0, 0, +1, 0, -1}, // Naive + { -1, 0, 0, +1, 0}, // Modest + { 0, -1, 0, +1, 0}, // Mild + { 0, 0, -1, +1, 0}, // Quiet + { 0, 0, 0, 0, 0}, // Bashful + { 0, 0, 0, +1, -1}, // Rash + { -1, 0, 0, 0, +1}, // Calm + { 0, -1, 0, 0, +1}, // Gentle + { 0, 0, -1, 0, +1}, // Sassy + { 0, 0, 0, -1, +1}, // Careful + { 0, 0, 0, 0, 0} // Quirky +}; + +#include "data/pokemon/tmhm_learnsets.h" +#include "data/pokemon/trainer_class_lookups.h" +#include "data/pokemon/cry_ids.h" +#include "data/pokemon/experience_tables.h" +#include "data/pokemon/base_stats.h" +#include "data/pokemon/level_up_learnsets.h" +#include "data/pokemon/evolution.h" +#include "data/pokemon/level_up_learnset_pointers.h" + +void ZeroBoxMonData(struct BoxPokemon *boxMon) +{ + u8 *raw = (u8 *)boxMon; + u32 i; + for (i = 0; i < sizeof(struct BoxPokemon); i++) + raw[i] = 0; +} + +void ZeroMonData(struct Pokemon *mon) +{ + u32 arg; + ZeroBoxMonData(&mon->box); + arg = 0; + SetMonData(mon, MON_DATA_STATUS, &arg); + SetMonData(mon, MON_DATA_LEVEL, &arg); + SetMonData(mon, MON_DATA_HP, &arg); + SetMonData(mon, MON_DATA_MAX_HP, &arg); + SetMonData(mon, MON_DATA_ATK, &arg); + SetMonData(mon, MON_DATA_DEF, &arg); + SetMonData(mon, MON_DATA_SPEED, &arg); + SetMonData(mon, MON_DATA_SPATK, &arg); + SetMonData(mon, MON_DATA_SPDEF, &arg); + arg = 255; + SetMonData(mon, MON_DATA_MAIL, &arg); +} + +void ZeroPlayerPartyMons(void) +{ + s32 i; + for (i = 0; i < 6; i++) + ZeroMonData(&gPlayerParty[i]); +} + +void ZeroEnemyPartyMons(void) +{ + s32 i; + for (i = 0; i < 6; i++) + ZeroMonData(&gEnemyParty[i]); +} + +void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +{ + u32 arg; + + ZeroMonData(mon); + CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); + SetMonData(mon, MON_DATA_LEVEL, &level); + arg = 255; + SetMonData(mon, MON_DATA_MAIL, &arg); + CalculateMonStats(mon); +} + +void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +{ + u8 speciesName[POKEMON_NAME_LENGTH + 1]; + u32 personality; + u32 value; + u16 checksum; + + ZeroBoxMonData(boxMon); + + if (hasFixedPersonality) + personality = fixedPersonality; + else + personality = Random32(); + + SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality); + + //Determine original trainer ID + if (otIdType == 2) //Pokemon cannot be shiny + { + u32 shinyValue; + do + { + value = Random32(); + shinyValue = HIHALF(value) ^ LOHALF(value) ^ HIHALF(personality) ^ LOHALF(personality); + } while (shinyValue < 8); + } + else if (otIdType == 1) //Pokemon has a preset OT ID + { + value = fixedOtId; + } + else //Player is the OT + { + value = gSaveBlock2.playerTrainerId[0] + | (gSaveBlock2.playerTrainerId[1] << 8) + | (gSaveBlock2.playerTrainerId[2] << 16) + | (gSaveBlock2.playerTrainerId[3] << 24); + } + + SetBoxMonData(boxMon, MON_DATA_OT_ID, &value); + + checksum = CalculateBoxMonChecksum(boxMon); + SetBoxMonData(boxMon, MON_DATA_CHECKSUM, &checksum); + EncryptBoxMon(boxMon); + GetSpeciesName(speciesName, species); + SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName); + SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage); + SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2.playerName); + SetBoxMonData(boxMon, MON_DATA_SPECIES, &species); + SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gBaseStats[species].growthRate][level]); + SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship); + value = sav1_map_get_name(); + SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value); + SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level); + SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion); + value = 4; + SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value); + SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); + + if (fixedIV < 32) + { + SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV); + } + else + { + u32 iv; + value = Random(); + + iv = value & 0x1F; + SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv); + iv = (value & 0x3E0) >> 5; + SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv); + iv = (value & 0x7C00) >> 10; + SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv); + + value = Random(); + + iv = value & 0x1F; + SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); + iv = (value & 0x3E0) >> 5; + SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); + iv = (value & 0x7C00) >> 10; + SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); + } + + if (gBaseStats[species].ability2) + { + value = personality & 1; + SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, &value); + } + + GiveBoxMonInitialMoveset(boxMon); +} + +void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature) +{ + u32 personality; + + do + { + personality = Random32(); + } + while (nature != GetNatureFromPersonality(personality)); + + CreateMon(mon, species, level, fixedIV, 1, personality, 0, 0); +} + +void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter) +{ + u32 personality; + + if ((u8)(unownLetter - 1) < 28) + { + u16 actualLetter; + + do + { + personality = Random32(); + actualLetter = ((((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 28); + } + while (nature != GetNatureFromPersonality(personality) + || gender != GetGenderFromSpeciesAndPersonality(species, personality) + || actualLetter != unownLetter - 1); + } + else + { + do + { + personality = Random32(); + } + while (nature != GetNatureFromPersonality(personality) + || gender != GetGenderFromSpeciesAndPersonality(species, personality)); + } + + CreateMon(mon, species, level, fixedIV, 1, personality, 0, 0); +} + +// This is only used to create Wally's Ralts. +void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level) +{ + u32 personality; + u32 otId; + + do + { + otId = Random32(); + personality = Random32(); + } + while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE); + CreateMon(mon, species, level, 32, 1, personality, 1, otId); +} + +void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) +{ + CreateMon(mon, species, level, 0, 1, personality, 0, 0); + SetMonData(mon, MON_DATA_IVS, &ivs); + CalculateMonStats(mon); +} + +void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) +{ + CreateMon(mon, species, level, 0, 0, 0, 1, otId); + SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); + SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]); + SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]); + SetMonData(mon, MON_DATA_SPEED_IV, &ivs[3]); + SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]); + SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]); + CalculateMonStats(mon); +} + +void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread) +{ + s32 i; + s32 statCount = 0; + u16 evAmount; + u8 temp; + + CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0); + + temp = evSpread; + + for (i = 0; i < 6; i++) + { + if (temp & 1) + statCount++; + temp >>= 1; + } + + evAmount = 510 / statCount; + + temp = 1; + + for (i = 0; i < 6; i++) + { + if (evSpread & temp) + SetMonData(mon, MON_DATA_HP_EV + i, &evAmount); + temp <<= 1; + } + + CalculateMonStats(mon); +} + +void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) +{ + s32 i; + u8 nickname[POKEMON_NAME_LENGTH + 1]; + u8 language; + u8 value; + + CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId); + + for (i = 0; i < 4; i++) + SetMonMoveSlot(mon, src->moves[i], i); + + SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses); + SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem); + + StringCopy(nickname, src->nickname); + + if (nickname[0] == 0xFC && nickname[1] == 0x15) + language = LANGUAGE_JAPANESE; + else + language = GAME_LANGUAGE; + + SetMonData(mon, MON_DATA_LANGUAGE, &language); + Text_StripExtCtrlCodes(nickname); + SetMonData(mon, MON_DATA_NICKNAME, nickname); + SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship); + SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); + SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV); + SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV); + SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV); + SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV); + SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV); + value = src->altAbility; + SetMonData(mon, MON_DATA_ALT_ABILITY, &value); + value = src->hpIV; + SetMonData(mon, MON_DATA_HP_IV, &value); + value = src->attackIV; + SetMonData(mon, MON_DATA_ATK_IV, &value); + value = src->defenseIV; + SetMonData(mon, MON_DATA_DEF_IV, &value); + value = src->speedIV; + SetMonData(mon, MON_DATA_SPEED_IV, &value); + value = src->spAttackIV; + SetMonData(mon, MON_DATA_SPATK_IV, &value); + value = src->spDefenseIV; + SetMonData(mon, MON_DATA_SPDEF_IV, &value); + CalculateMonStats(mon); +} + +void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest) +{ + s32 i; + u16 heldItem; + + dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + + if (heldItem == ITEM_ENIGMA_BERRY) + heldItem = 0; + + dest->heldItem = heldItem; + + for (i = 0; i < 4; i++) + dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); + + dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL); + dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); + dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); + dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); + dest->speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); + dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); + dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); + dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); + dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); + dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); + dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); + dest->speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); + dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); + dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); + dest->altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); + dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + GetMonData(mon, MON_DATA_NICKNAME, dest->nickname); +} + +u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) +{ + u16 checksum = 0; + union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0); + union PokemonSubstruct *substruct1 = GetSubstruct(boxMon, boxMon->personality, 1); + union PokemonSubstruct *substruct2 = GetSubstruct(boxMon, boxMon->personality, 2); + union PokemonSubstruct *substruct3 = GetSubstruct(boxMon, boxMon->personality, 3); + s32 i; + + for (i = 0; i < 6; i++) + checksum += substruct0->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct1->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct2->raw[i]; + + for (i = 0; i < 6; i++) + checksum += substruct3->raw[i]; + + return checksum; +} + +#define CALC_STAT(base, iv, ev, statIndex, field) \ +{ \ + u8 baseStat = gBaseStats[species].base; \ + s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ + u8 nature = GetNature(mon); \ + n = nature_stat_mod(nature, n, statIndex); \ + SetMonData(mon, field, &n); \ +} + +void CalculateMonStats(struct Pokemon *mon) +{ + s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); + s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); + s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); + s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); + s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); + s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); + s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); + s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); + s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); + s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); + s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); + s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); + s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); + s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + s32 level = GetLevelFromMonExp(mon); + s32 newMaxHP; + + SetMonData(mon, MON_DATA_LEVEL, &level); + + if (species == SPECIES_SHEDINJA) + { + newMaxHP = 1; + } + else + { + s32 n = 2 * gBaseStats[species].baseHP + hpIV; + newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; + } + + eStatHp = newMaxHP - oldMaxHP; + if (eStatHp == 0) + eStatHp = 1; + + SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); + + CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) + CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) + CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED) + CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) + CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) + + if (species == SPECIES_SHEDINJA) + { + if (currentHP != 0 || oldMaxHP == 0) + currentHP = 1; + else + return; + } + else + { + if (currentHP == 0 && oldMaxHP == 0) + currentHP = newMaxHP; + else if (currentHP != 0) + currentHP += newMaxHP - oldMaxHP; + else + return; + } + + SetMonData(mon, MON_DATA_HP, ¤tHP); +} + +#if DEBUG +void debug_sub_803F55C(struct Pokemon *mon) +{ + s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); + s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); + s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); + s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); + s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); + s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); + s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); + s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); + s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); + s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); + s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); + s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); + s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + s32 level = GetLevelFromMonExp(mon); + s32 newMaxHP; + + SetMonData(mon, MON_DATA_LEVEL, &level); + + if (species == SPECIES_SHEDINJA) + { + newMaxHP = 1; + } + else + { + s32 n = 2 * gBaseStats[species].baseHP + hpIV; + newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10; + } + + SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); + + CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) + CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) + CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED) + CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) + CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) + + if (newMaxHP < currentHP) + currentHP = newMaxHP; + + SetMonData(mon, MON_DATA_HP, ¤tHP); +} +#endif + +void ExpandBoxMon(const struct BoxPokemon *src, struct Pokemon *dest) +{ + u32 value = 0; + dest->box = *src; + SetMonData(dest, MON_DATA_STATUS, &value); + SetMonData(dest, MON_DATA_HP, &value); + SetMonData(dest, MON_DATA_MAX_HP, &value); + value = 255; + SetMonData(dest, MON_DATA_MAIL, &value); + CalculateMonStats(dest); +} + +u8 GetLevelFromMonExp(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); + s32 level = 1; + + while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) + level++; + + return level - 1; +} + +u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon) +{ + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL); + s32 level = 1; + + while (level <= 100 && gExperienceTables[gBaseStats[species].growthRate][level] <= exp) + level++; + + return level - 1; +} + +u16 GiveMoveToMon(struct Pokemon *mon, u16 move) +{ + return GiveMoveToBoxMon(&mon->box, move); +} + +u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) +{ + s32 i; + for (i = 0; i < 4; i++) + { + u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); + if (!existingMove) + { + SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &move); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[move].pp); + return move; + } + if (existingMove == move) + return -2; + } + return -1; +} + +u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (!mon->moves[i]) + { + mon->moves[i] = move; + mon->pp[i] = gBattleMoves[move].pp; + return move; + } + } + + return -1; +} + +void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot) +{ + SetMonData(mon, MON_DATA_MOVE1 + slot, &move); + SetMonData(mon, MON_DATA_PP1 + slot, &gBattleMoves[move].pp); +} + +void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot) +{ + mon->moves[slot] = move; + mon->pp[slot] = gBattleMoves[move].pp; +} + +void GiveMonInitialMoveset(struct Pokemon *mon) +{ + GiveBoxMonInitialMoveset(&mon->box); +} + +void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) +{ + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + s32 level = GetLevelFromBoxMonExp(boxMon); + s32 i; + + for (i = 0; gLevelUpLearnsets[species][i] != (u16)-1; i++) + { + u16 moveLevel; + u16 move; + + moveLevel = (gLevelUpLearnsets[species][i] & 0xFE00); + + if (moveLevel > (level << 9)) + break; + + move = (gLevelUpLearnsets[species][i] & 0x1FF); + + if (GiveMoveToBoxMon(boxMon, move) == (u16)-1) + DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); + } +} + +u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) +{ + u32 retVal = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); + + // since you can learn more than one move per level + // the game needs to know whether you decided to + // learn it or keep the old set to avoid asking + // you to learn the same move over and over again + if (firstMove) + { + sLearningMoveTableID = 0; + + while ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) != (level << 9)) + { + sLearningMoveTableID++; + if (gLevelUpLearnsets[species][sLearningMoveTableID] == 0xFFFF) + return 0; + } + } + + if ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) == (level << 9)) + { + gMoveToLearn = (gLevelUpLearnsets[species][sLearningMoveTableID] & 0x1FF); + sLearningMoveTableID++; + retVal = GiveMoveToMon(mon, gMoveToLearn); + } + + return retVal; +} + +void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) +{ + s32 i; + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; + + for (i = 0; i < 3; i++) + { + moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL); + pp[i] = GetMonData(mon, MON_DATA_PP2 + i, NULL); + } + + ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + ppBonuses >>= 2; + moves[3] = move; + pp[3] = gBattleMoves[move].pp; + + for (i = 0; i < 4; i++) + { + SetMonData(mon, MON_DATA_MOVE1 + i, &moves[i]); + SetMonData(mon, MON_DATA_PP1 + i, &pp[i]); + } + + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) +{ + s32 i; + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; + + for (i = 0; i < 3; i++) + { + moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i, NULL); + pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i, NULL); + } + + ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL); + ppBonuses >>= 2; + moves[3] = move; + pp[3] = gBattleMoves[move].pp; + + for (i = 0; i < 4; i++) + { + SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]); + } + + SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &ppBonuses); +} diff --git a/src/pokemon_2.c b/src/pokemon_2.c new file mode 100644 index 000000000..7fd1aa7b2 --- /dev/null +++ b/src/pokemon_2.c @@ -0,0 +1,1237 @@ +#include "global.h" +#include "constants/hold_effects.h" +#include "constants/moves.h" +#include "battle.h" +#include "battle_util.h" +#include "data2.h" +#include "event_data.h" +#include "main.h" +#include "pokemon.h" +#include "random.h" +#include "rom_8077ABC.h" +#include "constants/species.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "text.h" +#include "trainer.h" +#include "util.h" +#include "ewram.h" + +extern u8 gPlayerPartyCount; +extern u8 gEnemyPartyCount; + +extern u16 gBattleTypeFlags; +extern u8 gActiveBank; +extern struct BattlePokemon gBattleMons[4]; +extern u16 gCurrentMove; +extern u8 gLastUsedAbility; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gAbsentBankFlags; +extern u8 gXXX_CritRelated; +extern u16 gBattleWeather; +extern struct BattleEnigmaBerry gEnigmaBerries[]; +extern u16 gBattleMovePower; +extern u16 gTrainerBattleOpponent; +extern struct PokemonStorage gPokemonStorage; + +EWRAM_DATA struct SpriteTemplate gUnknown_02024E8C = {0}; + +extern u8 gBadEggNickname[]; +extern const struct SpriteTemplate gSpriteTemplate_8208288[]; +//array of pointers to arrays of pointers to union AnimCmd (We probably need to typedef this.) +extern u8 gTrainerClassToPicIndex[]; +extern u8 gTrainerClassToNameIndex[]; + +extern const u8 gUnknown_08208238[]; +extern const u8 gUnknown_0820823C[]; + +extern void sub_80105A0(struct Sprite *); +extern void oac_poke_opponent(struct Sprite *); + +u8 CountAliveMons(u8 a1) +{ + s32 i; + u8 retVal = 0; + + switch (a1) + { + case 0: + for (i = 0; i < 4; i++) + { + if (i != gActiveBank && !(gAbsentBankFlags & gBitTable[i])) + retVal++; + } + break; + case 1: + for (i = 0; i < 4; i++) + { + if (GetBankSide(i) == GetBankSide(gBankAttacker) && !(gAbsentBankFlags & gBitTable[i])) + retVal++; + } + break; + case 2: + for (i = 0; i < 4; i++) + { + if (GetBankSide(i) == GetBankSide(gBankTarget) && !(gAbsentBankFlags & gBitTable[i])) + retVal++; + } + break; + } + + return retVal; +} + +u8 sub_803C434(u8 a1) +{ + u8 status = GetBankIdentity(a1) & 1; + + status ^= 1; + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + return GetBankByIdentity(status); + if (CountAliveMons(0) > 1) + { + u8 val; + + if ((Random() & 1) == 0) + val = status ^ 2; + else + val = status; + return GetBankByIdentity(val); + } + else + { + if ((gAbsentBankFlags & gBitTable[status])) + return GetBankByIdentity(status ^ 2); + else + return GetBankByIdentity(status); + } +} + +u8 GetMonGender(struct Pokemon *mon) +{ + return GetBoxMonGender(&mon->box); +} + +u8 GetBoxMonGender(struct BoxPokemon *boxMon) +{ + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL); + + switch (gBaseStats[species].genderRatio) + { + case MON_MALE: + case MON_FEMALE: + case MON_GENDERLESS: + return gBaseStats[species].genderRatio; + } + + if (gBaseStats[species].genderRatio > (personality & 0xFF)) + return MON_FEMALE; + else + return MON_MALE; +} + +u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) +{ + switch (gBaseStats[species].genderRatio) + { + case MON_MALE: + case MON_FEMALE: + case MON_GENDERLESS: + return gBaseStats[species].genderRatio; + } + + if (gBaseStats[species].genderRatio > (personality & 0xFF)) + return MON_FEMALE; + else + return MON_MALE; +} + +const struct SpriteTemplate gSpriteTemplate_8208288[] = +{ + {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A10, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, + {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A30, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, + {0xFFFF, 0, &gOamData_81F96F0, NULL, gSpriteImageTable_81E7A50, gSpriteAffineAnimTable_81E7B70, sub_80105A0}, + {0xFFFF, 0, &gOamData_81F96E8, NULL, gSpriteImageTable_81E7A70, gSpriteAffineAnimTable_81E7BEC, oac_poke_opponent}, +}; + +void GetMonSpriteTemplate_803C56C(u16 species, u8 a2) +{ + gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; + gUnknown_02024E8C.paletteTag = species; + gUnknown_02024E8C.anims = (const union AnimCmd *const *)gSpriteAnimTable_81E7C64; //Why do I have to cast this? +} + +void GetMonSpriteTemplate_803C5A0(u16 species, u8 a2) +{ + gUnknown_02024E8C = gSpriteTemplate_8208288[a2]; + gUnknown_02024E8C.paletteTag = species; + if (a2 == 0 || a2 == 2) + gUnknown_02024E8C.anims = gUnknown_081ECACC[species]; + else + gUnknown_02024E8C.anims = gUnknown_081EC2A4[species]; +} + +void EncryptBoxMon(struct BoxPokemon *boxMon) +{ + u32 i; + for (i = 0; i < 12; i++) + { + boxMon->secure.raw[i] ^= boxMon->personality; + boxMon->secure.raw[i] ^= boxMon->otId; + } +} + +void DecryptBoxMon(struct BoxPokemon *boxMon) +{ + u32 i; + for (i = 0; i < 12; i++) + { + boxMon->secure.raw[i] ^= boxMon->otId; + boxMon->secure.raw[i] ^= boxMon->personality; + } +} + +#define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \ +case n: \ + switch (substructType) \ + { \ + case 0: \ + substruct = &substructs ## n [v1]; \ + break; \ + case 1: \ + substruct = &substructs ## n [v2]; \ + break; \ + case 2: \ + substruct = &substructs ## n [v3]; \ + break; \ + case 3: \ + substruct = &substructs ## n [v4]; \ + break; \ + } \ + break; + +union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType) +{ + union PokemonSubstruct *substruct = NULL; + + union PokemonSubstruct *substructs0 = boxMon->secure.substructs; + union PokemonSubstruct *substructs1 = boxMon->secure.substructs; + union PokemonSubstruct *substructs2 = boxMon->secure.substructs; + union PokemonSubstruct *substructs3 = boxMon->secure.substructs; + union PokemonSubstruct *substructs4 = boxMon->secure.substructs; + union PokemonSubstruct *substructs5 = boxMon->secure.substructs; + union PokemonSubstruct *substructs6 = boxMon->secure.substructs; + union PokemonSubstruct *substructs7 = boxMon->secure.substructs; + union PokemonSubstruct *substructs8 = boxMon->secure.substructs; + union PokemonSubstruct *substructs9 = boxMon->secure.substructs; + union PokemonSubstruct *substructs10 = boxMon->secure.substructs; + union PokemonSubstruct *substructs11 = boxMon->secure.substructs; + union PokemonSubstruct *substructs12 = boxMon->secure.substructs; + union PokemonSubstruct *substructs13 = boxMon->secure.substructs; + union PokemonSubstruct *substructs14 = boxMon->secure.substructs; + union PokemonSubstruct *substructs15 = boxMon->secure.substructs; + union PokemonSubstruct *substructs16 = boxMon->secure.substructs; + union PokemonSubstruct *substructs17 = boxMon->secure.substructs; + union PokemonSubstruct *substructs18 = boxMon->secure.substructs; + union PokemonSubstruct *substructs19 = boxMon->secure.substructs; + union PokemonSubstruct *substructs20 = boxMon->secure.substructs; + union PokemonSubstruct *substructs21 = boxMon->secure.substructs; + union PokemonSubstruct *substructs22 = boxMon->secure.substructs; + union PokemonSubstruct *substructs23 = boxMon->secure.substructs; + + switch (personality % 24) + { + SUBSTRUCT_CASE( 0,0,1,2,3) + SUBSTRUCT_CASE( 1,0,1,3,2) + SUBSTRUCT_CASE( 2,0,2,1,3) + SUBSTRUCT_CASE( 3,0,3,1,2) + SUBSTRUCT_CASE( 4,0,2,3,1) + SUBSTRUCT_CASE( 5,0,3,2,1) + SUBSTRUCT_CASE( 6,1,0,2,3) + SUBSTRUCT_CASE( 7,1,0,3,2) + SUBSTRUCT_CASE( 8,2,0,1,3) + SUBSTRUCT_CASE( 9,3,0,1,2) + SUBSTRUCT_CASE(10,2,0,3,1) + SUBSTRUCT_CASE(11,3,0,2,1) + SUBSTRUCT_CASE(12,1,2,0,3) + SUBSTRUCT_CASE(13,1,3,0,2) + SUBSTRUCT_CASE(14,2,1,0,3) + SUBSTRUCT_CASE(15,3,1,0,2) + SUBSTRUCT_CASE(16,2,3,0,1) + SUBSTRUCT_CASE(17,3,2,0,1) + SUBSTRUCT_CASE(18,1,2,3,0) + SUBSTRUCT_CASE(19,1,3,2,0) + SUBSTRUCT_CASE(20,2,1,3,0) + SUBSTRUCT_CASE(21,3,1,2,0) + SUBSTRUCT_CASE(22,2,3,1,0) + SUBSTRUCT_CASE(23,3,2,1,0) + } + + return substruct; +} + +u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) +{ + switch (field) + { + case MON_DATA_STATUS: + return mon->status; + case MON_DATA_LEVEL: + return mon->level; + case MON_DATA_HP: + return mon->hp; + case MON_DATA_MAX_HP: + return mon->maxHP; + case MON_DATA_ATK: + return mon->attack; + case MON_DATA_DEF: + return mon->defense; + case MON_DATA_SPEED: + return mon->speed; + case MON_DATA_SPATK: + return mon->spAttack; + case MON_DATA_SPDEF: + return mon->spDefense; + case MON_DATA_MAIL: + return mon->mail; + default: + return GetBoxMonData(&mon->box, field, data); + } +} + +u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) +{ + u32 retVal = 0; + struct PokemonSubstruct0 *substruct0 = NULL; + struct PokemonSubstruct1 *substruct1 = NULL; + struct PokemonSubstruct2 *substruct2 = NULL; + struct PokemonSubstruct3 *substruct3 = NULL; + + if (field > MON_DATA_10) + { + substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); + substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); + substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); + substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); + + DecryptBoxMon(boxMon); + + if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) + { + boxMon->isBadEgg = 1; + boxMon->isEgg = 1; + substruct3->isEgg = 1; + } + } + + switch (field) + { + case MON_DATA_PERSONALITY: + retVal = boxMon->personality; + break; + case MON_DATA_OT_ID: + retVal = boxMon->otId; + break; + case MON_DATA_NICKNAME: + { + if (boxMon->isBadEgg) + { + StringCopy(data, gBadEggNickname); + retVal = StringLength(data); + } + else if (boxMon->isEgg) + { + StringCopy(data, gEggNickname); + retVal = StringLength(data); + } + else + { + retVal = 0; + + while (retVal < POKEMON_NAME_LENGTH && boxMon->nickname[retVal] != EOS) + { + data[retVal] = boxMon->nickname[retVal]; + retVal++; + } + + data[retVal] = EOS; + ConvertInternationalString(data, boxMon->language); + retVal = StringLength(data); + } + break; + } + case MON_DATA_LANGUAGE: + retVal = boxMon->language; + break; + case MON_DATA_SANITY_BIT1: + retVal = boxMon->isBadEgg; + break; + case MON_DATA_SANITY_BIT2: + retVal = boxMon->hasSpecies; + break; + case MON_DATA_SANITY_BIT3: + retVal = boxMon->isEgg; + break; + case MON_DATA_OT_NAME: + { + retVal = 0; + + while (retVal < OT_NAME_LENGTH && boxMon->otName[retVal] != EOS) + { + data[retVal] = boxMon->otName[retVal]; + retVal++; + } + + data[retVal] = EOS; + break; + } + case MON_DATA_MARKINGS: + retVal = boxMon->markings; + break; + case MON_DATA_CHECKSUM: + retVal = boxMon->checksum; + break; + case MON_DATA_10: + retVal = boxMon->unknown; + break; + case MON_DATA_SPECIES: + retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species; + break; + case MON_DATA_HELD_ITEM: + retVal = substruct0->heldItem; + break; + case MON_DATA_EXP: + retVal = substruct0->experience; + break; + case MON_DATA_PP_BONUSES: + retVal = substruct0->ppBonuses; + break; + case MON_DATA_FRIENDSHIP: + retVal = substruct0->friendship; + break; + case MON_DATA_MOVE1: + case MON_DATA_MOVE2: + case MON_DATA_MOVE3: + case MON_DATA_MOVE4: + retVal = substruct1->moves[field - MON_DATA_MOVE1]; + break; + case MON_DATA_PP1: + case MON_DATA_PP2: + case MON_DATA_PP3: + case MON_DATA_PP4: + retVal = substruct1->pp[field - MON_DATA_PP1]; + break; + case MON_DATA_HP_EV: + retVal = substruct2->hpEV; + break; + case MON_DATA_ATK_EV: + retVal = substruct2->attackEV; + break; + case MON_DATA_DEF_EV: + retVal = substruct2->defenseEV; + break; + case MON_DATA_SPEED_EV: + retVal = substruct2->speedEV; + break; + case MON_DATA_SPATK_EV: + retVal = substruct2->spAttackEV; + break; + case MON_DATA_SPDEF_EV: + retVal = substruct2->spDefenseEV; + break; + case MON_DATA_COOL: + retVal = substruct2->cool; + break; + case MON_DATA_BEAUTY: + retVal = substruct2->beauty; + break; + case MON_DATA_CUTE: + retVal = substruct2->cute; + break; + case MON_DATA_SMART: + retVal = substruct2->smart; + break; + case MON_DATA_TOUGH: + retVal = substruct2->tough; + break; + case MON_DATA_SHEEN: + retVal = substruct2->sheen; + break; + case MON_DATA_POKERUS: + retVal = substruct3->pokerus; + break; + case MON_DATA_MET_LOCATION: + retVal = substruct3->metLocation; + break; + case MON_DATA_MET_LEVEL: + retVal = substruct3->metLevel; + break; + case MON_DATA_MET_GAME: + retVal = substruct3->metGame; + break; + case MON_DATA_POKEBALL: + retVal = substruct3->pokeball; + break; + case MON_DATA_OT_GENDER: + retVal = substruct3->otGender; + break; + case MON_DATA_HP_IV: + retVal = substruct3->hpIV; + break; + case MON_DATA_ATK_IV: + retVal = substruct3->attackIV; + break; + case MON_DATA_DEF_IV: + retVal = substruct3->defenseIV; + break; + case MON_DATA_SPEED_IV: + retVal = substruct3->speedIV; + break; + case MON_DATA_SPATK_IV: + retVal = substruct3->spAttackIV; + break; + case MON_DATA_SPDEF_IV: + retVal = substruct3->spDefenseIV; + break; + case MON_DATA_IS_EGG: + retVal = substruct3->isEgg; + break; + case MON_DATA_ALT_ABILITY: + retVal = substruct3->altAbility; + break; + case MON_DATA_COOL_RIBBON: + retVal = substruct3->coolRibbon; + break; + case MON_DATA_BEAUTY_RIBBON: + retVal = substruct3->beautyRibbon; + break; + case MON_DATA_CUTE_RIBBON: + retVal = substruct3->cuteRibbon; + break; + case MON_DATA_SMART_RIBBON: + retVal = substruct3->smartRibbon; + break; + case MON_DATA_TOUGH_RIBBON: + retVal = substruct3->toughRibbon; + break; + case MON_DATA_CHAMPION_RIBBON: + retVal = substruct3->championRibbon; + break; + case MON_DATA_WINNING_RIBBON: + retVal = substruct3->winningRibbon; + break; + case MON_DATA_VICTORY_RIBBON: + retVal = substruct3->victoryRibbon; + break; + case MON_DATA_ARTIST_RIBBON: + retVal = substruct3->artistRibbon; + break; + case MON_DATA_EFFORT_RIBBON: + retVal = substruct3->effortRibbon; + break; + case MON_DATA_GIFT_RIBBON_1: + retVal = substruct3->giftRibbon1; + break; + case MON_DATA_GIFT_RIBBON_2: + retVal = substruct3->giftRibbon2; + break; + case MON_DATA_GIFT_RIBBON_3: + retVal = substruct3->giftRibbon3; + break; + case MON_DATA_GIFT_RIBBON_4: + retVal = substruct3->giftRibbon4; + break; + case MON_DATA_GIFT_RIBBON_5: + retVal = substruct3->giftRibbon5; + break; + case MON_DATA_GIFT_RIBBON_6: + retVal = substruct3->giftRibbon6; + break; + case MON_DATA_GIFT_RIBBON_7: + retVal = substruct3->giftRibbon7; + break; + case MON_DATA_FATEFUL_ENCOUNTER: + retVal = substruct3->fatefulEncounter; + break; + case MON_DATA_SPECIES2: + retVal = substruct0->species; + if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg)) + retVal = SPECIES_EGG; + break; + case MON_DATA_IVS: + retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25); + break; + case MON_DATA_KNOWN_MOVES: + if (substruct0->species && !substruct3->isEgg) + { + u16 *moves = (u16 *)data; + s32 i = 0; + + while (moves[i] != NUM_MOVES) + { + u16 move = moves[i]; + if (substruct1->moves[0] == move + || substruct1->moves[1] == move + || substruct1->moves[2] == move + || substruct1->moves[3] == move) + retVal |= gBitTable[i]; + i++; + } + } + break; + case MON_DATA_RIBBON_COUNT: + retVal = 0; + if (substruct0->species && !substruct3->isEgg) + { + retVal += substruct3->coolRibbon; + retVal += substruct3->beautyRibbon; + retVal += substruct3->cuteRibbon; + retVal += substruct3->smartRibbon; + retVal += substruct3->toughRibbon; + retVal += substruct3->championRibbon; + retVal += substruct3->winningRibbon; + retVal += substruct3->victoryRibbon; + retVal += substruct3->artistRibbon; + retVal += substruct3->effortRibbon; + retVal += substruct3->giftRibbon1; + retVal += substruct3->giftRibbon2; + retVal += substruct3->giftRibbon3; + retVal += substruct3->giftRibbon4; + retVal += substruct3->giftRibbon5; + retVal += substruct3->giftRibbon6; + retVal += substruct3->giftRibbon7; + } + break; + case MON_DATA_RIBBONS: + retVal = 0; + if (substruct0->species && !substruct3->isEgg) + { + retVal = substruct3->championRibbon + | (substruct3->coolRibbon << 1) + | (substruct3->beautyRibbon << 4) + | (substruct3->cuteRibbon << 7) + | (substruct3->smartRibbon << 10) + | (substruct3->toughRibbon << 13) + | (substruct3->winningRibbon << 16) + | (substruct3->victoryRibbon << 17) + | (substruct3->artistRibbon << 18) + | (substruct3->effortRibbon << 19) + | (substruct3->giftRibbon1 << 20) + | (substruct3->giftRibbon2 << 21) + | (substruct3->giftRibbon3 << 22) + | (substruct3->giftRibbon4 << 23) + | (substruct3->giftRibbon5 << 24) + | (substruct3->giftRibbon6 << 25) + | (substruct3->giftRibbon7 << 26); + } + break; + default: + break; + } + + if (field > MON_DATA_10) + EncryptBoxMon(boxMon); + + return retVal; +} + +#define SET8(lhs) (lhs) = *data +#define SET16(lhs) (lhs) = data[0] + (data[1] << 8) +#define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) + +void SetMonData(struct Pokemon *mon, s32 field, const u8 *data) +{ + switch (field) + { + case MON_DATA_STATUS: + SET32(mon->status); + break; + case MON_DATA_LEVEL: + SET8(mon->level); + break; + case MON_DATA_HP: + SET16(mon->hp); + break; + case MON_DATA_MAX_HP: + SET16(mon->maxHP); + break; + case MON_DATA_ATK: + SET16(mon->attack); + break; + case MON_DATA_DEF: + SET16(mon->defense); + break; + case MON_DATA_SPEED: + SET16(mon->speed); + break; + case MON_DATA_SPATK: + SET16(mon->spAttack); + break; + case MON_DATA_SPDEF: + SET16(mon->spDefense); + break; + case MON_DATA_MAIL: + SET8(mon->mail); + break; + case MON_DATA_SPECIES2: + break; + default: + SetBoxMonData(&mon->box, field, data); + break; + } +} + +void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data) +{ + struct PokemonSubstruct0 *substruct0 = NULL; + struct PokemonSubstruct1 *substruct1 = NULL; + struct PokemonSubstruct2 *substruct2 = NULL; + struct PokemonSubstruct3 *substruct3 = NULL; + + if (field > MON_DATA_10) + { + substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); + substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); + substruct2 = &(GetSubstruct(boxMon, boxMon->personality, 2)->type2); + substruct3 = &(GetSubstruct(boxMon, boxMon->personality, 3)->type3); + + DecryptBoxMon(boxMon); + + if (CalculateBoxMonChecksum(boxMon) != boxMon->checksum) + { + boxMon->isBadEgg = 1; + boxMon->isEgg = 1; + substruct3->isEgg = 1; + EncryptBoxMon(boxMon); + return; + } + } + + switch (field) + { + case MON_DATA_PERSONALITY: + SET32(boxMon->personality); + break; + case MON_DATA_OT_ID: + SET32(boxMon->otId); + break; + case MON_DATA_NICKNAME: + { + s32 i; + for (i = 0; i < POKEMON_NAME_LENGTH; i++) + boxMon->nickname[i] = data[i]; + break; + } + case MON_DATA_LANGUAGE: + SET8(boxMon->language); + break; + case MON_DATA_SANITY_BIT1: + SET8(boxMon->isBadEgg); + break; + case MON_DATA_SANITY_BIT2: + SET8(boxMon->hasSpecies); + break; + case MON_DATA_SANITY_BIT3: + SET8(boxMon->isEgg); + break; + case MON_DATA_OT_NAME: + { + s32 i; + for (i = 0; i < OT_NAME_LENGTH; i++) + boxMon->otName[i] = data[i]; + break; + } + case MON_DATA_MARKINGS: + SET8(boxMon->markings); + break; + case MON_DATA_CHECKSUM: + SET16(boxMon->checksum); + break; + case MON_DATA_10: + SET16(boxMon->unknown); + break; + case MON_DATA_SPECIES: + { + SET16(substruct0->species); + if (substruct0->species) + boxMon->hasSpecies = 1; + else + boxMon->hasSpecies = 0; + break; + } + case MON_DATA_HELD_ITEM: + SET16(substruct0->heldItem); + break; + case MON_DATA_EXP: + SET32(substruct0->experience); + break; + case MON_DATA_PP_BONUSES: + SET8(substruct0->ppBonuses); + break; + case MON_DATA_FRIENDSHIP: + SET8(substruct0->friendship); + break; + case MON_DATA_MOVE1: + case MON_DATA_MOVE2: + case MON_DATA_MOVE3: + case MON_DATA_MOVE4: + SET16(substruct1->moves[field - MON_DATA_MOVE1]); + break; + case MON_DATA_PP1: + case MON_DATA_PP2: + case MON_DATA_PP3: + case MON_DATA_PP4: + SET8(substruct1->pp[field - MON_DATA_PP1]); + break; + case MON_DATA_HP_EV: + SET8(substruct2->hpEV); + break; + case MON_DATA_ATK_EV: + SET8(substruct2->attackEV); + break; + case MON_DATA_DEF_EV: + SET8(substruct2->defenseEV); + break; + case MON_DATA_SPEED_EV: + SET8(substruct2->speedEV); + break; + case MON_DATA_SPATK_EV: + SET8(substruct2->spAttackEV); + break; + case MON_DATA_SPDEF_EV: + SET8(substruct2->spDefenseEV); + break; + case MON_DATA_COOL: + SET8(substruct2->cool); + break; + case MON_DATA_BEAUTY: + SET8(substruct2->beauty); + break; + case MON_DATA_CUTE: + SET8(substruct2->cute); + break; + case MON_DATA_SMART: + SET8(substruct2->smart); + break; + case MON_DATA_TOUGH: + SET8(substruct2->tough); + break; + case MON_DATA_SHEEN: + SET8(substruct2->sheen); + break; + case MON_DATA_POKERUS: + SET8(substruct3->pokerus); + break; + case MON_DATA_MET_LOCATION: + SET8(substruct3->metLocation); + break; + case MON_DATA_MET_LEVEL: + { + u8 metLevel = *data; + substruct3->metLevel = metLevel; + break; + } + case MON_DATA_MET_GAME: + SET8(substruct3->metGame); + break; + case MON_DATA_POKEBALL: + { + u8 pokeball = *data; + substruct3->pokeball = pokeball; + break; + } + case MON_DATA_OT_GENDER: + SET8(substruct3->otGender); + break; + case MON_DATA_HP_IV: + SET8(substruct3->hpIV); + break; + case MON_DATA_ATK_IV: + SET8(substruct3->attackIV); + break; + case MON_DATA_DEF_IV: + SET8(substruct3->defenseIV); + break; + case MON_DATA_SPEED_IV: + SET8(substruct3->speedIV); + break; + case MON_DATA_SPATK_IV: + SET8(substruct3->spAttackIV); + break; + case MON_DATA_SPDEF_IV: + SET8(substruct3->spDefenseIV); + break; + case MON_DATA_IS_EGG: + SET8(substruct3->isEgg); + if (substruct3->isEgg) + boxMon->isEgg = 1; + else + boxMon->isEgg = 0; + break; + case MON_DATA_ALT_ABILITY: + SET8(substruct3->altAbility); + break; + case MON_DATA_COOL_RIBBON: + SET8(substruct3->coolRibbon); + break; + case MON_DATA_BEAUTY_RIBBON: + SET8(substruct3->beautyRibbon); + break; + case MON_DATA_CUTE_RIBBON: + SET8(substruct3->cuteRibbon); + break; + case MON_DATA_SMART_RIBBON: + SET8(substruct3->smartRibbon); + break; + case MON_DATA_TOUGH_RIBBON: + SET8(substruct3->toughRibbon); + break; + case MON_DATA_CHAMPION_RIBBON: + SET8(substruct3->championRibbon); + break; + case MON_DATA_WINNING_RIBBON: + SET8(substruct3->winningRibbon); + break; + case MON_DATA_VICTORY_RIBBON: + SET8(substruct3->victoryRibbon); + break; + case MON_DATA_ARTIST_RIBBON: + SET8(substruct3->artistRibbon); + break; + case MON_DATA_EFFORT_RIBBON: + SET8(substruct3->effortRibbon); + break; + case MON_DATA_GIFT_RIBBON_1: + SET8(substruct3->giftRibbon1); + break; + case MON_DATA_GIFT_RIBBON_2: + SET8(substruct3->giftRibbon2); + break; + case MON_DATA_GIFT_RIBBON_3: + SET8(substruct3->giftRibbon3); + break; + case MON_DATA_GIFT_RIBBON_4: + SET8(substruct3->giftRibbon4); + break; + case MON_DATA_GIFT_RIBBON_5: + SET8(substruct3->giftRibbon5); + break; + case MON_DATA_GIFT_RIBBON_6: + SET8(substruct3->giftRibbon6); + break; + case MON_DATA_GIFT_RIBBON_7: + SET8(substruct3->giftRibbon7); + break; + case MON_DATA_FATEFUL_ENCOUNTER: + SET8(substruct3->fatefulEncounter); + break; + case MON_DATA_IVS: + { +#ifdef BUGFIX_SETMONIVS + u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); +#else + u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0. +#endif + substruct3->hpIV = ivs & 0x1F; + substruct3->attackIV = (ivs >> 5) & 0x1F; + substruct3->defenseIV = (ivs >> 10) & 0x1F; + substruct3->speedIV = (ivs >> 15) & 0x1F; + substruct3->spAttackIV = (ivs >> 20) & 0x1F; + substruct3->spDefenseIV = (ivs >> 25) & 0x1F; + break; + } + default: + break; + } + + if (field > MON_DATA_10) + { + boxMon->checksum = CalculateBoxMonChecksum(boxMon); + EncryptBoxMon(boxMon); + } +} + +void CopyMon(void *dest, void *src, size_t size) +{ + memcpy(dest, src, size); +} + +u8 GiveMonToPlayer(struct Pokemon *mon) +{ + s32 i; + + SetMonData(mon, MON_DATA_OT_NAME, gSaveBlock2.playerName); + SetMonData(mon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); + SetMonData(mon, MON_DATA_OT_ID, gSaveBlock2.playerTrainerId); + + i = 0; + + while (i < 6 && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + i++; + + if (i >= 6) + return SendMonToPC(mon); + + CopyMon(&gPlayerParty[i], mon, sizeof(*mon)); + gPlayerPartyCount = i + 1; + return 0; +} + +u8 SendMonToPC(struct Pokemon *mon) +{ + s32 i = gPokemonStorage.currentBox; + + do + { + s32 j; + for (j = 0; j < 30; j++) + { + if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + { + MonRestorePP(mon); + CopyMon(&gPokemonStorage.boxes[i][j], &mon->box, sizeof(mon->box)); + return 1; + } + } + + i++; + if (i == 14) + i = 0; + } while (i != gPokemonStorage.currentBox); + + return 2; +} + +u8 CalculatePlayerPartyCount(void) +{ + gPlayerPartyCount = 0; + + while (gPlayerPartyCount < 6 + && GetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + gPlayerPartyCount++; + } + + return gPlayerPartyCount; +} + +u8 CalculateEnemyPartyCount(void) +{ + gEnemyPartyCount = 0; + + while (gEnemyPartyCount < 6 + && GetMonData(&gEnemyParty[gEnemyPartyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + gEnemyPartyCount++; + } + + return gEnemyPartyCount; +} + +u8 sub_803DAA0(void) +{ + s32 aliveCount = 0; + s32 i; + CalculatePlayerPartyCount(); + + if (gPlayerPartyCount == 1) + return gPlayerPartyCount; + + for (i = 0; i < gPlayerPartyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0 + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_NONE + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_EGG) + aliveCount++; + } + + return (aliveCount > 1) ? 0 : 2; +} + +u8 GetAbilityBySpecies(u16 species, bool8 altAbility) +{ + if (altAbility) + gLastUsedAbility = gBaseStats[species].ability2; + else + gLastUsedAbility = gBaseStats[species].ability1; + + return gLastUsedAbility; +} + +u8 GetMonAbility(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u8 altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); + return GetAbilityBySpecies(species, altAbility); +} + +void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) +{ + s32 i, j; + + ZeroEnemyPartyMons(); + *eSecretBaseRecord = *secretBaseRecord; + + for (i = 0; i < 6; i++) + { + if (eSecretBaseRecord->partySpecies[i]) + { + CreateMon(&gEnemyParty[i], + eSecretBaseRecord->partySpecies[i], + eSecretBaseRecord->partyLevels[i], + 15, + 1, + eSecretBaseRecord->partyPersonality[i], + 2, + 0); + + // these two SetMonData calls require the (u8 *) cast since SetMonData is declared in this function. + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, (u8 *)&eSecretBaseRecord->partyHeldItems[i]); + + for (j = 0; j < 6; j++) + SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &eSecretBaseRecord->partyEVs[i]); + + for (j = 0; j < 4; j++) + { + SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, (u8 *)&eSecretBaseRecord->partyMoves[i * 4 + j]); + SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[eSecretBaseRecord->partyMoves[i * 4 + j]].pp); + } + } + } + + gBattleTypeFlags = 8; + gTrainerBattleOpponent = 1024; +} + +const u8 gSecretBaseTrainerClasses[][5] = { + // male + {FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_BUG_CATCHER, FACILITY_CLASS_RICH_BOY, FACILITY_CLASS_CAMPER, FACILITY_CLASS_COOL_TRAINER_M}, + // female + {FACILITY_CLASS_LASS, FACILITY_CLASS_SCHOOL_KID_F, FACILITY_CLASS_LADY, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_COOL_TRAINER_F} +}; + +u8 GetSecretBaseTrainerPicIndex(void) +{ + u8 trainerClass = gSecretBaseTrainerClasses[eSecretBaseRecord->gender][eSecretBaseRecord->trainerId[0] % 5]; + return gTrainerClassToPicIndex[trainerClass]; +} + +u8 GetSecretBaseTrainerNameIndex(void) +{ + u8 trainerClass = gSecretBaseTrainerClasses[eSecretBaseRecord->gender][eSecretBaseRecord->trainerId[0] % 5]; + return gTrainerClassToNameIndex[trainerClass]; +} + +u8 PlayerPartyAndPokemonStorageFull(void) +{ + s32 i; + + for (i = 0; i < 6; i++) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + return 0; + + return PokemonStorageFull(); +} + +u8 PokemonStorageFull(void) +{ + s32 i, j; + + for (i = 0; i < 14; i++) + for (j = 0; j < 30; j++) + if (GetBoxMonData(&gPokemonStorage.boxes[i][j], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + return 0; + + return 1; +} + +void GetSpeciesName(u8 *name, u16 species) +{ + s32 i; + + for (i = 0; i <= POKEMON_NAME_LENGTH; i++) + { + if (species > NUM_SPECIES) + name[i] = gSpeciesNames[0][i]; + else + name[i] = gSpeciesNames[species][i]; + + if (name[i] == EOS) + break; + } + + name[i] = EOS; +} + +u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) +{ + u8 basePP = gBattleMoves[move].pp; + return basePP + ((basePP * 20 * ((gUnknown_08208238[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); +} + +void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex) +{ + u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + ppBonuses &= gUnknown_0820823C[moveIndex]; + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) +{ + mon->ppBonuses &= gUnknown_0820823C[moveIndex]; +} + +void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex) +{ + s32 i; + s8 nickname[POKEMON_NAME_LENGTH * 2]; + + gBattleMons[battleIndex].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); + gBattleMons[battleIndex].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); + + for (i = 0; i < 4; i++) + { + gBattleMons[battleIndex].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL); + gBattleMons[battleIndex].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL); + } + + gBattleMons[battleIndex].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL); + gBattleMons[battleIndex].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL); + gBattleMons[battleIndex].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL); + gBattleMons[battleIndex].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); + gBattleMons[battleIndex].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); + gBattleMons[battleIndex].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); + gBattleMons[battleIndex].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL); + gBattleMons[battleIndex].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); + gBattleMons[battleIndex].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); + gBattleMons[battleIndex].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); + gBattleMons[battleIndex].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL); + gBattleMons[battleIndex].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL); + gBattleMons[battleIndex].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL); + gBattleMons[battleIndex].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); + gBattleMons[battleIndex].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); + gBattleMons[battleIndex].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); + gBattleMons[battleIndex].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL); + gBattleMons[battleIndex].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); + gBattleMons[battleIndex].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); + gBattleMons[battleIndex].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); + gBattleMons[battleIndex].altAbility = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ALT_ABILITY, NULL); + gBattleMons[battleIndex].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); + gBattleMons[battleIndex].type1 = gBaseStats[gBattleMons[battleIndex].species].type1; + gBattleMons[battleIndex].type2 = gBaseStats[gBattleMons[battleIndex].species].type2; + gBattleMons[battleIndex].ability = GetAbilityBySpecies(gBattleMons[battleIndex].species, gBattleMons[battleIndex].altAbility); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); + StringCopy10(gBattleMons[battleIndex].nickname, nickname); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battleIndex].otName); + ewram160BC[GetBankSide(battleIndex)] = gBattleMons[battleIndex].hp; + + for (i = 0; i < 8; i++) + gBattleMons[battleIndex].statStages[i] = 6; + + gBattleMons[battleIndex].status2 = 0; + sub_80157C4(battleIndex); + sub_8032AA8(battleIndex, 0); +} diff --git a/src/pokemon_3.c b/src/pokemon_3.c new file mode 100644 index 000000000..9346031a6 --- /dev/null +++ b/src/pokemon_3.c @@ -0,0 +1,1401 @@ +#include "global.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "battle.h" +#include "battle_message.h" +#include "data2.h" +#include "event_data.h" +#include "item.h" +#include "link.h" +#include "m4a.h" +#include "main.h" +#include "pokemon.h" +#include "random.h" +#include "overworld.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "rtc.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "sprite.h" +#include "string_util.h" +#include "text.h" +#include "util.h" +#include "ewram.h" + +extern u8 gPlayerPartyCount; +extern u8 gEnemyPartyCount; +extern struct BattlePokemon gBattleMons[4]; +extern u8 gActiveBank; +extern struct BattleEnigmaBerry gEnigmaBerries[]; +extern u16 gSpeciesToHoennPokedexNum[]; +extern u16 gSpeciesToNationalPokedexNum[]; +extern u16 gHoennToNationalOrder[]; +extern u16 gSpeciesIdToCryId[]; +extern u8 gBattleTextBuff1[]; +extern u8 gBattleTextBuff2[]; +extern u8 gDisplayedStringBattle[]; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gStringBank; +extern u8 gBankInMenu; +extern struct SpindaSpot gSpindaSpotGraphics[]; +extern s8 gNatureStatTable[][5]; +extern u16 gTrainerBattleOpponent; +extern u16 gBattleTypeFlags; +extern u32 gTMHMLearnsets[][2]; +extern u8 gBattleMonForms[]; +extern const u8 BattleText_Wally[]; +extern s8 gPokeblockFlavorCompatibilityTable[]; +extern u8 gLastUsedAbility; +extern const u8 BattleText_PreventedSwitch[]; +extern u16 gBattlePartyID[]; + +extern u8 BattleText_Rose[]; +extern u8 BattleText_UnknownString3[]; +extern u8 BattleText_MistShroud[]; +extern u8 BattleText_GetPumped[]; +extern u8 *gUnknown_08400F58[]; + +bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) +{ + u32 status = GetMonData(mon, MON_DATA_STATUS, 0); + + if (status & healMask) + { + status &= ~healMask; + SetMonData(mon, MON_DATA_STATUS, &status); + if (gMain.inBattle && battleId != 4) + gBattleMons[battleId].status1 &= ~healMask; + return FALSE; + } + else + { + return TRUE; + } +} + +u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) +{ + const u8 *temp; + const u8 *itemEffect; + u8 offset; + int i; + u8 j; + u8 val; + + offset = 6; + + temp = gItemEffectTable[itemId - 13]; + + if (!temp && itemId != ITEM_ENIGMA_BERRY) + return 0; + + if (itemId == ITEM_ENIGMA_BERRY) + { + temp = gEnigmaBerries[gActiveBank].itemEffect; + } + + itemEffect = temp; + + for (i = 0; i < 6; i++) + { + switch (i) + { + case 0: + case 1: + case 2: + case 3: + if (i == effectByte) + return 0; + break; + case 4: + val = itemEffect[4]; + if (val & 0x20) + val &= 0xDF; + j = 0; + while (val) + { + if (val & 1) + { + switch (j) + { + case 2: + if (val & 0x10) + val &= 0xEF; + case 0: + if (i == effectByte && (val & effectBit)) + return offset; + offset++; + break; + case 1: + if (i == effectByte && (val & effectBit)) + return offset; + offset++; + break; + case 3: + if (i == effectByte && (val & effectBit)) + return offset; + offset++; + break; + case 7: + if (i == effectByte) + return 0; + break; + } + } + j++; + val >>= 1; + if (i == effectByte) + effectBit >>= 1; + } + break; + case 5: + val = itemEffect[5]; + j = 0; + while (val) + { + if (val & 1) + { + switch (j) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + if (i == effectByte && (val & effectBit)) + return offset; + offset++; + break; + case 7: + if (i == effectByte) + return 0; + break; + } + } + j++; + val >>= 1; + if (i == effectByte) + effectBit >>= 1; + } + break; + } + } + + return offset; +} + +const u8 gUnknown_082082F8[] = {1, 1, 3, 2, 4, 6}; + +void sub_803F324(int stat) +{ + gBankTarget = gBankInMenu; + StringCopy(gBattleTextBuff1, gUnknown_08400F58[gUnknown_082082F8[stat]]); + StringCopy(gBattleTextBuff2, BattleText_Rose); + StrCpyDecodeToDisplayedStringBattle(BattleText_UnknownString3); +} + +u8 *sub_803F378(u16 itemId) +{ + int i; + const u8 *itemEffect; + + if (itemId == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + { + itemEffect = gEnigmaBerries[gBankInMenu].itemEffect; + } + else + { + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + } + } + else + { + itemEffect = gItemEffectTable[itemId - 13]; + } + + gStringBank = gBankInMenu; + + for (i = 0; i < 3; i++) + { + if (itemEffect[i] & 0xF) + sub_803F324(i * 2); + if (itemEffect[i] & 0xF0) + { + if (i) + { + sub_803F324(i * 2 + 1); + } + else + { + gBankAttacker = gBankInMenu; + StrCpyDecodeToDisplayedStringBattle(BattleText_GetPumped); + } + } + } + + if (itemEffect[3] & 0x80) + { + gBankAttacker = gBankInMenu; + StrCpyDecodeToDisplayedStringBattle(BattleText_MistShroud); + } + + return gDisplayedStringBattle; +} + +u8 GetNature(struct Pokemon *mon) +{ + return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25; +} + +u8 GetNatureFromPersonality(u32 personality) +{ + return personality % 25; +} + +u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) +{ + int i; + u16 targetSpecies = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u8 level; + u16 friendship; + u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); + u16 upperPersonality = personality >> 16; + u8 holdEffect; + + if (heldItem == ITEM_ENIGMA_BERRY) + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + else + holdEffect = ItemId_GetHoldEffect(heldItem); + + if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3) + return 0; + + switch (type) + { + case 0: + level = GetMonData(mon, MON_DATA_LEVEL, 0); + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + + for (i = 0; i < 5; i++) + { + switch (gEvolutionTable[species][i].method) + { + case EVO_FRIENDSHIP: + if (friendship >= 220) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_FRIENDSHIP_DAY: + RtcCalcLocalTime(); + if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_FRIENDSHIP_NIGHT: + RtcCalcLocalTime(); + if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_LEVEL: + if (gEvolutionTable[species][i].param <= level) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_LEVEL_ATK_GT_DEF: + if (gEvolutionTable[species][i].param <= level) + if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0)) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_LEVEL_ATK_EQ_DEF: + if (gEvolutionTable[species][i].param <= level) + if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0)) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_LEVEL_ATK_LT_DEF: + if (gEvolutionTable[species][i].param <= level) + if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0)) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_LEVEL_SILCOON: + if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_LEVEL_CASCOON: + if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_LEVEL_NINJASK: + if (gEvolutionTable[species][i].param <= level) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_BEAUTY: + if (gEvolutionTable[species][i].param <= beauty) + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + } + } + break; + case 1: + for (i = 0; i < 5; i++) + { + switch (gEvolutionTable[species][i].method) + { + case EVO_TRADE: + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + case EVO_TRADE_ITEM: + if (gEvolutionTable[species][i].param == heldItem) + { + heldItem = 0; + SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem); + targetSpecies = gEvolutionTable[species][i].targetSpecies; + } + break; + } + } + break; + case 2: + case 3: + for (i = 0; i < 5; i++) + { + if (gEvolutionTable[species][i].method == EVO_ITEM + && gEvolutionTable[species][i].param == evolutionItem) + { + targetSpecies = gEvolutionTable[species][i].targetSpecies; + break; + } + } + break; + } + + return targetSpecies; +} + +u16 HoennPokedexNumToSpecies(u16 hoennNum) +{ + u16 species; + + if (!hoennNum) + return 0; + + species = 0; + + while (species < 411 && gSpeciesToHoennPokedexNum[species] != hoennNum) + species++; + + if (species == 411) + return 0; + + return species + 1; +} + +u16 NationalPokedexNumToSpecies(u16 nationalNum) +{ + u16 species; + + if (!nationalNum) + return 0; + + species = 0; + + while (species < 411 && gSpeciesToNationalPokedexNum[species] != nationalNum) + species++; + + if (species == 411) + return 0; + + return species + 1; +} + +u16 NationalToHoennOrder(u16 nationalNum) +{ + u16 hoennNum; + + if (!nationalNum) + return 0; + + hoennNum = 0; + + while (hoennNum < 411 && gHoennToNationalOrder[hoennNum] != nationalNum) + hoennNum++; + + if (hoennNum == 411) + return 0; + + return hoennNum + 1; +} + +u16 SpeciesToNationalPokedexNum(u16 species) +{ + if (!species) + return 0; + + return gSpeciesToNationalPokedexNum[species - 1]; +} + +u16 SpeciesToHoennPokedexNum(u16 species) +{ + if (!species) + return 0; + + return gSpeciesToHoennPokedexNum[species - 1]; +} + +u16 HoennToNationalOrder(u16 hoennNum) +{ + if (!hoennNum) + return 0; + + return gHoennToNationalOrder[hoennNum - 1]; +} + +u16 SpeciesToCryId(u16 species) +{ + if (species <= 250) + return species; + + if (species < 276) + return 200; + + return gSpeciesIdToCryId[species - 276]; +} + +void unref_sub_803F938(u16 species, u32 personality, u8 *dest) +{ + if (species == SPECIES_SPINDA && dest != gUnknown_081FAF4C[0] && dest != gUnknown_081FAF4C[2]) + { + int i; + for (i = 0; i < 4; i++) + { + int j; + u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); + u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); + + for (j = 0; j < 16; j++) + { + int k; + s32 row = gSpindaSpotGraphics[i].image[j]; + + for (k = x; k < x + 16; k++) + { + u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); + + if (row & 1) + { + if (k & 1) + { + if ((u8)((*val & 0xF0) - 0x10) <= 0x20) + *val += 0x40; + } + else + { + if ((u8)((*val & 0xF) - 0x01) <= 0x02) + *val += 0x04; + } + } + + row >>= 1; + } + + y++; + } + + personality >>= 8; + } + } +} + +void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4) +{ + if (species == SPECIES_SPINDA && a4) + { + int i; + for (i = 0; i < 4; i++) + { + int j; + u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); + u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); + + for (j = 0; j < 16; j++) + { + int k; + s32 row = gSpindaSpotGraphics[i].image[j]; + + for (k = x; k < x + 16; k++) + { + u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); + + if (row & 1) + { + if (k & 1) + { + if ((u8)((*val & 0xF0) - 0x10) <= 0x20) + *val += 0x40; + } + else + { + if ((u8)((*val & 0xF) - 0x01) <= 0x02) + *val += 0x04; + } + } + + row >>= 1; + } + + y++; + } + + personality >>= 8; + } + } +} + +void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) +{ +#ifdef BUGFIX_EVO_NAME + u8 language; + GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); + language = GetMonData(mon, MON_DATA_LANGUAGE, &language); + if (language == GAME_LANGUAGE && !StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) + SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); +#else + GetMonData(mon, MON_DATA_NICKNAME, gStringVar1); + if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[oldSpecies], gStringVar1)) + SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[newSpecies]); +#endif +} + +bool8 sub_803FBBC(void) +{ + bool8 retVal = FALSE; + switch (gLinkPlayers[GetMultiplayerId()].lp_field_18) + { + case 0: + case 3: + retVal = FALSE; + break; + case 1: + case 2: + retVal = TRUE; + break; + } + return retVal; +} + +bool8 sub_803FBFC(u8 id) +{ + bool8 retVal = FALSE; + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + retVal = FALSE; + break; + case 1: + case 2: + retVal = TRUE; + break; + } + return retVal; +} + +s32 sub_803FC34(u16 a1) +{ + s32 id; + for (id = 0; id < MAX_LINK_PLAYERS; id++) + if (gLinkPlayers[id].lp_field_18 == a1) + break; + return id; +} + +u8 sub_803FC58(u16 trainer) +{ + return gTrainers[trainer].encounterMusic_gender & 0x7F; +} + +u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex) +{ + if (statIndex < 1 || statIndex > 5) + { + // should just be "return n", but it wouldn't match without this + u16 retVal = n; + retVal++; + retVal--; + return retVal; + } + + switch (gNatureStatTable[nature][statIndex - 1]) + { + case 1: + return (u16)(n * 110) / 100; + case -1: + return (u16)(n * 90) / 100; + } + + return n; +} + +const s8 gUnknown_082082FE[][3] = +{ + // Happiness deltas + { 5, 3, 2}, + { 5, 3, 2}, + { 1, 1, 0}, + { 3, 2, 1}, + { 1, 1, 0}, + { 1, 1, 1}, + {-1, -1, -1}, + {-5, -5, -10}, + {-5, -5, -10} +}; + +void AdjustFriendship(struct Pokemon *mon, u8 event) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u8 holdEffect; + + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + holdEffect = gEnigmaBerries[0].holdEffect; + else + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + if (species && species != SPECIES_EGG) + { + u8 friendshipLevel = 0; + s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + if (friendship > 99) + friendshipLevel++; + if (friendship > 199) + friendshipLevel++; + if ((event != 5 || !(Random() & 1)) + && (event != 3 + || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && (gTrainers[gTrainerBattleOpponent].trainerClass == 24 + || gTrainers[gTrainerBattleOpponent].trainerClass == 25 + || gTrainers[gTrainerBattleOpponent].trainerClass == 32)))) + { + s8 mod = gUnknown_082082FE[event][friendshipLevel]; + if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + mod = (150 * mod) / 100; + friendship += mod; + if (mod > 0) + { + if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) + friendship++; + if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); + } + } +} + +void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) +{ + u8 evs[NUM_STATS]; + u16 evIncrease = 0; + u16 totalEVs = 0; + u16 heldItem; + u8 holdEffect; + int i; + + for (i = 0; i < NUM_STATS; i++) + { + evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0); + totalEVs += evs[i]; + } + + for (i = 0; i < NUM_STATS; i++) + { + u8 hasHadPokerus; + int multiplier; + + if (totalEVs >= MAX_TOTAL_EVS) + break; + + hasHadPokerus = CheckPartyHasHadPokerus(mon, 0); + + if (hasHadPokerus) + multiplier = 2; + else + multiplier = 1; + + switch (i) + { + case 0: + evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier; + break; + case 1: + evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier; + break; + case 2: + evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier; + break; + case 3: + evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier; + break; + case 4: + evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier; + break; + case 5: + evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier; + break; + } + + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + holdEffect = gEnigmaBerries[0].holdEffect; + else + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + if (holdEffect == HOLD_EFFECT_MACHO_BRACE) + evIncrease *= 2; + + if (totalEVs + (s16)evIncrease > MAX_TOTAL_EVS) + evIncrease = ((s16)evIncrease + MAX_TOTAL_EVS) - (totalEVs + evIncrease); + + if (evs[i] + (s16)evIncrease > 255) + { + int val1 = (s16)evIncrease + 255; + int val2 = evs[i] + evIncrease; + evIncrease = val1 - val2; + } + + evs[i] += evIncrease; + totalEVs += evIncrease; + SetMonData(mon, MON_DATA_HP_EV + i, &evs[i]); + } +} + +u16 GetMonEVCount(struct Pokemon *mon) +{ + int i; + u16 count = 0; + + for (i = 0; i < NUM_STATS; i++) + count += GetMonData(mon, MON_DATA_HP_EV + i, 0); + + return count; +} + +void RandomlyGivePartyPokerus(struct Pokemon *party) +{ + u16 rnd = Random(); + if (rnd == 0x4000 || rnd == 0x8000 || rnd == 0xC000) + { + struct Pokemon *mon; + + do + { + do + { + rnd = Random() % PARTY_SIZE; + mon = &party[rnd]; + } + while (!GetMonData(mon, MON_DATA_SPECIES, 0)); + } + while (GetMonData(mon, MON_DATA_IS_EGG, 0)); + + if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd]))) + { + u8 rnd2; + + do + { + rnd2 = Random(); + } + while (rnd2 == 0); + + if (rnd2 & 0xF0) + rnd2 &= 0x07; + + rnd2 |= (rnd2 << 4); + rnd2 &= 0xF3; + rnd2++; + + SetMonData(&party[rnd], MON_DATA_POKERUS, &rnd2); + } + } +} + +u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) +{ + u8 retVal; + + int partyIndex = 0; + unsigned curBit = 1; + retVal = 0; + + if (selection) + { + do + { + if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF)) + retVal |= curBit; + partyIndex++; + curBit <<= 1; + selection >>= 1; + } + while (selection); + } + else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF) + { + retVal = 1; + } + + return retVal; +} + +u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) +{ + u8 retVal; + + int partyIndex = 0; + unsigned curBit = 1; + retVal = 0; + + if (selection) + { + do + { + if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0)) + retVal |= curBit; + partyIndex++; + curBit <<= 1; + selection >>= 1; + } + while (selection); + } + else if (GetMonData(&party[0], MON_DATA_POKERUS, 0)) + { + retVal = 1; + } + + return retVal; +} + +void UpdatePartyPokerusTime(u16 days) +{ + int i; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, 0)) + { + u8 pokerus = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS, 0); + if (pokerus & 0xF) + { + if ((pokerus & 0xF) < days || days > 4) + pokerus &= 0xF0; + else + pokerus -= days; + + SetMonData(&gPlayerParty[i], MON_DATA_POKERUS, &pokerus); + } + } + } +} + +void PartySpreadPokerus(struct Pokemon *party) +{ + if ((Random() % 3) == 0) + { + int i; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_SPECIES, 0)) + { + u8 pokerus = GetMonData(&party[i], MON_DATA_POKERUS, 0); + u8 curPokerus = pokerus; + if (pokerus) + { + if (pokerus & 0xF) + { + // spread to adjacent party members + if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0)) + SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus); + if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0)) + { + SetMonData(&party[i + 1], MON_DATA_POKERUS, &curPokerus); + i++; + } + } + } + } + } + } +} + +bool8 TryIncrementMonLevel(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 nextLevel = GetMonData(mon, MON_DATA_LEVEL, 0) + 1; + if (GetMonData(mon, MON_DATA_EXP, 0) > gExperienceTables[gBaseStats[species].growthRate][nextLevel]) + { + SetMonData(mon, MON_DATA_LEVEL, &nextLevel); + return TRUE; + } + else + { + return FALSE; + } +} + +u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + if (species == SPECIES_EGG) + { + return 0; + } + else if (tm < 32) + { + u32 mask = 1 << tm; + return gTMHMLearnsets[species][0] & mask; + } + else + { + u32 mask = 1 << (tm - 32); + return gTMHMLearnsets[species][1] & mask; + } +} + +u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) +{ + u16 learnedMoves[4]; + u8 numMoves = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + int i, j, k; + + for (i = 0; i < 4; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (i = 0; i < 20; i++) + { + u16 moveLevel; + + if (gLevelUpLearnsets[species][i] == 0xFFFF) + break; + + moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; + + if (moveLevel <= (level << 9)) + { + for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + ; + + if (j == 4) + { + for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) + ; + + if (k == numMoves) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + } + } + } + + return numMoves; +} + +u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) +{ + u8 numMoves = 0; + int i; + + for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != 0xFFFF; i++) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + + return numMoves; +} + +u8 sub_8040574(struct Pokemon *mon) +{ + u16 learnedMoves[4]; + u16 moves[20]; + u8 numMoves = 0; + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + int i, j, k; + + if (species == SPECIES_EGG) + return 0; + + for (i = 0; i < 4; i++) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + + for (i = 0; i < 20; i++) + { + u16 moveLevel; + + if (gLevelUpLearnsets[species][i] == 0xFFFF) + break; + + moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; + + if (moveLevel <= (level << 9)) + { + for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + ; + + if (j == 4) + { + for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) + ; + + if (k == numMoves) + moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + } + } + } + + return numMoves; +} + +u16 SpeciesToPokedexNum(u16 species) +{ + if (IsNationalPokedexEnabled()) + { + return SpeciesToNationalPokedexNum(species); + } + else + { + species = SpeciesToHoennPokedexNum(species); + if (species <= 202) + return species; + return 0xFFFF; + } +} + +void ClearBattleMonForms(void) +{ + int i; + for (i = 0; i < 4; i++) + gBattleMonForms[i] = 0; +} + +u16 GetBGM_ForBattle(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) + return BGM_BATTLE34; + if (gBattleTypeFlags & BATTLE_TYPE_REGI) + return BGM_BATTLE36; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + return BGM_BATTLE20; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + switch (gTrainers[gTrainerBattleOpponent].trainerClass) + { + case 2: + case 0x31: + return BGM_BATTLE30; + case 3: + case 4: + case 0x32: + case 0x33: + return BGM_BATTLE31; + case 0x19: + return BGM_BATTLE32; + case 0x20: + return BGM_BATTLE33; + case 0x2E: + if (!StringCompare(gTrainers[gTrainerBattleOpponent].trainerName, BattleText_Wally)) + return BGM_BATTLE20; + return BGM_BATTLE35; + case 0x18: + return BGM_BATTLE38; + default: + return BGM_BATTLE20; + } + } + return BGM_BATTLE27; +} + +void sub_80408BC(void) +{ + ResetMapMusic(); + m4aMPlayAllStop(); + PlayBGM(GetBGM_ForBattle()); +} + +void current_map_music_set__default_for_battle(u16 song) +{ + ResetMapMusic(); + m4aMPlayAllStop(); + if (song) + PlayNewMapMusic(song); + else + PlayNewMapMusic(GetBGM_ForBattle()); +} + +const u8 *GetMonSpritePal(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return GetMonSpritePalFromOtIdPersonality(species, otId, personality); +} + +//Extracts the upper 16 bits of a 32-bit number +#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) + +//Extracts the lower 16 bits of a 32-bit number +#define LOHALF(n) ((n) & 0xFFFF) + +const u8 *GetMonSpritePalFromOtIdPersonality(u16 species, u32 otId, u32 personality) +{ + u32 shinyValue; + + if (species > SPECIES_EGG) + return gMonPaletteTable[0].data; + + shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + return gMonShinyPaletteTable[species].data; + else + return gMonPaletteTable[species].data; +} + +const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); +} + +const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality) +{ + u32 shinyValue; + + shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + return &gMonShinyPaletteTable[species]; + else + return &gMonPaletteTable[species]; +} + +const u16 gHMMoves[] = +{ + MOVE_CUT, + MOVE_FLY, + MOVE_SURF, + MOVE_STRENGTH, + MOVE_FLASH, + MOVE_ROCK_SMASH, + MOVE_WATERFALL, + MOVE_DIVE, + 0xffff +}; + +bool32 IsHMMove2(u16 move) +{ + int i = 0; + while (gHMMoves[i] != 0xFFFF) + { + if (gHMMoves[i++] == move) + return TRUE; + } + return FALSE; +} + +bool8 IsPokeSpriteNotFlipped(u16 species) +{ + return gBaseStats[species].noFlip; +} + +s8 sub_8040A54(struct Pokemon *mon, u8 a2) +{ + u8 nature = GetNature(mon); + return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; +} + +s8 GetPokeFlavourRelation(u32 personality, u8 a2) +{ + u8 nature = GetNatureFromPersonality(personality); + return gPokeblockFlavorCompatibilityTable[nature * 5 + a2]; +} + +bool8 IsTradedMon(struct Pokemon *mon) +{ + u8 otName[8]; + u32 otId; + GetMonData(mon, MON_DATA_OT_NAME, otName); + otId = GetMonData(mon, MON_DATA_OT_ID, 0); + return IsOtherTrainer(otId, otName); +} + +bool8 IsOtherTrainer(u32 otId, u8 *otName) +{ + if (otId == (gSaveBlock2.playerTrainerId[0] | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[3] << 24))) + { + int i; + + for (i = 0; otName[i] != EOS; i++) + if (otName[i] != gSaveBlock2.playerName[i]) + return TRUE; + return FALSE; + } + + return TRUE; +} + +void BoxMonRestorePP(struct BoxPokemon *); + +void MonRestorePP(struct Pokemon *mon) +{ + BoxMonRestorePP(&mon->box); +} + +void BoxMonRestorePP(struct BoxPokemon *boxMon) +{ + int i; + + for (i = 0; i < 4; i++) + { + if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0)) + { + u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0); + u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0); + u8 pp = CalculatePPWithBonus(move, bonus, i); + SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); + } + } +} + +void sub_8040B8C(void) +{ + gLastUsedAbility = gBattleStruct->unk160C0;; + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 4; + gBattleTextBuff1[2] = gBattleStruct->unk16054; + gBattleTextBuff1[4] = EOS; + if (!GetBankSide(gBattleStruct->unk16054)) + gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[gBattleStruct->unk16054]); + else + gBattleTextBuff1[3] = gBattlePartyID[gBattleStruct->unk16054]; + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 4; + gBattleTextBuff2[2] = gBankInMenu; + gBattleTextBuff2[3] = pokemon_order_func(gBattlePartyID[gBankInMenu]); + gBattleTextBuff2[4] = EOS; + StrCpyDecodeBattle(BattleText_PreventedSwitch, gStringVar4); +} + +void SetWildMonHeldItem(void) +{ + if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER))) + { + u16 rnd = Random() % 100; + u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); + if (gBaseStats[species].item1 == gBaseStats[species].item2) + { + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); + return; + } + + if (rnd > 44) + { + if (rnd <= 94) + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); + else + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2); + } + } +} + +bool8 IsShinyOtIdPersonality(u32, u32); + +bool8 IsShiny(struct Pokemon *mon) +{ + u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + return IsShinyOtIdPersonality(otId, personality); +} + +bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) +{ + bool8 retVal = FALSE; + u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + retVal = TRUE; + return retVal; +} + +u8 *sub_8040D08(void) +{ + u8 id = GetMultiplayerId(); + return gLinkPlayers[sub_803FC34(gLinkPlayers[id].lp_field_18 ^ 2)].name; +} + +const u8 gJapaneseNidoranNames[][11] = {_("ニドラン♂"), _("ニドラン♀")}; + +bool32 ShouldHideGenderIconForLanguage(u16 species, u8 *name, u8 language) +{ + bool32 retVal = FALSE; + if (species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) + { + const u8 *speciesName; + if (language == GAME_LANGUAGE) + { + speciesName = gSpeciesNames[species]; + } + else + { + if (species == SPECIES_NIDORAN_M) + speciesName = gJapaneseNidoranNames[0]; + else + speciesName = gJapaneseNidoranNames[1]; + } + if (!StringCompareWithoutExtCtrlCodes(name, speciesName)) + retVal = TRUE; + else + retVal = FALSE; + } + return retVal; +} + +bool32 ShouldHideGenderIcon(u16 species, u8 *name) +{ + u8 language = GAME_LANGUAGE; + if (name[0] == 0xFC && name[1] == 21) + language = LANGUAGE_JAPANESE; + return ShouldHideGenderIconForLanguage(species, name, language); +} + +bool32 unref_sub_8040DAC(struct Pokemon *mon) +{ + u8 name[12]; + u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u8 language = GetMonData(mon, MON_DATA_LANGUAGE, 0); + GetMonData(mon, MON_DATA_NICKNAME, name); + return ShouldHideGenderIconForLanguage(species, name, language); +} diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c new file mode 100644 index 000000000..b1b462761 --- /dev/null +++ b/src/pokemon_icon.c @@ -0,0 +1,1276 @@ +#include "global.h" +#include "graphics.h" +#include "mail_data.h" +#include "constants/species.h" +#include "sprite.h" + +#define POKE_ICON_BASE_PAL_TAG 56000 + +struct MonIconSpriteTemplate +{ + const struct OamData *oam; + const u8 *image; + const union AnimCmd *const *anims; + const union AffineAnimCmd *const *affineAnims; + void (*callback)(struct Sprite *); + u16 paletteTag; +}; + +const u8 * const gMonIconTable[] = +{ + gMonIcon_Bulbasaur, + gMonIcon_Bulbasaur, + gMonIcon_Ivysaur, + gMonIcon_Venusaur, + gMonIcon_Charmander, + gMonIcon_Charmeleon, + gMonIcon_Charizard, + gMonIcon_Squirtle, + gMonIcon_Wartortle, + gMonIcon_Blastoise, + gMonIcon_Caterpie, + gMonIcon_Metapod, + gMonIcon_Butterfree, + gMonIcon_Weedle, + gMonIcon_Kakuna, + gMonIcon_Beedrill, + gMonIcon_Pidgey, + gMonIcon_Pidgeotto, + gMonIcon_Pidgeot, + gMonIcon_Rattata, + gMonIcon_Raticate, + gMonIcon_Spearow, + gMonIcon_Fearow, + gMonIcon_Ekans, + gMonIcon_Arbok, + gMonIcon_Pikachu, + gMonIcon_Raichu, + gMonIcon_Sandshrew, + gMonIcon_Sandslash, + gMonIcon_NidoranF, + gMonIcon_Nidorina, + gMonIcon_Nidoqueen, + gMonIcon_NidoranM, + gMonIcon_Nidorino, + gMonIcon_Nidoking, + gMonIcon_Clefairy, + gMonIcon_Clefable, + gMonIcon_Vulpix, + gMonIcon_Ninetales, + gMonIcon_Jigglypuff, + gMonIcon_Wigglytuff, + gMonIcon_Zubat, + gMonIcon_Golbat, + gMonIcon_Oddish, + gMonIcon_Gloom, + gMonIcon_Vileplume, + gMonIcon_Paras, + gMonIcon_Parasect, + gMonIcon_Venonat, + gMonIcon_Venomoth, + gMonIcon_Diglett, + gMonIcon_Dugtrio, + gMonIcon_Meowth, + gMonIcon_Persian, + gMonIcon_Psyduck, + gMonIcon_Golduck, + gMonIcon_Mankey, + gMonIcon_Primeape, + gMonIcon_Growlithe, + gMonIcon_Arcanine, + gMonIcon_Poliwag, + gMonIcon_Poliwhirl, + gMonIcon_Poliwrath, + gMonIcon_Abra, + gMonIcon_Kadabra, + gMonIcon_Alakazam, + gMonIcon_Machop, + gMonIcon_Machoke, + gMonIcon_Machamp, + gMonIcon_Bellsprout, + gMonIcon_Weepinbell, + gMonIcon_Victreebel, + gMonIcon_Tentacool, + gMonIcon_Tentacruel, + gMonIcon_Geodude, + gMonIcon_Graveler, + gMonIcon_Golem, + gMonIcon_Ponyta, + gMonIcon_Rapidash, + gMonIcon_Slowpoke, + gMonIcon_Slowbro, + gMonIcon_Magnemite, + gMonIcon_Magneton, + gMonIcon_Farfetchd, + gMonIcon_Doduo, + gMonIcon_Dodrio, + gMonIcon_Seel, + gMonIcon_Dewgong, + gMonIcon_Grimer, + gMonIcon_Muk, + gMonIcon_Shellder, + gMonIcon_Cloyster, + gMonIcon_Gastly, + gMonIcon_Haunter, + gMonIcon_Gengar, + gMonIcon_Onix, + gMonIcon_Drowzee, + gMonIcon_Hypno, + gMonIcon_Krabby, + gMonIcon_Kingler, + gMonIcon_Voltorb, + gMonIcon_Electrode, + gMonIcon_Exeggcute, + gMonIcon_Exeggutor, + gMonIcon_Cubone, + gMonIcon_Marowak, + gMonIcon_Hitmonlee, + gMonIcon_Hitmonchan, + gMonIcon_Lickitung, + gMonIcon_Koffing, + gMonIcon_Weezing, + gMonIcon_Rhyhorn, + gMonIcon_Rhydon, + gMonIcon_Chansey, + gMonIcon_Tangela, + gMonIcon_Kangaskhan, + gMonIcon_Horsea, + gMonIcon_Seadra, + gMonIcon_Goldeen, + gMonIcon_Seaking, + gMonIcon_Staryu, + gMonIcon_Starmie, + gMonIcon_Mrmime, + gMonIcon_Scyther, + gMonIcon_Jynx, + gMonIcon_Electabuzz, + gMonIcon_Magmar, + gMonIcon_Pinsir, + gMonIcon_Tauros, + gMonIcon_Magikarp, + gMonIcon_Gyarados, + gMonIcon_Lapras, + gMonIcon_Ditto, + gMonIcon_Eevee, + gMonIcon_Vaporeon, + gMonIcon_Jolteon, + gMonIcon_Flareon, + gMonIcon_Porygon, + gMonIcon_Omanyte, + gMonIcon_Omastar, + gMonIcon_Kabuto, + gMonIcon_Kabutops, + gMonIcon_Aerodactyl, + gMonIcon_Snorlax, + gMonIcon_Articuno, + gMonIcon_Zapdos, + gMonIcon_Moltres, + gMonIcon_Dratini, + gMonIcon_Dragonair, + gMonIcon_Dragonite, + gMonIcon_Mewtwo, + gMonIcon_Mew, + gMonIcon_Chikorita, + gMonIcon_Bayleef, + gMonIcon_Meganium, + gMonIcon_Cyndaquil, + gMonIcon_Quilava, + gMonIcon_Typhlosion, + gMonIcon_Totodile, + gMonIcon_Croconaw, + gMonIcon_Feraligatr, + gMonIcon_Sentret, + gMonIcon_Furret, + gMonIcon_Hoothoot, + gMonIcon_Noctowl, + gMonIcon_Ledyba, + gMonIcon_Ledian, + gMonIcon_Spinarak, + gMonIcon_Ariados, + gMonIcon_Crobat, + gMonIcon_Chinchou, + gMonIcon_Lanturn, + gMonIcon_Pichu, + gMonIcon_Cleffa, + gMonIcon_Igglybuff, + gMonIcon_Togepi, + gMonIcon_Togetic, + gMonIcon_Natu, + gMonIcon_Xatu, + gMonIcon_Mareep, + gMonIcon_Flaaffy, + gMonIcon_Ampharos, + gMonIcon_Bellossom, + gMonIcon_Marill, + gMonIcon_Azumarill, + gMonIcon_Sudowoodo, + gMonIcon_Politoed, + gMonIcon_Hoppip, + gMonIcon_Skiploom, + gMonIcon_Jumpluff, + gMonIcon_Aipom, + gMonIcon_Sunkern, + gMonIcon_Sunflora, + gMonIcon_Yanma, + gMonIcon_Wooper, + gMonIcon_Quagsire, + gMonIcon_Espeon, + gMonIcon_Umbreon, + gMonIcon_Murkrow, + gMonIcon_Slowking, + gMonIcon_Misdreavus, + gMonIcon_UnownA, + gMonIcon_Wobbuffet, + gMonIcon_Girafarig, + gMonIcon_Pineco, + gMonIcon_Forretress, + gMonIcon_Dunsparce, + gMonIcon_Gligar, + gMonIcon_Steelix, + gMonIcon_Snubbull, + gMonIcon_Granbull, + gMonIcon_Qwilfish, + gMonIcon_Scizor, + gMonIcon_Shuckle, + gMonIcon_Heracross, + gMonIcon_Sneasel, + gMonIcon_Teddiursa, + gMonIcon_Ursaring, + gMonIcon_Slugma, + gMonIcon_Magcargo, + gMonIcon_Swinub, + gMonIcon_Piloswine, + gMonIcon_Corsola, + gMonIcon_Remoraid, + gMonIcon_Octillery, + gMonIcon_Delibird, + gMonIcon_Mantine, + gMonIcon_Skarmory, + gMonIcon_Houndour, + gMonIcon_Houndoom, + gMonIcon_Kingdra, + gMonIcon_Phanpy, + gMonIcon_Donphan, + gMonIcon_Porygon2, + gMonIcon_Stantler, + gMonIcon_Smeargle, + gMonIcon_Tyrogue, + gMonIcon_Hitmontop, + gMonIcon_Smoochum, + gMonIcon_Elekid, + gMonIcon_Magby, + gMonIcon_Miltank, + gMonIcon_Blissey, + gMonIcon_Raikou, + gMonIcon_Entei, + gMonIcon_Suicune, + gMonIcon_Larvitar, + gMonIcon_Pupitar, + gMonIcon_Tyranitar, + gMonIcon_Lugia, + gMonIcon_HoOh, + gMonIcon_Celebi, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_QuestionMark, + gMonIcon_Treecko, + gMonIcon_Grovyle, + gMonIcon_Sceptile, + gMonIcon_Torchic, + gMonIcon_Combusken, + gMonIcon_Blaziken, + gMonIcon_Mudkip, + gMonIcon_Marshtomp, + gMonIcon_Swampert, + gMonIcon_Poochyena, + gMonIcon_Mightyena, + gMonIcon_Zigzagoon, + gMonIcon_Linoone, + gMonIcon_Wurmple, + gMonIcon_Silcoon, + gMonIcon_Beautifly, + gMonIcon_Cascoon, + gMonIcon_Dustox, + gMonIcon_Lotad, + gMonIcon_Lombre, + gMonIcon_Ludicolo, + gMonIcon_Seedot, + gMonIcon_Nuzleaf, + gMonIcon_Shiftry, + gMonIcon_Nincada, + gMonIcon_Ninjask, + gMonIcon_Shedinja, + gMonIcon_Taillow, + gMonIcon_Swellow, + gMonIcon_Shroomish, + gMonIcon_Breloom, + gMonIcon_Spinda, + gMonIcon_Wingull, + gMonIcon_Pelipper, + gMonIcon_Surskit, + gMonIcon_Masquerain, + gMonIcon_Wailmer, + gMonIcon_Wailord, + gMonIcon_Skitty, + gMonIcon_Delcatty, + gMonIcon_Kecleon, + gMonIcon_Baltoy, + gMonIcon_Claydol, + gMonIcon_Nosepass, + gMonIcon_Torkoal, + gMonIcon_Sableye, + gMonIcon_Barboach, + gMonIcon_Whiscash, + gMonIcon_Luvdisc, + gMonIcon_Corphish, + gMonIcon_Crawdaunt, + gMonIcon_Feebas, + gMonIcon_Milotic, + gMonIcon_Carvanha, + gMonIcon_Sharpedo, + gMonIcon_Trapinch, + gMonIcon_Vibrava, + gMonIcon_Flygon, + gMonIcon_Makuhita, + gMonIcon_Hariyama, + gMonIcon_Electrike, + gMonIcon_Manectric, + gMonIcon_Numel, + gMonIcon_Camerupt, + gMonIcon_Spheal, + gMonIcon_Sealeo, + gMonIcon_Walrein, + gMonIcon_Cacnea, + gMonIcon_Cacturne, + gMonIcon_Snorunt, + gMonIcon_Glalie, + gMonIcon_Lunatone, + gMonIcon_Solrock, + gMonIcon_Azurill, + gMonIcon_Spoink, + gMonIcon_Grumpig, + gMonIcon_Plusle, + gMonIcon_Minun, + gMonIcon_Mawile, + gMonIcon_Meditite, + gMonIcon_Medicham, + gMonIcon_Swablu, + gMonIcon_Altaria, + gMonIcon_Wynaut, + gMonIcon_Duskull, + gMonIcon_Dusclops, + gMonIcon_Roselia, + gMonIcon_Slakoth, + gMonIcon_Vigoroth, + gMonIcon_Slaking, + gMonIcon_Gulpin, + gMonIcon_Swalot, + gMonIcon_Tropius, + gMonIcon_Whismur, + gMonIcon_Loudred, + gMonIcon_Exploud, + gMonIcon_Clamperl, + gMonIcon_Huntail, + gMonIcon_Gorebyss, + gMonIcon_Absol, + gMonIcon_Shuppet, + gMonIcon_Banette, + gMonIcon_Seviper, + gMonIcon_Zangoose, + gMonIcon_Relicanth, + gMonIcon_Aron, + gMonIcon_Lairon, + gMonIcon_Aggron, + gMonIcon_Castform, + gMonIcon_Volbeat, + gMonIcon_Illumise, + gMonIcon_Lileep, + gMonIcon_Cradily, + gMonIcon_Anorith, + gMonIcon_Armaldo, + gMonIcon_Ralts, + gMonIcon_Kirlia, + gMonIcon_Gardevoir, + gMonIcon_Bagon, + gMonIcon_Shelgon, + gMonIcon_Salamence, + gMonIcon_Beldum, + gMonIcon_Metang, + gMonIcon_Metagross, + gMonIcon_Regirock, + gMonIcon_Regice, + gMonIcon_Registeel, + gMonIcon_Kyogre, + gMonIcon_Groudon, + gMonIcon_Rayquaza, + gMonIcon_Latias, + gMonIcon_Latios, + gMonIcon_Jirachi, + gMonIcon_Deoxys, + gMonIcon_Chimecho, + gMonIcon_Egg, + gMonIcon_UnownB, + gMonIcon_UnownC, + gMonIcon_UnownD, + gMonIcon_UnownE, + gMonIcon_UnownF, + gMonIcon_UnownG, + gMonIcon_UnownH, + gMonIcon_UnownI, + gMonIcon_UnownJ, + gMonIcon_UnownK, + gMonIcon_UnownL, + gMonIcon_UnownM, + gMonIcon_UnownN, + gMonIcon_UnownO, + gMonIcon_UnownP, + gMonIcon_UnownQ, + gMonIcon_UnownR, + gMonIcon_UnownS, + gMonIcon_UnownT, + gMonIcon_UnownU, + gMonIcon_UnownV, + gMonIcon_UnownW, + gMonIcon_UnownX, + gMonIcon_UnownY, + gMonIcon_UnownZ, + gMonIcon_UnownExclamationMark, + gMonIcon_UnownQuestionMark, +}; + +const u8 gMonIconPaletteIndices[] = +{ + 0, // ?????????? + 1, // Bulbasaur + 1, // Ivysaur + 1, // Venusaur + 0, // Charmander + 0, // Charmeleon + 0, // Charizard + 0, // Squirtle + 2, // Wartortle + 2, // Blastoise + 1, // Caterpie + 1, // Metapod + 0, // Butterfree + 1, // Weedle + 2, // Kakuna + 2, // Beedrill + 0, // Pidgey + 0, // Pidgeotto + 0, // Pidgeot + 2, // Rattata + 1, // Raticate + 0, // Spearow + 0, // Fearow + 2, // Ekans + 2, // Arbok + 2, // Pikachu + 0, // Raichu + 2, // Sandshrew + 2, // Sandslash + 2, // Nidoran♀ + 2, // Nidorina + 2, // Nidoqueen + 2, // Nidoran♂ + 2, // Nidorino + 2, // Nidoking + 0, // Clefairy + 0, // Clefable + 2, // Vulpix + 1, // Ninetales + 0, // Jigglypuff + 0, // Wigglytuff + 2, // Zubat + 2, // Golbat + 1, // Oddish + 0, // Gloom + 0, // Vileplume + 0, // Paras + 0, // Parasect + 0, // Venonat + 2, // Venomoth + 2, // Diglett + 2, // Dugtrio + 1, // Meowth + 1, // Persian + 1, // Psyduck + 2, // Golduck + 1, // Mankey + 2, // Primeape + 0, // Growlithe + 0, // Arcanine + 0, // Poliwag + 0, // Poliwhirl + 0, // Poliwrath + 2, // Abra + 2, // Kadabra + 2, // Alakazam + 0, // Machop + 2, // Machoke + 0, // Machamp + 1, // Bellsprout + 1, // Weepinbell + 1, // Victreebel + 2, // Tentacool + 2, // Tentacruel + 1, // Geodude + 1, // Graveler + 1, // Golem + 0, // Ponyta + 0, // Rapidash + 0, // Slowpoke + 0, // Slowbro + 0, // Magnemite + 0, // Magneton + 1, // Farfetch'd + 2, // Doduo + 2, // Dodrio + 2, // Seel + 2, // Dewgong + 2, // Grimer + 2, // Muk + 2, // Shellder + 2, // Cloyster + 2, // Gastly + 2, // Haunter + 2, // Gengar + 2, // Onix + 2, // Drowzee + 1, // Hypno + 2, // Krabby + 2, // Kingler + 0, // Voltorb + 0, // Electrode + 0, // Exeggcute + 1, // Exeggutor + 1, // Cubone + 1, // Marowak + 2, // Hitmonlee + 2, // Hitmonchan + 1, // Lickitung + 2, // Koffing + 2, // Weezing + 1, // Rhyhorn + 1, // Rhydon + 0, // Chansey + 0, // Tangela + 1, // Kangaskhan + 0, // Horsea + 0, // Seadra + 0, // Goldeen + 0, // Seaking + 2, // Staryu + 2, // Starmie + 0, // Mr. mime + 1, // Scyther + 2, // Jynx + 1, // Electabuzz + 0, // Magmar + 2, // Pinsir + 2, // Tauros + 0, // Magikarp + 0, // Gyarados + 2, // Lapras + 2, // Ditto + 2, // Eevee + 0, // Vaporeon + 0, // Jolteon + 0, // Flareon + 0, // Porygon + 0, // Omanyte + 0, // Omastar + 2, // Kabuto + 2, // Kabutops + 0, // Aerodactyl + 1, // Snorlax + 0, // Articuno + 0, // Zapdos + 0, // Moltres + 0, // Dratini + 0, // Dragonair + 2, // Dragonite + 2, // Mewtwo + 0, // Mew + 1, // Chikorita + 1, // Bayleef + 1, // Meganium + 1, // Cyndaquil + 1, // Quilava + 1, // Typhlosion + 2, // Totodile + 2, // Croconaw + 2, // Feraligatr + 2, // Sentret + 2, // Furret + 2, // Hoothoot + 2, // Noctowl + 0, // Ledyba + 0, // Ledian + 1, // Spinarak + 0, // Ariados + 2, // Crobat + 2, // Chinchou + 0, // Lanturn + 0, // Pichu + 0, // Cleffa + 1, // Igglybuff + 2, // Togepi + 2, // Togetic + 0, // Natu + 0, // Xatu + 2, // Mareep + 0, // Flaaffy + 0, // Ampharos + 1, // Bellossom + 2, // Marill + 2, // Azumarill + 1, // Sudowoodo + 1, // Politoed + 1, // Hoppip + 1, // Skiploom + 2, // Jumpluff + 2, // Aipom + 1, // Sunkern + 1, // Sunflora + 1, // Yanma + 0, // Wooper + 0, // Quagsire + 2, // Espeon + 2, // Umbreon + 2, // Murkrow + 0, // Slowking + 0, // Misdreavus + 0, // Unown A + 0, // Wobbuffet + 1, // Girafarig + 0, // Pineco + 2, // Forretress + 2, // Dunsparce + 2, // Gligar + 0, // Steelix + 0, // Snubbull + 2, // Granbull + 0, // Qwilfish + 0, // Scizor + 1, // Shuckle + 2, // Heracross + 0, // Sneasel + 0, // Teddiursa + 2, // Ursaring + 0, // Slugma + 0, // Magcargo + 2, // Swinub + 2, // Piloswine + 0, // Corsola + 0, // Remoraid + 0, // Octillery + 0, // Delibird + 2, // Mantine + 0, // Skarmory + 0, // Houndour + 0, // Houndoom + 0, // Kingdra + 0, // Phanpy + 0, // Donphan + 0, // Porygon2 + 2, // Stantler + 1, // Smeargle + 2, // Tyrogue + 2, // Hitmontop + 1, // Smoochum + 1, // Elekid + 1, // Magby + 1, // Miltank + 1, // Blissey + 0, // Raikou + 2, // Entei + 0, // Suicune + 1, // Larvitar + 0, // Pupitar + 1, // Tyranitar + 0, // Lugia + 1, // Ho-Oh + 1, // Celebi + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 0, // ? + 1, // Treecko + 0, // Grovyle + 1, // Sceptile + 0, // Torchic + 0, // Combusken + 0, // Blaziken + 0, // Mudkip + 0, // Marshtomp + 0, // Swampert + 2, // Poochyena + 2, // Mightyena + 2, // Zigzagoon + 2, // Linoone + 0, // Wurmple + 2, // Silcoon + 0, // Beautifly + 2, // Cascoon + 1, // Dustox + 1, // Lotad + 1, // Lombre + 1, // Ludicolo + 1, // Seedot + 1, // Nuzleaf + 0, // Shiftry + 1, // Nincada + 1, // Ninjask + 1, // Shedinja + 2, // Taillow + 2, // Swellow + 1, // Shroomish + 1, // Breloom + 1, // Spinda + 0, // Wingull + 0, // Pelipper + 2, // Surskit + 0, // Masquerain + 2, // Wailmer + 0, // Wailord + 0, // Skitty + 2, // Delcatty + 1, // Kecleon + 1, // Baltoy + 0, // Claydol + 0, // Nosepass + 1, // Torkoal + 2, // Sableye + 0, // Barboach + 0, // Whiscash + 0, // Luvdisc + 0, // Corphish + 0, // Crawdaunt + 2, // Feebas + 0, // Milotic + 0, // Carvanha + 0, // Sharpedo + 1, // Trapinch + 1, // Vibrava + 1, // Flygon + 2, // Makuhita + 1, // Hariyama + 1, // Electrike + 0, // Manectric + 1, // Numel + 0, // Camerupt + 2, // Spheal + 2, // Sealeo + 0, // Walrein + 1, // Cacnea + 1, // Cacturne + 2, // Snorunt + 0, // Glalie + 1, // Lunatone + 0, // Solrock + 2, // Azurill + 0, // Spoink + 2, // Grumpig + 0, // Plusle + 0, // Minun + 2, // Mawile + 0, // Meditite + 0, // Medicham + 0, // Swablu + 0, // Altaria + 0, // Wynaut + 0, // Duskull + 0, // Dusclops + 0, // Roselia + 2, // Slakoth + 2, // Vigoroth + 1, // Slaking + 1, // Gulpin + 2, // Swalot + 1, // Tropius + 0, // Whismur + 2, // Loudred + 2, // Exploud + 0, // Clamperl + 0, // Huntail + 0, // Gorebyss + 0, // Absol + 0, // Shuppet + 0, // Banette + 2, // Seviper + 0, // Zangoose + 1, // Relicanth + 2, // Aron + 2, // Lairon + 2, // Aggron + 0, // Castform + 0, // Volbeat + 2, // Illumise + 2, // Lileep + 0, // Cradily + 0, // Anorith + 0, // Armaldo + 1, // Ralts + 1, // Kirlia + 1, // Gardevoir + 2, // Bagon + 2, // Shelgon + 0, // Salamence + 0, // Beldum + 0, // Metang + 0, // Metagross + 2, // Regirock + 2, // Regice + 2, // Registeel + 2, // Kyogre + 0, // Groudon + 1, // Rayquaza + 0, // Latias + 2, // Latios + 0, // Jirachi + 0, // Deoxys + 0, // Chimecho + 1, // Egg + 0, // Unown B + 0, // Unown C + 0, // Unown D + 0, // Unown E + 0, // Unown F + 0, // Unown G + 0, // Unown H + 0, // Unown I + 0, // Unown J + 0, // Unown K + 0, // Unown L + 0, // Unown M + 0, // Unown N + 0, // Unown O + 0, // Unown P + 0, // Unown Q + 0, // Unown R + 0, // Unown S + 0, // Unown T + 0, // Unown U + 0, // Unown V + 0, // Unown W + 0, // Unown X + 0, // Unown Y + 0, // Unown Z + 0, // Unown Exclamation Mark + 0, // Unown Question Mark +}; + +const struct SpritePalette gMonIconPaletteTable[] = +{ + { gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 }, + { gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 }, + { gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 }, + +// There are only 3 actual palettes. The following are unused +// and don't point to valid data. + { gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 }, + { gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 }, + { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 }, +}; + +static const struct OamData sMonIconOamData = +{ + .size = 2, + .priority = 1, +}; + +// fastest to slowest + +static const union AnimCmd sAnim_0[] = +{ + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_1[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_2[] = +{ + ANIMCMD_FRAME(0, 14), + ANIMCMD_FRAME(1, 14), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_3[] = +{ + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sAnim_4[] = +{ + ANIMCMD_FRAME(0, 29), + ANIMCMD_FRAME(0, 29), // frame 0 is repeated + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sMonIconAnims[] = +{ + sAnim_0, + sAnim_1, + sAnim_2, + sAnim_3, + sAnim_4, +}; + +static const union AffineAnimCmd sAffineAnim_0[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0, 10), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sAffineAnim_1[] = +{ + AFFINEANIMCMD_FRAME(-2, -2, 0, 122), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sMonIconAffineAnims[] = +{ + sAffineAnim_0, + sAffineAnim_1, +}; + +const u16 sSpriteImageSizes[3][4] = +{ + // square + { + 0x20, // 1×1 + 0x80, // 2×2 + 0x200, // 4×4 + 0x800, // 8×8 + }, + + // horizontal rectangle + { + 0x40, // 2×1 + 0x80, // 4×1 + 0x100, // 4×2 + 0x400, // 8×4 + }, + + // vertical rectangle + { + 0x40, // 1×2 + 0x80, // 1×4 + 0x100, // 2×4 + 0x400, // 4×8 + }, +}; + +u16 GetUnownLetterByPersonality(u32); +const u8 *GetMonIconPtr(u16, u32 personality); +u8 UpdateMonIconFrame(struct Sprite *); +u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); +void sub_809D7E8(struct Sprite *); + +// duplicate of sub_809D3A4 +u8 unref_sub_809D26C(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate = + { + .oam = &sMonIconOamData, + .image = gMonIconTable[species], + .anims = sMonIconAnims, + .affineAnims = sMonIconAffineAnims, + .callback = callback, + .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], + }; + + spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} + +u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate = + { + .oam = &sMonIconOamData, + .image = GetMonIconPtr(species, personality), + .anims = sMonIconAnims, + .affineAnims = sMonIconAffineAnims, + .callback = callback, + .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], + }; + + if (species > SPECIES_EGG) + iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; + + spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} + +u8 sub_809D3A4(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate = + { + .oam = &sMonIconOamData, + .image = gMonIconTable[species], + .anims = sMonIconAnims, + .affineAnims = sMonIconAffineAnims, + .callback = callback, + .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], + }; + + spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} + +u16 mon_icon_convert_unown_species_id(u16 species, u32 personality) +{ + u16 result; + + if (species == SPECIES_UNOWN) + { + u16 letter = GetUnownLetterByPersonality(personality); + if (letter == 0) + letter = SPECIES_UNOWN; + else + letter += (SPECIES_UNOWN_B - 1); + result = letter; + } + else + { + if (species > SPECIES_EGG) + result = 260; + else + result = species; + } + + return result; +} + +u16 GetUnownLetterByPersonality(u32 personality) +{ + return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; +} + +u16 sub_809D4A8(u16 species) +{ + u16 value; + + if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN) + { + if (value == 0) + value += SPECIES_UNOWN; + else + value += (SPECIES_UNOWN_B - 1); + return value; + } + else + { + return mon_icon_convert_unown_species_id(species, 0); + } +} + +const u8 *GetMonIconPtr(u16 species, u32 personality) +{ + u16 convertedSpecies = mon_icon_convert_unown_species_id(species, personality); + return gMonIconTable[convertedSpecies]; +} + +void sub_809D510(struct Sprite *sprite) +{ + sub_809D7E8(sprite); +} + +void sub_809D51C(void) +{ + u8 i; + for (i = 0; i < 6; i++) + LoadSpritePalette(&gMonIconPaletteTable[i]); +} + +// unused +void SafeLoadMonIconPalette(u16 species) +{ + u8 palIndex; + if (species > SPECIES_EGG) + species = 260; + palIndex = gMonIconPaletteIndices[species]; + if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) + LoadSpritePalette(&gMonIconPaletteTable[palIndex]); +} + +void sub_809D580(u16 species) +{ + u8 palIndex = gMonIconPaletteIndices[species]; + if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) + LoadSpritePalette(&gMonIconPaletteTable[palIndex]); +} + +// unused +void FreeMonIconPalettes(void) +{ + u8 i; + for (i = 0; i < 6; i++) + FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag); +} + +// unused +void SafeFreeMonIconPalette(u16 species) +{ + u8 palIndex; + if (species > SPECIES_EGG) + species = 260; + palIndex = gMonIconPaletteIndices[species]; + FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); +} + +void sub_809D608(u16 species) +{ + u8 palIndex; + palIndex = gMonIconPaletteIndices[species]; + FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); +} + +void sub_809D62C(struct Sprite *sprite) +{ + UpdateMonIconFrame(sprite); +} + +// TODO: try to find a way to avoid using asm statement +u8 UpdateMonIconFrame(struct Sprite *sprite) +{ + u8 result = 0; + + if (sprite->animDelayCounter == 0) + { + s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + + switch (frame) + { + case -1: + break; + case -2: + sprite->animCmdIndex = 0; + break; + default: + RequestSpriteCopy( + // pointer arithmetic is needed to get the correct pointer to perform the sprite copy on. + // because sprite->images is a struct def, it has to be casted to (u8 *) before any + // arithmetic can be performed. + (u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame), + OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP, + sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]); + { + register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + sprite->animDelayCounter = duration; + } + sprite->animCmdIndex++; + result = sprite->animCmdIndex; + break; + } + } + else + { + sprite->animDelayCounter--; + } + return result; +} + +u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority) +{ + u8 spriteId; + + struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] }; + + struct SpriteTemplate spriteTemplate = + { + .tileTag = 0xFFFF, + .paletteTag = iconTemplate->paletteTag, + .oam = iconTemplate->oam, + .anims = iconTemplate->anims, + .images = &image, + .affineAnims = iconTemplate->affineAnims, + .callback = iconTemplate->callback, + }; + + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); + gSprites[spriteId].animPaused = TRUE; + gSprites[spriteId].animBeginning = FALSE; + gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image; + return spriteId; +} + +void sub_809D7E8(struct Sprite *sprite) +{ + struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] }; + sprite->images = ℑ + DestroySprite(sprite); +} + +void sub_809D824(struct Sprite *sprite, u8 animNum) +{ + sprite->animNum = animNum; + sprite->animDelayCounter = 0; + sprite->animCmdIndex = 0; +} diff --git a/src/pokemon_item_effect.c b/src/pokemon_item_effect.c new file mode 100644 index 000000000..4ebece3b3 --- /dev/null +++ b/src/pokemon_item_effect.c @@ -0,0 +1,550 @@ +#include "global.h" +#include "constants/battle_constants.h" +#include "constants/hold_effects.h" +#include "constants/items.h" +#include "constants/species.h" +#include "battle.h" +#include "evolution_scene.h" +#include "ewram.h" +#include "item.h" +#include "main.h" +#include "overworld.h" +#include "pokemon.h" +#include "pokemon_item_effect.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "util.h" + +extern s32 gBattleMoveDamage; +extern u8 gAbsentBankFlags; +extern u8 gBankInMenu; +extern u8 gNoOfAllBanks; +extern u16 gBattlePartyID[]; +extern u8 gActiveBank; +extern u8 gStringBank; +extern struct BattlePokemon gBattleMons[]; +extern struct BattleEnigmaBerry gEnigmaBerries[]; + +static const u8 sGetMonDataEVConstants[] = +{ + MON_DATA_HP_EV, + MON_DATA_ATK_EV, + MON_DATA_DEF_EV, + MON_DATA_SPEED_EV, + MON_DATA_SPDEF_EV, + MON_DATA_SPATK_EV +}; + +extern u8 gUnknown_08208238[]; +extern u8 gUnknown_0820823C[]; +extern u8 gUnknown_08208240[]; + +bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e); + +bool8 ExecuteTableBasedItemEffect_(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex) +{ + return PokemonUseItemEffects(pkmn, item, partyIndex, moveIndex, 0); +} + +bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e) +{ + u32 data; + s32 friendship; + s32 cmdIndex; + bool8 retVal = TRUE; + const u8 *itemEffect; + u8 sp24 = 6; + u32 sp28; + s8 sp2C = 0; + u8 holdEffect; + u8 sp34 = 4; + u16 heldItem; + u8 r10; + u32 r4; + + heldItem = GetMonData(pkmn, MON_DATA_HELD_ITEM, NULL); + if (heldItem == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + holdEffect = gEnigmaBerries[gBankInMenu].holdEffect; + else + holdEffect = gSaveBlock1.enigmaBerry.holdEffect; + } + else + { + holdEffect = ItemId_GetHoldEffect(heldItem); + } + + gStringBank = gBankInMenu; + if (gMain.inBattle) + { + gActiveBank = gBankInMenu; + cmdIndex = (GetBankSide(gActiveBank) != 0); + while (cmdIndex < gNoOfAllBanks) + { + if (gBattlePartyID[cmdIndex] == partyIndex) + { + sp34 = cmdIndex; + break; + } + cmdIndex += 2; + } + } + else + { + gActiveBank = 0; + sp34 = 4; + } + + if (!IS_POKEMON_ITEM(item)) + return TRUE; + if (gItemEffectTable[item - 13] == NULL && item != ITEM_ENIGMA_BERRY) + return TRUE; + + if (item == ITEM_ENIGMA_BERRY) + { + if (gMain.inBattle) + itemEffect = gEnigmaBerries[gActiveBank].itemEffect; + else + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + } + else + { + itemEffect = gItemEffectTable[item - 13]; + } + + for (cmdIndex = 0; cmdIndex < 6; cmdIndex++) + { + switch (cmdIndex) + { + // status healing effects + case 0: + if ((itemEffect[cmdIndex] & 0x80) + && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_INFATUATION)) + { + gBattleMons[sp34].status2 &= ~STATUS2_INFATUATION; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0x30) + && !(gBattleMons[gActiveBank].status2 & STATUS2_FOCUS_ENERGY)) + { + gBattleMons[gActiveBank].status2 |= STATUS2_FOCUS_ENERGY; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_ATK] = 12; + retVal = FALSE; + } + break; + // in-battle stat boosting effects? + case 1: + if ((itemEffect[cmdIndex] & 0xF0) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] += (itemEffect[cmdIndex] & 0xF0) >> 4; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_DEF] = 12; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPEED] = 12; + retVal = FALSE; + } + break; + // more stat boosting effects? + case 2: + if ((itemEffect[cmdIndex] & 0xF0) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] += (itemEffect[cmdIndex] & 0xF0) >> 4; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_ACC] = 12; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0xF) + && gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] < 12) + { + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] += itemEffect[cmdIndex] & 0xF; + if (gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] > 12) + gBattleMons[gActiveBank].statStages[STAT_STAGE_SPATK] = 12; + retVal = FALSE; + } + break; + case 3: + if ((itemEffect[cmdIndex] & 0x80) + && gSideTimers[GetBankSide(gActiveBank)].mistTimer == 0) + { + gSideTimers[GetBankSide(gActiveBank)].mistTimer = 5; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0x40) // raise level + && GetMonData(pkmn, MON_DATA_LEVEL, NULL) != 100) + { + data = gExperienceTables[gBaseStats[GetMonData(pkmn, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(pkmn, MON_DATA_LEVEL, NULL) + 1]; + SetMonData(pkmn, MON_DATA_EXP, &data); + CalculateMonStats(pkmn); + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0x20) + && HealStatusConditions(pkmn, partyIndex, 7, sp34) == 0) + { + if (sp34 != 4) + gBattleMons[sp34].status2 &= ~STATUS2_NIGHTMARE; + retVal = FALSE; + } + if ((itemEffect[cmdIndex] & 0x10) && HealStatusConditions(pkmn, partyIndex, 0xF88, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 8) && HealStatusConditions(pkmn, partyIndex, 16, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 4) && HealStatusConditions(pkmn, partyIndex, 32, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 2) && HealStatusConditions(pkmn, partyIndex, 64, sp34) == 0) + retVal = FALSE; + if ((itemEffect[cmdIndex] & 1) // heal confusion + && gMain.inBattle && sp34 != 4 && (gBattleMons[sp34].status2 & STATUS2_CONFUSION)) + { + gBattleMons[sp34].status2 &= ~STATUS2_CONFUSION; + retVal = FALSE; + } + break; + // EV, HP, and PP raising effects + case 4: + r10 = itemEffect[cmdIndex]; + if (r10 & 0x20) + { + r10 &= ~0x20; + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[moveIndex]) >> (moveIndex * 2); + sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (data <= 2 && sp28 > 4) + { + data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_08208240[moveIndex]; + SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); + + data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28; + data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; + SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + retVal = FALSE; + } + } + sp28 = 0; + while (r10 != 0) + { + if (r10 & 1) + { + u16 evCount; + s32 r5; + + switch (sp28) + { + case 0: + case 1: + evCount = GetMonEVCount(pkmn); + if (evCount >= 510) + return TRUE; + data = GetMonData(pkmn, sGetMonDataEVConstants[sp28], NULL); + if (data < 100) + { + if (data + itemEffect[sp24] > 100) + r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; + else + r4 = itemEffect[sp24]; + if (evCount + r4 > 510) + r4 += 510 - (evCount + r4); + data += r4; + SetMonData(pkmn, sGetMonDataEVConstants[sp28], &data); + CalculateMonStats(pkmn); + sp24++; + retVal = FALSE; + } + break; + case 2: + // revive? + if (r10 & 0x10) + { + if (GetMonData(pkmn, MON_DATA_HP, NULL) != 0) + { + sp24++; + break; + } + if (gMain.inBattle) + { + if (sp34 != 4) + { + gAbsentBankFlags &= ~gBitTable[sp34]; + CopyPlayerPartyMonToBattleData(sp34, pokemon_order_func(gBattlePartyID[sp34])); + if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) + gBattleResults.unk4++; + } + else + { + gAbsentBankFlags &= ~gBitTable[gActiveBank ^ 2]; + if (GetBankSide(gActiveBank) == 0 && gBattleResults.unk4 < 255) + gBattleResults.unk4++; + } + } + } + else + { + if (GetMonData(pkmn, MON_DATA_HP, NULL) == 0) + { + sp24++; + break; + } + } + data = itemEffect[sp24++]; + switch (data) + { + case 0xFF: + data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) - GetMonData(pkmn, MON_DATA_HP, NULL); + break; + case 0xFE: + data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL) / 2; + if (data == 0) + data = 1; + break; + case 0xFD: + data = eStatHp; + break; + } + if (GetMonData(pkmn, MON_DATA_MAX_HP, NULL) != GetMonData(pkmn, MON_DATA_HP, NULL)) + { + if (e == 0) + { + data = GetMonData(pkmn, MON_DATA_HP, NULL) + data; + if (data > GetMonData(pkmn, MON_DATA_MAX_HP, NULL)) + data = GetMonData(pkmn, MON_DATA_MAX_HP, NULL); + SetMonData(pkmn, MON_DATA_HP, &data); + if (gMain.inBattle && sp34 != 4) + { + gBattleMons[sp34].hp = data; + if (!(r10 & 0x10) && GetBankSide(gActiveBank) == 0) + { + if (gBattleResults.unk3 < 255) + gBattleResults.unk3++; + // I have to re-use this variable to match. + r5 = gActiveBank; + gActiveBank = sp34; + EmitGetAttributes(0, 0, 0); + MarkBufferBankForExecution(gActiveBank); + gActiveBank = r5; + } + } + } + else + { + gBattleMoveDamage = -data; + } + retVal = FALSE; + } + r10 &= 0xEF; + break; + case 3: + if (!(r10 & 2)) + { + for (r5 = 0; r5 < 4; r5++) + { + u16 r4; + + data = GetMonData(pkmn, MON_DATA_PP1 + r5, NULL); + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + { + data += itemEffect[sp24]; + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5)) + { + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + r5, NULL); + data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), r5); + } + SetMonData(pkmn, MON_DATA_PP1 + r5, &data); + if (gMain.inBattle + && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) + && !(gDisableStructs[sp34].unk18_b & gBitTable[r5])) + gBattleMons[sp34].pp[r5] = data; + retVal = FALSE; + } + } + sp24++; + } + else + { + u16 r4; + + data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL); + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); + if (data != CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) + { + data += itemEffect[sp24++]; + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); + if (data > CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex)) + { + r4 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL); + data = CalculatePPWithBonus(r4, GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + } + SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + if (gMain.inBattle + && sp34 != 4 && !(gBattleMons[sp34].status2 & 0x200000) + && !(gDisableStructs[sp34].unk18_b & gBitTable[moveIndex])) + gBattleMons[sp34].pp[moveIndex] = data; + retVal = FALSE; + } + } + break; + case 7: + { + u16 targetSpecies = GetEvolutionTargetSpecies(pkmn, 2, item); + + if (targetSpecies != SPECIES_NONE) + { + BeginEvolutionScene(pkmn, targetSpecies, 0, partyIndex); + return FALSE; + } + } + break; + } + } + sp28++; + r10 >>= 1; + } + break; + case 5: + r10 = itemEffect[cmdIndex]; + sp28 = 0; + while (r10 != 0) + { + if (r10 & 1) + { + u16 evCount; + + switch (sp28) + { + case 0: + case 1: + case 2: + case 3: + evCount = GetMonEVCount(pkmn); + if (evCount >= 510) + return TRUE; + data = GetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], NULL); + if (data < 100) + { + if (data + itemEffect[sp24] > 100) + r4 = 100 - (data + itemEffect[sp24]) + itemEffect[sp24]; + else + r4 = itemEffect[sp24]; + if (evCount + r4 > 510) + r4 += 510 - (evCount + r4); + data += r4; + SetMonData(pkmn, sGetMonDataEVConstants[sp28 + 2], &data); + CalculateMonStats(pkmn); + retVal = FALSE; + sp24++; + } + break; + case 4: + data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_08208238[moveIndex]) >> (moveIndex * 2); + if (data < 3) + { + r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex); + data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL); + data &= gUnknown_0820823C[moveIndex]; + data += gUnknown_08208240[moveIndex] * 3; + + SetMonData(pkmn, MON_DATA_PP_BONUSES, &data); + data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4; + data = GetMonData(pkmn, MON_DATA_PP1 + moveIndex, NULL) + data; + SetMonData(pkmn, MON_DATA_PP1 + moveIndex, &data); + retVal = FALSE; + } + break; + case 5: + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 100 && retVal == 0 && sp2C == 0) + { + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; + else + friendship += sp2C; + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + friendship++; + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + } + sp24++; + break; + case 6: + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) < 200 + && retVal == 0 && sp2C == 0) + { + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; + else + friendship += sp2C; + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + friendship++; + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + } + sp24++; + break; + case 7: + if (GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL) >= 200 && retVal == 0 && sp2C == 0) + { + sp2C = itemEffect[sp24]; + friendship = GetMonData(pkmn, MON_DATA_FRIENDSHIP, NULL); + if (sp2C > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + friendship += 150 * sp2C / 100; + else + friendship += sp2C; + if (sp2C > 0) + { + if (GetMonData(pkmn, MON_DATA_POKEBALL, NULL) == 11) + friendship++; + if (GetMonData(pkmn, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + friendship++; + } + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + SetMonData(pkmn, MON_DATA_FRIENDSHIP, &friendship); + } + sp24++; + break; + } + } + sp28++; + r10 >>= 1; + } + break; + } + } + return retVal; +} diff --git a/src/pokemon_menu.c b/src/pokemon_menu.c new file mode 100644 index 000000000..532340ce4 --- /dev/null +++ b/src/pokemon_menu.c @@ -0,0 +1,1220 @@ +#include "global.h" +#include "easy_chat.h" +#include "pokemon.h" +#include "pokemon_menu.h" +#include "party_menu.h" +#include "palette.h" +#include "menu.h" +#include "mail_data.h" +#include "constants/songs.h" +#include "sound.h" +#include "main.h" +#include "overworld.h" +#include "menu_helpers.h" +#include "pokemon_summary_screen.h" +#include "constants/moves.h" +#include "data2.h" +#include "strings.h" +#include "item_use.h" +#include "item.h" +#include "event_data.h" +#include "mail.h" +#include "field_player_avatar.h" +#include "fldeff_softboiled.h" +#include "braille_puzzles.h" +#include "field_fadetransition.h" +#include "field_weather.h" +#include "field_effect.h" +#include "field_control_avatar.h" +#include "metatile_behavior.h" +#include "fieldmap.h" +#include "item_menu.h" +#include "player_pc.h" +#include "ewram.h" +#include "script.h" + +/* +Pokemon menu: + The menu that appears when you + click on a pokemon in + overworld 'pokemon' menu +*/ + +struct PokeMenuFieldMoveFunc +{ + bool8 (*func)(void); + u8 field_1; +}; + +extern u8 gUnknown_020297ED; +extern u8 gUnknown_020384F0; +extern u8 gUnknown_0202E8F4; +extern u8 gUnknown_0202E8F5; +extern u8 gUnknown_0202E8F6; +extern u8 gUnknown_02038561; +extern u16 gUnknown_0202E8F8; +extern void (*gPokemonItemUseCallback)(u8 taskID, u16 itemID, TaskFunc func); +extern TaskFunc gUnknown_03005CF0; + +void sub_808A520(void); +void sub_80A61D0(void); +void CB2_InitFlyRegionMap(void); +bool8 SetUpFieldMove_Cut(void); +bool8 SetUpFieldMove_Flash(void); +bool8 SetUpFieldMove_RockSmash(void); +bool8 SetUpFieldMove_Strength(void); +bool8 SetUpFieldMove_Teleport(void); +bool8 SetUpFieldMove_Dig(void); +bool8 SetUpFieldMove_SecretPower(void); +bool8 SetUpFieldMove_SoftBoiled(void); +bool8 SetUpFieldMove_SoftBoiled(void); +bool8 SetUpFieldMove_SweetScent(void); + +#define sFieldMovesTerminator 0xFF // note: should be changed to 0xFFFF, because currently it makes it impossible to add a field move with 0xFF index + +// this file's functions +static void sub_808A8A8(void); +static void sub_808B3EC(void); +static void sub_8089D94(u8 taskID); +static void sub_8089E4C(u8 taskID); +static void sub_808A5BC(u8 taskID); +static void sub_808A8D4(u8 taskID); +static void sub_808A73C(u8 taskID); +static void sub_808A848(u8 taskID); +static void sub_808AAF0(u8 taskID); +static void sub_808ABF4(u8 taskID); +static void sub_808AB34(u8 taskID); +static void sub_808ABA8(u8 taskID); +static void sub_808B224(u8 taskID); +static void sub_808B2EC(u8 taskID); +static void sub_808B2B4(u8 taskID); +static void sub_808B25C(u8 taskID); +static void sub_808B1EC(u8 taskID); +static void sub_808B338(u8 taskID); +static void sub_808B4A4(u8 taskID); +static void sub_808B4EC(u8 taskID); +static void sub_808B5E4(u8 taskID); +static void PokemonMenu_Summary(u8 taskID); +static void PokemonMenu_Switch(u8 taskID); +static void PokemonMenu_Item(u8 taskID); +static void PokemonMenu_Cancel(u8 taskID); +static void PokemonMenu_GiveItem(u8 taskID); +static void PokemonMenu_TakeItem(u8 taskID); +static void PokemonMenu_TakeMail(u8 taskID); +static void PokemonMenu_Mail(u8 taskID); +static void PokemonMenu_ReadMail(u8 taskID); +static void PokemonMenu_CancelSubmenu(u8 taskID); +static void PokemonMenu_FieldMove(u8 taskID); +static bool8 SetUpFieldMove_Waterfall(void); +static bool8 SetUpFieldMove_Surf(void); +static bool8 SetUpFieldMove_Fly(void); +static bool8 SetUpFieldMove_Dive(void); + +// ewram data + +EWRAM_DATA static u8 sPokeMenuCursorPos = 0; +EWRAM_DATA static u8 sPokeMenuOptionsNo = 0; +EWRAM_DATA static u8 sPokeMenuOptionsOrder[8] = {0}; // 4 possible field moves and 4 default options + +// iwram common +u8 gLastFieldPokeMenuOpened; +void (*gUnknown_03005CE4)(void); + +// const data + +static const struct MenuAction2 sPokemonMenuActions[] = +{ + {OtherText_Summary, PokemonMenu_Summary}, + {OtherText_Switch2, PokemonMenu_Switch}, + {OtherText_Item, PokemonMenu_Item}, + {gOtherText_CancelNoTerminator, PokemonMenu_Cancel}, + {OtherText_Give2, PokemonMenu_GiveItem}, + {OtherText_Take2, PokemonMenu_TakeItem}, + {OtherText_Take, PokemonMenu_TakeMail}, + {OtherText_Mail, PokemonMenu_Mail}, + {OtherText_Read2, PokemonMenu_ReadMail}, + {gOtherText_CancelNoTerminator, PokemonMenu_CancelSubmenu}, + {gMoveNames[MOVE_CUT], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_FLASH], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_ROCK_SMASH], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_STRENGTH], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_SURF], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_FLY], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_DIVE], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_WATERFALL], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_TELEPORT], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_DIG], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_SECRET_POWER], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_MILK_DRINK], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_SOFT_BOILED], PokemonMenu_FieldMove}, + {gMoveNames[MOVE_SWEET_SCENT], PokemonMenu_FieldMove}, +}; + +static const u16 sPokeMenuFieldMoves[] = +{ + MOVE_CUT, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_STRENGTH, + MOVE_SURF, MOVE_FLY, MOVE_DIVE, MOVE_WATERFALL, + MOVE_TELEPORT, MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, + MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, sFieldMovesTerminator, +}; + +static const u8 sUnknown_39F572[] = {4, 5, 9, 0}; +static const struct PartyPopupMenu sUnknown_0839F578 = {3, 6, sUnknown_39F572}; + +static const u8 sUnknown_39F580[] = {8, 6, 9, 0}; +static const struct PartyPopupMenu sUnknown_0839F584 = {3, 9, sUnknown_39F580}; + +static const struct PokeMenuFieldMoveFunc sFieldMoveFuncs[] = +{ + {SetUpFieldMove_Cut, 0x6}, + {SetUpFieldMove_Flash, 0x9}, + {SetUpFieldMove_RockSmash, 0x9}, + {SetUpFieldMove_Strength, 0x9}, + {SetUpFieldMove_Surf, 0x7}, + {SetUpFieldMove_Fly, 0x9}, + {SetUpFieldMove_Dive, 0x9}, + {SetUpFieldMove_Waterfall, 0x9}, + {SetUpFieldMove_Teleport, 0x9}, + {SetUpFieldMove_Dig, 0x9}, + {SetUpFieldMove_SecretPower, 0x9}, + {SetUpFieldMove_SoftBoiled, 0x10}, + {SetUpFieldMove_SoftBoiled, 0x10}, + {SetUpFieldMove_SweetScent, 0x9}, +}; + +void sub_8089A70(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + OpenPartyMenu(PARTY_MENU_TYPE_STANDARD, 0); +} + +static void sub_8089A8C(void) +{ + sPokeMenuOptionsNo = 0; + // if checking pokemon is an egg, we can't give it an item and it doesn't know any move + if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) + { + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SUMMARY); + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SWITCH); + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_CANCEL); + } + else + { + u16 moveID, tableID; + for (moveID = 0; moveID < 4; moveID++) // 4, max number of possible field moves + { + for (tableID = 0; sPokeMenuFieldMoves[tableID] != sFieldMovesTerminator; tableID++) + { + if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MOVE1 + moveID) == sPokeMenuFieldMoves[tableID]) + { + u8 fieldID = tableID + POKEMENU_FIRST_FIELD_MOVE_ID; + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, fieldID); + break; + } + } + } + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SUMMARY); + + // can't switch a pokemon if it's the only one in the party + if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES) != 0) + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SWITCH); + + if (ItemIsMail(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM))) + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_MAIL); + else + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_ITEM); + + AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_CANCEL); + } +} + +static void sub_8089BDC(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order, u8 arg6) +{ + PrintPartyMenuPromptText(5, arg6); + Menu_DrawStdWindowFrame(arg0, arg1, arg0 + arg2, (noOfOptions * 2) + arg1 + 1); + Menu_PrintItemsReordered(arg0 + 1, arg1 + 1, noOfOptions, menuActions, order); +} + +void sub_8089C50(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order) +{ + sub_8089BDC(arg0, arg1, arg2, noOfOptions, menuActions, order, 1); +} + +static void sub_8089C7C(u8 arg0) +{ + u32 r4 = (u8)(18 - (sPokeMenuOptionsNo << 1)); + + sub_8089BDC(19, r4, 10, sPokeMenuOptionsNo, sPokemonMenuActions, sPokeMenuOptionsOrder, 3); + r4 |= 1; + InitMenu(0, 20, r4, sPokeMenuOptionsNo, arg0, 9); +} + +void HandleDefaultPartyMenu(u8 taskID) +{ + if (!gPaletteFade.active) + { + switch (HandleDefaultPartyMenuInput(taskID)) + { + case A_BUTTON: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = sub_806CA38(taskID); + GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); + sub_8089A8C(); + sPokeMenuCursorPos = 0; + sub_8089C7C(0); + gTasks[taskID].func = sub_8089D94; + sub_808B5B4(taskID); + break; + case B_BUTTON: + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = sub_8089E4C; + break; + } + } +} + +static void sub_8089D94(u8 taskID) +{ + if (!gPaletteFade.active) + { + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + PlaySE(SE_SELECT); + sPokeMenuCursorPos = Menu_MoveCursor(-1); + sub_808B5B4(taskID); + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + PlaySE(SE_SELECT); + sPokeMenuCursorPos = Menu_MoveCursor(1); + sub_808B5B4(taskID); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sPokemonMenuActions[sPokeMenuOptionsOrder[sPokeMenuCursorPos]].func(taskID); + sub_808B5B4(taskID); + } + else if (gMain.newKeys & B_BUTTON) + { + PokemonMenu_Cancel(taskID); + sub_808B5B4(taskID); + } + } +} + +static void sub_8089E4C(u8 taskID) +{ + if (!gPaletteFade.active) + { + gLastFieldPokeMenuOpened = 0; + SetMainCallback2(sub_805469C); + DestroyTask(taskID); + } +} + +static void sub_8089E84(void) +{ + GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); + sub_8089A8C(); + sPokeMenuCursorPos = 0; + sub_8089C7C(0); +} + +static void sub_8089EBC(void) +{ + do + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + gLastFieldPokeMenuOpened = gUnknown_020384F0; + sub_8089E84(); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + } while (sub_80F9344() != TRUE); +} + +static void sub_8089F14(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_8089D94, 5); + SetMainCallback2(sub_8089EBC); +} + +static void sub_8089F44(u8 taskID) +{ + if (!gPaletteFade.active) + { + u8 spriteID = gSprites[gTasks[taskID].data[3] >> 8].data[0]; + DestroyTask(taskID); + ewram1B000_alt.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, spriteID, gPlayerPartyCount - 1, sub_8089F14, PSS_MODE_NORMAL); + } +} + +static void PokemonMenu_Summary(u8 taskID) +{ + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = sub_8089F44; +} + +void DoPokemonMenu_Switch(u8 taskID) +{ + SetTaskFuncWithFollowupFunc(taskID, SetupDefaultPartyMenuSwitchPokemon, HandleDefaultPartyMenu); + Menu_EraseWindowRect(19, 0, 29, 19); +} + +static void PokemonMenu_Switch(u8 taskID) +{ + Menu_DestroyCursor(); + ewram01000.unkC = sub_806CD5C; + ewram01000.array[53553] = 1; + DoPokemonMenu_Switch(taskID); +} + +static void sub_808A060(u8 taskID) +{ + if (gMain.newKeys == DPAD_UP && sPokeMenuCursorPos != 0) + { + sPokeMenuCursorPos = Menu_MoveCursor(-1); + PlaySE(SE_SELECT); + } + if (gMain.newKeys == DPAD_DOWN && sPokeMenuCursorPos != 2) + { + sPokeMenuCursorPos = Menu_MoveCursor(1); + PlaySE(SE_SELECT); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F578, sPokemonMenuActions, sPokeMenuCursorPos)(taskID); + } + else if (gMain.newKeys & B_BUTTON) + { + ClosePartyPopupMenu(0, &sUnknown_0839F578); + PokemonMenu_CancelSubmenu(taskID); + } +} + +static void sub_808A100(u8 taskID) +{ + ShowPartyPopupMenu(0, &sUnknown_0839F578, (void*)(sPokemonMenuActions), 0); + PrintPartyMenuPromptText(0xD, 2); + gTasks[taskID].func = sub_808A060; +} + +static void PokemonMenu_Item(u8 taskID) +{ + Menu_DestroyCursor(); + sPokeMenuCursorPos = 0; + Menu_EraseWindowRect(19, 0, 29, 19); + gTasks[taskID].func = sub_808A100; +} + +static void sub_808A180(u8 taskID) +{ + if (!gPaletteFade.active) + { + u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL); + DestroyTask(taskID); + sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808A520, 3); + } +} + +static void sub_808A1E0(u8 taskID) +{ + if (gUnknown_0202E8F6 != 1) + { + SetHeldItemIconVisibility(taskID, sub_806CA38(taskID)); + PrintPartyMenuPromptText(0, 0); + gTasks[taskID].func = HandleDefaultPartyMenu; + } +} + +static void sub_808A228(u8 taskID) +{ + if (ItemIsMail(gSpecialVar_ItemId) && gUnknown_0202E8F4 != 0) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = sub_808A180; + } + else + { + Menu_EraseWindowRect(0, 0, 29, 19); + PrintPartyMenuPromptText(0, 0); + gTasks[taskID].func = HandleDefaultPartyMenu; + } +} + +static void sub_808A2AC(u8 taskID) +{ + if (!gPaletteFade.active) + PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808A228); +} + +static void sub_808A2DC(u8 taskID) +{ + u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL); + DestroyTask(taskID); + sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808A520, 3); +} + +static void sub_808A330(u8 taskID) +{ + PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808A2DC); +} + +static void sub_808A34C(void) +{ + RunTasks(); +} + +static void sub_808A358(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +static void sub_808A3A4(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + EWRAM_1B000.unk262 = 3; + sub_8089E84(); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_808A3F8(void) +{ + if (ItemIsMail(gSpecialVar_ItemId)) + { + u8 taskID = CreateTask(sub_808A330, 0); + gPaletteFade.bufferTransferDisabled = 1; + sub_806BD58(taskID, 0); + sub_806C994(taskID, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(taskID, 0); + if (!(bool8)(GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_HELD_ITEM))) + { + SetMainCallback2(sub_808A34C); + return; + } + else + DestroyTask(taskID); + } + gPaletteFade.bufferTransferDisabled = 1; + if (gSpecialVar_ItemId) + { + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_808A2AC, 0xFF); + SetMainCallback2(sub_808A358); + } + else + { + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_8089D94, 5); + SetMainCallback2(sub_808A3A4); + } +} + +static void sub_808A4D4(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_808A520(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + if (gSpecialVar_Result == 0) + { + if (gUnknown_0202E8F8) + RemoveBagItem(gUnknown_0202E8F8, 1); + AddBagItem(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM), 1); + TakeMailFromMon(&gPlayerParty[gLastFieldPokeMenuOpened]); + SetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM, (void*) &gUnknown_0202E8F8); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, HandleDefaultPartyMenu, 0); + } + else + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_808A5BC, 0xFF); + SetMainCallback2(sub_808A4D4); +} + +static void sub_808A5BC(u8 taskID) +{ + if (!gPaletteFade.active) + { + DisplayGiveHeldItemMessage(gLastFieldPokeMenuOpened, gSpecialVar_ItemId, 0); + gTasks[taskID].func = sub_808A1E0; + } +} + +static void sub_808A604(u8 taskID) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sub_80A61D0); + DestroyTask(taskID); + } +} + +static void PokemonMenu_GiveItem(u8 taskID) +{ + gUnknown_0202E8F5 = sub_806CA38(taskID); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = sub_808A604; +} + +static void sub_808A678(u8 taskID) +{ + sub_808A8D4(taskID); +} + +static void PokemonMenu_TakeItem(u8 taskID) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 0, 29, 19); + sub_806D5A4(); + PartyMenuTryGiveMonHeldItem_806ECE8(taskID, sub_808A678); +} + +static void PokemonMenu_TakeMail(u8 taskID) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 0, 29, 19); + sub_806D5A4(); + DoTakeMail(taskID, sub_808A678); +} + +static void PokemonMenu_Mail(u8 taskID) +{ + Menu_DestroyCursor(); + sPokeMenuCursorPos = 0; + Menu_EraseWindowRect(19, 0, 29, 19); + ShowPartyPopupMenu(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, 0); + gTasks[taskID].func = sub_808A73C; +} + +static void sub_808A73C(u8 taskID) +{ + if (gMain.newAndRepeatedKeys == DPAD_UP) + { + PlaySE(SE_SELECT); + if (sPokeMenuCursorPos == 0) + sPokeMenuCursorPos = Menu_MoveCursor(sUnknown_0839F584.numChoices - 1); + else + sPokeMenuCursorPos = Menu_MoveCursor(-1); + } + if (gMain.newAndRepeatedKeys == DPAD_DOWN) + { + PlaySE(SE_SELECT); + if (sPokeMenuCursorPos == sUnknown_0839F584.numChoices - 1) + sPokeMenuCursorPos = Menu_MoveCursor(1 - sUnknown_0839F584.numChoices); + else + sPokeMenuCursorPos = Menu_MoveCursor(1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F584, sPokemonMenuActions, sPokeMenuCursorPos)(taskID); + } + else if (gMain.newKeys & B_BUTTON) + { + ClosePartyPopupMenu(0, &sUnknown_0839F584); + PokemonMenu_Cancel(taskID); + } +} + +static void PokemonMenu_ReadMail(u8 taskID) +{ + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = sub_808A848; +} + +static void sub_808A848(u8 taskID) +{ + if (!gPaletteFade.active) + { + u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL); + DestroyTask(taskID); + HandleReadMail(&gSaveBlock1.mail[mailID], sub_808A8A8, 1); + } +} + +static void sub_808A8A8(void) +{ + gUnknown_020384F0 = gLastFieldPokeMenuOpened; + ewram1B000.unk262 = 4; + sub_8089F14(); +} + +static void sub_808A8D4(u8 taskID) +{ + sPokeMenuCursorPos = 0; + Menu_EraseWindowRect(19, 0, 29, 19); + PrintPartyMenuPromptText(0, 0); + gTasks[taskID].func = HandleDefaultPartyMenu; +} + +static void PokemonMenu_Cancel(u8 taskID) +{ + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + sub_808A8D4(taskID); +} + +static void PokemonMenu_CancelSubmenu(u8 taskID) +{ + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + Menu_EraseWindowRect(19, 0, 29, 19); + sub_806D5A4(); + sub_8089C7C(sPokeMenuCursorPos); + gTasks[taskID].func = sub_8089D94; +} + +#define IS_SOFTBOILED_MILKDRINK(ID)((ID == (POKEMENU_MILK_DRINK - POKEMENU_FIRST_FIELD_MOVE_ID) || ID == (POKEMENU_SOFT_BOILED - POKEMENU_FIRST_FIELD_MOVE_ID))) +#define IS_SURF(ID)((ID == (POKEMENU_SURF - POKEMENU_FIRST_FIELD_MOVE_ID))) +#define IS_FLY(ID)((ID == (POKEMENU_FLY - POKEMENU_FIRST_FIELD_MOVE_ID))) + +#define tFieldMoveId data[11] + +static void PokemonMenu_FieldMove(u8 taskID) +{ + s16* data = gTasks[taskID].data; + + Menu_DestroyCursor(); + tFieldMoveId = sPokeMenuOptionsOrder[sPokeMenuCursorPos] - POKEMENU_FIRST_FIELD_MOVE_ID; + if (sub_80F9344() == TRUE) + { + Menu_EraseWindowRect(19, 0, 29, 19); + if (IS_SOFTBOILED_MILKDRINK(tFieldMoveId)) + PrintPartyMenuPromptText(9, 0); + else + PrintPartyMenuPromptText(sFieldMoveFuncs[tFieldMoveId].field_1, 0); + gTasks[taskID].func = sub_808ABF4; + } + else if (tFieldMoveId <= 7 && FlagGet(FLAG_BADGE01_GET + tFieldMoveId) != TRUE) + { + // can't use a field HM move without a proper badge + Menu_EraseWindowRect(19, 0, 29, 19); + sub_806D5A4(); + sub_806E834(gOtherText_CantBeUsedBadge, 1); + gTasks[taskID].func = sub_808AAF0; + } + else + { + if (sFieldMoveFuncs[tFieldMoveId].func() == TRUE) + { + sPokeMenuCursorPos = 0; + if (!IS_SOFTBOILED_MILKDRINK(tFieldMoveId)) + { + gTasks[taskID].func = sub_808AB34; + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + } + else + sub_8133D28(taskID); + } + else + { + Menu_EraseWindowRect(19, 0, 29, 19); + if (IS_SURF(tFieldMoveId) && TestPlayerAvatarFlags(8)) + PrintPartyMenuPromptText(8, 0); + else + PrintPartyMenuPromptText(sFieldMoveFuncs[tFieldMoveId].field_1, 0); + gTasks[taskID].func = sub_808ABF4; + } + } +} + +static void sub_808AAF0(u8 taskID) +{ + if (gUnknown_0202E8F6 != 1 && (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)) + { + Menu_EraseWindowRect(0, 14, 29, 19); + PokemonMenu_Cancel(taskID); + } +} + +static void sub_808AB34(u8 taskID) +{ + if (!gPaletteFade.active) + { + if (!IS_FLY(gTasks[taskID].tFieldMoveId) || ShouldDoBrailleFlyEffect()) + SetMainCallback2(c2_exit_to_overworld_2_switch); + else + SetMainCallback2(CB2_InitFlyRegionMap); + DestroyTask(taskID); + } +} + +#undef tFieldMoveId + +void FieldCallback_Teleport(void) +{ + pal_fill_black(); + CreateTask(sub_808ABA8, 8); +} + +static void sub_808ABA8(u8 taskID) +{ + if (IsWeatherNotFadingIn() == TRUE) + { + gFieldEffectArguments[0] = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES); + gUnknown_03005CE4(); + DestroyTask(taskID); + } +} + +static void sub_808ABF4(u8 taskID) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + Menu_EraseWindowRect(1, 17, 28, 18); + PokemonMenu_Cancel(taskID); + } +} + +static void sub_808AC2C(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + FieldEffectStart(FLDEFF_USE_SURF); +} + +static bool8 SetUpFieldMove_Surf(void) +{ + if (PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_808AC2C; + return TRUE; + } + else + return FALSE; +} + +static void sub_808AC8C(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + FieldEffectStart(FLDEFF_USE_FLY); +} + +static bool8 SetUpFieldMove_Fly(void) +{ + if (ShouldDoBrailleFlyEffect()) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = DoBrailleFlyEffect; + return TRUE; + } + if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_808AC8C; + return TRUE; + } + return FALSE; +} + +static void sub_808AD0C(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_808AD58(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, HandleDefaultPartyMenu, 0); + SetMainCallback2(sub_808AD0C); +} + +u16 unref_sub_808AD88(void) +{ + return GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES); +} + +static void sub_808ADAC(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + FieldEffectStart(FLDEFF_USE_DIVE); +} + +static bool8 SetUpFieldMove_Dive(void) +{ + gFieldEffectArguments[1] = sub_8068F18(); + if (gFieldEffectArguments[1]) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_808ADAC; + return TRUE; + } + else + return FALSE; +} + +static void sub_808AE08(void) +{ + gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; + FieldEffectStart(FLDEFF_USE_WATERFALL); +} + +static bool8 SetUpFieldMove_Waterfall(void) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE + && IsPlayerSurfingNorth() == TRUE) + { + gFieldCallback = FieldCallback_Teleport; + gUnknown_03005CE4 = sub_808AE08; + return TRUE; + } + else + return FALSE; +} + +#if DEBUG +void debug_sub_80986AC(void) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE + && IsPlayerSurfingNorth() == TRUE) + sub_808AE08(); + else + ScriptContext2_Disable(); +} +#endif + +static void sub_808AE8C(void) +{ + u8 i; + u8 arg = gSpecialVar_ItemId - 33; + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + { + sub_806D668(i); + if ( +#if DEBUG + gUnknown_020297ED == 0 && +#endif + (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg))) + sub_806BC3C(i, 0x9A); + else if (pokemon_has_move(&gPlayerParty[i], ItemIdToBattleMoveId(gSpecialVar_ItemId))) + sub_806BC3C(i, 0xA8); + else + sub_806BC3C(i, 0x8C); + } + } +} + +static void sub_808AF20(void) +{ + u8 i; + for (i = 0; i < 6; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !GetEvolutionTargetSpecies(&gPlayerParty[i], 3, gSpecialVar_ItemId)) + { + sub_806D668(i); + sub_806BC3C(i, 0); + } + } + } +} + +static void sub_808AF80(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + if (gUnknown_02038561 == 0) + { + switch (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId)) + { + case 1: + sub_808AE8C(); + break; + case 2: + sub_808AF20(); + break; + } + } + if (gLastFieldPokeMenuOpened > 5 || !GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES)) + gLastFieldPokeMenuOpened = 0; + sub_806C994(ewram1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_808B020(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + switch (gUnknown_02038561) + { + case 0: + if (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId) == 1) + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 20); + else + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 3); + break; + case 4: + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B1EC, 0xFF); + break; + case 1: + case 3: + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 4); + break; + } + SetMainCallback2(sub_808AF80); +} + +void sub_808B0C0(u8 taskID) +{ + if (!gPaletteFade.active) + { + switch (HandleDefaultPartyMenuInput(taskID)) + { + case A_BUTTON: + gLastFieldPokeMenuOpened = sub_806CA38(taskID); + if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) + PlaySE(SE_HAZURE); + else + { + sub_806D5A4(); + if (gUnknown_02038561 == 0) + gPokemonItemUseCallback(taskID, gSpecialVar_ItemId, sub_808B224); + if (gUnknown_02038561 == 1) + { + PlaySE(SE_SELECT); + PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808B2EC); + } + if (gUnknown_02038561 == 3) + { + PlaySE(SE_SELECT); + PartyMenuTryGiveMonMail(taskID, sub_808B2B4); + } + } + break; + case B_BUTTON: + gLastFieldPokeMenuOpened = sub_806CA38(taskID); + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + if (gUnknown_02038561 == 0 || gUnknown_02038561 == 1) + gTasks[taskID].func = sub_808B25C; + if (gUnknown_02038561 == 3) + gTasks[taskID].func = sub_808B2B4; + break; + } + } +} + +static void sub_808B1EC(u8 taskID) +{ + if (!gPaletteFade.active) + gPokemonItemUseCallback(taskID, gSpecialVar_ItemId, sub_808B224); +} + +static void sub_808B224(u8 taskID) +{ + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = sub_808B25C; +} + +static void sub_808B25C(u8 taskID) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sub_80A5B40); + DestroyTask(taskID); + } +} + +static void sub_808B288(u8 taskID) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(Mailbox_ReturnToMailListAfterDeposit); + DestroyTask(taskID); + } +} + +static void sub_808B2B4(u8 taskID) +{ + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = sub_808B288; +} + +static void sub_808B2EC(u8 taskID) +{ + if (gUnknown_0202E8F4 == 2) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskID].func = sub_808B338; + } + else + sub_808B224(taskID); +} + +static void sub_808B338(u8 taskID) +{ + if (!gPaletteFade.active) + { + u8 mailID; + + gLastFieldPokeMenuOpened = sub_806CA38(taskID); + mailID = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAIL); + DestroyTask(taskID); + sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808B3EC, 3); + } +} + +static void sub_808B3A0(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +static void sub_808B3EC(void) +{ + IntrCallback callback; + + gPaletteFade.bufferTransferDisabled = 1; + if (gSpecialVar_Result == 0) + { + if (gUnknown_0202E8F8) + RemoveBagItem(gUnknown_0202E8F8, 1); + AddBagItem(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM), 1); + TakeMailFromMon(&gPlayerParty[gLastFieldPokeMenuOpened]); + SetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM, (void*) &gUnknown_0202E8F8); + CreateTask(sub_808B25C, 5); + gPaletteFade.bufferTransferDisabled = 0; + callback = CB2_PartyMenuMain; + } + else + { + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B4A4, 0xFF); + callback = sub_808B3A0; + } + SetMainCallback2(callback); +} + +static void sub_808B4A4(u8 taskID) +{ + if (!gPaletteFade.active) + { + DisplayGiveHeldItemMessage(gLastFieldPokeMenuOpened, gSpecialVar_ItemId, 1); + gTasks[taskID].func = sub_808B4EC; + } +} + +static void sub_808B4EC(u8 taskID) +{ + if (gUnknown_0202E8F6 != 1) + sub_808B224(taskID); +} + +void sub_808B508(u8 taskID) +{ + sub_808B224(taskID); +} + +static void sub_808B518(void) +{ + while (1) + { + if (InitPartyMenu() == TRUE) + { + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); + break; + } + if (sub_80F9344() == TRUE) + break; + } +} + +void sub_808B564(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + if (sub_809FA30() != 4) + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, TaughtMove, 0xFF); + else + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, StopTryingToTeachMove_806F588, 0xFF); + SetMainCallback2(sub_808B518); +} + +void sub_808B5B4(u32 taskID) +{ + gUnknown_03005CF0 = gTasks[taskID].func; + gTasks[taskID].func = sub_808B5E4; + sub_808B5E4(taskID); +} + +static void sub_808B5E4(u8 taskID) +{ + if (sub_8055870() != TRUE) + gTasks[taskID].func = gUnknown_03005CF0; +} diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c new file mode 100644 index 000000000..f92a95bfb --- /dev/null +++ b/src/pokemon_size_record.c @@ -0,0 +1,217 @@ +#include "global.h" +#include "pokemon_size_record.h" +#include "data2.h" +#include "event_data.h" +#include "pokedex.h" +#include "constants/species.h" +#include "string_util.h" +#include "strings2.h" +#include "text.h" + +struct UnknownStruct +{ + u16 unk0; + u8 unk2; + u16 unk4; +}; + +extern u16 gSpecialVar_Result; + +static const struct UnknownStruct sBigMonSizeTable[] = +{ + { 290, 1, 0 }, + { 300, 1, 10 }, + { 400, 2, 110 }, + { 500, 4, 310 }, + { 600, 20, 710 }, + { 700, 50, 2710 }, + { 800, 100, 7710 }, + { 900, 150, 17710 }, + { 1000, 150, 32710 }, + { 1100, 100, -17826 }, + { 1200, 50, -7826 }, + { 1300, 20, -2826 }, + { 1400, 5, -826 }, + { 1500, 2, -326 }, + { 1600, 1, -126 }, + { 1700, 1, -26 }, +}; + +#define CM_PER_INCH 2.54 + +static u32 GetMonSizeHash(struct Pokemon *pkmn) +{ + // UB: Too few arguments for function 'GetMonData' + u16 personality = GetMonData(pkmn, MON_DATA_PERSONALITY); + u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF; + u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF; + u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF; + u16 speedIV = GetMonData(pkmn, MON_DATA_SPEED_IV) & 0xF; + u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF; + u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF; + u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF); + u32 lobyte = ((spAtkIV ^ spDefIV) * speedIV) ^ (personality >> 8); + + return (hibyte << 8) + lobyte; +} + +static u8 TranslateBigMonSizeTableIndex(u16 a) +{ + u8 i; + + for (i = 1; i < 15; i++) + { + if (a < sBigMonSizeTable[i].unk4) + return i - 1; + } + return i; +} + +static u32 GetMonSize(u16 species, u16 b) +{ + u64 unk2; + u64 unk4; + u64 unk0; + u32 height; + u32 var; + + height = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(species), 0); + var = TranslateBigMonSizeTableIndex(b); + unk0 = sBigMonSizeTable[var].unk0; + unk2 = sBigMonSizeTable[var].unk2; + unk4 = sBigMonSizeTable[var].unk4; + unk0 += (b - unk4) / unk2; + return height * unk0 / 10; +} + +static void FormatMonSizeRecord(u8 *string, u32 size) +{ +#if ENGLISH + u8 decimalPoint[] = _("."); +#elif GERMAN + u8 decimalPoint[] = _(","); +#endif + +#ifdef UNITS_IMPERIAL + //Convert size from centimeters to inches + size = (double)(size * 10) / (CM_PER_INCH * 10); +#endif + + string = ConvertIntToDecimalStringN(string, size / 10, 0, 8); + string = StringAppend(string, decimalPoint); + ConvertIntToDecimalStringN(string, size % 10, 0, 1); +} + +static u8 CompareMonSize(u16 species, u16 *sizeRecord) +{ + if (gSpecialVar_Result == 0xFF) + { + return 0; + } + else + { + struct Pokemon *pkmn = &gPlayerParty[gSpecialVar_Result]; + + // UB: Too few arguments for function 'GetMonData' + if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species) + { + return 1; + } + else + { + u32 oldSize; + u32 newSize; + u16 sizeParams; + + *(&sizeParams) = GetMonSizeHash(pkmn); + newSize = GetMonSize(species, sizeParams); + oldSize = GetMonSize(species, *sizeRecord); + FormatMonSizeRecord(gStringVar2, newSize); + if (newSize <= oldSize) + { + return 2; + } + else + { + *sizeRecord = sizeParams; + return 3; + } + } + } +} + +//Stores species name in gStringVar1, trainer's name in gStringVar2, and size in gStringVar3 +static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord) +{ + u32 size = GetMonSize(species, *sizeRecord); + + FormatMonSizeRecord(gStringVar3, size); + StringCopy(gStringVar1, gSpeciesNames[species]); + if (*sizeRecord == 0x8100) + StringCopy(gStringVar2, gOtherText_Marco); + else + StringCopy(gStringVar2, gSaveBlock2.playerName); +} + +void InitShroomishSizeRecord(void) +{ + VarSet(VAR_SHROOMISH_SIZE_RECORD, 0x8100); +} + +void GetShroomishSizeRecordInfo(void) +{ + u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD); + + GetMonSizeRecordInfo(SPECIES_SHROOMISH, sizeRecord); +} + +void CompareShroomishSize(void) +{ + u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD); + + gSpecialVar_Result = CompareMonSize(SPECIES_SHROOMISH, sizeRecord); +} + +void InitBarboachSizeRecord(void) +{ + VarSet(VAR_BARBOACH_SIZE_RECORD, 0x8100); +} + +void GetBarboachSizeRecordInfo(void) +{ + u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD); + + GetMonSizeRecordInfo(SPECIES_BARBOACH, sizeRecord); +} + +void CompareBarboachSize(void) +{ + u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD); + + gSpecialVar_Result = CompareMonSize(SPECIES_BARBOACH, sizeRecord); +} + +void GiveGiftRibbonToParty(u8 index, u8 ribbonId) +{ + s32 i; + bool32 gotRibbon = FALSE; + u8 data = 1; + u8 arr[] = { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E }; + + if (index < 11 && ribbonId < 65) + { + gSaveBlock1.giftRibbons[index] = ribbonId; + for (i = 0; i < 6; i++) + { + struct Pokemon *pkmn = &gPlayerParty[i]; + + if (GetMonData(pkmn, MON_DATA_SPECIES) != 0 && GetMonData(pkmn, MON_DATA_SANITY_BIT3) == 0) + { + SetMonData(pkmn, arr[index], &data); + gotRibbon = TRUE; + } + } + if (gotRibbon) + FlagSet(FLAG_SYS_RIBBON_GET); + } +} diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c new file mode 100644 index 000000000..1ea8bc205 --- /dev/null +++ b/src/pokemon_storage_system.c @@ -0,0 +1,784 @@ +#include "global.h" +#include "palette.h" +#include "constants/songs.h" +#include "sound.h" +#include "field_weather.h" +#include "overworld.h" +#include "field_fadetransition.h" +#include "menu.h" +#include "main.h" +#include "strings.h" +#include "string_util.h" +#include "event_data.h" +#include "script.h" +#include "pokemon_storage_system.h" + +void StorageSystemCreatePrimaryMenu(u8 whichMenu); +void sub_80963D0(u8 curBox); +void sub_809658C(void); +void sub_80965F8(void); +void sub_809662C(void); +void sub_809665C(void); +void sub_80966F4(const u8 *sourceString, u16 x, u16 y); +void sub_8096784(struct Sprite *sprite); + +EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; +EWRAM_DATA u8 gUnknown_02038470[3] = {}; +EWRAM_DATA u8 gUnknown_02038473 = 0; +EWRAM_DATA u8 gUnknown_02038474 = 0; +EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478 = NULL; + +const struct PSS_MenuStringPtrs gUnknown_083B600C[] = { + {PCText_WithdrawPoke, PCText_MovePokeToParty}, + {PCText_DepositPoke, PCText_StorePokeInBox}, + {PCText_MovePoke, PCText_OrganizeBoxesParty}, + {PCText_SeeYa, PCText_ReturnToPrevMenu} +}; + +#if DEBUG +const u16 gUnknown_Debug_083E05F0[2] = {0}; +#endif + +const union AnimCmd gSpriteAnim_83B602C[] = { + ANIMCMD_FRAME( 0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6034[] = { + ANIMCMD_FRAME( 4, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B603C[] = { + ANIMCMD_FRAME( 6, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6044[] = { + ANIMCMD_FRAME(10, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83B604C[] = { + gSpriteAnim_83B602C, + gSpriteAnim_83B6034, + gSpriteAnim_83B603C, + gSpriteAnim_83B6044 +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B605C[] = { + AFFINEANIMCMD_FRAME(0xe0, 0xe0, 0, 0), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B606C[] = { + gSpriteAffineAnim_83B605C +}; + +const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal"); + +const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); + +const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); + +u8 CountPokemonInBoxN(u8 boxId) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < 30; i++) + { + if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) != 0) + count++; + } + return count; +} + +s16 GetIndexOfFirstEmptySpaceInBoxN(u8 boxId) +{ + u16 i; + + for (i = 0; i < 30; i++) + { + if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) == 0) + return i; + } + return -1; +} + +u8 GetNumValidDaycarePartyMons(void) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + struct Pokemon *pokemon = gPlayerParty + i; + if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG)) + count++; + } + return count; +} + +u8 CountAlivePartyMonsExceptOne(u8 toSkip) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (i != toSkip) + { + struct Pokemon *pokemon = gPlayerParty + i; + if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG) && GetMonData(pokemon, MON_DATA_HP) != 0) + count++; + } + } + return count; +} + +u8 CountAlivePartyMonsExceptSelectedOne(void) +{ + return CountAlivePartyMonsExceptOne(gSpecialVar_0x8004); +} + +u8 StorageSystemGetPartySize(void) +{ + u16 i; + u16 count; + + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != 0) + count++; + } + return count; +} + +u8 *unref_sub_8095C60(u8 *dest, const u8 *src, u16 pad) +{ + u8 *_dest = StringCopy(dest, src); + while (_dest < dest + pad) + { + *_dest++ = CHAR_SPACE; + } + *_dest = EOS; + return _dest; +} + +void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) +{ + u16 i; + + dest_width *= 2; + dest += dest_top * 0x20 + dest_left; + src += src_top * src_width + src_left; + for (i = 0; i < dest_height; i++) + { + CpuCopy16(src, dest, dest_width); + dest += 0x20; + src += src_width; + } +} + +#define MAX_DMA_BLOCK_SIZE 0x1000 +#define Dma3FillLarge_(value, dest, size, bit) \ +{ \ + void *_dest = dest; \ + u32 _size = size; \ + while (1) \ + { \ + if (_size <= MAX_DMA_BLOCK_SIZE) \ + { \ + DmaFill##bit(3, value, _dest, _size); \ + break; \ + } \ + DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ + _dest += MAX_DMA_BLOCK_SIZE; \ + _size -= MAX_DMA_BLOCK_SIZE; \ + } \ +} + +#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) +#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) + +void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) +{ + u16 i; + + dest += dest_top * 0x20 + dest_left; + width *= 2; + for (i = 0; i < height; dest += 0x20, i++) + Dma3FillLarge16_(0, dest, width); +} + +s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) +{ + s16 i; + s16 direction; + if (mode == 0 || mode == 2) + { + direction = 1; + } + else + { + direction = -1; + } + if (mode == 2 || mode == 3) + { + for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction) + { + if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0) + return i; + } + } + else + { + for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction) + { + if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0 && !GetBoxMonData(box + i, MON_DATA_IS_EGG)) + return i; + } + } + return -1; +} + +void StorageSystemClearMessageWindow(void) +{ + Menu_BlankWindowRect(2, 15, 27, 18); +} + +void Task_PokemonStorageSystem(u8 taskId) +{ + struct Task *task = gTasks + taskId; + switch (task->data[0]) + { + case 0: + StorageSystemCreatePrimaryMenu(task->data[1]); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + task->data[0]++; + break; + case 1: + if (IsWeatherNotFadingIn()) + { + task->data[0]++; + } + break; + case 2: + task->data[2] = Menu_ProcessInput(); + switch(task->data[2]) + { + case -2: + task->data[3] = task->data[1]; + if (gMain.newKeys & DPAD_UP && --task->data[3] < 0) + task->data[3] = 3; + + if (gMain.newKeys & DPAD_DOWN && ++task->data[3] > 3) + task->data[3] = 0; + if (task->data[1] != task->data[3]) + { + task->data[1] = task->data[3]; + StorageSystemClearMessageWindow(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + } + break; + case -1: + case 3: + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 13, 9); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + default: + if (task->data[2] == 0 && StorageSystemGetPartySize() == PARTY_SIZE) + { + StorageSystemClearMessageWindow(); + Menu_PrintText(gPCText_PartyFull2, 2, 15); + task->data[0] = 3; + } + else if (task->data[2] == 1 && StorageSystemGetPartySize() == 1) + { + StorageSystemClearMessageWindow(); + Menu_PrintText(gPCText_OnlyOne, 2, 15); + task->data[0] = 3; + } + else + { + FadeScreen(1, 0); + task->data[0] = 4; + } + break; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + StorageSystemClearMessageWindow(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + task->data[0] = 2; + } + else if (gMain.newKeys & DPAD_UP) + { + if (--task->data[1] < 0) + task->data[1] = 3; + Menu_MoveCursor(-1); + task->data[1] = Menu_GetCursorPos(); + StorageSystemClearMessageWindow(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + task->data[0] = 2; + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (++task->data[1] > 3) + task->data[1] = 0; + Menu_MoveCursor(1); + task->data[1] = Menu_GetCursorPos(); + StorageSystemClearMessageWindow(); + Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15); + task->data[0] = 2; + } + break; + case 4: + if (!gPaletteFade.active) + { + task_intro_29(task->data[2]); + DestroyTask(taskId); + } + break; + } +} + +void ShowPokemonStorageSystem(void) +{ + u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + ScriptContext2_Enable(); +} + +void FieldCB_ReturnToOverworld(void) +{ + u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = gUnknown_02038474; + pal_fill_black(); +} + +void StorageSystemCreatePrimaryMenu(u8 whichMenu) +{ + Menu_DrawStdWindowFrame(0, 0, 13, 9); + Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083B600C); + InitMenu(0, 1, 1, 4, whichMenu, 12); +} + +void sub_80961A8(void) +{ + gUnknown_02038474 = gPokemonStorageSystemPtr->unk_0005; + gFieldCallback = FieldCB_ReturnToOverworld; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +void ResetPokemonStorageSystem(void) +{ + u16 boxId; + u16 boxMon; + + gPokemonStorage.currentBox = 0; + for (boxId = 0; boxId < 14; boxId++) + { + for (boxMon = 0; boxMon < 30; boxMon++) + { + ZeroBoxMonData(gPokemonStorage.boxes[boxId] + boxMon); + } + } + for (boxId = 0; boxId < 14; boxId++) + { + u8 *dest = StringCopy(gPokemonStorage.boxNames[boxId], gPCText_BOX); + ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2); + } + for (boxId = 0; boxId < 14; boxId++) + { + gPokemonStorage.wallpaper[boxId] = boxId & 0x03; + } +} + +#if DEBUG +__attribute__((naked)) +void debug_sub_80A3904(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + add sp, sp, #0xffffffe4\n\ + mov r0, #0x0\n\ + mov r8, r0\n\ + mov r7, r8\n\ + mov r1, #0x14\n\ + str r1, [sp, #0x18]\n\ + mov r2, #0xff\n\ + mov r9, r2\n\ +._162:\n\ + mov r5, #0x0\n\ + cmp r7, #0\n\ + beq ._160 @cond_branch\n\ + mov r0, #0xe\n\ + mov r8, r0\n\ + b ._158\n\ +._160:\n\ + bl Random\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + str r0, [sp, #0x14]\n\ + mov r2, r8\n\ + lsl r1, r2, #0x2\n\ + add r1, r1, r8\n\ + lsl r3, r1, #0x4\n\ + sub r3, r3, r1\n\ + lsl r3, r3, #0x5\n\ + lsl r1, r5, #0x2\n\ + add r1, r1, r5\n\ + lsl r1, r1, #0x4\n\ + ldr r2, ._163 @ gPokemonStorage\n\ + add r1, r1, r2\n\ + add r6, r3, r1\n\ + ldr r2, ._163 + 4 @ gUnknown_Debug_083E05F0\n\ + lsl r1, r7, #0x1\n\ + add r1, r1, r2\n\ + ldrh r4, [r1]\n\ + add r5, r5, #0x1\n\ + lsl r2, r5, #0x18\n\ + lsr r2, r2, #0x18\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + str r1, [sp, #0x4]\n\ + mov r1, #0x1\n\ + mov sl, r1\n\ + str r1, [sp, #0x8]\n\ + str r0, [sp, #0xc]\n\ + add r0, r6, #0\n\ + add r1, r4, #0\n\ + mov r3, #0x20\n\ + bl CreateBoxMon\n\ + cmp r4, #0\n\ + beq ._157 @cond_branch\n\ + cmp r4, #0xac\n\ + bne ._156 @cond_branch\n\ + add r0, sp, #0x10\n\ + mov r2, sl\n\ + strb r2, [r0]\n\ + add r0, r6, #0\n\ + mov r1, #0x2d\n\ + add r2, sp, #0x10\n\ + bl SetBoxMonData\n\ +._156:\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r4, sp, #0x14\n\ + add r0, r6, #0\n\ + mov r1, #0x16\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x17\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x18\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x21\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x2f\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + bl Random\n\ + mov r1, r9\n\ + and r1, r1, r0\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x30\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ + ldr r0, [sp, #0x18]\n\ + cmp r0, #0\n\ + beq ._157 @cond_branch\n\ + sub r0, r0, #0x1\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + str r0, [sp, #0x18]\n\ + mov r1, sl\n\ + str r1, [sp, #0x14]\n\ + add r0, r6, #0\n\ + mov r1, #0x32\n\ + add r2, r4, #0\n\ + bl SetBoxMonData\n\ +._157:\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r7, r0, #0x10\n\ + lsl r0, r5, #0x10\n\ + lsr r5, r0, #0x10\n\ + cmp r5, #0x1d\n\ + bhi ._158 @cond_branch\n\ + cmp r7, #0\n\ + bne ._159 @cond_branch\n\ + b ._160\n\ +._159:\n\ + mov r2, #0xe\n\ + mov r8, r2\n\ +._158:\n\ + mov r0, r8\n\ + add r0, r0, #0x1\n\ + lsl r0, r0, #0x10\n\ + lsr r0, r0, #0x10\n\ + mov r8, r0\n\ + cmp r0, #0xd\n\ + bhi ._161 @cond_branch\n\ + b ._162\n\ +._161:\n\ + add sp, sp, #0x1c\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._164:\n\ + .align 2, 0\n\ +._163:\n\ + .word gPokemonStorage+0x4\n\ + .word gUnknown_Debug_083E05F0"); +} +#endif + +void sub_8096264(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3) +{ + struct SpritePalette palette = { + gBoxSelectionPopupPalette, palTag + }; + struct SpriteSheet sheets[] = { + {gBoxSelectionPopupCenterTiles, 0x800, tileTag}, + {gBoxSelectionPopupSidesTiles, 0x180, tileTag + 1}, + {} + }; + LoadSpritePalette(&palette); + LoadSpriteSheets(sheets); + gUnknown_02038478 = a0; + a0->unk_0240 = tileTag; + a0->unk_0242 = palTag; + a0->unk_023e = a3; +} + +void sub_8096310(void) +{ + FreeSpritePaletteByTag(gUnknown_02038478->unk_0242); + FreeSpriteTilesByTag(gUnknown_02038478->unk_0240); + FreeSpriteTilesByTag(gUnknown_02038478->unk_0240 + 1); +} + +void sub_809634C(u8 curBox) +{ + sub_80963D0(curBox); +} + +void sub_809635C(void) +{ + sub_809658C(); +} + +u8 sub_8096368(void) +{ + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + return 201; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return gUnknown_02038478->curBox; + } + if (gMain.newKeys & DPAD_LEFT) + { + PlaySE(SE_SELECT); + sub_809662C(); + } + else if (gMain.newKeys & DPAD_RIGHT) + { + PlaySE(SE_SELECT); + sub_80965F8(); + } + return 200; +} + +void sub_80963D0(u8 curBox) +{ + u16 i; + u8 spriteId; + struct SpriteTemplate template; + struct OamData oamData = {}; + oamData.size = 3; + oamData.paletteNum = 1; + template = (struct SpriteTemplate){ + 0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy + }; + + gUnknown_02038478->curBox = curBox; + template.tileTag = gUnknown_02038478->unk_0240; + template.paletteTag = gUnknown_02038478->unk_0242; + + spriteId = CreateSprite(&template, 0xA0, 0x60, 0); + gUnknown_02038478->unk_0000 = gSprites + spriteId; + + oamData.shape = ST_OAM_V_RECTANGLE; + oamData.size = 1; + template.tileTag = gUnknown_02038478->unk_0240 + 1; + template.anims = gSpriteAnimTable_83B604C; + for (i = 0; i < 4; i++) + { + u16 r5; + spriteId = CreateSprite(&template, 0x7c, 0x50, gUnknown_02038478->unk_023e); + gUnknown_02038478->unk_0004[i] = gSprites + spriteId; + r5 = 0; + if (i & 2) + { + gUnknown_02038478->unk_0004[i]->pos1.x = 0xc4; + r5 = 2; + } + if (i & 1) + { + gUnknown_02038478->unk_0004[i]->pos1.y = 0x70; + gUnknown_02038478->unk_0004[i]->oam.size = 0; + r5++; + } + StartSpriteAnim(gUnknown_02038478->unk_0004[i], r5); + } + for (i = 0; i < 2; i++) + { + gUnknown_02038478->unk_0020[i] = sub_809A9A0(72 * i + 0x7c, 0x58, i, 0, gUnknown_02038478->unk_023e); + if (gUnknown_02038478->unk_0020[i]) + { + gUnknown_02038478->unk_0020[i]->data[0] = (i == 0 ? -1 : 1); + gUnknown_02038478->unk_0020[i]->callback = sub_8096784; + } + } + sub_809665C(); +} + +void sub_809658C(void) +{ + u16 i; + if (gUnknown_02038478->unk_0000) + { + DestroySprite(gUnknown_02038478->unk_0000); + gUnknown_02038478->unk_0000 = NULL; + } + for (i = 0; i < 4; i++) + { + if (gUnknown_02038478->unk_0004[i]) + { + DestroySprite(gUnknown_02038478->unk_0004[i]); + gUnknown_02038478->unk_0004[i] = NULL; + } + } + for (i = 0; i < 2; i++) + { + if (gUnknown_02038478->unk_0020[i]) + DestroySprite(gUnknown_02038478->unk_0020[i]); + } +} + +void sub_80965F8(void) +{ + if (++gUnknown_02038478->curBox > 13) + gUnknown_02038478->curBox = 0; + sub_809665C(); +} + +void sub_809662C(void) +{ + gUnknown_02038478->curBox = (gUnknown_02038478->curBox == 0 ? 13 : gUnknown_02038478->curBox - 1); + sub_809665C(); +} + +void sub_809665C(void) +{ + u8 nPokemonInBox = CountPokemonInBoxN(gUnknown_02038478->curBox); + u8 *stringVar = gStringVar1; + + stringVar[0] = EXT_CTRL_CODE_BEGIN; + stringVar[1] = 0x04; // EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW + stringVar[2] = 0x0F; // TEXT_COLOR_WHITE2 + stringVar[3] = 0x01; // TEXT_COLOR_DARK_GREY + stringVar[4] = 0x0E; // TEXT_COLOR_LIGHT_BLUE + stringVar += 5; + + stringVar = StringCopy(stringVar, gPokemonStorage.boxNames[gUnknown_02038478->curBox]); + + stringVar[0] = CHAR_NEWLINE; + stringVar[1] = EXT_CTRL_CODE_BEGIN; + stringVar[2] = 0x11; // EXT_CTRL_CODE_CLEAR + if (nPokemonInBox < 10) + stringVar[3] = 0x28; + else + stringVar[3] = 0x22; + stringVar += 4; + + stringVar = ConvertIntToDecimalString(stringVar, nPokemonInBox); + + stringVar[0] = CHAR_SLASH; + stringVar[1] = CHAR_0 + 3; + stringVar[2] = CHAR_0 + 0; + stringVar[3] = EOS; + sub_80966F4(gStringVar1, 0, 1); +} + +void sub_80966F4(const u8 *sourceString, u16 x, u16 y) +{ + u16 *vdest = (u16 *)(BG_CHAR_ADDR(4) + (GetSpriteTileStartByTag(gUnknown_02038478->unk_0240) * 32) + y * 256 + x * 32); + u8 *tileBuff = gUnknown_083B6DB8; + DmaFill16(3, 0x1111, tileBuff, 0x400); + Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, tileBuff, sourceString); + DmaCopy16(3, tileBuff, vdest, 0x400); +} + +void sub_8096784(struct Sprite *sprite) +{ + if (++sprite->data[1] > 3) + { + sprite->data[1] = 0; + sprite->pos2.x += sprite->data[0]; + if (++sprite->data[2] > 5) + { + sprite->data[2] = 0; + sprite->pos2.x = 0; + } + } +} diff --git a/src/pokemon_storage_system_2.c b/src/pokemon_storage_system_2.c new file mode 100644 index 000000000..0331abf3e --- /dev/null +++ b/src/pokemon_storage_system_2.c @@ -0,0 +1,2121 @@ + +// Includes +#include "global.h" +#include "decompress.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "data2.h" +#include "sound.h" +#include "ewram.h" +#include "task.h" +#include "main.h" +#include "palette.h" +#include "menu.h" +#include "graphics.h" +#include "strings.h" +#include "string_util.h" +#include "pokemon_summary_screen.h" +#include "mail_data.h" +#include "naming_screen.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u8 gUnknown_0203847C = 0; +EWRAM_DATA u8 gUnknown_0203847D = 0; +EWRAM_DATA u8 gUnknown_0203847E = 0; +EWRAM_DATA u8 gUnknown_0203847F = 0; + +// Static ROM declarations + +void sub_8096884(void); +void sub_8096AFC(void); +void sub_8096B38(void); +void SetPSSCallback(void (*func)(void)); +void sub_8096BF0(void); +void sub_8096C68(void); +void sub_8096C84(void); +void sub_8096FC8(void); +void sub_8097004(void); +void sub_8097078(void); +void sub_80972A8(void); +void sub_80972FC(void); +void c3_0808DC50(void); +void sub_8097390(void); +void sub_809746C(void); +void sub_8097594(void); +void sub_8097788(void); +void sub_80977E4(void); +void sub_8097858(void); +void sub_809789C(void); +void sub_8097974(void); +void sub_8097A64(void); +void sub_8097B44(void); +void sub_8097BA0(void); +void sub_8097CC0(void); +void sub_8097DE0(void); +void sub_8097E44(void); +void sub_8097E70(void); +void sub_8097F58(void); +void sub_8097FB8(void); +void sub_809801C(void); +void BoxSetMosaic(void); +void sub_8098090(struct Sprite *sprite); +void sub_80980D4(void); +void sub_80981F0(u16 species, u32 pid); +void sub_80982B4(void); +void sub_8098350(void); +void sub_8098400(void); +void add_to_c3_somehow(void); +void sub_8098780(void); +void sub_8098690(bool8 flag); +bool8 sub_80985CC(void); +void sub_80986E8(void); +void sub_8098710(void); +void sub_8098734(void); +void sub_80987DC(void); +void sub_809880C(void); +bool8 sub_8098830(void); +void PrintStorageActionText(u8 index); +void sub_8098A38(s8); +void sub_8098A5C(void); +void sub_8098A80(void); +void sub_8098AA8(u8 a0); + +// .rodata + +const u16 gPokemonStorageScrollingBGPalette[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal"); + +const u16 gPokemonStorageScrollingBGTile[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.4bpp"); + +const u8 gPokemonStorageScrollingBGTilemap[] = INCBIN_U8("graphics/pokemon_storage/scrolling_bg_map.bin.lz"); + +const u16 sUnknownTilemap[] = { + 0x1281, + 0x1282, + 0x1283, + 0x1284, + 0x1285, + 0x1286, + 0x1287, + 0x1288, + 0x128C, + 0x128D, + 0x128E, + 0x128F, + 0x1290, + 0x1291, + 0x1292, + 0x1293, + 0x0281, + 0x0282, + 0x0283, + 0x0284, + 0x0285, + 0x0286, + 0x0287, + 0x0288, + 0x028C, + 0x028D, + 0x028E, + 0x028F, + 0x0290, + 0x0291, + 0x0292, + 0x0293, + 0x12AD, + 0x12AE, + 0x12A8, + 0x12A8 +}; + +const u16 WaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal"); + +const u8 WaveformTiles[] = INCBIN_U8("graphics/pokemon_storage/waveform.4bpp"); + +const u16 gUnknown_083B6D74[] = INCBIN_U16("graphics/pokemon_storage/83B6D74.gbapal"); + +const u16 gUnknown_083B6D94[] = INCBIN_U16("graphics/pokemon_storage/83B6D94.gbapal"); + +struct PokemonStorageSystemData *const gPokemonStorageSystemPtr = &ePokemonStorageSystem; + +u8 *const gUnknown_083B6DB8 = gTileBuffer; + +const struct SpritePalette gWaveformSpritePalette = { + WaveformPalette, 0xdacd +}; + +// .text + +void task_intro_29(u8 whichMenu) +{ + gUnknown_0203847D = whichMenu; + gPokemonStorageSystemPtr->unk_0005 = whichMenu; + SetMainCallback2(sub_8096884); +} + +void sub_80967DC(void) +{ + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; +} + +void sub_8096804(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeSpriteTileRanges(); + FreeAllSpritePalettes(); + ResetTasks(); + gReservedSpriteTileCount = 0x280; + sub_809CFDC(&gPokemonStorageSystemPtr->unk_0020, gPokemonStorageSystemPtr->unk_0028, 8); + gKeyRepeatStartDelay = 20; +} + +void sub_8096848(void) +{ + sub_809B0D4(); + gUnknown_0203847C = (gPokemonStorageSystemPtr->unk_0005 == 1 ? 1 : 0); + gUnknown_0203847E = 0; +} + +void sub_8096874(void) +{ + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +extern u8 unk_2038790; + +void sub_8096884(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + sub_8096804(); +#if DEBUG + unk_2038790 = 0; +#endif + gMain.state++; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowTemplate_81E6D00); + Menu_EraseScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + sub_8096848(); + gMain.state++; + break; + case 4: + ResetPSSMonIconSprites(); + sub_809AA24(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; + gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + sub_8096874(); + SetPSSCallback(sub_8096BF0); + SetMainCallback2(sub_8096B38); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + } +} + +void sub_80969A0(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + gPokemonStorageSystemPtr->unk_0005 = gUnknown_0203847D; + sub_8096804(); + if (gUnknown_0203847F == 1) + sub_809BBC0(); + if (gUnknown_0203847F == 0) + sub_809BD14(); + gMain.state++; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E6D00); + gMain.state++; + break; + case 2: + InitMenuWindow(&gWindowTemplate_81E6D00); + Menu_EraseScreen(); + gMain.state++; + break; + case 3: + sub_80967DC(); + gMain.state++; + break; + case 4: + ResetPSSMonIconSprites(); + sub_809AA98(); + gMain.state++; + break; + case 5: + sub_8097DE0(); + gMain.state++; + break; + case 6: + sub_8097E70(); + gMain.state++; + break; + case 7: + sub_8098400(); + gMain.state++; + break; + case 8: + sub_8099BF8(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a; + gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb; + sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc); + sub_80F7404(); + gMain.state++; + break; + case 9: + BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0); + SetVBlankCallback(sub_8096AFC); + gMain.state++; + break; + case 10: + sub_8096874(); + SetPSSCallback(sub_8096C68); + SetMainCallback2(sub_8096B38); + gMain.state++; + break; + } +} + +#if DEBUG + +void debug_sub_80A4300(void) +{ + gUnknown_0203847D = 0; + gPokemonStorageSystemPtr->unk_0005 = 0; + sub_8096884(); + if (gMain.callback2 == sub_8096B38) + unk_2038790 = 1; +} + +extern void (*unk_2038794)(void); +extern u32 unk_2038798; + +extern void unref_sub_809CB94(); + +void debug_sub_80A433C(u32 a, void (*b)(void)) +{ + unk_2038794 = b; + unk_2038798 = a; + SetMainCallback2(debug_sub_80A4300); +} + +void debug_sub_80A435C(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + unref_sub_809CB94(unk_2038798); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + unk_2038794(); + break; + } +} + +#endif + +void sub_8096AFC(void) +{ + REG_BG2HOFS = gPokemonStorageSystemPtr->unk_08b4; + REG_BG3HOFS = gPokemonStorageSystemPtr->unk_000a; + REG_BG3VOFS = gPokemonStorageSystemPtr->unk_0008; + LoadOam(); + ProcessSpriteCopyRequests(); + sub_809CFF0(); + TransferPlttBuffer(); +} + +void sub_8096B38(void) +{ + gPokemonStorageSystemPtr->unk_0000(); + sub_8097E44(); + sub_8098734(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_8096B5C(void) +{ + switch (gPokemonStorageSystemPtr->unk_0006) + { + case 0: + ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690.pokemon, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e); + break; + case 1: + DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0); + break; + } +} + +void SetPSSCallback(void (*func)(void)) +{ + gPokemonStorageSystemPtr->unk_0000 = func; + gPokemonStorageSystemPtr->unk_0004 = 0; +} + +void sub_8096BF0(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + BlendPalettes(0xffffffff, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + PlaySE(SE_PC_LOGON); + gPokemonStorageSystemPtr->unk_000c.tileTag = 14; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 0; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5CD4(&gPokemonStorageSystemPtr->unk_000c); + BlendPalettes(0xffffffff, 0, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 2: + if (sub_80C5DCC()) + SetPSSCallback(sub_8096C84); + break; + } +} + +void sub_8096C68(void) +{ + if (!UpdatePaletteFade()) + SetPSSCallback(sub_8096C84); +} + +void sub_8096C84(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + switch (sub_809CA40()) + { + case 1: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_0004 = 1; + break; + case 5: + if (gPokemonStorageSystemPtr->unk_0005 != 2) + { + PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + sub_809B0D4(); + SetPSSCallback(sub_8096FC8); + } + break; + case 6: + if (gPokemonStorageSystemPtr->unk_0005 == 2) + { + if (sub_809BF20() && ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + gPokemonStorageSystemPtr->unk_0004 = 5; + else + SetPSSCallback(sub_8097004); + } + break; + case 4: +#if DEBUG + if (unk_2038790 != 0) + break; +#endif + SetPSSCallback(sub_8097BA0); + break; + case 16: +#if DEBUG + if (unk_2038790 != 0) + break; +#endif + SetPSSCallback(sub_8097CC0); + break; + case 7: + PlaySE(SE_SELECT); + SetPSSCallback(sub_809789C); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097078); + break; + case 9: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox + 1; + if (gPokemonStorageSystemPtr->unk_08b2 > 13) + gPokemonStorageSystemPtr->unk_08b2 = 0; + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004 = 2; + break; + case 10: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox - 1; + if (gPokemonStorageSystemPtr->unk_08b2 < 0) + gPokemonStorageSystemPtr->unk_08b2 = 13; + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004 = 2; + break; + case 11: + if (!sub_809BE80()) + { + if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 5; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_809746C); + } + } + else + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + break; + case 13: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972A8); + } + break; + case 14: + if (!sub_809BEBC()) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(c3_0808DC50); + } + break; + case 12: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097390); + break; + case 15: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80972FC); + break; + } + break; + case 1: + if (!sub_809AC00()) + { + if (sub_809BF48()) + sub_80986E8(); + else + sub_8098710(); + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 2: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; + if (!gUnknown_0203847C && !sub_809BF20()) + { + sub_809B440(); + BoxSetMosaic(); + } + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004 = 0; + } + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + gPokemonStorageSystemPtr->unk_0004 = 6; + break; + case 5: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + gPokemonStorageSystemPtr->unk_0004 = 6; + break; + case 6: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8096FC8(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809880C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_8098830()) + SetPSSCallback(sub_8096C84); + break; + } +} + +void sub_8097004(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PlaySE(SE_SELECT); + add_to_c3_somehow(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_80985CC()) + { + sub_809B0C0(sub_809B0F4()); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 2: + if (!sub_809AC00()) + { + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097078(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_IS_SELECTED); + sub_809CE84(); + gPokemonStorageSystemPtr->unk_0004 = 1; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 3: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972A8); + } + break; + case 5: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_80972FC); + break; + case 4: + if (!sub_809BEBC()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(c3_0808DC50); + } + break; + case 2: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097390); + break; + case 1: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_809746C); + } + break; + case 7: + if (sub_809BE80()) + { + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else if (gPokemonStorageSystemPtr->unk_11f9) + { + gPokemonStorageSystemPtr->unk_0004 = 4; + } + else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2)) + { + gPokemonStorageSystemPtr->unk_0004 = 3; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097594); + } + break; + case 6: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097788); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(sub_80977E4); + break; +#if DEBUG + case 32: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(debug_sub_80A435C); + break; +#endif + } + break; + case 2: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 3: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + gPokemonStorageSystemPtr->unk_0004 = 5; + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_80972A8(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_80972FC(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(1); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + if (gUnknown_0203847C) + SetPSSCallback(sub_8097858); + else + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void c3_0808DC50(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809B100(2); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_809B130()) + { + BoxSetMosaic(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097390(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + if (CalculatePlayerPartyCount() == 6) + { + PrintStorageActionText(PC_TEXT_PARTY_FULL); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + sub_809B0E0(); + sub_809B100(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + if (!sub_809B130()) + { + sub_809880C(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 3: + if (!sub_8098830()) + { + sub_809B100(1); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 4: + if (!sub_809B130()) + { + sub_80987DC(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 5: + SetPSSCallback(sub_8097004); + break; + } +} + +void sub_809746C(void) +{ + u8 r4; + + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gUnknown_0203847E); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + r4 = sub_8096368(); + if (r4 == 200); + else if (r4 == 201) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + SetPSSCallback(sub_8096C84); + } + else + { + if (sub_809B62C(r4)) + { + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + else + { + PrintStorageActionText(PC_TEXT_BOX_IS_FULL); + gPokemonStorageSystemPtr->unk_0004 = 4; + } + gUnknown_0203847E = r4; + } + break; + case 2: + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 3: + if (sub_8099374() == 0) + { + sub_809B6BC(); + BoxSetMosaic(); + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + break; + } +} + +void sub_8097594(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_RELEASE_POKE); + sub_8098A38(1); + gPokemonStorageSystemPtr->unk_0004++; + // fallthrough + case 1: + switch (Menu_ProcessInputNoWrap()) + { + case -1: + case 1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + sub_8098A5C(); + sub_809B7D4(); + sub_809B6DC(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 2: + sub_809B960(); + if (!sub_809B734()) + { + while (1) + { + s8 r0 = sub_809B960(); + if (r0 == 1) + { + gPokemonStorageSystemPtr->unk_0004++; + break; + } + if (r0 == 0) + { + gPokemonStorageSystemPtr->unk_0004 = 8; + break; + } + } + } + break; + case 3: + sub_809B760(); + sub_809801C(); + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_BYE_BYE); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + if (gUnknown_0203847C) + { + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + } + else + { + gPokemonStorageSystemPtr->unk_0004 = 7; + } + } + break; + case 6: + if (sub_8099374() == 0) + { + sub_809B440(); + BoxSetMosaic(); + sub_80987DC(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 7: + SetPSSCallback(sub_8096C84); + break; + case 8: + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 9: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_SURPRISE); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 10: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + sub_8099958(); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 11: + if (!sub_8099990()) + { + sub_809B7AC(); + PrintStorageActionText(PC_TEXT_CAME_BACK); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 12: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PrintStorageActionText(PC_TEXT_WORRIED); + gPokemonStorageSystemPtr->unk_0004++; + } + break; + case 13: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097788(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809BC18(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 0; + gPokemonStorageSystemPtr->unk_0006 = 0; + SetMainCallback2(sub_8096B5C); + } + break; + } +} + +void sub_80977E4(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_MARK_POKE); + gPokemonStorageSystemPtr->unk_12bc.markings = gPokemonStorageSystemPtr->unk_11f7; + sub_80F7418(gPokemonStorageSystemPtr->unk_11f7, 0xb0, 0x10); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!sub_80F7500()) + { + sub_80F7470(); + sub_8098A5C(); + sub_809BDD8(gPokemonStorageSystemPtr->unk_12bc.markings); + sub_809801C(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097858(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + party_compaction(); + sub_8099310(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (sub_8099374() == 0) + { + sub_80987DC(); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_809789C(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); + sub_809CE84(); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + switch (sub_809CF30()) + { + case -1: + case 0: + sub_809A860(TRUE); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 11: + PlaySE(SE_SELECT); + SetPSSCallback(sub_8097B44); + break; + case 10: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097974); + break; + case 9: + PlaySE(SE_SELECT); + sub_8098A5C(); + SetPSSCallback(sub_8097A64); + break; + } + break; + } +} + +void sub_8097974(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_8098A80(); + PrintStorageActionText(PC_TEXT_PICK_A_THEME); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + gPokemonStorageSystemPtr->unk_0d5e = sub_809CF30(); + switch (gPokemonStorageSystemPtr->unk_0d5e) + { + case -1: + sub_809A860(TRUE); + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 12 ... 15: + PlaySE(SE_SELECT); + gPokemonStorageSystemPtr->unk_0d5e -= 12; + sub_8098AA8(gPokemonStorageSystemPtr->unk_0d5e); + PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 2: + gPokemonStorageSystemPtr->unk_0d60 = sub_809CF30(); + switch (gPokemonStorageSystemPtr->unk_0d60) + { + case -1: + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004 = 0; + break; + case -2: + break; + default: + PlaySE(SE_SELECT); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0d60 -= 16; + sub_8099DCC(gPokemonStorageSystemPtr->unk_0d60); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + if (!sub_8099E08()) + { + sub_809A860(TRUE); + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097A64(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); + sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3); + sub_809634C(gPokemonStorage.currentBox); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + gPokemonStorageSystemPtr->unk_08b2 = sub_8096368(); + switch (gPokemonStorageSystemPtr->unk_08b2) + { + case 200: + break; + default: + sub_8098A5C(); + sub_809635C(); + sub_8096310(); + if (gPokemonStorageSystemPtr->unk_08b2 == 201 || gPokemonStorageSystemPtr->unk_08b2 == gPokemonStorage.currentBox) + { + sub_809A860(TRUE); + SetPSSCallback(sub_8096C84); + } + else + { + gPokemonStorageSystemPtr->unk_0004++; + } + break; + } + break; + case 2: + sub_8099C70(gPokemonStorageSystemPtr->unk_08b2); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 3: + if (!sub_8099D34()) + { + gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2; + SetPSSCallback(sub_8096C84); + } + break; + } +} + +void sub_8097B44(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + sub_809BB90(); + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 1: + if (!UpdatePaletteFade()) + { + gUnknown_0203847F = 1; + gPokemonStorageSystemPtr->unk_0006 = 1; + SetMainCallback2(sub_8096B5C); + } + break; + } +} + +void sub_8097BA0(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + if (sub_809BF20()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_EXIT_BOX); + sub_8098A38(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (Menu_ProcessInputNoWrap()) + { + case 1: + case -1: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case 0: + PlaySE(SE_PC_OFF); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 20; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (sub_80C5F98()) + { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; + } +} + +void sub_8097CC0(void) +{ + switch (gPokemonStorageSystemPtr->unk_0004) + { + case 0: + if (sub_809BF20()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + gPokemonStorageSystemPtr->unk_0004 = 1; + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_CONTINUE_BOX); + sub_8098A38(0); + gPokemonStorageSystemPtr->unk_0004 = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + } + break; + case 2: + switch (Menu_ProcessInputNoWrap()) + { + case 0: + sub_8098A5C(); + SetPSSCallback(sub_8096C84); + break; + case -1: + case 1: + PlaySE(SE_PC_OFF); + sub_8098A5C(); + gPokemonStorageSystemPtr->unk_0004++; + break; + } + break; + case 3: + gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e; + gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0; + gPokemonStorageSystemPtr->unk_000c.unk04 = 20; + gPokemonStorageSystemPtr->unk_000c.unk06 = 0; + sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c); + gPokemonStorageSystemPtr->unk_0004++; + break; + case 4: + if (sub_80C5F98()) + { + gPlayerPartyCount = CalculatePlayerPartyCount(); + SetMainCallback2(sub_80961A8); + } + break; + } +} + +void sub_8097DE0(void) +{ + gPokemonStorageSystemPtr->unk_0007 = 0; + gPokemonStorageSystemPtr->unk_0008 = 0; + gPokemonStorageSystemPtr->unk_000a = 0; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(30); + DmaCopy16Defvars(3, gPokemonStorageScrollingBGTile, BG_SCREEN_ADDR(28), sizeof gPokemonStorageScrollingBGTile); + LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, BG_SCREEN_ADDR(30)); + LoadPalette(gPokemonStorageScrollingBGPalette, 0xd0, 0x10); +} + +void sub_8097E44(void) +{ + if (++gPokemonStorageSystemPtr->unk_0007 >= 2) + { + gPokemonStorageSystemPtr->unk_0007 = 0; + gPokemonStorageSystemPtr->unk_0008--; + gPokemonStorageSystemPtr->unk_000a++; + } +} + +void sub_8097E70(void) +{ + LZ77UnCompVram(gPSSMenuHeader_Gfx, BG_SCREEN_ADDR(10)); + LZ77UnCompWram(gPSSMenuHeader_Tilemap, gUnknown_02039760); + sub_809D034(BG_SCREEN_ADDR(15), 0, 0, gUnknown_02039760, 0, 0, 10, 20); + LoadPalette(gPSSMenu1_Pal, 0x10, 0x20); + LoadPalette(gPSSMenu2_Pal, 0x00, 0x20); + LoadPalette(gUnknown_083B6D74, 0xB0, 0x20); + LoadPalette(gUnknown_083B6D94, 0xC0, 0x20); + LoadPalette(gUnknownPalette_81E6692 + 1, 0xF1, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 1, 0xF2, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 5, 0xF3, 0x02); + LoadPalette(gUnknownPalette_81E6692 + 12, 0xF4, 0x04); + LoadPalette(gUnknownPalette_81E6692 + 10, 0xF6, 0x04); + LoadPalette(gUnknownPalette_81E6692 + 2, 0xFF, 0x02); + LoadSpritePalette(&gWaveformSpritePalette); + sub_80980D4(); + sub_8097F58(); + sub_8097FB8(); + sub_809801C(); +} + +void sub_8097F58(void) +{ + gPokemonStorageSystemPtr->unk_12ac = sub_80F7940(0x000d, 0xdace, 0); + gPokemonStorageSystemPtr->unk_12ac->oam.priority = 0; + gPokemonStorageSystemPtr->unk_12ac->subpriority = 1; + gPokemonStorageSystemPtr->unk_12ac->pos1.x = 0x28; + gPokemonStorageSystemPtr->unk_12ac->pos1.y = 0x95; + gPokemonStorageSystemPtr->unk_12b8 = BG_CHAR_ADDR(4) + 32 * GetSpriteTileStartByTag(0x000d); +} + +const struct SpriteTemplate gSpriteTemplate_83B6EFC; + +void sub_8097FB8(void) +{ + u16 i; + struct SpriteSheet sheet = {WaveformTiles, 0x1c0, 0x0005}; + + LoadSpriteSheet(&sheet); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83B6EFC, i * 63 + 8, 9, 2); + gPokemonStorageSystemPtr->unk_12b0[i] = gSprites + spriteId; + } +} + +void sub_809801C(void) +{ + sub_80981F0(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec); + sub_80982B4(); + sub_8098350(); +} + +void BoxSetMosaic(void) +{ + sub_809801C(); + if (gPokemonStorageSystemPtr->unk_2700) + { + gPokemonStorageSystemPtr->unk_2700->oam.mosaic = TRUE; + gPokemonStorageSystemPtr->unk_2700->data[0] = 10; + gPokemonStorageSystemPtr->unk_2700->data[1] = 1; + gPokemonStorageSystemPtr->unk_2700->callback = sub_8098090; + REG_MOSAIC = (gPokemonStorageSystemPtr->unk_2700->data[0] << 12) | (gPokemonStorageSystemPtr->unk_2700->data[0] << 8); + } +} + +void sub_8098090(struct Sprite *sprite) +{ + sprite->data[0] -= sprite->data[1]; + if (sprite->data[0] < 0) + sprite->data[0] = 0; + REG_MOSAIC = (sprite->data[0] << 12) | (sprite->data[0] << 8); + if (sprite->data[0] == 0) + { + sprite->oam.mosaic = FALSE; + sprite->callback = SpriteCallbackDummy; + } +} + +// sub_80980D4 + +const struct OamData gOamData_83B6EAC; + +#ifdef NONMATCHING +void sub_80980D4(void) +{ + u16 i; + u16 tileStart; + u8 palSlot; + u8 spriteId; + struct SpriteSheet sheet = {gPokemonStorageSystemPtr->unk_2784, 0x800, 0x0002}; + struct SpritePalette palette = {gPokemonStorageSystemPtr->unk_2704, 0xdac7}; + struct SpriteTemplate template = { + 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy + }; + + for (i = 0; i < 0x800; i++) + gPokemonStorageSystemPtr->unk_2784[i] = 0; + for (i = 0; i < 0x10; i++) + gPokemonStorageSystemPtr->unk_2704[i] = 0; + + gPokemonStorageSystemPtr->unk_2700 = NULL; + if ((tileStart = LoadSpriteSheet(&sheet)) != 0 + && (palSlot = LoadSpritePalette(&palette)) != 0xff + && (spriteId = CreateSprite(&template, 0x28, 0x30, 0)) != MAX_SPRITES) + { + // FIXME this gets compiled as a separate block between the palSlot check and the spriteId check + gPokemonStorageSystemPtr->unk_2700 = gSprites + spriteId; + gPokemonStorageSystemPtr->unk_26fa = palSlot * 16 + 0x100; + gPokemonStorageSystemPtr->unk_26fc = BG_CHAR_ADDR(4) + tileStart * 32; + } + + if (gPokemonStorageSystemPtr->unk_2700 == NULL) + { + FreeSpriteTilesByTag(0x0002); + FreeSpritePaletteByTag(0xdac7); + } +} +#else + +const struct SpriteSheet gUnknown_083B6DCC = {ePokemonStorageSystem.unk_2784, 0x800, 0x0002}; +const struct SpritePalette gUnknown_083B6DD4 = {ePokemonStorageSystem.unk_2704, 0xdac7}; +const struct SpriteTemplate gSpriteTemplate_83B6DDC = { + 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +__attribute__((naked)) void sub_80980D4(void) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tsub sp, 0x28\n" + "\tldr r0, _08098150 @ =gUnknown_083B6DCC\n" + "\tldr r1, [r0, 0x4]\n" + "\tldr r0, [r0]\n" + "\tstr r0, [sp, 0x18]\n" + "\tstr r1, [sp, 0x1C]\n" + "\tldr r0, _08098154 @ =gUnknown_083B6DD4\n" + "\tldr r1, [r0, 0x4]\n" + "\tldr r0, [r0]\n" + "\tstr r0, [sp, 0x20]\n" + "\tstr r1, [sp, 0x24]\n" + "\tmov r1, sp\n" + "\tldr r0, _08098158 @ =gSpriteTemplate_83B6DDC\n" + "\tldm r0!, {r2-r4}\n" + "\tstm r1!, {r2-r4}\n" + "\tldm r0!, {r2-r4}\n" + "\tstm r1!, {r2-r4}\n" + "\tmovs r1, 0\n" + "\tadd r5, sp, 0x18\n" + "\tldr r4, _0809815C @ =gSharedMem + 0x2784\n" + "\tmovs r3, 0\n" + "\tldr r2, _08098160 @ =0x000007ff\n" + "_08098102:\n" + "\tadds r0, r1, r4\n" + "\tstrb r3, [r0]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, r2\n" + "\tbls _08098102\n" + "\tmovs r1, 0\n" + "\tldr r3, _08098164 @ =gSharedMem + 0x2704\n" + "\tmovs r2, 0\n" + "_08098116:\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r3\n" + "\tstrh r2, [r0]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0xF\n" + "\tbls _08098116\n" + "\tldr r0, _08098168 @ =gSharedMem\n" + "\tmovs r1, 0x9C\n" + "\tlsls r1, 6\n" + "\tadds r0, r1\n" + "\tmovs r1, 0\n" + "\tstr r1, [r0]\n" + "\tadds r0, r5, 0\n" + "\tbl LoadSpriteSheet\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0\n" + "\tbeq _080981C4\n" + "\tadd r0, sp, 0x20\n" + "\tbl LoadSpritePalette\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0xFF\n" + "\tbeq _080981C4\n" + "\tb _080981B0\n" + "\t.align 2, 0\n" + "_08098150: .4byte gUnknown_083B6DCC\n" + "_08098154: .4byte gUnknown_083B6DD4\n" + "_08098158: .4byte gSpriteTemplate_83B6DDC\n" + "_0809815C: .4byte gSharedMem + 0x2784\n" + "_08098160: .4byte 0x000007ff\n" + "_08098164: .4byte gSharedMem + 0x2704\n" + "_08098168: .4byte gSharedMem\n" + "_0809816C:\n" + "\tldr r2, _0809819C @ =gSharedMem\n" + "\tmovs r0, 0x9C\n" + "\tlsls r0, 6\n" + "\tadds r3, r2, r0\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _080981A0 @ =gSprites\n" + "\tadds r0, r1\n" + "\tstr r0, [r3]\n" + "\tlsls r0, r4, 4\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 1\n" + "\tadds r0, r1\n" + "\tldr r3, _080981A4 @ =0x000026fa\n" + "\tadds r1, r2, r3\n" + "\tstrh r0, [r1]\n" + "\tldr r4, _080981A8 @ =0x000026fc\n" + "\tadds r2, r4\n" + "\tlsls r0, r5, 5\n" + "\tldr r1, _080981AC @ =0x06010000\n" + "\tadds r0, r1\n" + "\tstr r0, [r2]\n" + "\tb _080981C4\n" + "\t.align 2, 0\n" + "_0809819C: .4byte gSharedMem\n" + "_080981A0: .4byte gSprites\n" + "_080981A4: .4byte 0x000026fa\n" + "_080981A8: .4byte 0x000026fc\n" + "_080981AC: .4byte 0x06010000\n" + "_080981B0:\n" + "\tmov r0, sp\n" + "\tmovs r1, 0x28\n" + "\tmovs r2, 0x30\n" + "\tmovs r3, 0\n" + "\tbl CreateSprite\n" + "\tlsls r0, 24\n" + "\tlsrs r1, r0, 24\n" + "\tcmp r1, 0x40\n" + "\tbne _0809816C\n" + "_080981C4:\n" + "\tldr r0, _080981E8 @ =gSharedMem\n" + "\tmovs r2, 0x9C\n" + "\tlsls r2, 6\n" + "\tadds r0, r2\n" + "\tldr r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080981DE\n" + "\tmovs r0, 0x2\n" + "\tbl FreeSpriteTilesByTag\n" + "\tldr r0, _080981EC @ =0x0000dac7\n" + "\tbl FreeSpritePaletteByTag\n" + "_080981DE:\n" + "\tadd sp, 0x28\n" + "\tpop {r4,r5}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080981E8: .4byte gSharedMem\n" + "_080981EC: .4byte 0x0000dac7"); +} +#endif + +void sub_80981F0(u16 species, u32 pid) +{ + if (gPokemonStorageSystemPtr->unk_2700) + { + if (species != SPECIES_NONE) + { + HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, 1, (intptr_t)gPokemonStorageSystemPtr->unk_4784, gPokemonStorageSystemPtr->unk_2784, species, pid); + LZ77UnCompWram(gPokemonStorageSystemPtr->unk_11e8, gPokemonStorageSystemPtr->unk_2704); + CpuCopy32(gPokemonStorageSystemPtr->unk_2784, gPokemonStorageSystemPtr->unk_26fc, 0x800); + LoadPalette(gPokemonStorageSystemPtr->unk_2704, gPokemonStorageSystemPtr->unk_26fa, 0x20); + gPokemonStorageSystemPtr->unk_2700->invisible = FALSE; + } + else + { + gPokemonStorageSystemPtr->unk_2700->invisible = TRUE; + } + } +} + +void sub_80982B4(void) +{ + if (gPokemonStorageSystemPtr->unk_11f0) + { + sub_80F7A10(gPokemonStorageSystemPtr->unk_11f7, gPokemonStorageSystemPtr->unk_12b8); + gPokemonStorageSystemPtr->unk_12ac->invisible = FALSE; + } + else + { + gPokemonStorageSystemPtr->unk_12ac->invisible = TRUE; + } + Menu_EraseWindowRect(0, 11, 9, 17); + Menu_PrintText(gPokemonStorageSystemPtr->unk_127a, 1, 16); + Menu_PrintText(gPokemonStorageSystemPtr->unk_120f, 1, 11); + Menu_PrintText(gPokemonStorageSystemPtr->unk_1234, 0, 13); + Menu_PrintText(gPokemonStorageSystemPtr->unk_1259, 1, 15); +} + +void sub_8098350(void) +{ + u16 i; + + if (gPokemonStorageSystemPtr->unk_11f0) + { + sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 1, 0, 8, 2); + for (i = 0; i < 2; i++) + StartSpriteAnimIfDifferent(gPokemonStorageSystemPtr->unk_12b0[i], i * 2 + 1); + } + else + { + sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 10, 0, 8, 2); + for (i = 0; i < 2; i++) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_12b0[i], i * 2); + } +} + +void sub_8098400(void) +{ + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(15); + LZ77UnCompVram(gPSSMenuMisc_Gfx, BG_SCREEN_ADDR(13)); + LZ77UnCompWram(gPSSMenuMisc_Tilemap, gPokemonStorageSystemPtr->unk_00a8); + LoadPalette(gPSSMenu3_Pal, 0x20, 0x20); + LoadPalette(gPSSMenu4_Pal, 0x30, 0x20); + DmaClear16(3, BG_SCREEN_ADDR(15), 0x800); + sub_8098780(); + if (gUnknown_0203847C) + { + sub_8098690(TRUE); + sub_8099200(TRUE); + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); + } + else + { + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 20, 12, 2); + sub_8098690(TRUE); + } + gPokemonStorageSystemPtr->unk_08af = 0; +} + +void sub_80984E8(void) +{ + gPokemonStorageSystemPtr->unk_08a8 = 20; + gPokemonStorageSystemPtr->unk_08aa = 2; + gPokemonStorageSystemPtr->unk_08ad = 0; + sub_8099200(FALSE); +} + +bool8 sub_8098520(void) +{ + if (gPokemonStorageSystemPtr->unk_08ad == 20) + return FALSE; + gPokemonStorageSystemPtr->unk_08a8--; + gPokemonStorageSystemPtr->unk_08aa++; + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa); + sub_80994A8(8); + if (++gPokemonStorageSystemPtr->unk_08ad == 20) + { + gUnknown_0203847C = 1; + return FALSE; + } + return TRUE; +} + +void add_to_c3_somehow(void) +{ + gPokemonStorageSystemPtr->unk_08a8 = 0; + gPokemonStorageSystemPtr->unk_08aa = 22; + gPokemonStorageSystemPtr->unk_08ad = 0; +} + +bool8 sub_80985CC(void) +{ + if (gPokemonStorageSystemPtr->unk_08ad == 20) + return FALSE; + gPokemonStorageSystemPtr->unk_08a8++; + gPokemonStorageSystemPtr->unk_08aa--; + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa); + sub_809D16C(BG_SCREEN_ADDR(15), 10, gPokemonStorageSystemPtr->unk_08aa, 12, 1); + sub_80994A8(-8); + if (++gPokemonStorageSystemPtr->unk_08ad == 20) + { + gUnknown_0203847C = 0; + sub_809954C(); + party_compaction(); + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 1, 2); + return FALSE; + } + return TRUE; +} + +void sub_8098690(bool8 flag) +{ + if (flag) + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 9, 2); + else + sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 2, 9, 2); +} + +void sub_80986E8(void) +{ + gPokemonStorageSystemPtr->unk_08af = 1; + gPokemonStorageSystemPtr->unk_08b0 = 30; + gPokemonStorageSystemPtr->unk_08b1 = 1; +} + +void sub_8098710(void) +{ + if (gPokemonStorageSystemPtr->unk_08af) + { + gPokemonStorageSystemPtr->unk_08af = 0; + sub_8098690(TRUE); + } +} + +void sub_8098734(void) +{ + if (gPokemonStorageSystemPtr->unk_08af && ++gPokemonStorageSystemPtr->unk_08b0 > 30) + { + gPokemonStorageSystemPtr->unk_08b0 = 0; + gPokemonStorageSystemPtr->unk_08b1 = gPokemonStorageSystemPtr->unk_08b1 ? FALSE : TRUE; + sub_8098690(gPokemonStorageSystemPtr->unk_08b1); + } +} + +void sub_8098780(void) +{ + int i; + + for (i = 1; i < PARTY_SIZE; i++) + { + u16 r1; + bool32 r0 = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); + if (r0) + r0 = TRUE; + r1 = r0 ? 12 : 16; + sub_809D104(gPokemonStorageSystemPtr->unk_00a8, 7, (i - 1) * 3 + 1, gPokemonStorageSystemPtr->unk_00a8, r1, 4, 4, 3); + } +} + +void sub_80987DC(void) +{ + sub_8098780(); + sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22); +} + +void sub_809880C(void) +{ + gPokemonStorageSystemPtr->unk_08ae = 0; + PlaySE(SE_WIN_OPEN); + sub_80984E8(); +} + +bool8 sub_8098830(void) +{ + switch (gPokemonStorageSystemPtr->unk_08ae) + { + case 0: + if (!sub_8098520()) + { + sub_809B068(); + gPokemonStorageSystemPtr->unk_08ae++; + } + break; + case 1: + if (!sub_809AC00()) + { + if (gPokemonStorageSystemPtr->unk_11f6) + BoxSetMosaic(); + gPokemonStorageSystemPtr->unk_08ae++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} + +const struct StorageAction gPCStorageActionTexts[] = +{ + {PCText_ExitBox, 0}, + {PCText_WhatYouDo, 0}, + {PCText_PickATheme, 0}, + {PCText_PickAWallpaper, 0}, + {PCText_IsSelected, 1}, + {PCText_JumpToWhichBox, 0}, + {PCText_DepositInWhichBox, 0}, + {PCText_WasDeposited, 1}, + {PCText_BoxIsFull, 0}, + {PCText_ReleasePoke, 0}, + {PCText_WasReleased, 4}, + {PCText_ByeBye, 6}, + {PCText_MarkPoke, 0}, + {PCText_LastPoke, 0}, + {PCText_PartyFull, 0}, + {PCText_HoldingPoke, 0}, + {PCText_WhichOneWillTake, 0}, + {PCText_CantReleaseEgg, 0}, + {PCText_ContinueBox, 0}, + {PCText_CameBack, 1}, + {PCText_Worried, 0}, + {PCText_Surprise, 0}, + {PCText_PleaseRemoveMail, 0} +}; + +void PrintStorageActionText(u8 index) +{ + u8 *ptr; + + Menu_DrawStdWindowFrame(10, 16, 29, 19); + + switch (gPCStorageActionTexts[index].format) + { + case PC_TEXT_FMT_UNK_02: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); + break; + case PC_TEXT_FMT_UNK_05: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_26e4); + break; + case PC_TEXT_FMT_MON_NAME: + // {var} + " is selected." + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_11fa); + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); + break; + case PC_TEXT_FMT_MON_NAME_2: + // {var} + " was released." + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_26e4); +#if ENGLISH + ptr = StringCopy(ptr, gPCStorageActionTexts[index].text); +#elif GERMAN + ptr = de_sub_8073174(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); +#endif + break; + case PC_TEXT_FMT_UNK_03: + { + const u8 *stringLength; + const u8 *text; + + text = gPCStorageActionTexts[index].text; + stringLength = &text[StringLength(text)] + 1; + + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa); + ptr = StringCopy(ptr, stringLength); + } + break; + case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK: + { + const u8 *stringLength; + const u8 *text; + + text = gPCStorageActionTexts[index].text; + stringLength = &text[StringLength(text)] - 1; + + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + ptr = StringCopy(ptr - 1, gPokemonStorageSystemPtr->unk_26e4); + ptr = StringCopy(ptr, stringLength); + } + break; + case PC_TEXT_FMT_NORMAL: + default: + ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text); + break; + } + + while (ptr < gPokemonStorageSystemPtr->unk_26a6) + { + ptr[0] = CHAR_SPACE; + ptr++; + } + + ptr[0] = EOS; + Menu_PrintText(gPokemonStorageSystemPtr->unk_2694, 11, 17); +} + +const struct OamData gOamData_83B6EAC = { + .size = 3 +}; + +const struct OamData gOamData_83B6EB4 = { + .shape = ST_OAM_H_RECTANGLE +}; + +const union AnimCmd gSpriteAnim_83B6EBC[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6EC4[] = { + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gSpriteAnim_83B6ED4[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83B6EDC[] = { + ANIMCMD_FRAME(10, 8), + ANIMCMD_FRAME( 4, 8), + ANIMCMD_FRAME(12, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gSpriteAnimTable_83B6EEC[] = { + gSpriteAnim_83B6EBC, + gSpriteAnim_83B6EC4, + gSpriteAnim_83B6ED4, + gSpriteAnim_83B6EDC +}; + +const struct SpriteTemplate gSpriteTemplate_83B6EFC = { + 0x0005, + 0xdacd, + &gOamData_83B6EB4, + gSpriteAnimTable_83B6EEC, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +void sub_8098A38(s8 a0) +{ + DisplayYesNoMenu(23, 10, 0); + Menu_MoveCursor(a0); +} + +void sub_8098A5C(void) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(10, 16, 29, 19); + Menu_EraseWindowRect(23, 10, 29, 15); +} + +void sub_8098A80(void) +{ + sub_809CDCC(); + sub_809CDEC(12); + sub_809CDEC(13); + sub_809CDEC(14); + sub_809CDEC(15); + sub_809CE84(); +} + +void sub_8098AA8(u8 a0) +{ + sub_809CDCC(); + switch (a0) + { + case 0: + sub_809CDEC(16); + sub_809CDEC(17); + sub_809CDEC(18); + sub_809CDEC(19); + break; + case 1: + sub_809CDEC(20); + sub_809CDEC(21); + sub_809CDEC(22); + sub_809CDEC(23); + break; + case 2: + sub_809CDEC(24); + sub_809CDEC(25); + sub_809CDEC(26); + sub_809CDEC(27); + break; + case 3: + sub_809CDEC(28); + sub_809CDEC(29); + sub_809CDEC(30); + sub_809CDEC(31); + break; + } + sub_809CE84(); +} diff --git a/src/pokemon_storage_system_3.c b/src/pokemon_storage_system_3.c new file mode 100644 index 000000000..da26c6fc5 --- /dev/null +++ b/src/pokemon_storage_system_3.c @@ -0,0 +1,655 @@ + +// Includes +#include "global.h" +#include "constants/species.h" +#include "sprite.h" +#include "trig.h" +#include "pokemon_icon.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +// Static ROM declarations + +static void sub_8098E68(struct Sprite *sprite); +static void sub_8099388(struct Sprite *sprite, u16 a1); +static void sub_80993F4(struct Sprite *sprite); +static void sub_80999C4(struct Sprite *sprite); +static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority); +static void PSS_DestroyMonIconSprite(struct Sprite *sprite); + +// .rodata + +const struct OamData gOamData_83B6F2C; + +// .text + +u8 get_preferred_box(void) +{ + return gPokemonStorage.currentBox; +} + +void ResetPSSMonIconSprites(void) +{ + u16 i; + + sub_809D51C(); + for (i = 0; i < 40; i++) + gPokemonStorageSystemPtr->unk_10d0[i] = 0; + for (i = 0; i < 40; i++) + gPokemonStorageSystemPtr->unk_1120[i] = 0; + for (i = 0; i < 6; i++) + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + for (i = 0; i < 30; i++) + gPokemonStorageSystemPtr->unk_1050[i] = NULL; + gPokemonStorageSystemPtr->unk_1034 = NULL; + gPokemonStorageSystemPtr->unk_0d5c = 0; +} + +void sub_8098BF0(void) +{ + u32 personality = GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1034 = PSS_SpawnMonIconSprite(GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_SPECIES2), personality, 0, 0, 1, 7); + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; +} + +void SpawnBoxIconSprites(u8 boxId) +{ + struct BoxPokemon *box = gPokemonStorage.boxes[boxId]; + u16 i; + u16 k = 0; + for (i = 0; i < 5; i++) + { + u16 j; + for (j = 0; j < 6; j++) + { + u16 species = GetBoxMonData(box, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + gPokemonStorageSystemPtr->unk_1050[k] = PSS_SpawnMonIconSprite(species, GetBoxMonData(box, MON_DATA_PERSONALITY), 24 * j + 0x64, 24 * i + 0x2c, 2, 18 - j); + else + gPokemonStorageSystemPtr->unk_1050[k] = NULL; + box++; + k++; + } + } +} + +void sub_8098D20(u8 monId) +{ + struct BoxPokemon *mon = gPokemonStorage.boxes[get_preferred_box()] + monId; + u16 species = GetBoxMonData(mon, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + s16 x = 24 * (monId % 6) + 0x64; + s16 y = 24 * (monId / 6) + 0x2c; + gPokemonStorageSystemPtr->unk_1050[monId] = PSS_SpawnMonIconSprite(species, GetBoxMonData(mon, MON_DATA_PERSONALITY), x, y, 2, 18 - (monId % 6)); + } +} + +static void sub_8098DE0(s16 a0) +{ + u16 monId; + for (monId = 0; monId < 30; monId++) + { + if (gPokemonStorageSystemPtr->unk_1050[monId]) + { + gPokemonStorageSystemPtr->unk_1050[monId]->data[2] = a0; + gPokemonStorageSystemPtr->unk_1050[monId]->data[4] = 1; + gPokemonStorageSystemPtr->unk_1050[monId]->callback = sub_8098E68; + } + } +} + +static void sub_8098E24(struct Sprite *sprite) +{ + if (sprite->data[1] != 0) + { + sprite->data[1]--; + sprite->pos1.x += sprite->data[2]; + } + else + { + gPokemonStorageSystemPtr->unk_1178--; + sprite->pos1.x = sprite->data[3]; + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_8098E68(struct Sprite *sprite) +{ + if (sprite->data[4] != 0) + { + sprite->data[4]--; + } + else + { + sprite->pos1.x += sprite->data[2]; + sprite->data[5] = sprite->pos1.x + sprite->pos2.x; + if (sprite->data[5] < 0x45 || sprite->data[5] > 0xfb) + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_8098EA0(u8 col) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (gPokemonStorageSystemPtr->unk_1050[col]) + { + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1050[col]); + gPokemonStorageSystemPtr->unk_1050[col] = NULL; + } + col += 6; + } +} + +static u8 sub_8098EE0(u8 col, u16 a1, s16 a2) +{ + u16 i; + u16 x; + u16 y; + u8 count; + u8 x1; + u16 curX; + + y = 0x2c; + x = 24 * col + 0x64; + curX = x - (a1 + 1) * a2; + x1 = 18 - col; + count = 0; + + for (i = 0; i < 5; i++) + { + u16 species = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_1050[col] = PSS_SpawnMonIconSprite(species, GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_PERSONALITY), curX, y, 2, x1); + if (gPokemonStorageSystemPtr->unk_1050[col]) + { + gPokemonStorageSystemPtr->unk_1050[col]->data[1] = a1; + gPokemonStorageSystemPtr->unk_1050[col]->data[2] = a2; + gPokemonStorageSystemPtr->unk_1050[col]->data[3] = x; + gPokemonStorageSystemPtr->unk_1050[col]->callback = sub_8098E24; + count++; + } + } + col += 6; + y += 24; + } + return count; +} + +void sub_809900C(u8 a0, s8 a1) +{ + gPokemonStorageSystemPtr->unk_117c = 0; + gPokemonStorageSystemPtr->unk_117d = a0; + gPokemonStorageSystemPtr->unk_117b = a1; + gPokemonStorageSystemPtr->unk_1172 = 32; + gPokemonStorageSystemPtr->unk_1176 = -6 * a1; + gPokemonStorageSystemPtr->unk_1178 = 0; + if (a1 > 0) + gPokemonStorageSystemPtr->unk_117a = 0; + else + gPokemonStorageSystemPtr->unk_117a = 5; + gPokemonStorageSystemPtr->unk_1174 = 24 * gPokemonStorageSystemPtr->unk_117a + 0x64; + sub_8098DE0(gPokemonStorageSystemPtr->unk_1176); +} + +bool8 sub_80990AC(void) +{ + if (gPokemonStorageSystemPtr->unk_1172) + gPokemonStorageSystemPtr->unk_1172--; + switch (gPokemonStorageSystemPtr->unk_117c) + { + case 0: + gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176; + if (gPokemonStorageSystemPtr->unk_1174 < 0x41 || gPokemonStorageSystemPtr->unk_1174 > 0xfb) + { + sub_8098EA0(gPokemonStorageSystemPtr->unk_117a); + gPokemonStorageSystemPtr->unk_1174 += 24 * gPokemonStorageSystemPtr->unk_117b; + gPokemonStorageSystemPtr->unk_117c++; + } + break; + case 1: + gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176; + gPokemonStorageSystemPtr->unk_1178 += sub_8098EE0(gPokemonStorageSystemPtr->unk_117a, gPokemonStorageSystemPtr->unk_1172, gPokemonStorageSystemPtr->unk_1176); + if ((gPokemonStorageSystemPtr->unk_117b > 0 && gPokemonStorageSystemPtr->unk_117a == 5) || (gPokemonStorageSystemPtr->unk_117b < 0 && gPokemonStorageSystemPtr->unk_117a == 0)) + { + gPokemonStorageSystemPtr->unk_117c++; + } + else + { + gPokemonStorageSystemPtr->unk_117a += gPokemonStorageSystemPtr->unk_117b; + gPokemonStorageSystemPtr->unk_117c = 0; + } + break; + case 2: + if (gPokemonStorageSystemPtr->unk_1178 == 0) + { + gPokemonStorageSystemPtr->unk_1172++; + return FALSE; + } + break; + default: + return FALSE; + } + return TRUE; +} + +void sub_8099200(bool8 a0) +{ + u16 count; + u16 i; + u16 species = GetMonData(gPlayerParty + 0, MON_DATA_SPECIES2); + u32 personality = GetMonData(gPlayerParty + 0, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1038[0] = PSS_SpawnMonIconSprite(species, personality, 0x68, 0x40, 1, 11); + count = 1; + for (i = 1; i < PARTY_SIZE; i++) + { + species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + personality = GetMonData(gPlayerParty + i, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_1038[i] = PSS_SpawnMonIconSprite(species, personality, 0x98, (i - 1) * 24 + 0x10, 1, 11); + count++; + } + else + { + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + } + } + if (!a0) + { + for (i = 0; i < count; i++) + { + // this routine assumes party_compaction has been called + gPokemonStorageSystemPtr->unk_1038[i]->pos1.y -= 0xa0; + gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE; + } + } +} + +void sub_8099310(void) +{ + u16 i; + u16 count; + + gPokemonStorageSystemPtr->unk_1171 = 0; + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + if (i != count) + { + sub_8099388(gPokemonStorageSystemPtr->unk_1038[i], count); + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + gPokemonStorageSystemPtr->unk_1171++; + } + count++; + } + } +} + +u8 sub_8099374(void) +{ + return gPokemonStorageSystemPtr->unk_1171; +} + +static void sub_8099388(struct Sprite *sprite, u16 a1) +{ + s16 r3; + s16 r4; + + sprite->data[1] = a1; + if (a1 == 0) + { + r3 = 0x68; + r4 = 0x40; + } + else + { + r3 = 0x98; + r4 = 24 * (a1 - 1) + 0x10; + } + sprite->data[2] = sprite->pos1.x << 3; + sprite->data[3] = sprite->pos1.y << 3; + sprite->data[4] = (r3 * 8 - sprite->data[2]) / 8; + sprite->data[5] = (r4 * 8 - sprite->data[3]) / 8; + sprite->data[6] = 8; + sprite->callback = sub_80993F4; +} + +static void sub_80993F4(struct Sprite *sprite) +{ + if (sprite->data[6]) + { + sprite->data[2] += sprite->data[4]; + sprite->data[3] += sprite->data[5]; + sprite->pos1.x = sprite->data[2] >> 3; + sprite->pos1.y = sprite->data[3] >> 3; + sprite->data[6]--; + } + else + { + if (sprite->data[1] == 0) + { + sprite->pos1.x = 0x68; + sprite->pos1.y = 0x40; + } + else + { + sprite->pos1.x = 0x98; + sprite->pos1.y = (sprite->data[1] - 1) * 24 + 0x10; + } + sprite->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1038[sprite->data[1]] = sprite; + gPokemonStorageSystemPtr->unk_1171--; + } +} + +void sub_8099480(void) +{ + if (gPokemonStorageSystemPtr->unk_1034) + { + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1034); + gPokemonStorageSystemPtr->unk_1034 = NULL; + } +} + +void sub_80994A8(s16 y) +{ + u16 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + s16 yy; + gPokemonStorageSystemPtr->unk_1038[i]->pos1.y += y; + yy = gPokemonStorageSystemPtr->unk_1038[i]->pos1.y + gPokemonStorageSystemPtr->unk_1038[i]->pos2.y + gPokemonStorageSystemPtr->unk_1038[i]->centerToCornerVecY; + if (yy < -0x10 || yy > 0xb0) + gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE; + else + gPokemonStorageSystemPtr->unk_1038[i]->invisible = FALSE; + } + } +} + +void sub_8099520(u8 a0) +{ + if (gPokemonStorageSystemPtr->unk_1038[a0]) + { + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[a0]); + gPokemonStorageSystemPtr->unk_1038[a0] = NULL; + } +} + +void sub_809954C(void) +{ + u16 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_1038[i]) + { + PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[i]); + gPokemonStorageSystemPtr->unk_1038[i] = NULL; + } + } +} + +void sub_8099584(u8 a0, u8 a1) +{ + if (a0 == 0) + { + gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1038[a1]; + gPokemonStorageSystemPtr->unk_1038[a1] = NULL; + } + else if (a0 == 1) + { + gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1050[a1]; + gPokemonStorageSystemPtr->unk_1050[a1] = NULL; + } + else + { + return; + } + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; + gPokemonStorageSystemPtr->unk_1034->oam.priority = 1; + gPokemonStorageSystemPtr->unk_1034->subpriority = 7; +} + +void sub_809960C(u8 a0, u8 a1) +{ + if (a0 == 14) + { + gPokemonStorageSystemPtr->unk_1038[a1] = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1038[a1]->oam.priority = 1; + gPokemonStorageSystemPtr->unk_1038[a1]->subpriority = 11; + } + else + { + gPokemonStorageSystemPtr->unk_1050[a1] = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1050[a1]->oam.priority = 2; + gPokemonStorageSystemPtr->unk_1050[a1]->subpriority = 18 - (a1 % 6); + } + gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1034 = NULL; +} + +void sub_80996B0(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1038 + a1; + else + gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1050 + a1; + gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy; + gPokemonStorageSystemPtr->unk_1170 = 0; +} + +bool8 sub_809971C(void) +{ + if (gPokemonStorageSystemPtr->unk_1170 == 16) + return FALSE; + gPokemonStorageSystemPtr->unk_1170++; + if (gPokemonStorageSystemPtr->unk_1170 & 1) + { + (*gPokemonStorageSystemPtr->unk_10c8)->pos1.y--; + gPokemonStorageSystemPtr->unk_1034->pos1.y++; + } + (*gPokemonStorageSystemPtr->unk_10c8)->pos2.x = gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16; + gPokemonStorageSystemPtr->unk_1034->pos2.x = -(gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16); + if (gPokemonStorageSystemPtr->unk_1170 == 8) + { + gPokemonStorageSystemPtr->unk_1034->oam.priority = (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority; + gPokemonStorageSystemPtr->unk_1034->subpriority = (*gPokemonStorageSystemPtr->unk_10c8)->subpriority; + (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority = 1; + (*gPokemonStorageSystemPtr->unk_10c8)->subpriority = 7; + } + if (gPokemonStorageSystemPtr->unk_1170 == 16) + { + struct Sprite *sprite = gPokemonStorageSystemPtr->unk_1034; + gPokemonStorageSystemPtr->unk_1034 = *(gPokemonStorageSystemPtr->unk_10c8); + (*gPokemonStorageSystemPtr->unk_10c8) = sprite; + gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4; + (*gPokemonStorageSystemPtr->unk_10c8)->callback = SpriteCallbackDummy; + } + return TRUE; +} + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[]; + +void sub_809981C(u8 mode, u8 idx) +{ + switch (mode) + { + case 0: + gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1038 + idx; + break; + case 1: + gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1050 + idx; + break; + case 2: + gPokemonStorageSystemPtr->unk_10cc = &gPokemonStorageSystemPtr->unk_1034; + break; + default: + return; + } + if (*gPokemonStorageSystemPtr->unk_10cc) + { + InitSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc); + (*gPokemonStorageSystemPtr->unk_10cc)->oam.affineMode = ST_OAM_AFFINE_NORMAL; + (*gPokemonStorageSystemPtr->unk_10cc)->affineAnims = gSpriteAffineAnimTable_83B6F5C; + StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 0); + } +} + +bool8 sub_80998D8(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc == NULL || (*gPokemonStorageSystemPtr->unk_10cc)->invisible) + return FALSE; + if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded) + { + (*gPokemonStorageSystemPtr->unk_10cc)->invisible = TRUE; + } + return TRUE; +} + +void sub_8099920(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc) + { + FreeOamMatrix((*gPokemonStorageSystemPtr->unk_10cc)->oam.matrixNum); + PSS_DestroyMonIconSprite(*gPokemonStorageSystemPtr->unk_10cc); + *gPokemonStorageSystemPtr->unk_10cc = NULL; + } +} + +void sub_8099958(void) +{ + if (*gPokemonStorageSystemPtr->unk_10cc) + { + (*gPokemonStorageSystemPtr->unk_10cc)->invisible = FALSE; + StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 1); + } +} + +bool8 sub_8099990(void) +{ + if (gPokemonStorageSystemPtr->unk_10cc == NULL) + return FALSE; + if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded) + gPokemonStorageSystemPtr->unk_10cc = NULL; + return TRUE; +} + +static void sub_80999C4(struct Sprite *sprite) +{ + sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x; + sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + gPokemonStorageSystemPtr->unk_11c0->pos2.y + 4; +} + +static u16 PSS_LoadSpeciesIconGfx(u16 a0) +{ + u16 i; + u16 retval; + + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == a0) + break; + } + if (i == 40) + { + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == 0) + break; + } + } + if (i != 40) + { + gPokemonStorageSystemPtr->unk_1120[i] = a0; + gPokemonStorageSystemPtr->unk_10d0[i]++; + retval = i * 16; + CpuCopy32(gMonIconTable[a0], BG_CHAR_ADDR(4) + 32 * retval, 0x200); + return retval; + } + return 0xFFFF; +} + +static void PSS_ForgetSpeciesIcon(u16 a0) +{ + u16 i; + + for (i = 0; i < 40; i++) + { + if (gPokemonStorageSystemPtr->unk_1120[i] == a0) + { + if (--gPokemonStorageSystemPtr->unk_10d0[i] == 0) + gPokemonStorageSystemPtr->unk_1120[i] = 0; + break; + } + } +} + +static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority) +{ + struct SpriteTemplate template = { + 0x000f, + 0xdac0, + &gOamData_83B6F2C, + gDummySpriteAnimTable, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy + }; + u16 tileNum; + u8 spriteId; + + species = mon_icon_convert_unown_species_id(species, personality); + template.paletteTag = 0xdac0 + gMonIconPaletteIndices[species]; + tileNum = PSS_LoadSpeciesIconGfx(species); + if (tileNum == 0xFFFF) + return NULL; + spriteId = CreateSprite(&template, x, y, subpriority); + if (spriteId == MAX_SPRITES) + { + PSS_ForgetSpeciesIcon(species); + return NULL; + } + gSprites[spriteId].oam.tileNum = tileNum; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = species; + return gSprites + spriteId; +} + +static void PSS_DestroyMonIconSprite(struct Sprite *sprite) +{ + PSS_ForgetSpeciesIcon(sprite->data[0]); + DestroySprite(sprite); +} + +const struct OamData gOamData_83B6F2C = { + .size = 2 +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = { + AFFINEANIMCMD_FRAME(-2, -2, 0, 120), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = { + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(16, 16, 0, 15), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = { + gSpriteAffineAnim_83B6F34, + gSpriteAffineAnim_83B6F44 +}; diff --git a/src/pokemon_storage_system_4.c b/src/pokemon_storage_system_4.c new file mode 100644 index 000000000..2f9f79a54 --- /dev/null +++ b/src/pokemon_storage_system_4.c @@ -0,0 +1,2849 @@ + +// Includes +#include "global.h" +#include "ewram.h" +#include "data2.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "palette.h" +#include "string_util.h" +#include "text.h" +#include "menu.h" +#include "item.h" +#include "pokemon_summary_screen.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +struct WallpaperTable { + const u8 *tiles; + u32 size; + const u8 *tileMap; + const u16 *palettes; +}; + +// Static RAM declarations + +EWRAM_DATA struct Pokemon gUnknown_02038480 = {}; +#if DEBUG +EWRAM_DATA u32 unk_2038790 = 0; +EWRAM_DATA u32 unk_2038794 = 0; +EWRAM_DATA u32 unk_2038798 = 0; +#endif +EWRAM_DATA s8 gUnknown_020384E4 = 0; +EWRAM_DATA s8 gUnknown_020384E5 = 0; +EWRAM_DATA bool8 gUnknown_020384E6 = FALSE; +EWRAM_DATA u8 gUnknown_020384E7 = 0; +EWRAM_DATA u8 gUnknown_020384E8 = 0; +EWRAM_DATA u8 gUnknown_020384E9 = 0; +EWRAM_DATA u8 gUnknown_020384EA = 0; + +// Static ROM declarations + +void sub_809900C(u8 boxId, s8 a1); +s8 sub_8099D90(u8 boxId); +void sub_8099EB0(u8 boxId, s8 a1); +void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3); +void sub_809A14C(u16 *vdest); +void sub_809A23C(u8 boxId); +void sub_809A3D0(u8 boxId, s8 a1); +void sub_809A598(void); +void sub_809A5E8(struct Sprite *sprite); +void sub_809A61C(struct Sprite *sprite); +void sub_809A654(void); +s16 sub_809A6D0(u8 width); +void sub_809A6DC(void); +void sub_809A774(s8 a0); +void sub_809A810(void); +void sub_809AFB8(void); +void sub_809A8C8(struct Sprite *sprite); +bool8 sub_809B150(void); +bool8 sub_809B1D8(void); +bool8 sub_809B24C(void); +bool8 sub_809B324(void); +bool8 sub_809B358(void); +void sub_809B384(void); +void sub_809B3E0(void); +void sub_809B44C(u8 a0, u8 a1); +void diegohint2(u8 a0, u8 a1); +void sub_809B548(u8 a0, u8 a1); +void diegohint1(u8 a0, u8 a1); +bool8 sub_809BF2C(void); +void sub_809BF74(void); +void sub_809C028(void); +void sub_809C04C(void *pokemon, u8 a1); +bool8 sub_809CAB0(void); +void sub_809CC04(void); +void sub_809CD88(void); +s8 sub_809CE4C(u8 a0); + +// .rodata + +const u16 gWallpaperPalettes_Forest[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Forest_2[] = INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal"); +const u16 gWallpaperPalettes_Forest_2_3[] = INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal"); + +const u8 gWallpaperTiles_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.4bpp.lz"); + +const u8 gWallpaperTilemap_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.bin.lz"); + +const u16 gWallpaperPalettes_City[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_City_2[] = INCBIN_U16("graphics/pokemon_storage/city_frame.gbapal"); +const u16 gWallpaperPalettes_City_2_3[] = INCBIN_U16("graphics/pokemon_storage/city_bg.gbapal"); + +const u8 gWallpaperTiles_City[] = INCBIN_U8("graphics/pokemon_storage/city.4bpp.lz"); + +const u8 gWallpaperTilemap_City[] = INCBIN_U8("graphics/pokemon_storage/city.bin.lz"); + +const u16 gWallpaperPalettes_Desert[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Desert_2[] = INCBIN_U16("graphics/pokemon_storage/desert_frame.gbapal"); +const u16 gWallpaperPalettes_Desert_2_3[] = INCBIN_U16("graphics/pokemon_storage/desert_bg.gbapal"); + +const u8 gWallpaperTiles_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.4bpp.lz"); + +const u8 gWallpaperTilemap_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.bin.lz"); + +const u16 gWallpaperPalettes_Savanna[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Savanna_2[] = INCBIN_U16("graphics/pokemon_storage/savanna_frame.gbapal"); +const u16 gWallpaperPalettes_Savanna_2_3[] = INCBIN_U16("graphics/pokemon_storage/savanna_bg.gbapal"); + +const u8 gWallpaperTiles_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.4bpp.lz"); + +const u8 gWallpaperTilemap_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.bin.lz"); + +const u16 gWallpaperPalettes_Crag[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Crag_2[] = INCBIN_U16("graphics/pokemon_storage/crag_frame.gbapal"); +const u16 gWallpaperPalettes_Crag_2_3[] = INCBIN_U16("graphics/pokemon_storage/crag_bg.gbapal"); + +const u8 gWallpaperTiles_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.4bpp.lz"); + +const u8 gWallpaperTilemap_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.bin.lz"); + +const u16 gWallpaperPalettes_Volcano[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Volcano_2[] = INCBIN_U16("graphics/pokemon_storage/volcano_frame.gbapal"); +const u16 gWallpaperPalettes_Volcano_2_3[] = INCBIN_U16("graphics/pokemon_storage/volcano_bg.gbapal"); + +const u8 gWallpaperTiles_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.4bpp.lz"); +const u32 filler_83b871c = 0; // needed to match but otherwise garbage + +const u8 gWallpaperTilemap_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.bin.lz"); + +const u16 gWallpaperPalettes_Snow[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Snow_2[] = INCBIN_U16("graphics/pokemon_storage/snow_frame.gbapal"); +const u16 gWallpaperPalettes_Snow_2_3[] = INCBIN_U16("graphics/pokemon_storage/snow_bg.gbapal"); + +const u8 gWallpaperTiles_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.4bpp.lz"); + +const u8 gWallpaperTilemap_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.bin.lz"); + +const u16 gWallpaperPalettes_Cave[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Cave_2[] = INCBIN_U16("graphics/pokemon_storage/cave_frame.gbapal"); +const u16 gWallpaperPalettes_Cave_2_3[] = INCBIN_U16("graphics/pokemon_storage/cave_bg.gbapal"); + +const u8 gWallpaperTiles_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.4bpp.lz"); + +const u8 gWallpaperTilemap_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.bin.lz"); + +const u16 gWallpaperPalettes_Beach[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Beach_2[] = INCBIN_U16("graphics/pokemon_storage/beach_frame.gbapal"); +const u16 gWallpaperPalettes_Beach_2_3[] = INCBIN_U16("graphics/pokemon_storage/beach_bg.gbapal"); + +const u8 gWallpaperTiles_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.4bpp.lz"); + +const u8 gWallpaperTilemap_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.bin.lz"); + +const u16 gWallpaperPalettes_Seafloor[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Seafloor_2[] = INCBIN_U16("graphics/pokemon_storage/seafloor_frame.gbapal"); +const u16 gWallpaperPalettes_Seafloor_2_3[] = INCBIN_U16("graphics/pokemon_storage/seafloor_bg.gbapal"); + +const u8 gWallpaperTiles_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.4bpp.lz"); + +const u8 gWallpaperTilemap_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.bin.lz"); + +const u16 gWallpaperPalettes_River[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_River_2[] = INCBIN_U16("graphics/pokemon_storage/river_frame.gbapal"); +const u16 gWallpaperPalettes_River_2_3[] = INCBIN_U16("graphics/pokemon_storage/river_bg.gbapal"); + +const u8 gWallpaperTiles_River[] = INCBIN_U8("graphics/pokemon_storage/river.4bpp.lz"); + +const u8 gWallpaperTilemap_River[] = INCBIN_U8("graphics/pokemon_storage/river.bin.lz"); + +const u16 gWallpaperPalettes_Sky[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal"); +const u16 gWallpaperPalettes_Sky_2[] = INCBIN_U16("graphics/pokemon_storage/sky_frame.gbapal"); +const u16 gWallpaperPalettes_Sky_2_3[] = INCBIN_U16("graphics/pokemon_storage/sky_bg.gbapal"); + +const u8 gWallpaperTiles_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.4bpp.lz"); + +const u8 gWallpaperTilemap_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.bin.lz"); + +const u16 gWallpaperPalettes_Polkadot[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal"); +const u16 gWallpaperPalettes_Polkadot_2[] = INCBIN_U16("graphics/pokemon_storage/polkadot_frame.gbapal"); +const u16 gWallpaperPalettes_Polkadot_2_3[] = INCBIN_U16("graphics/pokemon_storage/polkadot_bg.gbapal"); + +const u8 gWallpaperTiles_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.4bpp.lz"); + +const u8 gWallpaperTilemap_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.bin.lz"); + +const u16 gWallpaperPalettes_Pokecenter[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal"); +const u16 gWallpaperPalettes_Pokecenter_2[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_frame.gbapal"); +const u16 gWallpaperPalettes_Pokecenter_2_3[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_bg.gbapal"); + +const u8 gWallpaperTiles_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.4bpp.lz"); + +const u8 gWallpaperTilemap_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.bin.lz"); + +const u16 gWallpaperPalettes_Machine[] = INCBIN_U16("graphics/pokemon_storage/box_bg3.gbapal"); +const u16 gWallpaperPalettes_Machine_2[] = INCBIN_U16("graphics/pokemon_storage/machine_frame.gbapal"); +const u16 gWallpaperPalettes_Machine_2_3[] = INCBIN_U16("graphics/pokemon_storage/machine_bg.gbapal"); + +const u8 gWallpaperTiles_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.4bpp.lz"); + +const u8 gWallpaperTilemap_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.bin.lz"); + +const u16 gWallpaperPalettes_Plain[] = INCBIN_U16("graphics/pokemon_storage/box_bg4.gbapal"); +const u16 gWallpaperPalettes_Plain_2[] = INCBIN_U16("graphics/pokemon_storage/plain_frame.gbapal"); +const u16 gWallpaperPalettes_Plain_2_3[] = INCBIN_U16("graphics/pokemon_storage/plain_bg.gbapal"); + +const u8 gWallpaperTiles_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.4bpp.lz"); + +const u8 gWallpaperTilemap_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.bin.lz"); + +const u16 gUnknown_083BAEF8[] = INCBIN_U16("graphics/unused/tilemap_3BAEF8.bin"); + +const u16 gUnknown_083BB0A8[][2] = { + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF} +}; + +const struct WallpaperTable gWallpaperTable[] = { + {gWallpaperTiles_Forest, 0x3D0, gWallpaperTilemap_Forest, gWallpaperPalettes_Forest}, // Forest + {gWallpaperTiles_City, 0x208, gWallpaperTilemap_City, gWallpaperPalettes_City}, // City + {gWallpaperTiles_Desert, 0x2EC, gWallpaperTilemap_Desert, gWallpaperPalettes_Desert}, // Desert + {gWallpaperTiles_Savanna, 0x220, gWallpaperTilemap_Savanna, gWallpaperPalettes_Savanna}, // Savanna + {gWallpaperTiles_Crag, 0x350, gWallpaperTilemap_Crag, gWallpaperPalettes_Crag}, // Crag + {gWallpaperTiles_Volcano, 0x334, gWallpaperTilemap_Volcano, gWallpaperPalettes_Volcano}, // Volcano + {gWallpaperTiles_Snow, 0x2B8, gWallpaperTilemap_Snow, gWallpaperPalettes_Snow}, // Snow + {gWallpaperTiles_Cave, 0x344, gWallpaperTilemap_Cave, gWallpaperPalettes_Cave}, // Cave + {gWallpaperTiles_Beach, 0x384, gWallpaperTilemap_Beach, gWallpaperPalettes_Beach}, // Beach + {gWallpaperTiles_Seafloor, 0x2B4, gWallpaperTilemap_Seafloor, gWallpaperPalettes_Seafloor}, // Seafloor + {gWallpaperTiles_River, 0x294, gWallpaperTilemap_River, gWallpaperPalettes_River}, // River + {gWallpaperTiles_Sky, 0x298, gWallpaperTilemap_Sky, gWallpaperPalettes_Sky}, // Sky + {gWallpaperTiles_Polkadot, 0x1FC, gWallpaperTilemap_Polkadot, gWallpaperPalettes_Polkadot}, // Polkadot + {gWallpaperTiles_Pokecenter, 0x3A4, gWallpaperTilemap_Pokecenter, gWallpaperPalettes_Pokecenter}, // Pokecenter + {gWallpaperTiles_Machine, 0x2F0, gWallpaperTilemap_Machine, gWallpaperPalettes_Machine}, // Machine + {gWallpaperTiles_Plain, 0xFC, gWallpaperTilemap_Plain, gWallpaperPalettes_Plain} // Plain +}; + +const u16 PCPal_Arrow[] = INCBIN_U16("graphics/pokemon_storage/arrow.gbapal"); +const u8 PCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); + +const struct SpriteSheet gUnknown_083BB288 = {PCGfx_Arrow, 0x80, 6}; +const struct SpritePalette gUnknown_083BB290 = {PCPal_Arrow, 0xdacf}; + +const struct OamData gOamData_83BB298 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83BB2A0[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83BB2A8[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = { + gSpriteAnim_83BB2A0, + gSpriteAnim_83BB2A8 +}; + +const struct SpriteTemplate gSpriteTemplate_83BB2B8 = { + 3, + 0xdac8, + &gOamData_83BB298, + gSpriteAnimTable_83BB2B0, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_83BB2D0 = { + .shape = ST_OAM_V_RECTANGLE, + .priority = 2 +}; + +const union AnimCmd gSpriteAnim_83BB2D8[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_83BB2E0[] = { + ANIMCMD_FRAME(2, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_83BB2E8[] = { + gSpriteAnim_83BB2D8, + gSpriteAnim_83BB2E0 +}; + +const struct SpriteTemplate gSpriteTemplate_83BB2F0 = { + 6, + 0xdacf, + &gOamData_83BB2D0, + gSpriteAnimTable_83BB2E8, + NULL, + gDummySpriteAffineAnimTable, + sub_809A8C8 +}; + +const u16 HandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_pal.bin"); +const u16 HandCursorAltPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_alt_pal.bin"); +const u8 HandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp"); +const u8 HandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp"); + +bool8 (*const gUnknown_083BBBC8[])(void) = { + sub_809B150, + sub_809B1D8, + sub_809B24C +}; +// .text + +void sub_8099BF8(u8 boxId) +{ + gPokemonStorageSystemPtr->unk_08ba = FALSE; + gPokemonStorageSystemPtr->unk_08b4 = 0; + DmaFill32(3, 0, BG_SCREEN_ADDR(26), 0x1000); + sub_8099EB0(boxId, 0); + sub_809A23C(boxId); + sub_809A6DC(); + SpawnBoxIconSprites(boxId); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT512x256; +} + +void sub_8099C70(u8 whichBox) +{ + s8 r4 = sub_8099D90(whichBox); + sub_8099EB0(whichBox, r4); + gPokemonStorageSystemPtr->unk_08b6 = r4 * 6; + gPokemonStorageSystemPtr->unk_08b8 = 0x20; + gPokemonStorageSystemPtr->unk_08bb = whichBox; + gPokemonStorageSystemPtr->unk_08bc = r4 > 0 ? 0 : 5; + gPokemonStorageSystemPtr->unk_08be = r4; + gPokemonStorageSystemPtr->unk_08c0 = r4 > 0 ? 0x108 : 0x38; + gPokemonStorageSystemPtr->unk_08c2 = r4 > 0 ? 0 : 5; + gPokemonStorageSystemPtr->unk_08c4 = r4; + gPokemonStorageSystemPtr->unk_08c6 = 0; + gPokemonStorageSystemPtr->unk_08c8 = 2; + sub_809900C(whichBox, r4); + sub_809A3D0(whichBox, r4); + sub_809A774(r4); +} + +bool8 sub_8099D34(void) +{ + bool8 retVal = sub_80990AC(); + if (gPokemonStorageSystemPtr->unk_08b8 != 0) + { + gPokemonStorageSystemPtr->unk_08b4 += gPokemonStorageSystemPtr->unk_08b6; + gPokemonStorageSystemPtr->unk_08b4 &= 0x1ff; + if (--gPokemonStorageSystemPtr->unk_08b8 == 0) + { + sub_809A598(); + sub_809A810(); + } + return TRUE; + } + return retVal; +} + +s8 sub_8099D90(u8 boxId) +{ + u8 curBox = get_preferred_box(); + u8 i; + + for (i = 0; curBox != boxId; i++) + { + if (++curBox >= 14) + curBox = 0; + } + return i <= 6 ? 1 : -1; +} + +void sub_8099DCC(u8 wallpaperId) +{ + u8 curBox = get_preferred_box(); + gPokemonStorage.wallpaper[curBox] = wallpaperId; + gPokemonStorageSystemPtr->unk_1032 = 0; +} + +bool8 sub_8099E08(void) +{ + switch (gPokemonStorageSystemPtr->unk_1032) + { + case 0: + BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0, 0x10, 0xffff); + gPokemonStorageSystemPtr->unk_1032++; + break; + case 1: + if (!UpdatePaletteFade()) + { + u8 curBox = get_preferred_box(); + sub_8099EB0(curBox, 0); + sub_809A654(); + BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0x10, 0, 0xffff); + gPokemonStorageSystemPtr->unk_1032++; + } + break; + case 2: + if (!UpdatePaletteFade()) + gPokemonStorageSystemPtr->unk_1032++; + break; + case 3: + return FALSE; + } + return TRUE; +} + +void sub_8099EB0(u8 boxId, s8 a1) +{ + const struct WallpaperTable *wallpaperTable; + + if (a1) + { + gPokemonStorageSystemPtr->unk_08ba = gPokemonStorageSystemPtr->unk_08ba ? FALSE : TRUE; + sub_809A14C(BG_SCREEN_ADDR(26)); + } + wallpaperTable = gWallpaperTable +gPokemonStorage.wallpaper[boxId]; + LoadPalette(wallpaperTable->palettes, gPokemonStorageSystemPtr->unk_08ba * 0x30 + 0x40, 0x60); + LZ77UnCompWram(wallpaperTable->tileMap, gPokemonStorageSystemPtr->unk_0d62); + sub_8099F58(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba); + LZ77UnCompVram(wallpaperTable->tiles, BG_CHAR_ADDR(2) + (gPokemonStorageSystemPtr->unk_08ba << 13)); +} + +#ifdef NONMATCHING +void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) +{ + s16 r6; + s16 r3; + u16 sp0 = a3 << 8; + u16 sp4 = (a3 * 3 + 4) << 12; + u16 *r4; + u16 *r7; + u16 i; + u16 j; + s16 sp8 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 10 + a2 * 24) & 0x3f; + if (sp8 < 13) + { + r6 = 20; + r3 = 0; + r4 = vdest + sp8 + 0x40; + r7 = NULL; + } + else if (sp8 < 32) + { + r6 = 32 - sp8; + r3 = 20 - r6; + r4 = vdest + sp8 + 0x40; + r7 = vdest + 0x440; + } + else if (sp8 < 45) + { + r6 = 20; + r3 = 0; + r4 = vdest + sp8 + 0x420; + r7 = NULL; + } + else + { + r6 = 64 - sp8; + r3 = 20 - r6; + r4 = vdest + sp8 + 0x420; + r7 = vdest + 0x40; + } + for (i = 0; i < 18; i++) + { + for (j = 0; j < r6; j++) + { + u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); + r4[j] = tile; + src++; + } + for (j = 0; j < r3; j++) + { + u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4); + r7[j] = tile; + src++; + } + r4 += 0x20; + r7 += 0x20; + } + if (a2) + { + s16 r4_2; + u16 *r2; + if (a2 > 0) + r4_2 = (sp8 + 20) & 0x3f; + else + r4_2 = (sp8 - 4) & 0x3f; + r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; + for (i = 0; i < 4; i++) + { + for (j = 0; j < 18; j++) + { + *r2 = 0; + r2 += 0x20; + } + r4_2++; + r4_2 &= 0x3f; + r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420; + } + } +} +#else +__attribute__((naked)) void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x20\n" + "\tmov r9, r0\n" + "\tadds r5, r1, 0\n" + "\tlsls r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tlsls r0, r3, 8\n" + "\tstr r0, [sp]\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r3\n" + "\tadds r0, 0x4\n" + "\tlsls r0, 28\n" + "\tlsrs r0, 16\n" + "\tstr r0, [sp, 0x4]\n" + "\tldr r0, _08099FB8 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldr r1, _08099FBC @ =0x000008b4\n" + "\tadds r0, r1\n" + "\tldrh r1, [r0]\n" + "\tlsrs r1, 3\n" + "\tadds r1, 0xA\n" + "\tlsrs r0, r2, 24\n" + "\tmov r8, r0\n" + "\tasrs r2, 24\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, r2\n" + "\tlsls r0, 3\n" + "\tadds r1, r0\n" + "\tmovs r0, 0x3F\n" + "\tands r1, r0\n" + "\tstr r1, [sp, 0x8]\n" + "\tadds r2, r1, 0\n" + "\tcmp r2, 0xC\n" + "\tbgt _08099FC0\n" + "\tmovs r6, 0x14\n" + "\tmovs r3, 0\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, 0x80\n" + "\tmov r1, r9\n" + "\tadds r4, r1, r0\n" + "\tmovs r7, 0\n" + "\tb _0809A020\n" + "\t.align 2, 0\n" + "_08099FB8: .4byte gPokemonStorageSystemPtr\n" + "_08099FBC: .4byte 0x000008b4\n" + "_08099FC0:\n" + "\tcmp r2, 0x1F\n" + "\tbgt _08099FE6\n" + "\tmovs r0, 0x20\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tmovs r1, 0x14\n" + "\tlsrs r6, r0, 16\n" + "\tasrs r0, 16\n" + "\tsubs r1, r0\n" + "\tlsls r1, 16\n" + "\tlsrs r3, r1, 16\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, 0x80\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmovs r7, 0x88\n" + "\tlsls r7, 4\n" + "\tadd r7, r9\n" + "\tb _0809A020\n" + "_08099FE6:\n" + "\tcmp r2, 0x2C\n" + "\tbgt _08099FFE\n" + "\tmovs r6, 0x14\n" + "\tmovs r3, 0\n" + "\tlsls r0, r2, 1\n" + "\tmovs r1, 0x84\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmovs r7, 0\n" + "\tb _0809A020\n" + "_08099FFE:\n" + "\tmovs r0, 0x40\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tmovs r1, 0x14\n" + "\tlsrs r6, r0, 16\n" + "\tasrs r0, 16\n" + "\tsubs r1, r0\n" + "\tlsls r1, 16\n" + "\tlsrs r3, r1, 16\n" + "\tlsls r0, r2, 1\n" + "\tmovs r1, 0x84\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "\tmov r2, r9\n" + "\tadds r4, r2, r0\n" + "\tmov r7, r9\n" + "\tadds r7, 0x80\n" + "_0809A020:\n" + "\tmovs r1, 0\n" + "\tmov r0, r8\n" + "\tlsls r0, 24\n" + "\tstr r0, [sp, 0x14]\n" + "\tlsls r0, r6, 16\n" + "\tasrs r0, 16\n" + "\tmov r8, r0\n" + "\tlsls r3, 16\n" + "\tstr r3, [sp, 0xC]\n" + "\tasrs r2, r3, 16\n" + "\tstr r2, [sp, 0x10]\n" + "_0809A036:\n" + "\tmovs r3, 0\n" + "\tadds r0, r4, 0\n" + "\tadds r0, 0x40\n" + "\tstr r0, [sp, 0x18]\n" + "\tadds r2, r7, 0\n" + "\tadds r2, 0x40\n" + "\tstr r2, [sp, 0x1C]\n" + "\tadds r1, 0x1\n" + "\tmov r10, r1\n" + "\tcmp r3, r8\n" + "\tbge _0809A07A\n" + "\tldr r0, _0809A0D4 @ =0x00000fff\n" + "\tmov r12, r0\n" + "\tmovs r6, 0xF0\n" + "\tlsls r6, 8\n" + "_0809A054:\n" + "\tldrh r2, [r5]\n" + "\tmov r0, r12\n" + "\tands r0, r2\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, r0\n" + "\tadds r1, r6, 0\n" + "\tands r1, r2\n" + "\tldr r2, [sp, 0x4]\n" + "\tadds r1, r2, r1\n" + "\torrs r1, r0\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r4\n" + "\tstrh r1, [r0]\n" + "\tadds r5, 0x2\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, r8\n" + "\tblt _0809A054\n" + "_0809A07A:\n" + "\tmovs r3, 0\n" + "\tldr r0, [sp, 0x10]\n" + "\tcmp r3, r0\n" + "\tbge _0809A0B4\n" + "\tldr r1, _0809A0D4 @ =0x00000fff\n" + "\tmov r12, r1\n" + "\tmovs r6, 0xF0\n" + "\tlsls r6, 8\n" + "\tldr r2, [sp, 0xC]\n" + "\tasrs r4, r2, 16\n" + "_0809A08E:\n" + "\tldrh r2, [r5]\n" + "\tmov r0, r12\n" + "\tands r0, r2\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, r0\n" + "\tadds r1, r6, 0\n" + "\tands r1, r2\n" + "\tldr r2, [sp, 0x4]\n" + "\tadds r1, r2, r1\n" + "\torrs r1, r0\n" + "\tlsls r0, r3, 1\n" + "\tadds r0, r7\n" + "\tstrh r1, [r0]\n" + "\tadds r5, 0x2\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, r4\n" + "\tblt _0809A08E\n" + "_0809A0B4:\n" + "\tldr r4, [sp, 0x18]\n" + "\tldr r7, [sp, 0x1C]\n" + "\tmov r1, r10\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0x11\n" + "\tbls _0809A036\n" + "\tldr r0, [sp, 0x14]\n" + "\tasrs r2, r0, 24\n" + "\tcmp r2, 0\n" + "\tbeq _0809A13A\n" + "\tcmp r2, 0\n" + "\tble _0809A0D8\n" + "\tldr r1, [sp, 0x8]\n" + "\tadds r1, 0x14\n" + "\tb _0809A0DC\n" + "\t.align 2, 0\n" + "_0809A0D4: .4byte 0x00000fff\n" + "_0809A0D8:\n" + "\tldr r1, [sp, 0x8]\n" + "\tsubs r1, 0x4\n" + "_0809A0DC:\n" + "\tmovs r0, 0x3F\n" + "\tands r1, r0\n" + "\tadds r4, r1, 0\n" + "\tadds r0, r4, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A0EE\n" + "\tlsls r0, 1\n" + "\tadds r0, 0x80\n" + "\tb _0809A0F6\n" + "_0809A0EE:\n" + "\tlsls r0, 1\n" + "\tmovs r2, 0x84\n" + "\tlsls r2, 4\n" + "\tadds r0, r2\n" + "_0809A0F6:\n" + "\tmov r1, r9\n" + "\tadds r2, r1, r0\n" + "\tmovs r3, 0\n" + "\tmovs r6, 0\n" + "_0809A0FE:\n" + "\tmovs r1, 0\n" + "\tadds r5, r3, 0x1\n" + "\tlsls r3, r4, 16\n" + "_0809A104:\n" + "\tstrh r6, [r2]\n" + "\tadds r2, 0x40\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0x11\n" + "\tbls _0809A104\n" + "\tasrs r0, r3, 16\n" + "\tadds r4, r0, 0x1\n" + "\tmovs r0, 0x3F\n" + "\tands r4, r0\n" + "\tadds r0, r4, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A126\n" + "\tlsls r0, 1\n" + "\tadds r0, 0x80\n" + "\tb _0809A12E\n" + "_0809A126:\n" + "\tlsls r0, 1\n" + "\tmovs r2, 0x84\n" + "\tlsls r2, 4\n" + "\tadds r0, r2\n" + "_0809A12E:\n" + "\tmov r1, r9\n" + "\tadds r2, r1, r0\n" + "\tlsls r0, r5, 16\n" + "\tlsrs r3, r0, 16\n" + "\tcmp r3, 0x3\n" + "\tbls _0809A0FE\n" + "_0809A13A:\n" + "\tadd sp, 0x20\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +#ifdef NONMATCHING +void sub_809A14C(u16 *vdest) +{ + u16 *r2; + u16 i; + int r3 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 30) & 0x3f; + r2 = vdest + (r3 < 0x20 ? r3 + 0x260 : r3 + 0x640); + for (i = 0; i < 0x2b; i++) + { + *r2++ = 0; + r3++; + r3 &= 0x3f; + if (r3 == 0) + r2 -= 0x420; + if (r3 == 0x20) + r2 += 0x3e0; + } +} +#else +__attribute__((naked)) void sub_809A14C(u16 *vdest) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r2, r0, 0\n" + "\tldr r0, _0809A174 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldr r1, _0809A178 @ =0x000008b4\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0]\n" + "\tlsrs r0, 3\n" + "\tadds r3, r0, 0\n" + "\tadds r3, 0x1E\n" + "\tmovs r0, 0x3F\n" + "\tands r3, r0\n" + "\tadds r0, r3, 0\n" + "\tcmp r0, 0x1F\n" + "\tbgt _0809A17C\n" + "\tlsls r0, 1\n" + "\tmovs r6, 0x98\n" + "\tlsls r6, 3\n" + "\tadds r0, r6\n" + "\tb _0809A184\n" + "\t.align 2, 0\n" + "_0809A174: .4byte gPokemonStorageSystemPtr\n" + "_0809A178: .4byte 0x000008b4\n" + "_0809A17C:\n" + "\tlsls r0, 1\n" + "\tmovs r1, 0xC8\n" + "\tlsls r1, 4\n" + "\tadds r0, r1\n" + "_0809A184:\n" + "\tadds r2, r0\n" + "\tmovs r0, 0\n" + "\tmovs r5, 0\n" + "\tmovs r4, 0x3F\n" + "_0809A18C:\n" + "\tstrh r5, [r2]\n" + "\tadds r2, 0x2\n" + "\tadds r3, 0x1\n" + "\tands r3, r4\n" + "\tadds r1, r3, 0\n" + "\tcmp r1, 0\n" + "\tbne _0809A19E\n" + "\tldr r6, _0809A1B8 @ =0xfffff7c0\n" + "\tadds r2, r6\n" + "_0809A19E:\n" + "\tcmp r1, 0x20\n" + "\tbne _0809A1A8\n" + "\tmovs r1, 0xF8\n" + "\tlsls r1, 3\n" + "\tadds r2, r1\n" + "_0809A1A8:\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x2B\n" + "\tbls _0809A18C\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0809A1B8: .4byte 0xfffff7c0"); +} +#endif + +void sub_809A1BC(const u8 *a0, const u8 *text) +{ + u8 *r5 = gUnknown_083B6DB8; + DmaClear16(3, r5, 0x200); + Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, r5, text); + DmaCopy16(3, r5 + 0x000, a0 + 0x000, 0x80); + DmaCopy16(3, r5 + 0x100, a0 + 0x080, 0x80); + DmaCopy16(3, r5 + 0x080, a0 + 0x100, 0x80); + DmaCopy16(3, r5 + 0x180, a0 + 0x180, 0x80); +} + +const struct SpriteTemplate gSpriteTemplate_83BB2B8; + +void sub_809A23C(u8 boxId) +{ + u8 tagIdx; + s16 r6; + u16 i; + + struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3}; + struct SpritePalette palettes[] = { + {gPokemonStorageSystemPtr->unk_0ccc, 0xdac8}, + {gPokemonStorageSystemPtr->unk_0ccc, 0xdac9}, + {} + }; + + u16 wallpaper = gPokemonStorage.wallpaper[boxId]; + gPokemonStorageSystemPtr->unk_0ccc[14] = gUnknown_083BB0A8[wallpaper][0]; + gPokemonStorageSystemPtr->unk_0ccc[15] = gUnknown_083BB0A8[wallpaper][1]; + LoadSpritePalettes(palettes); + gPokemonStorageSystemPtr->unk_0d08 = 0x3f0; + tagIdx = IndexOfSpritePaletteTag(0xdac8); + gPokemonStorageSystemPtr->unk_0cec = 0x10e + 16 * tagIdx; + gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx; + tagIdx = IndexOfSpritePaletteTag(0xdac9); + gPokemonStorageSystemPtr->unk_0cee = 0x10e + 16 * tagIdx; + gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx; + sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]); + LoadSpriteSheet(&spriteSheet); + r6 = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId])); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2B8, r6 + i * 32, 0x1c, 23); + gPokemonStorageSystemPtr->unk_0cf0[i] = gSprites + spriteId; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf0[i], i); + } + gPokemonStorageSystemPtr->unk_0cca = 0; +} + +void sub_809A3D0(u8 boxId, s8 a1) +{ + u16 r8; + s16 x; + s16 x2; + u16 i; + struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3}; + struct SpriteTemplate template = gSpriteTemplate_83BB2B8; + + gPokemonStorageSystemPtr->unk_0cca = gPokemonStorageSystemPtr->unk_0cca ? FALSE : TRUE; + if (gPokemonStorageSystemPtr->unk_0cca == 0) + { + spriteSheet.tag = 3; + r8 = gPokemonStorageSystemPtr->unk_0cec; + } + else + { + spriteSheet.tag = 4; + r8 = gPokemonStorageSystemPtr->unk_0cec; + template.tileTag = 4; + template.paletteTag = 0xdac9; + } + sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]); + LoadSpriteSheet(&spriteSheet); + LoadPalette(gUnknown_083BB0A8[gPokemonStorage.wallpaper[boxId]], r8, 0x04); + x = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId])); + x2 = x + a1 * 192; + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&template, i * 32 + x2, 0x1c, 23); + gPokemonStorageSystemPtr->unk_0cf8[i] = gSprites + spriteId; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[0] = (-a1) * 6; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[1] = i * 32 + x; + gPokemonStorageSystemPtr->unk_0cf8[i]->data[2] = 1; + gPokemonStorageSystemPtr->unk_0cf8[i]->callback = sub_809A5E8; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf8[i], i); + gPokemonStorageSystemPtr->unk_0cf0[i]->data[0] = (-a1) * 6; + gPokemonStorageSystemPtr->unk_0cf0[i]->data[1] = 1; + gPokemonStorageSystemPtr->unk_0cf0[i]->callback = sub_809A61C; + } +} + +void sub_809A598(void) +{ + if (gPokemonStorageSystemPtr->unk_0cca == 0) + FreeSpriteTilesByTag(4); + else + FreeSpriteTilesByTag(3); + gPokemonStorageSystemPtr->unk_0cf0[0] = gPokemonStorageSystemPtr->unk_0cf8[0]; + gPokemonStorageSystemPtr->unk_0cf0[1] = gPokemonStorageSystemPtr->unk_0cf8[1]; +} + +void sub_809A5E8(struct Sprite *sprite) +{ + if (sprite->data[2]) + sprite->data[2]--; + else if ((sprite->pos1.x += sprite->data[0]) == sprite->data[1]) + sprite->callback = SpriteCallbackDummy; +} + +void sub_809A61C(struct Sprite *sprite) +{ + if (sprite->data[1]) + sprite->data[1]--; + else + { + sprite->pos1.x += sprite->data[0]; + sprite->data[2] = sprite->pos1.x + sprite->pos2.x; + if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100) + DestroySprite(sprite); + } +} + +void sub_809A654(void) +{ + u8 boxId = get_preferred_box(); + u8 wallpaperId = gPokemonStorage.wallpaper[boxId]; + if (gPokemonStorageSystemPtr->unk_0cca == 0) + CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cec, 4); + else + CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cee, 4); +} + +s16 sub_809A6D0(u8 width) +{ + return 0xb0 - width / 2; +} + +void sub_809A6DC(void) +{ + u16 i; + + LoadSpriteSheet(&gUnknown_083BB288); + LoadSpritePalette(&gUnknown_083BB290); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, 0x5c + i * 0x88, 0x1c, 21); + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = gSprites + spriteId; + StartSpriteAnim(sprite, i); + sprite->data[3] = (i == 0) ? -1 : 1; + gPokemonStorageSystemPtr->unk_0d00[i] = sprite; + } + } + if (sub_809BF2C()) + sub_809A860(TRUE); +} + +void sub_809A774(s8 a0) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 2; + } + if (a0 < 0) + { + gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 29; + gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 5; + gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0x48; + gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0x48; + } + else + { + gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 5; + gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 29; + gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0xF8; + gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0xF8; + } + gPokemonStorageSystemPtr->unk_0d00[0]->data[7] = 0; + gPokemonStorageSystemPtr->unk_0d00[1]->data[7] = 1; +} + +void sub_809A810(void) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->pos1.x = 0x88 * i + 0x5c; + gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->invisible = FALSE; + } + sub_809A860(TRUE); +} + +void sub_809A860(bool8 a0) +{ + u16 i; + if (a0) + { + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 1; + gPokemonStorageSystemPtr->unk_0d00[i]->data[1] = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[2] = 0; + gPokemonStorageSystemPtr->unk_0d00[i]->data[4] = 0; + } + } + else + { + for (i = 0; i < 2; i++) + { + gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 0; + } + } +} + +void sub_809A8C8(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos2.x = 0; + break; + case 1: + if (++sprite->data[1] > 3) + { + sprite->data[1] = 0; + sprite->pos2.x += sprite->data[3]; + if (++sprite->data[2] > 5) + { + sprite->data[2] = 0; + sprite->pos2.x = 0; + } + } + break; + case 2: + sprite->data[0] = 3; + break; + case 3: + sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6; + if (sprite->pos1.x < 0x49 || sprite->pos1.x > 0xf7) + sprite->invisible = TRUE; + if (--sprite->data[1] == 0) + { + sprite->pos1.x = sprite->data[2]; + sprite->invisible = FALSE; + sprite->data[0] = 4; + } + break; + case 4: + sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6; + break; + } +} + +struct Sprite *sub_809A9A0(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, x, y, subpriority); + if (spriteId == MAX_SPRITES) + return NULL; + animId %= 2; + StartSpriteAnim(gSprites + spriteId, animId); + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].callback = SpriteCallbackDummy; + return gSprites + spriteId; +} + +void sub_809AA24(void) +{ + if (gPokemonStorageSystemPtr->unk_0005 != 1) + gUnknown_020384E4 = 0; + else + gUnknown_020384E4 = 1; + gUnknown_020384E5 = 0; + gUnknown_020384E6 = FALSE; + gUnknown_020384E7 = 0; + gUnknown_020384E8 = 0; + gUnknown_020384E9 = 0; + sub_809B0D4(); + sub_809CC04(); + gPokemonStorageSystemPtr->unk_11e2 = 1; + sub_809BF74(); +} + +void sub_809AA98(void) +{ + sub_809CC04(); + sub_809C028(); + gPokemonStorageSystemPtr->unk_11e2 = 1; + if (gUnknown_020384E6) + sub_8098BF0(); +} + +void sub_809AACC(u8 a0, u8 a1, u16 *a2, u16 *a3) +{ + switch (a0) + { + case 0: + *a2 = (a1 % 6) * 24 + 100; + *a3 = (a1 / 6) * 24 + 32; + break; + case 1: + if (a1 == 0) + { + *a2 = 0x68; + *a3 = 0x34; + } + else if (a1 == 6) + { + *a2 = 0x98; + *a3 = 0x84; + } + else + { + *a2 = 0x98; + *a3 = (a1 - 1) * 24 + 4; + } + break; + case 2: + *a2 = 0xa2; + *a3 = 0x0c; + break; + case 3: + *a3 = gUnknown_020384E6 ? 8 : 14; + *a2 = a1 * 0x58 + 0x78; + break; + case 4: + *a2 = 0xa0; + *a3 = 0x60; + break; + } +} + +u16 sub_809AB8C(void) +{ + switch (gUnknown_020384E4) + { + case 1: + return GetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_SPECIES); + case 0: + return GetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_SPECIES); + default: + return SPECIES_NONE; + } +} + +bool8 sub_809AC00(void) +{ + s16 tmp; + if (gPokemonStorageSystemPtr->unk_11dc == 0) + return FALSE; + if (--gPokemonStorageSystemPtr->unk_11dc) + { + gPokemonStorageSystemPtr->unk_11c8 += gPokemonStorageSystemPtr->unk_11d0; + gPokemonStorageSystemPtr->unk_11cc += gPokemonStorageSystemPtr->unk_11d4; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11c8 >> 8; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11cc >> 8; + if (gPokemonStorageSystemPtr->unk_11c0->pos1.x > 0x100) + { + tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.x - 0x100; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = tmp + 0x40; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.x < 0x40) + { + tmp = 0x40 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + gPokemonStorageSystemPtr->unk_11c0->pos1.x = 0x100 - tmp; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.y > 0xb0) + { + tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.y - 0xb0; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = tmp - 0x10; + } + if (gPokemonStorageSystemPtr->unk_11c0->pos1.y < -0x10) + { + tmp = -0x10 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = 0xb0 - tmp; + } + if (gPokemonStorageSystemPtr->unk_11e3 && --gPokemonStorageSystemPtr->unk_11e3 == 0) + gPokemonStorageSystemPtr->unk_11c0->vFlip = gPokemonStorageSystemPtr->unk_11c0->vFlip ? FALSE : TRUE; + } + else + { + gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11d8; + gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11da; + sub_809AFB8(); + } + return TRUE; +} + +void sub_809AD3C(u8 a0, u8 a1) +{ + u16 x; + u16 y; + + sub_809AACC(a0, a1, &x, &y); + gPokemonStorageSystemPtr->unk_11e0 = a0; + gPokemonStorageSystemPtr->unk_11e1 = a1; + gPokemonStorageSystemPtr->unk_11d8 = x; + gPokemonStorageSystemPtr->unk_11da = y; +} + +void sub_809AD94(void) +{ + int r7; + int r0; + + if (gPokemonStorageSystemPtr->unk_11de || gPokemonStorageSystemPtr->unk_11df) + gPokemonStorageSystemPtr->unk_11dc = 12; + else + gPokemonStorageSystemPtr->unk_11dc = 6; + if (gPokemonStorageSystemPtr->unk_11e3) + gPokemonStorageSystemPtr->unk_11e3 = gPokemonStorageSystemPtr->unk_11dc >> 1; + switch (gPokemonStorageSystemPtr->unk_11de) + { + default: + r7 = gPokemonStorageSystemPtr->unk_11da - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + case -1: + r7 = gPokemonStorageSystemPtr->unk_11da - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + case 1: + r7 = gPokemonStorageSystemPtr->unk_11da + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y; + break; + } + switch (gPokemonStorageSystemPtr->unk_11df) + { + default: + r0 = gPokemonStorageSystemPtr->unk_11d8 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + case -1: + r0 = gPokemonStorageSystemPtr->unk_11d8 - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + case 1: + r0 = gPokemonStorageSystemPtr->unk_11d8 + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x; + break; + } + r7 <<= 8; + r0 <<= 8; + gPokemonStorageSystemPtr->unk_11d0 = r0 / gPokemonStorageSystemPtr->unk_11dc; + gPokemonStorageSystemPtr->unk_11d4 = r7 / gPokemonStorageSystemPtr->unk_11dc; + gPokemonStorageSystemPtr->unk_11c8 = gPokemonStorageSystemPtr->unk_11c0->pos1.x << 8; + gPokemonStorageSystemPtr->unk_11cc = gPokemonStorageSystemPtr->unk_11c0->pos1.y << 8; +} + +void sub_809AF18(u8 a0, u8 a1) +{ + sub_809AD3C(a0, a1); + sub_809AD94(); + if (!gUnknown_020384E6) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); + if (a0 == 1 && gUnknown_020384E4 != 1) + { + gPokemonStorageSystemPtr->unk_11e2 = a0; + gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE; + } + switch (a0) + { + case 0: + break; + case 1 ... 3: + gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE; + gPokemonStorageSystemPtr->unk_11c4->oam.priority = 1; + break; + } +} + +void sub_809AFB8(void) +{ + gUnknown_020384E4 = gPokemonStorageSystemPtr->unk_11e0; + gUnknown_020384E5 = gPokemonStorageSystemPtr->unk_11e1; + if (!gUnknown_020384E6) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + sub_809BF74(); + switch (gUnknown_020384E4) + { + case 2: + sub_809A860(TRUE); + break; + case 1: + gPokemonStorageSystemPtr->unk_11c4->subpriority = 12; + break; + case 0: + gPokemonStorageSystemPtr->unk_11c4->oam.priority = 2; + gPokemonStorageSystemPtr->unk_11c4->subpriority = 20; + gPokemonStorageSystemPtr->unk_11c4->invisible = FALSE; + break; + } +} + +void sub_809B068(void) +{ + u8 partyCount; + if (!gUnknown_020384E6) + partyCount = 0; + else + { + partyCount = CalculatePlayerPartyCount(); + if (partyCount > PARTY_SIZE - 1) + partyCount = PARTY_SIZE - 1; + } + if (gPokemonStorageSystemPtr->unk_11c0->vFlip) + gPokemonStorageSystemPtr->unk_11e3 = 1; + sub_809AF18(1, partyCount); +} + +void sub_809B0C0(u8 a0) +{ + sub_809AF18(0, a0); +} + +void sub_809B0D4(void) +{ + gUnknown_020384EA = 0; +} + +void sub_809B0E0(void) +{ + gUnknown_020384EA = gUnknown_020384E5; +} + +u8 sub_809B0F4(void) +{ + return gUnknown_020384EA; +} + +void sub_809B100(u8 a0) +{ + gPokemonStorageSystemPtr->unk_12a4 = gUnknown_083BBBC8[a0]; + gPokemonStorageSystemPtr->unk_12a8 = 0; +} + +bool8 sub_809B130(void) +{ + return gPokemonStorageSystemPtr->unk_12a4(); +} + +bool8 sub_809B150(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + if (gUnknown_020384E6) + return FALSE; + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 1: + if (!sub_809B324()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); + sub_809B384(); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + if (!sub_809B358()) + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 3: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B1D8(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + if (!sub_809B324()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + sub_809B3E0(); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 1: + if (!sub_809B358()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B24C(void) +{ + switch (gPokemonStorageSystemPtr->unk_12a8) + { + case 0: + switch (gUnknown_020384E4) + { + case 1: + gPokemonStorageSystemPtr->unk_12a9 = 14; + break; + case 0: + gPokemonStorageSystemPtr->unk_12a9 = get_preferred_box(); + break; + default: + return FALSE; + } + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2); + sub_80996B0(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5); + gPokemonStorageSystemPtr->unk_12a8++; + break; + case 1: + if (!sub_809971C()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); + diegohint1(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5); + gPokemonStorageSystemPtr->unk_12a8++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B324(void) +{ + switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y) + { + default: + gPokemonStorageSystemPtr->unk_11c0->pos2.y++; + break; + case 0: + gPokemonStorageSystemPtr->unk_11c0->pos2.y++; + break; + case 8: + return FALSE; + } + return TRUE; +} + +bool8 sub_809B358(void) +{ + switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y) + { + case 0: + return FALSE; + default: + gPokemonStorageSystemPtr->unk_11c0->pos2.y--; + break; + } + return TRUE; +} + +void sub_809B384(void) +{ + switch (gUnknown_020384E4) + { + case 1: + sub_809B44C(14, gUnknown_020384E5); + sub_8099584(0, gUnknown_020384E5); + break; + case 0: + sub_809B44C(get_preferred_box(), gUnknown_020384E5); + sub_8099584(1, gUnknown_020384E5); + break; + default: + return; + } + gUnknown_020384E6 = TRUE; +} + +void sub_809B3E0(void) +{ + u8 boxId; + switch (gUnknown_020384E4) + { + case 1: + diegohint2(14, gUnknown_020384E5); + sub_809960C(14, gUnknown_020384E5); + break; + case 0: + boxId = get_preferred_box(); + diegohint2(boxId, gUnknown_020384E5); + sub_809960C(boxId, gUnknown_020384E5); + break; + default: + return; + } + gUnknown_020384E6 = FALSE; +} + +void sub_809B440(void) +{ + sub_809BF74(); +} + +void sub_809B44C(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_25b4 = gPlayerParty[gUnknown_020384E5]; + else + ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_25b4); + sub_809B548(a0, a1); + gUnknown_020384E7 = a0; + gUnknown_020384E8 = a1; +} + +void diegohint2(u8 a0, u8 a1) +{ + if (a0 == 14) + { + gPlayerParty[a1] = gPokemonStorageSystemPtr->unk_25b4; + } + else + { + BoxMonRestorePP(&gPokemonStorageSystemPtr->unk_25b4.box); + gPokemonStorage.boxes[a0][a1] = gPokemonStorageSystemPtr->unk_25b4.box; + } +} + +void sub_809B548(u8 a0, u8 a1) +{ + if (a0 == 14) + ZeroMonData(gPlayerParty + a1); + else + ZeroBoxMonData(gPokemonStorage.boxes[a0] + a1); +} + +void diegohint1(u8 a0, u8 a1) +{ + if (a0 == 14) + gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[a1]; + else + ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_2618); + diegohint2(a0, a1); + gPokemonStorageSystemPtr->unk_25b4 = gPokemonStorageSystemPtr->unk_2618; + sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4, 0); + gUnknown_020384E7 = a0; + gUnknown_020384E8 = a1; +} + +bool8 sub_809B62C(u8 boxId) +{ + s16 monIdx = GetIndexOfFirstEmptySpaceInBoxN(boxId); + if (monIdx == -1) + return FALSE; + if (gUnknown_020384E6) + { + diegohint2(boxId, monIdx); + sub_8099480(); + gUnknown_020384E6 = FALSE; + } + else + { + sub_809B44C(14, gUnknown_020384E5); + diegohint2(boxId, monIdx); + sub_8099520(gUnknown_020384E5); + } + if (boxId == get_preferred_box()) + sub_8098D20(monIdx); + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1); + return TRUE; +} + +void sub_809B6BC(void) +{ + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + sub_809BF74(); +} + +void sub_809B6DC(void) +{ + u8 mode; + + if (gUnknown_020384E6) + mode = 2; + else if (gUnknown_020384E4 == 1) + mode = 0; + else + mode = 1; + sub_809981C(mode, gUnknown_020384E5); + StringCopy(gPokemonStorageSystemPtr->unk_26e4, gPokemonStorageSystemPtr->unk_11fa); +} + +bool8 sub_809B734(void) +{ + if (!sub_80998D8()) + { + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0); + return FALSE; + } + return TRUE; +} + +void sub_809B760(void) +{ + sub_8099920(); + if (gUnknown_020384E6) + gUnknown_020384E6 = FALSE; + else + { + u8 boxId; + if (gUnknown_020384E4 == 1) + boxId = 14; + else + boxId = get_preferred_box(); + sub_809B548(boxId, gUnknown_020384E5); + } + sub_809BF74(); +} + +void sub_809B7AC(void) +{ + if (gUnknown_020384E6) + StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3); +} + +void sub_809B7D4(void) +{ + u16 knownMoves; + if (gUnknown_020384E6) + { + gPokemonStorageSystemPtr->unk_2618 = gPokemonStorageSystemPtr->unk_25b4; + gPokemonStorageSystemPtr->unk_2682 = -1; + gPokemonStorageSystemPtr->unk_2683 = -1; + } + else + { + if (gUnknown_020384E4 == 1) + { + gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[gUnknown_020384E5]; + gPokemonStorageSystemPtr->unk_2682 = 14; + } + else + { + ExpandBoxMon(gPokemonStorage.boxes[gPokemonStorage.currentBox] + gUnknown_020384E5, &gPokemonStorageSystemPtr->unk_2618); + gPokemonStorageSystemPtr->unk_2682 = gPokemonStorage.currentBox; + } + gPokemonStorageSystemPtr->unk_2683 = gUnknown_020384E5; + } + gPokemonStorageSystemPtr->unk_267e = 0; + gPokemonStorageSystemPtr->unk_267f = 0; + gPokemonStorageSystemPtr->unk_2686[0] = MOVE_SURF; + gPokemonStorageSystemPtr->unk_2686[1] = MOVE_DIVE; + gPokemonStorageSystemPtr->unk_2686[2] = NUM_MOVES; + knownMoves = GetMonData(&gPokemonStorageSystemPtr->unk_2618, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + gPokemonStorageSystemPtr->unk_267e = knownMoves & 1; + gPokemonStorageSystemPtr->unk_267f = (knownMoves >> 1) & 1; + if (gPokemonStorageSystemPtr->unk_267e || gPokemonStorageSystemPtr->unk_267f) + gPokemonStorageSystemPtr->unk_267d = 0; + else + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + gPokemonStorageSystemPtr->unk_2684 = 0; +} + +s8 sub_809B960(void) +{ + u16 i; + u16 knownMoves; + + if (gPokemonStorageSystemPtr->unk_267d) + return gPokemonStorageSystemPtr->unk_267c; + switch (gPokemonStorageSystemPtr->unk_2684) + { + case 0: + for (i = 0; i < PARTY_SIZE; i++) + { + if (gPokemonStorageSystemPtr->unk_2682 != 14 || gPokemonStorageSystemPtr->unk_2683 != i) + { + knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + if (knownMoves & 1) + gPokemonStorageSystemPtr->unk_267e = 0; + if (knownMoves & 2) + gPokemonStorageSystemPtr->unk_267f = 0; + } + } + if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + else + { + gPokemonStorageSystemPtr->unk_2680 = 0; + gPokemonStorageSystemPtr->unk_2681 = 0; + gPokemonStorageSystemPtr->unk_2684++; + } + break; + case 1: + for (i = 0; i < 5; i++) + { + knownMoves = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_2680] + gPokemonStorageSystemPtr->unk_2681, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686); + if (knownMoves && (gPokemonStorageSystemPtr->unk_2682 != gPokemonStorageSystemPtr->unk_2680 || gPokemonStorageSystemPtr->unk_2683 != gPokemonStorageSystemPtr->unk_2681)) + { + if (knownMoves & 1) + gPokemonStorageSystemPtr->unk_267e = 0; + if (knownMoves & 2) + gPokemonStorageSystemPtr->unk_267f = 0; + } + if (++gPokemonStorageSystemPtr->unk_2681 >= 30) + { + gPokemonStorageSystemPtr->unk_2681 = 0; + if (++gPokemonStorageSystemPtr->unk_2680 >= 14) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 0; + break; + } + } + } + if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0) + { + gPokemonStorageSystemPtr->unk_267d = 1; + gPokemonStorageSystemPtr->unk_267c = 1; + } + break; + } + return -1; +} + +void sub_809BB90(void) +{ + if (gUnknown_020384E6) + gUnknown_02038480 = gPokemonStorageSystemPtr->unk_25b4; +} + +void sub_809BBC0(void) +{ + if (gUnknown_020384E6) + { + if (gUnknown_020384E7 == 14) + gPokemonStorageSystemPtr->unk_25b4 = gUnknown_02038480; + else + gPokemonStorageSystemPtr->unk_25b4.box = gUnknown_02038480.box; + } +} + +void sub_809BC18(void) +{ + if (gUnknown_020384E6) + { + sub_809BB90(); + gPokemonStorageSystemPtr->unk_2690.pokemon = &gUnknown_02038480; + gPokemonStorageSystemPtr->unk_268d = 0; + gPokemonStorageSystemPtr->unk_268c = 0; + gPokemonStorageSystemPtr->unk_268e = 0; + } + else if (gUnknown_020384E4 == 1) + { + gPokemonStorageSystemPtr->unk_2690.pokemon = gPlayerParty; + gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_268c = StorageSystemGetPartySize() - 1; + gPokemonStorageSystemPtr->unk_268e = 0; + } + else + { + gPokemonStorageSystemPtr->unk_2690.box = gPokemonStorage.boxes[gPokemonStorage.currentBox]; + gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_268c = 30 - 1; + gPokemonStorageSystemPtr->unk_268e = 5; + } +} + +void sub_809BD14(void) +{ + if (gUnknown_020384E6) + sub_809BBC0(); + else + gUnknown_020384E5 = pssData.monIndex; +} + +s16 party_compaction(void) +{ + s16 retVal = -1; + u16 i; + u16 last; + + for (i = 0, last = 0; i < PARTY_SIZE; i++) + { + if ((u16)GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != SPECIES_NONE) + { + if (i != last) + gPlayerParty[last] = gPlayerParty[i]; + last++; + } + else if (retVal == -1) + retVal = i; + } + for (; last < PARTY_SIZE; last++) + ZeroMonData(gPlayerParty + last); + return retVal; +} + +void sub_809BDD8(u8 markings) +{ + gPokemonStorageSystemPtr->unk_11f7 = markings; + if (gUnknown_020384E6) + SetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_MARKINGS, &markings); + else + { + if (gUnknown_020384E4 == 1) + SetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_MARKINGS, &markings); + if (gUnknown_020384E4 == 0) + SetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_MARKINGS, &markings); + } +} + +bool8 sub_809BE80(void) +{ + if (gUnknown_020384E4 == 1 && !gUnknown_020384E6 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0) + return TRUE; + return FALSE; +} + +bool8 sub_809BEBC(void) +{ + if (gUnknown_020384E6) + { + if (gUnknown_020384E4 == 1 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0) + { + if (gPokemonStorageSystemPtr->unk_11f9 || GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_HP) == 0) + return FALSE; + } + return TRUE; + } + return FALSE; +} + +bool8 sub_809BF20(void) +{ + return gUnknown_020384E6; +} + +bool8 sub_809BF2C(void) +{ + return gUnknown_020384E4 == 2 ? TRUE : FALSE; +} + +bool8 sub_809BF48(void) +{ + return (gUnknown_020384E4 == 3 && gUnknown_020384E5 == 1) ? TRUE : FALSE; +} + +void sub_809BF74(void) +{ + gPokemonStorageSystemPtr->unk_11f6 = gUnknown_020384E6 ? 0 : 1; + if (!gUnknown_020384E6) + { + switch (gUnknown_020384E4) + { + case 1: + if (gUnknown_020384E5 < PARTY_SIZE) + { + sub_809C04C(gPlayerParty + gUnknown_020384E5, 0); + break; + } + // fallthrough + case 2: + case 3: + sub_809C04C(NULL, 2); + break; + case 0: + sub_809C04C(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, 1); + break; + } + } +} + +void sub_809C028(void) +{ + if (gUnknown_020384E6) + sub_809C04C(&gUnknown_02038480.box, 0); + else + sub_809BF74(); +} + +void sub_809C04C(void *pokemon, u8 a1) +{ + u8 *buf; + u16 gender = MON_MALE; + gPokemonStorageSystemPtr->unk_11f2 = 0; + if (a1 == 0) + { + struct Pokemon *pkmn = (struct Pokemon *)pokemon; + gPokemonStorageSystemPtr->unk_11f0 = GetMonData(pokemon, MON_DATA_SPECIES2); + if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_11f9 = GetMonData(pkmn, MON_DATA_IS_EGG); + GetMonData(pkmn, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa); + StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_11f8 = GetMonData(pkmn, MON_DATA_LEVEL); + gPokemonStorageSystemPtr->unk_11f7 = GetMonData(pkmn, MON_DATA_MARKINGS); + gPokemonStorageSystemPtr->unk_11ec = GetMonData(pkmn, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePal(pkmn); + gender = GetMonGender(pkmn); + gPokemonStorageSystemPtr->unk_11f2 = GetMonData(pkmn, MON_DATA_HELD_ITEM); + } + } + else if (a1 == 1) + { + struct BoxPokemon *boxmon = (struct BoxPokemon *)pokemon; + gPokemonStorageSystemPtr->unk_11f0 = GetBoxMonData(pokemon, MON_DATA_SPECIES2); + if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE) + { + u32 otId = GetBoxMonData(boxmon, MON_DATA_OT_ID); + gPokemonStorageSystemPtr->unk_11f9 = GetBoxMonData(boxmon, MON_DATA_IS_EGG); + GetBoxMonData(boxmon, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa); + StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_11f8 = GetLevelFromBoxMonExp(boxmon); + gPokemonStorageSystemPtr->unk_11f7 = GetBoxMonData(boxmon, MON_DATA_MARKINGS); + gPokemonStorageSystemPtr->unk_11ec = GetBoxMonData(boxmon, MON_DATA_PERSONALITY); + gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePalFromOtIdPersonality(gPokemonStorageSystemPtr->unk_11f0, otId, gPokemonStorageSystemPtr->unk_11ec); + gender = GetGenderFromSpeciesAndPersonality(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec); + gPokemonStorageSystemPtr->unk_11f2 = GetBoxMonData(boxmon, MON_DATA_HELD_ITEM); + } + } + else + { + gPokemonStorageSystemPtr->unk_11f0 = SPECIES_NONE; + } + if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NONE) + { + gPokemonStorageSystemPtr->unk_11fa[0] = EOS; + gPokemonStorageSystemPtr->unk_120f[0] = EOS; + gPokemonStorageSystemPtr->unk_1234[0] = EOS; + gPokemonStorageSystemPtr->unk_1259[0] = EOS; + gPokemonStorageSystemPtr->unk_127a[0] = EOS; + } + else if (gPokemonStorageSystemPtr->unk_11f9) + { + buf = gPokemonStorageSystemPtr->unk_120f; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_120f + 5; + buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa); + gPokemonStorageSystemPtr->unk_1234[0] = EOS; + gPokemonStorageSystemPtr->unk_1259[0] = EOS; + gPokemonStorageSystemPtr->unk_127a[0] = EOS; + } + else + { + if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_M || gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_F) + gender = MON_GENDERLESS; + buf = gPokemonStorageSystemPtr->unk_120f; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_120f + 5; + buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa); + buf = gPokemonStorageSystemPtr->unk_1234; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf[5] = EXT_CTRL_CODE_BEGIN; + buf[6] = 0x13; // CLEAR_TO + buf[7] = 7; + buf[8] = CHAR_SLASH; + buf = gPokemonStorageSystemPtr->unk_1234 + 9; + buf = StringCopy(buf, gSpeciesNames[gPokemonStorageSystemPtr->unk_11f0]); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x13; // CLEAR_TO + buf[2] = 0x50; + buf[3] = EOS; + buf = gPokemonStorageSystemPtr->unk_1259; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf[5] = EXT_CTRL_CODE_BEGIN; + buf[6] = 0x13; // CLEAR_TO + buf[7] = 8; + buf = gPokemonStorageSystemPtr->unk_1259 + 8; + buf[0] = 0x34; // LV + buf = gPokemonStorageSystemPtr->unk_1259 + 9; + buf = sub_8072C14(buf, gPokemonStorageSystemPtr->unk_11f8, 0x22, STR_CONV_MODE_RIGHT_ALIGN); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x11; // CLEAR + buf[2] = 8; + buf += 3; + switch (gender) + { + case MON_MALE: + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x04; // BLUE + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x05; // YELLOW + buf[5] = CHAR_MALE; + buf += 6; + break; + case MON_FEMALE: + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x06; // CYAN + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x07; // MAGENTA + buf[5] = CHAR_FEMALE; + buf += 6; + break; + } + buf[0] = EOS; + buf = gPokemonStorageSystemPtr->unk_127a; + if (gPokemonStorageSystemPtr->unk_11f2) + { + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW + buf[2] = 0x0F; // WHITE2 + buf[3] = 0x00; // TRANSPARENT + buf[4] = 0x01; // DARK_GREY + buf = gPokemonStorageSystemPtr->unk_127a + 5; + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x06; // size + buf[2] = 0x04; + buf = gPokemonStorageSystemPtr->unk_127a + 8; + buf = StringCopy(buf, ItemId_GetName(gPokemonStorageSystemPtr->unk_11f2)); + buf[0] = EXT_CTRL_CODE_BEGIN; + buf[1] = 0x07; // UNKNOWN_7; + buf += 2; + } + buf[0] = EOS; + } +} + +#ifdef NONMATCHING +u8 sub_809C464(void) +{ + u8 r9; + s8 r8 = gUnknown_020384E4; + s8 r4 = gUnknown_020384E5; + gPokemonStorageSystemPtr->unk_11de = 0; + gPokemonStorageSystemPtr->unk_11df = 0; + gPokemonStorageSystemPtr->unk_11e3 = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + r9 = 1; + if (gUnknown_020384E5 >= 6) + { + r4 -= 6; + } + else + { + r8 = 2; + r4 = 0; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + r9 = 1; + r4 += 6; + if (r4 >= 30) + { + r8 = 3; + r4 -= 30; + r4 /= 3; + gPokemonStorageSystemPtr->unk_11de = 1; + gPokemonStorageSystemPtr->unk_11e3 = 1; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + r9 = 1; + if (gUnknown_020384E5 % 6) + r4--; + else + { + gPokemonStorageSystemPtr->unk_11df = -1; + r4 += 5; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + r9 = 1; + if ((gUnknown_020384E5 + 1) % 6) + r4++; + else + { + gPokemonStorageSystemPtr->unk_11df = 1; + r4 -= 5; + } + } + else if (gMain.newKeys & START_BUTTON) + { + r9 = 1; + r8 = 2; + r4 = 0; + } + else + { + if ((gMain.newKeys & A_BUTTON) && sub_809CAB0()) + { + if (gUnknown_020384E9 == 0) + return 8; + switch (sub_809CE4C(0)) + { + case 1: + return 11; + case 2: + return 12; + case 3: + return 13; + case 4: + return 14; + case 5: + return 15; + } + } + if (gMain.newKeys & B_BUTTON) + return 16; + if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.heldKeys & L_BUTTON) + return 10; + if (gMain.heldKeys & R_BUTTON) + return 9; + } + if (gMain.newKeys & SELECT_BUTTON) + { + sub_809CD88(); + return 0; + } + r9 = 0; + } + if (r9) + sub_809AF18(r8, r4); + return r9; +} +#else +__attribute__((naked)) u8 sub_809C464(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tldr r0, _0809C4D8 @ =gUnknown_020384E4\n" + "\tldrb r0, [r0]\n" + "\tmov r8, r0\n" + "\tldr r2, _0809C4DC @ =gUnknown_020384E5\n" + "\tldrb r4, [r2]\n" + "\tldr r0, _0809C4E0 @ =gPokemonStorageSystemPtr\n" + "\tldr r1, [r0]\n" + "\tldr r0, _0809C4E4 @ =0x000011de\n" + "\tadds r7, r1, r0\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r7]\n" + "\tldr r3, _0809C4E8 @ =0x000011df\n" + "\tadds r5, r1, r3\n" + "\tstrb r0, [r5]\n" + "\tadds r3, 0x4\n" + "\tadds r6, r1, r3\n" + "\tstrb r0, [r6]\n" + "\tldr r0, _0809C4EC @ =gMain\n" + "\tmov r12, r0\n" + "\tldrh r1, [r0, 0x30]\n" + "\tmovs r0, 0x40\n" + "\tands r0, r1\n" + "\tadds r3, r2, 0\n" + "\tcmp r0, 0\n" + "\tbeq _0809C4A0\n" + "\tb _0809C62A\n" + "_0809C4A0:\n" + "\tmovs r0, 0x80\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C4F0\n" + "\tmovs r1, 0x1\n" + "\tmov r9, r1\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xC0\n" + "\tlsls r3, 19\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x1D\n" + "\tbgt _0809C4BE\n" + "\tb _0809C648\n" + "_0809C4BE:\n" + "\tmovs r1, 0x3\n" + "\tmov r8, r1\n" + "\tsubs r0, 0x1E\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tbl __divsi3\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tmov r3, r9\n" + "\tstrb r3, [r7]\n" + "\tstrb r3, [r6]\n" + "\tb _0809C648\n" + "\t.align 2, 0\n" + "_0809C4D8: .4byte gUnknown_020384E4\n" + "_0809C4DC: .4byte gUnknown_020384E5\n" + "_0809C4E0: .4byte gPokemonStorageSystemPtr\n" + "_0809C4E4: .4byte 0x000011de\n" + "_0809C4E8: .4byte 0x000011df\n" + "_0809C4EC: .4byte gMain\n" + "_0809C4F0:\n" + "\tmovs r0, 0x20\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C524\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r3, r0]\n" + "\tmovs r1, 0x6\n" + "\tbl __modsi3\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C514\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFF\n" + "\tlsls r1, 24\n" + "\tb _0809C63C\n" + "_0809C514:\n" + "\tmovs r0, 0xFF\n" + "\tstrb r0, [r5]\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xA0\n" + "\tlsls r3, 19\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tb _0809C648\n" + "_0809C524:\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C554\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r3, r0]\n" + "\tadds r0, 0x1\n" + "\tmovs r1, 0x6\n" + "\tbl __modsi3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C548\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 17\n" + "\tb _0809C63C\n" + "_0809C548:\n" + "\tmov r3, r9\n" + "\tstrb r3, [r5]\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFB\n" + "\tlsls r1, 24\n" + "\tb _0809C63C\n" + "_0809C554:\n" + "\tmov r3, r12\n" + "\tldrh r1, [r3, 0x2E]\n" + "\tmovs r0, 0x8\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C56A\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r1, 0x2\n" + "\tmov r8, r1\n" + "\tb _0809C646\n" + "_0809C56A:\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5D4\n" + "\tbl sub_809CAB0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5D4\n" + "\tldr r0, _0809C588 @ =gUnknown_020384E9\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C58C\n" + "\tmovs r0, 0x8\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C588: .4byte gUnknown_020384E9\n" + "_0809C58C:\n" + "\tmovs r0, 0\n" + "\tbl sub_809CE4C\n" + "\tsubs r0, 0x1\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x4\n" + "\tbhi _0809C5D4\n" + "\tlsls r0, 2\n" + "\tldr r1, _0809C5A8 @ =_0809C5AC\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0809C5A8: .4byte _0809C5AC\n" + "\t.align 2, 0\n" + "_0809C5AC:\n" + "\t.4byte _0809C5C0\n" + "\t.4byte _0809C5C4\n" + "\t.4byte _0809C5C8\n" + "\t.4byte _0809C5CC\n" + "\t.4byte _0809C5D0\n" + "_0809C5C0:\n" + "\tmovs r0, 0xB\n" + "\tb _0809C658\n" + "_0809C5C4:\n" + "\tmovs r0, 0xC\n" + "\tb _0809C658\n" + "_0809C5C8:\n" + "\tmovs r0, 0xD\n" + "\tb _0809C658\n" + "_0809C5CC:\n" + "\tmovs r0, 0xE\n" + "\tb _0809C658\n" + "_0809C5D0:\n" + "\tmovs r0, 0xF\n" + "\tb _0809C658\n" + "_0809C5D4:\n" + "\tldr r2, _0809C5E4 @ =gMain\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C5E8\n" + "\tmovs r0, 0x10\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C5E4: .4byte gMain\n" + "_0809C5E8:\n" + "\tldr r0, _0809C600 @ =gSaveBlock2\n" + "\tldrb r0, [r0, 0x13]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C612\n" + "\tldrh r1, [r2, 0x2C]\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C604\n" + "\tmovs r0, 0xA\n" + "\tb _0809C658\n" + "\t.align 2, 0\n" + "_0809C600: .4byte gSaveBlock2\n" + "_0809C604:\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C612\n" + "\tmovs r0, 0x9\n" + "\tb _0809C658\n" + "_0809C612:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C624\n" + "\tbl sub_809CD88\n" + "\tmovs r0, 0\n" + "\tb _0809C658\n" + "_0809C624:\n" + "\tmovs r3, 0\n" + "\tmov r9, r3\n" + "\tb _0809C656\n" + "_0809C62A:\n" + "\tmovs r0, 0x1\n" + "\tmov r9, r0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r2, r0]\n" + "\tcmp r0, 0x5\n" + "\tble _0809C642\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0xFA\n" + "\tlsls r1, 24\n" + "_0809C63C:\n" + "\tadds r0, r1\n" + "\tlsrs r4, r0, 24\n" + "\tb _0809C648\n" + "_0809C642:\n" + "\tmovs r3, 0x2\n" + "\tmov r8, r3\n" + "_0809C646:\n" + "\tmovs r4, 0\n" + "_0809C648:\n" + "\tmov r0, r9\n" + "\tcmp r0, 0\n" + "\tbeq _0809C656\n" + "\tmov r0, r8\n" + "\tadds r1, r4, 0\n" + "\tbl sub_809AF18\n" + "_0809C656:\n" + "\tmov r0, r9\n" + "_0809C658:\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +#ifdef NONMATCHING +u8 sub_809C664(void) +{ + s8 r10 = gUnknown_020384E4; + s8 r4 = gUnknown_020384E5; + u8 r8; + u8 r9; + + gPokemonStorageSystemPtr->unk_11df = 0; + gPokemonStorageSystemPtr->unk_11de = 0; + gPokemonStorageSystemPtr->unk_11e3 = 0; + r9 = FALSE; + r8 = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (--r4 < 0) + r4 = 6; + if (r4 != gUnknown_020384E5) + r8 = 1; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (++r4 > 6) + r4 = 0; + if (r4 != gUnknown_020384E5) + r8 = 1; + } + else if ((gMain.newAndRepeatedKeys & DPAD_LEFT) && gUnknown_020384E5) + { + r8 = 1; + gPokemonStorageSystemPtr->unk_11e2 = gUnknown_020384E5; + r4 = 0; + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gUnknown_020384E5 == 0) + { + r8 = 1; + r4 = gPokemonStorageSystemPtr->unk_11e2; + } + else + { + r8 = 6; + r10 = 0; + r4 = 0; + } + } + else + { + if (gMain.newKeys & A_BUTTON) + { + if (gUnknown_020384E5 == 6) + { + if (gPokemonStorageSystemPtr->unk_0005 == 1) + return 4; + r9 = TRUE; + } + else if (sub_809CAB0()) + { + if (gUnknown_020384E9 == 0) + return 8; + switch (sub_809CE4C(0)) + { + case 1: + return 11; + case 2: + return 12; + case 3: + return 13; + case 4: + return 14; + case 5: + return 15; + } + } + } + if (gMain.newKeys & B_BUTTON) + { + if (gPokemonStorageSystemPtr->unk_0005 == 1) + return 16; + r9 = TRUE; + } + if (!r9) + { + r8 = 6; + r10 = 0; + r4 = 0; + } + else if (gMain.newKeys & SELECT_BUTTON) + { + sub_809CD88(); + return 0; + } + } + if (r8) + sub_809AF18(r10, r4); + return r8; +} +#else +__attribute__((naked)) u8 sub_809C664(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tldr r0, _0809C6D8 @ =gUnknown_020384E4\n" + "\tldrb r0, [r0]\n" + "\tmov r10, r0\n" + "\tldr r7, _0809C6DC @ =gUnknown_020384E5\n" + "\tldrb r4, [r7]\n" + "\tldr r2, _0809C6E0 @ =gPokemonStorageSystemPtr\n" + "\tldr r5, [r2]\n" + "\tldr r1, _0809C6E4 @ =0x000011df\n" + "\tadds r0, r5, r1\n" + "\tmovs r1, 0\n" + "\tstrb r1, [r0]\n" + "\tldr r3, _0809C6E8 @ =0x000011de\n" + "\tadds r0, r5, r3\n" + "\tstrb r1, [r0]\n" + "\tadds r3, 0x5\n" + "\tadds r0, r5, r3\n" + "\tstrb r1, [r0]\n" + "\tmov r9, r1\n" + "\tmov r8, r1\n" + "\tldr r1, _0809C6EC @ =gMain\n" + "\tldrh r3, [r1, 0x30]\n" + "\tmovs r0, 0x40\n" + "\tands r0, r3\n" + "\tadds r6, r7, 0\n" + "\tmov r12, r2\n" + "\tadds r2, r1, 0\n" + "\tcmp r0, 0\n" + "\tbeq _0809C6A8\n" + "\tb _0809C81C\n" + "_0809C6A8:\n" + "\tmovs r0, 0x80\n" + "\tands r0, r3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C6F0\n" + "\tlsls r0, r4, 24\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 17\n" + "\tadds r0, r1\n" + "\tlsrs r4, r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x6\n" + "\tble _0809C6C2\n" + "\tmovs r4, 0\n" + "_0809C6C2:\n" + "\tlsls r0, r4, 24\n" + "\tasrs r0, 24\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r6, r1]\n" + "\tcmp r0, r1\n" + "\tbne _0809C6D0\n" + "\tb _0809C83C\n" + "_0809C6D0:\n" + "\tmovs r2, 0x1\n" + "\tmov r8, r2\n" + "\tb _0809C842\n" + "\t.align 2, 0\n" + "_0809C6D8: .4byte gUnknown_020384E4\n" + "_0809C6DC: .4byte gUnknown_020384E5\n" + "_0809C6E0: .4byte gPokemonStorageSystemPtr\n" + "_0809C6E4: .4byte 0x000011df\n" + "_0809C6E8: .4byte 0x000011de\n" + "_0809C6EC: .4byte gMain\n" + "_0809C6F0:\n" + "\tmovs r0, 0x20\n" + "\tands r0, r3\n" + "\tcmp r0, 0\n" + "\tbeq _0809C714\n" + "\tldrb r1, [r6]\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0\n" + "\tbeq _0809C714\n" + "\tmovs r3, 0x1\n" + "\tmov r8, r3\n" + "\tldr r2, _0809C710 @ =0x000011e2\n" + "\tadds r0, r5, r2\n" + "\tstrb r1, [r0]\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "\t.align 2, 0\n" + "_0809C710: .4byte 0x000011e2\n" + "_0809C714:\n" + "\tldrh r1, [r2, 0x30]\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C748\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C73C\n" + "\tmovs r3, 0x1\n" + "\tmov r8, r3\n" + "\tmov r1, r12\n" + "\tldr r0, [r1]\n" + "\tldr r2, _0809C738 @ =0x000011e2\n" + "\tadds r0, r2\n" + "\tldrb r4, [r0]\n" + "\tb _0809C83C\n" + "\t.align 2, 0\n" + "_0809C738: .4byte 0x000011e2\n" + "_0809C73C:\n" + "\tmovs r3, 0x6\n" + "\tmov r8, r3\n" + "\tmovs r0, 0\n" + "\tmov r10, r0\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "_0809C748:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7D0\n" + "\tmovs r0, 0\n" + "\tldrsb r0, [r6, r0]\n" + "\tcmp r0, 0x6\n" + "\tbne _0809C76E\n" + "\tmov r1, r12\n" + "\tldr r0, [r1]\n" + "\tldrb r0, [r0, 0x5]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C768\n" + "\tmovs r0, 0x4\n" + "\tb _0809C84C\n" + "_0809C768:\n" + "\tmovs r2, 0x1\n" + "\tmov r9, r2\n" + "\tb _0809C7D0\n" + "_0809C76E:\n" + "\tbl sub_809CAB0\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7D0\n" + "\tldr r0, _0809C784 @ =gUnknown_020384E9\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _0809C788\n" + "\tmovs r0, 0x8\n" + "\tb _0809C84C\n" + "\t.align 2, 0\n" + "_0809C784: .4byte gUnknown_020384E9\n" + "_0809C788:\n" + "\tmovs r0, 0\n" + "\tbl sub_809CE4C\n" + "\tsubs r0, 0x1\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tcmp r0, 0x4\n" + "\tbhi _0809C7D0\n" + "\tlsls r0, 2\n" + "\tldr r1, _0809C7A4 @ =_0809C7A8\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0809C7A4: .4byte _0809C7A8\n" + "\t.align 2, 0\n" + "_0809C7A8:\n" + "\t.4byte _0809C7BC\n" + "\t.4byte _0809C7C0\n" + "\t.4byte _0809C7C4\n" + "\t.4byte _0809C7C8\n" + "\t.4byte _0809C7CC\n" + "_0809C7BC:\n" + "\tmovs r0, 0xB\n" + "\tb _0809C84C\n" + "_0809C7C0:\n" + "\tmovs r0, 0xC\n" + "\tb _0809C84C\n" + "_0809C7C4:\n" + "\tmovs r0, 0xD\n" + "\tb _0809C84C\n" + "_0809C7C8:\n" + "\tmovs r0, 0xE\n" + "\tb _0809C84C\n" + "_0809C7CC:\n" + "\tmovs r0, 0xF\n" + "\tb _0809C84C\n" + "_0809C7D0:\n" + "\tldr r2, _0809C7EC @ =gMain\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x2\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C7F8\n" + "\tldr r0, _0809C7F0 @ =gPokemonStorageSystemPtr\n" + "\tldr r0, [r0]\n" + "\tldrb r0, [r0, 0x5]\n" + "\tcmp r0, 0x1\n" + "\tbne _0809C7F4\n" + "\tmovs r0, 0x10\n" + "\tb _0809C84C\n" + "\t.align 2, 0\n" + "_0809C7EC: .4byte gMain\n" + "_0809C7F0: .4byte gPokemonStorageSystemPtr\n" + "_0809C7F4:\n" + "\tmovs r3, 0x1\n" + "\tmov r9, r3\n" + "_0809C7F8:\n" + "\tmov r0, r9\n" + "\tcmp r0, 0\n" + "\tbeq _0809C80A\n" + "\tmovs r1, 0x6\n" + "\tmov r8, r1\n" + "\tmovs r2, 0\n" + "\tmov r10, r2\n" + "\tmovs r4, 0\n" + "\tb _0809C83C\n" + "_0809C80A:\n" + "\tldrh r1, [r2, 0x2E]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _0809C83C\n" + "\tbl sub_809CD88\n" + "\tmovs r0, 0\n" + "\tb _0809C84C\n" + "_0809C81C:\n" + "\tlsls r0, r4, 24\n" + "\tmovs r3, 0xFF\n" + "\tlsls r3, 24\n" + "\tadds r0, r3\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r0, 0\n" + "\tbge _0809C82C\n" + "\tmovs r4, 0x6\n" + "_0809C82C:\n" + "\tlsls r0, r4, 24\n" + "\tasrs r0, 24\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r7, r1]\n" + "\tcmp r0, r1\n" + "\tbeq _0809C83C\n" + "\tmovs r0, 0x1\n" + "\tmov r8, r0\n" + "_0809C83C:\n" + "\tmov r1, r8\n" + "\tcmp r1, 0\n" + "\tbeq _0809C84A\n" + "_0809C842:\n" + "\tmov r0, r10\n" + "\tadds r1, r4, 0\n" + "\tbl sub_809AF18\n" + "_0809C84A:\n" + "\tmov r0, r8\n" + "_0809C84C:\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif diff --git a/src/pokemon_storage_system_5.c b/src/pokemon_storage_system_5.c new file mode 100644 index 000000000..b7c3d42f5 --- /dev/null +++ b/src/pokemon_storage_system_5.c @@ -0,0 +1,16 @@ + +// Includes +#include "global.h" +#include "pokemon_storage_system.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c new file mode 100644 index 000000000..75ddb52d0 --- /dev/null +++ b/src/pokemon_summary_screen.c @@ -0,0 +1,5074 @@ +#include "global.h" +#include "constants/items.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "battle.h" +#include "contest.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "ewram.h" +#include "item.h" +#include "learn_move.h" +#include "link.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "overworld.h" +#include "palette.h" +#include "party_menu.h" +#include "pokeball.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "region_map.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "strings2.h" +#include "task.h" +#include "tv.h" +#include "scanline_effect.h" + +static void sub_809FC0C(void); +static void sub_809FEB8(void); +static void sub_809F63C(struct Pokemon *); +static void sub_809F650(struct Pokemon *); +static void sub_809F664(struct Pokemon *); +static void sub_809FE6C(struct Pokemon *); +static void sub_80A0090(struct Pokemon *); +static void sub_80A015C(struct Pokemon *); +static void sub_809DE44(void); +static void sub_809EB40(u8); +static void sub_809EBC4(void); +static void sub_809E044(void); +static void sub_80A1D84(struct Pokemon *); +static void sub_80A18C4(void); +static bool8 LoadPokemonSummaryScreenGraphics(void); +static bool8 MonKnowsMultipleMoves(struct Pokemon *); +static void PrintSummaryWindowHeaderText(void); +static void sub_80A1DCC(struct Pokemon *); +static void sub_809FE80(void); +static void sub_80A00A4(void); +static void sub_80A0390(void); +extern u8 sub_80A1808(struct Pokemon *); +static void sub_80A1F98(s32, u8, u8, u8, u8, u16, s32); +static void sub_80A0958(struct Pokemon *); +static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *, u8, u8); +static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *, u8, u8); +static void sub_80A1EF8(const u8 *, u8, u8, u16, s32); +static void sub_80A1F48(const u8 *, u8, u8, u8, u16); +static void PrintHeldItemName(u16, u8, u8); +static void PrintNumRibbons(struct Pokemon *); +static void DrawExperienceProgressBar(struct Pokemon *, u8, u8); +static void sub_809E13C(u8 taskId); +static void sub_80A1950(void); +static void sub_809DE64(void); +static void SummaryScreenHandleAButton(u8); +static void SummaryScreenHandleUpDownInput(u8, s8); +static bool8 sub_809F7D0(u8); +static void sub_809F9D0(u8, u8); +static void sub_809EAC8(u8); +static void sub_809E534(u8); +static void sub_809E83C(u8, s8); +static void sub_80A1B40(u8); +static void sub_80A2078(int); +static void sub_809E3FC(u8); +static void SummaryScreenHandleKeyInput(u8); +static void sub_80A1B1C(u8); +static void sub_80A16CC(u8); +static void sub_80A1A30(u8); +static void DrawSummaryScreenNavigationDots(void); +static void sub_80A00F4(u8); +static void sub_80A029C(struct Pokemon *); +static void sub_809FBE4(void); +static void sub_80A1500(u8); +static void sub_80A1334(u8); +extern void sub_809F43C(u8); +extern s8 sub_809F284(s8); +extern s8 sub_809F3CC(s8); +static bool8 sub_809F5F8(void); +static void sub_80A1DE8(struct Pokemon *); +static u8 sub_809F6B4(struct Pokemon *, u8 *); +static void DrawPokerusSurvivorDot(struct Pokemon *); +static void sub_80A12D0(s8); +static void sub_809FAC8(struct Pokemon *); +static void SummaryScreenHandleLeftRightInput(u8, s8); +static void sub_809E8F0(); +static void sub_80A1654(s8, u8); +static void sub_80A1488(s8, u8); +static void sub_809FC34(struct Pokemon *); +static void sub_809FF64(struct Pokemon *); +static void sub_80A1918(u8, u8); +static void sub_80A198C(u8, u8, u8, u8); +static u16 GetMonMove(struct Pokemon *, u8); +static void sub_80A04CC(u16); +static void sub_80A057C(u16); +static void sub_80A0498(u16); +static void sub_80A046C(u16); +static void sub_80A20A8(u8); +static void sub_809F678(struct Pokemon *); +static void sub_80A1BC0(struct Sprite *sprite); +static void sub_80A1888(struct Sprite *); +static void sub_80A0428(struct Pokemon *, u8 *); +static void sub_80A18E4(u8); +static u8 *sub_80A1E58(u8 *, u8); +static void sub_80A0A2C(struct Pokemon *, u8, u8); +static void sub_80A1FF8(const u8 *, u8, u8, u8); + +extern u8 ball_number_to_ball_processing_index(u16); +extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8); + +extern struct MusicPlayerInfo gMPlay_BGM; +extern u8 gUnknown_08208238[]; +extern u16 gBattle_BG3_Y; +extern u16 gBattle_BG2_Y; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG3_X; +extern TaskFunc gUnknown_03005CF0; +extern struct SpriteTemplate gUnknown_02024E8C; + +extern const u8 gStatusPal_Icons[]; +extern const u8 gStatusGfx_Icons[]; +extern const u8 gMenuSummaryPal[]; +extern const u8 gMenuSummaryGfx[]; +extern const u8 gMoveTypes_Gfx[]; +extern const u8 gMoveTypes_Pal[]; +extern const u8 gStatusScreen_Pal[]; +extern const u8 gStatusScreen_Tilemap[]; +extern const u8 gUnknown_08E74688[]; +extern const u8 gUnknown_08E74E88[]; +extern const u8 gUnknown_08E73508[]; +extern const u8 gStatusScreen_Gfx[]; +extern const u8 gFontDefaultPalette[]; +extern const u8 gAbilityNames[][13]; +extern const u8 * const gAbilityDescriptions[]; +extern const u8 * const gContestEffectStrings[]; +extern const struct ContestMove gContestMoves[]; +extern const struct ContestEffect gContestEffects[]; +extern const u16 gUnknown_08E94510[]; +extern const u16 gUnknown_08E94550[]; +extern const u16 gUnknown_08E94590[]; +extern const u8 gUnknown_08E73E88[]; + +EWRAM_DATA u8 gUnknown_020384F0 = 0; +EWRAM_DATA struct Sprite *gUnknown_020384F4 = NULL; + +#if ENGLISH +#include "data/text/move_descriptions_en.h" +#include "data/text/nature_names_en.h" +#elif GERMAN +#include "data/text/move_descriptions_de.h" +#include "data/text/nature_names_de.h" +#endif + +static const u8 * const sPageHeaderTexts[] = { + gEmptyString_81E72B0, + OtherText_PokeInfo, + OtherText_PokeSkills, + OtherText_BattleMoves, + OtherText_ContestMoves, + OtherText_Switch, + OtherText_Info, + gOtherText_CancelNoTerminator, +}; + +static const union AffineAnimCmd sUnusedSpriteAffineAnim[] = { + AFFINEANIMCMD_FRAME(0xFF00, 0x100, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sUnsuedSpriteAffineAnimTable[] = { + sUnusedSpriteAffineAnim, +}; + +static const struct OamData sOamData_83C109C = { + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_83C10A4[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10AC[] = { + ANIMCMD_FRAME(8, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10B4[] = { + ANIMCMD_FRAME(16, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10BC[] = { + ANIMCMD_FRAME(24, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10C4[] = { + ANIMCMD_FRAME(32, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10CC[] = { + ANIMCMD_FRAME(40, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10D4[] = { + ANIMCMD_FRAME(48, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10DC[] = { + ANIMCMD_FRAME(56, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10E4[] = { + ANIMCMD_FRAME(64, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10EC[] = { + ANIMCMD_FRAME(72, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10F4[] = { + ANIMCMD_FRAME(80, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10FC[] = { + ANIMCMD_FRAME(88, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1104[] = { + ANIMCMD_FRAME(96, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C110C[] = { + ANIMCMD_FRAME(104, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1114[] = { + ANIMCMD_FRAME(112, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C111C[] = { + ANIMCMD_FRAME(120, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1124[] = { + ANIMCMD_FRAME(128, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C112C[] = { + ANIMCMD_FRAME(136, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1134[] = { + ANIMCMD_FRAME(144, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C113C[] = { + ANIMCMD_FRAME(152, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1144[] = { + ANIMCMD_FRAME(160, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C114C[] = { + ANIMCMD_FRAME(168, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1154[] = { + ANIMCMD_FRAME(176, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_83C115C[] = { + sSpriteAnim_83C10A4, + sSpriteAnim_83C10AC, + sSpriteAnim_83C10B4, + sSpriteAnim_83C10BC, + sSpriteAnim_83C10C4, + sSpriteAnim_83C10CC, + sSpriteAnim_83C10D4, + sSpriteAnim_83C10DC, + sSpriteAnim_83C10E4, + sSpriteAnim_83C10EC, + sSpriteAnim_83C10F4, + sSpriteAnim_83C10FC, + sSpriteAnim_83C1104, + sSpriteAnim_83C110C, + sSpriteAnim_83C1114, + sSpriteAnim_83C111C, + sSpriteAnim_83C1124, + sSpriteAnim_83C112C, + sSpriteAnim_83C1134, + sSpriteAnim_83C113C, + sSpriteAnim_83C1144, + sSpriteAnim_83C114C, + sSpriteAnim_83C1154, +}; + +static const struct CompressedSpriteSheet sUnknown_083C11B8 = { gMoveTypes_Gfx, 0x1700, 30002 }; + +static const struct SpriteTemplate sSpriteTemplate_83C11C0 = { + .tileTag = 30002, + .paletteTag = 30002, + .oam = &sOamData_83C109C, + .anims = sSpriteAnimTable_83C115C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const u8 sUnknown_PaletteNums[] = { 0xD, 0xD, 0xE, 0xE, 0xD, 0xD, 0xF, 0xE, 0xD, 0xF, 0xD, 0xE, 0xF, 0xD, 0xE, 0xE, 0xF, 0xD, 0xD, 0xE, 0xE, 0xF, 0xD }; + +static const struct OamData sOamData_83C11F0 = { + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_83C11F8[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1200[] = { + ANIMCMD_FRAME(4, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1208[] = { + ANIMCMD_FRAME(8, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1210[] = { + ANIMCMD_FRAME(12, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1218[] = { + ANIMCMD_FRAME(16, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1220[] = { + ANIMCMD_FRAME(16, 0, .hFlip = TRUE), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1228[] = { + ANIMCMD_FRAME(20, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1230[] = { + ANIMCMD_FRAME(24, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1238[] = { + ANIMCMD_FRAME(24, 0, .hFlip = TRUE), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1240[] = { + ANIMCMD_FRAME(28, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_83C1248[] = { + sSpriteAnim_83C11F8, + sSpriteAnim_83C1200, + sSpriteAnim_83C1208, + sSpriteAnim_83C1210, + sSpriteAnim_83C1218, + sSpriteAnim_83C1220, + sSpriteAnim_83C1228, + sSpriteAnim_83C1230, + sSpriteAnim_83C1238, + sSpriteAnim_83C1240, +}; + +static const struct CompressedSpriteSheet sUnknown_083C1270 = { gMenuSummaryGfx, 0x400, 30000 }; +static const struct CompressedSpritePalette sUnknown_083C1278 = { gMenuSummaryPal, 30000 }; + +static const struct SpriteTemplate sSpriteTemplate_83C1280 = { + .tileTag = 30000, + .paletteTag = 30000, + .oam = &sOamData_83C11F0, + .anims = sSpriteAnimTable_83C1248, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct OamData sOamData_83C1298 = { + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 3, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_83C12A0[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12A8[] = { + ANIMCMD_FRAME(4, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12B0[] = { + ANIMCMD_FRAME(8, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12B8[] = { + ANIMCMD_FRAME(12, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12C0[] = { + ANIMCMD_FRAME(16, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12C8[] = { + ANIMCMD_FRAME(20, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12D0[] = { + ANIMCMD_FRAME(24, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_83C12D8[] = { + sSpriteAnim_83C12A0, + sSpriteAnim_83C12A8, + sSpriteAnim_83C12B0, + sSpriteAnim_83C12B8, + sSpriteAnim_83C12C0, + sSpriteAnim_83C12C8, + sSpriteAnim_83C12D0, +}; + +static const struct CompressedSpriteSheet sUnknown_083C12F4 = { gStatusGfx_Icons, 0x380, 30001 }; +static const struct CompressedSpritePalette sUnknown_083C12FC = { gStatusPal_Icons, 30001 }; + +static const struct SpriteTemplate sSpriteTemplate_83C1304 = { + .tileTag = 30001, + .paletteTag = 30001, + .oam = &sOamData_83C1298, + .anims = sSpriteAnimTable_83C12D8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const u16 sSummaryScreenMonMarkingsPalette[] = INCBIN_U16("graphics/summary_screen/mon_markings.gbapal"); + +#if ENGLISH +static const u16 gSummaryScreenTextTiles[] = INCBIN_U16("graphics/summary_screen/text.4bpp"); +#elif GERMAN +extern const u16 gSummaryScreenTextTiles[]; +#endif + +static const u16 sSummaryScreenButtonTiles[] = INCBIN_U16("graphics/summary_screen/buttons.4bpp"); + +static const u16 sUnknown_083C157C[] = { RGB(26, 26, 23) }; +static const u16 sUnknown_083C157E[] = { RGB(30, 30, 27) }; + +static void (*const sUnknown_083C1580[])(void) = { + sub_809FC0C, + sub_809FEB8, +}; + +static void (*const sUnknown_083C1588[])(struct Pokemon *) = { + sub_809F63C, + sub_809F650, + sub_809F664, + sub_809F664, +}; + +static void (*const sUnknown_083C1598[])(struct Pokemon *) = { + sub_809FE6C, + sub_80A0090, + sub_80A015C, + sub_80A015C, +}; + +static const u8 sDoubleBattlePartyOrder[] = { 0, 2, 3, 1, 4, 5 }; + +static const u8 sUnknown_083C15AE[] = _("{STR_VAR_1}{CLEAR_TO 64}"); +static const u8 sUnknown_083C15B4[] = _("{STR_VAR_1}{CLEAR_TO 72}"); + +asm(".align 2"); // TODO: this array is probably not correctly-typed +static const u8 sUnknown_083C15BC[] = { + 9, 1, 0, 2, + 10, 3, 0, 4, + 8, 5, 0, 6, + 11, 7, 0, 8, + 14, 9, 0, 10, + 12, 11, 0, 12, + 13, 13, 0, 14, + -1, 15, 0, 10, +}; + +void sub_809D844(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008264(gLink.recvQueue.count, 20, 1, 2, 3); +#endif +} + +void sub_809D85C(void) +{ + REG_BG1HOFS = gBattle_BG1_X; + REG_BG1VOFS = gBattle_BG1_Y; + REG_BG2HOFS = gBattle_BG2_X; + REG_BG2VOFS = gBattle_BG2_Y; + REG_BG3HOFS = gBattle_BG3_X; + REG_BG3VOFS = gBattle_BG3_Y; + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void ShowPokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u8 mode) +{ + gPaletteFade.bufferTransferDisabled = 1; + + pssData.monList.partyMons = party; + pssData.mode = mode; + pssData.monIndex = monIndex; + pssData.maxMonIndex = maxMonIndex; + pssData.callback = callback; + pssData.loadGfxState = 0; + pssData.selectedMoveIndex = 4; + pssData.moveToLearn = 0; + pssData.bgToggle = 0; + pssData.disableMoveOrderEditing = FALSE; + + if (mode >= PSS_MODE_PC_NORMAL) + pssData.usingPC = TRUE; + else + pssData.usingPC = FALSE; + + switch (mode) + { + case PSS_MODE_NORMAL: + case PSS_MODE_PC_NORMAL: + pssData.firstPage = PSS_PAGE_INFO; + pssData.lastPage = PSS_PAGE_CONTEST_MOVES; + pssData.unk77 = 0; + pssData.unk78 = 0; + pssData.headerTextId = 1; + pssData.headerActionTextId = 7; + break; + case PSS_MODE_NO_MOVE_ORDER_EDIT: + pssData.firstPage = PSS_PAGE_INFO; + pssData.lastPage = PSS_PAGE_CONTEST_MOVES; + pssData.unk77 = 0; + pssData.unk78 = 0; + pssData.headerTextId = 1; + pssData.headerActionTextId = 7; + pssData.disableMoveOrderEditing = TRUE; + break; + case PSS_MODE_SELECT_MOVE: + pssData.firstPage = PSS_PAGE_BATTLE_MOVES; + pssData.lastPage = PSS_PAGE_CONTEST_MOVES; + pssData.unk77 = 1; + pssData.unk78 = 1; + pssData.headerTextId = 3; + pssData.headerActionTextId = 0; + pssData.selectedMoveIndex = 0; + break; + case PSS_MODE_MOVES_ONLY: + case PSS_MODE_PC_MOVES_ONLY: + pssData.firstPage = PSS_PAGE_BATTLE_MOVES; + pssData.lastPage = PSS_PAGE_CONTEST_MOVES; + pssData.unk77 = 1; + pssData.unk78 = 1; + break; + } + + pssData.page = pssData.firstPage; + SetMainCallback2(sub_809DE44); +} + +void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u16 move) +{ + ShowPokemonSummaryScreen(party, monIndex, maxMonIndex, callback, PSS_MODE_SELECT_MOVE); + pssData.moveToLearn = move; +} + +void sub_809DA1C(void) +{ + switch (pssData.mode) + { + case PSS_MODE_NORMAL: + case PSS_MODE_PC_NORMAL: + pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0); + break; + case PSS_MODE_NO_MOVE_ORDER_EDIT: + pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0); + break; + case PSS_MODE_SELECT_MOVE: + case PSS_MODE_UNKNOWN: + pssData.inputHandlingTaskId = CreateTask(sub_809EB40, 0); + break; + case PSS_MODE_MOVES_ONLY: + case PSS_MODE_PC_MOVES_ONLY: + pssData.inputHandlingTaskId = CreateTask(sub_809E3FC, 0); + break; + } +} + +bool8 sub_809DA84(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + ResetSpriteData(); + gMain.state++; + break; + case 1: + ScanlineEffect_Stop(); + gMain.state++; + break; + case 2: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 3: + DmaClearLarge(3, (void *)(VRAM + 0x0), 0x10000, 0x1000, 32); + gMain.state++; + break; + case 4: + sub_809DE64(); + gMain.state++; + break; + case 5: + Text_LoadWindowTemplate(&gWindowTemplate_81E6E6C); + gMain.state++; + break; + case 6: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E6C); + gMain.state++; + break; + case 7: + if (MultistepInitMenuWindowContinue()) + gMain.state++; + break; + case 8: + sub_809DA1C(); + gMain.state++; + break; + case 9: + DmaCopy16Defvars(3, gSummaryScreenTextTiles, (void *)(VRAM + 0xD000), 320); + DmaCopy16Defvars(3, sSummaryScreenButtonTiles, (void *)(VRAM + 0xD140), 256); + pssData.loadGfxState = 0; + gMain.state++; + break; + case 10: + if (LoadPokemonSummaryScreenGraphics()) + { + pssData.loadGfxState = 0; + gMain.state++; + } + break; + case 11: + sub_80A18C4(); + gMain.state++; + break; + case 12: + sub_809F678(&pssData.loadedMon); + if (!GetMonStatusAndPokerus(&pssData.loadedMon)) + sub_80A12D0(0); + else + sub_80A12D0(10); + DrawPokerusSurvivorDot(&pssData.loadedMon); + gMain.state++; + break; + case 13: + sub_80A1950(); + sub_80A1D84(&pssData.loadedMon); + gMain.state++; + break; + case 14: + sub_80A1DE8(&pssData.loadedMon); + pssData.loadGfxState = 0; + gMain.state++; + break; + case 15: + if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF) + { + pssData.loadGfxState = 0; + gMain.state++; + } + break; + case 16: + sub_809E044(); + DrawSummaryScreenNavigationDots(); + gMain.state++; + break; + case 17: + if (pssData.page <= PSS_PAGE_SKILLS) + sUnknown_083C1580[pssData.page](); + gMain.state++; + break; + case 18: + sub_809FAC8(&pssData.loadedMon); + gMain.state++; + break; + case 19: + sUnknown_083C1598[pssData.page](&pssData.loadedMon); + gMain.state++; + break; + case 20: + if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) + gBattle_BG3_X = 256; + else + gBattle_BG3_X = 0; + gMain.state++; + break; + case 21: + sub_809EBC4(); + if (pssData.selectedMoveIndex != 0) + { + sub_80A1488(0, 0); + sub_80A1654(0, 0); + } + else + { + sub_80A1488(10, 0); + sub_80A1654(10, 0); + } + PrintSummaryWindowHeaderText(); + gMain.state++; + break; + case 22: + if (sub_8055870() != TRUE) + gMain.state++; + break; + default: + SetVBlankCallback(sub_809D85C); + BeginHardwarePaletteFade(0xFF, 0, 16, 0, 1); + SetMainCallback2(sub_809D844); + gPaletteFade.bufferTransferDisabled = 0; +#if DEBUG + if (gLinkOpen == TRUE) + debug_sub_8008218((void *)(VRAM + 0xDDE0), 0x8000, (void *)(VRAM + 0xF000), 3); +#endif + return TRUE; + } + + return FALSE; +} + +static void sub_809DE44(void) +{ + while (sub_809DA84() != TRUE && sub_80F9344() != TRUE) + ; +} + +static void sub_809DE64(void) +{ + REG_BG0CNT = 0x1E08; + REG_BG1CNT = 0x4801; + REG_BG2CNT = 0x4A02; + REG_BG3CNT = 0x5C03; + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + + REG_BLDCNT = 0; + REG_DISPCNT = 0x1F40; +} + +static bool8 LoadPokemonSummaryScreenGraphics(void) +{ + switch (pssData.loadGfxState) + { + case 0: + LZDecompressVram(gStatusScreen_Gfx, (void *)VRAM + 0); + break; + case 1: + CpuSet(gUnknown_08E73508, (void *)VRAM + 0xE000, 0x400); + break; + case 2: + LZDecompressVram(gUnknown_08E74E88, (void *)VRAM + 0xE800); + break; + case 3: + LZDecompressVram(gStatusScreen_Tilemap, (void *)VRAM + 0x4800); + break; + case 4: + CpuSet(gUnknown_08E73E88, (void *)VRAM + 0x5800, 0x400); + break; + case 5: + CpuSet(gUnknown_08E74688, (void *)VRAM + 0x6800, 0x400); + break; + case 6: + LoadCompressedPalette(gStatusScreen_Pal, 0, 160); + break; + case 7: + LoadCompressedObjectPic(&sUnknown_083C11B8); + break; + case 8: + LoadCompressedObjectPic(&sUnknown_083C1270); + break; + case 9: + LoadCompressedObjectPic(&sUnknown_083C12F4); + break; + case 10: + LoadCompressedObjectPalette(&sUnknown_083C12FC); + break; + case 11: + LoadCompressedObjectPalette(&sUnknown_083C1278); + break; + case 12: + LoadCompressedPalette(gMoveTypes_Pal, 464, 96); + pssData.loadGfxState = 0; + return TRUE; + } + + pssData.loadGfxState++; + return FALSE; +} + +static void sub_809E044(void) +{ + LoadPalette(gUnknownPalette_81E6692 + 14, 129, 2); + LoadPalette(gUnknownPalette_81E6692 + 15, 136, 2); + LoadPalette(gUnknownPalette_81E6692 + 14, 143, 2); + LoadPalette(gUnknownPalette_81E6692 + 15, 137, 2); + LoadPalette(gUnknownPalette_81E6692 + 6, 209, 4); + LoadPalette(gUnknownPalette_81E6692 + 10, 211, 4); + LoadPalette(gUnknownPalette_81E6692 + 14, 213, 4); + LoadPalette(gUnknownPalette_81E6692 + 6, 215, 4); + LoadPalette(gUnknownPalette_81E6692 + 4, 217, 4); + LoadPalette(gUnknownPalette_81E6692 + 8, 219, 4); + LoadPalette(gUnknownPalette_81E6692 + 2, 221, 2); + LoadPalette(gUnknownPalette_81E6692 + 3, 222, 2); + LoadPalette(gUnknownPalette_81E6692 + 1, 223, 2); + LoadPalette(gFontDefaultPalette, 240, 32); + LoadPalette(gUnknownPalette_81E6692 + 3, 249, 2); +} + +static void SummaryScreenExit(u8 taskId) +{ + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_809E13C; +} + +static void sub_809E13C(u8 taskId) +{ + if (sub_8055870() != TRUE && !gPaletteFade.active) + { + gUnknown_020384F0 = pssData.monIndex; + + ResetSpriteData(); + FreeAllSpritePalettes(); + StopCryAndClearCrySongs(); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + SetMainCallback2(pssData.callback); + DestroyTask(taskId); + } +} + +static void SummaryScreenHandleKeyInput(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + SummaryScreenHandleUpDownInput(taskId, -1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + SummaryScreenHandleUpDownInput(taskId, 1); + } + else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) + { + SummaryScreenHandleLeftRightInput(taskId, -1); + } + else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) + { + SummaryScreenHandleLeftRightInput(taskId, 1); + } + else if (gMain.newKeys & A_BUTTON) + { + if (pssData.page >= PSS_PAGE_BATTLE_MOVES) + SummaryScreenHandleAButton(taskId); + if (pssData.page == PSS_PAGE_INFO) + SummaryScreenExit(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + SummaryScreenExit(taskId); + } +} + +static void sub_809E260(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex); + } + else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) + { + if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) + Menu_EraseWindowRect(0, 14, 9, 18); + SummaryScreenHandleLeftRightInput(taskId, -1); + } + else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) + { + if (pssData.page != pssData.lastPage) + { + if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) + Menu_EraseWindowRect(0, 14, 9, 18); + SummaryScreenHandleLeftRightInput(taskId, 1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + if (sub_809F7D0(taskId) == TRUE || pssData.selectedMoveIndex == 4) + { + pssData.switchMoveIndex = pssData.selectedMoveIndex; + gSpecialVar_0x8005 = pssData.switchMoveIndex; + SummaryScreenExit(taskId); + } + else + { + PlaySE(SE_HAZURE); + sub_809F9D0(taskId, pssData.selectedMoveIndex); + } + } + else if (gMain.newKeys & B_BUTTON) + { + pssData.switchMoveIndex = 4; + gSpecialVar_0x8005 = 4; + SummaryScreenExit(taskId); + } +} + +static void sub_809E3FC(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex); + } + else if (gMain.newKeys & A_BUTTON) + { + if (pssData.selectedMoveIndex != 4 && !pssData.disableMoveOrderEditing) + { + if (!MonKnowsMultipleMoves(&pssData.loadedMon)) + { + PlaySE(SE_HAZURE); + } + else + { + PlaySE(SE_SELECT); + + pssData.switchMoveIndex = pssData.selectedMoveIndex; + sub_80A1B40(1); + sub_80A1A30(19); + + gTasks[taskId].func = sub_809E534; + } + } + else + { + PlaySE(SE_SELECT); + sub_809EAC8(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_809EAC8(taskId); + } + +} + +static bool8 MonKnowsMultipleMoves(struct Pokemon *mon) +{ + u8 i; + + for (i = 1; i < 4; i++) + { + if (GetMonMove(mon, i)) + return TRUE; + } + + return FALSE; +} + +static void sub_809E534(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 3; + sub_809E8F0(taskId, -1, &pssData.switchMoveIndex); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 3; + sub_809E8F0(taskId, 1, &pssData.switchMoveIndex); + } + else if (gMain.newKeys & A_BUTTON) + { + sub_809E83C(taskId, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + sub_809E83C(taskId, -1); + } +} + +static void sub_809E5C4(void) +{ + struct Pokemon *party = pssData.monList.partyMons; + struct Pokemon *pkmn = &party[pssData.monIndex]; + u8 moveIndex1 = pssData.selectedMoveIndex; + u8 moveIndex2 = pssData.switchMoveIndex; + + u16 move1 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1); + u16 move2 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2); + u8 move1pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex1); + u8 move2pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex2); + u8 ppBonuses = GetMonData(pkmn, MON_DATA_PP_BONUSES); + + // Calculate PP bonuses + u8 r9 = gUnknown_08208238[moveIndex1]; + u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2); + u8 r3 = gUnknown_08208238[moveIndex2]; + u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2); + ppBonuses &= ~r9; + ppBonuses &= ~r3; + ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2)); + + // Swap the moves + SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2); + SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1); + SetMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp); + SetMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp); + SetMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses); +} + +static void sub_809E6D8(void) +{ + struct BoxPokemon *boxMons = pssData.monList.boxMons; + struct BoxPokemon *pkmn = &boxMons[pssData.monIndex]; + u8 moveIndex1 = pssData.selectedMoveIndex; + u8 moveIndex2 = pssData.switchMoveIndex; + + u16 move1 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1); + u16 move2 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2); + u8 move1pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1); + u8 move2pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2); + u8 ppBonuses = GetBoxMonData(pkmn, MON_DATA_PP_BONUSES); + + // Calculate PP bonuses + u8 r9 = gUnknown_08208238[moveIndex1]; + u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2); + u8 r3 = gUnknown_08208238[moveIndex2]; + u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2); + ppBonuses &= ~r9; + ppBonuses &= ~r3; + ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2)); + + // Swap the moves + SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2); + SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1); + SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp); + SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp); + SetBoxMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void sub_809E7F0(u8 taskId) +{ + if (sub_809F5F8()) + { + pssData.loadGfxState = 0; + sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); + } +} + +static void sub_809E83C(u8 taskId, s8 b) +{ + PlaySE(SE_SELECT); + + sub_80A1B1C(19); + sub_80A1B40(0); + + if (b == 1) + { + if (pssData.selectedMoveIndex != pssData.switchMoveIndex) + { + if (pssData.usingPC == FALSE) + sub_809E5C4(); + else + sub_809E6D8(); + + pssData.selectedMoveIndex = pssData.switchMoveIndex; + sub_809F678(&pssData.loadedMon); + pssData.loadGfxState = 1; + + gTasks[taskId].func = sub_809E7F0; + return; + } + } + else + { + sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); + } + + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); +} + +__attribute__((naked)) +static void sub_809E8F0(/*u8 taskId, s8 direction, u8 *c*/) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + adds r4, r1, 0\n\ + mov r9, r2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + mov r1, r9\n\ + ldrb r6, [r1]\n\ + ldr r1, _0809E944 @ =gTasks\n\ + mov r2, r8\n\ + lsls r0, r2, 2\n\ + add r0, r8\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x8]\n\ + movs r2, 0\n\ + lsls r4, 24\n\ + asrs r4, 24\n\ + mov r10, r4\n\ + lsls r7, r0, 24\n\ +_0809E930:\n\ + lsls r0, r6, 24\n\ + asrs r0, 24\n\ + add r0, r10\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + asrs r1, r0, 24\n\ + cmp r0, r7\n\ + ble _0809E948\n\ + movs r6, 0\n\ + b _0809E94E\n\ + .align 2, 0\n\ +_0809E944: .4byte gTasks\n\ +_0809E948:\n\ + cmp r1, 0\n\ + bge _0809E94E\n\ + lsrs r6, r7, 24\n\ +_0809E94E:\n\ + lsls r4, r6, 24\n\ + lsrs r1, r4, 24\n\ + ldr r0, _0809EA10 @ =gSharedMem + 0x18010\n\ + str r2, [sp, 0x4]\n\ + bl GetMonMove\n\ + lsls r0, 16\n\ + adds r5, r4, 0\n\ + ldr r2, [sp, 0x4]\n\ + cmp r0, 0\n\ + bne _0809E97A\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + beq _0809E97A\n\ + lsls r0, r2, 24\n\ + movs r3, 0x80\n\ + lsls r3, 17\n\ + adds r0, r3\n\ + lsrs r2, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _0809E930\n\ +_0809E97A:\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x4\n\ + bne _0809E996\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + beq _0809E996\n\ + ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ + adds r0, 0x7C\n\ + ldrh r0, [r0]\n\ + mov r2, r8\n\ + lsls r7, r2, 2\n\ + cmp r0, 0\n\ + beq _0809E9AC\n\ +_0809E996:\n\ + ldr r2, _0809EA18 @ =gTasks\n\ + mov r3, r8\n\ + lsls r1, r3, 2\n\ + adds r0, r1, r3\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + movs r2, 0x22\n\ + ldrsh r0, [r0, r2]\n\ + adds r7, r1, 0\n\ + cmp r0, 0x1\n\ + bne _0809E9D0\n\ +_0809E9AC:\n\ + lsrs r4, r5, 24\n\ + movs r0, 0x2\n\ + adds r1, r4, 0\n\ + bl sub_80A1488\n\ + movs r0, 0x2\n\ + adds r1, r4, 0\n\ + bl sub_80A1654\n\ + ldr r1, _0809EA18 @ =gTasks\n\ + mov r3, r8\n\ + adds r0, r7, r3\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strh r1, [r0, 0x22]\n\ + movs r0, 0\n\ + str r0, [sp]\n\ +_0809E9D0:\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x4\n\ + beq _0809E9FE\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + bne _0809E9FE\n\ + ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ + adds r0, 0x7C\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + bne _0809E9FE\n\ + movs r4, 0x2\n\ + negs r4, r4\n\ + lsrs r5, 24\n\ + adds r0, r4, 0\n\ + adds r1, r5, 0\n\ + bl sub_80A1488\n\ + adds r0, r4, 0\n\ + adds r1, r5, 0\n\ + bl sub_80A1654\n\ +_0809E9FE:\n\ + mov r2, r9\n\ + strb r6, [r2]\n\ + ldr r0, _0809EA1C @ =gSharedMem + 0x18079\n\ + cmp r9, r0\n\ + bne _0809EA20\n\ + movs r0, 0\n\ + bl sub_80A1C30\n\ + b _0809EA26\n\ + .align 2, 0\n\ +_0809EA10: .4byte gSharedMem + 0x18010\n\ +_0809EA14: .4byte gSharedMem + 0x18000\n\ +_0809EA18: .4byte gTasks\n\ +_0809EA1C: .4byte gSharedMem + 0x18079\n\ +_0809EA20:\n\ + movs r0, 0x1\n\ + bl sub_80A1C30\n\ +_0809EA26:\n\ + ldr r3, [sp]\n\ + cmp r3, 0\n\ + beq _0809EA34\n\ + ldr r0, _0809EA4C @ =gSharedMem + 0x18010\n\ + mov r1, r9\n\ + bl sub_80A0428\n\ +_0809EA34:\n\ + mov r0, r8\n\ + bl sub_80A2078\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809EA4C: .4byte gSharedMem + 0x18010\n\ + .syntax divided\n"); +} + +static void SummaryScreenHandleAButton(u8 taskId) +{ + PlaySE(SE_SELECT); + + pssData.selectedMoveIndex = 0; + sub_80A1488(2, 0); + sub_80A1654(2, 0); + + if (!pssData.disableMoveOrderEditing) + { + pssData.headerActionTextId = 5; + PrintSummaryWindowHeaderText(); + } + + sub_80A16CC(0); + sub_80A029C(&pssData.loadedMon); + sub_80A1A30(9); + + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); +} + +static void sub_809EAC8(u8 taskId) +{ + if (pssData.selectedMoveIndex != 4) + { + sub_80A1488(-2, 0); + sub_80A1654(-2, 0); + } + + sub_80A1B1C(9); + sub_80A16CC(1); + + Menu_EraseWindowRect(15, 12, 28, 13); + Menu_EraseWindowRect(11, 15, 28, 18); + + pssData.headerActionTextId = 6; + PrintSummaryWindowHeaderText(); + + gTasks[taskId].func = SummaryScreenHandleKeyInput; +} + +static void sub_809EB40(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 5: + sub_80A1A30(9); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_809E260; + break; + case 0: + pssData.selectedMoveIndex = 0; + if (pssData.moveToLearn != 0) + { + sub_80A1488(10, 0); + sub_80A1654(10, pssData.selectedMoveIndex); + } + + sub_80A16CC(0); + sub_80A029C(&pssData.loadedMon); + // fall through + default: + gTasks[taskId].data[0]++; + break; + } +} + +static void sub_809EBC4(void) +{ + if (pssData.page != PSS_PAGE_INFO) + { + DrawSummaryScreenNavigationDots(); + gBattle_BG1_X = 0x100; + + if (pssData.page == PSS_PAGE_SKILLS) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; + + if (pssData.page == PSS_PAGE_CONTEST_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xC00; + } +} + +void sub_809EC38(u8 taskId) +{ + u8 minus2; + s16 *taskData = gTasks[taskId].data; + + switch (taskData[0]) + { + case 0: + if (pssData.bgToggle == 0) + { + if (pssData.page != PSS_PAGE_INFO) + gBattle_BG2_X = 0x100; + + if (pssData.page == PSS_PAGE_SKILLS) + REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0x800; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0xA00; + } + else + { + if (pssData.page != PSS_PAGE_INFO) + gBattle_BG1_X = 0x100; + + if (pssData.page == PSS_PAGE_SKILLS) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; + } + + taskData[0]++; + break; + case 1: + if (pssData.bgToggle == 0) + { + int var2 = gBattle_BG1_X - 0x20; + gBattle_BG1_X = var2; + if (var2 << 16 == 0) + { + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2; + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 1; + taskData[0]++; + } + } + else + { + int var2 = gBattle_BG2_X - 0x20; + gBattle_BG2_X = var2; + if (var2 << 16 == 0) + { + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 1; + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2; + taskData[0]++; + } + } + break; + case 2: + pssData.headerTextId = pssData.page + 1; + minus2 = pssData.mode - 2; + if (minus2 < 2) + { + pssData.headerActionTextId = 0; + sub_80A029C(&pssData.loadedMon); + sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); + sub_80A00F4(pssData.selectedMoveIndex); + } + else + { + if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT)) + pssData.headerActionTextId = 6; + else if (pssData.page == PSS_PAGE_INFO) + pssData.headerActionTextId = 7; + else + pssData.headerActionTextId = 0; + } + taskData[0]++; + break; + case 3: + DrawSummaryScreenNavigationDots(); + PrintSummaryWindowHeaderText(); + taskData[0]++; + break; + case 4: + sUnknown_083C1598[pssData.page](&pssData.loadedMon); + pssData.bgToggle ^= 1; + taskData[0]++; + break; + case 5: + if (sub_8055870() != TRUE) + gTasks[taskId].func = gUnknown_03005CF0; + break; + } +} + +void sub_809EE74(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + switch (taskData[0]) + { + case 0: + if (pssData.bgToggle == 0) + { + gBattle_BG2_X = 0; + taskData[0]++; + } + else + { + gBattle_BG1_X = 0; + taskData[0]++; + } + break; + case 1: + if (pssData.bgToggle == 0) + { + if (pssData.page == PSS_PAGE_SKILLS) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0x801; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xA01; + + if (pssData.page == PSS_PAGE_CONTEST_MOVES) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xC01; + + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2; + } + else + { + if (pssData.page == PSS_PAGE_SKILLS) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0x801; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xA01; + + if (pssData.page == PSS_PAGE_CONTEST_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xC01; + + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2; + } + + taskData[0]++; + break; + case 2: + if (pssData.bgToggle == 0) + { + gBattle_BG2_X += 32; + if (gBattle_BG2_X == 0x100) + taskData[0]++; + } + else + { + gBattle_BG1_X += 32; + if (gBattle_BG1_X == 0x100) + taskData[0]++; + } + break; + case 3: + pssData.headerTextId = pssData.page + 1; + if (pssData.mode == 2 || pssData.mode == 3) + { + pssData.headerActionTextId = 0; + sub_80A029C(&pssData.loadedMon); + sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); + sub_80A00F4(pssData.selectedMoveIndex); + } + else + { + if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT)) + pssData.headerActionTextId = 6; + else if (pssData.page == PSS_PAGE_INFO) + pssData.headerActionTextId = 7; + else + pssData.headerActionTextId = 0; + } + taskData[0]++; + break; + case 4: + DrawSummaryScreenNavigationDots(); + PrintSummaryWindowHeaderText(); + taskData[0]++; + break; + case 5: + sUnknown_083C1598[pssData.page](&pssData.loadedMon); + pssData.bgToggle ^= 1; + taskData[0]++; + break; + case 6: + if (sub_8055870() != TRUE) + gTasks[taskId].func = gUnknown_03005CF0; + break; + } +} + +void sub_809F0D0(u8 taskId, s8 direction) +{ + pssData.page += direction; + gUnknown_03005CF0 = gTasks[taskId].func; + sub_809FBE4(); + gTasks[taskId].data[0] = 0; + + if (direction == -1) + { + gTasks[taskId].func = sub_809EC38; + } + else + { + gTasks[taskId].func = sub_809EE74; + gTasks[taskId].func(taskId); + } +} + +static void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction) +{ + if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) + { + if (direction == -1 && pssData.page == pssData.firstPage) + return; + if (direction == 1 && pssData.page == pssData.lastPage) + return; + if (FindTaskIdByFunc(sub_80A1334) == 0xFF && FindTaskIdByFunc(sub_80A1500) == 0xFF) + { + PlaySE(SE_SELECT); + sub_809F0D0(taskId, direction); + } + } +} + +#ifdef NONMATCHING +static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) +{ + s8 var3; + u8 var1 = direction; + + if (pssData.usingPC == TRUE) + { + if (pssData.page != PSS_PAGE_INFO) + { + var1 = (direction == 1) ? 0 : 1; + } + else + { + var1 = (direction == 1) ? 2 : 3; + } + + var3 = StorageSystemGetNextMonIndex(pssData.monList.boxMons, pssData.monIndex, pssData.maxMonIndex, var1); + } + else + { + if (sub_80F9344() == TRUE && IsLinkDoubleBattle() == TRUE) + { + var3 = sub_809F3CC(var1); + } + else + { + var3 = sub_809F284(var1); + } + } + + if (var3 != -1) + { + PlaySE(SE_SELECT); + if (GetMonStatusAndPokerus(&pssData.loadedMon)) + { + sub_80A12D0(-2); + } + + pssData.monIndex = var3; + pssData.unk84 = gTasks[taskId].func; + gTasks[taskId].func = sub_809F43C; + } +} +#else +__attribute__((naked)) +static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + lsls r1, 24\n\ + lsrs r4, r1, 24\n\ + ldr r0, _0809F1E4 @ =gSharedMem + 0x18000\n\ + ldrb r1, [r0, 0xE]\n\ + adds r2, r0, 0\n\ + cmp r1, 0x1\n\ + bne _0809F202\n\ + ldrb r0, [r2, 0xB]\n\ + cmp r0, 0\n\ + beq _0809F1E8\n\ + lsls r1, r4, 24\n\ + asrs r1, 24\n\ + movs r4, 0x1\n\ + eors r1, r4\n\ + negs r0, r1\n\ + orrs r0, r1\n\ + lsrs r4, r0, 31\n\ + b _0809F1F4\n\ + .align 2, 0\n\ +_0809F1E4: .4byte gSharedMem + 0x18000\n\ +_0809F1E8:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r4, 0x3\n\ + cmp r0, 0x1\n\ + bne _0809F1F4\n\ + movs r4, 0x2\n\ +_0809F1F4:\n\ + ldr r0, [r2]\n\ + ldrb r1, [r2, 0x9]\n\ + ldrb r2, [r2, 0xA]\n\ + adds r3, r4, 0\n\ + bl StorageSystemGetNextMonIndex\n\ + b _0809F22C\n\ +_0809F202:\n\ + bl sub_80F9344\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0809F224\n\ + bl IsLinkDoubleBattle\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0809F224\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + bl sub_809F3CC\n\ + b _0809F22C\n\ +_0809F224:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + bl sub_809F284\n\ +_0809F22C:\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + beq _0809F270\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + ldr r5, _0809F278 @ =gSharedMem + 0x18010\n\ + adds r0, r5, 0\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0809F258\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + bl sub_80A12D0\n\ +_0809F258:\n\ + adds r0, r5, 0\n\ + subs r0, 0x10\n\ + strb r4, [r0, 0x9]\n\ + ldr r1, _0809F27C @ =gTasks\n\ + lsls r0, r6, 2\n\ + adds r0, r6\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + str r1, [r5, 0x74]\n\ + ldr r1, _0809F280 @ =sub_809F43C\n\ + str r1, [r0]\n\ +_0809F270:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809F278: .4byte gSharedMem + 0x18010\n\ +_0809F27C: .4byte gTasks\n\ +_0809F280: .4byte sub_809F43C\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING +s8 sub_809F284(s8 a) +{ + struct Pokemon *mons = pssData.monList.partyMons; + s8 r6 = 0; + + if (pssData.page == PSS_PAGE_INFO) + { + if (a == -1 && pssData.monIndex == 0) + return -1; + if (a == 1 && pssData.monIndex >= pssData.maxMonIndex) + return -1; + return pssData.monIndex + a; + } + else + { + do + { + r6 += a; + if (pssData.monIndex + r6 < 0 || pssData.monIndex + r6 > pssData.maxMonIndex) + return -1; + } while (GetMonData(&mons[pssData.monIndex + r6], MON_DATA_IS_EGG) != 0); + return pssData.monIndex + r6; + } +} +#else +__attribute__((naked)) +s8 sub_809F284(s8 a) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + ldr r0, _0809F2C0 @ =gSharedMem + 0x18000\n\ + ldr r7, [r0]\n\ + movs r6, 0\n\ + ldrb r1, [r0, 0xB]\n\ + adds r4, r0, 0\n\ + cmp r1, 0\n\ + bne _0809F2C4\n\ + lsls r0, r3, 24\n\ + asrs r2, r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + adds r5, r0, 0\n\ + cmp r2, r1\n\ + bne _0809F2AC\n\ + ldrb r0, [r4, 0x9]\n\ + cmp r0, 0\n\ + beq _0809F2E4\n\ +_0809F2AC:\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x1\n\ + bne _0809F2BA\n\ + ldrb r0, [r4, 0x9]\n\ + ldrb r1, [r4, 0xA]\n\ + cmp r0, r1\n\ + bcs _0809F2E4\n\ +_0809F2BA:\n\ + ldrb r0, [r4, 0x9]\n\ + adds r0, r3\n\ + b _0809F304\n\ + .align 2, 0\n\ +_0809F2C0: .4byte gSharedMem + 0x18000\n\ +_0809F2C4:\n\ + lsls r5, r3, 24\n\ +_0809F2C6:\n\ + lsls r0, r6, 24\n\ + asrs r0, 24\n\ + asrs r1, r5, 24\n\ + adds r0, r1\n\ + lsls r0, 24\n\ + ldr r4, _0809F2EC @ =gSharedMem + 0x18000\n\ + lsrs r6, r0, 24\n\ + asrs r0, 24\n\ + ldrb r2, [r4, 0x9]\n\ + adds r1, r0, r2\n\ + cmp r1, 0\n\ + blt _0809F2E4\n\ + ldrb r0, [r4, 0xA]\n\ + cmp r1, r0\n\ + ble _0809F2F0\n\ +_0809F2E4:\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _0809F308\n\ + .align 2, 0\n\ +_0809F2EC: .4byte gSharedMem + 0x18000\n\ +_0809F2F0:\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + adds r0, r7, r0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0809F2C6\n\ + ldrb r0, [r4, 0x9]\n\ + adds r0, r6\n\ +_0809F304:\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ +_0809F308:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +bool8 sub_809F310(struct Pokemon *mon) +{ + if (GetMonData(mon, MON_DATA_SPECIES)) + { + if (pssData.page != PSS_PAGE_INFO || !GetMonData(mon, MON_DATA_IS_EGG)) + return TRUE; + } + return FALSE; +} + +s8 sub_809F344(u8 partyIndex) +{ + while (1) + { + partyIndex++; + if (partyIndex == PARTY_SIZE) + return -1; + if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE) + return sDoubleBattlePartyOrder[partyIndex]; + } +} + +s8 sub_809F388(u8 partyIndex) +{ + while (1) + { + if (partyIndex == 0) + return -1; + partyIndex--; + if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE) + return sDoubleBattlePartyOrder[partyIndex]; + } +} + +s8 sub_809F3CC(s8 direction) +{ + u8 i; + u8 monIndex = 0; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (sDoubleBattlePartyOrder[i] == pssData.monIndex) + { + monIndex = i; + break; + } + } + + if ((direction == -1 && monIndex == 0) || (direction == 1 && monIndex == 5)) + return -1; + if (direction != 1) + return sub_809F388(monIndex); + else if (monIndex != 5) + return sub_809F344(monIndex); + + return -1; +} + +void sub_809F43C(u8 taskId) +{ + switch (gMain.state) + { + case 0: + StopCryAndClearCrySongs(); + gMain.state++; + break; + case 1: + DestroySpriteAndFreeResources(&gSprites[pssData.monSpriteId]); + gMain.state++; + break; + case 2: + DestroySpriteAndFreeResources(&gSprites[pssData.ballSpriteId]); + gMain.state++; + break; + case 3: + pssData.loadGfxState = 0; + pssData.selectedMoveIndex = 0; + gMain.state++; + break; + case 4: + sub_809F678(&pssData.loadedMon); + if (GetMonStatusAndPokerus(&pssData.loadedMon)) + sub_80A12D0(2); + DrawPokerusSurvivorDot(&pssData.loadedMon); + gMain.state++; + break; + case 5: + if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF) + { + pssData.loadGfxState = 0; + if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) + gBattle_BG3_X = 256; + else + gBattle_BG3_X = 0; + gMain.state++; + } + break; + case 6: + sub_80A1DCC(&pssData.loadedMon); + gMain.state++; + break; + case 7: + sub_80A1DE8(&pssData.loadedMon); + gMain.state++; + break; + case 8: + if (sub_809F5F8()) + { + pssData.loadGfxState = 0; + gMain.state++; + } + break; + default: + if (sub_8055870() != TRUE) + { + gMain.state = 0; + gTasks[taskId].func = pssData.unk84; + } + break; + } +} + +static bool8 sub_809F5F8(void) +{ + if (pssData.loadGfxState == 0) + { + sub_809FAC8(&pssData.loadedMon); + pssData.loadGfxState++; + return FALSE; + } + else + { + sUnknown_083C1588[pssData.page](&pssData.loadedMon); + return TRUE; + } +} + +static void sub_809F63C(struct Pokemon *mon) +{ + sub_809FE80(); + sub_809FC34(mon); +} + +static void sub_809F650(struct Pokemon *mon) +{ + sub_80A00A4(); + sub_809FF64(mon); +} + +static void sub_809F664(struct Pokemon *mon) +{ + sub_80A0390(); + sub_80A015C(mon); +} + +static void sub_809F678(struct Pokemon *mon) +{ + if (pssData.usingPC == FALSE) + { + struct Pokemon *mons = pssData.monList.partyMons; + *mon = mons[pssData.monIndex]; + } + else + { + struct BoxPokemon *mons = pssData.monList.boxMons; + ExpandBoxMon(&mons[pssData.monIndex], mon); + } +} + +static u8 sub_809F6B4(struct Pokemon *mon, u8 *b) +{ + u16 species; + u32 personality; + u32 otId; + const struct CompressedSpritePalette *palette; + + switch (*b) + { + default: + return sub_80A1808(mon); + case 0: + species = GetMonData(mon, MON_DATA_SPECIES2); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + ewram_addr, + gUnknown_081FAF4C[1], + species, + personality); + *b += 1; + return 0xFF; + case 1: + species = GetMonData(mon, MON_DATA_SPECIES2); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + otId = GetMonData(mon, MON_DATA_OT_ID); + + palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); + LoadCompressedObjectPalette(palette); + GetMonSpriteTemplate_803C56C(palette->tag, 1); + *b += 1; + return 0xFF; + } +} + +static u16 GetMonMove(struct Pokemon *mon, u8 moveId) +{ + switch (moveId) + { + case 0: + return GetMonData(mon, MON_DATA_MOVE1); + case 1: + return GetMonData(mon, MON_DATA_MOVE2); + case 2: + return GetMonData(mon, MON_DATA_MOVE3); + default: + return GetMonData(mon, MON_DATA_MOVE4); + } +} + +static u16 GetMonMovePP(struct Pokemon *mon, u8 moveId) +{ + switch (moveId) + { + case 0: + return GetMonData(mon, MON_DATA_PP1); + case 1: + return GetMonData(mon, MON_DATA_PP2); + case 2: + return GetMonData(mon, MON_DATA_PP3); + default: + return GetMonData(mon, MON_DATA_PP4); + } +} + +static bool8 sub_809F7D0(u8 taskId) +{ + struct Pokemon mon; + u16 move; + + sub_809F678(&mon); + move = GetMonMove(&mon, pssData.selectedMoveIndex); + if (IsHMMove(move) == TRUE && pssData.mode != PSS_MODE_UNKNOWN) + return FALSE; + return TRUE; +} + +void sub_809F814(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (taskData[14] < 4) + { + taskData[14]++; + } + else if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].func = sub_809E260; + taskData[0] = 4; + taskData[13] = 1; + pssData.selectedMoveIndex = taskData[15]; + sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].func = sub_809E260; + taskData[0] = 4; + taskData[13] = 1; + pssData.selectedMoveIndex = taskData[15]; + sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex); + } + else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) + { + if (pssData.page != PSS_PAGE_BATTLE_MOVES) + { + if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) + Menu_EraseWindowRect(0, 14, 9, 18); + + gTasks[taskId].func = sub_809E260; + + SummaryScreenHandleLeftRightInput(taskId, -1); + sub_80A1488(1, taskData[15]); + sub_80A1654(1, taskData[15]); + } + } + else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) + { + if (pssData.page != pssData.lastPage) + { + if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) + Menu_EraseWindowRect(0, 14, 9, 18); + + gTasks[taskId].func = sub_809E260; + + SummaryScreenHandleLeftRightInput(taskId, 1); + sub_80A1488(1, taskData[15]); + sub_80A1654(1, taskData[15]); + } + } + else if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + sub_80A1488(2, taskData[15]); + sub_80A1654(2, taskData[15]); + + gTasks[taskId].func = sub_809E260; + } +} + +static void sub_809F9D0(u8 taskId, u8 b) +{ + s16 *taskData = gTasks[taskId].data; + taskData[14] = 0; + taskData[15] = b; + + sub_80A1488(-2, 4); + sub_80A1654(-2, 4); + Menu_EraseWindowRect(11, 15, 28, 18); + Menu_PrintText(gOtherText_CantForgetHMs, 11, 15); + + gTasks[taskId].func = sub_809F814; +} + +u8 sub_809FA30(void) +{ + return pssData.switchMoveIndex; +} + +// void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d) +// { +// u16 *vramAddr = (u16 *)(VRAM + 0xF000); + +// vramAddr[(d * 32) + c] = (b * 0x1000) + (a * 2) + 0x200 + 0x80; +// vramAddr[(d * 32) + c + 32] = (b * 0x1000) + (a * 2) + 0x200 + 0x81; +// } +__attribute__((naked)) +void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + lsls r0, 24\n\ + lsls r1, 24\n\ + lsls r2, 24\n\ + lsls r3, 24\n\ + lsrs r2, 23\n\ + lsrs r3, 18\n\ + ldr r4, _0809FA70 @ =0x0600f000\n\ + adds r3, r4\n\ + adds r2, r3\n\ + lsrs r1, 12\n\ + lsrs r0, 23\n\ + movs r4, 0x80\n\ + lsls r4, 2\n\ + adds r3, r4, 0\n\ + adds r0, r3\n\ + adds r1, r0\n\ + adds r0, r1, 0\n\ + adds r0, 0x80\n\ + strh r0, [r2]\n\ + adds r2, 0x40\n\ + adds r1, 0x81\n\ + strh r1, [r2]\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809FA70: .4byte 0x0600f000\n\ + .syntax divided\n"); +} + +void GetStringCenterAlignXOffset(u8 a, u8 b, u8 c) +{ + GetStringCenterAlignXOffsetWithLetterSpacing(a, 15, b, c); +} + +bool8 sub_809FA94(struct Pokemon *mon) +{ + if (!IsShiny(mon)) + { + LoadPalette(sUnknown_083C157C, 4, 2); + return FALSE; + } + else + { + LoadPalette(sUnknown_083C157E, 4, 2); + return TRUE; + } +} + +static void sub_809FAC8(struct Pokemon *mon) +{ + bool8 shinyDexNum; + u16 dexNum; + u8 *buffer; + + if (GetMonData(mon, MON_DATA_IS_EGG)) + { + Menu_EraseWindowRect(1, 2, 4, 3); + Menu_EraseWindowRect(3, 16, 9, 17); + Menu_EraseWindowRect(0, 12, 11, 15); + GetMonNickname(mon, gStringVar1); + sub_80A1FF8(gStringVar1, 13, 3, 16); + LoadPalette(sUnknown_083C157C, 4, 2); + } + else + { + shinyDexNum = sub_809FA94(mon); + dexNum = SpeciesToPokedexNum(GetMonData(mon, MON_DATA_SPECIES)); + if (dexNum != 0xFFFF) + { + if (!shinyDexNum) + { + GetStringCenterAlignXOffset(2, 1, 2); + sub_80A1F98(dexNum, 13, 3, 2, 17, 16, 1); + } + else + { + GetStringCenterAlignXOffsetWithLetterSpacing(2, 8, 1, 2); + sub_80A1F98(dexNum, 8, 3, 2, 17, 16, 1); + } + } + else + { + Menu_EraseWindowRect(1, 2, 4, 3); + } + + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer = GetMonNickname(mon, buffer); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x3C; + buffer[3] = EOS; + Menu_PrintText(gStringVar1, 1, 12); + + sub_80A0958(mon); + } +} + +static void sub_809FBE4(void) +{ + u8 i; + + for (i = 0; i < 28; i++) + sub_80A1918(i, 1); + + Menu_EraseWindowRect(11, 4, 29, 18); +} + +static void sub_809FC0C(void) +{ + Menu_PrintText(gOtherText_Type2, 11, 6); + GetStringCenterAlignXOffset(0, 22, 4); + GetStringCenterAlignXOffset(2, 23, 4); +} + +static void sub_809FC34(struct Pokemon *mon) +{ + u8 i; + u8 *buffer; + u16 friendship; + u8 language; + u16 species; + u8 ability; + + for (i = 0; i < 5; i++) + sub_80A1918(i, 1); + + Menu_EraseWindowRect(11, 9, 28, 12); + if (GetMonData(mon, MON_DATA_IS_EGG)) + { + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer = StringCopy(buffer, gOtherText_OriginalTrainer); + buffer = StringCopy(buffer, gOtherText_FiveQuestions); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x4E; + buffer[3] = EOS; + Menu_PrintText(gStringVar1, 11, 4); + + sub_80A1EF8(gOtherText_FiveQuestions, 13, 193, 32, 1); + sub_80A198C(9, 120, 48, 0); + + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); + if (friendship < 6) + Menu_PrintText(gOtherText_EggAbout, 11, 9); + else if (friendship < 11) + Menu_PrintText(gOtherText_EggSoon, 11, 9); + else if (friendship < 41) + Menu_PrintText(gOtherText_EggSomeTime, 11, 9); + else + Menu_PrintText(gOtherText_EggLongTime, 11, 9); + + PokemonSummaryScreen_PrintEggTrainerMemo(mon, 11, 14); + } + else + { + GetMonData(mon, MON_DATA_OT_NAME, gStringVar2); + language = GetMonData(mon, MON_DATA_LANGUAGE); + ConvertInternationalString(gStringVar2, language); + + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer = StringCopy(buffer, gOtherText_OriginalTrainer); + + if (GetMonData(mon, MON_DATA_OT_GENDER) == MALE) + buffer = sub_80A1E58(buffer, 9); + else + buffer = sub_80A1E58(buffer, 10); + + buffer = StringCopy(buffer, gStringVar2); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x4E; + buffer[3] = EOS; + Menu_PrintText(gStringVar1, 11, 4); + + sub_80A1F98(GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF, 13, 5, 2, 193, 32, 1); + + species = GetMonData(mon, MON_DATA_SPECIES); + sub_80A198C(gBaseStats[species].type1, 120, 48, 0); + if (gBaseStats[species].type1 != gBaseStats[species].type2) + sub_80A198C(gBaseStats[species].type2, 160, 48, 1); + + ability = GetAbilityBySpecies(GetMonData(mon, MON_DATA_SPECIES), GetMonData(mon, MON_DATA_ALT_ABILITY)); + sub_80A1FF8(gAbilityNames[ability], 13, 11, 9); + Menu_PrintText(gAbilityDescriptions[ability], 11, 11); + + PokemonSummaryScreen_PrintTrainerMemo(mon, 11, 14); + } +} + +static void sub_809FE6C(struct Pokemon *mon) +{ + sub_809FC0C(); + sub_809FC34(mon); +} + +static void sub_809FE80(void) +{ + Menu_EraseWindowRect(14, 4, 18, 5); + Menu_EraseWindowRect(25, 4, 30, 5); + Menu_EraseWindowRect(11, 9, 28, 12); + Menu_EraseWindowRect(11, 14, 28, 17); +} + +static void sub_809FEB8(void) +{ + sub_80A1FF8(gOtherText_ExpPoints, 13, 11, 14); + sub_80A1FF8(gOtherText_NextLv, 13, 11, 16); + Menu_PrintText(gOtherText_Terminator18, 21, 16); + + sub_80A1F48(gOtherText_HP, 13, 11, 7, 42); + sub_80A1F48(gOtherText_Attack, 13, 11, 9, 42); + sub_80A1F48(gOtherText_Defense, 13, 11, 11, 42); + sub_80A1F48(gOtherText_SpAtk, 13, 22, 7, 36); + sub_80A1F48(gOtherText_SpDef, 13, 22, 9, 36); + sub_80A1F48(gOtherText_Speed, 13, 22, 11, 36); +} + +static void sub_809FF64(struct Pokemon *mon) +{ + u8 i; + u16 heldItem; + u8 *buffer; + + for (i = 0; i < 5; i++) + sub_80A1918(i, 1); + + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + PrintHeldItemName(heldItem, 11, 4); + PrintNumRibbons(mon); + + buffer = gStringVar1; + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_EXP)); + MenuPrint_RightAligned(buffer, 29, 14); + DrawExperienceProgressBar(mon, 23, 16); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_ATK)); + sub_8072BD8(buffer, 16, 9, 50); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_DEF)); + sub_8072BD8(buffer, 16, 11, 50); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPATK)); + sub_8072BD8(buffer, 27, 7, 18); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPDEF)); + sub_8072BD8(buffer, 27, 9, 18); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPEED)); + sub_8072BD8(buffer, 27, 11, 18); + + buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_HP), 24, 1); + *buffer++ = CHAR_SLASH; + buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_MAX_HP), 48, 1); + + Menu_PrintTextPixelCoords(gStringVar1, 126, 56, 1); +} + +static void sub_80A0090(struct Pokemon *mon) +{ + sub_809FEB8(); + sub_809FF64(mon); +} + +static void sub_80A00A4(void) +{ + Menu_EraseWindowRect(11, 4, 19, 5); + Menu_EraseWindowRect(16, 7, 21, 8); + Menu_EraseWindowRect(17, 9, 21, 12); + Menu_EraseWindowRect(27, 7, 29, 12); + Menu_EraseWindowRect(22, 14, 28, 15); + Menu_EraseWindowRect(23, 16, 28, 17); +} + +static void sub_80A00F4(u8 a) +{ + if (pssData.moveToLearn != 0 || a != 4) + { + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + sub_80A1FF8(gOtherText_Power2, 13, 1, 15); + sub_80A1FF8(gOtherText_Accuracy2, 13, 1, 17); + } + else + { + sub_80A1FF8(gOtherText_Appeal2, 13, 1, 15); + sub_80A1FF8(gOtherText_Jam2, 13, 1, 17); + } + } +} + +static void sub_80A015C(struct Pokemon *mon) +{ + u8 i; + u16 move; + u16 curPP; + u8 ppBonuses; + u8 maxPP; + u8 *buffer; + + for (i = 0; i < 4; i++) + { + move = GetMonMove(mon, i); + curPP = GetMonMovePP(mon, i); + + if (move == 0) + { + sub_80A1918(i, 1); + sub_80A1FF8(gOtherText_OneDash, 13, 15, (2 * i) + 4); + Menu_PrintText(gOtherText_TwoDashes, 26, (2 * i) + 4); + } + else + { + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + sub_80A198C(gBattleMoves[move].type, 87, ((2 * i) + 4) * 8, i); + else + sub_80A198C(gContestMoves[move].contestCategory + 18, 87, ((2 * i) + 4) * 8, i); + + sub_80A1FF8(gMoveNames[move], 13, 15, (2 * i) + 4); + GetStringCenterAlignXOffset(1, 24, (2 * i) + 4); + + ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + maxPP = CalculatePPWithBonus(move, ppBonuses, i); + + buffer = gStringVar1; + buffer = sub_8072C14(buffer, curPP, 14, 1); + *buffer++ = CHAR_SLASH; + sub_8072C14(buffer, maxPP, 32, 1); + Menu_PrintText(gStringVar1, 25, (2 * i) + 4); + } + } +} + +static void sub_80A029C(struct Pokemon *mon) +{ + u8 *buffer; + u16 move; + u8 pp; + + if (pssData.moveToLearn == 0) + { + sub_80A1FF8(gOtherText_CancelNoTerminator, 13, 15, 12); + return; + } + + move = pssData.moveToLearn; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + sub_80A198C(gBattleMoves[move].type, 87, 96, 4); + else + sub_80A198C(gContestMoves[move].contestCategory + 18, 87, 96, 4); + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + sub_80A1FF8(gMoveNames[move], 10, 15, 12); + else + sub_80A1FF8(gMoveNames[move], 9, 15, 12); + + GetStringCenterAlignXOffset(1, 24, 12); + + buffer = gStringVar1; + pp = gBattleMoves[move].pp; + buffer = sub_8072C14(buffer, pp, 14, 1); + *buffer++ = CHAR_SLASH; + buffer = sub_8072C14(buffer, pp, 32, 1); + Menu_PrintText(gStringVar1, 25, 12); +} + +static void sub_80A0390(void) +{ + u8 i; + + for (i = 0; i < MAX_MON_MOVES; i++) + Menu_EraseWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5); +} + +u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex) +{ + u16 move; + + if (selectedMoveIndex != MAX_MON_MOVES) + { + move = GetMonMove(mon, selectedMoveIndex); + } + else + { + if (pssData.moveToLearn != 0) + move = pssData.moveToLearn; + else + move = 0xFFFF; + } + + return move; +} + +void sub_80A03F0(struct Pokemon *mon, u8 *selectedMoveIndex) +{ + u16 move = sub_80A03BC(mon, *selectedMoveIndex); + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + sub_80A04CC(move); + sub_80A057C(0xFFFF); + } + else + { + sub_80A057C(move); + } +} + +static void sub_80A0428(struct Pokemon *mon, u8 *selectedMoveIndex) +{ + u16 move = sub_80A03BC(mon, *selectedMoveIndex); + Menu_EraseWindowRect(11, 15, 28, 18); + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + sub_80A046C(move); + else + sub_80A0498(move); + + sub_80A03F0(mon, selectedMoveIndex); +} + +static void sub_80A046C(u16 move) +{ + if (move != 0xFFFF) + Menu_PrintText(gMoveDescriptions[move - 1], 11, 15); +} + +static void sub_80A0498(u16 move) +{ + if (move != 0xFFFF) + Menu_PrintText(gContestEffectStrings[gContestMoves[move].effect], 11, 15); +} + +static void sub_80A04CC(u16 move) +{ + u8 *buffer; + + if (move != 0xFFFF) + { + if (gBattleMoves[move].power <= 1) + { + buffer = gStringVar1; + buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); + Menu_PrintText(gStringVar1, 7, 15); + } + else + { + buffer = gStringVar1; + buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1); + Menu_PrintText(gStringVar1, 7, 15); + } + + if (gBattleMoves[move].accuracy == 0) + { + buffer = gStringVar1; + buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); + Menu_PrintText(gStringVar1, 7, 17); + } + else + { + buffer = gStringVar1; + buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1); + Menu_PrintText(gStringVar1, 7, 17); + } + } +} + +#ifdef NONMATCHING // The two vramAddr lines are non-matching. +static void sub_80A057C(u16 move) +{ + u8 appeal; + u8 jam; + u8 i; + u16 *vramAddr = (u16 *)(VRAM + 0x6800); + + if (move == 0xFFFF) return; + + appeal = gContestEffects[gContestMoves[move].effect].appeal; + if (appeal != 0xFF) + appeal = appeal / 10; + + for (i = 0; i < 8; i++) + { + u16 tile = 0x1039; + int and = 3; + int offset = 0x3CC / 2; + if (appeal != 0xFF && i < appeal) + tile = 0x103A; + + *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile; + } + + if (move == 0xFFFF) return; + + jam = gContestEffects[gContestMoves[move].effect].jam; + if (jam != 0xFF) + { + jam = jam / 10; + } + + for (i = 0; i < 8; i++) + { + u16 tile = 0x103D; + int and = 3; + int offset = 0x226; + if (jam != 0xFF && i < jam) + { + tile = 0x103C; + } + + *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile; + } +} +#else +__attribute__((naked)) +static void sub_80A057C(u16 move) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldr r0, _080A0648 @ =0x06006800\n\ + mov r8, r0\n\ + ldr r0, _080A064C @ =0x0000ffff\n\ + cmp r5, r0\n\ + beq _080A063A\n\ + ldr r1, _080A0650 @ =gContestEffects\n\ + ldr r2, _080A0654 @ =gContestMoves\n\ + lsls r3, r5, 3\n\ + adds r0, r3, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r4, [r0, 0x1]\n\ + mov r10, r2\n\ + mov r9, r3\n\ + cmp r4, 0xFF\n\ + beq _080A05B8\n\ + adds r0, r4, 0\n\ + movs r1, 0xA\n\ + bl __udivsi3\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ +_080A05B8:\n\ + movs r2, 0\n\ + movs r7, 0x3\n\ + movs r6, 0xF3\n\ + lsls r6, 2\n\ +_080A05C0:\n\ + ldr r3, _080A0658 @ =0x00001039\n\ + cmp r4, 0xFF\n\ + beq _080A05CC\n\ + cmp r2, r4\n\ + bcs _080A05CC\n\ + adds r3, 0x1\n\ +_080A05CC:\n\ + lsrs r0, r2, 2\n\ + lsls r0, 5\n\ + adds r1, r2, 0\n\ + ands r1, r7\n\ + adds r1, r0\n\ + lsls r1, 1\n\ + add r1, r8\n\ + adds r1, r6\n\ + strh r3, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r2, 0x7\n\ + bls _080A05C0\n\ + ldr r0, _080A064C @ =0x0000ffff\n\ + cmp r5, r0\n\ + beq _080A063A\n\ + mov r0, r9\n\ + add r0, r10\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + ldr r1, _080A0650 @ =gContestEffects\n\ + adds r0, r1\n\ + ldrb r4, [r0, 0x2]\n\ + cmp r4, 0xFF\n\ + beq _080A060C\n\ + adds r0, r4, 0\n\ + movs r1, 0xA\n\ + bl __udivsi3\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ +_080A060C:\n\ + movs r2, 0\n\ + movs r6, 0x3\n\ + ldr r5, _080A065C @ =0x0000044c\n\ +_080A0612:\n\ + ldr r3, _080A0660 @ =0x0000103d\n\ + cmp r4, 0xFF\n\ + beq _080A061E\n\ + cmp r2, r4\n\ + bcs _080A061E\n\ + subs r3, 0x1\n\ +_080A061E:\n\ + lsrs r0, r2, 2\n\ + lsls r0, 5\n\ + adds r1, r2, 0\n\ + ands r1, r6\n\ + adds r1, r0\n\ + lsls r1, 1\n\ + add r1, r8\n\ + adds r1, r5\n\ + strh r3, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r2, 0x7\n\ + bls _080A0612\n\ +_080A063A:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A0648: .4byte 0x06006800\n\ +_080A064C: .4byte 0x0000ffff\n\ +_080A0650: .4byte gContestEffects\n\ +_080A0654: .4byte gContestMoves\n\ +_080A0658: .4byte 0x00001039\n\ +_080A065C: .4byte 0x0000044c\n\ +_080A0660: .4byte 0x0000103d\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon) +{ + u32 trainerId; + + if (ewram18000_3 == gEnemyParty) + { + u8 enemyId = GetMultiplayerId() ^ 1; + trainerId = gLinkPlayers[enemyId].trainerId & 0xFFFF; + StringCopy(gStringVar1, gLinkPlayers[enemyId].name); + Text_StripExtCtrlCodes(gStringVar1); + } + else + { + trainerId = GetPlayerTrainerId() & 0xFFFF; + StringCopy(gStringVar1, gSaveBlock2.playerName); + } + + if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF)) + return FALSE; + + GetMonData(mon, MON_DATA_OT_NAME, gStringVar2); + + if (!StringCompareWithoutExtCtrlCodes(gStringVar1, gStringVar2)) + return TRUE; + + return FALSE; +} + +static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top) +{ + u8 locationMet; + u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME); + + if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) + { + Menu_PrintText(gOtherText_EggObtainedInTrade, left, top); + return; + } + + locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); + + if (locationMet == 255) + { + // Eggs received from Pokemon Box. + Menu_PrintText(gOtherText_EggNicePlace, left, top); + return; + } + + if (!PokemonSummaryScreen_CheckOT(mon)) + { + Menu_PrintText(gOtherText_EggObtainedInTrade, left, top); + return; + } + + asm(""); // needed to match for some reason + + if (locationMet == 253) + { + Menu_PrintText(gOtherText_EggHotSprings, left, top); + return; + } + + Menu_PrintText(gOtherText_EggDayCare, left, top); +} + +static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left, u8 top) +{ + u8 locationMet; + u8 gameMet; + u8 *ptr = gStringVar4; + u8 nature = GetNature(mon); + +#if ENGLISH + ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); + if (nature != NATURE_BOLD && nature != NATURE_GENTLE) + ptr = StringCopy(ptr, gOtherText_Terminator4); + ptr = StringCopy(ptr, gOtherText_Nature); +#elif GERMAN + ptr = StringCopy(gStringVar4, gOtherText_Nature); + ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); + ptr = StringCopy(ptr, gOtherText_Terminator4); +#endif + + if (PokemonSummaryScreen_CheckOT(mon) == TRUE) + { + locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); + + if (GetMonData(mon, MON_DATA_MET_LEVEL) == 0) + { + ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5); + *ptr = CHAR_NEWLINE; + ptr++; + + CopyLocationName(gStringVar1, locationMet); + ptr = sub_80A1E9C(ptr, gStringVar1, 14); + StringCopy(ptr, gOtherText_Egg2); + } + else if (locationMet >= 88) + { + *ptr = CHAR_NEWLINE; + ptr++; + + StringCopy(ptr, gOtherText_ObtainedInTrade); + } + else + { + u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); + + ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); + *ptr = CHAR_NEWLINE; + ptr++; + + CopyLocationName(gStringVar1, locationMet); + ptr = sub_80A1E9C(ptr, gStringVar1, 14); + StringCopy(ptr, gOtherText_Met); + } + } + else + { + gameMet = GetMonData(mon, MON_DATA_MET_GAME); + + if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) + { + *ptr = CHAR_NEWLINE; + ptr++; + + StringCopy(ptr, gOtherText_ObtainedInTrade); + } + else + { + locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); + if (locationMet == 0xFF) + { + u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); + + ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); + *ptr = CHAR_NEWLINE; + ptr++; + + StringCopy(ptr, gOtherText_FatefulEncounter); + } + else if (locationMet >= 88) + { + *ptr = CHAR_NEWLINE; + ptr++; + + StringCopy(ptr, gOtherText_ObtainedInTrade); + } + else + { + u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); + + ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); + *ptr = CHAR_NEWLINE; + ptr++; + + CopyLocationName(gStringVar1, locationMet); + ptr = sub_80A1E9C(ptr, gStringVar1, 14); + StringCopy(ptr, gOtherText_Met2); + } + } + } + + Menu_PrintText(gStringVar4, left++, top++); +} + +static void sub_80A0958(struct Pokemon *mon) +{ + u16 species; + u8 *buffer; + u8 level; + + species = GetMonData(mon, MON_DATA_SPECIES); + + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x11; + buffer[2] = 0x7; + buffer[3] = CHAR_SLASH; + buffer += 4; + buffer = StringCopy(buffer, gSpeciesNames[species]); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x50; + buffer[3] = EOS; + + Menu_PrintText(gStringVar1, 0, 14); + Menu_EraseWindowRect(3, 16, 9, 17); + + level = GetMonData(mon, MON_DATA_LEVEL); + + buffer = sub_80A1E58(gStringVar1, 13); + buffer[0] = 0x34; + buffer += 1; + buffer = ConvertIntToDecimalString(buffer, level); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x20; + buffer[3] = EOS; + + Menu_PrintText(gStringVar1, 3, 16); + sub_80A0A2C(mon, 7, 16); +} + +static void sub_80A0A2C(struct Pokemon *mon, u8 left, u8 top) +{ + const u8 *genderSymbol; + u8 var1; + u8 bottom; + u16 species = GetMonData(mon, MON_DATA_SPECIES2); + + if (species != SPECIES_NIDORAN_M && species != SPECIES_NIDORAN_F) + { + u8 gender = GetMonGender(mon); + switch (gender) + { + default: + bottom = top + 1; + Menu_EraseWindowRect(left, top, left, bottom); + return; + case MON_MALE: + genderSymbol = gOtherText_MaleSymbol2; + var1 = 11; + break; + case MON_FEMALE: + genderSymbol = gOtherText_FemaleSymbolAndLv; + var1 = 12; + break; + } + + sub_80A1FF8(genderSymbol, var1, left, top); + } +} + +u8 GetNumRibbons(struct Pokemon *mon) +{ + u8 numRibbons = GetMonData(mon, MON_DATA_COOL_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_BEAUTY_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_CUTE_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_SMART_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_TOUGH_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_CHAMPION_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_WINNING_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_VICTORY_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_ARTIST_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_EFFORT_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_1); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_2); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_3); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_4); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_5); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_6); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_7); + + return numRibbons; +} + +static void PrintNumRibbons(struct Pokemon *mon) +{ + u8 numRibbons = GetNumRibbons(mon); + + if (numRibbons == 0) + { + StringCopy(gStringVar1, gOtherText_None); + } + else + { + u8 ribbonsStringLength; + u8 *text; + + StringCopy(gStringVar1, gOtherText_Ribbons00); + ribbonsStringLength = StringLength(gStringVar1); + + text = &gStringVar1[ribbonsStringLength - 2]; + + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 0x14; + text[2] = 6; + ConvertIntToDecimalStringN(&text[3], numRibbons, 1, 2); + } + + Menu_PrintText(sUnknown_083C15AE, 21, 4); +} + +static void PrintHeldItemName(u16 itemId, u8 left, u8 top) +{ + if (itemId == ITEM_ENIGMA_BERRY + && sub_80F9344() == TRUE + && IsLinkDoubleBattle() == TRUE + && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5)) + StringCopy(gStringVar1, ItemId_GetName(itemId)); + else if (itemId == 0) + StringCopy(gStringVar1, gOtherText_None); + else + CopyItemName(itemId, gStringVar1); + + Menu_PrintText(sUnknown_083C15B4, left, top); +} + +static void DrawExperienceProgressBar(struct Pokemon *mon, u8 left, u8 top) +{ + u32 curExperience; + u8 level; + u16 species; + u8 i; + u16 *vramAddr; + u32 expToNextLevel = 0; + s64 numExpProgressBarTicks = 0; + + curExperience = GetMonData(mon, MON_DATA_EXP); + level = GetMonData(mon, MON_DATA_LEVEL); + species = GetMonData(mon, MON_DATA_SPECIES); + + // The experience progress bar is shown as empty when the Pokemon is already level 100. + if (level < 100) + { + u32 nextLevelExp; + u32 expSinceLastLevel; + u32 expBetweenLevels; + u32 curLevelExperience; + + nextLevelExp = gExperienceTables[gBaseStats[species].growthRate][level + 1]; + expToNextLevel = nextLevelExp - curExperience; + curLevelExperience = gExperienceTables[gBaseStats[species].growthRate][level]; + expBetweenLevels = (nextLevelExp - curLevelExperience); + expSinceLastLevel = curExperience - curLevelExperience; + + // Calculate the number of 1-pixel "ticks" to illuminate in the experience progress bar. + // There are 8 tiles that make up the bar, and each tile has 8 "ticks". Hence, the numerator + // is multiplied by 64. + numExpProgressBarTicks = (expSinceLastLevel * 64) / expBetweenLevels; + if (numExpProgressBarTicks == 0 && expSinceLastLevel != 0) + { + // Ensure sure some exp. gain is visible in the progress bar. + numExpProgressBarTicks = 1; + } + } + + ConvertIntToDecimalString(gStringVar1, expToNextLevel); + MenuPrint_RightAligned(gStringVar1, left + 6, top); + + + // Draw each of the 8 tiles that make up the experience progress bar. + vramAddr = (u16 *)(VRAM + 0x4CAA); + for (i = 0; i < 8; i++) + { + u16 tile; + u16 baseTile = 0x2062; + + if (numExpProgressBarTicks > 7) + tile = 0x206A; // full exp. bar block + else + tile = (numExpProgressBarTicks % 8) + baseTile; + + vramAddr[i] = tile; + + numExpProgressBarTicks -= 8; + if (numExpProgressBarTicks < 0) + { + numExpProgressBarTicks = 0; + } + } +} + +// Prints the text displayed in the top-left or top-right of the screen. +// Each of the 4 summary screens displays different text. +static void PrintSummaryWindowHeaderText(void) +{ + u8 *buffer = gStringVar1; + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x12; + buffer[2] = 0x2; + + buffer += 3; + buffer = sub_80A1E58(buffer, 13); + buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerTextId]); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x58; + buffer[3] = EOS; + + Menu_PrintText(gStringVar1, 0, 0); + + if (pssData.headerActionTextId != 0) + { + GetStringCenterAlignXOffset(5, 23, 0); + GetStringCenterAlignXOffset(6, 24, 0); + } + else + { + Menu_EraseWindowRect(23, 0, 24, 1); + } + + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerActionTextId]); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x28; + buffer[3] = EOS; + + Menu_PrintText(gStringVar1, 25, 0); +} + +// If the given pokemon previously had the pokerus virus, a small +// dot will be drawn in between the pokeball and the mon's level. +static void DrawPokerusSurvivorDot(struct Pokemon *mon) +{ + u16 *vram1 = (u16 *)(VRAM + 0xE444); + u16 *vram2 = (u16 *)(VRAM + 0xEC44); + + if (!CheckPartyPokerus(mon, 0) && CheckPartyHasHadPokerus(mon, 0)) + { + *vram1 = 0x2C; + *vram2 = 0x2C; + } + else + { + *vram1 = 0x081A; + *vram2 = 0x081A; + } +} + +// Draws the 4 small navigation circles at the top of the pokemon summary screen. +#ifdef NONMATCHING +static void DrawSummaryScreenNavigationDots(void) +{ + void *dest; + u16 arr[8]; + u8 i = 0; + struct PokemonSummaryScreenStruct *SS = (struct PokemonSummaryScreenStruct *)(gSharedMem + 0x18000); + u16 var1 = 0x4040; + u16 var2 = 0x404A; + + for (i = 0; i < 4; i++) + { + if (i < SS->unk75) + { + arr[i * 2] = var1; + arr[(i * 2) + 1] = var1 + 1; + } + else if (i > SS->unk76) + { + arr[i * 2] = var2; + arr[(i * 2) + 1] = var2 + 1; + } + else + { + if (i < SS->unkB) + { + arr[i * 2] = 0x4046; + arr[(i * 2) + 1] = 0x4046 + 1; + } + + if (i == SS->unkB) + { + if (i != SS->unk76) + { + arr[i * 2] = 0x4041; + arr[(i * 2) + 1] = 0x4041 + 1; + } + else + { + arr[i * 2] = 0x404B; + arr[(i * 2) + 1] = 0x404B + 1; + } + } + + if (i > SS->unkB) + { + if (i != SS->unk76) + { + arr[i * 2] = 0x4043; + arr[(i * 2) + 1] = 0x4043 + 1; + } + else + { + arr[i * 2] = 0x4048; + arr[(i * 2) + 1] = 0x4048 + 1; + } + } + } + } + + DmaCopy16Defvars(3, arr, (void *)(VRAM + 0xE016), 16); + + for (i = 0; i < 8; i++) + { + arr[i] += 0x10; + } + + DmaCopy16Defvars(3, arr, (void *)(VRAM + 0xE056), 16); +} +#else +__attribute__((naked)) +static void DrawSummaryScreenNavigationDots(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x10\n\ + movs r3, 0\n\ + ldr r6, _080A0F24 @ =gSharedMem + 0x18000\n\ + adds r5, r6, 0\n\ + ldr r1, _080A0F28 @ =0x00004040\n\ + mov r8, r1\n\ + ldr r2, _080A0F2C @ =0x0000404a\n\ + mov r10, r2\n\ +_080A0F02:\n\ + adds r0, r5, 0\n\ + adds r0, 0x75\n\ + ldrb r0, [r0]\n\ + cmp r3, r0\n\ + bcs _080A0F30\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + add r0, sp\n\ + mov r4, r8\n\ + strh r4, [r0]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + mov r7, sp\n\ + adds r0, r7, r1\n\ + strh r4, [r0]\n\ + b _080A0FE2\n\ + .align 2, 0\n\ +_080A0F24: .4byte gSharedMem + 0x18000\n\ +_080A0F28: .4byte 0x00004040\n\ +_080A0F2C: .4byte 0x0000404a\n\ +_080A0F30:\n\ + movs r0, 0x76\n\ + adds r0, r6\n\ + mov r12, r0\n\ + ldrb r1, [r0]\n\ + cmp r3, r1\n\ + bls _080A0F52\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + add r0, sp\n\ + mov r2, r10\n\ + strh r2, [r0]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + mov r4, sp\n\ + adds r0, r4, r1\n\ + strh r2, [r0]\n\ + b _080A0FE2\n\ +_080A0F52:\n\ + ldrb r4, [r5, 0xB]\n\ + cmp r3, r4\n\ + bcs _080A0F6E\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r7, sp\n\ + adds r2, r7, r0\n\ + ldr r0, _080A0F88 @ =0x00004046\n\ + strh r0, [r2]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + add r1, sp\n\ + adds r0, 0x1\n\ + strh r0, [r1]\n\ +_080A0F6E:\n\ + cmp r3, r4\n\ + bne _080A0FA6\n\ + mov r0, r12\n\ + ldrb r0, [r0]\n\ + cmp r3, r0\n\ + beq _080A0F90\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r4, sp\n\ + adds r2, r4, r0\n\ + ldr r0, _080A0F8C @ =0x00004041\n\ + b _080A0F9A\n\ + .align 2, 0\n\ +_080A0F88: .4byte 0x00004046\n\ +_080A0F8C: .4byte 0x00004041\n\ +_080A0F90:\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r7, sp\n\ + adds r2, r7, r0\n\ + ldr r0, _080A0FC4 @ =0x0000404b\n\ +_080A0F9A:\n\ + strh r0, [r2]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + add r1, sp\n\ + adds r0, 0x1\n\ + strh r0, [r1]\n\ +_080A0FA6:\n\ + ldrb r0, [r5, 0xB]\n\ + cmp r3, r0\n\ + bls _080A0FE2\n\ + adds r0, r6, 0\n\ + adds r0, 0x76\n\ + ldrb r0, [r0]\n\ + cmp r3, r0\n\ + beq _080A0FCC\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r4, sp\n\ + adds r2, r4, r0\n\ + ldr r0, _080A0FC8 @ =0x00004043\n\ + b _080A0FD6\n\ + .align 2, 0\n\ +_080A0FC4: .4byte 0x0000404b\n\ +_080A0FC8: .4byte 0x00004043\n\ +_080A0FCC:\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r7, sp\n\ + adds r2, r7, r0\n\ + ldr r0, _080A1034 @ =0x00004048\n\ +_080A0FD6:\n\ + strh r0, [r2]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + add r1, sp\n\ + adds r0, 0x1\n\ + strh r0, [r1]\n\ +_080A0FE2:\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x3\n\ + bls _080A0F02\n\ + ldr r1, _080A1038 @ =0x0600e016\n\ + ldr r0, _080A103C @ =0x040000d4\n\ + mov r2, sp\n\ + str r2, [r0]\n\ + str r1, [r0, 0x4]\n\ + ldr r1, _080A1040 @ =0x80000008\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + movs r3, 0\n\ +_080A0FFE:\n\ + lsls r0, r3, 1\n\ + mov r4, sp\n\ + adds r1, r4, r0\n\ + ldrh r0, [r1]\n\ + adds r0, 0x10\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x7\n\ + bls _080A0FFE\n\ + ldr r1, _080A1044 @ =0x0600e056\n\ + ldr r0, _080A103C @ =0x040000d4\n\ + str r4, [r0]\n\ + str r1, [r0, 0x4]\n\ + ldr r1, _080A1040 @ =0x80000008\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + add sp, 0x10\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1034: .4byte 0x00004048\n\ +_080A1038: .4byte 0x0600e016\n\ +_080A103C: .4byte 0x040000d4\n\ +_080A1040: .4byte 0x80000008\n\ +_080A1044: .4byte 0x0600e056\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +__attribute__((naked)) +void sub_80A1048(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r0, 2\n\ + add r0, r8\n\ + lsls r0, 3\n\ + ldr r1, _080A10A0 @ =gTasks + 0x8\n\ + adds r6, r0, r1\n\ + ldrh r0, [r6]\n\ + ldrh r1, [r6, 0x2]\n\ + adds r0, r1\n\ + strh r0, [r6, 0x2]\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + bne _080A106E\n\ + b _080A1224\n\ +_080A106E:\n\ + movs r5, 0x2\n\ + ldrsh r2, [r6, r5]\n\ + ldr r0, _080A10A4 @ =0x0000024a\n\ + subs r0, r2\n\ + lsls r0, 1\n\ + ldr r1, _080A10A8 @ =gUnknown_08E73508\n\ + adds r4, r0, r1\n\ + ldr r5, _080A10AC @ =0x0600e480\n\ + lsls r2, 1\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r7, r1, 0\n\ + cmp r2, r0\n\ + bhi _080A10B4\n\ + ldr r0, _080A10B0 @ =0x040000d4\n\ + str r4, [r0]\n\ + str r5, [r0, 0x4]\n\ + lsrs r1, r2, 1\n\ + movs r2, 0x80\n\ + lsls r2, 24\n\ + orrs r1, r2\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + b _080A10E0\n\ + .align 2, 0\n\ +_080A10A0: .4byte gTasks + 0x8\n\ +_080A10A4: .4byte 0x0000024a\n\ +_080A10A8: .4byte gUnknown_08E73508\n\ +_080A10AC: .4byte 0x0600e480\n\ +_080A10B0: .4byte 0x040000d4\n\ +_080A10B4:\n\ + ldr r3, _080A110C @ =0x040000d4\n\ + str r4, [r3]\n\ + str r5, [r3, 0x4]\n\ + ldr r0, _080A1110 @ =0x80000800\n\ + str r0, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r4, r0\n\ + adds r5, r0\n\ + ldr r1, _080A1114 @ =0xfffff000\n\ + adds r2, r1\n\ + cmp r2, r0\n\ + bhi _080A10B4\n\ + str r4, [r3]\n\ + str r5, [r3, 0x4]\n\ + lsrs r0, r2, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + str r0, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ +_080A10E0:\n\ + movs r5, 0x2\n\ + ldrsh r0, [r6, r5]\n\ + ldr r1, _080A1118 @ =0x0000026a\n\ + subs r1, r0\n\ + lsls r1, 1\n\ + adds r3, r1, r7\n\ + ldr r4, _080A111C @ =0x0600e4c0\n\ + lsls r1, r0, 1\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + cmp r1, r0\n\ + bhi _080A1120\n\ + ldr r0, _080A110C @ =0x040000d4\n\ + str r3, [r0]\n\ + str r4, [r0, 0x4]\n\ + lsrs r1, 1\n\ + movs r2, 0x80\n\ + lsls r2, 24\n\ + orrs r1, r2\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + b _080A114C\n\ + .align 2, 0\n\ +_080A110C: .4byte 0x040000d4\n\ +_080A1110: .4byte 0x80000800\n\ +_080A1114: .4byte 0xfffff000\n\ +_080A1118: .4byte 0x0000026a\n\ +_080A111C: .4byte 0x0600e4c0\n\ +_080A1120:\n\ + ldr r2, _080A1178 @ =0x040000d4\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + ldr r0, _080A117C @ =0x80000800\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r3, r0\n\ + adds r4, r0\n\ + ldr r5, _080A1180 @ =0xfffff000\n\ + adds r1, r5\n\ + cmp r1, r0\n\ + bhi _080A1120\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + lsrs r0, r1, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ +_080A114C:\n\ + movs r1, 0x2\n\ + ldrsh r0, [r6, r1]\n\ + ldr r1, _080A1184 @ =0x0000024a\n\ + subs r1, r0\n\ + lsls r1, 1\n\ + adds r3, r1, r7\n\ + ldr r4, _080A1188 @ =0x0600ec80\n\ + lsls r1, r0, 1\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + cmp r1, r0\n\ + bhi _080A118C\n\ + ldr r0, _080A1178 @ =0x040000d4\n\ + str r3, [r0]\n\ + str r4, [r0, 0x4]\n\ + lsrs r1, 1\n\ + movs r2, 0x80\n\ + lsls r2, 24\n\ + orrs r1, r2\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + b _080A11B8\n\ + .align 2, 0\n\ +_080A1178: .4byte 0x040000d4\n\ +_080A117C: .4byte 0x80000800\n\ +_080A1180: .4byte 0xfffff000\n\ +_080A1184: .4byte 0x0000024a\n\ +_080A1188: .4byte 0x0600ec80\n\ +_080A118C:\n\ + ldr r2, _080A11E4 @ =0x040000d4\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + ldr r0, _080A11E8 @ =0x80000800\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r3, r0\n\ + adds r4, r0\n\ + ldr r5, _080A11EC @ =0xfffff000\n\ + adds r1, r5\n\ + cmp r1, r0\n\ + bhi _080A118C\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + lsrs r0, r1, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ +_080A11B8:\n\ + movs r1, 0x2\n\ + ldrsh r0, [r6, r1]\n\ + ldr r1, _080A11F0 @ =0x0000026a\n\ + subs r1, r0\n\ + lsls r1, 1\n\ + adds r3, r1, r7\n\ + ldr r4, _080A11F4 @ =0x0600ecc0\n\ + lsls r1, r0, 1\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + cmp r1, r0\n\ + bhi _080A11F8\n\ + ldr r0, _080A11E4 @ =0x040000d4\n\ + str r3, [r0]\n\ + str r4, [r0, 0x4]\n\ + lsrs r1, 1\n\ + movs r2, 0x80\n\ + lsls r2, 24\n\ + orrs r1, r2\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + b _080A1224\n\ + .align 2, 0\n\ +_080A11E4: .4byte 0x040000d4\n\ +_080A11E8: .4byte 0x80000800\n\ +_080A11EC: .4byte 0xfffff000\n\ +_080A11F0: .4byte 0x0000026a\n\ +_080A11F4: .4byte 0x0600ecc0\n\ +_080A11F8:\n\ + ldr r2, _080A12B0 @ =0x040000d4\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + ldr r0, _080A12B4 @ =0x80000800\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r3, r0\n\ + adds r4, r0\n\ + ldr r5, _080A12B8 @ =0xfffff000\n\ + adds r1, r5\n\ + cmp r1, r0\n\ + bhi _080A11F8\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + lsrs r0, r1, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ +_080A1224:\n\ + ldrb r4, [r6, 0x2]\n\ + ldrh r7, [r6, 0x2]\n\ + ldrh r0, [r6]\n\ + mov r12, r0\n\ + cmp r4, 0x9\n\ + bhi _080A1272\n\ + adds r3, r6, 0x4\n\ + ldr r2, _080A12B0 @ =0x040000d4\n\ + ldr r5, _080A12BC @ =0x80000001\n\ +_080A1236:\n\ + lsls r1, r4, 1\n\ + ldr r6, _080A12C0 @ =0x0600e480\n\ + adds r0, r1, r6\n\ + str r3, [r2]\n\ + str r0, [r2, 0x4]\n\ + str r5, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + adds r6, 0x40\n\ + adds r0, r1, r6\n\ + str r3, [r2]\n\ + str r0, [r2, 0x4]\n\ + str r5, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + ldr r6, _080A12C4 @ =0x0600ec80\n\ + adds r0, r1, r6\n\ + str r3, [r2]\n\ + str r0, [r2, 0x4]\n\ + str r5, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + ldr r0, _080A12C8 @ =0x0600ecc0\n\ + adds r1, r0\n\ + str r3, [r2]\n\ + str r1, [r2, 0x4]\n\ + str r5, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x9\n\ + bls _080A1236\n\ +_080A1272:\n\ + mov r1, r12\n\ + lsls r0, r1, 16\n\ + cmp r0, 0\n\ + beq _080A1286\n\ + lsls r0, r7, 16\n\ + asrs r0, 16\n\ + cmp r0, 0\n\ + ble _080A1286\n\ + cmp r0, 0x9\n\ + ble _080A12A4\n\ +_080A1286:\n\ + lsls r0, r7, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x9\n\ + ble _080A129A\n\ + ldr r0, _080A12CC @ =gOtherText_Status\n\ + movs r1, 0xD\n\ + movs r2, 0x1\n\ + movs r3, 0x12\n\ + bl sub_80A1FF8\n\ +_080A129A:\n\ + bl sub_80A1D18\n\ + mov r0, r8\n\ + bl DestroyTask\n\ +_080A12A4:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A12B0: .4byte 0x040000d4\n\ +_080A12B4: .4byte 0x80000800\n\ +_080A12B8: .4byte 0xfffff000\n\ +_080A12BC: .4byte 0x80000001\n\ +_080A12C0: .4byte 0x0600e480\n\ +_080A12C4: .4byte 0x0600ec80\n\ +_080A12C8: .4byte 0x0600ecc0\n\ +_080A12CC: .4byte gOtherText_Status\n\ + .syntax divided\n"); +} + +static void sub_80A12D0(s8 a) +{ + u8 newTaskId; + + Menu_EraseWindowRect(1, 18, 5, 19); + sub_80A18E4(29); + + newTaskId = CreateTask(sub_80A1048, 0); + gTasks[newTaskId].data[0] = a; + + if (a < 0) + gTasks[newTaskId].data[1] = 10; + else + gTasks[newTaskId].data[1] = 0; + + gTasks[newTaskId].data[2] = 1; +} + +// void sub_80A1334(u8 taskId) +// { +// u8 i; +// s16 var1; + +// gTasks[taskId].data[1] += gTasks[taskId].data[0]; + +// var1 = 0; +// if (gTasks[taskId].data[1] >= 0) +// { +// var1 = 10; +// if (gTasks[taskId].data[1] < 10) +// { +// var1 = gTasks[taskId].data[1]; +// } +// } + +// if (var1 > 0) +// { +// u8 *vramAddr = (u8 *)(VRAM + 0x5B40); +// for (i = 0; i < 7; i++) +// { +// CpuSet(&gUnknown_08E73E88[(i + 13) * 64], vramAddr, var1 & 0x1FFFFF); +// vramAddr += 64; +// } +// } + +// if (var1 <= 9) +// { +// u8 *vramAddr = (u8 *)(VRAM + 0x5B40); +// for (i = 0; i < 64; i++) +// { +// u16 val = gTasks[taskId].data[2]; +// CpuSet(&val, vramAddr, ((10 - var1) & 0x1FFFFF) | 0x800000); +// } +// } +// else +// { +// Menu_EraseWindowRect(0, 19, 9, 19); +// } + +// if (gTasks[taskId].data[0] == 0 || gTasks[taskId].data[1] < 0) +// { +// if (pssData.page == PSS_PAGE_BATTLE_MOVES) +// { +// Menu_EraseWindowRect(0, 14, 9, 18); +// sub_80A0958(pssData.loadedMon); + +// if (GetMonStatusAndPokerus(pssData.loadedMon)) +// { +// sub_80A1FF8(gOtherText_Status, 13, 1, 18); +// } + +// DestroyTask(taskId); +// } +// } + +// if (gTasks[taskId].data[1] > 9) +// { +// if (pssData.page == PSS_PAGE_BATTLE_MOVES) +// { +// sub_80A00F4(gTasks[taskId].data[3]); +// } + +// sub_80A0428(pssData.loadedMon, &gTasks[taskId].data[3]); +// DestroyTask(taskId); +// } +// } +__attribute__((naked)) +static void sub_80A1334(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r0, 2\n\ + add r0, r10\n\ + lsls r0, 3\n\ + ldr r1, _080A13E4 @ =gTasks + 0x8\n\ + adds r7, r0, r1\n\ + ldrh r0, [r7]\n\ + ldrh r1, [r7, 0x2]\n\ + adds r0, r1\n\ + strh r0, [r7, 0x2]\n\ + lsls r0, 16\n\ + asrs r1, r0, 16\n\ + movs r0, 0\n\ + cmp r1, 0\n\ + blt _080A136A\n\ + movs r0, 0xA\n\ + cmp r1, 0xA\n\ + bgt _080A136A\n\ + ldrh r0, [r7, 0x2]\n\ +_080A136A:\n\ + lsls r0, 16\n\ + asrs r2, r0, 16\n\ + mov r9, r0\n\ + cmp r2, 0\n\ + ble _080A13A6\n\ + movs r0, 0xA\n\ + subs r0, r2\n\ + lsls r0, 1\n\ + ldr r1, _080A13E8 @ =0x06005b40\n\ + adds r4, r0, r1\n\ + movs r5, 0\n\ + adds r6, r2, 0\n\ + ldr r0, _080A13EC @ =0x001fffff\n\ + mov r8, r0\n\ +_080A1386:\n\ + adds r0, r5, 0\n\ + adds r0, 0xD\n\ + lsls r0, 6\n\ + ldr r1, _080A13F0 @ =gUnknown_08E73E88\n\ + adds r0, r1\n\ + adds r1, r4, 0\n\ + mov r2, r8\n\ + ands r2, r6\n\ + bl CpuSet\n\ + adds r4, 0x40\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x6\n\ + bls _080A1386\n\ +_080A13A6:\n\ + mov r1, r9\n\ + asrs r2, r1, 16\n\ + cmp r2, 0x9\n\ + bgt _080A13F4\n\ + ldr r4, _080A13E8 @ =0x06005b40\n\ + movs r5, 0\n\ + mov r8, sp\n\ + movs r0, 0xA\n\ + subs r6, r0, r2\n\ + ldr r0, _080A13EC @ =0x001fffff\n\ + ands r6, r0\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + mov r9, r0\n\ +_080A13C2:\n\ + ldrh r0, [r7, 0x4]\n\ + mov r1, r8\n\ + strh r0, [r1]\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + mov r2, r9\n\ + orrs r2, r6\n\ + bl CpuSet\n\ + adds r4, 0x40\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x6\n\ + bls _080A13C2\n\ + b _080A1400\n\ + .align 2, 0\n\ +_080A13E4: .4byte gTasks + 0x8\n\ +_080A13E8: .4byte 0x06005b40\n\ +_080A13EC: .4byte 0x001fffff\n\ +_080A13F0: .4byte gUnknown_08E73E88\n\ +_080A13F4:\n\ + movs r0, 0\n\ + movs r1, 0x13\n\ + movs r2, 0x9\n\ + movs r3, 0x13\n\ + bl Menu_EraseWindowRect\n\ +_080A1400:\n\ + movs r1, 0\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0\n\ + beq _080A1410\n\ + movs r1, 0x2\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0\n\ + bge _080A144A\n\ +_080A1410:\n\ + ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\ + ldrb r0, [r4, 0xB]\n\ + cmp r0, 0x2\n\ + bne _080A1444\n\ + movs r0, 0\n\ + movs r1, 0xE\n\ + movs r2, 0x9\n\ + movs r3, 0x12\n\ + bl Menu_EraseWindowRect\n\ + adds r4, 0x10\n\ + adds r0, r4, 0\n\ + bl sub_80A0958\n\ + adds r0, r4, 0\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080A1444\n\ + ldr r0, _080A1484 @ =gOtherText_Status\n\ + movs r1, 0xD\n\ + movs r2, 0x1\n\ + movs r3, 0x12\n\ + bl sub_80A1FF8\n\ +_080A1444:\n\ + mov r0, r10\n\ + bl DestroyTask\n\ +_080A144A:\n\ + movs r1, 0x2\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0x9\n\ + ble _080A1470\n\ + ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\ + ldrb r0, [r4, 0xB]\n\ + cmp r0, 0x2\n\ + bne _080A1460\n\ + ldrb r0, [r7, 0x6]\n\ + bl sub_80A00F4\n\ +_080A1460:\n\ + adds r0, r4, 0\n\ + adds r0, 0x10\n\ + adds r1, r7, 0x6\n\ + bl sub_80A0428\n\ + mov r0, r10\n\ + bl DestroyTask\n\ +_080A1470:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1480: .4byte gSharedMem + 0x18000\n\ +_080A1484: .4byte gOtherText_Status\n\ + .syntax divided\n"); +} + +// Related to re-drawing the summary area underneath the pokemon's picture +// in all of the summary screen tabs. +static void sub_80A1488(s8 a, u8 b) +{ + u8 taskId; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + Menu_EraseWindowRect(0, 14, 9, 19); + + taskId = FindTaskIdByFunc(sub_80A1334); + if (taskId == 0xFF) + taskId = CreateTask(sub_80A1334, 0); + + gTasks[taskId].data[0] = a; + + if (a < 0) + gTasks[taskId].data[1] = 10; + else + gTasks[taskId].data[1] = 0; + + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = b; +} + +__attribute__((naked)) +static void sub_80A1500(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r0, 2\n\ + add r0, r10\n\ + lsls r0, 3\n\ + ldr r1, _080A15B0 @ =gTasks + 0x8\n\ + adds r7, r0, r1\n\ + ldrh r0, [r7]\n\ + ldrh r1, [r7, 0x2]\n\ + adds r0, r1\n\ + strh r0, [r7, 0x2]\n\ + lsls r0, 16\n\ + asrs r1, r0, 16\n\ + movs r0, 0\n\ + cmp r1, 0\n\ + blt _080A1536\n\ + movs r0, 0xA\n\ + cmp r1, 0xA\n\ + bgt _080A1536\n\ + ldrh r0, [r7, 0x2]\n\ +_080A1536:\n\ + lsls r0, 16\n\ + asrs r2, r0, 16\n\ + mov r9, r0\n\ + cmp r2, 0\n\ + ble _080A1572\n\ + movs r0, 0xA\n\ + subs r0, r2\n\ + lsls r0, 1\n\ + ldr r1, _080A15B4 @ =0x06006b40\n\ + adds r4, r0, r1\n\ + movs r5, 0\n\ + adds r6, r2, 0\n\ + ldr r0, _080A15B8 @ =0x001fffff\n\ + mov r8, r0\n\ +_080A1552:\n\ + adds r0, r5, 0\n\ + adds r0, 0xD\n\ + lsls r0, 6\n\ + ldr r1, _080A15BC @ =gUnknown_08E74688\n\ + adds r0, r1\n\ + adds r1, r4, 0\n\ + mov r2, r8\n\ + ands r2, r6\n\ + bl CpuSet\n\ + adds r4, 0x40\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x6\n\ + bls _080A1552\n\ +_080A1572:\n\ + mov r1, r9\n\ + asrs r2, r1, 16\n\ + cmp r2, 0x9\n\ + bgt _080A15C0\n\ + ldr r4, _080A15B4 @ =0x06006b40\n\ + movs r5, 0\n\ + mov r8, sp\n\ + movs r0, 0xA\n\ + subs r6, r0, r2\n\ + ldr r0, _080A15B8 @ =0x001fffff\n\ + ands r6, r0\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + mov r9, r0\n\ +_080A158E:\n\ + ldrh r0, [r7, 0x4]\n\ + mov r1, r8\n\ + strh r0, [r1]\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + mov r2, r9\n\ + orrs r2, r6\n\ + bl CpuSet\n\ + adds r4, 0x40\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x6\n\ + bls _080A158E\n\ + b _080A15CC\n\ + .align 2, 0\n\ +_080A15B0: .4byte gTasks + 0x8\n\ +_080A15B4: .4byte 0x06006b40\n\ +_080A15B8: .4byte 0x001fffff\n\ +_080A15BC: .4byte gUnknown_08E74688\n\ +_080A15C0:\n\ + movs r0, 0\n\ + movs r1, 0x13\n\ + movs r2, 0x9\n\ + movs r3, 0x13\n\ + bl Menu_EraseWindowRect\n\ +_080A15CC:\n\ + movs r1, 0\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0\n\ + beq _080A15DC\n\ + movs r1, 0x2\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0\n\ + bge _080A1616\n\ +_080A15DC:\n\ + ldr r4, _080A164C @ =gSharedMem + 0x18000\n\ + ldrb r0, [r4, 0xB]\n\ + cmp r0, 0x3\n\ + bne _080A1610\n\ + movs r0, 0\n\ + movs r1, 0xE\n\ + movs r2, 0x9\n\ + movs r3, 0x12\n\ + bl Menu_EraseWindowRect\n\ + adds r4, 0x10\n\ + adds r0, r4, 0\n\ + bl sub_80A0958\n\ + adds r0, r4, 0\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080A1610\n\ + ldr r0, _080A1650 @ =gOtherText_Status\n\ + movs r1, 0xD\n\ + movs r2, 0x1\n\ + movs r3, 0x12\n\ + bl sub_80A1FF8\n\ +_080A1610:\n\ + mov r0, r10\n\ + bl DestroyTask\n\ +_080A1616:\n\ + movs r1, 0x2\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0x9\n\ + ble _080A163C\n\ + ldr r4, _080A164C @ =gSharedMem + 0x18000\n\ + ldrb r0, [r4, 0xB]\n\ + cmp r0, 0x3\n\ + bne _080A162C\n\ + ldrb r0, [r7, 0x6]\n\ + bl sub_80A00F4\n\ +_080A162C:\n\ + adds r0, r4, 0\n\ + adds r0, 0x10\n\ + adds r1, r7, 0x6\n\ + bl sub_80A0428\n\ + mov r0, r10\n\ + bl DestroyTask\n\ +_080A163C:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A164C: .4byte gSharedMem + 0x18000\n\ +_080A1650: .4byte gOtherText_Status\n\ + .syntax divided\n"); +} + +static void sub_80A1654(s8 a, u8 b) +{ + u8 taskId; + + if (pssData.page == PSS_PAGE_CONTEST_MOVES) + Menu_EraseWindowRect(0, 14, 9, 19); + + taskId = FindTaskIdByFunc(sub_80A1500); + if (taskId == 0xFF) + taskId = CreateTask(sub_80A1500, 0); + + gTasks[taskId].data[0] = a; + + if (a < 0) + gTasks[taskId].data[1] = 10; + else + gTasks[taskId].data[1] = 0; + + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = b; +} + +#ifdef NONMATCHING +static void sub_80A16CC(u8 a) +{ + u8 i; + u16 *vramAddr = (u16 *)(VRAM + 0x6AD4); + + if (a == 0) + { + for (i = 0; i < 20; i++) + { + vramAddr[i] = gUnknown_08E94510[i] + 0x1000; + vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x1000; + vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x1000; + } + } + else + { + i = 0; + for (i = 0; i < 20; i++) + { + vramAddr[i] = gUnknown_08E94550[i] + 0x1000; + vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x1000; + vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x1000; + } + } + + vramAddr = (u16 *)(VRAM + 0x5AD4); + + if (a == 0) + { + for (i = 0; i < 20; i++) + { + vramAddr[i] = gUnknown_08E94510[i] + 0x3000; + vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x3000; + vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x3000; + } + } + else + { + for (i = 0; i < 20; i++) + { + vramAddr[i] = gUnknown_08E94550[i] + 0x3000; + vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x3000; + vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x3000; + } + } +} +#else +__attribute__((naked)) +static void sub_80A16CC(u8 a) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r9, r0\n\ + ldr r0, _080A1724 @ =0x06006ad4\n\ + mov r12, r0\n\ + mov r1, r9\n\ + cmp r1, 0\n\ + bne _080A172C\n\ + movs r5, 0\n\ + ldr r7, _080A1728 @ =gUnknown_08E94510\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r6, r0, 0\n\ + movs r1, 0x40\n\ + adds r1, r7\n\ + mov r8, r1\n\ +_080A16F4:\n\ + lsls r2, r5, 1\n\ + mov r0, r12\n\ + adds r3, r2, r0\n\ + adds r4, r2, r7\n\ + ldrh r1, [r4]\n\ + adds r0, r6, r1\n\ + strh r0, [r3]\n\ + adds r1, r3, 0\n\ + adds r1, 0x40\n\ + ldrh r4, [r4]\n\ + adds r0, r6, r4\n\ + strh r0, [r1]\n\ + adds r3, 0x80\n\ + add r2, r8\n\ + ldrh r2, [r2]\n\ + adds r0, r6, r2\n\ + strh r0, [r3]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080A16F4\n\ + b _080A1768\n\ + .align 2, 0\n\ +_080A1724: .4byte 0x06006ad4\n\ +_080A1728: .4byte gUnknown_08E94510\n\ +_080A172C:\n\ + movs r5, 0\n\ + ldr r6, _080A17B0 @ =gUnknown_08E94550\n\ + movs r7, 0x80\n\ + lsls r7, 5\n\ + adds r4, r7, 0\n\ + movs r0, 0x40\n\ + adds r0, r6\n\ + mov r8, r0\n\ +_080A173C:\n\ + lsls r1, r5, 1\n\ + mov r7, r12\n\ + adds r2, r1, r7\n\ + adds r0, r1, r6\n\ + ldrh r0, [r0]\n\ + adds r0, r4, r0\n\ + strh r0, [r2]\n\ + adds r3, r2, 0\n\ + adds r3, 0x40\n\ + add r1, r8\n\ + ldrh r7, [r1]\n\ + adds r0, r4, r7\n\ + strh r0, [r3]\n\ + adds r2, 0x80\n\ + ldrh r1, [r1]\n\ + adds r0, r4, r1\n\ + strh r0, [r2]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080A173C\n\ +_080A1768:\n\ + ldr r0, _080A17B4 @ =0x06005ad4\n\ + mov r12, r0\n\ + mov r1, r9\n\ + cmp r1, 0\n\ + bne _080A17BC\n\ + movs r5, 0\n\ + ldr r7, _080A17B8 @ =gUnknown_08E94510\n\ + movs r0, 0xC0\n\ + lsls r0, 6\n\ + adds r6, r0, 0\n\ + movs r1, 0x40\n\ + adds r1, r7\n\ + mov r8, r1\n\ +_080A1782:\n\ + lsls r2, r5, 1\n\ + mov r0, r12\n\ + adds r3, r2, r0\n\ + adds r4, r2, r7\n\ + ldrh r1, [r4]\n\ + adds r0, r6, r1\n\ + strh r0, [r3]\n\ + adds r1, r3, 0\n\ + adds r1, 0x40\n\ + ldrh r4, [r4]\n\ + adds r0, r6, r4\n\ + strh r0, [r1]\n\ + adds r3, 0x80\n\ + add r2, r8\n\ + ldrh r2, [r2]\n\ + adds r0, r6, r2\n\ + strh r0, [r3]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080A1782\n\ + b _080A17F8\n\ + .align 2, 0\n\ +_080A17B0: .4byte gUnknown_08E94550\n\ +_080A17B4: .4byte 0x06005ad4\n\ +_080A17B8: .4byte gUnknown_08E94510\n\ +_080A17BC:\n\ + movs r5, 0\n\ + ldr r6, _080A1804 @ =gUnknown_08E94550\n\ + movs r7, 0xC0\n\ + lsls r7, 6\n\ + adds r4, r7, 0\n\ + movs r0, 0x40\n\ + adds r0, r6\n\ + mov r8, r0\n\ +_080A17CC:\n\ + lsls r1, r5, 1\n\ + mov r7, r12\n\ + adds r2, r1, r7\n\ + adds r0, r1, r6\n\ + ldrh r0, [r0]\n\ + adds r0, r4, r0\n\ + strh r0, [r2]\n\ + adds r3, r2, 0\n\ + adds r3, 0x40\n\ + add r1, r8\n\ + ldrh r7, [r1]\n\ + adds r0, r4, r7\n\ + strh r0, [r3]\n\ + adds r2, 0x80\n\ + ldrh r1, [r1]\n\ + adds r0, r4, r1\n\ + strh r0, [r2]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080A17CC\n\ +_080A17F8:\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1804: .4byte gUnknown_08E94550\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +u8 sub_80A1808(struct Pokemon *mon) +{ + u16 species; + u8 spriteId; + + species = GetMonData(mon, MON_DATA_SPECIES2); + spriteId = CreateSprite(&gUnknown_02024E8C, 40, 64, 5); + + FreeSpriteOamMatrix(&gSprites[spriteId]); + + gSprites[spriteId].data[0] = species; + gSprites[spriteId].callback = sub_80A1888; + + if (!IsPokeSpriteNotFlipped(species)) + gSprites[spriteId].hFlip = TRUE; + else + gSprites[spriteId].hFlip = FALSE; + + return spriteId; +} + +static void sub_80A1888(struct Sprite *sprite) +{ + if (!gPaletteFade.active) + { + sprite->callback = SpriteCallbackDummy; + + if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) + PlayCry1(sprite->data[0], 0); + } +} + +static void sub_80A18C4(void) +{ + u8 i; + + for (i = 0; i < 30; i++) + ewram1A000[i] = 0xFF; +} + +static void sub_80A18E4(u8 a) +{ + if (ewram1A000[a] != 0xFF) + { + DestroySprite(&gSprites[ewram1A000[a]]); + ewram1A000[a] = 0xFF; + } +} + +static void sub_80A1918(u8 a, u8 invisible) +{ + gSprites[ewram1A000[a]].invisible = invisible; +} + +static void sub_80A1950(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (ewram1A000[i] == 0xFF) + ewram1A000[i] = CreateSprite(&sSpriteTemplate_83C11C0, 0, 0, 2); + + sub_80A1918(i, 1); + } +} + +static void sub_80A198C(u8 animNum, u8 x, u8 y, u8 d) +{ + StartSpriteAnim(&gSprites[ewram1A000[d]], animNum); + + gSprites[ewram1A000[d]].oam.paletteNum = sUnknown_PaletteNums[animNum]; + gSprites[ewram1A000[d]].pos1.x = x + 16; + gSprites[ewram1A000[d]].pos1.y = y + 8; + + sub_80A1918(d, 0); +} + +static void sub_80A1A30(u8 a) +{ + u8 i; + s16 x; + u8 subPriority = 0; + + if (pssData.page >= PSS_PAGE_BATTLE_MOVES) + { + if (a == 9) + subPriority = 1; + + for (i = 0; i < 10; i++) + { + x = (i * 16) + 0x58; + ewram1A000[a + i] = CreateSprite(&sSpriteTemplate_83C1280, x, 40, subPriority); + + if (i == 0) + StartSpriteAnim(&gSprites[ewram1A000[a]], 4); + else if (i == 9) + StartSpriteAnim(&gSprites[ewram1A000[a + i]], 5); + else + StartSpriteAnim(&gSprites[ewram1A000[a + i]], 6); + + gSprites[ewram1A000[a + i]].callback = sub_80A1BC0; + gSprites[ewram1A000[a + i]].data[0] = a; + gSprites[ewram1A000[a + i]].data[1] = 0; + } + } +} + +static void sub_80A1B1C(u8 a) +{ + u8 i; + + for (i = 0; i < 10; i++) + sub_80A18E4(a + i); +} + +static void sub_80A1B40(u8 a) +{ + u8 i; + a *= 3; + + StartSpriteAnim(&gSprites[ewram1A000[9]], a + 4); + + for (i = 0; i < 8; i++) + StartSpriteAnim(&gSprites[ewram1A000[10 + i]], a + 6); + + StartSpriteAnim(&gSprites[ewram1A000[18]], a + 5); +} + +static void sub_80A1BC0(struct Sprite *sprite) +{ + if (sprite->animNum == 4 || sprite->animNum == 5 || sprite->animNum == 6) + { + sprite->data[1] = (sprite->data[1] + 1) & 0x1F; + + if (sprite->data[1] > 24) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + else + { + sprite->data[1] = 0; + sprite->invisible = 0; + } + + if (sprite->data[0] == 9) + sprite->pos2.y = pssData.selectedMoveIndex * 16; + else + sprite->pos2.y = pssData.switchMoveIndex * 16; +} + +#define shared1A009 ((u8 *)(gSharedMem + 0x1A009)) + +void sub_80A1C30(u8 a) +{ + u8 r3; + + a *= 10; + for (r3 = a; r3 < a + 10; r3++) + { + gSprites[shared1A009[r3]].data[1] = 0; + gSprites[shared1A009[r3]].invisible = FALSE; + } +} + +u8 pokemon_ailments_get_primary(u32 status) +{ + if (status & 0x88) + return 1; + if (status & 0x40) + return 2; + if (status & 0x7) + return 3; + if (status & 0x20) + return 4; + if (status & 0x10) + return 5; + + return 0; +} + +u8 GetMonStatusAndPokerus(struct Pokemon *mon) +{ + u8 statusAilment; + + if (GetMonData(mon, MON_DATA_HP) == 0) + return 7; + + statusAilment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)); + if (statusAilment == 0) + { + if (!CheckPartyPokerus(mon, 0)) + return 0; + else + return 6; + } + + return statusAilment; +} + +#ifdef NONMATCHING +void sub_80A1D18(void) +{ + struct Pokemon mon; + u8 statusAndPkrs; + u8 statusAndPkrs2; + + sub_809F678(&mon); + statusAndPkrs = GetMonStatusAndPokerus(&mon); + + if (statusAndPkrs) + { + statusAndPkrs2 = statusAndPkrs - 1; + + if (ewram1A000[29] == 0xFF) + ewram1A000[29] = CreateSprite(&sSpriteTemplate_83C1304, 64, 152, 0); + } + else + { + sub_80A18E4(29); + return; + } + + StartSpriteAnim(&gSprites[ewram1A000[29]], statusAndPkrs2); +} +#else +__attribute__((naked)) +void sub_80A1D18(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + sub sp, 0x64\n\ + mov r0, sp\n\ + bl sub_809F678\n\ + mov r0, sp\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + beq _080A1D58\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r4, _080A1D50 @ =gSharedMem + 0x1A01D\n\ + ldrb r0, [r4]\n\ + cmp r0, 0xFF\n\ + bne _080A1D60\n\ + ldr r0, _080A1D54 @ =sSpriteTemplate_83C1304\n\ + movs r1, 0x40\n\ + movs r2, 0x98\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + strb r0, [r4]\n\ + b _080A1D60\n\ + .align 2, 0\n\ +_080A1D50: .4byte gSharedMem + 0x1A01D\n\ +_080A1D54: .4byte sSpriteTemplate_83C1304\n\ +_080A1D58:\n\ + movs r0, 0x1D\n\ + bl sub_80A18E4\n\ + b _080A1D74\n\ +_080A1D60:\n\ + ldr r0, _080A1D7C @ =gSharedMem + 0x1A01D\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _080A1D80 @ =gSprites\n\ + adds r0, r1\n\ + adds r1, r5, 0\n\ + bl StartSpriteAnim\n\ +_080A1D74:\n\ + add sp, 0x64\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1D7C: .4byte gSharedMem + 0x1A01D\n\ +_080A1D80: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +static void sub_80A1D84(struct Pokemon *mon) +{ + struct Sprite *sprite; + + sprite = sub_80F7920(0x7533, 0x7533, sSummaryScreenMonMarkingsPalette); + gUnknown_020384F4 = sprite; + + if (sprite != NULL) + { + u8 markings = GetMonData(mon, MON_DATA_MARKINGS); + StartSpriteAnim(sprite, markings); + + gUnknown_020384F4->pos1.x = 60; + gUnknown_020384F4->pos1.y = 26; + } +} + +static void sub_80A1DCC(struct Pokemon *mon) +{ + DestroySprite(gUnknown_020384F4); + sub_80A1D84(mon); +} + +static void sub_80A1DE8(struct Pokemon *mon) +{ + u8 ball = ball_number_to_ball_processing_index(GetMonData(mon, MON_DATA_POKEBALL)); + sub_80478DC(ball); + + pssData.ballSpriteId = CreateSprite(&gBallSpriteTemplates[ball], 6, 136, 0); + gSprites[pssData.ballSpriteId].callback = SpriteCallbackDummy; + gSprites[pssData.ballSpriteId].oam.priority = 3; +} + +static u8 *sub_80A1E58(u8 *text, u8 id) +{ + if (id != 0xFF) + { + const u8 *ptr = sUnknown_083C15BC; + + while (*ptr != 0xFF && *ptr != id) + ptr += 4; + + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 4; + text[2] = ptr[1]; + text[3] = ptr[2]; + text[4] = ptr[3]; + + text += 5; + } + + return text; +} + +u8 *sub_80A1E9C(u8 *dest, const u8 *src, u8 id) +{ + u8 arr[3]; + + Menu_GetTextColors(&arr[0], &arr[1], &arr[2]); + + dest = sub_80A1E58(dest, id); + dest = StringCopy(dest, src); + + if (id != 0xFF) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 4; + dest[2] = arr[0]; + dest[3] = arr[1]; + dest[4] = arr[2]; + dest[5] = 0xFF; + + dest += 5; + } + + return dest; +} + +static void sub_80A1EF8(const u8 *text, u8 id, u8 left, u16 top, s32 e) +{ + sub_80A1E9C(gStringVar4, text, id); + Menu_PrintTextPixelCoords(gStringVar4, left, top, (bool8)e); +} + +static void sub_80A1F48(const u8 *text, u8 id, u8 c, u8 d, u16 e) +{ + sub_80A1E9C(gStringVar4, text, id); + sub_8072BD8(gStringVar4, c, d, e); +} + +static void sub_80A1F98(s32 value, u8 id, u8 n, u8 mode, u8 left, u16 top, s32 e) +{ + ConvertIntToDecimalStringN(gStringVar1, value, mode, n); + sub_80A1EF8(gStringVar1, id, left, top, e); +} + +static void sub_80A1FF8(const u8 *text, u8 id, u8 left, u8 top) +{ + sub_80A1E9C(gStringVar4, text, id); + Menu_PrintText(gStringVar4, left, top); +} + +u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level) +{ + u8 buffer[12]; + + dest[0] = 0x34; + dest++; + + if (level == 0) + level = 5; + + ConvertIntToDecimalString(buffer, level); + dest = sub_80A1E9C(dest, buffer, 14); + dest = StringCopy(dest, gOtherText_Comma); + + return dest; +} + +static void sub_80A2078(int taskId) +{ + gUnknown_03005CF0 = gTasks[taskId].func; + gTasks[taskId].func = sub_80A20A8; + gTasks[taskId].func((u8)taskId); +} + +static void sub_80A20A8(u8 taskId) +{ + if (sub_8055870() != TRUE) + gTasks[taskId].func = gUnknown_03005CF0; +} diff --git a/src/pokenav.c b/src/pokenav.c new file mode 100644 index 000000000..f57a98df6 --- /dev/null +++ b/src/pokenav.c @@ -0,0 +1,16 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u8 gUnknown_020388B0[4] = {}; +EWRAM_DATA u16 gUnknown_020388B4 = 0; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/random.c b/src/random.c new file mode 100644 index 000000000..8f82b722f --- /dev/null +++ b/src/random.c @@ -0,0 +1,18 @@ +#include "global.h" +#include "random.h" + +// The number 1103515245 comes from the example implementation of rand and srand +// in the ISO C standard. + +u32 gRngValue; + +u16 Random(void) +{ + gRngValue = 1103515245 * gRngValue + 24691; + return gRngValue >> 16; +} + +void SeedRng(u16 seed) +{ + gRngValue = seed; +} diff --git a/src/record_mixing.c b/src/record_mixing.c new file mode 100644 index 000000000..a2660bf82 --- /dev/null +++ b/src/record_mixing.c @@ -0,0 +1,1082 @@ +#include "global.h" +#include "record_mixing.h" +#include "battle_tower.h" +#include "cable_club.h" +#include "daycare.h" +#include "dewford_trend.h" +#include "event_data.h" +#include "fldeff_recordmixing.h" +#include "item.h" +#include "constants/items.h" +#include "load_save.h" +#include "link.h" +#include "mauville_man.h" +#include "menu.h" +#include "mystery_event_script.h" +#include "random.h" +#include "overworld.h" +#include "save.h" +#include "script.h" +#include "secret_base.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "tv.h" +#include "ewram.h" + +EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02038738 = {0}; +extern u16 gSpecialVar_0x8005; + +u32 gUnknown_03005D2C; + +static u8 gUnknown_03000718; +static u8 gUnknown_0300071C[4]; + +void *recordMixingSecretBases = &gSaveBlock1.secretBases; +void *recordMixingTvShows = &gSaveBlock1.tvShows; +void *gUnknown_083D0274 = &gSaveBlock1.pokeNews; +void *gUnknown_083D0278 = &gSaveBlock1.mauvilleMan; +void *recordMixingEasyChatPairs = &gSaveBlock1.easyChatPairs; +struct RecordMixingDayCareMail *gUnknown_083D0280 = &gUnknown_02038738; +void *gBattleTowerPlayerRecord = &gSaveBlock2.battleTower.playerRecord; + +#define BUFFER_CHUNK_SIZE 200 + +void sub_80B929C(void) +{ + sub_8083A84(Task_RecordMixing_Main); +} + +struct PlayerRecords +{ + struct SecretBaseRecord secretBases[20]; + TVShow tvShows[25]; + u8 filler1004[0x40]; + u8 filler1044[0x40]; + struct EasyChatPair easyChatPairs[5]; + struct RecordMixingDayCareMail filler10AC; + struct BattleTowerRecord battleTowerRecord; + u16 filler11C8[0x34]; +}; + +void RecordMixing_PrepareExchangePacket(void) +{ + sub_80BC300(); + sub_80C045C(); + + memcpy(ewram_2018000.secretBases, recordMixingSecretBases, sizeof(ewram_2018000.secretBases)); + memcpy(ewram_2018000.tvShows, recordMixingTvShows, sizeof(ewram_2018000.tvShows)); + memcpy(ewram_2018000.filler1004, gUnknown_083D0274, sizeof(ewram_2008000.filler1004)); + memcpy(ewram_2018000.filler1044, gUnknown_083D0278, sizeof(ewram_2008000.filler1044)); + memcpy(ewram_2018000.easyChatPairs, recordMixingEasyChatPairs, sizeof(ewram_2018000.easyChatPairs)); + gUnknown_02038738.mail[0] = gSaveBlock1.daycare.misc.mail[0]; + gUnknown_02038738.mail[1] = gSaveBlock1.daycare.misc.mail[1]; + InitDaycareMailRecordMixing(gSaveBlock1.daycare.mons, &gUnknown_02038738); + memcpy(&ewram_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixingDayCareMail)); + memcpy(&ewram_2018000.battleTowerRecord, gBattleTowerPlayerRecord, sizeof(struct BattleTowerRecord)); + + if (GetMultiplayerId() == 0) + ewram_2018000.filler11C8[0] = GetRecordMixingGift(); +} + +void RecordMixing_ReceiveExchangePacket(u32 a) +{ + sub_80BD674(ewram_2008000.secretBases, sizeof(struct PlayerRecords), a); + sub_80BFD44((u8 *)ewram_2008000.tvShows, sizeof(struct PlayerRecords), a); + sub_80C0514(ewram_2008000.filler1004, sizeof(struct PlayerRecords), a); + sub_80B9B1C(ewram_2008000.filler1044, sizeof(struct PlayerRecords), a); + sub_80FA4E4(ewram_2008000.easyChatPairs, sizeof(struct PlayerRecords), a); + sub_80B9C6C((u8 *)&ewram_2008000.filler10AC, sizeof(struct PlayerRecords), a, ewram_2008000.tvShows); + sub_80B9B70(&ewram_2008000.battleTowerRecord, sizeof(struct PlayerRecords), a); + sub_80B9F3C(ewram_2008000.filler11C8, a); +} + +#define tCounter data[0] + +void Task_RecordMixing_SoundEffect(u8 taskId) +{ + gTasks[taskId].tCounter++; + if (gTasks[taskId].tCounter == 50) + { + PlaySE(SE_W213); + gTasks[taskId].tCounter = 0; + } +} + +#undef tCounter + + +#define tState data[0] +#define tSndEffTaskId data[15] + +void Task_RecordMixing_Main(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (tState) + { + case 0: // init + sub_8007270(gSpecialVar_0x8005); + VarSet(VAR_TEMP_0, 1); + gUnknown_03000718 = 0; + RecordMixing_PrepareExchangePacket(); + CreateRecordMixingSprite(); + tState = 1; + data[10] = CreateTask(sub_80B95F0, 0x50); + tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 0x51); + break; + case 1: // wait for sub_80B95F0 + if (!gTasks[data[10]].isActive) + { + tState = 2; + FlagSet(FLAG_SYS_MIX_RECORD); + DestroyRecordMixingSprite(); + DestroyTask(tSndEffTaskId); + } + break; + case 2: + data[10] = CreateTask(sub_80BA00C, 10); + tState = 3; + PlaySE(SE_W226); + break; + case 3: // wait for sub_80BA00C + if (!gTasks[data[10]].isActive) + { + tState = 4; + data[10] = sub_8083664(); + Menu_ClearWindowText(); + Menu_PrintText(gOtherText_MixingComplete, 2, 15); + data[8] = 0; + } + break; + case 4: // wait 60 frames + data[8]++; + if (data[8] > 60) + tState = 5; + break; + case 5: + if (!gTasks[data[10]].isActive) + { + sub_8055588(); + Menu_EraseScreen(); + DestroyTask(taskId); + EnableBothScriptContexts(); + } + break; + } +} + +void sub_80B95F0(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->tState) + { + case 0: + sub_80B9A78(); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gOtherText_MixingRecordsWithFriend, 2, 15); + task->data[8] = 0x708; + task->tState = 400; + ClearLinkCallback_2(); + break; + case 100: // wait 20 frames + task->data[12]++; + if (task->data[12] > 20) + { + task->data[12] = 0; + task->tState = 101; + } + break; + case 101: + { + u8 players = GetLinkPlayerCount_2(); + + if (IsLinkMaster() == 1) + { + if (players == sub_800820C()) + { + PlaySE(SE_PIN); + task->tState = 201; + task->data[12] = 0; + } + } + else + { + PlaySE(SE_BOO); + task->tState = 301; + } + } + break; + case 201: + if (sub_800820C() == GetLinkPlayerCount_2()) + { + if (++task->data[12] > GetLinkPlayerCount_2() * 30) + { + sub_8007F4C(); + task->tState = 1; + } + } + break; + case 301: + if (sub_800820C() == GetLinkPlayerCount_2()) + task->tState = 1; + break; + case 400: // wait 20 frames + task->data[12]++; + if (task->data[12] > 20) + { + task->tState = 1; + task->data[12] = 0; + } + break; + case 1: // wait for handshake + if (gReceivedRemoteLinkPlayers) + { + ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), 2, 2); + task->tState = 5; + } + break; + case 2: + { + u8 subTaskId; + + task->data[6] = GetLinkPlayerCount_2(); + task->tState = 0; + task->data[5] = GetMultiplayerId_(); + task->func = Task_RecordMixing_SendPacket; + StorePtrInTaskData(&ewram_2018000, &task->data[2]); + subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50); + task->data[10] = subTaskId; + gTasks[subTaskId].data[0] = taskId; + StorePtrInTaskData((u8 *)&ewram_2008000, &gTasks[subTaskId].data[5]); + } + break; + case 5: // wait 60 frames + task->data[10]++; + if (task->data[10] > 60) + { + task->data[10] = 0; + task->tState = 2; + } + break; + } +} + +void Task_RecordMixing_SendPacket(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + // does this send the data 24 times? + + switch (task->tState) + { + case 0: //Copy record data to send buffer + { + void *recordData = (u8 *)LoadPtrFromTaskData(&task->data[2]) + BUFFER_CHUNK_SIZE * task->data[4]; + + memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE); + task->tState++; + } + break; + case 1: + if (GetMultiplayerId() == 0) + sub_8007E9C(1); + task->tState++; + break; + case 2: + break; + case 3: + task->data[4]++; + if ((u16)task->data[4] == 24) + task->tState++; + else + task->tState = 0; + break; + case 4: + if (!gTasks[task->data[10]].isActive) + task->func = Task_RecordMixing_SendPacket_SwitchToReceive; + } +} + +void Task_RecordMixing_CopyReceiveBuffer(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s32 recvStatus = GetBlockReceivedStatus(); + u8 handledPlayers = 0; + + if (recvStatus == sub_8008198()) + { + u8 player; + + for (player = 0; player < GetLinkPlayerCount(); player++) + { + void *src; + u8 *dst; + + if ((recvStatus >> player) & 1) + { + dst = LoadPtrFromTaskData(&task->data[5]) + task->data[player + 1] * BUFFER_CHUNK_SIZE + player * sizeof(struct PlayerRecords); + src = GetPlayerRecvBuffer(player); + if ((task->data[player + 1] + 1) * BUFFER_CHUNK_SIZE > sizeof(struct PlayerRecords)) + memcpy(dst, src, sizeof(struct PlayerRecords) - task->data[player + 1] * BUFFER_CHUNK_SIZE); + else + memcpy(dst, src, BUFFER_CHUNK_SIZE); + ResetBlockReceivedFlag(player); + task->data[player + 1]++; + if ((u16)task->data[player + 1] == 0x18) + handledPlayers++; + } + } + gTasks[task->data[0]].data[0]++; + } + if (handledPlayers == GetLinkPlayerCount()) + DestroyTask(taskId); +} + +void sub_80B99B4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (!gTasks[task->data[10]].isActive) + DestroyTask(taskId); +} + +void Task_RecordMixing_ReceivePacket(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->func = sub_80B99B4; + if (gUnknown_03000718 == 1) + RecordMixing_ReceiveExchangePacket(task->data[5]); +} + +void Task_RecordMixing_SendPacket_SwitchToReceive(u8 taskId) +{ + gTasks[taskId].func = Task_RecordMixing_ReceivePacket; + gUnknown_03000718 = 1; +} + +void *LoadPtrFromTaskData(u16 *taskData) +{ + return (void *)(taskData[0] | (taskData[1] << 16)); +} + +void StorePtrInTaskData(void *ptr, u16 *taskData) +{ + taskData[0] = (u32)ptr; + taskData[1] = (u32)ptr >> 16; +} + +u8 GetMultiplayerId_(void) +{ + return GetMultiplayerId(); +} + +u16 *GetPlayerRecvBuffer(u8 player) +{ + return gBlockRecvBuffer[player]; +} + +void sub_80B9A78(void) +{ + gUnknown_03005D2C = sizeof(struct PlayerRecords); +} + +const u8 gUnknown_083D0288[2] = {1, 0}; + +const u8 gUnknown_083D028A[2][3] = +{ + {1, 2, 0}, + {2, 0, 1}, +}; + +const u8 gUnknown_083D0290[9][4] = +{ + {1, 0, 3, 2}, + {3, 0, 1, 2}, + {2, 0, 3, 1}, + {1, 3, 0, 2}, + {2, 3, 0, 1}, + {3, 2, 0, 1}, + {1, 2, 3, 0}, + {2, 3, 1, 0}, + {3, 2, 1, 0}, +}; + +void sub_80B9A88(u8 *a) +{ + u32 i; + u32 id; + u32 players = GetLinkPlayerCount(); + + switch (players) + { + case 2: + for (i = 0; i < 2; i++) + a[i] = gUnknown_083D0288[i]; + break; + case 3: + id = GetLinkPlayerTrainerId(0) % 2; + for (i = 0; i < 3; i++) + a[i] = gUnknown_083D028A[id][i]; + break; + case 4: + id = GetLinkPlayerTrainerId(0) % 9; + for (i = 0; i < 4; i++) + a[i] = gUnknown_083D0290[id][i]; + break; + default: + break; + } +} + +void sub_80B9B1C(u8 *a, size_t size, u8 index) +{ + u8 arr[4]; + u8 *ptr; + + sub_80B9A88(arr); + //Probably not how it was originally written, but this matches. + memcpy(a + index * size, (ptr = gUnknown_083D0278), 0x40); + memcpy(ptr, a + arr[index] * size, 0x40); + sub_80F7F30(); +} + +void sub_80B9B70(void *battleTowerRecord, u32 size, u8 index) +{ + sub_80B9A88(gUnknown_0300071C); + memcpy(battleTowerRecord + size * index, battleTowerRecord + size * gUnknown_0300071C[index], sizeof(struct BattleTowerRecord)); + sub_8134AC0(battleTowerRecord + size * index); +} + +u8 sub_80B9BBC(u16 *a) +{ + return a[16]; +} + +void sub_80B9BC4(u8 *a, size_t b, u8 c[][2], u8 d, u8 e) +{ + struct DayCareMail *r6 = (struct DayCareMail *)(a + b * c[d][0]); + struct DayCareMail *src = r6 + c[d][1]; + struct DayCareMail sp0 = *src; + struct DayCareMail *r8 = (struct DayCareMail *)(a + b * c[e][0]); + + r6 += c[d][1]; + *r6 = *(r8 + c[e][1]); + + r8 += c[e][1]; + *r8 = sp0; +} + +u8 sub_80B9C4C(u8 *a) +{ + int i; + u8 r2 = 0; + + for (i = 0; i < 0x100; i++) + r2 += a[i]; + return r2; +} + +const u8 gUnknown_083D02B4[][2] = +{ + {0, 1}, + {1, 2}, + {2, 0}, +}; + +const u8 gUnknown_083D02BA[3][4] = +{ + {0, 1, 2, 3}, + {0, 2, 1, 3}, + {0, 3, 2, 1}, +}; + +#ifdef NONMATCHING +void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) +{ + u8 r8; + u8 sp4[4]; + u8 sp8[4]; + void *spC[4]; + u8 sp1C[4][2]; + u8 sp24[4][2]; + u8 sp3C; + u16 sp40 = Random(); + u16 i; // r3 + u16 r7; + u8 r1; + struct DayCareMisc *r6; + + //asm("":::"r8"); + SeedRng(gLinkPlayers[0].trainerId); + r8 = GetLinkPlayerCount(); + for (i = 0; i < 4; i++) + { + sp4[i] = 0xFF; + sp8[i] = 0; + sp1C[i][0] = 0; + sp1C[i][1] = 0; + } + sp3C = 0; + for (i = 0; i < r8; i++) + { + r6 = (struct DayCareMisc *)(a + b * i); + if (r6->numDaycareMons != 0) + { + for (r7 = 0; r7 < r6->numDaycareMons; r7++) + { + if (r6->itemsHeld[r7] == 0) + sp1C[i][r7] = 1; + } + } + //_080B9D3C + } + //_080B9D46 + for (r7 = 0, i = 0; i < r8; i++) + { + r6 = (struct DayCareMisc *)(a + b * i); + if (sp1C[i][0] == 1 || sp1C[i][1] == 1) + sp3C++; + if (sp1C[i][0] == 1 && sp1C[i][1] == 0) + { + sp24[r7][0] = i; + sp24[r7][1] = 0; + r7++; + } + else if (sp1C[i][0] == 0 && sp1C[i][1] == 1) + { + sp24[r7][0] = i; + sp24[r7][1] = 0; + r7++; + } + //else if (sp1C[i][0] == 1 + 1 && sp1C[i][1] + 1 == 1 + 1) + else if (sp1C[i][0] == 1 && sp1C[i][1] == 1) + { + u8 r4, r1; + + sp24[r7][0] = i; + r4 = sub_80B9BBC((u16 *)&r6->data[0]); + r1 = sub_80B9BBC((u16 *)&r6->data[1]); + + asm(""); + if (r4 == 0 && r1 != 0) + sp24[r7][1] = 1; + else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) + sp24[r7][1] = Random() % 2; + else + sp24[r7][1] = 0; + /* + if (r4 == 0 && r1 != 0) + sp24[r7][1] = 1; + else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) + sp24[r7][1] = Random() % 2; + else + sp24[r7][1] = 0; + */ + + /* + if (r4 == 0 && r1 != 0) + sp24[r7][1] = 1; + else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0)) + //sp24[r7][1] = ((Random() << 16) >> 16) % 2; + sp24[r7][1] = Random() % 2; + else + sp24[r7][1] = 0; + */ + //_080B9E2C: + r7++; + } + } + //_080B9E3E + for (i = 0; i < 4; i++) + { + r6 = (struct DayCareMisc *)a + b * c; + spC[i] = r6; + } + r1 = sub_80B9C4C(d) % 3; + switch (sp3C) + { + case 2: + sub_80B9BC4(a, b, (u8 *)sp24, 0, 1); + break; + case 3: + { + u8 var1 = gUnknown_083D02B4[r1][0]; + u8 var2 = gUnknown_083D02B4[r1][1]; + sub_80B9BC4(a, b, (u8 *)sp24, var1, var2); + } + break; + case 4: + { + u8 *r6 = (u8 *)sp24; + u8 var1 = gUnknown_083D02BA[r1][0]; + u8 var2 = gUnknown_083D02BA[r1][1]; + sub_80B9BC4(a, b, r6, var1, var2); + } + { + u8 *r6 = (u8 *)sp24; + u8 var1 = gUnknown_083D02BA[r1][2]; + u8 var2 = gUnknown_083D02BA[r1][3]; + sub_80B9BC4(a, b, r6, var1, var2); + } + break; + } + //_080B9EF0 + //memcpy(&gSaveBlock1.filler_303C.data[0], a + b * c, 0x38); + //memcpy(&gSaveBlock1.filler_303C.data[1], a + b * c + 0x38, 0x38); + r6 = (struct DayCareMisc *)(a + b * c); + gSaveBlock1.filler_303C.data[0] = r6->data[0]; + gSaveBlock1.filler_303C.data[1] = r6->data[1]; + //memcpy(&gSaveBlock1.filler_303C.data[0], &r6->data[0], 0x38); + //memcpy(&gSaveBlock1.filler_303C.data[1], &r6->data[1], 0x38); + SeedRng(sp40); +} +#else +__attribute__((naked)) +void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x58\n\ + str r0, [sp, 0x2C]\n\ + str r1, [sp, 0x30]\n\ + str r3, [sp, 0x38]\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r2, [sp, 0x34]\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x40]\n\ + ldr r0, _080B9DA8 @ =gLinkPlayers\n\ + ldrh r0, [r0, 0x4]\n\ + bl SeedRng\n\ + bl GetLinkPlayerCount\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + movs r3, 0\n\ + add r0, sp, 0x1C\n\ + mov r9, r0\n\ + movs r1, 0x1D\n\ + add r1, sp\n\ + mov r10, r1\n\ + mov r2, sp\n\ + adds r2, 0xC\n\ + str r2, [sp, 0x4C]\n\ + movs r7, 0xFF\n\ + add r4, sp, 0x8\n\ + movs r2, 0\n\ + mov r6, r9\n\ + mov r5, r10\n\ +_080B9CBC:\n\ + mov r1, sp\n\ + adds r1, r3\n\ + adds r1, 0x4\n\ + ldrb r0, [r1]\n\ + orrs r0, r7\n\ + strb r0, [r1]\n\ + adds r0, r4, r3\n\ + strb r2, [r0]\n\ + lsls r1, r3, 1\n\ + adds r0, r6, r1\n\ + strb r2, [r0]\n\ + adds r1, r5, r1\n\ + strb r2, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x3\n\ + bls _080B9CBC\n\ + movs r4, 0\n\ + str r4, [sp, 0x3C]\n\ + movs r3, 0\n\ + mov r1, r8\n\ + lsls r0, r1, 16\n\ + lsrs r1, r0, 16\n\ + str r0, [sp, 0x50]\n\ + ldr r4, [sp, 0x30]\n\ + ldr r0, [sp, 0x34]\n\ + adds r2, r4, 0\n\ + muls r2, r0\n\ + str r2, [sp, 0x48]\n\ + ldr r2, [sp, 0x3C]\n\ + cmp r2, r1\n\ + bcs _080B9D46\n\ + mov r8, r1\n\ +_080B9D00:\n\ + ldr r4, [sp, 0x30]\n\ + adds r0, r4, 0\n\ + muls r0, r3\n\ + ldr r1, [sp, 0x2C]\n\ + adds r6, r1, r0\n\ + ldr r0, [r6, 0x70]\n\ + cmp r0, 0\n\ + beq _080B9D3C\n\ + movs r7, 0\n\ + cmp r7, r0\n\ + bcs _080B9D3C\n\ + adds r4, r6, 0\n\ + adds r4, 0x74\n\ + mov r2, r9\n\ + lsls r1, r3, 1\n\ + movs r5, 0x1\n\ +_080B9D20:\n\ + lsls r0, r7, 1\n\ + adds r0, r4, r0\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + bne _080B9D30\n\ + adds r0, r7, r1\n\ + adds r0, r2, r0\n\ + strb r5, [r0]\n\ +_080B9D30:\n\ + adds r0, r7, 0x1\n\ + lsls r0, 16\n\ + lsrs r7, r0, 16\n\ + ldr r0, [r6, 0x70]\n\ + cmp r7, r0\n\ + bcc _080B9D20\n\ +_080B9D3C:\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, r8\n\ + bcc _080B9D00\n\ +_080B9D46:\n\ + movs r7, 0\n\ + movs r3, 0\n\ + ldr r2, [sp, 0x50]\n\ + cmp r2, 0\n\ + beq _080B9E3E\n\ + mov r4, sp\n\ + adds r4, 0x24\n\ + str r4, [sp, 0x44]\n\ + movs r0, 0x25\n\ + add r0, sp\n\ + mov r8, r0\n\ +_080B9D5C:\n\ + ldr r1, [sp, 0x30]\n\ + adds r0, r1, 0\n\ + muls r0, r3\n\ + ldr r2, [sp, 0x2C]\n\ + adds r6, r2, r0\n\ + lsls r1, r3, 1\n\ + mov r4, r9\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + beq _080B9D7C\n\ + mov r2, r10\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080B9D86\n\ +_080B9D7C:\n\ + ldr r0, [sp, 0x3C]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x3C]\n\ +_080B9D86:\n\ + mov r4, r9\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080B9DAC\n\ + mov r2, r10\n\ + adds r0, r2, r1\n\ + ldrb r2, [r0]\n\ + cmp r2, 0\n\ + bne _080B9DAC\n\ +_080B9D9A:\n\ + lsls r1, r7, 1\n\ + ldr r4, [sp, 0x44]\n\ + adds r0, r4, r1\n\ + strb r3, [r0]\n\ + add r1, r8\n\ + strb r2, [r1]\n\ + b _080B9E2C\n\ + .align 2, 0\n\ +_080B9DA8: .4byte gLinkPlayers\n\ +_080B9DAC:\n\ + mov r2, r9\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080B9DC0\n\ + mov r4, r10\n\ + adds r0, r4, r1\n\ + ldrb r2, [r0]\n\ + cmp r2, 0x1\n\ + beq _080B9D9A\n\ +_080B9DC0:\n\ + mov r2, r9\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080B9E32\n\ + mov r4, r10\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080B9E32\n\ + lsls r5, r7, 1\n\ + ldr r1, [sp, 0x44]\n\ + adds r0, r1, r5\n\ + strb r3, [r0]\n\ + adds r0, r6, 0\n\ + str r3, [sp, 0x54]\n\ + bl sub_80B9BBC\n\ + adds r4, r0, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r0, r6, 0\n\ + adds r0, 0x38\n\ + bl sub_80B9BBC\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldr r3, [sp, 0x54]\n\ + cmp r4, 0\n\ + bne _080B9E0A\n\ + cmp r1, 0\n\ + beq _080B9E0E\n\ + mov r2, r8\n\ + adds r1, r2, r5\n\ + movs r0, 0x1\n\ + strb r0, [r1]\n\ + b _080B9E2C\n\ +_080B9E0A:\n\ + cmp r1, 0\n\ + beq _080B9E26\n\ +_080B9E0E:\n\ + str r3, [sp, 0x54]\n\ + bl Random\n\ + mov r4, r8\n\ + adds r2, r4, r5\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x1\n\ + ands r0, r1\n\ + strb r0, [r2]\n\ + ldr r3, [sp, 0x54]\n\ + b _080B9E2C\n\ +_080B9E26:\n\ + mov r2, r8\n\ + adds r0, r2, r5\n\ + strb r1, [r0]\n\ +_080B9E2C:\n\ + adds r0, r7, 0x1\n\ + lsls r0, 16\n\ + lsrs r7, r0, 16\n\ +_080B9E32:\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldr r4, [sp, 0x50]\n\ + cmp r0, r4\n\ + bcc _080B9D5C\n\ +_080B9E3E:\n\ + movs r3, 0\n\ + ldr r1, [sp, 0x48]\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r0, 3\n\ + ldr r2, [sp, 0x2C]\n\ + adds r6, r2, r0\n\ + ldr r1, [sp, 0x4C]\n\ +_080B9E4E:\n\ + lsls r0, r3, 2\n\ + adds r0, r1, r0\n\ + str r6, [r0]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x3\n\ + bls _080B9E4E\n\ + ldr r0, [sp, 0x38]\n\ + bl sub_80B9C4C\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + movs r1, 0x3\n\ + bl __umodsi3\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldr r4, [sp, 0x3C]\n\ + cmp r4, 0x3\n\ + beq _080B9E9C\n\ + cmp r4, 0x3\n\ + bgt _080B9E82\n\ + cmp r4, 0x2\n\ + beq _080B9E8A\n\ + b _080B9EF0\n\ +_080B9E82:\n\ + ldr r0, [sp, 0x3C]\n\ + cmp r0, 0x4\n\ + beq _080B9EBC\n\ + b _080B9EF0\n\ +_080B9E8A:\n\ + add r2, sp, 0x24\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r1, [sp, 0x30]\n\ + movs r3, 0\n\ + bl sub_80B9BC4\n\ + b _080B9EF0\n\ +_080B9E9C:\n\ + ldr r0, _080B9EB8 @ =gUnknown_083D02B4\n\ + lsls r1, 1\n\ + adds r2, r1, r0\n\ + ldrb r3, [r2]\n\ + adds r0, 0x1\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + add r2, sp, 0x24\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r1, [sp, 0x30]\n\ + bl sub_80B9BC4\n\ + b _080B9EF0\n\ + .align 2, 0\n\ +_080B9EB8: .4byte gUnknown_083D02B4\n\ +_080B9EBC:\n\ + add r6, sp, 0x24\n\ + ldr r4, _080B9F2C @ =gUnknown_083D02BA\n\ + lsls r5, r1, 2\n\ + adds r0, r5, r4\n\ + ldrb r3, [r0]\n\ + adds r0, r4, 0x1\n\ + adds r0, r5, r0\n\ + ldrb r0, [r0]\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r1, [sp, 0x30]\n\ + adds r2, r6, 0\n\ + bl sub_80B9BC4\n\ + adds r0, r4, 0x2\n\ + adds r0, r5, r0\n\ + ldrb r3, [r0]\n\ + adds r4, 0x3\n\ + adds r5, r4\n\ + ldrb r0, [r5]\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + ldr r1, [sp, 0x30]\n\ + adds r2, r6, 0\n\ + bl sub_80B9BC4\n\ +_080B9EF0:\n\ + ldr r1, [sp, 0x2C]\n\ + ldr r2, [sp, 0x48]\n\ + adds r6, r1, r2\n\ + ldr r4, _080B9F30 @ =gSaveBlock1\n\ + ldr r1, _080B9F34 @ =0x0000303c\n\ + adds r0, r4, r1\n\ + adds r1, r6, 0\n\ + movs r2, 0x38\n\ + bl memcpy\n\ + ldr r2, _080B9F38 @ =0x00003074\n\ + adds r4, r2\n\ + adds r1, r6, 0\n\ + adds r1, 0x38\n\ + adds r0, r4, 0\n\ + movs r2, 0x38\n\ + bl memcpy\n\ + ldr r0, [sp, 0x40]\n\ + bl SeedRng\n\ + add sp, 0x58\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B9F2C: .4byte gUnknown_083D02BA\n\ +_080B9F30: .4byte gSaveBlock1\n\ +_080B9F34: .4byte 0x0000303c\n\ +_080B9F38: .4byte 0x00003074\n\ + .syntax divided\n"); +} +#endif + +void sub_80B9F3C(u16 *a, u8 b) +{ + if (b != 0 && *a != 0) + { + if (GetPocketByItemId(*a) == 5) + { + if (!CheckBagHasItem(*a, 1) && !CheckPCHasItem(*a, 1) && AddBagItem(*a, 1)) + { + VarSet(VAR_TEMP_1, *a); + StringCopy(gStringVar1, gLinkPlayers[0].name); + if (*a == ITEM_EON_TICKET) + FlagSet(FLAG_SYS_HAS_EON_TICKET); + } + else + { + VarSet(VAR_TEMP_1, ITEM_NONE); + } + } + else + { + if (AddBagItem(*a, 1) == TRUE) + { + VarSet(VAR_TEMP_1, *a); + StringCopy(gStringVar1, gLinkPlayers[0].name); + } + else + { + VarSet(VAR_TEMP_1, ITEM_NONE); + } + } + } +} + +void sub_80BA00C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[0]++; + break; + case 1: + task->data[0]++; + break; + case 2: + SetSecretBase2Field_9_AndHideBG(); + sub_8125E2C(); + task->data[0]++; + break; + case 3: + if (sub_8125E6C() != 0) + { + ClearSecretBase2Field_9_2(); + task->data[0]++; + task->data[1] = 0; + } + break; + case 4: + task->data[1]++; + if (task->data[1] > 10) + { + sub_800832C(); + task->data[0]++; + } + break; + case 5: + if (!gReceivedRemoteLinkPlayers) + DestroyTask(taskId); + break; + } +} diff --git a/src/region_map.c b/src/region_map.c new file mode 100644 index 000000000..e40fb7752 --- /dev/null +++ b/src/region_map.c @@ -0,0 +1,1971 @@ +#include "global.h" +#include "event_data.h" +#include "field_effect.h" +#include "field_specials.h" +#include "m4a.h" +#include "main.h" +#include "constants/maps.h" +#include "menu.h" +#include "palette.h" +#include "pokemon_menu.h" +#include "region_map.h" +#include "overworld.h" +#include "secret_base.h" +#include "constants/songs.h" +#include "sprite.h" +#include "strings.h" +#include "string_util.h" +#include "text.h" +#include "trig.h" +#include "ewram.h" + +// Map Section IDs +#define MAPSEC_LITTLEROOT_TOWN 0 +#define MAPSEC_OLDALE_TOWN 1 +#define MAPSEC_DEWFORD_TOWN 2 +#define MAPSEC_LAVARIDGE_TOWN 3 +#define MAPSEC_FALLARBOR_TOWN 4 +#define MAPSEC_VERDANTURF_TOWN 5 +#define MAPSEC_PACIFIDLOG_TOWN 6 +#define MAPSEC_PETALBURG_CITY 7 +#define MAPSEC_SLATEPORT_CITY 8 +#define MAPSEC_MAUVILLE_CITY 9 +#define MAPSEC_RUSTBORO_CITY 10 +#define MAPSEC_FORTREE_CITY 11 +#define MAPSEC_LILYCOVE_CITY 12 +#define MAPSEC_MOSSDEEP_CITY 13 +#define MAPSEC_SOOTOPOLIS_CITY 14 +#define MAPSEC_EVER_GRANDE_CITY 15 +#define MAPSEC_ROUTE_101 0x10 +#define MAPSEC_ROUTE_102 0x11 +#define MAPSEC_ROUTE_103 0x12 +#define MAPSEC_ROUTE_104 0x13 +#define MAPSEC_ROUTE_105 0x14 +#define MAPSEC_ROUTE_106 0x15 +#define MAPSEC_ROUTE_107 0x16 +#define MAPSEC_ROUTE_108 0x17 +#define MAPSEC_ROUTE_109 0x18 +#define MAPSEC_ROUTE_110 0x19 +#define MAPSEC_ROUTE_111 0x1A +#define MAPSEC_ROUTE_112 0x1B +#define MAPSEC_ROUTE_113 0x1C +#define MAPSEC_ROUTE_114 0x1D +#define MAPSEC_ROUTE_115 0x1E +#define MAPSEC_ROUTE_116 0x1F +#define MAPSEC_ROUTE_117 0x20 +#define MAPSEC_ROUTE_118 0x21 +#define MAPSEC_ROUTE_119 0x22 +#define MAPSEC_ROUTE_120 0x23 +#define MAPSEC_ROUTE_121 0x24 +#define MAPSEC_ROUTE_122 0x25 +#define MAPSEC_ROUTE_123 0x26 +#define MAPSEC_ROUTE_124 0x27 +#define MAPSEC_ROUTE_125 0x28 +#define MAPSEC_ROUTE_126 0x29 +#define MAPSEC_ROUTE_127 0x2A +#define MAPSEC_ROUTE_128 0x2B +#define MAPSEC_ROUTE_129 0x2C +#define MAPSEC_ROUTE_130 0x2D +#define MAPSEC_ROUTE_131 0x2E +#define MAPSEC_ROUTE_132 0x2F +#define MAPSEC_ROUTE_133 0x30 +#define MAPSEC_ROUTE_134 0x31 +#define MAPSEC_UNDERWATER1 0x32 +#define MAPSEC_UNDERWATER2 0x33 +#define MAPSEC_UNDERWATER3 0x34 +#define MAPSEC_UNDERWATER4 0x35 +#define MAPSEC_UNDERWATER5 0x36 +#define MAPSEC_GRANITE_CAVE 0x37 +#define MAPSEC_MT_CHIMNEY 0x38 +#define MAPSEC_SAFARI_ZONE 0x39 +#define MAPSEC_BATTLE_TOWER 0x3A +#define MAPSEC_PETALBURG_WOODS 0x3B +#define MAPSEC_RUSTURF_TUNNEL 0x3C +#define MAPSEC_ABANDONED_SHIP 0x3D +#define MAPSEC_NEW_MAUVILLE 0x3E +#define MAPSEC_METEOR_FALLS_1 0x3F +#define MAPSEC_METEOR_FALLS_2 0x40 +#define MAPSEC_MT_PYRE 0x41 +#define MAPSEC_EVIL_TEAM_HIDEOUT 0x42 +#define MAPSEC_SHOAL_CAVE 0x43 +#define MAPSEC_SEAFLOOR_CAVERN 0x44 +#define MAPSEC_UNDERWATER6 0x45 +#define MAPSEC_VICTORY_ROAD 0x46 +#define MAPSEC_MIRAGE_ISLAND 0x47 +#define MAPSEC_CAVE_OF_ORIGIN 0x48 +#define MAPSEC_SOUTHERN_ISLAND 0x49 +#define MAPSEC_FIERY_PATH_1 0x4A +#define MAPSEC_FIERY_PATH_2 0x4B +#define MAPSEC_JAGGED_PASS_1 0x4C +#define MAPSEC_JAGGED_PASS_2 0x4D +#define MAPSEC_SEALED_CHAMBER 0x4E +#define MAPSEC_UNDERWATER7 0x4F +#define MAPSEC_SCORCHED_SLAB 0x50 +#define MAPSEC_ISLAND_CAVE 0x51 +#define MAPSEC_DESERT_RUINS 0x52 +#define MAPSEC_ANCIENT_TOMB 0x53 +#define MAPSEC_INSIDE_OF_TRUCK 0x54 +#define MAPSEC_SKY_PILLAR 0x55 +#define MAPSEC_SECRET_BASE 0x56 +#define MAPSEC_UNK_0x57 0x57 +#define MAPSEC_NONE 0x58 + +#define MAP_WIDTH 28 +#define MAP_HEIGHT 15 +#define MAPCURSOR_X_MIN 1 +#define MAPCURSOR_Y_MIN 2 +#define MAPCURSOR_X_MAX (MAPCURSOR_X_MIN + MAP_WIDTH - 1) +#define MAPCURSOR_Y_MAX (MAPCURSOR_Y_MIN + MAP_HEIGHT - 1) + +// Input events +enum +{ + INPUT_EVENT_NONE, + INPUT_EVENT_DPAD, + INPUT_EVENT_2, + INPUT_EVENT_3, + INPUT_EVENT_A_BUTTON, + INPUT_EVENT_B_BUTTON, +}; + +static EWRAM_DATA struct RegionMap *gRegionMap = NULL; + +static const u16 sRegionMapCursor_Pal[] = INCBIN_U16("graphics/pokenav/cursor.gbapal"); +static const u8 sRegionMapCursorSmall_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_small.4bpp.lz"); +static const u8 sRegionMapCursorLarge_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_large.4bpp.lz"); +static const u16 sRegionMapBrendanIcon_Pal[] = INCBIN_U16("graphics/pokenav/brendan_icon.gbapal"); +static const u8 sRegionMapBrendanIcon_Image[] = INCBIN_U8("graphics/pokenav/brendan_icon.4bpp"); +static const u16 sRegionMapMayIcon_Pal[] = INCBIN_U16("graphics/pokenav/may_icon.gbapal"); +static const u8 sRegionMapMayIcon_Image[] = INCBIN_U8("graphics/pokenav/may_icon.4bpp"); +static const u16 sRegionMapBkgnd_Pal[] = INCBIN_U16("graphics/pokenav/region_map.gbapal"); +static const u8 sRegionMapBkgnd_ImageLZ[] = INCBIN_U8("graphics/pokenav/region_map.8bpp.lz"); +static const u8 sRegionMapBkgnd_TilemapLZ[] = INCBIN_U8("graphics/pokenav/region_map_map.bin.lz"); + +#include "data/region_map_layout.h" + +#if ENGLISH +#include "data/region_map_names_en.h" +#elif GERMAN +#include "data/region_map_names_de.h" +#endif + +struct RegionMapLocation +{ + u8 x, y; + u8 width, height; + const u8 *regionMapSectionId; +}; + +const struct RegionMapLocation gRegionMapLocations[] = +{ + { 4, 11, 1, 1, gMapName_LittlerootTown}, + { 4, 9, 1, 1, gMapName_OldaleTown}, + { 2, 14, 1, 1, gMapName_DewfordTown}, + { 5, 3, 1, 1, gMapName_LavaridgeTown}, + { 3, 0, 1, 1, gMapName_FallarborTown}, + { 4, 6, 1, 1, gMapName_VerdanturfTown}, + {17, 10, 1, 1, gMapName_PacifidlogTown}, + { 1, 9, 1, 1, gMapName_PetalburgCity}, + { 8, 10, 1, 2, gMapName_SlateportCity}, + { 8, 6, 2, 1, gMapName_MauvilleCity}, + { 0, 5, 1, 2, gMapName_RustboroCity}, + {12, 0, 1, 1, gMapName_FortreeCity}, + {18, 3, 2, 1, gMapName_LilycoveCity}, + {24, 5, 2, 1, gMapName_MossdeepCity}, + {21, 7, 1, 1, gMapName_SootopolisCity}, + {27, 8, 1, 2, gMapName_EverGrandeCity}, + { 4, 10, 1, 1, gMapName_Route101}, + { 2, 9, 2, 1, gMapName_Route102}, + { 4, 8, 4, 1, gMapName_Route103}, + { 0, 7, 1, 3, gMapName_Route104}, + { 0, 10, 1, 3, gMapName_Route105}, + { 0, 13, 2, 1, gMapName_Route106}, + { 3, 14, 3, 1, gMapName_Route107}, + { 6, 14, 2, 1, gMapName_Route108}, + { 8, 12, 1, 3, gMapName_Route109}, + { 8, 7, 1, 3, gMapName_Route110}, + { 8, 0, 1, 6, gMapName_Route111}, + { 6, 3, 2, 1, gMapName_Route112}, + { 4, 0, 4, 1, gMapName_Route113}, + { 1, 0, 2, 3, gMapName_Route114}, + { 0, 2, 1, 3, gMapName_Route115}, + { 1, 5, 4, 1, gMapName_Route116}, + { 5, 6, 3, 1, gMapName_Route117}, + {10, 6, 2, 1, gMapName_Route118}, + {11, 0, 1, 6, gMapName_Route119}, + {13, 0, 1, 4, gMapName_Route120}, + {14, 3, 4, 1, gMapName_Route121}, + {16, 4, 1, 2, gMapName_Route122}, + {12, 6, 5, 1, gMapName_Route123}, + {20, 3, 4, 3, gMapName_Route124}, + {24, 3, 2, 2, gMapName_Route125}, + {20, 6, 3, 3, gMapName_Route126}, + {23, 6, 3, 3, gMapName_Route127}, + {23, 9, 4, 1, gMapName_Route128}, + {24, 10, 2, 1, gMapName_Route129}, + {21, 10, 3, 1, gMapName_Route130}, + {18, 10, 3, 1, gMapName_Route131}, + {15, 10, 2, 1, gMapName_Route132}, + {12, 10, 3, 1, gMapName_Route133}, + { 9, 10, 3, 1, gMapName_Route134}, + {20, 3, 4, 3, gMapName_Underwater}, + {20, 6, 3, 3, gMapName_Underwater}, + {23, 6, 3, 3, gMapName_Underwater}, + {23, 9, 4, 1, gMapName_Underwater}, + {21, 7, 1, 1, gMapName_Underwater}, + { 1, 13, 1, 1, gMapName_GraniteCave}, + { 6, 2, 1, 1, gMapName_MtChimney}, + {16, 2, 1, 1, gMapName_SafariZone}, + {22, 12, 1, 1, gMapName_BattleTower}, + { 0, 8, 1, 1, gMapName_PetalburgWoods}, + { 2, 5, 1, 1, gMapName_RusturfTunnel}, + { 6, 14, 1, 1, gMapName_AbandonedShip}, + { 8, 7, 1, 1, gMapName_NewMauville}, + { 0, 3, 1, 1, gMapName_MeteorFalls}, + { 1, 2, 1, 1, gMapName_MeteorFalls}, + {16, 4, 1, 1, gMapName_MtPyre}, + {19, 3, 1, 1, gMapName_EvilTeamHideout}, + {24, 4, 1, 1, gMapName_ShoalCave}, + {24, 9, 1, 1, gMapName_SeafloorCavern}, + {24, 9, 1, 1, gMapName_Underwater}, + {27, 9, 1, 1, gMapName_VictoryRoad}, + {17, 10, 1, 1, gMapName_MirageIsland}, + {21, 7, 1, 1, gMapName_CaveOfOrigin}, + {12, 14, 1, 1, gMapName_SouthernIsland}, + { 6, 3, 1, 1, gMapName_FieryPath}, + { 7, 3, 1, 1, gMapName_FieryPath}, + { 6, 3, 1, 1, gMapName_JaggedPass}, + { 7, 2, 1, 1, gMapName_JaggedPass}, + {11, 10, 1, 1, gMapName_SealedChamber}, + {11, 10, 1, 1, gMapName_Underwater}, + {13, 0, 1, 1, gMapName_ScorchedSlab}, + {0, 10, 1, 1, gMapName_IslandCave}, + { 8, 3, 1, 1, gMapName_DesertRuins}, + {13, 2, 1, 1, gMapName_AncientTomb}, + { 0, 0, 1, 1, gMapName_InsideOfTruck}, + {19, 10, 1, 1, gMapName_SkyPillar}, + { 0, 0, 1, 1, gMapName_SecretBase}, + { 0, 0, 1, 1, gMapName_None}, +}; + +static const u16 gUnknown_083E7684[][2] = +{ + {MAPSEC_UNDERWATER1, MAPSEC_ROUTE_124}, + {MAPSEC_UNDERWATER2, MAPSEC_ROUTE_126}, + {MAPSEC_UNDERWATER3, MAPSEC_ROUTE_127}, + {MAPSEC_UNDERWATER4, MAPSEC_ROUTE_128}, + {MAPSEC_UNDERWATER5, MAPSEC_SOOTOPOLIS_CITY}, + {MAPSEC_UNDERWATER6, MAPSEC_ROUTE_128}, + {MAPSEC_EVIL_TEAM_HIDEOUT, MAPSEC_LILYCOVE_CITY}, + {MAPSEC_UNDERWATER7, MAPSEC_ROUTE_134}, + {MAPSEC_PETALBURG_WOODS, MAPSEC_ROUTE_104}, + {MAPSEC_JAGGED_PASS_1, MAPSEC_ROUTE_112}, + {MAPSEC_MT_PYRE, MAPSEC_ROUTE_122}, + {MAPSEC_SKY_PILLAR, MAPSEC_ROUTE_131}, + {MAPSEC_NONE, MAPSEC_NONE}, +}; + +static u8 sub_80FAB78(void); +static u8 _swiopen(void); +static u8 sub_80FAD04(void); +static u8 sub_80FADE4(void); +static void CalcZoomScrollParams(s16, s16, s16, s16, u16, u16, u8); +static void sub_80FB238(s16, s16); +void UpdateRegionMapVideoRegs(void); +static u16 GetRegionMapSectionAt(u16, u16); +static void InitializeCursorPosition(void); +static void sub_80FB600(void); +static u16 sub_80FB758(u16); +static u16 sub_80FB9C0(u16); +static void sub_80FBA18(void); +static bool8 sub_80FBAA0(u16); +void CreateRegionMapCursor(u16, u16); +void sub_80FBCA0(void); +static void sub_80FBDF8(void); +static void sub_80FBE24(void); +static void SpriteCB_PlayerIconZoomedOut(struct Sprite *); +static void UpdateIconBlink(struct Sprite *); +static void SpriteCB_PlayerIconZoomedIn(struct Sprite *); +const u8 *GetMapSectionName(u8 *, u16, u16); +static void VBlankCB_FlyRegionMap(void); +void CB2_FlyRegionMap(void); +void sub_80FC244(void (*func)(void)); +static void PrintFlyTargetName(void); +static void CreateFlyTargetGraphics(void); +static void CreateCityTownFlyTargetIcons(void); +static void CreateSpecialAreaFlyTargetIcons(void); +static void SpriteCB_FlyTargetIcons(struct Sprite *); +static void sub_80FC5B4(void); +static void sub_80FC600(void); +void sub_80FC69C(void); + +void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed) +{ + sub_80FA904(regionMap, zoomed); + while (sub_80FA940()) + ; +} + +void sub_80FA904(struct RegionMap *regionMap, bool8 zoomed) +{ + gRegionMap = regionMap; + gRegionMap->initStep = 0; + gRegionMap->zoomed = zoomed; + gRegionMap->inputCallback = (zoomed == 0) ? sub_80FAB78 : sub_80FAD04; +} + +bool8 sub_80FA940(void) +{ + switch (gRegionMap->initStep) + { + case 0: + LZ77UnCompVram(sRegionMapBkgnd_ImageLZ, (void *)(VRAM + 0x8000)); + break; + case 1: + LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (void *)(VRAM + 0xE000)); + break; + case 2: + LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60); // Why isn't this the right size? + break; + case 3: + LZ77UnCompWram(sRegionMapCursorSmall_ImageLZ, gRegionMap->cursorSmallImage); + break; + case 4: + LZ77UnCompWram(sRegionMapCursorLarge_ImageLZ, gRegionMap->cursorLargeImage); + break; + case 5: + InitializeCursorPosition(); + gRegionMap->unk74 = gRegionMap->cursorPosX; + gRegionMap->unk76 = gRegionMap->cursorPosY; + gRegionMap->unk16 = sub_80FB758(gRegionMap->mapSectionId); + gRegionMap->mapSectionId = sub_80FB9C0(gRegionMap->mapSectionId); + GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16); + break; + case 6: + if (gRegionMap->zoomed == FALSE) + { + CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0); + } + else + { + gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 52; + gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 68; + gRegionMap->unk64 = gRegionMap->cursorPosX; + gRegionMap->unk66 = gRegionMap->cursorPosY; + CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0); + } + break; + case 7: + sub_80FBA18(); + UpdateRegionMapVideoRegs(); + gRegionMap->cursorSprite = NULL; + gRegionMap->playerIconSprite = NULL; + gRegionMap->unk7A = 0; + gRegionMap->blinkPlayerIcon = FALSE; + REG_BG2CNT = 0xBC8A; + gRegionMap->initStep++; + default: + return FALSE; + } + gRegionMap->initStep++; + return TRUE; +} + +void FreeRegionMapIconResources(void) +{ + if (gRegionMap->cursorSprite != NULL) + { + DestroySprite(gRegionMap->cursorSprite); + FreeSpriteTilesByTag(gRegionMap->cursorTileTag); + FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag); + } + if (gRegionMap->playerIconSprite != NULL) + { + DestroySprite(gRegionMap->playerIconSprite); + FreeSpriteTilesByTag(gRegionMap->playerIconTileTag); + FreeSpritePaletteByTag(gRegionMap->playerIconPaletteTag); + } +} + +u8 sub_80FAB60(void) +{ + return gRegionMap->inputCallback(); +} + +static u8 sub_80FAB78(void) +{ + u8 event = INPUT_EVENT_NONE; + + gRegionMap->cursorDeltaX = 0; + gRegionMap->cursorDeltaY = 0; + if ((gMain.heldKeys & DPAD_UP) && gRegionMap->cursorPosY > MAPCURSOR_Y_MIN) + { + gRegionMap->cursorDeltaY = -1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->cursorPosY < MAPCURSOR_Y_MAX) + { + gRegionMap->cursorDeltaY = 1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->cursorPosX > MAPCURSOR_X_MIN) + { + gRegionMap->cursorDeltaX = -1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->cursorPosX < MAPCURSOR_X_MAX) + { + gRegionMap->cursorDeltaX = 1; + event = INPUT_EVENT_DPAD; + } + + if (gMain.newKeys & A_BUTTON) + event = INPUT_EVENT_A_BUTTON; + else if (gMain.newKeys & B_BUTTON) + event = INPUT_EVENT_B_BUTTON; + + if (event == INPUT_EVENT_DPAD) + { + gRegionMap->unk7A = 4; + gRegionMap->inputCallback = _swiopen; + } + return event; +} + +static u8 _swiopen(void) +{ + u16 mapSectionId; + + if (gRegionMap->unk7A != 0) + return INPUT_EVENT_2; + + if (gRegionMap->cursorDeltaX > 0) + gRegionMap->cursorPosX++; + + if (gRegionMap->cursorDeltaX < 0) + gRegionMap->cursorPosX--; + + if (gRegionMap->cursorDeltaY > 0) + gRegionMap->cursorPosY++; + + if (gRegionMap->cursorDeltaY < 0) + gRegionMap->cursorPosY--; + + mapSectionId = GetRegionMapSectionAt(gRegionMap->cursorPosX, gRegionMap->cursorPosY); + gRegionMap->unk16 = sub_80FB758(mapSectionId); + if (mapSectionId != gRegionMap->mapSectionId) + { + gRegionMap->mapSectionId = mapSectionId; + GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16); + } + sub_80FBA18(); + gRegionMap->inputCallback = sub_80FAB78; + return INPUT_EVENT_3; +} + +static u8 sub_80FAD04(void) +{ + u8 event = INPUT_EVENT_NONE; + + gRegionMap->unk6A = 0; + gRegionMap->unk68 = 0; + if ((gMain.heldKeys & DPAD_UP) && gRegionMap->scrollY > -52) + { + gRegionMap->unk68 = -1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->scrollY < 60) + { + gRegionMap->unk68 = 1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->scrollX > -44) + { + gRegionMap->unk6A = -1; + event = INPUT_EVENT_DPAD; + } + if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->scrollX < 172) + { + gRegionMap->unk6A = 1; + event = INPUT_EVENT_DPAD; + } + + if (gMain.newKeys & A_BUTTON) + event = INPUT_EVENT_A_BUTTON; + if (gMain.newKeys & B_BUTTON) + event = INPUT_EVENT_B_BUTTON; + + if (event == INPUT_EVENT_DPAD) + { + gRegionMap->inputCallback = sub_80FADE4; + gRegionMap->unk6C = 0; + } + return event; +} + +static u8 sub_80FADE4(void) +{ + gRegionMap->scrollY += gRegionMap->unk68; + gRegionMap->scrollX += gRegionMap->unk6A; + sub_80FB238(gRegionMap->scrollX, gRegionMap->scrollY); + gRegionMap->unk6C++; + if (gRegionMap->unk6C == 8) + { + u16 r3 = (gRegionMap->scrollX + 44) / 8 + 1; + u16 r1 = (gRegionMap->scrollY + 52) / 8 + 2; + + if (r3 != gRegionMap->unk64 || r1 != gRegionMap->unk66) + { + u16 mapSectionId; + + gRegionMap->unk64 = r3; + gRegionMap->unk66 = r1; + mapSectionId = GetRegionMapSectionAt(r3, r1); + gRegionMap->unk16 = sub_80FB758(mapSectionId); + if (mapSectionId != gRegionMap->mapSectionId) + { + gRegionMap->mapSectionId = mapSectionId; + GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16); + } + sub_80FBA18(); + } + gRegionMap->unk6C = 0; + gRegionMap->inputCallback = sub_80FAD04; + return INPUT_EVENT_3; + } + return INPUT_EVENT_2; +} + +void sub_80FAEC4(void) +{ + if (gRegionMap->zoomed == FALSE) + { + gRegionMap->scrollY = 0; + gRegionMap->scrollX = 0; + gRegionMap->unk40 = 0; + gRegionMap->unk3C = 0; + gRegionMap->unk60 = gRegionMap->cursorPosX * 8 - 52; + gRegionMap->unk62 = gRegionMap->cursorPosY * 8 - 68; + gRegionMap->unk44 = (gRegionMap->unk60 << 8) / 16; + gRegionMap->unk48 = (gRegionMap->unk62 << 8) / 16; + gRegionMap->unk64 = gRegionMap->cursorPosX; + gRegionMap->unk66 = gRegionMap->cursorPosY; + gRegionMap->unk4C = (256 << 8); + gRegionMap->unk50 = -0x800; + } + else + { + gRegionMap->unk3C = gRegionMap->scrollX * 256; + gRegionMap->unk40 = gRegionMap->scrollY * 256; + gRegionMap->unk60 = 0; + gRegionMap->unk62 = 0; + gRegionMap->unk44 = -(gRegionMap->unk3C / 16); + gRegionMap->unk48 = -(gRegionMap->unk40 / 16); + gRegionMap->cursorPosX = gRegionMap->unk64; + gRegionMap->cursorPosY = gRegionMap->unk66; + gRegionMap->unk4C = (128 << 8); + gRegionMap->unk50 = 0x800; + } + gRegionMap->unk6E = 0; + sub_80FBCA0(); + sub_80FBDF8(); +} + +u8 sub_80FAFC0(void) +{ + u8 r4; + + if (gRegionMap->unk6E >= 16) + return 0; + gRegionMap->unk6E++; + if (gRegionMap->unk6E == 16) + { + gRegionMap->unk44 = 0; + gRegionMap->unk48 = 0; + gRegionMap->scrollX = gRegionMap->unk60; + gRegionMap->scrollY = gRegionMap->unk62; + gRegionMap->unk4C = (gRegionMap->zoomed == FALSE) ? (128 << 8) : (256 << 8); + gRegionMap->zoomed = !gRegionMap->zoomed; + gRegionMap->inputCallback = (gRegionMap->zoomed == FALSE) ? sub_80FAB78 : sub_80FAD04; + CreateRegionMapCursor(gRegionMap->cursorTileTag, gRegionMap->cursorPaletteTag); + sub_80FBE24(); + r4 = 0; + } + else + { + gRegionMap->unk3C += gRegionMap->unk44; + gRegionMap->unk40 += gRegionMap->unk48; + gRegionMap->scrollX = gRegionMap->unk3C >> 8; + gRegionMap->scrollY = gRegionMap->unk40 >> 8; + gRegionMap->unk4C += gRegionMap->unk50; + if ((gRegionMap->unk44 < 0 && gRegionMap->scrollX < gRegionMap->unk60) + || (gRegionMap->unk44 > 0 && gRegionMap->scrollX > gRegionMap->unk60)) + { + gRegionMap->scrollX = gRegionMap->unk60; + gRegionMap->unk44 = 0; + } + if ((gRegionMap->unk48 < 0 && gRegionMap->scrollY < gRegionMap->unk62) + || (gRegionMap->unk48 > 0 && gRegionMap->scrollY > gRegionMap->unk62)) + { + gRegionMap->scrollY = gRegionMap->unk62; + gRegionMap->unk48 = 0; + } + if (gRegionMap->zoomed == FALSE) + { + if (gRegionMap->unk4C < (128 << 8)) + { + gRegionMap->unk4C = (128 << 8); + gRegionMap->unk50 = 0; + } + } + else + { + if (gRegionMap->unk4C > (256 << 8)) + { + gRegionMap->unk4C = (256 << 8); + gRegionMap->unk50 = 0; + } + } + r4 = 1; + } + CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, gRegionMap->unk4C >> 8, gRegionMap->unk4C >> 8, 0); + return r4; +} + +static void CalcZoomScrollParams(s16 a, s16 b, s16 c, s16 d, u16 e, u16 f, u8 rotation) +{ + s32 var1; + s32 var2; + s32 var3; + s32 var4; + + gRegionMap->unk2C = e * gSineTable[rotation + 64] >> 8; + gRegionMap->unk30 = e * -gSineTable[rotation] >> 8; + gRegionMap->unk34 = f * gSineTable[rotation] >> 8; + gRegionMap->unk38 = f * gSineTable[rotation + 64] >> 8; + + var1 = (a << 8) + (c << 8); + var2 = d * gRegionMap->unk34 + gRegionMap->unk2C * c; + gRegionMap->bg2x = var1 - var2; + + var3 = (b << 8) + (d << 8); + var4 = gRegionMap->unk38 * d + gRegionMap->unk30 * c; + gRegionMap->bg2y = var3 - var4; + + gRegionMap->needUpdateVideoRegs = TRUE; +} + +static void sub_80FB238(s16 x, s16 y) +{ + gRegionMap->bg2x = (0x1C << 8) + (x << 8); + gRegionMap->bg2y = (0x24 << 8) + (y << 8); + gRegionMap->needUpdateVideoRegs = TRUE; +} + +void UpdateRegionMapVideoRegs(void) +{ + if (gRegionMap->needUpdateVideoRegs) + { + REG_BG2PA = gRegionMap->unk2C; + REG_BG2PB = gRegionMap->unk34; + REG_BG2PC = gRegionMap->unk30; + REG_BG2PD = gRegionMap->unk38; + REG_BG2X = gRegionMap->bg2x; + REG_BG2Y = gRegionMap->bg2y; + gRegionMap->needUpdateVideoRegs = FALSE; + } +} + +void sub_80FB2A4(s16 a, s16 b) +{ + CalcZoomScrollParams(a, b, 0x38, 0x48, 0x100, 0x100, 0); + UpdateRegionMapVideoRegs(); + if (gRegionMap->playerIconSprite != NULL) + { + gRegionMap->playerIconSprite->pos2.x = -a; + gRegionMap->playerIconSprite->pos2.y = -b; + } +} + +static u16 GetRegionMapSectionAt(u16 x, u16 y) +{ + if (y < MAPCURSOR_Y_MIN || y > MAPCURSOR_Y_MAX || x < MAPCURSOR_X_MIN || x > MAPCURSOR_X_MAX) + return MAPSEC_NONE; + y -= MAPCURSOR_Y_MIN; + x -= MAPCURSOR_X_MIN; + return sRegionMapLayout[x + y * 28]; +} + +static void InitializeCursorPosition(void) +{ + struct MapHeader *mapHeader; + u16 mapWidth; + u16 mapHeight; + u16 x; + u16 y; + u16 r1; + u16 r9; + + if (gSaveBlock1.location.mapGroup == 25 + && (gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR) + || gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_LOWER_DECK) + || gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_ROOMS))) + { + sub_80FB600(); + return; + } + + switch (GetMapTypeByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) - 1) + { + default: + case 0: + case 1: + case 2: + case 4: + case 5: + gRegionMap->mapSectionId = gMapHeader.regionMapSectionId; + gRegionMap->playerIsInCave = FALSE; + mapWidth = gMapHeader.mapData->width; + mapHeight = gMapHeader.mapData->height; + x = gSaveBlock1.pos.x; + y = gSaveBlock1.pos.y; + if (gRegionMap->mapSectionId == MAPSEC_UNDERWATER6) + gRegionMap->playerIsInCave = TRUE; + break; + case 3: + case 6: + mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp4.mapGroup, gSaveBlock1.warp4.mapNum); + gRegionMap->mapSectionId = mapHeader->regionMapSectionId; + gRegionMap->playerIsInCave = TRUE; + mapWidth = mapHeader->mapData->width; + mapHeight = mapHeader->mapData->height; + x = gSaveBlock1.warp4.x; + y = gSaveBlock1.warp4.y; + break; + case 8: + mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum); + gRegionMap->mapSectionId = mapHeader->regionMapSectionId; + gRegionMap->playerIsInCave = TRUE; + mapWidth = mapHeader->mapData->width; + mapHeight = mapHeader->mapData->height; + x = gSaveBlock1.warp2.x; + y = gSaveBlock1.warp2.y; + break; + case 7: + { + struct WarpData *r4; + + gRegionMap->mapSectionId = gMapHeader.regionMapSectionId; + if (gRegionMap->mapSectionId != MAPSEC_UNK_0x57) + { + r4 = &gSaveBlock1.warp4; + mapHeader = Overworld_GetMapHeaderByGroupAndId(r4->mapGroup, r4->mapNum); + } + else + { + r4 = &gSaveBlock1.warp2; + mapHeader = Overworld_GetMapHeaderByGroupAndId(r4->mapGroup, r4->mapNum); + gRegionMap->mapSectionId = mapHeader->regionMapSectionId; + } + gRegionMap->playerIsInCave = FALSE; + mapWidth = mapHeader->mapData->width; + mapHeight = mapHeader->mapData->height; + x = r4->x; + y = r4->y; + } + break; + } + + r9 = x; + + r1 = mapWidth / gRegionMapLocations[gRegionMap->mapSectionId].width; + if (r1 == 0) + r1 = 1; + x /= r1; + if (x >= gRegionMapLocations[gRegionMap->mapSectionId].width) + x = gRegionMapLocations[gRegionMap->mapSectionId].width - 1; + + r1 = mapHeight / gRegionMapLocations[gRegionMap->mapSectionId].height; + if (r1 == 0) + r1 = 1; + y /= r1; + if (y >= gRegionMapLocations[gRegionMap->mapSectionId].height) + y = gRegionMapLocations[gRegionMap->mapSectionId].height - 1; + + switch (gRegionMap->mapSectionId) + { + case MAPSEC_ROUTE_114: + if (y != 0) + x = 0; + break; + case MAPSEC_ROUTE_126: + case MAPSEC_UNDERWATER2: + x = 0; + if (gSaveBlock1.pos.x > 32) + x = 1; + if (gSaveBlock1.pos.x > 0x33) + x++; + y = 0; + if (gSaveBlock1.pos.y > 0x25) + y = 1; + if (gSaveBlock1.pos.y > 0x38) + y++; + break; + case MAPSEC_ROUTE_121: + x = 0; + if (r9 > 14) + x = 1; + if (r9 > 0x1C) + x++; + if (r9 > 0x36) + x++; + break; + } + gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSectionId].x + x + MAPCURSOR_X_MIN; + gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSectionId].y + y + MAPCURSOR_Y_MIN; +} + +static void sub_80FB600(void) +{ + u16 y = 0; + u16 x = 0; + u8 mapGroup; + u8 mapNum; + s16 sp2; + s16 sp4; + + switch (GetSSTidalLocation(&mapGroup, &mapNum, &sp2, &sp4)) + { + case 1: + gRegionMap->mapSectionId = MAPSEC_SLATEPORT_CITY; + break; + case 2: + gRegionMap->mapSectionId = MAPSEC_LILYCOVE_CITY; + break; + case 3: + gRegionMap->mapSectionId = MAPSEC_ROUTE_124; + break; + case 4: + gRegionMap->mapSectionId = MAPSEC_ROUTE_131; + break; + default: + case 0: + { + struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); + u16 r1; + + gRegionMap->mapSectionId = mapHeader->regionMapSectionId; + r1 = mapHeader->mapData->width / gRegionMapLocations[gRegionMap->mapSectionId].width; + if (r1 == 0) + r1 = 1; + x = sp2 / r1; + if (x >= gRegionMapLocations[gRegionMap->mapSectionId].width) + x = gRegionMapLocations[gRegionMap->mapSectionId].width - 1; + + r1 = mapHeader->mapData->height / gRegionMapLocations[gRegionMap->mapSectionId].height; + if (r1 == 0) + r1 = 1; + y = sp4 / r1; + if (y >= gRegionMapLocations[gRegionMap->mapSectionId].height) + y = gRegionMapLocations[gRegionMap->mapSectionId].height - 1; + } + break; + } + gRegionMap->playerIsInCave = FALSE; + gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSectionId].x + x + MAPCURSOR_X_MIN; + gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSectionId].y + y + MAPCURSOR_Y_MIN; +} + +static u16 sub_80FB758(u16 mapSectionId) +{ + switch (mapSectionId) + { + case MAPSEC_NONE: + return 0; + case MAPSEC_LITTLEROOT_TOWN: + return FlagGet(FLAG_VISITED_LITTLEROOT_TOWN) ? 2 : 3; + case MAPSEC_OLDALE_TOWN: + return FlagGet(FLAG_VISITED_OLDALE_TOWN) ? 2 : 3; + case MAPSEC_DEWFORD_TOWN: + return FlagGet(FLAG_VISITED_DEWFORD_TOWN) ? 2 : 3; + case MAPSEC_LAVARIDGE_TOWN: + return FlagGet(FLAG_VISITED_LAVARIDGE_TOWN) ? 2 : 3; + case MAPSEC_FALLARBOR_TOWN: + return FlagGet(FLAG_VISITED_FALLARBOR_TOWN) ? 2 : 3; + case MAPSEC_VERDANTURF_TOWN: + return FlagGet(FLAG_VISITED_VERDANTURF_TOWN) ? 2 : 3; + case MAPSEC_PACIFIDLOG_TOWN: + return FlagGet(FLAG_VISITED_PACIFIDLOG_TOWN) ? 2 : 3; + case MAPSEC_PETALBURG_CITY: + return FlagGet(FLAG_VISITED_PETALBURG_CITY) ? 2 : 3; + case MAPSEC_SLATEPORT_CITY: + return FlagGet(FLAG_VISITED_SLATEPORT_CITY) ? 2 : 3; + case MAPSEC_MAUVILLE_CITY: + return FlagGet(FLAG_VISITED_MAUVILLE_CITY) ? 2 : 3; + case MAPSEC_RUSTBORO_CITY: + return FlagGet(FLAG_VISITED_RUSTBORO_CITY) ? 2 : 3; + case MAPSEC_FORTREE_CITY: + return FlagGet(FLAG_VISITED_FORTREE_CITY) ? 2 : 3; + case MAPSEC_LILYCOVE_CITY: + return FlagGet(FLAG_VISITED_LILYCOVE_CITY) ? 2 : 3; + case MAPSEC_MOSSDEEP_CITY: + return FlagGet(FLAG_VISITED_MOSSDEEP_CITY) ? 2 : 3; + case MAPSEC_SOOTOPOLIS_CITY: + return FlagGet(FLAG_VISITED_SOOTOPOLIS_CITY) ? 2 : 3; + case MAPSEC_EVER_GRANDE_CITY: + return FlagGet(FLAG_VISITED_EVER_GRANDE_CITY) ? 2 : 3; + + case MAPSEC_BATTLE_TOWER: + return FlagGet(FLAG_LANDMARK_BATTLE_TOWER) ? 4 : 0; + case MAPSEC_SOUTHERN_ISLAND: + return FlagGet(FLAG_LANDMARK_SOUTHERN_ISLAND) ? 1 : 0; + default: + return 1; + } +} + +u16 GetRegionMapSectionAt_(u16 x, u16 y) +{ + return GetRegionMapSectionAt(x, y); +} + +static u16 sub_80FB9C0(u16 mapSectionId) +{ + u16 i; + + for (i = 0; gUnknown_083E7684[i][0] != MAPSEC_NONE; i++) + { + if (gUnknown_083E7684[i][0] == mapSectionId) + return gUnknown_083E7684[i][1]; + } + return mapSectionId; +} + +u16 sub_80FBA04(u16 mapSectionId) +{ + return sub_80FB9C0(mapSectionId); +} + +static void sub_80FBA18(void) +{ + u16 x; + u16 y; + u16 i; + + if (gRegionMap->mapSectionId == MAPSEC_NONE) + { + gRegionMap->everGrandeCityArea = 0; + return; + } + + if (gRegionMap->zoomed == FALSE) + { + x = gRegionMap->cursorPosX; + y = gRegionMap->cursorPosY; + } + else + { + x = gRegionMap->unk64; + y = gRegionMap->unk66; + } + + i = 0; + while (1) + { + if (x <= 1) + { + if (sub_80FBAA0(y)) + { + y--; + x = 0x1D; + } + else + { + break; + } + } + else + { + x--; + if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSectionId) + i++; + } + } + + gRegionMap->everGrandeCityArea = i; +} + +static bool8 sub_80FBAA0(u16 a) +{ + u16 x; + u16 y; + + y = a - 1; + if (y == 0xFFFF) + return FALSE; + + for (x = MAPCURSOR_X_MIN; x <= MAPCURSOR_X_MAX; x++) + { + if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSectionId) + return TRUE; + } + return FALSE; +} + +static const struct OamData sCursorOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sCursorAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(4, 20), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd sCursorAnimSeq1[] = +{ + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(16, 10), + ANIMCMD_FRAME(32, 10), + ANIMCMD_FRAME(16, 10), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sCursorAnimTable[] = +{ + sCursorAnimSeq0, + sCursorAnimSeq1, +}; + +static void SpriteCB_Cursor(struct Sprite *sprite) +{ + if (gRegionMap->unk7A != 0) + { + sprite->pos1.x += gRegionMap->cursorDeltaX * 2; + sprite->pos1.y += gRegionMap->cursorDeltaY * 2; + gRegionMap->unk7A--; + } +} + +static void nullsub_66(struct Sprite *sprite) +{ +} + +void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) +{ + u8 spriteId; + struct SpriteSheet spriteSheet; + struct SpritePalette spritePalette = + { + .data = sRegionMapCursor_Pal, + }; + struct SpriteTemplate spriteTemplate = + { + .oam = &sCursorOamData, + .anims = sCursorAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_Cursor, + }; + + spriteSheet.tag = tileTag; + spriteTemplate.tileTag = tileTag; + gRegionMap->cursorTileTag = tileTag; + + spritePalette.tag = paletteTag; + spriteTemplate.paletteTag = paletteTag; + gRegionMap->cursorPaletteTag = paletteTag; + + if (gRegionMap->zoomed == FALSE) + { + spriteSheet.data = gRegionMap->cursorSmallImage; + spriteSheet.size = 0x100; + spriteTemplate.callback = SpriteCB_Cursor; + } + else + { + spriteSheet.data = gRegionMap->cursorLargeImage; + spriteSheet.size = 0x600; + spriteTemplate.callback = nullsub_66; + } + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&spritePalette); + spriteId = CreateSprite(&spriteTemplate, 0x38, 0x48, 0); + if (spriteId != 64) + { + gRegionMap->cursorSprite = &gSprites[spriteId]; + if (gRegionMap->zoomed == TRUE) + { + gRegionMap->cursorSprite->oam.size = 2; + gRegionMap->cursorSprite->pos1.x -= 8; + gRegionMap->cursorSprite->pos1.y -= 8; + StartSpriteAnim(gRegionMap->cursorSprite, 1); + } + else + { + gRegionMap->cursorSprite->oam.size = 1; + gRegionMap->cursorSprite->pos1.x = gRegionMap->cursorPosX * 8 + 4; + gRegionMap->cursorSprite->pos1.y = gRegionMap->cursorPosY * 8 + 4; + } + gRegionMap->cursorSprite->data[1] = 2; + gRegionMap->cursorSprite->data[2] = IndexOfSpritePaletteTag(paletteTag) * 16 + 0x0101; + gRegionMap->cursorSprite->data[3] = 1; + } +} + +void sub_80FBCA0(void) +{ + if (gRegionMap->cursorSprite != NULL) + { + DestroySprite(gRegionMap->cursorSprite); + FreeSpriteTilesByTag(gRegionMap->cursorTileTag); + FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag); + } +} + +void unref_sub_80FBCD0(void) +{ + gRegionMap->cursorSprite->data[3] = 1; +} + +void unref_sub_80FBCE0(void) +{ + gRegionMap->cursorSprite->data[3] = 0; +} + +static const struct OamData sPlayerIconOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sPlayerIconAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const sPlayerIconAnimTable[] = +{ + sPlayerIconAnimSeq0, +}; + +void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag) +{ + u8 spriteId; + struct SpriteSheet playerIconSpriteSheet = + { + .data = sRegionMapBrendanIcon_Image, + .size = 128, + .tag = tileTag, + }; + struct SpritePalette playerIconSpritePalette = + { + .data = sRegionMapBrendanIcon_Pal, + .tag = paletteTag, + }; + struct SpriteTemplate playerIconSpriteTemplate = + { + .tileTag = tileTag, + .paletteTag = paletteTag, + .oam = &sPlayerIconOamData, + .anims = sPlayerIconAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }; + + if (gSaveBlock2.playerGender == FEMALE) + { + playerIconSpriteSheet.data = sRegionMapMayIcon_Image; + playerIconSpritePalette.data = sRegionMapMayIcon_Pal; + } + LoadSpriteSheet(&playerIconSpriteSheet); + LoadSpritePalette(&playerIconSpritePalette); + spriteId = CreateSprite(&playerIconSpriteTemplate, 0, 0, 1); + gRegionMap->playerIconSprite = &gSprites[spriteId]; + if (gRegionMap->zoomed == FALSE) + { + gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4; + gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4; + gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut; + } + else + { + gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48; + gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66; + gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn; + } +} + +static void sub_80FBDF8(void) +{ + if (gRegionMap->playerIconSprite != NULL) + { + gRegionMap->playerIconSprite->invisible = TRUE; + gRegionMap->playerIconSprite->callback = SpriteCallbackDummy; + } +} + +static void sub_80FBE24(void) +{ + if (gRegionMap->playerIconSprite != NULL) + { + if (gRegionMap->zoomed == TRUE) + { + gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48; + gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66; + gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn; + gRegionMap->playerIconSprite->invisible = FALSE; + } + else + { + gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4; + gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4; + gRegionMap->playerIconSprite->pos2.x = 0; + gRegionMap->playerIconSprite->pos2.y = 0; + gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut; + gRegionMap->playerIconSprite->invisible = FALSE; + } + } +} + +static void SpriteCB_PlayerIconZoomedIn(struct Sprite *sprite) +{ + sprite->pos2.x = -(gRegionMap->scrollX * 2); + sprite->pos2.y = -(gRegionMap->scrollY * 2); + sprite->data[0] = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + sprite->data[1] = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + + // Determine if sprite is on screen + if (sprite->data[0] < -8 || sprite->data[0] > 0xA8 || sprite->data[1] < -8 || sprite->data[1] > 0xF8) + sprite->data[2] = FALSE; + else + sprite->data[2] = TRUE; + + if (sprite->data[2] == TRUE) + UpdateIconBlink(sprite); + else + sprite->invisible = TRUE; +} + +static void SpriteCB_PlayerIconZoomedOut(struct Sprite *sprite) +{ + UpdateIconBlink(sprite); +} + +static void UpdateIconBlink(struct Sprite *sprite) +{ + if (gRegionMap->blinkPlayerIcon) + { + // Toggle visibility every 16 frames + sprite->data[7]++; + if (sprite->data[7] > 16) + { + sprite->data[7] = 0; + sprite->invisible = !sprite->invisible; + } + } + else + { + sprite->invisible = FALSE; + } +} + +void sub_80FBF94(void) +{ + if (gRegionMap->playerIsInCave) + gRegionMap->blinkPlayerIcon = TRUE; +} + +const u8 *GetMapSectionName(u8 *dest, u16 mapSectionId, u16 length) +{ + if (mapSectionId == MAPSEC_SECRET_BASE) + return GetSecretBaseMapName(dest); + if (mapSectionId < MAPSEC_NONE) + return StringCopy(dest, gRegionMapLocations[mapSectionId].regionMapSectionId); + if (length == 0) + length = 18; + return StringFill(dest, CHAR_SPACE, length); +} + +const u8 *CopyMapName(u8 *dest, u16 mapSectionId) +{ + switch (mapSectionId) + { + case MAPSEC_UNK_0x57: + return StringCopy(dest, gOtherText_Ferry); + case MAPSEC_SECRET_BASE: + return StringCopy(dest, gOtherText_SecretBase); + default: + return GetMapSectionName(dest, mapSectionId, 0); + } +} + +const u8 *CopyLocationName(u8 *dest, u16 mapSectionId) +{ + if (mapSectionId == MAPSEC_EVIL_TEAM_HIDEOUT) + return StringCopy(dest, gOtherText_Hideout); + else + return CopyMapName(dest, mapSectionId); +} + +static void GetRegionMapLocationPosition(u16 mapSectionId, u16 *x, u16 *y, u16 *width, u16 *height) +{ + *x = gRegionMapLocations[mapSectionId].x; + *y = gRegionMapLocations[mapSectionId].y; + *width = gRegionMapLocations[mapSectionId].width; + *height = gRegionMapLocations[mapSectionId].height; +} + +struct UnknownStruct3 +{ + void (*unk0)(void); + u16 unk4; + u16 unk6; + struct RegionMap regionMap; +}; + +static const u16 sFlyRegionMapFrame_Pal[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal"); +static const u8 sFlyRegionMapFrame_ImageLZ[] = INCBIN_U8("graphics/pokenav/map_frame.4bpp.lz"); +static const u8 sFlyRegionMapFrame_TilemapLZ[] = INCBIN_U8("graphics/pokenav/map_frame.bin.lz"); +static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/fly_target_icons.gbapal"); +static const u8 sFlyTargetIcons_ImageLZ[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz"); + +static const u8 sUnknown_083E7920[][3] = +{ + {0, 9, 1}, + {0, 10, 14}, + {0, 11, 15}, + {0, 12, 16}, + {0, 13, 17}, + {0, 14, 18}, + {0, 15, 19}, + {0, 0, 3}, + {0, 1, 4}, + {0, 2, 5}, + {0, 3, 6}, + {0, 4, 7}, + {0, 5, 8}, + {0, 6, 9}, + {0, 7, 10}, + {0, 8, 11}, + {0, 16, 0}, + {0, 17, 0}, + {0, 18, 0}, + {0, 19, 0}, + {0, 20, 0}, + {0, 21, 0}, + {0, 22, 0}, + {0, 23, 0}, + {0, 24, 0}, + {0, 25, 0}, + {0, 26, 0}, + {0, 27, 0}, + {0, 28, 0}, + {0, 29, 0}, + {0, 30, 0}, + {0, 31, 0}, + {0, 32, 0}, + {0, 33, 0}, + {0, 34, 0}, + {0, 35, 0}, + {0, 36, 0}, + {0, 37, 0}, + {0, 38, 0}, + {0, 39, 0}, + {0, 40, 0}, + {0, 41, 0}, + {0, 42, 0}, + {0, 43, 0}, + {0, 44, 0}, + {0, 45, 0}, + {0, 46, 0}, + {0, 47, 0}, + {0, 48, 0}, + {0, 49, 0}, +}; + +static const u8 *const sEverGrandeCityAreaNames[] = +{ + OtherText_PokeLeague, + OtherText_PokeCenter, +}; + +struct MultiPartMapSection +{ + const u8 *const *partNames; + u16 mapSectionId; + u16 requiredFlag; +}; + +// Map sections that are divided into multiple parts. Ever Grande City is the only one. +static const struct MultiPartMapSection sMultiPartMapSections[1] = +{ + {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY}, +}; + +static struct UnknownStruct3 *const sFlyDataPtr = (struct UnknownStruct3 *)gSharedMem; + +static const struct SpritePalette sFlyTargetIconSpritePalette = {sFlyTargetIcons_Pal, 2}; + +// Fly targets that are not cities or towns +static const u16 sSpecialFlyAreas[][2] = +{ + // flag, mapSectionId + {0x848, MAPSEC_BATTLE_TOWER}, + {0xFFFF, MAPSEC_NONE}, +}; + +static const struct OamData sFlyTargetOamData = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sFlyTargetAnimSeq0[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq1[] = +{ + ANIMCMD_FRAME(1, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq2[] = +{ + ANIMCMD_FRAME(3, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq3[] = +{ + ANIMCMD_FRAME(5, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq4[] = +{ + ANIMCMD_FRAME(6, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq5[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END, +}; + +static const union AnimCmd sFlyTargetAnimSeq6[] = +{ + ANIMCMD_FRAME(10, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const sFlyTargetAnimTable[] = +{ + sFlyTargetAnimSeq0, + sFlyTargetAnimSeq1, + sFlyTargetAnimSeq2, + sFlyTargetAnimSeq3, + sFlyTargetAnimSeq4, + sFlyTargetAnimSeq5, + sFlyTargetAnimSeq6, +}; + +static const struct SpriteTemplate gFlyTargetSpriteTemplate = +{ + .tileTag = 2, + .paletteTag = 2, + .oam = &sFlyTargetOamData, + .anims = sFlyTargetAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +void CB2_InitFlyRegionMap(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + ResetPaletteFade(); + ResetSpriteData(); + FreeSpriteTileRanges(); + FreeAllSpritePalettes(); + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E7224); + break; + case 2: + InitMenuWindow(&gWindowTemplate_81E7224); + Menu_EraseScreen(); + break; + case 3: + InitRegionMap(&sFlyDataPtr->regionMap, 0); + CreateRegionMapCursor(0, 0); + CreateRegionMapPlayerIcon(1, 1); + sFlyDataPtr->unk6 = sFlyDataPtr->regionMap.mapSectionId; + StringFill(ewramBlankMapName, CHAR_SPACE, 12); + PrintFlyTargetName(); + break; + case 4: + LZ77UnCompVram(sFlyRegionMapFrame_ImageLZ, (void *)(VRAM + 0xC000)); + break; + case 5: + LZ77UnCompVram(sFlyRegionMapFrame_TilemapLZ, (void *)(VRAM + 0xF000)); + break; + case 6: + LoadPalette(sFlyRegionMapFrame_Pal, 16, 32); + Menu_PrintTextPixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1); + break; + case 7: + CreateFlyTargetGraphics(); + break; + case 8: + BlendPalettes(0xFFFFFFFF, 16, 0); + SetVBlankCallback(VBlankCB_FlyRegionMap); + break; + case 9: + REG_BLDCNT = 0; + REG_BG1CNT = 0x1E0D; + REG_DISPCNT = 0x1741; + sub_80FC244(sub_80FC5B4); + SetMainCallback2(CB2_FlyRegionMap); + break; + default: + return; + } + gMain.state++; +} + +static void VBlankCB_FlyRegionMap(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_FlyRegionMap(void) +{ + sFlyDataPtr->unk0(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_80FC244(void (*func)(void)) +{ + sFlyDataPtr->unk0 = func; + sFlyDataPtr->unk4 = 0; +} + +static void PrintFlyTargetName(void) +{ + if (sFlyDataPtr->regionMap.unk16 == 2 || sFlyDataPtr->regionMap.unk16 == 4) + { + bool8 drawFrameDisabled = FALSE; + u16 i; + + for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++) + { + if (sFlyDataPtr->regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) + { + if (FlagGet(sMultiPartMapSections[i].requiredFlag)) + { + Menu_DrawStdWindowFrame(16, 14, 29, 19); + Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 15); + MenuPrint_RightAligned(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea], 29, 17); + drawFrameDisabled = TRUE; + } + break; + } + } + + if (!drawFrameDisabled) + { + Menu_DrawStdWindowFrame(16, 16, 29, 19); + Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 17); + Menu_EraseWindowRect(16, 14, 29, 15); + } + } + else + { + Menu_DrawStdWindowFrame(16, 16, 29, 19); + Menu_PrintText(ewramBlankMapName, 17, 17); + Menu_EraseWindowRect(16, 14, 29, 15); + } +} + +static void CreateFlyTargetGraphics(void) +{ + struct SpriteSheet spriteSheet; + + LZ77UnCompWram(sFlyTargetIcons_ImageLZ, ewram888); + spriteSheet.data = ewram888; + spriteSheet.size = 0x1C0; + spriteSheet.tag = 2; + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&sFlyTargetIconSpritePalette); + CreateCityTownFlyTargetIcons(); + CreateSpecialAreaFlyTargetIcons(); +} + +// Draws a light overlay on cities and towns that the player can fly to +static void CreateCityTownFlyTargetIcons(void) +{ + u16 canFlyFlag = 0x80F; + u16 i; + + for (i = 0; i < 16; i++) + { + u16 x; + u16 y; + u16 width; + u16 height; + u16 r7; + u8 spriteId; + + GetRegionMapLocationPosition(i, &x, &y, &width, &height); + x = (x + 1) * 8 + 4; + y = (y + 2) * 8 + 4; + if (width == 2) + r7 = 1; + else if (height == 2) + r7 = 2; + else + r7 = 0; + spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10); + if (spriteId != 64) + { + gSprites[spriteId].oam.shape = r7; + if (FlagGet(canFlyFlag)) + gSprites[spriteId].callback = SpriteCB_FlyTargetIcons; + else + r7 += 3; + StartSpriteAnim(&gSprites[spriteId], r7); + gSprites[spriteId].data[0] = i; + } + canFlyFlag++; + } +} + +// Draws a red box on other fly targets +// The Battle Tower is the only one of these +static void CreateSpecialAreaFlyTargetIcons(void) +{ + u16 i; + + for (i = 0; sSpecialFlyAreas[i][1] != MAPSEC_NONE; i++) + { + u16 x; + u16 y; + u16 width; + u16 height; + + if (FlagGet(sSpecialFlyAreas[i][0])) + { + u16 mapSectionId = sSpecialFlyAreas[i][1]; + u8 spriteId; + + GetRegionMapLocationPosition(mapSectionId, &x, &y, &width, &height); + x = (x + 1) * 8; + y = (y + 2) * 8; + spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10); + if (spriteId != 64) + { + gSprites[spriteId].oam.size = 1; + gSprites[spriteId].callback = SpriteCB_FlyTargetIcons; + StartSpriteAnim(&gSprites[spriteId], 6); + gSprites[spriteId].data[0] = mapSectionId; + } + } + } +} + +static void SpriteCB_FlyTargetIcons(struct Sprite *sprite) +{ + // Blink if our mapSectionId is the one selected on the map + if (sFlyDataPtr->regionMap.mapSectionId == sprite->data[0]) + { + // Toggle visibility every 16 frames + sprite->data[1]++; + if (sprite->data[1] > 16) + { + sprite->data[1] = 0; + sprite->invisible = !sprite->invisible; + } + } + else + { + sprite->data[1] = 16; + sprite->invisible = FALSE; + } +} + +static void sub_80FC5B4(void) +{ + switch (sFlyDataPtr->unk4) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + sFlyDataPtr->unk4++; + break; + case 1: + if (UpdatePaletteFade() != 0) + break; + sub_80FC244(sub_80FC600); + break; + } +} + +static void sub_80FC600(void) +{ + if (sFlyDataPtr->unk4 == 0) + { + switch (sub_80FAB60()) + { + case INPUT_EVENT_NONE: + case INPUT_EVENT_DPAD: + case INPUT_EVENT_2: + break; + case INPUT_EVENT_3: + PrintFlyTargetName(); + break; + case INPUT_EVENT_A_BUTTON: + if (sFlyDataPtr->regionMap.unk16 == 2 || sFlyDataPtr->regionMap.unk16 == 4) + { + m4aSongNumStart(SE_SELECT); + ewramA6E = 1; + sub_80FC244(sub_80FC69C); + } + break; + case INPUT_EVENT_B_BUTTON: + m4aSongNumStart(SE_SELECT); + ewramA6E = 0; + sub_80FC244(sub_80FC69C); + break; + } + } +} + +void sub_80FC69C(void) +{ + switch (sFlyDataPtr->unk4) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + sFlyDataPtr->unk4++; + break; + case 1: + if (UpdatePaletteFade() != 0) + break; + FreeRegionMapIconResources(); + if (ewramA6E != 0) + { + switch (sFlyDataPtr->regionMap.mapSectionId) + { + case MAPSEC_SOUTHERN_ISLAND: + sub_8053538(22); + break; + case MAPSEC_BATTLE_TOWER: + sub_8053538(21); + break; + case MAPSEC_LITTLEROOT_TOWN: + sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13); + break; + case MAPSEC_EVER_GRANDE_CITY: + sub_8053538((FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && sFlyDataPtr->regionMap.everGrandeCityArea == 0) ? 20 : 11); + break; + default: + if (sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][2] != 0) + sub_8053538(sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][2]); + else + warp1_set_2(sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][0], sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][1], -1); + break; + } + sub_80865BC(); + } + else + { + SetMainCallback2(sub_808AD58); + } + break; + } +} + +#if DEBUG + +void debug_sub_8110CCC(void) +{ + bool8 r7 = FALSE; + u16 i; + s16 indent; + + for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++) + { + if (sFlyDataPtr->regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId) + { + if (FlagGet(sMultiPartMapSections[i].requiredFlag)) + { + indent = 12 - StringLength(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea]); + if (indent < 0) + indent = 0; + r7 = TRUE; + Menu_DrawStdWindowFrame(16, 14, 29, 19); + Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 15); + Menu_PrintText(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea], 17 + indent, 17); + } + break; + } + } + if (!r7) + { + Menu_DrawStdWindowFrame(16, 16, 29, 19); + Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 17); + Menu_EraseWindowRect(16, 14, 29, 15); + } +} + +void debug_sub_8110D84(void) +{ + switch (sFlyDataPtr->unk4) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + sFlyDataPtr->unk4++; + break; + case 1: + if (!UpdatePaletteFade()) + sFlyDataPtr->unk4++; + break; + case 2: + switch (sub_80FAB60()) + { + case 0: + break; + case 3: + debug_sub_8110CCC(); + break; + case 4: + if (sFlyDataPtr->regionMap.unk16 != 0) + { + m4aSongNumStart(SE_SELECT); + gSharedMem[0xA6E] = 1; // TODO: what is this? + sub_80FC244(sub_80FC69C); + } + break; + case 5: + m4aSongNumStart(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + sFlyDataPtr->unk4++; + break; + } + break; + case 3: + if (!UpdatePaletteFade()) + SetMainCallback2(sub_805469C); + break; + case 4: + if (sub_80FAB60() != 0) + { + debug_sub_8110CCC(); + } + else if (gMain.newKeys & A_BUTTON) + { + sub_80FBCA0(); + sub_80FAEC4(); + sFlyDataPtr->unk4++; + } + break; + case 5: + if (sub_80FAFC0() == 0) + { + CreateRegionMapCursor(0, 0); + sFlyDataPtr->unk4++; + } + break; + case 6: + if (sub_80FAB60() != 0) + { + debug_sub_8110CCC(); + } + if (gMain.newKeys & A_BUTTON) // no "else if" like above? + { + sub_80FBCA0(); + sub_80FAEC4(); + sFlyDataPtr->unk4++; + } + break; + case 7: + if (sub_80FAFC0() == 0) + { + CreateRegionMapCursor(0, 0); + sFlyDataPtr->unk4 = 3; + } + break; + } +} + +void debug_sub_8110F28(void) +{ + CB2_InitFlyRegionMap(); + + if (gMain.callback2 == CB2_FlyRegionMap) + { + sub_80FBF94(); + sub_80FC244(debug_sub_8110D84); + debug_sub_8110CCC(); + } +} + +#endif + diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c new file mode 100644 index 000000000..8c2c23569 --- /dev/null +++ b/src/reset_rtc_screen.c @@ -0,0 +1,692 @@ +#include "global.h" +#include "event_data.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "rtc.h" +#include "save.h" +#include "script.h" +#include "sprite.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "strings2.h" +#include "task.h" +#include "text.h" +#include "scanline_effect.h" + +struct ResetRtcStruct +{ + /*0x0*/ u8 dataIndex; + /*0x2*/ u16 minVal; + /*0x4*/ u16 maxVal; + /*0x6*/ u8 left; + /*0x7*/ u8 right; + /*0x8*/ u8 unk8; +}; + +extern u16 gSaveFileStatus; + +void CB2_ResetRtcScreen(void); +void VBlankCB_ResetRtcScreen(void); +void Task_ResetRtcScreen(u8); + +static const struct ResetRtcStruct gUnknown_08376420[5] = +{ + { + .dataIndex = 3, + .minVal = 1, + .maxVal = 9999, + .left = 0, + .right = 2, + .unk8 = 0, + }, + { + .dataIndex = 4, + .minVal = 0, + .maxVal = 23, + .left = 1, + .right = 3, + .unk8 = 0, + }, + { + .dataIndex = 5, + .minVal = 0, + .maxVal = 59, + .left = 2, + .right = 4, + .unk8 = 0, + }, + { + .dataIndex = 6, + .minVal = 0, + .maxVal = 59, + .left = 3, + .right = 5, + .unk8 = 0, + }, + { + .dataIndex = 7, + .minVal = 0, + .maxVal = 0, + .left = 4, + .right = 0, + .unk8 = 6, + }, +}; + +const struct OamData gOamData_837645C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const u8 gSpriteImage_8376464[] = INCBIN_U8("graphics/unknown_sprites/83764AC/0.4bpp"); +const u8 gSpriteImage_8376484[] = INCBIN_U8("graphics/unknown_sprites/83764AC/1.4bpp"); + +const u16 Palette_3764A4[] = INCBIN_U16("graphics/unknown/83764A4.gbapal"); + +const struct SpriteFrameImage gSpriteImageTable_83764AC[] = +{ + { gSpriteImage_8376464, 0x20 }, + { gSpriteImage_8376484, 0x20 }, +}; + +const struct SpritePalette gUnknown_083764BC = +{ + .data = Palette_3764A4, + .tag = 0x1000, +}; + +const union AnimCmd gSpriteAnim_83764C4[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gSpriteAnim_83764CC[] = +{ + ANIMCMD_FRAME(0, 158, .vFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gSpriteAnim_83764D4[] = +{ + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_83764DC[] = +{ + gSpriteAnim_83764C4, + gSpriteAnim_83764CC, + gSpriteAnim_83764D4, +}; + +const struct SpriteTemplate gSpriteTemplate_83764E8 = +{ + .tileTag = 0xFFFF, + .paletteTag = 0x1000, + .oam = &gOamData_837645C, + .anims = gSpriteAnimTable_83764DC, + .images = gSpriteImageTable_83764AC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +const u8 gUnknown_08376500[] = _(" : "); + +void SpriteCB_ResetRtcCusor0(struct Sprite *sprite) +{ + int state = gTasks[sprite->data[0]].data[2]; + if (state != sprite->data[1]) + { + sprite->data[1] = state; + switch (state) + { + case 1: + sprite->invisible = FALSE; + sprite->animNum = 1; + sprite->animDelayCounter = 0; + sprite->pos1.x = 53; + sprite->pos1.y = 68; + break; + case 2: + sprite->invisible = FALSE; + sprite->animNum = 1; + sprite->animDelayCounter = 0; + sprite->pos1.x = 86; + sprite->pos1.y = 68; + break; + case 3: + sprite->invisible = FALSE; + sprite->animNum = 1; + sprite->animDelayCounter = 0; + sprite->pos1.x = 107; + sprite->pos1.y = 68; + break; + case 4: + sprite->invisible = FALSE; + sprite->animNum = 1; + sprite->animDelayCounter = 0; + sprite->pos1.x = 128; + sprite->pos1.y = 68; + break; + case 5: + sprite->invisible = FALSE; + sprite->animNum = 2; + sprite->animDelayCounter = 0; + sprite->pos1.x = 155; + sprite->pos1.y = 80; + break; + case 6: + DestroySprite(sprite); + break; + } + } +} + +void SpriteCB_ResetRtcCusor1(struct Sprite *sprite) +{ + int state = gTasks[sprite->data[0]].data[2]; + if (state != sprite->data[1]) + { + sprite->data[1] = state; + switch (state) + { + case 1: + sprite->invisible = FALSE; + sprite->animNum = 0; + sprite->animDelayCounter = 0; + sprite->pos1.x = 53; + sprite->pos1.y = 92; + break; + case 2: + sprite->invisible = FALSE; + sprite->animNum = 0; + sprite->animDelayCounter = 0; + sprite->pos1.x = 86; + sprite->pos1.y = 92; + break; + case 3: + sprite->invisible = FALSE; + sprite->animNum = 0; + sprite->animDelayCounter = 0; + sprite->pos1.x = 107; + sprite->pos1.y = 92; + break; + case 4: + sprite->invisible = FALSE; + sprite->animNum = 0; + sprite->animDelayCounter = 0; + sprite->pos1.x = 128; + sprite->pos1.y = 92; + break; + case 5: + sprite->invisible = TRUE; + break; + case 6: + DestroySprite(sprite); + break; + } + } +} + +void ResetRtcScreen_CreateCursor(u8 taskId) +{ + int spriteId; + + LoadSpritePalette(&gUnknown_083764BC); + + spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0); + gSprites[spriteId].callback = SpriteCB_ResetRtcCusor0; + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = -1; + + spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0); + gSprites[spriteId].callback = SpriteCB_ResetRtcCusor1; + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = -1; +} + +void ResetRtcScreen_FreeCursorPalette(void) +{ + FreeSpritePaletteByTag(gUnknown_083764BC.tag); +} + +void ResetRtcScreen_HideChooseTimeWindow(void) +{ + Menu_EraseWindowRect(3, 8, 25, 11); +} + +void ResetRtcScreen_PrintTime(u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 seconds) +{ + u8 *dest = gStringVar4; + days %= 10000; + hours %= 24; + minutes %= 60; + seconds %= 60; + sub_8072C44(gStringVar1, days, 24, 1); + dest = StringCopy(dest, gStringVar1); + dest = StringCopy(dest, gOtherText_Day); + sub_8072C44(gStringVar1, hours, 18, 1); + dest = StringCopy(dest, gStringVar1); + dest = StringCopy(dest, gUnknown_08376500); + dest = ConvertIntToDecimalStringN(dest, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); + dest = StringCopy(dest, gUnknown_08376500); + ConvertIntToDecimalStringN(dest, seconds, STR_CONV_MODE_LEADING_ZEROS, 2); + Menu_PrintText(gStringVar4, x, y); +} + +void ResetRtcScreen_ShowChooseTimeWindow(u16 days, u8 hours, u8 minutes, u8 seconds) +{ + Menu_DrawStdWindowFrame(3, 8, 25, 11); + Menu_PrintText(gOtherText_OK, 20, 9); + ResetRtcScreen_PrintTime(4, 9, days, hours, minutes, seconds); +} + +bool32 ResetRtcScreen_MoveTimeUpDown(s16 *val, int minVal, int maxVal, u16 keys) +{ + if (keys & DPAD_DOWN) + { + (*val)--; + if (*val < minVal) + *val = maxVal; + } + else if (keys & DPAD_UP) + { + (*val)++; + if (*val > maxVal) + *val = minVal; + } + else if (keys & DPAD_LEFT) + { + *val -= 10; + if (*val < minVal) + *val = maxVal; + } + else if (keys & DPAD_RIGHT) + { + *val += 10; + if (*val > maxVal) + *val = minVal; + } + else + { + return FALSE; + } + + return TRUE; +} + +void Task_ResetRtc_3(u8 taskId) +{ + gTasks[taskId].data[0] = 1; +} + +void Task_ResetRtc_2(u8 taskId) +{ + ResetRtcScreen_HideChooseTimeWindow(); + ResetRtcScreen_FreeCursorPalette(); + gTasks[taskId].func = Task_ResetRtc_3; +} + +void Task_ResetRtc_1(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u8 selection = data[2]; + const struct ResetRtcStruct *selectionInfo = &gUnknown_08376420[selection - 1]; + + if (gMain.newKeys & B_BUTTON) + { + gTasks[taskId].func = Task_ResetRtc_2; + data[1] = 0; + data[2] = 6; + PlaySE(SE_SELECT); + return; + } + + if (gMain.newKeys & DPAD_RIGHT) + { + if (selectionInfo->right) + { + data[2] = selectionInfo->right; + PlaySE(SE_SELECT); + return; + } + } + + if (gMain.newKeys & DPAD_LEFT) + { + if (selectionInfo->left) + { + data[2] = selectionInfo->left; + PlaySE(SE_SELECT); + return; + } + } + + if (selection == 5) + { + if (gMain.newKeys & A_BUTTON) + { + gLocalTime.days = data[3]; + gLocalTime.hours = data[4]; + gLocalTime.minutes = data[5]; + gLocalTime.seconds = data[6]; + PlaySE(SE_SELECT); + gTasks[taskId].func = Task_ResetRtc_2; + data[1] = 1; + data[2] = 6; + } + } + else if (ResetRtcScreen_MoveTimeUpDown(&data[selectionInfo->dataIndex], selectionInfo->minVal, selectionInfo->maxVal, gMain.newAndRepeatedKeys & (DPAD_UP | DPAD_DOWN))) + { + PlaySE(SE_SELECT); + ResetRtcScreen_PrintTime(4, 9, data[3], data[4], data[5], data[6]); + } +} + +void Task_ResetRtc_0(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + data[0] = 0; + data[3] = gLocalTime.days; + data[4] = gLocalTime.hours; + data[5] = gLocalTime.minutes; + data[6] = gLocalTime.seconds; + ResetRtcScreen_ShowChooseTimeWindow(data[3], data[4], data[5], data[6]); + ResetRtcScreen_CreateCursor(taskId); + data[2] = 2; + gTasks[taskId].func = Task_ResetRtc_1; +} + +void CB2_InitResetRtcScreen(void) +{ + REG_DISPCNT = 0; + SetVBlankCallback(NULL); + DmaClear16(3, PLTT, PLTT_SIZE); + DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); + ResetOamRange(0, 128); + LoadOam(); + ScanlineEffect_Stop(); + ScanlineEffect_Clear(); + ResetSpriteData(); + ResetTasks(); + ResetPaletteFade(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + REG_DISPCNT = 4352; + SetVBlankCallback(VBlankCB_ResetRtcScreen); + SetMainCallback2(CB2_ResetRtcScreen); + CreateTask(Task_ResetRtcScreen, 80); +} + +void CB2_ResetRtcScreen(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void VBlankCB_ResetRtcScreen(void) +{ + ProcessSpriteCopyRequests(); + LoadOam(); + TransferPlttBuffer(); +} + +void ResetRtcScreen_ShowMessage(const u8 *str) +{ + Menu_DisplayDialogueFrame(); + Menu_PrintText(str, 2, 15); +} + +void Task_ShowResetRtcPrompt(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 20, 10); + Menu_PrintText(gSystemText_PresentTime, 1, 1); + ResetRtcScreen_PrintTime( + 1, + 3, + gLocalTime.days, + gLocalTime.hours, + gLocalTime.minutes, + gLocalTime.seconds); + Menu_PrintText(gSystemText_PreviousTime, 1, 5); + ResetRtcScreen_PrintTime( + 1, + 7, + gSaveBlock2.lastBerryTreeUpdate.days, + gSaveBlock2.lastBerryTreeUpdate.hours, + gSaveBlock2.lastBerryTreeUpdate.minutes, + gSaveBlock2.lastBerryTreeUpdate.seconds); + ResetRtcScreen_ShowMessage(gSystemText_ResetRTCPrompt); + data[0]++; + case 1: + if (gMain.newKeys & B_BUTTON) + { + DestroyTask(taskId); + DoSoftReset(); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + DestroyTask(taskId); + } + break; + } +} + +void Task_ResetRtcScreen(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, 0xFFFF); + data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) + { + if (gSaveFileStatus == 0 || gSaveFileStatus == 2) + { + ResetRtcScreen_ShowMessage(gSystemText_NoSaveFileNoTime); + data[0] = 5; + } + else + { + RtcCalcLocalTime(); + data[1] = CreateTask(Task_ShowResetRtcPrompt, 80); + data[0] = 2; + } + } + break; + case 2: + if (gTasks[data[1]].isActive != TRUE) + { + Menu_EraseScreen(); + ResetRtcScreen_ShowMessage(gSystemText_PleaseResetTime); + gLocalTime = gSaveBlock2.lastBerryTreeUpdate; + data[1] = CreateTask(Task_ResetRtc_0, 80); + data[0] = 3; + } + break; + case 3: + if (gTasks[data[1]].data[0]) + { + if (!gTasks[data[1]].data[1]) + { + DestroyTask(data[1]); + data[0] = 2; + } + else + { + DestroyTask(data[1]); + RtcReset(); + RtcCalcLocalTimeOffset( + gLocalTime.days, + gLocalTime.hours, + gLocalTime.minutes, + gLocalTime.seconds); + gSaveBlock2.lastBerryTreeUpdate = gLocalTime; + VarSet(VAR_DAYS, gLocalTime.days); + DisableResetRTC(); + ResetRtcScreen_ShowMessage(gSystemText_ClockResetDataSave); + data[0] = 4; + } + } + break; + case 4: + if (Save_WriteData(0) == SAVE_STATUS_OK) + { + ResetRtcScreen_ShowMessage(gSystemText_SaveCompleted); + PlaySE(SE_PINPON); + } + else + { + ResetRtcScreen_ShowMessage(gSystemText_SaveFailed); + PlaySE(SE_BOO); + } + data[0] = 5; + // fall through + case 5: + if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, 0xFFFF); + data[0] = 6; + } + else + { + break; + } + // fall through + case 6: + if (!gPaletteFade.active) + { + DestroyTask(taskId); + DoSoftReset(); + } + } +} + +#if DEBUG +void debug_sub_806F8F8(void) +{ + SetMainCallback2(CB2_InitResetRtcScreen); +} + +void debug_sub_806F908(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[1] = CreateTask(Task_ResetRtc_0, 80); + data[0]++; + break; + case 1: + if (gTasks[data[1]].data[0] != 0) + { + if (gTasks[data[1]].data[1] == 1) + RtcCalcLocalTimeOffset(gLocalTime.days, gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds); + DestroyTask(data[1]); + Menu_EraseScreen(); + ScriptContext2_Disable(); + DestroyTask(taskId); + } + break; + } +} + +void debug_sub_806F99C(void) +{ + RtcCalcLocalTime(); + CreateTask(debug_sub_806F908, 80); + ScriptContext2_Enable(); +} + +void debug_sub_806F9B8(void) +{ + gLocalTime = gSaveBlock2.lastBerryTreeUpdate; + CreateTask(debug_sub_806F908, 80); + ScriptContext2_Enable(); +} + +static const u8 sDebugText_Days[] = _("にっすう"); // "days" +static const u8 sDebugText_Time[] = _("じかん"); // "time" +static const u8 sDebugText_GameTime[] = _("ゲームない じかん"); // "game time" +static const u8 sDebugText_RTCTime[] = _("RTC じかん"); // "RTC time" + +void debug_sub_806F9E4(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u8 *str = gStringVar4; + + switch (data[0]) + { + case 0: + data[0]++; + break; + case 1: + Menu_DrawStdWindowFrame(0, 9, 29, 19); + ConvertIntToHexStringN(str + 80, RtcGetErrorStatus(), 2, 4); + Menu_PrintText(str + 80, 2, 10); + Menu_PrintText(sDebugText_Days, 12, 12); + Menu_PrintText(sDebugText_Time, 20, 12); + Menu_PrintText(sDebugText_RTCTime, 1, 14); + Menu_PrintText(sDebugText_GameTime, 1, 16); + data[0]++; + break; + case 2: + RtcCalcLocalTime(); + FormatHexRtcTime(str); + debug_sub_8009894(str + 20); + FormatDecimalTime(str + 40, gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds); + ConvertIntToDecimalStringN(str + 60, gLocalTime.days, 1, 4); + if (gSaveBlock2.playTimeVBlanks == 0) + { + Menu_PrintText(str, 20, 14); + Menu_PrintText(str + 20, 12, 14); + Menu_PrintText(str + 40, 20, 16); + Menu_PrintText(str + 60, 12, 16); + } + if (data[1] > 19) // Did you mean < 19? + { + data[1]++; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + Menu_EraseScreen(); + DestroyTask(taskId); + ScriptContext2_Disable(); + } + } + break; + } +} +#endif \ No newline at end of file diff --git a/src/roamer.c b/src/roamer.c new file mode 100644 index 000000000..6ed5b6c89 --- /dev/null +++ b/src/roamer.c @@ -0,0 +1,245 @@ +#include "global.h" +#include "debug.h" +#include "roamer.h" +#include "pokemon.h" +#include "random.h" +#include "region_map.h" +#include "constants/species.h" + +#ifdef SAPPHIRE +#define ROAMER_SPECIES SPECIES_LATIAS +#else +#define ROAMER_SPECIES SPECIES_LATIOS +#endif + +enum +{ + MAP_GRP = 0, // map group + MAP_NUM = 1, // map number +}; + +EWRAM_DATA static u8 sLocationHistory[3][2] = {0}; +EWRAM_DATA static u8 sRoamerLocation[2] = {0}; + +static const u8 sRoamerLocations[][6] = +{ + { 0x19, 0x1A, 0x20, 0x21, 0x31, 0xFF }, + { 0x1A, 0x19, 0x20, 0x21, 0xFF, 0xFF }, + { 0x20, 0x1A, 0x19, 0x21, 0xFF, 0xFF }, + { 0x21, 0x20, 0x19, 0x1A, 0x22, 0x26 }, + { 0x22, 0x21, 0x23, 0xFF, 0xFF, 0xFF }, + { 0x23, 0x22, 0x24, 0xFF, 0xFF, 0xFF }, + { 0x24, 0x23, 0x25, 0x26, 0xFF, 0xFF }, + { 0x25, 0x24, 0x26, 0xFF, 0xFF, 0xFF }, + { 0x26, 0x25, 0x21, 0xFF, 0xFF, 0xFF }, + { 0x27, 0x24, 0x28, 0x29, 0xFF, 0xFF }, + { 0x28, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, + { 0x29, 0x27, 0x2A, 0xFF, 0xFF, 0xFF }, + { 0x2A, 0x28, 0x29, 0x2B, 0xFF, 0xFF }, + { 0x2B, 0x2A, 0x2C, 0xFF, 0xFF, 0xFF }, + { 0x2C, 0x2B, 0x2D, 0xFF, 0xFF, 0xFF }, + { 0x2D, 0x2C, 0x2E, 0xFF, 0xFF, 0xFF }, + { 0x2E, 0x2D, 0x2F, 0xFF, 0xFF, 0xFF }, + { 0x2F, 0x2E, 0x30, 0xFF, 0xFF, 0xFF }, + { 0x30, 0x2F, 0x31, 0xFF, 0xFF, 0xFF }, + { 0x31, 0x30, 0x19, 0xFF, 0xFF, 0xFF }, + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, +}; + +void ClearRoamerData(void) +{ + memset(&gSaveBlock1.roamer, 0, sizeof(gSaveBlock1.roamer)); +} + +void ClearRoamerLocationData(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + sLocationHistory[i][MAP_GRP] = 0; + sLocationHistory[i][MAP_NUM] = 0; + } + + sRoamerLocation[MAP_GRP] = 0; + sRoamerLocation[MAP_NUM] = 0; +} + +void CreateInitialRoamerMon(void) +{ + struct Roamer *roamer; + CreateMon(&gEnemyParty[0], ROAMER_SPECIES, 40, 0x20, 0, 0, 0, 0); + roamer = &gSaveBlock1.roamer; + roamer->species = ROAMER_SPECIES; + roamer->level = 40; + roamer->status = 0; + roamer->active = TRUE; + roamer->ivs = GetMonData(&gEnemyParty[0], MON_DATA_IVS); + roamer->personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY); + roamer->hp = GetMonData(&gEnemyParty[0], MON_DATA_MAX_HP); + roamer->cool = GetMonData(&gEnemyParty[0], MON_DATA_COOL); + roamer->beauty = GetMonData(&gEnemyParty[0], MON_DATA_BEAUTY); + roamer->cute = GetMonData(&gEnemyParty[0], MON_DATA_CUTE); + roamer->smart = GetMonData(&gEnemyParty[0], MON_DATA_SMART); + roamer->tough = GetMonData(&gEnemyParty[0], MON_DATA_TOUGH); + sRoamerLocation[MAP_GRP] = 0; + sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % 20][0]; +} + +void InitRoamer(void) +{ + ClearRoamerData(); + ClearRoamerLocationData(); + CreateInitialRoamerMon(); +} + +void UpdateLocationHistoryForRoamer(void) +{ + sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP]; + sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM]; + + sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP]; + sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM]; + + sLocationHistory[0][MAP_GRP] = gSaveBlock1.location.mapGroup; + sLocationHistory[0][MAP_NUM] = gSaveBlock1.location.mapNum; +} + +void RoamerMoveToOtherLocationSet(void) +{ + u8 val = 0; + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (!roamer->active) + return; + + sRoamerLocation[MAP_GRP] = val; + + while (1) + { + val = sRoamerLocations[Random() % 20][0]; + if (sRoamerLocation[MAP_NUM] != val) + { + sRoamerLocation[MAP_NUM] = val; + return; + } + } +} + +void RoamerMove(void) +{ + u8 locSet = 0; + + if ((Random() % 16) == 0) + { + RoamerMoveToOtherLocationSet(); + } + else + { + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (!roamer->active) + return; + + while (locSet < 20) + { + if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0]) + { + u8 mapNum; + while (1) + { + mapNum = sRoamerLocations[locSet][(Random() % 5) + 1]; + if (!(sLocationHistory[2][MAP_GRP] == 0 && sLocationHistory[2][MAP_NUM] == mapNum) && mapNum != 0xFF) + break; + } + sRoamerLocation[MAP_NUM] = mapNum; + return; + } + locSet++; + } + } +} + +bool8 IsRoamerAt(u8 mapGroup, u8 mapNum) +{ + struct Roamer *roamer = &gSaveBlock1.roamer; + + if (roamer->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM]) + return TRUE; + else + return FALSE; +} + +void CreateRoamerMonInstance(void) +{ + struct Pokemon *mon = &gEnemyParty[0]; + struct Roamer *roamer = &gSaveBlock1.roamer; + CreateMonWithIVsPersonality(mon, roamer->species, roamer->level, roamer->ivs, roamer->personality); + SetMonData(mon, MON_DATA_STATUS, &roamer->status); + SetMonData(mon, MON_DATA_HP, &roamer->hp); + SetMonData(mon, MON_DATA_COOL, &roamer->cool); + SetMonData(mon, MON_DATA_BEAUTY, &roamer->beauty); + SetMonData(mon, MON_DATA_CUTE, &roamer->cute); + SetMonData(mon, MON_DATA_SMART, &roamer->smart); + SetMonData(mon, MON_DATA_TOUGH, &roamer->tough); +} + +bool8 TryStartRoamerEncounter(void) +{ + if (IsRoamerAt(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) == TRUE && (Random() % 4) == 0) + { + CreateRoamerMonInstance(); + return TRUE; + } + else + { + return FALSE; + } +} + +void UpdateRoamerHPStatus(struct Pokemon *mon) +{ + struct Roamer *roamer; + u16 hp; + u8 status; + + hp = GetMonData(mon, MON_DATA_HP); + + roamer = &gSaveBlock1.roamer; + roamer->hp = hp; + + status = GetMonData(mon, MON_DATA_STATUS); + + roamer->status = status; + + RoamerMoveToOtherLocationSet(); +} + +void SetRoamerInactive(void) +{ + struct Roamer *roamer = &gSaveBlock1.roamer; + roamer->active = FALSE; +} + +void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) +{ + *mapGroup = sRoamerLocation[MAP_GRP]; + *mapNum = sRoamerLocation[MAP_NUM]; +} + +#if DEBUG +void debug_sub_814A714(void) +{ + if (gSaveBlock1.location.mapGroup == 0) + { + CreateInitialRoamerMon(); + sRoamerLocation[0] = 0; + sRoamerLocation[1] = gSaveBlock1.location.mapNum; + } +} + +void debug_sub_814A73C(u8* str) +{ + GetMapSectionName(str, sRoamerLocation[1], 0); +} +#endif diff --git a/src/rotating_gate.c b/src/rotating_gate.c new file mode 100644 index 000000000..69f655a65 --- /dev/null +++ b/src/rotating_gate.c @@ -0,0 +1,1155 @@ +#include "global.h" +#include "bike.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "constants/maps.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" + +#define ROTATING_GATE_TILE_TAG 0x1300 +#define ROTATING_GATE_PUZZLE_MAX 14 +#define GATE_ARM_MAX_LENGTH 2 + +#define GATE_ROT(rotationDirection, arm, longArm) \ + ((rotationDirection & 15) << 4) | ((arm & 7) << 1) | (longArm & 1) +#define GATE_ROT_CW(arm, longArm) GATE_ROT(ROTATE_CLOCKWISE, arm, longArm) +#define GATE_ROT_ACW(arm, longArm) GATE_ROT(ROTATE_ANTICLOCKWISE, arm, longArm) +#define GATE_ROT_NONE 255 + +static void SpriteCallback_RotatingGate(struct Sprite *sprite); +static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY); +static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite); + +enum +{ + /* + * | + * +-- + */ + GATE_SHAPE_L1, + + /* + * | + * | + * +-- + */ + GATE_SHAPE_L2, + + /* + * | + * +---- + */ + GATE_SHAPE_L3, + + /* + * | + * | + * +---- + */ + GATE_SHAPE_L4, + + /* + * | + * +-- + * | + */ + GATE_SHAPE_T1, + + /* + * | + * | + * +-- + * | + */ + GATE_SHAPE_T2, + + /* + * | + * +---- + * | + */ + GATE_SHAPE_T3, + + /* + * An unused T-shape gate + * | + * +-- + * | + * | + */ + GATE_SHAPE_T4, + + /* + * An unused T-shape gate + * | + * | + * +---- + * | + */ + GATE_SHAPE_UNUSED_T1, + + /* + * An unused T-shape gate + * | + * | + * +-- + * | + * | + */ + GATE_SHAPE_UNUSED_T2, + + /* + * An unused T-shape gate + * | + * +---- + * | + * | + */ + GATE_SHAPE_UNUSED_T3, + + /* + * An unused T-shape gate + * | + * | + * +---- + * | + * | + */ + GATE_SHAPE_UNUSED_T4, +}; + +enum +{ + /* + * 0 degrees (clockwise) + * | + * +-- + * | + */ + GATE_ORIENTATION_0, + + /* + * 90 degress (clockwise) + * --+-- + * | + */ + GATE_ORIENTATION_90, + + /* + * 180 degrees (clockwise) + * | + * --+ + * | + */ + GATE_ORIENTATION_180, + + /* + * 270 degrees (clockwise) + * | + * --+-- + */ + GATE_ORIENTATION_270, + + GATE_ORIENTATION_MAX, +}; + +// Describes the location of the gates "arms" when the gate has not +// been rotated (i.e. rotated 0 degrees) +enum +{ + GATE_ARM_NORTH, + GATE_ARM_EAST, + GATE_ARM_SOUTH, + GATE_ARM_WEST, +}; + +enum +{ + ROTATE_NONE, + ROTATE_ANTICLOCKWISE, + ROTATE_CLOCKWISE, +}; + +enum +{ + PUZZLE_NONE, + PUZZLE_FORTREE_CITY_GYM, + PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6, +}; + +struct RotatingGatePuzzle +{ + s16 x; + s16 y; + u8 shape; + u8 orientation; +}; + +struct Coords8 +{ + s8 deltaX; + s8 deltaY; +}; + +// Fortree +static const struct RotatingGatePuzzle sRotatingGate_FortreePuzzleConfig[] = +{ + {12, 5, GATE_SHAPE_L4, GATE_ORIENTATION_0}, + {14, 7, GATE_SHAPE_L4, GATE_ORIENTATION_270}, + {16, 4, GATE_SHAPE_T2, GATE_ORIENTATION_90}, + {15, 14, GATE_SHAPE_L2, GATE_ORIENTATION_0}, + {18, 13, GATE_SHAPE_T1, GATE_ORIENTATION_180}, + { 8, 20, GATE_SHAPE_T1, GATE_ORIENTATION_180}, + {16, 20, GATE_SHAPE_T4, GATE_ORIENTATION_90}, +}; + +// Trickhouse +static const struct RotatingGatePuzzle sRotatingGate_TrickHousePuzzleConfig[] = +{ + {13, 3, GATE_SHAPE_T1, GATE_ORIENTATION_270}, + {12, 6, GATE_SHAPE_T1, GATE_ORIENTATION_180}, + { 3, 6, GATE_SHAPE_T1, GATE_ORIENTATION_180}, + { 3, 9, GATE_SHAPE_T2, GATE_ORIENTATION_270}, + { 8, 8, GATE_SHAPE_L1, GATE_ORIENTATION_90}, + { 2, 12, GATE_SHAPE_T3, GATE_ORIENTATION_180}, + { 9, 13, GATE_SHAPE_L2, GATE_ORIENTATION_0}, + { 3, 14, GATE_SHAPE_L3, GATE_ORIENTATION_90}, + { 9, 15, GATE_SHAPE_L4, GATE_ORIENTATION_180}, + { 3, 18, GATE_SHAPE_T2, GATE_ORIENTATION_180}, + { 2, 19, GATE_SHAPE_T1, GATE_ORIENTATION_0}, + { 5, 21, GATE_SHAPE_L1, GATE_ORIENTATION_0}, + { 9, 19, GATE_SHAPE_L4, GATE_ORIENTATION_270}, + {12, 20, GATE_SHAPE_T1, GATE_ORIENTATION_90}, +}; + +static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/rotating_gates/1.4bpp"); +static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/rotating_gates/2.4bpp"); +static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/rotating_gates/3.4bpp"); +static const u8 sRotatingGateTiles_5[] = INCBIN_U8("graphics/rotating_gates/5.4bpp"); +static const u8 sRotatingGateTiles_6[] = INCBIN_U8("graphics/rotating_gates/6.4bpp"); +static const u8 sRotatingGateTiles_7[] = INCBIN_U8("graphics/rotating_gates/7.4bpp"); +static const u8 sRotatingGateTiles_0[] = INCBIN_U8("graphics/rotating_gates/0.4bpp"); +static const u8 sRotatingGateTiles_4[] = INCBIN_U8("graphics/rotating_gates/4.4bpp"); + +static const struct OamData sOamData_RotatingGateLarge = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_NORMAL, + .objMode = 0, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 5, + .affineParam = 0, +}; + +static const struct OamData sOamData_RotatingGateRegular = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_NORMAL, + .objMode = 0, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 2, + .paletteNum = 5, + .affineParam = 0, +}; + +static const struct SpriteSheet sRotatingGatesGraphicsTable[] = +{ + {sRotatingGateTiles_0, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L1}, + {sRotatingGateTiles_1, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L2}, + {sRotatingGateTiles_2, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L3}, + {sRotatingGateTiles_3, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L4}, + {sRotatingGateTiles_4, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T1}, + {sRotatingGateTiles_5, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T2}, + {sRotatingGateTiles_6, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T3}, + {sRotatingGateTiles_7, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T4}, + {NULL}, +}; + +static const union AnimCmd sSpriteAnim_RotatingGateLarge[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_RotatingGateRegular[] = +{ + ANIMCMD_FRAME(0, 0), ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_RotatingGateLarge[] = +{ + sSpriteAnim_RotatingGateLarge, +}; + +static const union AnimCmd *const sSpriteAnimTable_RotatingGateRegular[] = +{ + sSpriteAnim_RotatingGateRegular, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated0[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated90[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated180[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated270[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_RotatingGate[] = +{ + sSpriteAffineAnim_Rotated0, + sSpriteAffineAnim_Rotated90, + sSpriteAffineAnim_Rotated180, + sSpriteAffineAnim_Rotated270, + sSpriteAffineAnim_RotatingAnticlockwise360to270, + sSpriteAffineAnim_RotatingAnticlockwise90to0, + sSpriteAffineAnim_RotatingAnticlockwise180to90, + sSpriteAffineAnim_RotatingAnticlockwise270to180, + sSpriteAffineAnim_RotatingClockwise0to90, + sSpriteAffineAnim_RotatingClockwise90to180, + sSpriteAffineAnim_RotatingClockwise180to270, + sSpriteAffineAnim_RotatingClockwise270to360, + sSpriteAffineAnim_RotatingAnticlockwise360to270Faster, + sSpriteAffineAnim_RotatingAnticlockwise90to0Faster, + sSpriteAffineAnim_RotatingAnticlockwise180to90Faster, + sSpriteAffineAnim_RotatingAnticlockwise270to180Faster, + sSpriteAffineAnim_RotatingClockwise0to90Faster, + sSpriteAffineAnim_RotatingClockwise90to180Faster, + sSpriteAffineAnim_RotatingClockwise180to270Faster, + sSpriteAffineAnim_RotatingClockwise270to360Faster, +}; + +static const struct SpriteTemplate sSpriteTemplate_RotatingGateLarge = +{ + .tileTag = ROTATING_GATE_TILE_TAG, + .paletteTag = 0xFFFF, + .oam = &sOamData_RotatingGateLarge, + .anims = sSpriteAnimTable_RotatingGateLarge, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_RotatingGate, + .callback = SpriteCallback_RotatingGate, +}; + +static const struct SpriteTemplate sSpriteTemplate_RotatingGateRegular = +{ + .tileTag = ROTATING_GATE_TILE_TAG, + .paletteTag = 0xFFFF, + .oam = &sOamData_RotatingGateRegular, + .anims = sSpriteAnimTable_RotatingGateRegular, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_RotatingGate, + .callback = SpriteCallback_RotatingGate, +}; + +// These structures describe what happens to the gate if you hit it at +// a given coordinate in a 4x4 grid when walking in the specified +// direction. Either the gate does not rotate, or it rotates in the +// given direction. This information is compared against the gate +// "arm" layout to see if there is an arm at the position in order to +// produce the final rotation. +static const u8 sRotatingGate_RotationInfoNorth[4 * 4] = +{ + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_CW(GATE_ARM_WEST, 1), GATE_ROT_CW(GATE_ARM_WEST, 0), GATE_ROT_ACW(GATE_ARM_EAST, 0), GATE_ROT_ACW(GATE_ARM_EAST, 1), + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, +}; + +static const u8 sRotatingGate_RotationInfoSouth[4 * 4] = +{ + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_ACW(GATE_ARM_WEST, 1), GATE_ROT_ACW(GATE_ARM_WEST, 0), GATE_ROT_CW(GATE_ARM_EAST, 0), GATE_ROT_CW(GATE_ARM_EAST, 1), + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, +}; + +static const u8 sRotatingGate_RotationInfoWest[4 * 4] = +{ + GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_NORTH, 1), GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_NORTH, 0), GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_SOUTH, 0), GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_SOUTH, 1), GATE_ROT_NONE, GATE_ROT_NONE, +}; + +static const u8 sRotatingGate_RotationInfoEast[4 * 4] = +{ + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_NORTH, 1), GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_NORTH, 0), GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_SOUTH, 0), GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_SOUTH, 1), GATE_ROT_NONE, +}; + +// These tables describe the relative coordinate positions the arms +// must move through in order to be rotated. +static const struct Coords8 sRotatingGate_ArmPositionsClockwiseRotation[] = { + { 0, -1 }, { 1, -2 }, { 0, 0 }, { 1, 0 }, { -1, 0 }, { -1, 1 }, { -1, -1 }, { -2, -1 }, +}; + +static const struct Coords8 sRotatingGate_ArmPositionsAntiClockwiseRotation[] = { + { -1, -1 }, { -1, -2 }, { 0, -1 }, { 1, -1 }, { 0, 0 }, { 0, 1 }, { -1, 0 }, { -2, 0 }, +}; + +// Describes where the gates "arms" are in the order north, east, south, west. +// These are adjusted using the current orientation to perform collision checking +static const u8 sRotatingGate_ArmLayout[][4 * 2] = +{ + // L-shape gates + { + 1, 0, + 1, 0, + 0, 0, + 0, 0, + }, + { + 1, 1, + 1, 0, + 0, 0, + 0, 0, + }, + { + 1, 0, + 1, 1, + 0, 0, + 0, 0, + }, + { + 1, 1, + 1, 1, + 0, 0, + 0, 0, + }, + + // T-shape gates + { + 1, 0, + 1, 0, + 1, 0, + 0, 0, + }, + { + 1, 1, + 1, 0, + 1, 0, + 0, 0, + }, + { + 1, 0, + 1, 1, + 1, 0, + 0, 0, + }, + { + 1, 0, + 1, 0, + 1, 1, + 0, 0, + }, + + // Unused T-shape gates + // These have 2-3 long arms and cannot actually be used anywhere + // since configuration for them is missing from the other tables. + { + 1, 1, + 1, 1, + 1, 0, + 0, 0, + }, + { + 1, 1, + 1, 0, + 1, 1, + 0, 0, + }, + { + 1, 0, + 1, 1, + 1, 1, + 0, 0, + }, + { + 1, 1, + 1, 1, + 1, 1, + 0, 0, + }, +}; + +static EWRAM_DATA u8 gRotatingGate_GateSpriteIds[ROTATING_GATE_PUZZLE_MAX] = {0}; +static EWRAM_DATA const struct RotatingGatePuzzle *gRotatingGate_PuzzleConfig = NULL; +static EWRAM_DATA u8 gRotatingGate_PuzzleCount = 0; + +static int GetCurrentMapRotatingGatePuzzleType(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP(FORTREE_CITY_GYM) && + gSaveBlock1.location.mapNum == MAP_NUM(FORTREE_CITY_GYM)) + { + return PUZZLE_FORTREE_CITY_GYM; + } + + if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE110_TRICK_HOUSE_PUZZLE6) && + gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_TRICK_HOUSE_PUZZLE6)) + { + return PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6; + } + + return PUZZLE_NONE; +} + +static void RotatingGate_ResetAllGateOrientations(void) +{ + int i; + u8 *ptr; + + ptr = (u8 *)GetVarPointer(0x4000); + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + ptr[i] = gRotatingGate_PuzzleConfig[i].orientation; + } +} + +static int RotatingGate_GetGateOrientation(u8 gateId) +{ + return ((u8 *)GetVarPointer(0x4000))[gateId]; +} + +static void RotatingGate_SetGateOrientation(u8 gateId, u8 orientation) +{ + ((u8 *)GetVarPointer(0x4000))[gateId] = orientation; +} + +static void RotatingGate_RotateInDirection(u8 gateId, u32 rotationDirection) +{ + u8 orientation = RotatingGate_GetGateOrientation(gateId); + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + { + if (orientation) + { + orientation--; + } + else + { + orientation = GATE_ORIENTATION_270; + } + } + else + { + orientation = ++orientation % GATE_ORIENTATION_MAX; + } + + RotatingGate_SetGateOrientation(gateId, orientation); +} + +static void RotatingGate_LoadPuzzleConfig(void) +{ + int puzzleType = GetCurrentMapRotatingGatePuzzleType(); + u32 i; + + switch (puzzleType) + { + case PUZZLE_FORTREE_CITY_GYM: + gRotatingGate_PuzzleConfig = sRotatingGate_FortreePuzzleConfig; + gRotatingGate_PuzzleCount = + sizeof(sRotatingGate_FortreePuzzleConfig) / sizeof(struct RotatingGatePuzzle); + break; + case PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6: + gRotatingGate_PuzzleConfig = sRotatingGate_TrickHousePuzzleConfig; + gRotatingGate_PuzzleCount = + sizeof(sRotatingGate_TrickHousePuzzleConfig) / sizeof(struct RotatingGatePuzzle); + break; + case PUZZLE_NONE: + default: + return; + } + + for (i = 0; i < ROTATING_GATE_PUZZLE_MAX; i++) + { + gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; + } +} + +static void RotatingGate_CreateGatesWithinViewport(s16 deltaX, s16 deltaY) +{ + u8 i; + + // Calculate the bounding box of the camera + // Same as RotatingGate_DestroyGatesOutsideViewport + s16 x = gSaveBlock1.pos.x - 2; + s16 x2 = gSaveBlock1.pos.x + 0x11; + s16 y = gSaveBlock1.pos.y - 2; + s16 y2 = gSaveBlock1.pos.y + 0xe; + + s16 x3, y3; + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + x3 = gRotatingGate_PuzzleConfig[i].x + 7; + y3 = gRotatingGate_PuzzleConfig[i].y + 7; + + if (y <= y3 && y2 >= y3 && x <= x3 && x2 >= x3 && + gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) + { + gRotatingGate_GateSpriteIds[i] = RotatingGate_CreateGate(i, deltaX, deltaY); + } + } +} + +static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) +{ + struct Sprite *sprite; + struct SpriteTemplate template; + const struct RotatingGatePuzzle *gate; + u8 spriteId; + s16 x, y; + + gate = &gRotatingGate_PuzzleConfig[gateId]; + + if (gate->shape == GATE_SHAPE_L1 || gate->shape == GATE_SHAPE_T1) + template = sSpriteTemplate_RotatingGateRegular; + else + template = sSpriteTemplate_RotatingGateLarge; + + template.tileTag = gate->shape + ROTATING_GATE_TILE_TAG; + + spriteId = CreateSprite(&template, 0, 0, 0x94); + if (spriteId == MAX_SPRITES) + return MAX_SPRITES; + + x = gate->x + 7; + y = gate->y + 7; + + sprite = &gSprites[spriteId]; + sprite->data[0] = gateId; + sprite->coordOffsetEnabled = 1; + + sub_8060388(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y); + RotatingGate_HideGatesOutsideViewport(sprite); + StartSpriteAffineAnim(sprite, RotatingGate_GetGateOrientation(gateId)); + + return spriteId; +} + +static void SpriteCallback_RotatingGate(struct Sprite *sprite) +{ + u8 rotationDirection; + u8 orientation; + u8 affineAnimation; + + rotationDirection = sprite->data[1]; + orientation = sprite->data[2]; + + RotatingGate_HideGatesOutsideViewport(sprite); + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + { + affineAnimation = orientation + 4; + + if (GetPlayerSpeed() != 1) + affineAnimation += 8; + + PlaySE(SE_HI_TURUN); + StartSpriteAffineAnim(sprite, affineAnimation); + } + else if (rotationDirection == ROTATE_CLOCKWISE) + { + affineAnimation = orientation + 8; + + if (GetPlayerSpeed() != 1) + affineAnimation += 8; + + PlaySE(SE_HI_TURUN); + StartSpriteAffineAnim(sprite, affineAnimation); + } + + sprite->data[1] = ROTATE_NONE; +} + +static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite) +{ + u16 x; + s16 x2; + u16 y; + s16 y2; + + sprite->invisible = FALSE; + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + + x2 = x + 0x40; // Dimensions of the rotating gate + y2 = y + 0x40; + + if ((s16)x > DISPLAY_WIDTH + 0x10 - 1 || x2 < -0x10) + { + sprite->invisible = TRUE; + } + + if ((s16)y > DISPLAY_HEIGHT + 0x10 - 1 || y2 < -0x10) + { + sprite->invisible = TRUE; + } +} + +static void LoadRotatingGatePics(void) +{ + LoadSpriteSheets(sRotatingGatesGraphicsTable); +} + +static void RotatingGate_DestroyGatesOutsideViewport(void) +{ + s16 x; + s16 x2; + s16 y; + s16 y2; + s16 xGate; + s16 yGate; + int i; + struct Sprite *sprite; + + // Same as RotatingGate_CreateGatesWithinViewport + x = gSaveBlock1.pos.x - 2; + x2 = gSaveBlock1.pos.x + 0x11; + y = gSaveBlock1.pos.y - 2; + y2 = gSaveBlock1.pos.y + 0xe; + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + xGate = gRotatingGate_PuzzleConfig[i].x + 7; + yGate = gRotatingGate_PuzzleConfig[i].y + 7; + + if (gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) + continue; + + if (xGate < x || xGate > x2 || yGate < y || yGate > y2) + { + sprite = &gSprites[gRotatingGate_GateSpriteIds[i]]; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; + } + } +} + +#ifdef NONMATCHING +static int RotatingGate_CanRotate(u8 gateId, int rotationDirection) +{ + const struct Coords8 *armPos; + u8 orientation; + s16 x; + s16 y; + int shape; + int i; + int j; + int armOrientation; + const u8 *gateArmCollisionData; + u8 armIndex; + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + armPos = sRotatingGate_ArmPositionsAntiClockwiseRotation; + else if (rotationDirection == ROTATE_CLOCKWISE) + armPos = sRotatingGate_ArmPositionsClockwiseRotation; + else + return 0; + + orientation = RotatingGate_GetGateOrientation(gateId); + + shape = gRotatingGate_PuzzleConfig[gateId].shape; + x = gRotatingGate_PuzzleConfig[gateId].x + 7; + y = gRotatingGate_PuzzleConfig[gateId].y + 7; + + // Loop through the gate's "arms" clockwise (north, south, east, west) + for (i = GATE_ARM_NORTH; i <= GATE_ARM_WEST; i++) + { + armOrientation = orientation + i; + gateArmCollisionData = sRotatingGate_ArmLayout[shape][i]; + + // Ensure that no part of the arm collides with the map + for (j = 0; j < GATE_ARM_MAX_LENGTH; j++) + { + armIndex = 2 * (armOrientation % 4) + j; + + if (*gateArmCollisionData) + { + if (MapGridIsImpassableAt( + armPos[armIndex].deltaX + x, armPos[armIndex].deltaY + y) == 1) + return 0; + } + gateArmCollisionData++; + } + } + + return 1; +} +#else +__attribute__((naked)) +static int RotatingGate_CanRotate(u8 a, int puzzleType) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r1, 0x1\n\ + bne _080C7EAC\n\ + ldr r0, _080C7EA8 @ =sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ + mov r10, r0\n\ + b _080C7EB8\n\ + .align 2, 0\n\ +_080C7EA8: .4byte sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ +_080C7EAC:\n\ + cmp r1, 0x2\n\ + beq _080C7EB4\n\ +_080C7EB0:\n\ + movs r0, 0\n\ + b _080C7F48\n\ +_080C7EB4:\n\ + ldr r1, _080C7F58 @ =sRotatingGate_ArmPositionsClockwiseRotation\n\ + mov r10, r1\n\ +_080C7EB8:\n\ + adds r0, r4, 0\n\ + bl RotatingGate_GetGateOrientation\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + ldr r0, _080C7F5C @ =gRotatingGate_PuzzleConfig\n\ + ldr r1, [r0]\n\ + lsls r0, r4, 3\n\ + adds r0, r1\n\ + ldrb r2, [r0, 0x4]\n\ + ldrh r1, [r0]\n\ + adds r1, 0x7\n\ + ldrh r0, [r0, 0x2]\n\ + adds r0, 0x7\n\ + movs r3, 0\n\ + lsls r2, 3\n\ + str r2, [sp, 0x4]\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + mov r9, r1\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + mov r8, r0\n\ +_080C7EE8:\n\ + movs r6, 0\n\ + ldr r2, [sp]\n\ + adds r7, r2, r3\n\ + lsls r0, r3, 1\n\ + adds r5, r7, 0\n\ + ldr r1, [sp, 0x4]\n\ + adds r0, r1\n\ + ldr r2, _080C7F60 @ =sRotatingGate_ArmLayout\n\ + adds r4, r0, r2\n\ +_080C7EFA:\n\ + adds r0, r5, 0\n\ + cmp r5, 0\n\ + bge _080C7F02\n\ + adds r0, r7, 0x3\n\ +_080C7F02:\n\ + asrs r0, 2\n\ + lsls r0, 2\n\ + subs r0, r5, r0\n\ + lsls r0, 1\n\ + adds r0, r6\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldrb r0, [r4]\n\ + cmp r0, 0\n\ + beq _080C7F38\n\ + lsls r1, 2\n\ + add r1, r10\n\ + movs r0, 0\n\ + ldrsb r0, [r1, r0]\n\ + add r0, r9\n\ + ldrb r1, [r1, 0x1]\n\ + lsls r1, 24\n\ + asrs r1, 24\n\ + add r1, r8\n\ + str r3, [sp, 0x8]\n\ + bl MapGridIsImpassableAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldr r3, [sp, 0x8]\n\ + cmp r0, 0x1\n\ + beq _080C7EB0\n\ +_080C7F38:\n\ + adds r4, 0x1\n\ + adds r6, 0x1\n\ + cmp r6, 0x1\n\ + ble _080C7EFA\n\ + adds r3, 0x1\n\ + cmp r3, 0x3\n\ + ble _080C7EE8\n\ + movs r0, 0x1\n\ +_080C7F48:\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_080C7F58: .4byte sRotatingGate_ArmPositionsClockwiseRotation\n\ +_080C7F5C: .4byte gRotatingGate_PuzzleConfig\n\ +_080C7F60: .4byte sRotatingGate_ArmLayout\n\ +.syntax divided\n"); +} +#endif + +static int RotatingGate_HasArm(u8 gateId, u8 armInfo) +{ + int isLongArm; + s8 armOrientation; + int arm; + int shape; + + arm = armInfo >> 1; + isLongArm = armInfo & 1; + + armOrientation = (arm - RotatingGate_GetGateOrientation(gateId) + 4) % 4; + shape = gRotatingGate_PuzzleConfig[gateId].shape; + return sRotatingGate_ArmLayout[shape][armOrientation * 2 + isLongArm]; +} + +static void RotatingGate_TriggerRotationAnimation(u8 gateId, int rotationDirection) +{ + struct Sprite *sprite; + + if (gRotatingGate_GateSpriteIds[gateId] != MAX_SPRITES) + { + sprite = &gSprites[gRotatingGate_GateSpriteIds[gateId]]; + sprite->data[1] = rotationDirection; + sprite->data[2] = RotatingGate_GetGateOrientation(gateId); + } +} + +static u8 RotatingGate_GetRotationInfo(u8 direction, s16 x, s16 y) +{ + register const u8 *ptr; + + if (direction == DIR_NORTH) + ptr = sRotatingGate_RotationInfoNorth; + else if (direction == DIR_SOUTH) + ptr = sRotatingGate_RotationInfoSouth; + else if (direction == DIR_WEST) + ptr = sRotatingGate_RotationInfoWest; + else if (direction == DIR_EAST) + ptr = sRotatingGate_RotationInfoEast; + else + return GATE_ROT_NONE; + + return ptr[y * 4 + x]; +} + +void RotatingGate_InitPuzzle(void) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + RotatingGate_LoadPuzzleConfig(); + RotatingGate_ResetAllGateOrientations(); + } +} + +void RotatingGatePuzzleCameraUpdate(u16 deltaX, u16 deltaY) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + RotatingGate_CreateGatesWithinViewport(deltaX, deltaY); + RotatingGate_DestroyGatesOutsideViewport(); + } +} + +void RotatingGate_InitPuzzleAndGraphics(void) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + LoadRotatingGatePics(); + RotatingGate_LoadPuzzleConfig(); + RotatingGate_CreateGatesWithinViewport(0, 0); + } +} + +bool8 CheckForRotatingGatePuzzleCollision(u8 direction, s16 x, s16 y) +{ + int i; + + if (!GetCurrentMapRotatingGatePuzzleType()) + return FALSE; + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + s16 gateX = gRotatingGate_PuzzleConfig[i].x + 7; + s16 gateY = gRotatingGate_PuzzleConfig[i].y + 7; + + if (gateX - 2 <= x && x <= gateX + 1 && gateY - 2 <= y && y <= gateY + 1) + { + s16 centerX = x - gateX + 2; + s16 centerY = y - gateY + 2; + u8 rotationInfo = RotatingGate_GetRotationInfo(direction, centerX, centerY); + + if (rotationInfo != GATE_ROT_NONE) + { + u8 rotationDirection = ((rotationInfo & 0xF0) >> 4); + u8 armInfo = rotationInfo & 0xF; + + if (RotatingGate_HasArm(i, armInfo)) + { + if (RotatingGate_CanRotate(i, rotationDirection)) + { + RotatingGate_TriggerRotationAnimation(i, rotationDirection); + RotatingGate_RotateInDirection(i, rotationDirection); + return FALSE; + } + return TRUE; + } + } + } + } + return FALSE; +} diff --git a/src/rtc.c b/src/rtc.c new file mode 100644 index 000000000..5462298ed --- /dev/null +++ b/src/rtc.c @@ -0,0 +1,378 @@ +#include "global.h" +#include "rtc.h" +#include "string_util.h" +#include "text.h" + +static u16 sErrorStatus; +static struct SiiRtcInfo sRtc; +static u8 sProbeResult; +static u16 sSavedIme; + +struct Time gLocalTime; + +static const struct SiiRtcInfo sRtcDummy = {0, MONTH_JAN, 1}; // 2000 Jan 1 + +static const s32 sNumDaysInMonths[12] = +{ + 31, + 28, + 31, + 30, + 31, + 30, + 31, + 31, + 30, + 31, + 30, + 31, +}; + +void RtcDisableInterrupts() +{ + sSavedIme = REG_IME; + REG_IME = 0; +} + +void RtcRestoreInterrupts() +{ + REG_IME = sSavedIme; +} + +u32 ConvertBcdToBinary(u8 bcd) +{ + if (bcd > 0x9F) + return 0xFF; + + if ((bcd & 0xF) <= 9) + return (10 * ((bcd >> 4) & 0xF)) + (bcd & 0xF); + else + return 0xFF; +} + +bool8 IsLeapYear(u8 year) +{ + if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) + return TRUE; + + return FALSE; +} + +u16 ConvertDateToDayCount(u8 year, u8 month, u8 day) +{ + s32 i; + u16 dayCount = 0; + +#ifndef BUGFIX_BERRY + // The berry glitch was caused by not adding days for the year 2000. + for (i = year - 1; i > 0; i--) + { + dayCount += 365; + + if (IsLeapYear(i) == TRUE) + dayCount++; + } +#else + // The fix was to use "i >= 0" as the condition instead of "i > 0". + for (i = year - 1; i >= 0; i--) + { + dayCount += 365; + + if (IsLeapYear(i) == TRUE) + dayCount++; + } +#endif // BUGFIX_BERRY + + for (i = 0; i < month - 1; i++) + dayCount += sNumDaysInMonths[i]; + + if (month > MONTH_FEB && IsLeapYear(year) == TRUE) + dayCount++; + + dayCount += day; + + return dayCount; +} + +u16 RtcGetDayCount(struct SiiRtcInfo *rtc) +{ + u8 year = ConvertBcdToBinary(rtc->year); + u8 month = ConvertBcdToBinary(rtc->month); + u8 day = ConvertBcdToBinary(rtc->day); + return ConvertDateToDayCount(year, month, day); +} + +void RtcInit() +{ + sErrorStatus = 0; + + RtcDisableInterrupts(); + SiiRtcUnprotect(); + sProbeResult = SiiRtcProbe(); + RtcRestoreInterrupts(); + + if (!(sProbeResult & 0xF)) + { + sErrorStatus = RTC_INIT_ERROR; + return; + } + + if (sProbeResult & 0xF0) + sErrorStatus = RTC_INIT_WARNING; + else + sErrorStatus = 0; + + RtcGetRawInfo(&sRtc); + sErrorStatus = RtcCheckInfo(&sRtc); +} + +u16 RtcGetErrorStatus() +{ + return sErrorStatus; +} + +void RtcGetInfo(struct SiiRtcInfo *rtc) +{ + if (sErrorStatus & RTC_ERR_FLAG_MASK) + *rtc = sRtcDummy; + else + RtcGetRawInfo(rtc); +} + +void RtcGetDateTime(struct SiiRtcInfo *rtc) +{ + RtcDisableInterrupts(); + SiiRtcGetDateTime(rtc); + RtcRestoreInterrupts(); +} + +void RtcGetStatus(struct SiiRtcInfo *rtc) +{ + RtcDisableInterrupts(); + SiiRtcGetStatus(rtc); + RtcRestoreInterrupts(); +} + +void RtcGetRawInfo(struct SiiRtcInfo *rtc) +{ + RtcGetStatus(rtc); + RtcGetDateTime(rtc); +} + +u16 RtcCheckInfo(struct SiiRtcInfo *rtc) +{ + u16 errorFlags = 0; + s32 year; + s32 month; + s32 value; + + if (rtc->status & SIIRTCINFO_POWER) + errorFlags |= RTC_ERR_POWER_FAILURE; + + if (!(rtc->status & SIIRTCINFO_24HOUR)) + errorFlags |= RTC_ERR_12HOUR_CLOCK; + + year = ConvertBcdToBinary(rtc->year); + + if (year == 0xFF) + errorFlags |= RTC_ERR_INVALID_YEAR; + + month = ConvertBcdToBinary(rtc->month); + + if (month == 0xFF || month == 0 || month > 12) + errorFlags |= RTC_ERR_INVALID_MONTH; + + value = ConvertBcdToBinary(rtc->day); + + if (value == 0xFF) + errorFlags |= RTC_ERR_INVALID_DAY; + + if (month == MONTH_FEB) + { + if (value > IsLeapYear(year) + sNumDaysInMonths[month - 1]) + errorFlags |= RTC_ERR_INVALID_DAY; + } + else + { + if (value > sNumDaysInMonths[month - 1]) + errorFlags |= RTC_ERR_INVALID_DAY; + } + + value = ConvertBcdToBinary(rtc->hour); + + if (value > 24) + errorFlags |= RTC_ERR_INVALID_HOUR; + + value = ConvertBcdToBinary(rtc->minute); + + if (value > 60) + errorFlags |= RTC_ERR_INVALID_MINUTE; + + value = ConvertBcdToBinary(rtc->second); + + if (value > 60) + errorFlags |= RTC_ERR_INVALID_SECOND; + + return errorFlags; +} + +void RtcReset() +{ + RtcDisableInterrupts(); + SiiRtcReset(); + RtcRestoreInterrupts(); +} + +void FormatDecimalTime(u8 *dest, s32 hour, s32 minute, s32 second) +{ + dest = ConvertIntToDecimalStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_COLON; + dest = ConvertIntToDecimalStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_COLON; + dest = ConvertIntToDecimalStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest = EOS; +} + +void FormatHexTime(u8 *dest, s32 hour, s32 minute, s32 second) +{ + dest = ConvertIntToHexStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_COLON; + dest = ConvertIntToHexStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_COLON; + dest = ConvertIntToHexStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest = EOS; +} + +void FormatHexRtcTime(u8 *dest) +{ + FormatHexTime(dest, sRtc.hour, sRtc.minute, sRtc.second); +} + +void FormatDecimalDate(u8 *dest, s32 year, s32 month, s32 day) +{ + dest = ConvertIntToDecimalStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4); + *dest++ = CHAR_HYPHEN; + dest = ConvertIntToDecimalStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_HYPHEN; + dest = ConvertIntToDecimalStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest = EOS; +} + +void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day) +{ + dest = ConvertIntToHexStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4); + *dest++ = CHAR_HYPHEN; + dest = ConvertIntToHexStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest++ = CHAR_HYPHEN; + dest = ConvertIntToHexStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2); + *dest = EOS; +} + +#if DEBUG + +void debug_sub_800987C(u8 *dest) +{ + FormatHexDate(dest, sRtc.year, sRtc.month, sRtc.day); +} + +void debug_sub_8009894(u8 *dest) +{ + u16 dayCount; + + dayCount = RtcGetDayCount(&sRtc); + ConvertIntToDecimalStringN(dest, dayCount, STR_CONV_MODE_RIGHT_ALIGN, 4); +} + +void debug_sub_80098B8(u8 *dest) +{ + ConvertIntToHexStringN(dest, sRtc.status, STR_CONV_MODE_LEADING_ZEROS, 2); +} + +#endif + +void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t) +{ + u16 days = RtcGetDayCount(rtc); + result->seconds = ConvertBcdToBinary(rtc->second) - t->seconds; + result->minutes = ConvertBcdToBinary(rtc->minute) - t->minutes; + result->hours = ConvertBcdToBinary(rtc->hour) - t->hours; + result->days = days - t->days; + + if (result->seconds < 0) + { + result->seconds += 60; + --result->minutes; + } + + if (result->minutes < 0) + { + result->minutes += 60; + --result->hours; + } + + if (result->hours < 0) + { + result->hours += 24; + --result->days; + } +} + +void RtcCalcLocalTime() +{ + RtcGetInfo(&sRtc); + RtcCalcTimeDifference(&sRtc, &gLocalTime, &gSaveBlock2.localTimeOffset); +} + +void RtcInitLocalTimeOffset(s32 hour, s32 minute) +{ + RtcCalcLocalTimeOffset(0, hour, minute, 0); +} + +void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds) +{ + gLocalTime.days = days; + gLocalTime.hours = hours; + gLocalTime.minutes = minutes; + gLocalTime.seconds = seconds; + RtcGetInfo(&sRtc); + RtcCalcTimeDifference(&sRtc, &gSaveBlock2.localTimeOffset, &gLocalTime); +} + +void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2) +{ + result->seconds = t2->seconds - t1->seconds; + result->minutes = t2->minutes - t1->minutes; + result->hours = t2->hours - t1->hours; + result->days = t2->days - t1->days; + + if (result->seconds < 0) + { + result->seconds += 60; + --result->minutes; + } + + if (result->minutes < 0) + { + result->minutes += 60; + --result->hours; + } + + if (result->hours < 0) + { + result->hours += 24; + --result->days; + } +} + +u32 RtcGetMinuteCount() +{ + RtcGetInfo(&sRtc); + return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute; +} + +#if DEBUG +void debug_sub_8009A60() +{ + RtcGetRawInfo(&sRtc); +} +#endif diff --git a/src/safari_zone.c b/src/safari_zone.c new file mode 100644 index 000000000..f371b08b3 --- /dev/null +++ b/src/safari_zone.c @@ -0,0 +1,253 @@ +#include "global.h" +#include "safari_zone.h" +#include "event_data.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "main.h" +#include "overworld.h" +#include "script.h" +#include "string_util.h" +#include "text.h" + +struct PokeblockFeeder +{ + /*0x00*/ s16 x; + /*0x02*/ s16 y; + /*0x04*/ s8 mapNum; + /*0x05*/ u8 stepCounter; + /*0x08*/ struct Pokeblock pokeblock; +}; + +#define NUM_POKEBLOCK_FEEDERS 10 + +static void ClearAllPokeblockFeeders(void); +static void DecrementFeederStepCounters(void); + +extern u8 gBattleOutcome; + +EWRAM_DATA u8 gNumSafariBalls = 0; +EWRAM_DATA u16 gSafariZoneStepCounter = 0; +EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0}; + +extern void (*gFieldCallback)(void); + +extern u8 gUnknown_081C340A; +extern u8 gUnknown_081C342D; +extern u8 gUnknown_081C3448; +extern u8 gUnknown_081C3459; +extern u8 *gPokeblockNames[]; + +extern u16 gSpecialVar_Result; + +bool32 GetSafariZoneFlag(void) +{ + return FlagGet(FLAG_SYS_SAFARI_MODE); +} + +void SetSafariZoneFlag(void) +{ + FlagSet(FLAG_SYS_SAFARI_MODE); +} + +void ResetSafariZoneFlag(void) +{ + FlagClear(FLAG_SYS_SAFARI_MODE); +} + +void EnterSafariMode(void) +{ + IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE); + SetSafariZoneFlag(); + ClearAllPokeblockFeeders(); + gNumSafariBalls = 30; + gSafariZoneStepCounter = 500; +} + +void ExitSafariMode(void) +{ + ResetSafariZoneFlag(); + ClearAllPokeblockFeeders(); + gNumSafariBalls = 0; + gSafariZoneStepCounter = 0; +} + +bool8 SafariZoneTakeStep(void) +{ + if (GetSafariZoneFlag() == FALSE) + { + return FALSE; + } + + DecrementFeederStepCounters(); + gSafariZoneStepCounter--; + if (gSafariZoneStepCounter == 0) + { + ScriptContext1_SetupScript(&gUnknown_081C3448); + return TRUE; + } + return FALSE; +} + +void SafariZoneRetirePrompt(void) +{ + ScriptContext1_SetupScript(&gUnknown_081C342D); +} + +void sub_80C824C(void) +{ + if (gNumSafariBalls != 0) + { + SetMainCallback2(c2_exit_to_overworld_2_switch); + } + else if (gBattleOutcome == 8) + { + ScriptContext2_RunNewScript(&gUnknown_081C340A); + warp_in(); + gFieldCallback = sub_8080E44; + SetMainCallback2(CB2_LoadMap); + } + else if (gBattleOutcome == 7) + { + ScriptContext1_SetupScript(&gUnknown_081C3459); + ScriptContext1_Stop(); + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); + } +} + +static void ClearPokeblockFeeder(u8 index) +{ + memset(&gPokeblockFeeders[index], 0, sizeof(struct PokeblockFeeder)); +} + +static void ClearAllPokeblockFeeders(void) +{ + memset(gPokeblockFeeders, 0, sizeof(gPokeblockFeeders)); +} + +void SafariZoneGetPokeblockNameInFeeder(void) +{ + s16 x, y; + u16 i; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + + for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) + { + if (gSaveBlock1.location.mapNum == gPokeblockFeeders[i].mapNum + && gPokeblockFeeders[i].x == x + && gPokeblockFeeders[i].y == y) + { + gSpecialVar_Result = i; + StringCopy(gStringVar1, gPokeblockNames[gPokeblockFeeders[i].pokeblock.color]); + return; + } + } + + gSpecialVar_Result = -1; +} + +static void GetPokeblockFeederWithinRange(void) +{ + s16 x, y; + u16 i; + + PlayerGetDestCoords(&x, &y); + + for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) + { + if (gSaveBlock1.location.mapNum == gPokeblockFeeders[i].mapNum) + { + //Get absolute value of x and y distance from Pokeblock feeder on current map + x -= gPokeblockFeeders[i].x; + y -= gPokeblockFeeders[i].y; + if (x < 0) + x *= -1; + if (y < 0) + y *= -1; + if ((x + y) <= 5) + { + gSpecialVar_Result = i; + return; + } + } + } + + gSpecialVar_Result = -1; +} + +struct Pokeblock *unref_sub_80C8418(void) +{ + SafariZoneGetPokeblockNameInFeeder(); + + if (gSpecialVar_Result == 0xFFFF) + return NULL; + else + return &gPokeblockFeeders[gSpecialVar_Result].pokeblock; +} + + +struct Pokeblock *SafariZoneGetActivePokeblock(void) +{ + GetPokeblockFeederWithinRange(); + + if (gSpecialVar_Result == 0xFFFF) + return NULL; + else + return &gPokeblockFeeders[gSpecialVar_Result].pokeblock; +} + + +void SafariZoneActivatePokeblockFeeder(u8 pokeblock_index) +{ + s16 x, y; + u8 i; + + for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) + { + //Find free entry in gPokeblockFeeders + if (gPokeblockFeeders[i].mapNum == 0 + && gPokeblockFeeders[i].x == 0 + && gPokeblockFeeders[i].y == 0) + { + //Initialize Pokeblock feeder + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + gPokeblockFeeders[i].mapNum = gSaveBlock1.location.mapNum; + gPokeblockFeeders[i].pokeblock = gSaveBlock1.pokeblocks[pokeblock_index]; + gPokeblockFeeders[i].stepCounter = 100; + gPokeblockFeeders[i].x = x; + gPokeblockFeeders[i].y = y; + break; + } + } +} + +static void DecrementFeederStepCounters(void) +{ + u8 i; + + for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++) + { + if (gPokeblockFeeders[i].stepCounter != 0) + { + gPokeblockFeeders[i].stepCounter--; + if (gPokeblockFeeders[i].stepCounter == 0) + ClearPokeblockFeeder(i); + } + } +} + +bool8 unref_sub_80C853C(void) +{ + SafariZoneGetPokeblockNameInFeeder(); + + if (gSpecialVar_Result == 0xFFFF) + { + return FALSE; + } + + ConvertIntToDecimalStringN(gStringVar2, + gPokeblockFeeders[gSpecialVar_Result].stepCounter, + STR_CONV_MODE_LEADING_ZEROS, 3); + + return TRUE; +} diff --git a/src/save.c b/src/save.c new file mode 100644 index 000000000..0b7a3dd79 --- /dev/null +++ b/src/save.c @@ -0,0 +1,929 @@ +#include "global.h" +#include "gba/gba.h" +#include "gba/flash_internal.h" +#include "save.h" +#include "load_save.h" +#include "overworld.h" +#include "pokemon.h" +#include "save_failed_screen.h" +#include "ewram.h" + +#define FILE_SIGNATURE 0x08012025 // signature value to determine if a sector is in use + +//#define TOTAL_FLASH_SECTORS ((ARRAY_COUNT(sSaveBlockChunks) * 2) + (ARRAY_COUNT(sHallOfFameChunks) * 2)) // there are 2 slots, so double each array count and get the sum. +#define TOTAL_FLASH_SECTORS 32 + +struct SaveBlockChunk +{ + u8 *data; + u16 size; +}; + +struct SaveSector +{ + u8 data[0xFF4]; + u16 id; + u16 checksum; + u32 signature; + u32 counter; +}; // size is 0x1000 + +// headless save section? +struct UnkSaveSection +{ + u8 data[0xFF4]; + u32 signature; +}; // size is 0xFF8 + +static u8 WriteSingleChunk(u16, const struct SaveBlockChunk *); +static u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size); +static u8 TryWriteSector(u8, u8 *); +static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *location); +static u32 RestoreSaveBackupVars(const struct SaveBlockChunk *location); +static u8 sub_812550C(u16 a1, const struct SaveBlockChunk *location); +static u8 sub_812556C(u16 a1, const struct SaveBlockChunk *location); +static u8 sub_81255B8(u16, const struct SaveBlockChunk *location); +static u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *location); +static u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *location); +static u8 sub_812587C(u16 a1, const struct SaveBlockChunk *location); +static u8 sub_81258BC(u16, const struct SaveBlockChunk *location); +static u8 GetSaveValidStatus(const struct SaveBlockChunk *location); +static u8 ReadSomeUnknownSectorAndVerify(u8 a1, u8 *data, u16 size); +static u8 DoReadFlashWholeSection(u8, struct SaveSector *); +static u16 CalculateChecksum(void *, u16); +bool8 unref_sub_8125F4C(struct UnkSaveSection *a1); +u8 unref_sub_8125FA0(void); +u8 unref_sub_8125FF0(u8 *data, u16 size); +u8 unref_sub_8126068(u8 sector, u8 *data, u32 size); +u8 unref_sub_8126080(u8 sector, u8 *data); + +// Sector num to begin writing save data. Sectors are rotated each time the game is saved. (possibly to avoid wear on flash memory?) +u16 gFirstSaveSector; +u32 gPrevSaveCounter; +u16 gLastKnownGoodSector; +u32 gDamagedSaveSectors; +u32 gSaveCounter; +struct SaveSector *gFastSaveSection; // the pointer is in fast IWRAM but may sometimes point to the slower EWRAM. +u16 gUnknown_03005EB4; +u16 gSaveFileStatus; +u32 gGameContinueCallback; + +static EWRAM_DATA u32 gLastSaveSectorStatus = 0; // used but in an unferenced function, so unused + +// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer +#define SECTOR_DATA_SIZE 3968 +#define SECTOR_FOOTER_SIZE 128 + +/* + * Sector Layout: + * + * Sectors 0 - 13: Save Slot 1 + * Sectors 14 - 27: Save Slot 2 + * Sectors 28 - 29: Hall of Fame + * Sectors 30 - 31: e-Reader battle tower data, maybe? + * + * There are two save slots for saving the player's game data. We alternate between + * them each time the game is saved, so that if the current save slot is corrupt, + * we can load the previous one. We also rotate the sectors in each save slot + * so that the same data is not always being written to the same sector. This + * might be done to reduce wear on the flash memory, but I'm not sure, since all + * 14 sectors get written anyway. + */ + +#define HALL_OF_FAME_SECTOR 28 + +#define NUM_SECTORS_PER_SAVE_SLOT 14 // Number of sectors occupied by a save slot +#define NUM_HALL_OF_FAME_SECTORS 2 + +// Divide save blocks into individual chunks to be written to flash sectors + +#define SAVEBLOCK_CHUNK(structure, chunkNum) \ +{ \ + (u8 *)&structure + chunkNum * SECTOR_DATA_SIZE, \ + min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \ +} \ + +static const struct SaveBlockChunk sSaveBlockChunks[] = +{ + SAVEBLOCK_CHUNK(gSaveBlock2, 0), + + SAVEBLOCK_CHUNK(gSaveBlock1, 0), + SAVEBLOCK_CHUNK(gSaveBlock1, 1), + SAVEBLOCK_CHUNK(gSaveBlock1, 2), + SAVEBLOCK_CHUNK(gSaveBlock1, 3), + + SAVEBLOCK_CHUNK(gPokemonStorage, 0), + SAVEBLOCK_CHUNK(gPokemonStorage, 1), + SAVEBLOCK_CHUNK(gPokemonStorage, 2), + SAVEBLOCK_CHUNK(gPokemonStorage, 3), + SAVEBLOCK_CHUNK(gPokemonStorage, 4), + SAVEBLOCK_CHUNK(gPokemonStorage, 5), + SAVEBLOCK_CHUNK(gPokemonStorage, 6), + SAVEBLOCK_CHUNK(gPokemonStorage, 7), + SAVEBLOCK_CHUNK(gPokemonStorage, 8), +}; + +static const struct SaveBlockChunk sHallOfFameChunks[] = +{ + SAVEBLOCK_CHUNK(*eHallOfFame, 0), + SAVEBLOCK_CHUNK(*eHallOfFame, 1), +}; + +void Save_EraseAllData(void) +{ + u16 i; + + for (i = 0; i < NUM_SECTORS; i++) + EraseFlashSector(i); +} + +void Save_ResetSaveCounters(void) +{ + gSaveCounter = 0; + gFirstSaveSector = 0; + gDamagedSaveSectors = 0; +} + +enum +{ + SECTOR_DAMAGED, + SECTOR_OK, + SECTOR_CHECK, // unused +}; + +static bool32 SetSectorDamagedStatus(u8 op, u8 sectorNum) +{ + bool32 retVal = FALSE; + + switch (op) + { + case SECTOR_DAMAGED: + gDamagedSaveSectors |= (1 << sectorNum); + break; + case SECTOR_OK: + gDamagedSaveSectors &= ~(1 << sectorNum); + break; + case SECTOR_CHECK: // unused + if (gDamagedSaveSectors & (1 << sectorNum)) + retVal = TRUE; + break; + } + + return retVal; +} + +// If chunkId is 0xFFFF, this function will write all of the chunks pointed to by 'chunks'. +// Otherwise, it will write a single chunk with the given 'chunkId'. +static u8 WriteSaveBlockChunks(u16 chunkId, const struct SaveBlockChunk *chunks) +{ + u32 retVal; + u16 i; + + gFastSaveSection = eSaveSection; + + if (chunkId != 0xFFFF) // write single chunk + { + retVal = WriteSingleChunk(chunkId, chunks); + } + else // write all chunks + { + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; + gFirstSaveSector++; + gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT; + gSaveCounter++; + retVal = SAVE_STATUS_OK; + + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++) + WriteSingleChunk(i, chunks); + + // Check for any bad sectors + if (gDamagedSaveSectors != 0) // skip the damaged sector. + { + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + } + } + + return retVal; +} + +static u8 WriteSingleChunk(u16 chunkId, const struct SaveBlockChunk *chunks) +{ + u16 i; + u16 sectorNum; + u8 *chunkData; + u16 chunkSize; + + // select sector number + sectorNum = chunkId + gFirstSaveSector; + sectorNum %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sectorNum += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + + chunkData = chunks[chunkId].data; + chunkSize = chunks[chunkId].size; + + // clear save section. + for (i = 0; i < sizeof(struct SaveSector); i++) + ((u8 *)gFastSaveSection)[i] = 0; + + gFastSaveSection->id = chunkId; + gFastSaveSection->signature = FILE_SIGNATURE; + gFastSaveSection->counter = gSaveCounter; + for (i = 0; i < chunkSize; i++) + gFastSaveSection->data[i] = chunkData[i]; + gFastSaveSection->checksum = CalculateChecksum(chunkData, chunkSize); + + return TryWriteSector(sectorNum, gFastSaveSection->data); +} + +static u8 HandleWriteSectorNBytes(u8 sectorNum, u8 *data, u16 size) +{ + u16 i; + struct SaveSector *section = eSaveSection; + + for (i = 0; i < sizeof(struct SaveSector); i++) + ((char *)section)[i] = 0; + + section->signature = FILE_SIGNATURE; + for (i = 0; i < size; i++) + section->data[i] = data[i]; + section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used. + + return TryWriteSector(sectorNum, section->data); +} + +static u8 TryWriteSector(u8 sectorNum, u8 *data) +{ + if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) // is damaged? + { + SetSectorDamagedStatus(SECTOR_DAMAGED, sectorNum); // set damaged sector bits. + return SAVE_STATUS_ERROR; + } + else + { + SetSectorDamagedStatus(SECTOR_OK, sectorNum); // unset damaged sector bits. it's safe now. + return SAVE_STATUS_OK; + } +} + +static u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *chunk) // chunk is unused +{ + gFastSaveSection = eSaveSection; + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; + gFirstSaveSector++; + gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT; + gSaveCounter++; + gUnknown_03005EB4 = 0; + gDamagedSaveSectors = 0; + return 0; +} + +static u32 RestoreSaveBackupVars(const struct SaveBlockChunk *chunk) // chunk is unused +{ + gFastSaveSection = eSaveSection; + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; + gUnknown_03005EB4 = 0; + gDamagedSaveSectors = 0; + return 0; +} + +static u8 sub_812550C(u16 a1, const struct SaveBlockChunk *chunk) +{ + u8 retVal; + + if (gUnknown_03005EB4 < a1 - 1) + { + retVal = SAVE_STATUS_OK; + WriteSingleChunk(gUnknown_03005EB4, chunk); + gUnknown_03005EB4++; + if (gDamagedSaveSectors) + { + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + } + } + else + { + retVal = SAVE_STATUS_ERROR; + } + + return retVal; +} + +static u8 sub_812556C(u16 a1, const struct SaveBlockChunk *chunk) +{ + u8 retVal = SAVE_STATUS_OK; + + sub_81255B8(a1 - 1, chunk); + + if (gDamagedSaveSectors) + { + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + } + return retVal; +} + +static u8 sub_81255B8(u16 chunkId, const struct SaveBlockChunk *chunks) +{ + u16 i; + u16 sector; + u8 *data; + u16 size; + u8 status; + + // select sector number + sector = chunkId + gFirstSaveSector; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + + data = chunks[chunkId].data; + size = chunks[chunkId].size; + + // clear temp save section. + for (i = 0; i < sizeof(struct SaveSector); i++) + ((char *)gFastSaveSection)[i] = 0; + + gFastSaveSection->id = chunkId; + gFastSaveSection->signature = FILE_SIGNATURE; + gFastSaveSection->counter = gSaveCounter; + + // set temp section's data. + for (i = 0; i < size; i++) + gFastSaveSection->data[i] = data[i]; + + // calculate checksum. + gFastSaveSection->checksum = CalculateChecksum(data, size); + + EraseFlashSector(sector); + + status = SAVE_STATUS_OK; + + for (i = 0; i < sizeof(struct UnkSaveSection); i++) + { + if (ProgramFlashByte(sector, i, gFastSaveSection->data[i])) + { + status = SAVE_STATUS_ERROR; + break; + } + } + + if (status == SAVE_STATUS_ERROR) + { + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + return SAVE_STATUS_ERROR; + } + else + { + status = SAVE_STATUS_OK; + + for (i = 0; i < 7; i++) + { + if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i])) + { + status = SAVE_STATUS_ERROR; + break; + } + } + + if (status == SAVE_STATUS_ERROR) + { + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + return SAVE_STATUS_ERROR; + } + else + { + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; + } + } +} + +static u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *chunk) +{ + u16 sector; + + // select sector number + sector = a1 + gFirstSaveSector - 1; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + + if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)])) + { + // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + return SAVE_STATUS_ERROR; + } + else + { + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; + } +} + +static u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *chunk) +{ + u16 sector; + + sector = a1 + gFirstSaveSector - 1; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + + if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25)) + { + // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + return SAVE_STATUS_ERROR; + } + else + { + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; + } +} + +static u8 sub_812587C(u16 a1, const struct SaveBlockChunk *chunk) +{ + u8 retVal; + gFastSaveSection = eSaveSection; + if (a1 != 0xFFFF) + { + retVal = SAVE_STATUS_ERROR; + } + else + { + retVal = GetSaveValidStatus(chunk); + sub_81258BC(0xFFFF, chunk); + } + + return retVal; +} + +static u8 sub_81258BC(u16 a1, const struct SaveBlockChunk *chunks) +{ + u16 i; + u16 checksum; + u16 sector = NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + u16 id; + + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++) + { + DoReadFlashWholeSection(i + sector, gFastSaveSection); + id = gFastSaveSection->id; + if (id == 0) + gFirstSaveSector = i; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[id].size); + if (gFastSaveSection->signature == FILE_SIGNATURE + && gFastSaveSection->checksum == checksum) + { + u16 j; + for (j = 0; j < chunks[id].size; j++) + chunks[id].data[j] = gFastSaveSection->data[j]; + } + } + + return 1; +} + +static u8 GetSaveValidStatus(const struct SaveBlockChunk *chunks) +{ + u16 sector; + bool8 signatureValid; + u16 checksum; + u32 slot1saveCounter = 0; + u32 slot2saveCounter = 0; + u8 slot1Status; + u8 slot2Status; + u32 validSectors; + const u32 ALL_SECTORS = (1 << NUM_SECTORS_PER_SAVE_SLOT) - 1; // bitmask of all saveblock sectors + + // check save slot 1. + validSectors = 0; + signatureValid = FALSE; + for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++) + { + DoReadFlashWholeSection(sector, gFastSaveSection); + if (gFastSaveSection->signature == FILE_SIGNATURE) + { + signatureValid = TRUE; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size); + if (gFastSaveSection->checksum == checksum) + { + slot1saveCounter = gFastSaveSection->counter; + validSectors |= 1 << gFastSaveSection->id; + } + } + } + + if (signatureValid) + { + if (validSectors == ALL_SECTORS) + slot1Status = SAVE_STATUS_OK; + else + slot1Status = SAVE_STATUS_ERROR; + } + else + { + slot1Status = SAVE_STATUS_EMPTY; + } + + // check save slot 2. + validSectors = 0; + signatureValid = FALSE; + for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++) + { + DoReadFlashWholeSection(NUM_SECTORS_PER_SAVE_SLOT + sector, gFastSaveSection); + if (gFastSaveSection->signature == FILE_SIGNATURE) + { + signatureValid = TRUE; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size); + if (gFastSaveSection->checksum == checksum) + { + slot2saveCounter = gFastSaveSection->counter; + validSectors |= 1 << gFastSaveSection->id; + } + } + } + + if (signatureValid) + { + if (validSectors == ALL_SECTORS) + slot2Status = SAVE_STATUS_OK; + else + slot2Status = SAVE_STATUS_ERROR; + } + else + { + slot2Status = SAVE_STATUS_EMPTY; + } + + if (slot1Status == SAVE_STATUS_OK && slot2Status == SAVE_STATUS_OK) + { + // Choose counter of the most recent save file + if ((slot1saveCounter == -1 && slot2saveCounter == 0) || (slot1saveCounter == 0 && slot2saveCounter == -1)) + { + if ((unsigned)(slot1saveCounter + 1) < (unsigned)(slot2saveCounter + 1)) + gSaveCounter = slot2saveCounter; + else + gSaveCounter = slot1saveCounter; + } + else + { + if (slot1saveCounter < slot2saveCounter) + gSaveCounter = slot2saveCounter; + else + gSaveCounter = slot1saveCounter; + } + return SAVE_STATUS_OK; + } + + if (slot1Status == SAVE_STATUS_OK) + { + gSaveCounter = slot1saveCounter; + if (slot2Status == SAVE_STATUS_ERROR) + return SAVE_STATUS_ERROR; + else + return SAVE_STATUS_OK; + } + + if (slot2Status == SAVE_STATUS_OK) + { + gSaveCounter = slot2saveCounter; + if (slot1Status == SAVE_STATUS_ERROR) + return SAVE_STATUS_ERROR; + else + return SAVE_STATUS_OK; + } + + if (slot1Status == SAVE_STATUS_EMPTY && slot2Status == SAVE_STATUS_EMPTY) + { + gSaveCounter = 0; + gFirstSaveSector = 0; + return SAVE_STATUS_EMPTY; + } + + gSaveCounter = 0; + gFirstSaveSector = 0; + return 2; +} + +static u8 ReadSomeUnknownSectorAndVerify(u8 sector, u8 *data, u16 size) +{ + u16 i; + struct SaveSector *section = eSaveSection; + + DoReadFlashWholeSection(sector, section); + if (section->signature == FILE_SIGNATURE) + { + u16 checksum = CalculateChecksum(section->data, size); + if (section->id == checksum) + { + for (i = 0; i < size; i++) + data[i] = section->data[i]; + return SAVE_STATUS_OK; + } + else + { + return 2; + } + } + else + { + return SAVE_STATUS_EMPTY; + } +} + +static u8 DoReadFlashWholeSection(u8 sector, struct SaveSector *section) +{ + ReadFlash(sector, 0, section->data, sizeof(struct SaveSector)); + return 1; +} + +static u16 CalculateChecksum(void *data, u16 size) +{ + u16 i; + u32 checksum = 0; + + for (i = 0; i < (size / 4); i++) + checksum += *((u32 *)data)++; + + return ((checksum >> 16) + checksum); +} + +#if DEBUG +void sub_813B79C(void) +{ + struct SaveSector *sbSector; + struct SaveSector *hofSector; + const struct SaveBlockChunk *sbChunks; + const struct SaveBlockChunk *hofChunks; + u16 i; + + sbSector = eSaveSection; + sbChunks = sSaveBlockChunks; + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT * 2; i++) + { + DoReadFlashWholeSection(i, sbSector); + sbSector->checksum = CalculateChecksum(sbSector, sbChunks[sbSector->id].size); + ProgramFlashSectorAndVerify(i, sbSector->data); + } + + hofSector = eSaveSection; + hofChunks = sHallOfFameChunks; + for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++) + { + DoReadFlashWholeSection(HALL_OF_FAME_SECTOR + i, hofSector); + hofSector->id = CalculateChecksum(hofSector, hofChunks[i].size); // why id? + ProgramFlashSectorAndVerify(HALL_OF_FAME_SECTOR + i, hofSector->data); + } +} +#endif + +u8 Save_WriteDataInternal(u8 saveType) +{ + u8 i; + + switch (saveType) + { + case SAVE_HALL_OF_FAME_ERASE_BEFORE: // wipes all hall of fame data, then saves hall of fame. unused + for (i = HALL_OF_FAME_SECTOR; i < TOTAL_FLASH_SECTORS; i++) + EraseFlashSector(i); + // fall through + case SAVE_HALL_OF_FAME: // hall of fame. + if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999) + IncrementGameStat(GAME_STAT_ENTERED_HOF); + for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++) + HandleWriteSectorNBytes(HALL_OF_FAME_SECTOR + i, sHallOfFameChunks[i].data, sHallOfFameChunks[i].size); + SaveSerializedGame(); + WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); + break; + case SAVE_NORMAL: // normal save. also called by overwriting your own save. + default: + SaveSerializedGame(); + WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); + break; + case SAVE_LINK: // link save. updates only gSaveBlock1 and gSaveBlock2. + SaveSerializedGame(); + for (i = 0; i < 5; i++) + WriteSaveBlockChunks(i, sSaveBlockChunks); + break; + case SAVE_EREADER: // used in mossdeep "game corner" before/after battling old man e-reader trainer + SaveSerializedGame(); + WriteSaveBlockChunks(0, sSaveBlockChunks); + break; + case SAVE_OVERWRITE_DIFFERENT_FILE: // there is a different file, so overwrite it completely. + // Erase Hall of Fame. + for (i = HALL_OF_FAME_SECTOR; i < TOTAL_FLASH_SECTORS; i++) + EraseFlashSector(i); + SaveSerializedGame(); + WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); + break; + } + return 0; +} + +#if DEBUG +extern u32 gUnknown_Debug_03004BD0; +#endif + +u8 Save_WriteData(u8 saveType) // TrySave +{ + if (gFlashMemoryPresent != TRUE) + return SAVE_STATUS_ERROR; + + Save_WriteDataInternal(saveType); + if (!gDamagedSaveSectors +#if DEBUG + && gUnknown_Debug_03004BD0 == 0 +#endif + ) + return SAVE_STATUS_OK; + + DoSaveFailedScreen(saveType); + return SAVE_STATUS_ERROR; +} + +u8 sub_8125D80(void) // trade.s save +{ + if (gFlashMemoryPresent != TRUE) + return 1; + SaveSerializedGame(); + RestoreSaveBackupVarsAndIncrement(sSaveBlockChunks); + return 0; +} + +bool8 sub_8125DA8(void) // trade.s save +{ + u8 retVal = sub_812550C(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); + if (gDamagedSaveSectors) + DoSaveFailedScreen(0); + if (retVal == SAVE_STATUS_ERROR) + return 1; + else + return 0; +} + +u8 sub_8125DDC(void) // trade.s save +{ + sub_812556C(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); + if (gDamagedSaveSectors) + DoSaveFailedScreen(0); + return 0; +} + +u8 sub_8125E04(void) // trade.s save +{ + WriteSomeFlashByteToPrevSector(ARRAY_COUNT(sSaveBlockChunks), sSaveBlockChunks); + if (gDamagedSaveSectors) + DoSaveFailedScreen(0); + return 0; +} + +u8 sub_8125E2C(void) +{ + if (gFlashMemoryPresent != TRUE) + return 1; + + SaveSerializedGame(); + RestoreSaveBackupVars(sSaveBlockChunks); + sub_812556C(gUnknown_03005EB4 + 1, sSaveBlockChunks); + return 0; +} + +// something to do with multiplayer. Possibly record mizing? +bool8 sub_8125E6C(void) +{ + u8 retVal = FALSE; + u16 val = ++gUnknown_03005EB4; + if (val <= 4) + { + sub_812556C(gUnknown_03005EB4 + 1, sSaveBlockChunks); + WriteSomeFlashByte0x25ToPrevSector(val, sSaveBlockChunks); + } + else + { + WriteSomeFlashByte0x25ToPrevSector(val, sSaveBlockChunks); + retVal = TRUE; + } + if (gDamagedSaveSectors) + DoSaveFailedScreen(1); + return retVal; +} + +u8 Save_LoadGameData(u8 saveType) +{ + u8 result; + + if (gFlashMemoryPresent != TRUE) + { + gSaveFileStatus = SAVE_STATUS_NO_FLASH; + return SAVE_STATUS_ERROR; + } + + switch (saveType) + { + case SAVE_NORMAL: + default: + result = sub_812587C(0xFFFF, sSaveBlockChunks); + LoadSerializedGame(); + gSaveFileStatus = result; + gGameContinueCallback = 0; + break; + case SAVE_HALL_OF_FAME: + result = ReadSomeUnknownSectorAndVerify(HALL_OF_FAME_SECTOR, sHallOfFameChunks[0].data, sHallOfFameChunks[0].size); + if (result == SAVE_STATUS_OK) + result = ReadSomeUnknownSectorAndVerify(HALL_OF_FAME_SECTOR + 1, sHallOfFameChunks[1].data, sHallOfFameChunks[1].size); + break; + } + + return result; +} + +const u8 sUnusedFlashSectors[] = { 30, 31 }; + +bool8 unref_sub_8125F4C(struct UnkSaveSection *a1) +{ + u16 i; + char *raw = (char *)a1; + + for (i = 0; i < sizeof(struct SaveSector); i++) + raw[i] = 0; + + ReadFlash(sUnusedFlashSectors[0], 0, a1->data, 4096); + + if (a1->signature != FILE_SIGNATURE) + return FALSE; + + return TRUE; +} + +u8 unref_sub_8125FA0(void) +{ + u16 i; + u8 status = Save_WriteData(SAVE_NORMAL); + + for (i = 0; i < 2; i++) + EraseFlashSector(sUnusedFlashSectors[i]); + + if (status == SAVE_STATUS_ERROR) + { + return 3; + } + else if (status == 3) + { + return 2; + } + else + { + Save_LoadGameData(SAVE_NORMAL); + return 1; + } +} + +u8 unref_sub_8125FF0(u8 *data, u16 size) +{ + u16 i; + struct UnkSaveSection *section = (struct UnkSaveSection *)eSaveSection; + + for (i = 0; i < sizeof(struct SaveSector); i++) + ((char *)section)[i] = 0; + + section->signature = FILE_SIGNATURE; + + for (i = 0; i < size; i++) + section->data[i] = data[i]; + + gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(sUnusedFlashSectors[0], section, sizeof(struct SaveSector)); + + if (gLastSaveSectorStatus) + return SAVE_STATUS_ERROR; + else + return SAVE_STATUS_OK; +} + +u8 unref_sub_8126068(u8 sector, u8 *data, u32 size) +{ + if (ProgramFlashSectorAndVerify(sector, data)) + return SAVE_STATUS_ERROR; + else + return SAVE_STATUS_OK; +} + +u8 unref_sub_8126080(u8 sector, u8 *data) +{ + ReadFlash(sector, 0, data, sizeof(struct SaveSector)); + return 1; +} diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c new file mode 100644 index 000000000..f57315d09 --- /dev/null +++ b/src/save_failed_screen.c @@ -0,0 +1,320 @@ +#include "global.h" +#include "gba/flash_internal.h" +#include "save_failed_screen.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "save.h" +#include "sprite.h" +#include "starter_choose.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "ewram.h" + +// In English 1.0, the text window is too small, causing text to overflow. + +#ifdef BUGFIX_SAVEFAILEDSCREEN1 +#define MSG_WIN_TOP 10 +#else +#define MSG_WIN_TOP 12 +#endif + +#define CLOCK_WIN_TOP (MSG_WIN_TOP - 4) + +static EWRAM_DATA u16 gSaveFailedType = 0; +static EWRAM_DATA u16 gSaveFailedClockInfo[9] = {0}; + +extern u32 gUnknown_Debug_03004BD0; +extern u32 gDamagedSaveSectors; +extern u32 gGameContinueCallback; + +static const struct OamData sClockOamData = +{ + 160, // Y + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 +}; + +static const u8 sClockFrames[8][3] = +{ + { 1, 0, 0 }, + { 5, 0, 0 }, + { 9, 0, 0 }, + { 5, 0, 1 }, + { 1, 0, 1 }, + { 5, 1, 1 }, + { 9, 1, 0 }, + { 5, 1, 0 }, +}; + +static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal"); +static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz"); + +static void VBlankCB(void); +static void CB2_SaveFailedScreen(void); +static void CB2_WipeSave(void); +static void CB2_GameplayCannotBeContinued(void); +static void CB2_FadeAndReturnToTitleScreen(void); +static void CB2_ReturnToTitleScreen(void); +static void VBlankCB_UpdateClockGraphics(void); +static bool8 IsSectorNonEmpty(u16 sector); +static bool8 WipeSector(u16 sector); +static bool8 WipeSectors(u32 sectorBits); + +void DoSaveFailedScreen(u8 saveType) +{ + SetMainCallback2(CB2_SaveFailedScreen); + gSaveFailedType = saveType; + gSaveFailedClockInfo[0] = FALSE; +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void CB2_SaveFailedScreen(void) +{ + u16 ime; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(0); + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); + LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); + LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); + LZ77UnCompVram(&gSaveFailedClockGfx, (void *)(VRAM + 0x10020)); + ResetSpriteData(); + ResetTasks(); + ResetPaletteFade(); + LoadPalette(&gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); + LoadPalette(&gSaveFailedClockPal, 0x100, sizeof(gSaveFailedClockPal)); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Menu_DrawStdWindowFrame(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); // message window + Menu_PrintText(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(VBlankCB); + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG2_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0; + gMain.state++; + break; + case 1: + if (!UpdatePaletteFade()) + { + SetMainCallback2(CB2_WipeSave); + SetVBlankCallback(VBlankCB_UpdateClockGraphics); + } + break; + } +} + +static void CB2_WipeSave(void) +{ + u8 wipeTries = 0; + + gSaveFailedClockInfo[0] = TRUE; + +#if DEBUG + if (gUnknown_Debug_03004BD0 != 0) + gDamagedSaveSectors = 1; +#endif + + while (gDamagedSaveSectors != 0 && wipeTries < 3) // while there are still attempts left, keep trying to fix the save sectors. + { + if (WipeSectors(gDamagedSaveSectors) != FALSE) + { + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); + SetMainCallback2(CB2_GameplayCannotBeContinued); + return; + } + + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1); + Save_WriteDataInternal(gSaveFailedType); + + if (gDamagedSaveSectors != 0) + { +#ifdef BUGFIX_SAVEFAILEDSCREEN2 + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); +#endif + Menu_PrintText(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1); + } + + wipeTries++; + } + + if (wipeTries == 3) + { + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1); + SetMainCallback2(CB2_FadeAndReturnToTitleScreen); // called again below + } + else + { + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + + // no callback exists, so the game cannot continue. + if (gGameContinueCallback == 0) + Menu_PrintText(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1); + else // callback exists, so continue + Menu_PrintText(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1); + } + + SetMainCallback2(CB2_FadeAndReturnToTitleScreen); +} + +static void CB2_GameplayCannotBeContinued(void) +{ + gSaveFailedClockInfo[0] = FALSE; + + if (gMain.newKeys & A_BUTTON) + { + Menu_DrawStdWindowFrame(1, MSG_WIN_TOP, 28, 19); + Menu_PrintText(gSystemText_GameplayEnded, 2, MSG_WIN_TOP + 1); + SetVBlankCallback(VBlankCB); + SetMainCallback2(CB2_FadeAndReturnToTitleScreen); + } +} + +static void CB2_FadeAndReturnToTitleScreen(void) +{ + gSaveFailedClockInfo[0] = FALSE; + + if (gMain.newKeys & A_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + SetVBlankCallback(VBlankCB); + SetMainCallback2(CB2_ReturnToTitleScreen); + } +} + +static void CB2_ReturnToTitleScreen(void) +{ + if (!UpdatePaletteFade()) + { + if (gGameContinueCallback == 0) // no callback exists, so do a soft reset. + { + DoSoftReset(); + } + else + { + SetMainCallback2((MainCallback)gGameContinueCallback); + gGameContinueCallback = 0; + } + } +} + +static void VBlankCB_UpdateClockGraphics(void) +{ + unsigned int n = (gMain.vblankCounter2 >> 3) & 7; + + gMain.oamBuffer[0] = sClockOamData; + gMain.oamBuffer[0].x = 112; + gMain.oamBuffer[0].y = (CLOCK_WIN_TOP + 1) * 8; + + if (gSaveFailedClockInfo[0] != FALSE) + { + gMain.oamBuffer[0].tileNum = sClockFrames[n][0]; + gMain.oamBuffer[0].matrixNum = (sClockFrames[n][2] << 4) | (sClockFrames[n][1] << 3); + } + else + { + gMain.oamBuffer[0].tileNum = 1; + } + + CpuFastCopy(gMain.oamBuffer, (void *)OAM, 4); + + if (gSaveFailedClockInfo[1]) // maybe was used for debugging? + gSaveFailedClockInfo[1]--; +} + +static bool8 IsSectorNonEmpty(u16 sector) +{ + u32 *ptr = (u32 *)&gSharedMem; + u16 i; + + ReadFlash(sector, 0, ptr, 4096); + +#if DEBUG // Don't verify the sector wipe? + for (i = 0; i < 0x400; i++, ptr++) + ; + return gUnknown_Debug_03004BD0; +#else + for (i = 0; i < 0x400; i++, ptr++) + if (*ptr != 0) + return TRUE; + return FALSE; +#endif +} + +static bool8 WipeSector(u16 sector) +{ + u16 i, j; + bool8 failed = TRUE; + + for (i = 0; failed && i < 130; i++) + { + for (j = 0; j < 0x1000; j++) + ProgramFlashByte(sector, j, 0); + + failed = IsSectorNonEmpty(sector); + } + + return failed; +} + +static bool8 WipeSectors(u32 sectorBits) +{ + u16 i; + + for (i = 0; i < 0x20; i++) + if ((sectorBits & (1 << i)) && !WipeSector(i)) + sectorBits &= ~(1 << i); + + if (sectorBits == 0) + return FALSE; + else + return TRUE; +} diff --git a/src/save_menu_util.c b/src/save_menu_util.c new file mode 100644 index 000000000..ccf4d9f6f --- /dev/null +++ b/src/save_menu_util.c @@ -0,0 +1,148 @@ +#include "global.h" +#include "save_menu_util.h" +#include "event_data.h" +#include "menu.h" +#include "pokedex.h" +#include "region_map.h" +#include "string_util.h" +#include "strings2.h" + +void HandleDrawSaveWindowInfo(s16 left, s16 top) +{ + u32 width = 12; + + // old handle for setting window width? + if (IsResizeSaveWindowEnabled()) + width = 13; + + if (FlagGet(FLAG_SYS_POKEDEX_GET)) + { + // print info + dex information. + Menu_DrawStdWindowFrame(left, top, left + width, top + 11); + PrintSaveMapName(++left, ++top); // MAP NAME + PrintSavePlayerName(left, top + 2); // PLAYER + PrintSaveBadges(left, top + 4); // BADGES + PrintSavePokedexCount(left, top + 6); // POKEDEX + PrintSavePlayTime(left, top + 8); // PLAY TIME + } + else + { + // print everything besides dex. + Menu_DrawStdWindowFrame(left, top, left + width, top + 9); + PrintSaveMapName(++left, ++top); // MAP NAME + PrintSavePlayerName(left, top + 2); // PLAYER + PrintSaveBadges(left, top + 4); // BADGES + PrintSavePlayTime(left, top + 6); // PLAY TIME + } +} + +void HandleCloseSaveWindow(u16 left, u16 top) +{ + u32 width = 12; + + // old handle for setting window width? + if (IsResizeSaveWindowEnabled()) + width = 13; + + if (FlagGet(FLAG_SYS_POKEDEX_GET)) + Menu_EraseWindowRect(left, top, left + width, top + 11); + else + Menu_EraseWindowRect(left, top, left + width, top + 9); +} + +/* +theory: This function was used to handle the save menu window's width being auto sized from +either 12 or 13 in an older source. Whatever was here might have either been optimized out by +GF's compiler or was dummied out to always return a TRUE at some point. +*/ +u8 IsResizeSaveWindowEnabled(void) // i don't know what else to name it.. +{ + return TRUE; +} + +void PrintSavePlayerName(s16 x, s16 y) +{ + Menu_PrintText(gOtherText_Player, x, y); + MenuPrint_RightAligned(gSaveBlock2.playerName, x + 12, y); +} + +void PrintSaveMapName(s16 x, s16 y) +{ + char name[32]; + + CopyMapName(name, gMapHeader.regionMapSectionId); + Menu_PrintText(name, x, y); +} + +void PrintSaveBadges(s16 x, s16 y) +{ + char badges[16]; + + Menu_PrintText(gOtherText_Badges, x, y); + ConvertIntToDecimalString(badges, GetBadgeCount()); + MenuPrint_RightAligned(badges, x + 12, y); +} + +void PrintSavePokedexCount(s16 x, s16 y) +{ + char pokedex[16]; + + Menu_PrintText(gOtherText_Pokedex, x, y); + ConvertIntToDecimalStringN(pokedex, GetPokedexSeenCount(), 1, 3); + MenuPrint_RightAligned(pokedex, x + 12, y); +} + +void PrintSavePlayTime(s16 x, s16 y) +{ + char playtime[16]; + + Menu_PrintText(gOtherText_PlayTime, x, y); + FormatPlayTime(playtime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); + MenuPrint_RightAligned(playtime, x + 12, y); +} + +u8 GetBadgeCount(void) +{ + u8 badgeCount = 0; + int badgeFlag; + + for (badgeFlag = FLAG_BADGE01_GET; badgeFlag <= FLAG_BADGE08_GET; badgeFlag++) + if (FlagGet(badgeFlag)) + badgeCount++; + + return badgeCount; +} + +u16 GetPokedexSeenCount() +{ + u16 pokedexSeenCount; + + if (IsNationalPokedexEnabled()) + pokedexSeenCount = GetNationalPokedexCount(1); + else + pokedexSeenCount = GetHoennPokedexCount(1); + + return pokedexSeenCount; +} + +void FormatPlayTime(char *playtime, u16 hours, u16 minutes, u16 colon) +{ + s16 _colon = colon; + playtime = ConvertIntToDecimalString(playtime, hours); + + // playtime[0] is hours. + // playtime[1] is the character to render between hours and minutes. + // playtime[2] is minutes. + + playtime[0] = 0; + + if (_colon) + playtime[1] = 0xF0; // set middle character to ":" + else + playtime[1] = 0; + + playtime[2] = 0; + playtime += 3; + + ConvertIntToDecimalStringN(playtime, minutes, 2, 2); +} diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c deleted file mode 100644 index bf634a49f..000000000 --- a/src/scene/berry_blender.c +++ /dev/null @@ -1,3560 +0,0 @@ -#include "global.h" -#include "decompress.h" -#include "palette.h" -#include "event_data.h" -#include "main.h" -#include "text_window.h" -#include "menu.h" -#include "strings2.h" -#include "sound.h" -#include "constants/songs.h" -#include "berry.h" -#include "string_util.h" -#include "link.h" -#include "task.h" -#include "overworld.h" -#include "item.h" -#include "constants/items.h" -#include "random.h" -#include "save.h" -#include "menu_cursor.h" -#include "trig.h" -#include "pokeblock.h" -#include "ewram.h" - -//needed to match Blender_ControlHitPitch -struct MusicPlayerInfo -{ - struct SongHeader *songHeader; - u32 status; - u8 trackCount; - u8 priority; - u8 cmd; - u8 unk_B; - u32 clock; - u8 gap[8]; - u8 *memAccArea; - u16 tempoD; - u16 tempoU; - u16 tempoI; - u16 tempoC; - u16 fadeOI; - u16 fadeOC; - u16 fadeOV; - struct MusicPlayerTrack *tracks; - struct ToneData *tone; - u32 ident; - u32 func; - u32 intp; -}; - -#define BLENDER_SCORE_BEST 0 -#define BLENDER_SCORE_GOOD 1 -#define BLENDER_SCORE_MISS 2 - -#define BLENDER_MAX_PLAYERS 4 -#define BLENDER_SCORES_NO 3 - -#define FLAVOUR_SPICY 0 -#define FLAVOUR_DRY 1 -#define FLAVOUR_SWEET 2 -#define FLAVOUR_BITTER 3 -#define FLAVOUR_SOUR 4 - -struct BlenderBerry -{ - u16 itemID; - u8 name[7]; - u8 flavours[5]; - u8 smoothness; -}; - -struct BerryBlenderData -{ - u8 field_0; - u8 field_1; - struct Window field_4; - u8 field_35; - u8 field_36; - u8 field_37; - u8 field_38; - u8 field_39; - u8 field_3A; - u8 field_3B; - u8 field_3C; - u8 field_3D; - u8 field_3E; - u8 field_3F; - u8 field_40; - u8 field_41; - u8 field_42; - u8 field_43; - u8 field_44; - u8 field_45; - u8 field_46; - u8 field_47; - u8 field_48; - u8 field_49; - u8 field_4A; - u8 field_4B; - u8 field_4C; - u8 field_4D; - u16 field_4E; - u8 scoreIconIDs[3]; - u16 arrowPos; - s16 field_56; - s16 field_58; - u16 max_RPM; - u8 SyncArrowSpriteID[BLENDER_MAX_PLAYERS]; - u8 SyncArrowSprite2ID[BLENDER_MAX_PLAYERS]; - u8 field_64; - u8 field_65; - u8 field_66; - u8 field_67; - u8 field_68; - u8 field_69; - u8 field_6A; - u8 field_6B; - u8 field_6C; - u8 field_6D; - u8 field_6E; - u8 field_6F; - u16 field_70[BLENDER_MAX_PLAYERS]; - u16 field_78; - u16 field_7A; - u16 field_7C; - u8 field_7E; - u8 field_7F; - u16 chosenItemID[BLENDER_MAX_PLAYERS]; - u8 playersNo; - u8 field_89; - u8 field_8A; - u8 field_8B; - u8 field_8C; - u8 field_8D; - u8 field_8E; - u8 field_8F; - u8 field_90; - u8 field_91; - u8 field_92; - u8 field_93; - u16 field_94; - u8 field_96; - u8 field_97; - u8 field_98; - u8 field_99; - u16 field_9A[BLENDER_MAX_PLAYERS]; - u16 field_A2[BLENDER_MAX_PLAYERS]; - u8 field_AA; - u8 stringVar[129]; - u32 gameFrameTime; - s32 framesToWait; - u32 field_134; - u8 field_138; - u8 field_139; - u8 field_13A; - u8 field_13B; - u8 field_13C; - u8 field_13D; - u16 field_13E; - u16 field_140; - u16 field_142; - s16 field_144; - s16 field_146; - u8 field_148[3]; - u8 field_14B; - u16 scores[BLENDER_MAX_PLAYERS][3]; - u8 playerPlaces[BLENDER_MAX_PLAYERS]; - struct BgAffineDstData field_168; - u16 field_178; - struct BlenderBerry blendedBerries[BLENDER_MAX_PLAYERS]; - u32 field_1BC; - u16 field_1C0; - u16 field_1C2; - u32 field_1C4; -}; - -struct BlenderDebug -{ - s8 cursorPos; - s8 berries[4]; - struct Pokeblock pokeblock; - u8 field_10; - u8 spicy; - u8 dry; - u8 sweet; - u8 bitter; - u8 sour; - u8 feel; - s8 field_17; - s8 field_18; - s8 field_19; - s16 BPM; -}; - -// other files functions -void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch); -void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo); -void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); -void sub_80A6978(void); -u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate); -void MenuCursor_SetPos814A880(u8 a1, u8 a2); -u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); -s8 GetFirstFreePokeblockSlot(void); -#ifdef GERMAN -extern void de_sub_8073110(); -#endif - -extern struct MusicPlayerInfo gMPlay_SE2; -extern struct MusicPlayerInfo gMPlay_BGM; -extern u16 gSpecialVar_ItemId; -extern u8 gUnknown_020297ED; -extern u8 byte_3002A68; - -extern const u8 gUnknown_08E6C100[]; -extern const u8 gUnknown_08E6C920[]; -extern const u8 gUnknown_08E6D354[]; -extern const struct WindowTemplate gWindowTemplate_81E6F68; -extern const u8 *const gPokeblockNames[]; -extern const struct Berry gBerries[]; - -extern const u8 gBerryBlenderArrowTiles[]; -extern const u8 gBerryBlenderMarubatsuTiles[]; -extern const u8 gBerryBlenderParticlesTiles[]; -extern const u8 gBerryBlenderCountdownNumbersTiles[]; -extern const u8 gBerryBlenderStartTiles[]; -extern const u16 gBerryBlenderMiscPalette[]; -extern const u16 gBerryBlenderArrowPalette[]; - -// ewram -static EWRAM_DATA u8 gUnknown_020297DC = 0; -static EWRAM_DATA u32 gUnknown_020297E0 = 0; -static EWRAM_DATA u32 gUnknown_020297E4 = 0; -static EWRAM_DATA u8 gUnknown_020297E8 = 0; - -// iwram common -u16 gUnknown_03004830; -u8 gInGameOpponentsNo; -u16 gUnknown_03004840[10]; -struct BerryBlenderData* gBerryBlenderData; - -// iwram bss -IWRAM_DATA s16 gUnknown_03000510[8]; -IWRAM_DATA s16 gUnknown_03000520[6]; -IWRAM_DATA s16 gUnknown_0300052C; -IWRAM_DATA s16 gUnknown_0300052E; -IWRAM_DATA s32 gUnknown_03000530[6]; -IWRAM_DATA s32 gUnknown_03000548[5]; -IWRAM_DATA u32 gUnknown_0300055C; -IWRAM_DATA struct BlenderDebug sBlenderDebug; - -// this file's functions -void Blender_SetBankBerryData(u8 bank, u16 itemID); - -static void sub_80514A4(void); -static void sub_80514F0(void); -static void sub_804E56C(void); -static void Blender_SetPlayerNamesLocal(u8 NoOfOpponents); -static void sub_8051474(void); -static void sub_804E9F8(void); -static void sub_804F378(void); -static void sub_8051414(struct BgAffineDstData *dest); -static void sub_804F238(void); -static void sub_80501FC(void); -static bool8 sub_8051B8C(void); -static void sub_804F2A8(void); -static void sub_804F81C(void); -static void sub_805156C(void); -void sub_8051684(struct Sprite* sprite); -static void sub_8051AC8(s16* a0, u16 a1); -static void sub_805194C(u16 a0, u16 a1); -static void sub_8051A3C(u16 a0); -static void sub_8051B18(void); -static void sub_805123C(void); -static void sub_8050954(void); -static bool8 Blender_PrintBlendingRanking(void); -bool8 Blender_PrintBlendingResults(void); -static void sub_80510E8(void); -static void sub_8050E30(void); -static void sub_805197C(u16 a0, u16 a1); -static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst); -static void sub_8052BD0(u8 taskID); -static void sub_8052AF8(void); -static void sub_804F8C8(u8 taskID); -static void sub_804F9F4(u8 taskID); -static void sub_804FB1C(u8 taskID); -static void sub_8051C04(struct Sprite* sprite); -static void sub_8051650(struct Sprite* sprite); -static void sub_805181C(struct Sprite* sprite); -static void sub_80518CC(struct Sprite* sprite); - -// const data -static const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal"); -static const u8 sBlenderCenterMap[] = INCBIN_U8("graphics/berry_blender/center_map.bin"); -static const u16 sBlenderOuterPal[] = INCBIN_U16("graphics/berry_blender/outer.gbapal"); - -// unreferenced pals? -static const u16 sUnknownPal_0[] = INCBIN_U16("graphics/unused/unknown/821604C.gbapal"); -static const u16 sUnknownArray_1[224] = {0}; - -// unreferenced Japanese strings -static const u8 sUnknownJpnString0[] = _("▶"); -static const u8 sUnknownJpnString1[] = _(" "); -static const u8 sUnknownJpnString2[] = _("カッコイ"); // "cool" (missing an イ at the end) -static const u8 sUnknownJpnString3[] = _("カワイイ"); // "cute" -static const u8 sUnknownJpnString4[] = _("ウツクシ"); // "beautiful" (missing an イ at the end) -static const u8 sUnknownJpnString5[] = _("カシコイ"); // "smart" -static const u8 sUnknownJpnString6[] = _("タクマシ"); // "tough" (missing an イ at the end) - -static const u8 gUnknown_08216249[] = _("\p"); - -// unreferenced; These appear to be the first names of four people who worked on the game. -static const u8 sUnknownJpnString7[10] = _("てつじ"); // Tetsuji (Ohta) -static const u8 sUnknownJpnString8[10] = _("あきと"); // Akito (Mori) -static const u8 sUnknownJpnString9[10] = _("シゲル"); // Shigeru (Ohmori) -static const u8 sUnknownJpnString10[10] = _("ヨシノリ"); // Yoshinori (Matsuda) - -static const u8 sUnknownText_2Pok[] = _("2Pok"); -static const u8 sUnknownText_3Pok[] = _("3Pok"); -static const u8 sUnknownText_4Pok[] = _("4Pok"); -static const u8* const gUnknown_08216284[] = -{ - sUnknownText_2Pok, sUnknownText_3Pok, sUnknownText_4Pok -}; - -// unreferenced player strings -static const u8 sUnknown1PString[4] = _("1P"); -static const u8 sUnknown2PString[4] = _("2P"); -static const u8 sUnknown3PString[4] = _("3P"); -static const u8 sUnknown4PString[4] = _("4P"); - -#ifdef ENGLISH -static const u8 sBlenderOpponentName1[] = _("MISTER"); -static const u8 sBlenderOpponentName2[] = _("LADDIE"); -static const u8 sBlenderOpponentName3[] = _("LASSIE"); -#else // GERMAN -static const u8 sBlenderOpponentName1[] = _("OPI"); -static const u8 sBlenderOpponentName2[] = _("KUMPEL"); -static const u8 sBlenderOpponentName3[] = _("TUSSI"); -#endif // ENGLISH -static const u8* const sBlenderOpponentsNames[] = -{ - sBlenderOpponentName1, sBlenderOpponentName2, sBlenderOpponentName3 -}; - -static const u8 sRedColorString[] = _("{COLOR RED}"); -static const u8 sNewLineString_0[] = _("\n"); -static const u8 sSpaceString_0[] = _(" "); - -static const s8 gUnknown_082162CC[][2] = -{ - {-1, -1}, {1, -1}, {-1, 1}, {1, 1} -}; - -static const u8 gUnknown_082162D4[][2] = -{ - {2, 6}, {23, 6}, {2, 12}, {23, 12}, {1, 6}, {22, 6}, {1, 12}, {22, 12} -}; - -static const u8 sBlenderSyncArrowsPos[][2] = -{ - {72, 32}, {168, 32}, {72, 128}, {168, 128} -}; - -static const u8 gUnknown_082162EC[3][4] = -{ - {-1, 0, 1, -1}, {-1, 0, 1, 2}, {0, 1, 2, 3} -}; - -static const u16 gUnknown_082162F8[] = {0, 0xC000, 0x4000, 0x8000}; -static const u8 gUnknown_08216300[] = {1, 1, 0}; -static const u8 gUnknown_08216303[] = {32, 224, 96, 160, 0}; - -static const TaskFunc gUnknown_08216308[] = -{ - sub_804F8C8, sub_804F9F4, sub_804FB1C -}; - -static const struct OamData sOamData_8216314 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_821631C[] = -{ - ANIMCMD_FRAME(16, 5, 1, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216324[] = -{ - ANIMCMD_FRAME(16, 5, .vFlip = TRUE), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_821632C[] = -{ - ANIMCMD_FRAME(16, 5, .hFlip = TRUE), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216334[] = -{ - ANIMCMD_FRAME(16, 5, 0, 0), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_821633C[] = -{ - ANIMCMD_FRAME(48, 2, 1, 1), - ANIMCMD_FRAME(32, 5, 1, 1), - ANIMCMD_FRAME(48, 3, 1, 1), - ANIMCMD_FRAME(16, 5, 1, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216350[] = -{ - ANIMCMD_FRAME(48, 2, .vFlip = TRUE), - ANIMCMD_FRAME(32, 5, .vFlip = TRUE), - ANIMCMD_FRAME(48, 3, .vFlip = TRUE), - ANIMCMD_FRAME(16, 5, .vFlip = TRUE), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216364[] = -{ - ANIMCMD_FRAME(48, 2, .hFlip = TRUE), - ANIMCMD_FRAME(32, 5, .hFlip = TRUE), - ANIMCMD_FRAME(48, 3, .hFlip = TRUE), - ANIMCMD_FRAME(16, 5, .hFlip = TRUE), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216378[] = -{ - ANIMCMD_FRAME(48, 2, 0, 0), - ANIMCMD_FRAME(32, 5, 0, 0), - ANIMCMD_FRAME(48, 3, 0, 0), - ANIMCMD_FRAME(16, 5, 0, 0), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_821638C[] = -{ - ANIMCMD_FRAME(0, 5, 1, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216394[] = -{ - ANIMCMD_FRAME(0, 5, .vFlip = TRUE), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_821639C[] = -{ - ANIMCMD_FRAME(0, 5, .hFlip = TRUE), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_82163A4[] = -{ - ANIMCMD_FRAME(0, 5, 0, 0), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_82163AC[] = -{ - sSpriteAnim_821631C, - sSpriteAnim_8216324, - sSpriteAnim_821632C, - sSpriteAnim_8216334, - sSpriteAnim_821633C, - sSpriteAnim_8216350, - sSpriteAnim_8216364, - sSpriteAnim_8216378, - sSpriteAnim_821638C, - sSpriteAnim_8216394, - sSpriteAnim_821639C, - sSpriteAnim_82163A4 -}; - -static const struct SpriteSheet gUnknown_082163DC = -{ - gBerryBlenderArrowTiles, 0x800, 46545 -}; - -static const struct SpritePalette gUnknown_082163E4 = -{ - gBerryBlenderMiscPalette, 46546 -}; - -static const struct SpritePalette gUnknown_082163EC = -{ - gBerryBlenderArrowPalette, 12312 -}; - -static const struct SpriteTemplate sBlenderSyncArrow_SpriteTemplate = -{ - .tileTag = 46545, - .paletteTag = 12312, - .oam = &sOamData_8216314, - .anims = sSpriteAnimTable_82163AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8051C04 -}; - -static const struct OamData sOamData_821640C = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_8216414[] = -{ - ANIMCMD_FRAME(0, 20), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_821641C[] = -{ - ANIMCMD_FRAME(4, 20, 1, 0), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216424[] = -{ - ANIMCMD_FRAME(8, 4), - ANIMCMD_FRAME(12, 4), - ANIMCMD_FRAME(8, 4), - ANIMCMD_FRAME(12, 4), - ANIMCMD_FRAME(8, 4), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_821643C[] = -{ - ANIMCMD_FRAME(8, 4), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_8216444[] = -{ - sSpriteAnim_8216414, - sSpriteAnim_821641C, - sSpriteAnim_8216424, - sSpriteAnim_821643C, -}; - -static const struct SpriteSheet gUnknown_08216454 = -{ - gBerryBlenderMarubatsuTiles, 0x200, 48888 -}; - -static const struct SpriteTemplate sSpriteTemplate_821645C = -{ - .tileTag = 48888, - .paletteTag = 46546, - .oam = &sOamData_821640C, - .anims = sSpriteAnimTable_8216444, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8051650 -}; - -static const struct OamData sOamData_8216474 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_821647C[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(3, 5), - ANIMCMD_FRAME(1, 4), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216494[] = -{ - ANIMCMD_FRAME(0, 3), - ANIMCMD_FRAME(2, 4), - ANIMCMD_FRAME(4, 5), - ANIMCMD_FRAME(2, 4), - ANIMCMD_FRAME(0, 3), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_82164AC[] = -{ - ANIMCMD_FRAME(0, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(2, 2), - ANIMCMD_FRAME(4, 4), - ANIMCMD_FRAME(3, 3), - ANIMCMD_FRAME(2, 2), - ANIMCMD_FRAME(1, 2), - ANIMCMD_FRAME(0, 2), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_82164D0[] = -{ - ANIMCMD_FRAME(5, 5, 1, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_82164D8[] = -{ - ANIMCMD_FRAME(6, 5, 1, 1), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_82164E0[] = -{ - sSpriteAnim_821647C, - sSpriteAnim_8216494, - sSpriteAnim_82164AC, - sSpriteAnim_82164D0, - sSpriteAnim_82164D8, -}; - -static const struct SpriteSheet gUnknown_082164F4 = -{ - gBerryBlenderParticlesTiles, 0xE0, 23456 -}; - -static const struct SpriteTemplate sSpriteTemplate_82164FC = -{ - .tileTag = 23456, - .paletteTag = 46546, - .oam = &sOamData_8216474, - .anims = sSpriteAnimTable_82164E0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct OamData sOamData_8216514 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_821651C[] = -{ - ANIMCMD_FRAME(32, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_8216524[] = -{ - ANIMCMD_FRAME(16, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_821652C[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_8216534[] = -{ - sSpriteAnim_821651C, - sSpriteAnim_8216524, - sSpriteAnim_821652C, -}; - -static const struct SpriteSheet gUnknown_08216540 = -{ - gBerryBlenderCountdownNumbersTiles, 0x600, 12345 -}; - -static const struct SpriteTemplate sSpriteTemplate_8216548 = -{ - .tileTag = 12345, - .paletteTag = 46546, - .oam = &sOamData_8216514, - .anims = sSpriteAnimTable_8216534, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_805181C -}; - -static const struct OamData sOamData_8216560 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_8216568[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_8216570[] = -{ - sSpriteAnim_8216568, -}; - -static const struct SpriteSheet gUnknown_08216574 = -{ - gBerryBlenderStartTiles, 0x400, 12346 -}; - -static const struct SpriteTemplate sSpriteTemplate_821657C = -{ - .tileTag = 12346, - .paletteTag = 46546, - .oam = &sOamData_8216560, - .anims = sSpriteAnimTable_8216570, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80518CC -}; - -static const s16 gUnknown_08216594[][5] = -{ - {-10, 20, 10, 2, 1}, - {250, 20, 10, -2, 1}, - {-10, 140, 10, 2, -1}, - {250, 140, 10, -2, -1}, -}; - -static const u8 gUnknown_082165BC[][3] = -{ - {4, 3, 2}, {0, 4, 3}, {1, 0, 4}, {2, 1, 0}, {3, 2, 1}, {0, 2, 3}, {1, 3, 4}, {2, 4, 0}, {3, 0, 1}, {4, 1, 2}, -}; - -static const u8 gUnknown_082165DA[] = {1, 1, 2, 3, 4}; -static const u8 gUnknown_082165DF[] = {0x1C, 0x16, 0x13, 0x1A, 0x19, 0x0E, 0x0D, 0x0B, 0x07, 0x15}; -static const u8 gUnknown_082165E9[] = {6, 6, 6, 6, 5}; -static const u8 gUnknown_082165EE[] = {3, 3, 3, 2, 2}; -static const u8 gUnknown_082165F3[] = {3, 3, 3, 3, 2}; - -static const u8 sText_Space[] = _(" "); -static const u8 sText_BPM[] = _("BPM"); -static const u8 sText_Dash[] = _("-"); -static const u8 sNewLineString_1[] = _("\n"); -static const u8 sNewLineString_2[] = _("\n"); - -static void Blender_ControlHitPitch(void) -{ - m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, (gBerryBlenderData->field_56 - 128) * 2); -} - -static void VBlankCB0_BerryBlender(void) -{ - sub_80514A4(); - sub_80514F0(); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void VBlankCB1_BerryBlender(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static bool8 sub_804E2EC(void) -{ - switch (gBerryBlenderData->field_1) - { - case 0: - LZDecompressWram(gUnknown_08E6C100, ewram10000); - gBerryBlenderData->field_1++; - break; - case 1: - DmaCopy16Defvars(3, sBlenderCenterMap, (void *)(VRAM + 0x4000), 0x400); - LoadPalette(sBlenderCenterPal, 0, 0x100); - gBerryBlenderData->field_1++; - break; - case 2: - DmaCopyLarge16(3, ewram10000, (void *)(VRAM + 0x0), 0x2000, 0x1000); - gBerryBlenderData->field_1++; - break; - case 3: - LZDecompressWram(gUnknown_08E6C920, ewram10000); - gBerryBlenderData->field_1++; - break; - case 4: - LZDecompressWram(gUnknown_08E6D354, ewram13000); - gBerryBlenderData->field_1++; - break; - case 5: - DmaCopy16Defvars(3, ewram10000, (void *)(VRAM + 0xE000), 0x1000); - gBerryBlenderData->field_1++; - break; - case 6: - DmaCopy16Defvars(3, ewram11000, (void *)(VRAM + 0xF000), 0x1000); - gBerryBlenderData->field_1++; - break; - case 7: - { - u16 i; - u16* palStore = (u16*)(ewram13000); - - for (i = 0; i < 640; i++) - { - *(palStore + i) |= 0x100; - } - DmaCopy16Defvars(3, ewram13000, (void *)(VRAM + 0x6000), 0x500); - LoadPalette(sBlenderOuterPal, 0x80, 0x20); - gBerryBlenderData->field_1++; - } - break; - case 8: - LoadSpriteSheet(&gUnknown_082163DC); - LoadSpriteSheet(&gUnknown_082164F4); - LoadSpriteSheet(&gUnknown_08216454); - gBerryBlenderData->field_1++; - break; - case 9: - LoadSpriteSheet(&gUnknown_08216540); - LoadSpriteSheet(&gUnknown_08216574); - LoadSpritePalette(&gUnknown_082163EC); - LoadSpritePalette(&gUnknown_082163E4); - gBerryBlenderData->field_1 = 0; - return TRUE; - } - return FALSE; -} - -static void sub_804E4FC(void) -{ - REG_DISPCNT = 0x1341; - REG_BG2CNT = 0x4880; - REG_BG1CNT = 0xC0D; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; -} - -void DoBerryBlending(void) -{ - u8* field6F; //this temp value is needed to match - - gBerryBlenderData = eBerryBlenderData; - - field6F = &gBerryBlenderData->field_6F; - gBerryBlenderData->field_0 = 0; - *field6F = 0; - - Blender_SetPlayerNamesLocal(gSpecialVar_0x8004); - SetMainCallback2(sub_804E56C); -} - -static void sub_804E56C(void) -{ - s32 i; - switch (gBerryBlenderData->field_0) - { - case 0: - REG_DISPCNT = 0; - ResetSpriteData(); - FreeAllSpritePalettes(); - SetVBlankCallback(NULL); - Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); - InitMenuWindow(&gWindowTemplate_81E6F68); - gBerryBlenderData->field_0++; - gBerryBlenderData->field_140 = 0; - gBerryBlenderData->field_13E = 0; - gBerryBlenderData->field_142 = 0x50; - gBerryBlenderData->field_144 = 0; - gBerryBlenderData->field_146 = 0; - gBerryBlenderData->field_1 = 0; - sub_8051474(); - break; - case 1: - if (sub_804E2EC()) - { - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - gBerryBlenderData->SyncArrowSpriteID[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); - StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSpriteID[i]], i + 8); - } - SetVBlankCallback(VBlankCB0_BerryBlender); - gBerryBlenderData->field_0++; - } - break; - case 2: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - sub_8051474(); - gBerryBlenderData->field_0++; - break; - case 3: - sub_804E4FC(); - if (!gPaletteFade.active) - { - gBerryBlenderData->field_0++; - } - break; - case 4: - Menu_DrawStdWindowFrame(0, 14, 29, 19); - MenuPrintMessage(gOtherText_BlenderChooseBerry, 1, 15); - gBerryBlenderData->field_0++; - break; - case 5: - if (Menu_UpdateWindowText()) - { - gBerryBlenderData->field_0++; - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - } - break; - case 6: - if (!gPaletteFade.active) - { - sub_80A6978(); - gBerryBlenderData->field_0 = 0; - } - break; - } - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_804E738(struct Sprite* sprite) -{ - sprite->data[1] += sprite->data[6]; - sprite->data[2] -= sprite->data[4]; - sprite->data[2] += sprite->data[7]; - sprite->data[0] += sprite->data[7]; - sprite->data[4]--; - - if (sprite->data[0] < sprite->data[2]) - { - sprite->data[3] = sprite->data[4] = sprite->data[3] - 1; - if (++sprite->data[5] > 3) - DestroySprite(sprite); - else - PlaySE(SE_TB_KARA); - } - sprite->pos1.x = sprite->data[1]; - sprite->pos1.y = sprite->data[2]; -} - -void sub_804E794(struct Sprite* sprite, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6) -{ - sprite->data[0] = a3; - sprite->data[1] = a2; - sprite->data[2] = a3; - sprite->data[3] = a4; - sprite->data[4] = 10; - sprite->data[5] = 0; - sprite->data[6] = a5; - sprite->data[7] = a6; - sprite->callback = sub_804E738; -} - -static void sub_804E7C0(u16 a0, u8 a1) -{ - u8 spriteID = sub_80A7DEC(a0 + 123, 0, 80, a1 & 1); - sub_804E794(&gSprites[spriteID], gUnknown_08216594[a1][0], gUnknown_08216594[a1][1], gUnknown_08216594[a1][2], gUnknown_08216594[a1][3], gUnknown_08216594[a1][4]); -} - -static void Blender_CopyBerryData(struct BlenderBerry* berry, u16 itemID) -{ - const struct Berry *berryInfo = GetBerryInfo(itemID + 124); - berry->itemID = itemID; - StringCopy(berry->name, berryInfo->name); - berry->flavours[FLAVOUR_SPICY] = berryInfo->spicy; - berry->flavours[FLAVOUR_DRY] = berryInfo->dry; - berry->flavours[FLAVOUR_SWEET] = berryInfo->sweet; - berry->flavours[FLAVOUR_BITTER] = berryInfo->bitter; - berry->flavours[FLAVOUR_SOUR] = berryInfo->sour; - berry->smoothness = berryInfo->smoothness; -} - -static void Blender_SetPlayerNamesLocal(u8 NoOfOpponents) -{ - int i; - if (NoOfOpponents) - { - for (i = 0; i < 4; i++) - gLinkPlayers[i].language = GAME_LANGUAGE; - } - switch (NoOfOpponents) - { - case 0: - gInGameOpponentsNo = 0; - break; - case 1: - gInGameOpponentsNo = 1; - gBerryBlenderData->playersNo = 2; - StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); - StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[0]); - break; - case 2: - gInGameOpponentsNo = 2; - gBerryBlenderData->playersNo = 3; - StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); - StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[0]); - StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[1]); - break; - case 3: - gInGameOpponentsNo = 3; - gBerryBlenderData->playersNo = 4; - StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); - StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[0]); - StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[1]); - StringCopy(gLinkPlayers[3].name, sBlenderOpponentsNames[2]); - break; - } -} - -void sub_804E990(void) -{ - s32 i; - - REG_DISPCNT = 0; - gBerryBlenderData = eBerryBlenderData; - gBerryBlenderData->field_0 = 0; - gBerryBlenderData->field_134 = 0; - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - gBerryBlenderData->chosenItemID[i] = 0; - } - Blender_SetPlayerNamesLocal(gSpecialVar_0x8004); - if (gSpecialVar_0x8004 == 0) - SetMainCallback2(sub_804E9F8); - else - SetMainCallback2(sub_804F378); -} - -static void sub_804E9F8(void) -{ - int i, j; - switch (gBerryBlenderData->field_0) - { - case 0: - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - SetVBlankCallback(VBlankCB0_BerryBlender); - Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); - InitMenuWindow(&gWindowTemplate_81E6F68); - gLinkType = 0x4422; - gBerryBlenderData->field_0++; - gBerryBlenderData->field_4E = 0; - gBerryBlenderData->field_7E = 0; - gBerryBlenderData->field_144 = 0; - gBerryBlenderData->field_146 = 0; - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - gBerryBlenderData->field_70[i] = 0; - for (j = 0; j < 3; j++) - { - gBerryBlenderData->scores[i][j] = 0; - } - } - gBerryBlenderData->field_7C = 0; - gBerryBlenderData->field_56 = 0; - gBerryBlenderData->arrowPos = 0; - gBerryBlenderData->max_RPM = 0; - gBerryBlenderData->field_1 = 0; - break; - case 1: - if (sub_804E2EC()) - { - gBerryBlenderData->field_0++; - sub_8051474(); - } - break; - case 2: - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - gBerryBlenderData->SyncArrowSprite2ID[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); - StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSprite2ID[i]], i + 8); - } - gBerryBlenderData->field_0++; - break; - case 3: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gBerryBlenderData->field_0++; - break; - case 4: - sub_804E4FC(); - if (!gPaletteFade.active) - { - gBerryBlenderData->field_0++; - } - break; - case 5: - Menu_DrawStdWindowFrame(0, 13, 29, 19); - Menu_PrintText(gOtherText_LinkStandby3, 1, 14); - gBerryBlenderData->field_0 = 8; - gBerryBlenderData->framesToWait = 0; - break; - case 8: - gBerryBlenderData->field_0++; - gBerryBlenderData->field_13C = 0; - Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); - memcpy(gBlockSendBuffer, &gBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry)); - sub_80084A4(); - gBerryBlenderData->framesToWait = 0; - break; - case 9: - if (IsLinkTaskFinished()) - { - ResetBlockReceivedFlags(); - if (GetMultiplayerId() == 0) - sub_8007E9C(4); - gBerryBlenderData->field_0++; - } - break; - case 10: - if (++gBerryBlenderData->framesToWait > 20) - { - Menu_EraseScreen(); - if (GetBlockReceivedStatus() == sub_8008198()) - { - for (i = 0; i < GetLinkPlayerCount(); i++) - { - memcpy(&gBerryBlenderData->blendedBerries[i], &gBlockRecvBuffer[i][0], sizeof(struct BlenderBerry)); - gBerryBlenderData->chosenItemID[i] = gBerryBlenderData->blendedBerries[i].itemID; - } - ResetBlockReceivedFlags(); - gBerryBlenderData->field_0++; - } - } - break; - case 11: - gBerryBlenderData->playersNo = GetLinkPlayerCount(); - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - if (gBerryBlenderData->field_13C == gUnknown_082162EC[gBerryBlenderData->playersNo - 2][i]) - { - sub_804E7C0(gBerryBlenderData->chosenItemID[gBerryBlenderData->field_13C], i); - break; - } - } - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - gBerryBlenderData->field_13C++; - break; - case 12: - if (++gBerryBlenderData->framesToWait > 60) - { - if (gBerryBlenderData->field_13C >= gBerryBlenderData->playersNo) - { - gBerryBlenderData->field_0++; - gBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[gBerryBlenderData->playersNo - 2]] - 22528; - } - else - gBerryBlenderData->field_0--; - gBerryBlenderData->framesToWait = 0; - } - break; - case 13: - if (IsLinkTaskFinished()) - { - gBerryBlenderData->field_0++; - sub_8051414(&gBerryBlenderData->field_168); - } - break; - case 14: - REG_DISPCNT |= 0x400; - gBerryBlenderData->arrowPos += 0x200; - gBerryBlenderData->field_142 += 4; - if (gBerryBlenderData->field_142 > 255) - { - gBerryBlenderData->field_0++; - gBerryBlenderData->field_142 = 256; - gBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[gBerryBlenderData->playersNo - 2]]; - REG_BG2CNT = 0x4882; - gBerryBlenderData->framesToWait = 0; - sub_804F238(); - sub_804F2A8(); - } - sub_8051414(&gBerryBlenderData->field_168); - break; - case 15: - if (sub_8051B8C()) - { - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - } - sub_8051414(&gBerryBlenderData->field_168); - break; - case 16: - CreateSprite(&sSpriteTemplate_8216548, 120, -16, 3); - gBerryBlenderData->field_0++; - break; - case 18: - gBerryBlenderData->field_0++; - break; - case 19: - sub_80084A4(); - gBerryBlenderData->field_0++; - break; - case 20: - if (IsLinkTaskFinished()) - { - sub_8007E24(); - gBerryBlenderData->field_0++; - } - break; - case 21: - gBerryBlenderData->field_56 = 128; - gBerryBlenderData->gameFrameTime = 0; - SetMainCallback2(sub_80501FC); - if (GetCurrentMapMusic() != 403) - { - gBerryBlenderData->field_178 = GetCurrentMapMusic(); - } - PlayBGM(BGM_CYCLING); - break; - case 100: - Menu_DrawStdWindowFrame(0, 13, 29, 19); - MenuPrintMessage(gOtherText_LinkNotFound, 1, 15); - gBerryBlenderData->field_0++; - break; - case 101: - if (Menu_UpdateWindowText()) - gBerryBlenderData->field_0++; - break; - case 102: - if (!gPaletteFade.active) - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - break; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_804F0F4(void) -{ - REG_DISPCNT = 0; - - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - - SetVBlankCallback(VBlankCB0_BerryBlender); - - Text_LoadWindowTemplate(&gWindowTemplate_81E6F68); - InitMenuWindow(&gWindowTemplate_81E6F68); - - gLinkType = 0x4422; - - gBerryBlenderData->field_4E = 0; - gBerryBlenderData->field_56 = 0; - gBerryBlenderData->arrowPos = 0; - gBerryBlenderData->max_RPM = 0; - gBerryBlenderData->field_144 = 0; - gBerryBlenderData->field_146 = 0; - gBerryBlenderData->field_0++; -} - -static u8 sub_804F16C(u16 arrowPos, u8 a1) -{ - u32 var1 = (arrowPos / 256) + 24; - u8 arrID = gBerryBlenderData->field_A2[a1]; - u32 var2 = gUnknown_08216303[arrID]; - - if (var1 >= var2 && var1 < var2 + 48) - { - if (var1 >= var2 + 20 && var1 < var2 + 28) - return 2; - else - return 1; - } - else - return 0; -} - -static void sub_804F1BC(u16 itemID, u8 a1, struct BlenderBerry* berry) -{ - u16 r4 = 0; - u16 i; - if (itemID == ITEM_ENIGMA_BERRY) - { - for (i = 0; i < 5; i++) - { - if (berry->flavours[r4] > berry->flavours[i]) - r4 = i; - } - r4 += 5; - } - else - { - r4 = itemID - 133; - if (r4 >= 5) - r4 = (r4 % 5) + 5; - } - for (i = 0; i < a1 - 1; i++) - { - Blender_SetBankBerryData(i + 1, gUnknown_082165BC[r4][i] + 133); - } -} - -static void sub_804F238(void) -{ - s32 i, j; - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - gBerryBlenderData->field_A2[i] = 0xFF; - gBerryBlenderData->field_9A[i] = gUnknown_082162EC[gBerryBlenderData->playersNo - 2][i]; - } - for (j = 0; j < BLENDER_MAX_PLAYERS; j++) - { - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - if (gBerryBlenderData->field_9A[i] == j) - gBerryBlenderData->field_A2[j] = i; - } - } -} - -static void sub_804F2A8(void) -{ - int i; - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - if (gBerryBlenderData->field_9A[i] != 0xFF) - { - u8* stringPtr = gStringVar1; - - gBerryBlenderData->SyncArrowSpriteID[gBerryBlenderData->field_9A[i]] = gBerryBlenderData->SyncArrowSprite2ID[i]; - StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSpriteID[gBerryBlenderData->field_9A[i]]], i); - if (GetMultiplayerId() == gBerryBlenderData->field_9A[i]) - stringPtr = StringCopy(stringPtr, sRedColorString); - StringCopy(stringPtr, gLinkPlayers[gBerryBlenderData->field_9A[i]].name); - Menu_PrintTextPixelCoords(gStringVar1, gUnknown_082162D4[i][0] * 8 + 1, gUnknown_082162D4[i][1] * 8, 1); - } - } -} - -static void sub_804F378(void) -{ - s32 i, j; - switch (gBerryBlenderData->field_0) - { - case 0: - sub_804F0F4(); - Blender_SetBankBerryData(0, gSpecialVar_ItemId); - Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); - sub_804F1BC(gSpecialVar_ItemId, gBerryBlenderData->playersNo, &gBerryBlenderData->blendedBerries[0]); - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - gBerryBlenderData->field_70[i] = 0; - for (j = 0; j < 3; j++) - { - gBerryBlenderData->scores[i][j] = 0; - } - } - gBerryBlenderData->field_7C = 0; - gBerryBlenderData->field_1 = 0; - break; - case 1: - if (sub_804E2EC()) - { - gBerryBlenderData->field_0++; - sub_8051474(); - } - break; - case 2: - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - gBerryBlenderData->SyncArrowSprite2ID[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); - StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSprite2ID[i]], i + 8); - } - gBerryBlenderData->field_0++; - break; - case 3: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gBerryBlenderData->field_0++; - gBerryBlenderData->framesToWait = 0; - break; - case 4: - if (++gBerryBlenderData->framesToWait == 2) - sub_804E4FC(); - if (!gPaletteFade.active) - gBerryBlenderData->field_0 = 8; - break; - case 8: - gBerryBlenderData->field_0 = 11; - gBerryBlenderData->field_13C = 0; - break; - case 11: - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - u32 var = gUnknown_082162EC[gBerryBlenderData->playersNo - 2][i]; - if (gBerryBlenderData->field_13C == var) - { - sub_804E7C0(gBerryBlenderData->chosenItemID[gBerryBlenderData->field_13C], i); - break; - } - } - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - gBerryBlenderData->field_13C++; - break; - case 12: - if (++gBerryBlenderData->framesToWait > 60) - { - if (gBerryBlenderData->field_13C >= gBerryBlenderData->playersNo) - { - gBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[gBerryBlenderData->playersNo - 2]] - 22528; - gBerryBlenderData->field_0++; - } - else - gBerryBlenderData->field_0--; - gBerryBlenderData->framesToWait = 0; - } - break; - case 13: - gBerryBlenderData->field_0++; - sub_804F238(); - PlaySE(SE_RU_HYUU); - sub_8051414(&gBerryBlenderData->field_168); - break; - case 14: - REG_DISPCNT |= 0x400; - gBerryBlenderData->arrowPos += 0x200; - gBerryBlenderData->field_142 += 4; - if (gBerryBlenderData->field_142 > 255) - { - gBerryBlenderData->field_0++; - gBerryBlenderData->field_142 = 256; - gBerryBlenderData->arrowPos = gUnknown_082162F8[gUnknown_08216300[gBerryBlenderData->playersNo - 2]]; - REG_BG2CNT = 0x4882; - gBerryBlenderData->framesToWait = 0; - PlaySE(SE_TRACK_DOOR);; - sub_804F2A8(); - } - sub_8051414(&gBerryBlenderData->field_168); - break; - case 15: - if (sub_8051B8C()) - { - gBerryBlenderData->field_0++; - } - sub_8051414(&gBerryBlenderData->field_168); - break; - case 16: - CreateSprite(&sSpriteTemplate_8216548, 120, -16, 3); - gBerryBlenderData->field_0++; - break; - case 18: - gBerryBlenderData->field_0++; - break; - case 19: - gBerryBlenderData->field_0++; - break; - case 20: - gBerryBlenderData->field_0++; - break; - case 21: - sub_804F81C(); - gBerryBlenderData->field_56 = 128; - gBerryBlenderData->gameFrameTime = 0; - gBerryBlenderData->field_14B = 0; - gBerryBlenderData->field_7E = 0; - SetMainCallback2(sub_80501FC); - - for (i = 0; i < gSpecialVar_0x8004; i++) - { - gBerryBlenderData->field_148[i] = CreateTask(gUnknown_08216308[i], 10 + i); - } - - if (GetCurrentMapMusic() != 403) - { - gBerryBlenderData->field_178 = GetCurrentMapMusic(); - } - PlayBGM(BGM_CYCLING); - PlaySE(SE_MOTER); - Blender_ControlHitPitch(); - break; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_804F81C(void) -{ - s32 i; - for (i = 0; i < 4; i++) - { - gSendCmd[0] = 0; - gSendCmd[2] = 0; - gRecvCmds[0][i] = 0; - gRecvCmds[2][i] = 0; - } -} - -static void sub_804F844(u8 taskID) -{ - if(++gTasks[taskID].data[0] > gTasks[taskID].data[1]) - { - gRecvCmds[2][gTasks[taskID].data[2]] = 0x2345; - DestroyTask(taskID); - } -} - -static void sub_804F890(u8 a0, u8 a1) -{ - u8 taskID = CreateTask(sub_804F844, 80); - gTasks[taskID].data[1] = a1; - gTasks[taskID].data[2] = a0; -} - -static void sub_804F8C8(u8 taskID) -{ - if (sub_804F16C(gBerryBlenderData->arrowPos, 1) == 2) - { - if (gTasks[taskID].data[0] == 0) - { - if (gBerryBlenderData->field_14B == 0) - { - u8 rand = Random() / 655; - if (gBerryBlenderData->field_56 < 500) - { - if (rand > 75) - gRecvCmds[2][1] = 0x4523; - else - gRecvCmds[2][1] = 0x5432; - gRecvCmds[2][1] = 0x5432; // ??? - } - else if (gBerryBlenderData->field_56 < 1500) - { - if (rand > 80) - gRecvCmds[2][1] = 0x4523; - else - { - u8 value = rand - 21; - if (value < 60) - gRecvCmds[2][1] = 0x5432; - else if (rand < 10) - sub_804F890(1, 5); - } - } - else if (rand <= 90) - { - u8 value = rand - 71; - if (value < 20) - gRecvCmds[2][1] = 0x5432; - else if (rand < 30) - sub_804F890(1, 5); - } - else - gRecvCmds[2][1] = 0x4523; - } - else - gRecvCmds[2][1] = 0x4523; - - gTasks[taskID].data[0] = 1; - } - } - else - gTasks[taskID].data[0] = 0; -} - -static void sub_804F9F4(u8 taskID) -{ - u32 var1 = (gBerryBlenderData->arrowPos + 0x1800) & 0xFFFF; - u32 var2 = gBerryBlenderData->field_A2[2] & 0xFF; - if ((var1 >> 8) > gUnknown_08216303[var2] + 20 && (var1 >> 8) < gUnknown_08216303[var2] + 40) - { - if (gTasks[taskID].data[0] == 0) - { - if (gBerryBlenderData->field_14B == 0) - { - u8 rand = Random() / 655; - if (gBerryBlenderData->field_56 < 500) - { - if (rand > 66) - gRecvCmds[2][2] = 0x4523; - else - gRecvCmds[2][2] = 0x5432; - } - else - { - u8 value; - if (rand > 65) - gRecvCmds[2][2] = 0x4523; - value = rand - 41; - if (value < 25) - gRecvCmds[2][2] = 0x5432; - if (rand < 10) - sub_804F890(2, 5); - } - - gTasks[taskID].data[0] = 1; - } - else - { - gRecvCmds[2][2] = 0x4523; - gTasks[taskID].data[0] = 1; - } - } - } - else - gTasks[taskID].data[0] = 0; -} - -static void sub_804FB1C(u8 taskID) -{ - u32 var1, var2; - - var1 = (gBerryBlenderData->arrowPos + 0x1800) & 0xFFFF; - var2 = gBerryBlenderData->field_A2[3] & 0xFF; - if ((var1 >> 8) > gUnknown_08216303[var2] + 20 && (var1 >> 8) < gUnknown_08216303[var2] + 40) - { - if (gTasks[taskID].data[0] == 0) - { - if (gBerryBlenderData->field_14B == 0) - { - u8 rand = (Random() / 655); - if (gBerryBlenderData->field_56 < 500) - { - if (rand > 88) - gRecvCmds[2][3] = 0x4523; - else - gRecvCmds[2][3] = 0x5432; - } - else - { - if (rand > 60) - gRecvCmds[2][3] = 0x4523; - else - { - s8 value = rand - 56; // makes me wonder what the original code was - u8 value2 = value; - if (value2 < 5) - gRecvCmds[2][3] = 0x5432; - } - if (rand < 5) - sub_804F890(3, 5); - } - gTasks[taskID].data[0] = 1; - } - else - { - gRecvCmds[2][3] = 0x4523; - gTasks[taskID].data[0] = 1; - } - } - } - else - gTasks[taskID].data[0] = 0; -} - -static void sub_804FC48(u16 a0, u8 a1) -{ - u8 spriteID; - - spriteID = CreateSprite(&sSpriteTemplate_821645C, - sBlenderSyncArrowsPos[a1][0] - (10 * gUnknown_082162CC[a1][0]), - sBlenderSyncArrowsPos[a1][1] - (10 * gUnknown_082162CC[a1][1]), - 1); - if (a0 == 0x4523) - { - StartSpriteAnim(&gSprites[spriteID], 2); - gSprites[spriteID].callback = sub_8051684; - PlaySE(SE_RU_GASHIN); - } - else if (a0 == 0x5432) - { - StartSpriteAnim(&gSprites[spriteID], 0); - PlaySE(SE_SEIKAI); - } - else if (a0 == 0x2345) - { - StartSpriteAnim(&gSprites[spriteID], 1); - PlaySE(SE_HAZURE); - } - sub_805156C(); -} - -static void sub_804FD30(u16 a0) -{ - Blender_ControlHitPitch(); - switch (a0) - { - case 0x4523: - if (gBerryBlenderData->field_56 < 1500) - gBerryBlenderData->field_56 += (384 / gUnknown_082165DA[gBerryBlenderData->playersNo]); - else - { - gBerryBlenderData->field_56 += (128 / gUnknown_082165DA[gBerryBlenderData->playersNo]); - sub_8051AC8(&gBerryBlenderData->field_144, (gBerryBlenderData->field_56 / 100) - 10); - sub_8051AC8(&gBerryBlenderData->field_146, (gBerryBlenderData->field_56 / 100) - 10); - } - break; - case 0x5432: - if (gBerryBlenderData->field_56 < 1500) - gBerryBlenderData->field_56 += (256 / gUnknown_082165DA[gBerryBlenderData->playersNo]); - break; - case 0x2345: - gBerryBlenderData->field_56 -= (256 / gUnknown_082165DA[gBerryBlenderData->playersNo]); - if (gBerryBlenderData->field_56 < 128) - gBerryBlenderData->field_56 = 128; - break; - } -} - -static void sub_804FE70(void) -{ - s32 i; - - if (gSpecialVar_0x8004 != 0) - { - if (gSendCmd[2] != 0) - { - gRecvCmds[2][0] = gSendCmd[2]; - gRecvCmds[0][0] = 0x4444; - gSendCmd[2] = 0; - } - for (i = 1; i < 4; i++) - { - if (gRecvCmds[2][i] != 0) - gRecvCmds[0][i] = 0x4444; - } - } - for (i = 0; i < gBerryBlenderData->playersNo; i++) - { - if (gRecvCmds[0][i] == 0x4444) - { - u32 var = gBerryBlenderData->field_A2[i]; - if (gRecvCmds[2][i] == 0x4523) - { - sub_804FD30(0x4523); - gBerryBlenderData->field_13E += (gBerryBlenderData->field_56 / 55); - if (gBerryBlenderData->field_13E >= 1000) - gBerryBlenderData->field_13E = 1000; - sub_804FC48(0x4523, var); - gBerryBlenderData->scores[i][BLENDER_SCORE_BEST]++; - } - else if (gRecvCmds[2][i] == 0x5432) - { - sub_804FD30(0x5432); - gBerryBlenderData->field_13E += (gBerryBlenderData->field_56 / 70); - sub_804FC48(0x5432, var); - gBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]++; - } - else if (gRecvCmds[2][i] == 0x2345) - { - sub_804FC48(0x2345, var); - sub_804FD30(0x2345); - if (gBerryBlenderData->field_4.win_field_F > 1000) - gBerryBlenderData->field_13E = 1000; - if (gBerryBlenderData->scores[i][BLENDER_SCORE_MISS] < 999) - gBerryBlenderData->scores[i][BLENDER_SCORE_MISS]++; - } - if (gRecvCmds[2][i] == 0x2345 || gRecvCmds[2][i] == 0x4523 || gRecvCmds[2][i] == 0x5432) - { - if (gBerryBlenderData->field_56 > 1500) - m4aMPlayTempoControl(&gMPlay_BGM, ((gBerryBlenderData->field_56 - 750) / 20) + 256); - else - m4aMPlayTempoControl(&gMPlay_BGM, 256); - } - } - } - if (gSpecialVar_0x8004 != 0) - { - for (i = 0; i < gBerryBlenderData->playersNo; i++) - { - gRecvCmds[0][i] = 0; - gRecvCmds[2][i] = 0; - } - } -} - -static void sub_80500A8(void) -{ - bool8 A_pressed = 0; - u8 var2 = gBerryBlenderData->field_A2[GetMultiplayerId()]; - if (gBerryBlenderData->field_6F == 0) - { - if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A && gMain.newKeys & A_BUTTON) - A_pressed = ((gMain.heldKeysRaw & (A_BUTTON | L_BUTTON)) != (A_BUTTON | L_BUTTON)); - else if (gMain.newKeys & A_BUTTON) - A_pressed = 1; - if (A_pressed) - { - u8 var3; - StartSpriteAnim(&gSprites[gBerryBlenderData->SyncArrowSpriteID[gBerryBlenderData->field_9A[var2]]], var2 + 4); - var3 = sub_804F16C(gBerryBlenderData->arrowPos, GetMultiplayerId()); - if (var3 == 2) - gSendCmd[2] = 0x4523; - else if (var3 == 1) - gSendCmd[2] = 0x5432; - else - gSendCmd[2] = 0x2345; - } - } - if (++gBerryBlenderData->field_7E > 5) - { - if (gBerryBlenderData->field_56 > 128) - gBerryBlenderData->field_56--; - gBerryBlenderData->field_7E = 0; - } - if (gUnknown_020297ED && gMain.newKeys & L_BUTTON) - gBerryBlenderData->field_14B ^= 1; -} - -static void sub_80501FC(void) -{ - sub_8051474(); - if (gBerryBlenderData->gameFrameTime < (99 * 60 * 60) + (59 * 60)) // game time can't be longer than 99 minutes and 59 seconds, can't print 3 digits - gBerryBlenderData->gameFrameTime++; - sub_80500A8(); - SetLinkDebugValues((u16)(gBerryBlenderData->field_56), gBerryBlenderData->field_13E); - sub_804FE70(); - sub_805194C(gBerryBlenderData->field_13E, 1000); - sub_8051A3C(gBerryBlenderData->field_56); - sub_8051B18(); - sub_805123C(); - if (gBerryBlenderData->field_6F == 0 && gBerryBlenderData->field_140 >= 1000) - { - gBerryBlenderData->field_13E = 1000; - gBerryBlenderData->field_6F = 1; - SetMainCallback2(sub_8050954); - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static bool8 sub_80502A4(struct BlenderBerry* berries, u8 index1, u8 index2) -{ - if (berries[index1].itemID != berries[index2].itemID - || (StringCompare(berries[index1].name, berries[index2].name) == 0 - && (berries[index1].flavours[0] == berries[index2].flavours[0] - && berries[index1].flavours[1] == berries[index2].flavours[1] - && berries[index1].flavours[2] == berries[index2].flavours[2] - && berries[index1].flavours[3] == berries[index2].flavours[3] - && berries[index1].flavours[4] == berries[index2].flavours[4] - && berries[index1].smoothness == berries[index2].smoothness))) - return TRUE; - else - return FALSE; -} - -u32 Blender_GetPokeblockColor(struct BlenderBerry* berries, s16* a1, u8 playersNo, u8 a3) -{ - s16 vars[5]; - s32 i; - s32 r6; - u8 r2; - - for (i = 0; i <= 5; i++) // bug, writing one index too far - vars[i] = a1[i]; - r6 = 0; - for (i = 0; i < 5; i++) - { - if (vars[i] == 0) - r6++; - } - if (r6 == 5 || a3 > 3) - return 12; - for (i = 0; i < playersNo; i++) - { - for (r6 = 0; r6 < playersNo; r6++) - { - if (berries[i].itemID == berries[r6].itemID && i != r6 - && (berries[i].itemID != ITEM_ENIGMA_BERRY || sub_80502A4(berries, i, r6))) - return 12; - } - } - r2 = 0; - for (r2 = 0, i = 0; i < 5; i++) - { - if (vars[i] > 0) - r2++; - } - if (r2 > 3) - return 13; - if (r2 == 3) - return 11; - for (i = 0; i < 5; i++) - { - if (vars[i] > 50) - return 14; - } - if (r2 == 1 && vars[0] > 0) - return 1; - if (r2 == 1 && vars[1] > 0) - return 2; - if (r2 == 1 && vars[2] > 0) - return 3; - if (r2 == 1 && vars[3] > 0) - return 4; - if (r2 == 1 && vars[4] > 0) - return 5; - if (r2 == 2) - { - s32 var = 0; - for (i = 0; i < 5; i++) - { - if (vars[i] > 0) - gUnknown_03000520[var++] = i; - } - if (vars[gUnknown_03000520[0]] >= vars[gUnknown_03000520[1]]) - { - if (gUnknown_03000520[0] == 0) - return (gUnknown_03000520[1] << 16) | 6; - if (gUnknown_03000520[0] == 1) - return (gUnknown_03000520[1] << 16) | 7; - if (gUnknown_03000520[0] == 2) - return (gUnknown_03000520[1] << 16) | 8; - if (gUnknown_03000520[0] == 3) - return (gUnknown_03000520[1] << 16) | 9; - if (gUnknown_03000520[0] == 4) - return (gUnknown_03000520[1] << 16) | 10; - } - else - { - if (gUnknown_03000520[1] == 0) - return (gUnknown_03000520[0] << 16) | 6; - if (gUnknown_03000520[1] == 1) - return (gUnknown_03000520[0] << 16) | 7; - if (gUnknown_03000520[1] == 2) - return (gUnknown_03000520[0] << 16) | 8; - if (gUnknown_03000520[1] == 3) - return (gUnknown_03000520[0] << 16) | 9; - if (gUnknown_03000520[1] == 4) - return (gUnknown_03000520[0] << 16) | 10; - } - } - return 0; -} - -static void sub_80504F0(s16 value) -{ - gUnknown_0300052C = value; -} - -s16 unref_sub_80504FC(void) -{ - return gUnknown_0300052C; -} - -static void sub_8050508(s16 value) -{ - gUnknown_0300052E = value; -} - -s16 unref_sub_8050514(void) -{ - return gUnknown_0300052E; -} - -static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavours, u16 maxRPM) -{ - s32 i; - s32 j; - s32 var3; - s32 var4; - s32 var6; - u8 r10; - - for (i = 0; i < 6; i++) - gUnknown_03000510[i] = 0; - for (i = 0; i < playersNo; i++) - { - for (j = 0; j < 6; j++) - gUnknown_03000510[j] += berries[i].flavours[j]; - } - - var6 = gUnknown_03000510[0]; - gUnknown_03000510[0] -= gUnknown_03000510[1]; - gUnknown_03000510[1] -= gUnknown_03000510[2]; - gUnknown_03000510[2] -= gUnknown_03000510[3]; - gUnknown_03000510[3] -= gUnknown_03000510[4]; - gUnknown_03000510[4] -= var6; - - var6 = 0; - for (i = 0; i < 5; i++) - { - if (gUnknown_03000510[i] < 0) - { - gUnknown_03000510[i] = 0; - var6++; - } - } - r10 = var6; - for (i = 0; i < 5; i++) - { - if (gUnknown_03000510[i] > 0) - { - if (gUnknown_03000510[i] < var6) - gUnknown_03000510[i] = 0; - else - gUnknown_03000510[i] -= var6; - } - } - for (i = 0; i < 5; i++) - { - gUnknown_03000530[i] = gUnknown_03000510[i]; - } - - var6 = maxRPM / 333 + 100; - gUnknown_0300055C = var6; - - for (i = 0; i < 5; i++) - { - var3 = gUnknown_03000510[i]; - var3 = (var3 * var6) / 10; - var4 = var3 % 10; - var3 /= 10; - if (var4 > 4) - var3++; - gUnknown_03000510[i] = var3; - } - for (i = 0; i < 5; i++) - { - gUnknown_03000548[i] = gUnknown_03000510[i]; - } - pokeblock->color = Blender_GetPokeblockColor(berries, &gUnknown_03000510[0], playersNo, r10); - gUnknown_03000510[5] = (gUnknown_03000510[5] / playersNo) - playersNo; - if (gUnknown_03000510[5] < 0) - gUnknown_03000510[5] = 0; - if (pokeblock->color == 12) - { - var6 = Random() % 10; - for (i = 0; i < 5; i++) - { - if ((gUnknown_082165DF[var6] >> i) & 1) - gUnknown_03000510[i] = 2; - else - gUnknown_03000510[i] = 0; - } - } - for (i = 0; i < 6; i++) - { - if (gUnknown_03000510[i] > 255) - gUnknown_03000510[i] = 255; - } - pokeblock->spicy = gUnknown_03000510[0]; - pokeblock->dry = gUnknown_03000510[1]; - pokeblock->sweet = gUnknown_03000510[2]; - pokeblock->bitter = gUnknown_03000510[3]; - pokeblock->sour = gUnknown_03000510[4]; - pokeblock->feel = gUnknown_03000510[5]; - for (i = 0; i < 6; i++) - { - flavours[i] = gUnknown_03000510[i]; - } -} - -static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavours, u16 a4) -{ - Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavours, a4); -} - -/*static*/ void sub_8050760(void) -{ - u32 frames = (u16)(gBerryBlenderData->gameFrameTime); - u16 max_RPM = gBerryBlenderData->max_RPM; - s16 var = 0; - - if (frames < 900) - var = 5; - else if ((u16)(frames - 900) < 600) - var = 4; - else if ((u16)(frames - 1500) < 600) - var = 3; - else if ((u16)(frames - 2100) < 900) - var = 2; - else if ((u16)(frames - 3300) < 300) - var = 1; - sub_8050508(var); - - var = 0; - if (max_RPM <= 64) - { - if (max_RPM >= 50 && max_RPM < 100) - var = -1; - else if (max_RPM >= 100 && max_RPM < 150) - var = -2; - else if (max_RPM >= 150 && max_RPM < 200) - var = -3; - else if (max_RPM >= 200 && max_RPM < 250) - var = -4; - else if (max_RPM >= 250 && max_RPM < 300) - var = -5; - else if (max_RPM >= 350 && max_RPM < 400) - var = -6; - else if (max_RPM >= 400 && max_RPM < 450) - var = -7; - else if (max_RPM >= 500 && max_RPM < 550) - var = -8; - else if (max_RPM >= 550 && max_RPM < 600) - var = -9; - else if (max_RPM >= 600) - var = -10; - } - sub_80504F0(var); -} - -static void sub_80508D4(u8 value) -{ - gBerryBlenderData->field_AA = value; - MenuCursor_SetPos814A880(192, (gBerryBlenderData->field_AA * 16) + 72); -} - -static void sub_80508FC(void) -{ - gBerryBlenderData->field_AA = 0; - Menu_DrawStdWindowFrame(23, 8, 28, 13); - MenuCursor_Create814A5C0(0, -1, 12, 0x2D9F, 32); - Menu_PrintText(gOtherText_YesNoTerminating, 24, 9); - sub_80508D4(gBerryBlenderData->field_AA); -} - -static void sub_8050954(void) -{ - u8 i; - u8 multiplayerID; // unused - - sub_8051474(); - multiplayerID = GetMultiplayerId(); - switch (gBerryBlenderData->field_6F) - { - case 1: - ClearLinkCallback(); - m4aMPlayTempoControl(&gMPlay_BGM, 256); - for (i = 0; i < gSpecialVar_0x8004; i++) - { - DestroyTask(gBerryBlenderData->field_148[i]); - } - gBerryBlenderData->field_6F++; - break; - case 2: - gBerryBlenderData->field_56 -= 32; - if (gBerryBlenderData->field_56 <= 0) - { - gBerryBlenderData->field_56 = 0; - if (gReceivedRemoteLinkPlayers != 0) - gBerryBlenderData->field_6F++; - else - gBerryBlenderData->field_6F = 5; - gBerryBlenderData->field_0 = 0; - m4aMPlayStop(&gMPlay_SE2); - } - Blender_ControlHitPitch(); - break; - case 3: - if (/*multiplayerID != 0*/ GetMultiplayerId() != 0) - gBerryBlenderData->field_6F++; - else if (IsLinkTaskFinished()) - { - gBerryBlenderData->field_1BC = gBerryBlenderData->gameFrameTime; - gBerryBlenderData->field_1C0 = gBerryBlenderData->max_RPM; - SendBlock(0, &gBerryBlenderData->field_1BC, 40); - gBerryBlenderData->field_6F++; - } - break; - case 4: - if (GetBlockReceivedStatus()) - { - u32* ptr = ((u32*)(&gBlockRecvBuffer[0][0])); - gBerryBlenderData->max_RPM = gBlockRecvBuffer[0][2]; - gBerryBlenderData->gameFrameTime = *ptr; - gBerryBlenderData->field_6F++; - ResetBlockReceivedFlags(); - } - break; - case 5: - if (Blender_PrintBlendingRanking()) - gBerryBlenderData->field_6F++; - break; - case 6: - if (Blender_PrintBlendingResults()) - { - if (gInGameOpponentsNo == 0) - IncrementGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS); - else - IncrementGameStat(GAME_STAT_POKEBLOCKS); - gBerryBlenderData->field_6F++; - } - break; - case 7: - gBerryBlenderData->field_6F++; - Menu_DrawStdWindowFrame(0, 14, 29, 19); - MenuPrintMessage(gOtherText_BlendAnotherBerryPrompt, 1, 15); - break; - case 8: - if (Menu_UpdateWindowText()) - gBerryBlenderData->field_6F++; - break; - case 9: - gBerryBlenderData->field_AA = 0; - sub_80508FC(); - gBerryBlenderData->field_6F++; - break; - case 10: - if (gMain.newKeys & DPAD_UP) - { - if (gBerryBlenderData->field_AA != 0) - PlaySE(SE_SELECT); - sub_80508D4(0); - } - else if (gMain.newKeys & DPAD_DOWN) - { - if (gBerryBlenderData->field_AA != 1) - PlaySE(SE_SELECT); - sub_80508D4(1); - } - else if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gBerryBlenderData->field_6F++; - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gBerryBlenderData->field_6F++; - sub_80508D4(1); - } - break; - case 11: - gSendCmd[0] = 0x2FFF; - if (gBerryBlenderData->field_AA == 0) - { - if (IsBagPocketNonEmpty(BAG_BERRIES) == FALSE) // is empty - { - gBerryBlenderData->field_7C = 2; - gSendCmd[1] = 0x9999; - } - else if (GetFirstFreePokeblockSlot() == -1) - { - gBerryBlenderData->field_7C = 3; - gSendCmd[1] = 0xAAAA; - } - else - { - gBerryBlenderData->field_7C = 0; - gSendCmd[1] = 0x7779; - } - gBerryBlenderData->field_6F++; - } - else - { - gBerryBlenderData->field_7C = 1; - gSendCmd[1] = 0x8888; - gBerryBlenderData->field_6F++; - } - break; - case 12: - if (gInGameOpponentsNo) - { - SetMainCallback2(sub_80510E8); - gBerryBlenderData->field_6F = 0; - gBerryBlenderData->field_0 = 0; - } - else - { - MenuPrintMessage(gOtherText_LinkStandby3, 1, 15); - gBerryBlenderData->field_6F++; - } - break; - case 13: - if (Menu_UpdateWindowText()) - { - SetMainCallback2(sub_8050E30); - gBerryBlenderData->field_6F = 0; - gBerryBlenderData->field_0 = 0; - } - break; - } - sub_8051B18(); - sub_8051A3C(gBerryBlenderData->field_56); - sub_805123C(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -bool8 sub_8050CE8(void) -{ - switch (gBerryBlenderData->field_1C4) - { - case 0: - sub_80084A4(); - gBerryBlenderData->field_1C4 = 1; - gBerryBlenderData->framesToWait = 0; - break; - case 1: - if (IsLinkTaskFinished()) - { - gBerryBlenderData->field_1C4++; - gSoftResetDisabled = TRUE; - } - break; - case 2: - sub_8125E2C(); - gBerryBlenderData->field_1C4++; - gBerryBlenderData->framesToWait = 0; - break; - case 3: - if (++gBerryBlenderData->framesToWait == 10) - { - sub_80084A4(); - gBerryBlenderData->field_1C4++; - } - break; - case 4: - if (IsLinkTaskFinished()) - { - if (sub_8125E6C()) - gBerryBlenderData->field_1C4 = 5; - else - { - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_1C4 = 3; - } - } - break; - case 5: - gBerryBlenderData->field_1C4++; - gBerryBlenderData->framesToWait = 0; - break; - case 6: - if (++gBerryBlenderData->framesToWait > 5) - { - gSoftResetDisabled = FALSE; - return TRUE; - } - break; - } - return FALSE; -} - -static void sub_8050E30(void) -{ - switch (gBerryBlenderData->field_6F) - { - case 0: - if (gBerryBlenderData->field_70[0] == 0x2222) - gBerryBlenderData->field_6F = 5; - else if (gBerryBlenderData->field_70[0] == 0x1111) - { - if (gBerryBlenderData->field_78 == 0x9999) - gBerryBlenderData->field_6F = 2; - else if (gBerryBlenderData->field_78 == 0xAAAA) - gBerryBlenderData->field_6F = 1; - else - gBerryBlenderData->field_6F = 5; - } - break; - case 1: - gBerryBlenderData->field_6F = 3; - DestroyMenuCursor(); - Menu_EraseWindowRect(23, 8, 28, 13); -#ifdef ENGLISH - StringCopy(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); - StringAppend(gStringVar4, gOtherText_OtherCaseIsFull); -#else - StringCopy(gStringVar4, gOtherText_OtherCaseIsFull); - de_sub_8073110(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); -#endif - MenuPrintMessage(gStringVar4, 1, 15); - break; - case 2: - gBerryBlenderData->field_6F++; - DestroyMenuCursor(); - Menu_EraseWindowRect(23, 8, 28, 13); -#ifdef ENGLISH - StringCopy(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); - StringAppend(gStringVar4, gOtherText_NoBerriesForBlend); -#else - StringCopy(gStringVar4, gOtherText_NoBerriesForBlend); - de_sub_8073110(gStringVar4, gLinkPlayers[gBerryBlenderData->field_7A].name); -#endif - MenuPrintMessage(gStringVar4, 1, 15); - break; - case 3: - if (Menu_UpdateWindowText()) - { - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_6F++; - } - break; - case 4: - if (++gBerryBlenderData->framesToWait > 60) - gBerryBlenderData->field_6F = 5; - break; - case 5: - Menu_DrawStdWindowFrame(0, 14, 29, 19); - Menu_PrintText(gMultiText_Saving, 2, 15); - sub_80084A4(); - gBerryBlenderData->field_6F++; - break; - case 6: - if (IsLinkTaskFinished()) - { - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_6F++; - gBerryBlenderData->field_1C4 = 0; - } - break; - case 7: - if (sub_8050CE8()) - { - PlaySE(SE_SAVE); - gBerryBlenderData->field_6F++; - } - break; - case 8: - gBerryBlenderData->field_6F++; - sub_80084A4(); - break; - case 9: - if (IsLinkTaskFinished()) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gBerryBlenderData->field_6F++; - } - break; - case 10: - if (!gPaletteFade.active) - { - if (gBerryBlenderData->field_70[0] == 0x2222) - SetMainCallback2(DoBerryBlending); - else - { - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_6F++; - } - } - break; - case 11: - if (++gBerryBlenderData->framesToWait > 30) - { - sub_800832C(); - gBerryBlenderData->field_6F++; - } - break; - case 12: - if (gReceivedRemoteLinkPlayers == 0) - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - break; - } - - sub_805123C(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_80510E8(void) -{ - switch (gBerryBlenderData->field_6F) - { - case 0: - if (gBerryBlenderData->field_7C < 2) - gBerryBlenderData->field_6F = 9; - if (gBerryBlenderData->field_7C == 2) - gBerryBlenderData->field_6F = 2; - if (gBerryBlenderData->field_7C == 3) - gBerryBlenderData->field_6F =1; - break; - case 1: - gBerryBlenderData->field_6F = 3; - DestroyMenuCursor(); - Menu_EraseWindowRect(23, 8, 28, 13); - MenuPrintMessage(gOtherText_CaseIsFull, 1, 15); - break; - case 2: - gBerryBlenderData->field_6F++; - DestroyMenuCursor(); - Menu_EraseWindowRect(23, 8, 28, 13); - MenuPrintMessage(gOtherText_OutOfBerries, 1, 15); - break; - case 3: - if (Menu_UpdateWindowText()) - gBerryBlenderData->field_6F = 9; - break; - case 9: - BeginFastPaletteFade(3); - gBerryBlenderData->field_6F++; - break; - case 10: - if (!gPaletteFade.active) - { - if (gBerryBlenderData->field_7C == 0) - SetMainCallback2(DoBerryBlending); - else - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); - } - break; - } - - sub_805123C(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_805123C(void) -{ - if (gReceivedRemoteLinkPlayers) - { - if (gRecvCmds[0][0] == 0x2FFF) - { - if (gRecvCmds[1][0] == 0x1111) - { - switch (gRecvCmds[2][0]) - { - case 0x8888: - gBerryBlenderData->field_78 = 0x8888; - gBerryBlenderData->field_7A = gRecvCmds[3][0]; - break; - case 0x9999: - gBerryBlenderData->field_78 = 0x9999; - gBerryBlenderData->field_7A = gRecvCmds[3][0]; - break; - case 0xAAAA: - gBerryBlenderData->field_78 = 0xAAAA; - gBerryBlenderData->field_7A = gRecvCmds[3][0]; - break; - } - gBerryBlenderData->field_70[0] = 0x1111; - } - else if (gRecvCmds[1][0] == 0x2222) - gBerryBlenderData->field_70[0] = 0x2222; - } - if (GetMultiplayerId() == 0 && gBerryBlenderData->field_70[0] != 0x1111 && gBerryBlenderData->field_70[0] != 0x2222) - { - u8 i; - for (i = 0; i < GetLinkPlayerCount(); i++) - { - if (gRecvCmds[0][i] == 0x2FFF) - { - switch (gRecvCmds[1][i]) - { - case 0x8888: - gBerryBlenderData->field_70[i] = 0x8888; - break; - case 0x7779: - gBerryBlenderData->field_70[i] = 0x7779; - break; - case 0x9999: - gBerryBlenderData->field_70[i] = 0x9999; - break; - case 0xAAAA: - gBerryBlenderData->field_70[i] = 0xAAAA; - break; - } - } - } - for (i = 0; i < GetLinkPlayerCount(); i++) - { - if (gBerryBlenderData->field_70[i] == 0) - break; - } - if (i == GetLinkPlayerCount()) - { - for (i = 0; i < GetLinkPlayerCount(); i++) - { - if (gBerryBlenderData->field_70[i] != 0x7779) - break; - } - gSendCmd[0] = 0x2FFF; - if (i == GetLinkPlayerCount()) - gSendCmd[1] = 0x2222; - else - { - gSendCmd[1] = 0x1111; - gSendCmd[2] = gBerryBlenderData->field_70[i]; - gSendCmd[3] = i; - } - } - } - } -} - -static void sub_8051414(struct BgAffineDstData *dest) -{ - struct BgAffineSrcData affineSrc; - affineSrc.texX = 30720; - affineSrc.texY = 20480; - affineSrc.scrX = 120 - gBerryBlenderData->field_144; - affineSrc.scrY = 80 - gBerryBlenderData->field_146; - affineSrc.sx = gBerryBlenderData->field_142; - affineSrc.sy = gBerryBlenderData->field_142; - affineSrc.alpha = gBerryBlenderData->arrowPos; - BgAffineSet(&affineSrc, dest, 1); -} - -static void sub_8051474(void) -{ - gBerryBlenderData->field_58 = gBerryBlenderData->arrowPos; - gBerryBlenderData->arrowPos += gBerryBlenderData->field_56; - sub_8051414(&gBerryBlenderData->field_168); -} - -static void sub_80514A4(void) -{ - REG_BG2PA = gBerryBlenderData->field_168.pa; - REG_BG2PB = gBerryBlenderData->field_168.pb; - REG_BG2PC = gBerryBlenderData->field_168.pc; - REG_BG2PD = gBerryBlenderData->field_168.pd; - REG_BG2X = gBerryBlenderData->field_168.dx; - REG_BG2Y = gBerryBlenderData->field_168.dy; -} - -static void sub_80514F0(void) -{ - REG_BG1HOFS = gBerryBlenderData->field_144; - REG_BG1VOFS = gBerryBlenderData->field_146; - REG_BG0HOFS = gBerryBlenderData->field_144; - REG_BG0VOFS = gBerryBlenderData->field_146; -} - -void sub_8051524(struct Sprite* sprite) -{ - sprite->data[2] += sprite->data[0]; - sprite->data[3] += sprite->data[1]; - sprite->pos2.x = sprite->data[2] / 8; - sprite->pos2.y = sprite->data[3] / 8; - if (sprite->animEnded) - DestroySprite(sprite); -} - -static void sub_805156C(void) -{ - s32 limit = (Random() % 2) + 1; - s32 i; - - for (i = 0; i < limit; i++) - { - u16 rand; - s32 x, y; - u8 spriteID; - - rand = gBerryBlenderData->arrowPos + (Random() % 20); - - x = gSineTable[(rand & 0xFF) + 64] / 4; - y = gSineTable[(rand & 0xFF)] / 4; - - spriteID = CreateSprite(&sSpriteTemplate_82164FC, x + 120, y + 80, 1); - gSprites[spriteID].data[0] = 16 - (Random() % 32); - gSprites[spriteID].data[1] = 16 - (Random() % 32); - - gSprites[spriteID].callback = sub_8051524; - } -} - -static void sub_8051650(struct Sprite* sprite) -{ - sprite->data[0]++; - sprite->pos2.y = -(sprite->data[0] / 3); - if (sprite->animEnded) - DestroySprite(sprite); -} - -void sub_8051684(struct Sprite* sprite) -{ - sprite->data[0]++; - sprite->pos2.y = -(sprite->data[0] * 2); - if (sprite->pos2.y < -12) - sprite->pos2.y = -12; - if (sprite->animEnded) - DestroySprite(sprite); -} - -void Blender_SetBankBerryData(u8 bank, u16 itemID) -{ - gBerryBlenderData->chosenItemID[bank] = itemID; - Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[bank], itemID); -} - -void unref_sub_80516F8(u8 taskID) -{ - struct Task* task = &gTasks[taskID]; - if (gReceivedRemoteLinkPlayers) - { - s32 i; - if (GetMultiplayerId() == 0) - { - if (++task->data[0] > 120) - task->data[0] = 0; - if (task->data[0] == 100) - { - Text_EraseWindowRect(&gBerryBlenderData->field_4, 0, 0, 16, 20); - Menu_DrawStdWindowFrame(4, 4, 10, 12); - for (i = 0; i < 3; i++) - { - if (gLinkPlayers[i + 1].trainerId != 0) - Menu_PrintText(gUnknown_08216284[i], 5, (2 * i) + 5); - Menu_DrawStdWindowFrame(0, 13, 29, 19); - Menu_PrintText(gOtherText_PressAToStart, 1, 15); - } - } - if (gMain.newKeys & A_BUTTON) - { - sub_8007E4C(); - DestroyTask(taskID); - } - } - else - { - if (task->data[0] == 10) - Menu_PrintText(gOtherText_PleaseWait, 3, 10); - if (++task->data[0] > 120) - task->data[0] = 0; - if (byte_3002A68 > 4 && gReceivedRemoteLinkPlayers == 1) - DestroyTask(taskID); - } - } -} - -static void sub_805181C(struct Sprite* sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->data[1] += 8; - if (sprite->data[1] > 88) - { - sprite->data[1] = 88; - sprite->data[0]++; - PlaySE(SE_KON); - } - break; - case 1: - sprite->data[2] += 1; - if (sprite->data[2] > 20) - { - sprite->data[0]++; - sprite->data[2] = 0; - } - break; - case 2: - sprite->data[1] += 4; - if (sprite->data[1] > 176) - { - if (++sprite->data[3] == 3) - { - DestroySprite(sprite); - CreateSprite(&sSpriteTemplate_821657C, 120, -20, 2); - } - else - { - sprite->data[0] = 0; - sprite->data[1] = -16; - StartSpriteAnim(sprite, sprite->data[3]); - } - } - break; - } - sprite->pos2.y = sprite->data[1]; -} - -static void sub_80518CC(struct Sprite* sprite) -{ - switch (sprite->data[0]) - { - case 0: - sprite->data[1] += 8; - if (sprite->data[1] > 92) - { - sprite->data[1] = 92; - sprite->data[0]++; - PlaySE(SE_PIN); - } - break; - case 1: - sprite->data[2] += 1; - if (sprite->data[2] > 20) - sprite->data[0]++; - break; - case 2: - sprite->data[1] += 4; - if (sprite->data[1] > 176) - { - gBerryBlenderData->field_0++; - DestroySprite(sprite); - } - break; - } - sprite->pos2.y = sprite->data[1]; -} - -static void sub_805194C(u16 a0, u16 a1) -{ - if (gBerryBlenderData->field_140 < a0) - { - gBerryBlenderData->field_140 += 2; - sub_805197C(gBerryBlenderData->field_140, a1); - } -} - -static void sub_805197C(u16 a0, u16 a1) -{ - s32 var1, var2, var3, var4; - u16* vram; - - vram = (u16*)(VRAM + 0x6000); - var1 = (a0 * 64) / a1; - var2 = var1 / 8; - for (var4 = 0; var4 < var2; var4++) - { - vram[11 + var4] = 0x81E9; - vram[43 + var4] = 0x81F9; - } - var3 = var1 % 8; - if (var3 != 0) - { - vram[11 + var4] = var3 - 32287; - vram[43 + var4] = var3 - 32271; - var4++; - } - for (; var4 < 8; var4++) - { - vram[11 + var4] = 33249; - vram[43 + var4] = 33249 + 16; - } -} - -static u32 sub_8051A1C(u16 a0) -{ - return 360000 * a0 / 0x10000; -} - -static void sub_8051A3C(u16 a0) -{ - u8 i; - u8 palAdders[5]; - - u32 var = sub_8051A1C(a0); - if (gBerryBlenderData->max_RPM < var) - gBerryBlenderData->max_RPM = var; - for (i = 0; i < 5; i++) - { - palAdders[i] = var % 10; - var /= 10; - } - *((u16*)(VRAM + 0x6458)) = palAdders[4] + 0x8172; - *((u16*)(VRAM + 0x645A)) = palAdders[3] + 0x8172; - *((u16*)(VRAM + 0x645C)) = palAdders[2] + 0x8172; - *((u16*)(VRAM + 0x6460)) = palAdders[1] + 0x8172; - *((u16*)(VRAM + 0x6462)) = palAdders[0] + 0x8172; -} - -static void sub_8051AC8(s16* a0, u16 a1) -{ - if (*a0 == 0) - *a0 = (Random() % a1) - (a1 / 2); -} - -static void sub_8051AF4(s16* a0) -{ - if (*a0 < 0 ) - (*a0)++; - if (*a0 > 0 ) - (*a0)--; -} - -static void sub_8051B18(void) -{ - sub_8051AF4(&gBerryBlenderData->field_144); - sub_8051AF4(&gBerryBlenderData->field_146); -} - -static void sub_8051B40(s16* a0, u16 a1) -{ - s32 var; - if (a1 < 10) - var = 16; - else - var = 8; - if (*a0 == 0) - *a0 = (Random() % var) - (var / 2); - else - { - if (*a0 < 0) - (*a0)++; - if (*a0 > 0) - (*a0)--; - } -} - -static bool8 sub_8051B8C(void) -{ - if (gBerryBlenderData->framesToWait == 0) - { - gBerryBlenderData->field_144 = 0; - gBerryBlenderData->field_146 = 0; - } - gBerryBlenderData->framesToWait++; - sub_8051B40(&gBerryBlenderData->field_144, gBerryBlenderData->framesToWait); - sub_8051B40(&gBerryBlenderData->field_146, gBerryBlenderData->framesToWait); - if (gBerryBlenderData->framesToWait == 20) - { - gBerryBlenderData->field_144 = 0; - gBerryBlenderData->field_146 = 0; - return TRUE; - } - else - return FALSE; -} - -static void sub_8051C04(struct Sprite* sprite) -{ - sprite->pos2.x = -(gBerryBlenderData->field_144); - sprite->pos2.y = -(gBerryBlenderData->field_146); -} - -/*static*/ void Blender_TrySettingRecord(void) -{ - if (gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] < gBerryBlenderData->max_RPM) - gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] = gBerryBlenderData->max_RPM; -} - -bool8 Blender_PrintBlendingResults(void) -{ - u16 i; - - struct Pokeblock pokeblock; - u8 flavours[6]; - u8 text[2][10]; - u16 berryIDs[4]; // unused - - switch (gBerryBlenderData->field_0) - { - case 0: - gBerryBlenderData->field_0++; - gBerryBlenderData->framesToWait = 17; - break; - case 1: - gBerryBlenderData->framesToWait -= 10; - if (gBerryBlenderData->framesToWait < 0) - { - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - } - break; - case 2: - if (++gBerryBlenderData->framesToWait > 20) - { - for (i = 0; i < 3; i++) - DestroySprite(&gSprites[gBerryBlenderData->scoreIconIDs[i]]); - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - } - break; - case 3: - { - u8* textPtr; - u16 secondsPassed, minutes, seconds; - - Menu_DrawStdWindowFrame(4, 2, 25, 17); - sub_8072BD8(gOtherText_ResultsOfBlending, 5, 3, 160); - for (i = 0; i < gBerryBlenderData->playersNo; i++) - { - u8 place = gBerryBlenderData->playerPlaces[i]; - textPtr = text[0]; - - StringCopy(textPtr, gBerryBlenderData->blendedBerries[place].name); - ConvertInternationalString(textPtr, gLinkPlayers[place].language); -#ifdef ENGLISH - StringAppend(textPtr, gOtherText_Berry); -#else - de_sub_8073174(textPtr, gOtherText_Berry); -#endif - textPtr = gBerryBlenderData->stringVar; - textPtr = ConvertIntToDecimalString(textPtr, i + 1); - textPtr[0] = CHAR_SPACE; - textPtr[1] = CHAR_PERIOD; - textPtr[2] = CHAR_SPACE; - textPtr += 3; - textPtr = sub_8072C74(textPtr, gLinkPlayers[place].name, 88, 0); - sub_8072C74(textPtr, text[0], 157, 0); - Menu_PrintText(gBerryBlenderData->stringVar, 5, gUnknown_082165E9[gBerryBlenderData->playersNo] + (i * gUnknown_082165EE[gBerryBlenderData->playersNo])); - } - ConvertIntToDecimalStringN(text[0], gBerryBlenderData->max_RPM % 100, 2, 2); - textPtr = gBerryBlenderData->stringVar; - textPtr = StringCopy(textPtr, gOtherText_MaxSpeed); - textPtr = sub_8072C14(textPtr, gBerryBlenderData->max_RPM / 100, 121, 1); - -#ifdef ENGLISH - textPtr[0] = CHAR_SPACE; - textPtr[1] = CHAR_PERIOD; - textPtr[2] = CHAR_SPACE; - textPtr += 3; - textPtr = sub_8072C74(textPtr, text[0], 142, 1); -#else - *textPtr++ = CHAR_COMMA; - textPtr = sub_8072C74(textPtr, text[0], 136, 1); -#endif - StringCopy(textPtr, gOtherText_RPM); - Menu_PrintText(gBerryBlenderData->stringVar, 5, 13); - - secondsPassed = gBerryBlenderData->gameFrameTime / 60; - seconds = secondsPassed % 60; - minutes = secondsPassed / 60; - ConvertIntToDecimalStringN(text[0], minutes, 2, 2); - ConvertIntToDecimalStringN(text[1], seconds, 2, 2); - textPtr = gBerryBlenderData->stringVar; - textPtr = StringCopy(textPtr, gOtherText_RequiredTime); - -#ifdef ENGLISH - textPtr = sub_8072C74(textPtr, text[0], 102, 1); -#else - textPtr = sub_8072C74(textPtr, text[0], 99, 1); -#endif - textPtr = StringAppend(textPtr, gOtherText_Min); - - textPtr = sub_8072C74(textPtr, text[1], 136, 1); - StringCopy(textPtr, gOtherText_Sec); - - Menu_PrintText(gBerryBlenderData->stringVar, 5, 15); - - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - } - break; - case 4: - if (gMain.newKeys & A_BUTTON) - gBerryBlenderData->field_0++; - break; - case 5: - Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 14, 29, 19); - for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - { - if (gBerryBlenderData->chosenItemID[i] != 0) - berryIDs[i] = gBerryBlenderData->chosenItemID[i] - 133; - } - sub_8050760(); - Blender_CalculatePokeblock(gBerryBlenderData->blendedBerries, &pokeblock, gBerryBlenderData->playersNo, flavours, gBerryBlenderData->max_RPM); - Blender_PrintMadePokeblockString(&pokeblock, gBerryBlenderData->stringVar); - CreateTask(sub_8052BD0, 6); -#if DEBUG - ConvertIntToHexStringN(text[0], sub_8007E40(), 0, 4); - StringAppend(text[0], gUnknown_08216249); - StringAppend(gBerryBlenderData->stringVar, text[0]); -#endif - MenuPrintMessage(gBerryBlenderData->stringVar, 1, 15); - RemoveBagItem(gSpecialVar_ItemId, 1); - sub_810CA34(&pokeblock); - gBerryBlenderData->field_0++; - break; - case 6: - if (Menu_UpdateWindowText()) - { - Blender_TrySettingRecord(); - return TRUE; - } - break; - } - return FALSE; -} - -static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst) -{ - u8 text[12]; - u8 flavourLvl, feel; - - dst[0] = EOS; - StringCopy(dst, gPokeblockNames[pokeblock->color]); -#ifdef ENGLISH - StringAppend(dst, gOtherText_PokeBlockMade); -#else - de_sub_8073174(dst, gOtherText_PokeBlockMade); -#endif - StringAppend(dst, sNewLineString_0); - - flavourLvl = sub_810C9B0(pokeblock); - feel = sub_810C9E8(pokeblock); - - StringAppend(dst, gOtherText_BlockLevelIs); - ConvertIntToDecimalStringN(text, flavourLvl, 0, 3); - StringAppend(dst, text); - - StringAppend(dst, gOtherText_BlockFeelIs); - ConvertIntToDecimalStringN(text, feel, 0, 3); - StringAppend(dst, text); - - StringAppend(dst, gOtherText_Period); - StringAppend(dst, gUnknown_08216249); -} - -static void Blender_SortBasedOnPoints(u8* places, u8 playersNum, u32* scores) -{ - s32 i, j; - for (i = 0; i < playersNum; i++) - { - for (j = 0; j < playersNum; j++) - { - if (scores[places[i]] > scores[places[j]]) - { - u8 temp = places[i]; - places[i] = places[j]; - places[j] = temp; - } - } - } -} - -static void Blender_SortScores(void) -{ - u8 i; - u8 places[4]; - u32 points[4]; - - for (i = 0; i < gBerryBlenderData->playersNo; i++) - places[i] = i; - for (i = 0; i < gBerryBlenderData->playersNo; i++) - { - points[i] = 1000000 * gBerryBlenderData->scores[i][BLENDER_SCORE_BEST]; - points[i] += 1000 * gBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]; - points[i] += 1000 - gBerryBlenderData->scores[i][BLENDER_SCORE_MISS]; - } - Blender_SortBasedOnPoints(places, gBerryBlenderData->playersNo, points); - for (i = 0; i < gBerryBlenderData->playersNo; i++) - gBerryBlenderData->playerPlaces[i] = places[i]; -} - -static bool8 Blender_PrintBlendingRanking(void) -{ - u16 i; - switch (gBerryBlenderData->field_0) - { - case 0: - gBerryBlenderData->field_0++; - gBerryBlenderData->framesToWait = 255; - break; - case 1: - gBerryBlenderData->framesToWait -= 10; - if (gBerryBlenderData->framesToWait < 0) - { - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - } - break; - case 2: - if (++gBerryBlenderData->framesToWait > 20) - { - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - } - break; - case 3: - Menu_DrawStdWindowFrame(4, 2, 25, 17); - sub_8072BD8(gOtherText_Ranking, 5, 3, 160); - - gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST] = CreateSprite(&sSpriteTemplate_821645C, 140, 52, 0); - gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST]].callback = SpriteCallbackDummy; - StartSpriteAnim(&gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_BEST]], 3); - - gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_GOOD] = CreateSprite(&sSpriteTemplate_821645C, 164, 52, 0); - gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_GOOD]].callback = SpriteCallbackDummy; - - gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS] = CreateSprite(&sSpriteTemplate_821645C, 188, 52, 0); - gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS]].callback = SpriteCallbackDummy; - StartSpriteAnim(&gSprites[gBerryBlenderData->scoreIconIDs[BLENDER_SCORE_MISS]], 1); - - Blender_SortScores(); - - for (i = 0; i < gBerryBlenderData->playersNo; i++) - { - u8 place = gBerryBlenderData->playerPlaces[i]; - u8* txtPtr = gBerryBlenderData->stringVar; - - txtPtr[0] = EXT_CTRL_CODE_BEGIN; - txtPtr[1] = 0x13; - txtPtr[2] = 4; - txtPtr += 3; - - txtPtr = ConvertIntToDecimalString(txtPtr, i + 1); - - txtPtr[0] = CHAR_SPACE; - txtPtr[1] = CHAR_PERIOD; - txtPtr[2] = CHAR_SPACE; - txtPtr += 3; - - txtPtr = StringCopy(txtPtr, gLinkPlayers[place].name); - - txtPtr = sub_8072C14(txtPtr, gBerryBlenderData->scores[place][BLENDER_SCORE_BEST], 108, 1); - txtPtr = sub_8072C14(txtPtr, gBerryBlenderData->scores[place][BLENDER_SCORE_GOOD], 132, 1); - txtPtr = sub_8072C14(txtPtr, gBerryBlenderData->scores[place][BLENDER_SCORE_MISS], 156, 1); - - Menu_PrintText(gBerryBlenderData->stringVar, 5, i * gUnknown_082165F3[gBerryBlenderData->playersNo] + 8); - } - gBerryBlenderData->framesToWait = 0; - gBerryBlenderData->field_0++; - break; - case 4: - if (++gBerryBlenderData->framesToWait > 20) - gBerryBlenderData->field_0++; - break; - case 5: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - gBerryBlenderData->field_0++; - } - break; - case 6: - gBerryBlenderData->field_0 = 0; - return TRUE; - } - return FALSE; -} - -// debug menu goes here - -void unref_sub_80524BC(void) -{ - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetTasks(); - SetVBlankCallback(VBlankCB1_BerryBlender); - Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); - InitMenuWindow(&gWindowTemplate_81E6CE4); - SeedRng(gMain.vblankCounter1); - REG_DISPCNT = 0x1540; - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - sBlenderDebug.BPM = 8000; - sBlenderDebug.field_10++; - SetMainCallback2(sub_8052AF8); -} - -static void BlenderDebug_PrintBerryData(void) -{ - u8 text[128]; - u8 i; - - StringCopy(text, sText_BPM); - Menu_PrintText(text, 2, 0); - - ConvertIntToDecimalStringN(text, sBlenderDebug.BPM / 100, 2, 3); - Menu_PrintText(text, 6, 0); - - for (i = 0; i < 4; i++) - { - u8 var; - - if (sBlenderDebug.cursorPos == i) - { - text[0] = 0xEF; - CopyItemName(sBlenderDebug.berries[i] + 133, &text[1]); - } - else - { - CopyItemName(sBlenderDebug.berries[i] + 133, &text[0]); - text[6] = CHAR_SPACE; - text[7] = EOS; - } - var = (i * 3) + 3; - Menu_PrintText(text, 2, var); - - ConvertIntToDecimalStringN(&text[0], gBerries[sBlenderDebug.berries[i]].spicy, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToDecimalStringN(&text[3], gBerries[sBlenderDebug.berries[i]].dry, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToDecimalStringN(&text[6], gBerries[sBlenderDebug.berries[i]].sweet, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToDecimalStringN(&text[9], gBerries[sBlenderDebug.berries[i]].bitter, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToDecimalStringN(&text[12], gBerries[sBlenderDebug.berries[i]].sour, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToDecimalStringN(&text[15], gBerries[sBlenderDebug.berries[i]].smoothness, 2, 2); - - text[17] = EOS; - Menu_PrintText(text, 7, var); - } - if (sBlenderDebug.pokeblock.color != 0) - { - StringCopy(text, gPokeblockNames[sBlenderDebug.pokeblock.color]); - Menu_PrintText(text, 2, 15); - - ConvertIntToHexStringN(&text[0], sBlenderDebug.spicy, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToHexStringN(&text[3], sBlenderDebug.dry, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToHexStringN(&text[6], sBlenderDebug.sweet, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToHexStringN(&text[9], sBlenderDebug.bitter, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToHexStringN(&text[12], sBlenderDebug.sour, 2, 2); - StringAppend(text, sText_Space); - - ConvertIntToHexStringN(&text[15], sBlenderDebug.feel, 2, 2); - - text[17] = EOS; - Menu_PrintText(text, 7, 17); - } -} - -static void sub_80527BC(void) -{ - u8 text[70]; - u8 buffer[10]; - u16 i; - - if (gUnknown_020297DC == 1) - { - u16 j; - for (j = 0; j < 10; j++) - gUnknown_03004840[j] = 0; - gUnknown_03004830 = Random(); - gUnknown_020297E0 = 0; - gUnknown_020297DC = 2; - for (i = 0; i < 200; i++) - gSharedMem[i] = 0; - gUnknown_020297E8 = 0; - } - for (i = 0; i < 100; i++) - { - if (((Random() >> 15) & 1) == gUnknown_020297E8) - gUnknown_020297E0++; - else - { - u16* ewramPtr = ((u16*)(gSharedMem)); - ewramPtr[gUnknown_020297E4] = gUnknown_020297E0; - gUnknown_020297E4++; - gUnknown_020297E0 = 0; - gUnknown_020297E8 ^= 1; - } - } - text[0] = EOS; - - ConvertIntToHexStringN(buffer, gUnknown_03004830, 2, 8); - StringAppend(text, buffer); - StringAppend(text, sText_Space); - - ConvertIntToHexStringN(buffer, gUnknown_020297E0, 2, 8); - StringAppend(text, buffer); - StringAppend(text, sNewLineString_1); - - if (gUnknown_020297DC == 3) - { - ConvertIntToHexStringN(buffer, gUnknown_020297E4, 2, 16); - StringAppend(text, buffer); - gUnknown_020297DC = 0; - } - - Menu_PrintText(text, 2, 15); -} - -static void sub_8052918(void) -{ - if (gMain.newKeys & R_BUTTON) - { - sBlenderDebug.BPM += 1000; - if (sBlenderDebug.BPM > 30000) - sBlenderDebug.BPM = 1000; - sBlenderDebug.field_10++; - } - if (gMain.newKeys & L_BUTTON) - { - sBlenderDebug.BPM -= 1000; - if (sBlenderDebug.BPM < 0) - sBlenderDebug.BPM = 30000; - sBlenderDebug.field_10++; - } - if (gMain.newKeys & DPAD_UP) - { - sBlenderDebug.cursorPos -= 1; - if (sBlenderDebug.cursorPos < 0) - sBlenderDebug.cursorPos = 3; - sBlenderDebug.field_10++; - } - if (gMain.newKeys & DPAD_DOWN) - { - sBlenderDebug.cursorPos += 1; - if (sBlenderDebug.cursorPos > 3) - sBlenderDebug.cursorPos = 0; - sBlenderDebug.field_10++; - } - if (gMain.newKeys & DPAD_LEFT) - { - if (--sBlenderDebug.berries[sBlenderDebug.cursorPos] < 0) - sBlenderDebug.berries[sBlenderDebug.cursorPos] = 42; - sBlenderDebug.field_10++; - } - if (gMain.newKeys & DPAD_RIGHT) - { - if (++sBlenderDebug.berries[sBlenderDebug.cursorPos] > 42) - sBlenderDebug.berries[sBlenderDebug.cursorPos] = 0; - sBlenderDebug.field_10++; - } - if (gMain.newKeys & A_BUTTON) - { - u16 berryIDs[4]; - struct BlenderBerry berries[4]; - - u16 i, notEnigma = 0; - for (i = 0; i < 4; i++) - { - if (sBlenderDebug.berries[i] != 42) - { - notEnigma++; - berryIDs[i] = sBlenderDebug.berries[i]; - Blender_CopyBerryData(&berries[i], sBlenderDebug.berries[i] + 133); - } - else - break; - } - if (notEnigma > 1) - { - BlenderDebug_CalculatePokeblock(berries, &sBlenderDebug.pokeblock, notEnigma, &sBlenderDebug.spicy, sBlenderDebug.BPM); - sBlenderDebug.field_10++; - } - else - sBlenderDebug.pokeblock.color = 0xFF; - } - if (sBlenderDebug.field_10) - { - BlenderDebug_PrintBerryData(); - sBlenderDebug.field_10 = 0; - } - if (gMain.newKeys & SELECT_BUTTON && gUnknown_020297DC == 0) - { - gUnknown_020297DC++; - gUnknown_020297E0 = 0; - SeedRng(gMain.vblankCounter1); - } - if (gUnknown_020297DC != 0) - sub_80527BC(); -} - -static void sub_8052AF8(void) -{ - sub_8052918(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -// debug menu ends -// blender record window begins - -void ShowBerryBlenderRecordWindow(void) -{ - u8 text[30]; - s32 i; - - Menu_DrawStdWindowFrame(6, 3, 23, 16); - Menu_PrintText(gMultiText_BerryBlenderMaxSpeedRecord, 8, 4); - Menu_PrintText(gMultiText_2P3P4P, 8, 9); - - for (i = 0; i < 3; i++) - { - u32 record = gSaveBlock1.berryBlenderRecords[i]; - u8* txtPtr = sub_8072C14(text, record / 100, 18, 1); - -#ifdef ENGLISH - txtPtr[0] = CHAR_SPACE; - txtPtr[1] = CHAR_PERIOD; - txtPtr[2] = CHAR_SPACE; - txtPtr += 3; -#else - *txtPtr++ = CHAR_COMMA; -#endif - - txtPtr = ConvertIntToDecimalStringN(txtPtr, record % 100, 2, 2); - StringAppend(txtPtr, gOtherText_RPM); - Menu_PrintText(text, 15, i * 2 + 9); - } -} - -static void sub_8052BD0(u8 taskID) -{ - if (gTasks[taskID].data[0] == 0) - { - PlayFanfare(BGM_FANFA1); - gTasks[taskID].data[0]++; - } - if (IsFanfareTaskInactive()) - { - PlayBGM(gBerryBlenderData->field_178); - DestroyTask(taskID); - } -} diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c deleted file mode 100644 index 8c3f9885d..000000000 --- a/src/scene/cable_car.c +++ /dev/null @@ -1,1077 +0,0 @@ - -// Includes -#include "global.h" -#include "ewram.h" -#include "overworld.h" -#include "palette.h" -#include "random.h" -#include "main.h" -#include "menu.h" -#include "script.h" -#include "task.h" -#include "sound.h" -#include "graphics.h" -#include "constants/songs.h" -#include "decompress.h" -#include "field_weather.h" -#include "event_object_movement.h" -#include "scanline_effect.h" -#include "event_data.h" -#include "cable_car_util.h" -#include "constants/map_objects.h" -#include "constants/weather.h" - -extern u8 (*gMenuCallback)(void); - -// Static type declarations - -struct CableCarEwramStruct1 -{ - u8 unk_0000; - u8 unk_0001; - u8 unk_0002; - u8 unk_0003; - u16 unk_0004; - u16 unk_0006; - u8 unk_0008; - u8 unk_0009; - u8 filler_000a[2]; - u8 unk_000c; - u8 unk_000d; - u8 filler_0000e[6]; - u8 unk_0014; - u8 unk_0015; - u8 unk_0016; - u8 unk_0017; - u8 unk_0018; - u8 unk_0019; - u8 unk_001a; - u8 unk_001b; - u8 unk_001c; - u8 unk_001d; - u8 unk_001e; - u8 unk_001f; - u8 unk_0020; - u16 unk_0022[9][12]; - u8 filler_00fa[2]; - u16 unk_00fc[0x20][0x20]; - u16 unk_08fc[0x20][0x20]; -}; // size 0x10FC - -struct CableCarEwramStruct2 -{ - /* 0x000 */ u16 mtChimneyTilemap[0xb4]; - /* 0x168 */ u16 treeTilemap[0x1e0]; - /* 0x528 */ u16 mountainTilemap[0x258]; - /* 0x9d8 */ u16 pylonStemTilemap[0x628]; // size not actually known -}; - -// Static RAM declarations - -EWRAM_DATA struct CableCarEwramStruct1 *sCableCarPtr = NULL; -EWRAM_DATA u8 gUnknown_02039278 = 0; -EWRAM_DATA u8 gUnknown_02039279 = 0; -EWRAM_DATA u8 gUnknown_0203927A = 0; -EWRAM_DATA u8 gUnknown_0203927B = 0; -EWRAM_DATA u8 gUnknown_0203927C = 0; -EWRAM_DATA u8 gUnknown_0203927D = 0; -EWRAM_DATA u32 filler_02039280 = 0; - -// Static ROM declarations - -static void CableCarMainCallback_Setup(void); -static void CableCarMainCallback_Run(void); -static void sub_8123878(u8 taskId); -static void sub_81239E4(u8 taskId); -static void sub_8123AF8(u8 taskId); -static void CableCarVblankCallback(void); -static void nullsub_76(struct Sprite *sprite); -static void sub_8123CB8(struct Sprite *sprite); -static void sub_8123EB8(struct Sprite *sprite); -static void sub_8123F44(struct Sprite *sprite); -static void sub_8123FBC(u8); -static void LoadSprites(void); -static void sub_812453C(void); -static void sub_8124598(void); -static void sub_81245F4(void); -static void sub_812476C(void); -static void sub_81248AC(u8); - -// .rodata - -#if DEBUG - -void debug_sub_8138D74(void); -void debug_sub_8138D8C(void); -u8 debug_sub_8138C14(void); -u8 debug_sub_8138C34(void); -u8 debug_sub_810CD9C(void); - -const u8 Str_842DBD0[] = _("CABLE CAR U"); -const u8 Str_842DBDC[] = _("CABLE CAR D"); -const u8 Str_842DBE8[] = _("ROULETTE1"); -const u8 Str_842DBF2[] = _("ROULETTE3"); -const u8 Str_842DBFC[] = _("View a MAIL"); - -const struct MenuAction gUnkDebug4Menu[] = -{ - {Str_842DBD0, (u8 (*)(void))debug_sub_8138D74}, // why do these two functions have a different prototype? - {Str_842DBDC, (u8 (*)(void))debug_sub_8138D8C}, - {Str_842DBE8, debug_sub_8138C14}, - {Str_842DBF2, debug_sub_8138C34}, - {Str_842DBFC, debug_sub_810CD9C}, -}; - -#endif - -static const u8 gCableCarMtChimneyTilemap[] = INCBIN_U8("graphics/misc/cable_car_mt_chimney_map.bin.lz"); - -static const u8 gCableCarTreeTilemap[] = INCBIN_U8("graphics/misc/cable_car_tree_map.bin.lz"); - -static const u8 gCableCarMountainTilemap[] = INCBIN_U8("graphics/misc/cable_car_mountain_map.bin.lz"); - -static const u16 gCableCarPylonHookTilemapEntries[] = { - 0x3000, - 0x3001, - 0x3002, - 0x3003, - 0x3004, - 0x3005, - 0x3006, - 0x3007, - 0x3008, - 0x3009 -}; - -static const u8 gCableCarPylonStemTilemap[] = INCBIN_U8("graphics/misc/cable_car_pylon_stem_map.bin.lz"); - -static const struct CompressedSpriteSheet gUnknown_08401CF8[] = { - { gCableCar_Gfx, 0x800, 1 }, - { gCableCarDoor_Gfx, 0x40, 2 }, - { gCableCarCord_Gfx, 0x80, 3 }, - { } -}; -static const struct SpritePalette gUnknown_08401D18[] = { - { gCableCar_Pal, 1 }, - { } -}; - -static const struct OamData gOamData_8401D28 = { - .affineMode = ST_OAM_AFFINE_DOUBLE, - .size = 3, - .priority = 2 -}; - -static const struct OamData gOamData_8401D30 = { - .affineMode = ST_OAM_AFFINE_DOUBLE, - .shape = ST_OAM_H_RECTANGLE, - .priority = 2 -}; - -static const struct OamData gOamData_8401D38 = { - .affineMode = ST_OAM_AFFINE_DOUBLE, - .size = 1, - .priority = 2 -}; - -static const struct SpriteTemplate gSpriteTemplate_8401D40[] = -{ - { - .tileTag = 1, - .paletteTag = 1, - .oam = &gOamData_8401D28, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8123CB8, - }, - { - .tileTag = 2, - .paletteTag = 1, - .oam = &gOamData_8401D30, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8123CB8, - }, - { - .tileTag = 3, - .paletteTag = 1, - .oam = &gOamData_8401D38, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_76, - } -}; - -#if DEBUG - -extern u8 unk_203955C; - -extern const u8 MauvilleCity_GameCorner_EventScript_1C407E[]; -extern const u8 MauvilleCity_GameCorner_EventScript_1C40AC[]; - -u8 debug_sub_8138C14(void) -{ - unk_203955C = 1; - ScriptContext1_SetupScript(MauvilleCity_GameCorner_EventScript_1C407E); - CloseMenu(); - return 1; -} - -u8 debug_sub_8138C34(void) -{ - unk_203955C = 1; - ScriptContext1_SetupScript(MauvilleCity_GameCorner_EventScript_1C40AC); - CloseMenu(); - return 1; -} - -u8 debug_sub_8138C54(void) -{ - if (gMain.newKeys == DPAD_UP) - Menu_MoveCursor(-1); - if (gMain.newKeys == DPAD_DOWN) - Menu_MoveCursor(1); - if (gMain.newKeys == A_BUTTON) - return gUnkDebug4Menu[Menu_GetCursorPos()].func(); - if (gMain.newKeys == (R_BUTTON | A_BUTTON)) - { - gSpecialVar_0x8004 = 1; - return gUnkDebug4Menu[Menu_GetCursorPos()].func(); - } - if (gMain.newKeys == B_BUTTON) - { - CloseMenu(); - return 1; - } - return 0; -} - -u8 debug_sub_8138CC4(void) -{ - gSpecialVar_0x8004 = 0; - Menu_EraseScreen(); - Menu_DrawStdWindowFrame(19, 0, 29, 12); - Menu_PrintItems(20, 1, 5, gUnkDebug4Menu); - InitMenu(0, 20, 1, 5, 0, 8); - gMenuCallback = debug_sub_8138C54; - return 0; -} - -#endif - -static void CableCarTask1(u8 taskId) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(CableCarMainCallback_Setup); - DestroyTask(taskId); - } -} - -void CableCar(void) -{ - ScriptContext2_Enable(); - CreateTask(CableCarTask1, 1); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); -} - -#if DEBUG - -void debug_sub_8138D74(void) -{ - gSpecialVar_0x8004 = 0; - CloseMenu(); - CableCar(); -} - -void debug_sub_8138D8C(void) -{ - gSpecialVar_0x8004 = 1; - CloseMenu(); - CableCar(); -} - -#endif - -static void CableCarMainCallback_Setup(void) -{ - u8 i; - u16 imebak; - - switch (gMain.state) - { - case 0: - default: - SetVBlankCallback(NULL); - ScanlineEffect_Stop(); - DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000); - DmaFill32Defvars(3, 0, OAM, OAM_SIZE); - DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); - sCableCarPtr = eCableCar1; - DmaFill16Large(3, 0, eCableCar1, 0x10FC, 0x1000); - gMain.state++; - break; - case 1: - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - ResetPaletteFade(); - StartWeather(); - for (i = 0; i < 20; i++) - { - gWeatherPtr->sprites.s2.ashSprites[i] = NULL; - } - InitMapMusic(); - ResetMapMusic(); - gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0; - gMain.state++; - break; - case 2: - for (i = 0; i < 3; i++) - { - LoadCompressedObjectPic(&gUnknown_08401CF8[i]); - } - LoadSpritePalettes(gUnknown_08401D18); - LZDecompressWram(gCableCarMtChimneyTilemap, eCableCar2->mtChimneyTilemap); - LZDecompressWram(gCableCarTreeTilemap, eCableCar2->treeTilemap); - LZDecompressWram(gCableCarMountainTilemap, eCableCar2->mountainTilemap); - LZDecompressWram(gCableCarPylonStemTilemap, eCableCar2->pylonStemTilemap); - LoadPalette(gCableCarBG_Pal, 0, 0x80); - LZ77UnCompVram(gCableCarBG_Gfx, (u16 *)BG_VRAM); - gMain.state++; - break; - case 3: - LoadSprites(); - RunTasks(); - gMain.state++; - break; - case 4: - if (sCableCarPtr->unk_0002 == 7) - { - gMain.state++; - } - else if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL) - { - for (i = 0; i < 20; i++) - { - if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) - { - gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; - } - } - gMain.state++; - } - break; - case 5: - CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(29), eCableCar2->treeTilemap, 0, 17, 32, 15); - CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(30), eCableCar2->mountainTilemap, 0, 0, 30, 20); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 20); - gMain.state++; - break; - case 6: - sub_81248AC(gSpecialVar_0x8004); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x48, 0, 14, 12, 3); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x6C, 12, 17, 12, 3); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x90, 24, 20, 12, 3); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 0, 17, 12, 3); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0, 20, 12, 3); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 12, 20, 12, 3); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 12, 23, 12, 3); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 24, 23, 12, 3); - gMain.state++; - break; - case 7: - BeginNormalPaletteFade(-1, 3, 16, 0, 0); - FadeInNewBGM(BGM_ROPEWAY, 1); - sub_8123FBC(1); - gMain.state++; - break; - case 8: - imebak = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = imebak; - SetVBlankCallback(CableCarVblankCallback); - SetMainCallback2(CableCarMainCallback_Run); - CreateTask(sub_8123878, 0); - if (gSpecialVar_0x8004 == 0) - { - sCableCarPtr->unk_0000 = CreateTask(sub_81239E4, 1); - } - else - { - sCableCarPtr->unk_0000 = CreateTask(sub_8123AF8, 1); - } - break; - } -} - -static void CableCarMainCallback_Run(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - MapMusicMain(); -} - -static void sub_8123740(void) -{ - u8 i; - - i = 0; - sub_8123FBC(0); - gSpriteCoordOffsetX = 0; - sub_807C9B4(WEATHER_NONE); - for (; i < 20; i++) - { - gWeatherPtr->sprites.s2.ashSprites[i] = NULL; - } - ResetTasks(); - ResetSpriteData(); - ResetPaletteFade(); - DmaFill32Large(3, 0, gSharedMem, 0x20000, 0x1000); - sCableCarPtr = NULL; - DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000); - DmaFill32Defvars(3, 0, OAM, OAM_SIZE); - DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); - warp_in(); - gFieldCallback = NULL; - SetMainCallback2(CB2_LoadMap); -} - -static void sub_8123878(u8 taskId) -{ - u8 i; - - i = 0; - sCableCarPtr->unk_0006++; - switch (sCableCarPtr->unk_0001) - { - case 0: - if (sCableCarPtr->unk_0006 == sCableCarPtr->unk_0004) - { - ChangeWeather(sCableCarPtr->unk_0002); - sCableCarPtr->unk_0001 = 1; - } - break; - case 1: - switch (sCableCarPtr->unk_0002) - { - case 7: - if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL && gWeatherPtr->sprites.s2.ashSprites[0]->oam.priority != 0) - { - for (; i < 20; i++) - { - if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) - { - gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; - } - } - sCableCarPtr->unk_0001 = 2; - } - break; - case 2: - if (gWeatherPtr->currWeather == 2) - { - sCableCarPtr->unk_0001 = 2; - } - else if (sCableCarPtr->unk_0006 >= sCableCarPtr->unk_0004 + 8) - { - for (; i < 20; i++) - { - if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL) - { - gWeatherPtr->sprites.s2.ashSprites[i]->invisible ^= TRUE; - } - } - } - break; - } - break; - case 2: - if (sCableCarPtr->unk_0006 == 570) - { - sCableCarPtr->unk_0001 = 3; - BeginNormalPaletteFade(-1, 3, 0, 16, 0); - FadeOutBGM(4); - } - break; - case 3: - if (!gPaletteFade.active) - { - sCableCarPtr->unk_0001 = 255; - } - break; - case 255: - SetVBlankCallback(NULL); - DestroyTask(taskId); - DestroyTask(sCableCarPtr->unk_0000); - SetMainCallback2(sub_8123740); - break; - } -} - -static void sub_81239E4(u8 taskId) -{ - if (sCableCarPtr->unk_0001 != 255) - { - sCableCarPtr->unk_0014--; - if ((sCableCarPtr->unk_0006 % 2) == 0) - { - sCableCarPtr->unk_0015--; - } - if ((sCableCarPtr->unk_0006 % 8) == 0) - { - sCableCarPtr->unk_000c--; - sCableCarPtr->unk_000d--; - } - switch (sCableCarPtr->unk_0014) - { - case 175: - CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10); - break; - case 40: - CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 3, 0, 2, 2); - break; - case 32: - CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 1, 2); - break; - case 16: - CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2); - CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30); - sCableCarPtr->unk_0015 = 64; - break; - } - } - sub_812453C(); - gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 1) % 128; -} - -static void sub_8123AF8(u8 taskId) -{ - if (sCableCarPtr->unk_0001 != 255) - { - sCableCarPtr->unk_0014++; - if ((sCableCarPtr->unk_0006 % 2) == 0) - { - sCableCarPtr->unk_0015++; - } - if ((sCableCarPtr->unk_0006 % 8) == 0) - { - sCableCarPtr->unk_000c++; - sCableCarPtr->unk_000d++; - } - switch (sCableCarPtr->unk_0014) - { - case 176: - CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30); - break; - case 16: - CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 3, 2); - CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10); - sCableCarPtr->unk_0015 = 192; - break; - case 32: - sCableCarPtr->unk_08fc[0][2] = (gCableCarPylonHookTilemapEntries + 2)[0]; - sCableCarPtr->unk_08fc[0][3] = (gCableCarPylonHookTilemapEntries + 2)[1]; - sCableCarPtr->unk_08fc[1][2] = (gCableCarPylonHookTilemapEntries + 2)[5]; - sCableCarPtr->unk_08fc[1][3] = (gCableCarPylonHookTilemapEntries + 2)[6]; - break; - case 40: - sCableCarPtr->unk_08fc[0][4] = (gCableCarPylonHookTilemapEntries + 4)[0]; - sCableCarPtr->unk_08fc[1][4] = (gCableCarPylonHookTilemapEntries + 4)[5]; - break; - } - } - sub_8124598(); - if (sCableCarPtr->unk_0006 < sCableCarPtr->unk_0004) { - gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 247) % 248; - } - else - { - gWeatherPtr->unknown_6FC = (gWeatherPtr->unknown_6FC + 247) % 248; - } -} - -static void CableCarVblankCallback(void) -{ - DmaCopy16(3, sCableCarPtr->unk_00fc, BG_SCREEN_ADDR(28), 0x800); - DmaCopy16(3, sCableCarPtr->unk_08fc, BG_SCREEN_ADDR(31), 0x800); - REG_BG3HOFS = sCableCarPtr->unk_0014; - REG_BG3VOFS = sCableCarPtr->unk_0015; - REG_BG1HOFS = sCableCarPtr->unk_000c; - REG_BG1VOFS = sCableCarPtr->unk_000d; - REG_BG0HOFS = sCableCarPtr->unk_0008; - REG_BG0VOFS = sCableCarPtr->unk_0009; - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void nullsub_76(struct Sprite *sprite) -{ - -} - -static void sub_8123CB8(struct Sprite *sprite) -{ - if (sCableCarPtr->unk_0001 != 255) - { - if (gSpecialVar_0x8004 == 0) - { - sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); - sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); - } - else - { - sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); - sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); - } - } -} - -static void sub_8123D98(struct Sprite *sprite) -{ - if (sCableCarPtr->unk_0001 != 255) - { - if (gSpecialVar_0x8004 == 0) - { - sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); - sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); - } - else - { - sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); - sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006)); - } - switch (sprite->data[2]) - { - case 0: - sprite->pos2.y = 17; - if (sprite->data[3] ++ > 9) - { - sprite->data[3] = 0; - sprite->data[2] ++; - } - break; - default: - sprite->pos2.y = 16; - if (sprite->data[3] ++ > 9) - { - sprite->data[3] = 0; - sprite->data[2] = 0; - } - break; - } - } -} - -static void sub_8123EB8(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - { - sprite->pos1.x += 2 * sprite->centerToCornerVecX; - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - } - if (++sprite->data[0] >= sprite->data[2]) - { - switch (sprite->data[1]) - { - case 0: - sprite->pos1.x++; - if ((sprite->data[0] % 4) == 0) - { - sprite->pos1.y++; - } - break; - case 1: - if ((sprite->data[0] % 2) != 0) - { - sprite->pos1.x++; - if ((sprite->pos1.x % 4) == 0) - { - sprite->pos1.y++; - } - } - break; - } - if (sprite->pos1.y > 0xa0) - { - DestroySprite(sprite); - } - } -} - -static void sub_8123F44(struct Sprite *sprite) -{ - if (sprite->data[0] == 0) - { - sprite->pos1.y += 16 + sprite->centerToCornerVecY; - } - if (++sprite->data[0] >= sprite->data[2]) - { - switch (sprite->data[1]) - { - case 0: - sprite->pos1.x--; - if ((sprite->data[0] % 4) == 0) - { - sprite->pos1.y--; - } - break; - case 1: - if ((sprite->data[0] % 2) != 0) - { - sprite->pos1.x--; - if ((sprite->pos1.x % 4) == 0) - { - sprite->pos1.y--; - } - } - break; - } - if (sprite->pos1.y < 0x50) - { - DestroySprite(sprite); - } - } -} - -static void sub_8123FBC(bool8 which) -{ - switch (which) - { - case FALSE: - default: - REG_WININ = 0; - REG_WINOUT = 0; - REG_WIN0H = 0; - REG_WIN1H = 0; - REG_WIN0V = 0; - REG_WIN1V = 0; - REG_DISPCNT = 0; - REG_BG3CNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BLDCNT = 0; - break; - case TRUE: - REG_WININ = 0; - REG_WINOUT = 0; - REG_WIN0H = 0; - REG_WIN1H = 0; - REG_WIN0V = 0; - REG_WIN1V = 0; - if (gSpecialVar_0x8004 == 0) - { - sCableCarPtr->unk_0014 = 0xb0; - sCableCarPtr->unk_0015 = 0x10; - sCableCarPtr->unk_000c = 0x00; - sCableCarPtr->unk_000d = 0x50; - sCableCarPtr->unk_0009 = 0; - sCableCarPtr->unk_0009 = 0; - } - else - { - sCableCarPtr->unk_0014 = 0x60; - sCableCarPtr->unk_0015 = 0xe8; - sCableCarPtr->unk_000c = 0x00; - sCableCarPtr->unk_000d = 0x04; - sCableCarPtr->unk_0009 = 0; - sCableCarPtr->unk_0009 = 0; - } - REG_BG3HOFS = sCableCarPtr->unk_0014; - REG_BG3VOFS = sCableCarPtr->unk_0015; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = sCableCarPtr->unk_000c; - REG_BG1VOFS = sCableCarPtr->unk_000d; - REG_BG0HOFS = sCableCarPtr->unk_0008; - REG_BG0VOFS = sCableCarPtr->unk_0009; - REG_BG0CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_WRAP; - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29) | BGCNT_WRAP; - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(30) | BGCNT_WRAP; - REG_BG3CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_WRAP; - REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - REG_BLDCNT = 0x3f00; - break; - } -} - -static void LoadSprites(void) -{ - u8 spriteId; - u8 i; - - u8 playerGraphicsIds[2] = { - MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, - MAP_OBJ_GFX_RIVAL_MAY_NORMAL - }; - u16 rval = Random(); - u8 hikerGraphicsIds[4] = { - MAP_OBJ_GFX_HIKER, - MAP_OBJ_GFX_CAMPER, - MAP_OBJ_GFX_PICNICKER, - MAP_OBJ_GFX_POOCHYENA - }; - s16 hikerCoords[2][2] = { - { 0, 80 }, - { 240, 146 } - }; - u8 hikerMovementDelayTable[4] = { - 0, - 60, - 120, - 170 - }; - void (*callbacks[2])(struct Sprite *) = { - sub_8123EB8, - sub_8123F44 - }; - - switch (gSpecialVar_0x8004) - { - case 0: - default: - spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0xc8, 0x49, 0x66); - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].oam.priority = 2; - gSprites[spriteId].pos2.x = 0x08; - gSprites[spriteId].pos2.y = 0x10; - gSprites[spriteId].data[0] = 0xc8; - gSprites[spriteId].data[1] = 0x49; - } - spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0xb0, 0x2b, 0x67); - gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; - gSprites[spriteId].data[0] = 0xb0; - gSprites[spriteId].data[1] = 0x2b; - spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0xc8, 0x63, 0x65); - gSprites[spriteId].pos2.x = 8; - gSprites[spriteId].pos2.y = 4; - gSprites[spriteId].data[0] = 0xc8; - gSprites[spriteId].data[1] = 0x63; - sCableCarPtr->unk_0002 = 7; - sCableCarPtr->unk_0004 = 0x15e; - sub_807C9B4(WEATHER_SUNNY); - break; - case 1: - CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0x18, 0x1a, 0x0c, 0x03); - spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0x80, 0x27, 0x66); - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].oam.priority = 2; - gSprites[spriteId].pos2.x = 0x08; - gSprites[spriteId].pos2.y = 0x10; - gSprites[spriteId].data[0] = 0x80; - gSprites[spriteId].data[1] = 0x27; - } - spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0x68, 0x09, 0x67); - gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; - gSprites[spriteId].data[0] = 0x68; - gSprites[spriteId].data[1] = 0x09; - spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0x80, 0x41, 0x65); - gSprites[spriteId].pos2.x = 8; - gSprites[spriteId].pos2.y = 4; - gSprites[spriteId].data[0] = 0x80; - gSprites[spriteId].data[1] = 0x41; - sCableCarPtr->unk_0002 = 2; - sCableCarPtr->unk_0004 = 0x109; - sub_807C9B4(WEATHER_ASH); - break; - } - for (i = 0; i < 9; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_8401D40[2], 16 * i + 0x60, 8 * i - 8, 0x68); - gSprites[spriteId].pos2.x = 8; - gSprites[spriteId].pos2.y = 8; - } - if ((rval % 64) == 0) - { - spriteId = AddPseudoFieldObject(hikerGraphicsIds[rval % 3], callbacks[gSpecialVar_0x8004], hikerCoords[gSpecialVar_0x8004][0], hikerCoords[gSpecialVar_0x8004][1], 0x6a); - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].oam.priority = 2; - gSprites[spriteId].pos2.x = -gSprites[spriteId].centerToCornerVecX; - gSprites[spriteId].pos2.y = -gSprites[spriteId].centerToCornerVecY; - if (gSpecialVar_0x8004 == 0) - { - if (rval % 2) - { - StartSpriteAnim(&gSprites[spriteId], 6); - gSprites[spriteId].data[1] = 1; - gSprites[spriteId].pos1.y += 2; - } - else - { - StartSpriteAnim(&gSprites[spriteId], 7); - gSprites[spriteId].data[1] = 0; - } - } - else - { - if (rval % 2) - { - StartSpriteAnim(&gSprites[spriteId], 7); - gSprites[spriteId].data[1] = 1; - gSprites[spriteId].pos1.y += 2; - } - else - { - StartSpriteAnim(&gSprites[spriteId], 6); - gSprites[spriteId].data[1] = 0; - } - } - gSprites[spriteId].data[2] = hikerMovementDelayTable[rval % 4]; - } - } -} - -static void sub_812446C(void) -{ - u8 i; - u8 j; - u8 k; - u8 offset; - - for (i = 0, k = 0, offset = 0x24 * (sCableCarPtr->unk_001b + 2); i < 3; i++) - { - for (j = 0; j < 12; j++) - { - sCableCarPtr->unk_0022[i][j] = *(eCableCar2->mtChimneyTilemap + (offset++)); - sCableCarPtr->unk_0022[i + 3][j] = eCableCar2->mtChimneyTilemap[k]; - sCableCarPtr->unk_0022[i + 6][j] = (eCableCar2->mtChimneyTilemap + 0x24)[k]; - k++; - } - } - sCableCarPtr->unk_001b = (sCableCarPtr->unk_001b + 1) % 3; -} - -static void sub_812453C(void) -{ - sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60; - sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f - sCableCarPtr->unk_001d; - sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 - sCableCarPtr->unk_001e; - sCableCarPtr->unk_001d++; - if ((sCableCarPtr->unk_001d % 4) == 0) - { - sCableCarPtr->unk_001e++; - } - if (sCableCarPtr->unk_001d > 16) - { - sub_81245F4(); - } -} - -static void sub_8124598(void) -{ - sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60; - sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f + sCableCarPtr->unk_001d; - sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 + sCableCarPtr->unk_001e; - sCableCarPtr->unk_001d++; - if ((sCableCarPtr->unk_001d % 4) == 0) - { - sCableCarPtr->unk_001e++; - } - if (sCableCarPtr->unk_001d > 16) - { - sub_812476C(); - } -} - -static void sub_81245F4(void) -{ - u8 i = 0; - - sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0; - sCableCarPtr->unk_001f = sCableCarPtr->unk_0008; - sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009; - sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 30) % 32; - sCableCarPtr->unk_0018 -= 2; - gUnknown_0203927A = (sCableCarPtr->unk_001a + 23) % 32; - for (i = 0; i < 9; i++) - { - gUnknown_02039278 = sCableCarPtr->unk_0019; - gUnknown_02039279 = (gUnknown_0203927A + i) % 32; - sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018]; - gUnknown_02039278 = (gUnknown_02039278 + 1) % 32; - sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1]; - } - gUnknown_02039278 = (sCableCarPtr->unk_0019 + 30) % 32; - CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, gUnknown_02039278, 0, 2, 32); - if (sCableCarPtr->unk_0018 == 0) - { - sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 29) % 32; - sCableCarPtr->unk_0018 = 12; - sub_812446C(); - gUnknown_02039278 = (sCableCarPtr->unk_001a + 1) % 32; - CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, 0, gUnknown_02039278, 32, 9); - } -} - -static void sub_812476C(void) -{ - u8 i = 0; - - sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0; - sCableCarPtr->unk_001f = sCableCarPtr->unk_0008; - sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009; - sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 2) % 32; - sCableCarPtr->unk_0018 += 2; - gUnknown_0203927D = sCableCarPtr->unk_001a; - for (i = 0; i < 9; i++) - { - gUnknown_0203927B = sCableCarPtr->unk_0019; - gUnknown_0203927C = (gUnknown_0203927D + i) % 32; - sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018]; - gUnknown_0203927B = (gUnknown_0203927B + 1) % 32; - sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1]; - } - gUnknown_0203927C = (sCableCarPtr->unk_001a + 23) % 32; - CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, sCableCarPtr->unk_0019, gUnknown_0203927C, 2, 9); - if (sCableCarPtr->unk_0018 == 10) - { - sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 3) % 32; - sCableCarPtr->unk_0018 = 0xfe; - sub_812446C(); - } -} - -static void sub_81248AC(u8 a0) -{ - switch (a0) - { - case 0: - default: - sCableCarPtr->unk_001b = 2; - sCableCarPtr->unk_0019 = 0; - sCableCarPtr->unk_001a = 20; - sCableCarPtr->unk_0018 = 12; - sub_812446C(); - sub_81245F4(); - break; - case 1: - sCableCarPtr->unk_001b = 2; - sCableCarPtr->unk_0019 = 28; - sCableCarPtr->unk_001a = 20; - sCableCarPtr->unk_0018 = 4; - sub_812446C(); - sub_812476C(); - break; - } - sCableCarPtr->unk_001c = 0; -} diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c deleted file mode 100644 index 0aa02312f..000000000 --- a/src/scene/contest_painting.c +++ /dev/null @@ -1,786 +0,0 @@ -#include "global.h" -#include "contest_painting.h" -#include "cute_sketch.h" -#include "data2.h" -#include "decompress.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "random.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "text.h" -#include "scanline_effect.h" -#include "ewram.h" - -static u8 gUnknown_03000750; -static u16 gUnknown_03000752; -static u16 gUnknown_03000754; -static u8 gUnknown_03000756; - -u16 (*gUnknown_03005E10)[][32]; -struct Unk03005E20 gUnknown_03005E20; -u8 gUnknown_03005E40[0x4C]; -struct ContestEntry *gUnknown_03005E8C; -u16 (*gUnknown_03005E90)[]; - -static const u16 gPictureFramePalettes[][16] = -{ - INCBIN_U16("graphics/picture_frame/bg0.gbapal"), - INCBIN_U16("graphics/picture_frame/bg1.gbapal"), - INCBIN_U16("graphics/picture_frame/bg2.gbapal"), - INCBIN_U16("graphics/picture_frame/bg3.gbapal"), - INCBIN_U16("graphics/picture_frame/bg4.gbapal"), - INCBIN_U16("graphics/picture_frame/bg5.gbapal"), - {0}, - {0}, -}; -const u8 emptySpace[8 * 32] = {0}; -const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl"); -const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl"); -const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl"); -const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl"); -const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl"); -const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl"); -const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl"); -const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl"); -const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl"); -const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl"); -const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl"); -const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl"); -const u8 *const gUnknown_083F60AC[] = -{ - OtherText_Cool, - OtherText_Beauty2, - OtherText_Cute, - OtherText_Smart, - OtherText_Tough, -}; -const struct LabelPair gUnknown_083F60C0[] = -{ - {OtherText_NonstopSuperCool, OtherText_Terminator6}, - {OtherText_GoodLookingPoke, OtherText_Terminator7}, - {OtherText_MarvelousGreat, OtherText_Terminator8}, - {OtherText_CenturyLastVenus, OtherText_Terminator9}, - {OtherText_Terminator10, OtherText_DazzlingSmile}, - {OtherText_PokeCenterIdol, OtherText_Terminator11}, - {OtherText_LovelyAndSweet, OtherText_Terminator12}, - {OtherText_ThePretty, OtherText_WinningPortrait}, - {OtherText_GiveUsWink, OtherText_Terminator13}, - {OtherText_SmartnessMaestro, OtherText_Terminator15}, - {OtherText_ChosenPokeAmong, OtherText_Terminator15}, - {OtherText_TheExcellent, OtherText_ItsMomentOfElegance}, - {OtherText_PowerfullyMuscular, OtherText_Terminator16}, - {OtherText_StrongErEst, OtherText_Terminator17}, - {OtherText_MightyTough, OtherText_Exclamation}, -}; -const struct OamData gOamData_83F6138 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 1, - .bpp = 1, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -const u16 gUnknown_083F6140[] = {0, 0}; - -static void ShowContestPainting(); -static void CB2_HoldContestPainting(void); -static void HoldContestPainting(void); -static void ContestPaintingInitWindow(u8 arg0); -static void ContestPaintingPrintCaption(u8 arg0, u8 arg1); -static void ContestPaintingInitBG(void); -static void ContestPaintingInitVars(u8 arg0); -static void VBlankCB_ContestPainting(void); -void sub_8106B90(); //should be static -static void sub_8107090(u8 arg0, u8 arg1); - -__attribute__((naked)) -void sub_8106630(u32 arg0) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - ldr r2, _0810665C @ =gSharedMem + 0x15DE0\n\ - subs r4, r2, 0x2\n\ - subs r5, r2, 0x1\n\ - ldr r3, _08106660 @ =gSaveBlock1\n\ - subs r0, 0x1\n\ - lsls r1, r0, 5\n\ - adds r1, r3\n\ - ldr r3, _08106664 @ =0x00002dfc\n\ - adds r1, r3\n\ - ldm r1!, {r3,r6,r7}\n\ - stm r2!, {r3,r6,r7}\n\ - ldm r1!, {r3,r6,r7}\n\ - stm r2!, {r3,r6,r7}\n\ - ldm r1!, {r6,r7}\n\ - stm r2!, {r6,r7}\n\ - strb r0, [r4]\n\ - movs r0, 0\n\ - strb r0, [r5]\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0810665C: .4byte gSharedMem + 0x15DE0\n\ -_08106660: .4byte gSaveBlock1\n\ -_08106664: .4byte 0x00002dfc\n\ - .syntax divided\n"); -} - -void CB2_ContestPainting(void) -{ - ShowContestPainting(); -} - -static void ShowContestPainting(void) -{ - switch (gMain.state) - { - case 0: - ScanlineEffect_Stop(); - SetVBlankCallback(NULL); - gUnknown_03005E8C = &ewram15DE0; - ContestPaintingInitVars(TRUE); - ContestPaintingInitBG(); - gMain.state++; - break; - case 1: - { - ResetPaletteFade(); - DmaFill32Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); - ResetSpriteData(); - gMain.state++; - break; - } - case 2: - SeedRng(gMain.vblankCounter1); - InitKeys(); - ContestPaintingInitWindow(ewram15DDF); - gMain.state++; - break; - case 3: - sub_8107090(ewram15DDE, ewram15DDF); - gMain.state++; - break; - case 4: - ContestPaintingPrintCaption(ewram15DDE, ewram15DDF); - LoadPalette(gUnknown_083F6140, 0, 1 * 2); - DmaClear32(3, PLTT, 0x400); - BeginFastPaletteFade(2); - SetVBlankCallback(VBlankCB_ContestPainting); - gUnknown_03000750 = 0; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; - SetMainCallback2(CB2_HoldContestPainting); - break; - } -} - -static void CB2_HoldContestPainting(void) -{ - HoldContestPainting(); - UpdatePaletteFade(); -} - -static void CB2_QuitContestPainting(void) -{ - SetMainCallback2(gMain.savedCallback); -} - -static void HoldContestPainting(void) -{ - switch (gUnknown_03000750) - { - case 0: - if (!gPaletteFade.active) - gUnknown_03000750 = 1; - if (gUnknown_03000756 != 0 && gUnknown_03000754 != 0) - gUnknown_03000754--; - break; - case 1: - if ((gMain.newKeys & 1) || (gMain.newKeys & 2)) - { - u8 two = 2; //needed to make the asm match - - gUnknown_03000750 = two; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - } - if (gUnknown_03000756 != 0) - gUnknown_03000754 = 0; - break; - case 2: - if (!gPaletteFade.active) - SetMainCallback2(CB2_QuitContestPainting); - if (gUnknown_03000756 != 0 && gUnknown_03000754 <= 0x1D) - gUnknown_03000754++; - break; - } -} - -static void ContestPaintingInitWindow(u8 arg0) -{ - InitMenuWindow(&gWindowTemplate_81E7160); - Text_LoadWindowTemplate(&gWindowTemplate_81E7160); -} - -static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) -{ - u8 xPos, yPos; - u8 *ptr; - u8 type; - - if (arg1 == TRUE) - return; - ptr = gUnknown_03005E40; - type = gUnknown_03005E8C->contestType; - if (contestType < 8) - { - ptr = StringCopy(ptr, gUnknown_083F60AC[type]); - ptr = StringCopy(ptr, gContestText_ContestWinner); -#if ENGLISH - ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); -#elif GERMAN - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); -#endif - - // {LATIN} - ptr[0] = 0xFC; - ptr[1] = 0x16; - ptr += 2; - - ptr = StringCopy(ptr, gOtherText_Unknown1); -#if ENGLISH - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); -#elif GERMAN - ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); -#endif - - xPos = 6; - yPos = 14; - } - else - { - ptr = StringCopy(ptr, gUnknown_083F60C0[type].prefix); - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); - ptr = StringCopy(ptr, gUnknown_083F60C0[type].suffix); - - xPos = 3; - yPos = 14; - } - Menu_PrintTextPixelCoords(gUnknown_03005E40, xPos * 8 + 1, yPos * 8, 1); -} - -static void ContestPaintingInitBG(void) -{ - REG_DISPCNT = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_BG0CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; -} - -static void ContestPaintingInitVars(bool8 arg0) -{ - if (arg0 == FALSE) - { - gUnknown_03000756 = FALSE; - gUnknown_03000752 = 0; - gUnknown_03000754 = 0; - } - else - { - gUnknown_03000756 = TRUE; - gUnknown_03000752 = 15; - gUnknown_03000754 = 30; - } -} - -static void ContestPaintingMosaic(void) -{ - if (gUnknown_03000756 == FALSE) - { - REG_MOSAIC = 0; - return; - } - - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256; - gUnknown_03000752 = gUnknown_03000754 / 2; - - REG_MOSAIC = (gUnknown_03000752 << 12) | (gUnknown_03000752 << 8) | (gUnknown_03000752 << 4) | (gUnknown_03000752 << 0); -} - -static void VBlankCB_ContestPainting(void) -{ - ContestPaintingMosaic(); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -#ifdef NONMATCHING -static void sub_8106AC4(u16 species, u8 arg1) -{ - void *pal; - - // Unsure what gUnknown_03005E8C->var0 is supposed to be. - pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); - LZDecompressVram(pal, gUnknown_03005E90); - - if (arg1 == 1) - { - HandleLoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].x, - gMonFrontPicCoords[species].y, - 0x2000000, - gUnknown_081FAF4C[1], - species, - (u32)gUnknown_03005E8C->var0 - ); - sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10); - } - else - { - HandleLoadSpecialPokePic( - &gMonBackPicTable[species], - gMonBackPicCoords[species].x, - gMonBackPicCoords[species].y, - 0x2000000, - gUnknown_081FAF4C[0], - species, - (u32)gUnknown_03005E8C->var0 - ); - sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10); - } -} -#else -__attribute__((naked)) -static void sub_8106AC4(u16 arg0, u8 arg2) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - sub sp, 0xC\n\ - adds r4, r1, 0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - ldr r7, _08106B28 @ =gUnknown_03005E8C\n\ - ldr r0, [r7]\n\ - ldr r1, [r0, 0x4]\n\ - ldr r2, [r0]\n\ - adds r0, r6, 0\n\ - bl GetMonSpritePalFromOtIdPersonality\n\ - ldr r1, _08106B2C @ =gUnknown_03005E90\n\ - mov r8, r1\n\ - ldr r1, [r1]\n\ - bl LZDecompressVram\n\ - cmp r4, 0\n\ - bne _08106B40\n\ - lsls r0, r6, 3\n\ - ldr r1, _08106B30 @ =gMonFrontPicTable\n\ - adds r0, r1\n\ - ldr r1, _08106B34 @ =gMonFrontPicCoords\n\ - lsls r2, r6, 2\n\ - adds r2, r1\n\ - ldrb r1, [r2]\n\ - ldrb r2, [r2, 0x1]\n\ - movs r3, 0x80\n\ - lsls r3, 18\n\ - ldr r4, _08106B38 @ =gUnknown_081FAF4C\n\ - ldr r5, [r4, 0x4]\n\ - str r5, [sp]\n\ - str r6, [sp, 0x4]\n\ - ldr r4, [r7]\n\ - ldr r4, [r4]\n\ - str r4, [sp, 0x8]\n\ - bl HandleLoadSpecialPokePic\n\ - mov r2, r8\n\ - ldr r1, [r2]\n\ - ldr r0, _08106B3C @ =gUnknown_03005E10\n\ - ldr r2, [r0]\n\ - adds r0, r5, 0\n\ - bl sub_8106B90\n\ - b _08106B74\n\ - .align 2, 0\n\ -_08106B28: .4byte gUnknown_03005E8C\n\ -_08106B2C: .4byte gUnknown_03005E90\n\ -_08106B30: .4byte gMonFrontPicTable\n\ -_08106B34: .4byte gMonFrontPicCoords\n\ -_08106B38: .4byte gUnknown_081FAF4C\n\ -_08106B3C: .4byte gUnknown_03005E10\n\ -_08106B40:\n\ - lsls r0, r6, 3\n\ - ldr r1, _08106B80 @ =gMonBackPicTable\n\ - adds r0, r1\n\ - ldr r1, _08106B84 @ =gMonBackPicCoords\n\ - lsls r2, r6, 2\n\ - adds r2, r1\n\ - ldrb r1, [r2]\n\ - ldrb r2, [r2, 0x1]\n\ - movs r3, 0x80\n\ - lsls r3, 18\n\ - ldr r4, _08106B88 @ =gUnknown_081FAF4C\n\ - ldr r5, [r4]\n\ - str r5, [sp]\n\ - str r6, [sp, 0x4]\n\ - ldr r4, [r7]\n\ - ldr r4, [r4]\n\ - str r4, [sp, 0x8]\n\ - bl HandleLoadSpecialPokePic\n\ - mov r0, r8\n\ - ldr r1, [r0]\n\ - ldr r0, _08106B8C @ =gUnknown_03005E10\n\ - ldr r2, [r0]\n\ - adds r0, r5, 0\n\ - bl sub_8106B90\n\ -_08106B74:\n\ - add sp, 0xC\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08106B80: .4byte gMonBackPicTable\n\ -_08106B84: .4byte gMonBackPicCoords\n\ -_08106B88: .4byte gUnknown_081FAF4C\n\ -_08106B8C: .4byte gUnknown_03005E10\n\ - .syntax divided\n"); -} -#endif - -#ifdef NONMATCHING -void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8]) -{ - u16 i; - u16 j; - u16 k; - u16 l; - - for (i = 0; i < 8; i++) - { - for (j = 0; j < 8; j++) - { - for (k = 0; k < 8; k++) - { - for (l = 0; l < 8; l++) - { - //u8 *arr = a[i][j][k]; - //u8 r1 = arr[l / 2]; - u8 r1 = a[i][j][k][l / 2]; - - if (l & 1) - r1 /= 16; - else - r1 %= 16; - //_08106BEA - if (r1 == 0) - c[i][k][j][l] = 0x8000; - else - c[i][k][j][l] = b[r1]; - } - } - } - } -} -#else -__attribute__((naked)) -void sub_8106B90() -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - mov r10, r0\n\ - mov r9, r1\n\ - str r2, [sp]\n\ - movs r0, 0\n\ -_08106BA4:\n\ - movs r3, 0\n\ - adds r1, r0, 0x1\n\ - str r1, [sp, 0x4]\n\ - lsls r0, 3\n\ - str r0, [sp, 0x8]\n\ -_08106BAE:\n\ - movs r1, 0\n\ - adds r2, r3, 0x1\n\ - mov r8, r2\n\ - ldr r7, [sp, 0x8]\n\ - adds r0, r7, r3\n\ - lsls r0, 5\n\ - mov r12, r0\n\ - lsls r4, r3, 3\n\ -_08106BBE:\n\ - movs r3, 0\n\ - lsls r0, r1, 2\n\ - adds r6, r1, 0x1\n\ - mov r2, r12\n\ - adds r5, r2, r0\n\ - ldr r7, [sp, 0x8]\n\ - adds r0, r7, r1\n\ - lsls r0, 7\n\ - ldr r1, [sp]\n\ - adds r2, r0, r1\n\ -_08106BD2:\n\ - lsrs r0, r3, 1\n\ - adds r0, r5, r0\n\ - add r0, r10\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08106BE6\n\ - lsrs r1, 4\n\ - b _08106BEA\n\ -_08106BE6:\n\ - movs r0, 0xF\n\ - ands r1, r0\n\ -_08106BEA:\n\ - cmp r1, 0\n\ - bne _08106BFC\n\ - adds r0, r4, r3\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - movs r7, 0x80\n\ - lsls r7, 8\n\ - adds r1, r7, 0\n\ - b _08106C08\n\ -_08106BFC:\n\ - adds r0, r4, r3\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - lsls r1, 1\n\ - add r1, r9\n\ - ldrh r1, [r1]\n\ -_08106C08:\n\ - strh r1, [r0]\n\ - adds r0, r3, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x7\n\ - bls _08106BD2\n\ - lsls r0, r6, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, 0x7\n\ - bls _08106BBE\n\ - mov r1, r8\n\ - lsls r0, r1, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0x7\n\ - bls _08106BAE\n\ - ldr r2, [sp, 0x4]\n\ - lsls r0, r2, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x7\n\ - bls _08106BA4\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif - -static void sub_8106C40(u8 arg0, u8 arg1) -{ - u8 x, y; - - LoadPalette(gPictureFramePalettes, 0, sizeof(gPictureFramePalettes)); - if (arg1 == 1) - { - switch (gUnknown_03005E8C->contestType / 3) - { - case CONTEST_COOL: - RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_0, gUnknown_03005E10); - break; - case CONTEST_BEAUTY: - RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_1, gUnknown_03005E10); - break; - case CONTEST_CUTE: - RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_2, gUnknown_03005E10); - break; - case CONTEST_SMART: - RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_3, gUnknown_03005E10); - break; - case CONTEST_TOUGH: - RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_4, gUnknown_03005E10); - break; - } - -#define VRAM_PICTURE_DATA(x, y) (((u16 *)(VRAM + 0x6000))[(y) * 32 + (x)]) - - // Set the background - for (y = 0; y < 20; y++) - { - for (x = 0; x < 32; x++) - VRAM_PICTURE_DATA(x, y) = 0x1015; - } - - // Copy the image frame - for (y = 0; y < 10; y++) - { - for (x = 0; x < 18; x++) - VRAM_PICTURE_DATA(x + 6, y + 2) = (*gUnknown_03005E10)[y + 2][x + 6]; - } - - // Re-set the entire top row to the first top frame part - for (x = 0; x < 16; x++) - VRAM_PICTURE_DATA(x + 7, 2) = (*gUnknown_03005E10)[2][7]; - -#undef VRAM_PICTURE_DATA - } - else if (arg0 < 8) - { - RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_5, (void *)(VRAM + 0x6000)); - } - else - { - switch (gUnknown_03005E8C->contestType / 3) - { - case CONTEST_COOL: - RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_0, (void *)(VRAM + 0x6000)); - break; - case CONTEST_BEAUTY: - RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_1, (void *)(VRAM + 0x6000)); - break; - case CONTEST_CUTE: - RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_2, (void *)(VRAM + 0x6000)); - break; - case CONTEST_SMART: - RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_3, (void *)(VRAM + 0x6000)); - break; - case CONTEST_TOUGH: - RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_4, (void *)(VRAM + 0x6000)); - break; - } - } -} - -static void sub_8106E98(u8 arg0) -{ - //Some hacks just to get the asm to match -#ifndef NONMATCHING - asm(""::"r"(arg0)); -#endif - - gMain.oamBuffer[0] = gOamData_83F6138; - gMain.oamBuffer[0].tileNum = 0; - -#ifndef NONMATCHING - if (arg0) arg0 = gMain.oamBuffer[0].tileNum; -#endif - - gMain.oamBuffer[0].x = 88; - gMain.oamBuffer[0].y = 24; -} - -static u8 sub_8106EE0(u8 arg0) -{ - u8 contestType; - - if (arg0 < 8) - contestType = gUnknown_03005E8C->contestType; - else - contestType = gUnknown_03005E8C->contestType / 3; - - switch (contestType) - { - case CONTEST_COOL: - return CONTESTRESULT_COOL; - case CONTEST_BEAUTY: - return CONTESTRESULT_BEAUTY; - case CONTEST_CUTE: - return CONTESTRESULT_CUTE; - case CONTEST_SMART: - return CONTESTRESULT_SMART; - case CONTEST_TOUGH: - return CONTESTRESULT_TOUGH; - } - - return contestType; -} - -static void sub_8106F4C(void) -{ - gUnknown_03005E90 = &ewram15E00.unk2017e00; - gUnknown_03005E10 = &ewram15E00.unk2015e00; -} - -static void sub_8106F6C(u8 arg0) -{ - gUnknown_03005E20.var_4 = gUnknown_03005E10; - gUnknown_03005E20.var_8 = gUnknown_03005E90; - gUnknown_03005E20.var_18 = 0; - gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0; - gUnknown_03005E20.var_19 = 0; - gUnknown_03005E20.var_1A = 0; - gUnknown_03005E20.var_1B = 64; - gUnknown_03005E20.var_1C = 64; - gUnknown_03005E20.var_1D = 64; - gUnknown_03005E20.var_1E = 64; - - switch (arg0) - { - case CONTESTRESULT_SMART: - case CONTESTRESULT_TOUGH: - gUnknown_03005E20.var_14 = 3; - break; - case CONTESTRESULT_COOL: - case CONTESTRESULT_BEAUTY: - case CONTESTRESULT_CUTE: - default: - gUnknown_03005E20.var_14 = 1; - break; - } - - gUnknown_03005E20.var_16 = 2; - gUnknown_03005E20.var_0 = arg0; - gUnknown_03005E20.var_10 = 0x6010000; - - sub_80FC7A0(&gUnknown_03005E20); - sub_80FDA18(&gUnknown_03005E20); - sub_80FD8CC(&gUnknown_03005E20); - - LoadPalette(gUnknown_03005E90, 256, 256 * 2); -} - -static void sub_8107090(u8 arg0, u8 arg1) -{ - sub_8106F4C(); - sub_8106AC4(gUnknown_03005E8C->var8, 0); - sub_8106F6C(sub_8106EE0(arg0)); - sub_8106E98(arg0); - sub_8106C40(arg0, arg1); -} diff --git a/src/scene/credits.c b/src/scene/credits.c deleted file mode 100644 index e31e2c797..000000000 --- a/src/scene/credits.c +++ /dev/null @@ -1,1677 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "decompress.h" -#include "event_data.h" -#include "hall_of_fame.h" -#include "intro_credits_graphics.h" -#include "m4a.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokedex.h" -#include "random.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "starter_choose.h" -#include "task.h" -#include "trig.h" -#include "ewram.h" - -asm(".set REG_BASE, 0x4000000"); -asm(".set OFFSET_REG_BLDCNT, 0x50"); -asm(".set OFFSET_REG_BLDALPHA, 0x52"); -asm(".set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT"); -asm(".set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA"); - -enum -{ - PAGE_TITLE, - PAGE_DIRECTOR, - PAGE_ART_DIRECTOR, - PAGE_BATTLE_DIRECTOR, - PAGE_MAIN_PROGRAMMER, - PAGE_BATTLE_SYSTEM_PROGRAMMER, - PAGE_PROGRAMMERS_1, - PAGE_PROGRAMMERS_2, - PAGE_PROGRAMMERS_3, - PAGE_MAIN_GRAHPICS_DESIGNER, - PAGE_POKEMON_GRAHPIC_DESIGNERS_1, - PAGE_POKEMON_GRAHPIC_DESIGNERS_2, - PAGE_POKEMON_GRAHPIC_DESIGNERS_3, - PAGE_POKEMON_DESIGNERS_1, - PAGE_POKEMON_DESIGNERS_2, - PAGE_MUSIC_COMPOSITION, - PAGE_SOUND_EFFECTS, - PAGE_GAME_DESIGNERS_1, - PAGE_GAME_DESIGNERS_2, - PAGE_GAME_DESIGNERS_3, - PAGE_PLOT_SCENARIO, - PAGE_GAME_SCENARIO, - PAGE_SCRIPT_DESIGNERS, - PAGE_MAP_DESIGNERS, - PAGE_MAP_DATA_DESIGNERS, - PAGE_PARAMETRIC_DESIGNERS, - PAGE_POKEDEX_TEXT, - PAGE_ENVIRONMENT_TOOLS, - PAGE_PRODUCT_TESTING, - PAGE_SPECIAL_THANKS, - PAGE_SPECIAL_THANKS_1, - PAGE_SPECIAL_THANKS_2, - PAGE_SPECIAL_THANKS_3, - PAGE_INFORMATION_SUPERVISORS, - PAGE_COORDINATORS, - PAGE_TASK_MANAGERS, - PAGE_PRODUCERS, - PAGE_EXECUTIVE_DIRECTOR, - PAGE_EXECUTIVE_PRODUCERS_1, - PAGE_EXECUTIVE_PRODUCERS_2, - PAGE_TRANSLATION_COORDINATOR, - PAGE_TRANSLATORS, - PAGE_PROGRAMMERS, - PAGE_GRAPHIC_DESIGNERS, - PAGE_PRODUCT_SUPPORT, - -#if ENGLISH - PAGE_ARTWORK, - PAGE_TEXT_EDITOR, - PAGE_NOA_TESTING, - PAGE_BRAILLE_CODE_CHECK_1, - PAGE_BRAILLE_CODE_CHECK_2, -#elif GERMAN - PAGE_NOE_TESTING, - PAGE_BRAILLE_CODE_CHECK_1, -#endif - - PAGE_SPECIAL_THANKS_4, - PAGE_SPECIAL_THANKS_5, - - PAGE_COUNT -}; - -#if ENGLISH -#define POKEMON_TILE_COUNT 68 -#define LAST_PAGE (PAGE_TEXT_EDITOR) -#define UNK_DEFINE_45 (0x45) -#define UNK_DEFINE_82 (0x82) -#define UNK_DEF_1F3 (499) -#elif GERMAN -#define POKEMON_TILE_COUNT 65 -#define LAST_PAGE (PAGE_NOE_TESTING) -#define UNK_DEFINE_45 (8) -#define UNK_DEFINE_82 (0x8D) -#define UNK_DEF_1F3 (554) -#endif - -#define COLOR_DARK_GREEN 0x1967 -#define COLOR_LIGHT_GREEN 0x328D - -enum -{ - TDA_0 = 0, - TDA_TASK_C_ID = 1, - TDA_TASK_E_ID = 2, - TDA_TASK_D_ID = 3, - TDA_4 = 4, - TDA_PLAYER_CYCLIST = 5, - TDA_RIVAL_CYCLIST = 6, - TDA_7 = 7, // Has something to do with the bike scene - TDA_11 = 11, // Gets set depending on whether the bike or the grass scene should be shown - TDA_12 = 12, - TDA_13 = 13, - TDA_14 = 14, - TDA_TASK_B_ID = 15, - - // Appears to be responsible for text - TDB_0 = 0, - TDB_TASK_A_ID = 1, - TDB_CURRENT_PAGE = 2, - TDB_3 = 3, - - TDC_0 = 0, - TDC_1 = 1, - TDC_2 = 2, - TDC_3 = 3, - TDC_4 = 4, - TDC_5 = 5, - - TDD_STATE = 0, - TDD_TASK_A_ID = 1, - TDD_2 = 2, - TDD_3 = 3, - - TDE_0 = 0, - TDE_1 = 1, - TDE_TASK_A_ID = 2, -}; - - -struct Unk201C000 -{ - u16 unk0[POKEMON_TILE_COUNT]; - u16 unk88; - u16 unk8A; - u16 unk8C; - u16 unk8E; - u16 unk90[386]; - u16 unk394; -}; - -struct CreditsEntry -{ - u8 var_0; - const u8 *text; -}; - -extern u8 unk_201e800[0x800]; -extern u8 unk_201f000[0x800]; - -extern struct SpriteTemplate gUnknown_02024E8C; - -extern u16 gUnknown_02039358; -extern s16 gUnknown_0203935A; -extern s16 gUnknown_0203935C; - -static EWRAM_DATA s16 gUnknown_02039320 = 0; -static EWRAM_DATA u16 gUnknown_02039322 = 0; // TASK A -EWRAM_DATA u8 gUnknown_02039324 = 0; -static EWRAM_DATA u8 gUnknown_02039325 = 0; - -extern u8 gReservedSpritePaletteCount; - -// data/hall_of_fame -extern void *gUnknown_0840B5A0[]; - -// data/credits -const u16 gUnknown_0840B7BC[] = INCBIN_U16("graphics/credits/palette_1.gbapal"); -const u8 gUnknown_0840B7FC[] = INCBIN_U8("graphics/credits/ampersand.4bpp"); - -void spritecb_814580C(struct Sprite *sprite); - -const u8 gUnknown_0840B83C[] = -{ - 0, 1, 0, - 0xFF, 1, 0xFF, - 0xFF, 1, 0xFF, - 0xFF, 1, 0xFF, - 0xFF, 1, 0xFF, -}; - -const u8 gUnknown_0840B84B[] = -{ - 1, 0xFF, 1, - 1, 0xFF, 1, - 1, 2, 1, - 1, 0xFF, 1, - 1, 0xFF, 1, -}; - -const u8 gUnknown_0840B85A[] = -{ - 1, 0, 0, - 1, 0xFF, 0xFF, - 1, 2, 2, - 1, 0xFF, 0xFF, - 1, 0x80, 0x80, -}; - -const u8 gUnknown_0840B869[] = -{ - 1, 3, 1, - 1, 4, 1, - 1, 5, 1, - 1, 0xC4, 1, - 1, 0xC3, 1, -}; - -const u8 gUnknown_0840B878[] = -{ - 1, 6, 7, - 1, 8, 9, - 1, 0xFF, 1, - 1, 0x88, 0x89, - 1, 0x86, 0x87, -#ifdef GERMAN - 1, 0, 0, - 1, 0xFF, 0xFF, - 1, 0x80, 0x8A, - 1, 0xFF, 0xFF, - 1, 0xFF, 0xFF, - 0, 1, 0, - 0xFF, 1, 0xFF, - 0xFF, 1, 0xFF, - 0xFF, 1, 0xFF, - 0x80, 1, 0x80, -#endif -}; - -#ifdef GERMAN -#include "../data/credits_de.h" -#else -#include "../data/credits_en.h" -#endif - -const u8 gUnknown_0840CA00[][2] = -{ - {104, 36}, - {120, 36}, - {136, 36}, -}; - -static const union AnimCmd gSpriteAnim_840CA08[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(64, 8), - ANIMCMD_FRAME(128, 8), - ANIMCMD_FRAME(192, 8), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd gSpriteAnim_840CA1C[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(64, 4), - ANIMCMD_FRAME(128, 4), - ANIMCMD_FRAME(192, 4), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd gSpriteAnim_840CA30[] = -{ - ANIMCMD_FRAME(256, 4), - ANIMCMD_FRAME(320, 4), - ANIMCMD_FRAME(384, 4), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_840CA40[] = -{ - ANIMCMD_FRAME(384, 30), - ANIMCMD_FRAME(320, 30), - ANIMCMD_FRAME(256, 30), - ANIMCMD_FRAME(256, 30), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_0840CA54[] = -{ - gSpriteAnim_840CA08, - gSpriteAnim_840CA1C, - gSpriteAnim_840CA30, - gSpriteAnim_840CA40, -}; - -static const union AnimCmd gSpriteAnim_840CA64[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(64, 8), - ANIMCMD_FRAME(128, 8), - ANIMCMD_FRAME(192, 8), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd gSpriteAnim_840CA78[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(64, 4), - ANIMCMD_FRAME(128, 4), - ANIMCMD_FRAME(192, 4), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd gSpriteAnim_840CA8C[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_0840CA94[] = -{ - gSpriteAnim_840CA64, - gSpriteAnim_840CA78, - gSpriteAnim_840CA8C, -}; - -static const struct SpriteSheet gUnknown_0840CAA0[] = {{ewram1E000_2, 6144, 1001}, {0}}; -static const struct SpritePalette gUnknown_0840CAB0[] = {{ewram_1F800_2, 1001}, {0}}; - -static const struct OamData gOamData_840CAC0 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd gSpriteAnim_840CAC8[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_840CAD0[] = -{ - ANIMCMD_FRAME(64, 8), - ANIMCMD_END, -}; - -static const union AnimCmd gSpriteAnim_840CAD8[] = -{ - ANIMCMD_FRAME(128, 8), - ANIMCMD_END, -}; - -static const union AnimCmd *const gSpriteAnimTable_840CAE0[] = -{ - gSpriteAnim_840CAC8, - gSpriteAnim_840CAD0, - gSpriteAnim_840CAD8, -}; - -static const struct SpriteTemplate gSpriteTemplate_840CAEC = -{ - .tileTag = 1001, - .paletteTag = 1001, - .oam = &gOamData_840CAC0, - .anims = gSpriteAnimTable_840CAE0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = spritecb_814580C, -}; - -// graphics -extern u8 gCreditsCopyrightEnd_Gfx[]; -extern u16 gIntroCopyright_Pal[16]; - -static void task_a_8143B38(u8 taskIdA); -static void task_a_8143B68(u8 taskIdA); -static void task_a_8143BFC(u8 taskIdA); -static void task_a_80C9BFC(u8 taskIdA); -static void task_a_8143CC0(u8 taskIdA); -static void task_a_8143D04(u8 taskIdA); -static void task_a_8143EBC(u8 taskIdA); -static void task_a_8143F04(u8 taskIdA); -static void task_a_8143F3C(u8 taskIdA); -static void task_a_8143FDC(u8 taskIdA); -static void task_a_8144024(u8 taskIdA); -static void task_a_8144080(u8 taskIdA); -static void task_a_8144114(u8 taskIdA); -static void sub_8144130(void); -static void task_b_81441B8(u8 taskIdB); -static u8 sub_8144454(u8 page, u8 taskIdA); -static void task_d_8144514(u8 taskIdD); -static bool8 sub_8144ECC(u8 data, u8 taskIdA); -static void sub_81450AC(u8 taskIdA); -static void sub_8145128(u16, u16, u16); -static void sub_81452D0(u16 arg0, u16 palette); -static void spritecb_player_8145378(struct Sprite *sprite); -static void spritecb_rival_8145420(struct Sprite *sprite); -static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position); -static void sub_81458DC(void); - -static void vblank_8143948(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void sub_814395C(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - - if ((gMain.heldKeys & B_BUTTON) - && gUnknown_02039324 != 0 - && gTasks[gUnknown_02039322].func == task_a_8143B68) - { - vblank_8143948(); - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - gUnknown_02039325 = 1; - } -} - -void sub_81439D0(void) -{ - u8 taskIdA; - s16 taskIdC; - u8 taskIdB; - u16 savedIme; - struct Unk201C000 *c000; - - sub_8144130(); - SetVBlankCallback(NULL); - ResetPaletteFade(); - ResetTasks(); - - taskIdA = CreateTask(task_a_8143B38, 0); - - gTasks[taskIdA].data[TDA_4] = 0; - gTasks[taskIdA].data[TDA_7] = 0; - gTasks[taskIdA].data[TDA_11] = 0; - gTasks[taskIdA].data[TDA_13] = 1; - - while (TRUE) - { - if (sub_8144ECC(0, taskIdA)) - break; - } - - taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; - gTasks[taskIdC].data[TDC_0] = 40; - - Text_LoadWindowTemplate(&gWindowTemplate_81E7208); - InitMenuWindow(&gWindowTemplate_81E7208); - LoadPalette(&gUnknown_0840B7BC, 0x80, sizeof(gUnknown_0840B7BC)); - - CpuCopy16(&gUnknown_0840B7FC, (void *)(VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC)); - - REG_BG0VOFS = 0xFFFC; - - taskIdB = CreateTask(task_b_81441B8, 0); - - gTasks[taskIdB].data[TDB_TASK_A_ID] = taskIdA; - gTasks[taskIdA].data[TDA_TASK_B_ID] = taskIdB; - - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - - SetVBlankCallback(vblank_8143948); - m4aSongNumStart(BGM_THANKFOR); - SetMainCallback2(sub_814395C); - gUnknown_02039325 = 0; - - c000 = &ewram1c000; - - sub_81458DC(); - - c000->unk88 = 0; - c000->unk8A = 0; - c000->unk8C = 0; - - gUnknown_02039322 = taskIdA; -} - -static void task_a_8143B38(u8 taskIdA) -{ - if (!gPaletteFade.active) - gTasks[taskIdA].func = task_a_8143B68; -} - -static void task_a_8143B68(u8 taskIdA) -{ - u16 data1; - - if (gTasks[taskIdA].data[TDA_4]) - { - s16 taskIdC; - - taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; - gTasks[taskIdC].data[TDC_0] = 30; - - gTasks[taskIdA].data[TDA_12] = 0x100; - gTasks[taskIdA].func = task_a_8143EBC; - return; - } - - gUnknown_02039320 = 0; - data1 = gTasks[taskIdA].data[TDA_11]; - - if (gTasks[taskIdA].data[TDA_11] == 1) - { - gTasks[taskIdA].data[TDA_13] = data1; - gTasks[taskIdA].data[TDA_11] = 0; - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskIdA].func = task_a_8143BFC; - } - else if (gTasks[taskIdA].data[TDA_11] == 2) - { - gTasks[taskIdA].data[TDA_13] = data1; - gTasks[taskIdA].data[TDA_11] = 0; - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gTasks[taskIdA].func = task_a_8143CC0; - } -} - -static void task_a_8143BFC(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - REG_DISPCNT = 0; - sub_81450AC(taskIdA); - gTasks[taskIdA].func = task_a_80C9BFC; - } -} - -static void task_a_80C9BFC(u8 taskIdA) -{ - u16 backup; - - SetVBlankCallback(NULL); - - if (sub_8144ECC(gTasks[taskIdA].data[TDA_7], taskIdA)) - { - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - - backup = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = backup; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - - SetVBlankCallback(vblank_8143948); - gTasks[taskIdA].func = task_a_8143B38; - } -} - -static void task_a_8143CC0(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - REG_DISPCNT = 0; - sub_81450AC(taskIdA); - gTasks[taskIdA].func = task_a_8143D04; - } -} - -void task_a_8143D04(u8 taskIdA) -{ - switch (gMain.state) - { - default: - case 0: - { - u16 i; - - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); - LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); - LoadPalette(gBirchBagGrassPal[0] + 1, 1, 31 * 2); - - for (i = 0; i < 0x800; i++) - HALL_OF_FAME_SHEET_0[i] = 0x11; - for (i = 0; i < 0x800; i++) - HALL_OF_FAME_SHEET_1[i] = 0x22; - for (i = 0; i < 0x800; i++) - HALL_OF_FAME_SHEET_2[i] = 0x33; - - EWRAM_1F800[0] = 0; - EWRAM_1F800[1] = 0x53FF; // light yellow - EWRAM_1F800[2] = 0x529F; // light red - EWRAM_1F800[3] = 0x7E94; // light blue - - LoadSpriteSheet(gUnknown_0840CAA0); - LoadSpritePalette(gUnknown_0840CAB0); - - gMain.state += 1; - break; - } - case 1: - gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(task_d_8144514, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_STATE] = 1; - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_TASK_A_ID] = taskIdA; - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_2] = gTasks[taskIdA].data[TDA_7]; - - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - REG_BG3HOFS = 0; - REG_BG3VOFS = 32; - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - - gMain.state = 0; - gUnknown_0203935C = 0; - gTasks[taskIdA].func = task_a_8143B38; - break; - } -} - -static void task_a_8143EBC(u8 taskIdA) -{ - if (gTasks[taskIdA].data[TDA_12]) - { - gTasks[taskIdA].data[TDA_12] -= 1; - return; - } - - BeginNormalPaletteFade(-1, 12, 0, 16, 0); - gTasks[taskIdA].func = task_a_8143F04; -} - -static void task_a_8143F04(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - sub_81450AC(taskIdA); - gTasks[taskIdA].func = task_a_8143F3C; - } -} - -static void task_a_8143F3C(u8 taskIdA) -{ - u16 backup; - - sub_8144130(); - ResetPaletteFade(); - sub_8145128(0, 0x3800, 0); - ResetSpriteData(); - FreeAllSpritePalettes(); - BeginNormalPaletteFade(-1, 8, 16, 0, 0); - - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; - backup = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = backup; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; - - gTasks[taskIdA].data[TDA_0] = 0x100; - gTasks[taskIdA].func = task_a_8143FDC; -} - -static void task_a_8143FDC(u8 taskIdA) -{ - if (gTasks[taskIdA].data[TDA_0]) - { - gTasks[taskIdA].data[TDA_0] -= 1; - return; - } - - BeginNormalPaletteFade(-1, 6, 0, 16, 0); - gTasks[taskIdA].func = task_a_8144024; -} - -static void task_a_8144024(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - sub_81452D0(0x3800, 0); - - BeginNormalPaletteFade(-1, 0, 0, 0, 0); - gTasks[taskIdA].data[TDA_0] = 7200; - gTasks[taskIdA].func = task_a_8144080; - } -} - -static void task_a_8144080(u8 taskIdA) -{ - if (!gPaletteFade.active) - { - if (gTasks[taskIdA].data[TDA_0] == 0) - { - FadeOutBGM(4); - BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF); - gTasks[taskIdA].func = task_a_8144114; - return; - } - - if (gMain.newKeys) - { - FadeOutBGM(4); - BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF); - gTasks[taskIdA].func = task_a_8144114; - return; - } - - if (gTasks[taskIdA].data[TDA_0] == 7144) - { - FadeOutBGM(8); - } - - if (gTasks[taskIdA].data[TDA_0] == 6840) - m4aSongNumStart(BGM_END); - - gTasks[taskIdA].data[TDA_0] -= 1; - } -} - -static void task_a_8144114(u8 taskIdA) -{ - if (!gPaletteFade.active) - SoftReset(0xFF); -} - -static void sub_8144130(void) -{ - REG_DISPCNT = 0; - - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); -} - -static void task_b_81441B8(u8 taskIdB) -{ - u16 i; - - switch (gTasks[taskIdB].data[TDB_0]) - { - case 0: - case 6: - case 7: - case 8: - case 9: - default: - if (!gPaletteFade.active) - { - gTasks[taskIdB].data[TDB_0] = 1; - gTasks[taskIdB].data[TDB_3] = 0x58; - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; - gUnknown_02039320 = 0; - } - return; - case 1: - if (gTasks[taskIdB].data[TDB_3] != 0) - { - gTasks[taskIdB].data[TDB_3] -= 1; - return; - } - gTasks[taskIdB].data[TDB_0] += 1; - return; - case 2: - REG_DISPCNT &= ~DISPCNT_BG0_ON; - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == task_a_8143B68) - { - if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT) - { - for (i = 0; i < 5; i++) - sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, 9 + i * 2, 240); - - gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1; - gTasks[taskIdB].data[TDB_0] += 1; - - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 1; - - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) - BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_LIGHT_GREEN); - else - BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_DARK_GREEN); - return; - } - gTasks[taskIdB].data[TDB_0] = 10; - return; - } - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; - return; - case 3: - REG_DISPCNT |= DISPCNT_BG0_ON; - if (!gPaletteFade.active) - { - gTasks[taskIdB].data[TDB_3] = UNK_DEFINE_82; - gTasks[taskIdB].data[TDB_0] += 1; - } - return; - case 4: - if (gTasks[taskIdB].data[TDB_3] != 0) - { - gTasks[taskIdB].data[TDB_3] -= 1; - return; - } - - if (sub_8144454((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID])) - { - gTasks[taskIdB].data[TDB_0] += 1; - return; - } - gTasks[taskIdB].data[TDB_0] += 1; - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) - BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_LIGHT_GREEN); - else - BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_DARK_GREEN); - return; - case 5: - if (!gPaletteFade.active) - { - Menu_EraseWindowRect(0, 9, 29, 19); - gTasks[taskIdB].data[TDB_0] = 2; - } - return; - - case 10: - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_4] = 1; - DestroyTask(taskIdB); - return; - } -} - -static u8 sub_8144454(u8 page, u8 taskIdA) -{ - // Starts with bike + ocean + morning - - if (page == PAGE_PROGRAMMERS_1) - { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; - } - - if (page == PAGE_POKEMON_GRAHPIC_DESIGNERS_3) - { - // Bike + ocean + sunset - gTasks[taskIdA].data[TDA_7] = 1; - gTasks[taskIdA].data[TDA_11] = 1; - } - - if (page == PAGE_GAME_DESIGNERS_2) - { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; - } - - if (page == PAGE_MAP_DATA_DESIGNERS) - { - // Bike + forest + sunset - gTasks[taskIdA].data[TDA_7] = 2; - gTasks[taskIdA].data[TDA_11] = 1; - } - - if (page == PAGE_SPECIAL_THANKS_1) - { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; - } - - if (page == PAGE_TASK_MANAGERS) - { - // Bike + forest + sunset - gTasks[taskIdA].data[TDA_7] = 3; - gTasks[taskIdA].data[TDA_11] = 1; - } - - if (page == PAGE_TRANSLATION_COORDINATOR) - { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; - } - - if (page == LAST_PAGE) - { - // Bike + town + night - gTasks[taskIdA].data[TDA_7] = 4; - gTasks[taskIdA].data[TDA_11] = 1; - } - - if (gTasks[taskIdA].data[TDA_11] != 0) - { - // Returns true if changed? - return TRUE; - } - - return FALSE; -} - -static void task_d_8144514(u8 taskIdD) -{ - struct Unk201C000 *r6 = &ewram1c000; - u8 r2; - - switch (gTasks[taskIdD].data[TDD_STATE]) - { - case 0: - break; - case 1: - if (r6->unk8A == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0) - break; - gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] = 0; - gTasks[taskIdD].data[TDD_STATE]++; - break; - case 2: - if (r6->unk88 == POKEMON_TILE_COUNT || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68) - break; - r2 = sub_81456B4(r6->unk0[r6->unk8C], gUnknown_0840CA00[r6->unk8A][0], gUnknown_0840CA00[r6->unk8A][1], r6->unk8A); - if (r6->unk8C < r6->unk8E - 1) - { - r6->unk8C++; - gSprites[r2].data[3] = 50; - } - else - { - r6->unk8C = 0; - gSprites[r2].data[3] = 512; - } - r6->unk88++; - if (r6->unk8A == 2) - r6->unk8A = 0; - else - r6->unk8A++; - gTasks[taskIdD].data[TDD_3] = 50; - gTasks[taskIdD].data[TDD_STATE]++; - break; - case 3: - if (gTasks[taskIdD].data[TDD_3] != 0) - gTasks[taskIdD].data[TDD_3]--; - else - gTasks[taskIdD].data[TDD_STATE] = 1; - break; - } -} - -void task_c_8144664(u8 taskIdC) -{ - switch (gTasks[taskIdC].data[TDC_0]) - { - case 0: - gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); - gTasks[taskIdC].data[TDC_5]++; - break; - case 1: - if (gUnknown_0203935A != 0) - { - gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); - gTasks[taskIdC].data[TDC_5]++; - } - else - { - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 2; - gTasks[taskIdC].data[TDC_5] = 0; - gTasks[taskIdC].data[TDC_0]++; - } - break; - case 2: - if (gTasks[taskIdC].data[TDC_5] < 64) - { - gTasks[taskIdC].data[TDC_5]++; - gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); - } - else - { - gTasks[taskIdC].data[TDC_0]++; - } - break; - case 3: - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 3; - gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 1; - gTasks[taskIdC].data[TDC_4] = 120; - gTasks[taskIdC].data[TDC_0]++; - break; - case 4: - if (gTasks[taskIdC].data[TDC_4] != 0) - { - gTasks[taskIdC].data[TDC_4]--; - } - else - { - gTasks[taskIdC].data[TDC_5] = 64; - gTasks[taskIdC].data[TDC_0]++; - } - break; - case 5: - if (gTasks[taskIdC].data[TDC_5] > 0) - { - gTasks[taskIdC].data[TDC_5]--; - gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); - } - else - { - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 1; - gTasks[taskIdC].data[TDC_0]++; - } - break; - case 6: - gTasks[taskIdC].data[TDC_0] = 50; - break; - case 10: - gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 2; - gTasks[taskIdC].data[TDC_0] = 50; - break; - case 20: - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 4; - gTasks[taskIdC].data[TDC_0] = 50; - break; - case 30: - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 5; - gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 3; - gTasks[taskIdC].data[TDC_0] = 50; - break; - case 50: - gTasks[taskIdC].data[TDC_0] = 0; - break; - } -} - -void task_e_8144934(u8 taskIdE) -{ - s16 taskIdC; - - switch (gTasks[taskIdE].data[TDE_0]) - { - default: - case 0: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) - { - - if (gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_B_ID]].data[TDB_CURRENT_PAGE] == PAGE_ART_DIRECTOR) - { - gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 20; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; - } - } - sub_8149020(0); - break; - case 1: - sub_8149020(0); - break; - case 2: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) - { - taskIdC = gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]; - - // Floor to multiple of 128 - if ((gTasks[taskIdC].data[TDC_5] & -128) == 640) - { - gTasks[taskIdC].data[TDC_0] = 1; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; - } - } - sub_8149020(1); - break; - case 3: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) - { - - if (gTasks[taskIdE].data[TDE_1] == UNK_DEF_1F3) - { - gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 10; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; - } - else - { - gTasks[taskIdE].data[TDE_1] += 1; - } - } - sub_8149020(1); - break; - case 4: - sub_8149020(2); - break; - } -} - -static void sub_8144A68(u8 data, u8 taskIdA) -{ - switch (data) - { - case 0: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8); - break; - case 1: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8); - break; - case 2: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8); - break; - case 3: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8); - break; - case 4: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 88; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = sub_8148EC0(2, 0x2000, 0x200, 8); - break; - } - - gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(task_e_8144934, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_0] = data; - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_1] = 0; - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_TASK_A_ID] = taskIdA; - - gTasks[taskIdA].data[TDA_TASK_C_ID] = CreateTask(task_c_8144664, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_0] = 0; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_1] = taskIdA; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_2] = gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_3] = gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_4] = 0; - - if (data == 2) - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_5] = UNK_DEFINE_45; -} - -static bool8 sub_8144ECC(u8 data, u8 taskIdA) -{ - u8 spriteId; - - switch (gMain.state) - { - default: - case 0: - REG_DISPCNT = 0; - REG_BG3HOFS = 8; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - ResetSpriteData(); - FreeAllSpritePalettes(); - gMain.state = 1; - break; - case 1: - gUnknown_02039358 = 34; - gUnknown_0203935A = 0; - sub_8148CB0(data); - gMain.state += 1; - break; - case 2: - if (gSaveBlock2.playerGender == MALE) - { - LoadCompressedObjectPic(gIntro2BrendanSpriteSheet); - LoadCompressedObjectPic(gUnknown_08416E34); - LoadCompressedObjectPic(gIntro2BicycleSpriteSheet); - LoadSpritePalettes(gIntro2SpritePalettes); - - spriteId = intro_create_brendan_sprite(120, 46); - gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; - gSprites[spriteId].callback = spritecb_player_8145378; - gSprites[spriteId].anims = gSpriteAnimTable_0840CA54; - - spriteId = intro_create_may_sprite(272, 46); - gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; - gSprites[spriteId].callback = spritecb_rival_8145420; - gSprites[spriteId].anims = gSpriteAnimTable_0840CA94; - } - else - { - LoadCompressedObjectPic(gIntro2MaySpriteSheet); - LoadCompressedObjectPic(gUnknown_08416E24); - LoadCompressedObjectPic(gIntro2BicycleSpriteSheet); - LoadSpritePalettes(gIntro2SpritePalettes); - - spriteId = intro_create_may_sprite(120, 46); - gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; - gSprites[spriteId].callback = spritecb_player_8145378; - gSprites[spriteId].anims = gSpriteAnimTable_0840CA54; - - spriteId = intro_create_brendan_sprite(272, 46); - gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; - gSprites[spriteId].callback = spritecb_rival_8145420; - gSprites[spriteId].anims = gSpriteAnimTable_0840CA94; - }; - gMain.state += 1; - break; - case 3: - sub_8144A68(data, taskIdA); - sub_8148E90(data); - gMain.state = 0; - return TRUE; - } - return FALSE; -} - -static void sub_81450AC(u8 taskIdA) -{ - if (gTasks[taskIdA].data[TDA_0] != 0) - { - DestroyTask(gTasks[taskIdA].data[TDA_0]); - gTasks[taskIdA].data[TDA_0] = 0; - } - - if (gTasks[taskIdA].data[TDA_TASK_C_ID] != 0) - { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_C_ID]); - gTasks[taskIdA].data[TDA_TASK_C_ID] = 0; - } - - if (gTasks[taskIdA].data[TDA_TASK_E_ID] != 0) - { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_E_ID]); - gTasks[taskIdA].data[TDA_TASK_E_ID] = 0; - } - - if (gTasks[taskIdA].data[TDA_TASK_D_ID] != 0) - { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_D_ID]); - gTasks[taskIdA].data[TDA_TASK_D_ID] = 0; - } - - gUnknown_0203935C = 1; -} - -static void sub_8145128(u16 arg0, u16 arg1, u16 arg2) -{ - u16 baseTile; - u16 i; - - LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *) (VRAM + arg0)); - LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal)); - - baseTile = (arg2 / 16) << 12; - - for (i = 0; i < 32 * 32; i++) - ((u16 *) (VRAM + arg1))[i] = baseTile + 1; - - for (i = 0; i < 21; i++) - ((u16 *) (VRAM + arg1))[7 * 32 + 4 + i] = i + 2 + baseTile; - - for (i = 0; i < 20; i++) - ((u16 *) (VRAM + arg1))[9 * 32 + 4 + i] = i + 23 + baseTile; - - for (i = 0; i < 23; i++) - ((u16 *) (VRAM + arg1))[11 * 32 + 4 + i] = i + 43 + baseTile; - - for (i = 0; i < 12; i++) - ((u16 *) (VRAM + arg1))[13 * 32 + 4 + i] = i + 66 + baseTile; -} - -u16 sub_8145208(u8 arg0) -{ - u16 out = (arg0 & 0x3F) + 80; - - if (arg0 == 0xFF) - return 1; - - if (arg0 & (1 << 7)) - out |= 1 << 11; - if (arg0 & (1 << 6)) - out |= 1 << 10; - - return out; -} - -void sub_814524C(const u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette) -{ - u8 y, x; - const u16 tileOffset = (palette / 16) << 12; - - for (y = 0; y < 5; y++) - { - for (x = 0; x < 3; x++) - ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8145208(arg0[y * 3 + x]); - } -} - -static void sub_81452D0(u16 arg0, u16 palette) -{ - u16 pos; - u16 baseTile = (palette / 16) << 12; - - for (pos = 0; pos < 32 * 32; pos++) - ((u16 *) (VRAM + arg0))[pos] = baseTile + 1; - -#if ENGLISH - sub_814524C(gUnknown_0840B83C, 3, 7, arg0, palette); - sub_814524C(gUnknown_0840B84B, 7, 7, arg0, palette); - sub_814524C(gUnknown_0840B85A, 11, 7, arg0, palette); - sub_814524C(gUnknown_0840B85A, 16, 7, arg0, palette); - sub_814524C(gUnknown_0840B869, 20, 7, arg0, palette); - sub_814524C(gUnknown_0840B878, 24, 7, arg0, palette); -#elif GERMAN - sub_814524C(gUnknown_0840B85A, 7, 7, arg0, palette); - sub_814524C(gUnknown_0840B869, 11, 7, arg0, palette); - sub_814524C(gUnknown_0840B878, 15, 7, arg0, palette); - sub_814524C(gUnknown_0840B85A, 19, 7, arg0, palette); -#endif -} - -static void spritecb_player_8145378(struct Sprite *sprite) -{ - if (gUnknown_0203935C != 0) - { - DestroySprite(sprite); - return; - } - - switch (sprite->data[0]) - { - case 0: - StartSpriteAnimIfDifferent(sprite, 0); - break; - case 1: - StartSpriteAnimIfDifferent(sprite, 1); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; - break; - case 2: - StartSpriteAnimIfDifferent(sprite, 2); - break; - case 3: - StartSpriteAnimIfDifferent(sprite, 3); - break; - case 4: - StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->pos1.x > 120) - sprite->pos1.x -= 1; - break; - case 5: - StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; - break; - } -} - -static void spritecb_rival_8145420(struct Sprite *sprite) -{ - if (gUnknown_0203935C != 0) - { - DestroySprite(sprite); - return; - } - - switch (sprite->data[0]) - { - case 0: - sprite->pos2.y = 0; - StartSpriteAnimIfDifferent(sprite, 0); - break; - case 1: - if (sprite->pos1.x > 200) - StartSpriteAnimIfDifferent(sprite, 1); - else - StartSpriteAnimIfDifferent(sprite, 2); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 2; - sprite->pos2.y = -gUnknown_0203935A; - break; - case 2: - sprite->data[7] += 1; - StartSpriteAnimIfDifferent(sprite, 0); - if ((sprite->data[7] & 3) == 0) - sprite->pos1.x += 1; - break; - case 3: - StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; - break; - } -} - -void spritecb_81454E0(struct Sprite *sprite) -{ - if (gUnknown_0203935C) - { - DestroySprite(sprite); - return; - } - - sprite->data[7] += 1; - switch (sprite->data[0]) - { - case 0: - default: - sprite->oam.affineMode = 1; - sprite->oam.matrixNum = sprite->data[1]; - sprite->data[2] = 16; - SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); - sprite->invisible = FALSE; - sprite->data[0] = 1; - break; - case 1: - if (sprite->data[2] < 256) - { - sprite->data[2] += 8; - SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); - } - else - { - sprite->data[0] += 1; - } - switch (sprite->data[1]) - { - case 1: - if ((sprite->data[7] & 3) == 0) - sprite->pos1.y += 1; - sprite->pos1.x -= 2; - break; - case 2: - break; - case 3: - if ((sprite->data[7] & 3) == 0) - sprite->pos1.y += 1; - sprite->pos1.x += 2; - break; - } - break; - case 2: - if (sprite->data[3] != 0) - { - sprite->data[3] -= 1; - } - else - { - REG_BLDCNT = 0xF40; - REG_BLDALPHA = 0x10; - sprite->oam.objMode = 1; - sprite->data[3] = 16; - sprite->data[0] += 1; - } - break; - case 3: - if (sprite->data[3] != 0) - { - int data3; - vu16 *reg; - - sprite->data[3] -= 1; - - reg = ®_BLDALPHA; - data3 = 16 - sprite->data[3]; - *reg = (data3 << 8) + sprite->data[3]; - } - else - { - sprite->invisible = TRUE; - sprite->data[0] = 10; - } - break; - case 10: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - DestroySprite(sprite); - break; - } -} - -static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position) -{ - u32 personality; - const u8 *lzPaletteData; - u8 spriteId; - u8 spriteId2; - - species = NationalPokedexNumToSpecies(species); - switch (species) - { - default: - personality = 0; - break; - case SPECIES_SPINDA: - personality = gSaveBlock2.pokedex.spindaPersonality; - break; - case SPECIES_UNOWN: - personality = gSaveBlock2.pokedex.unownPersonality; - break; - } - - LoadSpecialPokePic( - &gMonFrontPicTable[species], - gMonFrontPicCoords[species].coords, - gMonFrontPicCoords[species].y_offset, - 0x2000000, - gUnknown_0840B5A0[position], - species, - personality, - 1 - ); - - lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF); - LoadCompressedPalette(lzPaletteData, 0x100 + (position * 16), 0x20); - sub_8143648(position, position); - - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); - gSprites[spriteId].oam.paletteNum = position; - gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].data[1] = position + 1; - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].callback = spritecb_81454E0; - - spriteId2 = CreateSprite(&gSpriteTemplate_840CAEC, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1); - gSprites[spriteId2].data[0] = spriteId; - - StartSpriteAnimIfDifferent(&gSprites[spriteId2], position); - - return spriteId; -} - -void spritecb_814580C(struct Sprite *sprite) -{ - if (gSprites[sprite->data[0]].data[0] == 10 || gUnknown_0203935C) - { - DestroySprite(sprite); - return; - } - - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->oam.objMode = gSprites[sprite->data[0]].oam.objMode; - sprite->oam.affineMode = gSprites[sprite->data[0]].oam.affineMode; - sprite->oam.matrixNum = gSprites[sprite->data[0]].oam.matrixNum; - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; -} - -static void sub_81458DC(void) -{ - struct Unk201C000 *unk201C000 = &ewram1c000; - u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_STARTER_MON))); - u16 seenTypesCount; - u16 page; - u16 dexNum; - u16 j; - - for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++) - { - if (GetSetPokedexFlag(dexNum, 1)) - { - unk201C000->unk90[seenTypesCount] = dexNum; - seenTypesCount++; - } - } - - for (dexNum = seenTypesCount; dexNum < 386; dexNum++) - unk201C000->unk90[dexNum] = 0; - - unk201C000->unk394 = seenTypesCount; - if (unk201C000->unk394 < POKEMON_TILE_COUNT) - unk201C000->unk8E = seenTypesCount; - else - unk201C000->unk8E = POKEMON_TILE_COUNT; - - j = 0; - do - { - page = Random() % unk201C000->unk394; - unk201C000->unk0[j] = unk201C000->unk90[page]; - - j++; - unk201C000->unk90[page] = 0; - unk201C000->unk394--; - if (page != unk201C000->unk394) - { - unk201C000->unk90[page] = unk201C000->unk90[unk201C000->unk394]; - unk201C000->unk90[unk201C000->unk394] = 0; - } - } - while (unk201C000->unk394 != 0 && j < POKEMON_TILE_COUNT); - - if (unk201C000->unk8E < POKEMON_TILE_COUNT) - { - for (j = unk201C000->unk8E, page = 0; j < POKEMON_TILE_COUNT; j++) - { - unk201C000->unk0[j] = unk201C000->unk0[page]; - - page++; - if (page == unk201C000->unk8E) - page = 0; - } - unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; - } - else - { - for (dexNum = 0; unk201C000->unk0[dexNum] != starter && dexNum < POKEMON_TILE_COUNT; dexNum++); - - if (dexNum < unk201C000->unk8E - 1) - { - unk201C000->unk0[dexNum] = unk201C000->unk0[POKEMON_TILE_COUNT - 1]; - unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; - } - else - { - unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter; - } - } - unk201C000->unk8E = POKEMON_TILE_COUNT; -} diff --git a/src/scene/cute_sketch.c b/src/scene/cute_sketch.c deleted file mode 100644 index 5317bc334..000000000 --- a/src/scene/cute_sketch.c +++ /dev/null @@ -1,164 +0,0 @@ -#include "global.h" -#include "cute_sketch.h" -#include "contest_painting.h" - -extern u16 (*gUnknown_03005DEC)[][32]; -extern u8 gUnknown_03005E00; -extern u8 gUnknown_03005DFC; -extern u8 gUnknown_03005DF8; -extern u8 gUnknown_03005DF0; -extern u8 gUnknown_03005E04; -extern u8 gUnknown_03005DF4; - -extern u8 gUnknown_03005DE8; - -// this file's functions -void sub_80FCAA4(void); -void sub_80FCB5C(void); -void sub_80FCD54(void); -void sub_80FCEA4(void); -void sub_80FCCBC(void); -void sub_80FD06C(void); -void sub_80FD114(void); -void sub_80FCF3C(void); -void sub_80FCAC4(void); -void sub_80FCC18(u8); -void sub_80FC92C(u8); -void sub_80FC9E4(u8); -void sub_80FD1C8(u16); -u16 sub_80FD39C(u16*); -u16 sub_80FD68C(u16*, u16*, u16*); - -void sub_80FC7A0(struct Unk03005E20* info) -{ - gUnknown_03005DEC = info->var_4; - gUnknown_03005E00 = info->var_1F; - gUnknown_03005DE8 = info->var_19; - gUnknown_03005DFC = info->var_1A; - gUnknown_03005DF8 = info->var_1B; - gUnknown_03005DF0 = info->var_1C; - gUnknown_03005E04 = info->var_1D; - gUnknown_03005DF4 = info->var_1E; - switch (info->var_0) - { - case 2: - sub_80FCAA4(); - break; - case 8: - sub_80FCB5C(); - break; - case 9: - sub_80FCD54(); - sub_80FCC18(gUnknown_03005E00); - break; - case 10: - sub_80FCD54(); - sub_80FCEA4(); - sub_80FCCBC(); - case 31: - sub_80FCEA4(); - break; - case 11: - sub_80FCD54(); - sub_80FD06C(); - sub_80FD06C(); - sub_80FD114(); - sub_80FCCBC(); - break; - case 13: - sub_80FCF3C(); - break; - case 30: - sub_80FCD54(); - break; - case 32: - sub_80FD06C(); - break; - case 33: - sub_80FD114(); - break; - case 6: - sub_80FCAC4(); - sub_80FC92C(3); - break; - case 36: - sub_80FCD54(); - sub_80FD06C(); - sub_80FD114(); - sub_80FCCBC(); - sub_80FCB5C(); - sub_80FCB5C(); - sub_80FC92C(2); - sub_80FC9E4(4); - break; - } -} - -#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r)) - -void sub_80FC92C(u8 a0) // it changes palette someway somehow... .__. -{ - u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) - { - u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; - u16* pal = &var2[gUnknown_03005DE8]; - for (j = 0; j < gUnknown_03005DF8; j++, pal++) - { - if (!(0x8000 & *pal)) - { - u8 val = (31 & *pal); - val += a0; - if (val > 31) - val = 31; - - *pal = RGB2(val, val, val); - } - } - } -} - -void sub_80FC9E4(u8 a0) -{ - u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) - { - u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; - u16* pal = &var2[gUnknown_03005DE8]; - for (j = 0; j < gUnknown_03005DF8; j++, pal++) - { - if (!(0x8000 & *pal)) - { - u8 val = (31 & *pal); - if (val > 31 - a0) - val = 31 - (a0 >> 1); - - *pal = RGB2(val, val, val); - } - } - } -} - -void sub_80FCAA4(void) -{ - u32 i; - for (i = 0; i < 3200; i++) - sub_80FD1C8(i); -} - -void sub_80FCAC4(void) -{ - u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) - { - u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; - u16* pal = &var2[gUnknown_03005DE8]; - for (j = 0; j < gUnknown_03005DF8; j++, pal++) - { - if (!(0x8000 & *pal)) - { - *pal = sub_80FD39C(pal); - } - } - } -} diff --git a/src/scene/egg_hatch.c b/src/scene/egg_hatch.c deleted file mode 100644 index 282ad31fb..000000000 --- a/src/scene/egg_hatch.c +++ /dev/null @@ -1,838 +0,0 @@ -#include "global.h" -#include "data2.h" -#include "daycare.h" -#include "decompress.h" -#include "event_data.h" -#include "ewram.h" -#include "constants/items.h" -#include "main.h" -#include "menu.h" -#include "naming_screen.h" -#include "overworld.h" -#include "palette.h" -#include "pokemon.h" -#include "random.h" -#include "script.h" -#include "constants/songs.h" -#include "sound.h" -#include "string_util.h" -#include "strings2.h" -#include "task.h" -#include "text.h" -#include "text_window.h" -#include "trig.h" -#include "trade.h" - -extern struct SpriteTemplate gUnknown_02024E8C; - -struct EggHatchData -{ - u8 eggSpriteID; - u8 pokeSpriteID; - u8 CB2_state; - u8 CB2_PalCounter; - u8 eggPartyID; - struct Window window; - u8 tileDataStartOffset; - u8 unused_39; - u8 eggShardVelocityID; -}; - -struct EggHatchData* gEggHatchData; - -extern const u32 gUnknown_08D00000[]; -extern const u32 gUnknown_08D00524[]; -extern const u16 gUnknown_08D004E0[]; //palette -extern const struct SpriteSheet sUnknown_0820A3B0; -extern const struct SpriteSheet sUnknown_0820A3B8; -extern const struct SpritePalette sUnknown_0820A3C0; - -bool8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); -u8 sav1_map_get_name(void); -const struct CompressedSpritePalette* GetMonSpritePalStruct(struct Pokemon* mon); //gets pokemon palette address -void sub_8080990(void); - -static void Task_EggHatch(u8 taskID); -static void CB2_EggHatch_0(void); -static void CB2_EggHatch_1(void); -static void SpriteCB_Egg_0(struct Sprite* sprite); -static void SpriteCB_Egg_1(struct Sprite* sprite); -static void SpriteCB_Egg_2(struct Sprite* sprite); -static void SpriteCB_Egg_3(struct Sprite* sprite); -static void SpriteCB_Egg_4(struct Sprite* sprite); -static void SpriteCB_Egg_5(struct Sprite* sprite); -static void SpriteCB_EggShard(struct Sprite* sprite); -static void EggHatchPrintMessage2(u8* src); -static void EggHatchPrintMessage1(u8* src); -static bool8 EggHatchUpdateWindowText(void); -static void CreateRandomEggShardSprite(void); -static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex); - -// graphics - -static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/egg/palette.gbapal"); -static const u8 sEggHatchTiles[] = INCBIN_U8("graphics/misc/egg_hatch.4bpp"); -static const u8 sEggShardTiles[] = INCBIN_U8("graphics/misc/egg_shard.4bpp"); - -static const struct OamData sOamData_820A378 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_820A380[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_820A388[] = -{ - ANIMCMD_FRAME(16, 5), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_820A390[] = -{ - ANIMCMD_FRAME(32, 5), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_820A398[] = -{ - ANIMCMD_FRAME(48, 5), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_820A3A0[] = -{ - sSpriteAnim_820A380, - sSpriteAnim_820A388, - sSpriteAnim_820A390, - sSpriteAnim_820A398, -}; - -static const struct SpriteSheet sUnknown_0820A3B0 = -{ - .data = sEggHatchTiles, - .size = 2048, - .tag = 12345, -}; - -static const struct SpriteSheet sUnknown_0820A3B8 = -{ - .data = sEggShardTiles, - .size = 128, - .tag = 23456, -}; - -static const struct SpritePalette sUnknown_0820A3C0 = -{ - .data = sEggPalette, - .tag = 54321 -}; - -static const struct SpriteTemplate sSpriteTemplate_820A3C8 = -{ - .tileTag = 12345, - .paletteTag = 54321, - .oam = &sOamData_820A378, - .anims = sSpriteAnimTable_820A3A0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - - -static const struct OamData sOamData_820A3E0 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_820A3E8[] = -{ - ANIMCMD_FRAME(0, 5), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_820A3F0[] = -{ - ANIMCMD_FRAME(1, 5), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_820A3F8[] = -{ - ANIMCMD_FRAME(2, 5), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_820A400[] = -{ - ANIMCMD_FRAME(3, 5), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_820A408[] = -{ - sSpriteAnim_820A3E8, - sSpriteAnim_820A3F0, - sSpriteAnim_820A3F8, - sSpriteAnim_820A400, -}; - -static const struct SpriteTemplate sSpriteTemplate_820A418 = -{ - .tileTag = 23456, - .paletteTag = 54321, - .oam = &sOamData_820A3E0, - .anims = sSpriteAnimTable_820A408, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_EggShard -}; - -// actual code - -static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp) -{ - u16 species; - u32 personality, pokerus; - u8 i, friendship, language, gameMet, markings; - u16 moves[4]; - u32 ivs[6]; - - - species = GetMonData(egg, MON_DATA_SPECIES); - - for (i = 0; i < 4; i++) - { - moves[i] = GetMonData(egg, MON_DATA_MOVE1 + i); - } - - personality = GetMonData(egg, MON_DATA_PERSONALITY); - - for (i = 0; i < 6; i++) - { - ivs[i] = GetMonData(egg, MON_DATA_HP_IV + i); - } - - gameMet = GetMonData(egg, MON_DATA_MET_GAME); - markings = GetMonData(egg, MON_DATA_MARKINGS); - pokerus = GetMonData(egg, MON_DATA_POKERUS); - - CreateMon(temp, species, 5, 32, TRUE, personality, 0, 0); - - for (i = 0; i < 4; i++) - { - SetMonData(temp, MON_DATA_MOVE1 + i, (const u8 *) &moves[i]); - } - - for (i = 0; i < 6; i++) - { - SetMonData(temp, MON_DATA_HP_IV + i, (const u8 *) &ivs[i]); - } - - language = GAME_LANGUAGE; - SetMonData(temp, MON_DATA_LANGUAGE, &language); - SetMonData(temp, MON_DATA_MET_GAME, &gameMet); - SetMonData(temp, MON_DATA_MARKINGS, &markings); - - friendship = 120; - SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship); - SetMonData(temp, MON_DATA_POKERUS, (const u8 *) &pokerus); - - *egg = *temp; -} - -static void AddHatchedMonToParty(u8 id) -{ - u8 isEgg; - u16 pokeNum; - u8 name[12]; - u16 ball; - u16 caughtLvl; - u8 mapNameID; - struct Pokemon* mon = &gPlayerParty[id]; - - CreatedHatchedMon(mon, &gEnemyParty[0]); - isEgg = 0; - SetMonData(mon, MON_DATA_IS_EGG, &isEgg); - - pokeNum = GetMonData(mon, MON_DATA_SPECIES); - GetSpeciesName(name, pokeNum); - SetMonData(mon, MON_DATA_NICKNAME, name); - - pokeNum = SpeciesToNationalPokedexNum(pokeNum); - GetSetPokedexFlag(pokeNum, 2); - GetSetPokedexFlag(pokeNum, 3); - - GetMonNick(mon, gStringVar1); - - ball = ITEM_POKE_BALL; - SetMonData(mon, MON_DATA_POKEBALL, (const u8*) &ball); - - caughtLvl = 0; - SetMonData(mon, MON_DATA_MET_LEVEL, (const u8*) &caughtLvl); - - mapNameID = sav1_map_get_name(); - SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID); - - MonRestorePP(mon); - CalculateMonStats(mon); -} - -void ScriptHatchMon(void) -{ - AddHatchedMonToParty(gSpecialVar_0x8004); -} - -#ifdef NONMATCHING -static bool8 sub_8042ABC(void* a, u8 b) -{ - -} - -#else -__attribute__((naked)) -static bool8 sub_8042ABC(void* a, u8 b) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x20\n\ - adds r5, r0, 0\n\ - lsls r4, r1, 24\n\ - lsrs r4, 24\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 4\n\ - adds r0, r5, r0\n\ - mov r1, sp\n\ - bl GetBoxMonNick\n\ - lsls r0, r4, 3\n\ - subs r0, r4\n\ - lsls r1, r0, 3\n\ - adds r0, r5, r1\n\ - adds r0, 0xC0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - beq _08042B40\n\ - adds r0, r1, 0\n\ - adds r0, 0xA0\n\ - adds r5, r0\n\ - adds r6, r5, 0\n\ - adds r6, 0x2C\n\ - mov r0, sp\n\ - adds r1, r6, 0\n\ - bl StringCompareWithoutExtCtrlCodes\n\ - cmp r0, 0\n\ - bne _08042B08\n\ - ldr r0, _08042B30 @ =gSaveBlock2\n\ - adds r1, r5, 0\n\ - adds r1, 0x24\n\ - bl StringCompareWithoutExtCtrlCodes\n\ - cmp r0, 0\n\ - beq _08042B40\n\ -_08042B08:\n\ - ldr r0, _08042B34 @ =gStringVar1\n\ - mov r1, sp\n\ - bl StringCopy\n\ - ldr r4, _08042B38 @ =gStringVar2\n\ - adds r1, r5, 0\n\ - adds r1, 0x24\n\ - adds r0, r4, 0\n\ - bl StringCopy\n\ - ldr r0, _08042B3C @ =gStringVar3\n\ - adds r1, r6, 0\n\ - bl StringCopy\n\ - adds r0, r4, 0\n\ - bl SanitizeNameString\n\ - movs r0, 0x1\n\ - b _08042B42\n\ - .align 2, 0\n\ -_08042B30: .4byte gSaveBlock2\n\ -_08042B34: .4byte gStringVar1\n\ -_08042B38: .4byte gStringVar2\n\ -_08042B3C: .4byte gStringVar3\n\ -_08042B40:\n\ - movs r0, 0\n\ -_08042B42:\n\ - add sp, 0x20\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided"); -} - -#endif // NONMATCHING - -bool8 sub_8042B4C(void) -{ - return sub_8042ABC(&gSaveBlock1.daycare, gSpecialVar_0x8004); -} - -static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID) -{ - u8 r5 = 0; - u8 spriteID = 0; - struct Pokemon* mon = NULL; - - if (a0 == 0) - { - mon = &gPlayerParty[pokeID]; - r5 = 1; - } - if (a0 == 1) - { - mon = &gPlayerParty[pokeID]; - r5 = 3; - } - switch (switchID) - { - case 0: - { - u16 species = GetMonData(mon, MON_DATA_SPECIES); - u32 pid = GetMonData(mon, MON_DATA_PERSONALITY); - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, ewram0_6, gUnknown_081FAF4C[2 * a0 + 1], species, pid); - LoadCompressedObjectPalette(GetMonSpritePalStruct(mon)); - } - break; - case 1: - GetMonSpriteTemplate_803C56C(GetMonSpritePalStruct(mon)->tag, r5); - spriteID = CreateSprite(&gUnknown_02024E8C, 120, 70, 6); - gSprites[spriteID].invisible = 1; - gSprites[spriteID].callback = SpriteCallbackDummy; - break; - } - return spriteID; -} - -static void VBlankCB_EggHatch(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -void EggHatch(void) -{ - ScriptContext2_Enable(); - CreateTask(Task_EggHatch, 10); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); -} - -static void Task_EggHatch(u8 taskID) -{ - if (!gPaletteFade.active) - { - SetMainCallback2(CB2_EggHatch_0); - gFieldCallback = sub_8080990; - DestroyTask(taskID); - } -} - -static void CB2_EggHatch_0(void) -{ - switch (gMain.state) - { - case 0: - REG_DISPCNT = 0; - gEggHatchData = eEggHatchData; - gEggHatchData->eggPartyID = gSpecialVar_0x8004; - gEggHatchData->eggShardVelocityID = 0; - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - SetVBlankCallback(VBlankCB_EggHatch); - gMain.state++; - gSpecialVar_0x8005 = GetCurrentMapMusic(); - break; - case 1: - Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); - Text_InitWindowWithTemplate(&gEggHatchData->window, &gWindowTemplate_81E6F84); - gEggHatchData->tileDataStartOffset = TextWindow_SetBaseTileNum(20); - TextWindow_LoadStdFrameGraphics(&gEggHatchData->window); - gMain.state++; - break; - case 2: - LZDecompressVram(&gUnknown_08D00000, (void*)(VRAM)); - CpuSet(&gUnknown_08D00524, ewram0_7, 0x800); - DmaCopy16(3, ewram0_7, (void*)(VRAM + 0x2800), 0x500); - LoadCompressedPalette(&gUnknown_08D004E0, 0, 0x20); - gMain.state++; - break; - case 3: - LoadSpriteSheet(&sUnknown_0820A3B0); - LoadSpriteSheet(&sUnknown_0820A3B8); - LoadSpritePalette(&sUnknown_0820A3C0); - gMain.state++; - break; - case 4: - gEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_820A3C8, 0x78, 0x4B, 5); - AddHatchedMonToParty(gEggHatchData->eggPartyID); - gMain.state++; - break; - case 5: - EggHatchCreateMonSprite(0, 0, gEggHatchData->eggPartyID); - gMain.state++; - break; - case 6: - gEggHatchData->pokeSpriteID = EggHatchCreateMonSprite(0, 1, gEggHatchData->eggPartyID); - gMain.state++; - break; - case 7: - REG_BG2CNT = 0x4C06; - LoadPalette(gUnknown_0820C9F8, 0x10, 0xA0); - DmaCopyLarge16(3, gUnknown_0820CA98, (void *)(VRAM + 0x4000), 0x1300, 0x1000); - DmaCopy16Defvars(3, gUnknown_0820F798, (void *)(VRAM + 0x6000), 0x1000); - gMain.state++; - break; - case 8: - REG_BG1CNT = 0x501; - - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - - SetMainCallback2(CB2_EggHatch_1); - gEggHatchData->CB2_state = 0; - break; - } -} - -static void EggHatchSetMonNickname(void) -{ - SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3); - SetMainCallback2(c2_exit_to_overworld_2_switch); -} - -static void Task_EggHatchPlayBGM(u8 taskID) -{ - if (gTasks[taskID].data[0] == 0) - StopMapMusic(); - if (gTasks[taskID].data[0] == 1) - PlayBGM(376); - if (gTasks[taskID].data[0] > 60) - { - PlayBGM(377); - DestroyTask(taskID); - //return; task is destroyed, yet you increment the value? - } - gTasks[taskID].data[0]++; -} - -static void CB2_EggHatch_1(void) -{ - switch (gEggHatchData->CB2_state) - { - case 0: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - REG_DISPCNT = 0x1740; - gEggHatchData->CB2_state++; - CreateTask(Task_EggHatchPlayBGM, 5); - break; - case 1: - if (!gPaletteFade.active) - { - gEggHatchData->CB2_PalCounter = 0; - gEggHatchData->CB2_state++; - } - break; - case 2: - if (++gEggHatchData->CB2_PalCounter > 30) - { - gEggHatchData->CB2_state++; - gSprites[gEggHatchData->eggSpriteID].callback = SpriteCB_Egg_0; - } - break; - case 3: - if (gSprites[gEggHatchData->eggSpriteID].callback == SpriteCallbackDummy) - gEggHatchData->CB2_state++; - break; - case 4: - GetMonNick(&gPlayerParty[gEggHatchData->eggPartyID], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_HatchedFromEgg); - EggHatchPrintMessage2(gStringVar4); - PlayFanfare(371); - gEggHatchData->CB2_state++; - break; - case 5: - if (IsFanfareTaskInactive()) - gEggHatchData->CB2_state++; - break; - case 6: - if (IsFanfareTaskInactive()) - gEggHatchData->CB2_state++; - break; - case 7: - GetMonNick(&gPlayerParty[gEggHatchData->eggPartyID], gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_NickHatchPrompt); - EggHatchPrintMessage1(gStringVar4); - gEggHatchData->CB2_state++; - break; - case 8: - if (EggHatchUpdateWindowText()) - { - Menu_DrawStdWindowFrame(22, 8, 27, 13); - InitYesNoMenu(22, 8, 4); - gEggHatchData->CB2_state++; - } - break; - case 9: - { - s8 menuInput; - if ((menuInput = Menu_ProcessInputNoWrap_()) != -2) - { - if (menuInput != -1 && menuInput != 1) - { - u16 species; - u8 gender; - u32 personality; - - GetMonNick(&gPlayerParty[gEggHatchData->eggPartyID], gStringVar3); - species = GetMonData(&gPlayerParty[gEggHatchData->eggPartyID], MON_DATA_SPECIES); - gender = GetMonGender(&gPlayerParty[gEggHatchData->eggPartyID]); - personality = GetMonData(&gPlayerParty[gEggHatchData->eggPartyID], MON_DATA_PERSONALITY, 0); - DoNamingScreen(3, gStringVar3, species, gender, personality, EggHatchSetMonNickname); - } - else - gEggHatchData->CB2_state++; - } - } - break; - case 10: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gEggHatchData->CB2_state++; - break; - case 11: - if (!gPaletteFade.active) - SetMainCallback2(c2_exit_to_overworld_2_switch); - break; - } - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void SpriteCB_Egg_0(struct Sprite* sprite) -{ - if (++sprite->data[0] > 20) - { - sprite->callback = SpriteCB_Egg_1; - sprite->data[0] = 0; - } - else - { - sprite->data[1] = (sprite->data[1] + 20) & 0xFF; - sprite->pos2.x = Sin(sprite->data[1], 1); - if (sprite->data[0] == 15) - { - PlaySE(SE_BOWA); - StartSpriteAnim(sprite, 1); - CreateRandomEggShardSprite(); - } - } -} - -static void SpriteCB_Egg_1(struct Sprite* sprite) -{ - if (++sprite->data[2] > 30) - { - if (++sprite->data[0] > 20) - { - sprite->callback = SpriteCB_Egg_2; - sprite->data[0] = 0; - sprite->data[2] = 0; - } - else - { - sprite->data[1] = (sprite->data[1] + 20) & 0xFF; - sprite->pos2.x = Sin(sprite->data[1], 2); - if (sprite->data[0] == 15) - { - PlaySE(SE_BOWA); - StartSpriteAnim(sprite, 2); - } - } - } -} - -static void SpriteCB_Egg_2(struct Sprite* sprite) -{ - if (++sprite->data[2] > 30) - { - if (++sprite->data[0] > 38) - { - u16 species; - - sprite->callback = SpriteCB_Egg_3; - sprite->data[0] = 0; - species = GetMonData(&gPlayerParty[gEggHatchData->eggPartyID], MON_DATA_SPECIES); - gSprites[gEggHatchData->pokeSpriteID].pos2.x = 0; - gSprites[gEggHatchData->pokeSpriteID].pos2.y = gMonFrontPicCoords[species].y_offset; - } - else - { - sprite->data[1] = (sprite->data[1] + 20) & 0xFF; - sprite->pos2.x = Sin(sprite->data[1], 2); - if (sprite->data[0] == 15) - { - PlaySE(SE_BOWA); - StartSpriteAnim(sprite, 2); - CreateRandomEggShardSprite(); - CreateRandomEggShardSprite(); - } - if (sprite->data[0] == 30) - PlaySE(SE_BOWA); - } - } -} - -static void SpriteCB_Egg_3(struct Sprite* sprite) -{ - if (++sprite->data[0] > 50) - { - sprite->callback = SpriteCB_Egg_4; - sprite->data[0] = 0; - } -} - -static void SpriteCB_Egg_4(struct Sprite* sprite) -{ - s16 i; - if (sprite->data[0] == 0) - BeginNormalPaletteFade(-1, -1, 0, 0x10, 0xFFFF); - if (sprite->data[0] < 4u) - { - for (i = 0; i <= 3; i++) - CreateRandomEggShardSprite(); - } - sprite->data[0]++; - if (!gPaletteFade.active) - { - PlaySE(SE_TAMAGO); - sprite->invisible = 1; - sprite->callback = SpriteCB_Egg_5; - sprite->data[0] = 0; - } -} - -static void SpriteCB_Egg_5(struct Sprite* sprite) -{ - if (sprite->data[0] == 0) - { - gSprites[gEggHatchData->pokeSpriteID].invisible = 0; - StartSpriteAffineAnim(&gSprites[gEggHatchData->pokeSpriteID], 1); - } - if (sprite->data[0] == 8) - BeginNormalPaletteFade(-1, -1, 0x10, 0, 0xFFFF); - if (sprite->data[0] <= 9) - gSprites[gEggHatchData->pokeSpriteID].pos1.y -= 1; - if (sprite->data[0] > 40) - sprite->callback = SpriteCallbackDummy; - sprite->data[0]++; -} - -static void SpriteCB_EggShard(struct Sprite* sprite) -{ - sprite->data[4] += sprite->data[1]; - sprite->data[5] += sprite->data[2]; - - sprite->pos2.x = sprite->data[4] / 256; - sprite->pos2.y = sprite->data[5] / 256; - - sprite->data[2] += sprite->data[3]; - - if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data[2] > 0) - DestroySprite(sprite); -} - -// Converts a number to Q8.8 fixed-point format -#define Q_8_8(n) ((s16)((n) * 256)) - -static const s16 sEggShardVelocities[][2] = -{ - {Q_8_8(-1.5), Q_8_8(-3.75)}, - {Q_8_8(-5), Q_8_8(-3)}, - {Q_8_8(3.5), Q_8_8(-3)}, - {Q_8_8(-4), Q_8_8(-3.75)}, - {Q_8_8(2), Q_8_8(-1.5)}, - {Q_8_8(-0.5), Q_8_8(-6.75)}, - {Q_8_8(5), Q_8_8(-2.25)}, - {Q_8_8(-1.5), Q_8_8(-3.75)}, - {Q_8_8(4.5), Q_8_8(-1.5)}, - {Q_8_8(-1), Q_8_8(-6.75)}, - {Q_8_8(4), Q_8_8(-2.25)}, - {Q_8_8(-3.5), Q_8_8(-3.75)}, - {Q_8_8(1), Q_8_8(-1.5)}, - {Q_8_8(-3.515625), Q_8_8(-6.75)}, - {Q_8_8(4.5), Q_8_8(-2.25)}, - {Q_8_8(-0.5), Q_8_8(-7.5)}, - {Q_8_8(1), Q_8_8(-4.5)}, - {Q_8_8(-2.5), Q_8_8(-2.25)}, - {Q_8_8(2.5), Q_8_8(-7.5)}, -}; - -static void CreateRandomEggShardSprite(void) -{ - u16 spriteAnimIndex; - - s16 velocity1 = sEggShardVelocities[gEggHatchData->eggShardVelocityID][0]; - s16 velocity2 = sEggShardVelocities[gEggHatchData->eggShardVelocityID][1]; - gEggHatchData->eggShardVelocityID++; - spriteAnimIndex = Random() % 4; - CreateEggShardSprite(120, 60, velocity1, velocity2, 100, spriteAnimIndex); -} - -static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex) -{ - u8 spriteID = CreateSprite(&sSpriteTemplate_820A418, x, y, 4); - gSprites[spriteID].data[1] = data1; - gSprites[spriteID].data[2] = data2; - gSprites[spriteID].data[3] = data3; - StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex); -} - -static void EggHatchPrintMessage1(u8* src) -{ - Text_InitWindow8002EB0(&gEggHatchData->window, src, gEggHatchData->tileDataStartOffset, 3, 15); -} - -static void EggHatchPrintMessage2(u8* src) -{ - Text_InitWindowAndPrintText(&gEggHatchData->window, src, gEggHatchData->tileDataStartOffset, 3, 15); -} - -static bool8 EggHatchUpdateWindowText(void) -{ - return Text_UpdateWindow(&gEggHatchData->window); -} diff --git a/src/scene/evolution_graphics.c b/src/scene/evolution_graphics.c deleted file mode 100644 index b9ef5b402..000000000 --- a/src/scene/evolution_graphics.c +++ /dev/null @@ -1,614 +0,0 @@ -#include "global.h" -#include "evolution_graphics.h" -#include "sprite.h" -#include "trig.h" -#include "random.h" -#include "decompress.h" -#include "task.h" -#include "sound.h" -#include "constants/songs.h" -#include "palette.h" - -// this file's functions -static void EvoSparkle_DummySpriteCb(struct Sprite* sprite); -static void EvoTask_BeginPreSet1_FadeAndPlaySE(u8 taskID); -static void EvoTask_CreatePreEvoSparkleSet1(u8 taskID); -static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskID); -static void EvoTask_BeginPreSparklesSet2(u8 taskID); -static void EvoTask_CreatePreEvoSparklesSet2(u8 taskID); -static void EvoTask_DestroyPreSet2Task(u8 taskID); -static void EvoTask_BeginPostSparklesSet1(u8 taskID); -static void EvoTask_CreatePostEvoSparklesSet1(u8 taskID); -static void EvoTask_DestroyPostSet1Task(u8 taskID); -static void EvoTask_BeginPostSparklesSet2_AndFlash(u8 taskID); -static void EvoTask_CreatePostEvoSparklesSet2_AndFlash(u8 taskID); -static void EvoTask_BeginPostSparklesSet2_AndFlash_Trade(u8 taskID); -static void EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade(u8 taskID); -static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID); - -static void sub_8149FC8(u8 taskID); -static void sub_8149FEC(u8 taskID); -static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskID); -static void PreEvoInVisible_PostEvoVisible_KillTask(u8 taskID); -static void sub_814A03C(u8 taskID); - -// const data -static const u16 sEvoSparklePalette[] = INCBIN_U16("graphics/misc/evo_sparkle.gbapal"); -static const u8 sEvoSparkleTiles[] = INCBIN_U8("graphics/misc/evo_sparkle.4bpp.lz"); - -static const struct CompressedSpriteSheet sEvoSparkleSpriteSheets[] = -{ - {sEvoSparkleTiles, 0x20, 1001}, - {NULL, 0, 0} -}; -static const struct SpritePalette sEvoSparkleSpritePals[] = -{ - {sEvoSparklePalette, 1001}, - {NULL, 0} -}; - -static const struct OamData sOamData_EvoSparkle = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_EvoSparkle[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_EvoSparkle[] = -{ - sSpriteAnim_EvoSparkle, -}; - -static const struct SpriteTemplate sEvoSparkleSpriteTemplate = -{ - .tileTag = 1001, - .paletteTag = 1001, - .oam = &sOamData_EvoSparkle, - .anims = sSpriteAnimTable_EvoSparkle, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = EvoSparkle_DummySpriteCb -}; - -static const s16 sEvoSparkleMatricies[] = -{ - 0x3C0, 0x380, 0x340, 0x300, 0x2C0, 0x280, 0x240, 0x200, 0x1C0, - 0x180, 0x140, 0x100, -4, 0x10, -3, 0x30, -2, 0x50, - -1, 0x70, 0x1, 0x70, 0x2, 0x50, 0x3, 0x30, 0x4, 0x10 -}; - -// code - -static void EvoSparkle_DummySpriteCb(struct Sprite* sprite) -{ - -} - -static void SetEvoSparklesMatrices(void) -{ - u16 i; - for (i = 0; i < 12; i++) - { - SetOamMatrix(20 + i, sEvoSparkleMatricies[i], 0, 0, sEvoSparkleMatricies[i]); - } -} - -static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite) -{ - if (sprite->pos1.y > 8) - { - u8 matrixNum; - - sprite->pos1.y = 88 - (sprite->data[7] * sprite->data[7]) / 80; - sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4; - sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); - sprite->data[6] += 4; - if (sprite->data[7] & 1) - sprite->data[5]--; - sprite->data[7]++; - if (sprite->pos2.y > 0) - sprite->subpriority = 1; - else - sprite->subpriority = 20; - matrixNum = sprite->data[5] / 4 + 20; - if (matrixNum > 31) - matrixNum = 31; - sprite->oam.matrixNum = matrixNum; - } - else - DestroySprite(sprite); -} - -static void CreatePreEvoSparkleSet1(u8 arg0) -{ - u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 88, 0); - if (spriteID != MAX_SPRITES) - { - gSprites[spriteID].data[5] = 48; - gSprites[spriteID].data[6] = arg0; - gSprites[spriteID].data[7] = 0; - gSprites[spriteID].oam.affineMode = 1; - gSprites[spriteID].oam.matrixNum = 31; - gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet1; - } -} - -static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite) -{ - if (sprite->pos1.y < 88) - { - sprite->pos1.y = 8 + (sprite->data[7] * sprite->data[7]) / 5; - sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4; - sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); - sprite->data[5] = 8 + Sin((u8)(sprite->data[7] * 4), 40); - sprite->data[7]++; - } - else - DestroySprite(sprite); -} - -static void CreatePreEvoSparkleSet2(u8 arg0) -{ - u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 8, 0); - if (spriteID != MAX_SPRITES) - { - gSprites[spriteID].data[5] = 8; - gSprites[spriteID].data[6] = arg0; - gSprites[spriteID].data[7] = 0; - gSprites[spriteID].oam.affineMode = 1; - gSprites[spriteID].oam.matrixNum = 25; - gSprites[spriteID].subpriority = 1; - gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet2; - } -} - -static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite) -{ - if (sprite->data[5] > 8) - { - sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]); - sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]); - sprite->data[5] -= sprite->data[3]; - sprite->data[6] += 4; - } - else - DestroySprite(sprite); -} - -static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1) -{ - u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0); - if (spriteID != MAX_SPRITES) - { - gSprites[spriteID].data[3] = arg1; - gSprites[spriteID].data[5] = 120; - gSprites[spriteID].data[6] = arg0; - gSprites[spriteID].data[7] = 0; - gSprites[spriteID].oam.affineMode = 1; - gSprites[spriteID].oam.matrixNum = 31; - gSprites[spriteID].subpriority = 1; - gSprites[spriteID].callback = SpriteCB_PostEvoSparkleSet1; - } -} - -static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite) -{ - if (!(sprite->data[7] & 3)) - sprite->pos1.y++; - if (sprite->data[6] < 128) - { - u8 matrixNum; - - sprite->pos2.y = -Sin((u8)(sprite->data[6]), sprite->data[5]); - sprite->pos1.x = 120 + (sprite->data[3] * sprite->data[7]) / 3; - sprite->data[6]++; - matrixNum = 31 - (sprite->data[6] * 12 / 128); - if (sprite->data[6] > 64) - sprite->subpriority = 1; - else - { - sprite->invisible = 0; - sprite->subpriority = 20; - if (sprite->data[6] > 112 && sprite->data[6] & 1) - sprite->invisible = 1; - } - if (matrixNum < 20) - matrixNum = 20; - sprite->oam.matrixNum = matrixNum; - sprite->data[7]++; - } - else - DestroySprite(sprite); -} - -static void CreatePostEvoSparkleSet2(u8 arg0) -{ - u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0); - if (spriteID != MAX_SPRITES) - { - gSprites[spriteID].data[3] = 3 - (Random() % 7); - gSprites[spriteID].data[5] = 48 + (Random() & 0x3F); - gSprites[spriteID].data[7] = 0; - gSprites[spriteID].oam.affineMode = 1; - gSprites[spriteID].oam.matrixNum = 31; - gSprites[spriteID].subpriority = 20; - gSprites[spriteID].callback = SpriteCB_PostEvoSparkleSet2; - } -} - -void LoadEvoSparkleSpriteAndPal(void) -{ - LoadCompressedObjectPic(&sEvoSparkleSpriteSheets[0]); - LoadSpritePalettes(sEvoSparkleSpritePals); -} - -#define tFrameCounter data[15] - -u8 LaunchTask_PreEvoSparklesSet1(u16 arg0) -{ - u8 taskID = CreateTask(EvoTask_BeginPreSet1_FadeAndPlaySE, 0); - gTasks[taskID].data[1] = arg0; - return taskID; -} - -static void EvoTask_BeginPreSet1_FadeAndPlaySE(u8 taskID) -{ - SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; - BeginNormalPaletteFade(3 << gTasks[taskID].data[1], 0xA, 0, 0x10, 0x7FFF); - gTasks[taskID].func = EvoTask_CreatePreEvoSparkleSet1; - PlaySE(SE_W025); -} - -static void EvoTask_CreatePreEvoSparkleSet1(u8 taskID) -{ - if (gTasks[taskID].tFrameCounter < 64) - { - if (!(gTasks[taskID].tFrameCounter & 7)) - { - u8 i; - for (i = 0; i < 4; i++) - CreatePreEvoSparkleSet1((0x78 & gTasks[taskID].tFrameCounter) * 2 + i * 64); - } - gTasks[taskID].tFrameCounter++; - } - else - { - gTasks[taskID].tFrameCounter = 96; - gTasks[taskID].func = EvoTask_WaitForPre1SparklesToGoUp; - } -} - -static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskID) -{ - if (gTasks[taskID].tFrameCounter != 0) - gTasks[taskID].tFrameCounter--; - else - DestroyTask(taskID); -} - -u8 LaunchTask_PreEvoSparklesSet2(void) -{ - return CreateTask(EvoTask_BeginPreSparklesSet2, 0); -} - -static void EvoTask_BeginPreSparklesSet2(u8 taskID) -{ - SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; - gTasks[taskID].func = EvoTask_CreatePreEvoSparklesSet2; - PlaySE(SE_W062B); -} - -static void EvoTask_CreatePreEvoSparklesSet2(u8 taskID) -{ - if (gTasks[taskID].tFrameCounter < 96) - { - if (gTasks[taskID].tFrameCounter < 6) - { - u8 i; - for (i = 0; i < 9; i++) - CreatePreEvoSparkleSet2(i * 16); - } - gTasks[taskID].tFrameCounter++; - } - else - gTasks[taskID].func = EvoTask_DestroyPreSet2Task; -} - -static void EvoTask_DestroyPreSet2Task(u8 taskID) -{ - DestroyTask(taskID); -} - -u8 LaunchTask_PostEvoSparklesSet1(void) -{ - return CreateTask(EvoTask_BeginPostSparklesSet1, 0); -} - -static void EvoTask_BeginPostSparklesSet1(u8 taskID) -{ - SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; - gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet1; - PlaySE(SE_REAPOKE); -} - -static void EvoTask_CreatePostEvoSparklesSet1(u8 taskID) -{ - if (gTasks[taskID].tFrameCounter < 48) - { - if (gTasks[taskID].tFrameCounter == 0) - { - u8 i; - for (i = 0; i < 16; i++) - CreatePostEvoSparkleSet1(i * 16, 4); - } - if (gTasks[taskID].tFrameCounter == 32) - { - u8 i; - for (i = 0; i < 16; i++) - CreatePostEvoSparkleSet1(i * 16, 8); - } - gTasks[taskID].tFrameCounter++; - } - else - gTasks[taskID].func = EvoTask_DestroyPostSet1Task; -} - -static void EvoTask_DestroyPostSet1Task(u8 taskID) -{ - DestroyTask(taskID); -} - -u8 LaunchTask_PostEvoSparklesSet2AndFlash(u16 species) -{ - u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash, 0); - gTasks[taskID].data[2] = species; - return taskID; -} - -static void EvoTask_BeginPostSparklesSet2_AndFlash(u8 taskID) -{ - SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; - CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); - BeginNormalPaletteFade(0xFFF9001C, 0, 0, 0x10, 0x7FFF); - gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet2_AndFlash; - PlaySE(SE_W080); -} - -static void EvoTask_CreatePostEvoSparklesSet2_AndFlash(u8 taskID) -{ - if (gTasks[taskID].tFrameCounter < 128) - { - u8 i; - switch (gTasks[taskID].tFrameCounter) - { - default: - if (gTasks[taskID].tFrameCounter < 50) - CreatePostEvoSparkleSet2(Random() & 7); - break; - case 0: - for (i = 0; i < 8; i++) - CreatePostEvoSparkleSet2(i); - break; - case 32: - BeginNormalPaletteFade(0xFFFF001C, 0x10, 0x10, 0, 0x7FFF); - break; - } - gTasks[taskID].tFrameCounter++; - } - else - gTasks[taskID].func = EvoTask_DestroyPostSet2AndFlashTask; -} - -static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID) -{ - if (!gPaletteFade.active) - DestroyTask(taskID); -} - -u8 LaunchTask_PostEvoSparklesSet2AndFlash_Trade(u16 species) -{ - u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash_Trade, 0); - gTasks[taskID].data[2] = species; - return taskID; -} - -static void EvoTask_BeginPostSparklesSet2_AndFlash_Trade(u8 taskID) -{ - SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; - CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); - BeginNormalPaletteFade(0xFFF90001, 0, 0, 0x10, 0x7FFF); - gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade; - PlaySE(SE_W080); -} - -static void EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade(u8 taskID) -{ - if (gTasks[taskID].tFrameCounter < 128) - { - u8 i; - switch (gTasks[taskID].tFrameCounter) - { - default: - if (gTasks[taskID].tFrameCounter < 50) - CreatePostEvoSparkleSet2(Random() & 7); - break; - case 0: - for (i = 0; i < 8; i++) - CreatePostEvoSparkleSet2(i); - break; - case 32: - BeginNormalPaletteFade(0xFFFF0001, 0x10, 0x10, 0, 0x7FFF); - break; - } - gTasks[taskID].tFrameCounter++; - } - else - gTasks[taskID].func = EvoTask_DestroyPostSet2AndFlashTask; -} - -#undef tFrameCounter - -static void PokeEvoSprite_DummySpriteCB(struct Sprite* sprite) -{ - -} - -#define tPreEvoSpriteID data[1] -#define tPostEvoSpriteID data[2] -#define tEvoStopped data[8] - -u8 sub_8149E7C(u8 preEvoSpriteID, u8 postEvoSpriteID) -{ - u16 i; - u16 stack[16]; - u8 taskID; - s32 toDiv; - - for (i = 0; i < 16; i++) - stack[i] = 0x7FFF; - - taskID = CreateTask(sub_8149FC8, 0); - gTasks[taskID].tPreEvoSpriteID = preEvoSpriteID; - gTasks[taskID].tPostEvoSpriteID = postEvoSpriteID; - gTasks[taskID].data[3] = 256; - gTasks[taskID].data[4] = 16; - - toDiv = 65536; - SetOamMatrix(30, 256, 0, 0, 256); - SetOamMatrix(31, toDiv / gTasks[taskID].data[4], 0, 0, toDiv / gTasks[taskID].data[4]); - - gSprites[preEvoSpriteID].callback = PokeEvoSprite_DummySpriteCB; - gSprites[preEvoSpriteID].oam.affineMode = 1; - gSprites[preEvoSpriteID].oam.matrixNum = 30; - gSprites[preEvoSpriteID].invisible = 0; - CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[preEvoSpriteID].oam.paletteNum * 16)], 16); - - gSprites[postEvoSpriteID].callback = PokeEvoSprite_DummySpriteCB; - gSprites[postEvoSpriteID].oam.affineMode = 1; - gSprites[postEvoSpriteID].oam.matrixNum = 31; - gSprites[postEvoSpriteID].invisible = 0; - CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[postEvoSpriteID].oam.paletteNum * 16)], 16); - - gTasks[taskID].tEvoStopped = FALSE; - return taskID; -} - -static void sub_8149FC8(u8 taskID) -{ - gTasks[taskID].data[5] = 0; - gTasks[taskID].data[6] = 8; - gTasks[taskID].func = sub_8149FEC; -} - -static void sub_8149FEC(u8 taskID) -{ - if (gTasks[taskID].tEvoStopped) - PreEvoVisible_PostEvoInvisible_KillTask(taskID); - else if (gTasks[taskID].data[6] == 128) - PreEvoInVisible_PostEvoVisible_KillTask(taskID); - else - { - gTasks[taskID].data[6] += 2; - gTasks[taskID].data[5] ^= 1; - gTasks[taskID].func = sub_814A03C; - } -} - -static void sub_814A03C(u8 taskID) -{ - if (gTasks[taskID].tEvoStopped) - gTasks[taskID].func = PreEvoVisible_PostEvoInvisible_KillTask; - else - { - u16 oamMatrixArg; - u8 r6 = 0; - if (gTasks[taskID].data[5] == 0) - { - if (gTasks[taskID].data[3] < 256 - gTasks[taskID].data[6]) - gTasks[taskID].data[3] += gTasks[taskID].data[6]; - else - { - gTasks[taskID].data[3] = 256; - r6++; - } - if (gTasks[taskID].data[4] > 16 + gTasks[taskID].data[6]) - gTasks[taskID].data[4] -= gTasks[taskID].data[6]; - else - { - gTasks[taskID].data[4] = 16; - r6++; - } - } - else - { - if (gTasks[taskID].data[4] < 256 - gTasks[taskID].data[6]) - gTasks[taskID].data[4] += gTasks[taskID].data[6]; - else - { - gTasks[taskID].data[4] = 256; - r6++; - } - if (gTasks[taskID].data[3] > 16 + gTasks[taskID].data[6]) - gTasks[taskID].data[3] -= gTasks[taskID].data[6]; - else - { - gTasks[taskID].data[3] = 16; - r6++; - } - } - oamMatrixArg = 65536 / gTasks[taskID].data[3]; - SetOamMatrix(30, oamMatrixArg, 0, 0, oamMatrixArg); - - oamMatrixArg = 65536 / gTasks[taskID].data[4]; - SetOamMatrix(31, oamMatrixArg, 0, 0, oamMatrixArg); - if (r6 == 2) - gTasks[taskID].func = sub_8149FEC; - } -} - -static void PreEvoInVisible_PostEvoVisible_KillTask(u8 taskID) -{ - gSprites[gTasks[taskID].tPreEvoSpriteID].oam.affineMode = 0; - gSprites[gTasks[taskID].tPreEvoSpriteID].oam.matrixNum = 0; - gSprites[gTasks[taskID].tPreEvoSpriteID].invisible = 1; - - gSprites[gTasks[taskID].tPostEvoSpriteID].oam.affineMode = 0; - gSprites[gTasks[taskID].tPostEvoSpriteID].oam.matrixNum = 0; - gSprites[gTasks[taskID].tPostEvoSpriteID].invisible = 0; - - DestroyTask(taskID); -} - -static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskID) -{ - gSprites[gTasks[taskID].tPreEvoSpriteID].oam.affineMode = 0; - gSprites[gTasks[taskID].tPreEvoSpriteID].oam.matrixNum = 0; - gSprites[gTasks[taskID].tPreEvoSpriteID].invisible = 0; - - gSprites[gTasks[taskID].tPostEvoSpriteID].oam.affineMode = 0; - gSprites[gTasks[taskID].tPostEvoSpriteID].oam.matrixNum = 0; - gSprites[gTasks[taskID].tPostEvoSpriteID].invisible = 1; - - DestroyTask(taskID); -} diff --git a/src/scene/evolution_scene.c b/src/scene/evolution_scene.c deleted file mode 100644 index 3ba325574..000000000 --- a/src/scene/evolution_scene.c +++ /dev/null @@ -1,3959 +0,0 @@ -#include "global.h" -#include "task.h" -#include "evolution_scene.h" -#include "evolution_graphics.h" -#include "palette.h" -#include "main.h" -#include "text.h" -#include "text_window.h" -#include "pokemon.h" -#include "string_util.h" -#include "battle.h" -#include "scanline_effect.h" -#include "data2.h" -#include "decompress.h" -#include "m4a.h" -#include "trade.h" -#include "menu.h" -#include "pokedex.h" -#include "constants/species.h" -#include "sound.h" -#include "constants/songs.h" -#include "overworld.h" -#include "battle_message.h" -#include "pokemon_summary_screen.h" -#include "menu_cursor.h" -#include "strings2.h" -#include "ewram.h" - -struct EvoInfo -{ - u8 preEvoSpriteID; - u8 postEvoSpriteID; - u8 evoTaskID; - u8 field_3; - - u8 unk4[0x40]; - u8 unk44[0x40]; - u8 unk84[0x40]; - - u8 unkC4[0x40][0x20]; // 0x20148C4 - u8 unk8C4[0x40][0x20]; // 0x20150C4 - u8 unk10C4[0x40][0x20]; // 0x20158C4 - u8 unk18C4[0x40][0x20]; // 0x20160C4 - u8 unk20C4[0x40][0x20]; // 0x20168C4 - u8 unk28C4[0x40][0x20]; // 0x20170C4 - u8 unk30C4[0x40][0x20]; // 0x20178C4 - u8 unk38C4[0x40][0x20]; // 0x20180C4 - - u8 *unk40C4[0x40][0x20]; // 0x20188C4 - - u16 unk60C4[0x40][0x20]; // 0x201A8C4 - u16 unk70C4[0x40][0x20]; // 0x201B8C4 - u16 unk80C4[0x40][0x20]; // 0x201C8C4 - u16 unk90C4[0x40][0x20]; // 0x201D8C4 - - u8 unkA0C4; // 0x201E8C4 -}; - -void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); -void sub_8024CEC(void); -void sub_8023A80(void); -void sub_802BC6C(void); -void sub_8023AD8(void); -void nullsub_6(void); -bool32 IsHMMove2(u16 move); - -extern struct Window gUnknown_03004210; -extern u16 gBattle_BG0_X; -extern u16 gBattle_BG0_Y; -extern u16 gBattle_BG1_X; -extern u16 gBattle_BG1_Y; -extern u16 gBattle_BG2_X; -extern u16 gBattle_BG2_Y; -extern u16 gBattle_BG3_X; -extern u16 gBattle_BG3_Y; -extern u8 gBattleTerrain; -extern u8 gReservedSpritePaletteCount; -extern u16 gMoveToLearn; -extern struct SpriteTemplate gUnknown_02024E8C; -extern bool8 gAffineAnimsDisabled; -extern u8 gDisplayedStringBattle[]; -extern u8 gBattleTextBuff2[]; - -extern u8 gBattleCommunication[]; -#define sEvoCursorPos gBattleCommunication[1] // when learning a new move -#define sEvoGraphicsTaskID gBattleCommunication[2] - -extern const u8 BattleText_StartEvo[]; -extern const u8 BattleText_FinishEvo[]; -extern const u8 BattleText_StopEvo[]; -extern const u8 *const gBattleStringsTable[]; - -// this file's functions -static void Task_EvolutionScene(u8 taskID); -static void Task_TradeEvolutionScene(u8 taskID); -static void CB2_EvolutionSceneUpdate(void); -static void CB2_TradeEvolutionSceneUpdate(void); -static void EvoDummyFunc(void); -static void EvoDummyFunc2(void); -static void VBlankCB_EvolutionScene(void); -static void VBlankCB_TradeEvolutionScene(void); -static void sub_81150D8(void); - -// iwram common -MainCallback gCB2_AfterEvolution; - -// const data -static const u8 sUnknownShedinjaJpnString[] = _("ヌケニン"); -static const u8 sUnusedString0[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE2}{SHADOW LIGHT_GREY}"); -static const u8 sUnusedString1[] = _("▶\n "); -static const u8 sUnusedString2[] = _(" \n▶"); -static const u8 sUnusedString3[] = _(" \n "); -static const u8 sPadding[9] = {0}; - -// code - -static void CB2_BeginEvolutionScene(void) -{ - UpdatePaletteFade(); - RunTasks(); -} - -#define tState data[0] -#define tMonPtrHI data[1] -#define tMonPtrLO data[2] -#define tPreEvoSpecies data[3] -#define tPostEvoSpecies data[4] -#define tCanStop data[5] // in first fast data[5] only checks that -#define tBits data[5] // in the second task, it works as a bitfield -#define tLearnsFirstMove data[6] -#define tLearnMoveState data[8] -#define tData9 data[9] -#define tdata10 data[10] -#define tEvoWasStopped data[11] -#define tPartyID data[12] - -#define TASK_BIT_CAN_STOP 0x1 -#define TASK_BIT_LEARN_MOVE 0x80 - -static void Task_BeginEvolutionScene(u8 taskID) -{ - struct Pokemon* mon = NULL; - switch (gTasks[taskID].tState) - { - case 0: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].tState++; - break; - case 1: - if (!gPaletteFade.active) - { - u16 speciesToEvolve; - bool8 canStopEvo; - u8 partyID; - - mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10)); - speciesToEvolve = gTasks[taskID].tPostEvoSpecies; - canStopEvo = gTasks[taskID].tCanStop; - partyID = gTasks[taskID].tPartyID; - - DestroyTask(taskID); - EvolutionScene(mon, speciesToEvolve, canStopEvo, partyID); - } - break; - } -} - -void BeginEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID) -{ - u8 taskID = CreateTask(Task_BeginEvolutionScene, 0); - gTasks[taskID].tState = 0; - gTasks[taskID].tMonPtrHI = (u32)(mon); - gTasks[taskID].tMonPtrLO = (u32)(mon) >> 0x10; - gTasks[taskID].tPostEvoSpecies = speciesToEvolve; - gTasks[taskID].tCanStop = canStopEvo; - gTasks[taskID].tPartyID = partyID; - SetMainCallback2(CB2_BeginEvolutionScene); -} - -void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID) -{ - u8 name[20]; - u16 currSpecies; - u32 TiD, PiD; - const struct CompressedSpritePalette** pokePal; - u8 ID; - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - CpuFill32(0, (void*)(VRAM), VRAM_SIZE); - - REG_MOSAIC = 0; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - - Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); - ResetPaletteFade(); - - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 256; - gBattle_BG3_Y = 0; - - Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); - gBattleTerrain = BATTLE_TERRAIN_PLAIN; - - sub_800D6D4(); - sub_800DAB8(); - ResetSpriteData(); - ScanlineEffect_Stop(); - ResetTasks(); - FreeAllSpritePalettes(); - - gReservedSpritePaletteCount = 4; - - GetMonData(mon, MON_DATA_NICKNAME, name); - StringCopy10(gStringVar1, name); - StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]); - - // preEvo sprite - currSpecies = GetMonData(mon, MON_DATA_SPECIES); - TiD = GetMonData(mon, MON_DATA_OT_ID); - PiD = GetMonData(mon, MON_DATA_PERSONALITY); - DecompressPicFromTable_2(&gMonFrontPicTable[currSpecies], - gMonFrontPicCoords[currSpecies].coords, - gMonFrontPicCoords[currSpecies].y_offset, - (void*)(0x2000000), - gUnknown_081FAF4C[1], currSpecies); - pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(currSpecies, TiD, PiD); - LoadCompressedPalette(*pokePal, 0x110, 0x20); - - GetMonSpriteTemplate_803C56C(currSpecies, 1); - gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; - sEvoInfo.preEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); - - gSprites[ID].callback = nullsub_37; - gSprites[ID].oam.paletteNum = 1; - gSprites[ID].invisible = 1; - - // postEvo sprite - DecompressPicFromTable_2(&gMonFrontPicTable[speciesToEvolve], - gMonFrontPicCoords[speciesToEvolve].coords, - gMonFrontPicCoords[speciesToEvolve].y_offset, - (void*)(0x2000000), - gUnknown_081FAF4C[3], speciesToEvolve); - pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD); - LoadCompressedPalette(*pokePal, 0x120, 0x20); - - GetMonSpriteTemplate_803C56C(speciesToEvolve, 3); - gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; - sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); - gSprites[ID].callback = nullsub_37; - gSprites[ID].oam.paletteNum = 2; - gSprites[ID].invisible = 1; - - LoadEvoSparkleSpriteAndPal(); - - sEvoInfo.evoTaskID = ID = CreateTask(Task_EvolutionScene, 0); - gTasks[ID].tState = 0; - gTasks[ID].tPreEvoSpecies = currSpecies; - gTasks[ID].tPostEvoSpecies = speciesToEvolve; - gTasks[ID].tMonPtrHI = (u32)(mon); - gTasks[ID].tMonPtrLO = (u32)(mon) >> 0x10; - gTasks[ID].tCanStop = canStopEvo; - gTasks[ID].tLearnsFirstMove = TRUE; - gTasks[ID].tEvoWasStopped = FALSE; - gTasks[ID].tPartyID = partyID; - - memcpy(ewram9000_hack, &gPlttBufferUnfaded[0x20], 0x60); - - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; - SetHBlankCallback(EvoDummyFunc); - SetVBlankCallback(VBlankCB_EvolutionScene); - m4aMPlayAllStop(); - SetMainCallback2(CB2_EvolutionSceneUpdate); -} - -static void CB2_EvolutionSceneLoadGraphics(void) -{ - u8 ID; - const struct CompressedSpritePalette** pokePal; - u16 postEvoSpecies; - u32 TiD, PiD; - struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoInfo.evoTaskID].tPartyID]; - - postEvoSpecies = gTasks[sEvoInfo.evoTaskID].tPostEvoSpecies; - TiD = GetMonData(Mon, MON_DATA_OT_ID); - PiD = GetMonData(Mon, MON_DATA_PERSONALITY); - - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - CpuFill32(0, (void*)(VRAM), VRAM_SIZE); - - REG_MOSAIC = 0; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_WININ = 0; - REG_WINOUT = 0; - Text_LoadWindowTemplate(&gWindowTemplate_81E6C58); - ResetPaletteFade(); - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 256; - gBattle_BG3_Y = 0; - - Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58); - gBattleTerrain = BATTLE_TERRAIN_PLAIN; - - sub_800D6D4(); - sub_800DAB8(); - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - - DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies], - gMonFrontPicCoords[postEvoSpecies].coords, - gMonFrontPicCoords[postEvoSpecies].y_offset, - (void*)(0x2000000), - gUnknown_081FAF4C[3], postEvoSpecies); - pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD); - LoadCompressedPalette(*pokePal, 0x120, 0x20); - - GetMonSpriteTemplate_803C56C(postEvoSpecies, 3); - gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; - sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); - - gSprites[ID].callback = nullsub_37; - gSprites[ID].oam.paletteNum = 2; - - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; - SetHBlankCallback(EvoDummyFunc); - SetVBlankCallback(VBlankCB_EvolutionScene); - SetMainCallback2(CB2_EvolutionSceneUpdate); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); -} - -static void CB2_TradeEvolutionSceneLoadGraphics(void) -{ - struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoInfo.evoTaskID].tPartyID]; - u16 postEvoSpecies = gTasks[sEvoInfo.evoTaskID].tPostEvoSpecies; - - switch (gMain.state) - { - case 0: - REG_DISPCNT = 0; - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - gBattle_BG0_X = 0; - gBattle_BG0_Y = 0; - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - gBattle_BG2_X = 0; - gBattle_BG2_Y = 0; - gBattle_BG3_X = 256; - gBattle_BG3_Y = 0; - gMain.state++; - break; - case 1: - Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); - Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E6F84); - gMain.state++; - break; - case 2: - TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); - gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); - TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); - Menu_EraseScreen(); - ResetPaletteFade(); - gMain.state++; - SetHBlankCallback(EvoDummyFunc); - SetVBlankCallback(VBlankCB_TradeEvolutionScene); - break; - case 3: - sub_804E22C(); - gMain.state++; - break; - case 4: - { - const struct CompressedSpritePalette** pokePal; - u32 TiD = GetMonData(Mon, MON_DATA_OT_ID); - u32 PiD = GetMonData(Mon, MON_DATA_PERSONALITY); - DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies], - gMonFrontPicCoords[postEvoSpecies].coords, - gMonFrontPicCoords[postEvoSpecies].y_offset, - (void*)(0x2000000), - gUnknown_081FAF4C[3], postEvoSpecies); - pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD); - LoadCompressedPalette(*pokePal, 0x120, 0x20); - gMain.state++; - } - break; - case 5: - { - u8 ID; - - GetMonSpriteTemplate_803C56C(postEvoSpecies, 3); - gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; - sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); - - gSprites[ID].callback = nullsub_37; - gSprites[ID].oam.paletteNum = 2; - gMain.state++; - } - break; - case 6: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - SetMainCallback2(CB2_TradeEvolutionSceneUpdate); - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP; - break; - } -} - -void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpriteID, u8 partyID) -{ - u8 name[20]; - u16 currSpecies; - u32 TiD, PiD; - const struct CompressedSpritePalette** pokePal; - u8 ID; - - GetMonData(mon, MON_DATA_NICKNAME, name); - StringCopy10(gStringVar1, name); - StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]); - - gAffineAnimsDisabled = TRUE; - - // preEvo sprite - currSpecies = GetMonData(mon, MON_DATA_SPECIES); - PiD = GetMonData(mon, MON_DATA_PERSONALITY); - TiD = GetMonData(mon, MON_DATA_OT_ID); - sEvoInfo.preEvoSpriteID = preEvoSpriteID; - DecompressPicFromTable_2(&gMonFrontPicTable[speciesToEvolve], - gMonFrontPicCoords[speciesToEvolve].coords, - gMonFrontPicCoords[speciesToEvolve].y_offset, - (void*)(0x2000000), - gUnknown_081FAF4C[1], speciesToEvolve); - pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD); - LoadCompressedPalette(*pokePal, 0x120, 0x20); - - GetMonSpriteTemplate_803C56C(speciesToEvolve, 1); - gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable; - sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30); - - gSprites[ID].callback = nullsub_37; - gSprites[ID].oam.paletteNum = 2; - gSprites[ID].invisible = 1; - - LoadEvoSparkleSpriteAndPal(); - - sEvoInfo.evoTaskID = ID = CreateTask(Task_TradeEvolutionScene, 0); - gTasks[ID].tState = 0; - gTasks[ID].tPreEvoSpecies = currSpecies; - gTasks[ID].tPostEvoSpecies = speciesToEvolve; - gTasks[ID].tMonPtrHI = (u32)(mon); - gTasks[ID].tMonPtrLO = (u32)(mon) >> 0x10; - gTasks[ID].tLearnsFirstMove = TRUE; - gTasks[ID].tEvoWasStopped = FALSE; - gTasks[ID].tPartyID = partyID; - - SetMainCallback2(CB2_TradeEvolutionSceneUpdate); -} - -static void CB2_EvolutionSceneUpdate(void) -{ - AnimateSprites(); - BuildOamBuffer(); - Text_UpdateWindowInBattle(&gUnknown_03004210); - UpdatePaletteFade(); - RunTasks(); -} - -static void CB2_TradeEvolutionSceneUpdate(void) -{ - AnimateSprites(); - BuildOamBuffer(); - Text_UpdateWindow(&gUnknown_03004828->window); - UpdatePaletteFade(); - RunTasks(); -} - -static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) -{ - u32 data = 0; - - if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6) - { - s32 i; - struct Pokemon* Shedinja = &gPlayerParty[gPlayerPartyCount]; - - CopyMon(Shedinja, mon, sizeof(struct Pokemon)); - SetMonData(Shedinja, MON_DATA_SPECIES, (void*)&gEvolutionTable[preEvoSpecies][1].targetSpecies); - SetMonData(Shedinja, MON_DATA_NICKNAME, (void*)gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); - SetMonData(Shedinja, MON_DATA_HELD_ITEM, (void*)&data); - SetMonData(Shedinja, MON_DATA_MARKINGS, (void*)&data); - SetMonData(Shedinja, MON_DATA_10, (void*)&data); - for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + 5; i++) - SetMonData(Shedinja, i, (void*)&data); - for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FATEFUL_ENCOUNTER; i++) - SetMonData(Shedinja, i, (void*)&data); - SetMonData(Shedinja, MON_DATA_STATUS, (void*)&data); - data = 0xFF; - SetMonData(Shedinja, MON_DATA_MAIL, (void*)&data); - - CalculateMonStats(Shedinja); - CalculatePlayerPartyCount(); - - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), 2); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), 3); - - if (GetMonData(Shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA - && GetMonData(Shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE - && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK) - SetMonData(Shedinja, MON_DATA_NICKNAME, sUnknownShedinjaJpnString); - } -} - -static void Task_EvolutionScene(u8 taskID) -{ - u32 var; - struct Pokemon* mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10)); - - // check if B Button was held, so the evolution gets stopped - if (gMain.heldKeys == B_BUTTON && gTasks[taskID].tState == 8 && gTasks[taskID].tBits & TASK_BIT_CAN_STOP) - { - gTasks[taskID].tState = 16; - if (gTasks[sEvoGraphicsTaskID].isActive) - gTasks[sEvoGraphicsTaskID].EvoGraphicsTaskEvoStop = TRUE; - } - switch (gTasks[taskID].tState) - { - case 0: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - gSprites[sEvoInfo.preEvoSpriteID].invisible = 0; - gTasks[taskID].tState++; - break; - case 1: // print 'whoa, poke is evolving!!!' msg - if (!gPaletteFade.active) - { - StringExpandPlaceholders(gStringVar4, BattleText_StartEvo); - Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); - gTasks[taskID].tState++; - } - break; - case 2: // wait for string, play cry - if (gUnknown_03004210.state == 0) - { - PlayCry1(gTasks[taskID].tPreEvoSpecies, 0); - gTasks[taskID].tState++; - } - break; - case 3: // wait for cry, play tu du SE - if (IsCryFinished()) - { - PlaySE(BGM_ME_SHINKA); - gTasks[taskID].tState++; - } - break; - case 4: // play evolution music and fade screen black - if (!IsSEPlaying()) - { - PlayNewMapMusic(BGM_SHINKA); - gTasks[taskID].tState++; - BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0); - } - break; - case 5: // after screen fade, preapre evo sparkles - if (!gPaletteFade.active) - { - sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet1(17); - gTasks[taskID].tState++; - } - break; - case 6: // another set of evo sparkles - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - gTasks[taskID].tState++; - sEvoInfo.field_3 = 1; - sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet2(); - } - break; - case 7: // launch task that flashes pre evo with post evo sprites - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - sEvoGraphicsTaskID = sub_8149E7C(sEvoInfo.preEvoSpriteID, sEvoInfo.postEvoSpriteID); - gTasks[taskID].tState++; - } - break; - case 8: // wait for the above task to finish - if (--sEvoInfo.field_3 == 0) - { - sEvoInfo.field_3 = 3; - if (!gTasks[sEvoGraphicsTaskID].isActive) - gTasks[taskID].tState++; - } - break; - case 9: // post evo sparkles - sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet1(); - gTasks[taskID].tState++; - break; - case 10: - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet2AndFlash(gTasks[taskID].tPostEvoSpecies); - gTasks[taskID].tState++; - } - break; - case 11: // play tu du sound after evolution - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - PlaySE(SE_EXP); - gTasks[taskID].tState++; - } - break; - case 12: // play poke cry after evolution and return screed to pre-fade state - if (IsSEPlaying()) - { - m4aMPlayAllStop(); - PlayCry1(gTasks[taskID].tPostEvoSpecies, 0); - memcpy(&gPlttBufferUnfaded[0x20], ewram9000_hack, 0x60); - BeginNormalPaletteFade(0x1C, 0, 0x10, 0, 0); - gTasks[taskID].tState++; - } - break; - case 13: // congratulations string and rename prompt - if (IsCryFinished() && !gPaletteFade.active) - { - StringExpandPlaceholders(gStringVar4, BattleText_FinishEvo); - Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); - PlayBGM(BGM_FANFA5); - gTasks[taskID].tState++; - SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); - CalculateMonStats(mon); - EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); - IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); - } - break; - case 14: // check if it wants to learn a new move - if (gUnknown_03004210.state == 0) - { - var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove); - if (var != 0 && !gTasks[taskID].tEvoWasStopped) - { - u8 text[20]; - - Overworld_PlaySpecialMapMusic(); - gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE; - gTasks[taskID].tLearnsFirstMove = FALSE; - gTasks[taskID].tLearnMoveState = 0; - GetMonData(mon, MON_DATA_NICKNAME, text); - StringCopy10(gBattleTextBuff1, text); - if (var == 0xFFFF) // no place to learn it - gTasks[taskID].tState = 21; - else if (var == 0xFFFE) // it already knows that move - break; - else - gTasks[taskID].tState = 19; // has less than 4 moves, so it's been learned - } - else // no move to learn - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskID].tState++; - } - } - break; - case 15: // task has finished, return - if (!gPaletteFade.active) - { - if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE)) - Overworld_PlaySpecialMapMusic(); - if (!gTasks[taskID].tEvoWasStopped) - CreateShedinja(gTasks[taskID].tPreEvoSpecies, mon); - DestroyTask(taskID); - SetMainCallback2(gCB2_AfterEvolution); - } - break; - case 16: // evolution has been canceled, stop music and re-fade palette - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - m4aMPlayAllStop(); - BeginNormalPaletteFade(0x6001C, 0, 0x10, 0, 0x7FFF); - gTasks[taskID].tState++; - } - break; - case 17: // play cry of the pokemon trying to evolve again, evolution has been stopped - if (!gPaletteFade.active) - { - PlayCry1(gTasks[taskID].tPreEvoSpecies, 0); - gTasks[taskID].tState++; - } - break; - case 18: // after the cry, print the string 'WHOA IT DID NOT EVOLVE!!!' - if (IsCryFinished()) - { - StringExpandPlaceholders(gStringVar4, BattleText_StopEvo); - Text_InitWindow8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15); - gTasks[taskID].tEvoWasStopped = TRUE; - gTasks[taskID].tState = 14; - } - break; - case 19: // pokemon learned a new move, print string and play a fanfare - if (gUnknown_03004210.state == 0 && !IsSEPlaying()) - { - sub_8024CEC(); - PlayFanfare(BGM_FANFA1); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter - gTasks[taskID].tState++; - } - break; - case 20: // wait a bit and check if can learn another move - if (gUnknown_03004210.state == 0 && !IsSEPlaying() && --gTasks[taskID].tLearnsFirstMove == 0) - gTasks[taskID].tState = 14; - break; - case 21: // try to learn a new move - switch (gTasks[taskID].tLearnMoveState) - { - case 0: - if (gUnknown_03004210.state == 0 && !IsSEPlaying()) - { - sub_8024CEC(); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tLearnMoveState++; - } - break; - case 1: - if (gUnknown_03004210.state == 0 && !IsSEPlaying()) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tLearnMoveState++; - } - break; - case 2: - if (gUnknown_03004210.state != 0) - break; - if (!IsSEPlaying()) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tData9 = 5; - gTasks[taskID].tdata10 = 9; - gTasks[taskID].tLearnMoveState++; - } - case 3: - if (gUnknown_03004210.state == 0 && !IsSEPlaying()) - { - sub_8023A80(); - gTasks[taskID].tLearnMoveState++; - sEvoCursorPos = 0; - sub_802BC6C(); - } - break; - case 4: - if (gMain.newKeys & DPAD_UP && sEvoCursorPos != 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - sEvoCursorPos = 0; - sub_802BC6C(); - } - if (gMain.newKeys & DPAD_DOWN && sEvoCursorPos == 0) - { - PlaySE(SE_SELECT); - nullsub_6(); - sEvoCursorPos = 1; - sub_802BC6C(); - } - if (gMain.newKeys & A_BUTTON) - { - sub_8023AD8(); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - PlaySE(SE_SELECT); - if (sEvoCursorPos != 0) - gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; - else - { - gTasks[taskID].tLearnMoveState = gTasks[taskID].tData9; - if (gTasks[taskID].tLearnMoveState == 5) - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - } - } - if (gMain.newKeys & B_BUTTON) - { - sub_8023AD8(); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - PlaySE(SE_SELECT); - gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; - } - break; - case 5: - if (!gPaletteFade.active) - { - ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID, - gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics, - gMoveToLearn); - gTasks[taskID].tLearnMoveState++; - } - break; - case 6: - if (!gPaletteFade.active && gMain.callback2 == CB2_EvolutionSceneUpdate) - { - var = sub_809FA30(); // moveID - if (var == 4) - gTasks[taskID].tLearnMoveState = 9; - else - { - u16 move = GetMonData(mon, var + MON_DATA_MOVE1); - if (IsHMMove2(move)) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tLearnMoveState = 11; - } - else - { - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 2; - gBattleTextBuff2[2] = move; - gBattleTextBuff2[3] = (move & 0xFF00) >> 8; - gBattleTextBuff2[4] = EOS; - RemoveMonPPBonus(mon, var); - SetMonMoveSlot(mon, gMoveToLearn, var); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tLearnMoveState++; - } - } - } - break; - case 7: - if (gUnknown_03004210.state == 0 && !IsSEPlaying()) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tLearnMoveState++; - } - break; - case 8: - if (gUnknown_03004210.state == 0 && !IsSEPlaying()) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tState = 19; - } - break; - case 9: - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[8]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tData9 = 10; - gTasks[taskID].tdata10 = 0; - gTasks[taskID].tLearnMoveState = 3; - break; - case 10: - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[9]); - Text_InitWindow8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15); - gTasks[taskID].tState = 14; - break; - case 11: - if (gUnknown_03004210.state == 0 && !IsSEPlaying()) - gTasks[taskID].tLearnMoveState = 5; - break; - } - break; - } -} - -static void Task_TradeEvolutionScene(u8 taskID) -{ - u32 var; - struct Pokemon* mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10)); - - switch (gTasks[taskID].tState) - { - case 0: - StringExpandPlaceholders(gStringVar4, BattleText_StartEvo); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tState++; - break; - case 1: - if (gUnknown_03004828->window.state == 0) - { - PlayCry1(gTasks[taskID].tPreEvoSpecies, 0); - gTasks[taskID].tState++; - } - break; - case 2: - if (IsCryFinished()) - { - m4aSongNumStop(BGM_SHINKA); - PlaySE(BGM_ME_SHINKA); - gTasks[taskID].tState++; - } - break; - case 3: - if (!IsSEPlaying()) - { - PlayBGM(BGM_SHINKA); - gTasks[taskID].tState++; - BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0); - } - break; - case 4: - if (!gPaletteFade.active) - { - REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP; - sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet1(17); - gTasks[taskID].tState++; - } - break; - case 5: - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - gTasks[taskID].tState++; - sEvoInfo.field_3 = 1; - sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet2(); - } - break; - case 6: - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - sEvoGraphicsTaskID = sub_8149E7C(sEvoInfo.preEvoSpriteID, sEvoInfo.postEvoSpriteID); - gTasks[taskID].tState++; - } - break; - case 7: - if (--sEvoInfo.field_3 == 0) - { - sEvoInfo.field_3 = 3; - if (!gTasks[sEvoGraphicsTaskID].isActive) - gTasks[taskID].tState++; - } - break; - case 8: - sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet1(); - gTasks[taskID].tState++; - break; - case 9: - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet2AndFlash_Trade(gTasks[taskID].tPostEvoSpecies); - gTasks[taskID].tState++; - } - break; - case 10: - if (!gTasks[sEvoGraphicsTaskID].isActive) - { - PlaySE(SE_EXP); - gTasks[taskID].tState++; - } - break; - case 11: - if (IsSEPlaying()) - { - PlayCry1(gTasks[taskID].tPostEvoSpecies, 0); - memcpy(&gPlttBufferUnfaded[0x20], ewram9000_hack, 0x60); - BeginNormalPaletteFade(1, 0, 0x10, 0, 0); - gTasks[taskID].tState++; - } - break; - case 12: - if (IsCryFinished() && !gPaletteFade.active) - { - StringExpandPlaceholders(gStringVar4, BattleText_FinishEvo); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - PlayFanfare(BGM_FANFA5); - gTasks[taskID].tState++; - SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); - CalculateMonStats(mon); - EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); - IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); - } - break; - case 13: - if (gUnknown_03004828->window.state == 0 && IsFanfareTaskInactive() == TRUE) - { - var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove); - if (var != 0 && !gTasks[taskID].tEvoWasStopped) - { - u8 text[20]; - - gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE; - gTasks[taskID].tLearnsFirstMove = FALSE; - gTasks[taskID].tLearnMoveState = 0; - GetMonData(mon, MON_DATA_NICKNAME, text); - StringCopy10(gBattleTextBuff1, text); - if (var == 0xFFFF) - gTasks[taskID].tState = 17; - else if (var == 0xFFFE) - break; - else - gTasks[taskID].tState = 15; - } - else - { - PlayBGM(BGM_SHINKA); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gOtherText_LinkStandby2, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tState++; - } - } - break; - case 14: - if (gUnknown_03004828->window.state == 0) - { - DestroyTask(taskID); - SetMainCallback2(gCB2_AfterEvolution); - } - break; - case 15: - if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) - { - sub_8024CEC(); - PlayFanfare(BGM_FANFA1); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter - gTasks[taskID].tState++; - } - break; - case 16: - if (gUnknown_03004828->window.state == 0 && IsFanfareTaskInactive() == TRUE && --gTasks[taskID].tLearnsFirstMove == 0) - gTasks[taskID].tState = 13; - break; - case 17: - switch (gTasks[taskID].tLearnMoveState) - { - case 0: - if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) - { - sub_8024CEC(); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tLearnMoveState++; - } - break; - case 1: - if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tLearnMoveState++; - } - break; - case 2: - if (gUnknown_03004828->window.state != 0) - break; - if (!IsSEPlaying()) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tData9 = 5; - gTasks[taskID].tdata10 = 9; - gTasks[taskID].tLearnMoveState++; - } - case 3: - if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) - { - TextWindow_DrawStdFrame(&gUnknown_03004828->window, 24, 8, 29, 13); - sEvoCursorPos = 0; - Text_InitWindow(&gUnknown_03004828->window, gOtherText_YesNoAndPlayer, gUnknown_03004828->textWindowBaseTileNum + 128, 25, 9); - Text_PrintWindow8002F44(&gUnknown_03004828->window); - MenuCursor_Create814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); - sub_81150D8(); - gTasks[taskID].tLearnMoveState++; - sEvoCursorPos = 0; - } - break; - case 4: - if (gMain.newKeys & DPAD_UP && sEvoCursorPos != 0) - { - PlaySE(SE_SELECT); - EvoDummyFunc2(); - sEvoCursorPos = 0; - sub_81150D8(); - } - if (gMain.newKeys & DPAD_DOWN && sEvoCursorPos == 0) - { - PlaySE(SE_SELECT); - EvoDummyFunc2(); - sEvoCursorPos = 1; - sub_81150D8(); - } - if (gMain.newKeys & A_BUTTON) - { - Text_EraseWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); - DestroyMenuCursor(); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - PlaySE(SE_SELECT); - if (sEvoCursorPos != 0) - gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; - else - { - gTasks[taskID].tLearnMoveState = gTasks[taskID].tData9; - if (gTasks[taskID].tLearnMoveState == 5) - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - } - } - if (gMain.newKeys & B_BUTTON) - { - Text_EraseWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); - DestroyMenuCursor(); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - PlaySE(SE_SELECT); - gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10; - } - break; - case 5: - if (!gPaletteFade.active) - { - ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID, - gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics, - gMoveToLearn); - gTasks[taskID].tLearnMoveState++; - } - break; - case 6: - if (!gPaletteFade.active && gMain.callback2 == CB2_TradeEvolutionSceneUpdate) - { - var = sub_809FA30(); // moveID - if (var == 4) - gTasks[taskID].tLearnMoveState = 9; - else - { - u16 move = GetMonData(mon, var + MON_DATA_MOVE1); - if (IsHMMove2(move)) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tLearnMoveState = 11; - } - else - { - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 2; - gBattleTextBuff2[2] = move; - gBattleTextBuff2[3] = (move & 0xFF00) >> 8; - gBattleTextBuff2[4] = EOS; - RemoveMonPPBonus(mon, var); - SetMonMoveSlot(mon, gMoveToLearn, var); - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tLearnMoveState++; - } - } - } - break; - case 7: - if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tLearnMoveState++; - } - break; - case 8: - if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) - { - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tState = 15; - } - break; - case 9: - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[8]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tData9 = 10; - gTasks[taskID].tdata10 = 0; - gTasks[taskID].tLearnMoveState = 3; - break; - case 10: - StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[9]); - Text_InitWindow8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); - gTasks[taskID].tState = 13; - break; - case 11: - if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) - gTasks[taskID].tLearnMoveState = 5; - break; - } - break; - } -} - -/* -DizzyEgg, 27.08.2017 -NOTE: - Functions below are all unused. - What's more, they do NOT exist in Emerald. - That's why I think there is no reason to decompile those, - as they probably were prototypes for the evolution - functions. -*/ - -/* -void unref_sub_8113B50(u8 *a, u8 *b) -{ - //u8 *sp0 = a; - //u8 *sp4 = b; -#define sp0 a -#define sp4 b - s32 sp8; - s32 spC = 0; - u32 sp10 = 0; - s32 sp14; - s32 r6; - u32 r8; - - for (sp8 = 0; sp8 < 64; sp8++) - { - sEvoInfo.unk84[sp8] = 0; - sEvoInfo.unk4[sp8] = 0; - sEvoInfo.unk44[sp8] = 0; - for (r6 = 0; r6 < 32; r6++) - { - sEvoInfo.unk10C4[sp8][r6] = 0; - sEvoInfo.unk18C4[sp8][r6] = 0; - sEvoInfo.unk20C4[sp8][r6] = 0; - sEvoInfo.unk28C4[sp8][r6] = 0; - sEvoInfo.unkC4[sp8][r6] = 0; - sEvoInfo.unk8C4[sp8][r6] = 0; - sEvoInfo.unk30C4[sp8][r6] = 0; - sEvoInfo.unk38C4[sp8][r6] = 0; - - sEvoInfo.unk60C4[sp8][r6] = 0; - sEvoInfo.unk70C4[sp8][r6] = 0; - sEvoInfo.unk80C4[sp8][r6] = 0; - sEvoInfo.unk90C4[sp8][r6] = 0; - } - } - - sEvoInfo.unkA0C4 = 64; - r8 = 0; - for (sp8 = 0; sp8 < 64; sp8++) - { - //_08113C32 - u32 r3 = 0; - u8 *r2 = sp0 + r8; - - for (r6 = 0; r6 < 64; r6++) - { - sEvoInfo.unk40C4[sp8][r6 >> 1] = r2; - switch (r3) - { - case 0: - switch (r6 & 1) - { - case 0: - if (*r2 & 0xF) - { - sEvoInfo.unk10C4[sp8][sEvoInfo.unk4[sp8]] = r6; - r3 = 1; - } - break; - case 1: - if (*r2 & 0xF0) - { - sEvoInfo.unk10C4[sp8][sEvoInfo.unk4[sp8]] = r6; - r3 = 1; - } - break; - } - break; - case 1: - switch (r6 & r3) - { - case 0: - if (*r2 & 0xF) - { - sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6 - 1; - sEvoInfo.unk4[sp8]++; - r3 = 0; - } - break; - case 1: - if (*r2 & 0xF0) - { - sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6 - 1; - sEvoInfo.unk4[sp8]++; - r3 = 0; - } - break; - } - } - //if (!((r6 + 1) & 7)) - if ((r6 + 1) % 8 == 0) - r2 += 0x1D; - else if (r6 & 1) - r2 += 1; - } - if (r3) - { - sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6; - sEvoInfo.unk4[sp8]++; - } - //_08113D26 - if (!((sp8 + 1) & 7)) - r8 += 0xE4; - else - r8 += 4; - } - //_08113D4A - r8 = 0; - for (sp8 = 0; sp8 < 64; sp8++) - { - //_08113D6A - u32 r3 = 0; - u8 *r2 = sp4 + r8; - - for (r6 = 0; r6 < 64; r6++) - { - switch (r3) - { - case 0: - switch (r6 & 1) - { - case 0: - if (*r2 & 0xF) - { - sEvoInfo.unk20C4[sp8][sEvoInfo.unk44[sp8]] = r6; - r3 = 1; - } - break; - case 1: - if (*r2 & 0xF0) - { - sEvoInfo.unk20C4[sp8][sEvoInfo.unk44[sp8]] = r6; - r3 = 1; - } - break; - } - break; - case 1: - switch (r6 & r3) - { - case 0: - if (*r2 & 0xF) - { - sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6 - 1; - sEvoInfo.unk44[sp8]++; - r3 = 0; - } - break; - case 1: - if (*r2 & 0xF0) - { - sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6 - 1; - sEvoInfo.unk44[sp8]++; - r3 = 0; - } - break; - } - } - //_08113DE4 - if (!((r6 + 1) & 7)) - r2 += 0x1D; - else if (r6 & 1) - r2 += 1; - - } - if (r3) - { - sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6; - sEvoInfo.unk44[sp8]++; - } - //if (!((sp8 + 1) & 7)) - if ((sp8 + 1) % 8 == 0) - r8 += 0xE4; - else - r8 += 4; - } - - for (sp8 = 0; sp8 < 0x40; sp8++) //_08113E3A - { - if (sEvoInfo.unk4[sp8] < sEvoInfo.unk44[sp8]) - { - for (spC = 0; spC < sEvoInfo.unk4[sp8]; spC++) - { - sp14 = 0x100; - - for (r6 = 0; r6 < sEvoInfo.unk44[sp8]; r6++) - { - s32 r3; - - //_08113EA4 - if (sEvoInfo.unk10C4[sp8][spC] > sEvoInfo.unk20C4[sp8][r6]) - r3 = sEvoInfo.unk10C4[sp8][spC] - sEvoInfo.unk20C4[sp8][r6]; - else - r3 = sEvoInfo.unk20C4[sp8][r6] - sEvoInfo.unk10C4[sp8][spC]; - - if (sEvoInfo.unk18C4[sp8][spC] > sEvoInfo.unk28C4[sp8][spC]) - r3 += sEvoInfo.unk18C4[sp8][spC] - sEvoInfo.unk28C4[sp8][spC]; - else - r3 += sEvoInfo.unk28C4[sp8][spC] - sEvoInfo.unk18C4[sp8][spC]; - - if (sp14 >= r3 && sEvoInfo.unkC4[sp8][r6] == 0 && sEvoInfo.unk8C4[sp8][r6] == 0) - { - sp10 = r6; - sp14 = r3; - } - } - //_08113F3E - sub_81141F0(spC, sp10, sp8); - } - //_08113F54 - - for (r6 = 0; r6 < sEvoInfo.unk44[sp8]; r6++) - { - if (sEvoInfo.unkC4[sp8][r6] == 0 && sEvoInfo.unk8C4[sp8][r6] == 0) - sub_811430C(r6, sp8); - } - } - //_08113F9E - if (sEvoInfo.unk4[sp8] == sEvoInfo.unk44[sp8]) - { - for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++) - sub_81141F0(r6, r6, sp8); - } - //_08113FCC - if (sEvoInfo.unk4[sp8] > sEvoInfo.unk44[sp8]) - { - for (sp10 = 0; sp10 < sEvoInfo.unk44[sp8]; sp10++) - { - sp14 = 0x100; - - for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++) - { - s32 r3; - - if (sEvoInfo.unk10C4[sp8][r6] > sEvoInfo.unk20C4[sp8][sp10]) - r3 = sEvoInfo.unk10C4[sp8][r6] - sEvoInfo.unk20C4[sp8][sp10]; - else - r3 = sEvoInfo.unk20C4[sp8][sp10] - sEvoInfo.unk10C4[sp8][r6]; - - if (sEvoInfo.unk18C4[sp8][r6] > sEvoInfo.unk28C4[sp8][sp10]) - r3 += sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk28C4[sp8][sp10]; - else - r3 += sEvoInfo.unk28C4[sp8][sp10] - sEvoInfo.unk18C4[sp8][r6]; - - //r3 = abs(sEvoInfo.unk10C4[sp8][r6] - sEvoInfo.unk20C4[sp8][sp10]); - //r3 += abs(sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk28C4[sp8][sp10]); - - if (sp14 > r3 && sEvoInfo.unkC4[sp8][r6] == 0) - { - spC = r6; - sp14 = r3; - } - } - //_081140C4 - sEvoInfo.unk30C4[sp8][spC] = sEvoInfo.unk20C4[sp8][sp10]; - sEvoInfo.unk38C4[sp8][spC] = sEvoInfo.unk28C4[sp8][sp10]; - sEvoInfo.unkC4[sp8][spC] = 1; - } - //_08114104 - for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++) - { - sEvoInfo.unk20C4[sp8][r6] = sEvoInfo.unk30C4[sp8][r6]; - sEvoInfo.unk28C4[sp8][r6] = sEvoInfo.unk38C4[sp8][r6]; - if (sEvoInfo.unkC4[sp8][r6] != 0) - { - sEvoInfo.unkC4[sp8][r6] = 0; - sub_81141F0(r6, r6, sp8); - } - else - { - // Ugh, can't get this part right - //u8 *ptr1 = &sEvoInfo.unk10C4[sp8][r6]; - //u8 *ptr2 = &sEvoInfo.unk18C4[sp8][r6]; - //s32 r2 = *ptr1 + (*ptr2 - *ptr1) / 2; - - //u8 r0_ = sEvoInfo.unk10C4[sp8][r6]; - //u8 r2_ = sEvoInfo.unk18C4[sp8][r6]; - //s32 r2 = (r0_ - r2_) / 2; - - s32 r2 = (sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk10C4[sp8][r6]); - s32 r2_ = sEvoInfo.unk10C4[sp8][r6]; - - sEvoInfo.unk20C4[sp8][r6] = sEvoInfo.unk28C4[sp8][r6] = r2_ + r2 / 2; - sEvoInfo.unk28C4[sp8][r6]++; - sub_81141F0(r6, r6, sp8); - } - } - } - //_081141C4 - } -#undef sp0 -#undef sp4 -} -*/ -__attribute__((naked)) -void unref_sub_8113B50() -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x3C\n\ - str r0, [sp]\n\ - str r1, [sp, 0x4]\n\ - movs r0, 0\n\ - str r0, [sp, 0xC]\n\ - movs r1, 0\n\ - str r1, [sp, 0x10]\n\ - movs r2, 0\n\ - str r2, [sp, 0x8]\n\ - ldr r3, _08113C60 @ =gSharedMem + 0x14800\n\ - mov r12, r3\n\ - ldr r4, _08113C64 @ =0x000018c4\n\ - add r4, r12\n\ - mov r10, r4\n\ - ldr r5, _08113C68 @ =0x000020c4\n\ - add r5, r12\n\ - mov r8, r5\n\ -_08113B7C:\n\ - adds r0, r3, 0\n\ - adds r0, 0x84\n\ - ldr r1, [sp, 0x8]\n\ - adds r0, r1, r0\n\ - strb r2, [r0]\n\ - adds r0, r3, 0x4\n\ - adds r0, r1, r0\n\ - strb r2, [r0]\n\ - ldr r4, _08113C6C @ =gSharedMem + 0x14844\n\ - adds r0, r1, r4\n\ - strb r2, [r0]\n\ - movs r6, 0\n\ - lsls r1, 5\n\ - mov r9, r1\n\ - ldr r5, [sp, 0x8]\n\ - lsls r4, r5, 6\n\ -_08113B9C:\n\ - mov r0, r9\n\ - adds r1, r6, r0\n\ - ldr r5, _08113C70 @ =gSharedMem + 0x158C4\n\ - adds r0, r1, r5\n\ - strb r2, [r0]\n\ - mov r5, r10\n\ - adds r0, r1, r5\n\ - strb r2, [r0]\n\ - mov r5, r8\n\ - adds r0, r1, r5\n\ - strb r2, [r0]\n\ - ldr r5, _08113C74 @ =gSharedMem + 0x170C4\n\ - adds r0, r1, r5\n\ - strb r2, [r0]\n\ - adds r7, r3, 0\n\ - adds r7, 0xC4\n\ - adds r0, r1, r7\n\ - strb r2, [r0]\n\ - ldr r5, _08113C78 @ =0x000008c4\n\ - adds r0, r3, r5\n\ - adds r0, r1, r0\n\ - strb r2, [r0]\n\ - ldr r5, _08113C7C @ =0x000030c4\n\ - adds r0, r3, r5\n\ - adds r0, r1, r0\n\ - strb r2, [r0]\n\ - ldr r5, _08113C80 @ =0x000038c4\n\ - adds r0, r3, r5\n\ - adds r1, r0\n\ - strb r2, [r1]\n\ - lsls r1, r6, 1\n\ - adds r1, r4\n\ - ldr r5, _08113C84 @ =0x000060c4\n\ - adds r0, r3, r5\n\ - adds r0, r1, r0\n\ - strh r2, [r0]\n\ - ldr r5, _08113C88 @ =0x000070c4\n\ - adds r0, r3, r5\n\ - adds r0, r1, r0\n\ - strh r2, [r0]\n\ - ldr r5, _08113C8C @ =0x000080c4\n\ - adds r0, r3, r5\n\ - adds r0, r1, r0\n\ - strh r2, [r0]\n\ - ldr r5, _08113C90 @ =0x000090c4\n\ - adds r0, r3, r5\n\ - adds r1, r0\n\ - strh r2, [r1]\n\ - adds r6, 0x1\n\ - cmp r6, 0x1F\n\ - ble _08113B9C\n\ - ldr r0, [sp, 0x8]\n\ - adds r0, 0x1\n\ - str r0, [sp, 0x8]\n\ - cmp r0, 0x3F\n\ - ble _08113B7C\n\ - ldr r1, _08113C94 @ =0x0000a0c4\n\ - add r1, r12\n\ - movs r0, 0x40\n\ - strb r0, [r1]\n\ - movs r1, 0\n\ - mov r8, r1\n\ - movs r2, 0\n\ - str r2, [sp, 0x8]\n\ - movs r3, 0x80\n\ - lsls r3, 5\n\ - adds r3, r7\n\ - mov r12, r3\n\ - movs r4, 0xC0\n\ - lsls r4, 5\n\ - adds r4, r7\n\ - mov r9, r4\n\ - movs r5, 0\n\ - adds r4, r7, 0\n\ - subs r4, 0xC0\n\ -_08113C32:\n\ - movs r3, 0\n\ - ldr r2, [sp]\n\ - add r2, r8\n\ - movs r6, 0\n\ - ldr r0, [sp, 0x8]\n\ - adds r0, 0x1\n\ - str r0, [sp, 0x30]\n\ - ldr r1, [sp, 0x8]\n\ - lsls r1, 7\n\ - mov r10, r1\n\ - movs r7, 0x1\n\ - negs r7, r7\n\ -_08113C4A:\n\ - asrs r0, r6, 1\n\ - lsls r0, 2\n\ - add r0, r10\n\ - ldr r1, _08113C98 @ =gSharedMem + 0x188C4\n\ - adds r0, r1\n\ - str r2, [r0]\n\ - cmp r3, 0\n\ - beq _08113C9C\n\ - cmp r3, 0x1\n\ - beq _08113CC6\n\ - b _08113CF4\n\ - .align 2, 0\n\ -_08113C60: .4byte gSharedMem + 0x14800\n\ -_08113C64: .4byte 0x000018c4\n\ -_08113C68: .4byte 0x000020c4\n\ -_08113C6C: .4byte gSharedMem + 0x14844\n\ -_08113C70: .4byte gSharedMem + 0x158C4\n\ -_08113C74: .4byte gSharedMem + 0x170C4\n\ -_08113C78: .4byte 0x000008c4\n\ -_08113C7C: .4byte 0x000030c4\n\ -_08113C80: .4byte 0x000038c4\n\ -_08113C84: .4byte 0x000060c4\n\ -_08113C88: .4byte 0x000070c4\n\ -_08113C8C: .4byte 0x000080c4\n\ -_08113C90: .4byte 0x000090c4\n\ -_08113C94: .4byte 0x0000a0c4\n\ -_08113C98: .4byte gSharedMem + 0x188C4\n\ -_08113C9C:\n\ - movs r0, 0x1\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _08113CAA\n\ - cmp r0, 0x1\n\ - beq _08113CB0\n\ - b _08113CF4\n\ -_08113CAA:\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF\n\ - b _08113CB4\n\ -_08113CB0:\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF0\n\ -_08113CB4:\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08113CF4\n\ - ldrb r0, [r4]\n\ - adds r0, r5\n\ - add r0, r12\n\ - strb r6, [r0]\n\ - movs r3, 0x1\n\ - b _08113CF4\n\ -_08113CC6:\n\ - adds r0, r6, 0\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08113CD4\n\ - cmp r0, 0x1\n\ - beq _08113CDA\n\ - b _08113CF4\n\ -_08113CD4:\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF\n\ - b _08113CDE\n\ -_08113CDA:\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF0\n\ -_08113CDE:\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08113CF4\n\ - ldrb r0, [r4]\n\ - adds r0, r5\n\ - add r0, r9\n\ - strb r7, [r0]\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - movs r3, 0\n\ -_08113CF4:\n\ - adds r0, r6, 0x1\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08113D02\n\ - adds r2, 0x1D\n\ - b _08113D0C\n\ -_08113D02:\n\ - movs r0, 0x1\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _08113D0C\n\ - adds r2, 0x1\n\ -_08113D0C:\n\ - adds r7, 0x1\n\ - adds r6, 0x1\n\ - cmp r6, 0x3F\n\ - ble _08113C4A\n\ - cmp r3, 0\n\ - beq _08113D26\n\ - ldrb r0, [r4]\n\ - adds r0, r5\n\ - add r0, r9\n\ - strb r6, [r0]\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ -_08113D26:\n\ - movs r0, 0x7\n\ - ldr r2, [sp, 0x30]\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - bne _08113D36\n\ - movs r3, 0xE4\n\ - add r8, r3\n\ - b _08113D3A\n\ -_08113D36:\n\ - movs r0, 0x4\n\ - add r8, r0\n\ -_08113D3A:\n\ - adds r5, 0x20\n\ - adds r4, 0x1\n\ - ldr r1, [sp, 0x8]\n\ - adds r1, 0x1\n\ - str r1, [sp, 0x8]\n\ - cmp r1, 0x3F\n\ - bgt _08113D4A\n\ - b _08113C32\n\ -_08113D4A:\n\ - movs r2, 0\n\ - mov r8, r2\n\ - movs r3, 0\n\ - str r3, [sp, 0x8]\n\ - ldr r0, _08113D84 @ =gSharedMem + 0x14844\n\ - movs r4, 0x82\n\ - lsls r4, 6\n\ - adds r4, r0\n\ - mov r10, r4\n\ - movs r5, 0xA2\n\ - lsls r5, 6\n\ - adds r7, r0, r5\n\ - movs r5, 0\n\ - adds r4, r0, 0\n\ - movs r0, 0x1\n\ - mov r9, r0\n\ -_08113D6A:\n\ - movs r3, 0\n\ - ldr r2, [sp, 0x4]\n\ - add r2, r8\n\ - movs r6, 0\n\ - ldr r1, [sp, 0x8]\n\ - adds r1, 0x1\n\ - str r1, [sp, 0x30]\n\ -_08113D78:\n\ - cmp r3, 0\n\ - beq _08113D88\n\ - cmp r3, 0x1\n\ - beq _08113DB4\n\ - b _08113DE4\n\ - .align 2, 0\n\ -_08113D84: .4byte gSharedMem + 0x14844\n\ -_08113D88:\n\ - adds r0, r6, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08113D98\n\ - cmp r0, 0x1\n\ - beq _08113D9E\n\ - b _08113DE4\n\ -_08113D98:\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF\n\ - b _08113DA2\n\ -_08113D9E:\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF0\n\ -_08113DA2:\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08113DE4\n\ - ldrb r0, [r4]\n\ - adds r0, r5\n\ - add r0, r10\n\ - strb r6, [r0]\n\ - movs r3, 0x1\n\ - b _08113DE4\n\ -_08113DB4:\n\ - adds r0, r6, 0\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08113DC2\n\ - cmp r0, 0x1\n\ - beq _08113DC8\n\ - b _08113DE4\n\ -_08113DC2:\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF\n\ - b _08113DCC\n\ -_08113DC8:\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF0\n\ -_08113DCC:\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08113DE4\n\ - ldrb r0, [r4]\n\ - adds r0, r5\n\ - adds r0, r7\n\ - subs r1, r6, 0x1\n\ - strb r1, [r0]\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - movs r3, 0\n\ -_08113DE4:\n\ - adds r1, r6, 0x1\n\ - movs r0, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08113DF2\n\ - adds r2, 0x1D\n\ - b _08113DFC\n\ -_08113DF2:\n\ - mov r0, r9\n\ - ands r6, r0\n\ - cmp r6, 0\n\ - beq _08113DFC\n\ - adds r2, 0x1\n\ -_08113DFC:\n\ - adds r6, r1, 0\n\ - cmp r6, 0x3F\n\ - ble _08113D78\n\ - cmp r3, 0\n\ - beq _08113E14\n\ - ldrb r0, [r4]\n\ - adds r0, r5\n\ - adds r0, r7\n\ - strb r6, [r0]\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ -_08113E14:\n\ - movs r0, 0x7\n\ - ldr r1, [sp, 0x30]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _08113E24\n\ - movs r2, 0xE4\n\ - add r8, r2\n\ - b _08113E28\n\ -_08113E24:\n\ - movs r3, 0x4\n\ - add r8, r3\n\ -_08113E28:\n\ - adds r5, 0x20\n\ - adds r4, 0x1\n\ - ldr r0, [sp, 0x8]\n\ - adds r0, 0x1\n\ - str r0, [sp, 0x8]\n\ - cmp r0, 0x3F\n\ - ble _08113D6A\n\ - movs r1, 0\n\ - str r1, [sp, 0x8]\n\ -_08113E3A:\n\ - ldr r3, [sp, 0x8]\n\ - ldr r4, _08113EBC @ =gSharedMem + 0x14804\n\ - adds r2, r3, r4\n\ - ldr r5, _08113EC0 @ =gSharedMem + 0x14844\n\ - adds r1, r3, r5\n\ - ldrb r0, [r2]\n\ - adds r3, 0x1\n\ - str r3, [sp, 0x30]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08113E52\n\ - b _08113F9E\n\ -_08113E52:\n\ - movs r0, 0\n\ - str r0, [sp, 0xC]\n\ - ldrb r2, [r2]\n\ - cmp r0, r2\n\ - bge _08113F54\n\ - ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\ - adds r0, 0x4\n\ - ldr r1, [sp, 0x8]\n\ - adds r0, r1, r0\n\ - str r0, [sp, 0x18]\n\ -_08113E66:\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - str r2, [sp, 0x14]\n\ - movs r6, 0\n\ - ldr r3, [sp, 0x8]\n\ - ldr r4, _08113EC0 @ =gSharedMem + 0x14844\n\ - adds r0, r3, r4\n\ - ldr r5, [sp, 0xC]\n\ - adds r5, 0x1\n\ - str r5, [sp, 0x34]\n\ - ldrb r0, [r0]\n\ - cmp r6, r0\n\ - bge _08113F3E\n\ - ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\ - mov r10, r0\n\ - lsls r0, r3, 5\n\ - ldr r2, [sp, 0xC]\n\ - adds r1, r2, r0\n\ - mov r9, r0\n\ - ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\ - adds r0, 0xC4\n\ - mov r3, r9\n\ - adds r7, r3, r0\n\ - mov r5, r9\n\ - ldr r4, _08113EC4 @ =gSharedMem + 0x14800\n\ - ldr r2, _08113EC8 @ =0x000010c4\n\ - adds r0, r4, r2\n\ - adds r1, r0\n\ - mov r8, r1\n\ - ldrb r3, [r1]\n\ - str r3, [sp, 0x1C]\n\ -_08113EA4:\n\ - ldr r0, _08113ECC @ =0x000020c4\n\ - add r0, r10\n\ - adds r0, r5, r0\n\ - ldr r4, [sp, 0x1C]\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - bls _08113ED0\n\ - mov r2, r8\n\ - ldrb r1, [r2]\n\ - ldrb r0, [r0]\n\ - b _08113ED6\n\ - .align 2, 0\n\ -_08113EBC: .4byte gSharedMem + 0x14804\n\ -_08113EC0: .4byte gSharedMem + 0x14844\n\ -_08113EC4: .4byte gSharedMem + 0x14800\n\ -_08113EC8: .4byte 0x000010c4\n\ -_08113ECC: .4byte 0x000020c4\n\ -_08113ED0:\n\ - ldrb r1, [r0]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ -_08113ED6:\n\ - subs r3, r1, r0\n\ - ldr r1, [sp, 0xC]\n\ - add r1, r9\n\ - ldr r0, _08113EFC @ =0x000018c4\n\ - add r0, r10\n\ - adds r4, r1, r0\n\ - ldr r0, _08113F00 @ =0x000028c4\n\ - add r0, r10\n\ - adds r2, r5, r0\n\ - ldrb r0, [r4]\n\ - ldr r1, _08113F04 @ =gSharedMem + 0x14800\n\ - mov r12, r1\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bls _08113F08\n\ - adds r1, r0, 0\n\ - ldrb r0, [r2]\n\ - b _08113F0C\n\ - .align 2, 0\n\ -_08113EFC: .4byte 0x000018c4\n\ -_08113F00: .4byte 0x000028c4\n\ -_08113F04: .4byte gSharedMem + 0x14800\n\ -_08113F08:\n\ - ldrb r1, [r2]\n\ - ldrb r0, [r4]\n\ -_08113F0C:\n\ - subs r1, r0\n\ - adds r3, r1\n\ - ldr r2, [sp, 0x14]\n\ - cmp r2, r3\n\ - ble _08113F2C\n\ - ldrb r0, [r7]\n\ - cmp r0, 0\n\ - bne _08113F2C\n\ - ldr r0, _08114050 @ =0x000008c4\n\ - add r0, r12\n\ - adds r0, r5, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _08113F2C\n\ - str r6, [sp, 0x10]\n\ - str r3, [sp, 0x14]\n\ -_08113F2C:\n\ - adds r7, 0x1\n\ - adds r5, 0x1\n\ - adds r6, 0x1\n\ - ldr r3, [sp, 0x8]\n\ - ldr r4, _08114054 @ =gSharedMem + 0x14844\n\ - adds r0, r3, r4\n\ - ldrb r0, [r0]\n\ - cmp r6, r0\n\ - blt _08113EA4\n\ -_08113F3E:\n\ - ldr r0, [sp, 0xC]\n\ - ldr r1, [sp, 0x10]\n\ - ldr r2, [sp, 0x8]\n\ - bl sub_81141F0\n\ - ldr r5, [sp, 0x34]\n\ - str r5, [sp, 0xC]\n\ - ldr r0, [sp, 0x18]\n\ - ldrb r0, [r0]\n\ - cmp r5, r0\n\ - blt _08113E66\n\ -_08113F54:\n\ - movs r6, 0\n\ - ldr r2, _08114058 @ =gSharedMem + 0x14800\n\ - ldr r1, [sp, 0x8]\n\ - ldr r3, _08114054 @ =gSharedMem + 0x14844\n\ - adds r0, r1, r3\n\ - adds r4, r2, 0\n\ - mov r12, r4\n\ - ldrb r0, [r0]\n\ - cmp r6, r0\n\ - bge _08113F9E\n\ - mov r0, r12\n\ - adds r0, 0x44\n\ - adds r4, r1, r0\n\ -_08113F6E:\n\ - ldr r5, [sp, 0x8]\n\ - lsls r0, r5, 5\n\ - adds r1, r6, r0\n\ - adds r0, r2, 0\n\ - adds r0, 0xC4\n\ - adds r0, r1, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _08113F94\n\ - ldr r3, _08114050 @ =0x000008c4\n\ - adds r0, r2, r3\n\ - adds r0, r1, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _08113F94\n\ - adds r0, r6, 0\n\ - adds r1, r5, 0\n\ - bl sub_811430C\n\ -_08113F94:\n\ - adds r6, 0x1\n\ - ldr r2, _08114058 @ =gSharedMem + 0x14800\n\ - ldrb r5, [r4]\n\ - cmp r6, r5\n\ - blt _08113F6E\n\ -_08113F9E:\n\ - ldr r0, [sp, 0x8]\n\ - ldr r1, _0811405C @ =gSharedMem + 0x14804\n\ - adds r2, r0, r1\n\ - ldr r3, _08114054 @ =gSharedMem + 0x14844\n\ - adds r1, r0, r3\n\ - ldrb r0, [r2]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bne _08113FCC\n\ - movs r6, 0\n\ - ldrb r4, [r2]\n\ - cmp r6, r4\n\ - bge _08113FCC\n\ - adds r4, r2, 0\n\ -_08113FBA:\n\ - adds r0, r6, 0\n\ - adds r1, r6, 0\n\ - ldr r2, [sp, 0x8]\n\ - bl sub_81141F0\n\ - adds r6, 0x1\n\ - ldrb r5, [r4]\n\ - cmp r6, r5\n\ - blt _08113FBA\n\ -_08113FCC:\n\ - ldr r0, [sp, 0x8]\n\ - ldr r1, _0811405C @ =gSharedMem + 0x14804\n\ - adds r2, r0, r1\n\ - ldr r3, _08114054 @ =gSharedMem + 0x14844\n\ - adds r1, r0, r3\n\ - ldrb r0, [r2]\n\ - ldr r4, _08114058 @ =gSharedMem + 0x14800\n\ - ldrb r5, [r1]\n\ - cmp r0, r5\n\ - bhi _08113FE2\n\ - b _081141C4\n\ -_08113FE2:\n\ - movs r0, 0\n\ - str r0, [sp, 0x10]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - blt _08113FEE\n\ - b _08114104\n\ -_08113FEE:\n\ - str r2, [sp, 0x2C]\n\ - ldr r1, [sp, 0x8]\n\ - lsls r1, 5\n\ - mov r9, r1\n\ - adds r0, r4, 0\n\ - adds r0, 0x44\n\ - ldr r2, [sp, 0x8]\n\ - adds r0, r2, r0\n\ - str r0, [sp, 0x20]\n\ - mov r3, r9\n\ - str r3, [sp, 0x24]\n\ -_08114004:\n\ - movs r4, 0x80\n\ - lsls r4, 1\n\ - str r4, [sp, 0x14]\n\ - movs r6, 0\n\ - ldr r5, [sp, 0x10]\n\ - adds r5, 0x1\n\ - str r5, [sp, 0x38]\n\ - ldr r0, [sp, 0x2C]\n\ - ldrb r0, [r0]\n\ - cmp r6, r0\n\ - bge _081140C4\n\ - ldr r1, [sp, 0x10]\n\ - ldr r2, [sp, 0x24]\n\ - adds r1, r2\n\ - mov r10, r1\n\ - ldr r0, _08114058 @ =gSharedMem + 0x14800\n\ - adds r0, 0xC4\n\ - adds r2, r0\n\ - mov r8, r2\n\ - ldr r7, [sp, 0x24]\n\ - ldr r3, _08114058 @ =gSharedMem + 0x14800\n\ - ldr r4, _08114060 @ =0x000010c4\n\ - adds r0, r3, r4\n\ - adds r5, r7, r0\n\ - ldr r0, _08114064 @ =gSharedMem + 0x168C4\n\ - add r0, r10\n\ - mov r12, r0\n\ - ldrb r1, [r0]\n\ - str r1, [sp, 0x28]\n\ -_0811403E:\n\ - ldrb r0, [r5]\n\ - ldr r2, [sp, 0x28]\n\ - cmp r0, r2\n\ - bls _08114068\n\ - adds r1, r0, 0\n\ - mov r3, r12\n\ - ldrb r0, [r3]\n\ - b _0811406E\n\ - .align 2, 0\n\ -_08114050: .4byte 0x000008c4\n\ -_08114054: .4byte gSharedMem + 0x14844\n\ -_08114058: .4byte gSharedMem + 0x14800\n\ -_0811405C: .4byte gSharedMem + 0x14804\n\ -_08114060: .4byte 0x000010c4\n\ -_08114064: .4byte gSharedMem + 0x168C4\n\ -_08114068:\n\ - mov r4, r12\n\ - ldrb r1, [r4]\n\ - ldrb r0, [r5]\n\ -_0811406E:\n\ - subs r3, r1, r0\n\ - ldr r1, _0811408C @ =gSharedMem + 0x14800\n\ - ldr r2, _08114090 @ =0x000018c4\n\ - adds r0, r1, r2\n\ - adds r4, r7, r0\n\ - ldr r2, _08114094 @ =gSharedMem + 0x170C4\n\ - add r2, r10\n\ - ldrb r0, [r4]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bls _08114098\n\ - adds r1, r0, 0\n\ - ldrb r0, [r2]\n\ - b _0811409C\n\ - .align 2, 0\n\ -_0811408C: .4byte gSharedMem + 0x14800\n\ -_08114090: .4byte 0x000018c4\n\ -_08114094: .4byte gSharedMem + 0x170C4\n\ -_08114098:\n\ - ldrb r1, [r2]\n\ - ldrb r0, [r4]\n\ -_0811409C:\n\ - subs r1, r0\n\ - adds r3, r1\n\ - ldr r2, [sp, 0x14]\n\ - cmp r2, r3\n\ - ble _081140B2\n\ - mov r4, r8\n\ - ldrb r0, [r4]\n\ - cmp r0, 0\n\ - bne _081140B2\n\ - str r6, [sp, 0xC]\n\ - str r3, [sp, 0x14]\n\ -_081140B2:\n\ - movs r0, 0x1\n\ - add r8, r0\n\ - adds r7, 0x1\n\ - adds r5, 0x1\n\ - adds r6, 0x1\n\ - ldr r1, [sp, 0x2C]\n\ - ldrb r1, [r1]\n\ - cmp r6, r1\n\ - blt _0811403E\n\ -_081140C4:\n\ - ldr r3, [sp, 0xC]\n\ - add r3, r9\n\ - ldr r2, _08114164 @ =gSharedMem + 0x14800\n\ - ldr r4, _08114168 @ =0x000030c4\n\ - adds r1, r2, r4\n\ - adds r1, r3, r1\n\ - ldr r2, [sp, 0x10]\n\ - add r2, r9\n\ - ldr r5, _0811416C @ =gSharedMem + 0x168C4\n\ - adds r0, r2, r5\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _08114164 @ =gSharedMem + 0x14800\n\ - ldr r4, _08114170 @ =0x000038c4\n\ - adds r1, r0, r4\n\ - adds r1, r3, r1\n\ - ldr r5, _08114174 @ =gSharedMem + 0x170C4\n\ - adds r2, r5\n\ - ldrb r0, [r2]\n\ - strb r0, [r1]\n\ - ldr r0, _08114164 @ =gSharedMem + 0x14800\n\ - adds r0, 0xC4\n\ - adds r3, r0\n\ - movs r0, 0x1\n\ - strb r0, [r3]\n\ - ldr r0, [sp, 0x38]\n\ - str r0, [sp, 0x10]\n\ - ldr r1, [sp, 0x20]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bge _08114104\n\ - b _08114004\n\ -_08114104:\n\ - movs r6, 0\n\ - ldr r4, _08114164 @ =gSharedMem + 0x14800\n\ - ldr r2, [sp, 0x8]\n\ - ldr r3, _08114178 @ =gSharedMem + 0x14804\n\ - adds r0, r2, r3\n\ - ldrb r0, [r0]\n\ - cmp r6, r0\n\ - bge _081141C4\n\ - adds r7, r4, 0\n\ - mov r9, r6\n\ - movs r5, 0xC4\n\ - adds r5, r7\n\ - mov r8, r5\n\ -_0811411E:\n\ - ldr r1, [sp, 0x8]\n\ - lsls r0, r1, 5\n\ - adds r2, r6, r0\n\ - ldr r3, _0811417C @ =0x000020c4\n\ - adds r0, r7, r3\n\ - adds r0, r2\n\ - mov r10, r0\n\ - ldr r5, _08114168 @ =0x000030c4\n\ - adds r0, r7, r5\n\ - adds r0, r2, r0\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - strb r0, [r1]\n\ - ldr r3, _08114180 @ =0x000028c4\n\ - adds r0, r7, r3\n\ - adds r3, r2, r0\n\ - ldr r5, _08114170 @ =0x000038c4\n\ - adds r0, r7, r5\n\ - adds r0, r2, r0\n\ - ldrb r0, [r0]\n\ - strb r0, [r3]\n\ - mov r0, r8\n\ - adds r1, r2, r0\n\ - ldrb r0, [r1]\n\ - cmp r0, 0\n\ - beq _08114184\n\ - mov r2, r9\n\ - strb r2, [r1]\n\ - adds r0, r6, 0\n\ - adds r1, r6, 0\n\ - ldr r2, [sp, 0x8]\n\ - bl sub_81141F0\n\ - b _081141B4\n\ - .align 2, 0\n\ -_08114164: .4byte gSharedMem + 0x14800\n\ -_08114168: .4byte 0x000030c4\n\ -_0811416C: .4byte gSharedMem + 0x168C4\n\ -_08114170: .4byte 0x000038c4\n\ -_08114174: .4byte gSharedMem + 0x170C4\n\ -_08114178: .4byte gSharedMem + 0x14804\n\ -_0811417C: .4byte 0x000020c4\n\ -_08114180: .4byte 0x000028c4\n\ -_08114184:\n\ - ldr r5, _081141E0 @ =0x000010c4\n\ - adds r1, r4, r5\n\ - adds r1, r2, r1\n\ - ldr r5, _081141E4 @ =0x000018c4\n\ - adds r0, r4, r5\n\ - adds r0, r2, r0\n\ - ldrb r0, [r0]\n\ - ldrb r2, [r1]\n\ - subs r0, r2\n\ - lsrs r1, r0, 31\n\ - adds r0, r1\n\ - asrs r0, 1\n\ - adds r2, r0\n\ - strb r2, [r3]\n\ - mov r0, r10\n\ - strb r2, [r0]\n\ - ldrb r0, [r3]\n\ - subs r0, 0x1\n\ - strb r0, [r3]\n\ - adds r0, r6, 0\n\ - adds r1, r6, 0\n\ - ldr r2, [sp, 0x8]\n\ - bl sub_81141F0\n\ -_081141B4:\n\ - adds r6, 0x1\n\ - ldr r4, _081141E8 @ =gSharedMem + 0x14800\n\ - ldr r1, [sp, 0x8]\n\ - ldr r2, _081141EC @ =gSharedMem + 0x14804\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - cmp r6, r0\n\ - blt _0811411E\n\ -_081141C4:\n\ - ldr r3, [sp, 0x30]\n\ - str r3, [sp, 0x8]\n\ - cmp r3, 0x3F\n\ - bgt _081141CE\n\ - b _08113E3A\n\ -_081141CE:\n\ - add sp, 0x3C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081141E0: .4byte 0x000010c4\n\ -_081141E4: .4byte 0x000018c4\n\ -_081141E8: .4byte gSharedMem + 0x14800\n\ -_081141EC: .4byte gSharedMem + 0x14804\n\ - .syntax divided"); -} - -void sub_81141F0(s32 a, s32 b, s32 c) -{ - u32 r7; - - sEvoInfo.unk30C4[c][b] = sEvoInfo.unk10C4[c][a]; - sEvoInfo.unk38C4[c][b] = sEvoInfo.unk18C4[c][a]; - - r7 = 0; - if (sEvoInfo.unk10C4[c][a] < sEvoInfo.unk20C4[c][b]) - { - sEvoInfo.unkC4[c][b] = 4; - r7 = sEvoInfo.unk20C4[c][b] - sEvoInfo.unk10C4[c][a]; - } - else if (sEvoInfo.unk10C4[c][a] > sEvoInfo.unk20C4[c][b]) - { - sEvoInfo.unkC4[c][b] = 1; - r7 = sEvoInfo.unk10C4[c][a] - sEvoInfo.unk20C4[c][b]; - } - sEvoInfo.unk80C4[c][b] = r7 * 16; - - r7 = 0; - if (sEvoInfo.unk18C4[c][a] < sEvoInfo.unk28C4[c][b]) - { - sEvoInfo.unk8C4[c][b] = 3; - r7 = sEvoInfo.unk28C4[c][b] - sEvoInfo.unk18C4[c][a]; - } - else if (sEvoInfo.unk18C4[c][a] > sEvoInfo.unk28C4[c][b]) - { - sEvoInfo.unk8C4[c][b] = 2; - r7 = sEvoInfo.unk18C4[c][a] - sEvoInfo.unk28C4[c][b]; - } - sEvoInfo.unk90C4[c][b] = r7 * 16; - - sEvoInfo.unk84[c]++; -} - -void sub_811430C(u32 a, u32 b) -{ - u8 r2 = sEvoInfo.unk28C4[b][a]; - u8 r3 = sEvoInfo.unk20C4[b][a]; - s32 r7 = r2 - r3; - - sEvoInfo.unk30C4[b][a] = sEvoInfo.unk38C4[b][a] = r3 + r7 / 2; - sEvoInfo.unkC4[b][a] = 5; - sEvoInfo.unk8C4[b][a] = 7; - sEvoInfo.unk84[b]++; - r7 = sEvoInfo.unk30C4[b][a] - sEvoInfo.unk20C4[b][a]; - sEvoInfo.unk80C4[b][a] = r7 * 16; - r7 = sEvoInfo.unk28C4[b][a] - sEvoInfo.unk38C4[b][a]; - sEvoInfo.unk90C4[b][a] = r7 * 16; -} - -__attribute__((naked)) -void unref_sub_81143CC() -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - movs r0, 0x1\n\ - str r0, [sp, 0x4]\n\ - ldr r0, _08114408 @ =gSharedMem + 0x14800\n\ - ldr r2, _0811440C @ =0x0000a0c4\n\ - adds r1, r0, r2\n\ - ldrb r3, [r1]\n\ - adds r4, r0, 0\n\ - cmp r3, 0\n\ - beq _081143EE\n\ - subs r0, r3, 0x1\n\ - strb r0, [r1]\n\ -_081143EE:\n\ - movs r5, 0\n\ - str r5, [sp]\n\ -_081143F2:\n\ - movs r3, 0\n\ - adds r2, r4, 0\n\ - adds r0, r4, 0\n\ - adds r0, 0x84\n\ - ldr r1, [sp]\n\ - adds r0, r1, r0\n\ - adds r1, 0x1\n\ - str r1, [sp, 0x8]\n\ - bl _08114D84\n\ - .align 2, 0\n\ -_08114408: .4byte gSharedMem + 0x14800\n\ -_0811440C: .4byte 0x0000a0c4\n\ -_08114410:\n\ - ldr r5, [sp]\n\ - lsls r0, r5, 5\n\ - adds r1, r3, r0\n\ - adds r2, 0xC4\n\ - adds r1, r2\n\ - ldrb r2, [r1]\n\ - mov r8, r0\n\ - adds r0, r3, 0x1\n\ - mov r10, r0\n\ - cmp r2, 0xC\n\ - bls _08114428\n\ - b _081148D2\n\ -_08114428:\n\ - lsls r0, r2, 2\n\ - ldr r1, _08114434 @ =_08114438\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_08114434: .4byte _08114438\n\ - .align 2, 0\n\ -_08114438:\n\ - .4byte _081148D2\n\ - .4byte _0811446C\n\ - .4byte _081144F0\n\ - .4byte _0811457C\n\ - .4byte _08114600\n\ - .4byte _0811468C\n\ - .4byte _081146C8\n\ - .4byte _08114704\n\ - .4byte _08114740\n\ - .4byte _0811477C\n\ - .4byte _081147D0\n\ - .4byte _08114810\n\ - .4byte _08114858\n\ -_0811446C:\n\ - movs r1, 0\n\ - str r1, [sp, 0x4]\n\ - lsls r0, r3, 1\n\ - ldr r2, [sp]\n\ - lsls r1, r2, 6\n\ - adds r0, r1\n\ - ldr r5, _081144E0 @ =0x000060c4\n\ - adds r2, r4, r5\n\ - adds r2, r0, r2\n\ - ldr r5, _081144E4 @ =0x000080c4\n\ - adds r1, r4, r5\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldrh r0, [r2]\n\ - adds r1, r0\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r1\n\ - lsrs r5, r0, 8\n\ - movs r0, 0xFF\n\ - ands r1, r0\n\ - strh r1, [r2]\n\ - movs r6, 0\n\ - adds r1, r3, 0x1\n\ - mov r10, r1\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, r5\n\ - blt _081144A6\n\ - b _081148D2\n\ -_081144A6:\n\ - mov r9, r4\n\ - mov r4, r8\n\ - adds r7, r3, r4\n\ - ldr r0, _081144E8 @ =0x000030c4\n\ - add r0, r9\n\ - adds r4, r7, r0\n\ - ldr r0, _081144EC @ =0x000020c4\n\ - add r0, r9\n\ - adds r2, r7, r0\n\ -_081144B8:\n\ - ldrb r0, [r4]\n\ - subs r0, 0x1\n\ - strb r0, [r4]\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - str r2, [sp, 0xC]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DB4\n\ - ldrb r0, [r4]\n\ - ldr r2, [sp, 0xC]\n\ - ldr r3, [sp, 0x10]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bne _081144D8\n\ - b _081148A0\n\ -_081144D8:\n\ - adds r6, 0x1\n\ - cmp r6, r5\n\ - blt _081144B8\n\ - b _081148D2\n\ - .align 2, 0\n\ -_081144E0: .4byte 0x000060c4\n\ -_081144E4: .4byte 0x000080c4\n\ -_081144E8: .4byte 0x000030c4\n\ -_081144EC: .4byte 0x000020c4\n\ -_081144F0:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r4, _08114568 @ =gSharedMem + 0x14800\n\ - lsls r0, r3, 1\n\ - ldr r5, [sp]\n\ - lsls r1, r5, 6\n\ - adds r0, r1\n\ - ldr r1, _0811456C @ =0x000060c4\n\ - adds r2, r4, r1\n\ - adds r2, r0, r2\n\ - ldr r5, _08114570 @ =0x000080c4\n\ - adds r1, r4, r5\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldrh r0, [r2]\n\ - adds r1, r0\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r1\n\ - lsrs r5, r0, 8\n\ - movs r0, 0xFF\n\ - ands r1, r0\n\ - strh r1, [r2]\n\ - movs r6, 0\n\ - adds r1, r3, 0x1\n\ - mov r10, r1\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, r5\n\ - blt _0811452C\n\ - b _081148D2\n\ -_0811452C:\n\ - mov r9, r4\n\ - mov r4, r8\n\ - adds r7, r3, r4\n\ - ldr r0, _08114574 @ =0x000030c4\n\ - add r0, r9\n\ - adds r4, r7, r0\n\ - ldr r0, _08114578 @ =0x000020c4\n\ - add r0, r9\n\ - adds r2, r7, r0\n\ -_0811453E:\n\ - ldrb r0, [r4]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bne _08114548\n\ - b _081148B8\n\ -_08114548:\n\ - adds r1, r0, 0\n\ - ldr r0, [sp]\n\ - str r2, [sp, 0xC]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DF0\n\ - ldrb r0, [r4]\n\ - subs r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, 0x1\n\ - ldr r2, [sp, 0xC]\n\ - ldr r3, [sp, 0x10]\n\ - cmp r6, r5\n\ - blt _0811453E\n\ - b _081148D2\n\ - .align 2, 0\n\ -_08114568: .4byte gSharedMem + 0x14800\n\ -_0811456C: .4byte 0x000060c4\n\ -_08114570: .4byte 0x000080c4\n\ -_08114574: .4byte 0x000030c4\n\ -_08114578: .4byte 0x000020c4\n\ -_0811457C:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - lsls r0, r3, 1\n\ - ldr r5, [sp]\n\ - lsls r1, r5, 6\n\ - adds r0, r1\n\ - ldr r1, _081145F0 @ =0x000060c4\n\ - adds r2, r4, r1\n\ - adds r2, r0, r2\n\ - ldr r5, _081145F4 @ =0x000080c4\n\ - adds r1, r4, r5\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldrh r0, [r2]\n\ - adds r1, r0\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r1\n\ - lsrs r5, r0, 8\n\ - movs r0, 0xFF\n\ - ands r1, r0\n\ - strh r1, [r2]\n\ - movs r6, 0\n\ - adds r1, r3, 0x1\n\ - mov r10, r1\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, r5\n\ - blt _081145B6\n\ - b _081148D2\n\ -_081145B6:\n\ - mov r9, r4\n\ - mov r4, r8\n\ - adds r7, r3, r4\n\ - ldr r0, _081145F8 @ =0x000030c4\n\ - add r0, r9\n\ - adds r4, r7, r0\n\ - ldr r0, _081145FC @ =0x000020c4\n\ - add r0, r9\n\ - adds r2, r7, r0\n\ -_081145C8:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - str r2, [sp, 0xC]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DB4\n\ - ldrb r0, [r4]\n\ - ldr r2, [sp, 0xC]\n\ - ldr r3, [sp, 0x10]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bne _081145E8\n\ - b _081148AC\n\ -_081145E8:\n\ - adds r6, 0x1\n\ - cmp r6, r5\n\ - blt _081145C8\n\ - b _081148D2\n\ - .align 2, 0\n\ -_081145F0: .4byte 0x000060c4\n\ -_081145F4: .4byte 0x000080c4\n\ -_081145F8: .4byte 0x000030c4\n\ -_081145FC: .4byte 0x000020c4\n\ -_08114600:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r4, _08114678 @ =gSharedMem + 0x14800\n\ - lsls r0, r3, 1\n\ - ldr r5, [sp]\n\ - lsls r1, r5, 6\n\ - adds r0, r1\n\ - ldr r1, _0811467C @ =0x000060c4\n\ - adds r2, r4, r1\n\ - adds r2, r0, r2\n\ - ldr r5, _08114680 @ =0x000080c4\n\ - adds r1, r4, r5\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldrh r0, [r2]\n\ - adds r1, r0\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r1\n\ - lsrs r5, r0, 8\n\ - movs r0, 0xFF\n\ - ands r1, r0\n\ - strh r1, [r2]\n\ - movs r6, 0\n\ - adds r1, r3, 0x1\n\ - mov r10, r1\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, r5\n\ - blt _0811463C\n\ - b _081148D2\n\ -_0811463C:\n\ - mov r9, r4\n\ - mov r4, r8\n\ - adds r7, r3, r4\n\ - ldr r0, _08114684 @ =0x000030c4\n\ - add r0, r9\n\ - adds r4, r7, r0\n\ - ldr r0, _08114688 @ =0x000020c4\n\ - add r0, r9\n\ - adds r2, r7, r0\n\ -_0811464E:\n\ - ldrb r0, [r4]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bne _08114658\n\ - b _081148B8\n\ -_08114658:\n\ - adds r1, r0, 0\n\ - ldr r0, [sp]\n\ - str r2, [sp, 0xC]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DF0\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, 0x1\n\ - ldr r2, [sp, 0xC]\n\ - ldr r3, [sp, 0x10]\n\ - cmp r6, r5\n\ - blt _0811464E\n\ - b _081148D2\n\ - .align 2, 0\n\ -_08114678: .4byte gSharedMem + 0x14800\n\ -_0811467C: .4byte 0x000060c4\n\ -_08114680: .4byte 0x000080c4\n\ -_08114684: .4byte 0x000030c4\n\ -_08114688: .4byte 0x000020c4\n\ -_0811468C:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r5, _081146C0 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r4, r3, r0\n\ - ldr r1, _081146C4 @ =0x000030c4\n\ - adds r0, r5, r1\n\ - adds r0, r4, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [sp]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114E48\n\ - lsls r0, 24\n\ - ldr r3, [sp, 0x10]\n\ - adds r2, r3, 0x1\n\ - mov r10, r2\n\ - cmp r0, 0\n\ - bne _081146B4\n\ - b _081148D2\n\ -_081146B4:\n\ - adds r0, r5, 0\n\ - adds r0, 0xC4\n\ - adds r0, r4, r0\n\ - movs r1, 0x9\n\ - strb r1, [r0]\n\ - b _081148D2\n\ - .align 2, 0\n\ -_081146C0: .4byte gSharedMem + 0x14800\n\ -_081146C4: .4byte 0x000030c4\n\ -_081146C8:\n\ - movs r4, 0\n\ - str r4, [sp, 0x4]\n\ - ldr r5, _081146FC @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r4, r3, r0\n\ - ldr r1, _08114700 @ =0x000030c4\n\ - adds r0, r5, r1\n\ - adds r0, r4, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [sp]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114E48\n\ - lsls r0, 24\n\ - ldr r3, [sp, 0x10]\n\ - adds r2, r3, 0x1\n\ - mov r10, r2\n\ - cmp r0, 0\n\ - bne _081146F0\n\ - b _081148D2\n\ -_081146F0:\n\ - adds r0, r5, 0\n\ - adds r0, 0xC4\n\ - adds r0, r4, r0\n\ - movs r1, 0xA\n\ - strb r1, [r0]\n\ - b _081148D2\n\ - .align 2, 0\n\ -_081146FC: .4byte gSharedMem + 0x14800\n\ -_08114700: .4byte 0x000030c4\n\ -_08114704:\n\ - movs r4, 0\n\ - str r4, [sp, 0x4]\n\ - ldr r5, _08114738 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r4, r3, r0\n\ - ldr r1, _0811473C @ =0x000030c4\n\ - adds r0, r5, r1\n\ - adds r0, r4, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [sp]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114E48\n\ - lsls r0, 24\n\ - ldr r3, [sp, 0x10]\n\ - adds r2, r3, 0x1\n\ - mov r10, r2\n\ - cmp r0, 0\n\ - bne _0811472C\n\ - b _081148D2\n\ -_0811472C:\n\ - adds r0, r5, 0\n\ - adds r0, 0xC4\n\ - adds r0, r4, r0\n\ - movs r1, 0xB\n\ - strb r1, [r0]\n\ - b _081148D2\n\ - .align 2, 0\n\ -_08114738: .4byte gSharedMem + 0x14800\n\ -_0811473C: .4byte 0x000030c4\n\ -_08114740:\n\ - movs r4, 0\n\ - str r4, [sp, 0x4]\n\ - ldr r5, _08114774 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r4, r3, r0\n\ - ldr r1, _08114778 @ =0x000030c4\n\ - adds r0, r5, r1\n\ - adds r0, r4, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [sp]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114E48\n\ - lsls r0, 24\n\ - ldr r3, [sp, 0x10]\n\ - adds r2, r3, 0x1\n\ - mov r10, r2\n\ - cmp r0, 0\n\ - bne _08114768\n\ - b _081148D2\n\ -_08114768:\n\ - adds r0, r5, 0\n\ - adds r0, 0xC4\n\ - adds r0, r4, r0\n\ - movs r1, 0xC\n\ - strb r1, [r0]\n\ - b _081148D2\n\ - .align 2, 0\n\ -_08114774: .4byte gSharedMem + 0x14800\n\ -_08114778: .4byte 0x000030c4\n\ -_0811477C:\n\ - movs r4, 0\n\ - str r4, [sp, 0x4]\n\ - ldr r6, _081147B4 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r5, r3, r0\n\ - ldr r1, _081147B8 @ =0x000030c4\n\ - adds r4, r6, r1\n\ - adds r4, r5, r4\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DB4\n\ - ldr r2, _081147BC @ =0x000020c4\n\ - adds r0, r6, r2\n\ - adds r0, r5, r0\n\ - ldrb r1, [r4]\n\ - ldr r3, [sp, 0x10]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bne _081147C0\n\ - adds r0, r6, 0\n\ - adds r0, 0xC4\n\ - adds r0, r5, r0\n\ - mov r4, sp\n\ - ldrb r4, [r4, 0x4]\n\ - strb r4, [r0]\n\ - b _08114844\n\ - .align 2, 0\n\ -_081147B4: .4byte gSharedMem + 0x14800\n\ -_081147B8: .4byte 0x000030c4\n\ -_081147BC: .4byte 0x000020c4\n\ -_081147C0:\n\ - adds r0, r6, 0\n\ - adds r0, 0xC4\n\ - adds r0, r5, r0\n\ - movs r1, 0x1\n\ - strb r1, [r0]\n\ - adds r0, r3, 0x1\n\ - mov r10, r0\n\ - b _081148D2\n\ -_081147D0:\n\ - movs r1, 0\n\ - str r1, [sp, 0x4]\n\ - ldr r6, _08114804 @ =gSharedMem + 0x14800\n\ - mov r2, r8\n\ - adds r5, r3, r2\n\ - ldr r0, _08114808 @ =0x000030c4\n\ - adds r4, r6, r0\n\ - adds r4, r5, r4\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DF0\n\ - ldr r1, _0811480C @ =0x000020c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - ldrb r1, [r4]\n\ - ldr r3, [sp, 0x10]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - beq _08114882\n\ - adds r0, r6, 0\n\ - adds r0, 0xC4\n\ - adds r0, r5, r0\n\ - movs r1, 0x2\n\ - b _08114842\n\ - .align 2, 0\n\ -_08114804: .4byte gSharedMem + 0x14800\n\ -_08114808: .4byte 0x000030c4\n\ -_0811480C: .4byte 0x000020c4\n\ -_08114810:\n\ - movs r0, 0\n\ - str r0, [sp, 0x4]\n\ - ldr r6, _0811484C @ =gSharedMem + 0x14800\n\ - mov r1, r8\n\ - adds r5, r3, r1\n\ - ldr r2, _08114850 @ =0x000030c4\n\ - adds r4, r6, r2\n\ - adds r4, r5, r4\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DB4\n\ - ldr r1, _08114854 @ =0x000020c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - ldrb r1, [r4]\n\ - ldr r3, [sp, 0x10]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - beq _08114882\n\ - adds r0, r6, 0\n\ - adds r0, 0xC4\n\ - adds r0, r5, r0\n\ - movs r1, 0x3\n\ -_08114842:\n\ - strb r1, [r0]\n\ -_08114844:\n\ - adds r5, r3, 0x1\n\ - mov r10, r5\n\ - b _081148D2\n\ - .align 2, 0\n\ -_0811484C: .4byte gSharedMem + 0x14800\n\ -_08114850: .4byte 0x000030c4\n\ -_08114854: .4byte 0x000020c4\n\ -_08114858:\n\ - movs r0, 0\n\ - str r0, [sp, 0x4]\n\ - ldr r6, _08114894 @ =gSharedMem + 0x14800\n\ - mov r1, r8\n\ - adds r5, r3, r1\n\ - ldr r2, _08114898 @ =0x000030c4\n\ - adds r4, r6, r2\n\ - adds r4, r5, r4\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DF0\n\ - ldr r1, _0811489C @ =0x000020c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - ldrb r1, [r4]\n\ - ldr r3, [sp, 0x10]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bne _081148C4\n\ -_08114882:\n\ - adds r0, r6, 0\n\ - adds r0, 0xC4\n\ - adds r0, r5, r0\n\ - mov r2, sp\n\ - ldrb r2, [r2, 0x4]\n\ - strb r2, [r0]\n\ - adds r4, r3, 0x1\n\ - mov r10, r4\n\ - b _081148D2\n\ - .align 2, 0\n\ -_08114894: .4byte gSharedMem + 0x14800\n\ -_08114898: .4byte 0x000030c4\n\ -_0811489C: .4byte 0x000020c4\n\ -_081148A0:\n\ - mov r0, r9\n\ - adds r0, 0xC4\n\ - adds r0, r7, r0\n\ - movs r5, 0\n\ - strb r5, [r0]\n\ - b _081148D2\n\ -_081148AC:\n\ - mov r0, r9\n\ - adds r0, 0xC4\n\ - adds r0, r7, r0\n\ - movs r1, 0\n\ - strb r1, [r0]\n\ - b _081148D2\n\ -_081148B8:\n\ - mov r0, r9\n\ - adds r0, 0xC4\n\ - adds r0, r7, r0\n\ - movs r1, 0\n\ - strb r1, [r0]\n\ - b _081148D2\n\ -_081148C4:\n\ - adds r0, r6, 0\n\ - adds r0, 0xC4\n\ - adds r0, r5, r0\n\ - movs r1, 0x4\n\ - strb r1, [r0]\n\ - adds r2, r3, 0x1\n\ - mov r10, r2\n\ -_081148D2:\n\ - ldr r0, _081148F4 @ =gSharedMem + 0x14800\n\ - mov r4, r8\n\ - adds r1, r3, r4\n\ - ldr r5, _081148F8 @ =0x000008c4\n\ - adds r2, r0, r5\n\ - adds r1, r2\n\ - ldrb r1, [r1]\n\ - adds r4, r0, 0\n\ - cmp r1, 0xC\n\ - bls _081148E8\n\ - b _08114D76\n\ -_081148E8:\n\ - lsls r0, r1, 2\n\ - ldr r1, _081148FC @ =_08114900\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_081148F4: .4byte gSharedMem + 0x14800\n\ -_081148F8: .4byte 0x000008c4\n\ -_081148FC: .4byte _08114900\n\ - .align 2, 0\n\ -_08114900:\n\ - .4byte _08114D76\n\ - .4byte _08114934\n\ - .4byte _081149B8\n\ - .4byte _08114A3C\n\ - .4byte _08114AC0\n\ - .4byte _08114B44\n\ - .4byte _08114B7C\n\ - .4byte _08114BB4\n\ - .4byte _08114BEC\n\ - .4byte _08114C24\n\ - .4byte _08114C78\n\ - .4byte _08114CB8\n\ - .4byte _08114CF8\n\ -_08114934:\n\ - movs r0, 0\n\ - str r0, [sp, 0x4]\n\ - lsls r0, r3, 1\n\ - ldr r2, [sp]\n\ - lsls r1, r2, 6\n\ - adds r0, r1\n\ - ldr r5, _081149A8 @ =0x000070c4\n\ - adds r2, r4, r5\n\ - adds r2, r0, r2\n\ - ldr r5, _081149AC @ =0x000090c4\n\ - adds r1, r4, r5\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldrh r0, [r2]\n\ - adds r1, r0\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r1\n\ - lsrs r5, r0, 8\n\ - movs r0, 0xFF\n\ - ands r1, r0\n\ - strh r1, [r2]\n\ - movs r6, 0\n\ - ldr r1, [sp, 0x4]\n\ - cmp r1, r5\n\ - blt _0811496A\n\ - b _08114D76\n\ -_0811496A:\n\ - mov r9, r4\n\ - mov r2, r8\n\ - adds r7, r3, r2\n\ - ldr r0, _081149B0 @ =0x000038c4\n\ - add r0, r9\n\ - adds r4, r7, r0\n\ - movs r3, 0\n\ - ldr r0, _081149B4 @ =0x000028c4\n\ - add r0, r9\n\ - adds r2, r7, r0\n\ -_0811497E:\n\ - ldrb r0, [r4]\n\ - subs r0, 0x1\n\ - strb r0, [r4]\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - str r2, [sp, 0xC]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DB4\n\ - ldrb r0, [r4]\n\ - ldr r2, [sp, 0xC]\n\ - ldr r3, [sp, 0x10]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bne _0811499E\n\ - b _08114D4C\n\ -_0811499E:\n\ - adds r6, 0x1\n\ - cmp r6, r5\n\ - blt _0811497E\n\ - b _08114D76\n\ - .align 2, 0\n\ -_081149A8: .4byte 0x000070c4\n\ -_081149AC: .4byte 0x000090c4\n\ -_081149B0: .4byte 0x000038c4\n\ -_081149B4: .4byte 0x000028c4\n\ -_081149B8:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r4, _08114A28 @ =gSharedMem + 0x14800\n\ - lsls r0, r3, 1\n\ - ldr r5, [sp]\n\ - lsls r1, r5, 6\n\ - adds r0, r1\n\ - ldr r1, _08114A2C @ =0x000070c4\n\ - adds r2, r4, r1\n\ - adds r2, r0, r2\n\ - ldr r5, _08114A30 @ =0x000090c4\n\ - adds r1, r4, r5\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldrh r0, [r2]\n\ - adds r1, r0\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r1\n\ - lsrs r5, r0, 8\n\ - movs r0, 0xFF\n\ - ands r1, r0\n\ - strh r1, [r2]\n\ - movs r6, 0\n\ - ldr r1, [sp, 0x4]\n\ - cmp r1, r5\n\ - blt _081149F0\n\ - b _08114D76\n\ -_081149F0:\n\ - mov r9, r4\n\ - mov r2, r8\n\ - adds r7, r3, r2\n\ - ldr r0, _08114A34 @ =0x000038c4\n\ - add r0, r9\n\ - adds r4, r7, r0\n\ - ldr r0, _08114A38 @ =0x000028c4\n\ - add r0, r9\n\ - adds r2, r7, r0\n\ -_08114A02:\n\ - ldrb r0, [r4]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bne _08114A0C\n\ - b _08114D3C\n\ -_08114A0C:\n\ - adds r1, r0, 0\n\ - ldr r0, [sp]\n\ - str r2, [sp, 0xC]\n\ - bl sub_8114DF0\n\ - ldrb r0, [r4]\n\ - subs r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, 0x1\n\ - ldr r2, [sp, 0xC]\n\ - cmp r6, r5\n\ - blt _08114A02\n\ - b _08114D76\n\ - .align 2, 0\n\ -_08114A28: .4byte gSharedMem + 0x14800\n\ -_08114A2C: .4byte 0x000070c4\n\ -_08114A30: .4byte 0x000090c4\n\ -_08114A34: .4byte 0x000038c4\n\ -_08114A38: .4byte 0x000028c4\n\ -_08114A3C:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - lsls r0, r3, 1\n\ - ldr r5, [sp]\n\ - lsls r1, r5, 6\n\ - adds r0, r1\n\ - ldr r1, _08114AB0 @ =0x000070c4\n\ - adds r2, r4, r1\n\ - adds r2, r0, r2\n\ - ldr r5, _08114AB4 @ =0x000090c4\n\ - adds r1, r4, r5\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldrh r0, [r2]\n\ - adds r1, r0\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r1\n\ - lsrs r5, r0, 8\n\ - movs r0, 0xFF\n\ - ands r1, r0\n\ - strh r1, [r2]\n\ - movs r6, 0\n\ - ldr r1, [sp, 0x4]\n\ - cmp r1, r5\n\ - blt _08114A72\n\ - b _08114D76\n\ -_08114A72:\n\ - mov r9, r4\n\ - mov r2, r8\n\ - adds r7, r3, r2\n\ - ldr r0, _08114AB8 @ =0x000038c4\n\ - add r0, r9\n\ - adds r4, r7, r0\n\ - movs r3, 0\n\ - ldr r0, _08114ABC @ =0x000028c4\n\ - add r0, r9\n\ - adds r2, r7, r0\n\ -_08114A86:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - str r2, [sp, 0xC]\n\ - str r3, [sp, 0x10]\n\ - bl sub_8114DB4\n\ - ldrb r0, [r4]\n\ - ldr r2, [sp, 0xC]\n\ - ldr r3, [sp, 0x10]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bne _08114AA6\n\ - b _08114D4C\n\ -_08114AA6:\n\ - adds r6, 0x1\n\ - cmp r6, r5\n\ - blt _08114A86\n\ - b _08114D76\n\ - .align 2, 0\n\ -_08114AB0: .4byte 0x000070c4\n\ -_08114AB4: .4byte 0x000090c4\n\ -_08114AB8: .4byte 0x000038c4\n\ -_08114ABC: .4byte 0x000028c4\n\ -_08114AC0:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r4, _08114B30 @ =gSharedMem + 0x14800\n\ - lsls r0, r3, 1\n\ - ldr r5, [sp]\n\ - lsls r1, r5, 6\n\ - adds r0, r1\n\ - ldr r1, _08114B34 @ =0x000070c4\n\ - adds r2, r4, r1\n\ - adds r2, r0, r2\n\ - ldr r5, _08114B38 @ =0x000090c4\n\ - adds r1, r4, r5\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldrh r0, [r2]\n\ - adds r1, r0\n\ - movs r0, 0xFF\n\ - lsls r0, 8\n\ - ands r0, r1\n\ - lsrs r5, r0, 8\n\ - movs r0, 0xFF\n\ - ands r1, r0\n\ - strh r1, [r2]\n\ - movs r6, 0\n\ - ldr r1, [sp, 0x4]\n\ - cmp r1, r5\n\ - blt _08114AF8\n\ - b _08114D76\n\ -_08114AF8:\n\ - mov r9, r4\n\ - mov r2, r8\n\ - adds r7, r3, r2\n\ - ldr r0, _08114B3C @ =0x000038c4\n\ - add r0, r9\n\ - adds r4, r7, r0\n\ - ldr r0, _08114B40 @ =0x000028c4\n\ - add r0, r9\n\ - adds r2, r7, r0\n\ -_08114B0A:\n\ - ldrb r0, [r4]\n\ - ldrb r1, [r2]\n\ - cmp r0, r1\n\ - bne _08114B14\n\ - b _08114D5C\n\ -_08114B14:\n\ - adds r1, r0, 0\n\ - ldr r0, [sp]\n\ - str r2, [sp, 0xC]\n\ - bl sub_8114DF0\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, 0x1\n\ - ldr r2, [sp, 0xC]\n\ - cmp r6, r5\n\ - blt _08114B0A\n\ - b _08114D76\n\ - .align 2, 0\n\ -_08114B30: .4byte gSharedMem + 0x14800\n\ -_08114B34: .4byte 0x000070c4\n\ -_08114B38: .4byte 0x000090c4\n\ -_08114B3C: .4byte 0x000038c4\n\ -_08114B40: .4byte 0x000028c4\n\ -_08114B44:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r5, _08114B70 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r4, r3, r0\n\ - ldr r1, _08114B74 @ =0x000038c4\n\ - adds r0, r5, r1\n\ - adds r0, r4, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [sp]\n\ - bl sub_8114E48\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08114B64\n\ - b _08114D76\n\ -_08114B64:\n\ - ldr r2, _08114B78 @ =0x000008c4\n\ - adds r0, r5, r2\n\ - adds r0, r4, r0\n\ - movs r1, 0x9\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114B70: .4byte gSharedMem + 0x14800\n\ -_08114B74: .4byte 0x000038c4\n\ -_08114B78: .4byte 0x000008c4\n\ -_08114B7C:\n\ - movs r4, 0\n\ - str r4, [sp, 0x4]\n\ - ldr r5, _08114BA8 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r4, r3, r0\n\ - ldr r1, _08114BAC @ =0x000038c4\n\ - adds r0, r5, r1\n\ - adds r0, r4, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [sp]\n\ - bl sub_8114E48\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08114B9C\n\ - b _08114D76\n\ -_08114B9C:\n\ - ldr r2, _08114BB0 @ =0x000008c4\n\ - adds r0, r5, r2\n\ - adds r0, r4, r0\n\ - movs r1, 0xA\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114BA8: .4byte gSharedMem + 0x14800\n\ -_08114BAC: .4byte 0x000038c4\n\ -_08114BB0: .4byte 0x000008c4\n\ -_08114BB4:\n\ - movs r4, 0\n\ - str r4, [sp, 0x4]\n\ - ldr r5, _08114BE0 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r4, r3, r0\n\ - ldr r1, _08114BE4 @ =0x000038c4\n\ - adds r0, r5, r1\n\ - adds r0, r4, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [sp]\n\ - bl sub_8114E48\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08114BD4\n\ - b _08114D76\n\ -_08114BD4:\n\ - ldr r2, _08114BE8 @ =0x000008c4\n\ - adds r0, r5, r2\n\ - adds r0, r4, r0\n\ - movs r1, 0xB\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114BE0: .4byte gSharedMem + 0x14800\n\ -_08114BE4: .4byte 0x000038c4\n\ -_08114BE8: .4byte 0x000008c4\n\ -_08114BEC:\n\ - movs r4, 0\n\ - str r4, [sp, 0x4]\n\ - ldr r5, _08114C18 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r4, r3, r0\n\ - ldr r1, _08114C1C @ =0x000038c4\n\ - adds r0, r5, r1\n\ - adds r0, r4, r0\n\ - ldrb r1, [r0]\n\ - ldr r0, [sp]\n\ - bl sub_8114E48\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08114C0C\n\ - b _08114D76\n\ -_08114C0C:\n\ - ldr r2, _08114C20 @ =0x000008c4\n\ - adds r0, r5, r2\n\ - adds r0, r4, r0\n\ - movs r1, 0xC\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114C18: .4byte gSharedMem + 0x14800\n\ -_08114C1C: .4byte 0x000038c4\n\ -_08114C20: .4byte 0x000008c4\n\ -_08114C24:\n\ - movs r4, 0\n\ - str r4, [sp, 0x4]\n\ - ldr r6, _08114C58 @ =gSharedMem + 0x14800\n\ - mov r0, r8\n\ - adds r5, r3, r0\n\ - ldr r1, _08114C5C @ =0x000038c4\n\ - adds r4, r6, r1\n\ - adds r4, r5, r4\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - bl sub_8114DB4\n\ - ldr r2, _08114C60 @ =0x000028c4\n\ - adds r0, r6, r2\n\ - adds r0, r5, r0\n\ - ldrb r1, [r4]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bne _08114C68\n\ - ldr r4, _08114C64 @ =0x000008c4\n\ - adds r0, r6, r4\n\ - adds r0, r5, r0\n\ - mov r5, sp\n\ - ldrb r5, [r5, 0x4]\n\ - strb r5, [r0]\n\ - b _08114D76\n\ - .align 2, 0\n\ -_08114C58: .4byte gSharedMem + 0x14800\n\ -_08114C5C: .4byte 0x000038c4\n\ -_08114C60: .4byte 0x000028c4\n\ -_08114C64: .4byte 0x000008c4\n\ -_08114C68:\n\ - ldr r1, _08114C74 @ =0x000008c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - movs r1, 0x1\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114C74: .4byte 0x000008c4\n\ -_08114C78:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r6, _08114CA8 @ =gSharedMem + 0x14800\n\ - mov r4, r8\n\ - adds r5, r3, r4\n\ - ldr r0, _08114CAC @ =0x000038c4\n\ - adds r4, r6, r0\n\ - adds r4, r5, r4\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - bl sub_8114DF0\n\ - ldr r1, _08114CB0 @ =0x000028c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - ldrb r1, [r4]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - beq _08114D1E\n\ - ldr r1, _08114CB4 @ =0x000008c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - movs r1, 0x2\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114CA8: .4byte gSharedMem + 0x14800\n\ -_08114CAC: .4byte 0x000038c4\n\ -_08114CB0: .4byte 0x000028c4\n\ -_08114CB4: .4byte 0x000008c4\n\ -_08114CB8:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r6, _08114CE8 @ =gSharedMem + 0x14800\n\ - mov r4, r8\n\ - adds r5, r3, r4\n\ - ldr r0, _08114CEC @ =0x000038c4\n\ - adds r4, r6, r0\n\ - adds r4, r5, r4\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - bl sub_8114DB4\n\ - ldr r1, _08114CF0 @ =0x000028c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - ldrb r1, [r4]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - beq _08114D1E\n\ - ldr r1, _08114CF4 @ =0x000008c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - movs r1, 0x3\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114CE8: .4byte gSharedMem + 0x14800\n\ -_08114CEC: .4byte 0x000038c4\n\ -_08114CF0: .4byte 0x000028c4\n\ -_08114CF4: .4byte 0x000008c4\n\ -_08114CF8:\n\ - movs r2, 0\n\ - str r2, [sp, 0x4]\n\ - ldr r6, _08114D2C @ =gSharedMem + 0x14800\n\ - mov r4, r8\n\ - adds r5, r3, r4\n\ - ldr r0, _08114D30 @ =0x000038c4\n\ - adds r4, r6, r0\n\ - adds r4, r5, r4\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - bl sub_8114DF0\n\ - ldr r1, _08114D34 @ =0x000028c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - ldrb r1, [r4]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bne _08114D6C\n\ -_08114D1E:\n\ - ldr r2, _08114D38 @ =0x000008c4\n\ - adds r0, r6, r2\n\ - adds r0, r5, r0\n\ - mov r4, sp\n\ - ldrb r4, [r4, 0x4]\n\ - strb r4, [r0]\n\ - b _08114D76\n\ - .align 2, 0\n\ -_08114D2C: .4byte gSharedMem + 0x14800\n\ -_08114D30: .4byte 0x000038c4\n\ -_08114D34: .4byte 0x000028c4\n\ -_08114D38: .4byte 0x000008c4\n\ -_08114D3C:\n\ - ldr r0, _08114D48 @ =0x000008c4\n\ - add r0, r9\n\ - adds r0, r7, r0\n\ - movs r1, 0\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114D48: .4byte 0x000008c4\n\ -_08114D4C:\n\ - ldr r0, _08114D58 @ =0x000008c4\n\ - add r0, r9\n\ - adds r0, r7, r0\n\ - strb r3, [r0]\n\ - b _08114D76\n\ - .align 2, 0\n\ -_08114D58: .4byte 0x000008c4\n\ -_08114D5C:\n\ - ldr r0, _08114D68 @ =0x000008c4\n\ - add r0, r9\n\ - adds r0, r7, r0\n\ - movs r1, 0\n\ - b _08114D74\n\ - .align 2, 0\n\ -_08114D68: .4byte 0x000008c4\n\ -_08114D6C:\n\ - ldr r1, _08114DAC @ =0x000008c4\n\ - adds r0, r6, r1\n\ - adds r0, r5, r0\n\ - movs r1, 0x4\n\ -_08114D74:\n\ - strb r1, [r0]\n\ -_08114D76:\n\ - mov r3, r10\n\ - ldr r2, _08114DB0 @ =gSharedMem + 0x14800\n\ - adds r0, r2, 0\n\ - adds r0, 0x84\n\ - ldr r4, [sp]\n\ - adds r0, r4, r0\n\ - adds r4, r2, 0\n\ -_08114D84:\n\ - ldrb r0, [r0]\n\ - cmp r3, r0\n\ - bge _08114D8E\n\ - bl _08114410\n\ -_08114D8E:\n\ - ldr r5, [sp, 0x8]\n\ - str r5, [sp]\n\ - cmp r5, 0x3F\n\ - bgt _08114D9A\n\ - bl _081143F2\n\ -_08114D9A:\n\ - ldr r0, [sp, 0x4]\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08114DAC: .4byte 0x000008c4\n\ -_08114DB0: .4byte gSharedMem + 0x14800\n\ - .syntax divided"); -} - -void sub_8114DB4(u32 a, u8 b) -{ - u8 *r2 = sEvoInfo.unk40C4[a][b / 2]; - - if (b % 2 != 0) - *r2 |= 0xF0; - else - *r2 |= 0x0F; -} - -void sub_8114DF0(u32 a, u8 b) -{ - u8 *r2 = sEvoInfo.unk40C4[a][b / 2]; - u8 *r1 = r2 + 0x6000; - - if (b % 2 != 0) - { - if (!(*r1 & 0xF0)) - *r2 &= 0x0F; - } - else - { - if (!(*r1 & 0x0F)) - *r2 &= 0xF0; - } -} - -__attribute__((naked)) -void sub_8114E48() -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - adds r4, r0, 0\n\ - lsls r1, 24\n\ - lsrs r6, r1, 24\n\ - ldr r1, _08114E6C @ =gSharedMem + 0x14800\n\ - ldr r2, _08114E70 @ =0x0000a0c4\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - adds r5, r1, 0\n\ - cmp r0, 0\n\ - bne _08114E60\n\ - b _08114F5E\n\ -_08114E60:\n\ - movs r1, 0\n\ - movs r3, 0\n\ - cmp r4, 0\n\ - bne _08114E74\n\ - movs r1, 0x1\n\ - b _08114EA6\n\ - .align 2, 0\n\ -_08114E6C: .4byte gSharedMem + 0x14800\n\ -_08114E70: .4byte 0x0000a0c4\n\ -_08114E74:\n\ - subs r0, r4, 0x1\n\ - lsls r0, 5\n\ - adds r2, r3, r0\n\ - adds r0, r5, 0\n\ - adds r0, 0xC4\n\ - adds r0, r2, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _08114EA6\n\ - ldr r7, _08114EC4 @ =0x000008c4\n\ - adds r0, r5, r7\n\ - adds r0, r2, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _08114EA6\n\ - adds r3, 0x1\n\ - cmp r3, 0x1F\n\ - bgt _08114EA6\n\ - cmp r4, 0\n\ - bne _08114E74\n\ - lsls r0, r1, 24\n\ - movs r1, 0x80\n\ - lsls r1, 17\n\ - adds r0, r1\n\ - lsrs r1, r0, 24\n\ -_08114EA6:\n\ - cmp r3, 0x20\n\ - bne _08114EB4\n\ - lsls r0, r1, 24\n\ - movs r2, 0x80\n\ - lsls r2, 17\n\ - adds r0, r2\n\ - lsrs r1, r0, 24\n\ -_08114EB4:\n\ - movs r3, 0\n\ - cmp r4, 0x3F\n\ - bne _08114EC8\n\ - lsls r0, r1, 24\n\ - movs r7, 0x80\n\ - lsls r7, 17\n\ - adds r0, r7\n\ - b _08114EF8\n\ - .align 2, 0\n\ -_08114EC4: .4byte 0x000008c4\n\ -_08114EC8:\n\ - adds r0, r4, 0x1\n\ - lsls r0, 5\n\ - adds r2, r3, r0\n\ - adds r0, r5, 0\n\ - adds r0, 0xC4\n\ - adds r0, r2, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _08114EFA\n\ - ldr r7, _08114F64 @ =0x000008c4\n\ - adds r0, r5, r7\n\ - adds r0, r2, r0\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _08114EFA\n\ - adds r3, 0x1\n\ - cmp r3, 0x1F\n\ - bgt _08114EFA\n\ - cmp r4, 0x3F\n\ - bne _08114EC8\n\ - lsls r0, r1, 24\n\ - movs r1, 0x80\n\ - lsls r1, 17\n\ - adds r0, r1\n\ -_08114EF8:\n\ - lsrs r1, r0, 24\n\ -_08114EFA:\n\ - cmp r3, 0x20\n\ - bne _08114F08\n\ - lsls r0, r1, 24\n\ - movs r2, 0x80\n\ - lsls r2, 17\n\ - adds r0, r2\n\ - lsrs r1, r0, 24\n\ -_08114F08:\n\ - cmp r1, 0x2\n\ - beq _08114F5E\n\ - subs r0, r6, 0x2\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - cmp r0, 0\n\ - bge _08114F18\n\ - movs r1, 0\n\ -_08114F18:\n\ - adds r0, r6, 0x2\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3F\n\ - ble _08114F26\n\ - movs r2, 0x3F\n\ -_08114F26:\n\ - lsls r1, 24\n\ - asrs r3, r1, 24\n\ - lsls r0, r2, 24\n\ - asrs r2, r0, 24\n\ - adds r6, r1, 0\n\ - adds r7, r0, 0\n\ - cmp r3, r2\n\ - bge _08114F7C\n\ - cmp r4, 0\n\ - beq _08114F7C\n\ - subs r0, r4, 0x1\n\ - lsls r5, r0, 7\n\ - ldr r0, _08114F68 @ =gSharedMem + 0x188C4\n\ - mov r12, r0\n\ -_08114F42:\n\ - asrs r0, r3, 1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - add r0, r12\n\ - ldr r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08114F6C\n\ - ldrb r1, [r1]\n\ - movs r0, 0xF0\n\ -_08114F58:\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08114F72\n\ -_08114F5E:\n\ - movs r0, 0x1\n\ - b _08114FCA\n\ - .align 2, 0\n\ -_08114F64: .4byte 0x000008c4\n\ -_08114F68: .4byte gSharedMem + 0x188C4\n\ -_08114F6C:\n\ - ldrb r1, [r1]\n\ - movs r0, 0xF\n\ - b _08114F58\n\ -_08114F72:\n\ - adds r3, 0x1\n\ - cmp r3, r2\n\ - bge _08114F7C\n\ - cmp r4, 0\n\ - bne _08114F42\n\ -_08114F7C:\n\ - asrs r3, r6, 24\n\ - asrs r1, r7, 24\n\ - cmp r3, r1\n\ - bge _08114FC8\n\ - cmp r4, 0x3F\n\ - beq _08114FC8\n\ - adds r0, r4, 0x1\n\ - lsls r5, r0, 7\n\ - ldr r6, _08114FB0 @ =gSharedMem + 0x188C4\n\ - adds r2, r1, 0\n\ -_08114F90:\n\ - asrs r0, r3, 1\n\ - lsls r0, 2\n\ - adds r0, r5\n\ - adds r0, r6\n\ - ldr r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08114FB4\n\ - ldrb r1, [r1]\n\ - movs r0, 0xF0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08114FBE\n\ - b _08114F5E\n\ - .align 2, 0\n\ -_08114FB0: .4byte gSharedMem + 0x188C4\n\ -_08114FB4:\n\ - ldrb r1, [r1]\n\ - movs r0, 0xF\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08114F5E\n\ -_08114FBE:\n\ - adds r3, 0x1\n\ - cmp r3, r2\n\ - bge _08114FC8\n\ - cmp r4, 0x3F\n\ - bne _08114F90\n\ -_08114FC8:\n\ - movs r0, 0\n\ -_08114FCA:\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided"); -} - -// Functions below are vblank callbacks and are used - -static void EvoDummyFunc(void) -{ - -} - -static void VBlankCB_EvolutionScene(void) -{ - REG_BG0CNT = BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256 | BGCNT_AFF512x512 | BGCNT_PRIORITY(3); // 0x9803 - REG_BG0HOFS = gBattle_BG0_X; - REG_BG0VOFS = gBattle_BG0_Y; - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gBattle_BG3_X; - REG_BG3VOFS = gBattle_BG3_Y; - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -static void VBlankCB_TradeEvolutionScene(void) -{ - REG_BG0HOFS = gBattle_BG0_X; - REG_BG0VOFS = gBattle_BG0_Y; - REG_BG1HOFS = gBattle_BG1_X; - REG_BG1VOFS = gBattle_BG1_Y; - REG_BG2HOFS = gBattle_BG2_X; - REG_BG2VOFS = gBattle_BG2_Y; - REG_BG3HOFS = gBattle_BG3_X; - REG_BG3VOFS = gBattle_BG3_Y; - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - ScanlineEffect_InitHBlankDmaTransfer(); -} - -static void sub_81150D8(void) -{ - MenuCursor_SetPos814A880(200, 72 + (sEvoCursorPos * 16)); -} - -static void EvoDummyFunc2(void) -{ - -} diff --git a/src/scene/hall_of_fame.c b/src/scene/hall_of_fame.c deleted file mode 100644 index 2b790e97d..000000000 --- a/src/scene/hall_of_fame.c +++ /dev/null @@ -1,1366 +0,0 @@ -#include "global.h" -#include "main.h" -#include "task.h" -#include "palette.h" -#include "sound.h" -#include "constants/songs.h" -#include "pokemon.h" -#include "text.h" -#include "strings.h" -#include "string_util.h" -#include "menu.h" -#include "save.h" -#include "constants/species.h" -#include "overworld.h" -#include "m4a.h" -#include "data2.h" -#include "decompress.h" -#include "random.h" -#include "scanline_effect.h" -#include "trig.h" -#include "hof_pc.h" -#include "credits.h" -#include "pc_screen_effect.h" -#include "ewram.h" - -static EWRAM_DATA u32 sUnknown_0203931C = 0; - -extern bool8 gUnknown_02039324; // has hall of fame records -extern void (*gGameContinueCallback)(void); -extern struct MusicPlayerInfo gMPlay_BGM; -extern u8 gReservedSpritePaletteCount; -extern struct SpriteTemplate gUnknown_02024E8C; - -extern const u8 gContestConfetti_Gfx[]; -extern const u8 gContestConfetti_Pal[]; -extern const u8 gHallOfFame_Gfx[]; -extern const u16 gHallOfFame_Pal[]; - -struct HallofFameMon -{ - u32 tid; - u32 personality; - u16 species : 9; - u16 lvl : 7; - u8 nick[10]; -}; - -struct HallofFameMons -{ - struct HallofFameMon mons[6]; -}; - -#define HALL_OF_FAME_MAX_TEAMS 50 - -static void sub_8141FF8(u8 taskID); -static void sub_81422E8(u8 taskID); -static void sub_814217C(u8 taskID); -static void sub_8142274(u8 taskID); -static void sub_81422B8(u8 taskID); -static void sub_8142320(u8 taskID); -static void sub_8142404(u8 taskID); -static void sub_8142484(u8 taskID); -static void sub_8142570(u8 taskID); -static void sub_8142618(u8 taskID); -static void sub_81426F8(u8 taskID); -static void sub_8142738(u8 taskID); -static void sub_8142794(u8 taskID); -static void sub_8142818(u8 taskID); -static void sub_8142850(u8 taskID); -static void sub_81428A0(u8 taskID); -static void sub_8142A28(u8 taskID); -static void sub_8142FEC(u8 taskID); -static void sub_8142B04(u8 taskID); -static void sub_8142CC8(u8 taskID); -static void sub_8142DF4(u8 taskID); -static void sub_8142F78(u8 taskID); -static void sub_8142FCC(u8 taskID); -static void sub_814302C(u8 taskID); - -static void sub_81435DC(struct Sprite* sprite); -static void sub_814386C(struct Sprite* sprite); -static void SpriteCB_HallOfFame_Dummy(struct Sprite* sprite); - -static void sub_8143068(u8 a0, u8 a1); -static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 a1, u8 a2); -static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1); -static void sub_81433E0(void); -static void sub_8143570(void); -static void sub_81435B8(void); -static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 pid); -static u32 HallOfFame_LoadTrainerPic(u16 trainerPicID, s16 posX, s16 posY, u16 a3); -static bool8 sub_81438C4(void); - -// data and gfx - -static const struct CompressedSpriteSheet sHallOfFame_ConfettiSpriteSheet = -{ - gContestConfetti_Gfx, 0x220, 1001 -}; - -static const u8 sUnused0[8] = {}; - -static const struct CompressedSpritePalette sHallOfFame_ConfettiSpritePalette = -{ - gContestConfetti_Pal, 1001 -}; - -static const u8 sUnused1[8] = {}; - -static const s16 sHallOfFame_MonsFullTeamPositions[6][4] = -{ - {120, 210, 120, 40}, - {326, 220, 56, 40}, - {-86, 220, 184, 40}, - {120, -62, 120, 88}, - {-25, -62, 200, 88}, - {265, -62, 40, 88} -}; - -static const s16 sHallOfFame_MonsHalfTeamPositions[3][4] = -{ - {120, 214, 120, 64}, - {281, 214, 56, 64}, - {-41, 214, 184, 64} -}; - -static const struct PCScreenEffectStruct sPCScreenEffectTemplate = { - .tileTag = 0x3ea, - .paletteTag = 0x3ea -}; - -static const u8 sUnused2[6] = {2, 1, 3, 6, 4, 5}; - -static const struct OamData sOamData_840B598 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -void* const gUnknown_0840B5A0[] = -{ - ewram8000, - ewramA000, - ewramC000, - ewramE000, - ewram10000, - ewram14000, - ewram18000_2 -}; - -static const struct SpriteFrameImage sSpriteImageTable_840B5BC[] = -{ - {ewram8000, 0x800}, - {ewram8800, 0x800}, - {ewram9000, 0x800}, - {ewram9800, 0x800} -}; - -static const struct SpriteFrameImage sSpriteImageTable_840B5DC[] = -{ - {ewramA000, 0x800}, - {ewramA800, 0x800}, - {ewramB000, 0x800}, - {ewramB800, 0x800} -}; - -static const struct SpriteFrameImage sSpriteImageTable_840B5FC[] = -{ - {ewramC000, 0x800}, - {ewramC800, 0x800}, - {ewramD000, 0x800}, - {ewramD800, 0x800} -}; - -static const struct SpriteFrameImage sSpriteImageTable_840B61C[] = -{ - {ewramE000, 0x800}, - {ewramE800, 0x800}, - {ewramF000, 0x800}, - {ewramF800, 0x800} -}; - -static const struct SpriteFrameImage sSpriteImageTable_840B63C[] = -{ - {ewram10000, 0x800}, - {ewram10800, 0x800}, - {ewram11000, 0x800}, - {ewram11800, 0x800} -}; - -static const struct SpriteFrameImage sSpriteImageTable_840B65C[] = -{ - {ewram14000, 0x800}, - {ewram14800, 0x800}, - {ewram15000, 0x800}, - {ewram15800, 0x800} -}; - -static const struct SpriteFrameImage sSpriteImageTable_840B67C[] = -{ - {ewram18000_2, 0x800}, - {ewram18800, 0x800}, - {ewram19000, 0x800}, - {ewram19800, 0x800} -}; - -static const struct SpriteFrameImage* const sUnknown_0840B69C[7] = -{ - sSpriteImageTable_840B5BC, - sSpriteImageTable_840B5DC, - sSpriteImageTable_840B5FC, - sSpriteImageTable_840B61C, - sSpriteImageTable_840B63C, - sSpriteImageTable_840B65C, - sSpriteImageTable_840B67C -}; - -static const struct SpriteTemplate sUnknown_0840B6B8 = -{ - .tileTag = -1, - .paletteTag = -1, - .oam = &sOamData_840B598, - .anims = NULL, - .images = sSpriteImageTable_840B5BC, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_HallOfFame_Dummy -}; - -static const struct OamData sOamData_840B6D0 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -static const union AnimCmd sSpriteAnim_840B6D8[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B6E0[] = -{ - ANIMCMD_FRAME(1, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B6E8[] = -{ - ANIMCMD_FRAME(2, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B6F0[] = -{ - ANIMCMD_FRAME(3, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B6F8[] = -{ - ANIMCMD_FRAME(4, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B700[] = -{ - ANIMCMD_FRAME(5, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B708[] = -{ - ANIMCMD_FRAME(6, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B710[] = -{ - ANIMCMD_FRAME(7, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B718[] = -{ - ANIMCMD_FRAME(8, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B720[] = -{ - ANIMCMD_FRAME(9, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B728[] = -{ - ANIMCMD_FRAME(10, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B730[] = -{ - ANIMCMD_FRAME(11, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B738[] = -{ - ANIMCMD_FRAME(12, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B740[] = -{ - ANIMCMD_FRAME(13, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B748[] = -{ - ANIMCMD_FRAME(14, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B750[] = -{ - ANIMCMD_FRAME(15, 30), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_840B758[] = -{ - ANIMCMD_FRAME(16, 30), - ANIMCMD_END -}; - -static const union AnimCmd* const sSpriteAnimTable_840B760[] = -{ - sSpriteAnim_840B6D8, - sSpriteAnim_840B6E0, - sSpriteAnim_840B6E8, - sSpriteAnim_840B6F0, - sSpriteAnim_840B6F8, - sSpriteAnim_840B700, - sSpriteAnim_840B708, - sSpriteAnim_840B710, - sSpriteAnim_840B718, - sSpriteAnim_840B720, - sSpriteAnim_840B728, - sSpriteAnim_840B730, - sSpriteAnim_840B738, - sSpriteAnim_840B740, - sSpriteAnim_840B748, - sSpriteAnim_840B750, - sSpriteAnim_840B758 -}; - -static const struct SpriteTemplate sSpriteTemplate_840B7A4 = -{ - .tileTag = 1001, - .paletteTag = 1001, - .oam = &sOamData_840B6D0, - .anims = sSpriteAnimTable_840B760, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_814386C -}; - -// code - -#define tDisplayedPoke data[1] -#define tPokesNumber data[2] -#define tFrameCount data[3] -#define tPlayerSpriteID data[4] -#define tMonSpriteID(i) data[i + 5] - -static void VBlankCB_HallOfFame(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void CB2_HallOfFame(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static bool8 sub_8141E64(void) -{ - switch (gMain.state) - { - case 0: - default: - SetVBlankCallback(NULL); - sub_81433E0(); - gMain.state = 1; - break; - case 1: - sub_8143570(); - gMain.state++; - break; - case 2: - { - u16 saved_IME; - - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - SetVBlankCallback(VBlankCB_HallOfFame); - saved_IME = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = saved_IME; - REG_DISPSTAT |= 8; - gMain.state++; - } - break; - case 3: - REG_BLDCNT = 0x3F42; - REG_BLDALPHA = 0x710; - REG_BLDY = 0; - sub_81435B8(); - gMain.state++; - break; - case 4: - UpdatePaletteFade(); - if (!gPaletteFade.active) - { - SetMainCallback2(CB2_HallOfFame); - PlayBGM(BGM_DENDOU); - return 0; - } - break; - } - return 1; -} - -void sub_8141F90(void) -{ - if (sub_8141E64() == 0) - { - u8 taskID = CreateTask(sub_8141FF8, 0); - gTasks[taskID].data[0] = 0; - } -} - -static void sub_8141FC4(void) -{ - if (sub_8141E64() == 0) - { - u8 taskID = CreateTask(sub_8141FF8, 0); - gTasks[taskID].data[0] = 1; - } -} - -static void sub_8141FF8(u8 taskID) -{ - u16 i, j; - struct HallofFameMons* fameMons = eHallOfFameMons1; - - gTasks[taskID].tPokesNumber = 0; // valid pokes - for (i = 0; i < 6; i++) - { - u8 nick[12]; - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) - { - fameMons->mons[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - fameMons->mons[i].tid = GetMonData(&gPlayerParty[i], MON_DATA_OT_ID); - fameMons->mons[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); - fameMons->mons[i].lvl = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nick); - for (j = 0; j < 10; j++) - { - fameMons->mons[i].nick[j] = nick[j]; - } - gTasks[taskID].tPokesNumber++; - } - else - { - fameMons->mons[i].species = 0; - fameMons->mons[i].tid = 0; - fameMons->mons[i].personality = 0; - fameMons->mons[i].lvl = 0; - fameMons->mons[i].nick[0] = EOS; - } - } - sUnknown_0203931C = 0; - gTasks[taskID].tDisplayedPoke = 0; - gTasks[taskID].data[4] = 0xFF; - for (i = 0; i < 6; i++) - { - gTasks[taskID].tMonSpriteID(i) = 0xFF; - } - if (gTasks[taskID].data[0]) - gTasks[taskID].func = sub_81422E8; - else - gTasks[taskID].func = sub_814217C; -} - -static void sub_814217C(u8 taskID) -{ - u16 i; - struct HallofFameMons* fameMons = eHallOfFameMons1; - struct HallofFameMons* lastSavedTeam = eHallOfFameMons2; - - if (gUnknown_02039324 == FALSE) - { - for (i = 0; i < 0x2000; i++) - ewram1E000(i) = 0; - } - else - Save_LoadGameData(SAVE_HALL_OF_FAME); - - for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++) - { - if (lastSavedTeam->mons[0].species == 0) - break; - } - if (i >= HALL_OF_FAME_MAX_TEAMS) - { - struct HallofFameMons* r5 = eHallOfFameMons2; - struct HallofFameMons* r6 = eHallOfFameMons2; - r5++; - for (i = 0; i < HALL_OF_FAME_MAX_TEAMS - 1; i++, r6++, r5++) - { - *r6 = *r5; - } - lastSavedTeam--; - } - *lastSavedTeam = *fameMons; - Menu_DrawStdWindowFrame(2, 14, 27, 19); - Menu_PrintText(gMenuText_HOFSaving, 3, 15); - gTasks[taskID].func = sub_8142274; -} - -static void sub_8142274(u8 taskID) -{ - gGameContinueCallback = sub_8141FC4; - Save_WriteData(3); - PlaySE(SE_SAVE); - gTasks[taskID].func = sub_81422B8; - gTasks[taskID].tFrameCount = 32; -} - -static void sub_81422B8(u8 taskID) -{ - if (gTasks[taskID].tFrameCount) - gTasks[taskID].tFrameCount--; - else - gTasks[taskID].func = sub_81422E8; -} - -static void sub_81422E8(u8 taskID) -{ - Text_LoadWindowTemplate(&gWindowTemplate_81E7198); - InitMenuWindow(&gWindowTemplate_81E7198); - gTasks[taskID].func = sub_8142320; -} - -static void sub_8142320(u8 taskID) -{ - u8 spriteID; - s16 xPos, yPos, field4, field6; - - struct HallofFameMons* fameMons = eHallOfFameMons1; - u16 currPokeID = gTasks[taskID].tDisplayedPoke; - struct HallofFameMon* currMon = &fameMons->mons[currPokeID]; - - if (gTasks[taskID].tPokesNumber > 3) - { - xPos = sHallOfFame_MonsFullTeamPositions[currPokeID][0]; - yPos = sHallOfFame_MonsFullTeamPositions[currPokeID][1]; - field4 = sHallOfFame_MonsFullTeamPositions[currPokeID][2]; - field6 = sHallOfFame_MonsFullTeamPositions[currPokeID][3]; - } - else - { - xPos = sHallOfFame_MonsHalfTeamPositions[currPokeID][0]; - yPos = sHallOfFame_MonsHalfTeamPositions[currPokeID][1]; - field4 = sHallOfFame_MonsHalfTeamPositions[currPokeID][2]; - field6 = sHallOfFame_MonsHalfTeamPositions[currPokeID][3]; - } - - spriteID = HallOfFame_LoadPokemonPic(currMon->species, xPos, yPos, currPokeID, currMon->tid, currMon->personality); - gSprites[spriteID].data[1] = field4; - gSprites[spriteID].data[2] = field6; - gSprites[spriteID].data[0] = 0; - gSprites[spriteID].callback = sub_81435DC; - gTasks[taskID].tMonSpriteID(currPokeID) = spriteID; - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskID].func = sub_8142404; -} - -static void sub_8142404(u8 taskID) -{ - struct HallofFameMons* fameMons = eHallOfFameMons1; - u16 currPokeID = gTasks[taskID].tDisplayedPoke; - struct HallofFameMon* currMon = &fameMons->mons[currPokeID]; - - if (gSprites[gTasks[taskID].tMonSpriteID(currPokeID)].data[0] != 0) - { - if (currMon->species != SPECIES_EGG) - PlayCry1(currMon->species, 0); - HallOfFame_PrintMonInfo(currMon, 0, 14); - gTasks[taskID].tFrameCount = 120; - gTasks[taskID].func = sub_8142484; - } -} - -static void sub_8142484(u8 taskID) -{ - struct HallofFameMons* fameMons = eHallOfFameMons1; - u16 currPokeID = gTasks[taskID].tDisplayedPoke; - struct HallofFameMon* currMon = &fameMons->mons[currPokeID]; - - if (gTasks[taskID].tFrameCount != 0) - gTasks[taskID].tFrameCount--; - else - { - sUnknown_0203931C |= (0x10000 << gSprites[gTasks[taskID].tMonSpriteID(currPokeID)].oam.paletteNum); - if (gTasks[taskID].tDisplayedPoke <= 4 && currMon[1].species != 0) // there is another pokemon to display - { - gTasks[taskID].tDisplayedPoke++; - BeginNormalPaletteFade(sUnknown_0203931C, 0, 12, 12, 0x735F); - gSprites[gTasks[taskID].tMonSpriteID(currPokeID)].oam.priority = 1; - gTasks[taskID].func = sub_8142320; - } - else - gTasks[taskID].func = sub_8142570; - } -} - -static void sub_8142570(u8 taskID) -{ - u16 i; - - BeginNormalPaletteFade(0xFFFF0000, 0, 0, 0, 0); - for (i = 0; i < 6; i++) - { - if (gTasks[taskID].tMonSpriteID(i) != 0xFF) - gSprites[gTasks[taskID].tMonSpriteID(i)].oam.priority = 0; - } - Menu_EraseWindowRect(0, 14, 29, 19); - sub_8143068(0, 15); - PlaySE(SE_DENDOU); - gTasks[taskID].tFrameCount = 400; - gTasks[taskID].func = sub_8142618; -} - -static void sub_8142618(u8 taskID) -{ - if (gTasks[taskID].tFrameCount != 0) - { - gTasks[taskID].tFrameCount--; - if ((gTasks[taskID].tFrameCount & 3) == 0 && gTasks[taskID].tFrameCount > 110) - sub_81438C4(); - } - else - { - u16 i; - for (i = 0; i < 6; i++) - { - if (gTasks[taskID].tMonSpriteID(i) != 0xFF) - gSprites[gTasks[taskID].tMonSpriteID(i)].oam.priority = 1; - } - BeginNormalPaletteFade(sUnknown_0203931C, 0, 12, 12, 0x735F); - Menu_EraseWindowRect(0, 14, 29, 19); - gTasks[taskID].tFrameCount = 7; - gTasks[taskID].func = sub_81426F8; - } -} - -static void sub_81426F8(u8 taskID) -{ - if (gTasks[taskID].tFrameCount >= 16) - gTasks[taskID].func = sub_8142738; - else - { - gTasks[taskID].tFrameCount++; - REG_BLDALPHA = gTasks[taskID].tFrameCount * 256; - } -} - -static void sub_8142738(u8 taskID) -{ - REG_DISPCNT = 0x1940; - Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); - InitMenuWindow(&gWindowTemplate_81E71B4); - - gTasks[taskID].tPlayerSpriteID = HallOfFame_LoadTrainerPic(gSaveBlock2.playerGender, 120, 72, 6); - gTasks[taskID].tFrameCount = 120; - gTasks[taskID].func = sub_8142794; -} - -static void sub_8142794(u8 taskID) -{ - if (gTasks[taskID].tFrameCount != 0) - gTasks[taskID].tFrameCount--; - else - { - if (gSprites[gTasks[taskID].tPlayerSpriteID].pos1.x != 160) - gSprites[gTasks[taskID].tPlayerSpriteID].pos1.x++; - else - { - Menu_DrawStdWindowFrame(1, 2, 15, 9); - HallOfFame_PrintPlayerInfo(1, 2); - Menu_DrawStdWindowFrame(2, 14, 27, 19); - Menu_PrintText(gMenuText_HOFCongratulations, 4, 15); - gTasks[taskID].func = sub_8142818; - } - } -} - -static void sub_8142818(u8 taskID) -{ - if (gMain.newKeys & A_BUTTON) - { - FadeOutBGM(4); - gTasks[taskID].func = sub_8142850; - } -} - -static void sub_8142850(u8 taskID) -{ - CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200); - BeginNormalPaletteFade(-1, 8, 0, 0x10, 0); - gTasks[taskID].func = sub_81428A0; -} - -static void sub_81428A0(u8 taskID) -{ - if (!gPaletteFade.active) - { - DestroyTask(taskID); - SetMainCallback2(sub_81439D0); - } -} - -#undef tDisplayedPoke -#undef tPokesNumber -#undef tFrameCount -#undef tPlayerSpriteID -#undef tMonSpriteID - -void sub_81428CC(void) -{ - switch (gMain.state) - { - case 0: - default: - SetVBlankCallback(NULL); - sub_81433E0(); - gMain.state = 1; - break; - case 1: - sub_8143570(); - gMain.state++; - break; - case 2: - { - u16 savedIme; - - SetVBlankCallback(VBlankCB_HallOfFame); - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= 1; - REG_IME = savedIme; - REG_DISPSTAT |= 8; - gMain.state++; - } - break; - case 3: - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - sub_81435B8(); - - eHOFPCScreenEffect = sPCScreenEffectTemplate; - - sub_80C5CD4(&eHOFPCScreenEffect); - gMain.state++; - break; - case 4: - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - if (sub_80C5DCC()) - gMain.state++; - break; - case 5: - REG_BLDCNT = 0x3F42; - REG_BLDALPHA = 0x710; - REG_BLDY = 0; - CreateTask(sub_8142A28, 0); - SetMainCallback2(CB2_HallOfFame); - break; - } -} - -#define tCurrTeamNo data[0] -#define tCurrPageNo data[1] -#define tCurrPokeID data[2] -#define tPokesNo data[4] -#define tMonSpriteID(i) data[i + 5] - -static void sub_8142A28(u8 taskID) -{ - if (Save_LoadGameData(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK) - gTasks[taskID].func = sub_8142FEC; - else - { - u16 *vram1, *vram2; - - u16 i; - struct HallofFameMons* savedTeams = eHallOfFameMons2; - for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, savedTeams++) - { - if (savedTeams->mons[0].species == 0) - break; - } - if (i < HALL_OF_FAME_MAX_TEAMS) - gTasks[taskID].tCurrTeamNo = i - 1; - else - gTasks[taskID].tCurrTeamNo = HALL_OF_FAME_MAX_TEAMS - 1; - gTasks[taskID].tCurrPageNo = GetGameStat(10); - - for (i = 0, vram1 = (u16*)(VRAM + 0x381A), vram2 = (u16*)(VRAM + 0x385A); i <= 16; i++) - { - *(vram1 + i) = i + 3; - *(vram2 + i) = i + 20; - } - Text_LoadWindowTemplate(&gWindowTemplate_81E7198); - InitMenuWindow(&gWindowTemplate_81E7198); - gTasks[taskID].func = sub_8142B04; - } -} - -static void sub_8142B04(u8 taskID) -{ - struct HallofFameMons* savedTeams = eHallOfFameMons2; - struct HallofFameMon* currMon; - u16 i; - u8* stringPtr; - - for (i = 0; i < gTasks[taskID].tCurrTeamNo; i++) - savedTeams++; - - currMon = &savedTeams->mons[0]; - sUnknown_0203931C = 0; - gTasks[taskID].tCurrPokeID = 0; - gTasks[taskID].tPokesNo = 0; - - for (i = 0; i < 6; i++, currMon++) - { - if (currMon->species != 0) - gTasks[taskID].tPokesNo++; - } - - currMon = &savedTeams->mons[0]; - - for (i = 0; i < 6; i++, currMon++) - { - if (currMon->species != 0) - { - u16 spriteID; - s16 posX, posY; - if (gTasks[taskID].tPokesNo > 3) - { - posX = sHallOfFame_MonsFullTeamPositions[i][2]; - posY = sHallOfFame_MonsFullTeamPositions[i][3]; - } - else - { - posX = sHallOfFame_MonsHalfTeamPositions[i][2]; - posY = sHallOfFame_MonsHalfTeamPositions[i][3]; - } - spriteID = HallOfFame_LoadPokemonPic(currMon->species, posX, posY, i, currMon->tid, currMon->personality); - gSprites[spriteID].oam.priority = 1; - gTasks[taskID].tMonSpriteID(i) = spriteID; - } - else - gTasks[taskID].tMonSpriteID(i) = 0xFF; - } - - BlendPalettes(0xFFFF0000, 0xC, 0x735F); - - stringPtr = gStringVar1; - stringPtr = StringCopy(stringPtr, gMenuText_HOFNumber); - stringPtr[0] = 0xFC; - stringPtr[1] = 0x14; - stringPtr[2] = 0x6; - stringPtr += 3; - stringPtr = ConvertIntToDecimalString(stringPtr, gTasks[taskID].tCurrPageNo); - stringPtr[0] = 0xFC; - stringPtr[1] = 0x13; - stringPtr[2] = 0xF0; - stringPtr[3] = EOS; - Menu_PrintText(gStringVar1, 0, 0); - - gTasks[taskID].func = sub_8142CC8; -} - -static void sub_8142CC8(u8 taskID) -{ - struct HallofFameMons* savedTeams = eHallOfFameMons2; - struct HallofFameMon* currMon; - u16 i; - u16 currMonID; - - for (i = 0; i < gTasks[taskID].tCurrTeamNo; i++) - savedTeams++; - - for (i = 0; i < 6; i++) - { - u16 spriteID = gTasks[taskID].tMonSpriteID(i); - if (spriteID != 0xFF) - gSprites[spriteID].oam.priority = 1; - } - - currMonID = gTasks[taskID].tMonSpriteID(gTasks[taskID].tCurrPokeID); - gSprites[currMonID].oam.priority = 0; - sUnknown_0203931C = (0x10000 << gSprites[currMonID].oam.paletteNum) ^ 0xFFFF0000; - BlendPalettesUnfaded(sUnknown_0203931C, 0xC, 0x735F); - - currMon = &savedTeams->mons[gTasks[taskID].tCurrPokeID]; - if (currMon->species != SPECIES_EGG) - { - StopCryAndClearCrySongs(); - PlayCry1(currMon->species, 0); - } - HallOfFame_PrintMonInfo(currMon, 0, 14); - - gTasks[taskID].func = sub_8142DF4; -} - -static void sub_8142DF4(u8 taskID) -{ - u16 i; - if (gMain.newKeys & A_BUTTON) - { - if (gTasks[taskID].tCurrTeamNo != 0) // prepare another team to view - { - gTasks[taskID].tCurrTeamNo--; - for (i = 0; i < 6; i++) - { - u8 spriteID = gTasks[taskID].tMonSpriteID(i); - if (spriteID != 0xFF) - { - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteID].oam.paletteNum)); - DestroySprite(&gSprites[spriteID]); - } - } - if (gTasks[taskID].tCurrPageNo != 0) - gTasks[taskID].tCurrPageNo--; - gTasks[taskID].func = sub_8142B04; - } - else // no more teams to view, turn off hall of fame PC - { - if (IsCryPlayingOrClearCrySongs()) - { - StopCryAndClearCrySongs(); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - } - gTasks[taskID].func = sub_8142F78; - } - } - else if (gMain.newKeys & B_BUTTON) // turn off hall of fame PC - { - if (IsCryPlayingOrClearCrySongs()) - { - StopCryAndClearCrySongs(); - m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - } - gTasks[taskID].func = sub_8142F78; - } - else if (gMain.newKeys & DPAD_UP && gTasks[taskID].tCurrPokeID != 0) // change poke -1 - { - gTasks[taskID].tCurrPokeID--; - gTasks[taskID].func = sub_8142CC8; - } - else if (gMain.newKeys & DPAD_DOWN && gTasks[taskID].tCurrPokeID < gTasks[taskID].tPokesNo - 1) // change poke +1 - { - gTasks[taskID].tCurrPokeID++; - gTasks[taskID].func = sub_8142CC8; - } -} - -static void sub_8142F78(u8 taskID) -{ - CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200); - eHOFPCScreenEffect = sPCScreenEffectTemplate; - sub_80C5E38(&eHOFPCScreenEffect); - gTasks[taskID].func = sub_8142FCC; -} - -static void sub_8142FCC(u8 taskID) -{ - if (sub_80C5F98()) - { - DestroyTask(taskID); - ReturnFromHallOfFamePC(); - } -} - -static void sub_8142FEC(u8 taskID) -{ - Menu_DrawStdWindowFrame(2, 14, 27, 19); - MenuPrintMessage(gMenuText_HOFCorrupt, 3, 15); - gTasks[taskID].func = sub_814302C; -} - -static void sub_814302C(u8 taskID) -{ - if (Menu_UpdateWindowText() && gMain.newKeys & A_BUTTON) - gTasks[taskID].func = sub_8142F78; -} - -#undef tCurrTeamNo -#undef tCurrPageNo -#undef tCurrPokeID -#undef tPokesNo -#undef tMonSpriteID - -static void sub_8143068(u8 a0, u8 a1) -{ - sub_8072BD8(gMenuText_WelcomeToHOFAndDexRating, 0, a1 + 1, 0xF0); -} - -static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 a1, u8 a2) -{ - u8* stringPtr; - u16 monData; - u16 i; - - stringPtr = gStringVar1; - stringPtr[0] = EXT_CTRL_CODE_BEGIN; - stringPtr[1] = 0x13; - stringPtr[2] = 0x28; - stringPtr[3] = EOS; - - if (currMon->species != SPECIES_EGG) - { - monData = SpeciesToPokedexNum(currMon->species); - if (monData != 0xFFFF) - { - stringPtr = StringCopy(stringPtr, gOtherText_Number2); - ConvertIntToDecimalStringN(stringPtr, monData, 2, 3); - } - } - - Menu_PrintText(gStringVar1, a1 + 4, a2 + 1); - stringPtr = gStringVar1; - - for (i = 0; i < 10 && currMon->nick[i] != EOS; stringPtr[i] = currMon->nick[i], i++) {} - stringPtr += i; - stringPtr[0] = EOS; - - if (currMon->species == SPECIES_EGG) - { - stringPtr[0] = EXT_CTRL_CODE_BEGIN; - stringPtr[1] = 0x13; - stringPtr[2] = 0xA0; - stringPtr[3] = EOS; - Menu_PrintText(gStringVar1, a1 + 9, a2 + 1); - Menu_EraseWindowRect(0, a2 + 3, 29, a2 + 4); - } - else - { - - stringPtr[0] = EXT_CTRL_CODE_BEGIN; - stringPtr[1] = 0x13; - stringPtr[2] = 0x3E; - stringPtr += 3; - - stringPtr[0] = CHAR_SLASH; - stringPtr++; - - for (i = 0; i < 10 && gSpeciesNames[currMon->species][i] != EOS; stringPtr[i] = gSpeciesNames[currMon->species][i], i++) {} - - stringPtr += i; - stringPtr[0] = CHAR_SPACE; - stringPtr++; - - if (currMon->species != SPECIES_NIDORAN_M && currMon->species != SPECIES_NIDORAN_F) - { - switch (GetGenderFromSpeciesAndPersonality(currMon->species, currMon->personality)) - { - case MON_MALE: - stringPtr[0] = CHAR_MALE; - stringPtr++; - break; - case MON_FEMALE: - stringPtr[0] = CHAR_FEMALE; - stringPtr++; - break; - } - } - - stringPtr[0] = EXT_CTRL_CODE_BEGIN; - stringPtr[1] = 0x13; - stringPtr[2] = 0xA0; - stringPtr[3] = EOS; - - Menu_PrintText(gStringVar1, a1 + 9, a2 + 1); - - monData = currMon->lvl; - - stringPtr = StringCopy(gStringVar1, gOtherText_Level3); - - stringPtr[0] = EXT_CTRL_CODE_BEGIN; - stringPtr[1] = 0x14; - stringPtr[2] = 6; - stringPtr += 3; - - stringPtr = ConvertIntToDecimalStringN(stringPtr, monData, 0, 3); - - stringPtr[0] = EXT_CTRL_CODE_BEGIN; - stringPtr[1] = 0x13; - stringPtr[2] = 0x30; - stringPtr[3] = EOS; - - Menu_PrintText(gStringVar1, a1 + 7, a2 + 3); - - monData = currMon->tid; - - stringPtr = StringCopy(gStringVar1, gOtherText_IDNumber); - ConvertIntToDecimalStringN(stringPtr, monData, 2, 5); - - Menu_PrintText(gStringVar1, a1 + 13, a2 + 3); - } -} - -#define ByteRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) - -static void HallOfFame_PrintPlayerInfo(u8 a0, u8 a1) -{ - u8* stringPtr; - u16 visibleTid; - - Menu_PrintText(gOtherText_Name, a0 + 1, a1 + 1); - MenuPrint_RightAligned(gSaveBlock2.playerName, a0 + 14, a1 + 1); - - Menu_PrintText(gOtherText_IDNumber2, a0 + 1, a1 + 3); - visibleTid = ByteRead16(gSaveBlock2.playerTrainerId); - ConvertIntToDecimalStringN(gStringVar1, visibleTid, 2, 5); - - MenuPrint_RightAligned(gStringVar1, a0 + 14, a1 + 3); - Menu_PrintText(gMainMenuString_Time, a0 + 1, a1 + 5); - - stringPtr = ConvertIntToDecimalString(gStringVar1, gSaveBlock2.playTimeHours); - stringPtr[0] = CHAR_SPACE; - stringPtr[1] = CHAR_COLON; - stringPtr[2] = CHAR_SPACE; - stringPtr += 3; - - stringPtr = ConvertIntToDecimalStringN(stringPtr, gSaveBlock2.playTimeMinutes, 2, 2); - stringPtr[0] = EOS; - - MenuPrint_RightAligned(gStringVar1, a0 + 14, a1 + 5); -} - -static void sub_81433E0(void) -{ - u16 i; - - REG_DISPCNT = 0; - - REG_BG0CNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - - REG_BG1CNT = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - - REG_BG2CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - - REG_BG3CNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - - DmaFill16Large(3, 0, VRAM, 0x18000, 0x1000); - DmaFill32Defvars(3, 0, OAM, OAM_SIZE); - DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE); - - LZ77UnCompVram(gHallOfFame_Gfx, (void*)(VRAM)); - - for (i = 0; i < 64; i++) - { - *((u16*)(VRAM + 0x3800) + i) = 1; - } - for (i = 0; i < 192; i++) - { - *((u16*)(VRAM + 0x3B80) + i) = 1; - } - for (i = 0; i < 1024; i++) - { - *((u16*)(VRAM + 0x3000) + i) = 2; - } - - DmaFill16Large(3, 0, ewram0_6, 0x4000, 0x1000); - ResetPaletteFade(); - LoadPalette(gHallOfFame_Pal, 0, 0x20); -} - -static void sub_8143570(void) -{ - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - LoadCompressedObjectPic(&sHallOfFame_ConfettiSpriteSheet); - LoadCompressedObjectPalette(&sHallOfFame_ConfettiSpritePalette); - Text_LoadWindowTemplate(&gWindowTemplate_81E71B4); - InitMenuWindow(&gWindowTemplate_81E71B4); -} - -static void sub_81435B8(void) -{ - REG_BG1CNT = 0x700; - REG_BG3CNT = 0x603; - REG_DISPCNT = 0x1B40; -} - -static void sub_81435DC(struct Sprite* sprite) -{ - u32 spritePos = *(u32*)(&sprite->pos1); - u32 dataPos = *(u32*)(&sprite->data[1]); - if (spritePos != dataPos) - { - if (sprite->pos1.x < sprite->data[1]) - sprite->pos1.x += 15; - if (sprite->pos1.x > sprite->data[1]) - sprite->pos1.x -= 15; - - if (sprite->pos1.y < sprite->data[2]) - sprite->pos1.y += 10; - if (sprite->pos1.y > sprite->data[2]) - sprite->pos1.y -= 10; - } - else - { - sprite->data[0] = 1; - sprite->callback = SpriteCB_HallOfFame_Dummy; - } -} - -static void SpriteCB_HallOfFame_Dummy(struct Sprite* sprite) -{ - -} - -void sub_8143648(u16 paletteTag, u8 animID) -{ - gUnknown_02024E8C = sUnknown_0840B6B8; - gUnknown_02024E8C.paletteTag = paletteTag; - gUnknown_02024E8C.images = sUnknown_0840B69C[animID]; - gUnknown_02024E8C.anims = gSpriteAnimTable_81E7C64; -} - -void sub_8143680(u16 paletteTag, u8 animID) -{ - gUnknown_02024E8C = sUnknown_0840B6B8; - gUnknown_02024E8C.paletteTag = paletteTag; - gUnknown_02024E8C.images = sUnknown_0840B69C[animID]; - gUnknown_02024E8C.anims = gUnknown_081EC2A4[0]; -} - -static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID, u32 tid, u32 pid) -{ - u8 spriteID; - const u8* pokePal; - - LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[pokeID], species, pid, 1); - - pokePal = GetMonSpritePalFromOtIdPersonality(species, tid, pid); - LoadCompressedPalette(pokePal, 16 * pokeID + 256, 0x20); - - sub_8143648(pokeID, pokeID); - spriteID = CreateSprite(&gUnknown_02024E8C, posX, posY, 10 - pokeID); - gSprites[spriteID].oam.paletteNum = pokeID; - return spriteID; -} - -static u32 HallOfFame_LoadTrainerPic(u16 trainerPicID, s16 posX, s16 posY, u16 a3) -{ - u8 spriteID; - - DecompressPicFromTable_2(&gTrainerFrontPicTable[trainerPicID], gTrainerFrontPicCoords[trainerPicID].coords, gTrainerFrontPicCoords[trainerPicID].y_offset, (void*) 0x2000000, gUnknown_0840B5A0[a3], trainerPicID); - - LoadCompressedPalette(gTrainerFrontPicPaletteTable[trainerPicID].data, 16 * a3 + 256, 0x20); - sub_8143680(a3, a3); - - spriteID = CreateSprite(&gUnknown_02024E8C, posX, posY, 1); - gSprites[spriteID].oam.paletteNum = a3; - - return spriteID; -} - -static void sub_814386C(struct Sprite* sprite) -{ - if (sprite->pos2.y > 120) - DestroySprite(sprite); - else - { - u16 rand; - u8 tableID; - - sprite->pos2.y++; - sprite->pos2.y += sprite->data[1]; - - tableID = sprite->data[0]; - rand = (Random() % 4) + 8; - sprite->pos2.x = rand * gSineTable[tableID] / 256; - - sprite->data[0] += 4; - } -} - -static bool8 sub_81438C4(void) -{ - u8 spriteID; - struct Sprite* sprite; - - s16 posX = Random() % 240; - s16 posY = -(Random() % 8); - - spriteID = CreateSprite(&sSpriteTemplate_840B7A4, posX, posY, 0); - sprite = &gSprites[spriteID]; - - StartSpriteAnim(sprite, Random() % 17); - - if (Random() & 3) - sprite->data[1] = 0; - else - sprite->data[1] = 1; - - return 0; -} diff --git a/src/scene/intro.c b/src/scene/intro.c deleted file mode 100644 index 5c0e7a67d..000000000 --- a/src/scene/intro.c +++ /dev/null @@ -1,2810 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "intro.h" -#include "data2.h" -#include "decompress.h" -#include "hall_of_fame.h" -#include "intro_credits_graphics.h" -#include "libgncmultiboot.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "new_game.h" -#include "palette.h" -#include "random.h" -#include "save.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "task.h" -#include "title_screen.h" -#include "trig.h" -#include "scanline_effect.h" -#include "ewram.h" - -extern struct SpriteTemplate gUnknown_02024E8C; -extern u16 gUnknown_02039358; -extern u16 gUnknown_0203935A; -extern u16 gSaveFileStatus; -extern u8 gReservedSpritePaletteCount; -extern const u8 gInterfaceGfx_PokeBall[]; -extern const u8 gInterfacePal_PokeBall[]; -extern const u8 gIntroCopyright_Gfx[]; -extern const u16 gIntroCopyright_Pal[]; -extern const u16 gIntroCopyright_Tilemap[]; -extern void *const gUnknown_0840B5A0[]; - -static EWRAM_DATA u16 gUnknown_02039318 = 0; -static EWRAM_DATA u16 gUnknown_0203931A = 0; - -u32 gIntroFrameCounter; -struct GcmbStruct gMultibootProgramStruct; - -//-------------------------------------------------- -// Graphics Data -//-------------------------------------------------- - -static const u16 Palette_406340[] = INCBIN_U16("graphics/intro/unknown1.gbapal"); -static const u16 Palette_406360[] = INCBIN_U16("graphics/intro/unknown2.gbapal"); -#if ENGLISH -static const u8 gIntroTiles[] = INCBIN_U8("graphics/intro/intro.4bpp.lz"); -#elif GERMAN -extern const u8 gIntroTiles[]; -#endif -static const u16 gIntro1BGPals[][16] = -{ - INCBIN_U16("graphics/intro/intro1_bgpal1.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal2.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal3.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal4.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal5.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal6.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal7.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal8.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal9.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal10.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal11.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal12.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal13.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal14.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal15.gbapal"), - INCBIN_U16("graphics/intro/intro1_bgpal16.gbapal"), -}; -static const u8 gIntro1BG0_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg0_map.bin.lz"); -static const u8 gIntro1BG1_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg1_map.bin.lz"); -static const u8 gIntro1BG2_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg2_map.bin.lz"); -static const u8 gIntro1BG3_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg3_map.bin.lz"); -static const u8 gIntro1BGLeavesGfx[] = INCBIN_U8("graphics/intro/introgfx.4bpp.lz"); -static const u16 gIntro3PokeballPal[] = INCBIN_U16("graphics/intro/intro3_pokeball.gbapal"); -static const u8 gIntro3Pokeball_Tilemap[] = INCBIN_U8("graphics/intro/intro3_pokeball_map.bin.lz"); -static const u8 gIntro3Pokeball_Gfx[] = INCBIN_U8("graphics/intro/intro3_pokeball.8bpp.lz"); -static const u16 gIntro3Streaks_Pal[] = INCBIN_U16("graphics/intro/intro3_streaks.gbapal"); -static const u8 gIntro3Streaks_Gfx[] = INCBIN_U8("graphics/intro/intro3_streaks.4bpp.lz"); -static const u8 gIntro3Streaks_Tilemap[] = INCBIN_U8("graphics/intro/intro3_streaks_map.bin.lz"); -static const u16 gIntro3Misc1Palette[] = INCBIN_U16("graphics/intro/intro3_misc1.gbapal"); -static const u16 gIntro3Misc2Palette[] = INCBIN_U16("graphics/intro/intro3_misc2.gbapal"); -static const u8 gIntro3MiscTiles[] = INCBIN_U8("graphics/intro/intro3_misc.4bpp.lz"); -static const u16 gIntro1EonPalette[] = INCBIN_U16("graphics/intro/intro1_eon.gbapal"); -static const u8 gIntro1EonTiles[] = INCBIN_U8("graphics/intro/intro1_eon.4bpp.lz"); -static const struct OamData gOamData_840ADE8 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840ADF0[] = -{ - ANIMCMD_FRAME(16, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840ADF8[] = -{ - ANIMCMD_FRAME(24, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AE00[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AE08[] = -{ - ANIMCMD_FRAME(48, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840AE10[] = -{ - gSpriteAnim_840ADF0, - gSpriteAnim_840ADF8, - gSpriteAnim_840AE00, - gSpriteAnim_840AE08, -}; -static void sub_813D208(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840AE20 = -{ - .tileTag = 2000, - .paletteTag = 2000, - .oam = &gOamData_840ADE8, - .anims = gSpriteAnimTable_840AE10, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813D208, -}; -static const union AnimCmd Unknown_40AE38[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(64, 4), - ANIMCMD_FRAME(128, 4), - ANIMCMD_FRAME(192, 4), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd Unknown_40AE4C[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(64, 8), - ANIMCMD_FRAME(128, 8), - ANIMCMD_FRAME(192, 8), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd Unknown_40AE60[] = -{ - ANIMCMD_FRAME(256, 4), - ANIMCMD_FRAME(0x140, 4), - ANIMCMD_FRAME(0x180, 4), - ANIMCMD_END, -}; -static const union AnimCmd Unknown_40AE70[] = -{ - ANIMCMD_FRAME(0x180, 16), - ANIMCMD_FRAME(0x140, 16), - ANIMCMD_FRAME(256, 16), - ANIMCMD_END, -}; -static const union AnimCmd *const gUnknown_0840AE80[] = -{ - Unknown_40AE38, - Unknown_40AE4C, - Unknown_40AE60, - Unknown_40AE70, -}; -static const struct OamData gOamData_840AE90 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_840AE98 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData gOamData_840AEA0 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 2, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840AEA8[] = -{ - ANIMCMD_FRAME(80, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEB0[] = -{ - ANIMCMD_FRAME(84, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEB8[] = -{ - ANIMCMD_FRAME(88, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEC0[] = -{ - ANIMCMD_FRAME(92, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEC8[] = -{ - ANIMCMD_FRAME(96, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AED0[] = -{ - ANIMCMD_FRAME(100, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AED8[] = -{ - ANIMCMD_FRAME(104, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEE0[] = -{ - ANIMCMD_FRAME(112, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEE8[] = -{ - ANIMCMD_FRAME(113, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEF0[] = -{ - ANIMCMD_FRAME(114, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AEF8[] = -{ - ANIMCMD_FRAME(115, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AF00[] = -{ - ANIMCMD_FRAME(116, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AF08[] = -{ - ANIMCMD_FRAME(117, 8), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_840AF10[] = -{ - ANIMCMD_FRAME(128, 8), - ANIMCMD_END, -}; -#if GERMAN -static const union AnimCmd gSpriteAnim_8416DA4[] = -{ - ANIMCMD_FRAME(118, 8), - ANIMCMD_END, -}; -#endif -static const union AnimCmd *const gSpriteAnimTable_840AF18[] = -{ - gSpriteAnim_840AEA8, - gSpriteAnim_840AEB0, - gSpriteAnim_840AEB8, - gSpriteAnim_840AEC0, - gSpriteAnim_840AEC8, - gSpriteAnim_840AED0, - gSpriteAnim_840AED8, -}; -static const union AnimCmd *const gSpriteAnimTable_840AF34[] = -{ - gSpriteAnim_840AEE0, - gSpriteAnim_840AEE8, - gSpriteAnim_840AEF0, - gSpriteAnim_840AEF8, - gSpriteAnim_840AF00, - gSpriteAnim_840AF08, -#if GERMAN - gSpriteAnim_8416DA4, -#endif -}; -static const union AnimCmd *const gSpriteAnimTable_840AF4C[] = -{ - gSpriteAnim_840AF10, -}; -static const s16 gUnknown_0840AF50[][2] = -{ - {0, -72}, - {1, -56}, - {2, -40}, - {3, -24}, - {4, 8}, - {5, 24}, - {3, 40}, - {1, 56}, - {6, 72}, -}; -static const s16 gUnknown_0840AF74[][2] = -{ - {0, -28}, - {1, -20}, - {2, -12}, - {3, -4}, - {2, 4}, - {4, 12}, - {5, 20}, - {3, 28}, -}; -static void sub_813D908(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840AF94 = -{ - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gOamData_840AE90, - .anims = gSpriteAnimTable_840AF18, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813D908, -}; -static const struct SpriteTemplate gSpriteTemplate_840AFAC = -{ - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gOamData_840AE98, - .anims = gSpriteAnimTable_840AF34, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813D908, -}; -static const struct SpriteTemplate gSpriteTemplate_840AFC4 = -{ - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gOamData_840AEA0, - .anims = gSpriteAnimTable_840AF4C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813D908, -}; -static const struct OamData gOamData_840AFDC = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840AFE4[] = -{ - ANIMCMD_FRAME(0, 10), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd *const gSpriteAnimTable_840AFEC[] = -{ - gSpriteAnim_840AFE4, -}; -static void sub_813DA64(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840AFF0 = -{ - .tileTag = 2002, - .paletteTag = 2002, - .oam = &gOamData_840AFDC, - .anims = gSpriteAnimTable_840AFEC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813DA64, -}; -const struct CompressedSpriteSheet gUnknown_0840B008[] = -{ - {gIntroTiles, 0x1400, 2000}, - {NULL}, -}; -const struct CompressedSpriteSheet gUnknown_0840B018[] = -{ - {gIntro1EonTiles, 0x400, 2002}, - {NULL}, -}; -const struct SpritePalette gUnknown_0840B028[] = -{ - {Palette_406340, 2000}, - {Palette_406360, 2001}, - {gIntro1EonPalette, 2002}, - {NULL}, -}; -static const union AnimCmd gUnknown_0840B048[] = -{ - ANIMCMD_FRAME(3, 0), - ANIMCMD_END, -}; -static const union AnimCmd gUnknown_0840B050[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -static const union AnimCmd gUnknown_0840B058[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_FRAME(2, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gUnknown_0840B064[] = -{ - gUnknown_0840B048, - gUnknown_0840B050, - gUnknown_0840B058, -}; -static const struct OamData gOamData_840B070 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B078[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B080[] = -{ - gSpriteAnim_840B078, -}; -static void sub_813E30C(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B084 = -{ - .tileTag = 2002, - .paletteTag = 2002, - .oam = &gOamData_840B070, - .anims = gSpriteAnimTable_840B080, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E30C, -}; -static const struct OamData gOamData_840B09C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B0A4[] = -{ - ANIMCMD_FRAME(1, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B0AC[] = -{ - gSpriteAnim_840B0A4, -}; -static void sub_813E4B8(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B0B0 = -{ - .tileTag = 2003, - .paletteTag = 2003, - .oam = &gOamData_840B09C, - .anims = gSpriteAnimTable_840B0AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E4B8, -}; -static const struct OamData gOamData_840B0C8 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B0D0[] = -{ - ANIMCMD_FRAME(14, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B0D8[] = -{ - gSpriteAnim_840B0D0, -}; -static void sub_813E5E0(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B0DC = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B0C8, - .anims = gSpriteAnimTable_840B0D8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E5E0, -}; -static void sub_813E6C0(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B0F4 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B0C8, - .anims = gSpriteAnimTable_840B0D8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E6C0, -}; -static const struct OamData gOamData_840B10C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B114[] = -{ - ANIMCMD_FRAME(6, 8), - ANIMCMD_FRAME(6, 8, .hFlip = TRUE), - ANIMCMD_JUMP(0), -}; -static const union AnimCmd *const gSpriteAnimTable_840B120[] = -{ - gSpriteAnim_840B114, -}; -static void sub_813E804(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B124 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B10C, - .anims = gSpriteAnimTable_840B120, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E804, -}; -static const struct OamData gOamData_840B13C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B144[] = -{ - ANIMCMD_FRAME(10, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B14C[] = -{ - gSpriteAnim_840B144, -}; -static void sub_813E980(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B150 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B13C, - .anims = gSpriteAnimTable_840B14C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813E980, -}; -static const u8 gUnknown_0840B168[] = {0xE6, 0xEB, 0xE4, 0xEA, 0xE5, 0xE9, 0xE7, 0xE8}; -static void sub_813EA60(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B170 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B13C, - .anims = gSpriteAnimTable_840B14C, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813EA60, -}; -static const u16 gUnknown_0840B188[] = {0x200, 0x1C0, 0x180, 0x140, 0x100, 0xE0, 0xC0, 0xA0, 0x80, 0x80}; -static const struct OamData gOamData_840B19C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B1A4[] = -{ - ANIMCMD_FRAME(2, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B1AC[] = -{ - gSpriteAnim_840B1A4, -}; -static void sub_813EBBC(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B1B0 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B19C, - .anims = gSpriteAnimTable_840B1AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813EBBC, -}; -static void sub_813EC90(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B1C8 = -{ - .tileTag = 2003, - .paletteTag = 2004, - .oam = &gOamData_840B19C, - .anims = gSpriteAnimTable_840B1AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813EC90, -}; -static const struct OamData gOamData_840B1E0 = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_840B1E8[] = -{ - ANIMCMD_FRAME(16, 8), - ANIMCMD_END, -}; -static const union AnimCmd *const gSpriteAnimTable_840B1F0[] = -{ - gSpriteAnim_840B1E8, -}; -static void sub_813EDFC(struct Sprite *sprite); -static const struct SpriteTemplate gSpriteTemplate_840B1F4 = -{ - .tileTag = 2003, - .paletteTag = 2003, - .oam = &gOamData_840B1E0, - .anims = gSpriteAnimTable_840B1F0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_813EDFC, -}; -const struct CompressedSpriteSheet gIntro3PokeballGfx_Table[] = -{ - {gInterfaceGfx_PokeBall, 0x100, 2002}, - {NULL}, -}; -const struct CompressedSpriteSheet gIntro3MiscGfx_Table[] = -{ - {gIntro3MiscTiles, 0xa00, 2003}, - {NULL}, -}; -const struct CompressedSpritePalette gInterfacePokeballPal_Table[] = -{ - {gInterfacePal_PokeBall, 2002}, - {NULL}, -}; -const struct SpritePalette gIntro3MiscPal_Table[] = -{ - {gIntro3Misc1Palette, 2003}, - {gIntro3Misc2Palette, 2004}, - {NULL}, -}; - -// Game Freak probably used the raw address here. -// Treating this like a u8 * causes the compiler -// to remove it at link time. -const u32 unusedSharedMemPtr = (u32)gSharedMem; - -static void MainCB2_EndIntro(void); -void Task_IntroLoadPart1Graphics(u8); -static void Task_IntroFadeIn(u8); -static void Task_IntroWaterDrops(u8); -static void Task_IntroScrollDownAndShowEon(u8); -static void Task_IntroWaitToSetupPart2(u8); -static void Task_IntroLoadPart2Graphics(u8); -static void Task_IntroStartBikeRide(u8); -static void Task_IntroHandleBikeAndEonMovement(u8); -static void Task_IntroWaitToSetupPart3(u8); -static void Task_IntroLoadPart3Graphics(u8); -static void Task_IntroSpinAndZoomPokeball(u8); -static void Task_IntroWaitToSetupPart3DoubleFight(u8); -static void Task_IntroLoadPart3Streaks(u8); -static void task_intro_14(u8); -static void task_intro_15(u8); -static void task_intro_16(u8); -static void task_intro_17(u8); -static void Task_IntroPokemonBattle(u8); -static void task_intro_19(u8); -static void task_intro_20(u8); -static void intro_reset_and_hide_bgs(void); -static void sub_813CCE8(u8); -static u16 sub_813CE88(u16, s16, s16, u16, u8); -static u8 sub_813CFA8(u16, u16, u16, u16); -static void sub_813D084(u8); -static void sub_813D220(struct Sprite *); -static void sub_813D368(struct Sprite *); -static void sub_813D414(struct Sprite *); -static void SpriteCB_WaterDropFall(struct Sprite *); -static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8); -static void sub_813D788(struct Sprite *); -static void sub_813D880(struct Sprite *); -static u8 CreateGameFreakLogo(s16, s16, u8); -static void sub_813DB9C(struct Sprite *); -static void sub_813DE70(struct Sprite *); -static void sub_813E10C(struct Sprite *); -static void sub_813E210(struct Sprite *); -static void sub_813E580(u16, u16); -static void sub_813E7C0(u8); -static void sub_813E930(u8); -static void InitIntroTorchicAttackAnim(u8); -static void InitIntroMudkipAttackAnim(u8); - -static void VBlankCB_Intro(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void MainCB2_Intro(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); - if (gMain.newKeys && !gPaletteFade.active) - SetMainCallback2(MainCB2_EndIntro); - else if (gIntroFrameCounter != -1) - gIntroFrameCounter++; -} - -static void MainCB2_EndIntro(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitTitleScreen); -} - -static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteAddress) -{ - LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); - LoadPalette(gIntroCopyright_Pal, paletteAddress, 0x20); - CpuCopy16(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress), 0x500); -} - -static void SerialCB_CopyrightScreen(void) -{ - GameCubeMultiBoot_HandleSerialInterrupt(&gMultibootProgramStruct); -} - -static u8 SetUpCopyrightScreen(void) -{ - u16 ime; - - switch (gMain.state) - { - case 0: - SetVBlankCallback(NULL); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - *(u16 *)PLTT = 0x7FFF; - REG_DISPCNT = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); - DmaFill32(3, 0, (void *)OAM, OAM_SIZE); - DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); - ResetPaletteFade(); - LoadCopyrightGraphics(0, 0x3800, 0); - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); - REG_BG0CNT = BGCNT_PRIORITY(0) - | BGCNT_CHARBASE(0) - | BGCNT_SCREENBASE(7) - | BGCNT_16COLOR - | BGCNT_TXT256x256; - ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - SetVBlankCallback(VBlankCB_Intro); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; - SetSerialCallback(SerialCB_CopyrightScreen); - GameCubeMultiBoot_Init(&gMultibootProgramStruct); - default: - UpdatePaletteFade(); - gMain.state++; - GameCubeMultiBoot_Main(&gMultibootProgramStruct); - break; - case 140: - GameCubeMultiBoot_Main(&gMultibootProgramStruct); - if (gMultibootProgramStruct.gcmb_field_2 != 1) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - gMain.state++; - } - break; - case 141: - if (UpdatePaletteFade()) - break; - CreateTask(Task_IntroLoadPart1Graphics, 0); - SetMainCallback2(MainCB2_Intro); - if (gMultibootProgramStruct.gcmb_field_2) - { - GameCubeMultiBoot_ExecuteProgram(&gMultibootProgramStruct); - } - else - { - GameCubeMultiBoot_Quit(); - SetSerialCallback(SerialCB); - } - return 0; - } - - return 1; -} - -void CB2_InitCopyrightScreenAfterBootup(void) -{ - if (!SetUpCopyrightScreen()) - { - sub_8052E4C(); - Save_ResetSaveCounters(); - Save_LoadGameData(SAVE_NORMAL); - if (gSaveFileStatus == 0 || gSaveFileStatus == 2) - ClearSav2(); - SetPokemonCryStereo(gSaveBlock2.optionsSound); - } -} - -void CB2_InitCopyrightScreenAfterTitleScreen(void) -{ - SetUpCopyrightScreen(); -} - -void Task_IntroLoadPart1Graphics(u8 taskId) -{ - SetVBlankCallback(NULL); - gUnknown_02039318 = Random() & 1; - intro_reset_and_hide_bgs(); - REG_BG3VOFS = 0; - REG_BG2VOFS = 0x50; - REG_BG1VOFS = 0x18; - REG_BG0VOFS = 0x28; - LZ77UnCompVram(gIntro1BGLeavesGfx, (void *)VRAM); - LZ77UnCompVram(gIntro1BG0_Tilemap, (void *)(VRAM + 0x8000)); - DmaClear16(3, VRAM + 0x8800, 0x800); - LZ77UnCompVram(gIntro1BG1_Tilemap, (void *)(VRAM + 0x9000)); - DmaClear16(3, VRAM + 0x9800, 0x800); - LZ77UnCompVram(gIntro1BG2_Tilemap, (void *)(VRAM + 0xA000)); - DmaClear16(3, VRAM + 0xA800, 0x800); - LZ77UnCompVram(gIntro1BG3_Tilemap, (void *)(VRAM + 0xB000)); - DmaClear16(3, VRAM + 0xB800, 0x800); - LoadPalette(gIntro1BGPals, 0, sizeof(gIntro1BGPals)); - REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512; - REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512; - REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512; - REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512; - LoadCompressedObjectPic(&gUnknown_0840B008[0]); - LoadCompressedObjectPic(&gUnknown_0840B018[0]); - LoadSpritePalettes(gUnknown_0840B028); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1D2, 0x1C); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1C3, 0x1A); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1B4, 0x18); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1A5, 0x16); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x196, 0x14); - gTasks[taskId].data[0] = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE); - gTasks[taskId].func = Task_IntroFadeIn; -} - -static void Task_IntroFadeIn(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - SetVBlankCallback(VBlankCB_Intro); - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; - gTasks[taskId].func = Task_IntroWaterDrops; - gIntroFrameCounter = 0; - m4aSongNumStart(0x19E); - ResetSerial(); -} - -static void Task_IntroWaterDrops(u8 taskId) -{ - //start moving rock - if (gIntroFrameCounter == 76) - gSprites[gTasks[taskId].data[0]].data[0] = 1; - - //drop rock - if (gIntroFrameCounter == 251) - gSprites[gTasks[taskId].data[0]].data[0] = 2; - - if (gIntroFrameCounter == 368) - CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE); - if (gIntroFrameCounter == 384) - CreateWaterDrop(200, 60, 0x400, 9, 0x80, TRUE); - - if (gIntroFrameCounter == 560) - CreateGameFreakLogo(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, CreateTask(sub_813CCE8, 0)); - - if (gIntroFrameCounter > 739) - { - gTasks[taskId].data[1] = 0x50; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0x18; - gTasks[taskId].data[4] = 0; - gTasks[taskId].data[5] = 0x28; - gTasks[taskId].data[6] = 0; - gTasks[taskId].func = Task_IntroScrollDownAndShowEon; - } -} - -static void Task_IntroScrollDownAndShowEon(u8 taskId) -{ - if (gIntroFrameCounter < 904) - { - s32 r2; - - //slide backgrounds downward - r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2] - 0xC000; - gTasks[taskId].data[1] = r2 >> 16; - gTasks[taskId].data[2] = r2; - REG_BG2VOFS = gTasks[taskId].data[1]; - r2 = (gTasks[taskId].data[3] << 16) + (u16)gTasks[taskId].data[4] - 0x10000; - gTasks[taskId].data[3] = r2 >> 16; - gTasks[taskId].data[4] = r2; - REG_BG1VOFS = gTasks[taskId].data[3]; - r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - 0x18000; - gTasks[taskId].data[5] = r2 >> 16; - gTasks[taskId].data[6] = r2; - REG_BG0VOFS = gTasks[taskId].data[5]; - - //show Lati@s sprite - if (gIntroFrameCounter == 880) - { - u8 spriteId = CreateSprite(&gSpriteTemplate_840AFF0, 200, 160, 10); - - gSprites[spriteId].invisible = 1; - } - } - else - { - //fade to white - if (gIntroFrameCounter > 1007) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0xFFFF); - gTasks[taskId].func = Task_IntroWaitToSetupPart2; - } - } -} - -static void Task_IntroWaitToSetupPart2(u8 taskId) -{ - if (gIntroFrameCounter > 1026) - gTasks[taskId].func = Task_IntroLoadPart2Graphics; -} - -static void Task_IntroLoadPart2Graphics(u8 taskId) -{ - intro_reset_and_hide_bgs(); - SetVBlankCallback(NULL); - ResetSpriteData(); - FreeAllSpritePalettes(); - gUnknown_02039358 = 0; - gUnknown_0203935A = 0; -#ifdef SAPPHIRE - load_intro_part2_graphics(0); -#else - load_intro_part2_graphics(1); -#endif - gTasks[taskId].func = Task_IntroStartBikeRide; -} - -static void Task_IntroStartBikeRide(u8 taskId) -{ - u8 spriteId; - - if (gUnknown_02039318 == 0) - LoadCompressedObjectPic(gIntro2BrendanSpriteSheet); - else - LoadCompressedObjectPic(gIntro2MaySpriteSheet); - LoadCompressedObjectPic(gIntro2BicycleSpriteSheet); -#ifdef SAPPHIRE - LoadCompressedObjectPic(gIntro2LatiasSpriteSheet); -#else - LoadCompressedObjectPic(gIntro2LatiosSpriteSheet); -#endif - LoadSpritePalettes(gIntro2SpritePalettes); - if (gUnknown_02039318 == 0) - spriteId = intro_create_brendan_sprite(0x110, 100); - else - spriteId = intro_create_may_sprite(0x110, 100); - gSprites[spriteId].callback = sub_813D788; - gSprites[spriteId].anims = gUnknown_0840AE80; - gTasks[taskId].data[1] = spriteId; -#ifdef SAPPHIRE - spriteId = intro_create_latias_sprite(-0x40, 0x3C); -#else - spriteId = intro_create_latios_sprite(-0x40, 0x3C); -#endif - gSprites[spriteId].callback = sub_813D880; - gTasks[taskId].data[2] = spriteId; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0xFFFF); - SetVBlankCallback(VBlankCB_Intro); -#ifdef SAPPHIRE - gTasks[taskId].data[0] = sub_8148EC0(0, 0x4000, 0x40, 0x10); - sub_8148C78(0); -#else - gTasks[taskId].data[0] = sub_8148EC0(1, 0x4000, 0x400, 0x10); - sub_8148C78(1); -#endif - gTasks[taskId].func = Task_IntroHandleBikeAndEonMovement; -} - -static void Task_IntroHandleBikeAndEonMovement(u8 taskId) -{ - s16 a; - u16 sine; - - if (gIntroFrameCounter > 1823) - { - BeginNormalPaletteFade(0xFFFFFFFF, 16, 0, 16, 0xFFFF); - gTasks[taskId].func = Task_IntroWaitToSetupPart3; - } - if (gIntroFrameCounter == 1109) - gSprites[gTasks[taskId].data[1]].data[0] = 1; - if (gIntroFrameCounter == 1214) - gSprites[gTasks[taskId].data[1]].data[0] = 0; - if (gIntroFrameCounter == 1394) - gSprites[gTasks[taskId].data[2]].data[0] = 1; - if (gIntroFrameCounter == 1398) - gSprites[gTasks[taskId].data[1]].data[0] = 2; - if (gIntroFrameCounter == 1586) - gSprites[gTasks[taskId].data[1]].data[0] = 3; - if (gIntroFrameCounter == 1727) - gSprites[gTasks[taskId].data[1]].data[0] = 4; - - //TODO: Clean this up - a = (((u16)gTasks[taskId].data[3] << 16) >> 18) & 0x7F; - sine = Sin(a, 48); - gUnknown_0203935A = sine; - if (gTasks[taskId].data[3] < 512) - gTasks[taskId].data[3]++; -#ifdef SAPPHIRE - sub_8149020(0); -#else - sub_8149020(1); -#endif -} - -static void Task_IntroWaitToSetupPart3(u8 taskId) -{ - if (gIntroFrameCounter > 2068) - { - DestroyTask(gTasks[taskId].data[0]); - gTasks[taskId].func = Task_IntroLoadPart3Graphics; - } -} - -static void Task_IntroLoadPart3Graphics(u8 taskId) -{ - intro_reset_and_hide_bgs(); - LZ77UnCompVram(gIntro3Pokeball_Gfx, (void *)VRAM); - LZ77UnCompVram(gIntro3Pokeball_Tilemap, (void *)(VRAM + 0x4000)); - LoadPalette(gIntro3PokeballPal, 0, 0x200); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - sub_813CE30(0x78, 0x50, 0, 0); - ResetSpriteData(); - FreeAllSpritePalettes(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); - REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_256COLOR | BGCNT_AFF256x256; - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - gTasks[taskId].func = Task_IntroSpinAndZoomPokeball; - gIntroFrameCounter = 0; - m4aSongNumStart(0x1BA); -} - -static void Task_IntroSpinAndZoomPokeball(u8 taskId) -{ - gTasks[taskId].data[0] += 0x400; - if (gTasks[taskId].data[1] <= 0x6BF) - { - gTasks[taskId].data[1] += gTasks[taskId].data[2]; - gTasks[taskId].data[2]++; - } - else - { - gTasks[taskId].func = Task_IntroWaitToSetupPart3DoubleFight; - } - sub_813CE30(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]); - if (gIntroFrameCounter == 44) - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); -} - -static void Task_IntroWaitToSetupPart3DoubleFight(u8 taskId) -{ - if (gIntroFrameCounter > 59) - gTasks[taskId].func = Task_IntroLoadPart3Streaks; -} - -//extern u8 gSharedMem[][32]; - -static void Task_IntroLoadPart3Streaks(u8 taskId) -{ - u16 i; - - intro_reset_and_hide_bgs(); - for (i = 0; i < 32; i++) - { - ewram0arr[0][i] = 0; - ewram0arr[1][i] = 17; - ewram0arr[2][i] = 34; - } - DmaCopy16Defvars(3, gSharedMem, (void *)(VRAM + 0x0), 0x60); - for (i = 0; i < 0x280; i++) - ((u16 *)(VRAM + 0x3000))[i] = 0xF001; - for (i = 0; i < 0x80; i++) - ((u16 *)(VRAM + 0x3800))[i] = 0xF002; - for (i = 0; i < 0x180; i++) - ((u16 *)(VRAM + 0x3900))[i] = 0xF000; - for (i = 0; i < 0x80; i++) - ((u16 *)(VRAM + 0x3C00))[i] = 0xF002; - gPlttBufferUnfaded[0xF0] = RGB_WHITE; - gPlttBufferFaded[0xF0] = RGB_WHITE; - sub_813D084(1); - gPlttBufferUnfaded[0xF2] = RGB_BLACK; - gPlttBufferFaded[0xF2] = RGB_BLACK; - LZ77UnCompVram(gIntro3Streaks_Gfx, (void *)(VRAM + 0x4000)); - LZ77UnCompVram(gIntro3Streaks_Tilemap, (void *)(VRAM + 0x7000)); - LoadPalette(gIntro3Streaks_Pal, 0, 0x20); - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 8; - LoadCompressedObjectPic(&gIntro3PokeballGfx_Table[0]); - LoadCompressedObjectPic(&gIntro3MiscGfx_Table[0]); - LoadCompressedObjectPalette(&gInterfacePokeballPal_Table[0]); - LoadSpritePalettes(gIntro3MiscPal_Table); - gTasks[taskId].func = task_intro_14; -} - -static void task_intro_14(u8 taskId) -{ - REG_WIN0H = 0xF0; - REG_WIN0V = 0xA0; - REG_WININ = 0x1C; - REG_WINOUT = 0x1D; - REG_BG3CNT = BGCNT_PRIORITY(3) - | BGCNT_CHARBASE(0) - | BGCNT_SCREENBASE(6) - | BGCNT_16COLOR - | BGCNT_TXT256x256; - REG_BG0CNT = BGCNT_PRIORITY(0) - | BGCNT_CHARBASE(0) - | BGCNT_SCREENBASE(7) - | BGCNT_16COLOR - | BGCNT_TXT256x256; - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; - gTasks[taskId].data[15] = CreateTask(task_intro_20, 0); - gTasks[gTasks[taskId].data[15]].data[0] = 0; - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = task_intro_15; -} - -static void task_intro_15(u8 taskId) -{ - u16 foo = gTasks[taskId].data[0]; - - if (gTasks[taskId].data[0] != 32) - { - u32 bar; //needed to match for some reason - - gTasks[taskId].data[0] += 4; - REG_WIN0V = (gTasks[taskId].data[0] * 256) - (bar = foo - 0x9C); - } - else - { - REG_WIN0V = 0x2080; - gTasks[taskId].func = task_intro_16; - } -} - -static void task_intro_16(u8 taskId) -{ - gTasks[taskId].func = task_intro_17; -} - -static void task_intro_17(u8 taskId) -{ - gUnknown_0203931A = 0; - gTasks[taskId].func = Task_IntroPokemonBattle; -} - -static void Task_IntroPokemonBattle(u8 taskId) -{ - u8 spriteId; - - if (gIntroFrameCounter == 80) - { - spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xF0, 0xA0, 5, 1); - gSprites[spriteId].callback = sub_813DB9C; - gSprites[spriteId].data[1] = 1; - gSprites[spriteId].data[2] = 0; - } - if (gIntroFrameCounter == 152) - { - spriteId = sub_813CE88(SPECIES_DUSKULL, 0, 0xA0, 4, 1); - gSprites[spriteId].callback = sub_813DB9C; - gSprites[spriteId].data[1] = 2; - gSprites[spriteId].data[2] = 1; - } - if (gIntroFrameCounter == 219) - { - sub_813D084(0); - spriteId = sub_813CFA8(gUnknown_02039318, 0x110, 0x60, 6); - gSprites[spriteId].callback = sub_813DE70; - gTasks[taskId].data[1] = spriteId; - } - if (gIntroFrameCounter == 304) - { - gTasks[gTasks[taskId].data[15]].data[0] = 4; - gSprites[gTasks[taskId].data[1]].data[0] = 2; - } - if (gIntroFrameCounter == 384) - { - gTasks[gTasks[taskId].data[15]].data[0] = 0; - gSprites[gTasks[taskId].data[1]].data[0] = 4; - } - if (gIntroFrameCounter == 400) - { - BeginNormalPaletteFade(0xFF0000, 0, 0x10, 0, 0x7EFF); - } - if (gIntroFrameCounter == 432) - { - gSprites[gTasks[taskId].data[1]].data[0] = 5; - } - if (gIntroFrameCounter == 462) - { - gSprites[gTasks[taskId].data[1]].data[0] = 6; - gTasks[gTasks[taskId].data[15]].data[0] = 2; - } - if (gIntroFrameCounter == 463) - { - sub_813D084(1); - spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xD0, 8, 5, 1); - gSprites[spriteId].callback = sub_813E10C; - gTasks[taskId].data[2] = spriteId; - sub_813E7C0(spriteId); - } - if (gIntroFrameCounter == 539) - { - spriteId = sub_813CE88(SPECIES_DUSKULL, 0xF8, 0x10, 4, 1); - gSprites[spriteId].callback = sub_813E10C; - gTasks[taskId].data[3] = spriteId; - sub_813E930(spriteId); - } - if (gIntroFrameCounter == 623) - { - gSprites[gTasks[taskId].data[2]].data[0] = 2; - gSprites[gTasks[taskId].data[3]].data[0] = 2; - gTasks[gTasks[taskId].data[15]].data[0] = 3; - } - if (gIntroFrameCounter == 624) - { - sub_813D084(0); - spriteId = sub_813CE88(SPECIES_MUDKIP, 0x20, 0x98, 0, 0); - gSprites[spriteId].callback = sub_813E210; - gTasks[taskId].data[4] = spriteId; - InitIntroMudkipAttackAnim(spriteId); - } - if (gIntroFrameCounter == 700) - { - spriteId = sub_813CE88(SPECIES_TORCHIC, -8, 0x90, 1, 0); - gSprites[spriteId].callback = sub_813E210; - gTasks[taskId].data[5] = spriteId; - InitIntroTorchicAttackAnim(spriteId); - } - if (gIntroFrameCounter == 776) - { - gUnknown_0203931A = 1; - gSprites[gTasks[taskId].data[4]].data[0] = 2; - gSprites[gTasks[taskId].data[5]].data[0] = 2; - gTasks[gTasks[taskId].data[15]].data[0] = 0; - } - if (gIntroFrameCounter == 781) - { - sub_813D084(2); - gSprites[gTasks[taskId].data[2]].data[0] = 3; - gSprites[gTasks[taskId].data[3]].data[0] = 3; - gSprites[gTasks[taskId].data[4]].data[0] = 3; - gSprites[gTasks[taskId].data[5]].data[0] = 3; - spriteId = CreateSprite(&gSpriteTemplate_840B1F4, 0x78, 0x50, 15); - gSprites[spriteId].invisible = 1; - } - if (gIntroFrameCounter == 800) - PlaySE(SE_OP_BASYU); - if (gIntroFrameCounter == 850) - BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0xFFFF); - if (gIntroFrameCounter == 946) - gTasks[taskId].func = task_intro_19; -} - -static void task_intro_19(u8 taskId) -{ - DestroyTask(taskId); - SetMainCallback2(MainCB2_EndIntro); -} - -static void task_intro_20(u8 taskId) -{ -#define BG2_FLAGS (BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256) -#define DISPCNT_FLAGS (DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON) - - gTasks[taskId].data[15]++; - switch (gTasks[taskId].data[0]) - { - case 0: - REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; - REG_BG2CNT = 0; - gTasks[taskId].data[0] = 0xFF; - break; - case 2: - BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF); - REG_BG2CNT = BG2_FLAGS; - REG_DISPCNT = DISPCNT_FLAGS; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[0] = 20; - //fall through - case 20: - REG_BG2VOFS = gTasks[taskId].data[1]; - REG_BG2HOFS = gTasks[taskId].data[2]; - gTasks[taskId].data[1] += 6; - gTasks[taskId].data[2] -= 8; - break; - case 3: - BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF); - REG_BG2CNT = BG2_FLAGS; - REG_DISPCNT = DISPCNT_FLAGS; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[0] = 0x1E; - //fall through - case 0x1E: - REG_BG2VOFS = gTasks[taskId].data[1]; - REG_BG2HOFS = gTasks[taskId].data[2]; - gTasks[taskId].data[1] -= 6; - gTasks[taskId].data[2] += 8; - break; - case 4: - BeginNormalPaletteFade(1, 5, 0, 0x10, 0x37F7); - REG_BG2CNT = BG2_FLAGS; - REG_DISPCNT = DISPCNT_FLAGS; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 8; - gTasks[taskId].data[0] = 0x28; - //fall through - case 0x28: - REG_BG2VOFS = gTasks[taskId].data[1]; - REG_BG2HOFS = gTasks[taskId].data[2]; - gTasks[taskId].data[1] -= gTasks[taskId].data[3]; - gTasks[taskId].data[2] += gTasks[taskId].data[3]; - if (!(gTasks[taskId].data[15] & 7) && gTasks[taskId].data[3] != 0) - gTasks[taskId].data[3]--; - break; - case 0xFF: //needed to prevent jump table optimization - break; - } - -#undef BG2_FLAGS -#undef DISPCNT_FLAGS -} - -static void intro_reset_and_hide_bgs(void) -{ - REG_DISPCNT = 0; - REG_BG3HOFS = 0; - REG_BG3VOFS = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; -} - -static void sub_813CCE8(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - default: - case 0: - REG_BLDCNT = 0x3F50; - REG_BLDALPHA = 0x1000; - REG_BLDY = 0; - gTasks[taskId].data[1] = 0x40; - gTasks[taskId].data[0] = 1; - break; - case 1: - if (gTasks[taskId].data[1] != 0) - { - u8 foo; - - gTasks[taskId].data[1]--; - foo = gTasks[taskId].data[1] / 2; - REG_BLDALPHA = gUnknown_08393E64[foo]; - } - else - { - REG_BLDALPHA = gUnknown_08393E64[0]; - gTasks[taskId].data[1] = 0x80; - gTasks[taskId].data[0]++; - } - break; - case 2: - if (gTasks[taskId].data[1] != 0) - { - //tail merge at _0813CE0E - gTasks[taskId].data[1]--; - } - else - { - gTasks[taskId].data[1] = 0; //redundant? - gTasks[taskId].data[0]++; - } - break; - case 3: - if (gTasks[taskId].data[1] <= 0x3D) - { - u8 foo; - - gTasks[taskId].data[1]++; - foo = gTasks[taskId].data[1] / 2; - REG_BLDALPHA = gUnknown_08393E64[foo]; - } - else - { - //_0813CDE0 - REG_BLDALPHA = gUnknown_08393E64[0x1F]; - gTasks[taskId].data[1] = 0x10; - gTasks[taskId].data[0]++; - } - break; - case 4: - if (gTasks[taskId].data[1] != 0) - { - gTasks[taskId].data[1]--; - } - else - { - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - DestroyTask(taskId); - } - break; - } -} - -void sub_813CE30(u16 scrX, u16 scrY, u16 zoom, u16 alpha) -{ - struct BgAffineSrcData src; - struct BgAffineDstData dest; - - src.texX = 0x8000; - src.texY = 0x8000; - src.scrX = scrX; - src.scrY = scrY; - src.sx = zoom; - src.sy = zoom; - src.alpha = alpha; - BgAffineSet(&src, &dest, 1); - REG_BG2PA = dest.pa; - REG_BG2PB = dest.pb; - REG_BG2PC = dest.pc; - REG_BG2PD = dest.pd; - REG_BG2X = dest.dx; - REG_BG2Y = dest.dy; -} - -static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front) -{ - const u8 *lzPaletteData; - u8 spriteId; - - if (front) - LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1); - else - LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0); - lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF); - LoadCompressedPalette(lzPaletteData, 0x100 + d * 0x10, 0x20); - sub_8143648(d, d); - spriteId = CreateSprite(&gUnknown_02024E8C, x, y, (d + 1) * 4); - gSprites[spriteId].oam.paletteNum = d; - gSprites[spriteId].oam.priority = 1; - return spriteId; -} - -static u8 sub_813CFA8(u16 a, u16 b, u16 c, u16 d) -{ - u8 spriteId; - - DecompressPicFromTable_2(&gTrainerBackPicTable[a], gTrainerBackPicCoords[a].coords, gTrainerBackPicCoords[a].y_offset, (void *)0x2000000, gUnknown_0840B5A0[d], a); - LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + d * 0x10, 0x20); - sub_8143680(d, d); - gUnknown_02024E8C.anims = gUnknown_0840B064; - spriteId = CreateSprite(&gUnknown_02024E8C, b, c, 1); - gSprites[spriteId].oam.paletteNum = d; - gSprites[spriteId].oam.priority = 1; - return spriteId; -} - -static void sub_813D084(u8 a) -{ - u16 color; - - switch (a) - { - default: - case 0: - color = RGB(22, 31, 15); - break; - case 1: - color = RGB(31, 14, 12); - break; - case 2: - color = RGB(12, 12, 20); - break; - } - gPlttBufferUnfaded[241] = color; - gPlttBufferFaded[241] = color; -} - -static void sub_813D0CC(struct Sprite *sprite) -{ - u8 r0; - - if (sprite->data[2] >= 192) - { - if (sprite->data[3] != 0) - { - sprite->data[3]--; - } - else - { - sprite->invisible = FALSE; - SetOamMatrix(sprite->data[1], sprite->data[2], 0, 0, sprite->data[2]); - sprite->data[2] = (sprite->data[2] * 95) / 100; - r0 = (sprite->data[2] - 192) / 128 + 9; - if (r0 > 15) - r0 = 15; - sprite->oam.paletteNum = r0; - } - } - else - { - DestroySprite(sprite); - } -} - -static void sub_813D158(struct Sprite *sprite) -{ - if (gSprites[sprite->data[7]].data[7] != 0) - { - sprite->invisible = TRUE; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); - sprite->data[2] = 1024; - sprite->data[3] = 8 * (sprite->data[1] & 3); - sprite->callback = sub_813D0CC; - sprite->oam.shape = 1; - sprite->oam.size = 3; - CalcCenterToCornerVec(sprite, 1, 3, 2); - } - else - { - sprite->pos2.x = gSprites[sprite->data[7]].pos2.x; - sprite->pos2.y = gSprites[sprite->data[7]].pos2.y; - sprite->pos1.x = gSprites[sprite->data[7]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[7]].pos1.y; - } -} - -static void sub_813D208(struct Sprite *sprite) -{ - if (sprite->data[0] != 0) - sprite->callback = sub_813D220; -} - -static void sub_813D220(struct Sprite *sprite) -{ - if (sprite->pos1.x <= 116) - { - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.y = 0; - sprite->pos1.x += 4; - sprite->pos2.x = -4; - sprite->data[4] = 128; - sprite->callback = sub_813D368; - } - else - { - u16 data2; - u16 data3; - u16 data4; - s16 sin1; - s16 sin2; - s16 sin3; - s16 sin4; - s16 var1; - s16 var2; - s16 var3; - s16 var4; - s16 temp; - - data4 = sprite->data[4]; - sin1 = gSineTable[(u8)data4]; - sin2 = gSineTable[(u8)(data4 + 64)]; - sprite->data[4] += 2; - sprite->pos2.y = sin1 / 32; - sprite->pos1.x--; - if (sprite->pos1.x & 1) - sprite->pos1.y++; - temp = -sin2 / 16; - data2 = sprite->data[2]; - data3 = sprite->data[3]; - sin3 = gSineTable[(u8)(temp - 16)]; - sin4 = gSineTable[(u8)(temp + 48)]; - var1 = sin4 * data2 / 256; - var2 = -sin3 * data3 / 256; - var3 = sin3 * data2 / 256; - var4 = sin4 * data3 / 256; - SetOamMatrix(sprite->data[1], data2, 0, 0, data3); - SetOamMatrix(sprite->data[1] + 1, var1, var3, var2, var4); - SetOamMatrix(sprite->data[1] + 2, var1, var3, var2 * 2, var4 * 2); - } -} - -static void sub_813D368(struct Sprite *sprite) -{ - SetOamMatrix(sprite->data[1], sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); - SetOamMatrix(sprite->data[1] + 1, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); - SetOamMatrix(sprite->data[1] + 2, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); - if (sprite->data[4] != 64) - { - u16 data4; - - sprite->data[4] -= 8; - data4 = sprite->data[4]; - sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64; - sprite->pos2.y = gSineTable[(u8)data4] / 64; - } - else - { - sprite->data[4] = 0; - sprite->callback = sub_813D414; - } -} - -static void sub_813D414(struct Sprite *sprite) -{ - if (sprite->data[0] != 2) - { - s16 r2; - - sprite->data[4] += 8; - r2 = gSineTable[(u8)sprite->data[4]] / 16 + 64; - sprite->pos2.x = gSineTable[(u8)(r2 + 64)] / 64; - sprite->pos2.y = gSineTable[(u8)r2] / 64; - } - else - { - sprite->callback = SpriteCB_WaterDropFall; - } -} - -static void SpriteCB_WaterDropFall(struct Sprite *sprite) -{ - if (sprite->pos1.y < sprite->data[5]) - { - sprite->pos1.y += 4; - } - else - { - sprite->data[7] = 1; - sprite->invisible = TRUE; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); - sprite->data[2] = 1024; - sprite->data[3] = 8 * (sprite->data[1] & 3); - sprite->callback = sub_813D0CC; - sprite->oam.shape = 1; - sprite->oam.size = 3; - CalcCenterToCornerVec(sprite, 1, 3, 2); - } -} - -//Duplicate function -static void SpriteCB_WaterDropFall_2(struct Sprite *sprite) -{ - if (sprite->pos1.y < sprite->data[5]) - { - sprite->pos1.y += 4; - } - else - { - sprite->data[7] = 1; - sprite->invisible = TRUE; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); - sprite->data[2] = 1024; - sprite->data[3] = 8 * (sprite->data[1] & 3); - sprite->callback = sub_813D0CC; - sprite->oam.shape = 1; - sprite->oam.size = 3; - CalcCenterToCornerVec(sprite, 1, 3, 2); - } -} - -static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately) -{ - u8 spriteId; - u8 oldSpriteId; - - spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[7] = 0; - gSprites[spriteId].data[1] = d; - gSprites[spriteId].data[2] = c; - gSprites[spriteId].data[3] = c; - gSprites[spriteId].data[5] = e; - gSprites[spriteId].data[6] = c; - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = d; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); - StartSpriteAnim(&gSprites[spriteId], 2); - if (!fallImmediately) - gSprites[spriteId].callback = sub_813D208; - else - gSprites[spriteId].callback = SpriteCB_WaterDropFall_2; - oldSpriteId = spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); - gSprites[spriteId].data[7] = oldSpriteId; - gSprites[spriteId].data[1] = d + 1; - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = d + 1; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); - gSprites[spriteId].callback = sub_813D158; - - spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0); - gSprites[spriteId].data[7] = oldSpriteId; - gSprites[spriteId].data[1] = d + 2; - StartSpriteAnim(&gSprites[spriteId], 1); - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = d + 2; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2); - gSprites[spriteId].callback = sub_813D158; - - SetOamMatrix(d, c + 32, 0, 0, c + 32); - SetOamMatrix(d + 1, c + 32, 0, 0, c + 32); - SetOamMatrix(d + 2, c + 32, 0, 0, 2 * (c + 32)); - - return oldSpriteId; -} - -static void sub_813D788(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - StartSpriteAnimIfDifferent(sprite, 0); - sprite->pos1.x--; - break; - case 1: - StartSpriteAnimIfDifferent(sprite, 0); - if (gIntroFrameCounter & 7) - return; - sprite->pos1.x++; - break; - case 2: - StartSpriteAnimIfDifferent(sprite, 2); - if (sprite->pos1.x <= 120 || (gIntroFrameCounter & 7)) - sprite->pos1.x++; - break; - case 3: - StartSpriteAnimIfDifferent(sprite, 3); - break; - case 4: - StartSpriteAnimIfDifferent(sprite, 0); - if (sprite->pos1.x > -32) - sprite->pos1.x -= 2; - break; - } - if (gIntroFrameCounter & 7) - return; - if (sprite->pos2.y != 0) - { - sprite->pos2.y = 0; - } - else - { - switch (Random() & 3) - { - case 0: - sprite->pos2.y = -1; - break; - case 1: - sprite->pos2.y = 1; - break; - case 2: - case 3: - sprite->pos2.y = 0; - break; - } - } -} - -static void sub_813D880(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - break; - case 1: - if (sprite->pos2.x + sprite->pos1.x < 304) - sprite->pos2.x += 8; - else - sprite->data[0] = 2; - break; - case 2: - if (sprite->pos2.x + sprite->pos1.x > 120) - sprite->pos2.x -= 1; - else - sprite->data[0] = 3; - break; - case 3: - if (sprite->pos2.x > 0) - sprite->pos2.x -= 2; - break; - } - sprite->pos2.y = Sin((u8)sprite->data[1], 8) - gUnknown_0203935A; - sprite->data[1] += 4; -} - -static void sub_813D908(struct Sprite *sprite) -{ - if (gTasks[sprite->data[0]].data[0] == 0) - { - sprite->invisible = TRUE; - } - else if (gTasks[sprite->data[0]].data[0] != 4) - { - sprite->invisible = FALSE; - } - else - { - DestroySprite(sprite); - } -} - -static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c) -{ - u8 spriteId; - u16 i; - - for (i = 0; i < 9; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_840AF94, gUnknown_0840AF50[i][1] + a, b - 4, 0); - gSprites[spriteId].data[0] = c; - StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF50[i][0]); - } - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_840AFAC, gUnknown_0840AF74[i][1] + a, b + 12, 0); - gSprites[spriteId].data[0] = c; - StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF74[i][0]); - } - spriteId = CreateSprite(&gSpriteTemplate_840AFC4, 120, b - 4, 0); - gSprites[spriteId].data[0] = c; - - return spriteId; -} - -static void sub_813DA64(struct Sprite *sprite) -{ - sprite->data[7]++; - - switch (sprite->data[0]) - { - case 0: - default: - sprite->oam.affineMode = 3; - sprite->oam.matrixNum = 1; - CalcCenterToCornerVec(sprite, 1, 3, 3); - sprite->invisible = FALSE; - sprite->data[0] = 1; - sprite->data[1] = 128; - sprite->data[2] = -24; - sprite->data[3] = 0; - break; - case 1: - { - s16 sin; - s16 cos; - s16 a; - s16 b; - s16 c; - s16 d; - - if (sprite->data[3] < 0x50) - { - sprite->pos2.y = -Sin((u8)sprite->data[3], 0x78); - sprite->pos2.x = -Sin((u8)sprite->data[3], 0x8C); - if (sprite->data[3] > 64) - sprite->oam.priority = 3; - } - sin = gSineTable[(u8)sprite->data[2]]; - cos = gSineTable[(u8)(sprite->data[2] + 64)]; - d = cos * sprite->data[1] / 256; - c = -sin * sprite->data[1] / 256; - b = sin * sprite->data[1] / 256; - a = cos * sprite->data[1] / 256; - - SetOamMatrix(1, a, b, c, d); - - if (sprite->data[1] < 0x100) - sprite->data[1] += 8; - else - sprite->data[1] += 32; - if (sprite->data[2] < 0x18) - sprite->data[2] += 1; - if (sprite->data[3] < 64) - sprite->data[3] += 2; - else if (!(sprite->data[7] & 3)) - sprite->data[3] += 1; - break; - } - } -} - -static void sub_813DB9C(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - default: - if (sprite->data[2] != 0) - sprite->hFlip = TRUE; - else - sprite->hFlip = FALSE; - sprite->data[0] = 1; - //fall through - case 1: - if (sprite->pos1.y > 96) - { - sprite->pos1.y -= 4; - if (sprite->data[2] != 0) - sprite->pos1.x += 2; - else - sprite->pos1.x -= 2; - } - else - { - sprite->data[0]++; - sprite->data[3] = 8; - } - break; - case 2: - if (sprite->data[3] != 0) - { - sprite->data[3]--; - } - else - { - sprite->data[0]++; - sprite->data[3] = 0; //redundant? - } - break; - case 3: - sprite->oam.affineMode = 3; - sprite->oam.matrixNum = sprite->data[1]; - CalcCenterToCornerVec(sprite, 0, 3, 3); - if (sprite->data[2] != 0) - SetOamMatrix(sprite->data[1], -256, 0, 0, 256); - else - SetOamMatrix(sprite->data[1], 256, 0, 0, 256); - sprite->data[0]++; - sprite->data[4] = 0; - break; - case 4: - sprite->data[4]++; - if (sprite->pos1.y + sprite->pos2.y > -32 - && sprite->pos1.x + sprite->pos2.x > -64) - { - u16 r2; - - sprite->pos2.y = -(sprite->data[4] * sprite->data[4]) / 8; - if (sprite->data[2] != 0) - sprite->pos2.x += sprite->data[4]; - else - sprite->pos2.x -= sprite->data[4]; - if (sprite->data[3] < 128) - sprite->data[3] += 8; - r2 = 256 - sprite->data[3]; - if (sprite->data[2] != 0) - SetOamMatrix(sprite->data[1], -r2, 0, 0, r2); - else - SetOamMatrix(sprite->data[1], r2, 0, 0, r2); - } - else - { - DestroySprite(sprite); - } - } -} - -static void sub_813DD58(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - default: - sprite->invisible = FALSE; - sprite->oam.affineMode = 1; - sprite->oam.matrixNum = sprite->data[1]; - sprite->data[3] = 2048; - sprite->data[0] = 1; - //fall through - case 1: - if (sprite->data[3] > 256) - { - sprite->data[3] -= 128; - if (sprite->data[2] != 0) - SetOamMatrix(sprite->data[1], -sprite->data[3], 0, 0, sprite->data[3]); - else - SetOamMatrix(sprite->data[1], sprite->data[3], 0, 0, sprite->data[3]); - } - else - { - if (sprite->data[2] != 0) - SetOamMatrix(sprite->data[1], -256, 0, 0, 256); - else - SetOamMatrix(sprite->data[1], 256, 0, 0, 256); - sprite->data[0]++; - } - break; - case 2: - break; - case 3: - sprite->data[4]++; - sprite->pos2.y = sprite->data[4] * sprite->data[4] / 32; - if (sprite->data[2] != 0) - sprite->pos2.x = sprite->data[4] / 4; - else - sprite->pos2.x = -(sprite->data[4] / 4); - break; - } -} - -static void sub_813DE70(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - default: - if (sprite->pos1.x > 40) - { - sprite->pos1.x -= 4; - } - else - { - StartSpriteAnim(sprite, 1); - sprite->data[6] = CreateSprite(&gSpriteTemplate_840B084, 16, 104, 100); - sprite->data[7] = CreateSprite(&gSpriteTemplate_840B084, 12, 106, 101); - sprite->data[0] = 1; - } - break; - case 1: - break; - case 2: - StartSpriteAnim(sprite, 2); - gSprites[sprite->data[6]].data[0] = 1; - gSprites[sprite->data[7]].data[0] = 2; - sprite->data[0]++; - break; - case 3: - if (sprite->pos1.y > 160) - { - sprite->invisible = 1; - sprite->data[0] = 1; - } - else - { - sprite->pos1.y += 2; - sprite->pos1.x--; - } - break; - case 4: - { - s16 r4, r5; - - r5 = gSprites[sprite->data[6]].pos1.x + gSprites[sprite->data[6]].pos2.x; - r4 = gSprites[sprite->data[6]].pos1.y + gSprites[sprite->data[6]].pos2.y; - DestroySprite(&gSprites[sprite->data[6]]); - sprite->data[6] = sub_813CE88(SPECIES_TORCHIC, r5, r4, 2, 1); - gSprites[sprite->data[6]].callback = sub_813DD58; - gSprites[sprite->data[6]].invisible = TRUE; - gSprites[sprite->data[6]].data[1] = 1; - gSprites[sprite->data[6]].data[2] = 1; - sub_813E580(r5, r4); - - r5 = gSprites[sprite->data[7]].pos1.x + gSprites[sprite->data[7]].pos2.x; - r4 = gSprites[sprite->data[7]].pos1.y + gSprites[sprite->data[7]].pos2.y; - DestroySprite(&gSprites[sprite->data[7]]); - sprite->data[7] = sub_813CE88(SPECIES_MUDKIP, r5, r4, 3, 1); - gSprites[sprite->data[7]].callback = sub_813DD58; - gSprites[sprite->data[7]].invisible = TRUE; - gSprites[sprite->data[7]].data[1] = 2; - gSprites[sprite->data[7]].data[2] = 0; - sub_813E580(r5, r4); - - BeginNormalPaletteFade(0xFF0000, 0, 16, 16, RGB(31, 23, 31)); - sprite->data[0] = 1; - break; - } - case 5: - gSprites[sprite->data[6]].data[0] = 3; - gSprites[sprite->data[7]].data[0] = 3; - break; - case 6: - DestroySprite(&gSprites[sprite->data[6]]); - DestroySprite(&gSprites[sprite->data[7]]); - DestroySprite(sprite); - break; - } -} - -static void sub_813E10C(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - default: - if (sprite->pos2.x > -56) - { - sprite->pos2.x -= 8; - sprite->pos2.y += 6; - } - else - { - sprite->data[6] = sprite->pos1.x; - sprite->data[7] = sprite->pos1.y; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data[0] = 1; - sprite->data[1] = 0; - } - break; - case 1: - if (!(sprite->data[1] & 1)) - { - if (sprite->data[1] & 2) - { - sprite->pos2.x = -1; - sprite->pos2.y = 1; - } - else - { - sprite->pos2.x = 0; - sprite->pos2.y = 0; - } - } - sprite->data[1]++; - break; - case 2: - sprite->invisible = TRUE; - sprite->pos1.x = sprite->data[6]; - sprite->pos1.y = sprite->data[7]; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - break; - case 3: - sprite->invisible = FALSE; - sprite->data[1]++; - //fall through - case 4: - if (sprite->pos2.x > -56) - { - sprite->pos2.x -= 4; - sprite->pos2.y += 3; - } - else - { - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data[0] = 1; - } - break; - } -} - -static void sub_813E210(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - default: - if (sprite->pos2.x < 56) - { - sprite->pos2.x += 8; - sprite->pos2.y -= 6; - } - else - { - sprite->data[6] = sprite->pos1.x; - sprite->data[7] = sprite->pos1.y; - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data[0] = 1; - sprite->data[1] = 0; - } - break; - case 1: - if (!(sprite->data[1] & 1)) - { - if (sprite->data[1] & 2) - { - sprite->pos2.x = 1; - sprite->pos2.y = -1; - } - else - { - sprite->pos2.x = 0; - sprite->pos2.y = 0; - } - } - sprite->data[1]++; - break; - case 2: - sprite->invisible = TRUE; - sprite->pos1.x = sprite->data[6]; - sprite->pos1.y = sprite->data[7]; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - break; - case 3: - sprite->invisible = FALSE; - sprite->data[1]++; - //fall through - case 4: - if (sprite->pos2.x < 56) - { - sprite->pos2.x += 4; - sprite->pos2.y -= 3; - } - else - { - sprite->pos1.x += sprite->pos2.x; - sprite->pos1.y += sprite->pos2.y; - sprite->pos2.x = 0; - sprite->pos2.y = 0; - sprite->data[0] = 1; - } - break; - } -} - -static void sub_813E30C(struct Sprite *sprite) -{ - u16 r4, r1; - - sprite->data[7]++; - switch (sprite->data[0]) - { - case 0: - default: - break; - case 1: - sprite->oam.affineMode = 1; - sprite->oam.matrixNum = 1; - sprite->data[0] = 10; - sprite->data[4] = 36; - //fall through - case 10: - if (sprite->pos1.x <= 144) - { - sprite->pos1.x += 4; - sprite->pos1.y -= 1; - sprite->pos2.y = -Sin((u8)sprite->data[2], 24); - sprite->data[2] += 4; - } - sprite->data[3] -= sprite->data[4]; - if ((sprite->data[7] & 1) && sprite->data[4] != 0) - sprite->data[4]--; - r4 = gSineTable[(u8)sprite->data[3]]; - r1 = gSineTable[(u8)(sprite->data[3] + 64)]; - SetOamMatrix(1, r1, r4, -r4, r1); - break; - case 2: - sprite->oam.affineMode = 1; - sprite->oam.matrixNum = 2; - sprite->data[0] = 20; - sprite->data[4] = 36; - //fall through - case 20: - if (sprite->pos1.x <= 96) - { - sprite->pos1.x += 3; - sprite->pos1.y -= 1; - sprite->pos2.y = -Sin((u8)sprite->data[2], 24); - sprite->data[2] += 4; - } - sprite->data[3] -= sprite->data[4]; - if ((sprite->data[7] & 1) && sprite->data[4] != 0) - sprite->data[4]--; - r4 = gSineTable[(u8)sprite->data[3]]; - r1 = gSineTable[(u8)(sprite->data[3] + 64)]; - SetOamMatrix(2, r1, r4, -r4, r1); - break; - } -} - -static void sub_813E4B8(struct Sprite *sprite) -{ - u16 r4; - u16 r2; - u16 r1; - - sprite->data[7]++; - if (sprite->data[7] & 1) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - if (sprite->data[2] >= 64) - { - DestroySprite(sprite); - return; - } - sprite->data[2] += 2; - r4 = Sin((u8)sprite->data[2], 40); - sprite->pos2.x = Cos((u8)(sprite->data[0] * 32), r4); - sprite->pos2.y = Sin((u8)(sprite->data[0] * 32), r4); - if (sprite->data[0] == 0) - { - sprite->data[3] -= sprite->data[1]; - if ((sprite->data[7] & 1) && sprite->data[1] != 0) - sprite->data[1]--; - r2 = gSineTable[(u8)sprite->data[3]]; - r1 = gSineTable[(u8)(sprite->data[3] + 64)]; - SetOamMatrix(16, r1, r2, -r2, r1); - } -} - -static void sub_813E580(u16 x, u16 y) -{ - u8 i; - u8 spriteId; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_840B0B0, x, y, 0); - gSprites[spriteId].oam.affineMode = 1; - gSprites[spriteId].oam.matrixNum = 16; - gSprites[spriteId].data[0] = i; - gSprites[spriteId].data[1] = 32; - } -} - -static void sub_813E5E0(struct Sprite *sprite) -{ - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->invisible = gSprites[sprite->data[0]].invisible; - if (sprite->data[7] < 12) - sprite->data[7]++; - sprite->data[6] += 4; - sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256; - //This useless '+ 0' is needed to make the asm match - sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256; - sprite->pos2.y = gSineTable[(u8)(sprite->data[1] + 0)] * sprite->data[7] / 256; - sprite->data[1] += 16; - if (sprite->pos1.y > sprite->data[2]) - DestroySprite(sprite); - } -} - -static void sub_813E6C0(struct Sprite *sprite) -{ - u8 spriteId; - u8 i; - s16 var1; - s16 var2; - - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->data[7]++; - sprite->invisible = TRUE; - if (gSprites[sprite->data[0]].data[0] == 1 && !(sprite->data[7] & 3)) - { - var1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x; - var2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y; - for (i = 0; i < 3; i++) - { - u8 r3 = gSprites[sprite->data[0]].subpriority - 1; - //Make redundant copies of these variables to get the asm to match - s16 _var1 = var1; - s16 _var2 = var2; - - spriteId = CreateSprite(&gSpriteTemplate_840B0DC, _var1, _var2, r3); - if (spriteId != 64) - { - gSprites[spriteId].data[0] = sprite->data[0]; - gSprites[spriteId].data[1] = (((sprite->data[7] >> 2) & 7) << 5) + i * 85; - gSprites[spriteId].data[2] = sprite->data[3]; - gSprites[spriteId].data[3] = 104; - gSprites[spriteId].data[4] = var1; - gSprites[spriteId].data[5] = var2; - gSprites[spriteId].data[6] = 0; - } - } - } - } -} - -static void sub_813E7C0(u8 a) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_840B0F4, 0, 0, 0); - if (spriteId != 64) - { - gSprites[spriteId].data[0] = a; - gSprites[spriteId].data[1] = -12; - gSprites[spriteId].data[2] = 0; - gSprites[spriteId].data[3] = 136; - } -} - -static void sub_813E804(struct Sprite *sprite) -{ - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->data[7]++; - if (sprite->data[3] < 40) - sprite->data[3] += 2; - //This useless '+ 0' is needed to make the asm match - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x + gSprites[sprite->data[0]].pos2.x + gSineTable[(u8)(sprite->data[1] + 64)] * sprite->data[3] / 256; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + gSprites[sprite->data[0]].pos2.y + gSineTable[(u8)(sprite->data[1] + 0)] * sprite->data[3] / 512; - sprite->data[1] += 2; - sprite->pos2.y = gSineTable[(u8)(sprite->data[2] + 0)] / 32; - sprite->data[2] += 8; - if ((sprite->data[1] & 0xFF) < 128) - sprite->subpriority = gSprites[sprite->data[0]].subpriority - 1; - else - sprite->subpriority = gSprites[sprite->data[0]].subpriority + 1; - } -} - -static void sub_813E930(u8 a) -{ - u8 i; - u8 spriteId; - - for (i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gSpriteTemplate_840B124, gSprites[a].pos1.x, gSprites[a].pos1.y, 0); - if (spriteId != 64) - { - gSprites[spriteId].data[0] = a; - gSprites[spriteId].data[1] = i * 32; - } - } -} - -static void sub_813E980(struct Sprite *sprite) -{ - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - u8 r0; - u16 matrixNum; - - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->data[7]++; - sprite->data[6] += 8; - sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256; - sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256; - r0 = sprite->data[6] / 16; - if (r0 > 9) - r0 = 9; - matrixNum = (r0 + 18) & 31; - sprite->oam.matrixNum = matrixNum; - if (sprite->data[6] > 160) - DestroySprite(sprite); - } -} - -static void sub_813EA60(struct Sprite *sprite) -{ - bool32 r6; - s16 r1, r2; - u8 spriteId; - - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->data[7]++; - sprite->invisible = TRUE; - if (gSprites[sprite->data[0]].data[0] == 1) - { - r6 = (sprite->data[7] & 1); - if (!r6) - { - r1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x; - r2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y; - spriteId = CreateSprite(&gSpriteTemplate_840B150, r1, r2, gSprites[sprite->data[0]].subpriority + 1); - if (spriteId != 64) - { - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = 18; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3); - gSprites[spriteId].data[0] = sprite->data[0]; - gSprites[spriteId].data[3] = gUnknown_0840B168[(sprite->data[7] >> 1) & 7]; - gSprites[spriteId].data[4] = r1; - gSprites[spriteId].data[5] = r2; - gSprites[spriteId].data[6] = r6; - } - } - } - } -} - -static void InitIntroTorchicAttackAnim(u8 a) -{ - u8 spriteId; - u8 i; - - spriteId = CreateSprite(&gSpriteTemplate_840B170, 0, 0, 0); - if (spriteId != 64) - { - gSprites[spriteId].data[0] = a; - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].data[2] = 8; - gSprites[spriteId].data[3] = 24; - } - for (i = 0; i < 10; i++) - { - SetOamMatrix(18 + i, gUnknown_0840B188[i], 0, 0, gUnknown_0840B188[i]); - } -} - -static void sub_813EBBC(struct Sprite *sprite) -{ - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->data[7] += 1; - sprite->data[6] += 8; - sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256; - sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256; - sprite->pos2.y = gSineTable[(u8)(sprite->data[1] + 0)] / 64; - sprite->data[1] += 16; - if (sprite->pos1.y < sprite->data[2]) - DestroySprite(sprite); - } -} - -static void sub_813EC90(struct Sprite *sprite) -{ - bool32 r6; - s16 r1, r2; - u8 spriteId; - u16 foo; - - if (gUnknown_0203931A != 0) - { - DestroySprite(sprite); - } - else - { - sprite->data[7]++; - sprite->invisible = TRUE; - if (gSprites[sprite->data[0]].data[0] == 1) - { - r6 = sprite->data[7] & 1; - if (!r6) - { - r1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x; - r2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y; - spriteId = CreateSprite(&gSpriteTemplate_840B1B0, r1, r2, gSprites[sprite->data[0]].subpriority + 1); - if (spriteId != 64) - { - gSprites[spriteId].oam.affineMode = 3; - gSprites[spriteId].oam.matrixNum = 17; - CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3); - gSprites[spriteId].data[0] = sprite->data[0]; - gSprites[spriteId].data[1] = ((sprite->data[7] >> 2) & 7) << 5; - gSprites[spriteId].data[2] = sprite->data[3]; - gSprites[spriteId].data[3] = 232; - gSprites[spriteId].data[4] = r1; - gSprites[spriteId].data[5] = r2; - gSprites[spriteId].data[6] = r6; - } - } - if (sprite->data[6] < 112) - sprite->data[6] += 4; - } - foo = 256 - gSineTable[(u8)sprite->data[6]] / 2; - SetOamMatrix(17, foo, 0, 0, foo); - } -} - -static void InitIntroMudkipAttackAnim(u8 a) -{ - u8 spriteId; - - spriteId = CreateSprite(&gSpriteTemplate_840B1C8, 0, 0, 0); - if (spriteId != 64) - { - gSprites[spriteId].data[0] = a; - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].data[2] = 12; - gSprites[spriteId].data[3] = 24; - } -} - -static void sub_813EDFC(struct Sprite *sprite) -{ - u16 foo; - - //I'm not sure why a switch statement was used here. - //if (sprite->data[0] != 1) would have been more appropriate. - switch (sprite->data[0]) - { - case 0: - default: - sprite->invisible = FALSE; - sprite->oam.affineMode = 3; - sprite->oam.matrixNum = 18; - CalcCenterToCornerVec(sprite, 0, 3, 3); - sprite->data[1] = 0; - sprite->data[0] = 1; - //fall through - case 1: - break; - } - sprite->data[7]++; - if (sprite->data[7] & 1) - { - sprite->invisible = TRUE; - } - else - { - sprite->invisible = FALSE; - if (sprite->data[1] < 64) - sprite->data[1]++; - } - foo = 256 - gSineTable[(u8)sprite->data[1]] / 2; - SetOamMatrix(18, foo, 0, 0, foo); -} diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c deleted file mode 100644 index 6aadafc58..000000000 --- a/src/scene/intro_credits_graphics.c +++ /dev/null @@ -1,645 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "intro.h" -#include "data2.h" -#include "decompress.h" -#include "hall_of_fame.h" -#include "intro_credits_graphics.h" -#include "libgncmultiboot.h" -#include "link.h" -#include "m4a.h" -#include "main.h" -#include "new_game.h" -#include "palette.h" -#include "random.h" -#include "save.h" -#include "constants/songs.h" -#include "sound.h" -#include "constants/species.h" -#include "task.h" -#include "title_screen.h" -#include "trig.h" -#include "scanline_effect.h" - -// define register constants for the inline asm -asm(".include \"constants/gba_constants.inc\"\n"); - -struct IntroCreditsSpriteMetadata -{ - u8 animNum:4; - u8 shape:2; - u8 size:2; - u8 x; - u8 y; - u8 subpriority; - u16 xOff; -}; - -const u16 gUnknown_084121FC[] = INCBIN_U16("graphics/intro/intro2_grass.gbapal"); -const u16 gUnknown_0841221C[] = INCBIN_U16("graphics/intro/intro2_grass_afternoon.gbapal"); -const u16 gUnknown_0841223C[] = INCBIN_U16("graphics/intro/intro2_grass_night.gbapal"); -const u8 gUnknown_0841225C[] = INCBIN_U8("graphics/intro/intro2_grass.4bpp.lz"); -const u8 gUnknown_084126DC[] = INCBIN_U8("graphics/intro/intro2_grass_map.bin.lz"); -const u16 gUnknown_08412818[] = INCBIN_U16("graphics/intro/8412818.gbapal"); -const u16 gUnknown_08412878[] = INCBIN_U16("graphics/intro/8412878.gbapal"); -const u8 gUnknown_084128D8[] = INCBIN_U8("graphics/intro/intro2_bgclouds.4bpp.lz"); -const u8 gUnknown_08412EB4[] = INCBIN_U8("graphics/intro/intro2_bgclouds_map.bin.lz"); -const u16 gUnknown_08413184[] = INCBIN_U16("graphics/intro/intro2_bgclouds.gbapal"); -const u16 gUnknown_084131A4[] = INCBIN_U16("graphics/intro/intro2_bgclouds_afternoon.gbapal"); -const u8 gUnknown_084131C4[] = INCBIN_U8("graphics/intro/intro2_bgclouds2.4bpp.lz"); -const u16 gUnknown_08413300[] = INCBIN_U16("graphics/intro/intro2_bgtrees2.gbapal"); -const u16 gUnknown_08413320[] = INCBIN_U16("graphics/intro/intro2_bgtrees2_afternoon.gbapal"); -const u8 gUnknown_08413340[] = INCBIN_U8("graphics/intro/intro2_bgtrees.4bpp.lz"); -const u8 gUnknown_084139C8[] = INCBIN_U8("graphics/intro/intro2_bgtrees_map.bin.lz"); -const u16 gUnknown_08413CCC[] = INCBIN_U16("graphics/intro/intro2_bgtrees.gbapal"); -const u8 gIntro2TreeTiles[] = INCBIN_U8("graphics/intro/intro2_bgtreessmall.4bpp.lz"); -const u16 gUnknown_08413E38[] = INCBIN_U16("graphics/intro/8413E38.gbapal"); -const u8 gUnknown_08413E78[] = INCBIN_U8("graphics/intro/intro2_bgnight.4bpp.lz"); // only used in credits, coupled with intro because bicycle sequence -const u16 gUnknown_08414064[] = INCBIN_U16("graphics/intro/intro2_bgnight.gbapal"); -const u8 gUnknown_08414084[] = INCBIN_U8("graphics/intro/intro2_bgnight_map.bin.lz"); -const u8 gIntro2NightTiles[] = INCBIN_U8("graphics/intro/intro2_night.4bpp.lz"); -const u16 gIntro2BrendanPalette[] = INCBIN_U16("graphics/intro/intro2_brendan.gbapal"); -const u8 gIntro2BrendanTiles[] = INCBIN_U8("graphics/intro/intro2_brendan.4bpp.lz"); -const u16 gIntro2MayPalette[] = INCBIN_U16("graphics/intro/intro2_may.gbapal"); -const u16 gUnknown_08414F90[0xF0] = {0}; -const u8 gIntro2MayTiles[] = INCBIN_U8("graphics/intro/intro2_may.4bpp.lz"); -const u8 gIntro2BicycleTiles[] = INCBIN_U8("graphics/intro/intro2_bicycle.4bpp.lz"); -const u16 gIntro2LatiosPalette[] = INCBIN_U16("graphics/intro/intro2_latios.gbapal"); -const u8 gIntro2LatiosTiles[] = INCBIN_U8("graphics/intro/intro2_latios.4bpp.lz"); -const u16 gIntro2LatiasPalette[] = INCBIN_U16("graphics/intro/intro2_latias.gbapal"); -const u8 gIntro2LatiasTiles[] = INCBIN_U8("graphics/intro/intro2_latias.4bpp.lz"); - -void sub_814910C(struct Sprite *sprite); -void nullsub_82(struct Sprite *sprite); -void sub_81492A0(struct Sprite *sprite); -void nullsub_83(struct Sprite *sprite); - -const struct SpriteTemplate gSpriteTemplate_8416B3C = { - 2000, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_814910C -}; - -const struct CompressedSpriteSheet gUnknown_08416B54[] = { - { gUnknown_084131C4, 0x400, 2000 }, - {} -}; - -const union AnimCmd gSpriteAnim_8416B64[] = { - ANIMCMD_FRAME( 0, 30), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_8416B6C[] = { - ANIMCMD_FRAME(16, 30), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_8416B74[] = { - ANIMCMD_FRAME(20, 30), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_8416B7C[] = { - ANIMCMD_FRAME(22, 30), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_8416B84[] = { - gSpriteAnim_8416B64, - gSpriteAnim_8416B6C, - gSpriteAnim_8416B74, - gSpriteAnim_8416B7C -}; - -const struct IntroCreditsSpriteMetadata gUnknown_08416B94[] = { - { 0, ST_OAM_SQUARE, 2, 72, 32, 100, 0xc00 }, - { 0, ST_OAM_SQUARE, 2, 158, 32, 100, 0xc00 }, - { 1, ST_OAM_SQUARE, 1, 192, 40, 101, 0x800 }, - { 1, ST_OAM_SQUARE, 1, 56, 40, 101, 0x800 }, - { 2, ST_OAM_H_RECTANGLE, 0, 100, 44, 102, 0x400 }, - { 2, ST_OAM_H_RECTANGLE, 0, 152, 44, 102, 0x400 }, - { 3, ST_OAM_H_RECTANGLE, 0, 8, 46, 103, 0x100 }, - { 3, ST_OAM_H_RECTANGLE, 0, 56, 46, 103, 0x100 }, - { 3, ST_OAM_H_RECTANGLE, 0, 240, 46, 103, 0x100 }, -}; - -const struct CompressedSpriteSheet gUnknown_08416BDC[] = { - { gIntro2TreeTiles, 0x400, 2000 }, - {} -}; - -const union AnimCmd gSpriteAnim_8416BEC[] = { - ANIMCMD_FRAME( 0, 30), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_8416BF4[] = { - ANIMCMD_FRAME(16, 30), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_8416BFC[] = { - ANIMCMD_FRAME(24, 30), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_8416C04[] = { - gSpriteAnim_8416BEC, - gSpriteAnim_8416BF4, - gSpriteAnim_8416BFC -}; - -const struct IntroCreditsSpriteMetadata gUnknown_08416C10[] = { - { 0, ST_OAM_SQUARE, 2, 16, 88, 100, 0x2000 }, - { 0, ST_OAM_SQUARE, 2, 80, 88, 100, 0x2000 }, - { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x2000 }, - { 0, ST_OAM_SQUARE, 2, 208, 88, 100, 0x2000 }, - { 1, ST_OAM_V_RECTANGLE, 2, 40, 88, 101, 0x1000 }, - { 1, ST_OAM_V_RECTANGLE, 2, 104, 88, 101, 0x1000 }, - { 1, ST_OAM_V_RECTANGLE, 2, 168, 88, 101, 0x1000 }, - { 1, ST_OAM_V_RECTANGLE, 2, 232, 88, 101, 0x1000 }, - { 2, ST_OAM_V_RECTANGLE, 2, 56, 88, 102, 0x800 }, - { 2, ST_OAM_V_RECTANGLE, 2, 120, 88, 102, 0x800 }, - { 2, ST_OAM_V_RECTANGLE, 2, 184, 88, 102, 0x800 }, - { 2, ST_OAM_V_RECTANGLE, 2, 248, 88, 102, 0x800 }, -}; - -const struct CompressedSpriteSheet gUnknown_08416C70[] = { - { gIntro2NightTiles, 0x400, 2000 }, - {} -}; - -const union AnimCmd gSpriteAnim_8416C80[] = { - ANIMCMD_FRAME(0, 30), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_8416C88[] = { - gSpriteAnim_8416C80 -}; - -const struct IntroCreditsSpriteMetadata gUnknown_08416C8C[] = { - { 0, ST_OAM_SQUARE, 2, 24, 88, 100, 0x1000 }, - { 0, ST_OAM_SQUARE, 2, 64, 88, 100, 0x1000 }, - { 0, ST_OAM_SQUARE, 2, 104, 88, 100, 0x1000 }, - { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x1000 }, - { 0, ST_OAM_SQUARE, 2, 184, 88, 100, 0x1000 }, - { 0, ST_OAM_SQUARE, 2, 224, 88, 100, 0x1000 }, -}; - -const struct OamData gOamData_8416CBC = { - .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1 -}; - -const union AnimCmd gSpriteAnim_8416CC4[] = { - ANIMCMD_FRAME( 0, 8), - ANIMCMD_FRAME( 64, 8), - ANIMCMD_FRAME(128, 8), - ANIMCMD_FRAME(192, 8), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd *const gSpriteAnimTable_8416CD8[] = { - gSpriteAnim_8416CC4 -}; - -const struct SpriteTemplate gSpriteTemplate_8416CDC = { - 1002, 1002, &gOamData_8416CBC, gSpriteAnimTable_8416CD8, NULL, gDummySpriteAffineAnimTable, nullsub_82 -}; - -const struct SpriteTemplate gSpriteTemplate_8416CF4 = { - 1003, 1003, &gOamData_8416CBC, gSpriteAnimTable_8416CD8, NULL, gDummySpriteAffineAnimTable, nullsub_82 -}; - -const struct OamData gOamData_8416D0C = { - .y = 160, .shape = ST_OAM_H_RECTANGLE, .size = 3, .priority = 1 -}; - -const union AnimCmd gSpriteAnim_8416D14[] = { - ANIMCMD_FRAME( 0, 8), - ANIMCMD_FRAME( 32, 8), - ANIMCMD_FRAME( 64, 8), - ANIMCMD_FRAME( 96, 8), - ANIMCMD_JUMP(0) -}; - -const union AnimCmd *const gSpriteAnimTable_8416D28[] = { - gSpriteAnim_8416D14 -}; - -const struct SpriteTemplate gSpriteTemplate_Brendan = { - 1001, 1002, &gOamData_8416D0C, gSpriteAnimTable_8416D28, NULL, gDummySpriteAffineAnimTable, sub_81492A0 -}; - -const struct SpriteTemplate gSpriteTemplate_May = { - 1001, 1003, &gOamData_8416D0C, gSpriteAnimTable_8416D28, NULL, gDummySpriteAffineAnimTable, sub_81492A0 -}; - -const struct OamData gOamData_8416D5C = { - .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1 -}; - -const union AnimCmd gSpriteAnim_8416D64[] = { - ANIMCMD_FRAME( 0, 16), - ANIMCMD_END -}; - -const union AnimCmd gSpriteAnim_8416D6C[] = { - ANIMCMD_FRAME( 64, 16), - ANIMCMD_END -}; - -const union AnimCmd *const gSpriteAnimTable_8416D74[] = { - gSpriteAnim_8416D64, - gSpriteAnim_8416D6C -}; - -const struct SpriteTemplate gSpriteTemplate_8416D7C = { - 1004, 1004, &gOamData_8416D5C, gSpriteAnimTable_8416D74, NULL, gDummySpriteAffineAnimTable, nullsub_83 -}; - -const struct SpriteTemplate gSpriteTemplate_8416D94 = { - 1005, 1005, &gOamData_8416D5C, gSpriteAnimTable_8416D74, NULL, gDummySpriteAffineAnimTable, nullsub_83 -}; - -const struct CompressedSpriteSheet gIntro2BrendanSpriteSheet[] = { - { gIntro2BrendanTiles, 0x3800, 1002 }, - {} -}; -const struct CompressedSpriteSheet gIntro2MaySpriteSheet[] = { - { gIntro2MayTiles, 0x3800, 1003 }, - {} -}; -const struct CompressedSpriteSheet gIntro2BicycleSpriteSheet[] = { - { gIntro2BicycleTiles, 0x1000, 1001 }, - {} -}; -const struct CompressedSpriteSheet gIntro2LatiosSpriteSheet[] = { - { gIntro2LatiosTiles, 0x1000, 1004 }, - {} -}; -const struct CompressedSpriteSheet gIntro2LatiasSpriteSheet[] = { - { gIntro2LatiasTiles, 0x1000, 1005 }, - {} -}; - -const struct SpritePalette gIntro2SpritePalettes[] = { - {gIntro2BrendanPalette, 1002}, - {gIntro2MayPalette, 1003}, - {gIntro2LatiosPalette, 1004}, - {gIntro2LatiasPalette, 1005}, - {} -}; - -const struct CompressedSpriteSheet gUnknown_08416E24[] = { - { gIntro2BrendanTiles, 0x2000, 1002}, - {} -}; - -const struct CompressedSpriteSheet gUnknown_08416E34[] = { - { gIntro2MayTiles, 0x2000, 1003}, - {} -}; - - -EWRAM_DATA u16 gUnknown_02039358 = 0; -EWRAM_DATA s16 gUnknown_0203935A = 0; -EWRAM_DATA s16 gUnknown_0203935C = 0; - -extern u8 gReservedSpritePaletteCount; - -void sub_8149248(); -void sub_8149264(); - -void load_intro_part2_graphics(u8 a) -{ - LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000)); - LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800)); - LoadPalette(&gUnknown_084121FC, 240, 32); - switch (a) - { - case 0: - default: - LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); - LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); - LoadPalette(&gUnknown_08412818, 0, 96); - LoadCompressedObjectPic(gUnknown_08416B54); - LoadPalette(&gUnknown_08413184, 256, 32); - sub_8149248(); - break; - case 1: - LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM)); - LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000)); - LoadPalette(&gUnknown_08413300, 0, 32); - LoadCompressedObjectPic(gUnknown_08416BDC); - LoadPalette(&gUnknown_08413CCC, 256, 32); - sub_8149264(); - break; - } - gUnknown_0203935C = 0; - gReservedSpritePaletteCount = 8; -} - -void sub_8148C78(u8 a) -{ - if (a == 1) - { - REG_BG3CNT = 0x603; - REG_BG2CNT = 0x702; - REG_BG1CNT = 0xF05; - REG_DISPCNT = 0x1E40; - } - else - { - REG_BG3CNT = 0x603; - REG_BG2CNT = 0x702; - REG_BG1CNT = 0xF05; - REG_DISPCNT = 0x1E40; - } -} - -void sub_8149280(); - -void sub_8148CB0(u8 a) -{ - LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000)); - LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800)); - switch (a) - { - case 0: - default: - LoadPalette(&gUnknown_084121FC, 240, 32); - LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); - LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); - LoadPalette(&gUnknown_08412818, 0, 96); - LoadCompressedObjectPic(gUnknown_08416B54); - LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000)); - LoadPalette(&gUnknown_08413184, 256, 32); - sub_8149248(); - break; - case 1: - LoadPalette(&gUnknown_0841221C, 240, 32); - LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); - LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); - LoadPalette(&gUnknown_08412878, 0, 96); - LoadCompressedObjectPic(gUnknown_08416B54); - LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000)); - LoadPalette(&gUnknown_084131A4, 256, 32); - sub_8149248(); - break; - case 2: - case 3: - LoadPalette(&gUnknown_0841221C, 240, 32); - LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM)); - LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000)); - LoadPalette(&gUnknown_08413320, 0, 32); - LoadCompressedObjectPic(gUnknown_08416BDC); - LoadPalette(&gUnknown_08413320, 256, 32); - sub_8149264(); - break; - case 4: - LoadPalette(&gUnknown_0841223C, 240, 32); - LZ77UnCompVram(&gUnknown_08413E78, (void *)(VRAM)); - LZ77UnCompVram(&gUnknown_08414084, (void *)(VRAM + 0x3000)); - LoadPalette(&gUnknown_08413E38, 0, 64); - LoadCompressedObjectPic(gUnknown_08416C70); - LoadPalette(&gUnknown_08414064, 256, 32); - sub_8149280(); - break; - } - gReservedSpritePaletteCount = 8; - gUnknown_0203935C = 0; -} - -void sub_8148E90(u8 a) -{ - REG_BG3CNT = 0x603; - REG_BG2CNT = 0x702; - REG_BG1CNT = 0xF05; - REG_DISPCNT = 0x1F40; -} - -u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d) -{ - u8 taskId = CreateTask(&sub_8148F3C, 0); - - gTasks[taskId].data[0] = a; - gTasks[taskId].data[1] = b; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = c; - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[6] = 0; - gTasks[taskId].data[7] = d; - gTasks[taskId].data[8] = 8; - gTasks[taskId].data[9] = 0; - sub_8148F3C(taskId); - return taskId; -} - -void sub_8148F3C(u8 taskId) -{ - s16 r4; - s32 r2; - - r4 = gTasks[taskId].data[1]; - if (r4 != 0) - { - r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3]; - r2 -= 16 * (u16)r4; - gTasks[taskId].data[2] = r2 >> 16; - gTasks[taskId].data[3] = r2; - REG_BG1HOFS = gTasks[taskId].data[2]; - REG_BG1VOFS = gUnknown_02039358 + gUnknown_0203935A; - } - - r4 = gTasks[taskId].data[4]; - if (r4 != 0) - { - r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; - r2 -= 16 * (u16)r4; - gTasks[taskId].data[5] = r2 >> 16; - gTasks[taskId].data[6] = r2; - REG_BG2HOFS = gTasks[taskId].data[5]; - if (gTasks[taskId].data[0] != 0) - REG_BG2VOFS = gUnknown_02039358 + gUnknown_0203935A; - else - REG_BG2VOFS = gUnknown_02039358; - } - - r4 = gTasks[taskId].data[7]; - if (r4 != 0) - { - r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9]; - r2 -= 16 * (u16)r4; - gTasks[taskId].data[8] = r2 >> 16; - gTasks[taskId].data[9] = r2; - REG_BG3HOFS = gTasks[taskId].data[8]; - REG_BG3VOFS = gUnknown_02039358; - } -} - -void sub_8149020(u8 mode) -{ - u16 x; - u16 y; - switch (mode) - { - case 0: - default: - /* stuff */ - if (gMain.vblankCounter1 & 3 || gPaletteFade.active) - break; - if (gMain.vblankCounter1 & 4) - { - x = gPlttBufferUnfaded[9]; - y = gPlttBufferUnfaded[10]; - } - else - { - x = gPlttBufferUnfaded[10]; - y = gPlttBufferUnfaded[9]; - } - LoadPalette(&x, 9, 2); - LoadPalette(&y, 10, 2); - break; - case 2: - if (gMain.vblankCounter1 & 3 || gPaletteFade.active) - break; - if (gMain.vblankCounter1 & 4) - { - x = 0x3D27; - y = 0x295; - } - else - { - x = 0x31C; - y = 0x3D27; - } - LoadPalette(&x, 12, 2); - LoadPalette(&y, 13, 2); - break; - case 1: - break; - } -} - -void sub_814910C(struct Sprite *sprite) -{ - if (gUnknown_0203935C) - { - DestroySprite(sprite); - } - else - { - s32 var = ((sprite->pos1.x << 16) | (u16)sprite->data[2]) + (u16)sprite->data[1]; - sprite->pos1.x = var >> 16; - sprite->data[2] = var; - if (sprite->pos1.x > 255) sprite->pos1.x = 0xFFE0; - if (sprite->data[0]) - { - sprite->pos2.y = -(gUnknown_02039358 + gUnknown_0203935A); - } - else - { - sprite->pos2.y = -gUnknown_02039358; - } - } -} - -void sub_8149174(u8 a, const struct IntroCreditsSpriteMetadata *b, const union AnimCmd *const *c, u8 d) -{ - u8 i; - - for(i = 0; i < d; i++) - { - u8 sprite = CreateSprite(&gSpriteTemplate_8416B3C, b[i].x, b[i].y, b[i].subpriority); - CalcCenterToCornerVec(&gSprites[sprite], b[i].shape, b[i].size, 0); - gSprites[sprite].oam.priority = 3; - gSprites[sprite].oam.shape = b[i].shape; - gSprites[sprite].oam.size = b[i].size; - gSprites[sprite].oam.paletteNum = 0; - gSprites[sprite].anims = c; - StartSpriteAnim(&gSprites[sprite], b[i].animNum); - gSprites[sprite].data[0] = a; - gSprites[sprite].data[1] = b[i].xOff; - gSprites[sprite].data[2] = 0; - } -} - -void sub_8149248() -{ - sub_8149174(0, gUnknown_08416B94, gSpriteAnimTable_8416B84, 9); -} - -void sub_8149264() -{ - sub_8149174(1, gUnknown_08416C10, gSpriteAnimTable_8416C04, 12); -} - -void sub_8149280() -{ - sub_8149174(1, gUnknown_08416C8C, gSpriteAnimTable_8416C88, 6); -} - -void nullsub_82(struct Sprite *sprite) -{ -} - -void sub_81492A0(struct Sprite* sprite) -{ - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + 8; - sprite->pos2.x = gSprites[sprite->data[0]].pos2.x; - sprite->pos2.y = gSprites[sprite->data[0]].pos2.y; -} - - - -u8 intro_create_brendan_sprite(s16 a, s16 b) -{ - u8 sprite = CreateSprite(&gSpriteTemplate_8416CDC, a, b, 0); - u8 brendan = CreateSprite(&gSpriteTemplate_Brendan, a, b + 8, 1); - gSprites[brendan].data[0] = sprite; - return sprite; -} - -u8 intro_create_may_sprite(s16 a, s16 b) -{ - u8 sprite = CreateSprite(&gSpriteTemplate_8416CF4, a, b, 0); - u8 may = CreateSprite(&gSpriteTemplate_May, a, b + 8, 1); - gSprites[may].data[0] = sprite; - return sprite; -} - -void nullsub_83(struct Sprite *sprite) -{ -} - -void sub_81493C4(struct Sprite* sprite) -{ - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; - sprite->pos2.x = gSprites[sprite->data[0]].pos2.x; - sprite->pos2.y = gSprites[sprite->data[0]].pos2.y; -} - -u8 intro_create_latios_sprite(s16 a, s16 b) -{ - u8 sprite = CreateSprite(&gSpriteTemplate_8416D7C, a - 32, b, 2); - u8 latios = CreateSprite(&gSpriteTemplate_8416D7C, a + 32, b, 2); - gSprites[latios].data[0] = sprite; - StartSpriteAnim(&gSprites[latios], 1); - gSprites[latios].callback = &sub_81493C4; - return sprite; -} - -u8 intro_create_latias_sprite(s16 a, s16 b) -{ - u8 sprite = CreateSprite(&gSpriteTemplate_8416D94, a - 32, b, 2); - u8 latios = CreateSprite(&gSpriteTemplate_8416D94, a + 32, b, 2); - gSprites[latios].data[0] = sprite; - StartSpriteAnim(&gSprites[latios], 1); - gSprites[latios].callback = &sub_81493C4; - return sprite; -} diff --git a/src/scene/new_game.c b/src/scene/new_game.c deleted file mode 100644 index e64dc91e3..000000000 --- a/src/scene/new_game.c +++ /dev/null @@ -1,236 +0,0 @@ -#include "global.h" -#include "constants/maps.h" -#include "constants/species.h" -#include "clock.h" -#include "new_game.h" -#include "battle_records.h" -#include "berry.h" -#include "contest.h" -#include "decoration_inventory.h" -#include "dewford_trend.h" -#include "easy_chat.h" -#include "event_data.h" -#include "field_specials.h" -#include "item_menu.h" -#include "lottery_corner.h" -#include "mail_data.h" -#include "mauville_man.h" -#include "play_time.h" -#include "player_pc.h" -#include "pokeblock.h" -#include "pokedex.h" -#include "pokemon_size_record.h" -#include "pokemon_storage_system.h" -#include "random.h" -#include "roamer.h" -#include "script_pokemon_80C4.h" -#include "overworld.h" -#include "rtc.h" -#include "script.h" -#include "secret_base.h" -#include "text.h" -#include "tv.h" - -EWRAM_DATA u8 gDifferentSaveFile = 0; -EWRAM_DATA u8 gUnknown_020297ED = 0; - -extern u8 gPlayerPartyCount; -extern u8 gUnknown_03005CE8; -extern u16 gSaveFileStatus; - -extern u8 gUnknown_0819FA81[]; - -static const struct ContestWinner sEmptyMuseumPortrait = -{ - .nickname = {EOS}, - .trainerName = {EOS}, -}; - -#if DEBUG -const s8 gUnknown_Debug_0823C788[][2] = -{ - { MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK) }, - { MAP_GROUP(OLDALE_TOWN_POKEMON_CENTER_2F), MAP_NUM(OLDALE_TOWN_POKEMON_CENTER_2F) }, - { MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN) }, - { MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F) } -}; - -const u8 gUnknown_Debug_0823C790[] = _("KRÖTE"); -#endif - -void write_word_to_mem(u32 var, u8 *dataPtr) -{ - dataPtr[0] = var; - dataPtr[1] = var >> 8; - dataPtr[2] = var >> 16; - dataPtr[3] = var >> 24; -} - -void copy_word_to_mem(u8 *copyTo, u8 *copyFrom) -{ - s32 i; - for (i = 0; i < 4; i++) - copyTo[i] = copyFrom[i]; -} - -void InitPlayerTrainerId(void) -{ - write_word_to_mem((Random() << 16) | Random(), gSaveBlock2.playerTrainerId); -} - -// L=A isnt set here for some reason. -void SetDefaultOptions(void) -{ - gSaveBlock2.optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; - gSaveBlock2.optionsWindowFrameType = 0; - gSaveBlock2.optionsSound = OPTIONS_SOUND_MONO; - gSaveBlock2.optionsBattleStyle = OPTIONS_BATTLE_STYLE_SHIFT; - gSaveBlock2.optionsBattleSceneOff = FALSE; - gSaveBlock2.regionMapZoom = FALSE; -} - -void ClearPokedexFlags(void) -{ - gUnknown_03005CE8 = 0; - memset(&gSaveBlock2.pokedex.owned, 0, sizeof(gSaveBlock2.pokedex.owned)); - memset(&gSaveBlock2.pokedex.seen, 0, sizeof(gSaveBlock2.pokedex.seen)); -} - -void ResetContestAndMuseumWinners(void) -{ - s32 i; - - Contest_ResetWinners(); - for (i = 0; i < 5; i++) - gSaveBlock1.museumPortraits[i] = sEmptyMuseumPortrait; -} - -void ZeroBattleTowerData(void) -{ - CpuFill32(0, &gSaveBlock2.battleTower, sizeof(gSaveBlock2.battleTower)); -} - -#if DEBUG -void debug_sub_8052E04() -{ - u8 i; - - for (i = 0; i < 4; i++) - { - if (gUnknown_Debug_0823C788[i][0] == gSaveBlock1.location.mapGroup && - gUnknown_Debug_0823C788[i][1] == gSaveBlock1.location.mapNum) - { - break; - } - } - - i++; - if (i >= 4) - { - i = 0; - } - - Overworld_SetWarpDestination(gUnknown_Debug_0823C788[i][0], gUnknown_Debug_0823C788[i][1], -1, -1, -1); -} -#endif - -void WarpToTruck(void) -{ - Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck - warp_in(); -} - -void ClearSav2(void) -{ - CpuFill16(0, &gSaveBlock2, sizeof(gSaveBlock2)); - SetDefaultOptions(); -} - -void sub_8052E4C(void) -{ - gDifferentSaveFile = 0; -#if DEBUG - gUnknown_020297ED = 0; -#endif - sub_808C0A0(); - ZeroPlayerPartyMons(); - ZeroEnemyPartyMons(); - ResetBagScrollPositions(); -} - -void NewGameInitData(void) -{ - if (gSaveFileStatus == 0 || gSaveFileStatus == 2) - RtcReset(); - - gDifferentSaveFile = 1; - ZeroPlayerPartyMons(); - ZeroEnemyPartyMons(); - ResetPokedex(); - ZeroBattleTowerData(); - memset(&gSaveBlock1, 0, sizeof(gSaveBlock1)); - ClearMailData(); - gSaveBlock2.specialSaveWarp = 0; - InitPlayerTrainerId(); - PlayTimeCounter_Reset(); - ClearPokedexFlags(); - InitEventData(); - ClearTVShowData(); - ResetGabbyAndTy(); - ResetSecretBases(); - ClearBerryTrees(); - gSaveBlock1.money = 3000; - ResetLinkContestBoolean(); - ResetGameStats(); - ResetContestAndMuseumWinners(); - InitLinkBattleRecords(); - InitShroomishSizeRecord(); - InitBarboachSizeRecord(); - gPlayerPartyCount = 0; - ZeroPlayerPartyMons(); - ResetPokemonStorageSystem(); - ClearRoamerData(); - ClearRoamerLocationData(); - gSaveBlock1.registeredItem = 0; - ClearBag(); - NewGameInitPCItems(); - ClearPokeblocks(); - ClearDecorationInventories(); - InitEasyChatPhrases(); - SetupMauvilleOldMan(); - InitDewfordTrend(); - ResetFanClub(); - ResetLotteryCorner(); - WarpToTruck(); - ScriptContext2_RunNewScript(gUnknown_0819FA81); -} - -#if DEBUG -extern void debug_sub_80A3904(void); -extern void debug_sub_80A3714(void); -extern void debug_sub_8120F98(void); -extern void unref_sub_8070F90(void); - -void debug_sub_8057508(bool32 arg0) -{ - gUnknown_020297ED = 1; - NewGameInitData(); - gSaveBlock1.money = 999999; - FlagSet(FLAG_SYS_POKEMON_GET); - FlagSet(FLAG_SYS_POKEDEX_GET); - FlagSet(FLAG_SYS_POKENAV_GET); - FlagSet(FLAG_SYS_B_DASH); - ScriptGiveMon(SPECIES_TREECKO, 99, 0, 0, 0, 0); - - if (arg0 == TRUE) - SetMonData(&gPlayerParty[0], MON_DATA_NICKNAME, gUnknown_Debug_0823C790); - - debug_sub_80A3904(); - debug_sub_80A3714(); - debug_sub_8120F98(); - FlagSet(FLAG_SYS_HIPSTER_MEET); - sub_80EB8EC(); - unref_sub_8070F90(); - InitTimeBasedEvents(); -} -#endif diff --git a/src/scene/title_screen.c b/src/scene/title_screen.c deleted file mode 100644 index a1c8e081d..000000000 --- a/src/scene/title_screen.c +++ /dev/null @@ -1,911 +0,0 @@ -#include "global.h" -#include "gba/m4a_internal.h" -#include "title_screen.h" -#include "clear_save_data_menu.h" -#include "decompress.h" -#include "event_data.h" -#include "intro.h" -#include "m4a.h" -#include "main.h" -#include "main_menu.h" -#include "overworld.h" -#include "palette.h" -#include "reset_rtc_screen.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "scanline_effect.h" - -#if ENGLISH -#define VERSION_BANNER_SHAPE 1 -#define VERSION_BANNER_RIGHT_TILEOFFSET 64 -#define VERSION_BANNER_BYTES 0x1000 -#define VERSION_BANNER_LEFT_X 98 -#define VERSION_BANNER_RIGHT_X 162 -#define VERSION_BANNER_Y 26 -#define VERSION_BANNER_Y_GOAL 66 -#define START_BANNER_X DISPLAY_WIDTH / 2 -#elif GERMAN -#define VERSION_BANNER_SHAPE 0 -#define VERSION_BANNER_RIGHT_TILEOFFSET 128 -#define VERSION_BANNER_BYTES 0x2000 -#define VERSION_BANNER_LEFT_X 108 -#define VERSION_BANNER_RIGHT_X 172 -#ifdef SAPPHIRE -#define VERSION_BANNER_Y_GOAL 83 -#else -#define VERSION_BANNER_Y_GOAL 84 -#endif -#define VERSION_BANNER_Y (VERSION_BANNER_Y_GOAL - 40) -#define START_BANNER_X DISPLAY_WIDTH / 2 - 2 -#endif - -extern u8 gReservedSpritePaletteCount; -extern struct MusicPlayerInfo gMPlay_BGM; -extern u16 gBattle_BG1_Y; -extern u16 gBattle_BG1_X; -extern const u8 gUnknown_08E9D8CC[]; -extern const u16 gUnknown_08E9F624[]; -extern const u8 gUnknown_08E9F7E4[]; -extern const u8 gVersionTiles[]; -extern const u8 gTitleScreenPressStart_Gfx[]; -extern const u16 gTitleScreenLogoShinePalette[]; - -static EWRAM_DATA u8 gUnknown_0202F7E4 = 0; - -#ifdef SAPPHIRE -static const u16 sLegendaryMonPalettes[][16] = -{ - INCBIN_U16("graphics/title_screen/kyogre_dark.gbapal"), - INCBIN_U16("graphics/title_screen/kyogre_glow.gbapal"), -}; -static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/kyogre.4bpp.lz"); -static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/kyogre_map.bin.lz"); -static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/water_map.bin.lz"); -#else -static const u16 sLegendaryMonPalettes[][16] = -{ - INCBIN_U16("graphics/title_screen/groudon_dark.gbapal"), - INCBIN_U16("graphics/title_screen/groudon_glow.gbapal"), -}; -static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/groudon.4bpp.lz"); -static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/groudon_map.bin.lz"); -static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/lava_map.bin.lz"); -#endif -static const u8 sLogoShineTiles[] = INCBIN_U8("graphics/title_screen/logo_shine.4bpp.lz"); -const u16 gUnknown_08393E64[] = -{ - 0x10, - 0x110, - 0x210, - 0x310, - 0x410, - 0x510, - 0x610, - 0x710, - 0x810, - 0x910, - 0xA10, - 0xB10, - 0xC10, - 0xD10, - 0xE10, - 0xF10, - 0x100F, - 0x100E, - 0x100D, - 0x100C, - 0x100B, - 0x100A, - 0x1009, - 0x1008, - 0x1007, - 0x1006, - 0x1005, - 0x1004, - 0x1003, - 0x1002, - 0x1001, - 0x1000, -}; -static const struct OamData sVersionBannerLeftOamData = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 1, - .shape = VERSION_BANNER_SHAPE, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const struct OamData sVersionBannerRightOamData = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 1, - .shape = VERSION_BANNER_SHAPE, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd sVersionBannerLeftAnimSequence[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; -static const union AnimCmd sVersionBannerRightAnimSequence[] = -{ - ANIMCMD_FRAME(VERSION_BANNER_RIGHT_TILEOFFSET, 30), - ANIMCMD_END, -}; -static const union AnimCmd *const sVersionBannerLeftAnimTable[] = -{ - sVersionBannerLeftAnimSequence, -}; -static const union AnimCmd *const sVersionBannerRightAnimTable[] = -{ - sVersionBannerRightAnimSequence, -}; -static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate = -{ - .tileTag = 1000, - .paletteTag = 1000, - .oam = &sVersionBannerLeftOamData, - .anims = sVersionBannerLeftAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallback_VersionBannerLeft, -}; -static const struct SpriteTemplate sVersionBannerRightSpriteTemplate = -{ - .tileTag = 1000, - .paletteTag = 1000, - .oam = &sVersionBannerRightOamData, - .anims = sVersionBannerRightAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallback_VersionBannerRight, -}; -static const struct CompressedSpriteSheet gUnknown_08393EFC[] = -{ - {gVersionTiles, VERSION_BANNER_BYTES, 1000}, - {NULL}, -}; -static const struct OamData gOamData_8393F0C = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd gSpriteAnim_8393F14[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F1C[] = -{ - ANIMCMD_FRAME(4, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F24[] = -{ - ANIMCMD_FRAME(8, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F2C[] = -{ - ANIMCMD_FRAME(12, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F34[] = -{ - ANIMCMD_FRAME(16, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F3C[] = -{ - ANIMCMD_FRAME(20, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F44[] = -{ - ANIMCMD_FRAME(24, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_8393F4C[] = -{ - ANIMCMD_FRAME(28, 4), - ANIMCMD_END, -}; -#if GERMAN -static const union AnimCmd gSpriteAnim_839F73C[] = -{ - ANIMCMD_FRAME(32, 4), - ANIMCMD_END, -}; -static const union AnimCmd gSpriteAnim_839F744[] = -{ - ANIMCMD_FRAME(36, 4), - ANIMCMD_END, -}; -#endif -static const union AnimCmd *const sStartCopyrightBannerAnimTable[] = -{ - gSpriteAnim_8393F14, - gSpriteAnim_8393F1C, - gSpriteAnim_8393F24, - gSpriteAnim_8393F2C, - gSpriteAnim_8393F34, - gSpriteAnim_8393F3C, - gSpriteAnim_8393F44, - gSpriteAnim_8393F4C, -#if GERMAN - gSpriteAnim_839F73C, - gSpriteAnim_839F744, -#endif -}; -static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate = -{ - .tileTag = 1001, - .paletteTag = 1001, - .oam = &gOamData_8393F0C, - .anims = sStartCopyrightBannerAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallback_PressStartCopyrightBanner, -}; -static const struct CompressedSpriteSheet gUnknown_08393F8C[] = -{ - {gTitleScreenPressStart_Gfx, 0x520, 1001}, - {NULL}, -}; -const struct SpritePalette sPokemonLogoShinePalette[] = -{ - {gTitleScreenLogoShinePalette, 1001}, - {NULL}, -}; -static const struct OamData sPokemonLogoShineOamData = -{ - .y = 160, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; -static const union AnimCmd sPokemonLogoShineAnimSequence[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_END, -}; -static const union AnimCmd *const sPokemonLogoShineAnimTable[] = -{ - sPokemonLogoShineAnimSequence, -}; -static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate = -{ - .tileTag = 1002, - .paletteTag = 1001, - .oam = &sPokemonLogoShineOamData, - .anims = sPokemonLogoShineAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallback_PokemonLogoShine, -}; -static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] = -{ - {sLogoShineTiles, 0x800, 1002}, - {NULL}, -}; - -#define _RGB(r, g, b) ((((b) & 31) << 10) + (((g) & 31) << 5) + ((r) & 31)) - -#ifdef SAPPHIRE -//Red Kyogre markings -#define LEGENDARY_MARKING_COLOR(c) RGB((c), 0, 0) -#else -//Blue Groundon markings -#define LEGENDARY_MARKING_COLOR(c) RGB(0, 0, (c)) -#endif - -#if defined(GERMAN) && defined(SAPPHIRE) -#define PLTT_BUFFER_INDEX 9 -#elif defined(SAPPHIRE) -#define PLTT_BUFFER_INDEX 26 -#else -#define PLTT_BUFFER_INDEX 21 -#endif - -#define CLEAR_SAVE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_UP) -#define RESET_RTC_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_LEFT) -#define A_B_START_SELECT (A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON) - -static void MainCB2(void); -static void Task_TitleScreenPhase1(u8); -static void Task_TitleScreenPhase2(u8); -static void Task_TitleScreenPhase3(u8); -static void CB2_GoToMainMenu(void); -#if DEBUG -static void CB2_GoToTestMenu(void); -#endif -static void CB2_GoToClearSaveDataScreen(void); -static void CB2_GoToResetRtcScreen(void); -static void CB2_GoToCopyrightScreen(void); -static void UpdateLegendaryMarkingColor(u8); - -void SpriteCallback_VersionBannerLeft(struct Sprite *sprite) -{ - struct Task *task = &gTasks[sprite->data[1]]; - - if (task->data[1] != 0) - { - sprite->oam.objMode = 0; - sprite->pos1.y = VERSION_BANNER_Y_GOAL; - sprite->invisible = FALSE; - } - else - { - if (task->data[5] != 0) - task->data[5]--; - if (task->data[5] < 64) - { - sprite->invisible = FALSE; - if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) - sprite->pos1.y++; - REG_BLDALPHA = gUnknown_08393E64[task->data[5] / 2]; - } - } -} - -void SpriteCallback_VersionBannerRight(struct Sprite *sprite) -{ - struct Task *task = &gTasks[sprite->data[1]]; - - if (task->data[1] != 0) - { - sprite->oam.objMode = 0; - sprite->pos1.y = VERSION_BANNER_Y_GOAL; - sprite->invisible = FALSE; - } - else - { - if (task->data[5] < 64) - { - sprite->invisible = FALSE; - if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) - sprite->pos1.y++; - } - } -} - -void SpriteCallback_PressStartCopyrightBanner(struct Sprite *sprite) -{ - if (sprite->data[0] == 1) - { - sprite->data[1]++; - //Alternate between hidden and shown every 16th frame - if (sprite->data[1] & 16) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - } - else - sprite->invisible = FALSE; -} - -#if ENGLISH -static void CreatePressStartBanner(s16 x, s16 y) -{ - u8 i; - u8 spriteId; - - x -= 32; - for (i = 0; i < 3; i++, x += 32) - { - spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); - StartSpriteAnim(&gSprites[spriteId], i); - gSprites[spriteId].data[0] = 1; - } -} -#elif GERMAN -__attribute__((naked)) -static void CreatePressStartBanner(s16 x, s16 y) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - lsls r0, 16\n\ - ldr r2, _0807C3AC @ =0xffe00000\n\ - adds r0, r2\n\ - lsrs r0, 16\n\ - movs r6, 0\n\ - lsls r1, 16\n\ - mov r10, r1\n\ - mov r8, r10\n\ -_0807C302:\n\ - lsls r5, r0, 16\n\ - asrs r5, 16\n\ - ldr r0, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ - adds r1, r5, 0\n\ - mov r3, r8\n\ - asrs r2, r3, 16\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 4\n\ - adds r4, r0\n\ - lsls r4, 2\n\ - ldr r0, _0807C3B4 @ =gSprites\n\ - mov r9, r0\n\ - add r4, r9\n\ - adds r0, r4, 0\n\ - adds r1, r6, 0\n\ - bl StartSpriteAnim\n\ - movs r7, 0x1\n\ - strh r7, [r4, 0x2E]\n\ - adds r0, r6, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - adds r5, 0x20\n\ - lsls r5, 16\n\ - lsrs r0, r5, 16\n\ - cmp r6, 0x2\n\ - bls _0807C302\n\ - ldr r1, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ - mov r8, r1\n\ - lsls r5, r0, 16\n\ - asrs r5, 16\n\ - mov r2, r10\n\ - asrs r6, r2, 16\n\ - mov r0, r8\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 4\n\ - adds r4, r0\n\ - lsls r4, 2\n\ - add r4, r9\n\ - adds r0, r4, 0\n\ - movs r1, 0x8\n\ - bl StartSpriteAnim\n\ - strh r7, [r4, 0x2E]\n\ - subs r5, 0x60\n\ - lsls r5, 16\n\ - asrs r5, 16\n\ - subs r6, 0x8\n\ - lsls r6, 16\n\ - asrs r6, 16\n\ - mov r0, r8\n\ - adds r1, r5, 0\n\ - adds r2, r6, 0\n\ - movs r3, 0\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 4\n\ - adds r4, r0\n\ - lsls r4, 2\n\ - add r4, r9\n\ - adds r0, r4, 0\n\ - movs r1, 0x9\n\ - bl StartSpriteAnim\n\ - strh r7, [r4, 0x2E]\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0807C3AC: .4byte 0xffe00000\n\ -_0807C3B0: .4byte sStartCopyrightBannerSpriteTemplate\n\ -_0807C3B4: .4byte gSprites\n\ - .syntax divided\n"); -} -#endif - -static void CreateCopyrightBanner(s16 x, s16 y) -{ - u8 i; - u8 spriteId; - - x -= 64; - for (i = 0; i < 5; i++, x += 32) - { - spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); - StartSpriteAnim(&gSprites[spriteId], i + 3); - } -} - -void SpriteCallback_PokemonLogoShine(struct Sprite *sprite) -{ - if (gTasks[gUnknown_0202F7E4].data[1] == 0 && sprite->pos1.x < 272) - { - if (sprite->data[0]) //Flash background - { - u16 backgroundColor; - - if (sprite->pos1.x < DISPLAY_WIDTH / 2) - { - //Brighten background color - if (sprite->data[1] < 31) - sprite->data[1]++; - if (sprite->data[1] < 31) - sprite->data[1]++; - } - else - { - //Darken background color - if (sprite->data[1] != 0) - sprite->data[1]--; - if (sprite->data[1] != 0) - sprite->data[1]--; - } - backgroundColor = _RGB(sprite->data[1], sprite->data[1], sprite->data[1]); - gPlttBufferFaded[0] = backgroundColor; - gPlttBufferFaded[PLTT_BUFFER_INDEX] = backgroundColor; - } - sprite->pos1.x += 4; - } - else - { - gPlttBufferFaded[0] = RGB_BLACK; - gPlttBufferFaded[PLTT_BUFFER_INDEX] = RGB_BLACK; - DestroySprite(sprite); - } -} - -static void StartPokemonLogoShine(bool8 flashBackground) -{ - u8 spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); - - gSprites[spriteId].oam.objMode = 2; - gSprites[spriteId].data[0] = flashBackground; -} - -static void VBlankCB(void) -{ - ScanlineEffect_InitHBlankDmaTransfer(); - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - REG_BG1VOFS = gBattle_BG1_Y; -} - - -#define tCounter data[0] -#define tSkipToNext data[1] - -void CB2_InitTitleScreen(void) -{ - switch (gMain.state) - { - default: - case 0: - SetVBlankCallback(NULL); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - *((u16 *)PLTT) = RGB_WHITE; - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, (void *)VRAM, 0x18000); - DmaFill32(3, 0, (void *)OAM, 0x400); - DmaFill16(3, 0, (void *)(PLTT + 2), 0x3FE); - ResetPaletteFade(); - gMain.state = 1; - break; - case 1: - LZ77UnCompVram(gUnknown_08E9D8CC, (void *)VRAM); - LZ77UnCompVram(gUnknown_08E9F7E4, (void *)(VRAM + 0x4800)); - LoadPalette(gUnknown_08E9F624, 0, 0x1C0); - LZ77UnCompVram(sLegendaryMonPixelData, (void *)(VRAM + 0x8000)); - LZ77UnCompVram(sLegendaryMonTilemap, (void *)(VRAM + 0xC000)); - LZ77UnCompVram(sBackdropTilemap, (void *)(VRAM + 0xC800)); - LoadPalette(sLegendaryMonPalettes, 0xE0, sizeof(sLegendaryMonPalettes)); - ScanlineEffect_Stop(); - ResetTasks(); - ResetSpriteData(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 14; - LoadCompressedObjectPic(&gUnknown_08393EFC[0]); - LoadCompressedObjectPic(&gUnknown_08393F8C[0]); - LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]); - LoadPalette(gUnknown_08E9F624, 0x100, 0x1C0); - LoadSpritePalette(&sPokemonLogoShinePalette[0]); - gMain.state = 2; - break; - case 2: - { - u8 taskId = CreateTask(Task_TitleScreenPhase1, 0); - - gTasks[taskId].tCounter = 256; - gTasks[taskId].tSkipToNext = FALSE; - gTasks[taskId].data[2] = -16; - gTasks[taskId].data[3] = -32; - gUnknown_0202F7E4 = taskId; - gMain.state = 3; - break; - } - case 3: - BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF); - SetVBlankCallback(VBlankCB); - gMain.state = 4; - break; - case 4: - { - u16 savedIme; - - sub_813CE30(0x78, 0x50, 0x100, 0); - REG_BG2X = -29 * 256; - REG_BG2Y = -33 * 256; - REG_WIN0H = 0; - REG_WIN0V = 0; - REG_WIN1H = 0; - REG_WIN1V = 0; - REG_WININ = 0x1F1F; - REG_WINOUT = 0x3F1F; - REG_BLDCNT = 0x84; - REG_BLDALPHA = 0; - REG_BLDY = 0x8; - REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(25) | BGCNT_16COLOR | BGCNT_TXT256x256; - REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_256COLOR | BGCNT_AFF256x256; - savedIme = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = savedIme; - REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; - REG_DISPCNT = DISPCNT_MODE_1 - | DISPCNT_OBJ_1D_MAP - | DISPCNT_BG2_ON - | DISPCNT_OBJ_ON - | DISPCNT_WIN0_ON - | DISPCNT_OBJWIN_ON; - m4aSongNumStart(0x19D); - gMain.state = 5; - break; - } - case 5: - if (!UpdatePaletteFade()) - { - StartPokemonLogoShine(FALSE); - ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 0, SCANLINE_EFFECT_REG_BG1HOFS, TRUE); - SetMainCallback2(MainCB2); - } - break; - } -} - -static void MainCB2(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -//Shine the Pokemon logo two more times, and fade in the version banner -static void Task_TitleScreenPhase1(u8 taskId) -{ - //Skip to next phase when A, B, Start, or Select is pressed - if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].data[1] != 0) - { - gTasks[taskId].tSkipToNext = TRUE; - gTasks[taskId].tCounter = 0; - } - - if (gTasks[taskId].tCounter != 0) - { - u16 frameNum = gTasks[taskId].tCounter; - - if (frameNum == 160 || frameNum == 64) - StartPokemonLogoShine(TRUE); - gTasks[taskId].tCounter--; - } - else - { - u8 spriteId; - - REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - REG_WININ = 0; - REG_WINOUT = 0; - REG_BLDCNT = 0x3F50; - REG_BLDALPHA = 0x1F; - REG_BLDY = 0; - - //Create left side of version banner - spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0); - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[1] = taskId; - - //Create right side of version banner - spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0); - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[1] = taskId; - - gTasks[taskId].data[5] = 88; - gTasks[taskId].tCounter = 144; - gTasks[taskId].func = Task_TitleScreenPhase2; - } -} - -//Create "Press Start" and copyright banners, and slide Pokemon logo up -static void Task_TitleScreenPhase2(u8 taskId) -{ - //Skip to next phase when A, B, Start, or Select is pressed - if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].tSkipToNext) - { - gTasks[taskId].tSkipToNext = TRUE; - gTasks[taskId].tCounter = 0; - } - - if (gTasks[taskId].tCounter != 0) - gTasks[taskId].tCounter--; - else - { - gTasks[taskId].tSkipToNext = TRUE; - REG_DISPCNT = DISPCNT_MODE_1 - | DISPCNT_OBJ_1D_MAP - | DISPCNT_BG0_ON - | DISPCNT_BG1_ON - | DISPCNT_BG2_ON - | DISPCNT_OBJ_ON; - CreatePressStartBanner(START_BANNER_X, 108); - CreateCopyrightBanner(DISPLAY_WIDTH / 2, 148); - gTasks[taskId].data[4] = 0; - gTasks[taskId].func = Task_TitleScreenPhase3; - } - - if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0) - gTasks[taskId].data[3]++; - - //Slide Pokemon logo up - REG_BG2Y = gTasks[taskId].data[3] * 256; -} - -//Show Kyogre/Groundon silhouette and process main title screen input -static void Task_TitleScreenPhase3(u8 taskId) -{ - REG_BLDCNT = 0x2142; - REG_BLDALPHA = 0x1F0F; - REG_BLDY = 0; - - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & START_BUTTON)) - { - FadeOutBGM(4); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); - SetMainCallback2(CB2_GoToMainMenu); - } - else - { - if ((gMain.heldKeys & CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO) - SetMainCallback2(CB2_GoToClearSaveDataScreen); - if ((gMain.heldKeys & RESET_RTC_BUTTON_COMBO) == RESET_RTC_BUTTON_COMBO - && CanResetRTC() == 1) - { - FadeOutBGM(4); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - SetMainCallback2(CB2_GoToResetRtcScreen); - } -#if DEBUG - else if (gMain.heldKeys == SELECT_BUTTON) - { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - SetMainCallback2(CB2_GoToTestMenu); - } -#endif - else - { - REG_BG2Y = 0; - gTasks[taskId].tCounter++; - if (gTasks[taskId].tCounter & 1) - { - gTasks[taskId].data[4]++; - gBattle_BG1_Y = gTasks[taskId].data[4]; - gBattle_BG1_X = 0; - } - UpdateLegendaryMarkingColor(gTasks[taskId].tCounter); - if ((gMPlay_BGM.status & 0xFFFF) == 0) - { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); - SetMainCallback2(CB2_GoToCopyrightScreen); - } - } - } -} - -static void CB2_GoToMainMenu(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitMainMenu); -} - -#if DEBUG -static void CB2_GoToTestMenu(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitTestMenu); -} -#endif - -static void CB2_GoToCopyrightScreen(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen); -} - -static void CB2_GoToClearSaveDataScreen(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitClearSaveDataScreen); -} - -static void CB2_GoToResetRtcScreen(void) -{ - if (!UpdatePaletteFade()) - SetMainCallback2(CB2_InitResetRtcScreen); -} - -static void UpdateLegendaryMarkingColor(u8 frameNum) -{ - u16 palette; - - if ((frameNum % 4) == 0) //Change color every 4th frame - { - u8 colorIntensity = (frameNum >> 2) & 31; //Take bits 2-6 of frameNum the color intensity - u8 fadeDarker = (frameNum >> 2) & 32; - - if (!fadeDarker) - palette = LEGENDARY_MARKING_COLOR(colorIntensity); - else - palette = LEGENDARY_MARKING_COLOR(31 - colorIntensity); - LoadPalette(&palette, 0xEF, sizeof(palette)); - } -} - diff --git a/src/scrcmd.c b/src/scrcmd.c new file mode 100644 index 000000000..e5272bc9c --- /dev/null +++ b/src/scrcmd.c @@ -0,0 +1,2019 @@ +#include "global.h" +#include "battle_setup.h" +#include "berry.h" +#include "clock.h" +#include "coins.h" +#include "contest_link_80C2020.h" +#include "contest_painting.h" +#include "data2.h" +#include "decoration.h" +#include "decoration_inventory.h" +#include "event_data.h" +#include "field_door.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "event_object_movement.h" +#include "field_message_box.h" +#include "field_player_avatar.h" +#include "field_screen_effect.h" +#include "field_specials.h" +#include "field_tasks.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "item.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu.h" +#include "money.h" +#include "mystery_event_script.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon.h" +#include "random.h" +#include "overworld.h" +#include "rtc.h" +#include "script.h" +#include "script_menu.h" +#include "script_movement.h" +#include "script_pokemon_80C4.h" +#include "script_pokemon_80F9.h" +#include "shop.h" +#include "slot_machine.h" +#include "sound.h" +#include "string_util.h" +#include "tv.h" + +typedef u16 (*SpecialFunc)(void); +typedef void (*NativeFunc)(void); + +extern u32 gUnknown_0202E8AC; + +static EWRAM_DATA u32 gUnknown_0202E8B0 = 0; +static EWRAM_DATA u16 sPauseCounter = 0; +static EWRAM_DATA u16 sMovingNpcId = 0; +static EWRAM_DATA u16 sMovingNpcMapBank = 0; +static EWRAM_DATA u16 sMovingNpcMapId = 0; +static EWRAM_DATA u16 sFieldEffectScriptId = 0; + +extern u16 gSpecialVar_0x8000; +extern u16 gSpecialVar_0x8001; +extern u16 gSpecialVar_0x8002; +extern u16 gSpecialVar_0x8004; + +extern u16 gSpecialVar_Result; + +extern u16 gSpecialVar_ContestCategory; + +extern SpecialFunc gSpecials[]; +extern u8 *gStdScripts[]; +extern u8 *gStdScripts_End[]; + +// This is defined in here so the optimizer can't see its value when compiling +// script.c. +void * const gNullScriptPtr = NULL; + +static const u8 sScriptConditionTable[6][3] = +{ +// < = > + 1, 0, 0, // < + 0, 1, 0, // = + 0, 0, 1, // > + 1, 1, 0, // <= + 0, 1, 1, // >= + 1, 0, 1, // != +}; + +static u8 * const sScriptStringVars[] = +{ + gStringVar1, + gStringVar2, + gStringVar3, +}; + +bool8 ScrCmd_nop(struct ScriptContext *ctx) +{ + return FALSE; +} + +bool8 ScrCmd_nop1(struct ScriptContext *ctx) +{ + return FALSE; +} + +bool8 ScrCmd_end(struct ScriptContext *ctx) +{ + StopScript(ctx); + return FALSE; +} + +bool8 ScrCmd_gotonative(struct ScriptContext *ctx) +{ + bool8 (*addr)(void) = (bool8 (*)(void))ScriptReadWord(ctx); + + SetupNativeScript(ctx, addr); + return TRUE; +} + +bool8 ScrCmd_special(struct ScriptContext *ctx) +{ + u16 index = ScriptReadHalfword(ctx); + + gSpecials[index](); + return FALSE; +} + +bool8 ScrCmd_specialvar(struct ScriptContext *ctx) +{ + u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); + + *var = gSpecials[ScriptReadHalfword(ctx)](); + return FALSE; +} + +bool8 ScrCmd_callnative(struct ScriptContext *ctx) +{ + NativeFunc func = (NativeFunc)ScriptReadWord(ctx); + + func(); + return FALSE; +} + +bool8 ScrCmd_waitstate(struct ScriptContext *ctx) +{ + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_goto(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)ScriptReadWord(ctx); + + ScriptJump(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_return(struct ScriptContext *ctx) +{ + ScriptReturn(ctx); + return FALSE; +} + +bool8 ScrCmd_call(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)ScriptReadWord(ctx); + + ScriptCall(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_goto_if(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 *ptr = (u8 *)ScriptReadWord(ctx); + + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + ScriptJump(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_call_if(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 *ptr = (u8 *)ScriptReadWord(ctx); + + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + ScriptCall(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) +{ + u32 addr1 = (u32)ctx->scriptPtr - 1; + u32 addr2 = ScriptReadWord(ctx); + + gUnknown_0202E8B0 = addr2 - addr1; + return FALSE; +} + +bool8 ScrCmd_vgoto(struct ScriptContext *ctx) +{ + u32 addr = ScriptReadWord(ctx); + + ScriptJump(ctx, (u8 *)(addr - gUnknown_0202E8B0)); + return FALSE; +} + +bool8 ScrCmd_vcall(struct ScriptContext *ctx) +{ + u32 addr = ScriptReadWord(ctx); + + ScriptCall(ctx, (u8 *)(addr - gUnknown_0202E8B0)); + return FALSE; +} + +bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + ScriptJump(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_vcall_if(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + ScriptCall(ctx, ptr); + return FALSE; +} + +bool8 ScrCmd_gotostd(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + u8 **ptr = &gStdScripts[index]; + + if (ptr < gStdScripts_End) + ScriptJump(ctx, *ptr); + return FALSE; +} + +bool8 ScrCmd_callstd(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + u8 **ptr = &gStdScripts[index]; + + if (ptr < gStdScripts_End) + ScriptCall(ctx, *ptr); + return FALSE; +} + +bool8 ScrCmd_gotostd_if(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 index = ScriptReadByte(ctx); + + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + { + u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) + ScriptJump(ctx, *ptr); + } + return FALSE; +} + +bool8 ScrCmd_callstd_if(struct ScriptContext *ctx) +{ + u8 condition = ScriptReadByte(ctx); + u8 index = ScriptReadByte(ctx); + + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) + { + u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) + ScriptCall(ctx, *ptr); + } + return FALSE; +} + +bool8 ScrCmd_gotoram(struct ScriptContext *ctx) +{ + ScriptJump(ctx, (u8 *)gUnknown_0202E8AC); + return FALSE; +} + +bool8 ScrCmd_killscript(struct ScriptContext *ctx) +{ + ClearRamScript(); + StopScript(ctx); + return TRUE; +} + +bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext *ctx) +{ + u8 value = ScriptReadByte(ctx); + + SetMysteryEventScriptStatus(value); + return FALSE; +} + +bool8 ScrCmd_loadword(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + + ctx->data[index] = ScriptReadWord(ctx); + return FALSE; +} + +bool8 ScrCmd_loadbytefromaddr(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + + ctx->data[index] = *(u8 *)ScriptReadWord(ctx); + return FALSE; +} + +bool8 ScrCmd_writebytetoaddr(struct ScriptContext *ctx) +{ + u8 value = ScriptReadByte(ctx); + + *(u8 *)ScriptReadWord(ctx) = value; + return FALSE; +} + +bool8 ScrCmd_loadbyte(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + + ctx->data[index] = ScriptReadByte(ctx); + return FALSE; +} + +bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx) +{ + u8 index = ScriptReadByte(ctx); + + *(u8 *)ScriptReadWord(ctx) = ctx->data[index]; + return FALSE; +} + +bool8 ScrCmd_copylocal(struct ScriptContext *ctx) +{ + u8 destIndex = ScriptReadByte(ctx); + u8 srcIndex = ScriptReadByte(ctx); + + ctx->data[destIndex] = ctx->data[srcIndex]; + return FALSE; +} + +bool8 ScrCmd_copybyte(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)ScriptReadWord(ctx); + *ptr = *(u8 *)ScriptReadWord(ctx); + return FALSE; +} + +bool8 ScrCmd_setvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr = ScriptReadHalfword(ctx); + return FALSE; +} + +bool8 ScrCmd_copyvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr = *GetVarPointer(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_setorcopyvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr = VarGet(ScriptReadHalfword(ctx)); + return FALSE; +} + +u8 compare_012(u16 a1, u16 a2) +{ + if (a1 < a2) + return 0; + if (a1 == a2) + return 1; + return 2; +} + +// comparelocaltolocal +bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx) +{ + u8 value1 = ctx->data[ScriptReadByte(ctx)]; + u8 value2 = ctx->data[ScriptReadByte(ctx)]; + + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +// comparelocaltoimm +bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx) +{ + u8 value1 = ctx->data[ScriptReadByte(ctx)]; + u8 value2 = ScriptReadByte(ctx); + + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compare_local_to_addr(struct ScriptContext *ctx) +{ + u8 value1 = ctx->data[ScriptReadByte(ctx)]; + u8 value2 = *(u8 *)ScriptReadWord(ctx); + + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx) +{ + u8 value1 = *(u8 *)ScriptReadWord(ctx); + u8 value2 = ctx->data[ScriptReadByte(ctx)]; + + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compare_addr_to_value(struct ScriptContext *ctx) +{ + u8 value1 = *(u8 *)ScriptReadWord(ctx); + u8 value2 = ScriptReadByte(ctx); + + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx) +{ + u8 value1 = *(u8 *)ScriptReadWord(ctx); + u8 value2 = *(u8 *)ScriptReadWord(ctx); + + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx) +{ + u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); + u16 value2 = ScriptReadHalfword(ctx); + + ctx->comparisonResult = compare_012(value1, value2); + return FALSE; +} + +bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx) +{ + u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); + u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); + + ctx->comparisonResult = compare_012(*ptr1, *ptr2); + return FALSE; +} + +bool8 ScrCmd_addvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr += ScriptReadHalfword(ctx); + return FALSE; +} + +bool8 ScrCmd_subvar(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr -= VarGet(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_random(struct ScriptContext *ctx) +{ + u16 max = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = Random() % max; + return FALSE; +} + +bool8 ScrCmd_giveitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u32 quantity = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = AddBagItem(itemId, (u8)quantity); + return FALSE; +} + +bool8 ScrCmd_takeitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u32 quantity = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = RemoveBagItem(itemId, (u8)quantity); + return FALSE; +} + +bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u32 quantity = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = CheckBagHasSpace(itemId, (u8)quantity); + return FALSE; +} + +bool8 ScrCmd_checkitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u32 quantity = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = CheckBagHasItem(itemId, (u8)quantity); + return FALSE; +} + +bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = GetPocketByItemId(itemId); + return FALSE; +} + +bool8 ScrCmd_givepcitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u16 quantity = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = AddPCItem(itemId, quantity); + return FALSE; +} + +bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) +{ + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + u16 quantity = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = CheckPCHasItem(itemId, quantity); + return FALSE; +} + +bool8 ScrCmd_givedecoration(struct ScriptContext *ctx) +{ + u32 decoration = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = IsThereStorageSpaceForDecoration(decoration); + return FALSE; +} + +bool8 ScrCmd_takedecoration(struct ScriptContext *ctx) +{ + u32 decoration = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = sub_81340A8(decoration); + return FALSE; +} + +bool8 ScrCmd_checkdecorspace(struct ScriptContext *ctx) +{ + u32 decorId = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = sub_8134074(decorId); + return FALSE; +} + +bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) +{ + u32 decorId = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = sub_8133FE4(decorId); + return FALSE; +} + +bool8 ScrCmd_setflag(struct ScriptContext *ctx) +{ + FlagSet(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_clearflag(struct ScriptContext *ctx) +{ + FlagClear(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_checkflag(struct ScriptContext *ctx) +{ + ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_incrementgamestat(struct ScriptContext *ctx) +{ + IncrementGameStat(ScriptReadByte(ctx)); + return FALSE; +} + +bool8 ScrCmd_animateflash(struct ScriptContext *ctx) +{ + sub_8081594(ScriptReadByte(ctx)); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_setflashradius(struct ScriptContext *ctx) +{ + u16 flashLevel = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetFlashLevel(flashLevel); + return FALSE; +} + +bool8 IsPaletteNotActive(void) +{ + if (!gPaletteFade.active) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) +{ + FadeScreen(ScriptReadByte(ctx), 0); + SetupNativeScript(ctx, IsPaletteNotActive); + return TRUE; +} + +bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) +{ + u8 duration = ScriptReadByte(ctx); + u8 delay = ScriptReadByte(ctx); + + FadeScreen(duration, delay); + SetupNativeScript(ctx, IsPaletteNotActive); + return TRUE; +} + +bool8 RunPauseTimer() +{ + sPauseCounter--; + + if (sPauseCounter == 0) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_delay(struct ScriptContext *ctx) +{ + sPauseCounter = ScriptReadHalfword(ctx); + SetupNativeScript(ctx, RunPauseTimer); + return TRUE; +} + +bool8 ScrCmd_initclock(struct ScriptContext *ctx) +{ + u8 hour = VarGet(ScriptReadHalfword(ctx)); + u8 minute = VarGet(ScriptReadHalfword(ctx)); + + RtcInitLocalTimeOffset(hour, minute); + return FALSE; +} + +bool8 ScrCmd_dodailyevents(struct ScriptContext *ctx) +{ + DoTimeBasedEvents(); + return FALSE; +} + +bool8 ScrCmd_gettime(struct ScriptContext *ctx) +{ + RtcCalcLocalTime(); + gSpecialVar_0x8000 = gLocalTime.hours; + gSpecialVar_0x8001 = gLocalTime.minutes; + gSpecialVar_0x8002 = gLocalTime.seconds; + return FALSE; +} + +bool8 ScrCmd_setweather(struct ScriptContext *ctx) +{ + u16 weather = VarGet(ScriptReadHalfword(ctx)); + + SetSav1Weather(weather); + return FALSE; +} + +bool8 ScrCmd_resetweather(struct ScriptContext *ctx) +{ + SetSav1WeatherFromCurrMapHeader(); + return FALSE; +} + +bool8 ScrCmd_doweather(struct ScriptContext *ctx) +{ + DoCurrentWeather(); + return FALSE; +} + +bool8 ScrCmd_setstepcallback(struct ScriptContext *ctx) +{ + ActivatePerStepCallback(ScriptReadByte(ctx)); + return FALSE; +} + +bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx) +{ + u16 value = VarGet(ScriptReadHalfword(ctx)); + + sub_8053D14(value); + return FALSE; +} + +bool8 ScrCmd_warp(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + sub_8080E88(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warpsilent(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + sp13E_warp_to_last_warp(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warpdoor(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + sub_8080EF0(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warphole(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u16 x; + u16 y; + + PlayerGetDestCoords(&x, &y); + if (mapGroup == 0xFF && mapNum == 0xFF) + sub_8053720(x - 7, y - 7); + else + Overworld_SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7); + sp13F_fall_to_last_warp(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + sub_8080F68(); + player_avatar_init_params_reset(); + return TRUE; +} + +bool8 ScrCmd_setwarp(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + return FALSE; +} + +bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + saved_warp2_set_2(0, mapGroup, mapNum, warpId, x, y); + return FALSE; +} + +bool8 ScrCmd_setdivewarp(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_8053690(mapGroup, mapNum, warpId, x, y); + return FALSE; +} + +bool8 ScrCmd_setholewarp(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_80536E4(mapGroup, mapNum, warpId, x, y); + return FALSE; +} + +bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx) +{ + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_805363C(mapGroup, mapNum, warpId, x, y); + return FALSE; +} + +bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx) +{ + u16 *pX = GetVarPointer(ScriptReadHalfword(ctx)); + u16 *pY = GetVarPointer(ScriptReadHalfword(ctx)); + + *pX = gSaveBlock1.pos.x; + *pY = gSaveBlock1.pos.y; + return FALSE; +} + +bool8 ScrCmd_getpartysize(struct ScriptContext *ctx) +{ + gSpecialVar_Result = CalculatePlayerPartyCount(); + return FALSE; +} + +bool8 ScrCmd_playse(struct ScriptContext *ctx) +{ + PlaySE(ScriptReadHalfword(ctx)); + return FALSE; +} + +static bool8 WaitForSoundEffectFinish(void) +{ + if (!IsSEPlaying()) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_waitse(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, WaitForSoundEffectFinish); + return TRUE; +} + +bool8 ScrCmd_playfanfare(struct ScriptContext *ctx) +{ + PlayFanfare(ScriptReadHalfword(ctx)); + return FALSE; +} + +static bool8 WaitForFanfareFinish(void) +{ + return IsFanfareTaskInactive(); +} + +bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, WaitForFanfareFinish); + return TRUE; +} + +bool8 ScrCmd_playbgm(struct ScriptContext *ctx) +{ + u16 songId = ScriptReadHalfword(ctx); + bool8 val = ScriptReadByte(ctx); + + if (val == TRUE) + Overworld_SetSavedMusic(songId); + PlayNewMapMusic(songId); + return FALSE; +} + +bool8 ScrCmd_savebgm(struct ScriptContext *ctx) +{ + Overworld_SetSavedMusic(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_fadedefaultbgm(struct ScriptContext *ctx) +{ + Overworld_ChangeMusicToDefault(); + return FALSE; +} + +bool8 ScrCmd_fadenewbgm(struct ScriptContext *ctx) +{ + Overworld_ChangeMusicTo(ScriptReadHalfword(ctx)); + return FALSE; +} + +bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx) +{ + u8 speed = ScriptReadByte(ctx); + + if (speed != 0) + FadeOutBGMTemporarily(4 * speed); + else + FadeOutBGMTemporarily(4); + SetupNativeScript(ctx, IsBGMPausedOrStopped); + return TRUE; +} + +bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx) +{ + u8 speed = ScriptReadByte(ctx); + + if (speed != 0) + FadeInBGM(4 * speed); + else + FadeInBGM(4); + return FALSE; +} + +bool8 ScrCmd_applymovement(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + void *movementScript = (void *)ScriptReadWord(ctx); + + ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, movementScript); + sMovingNpcId = localId; + return FALSE; +} + +bool8 ScrCmd_applymovement_at(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + void *movementScript = (void *)ScriptReadWord(ctx); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + ScriptMovement_StartObjectMovementScript(localId, mapNum, mapGroup, movementScript); + sMovingNpcId = localId; + return FALSE; +} + +static bool8 WaitForMovementFinish(void) +{ + return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapId, sMovingNpcMapBank); +} + +bool8 ScrCmd_waitmovement(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + + if (localId != 0) + sMovingNpcId = localId; + sMovingNpcMapBank = gSaveBlock1.location.mapGroup; + sMovingNpcMapId = gSaveBlock1.location.mapNum; + SetupNativeScript(ctx, WaitForMovementFinish); + return TRUE; +} + +bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapBank; + u8 mapId; + + if (localId != 0) + sMovingNpcId = localId; + mapBank = ScriptReadByte(ctx); + mapId = ScriptReadByte(ctx); + sMovingNpcMapBank = mapBank; + sMovingNpcMapId = mapId; + SetupNativeScript(ctx, WaitForMovementFinish); + return TRUE; +} + +bool8 ScrCmd_removeobject(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + + RemoveFieldObjectByLocalIdAndMap(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + return FALSE; +} + +bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx) +{ + u16 objectId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup); + return FALSE; +} + +bool8 ScrCmd_addobject(struct ScriptContext *ctx) +{ + u16 objectId = VarGet(ScriptReadHalfword(ctx)); + + show_sprite(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + return FALSE; +} + +bool8 ScrCmd_addobject_at(struct ScriptContext *ctx) +{ + u16 objectId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + show_sprite(objectId, mapNum, mapGroup); + return FALSE; +} + +bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_805C0F8(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); + return FALSE; +} + +bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetMapObjTemplateCoords(localId, x, y); + return FALSE; +} + +bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + + sub_805C78C(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + return FALSE; +} + +bool8 ScrCmd_showobjectat(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 0); + return FALSE; +} + +bool8 ScrCmd_hideobjectat(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 1); + return FALSE; +} + +bool8 ScrCmd_setobjectpriority(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 priority = ScriptReadByte(ctx); + + sub_805BCF0(localId, mapNum, mapGroup, priority + 83); + return FALSE; +} + +bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + sub_805BD48(localId, mapNum, mapGroup); + return FALSE; +} + +bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) +{ + if (gMapObjects[gSelectedMapObject].active) + { + FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], + player_get_direction_lower_nybble()); + } + return FALSE; +} + +bool8 ScrCmd_turnobject(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 direction = ScriptReadByte(ctx); + + FieldObjectTurnByLocalIdAndMap(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, direction); + return FALSE; +} + +bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx) +{ + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 movementType = ScriptReadByte(ctx); + + Overworld_SetMapObjTemplateMovementType(localId, movementType); + return FALSE; +} + +bool8 ScrCmd_createvobject(struct ScriptContext *ctx) +{ + u8 graphicsId = ScriptReadByte(ctx); + u8 v2 = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u32 y = VarGet(ScriptReadHalfword(ctx)); + u8 elevation = ScriptReadByte(ctx); + u8 direction = ScriptReadByte(ctx); + + sub_805B410(graphicsId, v2, x, y, elevation, direction); + return FALSE; +} + +bool8 ScrCmd_turnvobject(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + u8 direction = ScriptReadByte(ctx); + + sub_8064990(v1, direction); + return FALSE; +} + +bool8 ScrCmd_lockall(struct ScriptContext *ctx) +{ + if (is_c1_link_related_active()) + { + return FALSE; + } + else + { + ScriptFreezeMapObjects(); + SetupNativeScript(ctx, sub_8064CFC); + return TRUE; + } +} + +bool8 ScrCmd_lock(struct ScriptContext *ctx) +{ + if (is_c1_link_related_active()) + { + return FALSE; + } + else + { + if (gMapObjects[gSelectedMapObject].active) + { + LockSelectedMapObject(); + SetupNativeScript(ctx, sub_8064DB4); + } + else + { + ScriptFreezeMapObjects(); + SetupNativeScript(ctx, sub_8064CFC); + } + return TRUE; + } +} + +bool8 ScrCmd_releaseall(struct ScriptContext *ctx) +{ + u8 objectId; + + HideFieldMessageBox(); + objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + sub_80A2178(); + UnfreezeMapObjects(); + return FALSE; +} + +bool8 ScrCmd_release(struct ScriptContext *ctx) +{ + u8 objectId; + + HideFieldMessageBox(); + if (gMapObjects[gSelectedMapObject].active) + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); + objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + sub_80A2178(); + UnfreezeMapObjects(); + return FALSE; +} + +bool8 ScrCmd_message(struct ScriptContext *ctx) +{ + u8 *msg = (u8 *)ScriptReadWord(ctx); + + if (msg == NULL) + msg = (u8 *)ctx->data[0]; + ShowFieldMessage(msg); + return FALSE; +} + +bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx) +{ + u8 *msg = (u8 *)ScriptReadWord(ctx); + + if (msg == NULL) + msg = (u8 *)ctx->data[0]; + ShowFieldAutoScrollMessage(msg); + return FALSE; +} + +bool8 ScrCmd_waitmessage(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, IsFieldMessageBoxHidden); + return TRUE; +} + +bool8 ScrCmd_closemessage(struct ScriptContext *ctx) +{ + HideFieldMessageBox(); + return FALSE; +} + +static bool8 WaitForAorBPress(void) +{ + if (gMain.newKeys & A_BUTTON) + return TRUE; + if (gMain.newKeys & B_BUTTON) + return TRUE; + return FALSE; +} + +bool8 ScrCmd_waitbuttonpress(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, WaitForAorBPress); + return TRUE; +} + +bool8 ScrCmd_yesnobox(struct ScriptContext *ctx) +{ + u8 left = ScriptReadByte(ctx); + u8 top = ScriptReadByte(ctx); + + if (ScriptMenu_YesNo(left, top) == TRUE) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_multichoice(struct ScriptContext *ctx) +{ + u8 left = ScriptReadByte(ctx); + u8 top = ScriptReadByte(ctx); + u8 multichoiceId = ScriptReadByte(ctx); + u8 ignoreBPress = ScriptReadByte(ctx); + + if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx) +{ + u8 left = ScriptReadByte(ctx); + u8 top = ScriptReadByte(ctx); + u8 multichoiceId = ScriptReadByte(ctx); + u8 defaultChoice = ScriptReadByte(ctx); + u8 ignoreBPress = ScriptReadByte(ctx); + + if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_drawbox(struct ScriptContext *ctx) +{ + u8 left = ScriptReadByte(ctx); + u8 top = ScriptReadByte(ctx); + u8 right = ScriptReadByte(ctx); + u8 bottom = ScriptReadByte(ctx); + + Menu_DrawStdWindowFrame(left, top, right, bottom); + return FALSE; +} + +bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx) +{ + u8 left = ScriptReadByte(ctx); + u8 top = ScriptReadByte(ctx); + u8 multichoiceId = ScriptReadByte(ctx); + u8 numColumns = ScriptReadByte(ctx); + u8 ignoreBPress = ScriptReadByte(ctx); + + if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_erasebox(struct ScriptContext *ctx) +{ + u8 left = ScriptReadByte(ctx); + u8 top = ScriptReadByte(ctx); + u8 right = ScriptReadByte(ctx); + u8 bottom = ScriptReadByte(ctx); + + Menu_EraseWindowRect(left, top, right, bottom); + return FALSE; +} + +// unused +bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx) +{ + u8 left = ScriptReadByte(ctx); + u8 top = ScriptReadByte(ctx); + u8 multichoiceId = ScriptReadByte(ctx); + u8 ignoreBPress = ScriptReadByte(ctx); + + if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) + { + ScriptContext1_Stop(); + return TRUE; + } + else + { + return FALSE; + } +} + +bool8 ScrCmd_drawmonpic(struct ScriptContext *ctx) +{ + u16 species = VarGet(ScriptReadHalfword(ctx)); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + ScriptMenu_ShowPokemonPic(species, x, y); + return FALSE; +} + +bool8 ScrCmd_erasemonpic(struct ScriptContext *ctx) +{ + bool8 (*func)(void) = ScriptMenu_GetPicboxWaitFunc(); + + if (func == NULL) + return FALSE; + SetupNativeScript(ctx, func); + return TRUE; +} + +bool8 ScrCmd_drawcontestwinner(struct ScriptContext *ctx) +{ + u8 v1 = ScriptReadByte(ctx); + + if (v1) + sub_8106630(v1); + ShowContestWinner(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)ScriptReadWord(ctx); + + u8 v2 = ptr[0]; + u8 v3 = ptr[1]; + u8 v4 = ptr[2]; + u8 v5 = ptr[3]; + u8 v6 = ptr[4]; + u8 v7 = ptr[5]; + StringBraille(gStringVar4, ptr + 6); + Menu_DrawStdWindowFrame(v2, v3, v4, v5); + Menu_PrintText(gStringVar4, v6, v7); + return FALSE; +} + +bool8 ScrCmd_vmessage(struct ScriptContext *ctx) +{ + u32 v1 = ScriptReadWord(ctx); + + ShowFieldMessage((u8 *)(v1 - gUnknown_0202E8B0)); + return FALSE; +} + +bool8 ScrCmd_bufferspeciesname(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 species = VarGet(ScriptReadHalfword(ctx)); + + StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]); + return FALSE; +} + +bool8 ScrCmd_bufferleadmonspeciesname(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + + u8 *dest = sScriptStringVars[stringVarIndex]; + u8 partyIndex = GetLeadMonIndex(); + u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); + StringCopy(dest, gSpeciesNames[species]); + return FALSE; +} + +bool8 ScrCmd_bufferpartymonnick(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); + + GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); + StringGetEnd10(sScriptStringVars[stringVarIndex]); + return FALSE; +} + +bool8 ScrCmd_bufferitemname(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 itemId = VarGet(ScriptReadHalfword(ctx)); + + CopyItemName(itemId, sScriptStringVars[stringVarIndex]); + return FALSE; +} + +bool8 ScrCmd_bufferdecorationname(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 decorId = VarGet(ScriptReadHalfword(ctx)); + + StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name); + return FALSE; +} + +bool8 ScrCmd_buffermovename(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 moveId = VarGet(ScriptReadHalfword(ctx)); + + StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]); + return FALSE; +} + +bool8 ScrCmd_buffernumberstring(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 v1 = VarGet(ScriptReadHalfword(ctx)); + u8 v2 = sub_80BF0B8(v1); + + ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2); + return FALSE; +} + +bool8 ScrCmd_bufferstdstring(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u16 index = VarGet(ScriptReadHalfword(ctx)); + + StringCopy(sScriptStringVars[stringVarIndex], gUnknown_083CE048[index]); + return FALSE; +} + +bool8 ScrCmd_bufferstring(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u8 *text = (u8 *)ScriptReadWord(ctx); + + StringCopy(sScriptStringVars[stringVarIndex], text); + return FALSE; +} + +bool8 ScrCmd_vloadptr(struct ScriptContext *ctx) +{ + u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + + StringExpandPlaceholders(gStringVar4, ptr); + return FALSE; +} + +bool8 ScrCmd_vbufferstring(struct ScriptContext *ctx) +{ + u8 stringVarIndex = ScriptReadByte(ctx); + u32 addr = ScriptReadWord(ctx); + + u8 *src = (u8 *)(addr - gUnknown_0202E8B0); + u8 *dest = sScriptStringVars[stringVarIndex]; + StringCopy(dest, src); + return FALSE; +} + +bool8 ScrCmd_givemon(struct ScriptContext *ctx) +{ + u16 species = VarGet(ScriptReadHalfword(ctx)); + u8 level = ScriptReadByte(ctx); + u16 item = VarGet(ScriptReadHalfword(ctx)); + u32 unkParam1 = ScriptReadWord(ctx); + u32 unkParam2 = ScriptReadWord(ctx); + u8 unkParam3 = ScriptReadByte(ctx); + + gSpecialVar_Result = ScriptGiveMon(species, level, item, unkParam1, unkParam2, unkParam3); + return FALSE; +} + +bool8 ScrCmd_giveegg(struct ScriptContext *ctx) +{ + u16 species = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = ScriptGiveEgg(species); + return FALSE; +} + +bool8 ScrCmd_setmonmove(struct ScriptContext *ctx) +{ + u8 partyIndex = ScriptReadByte(ctx); + u8 slot = ScriptReadByte(ctx); + u16 move = ScriptReadHalfword(ctx); + + ScriptSetMonMoveSlot(partyIndex, move, slot); + return FALSE; +} + +bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) +{ + u8 i; + u16 moveId = ScriptReadHalfword(ctx); + + gSpecialVar_Result = 6; + for (i = 0; i < PARTY_SIZE; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); + if (!species) + break; + // UB: GetMonData() arguments don't match function definition + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && pokemon_has_move(&gPlayerParty[i], moveId) == TRUE) + { + gSpecialVar_Result = i; + gSpecialVar_0x8004 = species; + break; + } + } + return FALSE; +} + +bool8 ScrCmd_givemoney(struct ScriptContext *ctx) +{ + u32 amount = ScriptReadWord(ctx); + u8 ignore = ScriptReadByte(ctx); + + if (!ignore) + AddMoney(&gSaveBlock1.money, amount); + return FALSE; +} + +bool8 ScrCmd_takemoney(struct ScriptContext *ctx) +{ + u32 amount = ScriptReadWord(ctx); + u8 ignore = ScriptReadByte(ctx); + + if (!ignore) + RemoveMoney(&gSaveBlock1.money, amount); + return FALSE; +} + +bool8 ScrCmd_checkmoney(struct ScriptContext *ctx) +{ + u32 amount = ScriptReadWord(ctx); + u8 ignore = ScriptReadByte(ctx); + + if (!ignore) + gSpecialVar_Result = IsEnoughMoney(gSaveBlock1.money, amount); + return FALSE; +} + +bool8 ScrCmd_showmoneybox(struct ScriptContext *ctx) +{ + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + u8 ignore = ScriptReadByte(ctx); + + if (!ignore) + OpenMoneyWindow(gSaveBlock1.money, x, y); + return FALSE; +} + +bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx) +{ + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + CloseMoneyWindow(x, y); + return FALSE; +} + +bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx) +{ + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + u8 ignore = ScriptReadByte(ctx); + + if (!ignore) + UpdateMoneyWindow(gSaveBlock1.money, x, y); + return FALSE; +} + +bool8 ScrCmd_showcoinsbox(struct ScriptContext *ctx) +{ + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + ShowCoinsWindow(gSaveBlock1.coins, x, y); + return FALSE; +} + +bool8 ScrCmd_hidecoinsbox(struct ScriptContext *ctx) +{ + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + HideCoinsWindow(x, y); + return FALSE; +} + +bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx) +{ + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + UpdateCoinsWindow(gSaveBlock1.coins, x, y); + return FALSE; +} + +bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) +{ + ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr); + return FALSE; +} + +bool8 ScrCmd_trainerbattlebegin(struct ScriptContext *ctx) +{ + BattleSetup_StartTrainerBattle(); + return TRUE; +} + +bool8 ScrCmd_gotopostbattlescript(struct ScriptContext *ctx) +{ + ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle(); + return FALSE; +} + +bool8 ScrCmd_gotobeatenscript(struct ScriptContext *ctx) +{ + ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript(); + return FALSE; +} + +bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) +{ + u16 index = VarGet(ScriptReadHalfword(ctx)); + + ctx->comparisonResult = HasTrainerAlreadyBeenFought(index); + return FALSE; +} + +bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) +{ + u16 index = VarGet(ScriptReadHalfword(ctx)); + + SetTrainerFlag(index); + return FALSE; +} + +bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) +{ + u16 index = VarGet(ScriptReadHalfword(ctx)); + + ClearTrainerFlag(index); + return FALSE; +} + +bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx) +{ + u16 species = ScriptReadHalfword(ctx); + u8 level = ScriptReadByte(ctx); + u16 item = ScriptReadHalfword(ctx); + + CreateScriptedWildMon(species, level, item); + return FALSE; +} + +bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx) +{ + BattleSetup_StartScriptedWildBattle(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_pokemart(struct ScriptContext *ctx) +{ + void *ptr = (void *)ScriptReadWord(ctx); + + Shop_CreatePokemartMenu(ptr); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx) +{ + void *ptr = (void *)ScriptReadWord(ctx); + + Shop_CreateDecorationShop1Menu(ptr); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx) +{ + void *ptr = (void *)ScriptReadWord(ctx); + + Shop_CreateDecorationShop2Menu(ptr); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx) +{ + u8 v2 = VarGet(ScriptReadHalfword(ctx)); + + PlaySlotMachine(v2, c2_exit_to_overworld_1_continue_scripts_restart_music); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_setberrytree(struct ScriptContext *ctx) +{ + u8 treeId = ScriptReadByte(ctx); + u8 berry = ScriptReadByte(ctx); + u8 growthStage = ScriptReadByte(ctx); + + if (berry == 0) + PlantBerryTree(treeId, 0, growthStage, FALSE); + else + PlantBerryTree(treeId, berry, growthStage, FALSE); + return FALSE; +} + +bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx) +{ + u16 value = VarGet(ScriptReadHalfword(ctx)); + + gSpecialVar_Result = GetPriceReduction(value); + return FALSE; +} + +bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx) +{ + sub_80F99CC(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_startcontest(struct ScriptContext *ctx) +{ + sub_80C48C8(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx) +{ + sub_80C4940(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) +{ + sub_80C4980(gSpecialVar_ContestCategory); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx) +{ + u16 effectId = VarGet(ScriptReadHalfword(ctx)); + + sFieldEffectScriptId = effectId; + FieldEffectStart(sFieldEffectScriptId); + return FALSE; +} + +bool8 ScrCmd_setfieldeffectargument(struct ScriptContext *ctx) +{ + u8 argNum = ScriptReadByte(ctx); + + gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx)); + return FALSE; +} + +static bool8 sub_8067B48() +{ + if (!FieldEffectActiveListContains(sFieldEffectScriptId)) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_waitfieldeffect(struct ScriptContext *ctx) +{ + sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx)); + SetupNativeScript(ctx, sub_8067B48); + return TRUE; +} + +bool8 ScrCmd_setrespawn(struct ScriptContext *ctx) +{ + u16 healLocationId = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetHealLocationWarp(healLocationId); + return FALSE; +} + +bool8 ScrCmd_checkplayergender(struct ScriptContext *ctx) +{ + gSpecialVar_Result = gSaveBlock2.playerGender; + return FALSE; +} + +bool8 ScrCmd_playmoncry(struct ScriptContext *ctx) +{ + u16 species = VarGet(ScriptReadHalfword(ctx)); + u16 mode = VarGet(ScriptReadHalfword(ctx)); + + PlayCry5(species, mode); + return FALSE; +} + +bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, IsCryFinished); + return TRUE; +} + +bool8 ScrCmd_setmetatile(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + u16 metatileId = VarGet(ScriptReadHalfword(ctx)); + u16 v8 = VarGet(ScriptReadHalfword(ctx)); + + x += 7; + y += 7; + if (!v8) + MapGridSetMetatileIdAt(x, y, metatileId); + else + MapGridSetMetatileIdAt(x, y, metatileId | 0xC00); + return FALSE; +} + +bool8 ScrCmd_opendoor(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + x += 7; + y += 7; + PlaySE(GetDoorSoundEffect(x, y)); + FieldAnimateDoorOpen(x, y); + return FALSE; +} + +bool8 ScrCmd_closedoor(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + x += 7; + y += 7; + FieldAnimateDoorClose(x, y); + return FALSE; +} + +static bool8 IsDoorAnimationStopped() +{ + if (!FieldIsDoorAnimationRunning()) + return TRUE; + else + return FALSE; +} + +bool8 ScrCmd_waitdooranim(struct ScriptContext *ctx) +{ + SetupNativeScript(ctx, IsDoorAnimationStopped); + return TRUE; +} + +bool8 ScrCmd_setdooropen(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + x += 7; + y += 7; + FieldSetDoorOpened(x, y); + return FALSE; +} + +bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) +{ + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + x += 7; + y += 7; + FieldSetDoorClosed(x, y); + return FALSE; +} + +bool8 ScrCmd_addelevmenuitem(struct ScriptContext *ctx) +{ + u8 v3 = ScriptReadByte(ctx); + u16 v5 = VarGet(ScriptReadHalfword(ctx)); + u16 v7 = VarGet(ScriptReadHalfword(ctx)); + u16 v9 = VarGet(ScriptReadHalfword(ctx)); + + ScriptAddElevatorMenuItem(v3, v5, v7, v9); + return FALSE; +} + +bool8 ScrCmd_showelevmenu(struct ScriptContext *ctx) +{ + ScriptShowElevatorMenu(); + ScriptContext1_Stop(); + return TRUE; +} + +bool8 ScrCmd_checkcoins(struct ScriptContext *ctx) +{ + u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); + *ptr = GetCoins(); + return FALSE; +} + +bool8 ScrCmd_givecoins(struct ScriptContext *ctx) +{ + u16 coins = VarGet(ScriptReadHalfword(ctx)); + + if (GiveCoins(coins) == TRUE) + gSpecialVar_Result = 0; + else + gSpecialVar_Result = 1; + return FALSE; +} + +bool8 ScrCmd_takecoins(struct ScriptContext *ctx) +{ + u16 coins = VarGet(ScriptReadHalfword(ctx)); + + if (TakeCoins(coins) == TRUE) + gSpecialVar_Result = 0; + else + gSpecialVar_Result = 1; + return FALSE; +} diff --git a/src/script.c b/src/script.c new file mode 100644 index 000000000..8625cfdc2 --- /dev/null +++ b/src/script.c @@ -0,0 +1,376 @@ +#include "global.h" +#include "script.h" +#include "event_data.h" + +#define RAM_SCRIPT_MAGIC 51 +#define SCRIPT_STACK_SIZE 20 + +enum +{ + SCRIPT_MODE_STOPPED, + SCRIPT_MODE_BYTECODE, + SCRIPT_MODE_NATIVE, +}; + +EWRAM_DATA u8 *gUnknown_0202E8AC = NULL; + +static u8 sScriptContext1Status; +static struct ScriptContext sScriptContext1; +static struct ScriptContext sScriptContext2; +static bool8 sScriptContext2Enabled; + +extern ScrCmdFunc gScriptCmdTable[]; +extern ScrCmdFunc gScriptCmdTableEnd[]; +extern void *gNullScriptPtr; + +void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd) +{ + s32 i; + + ctx->mode = SCRIPT_MODE_STOPPED; + ctx->scriptPtr = NULL; + ctx->stackDepth = 0; + ctx->nativePtr = NULL; + ctx->cmdTable = cmdTable; + ctx->cmdTableEnd = cmdTableEnd; + + for (i = 0; i < 4; i++) + ctx->data[i] = 0; + + for (i = 0; i < SCRIPT_STACK_SIZE; i++) + ctx->stack[i] = 0; +} + +u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) +{ + ctx->scriptPtr = ptr; + ctx->mode = SCRIPT_MODE_BYTECODE; + return 1; +} + +void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void)) +{ + ctx->mode = SCRIPT_MODE_NATIVE; + ctx->nativePtr = ptr; +} + +void StopScript(struct ScriptContext *ctx) +{ + ctx->mode = SCRIPT_MODE_STOPPED; + ctx->scriptPtr = NULL; +} + +bool8 RunScriptCommand(struct ScriptContext *ctx) +{ + if (ctx->mode == SCRIPT_MODE_STOPPED) + return FALSE; + + switch (ctx->mode) + { + case SCRIPT_MODE_STOPPED: + return FALSE; + case SCRIPT_MODE_NATIVE: + if (ctx->nativePtr) + { + if (ctx->nativePtr() == TRUE) + ctx->mode = SCRIPT_MODE_BYTECODE; + return TRUE; + } + ctx->mode = SCRIPT_MODE_BYTECODE; + case SCRIPT_MODE_BYTECODE: + while (1) + { + u8 cmdCode; + ScrCmdFunc *cmdFunc; + + if (ctx->scriptPtr == NULL) + { + ctx->mode = SCRIPT_MODE_STOPPED; + return FALSE; + } + + if (ctx->scriptPtr == gNullScriptPtr) + { + while (1) + asm("svc 2"); // HALT + } + + cmdCode = *(ctx->scriptPtr); + ctx->scriptPtr++; + cmdFunc = &ctx->cmdTable[cmdCode]; + + if (cmdFunc >= ctx->cmdTableEnd) + { + ctx->mode = SCRIPT_MODE_STOPPED; + return FALSE; + } + + if ((*cmdFunc)(ctx) == TRUE) + return TRUE; + } + } + + return TRUE; +} + +u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) +{ + if (ctx->stackDepth + 1 >= SCRIPT_STACK_SIZE) + { + return 1; + } + else + { + ctx->stack[ctx->stackDepth] = ptr; + ctx->stackDepth++; + return 0; + } +} + +const u8 *ScriptPop(struct ScriptContext *ctx) +{ + if (ctx->stackDepth == 0) + return NULL; + + ctx->stackDepth--; + return ctx->stack[ctx->stackDepth]; +} + +void ScriptJump(struct ScriptContext *ctx, u8 *ptr) +{ + ctx->scriptPtr = ptr; +} + +void ScriptCall(struct ScriptContext *ctx, u8 *ptr) +{ + ScriptPush(ctx, ctx->scriptPtr); + ctx->scriptPtr = ptr; +} + +void ScriptReturn(struct ScriptContext *ctx) +{ + ctx->scriptPtr = ScriptPop(ctx); +} + +u16 ScriptReadHalfword(struct ScriptContext *ctx) +{ + u16 value = *(ctx->scriptPtr++); + value |= *(ctx->scriptPtr++) << 8; + return value; +} + +u32 ScriptReadWord(struct ScriptContext *ctx) +{ + u32 value0 = *(ctx->scriptPtr++); + u32 value1 = *(ctx->scriptPtr++); + u32 value2 = *(ctx->scriptPtr++); + u32 value3 = *(ctx->scriptPtr++); + return (((((value3 << 8) + value2) << 8) + value1) << 8) + value0; +} + +void ScriptContext2_Enable(void) +{ + sScriptContext2Enabled = TRUE; +} + +void ScriptContext2_Disable(void) +{ + sScriptContext2Enabled = FALSE; +} + +bool8 ScriptContext2_IsEnabled(void) +{ + return sScriptContext2Enabled; +} + +void ScriptContext1_Init(void) +{ + InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); + sScriptContext1Status = 2; +} + +bool8 ScriptContext2_RunScript(void) +{ + if (sScriptContext1Status == 2) + return 0; + + if (sScriptContext1Status == 1) + return 0; + + ScriptContext2_Enable(); + + if (!RunScriptCommand(&sScriptContext1)) + { + sScriptContext1Status = 2; + ScriptContext2_Disable(); + return 0; + } + + return 1; +} + +void ScriptContext1_SetupScript(const u8 *ptr) +{ + InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); + SetupBytecodeScript(&sScriptContext1, ptr); + ScriptContext2_Enable(); + sScriptContext1Status = 0; +} + +void ScriptContext1_Stop(void) +{ + sScriptContext1Status = 1; +} + +void EnableBothScriptContexts() +{ + sScriptContext1Status = 0; + ScriptContext2_Enable(); +} + +void ScriptContext2_RunNewScript(const u8 *ptr) +{ + InitScriptContext(&sScriptContext2, &gScriptCmdTable, &gScriptCmdTableEnd); + SetupBytecodeScript(&sScriptContext2, ptr); + while (RunScriptCommand(&sScriptContext2) == 1) + ; +} + +static u8 *mapheader_get_tagged_pointer(u8 tag) +{ + u8 *mapScripts = gMapHeader.mapScripts; + + if (mapScripts == NULL) + return NULL; + + while (1) + { + if (*mapScripts == 0) + return NULL; + if (*mapScripts == tag) + { + mapScripts++; + return (u8 *)(mapScripts[0] + (mapScripts[1] << 8) + (mapScripts[2] << 16) + (mapScripts[3] << 24)); + } + mapScripts += 5; + } +} + +static void mapheader_run_script_by_tag(u8 tag) +{ + u8 *ptr = mapheader_get_tagged_pointer(tag); + if (ptr) + ScriptContext2_RunNewScript(ptr); +} + +static u8 *mapheader_get_first_match_from_tagged_ptr_list(u8 tag) +{ + u8 *ptr = mapheader_get_tagged_pointer(tag); + + if (!ptr) + return NULL; + + while (1) + { + u16 varIndex1; + u16 varIndex2; + varIndex1 = ptr[0] | (ptr[1] << 8); + if (!varIndex1) + return NULL; + ptr += 2; + varIndex2 = ptr[0] | (ptr[1] << 8); + ptr += 2; + if (VarGet(varIndex1) == VarGet(varIndex2)) + return (u8 *)(ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24)); + ptr += 4; + } +} + +void mapheader_run_script_with_tag_x1(void) +{ + mapheader_run_script_by_tag(1); +} + +void mapheader_run_script_with_tag_x3(void) +{ + mapheader_run_script_by_tag(3); +} + +void mapheader_run_script_with_tag_x5(void) +{ + mapheader_run_script_by_tag(5); +} + +void mapheader_run_script_with_tag_x6(void) +{ + mapheader_run_script_by_tag(6); +} + +bool8 mapheader_run_first_tag2_script_list_match(void) +{ + u8 *ptr = mapheader_get_first_match_from_tagged_ptr_list(2); + + if (!ptr) + return 0; + + ScriptContext1_SetupScript(ptr); + return 1; +} + +void mapheader_run_first_tag4_script_list_match(void) +{ + u8 *ptr = mapheader_get_first_match_from_tagged_ptr_list(4); + if (ptr) + ScriptContext2_RunNewScript(ptr); +} + +static u32 CalculateRamScriptChecksum(void) +{ + u32 i; + u32 sum = 0; + for (i = 0; i < sizeof(struct RamScriptData); i++) + sum += ((u8 *)&gSaveBlock1.ramScript.data)[i]; + return sum; +} + +void ClearRamScript(void) +{ + CpuFill32(0, &gSaveBlock1.ramScript, sizeof(struct RamScript)); +} + +bool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId) +{ + struct RamScriptData *scriptData = &gSaveBlock1.ramScript.data; + + ClearRamScript(); + + if (scriptSize > sizeof(scriptData->script)) + return FALSE; + + scriptData->magic = RAM_SCRIPT_MAGIC; + scriptData->mapGroup = mapGroup; + scriptData->mapNum = mapNum; + scriptData->objectId = objectId; + memcpy(scriptData->script, script, scriptSize); + gSaveBlock1.ramScript.checksum = CalculateRamScriptChecksum(); + return TRUE; +} + +u8 *GetRamScript(u8 objectId, u8 *script) +{ + struct RamScriptData *scriptData = &gSaveBlock1.ramScript.data; + gUnknown_0202E8AC = 0; + if (scriptData->magic == RAM_SCRIPT_MAGIC + && scriptData->mapGroup == gSaveBlock1.location.mapGroup + && scriptData->mapNum == gSaveBlock1.location.mapNum + && scriptData->objectId == objectId) + { + if (CalculateRamScriptChecksum() == gSaveBlock1.ramScript.checksum) + { + gUnknown_0202E8AC = script; + return scriptData->script; + } + ClearRamScript(); + } + return script; +} diff --git a/src/script_menu.c b/src/script_menu.c new file mode 100644 index 000000000..9d901a03c --- /dev/null +++ b/src/script_menu.c @@ -0,0 +1,1178 @@ +#include "global.h" +#include "script.h" +#include "script_menu.h" +#include "event_data.h" +#include "field_effect.h" +#include "menu.h" +#include "palette.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "task.h" + +// multichoice lists +const struct MenuAction MultichoiceList_00[] = +{ + {OtherText_Petalburg, NULL}, + {OtherText_Slateport, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_02[] = +{ + {OtherText_Enter, NULL}, + {OtherText_Info3, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_03[] = +{ + {OtherText_WhatsAContest, NULL}, + {OtherText_TypesOfContest, NULL}, + {OtherText_Ranks, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_04[] = +{ + {OtherText_CoolContest, NULL}, + {OtherText_BeautyContest, NULL}, + {OtherText_CuteContest, NULL}, + {OtherText_SmartContest, NULL}, + {OtherText_ToughContest, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_06[] = +{ + {OtherText_Decoration, NULL}, + {OtherText_PackUp, NULL}, + {OtherText_Registry, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_05[] = +{ + {OtherText_Decoration, NULL}, + {OtherText_PackUp, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_07[] = +{ + {OtherText_Register, NULL}, + {OtherText_Registry, NULL}, + {OtherText_Information, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_12[] = +{ + {OtherText_Mach, NULL}, + {OtherText_Acro, NULL}, +}; + +const struct MenuAction MultichoiceList_13[] = +{ + {OtherText_Poison, NULL}, + {OtherText_Paralysis, NULL}, + {OtherText_Sleep, NULL}, + {OtherText_Burn, NULL}, + {OtherText_Frozen, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_14[] = +{ + {OtherText_Dewford, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_16[] = +{ + {OtherText_SawIt, NULL}, + {OtherText_NotYet, NULL}, +}; + +const struct MenuAction MultichoiceList_17[] = +{ + {OtherText_Yes, NULL}, + {OtherText_No, NULL}, + {OtherText_Info3, NULL}, +}; + +const struct MenuAction MultichoiceList_18[] = +{ + {OtherText_SingleBattle, NULL}, + {OtherText_DoubleBattle, NULL}, + {OtherText_MultiBattle, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_19[] = +{ + {OtherText_Littleroot, NULL}, + {OtherText_Slateport, NULL}, + {OtherText_Lilycove, NULL}, +}; + +const struct MenuAction MultichoiceList_20[] = +{ + {OtherText_Yes, NULL}, + {OtherText_No, NULL}, + {OtherText_Info3, NULL}, +}; + +const struct MenuAction MultichoiceList_23[] = +{ + {OtherText_MakeAChallenge, NULL}, + {OtherText_ObtainInformation, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_24[] = +{ + {OtherText_Lv50_2, NULL}, + {OtherText_Lv100_2, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_25[] = +{ + {OtherText_Zigzagoon, NULL}, + {OtherText_Nincada, NULL}, + {OtherText_Poochyena, NULL}, +}; + +const struct MenuAction MultichoiceList_26[] = +{ + {OtherText_Nincada2, NULL}, + {OtherText_Lotad, NULL}, + {OtherText_Roselia, NULL}, +}; + +const struct MenuAction MultichoiceList_27[] = +{ + {OtherText_Shroomish, NULL}, + {OtherText_Nincada3, NULL}, + {OtherText_Surskit, NULL}, +}; + +const struct MenuAction MultichoiceList_28[] = +{ + {OtherText_Treecko, NULL}, + {OtherText_Torchic, NULL}, + {OtherText_Mudkip, NULL}, +}; + +const struct MenuAction MultichoiceList_29[] = +{ + {OtherText_Seedot, NULL}, + {OtherText_Shroomish2, NULL}, + {OtherText_Spinda, NULL}, +}; + +const struct MenuAction MultichoiceList_30[] = +{ + {OtherText_Shroomish3, NULL}, + {OtherText_Zigzagoon2, NULL}, + {OtherText_Wurmple, NULL}, +}; + +const struct MenuAction MultichoiceList_31[] = +{ + {OtherText_PokeBall, NULL}, + {OtherText_SuperPotion, NULL}, + {OtherText_SamePrice, NULL}, +}; + +const struct MenuAction MultichoiceList_32[] = +{ + {OtherText_Yen135, NULL}, + {OtherText_Yen155, NULL}, + {OtherText_Yen175, NULL}, +}; + +const struct MenuAction MultichoiceList_33[] = +{ + {OtherText_CostMore, NULL}, + {OtherText_CostLess, NULL}, + {OtherText_SamePrice2, NULL}, +}; + +const struct MenuAction MultichoiceList_34[] = +{ + {OtherText_MaleSymbol, NULL}, + {OtherText_FemaleSymbol, NULL}, + {OtherText_Neither, NULL}, +}; + +const struct MenuAction MultichoiceList_35[] = +{ + {OtherText_Males, NULL}, + {OtherText_Females, NULL}, + {OtherText_SameNumber, NULL}, +}; + +const struct MenuAction MultichoiceList_36[] = +{ + {OtherText_Male, NULL}, + {OtherText_Female, NULL}, + {OtherText_ItDepends, NULL}, +}; + +const struct MenuAction MultichoiceList_37[] = +{ + {OtherText_Six2, NULL}, + {OtherText_Eight2, NULL}, + {OtherText_Ten, NULL}, +}; + +const struct MenuAction MultichoiceList_38[] = +{ + {OtherText_One, NULL}, + {OtherText_Two, NULL}, + {OtherText_Three, NULL}, +}; + +const struct MenuAction MultichoiceList_39[] = +{ + {OtherText_Six, NULL}, + {OtherText_Seven, NULL}, + {OtherText_Eight, NULL}, +}; + +const struct MenuAction MultichoiceList_42[] = +{ + {OtherText_FreshWater, NULL}, + {OtherText_SodaPop, NULL}, + {OtherText_Lemonade, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_43[] = +{ + {OtherText_HowToRide, NULL}, + {OtherText_HowToTurn, NULL}, + {OtherText_SandySlopes, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_44[] = +{ + {OtherText_Wheelies, NULL}, + {OtherText_BunnyHops, NULL}, + {OtherText_Jumping, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_45[] = +{ + {OtherText_Satisfied, NULL}, + {OtherText_Dissatisfied, NULL}, +}; + +const struct MenuAction MultichoiceList_46[] = +{ + {OtherText_Deepseatooth, NULL}, + {OtherText_Deepseascale, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_47[] = +{ + {OtherText_BlueFlute2, NULL}, + {OtherText_YellowFlute2, NULL}, + {OtherText_RedFlute2, NULL}, + {OtherText_WhiteFlute2, NULL}, + {OtherText_BlackFlute2, NULL}, + {OtherText_GlassChair, NULL}, + {OtherText_GlassDesk, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_48[] = +{ + {OtherText_TreeckoDoll, NULL}, + {OtherText_TorchicDoll, NULL}, + {OtherText_MudkipDoll, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_55[] = +{ + {OtherText_TM32, NULL}, + {OtherText_TM29, NULL}, + {OtherText_TM35, NULL}, + {OtherText_TM24, NULL}, + {OtherText_TM13, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_49[] = +{ + {OtherText_50Coins, NULL}, + {OtherText_500Coins, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_50[] = +{ + {OtherText_Excellent, NULL}, + {OtherText_NotSoHot, NULL}, +}; + +const struct MenuAction MultichoiceList_52[] = +{ + {OtherText_Lilycove, NULL}, + {OtherText_BattleTower, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_53[] = +{ + {OtherText_Slateport, NULL}, + {OtherText_Lilycove, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_54[] = +{ + {OtherText_Right, NULL}, + {OtherText_Left, NULL}, +}; + +const struct MenuAction MultichoiceList_56[] = +{ + {OtherText_Slateport, NULL}, + {OtherText_BattleTower, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_57[] = +{ + {OtherText_1F_2, NULL}, + {OtherText_2F_2, NULL}, + {OtherText_3F_2, NULL}, + {OtherText_4F_2, NULL}, + {OtherText_5F_2, NULL}, +}; + +const struct MenuAction MultichoiceList_58[] = +{ + {OtherText_RedShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_59[] = +{ + {OtherText_YellowShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_60[] = +{ + {OtherText_RedShard, NULL}, + {OtherText_YellowShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_61[] = +{ + {OtherText_BlueShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_62[] = +{ + {OtherText_RedShard, NULL}, + {OtherText_BlueShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_63[] = +{ + {OtherText_YellowShard, NULL}, + {OtherText_BlueShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_64[] = +{ + {OtherText_RedShard, NULL}, + {OtherText_YellowShard, NULL}, + {OtherText_BlueShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_65[] = +{ + {OtherText_GreenShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_66[] = +{ + {OtherText_RedShard, NULL}, + {OtherText_GreenShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_67[] = +{ + {OtherText_YellowShard, NULL}, + {OtherText_GreenShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_68[] = +{ + {OtherText_RedShard, NULL}, + {OtherText_YellowShard, NULL}, + {OtherText_GreenShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_69[] = +{ + {OtherText_BlueShard, NULL}, + {OtherText_GreenShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_70[] = +{ + {OtherText_RedShard, NULL}, + {OtherText_BlueShard, NULL}, + {OtherText_GreenShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_71[] = +{ + {OtherText_YellowShard, NULL}, + {OtherText_BlueShard, NULL}, + {OtherText_GreenShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_72[] = +{ + {OtherText_RedShard, NULL}, + {OtherText_YellowShard, NULL}, + {OtherText_BlueShard, NULL}, + {OtherText_GreenShard, NULL}, + {gOtherText_CancelNoTerminator, NULL}, +}; + +const struct MenuAction MultichoiceList_01[] = +{ + {gOtherText_CancelNoTerminator, NULL}, +}; + +struct MultichoiceListStruct +{ + const struct MenuAction *list; + u8 count; +}; + +const struct MultichoiceListStruct gMultichoiceLists[] = +{ + {MultichoiceList_00, ARRAY_COUNT(MultichoiceList_00)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_02, ARRAY_COUNT(MultichoiceList_02)}, + {MultichoiceList_03, ARRAY_COUNT(MultichoiceList_03)}, + {MultichoiceList_04, ARRAY_COUNT(MultichoiceList_04)}, + {MultichoiceList_05, ARRAY_COUNT(MultichoiceList_05)}, + {MultichoiceList_06, ARRAY_COUNT(MultichoiceList_06)}, + {MultichoiceList_07, ARRAY_COUNT(MultichoiceList_07)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_12, ARRAY_COUNT(MultichoiceList_12)}, + {MultichoiceList_13, ARRAY_COUNT(MultichoiceList_13)}, + {MultichoiceList_14, ARRAY_COUNT(MultichoiceList_14)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_16, ARRAY_COUNT(MultichoiceList_16)}, + {MultichoiceList_17, ARRAY_COUNT(MultichoiceList_17)}, + {MultichoiceList_18, ARRAY_COUNT(MultichoiceList_18)}, + {MultichoiceList_19, ARRAY_COUNT(MultichoiceList_19)}, + {MultichoiceList_20, ARRAY_COUNT(MultichoiceList_20)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_23, ARRAY_COUNT(MultichoiceList_23)}, + {MultichoiceList_24, ARRAY_COUNT(MultichoiceList_24)}, + {MultichoiceList_25, ARRAY_COUNT(MultichoiceList_25)}, + {MultichoiceList_26, ARRAY_COUNT(MultichoiceList_26)}, + {MultichoiceList_27, ARRAY_COUNT(MultichoiceList_27)}, + {MultichoiceList_28, ARRAY_COUNT(MultichoiceList_28)}, + {MultichoiceList_29, ARRAY_COUNT(MultichoiceList_29)}, + {MultichoiceList_30, ARRAY_COUNT(MultichoiceList_30)}, + {MultichoiceList_31, ARRAY_COUNT(MultichoiceList_31)}, + {MultichoiceList_32, ARRAY_COUNT(MultichoiceList_32)}, + {MultichoiceList_33, ARRAY_COUNT(MultichoiceList_33)}, + {MultichoiceList_34, ARRAY_COUNT(MultichoiceList_34)}, + {MultichoiceList_35, ARRAY_COUNT(MultichoiceList_35)}, + {MultichoiceList_36, ARRAY_COUNT(MultichoiceList_36)}, + {MultichoiceList_37, ARRAY_COUNT(MultichoiceList_37)}, + {MultichoiceList_38, ARRAY_COUNT(MultichoiceList_38)}, + {MultichoiceList_39, ARRAY_COUNT(MultichoiceList_39)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_42, ARRAY_COUNT(MultichoiceList_42)}, + {MultichoiceList_43, ARRAY_COUNT(MultichoiceList_43)}, + {MultichoiceList_44, ARRAY_COUNT(MultichoiceList_44)}, + {MultichoiceList_45, ARRAY_COUNT(MultichoiceList_45)}, + {MultichoiceList_46, ARRAY_COUNT(MultichoiceList_46)}, + {MultichoiceList_47, ARRAY_COUNT(MultichoiceList_47)}, + {MultichoiceList_48, ARRAY_COUNT(MultichoiceList_48)}, + {MultichoiceList_49, ARRAY_COUNT(MultichoiceList_49)}, + {MultichoiceList_50, ARRAY_COUNT(MultichoiceList_50)}, + {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)}, + {MultichoiceList_52, ARRAY_COUNT(MultichoiceList_52)}, + {MultichoiceList_53, ARRAY_COUNT(MultichoiceList_53)}, + {MultichoiceList_54, ARRAY_COUNT(MultichoiceList_54)}, + {MultichoiceList_55, ARRAY_COUNT(MultichoiceList_55)}, + {MultichoiceList_56, ARRAY_COUNT(MultichoiceList_56)}, + {MultichoiceList_57, ARRAY_COUNT(MultichoiceList_57)}, + {MultichoiceList_58, ARRAY_COUNT(MultichoiceList_58)}, + {MultichoiceList_59, ARRAY_COUNT(MultichoiceList_59)}, + {MultichoiceList_60, ARRAY_COUNT(MultichoiceList_60)}, + {MultichoiceList_61, ARRAY_COUNT(MultichoiceList_61)}, + {MultichoiceList_62, ARRAY_COUNT(MultichoiceList_62)}, + {MultichoiceList_63, ARRAY_COUNT(MultichoiceList_63)}, + {MultichoiceList_64, ARRAY_COUNT(MultichoiceList_64)}, + {MultichoiceList_65, ARRAY_COUNT(MultichoiceList_65)}, + {MultichoiceList_66, ARRAY_COUNT(MultichoiceList_66)}, + {MultichoiceList_67, ARRAY_COUNT(MultichoiceList_67)}, + {MultichoiceList_68, ARRAY_COUNT(MultichoiceList_68)}, + {MultichoiceList_69, ARRAY_COUNT(MultichoiceList_69)}, + {MultichoiceList_70, ARRAY_COUNT(MultichoiceList_70)}, + {MultichoiceList_71, ARRAY_COUNT(MultichoiceList_71)}, + {MultichoiceList_72, ARRAY_COUNT(MultichoiceList_72)}, +}; + +const u8 *const gUnknown_083CE048[] = +{ + OtherText_Cool2, + OtherText_Beauty3, + OtherText_Cute2, + OtherText_Smart2, + OtherText_Tough2, + OtherText_Normal, + OtherText_Super, + OtherText_Hyper, + OtherText_Master, + OtherText_Cool3, + OtherText_Beauty4, + OtherText_Cute3, + OtherText_Smart3, + OtherText_Tough3, + OtherText_Items, + OtherText_KeyItems, + OtherText_Balls, + OtherText_TMsHMs, + OtherText_Berries, +}; + +extern u8 gPCText_WhichPCShouldBeAccessed[]; + +extern u16 gSpecialVar_Result; + +static void Task_HandleMultichoiceInput(u8); +static void Task_HandleYesNoInput(u8); +static void Task_HandleMultichoiceGridInput(u8); +static u16 GetStringWidthInTilesForScriptMenu(const u8 *str); +static void DrawMultichoiceMenu(u8, u8, u8, const struct MenuAction *list, u8, u8); +static void StartScriptMenuTask(u8, u8, u8, u8, u8, u8); +static void sub_80B53B4(u8, u8, u8, const struct MenuAction *list, u8); +static bool8 IsPicboxClosed(void); + +bool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress) +{ + if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE) + { + return FALSE; + } + else + { + gSpecialVar_Result = 0xFF; + DrawMultichoiceMenu(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress, 0); + return TRUE; + } +} + +bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress, u8 defaultChoice) +{ + if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE) + { + return FALSE; + } + else + { + gSpecialVar_Result = 0xFF; + DrawMultichoiceMenu(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress, defaultChoice); + return TRUE; + } +} + +static u16 GetStringWidthInTilesForScriptMenu(const u8 *str) +{ + // each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8. + return (Text_GetStringWidthFromWindowTemplate((struct WindowTemplate *)&gWindowTemplate_81E6CE4, str) + 7) / 8; +} + +static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress, u8 cursorPos) +{ + u16 width = GetStringWidthInTilesForScriptMenu(list[0].text); + u16 newWidth; + u8 i; + u8 right; + u8 bottom; + + for (i = 1; i < count; i++) + { + newWidth = GetStringWidthInTilesForScriptMenu(list[i].text); + if (width < newWidth) + width = newWidth; + } + + right = width; + right = (right + left) + 1; + + if (right > 29) + { + left = left + (29 - right); + right = 29; + } + + bottom = top + (2 * count + 1); + + Menu_DrawStdWindowFrame(left, top, right, bottom); + Menu_PrintItems(left + 1, top + 1, count, list); + InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1); + StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count); +} + +#define tLeft data[0] +#define tTop data[1] +#define tRight data[2] +#define tBottom data[3] +#define tIgnoreBPress data[4] +#define tDoWrap data[5] + +static void StartScriptMenuTask(u8 left, u8 top, u8 right, u8 bottom, u8 ignoreBPress, u8 count) +{ + u8 taskId = CreateTask(Task_HandleMultichoiceInput, 80); + + gTasks[taskId].tLeft = left; + gTasks[taskId].tTop = top; + gTasks[taskId].tRight = right; + gTasks[taskId].tBottom = bottom; + gTasks[taskId].tIgnoreBPress = ignoreBPress; + + if (count > 3) + gTasks[taskId].tDoWrap = TRUE; + else + gTasks[taskId].tDoWrap = FALSE; +} + +static void Task_HandleMultichoiceInput(u8 taskId) +{ + s8 selection; + + if (!gPaletteFade.active) + { + if (!gTasks[taskId].tDoWrap) + selection = Menu_ProcessInputNoWrap(); + else + selection = Menu_ProcessInput(); + + if (selection != -2) + { + if (selection == -1) + { + if (gTasks[taskId].tIgnoreBPress) + return; + PlaySE(SE_SELECT); + gSpecialVar_Result = 127; + } + else + { + gSpecialVar_Result = selection; + } + Menu_DestroyCursor(); + Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); + DestroyTask(taskId); + EnableBothScriptContexts(); + } + } +} + +bool8 Multichoice(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress) +{ + if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE) + { + return FALSE; + } + else + { + gSpecialVar_Result = 0xFF; + sub_80B53B4(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress); + return TRUE; + } +} + +static void sub_80B53B4(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress) +{ + u16 width = GetStringWidthInTilesForScriptMenu(list[0].text); + u16 newWidth; + u8 i; + u8 right; + u8 bottom; + + for (i = 1; i < count; i++) + { + newWidth = GetStringWidthInTilesForScriptMenu(list[i].text); + if (width < newWidth) + width = newWidth; + } + + right = width; + right = (right + left) + 2; + bottom = top + (2 * count + 1); + + Menu_PrintItems(left, top, count, list); + InitMenu(0, left, top, count, 0, right - left - 1); + StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count); +} + +bool8 ScriptMenu_YesNo(u8 left, u8 top) +{ + u8 taskId; + + if (FuncIsActiveTask(Task_HandleYesNoInput) == TRUE) + { + return FALSE; + } + else + { + gSpecialVar_Result = 0xFF; + DisplayYesNoMenu(left, top, 1); + taskId = CreateTask(Task_HandleYesNoInput, 0x50); + gTasks[taskId].tLeft = left; + gTasks[taskId].tTop = top; + return TRUE; + } +} + +// unused +bool8 IsScriptActive(void) +{ + if (gSpecialVar_Result == 0xFF) + return FALSE; + else + return TRUE; +} + +static void Task_HandleYesNoInput(u8 taskId) +{ + u8 left, top; + + if (gTasks[taskId].tRight < 5) + { + gTasks[taskId].tRight++; + return; + } + + switch (Menu_ProcessInputNoWrap()) + { + case -2: + return; + case -1: + case 1: + PlaySE(SE_SELECT); + gSpecialVar_Result = 0; + break; + case 0: + gSpecialVar_Result = 1; + break; + } + + left = gTasks[taskId].tLeft; + top = gTasks[taskId].tTop; + + Menu_EraseWindowRect(left, top, left + 6, top + 5); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress, u8 columnCount) +{ + u8 bottom = 0; + + if (FuncIsActiveTask(Task_HandleMultichoiceGridInput) == TRUE) + { + return FALSE; + } + else + { + u8 taskId; + u8 width; + + gSpecialVar_Result = 0xFF; + + sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0); + + taskId = CreateTask(Task_HandleMultichoiceGridInput, 80); + + if (!((gMultichoiceLists[multichoiceId].count >> 1) < columnCount || (gMultichoiceLists[multichoiceId].count & 1)) + || columnCount == 1 || gMultichoiceLists[multichoiceId].count == columnCount) + { + bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 1 + top; + } + else + { + bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top; + } + + width = Menu_GetColumnXCoord(columnCount); + gTasks[taskId].tLeft = left; + gTasks[taskId].tTop = top; + gTasks[taskId].tRight = width + left + 2; + gTasks[taskId].tBottom = bottom; + gTasks[taskId].tIgnoreBPress = ignoreBPress; + return TRUE; + } +} + +static void Task_HandleMultichoiceGridInput(u8 taskId) +{ + s8 selection = Menu_ProcessInputGridLayout(); + + if (selection != -2) + { + if (selection == -1) + { + if (gTasks[taskId].tIgnoreBPress) + return; + PlaySE(SE_SELECT); + gSpecialVar_Result = 127; + } + else + { + gSpecialVar_Result = selection; + } + Menu_DestroyCursor(); + Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); + DestroyTask(taskId); + EnableBothScriptContexts(); + } +} + +#undef tLeft +#undef tTop +#undef tRight +#undef tBottom +#undef tIgnoreBPress +#undef tDoWrap + +bool8 ScrSpecial_CreatePCMenu(void) +{ + if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE) + { + return FALSE; + } + else + { + gSpecialVar_Result = 0xFF; + ScriptMenu_CreatePCMenu(); + return TRUE; + } +} + +#if ENGLISH +void ScriptMenu_CreatePCMenu(void) +{ + u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC); + u8 width; + u8 numChoices; + + if (playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC)) + width = playersPCWidth; + else + width = 8; + + if (FlagGet(FLAG_SYS_GAME_CLEAR)) // player has cleared game? + { + numChoices = 4; + Menu_DrawStdWindowFrame(0, 0, width + 2, 9); + Menu_PrintText(gPCText_HallOfFame, 1, 5); + Menu_PrintText(gPCText_LogOff, 1, 7); + } + else + { + numChoices = 3; + Menu_DrawStdWindowFrame(0, 0, width + 2, 7); + Menu_PrintText(gPCText_LogOff, 1, 5); + } + + if (FlagGet(FLAG_SYS_PC_LANETTE)) // player met lanette? + Menu_PrintText(gPCText_LanettesPC, 1, 1); + else + Menu_PrintText(gPCText_SomeonesPC, 1, 1); + + Menu_PrintText(gPCText_PlayersPC, 1, 3); + InitMenu(0, 1, 1, numChoices, 0, width + 1); + StartScriptMenuTask(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices); +} +#elif GERMAN +__attribute__((naked)) +void ScriptMenu_CreatePCMenu(void) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x18\n\ + ldr r0, _080B5748 @ =0x0000084b\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5750\n\ + ldr r0, _080B574C @ =gPCText_LanettesPC\n\ + b _080B5752\n\ + .align 2, 0\n\ +_080B5748: .4byte 0x0000084b\n\ +_080B574C: .4byte gPCText_LanettesPC\n\ +_080B5750:\n\ + ldr r0, _080B57E8 @ =gPCText_SomeonesPC\n\ +_080B5752:\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x8]\n\ + movs r4, 0x1\n\ + ldr r0, _080B57EC @ =gPCText_PlayersPC\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r1, r4, 2\n\ + add r1, sp\n\ + adds r1, 0x8\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [r1]\n\ + ldr r0, _080B57F0 @ =gPCText_LogOff\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x10]\n\ + movs r4, 0x3\n\ + ldr r0, _080B57F4 @ =0x00000804\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5798\n\ + ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x14]\n\ + movs r4, 0x4\n\ +_080B5798:\n\ + movs r5, 0\n\ + cmp r5, r4\n\ + bge _080B57B4\n\ + add r2, sp, 0x8\n\ + adds r1, r4, 0\n\ +_080B57A2:\n\ + ldr r0, [r2]\n\ + cmp r5, r0\n\ + bge _080B57AC\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ +_080B57AC:\n\ + adds r2, 0x4\n\ + subs r1, 0x1\n\ + cmp r1, 0\n\ + bne _080B57A2\n\ +_080B57B4:\n\ + ldr r0, _080B57F4 @ =0x00000804\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B57FC\n\ + movs r7, 0x4\n\ + adds r4, r5, 0x2\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r3, 0x9\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ + movs r1, 0x1\n\ + movs r2, 0x5\n\ + bl Menu_PrintText\n\ + ldr r0, _080B57F0 @ =gPCText_LogOff\n\ + movs r1, 0x1\n\ + movs r2, 0x7\n\ + bl Menu_PrintText\n\ + b _080B5818\n\ + .align 2, 0\n\ +_080B57E8: .4byte gPCText_SomeonesPC\n\ +_080B57EC: .4byte gPCText_PlayersPC\n\ +_080B57F0: .4byte gPCText_LogOff\n\ +_080B57F4: .4byte 0x00000804\n\ +_080B57F8: .4byte gPCText_HallOfFame\n\ +_080B57FC:\n\ + movs r7, 0x3\n\ + adds r4, r5, 0x2\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r3, 0x7\n\ + bl Menu_DrawStdWindowFrame\n\ + ldr r0, _080B5834 @ =gPCText_LogOff\n\ + movs r1, 0x1\n\ + movs r2, 0x5\n\ + bl Menu_PrintText\n\ +_080B5818:\n\ + adds r6, r4, 0\n\ + ldr r0, _080B5838 @ =0x0000084b\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5840\n\ + ldr r0, _080B583C @ =gPCText_LanettesPC\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + bl Menu_PrintText\n\ + b _080B584A\n\ + .align 2, 0\n\ +_080B5834: .4byte gPCText_LogOff\n\ +_080B5838: .4byte 0x0000084b\n\ +_080B583C: .4byte gPCText_LanettesPC\n\ +_080B5840:\n\ + ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + bl Menu_PrintText\n\ +_080B584A:\n\ + ldr r0, _080B588C @ =gPCText_PlayersPC\n\ + movs r1, 0x1\n\ + movs r2, 0x3\n\ + bl Menu_PrintText\n\ + movs r4, 0\n\ + str r4, [sp]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x4]\n\ + movs r0, 0\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + adds r3, r7, 0\n\ + bl InitMenu\n\ + lsls r2, r6, 24\n\ + lsrs r2, 24\n\ + lsls r3, r7, 1\n\ + adds r3, 0x1\n\ + str r4, [sp]\n\ + str r7, [sp, 0x4]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + bl StartScriptMenuTask\n\ + add sp, 0x18\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B5888: .4byte gPCText_SomeonesPC\n\ +_080B588C: .4byte gPCText_PlayersPC\n\ + .syntax divided\n"); +} +#endif + +void ScriptMenu_DisplayPCStartupPrompt(void) +{ + Menu_DisplayDialogueFrame(); + Menu_PrintText(gPCText_WhichPCShouldBeAccessed, 2, 15); +} + +#define tState data[0] +#define tMonSpecies data[1] +#define tMonSpriteId data[2] +#define tWindowX data[3] +#define tWindowY data[4] + +static void Task_PokemonPicWindow(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->tState) + { + case 0: + task->tState++; + break; + case 1: + break; + case 2: + FreeResourcesAndDestroySprite(&gSprites[task->tMonSpriteId]); + task->tState++; + break; + case 3: + Menu_EraseWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10); + DestroyTask(taskId); + break; + } +} + +bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y) +{ + u8 taskId; + u8 spriteId; + + if (FindTaskIdByFunc(Task_PokemonPicWindow) != 0xFF) + { + return FALSE; + } + else + { + Menu_DrawStdWindowFrame(x, y, x + 9, y + 10); + taskId = CreateTask(Task_PokemonPicWindow, 0x50); + gTasks[taskId].tState = 0; + gTasks[taskId].tMonSpecies = species; + spriteId = CreateMonSprite_PicBox(species, x * 8 + 40, y * 8 + 40, 0); + gTasks[taskId].tMonSpriteId = spriteId; + gTasks[taskId].tWindowX = x; + gTasks[taskId].tWindowY = y; + gSprites[spriteId].callback = SpriteCallbackDummy; + gSprites[spriteId].oam.priority = 0; + return TRUE; + } +} + +bool8 (*ScriptMenu_GetPicboxWaitFunc(void))(void) +{ + u8 taskId = FindTaskIdByFunc(Task_PokemonPicWindow); + + if (taskId == 0xFF) + return NULL; + gTasks[taskId].tState++; + return IsPicboxClosed; +} + +static bool8 IsPicboxClosed(void) +{ + if (FindTaskIdByFunc(Task_PokemonPicWindow) == 0xFF) + return TRUE; + else + return FALSE; +} + +#undef tState +#undef tMonSpecies +#undef tMonSpriteId +#undef tWindowX +#undef tWindowY diff --git a/src/script_movement.c b/src/script_movement.c new file mode 100644 index 000000000..653dffcbf --- /dev/null +++ b/src/script_movement.c @@ -0,0 +1,227 @@ +#include "global.h" +#include "script_movement.h" +#include "event_object_movement.h" +#include "task.h" +#include "util.h" + +static EWRAM_DATA const u8 *gUnknown_020384F8[16] = {0}; + +static void sub_80A2198(u8); +static u8 sub_80A21E0(void); +static bool8 sub_80A21F4(u8, u8, const u8 *); +static u8 sub_80A2260(u8, u8); +static bool8 sub_80A2370(u8, u8); +static void sub_80A23C8(u8, u8, u8, const u8 *); +static void UnfreezeObjects(u8); +static void Task_80A244C(u8); +static void sub_80A2490(u8, u8, u8, const u8 *); + +bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript) +{ + u8 mapObjId; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjId)) + return TRUE; + if (!FuncIsActiveTask(Task_80A244C)) + sub_80A2198(50); + return sub_80A21F4(sub_80A21E0(), mapObjId, movementScript); +} + +bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapBank) +{ + u8 mapObjId; + u8 r4; + u8 r1; + + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapBank, &mapObjId)) + return TRUE; + r4 = sub_80A21E0(); + r1 = sub_80A2260(r4, mapObjId); + if (r1 == 16) + return TRUE; + return sub_80A2370(r4, r1); +} + +void sub_80A2178(void) +{ + u8 taskId; + + taskId = sub_80A21E0(); + if (taskId != 0xFF) + { + UnfreezeObjects(taskId); + DestroyTask(taskId); + } +} + +static void sub_80A2198(u8 priority) +{ + u8 taskId; + u8 i; + + taskId = CreateTask(Task_80A244C, priority); + for (i = 1; i < 16; i++) + gTasks[taskId].data[i] = 0xFFFF; +} + +static u8 sub_80A21E0(void) +{ + return FindTaskIdByFunc(Task_80A244C); +} + +static bool8 sub_80A21F4(u8 taskId, u8 mapObjId, const u8 *movementScript) +{ + u8 r4; + + r4 = sub_80A2260(taskId, mapObjId); + if (r4 != 16) + { + if (sub_80A2370(taskId, r4) == 0) + { + return TRUE; + } + else + { + sub_80A23C8(taskId, r4, mapObjId, movementScript); + return FALSE; + } + } + r4 = sub_80A2260(taskId, 0xFF); + if (r4 == 16) + { + return TRUE; + } + else + { + sub_80A23C8(taskId, r4, mapObjId, movementScript); + return FALSE; + } +} + +static u8 sub_80A2260(u8 taskId, u8 b) +{ + u8 *ptr; + u8 i; + + ptr = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < 16; i++, ptr++) + { + if (*ptr == b) + return i; + } + return 16; +} + +static void sub_80A229C(u8 taskId, u8 b, u8 **c) +{ + u8 i; + + *c = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < b; i++, (*c)++) + ; +} + +static void sub_80A22D0(u8 taskId, u8 b, u8 c) +{ + u8 *ptr; + + sub_80A229C(taskId, b, &ptr); + *ptr = c; //what is this supposed to do? +} + +static void sub_80A22F4(u8 taskId, u8 b, u8 *c) +{ + u8 *ptr; + + sub_80A229C(taskId, b, &ptr); + *c = *ptr; +} + +static void sub_80A2318(u8 a, u8 b) +{ + u16 var = ~gBitTable[b]; + + gTasks[a].data[0] &= var; +} + +static void sub_80A2348(u8 taskId, u8 b) +{ + gTasks[taskId].data[0] |= gBitTable[b]; +} + +static bool8 sub_80A2370(u8 taskId, u8 b) +{ + u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b]; + + if (var != 0) + return TRUE; + else + return FALSE; +} + +static void npc_obj_offscreen_culling_and_flag_update(u8 a, const u8 *movementScript) +{ + gUnknown_020384F8[a] = movementScript; +} + +static const u8 *sub_80A23B8(u8 a) +{ + return gUnknown_020384F8[a]; +} + +static void sub_80A23C8(u8 taskId, u8 b, u8 mapObjId, const u8 *movementScript) +{ + sub_80A2318(taskId, b); + npc_obj_offscreen_culling_and_flag_update(b, movementScript); + sub_80A22D0(taskId, b, mapObjId); +} + +static void UnfreezeObjects(u8 taskId) +{ + u8 *pMapObjId; + u8 i; + + pMapObjId = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < 16; i++, pMapObjId++) + { + if (*pMapObjId != 0xFF) + UnfreezeMapObject(&gMapObjects[*pMapObjId]); + } +} + +static void Task_80A244C(u8 taskId) +{ + u8 i; + u8 var; + + for (i = 0; i < 16; i++) + { + sub_80A22F4(taskId, i, &var); + if (var != 0xFF) + sub_80A2490(taskId, i, var, sub_80A23B8(i)); + } +} + +static void sub_80A2490(u8 taskId, u8 b, u8 mapObjId, const u8 *d) +{ + u8 var; + + if (FieldObjectIsSpecialAnimActive(&gMapObjects[mapObjId]) + && !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId])) + return; + + var = *d; + if (var == 0xFE) + { + sub_80A2348(taskId, b); + FreezeMapObject(&gMapObjects[mapObjId]); + } + else + { + if (!FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], var)) + { + d++; + npc_obj_offscreen_culling_and_flag_update(b, d); + } + } +} diff --git a/src/secret_base.c b/src/secret_base.c new file mode 100644 index 000000000..210d49835 --- /dev/null +++ b/src/secret_base.c @@ -0,0 +1,1716 @@ +#include "global.h" +#include "constants/decorations.h" +#include "secret_base.h" +#include "decoration.h" +#include "constants/species.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "field_specials.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "fldeff_decoration.h" +#include "link.h" +#include "main.h" +#include "sound.h" +#include "constants/songs.h" +#include "constants/maps.h" +#include "map_name_popup.h" +#include "menu.h" +#include "menu_helpers.h" +#include "metatile_behavior.h" +#include "new_game.h" +#include "palette.h" +#include "pokemon.h" +#include "overworld.h" +#include "script.h" +#include "sound.h" +#include "constants/species.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "constants/vars.h" + + +static void sub_80BC7D8(u8 taskId); +static void sub_80BC824(u8 taskId); +static u8 sub_80BC948(u8 a); +static void sub_80BC980(u8 taskId); +static void sub_80BC9E4(u8 taskId); +static void sub_80BCA84(u8); +static void sub_80BCAEC(u8 taskId); +static void sub_80BCB90(u8); +static void sub_80BCBC0(u8); +static void sub_80BCBF8(u8 taskId); +static void sub_80BCC54(u8 taskId); +static void Task_SecretBasePC_Registry(u8 taskId); + +extern u8 gUnknown_0815F399[]; +extern u8 gUnknown_0815F49A[]; +EWRAM_DATA u8 gUnknown_020387DC = 0; + +const struct +{ + u16 unk_083D1358_0; + u16 unk_083D1358_1; +} gUnknown_083D1358[] = { + {0x26, 0x36}, + {0x27, 0x37}, + {0x1a0, 0x1a1}, + {0x1a8, 0x1a9}, + {0x1b0, 0x1b1}, + {0x208, 0x210}, + {0x271, 0x278} +}; + + +const u8 gUnknown_083D1374[] = { + MAP_NUM(SECRET_BASE_RED_CAVE1), 0, 1, 3, + MAP_NUM(SECRET_BASE_RED_CAVE2), 0, 5, 9, + MAP_NUM(SECRET_BASE_RED_CAVE3), 0, 1, 3, + MAP_NUM(SECRET_BASE_RED_CAVE4), 0, 7, 13, + MAP_NUM(SECRET_BASE_BROWN_CAVE1), 0, 2, 3, + MAP_NUM(SECRET_BASE_BROWN_CAVE2), 0, 9, 2, + MAP_NUM(SECRET_BASE_BROWN_CAVE3), 0, 13, 4, + MAP_NUM(SECRET_BASE_BROWN_CAVE4), 0, 1, 2, + MAP_NUM(SECRET_BASE_BLUE_CAVE1), 0, 1, 3, + MAP_NUM(SECRET_BASE_BLUE_CAVE2), 0, 1, 2, + MAP_NUM(SECRET_BASE_BLUE_CAVE3), 0, 3, 15, + MAP_NUM(SECRET_BASE_BLUE_CAVE4), 0, 3, 14, + MAP_NUM(SECRET_BASE_YELLOW_CAVE1), 0, 9, 3, + MAP_NUM(SECRET_BASE_YELLOW_CAVE2), 0, 8, 7, + MAP_NUM(SECRET_BASE_YELLOW_CAVE3), 0, 3, 6, + MAP_NUM(SECRET_BASE_YELLOW_CAVE4), 0, 5, 9, + MAP_NUM(SECRET_BASE_TREE1), 0, 2, 3, + MAP_NUM(SECRET_BASE_TREE2), 0, 5, 6, + MAP_NUM(SECRET_BASE_TREE3), 0, 15, 3, + MAP_NUM(SECRET_BASE_TREE4), 0, 4, 10, + MAP_NUM(SECRET_BASE_SHRUB1), 0, 3, 3, + MAP_NUM(SECRET_BASE_SHRUB2), 0, 1, 2, + MAP_NUM(SECRET_BASE_SHRUB3), 0, 7, 8, + MAP_NUM(SECRET_BASE_SHRUB4), 0, 9, 6 +}; + +const struct MenuAction2 gUnknown_083D13D4[] = { + {SecretBaseText_DelRegist, sub_80BCA84}, + {gUnknownText_Exit, sub_80BCBF8} +}; + +const struct YesNoFuncTable gUnknown_083D13E4 = { + sub_80BCB90, + sub_80BCBC0 +}; + +const u8 gUnknown_083D13EC[] = { + 0x23,0x24,0xF,0x1F,0x21,0x2F,0xE,0x14,0x20,0x22,0x0,0x0 +}; + +extern void *gUnknown_0300485C; +extern u8 gUnknown_081A2E14[]; +extern u8 UnknownString_81A1BB2[]; +extern u8 UnknownString_81A1F67[]; +extern u8 UnknownString_81A2254[]; +extern u8 UnknownString_81A25C3[]; +extern u8 UnknownString_81A2925[]; +extern u8 UnknownString_81A1D74[]; +extern u8 UnknownString_81A20C9[]; +extern u8 UnknownString_81A2439[]; +extern u8 UnknownString_81A2B2A[]; +extern u8 UnknownString_81A2754[]; + + +void ClearSecretBase(struct SecretBaseRecord *record) +{ + u16 i; + u16 j; + + record->secretBaseId = 0; + for (i = 0; i < OT_NAME_LENGTH; i++) + record->playerName[i] = 0xff; + for (i = 0; i < 4; i++) + record->trainerId[i] = 0x00; + record->sbr_field_e = 0; + record->sbr_field_10 = 0; + record->sbr_field_11 = 0; + record->sbr_field_1_0 = 0; + record->gender = 0; + record->sbr_field_1_5 = 0; + record->sbr_field_1_6 = 0; + for (i = 0; i < 16; i++) + { + record->decorations[i] = 0; + record->decorationPos[i] = 0; + } + for (i = 0; i < 6; i++) + { + for (j = 0; j < 4; j++) + record->partyMoves[i * 4 + j] = 0; + record->partyPersonality[i] = 0; + record->partyEVs[i] = 0; + record->partySpecies[i] = 0; + record->partyHeldItems[i] = 0; + record->partyLevels[i] = 0; + } +} + +void ResetSecretBase(u8 idx) +{ + ClearSecretBase(&gSaveBlock1.secretBases[idx]); +} + +void ResetSecretBases(void) +{ + u16 i; + for (i = 0; i < MAX_SECRET_BASES; i++) + ResetSecretBase(i); +} + +void sub_80BB5D0(void) +{ + gUnknown_020387DC = gSpecialVar_0x8004; +} + +void sub_80BB5E4(void) +{ + u16 i; + + gSpecialVar_Result = 0; + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (gUnknown_020387DC == gSaveBlock1.secretBases[i].secretBaseId) + { + gSpecialVar_Result = 1; + VarSet(VAR_CURRENT_SECRET_BASE, i); + break; + } + } +} + +void sub_80BB63C(void) +{ + if (gSaveBlock1.secretBases[0].secretBaseId) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; +} + +u8 sub_80BB66C(void) +{ + s16 x, y; + s16 v0; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF; + if (v0 == 0x90 || v0 == 0x91) + return 1; + else if (v0 == 0x92 || v0 == 0x93) + return 2; + else if (v0 == 0x9a || v0 == 0x9b) + return 3; + else if (v0 == 0x94 || v0 == 0x95) + return 4; + else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d) + return 5; + else if (v0 == 0x98 || v0 == 0x99) + return 6; + return 0; +} + +void sub_80BB70C(void) +{ + gSpecialVar_0x8007 = sub_80BB66C(); +} + +s16 unref_sub_80BB724(u16 *a0, u8 a1) +{ + u16 v2; + + for (v2 = 0; v2 < 0x200; v2++) + { + if ((a0[v2] & 0xFFF) == a1) + return v2; + } + return -1; +} + +void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) +{ + s16 x, y; + + for (y=0; yheight; y++) + { + for (x=0; xwidth; x++) + { + if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) + { + *arg1 = x; + *arg2 = y; + return; + } + } + } +} + +void sub_80BB800(void) +{ + s16 x, y; + s16 tile_id; + u16 idx; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + tile_id = MapGridGetMetatileIdAt(x, y); + for (idx = 0; idx < 7; idx++) + { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) + { + MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } + for (idx = 0; idx < 7; idx++) + { + if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) + { + MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } +} + +u8 sub_80BB8A8(u8 *arg1) +{ + u8 idx; + + for (idx=0; idx<7; idx++) + { + if (arg1[idx] == EOS) + return idx; + } + return 7; +} + +void sub_80BB8CC(void) +{ + u8 nameLength; + u16 idx; + + gSaveBlock1.secretBases[0].secretBaseId = gUnknown_020387DC; + for (idx=0; idx<4; idx++) + gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; + VarSet(VAR_CURRENT_SECRET_BASE, 0); + nameLength = sub_80BB8A8(gSaveBlock2.playerName); + memset(gSaveBlock1.secretBases[0].playerName, 0xFF, OT_NAME_LENGTH); + StringCopyN(gSaveBlock1.secretBases[0].playerName, gSaveBlock2.playerName, nameLength); + gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender; + VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); +} + +void sub_80BB970(struct MapEvents *events) +{ + u16 bgevidx, idx, jdx; + s16 tile_id; + + for (bgevidx = 0; bgevidx < events->bgEventCount; bgevidx++) + { + if (events->bgEvents[bgevidx].kind == 8) + { + for (jdx = 0; jdx < MAX_SECRET_BASES; jdx++) + { + if (gSaveBlock1.secretBases[jdx].secretBaseId == events->bgEvents[bgevidx].bgUnion.secretBaseId) + { + tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); + for (idx = 0; idx < 7; idx++) + { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) + { + MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); + break; + } + } + break; + } + } + } + } +} + +void sub_80BBA14(void) +{ + s8 idx = 4 * (gUnknown_020387DC / 10); + warp1_set_2(MAP_GROUP(SECRET_BASE_RED_CAVE1), gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); +} + +void sub_80BBA48(u8 taskid) +{ + u16 curbaseid; + switch (gTasks[taskid].data[0]) + { + case 0: + gTasks[taskid].data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) + gTasks[taskid].data[0] = 2; + break; + case 2: + curbaseid = VarGet(VAR_CURRENT_SECRET_BASE); + if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) + gSaveBlock1.secretBases[curbaseid].sbr_field_10++; + sub_80BBA14(); + warp_in(); + gFieldCallback = sub_8080990; + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskid); + break; + } +} + +void sub_80BBAF0(void) +{ + CreateTask(sub_80BBA48, 0); + FadeScreen(1, 0); + saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); +} + +bool8 sub_80BBB24(void) +{ + if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE && VarGet(VAR_0x4097) == 0) + return FALSE; + return TRUE; +} + +void sub_80BBB50(u8 taskid) +{ + FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); + if (IsWeatherNotFadingIn() == 1) + { + EnableBothScriptContexts(); + DestroyTask(taskid); + } +} + +void sub_80BBB90(void) +{ + s16 x, y; + + ScriptContext2_Enable(); + HideMapNamePopup(); + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20); + CurrentMapDrawMetatileAt(x + 7, y + 7); + pal_fill_black(); + CreateTask(sub_80BBB50, 0); +} + +void sub_80BBBEC(u8 taskid) +{ + s8 idx; + + if (!gPaletteFade.active) + { + idx = 4 * (gUnknown_020387DC / 10); + Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); + warp_in(); + gFieldCallback = sub_80BBB90; + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskid); + } +} + +void sub_80BBC78(void) +{ + u8 taskid = CreateTask(sub_80BBBEC, 0); + gTasks[taskid].data[0] = 0; + FadeScreen(1, 0); +} + +bool8 CurrentMapIsSecretBase(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP(SECRET_BASE_SHRUB4) && (u8)(gSaveBlock1.location.mapNum) <= MAP_NUM(SECRET_BASE_SHRUB4)) + return TRUE; + return FALSE; +} + +void sub_80BBCCC(u8 flagIn) +{ + u16 curBaseId; + u16 x, y; + + if (CurrentMapIsSecretBase()) + { + curBaseId = VarGet(VAR_CURRENT_SECRET_BASE); + for (x = 0; x < 16; x++) + { + if (gSaveBlock1.secretBases[curBaseId].decorations[x] > 0 + && gSaveBlock1.secretBases[curBaseId].decorations[x] <= 0x78 + && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].permission != DECORPERM_SOLID_MAT) + { + sub_80FF394( + (gSaveBlock1.secretBases[curBaseId].decorationPos[x] >> 4) + 7, + (gSaveBlock1.secretBases[curBaseId].decorationPos[x] & 0xF) + 7, + gSaveBlock1.secretBases[curBaseId].decorations[x]); + } + } + if (curBaseId != 0) + { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); + } + else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) + { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); + } + } +} + +void sub_80BBDD0(void) +{ + u8 *roomdecor; + u8 *roomdecorpos; + u8 decidx; + u8 objid = 0; + u8 metatile; + u8 permission; + u8 ndecor; + u16 curBase = VarGet(VAR_CURRENT_SECRET_BASE); + + if (!CurrentMapIsSecretBase()) + { + roomdecor = gSaveBlock1.playerRoomDecor; + roomdecorpos = gSaveBlock1.playerRoomDecorPos; + ndecor = 12; + } + else + { + roomdecor = gSaveBlock1.secretBases[curBase].decorations; + roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; + ndecor = 16; + } + for (decidx = 0; decidx < ndecor; decidx++) + { + if (roomdecor[decidx] != DECOR_NONE) + { + permission = gDecorations[roomdecor[decidx]].permission; + if (permission == DECORPERM_SOLID_MAT) + { + for (objid = 0; objid < gMapHeader.events->mapObjectCount; objid++) + { + if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) + break; + } + if (objid != gMapHeader.events->mapObjectCount) + { + gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; + gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; + metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); + if (sub_80572D8(metatile) == TRUE || sub_80572EC(metatile) == TRUE) + { + gSpecialVar_Result = gMapHeader.events->mapObjects[objid].graphicsId + VAR_0x3F20; + VarSet(gSpecialVar_Result, gDecorations[roomdecor[decidx]].tiles[0]); + gSpecialVar_Result = gMapHeader.events->mapObjects[objid].localId; + FlagClear(gSpecialVar_0x8004 + 0xAE); + show_sprite(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + sub_805C0F8(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); + sub_805C78C(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + gSpecialVar_0x8004 ++; + } + } + } + } + } +} + +void sub_80BBFA4(void) +{ + int curBase = VarGet(VAR_CURRENT_SECRET_BASE); + VarSet(VAR_OBJ_GFX_ID_F, gUnknown_083D13EC[sub_80BCCA4(curBase)]); +} + +void sub_80BBFD8(struct MapPosition *position, struct MapEvents *events) +{ + s16 bgevtidx; + + for (bgevtidx = 0; bgevtidx < events->bgEventCount; bgevtidx++) + { + if (events->bgEvents[bgevtidx].kind == 8 && position->x == events->bgEvents[bgevtidx].x + 7 + && position->y == events->bgEvents[bgevtidx].y + 7) + { + gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; + break; + } + } +} + +void sub_80BC038(struct MapPosition *position, struct MapEvents *events) +{ + sub_80BBFD8(position, events); + sub_80BB5E4(); + ScriptContext1_SetupScript(gUnknown_081A2E14); +} + +bool8 sub_80BC050(void) +{ + sub_80BB5D0(); + sub_80BB5E4(); + if (gSpecialVar_Result == 1) + return FALSE; + return TRUE; +} + +void sub_80BC074(u8 taskid) +{ + switch (gTasks[taskid].data[0]) + { + case 0: + ScriptContext2_Enable(); + gTasks[taskid].data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) + gTasks[taskid].data[0] = 2; + break; + case 2: + copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); + warp_in(); + gFieldCallback = mapldr_default; + SetMainCallback2(CB2_LoadMap); + ScriptContext2_Disable(); + DestroyTask(taskid); + break; + } +} + +void sub_80BC0F8(void) +{ + CreateTask(sub_80BC074, 0); + FadeScreen(1, 0); +} + +void sub_80BC114(void) +{ + if (gSaveBlock1.secretBases[0].secretBaseId != gUnknown_020387DC) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; +} + +u8 sub_80BC14C(u8 sbid) +{ + s16 idx; + + for (idx = 0; idx < MAX_SECRET_BASES; idx++) + { + if (gSaveBlock1.secretBases[idx].secretBaseId == sbid) + return idx; + } + return 0; +} + +u8 *sub_80BC190(u8 *dest, u8 arg1) +{ + u8 local1; + u8 *str; + + local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].playerName); + + str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].playerName, local1); + str[0] = EOS; + +#if ENGLISH + return StringAppend(dest, gOtherText_PlayersBase); +#elif GERMAN + return de_sub_8073174(dest, gOtherText_PlayersBase); +#endif +} + +u8 *GetSecretBaseMapName(u8 *dest) +{ + gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].secretBaseId; + return sub_80BC190(dest, VarGet(VAR_CURRENT_SECRET_BASE)); +} + +void BufferSecretBaseOwnerName(void) +{ + u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_CURRENT_SECRET_BASE)].playerName; + u8 *var1 = gStringVar1; + u8 var2 = sub_80BB8A8(var0); + u8 *var3 = StringCopyN(var1, var0, var2); + *var3 = EOS; +} + +bool8 sub_80BC268(u8 i) +{ + if (gSaveBlock1.secretBases[i].sbr_field_1_6) + return TRUE; + else + return FALSE; +} + +u8 sub_80BC298(struct Pokemon *mon) +{ + u16 evsum = GetMonData(mon, MON_DATA_HP_EV); + evsum += GetMonData(mon, MON_DATA_ATK_EV); + evsum += GetMonData(mon, MON_DATA_DEF_EV); + evsum += GetMonData(mon, MON_DATA_SPEED_EV); + evsum += GetMonData(mon, MON_DATA_SPATK_EV); + evsum += GetMonData(mon, MON_DATA_SPDEF_EV); + return (u8)(evsum / 6); +} + +#ifdef NONMATCHING +// So much is wrong with this function. +// The compiler likes to store pointers in temp variables. That's not what it's supposed to do. +void sub_80BC300(void) +{ + u16 partyidx; + u16 moveidx; + u16 sbpartyidx = 0; + for (partyidx=0; partyidxbgEventCount; eventId++) + { + if (mapEvents->bgEvents[eventId].kind == 8 + && gSaveBlock1.secretBases[0].secretBaseId == mapEvents->bgEvents[eventId].bgUnion.secretBaseId) + { + u16 i; + s16 tileId = MapGridGetMetatileIdAt(mapEvents->bgEvents[eventId].x + 7, mapEvents->bgEvents[eventId].y + 7); + + for (i = 0; i < 7; i++) + { + if (gUnknown_083D1358[i].unk_083D1358_1 == tileId) + { + MapGridSetMetatileIdAt( + mapEvents->bgEvents[eventId].x + 7, + mapEvents->bgEvents[eventId].y + 7, + gUnknown_083D1358[i].unk_083D1358_0 | 0xc00); + break; + } + } + + DrawWholeMapView(); + break; + } + } +} + +void MoveSecretBase(void) +{ + u16 backupValue; + sub_80BC474(); + IncrementGameStat(GAME_STAT_MOVED_SECRET_BASE); + + backupValue = gSaveBlock1.secretBases[0].sbr_field_e; + ResetSecretBase(0); + gSaveBlock1.secretBases[0].sbr_field_e = backupValue; +} + +u8 sub_80BC538(void) +{ + s16 secretBaseIndex; + u8 retVal = 0; + + for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) + { + if (sub_80BC268(secretBaseIndex) == TRUE) + retVal++; + } + return retVal; +} + +void sub_80BC56C(void) +{ + if (sub_80BC268(sub_80BC14C(gUnknown_020387DC)) == TRUE) + gSpecialVar_Result = 1; + else if (sub_80BC538() > 9) + gSpecialVar_Result = 2; + else + gSpecialVar_Result = 0; +} + +void sub_80BC5BC(void) +{ + gSaveBlock1.secretBases[sub_80BC14C(gUnknown_020387DC)].sbr_field_1_6 ^= 1; + FlagSet(FLAG_DECORATION_16); +} + +void SecretBasePC_Decoration(void) +{ + CreateTask(Task_SecretBasePC_Decoration, 0); +} + +void SecretBasePC_Registry(void) +{ + CreateTask(Task_SecretBasePC_Registry, 0); +} + +void Task_SecretBasePC_Registry(u8 taskId) +{ + s16 *taskData; + + ScriptContext2_Enable(); + ClearVerticalScrollIndicatorPalettes(); + LoadScrollIndicatorPalette(); + + taskData = gTasks[taskId].data; + taskData[0] = sub_80BC538(); + if (taskData[0] != 0) + { + if (taskData[0] > 7) + taskData[3] = 7; + else + taskData[3] = taskData[0]; + + taskData[1] = 0; + taskData[2] = 0; + + Menu_EraseWindowRect(0, 0, 29, 19); + sub_80BC7D8(taskId); + + gTasks[taskId].func = sub_80BC824; + } + else + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoRegistry, sub_80BCC54, 0); + } +} + +void sub_80BC6B0(u8 taskId) +{ + u8 i; + s16 *taskData = gTasks[taskId].data; + u8 m = 0; + u8 n = 0; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (m == taskData[2]) + { + m = i; + break; + } + + if (sub_80BC268(i) == TRUE) + m++; + } + + for (i = m; i < MAX_SECRET_BASES; i++) + { + if (sub_80BC268(i) == TRUE) + { + sub_80BC190(gStringVar1, i); + Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3); + Menu_PrintText(gStringVar1, 18, 2 * n + 2); + if (++n == 8) + break; + } + } + + if (n < 8) + { + Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3); + Menu_PrintText(gUnknownText_Exit, 18, 2 * n + 2); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + if (n != 7) + Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match + } + else + { + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xbc, 0x98); + } + + if (taskData[2] == 0) + DestroyVerticalScrollIndicator(TOP_ARROW); + else + CreateVerticalScrollIndicators(TOP_ARROW, 0xbc, 0x08); +} + +void sub_80BC7D8(u8 taskId) +{ + u16 *taskData = gTasks[taskId].data; + Menu_DrawStdWindowFrame(17, 0, 29, 19); + InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); + + sub_80BC6B0(taskId); +} + +void sub_80BC824(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (taskData[1]) + { + PlaySE(SE_SELECT); + taskData[1] = Menu_MoveCursor(-1); + } + else if (taskData[2]) + { + PlaySE(SE_SELECT); + taskData[2]--; + sub_80BC6B0(taskId); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (taskData[1] == taskData[3]) + { + if (taskData[2] + taskData[1] != taskData[0]) + { + PlaySE(SE_SELECT); + taskData[2]++; + sub_80BC6B0(taskId); + } + } + else + { + PlaySE(SE_SELECT); + taskData[1] = Menu_MoveCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (taskData[1] + taskData[2] == taskData[0]) + { + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + sub_80BCC54(taskId); + } + else + { + Menu_DestroyCursor(); + taskData[4] = sub_80BC948(taskData[1] + taskData[2]); + sub_80BC980(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + sub_80BCC54(taskId); + } +} + +u8 sub_80BC948(u8 a) +{ + u8 secretBaseIndex; + u8 count = 0; + + for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) + { + if (sub_80BC268(secretBaseIndex) == TRUE) + { + if (a == count) + { + return secretBaseIndex; + } + + count++; + } + } + + return 0; +} + +void sub_80BC980(u8 taskId) +{ + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + Menu_DrawStdWindowFrame(1, 0, 12, 5); + Menu_PrintItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4); + InitMenu(0, 2, 1, 2, 0, 10); + gTasks[taskId].func = sub_80BC9E4; +} + +void sub_80BC9E4(u8 taskId) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (Menu_GetCursorPos()) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (Menu_GetCursorPos() != 1) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_083D13D4[Menu_GetCursorPos()].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_80BCBF8(taskId); + } +} + +void sub_80BCA84(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + + sub_80BC190(gStringVar1, taskData[4]); + StringExpandPlaceholders(gStringVar4, gOtherText_OkayToDeleteFromRegistry); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80BCAEC, 0); +} + +void sub_80BCAEC(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083D13E4); +} + +void sub_80BCB10(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + Menu_EraseWindowRect(0, 0, 29, 19); + + gSaveBlock1.secretBases[taskData[4]].sbr_field_1_6 = 0; + taskData[0]--; + + if (taskData[2] > 0) + taskData[2]--; + + if (taskData[0] < 8) + taskData[3]--; + + sub_80BC7D8(taskId); + gTasks[taskId].func = sub_80BC824; +} + +void sub_80BCB90(u8 taskId) +{ + Menu_EraseWindowRect(20, 8, 26, 13); + DisplayItemMessageOnField(taskId, gOtherText_RegisteredDataDeleted, sub_80BCB10, 0); +} + +void sub_80BCBC0(u8 taskId) +{ + Menu_EraseWindowRect(0, 0, 29, 19); + + sub_80BC7D8(taskId); + gTasks[taskId].func = sub_80BC824; +} + +void sub_80BCBF8(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); + Menu_EraseWindowRect(1, 0, 12, 5); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + + gTasks[taskId].func = sub_80BC824; +} + +void sub_80BCC54(u8 taskId) +{ + u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); + + BuyMenuFreeMemory(); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + + if (curBaseIndex == 0) + ScriptContext1_SetupScript(gUnknown_0815F399); + else + ScriptContext1_SetupScript(gUnknown_0815F49A); + + DestroyTask(taskId); +} + +u8 sub_80BCCA4(u8 secretBaseIndex) +{ + return (gSaveBlock1.secretBases[secretBaseIndex].playerName[OT_NAME_LENGTH] % 5) + + gSaveBlock1.secretBases[secretBaseIndex].gender * 5; +} + +const u8 *GetSecretBaseTrainerLoseText(void) +{ + u8 param = sub_80BCCA4(VarGet(VAR_CURRENT_SECRET_BASE)); + if (param == 0) return UnknownString_81A1BB2; + if (param == 1) return UnknownString_81A1F67; + if (param == 2) return UnknownString_81A2254; + if (param == 3) return UnknownString_81A25C3; + if (param == 4) return UnknownString_81A2925; + if (param == 5) return UnknownString_81A1D74; + if (param == 6) return UnknownString_81A20C9; + if (param == 7) return UnknownString_81A2439; + if (param == 8) return UnknownString_81A2754; + return UnknownString_81A2B2A; +} + +// Debugging function to test secret base battles. +void unref_sub_80BCD7C(u8 secretBaseIndex) +{ + u16 i; + + for (i = 0; i < 1; i++) + { + gSaveBlock1.secretBases[secretBaseIndex].partyPersonality[i] = i + 1; + gSaveBlock1.secretBases[secretBaseIndex].partyMoves[i * 4] = i + 1; + gSaveBlock1.secretBases[secretBaseIndex].partySpecies[i] = SPECIES_TREECKO; + gSaveBlock1.secretBases[secretBaseIndex].partyHeldItems[i] = i + 1; + gSaveBlock1.secretBases[secretBaseIndex].partyLevels[i] = i + 5; + gSaveBlock1.secretBases[secretBaseIndex].partyEVs[i] = i * 5; + } +} + +void sub_80BCE1C(void) +{ + u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); + + sub_810FB10(1); + CreateSecretBaseEnemyParty(&gSaveBlock1.secretBases[curBaseIndex]); +} + +void sub_80BCE4C() +{ + gSaveBlock1.secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].sbr_field_1_5 = gSpecialVar_Result; +} + +void sub_80BCE90() +{ + u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); + + if (!FlagGet(FLAG_DAILY_UNKNOWN_8C2)) + { + u8 i; + + for (i = 0; i < MAX_SECRET_BASES; i++) + gSaveBlock1.secretBases[i].sbr_field_1_5 = 0; + + FlagSet(FLAG_DAILY_UNKNOWN_8C2); + } + + gSpecialVar_0x8004 = sub_80BCCA4(curBaseIndex); + gSpecialVar_Result = gSaveBlock1.secretBases[curBaseIndex].sbr_field_1_5; +} + +void sub_80BCF1C(u8 taskId) +{ + s16 x, y; + u32 behavior; + s16 *taskData = gTasks[taskId].data; + + switch (taskData[1]) + { + case 0: + PlayerGetDestCoords(&taskData[2], &taskData[3]); + taskData[1] = 1; + break; + case 1: + PlayerGetDestCoords(&x, &y); + if (x != taskData[2] || y != taskData[3]) + { + taskData[2] = x; + taskData[3] = y; + + behavior = MapGridGetMetatileBehaviorAt(x, y); + if (sub_8057350(behavior) == TRUE) + DoYellowCave4Sparkle(); + else if (sub_8057314(behavior) == TRUE) + sub_80C68A4(MapGridGetMetatileIdAt(x, y), x, y); + else if (sub_8057328(behavior) == TRUE) + sub_80C6A54(x, y); + else if (sub_805733C(behavior) == TRUE) + DoDecorationSoundEffect(MapGridGetMetatileIdAt(x, y)); + } + break; + case 2: + if (!FieldEffectActiveListContains(taskData[4])) + taskData[1] = 1; + break; + } +} + +void sub_80BD034(u8 i, struct SecretBaseRecord *secretBase) +{ + gSaveBlock1.secretBases[i] = *secretBase; + gSaveBlock1.secretBases[i].sbr_field_1_6 = 2; +} + +bool8 sub_80BD070(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (baseA->trainerId[i] != baseB->trainerId[i]) + return FALSE; + } + + return TRUE; +} + +bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) +{ + u8 i; + + for (i = 0; i < OT_NAME_LENGTH && (baseA->playerName[i] != 0xFF || baseB->playerName[i] != 0xFF); i++) + { + if (baseA->playerName[i] != baseB->playerName[i]) + return FALSE; + } + + return TRUE; +} + +bool8 sub_80BD0EC(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) +{ + if (baseA->gender == baseB->gender && sub_80BD070(baseA, baseB) && sub_80BD0A0(baseA, baseB)) + return TRUE; + else + return FALSE; +} + +s16 sub_80BD12C(u8 secretBaseId) +{ + s16 i; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].secretBaseId == secretBaseId) + return i; + } + + return -1; +} + +u8 sub_80BD170(void) +{ + s16 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].secretBaseId == 0) + return i; + } + + return 0; +} + +u8 sub_80BD1B0(void) +{ + s16 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 0 && gSaveBlock1.secretBases[i].sbr_field_1_0 == 0) + return i; + } + + return 0; +} + +u8 sub_80BD1FC(struct SecretBaseRecord *secretBase) +{ + s16 secretBaseIndex; + + if (secretBase->secretBaseId == 0) + return 0; + + secretBaseIndex = sub_80BD12C(secretBase->secretBaseId); + if (secretBaseIndex != 0) + { + if (secretBaseIndex != -1) + { + if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_0 == 1) + return 0; + if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_6 != 2 + || secretBase->sbr_field_1_0 == 1) + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + } + else + { + secretBaseIndex = sub_80BD170(); + if (secretBaseIndex != 0) + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + secretBaseIndex = sub_80BD1B0(); + if (secretBaseIndex) + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + } + } + + return 0; +} + +void sub_80BD280(void) +{ + u8 i; + u8 j; + struct SecretBaseRecord temp; + struct SecretBaseRecord *secretBases = gSaveBlock1.secretBases; + + for (i = 1; i < MAX_SECRET_BASES - 1; i++) + { + for (j = i + 1; j < MAX_SECRET_BASES; j++) + { + if ((!secretBases[i].sbr_field_1_6 && secretBases[j].sbr_field_1_6 == 1) + || (secretBases[i].sbr_field_1_6 == 2 && secretBases[j].sbr_field_1_6 != 2)) + { + temp = secretBases[i]; + secretBases[i] = secretBases[j]; + secretBases[j] = temp; + } + } + } +} + +void sub_80BD328(struct SecretBaseRecord *secretBases, u8 b) +{ + u16 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (secretBases[i].sbr_field_1_6 == b) + sub_80BD1FC(&secretBases[i]); + } +} + +bool8 sub_80BD358(struct SecretBaseRecord *secretBase) +{ + u8 i; + + if (!secretBase->secretBaseId) + return FALSE; + + if (secretBase->secretBaseId && secretBase->gender != gSaveBlock2.playerGender) + return FALSE; + + // Check if the player's trainer Id matches the secret base's id. + for (i = 0; i < 4; i++) + { + if (secretBase->trainerId[i] != gSaveBlock2.playerTrainerId[i]) + return FALSE; + } + + for (i = 0; i < OT_NAME_LENGTH && (secretBase->playerName[i] != 0xFF || gSaveBlock2.playerName[i] != 0xFF); i++) + { + if (secretBase->playerName[i] != gSaveBlock2.playerName[i]) + return FALSE; + } + + return TRUE; +} + +void sub_80BD3DC(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) +{ + u8 i; + u8 var1 = 0; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if ((var1 & 1) == 0) + { + if (sub_80BD358(&basesA[i]) == TRUE) + { + ClearSecretBase(&basesA[i]); + var1 |= 1; + } + } + + if ((var1 & 2) == 0) + { + if (sub_80BD358(&basesB[i]) == TRUE) + { + ClearSecretBase(&basesB[i]); + var1 |= 2; + } + } + + if ((var1 & 4) == 0) + { + if (sub_80BD358(&basesC[i]) == TRUE) + { + ClearSecretBase(&basesC[i]); + var1 |= 4; + } + } + + if (var1 == 7) + break; + } +} + +bool8 sub_80BD494(struct SecretBaseRecord *base, struct SecretBaseRecord *secretBases, u8 c) +{ + u8 i; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (secretBases[i].secretBaseId) + { + if (sub_80BD0EC(base, &secretBases[i]) == TRUE) + { + if (c == 0) + { + ClearSecretBase(&secretBases[i]); + return FALSE; + } + + if (base->sbr_field_e > secretBases[i].sbr_field_e) + { + ClearSecretBase(&secretBases[i]); + return FALSE; + } + + secretBases[i].sbr_field_1_0 = base->sbr_field_1_0; + + ClearSecretBase(base); + return TRUE; + } + } + } + + return FALSE; +} + +void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC, struct SecretBaseRecord *basesD) +{ + u8 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (basesA[i].secretBaseId) + { + if (basesA[i].sbr_field_1_6 == 1) + basesA[i].sbr_field_1_0 = 1; + + if (!sub_80BD494(&basesA[i], basesB, i)) + { + if (!sub_80BD494(&basesA[i], basesC, i)) + sub_80BD494(&basesA[i], basesD, i); + } + } + } + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (basesB[i].secretBaseId) + { + basesB[i].sbr_field_1_5 = 0; + + if (!sub_80BD494(&basesB[i], basesC, i)) + sub_80BD494(&basesB[i], basesD, i); + } + } + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (basesC[i].secretBaseId) + { + basesC[i].sbr_field_1_5 = 0; + sub_80BD494(&basesC[i], basesD, i); + } + + if (basesD[i].secretBaseId) + basesD[i].sbr_field_1_5 = 0; + } +} + +void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) +{ + sub_80BD3DC(basesA, basesB, basesC); + sub_80BD514(gSaveBlock1.secretBases, basesA, basesB, basesC); + + sub_80BD1FC(basesA); + sub_80BD1FC(basesB); + sub_80BD1FC(basesC); + + sub_80BD328(basesA, 1); + sub_80BD328(basesB, 1); + sub_80BD328(basesC, 1); + + sub_80BD328(basesA, 0); + sub_80BD328(basesB, 0); + sub_80BD328(basesC, 0); +} + +void sub_80BD674(void *playerRecords, u32 size, u8 c) +{ + if ( +#if DEBUG + gUnknown_020297ED != 0 || +#endif + FlagGet(FLAG_RECEIVED_SECRET_POWER)) + { + u16 i; + + u8 numLinkedPlayers = GetLinkPlayerCount(); + switch (numLinkedPlayers) + { + case 2: + memset(playerRecords + size * 2, 0, size); + memset(playerRecords + size * 3, 0, size); + break; + case 3: + memset(playerRecords + size * 3, 0, size); + break; + } + + switch (c) + { + case 0: + sub_80BD610(playerRecords + size, playerRecords + size * 2, playerRecords + size * 3); + break; + case 1: + sub_80BD610(playerRecords + size * 2, playerRecords + size * 3, playerRecords); + break; + case 2: + sub_80BD610(playerRecords + size * 3, playerRecords, playerRecords + size); + break; + case 3: + sub_80BD610(playerRecords, playerRecords + size, playerRecords + size * 2); + break; + } + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].sbr_field_1_0 == 1) + { + gSaveBlock1.secretBases[i].sbr_field_1_6 = 1; + gSaveBlock1.secretBases[i].sbr_field_1_0 = 0; + } + } + + sub_80BD280(); + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 2) + gSaveBlock1.secretBases[i].sbr_field_1_6 = 0; + } + + if (gSaveBlock1.secretBases[0].sbr_field_e != 0xFFFF) + gSaveBlock1.secretBases[0].sbr_field_e++; + } +} diff --git a/src/shop.c b/src/shop.c new file mode 100644 index 000000000..87dbbeb97 --- /dev/null +++ b/src/shop.c @@ -0,0 +1,1251 @@ +#include "global.h" +#include "shop.h" +#include "decompress.h" +#include "field_fadetransition.h" +#include "field_weather.h" +#include "item_menu.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "money.h" +#include "palette.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "task.h" +#include "tv.h" +#include "scanline_effect.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "item.h" +#include "decoration.h" +#include "constants/items.h" +#include "constants/songs.h" +#include "overworld.h" +#include "decoration_inventory.h" +#include "field_camera.h" +#include "ewram.h" + +extern bool8 SellMenu_QuantityRoller(u8, u8); + +extern u8 gBuyMenuFrame_Gfx[]; +extern u16 gBuyMenuFrame_Tilemap[]; +extern u16 gMenuMoneyPal[16]; + +static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode); +static void Shop_PrintItemDescText(void); +static void Task_ReturnToBuyMenu(u8); +static void Task_ExitBuyMenu(u8); +static void Task_ExitBuyMenuDoFade(u8); +static void Task_UpdatePurchaseHistory(u8); +static void Task_HandleShopMenuBuy(u8 taskId); +static void Task_HandleShopMenuSell(u8 taskId); +static void Task_HandleShopMenuQuit(u8 taskId); +static void Task_DoItemPurchase(u8 taskId); +static void Task_CancelItemPurchase(u8 taskId); +static void Task_DoBuySellMenu(u8); +static void Shop_FadeAndRunBuySellCallback(u8); +static void BuyMenuDrawGraphics(void); +static void sub_80B3240(void); +static void DrawFirstMartScrollIndicators(void); +static void Shop_DrawViewport(void); +static void Shop_InitMenus(int, int); +static void Shop_PrintItemDesc(void); +static void Shop_DoCursorAction(u8); +static void Shop_LoadViewportObjects(void); +static void Shop_AnimViewportObjects(void); + +// iwram +static struct MartInfo gMartInfo; + +// ewram +EWRAM_DATA u32 gMartTotalCost = 0; +EWRAM_DATA s16 gMartViewportObjects[16][4] = {0}; +EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0}; +EWRAM_DATA u8 gMartPurchaseHistoryId = 0; + +EWRAM_DATA u8 gUnknown_02038731 = 0; // This really should be in fldeff_escalator, but being in a new file aligns the ewram, which doesnt match the ROM. + +// rodata +static const struct MenuAction2 sBuySellQuitMenuActions[] = +{ + { MartText_Buy, Task_HandleShopMenuBuy }, + { MartText_Sell, Task_HandleShopMenuSell }, + { MartText_Quit2, Task_HandleShopMenuQuit }, +}; + +static const u8 gMartBuySellOptionList[] = {SHOP_BUY, SHOP_SELL, SHOP_EXIT}; +static const u8 gMartBuyNoSellOptionList[] = {SHOP_BUY, SHOP_EXIT}; + +static const u16 gUnusedMartArray[] = {0x2, 0x3, 0x4, 0xD, 0x121, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x0, 0x0}; + +static const struct YesNoFuncTable sShopPurchaseYesNoFuncs[] = +{ + Task_DoItemPurchase, + Task_CancelItemPurchase +}; + +static u8 CreateShopMenu(u8 martType) +{ + ScriptContext2_Enable(); + gMartInfo.martType = martType; + gMartInfo.cursor = 0; + + if (martType == MART_TYPE_0) + { + gMartInfo.numChoices = 2; + Menu_DrawStdWindowFrame(0, 0, 10, 7); + Menu_PrintItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gMartBuySellOptionList); + } + else + { + gMartInfo.numChoices = 1; + Menu_DrawStdWindowFrame(0, 0, 10, 5); + Menu_PrintItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gMartBuyNoSellOptionList); + } + InitMenu(0, 1, 1, gMartInfo.numChoices + 1, 0, 9); // add 1 for cancel + + return CreateTask(Task_DoBuySellMenu, 8); +} + +static void SetShopMenuCallback(void *callbackPtr) +{ + gMartInfo.callback = callbackPtr; +} + +static void SetShopItemsForSale(const u16 *items) +{ + u16 i = 0; + + gMartInfo.itemList = items; + gMartInfo.itemCount = 0; + + while (gMartInfo.itemList[i]) + { + gMartInfo.itemCount++; + i++; + } +} + +static void Task_DoBuySellMenu(u8 taskId) +{ + const u8 taskIdConst = taskId; // why is a local const needed to match? + + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (gMartInfo.cursor) // can move cursor up? + { + PlaySE(SE_SELECT); + gMartInfo.cursor = Menu_MoveCursor(-1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down? + { + PlaySE(SE_SELECT); + gMartInfo.cursor = Menu_MoveCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gMartInfo.martType == MART_TYPE_0) + sBuySellQuitMenuActions[gMartBuySellOptionList[gMartInfo.cursor]].func(taskIdConst); + else + sBuySellQuitMenuActions[gMartBuyNoSellOptionList[gMartInfo.cursor]].func(taskIdConst); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + Task_HandleShopMenuQuit(taskIdConst); + } +} + +static void Task_HandleShopMenuBuy(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16; + gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics; + gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; + FadeScreen(1, 0); +} + +static void Task_HandleShopMenuSell(u8 taskId) +{ + gTasks[taskId].data[8] = (u32)ItemMenu_LoadSellMenu >> 16; + gTasks[taskId].data[9] = (u32)ItemMenu_LoadSellMenu; + gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; + FadeScreen(1, 0); +} + +static void Task_HandleShopMenuQuit(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 8); + sub_80BE3BC(); + ScriptContext2_Disable(); + DestroyTask(taskId); + + if (gMartInfo.callback) + gMartInfo.callback(); // run the callback if it exists. +} + +static void Shop_FadeAndRunBuySellCallback(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2((void *)((u16)gTasks[taskId].data[8] << 16 | (u16)gTasks[taskId].data[9])); + DestroyTask(taskId); + } +} + +static void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) +{ + CreateShopMenu(gMartInfo.martType); + DestroyTask(taskId); +} + +static void Task_ReturnToMartMenu(u8 taskId) +{ + if (IsWeatherNotFadingIn() == 1) + { + if (gMartInfo.martType == MART_TYPE_2) + DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); + else + DisplayItemMessageOnField(taskId, gOtherText_AnythingElse, ReturnToShopMenuAfterExitingSellMenu, 0); + } +} + +void Shop_FadeReturnToMartMenu(void) +{ + pal_fill_black(); + CreateTask(Task_ReturnToMartMenu, 0x8); +} + +void Shop_RunExitSellMenuTask(u8 taskId) +{ + Task_ReturnToMartMenu(taskId); +} + +// unused +void Shop_LoadExitSellMenuTask(u8 taskId) +{ + gTasks[taskId].func = Task_ReturnToMartMenu; +} + +static void MainCB2(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800); +} + +static void BuyMenuDrawGraphics(void) +{ + ClearVideoCallbacks(); + ScanlineEffect_Stop(); + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + gPaletteFade.bufferTransferDisabled = 1; + + /* + THEORY: This seemingly useless loop is required in order to match this + function without hacks. The reason is because it alters the 0 optimization + of a later assignment into using 2 different 0s instead of the same register. + It is speculated that at some point Game Freak insert an artificial + breakpoint here in order to look at the contents of OAM before it is cleared, + possibly because a programmer made a mistake in shop.c which corrupted its + contents. There may have been a macro here which at one point idled on the + while(1) but was changed to 0 for release due to a define somewhere. A + while(0) also matches, but it is more correct to use do {} while(0) as it + was a fix to prevent compiler warnings on older compilers. + */ + do {} while(0); + + DmaFill32Defvars(3, 0, (void*)OAM, OAM_SIZE); + LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00)); + LZDecompressWram(gBuyMenuFrame_Tilemap, ewram18000_2); + LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal)); + FreeAllSpritePalettes(); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); + InitMenuWindow(&gWindowTemplate_81E6DFC); + Shop_DrawViewport(); + gMartInfo.cursor = 0; + gMartInfo.choicesAbove = 0; + Menu_EraseWindowRect(0, 0, 0x20, 0x20); + OpenMoneyWindow(gSaveBlock1.money, 0, 0); + Shop_InitMenus(0, 7); + Shop_PrintItemDesc(); + DrawFirstMartScrollIndicators(); + CreateTask(Shop_DoCursorAction, 0x8); + sub_80B3240(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + SetVBlankCallback(VBlankCB); + SetMainCallback2(MainCB2); +} + +static void sub_80B3240(void) +{ + u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; + + LoadPalette(&colors[1], 0xD1, sizeof colors[1]); + LoadPalette(&colors[0], 0xD8, sizeof colors[0]); +} + +static void DrawFirstMartScrollIndicators(void) +{ + ClearVerticalScrollIndicatorPalettes(); + + if (gMartInfo.itemCount > 7) + { + CreateVerticalScrollIndicators(TOP_ARROW, 172, 12); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); + } +} + +static void Shop_TryDrawVerticalScrollIndicators(void) +{ + if (gMartInfo.choicesAbove == 0) + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); + else + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); + + if (gMartInfo.choicesAbove + 7 >= gMartInfo.itemCount) + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + else + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); +} + +// what is the point of this function? the tiles always get overwritten by BuyMenuDrawTextboxBG. +static void BuyMenuDrawTextboxBG_Old(u16 *array, s16 offset1, s16 offset2) +{ + array[offset1 + offset2] = 0xC3E1; + array[offset1 + offset2 + 1] = 0xC3E1; +} + +static void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2) +{ + // This function draws a whole 2x2 metatile. + array[offset1 + offset2] = array2[0]; // top left + array[offset1 + offset2 + 1] = array2[1]; // top right + array[offset1 + offset2 + 32] = array2[2]; // bottom left + array[offset1 + offset2 + 33] = array2[3]; // bottom right +} + +static void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) +{ + u8 tempVar4 = var4; + s16 offset1 = var1 * 2; + s16 offset2 = (var2 * 0x40) + 0x40; + + switch (tempVar4) + { + case 0: + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3); + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); + break; + case 1: + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); + break; + case 2: + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4); + break; + } +} + +// used to draw the border tiles around the viewport. +static void BuyMenuDrawMapPartialMetatile(s16 var1, int var2, u16 *var3) +{ + s16 offset1 = var1 * 2; + s16 offset2 = (var2 * 0x40) + 0x40; + + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); +} + +static void Shop_DrawViewportTiles(void) +{ + s16 facingX; + s16 facingY; + s16 x; + s16 y; + + GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); + facingX -= 3; + facingY -= 3; + + for (y = 0; y < 6; y++) + { + for (x = 0; x < 7; x++) + { + u16 metatileId = MapGridGetMetatileIdAt(facingX + x, facingY + y); + + if (y != 5 && x != 6) + { + s32 r3 = MapGridGetMetatileLayerTypeAt(facingX + x, facingY + y); + + if (metatileId < 512) + BuyMenuDrawMapMetatile(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8, r3); + else + BuyMenuDrawMapMetatile(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8, r3); + } + else + { + if (metatileId < 512) + BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8); + else + BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8); + } + + if (y == 0 && x != 0 && x != 6) + BuyMenuDrawTextboxBG_Old(gBGTilemapBuffers[1], x * 2, 64); + } + } +} + +static void Shop_DrawViewport(void) +{ + ClearBGTilemapBuffers(); + Shop_LoadViewportObjects(); + Shop_AnimViewportObjects(); + Shop_DrawViewportTiles(); +} + +static void Shop_LoadViewportObjects(void) +{ + s16 facingX; + s16 facingY; + u8 playerHeight; + u8 y; + u8 x; + u8 r8 = 0; + + GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); + playerHeight = PlayerGetZCoord(); + for (y = 0; y < 16; y++) + gMartViewportObjects[y][MAP_OBJ_ID] = 16; + for (y = 0; y < 5; y++) + { + for (x = 0; x < 7; x++) + { + u8 mapObjId = GetFieldObjectIdByXYZ(facingX - 3 + x, facingY - 2 + y, playerHeight); + + if (mapObjId != 16) + { + gMartViewportObjects[r8][MAP_OBJ_ID] = mapObjId; + gMartViewportObjects[r8][X_COORD] = x; + gMartViewportObjects[r8][Y_COORD] = y; + if (gMapObjects[mapObjId].mapobj_unk_18 == 1) + gMartViewportObjects[r8][ANIM_NUM] = 0; + if (gMapObjects[mapObjId].mapobj_unk_18 == 2) + gMartViewportObjects[r8][ANIM_NUM] = 1; + if (gMapObjects[mapObjId].mapobj_unk_18 == 3) + gMartViewportObjects[r8][ANIM_NUM] = 2; + if (gMapObjects[mapObjId].mapobj_unk_18 == 4) + gMartViewportObjects[r8][ANIM_NUM] = 3; + r8++; + } + } + } +} + +static void Shop_AnimViewportObjects(void) +{ + u8 i; + + for (i = 0; i < 16; i++) // max objects? + { + if (gMartViewportObjects[i][MAP_OBJ_ID] == 16) + continue; + + StartSpriteAnim(&gSprites[AddPseudoFieldObject( + gMapObjects[gMartViewportObjects[i][MAP_OBJ_ID]].graphicsId, + SpriteCallbackDummy, + (u16)gMartViewportObjects[i][X_COORD] * 16 + 8, + (u16)gMartViewportObjects[i][Y_COORD] * 16 + 32, + 2)], + gMartViewportObjects[i][ANIM_NUM]); + } +} + +static void BuyMenuDrawTextboxBG(void) +{ + s16 i; + + for (i = 0; i < 0x400; i++) + { + if (ewram18000[i] != 0) + gBGTilemapBuffers[1][i] = ewram18000[i] + 0xC3E0; + } +} + +static void Shop_InitMenus(int firstItemId, int lastItemId) +{ + BuyMenuDrawTextboxBG(); + Shop_DisplayPriceInList(firstItemId, lastItemId, 0); + InitMenu(0, 0xE, 0x2, 0x8, gMartInfo.cursor, 0xF); +} + +// after printing the item quantity and price, restore the textbox tiles before the Yes/No prompt. +static void BuyMenuDrawTextboxBG_Restore(void) +{ + u16 i, j; + + for (i = 0; i < 8; i++) + for (j = 0; j < 14; j++) + gBGTilemapBuffers[1][32 * (i + 12) + j] = ewram18300[32 * i + j] + 0xC3E0; +} + +static void Shop_PrintItemDesc(void) +{ + Shop_PrintItemDescText(); +} + +#define tItemCount data[1] + +static void Shop_DisplayPriceInCheckoutWindow(u8 taskId) +{ + u16 itemListIndex = gMartInfo.choicesAbove + gMartInfo.cursor; + u16 itemId = gMartInfo.itemList[itemListIndex]; + u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); + + PrintMoneyAmount(gTasks[taskId].tItemCount * price, 6, 6, 11); + gStringVar1[0] = EXT_CTRL_CODE_BEGIN; + gStringVar1[1] = 0x14; + gStringVar1[2] = 0x6; + ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].tItemCount, 1, 2); + Menu_PrintText(gOtherText_xString1, 1, 11); + sub_80A3FA0(gBGTilemapBuffers[1], 1, 11, 12, 2, 0xC3E1); +} + +static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControlCode) +{ + u8 *stringPtr = gStringVar1; + + if (hasControlCode) + { + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x1; + stringPtr[2] = 0x2; + stringPtr += 3; + } + + CopyItemName(itemId, stringPtr); + + sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); + stringPtr = gStringVar1; + + if (hasControlCode) + stringPtr = &gStringVar1[3]; + + GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4); + Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1); +} + +static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasControlCode) +{ + u8 *stringPtr = gStringVar1; + + if (hasControlCode) + { + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x1; + stringPtr[2] = 0x2; + stringPtr += 3; + } + + StringCopy(stringPtr, gDecorations[itemId].name); + sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); + stringPtr = gStringVar1; + + if (hasControlCode) + stringPtr = &gStringVar1[3]; + + // some names are the maximum string length for a shop item. Because there is no room for + // a 6 character price (including the currency), a sprite is instead used for anything that + // is the maximum decoration price in order to fit it on screen. + if (gDecorations[itemId].price == 10000) + { + Draw10000Sprite(0x19, var2, hasControlCode); + } + else + { + GetMoneyAmountText(stringPtr, gDecorations[itemId].price, 0x4); + Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1); + } +} + +static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode) +{ + u8 i; + + for (i = firstItemId; i <= lastItemId && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) + { + if (gMartInfo.martType == MART_TYPE_0) + Shop_DisplayNormalPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); + else + Shop_DisplayDecorationPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); + } + + if (i != 8 && gMartInfo.choicesAbove + i == gMartInfo.itemCount) + { + Menu_BlankWindowRect(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3); + Menu_PrintText(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2); + } +} + +static void Shop_PrintItemDescText(void) +{ + if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) + { + if (gMartInfo.martType == MART_TYPE_0) + { + sub_8072AB0(ItemId_GetDescription(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]), + 0x4, 0x68, 0x68, 0x30, 0); + } + else + { + sub_8072AB0(gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].description, + 0x4, 0x68, 0x68, 0x30, 0); + } + } + else + { + sub_8072AB0(gOtherText_QuitShopping, 0x4, 0x68, 0x68, 0x30, 0); + } +} + +static void Shop_DoPremierBallCheck(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + PlaySE(SE_SELECT); + + if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].tItemCount >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) + DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, Task_ReturnToBuyMenu, 0xC3E1); + else + Task_ReturnToBuyMenu(taskId); + } +} + +static void Shop_DoItemTransaction(u8 taskId) +{ + IncrementGameStat(GAME_STAT_SHOPPED); + RemoveMoney(&gSaveBlock1.money, gMartTotalCost); + PlaySE(SE_REGI); + UpdateMoneyWindow(gSaveBlock1.money, 0, 0); + gTasks[taskId].func = Shop_DoPremierBallCheck; +} + +static void Shop_DoPricePrintAndReturnToBuyMenu(u8 taskId) +{ + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Task_ReturnToBuyMenu(taskId); +} + +static void Task_DoItemPurchase(u8 taskId) +{ + Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD); + sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0); + BuyMenuDrawTextboxBG_Restore(); + Shop_DrawViewportTiles(); + + if (IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + { + if (gMartInfo.martType == MART_TYPE_0) + { + if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].tItemCount)) + { + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, Shop_DoItemTransaction, 0xC3E1); + Task_UpdatePurchaseHistory(taskId); + } + else + { + DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); + } + } + else // a normal mart is only type 0, so types 1 and 2 are decoration marts. + { + if (IsThereStorageSpaceForDecoration(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor])) + { + if (gMartInfo.martType == MART_TYPE_1) + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, Shop_DoItemTransaction, 0xC3E1); + else + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, Shop_DoItemTransaction, 0xC3E1); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_SpaceForIsFull); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); + } + } + } + else + { + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); + } +} + +static void Shop_DoYesNoPurchase(u8 taskId) +{ + DisplayYesNoMenu(7, 8, 1); + sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0xC3E1); + DoYesNoFuncWithChoice(taskId, sShopPurchaseYesNoFuncs); +} + +static void Task_CancelItemPurchase(u8 taskId) +{ + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD); + sub_80A3FA0(gBGTilemapBuffers[1], 0x8, 0x9, 0x4, 0x4, 0); + Task_ReturnToBuyMenu(taskId); +} + +static void Shop_PrintPrice(u8 taskId) +{ + if (SellMenu_QuantityRoller(taskId, gMartInfo.curItemCount) == TRUE) + Shop_DisplayPriceInCheckoutWindow(taskId); + + if (gMain.newKeys & A_BUTTON) + { + gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].tItemCount; // set total cost of your purchase. + Menu_EraseWindowRect(0, 0xA, 0xD, 0xD); + sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); + BuyMenuDrawTextboxBG_Restore(); + Shop_DrawViewportTiles(); + CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].tItemCount, 0, 0x2); + ConvertIntToDecimalStringN(gStringVar3, gMartTotalCost, 0, 0x8); + StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); + } + else if (gMain.newKeys & B_BUTTON) + { + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Task_ReturnToBuyMenu(taskId); + } +} + +// set the item count in the mart info to the maximum allowed by the player's budget. +static void Shop_UpdateCurItemCountToMax(u8 taskId) +{ + u16 var; + + gTasks[taskId].tItemCount = 1; + Menu_DrawStdWindowFrame(0, 0xA, 0xD, 0xD); + Shop_DisplayPriceInCheckoutWindow(taskId); + + var = gSaveBlock1.money / (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); + if (var > 99) + gMartInfo.curItemCount = 99; + else + gMartInfo.curItemCount = var; + + gTasks[taskId].func = Shop_PrintPrice; +} + +#ifdef NONMATCHING +static void Shop_MoveItemListUp(void) +{ + u16 *r1; + u16 *r2; + register u8 *r10 asm("r10"); + s32 i; + s32 j; + struct Window *r8 = &gMenuWindow; + + r1 = r8->tilemap; + r1 += 0x1EF; + r2 = r1; + r2 += 64; + r10 = r8->tileData; + + for (i = 0; i < 14; i++) + { + for (j = 0; j < 15; j++) + { + if ((r1[j] & 0x3FF) <= r8->tileDataStartOffset + 1) + r2[j] = r8->tileDataStartOffset + 1; + else + r2[j] = r1[j] + 0x3C; + } + + r1 -= 32; + r2 -= 32; + } + + { + u8 *r1 = r10 + 0x3A20; + u8 *r2 = r1 + 0x780; + for (i = 0; i < 14; i++) + { + DmaCopy16(3, r1, r2, 0x1E0); + r2 -= 0x3C0; + r1 -= 0x3C0; + } + } +} +#else +__attribute__((naked)) +static void Shop_MoveItemListUp(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + ldr r0, _080B4020 @ =gMenuWindow\n\ + mov r8, r0\n\ + ldr r1, [r0, 0x28]\n\ + ldr r3, _080B4024 @ =0x000003de\n\ + adds r1, r3\n\ + adds r2, r1, 0\n\ + adds r2, 0x80\n\ + ldr r7, [r0, 0x24]\n\ + mov r10, r7\n\ + ldr r0, _080B4028 @ =0x000003ff\n\ + mov r9, r0\n\ + movs r6, 0xD\n\ +_080B3FAC:\n\ + adds r3, r2, 0\n\ + subs r3, 0x40\n\ + str r3, [sp]\n\ + movs r7, 0x40\n\ + negs r7, r7\n\ + adds r7, r1\n\ + mov r12, r7\n\ + adds r3, r2, 0\n\ + adds r4, r1, 0\n\ + movs r5, 0xE\n\ +_080B3FC0:\n\ + ldrh r2, [r4]\n\ + mov r1, r9\n\ + ands r1, r2\n\ + mov r7, r8\n\ + ldrh r0, [r7, 0x1A]\n\ + adds r0, 0x1\n\ + cmp r1, r0\n\ + ble _080B3FD4\n\ + adds r0, r2, 0\n\ + adds r0, 0x3C\n\ +_080B3FD4:\n\ + strh r0, [r3]\n\ + adds r3, 0x2\n\ + adds r4, 0x2\n\ + subs r5, 0x1\n\ + cmp r5, 0\n\ + bge _080B3FC0\n\ + ldr r2, [sp]\n\ + mov r1, r12\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080B3FAC\n\ + ldr r1, _080B402C @ =0x00003a20\n\ + add r1, r10\n\ + movs r0, 0xF0\n\ + lsls r0, 3\n\ + adds r2, r1, r0\n\ + ldr r3, _080B4030 @ =0x040000d4\n\ + ldr r5, _080B4034 @ =0x800000f0\n\ + ldr r4, _080B4038 @ =0xfffffc40\n\ + movs r6, 0xD\n\ +_080B3FFC:\n\ + str r1, [r3]\n\ + str r2, [r3, 0x4]\n\ + str r5, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ + adds r2, r4\n\ + adds r1, r4\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080B3FFC\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B4020: .4byte gMenuWindow\n\ +_080B4024: .4byte 0x000003de\n\ +_080B4028: .4byte 0x000003ff\n\ +_080B402C: .4byte 0x00003a20\n\ +_080B4030: .4byte 0x040000d4\n\ +_080B4034: .4byte 0x800000f0\n\ +_080B4038: .4byte 0xfffffc40\n\ + .syntax divided"); +} +#endif + +#ifdef NONMATCHING +static void Shop_MoveItemListDown(void) +{ + u16 *r1; + u16 *r2; + u8 *r10; + s32 i; + s32 j; + struct Window *r8 = &gMenuWindow; + + r1 = r8->tilemap; + r1 += 0x4F; + r2 = r1; + r2 += 64; + r10 = r8->tileData; + + for (i = 0; i < 14; i++) + { + for (j = 0; j < 15; j++) + { + if ((r1[j] & 0x3FF) <= r8->tileDataStartOffset + 1) + r2[j] = r8->tileDataStartOffset + 1; + else + r2[j] = r1[j] + 0x3C; + } + + r1 += 32; + r2 += 32; + } + + { + register u8 *r1 asm("r1") = r10 + 0x960; + register u8 *r2 asm("r2") = r1; + + r1 += 0x780; + for (i = 0; i < 14; i++) + { + DmaCopy16(3, r1, r2, 0x1E0); + r1 += 0x3C0; + r2 += 0x3C0; + } + } +} +#else +__attribute__((naked)) +static void Shop_MoveItemListDown(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + ldr r0, _080B40D8 @ =gMenuWindow\n\ + mov r8, r0\n\ + ldr r2, [r0, 0x28]\n\ + adds r1, r2, 0\n\ + adds r1, 0x9E\n\ + adds r2, r1, 0\n\ + adds r1, 0x80\n\ + ldr r3, [r0, 0x24]\n\ + mov r10, r3\n\ + ldr r7, _080B40DC @ =0x000003ff\n\ + mov r9, r7\n\ + movs r6, 0xD\n\ +_080B4060:\n\ + adds r0, r2, 0\n\ + adds r0, 0x40\n\ + str r0, [sp]\n\ + movs r3, 0x40\n\ + adds r3, r1\n\ + mov r12, r3\n\ + adds r3, r2, 0\n\ + adds r4, r1, 0\n\ + movs r5, 0xE\n\ +_080B4072:\n\ + ldrh r2, [r4]\n\ + mov r1, r9\n\ + ands r1, r2\n\ + mov r7, r8\n\ + ldrh r0, [r7, 0x1A]\n\ + adds r0, 0x1\n\ + cmp r1, r0\n\ + ble _080B4086\n\ + adds r0, r2, 0\n\ + subs r0, 0x3C\n\ +_080B4086:\n\ + strh r0, [r3]\n\ + adds r3, 0x2\n\ + adds r4, 0x2\n\ + subs r5, 0x1\n\ + cmp r5, 0\n\ + bge _080B4072\n\ + ldr r2, [sp]\n\ + mov r1, r12\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080B4060\n\ + movs r1, 0x96\n\ + lsls r1, 4\n\ + add r1, r10\n\ + adds r2, r1, 0\n\ + movs r0, 0xF0\n\ + lsls r0, 3\n\ + adds r1, r0\n\ + ldr r3, _080B40E0 @ =0x040000d4\n\ + ldr r5, _080B40E4 @ =0x800000f0\n\ + movs r4, 0xF0\n\ + lsls r4, 2\n\ + movs r6, 0xD\n\ +_080B40B4:\n\ + str r1, [r3]\n\ + str r2, [r3, 0x4]\n\ + str r5, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ + adds r2, r4\n\ + adds r1, r4\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080B40B4\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B40D8: .4byte gMenuWindow\n\ +_080B40DC: .4byte 0x000003ff\n\ +_080B40E0: .4byte 0x040000d4\n\ +_080B40E4: .4byte 0x800000f0\n\ + .syntax divided"); +} +#endif + +static void Shop_DoCursorAction(u8 taskId) +{ + if (!gPaletteFade.active) + { + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) // only up can be pressed + { + if (gMartInfo.cursor == 0) + { + if (gMartInfo.choicesAbove == 0) // if there are no choices above, dont bother + return; + + PlaySE(SE_SELECT); + gMartInfo.choicesAbove--; // since cursor is at the top and there are choices above the top, scroll the menu up by updating choicesAbove. + Shop_MoveItemListUp(); + Shop_DisplayPriceInList(0, 0, 0); + Shop_PrintItemDescText(); + Shop_TryDrawVerticalScrollIndicators(); + } + else // if the cursor is not 0, choicesAbove cannot be updated yet since the cursor is at the top of the menu, so update cursor. + { + PlaySE(SE_SELECT); + gMartInfo.cursor = Menu_MoveCursor(-1); // move cursor up + Shop_PrintItemDescText(); + } + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) // only down can be pressed + { + if (gMartInfo.cursor == 7) // are you at the bottom of the menu? + { + if (gMartInfo.choicesAbove + gMartInfo.cursor == gMartInfo.itemCount) // are you at cancel? + return; + + PlaySE(SE_SELECT); + gMartInfo.choicesAbove++; + Shop_MoveItemListDown(); + Shop_DisplayPriceInList(7, 7, 0); + Shop_PrintItemDescText(); + Shop_TryDrawVerticalScrollIndicators(); + } + else if (gMartInfo.cursor != gMartInfo.itemCount) + { + PlaySE(SE_SELECT); + gMartInfo.cursor = Menu_MoveCursor(1); + Shop_PrintItemDescText(); + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + + if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) // did you not hit CANCEL? + { + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 1); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0xC, 0xD, 0x13); + + if (gMartInfo.martType == MART_TYPE_0) + { + gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); // set 1x price + if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + { + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge + } + else // _080B42BA + { + CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_HowManyYouWant); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_UpdateCurItemCountToMax, 0xC3E1); + } + } + else // _080B428C + { + gMartTotalCost = gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].price; + + if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + { + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge + } + else + { + StringCopy(gStringVar1, gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].name); + ConvertIntToDecimalStringN(gStringVar2, gMartTotalCost, 0, 0x8); + + if (gMartInfo.martType == MART_TYPE_1) + StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe2); + else + StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe3); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); + } + } + } + else + { + Task_ExitBuyMenu(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu + { + PlaySE(SE_SELECT); + Task_ExitBuyMenu(taskId); + } + } +} + +static void Task_ReturnToBuyMenu(u8 taskId) +{ + Menu_EraseWindowRect(0, 0xE, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0xA, 0xD, 0xD); + sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); + Shop_DrawViewportTiles(); + Shop_InitMenus(6, 7); + Shop_PrintItemDesc(); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + Shop_TryDrawVerticalScrollIndicators(); + gTasks[taskId].func = Shop_DoCursorAction; +} + +static void Task_ExitBuyMenu(u8 taskId) +{ + gFieldCallback = Shop_FadeReturnToMartMenu; + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ExitBuyMenuDoFade; +} + +static void Task_ExitBuyMenuDoFade(u8 taskId) +{ + if (!gPaletteFade.active) + { + CloseMoneyWindow(0, 0); + BuyMenuFreeMemory(); + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + } +} + +// Task_UpdatePurchaseHistory +static void Task_UpdatePurchaseHistory(u8 taskId) +{ + u16 i; + + for (i = 0; i < 3; i++) + { + if (gMartPurchaseHistory[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] + && gMartPurchaseHistory[i].quantity != 0) + { + if (gMartPurchaseHistory[i].quantity + gTasks[taskId].tItemCount > 255) + gMartPurchaseHistory[i].quantity = 255; + else + gMartPurchaseHistory[i].quantity += gTasks[taskId].tItemCount; + return; + } + } + + if (gMartPurchaseHistoryId < 3) + { + gMartPurchaseHistory[gMartPurchaseHistoryId].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]; + gMartPurchaseHistory[gMartPurchaseHistoryId].quantity = gTasks[taskId].tItemCount; + gMartPurchaseHistoryId++; + } +} + +#undef tItemCount + +static void ClearItemPurchases(void) +{ + gMartPurchaseHistoryId = 0; + ClearItemSlots(gMartPurchaseHistory, 3); +} + +void Shop_CreatePokemartMenu(u16 *itemList) +{ + CreateShopMenu(MART_TYPE_0); + SetShopItemsForSale(itemList); + ClearItemPurchases(); + SetShopMenuCallback(EnableBothScriptContexts); +} + +void Shop_CreateDecorationShop1Menu(u16 *itemList) +{ + CreateShopMenu(MART_TYPE_1); + SetShopItemsForSale(itemList); + SetShopMenuCallback(EnableBothScriptContexts); +} + +void Shop_CreateDecorationShop2Menu(u16 *itemList) +{ + CreateShopMenu(MART_TYPE_2); + SetShopItemsForSale(itemList); + SetShopMenuCallback(EnableBothScriptContexts); +} + +#if DEBUG + +void debug_sub_80C2818(void) +{ + CreateShopMenu(MART_TYPE_0); + SetShopItemsForSale(gUnusedMartArray); + SetShopMenuCallback(NULL); +} + +#endif diff --git a/src/slot_machine.c b/src/slot_machine.c new file mode 100644 index 000000000..8075f24e4 --- /dev/null +++ b/src/slot_machine.c @@ -0,0 +1,5947 @@ +#include "global.h" +#include "constants/songs.h" +#include "strings2.h" +#include "overworld.h" +#include "menu_cursor.h" +#include "field_effect.h" +#include "random.h" +#include "sound.h" +#include "main.h" +#include "slot_machine.h" +#include "string_util.h" +#include "decompress.h" +#include "trig.h" +#include "graphics.h" +#include "palette.h" +#include "util.h" +#include "text.h" +#include "menu.h" +#include "ewram.h" + +enum +{ + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY +}; + +enum +{ + SLOT_MACHINE_MATCHED_1CHERRY, + SLOT_MACHINE_MATCHED_2CHERRY, + SLOT_MACHINE_MATCHED_REPLAY, + SLOT_MACHINE_MATCHED_LOTAD, + SLOT_MACHINE_MATCHED_AZURILL, + SLOT_MACHINE_MATCHED_POWER, + SLOT_MACHINE_MATCHED_777_MIXED, + SLOT_MACHINE_MATCHED_777_RED, + SLOT_MACHINE_MATCHED_777_BLUE, + SLOT_MACHINE_MATCHED_NONE +}; + +struct SlotMachineEwramStruct +{ + /*0x00*/ u8 state; + /*0x01*/ u8 unk01; + /*0x02*/ u8 pikaPower; + /*0x03*/ u8 unk03; + /*0x04*/ u8 unk04; + /*0x05*/ u8 unk05; + /*0x06*/ u8 unk06; + /*0x07*/ u8 unk07; + /*0x08*/ u16 matchedSymbols; + /*0x0A*/ u8 unk0A; + /*0x0B*/ u8 unk0B; + /*0x0C*/ s16 coins; + /*0x0E*/ s16 payout; + /*0x10*/ s16 unk10; + /*0x12*/ s16 bet; + /*0x14*/ s16 unk14; + /*0x16*/ s16 unk16; + /*0x18*/ s16 unk18; + /*0x1A*/ s16 unk1A; + /*0x1C*/ s16 unk1C[3]; + /*0x22*/ u16 unk22[3]; + /*0x28*/ s16 reelPositions[3]; + /*0x2E*/ s16 unk2E[3]; + /*0x34*/ s16 unk34[3]; + /*0x3A*/ u8 reelTasks[3]; + /*0x3D*/ u8 unk3D; + /*0x3E*/ u8 unk3E; + /*0x3F*/ u8 unk3F; + /*0x40*/ u8 unk40; + /*0x41*/ u8 unk41; + /*0x42*/ u8 unk42; + /*0x43*/ u8 unk43; + /*0x44*/ u8 unk44[5]; + /*0x49*/ u8 unk49[2]; + /*0x49*/ u8 unk4B[3]; + /*0x4E*/ u8 unk4E[2]; + /*0x50*/ u8 unk50[2]; + /*0x52*/ u8 unk52[2]; + /*0x54*/ u8 unk54[4]; + /*0x58*/ u16 win0h; + /*0x5a*/ u16 win0v; + /*0x5c*/ u16 winIn; + /*0x5e*/ u16 winOut; + /*0x60*/ u16 backupMapMusic; + /*0x64*/ MainCallback prevMainCb; +#if DEBUG + u32 unk68; + u32 unk6C; + u32 unk70; + u32 unk74; + u32 unk78; + u32 unk7C; + u32 unk80; + u32 unk84; + u32 unk88; + u32 unk8C; + s32 unk90; +#endif +}; + +struct UnkStruct1 +{ + /*0x00*/ u8 unk00; + /*0x01*/ u8 unk01; + /*0x02*/ s16 unk02; +}; + +#if ENGLISH +#define SLOTMACHINE_GFX_TILES 233 +#elif GERMAN +#define SLOTMACHINE_GFX_TILES 236 +#endif + +static void CB2_SlotMachineSetup(void); +static void CB2_SlotMachineLoop(void); +static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb); +static void SlotMachineDummyTask(u8 taskId); +static void SlotMachineSetup_0_0(void); +static void SlotMachineSetup_6_2(void); +static void SlotMachineSetup_1_0(void); +static void SlotMachineSetup_2_0(void); +static void SlotMachineSetup_2_1(void); +static void SlotMachineSetup_0_1(void); +static void SlotMachineSetup_3_0(void); +static void SlotMachineSetup_4_0(void); +static void SlotMachineSetup_5_0(void); +static void SlotMachineSetup_6_0(void); +static void SlotMachineSetup_6_1(void); +static void sub_8101D04(void); +static void sub_8101D24(u8 taskId); +static bool8 sub_8101D5C(struct Task *task); +static bool8 sub_8101D8C(struct Task *task); +static bool8 sub_8101DB0(struct Task *task); +static bool8 sub_8101DF4(struct Task *task); +static bool8 sub_8101E10(struct Task *task); +static bool8 sub_8101E3C(struct Task *task); +static bool8 sub_8101F44(struct Task *task); +static bool8 sub_8101F60(struct Task *task); +static bool8 sub_8101F88(struct Task *task); +static bool8 sub_8101FA4(struct Task *task); +static bool8 sub_8102008(struct Task *task); +static bool8 sub_8102034(struct Task *task); +static bool8 sub_8102058(struct Task *task); +static bool8 sub_8102090(struct Task *task); +bool8 sub_81020C8(struct Task *task); +static bool8 sub_81021E0(struct Task *task); +static bool8 sub_81021FC(struct Task *task); +static bool8 sub_8102264(struct Task *task); +static bool8 sub_81022A0(struct Task *task); +static bool8 sub_81022CC(struct Task *task); +static bool8 sub_81022F0(struct Task *task); +static bool8 sub_8102318(struct Task *task); +static bool8 sub_8102344(struct Task *task); +static bool8 sub_810239C(struct Task *task); +static bool8 sub_81023B8(struct Task *task); +static bool8 sub_81023E0(struct Task *task); +static bool8 sub_81023FC(struct Task *task); +static bool8 sub_8102424(struct Task *task); +static bool8 sub_8102460(struct Task *task); +#if DEBUG +static bool8 debug_sub_8116E74(struct Task *); +#endif +static void sub_8102484(void); +static void sub_81024F0(void); +static bool8 sub_8102540(void); +static u8 sub_8102578(void); +static u16 dp15_jump_random_unknown(void); +static u8 sub_81025BC(void); +static void CheckMatch(void); +static void CheckMatch_CenterRow(void); +static void CheckMatch_TopAndBottom(void); +static void CheckMatch_Diagonals(void); +static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3); +static void sub_8102A24(void); +static void sub_8102A64(u8 taskId); +static bool8 sub_8102A44(void); +static bool8 sub_8102A9C(struct Task *task); +static bool8 sub_8102AD0(struct Task *task); +static bool8 sub_8102B80(struct Task *task); +static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y); +static void sub_8102DA8(void); +static void sub_8102DEC(u8 a0); +static void sub_8102E1C(u8 a0); +static bool8 sub_8102E40(u8 a0); +static void sub_8102E68(u8 taskId); +static bool8 sub_8102EA0(struct Task *task); +static bool8 sub_8102EA4(struct Task *task); +static bool8 sub_8102EC0(struct Task *task); +static bool8 sub_8102F4C(struct Task *task); +static bool8 sub_8103008(struct Task *task); +static bool8 sub_810305C(void); +static bool8 sub_8103154(u8 a0, u8 a1); +static bool8 sub_81031B4(u8 a0, u8 a1); +static bool8 sub_81032C0(void); +static bool8 sub_81032E8(void); +static bool8 sub_810333C(void); +static bool8 sub_81033DC(void); +static bool8 sub_810341C(u8 a0); +static bool8 sub_810347C(u8 a0); +static void sub_81034F4(void); +static void sub_8103540(void); +static void sub_8103564(void); +static void j5_08111E84(void); +static void sub_8103668(void); +static void sub_810380C(void); +static void sub_8103830(void); +static void sub_8103910(void); +static void sub_8103A78(void); +static void sub_8103C14(u8 a0); +static void sub_8103C48(u8 taskId); +static void sub_8103D50(u8 a0); +static void sub_8103C78(struct Task *task, u8 taskId); +static void sub_8103CAC(struct Task *task, u8 taskId); +static void sub_8103CC8(struct Task *task, u8 taskId); +static void sub_8103D8C(u8 a0); +static void sub_8103DC8(void); +static void sub_8103E04(u8 a0); +static bool8 sub_8103E38(void); +static bool8 sub_8103E7C(void); +static bool8 sub_8103EAC(u8 spriteId); +static void sub_8103EE4(struct Sprite *sprite); +static void sub_8103F70(void); +static bool8 sub_8103FA0(void); +static void sub_8103FE8(u8 taskId); +static void sub_8104048(void); +static void sub_8104064(u8 pikaPower); +static bool8 sub_81040C8(void); +static void sub_81040E8(u8 taskId); +static void nullsub_68(struct Task *task); +static void sub_810411C(struct Task *task); +static void sub_8104144(struct Task *task); +static void sub_81041AC(struct Task *task); +static void sub_810421C(struct Task *task); +static void sub_810423C(u8 pikaPower); +static void sub_810430C(void); +static bool8 sub_810432C(void); +static void sub_810434C(u8 taskId); +static void sub_810437C(struct Task *task); +static void sub_81043EC(struct Task *task); +static void sub_8104468(struct Task *task); +static void sub_8104498(struct Task *task); +static void sub_8104548(struct Task *task); +static void sub_8104598(struct Task *task); +static void sub_81045CC(struct Task *task); +static void sub_810463C(struct Task *task); +static void sub_81046C0(struct Task *task); +static void sub_8104764(struct Task *task); +static void sub_8104794(struct Task *task); +static void sub_81047EC(struct Task *task); +static void sub_8104860(struct Task *task); +static void sub_81048A8(struct Task *task); +static void sub_81048CC(struct Task *task); +static void sub_8104940(struct Task *task); +static void sub_81049C8(struct Task *task); +static void sub_81049F8(struct Task *task); +static void sub_8104A40(s16 a0, s16 a1); +static void sub_8104A88(s16 a0); +static void sub_8104AB8(u8 a0); +static bool8 sub_8104AEC(void); +static void sub_8104B0C(u8 taskId); +static void sub_8104B3C(struct Task *task); +static void sub_8104B60(struct Task *task); +static void sub_8104B80(struct Task *task); +static void sub_8104BC8(struct Task *task); +static void sub_8104BFC(struct Task *task); +static void sub_8104C44(struct Task *task); +static void sub_8104C5C(void); +static void sub_8104CAC(u8 arg0); +static bool8 sub_8104E18(void); +static void nullsub_69(struct Task *task); +static void sub_8104E74(u8 taskId); +static void sub_8104EA8(void); +static void sub_8104F8C(void); +static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3); +static void sub_81050C4(void); +static void sub_8105100(void); +static void sub_810514C(void); +static void sub_81051C0(void); +static void sub_8105284(void); +static void sub_81052EC(void); +static void sub_81053A0(void); +static void sub_810545C(void); +static void sub_81054B8(void); +static void sub_8105524(void); +static void sub_8105554(void); +static void sub_8105578(void); +static void sub_8105688(s16 a0); +static void sub_81056C0(void); +static void sub_81056F0(void); +static void sub_81057E8(s16 a0); +static void sub_8105804(void); +static void sub_8105854(void); +static void sub_81058A0(void); +static void sub_81058C4(void); +static void sub_81059B8(void); +static void sub_81059E8(void); +static bool8 sub_8105ACC(void); +static void sub_8105AEC(void); +static u8 sub_8105B1C(s16 x, s16 y); +static void sub_8105B88(u8 spriteId); +static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4); +static void sub_81063C0(void); +static void sub_8106404(void); +static void sub_8106448(void); +static void sub_81064B8(void); +static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4); +static void sub_81065DC(void); + +#if DEBUG +static void debug_sub_811B5D0(void); +static void debug_sub_811B620(void); +static void debug_sub_811B5B4(s32 *, s32); +static void debug_sub_811B894(void); +static u8 debug_sub_811B634(void); +static void debug_sub_811B654(u8 taskId); +#endif + +#if DEBUG +static u8 unk_debug_bss_1_0; +static u8 unk_debug_bss_1_1; +static u8 unk_debug_bss_1_2; +static u8 unk_debug_bss_1_3; +static u8 unk_debug_bss_1_4; +static u32 unk_debug_bss_1_8; +#endif + +static const struct UnkStruct1 *const gUnknown_083ED048[]; +static const u16 gPalette_83EDE24[]; +static const u8 gUnknown_083ECD04[][3]; +static const u8 gUnknown_083ECE3A[]; +static const u16 gUnknown_083ECE42[]; +static const u16 gUnknown_083ECE48[]; + +void PlaySlotMachine(u8 arg0, MainCallback cb) +{ +#if DEBUG + unk_debug_bss_1_1 = 0; +#endif + PlaySlotMachine_Internal(arg0, cb); + SetMainCallback2(CB2_SlotMachineSetup); +} + +#if DEBUG +void debug_sub_811609C(u8 a, void (*func)(void)) +{ + unk_debug_bss_1_1 = 1; + PlaySlotMachine_Internal(a, func); + SetMainCallback2(CB2_SlotMachineSetup); +} +#endif + +static void CB2_SlotMachineSetup(void) +{ + switch (gMain.state) + { + case 0: + SlotMachineSetup_0_0(); + SlotMachineSetup_0_1(); + gMain.state++; + break; + case 1: + SlotMachineSetup_1_0(); + gMain.state++; + break; + case 2: + SlotMachineSetup_2_0(); + SlotMachineSetup_2_1(); + gMain.state++; + break; + case 3: + SlotMachineSetup_3_0(); + gMain.state++; + break; + case 4: + SlotMachineSetup_4_0(); + gMain.state++; + break; + case 5: + SlotMachineSetup_5_0(); + gMain.state++; + break; + case 6: + SlotMachineSetup_6_0(); + SlotMachineSetup_6_1(); + SlotMachineSetup_6_2(); + SetMainCallback2(CB2_SlotMachineLoop); + break; + } +} + +static void CB2_SlotMachineLoop(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void SlotMachine_VBlankCallback(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_WIN0H = eSlotMachine->win0h; + REG_WIN0V = eSlotMachine->win0v; + REG_WININ = eSlotMachine->winIn; + REG_WINOUT = eSlotMachine->winOut; +} + +static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb) +{ + struct Task *task = gTasks + CreateTask(SlotMachineDummyTask, 0xFF); + task->data[0] = arg0; + StoreWordInTwoHalfwords(task->data + 1, (intptr_t)cb); +} + +static void sub_81019EC(void) +{ + struct Task *task = gTasks + FindTaskIdByFunc(SlotMachineDummyTask); + eSlotMachine->unk01 = task->data[0]; + LoadWordFromTwoHalfwords((u16 *)(task->data + 1), (u32 *)&eSlotMachine->prevMainCb); +} + +static void SlotMachineDummyTask(u8 taskId) +{ +} + +static void SlotMachineSetup_0_0(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +static void SlotMachineSetup_6_2(void) +{ + u16 imeBak; + SetVBlankCallback(SlotMachine_VBlankCallback); + imeBak = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = imeBak; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; +} + +static void SlotMachineSetup_1_0(void) +{ + DmaClearLarge16(3, (u16 *)(BG_VRAM), BG_VRAM_SIZE, 0x1000); +} + +static void SlotMachineSetup_2_0(void) +{ + DmaClear16(3, (u16 *)OAM, OAM_SIZE); +} + +static void SlotMachineSetup_2_1(void) +{ + REG_BG0CNT = 0; + REG_BG1CNT = 0; + REG_BG2CNT = 0; + REG_BG3CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_CHARBASE(2); + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29); + REG_BG3CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(30); + REG_WININ = 0x3f; + REG_WINOUT = 0x3f; + REG_BLDCNT = BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_OBJ; + REG_BLDALPHA = 0x809; +} + +static const s16 gUnknown_083ECCF8[][2]; + +static void SlotMachineSetup_0_1(void) +{ + u8 i; + + sub_81019EC(); + eSlotMachine->state = 0; + eSlotMachine->pikaPower = 0; + eSlotMachine->unk03 = Random() & 1; + eSlotMachine->unk04 = 0; + eSlotMachine->matchedSymbols = 0; + eSlotMachine->unk0A = 0; + eSlotMachine->unk0B = 0; + eSlotMachine->coins = gSaveBlock1.coins; + eSlotMachine->payout = 0; + eSlotMachine->unk10 = 0; + eSlotMachine->bet = 0; + eSlotMachine->unk18 = 0; + eSlotMachine->unk1A = 8; + eSlotMachine->win0h = 0xf0; + eSlotMachine->win0v = 0xa0; + eSlotMachine->winIn = 0x3f; + eSlotMachine->winOut = 0x3f; + eSlotMachine->backupMapMusic = GetCurrentMapMusic(); + for (i = 0; i < 3; i++) + { + eSlotMachine->unk22[i] = 0; + eSlotMachine->reelPositions[i] = gUnknown_083ECCF8[i][eSlotMachine->unk03] % 21; + eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->reelPositions[i] * 24; + eSlotMachine->unk1C[i] %= 0x1f8; + } +#if DEBUG + debug_sub_811B5D0(); + if (unk_debug_bss_1_1 != 0) + eSlotMachine->coins = 1000; +#endif +} + +static void SlotMachineSetup_3_0(void) +{ + Text_LoadWindowTemplate(&gWindowTemplate_81E7128); + InitMenuWindow(&gWindowTemplate_81E7128); +} + +static void SlotMachineSetup_4_0(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + gOamLimit = 128; + FreeAllSpritePalettes(); + ResetTasks(); +} + +static void SlotMachineSetup_5_0(void) +{ + sub_8106448(); + sub_81064B8(); + sub_81063C0(); +} + +static void SlotMachineSetup_6_0(void) +{ + sub_8104EA8(); + sub_8104F8C(); + sub_8103DC8(); + sub_81050C4(); +} + +static void SlotMachineSetup_6_1(void) +{ + sub_8104048(); + sub_8102DA8(); + sub_8104C5C(); + sub_8101D04(); +} + +static void sub_8101D04(void) +{ + sub_8101D24(CreateTask(sub_8101D24, 0)); +} + +static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = +{ + sub_8101D5C, + sub_8101D8C, + sub_8101DB0, + sub_8101DF4, + sub_8101E10, + sub_8101E3C, + sub_8101F44, + sub_8101F60, + sub_8101F88, + sub_8101FA4, + sub_8102008, + sub_8102034, + sub_8102058, + sub_8102090, + sub_81020C8, + sub_81021E0, + sub_81021FC, + sub_8102264, + sub_81022A0, + sub_81022CC, + sub_81022F0, + sub_8102318, + sub_8102344, + sub_810239C, + sub_81023B8, + sub_81023E0, + sub_81023FC, + sub_8102424, + sub_8102460, +#if DEBUG + debug_sub_8116E74, +#endif +}; + +static void sub_8101D24(u8 taskId) +{ + while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId)) + ; +} + +static bool8 sub_8101D5C(struct Task *task) +{ + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + sub_810423C(eSlotMachine->pikaPower); + eSlotMachine->state++; + return FALSE; +} + +static bool8 sub_8101D8C(struct Task *task) +{ + if (!gPaletteFade.active) + eSlotMachine->state++; + return FALSE; +} + +static bool8 sub_8101DB0(struct Task *task) +{ + eSlotMachine->payout = 0; + eSlotMachine->bet = 0; + eSlotMachine->unk18 = 0; + eSlotMachine->unk04 &= 0xc0; + eSlotMachine->state = 4; + if (eSlotMachine->coins <= 0) + { + eSlotMachine->state = 25; + } + else if (eSlotMachine->unk0A) + { + eSlotMachine->state = 3; + sub_8104CAC(4); + } + return TRUE; +} + +static bool8 sub_8101DF4(struct Task *task) +{ + if (sub_8104E18()) + eSlotMachine->state = 4; + return FALSE; +} + +static bool8 sub_8101E10(struct Task *task) +{ + sub_8104CAC(0); + eSlotMachine->state = 5; + if ( +#if DEBUG + (unk_debug_bss_1_1 == 0 || unk_debug_bss_1_4 == 0) && +#endif + eSlotMachine->coins >= 9999) + eSlotMachine->state = 23; + return TRUE; +} + +static bool8 sub_8101E3C(struct Task *task) +{ + s16 i; + +#if DEBUG + if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) + { + if (eSlotMachine->coins <= 3 || (gMain.heldKeys & B_BUTTON)) + { + unk_debug_bss_1_4 = 0; + } + else + { + sub_8103D50(0); + sub_8103D50(1); + sub_8103D50(2); + eSlotMachine->coins -= 3; + eSlotMachine->bet = 3; + eSlotMachine->state = 9; + return 0; + } + } + if (unk_debug_bss_1_1 != 0 && (gMain.newKeys & 8)) + { + debug_sub_811B620(); + eSlotMachine->state = 29; + return 0; + } +#endif + + if (gMain.newKeys & SELECT_BUTTON) + { + sub_8104AB8(0); + eSlotMachine->state = 8; + } + else if (gMain.newKeys & R_BUTTON) + { + if (eSlotMachine->coins - (3 - eSlotMachine->bet) >= 0) + { + for (i = eSlotMachine->bet; i < 3; i++) + sub_8103D50(i); + eSlotMachine->coins -= (3 - eSlotMachine->bet); + eSlotMachine->bet = 3; + eSlotMachine->state = 9; + PlaySE(SE_REGI); + } + else + { + eSlotMachine->state = 6; + } + } + else + { + if (gMain.newKeys & DPAD_DOWN && eSlotMachine->coins != 0) + { + PlaySE(SE_REGI); + sub_8103D50(eSlotMachine->bet); + eSlotMachine->coins--; + eSlotMachine->bet++; + } + if (eSlotMachine->bet >= 3 || (eSlotMachine->bet != 0 && gMain.newKeys & A_BUTTON)) + eSlotMachine->state = 9; + if (gMain.newKeys & B_BUTTON) + eSlotMachine->state = 21; + } + return FALSE; +} + +static void sub_8101F2C(const u8 *str) +{ + Menu_DisplayDialogueFrame(); + Menu_PrintText(str, 2, 15); +} + +static bool8 sub_8101F44(struct Task *task) +{ + sub_8101F2C(gOtherText_DontHaveThreeCoins); + eSlotMachine->state = 7; + return FALSE; +} + +static bool8 sub_8101F60(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_8101F88(struct Task *task) +{ + if (sub_8104AEC()) + eSlotMachine->state = 5; + return FALSE; +} + +static bool8 sub_8101FA4(struct Task *task) +{ + sub_8102484(); + sub_8104DA4(); + sub_8102DEC(0); + sub_8102DEC(1); + sub_8102DEC(2); + task->data[0] = 0; + if (eSlotMachine->unk04 & 0x20) + { + sub_810430C(); + eSlotMachine->state = 10; + } + else + { + sub_8104CAC(1); + eSlotMachine->state = 11; + } + eSlotMachine->unk1A = 8; + if (eSlotMachine->unk0A) + eSlotMachine->unk1A = dp15_jump_random_unknown(); +#if DEBUG + if (unk_debug_bss_1_1 != 0) + debug_sub_811B5B4(&eSlotMachine->unk68, 1); +#endif + return FALSE; +} + +static bool8 sub_8102008(struct Task *task) +{ + if (sub_810432C()) + { + sub_8104CAC(1); + eSlotMachine->unk04 &= 0xDF; + eSlotMachine->state = 11; + } + return FALSE; +} + +static bool8 sub_8102034(struct Task *task) +{ + if (++task->data[0] >= 30) + { +#if DEBUG + if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) + unk_debug_bss_1_8 = (Random() & 0x1F) + 1; +#endif + sub_81024F0(); + eSlotMachine->state = 12; + } + return FALSE; +} + +static bool8 sub_8102058(struct Task *task) +{ +#if DEBUG + if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0) + { + unk_debug_bss_1_8--; + if (unk_debug_bss_1_8 == 0) + { + PlaySE(0x18); + sub_8102E1C(eSlotMachine->unk18); + sub_8103C14(eSlotMachine->unk18); + unk_debug_bss_1_8 = (Random() & 0x1F) + 1; + eSlotMachine->state = 13; + } + return FALSE; + } +#endif + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_JYUNI); + sub_8102E1C(eSlotMachine->unk18); + sub_8103C14(eSlotMachine->unk18); + eSlotMachine->state = 13; + } + return FALSE; +} + +static bool8 sub_8102090(struct Task *task) +{ + if (!sub_8102E40(eSlotMachine->unk18)) + { + eSlotMachine->unk18++; + eSlotMachine->state = 12; + if (eSlotMachine->unk18 > 2) + { + eSlotMachine->state = 14; +#if DEBUG + switch (unk_debug_bss_1_0) + { + case 2: + eSlotMachine->reelPositions[0] = 20; + eSlotMachine->reelPositions[1] = 20; + eSlotMachine->reelPositions[2] = 18; + break; + case 1: + eSlotMachine->reelPositions[0] = 20; + eSlotMachine->reelPositions[1] = 20; + eSlotMachine->reelPositions[2] = 18; + break; + case 4: + eSlotMachine->reelPositions[0] = 3; + eSlotMachine->reelPositions[1] = 1; + eSlotMachine->reelPositions[2] = 2; + break; + case 8: + eSlotMachine->reelPositions[0] = 0; + eSlotMachine->reelPositions[1] = 2; + eSlotMachine->reelPositions[2] = 3; + break; + case 0x10: + eSlotMachine->reelPositions[0] = 2; + eSlotMachine->reelPositions[1] = 5; + eSlotMachine->reelPositions[2] = 20; + break; + case 0x40: + eSlotMachine->reelPositions[0] = 19; + eSlotMachine->reelPositions[1] = 19; + eSlotMachine->reelPositions[2] = 0; + break; + case 0x80: + eSlotMachine->reelPositions[0] = 19; + eSlotMachine->reelPositions[1] = 19; + eSlotMachine->reelPositions[2] = 19; + break; + } +#endif + } + return TRUE; + } + return FALSE; +} + +bool8 sub_81020C8(struct Task *task) +{ + eSlotMachine->unk04 &= 0xc0; + CheckMatch(); + if (eSlotMachine->unk0A) + { + eSlotMachine->unk0A--; + eSlotMachine->unk0B++; + } +#if DEBUG + else + { + debug_sub_811B894(); + } +#endif + + if (eSlotMachine->matchedSymbols) + { +#if DEBUG + debug_sub_811B5B4(&eSlotMachine->unk6C, eSlotMachine->payout); +#endif + eSlotMachine->state = 15; + sub_8102A24(); + sub_8103F70(); + if ((eSlotMachine->unk10 -= eSlotMachine->payout) < 0) + { + eSlotMachine->unk10 = 0; + } + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + PlayFanfare(BGM_ME_B_BIG); + sub_8104CAC(6); + } + else if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_MIXED)) + { + PlayFanfare(BGM_ME_B_BIG); + sub_8104CAC(5); + } + else + { + PlayFanfare(BGM_ME_B_SMALL); + sub_8104CAC(2); + } + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_MIXED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + eSlotMachine->unk04 &= 0x3f; + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + eSlotMachine->unk0A = 0; + eSlotMachine->unk0B = 0; + eSlotMachine->unk03 = 0; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_BLUE)) + eSlotMachine->unk03 = 1; + } + } + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER) && eSlotMachine->pikaPower < 16) + { + eSlotMachine->pikaPower++; + sub_8104064(eSlotMachine->pikaPower); + } + } + else + { + sub_8104CAC(3); + eSlotMachine->state = 20; + if ((eSlotMachine->unk10 += eSlotMachine->bet) > 9999) + eSlotMachine->unk10 = 9999; + } + return FALSE; +} + +static bool8 sub_81021E0(struct Task *task) +{ + if (sub_8102A44()) + eSlotMachine->state = 16; + return FALSE; +} + +static bool8 sub_81021FC(struct Task *task) +{ + if (sub_8103FA0()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_RED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE))) + IncrementGameStat(GAME_STAT_SLOT_JACKPOTS); + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->unk18 = 0; + eSlotMachine->state = 9; + } + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER)) + eSlotMachine->state = 17; + if (eSlotMachine->unk0A && eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + sub_8104CAC(4); + eSlotMachine->state = 18; + } + } + return FALSE; +} + +static bool8 sub_8102264(struct Task *task) +{ + if (!sub_81040C8()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->state = 9; + if (eSlotMachine->unk0A) + { + sub_8104CAC(4); + eSlotMachine->state = 18; + } + } + } + return FALSE; +} + +static bool8 sub_81022A0(struct Task *task) +{ + if (sub_8104E18()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->state = 9; + } + } + return FALSE; +} + +static bool8 sub_81022CC(struct Task *task) +{ + sub_8103D8C(0); + sub_8103D8C(1); + sub_8103D8C(2); + eSlotMachine->state = 2; + return FALSE; +} + +static bool8 sub_81022F0(struct Task *task) +{ + if (++task->data[1] > 64) + { + task->data[1] = 0; + eSlotMachine->state = 19; + } + return FALSE; +} + +static bool8 sub_8102318(struct Task *task) +{ + sub_8101F2C(gOtherText_QuitGamePrompt); + DisplayYesNoMenu(21, 7, 1); + sub_814AB84(); + eSlotMachine->state = 22; + return FALSE; +} + +static bool8 sub_8102344(struct Task *task) +{ + s8 input = Menu_ProcessInputNoWrap_(); + if (input == 0) + { + Menu_EraseScreen(); + sub_8103D8C(0); + sub_8103D8C(1); + sub_8103D8C(2); + eSlotMachine->coins += eSlotMachine->bet; + eSlotMachine->state = 27; + } + else if (input == 1 || input == -1) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_810239C(struct Task *task) +{ + sub_8101F2C(gOtherText_MaxCoins); + eSlotMachine->state = 24; + return FALSE; +} + +static bool8 sub_81023B8(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_81023E0(struct Task *task) +{ + sub_8101F2C(gOtherText_OutOfCoins); + eSlotMachine->state = 26; + return FALSE; +} + +static bool8 sub_81023FC(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 27; + } + return FALSE; +} + +static bool8 sub_8102424(struct Task *task) +{ +#if DEBUG + if (unk_debug_bss_1_1 == 0) + gSaveBlock1.coins = eSlotMachine->coins; +#else + gSaveBlock1.coins = eSlotMachine->coins; +#endif + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + eSlotMachine->state++; + return FALSE; +} + +static bool8 sub_8102460(struct Task *task) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(eSlotMachine->prevMainCb); + } + return FALSE; +} + +#if DEBUG + +static bool8 debug_sub_8116E74(struct Task *task) +{ + if (debug_sub_811B634() != 0) + eSlotMachine->state = 5; + return FALSE; +} + +#endif + +static void sub_8102484(void) +{ + u8 r3; + + if (eSlotMachine->unk0A == 0) + { +#if DEBUG + if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_2 != 0) + { + eSlotMachine->unk04 = unk_debug_bss_1_3; + unk_debug_bss_1_2 = 0; + unk_debug_bss_1_3 = 0; + if (eSlotMachine->unk04 & 0x80) + debug_sub_811B5B4(&eSlotMachine->unk88, 1); + if (eSlotMachine->unk04 & 0x40) + debug_sub_811B5B4(&eSlotMachine->unk84, 1); + if (eSlotMachine->unk04 & 0x20) + debug_sub_811B5B4(&eSlotMachine->unk8C, 1); + if (eSlotMachine->unk04 & 0x10) + debug_sub_811B5B4(&eSlotMachine->unk80, 1); + if (eSlotMachine->unk04 & 8) + debug_sub_811B5B4(&eSlotMachine->unk7C, 1); + if (eSlotMachine->unk04 & 4) + debug_sub_811B5B4(&eSlotMachine->unk78, 1); + if (eSlotMachine->unk04 & 1) + debug_sub_811B5B4(&eSlotMachine->unk74, 1); + if (eSlotMachine->unk04 & 2) + debug_sub_811B5B4(&eSlotMachine->unk70, 1); + return; + } +#endif + if (!(eSlotMachine->unk04 & 0xc0)) + { + if (sub_8102540()) + { + r3 = sub_8102578(); + if (r3 != 3) + { + eSlotMachine->unk04 |= gUnknown_083ECE42[r3]; +#if DEBUG + if (eSlotMachine->unk04 & 0x80) + debug_sub_811B5B4(&eSlotMachine->unk88, 1); + if (eSlotMachine->unk04 & 0x40) + debug_sub_811B5B4(&eSlotMachine->unk84, 1); + if (eSlotMachine->unk04 & 0x20) + debug_sub_811B5B4(&eSlotMachine->unk8C, 1); +#endif + if (r3 != 1) + { + return; + } + } + } + r3 = sub_81025BC(); + if (r3 != 5) + { + eSlotMachine->unk04 |= gUnknown_083ECE48[r3]; +#if DEBUG + if (eSlotMachine->unk04 & 0x10) + debug_sub_811B5B4(&eSlotMachine->unk80, 1); + if (eSlotMachine->unk04 & 8) + debug_sub_811B5B4(&eSlotMachine->unk7C, 1); + if (eSlotMachine->unk04 & 4) + debug_sub_811B5B4(&eSlotMachine->unk78, 1); + if (eSlotMachine->unk04 & 1) + debug_sub_811B5B4(&eSlotMachine->unk74, 1); + if (eSlotMachine->unk04 & 2) + debug_sub_811B5B4(&eSlotMachine->unk70, 1); +#endif + } + } + } +} + +/* +static void sub_8102484(void) +{ + u8 r3; + + if (eSlotMachine->unk0A == 0 && !(eSlotMachine->unk04 & 0xc0)) + { + if (sub_8102540()) + { + r3 = sub_8102578(); + if (r3 != 3) + { + eSlotMachine->unk04 |= gUnknown_083ECE42[r3]; + if (r3 != 1) + { + return; + } + } + } + r3 = sub_81025BC(); + if (r3 != 5) + { + eSlotMachine->unk04 |= gUnknown_083ECE48[r3]; + } + } +} +*/ + +static void sub_81024F0(void) +{ + eSlotMachine->unk06 = 0; + if (eSlotMachine->unk04) + eSlotMachine->unk06 = 1; +} + +static u8 sub_810250C(u8 a0) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (a0 & 1) + return gUnknown_083ECE3A[i]; + a0 >>= 1; + } + return 0; +} + +static bool8 sub_8102540(void) +{ + u8 rval = Random(); + if (gUnknown_083ECD04[eSlotMachine->unk01][eSlotMachine->bet - 1] > rval) + return TRUE; + return FALSE; +} + +static const u8 gUnknown_083ECD16[][6]; + +static u8 sub_8102578(void) +{ + s16 i; + + for (i = 0; i < 3; i++) + { + s16 rval = Random() & 0xff; + s16 value = gUnknown_083ECD16[i][eSlotMachine->unk01]; + if (value > rval) + break; + } + return i; +} + +static const u8 gUnknown_083ECD28[][6]; + +static u8 sub_81025BC(void) +{ + s16 i; + + for (i = 0; i < 5; i++) + { + s16 rval = Random() & 0xff; + s16 r3 = gUnknown_083ECD28[i][eSlotMachine->unk01]; + if (i == 0 && eSlotMachine->unk03 == 1) + { + r3 += 10; + if (r3 > 0x100) + r3 = 0x100; + } + else if (i == 4 && eSlotMachine->unk03 == 1) + { + r3 -= 10; + if (r3 < 0) + r3 = 0; + } + if (r3 > rval) + break; + } + return i; +} + +static const u8 gUnknown_083ECD46[][17]; +static const u8 gUnknown_083ECDAC[][17]; + +static u8 sub_810264C(u8 a0) +{ + if (eSlotMachine->unk03 == 0) + return gUnknown_083ECD46[a0][eSlotMachine->pikaPower]; + else + return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower]; +} + +static void sub_8102680(void) +{ + u8 rval; + s16 i; + + eSlotMachine->unk05 = 0; + rval = Random(); + if (rval < sub_810264C(0)) + return; + for (i = 5; i > 0; i--) + { + rval = Random(); + if (rval < sub_810264C(i)) + break; + } + eSlotMachine->unk05 = i; +} + +static const u16 gUnknown_083ECE12[]; + +static bool8 sub_81026DC(u16 a0) +{ + u16 rval = Random() & 0xff; + if (rval < gUnknown_083ECE12[a0]) + return TRUE; + else + return FALSE; +} + +static const u16 gUnknown_083ECE1C[][2]; +static const u16 gUnknown_083ECE30[]; + +static u16 dp15_jump_random_unknown(void) +{ + u8 r4 = 0; + u8 rval; + u8 value; + if (eSlotMachine->unk10 >= 300) + r4 = 4; + else if (eSlotMachine->unk10 >= 250) + r4 = 3; + else if (eSlotMachine->unk10 >= 200) + r4 = 2; + else if (eSlotMachine->unk10 >= 150) + r4 = 1; + rval = Random() % 100; + value = gUnknown_083ECE1C[r4][0]; + if (rval < value) + return 4; + rval = Random() % 100; + value = gUnknown_083ECE1C[r4][1] + gUnknown_083ECE30[eSlotMachine->unk0B]; + if (rval < value) + return 2; + return 8; +} + +static void CheckMatch(void) +{ + eSlotMachine->matchedSymbols = 0; + CheckMatch_CenterRow(); + if (eSlotMachine->bet > 1) + CheckMatch_TopAndBottom(); + if (eSlotMachine->bet > 2) + CheckMatch_Diagonals(); +} + +static const u16 sSlotMatchFlags[]; +static const u16 sSlotPayouts[]; + +static void CheckMatch_CenterRow(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 2); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 2); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(0); + } +} + +static void CheckMatch_TopAndBottom(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 1); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match == SLOT_MACHINE_MATCHED_1CHERRY) + match = SLOT_MACHINE_MATCHED_2CHERRY; + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(1); + } + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 3); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match == SLOT_MACHINE_MATCHED_1CHERRY) + match = SLOT_MACHINE_MATCHED_2CHERRY; + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(2); + } +} + +static void CheckMatch_Diagonals(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match != SLOT_MACHINE_MATCHED_1CHERRY) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + } + sub_8103E04(3); + } + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match != SLOT_MACHINE_MATCHED_1CHERRY) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + } + sub_8103E04(4); + } +} + +static const u8 sSym2Match[]; + +static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3) +{ + if (c1 == c2 && c1 == c3) + return sSym2Match[c1]; + if (c1 == SLOT_MACHINE_TAG_7_RED && c2 == SLOT_MACHINE_TAG_7_RED && c3 == SLOT_MACHINE_TAG_7_BLUE) + return SLOT_MACHINE_MATCHED_777_MIXED; + if (c1 == SLOT_MACHINE_TAG_7_BLUE && c2 == SLOT_MACHINE_TAG_7_BLUE && c3 == SLOT_MACHINE_TAG_7_RED) + return SLOT_MACHINE_MATCHED_777_MIXED; + if (c1 == SLOT_MACHINE_TAG_CHERRY) + return SLOT_MACHINE_MATCHED_1CHERRY; + return SLOT_MACHINE_MATCHED_NONE; +} + +static void sub_8102A24(void) +{ + sub_8102A64(CreateTask(sub_8102A64, 4)); +} + +static bool8 sub_8102A44(void) +{ + if (FindTaskIdByFunc(sub_8102A64) == 0xff) + return TRUE; + else + return FALSE; +} + +static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = +{ + sub_8102A9C, + sub_8102AD0, + sub_8102B80 +}; + +static void sub_8102A64(u8 taskId) +{ + while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId)) + ; +} + +static bool8 sub_8102A9C(struct Task *task) +{ + if (sub_8103E38()) + { + task->data[0]++; + if (eSlotMachine->payout == 0) + { + task->data[0] = 2; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_8102AD0(struct Task *task) +{ + if (!task->data[1]--) + { + if (IsFanfareTaskInactive()) + PlaySE(SE_PIN); + eSlotMachine->payout--; + if (eSlotMachine->coins < 9999) + eSlotMachine->coins++; + task->data[1] = 8; + if (gMain.heldKeys & A_BUTTON) + task->data[1] = 4; + } + if (IsFanfareTaskInactive() && gMain.newKeys & START_BUTTON) + { + PlaySE(SE_PIN); + eSlotMachine->coins += eSlotMachine->payout; + if (eSlotMachine->coins > 9999) + eSlotMachine->coins = 9999; + eSlotMachine->payout = 0; + } + if (eSlotMachine->payout == 0) + task->data[0]++; + return FALSE; +} + +static bool8 sub_8102B80(struct Task *task) +{ + if (sub_8103E7C()) + DestroyTask(FindTaskIdByFunc(sub_8102A64)); + return FALSE; +} + +static const u8 sReelSymbols[][21]; + +static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y) +{ + s16 offset = (eSlotMachine->reelPositions[x] + y) % 21; + if (offset < 0) + offset += 21; + return sReelSymbols[x][offset]; +} + +static u8 GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(u8 x, s16 y) +{ + s16 r6 = 0; + if ((eSlotMachine->unk1C[x]) % 24) + r6 = -1; + return GetTagOfReelSymbolOnScreenAtPos(x, y + r6); +} + +static const u8 gUnknown_083ECCF1[]; + +static u8 sub_8102C48(s16 a0) +{ + s16 r1 = (eSlotMachine->unk16 + a0) % 6; + if (r1 < 0) + r1 += 6; + return gUnknown_083ECCF1[r1]; +} + +static void sub_8102C84(u8 a0, s16 a1) +{ + eSlotMachine->unk1C[a0] += a1; + eSlotMachine->unk1C[a0] %= 504; + eSlotMachine->reelPositions[a0] = 21 - eSlotMachine->unk1C[a0] / 24; +} + +static s16 sub_8102CCC(u8 a0, s16 a1) +{ + s16 r1 = eSlotMachine->unk1C[a0] % 24; + if (r1 != 0) + { + if (r1 < a1) + a1 = r1; + sub_8102C84(a0, a1); + r1 = eSlotMachine->unk1C[a0] % 24; + } + return r1; +} + +static void sub_8102D28(s16 a0) +{ + eSlotMachine->unk14 += a0; + eSlotMachine->unk14 %= 120; + eSlotMachine->unk16 = 6 - eSlotMachine->unk14 / 20; +} + +static s16 sub_8102D5C(s16 a0) +{ + s16 r1 = eSlotMachine->unk14 % 20; + if (r1 != 0) + { + if (r1 < a0) + a0 = r1; + sub_8102D28(a0); + r1 = eSlotMachine->unk14 % 20; + } + return r1; +} + +static void sub_8102DA8(void) +{ + u8 i; + for (i = 0; i < 3; i++) + { + u8 taskId = CreateTask(sub_8102E68, 2); + gTasks[taskId].data[15] = i; + eSlotMachine->reelTasks[i] = taskId; + sub_8102E68(taskId); + } +} + +static void sub_8102DEC(u8 a0) +{ + gTasks[eSlotMachine->reelTasks[a0]].data[0] = 1; + gTasks[eSlotMachine->reelTasks[a0]].data[14] = 1; +} + +static void sub_8102E1C(u8 a0) +{ + gTasks[eSlotMachine->reelTasks[a0]].data[0] = 2; +} + +static bool8 sub_8102E40(u8 a0) +{ + return gTasks[eSlotMachine->reelTasks[a0]].data[14]; +} + +static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = +{ + sub_8102EA0, + sub_8102EA4, + sub_8102EC0, + sub_8102F4C, + sub_8103008 +}; + +static void sub_8102E68(u8 taskId) +{ + while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId)) + ; +} + +static bool8 sub_8102EA0(struct Task *task) +{ + return FALSE; +} + +static bool8 sub_8102EA4(struct Task *task) +{ + sub_8102C84(task->data[15], eSlotMachine->unk1A); + return FALSE; +} + +static bool8 (*const gUnknown_083ECB40[])(void) = +{ + sub_810305C, + sub_81032C0, + sub_81033DC +}; + +static void (*const gUnknown_083ECB4C[])(void) = +{ + sub_81034F4, + sub_8103540, + sub_810380C +}; + +static bool8 sub_8102EC0(struct Task *task) +{ + task->data[0]++; + eSlotMachine->unk34[task->data[15]] = 0; + eSlotMachine->unk2E[task->data[15]] = 0; + if (eSlotMachine->unk0A == 0 && (eSlotMachine->unk04 == 0 || eSlotMachine->unk06 == 0 || !gUnknown_083ECB40[task->data[15]]())) + { + eSlotMachine->unk06 = 0; + gUnknown_083ECB4C[task->data[15]](); + } + task->data[1] = eSlotMachine->unk2E[task->data[15]]; + return TRUE; +} + +static bool8 sub_8102F4C(struct Task *task) +{ + u16 sp[] = {2, 4, 4, 4, 8}; + s16 r2 = eSlotMachine->unk1C[task->data[15]] % 24; + if (r2 != 0) + r2 = sub_8102CCC(task->data[15], eSlotMachine->unk1A); + else if (eSlotMachine->unk2E[task->data[15]]) + { + eSlotMachine->unk2E[task->data[15]]--; + sub_8102C84(task->data[15], eSlotMachine->unk1A); + r2 = eSlotMachine->unk1C[task->data[15]] % 24; + } + if (r2 == 0 && eSlotMachine->unk2E[task->data[15]] == 0) + { + task->data[0]++; + task->data[1] = sp[task->data[1]]; + task->data[2] = 0; + } + return FALSE; +} + +static bool8 sub_8103008(struct Task *task) +{ + eSlotMachine->unk22[task->data[15]] = task->data[1]; + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 0x3) == 0) + task->data[1] >>= 1; + if (task->data[1] == 0) + { + task->data[0] = 0; + task->data[14] = 0; + eSlotMachine->unk22[task->data[15]] = 0; + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = +{ + sub_8103154, + sub_81031B4, + sub_81031B4 +}; + +static bool8 sub_810305C(void) +{ + u8 r3 = sub_810250C(eSlotMachine->unk04); + u8 r5 = r3; + if (eSlotMachine->unk04 & 0xc0) + { + r5 = 0; + r3 = 1; + } + return gUnknown_083ECB64[eSlotMachine->bet - 1](r5, r3); +} + +static bool8 sub_81030A4(s16 y, u8 tag1, u8 tag2) +{ + u8 tag = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, y); + if (tag == tag1 || tag == tag2) + { + eSlotMachine->unk07 = tag; + return TRUE; + } + return FALSE; +} + +static bool8 sub_81030E0(s16 y) +{ + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - y) == 4) + return TRUE; + else + return FALSE; +} + +static bool8 sub_8103134(void) +{ + if (eSlotMachine->unk04 & 0xc2) + return TRUE; + else + return FALSE; +} + +static bool8 sub_8103154(u8 a0, u8 a1) +{ + s16 i; + + for (i = 0; i < 5; i++) + { + if (sub_81030A4(2 - i, a0, a1)) + { + eSlotMachine->unk34[0] = 2; + eSlotMachine->unk2E[0] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_81031B4(u8 tag1, u8 tag2) +{ + s16 i; + bool8 r6 = sub_8103134(); + if (r6 || !sub_81030E0(0)) + { + for (i = 1; i < 4; i++) + { + if (sub_81030A4(i, tag1, tag2)) + { + eSlotMachine->unk34[0] = i; + eSlotMachine->unk2E[0] = 0; + return TRUE; + } + } + } + for (i = 1; i < 5; i++) + { + bool8 r7 = r6; + if (r7 || !sub_81030E0(i)) + { + if (sub_81030A4(1 - i, tag1, tag2)) + { + if (i == 1 && (r7 || !sub_81030E0(3))) + { + eSlotMachine->unk34[0] = 3; + eSlotMachine->unk2E[0] = 3; + return TRUE; + } + if (i < 4 && (r7 || !sub_81030E0(i + 1))) + { + eSlotMachine->unk34[0] = 2; + eSlotMachine->unk2E[0] = i + 1; + return TRUE; + } + eSlotMachine->unk34[0] = 1; + eSlotMachine->unk2E[0] = i; + return TRUE; + } + } + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB70[])(void) = +{ + sub_81032E8, + sub_81032E8, + sub_810333C +}; + +static bool8 sub_81032C0(void) +{ + return gUnknown_083ECB70[eSlotMachine->bet - 1](); +} + +static bool8 sub_81032E8(void) +{ + s16 i; + s16 unk34_0 = eSlotMachine->unk34[0]; + + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, unk34_0 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = unk34_0; + eSlotMachine->unk2E[1] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_810333C(void) +{ + s16 i; + if (sub_81032E8()) + { + if (eSlotMachine->unk34[0] != 2 && eSlotMachine->unk2E[1] > 1 && eSlotMachine->unk2E[1] != 4) + { + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + return TRUE; + } + if (eSlotMachine->unk34[0] != 2) + { + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + return TRUE; + } + } + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = +{ + sub_810341C, + sub_810341C, + sub_810347C +}; + +static bool8 sub_81033DC(void) +{ + u8 r3 = eSlotMachine->unk07; + if (eSlotMachine->unk04 & 0x40) + { + r3 = 0; + if (eSlotMachine->unk07 == 0) + { + r3 = 1; + } + } + return gUnknown_083ECB7C[eSlotMachine->bet - 1](r3); +} + +static bool8 sub_810341C(u8 a0) +{ + s16 i; + s16 unk34_1 = eSlotMachine->unk34[1]; + + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, unk34_1 - i) == a0) + { + eSlotMachine->unk34[2] = unk34_1; + eSlotMachine->unk2E[2] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_810347C(u8 a0) +{ + s16 i; + s16 r8; + if (eSlotMachine->unk34[0] == eSlotMachine->unk34[1]) + return sub_810341C(a0); + if (eSlotMachine->unk34[0] == 1) + r8 = 3; + else + r8 = 1; + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - i) == a0) + { + eSlotMachine->unk2E[2] = i; + eSlotMachine->unk34[2] = r8; + return TRUE; + } + } + return FALSE; +} + +static void sub_81034F4(void) +{ + s16 i = 0; + + while (sub_81030E0(i) != 0) + i++; + eSlotMachine->unk2E[0] = i; +} + +static bool8 sub_8103520(u8 *a0) +{ + if (*a0 == 0) + { + *a0 = 1; + return TRUE; + } + if (*a0 == 1) + { + *a0 = 0; + return TRUE; + } + return FALSE; +} + +static void (*const gUnknown_083ECB88[])(void) = +{ + sub_8103564, + j5_08111E84, + sub_8103668 +}; + +static void sub_8103540(void) +{ + gUnknown_083ECB88[eSlotMachine->bet - 1](); +} + +static void sub_8103564(void) +{ + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + s16 i; + for (i = 0; i < 5; i++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i)) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + } +} + +static void j5_08111E84(void) +{ + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + s16 i; + for (i = 0; i < 5; i++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - i)) + { + eSlotMachine->unk34[1] = eSlotMachine->unk34[0]; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + } +} + +static void sub_8103668(void) +{ + s16 i; + s16 j; + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + if (eSlotMachine->unk34[0] == 2) + { + j5_08111E84(); + } + else + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + j = 2; + if (eSlotMachine->unk34[0] == 3) + j = 3; + for (i = 0; i < 2; i++, j--) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, j)) + { + eSlotMachine->unk34[1] = j; + eSlotMachine->unk2E[1] = 0; + return; + } + } + for (j = 1; j < 5; j++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - j)) + { + if (eSlotMachine->unk34[0] == 1) + { + if (j < 3) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = j + 1; + } + else + { + eSlotMachine->unk34[1] = 1; + eSlotMachine->unk2E[1] = j; + } + } + else + { + if (j < 3) + { + eSlotMachine->unk34[1] = 3; + eSlotMachine->unk2E[1] = j; + } + else + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = j - 1; + } + } + return; + } + } + } + } + } +} + +static bool8 sub_8103764(u8 a0, u8 a1) +{ + if ((a0 == 0 && a1 == 1) || (a0 == 1 && a1 == 0)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_810378C(u8 a0, u8 a1, u8 a2) +{ + if ((a0 == 0 && a1 == 1 && a2 == 0) || (a0 == 1 && a1 == 0 && a2 == 1)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2) +{ + if ((a0 == 0 && a1 == 1 && a2 == 0) || + (a0 == 1 && a1 == 0 && a2 == 1) || + (a0 == 0 && a1 == 0 && a2 == 1) || + (a0 == 1 && a1 == 1 && a2 == 0) || + (a0 == a1 && a0 == a2)) + { + return FALSE; + } + return TRUE; +} + +static void (*const gUnknown_083ECB94[])(void) = +{ + sub_8103830, + sub_8103910, + sub_8103A78 +}; + +static void sub_810380C(void) +{ + gUnknown_083ECB94[eSlotMachine->bet - 1](); +} + +static void sub_8103830(void) +{ + s16 i = 0; + u8 r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]); + u8 r1 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + if (r5 == r1) + { + while (1) + { + u8 r0; + if (!(r5 == (r0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) || (r5 == 0 && r0 == 1) || (r5 == 1 && r0 == 0))) + break; + i++; + } + } + else if (sub_8103764(r5, r1)) + { + if (eSlotMachine->unk04 & 0x80) + { + for (i = 0; i < 5; i++) + { + if (r5 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) + { + eSlotMachine->unk2E[2] = i; + return; + } + } + } + i = 0; + while (1) + { + if (r5 != GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) + break; + i++; + } + } + eSlotMachine->unk2E[2] = i; +} + +static void sub_8103910(void) +{ + s16 sp0 = 0; + s16 i; + u8 r7; + u8 r6; + u8 r4; + + if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] == eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80) + { + r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]); + if (sub_8103764(r7, r6)) + { + for (i = 0; i < 5; i++) + { + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, eSlotMachine->unk34[1] - i); + if (r7 == r4) + { + sp0 = i; + break; + } + } + } + } + while (1) + { + s16 r8; + for (i = 1, r8 = 0; i < 4; i++) + { + r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, i - eSlotMachine->unk2E[0]); + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, i - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, i - sp0); + if (!sub_81037BC(r7, r6, r4) && (!sub_810378C(r7, r6, r4) || !(eSlotMachine->unk04 & 0x80))) + { + r8++; + break; + } + } + if (r8 == 0) + break; + sp0++; + } + eSlotMachine->unk2E[2] = sp0; +} + +static void sub_8103A78(void) +{ + u8 r6; + u8 r5; + u8 r4; + s16 r8; + s16 i; + + sub_8103910(); + if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] != eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]); + if (sub_8103764(r6, r5)) + { + r8 = 1; + if (eSlotMachine->unk34[0] == 1) + r8 = 3; + for (i = 0; i < 5; i++) + { + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - (eSlotMachine->unk2E[2] + i)); + if (r6 == r4) + { + eSlotMachine->unk2E[2] += i; + break; + } + } + } + } + while (1) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 3 - eSlotMachine->unk2E[2]); + if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80)) + break; + eSlotMachine->unk2E[2]++; + } + while (1) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 1 - eSlotMachine->unk2E[2]); + if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80)) + break; + eSlotMachine->unk2E[2]++; + } +} + +static void sub_8103C14(u8 a0) +{ + u8 taskId = CreateTask(sub_8103C48, 5); + gTasks[taskId].data[15] = a0; + sub_8103C48(taskId); +} + +static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = +{ + sub_8103C78, + sub_8103CAC, + sub_8103CC8 +}; + +static void sub_8103C48(u8 taskId) +{ + gUnknown_083ECBA0[gTasks[taskId].data[0]](gTasks + taskId, taskId); +} + +static const s16 gUnknown_083ECBAC[] = {5, 10, 15}; + +static void sub_8103C78(struct Task *task, u8 taskId) +{ + sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x62, 0x63, 0x72, 0x73); + task->data[0]++; +} + +static void sub_8103CAC(struct Task *task, u8 taskId) +{ + if (++task->data[1] > 11) + task->data[0]++; +} + +static void sub_8103CC8(struct Task *task, u8 taskId) +{ + sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x42, 0x43, 0x52, 0x53); + DestroyTask(taskId); +} + +static const u16 *const gUnknown_083EDD08[]; +static const u16 *const gUnknown_083EDD1C[]; +static const u8 gUnknown_083EDD30[]; + +static void sub_8103D00(u8 a0) +{ + LoadPalette(gUnknown_083EDD08[a0], gUnknown_083EDD30[a0], 2); +} + +static void sub_8103D28(u8 a0) +{ + LoadPalette(gUnknown_083EDD1C[a0], gUnknown_083EDD30[a0], 2); +} + +static const u8 gUnknown_083EDD35[][2]; +static const u8 gUnknown_083EDD3B[]; + +static void sub_8103D50(u8 a0) +{ + u8 i; + for (i = 0; i < gUnknown_083EDD3B[a0]; i++) + sub_8103D00(gUnknown_083EDD35[a0][i]); +} + +static void sub_8103D8C(u8 a0) +{ + u8 i; + for (i = 0; i < gUnknown_083EDD3B[a0]; i++) + sub_8103D28(gUnknown_083EDD35[a0][i]); +} + +static void sub_8103DC8(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + u8 spriteId = CreateInvisibleSprite(sub_8103EE4); + gSprites[spriteId].data[0] = i; + eSlotMachine->unk44[i] = spriteId; + } +} + +static void sub_8103E04(u8 a0) +{ + struct Sprite *sprite = gSprites + eSlotMachine->unk44[a0]; + sprite->data[1] = 1; + sprite->data[2] = 4; + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = 2; + sprite->data[7] = 0; +} + +static bool8 sub_8103E38(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + struct Sprite *sprite = &gSprites[eSlotMachine->unk44[i]]; + if (sprite->data[1] && sprite->data[2]) + return FALSE; + } + return TRUE; +} + +static bool8 sub_8103E7C(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + if (!sub_8103EAC(eSlotMachine->unk44[i])) + return FALSE; + } + return TRUE; +} + +static bool8 sub_8103EAC(u8 spriteId) +{ + struct Sprite *sprite = gSprites + spriteId; + if (!sprite->data[1]) + return TRUE; + if (sprite->data[7]) + sprite->data[1] = 0; + return sprite->data[7]; +} + +static void sub_8103EE4(struct Sprite *sprite) +{ + s16 r4; + if (sprite->data[1]) + { + if (!sprite->data[3]--) + { + sprite->data[7] = 0; + sprite->data[3] = 1; + sprite->data[4] += sprite->data[5]; + r4 = 4; + if (sprite->data[2]) + r4 = 8; + if (sprite->data[4] <= 0) + { + sprite->data[7] = 1; + sprite->data[5] = -sprite->data[5]; + if (sprite->data[2]) + sprite->data[2]--; + } + else if (sprite->data[4] >= r4) + sprite->data[5] = -sprite->data[5]; + if (sprite->data[2]) + sprite->data[3] <<= 1; + } + MultiplyPaletteRGBComponents(gUnknown_083EDD30[sprite->data[0]], sprite->data[4], sprite->data[4], sprite->data[4]); + } +} + +static void sub_8103F70(void) +{ + u8 taskId = CreateTask(sub_8103FE8, 6); + gTasks[taskId].data[3] = 1; + sub_8103FE8(taskId); +} + +static const u16 *const gUnknown_083EDDA0[]; +static const u16 *const gUnknown_083EDDAC; + +static bool8 sub_8103FA0(void) +{ + u8 taskId = FindTaskIdByFunc(sub_8103FE8); + if (!gTasks[taskId].data[2]) + { + DestroyTask(taskId); + LoadPalette(gUnknown_083EDDAC, 0x10, 0x20); + return TRUE; + } + return FALSE; +} + +static void sub_8103FE8(u8 taskId) +{ + struct Task *task = gTasks + taskId; + if (!task->data[1]--) + { + task->data[1] = 4; + task->data[2] += task->data[3]; + if (task->data[2] == 0 || task->data[2] == 2) + task->data[3] = -task->data[3]; + } + LoadPalette(gUnknown_083EDDA0[task->data[2]], 0x10, 0x20); +} + +static void sub_8104048(void) +{ + eSlotMachine->unk3E = CreateTask(sub_81040E8, 8); +} + +static void sub_8104064(u8 pikaPower) +{ + struct Task *task = gTasks + eSlotMachine->unk3E; + sub_810421C(task); + task->data[0] = 1; + task->data[1]++; + task->data[15] = 1; +} + +static void sub_8104098(void) +{ + struct Task *task = gTasks + eSlotMachine->unk3E; + sub_810421C(task); + task->data[0] = 3; + task->data[15] = 1; +} + +static bool8 sub_81040C8(void) +{ + return gTasks[eSlotMachine->unk3E].data[15]; +} + +static void (*const gUnknown_083ECBB4[])(struct Task *task) = +{ + nullsub_68, + sub_810411C, + sub_8104144, + sub_81041AC +}; + +static void sub_81040E8(u8 taskId) +{ + gUnknown_083ECBB4[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void nullsub_68(struct Task *task) +{ +} + +static void sub_810411C(struct Task *task) +{ + task->data[2] = sub_8105B1C((task->data[1] << 3) + 20, 20); + task->data[0]++; +} + +static const u16 gUnknown_083ECBC4[][2] = +{ + {0x9e, 0x6e}, + {0x9f, 0x6f}, + {0xaf, 0x7f}, +}; + +static void sub_8104144(struct Task *task) +{ + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + if (gSprites[task->data[2]].data[7]) + { + s16 r2 = task->data[1] + 2; + u8 r0 = 0; + if (task->data[1] == 1) + r0 = 1; + else if (task->data[1] == 16) + r0 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r0][0]; + sub_8105B88(task->data[2]); + task->data[0] = 0; + task->data[15] = 0; + } +} + +static void sub_81041AC(struct Task *task) +{ + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + s16 r4 = task->data[1] + 2; + u8 r2 = 0; + if (task->data[1] == 1) + r2 = 1; + else if (task->data[1] == 16) + r2 = 2; + if (task->data[2] == 0) + { + vaddr[r4 + 0x40] = gUnknown_083ECBC4[r2][1]; + task->data[1]--; + } + if (++task->data[2] >= 20) + task->data[2] = 0; + if (task->data[1] == 0) + { + task->data[0] = 0; + task->data[15] = 0; + } +} + +static void sub_810421C(struct Task *task) +{ + u8 i; + + for (i = 2; i < 16; i++) + task->data[i] = 0; +} + +static void sub_810423C(u8 pikaPower) +{ + s16 i; + u8 r3; + s16 r2 = 3; + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + for (i = 0; i < pikaPower; i++, r2++) + { + r3 = 0; + if (i == 0) + r3 = 1; + else if (i == 15) + r3 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][0]; + } + for (; i < 16; i++, r2++) + { + r3 = 0; + if (i == 0) + r3 = 1; + else if (i == 15) + r3 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][1]; + } + gTasks[eSlotMachine->unk3E].data[1] = pikaPower; +} + +static void sub_810430C(void) +{ + u8 taskId = CreateTask(sub_810434C, 7); + sub_810434C(taskId); +} + +static bool8 sub_810432C(void) +{ + if (FindTaskIdByFunc(sub_810434C) == 0xFF) + return TRUE; + return FALSE; +} + +static void (*const gUnknown_083ECBD0[])(struct Task *task) = +{ + sub_810437C, + sub_81043EC, + sub_8104468, + sub_8104498, + sub_8104548, + sub_8104598, + sub_81045CC, + sub_810463C, + sub_81046C0, + sub_8104764, + sub_8104794, + sub_81047EC, + sub_8104860, + sub_81048A8, + sub_81048CC, + sub_8104940, + sub_81049C8, + sub_8104794, + sub_81049F8 +}; + +static void sub_810434C(u8 taskId) +{ + gUnknown_083ECBD0[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void sub_810437C(struct Task *task) +{ + eSlotMachine->unk0A = 0; + eSlotMachine->unk14 = 0; + eSlotMachine->unk16 = 0; + task->data[0]++; + task->data[1] = 0; + task->data[2] = 30; + task->data[4] = 1280; + gSpriteCoordOffsetX = 0; + gSpriteCoordOffsetY = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + sub_8104A40(30, 0); + sub_81051C0(); + sub_8105100(); + sub_81052EC(); + sub_81053A0(); + sub_810545C(); + sub_8102680(); + StopMapMusic(); + PlayNewMapMusic(BGM_BD_TIME); +} + +static void sub_81043EC(struct Task *task) +{ + s16 r3; + gSpriteCoordOffsetX -= 8; + task->data[1] += 8; + r3 = ((task->data[1] + 240) & 0xff) >> 3; + REG_BG1HOFS = task->data[1] & 0x1ff; + if (r3 != task->data[2] && task->data[3] <= 18) + { + task->data[2] = r3; + task->data[3] = task->data[1] >> 3; + sub_8104A40(r3, task->data[3]); + } + if (task->data[1] >= 200) + { + task->data[0]++; + task->data[3] = 0; + } + sub_8102D28(task->data[4] >> 8); +} + +static void sub_8104468(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + if (++task->data[5] >= 60) + { + task->data[0]++; + sub_8105578(); + sub_81056F0(); + } +} + +static void sub_8104498(struct Task *task) +{ + int r5; + u8 sp0[] = {1, 1, 2, 2}; + s16 sp4[] = {0x40, 0x30, 0x18, 0x08}; + s16 spC[] = {10, 8, 6, 4}; + + sub_8102D28(task->data[4] >> 8); + task->data[4] -= 4; + r5 = 4 - (task->data[4] >> 8); + sub_8105688(sp4[r5]); + sub_81057E8(spC[r5]); + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, sp0[r5]); + if (task->data[4] <= 0x100) + { + task->data[0]++; + task->data[4] = 0x100; + task->data[5] = 0; + } +} + +static void sub_8104548(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + if (++task->data[5] >= 80) + { + task->data[0]++; + task->data[5] = 0; + sub_81057E8(2); + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 3); + } +} + +static void sub_8104598(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x80; + if (++task->data[5] >= 80) + { + task->data[0]++; + task->data[5] = 0; + } +} + +static void sub_81045CC(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x40; + if (++task->data[5] >= 40) + { + task->data[5] = 0; + if (eSlotMachine->unk05) + { + if (eSlotMachine->unk0A <= task->data[6]) + task->data[0]++; + } + else if (task->data[6] > 3) + { + task->data[0]++; + } + else if (sub_81026DC(task->data[6])) + { + task->data[0] = 14; + } + task->data[6]++; + } +} + +static void sub_810463C(struct Task *task) +{ + s16 r5 = eSlotMachine->unk14 % 20; + if (r5) + { + r5 = sub_8102D5C(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x40; + } + else if (sub_8102C48(1) != eSlotMachine->unk05) + { + sub_8102D28(task->data[4] >> 8); + r5 = eSlotMachine->unk14 % 20; + task->data[4] = (u8)task->data[4] + 0x40; + } + if (r5 == 0 && sub_8102C48(1) == eSlotMachine->unk05) + { + task->data[4] = 0; + task->data[0]++; + } +} + +static void sub_81046C0(struct Task *task) +{ + if (++task->data[4] >= 60) + { + StopMapMusic(); + sub_81056C0(); + sub_8105804(); + task->data[0]++; + if(eSlotMachine->unk05 == 0) + { + task->data[4] = 0xa0; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5); + PlayFanfare(BGM_ME_ZANNEN); + } + else + { + task->data[4] = 0xc0; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 4); + gSprites[eSlotMachine->unk3F].animCmdIndex = 0; + if (eSlotMachine->pikaPower) + { + sub_8104098(); + eSlotMachine->pikaPower = 0; + } + PlayFanfare(BGM_ME_B_SMALL); + } + } +} + +static void sub_8104764(struct Task *task) +{ + if ((task->data[4] == 0 || --task->data[4] == 0) && !sub_81040C8()) + task->data[0]++; +} + +static void sub_8104794(struct Task *task) +{ + s16 r4; + gSpriteCoordOffsetX -= 8; + task->data[1] += 8; + task->data[3] += 8; + r4 = ((task->data[1] - 8) & 0xff) >> 3; + REG_BG1HOFS = task->data[1] & 0x1ff; + if (task->data[3] >> 3 <= 25) + sub_8104A88(r4); + else + task->data[0]++; +} + +static void sub_81047EC(struct Task *task) +{ + eSlotMachine->unk0B = 0; + eSlotMachine->unk0A = eSlotMachine->unk05; + gSpriteCoordOffsetX = 0; + REG_BG1HOFS = 0; + eSlotMachine->unk1A = 8; + sub_810514C(); + sub_81054B8(); + sub_8105524(); + PlayNewMapMusic(eSlotMachine->backupMapMusic); + if (eSlotMachine->unk0A == 0) + { + DestroyTask(FindTaskIdByFunc(sub_810434C)); + } + else + { + sub_8104CAC(4); + task->data[1] = dp15_jump_random_unknown(); + task->data[2] = 0; + task->data[3] = 0; + task->data[0]++; + } +} + +static void sub_8104860(struct Task *task) +{ + if (eSlotMachine->unk1A == task->data[1]) + task->data[0]++; + else if (eSlotMachine->unk1C[0] % 24 == 0 && (++task->data[2]& 0x07) == 0) + eSlotMachine->unk1A >>= 1; +} + +static void sub_81048A8(struct Task *task) +{ + if (sub_8104E18()) + DestroyTask(FindTaskIdByFunc(sub_810434C)); +} + +static void sub_81048CC(struct Task *task) +{ + sub_81054B8(); + sub_81056C0(); + sub_8105804(); + sub_8105854(); + gSprites[eSlotMachine->unk4E[0]].invisible = TRUE; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5); + task->data[0]++; + task->data[4] = 4; + task->data[5] = 0; + StopMapMusic(); + PlayFanfare(BGM_ME_ZANNEN); + PlaySE(SE_W153); +} + +static void sub_8104940(struct Task *task) +{ + gSpriteCoordOffsetY = task->data[4]; + REG_BG1VOFS = task->data[4]; + if (task->data[5] & 0x01) + task->data[4] = -task->data[4]; + if ((++task->data[5] & 0x1f) == 0) + task->data[4] >>= 1; + if (task->data[4] == 0) + { + sub_81058A0(); + sub_81058C4(); + sub_8105284(); + sub_81059E8(); + gSprites[eSlotMachine->unk4E[0]].invisible = FALSE; + task->data[0]++; + task->data[5] = 0; + } +} + +static void sub_81049C8(struct Task *task) +{ + gSpriteCoordOffsetY = 0; + REG_BG1VOFS = 0; + if (sub_8105ACC()) + { + task->data[0]++; + sub_8105AEC(); + } +} + +static void sub_81049F8(struct Task *task) +{ + gSpriteCoordOffsetX = 0; + REG_BG1HOFS = 0; + PlayNewMapMusic(eSlotMachine->backupMapMusic); + sub_810514C(); + sub_8105554(); + sub_8105524(); + sub_81059B8(); + DestroyTask(FindTaskIdByFunc(sub_810434C)); +} + +static const u16 sReelTimeWindowTilemap[]; + +static void sub_8104A40(s16 a0, s16 a1) +{ + s16 i; + + for (i = 4; i < 15; i++) + { + u16 tile = sReelTimeWindowTilemap[a1 + (i - 4) * 20]; + ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = tile; + } +} + +static void sub_8104A88(s16 a0) +{ + s16 i; + + for (i = 4; i < 15; i++) + { + ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = 0; + } +} + +static void sub_8104AB8(u8 a0) +{ + u8 taskId = CreateTask(sub_8104B0C, 1); + gTasks[taskId].data[1] = a0; + sub_8104B0C(taskId); +} + +static bool8 sub_8104AEC(void) +{ + if (FindTaskIdByFunc(sub_8104B0C) == 0xFF) + return TRUE; + else + return FALSE; +} + +static void (*const gUnknown_083ECC30[])(struct Task *task) = +{ + sub_8104B3C, + sub_8104B60, + sub_8104B80, + sub_8104B60, + sub_8104BC8, + sub_8104B60, + sub_8104BFC, + sub_8104B60, + sub_8104C44 +}; + +static void sub_8104B0C(u8 taskId) +{ + gUnknown_083ECC30[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void sub_8104B3C(struct Task *task) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + task->data[0]++; +} + +static void sub_8104B60(struct Task *task) +{ + if (!gPaletteFade.active) + task->data[0]++; +} + +static void sub_8104B80(struct Task *task) +{ + sub_8104DA4(); + sub_81065DC(); + BasicInitMenuWindow(&gWindowTemplate_81E7144); + Menu_PrintTextPixelCoords(gOtherText_ReelTime, 10, 32, 1); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + task->data[0]++; +} + +static void sub_8104BC8(struct Task *task) +{ + if (gMain.newKeys & (B_BUTTON | SELECT_BUTTON)) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + task->data[0]++; + } +} + +static void sub_8104BFC(struct Task *task) +{ + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7128); + sub_81064B8(); + sub_8104CAC(task->data[1]); + sub_810423C(eSlotMachine->pikaPower); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + task->data[0]++; +} + +static void sub_8104C44(struct Task *task) +{ + DestroyTask(FindTaskIdByFunc(sub_8104B0C)); +} + +static void sub_8104C5C(void) +{ + u8 i; + struct Task *task; + i = CreateTask(sub_8104E74, 3); + eSlotMachine->unk3D = i; + task = gTasks + i; + task->data[1] = -1; + for (i = 4; i < 16; i++) + task->data[i] = MAX_SPRITES; +} + +static void LoadSlotMachineWheelOverlay(void); + +static void sub_8104CAC(u8 arg0) +{ + u8 i; + struct Task *task; + + sub_8104DA4(); + + task = gTasks + eSlotMachine->unk3D; + task->data[1] = arg0; + + for (i = 0; gUnknown_083ED048[arg0][i].unk00 != 0xFF; i++) + { + u8 spriteId; + spriteId = sub_8105BB4( + gUnknown_083ED048[arg0][i].unk00, + gUnknown_083ED048[arg0][i].unk01, + gUnknown_083ED048[arg0][i].unk02 + ); + task->data[4 + i] = spriteId; + +#ifdef GERMAN + if (arg0 == 5 && i <= 2) + gSprites[spriteId].invisible = TRUE; +#endif + } +} + +static void sub_8104D30(u8 a0, SpriteCallback a1, s16 a2, s16 a3, s16 a4) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + for (i = 4; i < 16; i++) + { + if (task->data[i] == MAX_SPRITES) + { + task->data[i] = sub_8105BF8(a0, a1, a2, a3, a4); + break; + } + } +} + +static void (*const gUnknown_083ED064[])(void); + +void sub_8104DA4(void) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + if ((u16)task->data[1] != 0xFFFF) + gUnknown_083ED064[task->data[1]](); + for (i = 4; i < 16; i++) + { + if (task->data[i] != MAX_SPRITES) + { + DestroySprite(gSprites + task->data[i]); + task->data[i] = MAX_SPRITES; + } + } +} + +static bool8 sub_8104E18(void) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + for (i = 4; i < 16; i++) + { + if (task->data[i] != MAX_SPRITES) + { + if (gSprites[task->data[i]].data[7]) + return FALSE; + } + } + return TRUE; +} + +static void (*const gUnknown_083ECC54[])(struct Task *task) = +{ + nullsub_69, +}; + +static void sub_8104E74(u8 taskId) +{ + gUnknown_083ECC54[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void nullsub_69(struct Task *task) +{ +} + +static const struct SpriteTemplate gSpriteTemplate_83ED414; + +static void sub_8104EA8(void) +{ + s16 i; + s16 j; + s16 x; + for (i = 0, x = 0x30; i < 3; i++, x += 0x28) + { + for (j = 0; j < 120; j += 24) + { + struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED414, x, 0, 14); + sprite->oam.priority = 3; + sprite->data[0] = i; + sprite->data[1] = j; + sprite->data[3] = -1; + } + } +} + +static void sub_8104F18(struct Sprite *sprite) +{ + sprite->data[2] = eSlotMachine->unk1C[sprite->data[0]] + sprite->data[1]; + sprite->data[2] %= 120; + sprite->pos1.y = eSlotMachine->unk22[sprite->data[0]] + 28 + sprite->data[2]; + sprite->sheetTileStart = GetSpriteTileStartByTag(GetTagOfReelSymbolOnScreenAtPos(sprite->data[0], sprite->data[2] / 24)); + SetSpriteSheetFrameTileNum(sprite); +} + +static void sub_8104F8C(void) +{ + s16 i; + s16 x; + + for (x = 203, i = 1; i < 10000; i *= 10, x -= 7) + sub_8104FF4(x, 23, 0, i); + for (x = 235, i = 1; i < 10000; i *= 10, x -= 7) + sub_8104FF4(x, 23, 1, i); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED42C; + +static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3) +{ + struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED42C, x, y, 13); + sprite->oam.priority = 2; + sprite->data[0] = a2; + sprite->data[1] = a3; + sprite->data[2] = a3 * 10; + sprite->data[3] = -1; +} + +static void sub_810506C(struct Sprite *sprite) +{ + u16 tag = eSlotMachine->coins; + if (sprite->data[0]) + tag = eSlotMachine->payout; + if (sprite->data[3] != tag) + { + sprite->data[3] = tag; + tag %= (u16)sprite->data[2]; + tag /= (u16)sprite->data[1]; + tag += 7; + sprite->sheetTileStart = GetSpriteTileStartByTag(tag); + SetSpriteSheetFrameTileNum(sprite); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED444; +static const struct SubspriteTable gSubspriteTables_83ED704[]; + +static void sub_81050C4(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED444, 0x58, 0x48, 15); + gSprites[spriteId].oam.priority = 3; + SetSubspriteTables(gSprites + spriteId, gSubspriteTables_83ED704); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED45C; + +static void sub_8105100(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED45C, 0x118, 0x50, 1); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].coordOffsetEnabled = TRUE; + eSlotMachine->unk3F = spriteId; +} + +static void sub_810514C(void) +{ + DestroySprite(gSprites + eSlotMachine->unk3F); +} + +static void sub_8105170(struct Sprite *sprite) +{ + sprite->pos2.y = sprite->pos2.x = 0; + if (sprite->animNum == 4) + { + sprite->pos2.y = sprite->pos2.x = 8; + if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0)) + sprite->pos2.y = -8; + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED474; +static const struct SpriteTemplate gSpriteTemplate_83ED48C; +static const struct SubspriteTable gSubspriteTables_83ED73C[]; +static const struct SubspriteTable gSubspriteTables_83ED75C[]; + +static void sub_81051C0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED474, 0x170, 0x34, 7); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED73C); + eSlotMachine->unk49[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED48C, 0x170, 0x54, 7); + sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED75C); + eSlotMachine->unk49[1] = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4A4; +static const struct SubspriteTable gSubspriteTables_83ED78C[]; + +static void sub_8105284(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4A4, 0xa8 - gSpriteCoordOffsetX, 0x50, 7); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED78C); + eSlotMachine->unk42 = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4BC; + +static void sub_81052EC(void) +{ + u8 i; + s16 r5; + for (i = 0, r5 = 0; i < 3; i++, r5 += 20) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4BC, 0x170, 0x00, 10); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->data[7] = r5; + eSlotMachine->unk4B[i] = spriteId; + } +} + +static void sub_810535C(struct Sprite *sprite) +{ + s16 r0 = (u16)(eSlotMachine->unk14 + sprite->data[7]); + r0 %= 40; + sprite->pos1.y = r0 + 59; + StartSpriteAnimIfDifferent(sprite, sub_8102C48(r0 / 20)); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4D4; +static const struct SubspriteTable gSubspriteTables_83ED7B4[]; + +static void sub_81053A0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x170, 0x64, 9); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); + eSlotMachine->unk4E[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x120, 0x68, 4); + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); + eSlotMachine->unk4E[1] = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4EC; +static const struct SubspriteTable gSubspriteTables_83ED7D4[]; + +static void sub_810545C(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4EC, 0x170, 0x4c, 11); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7D4); + eSlotMachine->unk40 = spriteId; +} + +static void sub_81054B8(void) +{ + u8 i; + + DestroySprite(&gSprites[eSlotMachine->unk40]); + for (i = 0; i < 2; i++) + DestroySprite(&gSprites[eSlotMachine->unk49[i]]); + for (i = 0; i < 3; i++) + DestroySprite(&gSprites[eSlotMachine->unk4B[i]]); +} + +static void sub_8105524(void) +{ + u8 i; + + for (i = 0; i < 2; i++) + DestroySprite(&gSprites[eSlotMachine->unk4E[i]]); +} + +static void sub_8105554(void) +{ + DestroySprite(&gSprites[eSlotMachine->unk42]); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED504; + +static void sub_8105578(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0x98, 0x20, 5); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->hFlip = TRUE; + eSlotMachine->unk50[0] = spriteId; + sprite->data[0] = 8; + sprite->data[1] = -1; + sprite->data[2] = -1; + sprite->data[7] = 0x20; + + spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0xb8, 0x20, 5); + sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + eSlotMachine->unk50[1] = spriteId; + sprite->data[1] = 1; + sprite->data[2] = -1; + sprite->data[7] = 0x20; +} + +static void sub_810562C(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + { + sprite->data[0]--; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->invisible = TRUE; + } + else + { + sprite->invisible = FALSE; + sprite->pos2.x += sprite->data[1]; + sprite->pos2.y += sprite->data[2]; + if (++sprite->data[3] >= 8) + { + sprite->data[0] = sprite->data[7]; + sprite->data[3] = 0; + } + } +} + +static void sub_8105688(s16 a0) +{ + gSprites[eSlotMachine->unk50[0]].data[7] = a0; + gSprites[eSlotMachine->unk50[1]].data[7] = a0; +} + +static void sub_81056C0(void) +{ + u8 i; + + for (i = 0; i < 2; i++) + DestroySprite(&gSprites[eSlotMachine->unk50[i]]); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED51C; + +static void sub_81056F0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x48, 0x50, 3); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].data[0] = 1; + gSprites[spriteId].data[5] = 0; + gSprites[spriteId].data[6] = 16; + gSprites[spriteId].data[7] = 8; + eSlotMachine->unk52[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x68, 0x50, 3); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].hFlip = TRUE; + eSlotMachine->unk52[1] = spriteId; +} + +static const u8 gUnknown_083ECC58[2]; // don't remove this until decompiled through gUnknown_083ECCF8 + +static void sub_8105784(struct Sprite *sprite) +{ + u8 sp[] = {16, 0}; + if (sprite->data[0] && --sprite->data[6] <= 0) + { + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, sp[sprite->data[5]], sp[sprite->data[5]], sp[sprite->data[5]]); + ++sprite->data[5]; + sprite->data[5] &= 1; + sprite->data[6] = sprite->data[7]; + } +} + +static void sub_81057E8(s16 a0) +{ + gSprites[eSlotMachine->unk52[0]].data[7] = a0; +} + +static void sub_8105804(void) +{ + u8 i; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, 0, 0, 0); + for (i = 0; i < 2; i++) + DestroySprite(&gSprites[eSlotMachine->unk52[i]]); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED534; + +static void sub_8105854(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED534, 0xa8, 0x50, 6); + gSprites[spriteId].oam.priority = 1; + eSlotMachine->unk41 = spriteId; +} + +static void sub_8105894(struct Sprite *sprite) +{ + sprite->pos2.y = gSpriteCoordOffsetY; +} + +static void sub_81058A0(void) +{ + DestroySprite(&gSprites[eSlotMachine->unk41]); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED54C; + +static void sub_81058C4(void) +{ + u8 i; + u16 sp[] = {0x0, 0x40, 0x80, 0xC0}; + for (i = 0; i < 4; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED54C, 0x50 - gSpriteCoordOffsetX, 0x44, 0); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = sp[i]; + eSlotMachine->unk54[i] = spriteId; + } +} + +static void sub_810594C(struct Sprite *sprite) +{ + sprite->data[0] -= 2; + sprite->data[0] &= 0xff; + sprite->pos2.x = Cos(sprite->data[0], 20); + sprite->pos2.y = Sin(sprite->data[0], 6); + sprite->subpriority = 0; + if (sprite->data[0] >= 0x80) + { + sprite->subpriority = 2; + } + if (++sprite->data[1] >= 16) + { + sprite->hFlip ^= 1; + sprite->data[1] = 0; + } +} + +static void sub_81059B8(void) +{ + u8 i; + for (i = 0; i < 4; i++) + { + DestroySprite(&gSprites[eSlotMachine->unk54[i]]); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED564; + +static void sub_81059E8(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED564, 0xa8, 0x3c, 8); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + InitSpriteAffineAnim(sprite); + eSlotMachine->unk43 = spriteId; +} + +static void sub_8105A38(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (sprite->affineAnimEnded) + sprite->data[0]++; + } + else if (sprite->data[0] == 1) + { + sprite->invisible ^= 1; + if (++sprite->data[2] >= 24) + { + sprite->data[0]++; + sprite->data[2] = 0; + } + } + else + { + sprite->invisible = TRUE; + if (++sprite->data[2] >= 16) + sprite->data[7] = 1; + } + sprite->data[1] &= 0xff; + sprite->data[1] += 16; + sprite->pos2.y -= (sprite->data[1] >> 8); +} + +u8 sub_8105ACC(void) +{ + return gSprites[eSlotMachine->unk43].data[7]; +} + +static void sub_8105AEC(void) +{ + struct Sprite *sprite = &gSprites[eSlotMachine->unk43]; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED6CC; + +static u8 sub_8105B1C(s16 x, s16 y) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED6CC, x, y, 12); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.priority = 2; + sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + InitSpriteAffineAnim(sprite); + return spriteId; +} + +static void sub_8105B70(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + sprite->data[7] = 1; +} + +static void sub_8105B88(u8 spriteId) +{ + struct Sprite *sprite = &gSprites[spriteId]; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); +} + +static const s16 gUnknown_083ECE7E[][2]; +static const SpriteCallback gUnknown_083ECF0C[]; + +u8 sub_8105BB4(u8 templateIdx, u8 cbAndCoordsIdx, s16 a2) +{ + return sub_8105BF8(templateIdx, gUnknown_083ECF0C[cbAndCoordsIdx], gUnknown_083ECE7E[cbAndCoordsIdx][0], gUnknown_083ECE7E[cbAndCoordsIdx][1], a2); +} + +static const struct SpriteTemplate *const gUnknown_083EDB5C[]; +static const struct SubspriteTable *const gUnknown_083EDBC4[]; + +static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4) +{ + u8 spriteId = CreateSprite(gUnknown_083EDB5C[templateIdx], x, y, 16); + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.priority = 3; + sprite->callback = callback; + sprite->data[6] = a4; + sprite->data[7] = 1; + if (gUnknown_083EDBC4[templateIdx]) + SetSubspriteTables(sprite, gUnknown_083EDBC4[templateIdx]); + return spriteId; +} + +static void sub_8105C64(struct Sprite *sprite) +{ + sprite->data[7] = 0; +} + +static void sub_8105C6C(struct Sprite *sprite) +{ + s16 sp0[] = {4, -4, 4, -4}; + s16 sp8[] = {4, 4, -4, -4}; + + if (sprite->data[1]++ >= 16) + { + sprite->subspriteTableNum ^= 1; + sprite->data[1] = 0; + } + sprite->pos2.x = 0; + sprite->pos2.y = 0; + if (sprite->subspriteTableNum != 0) + { + sprite->pos2.x = sp0[sprite->data[6]]; + sprite->pos2.y = sp8[sprite->data[6]]; + } +} + +static void sub_8105CF0(struct Sprite *sprite) +{ + sprite->hFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D08(struct Sprite *sprite) +{ + sprite->vFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D20(struct Sprite *sprite) +{ + sprite->hFlip = TRUE; + sprite->vFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D3C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 90) + sprite->data[0]++; + break; + case 2: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0x110) + sprite->data[0]++; + break; + case 3: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105DA4(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x -= 4; + if (sprite->pos1.x <= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 90) + sprite->data[0]++; + break; + case 2: + sprite->pos1.x -= 4; + if (sprite->pos1.x <= 0x90) + sprite->data[0]++; + break; + case 3: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105E08(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + StartSpriteAnim(sprite, eSlotMachine->unk0A - 1); + sprite->data[0]++; + // fallthrough + case 1: + if (++sprite->data[1] >= 4) + { + sprite->data[0]++; + sprite->data[1] = 0; + } + break; + case 2: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 3: + if (++sprite->data[1] > 90) + sprite->data[0]++; + break; + case 4: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xf8) + sprite->data[0]++; + break; + case 5: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105EB4(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->animPaused = TRUE; + sprite->data[0]++; + // fallthrough + case 1: + sprite->pos1.y += 8; + if (sprite->pos1.y >= 0x70) + { + sprite->pos1.y = 0x70; + sprite->data[1] = 16; + sprite->data[0]++; + } + break; + case 2: + if (sprite->data[2] == 0) + { + sprite->pos1.y -= sprite->data[1]; + sprite->data[1] = -sprite->data[1]; + if (++sprite->data[3] >= 2) + { + sprite->data[1] >>= 2; + sprite->data[3] = 0; + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->data[7] = 0; + sprite->animPaused = FALSE; + } + } + } + sprite->data[2]++; + sprite->data[2] &= 0x07; + break; + } +} + +static void sub_8105F54(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (++sprite->data[1] > 8) + sprite->data[0]++; + break; + case 1: + sprite->pos1.y += 2; + if (sprite->pos1.y >= 0x30) + { + sprite->pos1.y = 0x30; + sprite->data[0]++; + sprite->data[7] = 0; + } + break; + } +} + +static void sub_8105F9C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->invisible = TRUE; + if (++sprite->data[1] > 0x20) + { + sprite->data[0]++; + sprite->data[1] = 5; + sprite->oam.mosaic = TRUE; + sprite->invisible = FALSE; + StartSpriteAnim(sprite, 1); + REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; + } + break; + case 1: + sprite->data[1] -= (sprite->data[2] >> 8); + if (sprite->data[1] < 0) + sprite->data[1] = 0; + REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; + sprite->data[2] &= 0xff; + sprite->data[2] += 0x80; + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->data[7] = 0; + sprite->oam.mosaic = FALSE; + StartSpriteAnim(sprite, 0); + } + break; + } +} + +static const u16 *const gUnknown_083EDE10[]; + +static void sub_8106058(struct Sprite *sprite) +{ + if (sprite->data[1] < 3) + { + LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); + if (++sprite->data[2] >= 4) + { + sprite->data[1]++; + sprite->data[2] = 0; + } + } + else + { + LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); + if (++sprite->data[2] >= 25) + { + sprite->data[1] = 0; + sprite->data[2] = 0; + } + } + StartSpriteAnimIfDifferent(sprite, 1); + sprite->data[7] = 0; +} + +static void sub_81060FC(struct Sprite *sprite) +{ + s16 sp00[] = {0, -40, 0, 0, 48, 0, 24, 0}; + s16 sp10[] = {-32, 0, -32, -48, 0, -48, 0, -48}; + s16 sp20[] = {16, 12, 16, 0, 0, 4, 8, 8}; + + switch (sprite->data[0]) + { + case 0: + sprite->pos2.x = sp00[sprite->data[6]]; + sprite->pos2.y = sp10[sprite->data[6]]; + sprite->data[1] = sp20[sprite->data[6]]; + sprite->data[0]++; + // fallthrough + case 1: + if (sprite->data[1]-- == 0) + sprite->data[0]++; + break; + case 2: + if (sprite->pos2.x > 0) + sprite->pos2.x -= 4; + else if (sprite->pos2.x < 0) + sprite->pos2.x += 4; + + if (sprite->pos2.y > 0) + sprite->pos2.y -= 4; + else if (sprite->pos2.y < 0) + sprite->pos2.y += 4; + + if (sprite->pos2.x == 0 && sprite->pos2.y == 0) + sprite->data[0]++; + break; + } +} + +static void sub_81061C8(struct Sprite *sprite) +{ + s16 sp0[] = {160, 192, 224, 104, 80, 64, 48, 24}; + + if (sprite->data[0] == 0) + { + sprite->data[0]++; + sprite->data[1] = 12; + } + sprite->pos2.x = Cos(sp0[sprite->data[6]], sprite->data[1]); + sprite->pos2.y = Sin(sp0[sprite->data[6]], sprite->data[1]); + if (sprite->data[1] != 0) + sprite->data[1]--; +} + +static void sub_8106230(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + eSlotMachine->winIn = 0x2f; + eSlotMachine->winOut = 0x3f; + eSlotMachine->win0v = 0x2088; + sprite->invisible = TRUE; + sprite->data[0]++; + // fallthrough + case 1: + sprite->data[1] += 2; + sprite->data[2] = sprite->data[1] + 0xb0; + sprite->data[3] = 0xf0 - sprite->data[1]; + if (sprite->data[2] > 0xd0) + sprite->data[2] = 0xd0; + if (sprite->data[3] < 0xd0) + sprite->data[3] = 0xd0; + eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; + if (sprite->data[1] > 0x33) + { + sprite->data[0]++; + eSlotMachine->winIn = 0x3f; + } + break; + case 2: + if (eSlotMachine->bet == 0) + break; + sub_8104D30(5, SpriteCallbackDummy, 0xd0, 0x74, 0); + eSlotMachine->win0h = 0xc0e0; + eSlotMachine->win0v = 0x6880; + eSlotMachine->winIn = 0x2f; + sprite->data[0]++; + sprite->data[1] = 0; + // fallthrough + case 3: + sprite->data[1] += 2; + sprite->data[2] = sprite->data[1] + 0xc0; + sprite->data[3] = 0xe0 - sprite->data[1]; + if (sprite->data[2] > 0xd0) + sprite->data[2] = 0xd0; + if (sprite->data[3] < 0xd0) + sprite->data[3] = 0xd0; + eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; + if (sprite->data[1] > 0x0f) + { + sprite->data[0]++; + eSlotMachine->winIn = 0x3f; + } + break; + } +} + +static void nullsub_70(void) +{ +} + +static void sub_8106364(void) +{ + REG_MOSAIC = 0; +} + +static const u16 *const gUnknown_083EDE20; + +static void sub_8106370(void) +{ + LoadPalette(gUnknown_083EDE20, (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); +} + +static void sub_810639C(void) +{ + eSlotMachine->win0h = 0xf0; + eSlotMachine->win0v = 0xa0; + eSlotMachine->winIn = 0x3f; + eSlotMachine->winOut = 0x3f; +} + +static const u8 sReelTimeGfx[]; +static const struct SpriteSheet sSlotMachineSpriteSheets[]; +static const struct SpritePalette gSlotMachineSpritePalettes[]; + +static void sub_81063C0(void) +{ + sub_8106404(); + LZDecompressWram(gSlotMachineReelTimeLights_Gfx, eSlotMachineGfxBuffer); + LZDecompressWram(sReelTimeGfx, eSlotMachineReelTimeGfxBuffer); + LoadSpriteSheets(sSlotMachineSpriteSheets); + LoadSpritePalettes(gSlotMachineSpritePalettes); +} + +static const u8 *const gUnknown_083EDCE4; +static const struct SpriteSheet gUnknown_083EDCDC; + +static void sub_8106404(void) +{ + u8 *dest = eSlotMachineGfxBuffer; + u8 i = 0; + const struct SpriteSheet *sheet = &gUnknown_083EDCDC; + const u8 *src = gUnknown_083EDCE4; + for (i = 0; i < 0x40; i++) + { + u8 j; + for (j = 0; j < 0x20; j++, dest++) + *dest = src[j]; + } + LoadSpriteSheet(sheet); +} + +static void sub_8106448(void) +{ + LZDecompressWram(gSlotMachine_Gfx, eSlotMachineGfxBuffer); + + DmaCopyLarge16(3, eSlotMachineGfxBuffer, BG_VRAM, SLOTMACHINE_GFX_TILES * 32, 0x1000); + + LoadPalette(gUnknown_08E95A18, 0, 160); + LoadPalette(gPalette_83EDE24, 208, 32); +} + +static void sub_81064B8(void) +{ + CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); + LoadSlotMachineWheelOverlay(); +} + +static void LoadSlotMachineWheelOverlay(void) +{ + s16 x, y, dx; + u16 *screen; + + screen = BG_SCREEN_ADDR(30); + + for (x = 4; x < 18; x += 5) + { + for (dx = 0; dx < 4; dx++) + { + screen[5 * 32 + dx + x] = 0x2051; + screen[13 * 32 + dx + x] = 0x2851; + screen[6 * 32 + dx + x] = 0x2061; + screen[12 * 32 + dx + x] = 0x2861; + } + + screen[6 * 32 + x] = 0x20BE; + screen[12 * 32 + x] = 0x28BE; + + for (y = 7; y <= 11; y++) + screen[y * 32 + x] = 0x20BF; + } +} + +static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) +{ + u16 *vram = BG_SCREEN_ADDR(29); + + vram[15 * 32 + arg0] = arg1; + vram[15 * 32 + 1 + arg0] = arg2; + vram[16 * 32 + arg0] = arg3; + vram[16 * 32 + 1 + arg0] = arg4; +} + +static void sub_81065DC(void) +{ + s16 y, x; + u16 *screen; + + CpuCopy16(gUnknown_08E95FB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); + + screen = BG_SCREEN_ADDR(30); + for (y = 0; y < 20; y++) + { + for (x = 0; x < 30; x++) + screen[x + y * 32] = 0; + } +} + +static const u8 sReelSymbols[][21] = +{ + { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY + }, + { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY + }, + { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY + }, +}; + +static const u8 gUnknown_083ECCF1[] = { + 1, 0, 5, 4, 3, 2 +}; + +static const s16 gUnknown_083ECCF8[][2] = { + {0, 6}, + {0, 10}, + {0, 2} +}; + +static const u8 gUnknown_083ECD04[][3] = { + {1, 1, 12}, + {1, 1, 14}, + {2, 2, 14}, + {2, 2, 14}, + {2, 3, 16}, + {3, 3, 16} +}; + +static const u8 gUnknown_083ECD16[][6] = { + {25, 25, 30, 40, 40, 50}, + {25, 25, 30, 30, 35, 35}, + {25, 25, 30, 25, 25, 30} +}; + +static const u8 gUnknown_083ECD28[][6] = { + {20, 25, 25, 20, 25, 25}, + {12, 15, 15, 18, 19, 22}, + {25, 25, 25, 30, 30, 40}, + {25, 25, 20, 20, 15, 15}, + {40, 40, 35, 35, 40, 40} +}; + +static const u8 gUnknown_083ECD46[][17] = { + {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5}, + { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5}, + { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40}, + { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100}, + { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6} +}; + +static const u8 gUnknown_083ECDAC[][17] = { + { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5}, + { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6}, + { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35}, + { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50}, + { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60} +}; + +static const u16 gUnknown_083ECE12[] = { + 0x80, 0xaf, 0xc8, 0xe1, 0x100 +}; + +static const u16 gUnknown_083ECE1C[][2] = { + {10, 5}, + {10, 10}, + {10, 15}, + {10, 25}, + {10, 35} +}; + +static const u16 gUnknown_083ECE30[] = { + 0, 5, 10, 15, 20 +}; + + +static const u8 gUnknown_083ECE3A[] = { + 6, 4, 3, 2, 5, 0, 0, 0 +}; + +static const u16 gUnknown_083ECE42[] = { + 0x80, 0x20, 0x40 +}; + +static const u16 gUnknown_083ECE48[] = { + 0x10, 0x08, 0x04, 0x02, 0x01 +}; + +static const u8 sSym2Match[] = { + SLOT_MACHINE_MATCHED_777_RED, + SLOT_MACHINE_MATCHED_777_BLUE, + SLOT_MACHINE_MATCHED_AZURILL, + SLOT_MACHINE_MATCHED_LOTAD, + SLOT_MACHINE_MATCHED_1CHERRY, + SLOT_MACHINE_MATCHED_POWER, + SLOT_MACHINE_MATCHED_REPLAY +}; + +static const u16 sSlotMatchFlags[] = { + 1 << SLOT_MACHINE_MATCHED_1CHERRY, + 1 << SLOT_MACHINE_MATCHED_2CHERRY, + 1 << SLOT_MACHINE_MATCHED_REPLAY, + 1 << SLOT_MACHINE_MATCHED_LOTAD, + 1 << SLOT_MACHINE_MATCHED_AZURILL, + 1 << SLOT_MACHINE_MATCHED_POWER, + 1 << SLOT_MACHINE_MATCHED_777_MIXED, + 1 << SLOT_MACHINE_MATCHED_777_RED, + 1 << SLOT_MACHINE_MATCHED_777_BLUE +}; + +static const u16 sSlotPayouts[] = { + 2, 4, 0, 6, 12, 3, 90, 300, 300 +}; + +static const s16 gUnknown_083ECE7E[][2] = { + { 0xd0, 0x38}, + { 0xb8, 0x00}, + { 0xc8, 0x08}, + { 0xd8, 0x10}, + { 0xe8, 0x18}, + { 0xd0, 0x48}, + { 0xd0, 0x08}, + { 0xd0, 0x40}, + { 0xd0, 0x38}, + { 0xc0, 0x58}, + { 0xe0, 0x58}, + { 0xc0, 0x78}, + { 0xe0, 0x78}, + { 0x90, 0x38}, + {0x110, 0x58}, + { 0xa8, 0x70}, + { 0xd0, 0x54}, + { 0xd0, 0x70}, + { 0xbc, 0x34}, + { 0xd0, 0x34}, + { 0xe4, 0x34}, + { 0xb8, 0x48}, + { 0xc4, 0x48}, + { 0xd0, 0x48}, + { 0xdc, 0x48}, + { 0xe8, 0x48}, + { 0xbc, 0x34}, + { 0xd0, 0x34}, + { 0xe4, 0x34}, + { 0xb8, 0x48}, + { 0xc4, 0x48}, + { 0xd0, 0x48}, + { 0xdc, 0x48}, + { 0xe8, 0x48}, + { 0x00, 0x00} +}; + +static const SpriteCallback gUnknown_083ECF0C[] = { + sub_8105C64, + sub_8105F54, + sub_8105F54, + sub_8105F54, + sub_8105F54, + sub_8105F9C, + sub_8105EB4, + sub_8105C64, + sub_8105C64, + sub_8105C6C, + sub_8105CF0, + sub_8105D08, + sub_8105D20, + sub_8105D3C, + sub_8105DA4, + sub_8105E08, + sub_8105C64, + sub_8106058, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_8106230 +}; + +static const struct UnkStruct1 Unknown_83ECF98[] = { + {25, 34, 0}, + {2, 0, 0}, + {9, 16, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFA8[] = { + {10, 1, 0}, + {11, 2, 0}, + {12, 3, 0}, + {13, 4, 0}, + {5, 5, 0}, + {8, 6, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFC4[] = { + {3, 7, 0}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFD0[] = { + {4, 8, 0}, + {6, 9, 0}, + {6, 10, 1}, + {6, 11, 2}, + {6, 12, 3}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFE8[] = { + {0, 13, 0}, + {1, 14, 0}, + {7, 15, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFF8[] = { + {19, 26, 0}, + {20, 27, 1}, + {21, 28, 2}, + {14, 29, 3}, + {15, 30, 4}, + {16, 31, 5}, + {17, 32, 6}, + {18, 33, 7}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ED020[] = { + {22, 18, 0}, + {23, 19, 1}, + {24, 20, 2}, + {14, 21, 3}, + {15, 22, 4}, + {16, 23, 5}, + {17, 24, 6}, + {18, 25, 7}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 *const gUnknown_083ED048[] = { + Unknown_83ECF98, + Unknown_83ECFA8, + Unknown_83ECFC4, + Unknown_83ECFD0, + Unknown_83ECFE8, + Unknown_83ED020, + Unknown_83ECFF8 +}; + +static void (*const gUnknown_083ED064[])(void) = { + sub_810639C, + sub_8106364, + sub_8106370, + nullsub_70, + nullsub_70, + sub_8106370, + sub_8106370 +}; + + +static const struct OamData gOamData_83ED080 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 0, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED088 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 0, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED090 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 1, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED098 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 2, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0A0 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 2, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0A8 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0B0 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_H_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0B8 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0C0[] = { + {eSlotMachineReelTimeGfxBuffer + 0x0000, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x0800, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x1000, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x1800, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x2000, 0x800} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0E8[] = { + {eSlotMachineReelTimeGfxBuffer + 0x2800, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0F0[] = { + {eSlotMachineReelTimeGfxBuffer + 0x2B00, 0x500} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0F8[] = { + {eSlotMachineReelTimeGfxBuffer + 0x3000, 0x600} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED100[] = { + {gSpriteImage_8E988E8, 0x80}, + {gSpriteImage_8E98968, 0x80}, + {gSpriteImage_8E989E8, 0x80}, + {gSpriteImage_8E98A68, 0x80}, + {gSpriteImage_8E98AE8, 0x80}, + {gSpriteImage_8E98B68, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED130[] = { + {gSpriteImage_8E991E8, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED138[] = { + {gSpriteImage_8E99808, 0x40} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED140[] = { + {gSpriteImage_8E98BE8, 0x100}, + {gSpriteImage_8E98CE8, 0x100} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED150[] = { + {gSpriteImage_8E993E8, 0x400} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED158[] = { + {gSpriteImage_8E98DE8, 0x200}, + {gSpriteImage_8E98FE8, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED168[] = { + {gSpriteImage_8E98848, 0x20} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED170[] = { + {gSpriteImage_8E98868, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED178[] = { + {eSlotMachineGfxBuffer + 0x0000, 0x600} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED180[] = { + {eSlotMachineGfxBuffer + 0x0600, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED188[] = { + {eSlotMachineGfxBuffer + 0x0800, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED190[] = { + {eSlotMachineGfxBuffer + 0x0A00, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED198[] = { + {eSlotMachineGfxBuffer + 0x0C00, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1A0[] = { + {eSlotMachineGfxBuffer + 0x1000, 0x400} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1A8[] = { + {eSlotMachineGfxBuffer + 0x1400, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1B0[] = { + {eSlotMachineGfxBuffer + 0x1600, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1B8[] = { + {eSlotMachineGfxBuffer + 0x1900, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1C0[] = { + {eSlotMachineGfxBuffer + 0x1C00, 0x200}, + {eSlotMachineGfxBuffer + 0x1E00, 0x200}, + {eSlotMachineGfxBuffer + 0x1E00, 0x200} // is this a typo? +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1D8[] = { + {eSlotMachineGfxBuffer + 0x2000, 0x280} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1E0[] = { + {eSlotMachineGfxBuffer + 0x2280, 0x80}, + {eSlotMachineGfxBuffer + 0x2300, 0x80}, + {eSlotMachineGfxBuffer + 0x2380, 0x80}, + {eSlotMachineGfxBuffer + 0x2400, 0x80}, + {eSlotMachineGfxBuffer + 0x2480, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED208[] = { + {eSlotMachineGfxBuffer + 0x2600, 0x480}, + {eSlotMachineGfxBuffer + 0x2A80, 0x480} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED218[] = { + {eSlotMachineGfxBuffer + 0x2F00, 0x180}, + {eSlotMachineGfxBuffer + 0x3080, 0x180} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED228[] = { + {gSpriteImage_8E98828, 0x20} +}; + +static const union AnimCmd gSpriteAnim_83ED230[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED238[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED240[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED248[] = { + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED254[] = { + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED260[] = { + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED26C[] = { + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(3, 32), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED278[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED280[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED288[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED290[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED298[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2A0[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2A8[] = { + ANIMCMD_FRAME(5, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2B0[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2BC[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2C8[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2D4[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2DC[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2E8[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2FC[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED304[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED30C[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED314[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED31C[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED324[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED32C[] = { + gSpriteAnim_83ED230 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED330[] = { + gSpriteAnim_83ED238 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED334[] = { + gSpriteAnim_83ED240, + gSpriteAnim_83ED248, + gSpriteAnim_83ED254, + gSpriteAnim_83ED260, + gSpriteAnim_83ED26C, + gSpriteAnim_83ED278 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED34C[] = { + gSpriteAnim_83ED280, + gSpriteAnim_83ED288, + gSpriteAnim_83ED290, + gSpriteAnim_83ED298, + gSpriteAnim_83ED2A0, + gSpriteAnim_83ED2A8 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED364[] = { + gSpriteAnim_83ED2B0 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED368[] = { + gSpriteAnim_83ED2BC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED36C[] = { + gSpriteAnim_83ED2C8, + gSpriteAnim_83ED2D4 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED374[] = { + gSpriteAnim_83ED2DC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED378[] = { + gSpriteAnim_83ED2E8, + gSpriteAnim_83ED2FC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED380[] = { + gSpriteAnim_83ED304, + gSpriteAnim_83ED30C, + gSpriteAnim_83ED314, + gSpriteAnim_83ED31C, + gSpriteAnim_83ED324 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83ED394[] = { + AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), + AFFINEANIMCMD_LOOP(0), + AFFINEANIMCMD_FRAME(0x1, 0x1, 0, 1), + AFFINEANIMCMD_LOOP(255), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED3BC[] = { + gSpriteAffineAnim_83ED394 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83ED3C0[] = { + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 6, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED410[] = { + gSpriteAffineAnim_83ED3C0 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED414 = { + 0, 0, &gOamData_83ED0A0, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_8104F18 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED42C = { + 7, 4, &gOamData_83ED088, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_810506C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED444 = { + 17, 0, &gOamData_83ED0B8, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED45C = { + 0xFFFF, 1, &gOamData_83ED0B8, gSpriteAnimTable_83ED334, gSpriteImageTable_83ED0C0, gDummySpriteAffineAnimTable, sub_8105170 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED474 = { + 0xFFFF, 2, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0E8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED48C = { + 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4A4 = { + 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4BC = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED34C, gSpriteImageTable_83ED100, gDummySpriteAffineAnimTable, sub_810535C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4D4 = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED130, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4EC = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED138, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED504 = { + 0xFFFF, 4, &gOamData_83ED098, gSpriteAnimTable_83ED364, gSpriteImageTable_83ED140, gDummySpriteAffineAnimTable, sub_810562C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED51C = { + 0xFFFF, 7, &gOamData_83ED0A8, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED150, gDummySpriteAffineAnimTable, sub_8105784 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED534 = { + 0xFFFF, 5, &gOamData_83ED0A0, gSpriteAnimTable_83ED368, gSpriteImageTable_83ED158, gDummySpriteAffineAnimTable, sub_8105894 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED54C = { + 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED330, gSpriteImageTable_83ED168, gDummySpriteAffineAnimTable, sub_810594C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED564 = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED170, gSpriteAffineAnimTable_83ED3BC, sub_8105A38 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED57C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED178, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED594 = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED180, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5AC = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED188, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5C4 = { + 18, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED190, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5DC = { + 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED198, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5F4 = { + 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED60C = { + 19, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED624 = { + 20, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED63C = { + 21, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED654 = { + 0xFFFF, 6, &gOamData_83ED0A0, gSpriteAnimTable_83ED36C, gSpriteImageTable_83ED1C0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED66C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1D8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED684 = { + 0xFFFF, 6, &gOamData_83ED090, gSpriteAnimTable_83ED380, gSpriteImageTable_83ED1E0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED69C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED378, gSpriteImageTable_83ED208, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED6B4 = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED374, gSpriteImageTable_83ED218, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED6CC = { + 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED228, gSpriteAffineAnimTable_83ED410, sub_8105B70 +}; + +static const struct Subsprite gSubspriteTable_83ED6E4[] = { + {-64, -64, ST_OAM_SQUARE, 3, 0x0, 3}, + {0, -64, ST_OAM_SQUARE, 3, 0x0, 3}, + {-64, 0, ST_OAM_SQUARE, 3, 0x0, 3}, + {0, 0, ST_OAM_SQUARE, 3, 0x0, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED704[] = { + {4, gSubspriteTable_83ED6E4} +}; + +static const struct Subsprite gSubspriteTable_83ED70C[] = { + {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 1}, + {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 1}, + {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 1}, + {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 1}, + {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 1}, + {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED73C[] = { + {6, gSubspriteTable_83ED70C} +}; + +static const struct Subsprite gSubspriteTable_83ED744[] = { + {-32, -20, ST_OAM_H_RECTANGLE, 3, 0x0, 1}, + {-32, 12, ST_OAM_H_RECTANGLE, 1, 0x20, 1}, + {0, 12, ST_OAM_H_RECTANGLE, 1, 0x24, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED75C[] = { + {3, gSubspriteTable_83ED744} +}; + +static const struct Subsprite gSubspriteTable_83ED764[] = { + {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 1}, + {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 1}, + {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 1}, + {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 1}, + {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED78C[] = { + {5, gSubspriteTable_83ED764} +}; + +static const struct Subsprite gSubspriteTable_83ED794[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 1}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 1}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 1}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED7B4[] = { + {4, gSubspriteTable_83ED794} +}; + +static const struct Subsprite gSubspriteTable_83ED7BC[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 1}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0x0, 1}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x0, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED7D4[] = { + {3, gSubspriteTable_83ED7BC} +}; + +static const struct Subsprite gSubspriteTable_83ED7DC[] = { + {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 3}, + {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 3}, + {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 3}, + {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 3}, + {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED804[] = { + {5, gSubspriteTable_83ED7DC} +}; + +static const struct Subsprite gSubspriteTable_83ED80C[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED82C[] = { + {4, gSubspriteTable_83ED80C} +}; + +static const struct Subsprite gSubspriteTable_83ED834[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED854[] = { + {4, gSubspriteTable_83ED834} +}; + +static const struct Subsprite gSubspriteTable_83ED85C[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED87C[] = { + {4, gSubspriteTable_83ED85C} +}; + +static const struct Subsprite gSubspriteTable_83ED884[] = { + {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 3}, + {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 3}, + {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED8B4[] = { + {6, gSubspriteTable_83ED884} +}; + +static const struct Subsprite gSubspriteTable_83ED8BC[] = { + {-16, -16, ST_OAM_SQUARE, 2, 0x0, 3} +}; + +static const struct Subsprite gSubspriteTable_83ED8C4[] = { + {-8, -8, ST_OAM_SQUARE, 1, 0x10, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED8CC[] = { + {1, gSubspriteTable_83ED8BC}, + {1, gSubspriteTable_83ED8C4} +}; + +static const struct Subsprite gSubspriteTable_83ED8DC[] = { + {-24, -24, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {8, -24, ST_OAM_H_RECTANGLE, 0, 0x4, 3}, + {-24, -16, ST_OAM_H_RECTANGLE, 1, 0x6, 3}, + {8, -16, ST_OAM_H_RECTANGLE, 0, 0xa, 3}, + {-24, -8, ST_OAM_H_RECTANGLE, 1, 0xc, 3}, + {8, -8, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {-24, 0, ST_OAM_H_RECTANGLE, 1, 0x12, 3}, + {8, 0, ST_OAM_H_RECTANGLE, 0, 0x16, 3}, + {-24, 8, ST_OAM_H_RECTANGLE, 1, 0x18, 3}, + {8, 8, ST_OAM_H_RECTANGLE, 0, 0x1c, 3}, + {-24, 16, ST_OAM_H_RECTANGLE, 1, 0x1e, 3}, + {8, 16, ST_OAM_H_RECTANGLE, 0, 0x22, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED93C[] = { + 12, gSubspriteTable_83ED8DC +}; + +static const struct Subsprite gSubspriteTable_83ED944[] = { + {-16, -12, ST_OAM_H_RECTANGLE, 2, 0x0, 3}, + {-16, 4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {0, 4, ST_OAM_H_RECTANGLE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED95C[] = { + {3, gSubspriteTable_83ED944} +}; + +static const struct Subsprite gSubspriteTable_83ED964[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED974[] = { + {2, gSubspriteTable_83ED964} +}; + +static const struct Subsprite gSubspriteTable_83ED97C[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x2, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED98C[] = { + {2, gSubspriteTable_83ED97C} +}; + +static const struct Subsprite gSubspriteTable_83ED994[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x4, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9A4[] = { + {2, gSubspriteTable_83ED994} +}; + +static const struct Subsprite gSubspriteTable_83ED9AC[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9BC[] = { + {2, gSubspriteTable_83ED9AC} +}; + +static const struct Subsprite gSubspriteTable_83ED9C4[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9D4[] = { + {2, gSubspriteTable_83ED9C4} +}; + +static const struct Subsprite gSubspriteTable_83ED9DC[] = { + {-4, -8, ST_OAM_SQUARE, 0, 0x2, 3}, + {-4, 0, ST_OAM_SQUARE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9EC[] = { + {2, gSubspriteTable_83ED9DC} +}; + +static const struct Subsprite gSubspriteTable_83ED9F4[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xb, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA04[] = { + {2, gSubspriteTable_83ED9F4} +}; + +static const struct Subsprite gSubspriteTable_83EDA0C[] = { + {-4, -8, ST_OAM_SQUARE, 0, 0x5, 3}, + {-4, 0, ST_OAM_SQUARE, 0, 0xd, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA1C[] = { + {2, gSubspriteTable_83EDA0C} +}; + +static const struct Subsprite gSubspriteTable_83EDA24[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA34[] = { + {2, gSubspriteTable_83EDA24} +}; + +static const struct Subsprite gSubspriteTable_83EDA3C[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x2, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xa, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x12, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA6C[] = { + {6, gSubspriteTable_83EDA3C} +}; + +static const struct Subsprite gSubspriteTable_83EDA74[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA8C[] = { + {3, gSubspriteTable_83EDA74} +}; + +static const struct Subsprite gSubspriteTable_83EDA94[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x7, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xf, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x17, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDAC4[] = { + {6, gSubspriteTable_83EDA94} +}; + +static const struct Subsprite gSubspriteTable_83EDACC[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x2, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xa, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x12, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDAFC[] = { + {6, gSubspriteTable_83EDACC} +}; + +static const struct Subsprite gSubspriteTable_83EDB04[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDB1C[] = { + {3, gSubspriteTable_83EDB04} +}; + +static const struct Subsprite gSubspriteTable_83EDB24[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x7, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xf, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x17, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDB54[] = { + {6, gSubspriteTable_83EDB24} +}; + +static const struct SpriteTemplate *const gUnknown_083EDB5C[] = { + &gSpriteTemplate_83ED57C, + &gSpriteTemplate_83ED594, + &gSpriteTemplate_83ED5AC, + &gSpriteTemplate_83ED5DC, + &gSpriteTemplate_83ED5F4, + &gSpriteTemplate_83ED654, + &gSpriteTemplate_83ED66C, + &gSpriteTemplate_83ED684, + &gSpriteTemplate_83ED69C, + &gSpriteTemplate_83ED6B4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED63C, + &gSpriteTemplate_83ED63C, + &gSpriteTemplate_83ED63C, + &gDummySpriteTemplate +}; + +static const struct SubspriteTable *const gUnknown_083EDBC4[] = { + gSubspriteTables_83ED804, + gSubspriteTables_83ED82C, + gSubspriteTables_83ED854, + gSubspriteTables_83ED8B4, + NULL, + NULL, + gSubspriteTables_83ED8CC, + NULL, + gSubspriteTables_83ED93C, + gSubspriteTables_83ED95C, + gSubspriteTables_83ED974, + gSubspriteTables_83ED98C, + gSubspriteTables_83ED9A4, + gSubspriteTables_83ED9BC, + gSubspriteTables_83ED9D4, + gSubspriteTables_83ED9EC, + gSubspriteTables_83EDA04, + gSubspriteTables_83EDA1C, + gSubspriteTables_83EDA34, + gSubspriteTables_83EDA6C, + gSubspriteTables_83EDA8C, + gSubspriteTables_83EDAC4, + gSubspriteTables_83EDAFC, + gSubspriteTables_83EDB1C, + gSubspriteTables_83EDB54, + NULL +}; + +static const struct SpriteSheet sSlotMachineSpriteSheets[] = { + {gSlotMachineReelSymbol1Tiles, 0x200, 0}, + {gSlotMachineReelSymbol2Tiles, 0x200, 1}, + {gSlotMachineReelSymbol3Tiles, 0x200, 2}, + {gSlotMachineReelSymbol4Tiles, 0x200, 3}, + {gSlotMachineReelSymbol5Tiles, 0x200, 4}, + {gSlotMachineReelSymbol6Tiles, 0x200, 5}, + {gSlotMachineReelSymbol7Tiles, 0x200, 6}, + {gSlotMachineNumber0Tiles, 0x40, 7}, + {gSlotMachineNumber1Tiles, 0x40, 8}, + {gSlotMachineNumber2Tiles, 0x40, 9}, + {gSlotMachineNumber3Tiles, 0x40, 10}, + {gSlotMachineNumber4Tiles, 0x40, 11}, + {gSlotMachineNumber5Tiles, 0x40, 12}, + {gSlotMachineNumber6Tiles, 0x40, 13}, + {gSlotMachineNumber7Tiles, 0x40, 14}, + {gSlotMachineNumber8Tiles, 0x40, 15}, + {gSlotMachineNumber9Tiles, 0x40, 16}, + {eSlotMachineGfxBuffer + 0x0A00, 0x200, 18}, + {eSlotMachineGfxBuffer + 0x1400, 0x200, 19}, + {eSlotMachineGfxBuffer + 0x1600, 0x300, 20}, + {eSlotMachineGfxBuffer + 0x1900, 0x300, 21}, + {} +}; + +static const struct SpriteSheet gUnknown_083EDCDC = { + eSlotMachineGfxBuffer + 0x0000, 0x800, 17 +}; + +static const u8 *const gUnknown_083EDCE4 = gUnknownPalette_08E997E8; + +#ifdef SAPPHIRE +static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/sapphire_83EDD40.gbapal"); +#elif defined(RUBY) +static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/ruby_83EDCE8.gbapal"); +#endif // RS + +static const u16 *const gUnknown_083EDD08[] = { + UnknownPalette_83EDCE8 + 10, + UnknownPalette_83EDCE8 + 11, + UnknownPalette_83EDCE8 + 12, + UnknownPalette_83EDCE8 + 13, + UnknownPalette_83EDCE8 + 14 +}; + +static const u16 *const gUnknown_083EDD1C[] = { + gUnknown_08E95A18 + 74, + gUnknown_08E95A18 + 75, + gUnknown_08E95A18 + 76, + gUnknown_08E95A18 + 77, + gUnknown_08E95A18 + 78 +}; + +static const u8 gUnknown_083EDD30[] = { + 0x4a, 0x4b, 0x4c, 0x4e, 0x4d +}; + +static const u8 gUnknown_083EDD35[][2] = { + {0, 0}, + {1, 2}, + {3, 4} +}; +static const u8 gUnknown_083EDD3B[] = {1, 2, 2}; + +#ifdef SAPPHIRE +static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/sapphire_83EDD96.gbapal"); +static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDB6.gbapal"); +static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDD6.gbapal"); +#elif defined (RUBY) +static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/ruby_83EDD3E.gbapal"); +static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/ruby_83EDD5E.gbapal"); +static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/ruby_83EDD7E.gbapal"); +#endif // RS + +static const u16 *const gUnknown_083EDDA0[] = { + Unknown_83EDD3E, + Unknown_83EDD5E, + Unknown_83EDD7E +}; + +static const u16 *const gUnknown_083EDDAC = gUnknown_08E95A18 + 16; + +static const u16 Palette_83EDDB0[] = INCBIN_U16("graphics/slot_machine/83EDDB0.gbapal"); +static const u16 Palette_83EDDD0[] = INCBIN_U16("graphics/slot_machine/83EDDD0.gbapal"); +static const u16 Palette_83EDDF0[] = INCBIN_U16("graphics/slot_machine/83EDDF0.gbapal"); + +static const u16 *const gUnknown_083EDE10[] = { + Palette_83EDDB0, + Palette_83EDDD0, + Palette_83EDDF0, + gSlotMachineSpritePalette6 +}; + +static const u16 *const gUnknown_083EDE20 = gSlotMachineSpritePalette6; + +static const u16 gPalette_83EDE24[] = INCBIN_U16("graphics/slot_machine/83EDE24_pal.bin"); + +static const struct SpritePalette gSlotMachineSpritePalettes[] = { + {gSlotMachineSpritePalette0, 0}, + {gSlotMachineSpritePalette1, 1}, + {gSlotMachineSpritePalette2, 2}, + {gSlotMachineSpritePalette3, 3}, + {gSlotMachineSpritePalette4, 4}, + {gSlotMachineSpritePalette5, 5}, + {gSlotMachineSpritePalette6, 6}, + {gSlotMachineSpritePalette4, 7}, + {} +}; + +static const u8 sReelTimeGfx[] = INCBIN_U8("graphics/slot_machine/reel_time.4bpp.lz"); + +static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin"); + +#if DEBUG + +static void debug_sub_811B1C4(void) +{ + unk_debug_bss_1_3 |= 2; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 2) ? 0 : 2; +} + +static void debug_sub_811B1EC(void) +{ + unk_debug_bss_1_3 |= 1; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 1) ? 0 : 1; +} + +static void debug_sub_811B210(void) +{ + unk_debug_bss_1_3 |= 4; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 4) ? 0 : 4; +} + +static void debug_sub_811B238(void) +{ + unk_debug_bss_1_3 |= 8; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 8) ? 0 : 8; +} + +static void debug_sub_811B260(void) +{ + unk_debug_bss_1_3 |= 0x10; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x10) ? 0 : 0x10; +} + +static void debug_sub_811B288(void) +{ + unk_debug_bss_1_3 |= 0x40; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x40) ? 0 : 0x40; +} + +static void debug_sub_811B2B0(void) +{ + unk_debug_bss_1_3 |= 0x80; + unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x80) ? 0 : 0x80; +} + +static void debug_sub_811B2D8(void) +{ + unk_debug_bss_1_3 |= 0x20; +} + +static void debug_sub_811B2E8(void) +{ + u8 text[2]; + + ConvertIntToDecimalStringN(text, eSlotMachine->unk01 + 1, 2, 1); + Menu_PrintText(text, 6, 1); +} + +static const u8 Str_841B1C4[] = _("SETTEI"); +static const u8 Str_841B1CB[] = _("MAWASITA"); +static const u8 Str_841B1D4[] = _("MODOSI"); +static const u8 Str_841B1DB[] = _("NOMARE"); +static const u8 Str_841B1E2[] = _("MAE 7"); +static const u8 Str_841B1E8[] = _("LR  HENKOU"); +static const u8 Str_841B1F3[] = _("START  JIDOUSU"); +static const u8 Str_841B202[] = _("SELECT  SETTEI"); +static const u8 Str_841B211[] = _("TYUHSEN"); +static const u8 Str_841B219[] = _("CHERRY"); +static const u8 Str_841B220[] = _("REPLAY"); +static const u8 Str_841B227[] = _("HASUBO"); +static const u8 Str_841B22E[] = _("RURIRI"); +static const u8 Str_841B235[] = _("INAZU"); +static const u8 Str_841B23B[] = _("REG"); +static const u8 Str_841B23F[] = _("BIG"); +static const u8 Str_841B243[] = _("BD"); +static const u8 Str_841B246[] = _("R7"); +static const u8 Str_841B249[] = _("B7"); +static const u8 Str_841B24C[] = _("A  COIN"); +static const u8 Str_841B254[] = _("TYUHSEN"); +static const u8 Str_841B25C[] = _("UD  100"); +static const u8 Str_841B264[] = _("LR  1000"); +static const u8 Str_841B26D[] = _("×"); + +void debug_sub_811B310(void) +{ + u8 text[5]; + + Menu_PrintText(Str_841B1C4, 1, 1); + Menu_PrintText(Str_841B1CB, 1, 3); + Menu_PrintText(Str_841B1D4, 1, 5); + Menu_PrintText(Str_841B1DB, 1, 7); + Menu_PrintText(Str_841B1E2, 1, 9); + Menu_PrintText(Str_841B1E8, 1, 11); + Menu_PrintText(Str_841B1F3, 1, 13); + Menu_PrintText(Str_841B202, 1, 15); + Menu_PrintText(Str_841B24C, 1, 17); + Menu_PrintText(Str_841B211, 15, 1); + Menu_PrintText(Str_841B219, 15, 3); + Menu_PrintText(Str_841B220, 15, 5); + Menu_PrintText(Str_841B227, 15, 7); + Menu_PrintText(Str_841B22E, 15, 9); + Menu_PrintText(Str_841B235, 15, 11); + Menu_PrintText(Str_841B23B, 15, 13); + Menu_PrintText(Str_841B23F, 15, 15); + Menu_PrintText(Str_841B243, 15, 17); + if (eSlotMachine->unk03 == 0) + Menu_PrintText(Str_841B246, 10, 9); + else + Menu_PrintText(Str_841B249, 10, 9); + +#define PRINT_NUMBER(n, x, y) \ + ConvertIntToDecimalStringN(text, n, 2, 4); \ + Menu_PrintText(text, x, y); + + PRINT_NUMBER(eSlotMachine->unk68, 10, 3); + PRINT_NUMBER(eSlotMachine->unk6C, 10, 5); + PRINT_NUMBER(eSlotMachine->unk10, 10, 7); + PRINT_NUMBER(eSlotMachine->unk70, 20, 3); + PRINT_NUMBER(eSlotMachine->unk74, 20, 5); + PRINT_NUMBER(eSlotMachine->unk78, 20, 7); + PRINT_NUMBER(eSlotMachine->unk7C, 20, 9); + PRINT_NUMBER(eSlotMachine->unk80, 20, 11); + PRINT_NUMBER(eSlotMachine->unk84, 20, 13); + PRINT_NUMBER(eSlotMachine->unk88, 20, 15); + PRINT_NUMBER(eSlotMachine->unk8C, 20, 17); + +#undef PRINT_NUMBER + + if (unk_debug_bss_1_0 != 0) + { + u8 y = 0; + + switch (unk_debug_bss_1_0) + { + case 2: + y = 3; + break; + case 1: + y = 5; + break; + case 4: + y = 7; + break; + case 8: + y = 9; + break; + case 16: + y = 11; + break; + case 64: + y = 13; + break; + case 128: + y = 15; + break; + } + Menu_PrintText(Str_841B26D, 23, y); + } + debug_sub_811B2E8(); +} + +static void debug_sub_811B5B4(s32 *a, s32 b) +{ + *a += b; + if (*a > 9999) + *a = 9999; +} + +static void debug_sub_811B5D0(void) +{ + unk_debug_bss_1_0 = 0; + unk_debug_bss_1_2 = 0; + unk_debug_bss_1_3 = 0; + unk_debug_bss_1_4 = 0; + eSlotMachine->unk68 = 0; + eSlotMachine->unk6C = 0; + eSlotMachine->unk70 = 0; + eSlotMachine->unk74 = 0; + eSlotMachine->unk78 = 0; + eSlotMachine->unk7C = 0; + eSlotMachine->unk80 = 0; + eSlotMachine->unk84 = 0; + eSlotMachine->unk88 = 0; + eSlotMachine->unk8C = 0; + eSlotMachine->unk90 = 0; +} + +static void debug_sub_811B620(void) +{ + CreateTask(debug_sub_811B654, 0); +} + +static u8 debug_sub_811B634(void) +{ + if (FindTaskIdByFunc(debug_sub_811B654) == 0xFF) + return 1; + else + return 0; +} + +static const struct {const u8 *text; void (*func)();} _841B270[] = +{ + {Str_841B219, debug_sub_811B1C4}, + {Str_841B220, debug_sub_811B1EC}, + {Str_841B227, debug_sub_811B210}, + {Str_841B22E, debug_sub_811B238}, + {Str_841B235, debug_sub_811B260}, + {Str_841B23B, debug_sub_811B288}, + {Str_841B23F, debug_sub_811B2B0}, + {Str_841B243, debug_sub_811B2D8}, +}; + +static void debug_sub_811B654(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s8 selection; + + switch (task->data[0]) + { + case 0: + Menu_DrawStdWindowFrame(0, 0, 24, 19); + debug_sub_811B310(); + task->data[0]++; + break; + case 1: + if (gMain.newKeys & B_BUTTON) + { + Menu_EraseScreen(); + DestroyTask(taskId); + break; + } + if (gMain.newKeys & 0x20) + { + eSlotMachine->unk01--; + if ((s8)eSlotMachine->unk01 < 0) // Why? It's unsigned + eSlotMachine->unk01 = 5; + debug_sub_811B2E8(); + break; + } + if (gMain.newKeys & 0x10) + { + eSlotMachine->unk01++; + if (eSlotMachine->unk01 > 5) + eSlotMachine->unk01 = 0; + debug_sub_811B2E8(); + break; + } + if (gMain.newKeys & A_BUTTON) + { + task->data[0] = 3; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 9, 5); + Menu_PrintText(Str_841B25C, 1, 1); + Menu_PrintText(Str_841B264, 1, 3); + break; + } + if (gMain.newKeys & 4) + { + unk_debug_bss_1_2 = 0; + unk_debug_bss_1_3 = 0; + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 10, 19); + Menu_PrintText(Str_841B254, 1, 1); + Menu_PrintItems(2, 3, 8, (void *)_841B270); + InitMenu(0, 1, 3, 8, 0, 9); + task->data[0]++; + } + if (gMain.newKeys & 8) + { + unk_debug_bss_1_4 = 1; + Menu_EraseScreen(); + DestroyTask(taskId); + } + break; + case 2: + selection = Menu_ProcessInput(); + if (selection == -2) + break; + if (selection != -1) + { + unk_debug_bss_1_2 = 1; + _841B270[selection].func(); + } + Menu_EraseScreen(); + DestroyTask(taskId); + break; + case 3: + if (gMain.newAndRepeatedKeys & 0x80) + { + eSlotMachine->coins += 100; + if (eSlotMachine->coins > 9999) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x40) + { + eSlotMachine->coins -= 100; + if (eSlotMachine->coins <= 0) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x20) + { + eSlotMachine->coins -= 1000; + if (eSlotMachine->coins <= 0) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newAndRepeatedKeys & 0x10) + { + eSlotMachine->coins += 1000; + if (eSlotMachine->coins > 9999) + eSlotMachine->coins = 9999; + break; + } + if (gMain.newKeys & B_BUTTON) + { + Menu_EraseScreen(); + DestroyTask(taskId); + } + break; + } +} + +static const u8 Str_841B2B0[] = _("·カウントエラーがおきました"); +static const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました"); +static const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました"); +static const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました"); + +static void debug_sub_811B894(void) +{ + if (eSlotMachine->matchedSymbols & 0x180) + { + eSlotMachine->unk90++; + if (eSlotMachine->unk90 > 9999) + eSlotMachine->unk90 = 9999; + if (eSlotMachine->unk90 != eSlotMachine->unk88) + { + Menu_PrintText(Str_841B2B0, 4, 15); + unk_debug_bss_1_4 = 0; + } + if (!(eSlotMachine->unk04 & 0x80)) + { + Menu_PrintText(Str_841B2D3, 4, 17); + unk_debug_bss_1_4 = 0; + } + } + else if (eSlotMachine->matchedSymbols != 0) + { + if ((eSlotMachine->unk04 & 0x80) && !(eSlotMachine->matchedSymbols & 3)) + { + Menu_PrintText(Str_841B2E4, 4, 2); + unk_debug_bss_1_4 = 0; + } + } + if (eSlotMachine->matchedSymbols == 0 && eSlotMachine->bet == 3 && !(eSlotMachine->unk04 & 0x80)) + { + u8 sym_0_1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + u8 sym_0_2 = GetTagOfReelSymbolOnScreenAtPos(0, 2); + u8 sym_0_3 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + + u8 sym_1_1 = GetTagOfReelSymbolOnScreenAtPos(1, 1); + u8 sym_1_2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + u8 sym_1_3 = GetTagOfReelSymbolOnScreenAtPos(1, 3); + + u8 sym_2_1 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + u8 sym_2_2 = GetTagOfReelSymbolOnScreenAtPos(2, 2); + u8 sym_2_3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + + if ((sym_0_1 == 0 && sym_1_1 == 1 && sym_2_1 == 0) + || (sym_0_2 == 0 && sym_1_2 == 1 && sym_2_2 == 0) + || (sym_0_3 == 0 && sym_1_3 == 1 && sym_2_3 == 0) + || (sym_0_1 == 0 && sym_1_2 == 1 && sym_2_3 == 0) + || (sym_0_3 == 0 && sym_1_2 == 1 && sym_2_1 == 0) + || (sym_0_1 == 1 && sym_1_1 == 0 && sym_2_1 == 1) + || (sym_0_2 == 1 && sym_1_2 == 0 && sym_2_2 == 1) + || (sym_0_3 == 1 && sym_1_3 == 0 && sym_2_3 == 1) + || (sym_0_1 == 1 && sym_1_2 == 0 && sym_2_3 == 1) + || (sym_0_3 == 1 && sym_1_2 == 0 && sym_2_1 == 1)) + { + Menu_PrintText(Str_841B2BF, 4, 0); + unk_debug_bss_1_4 = 0; + } + } +} + +#endif diff --git a/src/sound.c b/src/sound.c new file mode 100644 index 000000000..159ad3f70 --- /dev/null +++ b/src/sound.c @@ -0,0 +1,568 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "sound.h" +#include "battle.h" +#include "m4a.h" +#include "main.h" +#include "pokemon.h" +#include "constants/songs.h" +#include "task.h" + +struct Fanfare +{ + u16 songNum; + u16 duration; +}; + +extern u16 gBattleTypeFlags; + +static EWRAM_DATA struct MusicPlayerInfo *gMPlay_PokemonCry = NULL; +static EWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0; + +static u16 sCurrentMapMusic; +static u16 sNextMapMusic; +static u8 sMapMusicState; +static u8 sMapMusicFadeInSpeed; +static u16 sFanfareCounter; + +bool8 gDisableMusic; + +extern struct MusicPlayerInfo gMPlay_BGM; +extern struct MusicPlayerInfo gMPlay_SE1; +extern struct MusicPlayerInfo gMPlay_SE2; +extern struct MusicPlayerInfo gMPlay_SE3; + +extern struct ToneData voicegroup_8452590[]; +extern struct ToneData voicegroup_8452B90[]; +extern struct ToneData voicegroup_8453190[]; +extern struct ToneData voicegroup_8453790[]; + +extern struct ToneData voicegroup_84537C0[]; +extern struct ToneData voicegroup_8453DC0[]; +extern struct ToneData voicegroup_84543C0[]; +extern struct ToneData voicegroup_84549C0[]; + +static const struct Fanfare sFanfares[] = +{ + { BGM_FANFA1, 80 }, + { BGM_FANFA4, 160 }, + { BGM_FANFA5, 220 }, + { BGM_ME_WAZA, 220 }, + { BGM_ME_ASA, 160 }, + { BGM_ME_BACHI, 340 }, + { BGM_ME_WASURE, 180 }, + { BGM_ME_KINOMI, 120 }, + { BGM_ME_TAMA, 710 }, + { BGM_ME_B_BIG, 250 }, + { BGM_ME_B_SMALL, 150 }, + { BGM_ME_ZANNEN, 160 }, +}; + +static void Task_Fanfare(u8 taskId); +static void CreateFanfareTask(void); +static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode); +static void Task_DuckBGMForPokemonCry(u8 taskId); +static void RestoreBGMVolumeAfterPokemonCry(void); + +void InitMapMusic(void) +{ + gDisableMusic = FALSE; + ResetMapMusic(); +} + +void MapMusicMain(void) +{ + switch (sMapMusicState) + { + case 0: + break; + case 1: + sMapMusicState = 2; + PlayBGM(sCurrentMapMusic); + break; + case 2: + break; + case 5: + if (IsBGMStopped()) + { + sNextMapMusic = 0; + sMapMusicState = 0; + } + break; + case 6: + if (IsBGMStopped() && IsFanfareTaskInactive()) + { + sCurrentMapMusic = sNextMapMusic; + sNextMapMusic = 0; + sMapMusicState = 2; + PlayBGM(sCurrentMapMusic); + } + break; + case 7: + if (IsBGMStopped() && IsFanfareTaskInactive()) + { + FadeInNewBGM(sNextMapMusic, sMapMusicFadeInSpeed); + sCurrentMapMusic = sNextMapMusic; + sNextMapMusic = 0; + sMapMusicState = 2; + sMapMusicFadeInSpeed = 0; + } + break; + } +} + +void ResetMapMusic(void) +{ + sCurrentMapMusic = 0; + sNextMapMusic = 0; + sMapMusicState = 0; + sMapMusicFadeInSpeed = 0; +} + +u16 GetCurrentMapMusic(void) +{ + return sCurrentMapMusic; +} + +void PlayNewMapMusic(u16 songNum) +{ + sCurrentMapMusic = songNum; + sNextMapMusic = 0; + sMapMusicState = 1; +} + +void StopMapMusic(void) +{ + sCurrentMapMusic = 0; + sNextMapMusic = 0; + sMapMusicState = 1; +} + +void FadeOutMapMusic(u8 speed) +{ + if (IsNotWaitingForBGMStop()) + FadeOutBGM(speed); + sCurrentMapMusic = 0; + sNextMapMusic = 0; + sMapMusicState = 5; +} + +void FadeOutAndPlayNewMapMusic(u16 songNum, u8 speed) +{ + FadeOutMapMusic(speed); + sCurrentMapMusic = 0; + sNextMapMusic = songNum; + sMapMusicState = 6; +} + +void FadeOutAndFadeInNewMapMusic(u16 songNum, u8 fadeOutSpeed, u8 fadeInSpeed) +{ + FadeOutMapMusic(fadeOutSpeed); + sCurrentMapMusic = 0; + sNextMapMusic = songNum; + sMapMusicState = 7; + sMapMusicFadeInSpeed = fadeInSpeed; +} + +void FadeInNewMapMusic(u16 songNum, u8 speed) +{ + FadeInNewBGM(songNum, speed); + sCurrentMapMusic = songNum; + sNextMapMusic = 0; + sMapMusicState = 2; + sMapMusicFadeInSpeed = 0; +} + +bool8 IsNotWaitingForBGMStop(void) +{ + if (sMapMusicState == 6) + return FALSE; + if (sMapMusicState == 5) + return FALSE; + if (sMapMusicState == 7) + return FALSE; + return TRUE; +} + +void PlayFanfareByFanfareNum(u8 fanfareNum) +{ + u16 songNum; + m4aMPlayStop(&gMPlay_BGM); + songNum = sFanfares[fanfareNum].songNum; + sFanfareCounter = sFanfares[fanfareNum].duration; + m4aSongNumStart(songNum); +} + +bool8 WaitFanfare(bool8 stop) +{ + if (sFanfareCounter) + { + sFanfareCounter--; + return FALSE; + } + else + { + if (!stop) + m4aMPlayContinue(&gMPlay_BGM); + else + m4aSongNumStart(SE_STOP); + + return TRUE; + } +} + +void StopFanfareByFanfareNum(u8 fanfareNum) +{ + m4aSongNumStop(sFanfares[fanfareNum].songNum); +} + +void PlayFanfare(u16 songNum) +{ + s32 i; + for (i = 0; (u32)i < 12; i++) + { + if (sFanfares[i].songNum == songNum) + { + PlayFanfareByFanfareNum(i); + CreateFanfareTask(); + return; + } + } + + PlayFanfareByFanfareNum(0); + CreateFanfareTask(); +} + +bool8 IsFanfareTaskInactive(void) +{ + if (FuncIsActiveTask(Task_Fanfare) == TRUE) + return FALSE; + return TRUE; +} + +static void Task_Fanfare(u8 taskId) +{ + if (sFanfareCounter) + { + sFanfareCounter--; + } + else + { + m4aMPlayContinue(&gMPlay_BGM); + DestroyTask(taskId); + } +} + +static void CreateFanfareTask(void) +{ + if (FuncIsActiveTask(Task_Fanfare) != TRUE) + CreateTask(Task_Fanfare, 80); +} + +void FadeInNewBGM(u16 songNum, u8 speed) +{ + if (gDisableMusic) + songNum = 0; + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_BGM); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0); + m4aSongNumStop(songNum); + m4aMPlayFadeIn(&gMPlay_BGM, speed); +} + +void FadeOutBGMTemporarily(u8 speed) +{ + m4aMPlayFadeOutTemporarily(&gMPlay_BGM, speed); +} + +bool8 IsBGMPausedOrStopped(void) +{ + if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) + return TRUE; + if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) + return TRUE; + return FALSE; +} + +void FadeInBGM(u8 speed) +{ + m4aMPlayFadeIn(&gMPlay_BGM, speed); +} + +void FadeOutBGM(u8 speed) +{ + m4aMPlayFadeOut(&gMPlay_BGM, speed); +} + +bool8 IsBGMStopped(void) +{ + if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) + return TRUE; + return FALSE; +} + +void PlayCry1(u16 species, s8 pan) +{ + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); + PlayCryInternal(species, pan, 125, 10, 0); + gPokemonCryBGMDuckingCounter = 2; + RestoreBGMVolumeAfterPokemonCry(); +} + +void PlayCry2(u16 species, s8 pan, s8 volume, u8 priority) +{ + PlayCryInternal(species, pan, volume, priority, 0); +} + +void PlayCry3(u16 species, s8 pan, u8 mode) +{ + if (mode == 1) + { + PlayCryInternal(species, pan, 125, 10, 1); + } + else + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); + PlayCryInternal(species, pan, 125, 10, mode); + gPokemonCryBGMDuckingCounter = 2; + RestoreBGMVolumeAfterPokemonCry(); + } +} + +void PlayCry4(u16 species, s8 pan, u8 mode) +{ + if (mode == 1) + { + PlayCryInternal(species, pan, 125, 10, 1); + } + else + { + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); + PlayCryInternal(species, pan, 125, 10, mode); + } +} + +void PlayCry5(u16 species, u8 mode) +{ + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85); + PlayCryInternal(species, 0, 125, 10, mode); + gPokemonCryBGMDuckingCounter = 2; + RestoreBGMVolumeAfterPokemonCry(); +} + +static void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) +{ + bool32 v0; + u32 release; + u32 length; + u32 pitch; + u32 chorus; + u32 index; + u8 table; + + species--; + v0 = FALSE; + release = 0; + length = 140; + pitch = 15360; + chorus = 0; + + switch (mode) + { + case 0: + break; + case 1: + length = 20; + release = 225; + break; + case 2: + length = 30; + release = 225; + pitch = 15600; + chorus = 20; + volume = 80; + break; + case 3: + length = 50; + release = 200; + pitch = 14800; + break; + case 4: + length = 20; + release = 220; + pitch = 15800; + break; + case 5: + release = 200; + pitch = 14500; + break; + } + + SetPokemonCryVolume(volume); + SetPokemonCryPanpot(pan); + SetPokemonCryPitch(pitch); + SetPokemonCryLength(length); + SetPokemonCryProgress(0); + SetPokemonCryRelease(release); + SetPokemonCryChorus(chorus); + SetPokemonCryPriority(priority); + + species = SpeciesToCryId(species); + index = species & 0x7F; + table = species >> 7; + + switch (table) + { + case 0: + gMPlay_PokemonCry = SetPokemonCryTone( + v0 ? &voicegroup_84537C0[index] : &voicegroup_8452590[index]); + break; + case 1: + gMPlay_PokemonCry = SetPokemonCryTone( + v0 ? &voicegroup_8453DC0[index] : &voicegroup_8452B90[index]); + break; + case 2: + gMPlay_PokemonCry = SetPokemonCryTone( + v0 ? &voicegroup_84543C0[index] : &voicegroup_8453190[index]); + break; + case 3: + gMPlay_PokemonCry = SetPokemonCryTone( + v0 ? &voicegroup_84549C0[index] : &voicegroup_8453790[index]); + break; + } +} + +bool8 IsCryFinished(void) +{ + if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) == TRUE) + { + return FALSE; + } + else + { + ClearPokemonCrySongs(); + return TRUE; + } +} + +void StopCryAndClearCrySongs(void) +{ + m4aMPlayStop(gMPlay_PokemonCry); + ClearPokemonCrySongs(); +} + +void StopCry(void) +{ + m4aMPlayStop(gMPlay_PokemonCry); +} + +bool8 IsCryPlayingOrClearCrySongs(void) +{ + if (IsPokemonCryPlaying(gMPlay_PokemonCry)) + { + return TRUE; + } + else + { + ClearPokemonCrySongs(); + return FALSE; + } +} + +bool8 IsCryPlaying(void) +{ + if (IsPokemonCryPlaying(gMPlay_PokemonCry)) + return TRUE; + else + return FALSE; +} + +static void Task_DuckBGMForPokemonCry(u8 taskId) +{ + if (gPokemonCryBGMDuckingCounter) + { + gPokemonCryBGMDuckingCounter--; + return; + } + + if (!IsPokemonCryPlaying(gMPlay_PokemonCry)) + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); + DestroyTask(taskId); + } +} + +static void RestoreBGMVolumeAfterPokemonCry(void) +{ + if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) != TRUE) + CreateTask(Task_DuckBGMForPokemonCry, 80); +} + +void PlayBGM(u16 songNum) +{ + if (gDisableMusic) + songNum = 0; + m4aSongNumStart(songNum); +} + +void PlaySE(u16 songNum) +{ + m4aSongNumStart(songNum); +} + +void PlaySE12WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE1); + m4aMPlayImmInit(&gMPlay_SE2); + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +void PlaySE1WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE1); + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); +} + +void PlaySE2WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE2); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +void SE12PanpotControl(s8 pan) +{ + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +bool8 IsSEPlaying(void) +{ + if ((gMPlay_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlay_SE2.status & MUSICPLAYER_STATUS_PAUSE)) + return FALSE; + if (!(gMPlay_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlay_SE2.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} + +bool8 IsBGMPlaying(void) +{ + if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) + return FALSE; + if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} + +bool8 IsSpecialSEPlaying(void) +{ + if (gMPlay_SE3.status & MUSICPLAYER_STATUS_PAUSE) + return FALSE; + if (!(gMPlay_SE3.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} diff --git a/src/sprite.c b/src/sprite.c new file mode 100644 index 000000000..a9d84e01a --- /dev/null +++ b/src/sprite.c @@ -0,0 +1,1803 @@ +#include "global.h" +#include "debug.h" +#include "sprite.h" +#include "main.h" +#include "menu_cursor.h" +#include "palette.h" +#include "sprite.h" + +#define MAX_SPRITE_COPY_REQUESTS 64 + +#define OAM_MATRIX_COUNT 32 + +#define SET_SPRITE_TILE_RANGE(index, start, count) \ +{ \ + sSpriteTileRanges[index * 2] = start; \ + (sSpriteTileRanges + 1)[index * 2] = count; \ +} + +#define ALLOC_SPRITE_TILE(n) \ +{ \ + gSpriteTileAllocBitmap[(n) / 8] |= (1 << ((n) % 8)); \ +} + +#define FREE_SPRITE_TILE(n) \ +{ \ + gSpriteTileAllocBitmap[(n) / 8] &= ~(1 << ((n) % 8)); \ +} + +#define SPRITE_TILE_IS_ALLOCATED(n) ((gSpriteTileAllocBitmap[(n) / 8] >> ((n) % 8)) & 1) + +struct SpriteCopyRequest +{ + const u8 *src; + u8 *dest; + u16 size; +}; + +struct OamDimensions +{ + s8 width; + s8 height; +}; + +static void UpdateOamCoords(void); +static void BuildSpritePriorities(void); +static void SortSprites(void); +static void CopyMatricesToOamBuffer(void); +static void AddSpritesToOamBuffer(void); +static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); +static void ClearSpriteCopyRequests(void); +static void ResetOamMatrices(void); +static void ResetSprite(struct Sprite *sprite); +static s16 AllocSpriteTiles(u16 tileCount); +static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); +static void ResetAllSprites(void); +static void BeginAnim(struct Sprite *sprite); +static void ContinueAnim(struct Sprite *sprite); +static void AnimCmd_frame(struct Sprite *sprite); +static void AnimCmd_end(struct Sprite *sprite); +static void AnimCmd_jump(struct Sprite *sprite); +static void AnimCmd_loop(struct Sprite *sprite); +static void BeginAnimLoop(struct Sprite *sprite); +static void ContinueAnimLoop(struct Sprite *sprite); +static void JumpToTopOfAnimLoop(struct Sprite *sprite); +static void BeginAffineAnim(struct Sprite *sprite); +static void ContinueAffineAnim(struct Sprite *sprite); +static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite); +static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite); +static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); +static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); +static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite); +static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite); +static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite); +static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite); +static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix); +static u8 GetSpriteMatrixNum(struct Sprite *sprite); +static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip); +static void AffineAnimStateRestartAnim(u8 matrixNum); +static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum); +static void AffineAnimStateReset(u8 matrixNum); +static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); +static void DecrementAnimDelayCounter(struct Sprite *sprite); +static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum); +static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); +static s16 ConvertScaleParam(s16 scale); +static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd); +static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd); +static void ResetAffineAnimData(void); +static u8 IndexOfSpriteTileTag(u16 tag); +static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); +static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); + +typedef void (*AnimFunc)(struct Sprite *); +typedef void (*AnimCmdFunc)(struct Sprite *); +typedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *); + +#define DUMMY_OAM_DATA \ +{ \ + 160, /* Y (off-screen) */ \ + 0, \ + 0, \ + 0, \ + 0, \ + 0, \ + 304, /* X */ \ + 0, \ + 0, \ + 0, \ + 3, /* lowest priority */ \ + 0, \ + 0 \ +} + +#define ANIM_END 0xFFFF +#define AFFINE_ANIM_END 0x7FFF + +// forward declarations +const union AnimCmd * const gDummySpriteAnimTable[]; +const union AffineAnimCmd * const gDummySpriteAffineAnimTable[]; +const struct SpriteTemplate gDummySpriteTemplate; + +// Unreferenced error message. +// It means "The DMA transfer request table has exceeded its limit." +static const u8 sDmaOverErrorMsg[] = + _( + "DMA OVER\n" + "DMAてんそう\n" + "リクエストテーブルが\n" + "オーバーしました" + ); + +// Unreferenced data. +static const u8 sUnknownData[24] = +{ + 0x01, 0x04, 0x10, 0x40, + 0x02, 0x04, 0x08, 0x20, + 0x02, 0x04, 0x08, 0x20, + 0x01, 0x04, 0x10, 0x40, + 0x02, 0x04, 0x08, 0x20, + 0x02, 0x04, 0x08, 0x20, +}; + +static const u8 sCenterToCornerVecTable[3][4][2] = +{ + { // square + { -4, -4 }, + { -8, -8 }, + { -16, -16 }, + { -32, -32 }, + }, + { // horizontal rectangle + { -8, -4 }, + { -16, -4 }, + { -16, -8 }, + { -32, -16 }, + }, + { // vertical rectangle + { -4, -8 }, + { -4, -16 }, + { -8, -16 }, + { -16, -32 }, + }, +}; + +static const struct Sprite sDummySprite = +{ + .oam = DUMMY_OAM_DATA, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .template = &gDummySpriteTemplate, + .subspriteTables = NULL, + .callback = SpriteCallbackDummy, + .pos1 = { 304, 160 }, + .pos2 = { 0, 0 }, + .centerToCornerVecX = 0, + .centerToCornerVecY = 0, + .animNum = 0, + .animCmdIndex = 0, + .animDelayCounter = 0, + .animPaused = 0, + .affineAnimPaused = 0, + .animLoopCounter = 0, + .data = {0}, + .inUse = 0, + .coordOffsetEnabled = 0, + .invisible = 0, + .flags_3 = 0, + .flags_4 = 0, + .flags_5 = 0, + .flags_6 = 0, + .flags_7 = 0, + .hFlip = 0, + .vFlip = 0, + .animBeginning = 0, + .affineAnimBeginning = 0, + .animEnded = 0, + .affineAnimEnded = 0, + .usingSheet = 0, + .flags_f = 0, + .sheetTileStart = 0, + .subspriteTableNum = 0, + .subspriteMode = 0, + .subpriority = 0xFF +}; + +const struct OamData gDummyOamData = DUMMY_OAM_DATA; + +static const union AnimCmd sDummyAnim = { ANIM_END }; + +const union AnimCmd * const gDummySpriteAnimTable[] = { &sDummyAnim }; + +static const union AffineAnimCmd sDummyAffineAnim = { AFFINE_ANIM_END }; + +const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffineAnim }; + +const struct SpriteTemplate gDummySpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0xFFFF, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +// TODO: Find out what these are used for. +static const u16 sOamBitmasks[9] = +{ + 0xFF00, 0x00FF, 0x001F, + 0xFE00, 0x01FF, 0x03E0, + 0xFC00, 0x03FF, 0xFC00, +}; + +static const AnimFunc sAnimFuncs[] = +{ + ContinueAnim, + BeginAnim, +}; + +static const AnimFunc sAffineAnimFuncs[] = +{ + ContinueAffineAnim, + BeginAffineAnim, +}; + +static const AnimCmdFunc sAnimCmdFuncs[] = +{ + AnimCmd_loop, + AnimCmd_jump, + AnimCmd_end, + AnimCmd_frame, +}; + +static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] = +{ + AffineAnimCmd_loop, + AffineAnimCmd_jump, + AffineAnimCmd_end, + AffineAnimCmd_frame, +}; + +static const struct OamDimensions sOamDimensions[3][4] = +{ + { // square + { 8, 8 }, + { 16, 16 }, + { 32, 32 }, + { 64, 64 }, + }, + { // horizontal rectangle + { 16, 8 }, + { 32, 8 }, + { 32, 16 }, + { 64, 32 }, + }, + { // vertical rectangle + { 8, 16 }, + { 8, 32 }, + { 16, 32 }, + { 32, 64 }, + }, +}; + +static u16 sSpriteTileRangeTags[MAX_SPRITES]; +static u16 sSpriteTileRanges[MAX_SPRITES * 2]; +static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT]; +static u16 sSpritePaletteTags[16]; + +u8 gSpriteOrder[MAX_SPRITES]; +bool8 gShouldProcessSpriteCopyRequests; +u8 gSpriteCopyRequestCount; +struct SpriteCopyRequest gSpriteCopyRequests[MAX_SPRITE_COPY_REQUESTS]; +u8 gOamLimit; +u16 gReservedSpriteTileCount; +u8 gSpriteTileAllocBitmap[128]; +s16 gSpriteCoordOffsetX; +s16 gSpriteCoordOffsetY; +u32 gOamMatrixAllocBitmap; +struct OamMatrix gOamMatrices[OAM_MATRIX_COUNT]; +u8 gReservedSpritePaletteCount; + +EWRAM_DATA struct Sprite gSprites[MAX_SPRITES + 1] = {0}; +EWRAM_DATA u16 gSpritePriorities[MAX_SPRITES] = {0}; +EWRAM_DATA u8 gAffineAnimsDisabled = {0}; + +void ResetSpriteData(void) +{ + ResetOamRange(0, 128); + ResetAllSprites(); + ClearSpriteCopyRequests(); + ResetAffineAnimData(); + FreeSpriteTileRanges(); + gOamLimit = 64; + gReservedSpriteTileCount = 0; + AllocSpriteTiles(0); + gSpriteCoordOffsetX = 0; + gSpriteCoordOffsetY = 0; +} + +void AnimateSprites(void) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + + if (sprite->inUse) + { + sprite->callback(sprite); + + if (sprite->inUse) + AnimateSprite(sprite); + } + } +} + +void BuildOamBuffer(void) +{ + u8 temp; + UpdateOamCoords(); + BuildSpritePriorities(); + SortSprites(); + temp = gMain.oamLoadDisabled; + gMain.oamLoadDisabled = TRUE; + AddSpritesToOamBuffer(); + CopyMatricesToOamBuffer(); + gMain.oamLoadDisabled = temp; + gShouldProcessSpriteCopyRequests = TRUE; +} + +static void UpdateOamCoords(void) +{ + u8 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if (sprite->inUse && !sprite->invisible) + { + if (sprite->coordOffsetEnabled) + { + sprite->oam.x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + sprite->oam.y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + sprite->oam.x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + sprite->oam.y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + } + } +} + +static void BuildSpritePriorities(void) +{ + u16 i; + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + u16 priority = sprite->subpriority | (sprite->oam.priority << 8); + gSpritePriorities[i] = priority; + } +} + +static void SortSprites(void) +{ + u8 i; + for (i = 1; i < MAX_SPRITES; i++) + { + u8 j = i; + struct Sprite *sprite1 = &gSprites[gSpriteOrder[i - 1]]; + struct Sprite *sprite2 = &gSprites[gSpriteOrder[i]]; + u16 sprite1Priority = gSpritePriorities[gSpriteOrder[i - 1]]; + u16 sprite2Priority = gSpritePriorities[gSpriteOrder[i]]; + s16 sprite1Y = sprite1->oam.y; + s16 sprite2Y = sprite2->oam.y; + + if (sprite1Y >= DISPLAY_HEIGHT) + sprite1Y = sprite1Y - 256; + + if (sprite2Y >= DISPLAY_HEIGHT) + sprite2Y = sprite2Y - 256; + + if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite1->oam.size == 3) + { + u32 shape = sprite1->oam.shape; + if (shape == ST_OAM_SQUARE || shape == 2) + { + if (sprite1Y > 128) + sprite1Y = sprite1Y - 256; + } + } + + if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite2->oam.size == 3) + { + u32 shape = sprite2->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite2Y > 128) + sprite2Y = sprite2Y - 256; + } + } + + while (j > 0 + && ((sprite1Priority > sprite2Priority) + || (sprite1Priority == sprite2Priority && sprite1Y < sprite2Y))) + { + u8 temp = gSpriteOrder[j]; + gSpriteOrder[j] = gSpriteOrder[j - 1]; + gSpriteOrder[j - 1] = temp; + + // UB: If j equals 1, then j-- makes j equal 0. + // Then, gSpriteOrder[-1] gets accessed below. + // Although this doesn't result in a bug in the ROM, + // the behavior is undefined. + j--; + + sprite1 = &gSprites[gSpriteOrder[j - 1]]; + sprite2 = &gSprites[gSpriteOrder[j]]; + sprite1Priority = gSpritePriorities[gSpriteOrder[j - 1]]; + sprite2Priority = gSpritePriorities[gSpriteOrder[j]]; + sprite1Y = sprite1->oam.y; + sprite2Y = sprite2->oam.y; + + if (sprite1Y >= DISPLAY_HEIGHT) + sprite1Y = sprite1Y - 256; + + if (sprite2Y >= DISPLAY_HEIGHT) + sprite2Y = sprite2Y - 256; + + if (sprite1->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite1->oam.size == 3) + { + u32 shape = sprite1->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite1Y > 128) + sprite1Y = sprite1Y - 256; + } + } + + if (sprite2->oam.affineMode == ST_OAM_AFFINE_DOUBLE + && sprite2->oam.size == 3) + { + u32 shape = sprite2->oam.shape; + if (shape == ST_OAM_SQUARE || shape == ST_OAM_V_RECTANGLE) + { + if (sprite2Y > 128) + sprite2Y = sprite2Y - 256; + } + } + } + } +} + +static void CopyMatricesToOamBuffer(void) +{ + u8 i; + for (i = 0; i < OAM_MATRIX_COUNT; i++) + { + u32 base = 4 * i; + gMain.oamBuffer[base + 0].affineParam = gOamMatrices[i].a; + gMain.oamBuffer[base + 1].affineParam = gOamMatrices[i].b; + gMain.oamBuffer[base + 2].affineParam = gOamMatrices[i].c; + gMain.oamBuffer[base + 3].affineParam = gOamMatrices[i].d; + } +} + +static void AddSpritesToOamBuffer(void) +{ + u8 i = 0; + u8 oamIndex = 0; + + while (i < MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[gSpriteOrder[i]]; + if (sprite->inUse && !sprite->invisible && AddSpriteToOamBuffer(sprite, &oamIndex)) + break; + i++; + } + + gMain.objCount = oamIndex; + + while (oamIndex < gOamLimit) + { + gMain.oamBuffer[oamIndex] = gDummyOamData; + oamIndex++; + } +} + +u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + if (!gSprites[i].inUse) + return CreateSpriteAt(i, template, x, y, subpriority); + + return MAX_SPRITES; +} + +u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +{ + s16 i; + + for (i = MAX_SPRITES - 1; i > -1; i--) + if (!gSprites[i].inUse) + return CreateSpriteAt(i, template, x, y, subpriority); + + return MAX_SPRITES; +} + +u8 CreateInvisibleSprite(void (*callback)(struct Sprite *)) +{ + u8 index = CreateSprite(&gDummySpriteTemplate, 0, 0, 31); + + if (index == MAX_SPRITES) + { + return MAX_SPRITES; + } + else + { + gSprites[index].invisible = TRUE; + gSprites[index].callback = callback; + return index; + } +} + +static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +{ + struct Sprite *sprite = &gSprites[index]; + + ResetSprite(sprite); + + sprite->inUse = TRUE; + sprite->animBeginning = TRUE; + sprite->affineAnimBeginning = TRUE; + sprite->usingSheet = TRUE; + + sprite->subpriority = subpriority; + sprite->oam = *template->oam; + sprite->anims = template->anims; + sprite->affineAnims = template->affineAnims; + sprite->template = template; + sprite->callback = template->callback; + sprite->pos1.x = x; + sprite->pos1.y = y; + + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + + if (template->tileTag == 0xFFFF) + { + s16 tileNum; + sprite->images = template->images; + tileNum = AllocSpriteTiles((u8)(sprite->images->size / TILE_SIZE_4BPP)); + if (tileNum == -1) + { + ResetSprite(sprite); + return MAX_SPRITES; + } + sprite->oam.tileNum = tileNum; + sprite->usingSheet = FALSE; + sprite->sheetTileStart = 0; + } + else + { + sprite->sheetTileStart = GetSpriteTileStartByTag(template->tileTag); + SetSpriteSheetFrameTileNum(sprite); + } + + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + InitSpriteAffineAnim(sprite); + + if (template->paletteTag != 0xFFFF) + sprite->oam.paletteNum = IndexOfSpritePaletteTag(template->paletteTag); + + return index; +} + +u8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + + if (!gSprites[i].inUse) + { + u8 index = CreateSpriteAt(i, template, x, y, subpriority); + + if (index == MAX_SPRITES) + return MAX_SPRITES; + + gSprites[i].callback(sprite); + + if (gSprites[i].inUse) + AnimateSprite(sprite); + + return index; + } + } + + return MAX_SPRITES; +} + +void DestroySprite(struct Sprite *sprite) +{ + if (sprite->inUse) + { + if (!sprite->usingSheet) + { + u16 i; + u16 tileEnd = (sprite->images->size / TILE_SIZE_4BPP) + sprite->oam.tileNum; + for (i = sprite->oam.tileNum; i < tileEnd; i++) + FREE_SPRITE_TILE(i); + } + ResetSprite(sprite); + } +} + +void ResetOamRange(u8 a, u8 b) +{ + u8 i; + + for (i = a; i < b; i++) + { + struct OamData *oamBuffer = gMain.oamBuffer; + oamBuffer[i] = *(struct OamData *)&gDummyOamData; + } +} + +void LoadOam(void) +{ + if (!gMain.oamLoadDisabled) + CpuCopy32(gMain.oamBuffer, (void *)OAM, sizeof(gMain.oamBuffer)); +} + +static void ClearSpriteCopyRequests(void) +{ + u8 i; + + gShouldProcessSpriteCopyRequests = FALSE; + gSpriteCopyRequestCount = 0; + + for (i = 0; i < MAX_SPRITE_COPY_REQUESTS; i++) + { + gSpriteCopyRequests[i].src = 0; + gSpriteCopyRequests[i].dest = 0; + gSpriteCopyRequests[i].size = 0; + } +} + +static void ResetOamMatrices(void) +{ + u8 i; + for (i = 0; i < OAM_MATRIX_COUNT; i++) + { + // set to identity matrix + gOamMatrices[i].a = 0x0100; + gOamMatrices[i].b = 0x0000; + gOamMatrices[i].c = 0x0000; + gOamMatrices[i].d = 0x0100; + } +} + +void SetOamMatrix(u8 matrixNum, u16 a, u16 b, u16 c, u16 d) +{ + gOamMatrices[matrixNum].a = a; + gOamMatrices[matrixNum].b = b; + gOamMatrices[matrixNum].c = c; + gOamMatrices[matrixNum].d = d; +} + +static void ResetSprite(struct Sprite *sprite) +{ + *sprite = sDummySprite; +} + +void CalcCenterToCornerVec(struct Sprite *sprite, u8 shape, u8 size, u8 affineMode) +{ + u8 x = sCenterToCornerVecTable[shape][size][0]; + u8 y = sCenterToCornerVecTable[shape][size][1]; + + if (affineMode & ST_OAM_AFFINE_DOUBLE_MASK) + { + x *= 2; + y *= 2; + } + + sprite->centerToCornerVecX = x; + sprite->centerToCornerVecY = y; +} + +static s16 AllocSpriteTiles(u16 tileCount) +{ + u16 i; + s16 start; + u16 numTilesFound; + + if (tileCount == 0) + { + // Free all unreserved tiles if the tile count is 0. + for (i = gReservedSpriteTileCount; i < TOTAL_OBJ_TILE_COUNT; i++) + FREE_SPRITE_TILE(i); + + return 0; + } + + i = gReservedSpriteTileCount; + + for (;;) + { + while (SPRITE_TILE_IS_ALLOCATED(i)) + { + i++; + + if (i == TOTAL_OBJ_TILE_COUNT) + return -1; + } + + start = i; + numTilesFound = 1; + + while (numTilesFound != tileCount) + { + i++; + + if (i == TOTAL_OBJ_TILE_COUNT) + return -1; + + if (!SPRITE_TILE_IS_ALLOCATED(i)) + numTilesFound++; + else + break; + } + + if (numTilesFound == tileCount) + break; + } + + for (i = start; i < tileCount + start; i++) + ALLOC_SPRITE_TILE(i); + + return start; +} + +u8 SpriteTileAllocBitmapOp(u16 bit, u8 op) +{ + u8 index = bit / 8; + u8 shift = bit % 8; + u8 val = bit % 8; + u8 retVal = 0; + + if (op == 0) + { + val = ~(1 << val); + gSpriteTileAllocBitmap[index] &= val; + } + else if (op == 1) + { + val = (1 << val); + gSpriteTileAllocBitmap[index] |= val; + } + else + { + retVal = 1 << shift; + retVal &= gSpriteTileAllocBitmap[index]; + } + + return retVal; +} + +void SpriteCallbackDummy(struct Sprite *sprite) +{ +} + +void ProcessSpriteCopyRequests(void) +{ + if (gShouldProcessSpriteCopyRequests) + { + u8 i = 0; + + while (gSpriteCopyRequestCount > 0) + { + CpuCopy16(gSpriteCopyRequests[i].src, gSpriteCopyRequests[i].dest, gSpriteCopyRequests[i].size); + gSpriteCopyRequestCount--; + i++; + } + + gShouldProcessSpriteCopyRequests = FALSE; + } +} + +static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images) +{ + if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) + { + gSpriteCopyRequests[gSpriteCopyRequestCount].src = images[index].data; + gSpriteCopyRequests[gSpriteCopyRequestCount].dest = OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum; + gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size; + gSpriteCopyRequestCount++; + } +#if DEBUG + else + { + Crash(sDmaOverErrorMsg); + } +#endif +} + +void RequestSpriteCopy(const void *src, u8 *dest, u16 size) +{ + if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) + { + gSpriteCopyRequests[gSpriteCopyRequestCount].src = src; + gSpriteCopyRequests[gSpriteCopyRequestCount].dest = dest; + gSpriteCopyRequests[gSpriteCopyRequestCount].size = size; + gSpriteCopyRequestCount++; + } +#if DEBUG + else + { + Crash(sDmaOverErrorMsg); + } +#endif +} + +// these two functions are unused. +void CopyFromSprites(u8 *dest) +{ + u32 i; + u8 *src = (u8 *)gSprites; + for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) + { + *dest = *src; + dest++; + src++; + } +} + +void CopyToSprites(u8 *src) +{ + u32 i; + u8 *dest = (u8 *)gSprites; + for (i = 0; i < sizeof(struct Sprite) * MAX_SPRITES; i++) + { + *dest = *src; + src++; + dest++; + } +} + +static void ResetAllSprites(void) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + ResetSprite(&gSprites[i]); + gSpriteOrder[i] = i; + } + + ResetSprite(&gSprites[i]); + sub_814A590(); +} + +void FreeSpriteTiles(struct Sprite *sprite) +{ + if (sprite->template->tileTag != 0xFFFF) + FreeSpriteTilesByTag(sprite->template->tileTag); +} + +void FreeSpritePalette(struct Sprite *sprite) +{ + FreeSpritePaletteByTag(sprite->template->paletteTag); +} + +void FreeSpriteOamMatrix(struct Sprite *sprite) +{ + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + { + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = ST_OAM_AFFINE_OFF; + } +} + +void DestroySpriteAndFreeResources(struct Sprite *sprite) +{ + FreeSpriteTiles(sprite); + FreeSpritePalette(sprite); + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); +} + +// Loads the mon name, level, and hp sprites into OAM. +void DrawPartyMenuMonText(u32 a1, u32 a2, const u16 *a3, u16 a4, u32 baseTileNumber) +{ + const u16 *d = a3; + struct OamData *oam = &gMain.oamBuffer[gMain.objCount]; + while (!(gMain.objCount & 0x80) && (s16)(d[0] + 1) != 0) + { + u16 *x = (u16 *)oam; + x[0] = (d[0] & sOamBitmasks[0]) | ((d[0] + a2) & sOamBitmasks[1]) | ((a4 & sOamBitmasks[2]) << 8); + x[1] = (d[1] & sOamBitmasks[3]) | ((d[1] + a1) & sOamBitmasks[4]) | ((a4 & sOamBitmasks[5]) << 4); + x[2] = (d[2] & sOamBitmasks[6]) | ((d[2] + baseTileNumber) & sOamBitmasks[7]) | (a4 & sOamBitmasks[8]); + oam++; + gMain.objCount++; + d += 3; + } +} + +void AnimateSprite(struct Sprite *sprite) +{ + sAnimFuncs[sprite->animBeginning](sprite); + + if (!gAffineAnimsDisabled) + sAffineAnimFuncs[sprite->affineAnimBeginning](sprite); +} + +static void BeginAnim(struct Sprite *sprite) +{ + s16 imageValue; + u8 duration; + u8 hFlip; + u8 vFlip; + + sprite->animCmdIndex = 0; + sprite->animEnded = FALSE; + sprite->animLoopCounter = 0; + imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + + if (imageValue != -1) + { + sprite->animBeginning = FALSE; + duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; + vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; + + if (duration) + duration--; + + sprite->animDelayCounter = duration; + + if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) + SetSpriteOamFlipBits(sprite, hFlip, vFlip); + + if (sprite->usingSheet) + sprite->oam.tileNum = sprite->sheetTileStart + imageValue; + else + RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); + } +} + +static void ContinueAnim(struct Sprite *sprite) +{ + if (sprite->animDelayCounter) + { + u8 hFlip; + u8 vFlip; + DecrementAnimDelayCounter(sprite); + hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; + vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; + if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) + SetSpriteOamFlipBits(sprite, hFlip, vFlip); + } + else if (!sprite->animPaused) + { + s16 type; + s16 funcIndex; + sprite->animCmdIndex++; + type = sprite->anims[sprite->animNum][sprite->animCmdIndex].type; + funcIndex = 3; + if (type < 0) + funcIndex = type + 3; + sAnimCmdFuncs[funcIndex](sprite); + } +} + +static void AnimCmd_frame(struct Sprite *sprite) +{ + s16 imageValue; + u8 duration; + u8 hFlip; + u8 vFlip; + + imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; + vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; + + if (duration) + duration--; + + sprite->animDelayCounter = duration; + + if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) + SetSpriteOamFlipBits(sprite, hFlip, vFlip); + + if (sprite->usingSheet) + sprite->oam.tileNum = sprite->sheetTileStart + imageValue; + else + RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); +} + +static void AnimCmd_end(struct Sprite *sprite) +{ + sprite->animCmdIndex--; + sprite->animEnded = TRUE; +} + +static void AnimCmd_jump(struct Sprite *sprite) +{ + s16 imageValue; + u8 duration; + u8 hFlip; + u8 vFlip; + + sprite->animCmdIndex = sprite->anims[sprite->animNum][sprite->animCmdIndex].jump.target; + + imageValue = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + duration = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + hFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.hFlip; + vFlip = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.vFlip; + + if (duration) + duration--; + + sprite->animDelayCounter = duration; + + if (!(sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)) + SetSpriteOamFlipBits(sprite, hFlip, vFlip); + + if (sprite->usingSheet) + sprite->oam.tileNum = sprite->sheetTileStart + imageValue; + else + RequestSpriteFrameImageCopy(imageValue, sprite->oam.tileNum, sprite->images); +} + +static void AnimCmd_loop(struct Sprite *sprite) +{ + if (sprite->animLoopCounter) + ContinueAnimLoop(sprite); + else + BeginAnimLoop(sprite); +} + +static void BeginAnimLoop(struct Sprite *sprite) +{ + sprite->animLoopCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].loop.count; + JumpToTopOfAnimLoop(sprite); + ContinueAnim(sprite); +} + +static void ContinueAnimLoop(struct Sprite *sprite) +{ + sprite->animLoopCounter--; + JumpToTopOfAnimLoop(sprite); + ContinueAnim(sprite); +} + +static void JumpToTopOfAnimLoop(struct Sprite *sprite) +{ + if (sprite->animLoopCounter) + { + sprite->animCmdIndex--; + + while (sprite->anims[sprite->animNum][sprite->animCmdIndex - 1].type != -3) + { + if (sprite->animCmdIndex == 0) + break; + sprite->animCmdIndex--; + } + + sprite->animCmdIndex--; + } +} + +static void BeginAffineAnim(struct Sprite *sprite) +{ + if ((sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) && sprite->affineAnims[0][0].type != 32767) + { + struct AffineAnimFrameCmd frameCmd; + u8 matrixNum = GetSpriteMatrixNum(sprite); + AffineAnimStateRestartAnim(matrixNum); + GetAffineAnimFrame(matrixNum, sprite, &frameCmd); + sprite->affineAnimBeginning = FALSE; + sprite->affineAnimEnded = FALSE; + ApplyAffineAnimFrame(matrixNum, &frameCmd); + sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; + } +} + +static void ContinueAffineAnim(struct Sprite *sprite) +{ + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + { + u8 matrixNum = GetSpriteMatrixNum(sprite); + + if (sAffineAnimStates[matrixNum].delayCounter) + { + AffineAnimDelay(matrixNum, sprite); + } + else if (!sprite->affineAnimPaused) + { + s16 type; + s16 funcIndex; + sAffineAnimStates[matrixNum].animCmdIndex++; + type = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].type; + funcIndex = 3; + if (type >= 32765) + funcIndex = type - 32765; + sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite); + } + } +} + +static void AffineAnimDelay(u8 matrixNum, struct Sprite *sprite) +{ + if (!DecrementAffineAnimDelayCounter(sprite, matrixNum)) + { + struct AffineAnimFrameCmd frameCmd; + GetAffineAnimFrame(matrixNum, sprite, &frameCmd); + ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &frameCmd); + } +} + +static void AffineAnimCmd_loop(u8 matrixNum, struct Sprite *sprite) +{ + if (sAffineAnimStates[matrixNum].loopCounter) + ContinueAffineAnimLoop(matrixNum, sprite); + else + BeginAffineAnimLoop(matrixNum, sprite); +} + +static void BeginAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) +{ + sAffineAnimStates[matrixNum].loopCounter = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].loop.count; + JumpToTopOfAffineAnimLoop(matrixNum, sprite); + ContinueAffineAnim(sprite); +} + +static void ContinueAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) +{ + sAffineAnimStates[matrixNum].loopCounter--; + JumpToTopOfAffineAnimLoop(matrixNum, sprite); + ContinueAffineAnim(sprite); +} + +static void JumpToTopOfAffineAnimLoop(u8 matrixNum, struct Sprite *sprite) +{ + if (sAffineAnimStates[matrixNum].loopCounter) + { + sAffineAnimStates[matrixNum].animCmdIndex--; + + while (sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex - 1].type != 32765) + { + if (sAffineAnimStates[matrixNum].animCmdIndex == 0) + break; + sAffineAnimStates[matrixNum].animCmdIndex--; + } + + sAffineAnimStates[matrixNum].animCmdIndex--; + } +} + +static void AffineAnimCmd_jump(u8 matrixNum, struct Sprite *sprite) +{ + struct AffineAnimFrameCmd frameCmd; + sAffineAnimStates[matrixNum].animCmdIndex = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].jump.target; + GetAffineAnimFrame(matrixNum, sprite, &frameCmd); + ApplyAffineAnimFrame(matrixNum, &frameCmd); + sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; +} + +static void AffineAnimCmd_end(u8 matrixNum, struct Sprite *sprite) +{ + struct AffineAnimFrameCmd dummyFrameCmd = {0}; + sprite->affineAnimEnded = TRUE; + sAffineAnimStates[matrixNum].animCmdIndex--; + ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); +} + +static void AffineAnimCmd_frame(u8 matrixNum, struct Sprite *sprite) +{ + struct AffineAnimFrameCmd frameCmd; + GetAffineAnimFrame(matrixNum, sprite, &frameCmd); + ApplyAffineAnimFrame(matrixNum, &frameCmd); + sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; +} + +static void CopyOamMatrix(u8 destMatrixIndex, struct OamMatrix *srcMatrix) +{ + gOamMatrices[destMatrixIndex].a = srcMatrix->a; + gOamMatrices[destMatrixIndex].b = srcMatrix->b; + gOamMatrices[destMatrixIndex].c = srcMatrix->c; + gOamMatrices[destMatrixIndex].d = srcMatrix->d; +} + +static u8 GetSpriteMatrixNum(struct Sprite *sprite) +{ + u8 matrixNum = 0; + if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK) + matrixNum = sprite->oam.matrixNum; + return matrixNum; +} + +static void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip) +{ + sprite->oam.matrixNum &= 0x7; + sprite->oam.matrixNum |= (((hFlip ^ sprite->hFlip) & 1) << 3); + sprite->oam.matrixNum |= (((vFlip ^ sprite->vFlip) & 1) << 4); +} + +static void AffineAnimStateRestartAnim(u8 matrixNum) +{ + sAffineAnimStates[matrixNum].animCmdIndex = 0; + sAffineAnimStates[matrixNum].delayCounter = 0; + sAffineAnimStates[matrixNum].loopCounter = 0; +} + +static void AffineAnimStateStartAnim(u8 matrixNum, u8 animNum) +{ + sAffineAnimStates[matrixNum].animNum = animNum; + sAffineAnimStates[matrixNum].animCmdIndex = 0; + sAffineAnimStates[matrixNum].delayCounter = 0; + sAffineAnimStates[matrixNum].loopCounter = 0; + sAffineAnimStates[matrixNum].xScale = 0x0100; + sAffineAnimStates[matrixNum].yScale = 0x0100; + sAffineAnimStates[matrixNum].rotation = 0; +} + +static void AffineAnimStateReset(u8 matrixNum) +{ + sAffineAnimStates[matrixNum].animNum = 0; + sAffineAnimStates[matrixNum].animCmdIndex = 0; + sAffineAnimStates[matrixNum].delayCounter = 0; + sAffineAnimStates[matrixNum].loopCounter = 0; + sAffineAnimStates[matrixNum].xScale = 0x0100; + sAffineAnimStates[matrixNum].yScale = 0x0100; + sAffineAnimStates[matrixNum].rotation = 0; +} + +static void ApplyAffineAnimFrameAbsolute(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) +{ + sAffineAnimStates[matrixNum].xScale = frameCmd->xScale; + sAffineAnimStates[matrixNum].yScale = frameCmd->yScale; + sAffineAnimStates[matrixNum].rotation = frameCmd->rotation << 8; +} + +static void DecrementAnimDelayCounter(struct Sprite *sprite) +{ + if (!sprite->animPaused) + sprite->animDelayCounter--; +} + +static bool8 DecrementAffineAnimDelayCounter(struct Sprite *sprite, u8 matrixNum) +{ + if (!sprite->affineAnimPaused) + --sAffineAnimStates[matrixNum].delayCounter; + return sprite->affineAnimPaused; +} + +static void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) +{ + struct ObjAffineSrcData srcData; + struct OamMatrix matrix; + sAffineAnimStates[matrixNum].xScale += frameCmd->xScale; + sAffineAnimStates[matrixNum].yScale += frameCmd->yScale; + sAffineAnimStates[matrixNum].rotation = (sAffineAnimStates[matrixNum].rotation + (frameCmd->rotation << 8)) & ~0xFF; + srcData.xScale = ConvertScaleParam(sAffineAnimStates[matrixNum].xScale); + srcData.yScale = ConvertScaleParam(sAffineAnimStates[matrixNum].yScale); + srcData.rotation = sAffineAnimStates[matrixNum].rotation; + ObjAffineSet(&srcData, &matrix, 1, 2); + CopyOamMatrix(matrixNum, &matrix); +} + +static s16 ConvertScaleParam(s16 scale) +{ + s32 val = 0x10000; + return val / scale; +} + +static void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd) +{ + frameCmd->xScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.xScale; + frameCmd->yScale = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.yScale; + frameCmd->rotation = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.rotation; + frameCmd->duration = sprite->affineAnims[sAffineAnimStates[matrixNum].animNum][sAffineAnimStates[matrixNum].animCmdIndex].frame.duration; +} + +static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameCmd) +{ + struct AffineAnimFrameCmd dummyFrameCmd = {0}; + + if (frameCmd->duration) + { + frameCmd->duration--; + ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, frameCmd); + } + else + { + ApplyAffineAnimFrameAbsolute(matrixNum, frameCmd); + ApplyAffineAnimFrameRelativeAndUpdateMatrix(matrixNum, &dummyFrameCmd); + } +} + +void StartSpriteAnim(struct Sprite *sprite, u8 animNum) +{ + sprite->animNum = animNum; + sprite->animBeginning = TRUE; + sprite->animEnded = FALSE; +} + +void StartSpriteAnimIfDifferent(struct Sprite *sprite, u8 animNum) +{ + if (sprite->animNum != animNum) + StartSpriteAnim(sprite, animNum); +} + +void SeekSpriteAnim(struct Sprite *sprite, u8 animCmdIndex) +{ + u8 temp = sprite->animPaused; + sprite->animCmdIndex = animCmdIndex - 1; + sprite->animDelayCounter = 0; + sprite->animBeginning = FALSE; + sprite->animEnded = FALSE; + sprite->animPaused = FALSE; + ContinueAnim(sprite); + if (sprite->animDelayCounter) + sprite->animDelayCounter++; + sprite->animPaused = temp; +} + +void StartSpriteAffineAnim(struct Sprite *sprite, u8 animNum) +{ + u8 matrixNum = GetSpriteMatrixNum(sprite); + AffineAnimStateStartAnim(matrixNum, animNum); + sprite->affineAnimBeginning = TRUE; + sprite->affineAnimEnded = FALSE; +} + +void StartSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) +{ + u8 matrixNum = GetSpriteMatrixNum(sprite); + if (sAffineAnimStates[matrixNum].animNum != animNum) + StartSpriteAffineAnim(sprite, animNum); +} + +void ChangeSpriteAffineAnim(struct Sprite *sprite, u8 animNum) +{ + u8 matrixNum = GetSpriteMatrixNum(sprite); + sAffineAnimStates[matrixNum].animNum = animNum; + sprite->affineAnimBeginning = TRUE; + sprite->affineAnimEnded = FALSE; +} + +void ChangeSpriteAffineAnimIfDifferent(struct Sprite *sprite, u8 animNum) +{ + u8 matrixNum = GetSpriteMatrixNum(sprite); + if (sAffineAnimStates[matrixNum].animNum != animNum) + ChangeSpriteAffineAnim(sprite, animNum); +} + +void SetSpriteSheetFrameTileNum(struct Sprite *sprite) +{ + if (sprite->usingSheet) + { + s16 tileOffset = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + if (tileOffset < 0) + tileOffset = 0; + sprite->oam.tileNum = sprite->sheetTileStart + tileOffset; + } +} + +static void ResetAffineAnimData(void) +{ + u8 i; + + gAffineAnimsDisabled = 0; + gOamMatrixAllocBitmap = 0; + + ResetOamMatrices(); + + for (i = 0; i < OAM_MATRIX_COUNT; i++) + AffineAnimStateReset(i); +} + +u8 AllocOamMatrix(void) +{ + u8 i = 0; + u32 bit = 1; + u32 bitmap = gOamMatrixAllocBitmap; + + while (i < OAM_MATRIX_COUNT) + { + if (!(bitmap & bit)) + { + gOamMatrixAllocBitmap |= bit; + return i; + } + + i++; + bit <<= 1; + } + + return 0xFF; +} + +void FreeOamMatrix(u8 matrixNum) +{ + u8 i = 0; + u32 bit = 1; + + while (i < matrixNum) + { + i++; + bit <<= 1; + } + + gOamMatrixAllocBitmap &= ~bit; + SetOamMatrix(matrixNum, 0x100, 0, 0, 0x100); +} + +void InitSpriteAffineAnim(struct Sprite *sprite) +{ + u8 matrixNum = AllocOamMatrix(); + if (matrixNum != 0xFF) + { + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + sprite->oam.matrixNum = matrixNum; + sprite->affineAnimBeginning = TRUE; + AffineAnimStateReset(matrixNum); + } +} + +void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation) +{ + struct ObjAffineSrcData srcData; + struct OamMatrix matrix; + srcData.xScale = ConvertScaleParam(xScale); + srcData.yScale = ConvertScaleParam(yScale); + srcData.rotation = rotation; + ObjAffineSet(&srcData, &matrix, 1, 2); + CopyOamMatrix(matrixNum, &matrix); +} + +u16 LoadSpriteSheet(const struct SpriteSheet *sheet) +{ + s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); + + if (tileStart < 0) + { + return 0; + } + else + { + AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); + CpuCopy16(sheet->data, OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); + return (u16)tileStart; + } +} + +void LoadSpriteSheets(const struct SpriteSheet *sheets) +{ + u8 i; + for (i = 0; sheets[i].data != NULL; i++) + LoadSpriteSheet(&sheets[i]); +} + +u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet) +{ + s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); + + if (tileStart < 0) + { + return 0; + } + else + { + AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); + return (u16)tileStart; + } +} + +void AllocTilesForSpriteSheets(struct SpriteSheet *sheets) +{ + u8 i; + for (i = 0; sheets[i].data != NULL; i++) + AllocTilesForSpriteSheet(&sheets[i]); +} + +void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet) +{ + const u8 *data = sheet->data; + u16 tileStart = GetSpriteTileStartByTag(sheet->tag); + CpuCopy16(data, OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); +} + +void LoadTilesForSpriteSheets(struct SpriteSheet *sheets) +{ + u8 i; + for (i = 0; sheets[i].data != NULL; i++) + LoadTilesForSpriteSheet(&sheets[i]); +} + +void FreeSpriteTilesByTag(u16 tag) +{ + u8 index = IndexOfSpriteTileTag(tag); + if (index != 0xFF) + { + u16 i; + u16 *rangeStarts; + u16 *rangeCounts; + u16 start; + u16 count; + rangeStarts = sSpriteTileRanges; + start = rangeStarts[index * 2]; + rangeCounts = sSpriteTileRanges + 1; + count = rangeCounts[index * 2]; + + for (i = start; i < start + count; i++) + FREE_SPRITE_TILE(i); + + sSpriteTileRangeTags[index] = 0xFFFF; + } +} + +void FreeSpriteTileRanges(void) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + sSpriteTileRangeTags[i] = 0xFFFF; + SET_SPRITE_TILE_RANGE(i, 0, 0); + } +} + +u16 GetSpriteTileStartByTag(u16 tag) +{ + u8 index = IndexOfSpriteTileTag(tag); + if (index == 0xFF) + return 0xFFFF; + return sSpriteTileRanges[index * 2]; +} + +static u8 IndexOfSpriteTileTag(u16 tag) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + if (sSpriteTileRangeTags[i] == tag) + return i; + + return 0xFF; +} + +u16 GetSpriteTileTagByTileStart(u16 start) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + if (sSpriteTileRangeTags[i] != 0xFFFF && sSpriteTileRanges[i * 2] == start) + return sSpriteTileRangeTags[i]; + } + + return 0xFFFF; +} + +static void AllocSpriteTileRange(u16 tag, u16 start, u16 count) +{ + u8 freeIndex = IndexOfSpriteTileTag(0xFFFF); + sSpriteTileRangeTags[freeIndex] = tag; + SET_SPRITE_TILE_RANGE(freeIndex, start, count); +} + +void RequestSpriteSheetCopy(const struct SpriteSheet *sheet) +{ + const u8 *data = sheet->data; + u16 tileStart = GetSpriteTileStartByTag(sheet->tag); + RequestSpriteCopy(data, OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP, sheet->size); +} + +u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet) +{ + s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); + + if (tileStart < 0) + { + return 0; + } + else + { + AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); + RequestSpriteSheetCopy(sheet); + return (u16)tileStart; + } +} + +void FreeAllSpritePalettes(void) +{ + u8 i; + gReservedSpritePaletteCount = 0; + for (i = 0; i < 16; i++) + sSpritePaletteTags[i] = 0xFFFF; +} + +u8 LoadSpritePalette(const struct SpritePalette *palette) +{ + u8 index = IndexOfSpritePaletteTag(palette->tag); + + if (index != 0xFF) + return index; + + index = IndexOfSpritePaletteTag(0xFFFF); + + if (index == 0xFF) + { + return 0xFF; + } + else + { + sSpritePaletteTags[index] = palette->tag; + DoLoadSpritePalette(palette->data, index * 16); + return index; + } +} + +void LoadSpritePalettes(const struct SpritePalette *palettes) +{ + u8 i; + for (i = 0; palettes[i].data != NULL; i++) + if (LoadSpritePalette(&palettes[i]) == 0xFF) + break; +} + +static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) +{ + LoadPalette(src, paletteOffset + 0x100, 32); +} + +u8 AllocSpritePalette(u16 tag) +{ + u8 index = IndexOfSpritePaletteTag(0xFFFF); + if (index == 0xFF) + { + return 0xFF; + } + else + { + sSpritePaletteTags[index] = tag; + return index; + } +} + +u8 IndexOfSpritePaletteTag(u16 tag) +{ + u8 i; + for (i = gReservedSpritePaletteCount; i < 16; i++) + if (sSpritePaletteTags[i] == tag) + return i; + + return 0xFF; +} + +u16 GetSpritePaletteTagByPaletteNum(u8 paletteNum) +{ + return sSpritePaletteTags[paletteNum]; +} + +void FreeSpritePaletteByTag(u16 tag) +{ + u8 index = IndexOfSpritePaletteTag(tag); + if (index != 0xFF) + sSpritePaletteTags[index] = 0xFFFF; +} + +void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables) +{ + sprite->subspriteTables = subspriteTables; + sprite->subspriteTableNum = 0; + sprite->subspriteMode = SUBSPRITES_ON; +} + +bool8 AddSpriteToOamBuffer(struct Sprite *sprite, u8 *oamIndex) +{ + if (*oamIndex >= gOamLimit) + return 1; + + if (!sprite->subspriteTables || sprite->subspriteMode == SUBSPRITES_OFF) + { + gMain.oamBuffer[*oamIndex] = sprite->oam; + (*oamIndex)++; + return 0; + } + else + { + return AddSubspritesToOamBuffer(sprite, &gMain.oamBuffer[*oamIndex], oamIndex); + } +} + +bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex) +{ + const struct SubspriteTable *subspriteTable; + struct OamData *oam; + + if (*oamIndex >= gOamLimit) + return 1; + + subspriteTable = &sprite->subspriteTables[sprite->subspriteTableNum]; + oam = &sprite->oam; + + if (!subspriteTable || !subspriteTable->subsprites) + { + *destOam = *oam; + (*oamIndex)++; + return 0; + } + else + { + u16 tileNum; + u16 baseX; + u16 baseY; + u8 subspriteCount; + u8 hFlip; + u8 vFlip; + u8 i; + + tileNum = oam->tileNum; + subspriteCount = subspriteTable->subspriteCount; + hFlip = ((s32)oam->matrixNum >> 3) & 1; + vFlip = ((s32)oam->matrixNum >> 4) & 1; + baseX = oam->x - sprite->centerToCornerVecX; + baseY = oam->y - sprite->centerToCornerVecY; + + for (i = 0; i < subspriteCount; i++, (*oamIndex)++) + { + u16 x; + u16 y; + + if (*oamIndex >= gOamLimit) + return 1; + + x = subspriteTable->subsprites[i].x; + y = subspriteTable->subsprites[i].y; + + if (hFlip) + { + s8 width = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].width; + s16 right = x; + right += width; + x = right; + x = ~x + 1; + } + + if (vFlip) + { + s8 height = sOamDimensions[subspriteTable->subsprites[i].shape][subspriteTable->subsprites[i].size].height; + s16 bottom = y; + bottom += height; + y = bottom; + y = ~y + 1; + } + + destOam[i] = *oam; + destOam[i].shape = subspriteTable->subsprites[i].shape; + destOam[i].size = subspriteTable->subsprites[i].size; + destOam[i].x = (s16)baseX + (s16)x; + destOam[i].y = baseY + y; + destOam[i].tileNum = tileNum + subspriteTable->subsprites[i].tileOffset; + + if (sprite->subspriteMode != SUBSPRITES_IGNORE_PRIORITY) + destOam[i].priority = subspriteTable->subsprites[i].priority; + } + } + + return 0; +} diff --git a/src/start_menu.c b/src/start_menu.c new file mode 100644 index 000000000..f2d53eb7f --- /dev/null +++ b/src/start_menu.c @@ -0,0 +1,941 @@ +#include "global.h" +#include "battle_tower.h" +#include "start_menu.h" +#include "event_data.h" +#include "field_player_avatar.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "item_menu.h" +#include "load_save.h" +#include "m4a.h" +#include "main.h" +#include "map_obj_lock.h" +#include "menu.h" +#include "new_game.h" +#include "option_menu.h" +#include "palette.h" +#include "pokedex.h" +#include "pokemon_menu.h" +#include "pokenav.h" +#include "overworld.h" +#include "safari_zone.h" +#include "save.h" +#include "save_menu_util.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "strings2.h" +#include "task.h" +#include "trainer_card.h" +#include "scanline_effect.h" + +//Menu actions +enum { + MENU_ACTION_POKEDEX, + MENU_ACTION_POKEMON, + MENU_ACTION_BAG, + MENU_ACTION_POKENAV, + MENU_ACTION_PLAYER, + MENU_ACTION_SAVE, + MENU_ACTION_OPTION, + MENU_ACTION_EXIT, + MENU_ACTION_RETIRE, + MENU_ACTION_PLAYER_LINK +}; + +#if DEBUG +static u32 _debugStartMenu_0 __attribute__((unused)); +static u32 _debugStartMenu_1 __attribute__((unused)); +#endif + +static u8 (*saveDialogCallback)(void); +static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed +static bool8 savingComplete; + +extern bool8 gDifferentSaveFile; +extern u16 gSaveFileStatus; +extern u16 gSpecialVar_Result; + +extern u8 gUnknown_03004860; + +u8 (*gMenuCallback)(void); + +EWRAM_DATA static u8 sStartMenuCursorPos = 0; +EWRAM_DATA static u8 sNumStartMenuActions = 0; +EWRAM_DATA static u8 sCurrentStartMenuActions[10] = {0}; + +//Text strings +extern u8 gSaveText_PlayerSavedTheGame[]; +extern u8 gSaveText_DontTurnOff[]; +extern u8 gSaveText_ThereIsAlreadyAFile[]; +extern u8 gSaveText_ThereIsADifferentFile[]; +extern u8 gSaveText_WouldYouLikeToSave[]; + +static u8 StartMenu_PokedexCallback(void); +static u8 StartMenu_PokemonCallback(void); +static u8 StartMenu_BagCallback(void); +static u8 StartMenu_PokenavCallback(void); +static u8 StartMenu_PlayerCallback(void); +static u8 StartMenu_SaveCallback(void); +static u8 StartMenu_OptionCallback(void); +static u8 StartMenu_ExitCallback(void); +static u8 StartMenu_RetireCallback(void); +static u8 StartMenu_PlayerLinkCallback(void); + +static const struct MenuAction sStartMenuItems[] = +{ + { SystemText_Pokedex, StartMenu_PokedexCallback }, + { SystemText_Pokemon, StartMenu_PokemonCallback }, + { SystemText_BAG, StartMenu_BagCallback }, + { SystemText_Pokenav, StartMenu_PokenavCallback }, + { SystemText_Player, StartMenu_PlayerCallback }, + { SystemText_Save, StartMenu_SaveCallback }, + { SystemText_Option, StartMenu_OptionCallback }, + { SystemText_Exit, StartMenu_ExitCallback }, + { SystemText_Retire, StartMenu_RetireCallback }, + { SystemText_Player, StartMenu_PlayerLinkCallback }, +}; + +//Private functions +static void BuildStartMenuActions(void); +static void AddStartMenuAction(u8 action); +static void BuildStartMenuActions_Normal(void); +static void BuildStartMenuActions_SafariZone(void); +static void BuildStartMenuActions_Link(void); +static void DisplaySafariBallsWindow(void); +static bool32 PrintStartMenuItemsMultistep(s16 *a, u32 b); +static bool32 InitStartMenuMultistep(s16 *a, s16 *b); +static void Task_StartMenu(u8 taskId); +static u8 StartMenu_InputProcessCallback(void); +static u8 SaveCallback1(void); +static u8 SaveCallback2(void); +static void sub_807160C(void); +static u8 RunSaveDialogCallback(void); +static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)); +static void Task_SaveDialog(u8 taskId); +static void sub_8071700(void); +static void HideSaveDialog(void); +static void SaveDialogStartTimeout(void); +static u8 SaveDialogCheckForTimeoutOrKeypress(void); +static u8 SaveDialogCheckForTimeoutAndKeypress(void); +static u8 SaveDialogCheckForTimeoutAndKeypress(void); +static u8 SaveDialogCB_DisplayConfirmMessage(void); +static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void); +static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void); +static u8 SaveDialogCB_SaveFileExists(void); +static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void); +static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void); +static u8 SaveDialogCB_DisplaySavingMessage(void); +static u8 SaveDialogCB_DoSave(void); +static u8 SaveDialogCB_SaveSuccess(void); +static u8 SaveDialogCB_ReturnSuccess(void); +static u8 SaveDialogCB_SaveError(void); +static u8 SaveDialogCB_ReturnError(void); +static void sub_80719F0(void); +static bool32 sub_80719FC(u8 *ptr); +static void sub_8071B54(void); +static void Task_8071B64(u8 taskId); + +#if DEBUG + +void debug_sub_8075D9C(void); + +u8 debug_sub_8075C30(void) +{ + CloseMenu(); + debug_sub_8075D9C(); + return 1; +} + +extern const u8 gUnknown_Debug_839B6D8[]; + +void debug_sub_8075C40(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 savedIme; + s32 i; + + switch (data[0]) + { + case 0: + m4aSoundVSyncOff(); + data[0]++; + break; + case 1: + savedIme = REG_IME; + REG_IME = 0; + REG_TM2CNT_L = 0; + REG_TM2CNT = 0x830000; + for (i = 0; i < 0xC350; i++) + { + DmaSet( + 0, + gScanlineEffectRegBuffers, + ®_WIN0H, + ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) | 1); + DmaStop(0); + } + REG_TM2CNT_H = 0; + _debugStartMenu_0 = REG_TM2CNT_L; + REG_TM2CNT_L = 0; + REG_IME = savedIme; + _debugStartMenu_1 = i; + m4aSoundVSyncOn(); + data[0]++; + break; + case 2: + PlaySE(0x15); + ConvertIntToDecimalStringN(gStringVar1, _debugStartMenu_1, 1, 8); + ConvertIntToDecimalStringN(gStringVar2, _debugStartMenu_0, 1, 8); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gUnknown_Debug_839B6D8, 2, 15); + data[0]++; + break; + case 3: + if (gMain.newKeys & A_BUTTON) + { + Menu_EraseScreen(); + ScriptContext2_Disable(); + DestroyTask(taskId); + } + break; + } +} + +void debug_sub_8075D9C(void) +{ + CreateTask(debug_sub_8075C40, 10); + ScriptContext2_Enable(); +} + +void debug_sub_8075DB4(struct BattleTowerEReaderTrainer *ereaderTrainer, const u8 *b, u32 trainerId) +{ + s32 i; + s32 r3; + + ereaderTrainer->trainerClass = trainerId % 77; + write_word_to_mem(trainerId, ereaderTrainer->trainerId); + StringCopy8(ereaderTrainer->name, b); + r3 = 7; + for (i = 0; i < 6; i++) + { + ereaderTrainer->greeting[i] = gSaveBlock1.easyChats.unk2B28[i]; + ereaderTrainer->farewellPlayerLost[i] = r3; + ereaderTrainer->farewellPlayerWon[i] = r3 + 6; + r3++; + } + for (i = 0; i < 3; i++) + sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]); + SetEReaderTrainerChecksum(ereaderTrainer); +} + +void unref_sub_8070F90(void) +{ + FlagSet(FLAG_SYS_POKEDEX_GET); + FlagSet(FLAG_SYS_POKEMON_GET); + FlagSet(FLAG_SYS_POKENAV_GET); +} + +#endif + +static void BuildStartMenuActions(void) +{ + sNumStartMenuActions = 0; + if (is_c1_link_related_active() == TRUE) + BuildStartMenuActions_Link(); + else + { + if (GetSafariZoneFlag() == TRUE) + BuildStartMenuActions_SafariZone(); + else + BuildStartMenuActions_Normal(); + } +} + +static void AddStartMenuAction(u8 action) +{ + AppendToList(sCurrentStartMenuActions, &sNumStartMenuActions, action); +} + +static void BuildStartMenuActions_Normal(void) +{ + if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) + AddStartMenuAction(MENU_ACTION_POKEDEX); + if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE) + AddStartMenuAction(MENU_ACTION_POKEMON); + AddStartMenuAction(MENU_ACTION_BAG); + if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) + AddStartMenuAction(MENU_ACTION_POKENAV); + AddStartMenuAction(MENU_ACTION_PLAYER); + AddStartMenuAction(MENU_ACTION_SAVE); + AddStartMenuAction(MENU_ACTION_OPTION); + AddStartMenuAction(MENU_ACTION_EXIT); +} + +static void BuildStartMenuActions_SafariZone(void) +{ + AddStartMenuAction(MENU_ACTION_RETIRE); + AddStartMenuAction(MENU_ACTION_POKEDEX); + AddStartMenuAction(MENU_ACTION_POKEMON); + AddStartMenuAction(MENU_ACTION_BAG); + AddStartMenuAction(MENU_ACTION_PLAYER); + AddStartMenuAction(MENU_ACTION_OPTION); + AddStartMenuAction(MENU_ACTION_EXIT); +} + +static void BuildStartMenuActions_Link(void) +{ + AddStartMenuAction(MENU_ACTION_POKEMON); + AddStartMenuAction(MENU_ACTION_BAG); + if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) + AddStartMenuAction(MENU_ACTION_POKENAV); + AddStartMenuAction(MENU_ACTION_PLAYER_LINK); + AddStartMenuAction(MENU_ACTION_OPTION); + AddStartMenuAction(MENU_ACTION_EXIT); +} + +//Show number of safari balls left +static void DisplaySafariBallsWindow(void) +{ + sub_8072C44(gStringVar1, gNumSafariBalls, 12, 1); + Menu_DrawStdWindowFrame(0, 0, 10, 5); + Menu_PrintText(gOtherText_SafariStock, 1, 1); +} + +//Prints n menu items starting at *index +static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) +{ + int _index = *index; + + do + { + Menu_PrintText(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); + _index++; + if (_index >= sNumStartMenuActions) + { + *index = _index; + return TRUE; + } + } + while (--n != 0); + *index = _index; + return FALSE; +} + +static bool32 InitStartMenuMultistep(s16 *step, s16 *index) +{ + switch (*step) + { + case 1: + BuildStartMenuActions(); + (*step)++; + break; + case 2: + Menu_DrawStdWindowFrame(22, 0, 29, sNumStartMenuActions * 2 + 3); + *index = 0; + (*step)++; + break; + case 3: + if (GetSafariZoneFlag()) + DisplaySafariBallsWindow(); + (*step)++; + break; + case 4: + if (PrintStartMenuItemsMultistep(index, 2)) + (*step)++; + break; + case 0: + (*step)++; + break; + case 5: + sStartMenuCursorPos = InitMenu(0, 0x17, 2, sNumStartMenuActions, sStartMenuCursorPos, 6); + return TRUE; + } + return FALSE; +} + +static void InitStartMenu(void) +{ + s16 step = 0; + s16 index = 0; + + while (InitStartMenuMultistep(&step, &index) == FALSE) + ; +} + +static void Task_StartMenu(u8 taskId) +{ + if (InitStartMenuMultistep(gTasks[taskId].data, gTasks[taskId].data + 1) == TRUE) + { + *gTasks[taskId].data = 0; + SwitchTaskToFollowupFunc(taskId); + } +} + +void CreateStartMenuTask(void (*func)(u8)) +{ + u8 taskId; + + InitMenuWindow(&gWindowTemplate_81E6CE4); + taskId = CreateTask(Task_StartMenu, 0x50); + SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func); +} + +void sub_80712B4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + gMenuCallback = StartMenu_InputProcessCallback; + task->data[0]++; + break; + case 1: + if (gMenuCallback() == 1) + DestroyTask(taskId); + break; + } +} + +void sub_8071310(void) +{ + if (!is_c1_link_related_active()) + { + FreezeMapObjects(); + sub_80594C0(); + sub_80597F4(); + } + CreateStartMenuTask(sub_80712B4); + ScriptContext2_Enable(); +} + +static u8 StartMenu_InputProcessCallback(void) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + sStartMenuCursorPos = Menu_MoveCursor(-1); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + sStartMenuCursorPos = Menu_MoveCursor(1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func == StartMenu_PokedexCallback) + { + if (GetNationalPokedexCount(0) == 0) + return 0; + } + gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func; + if (gMenuCallback != StartMenu_SaveCallback && + gMenuCallback != StartMenu_ExitCallback && + gMenuCallback != StartMenu_RetireCallback) + FadeScreen(1, 0); + return 0; + } + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + CloseMenu(); + return 1; + } + return 0; +} + +//When player selects POKEDEX +static u8 StartMenu_PokedexCallback(void) +{ + if (!gPaletteFade.active) + { + IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); + PlayRainSoundEffect(); + SetMainCallback2(CB2_InitPokedex); + return 1; + } + return 0; +} + +//When player selects POKEMON +static u8 StartMenu_PokemonCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + SetMainCallback2(sub_8089A70); + return 1; + } + return 0; +} + +//When player selects BAG +static u8 StartMenu_BagCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + SetMainCallback2(sub_80A53F8); + return 1; + } + return 0; +} + +//When player selects POKENAV +static u8 StartMenu_PokenavCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + SetMainCallback2(sub_80EBA5C); + return 1; + } + return 0; +} + +//When player selects his/her name +static u8 StartMenu_PlayerCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + TrainerCard_ShowPlayerCard(sub_805469C); + return 1; + } + return 0; +} + +//When player selects SAVE +static u8 StartMenu_SaveCallback(void) +{ + Menu_DestroyCursor(); + gMenuCallback = SaveCallback1; + return 0; +} + +//When player selects OPTION +static u8 StartMenu_OptionCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + SetMainCallback2(CB2_InitOptionMenu); + gMain.savedCallback = sub_805469C; + return 1; + } + return 0; +} + +//When player selects EXIT +static u8 StartMenu_ExitCallback(void) +{ + CloseMenu(); + return 1; +} + +//When player selects RETIRE +static u8 StartMenu_RetireCallback(void) +{ + CloseMenu(); + SafariZoneRetirePrompt(); + return 1; +} + +//When player selects their name in multiplayer mode +static u8 StartMenu_PlayerLinkCallback(void) +{ + if (!gPaletteFade.active) + { + PlayRainSoundEffect(); + TrainerCard_ShowLinkCard(gUnknown_03004860, sub_805469C); + return 1; + } + return 0; +} + +//Save dialog status +enum +{ + SAVE_IN_PROGRESS, + SAVE_SUCCESS, + SAVE_CANCELED, + SAVE_ERROR, +}; + +static u8 SaveCallback1(void) +{ + sub_807160C(); + gMenuCallback = SaveCallback2; + return FALSE; +} + +static u8 SaveCallback2(void) +{ + switch (RunSaveDialogCallback()) + { + case SAVE_IN_PROGRESS: + return FALSE; + case SAVE_CANCELED: + //Go back to start menu + Menu_EraseScreen(); + InitStartMenu(); + gMenuCallback = StartMenu_InputProcessCallback; + return FALSE; + case SAVE_SUCCESS: + case SAVE_ERROR: + Menu_EraseScreen(); + sub_8064E2C(); + ScriptContext2_Disable(); + return TRUE; + } + return FALSE; +} + +static void sub_807160C(void) +{ + save_serialize_map(); + saveDialogCallback = SaveDialogCB_DisplayConfirmMessage; + savingComplete = FALSE; +} + +static u8 RunSaveDialogCallback(void) +{ + if (savingComplete) + { + if (!Menu_UpdateWindowText()) + return 0; + } + savingComplete = FALSE; + return saveDialogCallback(); +} + +void ScrSpecial_DoSaveDialog(void) +{ + sub_807160C(); + CreateTask(Task_SaveDialog, 0x50); +} + +static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)) +{ + StringExpandPlaceholders(gStringVar4, ptr); + Menu_DisplayDialogueFrame(); + MenuPrintMessageDefaultCoords(gStringVar4); + savingComplete = TRUE; + saveDialogCallback = func; +} + +static void Task_SaveDialog(u8 taskId) +{ + u8 status = RunSaveDialogCallback(); + + switch (status) + { + case SAVE_CANCELED: + case SAVE_ERROR: + gSpecialVar_Result = 0; + break; + case SAVE_SUCCESS: + gSpecialVar_Result = status; + break; + case SAVE_IN_PROGRESS: + return; + } + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +static void sub_8071700(void) +{ + HandleCloseSaveWindow(0, 0); +} + +static void HideSaveDialog(void) +{ + Menu_EraseWindowRect(20, 8, 26, 13); +} + +static void SaveDialogStartTimeout(void) +{ + saveDialogTimer = 60; +} + +static bool8 SaveDialogCheckForTimeoutOrKeypress(void) +{ + saveDialogTimer--; + if (gMain.heldKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return TRUE; + } + else if (saveDialogTimer == 0) + return TRUE; + return FALSE; +} + +static bool8 SaveDialogCheckForTimeoutAndKeypress(void) +{ + if (saveDialogTimer != 0) + saveDialogTimer--; + else if (gMain.heldKeys & A_BUTTON) + return TRUE; + return FALSE; +} + +static u8 SaveDialogCB_DisplayConfirmMessage(void) +{ + Menu_EraseScreen(); + HandleDrawSaveWindowInfo(0, 0); + DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void) +{ + DisplayYesNoMenu(20, 8, 1); + saveDialogCallback = SaveDialogCB_ProcessConfirmYesNoMenu; + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void) +{ + switch (Menu_ProcessInputNoWrap_()) + { + case 0: //YES + HideSaveDialog(); + switch (gSaveFileStatus) + { + case 0: + case 2: + if (gDifferentSaveFile == FALSE) + { + saveDialogCallback = SaveDialogCB_SaveFileExists; + return SAVE_IN_PROGRESS; + } + saveDialogCallback = SaveDialogCB_DisplaySavingMessage; + return SAVE_IN_PROGRESS; + default: + saveDialogCallback = SaveDialogCB_SaveFileExists; + return SAVE_IN_PROGRESS; + } + break; + case -1: //B button + case 1: //NO + HideSaveDialog(); + sub_8071700(); + return SAVE_CANCELED; + } + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_SaveFileExists(void) +{ + DisplaySaveMessageWithCallback( + gDifferentSaveFile == TRUE ? gSaveText_ThereIsADifferentFile : gSaveText_ThereIsAlreadyAFile, + SaveDialogCB_DisplayOverwriteYesNoMenu); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void) +{ + DisplayYesNoMenu(20, 8, 1); + saveDialogCallback = SaveDialogCB_ProcessOverwriteYesNoMenu; + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void) +{ + switch (Menu_ProcessInputNoWrap_()) + { + case 0: //YES + HideSaveDialog(); + saveDialogCallback = SaveDialogCB_DisplaySavingMessage; + break; + case -1: //B button + case 1: //NO + HideSaveDialog(); + sub_8071700(); + return SAVE_CANCELED; + } + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_DisplaySavingMessage(void) +{ + //"SAVING... DON'T TURN OFF THE POWER." + DisplaySaveMessageWithCallback(gSaveText_DontTurnOff, SaveDialogCB_DoSave); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_DoSave(void) +{ + u8 saveStatus; + + IncrementGameStat(GAME_STAT_SAVED_GAME); + if (gDifferentSaveFile == TRUE) + { + saveStatus = Save_WriteData(SAVE_OVERWRITE_DIFFERENT_FILE); + gDifferentSaveFile = FALSE; + } + else + { + saveStatus = Save_WriteData(SAVE_NORMAL); + } + + if (saveStatus == SAVE_STATUS_OK) + { + //"(Player) saved the game." + DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess); + } + else + { + //"Save error. Please exchange the backup memory." + DisplaySaveMessageWithCallback(gSystemText_SaveErrorExchangeBackup, SaveDialogCB_SaveError); + } + + SaveDialogStartTimeout(); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_SaveSuccess(void) +{ + if (Menu_UpdateWindowText()) + { + PlaySE(SE_SAVE); + saveDialogCallback = SaveDialogCB_ReturnSuccess; + } + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_ReturnSuccess(void) +{ + if (!IsSEPlaying() && SaveDialogCheckForTimeoutOrKeypress()) + { + sub_8071700(); + return SAVE_SUCCESS; + } + else + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_SaveError(void) +{ + if (Menu_UpdateWindowText()) + { + PlaySE(SE_BOO); + saveDialogCallback = SaveDialogCB_ReturnError; + } + return SAVE_IN_PROGRESS; +} + +static u8 SaveDialogCB_ReturnError(void) +{ + if (!SaveDialogCheckForTimeoutAndKeypress()) + return SAVE_IN_PROGRESS; + else + { + sub_8071700(); + return SAVE_ERROR; + } +} + +static void sub_80719F0(void) +{ + TransferPlttBuffer(); +} + +static bool32 sub_80719FC(u8 *step) +{ + switch (*step) + { + case 0: + REG_DISPCNT = 0; + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + DmaClear16(3, PLTT, PLTT_SIZE); + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); + break; + case 1: + ResetSpriteData(); + ResetTasks(); + ResetPaletteFade(); + ScanlineEffect_Clear(); + break; + case 2: + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON; + break; + case 3: + { + u32 savedIme; + + BlendPalettes(-1, 0x10, 0); + SetVBlankCallback(sub_80719F0); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + break; + } + case 4: + return TRUE; + } + (*step)++; + return FALSE; +} + +void sub_8071B28(void) +{ + if (sub_80719FC(&gMain.state)) + { + CreateTask(Task_8071B64, 0x50); + SetMainCallback2(sub_8071B54); + } +} + +static void sub_8071B54(void) +{ + RunTasks(); + UpdatePaletteFade(); +} + +static void Task_8071B64(u8 taskId) +{ + s16 *step = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + switch (*step) + { + case 0: + Menu_DisplayDialogueFrame(); + Menu_PrintText(gSystemText_Saving, 2, 15); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + (*step)++; + break; + case 1: + SetSecretBase2Field_9_AndHideBG(); + sub_8125E2C(); + (*step)++; + break; + case 2: + if (!sub_8125E6C()) + break; + ClearSecretBase2Field_9_2(); + (*step)++; + break; + case 3: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + (*step)++; + break; + case 4: + SetMainCallback2(gMain.savedCallback); + DestroyTask(taskId); + break; + } + } +} diff --git a/src/starter_choose.c b/src/starter_choose.c new file mode 100644 index 000000000..418488774 --- /dev/null +++ b/src/starter_choose.c @@ -0,0 +1,757 @@ +#include "global.h" +#include "starter_choose.h" +#include "data2.h" +#include "decompress.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokedex.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/species.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "trig.h" +#include "scanline_effect.h" + +extern u16 gSpecialVar_Result; +extern struct SpriteTemplate gUnknown_02024E8C; + +//-------------------------------------------------- +// Graphics Data +//-------------------------------------------------- + +const u16 gBirchBagGrassPal[2][16] = +{ + INCBIN_U16("graphics/misc/birch_bag.gbapal"), + INCBIN_U16("graphics/misc/birch_grass.gbapal"), +}; +static const u16 gBirchBallarrow_Pal[] = INCBIN_U16("graphics/misc/birch_ballarrow.gbapal"); +static const u16 gBirchCircle_Pal[] = INCBIN_U16("graphics/misc/birch_circle.gbapal"); +const u8 gBirchBagTilemap[] = INCBIN_U8("graphics/misc/birch_bag_map.bin.lz"); +const u8 gBirchGrassTilemap[] = INCBIN_U8("graphics/misc/birch_grass_map.bin.lz"); +const u8 gBirchHelpGfx[] = INCBIN_U8("graphics/misc/birch_help.4bpp.lz"); +static const u8 gBirchBallarrow_Gfx[] = INCBIN_U8("graphics/misc/birch_ballarrow.4bpp.lz"); +static const u8 gBirchCircle_Gfx[] = INCBIN_U8("graphics/misc/birch_circle.4bpp.lz"); +static const u8 gStarterChoose_PokeballCoords[][2] = +{ + {60, 64}, + {120, 88}, + {180, 64}, +}; +static const u8 gStarterChoose_LabelCoords[][2] = +{ + {0, 9}, + {16, 10}, + {8, 4}, +}; +static const u16 sStarterMons[] = {SPECIES_TREECKO, SPECIES_TORCHIC, SPECIES_MUDKIP}; +static const struct OamData gOamData_83F76CC = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83F76D4 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData gOamData_83F76DC = +{ + .y = 160, + .affineMode = 3, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const u8 gUnknown_083F76E4[][2] = +{ + {60, 32}, + {120, 56}, + {180, 32}, + {0, 0}, +}; +static const union AnimCmd gSpriteAnim_83F76EC[] = +{ + ANIMCMD_FRAME(48, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83F76F4[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83F76FC[] = +{ + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd gSpriteAnim_83F7744[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_83F774C[] = +{ + gSpriteAnim_83F76EC, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7750[] = +{ + gSpriteAnim_83F76F4, + gSpriteAnim_83F76FC, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7758[] = +{ + gSpriteAnim_83F7744, +}; +static const union AffineAnimCmd gSpriteAffineAnim_83F775C[] = +{ + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(16, 16, 0, 15), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd gSpriteAffineAnim_83F7774[] = +{ + AFFINEANIMCMD_FRAME(20, 20, 0, 0), + AFFINEANIMCMD_FRAME(20, 20, 0, 15), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F778C[] = +{ + gSpriteAffineAnim_83F775C, +}; +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7790[] = +{ + gSpriteAffineAnim_83F7774, +}; +static const struct CompressedSpriteSheet gUnknown_083F7794[] = +{ + {gBirchBallarrow_Gfx, 0x0800, 0x1000}, + {NULL}, +}; +static const struct CompressedSpriteSheet gUnknown_083F77A4[] = +{ + {gBirchCircle_Gfx, 0x0800, 0x1001}, + {NULL}, +}; +const struct SpritePalette gUnknown_083F77B4[] = +{ + {gBirchBallarrow_Pal, 0x1000}, + {gBirchCircle_Pal, 0x1001}, + {NULL}, +}; +static void sub_810A62C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F77CC = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83F76CC, + .anims = gSpriteAnimTable_83F774C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810A62C, +}; +static void sub_810A68C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F77E4 = +{ + .tileTag = 4096, + .paletteTag = 4096, + .oam = &gOamData_83F76D4, + .anims = gSpriteAnimTable_83F7750, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810A68C, +}; +static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F77FC = +{ + .tileTag = 4097, + .paletteTag = 4097, + .oam = &gOamData_83F76DC, + .anims = gSpriteAnimTable_83F7758, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83F7790, + .callback = StarterPokemonSpriteAnimCallback, +}; + +static void MainCallback2(void); +static void Task_StarterChoose1(u8 taskId); +static void Task_StarterChoose2(u8 taskId); +static void Task_StarterChoose3(u8 taskId); +static void Task_StarterChoose4(u8 taskId); +static void Task_StarterChoose5(u8 taskId); +static void Task_StarterChoose6(u8 taskId); + +static void CreateStarterPokemonLabel(u8, u8); +static u8 CreatePokemonFrontSprite(u16, u8, u8); + +//Position of the sprite of the selected starter Pokemon +#define STARTER_PKMN_POS_X 120 +#define STARTER_PKMN_POS_Y 64 + +//Retrieves one of the available starter Pokemon +u16 GetStarterPokemon(u16 n) +{ + if (n > 3) + n = 0; + return sStarterMons[n]; +} + +static void VblankCallback(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +#define tStarterSelection data[0] +#define tPkmnSpriteId data[1] +#define tCircleSpriteId data[2] + +void CB2_ChooseStarter(void) +{ + u16 savedIme; + u8 taskId; + u8 spriteId; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + + LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); + LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); + LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + LoadPalette(gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal)); + LoadCompressedObjectPic(&gUnknown_083F7794[0]); + LoadCompressedObjectPic(&gUnknown_083F77A4[0]); + LoadSpritePalettes(gUnknown_083F77B4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + + SetVBlankCallback(VblankCallback); + SetMainCallback2(MainCallback2); + + REG_WININ = 0x3F; + REG_WINOUT = 0x1F; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_BLDCNT = 0xFE; + REG_BLDALPHA = 0; + REG_BLDY = 0x7; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; + + taskId = CreateTask(Task_StarterChoose1, 0); + gTasks[taskId].tStarterSelection = 1; + + //Create hand sprite + spriteId = CreateSprite(&gSpriteTemplate_83F77CC, 120, 56, 2); + gSprites[spriteId].data[0] = taskId; + + //Create three Pokeball sprites + spriteId = CreateSprite( + &gSpriteTemplate_83F77E4, + gStarterChoose_PokeballCoords[0][0], gStarterChoose_PokeballCoords[0][1], 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 0; + spriteId = CreateSprite( + &gSpriteTemplate_83F77E4, + gStarterChoose_PokeballCoords[1][0], gStarterChoose_PokeballCoords[1][1], 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 1; + spriteId = CreateSprite( + &gSpriteTemplate_83F77E4, + gStarterChoose_PokeballCoords[2][0], gStarterChoose_PokeballCoords[2][1], 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 2; +} + +static void MainCallback2(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_StarterChoose1(u8 taskId) +{ + CreateStarterPokemonLabel(0xFF, gTasks[taskId].tStarterSelection); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gOtherText_BirchInTrouble, 3, 15); + gTasks[taskId].func = Task_StarterChoose2; +} + +static void Task_StarterChoose2(u8 taskId) +{ + u8 selection = gTasks[taskId].tStarterSelection; + + if (gMain.newKeys & A_BUTTON) + { + u8 spriteId; + + Menu_EraseWindowRect( + gStarterChoose_LabelCoords[selection][0], + gStarterChoose_LabelCoords[selection][1], + gStarterChoose_LabelCoords[selection][0] + 13, + gStarterChoose_LabelCoords[selection][1] + 3); + + REG_WIN0H = 0; + REG_WIN0V = 0; + + //Create white circle background + spriteId = CreateSprite( + &gSpriteTemplate_83F77FC, + gStarterChoose_PokeballCoords[selection][0], + gStarterChoose_PokeballCoords[selection][1], + 1); + gTasks[taskId].tCircleSpriteId = spriteId; + + //Create Pokemon sprite + spriteId = CreatePokemonFrontSprite( + GetStarterPokemon(gTasks[taskId].tStarterSelection), + gStarterChoose_PokeballCoords[selection][0], + gStarterChoose_PokeballCoords[selection][1]); + gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_83F778C; + gSprites[spriteId].callback = StarterPokemonSpriteAnimCallback; + gTasks[taskId].tPkmnSpriteId = spriteId; + + gTasks[taskId].func = Task_StarterChoose3; + } + else + { + if ((gMain.newKeys & DPAD_LEFT) && selection > 0) + { + gTasks[taskId].tStarterSelection--; + CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection); + } + else if ((gMain.newKeys & DPAD_RIGHT) && selection < 2) + { + gTasks[taskId].tStarterSelection++; + CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection); + } + } +} + +static void Task_StarterChoose3(u8 taskId) +{ + if (gSprites[gTasks[taskId].tCircleSpriteId].affineAnimEnded && + gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X && + gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y) + { + gTasks[taskId].func = Task_StarterChoose4; + } +} + +static void Task_StarterChoose4(u8 taskId) +{ + PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + //"Do you choose this POKEMON?" + Menu_PrintText(gOtherText_DoYouChoosePoke, 3, 15); + DisplayYesNoMenu(21, 7, 1); + gTasks[taskId].func = Task_StarterChoose5; +} + +static void Task_StarterChoose5(u8 taskId) +{ + u8 spriteId; + + switch (Menu_ProcessInputNoWrap_()) + { + case 0: // YES + //Return the starter choice and exit. + gSpecialVar_Result = gTasks[taskId].tStarterSelection; + SetMainCallback2(gMain.savedCallback); + break; + case 1: // NO + case -1: // B button + PlaySE(SE_SELECT); + Menu_EraseWindowRect(21, 7, 27, 12); + + spriteId = gTasks[taskId].tPkmnSpriteId; + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum)); + FreeOamMatrix(gSprites[spriteId].oam.matrixNum); + DestroySprite(&gSprites[spriteId]); + + spriteId = gTasks[taskId].tCircleSpriteId; + FreeOamMatrix(gSprites[spriteId].oam.matrixNum); + DestroySprite(&gSprites[spriteId]); + gTasks[taskId].func = Task_StarterChoose6; + break; + } +} + +static void Task_StarterChoose6(u8 taskId) +{ + gTasks[taskId].func = Task_StarterChoose1; +} + +void AddTextColorCtrlCode(u8 *string, u8 bgColor, u8 textColor, u8 shadowColor) +{ + *(string++) = EXT_CTRL_CODE_BEGIN; + *(string++) = 4; + *(string++) = textColor; + *(string++) = bgColor; + *(string++) = shadowColor; +} + +#define SET_CHAR(str, index, c) \ +{ \ + u8 *p = str + index; \ + *p = c; \ +} + + +#if ENGLISH +static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) +{ + u8 labelText[72]; + const u8 *category; + u8 srcIndex; + u8 dstIndex; + u16 species; + + u8 labelLeft; + u8 labelRight; + u8 labelTop; + u8 labelBottom; + + if (prevSelection != 0xFF) + { + //Remove the old Pokemon label + Menu_EraseWindowRect( + gStarterChoose_LabelCoords[prevSelection][0], + gStarterChoose_LabelCoords[prevSelection][1], + gStarterChoose_LabelCoords[prevSelection][0] + 13, + gStarterChoose_LabelCoords[prevSelection][1] + 3); + REG_WIN0H = 0; + REG_WIN0V = 0; + } + species = GetStarterPokemon(selection); + category = GetPokemonCategory(SpeciesToNationalPokedexNum(species)); + AddTextColorCtrlCode(labelText, 0, 15, 8); + dstIndex = 5; + SET_CHAR(labelText, 5, EXT_CTRL_CODE_BEGIN); + SET_CHAR(labelText, 6, 0x11); + SET_CHAR(labelText, 7, dstIndex); + + //Copy category string to label + dstIndex = 8; + srcIndex = 0; + while (category[srcIndex] != EOS && srcIndex <= 10) + { + labelText[dstIndex] = category[srcIndex]; + srcIndex++; + dstIndex++; + } + labelText[dstIndex++] = CHAR_SPACE; + + //Copy POKEMON string to label + StringCopy(labelText + dstIndex, gOtherText_Poke); + Menu_PrintText( + labelText, + gStarterChoose_LabelCoords[selection][0], + gStarterChoose_LabelCoords[selection][1]); + AddTextColorCtrlCode(labelText, 0, 15, 8); + + //Copy Pokemon name to label + sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1); + Menu_PrintText( + labelText, + gStarterChoose_LabelCoords[selection][0], + gStarterChoose_LabelCoords[selection][1] + 2); + + labelLeft = gStarterChoose_LabelCoords[selection][0] * 8 + 4; + labelRight = (gStarterChoose_LabelCoords[selection][0] + 13) * 8 + 4; + labelTop = gStarterChoose_LabelCoords[selection][1] * 8; + labelBottom = (gStarterChoose_LabelCoords[selection][1] + 4) * 8; + REG_WIN0H = WIN_RANGE(labelLeft, labelRight); + REG_WIN0V = WIN_RANGE(labelTop, labelBottom); +} +#elif GERMAN +__attribute__((naked)) +static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x48\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + cmp r0, 0xFF\n\ + beq _0810A872\n\ + ldr r1, _0810A960 @ =gStarterChoose_LabelCoords\n\ + lsls r2, r0, 1\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + adds r1, 0x1\n\ + adds r2, r1\n\ + ldrb r1, [r2]\n\ + adds r2, r0, 0\n\ + adds r2, 0xD\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r3, r1, 0x3\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + bl Menu_EraseWindowRect\n\ + ldr r0, _0810A964 @ =0x04000040\n\ + movs r1, 0\n\ + strh r1, [r0]\n\ + adds r0, 0x4\n\ + strh r1, [r0]\n\ +_0810A872:\n\ + adds r0, r5, 0\n\ + bl GetStarterPokemon\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + adds r0, r6, 0\n\ + bl SpeciesToNationalPokedexNum\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl GetPokemonCategory\n\ + adds r4, r0, 0\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0xF\n\ + movs r3, 0x8\n\ + bl AddTextColorCtrlCode\n\ + movs r2, 0x8\n\ + movs r3, 0\n\ + ldrb r0, [r4]\n\ + lsls r5, 1\n\ + mov r7, sp\n\ + adds r7, 0x5\n\ + cmp r0, 0xFF\n\ + beq _0810A8CA\n\ +_0810A8A8:\n\ + mov r0, sp\n\ + adds r1, r0, r2\n\ + adds r0, r4, r3\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + adds r0, r4, r3\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xFF\n\ + beq _0810A8CA\n\ + cmp r3, 0xA\n\ + bls _0810A8A8\n\ +_0810A8CA:\n\ + mov r0, sp\n\ + adds r1, r0, r2\n\ + movs r0, 0xFF\n\ + strb r0, [r1]\n\ + mov r1, sp\n\ + movs r0, 0xFC\n\ + strb r0, [r1, 0x5]\n\ + movs r0, 0x11\n\ + strb r0, [r1, 0x6]\n\ + mov r2, sp\n\ + lsls r1, r3, 1\n\ + adds r1, r3\n\ + lsls r1, 1\n\ + movs r0, 0x70\n\ + subs r0, r1\n\ + asrs r0, 1\n\ + strb r0, [r2, 0x7]\n\ + ldr r0, _0810A960 @ =gStarterChoose_LabelCoords\n\ + adds r1, r5, r0\n\ + ldrb r4, [r1]\n\ + adds r0, 0x1\n\ + adds r0, r5, r0\n\ + ldrb r5, [r0]\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + adds r2, r5, 0\n\ + bl Menu_PrintText\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0xF\n\ + movs r3, 0x8\n\ + bl AddTextColorCtrlCode\n\ + movs r0, 0xB\n\ + adds r1, r6, 0\n\ + muls r1, r0\n\ + ldr r0, _0810A968 @ =gSpeciesNames\n\ + adds r1, r0\n\ + adds r0, r7, 0\n\ + movs r2, 0x70\n\ + movs r3, 0x2\n\ + bl sub_8072C74\n\ + adds r2, r5, 0x2\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl Menu_PrintText\n\ + lsls r0, r4, 3\n\ + adds r0, 0x4\n\ + lsls r0, 24\n\ + adds r4, 0xD\n\ + lsls r4, 3\n\ + adds r4, 0x4\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + lsls r1, r5, 27\n\ + adds r5, 0x4\n\ + lsls r5, 27\n\ + lsrs r5, 24\n\ + ldr r2, _0810A964 @ =0x04000040\n\ + lsrs r0, 16\n\ + orrs r0, r4\n\ + strh r0, [r2]\n\ + ldr r0, _0810A96C @ =0x04000044\n\ + lsrs r1, 16\n\ + orrs r1, r5\n\ + strh r1, [r0]\n\ + add sp, 0x48\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0810A960: .4byte gStarterChoose_LabelCoords\n\ +_0810A964: .4byte 0x04000040\n\ +_0810A968: .4byte gSpeciesNames\n\ +_0810A96C: .4byte 0x04000044\n\ + .syntax divided\n"); +} +#endif + +static void nullsub_72(struct Sprite *sprite) +{ +} + +static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y) +{ + u8 spriteId; + + DecompressPicFromTable_2( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, + gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], + species); + LoadCompressedObjectPalette(&gMonPaletteTable[species]); + GetMonSpriteTemplate_803C56C(species, 1); + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].callback = nullsub_72; + gSprites[spriteId].oam.priority = 0; + return spriteId; +} + +//Sprite callback +static void sub_810A62C(struct Sprite *sprite) +{ + sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data[0]].tStarterSelection][0]; + sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data[0]].tStarterSelection][1]; + sprite->pos2.y = Sin(sprite->data[1], 8); + sprite->data[1] = (u8)sprite->data[1] + 4; +} + +//Sprite callback +static void sub_810A68C(struct Sprite *sprite) +{ + if (gTasks[sprite->data[0]].tStarterSelection == sprite->data[1]) + StartSpriteAnimIfDifferent(sprite, 1); + else + StartSpriteAnimIfDifferent(sprite, 0); +} + +//Sprite callback +static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite) +{ + //Move sprite to upper center of screen + if (sprite->pos1.x > STARTER_PKMN_POS_X) + sprite->pos1.x -= 4; + if (sprite->pos1.x < STARTER_PKMN_POS_X) + sprite->pos1.x += 4; + if (sprite->pos1.y > STARTER_PKMN_POS_Y) + sprite->pos1.y -= 2; + if (sprite->pos1.y < STARTER_PKMN_POS_Y) + sprite->pos1.y += 2; +} diff --git a/src/string_util.c b/src/string_util.c new file mode 100644 index 000000000..7316f533a --- /dev/null +++ b/src/string_util.c @@ -0,0 +1,561 @@ +#include "global.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" + +u8 gUnknownStringVar[16]; + +const u8 gEmptyString_81E72B0[] = _(""); +const u8 gRightPointingTriangleString[] = _("▶"); + +static const u8 sDigits[] = __("0123456789ABCDEF"); + +static const s32 sPowersOfTen[] = +{ + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, +}; + +u8 *StringCopy10(u8 *dest, const u8 *src) +{ + u8 i; + u32 limit = 10; + + for (i = 0; i < limit; i++) + { + dest[i] = src[i]; + + if (dest[i] == EOS) + return &dest[i]; + } + + dest[i] = EOS; + return &dest[i]; +} + +u8 *StringGetEnd10(u8 *str) +{ + u8 i; + u32 limit = 10; + + for (i = 0; i < limit; i++) + if (str[i] == EOS) + return &str[i]; + + str[i] = EOS; + return &str[i]; +} + +u8 *StringCopy8(u8 *dest, const u8 *src) +{ + s32 i; + + for (i = 0; i < 8; i++) + { + dest[i] = src[i]; + + if (dest[i] == EOS) + return &dest[i]; + } + + dest[i] = EOS; + return &dest[i]; +} + +u8 *StringCopy(u8 *dest, const u8 *src) +{ + while (*src != EOS) + { + *dest = *src; + dest++; + src++; + } + + *dest = EOS; + return dest; +} + +u8 *StringAppend(u8 *dest, const u8 *src) +{ + while (*dest != EOS) + dest++; + + return StringCopy(dest, src); +} + +u8 *StringCopyN(u8 *dest, const u8 *src, u8 n) +{ + u16 i; + + for (i = 0; i < n; i++) + dest[i] = src[i]; + + return &dest[n]; +} + +u8 *StringAppendN(u8 *dest, const u8 *src, u8 n) +{ + while (*dest != EOS) + dest++; + + return StringCopyN(dest, src, n); +} + +u16 StringLength(const u8 *str) +{ + u16 length = 0; + + while (str[length] != EOS) + { + u16 temp = length; + length++; + if (str[temp] == EXT_CTRL_CODE_BEGIN) + length += GetExtCtrlCodeLength(str[length]); + } + + return length; +} + +#ifdef GERMAN +s32 StringLengthN(const u8 *str, s32 n) +{ + s32 i; + + for (i = 0; i < n && str[i] != EOS; i++) + ; + + if (i == n) + i = 0; + + return i; +} +#endif + +s32 StringCompare(const u8 *str1, const u8 *str2) +{ + while (*str1 == *str2) + { + if (*str1 == EOS) + return 0; + str1++; + str2++; + } + + return *str1 - *str2; +} + +s32 StringCompareN(const u8 *str1, const u8 *str2, u32 n) +{ + while (*str1 == *str2) + { + if (*str1 == EOS) + return 0; + str1++; + str2++; + if (--n == 0) + return 0; + } + + return *str1 - *str2; +} + +u8 *ConvertIntToDecimalStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) +{ + enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; + s32 powerOfTen; + s32 largestPowerOfTen = sPowersOfTen[n - 1]; + + state = WAITING_FOR_NONZERO_DIGIT; + + if (mode == STR_CONV_MODE_RIGHT_ALIGN) + state = WRITING_SPACES; + + if (mode == STR_CONV_MODE_LEADING_ZEROS) + state = WRITING_DIGITS; + + for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) + { + char *out; + u8 c; + u16 digit = value / powerOfTen; + s32 temp = value - (powerOfTen * digit); + + if (state == WRITING_DIGITS) + { + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (digit != 0 || powerOfTen == 1) + { + state = WRITING_DIGITS; + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (state == WRITING_SPACES) + { + *dest++ = CHAR_SPACE; + } + + value = temp; + } + + *dest = EOS; + return dest; +} + +u8 *ConvertIntToDecimalStringN_DigitWidth6(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) +{ + enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; + s32 powerOfTen; + s32 largestPowerOfTen = sPowersOfTen[n - 1]; + + *dest++ = EXT_CTRL_CODE_BEGIN; + *dest++ = 0x14; + *dest++ = 6; + + state = WAITING_FOR_NONZERO_DIGIT; + + if (mode == STR_CONV_MODE_RIGHT_ALIGN) + state = WRITING_SPACES; + + if (mode == STR_CONV_MODE_LEADING_ZEROS) + state = WRITING_DIGITS; + + for (powerOfTen = largestPowerOfTen; powerOfTen > 0; powerOfTen /= 10) + { + char *out; + u8 c; + u16 digit = value / powerOfTen; + s32 temp = value - (powerOfTen * digit); + + if (state == WRITING_DIGITS) + { + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (digit != 0 || powerOfTen == 1) + { + state = WRITING_DIGITS; + out = dest++; + + if (digit <= 9) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (state == WRITING_SPACES) + { + *dest++ = CHAR_SPACE; + } + + value = temp; + } + + *dest++ = EXT_CTRL_CODE_BEGIN; + *dest++ = 0x14; + *dest++ = 0x00; + + *dest = EOS; + return dest; +} + +u8 *ConvertIntToHexStringN(u8 *dest, s32 value, enum StringConvertMode mode, u8 n) +{ + enum { WAITING_FOR_NONZERO_DIGIT, WRITING_DIGITS, WRITING_SPACES } state; + u8 i; + s32 powerOfSixteen; + s32 largestPowerOfSixteen = 1; + + for (i = 1; i < n; i++) + largestPowerOfSixteen *= 16; + + state = WAITING_FOR_NONZERO_DIGIT; + + if (mode == STR_CONV_MODE_RIGHT_ALIGN) + state = WRITING_SPACES; + + if (mode == STR_CONV_MODE_LEADING_ZEROS) + state = WRITING_DIGITS; + + for (powerOfSixteen = largestPowerOfSixteen; powerOfSixteen > 0; powerOfSixteen /= 16) + { + char *out; + u8 c; + u32 digit = value / powerOfSixteen; + s32 temp = value % powerOfSixteen; + + if (state == WRITING_DIGITS) + { + out = dest++; + + if (digit <= 0xF) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (digit != 0 || powerOfSixteen == 1) + { + state = WRITING_DIGITS; + out = dest++; + + if (digit <= 0xF) + c = sDigits[digit]; + else + c = CHAR_QUESTION_MARK; + + *out = c; + } + else if (state == WRITING_SPACES) + { + *dest++ = CHAR_SPACE; + } + + value = temp; + } + + *dest = EOS; + return dest; +} + +u8 *ConvertIntToDecimalString(u8 *dest, s32 value) +{ + char temp[12]; + s32 length = 0; + + do + { + temp[length++] = sDigits[value % 10]; + value /= 10; + } while (value != 0); + + length--; + + while (length != -1) + { + *dest++ = temp[length]; + length--; + } + + *dest = EOS; + return dest; +} + +u8 *StringExpandPlaceholders(u8 *dest, const u8 *src) +{ + for (;;) + { + u8 c = *src++; + u8 placeholderId; + const u8 *expandedString; + u8 length; + + switch (c) + { + case PLACEHOLDER_BEGIN: + placeholderId = *src++; + expandedString = GetExpandedPlaceholder(placeholderId); + dest = StringExpandPlaceholders(dest, expandedString); + break; + case EXT_CTRL_CODE_BEGIN: + *dest++ = c; + length = GetExtCtrlCodeLength(*src); + memcpy(dest, src, length); + dest += length; + src += length; + break; + case EOS: + *dest = EOS; + return dest; + case 0xFA: + case 0xFB: + case 0xFE: + default: + *dest++ = c; + } + } +} + +u8 *StringBraille(u8 *dest, const u8 *src) +{ + u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF }; + u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF }; + + dest = StringCopy(dest, setBrailleFont); + + for (;;) + { + u8 c = *src++; + + switch (c) + { + case EOS: + *dest = c; + return dest; + case 0xFE: + dest = StringCopy(dest, gotoLine2); + break; + default: + *dest++ = c; + *dest++ = c + 0x40; + break; + } + } +} + +static const u8 *ExpandPlaceholder_UnknownStringVar(void) +{ + return gUnknownStringVar; +} + +static const u8 *ExpandPlaceholder_PlayerName(void) +{ + return gSaveBlock2.playerName; +} + +static const u8 *ExpandPlaceholder_StringVar1(void) +{ + return gStringVar1; +} + +static const u8 *ExpandPlaceholder_StringVar2(void) +{ + return gStringVar2; +} + +static const u8 *ExpandPlaceholder_StringVar3(void) +{ + return gStringVar3; +} + +static const u8 *ExpandPlaceholder_KunChan(void) +{ + if (gSaveBlock2.playerGender == MALE) + return gExpandedPlaceholder_Kun; + else + return gExpandedPlaceholder_Chan; +} + +static const u8 *ExpandPlaceholder_RivalName(void) +{ + if (gSaveBlock2.playerGender == MALE) + return gExpandedPlaceholder_May; + else + return gExpandedPlaceholder_Brendan; +} + +#define VERSION_DEPENDENT_PLACEHOLDER_LIST \ + X(Version, Ruby, Sapphire) \ + X(EvilTeam, Magma, Aqua) \ + X(GoodTeam, Aqua, Magma) \ + X(EvilLeader, Maxie, Archie) \ + X(GoodLeader, Archie, Maxie) \ + X(EvilLegendary, Groudon, Kyogre) \ + X(GoodLegendary, Kyogre, Groudon) + +#ifdef SAPPHIRE +#define X(ph, r, s) \ +static const u8 *ExpandPlaceholder_##ph(void) { return gExpandedPlaceholder_##s; } +VERSION_DEPENDENT_PLACEHOLDER_LIST +#else +#define X(ph, r, s) \ +static const u8 *ExpandPlaceholder_##ph(void) { return gExpandedPlaceholder_##r; } +VERSION_DEPENDENT_PLACEHOLDER_LIST +#endif + +#undef X + +const u8 *GetExpandedPlaceholder(u32 id) +{ + typedef const u8 *(*ExpandPlaceholderFunc)(void); + + static const ExpandPlaceholderFunc funcs[] = + { + ExpandPlaceholder_UnknownStringVar, + ExpandPlaceholder_PlayerName, + ExpandPlaceholder_StringVar1, + ExpandPlaceholder_StringVar2, + ExpandPlaceholder_StringVar3, + ExpandPlaceholder_KunChan, + ExpandPlaceholder_RivalName, + ExpandPlaceholder_Version, + ExpandPlaceholder_EvilTeam, + ExpandPlaceholder_GoodTeam, + ExpandPlaceholder_EvilLeader, + ExpandPlaceholder_GoodLeader, + ExpandPlaceholder_EvilLegendary, + ExpandPlaceholder_GoodLegendary, + }; + + if (id >= ARRAY_COUNT(funcs)) + return gExpandedPlaceholder_Empty; + else + return funcs[id](); +} + +u8 *StringFill(u8 *dest, u8 c, u16 n) +{ + u16 i; + + for (i = 0; i < n; i++) + *dest++ = c; + + *dest = EOS; + return dest; +} + +u8 *StringCopyPadded(u8 *dest, const u8 *src, u8 c, u16 n) +{ + while (*src != EOS) + { + *dest++ = *src++; + + if (n) + n--; + } + + n--; + + while (n != (u16)-1) + { + *dest++ = c; + n--; + } + + *dest = EOS; + return dest; +} + +u8 *StringFillWithTerminator(u8 *dest, u16 n) +{ + return StringFill(dest, EOS, n); +} diff --git a/src/task.c b/src/task.c new file mode 100644 index 000000000..3e8a5588c --- /dev/null +++ b/src/task.c @@ -0,0 +1,215 @@ +#include "global.h" +#include "debug.h" +#include "task.h" + +#define ACTIVE_SENTINEL 0x10 +#define HEAD_SENTINEL 0xFE +#define TAIL_SENTINEL 0xFF + +// gTasks is a queue of the active 16 tasks +struct Task gTasks[ACTIVE_SENTINEL]; + +static void InsertTask(u8 newTaskId); +static u8 FindFirstActiveTask(); + +const u8 gError_NoTasksLeft[] = _( + "TASK OVER\n" + "タスクがオーバーしました"); + +void ResetTasks() +{ + u8 taskId; + + for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) + { + gTasks[taskId].isActive = FALSE; + gTasks[taskId].func = TaskDummy; + gTasks[taskId].prev = taskId; + gTasks[taskId].next = taskId + 1; + gTasks[taskId].priority = -1; + memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data)); + } + + gTasks[0].prev = HEAD_SENTINEL; + gTasks[ACTIVE_SENTINEL - 1].next = TAIL_SENTINEL; +} + +u8 CreateTask(TaskFunc func, u8 priority) +{ + u8 taskId; + + for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) + { + if (!gTasks[taskId].isActive) + { + gTasks[taskId].func = func; + gTasks[taskId].priority = priority; + InsertTask(taskId); + memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data)); + gTasks[taskId].isActive = TRUE; + return taskId; + } + } + +#if DEBUG + Crash(gError_NoTasksLeft); +#endif + + return 0; +} + +static void InsertTask(u8 newTaskId) +{ + u8 taskId = FindFirstActiveTask(); + + if (taskId == ACTIVE_SENTINEL) + { + // The task system inserts from the top downwards starting from the end (0xFF) to 0. If FindFirstActiveTask returned the value equivalent to ACTIVE_SENTINEL, it means it is the only task because it searched the entire queue. + gTasks[newTaskId].prev = HEAD_SENTINEL; + gTasks[newTaskId].next = TAIL_SENTINEL; + return; + } + + while (1) + { + if (gTasks[newTaskId].priority < gTasks[taskId].priority) + { + // We've found a task with a higher priority value, + // so we insert the new task before it. + gTasks[newTaskId].prev = gTasks[taskId].prev; + gTasks[newTaskId].next = taskId; + + if (gTasks[taskId].prev != HEAD_SENTINEL) + gTasks[gTasks[taskId].prev].next = newTaskId; // as long as we are not at the end, insert the newTask appropriately. + + gTasks[taskId].prev = newTaskId; + return; + } + if (gTasks[taskId].next == TAIL_SENTINEL) // we did not find a space for the task, so overwrite the last task as it is the lowest priority. + { + // We've reached the end. + gTasks[newTaskId].prev = taskId; + gTasks[newTaskId].next = gTasks[taskId].next; + gTasks[taskId].next = newTaskId; + return; + } + taskId = gTasks[taskId].next; // neither the priority was lower, nor the end. check the next task. + } +} + +void DestroyTask(u8 taskId) +{ + if (gTasks[taskId].isActive) + { + gTasks[taskId].isActive = FALSE; + + if (gTasks[taskId].prev == HEAD_SENTINEL) + { + if (gTasks[taskId].next != TAIL_SENTINEL) + gTasks[gTasks[taskId].next].prev = HEAD_SENTINEL; + } + else + { + if (gTasks[taskId].next == TAIL_SENTINEL) + { + gTasks[gTasks[taskId].prev].next = TAIL_SENTINEL; + } + else + { + gTasks[gTasks[taskId].prev].next = gTasks[taskId].next; + gTasks[gTasks[taskId].next].prev = gTasks[taskId].prev; + } + } + } +} + +void RunTasks(void) +{ + u8 taskId = FindFirstActiveTask(); + + if (taskId != ACTIVE_SENTINEL) + { + do + { + gTasks[taskId].func(taskId); + taskId = gTasks[taskId].next; + } while (taskId != TAIL_SENTINEL); + } +} + +static u8 FindFirstActiveTask(void) +{ + u8 taskId; + + for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++) + if (gTasks[taskId].isActive == TRUE && gTasks[taskId].prev == HEAD_SENTINEL) + break; + + return taskId; +} + +void TaskDummy(u8 taskId) +{ +} + +#define TASK_DATA_OP(taskId, offset, op) \ +{ \ + u32 tasksAddr = (u32)gTasks; \ + u32 addr = taskId * sizeof(struct Task) + offset; \ + u32 dataAddr = tasksAddr + offsetof(struct Task, data); \ + addr += dataAddr; \ + op; \ +} + +void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc) +{ + TASK_DATA_OP(taskId, 28, *((u16 *)addr) = (u32)followupFunc) + TASK_DATA_OP(taskId, 30, *((u16 *)addr) = (u32)followupFunc >> 16) + gTasks[taskId].func = func; +} + +void SwitchTaskToFollowupFunc(u8 taskId) +{ + s32 func; + + gTasks[taskId].func = NULL; + + TASK_DATA_OP(taskId, 28, func = *((u16 *)addr)) + TASK_DATA_OP(taskId, 30, func |= *((s16 *)addr) << 16) + + gTasks[taskId].func = (TaskFunc)func; +} + +bool8 FuncIsActiveTask(TaskFunc func) +{ + u8 i; + + for (i = 0; i < ACTIVE_SENTINEL; i++) + if (gTasks[i].isActive == TRUE && gTasks[i].func == func) + return TRUE; + + return FALSE; +} + +u8 FindTaskIdByFunc(TaskFunc func) +{ + s32 i; + + for (i = 0; i < ACTIVE_SENTINEL; i++) + if (gTasks[i].isActive == TRUE && gTasks[i].func == func) + return (u8)i; + + return -1; +} + +u8 GetTaskCount(void) +{ + u8 i; + u8 count = 0; + + for (i = 0; i < ACTIVE_SENTINEL; i++) + if (gTasks[i].isActive == TRUE) + count++; + + return count; +} diff --git a/src/text.c b/src/text.c new file mode 100644 index 000000000..234e6085d --- /dev/null +++ b/src/text.c @@ -0,0 +1,4385 @@ +#include "global.h" +#include "text.h" +#include "battle.h" +#include "main.h" +#include "palette.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" + +enum +{ + WIN_STATE_END, + WIN_STATE_BEGIN, + WIN_STATE_NORMAL, + WIN_STATE_CHAR_DELAY, + WIN_STATE_PAUSE, + WIN_STATE_WAIT_BUTTON, + WIN_STATE_NEWLINE, + WIN_STATE_PLACEHOLDER, + WIN_STATE_WAIT_CLEAR, + WIN_STATE_WAIT_SCROLL, + WIN_STATE_WAIT_SOUND, +}; + +enum +{ + TEXT_MODE_UNKNOWN0, + TEXT_MODE_MONOSPACE, + TEXT_MODE_UNKNOWN2, // variable width? +}; + +enum +{ + WAIT_TYPE_NORMAL, // allows the player to interrupt the text delay with A or B + WAIT_TYPE_BATTLE, // disables interrupting the text delay if in a link battle + WAIT_TYPE_AUTOSCROLL, // disables interrupting the text delay + WAIT_TYPE_CONTEST, // disables interrupting the text delay if in a link contest +}; + +struct Font +{ + u32 type; + u8 *glyphs; + u16 glyphSize; + u16 lowerTileOffset; +}; + +struct GlyphBuffer +{ + // 0-7 left tile + // 8-15 right tile (if it exists) + u32 pixelRows[16]; + + // pixel row filled with BG color + u32 background; + + // table of color indices (not a palette) + u32 colors[16]; +}; + +struct GlyphTileInfo +{ + u8 textMode; + u8 startPixel; + u8 width; + u8 *src; + u32 *dest; + u32 *colors; +}; + +struct ShiftAmount +{ + u32 left; + u32 right; +}; + +static u16 InitVariableWidthFontTileData(struct Window *, u16); +static u16 LoadFixedWidthFont(struct Window *, u16); +static u16 LoadFixedWidthFont_Font1Latin(struct Window *, u16); +static u16 LoadFixedWidthFont_Font4Latin(struct Window *, u16); +static u16 LoadFixedWidthFont_Braille(struct Window *, u16); +static void MultistepLoadFont_LoadGlyph(struct Window *, u16, u8); +static u8 sub_8002FA0(struct Window *, const u8 *); +static u8 PrintNextChar(struct Window *); +static u8 HandleExtCtrlCode(struct Window *); +static u8 UpdateWindowText(struct Window *); +static u8 DrawGlyph_TextMode0(struct Window *, u32); +static void DrawGlyph_TextMode2(struct Window *, u32); +static void LoadFixedWidthGlyph(struct Window *, u32, u8 *); +static void WriteGlyphTilemap(struct Window *, u16, u16); +static void GetGlyphTilePointers(u8, u8, u16, u8 **, u8 **); +static u16 *GetCursorTilemapPointer(struct Window *); +static void ApplyColors_UnshadowedFont(const u8 *, u32 *, u8, u8); +static void ApplyColors_ShadowedFont(const void *, void *, u8, u8, u8); +static void SetCursorX(struct Window *, u8); +static void AddToCursorX(struct Window *, u8); +static void AddToCursorY(struct Window *, u8); +static void ClipLeft(struct Window *); +static void ClipRight(struct Window *); +static void SetWindowDefaultColors(struct Window *); +static void SetWindowBackgroundColor(struct Window *, u8); +static void SetWindowShadowColor(struct Window *, u8); +static void SetWindowForegroundColor(struct Window *, u8); +static u8 GetTextDelay(struct Window *); +static bool8 PlayerCanInterruptDelay(struct Window *); +static void ScrollWindowTextLines(struct Window *); +static void ScrollWindowTextLines_TextMode0(struct Window *); +static void DoScroll_TextMode0(struct Window *, u16); +static void ScrollWindowTextLines_TextModeMonospace(struct Window *); +static void DoScroll_TextModeMonospace(struct Window *, u16); +static void ScrollWindowTextLines_TextMode2(struct Window *); +static void DoScroll_TextMode2(struct Window *, u8); +void Text_ClearWindow(struct Window *); +static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *, u8); +static void ClearWindowTextLines_TextMode2(struct Window *, u8); +static void TryEraseDownArrow(struct Window *); +static u16 GetBlankTileNum(struct Window *); +static u8 WaitWithDownArrow(struct Window *); +static void DrawInitialDownArrow(struct Window *); +static void UpdateDownArrowAnimation(struct Window *); +static u16 GetCursorTileNum(struct Window *, u32, u32); +static s32 DrawGlyphTiles(struct Window *, u32, u32); +static void UpdateTilemap(struct Window *, u32); +static u8 GetGlyphWidth(struct Window *, u32); +static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *); + +static void PrintGlyph_TextMode0(struct Window *, u32); +static void PrintGlyph_TextMode1(struct Window *, u32); +static void PrintGlyph_TextMode2(struct Window *, u32); + +static void WriteGlyphTilemap_Font0_Font3(struct Window *, u32); +static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); +static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); +static void WriteGlyphTilemap_Font1_Font4(struct Window *, u32); +static void WriteGlyphTilemap_Font2_Font5(struct Window *, u32); +static void WriteGlyphTilemap_Font6(struct Window *, u32); + +static u8 ExtCtrlCode_Nop(struct Window *); +static u8 ExtCtrlCode_ForegroundColor(struct Window *); +static u8 ExtCtrlCode_BackgroundColor(struct Window *); +static u8 ExtCtrlCode_ShadowColor(struct Window *); +static u8 ExtCtrlCode_AllColors(struct Window *); +static u8 ExtCtrlCode_Palette(struct Window *); +static u8 ExtCtrlCode_Font(struct Window *); +static u8 ExtCtrlCode_DefaultFont(struct Window *); +static u8 ExtCtrlCode_Pause(struct Window *); +static u8 ExtCtrlCode_WaitButton(struct Window *); +static u8 ExtCtrlCode_WaitSound(struct Window *); +static u8 ExtCtrlCode_PlayBGM(struct Window *); +static u8 ExtCtrlCode_Escape(struct Window *); +static u8 ExtCtrlCode_Nop2(struct Window *); +static u8 ExtCtrlCode_SetCursorY(struct Window *); +static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *); +static u8 ExtCtrlCode_PlaySE(struct Window *); +static u8 ExtCtrlCode_Skip(struct Window *); +static u8 ExtCtrlCode_SetCursorX(struct Window *); +static u8 ExtCtrlCode_SkipTo(struct Window *); +static u8 ExtCtrlCode_Spacing(struct Window *); +static u8 ExtCtrlCode_Japanese(struct Window *); +static u8 ExtCtrlCode_Latin(struct Window *); + +static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *, u8 *, u32 *, u8); +static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *, u8 *, u32 *, u8); + +static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *, u32 *, u32 *, u8); +static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *, u32 *, u32 *, u8); + +static struct Window *sMultistepLoadFont_Window; +static u16 sMultistepLoadFont_StartOffset; +static u16 sMultistepLoadFont_Index; +static struct Window sTempWindow; +static u8 sWaitType; +static u8 sLineLength; +static struct GlyphBuffer sGlyphBuffer; + +EWRAM_DATA u16 gBGTilemapBuffers[4][0x400] = {0}; + +EWRAM_DATA u8 gStringVar1[0x100] = {0}; +EWRAM_DATA u8 gStringVar2[0x100] = {0}; +EWRAM_DATA u8 gStringVar3[0x100] = {0}; +EWRAM_DATA u8 gStringVar4[0x100] = {0}; + +extern u16 gBattleTypeFlags; +extern u8 gIsLinkContest; +extern u8 gTileBuffer[]; + +vu16 *const gBGControlRegs[] = +{ + ®_BG0CNT, + ®_BG1CNT, + ®_BG2CNT, + ®_BG3CNT, +}; + +vu16 *const gBGHOffsetRegs[] = +{ + ®_BG0HOFS, + ®_BG1HOFS, + ®_BG2HOFS, + ®_BG3HOFS, +}; + +vu16 *const gBGVOffsetRegs[] = +{ + ®_BG0VOFS, + ®_BG1VOFS, + ®_BG2VOFS, + ®_BG3VOFS, +}; + +const u16 gUnknown_081E29D8[] = { 0x100, 0x200, 0x400, 0x800 }; +const u16 gUnknown_081E29E0[] = { 0x100, 0x200, 0x400, 0x800 }; +const u16 gUnknown_081E29E8[] = { 1, 2, 4, 8 }; + +static const u8 sFont0LatinGlyphs[] = INCBIN_U8("graphics/fonts/font0_lat.1bpp"); +static const u8 sFont1LatinGlyphs[] = INCBIN_U8("graphics/fonts/font1_lat.1bpp"); +static const u8 sFont0JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font0_jpn.1bpp"); +static const u8 sFont1JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font1_jpn.1bpp"); +static const u8 sBrailleGlyphs[] = INCBIN_U8("graphics/fonts/font6_braille.1bpp"); +static const u32 sDownArrowTiles[] = INCBIN_U32("graphics/fonts/down_arrow.4bpp"); + +// clang-format off +#include "data/text/type1_map.h" +#include "data/text/type3_map.h" +#include "data/text/font1_widths.h" +#include "data/text/font4_widths.h" +#include "data/text/font0_widths.h" +#include "data/text/font3_widths.h" +// clang-format on + +const u16 gUnknownPalette_81E6692[] = INCBIN_U16("graphics/fonts/unknown_81E6692.gbapal"); +const u16 gFontDefaultPalette[] = INCBIN_U16("graphics/fonts/default.gbapal"); + +const u8 sBlankTile[8] = { 0, 0, 0, 0, 0, 0, 0, 0, }; + +static const u32 sGlyphMasks[9][8][3] = +{ + { + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + { 0xFFFFFFFF,0xFFFFFFFF,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFFFFFF0, }, + { 0x0000000F,0xFFFFFFFF,0xFFFFFF00, }, + { 0x000000FF,0xFFFFFFFF,0xFFFFF000, }, + { 0x00000FFF,0xFFFFFFFF,0xFFFF0000, }, + { 0x0000FFFF,0xFFFFFFFF,0xFFF00000, }, + { 0x000FFFFF,0xFFFFFFFF,0xFF000000, }, + { 0x00FFFFFF,0xFFFFFFFF,0xF0000000, }, + { 0x0FFFFFFF,0xFFFFFFFF,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFFFFF00, }, + { 0x0000000F,0xFFFFFFFF,0xFFFFF000, }, + { 0x000000FF,0xFFFFFFFF,0xFFFF0000, }, + { 0x00000FFF,0xFFFFFFFF,0xFFF00000, }, + { 0x0000FFFF,0xFFFFFFFF,0xFF000000, }, + { 0x000FFFFF,0xFFFFFFFF,0xF0000000, }, + { 0x00FFFFFF,0xFFFFFFFF,0x00000000, }, + { 0x0FFFFFFF,0xFFFFFFF0,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFFFF000, }, + { 0x0000000F,0xFFFFFFFF,0xFFFF0000, }, + { 0x000000FF,0xFFFFFFFF,0xFFF00000, }, + { 0x00000FFF,0xFFFFFFFF,0xFF000000, }, + { 0x0000FFFF,0xFFFFFFFF,0xF0000000, }, + { 0x000FFFFF,0xFFFFFFFF,0x00000000, }, + { 0x00FFFFFF,0xFFFFFFF0,0x00000000, }, + { 0x0FFFFFFF,0xFFFFFF00,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFFF0000, }, + { 0x0000000F,0xFFFFFFFF,0xFFF00000, }, + { 0x000000FF,0xFFFFFFFF,0xFF000000, }, + { 0x00000FFF,0xFFFFFFFF,0xF0000000, }, + { 0x0000FFFF,0xFFFFFFFF,0x00000000, }, + { 0x000FFFFF,0xFFFFFFF0,0x00000000, }, + { 0x00FFFFFF,0xFFFFFF00,0x00000000, }, + { 0x0FFFFFFF,0xFFFFF000,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFFF00000, }, + { 0x0000000F,0xFFFFFFFF,0xFF000000, }, + { 0x000000FF,0xFFFFFFFF,0xF0000000, }, + { 0x00000FFF,0xFFFFFFFF,0x00000000, }, + { 0x0000FFFF,0xFFFFFFF0,0x00000000, }, + { 0x000FFFFF,0xFFFFFF00,0x00000000, }, + { 0x00FFFFFF,0xFFFFF000,0x00000000, }, + { 0x0FFFFFFF,0xFFFF0000,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xFF000000, }, + { 0x0000000F,0xFFFFFFFF,0xF0000000, }, + { 0x000000FF,0xFFFFFFFF,0x00000000, }, + { 0x00000FFF,0xFFFFFFF0,0x00000000, }, + { 0x0000FFFF,0xFFFFFF00,0x00000000, }, + { 0x000FFFFF,0xFFFFF000,0x00000000, }, + { 0x00FFFFFF,0xFFFF0000,0x00000000, }, + { 0x0FFFFFFF,0xFFF00000,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0xF0000000, }, + { 0x0000000F,0xFFFFFFFF,0x00000000, }, + { 0x000000FF,0xFFFFFFF0,0x00000000, }, + { 0x00000FFF,0xFFFFFF00,0x00000000, }, + { 0x0000FFFF,0xFFFFF000,0x00000000, }, + { 0x000FFFFF,0xFFFF0000,0x00000000, }, + { 0x00FFFFFF,0xFFF00000,0x00000000, }, + { 0x0FFFFFFF,0xFF000000,0x00000000, }, + }, + { + { 0x00000000,0xFFFFFFFF,0x00000000, }, + { 0x0000000F,0xFFFFFFF0,0x00000000, }, + { 0x000000FF,0xFFFFFF00,0x00000000, }, + { 0x00000FFF,0xFFFFF000,0x00000000, }, + { 0x0000FFFF,0xFFFF0000,0x00000000, }, + { 0x000FFFFF,0xFFF00000,0x00000000, }, + { 0x00FFFFFF,0xFF000000,0x00000000, }, + { 0x0FFFFFFF,0xF0000000,0x00000000, }, + }, +}; + +static const struct ShiftAmount sGlyphShiftAmounts[8] = +{ + { 0, 32 }, + { 4, 28 }, + { 8, 24 }, + { 12, 20 }, + { 16, 16 }, + { 20, 12 }, + { 24, 8 }, + { 28, 4 }, +}; + +typedef void (*PrintGlyphFunc)(struct Window *, u32); + +static const PrintGlyphFunc sPrintGlyphFuncs[] = +{ + PrintGlyph_TextMode0, + PrintGlyph_TextMode1, + PrintGlyph_TextMode2, +}; + +typedef void (*WriteGlyphTilemapFunc)(struct Window *, u32); + +static const WriteGlyphTilemapFunc sWriteGlyphTilemapFuncs[] = +{ + WriteGlyphTilemap_Font0_Font3, + WriteGlyphTilemap_Font1_Font4, + WriteGlyphTilemap_Font2_Font5, + WriteGlyphTilemap_Font0_Font3, + WriteGlyphTilemap_Font1_Font4, + WriteGlyphTilemap_Font2_Font5, + WriteGlyphTilemap_Font6, +}; + +static const struct Window sDefaultWindow = { .language = GAME_LANGUAGE }; + +typedef u8 (*ExtCtrlCodeFunc)(struct Window *); + +static const ExtCtrlCodeFunc sExtCtrlCodeFuncs[] = +{ + ExtCtrlCode_Nop, + ExtCtrlCode_ForegroundColor, + ExtCtrlCode_BackgroundColor, + ExtCtrlCode_ShadowColor, + ExtCtrlCode_AllColors, + ExtCtrlCode_Palette, + ExtCtrlCode_Font, + ExtCtrlCode_DefaultFont, + ExtCtrlCode_Pause, + ExtCtrlCode_WaitButton, + ExtCtrlCode_WaitSound, + ExtCtrlCode_PlayBGM, + ExtCtrlCode_Escape, + ExtCtrlCode_Nop2, + ExtCtrlCode_SetCursorY, + ExtCtrlCode_ClearWindowTextLines, + ExtCtrlCode_PlaySE, + ExtCtrlCode_Skip, + ExtCtrlCode_SetCursorX, + ExtCtrlCode_SkipTo, + ExtCtrlCode_Spacing, + ExtCtrlCode_Japanese, + ExtCtrlCode_Latin, +}; + +extern const u32 gFont3LatinGlyphs[]; +extern const u32 gFont4LatinGlyphs[]; +extern const u32 gFont3JapaneseGlyphs[]; +extern const u32 gFont4JapaneseGlyphs[]; + +// Getting rid of the u8 recasting will make the ROM no longer match due to +// a const being required to pass the elements directly to the rodata structs. +static const struct Font sFonts[] = +{ + // Japanese fonts + { 0, (u8 *)sFont0JapaneseGlyphs, 16, 8 }, + { 1, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, + { 2, (u8 *)sFont1JapaneseGlyphs, 8, 0 }, + { 4, (u8 *)gFont3JapaneseGlyphs, 64, 512 }, + { 1, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, + { 2, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, + { 3, (u8 *)sBrailleGlyphs, 8, 0 }, + // Latin + { 0, (u8 *)sFont0LatinGlyphs, 16, 8 }, + { 1, (u8 *)sFont1LatinGlyphs, 8, 0 }, + { 2, (u8 *)sFont1LatinGlyphs, 8, 0 }, + { 0, (u8 *)gFont3LatinGlyphs, 64, 32 }, + { 1, (u8 *)gFont4LatinGlyphs, 32, 0 }, + { 2, (u8 *)gFont4LatinGlyphs, 32, 0 }, + { 3, (u8 *)sBrailleGlyphs, 8, 0 }, +}; + +static const u8 sTextSpeedDelays[] = { 6, 3, 1 }; // slow, mid, fast + +static const u8 sExtCtrlCodeLengths[] = +{ + 1, + 2, + 2, + 2, + 4, + 2, + 2, + 1, + 2, + 1, + 1, + 3, + 2, + 2, + 2, + 1, + 3, + 2, + 2, + 2, + 2, + 1, + 1, +}; + +typedef void (*ShiftGlyphTileUnshadowedFunc)(struct GlyphBuffer *, u8 *, u32 *, u8); + +static const ShiftGlyphTileUnshadowedFunc sShiftGlyphTileUnshadowedFuncs[] = +{ + ShiftGlyphTile_UnshadowedFont_Width0, + ShiftGlyphTile_UnshadowedFont_Width1, + ShiftGlyphTile_UnshadowedFont_Width2, + ShiftGlyphTile_UnshadowedFont_Width3, + ShiftGlyphTile_UnshadowedFont_Width4, + ShiftGlyphTile_UnshadowedFont_Width5, + ShiftGlyphTile_UnshadowedFont_Width6, + ShiftGlyphTile_UnshadowedFont_Width7, + ShiftGlyphTile_UnshadowedFont_Width8, +}; + +typedef void (*ShiftGlyphTileShadowedFunc)(struct GlyphBuffer *, u32 *, u32 *, u8); + +static const ShiftGlyphTileShadowedFunc sShiftGlyphTileShadowedFuncs[] = +{ + ShiftGlyphTile_ShadowedFont_Width0, + ShiftGlyphTile_ShadowedFont_Width1, + ShiftGlyphTile_ShadowedFont_Width2, + ShiftGlyphTile_ShadowedFont_Width3, + ShiftGlyphTile_ShadowedFont_Width4, + ShiftGlyphTile_ShadowedFont_Width5, + ShiftGlyphTile_ShadowedFont_Width6, + ShiftGlyphTile_ShadowedFont_Width7, + ShiftGlyphTile_ShadowedFont_Width8, +}; + +const struct WindowTemplate gWindowTemplate_81E6C3C = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 0, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6C58 = +{ + 0, // BG number + 0, // BG character base block + 24, // BG screen base block + 0, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 26, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(24), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6C74 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 1, // foreground color + 0, // background color + 3, // shadow color + 4, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + OBJ_VRAM0, // tile data + NULL, // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6C90 = +{ + 0, // BG number + 1, // BG character base block + 30, // BG screen base block + 2, // BG priority + 31, // palette number + 15, // foreground color + 0, // background color + 1, // shadow color + 4, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(1), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6CAC = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 15, // foreground color + 0, // background color + 1, // shadow color + 4, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 8, // width + 60, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6CC8 = +{ + 2, // BG number + 2, // BG character base block + 15, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6CE4 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6D00 = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 2, // foreground color + 15, // background color + 3, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6D1C = +{ + 1, // BG number + 0, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 2, // foreground color + 15, // background color + 3, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6D38 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 15, // foreground color + 0, // background color + 14, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 8, // width + 64, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6D54 = +{ + 3, // BG number + 3, // BG character base block + 15, // BG screen base block + 3, // BG priority + 2, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(3), // tile data + BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6D70 = +{ + 3, // BG number + 3, // BG character base block + 15, // BG screen base block + 3, // BG priority + 3, // palette number + 1, // foreground color + 3, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(3), // tile data + BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6D8C = +{ + 1, // BG number + 0, // BG character base block + 14, // BG screen base block + 1, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(14), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6DA8 = +{ + 0, // BG number + 0, // BG character base block + 12, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(11), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_TrainerCard_Back_Values = +{ + 0, // BG number + 2, // BG character base block + 30, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_TrainerCard_Back_Labels = +{ + 0, // BG number + 2, // BG character base block + 30, // BG screen base block + 0, // BG priority + 14, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6DFC = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6E18 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6E34 = +{ + 1, // BG number + 0, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6E50 = +{ + 0, // BG number + 2, // BG character base block + 28, // BG screen base block + 0, // BG priority + 13, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6E6C = +{ + 0, // BG number + 2, // BG character base block + 30, // BG screen base block + 0, // BG priority + 13, // palette number + 15, // foreground color + 0, // background color + 10, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6E88 = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6EA4 = +{ + 1, // BG number + 0, // BG character base block + 28, // BG screen base block + 1, // BG priority + 1, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6EC0 = +{ + 2, // BG number + 2, // BG character base block + 29, // BG screen base block + 2, // BG priority + 1, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(29), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6EDC = +{ + 1, // BG number + 0, // BG character base block + 28, // BG screen base block + 1, // BG priority + 2, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6EF8 = +{ + 2, // BG number + 2, // BG character base block + 29, // BG screen base block + 2, // BG priority + 2, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(29), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6F14 = +{ + 1, // BG number + 0, // BG character base block + 28, // BG screen base block + 1, // BG priority + 3, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6F30 = +{ + 2, // BG number + 2, // BG character base block + 29, // BG screen base block + 2, // BG priority + 3, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 8, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(29), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6F4C = +{ + 3, // BG number + 0, // BG character base block + 30, // BG screen base block + 3, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6F68 = +{ + 0, // BG number + 2, // BG character base block + 13, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(13), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6F84 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 1, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6FA0 = +{ + 1, // BG number + 0, // BG character base block + 24, // BG screen base block + 3, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(24), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6FBC = +{ + 0, // BG number + 0, // BG character base block + 30, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6FD8 = +{ + 0, // BG number + 0, // BG character base block + 24, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(24), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E6FF4 = +{ + 0, // BG number + 0, // BG character base block + 24, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(24), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7010 = +{ + 0, // BG number + 0, // BG character base block + 30, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E702C = +{ + 3, // BG number + 2, // BG character base block + 15, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7048 = +{ + 2, // BG number + 2, // BG character base block + 14, // BG screen base block + 2, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 16, // tilemap left coordinate + 0, // tilemap top coordinate + 16, // width + 32, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(14), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7064 = +{ + 2, // BG number + 2, // BG character base block + 14, // BG screen base block + 2, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(14), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7080 = +{ + 3, // BG number + 0, // BG character base block + 30, // BG screen base block + 3, // BG priority + 11, // palette number + 1, // foreground color + 15, // background color + 5, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E709C = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E70B8 = +{ + 2, // BG number + 0, // BG character base block + 30, // BG screen base block + 2, // BG priority + 11, // palette number + 1, // foreground color + 0, // background color + 5, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E70D4 = +{ + 3, // BG number + 0, // BG character base block + 30, // BG screen base block + 3, // BG priority + 11, // palette number + 1, // foreground color + 15, // background color + 5, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E70F0 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 15, // foreground color + 1, // background color + 14, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 32, // width + 32, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E710C = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 1, // BG priority + 15, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7128 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7144 = +{ + 0, // BG number + 2, // BG character base block + 31, // BG screen base block + 0, // BG priority + 13, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7160 = +{ + 1, // BG number + 1, // BG character base block + 10, // BG screen base block + 1, // BG priority + 14, // palette number + 1, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(1), // tile data + BG_SCREEN_ADDR(10), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E717C = +{ + 0, // BG number + 3, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(3), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7198 = +{ + 0, // BG number + 2, // BG character base block + 15, // BG screen base block + 0, // BG priority + 15, // palette number + 15, // foreground color + 0, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E71B4 = +{ + 0, // BG number + 2, // BG character base block + 15, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(15), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E71D0 = +{ + 1, // BG number + 1, // BG character base block + 28, // BG screen base block + 0, // BG priority + 5, // palette number + 13, // foreground color + 14, // background color + 15, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(1), // tile data + BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E71EC = +{ + 2, // BG number + 1, // BG character base block + 30, // BG screen base block + 0, // BG priority + 5, // palette number + 13, // foreground color + 14, // background color + 15, // shadow color + 3, // font + 0, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(1), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7208 = +{ + 0, // BG number + 2, // BG character base block + 28, // BG screen base block + 0, // BG priority + 8, // palette number + 1, // foreground color + 0, // background color + 2, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(28), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7224 = +{ + 0, // BG number + 0, // BG character base block + 31, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7240 = +{ + 1, // BG number + 2, // BG character base block + 30, // BG screen base block + 0, // BG priority + 15, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(30), // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E725C = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 15, // foreground color + 0, // background color + 14, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 30, // width + 20, // height + OBJ_VRAM0, // tile data + NULL, // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7278 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 3, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 16, // width + 32, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +const struct WindowTemplate gWindowTemplate_81E7294 = +{ + 0, // BG number + 0, // BG character base block + 0, // BG screen base block + 0, // BG priority + 0, // palette number + 1, // foreground color + 15, // background color + 8, // shadow color + 4, // font + 2, // text mode + 0, // spacing + 0, // tilemap left coordinate + 0, // tilemap top coordinate + 16, // width + 32, // height + gTileBuffer, // tile data + NULL, // tilemap +}; + +static void UpdateBGRegs(const struct WindowTemplate *winTemplate) +{ + u8 bgNum = winTemplate->bgNum; + *gBGHOffsetRegs[bgNum] = 0; + *gBGVOffsetRegs[bgNum] = 0; + *gBGControlRegs[bgNum] = winTemplate->priority | (winTemplate->screenBaseBlock << 8) | (winTemplate->charBaseBlock << 2); +} + +static void ClearBGMem(const struct WindowTemplate *winTemplate) +{ + CpuFastFill(0, winTemplate->tileData, 32); + + if (winTemplate->tilemap) + CpuFastFill(0, winTemplate->tilemap, 0x800); +} + +void LoadFontDefaultPalette(const struct WindowTemplate *winTemplate) +{ + LoadPalette(gFontDefaultPalette, 16 * winTemplate->paletteNum, 32); +} + +void Text_LoadWindowTemplate(const struct WindowTemplate *winTemplate) +{ + UpdateBGRegs(winTemplate); + ClearBGMem(winTemplate); + LoadFontDefaultPalette(winTemplate); +} + +u16 InitWindowTileData(struct Window *win, u16 startOffset) +{ + u16 retVal; + + win->tileDataStartOffset = startOffset; + retVal = 0; + + switch (win->template->textMode) + { + case TEXT_MODE_UNKNOWN2: + retVal = InitVariableWidthFontTileData(win, startOffset); + break; + case TEXT_MODE_MONOSPACE: + switch (win->template->fontNum) + { + case 0: + case 3: + retVal = LoadFixedWidthFont(win, startOffset); + break; + case 1: + case 2: + retVal = LoadFixedWidthFont_Font1Latin(win, startOffset); + break; + case 4: + case 5: + retVal = LoadFixedWidthFont_Font4Latin(win, startOffset); + break; + case 6: + retVal = LoadFixedWidthFont_Braille(win, startOffset); + break; + } + break; + } + + return retVal; +} + +static u16 InitVariableWidthFontTileData(struct Window *win, u16 startOffset) +{ + u8 *buffer; + + win->tileDataStartOffset = startOffset; + win->tileDataOffset = 2; + buffer = win->tileData + 32 * win->tileDataStartOffset; + CpuFastFill(0, buffer, 32); + ApplyColors_UnshadowedFont(sBlankTile, (u32 *)(buffer + 32), win->template->foregroundColor, win->template->backgroundColor); + return win->tileDataStartOffset + win->tileDataOffset + win->width * win->height; +} + +static u16 LoadFixedWidthFont(struct Window *win, u16 startOffset) +{ + s32 glyph; + u8 *buffer = win->tileData + 32 * startOffset; + for (glyph = 0; glyph < 256; glyph++) + { + LoadFixedWidthGlyph(win, glyph, buffer); + buffer += 64; + } + return 2 * glyph; +} + +static u16 LoadFixedWidthFont_Font1Latin(struct Window *win, u16 startOffset) +{ + s32 i; + u8 *buffer = win->tileData + 32 * startOffset; + for (i = 0; i < 256; i++) + { + ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); + buffer += 32; + } + return i; +} + +static u16 LoadFixedWidthFont_Font4Latin(struct Window *win, u16 startOffset) +{ + s32 i; + u8 *buffer = win->tileData + 32 * startOffset; + for (i = 0; i < 256; i++) + { + ApplyColors_ShadowedFont(&gFont4LatinGlyphs[8 * i], buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); + buffer += 32; + } + return i; +} + +static u16 LoadFixedWidthFont_Braille(struct Window *win, u16 startOffset) +{ + s32 i; + u8 *buffer = win->tileData + 32 * startOffset; + for (i = 0; i < 256; i++) + { + ApplyColors_UnshadowedFont(&sBrailleGlyphs[8 * i], (u32 *)buffer, win->foregroundColor, win->backgroundColor); + buffer += 32; + } + return i; +} + +u32 MultistepInitWindowTileData(struct Window *win, u16 startOffset) +{ + u32 retVal; + sMultistepLoadFont_Window = win; + sMultistepLoadFont_Index = 0; + sMultistepLoadFont_StartOffset = startOffset; + win->tileDataStartOffset = startOffset; + retVal = 0; + + switch (win->template->textMode) + { + case TEXT_MODE_UNKNOWN2: + retVal = InitVariableWidthFontTileData(win, startOffset); + break; + case TEXT_MODE_MONOSPACE: + retVal = 256; + if (win->template->fontNum == 0 + || win->template->fontNum == 3) + retVal *= 2; + break; + } + + return retVal; +} + +bool32 MultistepLoadFont(void) +{ + bool32 retVal = TRUE; + + if (sMultistepLoadFont_Window->template->textMode == TEXT_MODE_MONOSPACE) + { + s32 i; + + for (i = sMultistepLoadFont_Index; i < sMultistepLoadFont_Index + 16; i++) + MultistepLoadFont_LoadGlyph(sMultistepLoadFont_Window, sMultistepLoadFont_StartOffset, i); + + sMultistepLoadFont_Index += 16; + + if (sMultistepLoadFont_Index < 256) + retVal = FALSE; + } + + return retVal; +} + +static void MultistepLoadFont_LoadGlyph(struct Window *win, u16 startOffset, u8 glyph) +{ + u8 *buffer; + + switch (win->template->fontNum) + { + case 0: + case 3: + buffer = win->tileData + 32 * startOffset + 64 * glyph; + LoadFixedWidthGlyph(win, glyph, buffer); + break; + case 1: + case 2: + buffer = win->tileData + 32 * (glyph + startOffset); + ApplyColors_UnshadowedFont( + &sFont1LatinGlyphs[8 * glyph], + (u32 *)buffer, + win->foregroundColor, + win->backgroundColor); + break; + case 4: + case 5: + buffer = win->tileData + 32 * (glyph + startOffset); + ApplyColors_ShadowedFont( + &gFont4LatinGlyphs[8 * glyph], + buffer, + win->foregroundColor, + win->shadowColor, + win->backgroundColor); + break; + } +} + +void EmptyFunc(void) +{ +} + +void Text_InitWindowWithTemplate(struct Window *win, const struct WindowTemplate *winTemplate) +{ + *win = sDefaultWindow; + win->template = (struct WindowTemplate *)winTemplate; + win->textMode = winTemplate->textMode; + win->spacing = winTemplate->spacing; + win->fontNum = winTemplate->fontNum; + win->paletteNum = winTemplate->paletteNum; + win->tilemapLeft = winTemplate->tilemapLeft; + win->tilemapTop = winTemplate->tilemapTop; + win->width = winTemplate->width; + win->height = winTemplate->height; + win->tileData = winTemplate->tileData; + win->tilemap = winTemplate->tilemap; + SetWindowDefaultColors(win); + SetWindowBackgroundColor(win, winTemplate->backgroundColor); + SetWindowShadowColor(win, winTemplate->shadowColor); + SetWindowForegroundColor(win, winTemplate->foregroundColor); +} + +void Text_InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + const struct WindowTemplate *winTemplate = win->template; + win->textMode = winTemplate->textMode; + win->fontNum = winTemplate->fontNum; + win->language = GAME_LANGUAGE; + win->paletteNum = winTemplate->paletteNum; + win->win_field_B = 0; + win->win_field_C = 0; + win->delayCounter = 0; + win->spacing = winTemplate->spacing; + win->win_field_F = 0; + win->tilemapLeft = winTemplate->tilemapLeft; + win->tilemapTop = winTemplate->tilemapTop; + win->width = winTemplate->width; + win->height = winTemplate->height; + win->text = text; + win->textIndex = 0; + win->tileDataStartOffset = tileDataStartOffset; + win->tileDataOffset = 0; + win->left = 8 * left; + win->cursorX = 0; + win->top = 8 * top; + win->cursorY = 0; + win->state = WIN_STATE_BEGIN; + win->downArrowCounter = 0; + win->tileData = winTemplate->tileData; + win->tilemap = winTemplate->tilemap; + SetWindowDefaultColors(win); + SetWindowBackgroundColor(win, winTemplate->backgroundColor); + SetWindowShadowColor(win, winTemplate->shadowColor); + SetWindowForegroundColor(win, winTemplate->foregroundColor); +} + +void Text_InitWindow8002E4C(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) +{ + u8 val; + + Text_InitWindow(win, text, tileDataStartOffset, 0, 0); + win->left = left; + win->top = top; + val = 0; + if (a6) + val = 255; + win->win_field_F = val; + if (val) + ClipLeft(win); +} + +void Text_SetWindowText(struct Window *win, const u8 *text) +{ + win->state = WIN_STATE_NORMAL; + win->text = text; + win->textIndex = 0; + win->downArrowCounter = 0; + win->win_field_B = -1; + win->win_field_C = 0; + win->delayCounter = 0; +} + +void Text_InitWindow8002EB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + gMain.watchedKeysMask = A_BUTTON | B_BUTTON; + gMain.watchedKeysPressed = 0; + sWaitType = WAIT_TYPE_NORMAL; + sLineLength = 26; + Text_InitWindow(win, text, tileDataStartOffset, left, top); + win->win_field_B = -1; + if (win->textMode == TEXT_MODE_UNKNOWN0) + { + u16 val = GetCursorTileNum(win, 0, 0); + u8 *buffer = win->tileData + 32 * val; + ApplyColors_UnshadowedFont(sBlankTile, (u32 *)buffer, win->backgroundColor, win->backgroundColor); + ApplyColors_UnshadowedFont(&sFont1LatinGlyphs[8 * 0x6E], (u32 *)(buffer + 32), win->foregroundColor, win->backgroundColor); + win->tileDataOffset = 2; + } +} + +u8 Text_PrintWindow8002F44(struct Window *win) +{ + while (win->state != WIN_STATE_END) + { + if (win->state == WIN_STATE_NEWLINE) + { + AddToCursorY(win, 16); + win->cursorX = 0; + if (win->win_field_F) + ClipLeft(win); + win->state = WIN_STATE_NORMAL; + } + else if (win->state == WIN_STATE_PLACEHOLDER) + { + sub_8002FA0(win, GetExpandedPlaceholder(win->text[win->textIndex++])); + } + + PrintNextChar(win); + } + return 1; +} + +static u8 sub_8002FA0(struct Window *win, const u8 *text) +{ + u8 retVal; + u8 savedLanguage = win->language; + const u8 *savedText = win->text; + + u16 savedTextIndex = win->textIndex; + win->text = text; + win->textIndex = 0; + win->state = WIN_STATE_NORMAL; + retVal = Text_PrintWindow8002F44(win); + win->text = savedText; + win->textIndex = savedTextIndex; + win->state = WIN_STATE_NORMAL; + win->language = savedLanguage; + return retVal; +} + +static u8 PrintNextChar(struct Window *win) +{ + u8 c = win->text[win->textIndex++]; + + // Handle special control characters + switch (c) + { + case EOS: + ClipRight(win); + win->state = WIN_STATE_END; + return 0; + case PLACEHOLDER_BEGIN: + win->state = WIN_STATE_PLACEHOLDER; + return 2; + case CHAR_NEWLINE: + ClipRight(win); + win->state = WIN_STATE_NEWLINE; + return 2; + case CHAR_PROMPT_CLEAR: + DrawInitialDownArrow(win); + win->state = WIN_STATE_WAIT_CLEAR; + return 2; + case CHAR_PROMPT_SCROLL: + DrawInitialDownArrow(win); + win->state = WIN_STATE_WAIT_SCROLL; + return 2; + case EXT_CTRL_CODE_BEGIN: + return HandleExtCtrlCode(win); + } + + sPrintGlyphFuncs[win->textMode](win, c); + return 1; +} + +// Extended 0xFC control functions + +static u8 HandleExtCtrlCode(struct Window *win) +{ + return sExtCtrlCodeFuncs[win->text[win->textIndex++]](win); +} + +static u8 ExtCtrlCode_Nop(struct Window *win) +{ + return 2; +} + +static u8 ExtCtrlCode_ForegroundColor(struct Window *win) +{ + SetWindowForegroundColor(win, win->text[win->textIndex++]); + return 2; +} + +static u8 ExtCtrlCode_BackgroundColor(struct Window *win) +{ + SetWindowBackgroundColor(win, win->text[win->textIndex++]); + return 2; +} + +static u8 ExtCtrlCode_ShadowColor(struct Window *win) +{ + SetWindowShadowColor(win, win->text[win->textIndex++]); + return 2; +} + +static u8 ExtCtrlCode_AllColors(struct Window *win) +{ + SetWindowForegroundColor(win, win->text[win->textIndex++]); + SetWindowBackgroundColor(win, win->text[win->textIndex++]); + SetWindowShadowColor(win, win->text[win->textIndex++]); + return 2; +} + +static u8 ExtCtrlCode_Palette(struct Window *win) +{ + win->paletteNum = win->text[win->textIndex++]; + return 2; +} + +static u8 ExtCtrlCode_Font(struct Window *win) +{ + win->fontNum = win->text[win->textIndex++]; + return 2; +} + +static u8 ExtCtrlCode_DefaultFont(struct Window *win) +{ + win->fontNum = win->template->fontNum; + return 2; +} + +static u8 ExtCtrlCode_Pause(struct Window *win) +{ + ClipRight(win); + win->state = WIN_STATE_PAUSE; + win->delayCounter = win->text[win->textIndex++]; + return 2; +} + +static u8 ExtCtrlCode_WaitButton(struct Window *win) +{ + ClipRight(win); + win->state = WIN_STATE_WAIT_BUTTON; + return 2; +} + +static u8 ExtCtrlCode_WaitSound(struct Window *win) +{ + ClipRight(win); + win->state = WIN_STATE_WAIT_SOUND; + return 2; +} + +static u8 ExtCtrlCode_PlayBGM(struct Window *win) +{ + u16 loByte = win->text[win->textIndex++]; + u16 hiByte = win->text[win->textIndex++] << 8; + PlayBGM(loByte | hiByte); + return 2; +} + +static u8 ExtCtrlCode_Escape(struct Window *win) +{ + sPrintGlyphFuncs[win->textMode](win, win->text[win->textIndex++]); + return 1; +} + +u8 ExtCtrlCode_Nop2(struct Window *win) +{ + return 1; +} + +static u8 ExtCtrlCode_SetCursorY(struct Window *win) +{ + ClipRight(win); + AddToCursorY(win, 8 * win->text[win->textIndex++]); + return 1; +} + +static u8 ExtCtrlCode_ClearWindowTextLines(struct Window *win) +{ + Text_ClearWindow(win); + return 2; +} + +static u8 ExtCtrlCode_PlaySE(struct Window *win) +{ + u16 loByte = win->text[win->textIndex++]; + u16 hiByte = win->text[win->textIndex++] << 8; + PlaySE(loByte | hiByte); + return 2; +} + +static void DrawSpace(struct Window *win) +{ + if (win->textMode == TEXT_MODE_MONOSPACE || (win->left + win->cursorX) & 7 || win->spacing <= 7) + { + sPrintGlyphFuncs[win->textMode](win, 0); + } + else + { + u32 val = sGlyphBuffer.background; + u16 index = GetCursorTileNum(win, 0, 0); + u32 *buffer = (u32 *)(win->tileData + 32 * index); + buffer[0] = val; + buffer[1] = val; + buffer[2] = val; + buffer[3] = val; + buffer[4] = val; + buffer[5] = val; + buffer[6] = val; + buffer[7] = val; + index = GetCursorTileNum(win, 0, 1); + buffer = (u32 *)(win->tileData + 32 * index); + buffer[0] = val; + buffer[1] = val; + buffer[2] = val; + buffer[3] = val; + buffer[4] = val; + buffer[5] = val; + buffer[6] = val; + buffer[7] = val; + UpdateTilemap(win, 1); + AddToCursorX(win, 8); + } +} + +static void sub_8003344(struct Window *win, u8 newX) +{ + u8 savedSpacing = win->spacing; + + if (newX - win->cursorX <= 8) + win->spacing = newX - win->cursorX; + else + win->spacing = 8 - ((win->left + win->cursorX) & 7); + + while (win->cursorX < newX) + { + s32 spacing; + DrawSpace(win); + spacing = newX - win->cursorX; + if (spacing >= 8) + spacing = 8; + win->spacing = spacing; + } + + win->spacing = savedSpacing; +} + +static u8 ExtCtrlCode_Skip(struct Window *win) +{ + sub_8003344(win, win->cursorX + win->text[win->textIndex++]); + return 1; +} + +static u8 ExtCtrlCode_SetCursorX(struct Window *win) +{ + ClipRight(win); + SetCursorX(win, win->text[win->textIndex++]); + return 1; +} + +static u8 ExtCtrlCode_SkipTo(struct Window *win) +{ + sub_8003344(win, win->text[win->textIndex++]); + return 1; +} + +static u8 ExtCtrlCode_Spacing(struct Window *win) +{ + win->spacing = win->text[win->textIndex++]; + return 2; +} + +static u8 ExtCtrlCode_Japanese(struct Window *win) +{ + win->language = LANGUAGE_JAPANESE; + return 2; +} + +static u8 ExtCtrlCode_Latin(struct Window *win) +{ + win->language = GAME_LANGUAGE; + return 2; +} + +// Prints the window text without expanding any placeholders +u8 Text_PrintWindowSimple(struct Window *win) +{ + u8 retVal = 1; + while (win->state != WIN_STATE_END) + { + if (win->state == WIN_STATE_NEWLINE) + { + AddToCursorY(win, 16); + win->cursorX = 0; + if (win->win_field_F) + ClipLeft(win); + win->state = WIN_STATE_NORMAL; + } + if (PrintNextChar(win) == 1) + { + retVal = 0; + break; + } + } + return retVal; +} + +u8 Text_InitWindowAndPrintText(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + Text_InitWindow(win, text, tileDataStartOffset, left, top); + return Text_PrintWindow8002F44(win); +} + +u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 top) +{ + u8 retVal; + u8 text[2]; + text[0] = c; + text[1] = EOS; + Text_InitWindow(win, text, tileDataStartOffset, left, top); + retVal = PrintNextChar(win); + ClipRight(win); + return retVal; +} + +void sub_80034D4(u8 *tileData, const u8 *text) +{ + Text_InitWindow8004E3C(&gWindowTemplate_81E6C74, tileData, text); +} + +u8 sub_80034EC(u8 *str) +{ + return Text_GetStringWidthFromWindowTemplate((struct WindowTemplate *)&gWindowTemplate_81E6C74, str); +} + +u8 *sub_8003504(u8 *dest, s32 value, u8 alignAmount, u8 alignType) +{ + sTempWindow.template = (struct WindowTemplate *)&gWindowTemplate_81E6C74; + Text_InitWindow(&sTempWindow, 0, 0, 0, 0); + return AlignInt2(&sTempWindow, dest, value, alignAmount, alignType); +} + +u8 *sub_8003558(u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) +{ + sTempWindow.template = (struct WindowTemplate *)&gWindowTemplate_81E6C74; + Text_InitWindow(&sTempWindow, src, 0, 0, 0); + return AlignString(&sTempWindow, dest, src, alignAmount, alignType); +} + +// Updates the window text +// The text delay can be accelerated by holding the A button +u8 Text_UpdateWindow(struct Window *win) +{ + sWaitType = WAIT_TYPE_NORMAL; + return UpdateWindowText(win); +} + +// Returns TRUE when all of the text has been printed. +static u8 UpdateWindowText(struct Window *win) +{ + switch (win->state) + { + case WIN_STATE_WAIT_BUTTON: + if (PlayerCanInterruptDelay(win)) + { + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PlaySE(SE_SELECT); + } + else + { + return FALSE; + } + } + else + { + win->delayCounter--; + if (win->delayCounter) + return FALSE; + } + win->state = WIN_STATE_NORMAL; + return FALSE; + case WIN_STATE_CHAR_DELAY: + // Allow the player to speed up text by holding a button + if (PlayerCanInterruptDelay(win) + && (gMain.heldKeys & (A_BUTTON | B_BUTTON)) + && gMain.watchedKeysPressed == TRUE) + { + win->delayCounter = 0; + win->state = WIN_STATE_NORMAL; + break; + } + // fall through + case WIN_STATE_PAUSE: + // Wait for timer to expire, then continue printing + if (win->delayCounter) + { + win->delayCounter--; + if (win->delayCounter) + return FALSE; + } + win->state = WIN_STATE_NORMAL; + break; + case WIN_STATE_WAIT_CLEAR: + // Erase the text once a button is pressed + if (WaitWithDownArrow(win)) + { + Text_ClearWindow(win); + win->state = WIN_STATE_NORMAL; + asm(""); + } + return FALSE; + case WIN_STATE_WAIT_SCROLL: + // Scroll the text once a button is pressed + if (WaitWithDownArrow(win)) + { + ScrollWindowTextLines(win); + win->state = WIN_STATE_NORMAL; + asm(""); + } + return FALSE; + case WIN_STATE_PLACEHOLDER: + win->textIndex++; + win->state = WIN_STATE_NORMAL; + break; + case WIN_STATE_NEWLINE: + ScrollWindowTextLines(win); + win->state = WIN_STATE_NORMAL; + asm(""); + return FALSE; + case WIN_STATE_BEGIN: + Text_ClearWindow(win); + break; + case WIN_STATE_WAIT_SOUND: + if (IsSEPlaying()) + return FALSE; + win->state = WIN_STATE_NORMAL; + break; + case WIN_STATE_END: + return TRUE; // done printing text + case WIN_STATE_NORMAL: + break; + default: + win->state = WIN_STATE_END; + return TRUE; + } + + PrintNextChar(win); + + switch (win->state) + { + case WIN_STATE_END: + return TRUE; // done printing text + case WIN_STATE_WAIT_BUTTON: + case WIN_STATE_WAIT_CLEAR: + case WIN_STATE_WAIT_SCROLL: + if (PlayerCanInterruptDelay(win)) + return 0; + win->delayCounter = 60; + break; + case WIN_STATE_PAUSE: + case WIN_STATE_NEWLINE: + case WIN_STATE_WAIT_SOUND: + break; + default: + win->state = WIN_STATE_CHAR_DELAY; + win->delayCounter = GetTextDelay(win); + break; + } + + return 0; +} + +#if defined(ENGLISH) +#define SUB_800374C_LINE_LENGTH 26 +#elif defined(GERMAN) +#define SUB_800374C_LINE_LENGTH 27 +#endif + +u8 Text_UpdateWindowInBattle(struct Window *win) +{ + u8 retVal; + + sWaitType = WAIT_TYPE_BATTLE; + sLineLength = SUB_800374C_LINE_LENGTH; + retVal = UpdateWindowText(win); + sLineLength = 26; + sWaitType = WAIT_TYPE_NORMAL; + return retVal; +} + +u8 Text_UpdateWindowAutoscroll(struct Window *win) +{ + u8 retVal; + + sWaitType = WAIT_TYPE_AUTOSCROLL; + sLineLength = 26; + retVal = UpdateWindowText(win); + sWaitType = WAIT_TYPE_NORMAL; + return retVal; +} + +u8 Text_UpdateWindowInContest(struct Window *win) +{ + u8 retVal; + + sWaitType = WAIT_TYPE_CONTEST; + sLineLength = 17; + retVal = UpdateWindowText(win); + sLineLength = 26; + return retVal; +} + +u32 Text_UpdateWindowOverrideLineLength(struct Window *win, u8 lineLength) +{ + u8 retVal; + + sWaitType = WAIT_TYPE_NORMAL; + sLineLength = lineLength; + retVal = UpdateWindowText(win); + sLineLength = 26; + return retVal; +} + +static void PrintGlyph_TextMode0(struct Window *win, u32 glyph) +{ + AddToCursorX(win, DrawGlyph_TextMode0(win, glyph)); + if (win->win_field_B) + ClipRight(win); +} + +static u8 DrawGlyph_TextMode0(struct Window *win, u32 glyph) +{ + u8 pixelsWidth = GetGlyphWidth(win, glyph); + u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); + UpdateTilemap(win, tilesWidth); + return pixelsWidth; +} + +static void PrintGlyph_TextMode1(struct Window *win, u32 glyph) +{ + sWriteGlyphTilemapFuncs[win->fontNum](win, glyph); + win->cursorX += 8; +} + +static void WriteGlyphTilemap_Font0_Font3(struct Window *win, u32 glyph) +{ + s16 val = win->tileDataStartOffset + 2 * glyph; + WriteGlyphTilemap(win, val, val + 1); +} + +static void WriteGlyphTilemap_Font1_Font4(struct Window *win, u32 glyph) +{ + u32 val = glyph * 2; + WriteGlyphTilemap( + win, + win->tileDataStartOffset + sFontType1Map[val], + win->tileDataStartOffset + sFontType1Map[val + 1]); +} + +static void WriteGlyphTilemap_Font2_Font5(struct Window *win, u32 glyph) +{ + WriteGlyphTilemap( + win, + win->tileDataStartOffset + 212, + win->tileDataStartOffset + glyph); +} + +static void WriteGlyphTilemap_Font6(struct Window *win, u32 glyph) +{ + u32 val = glyph * 2; + WriteGlyphTilemap( + win, + win->tileDataStartOffset + sFontType3Map[val], + win->tileDataStartOffset + sFontType3Map[val + 1]); +} + +static void PrintGlyph_TextMode2(struct Window *win, u32 glyph) +{ + u8 width = GetGlyphWidth(win, glyph); + DrawGlyph_TextMode2(win, glyph); + AddToCursorX(win, width); + if (win->win_field_B) + ClipRight(win); +} + +static void DrawGlyph_TextMode2(struct Window *win, u32 glyph) +{ + u8 pixelsWidth = GetGlyphWidth(win, glyph); + u32 tilesWidth = DrawGlyphTiles(win, glyph, pixelsWidth); + UpdateTilemap(win, tilesWidth); +} + +static void LoadFixedWidthGlyph(struct Window *win, u32 glyph, u8 *dest) +{ + u8 *upperTile; + u8 *lowerTile; + + GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); + + switch (win->fontNum) + { + case 0: + case 1: + case 2: + case 6: + ApplyColors_UnshadowedFont(upperTile, (u32 *)dest, win->foregroundColor, win->backgroundColor); + ApplyColors_UnshadowedFont(lowerTile, (u32 *)(dest + 32), win->foregroundColor, win->backgroundColor); + break; + case 3: + case 4: + case 5: + ApplyColors_ShadowedFont(upperTile, dest, win->foregroundColor, win->shadowColor, win->backgroundColor); + ApplyColors_ShadowedFont(lowerTile, dest + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); + break; + } +} + +static void WriteGlyphTilemap(struct Window *win, u16 upperTileNum, u16 lowerTileNum) +{ + u16 *buffer = GetCursorTilemapPointer(win); + if (buffer) + { + u16 palette = (win->paletteNum << 12); + buffer[0] = upperTileNum | palette; + buffer[32] = lowerTileNum | palette; + } +} + +static void GetGlyphTilePointers(u8 fontNum, u8 language, u16 glyph, u8 **upperTilePtr, u8 **lowerTilePtr) +{ + u16 index; + const struct Font *font; + + if (language == LANGUAGE_JAPANESE) + language = 0; + else + language = 7; + + font = &sFonts[language + fontNum]; + + switch (font->type) + { + case 0: + *upperTilePtr = font->glyphs + glyph * font->glyphSize; + *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; + break; + case 1: + index = 2 * glyph; + *upperTilePtr = font->glyphs + sFontType1Map[index] * font->glyphSize; + *lowerTilePtr = font->glyphs + sFontType1Map[index + 1] * font->glyphSize; + break; + case 2: + *upperTilePtr = font->glyphs + 212 * font->glyphSize; + *lowerTilePtr = font->glyphs + glyph * font->glyphSize; + break; + case 3: + index = 2 * glyph; + *upperTilePtr = font->glyphs + sFontType3Map[index] * font->glyphSize; + *lowerTilePtr = font->glyphs + sFontType3Map[index + 1] * font->glyphSize; + break; + case 4: + *upperTilePtr = font->glyphs + + (glyph & 0xFFF0) * font->glyphSize + + (((glyph &= 0xF) * font->glyphSize) >> 1); + *lowerTilePtr = *upperTilePtr + font->lowerTileOffset; + break; + } +} + +static u16 *GetCursorTilemapPointer(struct Window *win) +{ + u16 *ptr = NULL; + if (win->tilemap) + { + u8 x = ((win->left + win->cursorX) >> 3) + win->tilemapLeft; + u8 y = ((win->top + win->cursorY) >> 3) + win->tilemapTop; + ptr = &win->tilemap[(y * 32) + x]; + } + return ptr; +} + +static void ApplyColors_UnshadowedFont(const u8 *src, u32 *dest, u8 foreground, u8 background) +{ + u32 a[2]; + s32 i; + const u8 *srcRows = src; + + a[0] = background; + a[1] = foreground; + + for (i = 0; i < 8; i++) + { + u32 destRow = a[srcRows[i] & 1] + | (a[(srcRows[i] >> 1) & 1] << 4) + | (a[(srcRows[i] >> 2) & 1] << 8) + | (a[(srcRows[i] >> 3) & 1] << 12) + | (a[(srcRows[i] >> 4) & 1] << 16) + | (a[(srcRows[i] >> 5) & 1] << 20) + | (a[(srcRows[i] >> 6) & 1] << 24) + | (a[(srcRows[i] >> 7) ] << 28); + dest[i] = destRow; + } +} + +static void ApplyColors_ShadowedFont(const void *src, void *dest, u8 foreground, u8 shadow, u8 background) +{ + u32 a[0x10]; + s32 i; + const u32 *curSrc; + u32 *curDest; + u32 colorMask; + + a[0x1] = 0x1; + a[0x2] = 0x2; + a[0x3] = 0x3; + a[0x4] = 0x4; + a[0x5] = 0x5; + a[0x6] = 0x6; + a[0x7] = 0x7; + a[0x8] = 0x8; + a[0x9] = 0x9; + a[0xA] = 0xA; + a[0xB] = 0xB; + a[0xC] = 0xC; + a[0xD] = 0xD; + a[0x0] = background; + a[0xE] = shadow; + a[0xF] = foreground; + + colorMask = 0xF; + + curSrc = src; + curDest = dest; + + for (i = 7; i >= 0; i--) + { + u32 row = *curSrc++; + u32 recoloredRow = a[row & colorMask] + | (a[(row >> 4) & colorMask] << 4) + | (a[(row >> 8) & colorMask] << 8) + | (a[(row >> 12) & colorMask] << 12) + | (a[(row >> 16) & colorMask] << 16) + | (a[(row >> 20) & colorMask] << 20) + | (a[(row >> 24) & colorMask] << 24) + | (a[(row >> 28) ] << 28); + *curDest++ = recoloredRow; + } +} + +static void SetCursorX(struct Window *win, u8 x) +{ + if (win->textMode == TEXT_MODE_UNKNOWN0 && ((win->left + win->cursorX) & 7)) + win->tileDataOffset += 2; + win->cursorX = x; +} + +static void AddToCursorX(struct Window *win, u8 deltaX) +{ + if (win->textMode == TEXT_MODE_UNKNOWN0) + { + u8 x = win->cursorX; + win->cursorX += deltaX; + if (((win->left + win->cursorX) & 0xF8) != ((win->left + x) & 0xF8)) + win->tileDataOffset += 2; + } + else + { + win->cursorX += deltaX; + } +} + +static void AddToCursorY(struct Window *win, u8 deltaY) +{ + if (win->textMode == TEXT_MODE_UNKNOWN0 && ((win->left + win->cursorX) & 7)) + win->tileDataOffset += 2; + win->cursorY += deltaY; +} + +static void EraseAtCursor(struct Window *win) +{ + switch (win->textMode) + { + case TEXT_MODE_UNKNOWN0: + case TEXT_MODE_UNKNOWN2: + DrawGlyphTiles(win, 0, 8); + break; + case TEXT_MODE_MONOSPACE: + sWriteGlyphTilemapFuncs[win->fontNum](win, 0); + break; + } +} + +static void ClipLeft(struct Window *win) +{ + u32 pixel = win->left & 7; + + if (win->textMode != TEXT_MODE_MONOSPACE && pixel) + { + const u32 *masks = sGlyphMasks[8][pixel]; + u32 outsideMask = masks[0]; + u32 insideMask = ~outsideMask; + u32 outside = sGlyphBuffer.background & outsideMask; + u16 tileNum = GetCursorTileNum(win, 0, 0); + u32 *buffer = (u32 *)(win->tileData + 32 * tileNum); + buffer[0] = (buffer[0] & insideMask) | outside; + buffer[1] = (buffer[1] & insideMask) | outside; + buffer[2] = (buffer[2] & insideMask) | outside; + buffer[3] = (buffer[3] & insideMask) | outside; + buffer[4] = (buffer[4] & insideMask) | outside; + buffer[5] = (buffer[5] & insideMask) | outside; + buffer[6] = (buffer[6] & insideMask) | outside; + buffer[7] = (buffer[7] & insideMask) | outside; + tileNum = GetCursorTileNum(win, 0, 1); + buffer = (u32 *)(win->tileData + 32 * tileNum); + buffer[0] = (buffer[0] & insideMask) | outside; + buffer[1] = (buffer[1] & insideMask) | outside; + buffer[2] = (buffer[2] & insideMask) | outside; + buffer[3] = (buffer[3] & insideMask) | outside; + buffer[4] = (buffer[4] & insideMask) | outside; + buffer[5] = (buffer[5] & insideMask) | outside; + buffer[6] = (buffer[6] & insideMask) | outside; + buffer[7] = (buffer[7] & insideMask) | outside; + } +} + +static void ClipRight(struct Window *win) +{ + register u8 cursorX asm("r0") = win->cursorX; + u8 left = win->left; + u32 pixelX = (cursorX + left) & 7; + + if (win->textMode != TEXT_MODE_MONOSPACE && pixelX != 0) + { + const u32 *masks = sGlyphMasks[8 - pixelX][pixelX]; + u32 insideMask = masks[0]; + u32 outside = (sGlyphBuffer.background & ~insideMask); + u16 tileNum; + u32 *tileData; + + tileNum = GetCursorTileNum(win, 0, 0); + tileData = (u32 *)(win->tileData + 32 * tileNum); + + tileData[0] = (tileData[0] & insideMask) | outside; + tileData[1] = (tileData[1] & insideMask) | outside; + tileData[2] = (tileData[2] & insideMask) | outside; + tileData[3] = (tileData[3] & insideMask) | outside; + tileData[4] = (tileData[4] & insideMask) | outside; + tileData[5] = (tileData[5] & insideMask) | outside; + tileData[6] = (tileData[6] & insideMask) | outside; + tileData[7] = (tileData[7] & insideMask) | outside; + + tileNum = GetCursorTileNum(win, 0, 1); + tileData = (u32 *)(win->tileData + 32 * tileNum); + + tileData[0] = (tileData[0] & insideMask) | outside; + tileData[1] = (tileData[1] & insideMask) | outside; + tileData[2] = (tileData[2] & insideMask) | outside; + tileData[3] = (tileData[3] & insideMask) | outside; + tileData[4] = (tileData[4] & insideMask) | outside; + tileData[5] = (tileData[5] & insideMask) | outside; + tileData[6] = (tileData[6] & insideMask) | outside; + tileData[7] = (tileData[7] & insideMask) | outside; + + UpdateTilemap(win, 1); + } +} + +static void SetWindowDefaultColors(struct Window *win) +{ + u32 i; + + win->backgroundColor = 0; + win->shadowColor = 14; + win->foregroundColor = 15; + + for (i = 0; i < 16; i++) + sGlyphBuffer.colors[i] = i; +} + +static void SetWindowBackgroundColor(struct Window *win, u8 color) +{ + u32 val1; + u32 val2; + u32 val3; + win->backgroundColor = color; + sGlyphBuffer.colors[0] = color; + val1 = color | (color << 4); + val2 = val1 | (val1 << 8); + val3 = val2 | (val2 << 16); + sGlyphBuffer.background = val3; +} + +static void SetWindowShadowColor(struct Window *win, u8 color) +{ + win->shadowColor = color; + sGlyphBuffer.colors[14] = color; +} + +static void SetWindowForegroundColor(struct Window *win, u8 color) +{ + win->foregroundColor = color; + sGlyphBuffer.colors[15] = color; +} + +static u8 GetTextDelay(struct Window *win) +{ + if (!PlayerCanInterruptDelay(win)) + return 3; + + return sTextSpeedDelays[gSaveBlock2.optionsTextSpeed]; +} + +static bool8 PlayerCanInterruptDelay(struct Window *win) +{ + bool8 retVal = TRUE; + + switch (sWaitType) + { + case WAIT_TYPE_AUTOSCROLL: + retVal = FALSE; + break; + case WAIT_TYPE_CONTEST: + retVal = gIsLinkContest ? FALSE : TRUE; + break; + case WAIT_TYPE_BATTLE: + retVal = (gBattleTypeFlags & BATTLE_TYPE_LINK) ? FALSE : TRUE; + break; + } + + return retVal; +} + +static void ScrollWindowTextLines(struct Window *win) +{ + switch (win->textMode) + { + case TEXT_MODE_UNKNOWN0: + ScrollWindowTextLines_TextMode0(win); + break; + case TEXT_MODE_MONOSPACE: + ScrollWindowTextLines_TextModeMonospace(win); + break; + case TEXT_MODE_UNKNOWN2: + ScrollWindowTextLines_TextMode2(win); + break; + } +} + +static void ScrollWindowTextLines_TextMode0(struct Window *win) +{ + if (win->cursorY == 0) + { + // Advance to the next line + win->tileDataOffset = 2 * sLineLength + 2; + win->cursorX = 0; + win->cursorY += 16; + } + else + { + if (win->win_field_C & 2) + win->tileDataOffset = 2 * sLineLength + 2; + else + win->tileDataOffset = 2; + win->win_field_C ^= 2; + win->cursorX = 0; + DoScroll_TextMode0(win, sLineLength); + } +} + +static void DoScroll_TextMode0(struct Window *win, u16 lineLength) +{ + u16 *buffer = win->tilemap; + u32 val1 = 32 * (win->top >> 3); + u32 val2 = (win->left >> 3); + u16 fill; + buffer += val1 + val2; + fill = (win->paletteNum << 12) | GetBlankTileNum(win); + + // Move the bottom line up + CpuCopy16(buffer + 64, buffer, lineLength * 2); + CpuCopy16(buffer + 96, buffer + 32, lineLength * 2); + + // Clear the bottom line + CpuFill16(fill, buffer + 64, lineLength * 2); + CpuFill16(fill, buffer + 96, lineLength * 2); +} + +static void ScrollWindowTextLines_TextModeMonospace(struct Window *win) +{ + if (win->cursorY == 0) + { + // Advance to the next line + win->cursorX = 0; + win->cursorY += 16; + } + else + { + win->win_field_C ^= 2; + win->cursorX = 0; + DoScroll_TextModeMonospace(win, sLineLength); + } +} + +static void DoScroll_TextModeMonospace(struct Window *win, u16 lineLength) +{ + u16 *buffer = GetCursorTilemapPointer(win); + u16 *dest = buffer - 32; + u16 fill = (win->paletteNum << 12) | GetBlankTileNum(win); + + // Move the bottom line up + CpuCopy16(buffer + 32, dest, lineLength * 2); + CpuCopy16(buffer + 64, buffer, lineLength * 2); + + // Clear the bottom line + CpuFill16(fill, buffer + 32, lineLength * 2); + CpuFill16(fill, buffer + 64, lineLength * 2); +} + +static void ScrollWindowTextLines_TextMode2(struct Window *win) +{ + if (win->cursorY == 0) + { + // Advance to the next line + win->cursorX = 0; + win->cursorY += 16; + } + else + { + win->win_field_C ^= 2; + win->cursorX = 0; + DoScroll_TextMode2(win, sLineLength); + } +} + +static void DoScroll_TextMode2(struct Window *win, u8 lineLength) +{ + u8 i; + u8 *buf1 = win->tileData + 32 * GetCursorTileNum(win, 0, -2); + u8 *buf2 = win->tileData + 32 * GetCursorTileNum(win, 0, 0); + u8 *buf4; + u16 *buf3; + u16 a[4]; + + CpuFastCopy(buf2, buf1, 32 * lineLength); + CpuFastFill(sGlyphBuffer.background, buf2, 32 * lineLength); + buf4 = buf2 + 32 * win->width; + CpuFastCopy(buf4, buf1 + 32 * win->width, 32 * lineLength); + CpuFastFill(sGlyphBuffer.background, buf4, 32 * lineLength); + + buf3 = GetCursorTilemapPointer(win) - 64; + + a[0] = (win->tileDataStartOffset + win->tileDataOffset + + ((win->top >> 3) * win->width) + + (win->left >> 3)) + | (win->paletteNum << 12); + a[1] = a[0] + win->width; + a[2] = a[1] + win->width; + a[3] = a[2] + win->width; + + for (i = 0; i < lineLength; i++) + { + buf3[0] = a[0]++; + buf3[32] = a[1]++; + buf3[64] = a[2]++; + buf3[96] = a[3]++; + buf3++; + } +} + +void Text_ClearWindow(struct Window *win) +{ + switch (win->textMode) + { + case TEXT_MODE_UNKNOWN0: + ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); + win->tileDataOffset = 2; + break; + case TEXT_MODE_MONOSPACE: + ClearWindowTextLines_TextMode0_TextMode1(win, sLineLength); + break; + case TEXT_MODE_UNKNOWN2: + ClearWindowTextLines_TextMode2(win, sLineLength); + break; + } +} + +static void ClearWindowTextLines_TextMode0_TextMode1(struct Window *win, u8 lineLength) +{ + u8 x, y; + u16 *buffer; + u16 fill; + + win->cursorX = 0; + win->cursorY = 0; + win->win_field_C = 0; + + buffer = GetCursorTilemapPointer(win); + fill = GetBlankTileNum(win) | (win->paletteNum << 12); + + for (y = 0; y < 4; y++) + { + for (x = 0; x < lineLength; x++) + buffer[x] = fill; + buffer += 32; + } +} + +static void ClearWindowTextLines_TextMode2(struct Window *win, u8 lineLength) +{ + u8 *buffer; + + win->cursorX = 0; + win->cursorY = 0; + win->win_field_C = 0; + + buffer = win->tileData + 32 * GetCursorTileNum(win, 0, 0); + CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); + buffer += 32 * win->width; + CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); + buffer += 32 * win->width; + CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); + buffer += 32 * win->width; + CpuFastFill(sGlyphBuffer.background, buffer, 32 * lineLength); +} + +static void DrawDownArrow(struct Window *win) +{ + if (PlayerCanInterruptDelay(win)) + { + const u32 *downArrowTiles = &sDownArrowTiles[((win->downArrowCounter & 0x0F00) >> 8) * 16]; + + switch (win->textMode) + { + case TEXT_MODE_MONOSPACE: + { + u8 *buffer; + u16 tileNum = win->tileDataStartOffset + 254; + if (win->fontNum == 0 || win->fontNum == 3) + tileNum *= 2; + buffer = win->tileData + 32 * tileNum; + ApplyColors_ShadowedFont(downArrowTiles, buffer, win->foregroundColor, win->shadowColor, win->backgroundColor); + ApplyColors_ShadowedFont(downArrowTiles + 8, buffer + 32, win->foregroundColor, win->shadowColor, win->backgroundColor); + WriteGlyphTilemap(win, tileNum, tileNum + 1); + break; + } + case TEXT_MODE_UNKNOWN0: + case TEXT_MODE_UNKNOWN2: + { + struct GlyphTileInfo glyphTileInfo; + glyphTileInfo.textMode = win->textMode; + glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; + if (glyphTileInfo.startPixel != 0) + { + u8 *upperTile; + u8 *lowerTile; + GetGlyphTilePointers(win->fontNum, win->language, 0, &upperTile, &lowerTile); + glyphTileInfo.width = 8 - glyphTileInfo.startPixel; + glyphTileInfo.src = upperTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 0)); + glyphTileInfo.colors = sGlyphBuffer.colors; + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + glyphTileInfo.src = lowerTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 1, 1)); + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + } + glyphTileInfo.width = 8; + glyphTileInfo.src = (u8 *)downArrowTiles; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); + glyphTileInfo.colors = sGlyphBuffer.colors; + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + glyphTileInfo.src += 32; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + if (glyphTileInfo.startPixel != 0) + UpdateTilemap(win, 2); + else + UpdateTilemap(win, 1); + break; + } + } + } +} + +static u8 WaitWithDownArrow(struct Window *win) +{ + u8 retVal = TRUE; + + if (!PlayerCanInterruptDelay(win)) + { + win->delayCounter--; + if (!win->delayCounter) + { + TryEraseDownArrow(win); + } + else + { + UpdateDownArrowAnimation(win); + retVal = FALSE; + } + } + else + { + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + PlaySE(SE_SELECT); + TryEraseDownArrow(win); + } + else + { + UpdateDownArrowAnimation(win); + retVal = FALSE; + } + } + + return retVal; +} + +static void DrawInitialDownArrow(struct Window *win) +{ + win->downArrowCounter = 0; + DrawDownArrow(win); +} + +static void UpdateDownArrowAnimation(struct Window *win) +{ + u16 downArrowPos = (win->downArrowCounter & 0x0F00) >> 8; + u16 wait = win->downArrowCounter & 0x000F; + u16 newVal; + + wait++; + + if (wait == 6) + { + wait = 0; + downArrowPos++; + if (downArrowPos > 3) + downArrowPos = 0; + win->downArrowCounter = downArrowPos << 8; + DrawDownArrow(win); + } + + newVal = downArrowPos << 8; + newVal |= wait; + + win->downArrowCounter = newVal; +} + +static void TryEraseDownArrow(struct Window *win) +{ + win->downArrowCounter = 0; + if (PlayerCanInterruptDelay(win) == TRUE) + EraseAtCursor(win); +} + +// unused +u16 Text_GetWindowTilemapEntry(struct Window *win, u8 x, u8 y) +{ + u16 *tilemap = win->tilemap; + return tilemap[32 * y + x]; +} + +// unused +void Text_FillWindowBorder(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) +{ + u8 i; + u16 *buffer = &win->tilemap[top * 32]; + + // Fill top border + for (i = left; i <= right; i++) + buffer[i] = tilemapEntry; + + for (i = top + 1; i < bottom - 1; i++) + { + buffer += 32; + // left border + buffer[left] = tilemapEntry; + // right border + buffer[right] = tilemapEntry; + } + + // Fill bottom border + if (top != bottom) + { + buffer += 32; + for (i = left; i <= right; i++) + buffer[i] = tilemapEntry; + } +} + +// unused +void DrawWindowRect_DefaultPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) +{ + Text_FillWindowBorder(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); +} + +// Fills the whole window area with tilemapEntry +void Text_FillWindowRect(struct Window *win, u16 tilemapEntry, u8 left, u8 top, u8 right, u8 bottom) +{ + u16 *buffer = &win->tilemap[top * 32]; + while (top++ <= bottom) + { + u8 x; + for (x = left; x <= right; x++) + buffer[x] = tilemapEntry; + buffer += 32; + } +} + +void Text_FillWindowRectDefPalette(struct Window *win, u16 tileNum, u8 left, u8 top, u8 right, u8 bottom) +{ + Text_FillWindowRect(win, (win->paletteNum << 12) | tileNum, left, top, right, bottom); +} + +void Text_EraseWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +{ + Text_FillWindowRectDefPalette(win, 0, left, top, right, bottom); +} + +void Text_BlankWindowRect(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +{ + u16 tileNum = GetBlankTileNum(win); + Text_FillWindowRectDefPalette(win, tileNum, left, top, right, bottom); +} + +static u16 GetBlankTileNum(struct Window *win) +{ + u16 retVal = win->tileDataStartOffset; + + switch (win->textMode) + { + case TEXT_MODE_UNKNOWN0: + break; + case TEXT_MODE_UNKNOWN2: + retVal++; + break; + case TEXT_MODE_MONOSPACE: + switch (win->fontNum) + { + case 1: + case 2: + case 4: + case 5: + retVal += 212; + case 0: + case 3: + case 6: + break; + default: + retVal = 0; + } + break; + } + + return retVal; +} + +static s32 sub_80048D8(struct Window *win, u8 x, u8 y) +{ + win->cursorX = x; + win->cursorY = y & 0xF8; +} + +static u8 GetGlyphWidth(struct Window *win, u32 glyph) +{ + u8 width = 8; + +#ifdef BUGFIX_GLYPHWIDTH + if (win->language != LANGUAGE_JAPANESE) +#else + if (win->language == LANGUAGE_ENGLISH) +#endif + { + width = win->spacing; + if (!win->spacing) + { + switch (win->fontNum) + { + case 3: + width = sFont3Widths[glyph]; + break; + case 4: + case 5: + width = sFont4Widths[sFontType1Map[2 * glyph + 1]]; + break; + case 0: + width = sFont0Widths[glyph]; + break; + case 1: + case 2: + width = sFont1Widths[sFontType1Map[2 * glyph + 1]]; + break; + case 6: + width = 8; + break; + default: + width = 8; + } + } + } + + return width; +} + +u8 GetExtCtrlCodeLength(u8 code) +{ + u8 length = 0; + if (code <= 0x16) + length = sExtCtrlCodeLengths[code]; + return length; +} + +u8 *AlignInt1(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) +{ + u8 temp[16]; + u8 width; + switch (alignType) + { + case 0: + ConvertIntToDecimalString(temp, value); + dest = StringCopy(dest, temp); + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount; + dest += 3; + *dest = 0xFF; + break; + case 1: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount - width; + dest += 3; + } + dest = StringCopy(dest, temp); + break; + case 2: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = (alignAmount - width) / 2; + dest += 3; + } + dest = StringCopy(dest, temp); + if (alignAmount > width) + { + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = alignAmount; + dest += 3; + *dest = 0xFF; + } + break; + } + return dest; +} + +u8 *AlignInt2(struct Window *win, u8 *dest, s32 value, u8 alignAmount, u8 alignType) +{ + u8 temp[16]; + u8 width; + switch (alignType) + { + case 0: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + dest = StringCopy(dest, temp); + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 17; + dest[2] = alignAmount - width; + dest += 3; + *dest = 0xFF; + break; + case 1: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + if (alignAmount > width) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 17; + dest[2] = alignAmount - width; + dest += 3; + } + dest = StringCopy(dest, temp); + break; + case 2: + ConvertIntToDecimalString(temp, value); + width = GetStringWidth(win, temp); + if (alignAmount > width) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 17; + dest[2] = (alignAmount - width) / 2; + dest += 3; + } + dest = StringCopy(dest, temp); + if (alignAmount > width) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 17; + dest[2] = (alignAmount - width) / 2; + dest += 3; + *dest = 0xFF; + } + break; + } + return dest; +} + +u8 *AlignString(struct Window *win, u8 *dest, const u8 *src, u8 alignAmount, u8 alignType) +{ + u8 width; + switch (alignType) + { + case 0: + dest = StringCopy(dest, src); + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 19; + dest[2] = alignAmount; + dest += 3; + *dest = 0xFF; + break; + case 1: + width = GetStringWidth(win, src); + if (alignAmount > width) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 19; + dest[2] = alignAmount - width; + dest += 3; + } + dest = StringCopy(dest, src); + break; + case 2: + width = GetStringWidth(win, src); + if (alignAmount > width) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 19; + dest[2] = (alignAmount - width) / 2; + dest += 3; + } + dest = StringCopy(dest, src); + if (alignAmount > width) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 19; + dest[2] = alignAmount; + dest += 3; + *dest = 0xFF; + } + break; + } + return dest; +} + +u8 GetStringWidth(struct Window *win, const u8 *s) +{ + u8 width = 0; + u8 savedFontNum = win->fontNum; + u8 savedLanguage = win->language; + u8 savedSpacing = win->spacing; + s32 i = 0; + + while (s[i] != EOS) + { + u8 c = s[i]; + switch (c) + { + case PLACEHOLDER_BEGIN: + { + u8 temp; + i++; + temp = win->language; + width += GetStringWidth(win, GetExpandedPlaceholder(s[i])); + win->language = temp; + i++; + break; + } + case EXT_CTRL_CODE_BEGIN: + i++; + switch (s[i]) + { + case 6: + win->fontNum = s[i + 1]; + break; + case 7: + win->fontNum = win->template->fontNum; + break; + case 0x11: + width += s[i + 1]; + break; + case 0x12: + case 0x13: + if (width < s[i + 1]) + width = s[i + 1]; + break; + case 0x14: + win->spacing = s[i + 1]; + break; + case 0x15: + win->language = LANGUAGE_JAPANESE; + break; + case 0x16: + win->language = GAME_LANGUAGE; + break; + } + + i += GetExtCtrlCodeLength(s[i]); + break; + default: + i++; + width += GetGlyphWidth(win, c); + } + } + + win->spacing = savedSpacing; + win->language = savedLanguage; + win->fontNum = savedFontNum; + + return width; +} + +u8 Text_InitWindow8004D04(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u16 top, u32 a6) +{ + Text_InitWindow8002E4C(win, text, tileDataStartOffset, left, top, a6); + return Text_PrintWindow8002F44(win); +} + +u8 Text_InitWindow8004D38(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) +{ + u8 width = GetStringWidth(win, text); + Text_InitWindow(win, text, tileDataStartOffset, left - ((u32)(width + 7) >> 3), top); + EraseAtCursor(win); + width &= 7; + if (width) + width = 8 - width; + sub_80048D8(win, width, 0); + return Text_PrintWindow8002F44(win); +} + +u8 Text_InitWindow8004DB0(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top, u16 a6) +{ + register u32 val asm("r5") = (u8)((a6 >> 1) - (GetStringWidth(win, text) >> 1)); + left += (val >> 3); + Text_InitWindow(win, text, tileDataStartOffset, left, top); + EraseAtCursor(win); + sub_80048D8(win, val & 7, 0); + return Text_PrintWindow8002F44(win); +} + +u8 Text_GetWindowPaletteNum(struct Window *win) +{ + return win->paletteNum; +} + +void Text_GetTextColors(struct Window *win, u8 *foreground, u8 *background, u8 *shadow) +{ + *foreground = win->foregroundColor; + *background = win->backgroundColor; + *shadow = win->shadowColor; +} + +void Text_InitWindow8004E3C(const struct WindowTemplate *winTemplate, u8 *tileData, const u8 *text) +{ + sTempWindow.template = winTemplate; + Text_InitWindow(&sTempWindow, text, 0, 0, 0); + sTempWindow.tileData = tileData; + Text_PrintWindow8002F44(&sTempWindow); +} + +u8 Text_GetStringWidthFromWindowTemplate(const struct WindowTemplate *winTemplate, const u8 *s) +{ + sTempWindow.template = winTemplate; + Text_InitWindow(&sTempWindow, s, 0, 0, 0); + return GetStringWidth(&sTempWindow, s); +} + +void ConvertInternationalString(u8 *s, u8 language) +{ + if (language == LANGUAGE_JAPANESE) + { + u8 i; + + Text_StripExtCtrlCodes(s); + i = StringLength(s); + s[i++] = EXT_CTRL_CODE_BEGIN; + s[i++] = 22; + s[i++] = EOS; + + i--; + + while (i != (u8)-1) + { + s[i + 2] = s[i]; + i--; + } + + s[0] = EXT_CTRL_CODE_BEGIN; + s[1] = 21; + } +} + +void Text_StripExtCtrlCodes(u8 *str) +{ + u16 srcIndex = 0; + u16 destIndex = 0; + while (str[srcIndex] != EOS) + { + if (str[srcIndex] == EXT_CTRL_CODE_BEGIN) + { + srcIndex++; + srcIndex += GetExtCtrlCodeLength(str[srcIndex]); + } + else + { + str[destIndex++] = str[srcIndex++]; + } + } + str[destIndex] = EOS; +} + +static const u8 *SkipExtCtrlCode(const u8 *s) +{ + while (*s == EXT_CTRL_CODE_BEGIN) + { + s++; + s += GetExtCtrlCodeLength(*s); + } + + return s; +} + +s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2) +{ + s32 retVal = 0; + + while (1) + { + str1 = SkipExtCtrlCode(str1); + str2 = SkipExtCtrlCode(str2); + + if (*str1 > *str2) + break; + + if (*str1 < *str2) + { + retVal = -1; + if (*str2 == 0xFF) + retVal = 1; + } + + if (*str1 == 0xFF) + return retVal; + + str1++; + str2++; + } + + retVal = 1; + + if (*str1 == 0xFF) + retVal = -1; + + return retVal; +} + +u8 sub_8004FD0(struct Window *win, u8 *dest, const u8 *src, u16 tileDataStartOffset, u8 left, u16 top, u8 width, u32 a8) +{ + u8 newlineCount = 0; + u8 extCtrlCodeLength; + u8 *start; + u32 endsWithoutNewline; + + if (dest == NULL) + dest = gStringVar4; + + start = dest; + endsWithoutNewline = FALSE; + + while (*src != 0xFF) + { + switch (*src) + { + default: + *dest = *src; + dest++; + src++; + endsWithoutNewline = TRUE; + break; + case 0xFC: + extCtrlCodeLength = GetExtCtrlCodeLength(src[1]) + 1; + memcpy(dest, src, extCtrlCodeLength); + dest += extCtrlCodeLength; + src += extCtrlCodeLength; + break; + case 0xFE: + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = width; + dest[3] = 0xFE; + dest += 4; + src++; + newlineCount++; + endsWithoutNewline = FALSE; + break; + } + } + + dest[0] = 0xFC; + dest[1] = 19; + dest[2] = width; + dest[3] = 0xFF; + + if (endsWithoutNewline) + newlineCount++; + + Text_InitWindow8002E4C(win, start, tileDataStartOffset, left, top, a8); + Text_PrintWindow8002F44(win); + + return newlineCount; +} + +static s32 DrawGlyphTile_UnshadowedFont(struct GlyphTileInfo *glyphTileInfo) +{ + struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; + u32 colors[2]; + u32 *buffer = glyphTileInfo->dest; + const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; + u32 mask1 = masks[0] | masks[2]; + + glyphBuffer->pixelRows[0] = buffer[0] & mask1; + glyphBuffer->pixelRows[1] = buffer[1] & mask1; + glyphBuffer->pixelRows[2] = buffer[2] & mask1; + glyphBuffer->pixelRows[3] = buffer[3] & mask1; + glyphBuffer->pixelRows[4] = buffer[4] & mask1; + glyphBuffer->pixelRows[5] = buffer[5] & mask1; + glyphBuffer->pixelRows[6] = buffer[6] & mask1; + glyphBuffer->pixelRows[7] = buffer[7] & mask1; + + if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) + { + u32 mask2 = masks[1]; + if (glyphTileInfo->textMode == TEXT_MODE_UNKNOWN2) + { + glyphBuffer->pixelRows[8] = buffer[8] & mask2; + glyphBuffer->pixelRows[9] = buffer[9] & mask2; + glyphBuffer->pixelRows[10] = buffer[10] & mask2; + glyphBuffer->pixelRows[11] = buffer[11] & mask2; + glyphBuffer->pixelRows[12] = buffer[12] & mask2; + glyphBuffer->pixelRows[13] = buffer[13] & mask2; + glyphBuffer->pixelRows[14] = buffer[14] & mask2; + glyphBuffer->pixelRows[15] = buffer[15] & mask2; + } + else + { + glyphBuffer->pixelRows[8] = buffer[16] & mask2; + glyphBuffer->pixelRows[9] = buffer[17] & mask2; + glyphBuffer->pixelRows[10] = buffer[18] & mask2; + glyphBuffer->pixelRows[11] = buffer[19] & mask2; + glyphBuffer->pixelRows[12] = buffer[20] & mask2; + glyphBuffer->pixelRows[13] = buffer[21] & mask2; + glyphBuffer->pixelRows[14] = buffer[22] & mask2; + glyphBuffer->pixelRows[15] = buffer[23] & mask2; + } + } + + colors[0] = glyphTileInfo->colors[0]; + colors[1] = glyphTileInfo->colors[15]; + + sShiftGlyphTileUnshadowedFuncs[glyphTileInfo->width](glyphBuffer, glyphTileInfo->src, colors, glyphTileInfo->startPixel); + + buffer[0] = glyphBuffer->pixelRows[0]; + buffer[1] = glyphBuffer->pixelRows[1]; + buffer[2] = glyphBuffer->pixelRows[2]; + buffer[3] = glyphBuffer->pixelRows[3]; + buffer[4] = glyphBuffer->pixelRows[4]; + buffer[5] = glyphBuffer->pixelRows[5]; + buffer[6] = glyphBuffer->pixelRows[6]; + buffer[7] = glyphBuffer->pixelRows[7]; + + if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) + { + if (glyphTileInfo->textMode != TEXT_MODE_UNKNOWN2) + buffer += 8; + buffer[8] = glyphBuffer->pixelRows[8]; + buffer[9] = glyphBuffer->pixelRows[9]; + buffer[10] = glyphBuffer->pixelRows[10]; + buffer[11] = glyphBuffer->pixelRows[11]; + buffer[12] = glyphBuffer->pixelRows[12]; + buffer[13] = glyphBuffer->pixelRows[13]; + buffer[14] = glyphBuffer->pixelRows[14]; + buffer[15] = glyphBuffer->pixelRows[15]; + } + + return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; +} + +static void ShiftGlyphTile_UnshadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *a3, u8 startPixel) +{ +} + +static void ShiftGlyphTile_UnshadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = colors[src[i] >> 7]; + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + // XXX: why 4? + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12) + | (colors[(src[i] >> 3) & 1] << 16); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12) + | (colors[(src[i] >> 3) & 1] << 16) + | (colors[(src[i] >> 2) & 1] << 20); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12) + | (colors[(src[i] >> 3) & 1] << 16) + | (colors[(src[i] >> 2) & 1] << 20) + | (colors[(src[i] >> 1) & 1] << 24); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_UnshadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u8 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 7) & 1] << 0) + | (colors[(src[i] >> 6) & 1] << 4) + | (colors[(src[i] >> 5) & 1] << 8) + | (colors[(src[i] >> 4) & 1] << 12) + | (colors[(src[i] >> 3) & 1] << 16) + | (colors[(src[i] >> 2) & 1] << 20) + | (colors[(src[i] >> 1) & 1] << 24) + | (colors[(src[i] >> 0) & 1] << 28); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static s32 DrawGlyphTile_ShadowedFont(struct GlyphTileInfo *glyphTileInfo) +{ + struct GlyphBuffer *glyphBuffer = &sGlyphBuffer; + u32 *buffer = glyphTileInfo->dest; + const u32 *masks = sGlyphMasks[glyphTileInfo->width][glyphTileInfo->startPixel]; + u32 mask1 = masks[0] | masks[2]; + + glyphBuffer->pixelRows[0] = buffer[0] & mask1; + glyphBuffer->pixelRows[1] = buffer[1] & mask1; + glyphBuffer->pixelRows[2] = buffer[2] & mask1; + glyphBuffer->pixelRows[3] = buffer[3] & mask1; + glyphBuffer->pixelRows[4] = buffer[4] & mask1; + glyphBuffer->pixelRows[5] = buffer[5] & mask1; + glyphBuffer->pixelRows[6] = buffer[6] & mask1; + glyphBuffer->pixelRows[7] = buffer[7] & mask1; + + if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) + { + u32 mask2 = masks[1]; + if (glyphTileInfo->textMode == TEXT_MODE_UNKNOWN2) + { + glyphBuffer->pixelRows[8] = buffer[8] & mask2; + glyphBuffer->pixelRows[9] = buffer[9] & mask2; + glyphBuffer->pixelRows[10] = buffer[10] & mask2; + glyphBuffer->pixelRows[11] = buffer[11] & mask2; + glyphBuffer->pixelRows[12] = buffer[12] & mask2; + glyphBuffer->pixelRows[13] = buffer[13] & mask2; + glyphBuffer->pixelRows[14] = buffer[14] & mask2; + glyphBuffer->pixelRows[15] = buffer[15] & mask2; + } + else + { + glyphBuffer->pixelRows[8] = buffer[16] & mask2; + glyphBuffer->pixelRows[9] = buffer[17] & mask2; + glyphBuffer->pixelRows[10] = buffer[18] & mask2; + glyphBuffer->pixelRows[11] = buffer[19] & mask2; + glyphBuffer->pixelRows[12] = buffer[20] & mask2; + glyphBuffer->pixelRows[13] = buffer[21] & mask2; + glyphBuffer->pixelRows[14] = buffer[22] & mask2; + glyphBuffer->pixelRows[15] = buffer[23] & mask2; + } + } + + sShiftGlyphTileShadowedFuncs[glyphTileInfo->width](glyphBuffer, (u32 *)glyphTileInfo->src, glyphTileInfo->colors, glyphTileInfo->startPixel); + + buffer[0] = glyphBuffer->pixelRows[0]; + buffer[1] = glyphBuffer->pixelRows[1]; + buffer[2] = glyphBuffer->pixelRows[2]; + buffer[3] = glyphBuffer->pixelRows[3]; + buffer[4] = glyphBuffer->pixelRows[4]; + buffer[5] = glyphBuffer->pixelRows[5]; + buffer[6] = glyphBuffer->pixelRows[6]; + buffer[7] = glyphBuffer->pixelRows[7]; + + if (glyphTileInfo->startPixel + glyphTileInfo->width > 8) + { + if (glyphTileInfo->textMode != TEXT_MODE_UNKNOWN2) + buffer += 8; + buffer[8] = glyphBuffer->pixelRows[8]; + buffer[9] = glyphBuffer->pixelRows[9]; + buffer[10] = glyphBuffer->pixelRows[10]; + buffer[11] = glyphBuffer->pixelRows[11]; + buffer[12] = glyphBuffer->pixelRows[12]; + buffer[13] = glyphBuffer->pixelRows[13]; + buffer[14] = glyphBuffer->pixelRows[14]; + buffer[15] = glyphBuffer->pixelRows[15]; + } + + return (glyphTileInfo->startPixel + glyphTileInfo->width) / 8; +} + +static void ShiftGlyphTile_ShadowedFont_Width0(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ +} + +static void ShiftGlyphTile_ShadowedFont_Width1(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = colors[src[i] & 0xF]; + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_ShadowedFont_Width2(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 0) & 0xF] << 0) + | (colors[(src[i] >> 4) & 0xF] << 4); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_ShadowedFont_Width3(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 0) & 0xF] << 0) + | (colors[(src[i] >> 4) & 0xF] << 4) + | (colors[(src[i] >> 8) & 0xF] << 8); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +static void ShiftGlyphTile_ShadowedFont_Width4(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u8 i; + for (i = 0; i < 8; i++) + { + u32 val = (colors[(src[i] >> 0) & 0xF] << 0) + | (colors[(src[i] >> 4) & 0xF] << 4) + | (colors[(src[i] >> 8) & 0xF] << 8) + | (colors[(src[i] >> 12) & 0xF] << 12); + u32 *dest = &glyphBuffer->pixelRows[i]; + dest[0] |= val << shiftAmount->left; + dest[8] |= val >> shiftAmount->right; + } +} + +#define SHIFT_GLYPH_WIDTH5_STEP(i) \ +val = (colors[(src[i] >> 0) & 0xF] << 0) \ + | (colors[(src[i] >> 4) & 0xF] << 4) \ + | (colors[(src[i] >> 8) & 0xF] << 8) \ + | (colors[(src[i] >> 12) & 0xF] << 12) \ + | (colors[(src[i] >> 16) & 0xF] << 16); \ +glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ +glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ + +static void ShiftGlyphTile_ShadowedFont_Width5(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u32 val; + SHIFT_GLYPH_WIDTH5_STEP(0) + SHIFT_GLYPH_WIDTH5_STEP(1) + SHIFT_GLYPH_WIDTH5_STEP(2) + SHIFT_GLYPH_WIDTH5_STEP(3) + SHIFT_GLYPH_WIDTH5_STEP(4) + SHIFT_GLYPH_WIDTH5_STEP(5) + SHIFT_GLYPH_WIDTH5_STEP(6) + SHIFT_GLYPH_WIDTH5_STEP(7) +} + +#define SHIFT_GLYPH_WIDTH6_STEP(i) \ +val = (colors[(src[i] >> 0) & 0xF] << 0) \ + | (colors[(src[i] >> 4) & 0xF] << 4) \ + | (colors[(src[i] >> 8) & 0xF] << 8) \ + | (colors[(src[i] >> 12) & 0xF] << 12) \ + | (colors[(src[i] >> 16) & 0xF] << 16) \ + | (colors[(src[i] >> 20) & 0xF] << 20); \ +glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ +glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ + +static void ShiftGlyphTile_ShadowedFont_Width6(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u32 val; + SHIFT_GLYPH_WIDTH6_STEP(0) + SHIFT_GLYPH_WIDTH6_STEP(1) + SHIFT_GLYPH_WIDTH6_STEP(2) + SHIFT_GLYPH_WIDTH6_STEP(3) + SHIFT_GLYPH_WIDTH6_STEP(4) + SHIFT_GLYPH_WIDTH6_STEP(5) + SHIFT_GLYPH_WIDTH6_STEP(6) + SHIFT_GLYPH_WIDTH6_STEP(7) +} + +#define SHIFT_GLYPH_WIDTH7_STEP(i) \ +val = (colors[(src[i] >> 0) & 0xF] << 0) \ + | (colors[(src[i] >> 4) & 0xF] << 4) \ + | (colors[(src[i] >> 8) & 0xF] << 8) \ + | (colors[(src[i] >> 12) & 0xF] << 12) \ + | (colors[(src[i] >> 16) & 0xF] << 16) \ + | (colors[(src[i] >> 20) & 0xF] << 20) \ + | (colors[(src[i] >> 24) & 0xF] << 24); \ +glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ +glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ + +static void ShiftGlyphTile_ShadowedFont_Width7(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u32 val; + SHIFT_GLYPH_WIDTH7_STEP(0) + SHIFT_GLYPH_WIDTH7_STEP(1) + SHIFT_GLYPH_WIDTH7_STEP(2) + SHIFT_GLYPH_WIDTH7_STEP(3) + SHIFT_GLYPH_WIDTH7_STEP(4) + SHIFT_GLYPH_WIDTH7_STEP(5) + SHIFT_GLYPH_WIDTH7_STEP(6) + SHIFT_GLYPH_WIDTH7_STEP(7) +} + +#define SHIFT_GLYPH_WIDTH8_STEP(i) \ +val = (colors[(src[i] >> 0) & 0xF] << 0) \ + | (colors[(src[i] >> 4) & 0xF] << 4) \ + | (colors[(src[i] >> 8) & 0xF] << 8) \ + | (colors[(src[i] >> 12) & 0xF] << 12) \ + | (colors[(src[i] >> 16) & 0xF] << 16) \ + | (colors[(src[i] >> 20) & 0xF] << 20) \ + | (colors[(src[i] >> 24) & 0xF] << 24) \ + | (colors[(src[i] >> 28) ] << 28); \ +glyphBuffer->pixelRows[i] |= val << shiftAmount->left; \ +glyphBuffer->pixelRows[i + 8] |= val >> shiftAmount->right; \ + +static void ShiftGlyphTile_ShadowedFont_Width8(struct GlyphBuffer *glyphBuffer, u32 *src, u32 *colors, u8 startPixel) +{ + const struct ShiftAmount *shiftAmount = &sGlyphShiftAmounts[startPixel]; + u32 val; + SHIFT_GLYPH_WIDTH8_STEP(0) + SHIFT_GLYPH_WIDTH8_STEP(1) + SHIFT_GLYPH_WIDTH8_STEP(2) + SHIFT_GLYPH_WIDTH8_STEP(3) + SHIFT_GLYPH_WIDTH8_STEP(4) + SHIFT_GLYPH_WIDTH8_STEP(5) + SHIFT_GLYPH_WIDTH8_STEP(6) + SHIFT_GLYPH_WIDTH8_STEP(7) +} + +static s32 DrawGlyphTiles(struct Window *win, u32 glyph, u32 glyphWidth) +{ + struct GlyphTileInfo glyphTileInfo; + u8 *upperTile; + u8 *lowerTile; + s32 retVal = 0; + + GetGlyphTilePointers(win->fontNum, win->language, glyph, &upperTile, &lowerTile); + glyphTileInfo.textMode = win->textMode; + glyphTileInfo.startPixel = (win->left + win->cursorX) & 7; + glyphTileInfo.width = glyphWidth; + glyphTileInfo.src = upperTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 0)); + glyphTileInfo.colors = sGlyphBuffer.colors; + + switch (win->fontNum) + { + case 0: + case 1: + case 2: + case 6: + DrawGlyphTile_UnshadowedFont(&glyphTileInfo); + glyphTileInfo.src = lowerTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); + retVal = DrawGlyphTile_UnshadowedFont(&glyphTileInfo); + break; + case 3: + case 4: + case 5: + DrawGlyphTile_ShadowedFont(&glyphTileInfo); + glyphTileInfo.src = lowerTile; + glyphTileInfo.dest = (u32 *)(win->tileData + 32 * GetCursorTileNum(win, 0, 1)); + retVal = DrawGlyphTile_ShadowedFont(&glyphTileInfo); + break; + } + + return retVal; +} + +static void UpdateTilemap(struct Window *win, u32 tilesWidth) +{ + u16 *tilemap = GetCursorTilemapPointer(win); + if (tilesWidth && tilemap) + { + u16 paletteNum = (win->paletteNum << 12); + u16 upperLeftTileNum = GetCursorTileNum(win, 0, 0); + u16 lowerLeftTileNum = GetCursorTileNum(win, 0, 1); + tilemap[0] = upperLeftTileNum | paletteNum; + tilemap[32] = lowerLeftTileNum | paletteNum; + if (tilesWidth == 2) + { + u16 upperRightTileNum = GetCursorTileNum(win, 1, 0); + u16 lowerRightTileNum = GetCursorTileNum(win, 1, 1); + tilemap[1] = upperRightTileNum | paletteNum; + tilemap[33] = lowerRightTileNum | paletteNum; + } + } +} + +static u16 GetCursorTileNum(struct Window *win, u32 xOffset, u32 yOffset) +{ + u16 index; + + if (win->textMode == TEXT_MODE_UNKNOWN2) + index = win->tileDataStartOffset + + win->tileDataOffset + + (((win->top + win->cursorY) >> 3) + yOffset) * win->width + + (((win->left + win->cursorX) >> 3) + xOffset); + else + index = win->tileDataStartOffset + win->tileDataOffset + 2 * xOffset + yOffset; + + return index; +} diff --git a/src/text_window.c b/src/text_window.c new file mode 100644 index 000000000..ade349f4e --- /dev/null +++ b/src/text_window.c @@ -0,0 +1,275 @@ +#include "global.h" +#include "text_window.h" +#include "main.h" +#include "palette.h" +#include "text.h" + +#define STD_WINDOW_PALETTE_NUM 14 + +// Dimensions (in tiles) of a field dialogue frame +#define STD_DLG_FRAME_LEFT 0 +#define STD_DLG_FRAME_TOP 14 +#define STD_DLG_FRAME_WIDTH 26 +#define STD_DLG_FRAME_HEIGHT 4 + +static void LoadTextWindowTiles(u8, void *); +static void LoadTextWindowPalette(u8, u8); +static void DrawStandardFrame(u16 *dest, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom); +static u16 GetDialogueFrameTilemapEntry(u16 tilemapEntry, u8 x, u8 y, u8 width, u8 height); +static void DrawDialogueFrame(struct Window *win, u8 left, u8 top, u8 width, u8 height); + +static u16 sTextWindowBaseTileNum; +static u16 sDialogueFrameBaseTileNum; + +extern const u8 gTextWindowFrame1_Gfx[]; +extern const u8 gTextWindowFrame2_Gfx[]; +extern const u8 gTextWindowFrame3_Gfx[]; +extern const u8 gTextWindowFrame4_Gfx[]; +extern const u8 gTextWindowFrame5_Gfx[]; +extern const u8 gTextWindowFrame6_Gfx[]; +extern const u8 gTextWindowFrame7_Gfx[]; +extern const u8 gTextWindowFrame8_Gfx[]; +extern const u8 gTextWindowFrame9_Gfx[]; +extern const u8 gTextWindowFrame10_Gfx[]; +extern const u8 gTextWindowFrame11_Gfx[]; +extern const u8 gTextWindowFrame12_Gfx[]; +extern const u8 gTextWindowFrame13_Gfx[]; +extern const u8 gTextWindowFrame14_Gfx[]; +extern const u8 gTextWindowFrame15_Gfx[]; +extern const u8 gTextWindowFrame16_Gfx[]; +extern const u8 gTextWindowFrame17_Gfx[]; +extern const u8 gTextWindowFrame18_Gfx[]; +extern const u8 gTextWindowFrame19_Gfx[]; +extern const u8 gTextWindowFrame20_Gfx[]; + +extern const u16 gTextWindowFrame1_Pal[]; +extern const u16 gTextWindowFrame2_Pal[]; +extern const u16 gTextWindowFrame3_Pal[]; +extern const u16 gTextWindowFrame4_Pal[]; +extern const u16 gTextWindowFrame5_Pal[]; +extern const u16 gTextWindowFrame6_Pal[]; +extern const u16 gTextWindowFrame7_Pal[]; +extern const u16 gTextWindowFrame8_Pal[]; +extern const u16 gTextWindowFrame9_Pal[]; +extern const u16 gTextWindowFrame10_Pal[]; +extern const u16 gTextWindowFrame11_Pal[]; +extern const u16 gTextWindowFrame12_Pal[]; +extern const u16 gTextWindowFrame13_Pal[]; +extern const u16 gTextWindowFrame14_Pal[]; +extern const u16 gTextWindowFrame15_Pal[]; +extern const u16 gTextWindowFrame16_Pal[]; +extern const u16 gTextWindowFrame17_Pal[]; +extern const u16 gTextWindowFrame18_Pal[]; +extern const u16 gTextWindowFrame19_Pal[]; +extern const u16 gTextWindowFrame20_Pal[]; + +extern const u8 gDialogueFrame_Gfx[]; + +static const struct FrameGraphics sTextWindowFrameGraphics[20] = +{ + {gTextWindowFrame1_Gfx, gTextWindowFrame1_Pal}, + {gTextWindowFrame2_Gfx, gTextWindowFrame2_Pal}, + {gTextWindowFrame3_Gfx, gTextWindowFrame3_Pal}, + {gTextWindowFrame4_Gfx, gTextWindowFrame4_Pal}, + {gTextWindowFrame5_Gfx, gTextWindowFrame5_Pal}, + {gTextWindowFrame6_Gfx, gTextWindowFrame6_Pal}, + {gTextWindowFrame7_Gfx, gTextWindowFrame7_Pal}, + {gTextWindowFrame8_Gfx, gTextWindowFrame8_Pal}, + {gTextWindowFrame9_Gfx, gTextWindowFrame9_Pal}, + {gTextWindowFrame10_Gfx, gTextWindowFrame10_Pal}, + {gTextWindowFrame11_Gfx, gTextWindowFrame11_Pal}, + {gTextWindowFrame12_Gfx, gTextWindowFrame12_Pal}, + {gTextWindowFrame13_Gfx, gTextWindowFrame13_Pal}, + {gTextWindowFrame14_Gfx, gTextWindowFrame14_Pal}, + {gTextWindowFrame15_Gfx, gTextWindowFrame15_Pal}, + {gTextWindowFrame16_Gfx, gTextWindowFrame16_Pal}, + {gTextWindowFrame17_Gfx, gTextWindowFrame17_Pal}, + {gTextWindowFrame18_Gfx, gTextWindowFrame18_Pal}, + {gTextWindowFrame19_Gfx, gTextWindowFrame19_Pal}, + {gTextWindowFrame20_Gfx, gTextWindowFrame20_Pal}, +}; + +static const u16 sDialogueFrameTilemap[5][7] = +{ + {1, 3, 4, 4, 5, 6, 9}, + {11, 9, 9, 9, 9, 0x040B, 9}, + {7, 9, 9, 9, 9, 10, 9}, + {0x080B, 9, 9, 9, 9, 0x0C0B, 9}, + {0x0801, 0x0803, 0x0804, 0x0804, 0x0805, 0x0806, 9}, +}; + +u16 TextWindow_SetBaseTileNum(u16 baseTileNum) +{ + sTextWindowBaseTileNum = baseTileNum; + return baseTileNum + 9; +} + +// Loads the tiles and palette of the window frame into VRAM using the selected frame type +void TextWindow_LoadStdFrameGraphics(struct Window *win) +{ + u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); + LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, STD_WINDOW_PALETTE_NUM); +} + +// Loads the tiles and palette of the window frame into VRAM with an alternate palette +void TextWindow_LoadStdFrameGraphicsOverridePal(struct Window *win, u8 palSlot) +{ + u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + LoadTextWindowTiles(gSaveBlock2.optionsWindowFrameType, tileData); + LoadTextWindowPalette(gSaveBlock2.optionsWindowFrameType, palSlot); +} + +// Loads the tiles and palette of the window frame into VRAM with an alternate frame type +void TextWindow_LoadStdFrameGraphicsOverrideStyle(struct Window *win, u8 frameType) +{ + u8 *tileData = win->template->tileData + TILE_SIZE_4BPP * sTextWindowBaseTileNum; + LoadTextWindowTiles(frameType, tileData); + LoadTextWindowPalette(frameType, STD_WINDOW_PALETTE_NUM); +} + +void TextWindow_DrawStdFrame(struct Window *win, u8 left, u8 top, u8 right, u8 bottom) +{ + DrawStandardFrame(win->template->tilemap, sTextWindowBaseTileNum, left, top, right, bottom); +} + +// Returns the tile data and palette for the specified frame type +const struct FrameGraphics *TextWindow_GetFrameGraphics(u8 frameType) +{ + if (frameType > 19) + return &sTextWindowFrameGraphics[0]; + else + return &sTextWindowFrameGraphics[frameType]; +} + +static void LoadTextWindowTiles(u8 frameType, void *dest) +{ + const struct FrameGraphics *frameGraphics = TextWindow_GetFrameGraphics(frameType); + CpuFastCopy(frameGraphics->tiles, dest, 9 * TILE_SIZE_4BPP); +} + +static void LoadTextWindowPalette(u8 frameType, u8 palSlot) +{ + const struct FrameGraphics *frameGraphics = TextWindow_GetFrameGraphics(frameType); + LoadPalette(frameGraphics->palette, 16 * palSlot, 0x20); +} + +// Draws a standard window frame +static void DrawStandardFrame(u16 *tilemap, u16 baseTileNum, u8 left, u8 top, u8 right, u8 bottom) +{ + u8 startX = min(left, right); + u8 endX = max(left, right); + u8 startY = min(top, bottom); + u8 endY = max(top, bottom); + u8 x, y; + + // top left corner + tilemap[32 * startY + startX] = baseTileNum | (STD_WINDOW_PALETTE_NUM << 12); + + // top border + for (x = startX + 1; x < endX; x++) + tilemap[32 * startY + x] = (baseTileNum + 1) | (STD_WINDOW_PALETTE_NUM << 12); + + // top right corner + tilemap[32 * startY + endX] = (baseTileNum + 2) | (STD_WINDOW_PALETTE_NUM << 12); + + for (y = startY + 1; y < endY; y++) + { + // left border + tilemap[32 * y + startX] = (baseTileNum + 3) | (STD_WINDOW_PALETTE_NUM << 12); + + // middle + for (x = startX + 1; x < endX; x++) + tilemap[32 * y + x] = (baseTileNum + 4) | (STD_WINDOW_PALETTE_NUM << 12); + + // right border + tilemap[32 * y + endX] = (baseTileNum + 5) | (STD_WINDOW_PALETTE_NUM << 12); + } + + // bottom left corner + tilemap[32 * endY + startX] = (baseTileNum + 6) | (STD_WINDOW_PALETTE_NUM << 12); + + // bottom border + for (x = startX + 1; x < endX; x++) + tilemap[32 * endY + x] = (baseTileNum + 7) | (STD_WINDOW_PALETTE_NUM << 12); + + // bottom right corner + tilemap[32 * endY + endX] = (baseTileNum + 8) | (STD_WINDOW_PALETTE_NUM << 12); +} + +u16 TextWindow_SetDlgFrameBaseTileNum(u16 baseTileNum) +{ + sDialogueFrameBaseTileNum = baseTileNum; + return baseTileNum + 14; +} + +void unref_sub_80651DC(struct Window *win, u8 *text) +{ + Text_InitWindow8002EB0(win, text, sDialogueFrameBaseTileNum + 14, 2, 15); +} + +// Loads and draws a dialogue window frame +void TextWindow_DisplayDialogueFrame(struct Window *win) +{ + TextWindow_LoadDialogueFrameTiles(win); + TextWindow_DrawDialogueFrame(win); +} + +static u16 GetDialogueFrameTilemapEntry(u16 baseTilemapEntry, u8 x, u8 y, u8 width, u8 height) +{ + u16 tilemapEntry = 9; + + if (y >= height) + y = y - height + 3; + else if (y > 1) + y = 2; + + if (x >= width + 2) + x = x - (width + 2) + 4; + else if (x > 2) + x = 3; + + if (x < 7 && y < 5) + tilemapEntry = sDialogueFrameTilemap[y][x]; + + tilemapEntry += baseTilemapEntry; + + return tilemapEntry; +} + +static void DrawDialogueFrame(struct Window *win, u8 left, u8 top, u8 width, u8 height) +{ + u8 x, y; + u16 baseTilemapEntry = (win->paletteNum << 12) | sDialogueFrameBaseTileNum; + u16 *tilemap = win->template->tilemap; + + for (y = 0; y < height + 2; y++) + { + for (x = 0; x < width + 6; x++) + tilemap[(left + x) + 32 * (top + y)] = (win->paletteNum << 12) | GetDialogueFrameTilemapEntry(baseTilemapEntry, x, y, width, height); + } +} + +// Draws an alternate styled frame used for dialogue windows that appear on the overworld +void TextWindow_DrawDialogueFrame(struct Window *win) +{ + DrawDialogueFrame(win, STD_DLG_FRAME_LEFT, STD_DLG_FRAME_TOP, STD_DLG_FRAME_WIDTH, STD_DLG_FRAME_HEIGHT); +} + +// Loads the dialogue window frame tiles into VRAM +void TextWindow_LoadDialogueFrameTiles(struct Window *win) +{ + u8 *tileData = win->template->tileData; + CpuFastCopy(gDialogueFrame_Gfx, tileData + 32 * sDialogueFrameBaseTileNum, 14 * TILE_SIZE_4BPP); +} + +// Erases a dialogue window frame +void TextWindow_EraseDialogueFrame(struct Window *win) +{ + u8 i; + u16 *tilemap = win->template->tilemap + (STD_DLG_FRAME_TOP * 32); + u16 tilemapEntry = win->paletteNum << 12; + + for (i = 0; i < ((STD_DLG_FRAME_HEIGHT + 2) * 32); i++) + tilemap[i] = tilemapEntry; +} diff --git a/src/tileset_anim.c b/src/tileset_anim.c new file mode 100644 index 000000000..abd38edad --- /dev/null +++ b/src/tileset_anim.c @@ -0,0 +1,991 @@ +#include "global.h" +#include "tileset_anim.h" + +struct Dma +{ + const void *src; + const void *dest; + u16 size; +}; + +EWRAM_DATA static struct Dma gTilesetAnimDmas[20] = {0}; + +static u8 gNumTilesetAnimDmas; +static u16 gTileset1AnimFrame; +static u16 gTileset1AnimLength; +static u16 gTileset2AnimFrame; +static u16 gTileset2AnimLength; +static void (*gTileset1AnimCallback)(u16); +static void (*gTileset2AnimCallback)(u16); + +static void StartTileset1Animation(void); +static void StartTileset2Animation(void); + +static void sub_8073014(u16); +static void sub_8073058(u16); + +static void sub_8073070(u16); +static void sub_8073098(u16); +static void sub_80730C0(u16); +static void sub_80730E8(u16); +static void sub_807361C(u16); + +static void sub_8073424(u16); +static void sub_80734A0(u16); +static void sub_8073514(u16); +static void sub_8073540(u16); +static void sub_80735B4(u16); +static void sub_80735E4(u16); +static void sub_80738A8(u16); +static void sub_8073600(u16); +static void sub_80738C0(u16); +static void sub_8073890(u16); +static void sub_80738EC(u16); + +static void sub_80737A4(u16, u8); +static void sub_80737E0(u16); +static void sub_8073704(u16, u8); +static void sub_8073644(u8); +static void sub_8073808(u16); +static void sub_8073830(u16, u8); +static void sub_807368C(u8); +static void sub_80736DC(u8); +static void sub_80736B4(u8); +static void sub_8073868(u16); + +static void sub_8073904(u16); +static void sub_80739C4(u16); +static void sub_807392C(u16); +static void sub_807399C(u16); +static void sub_8073974(u16); +static void sub_80739EC(u16); + +static const u8 TilesetAnimTiles_General_0_1[] = INCBIN_U8("data/tilesets/primary/general/anim/0/1.4bpp"); +static const u8 TilesetAnimTiles_General_0_0[] = INCBIN_U8("data/tilesets/primary/general/anim/0/0.4bpp"); +static const u8 TilesetAnimTiles_General_0_2[] = INCBIN_U8("data/tilesets/primary/general/anim/0/2.4bpp"); +asm(".space 32"); + +static const u8 *const gTilesetAnimTable_General_0[] = +{ + TilesetAnimTiles_General_0_0, + TilesetAnimTiles_General_0_1, + TilesetAnimTiles_General_0_0, + TilesetAnimTiles_General_0_2, +}; + +static const u8 TilesetAnimTiles_General_1_0[] = INCBIN_U8("data/tilesets/primary/general/anim/1/0.4bpp"); +static const u8 TilesetAnimTiles_General_1_1[] = INCBIN_U8("data/tilesets/primary/general/anim/1/1.4bpp"); +static const u8 TilesetAnimTiles_General_1_2[] = INCBIN_U8("data/tilesets/primary/general/anim/1/2.4bpp"); +static const u8 TilesetAnimTiles_General_1_3[] = INCBIN_U8("data/tilesets/primary/general/anim/1/3.4bpp"); +static const u8 TilesetAnimTiles_General_1_4[] = INCBIN_U8("data/tilesets/primary/general/anim/1/4.4bpp"); +static const u8 TilesetAnimTiles_General_1_5[] = INCBIN_U8("data/tilesets/primary/general/anim/1/5.4bpp"); +static const u8 TilesetAnimTiles_General_1_6[] = INCBIN_U8("data/tilesets/primary/general/anim/1/6.4bpp"); +static const u8 TilesetAnimTiles_General_1_7[] = INCBIN_U8("data/tilesets/primary/general/anim/1/7.4bpp"); + +static const u8 *const gTilesetAnimTable_General_1[] = +{ + TilesetAnimTiles_General_1_0, + TilesetAnimTiles_General_1_1, + TilesetAnimTiles_General_1_2, + TilesetAnimTiles_General_1_3, + TilesetAnimTiles_General_1_4, + TilesetAnimTiles_General_1_5, + TilesetAnimTiles_General_1_6, + TilesetAnimTiles_General_1_7, +}; + +static const u8 TilesetAnimTiles_General_2_0[] = INCBIN_U8("data/tilesets/primary/general/anim/2/0.4bpp"); +static const u8 TilesetAnimTiles_General_2_1[] = INCBIN_U8("data/tilesets/primary/general/anim/2/1.4bpp"); +static const u8 TilesetAnimTiles_General_2_2[] = INCBIN_U8("data/tilesets/primary/general/anim/2/2.4bpp"); +static const u8 TilesetAnimTiles_General_2_3[] = INCBIN_U8("data/tilesets/primary/general/anim/2/3.4bpp"); +static const u8 TilesetAnimTiles_General_2_4[] = INCBIN_U8("data/tilesets/primary/general/anim/2/4.4bpp"); +static const u8 TilesetAnimTiles_General_2_5[] = INCBIN_U8("data/tilesets/primary/general/anim/2/5.4bpp"); +static const u8 TilesetAnimTiles_General_2_6[] = INCBIN_U8("data/tilesets/primary/general/anim/2/6.4bpp"); + +static const u8 *const gTilesetAnimTable_General_2[] = +{ + TilesetAnimTiles_General_2_0, + TilesetAnimTiles_General_2_1, + TilesetAnimTiles_General_2_2, + TilesetAnimTiles_General_2_3, + TilesetAnimTiles_General_2_4, + TilesetAnimTiles_General_2_5, + TilesetAnimTiles_General_2_6, + TilesetAnimTiles_General_2_0, +}; + +static const u8 TilesetAnimTiles_General_3_0[] = INCBIN_U8("data/tilesets/primary/general/anim/3/0.4bpp"); +static const u8 TilesetAnimTiles_General_3_1[] = INCBIN_U8("data/tilesets/primary/general/anim/3/1.4bpp"); +static const u8 TilesetAnimTiles_General_3_2[] = INCBIN_U8("data/tilesets/primary/general/anim/3/2.4bpp"); +static const u8 TilesetAnimTiles_General_3_3[] = INCBIN_U8("data/tilesets/primary/general/anim/3/3.4bpp"); + +static const u8 *const gTilesetAnimTable_General_3[] = +{ + TilesetAnimTiles_General_3_0, + TilesetAnimTiles_General_3_1, + TilesetAnimTiles_General_3_2, + TilesetAnimTiles_General_3_3, +}; + +static const u8 TilesetAnimTiles_General_4_0[] = INCBIN_U8("data/tilesets/primary/general/anim/4/0.4bpp"); +static const u8 TilesetAnimTiles_General_4_1[] = INCBIN_U8("data/tilesets/primary/general/anim/4/1.4bpp"); +static const u8 TilesetAnimTiles_General_4_2[] = INCBIN_U8("data/tilesets/primary/general/anim/4/2.4bpp"); +static const u8 TilesetAnimTiles_General_4_3[] = INCBIN_U8("data/tilesets/primary/general/anim/4/3.4bpp"); + +static const u8 *const gTilesetAnimTable_General_4[] = +{ + TilesetAnimTiles_General_4_0, + TilesetAnimTiles_General_4_1, + TilesetAnimTiles_General_4_2, + TilesetAnimTiles_General_4_3, +}; + +static const u8 TilesetAnimTiles_Lavaridge_0[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/0.4bpp"); +static const u8 TilesetAnimTiles_Lavaridge_1[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/1.4bpp"); +static const u8 TilesetAnimTiles_Lavaridge_2[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/2.4bpp"); +static const u8 TilesetAnimTiles_Lavaridge_3[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/3.4bpp"); + +static const u8 *const gTilesetAnimTable_Lavaridge[] = +{ + TilesetAnimTiles_Lavaridge_0, + TilesetAnimTiles_Lavaridge_1, + TilesetAnimTiles_Lavaridge_2, + TilesetAnimTiles_Lavaridge_3, +}; + +static const u8 TilesetAnimTiles_Pacifidlog_0_0[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/0.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_0_1[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/1.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_0_2[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/2.4bpp"); + +static const u8 *const gTilesetAnimTable_Pacifidlog_0[] = +{ + TilesetAnimTiles_Pacifidlog_0_0, + TilesetAnimTiles_Pacifidlog_0_1, + TilesetAnimTiles_Pacifidlog_0_2, + TilesetAnimTiles_Pacifidlog_0_1, +}; + +static const u8 TilesetAnimTiles_Underwater_0[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/0.4bpp"); +static const u8 TilesetAnimTiles_Underwater_1[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/1.4bpp"); +static const u8 TilesetAnimTiles_Underwater_2[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/2.4bpp"); +static const u8 TilesetAnimTiles_Underwater_3[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/3.4bpp"); + +static const u8 *const gTilesetAnimTable_Underwater[] = +{ + TilesetAnimTiles_Underwater_0, + TilesetAnimTiles_Underwater_1, + TilesetAnimTiles_Underwater_2, + TilesetAnimTiles_Underwater_3, +}; + +static const u8 TilesetAnimTiles_Pacifidlog_1_0[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/0.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_1_1[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/1.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_1_2[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/2.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_1_3[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/3.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_1_4[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/4.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_1_5[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/5.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_1_6[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/6.4bpp"); +static const u8 TilesetAnimTiles_Pacifidlog_1_7[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/7.4bpp"); + +static const u8 *const gTilesetAnimTable_Pacifidlog_1[] = +{ + TilesetAnimTiles_Pacifidlog_1_0, + TilesetAnimTiles_Pacifidlog_1_1, + TilesetAnimTiles_Pacifidlog_1_2, + TilesetAnimTiles_Pacifidlog_1_3, + TilesetAnimTiles_Pacifidlog_1_4, + TilesetAnimTiles_Pacifidlog_1_5, + TilesetAnimTiles_Pacifidlog_1_6, + TilesetAnimTiles_Pacifidlog_1_7, +}; + +static const u8 TilesetAnimTiles_Mauville_0_0[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/0.4bpp"); +static const u8 TilesetAnimTiles_Mauville_0_1[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/1.4bpp"); +static const u8 TilesetAnimTiles_Mauville_0_2[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/2.4bpp"); +static const u8 TilesetAnimTiles_Mauville_0_3[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/3.4bpp"); +static const u8 TilesetAnimTiles_Mauville_0_4[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/4.4bpp"); + +static const u8 TilesetAnimTiles_Mauville_1_0[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/0.4bpp"); +static const u8 TilesetAnimTiles_Mauville_1_1[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/1.4bpp"); +static const u8 TilesetAnimTiles_Mauville_1_2[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/2.4bpp"); +static const u8 TilesetAnimTiles_Mauville_1_3[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/3.4bpp"); +static const u8 TilesetAnimTiles_Mauville_1_4[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/4.4bpp"); + +static const void *const gUnknown_0837BAE4[] = +{ + (void *)(VRAM + 0x4C00), + (void *)(VRAM + 0x4C80), + (void *)(VRAM + 0x4D00), + (void *)(VRAM + 0x4D80), + (void *)(VRAM + 0x4E00), + (void *)(VRAM + 0x4E80), + (void *)(VRAM + 0x4F00), + (void *)(VRAM + 0x4F80), +}; + +static const void *const gUnknown_0837BB04[] = +{ + (void *)(VRAM + 0x5000), + (void *)(VRAM + 0x5080), + (void *)(VRAM + 0x5100), + (void *)(VRAM + 0x5180), + (void *)(VRAM + 0x5200), + (void *)(VRAM + 0x5280), + (void *)(VRAM + 0x5300), + (void *)(VRAM + 0x5380), +}; + +static const u8 *const gTilesetAnimTable_Mauville_0A[] = +{ + TilesetAnimTiles_Mauville_0_0, + TilesetAnimTiles_Mauville_0_0, + TilesetAnimTiles_Mauville_0_1, + TilesetAnimTiles_Mauville_0_2, + TilesetAnimTiles_Mauville_0_3, + TilesetAnimTiles_Mauville_0_3, + TilesetAnimTiles_Mauville_0_3, + TilesetAnimTiles_Mauville_0_3, + TilesetAnimTiles_Mauville_0_3, + TilesetAnimTiles_Mauville_0_3, + TilesetAnimTiles_Mauville_0_2, + TilesetAnimTiles_Mauville_0_1, +}; + +static const u8 *const gTilesetAnimTable_Mauville_1A[] = +{ + TilesetAnimTiles_Mauville_1_0, + TilesetAnimTiles_Mauville_1_0, + TilesetAnimTiles_Mauville_1_1, + TilesetAnimTiles_Mauville_1_2, + TilesetAnimTiles_Mauville_1_3, + TilesetAnimTiles_Mauville_1_3, + TilesetAnimTiles_Mauville_1_3, + TilesetAnimTiles_Mauville_1_3, + TilesetAnimTiles_Mauville_1_3, + TilesetAnimTiles_Mauville_1_3, + TilesetAnimTiles_Mauville_1_2, + TilesetAnimTiles_Mauville_1_1, +}; + +static const u8 *const gTilesetAnimTable_Mauville_0B[] = +{ + TilesetAnimTiles_Mauville_0_0, + TilesetAnimTiles_Mauville_0_0, + TilesetAnimTiles_Mauville_0_4, + TilesetAnimTiles_Mauville_0_4, +}; + +static const u8 *const gTilesetAnimTable_Mauville_1B[] = +{ + TilesetAnimTiles_Mauville_1_0, + TilesetAnimTiles_Mauville_1_0, + TilesetAnimTiles_Mauville_1_4, + TilesetAnimTiles_Mauville_1_4, +}; + +static const u8 TilesetAnimTiles_Rustboro_0_0[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/0.4bpp"); +static const u8 TilesetAnimTiles_Rustboro_0_1[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/1.4bpp"); +static const u8 TilesetAnimTiles_Rustboro_0_2[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/2.4bpp"); +static const u8 TilesetAnimTiles_Rustboro_0_3[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/3.4bpp"); +static const u8 TilesetAnimTiles_Rustboro_0_4[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/4.4bpp"); +static const u8 TilesetAnimTiles_Rustboro_0_5[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/5.4bpp"); +static const u8 TilesetAnimTiles_Rustboro_0_6[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/6.4bpp"); +static const u8 TilesetAnimTiles_Rustboro_0_7[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/7.4bpp"); + +static const void *const gUnknown_0837BFA4[] = +{ + (void *)(VRAM + 0x5000), + (void *)(VRAM + 0x5080), + (void *)(VRAM + 0x5100), + (void *)(VRAM + 0x5180), + (void *)(VRAM + 0x5200), + (void *)(VRAM + 0x5280), + (void *)(VRAM + 0x5300), + (void *)(VRAM + 0x5380), +}; + +static const u8 *const gTilesetAnimTable_Rustboro_0[] = +{ + TilesetAnimTiles_Rustboro_0_0, + TilesetAnimTiles_Rustboro_0_1, + TilesetAnimTiles_Rustboro_0_2, + TilesetAnimTiles_Rustboro_0_3, + TilesetAnimTiles_Rustboro_0_4, + TilesetAnimTiles_Rustboro_0_5, + TilesetAnimTiles_Rustboro_0_6, + TilesetAnimTiles_Rustboro_0_7, +}; + +static const u8 TilesetAnimTiles_Rustboro_1_0[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/1/0.4bpp"); +static const u8 TilesetAnimTiles_Rustboro_1_1[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/1/1.4bpp"); + +static const u8 *const gTilesetAnimTable_Rustboro_1[] = +{ + TilesetAnimTiles_Rustboro_1_0, + TilesetAnimTiles_Rustboro_1_1, +}; + +static const u8 TilesetAnimTiles_Cave_0[] = INCBIN_U8("data/tilesets/secondary/cave/anim/0.4bpp"); +static const u8 TilesetAnimTiles_Cave_1[] = INCBIN_U8("data/tilesets/secondary/cave/anim/1.4bpp"); +static const u8 TilesetAnimTiles_Cave_2[] = INCBIN_U8("data/tilesets/secondary/cave/anim/2.4bpp"); +static const u8 TilesetAnimTiles_Cave_3[] = INCBIN_U8("data/tilesets/secondary/cave/anim/3.4bpp"); +// unused anim tiles for cave +static const u8 TilesetAnimTiles_Cave_4[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/0.4bpp"); +static const u8 TilesetAnimTiles_Cave_5[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/1.4bpp"); +static const u8 TilesetAnimTiles_Cave_6[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/2.4bpp"); +static const u8 TilesetAnimTiles_Cave_7[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/3.4bpp"); +asm(".space 32"); + +static const u8 *const gTilesetAnimTable_Cave[] = +{ + TilesetAnimTiles_Cave_0, + TilesetAnimTiles_Cave_1, + TilesetAnimTiles_Cave_2, + TilesetAnimTiles_Cave_3, +}; + +static const u8 TilesetAnimTiles_EverGrande_0[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/0.4bpp"); +static const u8 TilesetAnimTiles_EverGrande_1[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/1.4bpp"); +static const u8 TilesetAnimTiles_EverGrande_2[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/2.4bpp"); +static const u8 TilesetAnimTiles_EverGrande_3[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/3.4bpp"); +static const u8 TilesetAnimTiles_EverGrande_4[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/4.4bpp"); +static const u8 TilesetAnimTiles_EverGrande_5[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/5.4bpp"); +static const u8 TilesetAnimTiles_EverGrande_6[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/6.4bpp"); +static const u8 TilesetAnimTiles_EverGrande_7[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/7.4bpp"); +asm(".space 32"); + +static const void *const gUnknown_0837C93C[] = +{ + (void *)(VRAM + 0x5C00), + (void *)(VRAM + 0x5C80), + (void *)(VRAM + 0x5D00), + (void *)(VRAM + 0x5D80), + (void *)(VRAM + 0x5E00), + (void *)(VRAM + 0x5E80), + (void *)(VRAM + 0x5F00), + (void *)(VRAM + 0x5F80), +}; + +static const u8 *const gTilesetAnimTable_EverGrande[] = +{ + TilesetAnimTiles_EverGrande_0, + TilesetAnimTiles_EverGrande_1, + TilesetAnimTiles_EverGrande_2, + TilesetAnimTiles_EverGrande_3, + TilesetAnimTiles_EverGrande_4, + TilesetAnimTiles_EverGrande_5, + TilesetAnimTiles_EverGrande_6, + TilesetAnimTiles_EverGrande_7, +}; + +static const u8 TilesetAnimTiles_Building_0[] = INCBIN_U8("data/tilesets/primary/building/anim/0.4bpp"); +static const u8 TilesetAnimTiles_Building_1[] = INCBIN_U8("data/tilesets/primary/building/anim/1.4bpp"); + +static const u8 *const gTilesetAnimTable_Building[] = +{ + TilesetAnimTiles_Building_0, + TilesetAnimTiles_Building_1, +}; + +static const u8 TilesetAnimTiles_SootopolisGym_0_0[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/0.4bpp"); +static const u8 TilesetAnimTiles_SootopolisGym_0_1[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/1.4bpp"); +static const u8 TilesetAnimTiles_SootopolisGym_0_2[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/2.4bpp"); +static const u8 TilesetAnimTiles_SootopolisGym_1_0[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/0.4bpp"); +static const u8 TilesetAnimTiles_SootopolisGym_1_1[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/1.4bpp"); +static const u8 TilesetAnimTiles_SootopolisGym_1_2[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/2.4bpp"); + +static const u8 *const gTilesetAnimTable_SootopolisGym_0[] = +{ + TilesetAnimTiles_SootopolisGym_0_0, + TilesetAnimTiles_SootopolisGym_0_1, + TilesetAnimTiles_SootopolisGym_0_2, +}; + +static const u8 *const gTilesetAnimTable_SootopolisGym_1[] = +{ + TilesetAnimTiles_SootopolisGym_1_0, + TilesetAnimTiles_SootopolisGym_1_1, + TilesetAnimTiles_SootopolisGym_1_2, +}; + +static const u8 TilesetAnimTiles_EliteFour_1_0[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/1/0.4bpp"); +static const u8 TilesetAnimTiles_EliteFour_1_1[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/1/1.4bpp"); +static const u8 TilesetAnimTiles_EliteFour_0_0[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/0.4bpp"); +static const u8 TilesetAnimTiles_EliteFour_0_1[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/1.4bpp"); +static const u8 TilesetAnimTiles_EliteFour_0_2[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/2.4bpp"); +static const u8 TilesetAnimTiles_EliteFour_0_3[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/3.4bpp"); +asm(".space 32"); + +static const u8 *const gTilesetAnimTable_EliteFour_0[] = +{ + TilesetAnimTiles_EliteFour_0_0, + TilesetAnimTiles_EliteFour_0_1, + TilesetAnimTiles_EliteFour_0_2, + TilesetAnimTiles_EliteFour_0_3, +}; + +static const u8 *const gTilesetAnimTable_EliteFour_1[] = +{ + TilesetAnimTiles_EliteFour_1_0, + TilesetAnimTiles_EliteFour_1_1, +}; + +static const u8 TilesetAnimTiles_MauvilleGym_0[] = INCBIN_U8("data/tilesets/secondary/mauville_gym/anim/0.4bpp"); +static const u8 TilesetAnimTiles_MauvilleGym_1[] = INCBIN_U8("data/tilesets/secondary/mauville_gym/anim/1.4bpp"); +asm(".space 32"); + +static const u8 *const gTilesetAnimTable_MauvilleGym[] = +{ + TilesetAnimTiles_MauvilleGym_0, + TilesetAnimTiles_MauvilleGym_1, +}; + +static const u8 TilesetAnimTiles_BikeShop_0[] = INCBIN_U8("data/tilesets/secondary/bike_shop/anim/0.4bpp"); +static const u8 TilesetAnimTiles_BikeShop_1[] = INCBIN_U8("data/tilesets/secondary/bike_shop/anim/1.4bpp"); +asm(".space 32"); + +static const u8 *const gTilesetAnimTable_BikeShop[] = +{ + TilesetAnimTiles_BikeShop_0, + TilesetAnimTiles_BikeShop_1, +}; + +static void ClearTilesetAnimDmas(void) +{ + gNumTilesetAnimDmas = 0; + CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas)); +} + +static void QueueTilesetAnimDma(const void *src, const void *dest, u16 size) +{ + if (gNumTilesetAnimDmas < 20) + { + gTilesetAnimDmas[gNumTilesetAnimDmas].src = src; + gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest; + gTilesetAnimDmas[gNumTilesetAnimDmas].size = size; + gNumTilesetAnimDmas++; + } +} + +void sub_8072E74(void) +{ + int i; + for (i = 0; i < gNumTilesetAnimDmas; i++) + { + DmaCopy16(3, + gTilesetAnimDmas[i].src, + gTilesetAnimDmas[i].dest, + gTilesetAnimDmas[i].size); + } + gNumTilesetAnimDmas = 0; +} + +void cur_mapheader_run_tileset_funcs_after_some_cpuset(void) +{ + ClearTilesetAnimDmas(); + StartTileset1Animation(); + StartTileset2Animation(); +} + +void sub_8072ED0(void) +{ + StartTileset2Animation(); +} + +void sub_8072EDC(void) +{ + ClearTilesetAnimDmas(); + if (++gTileset1AnimFrame >= gTileset1AnimLength) + { + gTileset1AnimFrame = 0; + } + if (++gTileset2AnimFrame >= gTileset2AnimLength) + { + gTileset2AnimFrame = 0; + } + if (gTileset1AnimCallback) + { + gTileset1AnimCallback(gTileset1AnimFrame); + } + if (gTileset2AnimCallback) + { + gTileset2AnimCallback(gTileset2AnimFrame); + } +} + +static void StartTileset1Animation(void) +{ + gTileset1AnimFrame = 0; + gTileset1AnimLength = 0; + gTileset1AnimCallback = 0; + if (gMapHeader.mapData->primaryTileset) + { + if (gMapHeader.mapData->primaryTileset->callback) + { + gMapHeader.mapData->primaryTileset->callback(); + } + } +} + +static void StartTileset2Animation(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = 0; + gTileset2AnimCallback = 0; + if (gMapHeader.mapData->secondaryTileset) + { + if (gMapHeader.mapData->secondaryTileset->callback) + { + gMapHeader.mapData->secondaryTileset->callback(); + } + } +} + +void TilesetCB_General(void) +{ + gTileset1AnimFrame = 0; + gTileset1AnimLength = 0x100; + gTileset1AnimCallback = sub_8073014; +} + +void TilesetCB_Building(void) +{ + gTileset1AnimFrame = 0; + gTileset1AnimLength = 0x100; + gTileset1AnimCallback = sub_8073058; +} + +static void sub_8073014(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 0) sub_8073070(a1 / 0x10); + if (v1 == 1) sub_8073098(a1 / 0x10); + if (v1 == 2) sub_80730C0(a1 / 0x10); + if (v1 == 3) sub_80730E8(a1 / 0x10); + if (v1 == 4) sub_807361C(a1 / 0x10); +} + +static void sub_8073058(u16 a1) +{ + if (a1 % 8 == 0) + { + sub_8073904(a1 / 8); + } +} + +static void sub_8073070(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1], BG_TILE_ADDR(127), 0x80); +} + +static void sub_8073098(u16 a1) +{ + u8 v1; + v1 = a1 % 8; + QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1], BG_TILE_ADDR(108), 0x3c0); +} + +static void sub_80730C0(u16 a1) +{ + int v1; + v1 = a1 % 8; + QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1], BG_TILE_ADDR(116), 0x140); +} + +static void sub_80730E8(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1], BG_TILE_ADDR(124), 0xc0); +} + +void TilesetCB_Petalburg(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Rustboro(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073424; +} + +void TilesetCB_Dewford(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Slateport(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Mauville(void) +{ + gTileset2AnimFrame = gTileset1AnimFrame; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_80734A0; +} + +void TilesetCB_Lavaridge(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073514; +} + +void TilesetCB_Fallarbor(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Fortree(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Lilycove(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Mossdeep(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_EverGrande(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073540; +} + +void TilesetCB_Pacifidlog(void) +{ + gTileset2AnimFrame = gTileset1AnimFrame; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_80735B4; +} + +void TilesetCB_Sootopolis(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = 0; +} + +void TilesetCB_Underwater(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = 0x80; + gTileset2AnimCallback = sub_80735E4; +} + +void TilesetCB_SootopolisGym(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = 0xf0; + gTileset2AnimCallback = sub_80738A8; +} + +void TilesetCB_Cave(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073600; +} + +void TilesetCB_EliteFour(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = 0x80; + gTileset2AnimCallback = sub_80738C0; +} + +void TilesetCB_MauvilleGym(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_8073890; +} + +void TilesetCB_BikeShop(void) +{ + gTileset2AnimFrame = 0; + gTileset2AnimLength = gTileset1AnimLength; + gTileset2AnimCallback = sub_80738EC; +} + +static void sub_8073424(u16 a1) +{ + int v1; + v1 = a1 % 8; + if (v1 == 0) + { + sub_80737A4(a1 / 8, 0); + sub_80737E0(a1 / 8); + } + if (v1 == 1) sub_80737A4(a1 / 8, 1); + if (v1 == 2) sub_80737A4(a1 / 8, 2); + if (v1 == 3) sub_80737A4(a1 / 8, 3); + if (v1 == 4) sub_80737A4(a1 / 8, 4); + if (v1 == 5) sub_80737A4(a1 / 8, 5); + if (v1 == 6) sub_80737A4(a1 / 8, 6); + if (v1 == 7) sub_80737A4(a1 / 8, 7); +} + +static void sub_80734A0(u16 a1) +{ + int v1; + v1 = a1 % 8; + if (v1 == 0) sub_8073704(a1 / 8, 0); + if (v1 == 1) sub_8073704(a1 / 8, 1); + if (v1 == 2) sub_8073704(a1 / 8, 2); + if (v1 == 3) sub_8073704(a1 / 8, 3); + if (v1 == 4) sub_8073704(a1 / 8, 4); + if (v1 == 5) sub_8073704(a1 / 8, 5); + if (v1 == 6) sub_8073704(a1 / 8, 6); + if (v1 == 7) sub_8073704(a1 / 8, 7); +} + +static void sub_8073514(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 0) sub_8073644(a1 / 0x10); + if (v1 == 1) sub_8073808(a1 / 0x10); +} + +static void sub_8073540(u16 a1) +{ + int v1; + v1 = a1 % 8; + if (v1 == 0) sub_8073830(a1 / 8, 0); + if (v1 == 1) sub_8073830(a1 / 8, 1); + if (v1 == 2) sub_8073830(a1 / 8, 2); + if (v1 == 3) sub_8073830(a1 / 8, 3); + if (v1 == 4) sub_8073830(a1 / 8, 4); + if (v1 == 5) sub_8073830(a1 / 8, 5); + if (v1 == 6) sub_8073830(a1 / 8, 6); + if (v1 == 7) sub_8073830(a1 / 8, 7); +} + +static void sub_80735B4(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 0) sub_807368C(a1 / 0x10); + if (v1 == 1) sub_80736DC(a1 / 0x10); +} + +static void sub_80735E4(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 0) sub_80736B4(a1 / 0x10); +} + +static void sub_8073600(u16 a1) +{ + int v1; + v1 = a1 % 0x10; + if (v1 == 1) sub_8073868(a1 / 0x10); +} + +static void sub_807361C(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1], BG_TILE_ADDR(120), 0x140); +} + +static void sub_8073644(u8 a1) +{ + u8 v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], BG_TILE_ADDR(200), 0x80); + v1 = (a1 + 2) % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], BG_TILE_ADDR(201), 0x80); +} + +static void sub_807368C(u8 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1], BG_TILE_ADDR(244), 0x3c0); +} + +static void sub_80736B4(u8 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1], BG_TILE_ADDR(252), 0x80); +} + +static void sub_80736DC(u8 a1) +{ + int v1; + v1 = a1 % 8; + QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1], BG_TILE_ADDR(252), 0x100); +} + +static void sub_8073704(u16 a1, u8 a2) +{ + int v1; + a1 -= a2; + if (a1 < 12) + { + v1 = a1 % 12; + QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1], gUnknown_0837BAE4[a2], 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1], gUnknown_0837BB04[a2], 0x80); + } + else + { + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1], gUnknown_0837BAE4[a2], 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1], gUnknown_0837BB04[a2], 0x80); + } +} + +static void sub_80737A4(u16 a1, u8 a2) +{ + int v1; + a1 -= a2; + + v1 = a1 % 8; + if (gTilesetAnimTable_Rustboro_0[v1]) + { + QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1], gUnknown_0837BFA4[a2], 0x80); + } +} + +static void sub_80737E0(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1], BG_TILE_ADDR(240), 0x80); +} + +static void sub_8073808(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], BG_TILE_ADDR(168), 0x80); +} + +static void sub_8073830(u16 a1, u8 a2) +{ + int v1; + a1 -= a2; + v1 = a1 % 8; + QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1], gUnknown_0837C93C[a2], 0x80); +} + +static void sub_8073868(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], BG_TILE_ADDR(232), 0x80); +} + +static void sub_8073890(u16 a1) +{ + int v1; + v1 = a1 % 2; + if (!v1) + { + sub_80739C4(a1 / 2); + } +} + +static void sub_80738A8(u16 a1) +{ + int v1; + v1 = a1 % 8; + if (!v1) + { + sub_807392C(a1 / 8); + } +} + +static void sub_80738C0(u16 a1) +{ + if (a1 % 0x40 == 0) + { + sub_807399C(a1 / 0x40); + } + if (a1 % 8 == 1) + { + sub_8073974(a1 / 8); + } +} + +static void sub_80738EC(u16 a1) +{ + if (a1 % 4 == 0) + { + sub_80739EC(a1 / 4); + } +} + +static void sub_8073904(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_Building[v1], BG_TILE_ADDR(124), 0x80); +} + +static void sub_807392C(u16 a1) +{ + int v1; + v1 = a1 % 3; + QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1], BG_TILE_ADDR(252), 0x180); + QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1], BG_TILE_ADDR(244), 0x280); +} + +static void sub_8073974(u16 a1) +{ + int v1; + v1 = a1 % 4; + QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1], BG_TILE_ADDR(254), 0x20); +} + +static void sub_807399C(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1], BG_TILE_ADDR(248), 0x80); +} + +static void sub_80739C4(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1], BG_TILE_ADDR(164), 0x200); +} + +static void sub_80739EC(u16 a1) +{ + int v1; + v1 = a1 % 2; + QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], BG_TILE_ADDR(252), 0x120); +} diff --git a/src/time_events.c b/src/time_events.c new file mode 100644 index 000000000..4bd732788 --- /dev/null +++ b/src/time_events.c @@ -0,0 +1,118 @@ +#include "global.h" +#include "time_events.h" +#include "event_data.h" +#include "field_weather.h" +#include "pokemon.h" +#include "random.h" +#include "overworld.h" +#include "rtc.h" +#include "script.h" +#include "task.h" + +static u32 GetMirageRnd(void) +{ + u32 hi = VarGet(VAR_MIRAGE_RND_H); + u32 lo = VarGet(VAR_MIRAGE_RND_L); + return (hi << 16) | lo; +} + +static void SetMirageRnd(u32 rnd) +{ + VarSet(VAR_MIRAGE_RND_H, rnd >> 16); + VarSet(VAR_MIRAGE_RND_L, rnd); +} + +// unused +void InitMirageRnd(void) +{ + SetMirageRnd((Random() << 16) | Random()); +} + +void UpdateMirageRnd(u16 days) +{ + s32 rnd = GetMirageRnd(); + while (days) + { + rnd = 1103515245 * rnd + 12345; + days--; + } + SetMirageRnd(rnd); +} + +bool8 IsMirageIslandPresent(void) +{ + u16 rnd = GetMirageRnd() >> 16; + int i; + + for (i = 0; i < PARTY_SIZE; i++) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && (GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY) & 0xFFFF) == rnd) + return TRUE; + + return FALSE; +} + +void UpdateShoalTideFlag(void) +{ + static const u8 tide[] = + { + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + }; + + if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0())) + { + RtcCalcLocalTime(); + if (tide[gLocalTime.hours]) + FlagSet(FLAG_SYS_SHOAL_TIDE); + else + FlagClear(FLAG_SYS_SHOAL_TIDE); + } +} + +static void Task_WaitWeather(u8 taskId) +{ + if (IsWeatherChangeComplete()) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } +} + +void WaitWeather(void) +{ + CreateTask(Task_WaitWeather, 80); +} + +void InitBirchState(void) +{ + *(u16 *)GetVarPointer(VAR_BIRCH_STATE) = 0; +} + +void UpdateBirchState(u16 days) +{ + u16 *state = GetVarPointer(VAR_BIRCH_STATE); + *state += days; + *state %= 7; +} diff --git a/src/title_screen.c b/src/title_screen.c new file mode 100644 index 000000000..a1c8e081d --- /dev/null +++ b/src/title_screen.c @@ -0,0 +1,911 @@ +#include "global.h" +#include "gba/m4a_internal.h" +#include "title_screen.h" +#include "clear_save_data_menu.h" +#include "decompress.h" +#include "event_data.h" +#include "intro.h" +#include "m4a.h" +#include "main.h" +#include "main_menu.h" +#include "overworld.h" +#include "palette.h" +#include "reset_rtc_screen.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "scanline_effect.h" + +#if ENGLISH +#define VERSION_BANNER_SHAPE 1 +#define VERSION_BANNER_RIGHT_TILEOFFSET 64 +#define VERSION_BANNER_BYTES 0x1000 +#define VERSION_BANNER_LEFT_X 98 +#define VERSION_BANNER_RIGHT_X 162 +#define VERSION_BANNER_Y 26 +#define VERSION_BANNER_Y_GOAL 66 +#define START_BANNER_X DISPLAY_WIDTH / 2 +#elif GERMAN +#define VERSION_BANNER_SHAPE 0 +#define VERSION_BANNER_RIGHT_TILEOFFSET 128 +#define VERSION_BANNER_BYTES 0x2000 +#define VERSION_BANNER_LEFT_X 108 +#define VERSION_BANNER_RIGHT_X 172 +#ifdef SAPPHIRE +#define VERSION_BANNER_Y_GOAL 83 +#else +#define VERSION_BANNER_Y_GOAL 84 +#endif +#define VERSION_BANNER_Y (VERSION_BANNER_Y_GOAL - 40) +#define START_BANNER_X DISPLAY_WIDTH / 2 - 2 +#endif + +extern u8 gReservedSpritePaletteCount; +extern struct MusicPlayerInfo gMPlay_BGM; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG1_X; +extern const u8 gUnknown_08E9D8CC[]; +extern const u16 gUnknown_08E9F624[]; +extern const u8 gUnknown_08E9F7E4[]; +extern const u8 gVersionTiles[]; +extern const u8 gTitleScreenPressStart_Gfx[]; +extern const u16 gTitleScreenLogoShinePalette[]; + +static EWRAM_DATA u8 gUnknown_0202F7E4 = 0; + +#ifdef SAPPHIRE +static const u16 sLegendaryMonPalettes[][16] = +{ + INCBIN_U16("graphics/title_screen/kyogre_dark.gbapal"), + INCBIN_U16("graphics/title_screen/kyogre_glow.gbapal"), +}; +static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/kyogre.4bpp.lz"); +static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/kyogre_map.bin.lz"); +static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/water_map.bin.lz"); +#else +static const u16 sLegendaryMonPalettes[][16] = +{ + INCBIN_U16("graphics/title_screen/groudon_dark.gbapal"), + INCBIN_U16("graphics/title_screen/groudon_glow.gbapal"), +}; +static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/groudon.4bpp.lz"); +static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/groudon_map.bin.lz"); +static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/lava_map.bin.lz"); +#endif +static const u8 sLogoShineTiles[] = INCBIN_U8("graphics/title_screen/logo_shine.4bpp.lz"); +const u16 gUnknown_08393E64[] = +{ + 0x10, + 0x110, + 0x210, + 0x310, + 0x410, + 0x510, + 0x610, + 0x710, + 0x810, + 0x910, + 0xA10, + 0xB10, + 0xC10, + 0xD10, + 0xE10, + 0xF10, + 0x100F, + 0x100E, + 0x100D, + 0x100C, + 0x100B, + 0x100A, + 0x1009, + 0x1008, + 0x1007, + 0x1006, + 0x1005, + 0x1004, + 0x1003, + 0x1002, + 0x1001, + 0x1000, +}; +static const struct OamData sVersionBannerLeftOamData = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 1, + .shape = VERSION_BANNER_SHAPE, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const struct OamData sVersionBannerRightOamData = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 1, + .shape = VERSION_BANNER_SHAPE, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd sVersionBannerLeftAnimSequence[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; +static const union AnimCmd sVersionBannerRightAnimSequence[] = +{ + ANIMCMD_FRAME(VERSION_BANNER_RIGHT_TILEOFFSET, 30), + ANIMCMD_END, +}; +static const union AnimCmd *const sVersionBannerLeftAnimTable[] = +{ + sVersionBannerLeftAnimSequence, +}; +static const union AnimCmd *const sVersionBannerRightAnimTable[] = +{ + sVersionBannerRightAnimSequence, +}; +static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate = +{ + .tileTag = 1000, + .paletteTag = 1000, + .oam = &sVersionBannerLeftOamData, + .anims = sVersionBannerLeftAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_VersionBannerLeft, +}; +static const struct SpriteTemplate sVersionBannerRightSpriteTemplate = +{ + .tileTag = 1000, + .paletteTag = 1000, + .oam = &sVersionBannerRightOamData, + .anims = sVersionBannerRightAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_VersionBannerRight, +}; +static const struct CompressedSpriteSheet gUnknown_08393EFC[] = +{ + {gVersionTiles, VERSION_BANNER_BYTES, 1000}, + {NULL}, +}; +static const struct OamData gOamData_8393F0C = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_8393F14[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F1C[] = +{ + ANIMCMD_FRAME(4, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F24[] = +{ + ANIMCMD_FRAME(8, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F2C[] = +{ + ANIMCMD_FRAME(12, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F34[] = +{ + ANIMCMD_FRAME(16, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F3C[] = +{ + ANIMCMD_FRAME(20, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F44[] = +{ + ANIMCMD_FRAME(24, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_8393F4C[] = +{ + ANIMCMD_FRAME(28, 4), + ANIMCMD_END, +}; +#if GERMAN +static const union AnimCmd gSpriteAnim_839F73C[] = +{ + ANIMCMD_FRAME(32, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_839F744[] = +{ + ANIMCMD_FRAME(36, 4), + ANIMCMD_END, +}; +#endif +static const union AnimCmd *const sStartCopyrightBannerAnimTable[] = +{ + gSpriteAnim_8393F14, + gSpriteAnim_8393F1C, + gSpriteAnim_8393F24, + gSpriteAnim_8393F2C, + gSpriteAnim_8393F34, + gSpriteAnim_8393F3C, + gSpriteAnim_8393F44, + gSpriteAnim_8393F4C, +#if GERMAN + gSpriteAnim_839F73C, + gSpriteAnim_839F744, +#endif +}; +static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate = +{ + .tileTag = 1001, + .paletteTag = 1001, + .oam = &gOamData_8393F0C, + .anims = sStartCopyrightBannerAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_PressStartCopyrightBanner, +}; +static const struct CompressedSpriteSheet gUnknown_08393F8C[] = +{ + {gTitleScreenPressStart_Gfx, 0x520, 1001}, + {NULL}, +}; +const struct SpritePalette sPokemonLogoShinePalette[] = +{ + {gTitleScreenLogoShinePalette, 1001}, + {NULL}, +}; +static const struct OamData sPokemonLogoShineOamData = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd sPokemonLogoShineAnimSequence[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; +static const union AnimCmd *const sPokemonLogoShineAnimTable[] = +{ + sPokemonLogoShineAnimSequence, +}; +static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate = +{ + .tileTag = 1002, + .paletteTag = 1001, + .oam = &sPokemonLogoShineOamData, + .anims = sPokemonLogoShineAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_PokemonLogoShine, +}; +static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] = +{ + {sLogoShineTiles, 0x800, 1002}, + {NULL}, +}; + +#define _RGB(r, g, b) ((((b) & 31) << 10) + (((g) & 31) << 5) + ((r) & 31)) + +#ifdef SAPPHIRE +//Red Kyogre markings +#define LEGENDARY_MARKING_COLOR(c) RGB((c), 0, 0) +#else +//Blue Groundon markings +#define LEGENDARY_MARKING_COLOR(c) RGB(0, 0, (c)) +#endif + +#if defined(GERMAN) && defined(SAPPHIRE) +#define PLTT_BUFFER_INDEX 9 +#elif defined(SAPPHIRE) +#define PLTT_BUFFER_INDEX 26 +#else +#define PLTT_BUFFER_INDEX 21 +#endif + +#define CLEAR_SAVE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_UP) +#define RESET_RTC_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_LEFT) +#define A_B_START_SELECT (A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON) + +static void MainCB2(void); +static void Task_TitleScreenPhase1(u8); +static void Task_TitleScreenPhase2(u8); +static void Task_TitleScreenPhase3(u8); +static void CB2_GoToMainMenu(void); +#if DEBUG +static void CB2_GoToTestMenu(void); +#endif +static void CB2_GoToClearSaveDataScreen(void); +static void CB2_GoToResetRtcScreen(void); +static void CB2_GoToCopyrightScreen(void); +static void UpdateLegendaryMarkingColor(u8); + +void SpriteCallback_VersionBannerLeft(struct Sprite *sprite) +{ + struct Task *task = &gTasks[sprite->data[1]]; + + if (task->data[1] != 0) + { + sprite->oam.objMode = 0; + sprite->pos1.y = VERSION_BANNER_Y_GOAL; + sprite->invisible = FALSE; + } + else + { + if (task->data[5] != 0) + task->data[5]--; + if (task->data[5] < 64) + { + sprite->invisible = FALSE; + if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) + sprite->pos1.y++; + REG_BLDALPHA = gUnknown_08393E64[task->data[5] / 2]; + } + } +} + +void SpriteCallback_VersionBannerRight(struct Sprite *sprite) +{ + struct Task *task = &gTasks[sprite->data[1]]; + + if (task->data[1] != 0) + { + sprite->oam.objMode = 0; + sprite->pos1.y = VERSION_BANNER_Y_GOAL; + sprite->invisible = FALSE; + } + else + { + if (task->data[5] < 64) + { + sprite->invisible = FALSE; + if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) + sprite->pos1.y++; + } + } +} + +void SpriteCallback_PressStartCopyrightBanner(struct Sprite *sprite) +{ + if (sprite->data[0] == 1) + { + sprite->data[1]++; + //Alternate between hidden and shown every 16th frame + if (sprite->data[1] & 16) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + } + else + sprite->invisible = FALSE; +} + +#if ENGLISH +static void CreatePressStartBanner(s16 x, s16 y) +{ + u8 i; + u8 spriteId; + + x -= 32; + for (i = 0; i < 3; i++, x += 32) + { + spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); + StartSpriteAnim(&gSprites[spriteId], i); + gSprites[spriteId].data[0] = 1; + } +} +#elif GERMAN +__attribute__((naked)) +static void CreatePressStartBanner(s16 x, s16 y) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 16\n\ + ldr r2, _0807C3AC @ =0xffe00000\n\ + adds r0, r2\n\ + lsrs r0, 16\n\ + movs r6, 0\n\ + lsls r1, 16\n\ + mov r10, r1\n\ + mov r8, r10\n\ +_0807C302:\n\ + lsls r5, r0, 16\n\ + asrs r5, 16\n\ + ldr r0, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ + adds r1, r5, 0\n\ + mov r3, r8\n\ + asrs r2, r3, 16\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + ldr r0, _0807C3B4 @ =gSprites\n\ + mov r9, r0\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + adds r1, r6, 0\n\ + bl StartSpriteAnim\n\ + movs r7, 0x1\n\ + strh r7, [r4, 0x2E]\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r5, 0x20\n\ + lsls r5, 16\n\ + lsrs r0, r5, 16\n\ + cmp r6, 0x2\n\ + bls _0807C302\n\ + ldr r1, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ + mov r8, r1\n\ + lsls r5, r0, 16\n\ + asrs r5, 16\n\ + mov r2, r10\n\ + asrs r6, r2, 16\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + movs r1, 0x8\n\ + bl StartSpriteAnim\n\ + strh r7, [r4, 0x2E]\n\ + subs r5, 0x60\n\ + lsls r5, 16\n\ + asrs r5, 16\n\ + subs r6, 0x8\n\ + lsls r6, 16\n\ + asrs r6, 16\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + movs r1, 0x9\n\ + bl StartSpriteAnim\n\ + strh r7, [r4, 0x2E]\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0807C3AC: .4byte 0xffe00000\n\ +_0807C3B0: .4byte sStartCopyrightBannerSpriteTemplate\n\ +_0807C3B4: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif + +static void CreateCopyrightBanner(s16 x, s16 y) +{ + u8 i; + u8 spriteId; + + x -= 64; + for (i = 0; i < 5; i++, x += 32) + { + spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0); + StartSpriteAnim(&gSprites[spriteId], i + 3); + } +} + +void SpriteCallback_PokemonLogoShine(struct Sprite *sprite) +{ + if (gTasks[gUnknown_0202F7E4].data[1] == 0 && sprite->pos1.x < 272) + { + if (sprite->data[0]) //Flash background + { + u16 backgroundColor; + + if (sprite->pos1.x < DISPLAY_WIDTH / 2) + { + //Brighten background color + if (sprite->data[1] < 31) + sprite->data[1]++; + if (sprite->data[1] < 31) + sprite->data[1]++; + } + else + { + //Darken background color + if (sprite->data[1] != 0) + sprite->data[1]--; + if (sprite->data[1] != 0) + sprite->data[1]--; + } + backgroundColor = _RGB(sprite->data[1], sprite->data[1], sprite->data[1]); + gPlttBufferFaded[0] = backgroundColor; + gPlttBufferFaded[PLTT_BUFFER_INDEX] = backgroundColor; + } + sprite->pos1.x += 4; + } + else + { + gPlttBufferFaded[0] = RGB_BLACK; + gPlttBufferFaded[PLTT_BUFFER_INDEX] = RGB_BLACK; + DestroySprite(sprite); + } +} + +static void StartPokemonLogoShine(bool8 flashBackground) +{ + u8 spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0); + + gSprites[spriteId].oam.objMode = 2; + gSprites[spriteId].data[0] = flashBackground; +} + +static void VBlankCB(void) +{ + ScanlineEffect_InitHBlankDmaTransfer(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_BG1VOFS = gBattle_BG1_Y; +} + + +#define tCounter data[0] +#define tSkipToNext data[1] + +void CB2_InitTitleScreen(void) +{ + switch (gMain.state) + { + default: + case 0: + SetVBlankCallback(NULL); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + *((u16 *)PLTT) = RGB_WHITE; + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, (void *)VRAM, 0x18000); + DmaFill32(3, 0, (void *)OAM, 0x400); + DmaFill16(3, 0, (void *)(PLTT + 2), 0x3FE); + ResetPaletteFade(); + gMain.state = 1; + break; + case 1: + LZ77UnCompVram(gUnknown_08E9D8CC, (void *)VRAM); + LZ77UnCompVram(gUnknown_08E9F7E4, (void *)(VRAM + 0x4800)); + LoadPalette(gUnknown_08E9F624, 0, 0x1C0); + LZ77UnCompVram(sLegendaryMonPixelData, (void *)(VRAM + 0x8000)); + LZ77UnCompVram(sLegendaryMonTilemap, (void *)(VRAM + 0xC000)); + LZ77UnCompVram(sBackdropTilemap, (void *)(VRAM + 0xC800)); + LoadPalette(sLegendaryMonPalettes, 0xE0, sizeof(sLegendaryMonPalettes)); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 14; + LoadCompressedObjectPic(&gUnknown_08393EFC[0]); + LoadCompressedObjectPic(&gUnknown_08393F8C[0]); + LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]); + LoadPalette(gUnknown_08E9F624, 0x100, 0x1C0); + LoadSpritePalette(&sPokemonLogoShinePalette[0]); + gMain.state = 2; + break; + case 2: + { + u8 taskId = CreateTask(Task_TitleScreenPhase1, 0); + + gTasks[taskId].tCounter = 256; + gTasks[taskId].tSkipToNext = FALSE; + gTasks[taskId].data[2] = -16; + gTasks[taskId].data[3] = -32; + gUnknown_0202F7E4 = taskId; + gMain.state = 3; + break; + } + case 3: + BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF); + SetVBlankCallback(VBlankCB); + gMain.state = 4; + break; + case 4: + { + u16 savedIme; + + sub_813CE30(0x78, 0x50, 0x100, 0); + REG_BG2X = -29 * 256; + REG_BG2Y = -33 * 256; + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0x1F1F; + REG_WINOUT = 0x3F1F; + REG_BLDCNT = 0x84; + REG_BLDALPHA = 0; + REG_BLDY = 0x8; + REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(25) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_256COLOR | BGCNT_AFF256x256; + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_1 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG2_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON + | DISPCNT_OBJWIN_ON; + m4aSongNumStart(0x19D); + gMain.state = 5; + break; + } + case 5: + if (!UpdatePaletteFade()) + { + StartPokemonLogoShine(FALSE); + ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 0, SCANLINE_EFFECT_REG_BG1HOFS, TRUE); + SetMainCallback2(MainCB2); + } + break; + } +} + +static void MainCB2(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +//Shine the Pokemon logo two more times, and fade in the version banner +static void Task_TitleScreenPhase1(u8 taskId) +{ + //Skip to next phase when A, B, Start, or Select is pressed + if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].data[1] != 0) + { + gTasks[taskId].tSkipToNext = TRUE; + gTasks[taskId].tCounter = 0; + } + + if (gTasks[taskId].tCounter != 0) + { + u16 frameNum = gTasks[taskId].tCounter; + + if (frameNum == 160 || frameNum == 64) + StartPokemonLogoShine(TRUE); + gTasks[taskId].tCounter--; + } + else + { + u8 spriteId; + + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0x3F50; + REG_BLDALPHA = 0x1F; + REG_BLDY = 0; + + //Create left side of version banner + spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[1] = taskId; + + //Create right side of version banner + spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[1] = taskId; + + gTasks[taskId].data[5] = 88; + gTasks[taskId].tCounter = 144; + gTasks[taskId].func = Task_TitleScreenPhase2; + } +} + +//Create "Press Start" and copyright banners, and slide Pokemon logo up +static void Task_TitleScreenPhase2(u8 taskId) +{ + //Skip to next phase when A, B, Start, or Select is pressed + if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].tSkipToNext) + { + gTasks[taskId].tSkipToNext = TRUE; + gTasks[taskId].tCounter = 0; + } + + if (gTasks[taskId].tCounter != 0) + gTasks[taskId].tCounter--; + else + { + gTasks[taskId].tSkipToNext = TRUE; + REG_DISPCNT = DISPCNT_MODE_1 + | DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_BG1_ON + | DISPCNT_BG2_ON + | DISPCNT_OBJ_ON; + CreatePressStartBanner(START_BANNER_X, 108); + CreateCopyrightBanner(DISPLAY_WIDTH / 2, 148); + gTasks[taskId].data[4] = 0; + gTasks[taskId].func = Task_TitleScreenPhase3; + } + + if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0) + gTasks[taskId].data[3]++; + + //Slide Pokemon logo up + REG_BG2Y = gTasks[taskId].data[3] * 256; +} + +//Show Kyogre/Groundon silhouette and process main title screen input +static void Task_TitleScreenPhase3(u8 taskId) +{ + REG_BLDCNT = 0x2142; + REG_BLDALPHA = 0x1F0F; + REG_BLDY = 0; + + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & START_BUTTON)) + { + FadeOutBGM(4); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); + SetMainCallback2(CB2_GoToMainMenu); + } + else + { + if ((gMain.heldKeys & CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO) + SetMainCallback2(CB2_GoToClearSaveDataScreen); + if ((gMain.heldKeys & RESET_RTC_BUTTON_COMBO) == RESET_RTC_BUTTON_COMBO + && CanResetRTC() == 1) + { + FadeOutBGM(4); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + SetMainCallback2(CB2_GoToResetRtcScreen); + } +#if DEBUG + else if (gMain.heldKeys == SELECT_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + SetMainCallback2(CB2_GoToTestMenu); + } +#endif + else + { + REG_BG2Y = 0; + gTasks[taskId].tCounter++; + if (gTasks[taskId].tCounter & 1) + { + gTasks[taskId].data[4]++; + gBattle_BG1_Y = gTasks[taskId].data[4]; + gBattle_BG1_X = 0; + } + UpdateLegendaryMarkingColor(gTasks[taskId].tCounter); + if ((gMPlay_BGM.status & 0xFFFF) == 0) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); + SetMainCallback2(CB2_GoToCopyrightScreen); + } + } + } +} + +static void CB2_GoToMainMenu(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitMainMenu); +} + +#if DEBUG +static void CB2_GoToTestMenu(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitTestMenu); +} +#endif + +static void CB2_GoToCopyrightScreen(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen); +} + +static void CB2_GoToClearSaveDataScreen(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitClearSaveDataScreen); +} + +static void CB2_GoToResetRtcScreen(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(CB2_InitResetRtcScreen); +} + +static void UpdateLegendaryMarkingColor(u8 frameNum) +{ + u16 palette; + + if ((frameNum % 4) == 0) //Change color every 4th frame + { + u8 colorIntensity = (frameNum >> 2) & 31; //Take bits 2-6 of frameNum the color intensity + u8 fadeDarker = (frameNum >> 2) & 32; + + if (!fadeDarker) + palette = LEGENDARY_MARKING_COLOR(colorIntensity); + else + palette = LEGENDARY_MARKING_COLOR(31 - colorIntensity); + LoadPalette(&palette, 0xEF, sizeof(palette)); + } +} + diff --git a/src/trade.c b/src/trade.c new file mode 100644 index 000000000..36e6fc757 --- /dev/null +++ b/src/trade.c @@ -0,0 +1,5692 @@ +#include "global.h" +#include "name_string_util.h" +#include "string_util.h" +#include "text.h" +#include "main.h" +#include "constants/species.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/easy_chat.h" +#include "link.h" +#include "strings2.h" +#include "graphics.h" +#include "palette.h" +#include "task.h" +#include "menu.h" +#include "text_window.h" +#include "pokemon_icon.h" +#include "cable_club.h" +#include "party_menu.h" +#include "constants/songs.h" +#include "sound.h" +#include "data2.h" +#include "pokemon_summary_screen.h" +#include "overworld.h" +#include "rom_8077ABC.h" +#include "daycare.h" +#include "event_data.h" +#include "strings.h" +#include "load_save.h" +#include "save.h" +#include "script.h" +#include "field_fadetransition.h" +#include "decompress.h" +#include "mail_data.h" +#include "evolution_scene.h" +#include "pokeball.h" +#include "pokedex.h" +#include "field_effect.h" +#include "util.h" +#include "battle_interface.h" +#include "trade.h" +#include "ewram.h" + +#ifdef ENGLISH +#define sub_804A96C_alt sub_804A96C +asm(".set sub_804A96C_alt, sub_804A96C"); +#endif + +#define Trade_SendData(ptr) (SendBlock(bitmask_all_link_players_but_self(), ptr->linkData, 20)) + +struct InGameTrade { + /*0x00*/ u8 name[11]; + /*0x0C*/ u16 species; + /*0x0E*/ u8 ivs[6]; + /*0x14*/ bool8 secondAbility; + /*0x18*/ u32 otId; + /*0x1C*/ u8 stats[5]; + /*0x24*/ u32 personality; + /*0x28*/ u16 heldItem; + /*0x2A*/ u8 mailNum; + /*0x2B*/ u8 otName[11]; + /*0x36*/ u8 otGender; + /*0x37*/ u8 sheen; + /*0x38*/ u16 playerSpecies; +}; + +struct UnkStructC { + /*0x00*/ u16 words[9]; + /*0x10*/ u8 string[8]; + /*0x1A*/ u8 otId[4]; + /*0x1E*/ u16 species; + /*0x20*/ u16 heldItem; +}; + +struct UnkStructD { + /*0x00*/ u8 filler_00[8]; + /*0x08*/ void *vramAddr; + /*0x0c*/ u8 filler_0c[4]; + /*0x10*/ u8 unk_10; + /*0x12*/ u16 unk_12[0x400]; +}; + +struct UnkStructE { + /*0x00*/ u8 unk_00; + /*0x02*/ u16 unk_02; + /*0x04*/ u8 unk_04; +}; + +struct TradeEwramSubstruct { + /*0x0000*/ u8 unk_0000; + /*0x0001*/ u8 unk_0001; + /*0x0004*/ struct Window window; + /*0x0034*/ u8 partyIcons[2][6]; + /*0x0040*/ u8 tradeMenuCursorSpriteIdx; + /*0x0041*/ u8 tradeMenuCursorPosition; + /*0x0042*/ u8 partyCounts[2]; + /*0x0044*/ u8 tradeMenuOptionsActive[13]; + /*0x0051*/ u8 unk_0051[2][6]; + /*0x005d*/ u8 unk_005d[2][6]; + /*0x005d*/ u8 unk_0069[2][6]; + /*0x0075*/ u8 unk_0075; + /*0x0076*/ u8 filler_0076[4]; + /*0x007a*/ u8 unk_007a; + /*0x007b*/ u8 unk_007b; + /*0x007c*/ u8 unk_007c; + /*0x007d*/ u8 unk_007d; + /*0x007e*/ u16 unk_007e; + /*0x0080*/ u8 unk_0080[2]; + /*0x0082*/ u8 unk_0082[2]; + /*0x0084*/ u8 unk_0084; + /*0x0085*/ u8 unk_0085; + /*0x0086*/ u8 unk_0086; + /*0x0087*/ u8 unk_0087; + /*0x0088*/ u8 filler_0088[2]; + /*0x008a*/ u8 unk_008a; + /*0x008c*/ u16 linkData[20]; + /*0x00b4*/ u8 unk_00b4; + /*0x00b5*/ u8 unk_00b5[11]; + /*0x00c0*/ u8 filler_00c0[8]; + /*0x00c8*/ struct UnkStructD unk_00c8; + /*0x08dc*/ struct UnkStructE unk_08dc[4]; + /*0x08fc*/ u8 filler_08fc[0x704]; +}; + +IWRAM_DATA u8 gUnknown_03000508[8]; + +struct UnkStructF { + u8 filler_0000[9]; + u8 unk_0009; + u8 filler_000a[0xff6]; +}; + +struct TradeEwramStruct { + /*0x00000*/ u8 filler_00000[0x7000]; + /*0x07000*/ struct TradeEwramSubstruct unk_07000; + /*0x08000*/ struct UnkStructF unk_08000; + /*0x09000*/ u8 filler_09000[0x4000]; + /*0x0d000*/ u8 tileBuffers[13][256]; + /*0x0dd00*/ u8 filler_0dd00[0x1300]; + /*0x0f000*/ struct TradeEwramSubstruct2 unk_0f000; +}; + +static void sub_8047EC0(void); +static void sub_804AFB8(const struct WindowTemplate *, u8 *, const u8 *, u8); +static void sub_804ACD8(const u8 *, u8 *, u8); +static void nullsub_5(u8, u8); +static void sub_804AA88(void); +static void sub_804A964(struct UnkStructD *, void *); +static void sub_80489F4(void); +static void sub_804AA0C(u8); +static bool8 sub_8048D44(void); +static void sub_804AF84(void); +static bool8 sub_804ABF8(void); +static void sub_804ACF4(u8); +static void sub_804A41C(u8); +static void sub_8048C70(void); +static void sub_8048B0C(u8); +static void sub_804AE3C(u8); +static void sub_804AF10(void); +static void sub_80494D8(void); +static void sub_8048AB4(void); +static void sub_804A940(struct UnkStructD *); +static void sub_804B41C(void); +static void sub_8049DE0(void); +static void sub_804AB30(void); +static void sub_8049ED4(u8); +static void sub_804A6DC(u8); +static void sub_804A938(struct UnkStructD *); +static void sub_804A9F4(u8); +static void sub_804AA00(u8); +static void sub_8049E9C(u8); +static void sub_804AADC(u16, u8); +static void sub_804A80C(void); +static u8 sub_80499F0(const u8 *, u8, u8); +static void sub_804A840(u8); +#ifdef NONMATCHING +static +#endif +u8 sub_804A2B4(u8 *, u8, u8); +static void sub_804A96C_alt(struct UnkStructD *, u8, u8, const u16 *, u8, u8, u16); +static void sub_804A96C(struct UnkStructD *, u8, u8, const u16 *, u8, u8, u16); +#ifdef NONMATCHING +static +#endif +void sub_804A33C(u8 *, u8, u8); +#ifdef NONMATCHING +static +#endif +void sub_804A51C(u8, u8, u8, u8, u8, u8); +static void sub_804D7AC(struct Sprite *); +static bool8 sub_804C29C(void); +static void sub_804DC18(void); +static u8 sub_804B2B0(void); +static void sub_804E144(void); +static void sub_804E1A0(u8); +static void sub_804DAD4(struct MailStruct *, const struct InGameTrade *); +static void sub_804DC88(void); +static void sub_804D6BC(struct Sprite *); +static void sub_804D738(struct Sprite *); +static void sub_804BBE8(u8); +static void sub_804B058(struct Sprite *); +static void sub_804B07C(struct Sprite *); +static void sub_804B0BC(struct Sprite *); +static void sub_804B104(struct Sprite *); +static void sub_804D80C(struct Sprite *); +static void sub_804E1DC(void); +static void sub_804BBCC(void); +static void sub_804D8E4(void); +static void sub_804C164(void); +static void sub_804C1A8(void); +#ifdef NONMATCHING +static +#endif +void sub_804DB84(void); + +EWRAM_DATA u8 *gUnknown_020296CC[13] = {0}; +EWRAM_DATA struct MailStruct gUnknown_02029700[6] = {0}; +EWRAM_DATA u8 gUnknown_020297D8[2] = {0}; + +extern struct TradeEwramSubstruct *gUnknown_03004824; + +const u32 unref_data_820ABD4[] = +{ + 0x00000890, + 0x00003AC0, + 0x0000001C, + 0x00000530, + 0x00000024, + 0x00000064, + 0x000004D8 +}; + +const u16 gTradeMovesBoxTilemap[] = INCBIN_U16("graphics/trade/moves_box_map.bin"); +const u16 gTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_map.bin"); +const u16 gTradeStripesBG2Tilemap[] = INCBIN_U16("graphics/trade/stripes_bg2_map.bin"); +const u16 gTradeStripesBG3Tilemap[] = INCBIN_U16("graphics/trade/stripes_bg3_map.bin"); + +const struct OamData gOamData_820BFEC = { + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_820BFF4[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820BFFC[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C004[] = { + ANIMCMD_FRAME(16, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C00C[] = { + ANIMCMD_FRAME(24, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C014[] = { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C01C[] = { + ANIMCMD_FRAME(40, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_820C024[] = { + gSpriteAnim_820BFF4, + gSpriteAnim_820BFFC, + gSpriteAnim_820C004, + gSpriteAnim_820C00C, + gSpriteAnim_820C014, + gSpriteAnim_820C01C +}; + +const u16 TradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text1.gbapal"); +const u16 UnrefTradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text2.gbapal"); + +const struct SpriteSheet gUnknown_0820C07C[] = { + {ewram_2010000.tileBuffers[ 0], 256, 200}, + {ewram_2010000.tileBuffers[ 1], 256, 201}, + {ewram_2010000.tileBuffers[ 2], 256, 202}, + {ewram_2010000.tileBuffers[ 3], 256, 203}, + {ewram_2010000.tileBuffers[ 4], 256, 204}, + {ewram_2010000.tileBuffers[ 5], 256, 205}, + {ewram_2010000.tileBuffers[ 6], 256, 206}, + {ewram_2010000.tileBuffers[ 7], 256, 207}, + {ewram_2010000.tileBuffers[ 8], 256, 208}, + {ewram_2010000.tileBuffers[ 9], 256, 209}, + {ewram_2010000.tileBuffers[10], 256, 210}, + {ewram_2010000.tileBuffers[11], 256, 211}, + {ewram_2010000.tileBuffers[12], 256, 212}, +}; + +const struct SpritePalette gSpritePalette_TradeScreenText = { + TradeScreenTextPalette, 4925 +}; + +const struct SpriteTemplate gSpriteTemplate_820C0EC = { + 200, + 4925, + &gOamData_820BFEC, + gSpriteAnimTable_820C024, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_820C104 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 3, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_820C10C[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C114[] = { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_820C11C[] = { + gSpriteAnim_820C10C, + gSpriteAnim_820C114 +}; + +const struct SpriteSheet gUnknown_0820C124 = { + gUnknown_08EA1DEC, 0x800, 300 +}; + +const struct SpritePalette gUnknown_0820C12C = { + gUnknown_08EA0328, 2345 +}; + +const struct SpriteTemplate gSpriteTemplate_820C134 = { + 300, + 2345, + &gOamData_820C104, + gSpriteAnimTable_820C11C, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const u8 *const gUnknown_0820C14C[] = { + TradeText_Cancel, + TradeText_ChoosePoke, + TradeText_Summary1, + TradeText_Trade1, + TradeText_CancelTradePrompt, + TradeText_PressBToExit +}; + +// This is used to determine the next mon to select when the D-Pad is +// pressed in a given direction. +// Note that the mons are laid out like this. +// 0-5 are the player's party and 6-11 are the trading partner's party. +// 12 is the cancel button. +// 0 1 6 7 +// 2 3 8 9 +// 4 5 10 11 +// 12 + +const u8 gTradeNextSelectedMonTable[][4][6] = { + { + { 4, 2, 12, 12, 0, 0}, + { 2, 4, 12, 12, 0, 0}, + { 7, 6, 1, 0, 0, 0}, + { 1, 6, 7, 0, 0, 0} + }, { + { 5, 3, 12, 12, 0, 0}, + { 3, 5, 12, 12, 0, 0}, + { 0, 7, 6, 1, 0, 0}, + { 6, 7, 0, 1, 0, 0} + }, { + { 0, 0, 0, 0, 0, 0}, + { 4, 0, 0, 0, 0, 0}, + { 9, 8, 7, 6, 0, 0}, + { 3, 1, 0, 0, 0, 0} + }, { + { 1, 1, 1, 1, 0, 0}, + { 5, 1, 1, 1, 0, 0}, + { 2, 9, 8, 7, 0, 0}, + { 8, 9, 6, 6, 0, 0} + }, { + { 2, 2, 2, 2, 0, 0}, + { 0, 0, 0, 0, 0, 0}, + {11, 10, 9, 8, 7, 6}, + { 5, 3, 1, 0, 0, 0} + }, { + { 3, 3, 3, 3, 0, 0}, + { 1, 1, 1, 1, 0, 0}, + { 4, 4, 4, 4, 0, 0}, + {10, 8, 6, 0, 0, 0} + }, { + {10, 8, 12, 0, 0, 0}, + { 8, 10, 12, 0, 0, 0}, + { 1, 0, 0, 0, 0, 0}, + { 7, 0, 1, 0, 0, 0} + }, { + {12, 0, 0, 0, 0, 0}, + { 9, 12, 0, 0, 0, 0}, + { 6, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0} + }, { + { 6, 0, 0, 0, 0, 0}, + {10, 6, 0, 0, 0, 0}, + { 3, 2, 1, 0, 0, 0}, + { 9, 7, 0, 0, 0, 0} + }, { + { 7, 0, 0, 0, 0, 0}, + {11, 12, 0, 0, 0, 0}, + { 8, 0, 0, 0, 0, 0}, + { 2, 1, 0, 0, 0, 0} + }, { + { 8, 0, 0, 0, 0, 0}, + { 6, 0, 0, 0, 0, 0}, + { 5, 4, 3, 2, 1, 0}, + {11, 9, 7, 0, 0, 0} + }, { + { 9, 0, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0}, + {10, 0, 0, 0, 0, 0}, + { 4, 2, 0, 0, 0, 0} + }, { + {11, 9, 7, 6, 0, 0}, + { 7, 6, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0} + } +}; + +const u8 gTradeMonSpriteCoords[][2] = { + // Your party + {1, 5}, + {8, 5}, + {1, 10}, + {8, 10}, + {1, 15}, + {8, 15}, + + // Friend's party + {16, 5}, + {23, 5}, + {16, 10}, + {23, 10}, + {16, 15}, + {23, 15}, + + {23, 18} // CANCEL +}; + +const u8 gTradeLevelDisplayCoords[2][6][2] = { + { + // Your party + {5, 4}, + {12, 4}, + {5, 9}, + {12, 9}, + {5, 14}, + {12, 14}, + }, + { + // Friend's party + {20, 4}, + {27, 4}, + {20, 9}, + {27, 9}, + {20, 14}, + {27, 14} + } +}; + +const u8 gTradeMonBoxCoords[2][6][2] = { + { + // Your party + {1, 3}, + {8, 3}, + {1, 8}, + {8, 8}, + {1, 13}, + {8, 13}, + }, + { + // Friend's party + {16, 3}, + {23, 3}, + {16, 8}, + {23, 8}, + {16, 13}, + {23, 13} + } +}; + +const u8 gTradeUnknownSpriteCoords[][2][2] = { + { + { 59, 10}, + {179, 10}, + }, + { + { 59, 10}, + {179, 10} + } +}; + +const u8 *const gUnknown_0820C2F0[] = { + TradeText_LinkStandby, + TradeText_TradeCancelled, + TradeText_OnlyPoke, + TradeText_NonTradablePoke, + TradeText_WaitingForFriend, + TradeText_WantToTrade +}; + +const u8 gTradeMessageWindowRects[][4] = { + {8, 7, 22, 12}, + {8, 7, 22, 12}, + {6, 7, 24, 12}, + {6, 7, 24, 12}, + {8, 7, 22, 12}, + {7, 7, 23, 12} +}; + +const struct MenuAction2 gUnknown_0820C320[] = { + {TradeText_Summary2, sub_804A9F4}, + {TradeText_Trade2, sub_804AA00} +}; + +const u8 gUnknown_0820C330[][2] = { + { 0, 14}, + {15, 29} +}; + +const u8 gUnknown_0820C334[][2] = { + { 3, 5}, + { 3, 7}, + {18, 5}, + {18, 7} +}; + +const u8 gOtherText_Terminator[] = _(""); +const u8 gOtherText_MaleSymbol3[] = _("♂"); +const u8 gOtherText_FemaleSymbol3[] = _("♀"); +const u8 gOtherText_GenderlessSymbol[] = _("$"); + +u8 *const unref_data_820C344 = gTileBuffer; +const u8 unref_strings_820C348[][13] = { + _("かいめの そうしん"), + _("かいめの じゅしん"), + _("ポケモンアイコンセット"), + _("OBJテキストセット"), + _("セルセット"), + _("OBJテキストADD"), + _("システムメッセージADD"), + _("はいけいセット"), +}; + +const u8 gUnknown_0820C3B0[] = _("ヌケニン"); +const u8 unref_string_0820C3B5[] = _("こうかんせいりつ "); +const u8 unref_string_0820C3C3[] = _("だめだたらしいよ "); +const u8 gUnknown_0820C3D1[][2] = { + { 4, 3}, + {19, 3}, + { 0, 0} +}; + +const u16 gTradeBallPalette[] = INCBIN_U16("graphics/trade/ball.gbapal"); +const u32 gTradeBallTiles[] = INCBIN_U32("graphics/trade/ball.4bpp"); +const u16 gUnknown_0820C9F8[][16] = { + INCBIN_U16("graphics/trade/unknown.gbapal"), + INCBIN_U16("graphics/trade/gba.gbapal"), + INCBIN_U16("graphics/trade/shadow.gbapal"), + {}, + INCBIN_U16("graphics/trade/misc.gbapal") +}; + +const u32 gUnknown_0820CA98[] = INCBIN_U32("graphics/trade/gba.4bpp"); +const u32 gUnknown_0820CA98_2[] = INCBIN_U32("graphics/trade/shadow.4bpp"); +const u32 gUnknown_0820DD98[] = INCBIN_U32("graphics/trade/pokeball_symbol.8bpp"); +const u16 gUnknown_0820F798[] = INCBIN_U16("graphics/trade/shadow_map.bin"); +const u16 gUnknown_08210798[] = INCBIN_U16("graphics/trade/gba_map.bin"); +const u16 gUnknown_08211798[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); +const u16 gUnknown_08211F98[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); +const u16 unused_08212098[] = INCBIN_U16("graphics/unused/unknown/8212098.gbapal"); +const u16 gTradeCableEndPalette[] = INCBIN_U16("graphics/trade/cable_end.gbapal"); +const u16 unused_082120D8[] = INCBIN_U16("graphics/unused/unknown/82120D8.gbapal"); +const u16 nullpal_082120F8[16] = {}; +const u16 gTradeGlowPalette[] = INCBIN_U16("graphics/trade/glow.gbapal"); +const u32 gTradeGlow1Tiles[] = INCBIN_U32("graphics/trade/glow1.4bpp"); +const u32 gTradeGlow2Tiles[] = INCBIN_U32("graphics/trade/glow2.4bpp"); +const u32 gTradeCableEndTiles[] = INCBIN_U32("graphics/trade/cable_end.4bpp"); +const u32 gTradeGBAScreenTiles[] = INCBIN_U32("graphics/trade/gba_screen.4bpp"); +const u32 gUnknown_08213738[] = INCBIN_U32("graphics/trade/gba_affine.8bpp"); +const u16 gUnknown_08215778[] = INCBIN_U16("graphics/trade/gba_affine_map.bin"); + +const struct OamData gOamData_8215878 = { + .affineMode = 1, + .size = 1 +}; + +const union AnimCmd gSpriteAnim_8215880[] = { + ANIMCMD_FRAME( 0, 3), + ANIMCMD_FRAME( 4, 3), + ANIMCMD_FRAME( 8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(20, 3), + ANIMCMD_FRAME(24, 3), + ANIMCMD_FRAME(28, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(36, 3), + ANIMCMD_FRAME(40, 3), + ANIMCMD_FRAME(44, 3), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME( 0, 3), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_82158BC[] = { + ANIMCMD_FRAME( 0, 3), + ANIMCMD_FRAME( 4, 3), + ANIMCMD_FRAME( 8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(20, 3), + ANIMCMD_FRAME(24, 3), + ANIMCMD_FRAME(28, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(36, 3), + ANIMCMD_FRAME(40, 3), + ANIMCMD_FRAME(44, 3), + ANIMCMD_LOOP(2), + ANIMCMD_FRAME( 0, 3), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_82158F8[] = { + gSpriteAnim_8215880, + gSpriteAnim_82158BC +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215900[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215910[] = { + AFFINEANIMCMD_FRAME(-8, 0, 0, 20), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215920[] = { + AFFINEANIMCMD_FRAME(0x60, 0x100, 0, 0), + AFFINEANIMCMD_FRAME( 0, 0, 0, 5), + AFFINEANIMCMD_FRAME( 8, 0, 0, 20), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_8215940[] = { + gSpriteAffineAnim_8215900, + gSpriteAffineAnim_8215910, + gSpriteAffineAnim_8215920 +}; + +const struct SpriteSheet gUnknown_0821594C = { + (const u8 *)gTradeBallTiles, 0x600, 5557 +}; + +const struct SpritePalette gUnknown_08215954 = { + gTradeBallPalette, 5558 +}; + +const struct SpriteTemplate gSpriteTemplate_821595C = { + 5557, + 5558, + &gOamData_8215878, + gSpriteAnimTable_82158F8, + NULL, + gSpriteAffineAnimTable_8215940, + sub_804D6BC +}; + +const struct OamData gOamData_8215974 = { + .affineMode = 1, + .objMode = 1, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_821597C[] = { + ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8215984[] = { + gSpriteAnim_821597C +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215988[] = { + AFFINEANIMCMD_FRAME(-10, -10, 0, 5), + AFFINEANIMCMD_FRAME(10, 10, 0, 5), + AFFINEANIMCMD_JUMP(0) +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_82159A0[] = { + gSpriteAffineAnim_8215988 +}; + +const struct SpriteSheet gUnknown_082159A4 = { + (const u8 *)gTradeGlow1Tiles, 0x200, 5550 +}; + +const struct SpritePalette gUnknown_082159AC = { + gTradeGlowPalette, 5551 +}; + +const struct SpritePalette gUnknown_082159B4 = { + gTradeCableEndPalette, 5555 +}; + +const struct SpriteTemplate gSpriteTemplate_82159BC = { + 5550, + 5551, + &gOamData_8215974, + gSpriteAnimTable_8215984, + NULL, + gSpriteAffineAnimTable_82159A0, + sub_804B058 +}; + +const struct OamData gOamData_82159D4 = { + .shape = ST_OAM_V_RECTANGLE, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_82159DC[] = { + ANIMCMD_FRAME(0, 5, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_82159E4[] = { + ANIMCMD_FRAME(8, 5, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_82159EC[] = { + gSpriteAnim_82159DC, + gSpriteAnim_82159E4 +}; + +const struct SpriteSheet gUnknown_082159F4 = { + (const u8 *)gTradeGlow2Tiles, 0x300, 5552 +}; + +const struct SpriteTemplate gSpriteTemplate_82159FC = { + 5552, + 5551, + &gOamData_82159D4, + gSpriteAnimTable_82159EC, + NULL, + gDummySpriteAffineAnimTable, + sub_804B07C +}; + +const struct OamData gOamData_8215A14 = { + .shape = ST_OAM_V_RECTANGLE, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8215A1C[] = { + ANIMCMD_FRAME(0, 10), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8215A24[] = { + gSpriteAnim_8215A1C +}; + +const struct SpriteSheet gUnknown_08215A28 = { + (const u8 *)gTradeCableEndTiles, 0x100, 5554 +}; + +const struct SpriteTemplate gSpriteTemplate_8215A30 = { + 5554, + 5555, + &gOamData_8215A14, + gSpriteAnimTable_8215A24, + NULL, + gDummySpriteAffineAnimTable, + sub_804B0BC +}; + +const struct OamData gOamData_8215A48 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 3, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8215A50[] = { + ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(96, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_LOOP(8), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8215A74[] = { + gSpriteAnim_8215A50 +}; + +const struct SpriteSheet gUnknown_08215A78 = { + (const u8 *)gTradeGBAScreenTiles, 0x1000, 5556 +}; + +const struct SpriteTemplate gSpriteTemplate_8215A80 = { + 5556, + 5555, + &gOamData_8215A48, + gSpriteAnimTable_8215A74, + NULL, + gDummySpriteAffineAnimTable, + sub_804B104 +}; + +const u16 gTradeGlow2PaletteAnimTable[] = { + RGB(18, 24, 31), + RGB(18, 24, 31), + RGB(18, 24, 31), + RGB(31, 31, 31), + RGB(31, 31, 31), + RGB(31, 31, 31), + RGB(18, 24, 31), + RGB(18, 24, 31), + RGB(18, 24, 31), + RGB(31, 31, 31), + RGB(31, 31, 31), + RGB(31, 31, 31), +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215AB0[] = { + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_JUMP(0) +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_8215AC0[] = { + gSpriteAffineAnim_8215AB0 +}; + +const struct InGameTrade gIngameTrades[] = { +#if ENGLISH + { + _("MAKIT"), SPECIES_MAKUHITA, + 5, 5, 4, 4, 4, 4, + TRUE, 49562, + 5, 5, 5, 5, 30, + 0x9C40, + ITEM_X_ATTACK, -1, + _("ELYSSA"), MALE, 10, + SPECIES_SLAKOTH + }, { + _("SKITIT"), SPECIES_SKITTY, + 5, 4, 4, 5, 4, 4, + FALSE, 2259, + 5, 5, 30, 5, 5, + 0x498A2E17, + ITEM_GLITTER_MAIL, 0, + _("DARRELL"), FEMALE, 10, + SPECIES_PIKACHU + }, { + _("COROSO"), + SPECIES_CORSOLA, + 4, 4, 5, 4, 4, 5, + TRUE, 50183, + 5, 30, 5, 5, 5, + 0x4C970B7F, + ITEM_TROPIC_MAIL, 1, + _("LANE"), FEMALE, 10, + SPECIES_BELLOSSOM + } +#elif GERMAN + { + _("MAKIT"), SPECIES_MAKUHITA, + 5, 5, 4, 4, 4, 4, + TRUE, 49562, + 5, 5, 5, 5, 30, + 0x9C40, + ITEM_X_ATTACK, -1, + _("MAIK"), MALE, 10, + SPECIES_SLAKOTH + }, { + _("CONEC"), SPECIES_SKITTY, + 5, 4, 4, 5, 4, 4, + FALSE, 2259, + 5, 5, 30, 5, 5, + 0x498A2E17, + ITEM_GLITTER_MAIL, 0, + _("MADINA"), FEMALE, 10, + SPECIES_PIKACHU + }, { + _("CORASO"), + SPECIES_CORSOLA, + 4, 4, 5, 4, 4, 5, + TRUE, 50183, + 5, 30, 5, 5, 5, + 0x4C970B7F, + ITEM_TROPIC_MAIL, 1, + _("LIANA"), FEMALE, 10, + SPECIES_BELLOSSOM + } +#endif +}; + +const u16 gIngameTradeMail[][10] = { +#if ENGLISH + { + EC_POKEMON(PIKACHU), + EC_WORD_THANK_YOU, + EC_WORD_EXCL, + EC_WORD_MY, + EC_POKEMON(SKITTY), + EC_WORD_EATS, + EC_WORD_A_LOT, + EC_WORD_NOW, + EC_WORD_EXCL, + 0 + }, { + EC_WORD_I, + EC_WORD_WANT, + EC_WORD_TO, + EC_WORD_SEE, + EC_WORD_A, + EC_MOVE2(PETAL_DANCE), + EC_WORD_IT_S, + EC_WORD_SO, + EC_WORD_PRETTY, + 0 + } +#elif GERMAN + { + EC_POKEMON(PIKACHU), + EC_WORD_THANK_YOU, + EC_WORD_EXCL, + EC_WORD_MY, + EC_POKEMON(SKITTY), + EC_WORD_EATS, + 0xFFFF, + EC_WORD_A_LOT, + EC_WORD_EXCL, + 0 + }, { + EC_WORD_I, + EC_WORD_WANT, + EC_WORD_OF, + EC_MOVE2(PETAL_DANCE), + EC_WORD_WORKS, + EC_WORD_THE, + EC_WORD_IS, + EC_WORD_SO, + EC_WORD_PRETTY, + 0 + } +#endif +}; + +const s8 gTradeBallVerticalVelocityTable[] = { + 0, 0, 1, 0, + 1, 0, 1, 1, + 1, 1, 2, 2, + 2, 2, 3, 3, + 3, 3, 4, 4, + 4, 4, -4, -4, + -4, -3, -3, -3, + -3, -2, -2, -2, + -2, -1, -1, -1, + -1, 0, -1, 0, + -1, 0, 0, 0, + 0, 0, 1, 0, + 1, 0, 1, 1, + 1, 1, 2, 2, + 2, 2, 3, 3, + 3, 3, 4, 4, + 4, 4, -4, -3, + -3, -2, -2, -1, + -1, -1, 0, -1, + 0, 0, 0, 0, + 0, 0, 1, 0, + 1, 1, 1, 2, + 2, 3, 3, 4, + -4, -3, -2, -1, + -1, -1, 0, 0, + 0, 0, 1, 0, + 1, 1, 2, 3 +}; + +// .text + +void sub_8047CD8(void) +{ + SetMainCallback2(sub_8047EC0); +} + +static void sub_8047CE8(void) +{ + u8 mpId; + sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[0], gSaveBlock2.playerName, 0xC); + mpId = GetMultiplayerId(); + sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[3], gLinkPlayers[mpId ^ 1].name, 0xC); + sub_804AFB8(&gWindowTemplate_81E725C, gUnknown_020296CC[6], gUnknown_0820C14C[0], 0x8); + sub_804ACD8(gUnknown_0820C14C[1], gUnknown_020296CC[8], 0x14); + nullsub_5(3, 0); +} + +static void sub_8047D58(void) +{ + struct SpriteTemplate spriteTemplate; + int i; + u8 mpId; + u16 slen; + int language; + + slen = StringLength(gSaveBlock2.playerName); + language = slen <= 5 ? 0 : 1; + for (i = 0; i < 3; i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i; + CreateSprite(&spriteTemplate, gTradeUnknownSpriteCoords[language][0][0] + 32 * i, gTradeUnknownSpriteCoords[language][0][1], 1); + } + + mpId = GetMultiplayerId(); + slen = StringLength(gLinkPlayers[mpId ^ 1].name); + language = slen <= 5 ? 0 : 1; + for (i = 0; i < 3; i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i + 3; + CreateSprite(&spriteTemplate, gTradeUnknownSpriteCoords[language][1][0] + 32 * i, gTradeUnknownSpriteCoords[language][1][1], 1); + } + nullsub_5(5, 0); +} + +static void sub_8047E44(void) +{ + struct SpriteTemplate spriteTemplate; + int i; + + for (i = 0; i < 2; i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i + 6; + CreateSprite(&spriteTemplate, 0xd6 + 32 * i, 0x98, 1); + } + + for (i = 0; i < 5; i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i + 8; + CreateSprite(&spriteTemplate, 0x18 + 32 * i, 0x96, 1); + } +} + +static void sub_8047EC0(void) +{ + int i; + + switch (gMain.state) + { + case 0: + gUnknown_03004824 = &ewram_2010000.unk_07000; + sub_804AA88(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + sub_804A964(&gUnknown_03004824->unk_00c8, BG_SCREEN_ADDR(5)); + SetVBlankCallback(sub_80489F4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gUnknown_03004824->window, &gWindowTemplate_81E6F84); + gUnknown_03004824->unk_007a = TextWindow_SetBaseTileNum(20); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004824->window); + Menu_EraseScreen(); + sub_809D51C(); + gUnknown_03004824->unk_0075 = 0; + gUnknown_03004824->unk_007b = 0; + gUnknown_03004824->unk_007c = 0; + gUnknown_03004824->unk_0080[0] = 0; + gUnknown_03004824->unk_0080[1] = 0; + gUnknown_03004824->unk_0086 = 0; + gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_00b4 = 0; + gUnknown_03000508[0] = 0; + gMain.state ++; + sub_804AA0C(0); + CpuFill16(0, ewram_2010000.tileBuffers, sizeof(ewram_2010000.tileBuffers)); + for (i = 0; i < 13; i ++) + gUnknown_020296CC[i] = ewram_2010000.tileBuffers[i]; + break; + case 1: + gLinkType = 0x1122; + OpenLink(); + for (i = 0; i < PARTY_SIZE; i ++) + CreateMon(&gEnemyParty[i], 0, 0, 0x20, FALSE, 0, FALSE, 0); + gMain.state ++; + gUnknown_03004824->unk_00b4 = 0; + CreateTask(sub_8083C50, 1); + break; + case 2: + gUnknown_03004824->unk_00b4 ++; + if (gUnknown_03004824->unk_00b4 > 11) + { + gUnknown_03004824->unk_00b4 = 0; + gMain.state ++; + } + break; + case 3: + if (GetLinkPlayerCount_2() >= sub_800820C()) + { + if (IsLinkMaster()) + { + if (++gUnknown_03004824->unk_00b4 > 30) + { + sub_8007F4C(); + gMain.state ++; + } + } + else + gMain.state ++; + } + break; + case 4: + if (gReceivedRemoteLinkPlayers == 1 && IsLinkPlayerDataExchangeComplete() == TRUE) + { + CalculatePlayerPartyCount(); + gMain.state ++; + } + break; + case 5: + if (sub_8048D44()) + { + sub_804AF84(); + gMain.state ++; + } + break; + case 6: + CalculateEnemyPartyCount(); + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, 0, 0, 29, 19); + REG_DISPCNT = 0; + gUnknown_03004824->partyCounts[0] = gPlayerPartyCount; + gUnknown_03004824->partyCounts[1] = gEnemyPartyCount; + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + gUnknown_03004824->partyIcons[0][i] = CreateMonIcon(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2), sub_809D62C, gTradeMonSpriteCoords[i][0] * 8 + 14, gTradeMonSpriteCoords[i][1] * 8 - 12, TRUE, GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY)); + for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) + gUnknown_03004824->partyIcons[1][i] = CreateMonIcon(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[6 + i][0] * 8 + 14, gTradeMonSpriteCoords[6 + i][1] * 8 - 12, TRUE, GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY)); + nullsub_5(2, 0); + gMain.state ++; + break; + case 7: + LoadHeldItemIconGraphics(); + CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 0); + gMain.state ++; + break; + case 8: + CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 1); + gMain.state ++; + break; + case 9: + sub_8047CE8(); + gMain.state ++; + gUnknown_03004824->unk_00b4 = 0; + break; + case 10: + nullsub_5(4, 0); + if (sub_804ABF8()) + gMain.state ++; + break; + case 11: + sub_8047D58(); + gMain.state ++; + break; + case 12: + sub_8047E44(); + gUnknown_03004824->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_820C134, gTradeMonSpriteCoords[0][0] * 8 + 32, gTradeMonSpriteCoords[0][1] * 8, 2); + gUnknown_03004824->tradeMenuCursorPosition = 0; + gMain.state ++; + nullsub_5(6, 0); + break; + case 13: + sub_804ACF4(0); + sub_804A41C(0); + gUnknown_03004824->unk_0000 = 0; + gUnknown_03004824->unk_0001 = 0; + sub_8048C70(); + gMain.state ++; + nullsub_5(7, 0); + PlayBGM(BGM_P_SCHOOL); + break; + case 14: + sub_804ACF4(1); + sub_804A41C(1); + gMain.state ++; + // fallthrough + case 15: + sub_8048B0C(0); + gMain.state ++; + break; + case 16: + sub_8048B0C(1); + gMain.state ++; + break; + case 17: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gMain.state ++; + break; + case 18: + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gMain.state ++; + break; + case 19: + sub_804AE3C(0); + gMain.state ++; + break; + case 20: + sub_804AE3C(1); + sub_804AF10(); + gMain.state ++; + break; + case 21: + if (!gPaletteFade.active) + { + gMain.callback1 = sub_80494D8; + SetMainCallback2(sub_8048AB4); + gUnknown_03000508[0] = 0; + } + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_80484F4(void) +{ + int i; + struct UnkStructF *unkStructF; + + switch (gMain.state) + { + case 0: + gUnknown_03004824 = &ewram_2010000.unk_07000; + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + sub_804A964(&gUnknown_03004824->unk_00c8, BG_SCREEN_ADDR(5)); + SetVBlankCallback(sub_80489F4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gUnknown_03004824->window, &gWindowTemplate_81E6F84); + gUnknown_03004824->unk_007a = TextWindow_SetBaseTileNum(20); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004824->window); + Menu_EraseScreen(); + sub_809D51C(); + gUnknown_03004824->unk_0075 = 0; + gUnknown_03004824->unk_007b = 0; + gUnknown_03004824->unk_007c = 0; + gUnknown_03004824->unk_0080[0] = 0; + gUnknown_03004824->unk_0080[1] = 0; + gUnknown_03004824->unk_0086 = 0; + gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_00b4 = 0; + gUnknown_03000508[0] = 0; + gMain.state ++; + for (i = 0; i < 13; i ++) + gUnknown_020296CC[i] = ewram_2010000.tileBuffers[i]; + break; + case 1: + gMain.state ++; + gUnknown_03004824->unk_00b4 = 0; + break; + case 2: + gMain.state ++; + break; + case 3: + gMain.state ++; + break; + case 4: + CalculatePlayerPartyCount(); + gMain.state ++; + break; + case 5: + gMain.state ++; + break; + case 6: + CalculateEnemyPartyCount(); + REG_DISPCNT = 0; + gUnknown_03004824->partyCounts[0] = gPlayerPartyCount; + gUnknown_03004824->partyCounts[1] = gEnemyPartyCount; + sub_804A41C(0); + sub_804A41C(1); + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + gUnknown_03004824->partyIcons[0][i] = CreateMonIcon(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[i][0] * 8 + 14, gTradeMonSpriteCoords[i][1] * 8 - 12, TRUE, GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY)); + for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) + gUnknown_03004824->partyIcons[1][i] = CreateMonIcon(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[6 + i][0] * 8 + 14, gTradeMonSpriteCoords[6 + i][1] * 8 - 12, TRUE, GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY)); + nullsub_5(2, 0); + gMain.state ++; + break; + case 7: + LoadHeldItemIconGraphics(); + CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 0); + gMain.state ++; + break; + case 8: + CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 1); + gMain.state ++; + break; + case 9: + sub_8047CE8(); + gMain.state ++; + gUnknown_03004824->unk_00b4 = 0; + break; + case 10: + nullsub_5(4, 0); + if (sub_804ABF8()) + { + gMain.state ++; + } + break; + case 11: + sub_8047D58(); + gMain.state ++; + break; + case 12: + sub_8047E44(); + unkStructF = &ewram_2010000.unk_08000; + if (gUnknown_03004824->tradeMenuCursorPosition < 6) + gUnknown_03004824->tradeMenuCursorPosition = unkStructF->unk_0009; + else + gUnknown_03004824->tradeMenuCursorPosition = unkStructF->unk_0009 + 6; + gUnknown_03004824->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_820C134, gTradeMonSpriteCoords[gUnknown_03004824->tradeMenuCursorPosition][0] * 8 + 32, gTradeMonSpriteCoords[gUnknown_03004824->tradeMenuCursorPosition][1] * 8, 2); + gMain.state = 15; + nullsub_5(6, 0); + break; + case 15: + sub_8048B0C(0); + gMain.state ++; + break; + case 16: + sub_8048B0C(1); + gUnknown_03004824->unk_0000 = 0; + gUnknown_03004824->unk_0001 = 0; + sub_8048C70(); + nullsub_5(7, 0); + gMain.state ++; + break; + case 17: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gMain.state ++; + break; + case 18: + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gMain.state ++; + break; + case 19: + gMain.state ++; + break; + case 20: + sub_804AF10(); + gMain.state ++; + break; + case 21: + if (!gPaletteFade.active) + { + SetMainCallback2(sub_8048AB4); + gUnknown_03000508[0] = 0; + } + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_80489F4(void) +{ + sub_804A940(&gUnknown_03004824->unk_00c8); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +/*static*/ void sub_8048A14(void) +{ + if (++gUnknown_03004824->unk_00b4 >= 16) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_007b = 10; + } +} + +/*static*/ void sub_8048A50(void) +{ + if (!gPaletteFade.active) + { + gUnknown_020297D8[0] = gUnknown_03004824->tradeMenuCursorPosition; + gUnknown_020297D8[1] = gUnknown_03004824->unk_008a; + sub_800832C(); + gUnknown_03004824->unk_007b = 13; + } +} + +/*static*/ void sub_8048A90(void) +{ + if (!gReceivedRemoteLinkPlayers) + { + gMain.callback1 = NULL; + SetMainCallback2(sub_804B41C); + } +} + +static void sub_8048AB4(void) +{ + sub_8049DE0(); + sub_804AB30(); + sub_8049ED4(0); + sub_8049ED4(1); + REG_BG2HOFS = gUnknown_03004824->unk_0000++; + REG_BG3HOFS = gUnknown_03004824->unk_0001--; + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +#ifdef NONMATCHING +// Only minor register permutations +#pragma push_macro("BLOCKSIZE") +#define BLOCKSIZE 0x800 +static void sub_8048B0C(u8 a0) +{ + int i; + + switch (a0) + { + case 0: + for (i = 0; i < 48; i ++) + { + gPlttBufferUnfaded[i] = *(gUnknown_08EA02C8 + i); + gPlttBufferFaded[i] = *(gUnknown_08EA02C8 + i); + } + DmaCopyLarge16(3, gUnknown_08EA0348, (void *)BG_VRAM, 0x1280, 0x1000); + for (i = 0; i < 0x400; i ++) + gUnknown_03004824->unk_00c8.unk_12[i] = gUnknown_08EA15C8[i]; + DmaCopy16Defvars(3, gTradeStripesBG2Tilemap, BG_SCREEN_ADDR(6), 0x800); + break; + case 1: + DmaCopy16Defvars(3, gTradeStripesBG3Tilemap, BG_SCREEN_ADDR(7), 0x800); + sub_804A6DC(0); + sub_804A6DC(1); + sub_804A938(&gUnknown_03004824->unk_00c8); + REG_BG0CNT &= ~0x03; // BGCNT_PRIORITY(0) + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(5); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(6); + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(7); + REG_BG0HOFS = 0; + REG_BG1HOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG3VOFS = 0; + break; + } +} +#pragma pop_macro("BLOCKSIZE") +#else +asm(".include \"constants/gba_constants.inc\""); +__attribute__((naked)) +static void sub_8048B0C(u8 a0) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _08048B1C\n" + "\tcmp r0, 0x1\n" + "\tbeq _08048BD0\n" + "\tb _08048C3A\n" + "_08048B1C:\n" + "\tldr r5, _08048BA0 @ =gUnknown_08EA0348\n" + "\tldr r0, _08048BA4 @ =gTradeStripesBG2Tilemap\n" + "\tmov r12, r0\n" + "\tldr r1, _08048BA8 @ =gUnknown_08EA02C8\n" + "\tldr r4, _08048BAC @ =gPlttBufferFaded\n" + "\tldr r3, _08048BB0 @ =gPlttBufferUnfaded\n" + "\tmovs r2, 0x2F\n" + "_08048B2A:\n" + "\tldrh r0, [r1]\n" + "\tstrh r0, [r3]\n" + "\tldrh r0, [r1]\n" + "\tstrh r0, [r4]\n" + "\tadds r1, 0x2\n" + "\tadds r4, 0x2\n" + "\tadds r3, 0x2\n" + "\tsubs r2, 0x1\n" + "\tcmp r2, 0\n" + "\tbge _08048B2A\n" + "\tadds r3, r5, 0\n" + "\tmovs r4, 0xC0\n" + "\tlsls r4, 19\n" + "\tmovs r5, 0x94\n" + "\tlsls r5, 5\n" + "\tldr r1, _08048BB4 @ =0x040000d4\n" + "\tldr r6, _08048BB8 @ =0x80000800\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 5\n" + "\tmovs r7, 0x80\n" + "\tlsls r7, 24\n" + "_08048B54:\n" + "\tstr r3, [r1]\n" + "\tstr r4, [r1, 0x4]\n" + "\tstr r6, [r1, 0x8]\n" + "\tldr r0, [r1, 0x8]\n" + "\tadds r3, r2\n" + "\tadds r4, r2\n" + "\tsubs r5, r2\n" + "\tcmp r5, r2\n" + "\tbhi _08048B54\n" + "\tstr r3, [r1]\n" + "\tstr r4, [r1, 0x4]\n" + "\tlsrs r0, r5, 1\n" + "\torrs r0, r7\n" + "\tstr r0, [r1, 0x8]\n" + "\tldr r0, [r1, 0x8]\n" + "\tmovs r2, 0\n" + "\tldr r5, _08048BBC @ =0x000003ff\n" + "\tldr r4, _08048BC0 @ =gUnknown_03004824\n" + "\tldr r3, _08048BC4 @ =gUnknown_08EA15C8\n" + "_08048B7A:\n" + "\tldr r0, [r4]\n" + "\tlsls r1, r2, 1\n" + "\tadds r0, 0xDA\n" + "\tadds r0, r1\n" + "\tldrh r1, [r3]\n" + "\tstrh r1, [r0]\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x1\n" + "\tcmp r2, r5\n" + "\tble _08048B7A\n" + "\tldr r1, _08048BC8 @ =0x06003000\n" + "\tldr r0, _08048BB4 @ =0x040000d4\n" + "\tmov r2, r12\n" + "\tstr r2, [r0]\n" + "\tstr r1, [r0, 0x4]\n" + "\tldr r1, _08048BCC @ =0x80000400\n" + "\tstr r1, [r0, 0x8]\n" + "\tldr r0, [r0, 0x8]\n" + "\tb _08048C3A\n" + "\t.align 2, 0\n" + "_08048BA0: .4byte gUnknown_08EA0348\n" + "_08048BA4: .4byte gTradeStripesBG2Tilemap\n" + "_08048BA8: .4byte gUnknown_08EA02C8\n" + "_08048BAC: .4byte gPlttBufferFaded\n" + "_08048BB0: .4byte gPlttBufferUnfaded\n" + "_08048BB4: .4byte 0x040000d4\n" + "_08048BB8: .4byte 0x80000800\n" + "_08048BBC: .4byte 0x000003ff\n" + "_08048BC0: .4byte gUnknown_03004824\n" + "_08048BC4: .4byte gUnknown_08EA15C8\n" + "_08048BC8: .4byte 0x06003000\n" + "_08048BCC: .4byte 0x80000400\n" + "_08048BD0:\n" + "\tldr r1, _08048C40 @ =gTradeStripesBG3Tilemap\n" + "\tldr r2, _08048C44 @ =0x06003800\n" + "\tldr r0, _08048C48 @ =0x040000d4\n" + "\tstr r1, [r0]\n" + "\tstr r2, [r0, 0x4]\n" + "\tldr r1, _08048C4C @ =0x80000400\n" + "\tstr r1, [r0, 0x8]\n" + "\tldr r0, [r0, 0x8]\n" + "\tmovs r0, 0\n" + "\tbl sub_804A6DC\n" + "\tmovs r0, 0x1\n" + "\tbl sub_804A6DC\n" + "\tldr r0, _08048C50 @ =gUnknown_03004824\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0xC8\n" + "\tbl sub_804A938\n" + "\tldr r2, _08048C54 @ =REG_BG0CNT\n" + "\tldrh r1, [r2]\n" + "\tldr r0, _08048C58 @ =0x0000fffc\n" + "\tands r0, r1\n" + "\tstrh r0, [r2]\n" + "\tldr r1, _08048C5C @ =REG_BG1CNT\n" + "\tldr r2, _08048C60 @ =0x00000501\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tadds r1, 0x2\n" + "\tldr r2, _08048C64 @ =0x00000602\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tadds r1, 0x2\n" + "\tldr r2, _08048C68 @ =0x00000703\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tldr r0, _08048C6C @ =REG_BG0HOFS\n" + "\tmovs r1, 0\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tsubs r0, 0xA\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "_08048C3A:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08048C40: .4byte gTradeStripesBG3Tilemap\n" + "_08048C44: .4byte 0x06003800\n" + "_08048C48: .4byte 0x040000d4\n" + "_08048C4C: .4byte 0x80000400\n" + "_08048C50: .4byte gUnknown_03004824\n" + "_08048C54: .4byte REG_BG0CNT\n" + "_08048C58: .4byte 0x0000fffc\n" + "_08048C5C: .4byte REG_BG1CNT\n" + "_08048C60: .4byte 0x00000501\n" + "_08048C64: .4byte 0x00000602\n" + "_08048C68: .4byte 0x00000703\n" + "_08048C6C: .4byte REG_BG0HOFS"); +} +#endif + +static void sub_8048C70(void) +{ + int i; + for (i = 0; i < PARTY_SIZE; i ++) + { + if (i < gUnknown_03004824->partyCounts[0]) + { + gSprites[gUnknown_03004824->partyIcons[0][i]].invisible = FALSE; + gUnknown_03004824->tradeMenuOptionsActive[i] = TRUE; + } + else + { + gUnknown_03004824->tradeMenuOptionsActive[i] = FALSE; + } + if (i < gUnknown_03004824->partyCounts[1]) + { + gSprites[gUnknown_03004824->partyIcons[1][i]].invisible = FALSE; + gUnknown_03004824->tradeMenuOptionsActive[i + 6] = TRUE; + } + else + { + gUnknown_03004824->tradeMenuOptionsActive[i + 6] = FALSE; + } + } + gUnknown_03004824->tradeMenuOptionsActive[12] = TRUE; +} + +static void nullsub_5(u8 a0, u8 a1) {} + +// why not just use memcpy? +static void Trade_Memcpy(void *dataDest, void *dataSrc, u32 size) +{ + u8 *dest = dataDest; + u8 *src = dataSrc; + int i; + for (i = 0; i < size; i ++) dest[i] = src[i]; +} + +static bool8 sub_8048D44(void) +{ + u8 mpId = GetMultiplayerId(); + int i; + u16 species; + u8 nickname[11]; + struct Pokemon *pokemon; + + SetLinkDebugValues(gUnknown_03004824->unk_0075 / 100, gUnknown_03004824->unk_0075 % 100); + switch (gUnknown_03004824->unk_0075) + { + case 0: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon)); + gUnknown_03004824->unk_0075 ++; + break; + case 1: + if (IsLinkTaskFinished()) + { + if (GetBlockReceivedStatus() == 0) + { + gUnknown_03004824->unk_0075 ++; + } + else + { + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + } + break; + case 2: + if (mpId == 0) + { + sub_8007E9C(1); + } + gUnknown_03004824->unk_0075 ++; + break; + case 3: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[0], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 4: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[2], 2 * sizeof(struct Pokemon)); + gUnknown_03004824->unk_0075 ++; + break; + case 5: + if (mpId == 0) + { + sub_8007E9C(1); + } + gUnknown_03004824->unk_0075 ++; + break; + case 6: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 7: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 2 * sizeof(struct Pokemon)); + gUnknown_03004824->unk_0075 ++; + break; + case 8: + if (mpId == 0) + { + sub_8007E9C(1); + } + gUnknown_03004824->unk_0075 ++; + break; + case 9: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 10: + Trade_Memcpy(gBlockSendBuffer, &gSaveBlock1.mail[0], 6 * sizeof(struct MailStruct) + 4); + gUnknown_03004824->unk_0075 ++; + break; + case 11: + if (mpId == 0) + { + sub_8007E9C(3); + } + gUnknown_03004824->unk_0075 ++; + break; + case 12: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gUnknown_02029700[0], gBlockRecvBuffer[mpId ^ 1], 6 * sizeof(struct MailStruct)); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 13: + Trade_Memcpy(gBlockSendBuffer, gSaveBlock1.giftRibbons, 11); + gUnknown_03004824->unk_0075 ++; + break; + case 14: + if (mpId == 0) + { + sub_8007E9C(4); + } + gUnknown_03004824->unk_0075 ++; + break; + case 15: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(gUnknown_03004824->unk_00b5, gBlockRecvBuffer[mpId ^ 1], 11); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 16: + pokemon = gEnemyParty; + for (i = 0; i < PARTY_SIZE; i ++) + { + if ((species = GetMonData(pokemon, MON_DATA_SPECIES)) != SPECIES_NONE && species == SPECIES_SHEDINJA && GetMonData(pokemon, MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE) + { + GetMonData(pokemon, MON_DATA_NICKNAME, nickname); + if (!StringCompareWithoutExtCtrlCodes(nickname, gUnknown_0820C3B0)) + SetMonData(pokemon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]); + } + pokemon ++; + } + return TRUE; + } + return FALSE; +} + +static void sub_8049088(void) +{ + u8 string[28]; + StringCopy(string, gTradeText_TradeOkayPrompt); + sub_804ACD8(string, BG_CHAR_ADDR(4) + gUnknown_03004824->unk_007e * 32, 20); +} + +static void sub_80490BC(u8 mpId, u8 a1) +{ + if (a1 & 1) + { + switch (gBlockRecvBuffer[mpId][0]) + { + case 0xeeaa: + gUnknown_03004824->unk_0084 = 2; + break; + case 0xaabb: + gUnknown_03004824->unk_0084 = 1; + break; + case 0xbbbb: + gUnknown_03004824->unk_0086 = 1; + break; + case 0xbbcc: + gUnknown_03004824->unk_0086 = 2; + break; + } + ResetBlockReceivedFlag(0); + } + if (a1 & 2) + { + switch (gBlockRecvBuffer[1][0]) + { + case 0xeeaa: + gUnknown_03004824->unk_0085 = 2; + break; + case 0xaabb: + gUnknown_03004824->unk_008a = gBlockRecvBuffer[1][1] + 6; + gUnknown_03004824->unk_0085 = 1; + break; + case 0xbbbb: + gUnknown_03004824->unk_0087 = 1; + break; + case 0xbbcc: + gUnknown_03004824->unk_0087 = 2; + break; + } + ResetBlockReceivedFlag(1); + } +} + +static void sub_80491E4(u8 mpId, u8 status) +{ + if (status & 1) + { + switch (gBlockRecvBuffer[0][0]) + { + case 0xeebb: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + sub_804AA0C(4); + gUnknown_03004824->unk_007b = 11; + break; + case 0xeecc: + sub_804AA0C(5); + gUnknown_03004824->unk_007b = 8; + break; + case 0xdddd: + gUnknown_03004824->unk_008a = gBlockRecvBuffer[0][1] + 6; + sub_8049E9C(gUnknown_03004824->tradeMenuCursorPosition); + sub_8049E9C(gUnknown_03004824->unk_008a); + gUnknown_03004824->unk_007b = 7; + break; + case 0xccdd: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_007b = 10; + break; + case 0xddee: + sub_804AA0C(1); + gUnknown_03004824->unk_007b = 8; + break; + } + ResetBlockReceivedFlag(0); + } + if (status & 2) + { + ResetBlockReceivedFlag(1); + } +} + +static void sub_80492D8(void) +{ + if (gUnknown_03004824->unk_0084 && gUnknown_03004824->unk_0085) + { + if (gUnknown_03004824->unk_0084 == 1 && gUnknown_03004824->unk_0085 == 1) + { + gUnknown_03004824->unk_007b = 6; + gUnknown_03004824->linkData[0] = 0xdddd; + gUnknown_03004824->linkData[1] = gUnknown_03004824->tradeMenuCursorPosition; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; + } + else if (gUnknown_03004824->unk_0084 == 1 && gUnknown_03004824->unk_0085 == 2) + { + sub_804AA0C(1); + gUnknown_03004824->linkData[0] = 0xeecc; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0086 = gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; + gUnknown_03004824->unk_007b = 8; + } + else if (gUnknown_03004824->unk_0084 == 2 && gUnknown_03004824->unk_0085 == 1) + { + sub_804AA0C(5); + gUnknown_03004824->linkData[0] = 0xddee; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0086 = gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; + gUnknown_03004824->unk_007b = 8; + } + else if (gUnknown_03004824->unk_0084 == 2 && gUnknown_03004824->unk_0085 == 2) + { + gUnknown_03004824->linkData[0] = 0xeebb; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; + gUnknown_03004824->unk_007b = 11; + } + } + if (gUnknown_03004824->unk_0086 && gUnknown_03004824->unk_0087) + { + if (gUnknown_03004824->unk_0086 == 1 && gUnknown_03004824->unk_0087 == 1) + { + gUnknown_03004824->linkData[0] = 0xccdd; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0086 = 0; + gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_007b = 9; + } + if (gUnknown_03004824->unk_0086 == 2 || gUnknown_03004824->unk_0087 == 2) + { + sub_804AA0C(1); + gUnknown_03004824->linkData[0] = 0xddee; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0086 = 0; + gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_007b = 8; + } + } +} + +static void sub_80494D8(void) +{ + u8 mpId = GetMultiplayerId(); + u8 status; + if ((status = GetBlockReceivedStatus())) + { + if (mpId == 0) + sub_80490BC(mpId, status); + else + sub_80491E4(mpId, status); + ResetBlockReceivedFlags(); + } + if (mpId == 0) + sub_80492D8(); +} + +static u8 sub_8049514(u8 oldPosition, u8 direction) +{ + int i; + u8 newPosition = 0; + for (i = 0; i < PARTY_SIZE; i ++) + { + if (gUnknown_03004824->tradeMenuOptionsActive[gTradeNextSelectedMonTable[oldPosition][direction][i]] == TRUE) + { + newPosition = gTradeNextSelectedMonTable[oldPosition][direction][i]; + break; + } + } + return newPosition; +} + +static void TradeMenuMoveCursor(u8 *tradeMenuCursorPosition, u8 direction) +{ + u8 newPosition = sub_8049514(*tradeMenuCursorPosition, direction); + if (newPosition == 12) // CANCEL + { + StartSpriteAnim(&gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx], 1); + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.x = 0xe0; + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.y = 0xa0; + } + else + { + StartSpriteAnim(&gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx], 0); + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.x = gTradeMonSpriteCoords[newPosition][0] * 8 + 32; + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.y = gTradeMonSpriteCoords[newPosition][1] * 8; + } + if (*tradeMenuCursorPosition != newPosition) + { + PlaySE(SE_SELECT); + } + *tradeMenuCursorPosition = newPosition; +} + +static void sub_8049620(void) +{ + sub_804AA0C(0); + gUnknown_03004824->unk_007b = 5; + if (GetMultiplayerId() == 1) + { + gUnknown_03004824->linkData[0] = 0xaabb; + gUnknown_03004824->linkData[1] = gUnknown_03004824->tradeMenuCursorPosition; + Trade_SendData(gUnknown_03004824); + } + else + { + gUnknown_03004824->unk_0084 = 1; + } +} + +static void sub_8049680(void) +{ + int i; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 0); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 1); + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 2); + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 3); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE) + { + TextWindow_DrawStdFrame(&gUnknown_03004824->window, 18, 14, 28, 19); + Menu_PrintItems(19, 15, 2, (const struct MenuAction *)gUnknown_0820C320); + InitMenu(0, 19, 15, 2, 0, 9); + gUnknown_03004824->unk_007b = 1; + } + else if (gUnknown_03004824->tradeMenuCursorPosition < 2 * PARTY_SIZE) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_007b = 2; + } + else if (gUnknown_03004824->tradeMenuCursorPosition == 2 * PARTY_SIZE) + { + TextWindow_DrawStdFrame(&gUnknown_03004824->window, 24, 14, 29, 19); + InitYesNoMenu(24, 14, 4); + gUnknown_03004824->unk_007b = 4; + sub_804ACD8(gUnknown_0820C14C[4], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); + } + } + if (gMain.newKeys & R_BUTTON) + { + for (i = 0; i < 10; i ++) + { + gUnknown_03004824->linkData[i] = i; + } + Trade_SendData(gUnknown_03004824); + } +} + +static void sub_8049804(void) +{ + Menu_DestroyCursor(); + sub_804A80C(); + gUnknown_03004824->unk_007b = 0; + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = FALSE; + sub_804ACD8(gUnknown_0820C14C[1], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); +} + +static void sub_8049860(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (Menu_GetCursorPos() == 0) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_007b = 2; + } + else if (sub_80499F0(gUnknown_03004824->unk_0051[0], gUnknown_03004824->partyCounts[0], gUnknown_03004824->tradeMenuCursorPosition) == 0) + { + sub_804AADC(3, 2); + gUnknown_03004824->unk_007b = 8; + } + else + { + sub_8049620(); + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = TRUE; + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8049804(); + } +} + +static void sub_8049954(void) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8049804(); + } +} + +static void sub_804997C(void) +{ + if (!gPaletteFade.active) + { + if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE) + { + ShowPokemonSummaryScreen(gPlayerParty, gUnknown_03004824->tradeMenuCursorPosition, gUnknown_03004824->partyCounts[0] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT); + } + else + { + ShowPokemonSummaryScreen(gEnemyParty, gUnknown_03004824->tradeMenuCursorPosition - 6, gUnknown_03004824->partyCounts[1] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT); + } + } +} + +static u8 sub_80499F0(const u8 *src, u8 partyCount, u8 tradeMenuCursorPosition) +{ + u8 retval = 0; + int i; + for (i = 0; i < partyCount; i ++) + { + if (tradeMenuCursorPosition != i) + { + retval += src[i]; + } + } + return retval; +} + +static void sub_8049A20(void) +{ + u8 unk_0051[12]; + int i; + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + { + unk_0051[i] = gUnknown_03004824->unk_0051[0][i]; + } + if (sub_80499F0(unk_0051, gUnknown_03004824->partyCounts[0], gUnknown_03004824->tradeMenuCursorPosition) == 0) + { + sub_804AADC(3, 2); + gUnknown_03004824->linkData[0] = 0xbbcc; + sub_804AADC(0xb4, 0); + } + else + { + sub_804AADC(3, 1); + gUnknown_03004824->linkData[0] = 0xbbbb; + if (IsLinkTaskFinished()) + { + Trade_SendData(gUnknown_03004824); + } + } +} + +static void sub_8049AC0(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (Menu_GetCursorPos() == 0) + { + sub_8049A20(); + } + else + { + sub_804AADC(3, 1); + if (IsLinkTaskFinished()) + { + gUnknown_03004824->linkData[0] = 0xbbcc; + Trade_SendData(gUnknown_03004824); + } + } + gUnknown_03004824->unk_007b = 100; + } + else if (gMain.newKeys & B_BUTTON) + { + sub_804AADC(3, 1); + if (Menu_GetCursorPos() == 0) + { + gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); + } + gUnknown_03004824->linkData[0] = 0xbbcc; + Trade_SendData(gUnknown_03004824); + gUnknown_03004824->unk_007b = 100; + } +} + +static void sub_8049BC0(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = Menu_MoveCursor(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = Menu_MoveCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (Menu_GetCursorPos() == 0) + { + sub_804AA0C(4); + gUnknown_03004824->linkData[0] = 0xeeaa; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = TRUE; + gUnknown_03004824->unk_007b = 100; + } + else + { + sub_8049804(); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8049804(); + } +} + +static void sub_8049C8C(void) +{ + if (GetMultiplayerId() == 0) + { + sub_8049E9C(gUnknown_03004824->tradeMenuCursorPosition); + sub_8049E9C(gUnknown_03004824->unk_008a); + } + gUnknown_03004824->unk_007b = 7; +} + +static void sub_8049CC4(void) +{ + if (gUnknown_03004824->unk_0080[0] == 5 && gUnknown_03004824->unk_0080[1] == 5) + { + sub_8049088(); + gUnknown_03004824->unk_007b = 14; + } +} + +static void DisplayMessageAndContinueTask(void) +{ + gUnknown_03004824->unk_00b4++; + if (gUnknown_03004824->unk_00b4 > 120) + { + TextWindow_DrawStdFrame(&gUnknown_03004824->window, 24, 14, 29, 19); + InitYesNoMenu(24, 14, 4); + gUnknown_03004824->unk_00b4 = 0; + gUnknown_03004824->unk_007b = 3; + } +} + +static void sub_8049D44(void) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_804A840(0); + sub_804A840(1); + gUnknown_03004824->unk_007b = 0; + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = FALSE; + } +} + +static void sub_8049D9C(void) +{ + if (!gPaletteFade.active) + { + sub_800832C(); + gUnknown_03004824->unk_007b = 12; + } +} + +static void sub_8049DC4(void) +{ + if (gReceivedRemoteLinkPlayers == 0) + { + SetMainCallback2(sub_805465C); + } +} + +static void sub_8049DE0(void) +{ + switch (gUnknown_03004824->unk_007b) + { + case 0: + sub_8049680(); + break; + case 1: + sub_8049860(); + break; + case 2: + sub_804997C(); + break; + case 3: + sub_8049AC0(); + break; + case 4: + sub_8049BC0(); + break; + case 6: + sub_8049C8C(); + break; + case 7: + sub_8049CC4(); + break; + case 8: + sub_8049D44(); + break; + case 9: + sub_8048A14(); + break; + case 10: + sub_8048A50(); + break; + case 11: + sub_8049D9C(); + break; + case 12: + sub_8049DC4(); + break; + case 13: + sub_8048A90(); + break; + case 14: + DisplayMessageAndContinueTask(); + break; + case 15: + sub_8049954(); + break; + } +} + +static void sub_8049E9C(u8 a0) +{ + u8 v0 = a0 / 6; + if (gUnknown_03004824->unk_0080[v0] == 0) + { + gUnknown_03004824->unk_0080[v0] = 1; + gUnknown_03004824->unk_0082[v0] = a0; + } +} + +// TODO: Figure out what the f**k is going on here +#ifdef NONMATCHING +static void sub_8049ED4(u8 a0) +{ + u8 i; + s8 stringLength; + u8 whichParty = 1; + u8 whichPokemon; + u8 string1[40]; + u8 string2[56]; + u8 temp0 = gUnknown_03004824->unk_0082[a0]; + if (temp0 < PARTY_SIZE) + whichParty = 0; + whichPokemon = temp0 % PARTY_SIZE; + + switch (gUnknown_03004824->unk_0080[a0]) + { + case 1: + for (i = 0; i < gUnknown_03004824->partyCounts[a0]; i ++) + { + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].invisible = TRUE; + } + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].invisible = FALSE; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data[0] = 20; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data[2] = (gTradeMonSpriteCoords[6 * whichParty + whichPokemon][0] + gTradeMonSpriteCoords[6 * whichParty + whichPokemon + 1][0]) / 2 * 8 + 14; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data[4] = gTradeMonSpriteCoords[6 * whichParty + whichPokemon][1] * 8 - 12; + StoreSpriteCallbackInData(&gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]], sub_809D62C); + gUnknown_03004824->unk_0080[a0] ++; + sub_8078A34(&gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]]); + Menu_DestroyCursor(); + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[whichParty][0], 0, gUnknown_0820C330[whichParty][1], 19); + sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15 * a0, 0, gTradePartyBoxTilemap, 15, 17, 0); + if (whichParty == 0) + { + sub_804A80C(); + } + break; + case 2: + if (gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].callback == sub_809D62C) + { + gUnknown_03004824->unk_0080[a0] = 3; + } + break; + case 3: + sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15 * whichParty, 0, gTradePartyBoxTilemap, 15, 17, 0); + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos1.x = (gTradeMonSpriteCoords[6 * whichParty + whichPokemon ][0] + gTradeMonSpriteCoords[6 * whichParty + whichPokemon + 1][0]) / 2 * 8 + 14; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos1.y = gTradeMonSpriteCoords[6 * whichParty + whichPokemon ][1] * 8 - 12; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos2.x = 0; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos2.y = 0; + stringLength = sub_804A2B4(string1 + 6, whichParty, whichPokemon); + string1[0] = 0xFC; + string1[1] = 0x06; + string1[2] = 0x04; + string1[3] = 0xFC; + string1[4] = 0x11; + string1[5] = (64 - stringLength) / 2; + Text_InitWindowAndPrintText(&gUnknown_03004824->window, string1, gUnknown_03004824->unk_007a + whichParty * 6 * 32, gUnknown_0820C334[whichParty][0], gUnknown_0820C334[whichParty][1]); + sub_804A33C(string2, whichParty, whichPokemon); + Text_InitWindowAndPrintText(&gUnknown_03004824->window, gOtherText_Terminator2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 32, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); + Text_InitWindowAndPrintText(&gUnknown_03004824->window, string2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 38, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); + gUnknown_03004824->unk_0080[a0] ++; + break; + case 4: + sub_804ACD8(gUnknown_0820C14C[5], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); + sub_804A51C(a0, whichPokemon, gUnknown_0820C3D1[a0][0] + 4, gUnknown_0820C3D1[a0][1] + 1, gUnknown_0820C3D1[a0][0], gUnknown_0820C3D1[a0][1]); + gUnknown_03004824->unk_0080[a0] ++; + break; + } +} +#else +__attribute__((naked)) +static void sub_8049ED4(u8 a0) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x74\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r10, r0\n" + "\tldr r0, _08049F24 @ =gUnknown_03004824\n" + "\tldr r5, [r0]\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x82\n" + "\tadd r0, r10\n" + "\tldrb r0, [r0]\n" + "\tmovs r1, 0x1\n" + "\tstr r1, [sp, 0x6C]\n" + "\tcmp r0, 0x5\n" + "\tbhi _08049EFE\n" + "\tmovs r2, 0\n" + "\tstr r2, [sp, 0x6C]\n" + "_08049EFE:\n" + "\tmovs r1, 0x6\n" + "\tbl __umodsi3\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r8, r0\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x80\n" + "\tmov r1, r10\n" + "\tadds r3, r0, r1\n" + "\tldrb r0, [r3]\n" + "\tcmp r0, 0x2\n" + "\tbne _08049F1A\n" + "\tb _0804A0AC\n" + "_08049F1A:\n" + "\tcmp r0, 0x2\n" + "\tbgt _08049F28\n" + "\tcmp r0, 0x1\n" + "\tbeq _08049F36\n" + "\tb _0804A294\n" + "\t.align 2, 0\n" + "_08049F24: .4byte gUnknown_03004824\n" + "_08049F28:\n" + "\tcmp r0, 0x3\n" + "\tbne _08049F2E\n" + "\tb _0804A0E4\n" + "_08049F2E:\n" + "\tcmp r0, 0x4\n" + "\tbne _08049F34\n" + "\tb _0804A244\n" + "_08049F34:\n" + "\tb _0804A294\n" + "_08049F36:\n" + "\tmovs r4, 0\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x42\n" + "\tadd r0, r10\n" + "\tldr r7, _0804A094 @ =gSprites\n" + "\tldr r2, [sp, 0x6C]\n" + "\tlsls r2, 1\n" + "\tmov r9, r2\n" + "\tldr r3, _0804A098 @ =gTradeMonSpriteCoords\n" + "\tmov r12, r3\n" + "\tmov r5, r10\n" + "\tlsls r5, 4\n" + "\tstr r5, [sp, 0x70]\n" + "\tldrb r0, [r0]\n" + "\tcmp r4, r0\n" + "\tbcs _08049F8E\n" + "\tadds r6, r7, 0\n" + "\tldr r2, _0804A09C @ =gUnknown_03004824\n" + "\tldr r0, [sp, 0x6C]\n" + "\tadd r0, r9\n" + "\tlsls r3, r0, 1\n" + "\tmovs r5, 0x4\n" + "_08049F62:\n" + "\tldr r0, [r2]\n" + "\tadds r1, r4, r3\n" + "\tadds r0, 0x34\n" + "\tadds r0, r1\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r6\n" + "\tadds r0, 0x3E\n" + "\tldrb r1, [r0]\n" + "\torrs r1, r5\n" + "\tstrb r1, [r0]\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x42\n" + "\tadd r0, r10\n" + "\tldrb r0, [r0]\n" + "\tcmp r4, r0\n" + "\tbcc _08049F62\n" + "_08049F8E:\n" + "\tldr r1, _0804A09C @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tldr r5, [sp, 0x6C]\n" + "\tadd r5, r9\n" + "\tlsls r3, r5, 1\n" + "\tmov r2, r8\n" + "\tadds r6, r2, r3\n" + "\tadds r0, 0x34\n" + "\tadds r0, r6\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tadds r0, 0x3E\n" + "\tldrb r2, [r0]\n" + "\tmovs r1, 0x5\n" + "\tnegs r1, r1\n" + "\tands r1, r2\n" + "\tstrb r1, [r0]\n" + "\tldr r0, _0804A09C @ =gUnknown_03004824\n" + "\tldr r4, [r0]\n" + "\tadds r4, 0x34\n" + "\tadds r4, r6\n" + "\tldrb r1, [r4]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tmovs r1, 0x14\n" + "\tstrh r1, [r0, 0x2E]\n" + "\tldrb r0, [r4]\n" + "\tlsls r2, r0, 4\n" + "\tadds r2, r0\n" + "\tlsls r2, 2\n" + "\tadds r2, r7\n" + "\tlsls r5, 2\n" + "\tmov r1, r12\n" + "\tadds r0, r5, r1\n" + "\tldrb r0, [r0]\n" + "\tadds r3, 0x1\n" + "\tlsls r3, 1\n" + "\tadd r3, r12\n" + "\tldrb r1, [r3]\n" + "\tadds r0, r1\n" + "\tasrs r0, 1\n" + "\tlsls r0, 3\n" + "\tadds r0, 0xE\n" + "\tstrh r0, [r2, 0x32]\n" + "\tldrb r0, [r4]\n" + "\tlsls r1, r0, 4\n" + "\tadds r1, r0\n" + "\tlsls r1, 2\n" + "\tadds r1, r7\n" + "\tmov r0, r12\n" + "\tadds r0, 0x1\n" + "\tadds r5, r0\n" + "\tldrb r0, [r5]\n" + "\tlsls r0, 3\n" + "\tsubs r0, 0xC\n" + "\tstrh r0, [r1, 0x36]\n" + "\tldrb r1, [r4]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tldr r1, _0804A0A0 @ =sub_809D62C\n" + "\tbl StoreSpriteCallbackInData\n" + "\tldr r2, _0804A09C @ =gUnknown_03004824\n" + "\tldr r1, [r2]\n" + "\tadds r1, 0x80\n" + "\tadd r1, r10\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x34\n" + "\tadds r0, r6\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tbl sub_8078A34\n" + "\tbl Menu_DestroyCursor\n" + "\tldr r3, _0804A09C @ =gUnknown_03004824\n" + "\tldr r0, [r3]\n" + "\tadds r0, 0x4\n" + "\tldr r1, _0804A0A4 @ =gUnknown_0820C330\n" + "\tmov r5, r9\n" + "\tadds r2, r5, r1\n" + "\tldrb r2, [r2]\n" + "\tadds r1, 0x1\n" + "\tadd r1, r9\n" + "\tldrb r1, [r1]\n" + "\tstr r1, [sp]\n" + "\tmovs r1, 0x13\n" + "\tstr r1, [sp, 0x4]\n" + "\tmovs r1, 0\n" + "\tmovs r3, 0\n" + "\tbl Text_FillWindowRectDefPalette\n" + "\tldr r1, _0804A09C @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0xC8\n" + "\tldr r2, [sp, 0x70]\n" + "\tmov r3, r10\n" + "\tsubs r1, r2, r3\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tldr r3, _0804A0A8 @ =gTradePartyBoxTilemap\n" + "\tmovs r2, 0xF\n" + "\tstr r2, [sp]\n" + "\tmovs r2, 0x11\n" + "\tstr r2, [sp, 0x4]\n" + "\tmovs r5, 0\n" + "\tstr r5, [sp, 0x8]\n" + "\tmovs r2, 0\n" + "\tbl sub_804A96C_alt\n" + "\tldr r0, [sp, 0x6C]\n" + "\tcmp r0, 0\n" + "\tbeq _0804A08C\n" + "\tb _0804A294\n" + "_0804A08C:\n" + "\tbl sub_804A80C\n" + "\tb _0804A294\n" + "\t.align 2, 0\n" + "_0804A094: .4byte gSprites\n" + "_0804A098: .4byte gTradeMonSpriteCoords\n" + "_0804A09C: .4byte gUnknown_03004824\n" + "_0804A0A0: .4byte sub_809D62C\n" + "_0804A0A4: .4byte gUnknown_0820C330\n" + "_0804A0A8: .4byte gTradePartyBoxTilemap\n" + "_0804A0AC:\n" + "\tldr r2, _0804A0DC @ =gSprites\n" + "\tldr r1, [sp, 0x6C]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 1\n" + "\tadd r0, r8\n" + "\tadds r1, r5, 0\n" + "\tadds r1, 0x34\n" + "\tadds r1, r0\n" + "\tldrb r1, [r1]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r2, 0x1C\n" + "\tadds r0, r2\n" + "\tldr r1, [r0]\n" + "\tldr r0, _0804A0E0 @ =sub_809D62C\n" + "\tcmp r1, r0\n" + "\tbeq _0804A0D4\n" + "\tb _0804A294\n" + "_0804A0D4:\n" + "\tmovs r0, 0x3\n" + "\tstrb r0, [r3]\n" + "\tb _0804A294\n" + "\t.align 2, 0\n" + "_0804A0DC: .4byte gSprites\n" + "_0804A0E0: .4byte sub_809D62C\n" + "_0804A0E4:\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0xC8\n" + "\tldr r2, [sp, 0x6C]\n" + "\tlsls r1, r2, 4\n" + "\tsubs r1, r2\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tldr r3, _0804A228 @ =gTradeMovesBoxTilemap\n" + "\tmovs r2, 0xF\n" + "\tstr r2, [sp]\n" + "\tmovs r7, 0x11\n" + "\tstr r7, [sp, 0x4]\n" + "\tmovs r5, 0\n" + "\tstr r5, [sp, 0x8]\n" + "\tmovs r2, 0\n" + "\tbl sub_804A96C_alt\n" + "\tldr r0, _0804A22C @ =gUnknown_03004824\n" + "\tldr r3, [r0]\n" + "\tldr r1, [sp, 0x6C]\n" + "\tlsls r6, r1, 1\n" + "\tadds r1, r6\n" + "\tmov r9, r1\n" + "\tlsls r1, 1\n" + "\tmov r2, r8\n" + "\tadds r0, r2, r1\n" + "\tadds r3, 0x34\n" + "\tadds r3, r0\n" + "\tldrb r0, [r3]\n" + "\tlsls r2, r0, 4\n" + "\tadds r2, r0\n" + "\tlsls r2, 2\n" + "\tldr r5, _0804A230 @ =gSprites\n" + "\tadds r2, r5\n" + "\tldr r4, _0804A234 @ =gTradeMonSpriteCoords\n" + "\tmov r0, r9\n" + "\tlsls r5, r0, 2\n" + "\tadds r0, r5, r4\n" + "\tldrb r0, [r0]\n" + "\tadds r1, 0x1\n" + "\tlsls r1, 1\n" + "\tadds r1, r4\n" + "\tldrb r1, [r1]\n" + "\tadds r0, r1\n" + "\tasrs r0, 1\n" + "\tlsls r0, 3\n" + "\tadds r0, 0xE\n" + "\tstrh r0, [r2, 0x20]\n" + "\tldrb r0, [r3]\n" + "\tlsls r1, r0, 4\n" + "\tadds r1, r0\n" + "\tlsls r1, 2\n" + "\tldr r2, _0804A230 @ =gSprites\n" + "\tadds r1, r2\n" + "\tadds r4, 0x1\n" + "\tadds r5, r4\n" + "\tldrb r0, [r5]\n" + "\tlsls r0, 3\n" + "\tsubs r0, 0xC\n" + "\tstrh r0, [r1, 0x22]\n" + "\tldrb r1, [r3]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r2\n" + "\tmovs r5, 0\n" + "\tstrh r5, [r0, 0x24]\n" + "\tldrb r1, [r3]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r2\n" + "\tstrh r5, [r0, 0x26]\n" + "\tmov r0, sp\n" + "\tadds r0, 0x12\n" + "\tldr r1, [sp, 0x6C]\n" + "\tmov r2, r8\n" + "\tbl sub_804A2B4\n" + "\tadd r1, sp, 0xC\n" + "\tmovs r3, 0xFC\n" + "\tstrb r3, [r1]\n" + "\tadds r2, r1, 0\n" + "\tmovs r1, 0x6\n" + "\tstrb r1, [r2, 0x1]\n" + "\tmovs r1, 0x4\n" + "\tstrb r1, [r2, 0x2]\n" + "\tadds r1, r2, 0\n" + "\tstrb r3, [r1, 0x3]\n" + "\tstrb r7, [r1, 0x4]\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tmovs r1, 0x40\n" + "\tsubs r1, r0\n" + "\tlsrs r0, r1, 31\n" + "\tadds r1, r0\n" + "\tasrs r1, 1\n" + "\tstrb r1, [r2, 0x5]\n" + "\tldr r0, _0804A22C @ =gUnknown_03004824\n" + "\tldr r1, [r0]\n" + "\tadds r0, r1, 0x4\n" + "\tadds r1, 0x7A\n" + "\tldrb r2, [r1]\n" + "\tmov r1, r9\n" + "\tlsls r1, 6\n" + "\tmov r9, r1\n" + "\tadd r2, r9\n" + "\tldr r4, _0804A238 @ =gUnknown_0820C334\n" + "\tldr r3, [sp, 0x6C]\n" + "\tlsls r1, r3, 2\n" + "\tadds r3, r1, r4\n" + "\tldrb r3, [r3]\n" + "\tldr r5, _0804A23C @ =gUnknown_0820C334 + 0x1\n" + "\tadds r1, r5\n" + "\tldrb r1, [r1]\n" + "\tstr r1, [sp]\n" + "\tadd r1, sp, 0xC\n" + "\tbl Text_InitWindowAndPrintText\n" + "\tadd r7, sp, 0x34\n" + "\tadds r0, r7, 0\n" + "\tldr r1, [sp, 0x6C]\n" + "\tmov r2, r8\n" + "\tbl sub_804A33C\n" + "\tldr r0, _0804A22C @ =gUnknown_03004824\n" + "\tldr r2, [r0]\n" + "\tadds r0, r2, 0x4\n" + "\tldr r1, _0804A240 @ =gOtherText_Terminator2\n" + "\tadds r2, 0x7A\n" + "\tldrb r2, [r2]\n" + "\tadd r2, r9\n" + "\tadds r2, 0x20\n" + "\tadds r6, 0x1\n" + "\tlsls r6, 1\n" + "\tadds r4, r6, r4\n" + "\tldrb r5, [r4]\n" + "\tldr r3, _0804A23C @ =gUnknown_0820C334 + 0x1\n" + "\tadds r6, r3\n" + "\tldrb r4, [r6]\n" + "\tadds r4, 0x1\n" + "\tlsls r4, 24\n" + "\tlsrs r4, 24\n" + "\tstr r4, [sp]\n" + "\tadds r3, r5, 0\n" + "\tbl Text_InitWindowAndPrintText\n" + "\tldr r0, _0804A22C @ =gUnknown_03004824\n" + "\tldr r1, [r0]\n" + "\tadds r0, r1, 0x4\n" + "\tadds r1, 0x7A\n" + "\tldrb r2, [r1]\n" + "\tadd r2, r9\n" + "\tadds r2, 0x26\n" + "\tstr r4, [sp]\n" + "\tadds r1, r7, 0\n" + "\tadds r3, r5, 0\n" + "\tbl Text_InitWindowAndPrintText\n" + "\tldr r2, _0804A22C @ =gUnknown_03004824\n" + "\tldr r1, [r2]\n" + "\tb _0804A28A\n" + "\t.align 2, 0\n" + "_0804A228: .4byte gTradeMovesBoxTilemap\n" + "_0804A22C: .4byte gUnknown_03004824\n" + "_0804A230: .4byte gSprites\n" + "_0804A234: .4byte gTradeMonSpriteCoords\n" + "_0804A238: .4byte gUnknown_0820C334\n" + "_0804A23C: .4byte gUnknown_0820C334 + 0x1\n" + "_0804A240: .4byte gOtherText_Terminator2\n" + "_0804A244:\n" + "\tldr r0, _0804A2A4 @ =gUnknown_0820C14C\n" + "\tldr r0, [r0, 0x14]\n" + "\tadds r1, r5, 0\n" + "\tadds r1, 0x7E\n" + "\tldrh r1, [r1]\n" + "\tlsls r1, 5\n" + "\tldr r3, _0804A2A8 @ =0x06010000\n" + "\tadds r1, r3\n" + "\tmovs r2, 0x14\n" + "\tbl sub_804ACD8\n" + "\tldr r0, _0804A2AC @ =gUnknown_0820C3D1\n" + "\tmov r5, r10\n" + "\tlsls r1, r5, 1\n" + "\tadds r4, r1, r0\n" + "\tldrb r2, [r4]\n" + "\tadds r2, 0x4\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tadds r0, 0x1\n" + "\tadds r1, r0\n" + "\tldrb r3, [r1]\n" + "\tadds r3, 0x1\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldrb r0, [r4]\n" + "\tstr r0, [sp]\n" + "\tldrb r0, [r1]\n" + "\tstr r0, [sp, 0x4]\n" + "\tmov r0, r10\n" + "\tmov r1, r8\n" + "\tbl sub_804A51C\n" + "\tldr r0, _0804A2B0 @ =gUnknown_03004824\n" + "\tldr r1, [r0]\n" + "_0804A28A:\n" + "\tadds r1, 0x80\n" + "\tadd r1, r10\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "_0804A294:\n" + "\tadd sp, 0x74\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804A2A4: .4byte gUnknown_0820C14C\n" + "_0804A2A8: .4byte 0x06010000\n" + "_0804A2AC: .4byte gUnknown_0820C3D1\n" + "_0804A2B0: .4byte gUnknown_03004824"); +} +#endif + +#ifdef NONMATCHING +static +#endif +u8 sub_804A2B4(u8 *a0, u8 whichParty, u8 whichPokemon) +{ + u8 string[11]; + if (whichParty == 0) + { + GetMonData(&gPlayerParty[whichPokemon], MON_DATA_NICKNAME, string); + StringCopy10(a0, string); + GetMonGender(&gPlayerParty[whichPokemon]); + GetMonData(&gPlayerParty[whichPokemon], MON_DATA_LEVEL); + } + else + { + GetMonData(&gEnemyParty[whichPokemon], MON_DATA_NICKNAME, string); + StringCopy10(a0, string); + GetMonGender(&gEnemyParty[whichPokemon]); + GetMonData(&gEnemyParty[whichPokemon], MON_DATA_LEVEL); + } + return Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7294, a0); +} + +#ifdef NONMATCHING +static +#endif +void sub_804A33C(u8 *a0, u8 whichParty, u8 whichPokemon) +{ + u16 i; + u16 moves[4]; + if (gUnknown_03004824->unk_005d[whichParty][whichPokemon] == 0) + { + for (i = 0; i < 4; i ++) + { + if (whichParty == 0) + moves[i] = GetMonData(&gPlayerParty[whichPokemon], MON_DATA_MOVE1 + i, NULL); + else + moves[i] = GetMonData(&gEnemyParty[whichPokemon], MON_DATA_MOVE1 + i, NULL); + } + StringCopy(a0, gOtherText_Terminator); + for (i = 0; i < 4; i ++) + { + if (moves[i] != 0) + { + StringAppend(a0, gMoveNames[moves[i]]); + } + StringAppend(a0, gOtherText_ControlAndMiscText); + } + } + else + { + StringCopy(a0, gOtherText_Terminator); + StringAppend(a0, gOtherText_FourQuestions); + } +} + +#ifdef NONMATCHING +static void sub_804A41C(u8 whichParty) +{ + u8 i; + u8 nickname[22]; + u8 string[40]; + struct Pokemon *pokemon; + + string[0] = 0xFC; + string[1] = 0x06; + string[2] = 0x04; + string[3] = 0xFC; + string[4] = 0x11; + string[5] = 0x00; + + for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) + { + pokemon = whichParty == 0 ? &gPlayerParty[i] : &gEnemyParty[i]; + GetMonData(pokemon, MON_DATA_NICKNAME, nickname); + StringCopy10(string + 6, nickname); + GetMonGender(pokemon); + string[5] = (50 - Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7294, string + 6)) / 2; + Text_InitWindowAndPrintText(&gUnknown_03004824->window, string, gUnknown_03004824->unk_007a + 22 * 6 * whichParty + 22 * i, gTradeMonSpriteCoords[i + 6 * whichParty][0], gTradeMonSpriteCoords[i + 6 * whichParty][1]); + } +} +#else +__attribute__((naked)) +static void sub_804A41C(u8 whichParty) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x44\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tadd r3, sp, 0x1C\n" + "\tmovs r2, 0\n" + "\tmovs r1, 0xFC\n" + "\tstrb r1, [r3]\n" + "\tmovs r0, 0x6\n" + "\tstrb r0, [r3, 0x1]\n" + "\tmovs r0, 0x4\n" + "\tstrb r0, [r3, 0x2]\n" + "\tstrb r1, [r3, 0x3]\n" + "\tmovs r0, 0x11\n" + "\tstrb r0, [r3, 0x4]\n" + "\tstrb r2, [r3, 0x5]\n" + "\tmovs r6, 0\n" + "\tldr r1, _0804A470 @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x42\n" + "\tadds r0, r5\n" + "\tldrb r0, [r0]\n" + "\tcmp r6, r0\n" + "\tbcs _0804A504\n" + "\tmov r8, r3\n" + "\tadds r7, r1, 0\n" + "\tldr r0, _0804A474 @ =gTradeMonSpriteCoords\n" + "\tmov r9, r0\n" + "\tmovs r4, 0x1\n" + "\tadd r4, r9\n" + "\tmov r10, r4\n" + "_0804A462:\n" + "\tcmp r5, 0\n" + "\tbne _0804A47C\n" + "\tmovs r0, 0x64\n" + "\tadds r4, r6, 0\n" + "\tmuls r4, r0\n" + "\tldr r0, _0804A478 @ =gPlayerParty\n" + "\tb _0804A484\n" + "\t.align 2, 0\n" + "_0804A470: .4byte gUnknown_03004824\n" + "_0804A474: .4byte gTradeMonSpriteCoords\n" + "_0804A478: .4byte gPlayerParty\n" + "_0804A47C:\n" + "\tmovs r0, 0x64\n" + "\tadds r4, r6, 0\n" + "\tmuls r4, r0\n" + "\tldr r0, _0804A514 @ =gEnemyParty\n" + "_0804A484:\n" + "\tadds r4, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x2\n" + "\tadd r2, sp, 0x4\n" + "\tbl GetMonData\n" + "\tmov r0, sp\n" + "\tadds r0, 0x22\n" + "\tadd r1, sp, 0x4\n" + "\tbl StringCopy10\n" + "\tadds r0, r4, 0\n" + "\tbl GetMonGender\n" + "\tmov r1, sp\n" + "\tadds r1, 0x22\n" + "\tldr r0, _0804A518 @ =gWindowTemplate_81E7294\n" + "\tbl Text_GetStringWidthFromWindowTemplate\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmovs r1, 0x32\n" + "\tsubs r1, r0\n" + "\tlsrs r0, r1, 31\n" + "\tadds r1, r0\n" + "\tasrs r1, 1\n" + "\tmov r0, r8\n" + "\tstrb r1, [r0, 0x5]\n" + "\tldr r1, [r7]\n" + "\tadds r0, r1, 0x4\n" + "\tadds r1, 0x7A\n" + "\tlsls r2, r5, 5\n" + "\tadds r2, r5\n" + "\tlsls r2, 2\n" + "\tldrb r1, [r1]\n" + "\tadds r2, r1\n" + "\tmovs r1, 0x16\n" + "\tmuls r1, r6\n" + "\tadds r2, r1\n" + "\tlsls r2, 16\n" + "\tlsrs r2, 16\n" + "\tlsls r1, r5, 1\n" + "\tadds r1, r5\n" + "\tlsls r1, 1\n" + "\tadds r1, r6, r1\n" + "\tlsls r1, 1\n" + "\tmov r4, r9\n" + "\tadds r3, r1, r4\n" + "\tldrb r3, [r3]\n" + "\tadd r1, r10\n" + "\tldrb r1, [r1]\n" + "\tstr r1, [sp]\n" + "\tmov r1, r8\n" + "\tbl Text_InitWindowAndPrintText\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r0, [r7]\n" + "\tadds r0, 0x42\n" + "\tadds r0, r5\n" + "\tldrb r0, [r0]\n" + "\tcmp r6, r0\n" + "\tbcc _0804A462\n" + "_0804A504:\n" + "\tadd sp, 0x44\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804A514: .4byte gEnemyParty\n" + "_0804A518: .4byte gWindowTemplate_81E7294"); +} +#endif + +#ifdef NONMATCHING +static +#endif +void sub_804A51C(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4, u8 a5) +{ + u8 nickname[24]; + u8 level; + u8 gender; + u8 lv_div_10; + sub_804A96C(&gUnknown_03004824->unk_00c8, a4, a5, gTradeMonBoxTilemap, 6, 3, 0); + if (a0 == 0) + { + level = GetMonData(&gPlayerParty[a1], MON_DATA_LEVEL, NULL); + gender = GetMonGender(&gPlayerParty[a1]); + GetMonData(&gPlayerParty[a1], MON_DATA_NICKNAME, nickname); + } + else + { + level = GetMonData(&gEnemyParty[a1], MON_DATA_LEVEL, NULL); + gender = GetMonGender(&gEnemyParty[a1]); + GetMonData(&gEnemyParty[a1], MON_DATA_NICKNAME, nickname); + } + if (gUnknown_03004824->unk_005d[a0][a1] == 0) + { + lv_div_10 = level / 10; + if (lv_div_10 != 0) + { + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3] = lv_div_10 + 0x60; + } + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 + 1] = (u8)(level % 10) + 0x70; + if (gender == MON_MALE) + { + if (!NameHasGenderSymbol(nickname, MON_MALE)) + { + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] += 1; + } + } + else if (gender == MON_FEMALE) + { + if (!NameHasGenderSymbol(nickname, MON_FEMALE)) + { + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] += 2; + } + } + } + else + { + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 32] = gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 33]; + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] = gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 36] | 0x400; + } +#ifdef GERMAN + gUnknown_03004824->unk_00c8.unk_10 = 1; +#endif +} + +#ifdef NONMATCHING +static void sub_804A6DC(u8 whichParty) +{ + int i; + for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) + { + sub_804A51C(whichParty, i, gTradeLevelDisplayCoords[whichParty][i][0], gTradeLevelDisplayCoords[whichParty][i][1], gTradeMonBoxCoords[whichParty][i][0], gTradeMonBoxCoords[whichParty][i][1]); + } +} +#else +__attribute__((naked)) +static void sub_804A6DC(u8 whichParty) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tsub sp, 0x8\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tmovs r7, 0\n" + "\tldr r0, _0804A734 @ =gUnknown_03004824\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0x42\n" + "\tadds r0, r6\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tbge _0804A72C\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r6\n" + "\tldr r1, _0804A738 @ =gTradeLevelDisplayCoords\n" + "\tlsls r0, 2\n" + "\tadds r5, r0, r1\n" + "\tldr r1, _0804A73C @ =gTradeMonBoxCoords\n" + "\tadds r4, r0, r1\n" + "_0804A702:\n" + "\tlsls r1, r7, 24\n" + "\tlsrs r1, 24\n" + "\tldrb r2, [r5]\n" + "\tldrb r3, [r5, 0x1]\n" + "\tldrb r0, [r4]\n" + "\tstr r0, [sp]\n" + "\tldrb r0, [r4, 0x1]\n" + "\tstr r0, [sp, 0x4]\n" + "\tadds r0, r6, 0\n" + "\tbl sub_804A51C\n" + "\tadds r5, 0x2\n" + "\tadds r4, 0x2\n" + "\tadds r7, 0x1\n" + "\tldr r0, _0804A734 @ =gUnknown_03004824\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0x42\n" + "\tadds r0, r6\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tblt _0804A702\n" + "_0804A72C:\n" + "\tadd sp, 0x8\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804A734: .4byte gUnknown_03004824\n" + "_0804A738: .4byte gTradeLevelDisplayCoords\n" + "_0804A73C: .4byte gTradeMonBoxCoords"); +} +#endif + +static void sub_804A740(u8 whichParty) +{ + int i; + for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) + { + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].invisible = FALSE; + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos1.x = gTradeMonSpriteCoords[6 * whichParty + i][0] * 8 + 14; + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos1.y = gTradeMonSpriteCoords[6 * whichParty + i][1] * 8 - 12; + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos2.x = 0; + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos2.y = 0; + } +} + +static void sub_804A80C(void) +{ + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); + sub_804A41C(1); +} + +static void sub_804A840(u8 whichParty) +{ + if (whichParty == 0) + { + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[0][0], 0, gUnknown_0820C330[0][1], 19); + sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 0, 0, gTradePartyBoxTilemap, 15, 17, 0); + sub_804A6DC(0); + sub_804A41C(0); + sub_804A740(0); + sub_804A938(&gUnknown_03004824->unk_00c8); + } + else + { + Menu_DestroyCursor(); + Text_FillWindowRectDefPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); + sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15, 0, gTradePartyBoxTilemap, 15, 17, 0); + sub_804A6DC(1); + sub_804A41C(1); + sub_804A740(1); + sub_804A938(&gUnknown_03004824->unk_00c8); + } + sub_804ACD8(gUnknown_0820C14C[1], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); + gUnknown_03004824->unk_0080[whichParty] = 0; +} + +static void sub_804A938(struct UnkStructD *unkStructD) +{ + unkStructD->unk_10 = 1; +} + +static void sub_804A940(struct UnkStructD *unkStructD) +{ + if (unkStructD->unk_10) + { + CpuCopy16(unkStructD->unk_12, unkStructD->vramAddr, sizeof(unkStructD->unk_12)); + unkStructD->unk_10 = 0; + } +} + +static void sub_804A964(struct UnkStructD *unkStructD, void *dest) +{ + unkStructD->unk_10 = 0; + unkStructD->vramAddr = dest; +} + +static void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, const u16 *tilemap, u8 width, u8 height, u16 sp8) { + int y, x; + + for (y = 0; y < height; y++) + { + + for (x = 0; x < width; x++) + { + arg0->unk_12[(top * 32 + left) + y * 32 + x] = tilemap[width * y + x] | sp8; + } + } + +#if ENGLISH + arg0->unk_10 = 1; +#endif +} + +#if GERMAN +static void sub_804A96C_alt(struct UnkStructD *arg0, u8 left, u8 top, const u16 *tilemap, u8 width, u8 height, u16 sp8) { + sub_804A96C(arg0, left, top, tilemap, width, height, sp8); + + arg0->unk_10 = 1; +} +#endif + +static void sub_804A9F4(u8 unused) +{ + Menu_EraseScreen(); +} + +static void sub_804AA00(u8 unused) +{ + Menu_EraseScreen(); +} + +static void sub_804AA0C(u8 a0) +{ + TextWindow_DrawStdFrame(&gUnknown_03004824->window, gTradeMessageWindowRects[a0][0], gTradeMessageWindowRects[a0][1], gTradeMessageWindowRects[a0][2], gTradeMessageWindowRects[a0][3]); + Text_InitWindowAndPrintText(&gUnknown_03004824->window, gUnknown_0820C2F0[a0], 0x180 + gUnknown_03004824->unk_007a, gTradeMessageWindowRects[a0][0] + 1, gTradeMessageWindowRects[a0][1] + 1); +} + +static void sub_804AA88(void) +{ + int i; + for (i = 0; i < 4; i ++) + { + gUnknown_03004824->unk_08dc[i].unk_00 = 0; + gUnknown_03004824->unk_08dc[i].unk_02 = 0; + gUnknown_03004824->unk_08dc[i].unk_04 |= 0xff; + } +} + +static void sub_804AADC(u16 a0, u8 a1) +{ + int i; + for (i = 0; i < 4; i ++) + { + if (gUnknown_03004824->unk_08dc[i].unk_00 == 0) + { + gUnknown_03004824->unk_08dc[i].unk_02 = a0; + gUnknown_03004824->unk_08dc[i].unk_04 = a1; + gUnknown_03004824->unk_08dc[i].unk_00 = 1; + break; + } + } +} + +static void sub_804AB30(void) +{ + int i; + for (i = 0; i < 4; i ++) + { + if (gUnknown_03004824->unk_08dc[i].unk_00) + { + if (gUnknown_03004824->unk_08dc[i].unk_02 != 0) + { + gUnknown_03004824->unk_08dc[i].unk_02 --; + continue; + } + switch (gUnknown_03004824->unk_08dc[i].unk_04) + { + case 0: + Trade_SendData(gUnknown_03004824); + break; + case 1: + sub_804AA0C(0); + break; + case 2: + sub_804AA0C(2); + break; + case 3: + sub_804AA0C(3); + break; + case 4: + sub_804AA0C(3); + break; + case 5: + sub_804AA0C(3); + break; + } + gUnknown_03004824->unk_08dc[i].unk_00 = 0; + } + } +} + +static bool8 sub_804ABF8(void) +{ + switch (gUnknown_03004824->unk_00b4) + { + case 8: + gUnknown_03004824->unk_007e = LoadSpriteSheet(&gUnknown_0820C07C[gUnknown_03004824->unk_00b4]); + gUnknown_03004824->unk_00b4 ++; + return FALSE; + case 13: + LoadSpritePalette(&gSpritePalette_TradeScreenText); + gUnknown_03004824->unk_00b4 ++; + return FALSE; + case 14: + LoadSpritePalette(&gUnknown_0820C12C); + gUnknown_03004824->unk_00b4 ++; + return FALSE; + case 15: + LoadSpriteSheet(&gUnknown_0820C124); + gUnknown_03004824->unk_00b4 ++; + // fallthrough + case 16: + gUnknown_03004824->unk_00b4 = 0; + return TRUE; + default: + LoadSpriteSheet(&gUnknown_0820C07C[gUnknown_03004824->unk_00b4]); + gUnknown_03004824->unk_00b4 ++; + return FALSE; + } +} + +static void sub_804ACD8(const u8 *src, u8 *dest, u8 a2) +{ + sub_804AFB8(&gWindowTemplate_81E725C, dest, src, a2); +} + +#ifdef NONMATCHING +static void sub_804ACF4(u8 who) +{ + struct Pokemon *pokemon; + int i; + switch (who) + { + case 0: + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + { + pokemon = &gPlayerParty[i]; + if (GetMonData(pokemon, MON_DATA_IS_EGG) == TRUE) + { + gUnknown_03004824->unk_0051[0][i] = 0; + gUnknown_03004824->unk_005d[0][i] = 1; + } + else if (GetMonData(pokemon, MON_DATA_HP) == 0) + { + gUnknown_03004824->unk_0051[0][i] = 0; + gUnknown_03004824->unk_005d[0][i] = 0; + } + else + { + gUnknown_03004824->unk_0051[0][i] = 1; + gUnknown_03004824->unk_005d[0][i] = 0; + } + } + break; + case 1: + for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) + { + pokemon = &gEnemyParty[i]; + if (GetMonData(pokemon, MON_DATA_IS_EGG) == TRUE) + { + gUnknown_03004824->unk_0051[1][i] = 0; + gUnknown_03004824->unk_005d[1][i] = 1; + } + else if (GetMonData(pokemon, MON_DATA_HP) == 0) + { + gUnknown_03004824->unk_0051[1][i] = 0; + gUnknown_03004824->unk_005d[1][i] = 0; + } + else + { + gUnknown_03004824->unk_0051[1][i] = 1; + gUnknown_03004824->unk_005d[1][i] = 0; + } + } + break; + } +} +#else +static __attribute__((naked)) void sub_804ACF4(u8 who) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r8, r0\n" + "\tcmp r0, 0\n" + "\tbeq _0804AD0C\n" + "\tcmp r0, 0x1\n" + "\tbeq _0804ADA0\n" + "\tb _0804AE2C\n" + "_0804AD0C:\n" + "\tmovs r7, 0\n" + "\tldr r1, _0804AD4C @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x42\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tblt _0804AD1C\n" + "\tb _0804AE2C\n" + "_0804AD1C:\n" + "\tadds r6, r1, 0\n" + "\tmovs r5, 0\n" + "\tmov r9, r5\n" + "_0804AD22:\n" + "\tmovs r0, 0x64\n" + "\tadds r1, r7, 0\n" + "\tmuls r1, r0\n" + "\tldr r0, _0804AD50 @ =gPlayerParty\n" + "\tadds r4, r1, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x2D\n" + "\tbl GetMonData\n" + "\tadds r1, r0, 0\n" + "\tcmp r1, 0x1\n" + "\tbne _0804AD54\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tmov r2, r9\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tb _0804AD84\n" + "\t.align 2, 0\n" + "_0804AD4C: .4byte gUnknown_03004824\n" + "_0804AD50: .4byte gPlayerParty\n" + "_0804AD54:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x39\n" + "\tbl GetMonData\n" + "\tadds r1, r0, 0\n" + "\tcmp r1, 0\n" + "\tbne _0804AD72\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tb _0804AD84\n" + "_0804AD72:\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tmovs r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tmov r1, r9\n" + "_0804AD84:\n" + "\tstrb r1, [r0]\n" + "\tldr r0, _0804AD9C @ =gUnknown_03004824\n" + "\tadds r5, 0x1\n" + "\tadds r7, 0x1\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0x42\n" + "\tadd r0, r8\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tblt _0804AD22\n" + "\tb _0804AE2C\n" + "\t.align 2, 0\n" + "_0804AD9C: .4byte gUnknown_03004824\n" + "_0804ADA0:\n" + "\tmovs r7, 0\n" + "\tldr r1, _0804ADE0 @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x43\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tbge _0804AE2C\n" + "\tadds r6, r1, 0\n" + "\tmovs r5, 0x6\n" + "\tmovs r2, 0\n" + "\tmov r9, r2\n" + "_0804ADB6:\n" + "\tmovs r0, 0x64\n" + "\tadds r1, r7, 0\n" + "\tmuls r1, r0\n" + "\tldr r0, _0804ADE4 @ =gEnemyParty\n" + "\tadds r4, r1, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x2D\n" + "\tbl GetMonData\n" + "\tadds r1, r0, 0\n" + "\tcmp r1, 0x1\n" + "\tbne _0804ADE8\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tmov r2, r9\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tb _0804AE18\n" + "\t.align 2, 0\n" + "_0804ADE0: .4byte gUnknown_03004824\n" + "_0804ADE4: .4byte gEnemyParty\n" + "_0804ADE8:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x39\n" + "\tbl GetMonData\n" + "\tadds r1, r0, 0\n" + "\tcmp r1, 0\n" + "\tbne _0804AE06\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tb _0804AE18\n" + "_0804AE06:\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tmovs r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tmov r1, r9\n" + "_0804AE18:\n" + "\tstrb r1, [r0]\n" + "\tldr r0, _0804AE38 @ =gUnknown_03004824\n" + "\tadds r5, 0x1\n" + "\tadds r7, 0x1\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0x42\n" + "\tadd r0, r8\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tblt _0804ADB6\n" + "_0804AE2C:\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804AE38: .4byte gUnknown_03004824"); +} +#endif + +static void sub_804AE3C(u8 who) +{ + u16 i; + u16 curHp; + u16 maxHp; + switch (who) + { + case 0: + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + { + curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); + gUnknown_03004824->unk_0069[0][i] = GetHPBarLevel(curHp, maxHp); + } + break; + case 1: + for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) + { + curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP); + maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP); + gUnknown_03004824->unk_0069[1][i] = GetHPBarLevel(curHp, maxHp); + } + break; + } +} + +static void sub_804AF10(void) +{ + int i, j; + for (i = 0; i < 2; i ++) + { + for (j = 0; j < gUnknown_03004824->partyCounts[i]; j ++) + { + sub_809D824(&gSprites[gUnknown_03004824->partyIcons[i][j]], 4 - gUnknown_03004824->unk_0069[i][j]); + } + } +} + +static void sub_804AF84(void) +{ + int i; + for (i = 0; i < 11; i ++) + if (gSaveBlock1.giftRibbons[i] == 0 && gUnknown_03004824->unk_00b5[i] != 0) + gSaveBlock1.giftRibbons[i] = gUnknown_03004824->unk_00b5[i]; +} + +static void sub_804AFB8(const struct WindowTemplate *windowConfig, u8 *dest, const u8 *src, u8 size) +{ + u8 i; + u8 *tileBuffer; + size = (size + 3) / 4; + tileBuffer = gTileBuffer; + CpuFill16(0, tileBuffer, size * 0x80); + CpuFill16(0, tileBuffer + windowConfig->width * 0x20, size * 0x80); + Text_InitWindow8004E3C(windowConfig, tileBuffer, src); + for (i = 0; i < size; i ++) + { + CpuCopy16(&tileBuffer[32 * (i * 4)], &dest[32 * (i * 8)], 0x80); + CpuCopy16(&tileBuffer[32 * (i * 4 + windowConfig->width)], &dest[32 * (i * 8 + 4)], 0x80); + } +} + +static void sub_804B058(struct Sprite *sprite) +{ + if (++ sprite->data[0] == 10) + { + PlaySE(SE_BOWA); + sprite->data[0] = 0; + } +} + +static void sub_804B07C(struct Sprite *sprite) +{ + if (sprite->data[1] == 0) + { + if (++ sprite->data[0] == 12) + sprite->data[0] = 0; + LoadPalette(&gTradeGlow2PaletteAnimTable[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2); + } +} + +static void sub_804B0BC(struct Sprite *sprite) +{ + sprite->data[0] ++; + sprite->pos2.y ++; + if (sprite->data[0] == 10) + DestroySprite(sprite); +} + +static void sub_804B0E0(struct Sprite *sprite) +{ + sprite->data[0] ++; + sprite->pos2.y --; + if (sprite->data[0] == 10) + DestroySprite(sprite); +} + +static void sub_804B104(struct Sprite *sprite) +{ + if (++ sprite->data[0] == 15) + { + PlaySE(SE_W107); + sprite->data[0] = 0; + } +} + +static void sub_804B128(void) +{ + struct BgAffineDstData dest; + DoBgAffineSet(&dest, gUnknown_03004828->unk_0104 << 8, gUnknown_03004828->unk_0106 << 8, gUnknown_03004828->unk_010c, gUnknown_03004828->unk_010e, gUnknown_03004828->unk_0118, gUnknown_03004828->unk_0118, gUnknown_03004828->unk_011c); + REG_BG2PA = dest.pa; + REG_BG2PB = dest.pb; + REG_BG2PC = dest.pc; + REG_BG2PD = dest.pd; + REG_BG2X = dest.dx; + REG_BG2Y = dest.dy; +} + +#ifdef NONMATCHING +static void sub_804B1BC(void) +{ + REG_BG1VOFS = gUnknown_03004828->bg1vofs; + REG_BG1HOFS = gUnknown_03004828->bg1hofs; + if ((REG_DISPCNT & 7) == DISPCNT_MODE_0) + { + REG_BG2VOFS = gUnknown_03004828->bg2vofs; + REG_BG2HOFS = gUnknown_03004828->bg2hofs; + } + else + { + sub_804B128(); + } +} +#else +__attribute__((naked)) static void sub_804B1BC(void) +{ + asm_unified("\tpush {lr}\n" + "\tldr r1, _0804B1FC @ =REG_BG1VOFS\n" + "\tldr r0, _0804B200 @ =gUnknown_03004828\n" + "\tldr r2, [r0]\n" + "\tmovs r3, 0x88\n" + "\tlsls r3, 1\n" + "\tadds r0, r2, r3\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tsubs r1, 0x2\n" + "\tadds r3, 0x2\n" + "\tadds r0, r2, r3\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 19\n" + "\tldrh r0, [r0]\n" + "\tmovs r1, 0x7\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbne _0804B208\n" + "\tldr r1, _0804B204 @ =REG_BG2VOFS\n" + "\tadds r3, 0x2\n" + "\tadds r0, r2, r3\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tsubs r1, 0x2\n" + "\tadds r3, 0x2\n" + "\tadds r0, r2, r3\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tb _0804B20C\n" + "\t.align 2, 0\n" + "_0804B1FC: .4byte REG_BG1VOFS\n" + "_0804B200: .4byte gUnknown_03004828\n" + "_0804B204: .4byte REG_BG2VOFS\n" + "_0804B208:\n" + "\tbl sub_804B128\n" + "_0804B20C:\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +static void sub_804B210(void) +{ + sub_804B1BC(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_804B228(void) +{ + gUnknown_03004828->unk_00b4 = 0; + gUnknown_03004828->unk_00b2 = 0; + gUnknown_03004828->unk_00b3 = 0; +} + +#ifdef NONMATCHING +static +#endif +void sub_804B24C(void) +{ + if (gUnknown_03004828->unk_00b2 == gUnknown_03004828->unk_00b3) + { + gUnknown_03004828->unk_00b4 ++; + } + else + { + gUnknown_03004828->unk_00b4 = 0; + } + if (gUnknown_03004828->unk_00b4 > 0xb4) + { + gUnknown_03004828->unk_00b4 = 0; + gUnknown_03004828->unk_00b3 = 0; + gUnknown_03004828->unk_00b2 = 0; + } + gUnknown_03004828->unk_00b3 = gUnknown_03004828->unk_00b2; +} + +static u8 sub_804B2B0(void) +{ + if (gReceivedRemoteLinkPlayers) + return GetMultiplayerId(); + return 0; +} + +static void sub_804B2D0(u8 whichParty, u8 a1) +{ + u8 v0; + struct Pokemon *pokemon; + u16 species; + u32 personality; + + v0 = 0; + pokemon = NULL; + if (whichParty == 0) + { + pokemon = &gPlayerParty[gUnknown_020297D8[0]]; + v0 = 1; + } + if (whichParty == 1) + { + pokemon = &gEnemyParty[gUnknown_020297D8[1] % 6]; + v0 = 3; + } + switch (a1) + { + case 0: + species = GetMonData(pokemon, MON_DATA_SPECIES2); + personality = GetMonData(pokemon, MON_DATA_PERSONALITY); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gSharedMem, gUnknown_081FAF4C[whichParty * 2 + 1], species, personality); + LoadCompressedObjectPalette(GetMonSpritePalStruct(pokemon)); + gUnknown_03004828->tradeSpecies[whichParty] = species; + break; + case 1: + GetMonSpriteTemplate_803C56C(GetMonSpritePalStruct(pokemon)->tag, v0); + gUnknown_03004828->pokePicSpriteIdxs[whichParty] = CreateSprite(&gUnknown_02024E8C, 0x78, 0x3c, 0x6); + gSprites[gUnknown_03004828->pokePicSpriteIdxs[whichParty]].invisible = TRUE; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; + break; + } +} + +#ifdef NONMATCHING +static void sub_804B41C(void) +// Link trade init +{ + switch (gMain.state) + { + case 0: + REG_DISPCNT = 0; + ResetTasks(); + CloseLink(); + gUnknown_03004828 = &ewram_2010000.unk_0f000; + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(sub_804B210); + sub_804B228(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6F84); + Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E6F84); + gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); + Menu_EraseScreen(); + gLinkType = 0x1144; + gMain.state ++; + LZDecompressVram(gUnknown_08D00000, (void *)VRAM); + CpuCopy16(gUnknown_08D00524, ewram, 0x1000); + DmaCopy16Defvars(3, ewram, BG_SCREEN_ADDR(5), 0x500); + LoadCompressedPalette(gUnknown_08D004E0, 0, 32); + gUnknown_03004828->unk_00b6 = 0; + gUnknown_03004828->unk_00c4 = 0; + gUnknown_03004828->isLinkTrade = TRUE; + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x40; + gUnknown_03004828->unk_0108 = 0; + gUnknown_03004828->unk_010a = 0; + gUnknown_03004828->unk_010c = 0x78; + gUnknown_03004828->unk_010e = 0x50; + gUnknown_03004828->unk_0118 = 0x100; + gUnknown_03004828->unk_011c = 0; + break; + case 1: + OpenLink(); + gMain.state ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 2: + if (++ gUnknown_03004828->unk_00c0 > 60) + { + gUnknown_03004828->unk_00c0 = 0; + gMain.state ++; + } + break; + case 3: + if (IsLinkMaster()) + { + if (GetLinkPlayerCount_2() >= sub_800820C() && ++ gUnknown_03004828->unk_00c0 > 30) + { + sub_8007F4C(); + gMain.state ++; + } + } + else + { + gMain.state ++; + } + break; + case 4: + sub_804B24C(); + if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) gMain.state ++; + break; + case 5: + gUnknown_03004828->unk_009c = 0; + gUnknown_03004828->unk_009d = 0; + gUnknown_03004828->unk_00bd = 0; + sub_804B2D0(0, 0); + gMain.state ++; + break; + case 6: + sub_804B2D0(0, 1); + gMain.state ++; + break; + case 7: + sub_804B2D0(1, 0); + gMain.state ++; + break; + case 8: + sub_804B2D0(1, 1); + gMain.state ++; + break; + case 9: + sub_804C164(); + LoadSpriteSheet(&gUnknown_0821594C); + LoadSpritePalette(&gUnknown_08215954); + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); + gMain.state ++; + break; + case 10: + gMain.state ++; + // fallthrough + case 11: + sub_804BBE8(5); + sub_804BBE8(0); + sub_804C1A8(); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gMain.state ++; + break; + case 12: + if (!gPaletteFade.active) + { + SetMainCallback2(sub_804DB84); + } + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} +#else +static __attribute__((naked)) void sub_804B41C(void) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tsub sp, 0x4\n" + "\tldr r1, _0804B43C @ =gMain\n" + "\tldr r2, _0804B440 @ =0x0000043c\n" + "\tadds r0, r1, r2\n" + "\tldrb r0, [r0]\n" + "\tadds r2, r1, 0\n" + "\tcmp r0, 0xC\n" + "\tbls _0804B430\n" + "\tb _0804B76E_break\n" + "_0804B430:\n" + "\tlsls r0, 2\n" + "\tldr r1, _0804B444 @ =_0804B448\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0804B43C: .4byte gMain\n" + "_0804B440: .4byte 0x0000043c\n" + "_0804B444: .4byte _0804B448\n" + "\t.align 2, 0\n" + "_0804B448:\n" + "\t.4byte _0804B47C_case00\n" + "\t.4byte _0804B5AC_case01\n" + "\t.4byte _0804B5D4_case02\n" + "\t.4byte _0804B5FC_case03\n" + "\t.4byte _0804B648_case04\n" + "\t.4byte _0804B678_case05\n" + "\t.4byte _0804B6A8_case06\n" + "\t.4byte _0804B6B2_case07\n" + "\t.4byte _0804B6CC_case08\n" + "\t.4byte _0804B6E4_case09\n" + "\t.4byte _0804B71C_case10\n" + "\t.4byte _0804B726_case11\n" + "\t.4byte _0804B75C_case12\n" + "_0804B47C_case00:\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 19\n" + "\tmovs r0, 0\n" + "\tstrh r0, [r1]\n" + "\tbl ResetTasks\n" + "\tbl CloseLink\n" + "\tldr r6, _0804B570 @ =gUnknown_03004828\n" + "\tldr r5, _0804B574 @ =gSharedMem + 0x1F000\n" + "\tstr r5, [r6]\n" + "\tbl ResetSpriteData\n" + "\tbl FreeAllSpritePalettes\n" + "\tldr r0, _0804B578 @ =sub_804B210\n" + "\tbl SetVBlankCallback\n" + "\tbl sub_804B228\n" + "\tldr r4, _0804B57C @ =gWindowTemplate_81E6F84\n" + "\tadds r0, r4, 0\n" + "\tbl Text_LoadWindowTemplate\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x4\n" + "\tadds r1, r4, 0\n" + "\tbl Text_InitWindowWithTemplate\n" + "\tmovs r0, 0x2\n" + "\tbl TextWindow_SetBaseTileNum\n" + "\tldr r1, [r6]\n" + "\tadds r1, 0x34\n" + "\tstrb r0, [r1]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x4\n" + "\tbl TextWindow_LoadStdFrameGraphics\n" + "\tbl Menu_EraseScreen\n" + "\tldr r1, _0804B580 @ =gLinkType\n" + "\tldr r4, _0804B584 @ =0x00001144\n" + "\tadds r0, r4, 0\n" + "\tstrh r0, [r1]\n" + "\tldr r1, _0804B588 @ =gMain\n" + "\tldr r0, _0804B58C @ =0x0000043c\n" + "\tadds r1, r0\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tldr r0, _0804B590 @ =gUnknown_08D00000\n" + "\tmovs r1, 0xC0\n" + "\tlsls r1, 19\n" + "\tbl LZDecompressVram\n" + "\tldr r0, _0804B594 @ =gUnknown_08D00524\n" + "\tldr r1, _0804B598 @ =0xfffe1000\n" + "\tadds r5, r1\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 4\n" + "\tadds r1, r5, 0\n" + "\tbl CpuSet\n" + "\tldr r1, _0804B59C @ =0x06002800\n" + "\tldr r0, _0804B5A0 @ =0x040000d4\n" + "\tstr r5, [r0]\n" + "\tstr r1, [r0, 0x4]\n" + "\tldr r1, _0804B5A4 @ =0x80000280\n" + "\tstr r1, [r0, 0x8]\n" + "\tldr r0, [r0, 0x8]\n" + "\tldr r0, _0804B5A8 @ =gUnknown_08D004E0\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0x20\n" + "\tbl LoadCompressedPalette\n" + "\tldr r1, [r6]\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0xB6\n" + "\tmovs r2, 0\n" + "\tstrh r2, [r0]\n" + "\tadds r0, 0xE\n" + "\tstrh r2, [r0]\n" + "\tmovs r4, 0x8F\n" + "\tlsls r4, 1\n" + "\tadds r1, r4\n" + "\tmovs r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tldr r3, [r6]\n" + "\tmovs r1, 0x82\n" + "\tlsls r1, 1\n" + "\tadds r0, r3, r1\n" + "\tmovs r1, 0x40\n" + "\tstrh r1, [r0]\n" + "\tsubs r4, 0x18\n" + "\tadds r0, r3, r4\n" + "\tstrh r1, [r0]\n" + "\tadds r1, 0xC8\n" + "\tadds r0, r3, r1\n" + "\tstrh r2, [r0]\n" + "\tadds r4, 0x4\n" + "\tadds r0, r3, r4\n" + "\tstrh r2, [r0]\n" + "\tmovs r0, 0x86\n" + "\tlsls r0, 1\n" + "\tadds r1, r3, r0\n" + "\tmovs r0, 0x78\n" + "\tstrh r0, [r1]\n" + "\tadds r4, 0x4\n" + "\tadds r1, r3, r4\n" + "\tmovs r0, 0x50\n" + "\tstrh r0, [r1]\n" + "\tadds r0, 0xC8\n" + "\tadds r1, r3, r0\n" + "\tsubs r0, 0x18\n" + "\tstrh r0, [r1]\n" + "\tmovs r1, 0x8E\n" + "\tlsls r1, 1\n" + "\tadds r0, r3, r1\n" + "\tstrh r2, [r0]\n" + "\tb _0804B76E_break\n" + "\t.align 2, 0\n" + "_0804B570: .4byte gUnknown_03004828\n" + "_0804B574: .4byte gSharedMem + 0x1F000\n" + "_0804B578: .4byte sub_804B210\n" + "_0804B57C: .4byte gWindowTemplate_81E6F84\n" + "_0804B580: .4byte gLinkType\n" + "_0804B584: .4byte 0x00001144\n" + "_0804B588: .4byte gMain\n" + "_0804B58C: .4byte 0x0000043c\n" + "_0804B590: .4byte gUnknown_08D00000\n" + "_0804B594: .4byte gUnknown_08D00524\n" + "_0804B598: .4byte 0xfffe1000\n" + "_0804B59C: .4byte 0x06002800\n" + "_0804B5A0: .4byte 0x040000d4\n" + "_0804B5A4: .4byte 0x80000280\n" + "_0804B5A8: .4byte gUnknown_08D004E0\n" + "_0804B5AC_case01:\n" + "\tbl OpenLink\n" + "\tldr r1, _0804B5C8 @ =gMain\n" + "\tldr r2, _0804B5CC @ =0x0000043c\n" + "\tadds r1, r2\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tmovs r2, 0\n" + "\tstrb r0, [r1]\n" + "\tldr r0, _0804B5D0 @ =gUnknown_03004828\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0xC0\n" + "\tstr r2, [r0]\n" + "\tb _0804B76E_break\n" + "\t.align 2, 0\n" + "_0804B5C8: .4byte gMain\n" + "_0804B5CC: .4byte 0x0000043c\n" + "_0804B5D0: .4byte gUnknown_03004828\n" + "_0804B5D4_case02:\n" + "\tldr r0, _0804B5F4 @ =gUnknown_03004828\n" + "\tldr r0, [r0]\n" + "\tadds r1, r0, 0\n" + "\tadds r1, 0xC0\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstr r0, [r1]\n" + "\tcmp r0, 0x3C\n" + "\tbhi _0804B5E8\n" + "\tb _0804B76E_break\n" + "_0804B5E8:\n" + "\tmovs r0, 0\n" + "\tstr r0, [r1]\n" + "\tldr r4, _0804B5F8 @ =0x0000043c\n" + "\tadds r1, r2, r4\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B5F4: .4byte gUnknown_03004828\n" + "_0804B5F8: .4byte 0x0000043c\n" + "_0804B5FC_case03:\n" + "\tbl IsLinkMaster\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0804B608\n" + "\tb _0804B746\n" + "_0804B608:\n" + "\tbl GetLinkPlayerCount_2\n" + "\tadds r4, r0, 0\n" + "\tbl sub_800820C\n" + "\tlsls r4, 24\n" + "\tlsls r0, 24\n" + "\tcmp r4, r0\n" + "\tbcs _0804B61C\n" + "\tb _0804B76E_break\n" + "_0804B61C:\n" + "\tldr r0, _0804B63C @ =gUnknown_03004828\n" + "\tldr r1, [r0]\n" + "\tadds r1, 0xC0\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstr r0, [r1]\n" + "\tcmp r0, 0x1E\n" + "\tbhi _0804B62E\n" + "\tb _0804B76E_break\n" + "_0804B62E:\n" + "\tbl sub_8007F4C\n" + "\tldr r1, _0804B640 @ =gMain\n" + "\tldr r0, _0804B644 @ =0x0000043c\n" + "\tadds r1, r0\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B63C: .4byte gUnknown_03004828\n" + "_0804B640: .4byte gMain\n" + "_0804B644: .4byte 0x0000043c\n" + "_0804B648_case04:\n" + "\tbl sub_804B24C\n" + "\tldr r0, _0804B66C @ =gReceivedRemoteLinkPlayers\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x1\n" + "\tbeq _0804B656\n" + "\tb _0804B76E_break\n" + "_0804B656:\n" + "\tbl IsLinkPlayerDataExchangeComplete\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbeq _0804B664\n" + "\tb _0804B76E_break\n" + "_0804B664:\n" + "\tldr r1, _0804B670 @ =gMain\n" + "\tldr r4, _0804B674 @ =0x0000043c\n" + "\tadds r1, r4\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B66C: .4byte gReceivedRemoteLinkPlayers\n" + "_0804B670: .4byte gMain\n" + "_0804B674: .4byte 0x0000043c\n" + "_0804B678_case05:\n" + "\tldr r2, _0804B69C @ =gUnknown_03004828\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x9C\n" + "\tmovs r1, 0\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x9D\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0xBD\n" + "\tstrb r1, [r0]\n" + "\tmovs r0, 0\n" + "\tbl sub_804B2D0\n" + "\tldr r1, _0804B6A0 @ =gMain\n" + "\tldr r0, _0804B6A4 @ =0x0000043c\n" + "\tadds r1, r0\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B69C: .4byte gUnknown_03004828\n" + "_0804B6A0: .4byte gMain\n" + "_0804B6A4: .4byte 0x0000043c\n" + "_0804B6A8_case06:\n" + "\tmovs r0, 0\n" + "\tmovs r1, 0x1\n" + "\tbl sub_804B2D0\n" + "\tb _0804B746\n" + "_0804B6B2_case07:\n" + "\tmovs r0, 0x1\n" + "\tmovs r1, 0\n" + "\tbl sub_804B2D0\n" + "\tldr r1, _0804B6C4 @ =gMain\n" + "\tldr r4, _0804B6C8 @ =0x0000043c\n" + "\tadds r1, r4\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B6C4: .4byte gMain\n" + "_0804B6C8: .4byte 0x0000043c\n" + "_0804B6CC_case08:\n" + "\tmovs r0, 0x1\n" + "\tmovs r1, 0x1\n" + "\tbl sub_804B2D0\n" + "\tldr r1, _0804B6DC @ =gMain\n" + "\tldr r0, _0804B6E0 @ =0x0000043c\n" + "\tadds r1, r0\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B6DC: .4byte gMain\n" + "_0804B6E0: .4byte 0x0000043c\n" + "_0804B6E4_case09:\n" + "\tbl sub_804C164\n" + "\tldr r0, _0804B704 @ =gUnknown_0821594C\n" + "\tbl LoadSpriteSheet\n" + "\tldr r0, _0804B708 @ =gUnknown_08215954\n" + "\tbl LoadSpritePalette\n" + "\tldr r1, _0804B70C @ =REG_BG1CNT\n" + "\tldr r2, _0804B710 @ =0x00000502\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tldr r1, _0804B714 @ =gMain\n" + "\tldr r4, _0804B718 @ =0x0000043c\n" + "\tadds r1, r4\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B704: .4byte gUnknown_0821594C\n" + "_0804B708: .4byte gUnknown_08215954\n" + "_0804B70C: .4byte REG_BG1CNT\n" + "_0804B710: .4byte 0x00000502\n" + "_0804B714: .4byte gMain\n" + "_0804B718: .4byte 0x0000043c\n" + "_0804B71C_case10:\n" + "\tldr r0, _0804B754 @ =0x0000043c\n" + "\tadds r1, r2, r0\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "_0804B726_case11:\n" + "\tmovs r0, 0x5\n" + "\tbl sub_804BBE8\n" + "\tmovs r0, 0\n" + "\tbl sub_804BBE8\n" + "\tbl sub_804C1A8\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tmovs r1, 0\n" + "\tstr r1, [sp]\n" + "\tmovs r2, 0x10\n" + "\tmovs r3, 0\n" + "\tbl BeginNormalPaletteFade\n" + "_0804B746:\n" + "\tldr r1, _0804B758 @ =gMain\n" + "\tldr r2, _0804B754 @ =0x0000043c\n" + "\tadds r1, r2\n" + "_0804B74C:\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tb _0804B76E_break\n" + "\t.align 2, 0\n" + "_0804B754: .4byte 0x0000043c\n" + "_0804B758: .4byte gMain\n" + "_0804B75C_case12:\n" + "\tldr r0, _0804B788 @ =gPaletteFade\n" + "\tldrb r1, [r0, 0x7]\n" + "\tmovs r0, 0x80\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbne _0804B76E_break\n" + "\tldr r0, _0804B78C @ =sub_804DB84\n" + "\tbl SetMainCallback2\n" + "_0804B76E_break:\n" + "\tbl RunTasks\n" + "\tbl AnimateSprites\n" + "\tbl BuildOamBuffer\n" + "\tbl UpdatePaletteFade\n" + "\tadd sp, 0x4\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804B788: .4byte gPaletteFade\n" + "_0804B78C: .4byte sub_804DB84"); +} +#endif + +// In-game trade init +void sub_804B790(void) +{ + u8 otName[11]; + switch (gMain.state) + { + case 0: + gUnknown_020297D8[0] = gSpecialVar_0x8005; + gUnknown_020297D8[1] = 6; + StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); + GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); + StringCopy(gLinkPlayers[1].name, otName); + REG_DISPCNT = 0; + ResetTasks(); + gUnknown_03004828 = &ewram_2010000.unk_0f000; + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(sub_804B210); + sub_804B228(); + Text_LoadWindowTemplate(&gWindowTemplate_81E717C); + Text_InitWindowWithTemplate(&gUnknown_03004828->window, &gWindowTemplate_81E717C); + gUnknown_03004828->textWindowBaseTileNum = TextWindow_SetBaseTileNum(2); + TextWindow_LoadStdFrameGraphics(&gUnknown_03004828->window); + Menu_EraseScreen(); + gLinkType = 0x1144; + gUnknown_03004828->isLinkTrade = FALSE; + gUnknown_03004828->unk_00b6 = 0; + gUnknown_03004828->unk_00c4 = 0; + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x40; + gUnknown_03004828->unk_0108 = 0; + gUnknown_03004828->unk_010a = 0; + gUnknown_03004828->unk_010c = 0x78; + gUnknown_03004828->unk_010e = 0x50; + gUnknown_03004828->unk_0118 = 0x100; + gUnknown_03004828->unk_011c = 0; + gUnknown_03004828->unk_00c0 = 0; + gMain.state = 5; + break; + case 5: + sub_804B2D0(0, 0); + gMain.state ++; + break; + case 6: + sub_804B2D0(0, 1); + gMain.state ++; + break; + case 7: + sub_804B2D0(1, 0); + gMain.state ++; + break; + case 8: + sub_804B2D0(1, 1); + gMain.state ++; + break; + case 9: + sub_804C164(); + LoadSpriteSheet(&gUnknown_0821594C); + LoadSpritePalette(&gUnknown_08215954); + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); + gMain.state ++; + break; + case 10: + gMain.state ++; + // fallthrough + case 11: + sub_804BBE8(5); + sub_804BBE8(0); + sub_804C1A8(); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gMain.state ++; + break; + case 12: + if (!gPaletteFade.active) + { + SetMainCallback2(sub_804BBCC); + } + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804BA18(u8 partyIdx) +{ + struct Pokemon *pokemon = &gPlayerParty[partyIdx]; + if (!GetMonData(pokemon, MON_DATA_IS_EGG)) + { + u16 species = SpeciesToNationalPokedexNum(GetMonData(pokemon, MON_DATA_SPECIES, NULL)); + GetSetPokedexFlag(species, 2); + GetSetPokedexFlag(species, 3); + } +} + +static void sub_804BA64(void) +{ + u8 mpId = GetMultiplayerId(); + if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000) + EnableNationalPokedex(); +} + +static void sub_804BA94(u8 a0, u8 a1) +{ + u8 friendship; + struct Pokemon *playerPokemon = &gPlayerParty[a0]; + u16 playerMail = GetMonData(playerPokemon, MON_DATA_MAIL); + + struct Pokemon *friendPokemon = &gEnemyParty[a1]; + u16 friendMail = GetMonData(friendPokemon, MON_DATA_MAIL); + + if (playerMail != 0xff) + ClearMailStruct(&gSaveBlock1.mail[playerMail]); + + // This is where the actual trade happens!! + gUnknown_03004828->pokemon = *playerPokemon; + *playerPokemon = *friendPokemon; + *friendPokemon = gUnknown_03004828->pokemon; + + friendship = 70; + if (!GetMonData(playerPokemon, MON_DATA_IS_EGG)) + SetMonData(playerPokemon, MON_DATA_FRIENDSHIP, &friendship); + + if (friendMail != 0xff) + GiveMailToMon2(playerPokemon, &gUnknown_02029700[friendMail]); + + sub_804BA18(a0); + if (gReceivedRemoteLinkPlayers) + sub_804BA64(); +} + +static void sub_804BB78(void) +{ + switch (gUnknown_03004828->unk_00bd) + { + case 1: + if (IsLinkTaskFinished()) + { + Trade_SendData(gUnknown_03004828); + gUnknown_03004828->unk_00bd ++; + } + // fallthrough + case 2: + gUnknown_03004828->unk_00bd = 0; + break; + } +} + +static void sub_804BBCC(void) +{ + sub_804C29C(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804BBE8(u8 a0) +{ + int i; + u16 *buffer; + switch (a0) + { + case 0: + LoadPalette(gUnknown_0820C9F8, 0x10, 0xa0); + DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(1), 0x1300, 0x1000); + DmaCopy16Defvars(3, gUnknown_0820F798, BG_SCREEN_ADDR(18), 0x1000); + gUnknown_03004828->bg2vofs = 0; + gUnknown_03004828->bg2hofs = 0xb4; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256; + break; + case 1: + gUnknown_03004828->bg1hofs = 0; + gUnknown_03004828->bg1vofs = 0x15c; + REG_BG1VOFS = 0x15c; + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512; + + DmaCopy16Defvars(3, gUnknown_08210798, BG_SCREEN_ADDR(5), 0x1000); + DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(0), 0x1300, 0x1000); + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; + break; + case 2: + gUnknown_03004828->bg1vofs = 0; + gUnknown_03004828->bg1hofs = 0; + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; + DmaCopy16Defvars(3, gUnknown_08211798, BG_SCREEN_ADDR(5), 0x800); + break; + case 3: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x40; + gUnknown_03004828->unk_010c = 0x78; + gUnknown_03004828->unk_010e = -0x46; + gUnknown_03004828->unk_011c = 0; + DmaCopyLarge16(3, gUnknown_0820DD98, BG_CHAR_ADDR(1), 0x1a00, 0x1000); + DmaCopy16Defvars(3, gUnknown_08211F98, BG_SCREEN_ADDR(18), 0x100); + break; + case 4: + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18); + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x5c; + gUnknown_03004828->unk_0118 = 0x20; + gUnknown_03004828->unk_011a = 0x400; + gUnknown_03004828->unk_011c = 0; + DmaCopyLarge16(3, gUnknown_08213738, BG_CHAR_ADDR(1), 0x2040, 0x1000); + DmaCopy16Defvars(3, gUnknown_08215778, BG_SCREEN_ADDR(18), 0x100); + break; + case 5: + gUnknown_03004828->bg1vofs = 0; + gUnknown_03004828->bg1hofs = 0; + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5); + LZDecompressVram(gUnknown_08D00000, BG_CHAR_ADDR(0)); + CpuCopy16(gUnknown_08D00524, buffer = (u16 *)gSharedMem, 0x1000); + LoadCompressedPalette(gUnknown_08D004E0, 0x70, 0x20); + FillPalette(0, 0, 2); + for (i = 0; i < 0x280; i ++) + buffer[i] |= 0x7000; + DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500); + Menu_EraseWindowRect(2, 15, 27, 18); + break; + case 6: + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18); + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x5c; + gUnknown_03004828->unk_0118 = 0x100; + gUnknown_03004828->unk_011a = 0x80; + gUnknown_03004828->unk_010c = 0x78; + gUnknown_03004828->unk_010e = 0x50; + gUnknown_03004828->unk_011c = 0; + DmaCopyLarge16(3, gUnknown_08213738, BG_CHAR_ADDR(1), 0x2040, 0x1000); + DmaCopy16Defvars(3, gUnknown_08215778, BG_SCREEN_ADDR(18), 0x100); + break; + case 7: + gUnknown_03004828->bg2vofs = 0; + gUnknown_03004828->bg2hofs = 0; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256; + LoadPalette(gUnknown_0820C9F8, 0x10, 0xa0); + DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(1), 0x1300, 0x1000); + DmaCopy16Defvars(3, gUnknown_0820F798, BG_SCREEN_ADDR(18), 0x1000); + break; + } +} + +static void sub_804C0F8(u8 a0) +{ + if (a0 == 0) + { + if (gUnknown_03004828->bg1vofs < 0x10a) + { + gUnknown_03004828->unk_010e ++; + gUnknown_03004828->unk_011c += 64; + } + } + else + { + if (gUnknown_03004828->unk_010e > -0x40) + { + gUnknown_03004828->unk_010e --; + gUnknown_03004828->unk_011c += 64; + } + } +} + +static void sub_804C164(void) +{ + LoadSpriteSheet(&gUnknown_082159A4); + LoadSpriteSheet(&gUnknown_082159F4); + LoadSpriteSheet(&gUnknown_08215A28); + LoadSpriteSheet(&gUnknown_08215A78); + LoadSpritePalette(&gUnknown_082159AC); + LoadSpritePalette(&gUnknown_082159B4); +} + +static void sub_804C1A8(void) +{ + u8 mpId; + u8 string[20]; + const struct InGameTrade *ingameTrade; + if (gUnknown_03004828->isLinkTrade) + { + mpId = GetMultiplayerId(); + StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); + GetMonData(&gEnemyParty[gUnknown_020297D8[1] % 6], MON_DATA_NICKNAME, string); + StringCopy10(gStringVar3, string); + GetMonData(&gPlayerParty[gUnknown_020297D8[0]], MON_DATA_NICKNAME, string); + StringCopy10(gStringVar2, string); + } + else + { + ingameTrade = &gIngameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, ingameTrade->otName); + StringCopy10(gStringVar3, ingameTrade->name); + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, string); + StringCopy10(gStringVar2, string); + } +} + +static bool8 sub_804C29C(void) +{ + u16 evoTarget; + + switch (gUnknown_03004828->unk_00c4) + { + case 0: + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x = -0xb4; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[gUnknown_03004828->tradeSpecies[0]].y_offset; + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_0124 = GetCurrentMapMusic(); + PlayBGM(BGM_SHINKA); + break; + case 1: + if (gUnknown_03004828->bg2hofs > 0) + { + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x += 3; + gUnknown_03004828->bg2hofs -= 3; + } + else + { + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x = 0; + gUnknown_03004828->bg2hofs = 0; + gUnknown_03004828->unk_00c4 = 10; + } + break; + + case 10: + StringExpandPlaceholders(gStringVar4, gTradeText_WillBeSent); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gUnknown_03004828->unk_00c4 = 11; + gUnknown_03004828->unk_00c0 = 0; + break; + case 11: + if (++gUnknown_03004828->unk_00c0 == 80) + { + gUnknown_03004828->unk_0102 = sub_8047580(gUnknown_03004828->pokePicSpriteIdxs[0], gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].oam.paletteNum, 0x78, 0x20, 0x2, 0x1, 0x14, 0xfffff); + gUnknown_03004828->unk_00c4 ++; + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + StringExpandPlaceholders(gStringVar4, gTradeText_ByeBye); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + } + break; + case 12: + if (gSprites[gUnknown_03004828->unk_0102].callback == SpriteCallbackDummy && Text_UpdateWindow(&gUnknown_03004828->window) == TRUE) + { + gUnknown_03004828->unk_0103 = CreateSprite(&gSpriteTemplate_821595C, 0x78, 0x20, 0); + gSprites[gUnknown_03004828->unk_0103].callback = sub_804D738; + DestroySprite(&gSprites[gUnknown_03004828->unk_0102]); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 13: + // The game waits here for the sprite to finish its animation sequence. + break; + case 14: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004828->unk_00c4 = 20; + break; + + case 20: + if (!gPaletteFade.active) + { + sub_804BBE8(4); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 21: + BeginNormalPaletteFade(-1, -1, 16, 0, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 22: + if (!gPaletteFade.active) + { + gUnknown_03004828->unk_00c4 = 23; + } + break; + case 23: + if (gUnknown_03004828->unk_011a > 0x100) + { + gUnknown_03004828->unk_011a -= 0x34; + } + else + { + sub_804BBE8(1); + gUnknown_03004828->unk_011a = 0x80; + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_00c0 = 0; + } + gUnknown_03004828->unk_0118 = 0x8000 / gUnknown_03004828->unk_011a; + break; + case 24: + if (++ gUnknown_03004828->unk_00c0 > 20) + { + sub_804BBE8(3); + sub_804B128(); + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_8215A80, 0x78, 0x50, 0); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 25: + if (gSprites[gUnknown_03004828->unk_00bb].animEnded) + { + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + REG_BLDCNT = 0x640; + REG_BLDALPHA = 0x40C; + gUnknown_03004828->unk_00c4 ++; + } + break; + case 26: + if (-- gUnknown_03004828->bg1vofs == 0x13C) + { + gUnknown_03004828->unk_00c4 ++; + } + if (gUnknown_03004828->bg1vofs == 0x148) + { + gUnknown_03004828->unk_00bc = CreateSprite(&gSpriteTemplate_8215A30, 0x80, 0x41, 0); + } + break; + case 27: + gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159BC, 0x80, 0x50, 3); + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x80, 0x50, 0); + StartSpriteAnim(&gSprites[gUnknown_03004828->unk_00bb], 1); + gUnknown_03004828->unk_00c4 ++; + break; + case 28: + if ((gUnknown_03004828->bg1vofs -= 2) == 0xA6) + { + gUnknown_03004828->unk_00c4 = 200; + } + sub_804C0F8(0); + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + break; + case 200: + gSprites[gUnknown_03004828->unk_00ba].pos1.y -= 2; + gSprites[gUnknown_03004828->unk_00bb].pos1.y -= 2; + sub_804C0F8(0); + if (gSprites[gUnknown_03004828->unk_00ba].pos1.y < -8) + { + gUnknown_03004828->unk_00c4 = 29; + } + break; + case 29: + BeginNormalPaletteFade(-1, -1, 0, 16, 0); + gUnknown_03004828->unk_00c4 = 30; + break; + case 30: + if (!gPaletteFade.active) + { + DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + sub_804BBE8(2); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 31: + BeginNormalPaletteFade(-1, -1, 16, 0, 0); + gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159FC, 0x6f, 0xaa, 0); + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x81, -0xa, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 32: + if (!gPaletteFade.active) + { + PlaySE(SE_TK_WARPOUT); + gUnknown_03004828->unk_00c4 ++; + } + gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; + gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; + break; + case 33: + gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; + gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; + if (gSprites[gUnknown_03004828->unk_00ba].pos2.y <= -0x5a) + { + gSprites[gUnknown_03004828->unk_00ba].data[1] = 1; + gSprites[gUnknown_03004828->unk_00bb].data[1] = 1; + gUnknown_03004828->unk_00c4 ++; + } + break; + case 34: + BlendPalettes(1, 16, 0xffff); + gUnknown_03004828->unk_00c4 ++; + break; + case 35: + BlendPalettes(1, 0, 0xffff); + gUnknown_03004828->unk_00c4 ++; + break; + case 36: + BlendPalettes(1, 16, 0xffff); + gUnknown_03004828->unk_00c4 ++; + break; + case 37: + if (!IsPokeSpriteNotFlipped(gUnknown_03004828->tradeSpecies[0])) + { + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].affineAnims = gSpriteAffineAnimTable_8215AC0; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0, 3, 3); + StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0); + } + else + { + StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0); + } + StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]], 0); + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos1.x = 0x3c; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.x = 0xb4; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos1.y = 0xc0; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.y = -0x20; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].invisible = FALSE; + gUnknown_03004828->unk_00c4 ++; + break; + case 38: + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y -= 3; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.y += 3; + if (-0xa0 > gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y && gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y >= -0xa3) + { + PlaySE(SE_TK_WARPIN); + } + if (gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y < -0xde) + { + gSprites[gUnknown_03004828->unk_00ba].data[1] = 0; + gSprites[gUnknown_03004828->unk_00bb].data[1] = 0; + gUnknown_03004828->unk_00c4 ++; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = TRUE; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].invisible = TRUE; + BlendPalettes(1, 0, 0xffff); + } + break; + case 39: + gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; + gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; + if (gSprites[gUnknown_03004828->unk_00ba].pos2.y <= -0xde) + { + BeginNormalPaletteFade(-1, -1, 0, 16, 0); + gUnknown_03004828->unk_00c4 ++; + DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + } + break; + case 40: + if (!gPaletteFade.active) + { + gUnknown_03004828->unk_00c4 ++; + sub_804BBE8(1); + gUnknown_03004828->bg1vofs = 0xa6; + gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159BC, 0x80, -0x14, 3); + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x80, -0x14, 0); + StartSpriteAnim(&gSprites[gUnknown_03004828->unk_00bb], 1); + } + break; + case 41: + BeginNormalPaletteFade(-1, -1, 16, 0, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 42: + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + sub_804C0F8(1); + if (!gPaletteFade.active) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 43: + sub_804C0F8(1); + gSprites[gUnknown_03004828->unk_00ba].pos2.y += 3; + gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; + if (gSprites[gUnknown_03004828->unk_00ba].pos2.y + gSprites[gUnknown_03004828->unk_00ba].pos1.y == 64) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 44: + sub_804C0F8(1); + if ((gUnknown_03004828->bg1vofs += 2) > 0x13c) + { + gUnknown_03004828->bg1vofs = 0x13c; + gUnknown_03004828->unk_00c4 ++; + } + break; + case 45: + DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 46: + if (++ gUnknown_03004828->unk_00c0 == 10) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 47: + if (++ gUnknown_03004828->bg1vofs > 0x15c) + { + gUnknown_03004828->bg1vofs = 0x15c; + gUnknown_03004828->unk_00c4 ++; + } + if (gUnknown_03004828->bg1vofs == 0x148) + gUnknown_03004828->unk_00bc = CreateSprite(&gSpriteTemplate_8215A30, 0x80, 0x41, 0); + gSprites[gUnknown_03004828->unk_00bc].callback = sub_804B0E0; + break; + case 48: + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_8215A80, 0x78, 0x50, 0); + gUnknown_03004828->unk_00c4 = 50; + break; + + case 50: + if (gSprites[gUnknown_03004828->unk_00bb].animEnded) + { + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + sub_804BBE8(6); + gUnknown_03004828->unk_00c4 ++; + PlaySE(SE_W028); + } + break; + case 51: + if (gUnknown_03004828->unk_011a < 0x400) + { + gUnknown_03004828->unk_011a += 0x34; + } + else + { + gUnknown_03004828->unk_011a = 0x400; + gUnknown_03004828->unk_00c4 ++; + } + gUnknown_03004828->unk_0118 = 0x8000 / gUnknown_03004828->unk_011a; + break; + case 52: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004828->unk_00c4 = 60; + break; + + case 60: + if (!gPaletteFade.active) + { + sub_804BBE8(5); + sub_804BBE8(7); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 61: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 62: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + if (!gPaletteFade.active) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 63: + gUnknown_03004828->unk_0103 = CreateSprite(&gSpriteTemplate_821595C, 0x78, -0x8, 0); + gSprites[gUnknown_03004828->unk_0103].data[3] = 0x4a; + gSprites[gUnknown_03004828->unk_0103].callback = sub_804D80C; + StartSpriteAnim(&gSprites[gUnknown_03004828->unk_0103], 1); + StartSpriteAffineAnim(&gSprites[gUnknown_03004828->unk_0103], 2); + BlendPalettes(1 << (16 + gSprites[gUnknown_03004828->unk_0103].oam.paletteNum), 16, 0xffff); + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 64: + BeginNormalPaletteFade(1 << (16 + gSprites[gUnknown_03004828->unk_0103].oam.paletteNum), 1, 16, 0, 0xffff); + gUnknown_03004828->unk_00c4 ++; + break; + case 65: + if (gSprites[gUnknown_03004828->unk_0103].callback == SpriteCallbackDummy) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 66: + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.x = 0x78; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[gUnknown_03004828->tradeSpecies[1]].y_offset + 60; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.x = 0; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.y = 0; + CreatePokeballSprite(gUnknown_03004828->pokePicSpriteIdxs[1], gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].oam.paletteNum, 0x78, 0x54, 2, 1, 0x14, 0xfffff); + FreeSpriteOamMatrix(&gSprites[gUnknown_03004828->unk_0103]); + DestroySprite(&gSprites[gUnknown_03004828->unk_0103]); + gUnknown_03004828->unk_00c4 ++; + break; + case 67: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + StringExpandPlaceholders(gStringVar4, gTradeText_SentOverPoke); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 68: + if (++ gUnknown_03004828->unk_00c0 == 4) + { + PlayFanfare(BGM_FANFA5); + } + if (gUnknown_03004828->unk_00c0 == 0xf0) + { + gUnknown_03004828->unk_00c4 ++; + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + StringExpandPlaceholders(gStringVar4, gTradeText_TakeGoodCare); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gUnknown_03004828->unk_00c0 = 0; + } + break; + case 69: // OneHand + if (++ gUnknown_03004828->unk_00c0 == 60) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 70: + sub_804E1DC(); + gUnknown_03004828->unk_00c4 ++; + break; + case 71: + if (gUnknown_03004828->isLinkTrade) + { + return TRUE; + } + else if (gMain.newKeys & A_BUTTON) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 72: // Only if in-game trade + sub_804BA94(gSpecialVar_0x8005, 0); + gCB2_AfterEvolution = sub_804BBCC; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_020297D8[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + TradeEvolutionScene(&gPlayerParty[gUnknown_020297D8[0]], evoTarget, gUnknown_03004828->pokePicSpriteIdxs[1], gUnknown_020297D8[0]); + gUnknown_03004828->unk_00c4 ++; + break; + case 73: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 74: + if (!gPaletteFade.active) + { + PlayBGM(gUnknown_03004828->unk_0124); + SetMainCallback2(c2_exit_to_overworld_2_switch); + sub_804D8E4(); + } + break; + } + return FALSE; +} + +static void sub_804D588(void) +{ + u16 evoTarget; + switch (gMain.state) + { + case 0: + gMain.state = 4; + gSoftResetDisabled = TRUE; + break; + case 4: + gCB2_AfterEvolution = sub_804DC88; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_020297D8[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + TradeEvolutionScene(&gPlayerParty[gUnknown_020297D8[0]], evoTarget, gUnknown_03004828->pokePicSpriteIdxs[1], gUnknown_020297D8[0]); + else + SetMainCallback2(sub_804DC88); + gUnknown_020297D8[0] = 255; + break; + } + if (!HasLinkErrorOccurred()) + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804D63C(void) +{ + u8 blockReceivedStatus; + sub_804B2B0(); + blockReceivedStatus = GetBlockReceivedStatus(); + if (blockReceivedStatus & 0x01) + { + if (gBlockRecvBuffer[0][0] == 0xdcba) + { + SetMainCallback2(sub_804D588); + } + if (gBlockRecvBuffer[0][0] == 0xabcd) + { + gUnknown_03004828->unk_009c = 1; + } + ResetBlockReceivedFlag(0); + } + if (blockReceivedStatus & 0x02) + { + if (gBlockRecvBuffer[1][0] == 0xabcd) + { + gUnknown_03004828->unk_009d = 1; + } + ResetBlockReceivedFlag(1); + } +} + +static void sub_804D6BC(struct Sprite *sprite) +{ + sprite->pos1.y += sprite->data[0] / 10; + sprite->data[5] += sprite->data[1]; + sprite->pos1.x = sprite->data[5] / 10; + if (sprite->pos1.y > 0x4c) + { + sprite->pos1.y = 0x4c; + sprite->data[0] = -(sprite->data[0] * sprite->data[2]) / 100; + sprite->data[3] ++; + } + if (sprite->pos1.x == 0x78) + sprite->data[1] = 0; + sprite->data[0] += sprite->data[4]; + if (sprite->data[3] == 4) + { + sprite->data[7] = 1; + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_804D738(struct Sprite *sprite) +{ + sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]]; + if (sprite->data[0] == 22) + PlaySE(SE_KON); + if (++ sprite->data[0] == 44) + { + PlaySE(SE_W025); + sprite->callback = sub_804D7AC; + sprite->data[0] = 0; + BeginNormalPaletteFade(1 << (16 + sprite->oam.paletteNum), -1, 0, 16, -1); + } +} + +static void sub_804D7AC(struct Sprite *sprite) +{ + if (sprite->data[1] == 20) + StartSpriteAffineAnim(sprite, 1); + if (++ sprite->data[1] > 20) + { + sprite->pos2.y -= gTradeBallVerticalVelocityTable[sprite->data[0]]; + if (++ sprite->data[0] == 23) + { + DestroySprite(sprite); + gUnknown_03004828->unk_00c4 = 14; // Resume the master trade animation + } + } +} + +static void sub_804D80C(struct Sprite *sprite) +{ + if (sprite->data[2] == 0) + { + if ((sprite->pos1.y += 4) > sprite->data[3]) + { + sprite->data[2] ++; + sprite->data[0] = 0x16; + PlaySE(SE_KON); + } + } + else + { + if (sprite->data[0] == 0x42) + PlaySE(SE_KON2); + if (sprite->data[0] == 0x5c) + PlaySE(SE_KON3); + if (sprite->data[0] == 0x6b) + PlaySE(SE_KON4); + sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]]; + if (++sprite->data[0] == 0x6c) + sprite->callback = SpriteCallbackDummy; + } +} + +u16 GetInGameTradeSpeciesInfo(void) +{ + const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, gSpeciesNames[inGameTrade->playerSpecies]); + StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); + return inGameTrade->playerSpecies; +} + +static void sub_804D8E4(void) +{ + u8 nickname[32]; + const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar1, nickname); + StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); +} + +static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade) +{ + const struct InGameTrade *inGameTrade = &gIngameTrades[whichInGameTrade]; + u8 level = GetMonData(&gPlayerParty[whichPlayerMon], MON_DATA_LEVEL); + + struct MailStruct mail; + u8 metLocation = 0xFE; + u8 isMail; + struct Pokemon *pokemon = &gEnemyParty[0]; + + CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); + + SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); + SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); + SetMonData(pokemon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]); + SetMonData(pokemon, MON_DATA_SPEED_IV, &inGameTrade->ivs[3]); + SetMonData(pokemon, MON_DATA_SPATK_IV, &inGameTrade->ivs[4]); + SetMonData(pokemon, MON_DATA_SPDEF_IV, &inGameTrade->ivs[5]); + SetMonData(pokemon, MON_DATA_NICKNAME, inGameTrade->name); + SetMonData(pokemon, MON_DATA_OT_NAME, inGameTrade->otName); + SetMonData(pokemon, MON_DATA_OT_GENDER, &inGameTrade->otGender); + SetMonData(pokemon, MON_DATA_ALT_ABILITY, &inGameTrade->secondAbility); + SetMonData(pokemon, MON_DATA_BEAUTY, &inGameTrade->stats[1]); + SetMonData(pokemon, MON_DATA_CUTE, &inGameTrade->stats[2]); + SetMonData(pokemon, MON_DATA_COOL, &inGameTrade->stats[0]); + SetMonData(pokemon, MON_DATA_SMART, &inGameTrade->stats[3]); + SetMonData(pokemon, MON_DATA_TOUGH, &inGameTrade->stats[4]); + SetMonData(pokemon, MON_DATA_SHEEN, &inGameTrade->sheen); + SetMonData(pokemon, MON_DATA_MET_LOCATION, &metLocation); + + isMail = FALSE; + if (inGameTrade->heldItem != ITEM_NONE) + { + if (ItemIsMail(inGameTrade->heldItem)) + { + sub_804DAD4(&mail, inGameTrade); + gUnknown_02029700[0] = mail; + SetMonData(pokemon, MON_DATA_MAIL, &isMail); + SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); + } + else + { + SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); + } + } + CalculateMonStats(&gEnemyParty[0]); +} + +static void sub_804DAD4(struct MailStruct *mail, const struct InGameTrade *trade) { + s32 i; + + for (i = 0; i < 9; i++) + { + mail->words[i] = gIngameTradeMail[trade->mailNum][i]; + } + + StringCopy(mail->playerName, trade->otName); + +#if GERMAN + PadNameString(mail->playerName, CHAR_SPACE); +#endif + + mail->trainerId[0] = trade->otId >> 24; + mail->trainerId[1] = trade->otId >> 16; + mail->trainerId[2] = trade->otId >> 8; + mail->trainerId[3] = trade->otId; + mail->species = trade->species; + mail->itemId = trade->heldItem; +} + +u16 GetTradeSpecies(void) +{ + if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG)) + return SPECIES_NONE; + return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES); +} + +void CreateInGameTradePokemon(void) +{ + _CreateInGameTradePokemon(gSpecialVar_0x8005, gSpecialVar_0x8004); +} + +#ifdef NONMATCHING +static +#endif +void sub_804DB84(void) +{ + if (sub_804C29C() == TRUE) + { + DestroySprite(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]]); + FreeSpriteOamMatrix(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]]); + sub_804BA94(gUnknown_020297D8[0], gUnknown_020297D8[1] % 6); + gUnknown_03004828->linkData[0] = 0xabcd; + gUnknown_03004828->unk_00bd = 1; + SetMainCallback2(sub_804DC18); + } + sub_804BB78(); + sub_804D63C(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804DC18(void) +{ + u8 mpId = sub_804B2B0(); + sub_804D63C(); + if (mpId == 0 && gUnknown_03004828->unk_009c == 1 && gUnknown_03004828->unk_009d == 1) + { + gUnknown_03004828->linkData[0] = 0xdcba; + Trade_SendData(gUnknown_03004828); + gUnknown_03004828->unk_009c = 2; + gUnknown_03004828->unk_009d = 2; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804DC88(void) +{ + switch (gMain.state) + { + case 0: + gUnknown_03004828 = &ewram_2010000.unk_0f000; + gMain.state ++; + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + StringExpandPlaceholders(gStringVar4, gOtherText_LinkStandby2); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + break; + case 1: + sub_80084A4(); + gMain.state = 100; + gUnknown_03004828->unk_00c0 = 0; + break; + case 100: + if (++ gUnknown_03004828->unk_00c0 > 180) + { + gMain.state = 101; + gUnknown_03004828->unk_00c0 = 0; + } + if (IsLinkTaskFinished()) + { + gMain.state = 2; + } + break; + case 101: + if (IsLinkTaskFinished()) + { + gMain.state = 2; + } + break; + case 2: + gMain.state = 50; + Text_EraseWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + Text_InitWindowAndPrintText(&gUnknown_03004828->window, gSystemText_Saving, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + break; + case 50: + SetSecretBase2Field_9_AndHideBG(); + IncrementGameStat(GAME_STAT_POKEMON_TRADES); + sub_8125D80(); + gMain.state ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 51: + if (++ gUnknown_03004828->unk_00c0 == 5) + { + gMain.state ++; + } + break; + case 52: + if (sub_8125DA8()) + { + ClearSecretBase2Field_9_2(); + gMain.state = 4; + } + else + { + gUnknown_03004828->unk_00c0 = 0; + gMain.state = 51; + } + break; + case 4: + sub_8125DDC(); + gMain.state = 40; + gUnknown_03004828->unk_00c0 = 0; + break; + case 40: + if (++ gUnknown_03004828->unk_00c0 > 50) + { + gUnknown_03004828->unk_00c0 = 0; + gMain.state = 41; + } + break; + case 41: + sub_80084A4(); + gMain.state = 42; + break; + case 42: + if (IsLinkTaskFinished()) + { + sub_8125E04(); + gSoftResetDisabled = FALSE; + gMain.state = 5; + } + break; + case 5: + if (++ gUnknown_03004828->unk_00c0 > 60) + { + gMain.state ++; + sub_80084A4(); + } + break; + case 6: + if (IsLinkTaskFinished()) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gMain.state ++; + } + break; + case 7: + if (!gPaletteFade.active) + { + FadeOutBGM(3); + gMain.state ++; + } + break; + case 8: + if (IsBGMStopped() == TRUE) + { + sub_800832C(); + gMain.state ++; + } + break; + case 9: + if (!gReceivedRemoteLinkPlayers) + { + SetMainCallback2(sub_804E144); + } + break; + } + if (!HasLinkErrorOccurred()) + { + RunTasks(); + } + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804E144(void) +{ + if (!gPaletteFade.active) + SetMainCallback2((sub_8047CD8)); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void DoInGameTradeScene(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_804E1A0, 10); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); +} + +static void sub_804E1A0(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sub_804B790); + gFieldCallback = sub_8080990; + DestroyTask(taskId); + } +} + +static void sub_804E1DC(void) +{ + u8 i; + u8 numRibbons = 0; + for (i = 0; i < 12; i ++) + { + numRibbons += GetMonData(&gEnemyParty[gUnknown_020297D8[1] % 6], MON_DATA_CHAMPION_RIBBON + i); + } + if (numRibbons != 0) + FlagSet(FLAG_SYS_RIBBON_GET); +} + +void sub_804E22C(void) +{ + LZDecompressVram(gUnknown_08D00000, (void *)VRAM); + CpuCopy16(gUnknown_08D00524, gSharedMem, 0x1000); + DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500); + LoadCompressedPalette(gUnknown_08D004E0, 0, 32); + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); +} diff --git a/src/trader.c b/src/trader.c new file mode 100644 index 000000000..885557d5a --- /dev/null +++ b/src/trader.c @@ -0,0 +1,263 @@ +#include "global.h" +#include "constants/decorations.h" +#include "decoration.h" +#include "decoration_inventory.h" +#include "event_data.h" +#include "main.h" +#include "mauville_man.h" +#include "menu.h" +#include "menu_helpers.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" + +extern u16 gSpecialVar_0x8004; +extern u16 gSpecialVar_0x8005; +extern u16 gSpecialVar_0x8006; + +static const u8 * const gUnknown_083F62D8[] = +{ + SecretBaseText_Tristan, + SecretBaseText_Philip, + SecretBaseText_Dennis, + SecretBaseText_Roberto, +}; + +static const u8 gTraderDecorations[] = +{ + DECOR_DUSKULL_DOLL, + DECOR_BALL_CUSHION, + DECOR_TIRE, + DECOR_PRETTY_FLOWERS, +}; + +void sub_810993C(void) +{ + u8 i, j; + u8 buffer[12]; + struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; + + for (i = 0; i < 3; i++) + { + for (j = i + 1; j < 4; j++) + { + if (trader->unk1[i] == 0) + { + u8 temp = trader->unk1[i]; + trader->unk1[i] = trader->unk1[j]; + trader->unk1[j] = temp; + StringCopy(buffer, trader->unk5[i]); + StringCopy(trader->unk5[i], trader->unk5[j]); + StringCopy(trader->unk5[j], buffer); + } + } + } +} + +void TraderSetup(void) +{ + u8 i; + struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; + + trader->id = MAUVILLE_MAN_TRADER; + trader->alreadyTraded = FALSE; + + for (i = 0; i < 4; i++) + { + StringCopy(trader->unk5[i], gUnknown_083F62D8[i]); + trader->unk1[i] = gTraderDecorations[i]; + } + + sub_810993C(); +} + +void sub_8109A20(void) +{ + struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; + trader->alreadyTraded = FALSE; +} + +void sub_8109A30(u8 value) +{ + VarSet(VAR_RECYCLE_GOODS, value); +} + +void CreateAvailableDecorationsMenu(u8 taskId) +{ + u8 i; + u8 numChoices = 1; + u8 numDecorations = 0; + struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; + + for (i = 0; i < 4; i++) + { + if (trader->unk1[i]) + { + numChoices++; + } + } + + Menu_DrawStdWindowFrame(0, 1, 12, numChoices * 2 + 2); + + for (i = 0; i < 4; i++) + { + if (trader->unk1[i]) + { + if (trader->unk1[i] > DECOR_REGISTEEL_DOLL) + { + Menu_PrintText(gOtherText_FiveQuestions, 1, numDecorations * 2 + 2); + } + else + { + Menu_PrintText(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2); + } + + numDecorations++; + } + } + + Menu_PrintText(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2); + InitMenu(0, 1, 2, numChoices, 0, 11); + gTasks[taskId].data[1] = numDecorations; +} + +void sub_8109B34(u8 taskId, u8 decorationId) +{ + if (decorationId > DECOR_REGISTEEL_DOLL) + { + gSpecialVar_0x8004 = 0xFFFF; + } + else + { + gSpecialVar_0x8004 = decorationId; + } + + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 1, 12, 12); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void Task_HandleGetDecorationMenuInput(u8 taskId) +{ + struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; + + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gSpecialVar_0x8005 = Menu_GetCursorPos(); + if (gTasks[taskId].data[1] == gSpecialVar_0x8005) + { + sub_8109B34(taskId, 0); + } + else + { + StringCopy(gStringVar1, trader->unk5[gSpecialVar_0x8005]); + sub_8109B34(taskId, trader->unk1[gSpecialVar_0x8005]); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8109B34(taskId, 0); + } +} + +void ScrSpecial_GetTraderTradedFlag(void) +{ + struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; + gSpecialVar_Result = trader->alreadyTraded; +} + +void ScrSpecial_DoesPlayerHaveNoDecorations(void) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (sub_8134194(i)) + { + gSpecialVar_Result = FALSE; + return; + } + } + gSpecialVar_Result = TRUE; +} + +void ScrSpecial_IsDecorationFull(void) +{ + gSpecialVar_Result = FALSE; + if (gDecorations[gSpecialVar_0x8004].category != gDecorations[gSpecialVar_0x8006].category + && sub_8133F9C(gDecorations[gSpecialVar_0x8004].category) == -1) + { + sub_80FE7D4(gStringVar2, gDecorations[gSpecialVar_0x8004].category); + gSpecialVar_Result = TRUE; + } +} + +void ScrSpecial_TraderMenuGiveDecoration(void) +{ + CreateTask(sub_80FE7A8, 0); +} + +void sub_8109D04(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + sub_80F9520(gUnknown_020388F7, 8); + BuyMenuFreeMemory(); + if (sub_80FEFA4() == TRUE) + { + gSpecialVar_0x8006 = gUnknown_020388D0[gUnknown_020388F5]; + StringCopy(gStringVar3, gDecorations[gSpecialVar_0x8004].name); + StringCopy(gStringVar2, gDecorations[gSpecialVar_0x8006].name); + } + else + { + gSpecialVar_0x8006 = 0xFFFF; + } + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void sub_8109DAC(u8 taskId) +{ + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + gSpecialVar_0x8006 = 0; + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void ScrSpecial_TraderDoDecorationTrade(void) +{ + struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader; + + sub_81340A8(gSpecialVar_0x8006); + IsThereStorageSpaceForDecoration(gSpecialVar_0x8004); + StringCopy(trader->unk5[gSpecialVar_0x8005], gSaveBlock2.playerName); + trader->unk1[gSpecialVar_0x8005] = gSpecialVar_0x8006; + sub_810993C(); + trader->alreadyTraded = TRUE; +} + +void ScrSpecial_TraderMenuGetDecoration(void) +{ + u8 taskId = CreateTask(Task_HandleGetDecorationMenuInput, 0); + CreateAvailableDecorationsMenu(taskId); +} diff --git a/src/trainer_card.c b/src/trainer_card.c new file mode 100644 index 000000000..8d16aa9bf --- /dev/null +++ b/src/trainer_card.c @@ -0,0 +1,1617 @@ +#include "global.h" +#include "trainer_card.h" +#include "easy_chat.h" +#include "event_data.h" +#include "field_effect.h" +#include "graphics.h" +#include "link.h" +#include "m4a.h" +#include "main.h" +#include "menu.h" +#include "money.h" +#include "palette.h" +#include "pokedex.h" +#include "overworld.h" +#include "script_pokemon_80C4.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings2.h" +#include "task.h" +#include "scanline_effect.h" +#include "util.h" +#include "ewram.h" + +typedef void (*Callback)(void); + +struct Struct2000000 +{ + /*0x00*/ u8 current_state; + /*0x01*/ bool8 isShowingLinkCard; + /*0x02*/ u8 starCount; + /*0x03*/ bool8 backSideShown; + /*0x04*/ u8 var_4; + /*0x05*/ bool8 showColon; + /*0x06*/ u8 frameCounter; /* Used to flash colon */ + /*0x07*/ bool8 showPokedexCount; + /*0x08*/ bool8 showHallOfFame; + /*0x09*/ bool8 showLinkBattleStatus; + /*0x0A*/ bool8 showBattleTowerStatus; + /*0x0B*/ bool8 showContestRecord; + /*0x0C*/ bool8 showMixingRecord; + /*0x0D*/ bool8 showTradingRecord; + /*0x0E*/ bool8 ownedBadges[8]; + /*0x16*/ u8 filler_16[10]; + /*0x20*/ u8 easyChatPhrase[4][0x10]; + /*0x60*/ Callback *var_60; + /*0x64*/ struct TrainerCard displayedCard; + /*0x9C*/ u8 language; // 0x9C +}; + +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; + +EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; + +extern const u16 gUnknown_083B5F0C[]; +extern const u16 gBadgesPalette[]; +extern const u16 gUnknown_083B5F4C[]; +extern const u16 gUnknown_083B5F6C[]; +extern const u16 gTrainerCardBadgesMap[][4]; + +const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp"); +// XXX: what is this? +u8 *const ewram_ = gSharedMem; + +#if DEBUG +const struct TrainerCard sTestTrainerCard = +{ + .gender = FEMALE, + .stars = 4, + .hasPokedex = TRUE, + .var_3 = TRUE, + .var_4 = TRUE, + .firstHallOfFameA = 999, + .firstHallOfFameB = 99, + .firstHallOfFameC = 99, + .pokedexSeen = 411, + .trainerId = 12345, + .playTimeHours = 99, + .playTimeMinutes = 99, + .linkBattleWins = 9999, + .linkBattleLosses = 9999, + .battleTowerWins = 9999, + .battleTowerLosses = 9999, + .contestsWithFriends = 999, + .pokeblocksWithFriends = 0xFFFF, + .pokemonTrades = 0xFFFF, + .money = 99999, + .var_28 = {1, 2, 3, 4}, + .playerName = _("てすと"), // "test" +}; +#endif + +bool8 TrainerCard_Init(struct Task *); +bool8 TrainerCard_WaitForFadeInToFinish(struct Task *); +bool8 TrainerCard_WaitForKeys(struct Task *); +bool8 TrainerCard_StartFlipAntimation(struct Task *); +bool8 TrainerCard_WaitForFlipToFinish(struct Task *); +bool8 TrainerCard_FadeOut(struct Task *); +bool8 TrainerCard_WaitForFadeOutToFinishAndQuit(struct Task *); + +bool8 (*const TrainerCard_StateMachine[])(struct Task *) = +{ + TrainerCard_Init, + TrainerCard_WaitForFadeInToFinish, + TrainerCard_WaitForKeys, + TrainerCard_StartFlipAntimation, + TrainerCard_WaitForFlipToFinish, + TrainerCard_FadeOut, + TrainerCard_WaitForFadeOutToFinishAndQuit, +}; + +bool8 TrainerCard_InitFlipAnimation(struct Task *); +bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *); +bool8 TrainerCard_SwitchToNewSide(struct Task *); +bool8 TrainerCard_ScaleUpFlipAnimation(struct Task *); +bool8 TrainerCard_FinishFlipAnimation(struct Task *); + +bool8 (*const TrainerCard_FlipAnimationStateMachine[])(struct Task *) = +{ + TrainerCard_InitFlipAnimation, + TrainerCard_ScaleDownFlipAnimation, + TrainerCard_SwitchToNewSide, + TrainerCard_ScaleUpFlipAnimation, + TrainerCard_FinishFlipAnimation, +}; + +// FIXME: Other signature than on save_menu_util.h +void FormatPlayTime(u8 *playtime, u16 hours, u16 minutes, s16 colon); +u16 GetPokedexSeenCount(void); + +enum +{ + TD_SHOWING_LINK_CARD, + TD_CARD_INDEX, + TD_CALLBACK, +}; + +static void sub_8093174(void); +static void sub_809323C(void); +static void sub_8093254(void); +static void TrainerCard_InitScreenForPlayer(Callback callBack); +static void TrainerCard_InitScreenForLinkPlayer(u8 arg1, Callback callBack); +void TrainerCard_FillTrainerCardStruct(void); +static void nullsub_60(u8); +static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal); +static u8 TrainerCard_GetStarCount(struct TrainerCard *); +static void sub_8093534(void); +static void sub_8093550(void); +static void sub_8093598(void); +static void sub_80935EC(void); +static void sub_8093610(void); +static void sub_8093688(void); +static void TrainerCard_FillFlags(void); +static void sub_80937A4(void); +static void sub_80937BC(void); +static void sub_80937D8(void); +static void sub_80937F0(void); +static void nullsub_15(void); +static void sub_8093800(void); +static void TrainerCard_CreateStateMachine(void); +static void TrainerCard_RunStateMachine(u8 taskId); +static void TrainerCard_CreatePrintPlayTimeTask(void); +static void TrainerCard_DestoryPlayTimeTask(void); +static void TrainerCard_Front_PrintPlayTime(u8 taskId); +static void TrainerCard_CreateFlipAnimationTask(void); +static u8 TrainerCard_HasFlipAnimationFinished(void); +static void TrainerCard_RunFlipAnimationStateMachine(u8 taskId); +static void TrainerCard_FlipAnimationHBlankCallback(void); +static void TrainerCard_DrawCard(void); +static void TrainerCard_DrawCardFront(void); +static void TrainerCard_DrawCardBack(void); +static void TrainerCard_ResetOffsetRegisters(void); +static void TrainerCard_CopyGraphics(void); +static void TrainerCard_LoadPalettes(void); +static void TrainerCard_LoadTrainerGraphics(void); +static void sub_8093F14(void); +static void sub_8093F48(void); +static void sub_8093F64(void); +static void TrainerCard_LoadTrainerTilemap(void); +static void TrainerCard_DrawStars(void); +static void TrainerCard_DisplayBadges(void); +static void TrainerCard_ClearTrainerGraphics(void); +static void TrainerCard_ClearPokedexLabel(void); +static void TrainerCard_Front_PrintTexts(void); +static void TrainerCard_Back_PrintTexts(void); +static void TrainerCard_Front_PrintTrainerID(void); +static void TrainerCard_Front_PrintMoney(void); +static void TrainerCard_Front_PrintPokedexCount(void); +static void TrainerCard_Front_GetPlayTimeString(u8 *arg1, s16 colon); +static void TrainerCard_PrintEasyChatPhrase(void); +static void TrainerCard_Back_PrintName(void); +static void TrainerCard_Back_PrintHallOfFameTime_Label(void); +static void TrainerCard_Back_PrintHallOfFameTime(void); +static void TrainerCard_Back_PrintLinkBattlesLabel(void); +static void TrainerCard_Back_PrintLinkBattles(void); +static void TrainerCard_Back_PrintBattleTower_Label(void); +static void TrainerCard_Back_PrintBattleTower(void); +static void TrainerCard_Back_PrintLinkContests_Label(void); +static void TrainerCard_Back_PrintLinkContests(void); +static void TrainerCard_Back_PrintLinkPokeblocks_Label(void); +static void TrainerCard_Back_PrintLinkPokeblocks(void); +static void TrainerCard_Back_PrintPokemonTrades_Label(void); +static void TrainerCard_Back_PrintPokemonTrades(void); +void unref_sub_8094588(u16 left, u16 top); + +#if DEBUG +static u8 gDebug_03000748; +#endif + +void TrainerCard_ShowPlayerCard(Callback arg1) +{ +#if DEBUG + gDebug_03000748 = 0; +#endif + TrainerCard_InitScreenForPlayer(arg1); + SetMainCallback2(sub_8093174); + ewram0_2.language = GAME_LANGUAGE; +} + +void TrainerCard_ShowLinkCard(u8 playerIndex, Callback arg2) +{ +#if DEBUG + gDebug_03000748 = 0; +#endif + TrainerCard_InitScreenForLinkPlayer(playerIndex, arg2); + SetMainCallback2(sub_8093174); + ewram0_2.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language; +} + +#if DEBUG +void debug_sub_80A0710(Callback callback) +{ + gDebug_03000748 = TRUE; + TrainerCard_InitScreenForPlayer(callback); + SetMainCallback2(sub_8093174); + ewram0_2.language = GAME_LANGUAGE; +} + +void debug_sub_80A073C(Callback callback) +{ + memcpy(&gTrainerCards[0], &sTestTrainerCard, sizeof(struct TrainerCard)); + gDebug_03000748=TRUE; + TrainerCard_InitScreenForLinkPlayer(0, callback); + SetMainCallback2(sub_8093174); + ewram0_2.language = GAME_LANGUAGE; +} + +void debug_sub_80A0780() +{ + int i; + + for (i = 0; i < 4; i++) + memcpy(&gTrainerCards[i], &sTestTrainerCard, sizeof(struct TrainerCard)); +} +#endif + +static void sub_8093174(void) +{ + switch (gMain.state) + { + case 0: + sub_8093534(); + sub_8093688(); + gMain.state++; + break; + case 1: + sub_8093598(); + gMain.state++; + break; + case 2: + sub_80935EC(); + gMain.state++; + break; + case 3: + sub_8093610(); + sub_80937A4(); + gMain.state++; + break; + case 4: + sub_80937BC(); + gMain.state++; + case 5: + if (MultistepInitMenuWindowContinue()) + gMain.state++; + break; + case 6: + sub_80937F0(); + gMain.state++; + break; + case 7: + sub_80937D8(); + gMain.state++; + break; + case 8: + nullsub_15(); + sub_8093800(); + sub_8093550(); + SetMainCallback2(sub_809323C); + break; + } +} + +static void sub_809323C(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_8093254(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ewram0_2.frameCounter++; + if (ewram0_2.frameCounter >= 60) + { + ewram0_2.frameCounter = 0; + ewram0_2.showColon ^= 1; + } + if (ewram0_2.var_4) + DmaCopy16(3, &gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 0x140); +} + +static void TrainerCard_InitScreenForPlayer(Callback callBack) +{ + u8 taskId = CreateTask(nullsub_60, 0xFF); + struct Task *task = &gTasks[taskId]; + task->data[TD_SHOWING_LINK_CARD] = FALSE; + StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); +} + +static void TrainerCard_InitScreenForLinkPlayer(u8 arg1, Callback callBack) +{ + u8 taskId = CreateTask(nullsub_60, 0xFF); + + struct Task *task = &gTasks[taskId]; + task->data[TD_SHOWING_LINK_CARD] = TRUE; + task->data[TD_CARD_INDEX] = arg1; + StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack); +} + +void TrainerCard_FillTrainerCardStruct(void) +{ + u8 taskId = FindTaskIdByFunc(nullsub_60); + struct Task *task = &gTasks[taskId]; + ewram0_2.isShowingLinkCard = task->data[TD_SHOWING_LINK_CARD]; + + LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&ewram0_2.var_60); + + if (ewram0_2.isShowingLinkCard) + { + ewram0_2.displayedCard = gTrainerCards[task->data[TD_CARD_INDEX]]; + } + else + { + TrainerCard_GenerateCardForPlayer(&ewram0_2.displayedCard); + } +} + +static void nullsub_60(u8 taskid) +{ +} + +void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) +{ + u32 playTime; + bool32 enteredHallOfFame; + bool8 r4; + u8 i; + + trainerCard->gender = gSaveBlock2.playerGender; + trainerCard->playTimeHours = gSaveBlock2.playTimeHours; + trainerCard->playTimeMinutes = gSaveBlock2.playTimeMinutes; + + playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME); + enteredHallOfFame = GetGameStat(GAME_STAT_ENTERED_HOF); + if (!enteredHallOfFame) + { + playTime = 0; + } + trainerCard->firstHallOfFameA = playTime >> 16; + trainerCard->firstHallOfFameB = (playTime >> 8) & 0xFF; + trainerCard->firstHallOfFameC = playTime & 0xFF; + + trainerCard->hasPokedex = FlagGet(FLAG_SYS_POKEDEX_GET); + trainerCard->var_3 = CompletedHoennPokedex(); + trainerCard->pokedexSeen = GetPokedexSeenCount(); + + trainerCard->trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; + + // Link Cable Battles + trainerCard->linkBattleWins = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_WINS, 9999); + trainerCard->linkBattleLosses = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_LOSSES, 9999); + + // Contests w/ Friends + trainerCard->contestsWithFriends = sav12_xor_get_clamped_above(GAME_STAT_WON_LINK_CONTEST, 999); + + // Pokéblocks w/ Friends + trainerCard->pokeblocksWithFriends = sav12_xor_get_clamped_above(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); + + // Pokémon Trades + trainerCard->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF); + + // Battle Tower + trainerCard->battleTowerWins = gSaveBlock2.battleTower.totalBattleTowerWins; + trainerCard->battleTowerLosses = gSaveBlock2.battleTower.bestBattleTowerWinStreak; + if (trainerCard->battleTowerWins > 9999) + { + trainerCard->battleTowerWins = 9999; + } + if (trainerCard->battleTowerLosses > 9999) + { + trainerCard->battleTowerLosses = 9999; + } + + r4 = FALSE; + if (sub_80C4D50() > 4) + { + r4 = TRUE; + } + trainerCard->var_4 = r4; + + trainerCard->money = gSaveBlock1.money; + + for (i = 0; i < 4; i++) + { + trainerCard->var_28[i] = gSaveBlock1.easyChats.unk2B1C[i]; + } + + for (i = 0; i < 8; i++) + { + trainerCard->playerName[i] = gSaveBlock2.playerName[i]; + } + + trainerCard->stars = TrainerCard_GetStarCount(trainerCard); +} + +u8 sub_80934C4(u8 id) +{ + return gTrainerCards[id].stars; +} + +static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal) +{ + u32 value = GetGameStat(index); + + if (value > maxVal) + { + value = maxVal; + } + + return value; +} + +static u8 TrainerCard_GetStarCount(struct TrainerCard *trainerCard) +{ + u8 value = 0; + + if (trainerCard->firstHallOfFameA != 0 || trainerCard->firstHallOfFameB != 0 || trainerCard->firstHallOfFameC != 0) + { + value++; + } + + if (trainerCard->var_3) + { + value++; + } + + if (trainerCard->battleTowerLosses > 49) + { + value++; + } + + if (trainerCard->var_4) + { + value++; + } + + return value; +} + +static void sub_8093534(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +static void sub_8093550(void) +{ + u16 backup; + + SetVBlankCallback(sub_8093254); + + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK | INTR_FLAG_HBLANK; + REG_IME = backup; + + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +void sub_8093598(void) +{ + DmaFill16Large(3, 0, (void *)VRAM, 0x10000, 0x1000); +} + +void sub_80935EC(void) +{ + DmaFill16Defvars(3, 0, (void *)OAM, 0x400); +} + +void sub_8093610(void) +{ + REG_BG0CNT = 0; + REG_BG1CNT = 0; + REG_BG2CNT = 0; + REG_BG3CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(10) | BGCNT_16COLOR | BGCNT_TXT256x256; +} + +static void sub_8093688(void) +{ + u8 i; + + TrainerCard_FillTrainerCardStruct(); + ewram0_2.current_state = 0; + ewram0_2.backSideShown = FALSE; + ewram0_2.var_4 = FALSE; + ewram0_2.starCount = ewram0_2.displayedCard.stars; + ewram0_2.showColon = 0; + ewram0_2.frameCounter = 0; + for (i = 0; i < 4; i++) + EasyChat_GetWordText(ewram0_2.easyChatPhrase[i], ewram0_2.displayedCard.var_28[i]); + TrainerCard_FillFlags(); +} + +static void TrainerCard_FillFlags(void) +{ + ewram0_2.showPokedexCount = 0; + ewram0_2.showHallOfFame = 0; + ewram0_2.showLinkBattleStatus = 0; + ewram0_2.showBattleTowerStatus = 0; + ewram0_2.showContestRecord = 0; + ewram0_2.showMixingRecord = 0; + ewram0_2.showTradingRecord = 0; + memset(ewram0_2.ownedBadges, 0, sizeof(ewram0_2.ownedBadges)); + + if (ewram0_2.displayedCard.hasPokedex) + ewram0_2.showPokedexCount++; + + if (ewram0_2.displayedCard.firstHallOfFameA != 0 + || ewram0_2.displayedCard.firstHallOfFameB != 0 + || ewram0_2.displayedCard.firstHallOfFameC != 0) + ewram0_2.showHallOfFame++; + + if (ewram0_2.displayedCard.linkBattleWins != 0 || ewram0_2.displayedCard.linkBattleLosses != 0) + ewram0_2.showLinkBattleStatus++; + + if (ewram0_2.displayedCard.battleTowerWins != 0 || ewram0_2.displayedCard.battleTowerLosses != 0) + ewram0_2.showBattleTowerStatus++; + + if (ewram0_2.displayedCard.contestsWithFriends != 0) + ewram0_2.showContestRecord++; + + if (ewram0_2.displayedCard.pokeblocksWithFriends != 0) + ewram0_2.showMixingRecord++; + + if (ewram0_2.displayedCard.pokemonTrades != 0) + ewram0_2.showTradingRecord++; + + if (!ewram0_2.isShowingLinkCard) + { + u32 badgeFlag; + int i = 0; + + badgeFlag = FLAG_BADGE01_GET; + while (1) + { + if (FlagGet(badgeFlag)) + ewram0_2.ownedBadges[i]++; + badgeFlag++; + i++; + if (badgeFlag > FLAG_BADGE08_GET) + { + break; + } + } + } + +#if DEBUG + if (gDebug_03000748 != 0) + { + ewram0_2.showHallOfFame = TRUE; + ewram0_2.showLinkBattleStatus = TRUE; + ewram0_2.showBattleTowerStatus = TRUE; + ewram0_2.showContestRecord = TRUE; + ewram0_2.showMixingRecord = TRUE; + ewram0_2.showTradingRecord = TRUE; + memset(ewram0_2.ownedBadges, TRUE, sizeof(ewram0_2.ownedBadges)); + } +#endif +} + +void sub_80937A4() +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); +} + +void sub_80937BC() +{ + Text_LoadWindowTemplate(&gWindowTemplate_TrainerCard_Back_Values); + MultistepInitMenuWindowBegin(&gWindowTemplate_TrainerCard_Back_Values); +} + +static void sub_80937D8() +{ + TrainerCard_ResetOffsetRegisters(); + TrainerCard_CopyGraphics(); + sub_8093F64(); + TrainerCard_DrawCard(); +} + +static void sub_80937F0() +{ + TrainerCard_LoadTrainerGraphics(); +} + +static void nullsub_15(void) +{ +} + +static void sub_8093800() +{ + TrainerCard_CreateStateMachine(); +} + +static void TrainerCard_CreateStateMachine(void) +{ + u8 taskId; + + taskId = CreateTask(TrainerCard_RunStateMachine, 0); + TrainerCard_RunStateMachine(taskId); +} + +static void TrainerCard_RunStateMachine(u8 taskId) +{ + while (TrainerCard_StateMachine[ewram0_2.current_state](&gTasks[taskId]) != 0) + ; +} + +bool8 TrainerCard_Init(struct Task *task) +{ + ewram0_2.showColon = gSaveBlock2.playTimeSeconds & 1; + ewram0_2.frameCounter = gSaveBlock2.playTimeVBlanks; + TrainerCard_CreatePrintPlayTimeTask(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + ewram0_2.current_state++; /* Advance state machine */ + return FALSE; +} + +bool8 TrainerCard_WaitForFadeInToFinish(struct Task *task) +{ + if (!gPaletteFade.active) + ewram0_2.current_state++; /* Advance state machine */ + return FALSE; +} + +bool8 TrainerCard_WaitForKeys(struct Task *task) +{ + if (gMain.newKeys & B_BUTTON) + { + ewram0_2.current_state = 5; /* Jump to fadeout state */ + return TRUE; + } + else if (gMain.newKeys & A_BUTTON) + { + /* It appears that it was previously possible to return the the front side + after viewing the back side. This was probably removed due to being + unintuitive. */ + if (ewram0_2.backSideShown) + { + ewram0_2.current_state = 5; /* Jump to fadeout state */ + } + else + { + ewram0_2.backSideShown ^= 1; /* Switch to back side */ + ewram0_2.current_state = 3; /* Jump to start flip animation state */ + } + return TRUE; + } +#if DEBUG + else if (gDebug_03000748 && gMain.newKeys & R_BUTTON) + { + ewram0_2.starCount++; + ewram0_2.starCount %= 5; + TrainerCard_LoadPalettes(); + if (ewram0_2.backSideShown == 0) + TrainerCard_DrawStars(); + } +#endif + + return FALSE; +} + +bool8 TrainerCard_StartFlipAntimation(struct Task *task) +{ + TrainerCard_CreateFlipAnimationTask(); + PlaySE(SE_CARD); + ewram0_2.current_state++; /* Advance state machine */ + return FALSE; +} + +bool8 TrainerCard_WaitForFlipToFinish(struct Task *task) +{ + if (TrainerCard_HasFlipAnimationFinished()) + ewram0_2.current_state = 2; /* Return to wait for keys state */ + return FALSE; +} + +bool8 TrainerCard_FadeOut(struct Task *task) +{ + TrainerCard_DestoryPlayTimeTask(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + ewram0_2.current_state++; /* Advance state machine */ + return FALSE; +} + +bool8 TrainerCard_WaitForFadeOutToFinishAndQuit(struct Task *task) +{ + if (!gPaletteFade.active) + SetMainCallback2((MainCallback)ewram0_2.var_60); + return FALSE; +} + +static void TrainerCard_CreatePrintPlayTimeTask(void) +{ + CreateTask(TrainerCard_Front_PrintPlayTime, 0); + BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); +} + +static void TrainerCard_DestoryPlayTimeTask(void) +{ + u8 taskId = FindTaskIdByFunc(TrainerCard_Front_PrintPlayTime); + + if (taskId != 0xFF) + DestroyTask(taskId); +} + +static void TrainerCard_Front_PrintPlayTime(u8 taskId) +{ + u8 buffer[32]; + struct Task *task = &gTasks[taskId]; + + if (ewram0_2.showColon != task->data[TD_CARD_INDEX]) + { + task->data[TD_CARD_INDEX] = ewram0_2.showColon; + task->data[TD_SHOWING_LINK_CARD] ^= TRUE; + } + TrainerCard_Front_GetPlayTimeString(buffer, task->data[TD_SHOWING_LINK_CARD]); + Menu_PrintText(buffer, 10, 12); +} + +static void TrainerCard_CreateFlipAnimationTask(void) +{ + u8 taskId; + + taskId = CreateTask(TrainerCard_RunFlipAnimationStateMachine, 0); + TrainerCard_RunFlipAnimationStateMachine(taskId); +} + +static u8 TrainerCard_HasFlipAnimationFinished(void) +{ + if (FindTaskIdByFunc(TrainerCard_RunFlipAnimationStateMachine) == 0xFF) + return TRUE; + else + return FALSE; +} + +static void TrainerCard_RunFlipAnimationStateMachine(u8 taskId) +{ + while (TrainerCard_FlipAnimationStateMachine[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) + ; +} + +bool8 TrainerCard_InitFlipAnimation(struct Task *task) +{ + u32 i; + + ewram0_2.var_4 = FALSE; + ScanlineEffect_Clear(); + for (i = 0; i < 0xA0; i++) + gScanlineEffectRegBuffers[1][i] = -4; + SetHBlankCallback(TrainerCard_FlipAnimationHBlankCallback); + ewram0_2.var_4 = TRUE; + task->data[0]++; + return FALSE; +} + +/* +bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) +{ + u32 r7; + u16 r9; + u32 r6; + u32 r5; + u32 r4; + u32 r10; + u32 sp0; + s16 i; + + ewram0_2.var_4 = 0; + task->data[1] += 3; + if (task->data[1] > 79) + task->data[1] = 79; + + r7 = task->data[1]; + r9 = 160 - r7; + r4 = r9 - r7; + r6 = -r7 << 16; + r5 = (160 << 16) / r4; + r5 -= 1 << 16; + r10 = r5 * r4 + r6; + sp0 = r5 / r4; + r5 *= 2; + + for (i = 0; i < r7; i++) + { + gScanlineEffectRegBuffers.filler0[i] = -4 - (u32)i; + } + //_08093B74 + for (; i < r9; i++) + { + u16 var = r6 >> 16; + r6 += r5; + r5 -= sp0; + gScanlineEffectRegBuffers.filler0[i] = -4 + var; + } + for (; i < 160; i++) + gScanlineEffectRegBuffers.filler0[i] = -4 + (u16)(r10 >> 16); + ewram0_2.var_4 = 1; + if (task->data[1] > 0x4A) + task->data[0]++; + return FALSE; +} +*/ + +__attribute__((naked)) +bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + mov r8, r0\n\ + ldr r1, _08093BFC @ =gSharedMem\n\ + movs r0, 0\n\ + strb r0, [r1, 0x4]\n\ + mov r2, r8\n\ + ldrh r0, [r2, 0xA]\n\ + adds r0, 0x3\n\ + strh r0, [r2, 0xA]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x4F\n\ + ble _08093B18\n\ + movs r0, 0x4F\n\ + strh r0, [r2, 0xA]\n\ +_08093B18:\n\ + mov r4, r8\n\ + movs r0, 0xA\n\ + ldrsh r7, [r4, r0]\n\ + movs r0, 0xA0\n\ + subs r0, r7\n\ + mov r9, r0\n\ + subs r4, r0, r7\n\ + negs r0, r7\n\ + lsls r6, r0, 16\n\ + movs r0, 0xA0\n\ + lsls r0, 16\n\ + adds r1, r4, 0\n\ + bl __udivsi3\n\ + adds r5, r0, 0\n\ + ldr r1, _08093C00 @ =0xffff0000\n\ + adds r5, r1\n\ + adds r0, r5, 0\n\ + muls r0, r4\n\ + adds r0, r6\n\ + mov r10, r0\n\ + adds r0, r5, 0\n\ + adds r1, r4, 0\n\ + bl __udivsi3\n\ + str r0, [sp]\n\ + lsls r5, 1\n\ + movs r3, 0\n\ + cmp r3, r7\n\ + bcs _08093B74\n\ + ldr r2, _08093C04 @ =gScanlineEffectRegBuffers\n\ + mov r12, r2\n\ + ldr r0, _08093C08 @ =0x0000fffc\n\ + adds r4, r0, 0\n\ +_08093B5C:\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + lsls r1, r0, 1\n\ + add r1, r12\n\ + subs r2, r4, r0\n\ + strh r2, [r1]\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, r7\n\ + bcc _08093B5C\n\ +_08093B74:\n\ + lsls r2, r3, 16\n\ + mov r1, r9\n\ + lsls r0, r1, 16\n\ + asrs r1, r0, 16\n\ + mov r4, r10\n\ + lsrs r7, r4, 16\n\ + cmp r2, r0\n\ + bge _08093BAE\n\ + ldr r0, _08093C04 @ =gScanlineEffectRegBuffers\n\ + mov r9, r0\n\ + ldr r4, _08093C08 @ =0x0000fffc\n\ + mov r12, r4\n\ + adds r4, r1, 0\n\ +_08093B8E:\n\ + lsrs r1, r6, 16\n\ + adds r6, r5\n\ + ldr r0, [sp]\n\ + subs r5, r0\n\ + asrs r2, 16\n\ + lsls r0, r2, 1\n\ + add r0, r9\n\ + add r1, r12\n\ + strh r1, [r0]\n\ + adds r2, 0x1\n\ + lsls r2, 16\n\ + lsrs r3, r2, 16\n\ + lsls r2, r3, 16\n\ + asrs r0, r2, 16\n\ + cmp r0, r4\n\ + blt _08093B8E\n\ +_08093BAE:\n\ + adds r1, r7, 0\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x9F\n\ + bgt _08093BD4\n\ + ldr r4, _08093C04 @ =gScanlineEffectRegBuffers\n\ + ldr r0, _08093C08 @ =0x0000fffc\n\ + adds r2, r1, r0\n\ +_08093BBE:\n\ + lsls r1, r3, 16\n\ + asrs r1, 16\n\ + lsls r0, r1, 1\n\ + adds r0, r4\n\ + strh r2, [r0]\n\ + adds r1, 0x1\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x9F\n\ + ble _08093BBE\n\ +_08093BD4:\n\ + movs r0, 0x1\n\ + ldr r1, _08093BFC @ =gSharedMem\n\ + strb r0, [r1, 0x4]\n\ + mov r2, r8\n\ + movs r4, 0xA\n\ + ldrsh r0, [r2, r4]\n\ + cmp r0, 0x4A\n\ + ble _08093BEA\n\ + ldrh r0, [r2, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r2, 0x8]\n\ +_08093BEA:\n\ + movs r0, 0\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08093BFC: .4byte gSharedMem\n\ +_08093C00: .4byte 0xffff0000\n\ +_08093C04: .4byte gScanlineEffectRegBuffers\n\ +_08093C08: .4byte 0x0000fffc\n\ + .syntax divided\n"); +} + +bool8 TrainerCard_SwitchToNewSide(struct Task *task) +{ + TrainerCard_DestoryPlayTimeTask(); + TrainerCard_DrawCard(); + if (!ewram0_2.backSideShown) { + /* This code never runs because it is impossible to flip the back side back to the front side */ + TrainerCard_CreatePrintPlayTimeTask(); + } + task->data[0]++; + return TRUE; +} + +__attribute__((naked)) +bool8 TrainerCard_ScaleUpFlipAnimation(struct Task *task) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + mov r8, r0\n\ + ldr r1, _08093D40 @ =gSharedMem\n\ + movs r2, 0\n\ + strb r2, [r1, 0x4]\n\ + ldrh r0, [r0, 0xA]\n\ + subs r0, 0x3\n\ + mov r3, r8\n\ + strh r0, [r3, 0xA]\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + bgt _08093C5C\n\ + strh r2, [r3, 0xA]\n\ +_08093C5C:\n\ + mov r4, r8\n\ + movs r0, 0xA\n\ + ldrsh r7, [r4, r0]\n\ + movs r0, 0xA0\n\ + subs r0, r7\n\ + mov r9, r0\n\ + subs r4, r0, r7\n\ + negs r0, r7\n\ + lsls r6, r0, 16\n\ + movs r0, 0xA0\n\ + lsls r0, 16\n\ + adds r1, r4, 0\n\ + bl __udivsi3\n\ + adds r5, r0, 0\n\ + ldr r1, _08093D44 @ =0xffff0000\n\ + adds r5, r1\n\ + adds r0, r5, 0\n\ + muls r0, r4\n\ + adds r0, r6\n\ + mov r10, r0\n\ + adds r0, r5, 0\n\ + adds r1, r4, 0\n\ + bl __udivsi3\n\ + str r0, [sp]\n\ + lsrs r5, 1\n\ + movs r3, 0\n\ + cmp r3, r7\n\ + bcs _08093CB8\n\ + ldr r2, _08093D48 @ =gScanlineEffectRegBuffers\n\ + mov r12, r2\n\ + ldr r0, _08093D4C @ =0x0000fffc\n\ + adds r4, r0, 0\n\ +_08093CA0:\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + lsls r1, r0, 1\n\ + add r1, r12\n\ + subs r2, r4, r0\n\ + strh r2, [r1]\n\ + adds r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, r7\n\ + bcc _08093CA0\n\ +_08093CB8:\n\ + lsls r2, r3, 16\n\ + mov r1, r9\n\ + lsls r0, r1, 16\n\ + asrs r1, r0, 16\n\ + mov r4, r10\n\ + lsrs r7, r4, 16\n\ + cmp r2, r0\n\ + bge _08093CF2\n\ + ldr r0, _08093D48 @ =gScanlineEffectRegBuffers\n\ + mov r9, r0\n\ + ldr r3, _08093D4C @ =0x0000fffc\n\ + mov r12, r3\n\ + adds r4, r1, 0\n\ +_08093CD2:\n\ + lsrs r1, r6, 16\n\ + adds r6, r5\n\ + ldr r0, [sp]\n\ + adds r5, r0\n\ + asrs r2, 16\n\ + lsls r0, r2, 1\n\ + add r0, r9\n\ + add r1, r12\n\ + strh r1, [r0]\n\ + adds r2, 0x1\n\ + lsls r2, 16\n\ + lsrs r3, r2, 16\n\ + lsls r2, r3, 16\n\ + asrs r0, r2, 16\n\ + cmp r0, r4\n\ + blt _08093CD2\n\ +_08093CF2:\n\ + adds r1, r7, 0\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x9F\n\ + bgt _08093D18\n\ + ldr r4, _08093D48 @ =gScanlineEffectRegBuffers\n\ + ldr r0, _08093D4C @ =0x0000fffc\n\ + adds r2, r1, r0\n\ +_08093D02:\n\ + lsls r1, r3, 16\n\ + asrs r1, 16\n\ + lsls r0, r1, 1\n\ + adds r0, r4\n\ + strh r2, [r0]\n\ + adds r1, 0x1\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x9F\n\ + ble _08093D02\n\ +_08093D18:\n\ + movs r0, 0x1\n\ + ldr r1, _08093D40 @ =gSharedMem\n\ + strb r0, [r1, 0x4]\n\ + mov r2, r8\n\ + movs r3, 0xA\n\ + ldrsh r0, [r2, r3]\n\ + cmp r0, 0\n\ + bgt _08093D2E\n\ + ldrh r0, [r2, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r2, 0x8]\n\ +_08093D2E:\n\ + movs r0, 0\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08093D40: .4byte gSharedMem\n\ +_08093D44: .4byte 0xffff0000\n\ +_08093D48: .4byte gScanlineEffectRegBuffers\n\ +_08093D4C: .4byte 0x0000fffc\n\ + .syntax divided\n"); +} + +bool8 TrainerCard_FinishFlipAnimation(struct Task *task) +{ + u8 taskId; + + ewram0_2.var_4 = FALSE; + SetHBlankCallback(NULL); + TrainerCard_ResetOffsetRegisters(); + taskId = FindTaskIdByFunc(TrainerCard_RunFlipAnimationStateMachine); + DestroyTask(taskId); + return FALSE; +} + +static void TrainerCard_FlipAnimationHBlankCallback(void) +{ + u16 bgVOffset = gScanlineEffectRegBuffers[1][REG_VCOUNT & 0xFF]; + + REG_BG0VOFS = bgVOffset; + REG_BG1VOFS = bgVOffset; + REG_BG2VOFS = bgVOffset; +} + +static void TrainerCard_DrawCard(void) +{ + if (ewram0_2.backSideShown) + TrainerCard_DrawCardBack(); + else + TrainerCard_DrawCardFront(); +} + +static void TrainerCard_DrawCardFront(void) +{ + Menu_EraseScreen(); + TrainerCard_ClearTrainerGraphics(); + sub_8093F14(); + TrainerCard_LoadTrainerTilemap(); + TrainerCard_DrawStars(); + TrainerCard_DisplayBadges(); + TrainerCard_Front_PrintTexts(); +} + +static void TrainerCard_DrawCardBack(void) +{ + Menu_EraseScreen(); + TrainerCard_ClearTrainerGraphics(); + sub_8093F48(); + TrainerCard_Back_PrintTexts(); +} + +static void TrainerCard_ResetOffsetRegisters(void) +{ + REG_BG0VOFS = -4; + REG_BG1HOFS = 0; + REG_BG1VOFS = -4; + REG_BG2HOFS = 0; + REG_BG2VOFS = -4; +} + +static void TrainerCard_CopyGraphics(void) +{ + TrainerCard_LoadPalettes(); + LoadPalette(gUnknown_083B5F6C, 0xE0, 32); + DmaCopyLarge16(3, gMenuTrainerCard_Gfx, (void *)VRAM, 0x1480, 0x1000); + DmaCopy16Defvars(3, gBadgesTiles, (void *)(VRAM + 0x1480), 0x400); +} + +extern const u16 *const gTrainerCardPalettes[]; + +static void TrainerCard_LoadPalettes(void) +{ + LoadPalette(gTrainerCardPalettes[ewram0_2.starCount], 0, 48 * 2); + LoadPalette(gBadgesPalette, 48, 16 * 2); + LoadPalette(gUnknown_083B5F4C, 64, 16 * 2); + if (ewram0_2.displayedCard.gender != MALE) + LoadPalette(gUnknown_083B5F0C, 16, 16 * 2); +} + +static void TrainerCard_LoadTrainerGraphics(void) +{ + LoadTrainerGfx_TrainerCard(ewram0_2.displayedCard.gender, 80, (void *)(VRAM + 0x1880)); +} + +static void sub_8093F14(void) +{ + const void *arr[] = {gUnknown_08E8CAC0, gUnknown_08E8D4C0}; + + CpuFastSet(arr[ewram0_2.isShowingLinkCard], (void *)(VRAM + 0x4800), 0x140); +} + +// I don't really know where to put the data. It's in such a weird order. + +const u8 gUnknown_083B5EF4[] = _(" : "); + +const u16 *const gTrainerCardPalettes[] = +{ + gMenuTrainerCard0Star_Pal, + gMenuTrainerCard1Star_Pal, + gMenuTrainerCard2Star_Pal, + gMenuTrainerCard3Star_Pal, + gMenuTrainerCard4Star_Pal, +}; + +const u16 gUnknown_083B5F0C[] = INCBIN_U16("graphics/trainer_card/83B5F0C.gbapal"); +const u16 gBadgesPalette[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); +const u16 gUnknown_083B5F4C[] = INCBIN_U16("graphics/trainer_card/83B5F4C.gbapal"); +const u16 gUnknown_083B5F6C[] = INCBIN_U16("graphics/trainer_card/83B5F6C.gbapal"); +const u16 gTrainerCardBadgesMap[][4] = INCBIN_U16("graphics/trainer_card/83B5F8C_map.bin"); + +static void sub_8093F48(void) +{ + CpuFastSet(gUnknown_08E8CFC0, (void *)(VRAM + 0x4800), 320); +} + +static void sub_8093F64(void) +{ + CpuFastSet(gUnknown_08E8D9C0, (void *)(VRAM + 0x5000), 320); +} + +static void TrainerCard_LoadTrainerTilemap(void) +{ + u16 r5 = 0xC4; + u16 *ptr = (u16 *)(VRAM + 0x4000); + s16 i; + s16 j; + + for (i = 5; i < 13; i++) + { + for (j = 19; j < 27; j++, r5++) + ptr[i * 32 + j] = r5 | 0x5000; + } +} + +static void TrainerCard_DrawStars(void) +{ + u16 *ptr = (u16 *)(VRAM + 0x4000); + s16 i = 15; + s16 var = 15 + ewram0_2.starCount; + + while (i < var) + { + ptr[6 * 32 + i] = 0x408F; + i++; + } + while (i < 0x13) + { + ptr[6 * 32 + i] = 0; + i++; + } +} + +static void TrainerCard_DisplayBadges(void) +{ + if (!ewram0_2.isShowingLinkCard) + { + u16 *ptr = (u16 *)(VRAM + 0x4000); + s16 i; + s16 r2; + + for (i = 0, r2 = 4; i < 8; i++, r2 += 3) + { + if (ewram0_2.ownedBadges[i] != 0) + { + ptr[15 * 32 + r2 + 0] = gTrainerCardBadgesMap[i][0] | 0x3000; + ptr[15 * 32 + r2 + 1] = gTrainerCardBadgesMap[i][1] | 0x3000; + ptr[16 * 32 + r2 + 0] = gTrainerCardBadgesMap[i][2] | 0x3000; + ptr[16 * 32 + r2 + 1] = gTrainerCardBadgesMap[i][3] | 0x3000; + } + } + } +} + +static void TrainerCard_ClearTrainerGraphics(void) +{ + s16 i; + u16 *ptr; + + for (i = 0, ptr = (u16 *)(VRAM + 0x4000); i < 0x400; i++, ptr++) + *ptr = 0; +} + +static void TrainerCard_ClearPokedexLabel(void) +{ + u16 *ptr = (u16 *)(VRAM + 0x4800); + u16 i; + + for (i = 3; i < 17; i++) + { + ptr[10 * 32 + i] = 1; + ptr[11 * 32 + i] = 1; + } +} + +static void TrainerCard_Front_PrintTexts(void) +{ + u8 *buffer; + + BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); + + buffer = gStringVar1; + StringCopy(buffer, ewram0_2.displayedCard.playerName); + ConvertInternationalString(buffer, ewram0_2.language); + Menu_PrintText(buffer, 7, 5); + + TrainerCard_Front_PrintTrainerID(); + TrainerCard_Front_PrintMoney(); + TrainerCard_Front_PrintPokedexCount(); + TrainerCard_PrintEasyChatPhrase(); +} + +static void TrainerCard_Back_PrintTexts(void) +{ + BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Values); + TrainerCard_Back_PrintName(); + TrainerCard_Back_PrintHallOfFameTime_Label(); + TrainerCard_Back_PrintLinkBattlesLabel(); + TrainerCard_Back_PrintBattleTower_Label(); + TrainerCard_Back_PrintLinkContests_Label(); + TrainerCard_Back_PrintLinkPokeblocks_Label(); + TrainerCard_Back_PrintPokemonTrades_Label(); + + BasicInitMenuWindow(&gWindowTemplate_TrainerCard_Back_Labels); + TrainerCard_Back_PrintHallOfFameTime(); + TrainerCard_Back_PrintLinkBattles(); + TrainerCard_Back_PrintBattleTower(); + TrainerCard_Back_PrintLinkContests(); + TrainerCard_Back_PrintLinkPokeblocks(); + TrainerCard_Back_PrintPokemonTrades(); +} + +static void TrainerCard_Front_PrintTrainerID(void) +{ + u8 buffer[8]; + + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); + Menu_PrintText(buffer, 20, 2); +} + +static void TrainerCard_Front_PrintMoney(void) +{ + sub_80B7AEC(ewram0_2.displayedCard.money, 16, 8); +} + +static void TrainerCard_Front_PrintPokedexCount(void) +{ + u8 buffer[16]; + + if ( +#if DEBUG + gDebug_03000748 == 0 && +#endif + !ewram0_2.showPokedexCount) + { + TrainerCard_ClearPokedexLabel(); + } + else + { + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3); + MenuPrint_RightAligned(buffer, 16, 10); + } +} + +static void TrainerCard_Front_GetPlayTimeString(u8 *arg1, s16 colon) +{ + u8 buffer[16]; + u16 playTimeHours; + u16 playTimeMinutes; + + playTimeHours = gSaveBlock2.playTimeHours; + playTimeMinutes = gSaveBlock2.playTimeMinutes; + if (ewram0_2.isShowingLinkCard != 0) + { + playTimeHours = ewram0_2.displayedCard.playTimeHours; + playTimeMinutes = ewram0_2.displayedCard.playTimeMinutes; + } + FormatPlayTime(buffer, playTimeHours, playTimeMinutes, colon); + sub_8072C74(arg1, buffer, 48, 1); +} + +static void TrainerCard_PrintEasyChatPhrase(void) +{ + u8 *str; + + if (ewram0_2.isShowingLinkCard != 0) + { + str = gStringVar1; + str = StringCopy(str, ewram0_2.easyChatPhrase[0]); + str[0] = 00; + str++; + str = StringCopy(str, ewram0_2.easyChatPhrase[1]); + Menu_PrintText(gStringVar1, 2, 14); + + str = gStringVar1; + str = StringCopy(str, ewram0_2.easyChatPhrase[2]); + str[0] = 00; + str++; + str = StringCopy(str, ewram0_2.easyChatPhrase[3]); + Menu_PrintText(gStringVar1, 2, 16); + } +} + +static void TrainerCard_Back_PrintName(void) +{ + u8 *str; + + str = gStringVar1; + StringCopy(str, ewram0_2.displayedCard.playerName); + ConvertInternationalString(str, ewram0_2.language); + +#if ENGLISH + StringAppend(str, gOtherText_TrainersTrainerCard); +#elif GERMAN + de_sub_8073174(str, gOtherText_TrainersTrainerCard); +#endif + + MenuPrint_RightAligned(gStringVar1, 28, 2); +} + +static void TrainerCard_Back_PrintHallOfFameTime_Label(void) +{ + if (ewram0_2.showHallOfFame != 0) + Menu_PrintText(gOtherText_FirstHOF, 3, 5); +} + +static void TrainerCard_Back_PrintHallOfFameTime(void) +{ + u8 *str; + + if (ewram0_2.showHallOfFame != 0) + { + str = gStringVar1; + str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3); + str = StringCopy(str, gUnknown_083B5EF4); + str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2); + str = StringCopy(str, gUnknown_083B5EF4); + str = ConvertIntToDecimalStringN(str, ewram0_2.displayedCard.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2); + MenuPrint_RightAligned(gStringVar1, 28, 5); + } +} + +static void TrainerCard_Back_PrintLinkBattlesLabel(void) +{ + if (ewram0_2.showLinkBattleStatus != 0) + Menu_PrintText(gOtherText_LinkCableBattles, 3, 7); +} + +static void TrainerCard_Back_PrintLinkBattles(void) +{ + u8 buffer[16]; + + if (ewram0_2.showLinkBattleStatus != 0) + { + ConvertIntToDecimalString(buffer, ewram0_2.displayedCard.linkBattleWins); + MenuPrint_RightAligned(buffer, 22, 7); + + ConvertIntToDecimalString(buffer, ewram0_2.displayedCard.linkBattleLosses); + MenuPrint_RightAligned(buffer, 28, 7); + } +} + +static void TrainerCard_Back_PrintBattleTower_Label(void) +{ + if (ewram0_2.showBattleTowerStatus != 0) + Menu_PrintText(gOtherText_BattleTowerWinRecord, 3, 15); +} + +static void TrainerCard_Back_PrintBattleTower(void) +{ + u8 buffer[16]; + + if (ewram0_2.showBattleTowerStatus != 0) + { + sub_8072C44(buffer, ewram0_2.displayedCard.battleTowerWins, 24, 1); + Menu_PrintTextPixelCoords(buffer, 112, 120, 0); + + sub_8072C44(buffer, ewram0_2.displayedCard.battleTowerLosses, 24, 1); + Menu_PrintTextPixelCoords(buffer, 149, 120, 0); + } +} + +static void TrainerCard_Back_PrintLinkContests_Label(void) +{ + if (ewram0_2.showContestRecord != 0) + Menu_PrintText(gOtherText_ContestRecord, 3, 13); +} + +static void TrainerCard_Back_PrintLinkContests(void) +{ + u8 buffer[8]; + + if (ewram0_2.showContestRecord != 0) + { + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3); + MenuPrint_RightAligned(buffer, 28, 13); + } +} + +static void TrainerCard_Back_PrintLinkPokeblocks_Label(void) +{ + if (ewram0_2.showMixingRecord != 0) + Menu_PrintText(gOtherText_MixingRecord, 3, 11); +} + +static void TrainerCard_Back_PrintLinkPokeblocks(void) +{ + u8 buffer[8]; + + if (ewram0_2.showMixingRecord != 0) + { + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); + MenuPrint_RightAligned(buffer, 28, 11); + } +} + +static void TrainerCard_Back_PrintPokemonTrades_Label(void) +{ + if (ewram0_2.showTradingRecord != 0) + Menu_PrintText(gOtherText_TradeRecord, 3, 9); +} + +static void TrainerCard_Back_PrintPokemonTrades(void) +{ + u8 buffer[8]; + + if (ewram0_2.showTradingRecord != 0) + { + ConvertIntToDecimalStringN(buffer, ewram0_2.displayedCard.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); + MenuPrint_RightAligned(buffer, 28, 9); + } +} + +void unref_sub_8094588(u16 left, u16 top) +{ + const u8 *text = gOtherText_Boy; + + if (gSaveBlock2.playerGender == FEMALE) + text = gOtherText_Girl; + Menu_PrintText(text, left, top); +} diff --git a/src/trainer_see.c b/src/trainer_see.c new file mode 100644 index 000000000..2913a0a5a --- /dev/null +++ b/src/trainer_see.c @@ -0,0 +1,559 @@ +#include "global.h" +#include "trainer_see.h" +#include "battle_setup.h" +#include "field_effect.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "script.h" +#include "sprite.h" +#include "task.h" +#include "util.h" + +static bool8 CheckTrainer(u8); +static void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3); +static void objc_exclamation_mark_probably(struct Sprite *sprite); +static bool8 TrainerCanApproachPlayer(struct MapObject *); +static void sub_80842C8(struct MapObject *, u8); +static bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction); +static void RunTrainerSeeFuncList(u8 taskId); + +const u8 gSpriteImage_839B308[] = INCBIN_U8("graphics/unknown_sprites/839B4E0/0.4bpp"); +const u8 gSpriteImage_839B388[] = INCBIN_U8("graphics/unknown_sprites/839B4E0/1.4bpp"); +const u8 gSpriteImage_839B408[] = INCBIN_U8("graphics/unknown_sprites/839B408.4bpp"); + +static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y); + +static u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *, s16, s16, s16) = +{ + GetTrainerApproachDistanceSouth, + GetTrainerApproachDistanceNorth, + GetTrainerApproachDistanceWest, + GetTrainerApproachDistanceEast, +}; + +bool8 CheckTrainers(void) +{ + u8 mapObjId; + + for (mapObjId = 0; mapObjId < 16; mapObjId++) + { + if (gMapObjects[mapObjId].active + && (gMapObjects[mapObjId].trainerType == 1 || gMapObjects[mapObjId].trainerType == 3) + && CheckTrainer(mapObjId)) + return TRUE; + } + return FALSE; +} + +static bool8 CheckTrainer(u8 mapObjId) +{ + u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(mapObjId); + + if (GetTrainerFlagFromScriptPointer(scriptPtr)) + { + return FALSE; + } + else + { + struct MapObject *trainerObj = &gMapObjects[mapObjId]; + bool8 canApproach = TrainerCanApproachPlayer(trainerObj); + + if (canApproach) + { + TrainerWantsBattle(mapObjId, scriptPtr); + sub_80842C8(trainerObj, (canApproach - 1)); + return TRUE; + } + else + { + return FALSE; + } + } +} + +static bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj) +{ + s16 x, y; + u8 i; + u8 approachDistance; + + PlayerGetDestCoords(&x, &y); + if (trainerObj->trainerType == 1) // can only see in one direction + { + approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->mapobj_unk_18); + } + else // can see in all directions + { + for (i = 0; i < 4; i++) + { + approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east + return approachDistance; + } + } + return FALSE; +} + +// Returns how far south the player is from trainer. 0 if out of trainer's sight. +static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->coords2.x == x + && y > trainerObj->coords2.y + && y <= trainerObj->coords2.y + range) + return (y - trainerObj->coords2.y); + else + return 0; +} + +// Returns how far north the player is from trainer. 0 if out of trainer's sight. +static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->coords2.x == x + && y < trainerObj->coords2.y + && y >= trainerObj->coords2.y - range) + return (trainerObj->coords2.y - y); + else + return 0; +} + +// Returns how far west the player is from trainer. 0 if out of trainer's sight. +static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->coords2.y == y + && x < trainerObj->coords2.x + && x >= trainerObj->coords2.x - range) + return (trainerObj->coords2.x - x); + else + return 0; +} + +// Returns how far east the player is from trainer. 0 if out of trainer's sight. +static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->coords2.y == y + && x > trainerObj->coords2.x + && x <= trainerObj->coords2.x + range) + return (x - trainerObj->coords2.x); + else + return 0; +} + +#ifdef BUGFIX_TRAINERAPPROACH +#define COLLISION_MASK ~1 +#else +#define COLLISION_MASK 1 +#endif + +static bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction) +{ + s16 x, y; + u8 unk19_temp; + u8 unk19b_temp; + u8 i; + u8 collision; + + if (approachDistance == 0) + return FALSE; + + x = trainerObj->coords2.x; + y = trainerObj->coords2.y; + + for (i = 0; i <= approachDistance - 1; i++, MoveCoords(direction, &x, &y)) + { + collision = sub_8060024(trainerObj, x, y, direction); + if (collision != 0 && (collision & COLLISION_MASK)) + return FALSE; + } + + // preserve mapobj_unk_19 before clearing. + unk19_temp = trainerObj->range.as_nybbles.x; + unk19b_temp = trainerObj->range.as_nybbles.y; + trainerObj->range.as_nybbles.x = 0; + trainerObj->range.as_nybbles.y = 0; + + collision = npc_block_way((struct MapObject *)trainerObj, x, y, direction); + + trainerObj->range.as_nybbles.x = unk19_temp; + trainerObj->range.as_nybbles.y = unk19b_temp; + if (collision == 4) + return approachDistance; + + return FALSE; +} + +#define tTrainerObjHi data[1] +#define tTrainerObjLo data[2] + +static void sub_80842C8(struct MapObject *trainerObj, u8 b) +{ + u8 taskId = CreateTask(RunTrainerSeeFuncList, 0x50); + struct Task *task = &gTasks[taskId]; + + task->tTrainerObjHi = (u32)(trainerObj) >> 16; + task->tTrainerObjLo = (u32)(trainerObj); + task->data[3] = b; +} + +static void sub_80842FC(TaskFunc followupFunc) +{ + TaskFunc taskFunc = RunTrainerSeeFuncList; + u8 taskId = FindTaskIdByFunc(taskFunc); + + SetTaskFuncWithFollowupFunc(taskId, taskFunc, followupFunc); + gTasks[taskId].data[0] = 1; + taskFunc(taskId); +} + +static bool8 sub_8084394(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static bool8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj); + +static bool8 (*const gTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = +{ + sub_8084394, + sub_8084398, + sub_80843DC, + sub_808441C, + sub_8084478, + sub_8084534, + sub_8084578, + sub_80845AC, + sub_80845C8, + sub_80845FC, + sub_8084654, + sub_80846C8, +}; + +static void RunTrainerSeeFuncList(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct MapObject *trainerObj = (struct MapObject *)((task->tTrainerObjHi << 16) | (task->tTrainerObjLo)); + + if (!trainerObj->active) + { + SwitchTaskToFollowupFunc(taskId); + } + else + { + while (gTrainerSeeFuncList[task->data[0]](taskId, task, trainerObj)) + ; + } +} + +static bool8 sub_8084394(u8 taskId, struct Task *task, struct MapObject *trainerObj) // cant be void because it is called with RunTrainerSeeFuncList with arguments. +{ + return FALSE; +} + +static bool8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + u8 direction; + + FieldObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); + direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); + FieldObjectSetSpecialAnim(trainerObj, direction); + task->data[0]++; + return TRUE; +} + +static bool8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (FieldEffectActiveListContains(0)) + { + return FALSE; + } + else + { + task->data[0]++; + if (trainerObj->animPattern == 57 || trainerObj->animPattern == 58) + task->data[0] = 6; + if (trainerObj->animPattern == 63) + task->data[0] = 8; + return TRUE; + } +} + +static bool8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + if (task->data[3]) + { + FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18)); + task->data[3]--; + } + else + { + FieldObjectSetSpecialAnim(trainerObj, 0x3E); + task->data[0]++; + } + } + return FALSE; +} + +static bool8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + struct MapObject *playerObj; + + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + return FALSE; + + npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); + sub_805C774(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); + sub_805C754(trainerObj); + + playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) + return FALSE; + + sub_80597E8(); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18))); + task->data[0]++; + return FALSE; +} + +static bool8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // technically only 1 parameter, but needs all 3 for TrainerSeeFuncList call. +{ + struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) + SwitchTaskToFollowupFunc(taskId); + return FALSE; +} + +static bool8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + FieldObjectSetSpecialAnim(trainerObj, 0x59); + task->data[0]++; + } + return FALSE; +} + +static bool8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + task->data[0] = 3; + + return FALSE; +} + +static bool8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) + || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + { + FieldObjectSetSpecialAnim(trainerObj, 0x3E); + task->data[0]++; + } + return FALSE; +} + +static bool8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) + { + gFieldEffectArguments[0] = trainerObj->coords2.x; + gFieldEffectArguments[1] = trainerObj->coords2.y; + gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1; + gFieldEffectArguments[3] = 2; + task->data[4] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } + return FALSE; +} + +static bool8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + struct Sprite *sprite; + + if (gSprites[task->data[4]].animCmdIndex == 2) + { + trainerObj->mapobj_bit_26 = 0; + trainerObj->mapobj_bit_2 = 1; + + sprite = &gSprites[trainerObj->spriteId]; + sprite->oam.priority = 2; + FieldObjectClearAnimIfSpecialAnimFinished(trainerObj); + FieldObjectSetSpecialAnim(trainerObj, sub_806084C(trainerObj->mapobj_unk_18)); + task->data[0]++; + } + return FALSE; +} + +static bool8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj) +{ + if (!FieldEffectActiveListContains(49)) + task->data[0] = 3; + + return FALSE; +} + +static bool8 (*const gTrainerSeeFuncList2[])(u8, struct Task *, struct MapObject *) = +{ + sub_80845C8, + sub_80845FC, + sub_8084654, + sub_80846C8, +}; + +void sub_80846E4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + struct MapObject *mapObj; + + // another mapObj loaded into by loadword? + LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj); + if (!task->data[7]) + { + FieldObjectClearAnim(mapObj); + task->data[7]++; + } + gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); + if (task->data[0] == 3 && !FieldEffectActiveListContains(49)) + { + npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); + sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); + DestroyTask(taskId); + } + else + mapObj->mapobj_bit_7 = 0; +} + +void sub_8084794(struct MapObject *var) +{ + StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], (u32)var); +} + +static void Task_DestroyTrainerApproachTask(u8); + +void ScrSpecial_EndTrainerApproach(void) +{ + sub_80842FC(Task_DestroyTrainerApproachTask); +} + +static void Task_DestroyTrainerApproachTask(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +static const struct OamData gOamData_839B4D8 = { + .size = 1, .priority = 1 +}; + +static const struct SpriteFrameImage gSpriteImageTable_839B4E0[] = { + { gSpriteImage_839B308, sizeof gSpriteImage_839B308 }, + { gSpriteImage_839B388, sizeof gSpriteImage_839B388 } +}; + +static const struct SpriteFrameImage gSpriteImageTable_839B4F0[] = { + { gSpriteImage_839B408, sizeof gSpriteImage_839B408 } +}; + +static const union AnimCmd gSpriteAnim_839B4F8[] = { + ANIMCMD_FRAME(0, 60), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_839B500[] = { + ANIMCMD_FRAME(1, 60), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_839B508[] = { + gSpriteAnim_839B4F8, + gSpriteAnim_839B500 +}; + +static const struct SpriteTemplate gSpriteTemplate_839B510 = { + 0xffff, 0xffff, &gOamData_839B4D8, gSpriteAnimTable_839B508, gSpriteImageTable_839B4E0, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably +}; +static const struct SpriteTemplate gSpriteTemplate_839B528 = { + 0xffff, 4100, &gOamData_839B4D8, gSpriteAnimTable_839B508, gSpriteImageTable_839B4F0, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably +}; + +u8 FldEff_ExclamationMarkIcon1(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x53); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 0, 0); + + return 0; +} + +u8 FldEff_ExclamationMarkIcon2(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x52); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 33, 1); + + return 0; +} + +u8 FldEff_HeartIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B528, 0, 0, 0x52); + + if (spriteId != 64) + sub_8084894(&gSprites[spriteId], 46, 0); + + return 0; +} + +static void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3) +{ + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = 1; + + sprite->data[0] = gFieldEffectArguments[0]; + sprite->data[1] = gFieldEffectArguments[1]; + sprite->data[2] = gFieldEffectArguments[2]; + sprite->data[3] = -5; + sprite->data[7] = a2; + + StartSpriteAnim(sprite, a3); +} + +static void objc_exclamation_mark_probably(struct Sprite *sprite) +{ + u8 mapObjId; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjId) + || sprite->animEnded) + { + FieldEffectStop(sprite, (u8)sprite->data[7]); + } + else + { + struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId]; + sprite->data[4] += sprite->data[3]; + sprite->pos1.x = mapObjSprite->pos1.x; + sprite->pos1.y = mapObjSprite->pos1.y - 16; + sprite->pos2.x = mapObjSprite->pos2.x; + sprite->pos2.y = mapObjSprite->pos2.y + sprite->data[4]; + if (sprite->data[4]) + sprite->data[3]++; + else + sprite->data[3] = 0; + } +} diff --git a/src/trig.c b/src/trig.c new file mode 100644 index 000000000..e16a69e63 --- /dev/null +++ b/src/trig.c @@ -0,0 +1,549 @@ +#include "global.h" +#include "trig.h" + +// Converts a number to Q8.8 fixed-point format +#define Q_8_8(n) ((s16)((n) * 256)) + +// Converts a number to Q4.12 fixed-point format +#define Q_4_12(n) ((s16)((n) * 4096)) + +// Values of sin(x*(π/128)) as Q8.8 fixed-point numbers from x = 0 to x = 319 +const s16 gSineTable[] = +{ + Q_8_8(0), // sin(0*(π/128)) + Q_8_8(0.0234375), // sin(1*(π/128)) + Q_8_8(0.046875), // sin(2*(π/128)) + Q_8_8(0.0703125), // sin(3*(π/128)) + Q_8_8(0.09765625), // sin(4*(π/128)) + Q_8_8(0.12109375), // sin(5*(π/128)) + Q_8_8(0.14453125), // sin(6*(π/128)) + Q_8_8(0.16796875), // sin(7*(π/128)) + Q_8_8(0.19140625), // sin(8*(π/128)) + Q_8_8(0.21875), // sin(9*(π/128)) + Q_8_8(0.2421875), // sin(10*(π/128)) + Q_8_8(0.265625), // sin(11*(π/128)) + Q_8_8(0.2890625), // sin(12*(π/128)) + Q_8_8(0.3125), // sin(13*(π/128)) + Q_8_8(0.3359375), // sin(14*(π/128)) + Q_8_8(0.359375), // sin(15*(π/128)) + Q_8_8(0.37890625), // sin(16*(π/128)) + Q_8_8(0.40234375), // sin(17*(π/128)) + Q_8_8(0.42578125), // sin(18*(π/128)) + Q_8_8(0.44921875), // sin(19*(π/128)) + Q_8_8(0.46875), // sin(20*(π/128)) + Q_8_8(0.4921875), // sin(21*(π/128)) + Q_8_8(0.51171875), // sin(22*(π/128)) + Q_8_8(0.53125), // sin(23*(π/128)) + Q_8_8(0.5546875), // sin(24*(π/128)) + Q_8_8(0.57421875), // sin(25*(π/128)) + Q_8_8(0.59375), // sin(26*(π/128)) + Q_8_8(0.61328125), // sin(27*(π/128)) + Q_8_8(0.6328125), // sin(28*(π/128)) + Q_8_8(0.65234375), // sin(29*(π/128)) + Q_8_8(0.66796875), // sin(30*(π/128)) + Q_8_8(0.6875), // sin(31*(π/128)) + Q_8_8(0.70703125), // sin(32*(π/128)) + Q_8_8(0.72265625), // sin(33*(π/128)) + Q_8_8(0.73828125), // sin(34*(π/128)) + Q_8_8(0.75390625), // sin(35*(π/128)) + Q_8_8(0.76953125), // sin(36*(π/128)) + Q_8_8(0.78515625), // sin(37*(π/128)) + Q_8_8(0.80078125), // sin(38*(π/128)) + Q_8_8(0.81640625), // sin(39*(π/128)) + Q_8_8(0.828125), // sin(40*(π/128)) + Q_8_8(0.84375), // sin(41*(π/128)) + Q_8_8(0.85546875), // sin(42*(π/128)) + Q_8_8(0.8671875), // sin(43*(π/128)) + Q_8_8(0.87890625), // sin(44*(π/128)) + Q_8_8(0.890625), // sin(45*(π/128)) + Q_8_8(0.90234375), // sin(46*(π/128)) + Q_8_8(0.9140625), // sin(47*(π/128)) + Q_8_8(0.921875), // sin(48*(π/128)) + Q_8_8(0.9296875), // sin(49*(π/128)) + Q_8_8(0.94140625), // sin(50*(π/128)) + Q_8_8(0.94921875), // sin(51*(π/128)) + Q_8_8(0.953125), // sin(52*(π/128)) + Q_8_8(0.9609375), // sin(53*(π/128)) + Q_8_8(0.96875), // sin(54*(π/128)) + Q_8_8(0.97265625), // sin(55*(π/128)) + Q_8_8(0.98046875), // sin(56*(π/128)) + Q_8_8(0.984375), // sin(57*(π/128)) + Q_8_8(0.98828125), // sin(58*(π/128)) + Q_8_8(0.9921875), // sin(59*(π/128)) + Q_8_8(0.9921875), // sin(60*(π/128)) + Q_8_8(0.99609375), // sin(61*(π/128)) + Q_8_8(0.99609375), // sin(62*(π/128)) + Q_8_8(0.99609375), // sin(63*(π/128)) + Q_8_8(1), // sin(64*(π/128)) + Q_8_8(0.99609375), // sin(65*(π/128)) + Q_8_8(0.99609375), // sin(66*(π/128)) + Q_8_8(0.99609375), // sin(67*(π/128)) + Q_8_8(0.9921875), // sin(68*(π/128)) + Q_8_8(0.9921875), // sin(69*(π/128)) + Q_8_8(0.98828125), // sin(70*(π/128)) + Q_8_8(0.984375), // sin(71*(π/128)) + Q_8_8(0.98046875), // sin(72*(π/128)) + Q_8_8(0.97265625), // sin(73*(π/128)) + Q_8_8(0.96875), // sin(74*(π/128)) + Q_8_8(0.9609375), // sin(75*(π/128)) + Q_8_8(0.953125), // sin(76*(π/128)) + Q_8_8(0.94921875), // sin(77*(π/128)) + Q_8_8(0.94140625), // sin(78*(π/128)) + Q_8_8(0.9296875), // sin(79*(π/128)) + Q_8_8(0.921875), // sin(80*(π/128)) + Q_8_8(0.9140625), // sin(81*(π/128)) + Q_8_8(0.90234375), // sin(82*(π/128)) + Q_8_8(0.890625), // sin(83*(π/128)) + Q_8_8(0.87890625), // sin(84*(π/128)) + Q_8_8(0.8671875), // sin(85*(π/128)) + Q_8_8(0.85546875), // sin(86*(π/128)) + Q_8_8(0.84375), // sin(87*(π/128)) + Q_8_8(0.828125), // sin(88*(π/128)) + Q_8_8(0.81640625), // sin(89*(π/128)) + Q_8_8(0.80078125), // sin(90*(π/128)) + Q_8_8(0.78515625), // sin(91*(π/128)) + Q_8_8(0.76953125), // sin(92*(π/128)) + Q_8_8(0.75390625), // sin(93*(π/128)) + Q_8_8(0.73828125), // sin(94*(π/128)) + Q_8_8(0.72265625), // sin(95*(π/128)) + Q_8_8(0.70703125), // sin(96*(π/128)) + Q_8_8(0.6875), // sin(97*(π/128)) + Q_8_8(0.66796875), // sin(98*(π/128)) + Q_8_8(0.65234375), // sin(99*(π/128)) + Q_8_8(0.6328125), // sin(100*(π/128)) + Q_8_8(0.61328125), // sin(101*(π/128)) + Q_8_8(0.59375), // sin(102*(π/128)) + Q_8_8(0.57421875), // sin(103*(π/128)) + Q_8_8(0.5546875), // sin(104*(π/128)) + Q_8_8(0.53125), // sin(105*(π/128)) + Q_8_8(0.51171875), // sin(106*(π/128)) + Q_8_8(0.4921875), // sin(107*(π/128)) + Q_8_8(0.46875), // sin(108*(π/128)) + Q_8_8(0.44921875), // sin(109*(π/128)) + Q_8_8(0.42578125), // sin(110*(π/128)) + Q_8_8(0.40234375), // sin(111*(π/128)) + Q_8_8(0.37890625), // sin(112*(π/128)) + Q_8_8(0.359375), // sin(113*(π/128)) + Q_8_8(0.3359375), // sin(114*(π/128)) + Q_8_8(0.3125), // sin(115*(π/128)) + Q_8_8(0.2890625), // sin(116*(π/128)) + Q_8_8(0.265625), // sin(117*(π/128)) + Q_8_8(0.2421875), // sin(118*(π/128)) + Q_8_8(0.21875), // sin(119*(π/128)) + Q_8_8(0.19140625), // sin(120*(π/128)) + Q_8_8(0.16796875), // sin(121*(π/128)) + Q_8_8(0.14453125), // sin(122*(π/128)) + Q_8_8(0.12109375), // sin(123*(π/128)) + Q_8_8(0.09765625), // sin(124*(π/128)) + Q_8_8(0.0703125), // sin(125*(π/128)) + Q_8_8(0.046875), // sin(126*(π/128)) + Q_8_8(0.0234375), // sin(127*(π/128)) + Q_8_8(0), // sin(128*(π/128)) + Q_8_8(-0.0234375), // sin(129*(π/128)) + Q_8_8(-0.046875), // sin(130*(π/128)) + Q_8_8(-0.0703125), // sin(131*(π/128)) + Q_8_8(-0.09765625), // sin(132*(π/128)) + Q_8_8(-0.12109375), // sin(133*(π/128)) + Q_8_8(-0.14453125), // sin(134*(π/128)) + Q_8_8(-0.16796875), // sin(135*(π/128)) + Q_8_8(-0.19140625), // sin(136*(π/128)) + Q_8_8(-0.21875), // sin(137*(π/128)) + Q_8_8(-0.2421875), // sin(138*(π/128)) + Q_8_8(-0.265625), // sin(139*(π/128)) + Q_8_8(-0.2890625), // sin(140*(π/128)) + Q_8_8(-0.3125), // sin(141*(π/128)) + Q_8_8(-0.3359375), // sin(142*(π/128)) + Q_8_8(-0.359375), // sin(143*(π/128)) + Q_8_8(-0.37890625), // sin(144*(π/128)) + Q_8_8(-0.40234375), // sin(145*(π/128)) + Q_8_8(-0.42578125), // sin(146*(π/128)) + Q_8_8(-0.44921875), // sin(147*(π/128)) + Q_8_8(-0.46875), // sin(148*(π/128)) + Q_8_8(-0.4921875), // sin(149*(π/128)) + Q_8_8(-0.51171875), // sin(150*(π/128)) + Q_8_8(-0.53125), // sin(151*(π/128)) + Q_8_8(-0.5546875), // sin(152*(π/128)) + Q_8_8(-0.57421875), // sin(153*(π/128)) + Q_8_8(-0.59375), // sin(154*(π/128)) + Q_8_8(-0.61328125), // sin(155*(π/128)) + Q_8_8(-0.6328125), // sin(156*(π/128)) + Q_8_8(-0.65234375), // sin(157*(π/128)) + Q_8_8(-0.66796875), // sin(158*(π/128)) + Q_8_8(-0.6875), // sin(159*(π/128)) + Q_8_8(-0.70703125), // sin(160*(π/128)) + Q_8_8(-0.72265625), // sin(161*(π/128)) + Q_8_8(-0.73828125), // sin(162*(π/128)) + Q_8_8(-0.75390625), // sin(163*(π/128)) + Q_8_8(-0.76953125), // sin(164*(π/128)) + Q_8_8(-0.78515625), // sin(165*(π/128)) + Q_8_8(-0.80078125), // sin(166*(π/128)) + Q_8_8(-0.81640625), // sin(167*(π/128)) + Q_8_8(-0.828125), // sin(168*(π/128)) + Q_8_8(-0.84375), // sin(169*(π/128)) + Q_8_8(-0.85546875), // sin(170*(π/128)) + Q_8_8(-0.8671875), // sin(171*(π/128)) + Q_8_8(-0.87890625), // sin(172*(π/128)) + Q_8_8(-0.890625), // sin(173*(π/128)) + Q_8_8(-0.90234375), // sin(174*(π/128)) + Q_8_8(-0.9140625), // sin(175*(π/128)) + Q_8_8(-0.921875), // sin(176*(π/128)) + Q_8_8(-0.9296875), // sin(177*(π/128)) + Q_8_8(-0.94140625), // sin(178*(π/128)) + Q_8_8(-0.94921875), // sin(179*(π/128)) + Q_8_8(-0.953125), // sin(180*(π/128)) + Q_8_8(-0.9609375), // sin(181*(π/128)) + Q_8_8(-0.96875), // sin(182*(π/128)) + Q_8_8(-0.97265625), // sin(183*(π/128)) + Q_8_8(-0.98046875), // sin(184*(π/128)) + Q_8_8(-0.984375), // sin(185*(π/128)) + Q_8_8(-0.98828125), // sin(186*(π/128)) + Q_8_8(-0.9921875), // sin(187*(π/128)) + Q_8_8(-0.9921875), // sin(188*(π/128)) + Q_8_8(-0.99609375), // sin(189*(π/128)) + Q_8_8(-0.99609375), // sin(190*(π/128)) + Q_8_8(-0.99609375), // sin(191*(π/128)) + Q_8_8(-1), // sin(192*(π/128)) + Q_8_8(-0.99609375), // sin(193*(π/128)) + Q_8_8(-0.99609375), // sin(194*(π/128)) + Q_8_8(-0.99609375), // sin(195*(π/128)) + Q_8_8(-0.9921875), // sin(196*(π/128)) + Q_8_8(-0.9921875), // sin(197*(π/128)) + Q_8_8(-0.98828125), // sin(198*(π/128)) + Q_8_8(-0.984375), // sin(199*(π/128)) + Q_8_8(-0.98046875), // sin(200*(π/128)) + Q_8_8(-0.97265625), // sin(201*(π/128)) + Q_8_8(-0.96875), // sin(202*(π/128)) + Q_8_8(-0.9609375), // sin(203*(π/128)) + Q_8_8(-0.953125), // sin(204*(π/128)) + Q_8_8(-0.94921875), // sin(205*(π/128)) + Q_8_8(-0.94140625), // sin(206*(π/128)) + Q_8_8(-0.9296875), // sin(207*(π/128)) + Q_8_8(-0.921875), // sin(208*(π/128)) + Q_8_8(-0.9140625), // sin(209*(π/128)) + Q_8_8(-0.90234375), // sin(210*(π/128)) + Q_8_8(-0.890625), // sin(211*(π/128)) + Q_8_8(-0.87890625), // sin(212*(π/128)) + Q_8_8(-0.8671875), // sin(213*(π/128)) + Q_8_8(-0.85546875), // sin(214*(π/128)) + Q_8_8(-0.84375), // sin(215*(π/128)) + Q_8_8(-0.828125), // sin(216*(π/128)) + Q_8_8(-0.81640625), // sin(217*(π/128)) + Q_8_8(-0.80078125), // sin(218*(π/128)) + Q_8_8(-0.78515625), // sin(219*(π/128)) + Q_8_8(-0.76953125), // sin(220*(π/128)) + Q_8_8(-0.75390625), // sin(221*(π/128)) + Q_8_8(-0.73828125), // sin(222*(π/128)) + Q_8_8(-0.72265625), // sin(223*(π/128)) + Q_8_8(-0.70703125), // sin(224*(π/128)) + Q_8_8(-0.6875), // sin(225*(π/128)) + Q_8_8(-0.66796875), // sin(226*(π/128)) + Q_8_8(-0.65234375), // sin(227*(π/128)) + Q_8_8(-0.6328125), // sin(228*(π/128)) + Q_8_8(-0.61328125), // sin(229*(π/128)) + Q_8_8(-0.59375), // sin(230*(π/128)) + Q_8_8(-0.57421875), // sin(231*(π/128)) + Q_8_8(-0.5546875), // sin(232*(π/128)) + Q_8_8(-0.53125), // sin(233*(π/128)) + Q_8_8(-0.51171875), // sin(234*(π/128)) + Q_8_8(-0.4921875), // sin(235*(π/128)) + Q_8_8(-0.46875), // sin(236*(π/128)) + Q_8_8(-0.44921875), // sin(237*(π/128)) + Q_8_8(-0.42578125), // sin(238*(π/128)) + Q_8_8(-0.40234375), // sin(239*(π/128)) + Q_8_8(-0.37890625), // sin(240*(π/128)) + Q_8_8(-0.359375), // sin(241*(π/128)) + Q_8_8(-0.3359375), // sin(242*(π/128)) + Q_8_8(-0.3125), // sin(243*(π/128)) + Q_8_8(-0.2890625), // sin(244*(π/128)) + Q_8_8(-0.265625), // sin(245*(π/128)) + Q_8_8(-0.2421875), // sin(246*(π/128)) + Q_8_8(-0.21875), // sin(247*(π/128)) + Q_8_8(-0.19140625), // sin(248*(π/128)) + Q_8_8(-0.16796875), // sin(249*(π/128)) + Q_8_8(-0.14453125), // sin(250*(π/128)) + Q_8_8(-0.12109375), // sin(251*(π/128)) + Q_8_8(-0.09765625), // sin(252*(π/128)) + Q_8_8(-0.0703125), // sin(253*(π/128)) + Q_8_8(-0.046875), // sin(254*(π/128)) + Q_8_8(-0.0234375), // sin(255*(π/128)) + Q_8_8(0), // sin(256*(π/128)) + Q_8_8(0.0234375), // sin(257*(π/128)) + Q_8_8(0.046875), // sin(258*(π/128)) + Q_8_8(0.0703125), // sin(259*(π/128)) + Q_8_8(0.09765625), // sin(260*(π/128)) + Q_8_8(0.12109375), // sin(261*(π/128)) + Q_8_8(0.14453125), // sin(262*(π/128)) + Q_8_8(0.16796875), // sin(263*(π/128)) + Q_8_8(0.19140625), // sin(264*(π/128)) + Q_8_8(0.21875), // sin(265*(π/128)) + Q_8_8(0.2421875), // sin(266*(π/128)) + Q_8_8(0.265625), // sin(267*(π/128)) + Q_8_8(0.2890625), // sin(268*(π/128)) + Q_8_8(0.3125), // sin(269*(π/128)) + Q_8_8(0.3359375), // sin(270*(π/128)) + Q_8_8(0.359375), // sin(271*(π/128)) + Q_8_8(0.37890625), // sin(272*(π/128)) + Q_8_8(0.40234375), // sin(273*(π/128)) + Q_8_8(0.42578125), // sin(274*(π/128)) + Q_8_8(0.44921875), // sin(275*(π/128)) + Q_8_8(0.46875), // sin(276*(π/128)) + Q_8_8(0.4921875), // sin(277*(π/128)) + Q_8_8(0.51171875), // sin(278*(π/128)) + Q_8_8(0.53125), // sin(279*(π/128)) + Q_8_8(0.5546875), // sin(280*(π/128)) + Q_8_8(0.57421875), // sin(281*(π/128)) + Q_8_8(0.59375), // sin(282*(π/128)) + Q_8_8(0.61328125), // sin(283*(π/128)) + Q_8_8(0.6328125), // sin(284*(π/128)) + Q_8_8(0.65234375), // sin(285*(π/128)) + Q_8_8(0.66796875), // sin(286*(π/128)) + Q_8_8(0.6875), // sin(287*(π/128)) + Q_8_8(0.70703125), // sin(288*(π/128)) + Q_8_8(0.72265625), // sin(289*(π/128)) + Q_8_8(0.73828125), // sin(290*(π/128)) + Q_8_8(0.75390625), // sin(291*(π/128)) + Q_8_8(0.76953125), // sin(292*(π/128)) + Q_8_8(0.78515625), // sin(293*(π/128)) + Q_8_8(0.80078125), // sin(294*(π/128)) + Q_8_8(0.81640625), // sin(295*(π/128)) + Q_8_8(0.828125), // sin(296*(π/128)) + Q_8_8(0.84375), // sin(297*(π/128)) + Q_8_8(0.85546875), // sin(298*(π/128)) + Q_8_8(0.8671875), // sin(299*(π/128)) + Q_8_8(0.87890625), // sin(300*(π/128)) + Q_8_8(0.890625), // sin(301*(π/128)) + Q_8_8(0.90234375), // sin(302*(π/128)) + Q_8_8(0.9140625), // sin(303*(π/128)) + Q_8_8(0.921875), // sin(304*(π/128)) + Q_8_8(0.9296875), // sin(305*(π/128)) + Q_8_8(0.94140625), // sin(306*(π/128)) + Q_8_8(0.94921875), // sin(307*(π/128)) + Q_8_8(0.953125), // sin(308*(π/128)) + Q_8_8(0.9609375), // sin(309*(π/128)) + Q_8_8(0.96875), // sin(310*(π/128)) + Q_8_8(0.97265625), // sin(311*(π/128)) + Q_8_8(0.98046875), // sin(312*(π/128)) + Q_8_8(0.984375), // sin(313*(π/128)) + Q_8_8(0.98828125), // sin(314*(π/128)) + Q_8_8(0.9921875), // sin(315*(π/128)) + Q_8_8(0.9921875), // sin(316*(π/128)) + Q_8_8(0.99609375), // sin(317*(π/128)) + Q_8_8(0.99609375), // sin(318*(π/128)) + Q_8_8(0.99609375), // sin(319*(π/128)) +}; + +// values of sin(x) as Q4.12 fixed-point numbers from x = 0° to x = 179° +const s16 gSineDegreeTable[] = +{ + Q_4_12(0), // sin(0°) + Q_4_12(0.017333984375), // sin(1°) + Q_4_12(0.034912109375), // sin(2°) + Q_4_12(0.05224609375), // sin(3°) + Q_4_12(0.06982421875), // sin(4°) + Q_4_12(0.087158203125), // sin(5°) + Q_4_12(0.1044921875), // sin(6°) + Q_4_12(0.121826171875), // sin(7°) + Q_4_12(0.13916015625), // sin(8°) + Q_4_12(0.156494140625), // sin(9°) + Q_4_12(0.173583984375), // sin(10°) + Q_4_12(0.19091796875), // sin(11°) + Q_4_12(0.2080078125), // sin(12°) + Q_4_12(0.224853515625), // sin(13°) + Q_4_12(0.241943359375), // sin(14°) + Q_4_12(0.2587890625), // sin(15°) + Q_4_12(0.275634765625), // sin(16°) + Q_4_12(0.29248046875), // sin(17°) + Q_4_12(0.30908203125), // sin(18°) + Q_4_12(0.32568359375), // sin(19°) + Q_4_12(0.342041015625), // sin(20°) + Q_4_12(0.3583984375), // sin(21°) + Q_4_12(0.37451171875), // sin(22°) + Q_4_12(0.390625), // sin(23°) + Q_4_12(0.40673828125), // sin(24°) + Q_4_12(0.422607421875), // sin(25°) + Q_4_12(0.4384765625), // sin(26°) + Q_4_12(0.4541015625), // sin(27°) + Q_4_12(0.469482421875), // sin(28°) + Q_4_12(0.48486328125), // sin(29°) + Q_4_12(0.5), // sin(30°) + Q_4_12(0.51513671875), // sin(31°) + Q_4_12(0.530029296875), // sin(32°) + Q_4_12(0.544677734375), // sin(33°) + Q_4_12(0.55908203125), // sin(34°) + Q_4_12(0.573486328125), // sin(35°) + Q_4_12(0.587890625), // sin(36°) + Q_4_12(0.601806640625), // sin(37°) + Q_4_12(0.61572265625), // sin(38°) + Q_4_12(0.62939453125), // sin(39°) + Q_4_12(0.642822265625), // sin(40°) + Q_4_12(0.656005859375), // sin(41°) + Q_4_12(0.669189453125), // sin(42°) + Q_4_12(0.681884765625), // sin(43°) + Q_4_12(0.694580078125), // sin(44°) + Q_4_12(0.70703125), // sin(45°) + Q_4_12(0.71923828125), // sin(46°) + Q_4_12(0.7314453125), // sin(47°) + Q_4_12(0.7431640625), // sin(48°) + Q_4_12(0.754638671875), // sin(49°) + Q_4_12(0.76611328125), // sin(50°) + Q_4_12(0.777099609375), // sin(51°) + Q_4_12(0.7880859375), // sin(52°) + Q_4_12(0.798583984375), // sin(53°) + Q_4_12(0.80908203125), // sin(54°) + Q_4_12(0.819091796875), // sin(55°) + Q_4_12(0.8291015625), // sin(56°) + Q_4_12(0.838623046875), // sin(57°) + Q_4_12(0.84814453125), // sin(58°) + Q_4_12(0.857177734375), // sin(59°) + Q_4_12(0.865966796875), // sin(60°) + Q_4_12(0.87451171875), // sin(61°) + Q_4_12(0.883056640625), // sin(62°) + Q_4_12(0.89111328125), // sin(63°) + Q_4_12(0.898681640625), // sin(64°) + Q_4_12(0.90625), // sin(65°) + Q_4_12(0.91357421875), // sin(66°) + Q_4_12(0.92041015625), // sin(67°) + Q_4_12(0.92724609375), // sin(68°) + Q_4_12(0.93359375), // sin(69°) + Q_4_12(0.939697265625), // sin(70°) + Q_4_12(0.945556640625), // sin(71°) + Q_4_12(0.951171875), // sin(72°) + Q_4_12(0.956298828125), // sin(73°) + Q_4_12(0.961181640625), // sin(74°) + Q_4_12(0.9658203125), // sin(75°) + Q_4_12(0.97021484375), // sin(76°) + Q_4_12(0.974365234375), // sin(77°) + Q_4_12(0.97802734375), // sin(78°) + Q_4_12(0.981689453125), // sin(79°) + Q_4_12(0.98486328125), // sin(80°) + Q_4_12(0.98779296875), // sin(81°) + Q_4_12(0.990234375), // sin(82°) + Q_4_12(0.992431640625), // sin(83°) + Q_4_12(0.994384765625), // sin(84°) + Q_4_12(0.99609375), // sin(85°) + Q_4_12(0.99755859375), // sin(86°) + Q_4_12(0.99853515625), // sin(87°) + Q_4_12(0.999267578125), // sin(88°) + Q_4_12(0.999755859375), // sin(89°) + Q_4_12(1), // sin(90°) + Q_4_12(0.999755859375), // sin(91°) + Q_4_12(0.999267578125), // sin(92°) + Q_4_12(0.99853515625), // sin(93°) + Q_4_12(0.99755859375), // sin(94°) + Q_4_12(0.99609375), // sin(95°) + Q_4_12(0.994384765625), // sin(96°) + Q_4_12(0.992431640625), // sin(97°) + Q_4_12(0.990234375), // sin(98°) + Q_4_12(0.98779296875), // sin(99°) + Q_4_12(0.98486328125), // sin(100°) + Q_4_12(0.981689453125), // sin(101°) + Q_4_12(0.97802734375), // sin(102°) + Q_4_12(0.974365234375), // sin(103°) + Q_4_12(0.97021484375), // sin(104°) + Q_4_12(0.9658203125), // sin(105°) + Q_4_12(0.961181640625), // sin(106°) + Q_4_12(0.956298828125), // sin(107°) + Q_4_12(0.951171875), // sin(108°) + Q_4_12(0.945556640625), // sin(109°) + Q_4_12(0.939697265625), // sin(110°) + Q_4_12(0.93359375), // sin(111°) + Q_4_12(0.92724609375), // sin(112°) + Q_4_12(0.92041015625), // sin(113°) + Q_4_12(0.91357421875), // sin(114°) + Q_4_12(0.90625), // sin(115°) + Q_4_12(0.898681640625), // sin(116°) + Q_4_12(0.89111328125), // sin(117°) + Q_4_12(0.883056640625), // sin(118°) + Q_4_12(0.87451171875), // sin(119°) + Q_4_12(0.865966796875), // sin(120°) + Q_4_12(0.857177734375), // sin(121°) + Q_4_12(0.84814453125), // sin(122°) + Q_4_12(0.838623046875), // sin(123°) + Q_4_12(0.8291015625), // sin(124°) + Q_4_12(0.819091796875), // sin(125°) + Q_4_12(0.80908203125), // sin(126°) + Q_4_12(0.798583984375), // sin(127°) + Q_4_12(0.7880859375), // sin(128°) + Q_4_12(0.777099609375), // sin(129°) + Q_4_12(0.76611328125), // sin(130°) + Q_4_12(0.754638671875), // sin(131°) + Q_4_12(0.7431640625), // sin(132°) + Q_4_12(0.7314453125), // sin(133°) + Q_4_12(0.71923828125), // sin(134°) + Q_4_12(0.70703125), // sin(135°) + Q_4_12(0.694580078125), // sin(136°) + Q_4_12(0.681884765625), // sin(137°) + Q_4_12(0.669189453125), // sin(138°) + Q_4_12(0.656005859375), // sin(139°) + Q_4_12(0.642822265625), // sin(140°) + Q_4_12(0.62939453125), // sin(141°) + Q_4_12(0.61572265625), // sin(142°) + Q_4_12(0.601806640625), // sin(143°) + Q_4_12(0.587890625), // sin(144°) + Q_4_12(0.573486328125), // sin(145°) + Q_4_12(0.55908203125), // sin(146°) + Q_4_12(0.544677734375), // sin(147°) + Q_4_12(0.530029296875), // sin(148°) + Q_4_12(0.51513671875), // sin(149°) + Q_4_12(0.5), // sin(150°) + Q_4_12(0.48486328125), // sin(151°) + Q_4_12(0.469482421875), // sin(152°) + Q_4_12(0.4541015625), // sin(153°) + Q_4_12(0.4384765625), // sin(154°) + Q_4_12(0.422607421875), // sin(155°) + Q_4_12(0.40673828125), // sin(156°) + Q_4_12(0.390625), // sin(157°) + Q_4_12(0.37451171875), // sin(158°) + Q_4_12(0.3583984375), // sin(159°) + Q_4_12(0.342041015625), // sin(160°) + Q_4_12(0.32568359375), // sin(161°) + Q_4_12(0.30908203125), // sin(162°) + Q_4_12(0.29248046875), // sin(163°) + Q_4_12(0.275634765625), // sin(164°) + Q_4_12(0.2587890625), // sin(165°) + Q_4_12(0.241943359375), // sin(166°) + Q_4_12(0.224853515625), // sin(167°) + Q_4_12(0.2080078125), // sin(168°) + Q_4_12(0.19091796875), // sin(169°) + Q_4_12(0.173583984375), // sin(170°) + Q_4_12(0.156494140625), // sin(171°) + Q_4_12(0.13916015625), // sin(172°) + Q_4_12(0.121826171875), // sin(173°) + Q_4_12(0.1044921875), // sin(174°) + Q_4_12(0.087158203125), // sin(175°) + Q_4_12(0.06982421875), // sin(176°) + Q_4_12(0.05224609375), // sin(177°) + Q_4_12(0.034912109375), // sin(178°) + Q_4_12(0.017333984375), // sin(179°) +}; + +// amplitude * sin(index*(π/128)) +s16 Sin(s16 index, s16 amplitude) +{ + return (amplitude * gSineTable[index]) >> 8; +} + +// amplitude * cos(index*(π/128)) +s16 Cos(s16 index, s16 amplitude) +{ + return (amplitude * gSineTable[index + 64]) >> 8; +} + +// angle in degrees +s16 Sin2(u16 angle) +{ + s32 angleMod = angle % 180; + s32 negate = ((angle / 180) & 1); + s16 value = gSineDegreeTable[angleMod]; + + if (negate) + return -value; + else + return value; +} + +// angle in degrees +s16 Cos2(u16 angle) +{ + return Sin2(angle + 90); +} diff --git a/src/tv.c b/src/tv.c new file mode 100644 index 000000000..6c24170ae --- /dev/null +++ b/src/tv.c @@ -0,0 +1,3589 @@ +#include "global.h" +#include "tv.h" +#include "battle_tower.h" +#include "contest_painting.h" +#include "data2.h" +#include "easy_chat.h" +#include "event_data.h" +#include "fieldmap.h" +#include "field_message_box.h" +#include "field_camera.h" +#include "constants/flags.h" +#include "random.h" +#include "string_util.h" +#include "text.h" +#include "constants/species.h" +#include "pokedex.h" +#include "naming_screen.h" +#include "overworld.h" +#include "constants/maps.h" +#include "strings.h" +#include "battle.h" +#include "link.h" +#include "constants/easy_chat.h" +#include "event_object_movement.h" +#include "field_specials.h" +#include "item.h" +#include "constants/items.h" +#include "link.h" +#include "constants/maps.h" +#include "naming_screen.h" +#include "pokedex.h" +#include "region_map.h" +#include "random.h" +#include "overworld.h" +#include "rtc.h" +#include "script_menu.h" +#include "constants/species.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" +#include "ewram.h" +#include "constants/moves.h" +#include "region_map_sections.h" + +struct UnkTvStruct +{ + s8 var0; +}; + +struct OutbreakPokemon +{ + /*0x00*/ u16 species; + /*0x02*/ u16 moves[4]; + /*0x0A*/ u8 level; + /*0x0B*/ u8 location; +}; + +struct TVSaleItem { + u16 item_id; + u16 item_amount; +}; + +extern u8 gUnknown_02038694; + +extern struct TVSaleItem gMartPurchaseHistory[3]; + +struct UnkTvStruct gUnknown_03005D38; + +extern u16 gSpecialVar_LastTalked; + +extern u8 gSpecialVar_ContestCategory; +extern u8 gSpecialVar_ContestRank; +extern u8 gUnknown_03004316[11]; +extern u8 gBattleOutcome; + +extern u16 gLastUsedItem; + +static EWRAM_DATA u16 gUnknown_020387E0 = 0; +static EWRAM_DATA u16 gUnknown_020387E2 = 0; +static EWRAM_DATA u8 gUnknown_020387E4 = 0; +static EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0; // why is this aligned to a 4-byte boundary? + +static u8 gUnknown_03000720; +static u8 gUnknown_03000721; +static s8 gUnknown_03000722; + +const struct OutbreakPokemon gPokeOutbreakSpeciesList[5] = +{ + { + .species = SPECIES_SURSKIT, + .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE}, + .level = 3, + .location = MAPSEC_Route102, + }, + { + .species = SPECIES_SURSKIT, + .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE}, + .level = 15, + .location = MAPSEC_Route114, + }, + { + .species = SPECIES_SURSKIT, + .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE}, + .level = 15, + .location = MAPSEC_Route117, + }, + { + .species = SPECIES_SURSKIT, + .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE}, + .level = 28, + .location = MAPSEC_Route120, + }, + { + .species = SPECIES_SKITTY, + .moves = {MOVE_GROWL, MOVE_TACKLE, MOVE_NONE, MOVE_NONE}, + .level = 15, + .location = MAPSEC_Route116, + }, +}; + +extern const u8 gTVNewsText_EnergyGuru1[]; +extern const u8 gTVNewsText_GameCorner1[]; +extern const u8 gTVNewsText_LilycoveDepartment1[]; +extern const u8 gTVNewsText_EnergyGuru2[]; +extern const u8 gTVNewsText_GameCorner2[]; +extern const u8 gTVNewsText_LilycoveDepartment2[]; +extern const u8 gTVNewsText_EnergyGuru3[]; +extern const u8 gTVNewsText_GameCorner3[]; +extern const u8 gTVNewsText_LilycoveDepartment3[]; +extern const u8 gTVFanClubText1[]; +extern const u8 gTVFanClubText2[]; +extern const u8 gTVFanClubText3[]; +extern const u8 gTVFanClubText4[]; +extern const u8 gTVFanClubText5[]; +extern const u8 gTVFanClubText6[]; +extern const u8 gTVFanClubText7[]; +extern const u8 gTVFanClubText8[]; +extern const u8 gTVRecentHappeningsText1[]; +extern const u8 gTVRecentHappeningsText2[]; +extern const u8 gTVRecentHappeningsText3[]; +extern const u8 gTVRecentHappeningsText4[]; +extern const u8 gTVRecentHappeningsText5[]; +extern const u8 gTVRecentHappeningsText6[]; +extern const u8 gTVFanClubOpinionsText1[]; +extern const u8 gTVFanClubOpinionsText2[]; +extern const u8 gTVFanClubOpinionsText3[]; +extern const u8 gTVFanClubOpinionsText4[]; +extern const u8 gTVFanClubOpinionsText5[]; +extern const u8 gTVPokemonOutbreakText[]; +extern const u8 gTVPokemonTodayText1[]; +extern const u8 gTVPokemonTodayText2[]; +extern const u8 gTVPokemonTodayText3[]; +extern const u8 gTVPokemonTodayText4[]; +extern const u8 gTVPokemonTodayText5[]; +extern const u8 gTVPokemonTodayText6[]; +extern const u8 gTVPokemonTodayText7[]; +extern const u8 gTVPokemonTodayText8[]; +extern const u8 gTVPokemonTodayText9[]; +extern const u8 gTVPokemonTodayText10[]; +extern const u8 gTVPokemonTodayText11[]; +extern const u8 gTVPokemonTodayText12[]; +extern const u8 gTVSmartShopperText1[]; +extern const u8 gTVSmartShopperText2[]; +extern const u8 gTVSmartShopperText3[]; +extern const u8 gTVSmartShopperText4[]; +extern const u8 gTVSmartShopperText5[]; +extern const u8 gTVSmartShopperText6[]; +extern const u8 gTVSmartShopperText7[]; +extern const u8 gTVSmartShopperText8[]; +extern const u8 gTVSmartShopperText9[]; +extern const u8 gTVSmartShopperText10[]; +extern const u8 gTVSmartShopperText11[]; +extern const u8 gTVSmartShopperText12[]; +extern const u8 gTVSmartShopperText13[]; +extern const u8 gTVBravoTrainerText1[]; +extern const u8 gTVBravoTrainerText2[]; +extern const u8 gTVBravoTrainerText3[]; +extern const u8 gTVBravoTrainerText4[]; +extern const u8 gTVBravoTrainerText5[]; +extern const u8 gTVBravoTrainerText6[]; +extern const u8 gTVBravoTrainerText7[]; +extern const u8 gTVBravoTrainerText8[]; +extern const u8 gTVBravoTrainerText9[]; +extern const u8 gTVBravoTrainerBattleTowerText1[]; +extern const u8 gTVBravoTrainerBattleTowerText2[]; +extern const u8 gTVBravoTrainerBattleTowerText3[]; +extern const u8 gTVBravoTrainerBattleTowerText4[]; +extern const u8 gTVBravoTrainerBattleTowerText5[]; +extern const u8 gTVBravoTrainerBattleTowerText6[]; +extern const u8 gTVBravoTrainerBattleTowerText7[]; +extern const u8 gTVBravoTrainerBattleTowerText8[]; +extern const u8 gTVBravoTrainerBattleTowerText9[]; +extern const u8 gTVBravoTrainerBattleTowerText10[]; +extern const u8 gTVBravoTrainerBattleTowerText11[]; +extern const u8 gTVBravoTrainerBattleTowerText12[]; +extern const u8 gTVBravoTrainerBattleTowerText13[]; +extern const u8 gTVBravoTrainerBattleTowerText14[]; +extern const u8 gTVBravoTrainerBattleTowerText15[]; +extern const u8 gTVNameRaterText1[]; +extern const u8 gTVNameRaterText2[]; +extern const u8 gTVNameRaterText3[]; +extern const u8 gTVNameRaterText4[]; +extern const u8 gTVNameRaterText5[]; +extern const u8 gTVNameRaterText6[]; +extern const u8 gTVNameRaterText7[]; +extern const u8 gTVNameRaterText8[]; +extern const u8 gTVNameRaterText9[]; +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 gTVNameRaterText19[]; +extern const u8 gTVPokemonTodayFailedCaptureText1[]; +extern const u8 gTVPokemonTodayFailedCaptureText2[]; +extern const u8 gTVPokemonTodayFailedCaptureText3[]; +extern const u8 gTVPokemonTodayFailedCaptureText4[]; +extern const u8 gTVPokemonTodayFailedCaptureText5[]; +extern const u8 gTVPokemonTodayFailedCaptureText6[]; +extern const u8 gTVPokemonTodayFailedCaptureText7[]; +extern const u8 gTVFishingGuruAdviceText1[]; +extern const u8 gTVFishingGuruAdviceText2[]; +extern const u8 gTVWorldOfMastersText1[]; +extern const u8 gTVWorldOfMastersText2[]; +extern const u8 gTVWorldOfMastersText3[]; +extern const u8 gTVGabbyAndTyText1[]; +extern const u8 gTVGabbyAndTyText2[]; +extern const u8 gTVGabbyAndTyText3[]; +extern const u8 gTVGabbyAndTyText4[]; +extern const u8 gTVGabbyAndTyText5[]; +extern const u8 gTVGabbyAndTyText6[]; +extern const u8 gTVGabbyAndTyText7[]; +extern const u8 gTVGabbyAndTyText8[]; +extern const u8 gTVGabbyAndTyText9[]; + +const u8 *const gTVNewsTextGroup1[] = +{ + NULL, + gTVNewsText_EnergyGuru1, + gTVNewsText_GameCorner1, + gTVNewsText_LilycoveDepartment1, +}; + +const u8 *const gTVNewsTextGroup2[] = +{ + NULL, + gTVNewsText_EnergyGuru2, + gTVNewsText_GameCorner2, + gTVNewsText_LilycoveDepartment2, +}; + +const u8 *const gTVNewsTextGroup3[] = +{ + NULL, + gTVNewsText_EnergyGuru3, + gTVNewsText_GameCorner3, + gTVNewsText_LilycoveDepartment3, +}; + +u8 *const gUnknown_083D1464[] = +{ + gStringVar1, + gStringVar2, + gStringVar3, +}; + +const u8 *const gTVFanClubTextGroup[] = +{ + gTVFanClubText1, + gTVFanClubText2, + gTVFanClubText3, + gTVFanClubText4, + gTVFanClubText5, + gTVFanClubText6, + gTVFanClubText7, + gTVFanClubText8, +}; + +const u8 *const gTVRecentHappeningsTextGroup[] = +{ + gTVRecentHappeningsText1, + gTVRecentHappeningsText2, + gTVRecentHappeningsText3, + gTVRecentHappeningsText4, + gTVRecentHappeningsText5, + gTVRecentHappeningsText6, +}; + +const u8 *const gTVFanClubOpinionsTextGroup[] = +{ + gTVFanClubOpinionsText1, + gTVFanClubOpinionsText2, + gTVFanClubOpinionsText3, + gTVFanClubOpinionsText4, + gTVFanClubOpinionsText5, +}; + +const u8 *const gTVPokemonOutbreakTextGroup[] = +{ + gTVPokemonOutbreakText, +}; + +const u8 *const gTVPokemonTodayTextGroup[] = +{ + gTVPokemonTodayText1, + gTVPokemonTodayText2, + gTVPokemonTodayText3, + gTVPokemonTodayText4, + gTVPokemonTodayText5, + gTVPokemonTodayText6, + gTVPokemonTodayText7, + gTVPokemonTodayText8, + gTVPokemonTodayText9, + gTVPokemonTodayText10, + gTVPokemonTodayText11, + gTVPokemonTodayText12, +}; + +const u8 *const gTVSmartShopperTextGroup[] = +{ + gTVSmartShopperText1, + gTVSmartShopperText2, + gTVSmartShopperText3, + gTVSmartShopperText4, + gTVSmartShopperText5, + gTVSmartShopperText6, + gTVSmartShopperText7, + gTVSmartShopperText8, + gTVSmartShopperText9, + gTVSmartShopperText10, + gTVSmartShopperText11, + gTVSmartShopperText12, + gTVSmartShopperText13, +}; + +const u8 *const gTVBravoTrainerTextGroup[] = +{ + gTVBravoTrainerText1, + gTVBravoTrainerText2, + gTVBravoTrainerText3, + gTVBravoTrainerText4, + gTVBravoTrainerText5, + gTVBravoTrainerText6, + gTVBravoTrainerText7, + gTVBravoTrainerText8, + gTVBravoTrainerText9, +}; + +const u8 *const gTVBravoTrainerBattleTowerTextGroup[] = +{ + gTVBravoTrainerBattleTowerText1, + gTVBravoTrainerBattleTowerText2, + gTVBravoTrainerBattleTowerText3, + gTVBravoTrainerBattleTowerText4, + gTVBravoTrainerBattleTowerText5, + gTVBravoTrainerBattleTowerText6, + gTVBravoTrainerBattleTowerText7, + gTVBravoTrainerBattleTowerText8, + gTVBravoTrainerBattleTowerText9, + gTVBravoTrainerBattleTowerText10, + gTVBravoTrainerBattleTowerText11, + gTVBravoTrainerBattleTowerText12, + gTVBravoTrainerBattleTowerText13, + gTVBravoTrainerBattleTowerText14, + gTVBravoTrainerBattleTowerText15, +}; + +const u8 *const gTVNameRaterTextGroup[] = +{ + gTVNameRaterText1, + gTVNameRaterText2, + gTVNameRaterText3, + gTVNameRaterText4, + gTVNameRaterText5, + gTVNameRaterText6, + gTVNameRaterText7, + gTVNameRaterText8, + gTVNameRaterText9, + gTVNameRaterText10, + gTVNameRaterText11, + gTVNameRaterText12, + gTVNameRaterText13, + gTVNameRaterText14, + gTVNameRaterText15, + gTVNameRaterText16, + gTVNameRaterText17, + gTVNameRaterText18, + gTVNameRaterText19, +}; + +const u8 *const gTVPokemonTodayFailedCaptureTextGroup[] = +{ + gTVPokemonTodayFailedCaptureText1, + gTVPokemonTodayFailedCaptureText2, + gTVPokemonTodayFailedCaptureText3, + gTVPokemonTodayFailedCaptureText4, + gTVPokemonTodayFailedCaptureText5, + gTVPokemonTodayFailedCaptureText6, + gTVPokemonTodayFailedCaptureText7, +}; + +const u8 *const gTVFishingGuruAdviceTextGroup[] = +{ + gTVFishingGuruAdviceText1, + gTVFishingGuruAdviceText2, +}; + +const u8 *const gTVWorldOfMastersTextGroup[] = +{ + gTVWorldOfMastersText1, + gTVWorldOfMastersText2, + gTVWorldOfMastersText3, +}; + +const u8 *const gTVGabbyAndTyTextGroup[] = +{ + gTVGabbyAndTyText1, + gTVGabbyAndTyText2, + gTVGabbyAndTyText3, + gTVGabbyAndTyText4, + gTVGabbyAndTyText5, + gTVGabbyAndTyText6, + gTVGabbyAndTyText7, + gTVGabbyAndTyText8, + gTVGabbyAndTyText9, +}; + +void ClearTVShowData(void) +{ + u8 showidx; + u8 extradataidx; + for (showidx=0; showidx<25; showidx++) { + gSaveBlock1.tvShows[showidx].common.kind = 0; + gSaveBlock1.tvShows[showidx].common.active = 0; + for (extradataidx=0; extradataidx<34; extradataidx++) { + gSaveBlock1.tvShows[showidx].common.pad02[extradataidx] = 0; + } + } + sub_80BEBF4(); +} + +bool8 sub_80BF1B4(u8); +void sub_80BF20C(void); +extern u8 gSpecialVar_ContestCategory; +extern u8 gSpecialVar_ContestRank; +extern u8 gUnknown_03004316[11]; +extern u8 gBattleOutcome; + +void InterviewBefore_FanClubLetter(void); +void InterviewBefore_RecentHappenings(void); +void InterviewBefore_PkmnFanClubOpinions(void); +void InterviewBefore_Dummy(void); +void InterviewBefore_NameRater(void); +void InterviewBefore_BravoTrainerPkmnProfile(void); +void InterviewBefore_BravoTrainerBTProfile(void); + +void sub_80BE028(void); +void sub_80BE074(void); +void sub_80BE778(void); +void sub_80BEB20(void); + +u8 GetTVChannelByShowType(u8); + +s8 sub_80BF74C(TVShow tvShow[]); + +void sub_80BF55C(TVShow tvShow[], u8 showidx); +void sub_80BEA88(void); + +void sub_80BE138(TVShow *show); +void sub_80BE160(TVShow *show); +extern u16 gLastUsedItem; + +void InterviewAfter_FanClubLetter(void); +void InterviewAfter_RecentHappenings(void); +void InterviewAfter_PkmnFanClubOpinions(void); +void InterviewAfter_DummyShow4(void); +void InterviewAfter_BravoTrainerPokemonProfile(void); +void InterviewAfter_BravoTrainerBattleTowerProfile(void); + +u8 special_0x44(void) +{ + u8 i; + u8 j; + u8 selIdx; + TVShow *show; + + for (i = 5; i < ARRAY_COUNT(gSaveBlock1.tvShows) - 1; i++) + { + if (gSaveBlock1.tvShows[i].common.kind == 0) + { + break; + } + } + + j = Random() % i; + selIdx = j; + + do + { + if (GetTVChannelByShowType(gSaveBlock1.tvShows[j].common.kind) != 4) + { + if (gSaveBlock1.tvShows[j].common.active == TRUE) + { + return j; + } + } + else + { + show = &gSaveBlock1.tvShows[j]; + if (show->massOutbreak.daysLeft == 0 && show->massOutbreak.active == TRUE) + { + return j; + } + } + if (j == 0) + { + j = ARRAY_COUNT(gSaveBlock1.tvShows) - 2; + } + else + { + j--; + } + } while (j != selIdx); + + return 0xFF; +} + +u8 FindNonMassOutbreakActiveTVShow(void); + +u8 sub_80BD8B8(void) +{ + u8 retval = special_0x44(); + + if (retval == 0xff) + return 0xff; + if (gSaveBlock1.outbreakPokemonSpecies != 0 && gSaveBlock1.tvShows[retval].common.kind == TVSHOW_MASS_OUTBREAK) + return FindNonMassOutbreakActiveTVShow(); + return retval; +} + +u8 CheckForBigMovieOrEmergencyNewsOnTV(void); +void SetTVMetatilesOnMap(int, int, u16); +bool8 FindAnyTVNewsOnTheAir(void); +bool8 IsTVShowInSearchOfTrainersAiring(void); + +void UpdateTVScreensOnMap(int width, int height) +{ + FlagSet(FLAG_SYS_TV_WATCH); + switch (CheckForBigMovieOrEmergencyNewsOnTV()) + { + case 1: + SetTVMetatilesOnMap(width, height, 0x3); + break; + case 2: + break; + default: + if (gSaveBlock1.location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F) + && gSaveBlock1.location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F)) + { + SetTVMetatilesOnMap(width, height, 0x3); + } + else if (FlagGet(FLAG_SYS_TV_START) && (sub_80BD8B8() != 0xff || FindAnyTVNewsOnTheAir() != 0xff || IsTVShowInSearchOfTrainersAiring())) + { + FlagClear(FLAG_SYS_TV_WATCH); + SetTVMetatilesOnMap(width, height, 0x3); + } + break; + } +} + +void SetTVMetatilesOnMap(int width, int height, u16 tileId) +{ + int x; + int y; + + for (y=0; ycommon.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1.outbreakPokemonSpecies) + return FindNonMassOutbreakActiveTVShow(); + return gSpecialVar_0x8004; +} + +void ResetGabbyAndTy(void) +{ + gSaveBlock1.gabbyAndTyData.mon1 = 0; + gSaveBlock1.gabbyAndTyData.mon2 = 0; + gSaveBlock1.gabbyAndTyData.lastMove = 0; + gSaveBlock1.gabbyAndTyData.quote = 0xffff; + gSaveBlock1.gabbyAndTyData.valA_0 = 0; + gSaveBlock1.gabbyAndTyData.valA_1 = 0; + gSaveBlock1.gabbyAndTyData.valA_2 = 0; + gSaveBlock1.gabbyAndTyData.valA_3 = 0; + gSaveBlock1.gabbyAndTyData.valA_4 = 0; + gSaveBlock1.gabbyAndTyData.valA_5 = 0; + gSaveBlock1.gabbyAndTyData.valB_0 = 0; + gSaveBlock1.gabbyAndTyData.valB_1 = 0; + gSaveBlock1.gabbyAndTyData.valB_2 = 0; + gSaveBlock1.gabbyAndTyData.valB_3 = 0; + gSaveBlock1.gabbyAndTyData.valB_4 = 0; + gSaveBlock1.gabbyAndTyData.valB_5 = 0; + gSaveBlock1.gabbyAndTyData.mapnum = 0; + gSaveBlock1.gabbyAndTyData.battleNum = 0; +} + +void TakeTVShowInSearchOfTrainersOffTheAir(void); + +void GabbyAndTyBeforeInterview(void) +{ + u8 i; + + gSaveBlock1.gabbyAndTyData.mon1 = gBattleResults.poke1Species; + gSaveBlock1.gabbyAndTyData.mon2 = gBattleResults.opponentSpecies; + gSaveBlock1.gabbyAndTyData.lastMove = gBattleResults.lastUsedMove; + if (gSaveBlock1.gabbyAndTyData.battleNum != 0xff) + gSaveBlock1.gabbyAndTyData.battleNum ++; + gSaveBlock1.gabbyAndTyData.valA_0 = gBattleResults.unk5_0; + + if (gBattleResults.playerFaintCounter) + gSaveBlock1.gabbyAndTyData.valA_1 = 1; + else + gSaveBlock1.gabbyAndTyData.valA_1 = 0; + + if (gBattleResults.unk3) + gSaveBlock1.gabbyAndTyData.valA_2 = 1; + else + gSaveBlock1.gabbyAndTyData.valA_2 = 0; + + if (!gBattleResults.unk5_1) + { + for (i=0; i<11; i++) + { + if (gBattleResults.unk36[i] != 0) + { + gSaveBlock1.gabbyAndTyData.valA_3 = 1; + break; + } + } + } + else + { + gSaveBlock1.gabbyAndTyData.valA_3 = 1; + } + + TakeTVShowInSearchOfTrainersOffTheAir(); + if (gSaveBlock1.gabbyAndTyData.lastMove == 0) + FlagSet(FLAG_TEMP_1); +} + +void GabbyAndTyAfterInterview(void) +{ + gSaveBlock1.gabbyAndTyData.valB_0 = gSaveBlock1.gabbyAndTyData.valA_0; + gSaveBlock1.gabbyAndTyData.valB_1 = gSaveBlock1.gabbyAndTyData.valA_1; + gSaveBlock1.gabbyAndTyData.valB_2 = gSaveBlock1.gabbyAndTyData.valA_2; + gSaveBlock1.gabbyAndTyData.valB_3 = gSaveBlock1.gabbyAndTyData.valA_3; + gSaveBlock1.gabbyAndTyData.valA_4 = 1; + gSaveBlock1.gabbyAndTyData.mapnum = gMapHeader.regionMapSectionId; + IncrementGameStat(GAME_STAT_GOT_INTERVIEWED); +} + +void TakeTVShowInSearchOfTrainersOffTheAir(void) +{ + gSaveBlock1.gabbyAndTyData.valA_4 = 0; +} + +u8 GabbyAndTyGetBattleNum(void) +{ + if (gSaveBlock1.gabbyAndTyData.battleNum >= 6) + return (gSaveBlock1.gabbyAndTyData.battleNum % 3) + 6; + else + return gSaveBlock1.gabbyAndTyData.battleNum; +} + +bool8 IsTVShowInSearchOfTrainersAiring(void) +{ + return gSaveBlock1.gabbyAndTyData.valA_4; +} + +bool8 GabbyAndTyGetLastQuote(void) +{ + if (gSaveBlock1.gabbyAndTyData.quote == 0xffff) + return FALSE; + + EasyChat_GetWordText(gStringVar1, gSaveBlock1.gabbyAndTyData.quote); + gSaveBlock1.gabbyAndTyData.quote |= 0xffff; + return TRUE; +} + +u8 GabbyAndTyGetLastBattleTrivia(void) +{ + if (!gSaveBlock1.gabbyAndTyData.valB_0) + return 1; + if (gSaveBlock1.gabbyAndTyData.valB_3) + return 2; + if (gSaveBlock1.gabbyAndTyData.valB_2) + return 3; + if (gSaveBlock1.gabbyAndTyData.valB_1) + return 4; + return 0; +} + +void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void) +{ + switch (GabbyAndTyGetBattleNum()) + { + case 1: + gSpecialVar_0x8004 = 0xE; + gSpecialVar_0x8005 = 0xD; + break; + case 2: + gSpecialVar_0x8004 = 0x5; + gSpecialVar_0x8005 = 0x6; + break; + case 3: + gSpecialVar_0x8004 = 0x12; + gSpecialVar_0x8005 = 0x11; + break; + case 4: + gSpecialVar_0x8004 = 0x15; + gSpecialVar_0x8005 = 0x16; + break; + case 5: + gSpecialVar_0x8004 = 0x8; + gSpecialVar_0x8005 = 0x9; + break; + case 6: + gSpecialVar_0x8004 = 0x13; + gSpecialVar_0x8005 = 0x14; + break; + case 7: + gSpecialVar_0x8004 = 0x17; + gSpecialVar_0x8005 = 0x18; + break; + case 8: + gSpecialVar_0x8004 = 0xA; + gSpecialVar_0x8005 = 0xB; + break; + } +} + +void InterviewAfter(void) +{ + switch (gSpecialVar_0x8005) + { + case TVSHOW_FAN_CLUB_LETTER: + InterviewAfter_FanClubLetter(); + break; + case TVSHOW_RECENT_HAPPENINGS: + InterviewAfter_RecentHappenings(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + InterviewAfter_PkmnFanClubOpinions(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + InterviewAfter_DummyShow4(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + InterviewAfter_BravoTrainerPokemonProfile(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + InterviewAfter_BravoTrainerBattleTowerProfile(); + break; + } +} + +u8 sub_80BDEAC(u8 *a0) +{ + u8 lang = GAME_LANGUAGE; + + if (a0[0] == EXT_CTRL_CODE_BEGIN && a0[1] == 0x15) + lang = LANGUAGE_JAPANESE; + return lang; +} + +void PutPokemonTodayCaughtOnAir(void) +{ + u8 i; + u16 total; + u16 item; + + total = 0; + sub_80BEB20(); + sub_80BE778(); + + if (gBattleResults.caughtPoke == 0) + { + sub_80BE074(); + } + else + { + sub_80BE028(); + if (sub_80BF77C(0xffff) == 0 && StringCompareWithoutExtCtrlCodes(gSpeciesNames[gBattleResults.caughtPoke], gBattleResults.caughtNick) != 0) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_CAUGHT) != 1) + { + for (i = 0; i < 11; i++) + total += gBattleResults.unk36[i]; + if (total != 0 || gBattleResults.unk5_1 != 0) + { + struct TVShowPokemonToday *pokemonToday; + + total = 0; + pokemonToday = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonToday; + pokemonToday->kind = TVSHOW_POKEMON_TODAY_CAUGHT; + pokemonToday->active = total; + if (gBattleResults.unk5_1 != 0) + { + total = 1; + item = ITEM_MASTER_BALL; + } + else + { + for (i = 0; i < 11; i++) + total += gBattleResults.unk36[i]; + if (total > 0xff) + total = 0xff; + item = gLastUsedItem; + } + pokemonToday->var12 = total; + pokemonToday->ball = item; + StringCopy(pokemonToday->playerName, gSaveBlock2.playerName); + StringCopy(pokemonToday->nickname, gBattleResults.caughtNick); + pokemonToday->species = gBattleResults.caughtPoke; + sub_80BE138((TVShow *)pokemonToday); + pokemonToday->language = GAME_LANGUAGE; + pokemonToday->language2 = sub_80BDEAC(pokemonToday->nickname); + Text_StripExtCtrlCodes(pokemonToday->nickname); + } + } + } + } +} + +void sub_80BE028(void) +{ + struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters; + + if (worldOfMasters->kind != TVSHOW_WORLD_OF_MASTERS) + { + sub_80BF55C(gSaveBlock1.tvShows, 24); + worldOfMasters->var06 = GetGameStat(GAME_STAT_STEPS); + worldOfMasters->kind = TVSHOW_WORLD_OF_MASTERS; + } + worldOfMasters->var02++; + worldOfMasters->var04 = gBattleResults.caughtPoke; + worldOfMasters->var08 = gBattleResults.poke1Species; + worldOfMasters->var0a = gMapHeader.regionMapSectionId; +} + +void sub_80BE074(void) +{ + u8 i; + u16 total; + u8 zero = 0; + + if (sub_80BF77C(0xffff) == 0) + { + for (i = 0, total = 0; i < ARRAY_COUNT(gUnknown_03004316); i++) + total += gUnknown_03004316[i]; + if (total > 0xff) + total = 0xff; + if (total > 2 && gBattleOutcome == 1) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_FAILED) != 1) + { + struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonTodayFailed; + + zero = 0; + pokemonTodayFailed->kind = TVSHOW_POKEMON_TODAY_FAILED; + pokemonTodayFailed->active = zero; + pokemonTodayFailed->species = gBattleResults.poke1Species; + pokemonTodayFailed->species2 = gBattleResults.lastOpponentSpecies; + pokemonTodayFailed->var10 = total; + pokemonTodayFailed->var11 = gBattleOutcome; + pokemonTodayFailed->var12 = gMapHeader.regionMapSectionId; + StringCopy(pokemonTodayFailed->playerName, gSaveBlock2.playerName); + sub_80BE138((TVShow *)pokemonTodayFailed); + pokemonTodayFailed->language = GAME_LANGUAGE; + } + } + } +} + + +void sub_80BE138(TVShow *show) +{ + u32 playerId = GetPlayerTrainerId(); + + show->common.srcTrainerId2Lo = playerId & 0xFF; + show->common.srcTrainerId2Hi = playerId >> 8; + show->common.srcTrainerIdLo = playerId & 0xFF; + show->common.srcTrainerIdHi = playerId >> 8; + show->common.trainerIdLo = playerId & 0xFF; + show->common.trainerIdHi = playerId >> 8; +} + +void sub_80BE160(TVShow *show) +{ + u32 playerId = GetPlayerTrainerId(); + + show->common.srcTrainerIdLo = playerId & 0xFF; + show->common.srcTrainerIdHi = playerId >> 8; + show->common.trainerIdLo = playerId & 0xFF; + show->common.trainerIdHi = playerId >> 8; +} + +void InterviewAfter_BravoTrainerPokemonProfile(void) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainerSrc = &gSaveBlock1.tvShows[24].bravoTrainer; + + if (bravoTrainerSrc->kind == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE) + { + struct TVShowBravoTrainerPokemonProfiles *bravoTrainerNew = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer; + + bravoTrainerNew->kind = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; + bravoTrainerNew->active = 1; + bravoTrainerNew->species = bravoTrainerSrc->species; + StringCopy(bravoTrainerNew->playerName, gSaveBlock2.playerName); + StringCopy(bravoTrainerNew->pokemonNickname, bravoTrainerSrc->pokemonNickname); + bravoTrainerNew->contestCategory = bravoTrainerSrc->contestCategory; + bravoTrainerNew->contestRank = bravoTrainerSrc->contestRank; + bravoTrainerNew->var14 = bravoTrainerSrc->var14; + bravoTrainerNew->contestResult = bravoTrainerSrc->contestResult; + bravoTrainerNew->contestCategory = bravoTrainerSrc->contestCategory; + sub_80BE160((TVShow *)bravoTrainerNew); + bravoTrainerNew->language = GAME_LANGUAGE; + bravoTrainerNew->var1f = sub_80BDEAC(bravoTrainerNew->pokemonNickname); + Text_StripExtCtrlCodes(bravoTrainerNew->pokemonNickname); + } +} + +void sub_80BE23C(u16 a0) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer; + + InterviewBefore_BravoTrainerPkmnProfile(); + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1) + { + sub_80BF55C(gSaveBlock1.tvShows, 24); + bravoTrainer->var14 = a0; + bravoTrainer->kind = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE; + } +} + +void sub_80BE284(u8 a0) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer; + + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1) + { + bravoTrainer->contestResult = a0; + bravoTrainer->contestCategory = gSpecialVar_ContestCategory; + bravoTrainer->contestRank = gSpecialVar_ContestRank; + bravoTrainer->species = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_SPECIES, NULL); + GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_NICKNAME, bravoTrainer->pokemonNickname); + } +} + +void InterviewAfter_BravoTrainerBattleTowerProfile(void) +{ + struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower; + + bravoTrainerTower->kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; + bravoTrainerTower->active = 1; + StringCopy(bravoTrainerTower->trainerName, gSaveBlock2.playerName); + StringCopy(bravoTrainerTower->pokemonName, gSaveBlock2.battleTower.defeatedByTrainerName); + bravoTrainerTower->species = gSaveBlock2.battleTower.firstMonSpecies; + bravoTrainerTower->defeatedSpecies = gSaveBlock2.battleTower.defeatedBySpecies; + bravoTrainerTower->var16 = GetCurrentBattleTowerWinStreak(gSaveBlock2.battleTower.lastStreakLevelType); + bravoTrainerTower->var1c = gSaveBlock2.battleTower.battleOutcome; + if (gSaveBlock2.battleTower.lastStreakLevelType == 0) + bravoTrainerTower->btLevel = 50; + else + bravoTrainerTower->btLevel = 100; + bravoTrainerTower->var1b = gSpecialVar_0x8004; + sub_80BE160((TVShow *)bravoTrainerTower); + bravoTrainerTower->language = GAME_LANGUAGE; +} + +void sub_80BE3BC(void) +{ + u8 rval; + u8 i; + + rval = sub_80BF77C(0x5555); + if (rval == 0) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1) + { + sub_80BF20C(); + if (gMartPurchaseHistory[0].item_amount >= 20) + { + struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].smartshopperShow; + + smartShopper->kind = TVSHOW_SMART_SHOPPER; + smartShopper->active = rval; + smartShopper->shopLocation = gMapHeader.regionMapSectionId; + for (i=0; i<3; i++) + { + smartShopper->itemIds[i] = gMartPurchaseHistory[i].item_id; + smartShopper->itemAmounts[i] = gMartPurchaseHistory[i].item_amount; + } + smartShopper->priceReduced = GetPriceReduction(1); + StringCopy(smartShopper->playerName, gSaveBlock2.playerName); + sub_80BE138((TVShow *)smartShopper); + smartShopper->language = GAME_LANGUAGE; + } + } + } +} + +void sub_80BE478(void) +{ + InterviewBefore_NameRater(); + if (gSpecialVar_Result == 1) + return; + + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1); + if (StringLength(gSaveBlock2.playerName) > 1 && StringLength(gStringVar1) > 1) + { + struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].nameRaterShow; + + nameRaterShow->kind = TVSHOW_NAME_RATER_SHOW; + nameRaterShow->active = 1; + nameRaterShow->species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL); + nameRaterShow->random = Random() % 3; + nameRaterShow->random2 = Random() % 2; + nameRaterShow->var1C = sub_80BF674(nameRaterShow->species); + StringCopy(nameRaterShow->trainerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, nameRaterShow->pokemonName); + sub_80BE160((TVShow *)nameRaterShow); + nameRaterShow->language = GAME_LANGUAGE; + nameRaterShow->pokemonNameLanguage = sub_80BDEAC(nameRaterShow->pokemonName); + Text_StripExtCtrlCodes(nameRaterShow->pokemonName); + } +} + +void StartMassOutbreak(void) +{ + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[gSpecialVar_0x8004].massOutbreak; + + gSaveBlock1.outbreakPokemonSpecies = massOutbreak->species; + gSaveBlock1.outbreakLocationMapNum = massOutbreak->locationMapNum; + gSaveBlock1.outbreakLocationMapGroup = massOutbreak->locationMapGroup; + gSaveBlock1.outbreakPokemonLevel = massOutbreak->level; + gSaveBlock1.outbreakUnk1 = massOutbreak->var02; + gSaveBlock1.outbreakUnk2 = massOutbreak->var0E; + gSaveBlock1.outbreakPokemonMoves[0] = massOutbreak->moves[0]; + gSaveBlock1.outbreakPokemonMoves[1] = massOutbreak->moves[1]; + gSaveBlock1.outbreakPokemonMoves[2] = massOutbreak->moves[2]; + gSaveBlock1.outbreakPokemonMoves[3] = massOutbreak->moves[3]; + gSaveBlock1.outbreakUnk4 = massOutbreak->var03; + gSaveBlock1.outbreakPokemonProbability = massOutbreak->probability; + gSaveBlock1.outbreakUnk5 = 2; +} + +void InterviewAfter_FanClubLetter(void) +{ + struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter; + + fanclubLetter->kind = TVSHOW_FAN_CLUB_LETTER; + fanclubLetter->active = 1; + StringCopy(fanclubLetter->playerName, gSaveBlock2.playerName); + fanclubLetter->species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); + sub_80BE160((TVShow *)fanclubLetter); + fanclubLetter->language = GAME_LANGUAGE; +} + +void InterviewAfter_RecentHappenings(void) +{ + struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings; + + recentHappenings->kind = TVSHOW_RECENT_HAPPENINGS; + recentHappenings->active = 1; + StringCopy(recentHappenings->playerName, gSaveBlock2.playerName); + recentHappenings->var02 = 0; + sub_80BE160((TVShow *)recentHappenings); + recentHappenings->language = GAME_LANGUAGE; +} + +void InterviewAfter_PkmnFanClubOpinions(void) +{ + u8 monIndex; + struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions; + + fanclubOpinions->kind = TVSHOW_PKMN_FAN_CLUB_OPINIONS; + fanclubOpinions->active = 1; + monIndex = GetLeadMonIndex(); + fanclubOpinions->var04A = GetMonData(&gPlayerParty[monIndex], MON_DATA_FRIENDSHIP, NULL) / 16; + fanclubOpinions->var04B = gSpecialVar_0x8007; + StringCopy(fanclubOpinions->playerName, gSaveBlock2.playerName); + GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, fanclubOpinions->var10); + fanclubOpinions->var02 = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); + sub_80BE160((TVShow *)fanclubOpinions); + fanclubOpinions->language = GAME_LANGUAGE; + fanclubOpinions->var0E = sub_80BDEAC(fanclubOpinions->var10); + Text_StripExtCtrlCodes(fanclubOpinions->var10); +} + +void InterviewAfter_DummyShow4(void) +{ +} + +void sub_80BE778(void) +{ + if (FlagGet(FLAG_SYS_GAME_CLEAR)) + { + u8 i; + + for (i = 0; i < 24; i++) + { + if (gSaveBlock1.tvShows[i].massOutbreak.kind == TVSHOW_MASS_OUTBREAK) + return; + } + if (sub_80BF77C(0x147)) + return; + + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1) + { + u16 rand = Random(); + u16 val = rand % 5; + s32 val2 = gUnknown_03005D38.var0; + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[val2].massOutbreak; + + massOutbreak->kind = TVSHOW_MASS_OUTBREAK; + massOutbreak->active = 1; + massOutbreak->level = gPokeOutbreakSpeciesList[val].level; + massOutbreak->var02 = 0; + massOutbreak->var03 = 0; + massOutbreak->species = gPokeOutbreakSpeciesList[val].species; + massOutbreak->var0E = 0; + massOutbreak->moves[0] = gPokeOutbreakSpeciesList[val].moves[0]; + massOutbreak->moves[1] = gPokeOutbreakSpeciesList[val].moves[1]; + massOutbreak->moves[2] = gPokeOutbreakSpeciesList[val].moves[2]; + massOutbreak->moves[3] = gPokeOutbreakSpeciesList[val].moves[3]; + massOutbreak->locationMapNum = gPokeOutbreakSpeciesList[val].location; + massOutbreak->locationMapGroup = 0; + massOutbreak->var12 = 0; + massOutbreak->probability = 0x32; + massOutbreak->var15 = 0; + massOutbreak->daysLeft = 0x01; + sub_80BE160((TVShow *)massOutbreak); + massOutbreak->language = GAME_LANGUAGE; + } + } +} + +void EndMassOutbreak(void) +{ + gSaveBlock1.outbreakPokemonSpecies = 0; + gSaveBlock1.outbreakLocationMapNum = 0; + gSaveBlock1.outbreakLocationMapGroup = 0; + gSaveBlock1.outbreakPokemonLevel = 0; + gSaveBlock1.outbreakUnk1 = 0; + gSaveBlock1.outbreakUnk2 = 0; + gSaveBlock1.outbreakPokemonMoves[0] = 0; + gSaveBlock1.outbreakPokemonMoves[1] = 0; + gSaveBlock1.outbreakPokemonMoves[2] = 0; + gSaveBlock1.outbreakPokemonMoves[3] = 0; + gSaveBlock1.outbreakUnk4 = 0; + gSaveBlock1.outbreakPokemonProbability = 0; + gSaveBlock1.outbreakUnk5 = 0; +} + +void UpdateTVShowsPerDay(u16 arg0) +{ + sub_80BE8EC(arg0); + UpdateMassOutbreakTimeLeft(arg0); + sub_80BEE84(arg0); + sub_80BEA5C(arg0); +} + +void sub_80BE8EC(u16 arg0) +{ + u8 showidx; + + if (gSaveBlock1.outbreakPokemonSpecies == 0) + { + for (showidx=0; showidx<24; showidx++) + { + if (gSaveBlock1.tvShows[showidx].massOutbreak.kind == TVSHOW_MASS_OUTBREAK + && gSaveBlock1.tvShows[showidx].massOutbreak.active == 0x01) + { + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[showidx].massOutbreak; + + if (massOutbreak->daysLeft < arg0) + massOutbreak->daysLeft = 0; + else + massOutbreak->daysLeft -= arg0; + break; + } + } + } +} + +void UpdateMassOutbreakTimeLeft(u16 arg0) +{ + if (gSaveBlock1.outbreakUnk5 <= arg0) + EndMassOutbreak(); + else + gSaveBlock1.outbreakUnk5 -= arg0; +} + +void sub_80BE97C(bool8 flag) +{ + u8 var0, var1; + + if (flag) + { + var0 = gUnknown_020387E2 >> 8; + if (var0 > 4) + sub_80BE9D4(); + gUnknown_020387E2 &= 0xFF; + var1 = gUnknown_020387E2 & 0xFF; + if (var1 != 0xFF) + gUnknown_020387E2++; + } + else + { + var0 = gUnknown_020387E2 & 0xFF; + if (var0 > 4) + sub_80BE9D4(); + gUnknown_020387E2 &= 0xFF00; + var1 = gUnknown_020387E2 >> 8; + if (var1 != 0xFF) + gUnknown_020387E2 += 0x100; + } +} + +void sub_80BE9D4(void) +{ + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_FISHING_ADVICE) != 1) + { + struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonAngler; + register u8 zero asm("r1") = 0; + + asm(""::"r"(zero)); + pokemonAngler->kind = TVSHOW_FISHING_ADVICE; + pokemonAngler->active = zero; + pokemonAngler->var02 = gUnknown_020387E2 & 0xFF; + pokemonAngler->var03 = gUnknown_020387E2 >> 8; + pokemonAngler->var04 = gUnknown_020387E0; + StringCopy(pokemonAngler->playerName, gSaveBlock2.playerName); + sub_80BE138((TVShow *)pokemonAngler); + pokemonAngler->language = GAME_LANGUAGE; + } +} + +void sub_80BEA50(u16 var) +{ + gUnknown_020387E0 = var; +} + +void sub_80BEA88(void); + +void sub_80BEA5C(u16 arg0) +{ + struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters; + + if (worldOfMasters->kind == TVSHOW_WORLD_OF_MASTERS) + { + if (worldOfMasters->var02 < 20) + sub_80BF55C(gSaveBlock1.tvShows, 0x18); + else + sub_80BEA88(); + } +} +void sub_80BEA88(void) +{ + struct TVShowWorldOfMasters *worldOfMastersSrc = &gSaveBlock1.tvShows[24].worldOfMasters; + + if (sub_80BF77C(0xFFFF) == 0) + { + gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows); + if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_WORLD_OF_MASTERS) != 1) + { + struct TVShowWorldOfMasters *worldOfMastersDst = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].worldOfMasters; + + worldOfMastersDst->kind = TVSHOW_WORLD_OF_MASTERS; + worldOfMastersDst->active = 0; + worldOfMastersDst->var02 = worldOfMastersSrc->var02; + worldOfMastersDst->var06 = GetGameStat(GAME_STAT_STEPS) - worldOfMastersSrc->var06; + worldOfMastersDst->var04 = worldOfMastersSrc->var04; + worldOfMastersDst->var08 = worldOfMastersSrc->var08; + worldOfMastersDst->var0a = worldOfMastersSrc->var0a; + StringCopy(worldOfMastersDst->playerName, gSaveBlock2.playerName); + sub_80BE138((TVShow *)worldOfMastersDst); + worldOfMastersDst->language = GAME_LANGUAGE; + } + } +} + +void sub_80BEB20(void) +{ + u16 rval; + + if (FlagGet(FLAG_SYS_GAME_CLEAR) != 0) + { + gUnknown_03005D38.var0 = sub_80BEBC8(gSaveBlock1.pokeNews); + if (gUnknown_03005D38.var0 != -1 && sub_80BF77C(0x28f) != 1) + { + rval = (Random() % 3) + 1; + if (sub_80BEE48(rval) != 1) + { + gSaveBlock1.pokeNews[gUnknown_03005D38.var0].kind = rval; + gSaveBlock1.pokeNews[gUnknown_03005D38.var0].days = 4; + gSaveBlock1.pokeNews[gUnknown_03005D38.var0].state = 1; + } + } + } +} + +int sub_80BEBC8(struct PokeNews *pokeNews) +{ + s8 i; + + for (i = 0; i < 16; i++) + { + if (pokeNews[i].kind == 0) + return i; + } + return -1; +} + +void sub_80BEBF4(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + sub_80BEC10(i); +} + +void sub_80BEC10(u8 arg0) +{ + gSaveBlock1.pokeNews[arg0].kind = 0; + gSaveBlock1.pokeNews[arg0].state = 0; + gSaveBlock1.pokeNews[arg0].days = 0; +} + +void sub_80BEC40(void) +{ + u8 i, j; + + for (i = 0; i < 15; i++) + { + if (gSaveBlock1.pokeNews[i].kind == 0) + { + for (j = i + 1; j < 16; j++) + { + if (gSaveBlock1.pokeNews[j].kind != 0) + { + gSaveBlock1.pokeNews[i] = gSaveBlock1.pokeNews[j]; + sub_80BEC10(j); + break; + } + } + } + } +} + +u8 FindAnyTVNewsOnTheAir(void) +{ + u8 i; + for (i = 0; i < 16; i++) + { + if (gSaveBlock1.pokeNews[i].kind != 0 + && gSaveBlock1.pokeNews[i].state == 1 + && gSaveBlock1.pokeNews[i].days < 3) + return i; + } + return 0xFF; +} + +void DoPokeNews(void) +{ + u8 i; + i = FindAnyTVNewsOnTheAir(); + if (i == 0xff) + { + gSpecialVar_Result = 0; + return; + } + if (gSaveBlock1.pokeNews[i].days == 0) + { + gSaveBlock1.pokeNews[i].state = 2; + if (gLocalTime.hours < 20) + ShowFieldMessage(gTVNewsTextGroup2[gSaveBlock1.pokeNews[i].kind]); + else + ShowFieldMessage(gTVNewsTextGroup3[gSaveBlock1.pokeNews[i].kind]); + } + else + { + u16 value = gSaveBlock1.pokeNews[i].days; + + ConvertIntToDecimalStringN(gStringVar1, value, 0, 1); + gSaveBlock1.pokeNews[i].state = 0; + ShowFieldMessage(gTVNewsTextGroup1[gSaveBlock1.pokeNews[i].kind]); + } + gSpecialVar_Result = 1; +} + +bool8 GetPriceReduction(u8 arg0) +{ + u8 i; + + if (arg0 == 0) + return FALSE; + for (i=0; i<16; i++) + { + if (gSaveBlock1.pokeNews[i].kind == arg0) + { + if (gSaveBlock1.pokeNews[i].state == 2 && IsPriceDiscounted(arg0) != 0) + return TRUE; + else + return FALSE; + } + } + return FALSE; +} + +bool8 IsPriceDiscounted(u8 arg0) +{ + switch (arg0) + { + case 1: + if (gSaveBlock1.location.mapGroup == MAP_GROUP(SLATEPORT_CITY) + && gSaveBlock1.location.mapNum == MAP_NUM(SLATEPORT_CITY) + && gSpecialVar_LastTalked == 0x1a) + return TRUE; + else + return FALSE; + break; + case 3: + if (gSaveBlock1.location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) + && gSaveBlock1.location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)) + return TRUE; + else + return FALSE; + break; + default: + return TRUE; + } +} + +bool8 sub_80BEE48(u8 arg0) +{ + u8 i; + + if (arg0 == 0) + return TRUE; + for (i=0; i<16; i++) + { + if (gSaveBlock1.pokeNews[i].kind == arg0) + return TRUE; + } + return FALSE; +} + +void sub_80BEE84(u16 var0) +{ + u8 i; + + for (i=0; i<16; i++) + { + if (gSaveBlock1.pokeNews[i].kind) + { + if (gSaveBlock1.pokeNews[i].days < var0) + { + sub_80BEC10(i); + } + else + { + if (!gSaveBlock1.pokeNews[i].state && FlagGet(FLAG_SYS_GAME_CLEAR) == 1) + gSaveBlock1.pokeNews[i].state = 1; + gSaveBlock1.pokeNews[i].days -= var0; + } + } + } + sub_80BEC40(); +} + +void sub_80BEF10(u8 strvaridx, u8 rank) +{ + switch (rank) + { + case NORMAL_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[NORMAL_RANK + 5]); + break; + case SUPER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[SUPER_RANK + 5]); + break; + case HYPER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[HYPER_RANK + 5]); + break; + case MASTER_RANK: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[MASTER_RANK + 5]); + break; + } +} + +void CopyContestCategoryToStringVar(u8 strvaridx, u8 category) +{ + switch (category) + { + case CONTEST_COOL: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_COOL]); + break; + case CONTEST_BEAUTY: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_BEAUTY]); + break; + case CONTEST_CUTE: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_CUTE]); + break; + case CONTEST_SMART: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_SMART]); + break; + case CONTEST_TOUGH: + StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_TOUGH]); + break; + } +} + +void SetContestCategoryStringVarForInterview(void) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer; + + CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); +} + +void sub_80BF088(u8 arg0, s32 price) +{ + size_t log10val = sub_80BF0B8(price); + + ConvertIntToDecimalStringN(gUnknown_083D1464[arg0], price, 0, log10val); +} + +size_t sub_80BF0B8(int value) +{ + if (value / 10 == 0) + return 1; + else if (value / 100 == 0) + return 2; + else if (value / 1000 == 0) + return 3; + else if (value / 10000 == 0) + return 4; + else if (value / 100000 == 0) + return 5; + else if (value / 1000000 == 0) + return 6; + else if (value / 10000000 == 0) + return 7; + else if (value / 100000000 == 0) + return 8; + else + return 1; +} + +void sub_80BF154(u8 arg0, struct TVShowSmartShopper *arg1) +{ + u8 i; + s32 price; + price = 0; + + for (i = 0; i < 3; i++) + { + if (arg1->itemIds[i]) + price += ItemId_GetPrice(arg1->itemIds[i]) * arg1->itemAmounts[i]; + } + if (arg1->priceReduced == 1) + sub_80BF088(arg0, price >> 1); + else + sub_80BF088(arg0, price); +} + +bool8 sub_80BF1B4(u8 showIdx) +{ + u8 i; + //TVShow *tvShows; + TVShow *tvShows = gSaveBlock1.tvShows; + u32 trainerId = GetPlayerTrainerId(); + + for (i = 5; i < 24; i++) + { + if (tvShows[i].common.kind == showIdx) + { + if ((trainerId & 0xFF) == tvShows[i].common.trainerIdLo && ((trainerId >> 8) & 0xFF) == tvShows[i].common.trainerIdHi) + return TRUE; + } + } + return FALSE; +} + +void sub_80BF20C(void) +{ + u8 i, j; + u16 tmpId, tmpAmount; + + for (i = 0; i < 2; i++) + { + for (j = i + 1; j < 3; j++) + { + if (gMartPurchaseHistory[i].item_amount < gMartPurchaseHistory[j].item_amount) + { + tmpId = gMartPurchaseHistory[i].item_id; + tmpAmount = gMartPurchaseHistory[i].item_amount; + gMartPurchaseHistory[i].item_id = gMartPurchaseHistory[j].item_id; + gMartPurchaseHistory[i].item_amount = gMartPurchaseHistory[j].item_amount; + gMartPurchaseHistory[j].item_id = tmpId; + gMartPurchaseHistory[j].item_amount = tmpAmount; + } + } + } +} + +void sub_80BF25C(u8 showType) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (gSaveBlock1.tvShows[i].common.kind == showType) + { + if(gSaveBlock1.tvShows[i].common.active == 1) + { + gSpecialVar_Result = 1; + } + else + { + sub_80BF55C(gSaveBlock1.tvShows, i); + sub_80BF588(gSaveBlock1.tvShows); + sub_80BF6D8(); + } + return; + } + } + sub_80BF6D8(); +} + +void InterviewBefore(void) +{ + gSpecialVar_Result = FALSE; + switch (gSpecialVar_0x8005) + { + case TVSHOW_FAN_CLUB_LETTER: + InterviewBefore_FanClubLetter(); + break; + case TVSHOW_RECENT_HAPPENINGS: + InterviewBefore_RecentHappenings(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + InterviewBefore_PkmnFanClubOpinions(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + InterviewBefore_Dummy(); + break; + case TVSHOW_NAME_RATER_SHOW: + InterviewBefore_NameRater(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + InterviewBefore_BravoTrainerPkmnProfile(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + InterviewBefore_BravoTrainerBTProfile(); + break; + } +} + +void InterviewBefore_FanClubLetter(void) +{ + struct TVShowFanClubLetter *fanclubLetter; + + sub_80BF25C(TVSHOW_FAN_CLUB_LETTER); + if (gSpecialVar_Result == 0) + { + StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); + fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter; + sub_80EB6FC(fanclubLetter->pad04, 6); + } +} + +void InterviewBefore_RecentHappenings(void) +{ + struct TVShowRecentHappenings *recentHappenings; + + sub_80BF25C(TVSHOW_RECENT_HAPPENINGS); + if (gSpecialVar_Result == 0) + { + recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings; + sub_80EB6FC(recentHappenings->var04, 6); + } +} + +void InterviewBefore_PkmnFanClubOpinions(void) +{ + struct TVShowFanclubOpinions *fanclubOpinions; + + sub_80BF25C(TVSHOW_PKMN_FAN_CLUB_OPINIONS); + if (gSpecialVar_Result == 0) + { + StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]); + GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2); + StringGetEnd10(gStringVar2); + fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions; + sub_80EB6FC(fanclubOpinions->var1C, 2); + } +} + +void InterviewBefore_Dummy(void) +{ + gSpecialVar_Result = 1; +} + +void InterviewBefore_NameRater(void) +{ + sub_80BF25C(TVSHOW_NAME_RATER_SHOW); +} + +void InterviewBefore_BravoTrainerPkmnProfile(void) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer; + + sub_80BF25C(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE); + if (gSpecialVar_Result == 0) + { + bravoTrainer = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer; + sub_80EB6FC(bravoTrainer->var04, 2); + } +} + +void InterviewBefore_BravoTrainerBTProfile(void) +{ + struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower; + + sub_80BF25C(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE); + if (gSpecialVar_Result == 0) + { + bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower; + sub_80EB6FC(bravoTrainerTower->var18, 1); // wrong struct ident, fix later + } +} + +#if ENGLISH +u8 NicknameDiffersFromSpeciesName(u8 monIndex) +{ + u32 species; + + GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, &gStringVar1); + species = GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES, NULL); + if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == 0) + return FALSE; + + return TRUE; +} +#elif GERMAN +u8 NicknameDiffersFromSpeciesName(u8 monIndex) +{ + u8 langData[4]; + u32 species; + u8 *tmp; + + GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, &gStringVar1); + + tmp = langData; + tmp[0] = GetMonData(&gPlayerParty[monIndex], MON_DATA_LANGUAGE, &langData); + if (tmp[0] != GAME_LANGUAGE) + return TRUE; + + species = GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES, NULL); + if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1)) + return TRUE; + + return FALSE; +} +#endif + +u8 LeadMonNicknamed(void) +{ + return NicknameDiffersFromSpeciesName(GetLeadMonIndex()); +} + +void sub_80BF55C(TVShow tvShow[], u8 showidx) +{ + u8 idx; + + tvShow[showidx].common.kind = 0; + tvShow[showidx].common.active = 0; + for (idx = 0; idx < 34; idx++) + tvShow[showidx].common.pad02[idx] = 0; +} + +void sub_80BF588(TVShow tvShow[]) +{ + u8 showidx; + u8 showidx2; + + for (showidx = 0; showidx < 4; showidx++) + { + if (tvShow[showidx].common.kind == 0) + { + for (showidx2 = showidx + 1; showidx2 < 5; showidx2++) + { + if (tvShow[showidx2].common.kind != 0) + { + tvShow[showidx] = tvShow[showidx2]; + sub_80BF55C(tvShow, showidx2); + break; + } + } + } + } + for (showidx = 5; showidx < 24; showidx++) + { + if (tvShow[showidx].common.kind == 0) + { + for (showidx2 = showidx + 1; showidx2 < 24; showidx2++) + { + if (tvShow[showidx2].common.kind != 0) + { + tvShow[showidx] = tvShow[showidx2]; + sub_80BF55C(gSaveBlock1.tvShows, showidx2); + break; + } + } + } + } +} + +u16 sub_80BF638(u8 arg0, u16 arg1) +{ + u16 retval = sub_80BF674(arg1); + + StringCopy(gUnknown_083D1464[arg0], gSpeciesNames[retval]); + return retval; +} + +u16 sub_80BF674(u16 species) +{ + u16 rspecies; + u16 cspecies; + + rspecies = (Random() % (NUM_SPECIES - 1)) + 1; + cspecies = rspecies; + while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) + { + if (cspecies == SPECIES_BULBASAUR) + cspecies = NUM_SPECIES - 1; + else + cspecies --; + if (cspecies == rspecies) + { + cspecies = species; + return cspecies; + } + } + return cspecies; +} + +void sub_80BF6D8(void) +{ + gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows); + gSpecialVar_0x8006 = gUnknown_03005D38.var0; + if (gUnknown_03005D38.var0 == -1) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; +} + +s8 sub_80BF720(TVShow tvShow[]) +{ + u8 idx; + + for (idx = 0; idx < 5; idx++) + { + if (tvShow[idx].common.kind == 0) + return idx; + } + return -1; +} + +s8 sub_80BF74C(TVShow tvShow[]) +{ + s8 idx; + + for (idx = 5; idx < 24; idx++) + { + if (tvShow[idx].common.kind == 0) + return idx; + } + return -1; +} + +bool8 sub_80BF77C(u16 value) +{ + if (Random() <= value) + return FALSE; + return TRUE; +} + +void sub_80BF79C(TVShow *arg0) +{ + u8 i = Random() % 6; + + while (1) + { + if (i == 6) + i = 0; + if (arg0->recentHappenings.var04[i] != 0xFFFF) + break; + i++; + } + EasyChat_GetWordText(gStringVar3, arg0->recentHappenings.var04[i]); +} + +u8 sub_80BF7E8(struct TVShowNameRaterShow *arg0) +{ + u16 flagsum = 0; + u8 i = 0; + + if (arg0->pokemonName[0] != 0xFF) + { + while (i < 11 && arg0->pokemonName[i] != 0xFF) + { + flagsum += arg0->pokemonName[i]; + i++; + } + } + return flagsum & 0x7; +} + + +void sub_80BF820(u8 arg0, u8 arg1, u8 arg2, u16 arg3, u16 arg4, struct TVShowNameRaterShow *tvShow) +{ + u8 flags[3]; + u16 nameLength; + u8 i; + + for (i = 0; i < 3; i++) + flags[i] = EOS; + + if (arg3 == 0) + { + nameLength = StringLength(tvShow->trainerName); + if (arg2 == 0) + { + flags[0] = tvShow->trainerName[arg1]; + } + else if (arg2 == 1) + { + flags[0] = tvShow->trainerName[nameLength - arg1]; + } + else if (arg2 == 2) { + flags[0] = tvShow->trainerName[arg1]; + flags[1] = tvShow->trainerName[arg1 + 1]; + } + else + { + flags[0] = tvShow->trainerName[nameLength - (arg1 + 2)]; + flags[1] = tvShow->trainerName[nameLength - (arg1 + 1)]; + } + } + else if (arg3 == 1) + { + nameLength = StringLength(tvShow->pokemonName); + if (arg2 == 0) + { + flags[0] = tvShow->pokemonName[arg1]; + } + else if (arg2 == 1) + { + flags[0] = tvShow->pokemonName[nameLength - arg1]; + } + else if (arg2 == 2) + { + flags[0] = tvShow->pokemonName[arg1]; + flags[1] = tvShow->pokemonName[arg1 + 1]; + } + else + { + flags[0] = tvShow->pokemonName[nameLength - (arg1 + 2)]; + flags[1] = tvShow->pokemonName[nameLength - (arg1 + 1)]; + } + } + else + { + nameLength = StringLength(gSpeciesNames[arg4]); + if (arg2 == 0) + { + flags[0] = gSpeciesNames[arg4][arg1]; + } + else if (arg2 == 1) + { + flags[0] = gSpeciesNames[arg4][nameLength - arg1]; + } + else if (arg2 == 2) + { + flags[0] = gSpeciesNames[arg4][arg1]; + flags[1] = gSpeciesNames[arg4][arg1 + 1]; + } + else + { + flags[0] = gSpeciesNames[arg4][nameLength - (arg1 + 2)]; + flags[1] = gSpeciesNames[arg4][nameLength - (arg1 + 1)]; + } + } + StringCopy(gUnknown_083D1464[arg0], flags); +} + +bool8 TV_IsScriptShowKindAlreadyInQueue(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (gSaveBlock1.tvShows[i].common.kind == gSpecialVar_0x8004) + return TRUE; + } + return FALSE; +} + +bool8 TV_PutNameRaterShowOnTheAirIfNicnkameChanged(void) +{ + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); + if (!StringCompareWithoutExtCtrlCodes(gStringVar3, gStringVar1)) + return FALSE; + sub_80BE478(); + return TRUE; +} + +void ChangePokemonNickname_CB(void); + +void ChangePokemonNickname(void) +{ + u16 spec; + u16 gender; + u32 pval; + + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar3); + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar2); + spec = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_SPECIES, 0); + gender = GetMonGender(&(gPlayerParty[gSpecialVar_0x8004])); + pval = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_PERSONALITY, 0); + DoNamingScreen(3, gStringVar2, spec, gender, pval, ChangePokemonNickname_CB); +} + +void ChangePokemonNickname_CB(void) +{ + SetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, gStringVar2); + c2_exit_to_overworld_1_continue_scripts_restart_music(); +} + +void TV_CopyNicknameToStringVar1AndEnsureTerminated(void) +{ + GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1); + StringGetEnd10(gStringVar1); +} + +void TV_CheckMonOTIDEqualsPlayerID(void) +{ + if (GetPlayerTrainerId() == GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_OT_ID, 0)) + gSpecialVar_Result = 0; + else + gSpecialVar_Result = 1; +} + +u8 GetTVChannelByShowType(u8 arg0) +{ + if (arg0 == 0) + return 0; + else if (arg0 > 0 && arg0 <= 20) + return 2; + else if (arg0 > 20 && arg0 <= 40) + return 3; + else if (arg0 > 40 && arg0 <= 60) + return 4; + else + return 0; +} + +u32 GetPlayerTrainerId(void) +{ + return (gSaveBlock2.playerTrainerId[3] << 24) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[0]); +} + +u8 CheckForBigMovieOrEmergencyNewsOnTV(void) +{ + if (gSaveBlock1.location.mapGroup != MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) + return 0; + if (gSaveBlock2.playerGender == MALE) + { + if (gSaveBlock1.location.mapNum != MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) + return 0; + } + else + { + if (gSaveBlock1.location.mapNum != MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) + return 0; + } + if (FlagGet(FLAG_SYS_TV_LATI) == 1) + return 1; + if (FlagGet(FLAG_SYS_TV_HOME) == 1) + return 2; + return 1; +} + +void GetMomOrDadStringForTVMessage(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) + { + if (gSaveBlock2.playerGender == MALE) + { + if (gSaveBlock1.location.mapNum == MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) + { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_TEMP_3, 1); + } + } + else + { + if (gSaveBlock1.location.mapNum == MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) + { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_TEMP_3, 1); + } + } + } + if (VarGet(VAR_TEMP_3) == 1) + { + StringCopy(gStringVar1, gOtherText_Mom); + } + else if (VarGet(VAR_TEMP_3) == 2) + { + StringCopy(gStringVar1, gOtherText_Dad); + } + else if (VarGet(VAR_TEMP_3) > 2) + { + if (VarGet(VAR_TEMP_3) % 2 == 0) + StringCopy(gStringVar1, gOtherText_Mom); + else + StringCopy(gStringVar1, gOtherText_Dad); + } + else + { + if (Random() % 2 != 0) + { + StringCopy(gStringVar1, gOtherText_Mom); + VarSet(VAR_TEMP_3, 1); + } + else + { + StringCopy(gStringVar1, gOtherText_Dad); + VarSet(VAR_TEMP_3, 2); + } + } +} + +void sub_80BFD20(void) +{ + VarSet(VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, 0); + RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); +} + +typedef union ewramStruct_02007000 +{ + TVShow tvshows[4][25]; + struct PokeNews pokeNews[4][16]; +} ewramStruct_02007000; + +void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]); + +void sub_80C04A0(void); +void sub_80C01D4(void); +void sub_80C0408(void); + +void sub_80BFD44(u8 *arg0, u32 arg1, u8 arg2) +{ + u8 i; + ewramStruct_02007000 *ewramTVShows; + + for (i = 0; i < 4; i++) + memcpy(&gUnknown_02007000.tvshows[i], &arg0[i * arg1], 25 * sizeof(TVShow)); + ewramTVShows = &gUnknown_02007000; + switch (arg2) + { + case 0: + sub_80BFE24(gSaveBlock1.tvShows, ewramTVShows->tvshows[1], ewramTVShows->tvshows[2], ewramTVShows->tvshows[3]); + break; + case 1: + sub_80BFE24(ewramTVShows->tvshows[0], gSaveBlock1.tvShows, ewramTVShows->tvshows[2], ewramTVShows->tvshows[3]); + break; + case 2: + sub_80BFE24(ewramTVShows->tvshows[0], ewramTVShows->tvshows[1], gSaveBlock1.tvShows, ewramTVShows->tvshows[3]); + break; + case 3: + sub_80BFE24(ewramTVShows->tvshows[0], ewramTVShows->tvshows[1], ewramTVShows->tvshows[2], gSaveBlock1.tvShows); + break; + } + sub_80BF588(gSaveBlock1.tvShows); + sub_80C04A0(); + sub_80BF588(gSaveBlock1.tvShows); + sub_80C01D4(); + sub_80C0408(); +} + +s8 sub_80C019C(TVShow tvShows[]); +bool8 sub_80BFF68(TVShow * tv1[25], TVShow * tv2[25], u8 idx); +u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx); +u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx); +u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx); + +void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]) +{ + u8 i, j; + TVShow **argslist[4]; + + argslist[0] = &arg0; + argslist[1] = &arg1; + argslist[2] = &arg2; + argslist[3] = &arg3; + gUnknown_03000720 = GetLinkPlayerCount(); + while (1) + { + for (i=0; icommon.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) + return FALSE; + tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; + tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; + tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; + tv2->common.srcTrainerIdHi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.active = 1; + return TRUE; +} + +u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx) +{ + u32 linkTrainerId = GetLinkPlayerTrainerId(idx); + if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi) + return FALSE; + if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) + return FALSE; + tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo; + tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi; + tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF; + tv2->common.srcTrainerId2Hi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.active = 1; + return TRUE; +} + +u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx) +{ + u32 linkTrainerId = GetLinkPlayerTrainerId(idx); + if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) + return FALSE; + tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; + tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; + tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; + tv2->common.srcTrainerIdHi = linkTrainerId >> 8; + *tv1 = *tv2; + tv1->common.active = 1; + tv1->common.var16[0] = 1; + return TRUE; +} + +s8 sub_80C019C(TVShow tvShows[]) +{ + u8 i; + for (i = 0; i < 24; i++) + { + if (tvShows[i].common.active == 0 && (u8)(tvShows[i].common.kind - 1) < 60) + return i; + } + return -1; +} + +#ifdef NONMATCHING +void sub_80C01D4(void) +{ + u16 i; + for (i=0; i<24; i++) + { + switch (gSaveBlock1.tvShows[i].common.kind) + { + case 0: + case TVSHOW_RECENT_HAPPENINGS: + case TVSHOW_SMART_SHOPPER: + case TVSHOW_MASS_OUTBREAK: + break; + case TVSHOW_FAN_CLUB_LETTER: + sub_80C03C8((&gSaveBlock1.tvShows[i])->fanclubLetter.species, i); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + sub_80C03C8((&gSaveBlock1.tvShows[i])->fanclubOpinions.var02, i); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + sub_80C03C8((&gSaveBlock1.tvShows[i])->unkShow04.var06, i); + break; + case TVSHOW_NAME_RATER_SHOW: + sub_80C03C8((&gSaveBlock1.tvShows[i])->nameRaterShow.species, i); + sub_80C03C8((&gSaveBlock1.tvShows[i])->nameRaterShow.var1C, i); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainer.species, i); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainerTower.species, i); + sub_80C03C8((&gSaveBlock1.tvShows[i])->bravoTrainerTower.defeatedSpecies, i); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonToday.species, i); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonTodayFailed.species, i); + sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonTodayFailed.species2, i); + break; + case TVSHOW_FISHING_ADVICE: + sub_80C03C8((&gSaveBlock1.tvShows[i])->pokemonAngler.var04, i); + break; + case TVSHOW_WORLD_OF_MASTERS: + sub_80C03C8((&gSaveBlock1.tvShows[i])->worldOfMasters.var08, i); + sub_80C03C8((&gSaveBlock1.tvShows[i])->worldOfMasters.var04, i); + break; + default: + sub_80C03A8(i); + } + } +} +#else +__attribute__((naked)) +void sub_80C01D4(void) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + movs r6, 0\n\ +_080C01D8:\n\ + ldr r0, _080C01F8 @ =gSaveBlock1\n\ + lsls r2, r6, 3\n\ + adds r1, r2, r6\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + ldr r0, _080C01FC @ =0x00002738\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x29\n\ + bls _080C01EE\n\ + b _default\n\ +_080C01EE:\n\ + lsls r0, 2\n\ + ldr r1, _080C0200 @ =_080C0204\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_080C01F8: .4byte gSaveBlock1\n\ +_080C01FC: .4byte 0x00002738\n\ +_080C0200: .4byte _080C0204\n\ + .align 2, 0\n\ +_080C0204:\n\ + .4byte _break\n\ + .4byte _fanclubLetter @ TVSHOW_FAN_CLUB_LETTER\n\ + .4byte _break @ TVSHOW_RECENT_HAPPENINGS\n\ + .4byte _fanclubOpinions @ TVSHOW_PKMN_FAN_CLUB_OPINIONS\n\ + .4byte _showtype4 @ TVSHOW_UNKN_SHOWTYPE_04\n\ + .4byte _nameRater @ TVSHOW_NAME_RATER_SHOW\n\ + .4byte _bravoTrainerContest @ TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE\n\ + .4byte _bravoTrainerTower @ TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _pokemonTodayS @ TVSHOW_POKEMON_TODAY_CAUGHT\n\ + .4byte _break @ TVSHOW_SMART_SHOPPER\n\ + .4byte _pokemonTodayF @ TVSHOW_POKEMON_TODAY_FAILED\n\ + .4byte _fishing @ TVSHOW_FISHING_ADVICE\n\ + .4byte _worldOfMasters @ TVSHOW_WORLD_OF_MASTERS\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _default\n\ + .4byte _break @ TVSHOW_MASS_OUTBREAK\n\ +_fanclubLetter:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02B8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02B8: .4byte gSaveBlock1 + 0x2738\n\ +_fanclubOpinions:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02C8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02C8: .4byte gSaveBlock1 + 0x2738\n\ +_showtype4:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C02D8 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x6]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02D8: .4byte gSaveBlock1 + 0x2738\n\ +_nameRater:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C02F4 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0x2]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x1C]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C02F4: .4byte gSaveBlock1 + 0x2738\n\ +_bravoTrainerContest:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0304 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0304: .4byte gSaveBlock1 + 0x2738\n\ +_bravoTrainerTower:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C0320 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0xA]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x14]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0320: .4byte gSaveBlock1 + 0x2738\n\ +_pokemonTodayS:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0330 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x10]\n\ + b _checkSpecies1 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C0330: .4byte gSaveBlock1 + 0x2738\n\ +_pokemonTodayF:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C034C @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0xC]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0xE]\n\ + b _checkSpecies2 @ sub_80C03C8(r0, i)\n\ + .align 2, 0\n\ +_080C034C: .4byte gSaveBlock1 + 0x2738\n\ +_fishing:\n\ + adds r0, r2, r6\n\ + lsls r0, 2\n\ + ldr r1, _080C0364 @ =gSaveBlock1 + 0x2738\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x4]\n\ +_checkSpecies1:\n\ + lsls r1, r6, 24\n\ + lsrs r1, 24\n\ + bl sub_80C03C8\n\ + b _break\n\ + .align 2, 0\n\ +_080C0364: .4byte gSaveBlock1 + 0x2738\n\ +_worldOfMasters:\n\ + adds r4, r2, r6\n\ + lsls r4, 2\n\ + ldr r0, _080C0388 @ =gSaveBlock1 + 0x2738\n\ + adds r4, r0\n\ + ldrh r0, [r4, 0x8]\n\ + lsls r5, r6, 24\n\ + lsrs r5, 24\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + ldrh r0, [r4, 0x4]\n\ +_checkSpecies2:\n\ + adds r1, r5, 0\n\ + bl sub_80C03C8\n\ + b _break\n\ + .align 2, 0\n\ +_080C0388: .4byte gSaveBlock1 + 0x2738\n\ +_default:\n\ + lsls r0, r6, 24\n\ + lsrs r0, 24\n\ + bl sub_80C03A8\n\ +_break:\n\ + adds r0, r6, 0x1\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + cmp r6, 0x17\n\ + bhi _080C03A0\n\ + b _080C01D8\n\ +_080C03A0:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ +.syntax divided\n"); +} +#endif + +void sub_80C03A8(u8 showidx) +{ + gSaveBlock1.tvShows[showidx].common.active = 0; +} + +void sub_80C03C8(u16 species, u8 showidx) +{ + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) + gSaveBlock1.tvShows[showidx].common.active = 0; +} + +void sub_80C0408(void) +{ + u16 i; + + if (FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE) + return; + for (i = 0; i < 24; i++) + { + if (gSaveBlock1.tvShows[i].common.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) + gSaveBlock1.tvShows[i].common.active = 0; + else if (gSaveBlock1.tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK) + gSaveBlock1.tvShows[i].common.active = 0; + } +} + +void sub_80C045C(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (GetTVChannelByShowType(gSaveBlock1.tvShows[i].common.kind) == 2) + gSaveBlock1.tvShows[i].common.active = 0; + } +} + +void sub_80C04A0(void) +{ + s8 showIdx; + s8 count; + count = 0; + + for (showIdx = 5; showIdx < 24; showIdx++) + { + if (gSaveBlock1.tvShows[showIdx].common.kind == 0) + count++; + } + for (showIdx = 0; showIdx < 5 - count; showIdx++) + sub_80BF55C(gSaveBlock1.tvShows, showIdx+5); +} + +void sub_80C05C4(struct PokeNews[16], struct PokeNews[16], struct PokeNews[16], struct PokeNews[16]); +void sub_80C0750(void); +void sub_80C0788(void); +s8 sub_80C0730(struct PokeNews[16], u8); +void sub_80C06BC(struct PokeNews *[16], struct PokeNews *[16]); + +void sub_80C0514(void *a0, u32 a1, u8 a2) +{ + ewramStruct_02007000 *struct02007000; + u8 i; + + for (i = 0; i < 4; i++) + memcpy(gUnknown_02007000.pokeNews[i], a0 + i * a1, 64); + struct02007000 = &gUnknown_02007000; + switch (a2) + { + case 0: + sub_80C05C4(gSaveBlock1.pokeNews, struct02007000->pokeNews[1], struct02007000->pokeNews[2], struct02007000->pokeNews[3]); + break; + case 1: + sub_80C05C4(struct02007000->pokeNews[0], gSaveBlock1.pokeNews, struct02007000->pokeNews[2], struct02007000->pokeNews[3]); + break; + case 2: + sub_80C05C4(struct02007000->pokeNews[0], struct02007000->pokeNews[1], gSaveBlock1.pokeNews, struct02007000->pokeNews[3]); + break; + case 3: + sub_80C05C4(struct02007000->pokeNews[0], struct02007000->pokeNews[1], struct02007000->pokeNews[2], gSaveBlock1.pokeNews); + break; + } + sub_80C0750(); + sub_80C0788(); +} + +void sub_80C05C4(struct PokeNews a0[16], struct PokeNews a1[16], struct PokeNews a2[16], struct PokeNews a3[16]) +{ + u8 i; + u8 j; + u8 k; + struct PokeNews ** arglist[4]; + + arglist[0] = &a0; + arglist[1] = &a1; + arglist[2] = &a2; + arglist[3] = &a3; + gUnknown_03000721 = GetLinkPlayerCount(); + for (i = 0; i < 16; i++) + { + for (j = 0; j < gUnknown_03000721; j++) + { + gUnknown_03000722 = sub_80C0730(*arglist[j], i); + if (gUnknown_03000722 != -1) + { + for (k = 0; k < gUnknown_03000721-1; k++) + { + gUnknown_03005D38.var0 = sub_80BEBC8(*arglist[(j + k + 1) % gUnknown_03000721]); + if (gUnknown_03005D38.var0 != -1) + sub_80C06BC(arglist[(j + k + 1) % gUnknown_03000721], arglist[j]); + } + } + } + } +} + +void sub_80C06BC(struct PokeNews *arg0[16], struct PokeNews *arg1[16]) +{ + struct PokeNews *str0; + struct PokeNews *str1; + + str0 = arg0[0]; + str1 = arg1[0]; + str1 += gUnknown_03000722; + sub_80C06E8(str0, str1, gUnknown_03005D38.var0); +} + +bool8 sub_80C06E8(struct PokeNews *arg0, struct PokeNews *arg1, s8 arg2) +{ + u8 i; + + if (arg1->kind == 0) + return FALSE; + for (i = 0; i < 16; i++) + { + if (arg0[i].kind == arg1->kind) + return FALSE; + } + arg0[arg2].kind = arg1->kind; + arg0[arg2].state = 1; + arg0[arg2].days = arg1->days; + return TRUE; +} + +s8 sub_80C0730(struct PokeNews *arg0, u8 arg1) +{ + if (arg0[arg1].kind == 0) + return -1; + return arg1; +} + +void sub_80C0750(void) +{ + u8 i; + + for (i = 0; i < 16; i++) + { + if (gSaveBlock1.pokeNews[i].kind > 3) + sub_80BEC10(i); + } + sub_80BEC40(); +} + +void sub_80C0788(void) +{ + u8 i; + + if (FlagGet(FLAG_SYS_GAME_CLEAR) != 1) + { + for (i = 0; i < 16; i++) + gSaveBlock1.pokeNews[i].state = 0; + } +} + +void DoTVShow(void) +{ + if (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.active != 0) + { + switch (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.kind) + { + case TVSHOW_FAN_CLUB_LETTER: + DoTVShowPokemonFanClubLetter(); + break; + case TVSHOW_RECENT_HAPPENINGS: + DoTVShowRecentHappenings(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + DoTVShowPokemonFanClubOpinions(); + break; + case TVSHOW_UNKN_SHOWTYPE_04: + nullsub_22(); + break; + case TVSHOW_MASS_OUTBREAK: + DoTVShowPokemonNewsMassOutbreak(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + DoTVShowBravoTrainerPokemonProfile(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + DoTVShowBravoTrainerBattleTowerProfile(); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + DoTVShowPokemonTodaySuccessfulCapture(); + break; + case TVSHOW_SMART_SHOPPER: + DoTVShowTodaysSmartShopper(); + break; + case TVSHOW_NAME_RATER_SHOW: + DoTVShowTheNameRaterShow(); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + DoTVShowPokemonTodayFailedCapture(); + break; + case TVSHOW_FISHING_ADVICE: + DoTVShowPokemonAngler(); + break; + case TVSHOW_WORLD_OF_MASTERS: + DoTVShowTheWorldOfMasters(); + break; + } + } +} + +void TVShowConvertInternationalString(u8 *dest, u8 *src, u8 language) +{ + StringCopy(dest, src); + if (language < LANGUAGE_ENGLISH) + ConvertInternationalString(dest, LANGUAGE_JAPANESE); +} + +void DoTVShowBravoTrainerPokemonProfile(void) +{ + struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch(state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); + sub_80BEF10(2, bravoTrainer->contestRank); + if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[bravoTrainer->species], bravoTrainer->pokemonNickname)) + sTVShowState = 8; + else + sTVShowState = 1; + break; + case 1: + StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); + TVShowConvertInternationalString(gStringVar2, bravoTrainer->pokemonNickname, bravoTrainer->var1f); + CopyContestCategoryToStringVar(2, bravoTrainer->contestCategory); + sTVShowState = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + if (bravoTrainer->contestResult == 0) // placed first + sTVShowState = 3; + else + sTVShowState = 4; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + EasyChat_GetWordText(gStringVar2, bravoTrainer->var04[0]); + sub_80BF088(2, bravoTrainer->contestResult + 1); + sTVShowState = 5; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + EasyChat_GetWordText(gStringVar2, bravoTrainer->var04[0]); + sub_80BF088(2, bravoTrainer->contestResult + 1); + sTVShowState = 5; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory); + EasyChat_GetWordText(gStringVar3, bravoTrainer->var04[1]); + if (bravoTrainer->var14) + sTVShowState = 6; + else + sTVShowState = 7; + break; + case 6: + StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); + StringCopy(gStringVar2, gMoveNames[bravoTrainer->var14]); + EasyChat_GetWordText(gStringVar3, bravoTrainer->var04[1]); + sTVShowState = 7; + break; + case 7: + TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainer->species]); + TVShowDone(); + break; + case 8: + StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]); + sTVShowState = 2; + break; + } + ShowFieldMessage(gTVBravoTrainerTextGroup[state]); +} + +void DoTVShowBravoTrainerBattleTowerProfile(void) +{ + struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainerTower; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch(state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]); + if (bravoTrainerTower->var16 >= 7) + sTVShowState = 1; + else + sTVShowState = 2; + break; + case 1: + sub_80BF088(0, bravoTrainerTower->btLevel); + sub_80BF088(1, bravoTrainerTower->var16); + if (bravoTrainerTower->var1c == 1) + sTVShowState = 3; + else + sTVShowState = 4; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + sub_80BF088(1, bravoTrainerTower->var16 + 1); + if (bravoTrainerTower->var1b == 0) + sTVShowState = 5; + else + sTVShowState = 6; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]); + if (bravoTrainerTower->var1b == 0) + sTVShowState = 5; + else + sTVShowState = 6; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]); + if (bravoTrainerTower->var1b == 0) + sTVShowState = 5; + else + sTVShowState = 6; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + sTVShowState = 11; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + sTVShowState = 11; + break; + case 7: + sTVShowState = 11; + break; + case 8: + case 9: + case 10: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); + sTVShowState = 11; + break; + case 11: + EasyChat_GetWordText(gStringVar1, bravoTrainerTower->var18[0]); + if (bravoTrainerTower->var1b == 0) + sTVShowState = 12; + else + sTVShowState = 13; + break; + case 12: + case 13: + EasyChat_GetWordText(gStringVar1, bravoTrainerTower->var18[0]); + TVShowConvertInternationalString(gStringVar2, bravoTrainerTower->trainerName, bravoTrainerTower->language); + TVShowConvertInternationalString(gStringVar3, bravoTrainerTower->pokemonName, bravoTrainerTower->language); + sTVShowState = 14; + break; + case 14: + TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language); + StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]); + TVShowDone(); + break; + } + ShowFieldMessage(gTVBravoTrainerBattleTowerTextGroup[state]); +} + +void DoTVShowTodaysSmartShopper(void) +{ + struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gSpecialVar_0x8004].smartshopperShow; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch(state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); + GetMapSectionName(gStringVar2, smartShopper->shopLocation, 0); + if (smartShopper->itemAmounts[0] >= 0xff) + sTVShowState = 11; + else + sTVShowState = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); + StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[0])); + sub_80BF088(2, smartShopper->itemAmounts[0]); + sTVShowState += (Random() % 4) + 1; + break; + case 2: + case 4: + case 5: + if (smartShopper->itemIds[1] != 0) + sTVShowState = 6; + else + sTVShowState = 10; + break; + case 3: + sub_80BF088(2, smartShopper->itemAmounts[0] + 1); + if (smartShopper->itemIds[1] != 0) + sTVShowState = 6; + else + sTVShowState = 10; + break; + case 6: + StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[1])); + sub_80BF088(2, smartShopper->itemAmounts[1]); + if (smartShopper->itemIds[2] != 0) + sTVShowState = 7; + else if (smartShopper->priceReduced == 1) + sTVShowState = 8; + else + sTVShowState = 9; + break; + case 7: + StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[2])); + sub_80BF088(2, smartShopper->itemAmounts[2]); + if (smartShopper->priceReduced == 1) + sTVShowState = 8; + else + sTVShowState = 9; + break; + case 8: + if (smartShopper->itemAmounts[0] < 0xff) + sTVShowState = 9; + else + sTVShowState = 12; + break; + case 9: + sub_80BF154(1, smartShopper); + TVShowDone(); + break; + case 10: + if (smartShopper->priceReduced == 1) + sTVShowState = 8; + else + sTVShowState = 9; + break; + case 11: + TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); + StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[0])); + if (smartShopper->priceReduced == 1) + sTVShowState = 8; + else + sTVShowState = 12; + break; + case 12: + TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language); + TVShowDone(); + break; + } + ShowFieldMessage(gTVSmartShopperTextGroup[state]); +} + +void DoTVShowTheNameRaterShow(void) +{ + struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004].nameRaterShow; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); + StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]); + TVShowConvertInternationalString(gStringVar3, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); + sTVShowState = sub_80BF7E8(nameRaterShow) + 1; + break; + case 1: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + if (nameRaterShow->random == 0) + sTVShowState = 9; + else if (nameRaterShow->random == 1) + sTVShowState = 10; + else if (nameRaterShow->random == 2) + sTVShowState = 11; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); + if (nameRaterShow->random == 0) + sTVShowState = 9; + else if (nameRaterShow->random == 1) + sTVShowState = 10; + else if (nameRaterShow->random == 2) + sTVShowState = 11; + break; + case 9: + case 10: + case 11: + sub_80BF820(0, 1, 0, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); + sub_80BF820(0, 0, 0, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); + sTVShowState = 12; + break; + case 13: + sub_80BF820(0, 0, 3, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); + sub_80BF820(0, 0, 2, 0, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->language); + TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); + sTVShowState = 14; + break; + case 14: + sub_80BF820(0, 0, 3, 0, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->language); + sub_80BF820(0, 0, 2, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language); + sTVShowState = 18; + break; + case 15: + sub_80BF820(1, 0, 2, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage); + StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]); + sub_80BF820(2, 0, 3, 2, nameRaterShow->species, nameRaterShow); + sTVShowState = 16; + break; + case 16: + sub_80BF820(0, 0, 3, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage); + sub_80BF820(0, 0, 2, 2, nameRaterShow->species, nameRaterShow); + sTVShowState = 17; + break; + case 17: + sub_80BF820(1, 0, 2, 1, 0, nameRaterShow); + TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage); + sub_80BF820(2, 0, 3, 2, nameRaterShow->var1C, nameRaterShow); + StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->var1C]); + sTVShowState = 18; + break; + case 12: + state = 18; + sTVShowState = 18; + case 18: + TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage); + TVShowConvertInternationalString(gStringVar2, nameRaterShow->trainerName, nameRaterShow->language); + TVShowDone(); + break; + } + ShowFieldMessage(gTVNameRaterTextGroup[state]); +} + +void DoTVShowPokemonTodaySuccessfulCapture(void) +{ + struct TVShowPokemonToday *pokemonToday = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonToday; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); + if (pokemonToday->ball == ITEM_MASTER_BALL) + sTVShowState = 5; + else + sTVShowState = 1; + break; + case 1: + sTVShowState = 2; + break; + case 2: + StringCopy(gStringVar2, ItemId_GetName(pokemonToday->ball)); + sub_80BF088(2, pokemonToday->var12); + if (pokemonToday->var12 < 4) + sTVShowState = 3; + else + sTVShowState = 4; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); + sTVShowState = 6; + break; + case 4: + sTVShowState = 6; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); + sTVShowState = 6; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2); + sTVShowState += (Random() % 4) + 1; + break; + case 7: + case 8: + StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2); + sub_80BF638(2, pokemonToday->species); + sTVShowState = 11; + break; + case 9: + case 10: + StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]); + TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2); + sTVShowState = 11; + break; + case 11: + TVShowDone(); + break; + } + ShowFieldMessage(gTVPokemonTodayTextGroup[state]); +} + +void DoTVShowPokemonTodayFailedCapture(void) +{ + struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonTodayFailed; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonTodayFailed->species]); + sTVShowState = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); + GetMapSectionName(gStringVar2, pokemonTodayFailed->var12, 0); + StringCopy(gStringVar3, gSpeciesNames[pokemonTodayFailed->species2]); + if (pokemonTodayFailed->var11 == 1) + sTVShowState = 3; + else + sTVShowState = 2; + break; + case 2: + case 3: + TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); + sub_80BF088(1, pokemonTodayFailed->var10); + if ((Random() % 3) == 0) + sTVShowState = 5; + else + sTVShowState = 4; + break; + case 4: + case 5: + TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language); + sTVShowState = 6; + break; + case 6: + TVShowDone(); + break; + } + ShowFieldMessage(gTVPokemonTodayFailedCaptureTextGroup[state]); +} + +void DoTVShowPokemonFanClubLetter(void) +{ + struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubLetter; + u8 state; + u16 rval; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, fanclubLetter->playerName, fanclubLetter->language); + StringCopy(gStringVar2, gSpeciesNames[fanclubLetter->species]); + sTVShowState = 50; + break; + case 1: + rval = (Random() % 4) + 1; + if (rval == 1) + sTVShowState = 2; + else + sTVShowState = rval + 2; + break; + case 2: + sTVShowState = 51; + break; + case 3: + sTVShowState += (Random() % 3) + 1; + break; + case 4: + case 5: + case 6: + sub_80BF79C((TVShow *)fanclubLetter); + sTVShowState = 7; + break; + case 7: + rval = (Random() % 0x1f) + 0x46; + sub_80BF088(2, rval); + TVShowDone(); + break; + case 50: + ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2); + ShowFieldMessage(gStringVar4); + sTVShowState = 1; + return; + case 51: + ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2); + ShowFieldMessage(gStringVar4); + sTVShowState = 3; + return; + } + ShowFieldMessage(gTVFanClubTextGroup[state]); +} + +void DoTVShowRecentHappenings(void) +{ + struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gSpecialVar_0x8004].recentHappenings; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, recentHappenings->playerName, recentHappenings->language); + sub_80BF79C((TVShow *)recentHappenings); + sTVShowState = 50; + break; + case 1: + sTVShowState += 1 + (Random() % 3); + break; + case 2: + case 3: + case 4: + sTVShowState = 5; + break; + case 5: + TVShowDone(); + break; + case 50: + ConvertEasyChatWordsToString(gStringVar4, recentHappenings->var04, 2, 2); + ShowFieldMessage(gStringVar4); + sTVShowState = 1; + return; + } + ShowFieldMessage(gTVRecentHappeningsTextGroup[state]); +} + +void DoTVShowPokemonFanClubOpinions(void) +{ + struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubOpinions; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); + StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]); + TVShowConvertInternationalString(gStringVar3, fanclubOpinions->var10, fanclubOpinions->var0E); + sTVShowState = fanclubOpinions->var04B + 1; + break; + case 1: + case 2: + case 3: + TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); + StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]); + EasyChat_GetWordText(gStringVar3, fanclubOpinions->var1C[0]); + sTVShowState = 4; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language); + EasyChat_GetWordText(gStringVar3, fanclubOpinions->var1C[1]); + TVShowDone(); + break; + } + ShowFieldMessage(gTVFanClubOpinionsTextGroup[state]); +} + +void nullsub_22(void) +{ +} + +void DoTVShowPokemonNewsMassOutbreak(void) +{ + struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[gSpecialVar_0x8004].massOutbreak; + + GetMapSectionName(gStringVar1, massOutbreak->locationMapNum, 0); + StringCopy(gStringVar2, gSpeciesNames[massOutbreak->species]); + TVShowDone(); + StartMassOutbreak(); + ShowFieldMessage(gTVPokemonOutbreakTextGroup[sTVShowState]); +} + +void DoTVShowInSearchOfTrainers(void) +{ + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch (state) + { + case 0: + GetMapSectionName(gStringVar1, gSaveBlock1.gabbyAndTyData.mapnum, 0); + if (gSaveBlock1.gabbyAndTyData.battleNum > 1) + sTVShowState = 1; + else + sTVShowState = 2; + break; + case 1: + sTVShowState = 2; + break; + case 2: + if (gSaveBlock1.gabbyAndTyData.valA_0 == 0) + sTVShowState = 4; + else if (gSaveBlock1.gabbyAndTyData.valA_3 != 0) + sTVShowState = 5; + else if (gSaveBlock1.gabbyAndTyData.valA_2 != 0) + sTVShowState = 6; + else if (gSaveBlock1.gabbyAndTyData.valA_1 != 0) + sTVShowState = 7; + else + sTVShowState = 3; + break; + case 3: + StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); + StringCopy(gStringVar2, gMoveNames[gSaveBlock1.gabbyAndTyData.lastMove]); + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); + sTVShowState = 8; + break; + case 4: + case 5: + case 6: + case 7: + sTVShowState = 8; + break; + case 8: + EasyChat_GetWordText(gStringVar1, gSaveBlock1.gabbyAndTyData.quote); + StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]); + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]); + gSpecialVar_Result = 1; + sTVShowState = 0;; + TakeTVShowInSearchOfTrainersOffTheAir(); + break; + } + ShowFieldMessage(gTVGabbyAndTyTextGroup[state]); +} + +void DoTVShowPokemonAngler(void) +{ + struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonAngler; + u8 state; + + gSpecialVar_Result = 0; + if (pokemonAngler->var02 < pokemonAngler->var03) + sTVShowState = 0; + else + sTVShowState = 1; + state = sTVShowState; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, pokemonAngler->playerName, pokemonAngler->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonAngler->var04]); + sub_80BF088(2, pokemonAngler->var03); + TVShowDone(); + break; + case 1: + TVShowConvertInternationalString(gStringVar1, pokemonAngler->playerName, pokemonAngler->language); + StringCopy(gStringVar2, gSpeciesNames[pokemonAngler->var04]); + sub_80BF088(2, pokemonAngler->var02); + TVShowDone(); + break; + } + ShowFieldMessage(gTVFishingGuruAdviceTextGroup[state]); +} + +void DoTVShowTheWorldOfMasters(void) +{ + struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[gSpecialVar_0x8004].worldOfMasters; + u8 state; + + gSpecialVar_Result = 0; + state = sTVShowState; + switch (state) + { + case 0: + TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName, + worldOfMasters->language); + sub_80BF088(1, worldOfMasters->var06); + sub_80BF088(2, worldOfMasters->var02); + sTVShowState = 1; + break; + case 1: + StringCopy(gStringVar1, gSpeciesNames[worldOfMasters->var08]); + sTVShowState = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName, + worldOfMasters->language); + GetMapSectionName(gStringVar2, worldOfMasters->var0a, 0); + StringCopy(gStringVar3, gSpeciesNames[worldOfMasters->var04]); + TVShowDone(); + break; + } + ShowFieldMessage(gTVWorldOfMastersTextGroup[state]); +} + +void TVShowDone(void) +{ + gSpecialVar_Result = 1; + sTVShowState = 0; + gSaveBlock1.tvShows[gSpecialVar_0x8004].common.active = 0; +} + +void ResetTVShowState(void) +{ + sTVShowState = 0; +} diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c new file mode 100644 index 000000000..8ea93aab8 --- /dev/null +++ b/src/use_pokeblock.c @@ -0,0 +1,904 @@ +// + +// Modified by Dizzy Egg on 8/15/17. +// + +#include "global.h" +#include "main.h" +#include "overworld.h" +#include "string_util.h" +#include "strings.h" +#include "sprite.h" +#include "pokemon.h" +#include "pokenav.h" +#include "palette.h" +#include "text.h" +#include "menu.h" +#include "sound.h" +#include "constants/songs.h" +#include "pokeblock.h" + +#define GFX_TAG_CONDITIONUPDOWN 0 + +#ifdef GERMAN +extern const u16 ConditionUpDownPalette[16]; +extern const u8 ConditionUpDownTiles[0x200]; +#else +const u16 ConditionUpDownPalette[] = INCBIN_U16("graphics/misc/condition_up_down.gbapal"); +const u8 ConditionUpDownTiles[] = INCBIN_U8("graphics/misc/condition_up_down.4bpp"); +#endif + +static const u32 sContestStatsMonData[] = { + MON_DATA_COOL, + MON_DATA_TOUGH, + MON_DATA_SMART, + MON_DATA_CUTE, + MON_DATA_BEAUTY +}; + +static const u8 gUnknown_0840612C[] = { + 0, 4, 3, 2, 1 +}; + +static const u8 *const sContextStatNames[] = { + OtherText_Coolness, + OtherText_Toughness, + OtherText_Smartness, + OtherText_Cuteness, + OtherText_Beauty +}; + +static const struct SpriteSheet gSpriteSheet_ConditionUpDown = { + ConditionUpDownTiles, + sizeof ConditionUpDownTiles, + GFX_TAG_CONDITIONUPDOWN +}; + +static const struct SpritePalette gSpritePalette_ConditionUpDown = { + ConditionUpDownPalette, + GFX_TAG_CONDITIONUPDOWN +}; + +static const s16 gUnknown_08406158[][2] = { + {0x9c, 0x1e}, + {0x75, 0x35}, + {0x75, 0x70}, + {0xc5, 0x70}, + {0xc5, 0x35} +}; + +static const struct OamData gOamData_840616C = { + .shape = 1, + .size = 2, + .priority = 1 +}; + +static const union AnimCmd gSpriteAnim_8406174[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_840617C[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8406184[] = { + gSpriteAnim_8406174, + gSpriteAnim_840617C +}; + +static const struct SpriteTemplate gSpriteTemplate_840618C = { + GFX_TAG_CONDITIONUPDOWN, + GFX_TAG_CONDITIONUPDOWN, + &gOamData_840616C, + gSpriteAnimTable_8406184, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +static EWRAM_DATA struct UnkPokenavStruct_Sub1 *gUnknown_02039304 = NULL; +static EWRAM_DATA MainCallback gUnknown_02039308 = NULL; +static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL; +EWRAM_DATA u8 gPokeblockMonID = 0; +EWRAM_DATA s16 gPokeblockGain = 0; + +extern u16 gSpecialVar_ItemId; // FIXME: remove after merge of #349 Pokeblock + +static void launch_c3_walk_stairs_and_run_once(void (*const)(void)); +static void sub_81361E4(void); +static void sub_813622C(void); +static void sub_8136244(void); +static void sub_8136264(void); +static void sub_8136294(void); +static void sub_81365A0(void); +static void sub_81365C8(void); +static void sub_8136638(void); +static void sub_81368A4(void); +void ScanlineEffect_InitHBlankDmaTransfer(void); +static void sub_8136B44(void); +static u8 sub_81370E4(u8); +static void sub_8136BB8(void); +static s8 sub_8136C40(void); +static bool8 sub_8137058(void); +static void sub_8136D60(void); +static void sub_8136808(void); +static void sub_8136D8C(void); +static u8 sub_81370A4(u8); +static void sub_81369CC(void); +static void sub_8136EF0(void); +static void sub_8137138(void); +static void sub_8136C6C(void); +static bool8 sub_8136D00(void); +static void Pokeblock_BufferEnhancedStatText(u8 *, u8, s16); +static void Pokeblock_MenuWindowTextPrint(const u8 *); +static void sub_8136F74(struct Pokeblock *, struct Pokemon *); +static void sub_81371DC(struct Sprite *); + +void sub_8136130(struct Pokeblock *pokeblock, MainCallback callback) +{ + gUnknown_02039304 = &gUnknown_083DFEC4->unkD164; + gUnknown_02039304->pokeblock = pokeblock; + gUnknown_02039304->callback = callback; + gUnknown_083DFEC4->unkD162[0] = 2; + launch_c3_walk_stairs_and_run_once(sub_8136294); + SetMainCallback2(sub_8136244); +} + +static void sub_8136174(void) +{ + gUnknown_02039304->pokeblock = gUnknown_0203930C; + gUnknown_02039304->callback = gUnknown_02039308; + gPokeblockMonID = sub_81370E4(gPokeblockMonID); + gUnknown_02039304->unk56 = gPokeblockMonID < 4 ? 0 : 1; + gUnknown_083DFEC4->unkD162[0] = 2; + launch_c3_walk_stairs_and_run_once(sub_8136294); + SetMainCallback2(sub_81361E4); +} + +static void sub_81361E4(void) +{ + gUnknown_02039304->unk0(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); + if (gUnknown_02039304->unk0 == sub_81365C8) + { + REG_DISPCNT = 0; + gUnknown_02039304->unk50 = 0; + SetMainCallback2(sub_813622C); + } +} + +static void sub_813622C(void) +{ + sub_81368A4(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_8136244(void) +{ + gUnknown_02039304->unk0(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_8136264(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_80F5CDC(6); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void launch_c3_walk_stairs_and_run_once(void (*const func)(void)) +{ + gUnknown_02039304->unk0 = func; + gUnknown_02039304->unk50 = 0; +} + +static void sub_8136294(void) +{ + bool32 c1LinkRelatedActive; + switch (gUnknown_02039304->unk50) + { + case 0: + c1LinkRelatedActive = is_c1_link_related_active(); + gUnknown_083DFEC4->unk6DAC = c1LinkRelatedActive; + if ((bool8)c1LinkRelatedActive == FALSE) + { + gUnknown_02039304->unk55 = 0; + launch_c3_walk_stairs_and_run_once(sub_81365A0); + gUnknown_02039304->unk50++; + } + break; + case 1: + ResetSpriteData(); + FreeAllSpritePalettes(); + gUnknown_02039304->unk50++; + break; + case 2: + SetVBlankCallback(NULL); + gUnknown_02039304->unk50++; + break; + case 3: + Text_LoadWindowTemplate(&gWindowTemplate_81E7080); + gUnknown_02039304->unk50++; + break; + case 4: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E7080); + gUnknown_02039304->unk50++; + break; + case 5: + if (MultistepInitMenuWindowContinue()) + { + gUnknown_02039304->unk50++; + } + break; + case 6: + gUnknown_083DFEC4->unk76AA = 0; + gUnknown_083DFEC4->unk87E0 = NULL; + gUnknown_083DFEC4->unk030C.val = 0x20; + gUnknown_02039304->unk50++; + break; + case 7: + sub_80F2688(); + gUnknown_02039304->unk50++; + // fallthrough + case 8: + if (!sub_80F26BC()) + { + gUnknown_02039304->unk50++; + } + break; + case 9: + sub_80F2C80(1); + gUnknown_02039304->unk50++; + // fallthrough + case 10: + if (!sub_80F2CBC(1)) + { + gUnknown_02039304->unk50++; + } + break; + case 11: + gKeyRepeatStartDelay = 20; + gUnknown_083DFEC4->unk8828 = CalculatePlayerPartyCount(); + gUnknown_083DFEC4->unk9344 = 0; + gUnknown_083DFEC4->unk8768 = NULL; + sub_80F4BD0(); + gUnknown_083DFEC4->unkD160 = 0; + gUnknown_02039304->unk50++; + break; + case 12: + if (!sub_80F1778()) + { + REG_BG2VOFS = 6; + REG_BG3VOFS = 6; + gUnknown_02039304->unk50++; + } + break; + case 13: + sub_80F2E18(0); + gUnknown_083DFEC4->unk8768->unk26 = 0xffd8; + gUnknown_02039304->unk50++; + break; + case 14: + if (!sub_80F170C()) + { + gUnknown_02039304->unk50++; + } + break; + case 15: + sub_80F33A8(); + gUnknown_02039304->unk50++; + break; + case 16: + DmaClear32(3, BG_SCREEN_ADDR(31), 0x800); + REG_BG1VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1CNT = BGCNT_SCREENBASE(31); + gUnknown_02039304->unk50++; + break; + case 17: + sub_80F567C(&gUnknown_083DFEC4->unk8ff0, gUnknown_083DFEC4->unk9004); + sub_80F5B38(); + gUnknown_02039304->unk50++; + break; + case 18: + if (!sub_80F5B50()) + { + gUnknown_02039304->unk50++; + } + break; + case 19: + sub_80F556C(gUnknown_083DFEC4->unk9004); + gUnknown_02039304->unk50++; + break; + case 20: + sub_80F1934(); + gUnknown_02039304->unk50++; + break; + case 21: + REG_WIN0H = 0xf0; + REG_WIN1H = 0x9b; + REG_WIN0V = 0x3273; + REG_WIN1V = 0x3273; + REG_WININ = 0x3f3f; + REG_WINOUT = 0x1b; + REG_BG0VOFS = 0x28; + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; + // fallthrough + case 22: + gUnknown_02039304->unk55 = 1; + launch_c3_walk_stairs_and_run_once(sub_81365C8); + break; + } +} + +static void sub_81365A0(void) +{ + while (!gUnknown_02039304->unk55) + { + sub_8136294(); + } +} + +static void sub_81365C8(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + SetVBlankCallback(sub_8136264); + gUnknown_02039304->unk50++; + break; + case 1: + if (!gPaletteFade.active) + { + sub_80F3C94(); + sub_80F3D00(); + launch_c3_walk_stairs_and_run_once(sub_8136638); + } + break; + } +} + +static void sub_8136638(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + if (gMain.heldKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + sub_80F5060(TRUE); + move_anim_execute(); + gUnknown_02039304->unk50 = 1; + } + else if (gMain.heldKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + sub_80F5060(FALSE); + move_anim_execute(); + gUnknown_02039304->unk50 = 1; + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_02039304->unk50 = 3; + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gUnknown_083DFEC4->unk87DC == gUnknown_083DFEC4->unk87DA - 1) + { + gUnknown_02039304->unk50 = 3; + } + else + { + gUnknown_02039304->unk50 = 5; + } + } + break; + case 1: + if (!gpu_sync_bg_show()) + { + gUnknown_02039304->unk50++; + } + break; + case 2: + if (!sub_8055870()) + { + sub_80F1934(); + sub_80F3D00(); + gUnknown_02039304->unk50 = 0; + } + break; + case 3: + launch_c3_walk_stairs_and_run_once(sub_8136B44); + break; + case 4: + break; + case 5: + sub_8136BB8(); + gUnknown_02039304->unk50++; + break; + case 6: + switch (sub_8136C40()) + { + case 1: + case -1: + gUnknown_02039304->unk50 = 0; + break; + case 0: + if (sub_8137058()) + { + sub_8136D60(); + gUnknown_02039304->unk50 = 7; + } + else + { + launch_c3_walk_stairs_and_run_once(sub_8136808); + } + break; + } + break; + case 7: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8136D8C(); + gUnknown_02039304->unk50 = 0; + } + break; + } +} + +static void sub_8136808(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + gPokeblockMonID = sub_81370A4(gUnknown_083DFEC4->unk87DC); + gUnknown_02039308 = gUnknown_02039304->callback; + gUnknown_0203930C = gUnknown_02039304->pokeblock; + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_02039304->unk50++; + break; + case 1: + if (!gPaletteFade.active) + { + gMain.savedCallback = sub_8136174; + SetMainCallback2(CB2_PreparePokeblockFeedScene); + } + break; + } +} + +static void sub_81368A4(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + if (gUnknown_083DFEC4->unk87DC != gPokeblockMonID) + { + sub_80F5060(gUnknown_02039304->unk56); + gUnknown_02039304->unk50++; + } + else + { + gUnknown_02039304->unk50 = 3; + } + break; + case 1: + if (!gpu_sync_bg_show()) + { + gUnknown_02039304->unk50++; + } + break; + case 2: + if (!sub_8055870()) + { + sub_80F1934(); + gUnknown_02039304->unk50 = 0; + } + break; + case 3: + BlendPalettes(-1, 16, 0); + gUnknown_02039304->unk50++; + break; + case 4: + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; + gUnknown_02039304->unk50++; + break; + case 5: + SetVBlankCallback(sub_8136264); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gUnknown_02039304->unk50++; + break; + case 6: + if (!gPaletteFade.active) + { + sub_80F3C94(); + sub_80F3D00(); + launch_c3_walk_stairs_and_run_once(sub_81369CC); + SetMainCallback2(sub_8136244); + } + break; + } +} + +static void sub_81369CC(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + gUnknown_02039304->pokemon = &gPlayerParty[0]; + gUnknown_02039304->pokemon = &gPlayerParty[gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx]; + move_anim_execute(); + gUnknown_02039304->unk50++; + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + gUnknown_02039304->unk50++; + break; + case 2: + sub_8136EF0(); + sub_80F567C(gUnknown_02039304->unk5c, gUnknown_083DFEC4->unk9040); + sub_80F5550(gUnknown_083DFEC4->unk9004[gUnknown_083DFEC4->unk8fe9], gUnknown_083DFEC4->unk9040); + sub_8137138(); + gUnknown_02039304->unk50++; + break; + case 3: + if (!sub_80F555C()) + { + sub_80F7224(sub_81370A4(gUnknown_083DFEC4->unk87DC)); + sub_80F3D00(); + gUnknown_02039304->unk52 = 0; + gUnknown_02039304->unk50++; + } + break; + case 4: + if ((++gUnknown_02039304->unk52) > 16) + { + sub_8136C6C(); + gUnknown_02039304->unk50++; + } + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON) && !sub_8136D00()) + { + PokeblockClearIfExists((u8)gSpecialVar_ItemId); + launch_c3_walk_stairs_and_run_once(sub_8136B44); + } + break; + } +} + +static void sub_8136B44(void) +{ + switch (gUnknown_02039304->unk50) + { + case 0: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_02039304->unk50++; + break; + case 1: + if (!gPaletteFade.active) + { + gUnknown_02039304->unk50 = 2; + } + break; + case 2: + sub_80F5BDC(); + gUnknown_02039304->unk50++; + break; + case 3: + SetMainCallback2(gUnknown_02039304->callback); + break; + } +} + +static void sub_8136BB8(void) +{ + GetMonData(&gPlayerParty[sub_81370A4(gUnknown_083DFEC4->unk87DC)], MON_DATA_NICKNAME, gUnknown_02039304->stringBuffer); + StringGetEnd10(gUnknown_02039304->stringBuffer); + StringAppend(gUnknown_02039304->stringBuffer, gOtherText_GetsAPokeBlock); + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(gUnknown_02039304->stringBuffer, 1, 17); + DisplayYesNoMenu(23, 10, 1); + Menu_MoveCursor(0); +} + +static s8 sub_8136C40(void) +{ + s8 retval = Menu_ProcessInputNoWrap(); + if ((u8)(retval + 1) < 3) + { + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7080); + } + return retval; +} + +static void sub_8136C6C(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + for (gUnknown_02039304->unk53 = 0; gUnknown_02039304->unk53 < 5 && gUnknown_02039304->unk61[gUnknown_02039304->unk53] == 0; gUnknown_02039304->unk53++); + if (gUnknown_02039304->unk53 < 5) + { + Pokeblock_BufferEnhancedStatText(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, gUnknown_02039304->unk61[gUnknown_02039304->unk53]); + } + else + { + Pokeblock_BufferEnhancedStatText(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, 0); + } + Pokeblock_MenuWindowTextPrint(gUnknown_02039304->stringBuffer); +} + +static bool8 sub_8136D00(void) +{ + while (1) + { + gUnknown_02039304->unk53++; + if (gUnknown_02039304->unk53 < 5) + { + if (gUnknown_02039304->unk61[gUnknown_02039304->unk53] != 0) + break; + } + else + { + gUnknown_02039304->unk53 = 5; + return FALSE; + } + } + Pokeblock_BufferEnhancedStatText(gUnknown_02039304->stringBuffer, gUnknown_02039304->unk53, gUnknown_02039304->unk61[gUnknown_02039304->unk53]); + Pokeblock_MenuWindowTextPrint(gUnknown_02039304->stringBuffer); + return TRUE; +} + +static void sub_8136D60(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(gOtherText_WontEat, 1, 17); +} + +static void sub_8136D8C(void) +{ + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7080); +} + +static void Pokeblock_MenuWindowTextPrint(const u8 *message) +{ + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(message, 1, 17); +} + +#ifdef NONMATCHING +static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 statID, s16 a2) +{ + if (a2 != 0) + { + StringCopy(dest, sContextStatNames[statID]); + StringAppend(dest, gOtherText_WasEnhanced); + } + else + { + StringCopy(dest, gOtherText_NothingChanged); + } +} +#else +__attribute__((naked)) +static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 a1, s16 a2) +{ + asm_unified("\tpush {r4,lr}\n" + "\tadds r4, r0, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r3, r1, 24\n" + "\tlsls r2, 16\n" + "\tlsrs r0, r2, 16\n" + "\tasrs r2, 16\n" + "\tcmp r2, 0\n" + "\tbeq _08136DFC\n" + "\tcmp r2, 0\n" + "\tble _08136DD8\n" + "\tmovs r0, 0\n" + "_08136DD8:\n" + "\tlsls r0, 16\n" + "\tldr r1, _08136DF4 @ =sContextStatNames\n" + "\tlsls r0, r3, 2\n" + "\tadds r0, r1\n" + "\tldr r1, [r0]\n" + "\tadds r0, r4, 0\n" + "\tbl StringCopy\n" + "\tldr r1, _08136DF8 @ =gOtherText_WasEnhanced\n" + "\tadds r0, r4, 0\n" + "\tbl StringAppend\n" + "\tb _08136E04\n" + "\t.align 2, 0\n" + "_08136DF4: .4byte sContextStatNames\n" + "_08136DF8: .4byte gOtherText_WasEnhanced\n" + "_08136DFC:\n" + "\tldr r1, _08136E0C @ =gOtherText_NothingChanged\n" + "\tadds r0, r4, 0\n" + "\tbl StringCopy\n" + "_08136E04:\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08136E0C: .4byte gOtherText_NothingChanged"); +} +#endif + +static void Pokeblock_GetMonContestStats(struct Pokemon *pokemon, u8 *data) +{ + u16 i; + for (i=0; i<5; i++) + { + data[i] = GetMonData(pokemon, sContestStatsMonData[i]); + } +} + +static void sub_8136E40(struct Pokeblock *pokeblock, struct Pokemon *pokemon) +{ + u16 i; + s16 cstat; + u8 data; + if (GetMonData(pokemon, MON_DATA_SHEEN) != 255) + { + sub_8136F74(pokeblock, pokemon); + for (i=0; i<5; i++) + { + data = GetMonData(pokemon, sContestStatsMonData[i]); + cstat = data + gUnknown_02039304->unk66[i]; + if (cstat < 0) + cstat = 0; + if (cstat > 255) + cstat = 255; + data = cstat; + SetMonData(pokemon, sContestStatsMonData[i], &data); + } + cstat = (u8)GetMonData(pokemon, MON_DATA_SHEEN); + cstat = cstat + pokeblock->feel; + if (cstat > 255) + cstat = 255; + data = cstat; + SetMonData(pokemon, MON_DATA_SHEEN, &data); + } +} + +static void sub_8136EF0(void) +{ + u16 i; + struct Pokemon *pokemon = gPlayerParty; + pokemon += gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx; + Pokeblock_GetMonContestStats(pokemon, gUnknown_02039304->unk57); + sub_8136E40(gUnknown_02039304->pokeblock, pokemon); + Pokeblock_GetMonContestStats(pokemon, gUnknown_02039304->unk5c); + for (i=0; i<5; i++) + { + gUnknown_02039304->unk61[i] = gUnknown_02039304->unk5c[i] - gUnknown_02039304->unk57[i]; + } +} + +static void sub_8136F74(struct Pokeblock *pokeblock, struct Pokemon *pokemon) +{ + s8 direction; + s8 i; + s16 amount; + s8 boost; + s8 taste; + gUnknown_02039304->unk66[0] = pokeblock->spicy; + gUnknown_02039304->unk66[1] = pokeblock->sour; + gUnknown_02039304->unk66[2] = pokeblock->bitter; + gUnknown_02039304->unk66[3] = pokeblock->sweet; + gUnknown_02039304->unk66[4] = pokeblock->dry; + if (gPokeblockGain > 0) + direction = 1; + else if (gPokeblockGain < 0) + direction = -1; + else + return; + for (i=0; i<5; i++) + { + amount = gUnknown_02039304->unk66[i]; + boost = amount / 10; + if (amount % 10 >= 5) // round to the nearest + boost++; + taste = sub_8040A54(pokemon, gUnknown_0840612C[i]); + if (taste == direction) + { + gUnknown_02039304->unk66[i] += boost * taste; + } + } +} + +static bool8 sub_8137058(void) +{ + struct Pokemon *pokemon = gPlayerParty; + pokemon += gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].partyIdx; + if (GetMonData(pokemon, MON_DATA_SHEEN) == 255) + return TRUE; + return FALSE; +} + +static u8 sub_81370A4(u8 a0) +{ + u8 i; + for (i=0; iunk54 = 0; + for (flavor=0; flavor<5; flavor++) + { + if (gUnknown_02039304->unk61[flavor] != 0) + { + spriteidx = CreateSprite(&gSpriteTemplate_840618C, gUnknown_08406158[flavor][0], gUnknown_08406158[flavor][1], 0); + if (spriteidx != MAX_SPRITES) + { + if (gUnknown_02039304->unk61[flavor] != 0) + { + gSprites[spriteidx].callback = sub_81371DC; + } + gUnknown_02039304->unk54++; + } + } + } +} + +static void sub_81371DC(struct Sprite *sprite) +{ + if (sprite->data[0] <= 5) + sprite->pos2.y -= 2; + else if (sprite->data[0] <= 11) + sprite->pos2.y += 2; + if ((++sprite->data[0]) > 60) + { + DestroySprite(sprite); + gUnknown_02039304->unk54--; + } +} diff --git a/src/util.c b/src/util.c new file mode 100644 index 000000000..582b9f806 --- /dev/null +++ b/src/util.c @@ -0,0 +1,525 @@ +#include "global.h" +#include "util.h" + +const u32 gBitTable[] = +{ + 1 << 0, + 1 << 1, + 1 << 2, + 1 << 3, + 1 << 4, + 1 << 5, + 1 << 6, + 1 << 7, + 1 << 8, + 1 << 9, + 1 << 10, + 1 << 11, + 1 << 12, + 1 << 13, + 1 << 14, + 1 << 15, + 1 << 16, + 1 << 17, + 1 << 18, + 1 << 19, + 1 << 20, + 1 << 21, + 1 << 22, + 1 << 23, + 1 << 24, + 1 << 25, + 1 << 26, + 1 << 27, + 1 << 28, + 1 << 29, + 1 << 30, + 1 << 31, +}; + +static const struct SpriteTemplate gInvisibleSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const u8 gSpriteDimensions[3][4][2] = +{ + // square + { + {1, 1}, + {2, 2}, + {4, 4}, + {8, 8}, + }, + + // horizontal rectangle + { + {2, 1}, + {4, 1}, + {4, 2}, + {8, 4}, + }, + + // vertical rectangle + { + {1, 2}, + {1, 4}, + {2, 4}, + {4, 8}, + }, +}; + +static const u16 gCrc16Table[] = +{ + 0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF, + 0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7, + 0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E, + 0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876, + 0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD, + 0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5, + 0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C, + 0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974, + 0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB, + 0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3, + 0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A, + 0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72, + 0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9, + 0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1, + 0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738, + 0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70, + 0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7, + 0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF, + 0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036, + 0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E, + 0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5, + 0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD, + 0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134, + 0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C, + 0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3, + 0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB, + 0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232, + 0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A, + 0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1, + 0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9, + 0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330, + 0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78, +}; + +const u8 gMiscBlank_Gfx[] = INCBIN_U8("graphics/interface/blank.4bpp"); + + +u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *)) +{ + u8 sprite = CreateSprite(&gInvisibleSpriteTemplate, 248, 168, 14); + gSprites[sprite].invisible = TRUE; + gSprites[sprite].callback = callback; + return sprite; +} + +void StoreWordInTwoHalfwords(u16 *h, u32 w) +{ + h[0] = (u16)(w); + h[1] = (u16)(w >> 16); +} + +void LoadWordFromTwoHalfwords(u16 *h, u32 *w) +{ + *w = h[0] | (s16)h[1] << 16; +} + +void SetBgAffineStruct(struct BgAffineSrcData *src, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) +{ + src->texX = texX; + src->texY = texY; + src->scrX = scrX; + src->scrY = scrY; + src->sx = sx; + src->sy = sy; + src->alpha = alpha; +} + +void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s16 scrY, s16 sx, s16 sy, u16 alpha) +{ + struct BgAffineSrcData src; + + SetBgAffineStruct(&src, texX, texY, scrX, scrY, sx, sy, alpha); + BgAffineSet(&src, dest, 1); +} + +#ifdef NONMATCHING + +// Functionally equivalent. +// Only the two yflip loops don't match. +void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) +{ + u8 x, y; + s8 i, j; + u8 xflip[32]; + u8 h = gSpriteDimensions[shape][size][1]; + u8 w = gSpriteDimensions[shape][size][0]; + + for (y = 0; y < h; y++) + { + int filler = 32 - w; + + for (x = 0; x < w; x++) + { + int tile = (*tilemap & 0x3ff) * 32; + int attr = *tilemap & 0xc00; + + if (attr == 0) + { + void *src = tiles + tile; + void *dest = output; + int length = 32; + DmaCopy32(3, src, dest, length); + } + else if (attr == 0x800) // yflip + { + for (i = 0; i < 8; i++) + { + void *src = tiles; + void *dest = output; + int length = 4; + // this is likely wrong, but makes it closer to matching + src += tile + (7 - i) * 4; + dest += i * 4; + DmaCopy32(3, src, dest, length); + } + } + else // xflip + { + for (i = 0; i < 8; i++) + { + for (j = 0; j < 4; j++) + { + u8 i2 = i * 4; + xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4; + xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4; + } + } + if (*tilemap & 0x800) // yflip + { + for (i = 0; i < 8; i++) + { + void *src = xflip + (7-i) * 4; + void *dest = output + i*4; + int length = 4; + DmaCopy32(3, src, dest, length); + } + } + else + { + void *src = xflip; + void *dest = output; + int length = 32; + DmaCopy32(3, src, dest, length); + } + } + tilemap++; + output += 32; + } + tilemap += filler; + } +} + +#else + +__attribute__((naked)) void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) +{ + asm("\n" + " .syntax unified\n" + " push {r4-r7,lr}\n" + " mov r7, r10\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5-r7}\n" + " sub sp, 0x3C\n" + " str r2, [sp, 0x20]\n" + " adds r4, r3, 0\n" + " ldr r7, [sp, 0x5C]\n" + " lsls r0, 24\n" + " lsls r1, 24\n" + " ldr r2, _08041008 @ =gSpriteDimensions\n" + " lsrs r1, 23\n" + " lsrs r0, 21\n" + " adds r1, r0\n" + " adds r0, r2, 0x1\n" + " adds r0, r1, r0\n" + " ldrb r0, [r0]\n" + " str r0, [sp, 0x24]\n" + " adds r1, r2\n" + " ldrb r1, [r1]\n" + " str r1, [sp, 0x28]\n" + " movs r1, 0\n" + " cmp r1, r0\n" + " bcc _08040FB4\n" + " b _08041136\n" + "_08040FB4:\n" + " movs r0, 0x20\n" + " ldr r2, [sp, 0x28]\n" + " subs r0, r2\n" + " lsls r0, 1\n" + " str r0, [sp, 0x2C]\n" + "_08040FBE:\n" + " movs r2, 0\n" + " adds r1, 0x1\n" + " str r1, [sp, 0x34]\n" + " ldr r3, [sp, 0x28]\n" + " cmp r2, r3\n" + " bcc _08040FCC\n" + " b _08041124\n" + "_08040FCC:\n" + " ldr r0, _0804100C @ =0x040000d4\n" + " mov r8, r0\n" + "_08040FD0:\n" + " ldrh r1, [r4]\n" + " ldr r0, _08041010 @ =0x000003ff\n" + " ands r0, r1\n" + " lsls r0, 5\n" + " mov r12, r0\n" + " movs r0, 0xC0\n" + " lsls r0, 4\n" + " ands r0, r1\n" + " mov r3, sp\n" + " strh r1, [r3, 0x38]\n" + " cmp r0, 0\n" + " bne _08041018\n" + " ldr r0, [sp, 0x20]\n" + " add r0, r12\n" + " mov r1, r8\n" + " str r0, [r1]\n" + " str r7, [r1, 0x4]\n" + " ldr r3, _08041014 @ =0x84000008\n" + " str r3, [r1, 0x8]\n" + " ldr r0, [r1, 0x8]\n" + " adds r4, 0x2\n" + " str r4, [sp, 0x30]\n" + " adds r7, 0x20\n" + " mov r10, r7\n" + " adds r2, 0x1\n" + " mov r9, r2\n" + " b _08041112\n" + " .align 2, 0\n" + "_08041008: .4byte gSpriteDimensions\n" + "_0804100C: .4byte 0x040000d4\n" + "_08041010: .4byte 0x000003ff\n" + "_08041014: .4byte 0x84000008\n" + "_08041018:\n" + " movs r1, 0x80\n" + " lsls r1, 4\n" + " cmp r0, r1\n" + " bne _08041068\n" + " movs r3, 0\n" + " adds r4, 0x2\n" + " str r4, [sp, 0x30]\n" + " movs r0, 0x20\n" + " adds r0, r7\n" + " mov r10, r0\n" + " adds r2, 0x1\n" + " mov r9, r2\n" + " ldr r4, _08041060 @ =0x040000d4\n" + " ldr r6, _08041064 @ =0x84000001\n" + " movs r5, 0x7\n" + "_08041036:\n" + " lsls r2, r3, 24\n" + " asrs r2, 24\n" + " subs r0, r5, r2\n" + " lsls r0, 2\n" + " add r0, r12\n" + " ldr r1, [sp, 0x20]\n" + " adds r0, r1, r0\n" + " lsls r1, r2, 2\n" + " adds r1, r7, r1\n" + " str r0, [r4]\n" + " str r1, [r4, 0x4]\n" + " str r6, [r4, 0x8]\n" + " ldr r0, [r4, 0x8]\n" + " adds r2, 0x1\n" + " lsls r2, 24\n" + " lsrs r3, r2, 24\n" + " asrs r2, 24\n" + " cmp r2, 0x7\n" + " ble _08041036\n" + " b _08041112\n" + " .align 2, 0\n" + "_08041060: .4byte 0x040000d4\n" + "_08041064: .4byte 0x84000001\n" + "_08041068:\n" + " movs r3, 0\n" + " adds r4, 0x2\n" + " str r4, [sp, 0x30]\n" + " movs r0, 0x20\n" + " adds r0, r7\n" + " mov r10, r0\n" + " adds r2, 0x1\n" + " mov r9, r2\n" + "_08041078:\n" + " movs r2, 0\n" + " lsls r4, r3, 24\n" + " lsls r0, r4, 2\n" + " lsrs r0, 24\n" + " adds r6, r0, 0x3\n" + " mov r1, r12\n" + " adds r5, r1, r0\n" + "_08041086:\n" + " lsls r1, r2, 24\n" + " asrs r1, 24\n" + " subs r0, r6, r1\n" + " mov r2, sp\n" + " adds r3, r2, r0\n" + " adds r0, r5, r1\n" + " ldr r2, [sp, 0x20]\n" + " adds r0, r2, r0\n" + " ldrb r2, [r0]\n" + " movs r0, 0xF\n" + " ands r0, r2\n" + " lsls r0, 4\n" + " lsrs r2, 4\n" + " orrs r0, r2\n" + " strb r0, [r3]\n" + " adds r1, 0x1\n" + " lsls r1, 24\n" + " lsrs r2, r1, 24\n" + " asrs r1, 24\n" + " cmp r1, 0x3\n" + " ble _08041086\n" + " movs r3, 0x80\n" + " lsls r3, 17\n" + " adds r0, r4, r3\n" + " lsrs r3, r0, 24\n" + " asrs r0, 24\n" + " cmp r0, 0x7\n" + " ble _08041078\n" + " movs r0, 0x80\n" + " lsls r0, 4\n" + " mov r1, sp\n" + " ldrh r1, [r1, 0x38]\n" + " ands r0, r1\n" + " cmp r0, 0\n" + " beq _08041104\n" + " movs r3, 0\n" + " ldr r4, _080410FC @ =0x040000d4\n" + " ldr r6, _08041100 @ =0x84000001\n" + " movs r5, 0x7\n" + "_080410D4:\n" + " lsls r1, r3, 24\n" + " asrs r1, 24\n" + " subs r0, r5, r1\n" + " lsls r0, 2\n" + " mov r3, sp\n" + " adds r2, r3, r0\n" + " lsls r0, r1, 2\n" + " adds r0, r7, r0\n" + " str r2, [r4]\n" + " str r0, [r4, 0x4]\n" + " str r6, [r4, 0x8]\n" + " ldr r0, [r4, 0x8]\n" + " adds r1, 0x1\n" + " lsls r1, 24\n" + " lsrs r3, r1, 24\n" + " asrs r1, 24\n" + " cmp r1, 0x7\n" + " ble _080410D4\n" + " b _08041112\n" + " .align 2, 0\n" + "_080410FC: .4byte 0x040000d4\n" + "_08041100: .4byte 0x84000001\n" + "_08041104:\n" + " mov r0, sp\n" + " mov r1, r8\n" + " str r0, [r1]\n" + " str r7, [r1, 0x4]\n" + " ldr r2, _08041148 @ =0x84000008\n" + " str r2, [r1, 0x8]\n" + " ldr r0, [r1, 0x8]\n" + "_08041112:\n" + " ldr r4, [sp, 0x30]\n" + " mov r7, r10\n" + " mov r3, r9\n" + " lsls r0, r3, 24\n" + " lsrs r2, r0, 24\n" + " ldr r0, [sp, 0x28]\n" + " cmp r2, r0\n" + " bcs _08041124\n" + " b _08040FD0\n" + "_08041124:\n" + " ldr r1, [sp, 0x2C]\n" + " adds r4, r1\n" + " ldr r2, [sp, 0x34]\n" + " lsls r0, r2, 24\n" + " lsrs r1, r0, 24\n" + " ldr r3, [sp, 0x24]\n" + " cmp r1, r3\n" + " bcs _08041136\n" + " b _08040FBE\n" + "_08041136:\n" + " add sp, 0x3C\n" + " pop {r3-r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov r10, r5\n" + " pop {r4-r7}\n" + " pop {r0}\n" + " bx r0\n" + " .align 2, 0\n" + "_08041148: .4byte 0x84000008\n" + " .syntax divided\n" + ); +} + +#endif + +int CountTrailingZeroBits(u32 value) +{ + u8 i; + + for (i = 0; i < 32; i++) + { + if ((value & 1) == 0) + value >>= 1; + else + return i; + } + return 0; +} + +u16 CalcCRC16(u8 *data, int length) +{ + u16 i, j; + u16 crc = 0x1121; + + for (i = 0; i < length; i++) + { + crc ^= data[i]; + for (j = 0; j < 8; j++) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x8408; + else + crc >>= 1; + } + } + return ~crc; +} + +u16 CalcCRC16WithTable(u8 *data, int length) +{ + u16 i; + u16 crc = 0x1121; + u8 byte; + + for (i = 0; i < length; i++) + { + byte = crc >> 8; + crc ^= data[i]; + crc = byte ^ gCrc16Table[(u8)crc]; + } + return ~crc; +} diff --git a/src/wallclock.c b/src/wallclock.c new file mode 100644 index 000000000..1f743a61a --- /dev/null +++ b/src/wallclock.c @@ -0,0 +1,1046 @@ +#include "global.h" +#include "wallclock.h" +#include "decompress.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "rtc.h" +#include "constants/songs.h" +#include "sound.h" +#include "strings2.h" +#include "task.h" +#include "trig.h" +#include "scanline_effect.h" + +extern u16 gSpecialVar_0x8004; +extern u8 gMiscClock_Gfx[]; +extern u8 gUnknown_08E95774[]; +extern u8 gUnknown_08E954B0[]; +extern u16 gMiscClockMale_Pal[]; +extern u16 gMiscClockFemale_Pal[]; + +//-------------------------------------------------- +// Graphics Data +//-------------------------------------------------- + +static const u8 ClockGfx_Misc[] = INCBIN_U8("graphics/misc/clock_misc.4bpp.lz"); +static const struct CompressedSpriteSheet gUnknown_083F7A90[] = +{ + {ClockGfx_Misc, 0x2000, 0x1000}, + {NULL}, +}; +static const struct SpritePalette gUnknown_083F7AA0[] = +{ + {gMiscClockMale_Pal, 0x1000}, + {gMiscClockFemale_Pal, 0x1001}, + {NULL}, +}; +static const struct OamData gOamData_83F7AB8 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_83F7AC0[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83F7AC8[] = +{ + ANIMCMD_FRAME(64, 30), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7AD0[] = +{ + gSpriteAnim_83F7AC0, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7AD4[] = +{ + gSpriteAnim_83F7AC8, +}; +static void sub_810B05C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F7AD8 = +{ + .tileTag = 0x1000, + .paletteTag = 0x1000, + .oam = &gOamData_83F7AB8, + .anims = gSpriteAnimTable_83F7AD0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810B05C, +}; +static void sub_810B0F4(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F7AF0 = +{ + .tileTag = 0x1000, + .paletteTag = 0x1000, + .oam = &gOamData_83F7AB8, + .anims = gSpriteAnimTable_83F7AD4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810B0F4, +}; +static const struct OamData gOamData_83F7B08 = +{ + .y = 160, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; +static const union AnimCmd gSpriteAnim_83F7B10[] = +{ + ANIMCMD_FRAME(132, 30), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_83F7B18[] = +{ + ANIMCMD_FRAME(128, 30), + ANIMCMD_END, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7B20[] = +{ + gSpriteAnim_83F7B10, +}; +static const union AnimCmd *const gSpriteAnimTable_83F7B24[] = +{ + gSpriteAnim_83F7B18, +}; +static void sub_810B18C(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F7B28 = +{ + .tileTag = 0x1000, + .paletteTag = 0x1000, + .oam = &gOamData_83F7B08, + .anims = gSpriteAnimTable_83F7B20, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810B18C, +}; +static void sub_810B230(struct Sprite *sprite); +static const struct SpriteTemplate gSpriteTemplate_83F7B40 = +{ + .tileTag = 0x1000, + .paletteTag = 0x1000, + .oam = &gOamData_83F7B08, + .anims = gSpriteAnimTable_83F7B24, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810B230, +}; + +static void WallClockVblankCallback(void); +static void LoadWallClockGraphics(void); +static void WallClockMainCallback(void); +static void WallClockInit(void); +static void Task_SetClock1(u8 taskId); +static void Task_SetClock2(u8 taskId); +static void Task_SetClock3(u8 taskId); +static void Task_SetClock4(u8 taskId); +static void Task_SetClock5(u8 taskId); +static void Task_SetClock6(u8 taskId); +static void Task_ViewClock1(u8 taskId); +static void Task_ViewClock2(u8 taskId); +static void Task_ViewClock3(u8 taskId); +static void Task_ViewClock4(u8 taskId); +static u8 CalcMinHandDelta(u16 speed); +static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed); +static u8 AdvanceClock(u8 taskId, u8 direction); +static void UpdateClockPeriod(u8 taskId, u8 direction); +static void InitClockWithRtc(u8 taskId); + +enum +{ + PERIOD_AM, + PERIOD_PM, +}; + +enum +{ + MVMT_NONE, + MVMT_BACKWARD, + MVMT_FORWARD, +}; + +static void WallClockVblankCallback(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void LoadWallClockGraphics(void) +{ + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG3CNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + + LZ77UnCompVram(gMiscClock_Gfx, (void *)VRAM); + if (gSpecialVar_0x8004 == MALE) + LoadPalette(gMiscClockMale_Pal, 0, 32); + else + LoadPalette(gMiscClockFemale_Pal, 0, 32); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + LoadCompressedObjectPic(&gUnknown_083F7A90[0]); + LoadSpritePalettes(gUnknown_083F7AA0); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); +} + +static void WallClockInit(void) +{ + u16 ime; + + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(WallClockVblankCallback); + SetMainCallback2(WallClockMainCallback); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_BG3CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | + DISPCNT_BG3_ON | DISPCNT_OBJ_ON; +} + +#define tMinuteHandAngle data[0] +#define tHourHandAngle data[1] +#define tHours data[2] +#define tMinutes data[3] +#define tMvmtDir data[4] +#define tPeriod data[5] +#define tMvmtSpeed data[6] + +//Allow player to set the clock +void CB2_StartWallClock(void) +{ + u8 taskId; + u8 spriteId; + + LoadWallClockGraphics(); + LZ77UnCompVram(&gUnknown_08E954B0, (void *)(VRAM + 0x3800)); + + taskId = CreateTask(Task_SetClock1, 0); + gTasks[taskId].tHours = 10; + gTasks[taskId].tMinutes = 0; + gTasks[taskId].tMvmtDir = MVMT_NONE; + gTasks[taskId].tPeriod = PERIOD_AM; + gTasks[taskId].tMvmtSpeed = 0; + gTasks[taskId].tMinuteHandAngle = 0; + gTasks[taskId].tHourHandAngle = 300; + + spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 1); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 1; + + spriteId = CreateSprite(&gSpriteTemplate_83F7B28, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 45; + + spriteId = CreateSprite(&gSpriteTemplate_83F7B40, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 90; + + WallClockInit(); +} + +//View, but don't set, the clock +void CB2_ViewWallClock(void) +{ + u8 taskId; + s16 angle1; + s16 angle2; + u8 spriteId; + + LoadWallClockGraphics(); + LZ77UnCompVram(gUnknown_08E95774, (void *)(VRAM + 0x3800)); + + taskId = CreateTask(Task_ViewClock1, 0); + InitClockWithRtc(taskId); + if (gTasks[taskId].tPeriod == PERIOD_AM) + { + angle1 = 45; + angle2 = 90; + } + else + { + angle1 = 90; + angle2 = 135; + } + + spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, 120, 80, 1); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 0; + + spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, 120, 80, 0); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 1; + + spriteId = CreateSprite(&gSpriteTemplate_83F7B28, 120, 80, 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = angle1; + + spriteId = CreateSprite(&gSpriteTemplate_83F7B40, 120, 80, 2); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = angle2; + + WallClockInit(); +} + +static void WallClockMainCallback(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_SetClock1(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_SetClock2; +} + +//Handle keypresses when setting clock +static void Task_SetClock2(u8 taskId) +{ + if (gTasks[taskId].tMinuteHandAngle % 6) + { + gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle( + gTasks[taskId].tMinuteHandAngle, + gTasks[taskId].tMvmtDir, + gTasks[taskId].tMvmtSpeed); + } + else + { + gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; + gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; + if (gMain.newKeys & A_BUTTON) + { + gTasks[taskId].func = Task_SetClock3; + return; + } + else + { + gTasks[taskId].tMvmtDir = gMain.newKeys & A_BUTTON; + if (gMain.heldKeys & DPAD_LEFT) + gTasks[taskId].tMvmtDir = MVMT_BACKWARD; + if (gMain.heldKeys & DPAD_RIGHT) + gTasks[taskId].tMvmtDir = MVMT_FORWARD; + if (gTasks[taskId].tMvmtDir) + { + if (gTasks[taskId].tMvmtSpeed < 0xFF) + gTasks[taskId].tMvmtSpeed++; + gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle( + gTasks[taskId].tMinuteHandAngle, + gTasks[taskId].tMvmtDir, + gTasks[taskId].tMvmtSpeed); + AdvanceClock(taskId, gTasks[taskId].tMvmtDir); + } + else + { + gTasks[taskId].tMvmtSpeed = 0; + } + } + } +} + +//Ask player "Is this the correct time?" +static void Task_SetClock3(u8 taskId) +{ + Menu_DrawStdWindowFrame(2, 16, 27, 19); + Menu_PrintText(gOtherText_CorrectTimePrompt, 3, 17); + Menu_DrawStdWindowFrame(23, 8, 29, 13); + Menu_PrintItems(24, 9, 2, gMenuYesNoItems); + InitMenu(0, 24, 9, 2, 1, 5); + gTasks[taskId].func = Task_SetClock4; +} + +//Get menu selection +static void Task_SetClock4(u8 taskId) +{ + switch (Menu_ProcessInputNoWrap_()) + { + case 0: //YES + PlaySE(SE_SELECT); + gTasks[taskId].func = Task_SetClock5; //Move on + return; + case -1: //B button + case 1: //NO + Menu_DestroyCursor(); + PlaySE(SE_SELECT); + Menu_EraseWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(2, 16, 27, 19); + gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock + } +} + +//Set the time offset based on the wall clock's time +static void Task_SetClock5(u8 taskId) +{ + RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_SetClock6; +} + +static void Task_SetClock6(u8 taskId) +{ + if (!gPaletteFade.active) + SetMainCallback2((MainCallback)gMain.savedCallback); +} + +static void Task_ViewClock1(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_ViewClock2; +} + +//Wait for A or B press +static void Task_ViewClock2(u8 taskId) +{ + InitClockWithRtc(taskId); + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + gTasks[taskId].func = Task_ViewClock3; +} + +static void Task_ViewClock3(u8 taskId) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = Task_ViewClock4; +} + +static void Task_ViewClock4(u8 taskId) +{ + if (!gPaletteFade.active) + SetMainCallback2((MainCallback)gMain.savedCallback); +} + +static u8 CalcMinHandDelta(u16 speed) +{ + if (speed > 60) + return 6; + else if (speed > 30) + return 3; + else if (speed > 10) + return 2; + else + return 1; +} + +//Calculates the new angle of the minute hand when setting the clock +static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed) +{ + u8 delta = CalcMinHandDelta(speed); + + switch (direction) + { + case MVMT_BACKWARD: + if (angle) + angle = angle - delta; + else + angle = 360 - delta; + break; + case MVMT_FORWARD: + if (angle < 360 - delta) + angle = angle + delta; + else + angle = 0; + break; + } + return angle; +} + +//Advances clock forward or backward by 1 minute +static u8 AdvanceClock(u8 taskId, u8 direction) +{ + switch (direction) + { + case MVMT_BACKWARD: + if (gTasks[taskId].tMinutes > 0) + gTasks[taskId].tMinutes--; + else + { + gTasks[taskId].tMinutes = 59; + if (gTasks[taskId].tHours > 0) + gTasks[taskId].tHours--; + else + gTasks[taskId].tHours = 23; + UpdateClockPeriod(taskId, direction); + } + break; + case MVMT_FORWARD: + if (gTasks[taskId].tMinutes < 59) + gTasks[taskId].tMinutes++; + else + { + gTasks[taskId].tMinutes = 0; + if (gTasks[taskId].tHours < 23) + gTasks[taskId].tHours++; + else + gTasks[taskId].tHours = 0; + UpdateClockPeriod(taskId, direction); + } + break; + } + return 0; +} + +//Updates the clock period (AM/PM) if it needs to change +static void UpdateClockPeriod(u8 taskId, u8 direction) +{ + u8 hours = gTasks[taskId].tHours; + + switch (direction) + { + case MVMT_BACKWARD: + switch (hours) + { + case 11: + gTasks[taskId].tPeriod = PERIOD_AM; + break; + case 23: + gTasks[taskId].tPeriod = PERIOD_PM; + break; + } + break; + case MVMT_FORWARD: + switch (hours) + { + case 0: + gTasks[taskId].tPeriod = PERIOD_AM; + break; + case 12: + gTasks[taskId].tPeriod = PERIOD_PM; + break; + } + break; + } +} + +static void InitClockWithRtc(u8 taskId) +{ + RtcCalcLocalTime(); + gTasks[taskId].tHours = gLocalTime.hours; + gTasks[taskId].tMinutes = gLocalTime.minutes; + gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6; + gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5; + if (gLocalTime.hours <= 11) + gTasks[taskId].tPeriod = PERIOD_AM; + else + gTasks[taskId].tPeriod = PERIOD_PM; +} + +static const s8 gClockHandCoords[][2] = +{ + { 0, -24}, + { 1, -25}, + { 1, -25}, + { 2, -25}, + { 2, -25}, + { 2, -25}, + { 3, -24}, + { 3, -25}, + { 4, -25}, + { 4, -25}, + { 4, -25}, + { 5, -25}, + { 5, -25}, + { 6, -24}, + { 6, -24}, + { 6, -24}, + { 7, -24}, + { 7, -24}, + { 7, -24}, + { 8, -24}, + { 8, -24}, + { 9, -24}, + { 9, -24}, + { 10, -23}, + { 10, -23}, + { 11, -22}, + { 11, -22}, + { 11, -22}, + { 12, -22}, + { 12, -21}, + { 13, -21}, + { 13, -21}, + { 13, -21}, + { 14, -21}, + { 14, -21}, + { 14, -20}, + { 14, -20}, + { 15, -20}, + { 15, -19}, + { 16, -19}, + { 16, -19}, + { 16, -19}, + { 16, -18}, + { 16, -18}, + { 17, -18}, + { 17, -17}, + { 17, -17}, + { 18, -17}, + { 18, -17}, + { 18, -16}, + { 18, -16}, + { 19, -16}, + { 19, -15}, + { 19, -15}, + { 20, -15}, + { 20, -14}, + { 20, -14}, + { 20, -13}, + { 20, -13}, + { 21, -13}, + { 21, -13}, + { 21, -12}, + { 22, -12}, + { 22, -12}, + { 22, -11}, + { 22, -11}, + { 22, -10}, + { 23, -10}, + { 23, -9}, + { 23, -9}, + { 23, -9}, + { 23, -9}, + { 23, -8}, + { 23, -8}, + { 23, -7}, + { 23, -7}, + { 23, -6}, + { 24, -6}, + { 24, -6}, + { 25, -5}, + { 25, -5}, + { 24, -4}, + { 25, -4}, + { 24, -3}, + { 25, -3}, + { 25, -3}, + { 25, -2}, + { 25, -2}, + { 24, -1}, + { 25, -1}, + { 24, 0}, + { 24, 0}, + { 24, 0}, + { 24, 1}, + { 24, 1}, + { 25, 2}, + { 24, 2}, + { 25, 2}, + { 24, 3}, + { 24, 3}, + { 25, 4}, + { 24, 4}, + { 24, 5}, + { 24, 5}, + { 24, 5}, + { 24, 6}, + { 23, 6}, + { 23, 6}, + { 23, 7}, + { 23, 8}, + { 23, 8}, + { 23, 8}, + { 23, 9}, + { 23, 9}, + { 23, 10}, + { 22, 10}, + { 22, 10}, + { 22, 11}, + { 22, 11}, + { 22, 11}, + { 22, 12}, + { 21, 12}, + { 21, 12}, + { 21, 13}, + { 20, 13}, + { 20, 13}, + { 19, 13}, + { 19, 13}, + { 19, 14}, + { 19, 14}, + { 19, 15}, + { 19, 15}, + { 18, 15}, + { 18, 16}, + { 17, 16}, + { 17, 16}, + { 17, 17}, + { 17, 17}, + { 16, 17}, + { 16, 18}, + { 16, 18}, + { 15, 18}, + { 14, 18}, + { 15, 19}, + { 14, 19}, + { 14, 19}, + { 13, 19}, + { 13, 20}, + { 13, 20}, + { 13, 20}, + { 12, 20}, + { 12, 20}, + { 12, 21}, + { 11, 21}, + { 11, 21}, + { 11, 21}, + { 10, 21}, + { 10, 22}, + { 10, 22}, + { 9, 22}, + { 9, 22}, + { 8, 22}, + { 7, 22}, + { 7, 23}, + { 7, 23}, + { 6, 23}, + { 6, 23}, + { 5, 23}, + { 5, 23}, + { 5, 24}, + { 4, 24}, + { 4, 24}, + { 4, 24}, + { 3, 24}, + { 2, 24}, + { 2, 24}, + { 1, 24}, + { 1, 24}, + { 0, 24}, + { 0, 24}, + { -1, 23}, + { 0, 24}, + { 0, 24}, + { -1, 24}, + { -1, 24}, + { -2, 24}, + { -2, 24}, + { -3, 24}, + { -3, 24}, + { -4, 24}, + { -4, 24}, + { -5, 24}, + { -5, 23}, + { -5, 23}, + { -6, 23}, + { -6, 23}, + { -7, 23}, + { -7, 23}, + { -7, 23}, + { -8, 23}, + { -8, 22}, + { -9, 22}, + { -9, 22}, + {-10, 22}, + {-10, 22}, + {-10, 21}, + {-11, 21}, + {-11, 21}, + {-11, 21}, + {-11, 20}, + {-12, 20}, + {-12, 20}, + {-13, 20}, + {-13, 20}, + {-13, 19}, + {-14, 19}, + {-14, 19}, + {-14, 19}, + {-14, 18}, + {-15, 18}, + {-15, 18}, + {-15, 17}, + {-16, 17}, + {-16, 17}, + {-17, 17}, + {-17, 16}, + {-17, 16}, + {-18, 16}, + {-17, 15}, + {-18, 15}, + {-18, 15}, + {-19, 15}, + {-19, 14}, + {-19, 14}, + {-19, 13}, + {-19, 13}, + {-20, 13}, + {-20, 12}, + {-20, 12}, + {-21, 12}, + {-21, 12}, + {-21, 11}, + {-21, 11}, + {-21, 10}, + {-21, 10}, + {-21, 9}, + {-22, 9}, + {-22, 9}, + {-22, 8}, + {-22, 8}, + {-22, 7}, + {-23, 7}, + {-23, 7}, + {-23, 6}, + {-23, 6}, + {-23, 5}, + {-24, 5}, + {-23, 4}, + {-23, 4}, + {-24, 4}, + {-24, 4}, + {-24, 3}, + {-24, 3}, + {-24, 2}, + {-24, 2}, + {-24, 1}, + {-24, 1}, + {-24, 1}, + {-24, 0}, + {-25, 0}, + {-24, -1}, + {-25, -1}, + {-24, -1}, + {-24, -2}, + {-24, -2}, + {-24, -3}, + {-24, -3}, + {-24, -4}, + {-24, -4}, + {-24, -4}, + {-24, -5}, + {-24, -5}, + {-24, -6}, + {-24, -6}, + {-23, -6}, + {-23, -7}, + {-23, -7}, + {-23, -8}, + {-23, -8}, + {-23, -9}, + {-23, -9}, + {-22, -9}, + {-22, -9}, + {-22, -10}, + {-22, -10}, + {-21, -10}, + {-21, -11}, + {-22, -11}, + {-22, -12}, + {-21, -12}, + {-21, -13}, + {-21, -13}, + {-20, -13}, + {-21, -14}, + {-20, -14}, + {-20, -14}, + {-19, -14}, + {-19, -15}, + {-19, -15}, + {-18, -16}, + {-18, -16}, + {-18, -16}, + {-18, -17}, + {-18, -17}, + {-17, -17}, + {-17, -18}, + {-17, -18}, + {-16, -18}, + {-16, -18}, + {-16, -19}, + {-16, -19}, + {-15, -19}, + {-15, -19}, + {-15, -20}, + {-14, -20}, + {-14, -20}, + {-14, -21}, + {-13, -21}, + {-13, -21}, + {-13, -21}, + {-12, -21}, + {-12, -22}, + {-11, -22}, + {-11, -22}, + {-11, -22}, + {-10, -22}, + {-10, -22}, + { -9, -22}, + { -9, -23}, + { -9, -23}, + { -8, -23}, + { -8, -23}, + { -7, -23}, + { -7, -23}, + { -7, -24}, + { -6, -24}, + { -6, -24}, + { -5, -24}, + { -5, -24}, + { -4, -24}, + { -4, -24}, + { -4, -24}, + { -4, -25}, + { -3, -25}, + { -2, -25}, + { -2, -24}, + { -2, -24}, + { -1, -25}, + { -1, -25}, + { 0, -25}, +}; + +static void sub_810B05C(struct Sprite *sprite) +{ + u16 angle; + s16 sin; + s16 cos; + u16 x; + u16 y; + + angle = gTasks[sprite->data[0]].tMinuteHandAngle; + sin = Sin2(angle) / 16; + cos = Cos2(angle) / 16; + SetOamMatrix(0, cos, sin, -sin, cos); + x = gClockHandCoords[angle][0]; + y = gClockHandCoords[angle][1]; + + //Manual sign extension + if (x > 0x80) + x |= 0xFF00; + if (y > 0x80) + y |= 0xFF00; + + sprite->pos2.x = x; + sprite->pos2.y = y; +} + +static void sub_810B0F4(struct Sprite *sprite) +{ + u16 angle; + s16 sin; + s16 cos; + u16 x; + u16 y; + + angle = gTasks[sprite->data[0]].tHourHandAngle; + sin = Sin2(angle) / 16; + cos = Cos2(angle) / 16; + SetOamMatrix(1, cos, sin, -sin, cos); + x = gClockHandCoords[angle][0]; + y = gClockHandCoords[angle][1]; + + //Manual sign extension + if (x > 0x80) + x |= 0xFF00; + if (y > 0x80) + y |= 0xFF00; + + sprite->pos2.x = x; + sprite->pos2.y = y; +} + +static void sub_810B18C(struct Sprite *sprite) +{ + s16 sin; + s16 cos; + + if (gTasks[sprite->data[0]].tPeriod != PERIOD_AM) + { + if (sprite->data[1] >= 60 && sprite->data[1] < 90) + sprite->data[1] += 5; + if (sprite->data[1] < 60) + sprite->data[1]++; + } + else + { + if (sprite->data[1] > 45 && sprite->data[1] <= 75) + sprite->data[1] -= 5; + if (sprite->data[1] > 75) + sprite->data[1]--; + } + cos = Cos2((u16)sprite->data[1]); + sprite->pos2.x = cos * 30 / 4096; + sin = Sin2((u16)sprite->data[1]); + sprite->pos2.y = sin * 30 / 4096; +} + +static void sub_810B230(struct Sprite *sprite) +{ + s16 sin; + s16 cos; + + if (gTasks[sprite->data[0]].tPeriod != PERIOD_AM) + { + if (sprite->data[1] >= 105 && sprite->data[1] < 135) + sprite->data[1] += 5; + if (sprite->data[1] < 105) + sprite->data[1]++; + } + else + { + if (sprite->data[1] > 90 && sprite->data[1] <= 120) + sprite->data[1] -= 5; + if (sprite->data[1] > 120) + sprite->data[1]--; + } + cos = Cos2((u16)sprite->data[1]); + sprite->pos2.x = cos * 30 / 4096; + sin = Sin2((u16)sprite->data[1]); + sprite->pos2.y = sin * 30 / 4096; +} diff --git a/src/wild_encounter.c b/src/wild_encounter.c new file mode 100644 index 000000000..19778e29b --- /dev/null +++ b/src/wild_encounter.c @@ -0,0 +1,4398 @@ +#include "global.h" +#include "wild_encounter.h" +#include "constants/abilities.h" +#include "battle_setup.h" +#include "event_data.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "constants/maps.h" +#include "metatile_behavior.h" +#include "pokeblock.h" +#include "random.h" +#include "roamer.h" +#include "overworld.h" +#include "safari_zone.h" +#include "script.h" +#include "constants/species.h" +#include "tv.h" + +const struct WildPokemon PetalburgCity_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, +}; +const struct WildPokemonInfo PetalburgCity_WaterMonsInfo = {1, PetalburgCity_WaterMons}; + +const struct WildPokemon PetalburgCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_CORPHISH}, + {25, 30, SPECIES_CORPHISH}, + {30, 35, SPECIES_CORPHISH}, + {20, 25, SPECIES_CORPHISH}, + {35, 40, SPECIES_CORPHISH}, + {40, 45, SPECIES_CORPHISH}, +}; +const struct WildPokemonInfo PetalburgCity_FishingMonsInfo = {10, PetalburgCity_FishingMons}; + +const struct WildPokemon SlateportCity_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo SlateportCity_WaterMonsInfo = {4, SlateportCity_WaterMons}; + +const struct WildPokemon SlateportCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo SlateportCity_FishingMonsInfo = {10, SlateportCity_FishingMons}; + +const struct WildPokemon LilycoveCity_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo LilycoveCity_WaterMonsInfo = {4, LilycoveCity_WaterMons}; + +const struct WildPokemon LilycoveCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_STARYU}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo LilycoveCity_FishingMonsInfo = {10, LilycoveCity_FishingMons}; + +const struct WildPokemon MossdeepCity_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo MossdeepCity_WaterMonsInfo = {4, MossdeepCity_WaterMons}; + +const struct WildPokemon MossdeepCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo MossdeepCity_FishingMonsInfo = {10, MossdeepCity_FishingMons}; + +const struct WildPokemon SootopolisCity_WaterMons [] = +{ + {5, 35, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {15, 25, SPECIES_MAGIKARP}, + {25, 30, SPECIES_MAGIKARP}, + {25, 30, SPECIES_MAGIKARP}, +}; +const struct WildPokemonInfo SootopolisCity_WaterMonsInfo = {1, SootopolisCity_WaterMons}; + +const struct WildPokemon SootopolisCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, +#ifdef SAPPHIRE + {5, 10, SPECIES_TENTACOOL}, +#else + {10, 15, SPECIES_MAGIKARP}, +#endif + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {30, 35, SPECIES_MAGIKARP}, + {30, 35, SPECIES_MAGIKARP}, + {35, 40, SPECIES_GYARADOS}, + {35, 45, SPECIES_GYARADOS}, + {5, 45, SPECIES_GYARADOS}, +}; +const struct WildPokemonInfo SootopolisCity_FishingMonsInfo = {10, SootopolisCity_FishingMons}; + +const struct WildPokemon EverGrandeCity_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo EverGrandeCity_WaterMonsInfo = {4, EverGrandeCity_WaterMons}; + +const struct WildPokemon EverGrandeCity_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_LUVDISC}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_LUVDISC}, + {30, 35, SPECIES_WAILMER}, + {30, 35, SPECIES_CORSOLA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo EverGrandeCity_FishingMonsInfo = {10, EverGrandeCity_FishingMons}; + +const struct WildPokemon MeteorFalls_1F_1R_LandMons [] = +{ + {16, 16, SPECIES_ZUBAT}, + {17, 17, SPECIES_ZUBAT}, + {18, 18, SPECIES_ZUBAT}, + {15, 15, SPECIES_ZUBAT}, + {14, 14, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {16, 16, SPECIES_LUNATONE}, + {18, 18, SPECIES_LUNATONE}, + {14, 14, SPECIES_LUNATONE}, +#else + {16, 16, SPECIES_SOLROCK}, + {18, 18, SPECIES_SOLROCK}, + {14, 14, SPECIES_SOLROCK}, +#endif + {19, 19, SPECIES_ZUBAT}, + {20, 20, SPECIES_ZUBAT}, + {19, 19, SPECIES_ZUBAT}, + {20, 20, SPECIES_ZUBAT}, +}; +const struct WildPokemonInfo MeteorFalls_1F_1R_LandMonsInfo = {10, MeteorFalls_1F_1R_LandMons}; + +const struct WildPokemon MeteorFalls_1F_1R_WaterMons [] = +{ + {5, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {25, 35, SPECIES_LUNATONE}, + {15, 25, SPECIES_LUNATONE}, + {5, 15, SPECIES_LUNATONE}, +#else + {25, 35, SPECIES_SOLROCK}, + {15, 25, SPECIES_SOLROCK}, + {5, 15, SPECIES_SOLROCK}, +#endif +}; +const struct WildPokemonInfo MeteorFalls_1F_1R_WaterMonsInfo = {4, MeteorFalls_1F_1R_WaterMons}; + +const struct WildPokemon MeteorFalls_1F_1R_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {20, 25, SPECIES_BARBOACH}, + {35, 40, SPECIES_BARBOACH}, + {40, 45, SPECIES_BARBOACH}, +}; +const struct WildPokemonInfo MeteorFalls_1F_1R_FishingMonsInfo = {30, MeteorFalls_1F_1R_FishingMons}; + +const struct WildPokemon MeteorFalls_1F_2R_LandMons [] = +{ + {33, 33, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {35, 35, SPECIES_LUNATONE}, + {33, 33, SPECIES_LUNATONE}, + {37, 37, SPECIES_LUNATONE}, +#else + {35, 35, SPECIES_SOLROCK}, + {33, 33, SPECIES_SOLROCK}, + {37, 37, SPECIES_SOLROCK}, +#endif + {35, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {39, 39, SPECIES_LUNATONE}, +#else + {39, 39, SPECIES_SOLROCK}, +#endif + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo MeteorFalls_1F_2R_LandMonsInfo = {10, MeteorFalls_1F_2R_LandMons}; + +const struct WildPokemon MeteorFalls_1F_2R_WaterMons [] = +{ + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {25, 35, SPECIES_LUNATONE}, + {15, 25, SPECIES_LUNATONE}, + {5, 15, SPECIES_LUNATONE}, +#else + {25, 35, SPECIES_SOLROCK}, + {15, 25, SPECIES_SOLROCK}, + {5, 15, SPECIES_SOLROCK}, +#endif +}; +const struct WildPokemonInfo MeteorFalls_1F_2R_WaterMonsInfo = {4, MeteorFalls_1F_2R_WaterMons}; + +const struct WildPokemon MeteorFalls_1F_2R_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {30, 35, SPECIES_WHISCASH}, + {35, 40, SPECIES_WHISCASH}, + {40, 45, SPECIES_WHISCASH}, +}; +const struct WildPokemonInfo MeteorFalls_1F_2R_FishingMonsInfo = {30, MeteorFalls_1F_2R_FishingMons}; + +const struct WildPokemon MeteorFalls_B1F_1R_LandMons [] = +{ + {33, 33, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {35, 35, SPECIES_LUNATONE}, + {33, 33, SPECIES_LUNATONE}, + {37, 37, SPECIES_LUNATONE}, +#else + {35, 35, SPECIES_SOLROCK}, + {33, 33, SPECIES_SOLROCK}, + {37, 37, SPECIES_SOLROCK}, +#endif + {35, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {39, 39, SPECIES_LUNATONE}, +#else + {39, 39, SPECIES_SOLROCK}, +#endif + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo MeteorFalls_B1F_1R_LandMonsInfo = {10, MeteorFalls_B1F_1R_LandMons}; + +const struct WildPokemon MeteorFalls_B1F_1R_WaterMons [] = +{ + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {25, 35, SPECIES_LUNATONE}, + {15, 25, SPECIES_LUNATONE}, + {5, 15, SPECIES_LUNATONE}, +#else + {25, 35, SPECIES_SOLROCK}, + {15, 25, SPECIES_SOLROCK}, + {5, 15, SPECIES_SOLROCK}, +#endif +}; +const struct WildPokemonInfo MeteorFalls_B1F_1R_WaterMonsInfo = {4, MeteorFalls_B1F_1R_WaterMons}; + +const struct WildPokemon MeteorFalls_B1F_1R_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {30, 35, SPECIES_WHISCASH}, + {35, 40, SPECIES_WHISCASH}, + {40, 45, SPECIES_WHISCASH}, +}; +const struct WildPokemonInfo MeteorFalls_B1F_1R_FishingMonsInfo = {30, MeteorFalls_B1F_1R_FishingMons}; + +const struct WildPokemon MeteorFalls_B1F_2R_LandMons [] = +{ + {33, 33, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {30, 30, SPECIES_BAGON}, +#ifdef SAPPHIRE + {35, 35, SPECIES_LUNATONE}, +#else + {35, 35, SPECIES_SOLROCK}, +#endif + {35, 35, SPECIES_BAGON}, +#ifdef SAPPHIRE + {37, 37, SPECIES_LUNATONE}, +#else + {37, 37, SPECIES_SOLROCK}, +#endif + {25, 25, SPECIES_BAGON}, +#ifdef SAPPHIRE + {39, 39, SPECIES_LUNATONE}, +#else + {39, 39, SPECIES_SOLROCK}, +#endif + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, + {38, 38, SPECIES_GOLBAT}, + {40, 40, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo MeteorFalls_B1F_2R_LandMonsInfo = {10, MeteorFalls_B1F_2R_LandMons}; + +const struct WildPokemon MeteorFalls_B1F_2R_WaterMons [] = +{ + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {25, 35, SPECIES_LUNATONE}, + {15, 25, SPECIES_LUNATONE}, + {5, 15, SPECIES_LUNATONE}, +#else + {25, 35, SPECIES_SOLROCK}, + {15, 25, SPECIES_SOLROCK}, + {5, 15, SPECIES_SOLROCK}, +#endif +}; +const struct WildPokemonInfo MeteorFalls_B1F_2R_WaterMonsInfo = {4, MeteorFalls_B1F_2R_WaterMons}; + +const struct WildPokemon MeteorFalls_B1F_2R_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {30, 35, SPECIES_WHISCASH}, + {35, 40, SPECIES_WHISCASH}, + {40, 45, SPECIES_WHISCASH}, +}; +const struct WildPokemonInfo MeteorFalls_B1F_2R_FishingMonsInfo = {30, MeteorFalls_B1F_2R_FishingMons}; + +const struct WildPokemon RusturfTunnel_LandMons [] = +{ + {6, 6, SPECIES_WHISMUR}, + {7, 7, SPECIES_WHISMUR}, + {6, 6, SPECIES_WHISMUR}, + {6, 6, SPECIES_WHISMUR}, + {7, 7, SPECIES_WHISMUR}, + {7, 7, SPECIES_WHISMUR}, + {5, 5, SPECIES_WHISMUR}, + {8, 8, SPECIES_WHISMUR}, + {5, 5, SPECIES_WHISMUR}, + {8, 8, SPECIES_WHISMUR}, + {5, 5, SPECIES_WHISMUR}, + {8, 8, SPECIES_WHISMUR}, +}; +const struct WildPokemonInfo RusturfTunnel_LandMonsInfo = {10, RusturfTunnel_LandMons}; + +const struct WildPokemon GraniteCave_1F_LandMons [] = +{ + {7, 7, SPECIES_ZUBAT}, + {8, 8, SPECIES_MAKUHITA}, + {7, 7, SPECIES_MAKUHITA}, + {8, 8, SPECIES_ZUBAT}, + {9, 9, SPECIES_MAKUHITA}, + {8, 8, SPECIES_ABRA}, + {10, 10, SPECIES_MAKUHITA}, + {6, 6, SPECIES_MAKUHITA}, + {7, 7, SPECIES_GEODUDE}, + {8, 8, SPECIES_GEODUDE}, + {6, 6, SPECIES_GEODUDE}, + {9, 9, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo GraniteCave_1F_LandMonsInfo = {10, GraniteCave_1F_LandMons}; + +const struct WildPokemon GraniteCave_B1F_LandMons [] = +{ + {9, 9, SPECIES_ZUBAT}, + {10, 10, SPECIES_ARON}, + {9, 9, SPECIES_ARON}, + {11, 11, SPECIES_ARON}, + {10, 10, SPECIES_ZUBAT}, + {9, 9, SPECIES_ABRA}, + {10, 10, SPECIES_MAKUHITA}, + {11, 11, SPECIES_MAKUHITA}, +#ifdef SAPPHIRE + {10, 10, SPECIES_SABLEYE}, + {10, 10, SPECIES_SABLEYE}, + {9, 9, SPECIES_SABLEYE}, + {11, 11, SPECIES_SABLEYE}, +#else + {10, 10, SPECIES_MAWILE}, + {10, 10, SPECIES_MAWILE}, + {9, 9, SPECIES_MAWILE}, + {11, 11, SPECIES_MAWILE}, +#endif +}; +const struct WildPokemonInfo GraniteCave_B1F_LandMonsInfo = {10, GraniteCave_B1F_LandMons}; + +const struct WildPokemon GraniteCave_B2F_LandMons [] = +{ + {10, 10, SPECIES_ZUBAT}, + {11, 11, SPECIES_ARON}, + {10, 10, SPECIES_ARON}, + {11, 11, SPECIES_ZUBAT}, + {12, 12, SPECIES_ARON}, + {10, 10, SPECIES_ABRA}, +#ifdef SAPPHIRE + {10, 10, SPECIES_SABLEYE}, + {11, 11, SPECIES_SABLEYE}, + {12, 12, SPECIES_SABLEYE}, + {10, 10, SPECIES_SABLEYE}, + {12, 12, SPECIES_SABLEYE}, + {10, 10, SPECIES_SABLEYE}, +#else + {10, 10, SPECIES_MAWILE}, + {11, 11, SPECIES_MAWILE}, + {12, 12, SPECIES_MAWILE}, + {10, 10, SPECIES_MAWILE}, + {12, 12, SPECIES_MAWILE}, + {10, 10, SPECIES_MAWILE}, +#endif +}; +const struct WildPokemonInfo GraniteCave_B2F_LandMonsInfo = {10, GraniteCave_B2F_LandMons}; + +const struct WildPokemon GraniteCave_B2F_RockSmashMons [] = +{ + {10, 15, SPECIES_GEODUDE}, + {10, 20, SPECIES_NOSEPASS}, + {5, 10, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo GraniteCave_B2F_RockSmashMonsInfo = {20, GraniteCave_B2F_RockSmashMons}; + +const struct WildPokemon GraniteCave_StevensRoom_LandMons [] = +{ + {7, 7, SPECIES_ZUBAT}, + {8, 8, SPECIES_MAKUHITA}, + {7, 7, SPECIES_MAKUHITA}, + {8, 8, SPECIES_ZUBAT}, + {9, 9, SPECIES_MAKUHITA}, + {8, 8, SPECIES_ABRA}, + {10, 10, SPECIES_MAKUHITA}, + {6, 6, SPECIES_MAKUHITA}, + {7, 7, SPECIES_ARON}, + {8, 8, SPECIES_ARON}, + {7, 7, SPECIES_ARON}, + {8, 8, SPECIES_ARON}, +}; +const struct WildPokemonInfo GraniteCave_StevensRoom_LandMonsInfo = {10, GraniteCave_StevensRoom_LandMons}; + +const struct WildPokemon PetalburgWoods_LandMons [] = +{ + {5, 5, SPECIES_ZIGZAGOON}, + {5, 5, SPECIES_WURMPLE}, + {5, 5, SPECIES_SHROOMISH}, + {6, 6, SPECIES_ZIGZAGOON}, + {5, 5, SPECIES_SILCOON}, + {5, 5, SPECIES_CASCOON}, + {6, 6, SPECIES_WURMPLE}, + {6, 6, SPECIES_SHROOMISH}, + {5, 5, SPECIES_TAILLOW}, + {5, 5, SPECIES_SLAKOTH}, + {6, 6, SPECIES_TAILLOW}, + {6, 6, SPECIES_SLAKOTH}, +}; +const struct WildPokemonInfo PetalburgWoods_LandMonsInfo = {20, PetalburgWoods_LandMons}; + +//Jagged Pass Pokemon are 2 levels higher on Sapphire +#ifdef SAPPHIRE +#define JAGGED_PASS_LEVEL_DIFF 2 +#else +#define JAGGED_PASS_LEVEL_DIFF 0 +#endif + +const struct WildPokemon JaggedPass_LandMons [] = +{ + {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, + {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, + {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, + {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL}, + {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK}, +}; +const struct WildPokemonInfo JaggedPass_LandMonsInfo = {20, JaggedPass_LandMons}; + +const struct WildPokemon FieryPath_LandMons [] = +{ + {15, 15, SPECIES_NUMEL}, +#ifdef SAPPHIRE + {15, 15, SPECIES_GRIMER}, +#else + {15, 15, SPECIES_KOFFING}, +#endif + {16, 16, SPECIES_NUMEL}, + {15, 15, SPECIES_MACHOP}, + {15, 15, SPECIES_TORKOAL}, + {15, 15, SPECIES_SLUGMA}, +#ifdef SAPPHIRE + {16, 16, SPECIES_GRIMER}, +#else + {16, 16, SPECIES_KOFFING}, +#endif + {16, 16, SPECIES_MACHOP}, + {14, 14, SPECIES_TORKOAL}, + {16, 16, SPECIES_TORKOAL}, +#ifdef SAPPHIRE + {14, 14, SPECIES_KOFFING}, + {14, 14, SPECIES_KOFFING}, +#else + {14, 14, SPECIES_GRIMER}, + {14, 14, SPECIES_GRIMER}, +#endif +}; +const struct WildPokemonInfo FieryPath_LandMonsInfo = {10, FieryPath_LandMons}; + +const struct WildPokemon MtPyre_1F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, +#endif +}; +const struct WildPokemonInfo MtPyre_1F_LandMonsInfo = {10, MtPyre_1F_LandMons}; + +const struct WildPokemon MtPyre_2F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, +#endif +}; +const struct WildPokemonInfo MtPyre_2F_LandMonsInfo = {10, MtPyre_2F_LandMons}; + +const struct WildPokemon MtPyre_3F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, +#endif +}; +const struct WildPokemonInfo MtPyre_3F_LandMonsInfo = {10, MtPyre_3F_LandMons}; + +const struct WildPokemon MtPyre_4F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {27, 27, SPECIES_DUSKULL}, + {27, 27, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {27, 27, SPECIES_SHUPPET}, + {27, 27, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, +#endif +}; +const struct WildPokemonInfo MtPyre_4F_LandMonsInfo = {10, MtPyre_4F_LandMons}; + +const struct WildPokemon MtPyre_5F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {27, 27, SPECIES_DUSKULL}, + {27, 27, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {27, 27, SPECIES_SHUPPET}, + {27, 27, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, +#endif +}; +const struct WildPokemonInfo MtPyre_5F_LandMonsInfo = {10, MtPyre_5F_LandMons}; + +const struct WildPokemon MtPyre_6F_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {23, 23, SPECIES_SHUPPET}, + {22, 22, SPECIES_SHUPPET}, + {27, 27, SPECIES_DUSKULL}, + {27, 27, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, +#else + {27, 27, SPECIES_DUSKULL}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {23, 23, SPECIES_DUSKULL}, + {22, 22, SPECIES_DUSKULL}, + {27, 27, SPECIES_SHUPPET}, + {27, 27, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, +#endif +}; +const struct WildPokemonInfo MtPyre_6F_LandMonsInfo = {10, MtPyre_6F_LandMons}; + +const struct WildPokemon MtPyre_Exterior_LandMons [] = +{ +#ifdef SAPPHIRE + {27, 27, SPECIES_SHUPPET}, +#else + {27, 27, SPECIES_DUSKULL}, +#endif + {27, 27, SPECIES_MEDITITE}, +#ifdef SAPPHIRE + {28, 28, SPECIES_SHUPPET}, +#else + {28, 28, SPECIES_DUSKULL}, +#endif + {29, 29, SPECIES_MEDITITE}, +#ifdef SAPPHIRE + {29, 29, SPECIES_SHUPPET}, +#else + {29, 29, SPECIES_DUSKULL}, +#endif + {27, 27, SPECIES_VULPIX}, + {29, 29, SPECIES_VULPIX}, + {25, 25, SPECIES_VULPIX}, + {27, 27, SPECIES_WINGULL}, + {27, 27, SPECIES_WINGULL}, + {26, 26, SPECIES_WINGULL}, + {28, 28, SPECIES_WINGULL}, +}; +const struct WildPokemonInfo MtPyre_Exterior_LandMonsInfo = {10, MtPyre_Exterior_LandMons}; + +const struct WildPokemon MtPyre_Summit_LandMons [] = +{ +#ifdef SAPPHIRE + {28, 28, SPECIES_SHUPPET}, + {29, 29, SPECIES_SHUPPET}, + {27, 27, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {30, 30, SPECIES_SHUPPET}, + {25, 25, SPECIES_SHUPPET}, + {24, 24, SPECIES_SHUPPET}, + {28, 28, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {30, 30, SPECIES_DUSKULL}, +#else + {28, 28, SPECIES_DUSKULL}, + {29, 29, SPECIES_DUSKULL}, + {27, 27, SPECIES_DUSKULL}, + {26, 26, SPECIES_DUSKULL}, + {30, 30, SPECIES_DUSKULL}, + {25, 25, SPECIES_DUSKULL}, + {24, 24, SPECIES_DUSKULL}, + {28, 28, SPECIES_SHUPPET}, + {26, 26, SPECIES_SHUPPET}, + {30, 30, SPECIES_SHUPPET}, +#endif + {28, 28, SPECIES_CHIMECHO}, + {28, 28, SPECIES_CHIMECHO}, +}; +const struct WildPokemonInfo MtPyre_Summit_LandMonsInfo = {10, MtPyre_Summit_LandMons}; + +const struct WildPokemon SeafloorCavern_Entrance_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Entrance_WaterMonsInfo = {4, SeafloorCavern_Entrance_WaterMons}; + +const struct WildPokemon SeafloorCavern_Entrance_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo SeafloorCavern_Entrance_FishingMonsInfo = {10, SeafloorCavern_Entrance_FishingMons}; + +const struct WildPokemon SeafloorCavern_Room1_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room1_LandMonsInfo = {4, SeafloorCavern_Room1_LandMons}; + +const struct WildPokemon SeafloorCavern_Room2_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room2_LandMonsInfo = {4, SeafloorCavern_Room2_LandMons}; + +const struct WildPokemon SeafloorCavern_Room3_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room3_LandMonsInfo = {4, SeafloorCavern_Room3_LandMons}; + +const struct WildPokemon SeafloorCavern_Room4_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room4_LandMonsInfo = {4, SeafloorCavern_Room4_LandMons}; + +const struct WildPokemon SeafloorCavern_Room5_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room5_LandMonsInfo = {4, SeafloorCavern_Room5_LandMons}; + +const struct WildPokemon SeafloorCavern_Room6_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room6_LandMonsInfo = {4, SeafloorCavern_Room6_LandMons}; + +const struct WildPokemon SeafloorCavern_Room6_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room6_WaterMonsInfo = {4, SeafloorCavern_Room6_WaterMons}; + +const struct WildPokemon SeafloorCavern_Room6_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo SeafloorCavern_Room6_FishingMonsInfo = {10, SeafloorCavern_Room6_FishingMons}; + +const struct WildPokemon SeafloorCavern_Room7_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room7_LandMonsInfo = {4, SeafloorCavern_Room7_LandMons}; + +const struct WildPokemon SeafloorCavern_Room7_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_ZUBAT}, + {30, 35, SPECIES_GOLBAT}, + {30, 35, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room7_WaterMonsInfo = {4, SeafloorCavern_Room7_WaterMons}; + +const struct WildPokemon SeafloorCavern_Room7_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo SeafloorCavern_Room7_FishingMonsInfo = {10, SeafloorCavern_Room7_FishingMons}; + +const struct WildPokemon SeafloorCavern_Room8_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo SeafloorCavern_Room8_LandMonsInfo = {4, SeafloorCavern_Room8_LandMons}; + +const struct WildPokemon CaveOfOrigin_Entrance_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, + {33, 33, SPECIES_ZUBAT}, + {28, 28, SPECIES_ZUBAT}, + {29, 29, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {35, 35, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_Entrance_LandMonsInfo = {4, CaveOfOrigin_Entrance_LandMons}; + +const struct WildPokemon CaveOfOrigin_1F_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {30, 30, SPECIES_SABLEYE}, + {32, 32, SPECIES_SABLEYE}, + {34, 34, SPECIES_SABLEYE}, +#else + {30, 30, SPECIES_MAWILE}, + {32, 32, SPECIES_MAWILE}, + {34, 34, SPECIES_MAWILE}, +#endif + {33, 33, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_1F_LandMonsInfo = {4, CaveOfOrigin_1F_LandMons}; + +const struct WildPokemon CaveOfOrigin_B1F_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {30, 30, SPECIES_SABLEYE}, + {32, 32, SPECIES_SABLEYE}, + {34, 34, SPECIES_SABLEYE}, +#else + {30, 30, SPECIES_MAWILE}, + {32, 32, SPECIES_MAWILE}, + {34, 34, SPECIES_MAWILE}, +#endif + {33, 33, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_B1F_LandMonsInfo = {4, CaveOfOrigin_B1F_LandMons}; + +const struct WildPokemon CaveOfOrigin_B2F_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {30, 30, SPECIES_SABLEYE}, + {32, 32, SPECIES_SABLEYE}, + {34, 34, SPECIES_SABLEYE}, +#else + {30, 30, SPECIES_MAWILE}, + {32, 32, SPECIES_MAWILE}, + {34, 34, SPECIES_MAWILE}, +#endif + {33, 33, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_B2F_LandMonsInfo = {4, CaveOfOrigin_B2F_LandMons}; + +const struct WildPokemon CaveOfOrigin_B3F_LandMons [] = +{ + {30, 30, SPECIES_ZUBAT}, + {31, 31, SPECIES_ZUBAT}, + {32, 32, SPECIES_ZUBAT}, +#ifdef SAPPHIRE + {30, 30, SPECIES_SABLEYE}, + {32, 32, SPECIES_SABLEYE}, + {34, 34, SPECIES_SABLEYE}, +#else + {30, 30, SPECIES_MAWILE}, + {32, 32, SPECIES_MAWILE}, + {34, 34, SPECIES_MAWILE}, +#endif + {33, 33, SPECIES_ZUBAT}, + {34, 34, SPECIES_ZUBAT}, + {34, 34, SPECIES_GOLBAT}, + {35, 35, SPECIES_GOLBAT}, + {33, 33, SPECIES_GOLBAT}, + {36, 36, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo CaveOfOrigin_B3F_LandMonsInfo = {4, CaveOfOrigin_B3F_LandMons}; + +const struct WildPokemon VictoryRoad_1F_LandMons [] = +{ + {40, 40, SPECIES_GOLBAT}, + {40, 40, SPECIES_HARIYAMA}, + {40, 40, SPECIES_LAIRON}, + {40, 40, SPECIES_LOUDRED}, + {36, 36, SPECIES_ZUBAT}, + {36, 36, SPECIES_MAKUHITA}, + {38, 38, SPECIES_GOLBAT}, + {38, 38, SPECIES_HARIYAMA}, + {36, 36, SPECIES_ARON}, + {36, 36, SPECIES_WHISMUR}, + {36, 36, SPECIES_ARON}, + {36, 36, SPECIES_WHISMUR}, +}; +const struct WildPokemonInfo VictoryRoad_1F_LandMonsInfo = {10, VictoryRoad_1F_LandMons}; + +const struct WildPokemon VictoryRoad_B1F_LandMons [] = +{ + {40, 40, SPECIES_GOLBAT}, + {40, 40, SPECIES_HARIYAMA}, + {40, 40, SPECIES_LAIRON}, + {40, 40, SPECIES_MEDICHAM}, + {38, 38, SPECIES_GOLBAT}, + {38, 38, SPECIES_HARIYAMA}, + {42, 42, SPECIES_GOLBAT}, + {42, 42, SPECIES_HARIYAMA}, + {42, 42, SPECIES_LAIRON}, + {38, 38, SPECIES_MEDITITE}, + {42, 42, SPECIES_LAIRON}, + {38, 38, SPECIES_MEDITITE}, +}; +const struct WildPokemonInfo VictoryRoad_B1F_LandMonsInfo = {10, VictoryRoad_B1F_LandMons}; + +const struct WildPokemon VictoryRoad_B1F_RockSmashMons [] = +{ + {30, 40, SPECIES_GRAVELER}, + {30, 40, SPECIES_GEODUDE}, + {35, 40, SPECIES_GRAVELER}, + {35, 40, SPECIES_GRAVELER}, + {35, 40, SPECIES_GRAVELER}, +}; +const struct WildPokemonInfo VictoryRoad_B1F_RockSmashMonsInfo = {20, VictoryRoad_B1F_RockSmashMons}; + +const struct WildPokemon VictoryRoad_B2F_LandMons [] = +{ + {40, 40, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {40, 40, SPECIES_SABLEYE}, +#else + {40, 40, SPECIES_MAWILE}, +#endif + {40, 40, SPECIES_LAIRON}, + {40, 40, SPECIES_MEDICHAM}, + {42, 42, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {42, 42, SPECIES_SABLEYE}, +#else + {42, 42, SPECIES_MAWILE}, +#endif + {44, 44, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {44, 44, SPECIES_SABLEYE}, +#else + {44, 44, SPECIES_MAWILE}, +#endif + {42, 42, SPECIES_LAIRON}, + {42, 42, SPECIES_MEDICHAM}, + {44, 44, SPECIES_LAIRON}, + {44, 44, SPECIES_MEDICHAM}, +}; +const struct WildPokemonInfo VictoryRoad_B2F_LandMonsInfo = {10, VictoryRoad_B2F_LandMons}; + +const struct WildPokemon VictoryRoad_B2F_WaterMons [] = +{ + {30, 35, SPECIES_GOLBAT}, + {25, 30, SPECIES_GOLBAT}, + {35, 40, SPECIES_GOLBAT}, + {35, 40, SPECIES_GOLBAT}, + {35, 40, SPECIES_GOLBAT}, +}; +const struct WildPokemonInfo VictoryRoad_B2F_WaterMonsInfo = {4, VictoryRoad_B2F_WaterMons}; + +const struct WildPokemon VictoryRoad_B2F_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {30, 35, SPECIES_WHISCASH}, + {35, 40, SPECIES_WHISCASH}, + {40, 45, SPECIES_WHISCASH}, +}; +const struct WildPokemonInfo VictoryRoad_B2F_FishingMonsInfo = {30, VictoryRoad_B2F_FishingMons}; + +const struct WildPokemon ShoalCave_LowTideEntranceRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {32, 32, SPECIES_ZUBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_LandMonsInfo = {10, ShoalCave_LowTideEntranceRoom_LandMons}; + +const struct WildPokemon ShoalCave_LowTideEntranceRoom_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {25, 30, SPECIES_SPHEAL}, + {25, 30, SPECIES_SPHEAL}, + {25, 35, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_WaterMonsInfo = {4, ShoalCave_LowTideEntranceRoom_WaterMons}; + +const struct WildPokemon ShoalCave_LowTideEntranceRoom_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_FishingMonsInfo = {10, ShoalCave_LowTideEntranceRoom_FishingMons}; + +const struct WildPokemon ShoalCave_LowTideInnerRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {32, 32, SPECIES_ZUBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_LandMonsInfo = {10, ShoalCave_LowTideInnerRoom_LandMons}; + +const struct WildPokemon ShoalCave_LowTideInnerRoom_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_ZUBAT}, + {25, 30, SPECIES_SPHEAL}, + {25, 30, SPECIES_SPHEAL}, + {25, 35, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_WaterMonsInfo = {4, ShoalCave_LowTideInnerRoom_WaterMons}; + +const struct WildPokemon ShoalCave_LowTideInnerRoom_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_FishingMonsInfo = {10, ShoalCave_LowTideInnerRoom_FishingMons}; + +const struct WildPokemon ShoalCave_LowTideStairsRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {32, 32, SPECIES_ZUBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideStairsRoom_LandMonsInfo = {10, ShoalCave_LowTideStairsRoom_LandMons}; + +const struct WildPokemon ShoalCave_LowTideLowerRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {32, 32, SPECIES_ZUBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, + {32, 32, SPECIES_GOLBAT}, + {32, 32, SPECIES_SPHEAL}, +}; +const struct WildPokemonInfo ShoalCave_LowTideLowerRoom_LandMonsInfo = {10, ShoalCave_LowTideLowerRoom_LandMons}; + +const struct WildPokemon ShoalCave_LowTideIceRoom_LandMons [] = +{ + {26, 26, SPECIES_ZUBAT}, + {26, 26, SPECIES_SPHEAL}, + {28, 28, SPECIES_ZUBAT}, + {28, 28, SPECIES_SPHEAL}, + {30, 30, SPECIES_ZUBAT}, + {30, 30, SPECIES_SPHEAL}, + {26, 26, SPECIES_SNORUNT}, + {32, 32, SPECIES_SPHEAL}, + {30, 30, SPECIES_GOLBAT}, + {28, 28, SPECIES_SNORUNT}, + {32, 32, SPECIES_GOLBAT}, + {30, 30, SPECIES_SNORUNT}, +}; +const struct WildPokemonInfo ShoalCave_LowTideIceRoom_LandMonsInfo = {10, ShoalCave_LowTideIceRoom_LandMons}; + +const struct WildPokemon NewMauville_Entrance_LandMons [] = +{ + {24, 24, SPECIES_VOLTORB}, + {24, 24, SPECIES_MAGNEMITE}, + {25, 25, SPECIES_VOLTORB}, + {25, 25, SPECIES_MAGNEMITE}, + {23, 23, SPECIES_VOLTORB}, + {23, 23, SPECIES_MAGNEMITE}, + {26, 26, SPECIES_VOLTORB}, + {26, 26, SPECIES_MAGNEMITE}, + {22, 22, SPECIES_VOLTORB}, + {22, 22, SPECIES_MAGNEMITE}, + {22, 22, SPECIES_VOLTORB}, + {22, 22, SPECIES_MAGNEMITE}, +}; +const struct WildPokemonInfo NewMauville_Entrance_LandMonsInfo = {10, NewMauville_Entrance_LandMons}; + +const struct WildPokemon NewMauville_Inside_LandMons [] = +{ + {24, 24, SPECIES_VOLTORB}, + {24, 24, SPECIES_MAGNEMITE}, + {25, 25, SPECIES_VOLTORB}, + {25, 25, SPECIES_MAGNEMITE}, + {23, 23, SPECIES_VOLTORB}, + {23, 23, SPECIES_MAGNEMITE}, + {26, 26, SPECIES_VOLTORB}, + {26, 26, SPECIES_MAGNEMITE}, + {22, 22, SPECIES_VOLTORB}, + {22, 22, SPECIES_MAGNEMITE}, + {26, 26, SPECIES_ELECTRODE}, + {26, 26, SPECIES_MAGNETON}, +}; +const struct WildPokemonInfo NewMauville_Inside_LandMonsInfo = {10, NewMauville_Inside_LandMons}; + +const struct WildPokemon AbandonedShip_Rooms_B1F_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACRUEL}, +}; +const struct WildPokemonInfo AbandonedShip_Rooms_B1F_WaterMonsInfo = {4, AbandonedShip_Rooms_B1F_WaterMons}; + +const struct WildPokemon AbandonedShip_Rooms_B1F_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_TENTACOOL}, + {25, 30, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACRUEL}, + {25, 30, SPECIES_TENTACRUEL}, + {20, 25, SPECIES_TENTACRUEL}, +}; +const struct WildPokemonInfo AbandonedShip_Rooms_B1F_FishingMonsInfo = {20, AbandonedShip_Rooms_B1F_FishingMons}; + +const struct WildPokemon AbandonedShip_HiddenFloorCorridors_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {5, 35, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACRUEL}, +}; +const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_WaterMonsInfo = {4, AbandonedShip_HiddenFloorCorridors_WaterMons}; + +const struct WildPokemon AbandonedShip_HiddenFloorCorridors_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_TENTACOOL}, + {25, 30, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACOOL}, + {30, 35, SPECIES_TENTACRUEL}, + {25, 30, SPECIES_TENTACRUEL}, + {20, 25, SPECIES_TENTACRUEL}, +}; +const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_FishingMonsInfo = {20, AbandonedShip_HiddenFloorCorridors_FishingMons}; + +const struct WildPokemon SkyPillar_1F_LandMons [] = +{ +#ifdef SAPPHIRE + {48, 48, SPECIES_SABLEYE}, +#else + {48, 48, SPECIES_MAWILE}, +#endif + {48, 48, SPECIES_GOLBAT}, + {50, 50, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {50, 50, SPECIES_SABLEYE}, +#else + {50, 50, SPECIES_MAWILE}, +#endif + {48, 48, SPECIES_CLAYDOL}, +#ifdef SAPPHIRE + {48, 48, SPECIES_BANETTE}, + {50, 50, SPECIES_BANETTE}, +#else + {48, 48, SPECIES_DUSCLOPS}, + {50, 50, SPECIES_DUSCLOPS}, +#endif + {49, 49, SPECIES_CLAYDOL}, + {47, 47, SPECIES_CLAYDOL}, + {50, 50, SPECIES_CLAYDOL}, + {47, 47, SPECIES_CLAYDOL}, + {50, 50, SPECIES_CLAYDOL}, +}; +const struct WildPokemonInfo SkyPillar_1F_LandMonsInfo = {10, SkyPillar_1F_LandMons}; + +const struct WildPokemon SkyPillar_3F_LandMons [] = +{ +#ifdef SAPPHIRE + {51, 51, SPECIES_SABLEYE}, +#else + {51, 51, SPECIES_MAWILE}, +#endif + {51, 51, SPECIES_GOLBAT}, + {53, 53, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {53, 53, SPECIES_SABLEYE}, +#else + {53, 53, SPECIES_MAWILE}, +#endif + {51, 51, SPECIES_CLAYDOL}, +#ifdef SAPPHIRE + {51, 51, SPECIES_BANETTE}, + {53, 53, SPECIES_BANETTE}, +#else + {51, 51, SPECIES_DUSCLOPS}, + {53, 53, SPECIES_DUSCLOPS}, +#endif + {52, 52, SPECIES_CLAYDOL}, + {50, 50, SPECIES_CLAYDOL}, + {53, 53, SPECIES_CLAYDOL}, + {50, 50, SPECIES_CLAYDOL}, + {53, 53, SPECIES_CLAYDOL}, +}; +const struct WildPokemonInfo SkyPillar_3F_LandMonsInfo = {10, SkyPillar_3F_LandMons}; + +const struct WildPokemon SkyPillar_5F_LandMons [] = +{ +#ifdef SAPPHIRE + {54, 54, SPECIES_SABLEYE}, +#else + {54, 54, SPECIES_MAWILE}, +#endif + {54, 54, SPECIES_GOLBAT}, + {56, 56, SPECIES_GOLBAT}, +#ifdef SAPPHIRE + {56, 56, SPECIES_SABLEYE}, +#else + {56, 56, SPECIES_MAWILE}, +#endif + {54, 54, SPECIES_CLAYDOL}, +#ifdef SAPPHIRE + {54, 54, SPECIES_BANETTE}, + {56, 56, SPECIES_BANETTE}, +#else + {54, 54, SPECIES_DUSCLOPS}, + {56, 56, SPECIES_DUSCLOPS}, +#endif + {55, 55, SPECIES_CLAYDOL}, + {56, 56, SPECIES_CLAYDOL}, + {57, 57, SPECIES_ALTARIA}, + {54, 54, SPECIES_ALTARIA}, + {60, 60, SPECIES_ALTARIA}, +}; +const struct WildPokemonInfo SkyPillar_5F_LandMonsInfo = {10, SkyPillar_5F_LandMons}; + +const struct WildPokemon Route101_LandMons [] = +{ + {2, 2, SPECIES_WURMPLE}, + {2, 2, SPECIES_ZIGZAGOON}, + {2, 2, SPECIES_WURMPLE}, + {3, 3, SPECIES_WURMPLE}, + {3, 3, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_WURMPLE}, + {3, 3, SPECIES_ZIGZAGOON}, + {2, 2, SPECIES_POOCHYENA}, + {2, 2, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, +}; +const struct WildPokemonInfo Route101_LandMonsInfo = {20, Route101_LandMons}; + +const struct WildPokemon Route102_LandMons [] = +{ + {3, 3, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_WURMPLE}, + {4, 4, SPECIES_ZIGZAGOON}, + {4, 4, SPECIES_WURMPLE}, +#ifdef SAPPHIRE + {3, 3, SPECIES_LOTAD}, + {4, 4, SPECIES_LOTAD}, +#else + {3, 3, SPECIES_SEEDOT}, + {4, 4, SPECIES_SEEDOT}, +#endif + {3, 3, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, + {4, 4, SPECIES_POOCHYENA}, + {4, 4, SPECIES_RALTS}, + {4, 4, SPECIES_POOCHYENA}, + {3, 3, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route102_LandMonsInfo = {20, Route102_LandMons}; + +const struct WildPokemon Route102_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route102_WaterMonsInfo = {4, Route102_WaterMons}; + +const struct WildPokemon Route102_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_CORPHISH}, + {25, 30, SPECIES_CORPHISH}, + {30, 35, SPECIES_CORPHISH}, + {20, 25, SPECIES_CORPHISH}, + {35, 40, SPECIES_CORPHISH}, + {40, 45, SPECIES_CORPHISH}, +}; +const struct WildPokemonInfo Route102_FishingMonsInfo = {30, Route102_FishingMons}; + +const struct WildPokemon Route103_LandMons [] = +{ + {2, 2, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_ZIGZAGOON}, + {3, 3, SPECIES_ZIGZAGOON}, + {4, 4, SPECIES_ZIGZAGOON}, + {2, 2, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, + {3, 3, SPECIES_POOCHYENA}, + {4, 4, SPECIES_POOCHYENA}, + {3, 3, SPECIES_WINGULL}, + {3, 3, SPECIES_WINGULL}, + {2, 2, SPECIES_WINGULL}, + {4, 4, SPECIES_WINGULL}, +}; +const struct WildPokemonInfo Route103_LandMonsInfo = {20, Route103_LandMons}; + +const struct WildPokemon Route103_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route103_WaterMonsInfo = {4, Route103_WaterMons}; + +const struct WildPokemon Route103_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route103_FishingMonsInfo = {30, Route103_FishingMons}; + +const struct WildPokemon Route104_LandMons [] = +{ + {4, 4, SPECIES_ZIGZAGOON}, + {4, 4, SPECIES_WURMPLE}, + {5, 5, SPECIES_ZIGZAGOON}, + {5, 5, SPECIES_WURMPLE}, + {4, 4, SPECIES_ZIGZAGOON}, + {5, 5, SPECIES_ZIGZAGOON}, + {4, 4, SPECIES_TAILLOW}, + {5, 5, SPECIES_TAILLOW}, + {4, 4, SPECIES_WINGULL}, + {4, 4, SPECIES_WINGULL}, + {3, 3, SPECIES_WINGULL}, + {5, 5, SPECIES_WINGULL}, +}; +const struct WildPokemonInfo Route104_LandMonsInfo = {20, Route104_LandMons}; + +const struct WildPokemon Route104_WaterMons [] = +{ + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route104_WaterMonsInfo = {4, Route104_WaterMons}; + +const struct WildPokemon Route104_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_MAGIKARP}, + {25, 30, SPECIES_MAGIKARP}, + {30, 35, SPECIES_MAGIKARP}, + {20, 25, SPECIES_MAGIKARP}, + {35, 40, SPECIES_MAGIKARP}, + {40, 45, SPECIES_MAGIKARP}, +}; +const struct WildPokemonInfo Route104_FishingMonsInfo = {30, Route104_FishingMons}; + +const struct WildPokemon Route105_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route105_WaterMonsInfo = {4, Route105_WaterMons}; + +const struct WildPokemon Route105_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route105_FishingMonsInfo = {30, Route105_FishingMons}; + +const struct WildPokemon Route106_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route106_WaterMonsInfo = {4, Route106_WaterMons}; + +const struct WildPokemon Route106_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route106_FishingMonsInfo = {30, Route106_FishingMons}; + +const struct WildPokemon Route107_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route107_WaterMonsInfo = {4, Route107_WaterMons}; + +const struct WildPokemon Route107_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route107_FishingMonsInfo = {30, Route107_FishingMons}; + +const struct WildPokemon Route108_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route108_WaterMonsInfo = {4, Route108_WaterMons}; + +const struct WildPokemon Route108_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route108_FishingMonsInfo = {30, Route108_FishingMons}; + +const struct WildPokemon Route109_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route109_WaterMonsInfo = {4, Route109_WaterMons}; + +const struct WildPokemon Route109_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route109_FishingMonsInfo = {30, Route109_FishingMons}; + +const struct WildPokemon Route110_LandMons [] = +{ + {12, 12, SPECIES_ZIGZAGOON}, + {12, 12, SPECIES_ELECTRIKE}, + {12, 12, SPECIES_GULPIN}, + {13, 13, SPECIES_ELECTRIKE}, +#ifdef SAPPHIRE + {13, 13, SPECIES_PLUSLE}, +#else + {13, 13, SPECIES_MINUN}, +#endif + {13, 13, SPECIES_ODDISH}, +#ifdef SAPPHIRE + {13, 13, SPECIES_PLUSLE}, +#else + {13, 13, SPECIES_MINUN}, +#endif + {13, 13, SPECIES_GULPIN}, + {12, 12, SPECIES_WINGULL}, + {12, 12, SPECIES_WINGULL}, +#ifdef SAPPHIRE + {12, 12, SPECIES_MINUN}, + {13, 13, SPECIES_MINUN}, +#else + {12, 12, SPECIES_PLUSLE}, + {13, 13, SPECIES_PLUSLE}, +#endif +}; +const struct WildPokemonInfo Route110_LandMonsInfo = {20, Route110_LandMons}; + +const struct WildPokemon Route110_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route110_WaterMonsInfo = {4, Route110_WaterMons}; + +const struct WildPokemon Route110_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route110_FishingMonsInfo = {30, Route110_FishingMons}; + +const struct WildPokemon Route111_LandMons [] = +{ + {20, 20, SPECIES_SANDSHREW}, + {20, 20, SPECIES_TRAPINCH}, + {21, 21, SPECIES_SANDSHREW}, + {21, 21, SPECIES_TRAPINCH}, + {19, 19, SPECIES_CACNEA}, + {21, 21, SPECIES_CACNEA}, + {19, 19, SPECIES_SANDSHREW}, + {19, 19, SPECIES_TRAPINCH}, + {20, 20, SPECIES_BALTOY}, + {20, 20, SPECIES_BALTOY}, + {22, 22, SPECIES_BALTOY}, + {22, 22, SPECIES_BALTOY}, +}; +const struct WildPokemonInfo Route111_LandMonsInfo = {10, Route111_LandMons}; + +const struct WildPokemon Route111_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route111_WaterMonsInfo = {4, Route111_WaterMons}; + +const struct WildPokemon Route111_RockSmashMons [] = +{ + {10, 15, SPECIES_GEODUDE}, + {5, 10, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo Route111_RockSmashMonsInfo = {20, Route111_RockSmashMons}; + +const struct WildPokemon Route111_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {20, 25, SPECIES_BARBOACH}, + {35, 40, SPECIES_BARBOACH}, + {40, 45, SPECIES_BARBOACH}, +}; +const struct WildPokemonInfo Route111_FishingMonsInfo = {30, Route111_FishingMons}; + +const struct WildPokemon Route112_LandMons [] = +{ + {15, 15, SPECIES_NUMEL}, + {15, 15, SPECIES_NUMEL}, + {15, 15, SPECIES_MACHOP}, + {14, 14, SPECIES_NUMEL}, + {14, 14, SPECIES_NUMEL}, + {14, 14, SPECIES_MACHOP}, + {16, 16, SPECIES_NUMEL}, + {16, 16, SPECIES_MACHOP}, + {16, 16, SPECIES_NUMEL}, + {16, 16, SPECIES_NUMEL}, + {16, 16, SPECIES_NUMEL}, + {16, 16, SPECIES_NUMEL}, +}; +const struct WildPokemonInfo Route112_LandMonsInfo = {20, Route112_LandMons}; + +const struct WildPokemon Route113_LandMons [] = +{ + {15, 15, SPECIES_SPINDA}, + {15, 15, SPECIES_SPINDA}, + {15, 15, SPECIES_SANDSHREW}, + {14, 14, SPECIES_SPINDA}, + {14, 14, SPECIES_SPINDA}, + {14, 14, SPECIES_SANDSHREW}, + {16, 16, SPECIES_SPINDA}, + {16, 16, SPECIES_SANDSHREW}, + {16, 16, SPECIES_SPINDA}, + {16, 16, SPECIES_SKARMORY}, + {16, 16, SPECIES_SPINDA}, + {16, 16, SPECIES_SKARMORY}, +}; +const struct WildPokemonInfo Route113_LandMonsInfo = {20, Route113_LandMons}; + +const struct WildPokemon Route114_LandMons [] = +{ + {16, 16, SPECIES_SWABLU}, +#ifdef SAPPHIRE + {16, 16, SPECIES_LOTAD}, +#else + {16, 16, SPECIES_SEEDOT}, +#endif + {17, 17, SPECIES_SWABLU}, + {15, 15, SPECIES_SWABLU}, +#ifdef SAPPHIRE + {15, 15, SPECIES_LOTAD}, + {16, 16, SPECIES_SEVIPER}, + {16, 16, SPECIES_LOMBRE}, + {18, 18, SPECIES_LOMBRE}, + {17, 17, SPECIES_SEVIPER}, + {15, 15, SPECIES_SEVIPER}, + {17, 17, SPECIES_SEVIPER}, +#else + {15, 15, SPECIES_SEEDOT}, + {16, 16, SPECIES_ZANGOOSE}, + {16, 16, SPECIES_NUZLEAF}, + {18, 18, SPECIES_NUZLEAF}, + {17, 17, SPECIES_ZANGOOSE}, + {15, 15, SPECIES_ZANGOOSE}, + {17, 17, SPECIES_ZANGOOSE}, +#endif + {15, 15, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route114_LandMonsInfo = {20, Route114_LandMons}; + +const struct WildPokemon Route114_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route114_WaterMonsInfo = {4, Route114_WaterMons}; + +const struct WildPokemon Route114_RockSmashMons [] = +{ + {10, 15, SPECIES_GEODUDE}, + {5, 10, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo Route114_RockSmashMonsInfo = {20, Route114_RockSmashMons}; + +const struct WildPokemon Route114_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {20, 25, SPECIES_BARBOACH}, + {35, 40, SPECIES_BARBOACH}, + {40, 45, SPECIES_BARBOACH}, +}; +const struct WildPokemonInfo Route114_FishingMonsInfo = {30, Route114_FishingMons}; + +const struct WildPokemon Route115_LandMons [] = +{ + {23, 23, SPECIES_SWABLU}, + {23, 23, SPECIES_TAILLOW}, + {25, 25, SPECIES_SWABLU}, + {24, 24, SPECIES_TAILLOW}, + {25, 25, SPECIES_TAILLOW}, + {25, 25, SPECIES_SWELLOW}, + {24, 24, SPECIES_JIGGLYPUFF}, + {25, 25, SPECIES_JIGGLYPUFF}, + {24, 24, SPECIES_WINGULL}, + {24, 24, SPECIES_WINGULL}, + {26, 26, SPECIES_WINGULL}, + {25, 25, SPECIES_WINGULL}, +}; +const struct WildPokemonInfo Route115_LandMonsInfo = {20, Route115_LandMons}; + +const struct WildPokemon Route115_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route115_WaterMonsInfo = {4, Route115_WaterMons}; + +const struct WildPokemon Route115_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route115_FishingMonsInfo = {30, Route115_FishingMons}; + +const struct WildPokemon Route116_LandMons [] = +{ + {6, 6, SPECIES_ZIGZAGOON}, + {6, 6, SPECIES_WHISMUR}, + {6, 6, SPECIES_NINCADA}, + {7, 7, SPECIES_WHISMUR}, + {7, 7, SPECIES_NINCADA}, + {6, 6, SPECIES_TAILLOW}, + {7, 7, SPECIES_TAILLOW}, + {8, 8, SPECIES_TAILLOW}, + {7, 7, SPECIES_ZIGZAGOON}, + {8, 8, SPECIES_ZIGZAGOON}, + {7, 7, SPECIES_SKITTY}, + {8, 8, SPECIES_SKITTY}, +}; +const struct WildPokemonInfo Route116_LandMonsInfo = {20, Route116_LandMons}; + +const struct WildPokemon Route117_LandMons [] = +{ + {13, 13, SPECIES_ZIGZAGOON}, + {13, 13, SPECIES_ROSELIA}, + {14, 14, SPECIES_ZIGZAGOON}, + {14, 14, SPECIES_ROSELIA}, + {13, 13, SPECIES_MARILL}, + {13, 13, SPECIES_ODDISH}, +#ifdef SAPPHIRE + {13, 13, SPECIES_VOLBEAT}, + {13, 13, SPECIES_VOLBEAT}, + {14, 14, SPECIES_VOLBEAT}, + {14, 14, SPECIES_VOLBEAT}, + {13, 13, SPECIES_ILLUMISE}, +#else + {13, 13, SPECIES_ILLUMISE}, + {13, 13, SPECIES_ILLUMISE}, + {14, 14, SPECIES_ILLUMISE}, + {14, 14, SPECIES_ILLUMISE}, + {13, 13, SPECIES_VOLBEAT}, +#endif + {13, 13, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route117_LandMonsInfo = {20, Route117_LandMons}; + +const struct WildPokemon Route117_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route117_WaterMonsInfo = {4, Route117_WaterMons}; + +const struct WildPokemon Route117_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_CORPHISH}, + {25, 30, SPECIES_CORPHISH}, + {30, 35, SPECIES_CORPHISH}, + {20, 25, SPECIES_CORPHISH}, + {35, 40, SPECIES_CORPHISH}, + {40, 45, SPECIES_CORPHISH}, +}; +const struct WildPokemonInfo Route117_FishingMonsInfo = {30, Route117_FishingMons}; + +const struct WildPokemon Route118_LandMons [] = +{ + {24, 24, SPECIES_ZIGZAGOON}, + {24, 24, SPECIES_ELECTRIKE}, + {26, 26, SPECIES_ZIGZAGOON}, + {26, 26, SPECIES_ELECTRIKE}, + {26, 26, SPECIES_LINOONE}, + {26, 26, SPECIES_MANECTRIC}, + {25, 25, SPECIES_WINGULL}, + {25, 25, SPECIES_WINGULL}, + {26, 26, SPECIES_WINGULL}, + {26, 26, SPECIES_WINGULL}, + {27, 27, SPECIES_WINGULL}, + {25, 25, SPECIES_KECLEON}, +}; +const struct WildPokemonInfo Route118_LandMonsInfo = {20, Route118_LandMons}; + +const struct WildPokemon Route118_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route118_WaterMonsInfo = {4, Route118_WaterMons}; + +const struct WildPokemon Route118_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_CARVANHA}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_CARVANHA}, + {20, 25, SPECIES_CARVANHA}, + {35, 40, SPECIES_CARVANHA}, + {40, 45, SPECIES_CARVANHA}, +}; +const struct WildPokemonInfo Route118_FishingMonsInfo = {30, Route118_FishingMons}; + +const struct WildPokemon Route119_LandMons [] = +{ + {25, 25, SPECIES_ZIGZAGOON}, + {25, 25, SPECIES_LINOONE}, + {27, 27, SPECIES_ZIGZAGOON}, + {25, 25, SPECIES_ODDISH}, + {27, 27, SPECIES_LINOONE}, + {26, 26, SPECIES_ODDISH}, + {27, 27, SPECIES_ODDISH}, + {24, 24, SPECIES_ODDISH}, + {25, 25, SPECIES_TROPIUS}, + {26, 26, SPECIES_TROPIUS}, + {27, 27, SPECIES_TROPIUS}, + {25, 25, SPECIES_KECLEON}, +}; +const struct WildPokemonInfo Route119_LandMonsInfo = {15, Route119_LandMons}; + +const struct WildPokemon Route119_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route119_WaterMonsInfo = {4, Route119_WaterMons}; + +const struct WildPokemon Route119_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_CARVANHA}, + {25, 30, SPECIES_CARVANHA}, + {30, 35, SPECIES_CARVANHA}, + {20, 25, SPECIES_CARVANHA}, + {35, 40, SPECIES_CARVANHA}, + {40, 45, SPECIES_CARVANHA}, +}; +const struct WildPokemonInfo Route119_FishingMonsInfo = {30, Route119_FishingMons}; + +const struct WildPokemon Route120_LandMons [] = +{ + {25, 25, SPECIES_ZIGZAGOON}, + {25, 25, SPECIES_LINOONE}, + {27, 27, SPECIES_LINOONE}, + {25, 25, SPECIES_ODDISH}, + {25, 25, SPECIES_MARILL}, + {26, 26, SPECIES_ODDISH}, + {27, 27, SPECIES_ODDISH}, + {27, 27, SPECIES_MARILL}, + {25, 25, SPECIES_ABSOL}, + {27, 27, SPECIES_ABSOL}, + {25, 25, SPECIES_KECLEON}, + {25, 25, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route120_LandMonsInfo = {20, Route120_LandMons}; + +const struct WildPokemon Route120_WaterMons [] = +{ + {20, 30, SPECIES_MARILL}, + {10, 20, SPECIES_MARILL}, + {30, 35, SPECIES_MARILL}, + {5, 10, SPECIES_MARILL}, + {20, 30, SPECIES_SURSKIT}, +}; +const struct WildPokemonInfo Route120_WaterMonsInfo = {4, Route120_WaterMons}; + +const struct WildPokemon Route120_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_GOLDEEN}, + {10, 30, SPECIES_BARBOACH}, + {25, 30, SPECIES_BARBOACH}, + {30, 35, SPECIES_BARBOACH}, + {20, 25, SPECIES_BARBOACH}, + {35, 40, SPECIES_BARBOACH}, + {40, 45, SPECIES_BARBOACH}, +}; +const struct WildPokemonInfo Route120_FishingMonsInfo = {30, Route120_FishingMons}; + +const struct WildPokemon Route121_LandMons [] = +{ + {26, 26, SPECIES_ZIGZAGOON}, +#ifdef SAPPHIRE + {26, 26, SPECIES_SHUPPET}, +#else + {26, 26, SPECIES_DUSKULL}, +#endif + {26, 26, SPECIES_LINOONE}, +#ifdef SAPPHIRE + {28, 28, SPECIES_SHUPPET}, +#else + {28, 28, SPECIES_DUSKULL}, +#endif + {28, 28, SPECIES_LINOONE}, + {26, 26, SPECIES_ODDISH}, + {28, 28, SPECIES_ODDISH}, + {28, 28, SPECIES_GLOOM}, + {26, 26, SPECIES_WINGULL}, + {27, 27, SPECIES_WINGULL}, + {28, 28, SPECIES_WINGULL}, + {25, 25, SPECIES_KECLEON}, +}; +const struct WildPokemonInfo Route121_LandMonsInfo = {20, Route121_LandMons}; + +const struct WildPokemon Route121_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route121_WaterMonsInfo = {4, Route121_WaterMons}; + +const struct WildPokemon Route121_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route121_FishingMonsInfo = {30, Route121_FishingMons}; + +const struct WildPokemon Route122_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route122_WaterMonsInfo = {4, Route122_WaterMons}; + +const struct WildPokemon Route122_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route122_FishingMonsInfo = {30, Route122_FishingMons}; + +const struct WildPokemon Route123_LandMons [] = +{ + {26, 26, SPECIES_ZIGZAGOON}, +#ifdef SAPPHIRE + {26, 26, SPECIES_SHUPPET}, +#else + {26, 26, SPECIES_DUSKULL}, +#endif + {26, 26, SPECIES_LINOONE}, +#ifdef SAPPHIRE + {28, 28, SPECIES_SHUPPET}, +#else + {28, 28, SPECIES_DUSKULL}, +#endif + {28, 28, SPECIES_LINOONE}, + {26, 26, SPECIES_ODDISH}, + {28, 28, SPECIES_ODDISH}, + {28, 28, SPECIES_GLOOM}, + {26, 26, SPECIES_WINGULL}, + {27, 27, SPECIES_WINGULL}, + {28, 28, SPECIES_WINGULL}, + {25, 25, SPECIES_KECLEON}, +}; +const struct WildPokemonInfo Route123_LandMonsInfo = {20, Route123_LandMons}; + +const struct WildPokemon Route123_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route123_WaterMonsInfo = {4, Route123_WaterMons}; + +const struct WildPokemon Route123_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route123_FishingMonsInfo = {30, Route123_FishingMons}; + +const struct WildPokemon Route124_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route124_WaterMonsInfo = {4, Route124_WaterMons}; + +const struct WildPokemon Route124_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route124_FishingMonsInfo = {30, Route124_FishingMons}; + +const struct WildPokemon Route125_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route125_WaterMonsInfo = {4, Route125_WaterMons}; + +const struct WildPokemon Route125_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route125_FishingMonsInfo = {30, Route125_FishingMons}; + +const struct WildPokemon Route126_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route126_WaterMonsInfo = {4, Route126_WaterMons}; + +const struct WildPokemon Route126_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route126_FishingMonsInfo = {30, Route126_FishingMons}; + +const struct WildPokemon Route127_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route127_WaterMonsInfo = {4, Route127_WaterMons}; + +const struct WildPokemon Route127_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route127_FishingMonsInfo = {30, Route127_FishingMons}; + +const struct WildPokemon Route128_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route128_WaterMonsInfo = {4, Route128_WaterMons}; + +const struct WildPokemon Route128_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_LUVDISC}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_LUVDISC}, + {30, 35, SPECIES_WAILMER}, + {30, 35, SPECIES_CORSOLA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route128_FishingMonsInfo = {30, Route128_FishingMons}; + +const struct WildPokemon Route129_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, +#ifdef SAPPHIRE + {25, 30, SPECIES_WAILORD}, +#else + {35, 40, SPECIES_WAILORD}, +#endif +}; +const struct WildPokemonInfo Route129_WaterMonsInfo = {4, Route129_WaterMons}; + +const struct WildPokemon Route129_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route129_FishingMonsInfo = {30, Route129_FishingMons}; + +const struct WildPokemon Route130_LandMons [] = +{ + {30, 30, SPECIES_WYNAUT}, + {35, 35, SPECIES_WYNAUT}, + {25, 25, SPECIES_WYNAUT}, + {40, 40, SPECIES_WYNAUT}, + {20, 20, SPECIES_WYNAUT}, + {45, 45, SPECIES_WYNAUT}, + {15, 15, SPECIES_WYNAUT}, + {50, 50, SPECIES_WYNAUT}, + {10, 10, SPECIES_WYNAUT}, + {5, 5, SPECIES_WYNAUT}, + {10, 10, SPECIES_WYNAUT}, + {5, 5, SPECIES_WYNAUT}, +}; +const struct WildPokemonInfo Route130_LandMonsInfo = {20, Route130_LandMons}; + +const struct WildPokemon Route130_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route130_WaterMonsInfo = {4, Route130_WaterMons}; + +const struct WildPokemon Route130_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route130_FishingMonsInfo = {30, Route130_FishingMons}; + +const struct WildPokemon Route131_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route131_WaterMonsInfo = {4, Route131_WaterMons}; + +const struct WildPokemon Route131_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route131_FishingMonsInfo = {30, Route131_FishingMons}; + +const struct WildPokemon Route132_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route132_WaterMonsInfo = {4, Route132_WaterMons}; + +const struct WildPokemon Route132_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_HORSEA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route132_FishingMonsInfo = {30, Route132_FishingMons}; + +const struct WildPokemon Route133_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route133_WaterMonsInfo = {4, Route133_WaterMons}; + +const struct WildPokemon Route133_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_HORSEA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route133_FishingMonsInfo = {30, Route133_FishingMons}; + +const struct WildPokemon Route134_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo Route134_WaterMonsInfo = {4, Route134_WaterMons}; + +const struct WildPokemon Route134_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_HORSEA}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo Route134_FishingMonsInfo = {30, Route134_FishingMons}; + +const struct WildPokemon SafariZone_Northwest_LandMons [] = +{ + {27, 27, SPECIES_RHYHORN}, + {27, 27, SPECIES_ODDISH}, + {29, 29, SPECIES_RHYHORN}, + {29, 29, SPECIES_ODDISH}, + {27, 27, SPECIES_DODUO}, + {29, 29, SPECIES_GLOOM}, + {31, 31, SPECIES_GLOOM}, + {29, 29, SPECIES_DODUO}, + {29, 29, SPECIES_DODRIO}, + {27, 27, SPECIES_PINSIR}, + {31, 31, SPECIES_DODRIO}, + {29, 29, SPECIES_PINSIR}, +}; +const struct WildPokemonInfo SafariZone_Northwest_LandMonsInfo = {25, SafariZone_Northwest_LandMons}; + +const struct WildPokemon SafariZone_Northwest_WaterMons [] = +{ + {20, 30, SPECIES_PSYDUCK}, + {20, 30, SPECIES_PSYDUCK}, + {30, 35, SPECIES_PSYDUCK}, + {30, 35, SPECIES_GOLDUCK}, + {25, 40, SPECIES_GOLDUCK}, +}; +const struct WildPokemonInfo SafariZone_Northwest_WaterMonsInfo = {9, SafariZone_Northwest_WaterMons}; + +const struct WildPokemon SafariZone_Northwest_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 25, SPECIES_GOLDEEN}, + {10, 30, SPECIES_GOLDEEN}, + {25, 30, SPECIES_GOLDEEN}, + {30, 35, SPECIES_GOLDEEN}, + {30, 35, SPECIES_SEAKING}, + {35, 40, SPECIES_SEAKING}, + {25, 30, SPECIES_SEAKING}, +}; +const struct WildPokemonInfo SafariZone_Northwest_FishingMonsInfo = {35, SafariZone_Northwest_FishingMons}; + +const struct WildPokemon SafariZone_Northeast_LandMons [] = +{ + {27, 27, SPECIES_PHANPY}, + {27, 27, SPECIES_ODDISH}, + {29, 29, SPECIES_PHANPY}, + {29, 29, SPECIES_ODDISH}, + {27, 27, SPECIES_NATU}, + {29, 29, SPECIES_GLOOM}, + {31, 31, SPECIES_GLOOM}, + {29, 29, SPECIES_NATU}, + {29, 29, SPECIES_XATU}, + {27, 27, SPECIES_HERACROSS}, + {31, 31, SPECIES_XATU}, + {29, 29, SPECIES_HERACROSS}, +}; +const struct WildPokemonInfo SafariZone_Northeast_LandMonsInfo = {25, SafariZone_Northeast_LandMons}; + +const struct WildPokemon SafariZone_Northeast_RockSmashMons [] = +{ + {10, 15, SPECIES_GEODUDE}, + {5, 10, SPECIES_GEODUDE}, + {15, 20, SPECIES_GEODUDE}, + {20, 25, SPECIES_GEODUDE}, + {25, 30, SPECIES_GEODUDE}, +}; +const struct WildPokemonInfo SafariZone_Northeast_RockSmashMonsInfo = {25, SafariZone_Northeast_RockSmashMons}; + +const struct WildPokemon SafariZone_Southwest_LandMons [] = +{ + {25, 25, SPECIES_ODDISH}, + {27, 27, SPECIES_ODDISH}, + {25, 25, SPECIES_GIRAFARIG}, + {27, 27, SPECIES_GIRAFARIG}, + {25, 25, SPECIES_NATU}, +#ifdef SAPPHIRE + {27, 27, SPECIES_DODUO}, +#else + {25, 25, SPECIES_DODUO}, +#endif + {25, 25, SPECIES_GLOOM}, + {27, 27, SPECIES_WOBBUFFET}, + {25, 25, SPECIES_PIKACHU}, + {27, 27, SPECIES_WOBBUFFET}, + {27, 27, SPECIES_PIKACHU}, + {29, 29, SPECIES_WOBBUFFET}, +}; +const struct WildPokemonInfo SafariZone_Southwest_LandMonsInfo = {25, SafariZone_Southwest_LandMons}; + +const struct WildPokemon SafariZone_Southwest_WaterMons [] = +{ + {20, 30, SPECIES_PSYDUCK}, + {20, 30, SPECIES_PSYDUCK}, + {30, 35, SPECIES_PSYDUCK}, + {30, 35, SPECIES_PSYDUCK}, + {30, 35, SPECIES_PSYDUCK}, +}; +const struct WildPokemonInfo SafariZone_Southwest_WaterMonsInfo = {9, SafariZone_Southwest_WaterMons}; + +const struct WildPokemon SafariZone_Southwest_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_GOLDEEN}, + {10, 30, SPECIES_MAGIKARP}, + {10, 25, SPECIES_GOLDEEN}, + {10, 30, SPECIES_GOLDEEN}, + {25, 30, SPECIES_GOLDEEN}, + {30, 35, SPECIES_GOLDEEN}, + {30, 35, SPECIES_SEAKING}, + {35, 40, SPECIES_SEAKING}, + {25, 30, SPECIES_SEAKING}, +}; +const struct WildPokemonInfo SafariZone_Southwest_FishingMonsInfo = {35, SafariZone_Southwest_FishingMons}; + +const struct WildPokemon SafariZone_Southeast_LandMons [] = +{ + {25, 25, SPECIES_ODDISH}, + {27, 27, SPECIES_ODDISH}, + {25, 25, SPECIES_GIRAFARIG}, + {27, 27, SPECIES_GIRAFARIG}, + {25, 25, SPECIES_NATU}, + {25, 25, SPECIES_DODUO}, + {25, 25, SPECIES_GLOOM}, + {27, 27, SPECIES_WOBBUFFET}, + {25, 25, SPECIES_PIKACHU}, + {27, 27, SPECIES_WOBBUFFET}, + {27, 27, SPECIES_PIKACHU}, + {29, 29, SPECIES_WOBBUFFET}, +}; +const struct WildPokemonInfo SafariZone_Southeast_LandMonsInfo = {25, SafariZone_Southeast_LandMons}; + +const struct WildPokemon DewfordTown_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo DewfordTown_WaterMonsInfo = {4, DewfordTown_WaterMons}; + +const struct WildPokemon DewfordTown_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_WAILMER}, + {20, 25, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo DewfordTown_FishingMonsInfo = {10, DewfordTown_FishingMons}; + +const struct WildPokemon PacifidlogTown_WaterMons [] = +{ + {5, 35, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WINGULL}, + {15, 25, SPECIES_WINGULL}, + {25, 30, SPECIES_PELIPPER}, + {25, 30, SPECIES_PELIPPER}, +}; +const struct WildPokemonInfo PacifidlogTown_WaterMonsInfo = {4, PacifidlogTown_WaterMons}; + +const struct WildPokemon PacifidlogTown_FishingMons [] = +{ + {5, 10, SPECIES_MAGIKARP}, + {5, 10, SPECIES_TENTACOOL}, + {10, 30, SPECIES_MAGIKARP}, + {10, 30, SPECIES_TENTACOOL}, + {10, 30, SPECIES_WAILMER}, + {30, 35, SPECIES_SHARPEDO}, + {30, 35, SPECIES_WAILMER}, + {25, 30, SPECIES_WAILMER}, + {35, 40, SPECIES_WAILMER}, + {40, 45, SPECIES_WAILMER}, +}; +const struct WildPokemonInfo PacifidlogTown_FishingMonsInfo = {10, PacifidlogTown_FishingMons}; + +const struct WildPokemon Underwater1_WaterMons [] = +{ + {20, 30, SPECIES_CLAMPERL}, + {20, 30, SPECIES_CHINCHOU}, + {30, 35, SPECIES_CLAMPERL}, + {30, 35, SPECIES_RELICANTH}, + {30, 35, SPECIES_RELICANTH}, +}; +const struct WildPokemonInfo Underwater1_WaterMonsInfo = {4, Underwater1_WaterMons}; + +const struct WildPokemon Underwater2_WaterMons [] = +{ + {20, 30, SPECIES_CLAMPERL}, + {20, 30, SPECIES_CHINCHOU}, + {30, 35, SPECIES_CLAMPERL}, + {30, 35, SPECIES_RELICANTH}, + {30, 35, SPECIES_RELICANTH}, +}; +const struct WildPokemonInfo Underwater2_WaterMonsInfo = {4, Underwater2_WaterMons}; + +const struct WildPokemonHeader gWildMonHeaders[] = +{ + { + .mapGroup = MAP_GROUP(PETALBURG_CITY), + .mapNum = MAP_NUM(PETALBURG_CITY), + .landMonsInfo = NULL, + .waterMonsInfo = &PetalburgCity_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &PetalburgCity_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SLATEPORT_CITY), + .mapNum = MAP_NUM(SLATEPORT_CITY), + .landMonsInfo = NULL, + .waterMonsInfo = &SlateportCity_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &SlateportCity_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(LILYCOVE_CITY), + .mapNum = MAP_NUM(LILYCOVE_CITY), + .landMonsInfo = NULL, + .waterMonsInfo = &LilycoveCity_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &LilycoveCity_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(MOSSDEEP_CITY), + .mapNum = MAP_NUM(MOSSDEEP_CITY), + .landMonsInfo = NULL, + .waterMonsInfo = &MossdeepCity_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &MossdeepCity_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SOOTOPOLIS_CITY), + .mapNum = MAP_NUM(SOOTOPOLIS_CITY), + .landMonsInfo = NULL, + .waterMonsInfo = &SootopolisCity_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &SootopolisCity_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(EVER_GRANDE_CITY), + .mapNum = MAP_NUM(EVER_GRANDE_CITY), + .landMonsInfo = NULL, + .waterMonsInfo = &EverGrandeCity_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &EverGrandeCity_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(METEOR_FALLS_1F_1R), + .mapNum = MAP_NUM(METEOR_FALLS_1F_1R), + .landMonsInfo = &MeteorFalls_1F_1R_LandMonsInfo, + .waterMonsInfo = &MeteorFalls_1F_1R_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &MeteorFalls_1F_1R_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(METEOR_FALLS_1F_2R), + .mapNum = MAP_NUM(METEOR_FALLS_1F_2R), + .landMonsInfo = &MeteorFalls_1F_2R_LandMonsInfo, + .waterMonsInfo = &MeteorFalls_1F_2R_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &MeteorFalls_1F_2R_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(METEOR_FALLS_B1F_1R), + .mapNum = MAP_NUM(METEOR_FALLS_B1F_1R), + .landMonsInfo = &MeteorFalls_B1F_1R_LandMonsInfo, + .waterMonsInfo = &MeteorFalls_B1F_1R_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &MeteorFalls_B1F_1R_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(METEOR_FALLS_B1F_2R), + .mapNum = MAP_NUM(METEOR_FALLS_B1F_2R), + .landMonsInfo = &MeteorFalls_B1F_2R_LandMonsInfo, + .waterMonsInfo = &MeteorFalls_B1F_2R_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &MeteorFalls_B1F_2R_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(RUSTURF_TUNNEL), + .mapNum = MAP_NUM(RUSTURF_TUNNEL), + .landMonsInfo = &RusturfTunnel_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(GRANITE_CAVE_1F), + .mapNum = MAP_NUM(GRANITE_CAVE_1F), + .landMonsInfo = &GraniteCave_1F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(GRANITE_CAVE_B1F), + .mapNum = MAP_NUM(GRANITE_CAVE_B1F), + .landMonsInfo = &GraniteCave_B1F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(GRANITE_CAVE_B2F), + .mapNum = MAP_NUM(GRANITE_CAVE_B2F), + .landMonsInfo = &GraniteCave_B2F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = &GraniteCave_B2F_RockSmashMonsInfo, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(GRANITE_CAVE_STEVENS_ROOM), + .mapNum = MAP_NUM(GRANITE_CAVE_STEVENS_ROOM), + .landMonsInfo = &GraniteCave_StevensRoom_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(PETALBURG_WOODS), + .mapNum = MAP_NUM(PETALBURG_WOODS), + .landMonsInfo = &PetalburgWoods_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(JAGGED_PASS), + .mapNum = MAP_NUM(JAGGED_PASS), + .landMonsInfo = &JaggedPass_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(FIERY_PATH), + .mapNum = MAP_NUM(FIERY_PATH), + .landMonsInfo = &FieryPath_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(MT_PYRE_1F), + .mapNum = MAP_NUM(MT_PYRE_1F), + .landMonsInfo = &MtPyre_1F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(MT_PYRE_2F), + .mapNum = MAP_NUM(MT_PYRE_2F), + .landMonsInfo = &MtPyre_2F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(MT_PYRE_3F), + .mapNum = MAP_NUM(MT_PYRE_3F), + .landMonsInfo = &MtPyre_3F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(MT_PYRE_4F), + .mapNum = MAP_NUM(MT_PYRE_4F), + .landMonsInfo = &MtPyre_4F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(MT_PYRE_5F), + .mapNum = MAP_NUM(MT_PYRE_5F), + .landMonsInfo = &MtPyre_5F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(MT_PYRE_6F), + .mapNum = MAP_NUM(MT_PYRE_6F), + .landMonsInfo = &MtPyre_6F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(MT_PYRE_EXTERIOR), + .mapNum = MAP_NUM(MT_PYRE_EXTERIOR), + .landMonsInfo = &MtPyre_Exterior_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(MT_PYRE_SUMMIT), + .mapNum = MAP_NUM(MT_PYRE_SUMMIT), + .landMonsInfo = &MtPyre_Summit_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ENTRANCE), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ENTRANCE), + .landMonsInfo = NULL, + .waterMonsInfo = &SeafloorCavern_Entrance_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &SeafloorCavern_Entrance_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM1), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM1), + .landMonsInfo = &SeafloorCavern_Room1_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM2), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM2), + .landMonsInfo = &SeafloorCavern_Room2_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM3), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM3), + .landMonsInfo = &SeafloorCavern_Room3_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM4), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM4), + .landMonsInfo = &SeafloorCavern_Room4_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM5), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM5), + .landMonsInfo = &SeafloorCavern_Room5_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM6), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM6), + .landMonsInfo = &SeafloorCavern_Room6_LandMonsInfo, + .waterMonsInfo = &SeafloorCavern_Room6_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &SeafloorCavern_Room6_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM7), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM7), + .landMonsInfo = &SeafloorCavern_Room7_LandMonsInfo, + .waterMonsInfo = &SeafloorCavern_Room7_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &SeafloorCavern_Room7_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM8), + .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM8), + .landMonsInfo = &SeafloorCavern_Room8_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_ENTRANCE), + .mapNum = MAP_NUM(CAVE_OF_ORIGIN_ENTRANCE), + .landMonsInfo = &CaveOfOrigin_Entrance_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_1F), + .mapNum = MAP_NUM(CAVE_OF_ORIGIN_1F), + .landMonsInfo = &CaveOfOrigin_1F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B1F), + .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B1F), + .landMonsInfo = &CaveOfOrigin_B1F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B2F), + .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B2F), + .landMonsInfo = &CaveOfOrigin_B2F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B3F), + .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B3F), + .landMonsInfo = &CaveOfOrigin_B3F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(VICTORY_ROAD_1F), + .mapNum = MAP_NUM(VICTORY_ROAD_1F), + .landMonsInfo = &VictoryRoad_1F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(VICTORY_ROAD_B1F), + .mapNum = MAP_NUM(VICTORY_ROAD_B1F), + .landMonsInfo = &VictoryRoad_B1F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = &VictoryRoad_B1F_RockSmashMonsInfo, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(VICTORY_ROAD_B2F), + .mapNum = MAP_NUM(VICTORY_ROAD_B2F), + .landMonsInfo = &VictoryRoad_B2F_LandMonsInfo, + .waterMonsInfo = &VictoryRoad_B2F_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &VictoryRoad_B2F_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM), + .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM), + .landMonsInfo = &ShoalCave_LowTideEntranceRoom_LandMonsInfo, + .waterMonsInfo = &ShoalCave_LowTideEntranceRoom_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &ShoalCave_LowTideEntranceRoom_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_INNER_ROOM), + .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_INNER_ROOM), + .landMonsInfo = &ShoalCave_LowTideInnerRoom_LandMonsInfo, + .waterMonsInfo = &ShoalCave_LowTideInnerRoom_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &ShoalCave_LowTideInnerRoom_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM), + .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM), + .landMonsInfo = &ShoalCave_LowTideStairsRoom_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_LOWER_ROOM), + .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_LOWER_ROOM), + .landMonsInfo = &ShoalCave_LowTideLowerRoom_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ICE_ROOM), + .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ICE_ROOM), + .landMonsInfo = &ShoalCave_LowTideIceRoom_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(NEW_MAUVILLE_ENTRANCE), + .mapNum = MAP_NUM(NEW_MAUVILLE_ENTRANCE), + .landMonsInfo = &NewMauville_Entrance_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(NEW_MAUVILLE_INSIDE), + .mapNum = MAP_NUM(NEW_MAUVILLE_INSIDE), + .landMonsInfo = &NewMauville_Inside_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(ABANDONED_SHIP_ROOMS_B1F), + .mapNum = MAP_NUM(ABANDONED_SHIP_ROOMS_B1F), + .landMonsInfo = NULL, + .waterMonsInfo = &AbandonedShip_Rooms_B1F_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &AbandonedShip_Rooms_B1F_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS), + .mapNum = MAP_NUM(ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS), + .landMonsInfo = NULL, + .waterMonsInfo = &AbandonedShip_HiddenFloorCorridors_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &AbandonedShip_HiddenFloorCorridors_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SKY_PILLAR_1F), + .mapNum = MAP_NUM(SKY_PILLAR_1F), + .landMonsInfo = &SkyPillar_1F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SKY_PILLAR_3F), + .mapNum = MAP_NUM(SKY_PILLAR_3F), + .landMonsInfo = &SkyPillar_3F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SKY_PILLAR_5F), + .mapNum = MAP_NUM(SKY_PILLAR_5F), + .landMonsInfo = &SkyPillar_5F_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(ROUTE101), + .mapNum = MAP_NUM(ROUTE101), + .landMonsInfo = &Route101_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(ROUTE102), + .mapNum = MAP_NUM(ROUTE102), + .landMonsInfo = &Route102_LandMonsInfo, + .waterMonsInfo = &Route102_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route102_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE103), + .mapNum = MAP_NUM(ROUTE103), + .landMonsInfo = &Route103_LandMonsInfo, + .waterMonsInfo = &Route103_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route103_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE104), + .mapNum = MAP_NUM(ROUTE104), + .landMonsInfo = &Route104_LandMonsInfo, + .waterMonsInfo = &Route104_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route104_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE105), + .mapNum = MAP_NUM(ROUTE105), + .landMonsInfo = NULL, + .waterMonsInfo = &Route105_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route105_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE106), + .mapNum = MAP_NUM(ROUTE106), + .landMonsInfo = NULL, + .waterMonsInfo = &Route106_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route106_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE107), + .mapNum = MAP_NUM(ROUTE107), + .landMonsInfo = NULL, + .waterMonsInfo = &Route107_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route107_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE108), + .mapNum = MAP_NUM(ROUTE108), + .landMonsInfo = NULL, + .waterMonsInfo = &Route108_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route108_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE109), + .mapNum = MAP_NUM(ROUTE109), + .landMonsInfo = NULL, + .waterMonsInfo = &Route109_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route109_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE110), + .mapNum = MAP_NUM(ROUTE110), + .landMonsInfo = &Route110_LandMonsInfo, + .waterMonsInfo = &Route110_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route110_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE111), + .mapNum = MAP_NUM(ROUTE111), + .landMonsInfo = &Route111_LandMonsInfo, + .waterMonsInfo = &Route111_WaterMonsInfo, + .rockSmashMonsInfo = &Route111_RockSmashMonsInfo, + .fishingMonsInfo = &Route111_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE112), + .mapNum = MAP_NUM(ROUTE112), + .landMonsInfo = &Route112_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(ROUTE113), + .mapNum = MAP_NUM(ROUTE113), + .landMonsInfo = &Route113_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(ROUTE114), + .mapNum = MAP_NUM(ROUTE114), + .landMonsInfo = &Route114_LandMonsInfo, + .waterMonsInfo = &Route114_WaterMonsInfo, + .rockSmashMonsInfo = &Route114_RockSmashMonsInfo, + .fishingMonsInfo = &Route114_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE115), + .mapNum = MAP_NUM(ROUTE115), + .landMonsInfo = &Route115_LandMonsInfo, + .waterMonsInfo = &Route115_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route115_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE116), + .mapNum = MAP_NUM(ROUTE116), + .landMonsInfo = &Route116_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(ROUTE117), + .mapNum = MAP_NUM(ROUTE117), + .landMonsInfo = &Route117_LandMonsInfo, + .waterMonsInfo = &Route117_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route117_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE118), + .mapNum = MAP_NUM(ROUTE118), + .landMonsInfo = &Route118_LandMonsInfo, + .waterMonsInfo = &Route118_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route118_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE119), + .mapNum = MAP_NUM(ROUTE119), + .landMonsInfo = &Route119_LandMonsInfo, + .waterMonsInfo = &Route119_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route119_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE120), + .mapNum = MAP_NUM(ROUTE120), + .landMonsInfo = &Route120_LandMonsInfo, + .waterMonsInfo = &Route120_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route120_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE121), + .mapNum = MAP_NUM(ROUTE121), + .landMonsInfo = &Route121_LandMonsInfo, + .waterMonsInfo = &Route121_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route121_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE122), + .mapNum = MAP_NUM(ROUTE122), + .landMonsInfo = NULL, + .waterMonsInfo = &Route122_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route122_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE123), + .mapNum = MAP_NUM(ROUTE123), + .landMonsInfo = &Route123_LandMonsInfo, + .waterMonsInfo = &Route123_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route123_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE124), + .mapNum = MAP_NUM(ROUTE124), + .landMonsInfo = NULL, + .waterMonsInfo = &Route124_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route124_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE125), + .mapNum = MAP_NUM(ROUTE125), + .landMonsInfo = NULL, + .waterMonsInfo = &Route125_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route125_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE126), + .mapNum = MAP_NUM(ROUTE126), + .landMonsInfo = NULL, + .waterMonsInfo = &Route126_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route126_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE127), + .mapNum = MAP_NUM(ROUTE127), + .landMonsInfo = NULL, + .waterMonsInfo = &Route127_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route127_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE128), + .mapNum = MAP_NUM(ROUTE128), + .landMonsInfo = NULL, + .waterMonsInfo = &Route128_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route128_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE129), + .mapNum = MAP_NUM(ROUTE129), + .landMonsInfo = NULL, + .waterMonsInfo = &Route129_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route129_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE130), + .mapNum = MAP_NUM(ROUTE130), + .landMonsInfo = &Route130_LandMonsInfo, + .waterMonsInfo = &Route130_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route130_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE131), + .mapNum = MAP_NUM(ROUTE131), + .landMonsInfo = NULL, + .waterMonsInfo = &Route131_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route131_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE132), + .mapNum = MAP_NUM(ROUTE132), + .landMonsInfo = NULL, + .waterMonsInfo = &Route132_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route132_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE133), + .mapNum = MAP_NUM(ROUTE133), + .landMonsInfo = NULL, + .waterMonsInfo = &Route133_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route133_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(ROUTE134), + .mapNum = MAP_NUM(ROUTE134), + .landMonsInfo = NULL, + .waterMonsInfo = &Route134_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &Route134_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHWEST), + .mapNum = MAP_NUM(SAFARI_ZONE_NORTHWEST), + .landMonsInfo = &SafariZone_Northwest_LandMonsInfo, + .waterMonsInfo = &SafariZone_Northwest_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &SafariZone_Northwest_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHEAST), + .mapNum = MAP_NUM(SAFARI_ZONE_NORTHEAST), + .landMonsInfo = &SafariZone_Northeast_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = &SafariZone_Northeast_RockSmashMonsInfo, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHWEST), + .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHWEST), + .landMonsInfo = &SafariZone_Southwest_LandMonsInfo, + .waterMonsInfo = &SafariZone_Southwest_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &SafariZone_Southwest_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHEAST), + .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHEAST), + .landMonsInfo = &SafariZone_Southeast_LandMonsInfo, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(DEWFORD_TOWN), + .mapNum = MAP_NUM(DEWFORD_TOWN), + .landMonsInfo = NULL, + .waterMonsInfo = &DewfordTown_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &DewfordTown_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(PACIFIDLOG_TOWN), + .mapNum = MAP_NUM(PACIFIDLOG_TOWN), + .landMonsInfo = NULL, + .waterMonsInfo = &PacifidlogTown_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = &PacifidlogTown_FishingMonsInfo, + }, + { + .mapGroup = MAP_GROUP(UNDERWATER1), + .mapNum = MAP_NUM(UNDERWATER1), + .landMonsInfo = NULL, + .waterMonsInfo = &Underwater1_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(UNDERWATER2), + .mapNum = MAP_NUM(UNDERWATER2), + .landMonsInfo = NULL, + .waterMonsInfo = &Underwater2_WaterMonsInfo, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, + { + .mapGroup = MAP_GROUP(UNDEFINED), + .mapNum = MAP_NUM(UNDEFINED), + .landMonsInfo = NULL, + .waterMonsInfo = NULL, + .rockSmashMonsInfo = NULL, + .fishingMonsInfo = NULL, + }, +}; + +const struct WildPokemon gWildFeebasRoute119Data = {20, 25, SPECIES_FEEBAS}; + +const u16 gRoute119WaterTileData[] = +{ + 0, 0x2D, 0, + 0x2E, 0x5B, 0x83, + 0x5C, 0x8B, 0x12A, +}; + +extern u16 gSpecialVar_Result; +extern u8 S_RepelWoreOff[]; + +EWRAM_DATA u8 sWildEncountersDisabled = 0; +EWRAM_DATA static u32 sFeebasRngValue = 0; + +#define NUM_FEEBAS_SPOTS 6 + +u16 FeebasRandom(void); +void FeebasSeedRng(u16 seed); + +static bool8 IsWildLevelAllowedByRepel(u8 level); +static void ApplyFluteEncounterRateMod(u32 *encRate); +static void ApplyCleanseTagEncounterRateMod(u32 *encRate); + +void DisableWildEncounters(bool8 disabled) +{ + sWildEncountersDisabled = disabled; +} + +static u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section) +{ + u16 xCur; + u16 yCur; + u16 yMin = gRoute119WaterTileData[section * 3 + 0]; + u16 yMax = gRoute119WaterTileData[section * 3 + 1]; + u16 tileNum = gRoute119WaterTileData[section * 3 + 2]; + + for (yCur = yMin; yCur <= yMax; yCur++) + { + for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++) + { + if (sub_805759C(MapGridGetMetatileBehaviorAt(xCur + 7, yCur + 7)) == TRUE) + { + tileNum++; + if (x == xCur && y == yCur) + return tileNum; + } + } + } + return tileNum + 1; +} + +static bool8 CheckFeebas(void) +{ + u8 i; + u16 feebasSpots[6]; + s16 x; + s16 y; + u8 route119section = 0; + u16 waterTileNum; + + if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE119) + && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE119)) + { + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + x -= 7; + y -= 7; + +#ifdef NONMATCHING + if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1]) + route119section = 1; + if (y >= gRoute119WaterTileData[3 * 2 + 0] && y <= gRoute119WaterTileData[3 * 2 + 1]) + route119section = 2; +#else + { + register const u16 *arr asm("r0"); + if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1]) + route119section = 1; + if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1]) + route119section = 2; + } +#endif + + if (Random() % 100 > 49) //50% chance of encountering Feebas + return FALSE; + + FeebasSeedRng(gSaveBlock1.easyChatPairs[0].unk2); + for (i = 0; i != NUM_FEEBAS_SPOTS;) + { + feebasSpots[i] = FeebasRandom() % 447; + if (feebasSpots[i] == 0) + feebasSpots[i] = 447; + if (feebasSpots[i] < 1 || feebasSpots[i] >= 4) + i++; + } + waterTileNum = GetRoute119WaterTileNum(x, y, route119section); + for (i = 0; i < NUM_FEEBAS_SPOTS; i++) + { + if (waterTileNum == feebasSpots[i]) + return TRUE; + } + } + return FALSE; +} + +u16 FeebasRandom(void) +{ + sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue; + return sFeebasRngValue >> 16; +} + +void FeebasSeedRng(u16 seed) +{ + sFeebasRngValue = seed; +} + +#if DEBUG +u16 debug_sub_8092344(u8 arg0) +{ + if (arg0 == 0) + return 131; + if (arg0 == 1) + return 167; + if (arg0 == 2) + return 149; + return 0; +} +#endif + +static u8 ChooseWildMonIndex_Land(void) +{ + u8 rand = Random() % 100; + + if (rand < 20) //20% chance + return 0; + if (rand >= 20 && rand < 40) //20% chance + return 1; + if (rand >= 40 && rand < 50) //10% chance + return 2; + if (rand >= 50 && rand < 60) //10% chance + return 3; + if (rand >= 60 && rand < 70) //10% chance + return 4; + if (rand >= 70 && rand < 80) //10% chance + return 5; + if (rand >= 80 && rand < 85) //5% chance + return 6; + if (rand >= 85 && rand < 90) //5% chance + return 7; + if (rand >= 90 && rand < 94) //4% chance + return 8; + if (rand >= 94 && rand < 98) //4% chance + return 9; + if (rand == 98) //1% chance + return 10; + else //1% chance + return 11; +} + +static u8 ChooseWildMonIndex_Water(void) +{ + u8 rand = Random() % 100; + + if (rand < 60) //60% chance + return 0; + if (rand >= 60 && rand < 90) //30% chance + return 1; + if (rand >= 90 && rand < 95) //5% chance + return 2; + if (rand >= 95 && rand < 99) //4% chance + return 3; + else //1% chance + return 4; +} + +enum +{ + OLD_ROD, + GOOD_ROD, + SUPER_ROD +}; + +static u8 ChooseWildMonIndex_Fishing(u8 rod) +{ + u8 wildMonIndex = 0; + u8 rand = Random() % 100; + + switch (rod) + { + case OLD_ROD: + if (rand < 70) //70% chance + wildMonIndex = 0; + else //30% chance + wildMonIndex = 1; + break; + case GOOD_ROD: + if (rand < 60) //60% chance + wildMonIndex = 2; + if (rand >= 60 && rand < 80) //20% chance + wildMonIndex = 3; + if (rand >= 80 && rand < 100) //20% chance + wildMonIndex = 4; + break; + case SUPER_ROD: + if (rand < 40) //40% chance + wildMonIndex = 5; + if (rand >= 40 && rand < 80) //40% chance + wildMonIndex = 6; + if (rand >= 80 && rand < 95) //15% chance + wildMonIndex = 7; + if (rand >= 95 && rand < 99) //4% chance + wildMonIndex = 8; + if (rand == 99) //1% chance + wildMonIndex = 9; + break; + } + return wildMonIndex; +} + +static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon) +{ + u8 min; + u8 max; + u8 range; + u8 rand; + + //Make sure minimum level is less than maximum level + if (wildPokemon->maxLevel >= wildPokemon->minLevel) + { + min = wildPokemon->minLevel; + max = wildPokemon->maxLevel; + } + else + { + min = wildPokemon->maxLevel; + max = wildPokemon->minLevel; + } + range = max - min + 1; + rand = Random() % range; + return min + rand; +} + +static u16 GetCurrentMapWildMonHeader(void) +{ + u16 i; + + for (i = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++) + { + if (gWildMonHeaders[i].mapGroup == gSaveBlock1.location.mapGroup && + gWildMonHeaders[i].mapNum == gSaveBlock1.location.mapNum) + return i; + } + return -1; +} + +static u8 PickWildMonNature(void) +{ + u8 i; + u8 j; + struct Pokeblock *safariPokeblock; + u8 natures[25]; + + if (GetSafariZoneFlag() == TRUE && Random() % 100 < 80) + { + safariPokeblock = SafariZoneGetActivePokeblock(); + if (safariPokeblock != NULL) + { + for (i = 0; i < 25; i++) + natures[i] = i; + for (i = 0; i < 24; i++) + { + for (j = i + 1; j < 25; j++) + { + if (Random() & 1) + { + u8 temp = natures[i]; + + natures[i] = natures[j]; + natures[j] = temp; + } + } + } + for (i = 0; i < 25; i++) + { + if (PokeblockGetGain(natures[i], safariPokeblock) > 0) + return natures[i]; + } + } + } + return Random() % 25; +} + +static void CreateWildMon(u16 species, u8 b) +{ + ZeroEnemyPartyMons(); + CreateMonWithNature(&gEnemyParty[0], species, b, 0x20, PickWildMonNature()); +} + +static bool8 GenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 area, bool8 checkRepel) +{ + u8 wildMonIndex = 0; + u8 level; + + switch (area) + { + case 0: + wildMonIndex = ChooseWildMonIndex_Land(); + break; + case 1: + wildMonIndex = ChooseWildMonIndex_Water(); + break; + case 2: + wildMonIndex = ChooseWildMonIndex_Water(); + break; + } + level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); + if (checkRepel == TRUE && IsWildLevelAllowedByRepel(level) == FALSE) + return FALSE; + else + { + CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); + return TRUE; + } +} + +static u16 GenerateFishingWildMon(const struct WildPokemonInfo *wildMonInfo, u8 rod) +{ + u8 wildMonIndex = ChooseWildMonIndex_Fishing(rod); + u8 level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); + + CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); + return wildMonInfo->wildPokemon[wildMonIndex].species; +} + +static bool8 SetUpMassOutbreakEncounter(bool8 checkRepel) +{ + u16 i; + + if (checkRepel == TRUE && IsWildLevelAllowedByRepel(gSaveBlock1.outbreakPokemonLevel) == FALSE) + return FALSE; + else + { + CreateWildMon(gSaveBlock1.outbreakPokemonSpecies, gSaveBlock1.outbreakPokemonLevel); + for (i = 0; i < 4; i++) + SetMonMoveSlot(&gEnemyParty[0], gSaveBlock1.outbreakPokemonMoves[i], i); + return TRUE; + } +} + +static bool8 DoMassOutbreakEncounterTest(void) +{ + if (gSaveBlock1.outbreakPokemonSpecies != 0 + && gSaveBlock1.location.mapNum == gSaveBlock1.outbreakLocationMapNum + && gSaveBlock1.location.mapGroup == gSaveBlock1.outbreakLocationMapGroup) + { + if (Random() % 100 < gSaveBlock1.outbreakPokemonProbability) + return TRUE; + } + return FALSE; +} + +static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) +{ + if (Random() % 2880 < encounterRate) + return TRUE; + else + return FALSE; +} + +#if DEBUG +u16 debug_sub_809283C(u16 attempts) +{ + u16 retval = 0; + u16 i = 0; + + while (i < attempts) + { + if (DoWildEncounterRateDiceRoll(320) == TRUE) + retval++; + + i++; + } + + return retval; +} +#endif + +static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility) +{ + encounterRate *= 16; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + encounterRate = encounterRate * 80 / 100; + ApplyFluteEncounterRateMod(&encounterRate); + ApplyCleanseTagEncounterRateMod(&encounterRate); + if (!ignoreAbility) + { + // UB: Too few arguments for function 'GetMonData' + if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + { + u32 ability = GetMonAbility(&gPlayerParty[0]); + if (ability == ABILITY_STENCH) + encounterRate /= 2; + if (ability == ABILITY_ILLUMINATE) + encounterRate *= 2; + } + } + if (encounterRate > 2880) + encounterRate = 2880; + return DoWildEncounterRateDiceRoll(encounterRate); +} + +static bool8 DoGlobalWildEncounterDiceRoll(void) +{ + if (Random() % 100 >= 60) + return FALSE; + else + return TRUE; +} + +bool8 StandardWildEncounter(u16 a, u16 b) +{ + u16 headerNum; + struct Roamer *roamer; + + if (sWildEncountersDisabled == TRUE) + return 0; + else + { + headerNum = GetCurrentMapWildMonHeader(); + if (headerNum != 0xFFFF) + { + if (MetatileBehavior_IsLandWildEncounter(a) == TRUE) + { + if (gWildMonHeaders[headerNum].landMonsInfo) + { + if (b != a && !DoGlobalWildEncounterDiceRoll()) + return 0; + + if (DoWildEncounterTest(gWildMonHeaders[headerNum].landMonsInfo->encounterRate, 0) == TRUE) + { + if (TryStartRoamerEncounter() == TRUE) + { + roamer = &gSaveBlock1.roamer; + if (IsWildLevelAllowedByRepel(roamer->level)) + { + BattleSetup_StartRoamerBattle(); + return 1; + } + } + else + { + if (DoMassOutbreakEncounterTest() == TRUE && SetUpMassOutbreakEncounter(1) == TRUE) + { + BattleSetup_StartWildBattle(); + return 1; + } + if (GenerateWildMon(gWildMonHeaders[headerNum].landMonsInfo, 0, TRUE) == TRUE) + { + goto label; + } + } + } + } + } + else if (MetatileBehavior_IsWaterWildEncounter(a) == TRUE + || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(a) == TRUE)) + { + if (gWildMonHeaders[headerNum].waterMonsInfo) + { + if (b != a && !DoGlobalWildEncounterDiceRoll()) + return 0; + + if (DoWildEncounterTest(gWildMonHeaders[headerNum].waterMonsInfo->encounterRate, 0) == TRUE) + { + if (TryStartRoamerEncounter() == TRUE) + { + roamer = &gSaveBlock1.roamer; + if (IsWildLevelAllowedByRepel(roamer->level)) + { + BattleSetup_StartRoamerBattle(); + return 1; + } + } + else + { + //_08085268 + if (GenerateWildMon(gWildMonHeaders[headerNum].waterMonsInfo, 1, TRUE) == TRUE) + { + label: + //_0808527A + BattleSetup_StartWildBattle(); + return 1; + } + } + } + } + } + } + } + return 0; +} + +void ScrSpecial_RockSmashWildEncounter(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if (headerNum != 0xFFFF) + { + const struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerNum].rockSmashMonsInfo; + + if (wildPokemonInfo == NULL) + { + gSpecialVar_Result = 0; + return; + } + else if (DoWildEncounterTest(wildPokemonInfo->encounterRate, 1) == TRUE + && GenerateWildMon(wildPokemonInfo, 2, TRUE) == TRUE) + { + BattleSetup_StartWildBattle(); + gSpecialVar_Result = 1; + return; + } + } + gSpecialVar_Result = 0; + return; +} + +bool8 SweetScentWildEncounter(void) +{ + s16 x; + s16 y; + u16 headerNum; + const struct WildPokemonInfo *wildPokemonInfo; + + PlayerGetDestCoords(&x, &y); + if ((headerNum = GetCurrentMapWildMonHeader()) != 0xFFFF) + { + if (MetatileBehavior_IsLandWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1) + { + wildPokemonInfo = gWildMonHeaders[headerNum].landMonsInfo; + if (wildPokemonInfo == NULL) + return FALSE; + if (TryStartRoamerEncounter() == TRUE) + { + BattleSetup_StartRoamerBattle(); + return TRUE; + } + if (DoMassOutbreakEncounterTest() == TRUE) + SetUpMassOutbreakEncounter(FALSE); + else + GenerateWildMon(wildPokemonInfo, 0, FALSE); + BattleSetup_StartWildBattle(); + return TRUE; + } + else if (MetatileBehavior_IsWaterWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1) + { + wildPokemonInfo = gWildMonHeaders[headerNum].waterMonsInfo; + if (wildPokemonInfo == NULL) + return FALSE; + if (TryStartRoamerEncounter() == TRUE) + { + BattleSetup_StartRoamerBattle(); + return TRUE; + } + GenerateWildMon(wildPokemonInfo, 1, FALSE); + BattleSetup_StartWildBattle(); + return TRUE; + } + } + return FALSE; +} + +bool8 DoesCurrentMapHaveFishingMons(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if (headerNum != 0xFFFF && gWildMonHeaders[headerNum].fishingMonsInfo != NULL) + return TRUE; + else + return FALSE; +} + +void FishingWildEncounter(u8 rod) +{ + u16 species; + + if (CheckFeebas() == TRUE) + { + u8 level = ChooseWildMonLevel(&gWildFeebasRoute119Data); + + species = gWildFeebasRoute119Data.species; + CreateWildMon(species, level); + } + else + { + species = GenerateFishingWildMon( + gWildMonHeaders[GetCurrentMapWildMonHeader()].fishingMonsInfo, + rod); + } + IncrementGameStat(GAME_STAT_FISHING_CAPTURES); + sub_80BEA50(species); + BattleSetup_StartWildBattle(); +} + +u16 GetLocalWildMon(bool8 *isWaterMon) +{ + u16 headerNum; + const struct WildPokemonInfo *landMonsInfo; + const struct WildPokemonInfo *waterMonsInfo; + + *isWaterMon = FALSE; + headerNum = GetCurrentMapWildMonHeader(); + if (headerNum == 0xFFFF) + return 0; + landMonsInfo = gWildMonHeaders[headerNum].landMonsInfo; + waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; + //Neither + if (landMonsInfo == NULL && waterMonsInfo == NULL) + return 0; + //Land Pokemon + if (landMonsInfo != NULL && waterMonsInfo == NULL) + return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; + //Water Pokemon + if (landMonsInfo == NULL && waterMonsInfo != NULL) + { + *isWaterMon = TRUE; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; + } + //Either land or water Pokemon + if ((Random() % 100) < 80) + return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species; + else + { + *isWaterMon = TRUE; + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; + } +} + +u16 GetLocalWaterMon(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if (headerNum != 0xFFFF) + { + const struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; + + if (waterMonsInfo) + return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species; + } + return 0; +} + +bool8 UpdateRepelCounter(void) +{ + u16 steps = VarGet(VAR_REPEL_STEP_COUNT); + + if (steps != 0) + { + steps--; + VarSet(VAR_REPEL_STEP_COUNT, steps); + if (steps == 0) + { + ScriptContext1_SetupScript(S_RepelWoreOff); + return TRUE; + } + } + return FALSE; +} + +static bool8 IsWildLevelAllowedByRepel(u8 wildLevel) +{ + u8 i; + + if (!VarGet(VAR_REPEL_STEP_COUNT)) + { + return TRUE; + } + else + { + for (i = 0; i < 6; i++) + { + // UB: Too few arguments for function 'GetMonData' + if (GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + u8 ourLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); + + if (wildLevel < ourLevel) + return FALSE; + else + return TRUE; + } + } + return FALSE; + } +} + +static void ApplyFluteEncounterRateMod(u32 *encRate) +{ + if (FlagGet(FLAG_SYS_ENC_UP_ITEM) == TRUE) + *encRate += *encRate / 2; + else if (FlagGet(FLAG_SYS_ENC_DOWN_ITEM) == TRUE) + *encRate = *encRate / 2; +} + +static void ApplyCleanseTagEncounterRateMod(u32 *encRate) +{ + // UB: Too few arguments for function 'GetMonData' + if (GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM) == 0xBE) + *encRate = *encRate * 2 / 3; +} -- cgit v1.2.3 From 9b75eb53ce8bc1e630323d9ee308fb2c42b91a20 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 18 Feb 2018 21:03:13 -0500 Subject: rename variables --- src/scene/intro_credits_graphics.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c index 3975fc311..73210c5d9 100644 --- a/src/scene/intro_credits_graphics.c +++ b/src/scene/intro_credits_graphics.c @@ -438,27 +438,27 @@ u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d) void sub_8148F3C(u8 taskId) { - s16 data1; - s16 data4; - s16 data7; + s16 deltaBG1HOFS; + s16 deltaBG2HOFS; + s16 deltaBG3HOFS; s32 r2; - data1 = gTasks[taskId].data[1]; - if (data1 != 0) + deltaBG1HOFS = gTasks[taskId].data[1]; + if (deltaBG1HOFS != 0) { r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3]; - r2 -= 16 * (u16)data1; + r2 -= 16 * (u16)deltaBG1HOFS; gTasks[taskId].data[2] = r2 >> 16; gTasks[taskId].data[3] = r2; REG_BG1HOFS = gTasks[taskId].data[2]; REG_BG1VOFS = gUnknown_02039358 + gUnknown_0203935A; } - data4 = gTasks[taskId].data[4]; - if (data4 != 0) + deltaBG2HOFS = gTasks[taskId].data[4]; + if (deltaBG2HOFS != 0) { r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; - r2 -= 16 * (u16)data4; + r2 -= 16 * (u16)deltaBG2HOFS; gTasks[taskId].data[5] = r2 >> 16; gTasks[taskId].data[6] = r2; REG_BG2HOFS = gTasks[taskId].data[5]; @@ -468,11 +468,11 @@ void sub_8148F3C(u8 taskId) REG_BG2VOFS = gUnknown_02039358; } - data7 = gTasks[taskId].data[7]; - if (data7 != 0) + deltaBG3HOFS = gTasks[taskId].data[7]; + if (deltaBG3HOFS != 0) { r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9]; - r2 -= 16 * (u16)data7; + r2 -= 16 * (u16)deltaBG3HOFS; gTasks[taskId].data[8] = r2 >> 16; gTasks[taskId].data[9] = r2; REG_BG3HOFS = gTasks[taskId].data[8]; -- cgit v1.2.3 From 78ba4a3f3d75a0224e2b2592ff8f0953d01e5229 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 09:54:44 -0500 Subject: through TomomichiDebugMenu_ContestGraphics --- src/debug/tomomichi_debug_menu.c | 118 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index c3616797e..143989c66 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -1,11 +1,17 @@ #if DEBUG #include "global.h" +#include "constants/songs.h" +#include "overworld.h" +#include "menu.h" +#include "start_menu.h" +#include "main.h" +#include "sound.h" // These should be static, uninitialized once it gets decompiled. #define BSS_DATA __attribute__((section(".bss"))) -BSS_DATA u8 gDebug_03000700[4] = {0}; -BSS_DATA u8 gDebug_03000704[4] = {0}; -BSS_DATA u8 gDebug_03000708[4] = {0}; +BSS_DATA u16 gDebug_03000700 = 0; +BSS_DATA u32 gDebug_03000704 = 0; +BSS_DATA u32 gDebug_03000708 = 0; BSS_DATA u8 gDebug_0300070C = 0; BSS_DATA u8 gDebug_0300070D = 0; BSS_DATA u8 gDebug_0300070E = 0; @@ -17,4 +23,110 @@ BSS_DATA u8 gDebug_0300071F = 0; BSS_DATA u8 gDebug_03000720 = 0; BSS_DATA u8 gDebug_03000721 = 0; +bool8 debug_sub_808B874(void); +bool8 debug_sub_808B8C8(void); +bool8 TomomichiDebugMenu_ContestGraphics(void); +bool8 TomomichiDebugMenu_ArtMusGraphics(void); +bool8 TomomichiDebugMenu_PreviewData(void); +bool8 TomomichiDebugMenu_TrickHouse(void); +bool8 TomomichiDebugMenu_ControlEvents(void); +bool8 TomomichiDebugMenu_ControlFlags(void); +bool8 TomomichiDebugMenu_ControlWorks(void); +bool8 TomomichiDebugMenu_Config(void); +bool8 TomomichiDebugMenu_ContestGraphics_Show(void); +bool8 debug_sub_808BC48(void); + +const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); +const u8 gUnknown_Debug_083C0C65[] = _("Art Mus. graphics"); +const u8 gUnknown_Debug_083C0C77[] = _("Preview data"); +const u8 gUnknown_Debug_083C0C84[] = _("TRICK HOUSE"); +const u8 gUnknown_Debug_083C0C90[] = _("Control events"); +const u8 gUnknown_Debug_083C0C9F[] = _("Control flags"); +const u8 gUnknown_Debug_083C0CAD[] = _("Control WORK"); + +const struct MenuAction gUnknown_Debug_083C0CBA[] = { + {gUnknown_Debug_083C0C54, TomomichiDebugMenu_ContestGraphics}, + {gUnknown_Debug_083C0C65, TomomichiDebugMenu_ArtMusGraphics}, + {gUnknown_Debug_083C0C77, TomomichiDebugMenu_PreviewData}, + {gUnknown_Debug_083C0C84, TomomichiDebugMenu_TrickHouse}, + {gUnknown_Debug_083C0C90, TomomichiDebugMenu_ControlEvents}, + {gUnknown_Debug_083C0C9F, TomomichiDebugMenu_ControlFlags}, + {gUnknown_Debug_083C0CAD, TomomichiDebugMenu_ControlWorks}, +}; + +const u8 gUnknown_Debug_083C0CF4[] = _("Contest"); + +const u8 gUnknown_Debug_083C0CFC[] = _("Pokémon No."); +const u8 gUnknown_Debug_083C0D08[] = _("ID rnd. digit"); +const u8 gUnknown_Debug_083C0D16[] = _("Contest Type"); +const u8 gUnknown_Debug_083C0D23[] = _("Poké Art"); + +const struct MenuAction gUnknown_Debug_083C0D2C[] = { + {gUnknown_Debug_083C0CFC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0D08, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0D16, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0D23, TomomichiDebugMenu_ContestGraphics_Show} +}; + +bool8 InitTomomichiDebugWindow(void) +{ + debug_sub_808B874(); + return FALSE; +} + +void debug_sub_808B868(void) +{ + c2_exit_to_overworld_1_continue_scripts_restart_music(); +} + +bool8 debug_sub_808B874(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 13, 15); + Menu_PrintItems(1, 1, 7, gUnknown_Debug_083C0CBA); + InitMenu(0, 1, 1, 7, gDebug_0300071D, 12); + gMenuCallback = debug_sub_808B8C8; + return FALSE; +} + +bool8 debug_sub_808B8C8(void) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gDebug_0300071D = Menu_MoveCursor(-1); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gDebug_0300071D = Menu_MoveCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return gUnknown_Debug_083C0CBA[gDebug_0300071D].func(); + } + if (gMain.newKeys & (B_BUTTON | START_BUTTON)) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +bool8 TomomichiDebugMenu_ContestGraphics(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 20, 11); + Menu_PrintText(gUnknown_Debug_083C0CF4, 1, 1); + Menu_PrintItems(2, 3, 4, gUnknown_Debug_083C0D2C); + InitMenu(0, 1, 3, 4, 0, 19); + gMenuCallback = debug_sub_808BC48; + gDebug_03000700 = 1; + gDebug_03000704 = 0x6f33; + gDebug_03000708 = 0; + gDebug_0300070C = 1; + return FALSE; +} + #endif -- cgit v1.2.3 From 5eb0b5fbe2f95b360f6da9503bbe240039c15b1f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 10:48:07 -0500 Subject: through TomomichiDebugMenu_ControlWorks --- src/debug/tomomichi_debug_menu.c | 184 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 180 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 143989c66..11c66ace1 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -35,6 +35,31 @@ bool8 TomomichiDebugMenu_ControlWorks(void); bool8 TomomichiDebugMenu_Config(void); bool8 TomomichiDebugMenu_ContestGraphics_Show(void); bool8 debug_sub_808BC48(void); +bool8 debug_sub_808BCBC(void); +bool8 TomomichiDebugMenu_MuseumGraphics_Show(void); +bool8 debug_sub_808BD30(void); +bool8 debug_sub_808BDA4(void); +bool8 debug_sub_808BE2C(void); +bool8 debug_sub_808BEB4(void); +bool8 debug_sub_808BF3C(void); +bool8 debug_sub_808ECA4(void); +bool8 debug_sub_808EB58(void); +bool8 debug_sub_808EBB4(void); +bool8 debug_sub_808BFC4(void); +bool8 debug_sub_808C014(void); +bool8 debug_sub_808C31C(void); +bool8 debug_sub_808C7C8(void); +bool8 debug_sub_808CC74(void); +bool8 debug_sub_808CF10(void); +bool8 debug_sub_808D844(void); +bool8 debug_sub_808D600(void); +bool8 debug_sub_808D3BC(void); +bool8 debug_sub_808DB0C(void); +bool8 debug_sub_808E36C(void); +bool8 debug_sub_808E6C0(void); +bool8 debug_sub_808E90C(void); +bool8 debug_sub_808DA30(void); +bool8 debug_sub_808DFC0(void); const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); const u8 gUnknown_Debug_083C0C65[] = _("Art Mus. graphics"); @@ -68,6 +93,86 @@ const struct MenuAction gUnknown_Debug_083C0D2C[] = { {gUnknown_Debug_083C0D23, TomomichiDebugMenu_ContestGraphics_Show} }; +const u8 gUnknown_Debug_083C0D4C[] = _("Art Mus."); +const u8 gUnknown_Debug_083C0D55[] = _("Pokémon No."); +const u8 gUnknown_Debug_083C0D61[] = _("ID rnd. digit"); +const u8 gUnknown_Debug_083C0D6F[] = _("Title Type"); +const u8 gUnknown_Debug_083C0D7A[] = _("Poké Art"); + +const struct MenuAction gUnknown_Debug_083C0D83[] = { + {gUnknown_Debug_083C0D55, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0D61, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0D6F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0D7A, TomomichiDebugMenu_MuseumGraphics_Show} +}; + +const u8 gUnknown_Debug_083C0DA4[] = _("Preview"); + +const u8 gUnknown_Debug_083C0DAC[] = _("Pokémon No."); +const u8 gUnknown_Debug_083C0DB8[] = _("ID rnd. digit"); +const u8 gUnknown_Debug_083C0DC6[] = _("Type"); +const u8 gUnknown_Debug_083C0DCB[] = _("Poké Art"); + +const struct MenuAction gUnknown_Debug_083C0DD4[] = { + {gUnknown_Debug_083C0DAC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0DB8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0DC6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C0DCB, debug_sub_808ECA4} +}; + +const u8 gUnknown_Debug_083C0DF4[] = _("Trick related"); + +const u8 gUnknown_Debug_083C0E02[] = _("Level"); +const u8 gUnknown_Debug_083C0E08[] = _("Trick Master"); + +const struct MenuAction gUnknown_Debug_083C0E15[] = { + {gUnknown_Debug_083C0E02, debug_sub_808EB58}, + {gUnknown_Debug_083C0E08, debug_sub_808EBB4} +}; + +const u8 gUnknown_Debug_083C0E28[] = _("パート1"); +const u8 gUnknown_Debug_083C0E2D[] = _("パート2"); + +const struct MenuAction gUnknown_Debug_083C0E32[] = { + {gUnknown_Debug_083C0E28, debug_sub_808BFC4}, + {gUnknown_Debug_083C0E2D, debug_sub_808C014} +}; + +const u8 gUnknown_Debug_083C0E44[] = _("イベントFLAG"); +const u8 gUnknown_Debug_083C0E4D[] = _("バニシュFLAG"); +const u8 gUnknown_Debug_083C0E56[] = _("トレーナーFLAG"); +const u8 gUnknown_Debug_083C0E60[] = _("SYSFLAG"); +const u8 gUnknown_Debug_083C0E68[] = _("BALLバニシュFLAG"); +const u8 gUnknown_Debug_083C0E75[] = _("FH"); +const u8 gUnknown_Debug_083C0E78[] = _("FH-OBJ"); + +const struct MenuAction gUnknown_Debug_083C0E7F[] = { + {gUnknown_Debug_083C0E44, debug_sub_808C31C}, + {gUnknown_Debug_083C0E4D, debug_sub_808C7C8}, + {gUnknown_Debug_083C0E56, debug_sub_808CC74}, + {gUnknown_Debug_083C0E60, debug_sub_808CF10}, + {gUnknown_Debug_083C0E68, debug_sub_808D844}, + {gUnknown_Debug_083C0E75, debug_sub_808D600}, + {gUnknown_Debug_083C0E78, debug_sub_808D3BC} +}; + +const u8 gUnknown_Debug_083C0EB8[] = _("SAVEWORK"); + +const u8 gUnknown_Debug_083C0EC1[] = _("SYSWORK"); +const u8 gUnknown_Debug_083C0EC9[] = _("LOCALWORK"); +const u8 gUnknown_Debug_083C0ED3[] = _("OBJWORK"); +const u8 gUnknown_Debug_083C0EDB[] = _("ANSWORK"); +const u8 gUnknown_Debug_083C0EE3[] = _("SAVEWORK パート2"); + +const struct MenuAction gUnknown_Debug_083C0EF1[] = { + {gUnknown_Debug_083C0EB8, debug_sub_808DB0C}, + {gUnknown_Debug_083C0EC1, debug_sub_808E36C}, + {gUnknown_Debug_083C0EC9, debug_sub_808E6C0}, + {gUnknown_Debug_083C0ED3, debug_sub_808E90C}, + {gUnknown_Debug_083C0EDB, debug_sub_808DA30}, + {gUnknown_Debug_083C0EE3, debug_sub_808DFC0} +}; + bool8 InitTomomichiDebugWindow(void) { debug_sub_808B874(); @@ -83,8 +188,8 @@ bool8 debug_sub_808B874(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 13, 15); - Menu_PrintItems(1, 1, 7, gUnknown_Debug_083C0CBA); - InitMenu(0, 1, 1, 7, gDebug_0300071D, 12); + Menu_PrintItems(1, 1, ARRAY_COUNT(gUnknown_Debug_083C0CBA), gUnknown_Debug_083C0CBA); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0CBA), gDebug_0300071D, 12); gMenuCallback = debug_sub_808B8C8; return FALSE; } @@ -119,8 +224,8 @@ bool8 TomomichiDebugMenu_ContestGraphics(void) Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 20, 11); Menu_PrintText(gUnknown_Debug_083C0CF4, 1, 1); - Menu_PrintItems(2, 3, 4, gUnknown_Debug_083C0D2C); - InitMenu(0, 1, 3, 4, 0, 19); + Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C0D2C), gUnknown_Debug_083C0D2C); + InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C0D2C), 0, 19); gMenuCallback = debug_sub_808BC48; gDebug_03000700 = 1; gDebug_03000704 = 0x6f33; @@ -129,4 +234,75 @@ bool8 TomomichiDebugMenu_ContestGraphics(void) return FALSE; } +bool8 TomomichiDebugMenu_ArtMusGraphics(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 20, 11); + Menu_PrintText(gUnknown_Debug_083C0D4C, 1, 1); + Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C0D83), gUnknown_Debug_083C0D83); + InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C0D83), 0, 19); + gMenuCallback = debug_sub_808BCBC; + gDebug_03000700 = 1; + gDebug_03000704 = 0x6f33; + gDebug_03000708 = 0; + gDebug_0300070D = 1; + return FALSE; +} + +bool8 TomomichiDebugMenu_PreviewData(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 20, 11); + Menu_PrintText(gUnknown_Debug_083C0DA4, 1, 1); + Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C0DD4), gUnknown_Debug_083C0DD4); + InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C0DD4), 0, 19); + gMenuCallback = debug_sub_808BD30; + gDebug_03000700 = 1; + gDebug_03000704 = 0x6f33; + gDebug_03000708 = 0; + gDebug_0300070E = 1; + return FALSE; +} + +bool8 TomomichiDebugMenu_TrickHouse(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 7); + Menu_PrintText(gUnknown_Debug_083C0DF4, 1, 1); + Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C0E15), gUnknown_Debug_083C0E15); + InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C0E15), gDebug_0300071E, 23); + gMenuCallback = debug_sub_808BDA4; + return FALSE; +} + +bool8 TomomichiDebugMenu_ControlEvents(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 5); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0E32), gUnknown_Debug_083C0E32); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0E32), gDebug_0300071F, 23); + gMenuCallback = debug_sub_808BE2C; + return FALSE; +} + +bool8 TomomichiDebugMenu_ControlFlags(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 15); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0E7F), gUnknown_Debug_083C0E7F); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0E7F), gDebug_03000720, 23); + gMenuCallback = debug_sub_808BEB4; + return FALSE; +} + +bool8 TomomichiDebugMenu_ControlWorks(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 13); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0EF1), gUnknown_Debug_083C0EF1); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0EF1), gDebug_03000721, 23); + gMenuCallback = debug_sub_808BF3C; + return FALSE; +} + #endif -- cgit v1.2.3 From bfaa4de6e8abd81cc7e592ad9f4df3750f71c359 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 11:02:00 -0500 Subject: debug_sub_808BC48 --- src/debug/tomomichi_debug_menu.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 11c66ace1..fef72e4b3 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -60,6 +60,10 @@ bool8 debug_sub_808E6C0(void); bool8 debug_sub_808E90C(void); bool8 debug_sub_808DA30(void); bool8 debug_sub_808DFC0(void); +void debug_sub_808ED0C(void); +void debug_sub_808ED9C(void); +void debug_sub_808EE3C(void); +void debug_sub_808EF8C(u32 a0); const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); const u8 gUnknown_Debug_083C0C65[] = _("Art Mus. graphics"); @@ -305,4 +309,37 @@ bool8 TomomichiDebugMenu_ControlWorks(void) return FALSE; } +bool8 debug_sub_808BC48(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + switch (cursorPos) + { + case 0: + debug_sub_808ED0C(); + break; + case 1: + debug_sub_808ED9C(); + break; + case 2: + debug_sub_808EE3C(); + break; + } + debug_sub_808EF8C(0); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + if (input == 3) + { + gMenuCallback = gUnknown_Debug_083C0D2C[3].func; + return FALSE; + } + return FALSE; +} + #endif -- cgit v1.2.3 From c9f82001883cb3c2828467bee7fc70ba18ce2569 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 11:17:46 -0500 Subject: through debug_sub_808BDA4 --- src/debug/tomomichi_debug_menu.c | 93 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index fef72e4b3..c90364647 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -63,6 +63,8 @@ bool8 debug_sub_808DFC0(void); void debug_sub_808ED0C(void); void debug_sub_808ED9C(void); void debug_sub_808EE3C(void); +void debug_sub_808EE9C(void); +void debug_sub_808EF14(void); void debug_sub_808EF8C(u32 a0); const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); @@ -342,4 +344,95 @@ bool8 debug_sub_808BC48(void) return FALSE; } +bool8 debug_sub_808BCBC(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + switch (cursorPos) + { + case 0: + debug_sub_808ED0C(); + break; + case 1: + debug_sub_808ED9C(); + break; + case 2: + debug_sub_808EE9C(); + break; + } + debug_sub_808EF8C(1); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + if (input == 3) + { + gMenuCallback = gUnknown_Debug_083C0D83[3].func; + return FALSE; + } + return FALSE; +} + +bool8 debug_sub_808BD30(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + switch (cursorPos) + { + case 0: + debug_sub_808ED0C(); + break; + case 1: + debug_sub_808ED9C(); + break; + case 2: + debug_sub_808EF14(); + break; + } + debug_sub_808EF8C(2); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + if (input == 3) + { + gMenuCallback = gUnknown_Debug_083C0DD4[3].func; + return FALSE; + } + return FALSE; +} + +bool8 debug_sub_808BDA4(void) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gDebug_0300071E = Menu_MoveCursor(-1); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gDebug_0300071E = Menu_MoveCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return gUnknown_Debug_083C0E15[gDebug_0300071E].func(); + } + if (gMain.newKeys & (B_BUTTON | START_BUTTON)) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + #endif -- cgit v1.2.3 From a3000fb0837d5ff8cd262b13d0ca8a36335c3806 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 13:04:34 -0500 Subject: through debug_sub_808BF3C --- src/debug/tomomichi_debug_menu.c | 75 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index c90364647..00340c39a 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -435,4 +435,79 @@ bool8 debug_sub_808BDA4(void) return FALSE; } +bool8 debug_sub_808BE2C(void) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gDebug_0300071F = Menu_MoveCursor(-1); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gDebug_0300071F = Menu_MoveCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return gUnknown_Debug_083C0E32[gDebug_0300071F].func(); + } + if (gMain.newKeys & (B_BUTTON | START_BUTTON)) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +bool8 debug_sub_808BEB4(void) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gDebug_03000720 = Menu_MoveCursor(-1); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gDebug_03000720 = Menu_MoveCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return gUnknown_Debug_083C0E7F[gDebug_03000720].func(); + } + if (gMain.newKeys & (B_BUTTON | START_BUTTON)) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +bool8 debug_sub_808BF3C(void) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gDebug_03000721 = Menu_MoveCursor(-1); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gDebug_03000721 = Menu_MoveCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return gUnknown_Debug_083C0EF1[gDebug_03000721].func(); + } + if (gMain.newKeys & (B_BUTTON | START_BUTTON)) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + #endif -- cgit v1.2.3 From 01192893628501cf1062bab1e580bace858d00ac Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 16:16:31 -0500 Subject: text through debug_sub_808C014; rodata through gDebug_0x83C1974 --- src/debug/tomomichi_debug_menu.c | 482 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 482 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 00340c39a..a5f7964a1 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -66,6 +66,36 @@ void debug_sub_808EE3C(void); void debug_sub_808EE9C(void); void debug_sub_808EF14(void); void debug_sub_808EF8C(u32 a0); +bool8 debug_sub_808C064(void); +bool8 debug_sub_808C0EC(void); +bool8 debug_sub_808C104(void); +bool8 debug_sub_808C11C(void); +bool8 debug_sub_808C134(void); +bool8 debug_sub_808C14C(void); +bool8 debug_sub_808C164(void); +bool8 debug_sub_808C17C(void); +bool8 debug_sub_808C194(void); +bool8 debug_sub_808C1AC(void); +bool8 debug_sub_808C0A8(void); +bool8 debug_sub_808C1C4(void); +bool8 debug_sub_808C1DC(void); +bool8 debug_sub_808C1F4(void); +bool8 debug_sub_808C20C(void); +bool8 debug_sub_808C224(void); +bool8 debug_sub_808C23C(void); +bool8 debug_sub_808D450(void); +bool8 debug_sub_808D4A8(void); +bool8 debug_sub_808D694(void); +bool8 debug_sub_808D6EC(void); +bool8 debug_sub_808CFA4(void); +bool8 debug_sub_808CFFC(void); +bool8 debug_sub_808D054(void); +bool8 debug_sub_808D0AC(void); +bool8 debug_sub_808D104(void); +bool8 debug_sub_808D15C(void); +bool8 debug_sub_808D1B4(void); +bool8 debug_sub_808D20C(void); +bool8 debug_sub_808D264(void); const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); const u8 gUnknown_Debug_083C0C65[] = _("Art Mus. graphics"); @@ -179,6 +209,438 @@ const struct MenuAction gUnknown_Debug_083C0EF1[] = { {gUnknown_Debug_083C0EE3, debug_sub_808DFC0} }; +const u8 gUnknown_Debug_083C0F24[] = _("クリアご"); +const u8 gUnknown_Debug_083C0F29[] = _("コインこうにゅうかのう"); +const u8 gUnknown_Debug_083C0F35[] = _("コトキサポーターセット"); +const u8 gUnknown_Debug_083C0F41[] = _("ニューキンセツOPEN"); +const u8 gUnknown_Debug_083C0F4D[] = _("れんらくせんにのれる"); +const u8 gUnknown_Debug_083C0F58[] = _("タマゴついか"); +const u8 gUnknown_Debug_083C0F5F[] = _("アイテムいっぱい"); +const u8 gUnknown_Debug_083C0F68[] = _("グッズいっぱい"); +const u8 gUnknown_Debug_083C0F70[] = _("COINいっぱい"); + +const struct MenuAction gUnknown_Debug_083C0F79[] = { + {gUnknown_Debug_083C0F24, debug_sub_808C0EC}, + {gUnknown_Debug_083C0F29, debug_sub_808C104}, + {gUnknown_Debug_083C0F35, debug_sub_808C11C}, + {gUnknown_Debug_083C0F41, debug_sub_808C134}, + {gUnknown_Debug_083C0F4D, debug_sub_808C14C}, + {gUnknown_Debug_083C0F58, debug_sub_808C164}, + {gUnknown_Debug_083C0F5F, debug_sub_808C17C}, + {gUnknown_Debug_083C0F68, debug_sub_808C194}, + {gUnknown_Debug_083C0F70, debug_sub_808C1AC} +}; + +const u8 gUnknown_Debug_083C0FC4[] = _("ムロジムOPEN"); +const u8 gUnknown_Debug_083C0FCD[] = _("おかねを0へ"); +const u8 gUnknown_Debug_083C0FD4[] = _("ドジョッチ FULL"); +const u8 gUnknown_Debug_083C0FDF[] = _("キノココ FULL"); +const u8 gUnknown_Debug_083C0FE9[] = _("ドジョッチ タマゴ"); +const u8 gUnknown_Debug_083C0FF3[] = _("キノココ タマゴ"); + +const struct MenuAction gUnknown_Debug_083C0FFC[] = { + {gUnknown_Debug_083C0FC4, debug_sub_808C1C4}, + {gUnknown_Debug_083C0FCD, debug_sub_808C1DC}, + {gUnknown_Debug_083C0FD4, debug_sub_808C1F4}, + {gUnknown_Debug_083C0FDF, debug_sub_808C20C}, + {gUnknown_Debug_083C0FE9, debug_sub_808C224}, + {gUnknown_Debug_083C0FF3, debug_sub_808C23C} +}; + +const u8 gUnknown_Debug_083C102C[] = _("ANSWORK みかんせい"); + +const struct MenuAction gUnknown_Debug_083C103A[] = { + {gUnknown_Debug_083C102C, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1044[] = _("FHーOBJ00ー08"); +const u8 gUnknown_Debug_083C1050[] = _("FHーOBJ09ー15"); + +const struct MenuAction gUnknown_Debug_083C105C[] = { + {gUnknown_Debug_083C1044, debug_sub_808D450}, + {gUnknown_Debug_083C1050, debug_sub_808D4A8} +}; + +const u8 gUnknown_Debug_083C106C[] = _("FHーOBJ00"); +const u8 gUnknown_Debug_083C1075[] = _("FHーOBJ01"); +const u8 gUnknown_Debug_083C107E[] = _("FHーOBJ02"); +const u8 gUnknown_Debug_083C1087[] = _("FHーOBJ03"); +const u8 gUnknown_Debug_083C1090[] = _("FHーOBJ04"); +const u8 gUnknown_Debug_083C1099[] = _("FHーOBJ05"); +const u8 gUnknown_Debug_083C10A2[] = _("FHーOBJ06"); +const u8 gUnknown_Debug_083C10AB[] = _("FHーOBJ07"); +const u8 gUnknown_Debug_083C10B4[] = _("FHーOBJ08"); + +const struct MenuAction gUnknown_Debug_083C10BD[] = { + {gUnknown_Debug_083C106C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1075, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C107E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1087, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1090, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1099, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C10A2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C10AB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C10B4, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1108[] = _("FH-OBJ09"); +const u8 gUnknown_Debug_083C1111[] = _("FH-OBJ10"); +const u8 gUnknown_Debug_083C111A[] = _("FH-OBJ11"); +const u8 gUnknown_Debug_083C1123[] = _("FH-OBJ12"); +const u8 gUnknown_Debug_083C112C[] = _("FH-OBJ13"); +const u8 gUnknown_Debug_083C1135[] = _("FH-OBJ14"); +const u8 gUnknown_Debug_083C113E[] = _("FH-OBJ15"); +const u8 gUnknown_Debug_083C1147[] = _(""); +const u8 gUnknown_Debug_083C1148[] = _(""); + +const struct MenuAction gUnknown_Debug_083C1149[] = { + {gUnknown_Debug_083C1108, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1111, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C111A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1123, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C112C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1135, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C113E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1147, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1148, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1194[] = {9, 7}; + +const u16 gUnknown_Debug_083C1196[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00, 0x00}; + +const u8 gUnknown_Debug_083C11BA[] = _("FH-00-08"); +const u8 gUnknown_Debug_083C11C3[] = _("FH-09-15"); + +const struct MenuAction gUnknown_Debug_083C11CC[] = { + {gUnknown_Debug_083C11BA, debug_sub_808D694}, + {gUnknown_Debug_083C11C3, debug_sub_808D6EC} +}; + +const u8 gUnknown_Debug_083C11DC[] = _("FH-00"); +const u8 gUnknown_Debug_083C11E2[] = _("FH-01"); +const u8 gUnknown_Debug_083C11E8[] = _("FH-02"); +const u8 gUnknown_Debug_083C11EE[] = _("FH-03"); +const u8 gUnknown_Debug_083C11F4[] = _("FH-04"); +const u8 gUnknown_Debug_083C11FA[] = _("FH-05"); +const u8 gUnknown_Debug_083C1200[] = _("FH-06"); +const u8 gUnknown_Debug_083C1206[] = _("FH-07"); +const u8 gUnknown_Debug_083C120C[] = _("FH-08"); + +const struct MenuAction gUnknown_Debug_083C1212[] = { + {gUnknown_Debug_083C11DC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C11E2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C11E8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C11EE, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C11F4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C11FA, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1200, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1206, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C120C, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C125C[] = _("FHー09"); +const u8 gUnknown_Debug_083C1262[] = _("FHー10"); +const u8 gUnknown_Debug_083C1268[] = _("FHー11"); +const u8 gUnknown_Debug_083C126E[] = _("FHー12"); +const u8 gUnknown_Debug_083C1274[] = _("FHー13"); +const u8 gUnknown_Debug_083C127A[] = _("FHー14"); +const u8 gUnknown_Debug_083C1280[] = _("FHー15"); +const u8 gUnknown_Debug_083C1286[] = _(""); +const u8 gUnknown_Debug_083C1287[] = _(""); + +const struct MenuAction gUnknown_Debug_083C1288[] = { + {gUnknown_Debug_083C125C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1262, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1268, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C126E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1274, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C127A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1280, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1286, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1287, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C12D0[] = {9, 7}; + +const u16 gUnknown_Debug_083C12D2[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x00, 0x00}; + +const u8 gUnknown_Debug_083C12F6[] = _("BATCH"); + +const u8 gUnknown_Debug_083C12FC[] = _("タウンとうちゃく"); + +const u8 gUnknown_Debug_083C1305[] = _("シティとうちゃく"); + +const u8 gUnknown_Debug_083C130E[] = _("GET"); + +const u8 gUnknown_Debug_083C1312[] = _("そのた1"); + +const u8 gUnknown_Debug_083C1317[] = _("そのた2"); + +const u8 gUnknown_Debug_083C131C[] = _("そのた3"); + +const u8 gUnknown_Debug_083C1321[] = _("そのた4"); + +const u8 gUnknown_Debug_083C1326[] = _("そのた とうちゃく"); + +const struct MenuAction gUnknown_Debug_083C1330[] = { + {gUnknown_Debug_083C12F6, debug_sub_808CFA4}, + {gUnknown_Debug_083C12FC, debug_sub_808CFFC}, + {gUnknown_Debug_083C1305, debug_sub_808D054}, + {gUnknown_Debug_083C130E, debug_sub_808D0AC}, + {gUnknown_Debug_083C1312, debug_sub_808D104}, + {gUnknown_Debug_083C1317, debug_sub_808D15C}, + {gUnknown_Debug_083C131C, debug_sub_808D1B4}, + {gUnknown_Debug_083C1321, debug_sub_808D20C}, + {gUnknown_Debug_083C1326, debug_sub_808D264} +}; + +const u8 gUnknown_Debug_083C1378[] = _("BATCH01ーGET"); + +const u8 gUnknown_Debug_083C1384[] = _("BATCH02ーGET"); + +const u8 gUnknown_Debug_083C1390[] = _("BATCH03ーGET"); + +const u8 gUnknown_Debug_083C139C[] = _("BATCH04ーGET"); + +const u8 gUnknown_Debug_083C13A8[] = _("BATCH05ーGET"); + +const u8 gUnknown_Debug_083C13B4[] = _("BATCH06ーGET"); + +const u8 gUnknown_Debug_083C13C0[] = _("BATCH07ーGET"); + +const u8 gUnknown_Debug_083C13CC[] = _("BATCH08ーGET"); + +const struct MenuAction gUnknown_Debug_083C13D8[] = { + {gUnknown_Debug_083C1378, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1384, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1390, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C139C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C13A8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C13B4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C13C0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C13CC, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1418[] = _("T101ARRIVE"); + +const u8 gUnknown_Debug_083C1423[] = _("T102ARRIVE"); + +const u8 gUnknown_Debug_083C142E[] = _("T103ARRIVE"); + +const u8 gUnknown_Debug_083C1439[] = _("T104ARRIVE"); + +const u8 gUnknown_Debug_083C1444[] = _("T105ARRIVE"); + +const u8 gUnknown_Debug_083C144F[] = _("T106ARRIVE"); + +const u8 gUnknown_Debug_083C145A[] = _("T107ARRIVE"); + +const struct MenuAction gUnknown_Debug_083C1465[] = { + {gUnknown_Debug_083C1418, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1423, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C142E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1439, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1444, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C144F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C145A, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C14A0[] = _("C101ARRIVE"); + +const u8 gUnknown_Debug_083C14AB[] = _("C102ARRIVE"); + +const u8 gUnknown_Debug_083C14B6[] = _("C103ARRIVE"); + +const u8 gUnknown_Debug_083C14C1[] = _("C104ARRIVE"); + +const u8 gUnknown_Debug_083C14CC[] = _("C105ARRIVE"); + +const u8 gUnknown_Debug_083C14D7[] = _("C106ARRIVE"); + +const u8 gUnknown_Debug_083C14E2[] = _("C107ARRIVE"); + +const u8 gUnknown_Debug_083C14ED[] = _("C108ARRIVE"); + +const u8 gUnknown_Debug_083C14F8[] = _("C109ARRIVE"); + +const struct MenuAction gUnknown_Debug_083C1503[] = { + {gUnknown_Debug_083C14A0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C14AB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C14B6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C14C1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C14CC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C14D7, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C14E2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C14ED, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C14F8, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C154C[] = _("SYSーPOKEMONーGET"); + +const u8 gUnknown_Debug_083C155C[] = _("SYSーZUKANーGET"); + +const u8 gUnknown_Debug_083C156A[] = _("SYSーPOKEGEARーGET"); + +const u8 gUnknown_Debug_083C157B[] = _("SYSーRIBBONーGET"); + +const struct MenuAction gUnknown_Debug_083C158A[] = { + {gUnknown_Debug_083C154C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C155C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C156A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C157B, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C15AC[] = _("SYSーGAMEーCLEAR"); + +const u8 gUnknown_Debug_083C15BB[] = _("SYSーKAIWAーUSED"); + +const u8 gUnknown_Debug_083C15CA[] = _("SYSーNOWーOYAJIーMEET"); + +const u8 gUnknown_Debug_083C15DD[] = _("SYSーUSEーWAZAーFLASH"); + +const u8 gUnknown_Debug_083C15F0[] = _("SYSーUSEーWAZAーKAIRIKI"); + +const u8 gUnknown_Debug_083C1605[] = _("SYSーWEATHERーCTRL"); + +const u8 gUnknown_Debug_083C1616[] = _("SYSーCYCLINGーROAD"); + +const u8 gUnknown_Debug_083C1627[] = _("SYSーSAFARIーMODE"); + +const u8 gUnknown_Debug_083C1637[] = _("SYSーCRUISEーMODE"); + +const struct MenuAction gUnknown_Debug_083C1647[] = { + {gUnknown_Debug_083C15AC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C15BB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C15CA, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C15DD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C15F0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1605, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1616, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1627, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1637, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1690[] = _("SYSーTVーHOME"); + +const u8 gUnknown_Debug_083C169C[] = _("SYSーTVーWATCH"); + +const u8 gUnknown_Debug_083C16A9[] = _("SYSーTVSTART"); + +const u8 gUnknown_Debug_083C16B5[] = _("SYSーPOPWORDーINPUT"); + +const u8 gUnknown_Debug_083C16C7[] = _("SYSーMIXーRECORD"); + +const u8 gUnknown_Debug_083C16D6[] = _("SYSーCLOCKーSET"); + +const u8 gUnknown_Debug_083C16E4[] = _("SYSーCAVEーSHIP"); + +const u8 gUnknown_Debug_083C16F2[] = _("SYSーCAVEーWONDER"); + +const u8 gUnknown_Debug_083C1702[] = _("SYSーCAVEーBATTLE"); + +const struct MenuAction gUnknown_Debug_083C1712[] = { + {gUnknown_Debug_083C1690, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C169C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C16A9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C16B5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C16C7, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C16D6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C16E4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C16F2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1702, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C175C[] = _("SYSーSPECIALーZUKAN"); + +const u8 gUnknown_Debug_083C176E[] = _("SYSーASASEーTIDE"); + +const u8 gUnknown_Debug_083C177D[] = _("SYSーRIBBONーGET"); + +const u8 gUnknown_Debug_083C178C[] = _("SYSーPASOーMAYUMI"); + +const u8 gUnknown_Debug_083C179C[] = _("SYSーEXDATAーENABLE"); + +const u8 gUnknown_Debug_083C17AE[] = _("SYSーTENJIーANAWOHORU"); + +const u8 gUnknown_Debug_083C17C2[] = _("SYSーTENJIーKAIRIKI"); + +const u8 gUnknown_Debug_083C17D4[] = _("SYSーTENJIーWAIT"); + +const u8 gUnknown_Debug_083C17E3[] = _("SYSーTENJIーSORAWOTOBU"); + +const struct MenuAction gUnknown_Debug_083C17F8[] = { + {gUnknown_Debug_083C175C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C176E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C177D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C178C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C179C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C17AE, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C17C2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C17D4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C17E3, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1840[] = _("SYSーENCーUPーITEM"); + +const u8 gUnknown_Debug_083C1850[] = _("SYSーENEーDOWNーITEM"); + +const u8 gUnknown_Debug_083C1862[] = _("SYSーKOKOROーEVENT"); + +const u8 gUnknown_Debug_083C1873[] = _("SYSーMOVEーPOKEーNEWS"); + +const u8 gUnknown_Debug_083C1886[] = _("SYSーASASEーITEM"); + +const u8 gUnknown_Debug_083C1895[] = _("SYSーBーDASH"); + +const u8 gUnknown_Debug_083C18A0[] = _("SYSーCTRLーOBJーDELETE"); + +const u8 gUnknown_Debug_083C18B4[] = _(""); + +const u8 gUnknown_Debug_083C18B5[] = _(""); + +const struct MenuAction gUnknown_Debug_083C18B8[] = { + {gUnknown_Debug_083C1840, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1850, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1862, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1873, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1886, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1895, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C18A0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C18B4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C18B5, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1900[] = _("SYSーARRIVEーSUBMARINECAVE"); + +const u8 gUnknown_Debug_083C1919[] = _("SYSーARRIVEーBATTLETOWER"); + +const u8 gUnknown_Debug_083C1930[] = _("SYSーARRIVEーISLAND"); + +const u8 gUnknown_Debug_083C1942[] = _("SYSーARRIVEーLEAGUE"); + +const u8 gUnknown_Debug_083C1954[] = _("SYSーARRIVEーSORANOHASHIRA"); + +const u8 gUnknown_Debug_083C196D[] = _(""); + +const u8 gUnknown_Debug_083C196E[] = _(""); + +const u8 gUnknown_Debug_083C196F[] = _(""); + +const u8 gUnknown_Debug_083C1970[] = _(""); + +const struct MenuAction gDebug_0x83C1974[] = { + {gUnknown_Debug_083C1900, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1919, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1930, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1942, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1954, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C196D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C196E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C196F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1970, TomomichiDebugMenu_Config} +}; + bool8 InitTomomichiDebugWindow(void) { debug_sub_808B874(); @@ -510,4 +972,24 @@ bool8 debug_sub_808BF3C(void) return FALSE; } +bool8 debug_sub_808BFC4(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0F79), gUnknown_Debug_083C0F79); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0F79), 0, 27); + gMenuCallback = debug_sub_808C064; + return FALSE; +} + +bool8 debug_sub_808C014(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 13); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0FFC), gUnknown_Debug_083C0FFC); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0FFC), 0, 27); + gMenuCallback = debug_sub_808C0A8; + return FALSE; +} + #endif -- cgit v1.2.3 From fdb38c53d73071b4264db1707011ec0ae807d4a5 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 16:31:26 -0500 Subject: through debug_sub_808C23C --- src/debug/tomomichi_debug_menu.c | 152 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index a5f7964a1..9db8898e2 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -2,6 +2,7 @@ #include "global.h" #include "constants/songs.h" #include "overworld.h" +#include "script.h" #include "menu.h" #include "start_menu.h" #include "main.h" @@ -97,6 +98,22 @@ bool8 debug_sub_808D1B4(void); bool8 debug_sub_808D20C(void); bool8 debug_sub_808D264(void); +extern const u8 DebugScript_081C1CFE[]; +extern const u8 DebugScript_081C1D07[]; +extern const u8 DebugScript_081C1D1E[]; +extern const u8 DebugScript_081C1D24[]; +extern const u8 DebugScript_081C1D2A[]; +extern const u8 DebugScript_081C1D35[]; +extern const u8 DebugScript_081C1D46[]; +extern const u8 DebugScript_081C221F[]; +extern const u8 DebugScript_081C23E2[]; +extern const u8 DebugScript_081C23E6[]; +extern const u8 DebugScript_081C23F6[]; +extern const u8 DebugScript_081C2482[]; +extern const u8 DebugScript_081C23FD[]; +extern const u8 DebugScript_081C2518[]; +extern const u8 DebugScript_081C2507[]; + const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); const u8 gUnknown_Debug_083C0C65[] = _("Art Mus. graphics"); const u8 gUnknown_Debug_083C0C77[] = _("Preview data"); @@ -992,4 +1009,139 @@ bool8 debug_sub_808C014(void) return FALSE; } +bool8 debug_sub_808C064(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C0F79[input].func; + return FALSE; +} + +bool8 debug_sub_808C0A8(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C0FFC[input].func; + return FALSE; +} + +bool8 debug_sub_808C0EC(void) +{ + ScriptContext1_SetupScript(DebugScript_081C1CFE); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C104(void) +{ + ScriptContext1_SetupScript(DebugScript_081C1D07); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C11C(void) +{ + ScriptContext1_SetupScript(DebugScript_081C1D1E); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C134(void) +{ + ScriptContext1_SetupScript(DebugScript_081C1D24); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C14C(void) +{ + ScriptContext1_SetupScript(DebugScript_081C1D2A); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C164(void) +{ + ScriptContext1_SetupScript(DebugScript_081C1D35); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C17C(void) +{ + ScriptContext1_SetupScript(DebugScript_081C1D46); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C194(void) +{ + ScriptContext1_SetupScript(DebugScript_081C221F); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C1AC(void) +{ + ScriptContext1_SetupScript(DebugScript_081C23E2); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C1C4(void) +{ + ScriptContext1_SetupScript(DebugScript_081C23E6); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C1DC(void) +{ + ScriptContext1_SetupScript(DebugScript_081C23F6); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C1F4(void) +{ + ScriptContext1_SetupScript(DebugScript_081C2482); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C20C(void) +{ + ScriptContext1_SetupScript(DebugScript_081C23FD); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C224(void) +{ + ScriptContext1_SetupScript(DebugScript_081C2518); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808C23C(void) +{ + ScriptContext1_SetupScript(DebugScript_081C2507); + CloseMenu(); + return TRUE; +} + #endif -- cgit v1.2.3 From efc82a067589a041219dbb933762878cee9b2ccd Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 20:57:33 -0500 Subject: through debug_sub_808C31C --- src/debug/tomomichi_debug_menu.c | 609 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 609 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 9db8898e2..3d3fe2ff8 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -1,11 +1,13 @@ #if DEBUG #include "global.h" +#include "palette.h" #include "constants/songs.h" #include "overworld.h" #include "script.h" #include "menu.h" #include "start_menu.h" #include "main.h" +#include "contest_painting.h" #include "sound.h" // These should be static, uninitialized once it gets decompiled. @@ -97,6 +99,32 @@ bool8 debug_sub_808D15C(void); bool8 debug_sub_808D1B4(void); bool8 debug_sub_808D20C(void); bool8 debug_sub_808D264(void); +bool8 debug_sub_808C280(void); +void debug_sub_808F168(u32 a0); +bool8 debug_sub_808C2E4(void); +bool8 debug_sub_808D8D8(void); +bool8 debug_sub_808CD08(void); +bool8 debug_sub_808CD60(void); +bool8 debug_sub_808CDB8(void); +bool8 debug_sub_808C85C(void); +bool8 debug_sub_808C8B4(void); +bool8 debug_sub_808C90C(void); +bool8 debug_sub_808C964(void); +bool8 debug_sub_808C9BC(void); +bool8 debug_sub_808CA14(void); +bool8 debug_sub_808CA6C(void); +bool8 debug_sub_808CAC4(void); +bool8 debug_sub_808CB1C(void); +bool8 debug_sub_808C3B0(void); +bool8 debug_sub_808C408(void); +bool8 debug_sub_808C460(void); +bool8 debug_sub_808C4B8(void); +bool8 debug_sub_808C510(void); +bool8 debug_sub_808C568(void); +bool8 debug_sub_808C5C0(void); +bool8 debug_sub_808C618(void); +bool8 debug_sub_808C670(void); +bool8 debug_sub_808C36C(void); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -658,6 +686,537 @@ const struct MenuAction gDebug_0x83C1974[] = { {gUnknown_Debug_083C1970, TomomichiDebugMenu_Config} }; +const u8 gUnknown_Debug_083C19BC[] = {0x08, 0x07, 0x09, 0x04, 0x09, 0x09, 0x09, 0x07, 0x05, 0x00}; + +const u16 gUnknown_Debug_083C19C6[] = {0x0807, 0x0808, 0x0809, 0x080a, 0x080b, 0x080c, 0x080d, 0x080e, 0x0000, + 0x080f, 0x0810, 0x0811, 0x0812, 0x0813, 0x0814, 0x0815, 0x0000, 0x0000, + 0x0816, 0x0817, 0x0818, 0x0819, 0x081a, 0x081b, 0x081c, 0x081d, 0x081e, + 0x0800, 0x0801, 0x0802, 0x083b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0804, 0x0805, 0x0806, 0x0828, 0x0829, 0x082a, 0x082b, 0x082c, 0x082d, + 0x0830, 0x0831, 0x0832, 0x0833, 0x0834, 0x0835, 0x0837, 0x0838, 0x0839, + 0x0836, 0x083a, 0x083b, 0x084b, 0x084c, 0x084f, 0x0850, 0x0851, 0x0852, + 0x084d, 0x084e, 0x0853, 0x085d, 0x085f, 0x0860, 0x0861, 0x0000, 0x0000, + 0x0847, 0x0848, 0x0849, 0x0854, 0x085e, 0x0000, 0x0000, 0x0000, 0x0000}; + +const u8 gDebug_0x83C1A68[] = _("FVーBALL パート1"); + +const struct MenuAction gUnknown_Debug_083C1A78[] = { + {gDebug_0x83C1A68, debug_sub_808D8D8} +}; + +const u8 gUnknown_Debug_083C1A80[] = _("FVーBALL1ー78"); +const u8 gUnknown_Debug_083C1A8C[] = _("FVーBALL1ー133"); + +const struct MenuAction gUnknown_Debug_083C1A9C[] = { + {gUnknown_Debug_083C1A80, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1A8C, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1AAC[] = {2, 0}; + +const u16 gUnknown_Debug_083C1AAE[] = {0x0436, 0x046d, 0, 0, 0, 0, 0, 0, 0}; + +const u8 gUnknown_Debug_083C1AC0[] = _("ジムリーダー"); +const u8 gUnknown_Debug_083C1AC7[] = _("してんのう"); +const u8 gUnknown_Debug_083C1ACD[] = _("みつる/Champロード"); + +const struct MenuAction gUnknown_Debug_083C1ADC[] = { + {gUnknown_Debug_083C1AC0, debug_sub_808CD08}, + {gUnknown_Debug_083C1AC7, debug_sub_808CD60}, + {gUnknown_Debug_083C1ACD, debug_sub_808CDB8} +}; + +const u8 gUnknown_Debug_083C1AF4[] = _("FTーGYMー01ーLEADER"); +const u8 gUnknown_Debug_083C1B05[] = _("FTーGYMー02ーLEADER"); +const u8 gUnknown_Debug_083C1B16[] = _("FTーGYMー03ーLEADER"); +const u8 gUnknown_Debug_083C1B27[] = _("FTーGYMー04ーLEADER"); +const u8 gUnknown_Debug_083C1B38[] = _("FTーGYMー05ーLEADER"); +const u8 gUnknown_Debug_083C1B49[] = _("FTーGYMー06ーLEADER"); +const u8 gUnknown_Debug_083C1B5A[] = _("FTーGYMー07ーLEADER"); +const u8 gUnknown_Debug_083C1B6B[] = _("FTーGYMー08ーLEADER"); + +const struct MenuAction gUnknown_Debug_083C1B7C[] = { + {gUnknown_Debug_083C1AF4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1B05, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1B16, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1B27, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1B38, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1B49, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1B5A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1B6B, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1BBC[] = _("FTーSHITENー01"); +const u8 gUnknown_Debug_083C1BC9[] = _("FTーSHITENー02"); +const u8 gUnknown_Debug_083C1BD6[] = _("FTーSHITENー03"); +const u8 gUnknown_Debug_083C1BE3[] = _("FTーSHITENー04"); + +const struct MenuAction gUnknown_Debug_083C1BF0[] = { + {gUnknown_Debug_083C1BBC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1BC9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1BD6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1BE3, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1C10[] = _("FTーMITSURUー01ーCAVEーD1301"); + +const struct MenuAction gUnknown_Debug_083C1C2C[] = { + {gUnknown_Debug_083C1C10, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1C34[] = {0x08, 0x04, 0x01, 0x00}; +const u16 gUnknown_Debug_083C1C38[] = {0x04B1, 0x04B4, 0x04B8, 0x04BD, 0x04C1, 0x04C9, 0x04CD, 0x04D4, 0x0000, 0x04DD, 0x04DE, 0x04DF, 0x04E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}; + +const u8 gUnknown_Debug_083C1C6E[] = _("120/119ばんどうろカクレオン"); +const u8 gUnknown_Debug_083C1C80[] = _("そのた1 / SUPPORTM/W"); +const u8 gUnknown_Debug_083C1C92[] = _("ODAMAKI/FIGHTER1"); +const u8 gUnknown_Debug_083C1CA3[] = _("MITSURU/TENKI"); +const u8 gUnknown_Debug_083C1CB1[] = _("そのた2 /DAIGO"); +const u8 gUnknown_Debug_083C1CBD[] = _("POKE/POKEMON"); +const u8 gUnknown_Debug_083C1CCA[] = _("MAMA/SUPPORT02"); +const u8 gUnknown_Debug_083C1CD9[] = _("HAGI"); +const u8 gUnknown_Debug_083C1CDE[] = _("SUPPORT01"); + +const struct MenuAction gUnknown_Debug_083C1CE8[] = { + {gUnknown_Debug_083C1C6E, debug_sub_808C85C}, + {gUnknown_Debug_083C1C80, debug_sub_808C8B4}, + {gUnknown_Debug_083C1C92, debug_sub_808C90C}, + {gUnknown_Debug_083C1CA3, debug_sub_808C964}, + {gUnknown_Debug_083C1CB1, debug_sub_808C9BC}, + {gUnknown_Debug_083C1CBD, debug_sub_808CA14}, + {gUnknown_Debug_083C1CCA, debug_sub_808CA6C}, + {gUnknown_Debug_083C1CD9, debug_sub_808CAC4}, + {gUnknown_Debug_083C1CDE, debug_sub_808CB1C} +}; + +const u8 gUnknown_Debug_083C1D30[] = _("FVーKAKUREONBー01ーFIELDーR120"); +const u8 gUnknown_Debug_083C1D4B[] = _("FVーKAKUREー01ーFIELDーR120"); +const u8 gUnknown_Debug_083C1D63[] = _("FVーKAKUREー02ーFIELDーR120"); +const u8 gUnknown_Debug_083C1D7B[] = _("FVーKAKUREー03ーFIELDーR120"); +const u8 gUnknown_Debug_083C1D93[] = _("FVーKAKUREー04ーFIELDーR120"); +const u8 gUnknown_Debug_083C1DAB[] = _("FVーKAKUREー05ーFIELDーR120"); +const u8 gUnknown_Debug_083C1DC3[] = _("FVーKAKUREー06ーFIELDーR120"); +const u8 gUnknown_Debug_083C1DDB[] = _("FVーKAKUREー01ーFIELDーR119"); +const u8 gUnknown_Debug_083C1DF3[] = _("FVーKAKUREー02ーFIELDーR119"); + +const struct MenuAction gUnknown_Debug_083C1E0C[] = { + {gUnknown_Debug_083C1D30, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1D4B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1D63, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1D7B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1D93, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1DAB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1DC3, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1DDB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1DF3, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1E54[] = _("FVーBALLー01ーC107ーR0501"); +const u8 gUnknown_Debug_083C1E6A[] = _("FVーWORKERM1ー04ーFIELDーC104"); +const u8 gUnknown_Debug_083C1E84[] = _("FVーSUBMARINEー06ーCAVEーD1101"); +const u8 gUnknown_Debug_083C1E9F[] = _("FVーGUESTーALLーC106ーR0102"); +const u8 gUnknown_Debug_083C1EB7[] = _("FVーHORIDASIー01ーC106ーR1106"); +const u8 gUnknown_Debug_083C1ED1[] = _("FVーMIDDLEM1ー01ーR110ーR0101"); +const u8 gUnknown_Debug_083C1EEB[] = _("FVーFUNEー01ーC102ーR0601"); +const u8 gUnknown_Debug_083C1F01[] = _("FVーSUPPORTWー01ーT101ーR0202"); +const u8 gUnknown_Debug_083C1F1B[] = _("FVーSUPPORTMー01ーT101ーR0102"); + +const struct MenuAction gUnknown_Debug_083C1F38[] = { + {gUnknown_Debug_083C1E54, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1E6A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1E84, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1E9F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1EB7, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1ED1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1EEB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1F01, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1F1B, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C1F80[] = _("FVーODAMAKIー01ーFIELDーR101"); +const u8 gUnknown_Debug_083C1F99[] = _("FVーODAMAKIー01ーT101ーR0301"); +const u8 gUnknown_Debug_083C1FB2[] = _("FVーODAMAKIーHYOKAーT101ーR0301"); +const u8 gUnknown_Debug_083C1FCE[] = _("FVーODAMAKIーHYOKAーFIELDーR101"); +const u8 gUnknown_Debug_083C1FEA[] = _("FVーODAMAKIーHYOKAーFIELDーR103"); +const u8 gUnknown_Debug_083C2006[] = _("FVーODAMAKIー01ーC109ーR0105"); +const u8 gUnknown_Debug_083C201F[] = _("FVーFIGHTERー01ーCAVEーD0201"); +const u8 gUnknown_Debug_083C2038[] = _("FVーFIGHTERー01ーT106ーR0201"); +const u8 gUnknown_Debug_083C2051[] = _("FVーFIGHTERー01ーFIELDーR116"); + +const struct MenuAction gUnknown_Debug_083C206C[] = { + {gUnknown_Debug_083C1F80, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1F99, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1FB2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1FCE, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C1FEA, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2006, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C201F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2038, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2051, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C20B4[] = _("FVーMITSURUー01ーFIELDーC101"); +const u8 gUnknown_Debug_083C20CD[] = _("FVーMITSURUー02ーCAVEーD1301"); +const u8 gUnknown_Debug_083C20E6[] = _("FVーMITSURUー01ーFIELDーC103"); +const u8 gUnknown_Debug_083C20FF[] = _("FVーMITSURUー01ーT106ーR0201"); +const u8 gUnknown_Debug_083C2118[] = _("FVーMITSURUー01ーCAVEーD1301"); +const u8 gUnknown_Debug_083C2131[] = _("FVーMITSURUー01ーC101ーR0201"); +const u8 gUnknown_Debug_083C214A[] = _("FVーMITSURUー01ーFIELDーR102"); +const u8 gUnknown_Debug_083C2163[] = _("FVーTENKIー01ーR119ーR101"); +const u8 gUnknown_Debug_083C2179[] = _("FVーTENKIー01ーR119ーR102"); + +const struct MenuAction gUnknown_Debug_083C2190[] = { + {gUnknown_Debug_083C20B4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C20CD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C20E6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C20FF, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2118, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2131, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C214A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2163, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2179, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C21D8[] = _("FVーDAIGOー01ーCAVEーD0504"); +const u8 gUnknown_Debug_083C21EF[] = _("FVーDAIGOー01ーFIELDーR128"); +const u8 gUnknown_Debug_083C2206[] = _("FVーDAIGOー01ーFIELDーR118"); +const u8 gUnknown_Debug_083C221D[] = _("FVーDAIGOー01ーC107ーR0501"); +const u8 gUnknown_Debug_083C2234[] = _("FVーDAIGOー01ーFIELDーR120"); +const u8 gUnknown_Debug_083C224B[] = _("FVーDAIGOー01ーFIELDーR108"); + +const struct MenuAction gUnknown_Debug_083C2264[] = { + {gUnknown_Debug_083C21D8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C21EF, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2206, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C221D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2234, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C224B, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C2294[] = _("FVーPOKE1ー02ーCAVEーD1111"); +const u8 gUnknown_Debug_083C22AB[] = _("FVーPOKE1ー01ーCAVEーD0601"); +const u8 gUnknown_Debug_083C22C2[] = _("FVーPOKE1ー02ーCAVEーD0601"); +const u8 gUnknown_Debug_083C22D9[] = _("FVーPOKE1ー01ーFIELDーR101"); +const u8 gUnknown_Debug_083C22F0[] = _("FVーPOKE1ー01ーOPENINGーROOM01"); +const u8 gUnknown_Debug_083C230B[] = _("FVーPOKE1ー02ーOPENINGーROOM01"); +const u8 gUnknown_Debug_083C2326[] = _("FVーPOKE1ー01ーCAVEーD2308"); +const u8 gUnknown_Debug_083C233D[] = _("FVーPOKEMONー01ーCAVEーD0201"); +const u8 gUnknown_Debug_083C2356[] = _("FVーPOKEMONー01ーR104ーR0101"); + +const struct MenuAction gUnknown_Debug_083C2370[] = { + {gUnknown_Debug_083C2294, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C22AB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C22C2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C22D9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C22F0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C230B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2326, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C233D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2356, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C23B8[] = _("FVーMAMAー01ーFIELDーT101"); +const u8 gUnknown_Debug_083C23CE[] = _("FVーMAMAー01ーOPENINGーROOM02"); +const u8 gUnknown_Debug_083C23E8[] = _("FVーMAMAー01ーT101ーR0101"); +const u8 gUnknown_Debug_083C23FE[] = _("FVーMAMAー01ーT101ーR0201"); +const u8 gUnknown_Debug_083C2414[] = _("FVーMAMAー02ーT101ーR0101"); +const u8 gUnknown_Debug_083C242A[] = _("FVーMAMAー02ーT101ーR0201"); +const u8 gUnknown_Debug_083C2440[] = _("FVーSUPPORTー02ーFIELDーR110"); +const u8 gUnknown_Debug_083C2459[] = _("FVーSUPPORTー02ーFIELDーR119"); +const u8 gUnknown_Debug_083C2472[] = _("FVーSUPPORTー02ーFIELDーT104"); + +const struct MenuAction gUnknown_Debug_083C248C[] = { + {gUnknown_Debug_083C23B8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C23CE, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C23E8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C23FE, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2414, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C242A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2440, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2459, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2472, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C24D4[] = _("FVーHAGIー01ーFIELDーR104"); +const u8 gUnknown_Debug_083C24EA[] = _("FVーHAGIー01ーR104ーR0101"); +const u8 gUnknown_Debug_083C2500[] = _("FVーHAGIー01ーFIELDーT103"); +const u8 gUnknown_Debug_083C2516[] = _("FVーHAGIー01ーFIELDーR109"); +const u8 gUnknown_Debug_083C252C[] = _("FVーHAGIー01ーC102ーR0601"); +const u8 gUnknown_Debug_083C2542[] = _("FVーHAGIー01ーC102ーR0101"); +const u8 gUnknown_Debug_083C2558[] = _("FVーHAGIー01ーCAVEーD0201"); +const u8 gUnknown_Debug_083C256E[] = _("FVーHAGIー01ーFIELDーR116"); +const u8 gUnknown_Debug_083C2584[] = _("FVーHAGIー01ーSPーSHIP01"); + +const struct MenuAction gUnknown_Debug_083C259C[] = { + {gUnknown_Debug_083C24D4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C24EA, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2500, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2516, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C252C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2542, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2558, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C256E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2584, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C25E4[] = _("FVーSUPPORTー01ーT101ーR0301"); +const u8 gUnknown_Debug_083C25FD[] = _("FVーSUPPORTー01ーC109ーR0105"); +const u8 gUnknown_Debug_083C2616[] = _("FVーSUPPORTー01ーFIELDーC104"); +const u8 gUnknown_Debug_083C262F[] = _("FVーSUPPORTー01ーFIELDーC106"); +const u8 gUnknown_Debug_083C2648[] = _("FVーSUPPORTー01ーFIELDーR103"); +const u8 gUnknown_Debug_083C2661[] = _("FVーSUPPORTー01ーFIELDーR110"); +const u8 gUnknown_Debug_083C267A[] = _("FVーSUPPORTー01ーFIELDーR119"); +const u8 gUnknown_Debug_083C2693[] = _("FVーSUPPORTー01ーFIELDーT104"); +const u8 gUnknown_Debug_083C26AC[] = _("FVーSUPPORTー01ーFIELDーT102"); + +const struct MenuAction gUnknown_Debug_083C26C8[] = { + {gUnknown_Debug_083C25E4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C25FD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2616, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C262F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2648, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2661, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C267A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2693, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C26AC, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C2710[] = {9, 9, 9, 9, 6, 9, 9, 9, 9, 0}; + +const u16 gUnknown_Debug_083C271A[] = { + 0x03d5, 0x03ca, 0x03d6, 0x03d9, 0x03da, 0x03db, 0x03dc, + 0x03dd, 0x03de, 0x03c8, 0x02dc, 0x03d4, 0x039d, 0x03c2, + 0x0368, 0x0352, 0x02d2, 0x02f8, 0x02d0, 0x02d1, 0x0380, + 0x0381, 0x0382, 0x0399, 0x0327, 0x0328, 0x037e, 0x02d6, + 0x02ef, 0x0324, 0x0326, 0x035a, 0x0362, 0x0363, 0x037c, + 0x037d, 0x0341, 0x0342, 0x03c6, 0x03c7, 0x03cc, 0x03cd, + 0x0000, 0x0000, 0x0000, 0x02dd, 0x02e1, 0x02ec, 0x02ee, + 0x02f2, 0x02f3, 0x0305, 0x0370, 0x0371, 0x02f0, 0x02f5, + 0x02f6, 0x02f7, 0x030e, 0x030f, 0x039a, 0x039b, 0x03a2, + 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x034f, 0x0365, 0x036f, + 0x037b, 0x03b6, 0x0379, 0x0398, 0x032e, 0x03cb, 0x02d3, + 0x0397, 0x0353, 0x03a1, 0x03d3}; + +const u8 gUnknown_Debug_083C27BC[] = _("FEひでんわざ/デボンかんれん"); +const u8 gUnknown_Debug_083C27CC[] = _("FEだいじなアイテムPART1"); +const u8 gUnknown_Debug_083C27DC[] = _("そのた1"); +const u8 gUnknown_Debug_083C27E1[] = _("MITSURU/DOOR"); +const u8 gUnknown_Debug_083C27EE[] = _("カラクリやしき10のやじるし/GYM07"); +const u8 gUnknown_Debug_083C2803[] = _("SUPPORT/そのた4"); +const u8 gUnknown_Debug_083C2810[] = _("DAISUKI/そのた5"); +const u8 gUnknown_Debug_083C281D[] = _("そのた2"); +const u8 gUnknown_Debug_083C2822[] = _("そのた6"); + +const struct MenuAction gUnknown_Debug_083C2828[] = { + {gUnknown_Debug_083C27BC, debug_sub_808C3B0}, + {gUnknown_Debug_083C27CC, debug_sub_808C408}, + {gUnknown_Debug_083C27DC, debug_sub_808C460}, + {gUnknown_Debug_083C27E1, debug_sub_808C4B8}, + {gUnknown_Debug_083C27EE, debug_sub_808C510}, + {gUnknown_Debug_083C2803, debug_sub_808C568}, + {gUnknown_Debug_083C2810, debug_sub_808C5C0}, + {gUnknown_Debug_083C281D, debug_sub_808C618}, + {gUnknown_Debug_083C2822, debug_sub_808C670} +}; + +const u8 gUnknown_Debug_083C2870[] = _("FEーHWAZA01ーGET"); +const u8 gUnknown_Debug_083C287F[] = _("FEーHWAZA02ー01ーFIELDR119"); +const u8 gUnknown_Debug_083C2897[] = _("FEーHWAZA03ーGET"); +const u8 gUnknown_Debug_083C28A6[] = _("FEーHWAZA04ー01ーT106ーR0201"); +const u8 gUnknown_Debug_083C28BF[] = _("FEーHWAZA05ー01ーCAVEーD0502"); +const u8 gUnknown_Debug_083C28D8[] = _("FEーHWAZA04ー01ーC103ーR0301"); +const u8 gUnknown_Debug_083C28F1[] = _("FEーDEBONーNIMOTSUーRETURN"); +const u8 gUnknown_Debug_083C2909[] = _("FEーDEBONー01ーFIELDーC104"); +const u8 gUnknown_Debug_083C2920[] = _("FEーDEBONー02ーFIELDーC104"); + +const struct MenuAction gUnknown_Debug_083C2938[] = { + {gUnknown_Debug_083C2870, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C287F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2897, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C28A6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C28BF, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C28D8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C28F1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2909, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2920, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C2980[] = _("FEーCYCLEー01ーP01ーP01ーC103ーR0201"); +const u8 gUnknown_Debug_083C299F[] = _("FEーSCOOPー01ーP01ーFIELDーR115"); +const u8 gUnknown_Debug_083C29BA[] = _("FEーROPEー01ーP01ーFIELDーR114"); +const u8 gUnknown_Debug_083C29D4[] = _("FEーKAMAー01ーP01ーFIELDーR119"); +const u8 gUnknown_Debug_083C29EE[] = _("FEーZYOUROーGET"); +const u8 gUnknown_Debug_083C29FC[] = _("FEーCUBECASEーGET"); +const u8 gUnknown_Debug_083C2A0C[] = _("FEーBORONOTURIZAOーGET"); +const u8 gUnknown_Debug_083C2A21[] = _("FEーIITURIZAOーGET"); +const u8 gUnknown_Debug_083C2A32[] = _("FEーSUGOITURIZAOーGET"); + +const struct MenuAction gUnknown_Debug_083C2A48[] = { + {gUnknown_Debug_083C2980, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C299F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C29BA, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C29D4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C29EE, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C29FC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2A0C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2A21, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2A32, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C2A90[] = _("FEーBOSSー01ーCAVEーD0701"); +const u8 gUnknown_Debug_083C2AA6[] = _("FEーTANTIKIーRETURN"); +const u8 gUnknown_Debug_083C2AB8[] = _("FEーPOKE1ー01ーCAVEーD1111"); +const u8 gUnknown_Debug_083C2ACF[] = _("FEーPOKE1ー01ーCAVEーD1206"); +const u8 gUnknown_Debug_083C2AE6[] = _("FEーSHOPー01ーC104ーFS01"); +const u8 gUnknown_Debug_083C2AFB[] = _("FEーHUNENOTIKETTーGET"); +const u8 gUnknown_Debug_083C2B0F[] = _("FEーKAKUREー01ーFIELDーC105"); +const u8 gUnknown_Debug_083C2B27[] = _("FEーKASEKIーRETURN"); +const u8 gUnknown_Debug_083C2B38[] = _("FEーWINー01ーSPーSHIP01"); + +const struct MenuAction gUnknown_Debug_083C2B4C[] = { + {gUnknown_Debug_083C2A90, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2AA6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2AB8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2ACF, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2AE6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2AFB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2B0F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2B27, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2B38, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C2B94[] = _("FEーMITSURUー01ーT106ーR0201"); +const u8 gUnknown_Debug_083C2BAD[] = _("FEーMITSURUー01ーCAVEーD1301"); +const u8 gUnknown_Debug_083C2BC6[] = _("FEーMITSURUー02ーFIELDーC103"); +const u8 gUnknown_Debug_083C2BDF[] = _("FEーMITSURUー02ーT106ーR0201"); +const u8 gUnknown_Debug_083C2BF8[] = _("FEーMITSURUー01ーFIELDーC103"); +const u8 gUnknown_Debug_083C2C11[] = _("FEーDOORーOPENー01ーCAVEーD1712"); +const u8 gUnknown_Debug_083C2C2C[] = _("FEーDOORーOPENー02ーCAVEーD1712"); +const u8 gUnknown_Debug_083C2C47[] = _("FEーDOORーOPENー04ーCAVEーD1712"); +const u8 gUnknown_Debug_083C2C62[] = _("FEーDOORーOPENー06ーCAVEーD1712"); + +const struct MenuAction gUnknown_Debug_083C2C80[] = { + {gUnknown_Debug_083C2B94, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2BAD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2BC6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2BDF, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2BF8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2C11, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2C2C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2C47, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2C62, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C2CC8[] = _("FEーKARAKURI10ーSWITCHー01"); +const u8 gUnknown_Debug_083C2CE0[] = _("FEーKARAKURI10ーSWITCHー02"); +const u8 gUnknown_Debug_083C2CF8[] = _("FEーKARAKURI10ーSWITCHー03"); +const u8 gUnknown_Debug_083C2D10[] = _("FEーKARAKURI10ーSWITCHー04"); +const u8 gUnknown_Debug_083C2D28[] = _("FEーKARAKURI10ーSWITCHー05"); +const u8 gUnknown_Debug_083C2D40[] = _("FEーGYM07ーSWITCHー01"); +const u8 gUnknown_Debug_083C2D53[] = _("FEーGYM07ーSWITCHー02"); +const u8 gUnknown_Debug_083C2D66[] = _("FEーGYM07ーSWITCHー03"); +const u8 gUnknown_Debug_083C2D79[] = _("FEーGYM07ーSWITCHー04"); + +const struct MenuAction gUnknown_Debug_083C2D8C[] = { + {gUnknown_Debug_083C2CC8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2CE0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2CF8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2D10, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2D28, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2D40, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2D53, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2D66, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2D79, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C2DD4[] = _("FEーSUPPORTー01ーFIELDーR103"); +const u8 gUnknown_Debug_083C2DED[] = _("FEーSUPPORTー01ーFIELDーC106"); +const u8 gUnknown_Debug_083C2E06[] = _("FEーSUPPORTー01ーFIELDーR104"); +const u8 gUnknown_Debug_083C2E1F[] = _("FEーSUPPORTー02ーFIELDーC106"); +const u8 gUnknown_Debug_083C2E38[] = _("FEーSUPPORTー01ーT101ーR0202"); +const u8 gUnknown_Debug_083C2E51[] = _("FEーMAMAー01ーP01ーT101ーR0101"); +const u8 gUnknown_Debug_083C2E6B[] = _("FEーCLOCKーSET"); +const u8 gUnknown_Debug_083C2E78[] = _("FEーODAMAKIー01ーP01ーT101ーR03"); +const u8 gUnknown_Debug_083C2E93[] = _("FEーPAPAー01ーP01ーC101ーR0201"); + +const struct MenuAction gUnknown_Debug_083C2EB0[] = { + {gUnknown_Debug_083C2DD4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2DED, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2E06, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2E1F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2E38, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2E51, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2E6B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2E78, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2E93, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C2EF8[] = _("FEーDAISUKIーGOODSーFLAG01"); +const u8 gUnknown_Debug_083C2F10[] = _("FEーDAISUKIーGOODSーFLAG02"); +const u8 gUnknown_Debug_083C2F28[] = _("FEーDAISUKIーGOODSーFLAG03"); +const u8 gUnknown_Debug_083C2F40[] = _("FEーDAISUKIーGOODSーFLAG04"); +const u8 gUnknown_Debug_083C2F58[] = _("FEーDAISUKIーGOODSーFLAG05"); +const u8 gUnknown_Debug_083C2F70[] = _("FEーBASHAー01ーP01ーFIELDーC101ー"); +const u8 gUnknown_Debug_083C2F8C[] = _("FEーBASHAー01ーP02ーFIELDーC101ー"); +const u8 gUnknown_Debug_083C2FA8[] = _("FEーBALLー01ーP01ーSPーCONTEST"); +const u8 gUnknown_Debug_083C2FC2[] = _("FEーWOMAN2ー01ーP01ーT101ーR0201"); + +const struct MenuAction gUnknown_Debug_083C2FE0[] = { + {gUnknown_Debug_083C2EF8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2F10, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2F28, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2F40, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2F58, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2F70, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2F8C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2FA8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C2FC2, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C3028[] = _("FEーSOUKOーOPENーCAVEーD1704"); +const u8 gUnknown_Debug_083C3041[] = _("FEーSORAISIー01ーCAVEーD0101"); +const u8 gUnknown_Debug_083C305A[] = _("FEーMAYUMIー01ーーR114ーR0201"); +const u8 gUnknown_Debug_083C3073[] = _("FEーKUSUNOKIー01ーC102ーR0601"); +const u8 gUnknown_Debug_083C308D[] = _("FEーOLDWOMAN1ー01ーCAVEーD0808"); +const u8 gUnknown_Debug_083C30A8[] = _("FEーTRAINERM1ー01ーC109ーR0206"); +const u8 gUnknown_Debug_083C30C3[] = _("FEーSOONANOーTAMAGOーGET"); +const u8 gUnknown_Debug_083C30D9[] = _("FEーDASHーSHOESーGET"); +const u8 gUnknown_Debug_083C30EB[] = _("FEーDEBONSUKOOPUーGET"); + +const struct MenuAction gUnknown_Debug_083C3100[] = { + {gUnknown_Debug_083C3028, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3041, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C305A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3073, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C308D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C30A8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C30C3, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C30D9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C30EB, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C3148[] = _("FEーSTUDYM1ー01ーP01ーT101R0301"); +const u8 gUnknown_Debug_083C3164[] = _("FEーWORKERM1ー01ーC103ーR0201"); +const u8 gUnknown_Debug_083C317E[] = _("FEーHIMITSUーGET"); +const u8 gUnknown_Debug_083C318D[] = _(""); +const u8 gUnknown_Debug_083C318E[] = _(""); +const u8 gUnknown_Debug_083C318F[] = _(""); +const u8 gUnknown_Debug_083C3190[] = _(""); +const u8 gUnknown_Debug_083C3191[] = _(""); +const u8 gUnknown_Debug_083C3192[] = _(""); + +const struct MenuAction gUnknown_Debug_083C3194[] = { + {gUnknown_Debug_083C3148, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3164, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C317E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C318D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C318E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C318F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3190, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3191, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3192, TomomichiDebugMenu_Config} +}; + bool8 InitTomomichiDebugWindow(void) { debug_sub_808B874(); @@ -1144,4 +1703,54 @@ bool8 debug_sub_808C23C(void) return TRUE; } +bool8 TomomichiDebugMenu_ContestGraphics_Show(void) +{ + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gMenuCallback = debug_sub_808C280; + return FALSE; +} + +bool8 debug_sub_808C280(void) +{ + if (!UpdatePaletteFade()) + { + CloseMenu(); + debug_sub_808F168(0); + SetMainCallback2(CB2_ContestPainting); + gMain.savedCallback = debug_sub_808B868; + return TRUE; + } + return FALSE; +} + +bool8 TomomichiDebugMenu_MuseumGraphics_Show(void) +{ + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gMenuCallback = debug_sub_808C2E4; + return FALSE; +} + +bool8 debug_sub_808C2E4(void) +{ + if (!UpdatePaletteFade()) + { + CloseMenu(); + debug_sub_808F168(1); + SetMainCallback2(CB2_ContestPainting); + gMain.savedCallback = debug_sub_808B868; + return TRUE; + } + return FALSE; +} + +bool8 debug_sub_808C31C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2828), gUnknown_Debug_083C2828); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2828), 0, 27); + gMenuCallback = debug_sub_808C36C; + return FALSE; +} + #endif -- cgit v1.2.3 From 937451db9d86f60bb87bbeb1a19f27354bf9d8f0 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Mar 2018 21:25:13 -0500 Subject: through debug_sub_808C4B8 --- src/debug/tomomichi_debug_menu.c | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 3d3fe2ff8..89885070a 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -125,6 +125,7 @@ bool8 debug_sub_808C5C0(void); bool8 debug_sub_808C618(void); bool8 debug_sub_808C670(void); bool8 debug_sub_808C36C(void); +bool8 debug_sub_808C6C8(void); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -1753,4 +1754,63 @@ bool8 debug_sub_808C31C(void) return FALSE; } +bool8 debug_sub_808C36C(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C2828[input].func; + return FALSE; +} + +bool8 debug_sub_808C3B0(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2938), gUnknown_Debug_083C2938); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2938), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + +bool8 debug_sub_808C408(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2A48), gUnknown_Debug_083C2A48); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2A48), 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + +bool8 debug_sub_808C460(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2B4C), gUnknown_Debug_083C2B4C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2B4C), 0, 28); + gDebug_0300070F = 2; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + +bool8 debug_sub_808C4B8(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2C80), gUnknown_Debug_083C2C80); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2C80), 0, 28); + gDebug_0300070F = 3; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + #endif -- cgit v1.2.3 From 0e0651c0283bf1d11d9984acaea878cb409c4e6a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Mar 2018 18:30:26 -0400 Subject: through debug_sub_808C764 --- src/debug/tomomichi_debug_menu.c | 112 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 89885070a..f2d8d8096 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -1,6 +1,7 @@ #if DEBUG #include "global.h" #include "palette.h" +#include "event_data.h" #include "constants/songs.h" #include "overworld.h" #include "script.h" @@ -126,6 +127,9 @@ bool8 debug_sub_808C618(void); bool8 debug_sub_808C670(void); bool8 debug_sub_808C36C(void); bool8 debug_sub_808C6C8(void); +void debug_sub_808C714(u8, u8); +void debug_sub_808C764(u8); +void debug_sub_808F2E0(u8, u8, bool8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -1218,6 +1222,20 @@ const struct MenuAction gUnknown_Debug_083C3194[] = { {gUnknown_Debug_083C3192, TomomichiDebugMenu_Config} }; +const u8 gUnknown_Debug_083C31DC[] = {9, 9, 9, 9, 9, 9, 9, 9, 3, 0}; + +const u16 gUnknown_Debug_83C31E6[][9] = { + {0x89, 0x6E, 0x7A, 0x6A, 0x6D, 0x6B, 0x90, 0x8E, 0x8F}, + {0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x101, 0xE3, 0x98}, + {0x8B, 0x126, 0x81, 0x71, 0x100, 0x123, 0x127, 0x10B, 0xF7}, + {0x6C, 0x7E, 0xBE, 0xC1, 0x11C, 0xF0, 0xF1, 0xF2, 0xF3}, + {0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0x64, 0x65, 0x66, 0x67}, + {0x82, 0x11E, 0x120, 0x124, 0x125, 0x50, 0x51, 0x52, 0x55}, + {0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0x53, 0x54, 0x56, 0x57}, + {0xEF, 0xF4, 0x83, 0x10F, 0x103, 0x107, 0x10A, 0x112, 0x11D}, + {0x58, 0x59, 0x60, 0, 0, 0, 0, 0, 0} +}; + bool8 InitTomomichiDebugWindow(void) { debug_sub_808B874(); @@ -1813,4 +1831,98 @@ bool8 debug_sub_808C4B8(void) return FALSE; } +bool8 debug_sub_808C510(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2D8C), gUnknown_Debug_083C2D8C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2D8C), 0, 28); + gDebug_0300070F = 4; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + +bool8 debug_sub_808C568(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2EB0), gUnknown_Debug_083C2EB0); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2EB0), 0, 28); + gDebug_0300070F = 5; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + +bool8 debug_sub_808C5C0(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2FE0), gUnknown_Debug_083C2FE0); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2FE0), 0, 28); + gDebug_0300070F = 6; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + +bool8 debug_sub_808C618(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3100), gUnknown_Debug_083C3100); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3100), 0, 28); + gDebug_0300070F = 7; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + +bool8 debug_sub_808C670(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 7); + Menu_PrintItems(2, 1, 3, gUnknown_Debug_083C3194); + InitMenu(0, 1, 1, 3, 0, 28); + gDebug_0300070F = 8; + gMenuCallback = debug_sub_808C6C8; + return FALSE; +} + +bool8 debug_sub_808C6C8(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808C714(gDebug_0300070F, cursorPos); + debug_sub_808C764(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808C714(u8 whichMenu, u8 cursorPos) +{ + if (gMain.newKeys & R_BUTTON) + { + u16 flag = gUnknown_Debug_83C31E6[whichMenu][cursorPos]; + if (!FlagGet(flag)) + FlagSet(flag); + else + FlagClear(flag); + } +} + +void debug_sub_808C764(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C31DC[whichMenu]; i++) + { + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_83C31E6[whichMenu][i]) ? TRUE : FALSE); + } +} + #endif -- cgit v1.2.3 From a856e2171f7dc246eb02a6e891cdbe43811a5fd9 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Mar 2018 18:45:16 -0400 Subject: through debug_sub_808CB1C --- src/debug/tomomichi_debug_menu.c | 144 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 135 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index f2d8d8096..de4a75f90 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -130,6 +130,8 @@ bool8 debug_sub_808C6C8(void); void debug_sub_808C714(u8, u8); void debug_sub_808C764(u8); void debug_sub_808F2E0(u8, u8, bool8); +bool8 debug_sub_808C818(void); +bool8 debug_sub_808CB74(void); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -1790,7 +1792,7 @@ bool8 debug_sub_808C36C(void) bool8 debug_sub_808C3B0(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2938) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2938), gUnknown_Debug_083C2938); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2938), 0, 28); gDebug_0300070F = 0; @@ -1801,7 +1803,7 @@ bool8 debug_sub_808C3B0(void) bool8 debug_sub_808C408(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2A48) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2A48), gUnknown_Debug_083C2A48); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2A48), 0, 28); gDebug_0300070F = 1; @@ -1812,7 +1814,7 @@ bool8 debug_sub_808C408(void) bool8 debug_sub_808C460(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2B4C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2B4C), gUnknown_Debug_083C2B4C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2B4C), 0, 28); gDebug_0300070F = 2; @@ -1823,7 +1825,7 @@ bool8 debug_sub_808C460(void) bool8 debug_sub_808C4B8(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2C80) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2C80), gUnknown_Debug_083C2C80); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2C80), 0, 28); gDebug_0300070F = 3; @@ -1834,7 +1836,7 @@ bool8 debug_sub_808C4B8(void) bool8 debug_sub_808C510(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2D8C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2D8C), gUnknown_Debug_083C2D8C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2D8C), 0, 28); gDebug_0300070F = 4; @@ -1845,7 +1847,7 @@ bool8 debug_sub_808C510(void) bool8 debug_sub_808C568(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2EB0) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2EB0), gUnknown_Debug_083C2EB0); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2EB0), 0, 28); gDebug_0300070F = 5; @@ -1856,7 +1858,7 @@ bool8 debug_sub_808C568(void) bool8 debug_sub_808C5C0(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2FE0) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2FE0), gUnknown_Debug_083C2FE0); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2FE0), 0, 28); gDebug_0300070F = 6; @@ -1867,7 +1869,7 @@ bool8 debug_sub_808C5C0(void) bool8 debug_sub_808C618(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 19); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C3100) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3100), gUnknown_Debug_083C3100); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3100), 0, 28); gDebug_0300070F = 7; @@ -1878,7 +1880,7 @@ bool8 debug_sub_808C618(void) bool8 debug_sub_808C670(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 7); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 3 + 1); Menu_PrintItems(2, 1, 3, gUnknown_Debug_083C3194); InitMenu(0, 1, 1, 3, 0, 28); gDebug_0300070F = 8; @@ -1925,4 +1927,128 @@ void debug_sub_808C764(u8 whichMenu) } } +bool8 debug_sub_808C7C8(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 19); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1CE8), gUnknown_Debug_083C1CE8); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1CE8), 0, 27); + gMenuCallback = debug_sub_808C818; + return FALSE; +} + +bool8 debug_sub_808C818(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C1CE8[input].func; + return FALSE; +} + +bool8 debug_sub_808C85C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1E0C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1E0C), gUnknown_Debug_083C1E0C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1E0C), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + +bool8 debug_sub_808C8B4(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1F38) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1F38), gUnknown_Debug_083C1F38); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1F38), 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + +bool8 debug_sub_808C90C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C206C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C206C), gUnknown_Debug_083C206C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C206C), 0, 28); + gDebug_0300070F = 2; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + +bool8 debug_sub_808C964(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2190) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2190), gUnknown_Debug_083C2190); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2190), 0, 28); + gDebug_0300070F = 3; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + +bool8 debug_sub_808C9BC(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2264) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2264), gUnknown_Debug_083C2264); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2264), 0, 28); + gDebug_0300070F = 4; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + +bool8 debug_sub_808CA14(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2370) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2370), gUnknown_Debug_083C2370); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2370), 0, 28); + gDebug_0300070F = 5; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + +bool8 debug_sub_808CA6C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C248C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C248C), gUnknown_Debug_083C248C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C248C), 0, 28); + gDebug_0300070F = 6; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + +bool8 debug_sub_808CAC4(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C259C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C259C), gUnknown_Debug_083C259C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C259C), 0, 27); + gDebug_0300070F = 7; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + +bool8 debug_sub_808CB1C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C26C8) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C26C8), gUnknown_Debug_083C26C8); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C26C8), 0, 28); + gDebug_0300070F = 8; + gMenuCallback = debug_sub_808CB74; + return FALSE; +} + #endif -- cgit v1.2.3 From f2580f66856f3ee63ee411d089d79034f390c27a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Mar 2018 19:36:02 -0400 Subject: Rearrange flag data objects --- src/debug/tomomichi_debug_menu.c | 169 +++++++++++++-------------------------- 1 file changed, 55 insertions(+), 114 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index de4a75f90..54d7fe8a7 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -2,6 +2,7 @@ #include "global.h" #include "palette.h" #include "event_data.h" +#include "constants/flags.h" #include "constants/songs.h" #include "overworld.h" #include "script.h" @@ -359,7 +360,10 @@ const struct MenuAction gUnknown_Debug_083C1149[] = { const u8 gUnknown_Debug_083C1194[] = {9, 7}; -const u16 gUnknown_Debug_083C1196[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00, 0x00}; +const u16 gUnknown_Debug_083C1196[][9] = { + {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19}, + {0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20} +}; const u8 gUnknown_Debug_083C11BA[] = _("FH-00-08"); const u8 gUnknown_Debug_083C11C3[] = _("FH-09-15"); @@ -415,24 +419,19 @@ const struct MenuAction gUnknown_Debug_083C1288[] = { const u8 gUnknown_Debug_083C12D0[] = {9, 7}; -const u16 gUnknown_Debug_083C12D2[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x00, 0x00}; +const u16 gUnknown_Debug_083C12D2[][9] = { + {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}, + {0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10} +}; const u8 gUnknown_Debug_083C12F6[] = _("BATCH"); - const u8 gUnknown_Debug_083C12FC[] = _("タウンとうちゃく"); - const u8 gUnknown_Debug_083C1305[] = _("シティとうちゃく"); - const u8 gUnknown_Debug_083C130E[] = _("GET"); - const u8 gUnknown_Debug_083C1312[] = _("そのた1"); - const u8 gUnknown_Debug_083C1317[] = _("そのた2"); - const u8 gUnknown_Debug_083C131C[] = _("そのた3"); - const u8 gUnknown_Debug_083C1321[] = _("そのた4"); - const u8 gUnknown_Debug_083C1326[] = _("そのた とうちゃく"); const struct MenuAction gUnknown_Debug_083C1330[] = { @@ -448,19 +447,12 @@ const struct MenuAction gUnknown_Debug_083C1330[] = { }; const u8 gUnknown_Debug_083C1378[] = _("BATCH01ーGET"); - const u8 gUnknown_Debug_083C1384[] = _("BATCH02ーGET"); - const u8 gUnknown_Debug_083C1390[] = _("BATCH03ーGET"); - const u8 gUnknown_Debug_083C139C[] = _("BATCH04ーGET"); - const u8 gUnknown_Debug_083C13A8[] = _("BATCH05ーGET"); - const u8 gUnknown_Debug_083C13B4[] = _("BATCH06ーGET"); - const u8 gUnknown_Debug_083C13C0[] = _("BATCH07ーGET"); - const u8 gUnknown_Debug_083C13CC[] = _("BATCH08ーGET"); const struct MenuAction gUnknown_Debug_083C13D8[] = { @@ -475,17 +467,11 @@ const struct MenuAction gUnknown_Debug_083C13D8[] = { }; const u8 gUnknown_Debug_083C1418[] = _("T101ARRIVE"); - const u8 gUnknown_Debug_083C1423[] = _("T102ARRIVE"); - const u8 gUnknown_Debug_083C142E[] = _("T103ARRIVE"); - const u8 gUnknown_Debug_083C1439[] = _("T104ARRIVE"); - const u8 gUnknown_Debug_083C1444[] = _("T105ARRIVE"); - const u8 gUnknown_Debug_083C144F[] = _("T106ARRIVE"); - const u8 gUnknown_Debug_083C145A[] = _("T107ARRIVE"); const struct MenuAction gUnknown_Debug_083C1465[] = { @@ -499,21 +485,13 @@ const struct MenuAction gUnknown_Debug_083C1465[] = { }; const u8 gUnknown_Debug_083C14A0[] = _("C101ARRIVE"); - const u8 gUnknown_Debug_083C14AB[] = _("C102ARRIVE"); - const u8 gUnknown_Debug_083C14B6[] = _("C103ARRIVE"); - const u8 gUnknown_Debug_083C14C1[] = _("C104ARRIVE"); - const u8 gUnknown_Debug_083C14CC[] = _("C105ARRIVE"); - const u8 gUnknown_Debug_083C14D7[] = _("C106ARRIVE"); - const u8 gUnknown_Debug_083C14E2[] = _("C107ARRIVE"); - const u8 gUnknown_Debug_083C14ED[] = _("C108ARRIVE"); - const u8 gUnknown_Debug_083C14F8[] = _("C109ARRIVE"); const struct MenuAction gUnknown_Debug_083C1503[] = { @@ -529,11 +507,8 @@ const struct MenuAction gUnknown_Debug_083C1503[] = { }; const u8 gUnknown_Debug_083C154C[] = _("SYSーPOKEMONーGET"); - const u8 gUnknown_Debug_083C155C[] = _("SYSーZUKANーGET"); - const u8 gUnknown_Debug_083C156A[] = _("SYSーPOKEGEARーGET"); - const u8 gUnknown_Debug_083C157B[] = _("SYSーRIBBONーGET"); const struct MenuAction gUnknown_Debug_083C158A[] = { @@ -544,21 +519,13 @@ const struct MenuAction gUnknown_Debug_083C158A[] = { }; const u8 gUnknown_Debug_083C15AC[] = _("SYSーGAMEーCLEAR"); - const u8 gUnknown_Debug_083C15BB[] = _("SYSーKAIWAーUSED"); - const u8 gUnknown_Debug_083C15CA[] = _("SYSーNOWーOYAJIーMEET"); - const u8 gUnknown_Debug_083C15DD[] = _("SYSーUSEーWAZAーFLASH"); - const u8 gUnknown_Debug_083C15F0[] = _("SYSーUSEーWAZAーKAIRIKI"); - const u8 gUnknown_Debug_083C1605[] = _("SYSーWEATHERーCTRL"); - const u8 gUnknown_Debug_083C1616[] = _("SYSーCYCLINGーROAD"); - const u8 gUnknown_Debug_083C1627[] = _("SYSーSAFARIーMODE"); - const u8 gUnknown_Debug_083C1637[] = _("SYSーCRUISEーMODE"); const struct MenuAction gUnknown_Debug_083C1647[] = { @@ -574,21 +541,13 @@ const struct MenuAction gUnknown_Debug_083C1647[] = { }; const u8 gUnknown_Debug_083C1690[] = _("SYSーTVーHOME"); - const u8 gUnknown_Debug_083C169C[] = _("SYSーTVーWATCH"); - const u8 gUnknown_Debug_083C16A9[] = _("SYSーTVSTART"); - const u8 gUnknown_Debug_083C16B5[] = _("SYSーPOPWORDーINPUT"); - const u8 gUnknown_Debug_083C16C7[] = _("SYSーMIXーRECORD"); - const u8 gUnknown_Debug_083C16D6[] = _("SYSーCLOCKーSET"); - const u8 gUnknown_Debug_083C16E4[] = _("SYSーCAVEーSHIP"); - const u8 gUnknown_Debug_083C16F2[] = _("SYSーCAVEーWONDER"); - const u8 gUnknown_Debug_083C1702[] = _("SYSーCAVEーBATTLE"); const struct MenuAction gUnknown_Debug_083C1712[] = { @@ -604,21 +563,13 @@ const struct MenuAction gUnknown_Debug_083C1712[] = { }; const u8 gUnknown_Debug_083C175C[] = _("SYSーSPECIALーZUKAN"); - const u8 gUnknown_Debug_083C176E[] = _("SYSーASASEーTIDE"); - const u8 gUnknown_Debug_083C177D[] = _("SYSーRIBBONーGET"); - const u8 gUnknown_Debug_083C178C[] = _("SYSーPASOーMAYUMI"); - const u8 gUnknown_Debug_083C179C[] = _("SYSーEXDATAーENABLE"); - const u8 gUnknown_Debug_083C17AE[] = _("SYSーTENJIーANAWOHORU"); - const u8 gUnknown_Debug_083C17C2[] = _("SYSーTENJIーKAIRIKI"); - const u8 gUnknown_Debug_083C17D4[] = _("SYSーTENJIーWAIT"); - const u8 gUnknown_Debug_083C17E3[] = _("SYSーTENJIーSORAWOTOBU"); const struct MenuAction gUnknown_Debug_083C17F8[] = { @@ -634,21 +585,13 @@ const struct MenuAction gUnknown_Debug_083C17F8[] = { }; const u8 gUnknown_Debug_083C1840[] = _("SYSーENCーUPーITEM"); - const u8 gUnknown_Debug_083C1850[] = _("SYSーENEーDOWNーITEM"); - const u8 gUnknown_Debug_083C1862[] = _("SYSーKOKOROーEVENT"); - const u8 gUnknown_Debug_083C1873[] = _("SYSーMOVEーPOKEーNEWS"); - const u8 gUnknown_Debug_083C1886[] = _("SYSーASASEーITEM"); - const u8 gUnknown_Debug_083C1895[] = _("SYSーBーDASH"); - const u8 gUnknown_Debug_083C18A0[] = _("SYSーCTRLーOBJーDELETE"); - const u8 gUnknown_Debug_083C18B4[] = _(""); - const u8 gUnknown_Debug_083C18B5[] = _(""); const struct MenuAction gUnknown_Debug_083C18B8[] = { @@ -664,21 +607,13 @@ const struct MenuAction gUnknown_Debug_083C18B8[] = { }; const u8 gUnknown_Debug_083C1900[] = _("SYSーARRIVEーSUBMARINECAVE"); - const u8 gUnknown_Debug_083C1919[] = _("SYSーARRIVEーBATTLETOWER"); - const u8 gUnknown_Debug_083C1930[] = _("SYSーARRIVEーISLAND"); - const u8 gUnknown_Debug_083C1942[] = _("SYSーARRIVEーLEAGUE"); - const u8 gUnknown_Debug_083C1954[] = _("SYSーARRIVEーSORANOHASHIRA"); - const u8 gUnknown_Debug_083C196D[] = _(""); - const u8 gUnknown_Debug_083C196E[] = _(""); - const u8 gUnknown_Debug_083C196F[] = _(""); - const u8 gUnknown_Debug_083C1970[] = _(""); const struct MenuAction gDebug_0x83C1974[] = { @@ -693,17 +628,19 @@ const struct MenuAction gDebug_0x83C1974[] = { {gUnknown_Debug_083C1970, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C19BC[] = {0x08, 0x07, 0x09, 0x04, 0x09, 0x09, 0x09, 0x07, 0x05, 0x00}; - -const u16 gUnknown_Debug_083C19C6[] = {0x0807, 0x0808, 0x0809, 0x080a, 0x080b, 0x080c, 0x080d, 0x080e, 0x0000, - 0x080f, 0x0810, 0x0811, 0x0812, 0x0813, 0x0814, 0x0815, 0x0000, 0x0000, - 0x0816, 0x0817, 0x0818, 0x0819, 0x081a, 0x081b, 0x081c, 0x081d, 0x081e, - 0x0800, 0x0801, 0x0802, 0x083b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0804, 0x0805, 0x0806, 0x0828, 0x0829, 0x082a, 0x082b, 0x082c, 0x082d, - 0x0830, 0x0831, 0x0832, 0x0833, 0x0834, 0x0835, 0x0837, 0x0838, 0x0839, - 0x0836, 0x083a, 0x083b, 0x084b, 0x084c, 0x084f, 0x0850, 0x0851, 0x0852, - 0x084d, 0x084e, 0x0853, 0x085d, 0x085f, 0x0860, 0x0861, 0x0000, 0x0000, - 0x0847, 0x0848, 0x0849, 0x0854, 0x085e, 0x0000, 0x0000, 0x0000, 0x0000}; +const u8 gUnknown_Debug_083C19BC[] = {8, 7, 9, 4, 9, 9, 9, 7, 5}; + +const u16 gUnknown_Debug_083C19C6[][9] = { + {FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET, FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET}, + {FLAG_VISITED_LITTLEROOT_TOWN, FLAG_VISITED_OLDALE_TOWN, FLAG_VISITED_DEWFORD_TOWN, FLAG_VISITED_LAVARIDGE_TOWN, FLAG_VISITED_FALLARBOR_TOWN, FLAG_VISITED_VERDANTURF_TOWN, FLAG_VISITED_PACIFIDLOG_TOWN}, + {FLAG_VISITED_PETALBURG_CITY, FLAG_VISITED_SLATEPORT_CITY, FLAG_VISITED_MAUVILLE_CITY, FLAG_VISITED_RUSTBORO_CITY, FLAG_VISITED_FORTREE_CITY, FLAG_VISITED_LILYCOVE_CITY, FLAG_VISITED_MOSSDEEP_CITY, FLAG_VISITED_SOOTOPOLIS_CITY, FLAG_VISITED_EVER_GRANDE_CITY}, + {FLAG_SYS_POKEMON_GET, FLAG_SYS_POKEDEX_GET, FLAG_SYS_POKENAV_GET, FLAG_SYS_RIBBON_GET}, + {FLAG_SYS_GAME_CLEAR, FLAG_SYS_CHAT_USED, FLAG_SYS_HIPSTER_MEET, FLAG_SYS_USE_FLASH, FLAG_SYS_USE_STRENGTH, FLAG_SYS_WEATHER_CTRL, FLAG_SYS_CYCLING_ROAD, FLAG_SYS_SAFARI_MODE, FLAG_SYS_CRUISE_MODE}, + {FLAG_SYS_TV_HOME, FLAG_SYS_TV_WATCH, FLAG_SYS_TV_START, FLAG_SYS_POPWORD_INPUT, FLAG_SYS_MIX_RECORD, FLAG_SYS_CLOCK_SET, FLAG_SYS_CAVE_SHIP, FLAG_SYS_CAVE_WONDER, FLAG_SYS_CAVE_BATTLE}, + {FLAG_SYS_NATIONAL_DEX, FLAG_SYS_SHOAL_TIDE, FLAG_SYS_RIBBON_GET, FLAG_SYS_PC_LANETTE, FLAG_SYS_EXDATA_ENABLE, FLAG_SYS_BRAILLE_DIG, FLAG_SYS_BRAILLE_STRENGTH, FLAG_SYS_BRAILLE_WAIT, FLAG_SYS_BRAILLE_FLY}, + {FLAG_SYS_ENC_UP_ITEM, FLAG_SYS_ENC_DOWN_ITEM, FLAG_SYS_HAS_EON_TICKET, FLAG_SYS_TV_LATI, FLAG_SYS_SHOAL_ITEM, FLAG_SYS_B_DASH, FLAG_SYS_CTRL_OBJ_DELETE}, + {FLAG_LANDMARK_SEAFLOOR_CAVERN, FLAG_LANDMARK_BATTLE_TOWER, FLAG_LANDMARK_SOUTHERN_ISLAND, FLAG_SYS_POKEMON_LEAGUE_FLY, FLAG_LANDMARK_SKY_PILLAR} +}; const u8 gDebug_0x83C1A68[] = _("FVーBALL パート1"); @@ -719,9 +656,11 @@ const struct MenuAction gUnknown_Debug_083C1A9C[] = { {gUnknown_Debug_083C1A8C, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1AAC[] = {2, 0}; +const u8 gUnknown_Debug_083C1AAC[] = {2}; -const u16 gUnknown_Debug_083C1AAE[] = {0x0436, 0x046d, 0, 0, 0, 0, 0, 0, 0}; +const u16 gUnknown_Debug_083C1AAE[][9] = { + {FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_2, FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_1} +}; const u8 gUnknown_Debug_083C1AC0[] = _("ジムリーダー"); const u8 gUnknown_Debug_083C1AC7[] = _("してんのう"); @@ -771,8 +710,12 @@ const struct MenuAction gUnknown_Debug_083C1C2C[] = { {gUnknown_Debug_083C1C10, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1C34[] = {0x08, 0x04, 0x01, 0x00}; -const u16 gUnknown_Debug_083C1C38[] = {0x04B1, 0x04B4, 0x04B8, 0x04BD, 0x04C1, 0x04C9, 0x04CD, 0x04D4, 0x0000, 0x04DD, 0x04DE, 0x04DF, 0x04E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}; +const u8 gUnknown_Debug_083C1C34[] = {8, 4, 1}; +const u16 gUnknown_Debug_083C1C38[][9] = { + {FLAG_DEFEATED_RUSTBORO_GYM, FLAG_DEFEATED_DEWFORD_GYM, FLAG_DEFEATED_MAUVILLE_GYM, FLAG_DEFEATED_LAVARIDGE_GYM, FLAG_DEFEATED_PETALBURG_GYM, FLAG_DEFEATED_FORTREE_GYM, FLAG_DEFEATED_MOSSDEEP_GYM, FLAG_DEFEATED_SOOTOPOLIS_GYM}, + {FLAG_DEFEATED_ELITE_4_SYDNEY, FLAG_DEFEATED_ELITE_4_PHOEBE, FLAG_DEFEATED_ELITE_4_GLACIA, FLAG_DEFEATED_ELITE_4_DRAKE}, + {0x04E1} +}; const u8 gUnknown_Debug_083C1C6E[] = _("120/119ばんどうろカクレオン"); const u8 gUnknown_Debug_083C1C80[] = _("そのた1 / SUPPORTM/W"); @@ -988,21 +931,19 @@ const struct MenuAction gUnknown_Debug_083C26C8[] = { {gUnknown_Debug_083C26AC, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2710[] = {9, 9, 9, 9, 6, 9, 9, 9, 9, 0}; - -const u16 gUnknown_Debug_083C271A[] = { - 0x03d5, 0x03ca, 0x03d6, 0x03d9, 0x03da, 0x03db, 0x03dc, - 0x03dd, 0x03de, 0x03c8, 0x02dc, 0x03d4, 0x039d, 0x03c2, - 0x0368, 0x0352, 0x02d2, 0x02f8, 0x02d0, 0x02d1, 0x0380, - 0x0381, 0x0382, 0x0399, 0x0327, 0x0328, 0x037e, 0x02d6, - 0x02ef, 0x0324, 0x0326, 0x035a, 0x0362, 0x0363, 0x037c, - 0x037d, 0x0341, 0x0342, 0x03c6, 0x03c7, 0x03cc, 0x03cd, - 0x0000, 0x0000, 0x0000, 0x02dd, 0x02e1, 0x02ec, 0x02ee, - 0x02f2, 0x02f3, 0x0305, 0x0370, 0x0371, 0x02f0, 0x02f5, - 0x02f6, 0x02f7, 0x030e, 0x030f, 0x039a, 0x039b, 0x03a2, - 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x034f, 0x0365, 0x036f, - 0x037b, 0x03b6, 0x0379, 0x0398, 0x032e, 0x03cb, 0x02d3, - 0x0397, 0x0353, 0x03a1, 0x03d3}; +const u8 gUnknown_Debug_083C2710[] = {9, 9, 9, 9, 6, 9, 9, 9, 9}; + +const u16 gUnknown_Debug_083C271A[][9] = { + {FLAG_HIDE_KECLEON_ROUTE120_2, FLAG_HIDE_KECLEON_ROUTE120_1, FLAG_HIDE_KECLEON_ROUTE120_3, FLAG_HIDE_KECLEON_ROUTE120_4, FLAG_HIDE_KECLEON_ROUTE120_5, FLAG_HIDE_KECLEON_ROUTE120_6, FLAG_HIDE_KECLEON_ROUTE120_7, FLAG_HIDE_KECLEON_ROUTE119_1, FLAG_HIDE_KECLEON_ROUTE119_2}, + {FLAG_HIDE_BELDUM_BALL_STEVENS_HOUSE, FLAG_HIDE_DEVON_RUSTBORO, FLAG_HIDE_UNDERWATER_SUBMARINE_INTERACTION, FLAG_HIDE_LILYCOVE_MOTEL_PEOPLE, FLAG_HIDE_ROOFTOP_LADY_LILYCOVE_MART, FLAG_HIDE_TRICKMASTER_ENTRANCE, 0x352, FLAG_HIDE_MAY_UPSTAIRS, FLAG_HIDE_BRENDAN_UPSTAIRS}, + {FLAG_HIDE_BIRCH_BATTLE_POOCHYENA, FLAG_HIDE_BIRCH_IN_LAB, FLAG_UNKNOWN_BIRCH_380, FLAG_HIDE_BIRCH_ROUTE101, FLAG_HIDE_BIRCH_ROUTE103, FLAG_HIDE_BIRCH_CHAMPIONS_ROOM, FLAG_HIDE_BOYFRIEND_RUSTURF_TUNNEL, FLAG_HIDE_BOYFRIEND_WANDAS_HOUSE, FLAG_HIDE_TUNNER_DIGGER_ROUTE116}, + {FLAG_HIDE_WALLY_PETALBURG, FLAG_HIDE_WALLY_DEFEATED_VICTORY_ROAD, FLAG_HIDE_WALLY_MAUVILLE, FLAG_HIDE_WALLY_WANDAS_HOUSE, FLAG_HIDE_WALLY_BATTLE_VICTORY_ROAD, FLAG_HIDE_WALLY_PETALBURG_GYM, FLAG_UNKNOWN_363, FLAG_HIDE_WEATHER_INSTITUTE_WORKERS_1F, FLAG_HIDE_WEATHER_INSTITUTE_WORKERS_2F}, + {FLAG_HIDE_STEVEN_GRANITE_CAVE, FLAG_HIDE_STEVEN_ROUTE128, FLAG_HIDE_STEVEN_ROUTE118, FLAG_HIDE_STEVEN_STEVENS_HOUSE, FLAG_HIDE_STEVEN_ROUTE120, FLAG_HIDE_STEVEN_SOOTOPOLIS}, + {FLAG_HIDE_SLEEPING_MON_SEAFLOOR_CAVERN, FLAG_UNKNOWN_2E1, FLAG_UNKNOWN_2EC, FLAG_HIDE_POOCHYENA_ROUTE101, FLAG_HIDE_MACHOKE_MOVER_1, FLAG_HIDE_MACHOKE_MOVER_2, 0x305, FLAG_HIDE_PEEKO_RUSTURF_TUNNEL, FLAG_HIDE_PEEKO_BRINEY_HOUSE}, + {FLAG_HIDE_MOM_LITTLEROOT, FLAG_HIDE_MOM_UPSTAIRS, FLAG_HIDE_BRENDAN_MOM_DOWNSTAIRS, FLAG_HIDE_MAY_MOM_DOWNSTAIRS, FLAG_UNKNOWN_30E, FLAG_UNKNOWN_30F, FLAG_HIDE_RIVAL_ON_BIKE_ROUTE110, FLAG_HIDE_RIVAL_ROUTE119_ON_BIKE, FLAG_HIDE_RIVAL_LAVARIDGE_2}, + {FLAG_HIDE_MR_BRINEY_ROUTE104, FLAG_HIDE_MR_BRINEY_ROUTE104_HOUSE, FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN, FLAG_HIDE_MR_BRINEY_ROUTE109, FLAG_UNKNOWN_34F, FLAG_HIDE_BRINEY_SLATEPORT_SHIPYARD, FLAG_HIDE_BRINEY_RUSTURF_TUNNEL, FLAG_HIDE_BRINEY_ROUTE116, FLAG_HIDE_BRINEY_AND_PEEKO_SS_TIDAL}, + {FLAG_HIDE_RIVAL_BIRCH_LAB, FLAG_HIDE_RIVAL_CHAMPIONS_ROOM, FLAG_HIDE_RIVAL_RUSTBORO, FLAG_HIDE_RIVAL_LILYCOVE_MART, FLAG_HIDE_RIVAL_ROUTE103, FLAG_HIDE_RIVAL_ROUTE110, FLAG_HIDE_RIVAL_ROUTE119, FLAG_HIDE_RIVAL_LAVARIDGE_1, FLAG_HIDE_RIVAL_OLDALE_TOWN} +}; const u8 gUnknown_Debug_083C27BC[] = _("FEひでんわざ/デボンかんれん"); const u8 gUnknown_Debug_083C27CC[] = _("FEだいじなアイテムPART1"); @@ -1224,18 +1165,18 @@ const struct MenuAction gUnknown_Debug_083C3194[] = { {gUnknown_Debug_083C3192, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C31DC[] = {9, 9, 9, 9, 9, 9, 9, 9, 3, 0}; +const u8 gUnknown_Debug_083C31DC[] = {9, 9, 9, 9, 9, 9, 9, 9, 3}; const u16 gUnknown_Debug_83C31E6[][9] = { - {0x89, 0x6E, 0x7A, 0x6A, 0x6D, 0x6B, 0x90, 0x8E, 0x8F}, - {0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x101, 0xE3, 0x98}, - {0x8B, 0x126, 0x81, 0x71, 0x100, 0x123, 0x127, 0x10B, 0xF7}, - {0x6C, 0x7E, 0xBE, 0xC1, 0x11C, 0xF0, 0xF1, 0xF2, 0xF3}, - {0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0x64, 0x65, 0x66, 0x67}, - {0x82, 0x11E, 0x120, 0x124, 0x125, 0x50, 0x51, 0x52, 0x55}, - {0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0x53, 0x54, 0x56, 0x57}, - {0xEF, 0xF4, 0x83, 0x10F, 0x103, 0x107, 0x10A, 0x112, 0x11D}, - {0x58, 0x59, 0x60, 0, 0, 0, 0, 0, 0} + {FLAG_RECEIVED_HM01, FLAG_RECEIVED_HM02, FLAG_RECEIVED_HM03, FLAG_RECEIVED_HM04, FLAG_RECEIVED_HM05, FLAG_RECEIVED_HM06, FLAG_RETURNED_DEVON_GOODS, FLAG_DEVON_GOODS_STOLEN, FLAG_RECOVERED_DEVON_GOODS}, + {FLAG_RECEIVED_BIKE, 0x05B, 0x05C, 0x05D, FLAG_RECEIVED_WAILMER_PAIL, FLAG_RECEIVED_POKEBLOCK_CASE, FLAG_RECEIVED_OLD_ROD, FLAG_RECEIVED_GOOD_ROD, FLAG_RECEIVED_SUPER_ROD}, + {FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY, FLAG_EXCHANGED_SCANNER, FLAG_LEGEND_ESCAPED_SEAFLOOR_CAVERN, FLAG_LEGENDARY_BATTLE_COMPLETED, FLAG_RECEIVED_REPEAT_BALL, FLAG_RECEIVED_SS_TICKET, FLAG_KECLEON_FLED_FORTREE, FLAG_RECEIVED_FOSSIL_MON, FLAG_DEFEATED_SS_TIDAL_TRAINERS}, + {0x06C, FLAG_DEFEATED_WALLY_VICTORY_ROAD, FLAG_DEFEATED_WALLY_MAUVILLE, FLAG_WALLY_SPEECH, FLAG_DECLINED_WALLY_BATTLE_MAUVILLE, FLAG_USED_ROOM_1_KEY, FLAG_USED_ROOM_2_KEY, FLAG_USED_ROOM_4_KEY, FLAG_USED_ROOM_6_KEY}, + {FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1, FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2, FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3, FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4, FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5, FLAG_MOSSDEEP_GYM_SWITCH_1, FLAG_MOSSDEEP_GYM_SWITCH_2, FLAG_MOSSDEEP_GYM_SWITCH_3, FLAG_MOSSDEEP_GYM_SWITCH_4}, + {FLAG_DEFEATED_RIVAL_ROUTE103, FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, FLAG_MET_RIVAL_RUSTBORO, FLAG_MET_RIVAL_LILYCOVE, FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE, 0x050, FLAG_SET_WALL_CLOCK, FLAG_RESCUED_BIRCH, 0x055}, + {FLAG_RECEIVED_RED_SCARF, FLAG_RECEIVED_BLUE_SCARF, FLAG_RECEIVED_PINK_SCARF, FLAG_RECEIVED_GREEN_SCARF, FLAG_RECEIVED_YELLOW_SCARF, 0x053, 0x054, FLAG_LINK_CONTEST_ROOM_POKEBALL, FLAG_MET_RIVAL_MOM}, + {FLAG_USED_STORAGE_KEY, FLAG_MET_PROF_COSMO, FLAG_RECEIVED_DOLL_LANETTE, FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE, FLAG_RETURNED_RED_OR_BLUE_ORB, FLAG_ENTERED_ELITE_FOUR, FLAG_RECEIVED_LAVARIDGE_EGG, FLAG_RECEIVED_RUNNING_SHOES, FLAG_RECEIVED_DEVON_SCOPE}, + {FLAG_BIRCH_AIDE_MET, FLAG_DECLINED_BIKE, FLAG_RECEIVED_SECRET_POWER} }; bool8 InitTomomichiDebugWindow(void) -- cgit v1.2.3 From 79df78752440b70646399fc2a02901d8c3d4eff9 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Mar 2018 20:02:27 -0400 Subject: Remaining data --- src/debug/tomomichi_debug_menu.c | 646 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 646 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 54d7fe8a7..bc626262f 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -133,6 +133,30 @@ void debug_sub_808C764(u8); void debug_sub_808F2E0(u8, u8, bool8); bool8 debug_sub_808C818(void); bool8 debug_sub_808CB74(void); +bool8 debug_sub_808E400(void); +bool8 debug_sub_808E458(void); +bool8 debug_sub_808E4B0(void); +bool8 debug_sub_808E508(void); +bool8 debug_sub_808E560(void); +bool8 debug_sub_808E9A0(void); +bool8 debug_sub_808E9F8(void); +bool8 debug_sub_808E054(void); +bool8 debug_sub_808E0AC(void); +bool8 debug_sub_808E104(void); +bool8 debug_sub_808E15C(void); +bool8 debug_sub_808E1B4(void); +bool8 debug_sub_808E20C(void); +bool8 debug_sub_808DBA0(void); +bool8 debug_sub_808DBF8(void); +bool8 debug_sub_808DC50(void); +bool8 debug_sub_808DCA8(void); +bool8 debug_sub_808DD00(void); +bool8 debug_sub_808DD58(void); +bool8 debug_sub_808DDB0(void); +bool8 debug_sub_808DE08(void); +bool8 debug_sub_808DE60(void); +bool8 debug_sub_808E754(void); +bool8 debug_sub_808E7AC(void); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -1179,6 +1203,628 @@ const u16 gUnknown_Debug_83C31E6[][9] = { {FLAG_BIRCH_AIDE_MET, FLAG_DECLINED_BIKE, FLAG_RECEIVED_SECRET_POWER} }; +const u8 gUnknown_Debug_083C3288[] = _("CYCLEかんれん"); +const u8 gUnknown_Debug_083C3292[] = _("おおきさくらべ"); +const u8 gUnknown_Debug_083C329A[] = _("カウンタ"); +const u8 gUnknown_Debug_083C329F[] = _("そのた1"); +const u8 gUnknown_Debug_083C32A4[] = _("そのた2"); + +const struct MenuAction gUnknown_Debug_083C32AC[] = { + {gUnknown_Debug_083C3288, debug_sub_808E400}, + {gUnknown_Debug_083C3292, debug_sub_808E458}, + {gUnknown_Debug_083C329A, debug_sub_808E4B0}, + {gUnknown_Debug_083C329F, debug_sub_808E508}, + {gUnknown_Debug_083C32A4, debug_sub_808E560} +}; + +const u8 gUnknown_Debug_083C32D4[] = _("WKーCYCLEーROADーHIT"); +const u8 gUnknown_Debug_083C32E6[] = _("WKーCYCLEーROADーTIMエ1"); +const u8 gUnknown_Debug_083C32FA[] = _("WKーCYCLEーROADーTIMエ2"); + +const u8 gUnknown_Debug_083C330E[] = _("WKーSIZEーKINOKOKOーOYAJI"); +const u8 gUnknown_Debug_083C3325[] = _("WKーSIZEーNAMAZOーOYAJI"); + +const u8 gUnknown_Debug_083C333A[] = _("WKーSPRAYーCOUNT"); +const u8 gUnknown_Debug_083C3349[] = _("WKーICEーCOUNT"); +const u8 gUnknown_Debug_083C3356[] = _("WKーASHーGATHERーCOUNT"); +const u8 gUnknown_Debug_083C336A[] = _("WKーCRUISEーCOUNT"); +const u8 gUnknown_Debug_083C337A[] = _("WKーFRIENDLYーSTEPーCOUNT"); +const u8 gUnknown_Debug_083C3391[] = _("WKーPOISONーSTEPーCOUNT"); + +const u8 gUnknown_Debug_083C33A6[] = _("WKRECYCLEーGOODS"); +const u8 gUnknown_Debug_083C33B6[] = _("WKーFIRSTーPOKE"); +const u8 gUnknown_Debug_083C33C4[] = _("WKーMABOROSIRNDーH"); +const u8 gUnknown_Debug_083C33D5[] = _("WKーMABOROSIRNDーL"); +const u8 gUnknown_Debug_083C33E6[] = _("EVーONEーDAYーWORK"); +const u8 gUnknown_Debug_083C33F6[] = _("EVーFANWORK"); +const u8 gUnknown_Debug_083C3401[] = _("EVーFANTIME"); +const u8 gUnknown_Debug_083C340C[] = _("WKーKARAKURIーLEVEL"); +const u8 gUnknown_Debug_083C341E[] = _("WKーPOKELOTーPRIZE"); + +const u8 gUnknown_Debug_083C342F[] = _("WKーSPECIALーZUKN"); +const u8 gUnknown_Debug_083C343F[] = _("WKーHYOUKAーDAYS"); +const u8 gUnknown_Debug_083C344E[] = _("WKーPOKELOTーRND1"); +const u8 gUnknown_Debug_083C345E[] = _("WKーPOKELOTーRND2"); +const u8 gUnknown_Debug_083C346E[] = _("WKーBASEーMAPNO"); + +const struct MenuAction gUnknown_Debug_083C347C[] = { + {gUnknown_Debug_083C32D4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C32E6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C32FA, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C3494[] = { + {gUnknown_Debug_083C330E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3325, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C34A4[] = { + {gUnknown_Debug_083C333A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3349, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3356, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C336A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C337A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3391, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C34D4[] = { + {gUnknown_Debug_083C33A6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C33B6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C33C4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C33D5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C33E6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C33F6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3401, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C340C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C341E, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C351C[] = { + {gUnknown_Debug_083C342F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C343F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C344E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C345E, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C346E, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C3544[] = {3, 2, 6, 9, 5}; + +const u16 gUnknown_Debug_083C354A[][9] = { + {0x4027, 0x4028, 0x4029}, + {0x4047, 0x404F}, + {0x4021, 0x4022, 0x4048, 0x404A, 0x402A, 0x402B}, + {0x4020, 0x4023, 0x4024, 0x4025, 0x4040, 0x4041, 0x4042, 0x4044, 0x4045}, + {0x4046, 0x4049, 0x404B, 0x404C, 0x4026} +}; + +const u8 gUnknown_Debug_083C35A4[] = _("OBJCHRWORK0ー8"); +const u8 gUnknown_Debug_083C35B2[] = _("OBJCHRWORK9ー15"); + +const struct MenuAction gUnknown_Debug_083C35C4[] = { + {gUnknown_Debug_083C35A4, debug_sub_808E9A0}, + {gUnknown_Debug_083C35B2, debug_sub_808E9F8} +}; + +const u8 gUnknown_Debug_083C35D4[] = _("OBJCHRWORK1"); +const u8 gUnknown_Debug_083C35E0[] = _("OBJCHRWORK2"); +const u8 gUnknown_Debug_083C35EC[] = _("OBJCHRWORK3"); +const u8 gUnknown_Debug_083C35F8[] = _("OBJCHRWORK4"); +const u8 gUnknown_Debug_083C3604[] = _("OBJCHRWORK5"); +const u8 gUnknown_Debug_083C3610[] = _("OBJCHRWORK6"); +const u8 gUnknown_Debug_083C361C[] = _("OBJCHRWORK7"); +const u8 gUnknown_Debug_083C3628[] = _("OBJCHRWORK8"); +const u8 gUnknown_Debug_083C3634[] = _("OBJCHRWORK9"); + +const u8 gUnknown_Debug_083C3640[] = _("OBJCHRWORK10"); +const u8 gUnknown_Debug_083C364D[] = _("OBJCHRWORK11"); +const u8 gUnknown_Debug_083C365A[] = _("OBJCHRWORK12"); +const u8 gUnknown_Debug_083C3667[] = _("OBJCHRWORK13"); +const u8 gUnknown_Debug_083C3674[] = _("OBJCHRWORK14"); +const u8 gUnknown_Debug_083C3681[] = _("OBJCHRWORK15"); +const u8 gUnknown_Debug_083C368E[] = _("OBJCHRWORK16"); + +const struct MenuAction gUnknown_Debug_083C369C[] = { + {gUnknown_Debug_083C35D4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C35E0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C35EC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C35F8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3604, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3610, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C361C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3628, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3634, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C36E4[] = { + {gUnknown_Debug_083C3640, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C364D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C365A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3667, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3674, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3681, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C368E, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C371C[] = {9, 7}; + +const u16 gUnknown_Debug_083C371E[][9] = { + {0x4010, 0x4011, 0x4012, 0x4013, 0x4014, 0x4015, 0x4016, 0x4017, 0x4018}, + {0x4019, 0x401A, 0x401B, 0x401C, 0x401D, 0x401E, 0x401F} +}; + +const u8 gUnknown_Debug_083C3742[] = _("SP"); +const u8 gUnknown_Debug_083C3745[] = _("ルーム R110 PART1/カラクリ"); +const u8 gUnknown_Debug_083C3759[] = _("ルーム R110 PART2"); +const u8 gUnknown_Debug_083C3768[] = _("ルーム ロード"); +const u8 gUnknown_Debug_083C3770[] = _("ソノタ1"); +const u8 gUnknown_Debug_083C3775[] = _("ソノタ2"); + +const struct MenuAction gUnknown_Debug_083C377C[] = { + {gUnknown_Debug_083C3742, debug_sub_808E054}, + {gUnknown_Debug_083C3745, debug_sub_808E0AC}, + {gUnknown_Debug_083C3759, debug_sub_808E104}, + {gUnknown_Debug_083C3768, debug_sub_808E15C}, + {gUnknown_Debug_083C3770, debug_sub_808E1B4}, + {gUnknown_Debug_083C3775, debug_sub_808E20C} +}; + +const u8 gUnknown_Debug_083C37AC[] = _("WKーSCENEーSPーCONTEST"); +const u8 gUnknown_Debug_083C37C0[] = _("WKーSCENEーSPーPC"); +const u8 gUnknown_Debug_083C37CF[] = _("WKーSCENEーSPーCONTEST03"); +const u8 gUnknown_Debug_083C37E5[] = _("WKーSCENEーSPーCONTESTITEM"); +const u8 gUnknown_Debug_083C37FD[] = _("WKーSCENEーSPーOPENING"); +const u8 gUnknown_Debug_083C3811[] = _("WKーSCENEーSPーSHIP01"); +const u8 gUnknown_Debug_083C3824[] = _(""); +const u8 gUnknown_Debug_083C3825[] = _(""); +const u8 gUnknown_Debug_083C3826[] = _(""); + +const u8 gUnknown_Debug_083C3827[] = _("WKーSCENEーR110ーR0101"); +const u8 gUnknown_Debug_083C383B[] = _("WKーSCENEーR110ーR0102"); +const u8 gUnknown_Debug_083C384F[] = _("WKーSCENEーR110ーR0103"); +const u8 gUnknown_Debug_083C3863[] = _("WKーKARAKURIーDAIOU"); +const u8 gUnknown_Debug_083C3875[] = _("WKーSCENEーSHISEN"); +const u8 gUnknown_Debug_083C3885[] = _(""); +const u8 gUnknown_Debug_083C3886[] = _(""); +const u8 gUnknown_Debug_083C3887[] = _(""); +const u8 gUnknown_Debug_083C3888[] = _(""); + +const u8 gUnknown_Debug_083C3889[] = _("WKーSCENEーR110ーR0104"); +const u8 gUnknown_Debug_083C389D[] = _("WKーSCENEーR110ーR0105"); +const u8 gUnknown_Debug_083C38B1[] = _("WKーSCENEーR110ーR0106"); +const u8 gUnknown_Debug_083C38C5[] = _("WKーSCENEーR110ーR0107"); +const u8 gUnknown_Debug_083C38D9[] = _("WKーSCENEーR110ーR0108"); +const u8 gUnknown_Debug_083C38ED[] = _("WKーSCENEーR110ーR0109"); +const u8 gUnknown_Debug_083C3901[] = _("WKーSCENEーR110ーR0110"); +const u8 gUnknown_Debug_083C3915[] = _("WKーSCENEーR110ーR0111"); +const u8 gUnknown_Debug_083C3929[] = _("WKーSCENEー02ーR110ーR0110"); + +const u8 gUnknown_Debug_083C3940[] = _("WKーSCENEーR104ーR0101"); +const u8 gUnknown_Debug_083C3954[] = _("WKーSCENEーR113ーR0101"); +const u8 gUnknown_Debug_083C3968[] = _(""); +const u8 gUnknown_Debug_083C3969[] = _(""); +const u8 gUnknown_Debug_083C396A[] = _(""); +const u8 gUnknown_Debug_083C396B[] = _(""); +const u8 gUnknown_Debug_083C396C[] = _(""); +const u8 gUnknown_Debug_083C396D[] = _(""); +const u8 gUnknown_Debug_083C396E[] = _(""); + +const u8 gUnknown_Debug_083C396F[] = _("WKーSCENEーBASEーGDOODS"); +const u8 gUnknown_Debug_083C3984[] = _("WKーSCENEーHAGIーFUNE"); +const u8 gUnknown_Debug_083C3997[] = _("WKーSCENEーFUNEーPOS"); +const u8 gUnknown_Debug_083C39A9[] = _("WKーSCENEーBASEーMAKE"); +const u8 gUnknown_Debug_083C39BC[] = _("WKーSCENEーARTISTーC106ーR"); +const u8 gUnknown_Debug_083C39D3[] = _("WKーSCENEーPOKEーLEAGUE"); +const u8 gUnknown_Debug_083C39E8[] = _("WKーSCENEーROPEWAY"); +const u8 gUnknown_Debug_083C39F9[] = _("WKーSCENEーSAFARIーZONE"); +const u8 gUnknown_Debug_083C3A0E[] = _("WKーSCENEーCYCLEーROAD"); + +const u8 gUnknown_Debug_083C3A22[] = _("WKーSCENEーR119ーTENKI"); +const u8 gUnknown_Debug_083C3A36[] = _("WKーSCENEー01ーC102ーR0401"); +const u8 gUnknown_Debug_083C3A4D[] = _("WKーFUTAGOー01ーFIELDーR104"); +const u8 gUnknown_Debug_083C3A65[] = _("WKーSCENEーBATTLEーTOWER"); +const u8 gUnknown_Debug_083C3A7B[] = _("WKーSCENEーTRーHOUSE"); +const u8 gUnknown_Debug_083C3A8D[] = _("WKーKASEKIーTYPE"); +const u8 gUnknown_Debug_083C3A9C[] = _(""); +const u8 gUnknown_Debug_083C3A9D[] = _(""); +const u8 gUnknown_Debug_083C3A9E[] = _(""); + +const struct MenuAction gUnknown_Debug_083C3AA0[] = { + {gUnknown_Debug_083C37AC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C37C0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C37CF, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C37E5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C37FD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3811, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3824, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3825, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_83C3AE0[] = { + {gUnknown_Debug_083C3827, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C383B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C384F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3863, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3875, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3885, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3886, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3887, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3888, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_83C3B28[] = { + {gUnknown_Debug_083C3889, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C389D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C38B1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C38C5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C38D9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C38ED, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3901, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3915, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3929, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_83C3B70[] = { + {gUnknown_Debug_083C3940, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3954, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3968, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3969, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C396A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C396B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C396C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C396D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C396E, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_83C3BB8[] = { + {gUnknown_Debug_083C396F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3984, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3997, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C39A9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C39BC, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C39D3, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C39E8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C39F9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A0E, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_83C3C00[] = { + {gUnknown_Debug_083C3A22, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A36, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A4D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A65, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A7B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A8D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A9C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A9D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3A9E, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C3C48[] = {6, 5, 9, 2, 9, 6}; + +const u16 gUnknown_Debug_83C3C4E[][9] = { + {0x4086, 0x4087, 0x4088, 0x408A, 0x4092, 0x40B4}, + {0x40A6, 0x40C1, 0x40B5, 0x40A7, 0x40A5}, + {0x40AB, 0x40AC, 0x40AD, 0x40AE, 0x40AF, 0x40B0, 0x40B1, 0x40B2, 0x40B6}, + {0x4090, 0x40BE}, + {0x4089, 0x408E, 0x4096, 0x4097, 0x4099, 0x409C, 0x40A3, 0x40A4, 0x40A9}, + {0x40B3, 0x40B7, 0x40BB, 0x40BC, 0x40C0, 0x40C5} +}; + +const u8 gUnknown_Debug_083C3CBA[] = _("タウン"); +const u8 gUnknown_Debug_083C3CBE[] = _("シティ"); +const u8 gUnknown_Debug_083C3CC2[] = _("ロード101ー109"); +const u8 gUnknown_Debug_083C3CCD[] = _("ロード110ー118"); +const u8 gUnknown_Debug_083C3CD8[] = _("ロード119ー127"); +const u8 gUnknown_Debug_083C3CE3[] = _("ロード128ー134"); +const u8 gUnknown_Debug_083C3CEE[] = _("ルーム タウン"); +const u8 gUnknown_Debug_083C3CF6[] = _("ルーム シティ"); +const u8 gUnknown_Debug_083C3CFE[] = _("ダンジョンない"); + +const struct MenuAction gUnknown_Debug_083C3D08[] = { + {gUnknown_Debug_083C3CBA, debug_sub_808DBA0}, + {gUnknown_Debug_083C3CBE, debug_sub_808DBF8}, + {gUnknown_Debug_083C3CC2, debug_sub_808DC50}, + {gUnknown_Debug_083C3CCD, debug_sub_808DCA8}, + {gUnknown_Debug_083C3CD8, debug_sub_808DD00}, + {gUnknown_Debug_083C3CE3, debug_sub_808DD58}, + {gUnknown_Debug_083C3CEE, debug_sub_808DDB0}, + {gUnknown_Debug_083C3CF6, debug_sub_808DE08}, + {gUnknown_Debug_083C3CFE, debug_sub_808DE60} +}; + +const u8 gUnknown_Debug_083C3D50[] = _("WKーSCENEーFIELDーT101"); +const u8 gUnknown_Debug_083C3D64[] = _("WKーSCENEーFIELDーT102"); +const u8 gUnknown_Debug_083C3D78[] = _("WKーSCENEーFIELDーT103"); +const u8 gUnknown_Debug_083C3D8C[] = _("WKーSCENEーFIELDーT104"); +const u8 gUnknown_Debug_083C3DA0[] = _("WKーBASEーPOSNO"); +const u8 gUnknown_Debug_083C3DAE[] = _("WKーSCENEーFIELDーT106"); +const u8 gUnknown_Debug_083C3DC2[] = _("WKーSCENEーFIELDーT107"); +const u8 gUnknown_Debug_083C3DD6[] = _("WKーSCENEー02ーFIELDーT102"); + +const u8 gUnknown_Debug_083C3DED[] = _("WKーSCENEーFIELDーC101"); +const u8 gUnknown_Debug_083C3E01[] = _("WKーSCENEーFIELDーC102"); +const u8 gUnknown_Debug_083C3E15[] = _("WKーSCENEーFIELDーC103"); +const u8 gUnknown_Debug_083C3E29[] = _("WKーSCENEーFIELDーC104"); +const u8 gUnknown_Debug_083C3E3D[] = _("WKーSCENEーFIELDーC105"); +const u8 gUnknown_Debug_083C3E51[] = _("WKーSCENEーFIELDーC106"); +const u8 gUnknown_Debug_083C3E65[] = _("WKーSCENEーFIELDーC107"); +const u8 gUnknown_Debug_083C3E79[] = _("WKーSCENEーFIELDーC108"); +const u8 gUnknown_Debug_083C3E8D[] = _("WKーSCENEーFIELDーC109"); + +const u8 gUnknown_Debug_083C3EA1[] = _("WKーSCENEーFIELDーR101"); +const u8 gUnknown_Debug_083C3EB5[] = _("WKーSCENEーFIELDーR102"); +const u8 gUnknown_Debug_083C3EC9[] = _("WKーSCENEーFIELDーR103"); +const u8 gUnknown_Debug_083C3EDD[] = _("WKーSCENEーFIELDーR104"); +const u8 gUnknown_Debug_083C3EF1[] = _("WKーSCENEーFIELDーR105"); +const u8 gUnknown_Debug_083C3F05[] = _("WKーSCENEーFIELDーR106"); +const u8 gUnknown_Debug_083C3F19[] = _("WKーSCENEーFIELDーR107"); +const u8 gUnknown_Debug_083C3F2D[] = _("WKーSCENEーFIELDーR108"); +const u8 gUnknown_Debug_083C3F41[] = _("WKーSCENEーFIELDーR109"); + +const u8 gUnknown_Debug_083C3F55[] = _("WKーSCENEーFIELDーR110"); +const u8 gUnknown_Debug_083C3F69[] = _("WKーSCENEーFIELDーR111"); +const u8 gUnknown_Debug_083C3F7D[] = _("WKーSCENEーFIELDーR112"); +const u8 gUnknown_Debug_083C3F91[] = _("WKーSCENEーFIELDーR113"); +const u8 gUnknown_Debug_083C3FA5[] = _("WKーSCENEーFIELDーR114"); +const u8 gUnknown_Debug_083C3FB9[] = _("WKーSCENEーFIELDーR115"); +const u8 gUnknown_Debug_083C3FCD[] = _("WKーSCENEーFIELDーR116"); +const u8 gUnknown_Debug_083C3FE1[] = _("WKーSCENEーFIELDーR117"); +const u8 gUnknown_Debug_083C3FF5[] = _("WKーSCENEーFIELDーR118"); + +const u8 gUnknown_Debug_083C4009[] = _("WKーSCENEーFIELDーR119"); +const u8 gUnknown_Debug_083C401D[] = _("WKーSCENEーFIELDーR120"); +const u8 gUnknown_Debug_083C4031[] = _("WKーSCENEーFIELDーR121"); +const u8 gUnknown_Debug_083C4045[] = _("WKーSCENEーFIELDーR122"); +const u8 gUnknown_Debug_083C4059[] = _("WKーSCENEーFIELDーR123"); +const u8 gUnknown_Debug_083C406D[] = _("WKーSCENEーFIELDーR124"); +const u8 gUnknown_Debug_083C4081[] = _("WKーSCENEーFIELDーR125"); +const u8 gUnknown_Debug_083C4095[] = _("WKーSCENEーFIELDーR126"); +const u8 gUnknown_Debug_083C40A9[] = _("WKーSCENEーFIELDーR127"); + +const u8 gUnknown_Debug_083C40BD[] = _("WKーSCENEーFIELDーR128"); +const u8 gUnknown_Debug_083C40D1[] = _("WKーSCENEーFIELDーR129"); +const u8 gUnknown_Debug_083C40E5[] = _("WKーSCENEーFIELDーR130"); +const u8 gUnknown_Debug_083C40F9[] = _("WKーSCENEーFIELDーR131"); +const u8 gUnknown_Debug_083C410D[] = _("WKーSCENEーFIELDーR132"); +const u8 gUnknown_Debug_083C4121[] = _("WKーSCENEーFIELDーR133"); +const u8 gUnknown_Debug_083C4135[] = _("WKーSCENEーFIELDーR134"); + +const u8 gUnknown_Debug_083C4149[] = _("WKーSCENEーT101ーR0101"); +const u8 gUnknown_Debug_083C415D[] = _("WKーSCENEーT101ーR0102"); +const u8 gUnknown_Debug_083C4171[] = _("WKーSCENEーT101ーR0301"); +const u8 gUnknown_Debug_083C4185[] = _("WKーSCENEーT101ーR0201"); +const u8 gUnknown_Debug_083C4199[] = _("WKーSCENEーT101ーR0202"); +const u8 gUnknown_Debug_083C41AD[] = _("WKーSCENEーT107ーR0201"); + +const u8 gUnknown_Debug_083C41C1[] = _("WKーSCENEーC101ーR0201"); +const u8 gUnknown_Debug_083C41D5[] = _("WKーSCENEーC104ーR0103"); +const u8 gUnknown_Debug_083C41E9[] = _("WKーSCENEーC103ーR0101"); +const u8 gUnknown_Debug_083C41FD[] = _("WKーSCENEーC106ーR0202"); +const u8 gUnknown_Debug_083C4211[] = _("WKーSCENEーC106ーR0401"); +const u8 gUnknown_Debug_083C4225[] = _("WKーSCENEーC102ーR0601"); +const u8 gUnknown_Debug_083C4239[] = _("WKーSCENEーC102ーR0501"); +const u8 gUnknown_Debug_083C424D[] = _("WKーSCENEーC104ーR0102"); +const u8 gUnknown_Debug_083C4261[] = _("WKーSCENEーC107ーR0501"); + +const u8 gUnknown_Debug_083C4275[] = _("WKーSCENEーCAVEーD0601"); +const u8 gUnknown_Debug_083C4289[] = _("WKーSCENEーCAVEーD0201"); +const u8 gUnknown_Debug_083C429D[] = _("WKーSCENEーCAVEーD1206"); +const u8 gUnknown_Debug_083C42B1[] = _("WKーSCENEーCAVEーD1111"); +const u8 gUnknown_Debug_083C42C5[] = _("WKーSCENEーCAVEーD0701"); +const u8 gUnknown_Debug_083C42D9[] = _("WKーSCENEーCAVEーD0808"); +const u8 gUnknown_Debug_083C42ED[] = _("WKーSCENEーCAVEーD1602"); +const u8 gUnknown_Debug_083C4301[] = _("WKーSCENEーCAVEーD0101"); +const u8 gUnknown_Debug_083C4315[] = _("WKーSCENEーCAVEーD1301"); + +const struct MenuAction gUnknown_Debug_083C432C[] = { + {gUnknown_Debug_083C3D50, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3D64, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3D78, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3D8C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3DA0, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3DAE, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3DC2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3DD6, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C436C[] = { + {gUnknown_Debug_083C3DED, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3E01, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3E15, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3E29, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3E3D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3E51, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3E65, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3E79, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3E8D, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C43B4[] = { + {gUnknown_Debug_083C3EA1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3EB5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3EC9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3EDD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3EF1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3F05, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3F19, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3F2D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3F41, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C43FC[] = { + {gUnknown_Debug_083C3F55, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3F69, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3F7D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3F91, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3FA5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3FB9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3FCD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3FE1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C3FF5, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C4444[] = { + {gUnknown_Debug_083C4009, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C401D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4031, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4045, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4059, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C406D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4081, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4095, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C40A9, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C448C[] = { + {gUnknown_Debug_083C40BD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C40D1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C40E5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C40F9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C410D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4121, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4135, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_83C44C4[] = { + {gUnknown_Debug_083C4149, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C415D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4171, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4185, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4199, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_83C44EC[] = { + {gUnknown_Debug_083C41C1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C41D5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C41E9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C41FD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4211, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4225, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4239, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C424D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4261, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C4534[] = { + {gUnknown_Debug_083C4275, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4289, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C429D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C42B1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C42C5, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C42D9, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C42ED, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4301, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4315, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C457C[] = {8, 9, 9, 9, 9, 7, 6, 9, 9}; + +const u16 gUnknown_Debug_083C4586[][9] = { + {0x4050, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4056, 0x40C7, 0x0000}, + {0x4057, 0x4058, 0x4059, 0x405A, 0x405B, 0x405C, 0x405D, 0x405E, 0x405F}, + {0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, 0x4068}, + {0x4069, 0x406A, 0x406B, 0x406C, 0x406D, 0x406E, 0x406F, 0x4070, 0x4071}, + {0x4072, 0x4073, 0x4074, 0x4075, 0x4076, 0x4077, 0x4078, 0x4079, 0x407A}, + {0x407B, 0x407C, 0x407D, 0x407E, 0x407F, 0x4080, 0x4081, 0x0000, 0x0000}, + {0x4082, 0x4083, 0x4084, 0x408C, 0x408D, 0x40C2, 0x0000, 0x0000, 0x0000}, + {0x4085, 0x408F, 0x4093, 0x4094, 0x4095, 0x40A0, 0x40AA, 0x40C4, 0x40C6}, + {0x4098, 0x409A, 0x409B, 0x40A2, 0x40A8, 0x40B9, 0x40BA, 0x40BF, 0x40C3} +}; + +const u8 gUnknown_Debug_083C4628[] = _("LOCALWORK0ー8"); +const u8 gUnknown_Debug_083C4635[] = _("LOCALWORK9ー15"); + +const struct MenuAction gUnknown_Debug_083C4644[] = { + {gUnknown_Debug_083C4628, debug_sub_808E754}, + {gUnknown_Debug_083C4635, debug_sub_808E7AC} +}; + +const u8 gUnknown_Debug_083C4654[] = _("LOCALWORK0"); +const u8 gUnknown_Debug_083C465F[] = _("LOCALWORK1"); +const u8 gUnknown_Debug_083C466A[] = _("LOCALWORK2"); +const u8 gUnknown_Debug_083C4675[] = _("LOCALWORK3"); +const u8 gUnknown_Debug_083C4680[] = _("LOCALWORK4"); +const u8 gUnknown_Debug_083C468B[] = _("LOCALWORK5"); +const u8 gUnknown_Debug_083C4696[] = _("LOCALWORK6"); +const u8 gUnknown_Debug_083C46A1[] = _("LOCALWORK7"); +const u8 gUnknown_Debug_083C46AC[] = _("LOCALWORK8"); + +const u8 gUnknown_Debug_083C46B7[] = _("LOCALWORK9"); +const u8 gUnknown_Debug_083C46C2[] = _("LOCALWORK10"); +const u8 gUnknown_Debug_083C46CE[] = _("LOCALWORK11"); +const u8 gUnknown_Debug_083C46DA[] = _("LOCALWORK12"); +const u8 gUnknown_Debug_083C46E6[] = _("LOCALWORK13"); +const u8 gUnknown_Debug_083C46F2[] = _("LOCALWORK14"); +const u8 gUnknown_Debug_083C46FE[] = _("LOCALWORK15"); + +const struct MenuAction gUnknown_Debug_083C470C[] = { + {gUnknown_Debug_083C4654, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C465F, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C466A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4675, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4680, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C468B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4696, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C46A1, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C46AC, TomomichiDebugMenu_Config} +}; + +const struct MenuAction gUnknown_Debug_083C4754C[] = { + {gUnknown_Debug_083C46B7, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C46C2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C46CE, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C46DA, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C46E6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C46F2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C46FE, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C478C[] = {9, 7}; + +const u16 gUnknown_Debug_083C478E[][9] = { + {0x4000, 0x4001, 0x4002, 0x4003, 0x4004, 0x4005, 0x4006, 0x4007, 0x4008}, + {0x4009, 0x400A, 0x400B, 0x400C, 0x400D, 0x400E, 0x400F} +}; + +const u8 gUnknown_Debug_083C47B2[] = _("Level"); +const u8 gUnknown_Debug_083C47B8[] = _("Scene1"); +const u8 gUnknown_Debug_083C47BF[] = _("Scene2"); +const u8 gUnknown_Debug_083C47C6[] = _("Scene3"); +const u8 gUnknown_Debug_083C47CD[] = _("Scene4"); +const u8 gUnknown_Debug_083C47D4[] = _("Scene5"); +const u8 gUnknown_Debug_083C47DB[] = _("Scene6"); +const u8 gUnknown_Debug_083C47E2[] = _("Scene7"); +const u8 gUnknown_Debug_083C47E9[] = _("Scene8"); + +const struct MenuAction gUnknown_Debug_083C47F0[] = { + {gUnknown_Debug_083C47B8, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C47BF, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C47C6, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C47CD, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C47D4, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C47DB, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C47E2, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C47E9, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C4830[] = _("Trick Master"); +const u8 gUnknown_Debug_083C483D[] = _("Hidden MASTER"); +const u8 gUnknown_Debug_083C484B[] = _("Inside the HOUSE"); +const u8 gUnknown_Debug_083C485C[] = _("Pass a reward"); +const u8 gUnknown_Debug_083C486A[] = _("Rig a trick"); +const u8 gUnknown_Debug_083C4876[] = _("MASTER is gone"); + +const struct MenuAction gUnknown_Debug_083C4888[] = { + {gUnknown_Debug_083C483D, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C484B, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C485C, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C486A, TomomichiDebugMenu_Config}, + {gUnknown_Debug_083C4876, TomomichiDebugMenu_Config} +}; + +const u8 gUnknown_Debug_083C48B0[] = _("PMNICKNAME"); +const u8 gUnknown_Debug_083C48BB[] = _("BREEDER"); + bool8 InitTomomichiDebugWindow(void) { debug_sub_808B874(); -- cgit v1.2.3 From 593a22679d127c880ef729354ce400dab17ee7fc Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Mar 2018 21:13:19 -0400 Subject: through debug_sub_808CEAC --- src/debug/tomomichi_debug_menu.c | 142 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index bc626262f..f572862c3 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -157,6 +157,12 @@ bool8 debug_sub_808DE08(void); bool8 debug_sub_808DE60(void); bool8 debug_sub_808E754(void); bool8 debug_sub_808E7AC(void); +void debug_sub_808CBC0(u8, u8); +bool8 debug_sub_808CCC4(void); +bool8 debug_sub_808CE10(void); +void debug_sub_808CC10(u8); +void debug_sub_808CE5C(u8, u8); +void debug_sub_808CEAC(u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -2638,4 +2644,140 @@ bool8 debug_sub_808CB1C(void) return FALSE; } +bool8 debug_sub_808CB74(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808CBC0(gDebug_0300070F, cursorPos); + debug_sub_808CC10(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808CBC0(u8 whichMenu, u8 cursorPos) +{ + if (gMain.newKeys & R_BUTTON) + { + u16 flag = gUnknown_Debug_083C271A[whichMenu][cursorPos]; + if (!FlagGet(flag)) + FlagSet(flag); + else + FlagClear(flag); + } +} + +void debug_sub_808CC10(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C2710[whichMenu]; i++) + { + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C271A[whichMenu][i]) ? TRUE : FALSE); + } +} + +bool8 debug_sub_808CC74(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1ADC) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1ADC), gUnknown_Debug_083C1ADC); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1ADC), 0, 27); + gMenuCallback = debug_sub_808CCC4; + return FALSE; +} + +bool8 debug_sub_808CCC4(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C1ADC[input].func; + return FALSE; +} + +bool8 debug_sub_808CD08(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1B7C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1B7C), gUnknown_Debug_083C1B7C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1B7C), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808CE10; + return FALSE; +} + +bool8 debug_sub_808CD60(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1BF0) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1BF0), gUnknown_Debug_083C1BF0); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1BF0), 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808CE10; + return FALSE; +} + +bool8 debug_sub_808CDB8(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1C2C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1C2C), gUnknown_Debug_083C1C2C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1C2C), 0, 28); + gDebug_0300070F = 2; + gMenuCallback = debug_sub_808CE10; + return FALSE; +} + +bool8 debug_sub_808CE10(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808CE5C(gDebug_0300070F, cursorPos); + debug_sub_808CEAC(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808CE5C(u8 whichMenu, u8 cursorPos) +{ + if (gMain.newKeys & R_BUTTON) + { + u16 flag = gUnknown_Debug_083C1C38[whichMenu][cursorPos]; + if (!FlagGet(flag)) + FlagSet(flag); + else + FlagClear(flag); + } +} + +void debug_sub_808CEAC(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C1C34[whichMenu]; i++) + { + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1C38[whichMenu][i]) ? TRUE : FALSE); + } +} + #endif -- cgit v1.2.3 From c710d746a1bae3342a3065595afea75d0348bcbd Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Mar 2018 21:35:29 -0400 Subject: through debug_sub_808D264 --- src/debug/tomomichi_debug_menu.c | 126 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index f572862c3..93b17a1f8 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -163,6 +163,8 @@ bool8 debug_sub_808CE10(void); void debug_sub_808CC10(u8); void debug_sub_808CE5C(u8, u8); void debug_sub_808CEAC(u8); +bool8 debug_sub_808CF60(void); +bool8 debug_sub_808D2BC(void); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -2780,4 +2782,128 @@ void debug_sub_808CEAC(u8 whichMenu) } } +bool8 debug_sub_808CF10(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1330) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1330), gUnknown_Debug_083C1330); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1330), 0, 27); + gMenuCallback = debug_sub_808CF60; + return FALSE; +} + +bool8 debug_sub_808CF60(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C1330[input].func; + return FALSE; +} + +bool8 debug_sub_808CFA4(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C13D8) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C13D8), gUnknown_Debug_083C13D8); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C13D8), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + +bool8 debug_sub_808CFFC(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1465) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1465), gUnknown_Debug_083C1465); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1465), 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + +bool8 debug_sub_808D054(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1503) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1503), gUnknown_Debug_083C1503); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1503), 0, 28); + gDebug_0300070F = 2; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + +bool8 debug_sub_808D0AC(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C158A) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C158A), gUnknown_Debug_083C158A); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C158A), 0, 28); + gDebug_0300070F = 3; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + +bool8 debug_sub_808D104(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1647) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1647), gUnknown_Debug_083C1647); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1647), 0, 28); + gDebug_0300070F = 4; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + +bool8 debug_sub_808D15C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1712) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1712), gUnknown_Debug_083C1712); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1712), 0, 28); + gDebug_0300070F = 5; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + +bool8 debug_sub_808D1B4(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C17F8) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C17F8), gUnknown_Debug_083C17F8); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C17F8), 0, 28); + gDebug_0300070F = 6; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + +bool8 debug_sub_808D20C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); + Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C18B8); + InitMenu(0, 1, 1, 7, 0, 28); + gDebug_0300070F = 7; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + +bool8 debug_sub_808D264(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1); + Menu_PrintItems(2, 1, 5, gDebug_0x83C1974); + InitMenu(0, 1, 1, 5, 0, 28); + gDebug_0300070F = 8; + gMenuCallback = debug_sub_808D2BC; + return FALSE; +} + #endif -- cgit v1.2.3 From aa1e7c8cd89bde9fd044ed12cdce294e0d3ba53d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Mar 2018 22:32:35 -0400 Subject: through debug_sub_808D358 --- src/debug/tomomichi_debug_menu.c | 63 +++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 93b17a1f8..4d2d234bf 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -162,9 +162,11 @@ bool8 debug_sub_808CCC4(void); bool8 debug_sub_808CE10(void); void debug_sub_808CC10(u8); void debug_sub_808CE5C(u8, u8); -void debug_sub_808CEAC(u8); bool8 debug_sub_808CF60(void); bool8 debug_sub_808D2BC(void); +void debug_sub_808CEAC(u8); +void debug_sub_808D308(u8, u8); +void debug_sub_808D358(u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -2504,11 +2506,10 @@ void debug_sub_808C714(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { - u16 flag = gUnknown_Debug_83C31E6[whichMenu][cursorPos]; - if (!FlagGet(flag)) - FlagSet(flag); + if (!FlagGet(gUnknown_Debug_83C31E6[whichMenu][cursorPos])) + FlagSet(gUnknown_Debug_83C31E6[whichMenu][cursorPos]); else - FlagClear(flag); + FlagClear(gUnknown_Debug_83C31E6[whichMenu][cursorPos]); } } @@ -2667,11 +2668,10 @@ void debug_sub_808CBC0(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { - u16 flag = gUnknown_Debug_083C271A[whichMenu][cursorPos]; - if (!FlagGet(flag)) - FlagSet(flag); + if (!FlagGet(gUnknown_Debug_083C271A[whichMenu][cursorPos])) + FlagSet(gUnknown_Debug_083C271A[whichMenu][cursorPos]); else - FlagClear(flag); + FlagClear(gUnknown_Debug_083C271A[whichMenu][cursorPos]); } } @@ -2764,11 +2764,10 @@ void debug_sub_808CE5C(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { - u16 flag = gUnknown_Debug_083C1C38[whichMenu][cursorPos]; - if (!FlagGet(flag)) - FlagSet(flag); + if (!FlagGet(gUnknown_Debug_083C1C38[whichMenu][cursorPos])) + FlagSet(gUnknown_Debug_083C1C38[whichMenu][cursorPos]); else - FlagClear(flag); + FlagClear(gUnknown_Debug_083C1C38[whichMenu][cursorPos]); } } @@ -2906,4 +2905,42 @@ bool8 debug_sub_808D264(void) return FALSE; } +bool8 debug_sub_808D2BC(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808D308(gDebug_0300070F, cursorPos); + debug_sub_808D358(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808D308(u8 whichMenu, u8 cursorPos) +{ + if (gMain.newKeys & R_BUTTON) + { + if (!FlagGet(gUnknown_Debug_083C19C6[whichMenu][cursorPos])) + FlagSet(gUnknown_Debug_083C19C6[whichMenu][cursorPos]); + else + FlagClear(gUnknown_Debug_083C19C6[whichMenu][cursorPos]); + } +} + +void debug_sub_808D358(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C19BC[whichMenu]; i++) + { + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C19C6[whichMenu][i]) ? TRUE : FALSE); + } +} + #endif -- cgit v1.2.3 From 2467956243043cff17fa6636098d5b7e5506f5d7 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Mar 2018 08:25:17 -0400 Subject: through debug_sub_808D59C --- src/debug/tomomichi_debug_menu.c | 93 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 4d2d234bf..f0c11c8d6 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -158,15 +158,19 @@ bool8 debug_sub_808DE60(void); bool8 debug_sub_808E754(void); bool8 debug_sub_808E7AC(void); void debug_sub_808CBC0(u8, u8); +void debug_sub_808CC10(u8); bool8 debug_sub_808CCC4(void); bool8 debug_sub_808CE10(void); -void debug_sub_808CC10(u8); void debug_sub_808CE5C(u8, u8); +void debug_sub_808CEAC(u8); bool8 debug_sub_808CF60(void); bool8 debug_sub_808D2BC(void); -void debug_sub_808CEAC(u8); void debug_sub_808D308(u8, u8); void debug_sub_808D358(u8); +bool8 debug_sub_808D40C(void); +bool8 debug_sub_808D500(void); +void debug_sub_808D54C(u8, u8); +void debug_sub_808D59C(u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -2943,4 +2947,89 @@ void debug_sub_808D358(u8 whichMenu) } } +bool8 debug_sub_808D3BC(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C105C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C105C), gUnknown_Debug_083C105C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C105C), 0, 27); + gMenuCallback = debug_sub_808D40C; + return FALSE; +} + +bool8 debug_sub_808D40C(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C105C[input].func; + return FALSE; +} + +bool8 debug_sub_808D450(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C10BD) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C10BD), gUnknown_Debug_083C10BD); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C10BD), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808D500; + return FALSE; +} + +bool8 debug_sub_808D4A8(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); + Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C1149); + InitMenu(0, 1, 1, 7, 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808D500; + return FALSE; +} + +bool8 debug_sub_808D500(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808D54C(gDebug_0300070F, cursorPos); + debug_sub_808D59C(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808D54C(u8 whichMenu, u8 cursorPos) +{ + if (gMain.newKeys & R_BUTTON) + { + if (!FlagGet(gUnknown_Debug_083C1196[whichMenu][cursorPos])) + FlagSet(gUnknown_Debug_083C1196[whichMenu][cursorPos]); + else + FlagClear(gUnknown_Debug_083C1196[whichMenu][cursorPos]); + } +} + +void debug_sub_808D59C(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C1194[whichMenu]; i++) + { + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1196[whichMenu][i]) ? TRUE : FALSE); + } +} + #endif -- cgit v1.2.3 From d5ccd132e0043405bae5337919c8678817417b4c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Mar 2018 08:28:40 -0400 Subject: through debug_sub_808D7E0 --- src/debug/tomomichi_debug_menu.c | 89 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index f0c11c8d6..0c72b8e66 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -171,6 +171,10 @@ bool8 debug_sub_808D40C(void); bool8 debug_sub_808D500(void); void debug_sub_808D54C(u8, u8); void debug_sub_808D59C(u8); +bool8 debug_sub_808D650(void); +bool8 debug_sub_808D744(void); +void debug_sub_808D790(u8, u8); +void debug_sub_808D7E0(u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -3032,4 +3036,89 @@ void debug_sub_808D59C(u8 whichMenu) } } +bool8 debug_sub_808D600(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C11CC) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C11CC), gUnknown_Debug_083C11CC); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C11CC), 0, 27); + gMenuCallback = debug_sub_808D650; + return FALSE; +} + +bool8 debug_sub_808D650(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C11CC[input].func; + return FALSE; +} + +bool8 debug_sub_808D694(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1212) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1212), gUnknown_Debug_083C1212); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1212), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808D744; + return FALSE; +} + +bool8 debug_sub_808D6EC(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); + Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C1288); + InitMenu(0, 1, 1, 7, 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808D744; + return FALSE; +} + +bool8 debug_sub_808D744(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808D790(gDebug_0300070F, cursorPos); + debug_sub_808D7E0(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808D790(u8 whichMenu, u8 cursorPos) +{ + if (gMain.newKeys & R_BUTTON) + { + if (!FlagGet(gUnknown_Debug_083C12D2[whichMenu][cursorPos])) + FlagSet(gUnknown_Debug_083C12D2[whichMenu][cursorPos]); + else + FlagClear(gUnknown_Debug_083C12D2[whichMenu][cursorPos]); + } +} + +void debug_sub_808D7E0(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C12D0[whichMenu]; i++) + { + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C12D2[whichMenu][i]) ? TRUE : FALSE); + } +} + #endif -- cgit v1.2.3 From 017d462feddbf3101c22c8d95901c1ad50f8f406 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Mar 2018 23:21:23 -0400 Subject: through debug_sub_808DF64 --- src/debug/tomomichi_debug_menu.c | 359 +++++++++++++++++++++++++++++++++++---- 1 file changed, 329 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 0c72b8e66..03c520018 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -175,6 +175,18 @@ bool8 debug_sub_808D650(void); bool8 debug_sub_808D744(void); void debug_sub_808D790(u8, u8); void debug_sub_808D7E0(u8); +bool8 debug_sub_808D894(void); +bool8 debug_sub_808D930(void); +void debug_sub_808D97C(u8, u8); +void debug_sub_808D9CC(u8); +bool8 debug_sub_808DA80(void); +void debug_sub_808DAD4(void); +void debug_sub_808DABC(void); +void debug_sub_808F31C(u8, u8, u16); +bool8 debug_sub_808DB5C(void); +bool8 debug_sub_808DEB8(void); +void debug_sub_808DF64(u8, u8); +void debug_sub_808DF04(u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -1308,11 +1320,11 @@ const struct MenuAction gUnknown_Debug_083C351C[] = { const u8 gUnknown_Debug_083C3544[] = {3, 2, 6, 9, 5}; const u16 gUnknown_Debug_083C354A[][9] = { - {0x4027, 0x4028, 0x4029}, - {0x4047, 0x404F}, - {0x4021, 0x4022, 0x4048, 0x404A, 0x402A, 0x402B}, - {0x4020, 0x4023, 0x4024, 0x4025, 0x4040, 0x4041, 0x4042, 0x4044, 0x4045}, - {0x4046, 0x4049, 0x404B, 0x404C, 0x4026} + {VAR_CYCLING_ROAD_RECORD_COLLISIONS, VAR_CYCLING_ROAD_RECORD_TIME_L, VAR_CYCLING_ROAD_RECORD_TIME_H}, + {VAR_SHROOMISH_SIZE_RECORD, VAR_BARBOACH_SIZE_RECORD}, + {VAR_REPEL_STEP_COUNT, VAR_ICE_STEP_COUNT, VAR_ASH_GATHER_COUNT, VAR_CRUISE_STEP_COUNT, VAR_HAPPINESS_STEP_COUNTER, VAR_POISON_STEP_COUNTER}, + {VAR_RECYCLE_GOODS, VAR_STARTER_MON, VAR_MIRAGE_RND_H, VAR_MIRAGE_RND_L, VAR_DAYS, VAR_FANCLUB_UNKNOWN_1, VAR_FANCLUB_UNKNOWN_2, VAR_TRICK_HOUSE_ROOMS_COMPLETED, VAR_LOTTERY_PRIZE}, + {VAR_NATIONAL_DEX, VAR_BIRCH_STATE, VAR_LOTTERY_RND_L, VAR_LOTTERY_RND_H, VAR_SECRET_BASE_MAP} }; const u8 gUnknown_Debug_083C35A4[] = _("OBJCHRWORK0ー8"); @@ -1366,8 +1378,8 @@ const struct MenuAction gUnknown_Debug_083C36E4[] = { const u8 gUnknown_Debug_083C371C[] = {9, 7}; const u16 gUnknown_Debug_083C371E[][9] = { - {0x4010, 0x4011, 0x4012, 0x4013, 0x4014, 0x4015, 0x4016, 0x4017, 0x4018}, - {0x4019, 0x401A, 0x401B, 0x401C, 0x401D, 0x401E, 0x401F} + {VAR_OBJ_GFX_ID_0, VAR_OBJ_GFX_ID_1, VAR_OBJ_GFX_ID_2, VAR_OBJ_GFX_ID_3, VAR_OBJ_GFX_ID_4, VAR_OBJ_GFX_ID_5, VAR_OBJ_GFX_ID_6, VAR_OBJ_GFX_ID_7, VAR_OBJ_GFX_ID_8}, + {VAR_OBJ_GFX_ID_9, VAR_OBJ_GFX_ID_A, VAR_OBJ_GFX_ID_B, VAR_OBJ_GFX_ID_C, VAR_OBJ_GFX_ID_D, VAR_OBJ_GFX_ID_E, VAR_OBJ_GFX_ID_F} }; const u8 gUnknown_Debug_083C3742[] = _("SP"); @@ -1520,12 +1532,12 @@ const struct MenuAction gUnknown_Debug_83C3C00[] = { const u8 gUnknown_Debug_083C3C48[] = {6, 5, 9, 2, 9, 6}; const u16 gUnknown_Debug_83C3C4E[][9] = { - {0x4086, 0x4087, 0x4088, 0x408A, 0x4092, 0x40B4}, - {0x40A6, 0x40C1, 0x40B5, 0x40A7, 0x40A5}, - {0x40AB, 0x40AC, 0x40AD, 0x40AE, 0x40AF, 0x40B0, 0x40B1, 0x40B2, 0x40B6}, - {0x4090, 0x40BE}, - {0x4089, 0x408E, 0x4096, 0x4097, 0x4099, 0x409C, 0x40A3, 0x40A4, 0x40A9}, - {0x40B3, 0x40B7, 0x40BB, 0x40BC, 0x40C0, 0x40C5} + {VAR_LINK_CONTEST_ROOM_STATE, VAR_CABLE_CLUB_STATE, VAR_CONTEST_LOCATION, VAR_CONTEST_PRIZE_PICKUP, VAR_LITTLEROOT_INTRO_STATE, VAR_PORTHOLE_STATE}, + {VAR_TRICK_HOUSE_ENTRANCE_STATE_2, VAR_TRICK_HOUSE_PRIZE_PICKUP, VAR_TRICK_HOUSE_STATE, VAR_TRICK_HOUSE_ENTRANCE_STATE_3, VAR_TRICK_HOUSE_ENTRANCE_STATE}, + {VAR_TRICK_HOUSE_PUZZLE_1_STATE, VAR_TRICK_HOUSE_PUZZLE_2_STATE, VAR_TRICK_HOUSE_PUZZLE_3_STATE, VAR_TRICK_HOUSE_PUZZLE_4_STATE, VAR_TRICK_HOUSE_PUZZLE_5_STATE, VAR_TRICK_HOUSE_PUZZLE_6_STATE, VAR_TRICK_HOUSE_PUZZLE_7_STATE, VAR_TRICK_HOUSE_PUZZLE_8_STATE, VAR_TRICK_HOUSE_PUZZLE_7_STATE_2}, + {VAR_BRINEY_HOUSE_STATE, VAR_GLASS_WORKSHOP_STATE}, + {VAR_0x4089, VAR_BOARD_BRINEY_BOAT_ROUTE104_STATE, VAR_BRINEY_LOCATION, VAR_0x4097, VAR_LILYCOVE_CONTEST_LOBBY_STATE, VAR_ELITE_4_STATE, VAR_CABLE_CAR_STATION_STATE, VAR_SAFARI_ZONE_STATE, VAR_CYCLING_CHALLENGE_STATE}, + {VAR_WEATHER_INSTITUTE_STATE, VAR_SLATEPORT_FAN_CLUB_STATE, 0x40BB, VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, VAR_GAME_CORNER_STATE, VAR_WHICH_FOSSIL_REVIVED} }; const u8 gUnknown_Debug_083C3CBA[] = _("タウン"); @@ -1738,15 +1750,15 @@ const struct MenuAction gUnknown_Debug_083C4534[] = { const u8 gUnknown_Debug_083C457C[] = {8, 9, 9, 9, 9, 7, 6, 9, 9}; const u16 gUnknown_Debug_083C4586[][9] = { - {0x4050, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4056, 0x40C7, 0x0000}, - {0x4057, 0x4058, 0x4059, 0x405A, 0x405B, 0x405C, 0x405D, 0x405E, 0x405F}, - {0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, 0x4068}, - {0x4069, 0x406A, 0x406B, 0x406C, 0x406D, 0x406E, 0x406F, 0x4070, 0x4071}, - {0x4072, 0x4073, 0x4074, 0x4075, 0x4076, 0x4077, 0x4078, 0x4079, 0x407A}, - {0x407B, 0x407C, 0x407D, 0x407E, 0x407F, 0x4080, 0x4081, 0x0000, 0x0000}, - {0x4082, 0x4083, 0x4084, 0x408C, 0x408D, 0x40C2, 0x0000, 0x0000, 0x0000}, - {0x4085, 0x408F, 0x4093, 0x4094, 0x4095, 0x40A0, 0x40AA, 0x40C4, 0x40C6}, - {0x4098, 0x409A, 0x409B, 0x40A2, 0x40A8, 0x40B9, 0x40BA, 0x40BF, 0x40C3} + {VAR_LITTLEROOT_STATE, VAR_ROUTE102_ACCESSIBLE, 0x4052, VAR_LAVARIDGE_RIVAL_STATE, VAR_CURRENT_SECRET_BASE, 0x4055, 0x4056, VAR_OLDALE_STATE}, + {VAR_PETALBURG_STATE, VAR_SLATEPORT_STATE, 0x4059, VAR_RUSTBORO_STATE, 0x405B, 0x405C, 0x405D, VAR_SOOTOPOLIS_STATE, 0x405F}, + {VAR_ROUTE101_STATE, 0x4061, VAR_ROUTE103_STATE, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, 0x4068}, + {VAR_ROUTE110_STATE, 0x406A, 0x406B, 0x406C, 0x406D, 0x406E, VAR_ROUTE116_STATE, 0x4070, VAR_ROUTE118_STATE}, + {VAR_ROUTE119_STATE, 0x4073, VAR_ROUTE121_STATE, 0x4075, 0x4076, 0x4077, 0x4078, 0x4079, 0x407A}, + {VAR_ROUTE128_STATE, 0x407C, 0x407D, 0x407E, 0x407F, 0x4080, 0x4081}, + {VAR_LITTLEROOT_HOUSES_STATE, 0x4083, VAR_BIRCH_LAB_STATE, VAR_LITTLEROOT_HOUSES_STATE_2, VAR_LITTLEROOT_RIVAL_STATE, VAR_PACIFIDLOG_TM_RECEIVED_DAY}, + {VAR_PETALBURG_GYM_STATE, VAR_DEVON_CORP_3F_STATE, VAR_MAUVILLE_GYM_STATE, VAR_LILYCOVE_MUSEUM_2F_STATE, VAR_LILYCOVE_FAN_CLUB_STATE, VAR_SLATEPORT_HARBOR_STATE, VAR_SLATEPORT_MUSEUM_1F_STATE, VAR_FOSSIL_RESURRECTION_STATE, VAR_STEVENS_HOUSE_STATE}, + {VAR_PETALBURG_WOODS_STATE, VAR_RUSTURF_TUNNEL_STATE, VAR_CAVE_OF_ORIGIN_B4F_STATE, VAR_SEAFLOOR_CAVERN_STATE, 0x40A8, VAR_MT_PYRE_STATE, VAR_NEW_MAUVILLE_STATE, VAR_METEOR_FALLS_STATE, VAR_VICTORY_ROAD_1F_STATE} }; const u8 gUnknown_Debug_083C4628[] = _("LOCALWORK0ー8"); @@ -1800,8 +1812,8 @@ const struct MenuAction gUnknown_Debug_083C4754C[] = { const u8 gUnknown_Debug_083C478C[] = {9, 7}; const u16 gUnknown_Debug_083C478E[][9] = { - {0x4000, 0x4001, 0x4002, 0x4003, 0x4004, 0x4005, 0x4006, 0x4007, 0x4008}, - {0x4009, 0x400A, 0x400B, 0x400C, 0x400D, 0x400E, 0x400F} + {VAR_TEMP_0, VAR_TEMP_1, VAR_TEMP_2, VAR_TEMP_3, VAR_TEMP_4, VAR_TEMP_5, VAR_TEMP_6, VAR_TEMP_7, VAR_TEMP_8}, + {VAR_TEMP_9, VAR_TEMP_A, VAR_TEMP_B, VAR_TEMP_C, VAR_TEMP_D, VAR_TEMP_E, VAR_TEMP_F} }; const u8 gUnknown_Debug_083C47B2[] = _("Level"); @@ -2527,7 +2539,7 @@ void debug_sub_808C764(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C31DC[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_83C31E6[whichMenu][i]) ? TRUE : FALSE); + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_83C31E6[whichMenu][i]) ? 1 : 0); } } @@ -2689,7 +2701,7 @@ void debug_sub_808CC10(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C2710[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C271A[whichMenu][i]) ? TRUE : FALSE); + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C271A[whichMenu][i]) ? 1 : 0); } } @@ -2785,7 +2797,7 @@ void debug_sub_808CEAC(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C1C34[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1C38[whichMenu][i]) ? TRUE : FALSE); + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1C38[whichMenu][i]) ? 1 : 0); } } @@ -2947,7 +2959,7 @@ void debug_sub_808D358(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C19BC[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C19C6[whichMenu][i]) ? TRUE : FALSE); + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C19C6[whichMenu][i]) ? 1 : 0); } } @@ -3032,7 +3044,7 @@ void debug_sub_808D59C(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C1194[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1196[whichMenu][i]) ? TRUE : FALSE); + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1196[whichMenu][i]) ? 1 : 0); } } @@ -3117,8 +3129,295 @@ void debug_sub_808D7E0(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C12D0[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C12D2[whichMenu][i]) ? TRUE : FALSE); + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C12D2[whichMenu][i]) ? 1 : 0); } } +bool8 debug_sub_808D844(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1A78) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1A78), gUnknown_Debug_083C1A78); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1A78), 0, 27); + gMenuCallback = debug_sub_808D894; + return FALSE; +} + +bool8 debug_sub_808D894(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C1A78[input].func; + return FALSE; +} + +bool8 debug_sub_808D8D8(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1A9C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1A9C), gUnknown_Debug_083C1A9C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1A9C), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808D930; + return FALSE; +} + +bool8 debug_sub_808D930(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808D97C(gDebug_0300070F, cursorPos); + debug_sub_808D9CC(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808D97C(u8 whichMenu, u8 cursorPos) +{ + if (gMain.newKeys & R_BUTTON) + { + if (!FlagGet(gUnknown_Debug_083C1AAE[whichMenu][cursorPos])) + FlagSet(gUnknown_Debug_083C1AAE[whichMenu][cursorPos]); + else + FlagClear(gUnknown_Debug_083C1AAE[whichMenu][cursorPos]); + } +} + +void debug_sub_808D9CC(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C1AAC[whichMenu]; i++) + { + debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1AAE[whichMenu][i]) ? 1 : 0); + } +} + +bool8 debug_sub_808DA30(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C103A) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C103A), gUnknown_Debug_083C103A); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C103A), 0, 28); + gMenuCallback = debug_sub_808DA80; + return FALSE; +} + +bool8 debug_sub_808DA80(void) +{ + s8 input = Menu_ProcessInput(); + /*s8 cursorPos = */Menu_GetCursorPos(); + + debug_sub_808DAD4(); + debug_sub_808DABC(); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808DABC(void) +{ + debug_sub_808F31C(24, 1, gSpecialVar_Result); +} + +void debug_sub_808DAD4(void) +{ + u16 delta; + + if (gMain.newKeys & R_BUTTON) + { + delta = +1; + } + else if (gMain.newKeys & L_BUTTON) + { + delta = -1; + } + else + return; + gSpecialVar_Result += delta; +} + +bool8 debug_sub_808DB0C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C3D08) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3D08), gUnknown_Debug_083C3D08); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3D08), 0, 23); + gMenuCallback = debug_sub_808DB5C; + return FALSE; +} + +bool8 debug_sub_808DB5C(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C3D08[input].func; + return FALSE; +} + +bool8 debug_sub_808DBA0(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C432C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C432C), gUnknown_Debug_083C432C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C432C), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DBF8(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C436C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C436C), gUnknown_Debug_083C436C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C436C), 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DC50(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C43B4) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C43B4), gUnknown_Debug_083C43B4); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C43B4), 0, 28); + gDebug_0300070F = 2; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DCA8(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C43FC) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C43FC), gUnknown_Debug_083C43FC); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C43FC), 0, 28); + gDebug_0300070F = 3; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DD00(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4444) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4444), gUnknown_Debug_083C4444); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4444), 0, 28); + gDebug_0300070F = 4; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DD58(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C448C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C448C), gUnknown_Debug_083C448C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C448C), 0, 28); + gDebug_0300070F = 5; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DDB0(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); + Menu_PrintItems(2, 1, 6, gUnknown_Debug_83C44C4); // overflows into the next menu + InitMenu(0, 1, 1, 6, 0, 28); + gDebug_0300070F = 6; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DE08(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C44EC) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C44EC), gUnknown_Debug_83C44EC); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C44EC), 0, 28); + gDebug_0300070F = 7; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DE60(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4534) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4534), gUnknown_Debug_083C4534); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4534), 0, 28); + gDebug_0300070F = 8; + gMenuCallback = debug_sub_808DEB8; + return FALSE; +} + +bool8 debug_sub_808DEB8(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808DF64(gDebug_0300070F, cursorPos); + debug_sub_808DF04(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808DF04(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C457C[whichMenu]; i++) + { + debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_083C4586[whichMenu][i])); + } +} + +void debug_sub_808DF64(u8 whichMenu, u8 cursorPos) +{ + u16 delta; + + if (gMain.newKeys & R_BUTTON) + delta = +1; + else if (gMain.newKeys & L_BUTTON) + delta = -1; + else + return; + VarSet(gUnknown_Debug_083C4586[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C4586[whichMenu][cursorPos]) + delta); +} + #endif -- cgit v1.2.3 From 187bc5f6a17ca53390fa95d9ec836fcc228d4b03 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Mar 2018 23:37:16 -0400 Subject: through debug_sub_808E310 --- src/debug/tomomichi_debug_menu.c | 135 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 03c520018..b741436a2 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -187,6 +187,10 @@ bool8 debug_sub_808DB5C(void); bool8 debug_sub_808DEB8(void); void debug_sub_808DF64(u8, u8); void debug_sub_808DF04(u8); +bool8 debug_sub_808E010(void); +bool8 debug_sub_808E264(void); +void debug_sub_808E310(u8, u8); +void debug_sub_808E2B0(u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -3420,4 +3424,135 @@ void debug_sub_808DF64(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_083C4586[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C4586[whichMenu][cursorPos]) + delta); } +bool8 debug_sub_808DFC0(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C377C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C377C), gUnknown_Debug_083C377C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C377C), 0, 23); + gMenuCallback = debug_sub_808E010; + return FALSE; +} + +bool8 debug_sub_808E010(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C377C[input].func; + return FALSE; +} + +bool8 debug_sub_808E054(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); + Menu_PrintItems(2, 1, 6, gUnknown_Debug_083C3AA0); + InitMenu(0, 1, 1, 6, 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808E264; + return FALSE; +} + +bool8 debug_sub_808E0AC(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1); + Menu_PrintItems(2, 1, 5, gUnknown_Debug_83C3AE0); + InitMenu(0, 1, 1, 5, 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808E264; + return FALSE; +} + +bool8 debug_sub_808E104(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3B28) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C3B28), gUnknown_Debug_83C3B28); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C3B28), 0, 28); + gDebug_0300070F = 2; + gMenuCallback = debug_sub_808E264; + return FALSE; +} + +bool8 debug_sub_808E15C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 2 + 1); + Menu_PrintItems(2, 1, 2, gUnknown_Debug_83C3B70); + InitMenu(0, 1, 1, 2, 0, 28); + gDebug_0300070F = 3; + gMenuCallback = debug_sub_808E264; + return FALSE; +} + +bool8 debug_sub_808E1B4(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3BB8) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C3BB8), gUnknown_Debug_83C3BB8); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C3BB8), 0, 28); + gDebug_0300070F = 4; + gMenuCallback = debug_sub_808E264; + return FALSE; +} + +bool8 debug_sub_808E20C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); + Menu_PrintItems(2, 1, 6, gUnknown_Debug_83C3C00); + InitMenu(0, 1, 1, 6, 0, 28); + gDebug_0300070F = 5; + gMenuCallback = debug_sub_808E264; + return FALSE; +} + +bool8 debug_sub_808E264(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808E310(gDebug_0300070F, cursorPos); + debug_sub_808E2B0(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808E2B0(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C3C48[whichMenu]; i++) + { + debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_83C3C4E[whichMenu][i])); + } +} + +void debug_sub_808E310(u8 whichMenu, u8 cursorPos) +{ + u16 delta; + + if (gMain.newKeys & R_BUTTON) + delta = +1; + else if (gMain.newKeys & L_BUTTON) + delta = -1; + else + return; + VarSet(gUnknown_Debug_83C3C4E[whichMenu][cursorPos], VarGet(gUnknown_Debug_83C3C4E[whichMenu][cursorPos]) + delta); +} + #endif -- cgit v1.2.3 From 7705a3d44fe4c0f282eee51380f11fd936f642ca Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Mar 2018 23:50:06 -0400 Subject: through debug_sub_808E660 --- src/debug/tomomichi_debug_menu.c | 124 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index b741436a2..a2dcbabae 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -191,6 +191,10 @@ bool8 debug_sub_808E010(void); bool8 debug_sub_808E264(void); void debug_sub_808E310(u8, u8); void debug_sub_808E2B0(u8); +bool8 debug_sub_808E3BC(void); +bool8 debug_sub_808E5B8(void); +void debug_sub_808E604(u8, u8); +void debug_sub_808E660(u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -3555,4 +3559,124 @@ void debug_sub_808E310(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_83C3C4E[whichMenu][cursorPos], VarGet(gUnknown_Debug_83C3C4E[whichMenu][cursorPos]) + delta); } +bool8 debug_sub_808E36C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C32AC) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C32AC), gUnknown_Debug_083C32AC); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C32AC), 0, 23); + gMenuCallback = debug_sub_808E3BC; + return FALSE; +} + +bool8 debug_sub_808E3BC(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C32AC[input].func; + return FALSE; +} + +bool8 debug_sub_808E400(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C347C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C347C), gUnknown_Debug_083C347C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C347C), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808E5B8; + return FALSE; +} + +bool8 debug_sub_808E458(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C3494) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3494), gUnknown_Debug_083C3494); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3494), 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808E5B8; + return FALSE; +} + +bool8 debug_sub_808E4B0(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C34A4) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C34A4), gUnknown_Debug_083C34A4); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C34A4), 0, 28); + gDebug_0300070F = 2; + gMenuCallback = debug_sub_808E5B8; + return FALSE; +} + +bool8 debug_sub_808E508(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C34D4) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C34D4), gUnknown_Debug_083C34D4); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C34D4), 0, 28); + gDebug_0300070F = 3; + gMenuCallback = debug_sub_808E5B8; + return FALSE; +} + +bool8 debug_sub_808E560(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C351C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C351C), gUnknown_Debug_083C351C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C351C), 0, 28); + gDebug_0300070F = 4; + gMenuCallback = debug_sub_808E5B8; + return FALSE; +} + +bool8 debug_sub_808E5B8(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808E604(gDebug_0300070F, cursorPos); + debug_sub_808E660(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808E604(u8 whichMenu, u8 cursorPos) +{ + u16 delta; + + if (gMain.newAndRepeatedKeys & R_BUTTON) + delta = +1; + else if (gMain.newAndRepeatedKeys & L_BUTTON) + delta = -1; + else + return; + VarSet(gUnknown_Debug_083C354A[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C354A[whichMenu][cursorPos]) + delta); +} + +void debug_sub_808E660(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C3544[whichMenu]; i++) + { + debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_083C354A[whichMenu][i])); + } +} + #endif -- cgit v1.2.3 From 301b0c546e7a8b08333f3988e13a8486eeef850b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Mar 2018 23:55:13 -0400 Subject: through debug_sub_808E8AC --- src/debug/tomomichi_debug_menu.c | 91 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index a2dcbabae..7602885c2 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -195,6 +195,10 @@ bool8 debug_sub_808E3BC(void); bool8 debug_sub_808E5B8(void); void debug_sub_808E604(u8, u8); void debug_sub_808E660(u8); +bool8 debug_sub_808E710(void); +bool8 debug_sub_808E804(void); +void debug_sub_808E850(u8, u8); +void debug_sub_808E8AC(u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -3679,4 +3683,91 @@ void debug_sub_808E660(u8 whichMenu) } } +bool8 debug_sub_808E6C0(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C4644) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4644), gUnknown_Debug_083C4644); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4644), 0, 23); + gMenuCallback = debug_sub_808E710; + return FALSE; +} + +bool8 debug_sub_808E710(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C4644[input].func; + return FALSE; +} + +bool8 debug_sub_808E754(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C470C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C470C), gUnknown_Debug_083C470C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C470C), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808E804; + return FALSE; +} + +bool8 debug_sub_808E7AC(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4754C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4754C), gUnknown_Debug_083C4754C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4754C), 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808E804; + return FALSE; +} + +bool8 debug_sub_808E804(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808E850(gDebug_0300070F, cursorPos); + debug_sub_808E8AC(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808E850(u8 whichMenu, u8 cursorPos) +{ + u16 delta; + + if (gMain.newKeys & R_BUTTON) + delta = +1; + else if (gMain.newKeys & L_BUTTON) + delta = -1; + else + return; + VarSet(gUnknown_Debug_083C478E[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C478E[whichMenu][cursorPos]) + delta); +} + +void debug_sub_808E8AC(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C478C[whichMenu]; i++) + { + debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_083C478E[whichMenu][i])); + } +} + #endif -- cgit v1.2.3 From 7e4093ea780cce8bc367aceb7cb7671979928c76 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Mar 2018 23:58:28 -0400 Subject: through debug_sub_808EAFC --- src/debug/tomomichi_debug_menu.c | 91 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 7602885c2..66b6f5add 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -199,6 +199,10 @@ bool8 debug_sub_808E710(void); bool8 debug_sub_808E804(void); void debug_sub_808E850(u8, u8); void debug_sub_808E8AC(u8); +bool8 debug_sub_808E95C(void); +bool8 debug_sub_808EA50(void); +void debug_sub_808EA9C(u8); +void debug_sub_808EAFC(u8, u8); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -3770,4 +3774,91 @@ void debug_sub_808E8AC(u8 whichMenu) } } +bool8 debug_sub_808E90C(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C35C4) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C35C4), gUnknown_Debug_083C35C4); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C35C4), 0, 23); + gMenuCallback = debug_sub_808E95C; + return FALSE; +} + +bool8 debug_sub_808E95C(void) +{ + s8 input = Menu_ProcessInput(); + + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + gMenuCallback = gUnknown_Debug_083C35C4[input].func; + return FALSE; +} + +bool8 debug_sub_808E9A0(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C369C) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C369C), gUnknown_Debug_083C369C); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C369C), 0, 28); + gDebug_0300070F = 0; + gMenuCallback = debug_sub_808EA50; + return FALSE; +} + +bool8 debug_sub_808E9F8(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C36E4) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C36E4), gUnknown_Debug_083C36E4); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C36E4), 0, 28); + gDebug_0300070F = 1; + gMenuCallback = debug_sub_808EA50; + return FALSE; +} + +bool8 debug_sub_808EA50(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + debug_sub_808EAFC(gDebug_0300070F, cursorPos); + debug_sub_808EA9C(gDebug_0300070F); + if (input == -2) + return FALSE; + if (input == -1) + { + CloseMenu(); + return TRUE; + } + return FALSE; +} + +void debug_sub_808EA9C(u8 whichMenu) +{ + u8 i; + + for (i = 0; i < gUnknown_Debug_083C371C[whichMenu]; i++) + { + debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_083C371E[whichMenu][i])); + } +} + +void debug_sub_808EAFC(u8 whichMenu, u8 cursorPos) +{ + u16 delta; + + if (gMain.newKeys & R_BUTTON) + delta = +1; + else if (gMain.newKeys & L_BUTTON) + delta = -1; + else + return; + VarSet(gUnknown_Debug_083C371E[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C371E[whichMenu][cursorPos]) + delta); +} + #endif -- cgit v1.2.3 From d3aab0707b15555e248438ebfbb557f12e24aa3a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 13 Mar 2018 00:11:13 -0400 Subject: through TomomichiDebugMenu_Config --- src/debug/tomomichi_debug_menu.c | 86 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 66b6f5add..fe3b37f34 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -203,6 +203,9 @@ bool8 debug_sub_808E95C(void); bool8 debug_sub_808EA50(void); void debug_sub_808EA9C(u8); void debug_sub_808EAFC(u8, u8); +bool8 debug_sub_808EC10(void); +bool8 debug_sub_808EC5C(void); +bool8 debug_sub_808ECD0(void); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -3861,4 +3864,87 @@ void debug_sub_808EAFC(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_083C371E[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C371E[whichMenu][cursorPos]) + delta); } +bool8 debug_sub_808EB58(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 12, 2 * ARRAY_COUNT(gUnknown_Debug_083C47F0) + 3); + Menu_PrintText(gUnknown_Debug_083C47B2, 1, 1); + Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C47F0), gUnknown_Debug_083C47F0); + InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C47F0), 0, 11); + gMenuCallback = debug_sub_808EC10; + return FALSE; +} + +bool8 debug_sub_808EBB4(void) +{ + Menu_EraseScreen(); + Menu_DrawStdWindowFrame(0, 0, 13, 2 * ARRAY_COUNT(gUnknown_Debug_083C4888) + 3); + Menu_PrintText(gUnknown_Debug_083C4830, 1, 1); + Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C4888), gUnknown_Debug_083C4888); + InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C4888), 0, 12); + gMenuCallback = debug_sub_808EC5C; + return FALSE; +} + +bool8 debug_sub_808EC10(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + if (input == -2) + { + return FALSE; + } + if (input == -1) + { + return FALSE; + } + gSaveBlock1.vars[VAR_TRICK_HOUSE_ROOMS_COMPLETED - VARS_START] = cursorPos; + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808EC5C(void) +{ + s8 input = Menu_ProcessInput(); + s8 cursorPos = Menu_GetCursorPos(); + + if (input == -2) + { + return FALSE; + } + if (input == -1) + { + return FALSE; + } + VarSet(VAR_TRICK_HOUSE_ENTRANCE_STATE_3, cursorPos); + CloseMenu(); + return TRUE; +} + +bool8 debug_sub_808ECA4(void) +{ + BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); + gMenuCallback = debug_sub_808ECD0; + return FALSE; +} + +bool8 debug_sub_808ECD0(void) +{ + if (!UpdatePaletteFade()) + { + CloseMenu(); + debug_sub_808F168(2); + SetMainCallback2(CB2_ContestPainting); + gMain.savedCallback = debug_sub_808B868; + return TRUE; + } + return FALSE; +} + +bool8 TomomichiDebugMenu_Config(void) +{ + return FALSE; +} + #endif -- cgit v1.2.3 From 8ae683d744c77d1fe34a265b80fa03d2dcf26b03 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 13 Mar 2018 00:42:26 -0400 Subject: through debug_sub_808EF14 --- src/debug/tomomichi_debug_menu.c | 135 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index fe3b37f34..68fdc9bd1 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -4,6 +4,7 @@ #include "event_data.h" #include "constants/flags.h" #include "constants/songs.h" +#include "constants/species.h" #include "overworld.h" #include "script.h" #include "menu.h" @@ -3947,4 +3948,138 @@ bool8 TomomichiDebugMenu_Config(void) return FALSE; } +void debug_sub_808ED0C(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (gDebug_03000700 != SPECIES_BULBASAUR) + gDebug_03000700--; + } + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gDebug_03000700 != SPECIES_CHIMECHO) + gDebug_03000700++; + } + if (gMain.newAndRepeatedKeys & L_BUTTON) + { + if (gDebug_03000700 >= SPECIES_BULBASAUR + 10) + gDebug_03000700 -= 10; + else + gDebug_03000700 = SPECIES_BULBASAUR; + } + if (gMain.newAndRepeatedKeys & R_BUTTON) + { + if (gDebug_03000700 <= SPECIES_CHIMECHO - 10) + gDebug_03000700 += 10; + else + gDebug_03000700 = SPECIES_CHIMECHO; + } +} + +void debug_sub_808ED9C(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (gDebug_03000708 != 0) + gDebug_03000708--; + } + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gDebug_03000708 != UINT32_MAX) + gDebug_03000708++; + } + if (gMain.newAndRepeatedKeys & L_BUTTON) + { + if (gDebug_03000708 >= 0x10) + gDebug_03000708 -= 0x10; + else + gDebug_03000708 = 0; + } + if (gMain.newAndRepeatedKeys & R_BUTTON) + { + if (gDebug_03000708 <= UINT32_MAX - 0x10) + gDebug_03000708 += 0x10; + else + gDebug_03000708 = UINT32_MAX; + } + if ((gMain.newKeys & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON)) + { + gDebug_03000708 = UINT32_MAX; + } +} + +void debug_sub_808EE3C(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (gDebug_0300070C != 1) + gDebug_0300070C--; + } + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gDebug_0300070C != 5) + gDebug_0300070C++; + } + if (gMain.newAndRepeatedKeys & L_BUTTON) + gDebug_0300070C = 1; + if (gMain.newAndRepeatedKeys & R_BUTTON) + gDebug_0300070C = 5; +} + +void debug_sub_808EE9C(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (gDebug_0300070D != 1) + gDebug_0300070D--; + } + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gDebug_0300070D != 15) + gDebug_0300070D++; + } + if (gMain.newAndRepeatedKeys & L_BUTTON) + { + if (gDebug_0300070D >= 11) + gDebug_0300070D -= 10; + else + gDebug_0300070D = 0; // Causes underflow when pressing left on the dpad shortly thereafter. + } + if (gMain.newAndRepeatedKeys & R_BUTTON) + { + if (gDebug_0300070D <= 5) + gDebug_0300070D += 10; + else + gDebug_0300070D = 15; + } +} + +void debug_sub_808EF14(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (gDebug_0300070E != 1) + gDebug_0300070E--; + } + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gDebug_0300070E != 15) + gDebug_0300070E++; + } + if (gMain.newAndRepeatedKeys & L_BUTTON) + { + if (gDebug_0300070E >= 11) + gDebug_0300070E -= 10; + else + gDebug_0300070E = 0; // Causes underflow when pressing left on the dpad shortly thereafter. + } + if (gMain.newAndRepeatedKeys & R_BUTTON) + { + if (gDebug_0300070E <= 5) + gDebug_0300070E += 10; + else + gDebug_0300070E = 15; + } +} + #endif -- cgit v1.2.3 From e6c587bd92ad5e4ef5ebceaf8e1b12c399b2c0bf Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 13 Mar 2018 08:24:11 -0400 Subject: nonmatching debug_sub_808EF8C --- src/debug/tomomichi_debug_menu.c | 328 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 326 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 68fdc9bd1..2ce2329d3 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -1,6 +1,7 @@ #if DEBUG #include "global.h" #include "palette.h" +#include "data2.h" #include "event_data.h" #include "constants/flags.h" #include "constants/songs.h" @@ -71,7 +72,7 @@ void debug_sub_808ED9C(void); void debug_sub_808EE3C(void); void debug_sub_808EE9C(void); void debug_sub_808EF14(void); -void debug_sub_808EF8C(u32 a0); +void debug_sub_808EF8C(u8 a0); bool8 debug_sub_808C064(void); bool8 debug_sub_808C0EC(void); bool8 debug_sub_808C104(void); @@ -4082,4 +4083,327 @@ void debug_sub_808EF14(void) } } -#endif +#ifdef NONMATCHING +void debug_sub_808EF8C(u8 a0) +{ + u8 i; + u8 digit; + u16 species; + + switch (a0) + { + case 0: + case 1: + case 2: + for (i = 0; i < 8; i++) + { + digit = (gDebug_03000708 >> (4 * (7 - i))) & 0xf; + if (digit < 10) + gDebug_03000710[i] = digit + CHAR_0; + else + gDebug_03000710[i] = digit + CHAR_A - 10; + } + gDebug_03000710[i] = EOS; + Menu_PrintText(gDebug_03000710, 12, 5); + break; + } + for (i = 0; i < POKEMON_NAME_LENGTH; i++) + { + gDebug_03000710[i + 1] = CHAR_SPACE; + } + + for (i = 0, species = gDebug_03000700; gSpeciesNames[species][i] != EOS && i < POKEMON_NAME_LENGTH; i++) + { + gDebug_03000710[i + 1] = gSpeciesNames[species][i]; + } + + gDebug_03000710[0] = 0xB1; + gDebug_03000710[POKEMON_NAME_LENGTH + 1] = 0xB2; + gDebug_03000710[POKEMON_NAME_LENGTH + 2] = EOS; + switch (a0) + { + case 0: + case 1: + case 2: + Menu_PrintText(gDebug_03000710, 8, 1); + break; + default: + Menu_PrintText(gDebug_03000710, 12, 1); + break; + } + gDebug_03000710[3] = EOS; + gDebug_03000710[0] = gDebug_03000700 / 100 + CHAR_0; + gDebug_03000710[1] = (gDebug_03000700 % 100) / 10 + CHAR_0; + gDebug_03000710[2] = gDebug_03000700 % 10 + CHAR_0; + Menu_PrintText(gDebug_03000710, 12, 3); + + switch (a0) + { + case 0: + gDebug_03000710[0] = gDebug_0300070C / 100 + CHAR_0; + gDebug_03000710[1] = (gDebug_0300070C % 100) / 10 + CHAR_0; + gDebug_03000710[2] = gDebug_0300070C % 10 + CHAR_0; + Menu_PrintText(gDebug_03000710, 12, 7); + break; + case 1: + gDebug_03000710[0] = gDebug_0300070D / 100 + CHAR_0; + gDebug_03000710[1] = (gDebug_0300070D % 100) / 10 + CHAR_0; + gDebug_03000710[2] = gDebug_0300070D % 10 + CHAR_0; + Menu_PrintText(gDebug_03000710, 12, 7); + break; + case 2: + gDebug_03000710[0] = gDebug_0300070E / 100 + CHAR_0; + gDebug_03000710[1] = (gDebug_0300070E % 100) / 10 + CHAR_0; + gDebug_03000710[2] = gDebug_0300070E % 10 + CHAR_0; + Menu_PrintText(gDebug_03000710, 12, 7); + break; + } +} +#else +__attribute__((naked)) void debug_sub_808EF8C(u8 a0) +{ + asm("\tpush\t{r4, r5, r6, r7, lr}\n" + "\tmov\tr7, r8\n" + "\tpush\t{r7}\n" + "\tlsl\tr0, r0, #0x18\n" + "\tlsr\tr6, r0, #0x18\n" + "\tcmp\tr6, #0x2\n" + "\tbgt\t._653\t@cond_branch\n" + "\tcmp\tr6, #0\n" + "\tblt\t._653\t@cond_branch\n" + "\tmov\tr3, #0x0\n" + "\tldr\tr0, ._656 @ gDebug_03000708\n" + "\tmov\tr8, r0\n" + "\tldr\tr4, ._656 + 4 @ gDebug_03000710\n" + "\tmov\tr7, #0x7\n" + "\tmov\tr5, #0xf\n" + "._658:\n" + "\tsub\tr0, r7, r3\n" + "\tlsl\tr0, r0, #0x2\n" + "\tmov\tr1, r8\n" + "\tldr\tr2, [r1]\n" + "\tLSR\tr2, r0\n" + "\tand\tr2, r2, r5\n" + "\tcmp\tr2, #0x9\n" + "\tbhi\t._654\t@cond_branch\n" + "\tadd\tr1, r3, r4\n" + "\tadd\tr0, r2, #0\n" + "\tadd\tr0, r0, #0xa1\n" + "\tb\t._655\n" + "._657:\n" + "\t.align\t2, 0\n" + "._656:\n" + "\t.word\tgDebug_03000708\n" + "\t.word\tgDebug_03000710\n" + "._654:\n" + "\tadd\tr1, r3, r4\n" + "\tadd\tr0, r2, #0\n" + "\tsub\tr0, r0, #0x4f\n" + "._655:\n" + "\tstrb\tr0, [r1]\n" + "\tadd\tr0, r3, #1\n" + "\tlsl\tr0, r0, #0x18\n" + "\tlsr\tr3, r0, #0x18\n" + "\tcmp\tr3, #0x7\n" + "\tbls\t._658\t@cond_branch\n" + "\tldr\tr0, ._666 @ gDebug_03000710\n" + "\tmov\tr1, #0xff\n" + "\tstrb\tr1, [r0, #0x8]\n" + "\tmov\tr1, #0xc\n" + "\tmov\tr2, #0x5\n" + "\tbl\tMenu_PrintText\n" + "._653:\n" + "\tmov\tr3, #0x0\n" + "\tldr\tr7, ._666 @ gDebug_03000710\n" + "\tldr\tr5, ._666 + 4 @ gDebug_03000700\n" + "\tldr\tr2, ._666 + 8 @ gSpeciesNames\n" + "\tmov\tr8, r2\n" + "\tadd\tr4, r7, #0\n" + "\tmov\tr2, #0x0\n" + "._659:\n" + "\tadd\tr1, r3, #1\n" + "\tadd\tr0, r1, r4\n" + "\tstrb\tr2, [r0]\n" + "\tlsl\tr1, r1, #0x18\n" + "\tlsr\tr3, r1, #0x18\n" + "\tcmp\tr3, #0x9\n" + "\tbls\t._659\t@cond_branch\n" + "\tmov\tr3, #0x0\n" + "\tldrh\tr2, [r5]\n" + "\tmov\tr0, #0xb\n" + "\tadd\tr1, r2, #0\n" + "\tmul\tr1, r1, r0\n" + "\tmov\tr2, r8\n" + "\tadd\tr0, r1, r2\n" + "\tldrb\tr0, [r0]\n" + "\tcmp\tr0, #0xff\n" + "\tbeq\t._661\t@cond_branch\n" + "\tldr\tr0, ._666 @ gDebug_03000710\n" + "\tmov\tip, r0\n" + "\tmov\tr5, r8\n" + "\tadd\tr4, r1, #0\n" + "._662:\n" + "\tadd\tr1, r3, #1\n" + "\tmov\tr0, ip\n" + "\tadd\tr2, r1, r0\n" + "\tadd\tr0, r3, r4\n" + "\tadd\tr0, r0, r5\n" + "\tldrb\tr0, [r0]\n" + "\tstrb\tr0, [r2]\n" + "\tlsl\tr1, r1, #0x18\n" + "\tlsr\tr3, r1, #0x18\n" + "\tadd\tr0, r3, r4\n" + "\tadd\tr0, r0, r5\n" + "\tldrb\tr0, [r0]\n" + "\tcmp\tr0, #0xff\n" + "\tbeq\t._661\t@cond_branch\n" + "\tcmp\tr3, #0x9\n" + "\tbls\t._662\t@cond_branch\n" + "._661:\n" + "\tmov\tr0, #0xb1\n" + "\tstrb\tr0, [r7]\n" + "\tmov\tr0, #0xb2\n" + "\tstrb\tr0, [r7, #0xb]\n" + "\tmov\tr0, #0xff\n" + "\tstrb\tr0, [r7, #0xc]\n" + "\tcmp\tr6, #0x2\n" + "\tbgt\t._664\t@cond_branch\n" + "\tcmp\tr6, #0\n" + "\tblt\t._664\t@cond_branch\n" + "\tadd\tr0, r7, #0\n" + "\tmov\tr1, #0x8\n" + "\tmov\tr2, #0x1\n" + "\tbl\tMenu_PrintText\n" + "\tb\t._665\n" + "._667:\n" + "\t.align\t2, 0\n" + "._666:\n" + "\t.word\tgDebug_03000710\n" + "\t.word\tgDebug_03000700\n" + "\t.word\tgSpeciesNames\n" + "._664:\n" + "\tldr\tr0, ._672 @ gDebug_03000710\n" + "\tmov\tr1, #0xc\n" + "\tmov\tr2, #0x1\n" + "\tbl\tMenu_PrintText\n" + "._665:\n" + "\tldr\tr5, ._672 @ gDebug_03000710\n" + "\tmov\tr0, #0xff\n" + "\tstrb\tr0, [r5, #0x3]\n" + "\tldr\tr4, ._672 + 4 @ gDebug_03000700\n" + "\tldrh\tr0, [r4]\n" + "\tmov\tr1, #0x64\n" + "\tbl\t__udivsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5]\n" + "\tldrh\tr0, [r4]\n" + "\tmov\tr1, #0x64\n" + "\tbl\t__umodsi3\n" + "\tlsl\tr0, r0, #0x10\n" + "\tlsr\tr0, r0, #0x10\n" + "\tmov\tr1, #0xa\n" + "\tbl\t__udivsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5, #0x1]\n" + "\tldrh\tr0, [r4]\n" + "\tmov\tr1, #0xa\n" + "\tbl\t__umodsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5, #0x2]\n" + "\tadd\tr0, r5, #0\n" + "\tmov\tr1, #0xc\n" + "\tmov\tr2, #0x3\n" + "\tbl\tMenu_PrintText\n" + "\tcmp\tr6, #0x1\n" + "\tbeq\t._668\t@cond_branch\n" + "\tcmp\tr6, #0x1\n" + "\tbgt\t._669\t@cond_branch\n" + "\tcmp\tr6, #0\n" + "\tbeq\t._670\t@cond_branch\n" + "\tb\t._679\n" + "._673:\n" + "\t.align\t2, 0\n" + "._672:\n" + "\t.word\tgDebug_03000710\n" + "\t.word\tgDebug_03000700\n" + "._669:\n" + "\tcmp\tr6, #0x2\n" + "\tbeq\t._674\t@cond_branch\n" + "\tb\t._679\n" + "._670:\n" + "\tldr\tr4, ._677 @ gDebug_0300070C\n" + "\tb\t._676\n" + "._678:\n" + "\t.align\t2, 0\n" + "._677:\n" + "\t.word\tgDebug_0300070C\n" + "._668:\n" + "\tldr\tr4, ._680 @ gDebug_0300070D\n" + "._676:\n" + "\tldrb\tr0, [r4]\n" + "\tmov\tr1, #0x64\n" + "\tbl\t__udivsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5]\n" + "\tldrb\tr0, [r4]\n" + "\tmov\tr1, #0x64\n" + "\tbl\t__umodsi3\n" + "\tlsl\tr0, r0, #0x18\n" + "\tlsr\tr0, r0, #0x18\n" + "\tmov\tr1, #0xa\n" + "\tbl\t__udivsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5, #0x1]\n" + "\tldrb\tr0, [r4]\n" + "\tmov\tr1, #0xa\n" + "\tbl\t__umodsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5, #0x2]\n" + "\tadd\tr0, r5, #0\n" + "\tmov\tr1, #0xc\n" + "\tmov\tr2, #0x7\n" + "\tbl\tMenu_PrintText\n" + "\tb\t._679\n" + "._681:\n" + "\t.align\t2, 0\n" + "._680:\n" + "\t.word\tgDebug_0300070D\n" + "._674:\n" + "\tldr\tr4, ._682 @ gDebug_0300070E\n" + "\tldrb\tr0, [r4]\n" + "\tmov\tr1, #0x64\n" + "\tbl\t__udivsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5]\n" + "\tldrb\tr0, [r4]\n" + "\tmov\tr1, #0x64\n" + "\tbl\t__umodsi3\n" + "\tlsl\tr0, r0, #0x18\n" + "\tlsr\tr0, r0, #0x18\n" + "\tmov\tr1, #0xa\n" + "\tbl\t__udivsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5, #0x1]\n" + "\tldrb\tr0, [r4]\n" + "\tmov\tr1, #0xa\n" + "\tbl\t__umodsi3\n" + "\tadd\tr0, r0, #0xa1\n" + "\tstrb\tr0, [r5, #0x2]\n" + "\tadd\tr0, r5, #0\n" + "\tmov\tr1, #0xc\n" + "\tmov\tr2, #0x7\n" + "\tbl\tMenu_PrintText\n" + "._679:\n" + "\tpop\t{r3}\n" + "\tmov\tr8, r3\n" + "\tpop\t{r4, r5, r6, r7}\n" + "\tpop\t{r0}\n" + "\tbx\tr0\n" + "._683:\n" + "\t.align\t2, 0\n" + "._682:\n" + "\t.word\tgDebug_0300070E"); +} +#endif // NONMATCHING + +#endif // DEBUG -- cgit v1.2.3 From 3f8fdccac5909e7dc80de42a3fae24ccab45b321 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 13 Mar 2018 08:45:25 -0400 Subject: Complete decompilation of tomomichi_debug_menu --- src/debug/tomomichi_debug_menu.c | 2345 ++++++++++++++++++++------------------ 1 file changed, 1209 insertions(+), 1136 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 2ce2329d3..255fefdce 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -1,5 +1,7 @@ #if DEBUG #include "global.h" +#include "ewram.h" +#include "string_util.h" #include "palette.h" #include "data2.h" #include "event_data.h" @@ -14,200 +16,198 @@ #include "contest_painting.h" #include "sound.h" -// These should be static, uninitialized once it gets decompiled. -#define BSS_DATA __attribute__((section(".bss"))) -BSS_DATA u16 gDebug_03000700 = 0; -BSS_DATA u32 gDebug_03000704 = 0; -BSS_DATA u32 gDebug_03000708 = 0; -BSS_DATA u8 gDebug_0300070C = 0; -BSS_DATA u8 gDebug_0300070D = 0; -BSS_DATA u8 gDebug_0300070E = 0; -BSS_DATA u8 gDebug_0300070F = 0; -BSS_DATA u8 gDebug_03000710[13] = {0}; -BSS_DATA u8 gDebug_0300071D = 0; -BSS_DATA u8 gDebug_0300071E = 0; -BSS_DATA u8 gDebug_0300071F = 0; -BSS_DATA u8 gDebug_03000720 = 0; -BSS_DATA u8 gDebug_03000721 = 0; - -bool8 debug_sub_808B874(void); -bool8 debug_sub_808B8C8(void); -bool8 TomomichiDebugMenu_ContestGraphics(void); -bool8 TomomichiDebugMenu_ArtMusGraphics(void); -bool8 TomomichiDebugMenu_PreviewData(void); -bool8 TomomichiDebugMenu_TrickHouse(void); -bool8 TomomichiDebugMenu_ControlEvents(void); -bool8 TomomichiDebugMenu_ControlFlags(void); -bool8 TomomichiDebugMenu_ControlWorks(void); -bool8 TomomichiDebugMenu_Config(void); -bool8 TomomichiDebugMenu_ContestGraphics_Show(void); -bool8 debug_sub_808BC48(void); -bool8 debug_sub_808BCBC(void); -bool8 TomomichiDebugMenu_MuseumGraphics_Show(void); -bool8 debug_sub_808BD30(void); -bool8 debug_sub_808BDA4(void); -bool8 debug_sub_808BE2C(void); -bool8 debug_sub_808BEB4(void); -bool8 debug_sub_808BF3C(void); -bool8 debug_sub_808ECA4(void); -bool8 debug_sub_808EB58(void); -bool8 debug_sub_808EBB4(void); -bool8 debug_sub_808BFC4(void); -bool8 debug_sub_808C014(void); -bool8 debug_sub_808C31C(void); -bool8 debug_sub_808C7C8(void); -bool8 debug_sub_808CC74(void); -bool8 debug_sub_808CF10(void); -bool8 debug_sub_808D844(void); -bool8 debug_sub_808D600(void); -bool8 debug_sub_808D3BC(void); -bool8 debug_sub_808DB0C(void); -bool8 debug_sub_808E36C(void); -bool8 debug_sub_808E6C0(void); -bool8 debug_sub_808E90C(void); -bool8 debug_sub_808DA30(void); -bool8 debug_sub_808DFC0(void); -void debug_sub_808ED0C(void); -void debug_sub_808ED9C(void); -void debug_sub_808EE3C(void); -void debug_sub_808EE9C(void); -void debug_sub_808EF14(void); -void debug_sub_808EF8C(u8 a0); -bool8 debug_sub_808C064(void); -bool8 debug_sub_808C0EC(void); -bool8 debug_sub_808C104(void); -bool8 debug_sub_808C11C(void); -bool8 debug_sub_808C134(void); -bool8 debug_sub_808C14C(void); -bool8 debug_sub_808C164(void); -bool8 debug_sub_808C17C(void); -bool8 debug_sub_808C194(void); -bool8 debug_sub_808C1AC(void); -bool8 debug_sub_808C0A8(void); -bool8 debug_sub_808C1C4(void); -bool8 debug_sub_808C1DC(void); -bool8 debug_sub_808C1F4(void); -bool8 debug_sub_808C20C(void); -bool8 debug_sub_808C224(void); -bool8 debug_sub_808C23C(void); -bool8 debug_sub_808D450(void); -bool8 debug_sub_808D4A8(void); -bool8 debug_sub_808D694(void); -bool8 debug_sub_808D6EC(void); -bool8 debug_sub_808CFA4(void); -bool8 debug_sub_808CFFC(void); -bool8 debug_sub_808D054(void); -bool8 debug_sub_808D0AC(void); -bool8 debug_sub_808D104(void); -bool8 debug_sub_808D15C(void); -bool8 debug_sub_808D1B4(void); -bool8 debug_sub_808D20C(void); -bool8 debug_sub_808D264(void); -bool8 debug_sub_808C280(void); -void debug_sub_808F168(u32 a0); -bool8 debug_sub_808C2E4(void); -bool8 debug_sub_808D8D8(void); -bool8 debug_sub_808CD08(void); -bool8 debug_sub_808CD60(void); -bool8 debug_sub_808CDB8(void); -bool8 debug_sub_808C85C(void); -bool8 debug_sub_808C8B4(void); -bool8 debug_sub_808C90C(void); -bool8 debug_sub_808C964(void); -bool8 debug_sub_808C9BC(void); -bool8 debug_sub_808CA14(void); -bool8 debug_sub_808CA6C(void); -bool8 debug_sub_808CAC4(void); -bool8 debug_sub_808CB1C(void); -bool8 debug_sub_808C3B0(void); -bool8 debug_sub_808C408(void); -bool8 debug_sub_808C460(void); -bool8 debug_sub_808C4B8(void); -bool8 debug_sub_808C510(void); -bool8 debug_sub_808C568(void); -bool8 debug_sub_808C5C0(void); -bool8 debug_sub_808C618(void); -bool8 debug_sub_808C670(void); -bool8 debug_sub_808C36C(void); -bool8 debug_sub_808C6C8(void); -void debug_sub_808C714(u8, u8); -void debug_sub_808C764(u8); -void debug_sub_808F2E0(u8, u8, bool8); -bool8 debug_sub_808C818(void); -bool8 debug_sub_808CB74(void); -bool8 debug_sub_808E400(void); -bool8 debug_sub_808E458(void); -bool8 debug_sub_808E4B0(void); -bool8 debug_sub_808E508(void); -bool8 debug_sub_808E560(void); -bool8 debug_sub_808E9A0(void); -bool8 debug_sub_808E9F8(void); -bool8 debug_sub_808E054(void); -bool8 debug_sub_808E0AC(void); -bool8 debug_sub_808E104(void); -bool8 debug_sub_808E15C(void); -bool8 debug_sub_808E1B4(void); -bool8 debug_sub_808E20C(void); -bool8 debug_sub_808DBA0(void); -bool8 debug_sub_808DBF8(void); -bool8 debug_sub_808DC50(void); -bool8 debug_sub_808DCA8(void); -bool8 debug_sub_808DD00(void); -bool8 debug_sub_808DD58(void); -bool8 debug_sub_808DDB0(void); -bool8 debug_sub_808DE08(void); -bool8 debug_sub_808DE60(void); -bool8 debug_sub_808E754(void); -bool8 debug_sub_808E7AC(void); -void debug_sub_808CBC0(u8, u8); -void debug_sub_808CC10(u8); -bool8 debug_sub_808CCC4(void); -bool8 debug_sub_808CE10(void); -void debug_sub_808CE5C(u8, u8); -void debug_sub_808CEAC(u8); -bool8 debug_sub_808CF60(void); -bool8 debug_sub_808D2BC(void); -void debug_sub_808D308(u8, u8); -void debug_sub_808D358(u8); -bool8 debug_sub_808D40C(void); -bool8 debug_sub_808D500(void); -void debug_sub_808D54C(u8, u8); -void debug_sub_808D59C(u8); -bool8 debug_sub_808D650(void); -bool8 debug_sub_808D744(void); -void debug_sub_808D790(u8, u8); -void debug_sub_808D7E0(u8); -bool8 debug_sub_808D894(void); -bool8 debug_sub_808D930(void); -void debug_sub_808D97C(u8, u8); -void debug_sub_808D9CC(u8); -bool8 debug_sub_808DA80(void); -void debug_sub_808DAD4(void); -void debug_sub_808DABC(void); -void debug_sub_808F31C(u8, u8, u16); -bool8 debug_sub_808DB5C(void); -bool8 debug_sub_808DEB8(void); -void debug_sub_808DF64(u8, u8); -void debug_sub_808DF04(u8); -bool8 debug_sub_808E010(void); -bool8 debug_sub_808E264(void); -void debug_sub_808E310(u8, u8); -void debug_sub_808E2B0(u8); -bool8 debug_sub_808E3BC(void); -bool8 debug_sub_808E5B8(void); -void debug_sub_808E604(u8, u8); -void debug_sub_808E660(u8); -bool8 debug_sub_808E710(void); -bool8 debug_sub_808E804(void); -void debug_sub_808E850(u8, u8); -void debug_sub_808E8AC(u8); -bool8 debug_sub_808E95C(void); -bool8 debug_sub_808EA50(void); -void debug_sub_808EA9C(u8); -void debug_sub_808EAFC(u8, u8); -bool8 debug_sub_808EC10(void); -bool8 debug_sub_808EC5C(void); -bool8 debug_sub_808ECD0(void); +static u16 gDebug_03000700; +static u32 gDebug_03000704; +static u32 gDebug_03000708; +static u8 gDebug_0300070C; +static u8 gDebug_0300070D; +static u8 gDebug_0300070E; +static u8 gDebug_0300070F; +static u8 gDebug_03000710[13]; +static u8 gDebug_0300071D; +static u8 gDebug_0300071E; +static u8 gDebug_0300071F; +static u8 gDebug_03000720; +static u8 gDebug_03000721; + +static bool8 TomomichiDebugMenu_ArtMusGraphics(void); +static bool8 TomomichiDebugMenu_Config(void); +static bool8 TomomichiDebugMenu_ContestGraphics(void); +static bool8 TomomichiDebugMenu_ContestGraphics_Show(void); +static bool8 TomomichiDebugMenu_ControlEvents(void); +static bool8 TomomichiDebugMenu_ControlFlags(void); +static bool8 TomomichiDebugMenu_ControlWorks(void); +static bool8 TomomichiDebugMenu_MuseumGraphics_Show(void); +static bool8 TomomichiDebugMenu_PreviewData(void); +static bool8 TomomichiDebugMenu_TrickHouse(void); +static bool8 debug_sub_808B874(void); +static bool8 debug_sub_808B8C8(void); +static bool8 debug_sub_808BC48(void); +static bool8 debug_sub_808BCBC(void); +static bool8 debug_sub_808BD30(void); +static bool8 debug_sub_808BDA4(void); +static bool8 debug_sub_808BE2C(void); +static bool8 debug_sub_808BEB4(void); +static bool8 debug_sub_808BF3C(void); +static bool8 debug_sub_808BFC4(void); +static bool8 debug_sub_808C014(void); +static bool8 debug_sub_808C064(void); +static bool8 debug_sub_808C0A8(void); +static bool8 debug_sub_808C0EC(void); +static bool8 debug_sub_808C104(void); +static bool8 debug_sub_808C11C(void); +static bool8 debug_sub_808C134(void); +static bool8 debug_sub_808C14C(void); +static bool8 debug_sub_808C164(void); +static bool8 debug_sub_808C17C(void); +static bool8 debug_sub_808C194(void); +static bool8 debug_sub_808C1AC(void); +static bool8 debug_sub_808C1C4(void); +static bool8 debug_sub_808C1DC(void); +static bool8 debug_sub_808C1F4(void); +static bool8 debug_sub_808C20C(void); +static bool8 debug_sub_808C224(void); +static bool8 debug_sub_808C23C(void); +static bool8 debug_sub_808C280(void); +static bool8 debug_sub_808C2E4(void); +static bool8 debug_sub_808C31C(void); +static bool8 debug_sub_808C36C(void); +static bool8 debug_sub_808C3B0(void); +static bool8 debug_sub_808C408(void); +static bool8 debug_sub_808C460(void); +static bool8 debug_sub_808C4B8(void); +static bool8 debug_sub_808C510(void); +static bool8 debug_sub_808C568(void); +static bool8 debug_sub_808C5C0(void); +static bool8 debug_sub_808C618(void); +static bool8 debug_sub_808C670(void); +static bool8 debug_sub_808C6C8(void); +static void debug_sub_808C714(u8, u8); +static void debug_sub_808C764(u8); +static bool8 debug_sub_808C7C8(void); +static bool8 debug_sub_808C818(void); +static bool8 debug_sub_808C85C(void); +static bool8 debug_sub_808C8B4(void); +static bool8 debug_sub_808C90C(void); +static bool8 debug_sub_808C964(void); +static bool8 debug_sub_808C9BC(void); +static bool8 debug_sub_808CA14(void); +static bool8 debug_sub_808CA6C(void); +static bool8 debug_sub_808CAC4(void); +static bool8 debug_sub_808CB1C(void); +static bool8 debug_sub_808CB74(void); +static void debug_sub_808CBC0(u8, u8); +static void debug_sub_808CC10(u8); +static bool8 debug_sub_808CC74(void); +static bool8 debug_sub_808CCC4(void); +static bool8 debug_sub_808CD08(void); +static bool8 debug_sub_808CD60(void); +static bool8 debug_sub_808CDB8(void); +static bool8 debug_sub_808CE10(void); +static void debug_sub_808CE5C(u8, u8); +static void debug_sub_808CEAC(u8); +static bool8 debug_sub_808CF10(void); +static bool8 debug_sub_808CF60(void); +static bool8 debug_sub_808CFA4(void); +static bool8 debug_sub_808CFFC(void); +static bool8 debug_sub_808D054(void); +static bool8 debug_sub_808D0AC(void); +static bool8 debug_sub_808D104(void); +static bool8 debug_sub_808D15C(void); +static bool8 debug_sub_808D1B4(void); +static bool8 debug_sub_808D20C(void); +static bool8 debug_sub_808D264(void); +static bool8 debug_sub_808D2BC(void); +static void debug_sub_808D308(u8, u8); +static void debug_sub_808D358(u8); +static bool8 debug_sub_808D3BC(void); +static bool8 debug_sub_808D40C(void); +static bool8 debug_sub_808D450(void); +static bool8 debug_sub_808D4A8(void); +static bool8 debug_sub_808D500(void); +static void debug_sub_808D54C(u8, u8); +static void debug_sub_808D59C(u8); +static bool8 debug_sub_808D600(void); +static bool8 debug_sub_808D650(void); +static bool8 debug_sub_808D694(void); +static bool8 debug_sub_808D6EC(void); +static bool8 debug_sub_808D744(void); +static void debug_sub_808D790(u8, u8); +static void debug_sub_808D7E0(u8); +static bool8 debug_sub_808D844(void); +static bool8 debug_sub_808D894(void); +static bool8 debug_sub_808D8D8(void); +static bool8 debug_sub_808D930(void); +static void debug_sub_808D97C(u8, u8); +static void debug_sub_808D9CC(u8); +static bool8 debug_sub_808DA30(void); +static bool8 debug_sub_808DA80(void); +static void debug_sub_808DABC(void); +static void debug_sub_808DAD4(void); +static bool8 debug_sub_808DB0C(void); +static bool8 debug_sub_808DB5C(void); +static bool8 debug_sub_808DBA0(void); +static bool8 debug_sub_808DBF8(void); +static bool8 debug_sub_808DC50(void); +static bool8 debug_sub_808DCA8(void); +static bool8 debug_sub_808DD00(void); +static bool8 debug_sub_808DD58(void); +static bool8 debug_sub_808DDB0(void); +static bool8 debug_sub_808DE08(void); +static bool8 debug_sub_808DE60(void); +static bool8 debug_sub_808DEB8(void); +static void debug_sub_808DF04(u8); +static void debug_sub_808DF64(u8, u8); +static bool8 debug_sub_808DFC0(void); +static bool8 debug_sub_808E010(void); +static bool8 debug_sub_808E054(void); +static bool8 debug_sub_808E0AC(void); +static bool8 debug_sub_808E104(void); +static bool8 debug_sub_808E15C(void); +static bool8 debug_sub_808E1B4(void); +static bool8 debug_sub_808E20C(void); +static bool8 debug_sub_808E264(void); +static void debug_sub_808E2B0(u8); +static void debug_sub_808E310(u8, u8); +static bool8 debug_sub_808E36C(void); +static bool8 debug_sub_808E3BC(void); +static bool8 debug_sub_808E400(void); +static bool8 debug_sub_808E458(void); +static bool8 debug_sub_808E4B0(void); +static bool8 debug_sub_808E508(void); +static bool8 debug_sub_808E560(void); +static bool8 debug_sub_808E5B8(void); +static void debug_sub_808E604(u8, u8); +static void debug_sub_808E660(u8); +static bool8 debug_sub_808E6C0(void); +static bool8 debug_sub_808E710(void); +static bool8 debug_sub_808E754(void); +static bool8 debug_sub_808E7AC(void); +static bool8 debug_sub_808E804(void); +static void debug_sub_808E850(u8, u8); +static void debug_sub_808E8AC(u8); +static bool8 debug_sub_808E90C(void); +static bool8 debug_sub_808E95C(void); +static bool8 debug_sub_808E9A0(void); +static bool8 debug_sub_808E9F8(void); +static bool8 debug_sub_808EA50(void); +static void debug_sub_808EA9C(u8); +static void debug_sub_808EAFC(u8, u8); +static bool8 debug_sub_808EB58(void); +static bool8 debug_sub_808EBB4(void); +static bool8 debug_sub_808EC10(void); +static bool8 debug_sub_808EC5C(void); +static bool8 debug_sub_808ECA4(void); +static bool8 debug_sub_808ECD0(void); +static void debug_sub_808ED0C(void); +static void debug_sub_808ED9C(void); +static void debug_sub_808EE3C(void); +static void debug_sub_808EE9C(void); +static void debug_sub_808EF14(void); +static void debug_sub_808EF8C(u8 a0); +static void debug_sub_808F168(u8 a0); +static void debug_sub_808F2E0(u8, u8, bool8); +static void debug_sub_808F31C(u8, u8, u16); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -225,15 +225,15 @@ extern const u8 DebugScript_081C23FD[]; extern const u8 DebugScript_081C2518[]; extern const u8 DebugScript_081C2507[]; -const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); -const u8 gUnknown_Debug_083C0C65[] = _("Art Mus. graphics"); -const u8 gUnknown_Debug_083C0C77[] = _("Preview data"); -const u8 gUnknown_Debug_083C0C84[] = _("TRICK HOUSE"); -const u8 gUnknown_Debug_083C0C90[] = _("Control events"); -const u8 gUnknown_Debug_083C0C9F[] = _("Control flags"); -const u8 gUnknown_Debug_083C0CAD[] = _("Control WORK"); +static const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); +static const u8 gUnknown_Debug_083C0C65[] = _("Art Mus. graphics"); +static const u8 gUnknown_Debug_083C0C77[] = _("Preview data"); +static const u8 gUnknown_Debug_083C0C84[] = _("TRICK HOUSE"); +static const u8 gUnknown_Debug_083C0C90[] = _("Control events"); +static const u8 gUnknown_Debug_083C0C9F[] = _("Control flags"); +static const u8 gUnknown_Debug_083C0CAD[] = _("Control WORK"); -const struct MenuAction gUnknown_Debug_083C0CBA[] = { +static const struct MenuAction gUnknown_Debug_083C0CBA[] = { {gUnknown_Debug_083C0C54, TomomichiDebugMenu_ContestGraphics}, {gUnknown_Debug_083C0C65, TomomichiDebugMenu_ArtMusGraphics}, {gUnknown_Debug_083C0C77, TomomichiDebugMenu_PreviewData}, @@ -243,74 +243,74 @@ const struct MenuAction gUnknown_Debug_083C0CBA[] = { {gUnknown_Debug_083C0CAD, TomomichiDebugMenu_ControlWorks}, }; -const u8 gUnknown_Debug_083C0CF4[] = _("Contest"); +static const u8 gUnknown_Debug_083C0CF4[] = _("Contest"); -const u8 gUnknown_Debug_083C0CFC[] = _("Pokémon No."); -const u8 gUnknown_Debug_083C0D08[] = _("ID rnd. digit"); -const u8 gUnknown_Debug_083C0D16[] = _("Contest Type"); -const u8 gUnknown_Debug_083C0D23[] = _("Poké Art"); +static const u8 gUnknown_Debug_083C0CFC[] = _("Pokémon No."); +static const u8 gUnknown_Debug_083C0D08[] = _("ID rnd. digit"); +static const u8 gUnknown_Debug_083C0D16[] = _("Contest Type"); +static const u8 gUnknown_Debug_083C0D23[] = _("Poké Art"); -const struct MenuAction gUnknown_Debug_083C0D2C[] = { +static const struct MenuAction gUnknown_Debug_083C0D2C[] = { {gUnknown_Debug_083C0CFC, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0D08, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0D16, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0D23, TomomichiDebugMenu_ContestGraphics_Show} }; -const u8 gUnknown_Debug_083C0D4C[] = _("Art Mus."); -const u8 gUnknown_Debug_083C0D55[] = _("Pokémon No."); -const u8 gUnknown_Debug_083C0D61[] = _("ID rnd. digit"); -const u8 gUnknown_Debug_083C0D6F[] = _("Title Type"); -const u8 gUnknown_Debug_083C0D7A[] = _("Poké Art"); +static const u8 gUnknown_Debug_083C0D4C[] = _("Art Mus."); +static const u8 gUnknown_Debug_083C0D55[] = _("Pokémon No."); +static const u8 gUnknown_Debug_083C0D61[] = _("ID rnd. digit"); +static const u8 gUnknown_Debug_083C0D6F[] = _("Title Type"); +static const u8 gUnknown_Debug_083C0D7A[] = _("Poké Art"); -const struct MenuAction gUnknown_Debug_083C0D83[] = { +static const struct MenuAction gUnknown_Debug_083C0D83[] = { {gUnknown_Debug_083C0D55, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0D61, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0D6F, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0D7A, TomomichiDebugMenu_MuseumGraphics_Show} }; -const u8 gUnknown_Debug_083C0DA4[] = _("Preview"); +static const u8 gUnknown_Debug_083C0DA4[] = _("Preview"); -const u8 gUnknown_Debug_083C0DAC[] = _("Pokémon No."); -const u8 gUnknown_Debug_083C0DB8[] = _("ID rnd. digit"); -const u8 gUnknown_Debug_083C0DC6[] = _("Type"); -const u8 gUnknown_Debug_083C0DCB[] = _("Poké Art"); +static const u8 gUnknown_Debug_083C0DAC[] = _("Pokémon No."); +static const u8 gUnknown_Debug_083C0DB8[] = _("ID rnd. digit"); +static const u8 gUnknown_Debug_083C0DC6[] = _("Type"); +static const u8 gUnknown_Debug_083C0DCB[] = _("Poké Art"); -const struct MenuAction gUnknown_Debug_083C0DD4[] = { +static const struct MenuAction gUnknown_Debug_083C0DD4[] = { {gUnknown_Debug_083C0DAC, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0DB8, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0DC6, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C0DCB, debug_sub_808ECA4} }; -const u8 gUnknown_Debug_083C0DF4[] = _("Trick related"); +static const u8 gUnknown_Debug_083C0DF4[] = _("Trick related"); -const u8 gUnknown_Debug_083C0E02[] = _("Level"); -const u8 gUnknown_Debug_083C0E08[] = _("Trick Master"); +static const u8 gUnknown_Debug_083C0E02[] = _("Level"); +static const u8 gUnknown_Debug_083C0E08[] = _("Trick Master"); -const struct MenuAction gUnknown_Debug_083C0E15[] = { +static const struct MenuAction gUnknown_Debug_083C0E15[] = { {gUnknown_Debug_083C0E02, debug_sub_808EB58}, {gUnknown_Debug_083C0E08, debug_sub_808EBB4} }; -const u8 gUnknown_Debug_083C0E28[] = _("パート1"); -const u8 gUnknown_Debug_083C0E2D[] = _("パート2"); +static const u8 gUnknown_Debug_083C0E28[] = _("パート1"); +static const u8 gUnknown_Debug_083C0E2D[] = _("パート2"); -const struct MenuAction gUnknown_Debug_083C0E32[] = { +static const struct MenuAction gUnknown_Debug_083C0E32[] = { {gUnknown_Debug_083C0E28, debug_sub_808BFC4}, {gUnknown_Debug_083C0E2D, debug_sub_808C014} }; -const u8 gUnknown_Debug_083C0E44[] = _("イベントFLAG"); -const u8 gUnknown_Debug_083C0E4D[] = _("バニシュFLAG"); -const u8 gUnknown_Debug_083C0E56[] = _("トレーナーFLAG"); -const u8 gUnknown_Debug_083C0E60[] = _("SYSFLAG"); -const u8 gUnknown_Debug_083C0E68[] = _("BALLバニシュFLAG"); -const u8 gUnknown_Debug_083C0E75[] = _("FH"); -const u8 gUnknown_Debug_083C0E78[] = _("FH-OBJ"); +static const u8 gUnknown_Debug_083C0E44[] = _("イベントFLAG"); +static const u8 gUnknown_Debug_083C0E4D[] = _("バニシュFLAG"); +static const u8 gUnknown_Debug_083C0E56[] = _("トレーナーFLAG"); +static const u8 gUnknown_Debug_083C0E60[] = _("SYSFLAG"); +static const u8 gUnknown_Debug_083C0E68[] = _("BALLバニシュFLAG"); +static const u8 gUnknown_Debug_083C0E75[] = _("FH"); +static const u8 gUnknown_Debug_083C0E78[] = _("FH-OBJ"); -const struct MenuAction gUnknown_Debug_083C0E7F[] = { +static const struct MenuAction gUnknown_Debug_083C0E7F[] = { {gUnknown_Debug_083C0E44, debug_sub_808C31C}, {gUnknown_Debug_083C0E4D, debug_sub_808C7C8}, {gUnknown_Debug_083C0E56, debug_sub_808CC74}, @@ -320,15 +320,15 @@ const struct MenuAction gUnknown_Debug_083C0E7F[] = { {gUnknown_Debug_083C0E78, debug_sub_808D3BC} }; -const u8 gUnknown_Debug_083C0EB8[] = _("SAVEWORK"); +static const u8 gUnknown_Debug_083C0EB8[] = _("SAVEWORK"); -const u8 gUnknown_Debug_083C0EC1[] = _("SYSWORK"); -const u8 gUnknown_Debug_083C0EC9[] = _("LOCALWORK"); -const u8 gUnknown_Debug_083C0ED3[] = _("OBJWORK"); -const u8 gUnknown_Debug_083C0EDB[] = _("ANSWORK"); -const u8 gUnknown_Debug_083C0EE3[] = _("SAVEWORK パート2"); +static const u8 gUnknown_Debug_083C0EC1[] = _("SYSWORK"); +static const u8 gUnknown_Debug_083C0EC9[] = _("LOCALWORK"); +static const u8 gUnknown_Debug_083C0ED3[] = _("OBJWORK"); +static const u8 gUnknown_Debug_083C0EDB[] = _("ANSWORK"); +static const u8 gUnknown_Debug_083C0EE3[] = _("SAVEWORK パート2"); -const struct MenuAction gUnknown_Debug_083C0EF1[] = { +static const struct MenuAction gUnknown_Debug_083C0EF1[] = { {gUnknown_Debug_083C0EB8, debug_sub_808DB0C}, {gUnknown_Debug_083C0EC1, debug_sub_808E36C}, {gUnknown_Debug_083C0EC9, debug_sub_808E6C0}, @@ -337,17 +337,17 @@ const struct MenuAction gUnknown_Debug_083C0EF1[] = { {gUnknown_Debug_083C0EE3, debug_sub_808DFC0} }; -const u8 gUnknown_Debug_083C0F24[] = _("クリアご"); -const u8 gUnknown_Debug_083C0F29[] = _("コインこうにゅうかのう"); -const u8 gUnknown_Debug_083C0F35[] = _("コトキサポーターセット"); -const u8 gUnknown_Debug_083C0F41[] = _("ニューキンセツOPEN"); -const u8 gUnknown_Debug_083C0F4D[] = _("れんらくせんにのれる"); -const u8 gUnknown_Debug_083C0F58[] = _("タマゴついか"); -const u8 gUnknown_Debug_083C0F5F[] = _("アイテムいっぱい"); -const u8 gUnknown_Debug_083C0F68[] = _("グッズいっぱい"); -const u8 gUnknown_Debug_083C0F70[] = _("COINいっぱい"); - -const struct MenuAction gUnknown_Debug_083C0F79[] = { +static const u8 gUnknown_Debug_083C0F24[] = _("クリアご"); +static const u8 gUnknown_Debug_083C0F29[] = _("コインこうにゅうかのう"); +static const u8 gUnknown_Debug_083C0F35[] = _("コトキサポーターセット"); +static const u8 gUnknown_Debug_083C0F41[] = _("ニューキンセツOPEN"); +static const u8 gUnknown_Debug_083C0F4D[] = _("れんらくせんにのれる"); +static const u8 gUnknown_Debug_083C0F58[] = _("タマゴついか"); +static const u8 gUnknown_Debug_083C0F5F[] = _("アイテムいっぱい"); +static const u8 gUnknown_Debug_083C0F68[] = _("グッズいっぱい"); +static const u8 gUnknown_Debug_083C0F70[] = _("COINいっぱい"); + +static const struct MenuAction gUnknown_Debug_083C0F79[] = { {gUnknown_Debug_083C0F24, debug_sub_808C0EC}, {gUnknown_Debug_083C0F29, debug_sub_808C104}, {gUnknown_Debug_083C0F35, debug_sub_808C11C}, @@ -359,14 +359,14 @@ const struct MenuAction gUnknown_Debug_083C0F79[] = { {gUnknown_Debug_083C0F70, debug_sub_808C1AC} }; -const u8 gUnknown_Debug_083C0FC4[] = _("ムロジムOPEN"); -const u8 gUnknown_Debug_083C0FCD[] = _("おかねを0へ"); -const u8 gUnknown_Debug_083C0FD4[] = _("ドジョッチ FULL"); -const u8 gUnknown_Debug_083C0FDF[] = _("キノココ FULL"); -const u8 gUnknown_Debug_083C0FE9[] = _("ドジョッチ タマゴ"); -const u8 gUnknown_Debug_083C0FF3[] = _("キノココ タマゴ"); +static const u8 gUnknown_Debug_083C0FC4[] = _("ムロジムOPEN"); +static const u8 gUnknown_Debug_083C0FCD[] = _("おかねを0へ"); +static const u8 gUnknown_Debug_083C0FD4[] = _("ドジョッチ FULL"); +static const u8 gUnknown_Debug_083C0FDF[] = _("キノココ FULL"); +static const u8 gUnknown_Debug_083C0FE9[] = _("ドジョッチ タマゴ"); +static const u8 gUnknown_Debug_083C0FF3[] = _("キノココ タマゴ"); -const struct MenuAction gUnknown_Debug_083C0FFC[] = { +static const struct MenuAction gUnknown_Debug_083C0FFC[] = { {gUnknown_Debug_083C0FC4, debug_sub_808C1C4}, {gUnknown_Debug_083C0FCD, debug_sub_808C1DC}, {gUnknown_Debug_083C0FD4, debug_sub_808C1F4}, @@ -375,31 +375,31 @@ const struct MenuAction gUnknown_Debug_083C0FFC[] = { {gUnknown_Debug_083C0FF3, debug_sub_808C23C} }; -const u8 gUnknown_Debug_083C102C[] = _("ANSWORK みかんせい"); +static const u8 gUnknown_Debug_083C102C[] = _("ANSWORK みかんせい"); -const struct MenuAction gUnknown_Debug_083C103A[] = { +static const struct MenuAction gUnknown_Debug_083C103A[] = { {gUnknown_Debug_083C102C, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1044[] = _("FHーOBJ00ー08"); -const u8 gUnknown_Debug_083C1050[] = _("FHーOBJ09ー15"); +static const u8 gUnknown_Debug_083C1044[] = _("FHーOBJ00ー08"); +static const u8 gUnknown_Debug_083C1050[] = _("FHーOBJ09ー15"); -const struct MenuAction gUnknown_Debug_083C105C[] = { +static const struct MenuAction gUnknown_Debug_083C105C[] = { {gUnknown_Debug_083C1044, debug_sub_808D450}, {gUnknown_Debug_083C1050, debug_sub_808D4A8} }; -const u8 gUnknown_Debug_083C106C[] = _("FHーOBJ00"); -const u8 gUnknown_Debug_083C1075[] = _("FHーOBJ01"); -const u8 gUnknown_Debug_083C107E[] = _("FHーOBJ02"); -const u8 gUnknown_Debug_083C1087[] = _("FHーOBJ03"); -const u8 gUnknown_Debug_083C1090[] = _("FHーOBJ04"); -const u8 gUnknown_Debug_083C1099[] = _("FHーOBJ05"); -const u8 gUnknown_Debug_083C10A2[] = _("FHーOBJ06"); -const u8 gUnknown_Debug_083C10AB[] = _("FHーOBJ07"); -const u8 gUnknown_Debug_083C10B4[] = _("FHーOBJ08"); - -const struct MenuAction gUnknown_Debug_083C10BD[] = { +static const u8 gUnknown_Debug_083C106C[] = _("FHーOBJ00"); +static const u8 gUnknown_Debug_083C1075[] = _("FHーOBJ01"); +static const u8 gUnknown_Debug_083C107E[] = _("FHーOBJ02"); +static const u8 gUnknown_Debug_083C1087[] = _("FHーOBJ03"); +static const u8 gUnknown_Debug_083C1090[] = _("FHーOBJ04"); +static const u8 gUnknown_Debug_083C1099[] = _("FHーOBJ05"); +static const u8 gUnknown_Debug_083C10A2[] = _("FHーOBJ06"); +static const u8 gUnknown_Debug_083C10AB[] = _("FHーOBJ07"); +static const u8 gUnknown_Debug_083C10B4[] = _("FHーOBJ08"); + +static const struct MenuAction gUnknown_Debug_083C10BD[] = { {gUnknown_Debug_083C106C, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1075, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C107E, TomomichiDebugMenu_Config}, @@ -411,17 +411,17 @@ const struct MenuAction gUnknown_Debug_083C10BD[] = { {gUnknown_Debug_083C10B4, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1108[] = _("FH-OBJ09"); -const u8 gUnknown_Debug_083C1111[] = _("FH-OBJ10"); -const u8 gUnknown_Debug_083C111A[] = _("FH-OBJ11"); -const u8 gUnknown_Debug_083C1123[] = _("FH-OBJ12"); -const u8 gUnknown_Debug_083C112C[] = _("FH-OBJ13"); -const u8 gUnknown_Debug_083C1135[] = _("FH-OBJ14"); -const u8 gUnknown_Debug_083C113E[] = _("FH-OBJ15"); -const u8 gUnknown_Debug_083C1147[] = _(""); -const u8 gUnknown_Debug_083C1148[] = _(""); - -const struct MenuAction gUnknown_Debug_083C1149[] = { +static const u8 gUnknown_Debug_083C1108[] = _("FH-OBJ09"); +static const u8 gUnknown_Debug_083C1111[] = _("FH-OBJ10"); +static const u8 gUnknown_Debug_083C111A[] = _("FH-OBJ11"); +static const u8 gUnknown_Debug_083C1123[] = _("FH-OBJ12"); +static const u8 gUnknown_Debug_083C112C[] = _("FH-OBJ13"); +static const u8 gUnknown_Debug_083C1135[] = _("FH-OBJ14"); +static const u8 gUnknown_Debug_083C113E[] = _("FH-OBJ15"); +static const u8 gUnknown_Debug_083C1147[] = _(""); +static const u8 gUnknown_Debug_083C1148[] = _(""); + +static const struct MenuAction gUnknown_Debug_083C1149[] = { {gUnknown_Debug_083C1108, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1111, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C111A, TomomichiDebugMenu_Config}, @@ -433,32 +433,32 @@ const struct MenuAction gUnknown_Debug_083C1149[] = { {gUnknown_Debug_083C1148, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1194[] = {9, 7}; +static const u8 gUnknown_Debug_083C1194[] = {9, 7}; -const u16 gUnknown_Debug_083C1196[][9] = { +static const u16 gUnknown_Debug_083C1196[][9] = { {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19}, {0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20} }; -const u8 gUnknown_Debug_083C11BA[] = _("FH-00-08"); -const u8 gUnknown_Debug_083C11C3[] = _("FH-09-15"); +static const u8 gUnknown_Debug_083C11BA[] = _("FH-00-08"); +static const u8 gUnknown_Debug_083C11C3[] = _("FH-09-15"); -const struct MenuAction gUnknown_Debug_083C11CC[] = { +static const struct MenuAction gUnknown_Debug_083C11CC[] = { {gUnknown_Debug_083C11BA, debug_sub_808D694}, {gUnknown_Debug_083C11C3, debug_sub_808D6EC} }; -const u8 gUnknown_Debug_083C11DC[] = _("FH-00"); -const u8 gUnknown_Debug_083C11E2[] = _("FH-01"); -const u8 gUnknown_Debug_083C11E8[] = _("FH-02"); -const u8 gUnknown_Debug_083C11EE[] = _("FH-03"); -const u8 gUnknown_Debug_083C11F4[] = _("FH-04"); -const u8 gUnknown_Debug_083C11FA[] = _("FH-05"); -const u8 gUnknown_Debug_083C1200[] = _("FH-06"); -const u8 gUnknown_Debug_083C1206[] = _("FH-07"); -const u8 gUnknown_Debug_083C120C[] = _("FH-08"); - -const struct MenuAction gUnknown_Debug_083C1212[] = { +static const u8 gUnknown_Debug_083C11DC[] = _("FH-00"); +static const u8 gUnknown_Debug_083C11E2[] = _("FH-01"); +static const u8 gUnknown_Debug_083C11E8[] = _("FH-02"); +static const u8 gUnknown_Debug_083C11EE[] = _("FH-03"); +static const u8 gUnknown_Debug_083C11F4[] = _("FH-04"); +static const u8 gUnknown_Debug_083C11FA[] = _("FH-05"); +static const u8 gUnknown_Debug_083C1200[] = _("FH-06"); +static const u8 gUnknown_Debug_083C1206[] = _("FH-07"); +static const u8 gUnknown_Debug_083C120C[] = _("FH-08"); + +static const struct MenuAction gUnknown_Debug_083C1212[] = { {gUnknown_Debug_083C11DC, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C11E2, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C11E8, TomomichiDebugMenu_Config}, @@ -470,17 +470,17 @@ const struct MenuAction gUnknown_Debug_083C1212[] = { {gUnknown_Debug_083C120C, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C125C[] = _("FHー09"); -const u8 gUnknown_Debug_083C1262[] = _("FHー10"); -const u8 gUnknown_Debug_083C1268[] = _("FHー11"); -const u8 gUnknown_Debug_083C126E[] = _("FHー12"); -const u8 gUnknown_Debug_083C1274[] = _("FHー13"); -const u8 gUnknown_Debug_083C127A[] = _("FHー14"); -const u8 gUnknown_Debug_083C1280[] = _("FHー15"); -const u8 gUnknown_Debug_083C1286[] = _(""); -const u8 gUnknown_Debug_083C1287[] = _(""); - -const struct MenuAction gUnknown_Debug_083C1288[] = { +static const u8 gUnknown_Debug_083C125C[] = _("FHー09"); +static const u8 gUnknown_Debug_083C1262[] = _("FHー10"); +static const u8 gUnknown_Debug_083C1268[] = _("FHー11"); +static const u8 gUnknown_Debug_083C126E[] = _("FHー12"); +static const u8 gUnknown_Debug_083C1274[] = _("FHー13"); +static const u8 gUnknown_Debug_083C127A[] = _("FHー14"); +static const u8 gUnknown_Debug_083C1280[] = _("FHー15"); +static const u8 gUnknown_Debug_083C1286[] = _(""); +static const u8 gUnknown_Debug_083C1287[] = _(""); + +static const struct MenuAction gUnknown_Debug_083C1288[] = { {gUnknown_Debug_083C125C, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1262, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1268, TomomichiDebugMenu_Config}, @@ -492,24 +492,24 @@ const struct MenuAction gUnknown_Debug_083C1288[] = { {gUnknown_Debug_083C1287, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C12D0[] = {9, 7}; +static const u8 gUnknown_Debug_083C12D0[] = {9, 7}; -const u16 gUnknown_Debug_083C12D2[][9] = { +static const u16 gUnknown_Debug_083C12D2[][9] = { {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}, {0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10} }; -const u8 gUnknown_Debug_083C12F6[] = _("BATCH"); -const u8 gUnknown_Debug_083C12FC[] = _("タウンとうちゃく"); -const u8 gUnknown_Debug_083C1305[] = _("シティとうちゃく"); -const u8 gUnknown_Debug_083C130E[] = _("GET"); -const u8 gUnknown_Debug_083C1312[] = _("そのた1"); -const u8 gUnknown_Debug_083C1317[] = _("そのた2"); -const u8 gUnknown_Debug_083C131C[] = _("そのた3"); -const u8 gUnknown_Debug_083C1321[] = _("そのた4"); -const u8 gUnknown_Debug_083C1326[] = _("そのた とうちゃく"); - -const struct MenuAction gUnknown_Debug_083C1330[] = { +static const u8 gUnknown_Debug_083C12F6[] = _("BATCH"); +static const u8 gUnknown_Debug_083C12FC[] = _("タウンとうちゃく"); +static const u8 gUnknown_Debug_083C1305[] = _("シティとうちゃく"); +static const u8 gUnknown_Debug_083C130E[] = _("GET"); +static const u8 gUnknown_Debug_083C1312[] = _("そのた1"); +static const u8 gUnknown_Debug_083C1317[] = _("そのた2"); +static const u8 gUnknown_Debug_083C131C[] = _("そのた3"); +static const u8 gUnknown_Debug_083C1321[] = _("そのた4"); +static const u8 gUnknown_Debug_083C1326[] = _("そのた とうちゃく"); + +static const struct MenuAction gUnknown_Debug_083C1330[] = { {gUnknown_Debug_083C12F6, debug_sub_808CFA4}, {gUnknown_Debug_083C12FC, debug_sub_808CFFC}, {gUnknown_Debug_083C1305, debug_sub_808D054}, @@ -521,16 +521,16 @@ const struct MenuAction gUnknown_Debug_083C1330[] = { {gUnknown_Debug_083C1326, debug_sub_808D264} }; -const u8 gUnknown_Debug_083C1378[] = _("BATCH01ーGET"); -const u8 gUnknown_Debug_083C1384[] = _("BATCH02ーGET"); -const u8 gUnknown_Debug_083C1390[] = _("BATCH03ーGET"); -const u8 gUnknown_Debug_083C139C[] = _("BATCH04ーGET"); -const u8 gUnknown_Debug_083C13A8[] = _("BATCH05ーGET"); -const u8 gUnknown_Debug_083C13B4[] = _("BATCH06ーGET"); -const u8 gUnknown_Debug_083C13C0[] = _("BATCH07ーGET"); -const u8 gUnknown_Debug_083C13CC[] = _("BATCH08ーGET"); +static const u8 gUnknown_Debug_083C1378[] = _("BATCH01ーGET"); +static const u8 gUnknown_Debug_083C1384[] = _("BATCH02ーGET"); +static const u8 gUnknown_Debug_083C1390[] = _("BATCH03ーGET"); +static const u8 gUnknown_Debug_083C139C[] = _("BATCH04ーGET"); +static const u8 gUnknown_Debug_083C13A8[] = _("BATCH05ーGET"); +static const u8 gUnknown_Debug_083C13B4[] = _("BATCH06ーGET"); +static const u8 gUnknown_Debug_083C13C0[] = _("BATCH07ーGET"); +static const u8 gUnknown_Debug_083C13CC[] = _("BATCH08ーGET"); -const struct MenuAction gUnknown_Debug_083C13D8[] = { +static const struct MenuAction gUnknown_Debug_083C13D8[] = { {gUnknown_Debug_083C1378, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1384, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1390, TomomichiDebugMenu_Config}, @@ -541,15 +541,15 @@ const struct MenuAction gUnknown_Debug_083C13D8[] = { {gUnknown_Debug_083C13CC, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1418[] = _("T101ARRIVE"); -const u8 gUnknown_Debug_083C1423[] = _("T102ARRIVE"); -const u8 gUnknown_Debug_083C142E[] = _("T103ARRIVE"); -const u8 gUnknown_Debug_083C1439[] = _("T104ARRIVE"); -const u8 gUnknown_Debug_083C1444[] = _("T105ARRIVE"); -const u8 gUnknown_Debug_083C144F[] = _("T106ARRIVE"); -const u8 gUnknown_Debug_083C145A[] = _("T107ARRIVE"); +static const u8 gUnknown_Debug_083C1418[] = _("T101ARRIVE"); +static const u8 gUnknown_Debug_083C1423[] = _("T102ARRIVE"); +static const u8 gUnknown_Debug_083C142E[] = _("T103ARRIVE"); +static const u8 gUnknown_Debug_083C1439[] = _("T104ARRIVE"); +static const u8 gUnknown_Debug_083C1444[] = _("T105ARRIVE"); +static const u8 gUnknown_Debug_083C144F[] = _("T106ARRIVE"); +static const u8 gUnknown_Debug_083C145A[] = _("T107ARRIVE"); -const struct MenuAction gUnknown_Debug_083C1465[] = { +static const struct MenuAction gUnknown_Debug_083C1465[] = { {gUnknown_Debug_083C1418, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1423, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C142E, TomomichiDebugMenu_Config}, @@ -559,17 +559,17 @@ const struct MenuAction gUnknown_Debug_083C1465[] = { {gUnknown_Debug_083C145A, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C14A0[] = _("C101ARRIVE"); -const u8 gUnknown_Debug_083C14AB[] = _("C102ARRIVE"); -const u8 gUnknown_Debug_083C14B6[] = _("C103ARRIVE"); -const u8 gUnknown_Debug_083C14C1[] = _("C104ARRIVE"); -const u8 gUnknown_Debug_083C14CC[] = _("C105ARRIVE"); -const u8 gUnknown_Debug_083C14D7[] = _("C106ARRIVE"); -const u8 gUnknown_Debug_083C14E2[] = _("C107ARRIVE"); -const u8 gUnknown_Debug_083C14ED[] = _("C108ARRIVE"); -const u8 gUnknown_Debug_083C14F8[] = _("C109ARRIVE"); - -const struct MenuAction gUnknown_Debug_083C1503[] = { +static const u8 gUnknown_Debug_083C14A0[] = _("C101ARRIVE"); +static const u8 gUnknown_Debug_083C14AB[] = _("C102ARRIVE"); +static const u8 gUnknown_Debug_083C14B6[] = _("C103ARRIVE"); +static const u8 gUnknown_Debug_083C14C1[] = _("C104ARRIVE"); +static const u8 gUnknown_Debug_083C14CC[] = _("C105ARRIVE"); +static const u8 gUnknown_Debug_083C14D7[] = _("C106ARRIVE"); +static const u8 gUnknown_Debug_083C14E2[] = _("C107ARRIVE"); +static const u8 gUnknown_Debug_083C14ED[] = _("C108ARRIVE"); +static const u8 gUnknown_Debug_083C14F8[] = _("C109ARRIVE"); + +static const struct MenuAction gUnknown_Debug_083C1503[] = { {gUnknown_Debug_083C14A0, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C14AB, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C14B6, TomomichiDebugMenu_Config}, @@ -581,29 +581,29 @@ const struct MenuAction gUnknown_Debug_083C1503[] = { {gUnknown_Debug_083C14F8, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C154C[] = _("SYSーPOKEMONーGET"); -const u8 gUnknown_Debug_083C155C[] = _("SYSーZUKANーGET"); -const u8 gUnknown_Debug_083C156A[] = _("SYSーPOKEGEARーGET"); -const u8 gUnknown_Debug_083C157B[] = _("SYSーRIBBONーGET"); +static const u8 gUnknown_Debug_083C154C[] = _("SYSーPOKEMONーGET"); +static const u8 gUnknown_Debug_083C155C[] = _("SYSーZUKANーGET"); +static const u8 gUnknown_Debug_083C156A[] = _("SYSーPOKEGEARーGET"); +static const u8 gUnknown_Debug_083C157B[] = _("SYSーRIBBONーGET"); -const struct MenuAction gUnknown_Debug_083C158A[] = { +static const struct MenuAction gUnknown_Debug_083C158A[] = { {gUnknown_Debug_083C154C, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C155C, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C156A, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C157B, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C15AC[] = _("SYSーGAMEーCLEAR"); -const u8 gUnknown_Debug_083C15BB[] = _("SYSーKAIWAーUSED"); -const u8 gUnknown_Debug_083C15CA[] = _("SYSーNOWーOYAJIーMEET"); -const u8 gUnknown_Debug_083C15DD[] = _("SYSーUSEーWAZAーFLASH"); -const u8 gUnknown_Debug_083C15F0[] = _("SYSーUSEーWAZAーKAIRIKI"); -const u8 gUnknown_Debug_083C1605[] = _("SYSーWEATHERーCTRL"); -const u8 gUnknown_Debug_083C1616[] = _("SYSーCYCLINGーROAD"); -const u8 gUnknown_Debug_083C1627[] = _("SYSーSAFARIーMODE"); -const u8 gUnknown_Debug_083C1637[] = _("SYSーCRUISEーMODE"); - -const struct MenuAction gUnknown_Debug_083C1647[] = { +static const u8 gUnknown_Debug_083C15AC[] = _("SYSーGAMEーCLEAR"); +static const u8 gUnknown_Debug_083C15BB[] = _("SYSーKAIWAーUSED"); +static const u8 gUnknown_Debug_083C15CA[] = _("SYSーNOWーOYAJIーMEET"); +static const u8 gUnknown_Debug_083C15DD[] = _("SYSーUSEーWAZAーFLASH"); +static const u8 gUnknown_Debug_083C15F0[] = _("SYSーUSEーWAZAーKAIRIKI"); +static const u8 gUnknown_Debug_083C1605[] = _("SYSーWEATHERーCTRL"); +static const u8 gUnknown_Debug_083C1616[] = _("SYSーCYCLINGーROAD"); +static const u8 gUnknown_Debug_083C1627[] = _("SYSーSAFARIーMODE"); +static const u8 gUnknown_Debug_083C1637[] = _("SYSーCRUISEーMODE"); + +static const struct MenuAction gUnknown_Debug_083C1647[] = { {gUnknown_Debug_083C15AC, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C15BB, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C15CA, TomomichiDebugMenu_Config}, @@ -615,17 +615,17 @@ const struct MenuAction gUnknown_Debug_083C1647[] = { {gUnknown_Debug_083C1637, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1690[] = _("SYSーTVーHOME"); -const u8 gUnknown_Debug_083C169C[] = _("SYSーTVーWATCH"); -const u8 gUnknown_Debug_083C16A9[] = _("SYSーTVSTART"); -const u8 gUnknown_Debug_083C16B5[] = _("SYSーPOPWORDーINPUT"); -const u8 gUnknown_Debug_083C16C7[] = _("SYSーMIXーRECORD"); -const u8 gUnknown_Debug_083C16D6[] = _("SYSーCLOCKーSET"); -const u8 gUnknown_Debug_083C16E4[] = _("SYSーCAVEーSHIP"); -const u8 gUnknown_Debug_083C16F2[] = _("SYSーCAVEーWONDER"); -const u8 gUnknown_Debug_083C1702[] = _("SYSーCAVEーBATTLE"); - -const struct MenuAction gUnknown_Debug_083C1712[] = { +static const u8 gUnknown_Debug_083C1690[] = _("SYSーTVーHOME"); +static const u8 gUnknown_Debug_083C169C[] = _("SYSーTVーWATCH"); +static const u8 gUnknown_Debug_083C16A9[] = _("SYSーTVSTART"); +static const u8 gUnknown_Debug_083C16B5[] = _("SYSーPOPWORDーINPUT"); +static const u8 gUnknown_Debug_083C16C7[] = _("SYSーMIXーRECORD"); +static const u8 gUnknown_Debug_083C16D6[] = _("SYSーCLOCKーSET"); +static const u8 gUnknown_Debug_083C16E4[] = _("SYSーCAVEーSHIP"); +static const u8 gUnknown_Debug_083C16F2[] = _("SYSーCAVEーWONDER"); +static const u8 gUnknown_Debug_083C1702[] = _("SYSーCAVEーBATTLE"); + +static const struct MenuAction gUnknown_Debug_083C1712[] = { {gUnknown_Debug_083C1690, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C169C, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C16A9, TomomichiDebugMenu_Config}, @@ -637,17 +637,17 @@ const struct MenuAction gUnknown_Debug_083C1712[] = { {gUnknown_Debug_083C1702, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C175C[] = _("SYSーSPECIALーZUKAN"); -const u8 gUnknown_Debug_083C176E[] = _("SYSーASASEーTIDE"); -const u8 gUnknown_Debug_083C177D[] = _("SYSーRIBBONーGET"); -const u8 gUnknown_Debug_083C178C[] = _("SYSーPASOーMAYUMI"); -const u8 gUnknown_Debug_083C179C[] = _("SYSーEXDATAーENABLE"); -const u8 gUnknown_Debug_083C17AE[] = _("SYSーTENJIーANAWOHORU"); -const u8 gUnknown_Debug_083C17C2[] = _("SYSーTENJIーKAIRIKI"); -const u8 gUnknown_Debug_083C17D4[] = _("SYSーTENJIーWAIT"); -const u8 gUnknown_Debug_083C17E3[] = _("SYSーTENJIーSORAWOTOBU"); - -const struct MenuAction gUnknown_Debug_083C17F8[] = { +static const u8 gUnknown_Debug_083C175C[] = _("SYSーSPECIALーZUKAN"); +static const u8 gUnknown_Debug_083C176E[] = _("SYSーASASEーTIDE"); +static const u8 gUnknown_Debug_083C177D[] = _("SYSーRIBBONーGET"); +static const u8 gUnknown_Debug_083C178C[] = _("SYSーPASOーMAYUMI"); +static const u8 gUnknown_Debug_083C179C[] = _("SYSーEXDATAーENABLE"); +static const u8 gUnknown_Debug_083C17AE[] = _("SYSーTENJIーANAWOHORU"); +static const u8 gUnknown_Debug_083C17C2[] = _("SYSーTENJIーKAIRIKI"); +static const u8 gUnknown_Debug_083C17D4[] = _("SYSーTENJIーWAIT"); +static const u8 gUnknown_Debug_083C17E3[] = _("SYSーTENJIーSORAWOTOBU"); + +static const struct MenuAction gUnknown_Debug_083C17F8[] = { {gUnknown_Debug_083C175C, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C176E, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C177D, TomomichiDebugMenu_Config}, @@ -659,17 +659,17 @@ const struct MenuAction gUnknown_Debug_083C17F8[] = { {gUnknown_Debug_083C17E3, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1840[] = _("SYSーENCーUPーITEM"); -const u8 gUnknown_Debug_083C1850[] = _("SYSーENEーDOWNーITEM"); -const u8 gUnknown_Debug_083C1862[] = _("SYSーKOKOROーEVENT"); -const u8 gUnknown_Debug_083C1873[] = _("SYSーMOVEーPOKEーNEWS"); -const u8 gUnknown_Debug_083C1886[] = _("SYSーASASEーITEM"); -const u8 gUnknown_Debug_083C1895[] = _("SYSーBーDASH"); -const u8 gUnknown_Debug_083C18A0[] = _("SYSーCTRLーOBJーDELETE"); -const u8 gUnknown_Debug_083C18B4[] = _(""); -const u8 gUnknown_Debug_083C18B5[] = _(""); - -const struct MenuAction gUnknown_Debug_083C18B8[] = { +static const u8 gUnknown_Debug_083C1840[] = _("SYSーENCーUPーITEM"); +static const u8 gUnknown_Debug_083C1850[] = _("SYSーENEーDOWNーITEM"); +static const u8 gUnknown_Debug_083C1862[] = _("SYSーKOKOROーEVENT"); +static const u8 gUnknown_Debug_083C1873[] = _("SYSーMOVEーPOKEーNEWS"); +static const u8 gUnknown_Debug_083C1886[] = _("SYSーASASEーITEM"); +static const u8 gUnknown_Debug_083C1895[] = _("SYSーBーDASH"); +static const u8 gUnknown_Debug_083C18A0[] = _("SYSーCTRLーOBJーDELETE"); +static const u8 gUnknown_Debug_083C18B4[] = _(""); +static const u8 gUnknown_Debug_083C18B5[] = _(""); + +static const struct MenuAction gUnknown_Debug_083C18B8[] = { {gUnknown_Debug_083C1840, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1850, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1862, TomomichiDebugMenu_Config}, @@ -681,17 +681,17 @@ const struct MenuAction gUnknown_Debug_083C18B8[] = { {gUnknown_Debug_083C18B5, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1900[] = _("SYSーARRIVEーSUBMARINECAVE"); -const u8 gUnknown_Debug_083C1919[] = _("SYSーARRIVEーBATTLETOWER"); -const u8 gUnknown_Debug_083C1930[] = _("SYSーARRIVEーISLAND"); -const u8 gUnknown_Debug_083C1942[] = _("SYSーARRIVEーLEAGUE"); -const u8 gUnknown_Debug_083C1954[] = _("SYSーARRIVEーSORANOHASHIRA"); -const u8 gUnknown_Debug_083C196D[] = _(""); -const u8 gUnknown_Debug_083C196E[] = _(""); -const u8 gUnknown_Debug_083C196F[] = _(""); -const u8 gUnknown_Debug_083C1970[] = _(""); - -const struct MenuAction gDebug_0x83C1974[] = { +static const u8 gUnknown_Debug_083C1900[] = _("SYSーARRIVEーSUBMARINECAVE"); +static const u8 gUnknown_Debug_083C1919[] = _("SYSーARRIVEーBATTLETOWER"); +static const u8 gUnknown_Debug_083C1930[] = _("SYSーARRIVEーISLAND"); +static const u8 gUnknown_Debug_083C1942[] = _("SYSーARRIVEーLEAGUE"); +static const u8 gUnknown_Debug_083C1954[] = _("SYSーARRIVEーSORANOHASHIRA"); +static const u8 gUnknown_Debug_083C196D[] = _(""); +static const u8 gUnknown_Debug_083C196E[] = _(""); +static const u8 gUnknown_Debug_083C196F[] = _(""); +static const u8 gUnknown_Debug_083C1970[] = _(""); + +static const struct MenuAction gDebug_0x83C1974[] = { {gUnknown_Debug_083C1900, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1919, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1930, TomomichiDebugMenu_Config}, @@ -703,9 +703,9 @@ const struct MenuAction gDebug_0x83C1974[] = { {gUnknown_Debug_083C1970, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C19BC[] = {8, 7, 9, 4, 9, 9, 9, 7, 5}; +static const u8 gUnknown_Debug_083C19BC[] = {8, 7, 9, 4, 9, 9, 9, 7, 5}; -const u16 gUnknown_Debug_083C19C6[][9] = { +static const u16 gUnknown_Debug_083C19C6[][9] = { {FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET, FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET}, {FLAG_VISITED_LITTLEROOT_TOWN, FLAG_VISITED_OLDALE_TOWN, FLAG_VISITED_DEWFORD_TOWN, FLAG_VISITED_LAVARIDGE_TOWN, FLAG_VISITED_FALLARBOR_TOWN, FLAG_VISITED_VERDANTURF_TOWN, FLAG_VISITED_PACIFIDLOG_TOWN}, {FLAG_VISITED_PETALBURG_CITY, FLAG_VISITED_SLATEPORT_CITY, FLAG_VISITED_MAUVILLE_CITY, FLAG_VISITED_RUSTBORO_CITY, FLAG_VISITED_FORTREE_CITY, FLAG_VISITED_LILYCOVE_CITY, FLAG_VISITED_MOSSDEEP_CITY, FLAG_VISITED_SOOTOPOLIS_CITY, FLAG_VISITED_EVER_GRANDE_CITY}, @@ -717,46 +717,46 @@ const u16 gUnknown_Debug_083C19C6[][9] = { {FLAG_LANDMARK_SEAFLOOR_CAVERN, FLAG_LANDMARK_BATTLE_TOWER, FLAG_LANDMARK_SOUTHERN_ISLAND, FLAG_SYS_POKEMON_LEAGUE_FLY, FLAG_LANDMARK_SKY_PILLAR} }; -const u8 gDebug_0x83C1A68[] = _("FVーBALL パート1"); +static const u8 gDebug_0x83C1A68[] = _("FVーBALL パート1"); -const struct MenuAction gUnknown_Debug_083C1A78[] = { +static const struct MenuAction gUnknown_Debug_083C1A78[] = { {gDebug_0x83C1A68, debug_sub_808D8D8} }; -const u8 gUnknown_Debug_083C1A80[] = _("FVーBALL1ー78"); -const u8 gUnknown_Debug_083C1A8C[] = _("FVーBALL1ー133"); +static const u8 gUnknown_Debug_083C1A80[] = _("FVーBALL1ー78"); +static const u8 gUnknown_Debug_083C1A8C[] = _("FVーBALL1ー133"); -const struct MenuAction gUnknown_Debug_083C1A9C[] = { +static const struct MenuAction gUnknown_Debug_083C1A9C[] = { {gUnknown_Debug_083C1A80, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1A8C, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1AAC[] = {2}; +static const u8 gUnknown_Debug_083C1AAC[] = {2}; -const u16 gUnknown_Debug_083C1AAE[][9] = { +static const u16 gUnknown_Debug_083C1AAE[][9] = { {FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_2, FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_1} }; -const u8 gUnknown_Debug_083C1AC0[] = _("ジムリーダー"); -const u8 gUnknown_Debug_083C1AC7[] = _("してんのう"); -const u8 gUnknown_Debug_083C1ACD[] = _("みつる/Champロード"); +static const u8 gUnknown_Debug_083C1AC0[] = _("ジムリーダー"); +static const u8 gUnknown_Debug_083C1AC7[] = _("してんのう"); +static const u8 gUnknown_Debug_083C1ACD[] = _("みつる/Champロード"); -const struct MenuAction gUnknown_Debug_083C1ADC[] = { +static const struct MenuAction gUnknown_Debug_083C1ADC[] = { {gUnknown_Debug_083C1AC0, debug_sub_808CD08}, {gUnknown_Debug_083C1AC7, debug_sub_808CD60}, {gUnknown_Debug_083C1ACD, debug_sub_808CDB8} }; -const u8 gUnknown_Debug_083C1AF4[] = _("FTーGYMー01ーLEADER"); -const u8 gUnknown_Debug_083C1B05[] = _("FTーGYMー02ーLEADER"); -const u8 gUnknown_Debug_083C1B16[] = _("FTーGYMー03ーLEADER"); -const u8 gUnknown_Debug_083C1B27[] = _("FTーGYMー04ーLEADER"); -const u8 gUnknown_Debug_083C1B38[] = _("FTーGYMー05ーLEADER"); -const u8 gUnknown_Debug_083C1B49[] = _("FTーGYMー06ーLEADER"); -const u8 gUnknown_Debug_083C1B5A[] = _("FTーGYMー07ーLEADER"); -const u8 gUnknown_Debug_083C1B6B[] = _("FTーGYMー08ーLEADER"); +static const u8 gUnknown_Debug_083C1AF4[] = _("FTーGYMー01ーLEADER"); +static const u8 gUnknown_Debug_083C1B05[] = _("FTーGYMー02ーLEADER"); +static const u8 gUnknown_Debug_083C1B16[] = _("FTーGYMー03ーLEADER"); +static const u8 gUnknown_Debug_083C1B27[] = _("FTーGYMー04ーLEADER"); +static const u8 gUnknown_Debug_083C1B38[] = _("FTーGYMー05ーLEADER"); +static const u8 gUnknown_Debug_083C1B49[] = _("FTーGYMー06ーLEADER"); +static const u8 gUnknown_Debug_083C1B5A[] = _("FTーGYMー07ーLEADER"); +static const u8 gUnknown_Debug_083C1B6B[] = _("FTーGYMー08ーLEADER"); -const struct MenuAction gUnknown_Debug_083C1B7C[] = { +static const struct MenuAction gUnknown_Debug_083C1B7C[] = { {gUnknown_Debug_083C1AF4, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1B05, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1B16, TomomichiDebugMenu_Config}, @@ -767,42 +767,42 @@ const struct MenuAction gUnknown_Debug_083C1B7C[] = { {gUnknown_Debug_083C1B6B, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1BBC[] = _("FTーSHITENー01"); -const u8 gUnknown_Debug_083C1BC9[] = _("FTーSHITENー02"); -const u8 gUnknown_Debug_083C1BD6[] = _("FTーSHITENー03"); -const u8 gUnknown_Debug_083C1BE3[] = _("FTーSHITENー04"); +static const u8 gUnknown_Debug_083C1BBC[] = _("FTーSHITENー01"); +static const u8 gUnknown_Debug_083C1BC9[] = _("FTーSHITENー02"); +static const u8 gUnknown_Debug_083C1BD6[] = _("FTーSHITENー03"); +static const u8 gUnknown_Debug_083C1BE3[] = _("FTーSHITENー04"); -const struct MenuAction gUnknown_Debug_083C1BF0[] = { +static const struct MenuAction gUnknown_Debug_083C1BF0[] = { {gUnknown_Debug_083C1BBC, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1BC9, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1BD6, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1BE3, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1C10[] = _("FTーMITSURUー01ーCAVEーD1301"); +static const u8 gUnknown_Debug_083C1C10[] = _("FTーMITSURUー01ーCAVEーD1301"); -const struct MenuAction gUnknown_Debug_083C1C2C[] = { +static const struct MenuAction gUnknown_Debug_083C1C2C[] = { {gUnknown_Debug_083C1C10, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1C34[] = {8, 4, 1}; -const u16 gUnknown_Debug_083C1C38[][9] = { +static const u8 gUnknown_Debug_083C1C34[] = {8, 4, 1}; +static const u16 gUnknown_Debug_083C1C38[][9] = { {FLAG_DEFEATED_RUSTBORO_GYM, FLAG_DEFEATED_DEWFORD_GYM, FLAG_DEFEATED_MAUVILLE_GYM, FLAG_DEFEATED_LAVARIDGE_GYM, FLAG_DEFEATED_PETALBURG_GYM, FLAG_DEFEATED_FORTREE_GYM, FLAG_DEFEATED_MOSSDEEP_GYM, FLAG_DEFEATED_SOOTOPOLIS_GYM}, {FLAG_DEFEATED_ELITE_4_SYDNEY, FLAG_DEFEATED_ELITE_4_PHOEBE, FLAG_DEFEATED_ELITE_4_GLACIA, FLAG_DEFEATED_ELITE_4_DRAKE}, {0x04E1} }; -const u8 gUnknown_Debug_083C1C6E[] = _("120/119ばんどうろカクレオン"); -const u8 gUnknown_Debug_083C1C80[] = _("そのた1 / SUPPORTM/W"); -const u8 gUnknown_Debug_083C1C92[] = _("ODAMAKI/FIGHTER1"); -const u8 gUnknown_Debug_083C1CA3[] = _("MITSURU/TENKI"); -const u8 gUnknown_Debug_083C1CB1[] = _("そのた2 /DAIGO"); -const u8 gUnknown_Debug_083C1CBD[] = _("POKE/POKEMON"); -const u8 gUnknown_Debug_083C1CCA[] = _("MAMA/SUPPORT02"); -const u8 gUnknown_Debug_083C1CD9[] = _("HAGI"); -const u8 gUnknown_Debug_083C1CDE[] = _("SUPPORT01"); - -const struct MenuAction gUnknown_Debug_083C1CE8[] = { +static const u8 gUnknown_Debug_083C1C6E[] = _("120/119ばんどうろカクレオン"); +static const u8 gUnknown_Debug_083C1C80[] = _("そのた1 / SUPPORTM/W"); +static const u8 gUnknown_Debug_083C1C92[] = _("ODAMAKI/FIGHTER1"); +static const u8 gUnknown_Debug_083C1CA3[] = _("MITSURU/TENKI"); +static const u8 gUnknown_Debug_083C1CB1[] = _("そのた2 /DAIGO"); +static const u8 gUnknown_Debug_083C1CBD[] = _("POKE/POKEMON"); +static const u8 gUnknown_Debug_083C1CCA[] = _("MAMA/SUPPORT02"); +static const u8 gUnknown_Debug_083C1CD9[] = _("HAGI"); +static const u8 gUnknown_Debug_083C1CDE[] = _("SUPPORT01"); + +static const struct MenuAction gUnknown_Debug_083C1CE8[] = { {gUnknown_Debug_083C1C6E, debug_sub_808C85C}, {gUnknown_Debug_083C1C80, debug_sub_808C8B4}, {gUnknown_Debug_083C1C92, debug_sub_808C90C}, @@ -814,17 +814,17 @@ const struct MenuAction gUnknown_Debug_083C1CE8[] = { {gUnknown_Debug_083C1CDE, debug_sub_808CB1C} }; -const u8 gUnknown_Debug_083C1D30[] = _("FVーKAKUREONBー01ーFIELDーR120"); -const u8 gUnknown_Debug_083C1D4B[] = _("FVーKAKUREー01ーFIELDーR120"); -const u8 gUnknown_Debug_083C1D63[] = _("FVーKAKUREー02ーFIELDーR120"); -const u8 gUnknown_Debug_083C1D7B[] = _("FVーKAKUREー03ーFIELDーR120"); -const u8 gUnknown_Debug_083C1D93[] = _("FVーKAKUREー04ーFIELDーR120"); -const u8 gUnknown_Debug_083C1DAB[] = _("FVーKAKUREー05ーFIELDーR120"); -const u8 gUnknown_Debug_083C1DC3[] = _("FVーKAKUREー06ーFIELDーR120"); -const u8 gUnknown_Debug_083C1DDB[] = _("FVーKAKUREー01ーFIELDーR119"); -const u8 gUnknown_Debug_083C1DF3[] = _("FVーKAKUREー02ーFIELDーR119"); - -const struct MenuAction gUnknown_Debug_083C1E0C[] = { +static const u8 gUnknown_Debug_083C1D30[] = _("FVーKAKUREONBー01ーFIELDーR120"); +static const u8 gUnknown_Debug_083C1D4B[] = _("FVーKAKUREー01ーFIELDーR120"); +static const u8 gUnknown_Debug_083C1D63[] = _("FVーKAKUREー02ーFIELDーR120"); +static const u8 gUnknown_Debug_083C1D7B[] = _("FVーKAKUREー03ーFIELDーR120"); +static const u8 gUnknown_Debug_083C1D93[] = _("FVーKAKUREー04ーFIELDーR120"); +static const u8 gUnknown_Debug_083C1DAB[] = _("FVーKAKUREー05ーFIELDーR120"); +static const u8 gUnknown_Debug_083C1DC3[] = _("FVーKAKUREー06ーFIELDーR120"); +static const u8 gUnknown_Debug_083C1DDB[] = _("FVーKAKUREー01ーFIELDーR119"); +static const u8 gUnknown_Debug_083C1DF3[] = _("FVーKAKUREー02ーFIELDーR119"); + +static const struct MenuAction gUnknown_Debug_083C1E0C[] = { {gUnknown_Debug_083C1D30, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1D4B, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1D63, TomomichiDebugMenu_Config}, @@ -836,17 +836,17 @@ const struct MenuAction gUnknown_Debug_083C1E0C[] = { {gUnknown_Debug_083C1DF3, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1E54[] = _("FVーBALLー01ーC107ーR0501"); -const u8 gUnknown_Debug_083C1E6A[] = _("FVーWORKERM1ー04ーFIELDーC104"); -const u8 gUnknown_Debug_083C1E84[] = _("FVーSUBMARINEー06ーCAVEーD1101"); -const u8 gUnknown_Debug_083C1E9F[] = _("FVーGUESTーALLーC106ーR0102"); -const u8 gUnknown_Debug_083C1EB7[] = _("FVーHORIDASIー01ーC106ーR1106"); -const u8 gUnknown_Debug_083C1ED1[] = _("FVーMIDDLEM1ー01ーR110ーR0101"); -const u8 gUnknown_Debug_083C1EEB[] = _("FVーFUNEー01ーC102ーR0601"); -const u8 gUnknown_Debug_083C1F01[] = _("FVーSUPPORTWー01ーT101ーR0202"); -const u8 gUnknown_Debug_083C1F1B[] = _("FVーSUPPORTMー01ーT101ーR0102"); - -const struct MenuAction gUnknown_Debug_083C1F38[] = { +static const u8 gUnknown_Debug_083C1E54[] = _("FVーBALLー01ーC107ーR0501"); +static const u8 gUnknown_Debug_083C1E6A[] = _("FVーWORKERM1ー04ーFIELDーC104"); +static const u8 gUnknown_Debug_083C1E84[] = _("FVーSUBMARINEー06ーCAVEーD1101"); +static const u8 gUnknown_Debug_083C1E9F[] = _("FVーGUESTーALLーC106ーR0102"); +static const u8 gUnknown_Debug_083C1EB7[] = _("FVーHORIDASIー01ーC106ーR1106"); +static const u8 gUnknown_Debug_083C1ED1[] = _("FVーMIDDLEM1ー01ーR110ーR0101"); +static const u8 gUnknown_Debug_083C1EEB[] = _("FVーFUNEー01ーC102ーR0601"); +static const u8 gUnknown_Debug_083C1F01[] = _("FVーSUPPORTWー01ーT101ーR0202"); +static const u8 gUnknown_Debug_083C1F1B[] = _("FVーSUPPORTMー01ーT101ーR0102"); + +static const struct MenuAction gUnknown_Debug_083C1F38[] = { {gUnknown_Debug_083C1E54, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1E6A, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1E84, TomomichiDebugMenu_Config}, @@ -858,17 +858,17 @@ const struct MenuAction gUnknown_Debug_083C1F38[] = { {gUnknown_Debug_083C1F1B, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C1F80[] = _("FVーODAMAKIー01ーFIELDーR101"); -const u8 gUnknown_Debug_083C1F99[] = _("FVーODAMAKIー01ーT101ーR0301"); -const u8 gUnknown_Debug_083C1FB2[] = _("FVーODAMAKIーHYOKAーT101ーR0301"); -const u8 gUnknown_Debug_083C1FCE[] = _("FVーODAMAKIーHYOKAーFIELDーR101"); -const u8 gUnknown_Debug_083C1FEA[] = _("FVーODAMAKIーHYOKAーFIELDーR103"); -const u8 gUnknown_Debug_083C2006[] = _("FVーODAMAKIー01ーC109ーR0105"); -const u8 gUnknown_Debug_083C201F[] = _("FVーFIGHTERー01ーCAVEーD0201"); -const u8 gUnknown_Debug_083C2038[] = _("FVーFIGHTERー01ーT106ーR0201"); -const u8 gUnknown_Debug_083C2051[] = _("FVーFIGHTERー01ーFIELDーR116"); - -const struct MenuAction gUnknown_Debug_083C206C[] = { +static const u8 gUnknown_Debug_083C1F80[] = _("FVーODAMAKIー01ーFIELDーR101"); +static const u8 gUnknown_Debug_083C1F99[] = _("FVーODAMAKIー01ーT101ーR0301"); +static const u8 gUnknown_Debug_083C1FB2[] = _("FVーODAMAKIーHYOKAーT101ーR0301"); +static const u8 gUnknown_Debug_083C1FCE[] = _("FVーODAMAKIーHYOKAーFIELDーR101"); +static const u8 gUnknown_Debug_083C1FEA[] = _("FVーODAMAKIーHYOKAーFIELDーR103"); +static const u8 gUnknown_Debug_083C2006[] = _("FVーODAMAKIー01ーC109ーR0105"); +static const u8 gUnknown_Debug_083C201F[] = _("FVーFIGHTERー01ーCAVEーD0201"); +static const u8 gUnknown_Debug_083C2038[] = _("FVーFIGHTERー01ーT106ーR0201"); +static const u8 gUnknown_Debug_083C2051[] = _("FVーFIGHTERー01ーFIELDーR116"); + +static const struct MenuAction gUnknown_Debug_083C206C[] = { {gUnknown_Debug_083C1F80, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1F99, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C1FB2, TomomichiDebugMenu_Config}, @@ -880,17 +880,17 @@ const struct MenuAction gUnknown_Debug_083C206C[] = { {gUnknown_Debug_083C2051, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C20B4[] = _("FVーMITSURUー01ーFIELDーC101"); -const u8 gUnknown_Debug_083C20CD[] = _("FVーMITSURUー02ーCAVEーD1301"); -const u8 gUnknown_Debug_083C20E6[] = _("FVーMITSURUー01ーFIELDーC103"); -const u8 gUnknown_Debug_083C20FF[] = _("FVーMITSURUー01ーT106ーR0201"); -const u8 gUnknown_Debug_083C2118[] = _("FVーMITSURUー01ーCAVEーD1301"); -const u8 gUnknown_Debug_083C2131[] = _("FVーMITSURUー01ーC101ーR0201"); -const u8 gUnknown_Debug_083C214A[] = _("FVーMITSURUー01ーFIELDーR102"); -const u8 gUnknown_Debug_083C2163[] = _("FVーTENKIー01ーR119ーR101"); -const u8 gUnknown_Debug_083C2179[] = _("FVーTENKIー01ーR119ーR102"); - -const struct MenuAction gUnknown_Debug_083C2190[] = { +static const u8 gUnknown_Debug_083C20B4[] = _("FVーMITSURUー01ーFIELDーC101"); +static const u8 gUnknown_Debug_083C20CD[] = _("FVーMITSURUー02ーCAVEーD1301"); +static const u8 gUnknown_Debug_083C20E6[] = _("FVーMITSURUー01ーFIELDーC103"); +static const u8 gUnknown_Debug_083C20FF[] = _("FVーMITSURUー01ーT106ーR0201"); +static const u8 gUnknown_Debug_083C2118[] = _("FVーMITSURUー01ーCAVEーD1301"); +static const u8 gUnknown_Debug_083C2131[] = _("FVーMITSURUー01ーC101ーR0201"); +static const u8 gUnknown_Debug_083C214A[] = _("FVーMITSURUー01ーFIELDーR102"); +static const u8 gUnknown_Debug_083C2163[] = _("FVーTENKIー01ーR119ーR101"); +static const u8 gUnknown_Debug_083C2179[] = _("FVーTENKIー01ーR119ーR102"); + +static const struct MenuAction gUnknown_Debug_083C2190[] = { {gUnknown_Debug_083C20B4, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C20CD, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C20E6, TomomichiDebugMenu_Config}, @@ -902,14 +902,14 @@ const struct MenuAction gUnknown_Debug_083C2190[] = { {gUnknown_Debug_083C2179, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C21D8[] = _("FVーDAIGOー01ーCAVEーD0504"); -const u8 gUnknown_Debug_083C21EF[] = _("FVーDAIGOー01ーFIELDーR128"); -const u8 gUnknown_Debug_083C2206[] = _("FVーDAIGOー01ーFIELDーR118"); -const u8 gUnknown_Debug_083C221D[] = _("FVーDAIGOー01ーC107ーR0501"); -const u8 gUnknown_Debug_083C2234[] = _("FVーDAIGOー01ーFIELDーR120"); -const u8 gUnknown_Debug_083C224B[] = _("FVーDAIGOー01ーFIELDーR108"); +static const u8 gUnknown_Debug_083C21D8[] = _("FVーDAIGOー01ーCAVEーD0504"); +static const u8 gUnknown_Debug_083C21EF[] = _("FVーDAIGOー01ーFIELDーR128"); +static const u8 gUnknown_Debug_083C2206[] = _("FVーDAIGOー01ーFIELDーR118"); +static const u8 gUnknown_Debug_083C221D[] = _("FVーDAIGOー01ーC107ーR0501"); +static const u8 gUnknown_Debug_083C2234[] = _("FVーDAIGOー01ーFIELDーR120"); +static const u8 gUnknown_Debug_083C224B[] = _("FVーDAIGOー01ーFIELDーR108"); -const struct MenuAction gUnknown_Debug_083C2264[] = { +static const struct MenuAction gUnknown_Debug_083C2264[] = { {gUnknown_Debug_083C21D8, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C21EF, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2206, TomomichiDebugMenu_Config}, @@ -918,17 +918,17 @@ const struct MenuAction gUnknown_Debug_083C2264[] = { {gUnknown_Debug_083C224B, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2294[] = _("FVーPOKE1ー02ーCAVEーD1111"); -const u8 gUnknown_Debug_083C22AB[] = _("FVーPOKE1ー01ーCAVEーD0601"); -const u8 gUnknown_Debug_083C22C2[] = _("FVーPOKE1ー02ーCAVEーD0601"); -const u8 gUnknown_Debug_083C22D9[] = _("FVーPOKE1ー01ーFIELDーR101"); -const u8 gUnknown_Debug_083C22F0[] = _("FVーPOKE1ー01ーOPENINGーROOM01"); -const u8 gUnknown_Debug_083C230B[] = _("FVーPOKE1ー02ーOPENINGーROOM01"); -const u8 gUnknown_Debug_083C2326[] = _("FVーPOKE1ー01ーCAVEーD2308"); -const u8 gUnknown_Debug_083C233D[] = _("FVーPOKEMONー01ーCAVEーD0201"); -const u8 gUnknown_Debug_083C2356[] = _("FVーPOKEMONー01ーR104ーR0101"); - -const struct MenuAction gUnknown_Debug_083C2370[] = { +static const u8 gUnknown_Debug_083C2294[] = _("FVーPOKE1ー02ーCAVEーD1111"); +static const u8 gUnknown_Debug_083C22AB[] = _("FVーPOKE1ー01ーCAVEーD0601"); +static const u8 gUnknown_Debug_083C22C2[] = _("FVーPOKE1ー02ーCAVEーD0601"); +static const u8 gUnknown_Debug_083C22D9[] = _("FVーPOKE1ー01ーFIELDーR101"); +static const u8 gUnknown_Debug_083C22F0[] = _("FVーPOKE1ー01ーOPENINGーROOM01"); +static const u8 gUnknown_Debug_083C230B[] = _("FVーPOKE1ー02ーOPENINGーROOM01"); +static const u8 gUnknown_Debug_083C2326[] = _("FVーPOKE1ー01ーCAVEーD2308"); +static const u8 gUnknown_Debug_083C233D[] = _("FVーPOKEMONー01ーCAVEーD0201"); +static const u8 gUnknown_Debug_083C2356[] = _("FVーPOKEMONー01ーR104ーR0101"); + +static const struct MenuAction gUnknown_Debug_083C2370[] = { {gUnknown_Debug_083C2294, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C22AB, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C22C2, TomomichiDebugMenu_Config}, @@ -940,17 +940,17 @@ const struct MenuAction gUnknown_Debug_083C2370[] = { {gUnknown_Debug_083C2356, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C23B8[] = _("FVーMAMAー01ーFIELDーT101"); -const u8 gUnknown_Debug_083C23CE[] = _("FVーMAMAー01ーOPENINGーROOM02"); -const u8 gUnknown_Debug_083C23E8[] = _("FVーMAMAー01ーT101ーR0101"); -const u8 gUnknown_Debug_083C23FE[] = _("FVーMAMAー01ーT101ーR0201"); -const u8 gUnknown_Debug_083C2414[] = _("FVーMAMAー02ーT101ーR0101"); -const u8 gUnknown_Debug_083C242A[] = _("FVーMAMAー02ーT101ーR0201"); -const u8 gUnknown_Debug_083C2440[] = _("FVーSUPPORTー02ーFIELDーR110"); -const u8 gUnknown_Debug_083C2459[] = _("FVーSUPPORTー02ーFIELDーR119"); -const u8 gUnknown_Debug_083C2472[] = _("FVーSUPPORTー02ーFIELDーT104"); - -const struct MenuAction gUnknown_Debug_083C248C[] = { +static const u8 gUnknown_Debug_083C23B8[] = _("FVーMAMAー01ーFIELDーT101"); +static const u8 gUnknown_Debug_083C23CE[] = _("FVーMAMAー01ーOPENINGーROOM02"); +static const u8 gUnknown_Debug_083C23E8[] = _("FVーMAMAー01ーT101ーR0101"); +static const u8 gUnknown_Debug_083C23FE[] = _("FVーMAMAー01ーT101ーR0201"); +static const u8 gUnknown_Debug_083C2414[] = _("FVーMAMAー02ーT101ーR0101"); +static const u8 gUnknown_Debug_083C242A[] = _("FVーMAMAー02ーT101ーR0201"); +static const u8 gUnknown_Debug_083C2440[] = _("FVーSUPPORTー02ーFIELDーR110"); +static const u8 gUnknown_Debug_083C2459[] = _("FVーSUPPORTー02ーFIELDーR119"); +static const u8 gUnknown_Debug_083C2472[] = _("FVーSUPPORTー02ーFIELDーT104"); + +static const struct MenuAction gUnknown_Debug_083C248C[] = { {gUnknown_Debug_083C23B8, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C23CE, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C23E8, TomomichiDebugMenu_Config}, @@ -962,17 +962,17 @@ const struct MenuAction gUnknown_Debug_083C248C[] = { {gUnknown_Debug_083C2472, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C24D4[] = _("FVーHAGIー01ーFIELDーR104"); -const u8 gUnknown_Debug_083C24EA[] = _("FVーHAGIー01ーR104ーR0101"); -const u8 gUnknown_Debug_083C2500[] = _("FVーHAGIー01ーFIELDーT103"); -const u8 gUnknown_Debug_083C2516[] = _("FVーHAGIー01ーFIELDーR109"); -const u8 gUnknown_Debug_083C252C[] = _("FVーHAGIー01ーC102ーR0601"); -const u8 gUnknown_Debug_083C2542[] = _("FVーHAGIー01ーC102ーR0101"); -const u8 gUnknown_Debug_083C2558[] = _("FVーHAGIー01ーCAVEーD0201"); -const u8 gUnknown_Debug_083C256E[] = _("FVーHAGIー01ーFIELDーR116"); -const u8 gUnknown_Debug_083C2584[] = _("FVーHAGIー01ーSPーSHIP01"); - -const struct MenuAction gUnknown_Debug_083C259C[] = { +static const u8 gUnknown_Debug_083C24D4[] = _("FVーHAGIー01ーFIELDーR104"); +static const u8 gUnknown_Debug_083C24EA[] = _("FVーHAGIー01ーR104ーR0101"); +static const u8 gUnknown_Debug_083C2500[] = _("FVーHAGIー01ーFIELDーT103"); +static const u8 gUnknown_Debug_083C2516[] = _("FVーHAGIー01ーFIELDーR109"); +static const u8 gUnknown_Debug_083C252C[] = _("FVーHAGIー01ーC102ーR0601"); +static const u8 gUnknown_Debug_083C2542[] = _("FVーHAGIー01ーC102ーR0101"); +static const u8 gUnknown_Debug_083C2558[] = _("FVーHAGIー01ーCAVEーD0201"); +static const u8 gUnknown_Debug_083C256E[] = _("FVーHAGIー01ーFIELDーR116"); +static const u8 gUnknown_Debug_083C2584[] = _("FVーHAGIー01ーSPーSHIP01"); + +static const struct MenuAction gUnknown_Debug_083C259C[] = { {gUnknown_Debug_083C24D4, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C24EA, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2500, TomomichiDebugMenu_Config}, @@ -984,17 +984,17 @@ const struct MenuAction gUnknown_Debug_083C259C[] = { {gUnknown_Debug_083C2584, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C25E4[] = _("FVーSUPPORTー01ーT101ーR0301"); -const u8 gUnknown_Debug_083C25FD[] = _("FVーSUPPORTー01ーC109ーR0105"); -const u8 gUnknown_Debug_083C2616[] = _("FVーSUPPORTー01ーFIELDーC104"); -const u8 gUnknown_Debug_083C262F[] = _("FVーSUPPORTー01ーFIELDーC106"); -const u8 gUnknown_Debug_083C2648[] = _("FVーSUPPORTー01ーFIELDーR103"); -const u8 gUnknown_Debug_083C2661[] = _("FVーSUPPORTー01ーFIELDーR110"); -const u8 gUnknown_Debug_083C267A[] = _("FVーSUPPORTー01ーFIELDーR119"); -const u8 gUnknown_Debug_083C2693[] = _("FVーSUPPORTー01ーFIELDーT104"); -const u8 gUnknown_Debug_083C26AC[] = _("FVーSUPPORTー01ーFIELDーT102"); - -const struct MenuAction gUnknown_Debug_083C26C8[] = { +static const u8 gUnknown_Debug_083C25E4[] = _("FVーSUPPORTー01ーT101ーR0301"); +static const u8 gUnknown_Debug_083C25FD[] = _("FVーSUPPORTー01ーC109ーR0105"); +static const u8 gUnknown_Debug_083C2616[] = _("FVーSUPPORTー01ーFIELDーC104"); +static const u8 gUnknown_Debug_083C262F[] = _("FVーSUPPORTー01ーFIELDーC106"); +static const u8 gUnknown_Debug_083C2648[] = _("FVーSUPPORTー01ーFIELDーR103"); +static const u8 gUnknown_Debug_083C2661[] = _("FVーSUPPORTー01ーFIELDーR110"); +static const u8 gUnknown_Debug_083C267A[] = _("FVーSUPPORTー01ーFIELDーR119"); +static const u8 gUnknown_Debug_083C2693[] = _("FVーSUPPORTー01ーFIELDーT104"); +static const u8 gUnknown_Debug_083C26AC[] = _("FVーSUPPORTー01ーFIELDーT102"); + +static const struct MenuAction gUnknown_Debug_083C26C8[] = { {gUnknown_Debug_083C25E4, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C25FD, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2616, TomomichiDebugMenu_Config}, @@ -1006,9 +1006,9 @@ const struct MenuAction gUnknown_Debug_083C26C8[] = { {gUnknown_Debug_083C26AC, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2710[] = {9, 9, 9, 9, 6, 9, 9, 9, 9}; +static const u8 gUnknown_Debug_083C2710[] = {9, 9, 9, 9, 6, 9, 9, 9, 9}; -const u16 gUnknown_Debug_083C271A[][9] = { +static const u16 gUnknown_Debug_083C271A[][9] = { {FLAG_HIDE_KECLEON_ROUTE120_2, FLAG_HIDE_KECLEON_ROUTE120_1, FLAG_HIDE_KECLEON_ROUTE120_3, FLAG_HIDE_KECLEON_ROUTE120_4, FLAG_HIDE_KECLEON_ROUTE120_5, FLAG_HIDE_KECLEON_ROUTE120_6, FLAG_HIDE_KECLEON_ROUTE120_7, FLAG_HIDE_KECLEON_ROUTE119_1, FLAG_HIDE_KECLEON_ROUTE119_2}, {FLAG_HIDE_BELDUM_BALL_STEVENS_HOUSE, FLAG_HIDE_DEVON_RUSTBORO, FLAG_HIDE_UNDERWATER_SUBMARINE_INTERACTION, FLAG_HIDE_LILYCOVE_MOTEL_PEOPLE, FLAG_HIDE_ROOFTOP_LADY_LILYCOVE_MART, FLAG_HIDE_TRICKMASTER_ENTRANCE, 0x352, FLAG_HIDE_MAY_UPSTAIRS, FLAG_HIDE_BRENDAN_UPSTAIRS}, {FLAG_HIDE_BIRCH_BATTLE_POOCHYENA, FLAG_HIDE_BIRCH_IN_LAB, FLAG_UNKNOWN_BIRCH_380, FLAG_HIDE_BIRCH_ROUTE101, FLAG_HIDE_BIRCH_ROUTE103, FLAG_HIDE_BIRCH_CHAMPIONS_ROOM, FLAG_HIDE_BOYFRIEND_RUSTURF_TUNNEL, FLAG_HIDE_BOYFRIEND_WANDAS_HOUSE, FLAG_HIDE_TUNNER_DIGGER_ROUTE116}, @@ -1020,17 +1020,17 @@ const u16 gUnknown_Debug_083C271A[][9] = { {FLAG_HIDE_RIVAL_BIRCH_LAB, FLAG_HIDE_RIVAL_CHAMPIONS_ROOM, FLAG_HIDE_RIVAL_RUSTBORO, FLAG_HIDE_RIVAL_LILYCOVE_MART, FLAG_HIDE_RIVAL_ROUTE103, FLAG_HIDE_RIVAL_ROUTE110, FLAG_HIDE_RIVAL_ROUTE119, FLAG_HIDE_RIVAL_LAVARIDGE_1, FLAG_HIDE_RIVAL_OLDALE_TOWN} }; -const u8 gUnknown_Debug_083C27BC[] = _("FEひでんわざ/デボンかんれん"); -const u8 gUnknown_Debug_083C27CC[] = _("FEだいじなアイテムPART1"); -const u8 gUnknown_Debug_083C27DC[] = _("そのた1"); -const u8 gUnknown_Debug_083C27E1[] = _("MITSURU/DOOR"); -const u8 gUnknown_Debug_083C27EE[] = _("カラクリやしき10のやじるし/GYM07"); -const u8 gUnknown_Debug_083C2803[] = _("SUPPORT/そのた4"); -const u8 gUnknown_Debug_083C2810[] = _("DAISUKI/そのた5"); -const u8 gUnknown_Debug_083C281D[] = _("そのた2"); -const u8 gUnknown_Debug_083C2822[] = _("そのた6"); - -const struct MenuAction gUnknown_Debug_083C2828[] = { +static const u8 gUnknown_Debug_083C27BC[] = _("FEひでんわざ/デボンかんれん"); +static const u8 gUnknown_Debug_083C27CC[] = _("FEだいじなアイテムPART1"); +static const u8 gUnknown_Debug_083C27DC[] = _("そのた1"); +static const u8 gUnknown_Debug_083C27E1[] = _("MITSURU/DOOR"); +static const u8 gUnknown_Debug_083C27EE[] = _("カラクリやしき10のやじるし/GYM07"); +static const u8 gUnknown_Debug_083C2803[] = _("SUPPORT/そのた4"); +static const u8 gUnknown_Debug_083C2810[] = _("DAISUKI/そのた5"); +static const u8 gUnknown_Debug_083C281D[] = _("そのた2"); +static const u8 gUnknown_Debug_083C2822[] = _("そのた6"); + +static const struct MenuAction gUnknown_Debug_083C2828[] = { {gUnknown_Debug_083C27BC, debug_sub_808C3B0}, {gUnknown_Debug_083C27CC, debug_sub_808C408}, {gUnknown_Debug_083C27DC, debug_sub_808C460}, @@ -1042,17 +1042,17 @@ const struct MenuAction gUnknown_Debug_083C2828[] = { {gUnknown_Debug_083C2822, debug_sub_808C670} }; -const u8 gUnknown_Debug_083C2870[] = _("FEーHWAZA01ーGET"); -const u8 gUnknown_Debug_083C287F[] = _("FEーHWAZA02ー01ーFIELDR119"); -const u8 gUnknown_Debug_083C2897[] = _("FEーHWAZA03ーGET"); -const u8 gUnknown_Debug_083C28A6[] = _("FEーHWAZA04ー01ーT106ーR0201"); -const u8 gUnknown_Debug_083C28BF[] = _("FEーHWAZA05ー01ーCAVEーD0502"); -const u8 gUnknown_Debug_083C28D8[] = _("FEーHWAZA04ー01ーC103ーR0301"); -const u8 gUnknown_Debug_083C28F1[] = _("FEーDEBONーNIMOTSUーRETURN"); -const u8 gUnknown_Debug_083C2909[] = _("FEーDEBONー01ーFIELDーC104"); -const u8 gUnknown_Debug_083C2920[] = _("FEーDEBONー02ーFIELDーC104"); - -const struct MenuAction gUnknown_Debug_083C2938[] = { +static const u8 gUnknown_Debug_083C2870[] = _("FEーHWAZA01ーGET"); +static const u8 gUnknown_Debug_083C287F[] = _("FEーHWAZA02ー01ーFIELDR119"); +static const u8 gUnknown_Debug_083C2897[] = _("FEーHWAZA03ーGET"); +static const u8 gUnknown_Debug_083C28A6[] = _("FEーHWAZA04ー01ーT106ーR0201"); +static const u8 gUnknown_Debug_083C28BF[] = _("FEーHWAZA05ー01ーCAVEーD0502"); +static const u8 gUnknown_Debug_083C28D8[] = _("FEーHWAZA04ー01ーC103ーR0301"); +static const u8 gUnknown_Debug_083C28F1[] = _("FEーDEBONーNIMOTSUーRETURN"); +static const u8 gUnknown_Debug_083C2909[] = _("FEーDEBONー01ーFIELDーC104"); +static const u8 gUnknown_Debug_083C2920[] = _("FEーDEBONー02ーFIELDーC104"); + +static const struct MenuAction gUnknown_Debug_083C2938[] = { {gUnknown_Debug_083C2870, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C287F, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2897, TomomichiDebugMenu_Config}, @@ -1064,17 +1064,17 @@ const struct MenuAction gUnknown_Debug_083C2938[] = { {gUnknown_Debug_083C2920, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2980[] = _("FEーCYCLEー01ーP01ーP01ーC103ーR0201"); -const u8 gUnknown_Debug_083C299F[] = _("FEーSCOOPー01ーP01ーFIELDーR115"); -const u8 gUnknown_Debug_083C29BA[] = _("FEーROPEー01ーP01ーFIELDーR114"); -const u8 gUnknown_Debug_083C29D4[] = _("FEーKAMAー01ーP01ーFIELDーR119"); -const u8 gUnknown_Debug_083C29EE[] = _("FEーZYOUROーGET"); -const u8 gUnknown_Debug_083C29FC[] = _("FEーCUBECASEーGET"); -const u8 gUnknown_Debug_083C2A0C[] = _("FEーBORONOTURIZAOーGET"); -const u8 gUnknown_Debug_083C2A21[] = _("FEーIITURIZAOーGET"); -const u8 gUnknown_Debug_083C2A32[] = _("FEーSUGOITURIZAOーGET"); - -const struct MenuAction gUnknown_Debug_083C2A48[] = { +static const u8 gUnknown_Debug_083C2980[] = _("FEーCYCLEー01ーP01ーP01ーC103ーR0201"); +static const u8 gUnknown_Debug_083C299F[] = _("FEーSCOOPー01ーP01ーFIELDーR115"); +static const u8 gUnknown_Debug_083C29BA[] = _("FEーROPEー01ーP01ーFIELDーR114"); +static const u8 gUnknown_Debug_083C29D4[] = _("FEーKAMAー01ーP01ーFIELDーR119"); +static const u8 gUnknown_Debug_083C29EE[] = _("FEーZYOUROーGET"); +static const u8 gUnknown_Debug_083C29FC[] = _("FEーCUBECASEーGET"); +static const u8 gUnknown_Debug_083C2A0C[] = _("FEーBORONOTURIZAOーGET"); +static const u8 gUnknown_Debug_083C2A21[] = _("FEーIITURIZAOーGET"); +static const u8 gUnknown_Debug_083C2A32[] = _("FEーSUGOITURIZAOーGET"); + +static const struct MenuAction gUnknown_Debug_083C2A48[] = { {gUnknown_Debug_083C2980, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C299F, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C29BA, TomomichiDebugMenu_Config}, @@ -1086,17 +1086,17 @@ const struct MenuAction gUnknown_Debug_083C2A48[] = { {gUnknown_Debug_083C2A32, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2A90[] = _("FEーBOSSー01ーCAVEーD0701"); -const u8 gUnknown_Debug_083C2AA6[] = _("FEーTANTIKIーRETURN"); -const u8 gUnknown_Debug_083C2AB8[] = _("FEーPOKE1ー01ーCAVEーD1111"); -const u8 gUnknown_Debug_083C2ACF[] = _("FEーPOKE1ー01ーCAVEーD1206"); -const u8 gUnknown_Debug_083C2AE6[] = _("FEーSHOPー01ーC104ーFS01"); -const u8 gUnknown_Debug_083C2AFB[] = _("FEーHUNENOTIKETTーGET"); -const u8 gUnknown_Debug_083C2B0F[] = _("FEーKAKUREー01ーFIELDーC105"); -const u8 gUnknown_Debug_083C2B27[] = _("FEーKASEKIーRETURN"); -const u8 gUnknown_Debug_083C2B38[] = _("FEーWINー01ーSPーSHIP01"); - -const struct MenuAction gUnknown_Debug_083C2B4C[] = { +static const u8 gUnknown_Debug_083C2A90[] = _("FEーBOSSー01ーCAVEーD0701"); +static const u8 gUnknown_Debug_083C2AA6[] = _("FEーTANTIKIーRETURN"); +static const u8 gUnknown_Debug_083C2AB8[] = _("FEーPOKE1ー01ーCAVEーD1111"); +static const u8 gUnknown_Debug_083C2ACF[] = _("FEーPOKE1ー01ーCAVEーD1206"); +static const u8 gUnknown_Debug_083C2AE6[] = _("FEーSHOPー01ーC104ーFS01"); +static const u8 gUnknown_Debug_083C2AFB[] = _("FEーHUNENOTIKETTーGET"); +static const u8 gUnknown_Debug_083C2B0F[] = _("FEーKAKUREー01ーFIELDーC105"); +static const u8 gUnknown_Debug_083C2B27[] = _("FEーKASEKIーRETURN"); +static const u8 gUnknown_Debug_083C2B38[] = _("FEーWINー01ーSPーSHIP01"); + +static const struct MenuAction gUnknown_Debug_083C2B4C[] = { {gUnknown_Debug_083C2A90, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2AA6, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2AB8, TomomichiDebugMenu_Config}, @@ -1108,17 +1108,17 @@ const struct MenuAction gUnknown_Debug_083C2B4C[] = { {gUnknown_Debug_083C2B38, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2B94[] = _("FEーMITSURUー01ーT106ーR0201"); -const u8 gUnknown_Debug_083C2BAD[] = _("FEーMITSURUー01ーCAVEーD1301"); -const u8 gUnknown_Debug_083C2BC6[] = _("FEーMITSURUー02ーFIELDーC103"); -const u8 gUnknown_Debug_083C2BDF[] = _("FEーMITSURUー02ーT106ーR0201"); -const u8 gUnknown_Debug_083C2BF8[] = _("FEーMITSURUー01ーFIELDーC103"); -const u8 gUnknown_Debug_083C2C11[] = _("FEーDOORーOPENー01ーCAVEーD1712"); -const u8 gUnknown_Debug_083C2C2C[] = _("FEーDOORーOPENー02ーCAVEーD1712"); -const u8 gUnknown_Debug_083C2C47[] = _("FEーDOORーOPENー04ーCAVEーD1712"); -const u8 gUnknown_Debug_083C2C62[] = _("FEーDOORーOPENー06ーCAVEーD1712"); - -const struct MenuAction gUnknown_Debug_083C2C80[] = { +static const u8 gUnknown_Debug_083C2B94[] = _("FEーMITSURUー01ーT106ーR0201"); +static const u8 gUnknown_Debug_083C2BAD[] = _("FEーMITSURUー01ーCAVEーD1301"); +static const u8 gUnknown_Debug_083C2BC6[] = _("FEーMITSURUー02ーFIELDーC103"); +static const u8 gUnknown_Debug_083C2BDF[] = _("FEーMITSURUー02ーT106ーR0201"); +static const u8 gUnknown_Debug_083C2BF8[] = _("FEーMITSURUー01ーFIELDーC103"); +static const u8 gUnknown_Debug_083C2C11[] = _("FEーDOORーOPENー01ーCAVEーD1712"); +static const u8 gUnknown_Debug_083C2C2C[] = _("FEーDOORーOPENー02ーCAVEーD1712"); +static const u8 gUnknown_Debug_083C2C47[] = _("FEーDOORーOPENー04ーCAVEーD1712"); +static const u8 gUnknown_Debug_083C2C62[] = _("FEーDOORーOPENー06ーCAVEーD1712"); + +static const struct MenuAction gUnknown_Debug_083C2C80[] = { {gUnknown_Debug_083C2B94, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2BAD, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2BC6, TomomichiDebugMenu_Config}, @@ -1130,17 +1130,17 @@ const struct MenuAction gUnknown_Debug_083C2C80[] = { {gUnknown_Debug_083C2C62, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2CC8[] = _("FEーKARAKURI10ーSWITCHー01"); -const u8 gUnknown_Debug_083C2CE0[] = _("FEーKARAKURI10ーSWITCHー02"); -const u8 gUnknown_Debug_083C2CF8[] = _("FEーKARAKURI10ーSWITCHー03"); -const u8 gUnknown_Debug_083C2D10[] = _("FEーKARAKURI10ーSWITCHー04"); -const u8 gUnknown_Debug_083C2D28[] = _("FEーKARAKURI10ーSWITCHー05"); -const u8 gUnknown_Debug_083C2D40[] = _("FEーGYM07ーSWITCHー01"); -const u8 gUnknown_Debug_083C2D53[] = _("FEーGYM07ーSWITCHー02"); -const u8 gUnknown_Debug_083C2D66[] = _("FEーGYM07ーSWITCHー03"); -const u8 gUnknown_Debug_083C2D79[] = _("FEーGYM07ーSWITCHー04"); - -const struct MenuAction gUnknown_Debug_083C2D8C[] = { +static const u8 gUnknown_Debug_083C2CC8[] = _("FEーKARAKURI10ーSWITCHー01"); +static const u8 gUnknown_Debug_083C2CE0[] = _("FEーKARAKURI10ーSWITCHー02"); +static const u8 gUnknown_Debug_083C2CF8[] = _("FEーKARAKURI10ーSWITCHー03"); +static const u8 gUnknown_Debug_083C2D10[] = _("FEーKARAKURI10ーSWITCHー04"); +static const u8 gUnknown_Debug_083C2D28[] = _("FEーKARAKURI10ーSWITCHー05"); +static const u8 gUnknown_Debug_083C2D40[] = _("FEーGYM07ーSWITCHー01"); +static const u8 gUnknown_Debug_083C2D53[] = _("FEーGYM07ーSWITCHー02"); +static const u8 gUnknown_Debug_083C2D66[] = _("FEーGYM07ーSWITCHー03"); +static const u8 gUnknown_Debug_083C2D79[] = _("FEーGYM07ーSWITCHー04"); + +static const struct MenuAction gUnknown_Debug_083C2D8C[] = { {gUnknown_Debug_083C2CC8, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2CE0, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2CF8, TomomichiDebugMenu_Config}, @@ -1152,17 +1152,17 @@ const struct MenuAction gUnknown_Debug_083C2D8C[] = { {gUnknown_Debug_083C2D79, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2DD4[] = _("FEーSUPPORTー01ーFIELDーR103"); -const u8 gUnknown_Debug_083C2DED[] = _("FEーSUPPORTー01ーFIELDーC106"); -const u8 gUnknown_Debug_083C2E06[] = _("FEーSUPPORTー01ーFIELDーR104"); -const u8 gUnknown_Debug_083C2E1F[] = _("FEーSUPPORTー02ーFIELDーC106"); -const u8 gUnknown_Debug_083C2E38[] = _("FEーSUPPORTー01ーT101ーR0202"); -const u8 gUnknown_Debug_083C2E51[] = _("FEーMAMAー01ーP01ーT101ーR0101"); -const u8 gUnknown_Debug_083C2E6B[] = _("FEーCLOCKーSET"); -const u8 gUnknown_Debug_083C2E78[] = _("FEーODAMAKIー01ーP01ーT101ーR03"); -const u8 gUnknown_Debug_083C2E93[] = _("FEーPAPAー01ーP01ーC101ーR0201"); - -const struct MenuAction gUnknown_Debug_083C2EB0[] = { +static const u8 gUnknown_Debug_083C2DD4[] = _("FEーSUPPORTー01ーFIELDーR103"); +static const u8 gUnknown_Debug_083C2DED[] = _("FEーSUPPORTー01ーFIELDーC106"); +static const u8 gUnknown_Debug_083C2E06[] = _("FEーSUPPORTー01ーFIELDーR104"); +static const u8 gUnknown_Debug_083C2E1F[] = _("FEーSUPPORTー02ーFIELDーC106"); +static const u8 gUnknown_Debug_083C2E38[] = _("FEーSUPPORTー01ーT101ーR0202"); +static const u8 gUnknown_Debug_083C2E51[] = _("FEーMAMAー01ーP01ーT101ーR0101"); +static const u8 gUnknown_Debug_083C2E6B[] = _("FEーCLOCKーSET"); +static const u8 gUnknown_Debug_083C2E78[] = _("FEーODAMAKIー01ーP01ーT101ーR03"); +static const u8 gUnknown_Debug_083C2E93[] = _("FEーPAPAー01ーP01ーC101ーR0201"); + +static const struct MenuAction gUnknown_Debug_083C2EB0[] = { {gUnknown_Debug_083C2DD4, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2DED, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2E06, TomomichiDebugMenu_Config}, @@ -1174,17 +1174,17 @@ const struct MenuAction gUnknown_Debug_083C2EB0[] = { {gUnknown_Debug_083C2E93, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C2EF8[] = _("FEーDAISUKIーGOODSーFLAG01"); -const u8 gUnknown_Debug_083C2F10[] = _("FEーDAISUKIーGOODSーFLAG02"); -const u8 gUnknown_Debug_083C2F28[] = _("FEーDAISUKIーGOODSーFLAG03"); -const u8 gUnknown_Debug_083C2F40[] = _("FEーDAISUKIーGOODSーFLAG04"); -const u8 gUnknown_Debug_083C2F58[] = _("FEーDAISUKIーGOODSーFLAG05"); -const u8 gUnknown_Debug_083C2F70[] = _("FEーBASHAー01ーP01ーFIELDーC101ー"); -const u8 gUnknown_Debug_083C2F8C[] = _("FEーBASHAー01ーP02ーFIELDーC101ー"); -const u8 gUnknown_Debug_083C2FA8[] = _("FEーBALLー01ーP01ーSPーCONTEST"); -const u8 gUnknown_Debug_083C2FC2[] = _("FEーWOMAN2ー01ーP01ーT101ーR0201"); - -const struct MenuAction gUnknown_Debug_083C2FE0[] = { +static const u8 gUnknown_Debug_083C2EF8[] = _("FEーDAISUKIーGOODSーFLAG01"); +static const u8 gUnknown_Debug_083C2F10[] = _("FEーDAISUKIーGOODSーFLAG02"); +static const u8 gUnknown_Debug_083C2F28[] = _("FEーDAISUKIーGOODSーFLAG03"); +static const u8 gUnknown_Debug_083C2F40[] = _("FEーDAISUKIーGOODSーFLAG04"); +static const u8 gUnknown_Debug_083C2F58[] = _("FEーDAISUKIーGOODSーFLAG05"); +static const u8 gUnknown_Debug_083C2F70[] = _("FEーBASHAー01ーP01ーFIELDーC101ー"); +static const u8 gUnknown_Debug_083C2F8C[] = _("FEーBASHAー01ーP02ーFIELDーC101ー"); +static const u8 gUnknown_Debug_083C2FA8[] = _("FEーBALLー01ーP01ーSPーCONTEST"); +static const u8 gUnknown_Debug_083C2FC2[] = _("FEーWOMAN2ー01ーP01ーT101ーR0201"); + +static const struct MenuAction gUnknown_Debug_083C2FE0[] = { {gUnknown_Debug_083C2EF8, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2F10, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C2F28, TomomichiDebugMenu_Config}, @@ -1196,17 +1196,17 @@ const struct MenuAction gUnknown_Debug_083C2FE0[] = { {gUnknown_Debug_083C2FC2, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C3028[] = _("FEーSOUKOーOPENーCAVEーD1704"); -const u8 gUnknown_Debug_083C3041[] = _("FEーSORAISIー01ーCAVEーD0101"); -const u8 gUnknown_Debug_083C305A[] = _("FEーMAYUMIー01ーーR114ーR0201"); -const u8 gUnknown_Debug_083C3073[] = _("FEーKUSUNOKIー01ーC102ーR0601"); -const u8 gUnknown_Debug_083C308D[] = _("FEーOLDWOMAN1ー01ーCAVEーD0808"); -const u8 gUnknown_Debug_083C30A8[] = _("FEーTRAINERM1ー01ーC109ーR0206"); -const u8 gUnknown_Debug_083C30C3[] = _("FEーSOONANOーTAMAGOーGET"); -const u8 gUnknown_Debug_083C30D9[] = _("FEーDASHーSHOESーGET"); -const u8 gUnknown_Debug_083C30EB[] = _("FEーDEBONSUKOOPUーGET"); - -const struct MenuAction gUnknown_Debug_083C3100[] = { +static const u8 gUnknown_Debug_083C3028[] = _("FEーSOUKOーOPENーCAVEーD1704"); +static const u8 gUnknown_Debug_083C3041[] = _("FEーSORAISIー01ーCAVEーD0101"); +static const u8 gUnknown_Debug_083C305A[] = _("FEーMAYUMIー01ーーR114ーR0201"); +static const u8 gUnknown_Debug_083C3073[] = _("FEーKUSUNOKIー01ーC102ーR0601"); +static const u8 gUnknown_Debug_083C308D[] = _("FEーOLDWOMAN1ー01ーCAVEーD0808"); +static const u8 gUnknown_Debug_083C30A8[] = _("FEーTRAINERM1ー01ーC109ーR0206"); +static const u8 gUnknown_Debug_083C30C3[] = _("FEーSOONANOーTAMAGOーGET"); +static const u8 gUnknown_Debug_083C30D9[] = _("FEーDASHーSHOESーGET"); +static const u8 gUnknown_Debug_083C30EB[] = _("FEーDEBONSUKOOPUーGET"); + +static const struct MenuAction gUnknown_Debug_083C3100[] = { {gUnknown_Debug_083C3028, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3041, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C305A, TomomichiDebugMenu_Config}, @@ -1218,17 +1218,17 @@ const struct MenuAction gUnknown_Debug_083C3100[] = { {gUnknown_Debug_083C30EB, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C3148[] = _("FEーSTUDYM1ー01ーP01ーT101R0301"); -const u8 gUnknown_Debug_083C3164[] = _("FEーWORKERM1ー01ーC103ーR0201"); -const u8 gUnknown_Debug_083C317E[] = _("FEーHIMITSUーGET"); -const u8 gUnknown_Debug_083C318D[] = _(""); -const u8 gUnknown_Debug_083C318E[] = _(""); -const u8 gUnknown_Debug_083C318F[] = _(""); -const u8 gUnknown_Debug_083C3190[] = _(""); -const u8 gUnknown_Debug_083C3191[] = _(""); -const u8 gUnknown_Debug_083C3192[] = _(""); - -const struct MenuAction gUnknown_Debug_083C3194[] = { +static const u8 gUnknown_Debug_083C3148[] = _("FEーSTUDYM1ー01ーP01ーT101R0301"); +static const u8 gUnknown_Debug_083C3164[] = _("FEーWORKERM1ー01ーC103ーR0201"); +static const u8 gUnknown_Debug_083C317E[] = _("FEーHIMITSUーGET"); +static const u8 gUnknown_Debug_083C318D[] = _(""); +static const u8 gUnknown_Debug_083C318E[] = _(""); +static const u8 gUnknown_Debug_083C318F[] = _(""); +static const u8 gUnknown_Debug_083C3190[] = _(""); +static const u8 gUnknown_Debug_083C3191[] = _(""); +static const u8 gUnknown_Debug_083C3192[] = _(""); + +static const struct MenuAction gUnknown_Debug_083C3194[] = { {gUnknown_Debug_083C3148, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3164, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C317E, TomomichiDebugMenu_Config}, @@ -1240,9 +1240,9 @@ const struct MenuAction gUnknown_Debug_083C3194[] = { {gUnknown_Debug_083C3192, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C31DC[] = {9, 9, 9, 9, 9, 9, 9, 9, 3}; +static const u8 gUnknown_Debug_083C31DC[] = {9, 9, 9, 9, 9, 9, 9, 9, 3}; -const u16 gUnknown_Debug_83C31E6[][9] = { +static const u16 gUnknown_Debug_83C31E6[][9] = { {FLAG_RECEIVED_HM01, FLAG_RECEIVED_HM02, FLAG_RECEIVED_HM03, FLAG_RECEIVED_HM04, FLAG_RECEIVED_HM05, FLAG_RECEIVED_HM06, FLAG_RETURNED_DEVON_GOODS, FLAG_DEVON_GOODS_STOLEN, FLAG_RECOVERED_DEVON_GOODS}, {FLAG_RECEIVED_BIKE, 0x05B, 0x05C, 0x05D, FLAG_RECEIVED_WAILMER_PAIL, FLAG_RECEIVED_POKEBLOCK_CASE, FLAG_RECEIVED_OLD_ROD, FLAG_RECEIVED_GOOD_ROD, FLAG_RECEIVED_SUPER_ROD}, {FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY, FLAG_EXCHANGED_SCANNER, FLAG_LEGEND_ESCAPED_SEAFLOOR_CAVERN, FLAG_LEGENDARY_BATTLE_COMPLETED, FLAG_RECEIVED_REPEAT_BALL, FLAG_RECEIVED_SS_TICKET, FLAG_KECLEON_FLED_FORTREE, FLAG_RECEIVED_FOSSIL_MON, FLAG_DEFEATED_SS_TIDAL_TRAINERS}, @@ -1254,13 +1254,13 @@ const u16 gUnknown_Debug_83C31E6[][9] = { {FLAG_BIRCH_AIDE_MET, FLAG_DECLINED_BIKE, FLAG_RECEIVED_SECRET_POWER} }; -const u8 gUnknown_Debug_083C3288[] = _("CYCLEかんれん"); -const u8 gUnknown_Debug_083C3292[] = _("おおきさくらべ"); -const u8 gUnknown_Debug_083C329A[] = _("カウンタ"); -const u8 gUnknown_Debug_083C329F[] = _("そのた1"); -const u8 gUnknown_Debug_083C32A4[] = _("そのた2"); +static const u8 gUnknown_Debug_083C3288[] = _("CYCLEかんれん"); +static const u8 gUnknown_Debug_083C3292[] = _("おおきさくらべ"); +static const u8 gUnknown_Debug_083C329A[] = _("カウンタ"); +static const u8 gUnknown_Debug_083C329F[] = _("そのた1"); +static const u8 gUnknown_Debug_083C32A4[] = _("そのた2"); -const struct MenuAction gUnknown_Debug_083C32AC[] = { +static const struct MenuAction gUnknown_Debug_083C32AC[] = { {gUnknown_Debug_083C3288, debug_sub_808E400}, {gUnknown_Debug_083C3292, debug_sub_808E458}, {gUnknown_Debug_083C329A, debug_sub_808E4B0}, @@ -1268,48 +1268,48 @@ const struct MenuAction gUnknown_Debug_083C32AC[] = { {gUnknown_Debug_083C32A4, debug_sub_808E560} }; -const u8 gUnknown_Debug_083C32D4[] = _("WKーCYCLEーROADーHIT"); -const u8 gUnknown_Debug_083C32E6[] = _("WKーCYCLEーROADーTIMエ1"); -const u8 gUnknown_Debug_083C32FA[] = _("WKーCYCLEーROADーTIMエ2"); - -const u8 gUnknown_Debug_083C330E[] = _("WKーSIZEーKINOKOKOーOYAJI"); -const u8 gUnknown_Debug_083C3325[] = _("WKーSIZEーNAMAZOーOYAJI"); - -const u8 gUnknown_Debug_083C333A[] = _("WKーSPRAYーCOUNT"); -const u8 gUnknown_Debug_083C3349[] = _("WKーICEーCOUNT"); -const u8 gUnknown_Debug_083C3356[] = _("WKーASHーGATHERーCOUNT"); -const u8 gUnknown_Debug_083C336A[] = _("WKーCRUISEーCOUNT"); -const u8 gUnknown_Debug_083C337A[] = _("WKーFRIENDLYーSTEPーCOUNT"); -const u8 gUnknown_Debug_083C3391[] = _("WKーPOISONーSTEPーCOUNT"); - -const u8 gUnknown_Debug_083C33A6[] = _("WKRECYCLEーGOODS"); -const u8 gUnknown_Debug_083C33B6[] = _("WKーFIRSTーPOKE"); -const u8 gUnknown_Debug_083C33C4[] = _("WKーMABOROSIRNDーH"); -const u8 gUnknown_Debug_083C33D5[] = _("WKーMABOROSIRNDーL"); -const u8 gUnknown_Debug_083C33E6[] = _("EVーONEーDAYーWORK"); -const u8 gUnknown_Debug_083C33F6[] = _("EVーFANWORK"); -const u8 gUnknown_Debug_083C3401[] = _("EVーFANTIME"); -const u8 gUnknown_Debug_083C340C[] = _("WKーKARAKURIーLEVEL"); -const u8 gUnknown_Debug_083C341E[] = _("WKーPOKELOTーPRIZE"); - -const u8 gUnknown_Debug_083C342F[] = _("WKーSPECIALーZUKN"); -const u8 gUnknown_Debug_083C343F[] = _("WKーHYOUKAーDAYS"); -const u8 gUnknown_Debug_083C344E[] = _("WKーPOKELOTーRND1"); -const u8 gUnknown_Debug_083C345E[] = _("WKーPOKELOTーRND2"); -const u8 gUnknown_Debug_083C346E[] = _("WKーBASEーMAPNO"); - -const struct MenuAction gUnknown_Debug_083C347C[] = { +static const u8 gUnknown_Debug_083C32D4[] = _("WKーCYCLEーROADーHIT"); +static const u8 gUnknown_Debug_083C32E6[] = _("WKーCYCLEーROADーTIMエ1"); +static const u8 gUnknown_Debug_083C32FA[] = _("WKーCYCLEーROADーTIMエ2"); + +static const u8 gUnknown_Debug_083C330E[] = _("WKーSIZEーKINOKOKOーOYAJI"); +static const u8 gUnknown_Debug_083C3325[] = _("WKーSIZEーNAMAZOーOYAJI"); + +static const u8 gUnknown_Debug_083C333A[] = _("WKーSPRAYーCOUNT"); +static const u8 gUnknown_Debug_083C3349[] = _("WKーICEーCOUNT"); +static const u8 gUnknown_Debug_083C3356[] = _("WKーASHーGATHERーCOUNT"); +static const u8 gUnknown_Debug_083C336A[] = _("WKーCRUISEーCOUNT"); +static const u8 gUnknown_Debug_083C337A[] = _("WKーFRIENDLYーSTEPーCOUNT"); +static const u8 gUnknown_Debug_083C3391[] = _("WKーPOISONーSTEPーCOUNT"); + +static const u8 gUnknown_Debug_083C33A6[] = _("WKRECYCLEーGOODS"); +static const u8 gUnknown_Debug_083C33B6[] = _("WKーFIRSTーPOKE"); +static const u8 gUnknown_Debug_083C33C4[] = _("WKーMABOROSIRNDーH"); +static const u8 gUnknown_Debug_083C33D5[] = _("WKーMABOROSIRNDーL"); +static const u8 gUnknown_Debug_083C33E6[] = _("EVーONEーDAYーWORK"); +static const u8 gUnknown_Debug_083C33F6[] = _("EVーFANWORK"); +static const u8 gUnknown_Debug_083C3401[] = _("EVーFANTIME"); +static const u8 gUnknown_Debug_083C340C[] = _("WKーKARAKURIーLEVEL"); +static const u8 gUnknown_Debug_083C341E[] = _("WKーPOKELOTーPRIZE"); + +static const u8 gUnknown_Debug_083C342F[] = _("WKーSPECIALーZUKN"); +static const u8 gUnknown_Debug_083C343F[] = _("WKーHYOUKAーDAYS"); +static const u8 gUnknown_Debug_083C344E[] = _("WKーPOKELOTーRND1"); +static const u8 gUnknown_Debug_083C345E[] = _("WKーPOKELOTーRND2"); +static const u8 gUnknown_Debug_083C346E[] = _("WKーBASEーMAPNO"); + +static const struct MenuAction gUnknown_Debug_083C347C[] = { {gUnknown_Debug_083C32D4, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C32E6, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C32FA, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C3494[] = { +static const struct MenuAction gUnknown_Debug_083C3494[] = { {gUnknown_Debug_083C330E, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3325, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C34A4[] = { +static const struct MenuAction gUnknown_Debug_083C34A4[] = { {gUnknown_Debug_083C333A, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3349, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3356, TomomichiDebugMenu_Config}, @@ -1318,7 +1318,7 @@ const struct MenuAction gUnknown_Debug_083C34A4[] = { {gUnknown_Debug_083C3391, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C34D4[] = { +static const struct MenuAction gUnknown_Debug_083C34D4[] = { {gUnknown_Debug_083C33A6, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C33B6, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C33C4, TomomichiDebugMenu_Config}, @@ -1330,7 +1330,7 @@ const struct MenuAction gUnknown_Debug_083C34D4[] = { {gUnknown_Debug_083C341E, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C351C[] = { +static const struct MenuAction gUnknown_Debug_083C351C[] = { {gUnknown_Debug_083C342F, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C343F, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C344E, TomomichiDebugMenu_Config}, @@ -1338,9 +1338,9 @@ const struct MenuAction gUnknown_Debug_083C351C[] = { {gUnknown_Debug_083C346E, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C3544[] = {3, 2, 6, 9, 5}; +static const u8 gUnknown_Debug_083C3544[] = {3, 2, 6, 9, 5}; -const u16 gUnknown_Debug_083C354A[][9] = { +static const u16 gUnknown_Debug_083C354A[][9] = { {VAR_CYCLING_ROAD_RECORD_COLLISIONS, VAR_CYCLING_ROAD_RECORD_TIME_L, VAR_CYCLING_ROAD_RECORD_TIME_H}, {VAR_SHROOMISH_SIZE_RECORD, VAR_BARBOACH_SIZE_RECORD}, {VAR_REPEL_STEP_COUNT, VAR_ICE_STEP_COUNT, VAR_ASH_GATHER_COUNT, VAR_CRUISE_STEP_COUNT, VAR_HAPPINESS_STEP_COUNTER, VAR_POISON_STEP_COUNTER}, @@ -1348,33 +1348,33 @@ const u16 gUnknown_Debug_083C354A[][9] = { {VAR_NATIONAL_DEX, VAR_BIRCH_STATE, VAR_LOTTERY_RND_L, VAR_LOTTERY_RND_H, VAR_SECRET_BASE_MAP} }; -const u8 gUnknown_Debug_083C35A4[] = _("OBJCHRWORK0ー8"); -const u8 gUnknown_Debug_083C35B2[] = _("OBJCHRWORK9ー15"); +static const u8 gUnknown_Debug_083C35A4[] = _("OBJCHRWORK0ー8"); +static const u8 gUnknown_Debug_083C35B2[] = _("OBJCHRWORK9ー15"); -const struct MenuAction gUnknown_Debug_083C35C4[] = { +static const struct MenuAction gUnknown_Debug_083C35C4[] = { {gUnknown_Debug_083C35A4, debug_sub_808E9A0}, {gUnknown_Debug_083C35B2, debug_sub_808E9F8} }; -const u8 gUnknown_Debug_083C35D4[] = _("OBJCHRWORK1"); -const u8 gUnknown_Debug_083C35E0[] = _("OBJCHRWORK2"); -const u8 gUnknown_Debug_083C35EC[] = _("OBJCHRWORK3"); -const u8 gUnknown_Debug_083C35F8[] = _("OBJCHRWORK4"); -const u8 gUnknown_Debug_083C3604[] = _("OBJCHRWORK5"); -const u8 gUnknown_Debug_083C3610[] = _("OBJCHRWORK6"); -const u8 gUnknown_Debug_083C361C[] = _("OBJCHRWORK7"); -const u8 gUnknown_Debug_083C3628[] = _("OBJCHRWORK8"); -const u8 gUnknown_Debug_083C3634[] = _("OBJCHRWORK9"); - -const u8 gUnknown_Debug_083C3640[] = _("OBJCHRWORK10"); -const u8 gUnknown_Debug_083C364D[] = _("OBJCHRWORK11"); -const u8 gUnknown_Debug_083C365A[] = _("OBJCHRWORK12"); -const u8 gUnknown_Debug_083C3667[] = _("OBJCHRWORK13"); -const u8 gUnknown_Debug_083C3674[] = _("OBJCHRWORK14"); -const u8 gUnknown_Debug_083C3681[] = _("OBJCHRWORK15"); -const u8 gUnknown_Debug_083C368E[] = _("OBJCHRWORK16"); - -const struct MenuAction gUnknown_Debug_083C369C[] = { +static const u8 gUnknown_Debug_083C35D4[] = _("OBJCHRWORK1"); +static const u8 gUnknown_Debug_083C35E0[] = _("OBJCHRWORK2"); +static const u8 gUnknown_Debug_083C35EC[] = _("OBJCHRWORK3"); +static const u8 gUnknown_Debug_083C35F8[] = _("OBJCHRWORK4"); +static const u8 gUnknown_Debug_083C3604[] = _("OBJCHRWORK5"); +static const u8 gUnknown_Debug_083C3610[] = _("OBJCHRWORK6"); +static const u8 gUnknown_Debug_083C361C[] = _("OBJCHRWORK7"); +static const u8 gUnknown_Debug_083C3628[] = _("OBJCHRWORK8"); +static const u8 gUnknown_Debug_083C3634[] = _("OBJCHRWORK9"); + +static const u8 gUnknown_Debug_083C3640[] = _("OBJCHRWORK10"); +static const u8 gUnknown_Debug_083C364D[] = _("OBJCHRWORK11"); +static const u8 gUnknown_Debug_083C365A[] = _("OBJCHRWORK12"); +static const u8 gUnknown_Debug_083C3667[] = _("OBJCHRWORK13"); +static const u8 gUnknown_Debug_083C3674[] = _("OBJCHRWORK14"); +static const u8 gUnknown_Debug_083C3681[] = _("OBJCHRWORK15"); +static const u8 gUnknown_Debug_083C368E[] = _("OBJCHRWORK16"); + +static const struct MenuAction gUnknown_Debug_083C369C[] = { {gUnknown_Debug_083C35D4, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C35E0, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C35EC, TomomichiDebugMenu_Config}, @@ -1386,7 +1386,7 @@ const struct MenuAction gUnknown_Debug_083C369C[] = { {gUnknown_Debug_083C3634, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C36E4[] = { +static const struct MenuAction gUnknown_Debug_083C36E4[] = { {gUnknown_Debug_083C3640, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C364D, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C365A, TomomichiDebugMenu_Config}, @@ -1396,21 +1396,21 @@ const struct MenuAction gUnknown_Debug_083C36E4[] = { {gUnknown_Debug_083C368E, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C371C[] = {9, 7}; +static const u8 gUnknown_Debug_083C371C[] = {9, 7}; -const u16 gUnknown_Debug_083C371E[][9] = { +static const u16 gUnknown_Debug_083C371E[][9] = { {VAR_OBJ_GFX_ID_0, VAR_OBJ_GFX_ID_1, VAR_OBJ_GFX_ID_2, VAR_OBJ_GFX_ID_3, VAR_OBJ_GFX_ID_4, VAR_OBJ_GFX_ID_5, VAR_OBJ_GFX_ID_6, VAR_OBJ_GFX_ID_7, VAR_OBJ_GFX_ID_8}, {VAR_OBJ_GFX_ID_9, VAR_OBJ_GFX_ID_A, VAR_OBJ_GFX_ID_B, VAR_OBJ_GFX_ID_C, VAR_OBJ_GFX_ID_D, VAR_OBJ_GFX_ID_E, VAR_OBJ_GFX_ID_F} }; -const u8 gUnknown_Debug_083C3742[] = _("SP"); -const u8 gUnknown_Debug_083C3745[] = _("ルーム R110 PART1/カラクリ"); -const u8 gUnknown_Debug_083C3759[] = _("ルーム R110 PART2"); -const u8 gUnknown_Debug_083C3768[] = _("ルーム ロード"); -const u8 gUnknown_Debug_083C3770[] = _("ソノタ1"); -const u8 gUnknown_Debug_083C3775[] = _("ソノタ2"); +static const u8 gUnknown_Debug_083C3742[] = _("SP"); +static const u8 gUnknown_Debug_083C3745[] = _("ルーム R110 PART1/カラクリ"); +static const u8 gUnknown_Debug_083C3759[] = _("ルーム R110 PART2"); +static const u8 gUnknown_Debug_083C3768[] = _("ルーム ロード"); +static const u8 gUnknown_Debug_083C3770[] = _("ソノタ1"); +static const u8 gUnknown_Debug_083C3775[] = _("ソノタ2"); -const struct MenuAction gUnknown_Debug_083C377C[] = { +static const struct MenuAction gUnknown_Debug_083C377C[] = { {gUnknown_Debug_083C3742, debug_sub_808E054}, {gUnknown_Debug_083C3745, debug_sub_808E0AC}, {gUnknown_Debug_083C3759, debug_sub_808E104}, @@ -1419,67 +1419,67 @@ const struct MenuAction gUnknown_Debug_083C377C[] = { {gUnknown_Debug_083C3775, debug_sub_808E20C} }; -const u8 gUnknown_Debug_083C37AC[] = _("WKーSCENEーSPーCONTEST"); -const u8 gUnknown_Debug_083C37C0[] = _("WKーSCENEーSPーPC"); -const u8 gUnknown_Debug_083C37CF[] = _("WKーSCENEーSPーCONTEST03"); -const u8 gUnknown_Debug_083C37E5[] = _("WKーSCENEーSPーCONTESTITEM"); -const u8 gUnknown_Debug_083C37FD[] = _("WKーSCENEーSPーOPENING"); -const u8 gUnknown_Debug_083C3811[] = _("WKーSCENEーSPーSHIP01"); -const u8 gUnknown_Debug_083C3824[] = _(""); -const u8 gUnknown_Debug_083C3825[] = _(""); -const u8 gUnknown_Debug_083C3826[] = _(""); - -const u8 gUnknown_Debug_083C3827[] = _("WKーSCENEーR110ーR0101"); -const u8 gUnknown_Debug_083C383B[] = _("WKーSCENEーR110ーR0102"); -const u8 gUnknown_Debug_083C384F[] = _("WKーSCENEーR110ーR0103"); -const u8 gUnknown_Debug_083C3863[] = _("WKーKARAKURIーDAIOU"); -const u8 gUnknown_Debug_083C3875[] = _("WKーSCENEーSHISEN"); -const u8 gUnknown_Debug_083C3885[] = _(""); -const u8 gUnknown_Debug_083C3886[] = _(""); -const u8 gUnknown_Debug_083C3887[] = _(""); -const u8 gUnknown_Debug_083C3888[] = _(""); - -const u8 gUnknown_Debug_083C3889[] = _("WKーSCENEーR110ーR0104"); -const u8 gUnknown_Debug_083C389D[] = _("WKーSCENEーR110ーR0105"); -const u8 gUnknown_Debug_083C38B1[] = _("WKーSCENEーR110ーR0106"); -const u8 gUnknown_Debug_083C38C5[] = _("WKーSCENEーR110ーR0107"); -const u8 gUnknown_Debug_083C38D9[] = _("WKーSCENEーR110ーR0108"); -const u8 gUnknown_Debug_083C38ED[] = _("WKーSCENEーR110ーR0109"); -const u8 gUnknown_Debug_083C3901[] = _("WKーSCENEーR110ーR0110"); -const u8 gUnknown_Debug_083C3915[] = _("WKーSCENEーR110ーR0111"); -const u8 gUnknown_Debug_083C3929[] = _("WKーSCENEー02ーR110ーR0110"); - -const u8 gUnknown_Debug_083C3940[] = _("WKーSCENEーR104ーR0101"); -const u8 gUnknown_Debug_083C3954[] = _("WKーSCENEーR113ーR0101"); -const u8 gUnknown_Debug_083C3968[] = _(""); -const u8 gUnknown_Debug_083C3969[] = _(""); -const u8 gUnknown_Debug_083C396A[] = _(""); -const u8 gUnknown_Debug_083C396B[] = _(""); -const u8 gUnknown_Debug_083C396C[] = _(""); -const u8 gUnknown_Debug_083C396D[] = _(""); -const u8 gUnknown_Debug_083C396E[] = _(""); - -const u8 gUnknown_Debug_083C396F[] = _("WKーSCENEーBASEーGDOODS"); -const u8 gUnknown_Debug_083C3984[] = _("WKーSCENEーHAGIーFUNE"); -const u8 gUnknown_Debug_083C3997[] = _("WKーSCENEーFUNEーPOS"); -const u8 gUnknown_Debug_083C39A9[] = _("WKーSCENEーBASEーMAKE"); -const u8 gUnknown_Debug_083C39BC[] = _("WKーSCENEーARTISTーC106ーR"); -const u8 gUnknown_Debug_083C39D3[] = _("WKーSCENEーPOKEーLEAGUE"); -const u8 gUnknown_Debug_083C39E8[] = _("WKーSCENEーROPEWAY"); -const u8 gUnknown_Debug_083C39F9[] = _("WKーSCENEーSAFARIーZONE"); -const u8 gUnknown_Debug_083C3A0E[] = _("WKーSCENEーCYCLEーROAD"); - -const u8 gUnknown_Debug_083C3A22[] = _("WKーSCENEーR119ーTENKI"); -const u8 gUnknown_Debug_083C3A36[] = _("WKーSCENEー01ーC102ーR0401"); -const u8 gUnknown_Debug_083C3A4D[] = _("WKーFUTAGOー01ーFIELDーR104"); -const u8 gUnknown_Debug_083C3A65[] = _("WKーSCENEーBATTLEーTOWER"); -const u8 gUnknown_Debug_083C3A7B[] = _("WKーSCENEーTRーHOUSE"); -const u8 gUnknown_Debug_083C3A8D[] = _("WKーKASEKIーTYPE"); -const u8 gUnknown_Debug_083C3A9C[] = _(""); -const u8 gUnknown_Debug_083C3A9D[] = _(""); -const u8 gUnknown_Debug_083C3A9E[] = _(""); - -const struct MenuAction gUnknown_Debug_083C3AA0[] = { +static const u8 gUnknown_Debug_083C37AC[] = _("WKーSCENEーSPーCONTEST"); +static const u8 gUnknown_Debug_083C37C0[] = _("WKーSCENEーSPーPC"); +static const u8 gUnknown_Debug_083C37CF[] = _("WKーSCENEーSPーCONTEST03"); +static const u8 gUnknown_Debug_083C37E5[] = _("WKーSCENEーSPーCONTESTITEM"); +static const u8 gUnknown_Debug_083C37FD[] = _("WKーSCENEーSPーOPENING"); +static const u8 gUnknown_Debug_083C3811[] = _("WKーSCENEーSPーSHIP01"); +static const u8 gUnknown_Debug_083C3824[] = _(""); +static const u8 gUnknown_Debug_083C3825[] = _(""); +static const u8 gUnknown_Debug_083C3826[] = _(""); + +static const u8 gUnknown_Debug_083C3827[] = _("WKーSCENEーR110ーR0101"); +static const u8 gUnknown_Debug_083C383B[] = _("WKーSCENEーR110ーR0102"); +static const u8 gUnknown_Debug_083C384F[] = _("WKーSCENEーR110ーR0103"); +static const u8 gUnknown_Debug_083C3863[] = _("WKーKARAKURIーDAIOU"); +static const u8 gUnknown_Debug_083C3875[] = _("WKーSCENEーSHISEN"); +static const u8 gUnknown_Debug_083C3885[] = _(""); +static const u8 gUnknown_Debug_083C3886[] = _(""); +static const u8 gUnknown_Debug_083C3887[] = _(""); +static const u8 gUnknown_Debug_083C3888[] = _(""); + +static const u8 gUnknown_Debug_083C3889[] = _("WKーSCENEーR110ーR0104"); +static const u8 gUnknown_Debug_083C389D[] = _("WKーSCENEーR110ーR0105"); +static const u8 gUnknown_Debug_083C38B1[] = _("WKーSCENEーR110ーR0106"); +static const u8 gUnknown_Debug_083C38C5[] = _("WKーSCENEーR110ーR0107"); +static const u8 gUnknown_Debug_083C38D9[] = _("WKーSCENEーR110ーR0108"); +static const u8 gUnknown_Debug_083C38ED[] = _("WKーSCENEーR110ーR0109"); +static const u8 gUnknown_Debug_083C3901[] = _("WKーSCENEーR110ーR0110"); +static const u8 gUnknown_Debug_083C3915[] = _("WKーSCENEーR110ーR0111"); +static const u8 gUnknown_Debug_083C3929[] = _("WKーSCENEー02ーR110ーR0110"); + +static const u8 gUnknown_Debug_083C3940[] = _("WKーSCENEーR104ーR0101"); +static const u8 gUnknown_Debug_083C3954[] = _("WKーSCENEーR113ーR0101"); +static const u8 gUnknown_Debug_083C3968[] = _(""); +static const u8 gUnknown_Debug_083C3969[] = _(""); +static const u8 gUnknown_Debug_083C396A[] = _(""); +static const u8 gUnknown_Debug_083C396B[] = _(""); +static const u8 gUnknown_Debug_083C396C[] = _(""); +static const u8 gUnknown_Debug_083C396D[] = _(""); +static const u8 gUnknown_Debug_083C396E[] = _(""); + +static const u8 gUnknown_Debug_083C396F[] = _("WKーSCENEーBASEーGDOODS"); +static const u8 gUnknown_Debug_083C3984[] = _("WKーSCENEーHAGIーFUNE"); +static const u8 gUnknown_Debug_083C3997[] = _("WKーSCENEーFUNEーPOS"); +static const u8 gUnknown_Debug_083C39A9[] = _("WKーSCENEーBASEーMAKE"); +static const u8 gUnknown_Debug_083C39BC[] = _("WKーSCENEーARTISTーC106ーR"); +static const u8 gUnknown_Debug_083C39D3[] = _("WKーSCENEーPOKEーLEAGUE"); +static const u8 gUnknown_Debug_083C39E8[] = _("WKーSCENEーROPEWAY"); +static const u8 gUnknown_Debug_083C39F9[] = _("WKーSCENEーSAFARIーZONE"); +static const u8 gUnknown_Debug_083C3A0E[] = _("WKーSCENEーCYCLEーROAD"); + +static const u8 gUnknown_Debug_083C3A22[] = _("WKーSCENEーR119ーTENKI"); +static const u8 gUnknown_Debug_083C3A36[] = _("WKーSCENEー01ーC102ーR0401"); +static const u8 gUnknown_Debug_083C3A4D[] = _("WKーFUTAGOー01ーFIELDーR104"); +static const u8 gUnknown_Debug_083C3A65[] = _("WKーSCENEーBATTLEーTOWER"); +static const u8 gUnknown_Debug_083C3A7B[] = _("WKーSCENEーTRーHOUSE"); +static const u8 gUnknown_Debug_083C3A8D[] = _("WKーKASEKIーTYPE"); +static const u8 gUnknown_Debug_083C3A9C[] = _(""); +static const u8 gUnknown_Debug_083C3A9D[] = _(""); +static const u8 gUnknown_Debug_083C3A9E[] = _(""); + +static const struct MenuAction gUnknown_Debug_083C3AA0[] = { {gUnknown_Debug_083C37AC, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C37C0, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C37CF, TomomichiDebugMenu_Config}, @@ -1490,7 +1490,7 @@ const struct MenuAction gUnknown_Debug_083C3AA0[] = { {gUnknown_Debug_083C3825, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_83C3AE0[] = { +static const struct MenuAction gUnknown_Debug_83C3AE0[] = { {gUnknown_Debug_083C3827, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C383B, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C384F, TomomichiDebugMenu_Config}, @@ -1502,7 +1502,7 @@ const struct MenuAction gUnknown_Debug_83C3AE0[] = { {gUnknown_Debug_083C3888, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_83C3B28[] = { +static const struct MenuAction gUnknown_Debug_83C3B28[] = { {gUnknown_Debug_083C3889, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C389D, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C38B1, TomomichiDebugMenu_Config}, @@ -1514,7 +1514,7 @@ const struct MenuAction gUnknown_Debug_83C3B28[] = { {gUnknown_Debug_083C3929, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_83C3B70[] = { +static const struct MenuAction gUnknown_Debug_83C3B70[] = { {gUnknown_Debug_083C3940, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3954, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3968, TomomichiDebugMenu_Config}, @@ -1526,7 +1526,7 @@ const struct MenuAction gUnknown_Debug_83C3B70[] = { {gUnknown_Debug_083C396E, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_83C3BB8[] = { +static const struct MenuAction gUnknown_Debug_83C3BB8[] = { {gUnknown_Debug_083C396F, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3984, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3997, TomomichiDebugMenu_Config}, @@ -1538,7 +1538,7 @@ const struct MenuAction gUnknown_Debug_83C3BB8[] = { {gUnknown_Debug_083C3A0E, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_83C3C00[] = { +static const struct MenuAction gUnknown_Debug_83C3C00[] = { {gUnknown_Debug_083C3A22, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3A36, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3A4D, TomomichiDebugMenu_Config}, @@ -1550,9 +1550,9 @@ const struct MenuAction gUnknown_Debug_83C3C00[] = { {gUnknown_Debug_083C3A9E, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C3C48[] = {6, 5, 9, 2, 9, 6}; +static const u8 gUnknown_Debug_083C3C48[] = {6, 5, 9, 2, 9, 6}; -const u16 gUnknown_Debug_83C3C4E[][9] = { +static const u16 gUnknown_Debug_83C3C4E[][9] = { {VAR_LINK_CONTEST_ROOM_STATE, VAR_CABLE_CLUB_STATE, VAR_CONTEST_LOCATION, VAR_CONTEST_PRIZE_PICKUP, VAR_LITTLEROOT_INTRO_STATE, VAR_PORTHOLE_STATE}, {VAR_TRICK_HOUSE_ENTRANCE_STATE_2, VAR_TRICK_HOUSE_PRIZE_PICKUP, VAR_TRICK_HOUSE_STATE, VAR_TRICK_HOUSE_ENTRANCE_STATE_3, VAR_TRICK_HOUSE_ENTRANCE_STATE}, {VAR_TRICK_HOUSE_PUZZLE_1_STATE, VAR_TRICK_HOUSE_PUZZLE_2_STATE, VAR_TRICK_HOUSE_PUZZLE_3_STATE, VAR_TRICK_HOUSE_PUZZLE_4_STATE, VAR_TRICK_HOUSE_PUZZLE_5_STATE, VAR_TRICK_HOUSE_PUZZLE_6_STATE, VAR_TRICK_HOUSE_PUZZLE_7_STATE, VAR_TRICK_HOUSE_PUZZLE_8_STATE, VAR_TRICK_HOUSE_PUZZLE_7_STATE_2}, @@ -1561,17 +1561,17 @@ const u16 gUnknown_Debug_83C3C4E[][9] = { {VAR_WEATHER_INSTITUTE_STATE, VAR_SLATEPORT_FAN_CLUB_STATE, 0x40BB, VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, VAR_GAME_CORNER_STATE, VAR_WHICH_FOSSIL_REVIVED} }; -const u8 gUnknown_Debug_083C3CBA[] = _("タウン"); -const u8 gUnknown_Debug_083C3CBE[] = _("シティ"); -const u8 gUnknown_Debug_083C3CC2[] = _("ロード101ー109"); -const u8 gUnknown_Debug_083C3CCD[] = _("ロード110ー118"); -const u8 gUnknown_Debug_083C3CD8[] = _("ロード119ー127"); -const u8 gUnknown_Debug_083C3CE3[] = _("ロード128ー134"); -const u8 gUnknown_Debug_083C3CEE[] = _("ルーム タウン"); -const u8 gUnknown_Debug_083C3CF6[] = _("ルーム シティ"); -const u8 gUnknown_Debug_083C3CFE[] = _("ダンジョンない"); - -const struct MenuAction gUnknown_Debug_083C3D08[] = { +static const u8 gUnknown_Debug_083C3CBA[] = _("タウン"); +static const u8 gUnknown_Debug_083C3CBE[] = _("シティ"); +static const u8 gUnknown_Debug_083C3CC2[] = _("ロード101ー109"); +static const u8 gUnknown_Debug_083C3CCD[] = _("ロード110ー118"); +static const u8 gUnknown_Debug_083C3CD8[] = _("ロード119ー127"); +static const u8 gUnknown_Debug_083C3CE3[] = _("ロード128ー134"); +static const u8 gUnknown_Debug_083C3CEE[] = _("ルーム タウン"); +static const u8 gUnknown_Debug_083C3CF6[] = _("ルーム シティ"); +static const u8 gUnknown_Debug_083C3CFE[] = _("ダンジョンない"); + +static const struct MenuAction gUnknown_Debug_083C3D08[] = { {gUnknown_Debug_083C3CBA, debug_sub_808DBA0}, {gUnknown_Debug_083C3CBE, debug_sub_808DBF8}, {gUnknown_Debug_083C3CC2, debug_sub_808DC50}, @@ -1583,91 +1583,91 @@ const struct MenuAction gUnknown_Debug_083C3D08[] = { {gUnknown_Debug_083C3CFE, debug_sub_808DE60} }; -const u8 gUnknown_Debug_083C3D50[] = _("WKーSCENEーFIELDーT101"); -const u8 gUnknown_Debug_083C3D64[] = _("WKーSCENEーFIELDーT102"); -const u8 gUnknown_Debug_083C3D78[] = _("WKーSCENEーFIELDーT103"); -const u8 gUnknown_Debug_083C3D8C[] = _("WKーSCENEーFIELDーT104"); -const u8 gUnknown_Debug_083C3DA0[] = _("WKーBASEーPOSNO"); -const u8 gUnknown_Debug_083C3DAE[] = _("WKーSCENEーFIELDーT106"); -const u8 gUnknown_Debug_083C3DC2[] = _("WKーSCENEーFIELDーT107"); -const u8 gUnknown_Debug_083C3DD6[] = _("WKーSCENEー02ーFIELDーT102"); - -const u8 gUnknown_Debug_083C3DED[] = _("WKーSCENEーFIELDーC101"); -const u8 gUnknown_Debug_083C3E01[] = _("WKーSCENEーFIELDーC102"); -const u8 gUnknown_Debug_083C3E15[] = _("WKーSCENEーFIELDーC103"); -const u8 gUnknown_Debug_083C3E29[] = _("WKーSCENEーFIELDーC104"); -const u8 gUnknown_Debug_083C3E3D[] = _("WKーSCENEーFIELDーC105"); -const u8 gUnknown_Debug_083C3E51[] = _("WKーSCENEーFIELDーC106"); -const u8 gUnknown_Debug_083C3E65[] = _("WKーSCENEーFIELDーC107"); -const u8 gUnknown_Debug_083C3E79[] = _("WKーSCENEーFIELDーC108"); -const u8 gUnknown_Debug_083C3E8D[] = _("WKーSCENEーFIELDーC109"); - -const u8 gUnknown_Debug_083C3EA1[] = _("WKーSCENEーFIELDーR101"); -const u8 gUnknown_Debug_083C3EB5[] = _("WKーSCENEーFIELDーR102"); -const u8 gUnknown_Debug_083C3EC9[] = _("WKーSCENEーFIELDーR103"); -const u8 gUnknown_Debug_083C3EDD[] = _("WKーSCENEーFIELDーR104"); -const u8 gUnknown_Debug_083C3EF1[] = _("WKーSCENEーFIELDーR105"); -const u8 gUnknown_Debug_083C3F05[] = _("WKーSCENEーFIELDーR106"); -const u8 gUnknown_Debug_083C3F19[] = _("WKーSCENEーFIELDーR107"); -const u8 gUnknown_Debug_083C3F2D[] = _("WKーSCENEーFIELDーR108"); -const u8 gUnknown_Debug_083C3F41[] = _("WKーSCENEーFIELDーR109"); - -const u8 gUnknown_Debug_083C3F55[] = _("WKーSCENEーFIELDーR110"); -const u8 gUnknown_Debug_083C3F69[] = _("WKーSCENEーFIELDーR111"); -const u8 gUnknown_Debug_083C3F7D[] = _("WKーSCENEーFIELDーR112"); -const u8 gUnknown_Debug_083C3F91[] = _("WKーSCENEーFIELDーR113"); -const u8 gUnknown_Debug_083C3FA5[] = _("WKーSCENEーFIELDーR114"); -const u8 gUnknown_Debug_083C3FB9[] = _("WKーSCENEーFIELDーR115"); -const u8 gUnknown_Debug_083C3FCD[] = _("WKーSCENEーFIELDーR116"); -const u8 gUnknown_Debug_083C3FE1[] = _("WKーSCENEーFIELDーR117"); -const u8 gUnknown_Debug_083C3FF5[] = _("WKーSCENEーFIELDーR118"); - -const u8 gUnknown_Debug_083C4009[] = _("WKーSCENEーFIELDーR119"); -const u8 gUnknown_Debug_083C401D[] = _("WKーSCENEーFIELDーR120"); -const u8 gUnknown_Debug_083C4031[] = _("WKーSCENEーFIELDーR121"); -const u8 gUnknown_Debug_083C4045[] = _("WKーSCENEーFIELDーR122"); -const u8 gUnknown_Debug_083C4059[] = _("WKーSCENEーFIELDーR123"); -const u8 gUnknown_Debug_083C406D[] = _("WKーSCENEーFIELDーR124"); -const u8 gUnknown_Debug_083C4081[] = _("WKーSCENEーFIELDーR125"); -const u8 gUnknown_Debug_083C4095[] = _("WKーSCENEーFIELDーR126"); -const u8 gUnknown_Debug_083C40A9[] = _("WKーSCENEーFIELDーR127"); - -const u8 gUnknown_Debug_083C40BD[] = _("WKーSCENEーFIELDーR128"); -const u8 gUnknown_Debug_083C40D1[] = _("WKーSCENEーFIELDーR129"); -const u8 gUnknown_Debug_083C40E5[] = _("WKーSCENEーFIELDーR130"); -const u8 gUnknown_Debug_083C40F9[] = _("WKーSCENEーFIELDーR131"); -const u8 gUnknown_Debug_083C410D[] = _("WKーSCENEーFIELDーR132"); -const u8 gUnknown_Debug_083C4121[] = _("WKーSCENEーFIELDーR133"); -const u8 gUnknown_Debug_083C4135[] = _("WKーSCENEーFIELDーR134"); - -const u8 gUnknown_Debug_083C4149[] = _("WKーSCENEーT101ーR0101"); -const u8 gUnknown_Debug_083C415D[] = _("WKーSCENEーT101ーR0102"); -const u8 gUnknown_Debug_083C4171[] = _("WKーSCENEーT101ーR0301"); -const u8 gUnknown_Debug_083C4185[] = _("WKーSCENEーT101ーR0201"); -const u8 gUnknown_Debug_083C4199[] = _("WKーSCENEーT101ーR0202"); -const u8 gUnknown_Debug_083C41AD[] = _("WKーSCENEーT107ーR0201"); - -const u8 gUnknown_Debug_083C41C1[] = _("WKーSCENEーC101ーR0201"); -const u8 gUnknown_Debug_083C41D5[] = _("WKーSCENEーC104ーR0103"); -const u8 gUnknown_Debug_083C41E9[] = _("WKーSCENEーC103ーR0101"); -const u8 gUnknown_Debug_083C41FD[] = _("WKーSCENEーC106ーR0202"); -const u8 gUnknown_Debug_083C4211[] = _("WKーSCENEーC106ーR0401"); -const u8 gUnknown_Debug_083C4225[] = _("WKーSCENEーC102ーR0601"); -const u8 gUnknown_Debug_083C4239[] = _("WKーSCENEーC102ーR0501"); -const u8 gUnknown_Debug_083C424D[] = _("WKーSCENEーC104ーR0102"); -const u8 gUnknown_Debug_083C4261[] = _("WKーSCENEーC107ーR0501"); - -const u8 gUnknown_Debug_083C4275[] = _("WKーSCENEーCAVEーD0601"); -const u8 gUnknown_Debug_083C4289[] = _("WKーSCENEーCAVEーD0201"); -const u8 gUnknown_Debug_083C429D[] = _("WKーSCENEーCAVEーD1206"); -const u8 gUnknown_Debug_083C42B1[] = _("WKーSCENEーCAVEーD1111"); -const u8 gUnknown_Debug_083C42C5[] = _("WKーSCENEーCAVEーD0701"); -const u8 gUnknown_Debug_083C42D9[] = _("WKーSCENEーCAVEーD0808"); -const u8 gUnknown_Debug_083C42ED[] = _("WKーSCENEーCAVEーD1602"); -const u8 gUnknown_Debug_083C4301[] = _("WKーSCENEーCAVEーD0101"); -const u8 gUnknown_Debug_083C4315[] = _("WKーSCENEーCAVEーD1301"); - -const struct MenuAction gUnknown_Debug_083C432C[] = { +static const u8 gUnknown_Debug_083C3D50[] = _("WKーSCENEーFIELDーT101"); +static const u8 gUnknown_Debug_083C3D64[] = _("WKーSCENEーFIELDーT102"); +static const u8 gUnknown_Debug_083C3D78[] = _("WKーSCENEーFIELDーT103"); +static const u8 gUnknown_Debug_083C3D8C[] = _("WKーSCENEーFIELDーT104"); +static const u8 gUnknown_Debug_083C3DA0[] = _("WKーBASEーPOSNO"); +static const u8 gUnknown_Debug_083C3DAE[] = _("WKーSCENEーFIELDーT106"); +static const u8 gUnknown_Debug_083C3DC2[] = _("WKーSCENEーFIELDーT107"); +static const u8 gUnknown_Debug_083C3DD6[] = _("WKーSCENEー02ーFIELDーT102"); + +static const u8 gUnknown_Debug_083C3DED[] = _("WKーSCENEーFIELDーC101"); +static const u8 gUnknown_Debug_083C3E01[] = _("WKーSCENEーFIELDーC102"); +static const u8 gUnknown_Debug_083C3E15[] = _("WKーSCENEーFIELDーC103"); +static const u8 gUnknown_Debug_083C3E29[] = _("WKーSCENEーFIELDーC104"); +static const u8 gUnknown_Debug_083C3E3D[] = _("WKーSCENEーFIELDーC105"); +static const u8 gUnknown_Debug_083C3E51[] = _("WKーSCENEーFIELDーC106"); +static const u8 gUnknown_Debug_083C3E65[] = _("WKーSCENEーFIELDーC107"); +static const u8 gUnknown_Debug_083C3E79[] = _("WKーSCENEーFIELDーC108"); +static const u8 gUnknown_Debug_083C3E8D[] = _("WKーSCENEーFIELDーC109"); + +static const u8 gUnknown_Debug_083C3EA1[] = _("WKーSCENEーFIELDーR101"); +static const u8 gUnknown_Debug_083C3EB5[] = _("WKーSCENEーFIELDーR102"); +static const u8 gUnknown_Debug_083C3EC9[] = _("WKーSCENEーFIELDーR103"); +static const u8 gUnknown_Debug_083C3EDD[] = _("WKーSCENEーFIELDーR104"); +static const u8 gUnknown_Debug_083C3EF1[] = _("WKーSCENEーFIELDーR105"); +static const u8 gUnknown_Debug_083C3F05[] = _("WKーSCENEーFIELDーR106"); +static const u8 gUnknown_Debug_083C3F19[] = _("WKーSCENEーFIELDーR107"); +static const u8 gUnknown_Debug_083C3F2D[] = _("WKーSCENEーFIELDーR108"); +static const u8 gUnknown_Debug_083C3F41[] = _("WKーSCENEーFIELDーR109"); + +static const u8 gUnknown_Debug_083C3F55[] = _("WKーSCENEーFIELDーR110"); +static const u8 gUnknown_Debug_083C3F69[] = _("WKーSCENEーFIELDーR111"); +static const u8 gUnknown_Debug_083C3F7D[] = _("WKーSCENEーFIELDーR112"); +static const u8 gUnknown_Debug_083C3F91[] = _("WKーSCENEーFIELDーR113"); +static const u8 gUnknown_Debug_083C3FA5[] = _("WKーSCENEーFIELDーR114"); +static const u8 gUnknown_Debug_083C3FB9[] = _("WKーSCENEーFIELDーR115"); +static const u8 gUnknown_Debug_083C3FCD[] = _("WKーSCENEーFIELDーR116"); +static const u8 gUnknown_Debug_083C3FE1[] = _("WKーSCENEーFIELDーR117"); +static const u8 gUnknown_Debug_083C3FF5[] = _("WKーSCENEーFIELDーR118"); + +static const u8 gUnknown_Debug_083C4009[] = _("WKーSCENEーFIELDーR119"); +static const u8 gUnknown_Debug_083C401D[] = _("WKーSCENEーFIELDーR120"); +static const u8 gUnknown_Debug_083C4031[] = _("WKーSCENEーFIELDーR121"); +static const u8 gUnknown_Debug_083C4045[] = _("WKーSCENEーFIELDーR122"); +static const u8 gUnknown_Debug_083C4059[] = _("WKーSCENEーFIELDーR123"); +static const u8 gUnknown_Debug_083C406D[] = _("WKーSCENEーFIELDーR124"); +static const u8 gUnknown_Debug_083C4081[] = _("WKーSCENEーFIELDーR125"); +static const u8 gUnknown_Debug_083C4095[] = _("WKーSCENEーFIELDーR126"); +static const u8 gUnknown_Debug_083C40A9[] = _("WKーSCENEーFIELDーR127"); + +static const u8 gUnknown_Debug_083C40BD[] = _("WKーSCENEーFIELDーR128"); +static const u8 gUnknown_Debug_083C40D1[] = _("WKーSCENEーFIELDーR129"); +static const u8 gUnknown_Debug_083C40E5[] = _("WKーSCENEーFIELDーR130"); +static const u8 gUnknown_Debug_083C40F9[] = _("WKーSCENEーFIELDーR131"); +static const u8 gUnknown_Debug_083C410D[] = _("WKーSCENEーFIELDーR132"); +static const u8 gUnknown_Debug_083C4121[] = _("WKーSCENEーFIELDーR133"); +static const u8 gUnknown_Debug_083C4135[] = _("WKーSCENEーFIELDーR134"); + +static const u8 gUnknown_Debug_083C4149[] = _("WKーSCENEーT101ーR0101"); +static const u8 gUnknown_Debug_083C415D[] = _("WKーSCENEーT101ーR0102"); +static const u8 gUnknown_Debug_083C4171[] = _("WKーSCENEーT101ーR0301"); +static const u8 gUnknown_Debug_083C4185[] = _("WKーSCENEーT101ーR0201"); +static const u8 gUnknown_Debug_083C4199[] = _("WKーSCENEーT101ーR0202"); +static const u8 gUnknown_Debug_083C41AD[] = _("WKーSCENEーT107ーR0201"); + +static const u8 gUnknown_Debug_083C41C1[] = _("WKーSCENEーC101ーR0201"); +static const u8 gUnknown_Debug_083C41D5[] = _("WKーSCENEーC104ーR0103"); +static const u8 gUnknown_Debug_083C41E9[] = _("WKーSCENEーC103ーR0101"); +static const u8 gUnknown_Debug_083C41FD[] = _("WKーSCENEーC106ーR0202"); +static const u8 gUnknown_Debug_083C4211[] = _("WKーSCENEーC106ーR0401"); +static const u8 gUnknown_Debug_083C4225[] = _("WKーSCENEーC102ーR0601"); +static const u8 gUnknown_Debug_083C4239[] = _("WKーSCENEーC102ーR0501"); +static const u8 gUnknown_Debug_083C424D[] = _("WKーSCENEーC104ーR0102"); +static const u8 gUnknown_Debug_083C4261[] = _("WKーSCENEーC107ーR0501"); + +static const u8 gUnknown_Debug_083C4275[] = _("WKーSCENEーCAVEーD0601"); +static const u8 gUnknown_Debug_083C4289[] = _("WKーSCENEーCAVEーD0201"); +static const u8 gUnknown_Debug_083C429D[] = _("WKーSCENEーCAVEーD1206"); +static const u8 gUnknown_Debug_083C42B1[] = _("WKーSCENEーCAVEーD1111"); +static const u8 gUnknown_Debug_083C42C5[] = _("WKーSCENEーCAVEーD0701"); +static const u8 gUnknown_Debug_083C42D9[] = _("WKーSCENEーCAVEーD0808"); +static const u8 gUnknown_Debug_083C42ED[] = _("WKーSCENEーCAVEーD1602"); +static const u8 gUnknown_Debug_083C4301[] = _("WKーSCENEーCAVEーD0101"); +static const u8 gUnknown_Debug_083C4315[] = _("WKーSCENEーCAVEーD1301"); + +static const struct MenuAction gUnknown_Debug_083C432C[] = { {gUnknown_Debug_083C3D50, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3D64, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3D78, TomomichiDebugMenu_Config}, @@ -1678,7 +1678,7 @@ const struct MenuAction gUnknown_Debug_083C432C[] = { {gUnknown_Debug_083C3DD6, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C436C[] = { +static const struct MenuAction gUnknown_Debug_083C436C[] = { {gUnknown_Debug_083C3DED, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3E01, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3E15, TomomichiDebugMenu_Config}, @@ -1690,7 +1690,7 @@ const struct MenuAction gUnknown_Debug_083C436C[] = { {gUnknown_Debug_083C3E8D, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C43B4[] = { +static const struct MenuAction gUnknown_Debug_083C43B4[] = { {gUnknown_Debug_083C3EA1, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3EB5, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3EC9, TomomichiDebugMenu_Config}, @@ -1702,7 +1702,7 @@ const struct MenuAction gUnknown_Debug_083C43B4[] = { {gUnknown_Debug_083C3F41, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C43FC[] = { +static const struct MenuAction gUnknown_Debug_083C43FC[] = { {gUnknown_Debug_083C3F55, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3F69, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C3F7D, TomomichiDebugMenu_Config}, @@ -1714,7 +1714,7 @@ const struct MenuAction gUnknown_Debug_083C43FC[] = { {gUnknown_Debug_083C3FF5, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C4444[] = { +static const struct MenuAction gUnknown_Debug_083C4444[] = { {gUnknown_Debug_083C4009, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C401D, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C4031, TomomichiDebugMenu_Config}, @@ -1726,7 +1726,7 @@ const struct MenuAction gUnknown_Debug_083C4444[] = { {gUnknown_Debug_083C40A9, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C448C[] = { +static const struct MenuAction gUnknown_Debug_083C448C[] = { {gUnknown_Debug_083C40BD, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C40D1, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C40E5, TomomichiDebugMenu_Config}, @@ -1736,7 +1736,7 @@ const struct MenuAction gUnknown_Debug_083C448C[] = { {gUnknown_Debug_083C4135, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_83C44C4[] = { +static const struct MenuAction gUnknown_Debug_83C44C4[] = { {gUnknown_Debug_083C4149, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C415D, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C4171, TomomichiDebugMenu_Config}, @@ -1744,7 +1744,7 @@ const struct MenuAction gUnknown_Debug_83C44C4[] = { {gUnknown_Debug_083C4199, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_83C44EC[] = { +static const struct MenuAction gUnknown_Debug_83C44EC[] = { {gUnknown_Debug_083C41C1, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C41D5, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C41E9, TomomichiDebugMenu_Config}, @@ -1756,7 +1756,7 @@ const struct MenuAction gUnknown_Debug_83C44EC[] = { {gUnknown_Debug_083C4261, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C4534[] = { +static const struct MenuAction gUnknown_Debug_083C4534[] = { {gUnknown_Debug_083C4275, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C4289, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C429D, TomomichiDebugMenu_Config}, @@ -1768,9 +1768,9 @@ const struct MenuAction gUnknown_Debug_083C4534[] = { {gUnknown_Debug_083C4315, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C457C[] = {8, 9, 9, 9, 9, 7, 6, 9, 9}; +static const u8 gUnknown_Debug_083C457C[] = {8, 9, 9, 9, 9, 7, 6, 9, 9}; -const u16 gUnknown_Debug_083C4586[][9] = { +static const u16 gUnknown_Debug_083C4586[][9] = { {VAR_LITTLEROOT_STATE, VAR_ROUTE102_ACCESSIBLE, 0x4052, VAR_LAVARIDGE_RIVAL_STATE, VAR_CURRENT_SECRET_BASE, 0x4055, 0x4056, VAR_OLDALE_STATE}, {VAR_PETALBURG_STATE, VAR_SLATEPORT_STATE, 0x4059, VAR_RUSTBORO_STATE, 0x405B, 0x405C, 0x405D, VAR_SOOTOPOLIS_STATE, 0x405F}, {VAR_ROUTE101_STATE, 0x4061, VAR_ROUTE103_STATE, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, 0x4068}, @@ -1782,33 +1782,33 @@ const u16 gUnknown_Debug_083C4586[][9] = { {VAR_PETALBURG_WOODS_STATE, VAR_RUSTURF_TUNNEL_STATE, VAR_CAVE_OF_ORIGIN_B4F_STATE, VAR_SEAFLOOR_CAVERN_STATE, 0x40A8, VAR_MT_PYRE_STATE, VAR_NEW_MAUVILLE_STATE, VAR_METEOR_FALLS_STATE, VAR_VICTORY_ROAD_1F_STATE} }; -const u8 gUnknown_Debug_083C4628[] = _("LOCALWORK0ー8"); -const u8 gUnknown_Debug_083C4635[] = _("LOCALWORK9ー15"); +static const u8 gUnknown_Debug_083C4628[] = _("LOCALWORK0ー8"); +static const u8 gUnknown_Debug_083C4635[] = _("LOCALWORK9ー15"); -const struct MenuAction gUnknown_Debug_083C4644[] = { +static const struct MenuAction gUnknown_Debug_083C4644[] = { {gUnknown_Debug_083C4628, debug_sub_808E754}, {gUnknown_Debug_083C4635, debug_sub_808E7AC} }; -const u8 gUnknown_Debug_083C4654[] = _("LOCALWORK0"); -const u8 gUnknown_Debug_083C465F[] = _("LOCALWORK1"); -const u8 gUnknown_Debug_083C466A[] = _("LOCALWORK2"); -const u8 gUnknown_Debug_083C4675[] = _("LOCALWORK3"); -const u8 gUnknown_Debug_083C4680[] = _("LOCALWORK4"); -const u8 gUnknown_Debug_083C468B[] = _("LOCALWORK5"); -const u8 gUnknown_Debug_083C4696[] = _("LOCALWORK6"); -const u8 gUnknown_Debug_083C46A1[] = _("LOCALWORK7"); -const u8 gUnknown_Debug_083C46AC[] = _("LOCALWORK8"); - -const u8 gUnknown_Debug_083C46B7[] = _("LOCALWORK9"); -const u8 gUnknown_Debug_083C46C2[] = _("LOCALWORK10"); -const u8 gUnknown_Debug_083C46CE[] = _("LOCALWORK11"); -const u8 gUnknown_Debug_083C46DA[] = _("LOCALWORK12"); -const u8 gUnknown_Debug_083C46E6[] = _("LOCALWORK13"); -const u8 gUnknown_Debug_083C46F2[] = _("LOCALWORK14"); -const u8 gUnknown_Debug_083C46FE[] = _("LOCALWORK15"); - -const struct MenuAction gUnknown_Debug_083C470C[] = { +static const u8 gUnknown_Debug_083C4654[] = _("LOCALWORK0"); +static const u8 gUnknown_Debug_083C465F[] = _("LOCALWORK1"); +static const u8 gUnknown_Debug_083C466A[] = _("LOCALWORK2"); +static const u8 gUnknown_Debug_083C4675[] = _("LOCALWORK3"); +static const u8 gUnknown_Debug_083C4680[] = _("LOCALWORK4"); +static const u8 gUnknown_Debug_083C468B[] = _("LOCALWORK5"); +static const u8 gUnknown_Debug_083C4696[] = _("LOCALWORK6"); +static const u8 gUnknown_Debug_083C46A1[] = _("LOCALWORK7"); +static const u8 gUnknown_Debug_083C46AC[] = _("LOCALWORK8"); + +static const u8 gUnknown_Debug_083C46B7[] = _("LOCALWORK9"); +static const u8 gUnknown_Debug_083C46C2[] = _("LOCALWORK10"); +static const u8 gUnknown_Debug_083C46CE[] = _("LOCALWORK11"); +static const u8 gUnknown_Debug_083C46DA[] = _("LOCALWORK12"); +static const u8 gUnknown_Debug_083C46E6[] = _("LOCALWORK13"); +static const u8 gUnknown_Debug_083C46F2[] = _("LOCALWORK14"); +static const u8 gUnknown_Debug_083C46FE[] = _("LOCALWORK15"); + +static const struct MenuAction gUnknown_Debug_083C470C[] = { {gUnknown_Debug_083C4654, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C465F, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C466A, TomomichiDebugMenu_Config}, @@ -1820,7 +1820,7 @@ const struct MenuAction gUnknown_Debug_083C470C[] = { {gUnknown_Debug_083C46AC, TomomichiDebugMenu_Config} }; -const struct MenuAction gUnknown_Debug_083C4754C[] = { +static const struct MenuAction gUnknown_Debug_083C4754C[] = { {gUnknown_Debug_083C46B7, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C46C2, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C46CE, TomomichiDebugMenu_Config}, @@ -1830,24 +1830,24 @@ const struct MenuAction gUnknown_Debug_083C4754C[] = { {gUnknown_Debug_083C46FE, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C478C[] = {9, 7}; +static const u8 gUnknown_Debug_083C478C[] = {9, 7}; -const u16 gUnknown_Debug_083C478E[][9] = { +static const u16 gUnknown_Debug_083C478E[][9] = { {VAR_TEMP_0, VAR_TEMP_1, VAR_TEMP_2, VAR_TEMP_3, VAR_TEMP_4, VAR_TEMP_5, VAR_TEMP_6, VAR_TEMP_7, VAR_TEMP_8}, {VAR_TEMP_9, VAR_TEMP_A, VAR_TEMP_B, VAR_TEMP_C, VAR_TEMP_D, VAR_TEMP_E, VAR_TEMP_F} }; -const u8 gUnknown_Debug_083C47B2[] = _("Level"); -const u8 gUnknown_Debug_083C47B8[] = _("Scene1"); -const u8 gUnknown_Debug_083C47BF[] = _("Scene2"); -const u8 gUnknown_Debug_083C47C6[] = _("Scene3"); -const u8 gUnknown_Debug_083C47CD[] = _("Scene4"); -const u8 gUnknown_Debug_083C47D4[] = _("Scene5"); -const u8 gUnknown_Debug_083C47DB[] = _("Scene6"); -const u8 gUnknown_Debug_083C47E2[] = _("Scene7"); -const u8 gUnknown_Debug_083C47E9[] = _("Scene8"); - -const struct MenuAction gUnknown_Debug_083C47F0[] = { +static const u8 gUnknown_Debug_083C47B2[] = _("Level"); +static const u8 gUnknown_Debug_083C47B8[] = _("Scene1"); +static const u8 gUnknown_Debug_083C47BF[] = _("Scene2"); +static const u8 gUnknown_Debug_083C47C6[] = _("Scene3"); +static const u8 gUnknown_Debug_083C47CD[] = _("Scene4"); +static const u8 gUnknown_Debug_083C47D4[] = _("Scene5"); +static const u8 gUnknown_Debug_083C47DB[] = _("Scene6"); +static const u8 gUnknown_Debug_083C47E2[] = _("Scene7"); +static const u8 gUnknown_Debug_083C47E9[] = _("Scene8"); + +static const struct MenuAction gUnknown_Debug_083C47F0[] = { {gUnknown_Debug_083C47B8, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C47BF, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C47C6, TomomichiDebugMenu_Config}, @@ -1858,14 +1858,14 @@ const struct MenuAction gUnknown_Debug_083C47F0[] = { {gUnknown_Debug_083C47E9, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C4830[] = _("Trick Master"); -const u8 gUnknown_Debug_083C483D[] = _("Hidden MASTER"); -const u8 gUnknown_Debug_083C484B[] = _("Inside the HOUSE"); -const u8 gUnknown_Debug_083C485C[] = _("Pass a reward"); -const u8 gUnknown_Debug_083C486A[] = _("Rig a trick"); -const u8 gUnknown_Debug_083C4876[] = _("MASTER is gone"); +static const u8 gUnknown_Debug_083C4830[] = _("Trick Master"); +static const u8 gUnknown_Debug_083C483D[] = _("Hidden MASTER"); +static const u8 gUnknown_Debug_083C484B[] = _("Inside the HOUSE"); +static const u8 gUnknown_Debug_083C485C[] = _("Pass a reward"); +static const u8 gUnknown_Debug_083C486A[] = _("Rig a trick"); +static const u8 gUnknown_Debug_083C4876[] = _("MASTER is gone"); -const struct MenuAction gUnknown_Debug_083C4888[] = { +static const struct MenuAction gUnknown_Debug_083C4888[] = { {gUnknown_Debug_083C483D, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C484B, TomomichiDebugMenu_Config}, {gUnknown_Debug_083C485C, TomomichiDebugMenu_Config}, @@ -1873,8 +1873,8 @@ const struct MenuAction gUnknown_Debug_083C4888[] = { {gUnknown_Debug_083C4876, TomomichiDebugMenu_Config} }; -const u8 gUnknown_Debug_083C48B0[] = _("PMNICKNAME"); -const u8 gUnknown_Debug_083C48BB[] = _("BREEDER"); +static const u8 gUnknown_Debug_083C48B0[] = _("PMNICKNAME"); +static const u8 gUnknown_Debug_083C48BB[] = _("BREEDER"); bool8 InitTomomichiDebugWindow(void) { @@ -1882,12 +1882,12 @@ bool8 InitTomomichiDebugWindow(void) return FALSE; } -void debug_sub_808B868(void) +static void debug_sub_808B868(void) { c2_exit_to_overworld_1_continue_scripts_restart_music(); } -bool8 debug_sub_808B874(void) +static bool8 debug_sub_808B874(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 13, 15); @@ -1897,7 +1897,7 @@ bool8 debug_sub_808B874(void) return FALSE; } -bool8 debug_sub_808B8C8(void) +static bool8 debug_sub_808B8C8(void) { if (gMain.newKeys & DPAD_UP) { @@ -1922,7 +1922,7 @@ bool8 debug_sub_808B8C8(void) return FALSE; } -bool8 TomomichiDebugMenu_ContestGraphics(void) +static bool8 TomomichiDebugMenu_ContestGraphics(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 20, 11); @@ -1937,7 +1937,7 @@ bool8 TomomichiDebugMenu_ContestGraphics(void) return FALSE; } -bool8 TomomichiDebugMenu_ArtMusGraphics(void) +static bool8 TomomichiDebugMenu_ArtMusGraphics(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 20, 11); @@ -1952,7 +1952,7 @@ bool8 TomomichiDebugMenu_ArtMusGraphics(void) return FALSE; } -bool8 TomomichiDebugMenu_PreviewData(void) +static bool8 TomomichiDebugMenu_PreviewData(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 20, 11); @@ -1967,7 +1967,7 @@ bool8 TomomichiDebugMenu_PreviewData(void) return FALSE; } -bool8 TomomichiDebugMenu_TrickHouse(void) +static bool8 TomomichiDebugMenu_TrickHouse(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 7); @@ -1978,7 +1978,7 @@ bool8 TomomichiDebugMenu_TrickHouse(void) return FALSE; } -bool8 TomomichiDebugMenu_ControlEvents(void) +static bool8 TomomichiDebugMenu_ControlEvents(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 5); @@ -1988,7 +1988,7 @@ bool8 TomomichiDebugMenu_ControlEvents(void) return FALSE; } -bool8 TomomichiDebugMenu_ControlFlags(void) +static bool8 TomomichiDebugMenu_ControlFlags(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 15); @@ -1998,7 +1998,7 @@ bool8 TomomichiDebugMenu_ControlFlags(void) return FALSE; } -bool8 TomomichiDebugMenu_ControlWorks(void) +static bool8 TomomichiDebugMenu_ControlWorks(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 13); @@ -2008,7 +2008,7 @@ bool8 TomomichiDebugMenu_ControlWorks(void) return FALSE; } -bool8 debug_sub_808BC48(void) +static bool8 debug_sub_808BC48(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2041,7 +2041,7 @@ bool8 debug_sub_808BC48(void) return FALSE; } -bool8 debug_sub_808BCBC(void) +static bool8 debug_sub_808BCBC(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2074,7 +2074,7 @@ bool8 debug_sub_808BCBC(void) return FALSE; } -bool8 debug_sub_808BD30(void) +static bool8 debug_sub_808BD30(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2107,7 +2107,7 @@ bool8 debug_sub_808BD30(void) return FALSE; } -bool8 debug_sub_808BDA4(void) +static bool8 debug_sub_808BDA4(void) { if (gMain.newKeys & DPAD_UP) { @@ -2132,7 +2132,7 @@ bool8 debug_sub_808BDA4(void) return FALSE; } -bool8 debug_sub_808BE2C(void) +static bool8 debug_sub_808BE2C(void) { if (gMain.newKeys & DPAD_UP) { @@ -2157,7 +2157,7 @@ bool8 debug_sub_808BE2C(void) return FALSE; } -bool8 debug_sub_808BEB4(void) +static bool8 debug_sub_808BEB4(void) { if (gMain.newKeys & DPAD_UP) { @@ -2182,7 +2182,7 @@ bool8 debug_sub_808BEB4(void) return FALSE; } -bool8 debug_sub_808BF3C(void) +static bool8 debug_sub_808BF3C(void) { if (gMain.newKeys & DPAD_UP) { @@ -2207,7 +2207,7 @@ bool8 debug_sub_808BF3C(void) return FALSE; } -bool8 debug_sub_808BFC4(void) +static bool8 debug_sub_808BFC4(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 19); @@ -2217,7 +2217,7 @@ bool8 debug_sub_808BFC4(void) return FALSE; } -bool8 debug_sub_808C014(void) +static bool8 debug_sub_808C014(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 13); @@ -2227,7 +2227,7 @@ bool8 debug_sub_808C014(void) return FALSE; } -bool8 debug_sub_808C064(void) +static bool8 debug_sub_808C064(void) { s8 input = Menu_ProcessInput(); @@ -2242,7 +2242,7 @@ bool8 debug_sub_808C064(void) return FALSE; } -bool8 debug_sub_808C0A8(void) +static bool8 debug_sub_808C0A8(void) { s8 input = Menu_ProcessInput(); @@ -2257,119 +2257,119 @@ bool8 debug_sub_808C0A8(void) return FALSE; } -bool8 debug_sub_808C0EC(void) +static bool8 debug_sub_808C0EC(void) { ScriptContext1_SetupScript(DebugScript_081C1CFE); CloseMenu(); return TRUE; } -bool8 debug_sub_808C104(void) +static bool8 debug_sub_808C104(void) { ScriptContext1_SetupScript(DebugScript_081C1D07); CloseMenu(); return TRUE; } -bool8 debug_sub_808C11C(void) +static bool8 debug_sub_808C11C(void) { ScriptContext1_SetupScript(DebugScript_081C1D1E); CloseMenu(); return TRUE; } -bool8 debug_sub_808C134(void) +static bool8 debug_sub_808C134(void) { ScriptContext1_SetupScript(DebugScript_081C1D24); CloseMenu(); return TRUE; } -bool8 debug_sub_808C14C(void) +static bool8 debug_sub_808C14C(void) { ScriptContext1_SetupScript(DebugScript_081C1D2A); CloseMenu(); return TRUE; } -bool8 debug_sub_808C164(void) +static bool8 debug_sub_808C164(void) { ScriptContext1_SetupScript(DebugScript_081C1D35); CloseMenu(); return TRUE; } -bool8 debug_sub_808C17C(void) +static bool8 debug_sub_808C17C(void) { ScriptContext1_SetupScript(DebugScript_081C1D46); CloseMenu(); return TRUE; } -bool8 debug_sub_808C194(void) +static bool8 debug_sub_808C194(void) { ScriptContext1_SetupScript(DebugScript_081C221F); CloseMenu(); return TRUE; } -bool8 debug_sub_808C1AC(void) +static bool8 debug_sub_808C1AC(void) { ScriptContext1_SetupScript(DebugScript_081C23E2); CloseMenu(); return TRUE; } -bool8 debug_sub_808C1C4(void) +static bool8 debug_sub_808C1C4(void) { ScriptContext1_SetupScript(DebugScript_081C23E6); CloseMenu(); return TRUE; } -bool8 debug_sub_808C1DC(void) +static bool8 debug_sub_808C1DC(void) { ScriptContext1_SetupScript(DebugScript_081C23F6); CloseMenu(); return TRUE; } -bool8 debug_sub_808C1F4(void) +static bool8 debug_sub_808C1F4(void) { ScriptContext1_SetupScript(DebugScript_081C2482); CloseMenu(); return TRUE; } -bool8 debug_sub_808C20C(void) +static bool8 debug_sub_808C20C(void) { ScriptContext1_SetupScript(DebugScript_081C23FD); CloseMenu(); return TRUE; } -bool8 debug_sub_808C224(void) +static bool8 debug_sub_808C224(void) { ScriptContext1_SetupScript(DebugScript_081C2518); CloseMenu(); return TRUE; } -bool8 debug_sub_808C23C(void) +static bool8 debug_sub_808C23C(void) { ScriptContext1_SetupScript(DebugScript_081C2507); CloseMenu(); return TRUE; } -bool8 TomomichiDebugMenu_ContestGraphics_Show(void) +static bool8 TomomichiDebugMenu_ContestGraphics_Show(void) { BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); gMenuCallback = debug_sub_808C280; return FALSE; } -bool8 debug_sub_808C280(void) +static bool8 debug_sub_808C280(void) { if (!UpdatePaletteFade()) { @@ -2382,14 +2382,14 @@ bool8 debug_sub_808C280(void) return FALSE; } -bool8 TomomichiDebugMenu_MuseumGraphics_Show(void) +static bool8 TomomichiDebugMenu_MuseumGraphics_Show(void) { BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); gMenuCallback = debug_sub_808C2E4; return FALSE; } -bool8 debug_sub_808C2E4(void) +static bool8 debug_sub_808C2E4(void) { if (!UpdatePaletteFade()) { @@ -2402,7 +2402,7 @@ bool8 debug_sub_808C2E4(void) return FALSE; } -bool8 debug_sub_808C31C(void) +static bool8 debug_sub_808C31C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 19); @@ -2412,7 +2412,7 @@ bool8 debug_sub_808C31C(void) return FALSE; } -bool8 debug_sub_808C36C(void) +static bool8 debug_sub_808C36C(void) { s8 input = Menu_ProcessInput(); @@ -2427,7 +2427,7 @@ bool8 debug_sub_808C36C(void) return FALSE; } -bool8 debug_sub_808C3B0(void) +static bool8 debug_sub_808C3B0(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2938) + 1); @@ -2438,7 +2438,7 @@ bool8 debug_sub_808C3B0(void) return FALSE; } -bool8 debug_sub_808C408(void) +static bool8 debug_sub_808C408(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2A48) + 1); @@ -2449,7 +2449,7 @@ bool8 debug_sub_808C408(void) return FALSE; } -bool8 debug_sub_808C460(void) +static bool8 debug_sub_808C460(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2B4C) + 1); @@ -2460,7 +2460,7 @@ bool8 debug_sub_808C460(void) return FALSE; } -bool8 debug_sub_808C4B8(void) +static bool8 debug_sub_808C4B8(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2C80) + 1); @@ -2471,7 +2471,7 @@ bool8 debug_sub_808C4B8(void) return FALSE; } -bool8 debug_sub_808C510(void) +static bool8 debug_sub_808C510(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2D8C) + 1); @@ -2482,7 +2482,7 @@ bool8 debug_sub_808C510(void) return FALSE; } -bool8 debug_sub_808C568(void) +static bool8 debug_sub_808C568(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2EB0) + 1); @@ -2493,7 +2493,7 @@ bool8 debug_sub_808C568(void) return FALSE; } -bool8 debug_sub_808C5C0(void) +static bool8 debug_sub_808C5C0(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2FE0) + 1); @@ -2504,7 +2504,7 @@ bool8 debug_sub_808C5C0(void) return FALSE; } -bool8 debug_sub_808C618(void) +static bool8 debug_sub_808C618(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C3100) + 1); @@ -2515,7 +2515,7 @@ bool8 debug_sub_808C618(void) return FALSE; } -bool8 debug_sub_808C670(void) +static bool8 debug_sub_808C670(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 3 + 1); @@ -2526,7 +2526,7 @@ bool8 debug_sub_808C670(void) return FALSE; } -bool8 debug_sub_808C6C8(void) +static bool8 debug_sub_808C6C8(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2543,7 +2543,7 @@ bool8 debug_sub_808C6C8(void) return FALSE; } -void debug_sub_808C714(u8 whichMenu, u8 cursorPos) +static void debug_sub_808C714(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { @@ -2554,7 +2554,7 @@ void debug_sub_808C714(u8 whichMenu, u8 cursorPos) } } -void debug_sub_808C764(u8 whichMenu) +static void debug_sub_808C764(u8 whichMenu) { u8 i; @@ -2564,7 +2564,7 @@ void debug_sub_808C764(u8 whichMenu) } } -bool8 debug_sub_808C7C8(void) +static bool8 debug_sub_808C7C8(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 19); @@ -2574,7 +2574,7 @@ bool8 debug_sub_808C7C8(void) return FALSE; } -bool8 debug_sub_808C818(void) +static bool8 debug_sub_808C818(void) { s8 input = Menu_ProcessInput(); @@ -2589,7 +2589,7 @@ bool8 debug_sub_808C818(void) return FALSE; } -bool8 debug_sub_808C85C(void) +static bool8 debug_sub_808C85C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1E0C) + 1); @@ -2600,7 +2600,7 @@ bool8 debug_sub_808C85C(void) return FALSE; } -bool8 debug_sub_808C8B4(void) +static bool8 debug_sub_808C8B4(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1F38) + 1); @@ -2611,7 +2611,7 @@ bool8 debug_sub_808C8B4(void) return FALSE; } -bool8 debug_sub_808C90C(void) +static bool8 debug_sub_808C90C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C206C) + 1); @@ -2622,7 +2622,7 @@ bool8 debug_sub_808C90C(void) return FALSE; } -bool8 debug_sub_808C964(void) +static bool8 debug_sub_808C964(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2190) + 1); @@ -2633,7 +2633,7 @@ bool8 debug_sub_808C964(void) return FALSE; } -bool8 debug_sub_808C9BC(void) +static bool8 debug_sub_808C9BC(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2264) + 1); @@ -2644,7 +2644,7 @@ bool8 debug_sub_808C9BC(void) return FALSE; } -bool8 debug_sub_808CA14(void) +static bool8 debug_sub_808CA14(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2370) + 1); @@ -2655,7 +2655,7 @@ bool8 debug_sub_808CA14(void) return FALSE; } -bool8 debug_sub_808CA6C(void) +static bool8 debug_sub_808CA6C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C248C) + 1); @@ -2666,7 +2666,7 @@ bool8 debug_sub_808CA6C(void) return FALSE; } -bool8 debug_sub_808CAC4(void) +static bool8 debug_sub_808CAC4(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C259C) + 1); @@ -2677,7 +2677,7 @@ bool8 debug_sub_808CAC4(void) return FALSE; } -bool8 debug_sub_808CB1C(void) +static bool8 debug_sub_808CB1C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C26C8) + 1); @@ -2688,7 +2688,7 @@ bool8 debug_sub_808CB1C(void) return FALSE; } -bool8 debug_sub_808CB74(void) +static bool8 debug_sub_808CB74(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2705,7 +2705,7 @@ bool8 debug_sub_808CB74(void) return FALSE; } -void debug_sub_808CBC0(u8 whichMenu, u8 cursorPos) +static void debug_sub_808CBC0(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { @@ -2716,7 +2716,7 @@ void debug_sub_808CBC0(u8 whichMenu, u8 cursorPos) } } -void debug_sub_808CC10(u8 whichMenu) +static void debug_sub_808CC10(u8 whichMenu) { u8 i; @@ -2726,7 +2726,7 @@ void debug_sub_808CC10(u8 whichMenu) } } -bool8 debug_sub_808CC74(void) +static bool8 debug_sub_808CC74(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1ADC) + 1); @@ -2736,7 +2736,7 @@ bool8 debug_sub_808CC74(void) return FALSE; } -bool8 debug_sub_808CCC4(void) +static bool8 debug_sub_808CCC4(void) { s8 input = Menu_ProcessInput(); @@ -2751,7 +2751,7 @@ bool8 debug_sub_808CCC4(void) return FALSE; } -bool8 debug_sub_808CD08(void) +static bool8 debug_sub_808CD08(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1B7C) + 1); @@ -2762,7 +2762,7 @@ bool8 debug_sub_808CD08(void) return FALSE; } -bool8 debug_sub_808CD60(void) +static bool8 debug_sub_808CD60(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1BF0) + 1); @@ -2773,7 +2773,7 @@ bool8 debug_sub_808CD60(void) return FALSE; } -bool8 debug_sub_808CDB8(void) +static bool8 debug_sub_808CDB8(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1C2C) + 1); @@ -2784,7 +2784,7 @@ bool8 debug_sub_808CDB8(void) return FALSE; } -bool8 debug_sub_808CE10(void) +static bool8 debug_sub_808CE10(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2801,7 +2801,7 @@ bool8 debug_sub_808CE10(void) return FALSE; } -void debug_sub_808CE5C(u8 whichMenu, u8 cursorPos) +static void debug_sub_808CE5C(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { @@ -2812,7 +2812,7 @@ void debug_sub_808CE5C(u8 whichMenu, u8 cursorPos) } } -void debug_sub_808CEAC(u8 whichMenu) +static void debug_sub_808CEAC(u8 whichMenu) { u8 i; @@ -2822,7 +2822,7 @@ void debug_sub_808CEAC(u8 whichMenu) } } -bool8 debug_sub_808CF10(void) +static bool8 debug_sub_808CF10(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1330) + 1); @@ -2832,7 +2832,7 @@ bool8 debug_sub_808CF10(void) return FALSE; } -bool8 debug_sub_808CF60(void) +static bool8 debug_sub_808CF60(void) { s8 input = Menu_ProcessInput(); @@ -2847,7 +2847,7 @@ bool8 debug_sub_808CF60(void) return FALSE; } -bool8 debug_sub_808CFA4(void) +static bool8 debug_sub_808CFA4(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C13D8) + 1); @@ -2858,7 +2858,7 @@ bool8 debug_sub_808CFA4(void) return FALSE; } -bool8 debug_sub_808CFFC(void) +static bool8 debug_sub_808CFFC(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1465) + 1); @@ -2869,7 +2869,7 @@ bool8 debug_sub_808CFFC(void) return FALSE; } -bool8 debug_sub_808D054(void) +static bool8 debug_sub_808D054(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1503) + 1); @@ -2880,7 +2880,7 @@ bool8 debug_sub_808D054(void) return FALSE; } -bool8 debug_sub_808D0AC(void) +static bool8 debug_sub_808D0AC(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C158A) + 1); @@ -2891,7 +2891,7 @@ bool8 debug_sub_808D0AC(void) return FALSE; } -bool8 debug_sub_808D104(void) +static bool8 debug_sub_808D104(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1647) + 1); @@ -2902,7 +2902,7 @@ bool8 debug_sub_808D104(void) return FALSE; } -bool8 debug_sub_808D15C(void) +static bool8 debug_sub_808D15C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1712) + 1); @@ -2913,7 +2913,7 @@ bool8 debug_sub_808D15C(void) return FALSE; } -bool8 debug_sub_808D1B4(void) +static bool8 debug_sub_808D1B4(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C17F8) + 1); @@ -2924,7 +2924,7 @@ bool8 debug_sub_808D1B4(void) return FALSE; } -bool8 debug_sub_808D20C(void) +static bool8 debug_sub_808D20C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); @@ -2935,7 +2935,7 @@ bool8 debug_sub_808D20C(void) return FALSE; } -bool8 debug_sub_808D264(void) +static bool8 debug_sub_808D264(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1); @@ -2946,7 +2946,7 @@ bool8 debug_sub_808D264(void) return FALSE; } -bool8 debug_sub_808D2BC(void) +static bool8 debug_sub_808D2BC(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2963,7 +2963,7 @@ bool8 debug_sub_808D2BC(void) return FALSE; } -void debug_sub_808D308(u8 whichMenu, u8 cursorPos) +static void debug_sub_808D308(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { @@ -2974,7 +2974,7 @@ void debug_sub_808D308(u8 whichMenu, u8 cursorPos) } } -void debug_sub_808D358(u8 whichMenu) +static void debug_sub_808D358(u8 whichMenu) { u8 i; @@ -2984,7 +2984,7 @@ void debug_sub_808D358(u8 whichMenu) } } -bool8 debug_sub_808D3BC(void) +static bool8 debug_sub_808D3BC(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C105C) + 1); @@ -2994,7 +2994,7 @@ bool8 debug_sub_808D3BC(void) return FALSE; } -bool8 debug_sub_808D40C(void) +static bool8 debug_sub_808D40C(void) { s8 input = Menu_ProcessInput(); @@ -3009,7 +3009,7 @@ bool8 debug_sub_808D40C(void) return FALSE; } -bool8 debug_sub_808D450(void) +static bool8 debug_sub_808D450(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C10BD) + 1); @@ -3020,7 +3020,7 @@ bool8 debug_sub_808D450(void) return FALSE; } -bool8 debug_sub_808D4A8(void) +static bool8 debug_sub_808D4A8(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); @@ -3031,7 +3031,7 @@ bool8 debug_sub_808D4A8(void) return FALSE; } -bool8 debug_sub_808D500(void) +static bool8 debug_sub_808D500(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3048,7 +3048,7 @@ bool8 debug_sub_808D500(void) return FALSE; } -void debug_sub_808D54C(u8 whichMenu, u8 cursorPos) +static void debug_sub_808D54C(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { @@ -3059,7 +3059,7 @@ void debug_sub_808D54C(u8 whichMenu, u8 cursorPos) } } -void debug_sub_808D59C(u8 whichMenu) +static void debug_sub_808D59C(u8 whichMenu) { u8 i; @@ -3069,7 +3069,7 @@ void debug_sub_808D59C(u8 whichMenu) } } -bool8 debug_sub_808D600(void) +static bool8 debug_sub_808D600(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C11CC) + 1); @@ -3079,7 +3079,7 @@ bool8 debug_sub_808D600(void) return FALSE; } -bool8 debug_sub_808D650(void) +static bool8 debug_sub_808D650(void) { s8 input = Menu_ProcessInput(); @@ -3094,7 +3094,7 @@ bool8 debug_sub_808D650(void) return FALSE; } -bool8 debug_sub_808D694(void) +static bool8 debug_sub_808D694(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1212) + 1); @@ -3105,7 +3105,7 @@ bool8 debug_sub_808D694(void) return FALSE; } -bool8 debug_sub_808D6EC(void) +static bool8 debug_sub_808D6EC(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); @@ -3116,7 +3116,7 @@ bool8 debug_sub_808D6EC(void) return FALSE; } -bool8 debug_sub_808D744(void) +static bool8 debug_sub_808D744(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3133,7 +3133,7 @@ bool8 debug_sub_808D744(void) return FALSE; } -void debug_sub_808D790(u8 whichMenu, u8 cursorPos) +static void debug_sub_808D790(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { @@ -3144,7 +3144,7 @@ void debug_sub_808D790(u8 whichMenu, u8 cursorPos) } } -void debug_sub_808D7E0(u8 whichMenu) +static void debug_sub_808D7E0(u8 whichMenu) { u8 i; @@ -3154,7 +3154,7 @@ void debug_sub_808D7E0(u8 whichMenu) } } -bool8 debug_sub_808D844(void) +static bool8 debug_sub_808D844(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1A78) + 1); @@ -3164,7 +3164,7 @@ bool8 debug_sub_808D844(void) return FALSE; } -bool8 debug_sub_808D894(void) +static bool8 debug_sub_808D894(void) { s8 input = Menu_ProcessInput(); @@ -3179,7 +3179,7 @@ bool8 debug_sub_808D894(void) return FALSE; } -bool8 debug_sub_808D8D8(void) +static bool8 debug_sub_808D8D8(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1A9C) + 1); @@ -3190,7 +3190,7 @@ bool8 debug_sub_808D8D8(void) return FALSE; } -bool8 debug_sub_808D930(void) +static bool8 debug_sub_808D930(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3207,7 +3207,7 @@ bool8 debug_sub_808D930(void) return FALSE; } -void debug_sub_808D97C(u8 whichMenu, u8 cursorPos) +static void debug_sub_808D97C(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { @@ -3218,7 +3218,7 @@ void debug_sub_808D97C(u8 whichMenu, u8 cursorPos) } } -void debug_sub_808D9CC(u8 whichMenu) +static void debug_sub_808D9CC(u8 whichMenu) { u8 i; @@ -3228,7 +3228,7 @@ void debug_sub_808D9CC(u8 whichMenu) } } -bool8 debug_sub_808DA30(void) +static bool8 debug_sub_808DA30(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C103A) + 1); @@ -3238,7 +3238,7 @@ bool8 debug_sub_808DA30(void) return FALSE; } -bool8 debug_sub_808DA80(void) +static bool8 debug_sub_808DA80(void) { s8 input = Menu_ProcessInput(); /*s8 cursorPos = */Menu_GetCursorPos(); @@ -3255,12 +3255,12 @@ bool8 debug_sub_808DA80(void) return FALSE; } -void debug_sub_808DABC(void) +static void debug_sub_808DABC(void) { debug_sub_808F31C(24, 1, gSpecialVar_Result); } -void debug_sub_808DAD4(void) +static void debug_sub_808DAD4(void) { u16 delta; @@ -3277,7 +3277,7 @@ void debug_sub_808DAD4(void) gSpecialVar_Result += delta; } -bool8 debug_sub_808DB0C(void) +static bool8 debug_sub_808DB0C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C3D08) + 1); @@ -3287,7 +3287,7 @@ bool8 debug_sub_808DB0C(void) return FALSE; } -bool8 debug_sub_808DB5C(void) +static bool8 debug_sub_808DB5C(void) { s8 input = Menu_ProcessInput(); @@ -3302,7 +3302,7 @@ bool8 debug_sub_808DB5C(void) return FALSE; } -bool8 debug_sub_808DBA0(void) +static bool8 debug_sub_808DBA0(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C432C) + 1); @@ -3313,7 +3313,7 @@ bool8 debug_sub_808DBA0(void) return FALSE; } -bool8 debug_sub_808DBF8(void) +static bool8 debug_sub_808DBF8(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C436C) + 1); @@ -3324,7 +3324,7 @@ bool8 debug_sub_808DBF8(void) return FALSE; } -bool8 debug_sub_808DC50(void) +static bool8 debug_sub_808DC50(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C43B4) + 1); @@ -3335,7 +3335,7 @@ bool8 debug_sub_808DC50(void) return FALSE; } -bool8 debug_sub_808DCA8(void) +static bool8 debug_sub_808DCA8(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C43FC) + 1); @@ -3346,7 +3346,7 @@ bool8 debug_sub_808DCA8(void) return FALSE; } -bool8 debug_sub_808DD00(void) +static bool8 debug_sub_808DD00(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4444) + 1); @@ -3357,7 +3357,7 @@ bool8 debug_sub_808DD00(void) return FALSE; } -bool8 debug_sub_808DD58(void) +static bool8 debug_sub_808DD58(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C448C) + 1); @@ -3368,7 +3368,7 @@ bool8 debug_sub_808DD58(void) return FALSE; } -bool8 debug_sub_808DDB0(void) +static bool8 debug_sub_808DDB0(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); @@ -3379,7 +3379,7 @@ bool8 debug_sub_808DDB0(void) return FALSE; } -bool8 debug_sub_808DE08(void) +static bool8 debug_sub_808DE08(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C44EC) + 1); @@ -3390,7 +3390,7 @@ bool8 debug_sub_808DE08(void) return FALSE; } -bool8 debug_sub_808DE60(void) +static bool8 debug_sub_808DE60(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4534) + 1); @@ -3401,7 +3401,7 @@ bool8 debug_sub_808DE60(void) return FALSE; } -bool8 debug_sub_808DEB8(void) +static bool8 debug_sub_808DEB8(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3418,7 +3418,7 @@ bool8 debug_sub_808DEB8(void) return FALSE; } -void debug_sub_808DF04(u8 whichMenu) +static void debug_sub_808DF04(u8 whichMenu) { u8 i; @@ -3428,7 +3428,7 @@ void debug_sub_808DF04(u8 whichMenu) } } -void debug_sub_808DF64(u8 whichMenu, u8 cursorPos) +static void debug_sub_808DF64(u8 whichMenu, u8 cursorPos) { u16 delta; @@ -3441,7 +3441,7 @@ void debug_sub_808DF64(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_083C4586[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C4586[whichMenu][cursorPos]) + delta); } -bool8 debug_sub_808DFC0(void) +static bool8 debug_sub_808DFC0(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C377C) + 1); @@ -3451,7 +3451,7 @@ bool8 debug_sub_808DFC0(void) return FALSE; } -bool8 debug_sub_808E010(void) +static bool8 debug_sub_808E010(void) { s8 input = Menu_ProcessInput(); @@ -3466,7 +3466,7 @@ bool8 debug_sub_808E010(void) return FALSE; } -bool8 debug_sub_808E054(void) +static bool8 debug_sub_808E054(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); @@ -3477,7 +3477,7 @@ bool8 debug_sub_808E054(void) return FALSE; } -bool8 debug_sub_808E0AC(void) +static bool8 debug_sub_808E0AC(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1); @@ -3488,7 +3488,7 @@ bool8 debug_sub_808E0AC(void) return FALSE; } -bool8 debug_sub_808E104(void) +static bool8 debug_sub_808E104(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3B28) + 1); @@ -3499,7 +3499,7 @@ bool8 debug_sub_808E104(void) return FALSE; } -bool8 debug_sub_808E15C(void) +static bool8 debug_sub_808E15C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 2 + 1); @@ -3510,7 +3510,7 @@ bool8 debug_sub_808E15C(void) return FALSE; } -bool8 debug_sub_808E1B4(void) +static bool8 debug_sub_808E1B4(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3BB8) + 1); @@ -3521,7 +3521,7 @@ bool8 debug_sub_808E1B4(void) return FALSE; } -bool8 debug_sub_808E20C(void) +static bool8 debug_sub_808E20C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); @@ -3532,7 +3532,7 @@ bool8 debug_sub_808E20C(void) return FALSE; } -bool8 debug_sub_808E264(void) +static bool8 debug_sub_808E264(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3549,7 +3549,7 @@ bool8 debug_sub_808E264(void) return FALSE; } -void debug_sub_808E2B0(u8 whichMenu) +static void debug_sub_808E2B0(u8 whichMenu) { u8 i; @@ -3559,7 +3559,7 @@ void debug_sub_808E2B0(u8 whichMenu) } } -void debug_sub_808E310(u8 whichMenu, u8 cursorPos) +static void debug_sub_808E310(u8 whichMenu, u8 cursorPos) { u16 delta; @@ -3572,7 +3572,7 @@ void debug_sub_808E310(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_83C3C4E[whichMenu][cursorPos], VarGet(gUnknown_Debug_83C3C4E[whichMenu][cursorPos]) + delta); } -bool8 debug_sub_808E36C(void) +static bool8 debug_sub_808E36C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C32AC) + 1); @@ -3582,7 +3582,7 @@ bool8 debug_sub_808E36C(void) return FALSE; } -bool8 debug_sub_808E3BC(void) +static bool8 debug_sub_808E3BC(void) { s8 input = Menu_ProcessInput(); @@ -3597,7 +3597,7 @@ bool8 debug_sub_808E3BC(void) return FALSE; } -bool8 debug_sub_808E400(void) +static bool8 debug_sub_808E400(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C347C) + 1); @@ -3608,7 +3608,7 @@ bool8 debug_sub_808E400(void) return FALSE; } -bool8 debug_sub_808E458(void) +static bool8 debug_sub_808E458(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C3494) + 1); @@ -3619,7 +3619,7 @@ bool8 debug_sub_808E458(void) return FALSE; } -bool8 debug_sub_808E4B0(void) +static bool8 debug_sub_808E4B0(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C34A4) + 1); @@ -3630,7 +3630,7 @@ bool8 debug_sub_808E4B0(void) return FALSE; } -bool8 debug_sub_808E508(void) +static bool8 debug_sub_808E508(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C34D4) + 1); @@ -3641,7 +3641,7 @@ bool8 debug_sub_808E508(void) return FALSE; } -bool8 debug_sub_808E560(void) +static bool8 debug_sub_808E560(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C351C) + 1); @@ -3652,7 +3652,7 @@ bool8 debug_sub_808E560(void) return FALSE; } -bool8 debug_sub_808E5B8(void) +static bool8 debug_sub_808E5B8(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3669,7 +3669,7 @@ bool8 debug_sub_808E5B8(void) return FALSE; } -void debug_sub_808E604(u8 whichMenu, u8 cursorPos) +static void debug_sub_808E604(u8 whichMenu, u8 cursorPos) { u16 delta; @@ -3682,7 +3682,7 @@ void debug_sub_808E604(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_083C354A[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C354A[whichMenu][cursorPos]) + delta); } -void debug_sub_808E660(u8 whichMenu) +static void debug_sub_808E660(u8 whichMenu) { u8 i; @@ -3692,7 +3692,7 @@ void debug_sub_808E660(u8 whichMenu) } } -bool8 debug_sub_808E6C0(void) +static bool8 debug_sub_808E6C0(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C4644) + 1); @@ -3702,7 +3702,7 @@ bool8 debug_sub_808E6C0(void) return FALSE; } -bool8 debug_sub_808E710(void) +static bool8 debug_sub_808E710(void) { s8 input = Menu_ProcessInput(); @@ -3717,7 +3717,7 @@ bool8 debug_sub_808E710(void) return FALSE; } -bool8 debug_sub_808E754(void) +static bool8 debug_sub_808E754(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C470C) + 1); @@ -3728,7 +3728,7 @@ bool8 debug_sub_808E754(void) return FALSE; } -bool8 debug_sub_808E7AC(void) +static bool8 debug_sub_808E7AC(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4754C) + 1); @@ -3739,7 +3739,7 @@ bool8 debug_sub_808E7AC(void) return FALSE; } -bool8 debug_sub_808E804(void) +static bool8 debug_sub_808E804(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3756,7 +3756,7 @@ bool8 debug_sub_808E804(void) return FALSE; } -void debug_sub_808E850(u8 whichMenu, u8 cursorPos) +static void debug_sub_808E850(u8 whichMenu, u8 cursorPos) { u16 delta; @@ -3769,7 +3769,7 @@ void debug_sub_808E850(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_083C478E[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C478E[whichMenu][cursorPos]) + delta); } -void debug_sub_808E8AC(u8 whichMenu) +static void debug_sub_808E8AC(u8 whichMenu) { u8 i; @@ -3779,7 +3779,7 @@ void debug_sub_808E8AC(u8 whichMenu) } } -bool8 debug_sub_808E90C(void) +static bool8 debug_sub_808E90C(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C35C4) + 1); @@ -3789,7 +3789,7 @@ bool8 debug_sub_808E90C(void) return FALSE; } -bool8 debug_sub_808E95C(void) +static bool8 debug_sub_808E95C(void) { s8 input = Menu_ProcessInput(); @@ -3804,7 +3804,7 @@ bool8 debug_sub_808E95C(void) return FALSE; } -bool8 debug_sub_808E9A0(void) +static bool8 debug_sub_808E9A0(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C369C) + 1); @@ -3815,7 +3815,7 @@ bool8 debug_sub_808E9A0(void) return FALSE; } -bool8 debug_sub_808E9F8(void) +static bool8 debug_sub_808E9F8(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C36E4) + 1); @@ -3826,7 +3826,7 @@ bool8 debug_sub_808E9F8(void) return FALSE; } -bool8 debug_sub_808EA50(void) +static bool8 debug_sub_808EA50(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3843,7 +3843,7 @@ bool8 debug_sub_808EA50(void) return FALSE; } -void debug_sub_808EA9C(u8 whichMenu) +static void debug_sub_808EA9C(u8 whichMenu) { u8 i; @@ -3853,7 +3853,7 @@ void debug_sub_808EA9C(u8 whichMenu) } } -void debug_sub_808EAFC(u8 whichMenu, u8 cursorPos) +static void debug_sub_808EAFC(u8 whichMenu, u8 cursorPos) { u16 delta; @@ -3866,7 +3866,7 @@ void debug_sub_808EAFC(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_083C371E[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C371E[whichMenu][cursorPos]) + delta); } -bool8 debug_sub_808EB58(void) +static bool8 debug_sub_808EB58(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 12, 2 * ARRAY_COUNT(gUnknown_Debug_083C47F0) + 3); @@ -3877,7 +3877,7 @@ bool8 debug_sub_808EB58(void) return FALSE; } -bool8 debug_sub_808EBB4(void) +static bool8 debug_sub_808EBB4(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 13, 2 * ARRAY_COUNT(gUnknown_Debug_083C4888) + 3); @@ -3888,7 +3888,7 @@ bool8 debug_sub_808EBB4(void) return FALSE; } -bool8 debug_sub_808EC10(void) +static bool8 debug_sub_808EC10(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3906,7 +3906,7 @@ bool8 debug_sub_808EC10(void) return TRUE; } -bool8 debug_sub_808EC5C(void) +static bool8 debug_sub_808EC5C(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -3924,14 +3924,14 @@ bool8 debug_sub_808EC5C(void) return TRUE; } -bool8 debug_sub_808ECA4(void) +static bool8 debug_sub_808ECA4(void) { BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); gMenuCallback = debug_sub_808ECD0; return FALSE; } -bool8 debug_sub_808ECD0(void) +static bool8 debug_sub_808ECD0(void) { if (!UpdatePaletteFade()) { @@ -3944,12 +3944,12 @@ bool8 debug_sub_808ECD0(void) return FALSE; } -bool8 TomomichiDebugMenu_Config(void) +static bool8 TomomichiDebugMenu_Config(void) { return FALSE; } -void debug_sub_808ED0C(void) +static void debug_sub_808ED0C(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { @@ -3977,7 +3977,7 @@ void debug_sub_808ED0C(void) } } -void debug_sub_808ED9C(void) +static void debug_sub_808ED9C(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { @@ -4009,7 +4009,7 @@ void debug_sub_808ED9C(void) } } -void debug_sub_808EE3C(void) +static void debug_sub_808EE3C(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { @@ -4027,7 +4027,7 @@ void debug_sub_808EE3C(void) gDebug_0300070C = 5; } -void debug_sub_808EE9C(void) +static void debug_sub_808EE9C(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { @@ -4055,7 +4055,7 @@ void debug_sub_808EE9C(void) } } -void debug_sub_808EF14(void) +static void debug_sub_808EF14(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { @@ -4084,7 +4084,7 @@ void debug_sub_808EF14(void) } #ifdef NONMATCHING -void debug_sub_808EF8C(u8 a0) +static void debug_sub_808EF8C(u8 a0) { u8 i; u8 digit; @@ -4406,4 +4406,77 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) } #endif // NONMATCHING +static void debug_sub_808F168(u8 a0) +{ + struct ContestEntry *contestEntry = &ewram15DE0; + contestEntry->var8 = gDebug_03000700; + contestEntry->var4 = gDebug_03000704; + contestEntry->var0 = gDebug_03000708; + switch (a0) + { + case 0: + ewram15DDF = 0; + ewram15DDE = 0; + contestEntry->contestType = gDebug_0300070C - 1; + StringCopy(contestEntry->trainer_name, gUnknown_Debug_083C48BB); + StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + break; + case 1: + ewram15DDF = 0; + ewram15DDE = 8; + contestEntry->contestType = gDebug_0300070D - 1; + StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + break; + case 2: + ewram15DDF = 1; + ewram15DDE = 8; + contestEntry->contestType = gDebug_0300070E - 1; + break; + case 3: + ewram15DDF = 0; + ewram15DDE = 8; + contestEntry->contestType = 0; + StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + break; + case 4: + ewram15DDF = 0; + ewram15DDE = 8; + contestEntry->contestType = 3; + StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + break; + case 5: + ewram15DDF = 0; + ewram15DDE = 8; + contestEntry->contestType = 9; + StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + break; + } +} + +static void debug_sub_808F2E0(u8 a0, u8 a1, u8 a2) +{ + if (a2 == 0) + gDebug_03000710[0] = CHAR_0; + else + gDebug_03000710[0] = CHAR_0 + 1; + gDebug_03000710[1] = EOS; + Menu_PrintText(gDebug_03000710, a0, a1); +} + +static void debug_sub_808F31C(u8 a0, u8 a1, u16 a2) +{ + gDebug_03000710[0] = a2 / 10000 + CHAR_0; + gDebug_03000710[1] = (a2 % 10000) / 1000 + CHAR_0; + gDebug_03000710[2] = (a2 % 1000) / 100 + CHAR_0; + gDebug_03000710[3] = (a2 % 100) / 10 + CHAR_0; + gDebug_03000710[4] = a2 % 10 + CHAR_0; + gDebug_03000710[5] = EOS; + Menu_PrintText(gDebug_03000710, a0, a1); +} + +void debug_nullsub_66(void) +{ +// This function likely serves as the entry point into this file. +} + #endif // DEBUG -- cgit v1.2.3 From e49ff77a07d79d38cd909c5e824e70e91475b82d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 14 Mar 2018 08:54:30 -0400 Subject: Fix matching contest_painting --- src/debug/tomomichi_debug_menu.c | 1714 +++++++++++++++++++------------------- src/scene/contest_painting.c | 2 +- 2 files changed, 859 insertions(+), 857 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 255fefdce..1df6ff26c 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -16,35 +16,35 @@ #include "contest_painting.h" #include "sound.h" -static u16 gDebug_03000700; -static u32 gDebug_03000704; -static u32 gDebug_03000708; -static u8 gDebug_0300070C; -static u8 gDebug_0300070D; -static u8 gDebug_0300070E; -static u8 gDebug_0300070F; -static u8 gDebug_03000710[13]; -static u8 gDebug_0300071D; -static u8 gDebug_0300071E; -static u8 gDebug_0300071F; -static u8 gDebug_03000720; -static u8 gDebug_03000721; - -static bool8 TomomichiDebugMenu_ArtMusGraphics(void); -static bool8 TomomichiDebugMenu_Config(void); -static bool8 TomomichiDebugMenu_ContestGraphics(void); -static bool8 TomomichiDebugMenu_ContestGraphics_Show(void); -static bool8 TomomichiDebugMenu_ControlEvents(void); -static bool8 TomomichiDebugMenu_ControlFlags(void); -static bool8 TomomichiDebugMenu_ControlWorks(void); -static bool8 TomomichiDebugMenu_MuseumGraphics_Show(void); -static bool8 TomomichiDebugMenu_PreviewData(void); -static bool8 TomomichiDebugMenu_TrickHouse(void); +static u16 sPicTest_Species; +static u32 sPicTest_ContestEntryVar4; +static u32 sPicTest_IDrndDigit; +static u8 sPicTest_ContestType; +static u8 sPicTest_MuseumArtTitleType; +static u8 sPicTest_PreviewType; +static u8 sFlagAndVarTest_WhichSubmenu; +static u8 sPicTest_StringBuffer[13]; +static u8 sTopMenuCursorPos; +static u8 sTrickRelatedMenuCursorPos; +static u8 sControlEventsCursorPos; +static u8 sControlFlagsCursorPos; +static u8 sControlWORKCursorPos; + +static bool8 ArtMusGraphics(void); +static bool8 Config(void); +static bool8 ContestGraphics(void); +static bool8 ContestGraphics_Show(void); +static bool8 ControlEvents(void); +static bool8 ControlFlags(void); +static bool8 ControlWorks(void); +static bool8 MuseumGraphics_Show(void); +static bool8 PreviewData(void); +static bool8 TrickHouse(void); static bool8 debug_sub_808B874(void); static bool8 debug_sub_808B8C8(void); static bool8 debug_sub_808BC48(void); static bool8 debug_sub_808BCBC(void); -static bool8 debug_sub_808BD30(void); +static bool8 PreviewData_HandleInput(void); static bool8 debug_sub_808BDA4(void); static bool8 debug_sub_808BE2C(void); static bool8 debug_sub_808BEB4(void); @@ -199,15 +199,15 @@ static bool8 debug_sub_808EC10(void); static bool8 debug_sub_808EC5C(void); static bool8 debug_sub_808ECA4(void); static bool8 debug_sub_808ECD0(void); -static void debug_sub_808ED0C(void); -static void debug_sub_808ED9C(void); -static void debug_sub_808EE3C(void); -static void debug_sub_808EE9C(void); -static void debug_sub_808EF14(void); -static void debug_sub_808EF8C(u8 a0); -static void debug_sub_808F168(u8 a0); -static void debug_sub_808F2E0(u8, u8, bool8); -static void debug_sub_808F31C(u8, u8, u16); +static void PicTest_SelectPokemon(void); +static void PicTest_SelectIDrndDigit(void); +static void ContestPicTest_SelectContestType(void); +static void MuseumArtPicTest_SelectTitleType(void); +static void PreviewPicTest_SelectType(void); +static void PicTest_Redraw(u8 a0); +static void PrepareDebugOverlayBeforeShowingContestPainting(u8 a0); +static void PrintBool(u8, u8, bool8); +static void PrintUnsignedShort(u8, u8, u16); extern const u8 DebugScript_081C1CFE[]; extern const u8 DebugScript_081C1D07[]; @@ -225,49 +225,50 @@ extern const u8 DebugScript_081C23FD[]; extern const u8 DebugScript_081C2518[]; extern const u8 DebugScript_081C2507[]; -static const u8 gUnknown_Debug_083C0C54[] = _("Contest graphics"); -static const u8 gUnknown_Debug_083C0C65[] = _("Art Mus. graphics"); -static const u8 gUnknown_Debug_083C0C77[] = _("Preview data"); -static const u8 gUnknown_Debug_083C0C84[] = _("TRICK HOUSE"); -static const u8 gUnknown_Debug_083C0C90[] = _("Control events"); -static const u8 gUnknown_Debug_083C0C9F[] = _("Control flags"); -static const u8 gUnknown_Debug_083C0CAD[] = _("Control WORK"); +static const u8 sString_ContestGraphics[] = _("Contest graphics"); +static const u8 sString_ArtMuseumGraphics[] = _("Art Mus. graphics"); +static const u8 sString_PreviewData[] = _("Preview data"); +static const u8 sString_TrickHouse[] = _("TRICK HOUSE"); +static const u8 sString_ControlEvents[] = _("Control events"); +static const u8 sString_ControlFlags[] = _("Control flags"); +static const u8 sString_ControlWORK[] = _("Control WORK"); static const struct MenuAction gUnknown_Debug_083C0CBA[] = { - {gUnknown_Debug_083C0C54, TomomichiDebugMenu_ContestGraphics}, - {gUnknown_Debug_083C0C65, TomomichiDebugMenu_ArtMusGraphics}, - {gUnknown_Debug_083C0C77, TomomichiDebugMenu_PreviewData}, - {gUnknown_Debug_083C0C84, TomomichiDebugMenu_TrickHouse}, - {gUnknown_Debug_083C0C90, TomomichiDebugMenu_ControlEvents}, - {gUnknown_Debug_083C0C9F, TomomichiDebugMenu_ControlFlags}, - {gUnknown_Debug_083C0CAD, TomomichiDebugMenu_ControlWorks}, + {sString_ContestGraphics, ContestGraphics}, + {sString_ArtMuseumGraphics, ArtMusGraphics}, + {sString_PreviewData, PreviewData}, + {sString_TrickHouse, TrickHouse}, + {sString_ControlEvents, ControlEvents}, + {sString_ControlFlags, ControlFlags}, + {sString_ControlWORK, ControlWorks}, }; -static const u8 gUnknown_Debug_083C0CF4[] = _("Contest"); +static const u8 sString_ContestMenuTitle[] = _("Contest"); -static const u8 gUnknown_Debug_083C0CFC[] = _("Pokémon No."); -static const u8 gUnknown_Debug_083C0D08[] = _("ID rnd. digit"); -static const u8 gUnknown_Debug_083C0D16[] = _("Contest Type"); -static const u8 gUnknown_Debug_083C0D23[] = _("Poké Art"); +static const u8 sString_Contest_PokemonNo[] = _("Pokémon No."); +static const u8 sString_Contest_IDrndDigit[] = _("ID rnd. digit"); +static const u8 sString_Contest_Type[] = _("Contest Type"); +static const u8 sString_Contest_PokeArt[] = _("Poké Art"); -static const struct MenuAction gUnknown_Debug_083C0D2C[] = { - {gUnknown_Debug_083C0CFC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C0D08, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C0D16, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C0D23, TomomichiDebugMenu_ContestGraphics_Show} +static const struct MenuAction sMenuActions_ContestPicTest[] = { + {sString_Contest_PokemonNo, Config}, + {sString_Contest_IDrndDigit, Config}, + {sString_Contest_Type, Config}, + {sString_Contest_PokeArt, ContestGraphics_Show} }; -static const u8 gUnknown_Debug_083C0D4C[] = _("Art Mus."); -static const u8 gUnknown_Debug_083C0D55[] = _("Pokémon No."); -static const u8 gUnknown_Debug_083C0D61[] = _("ID rnd. digit"); -static const u8 gUnknown_Debug_083C0D6F[] = _("Title Type"); -static const u8 gUnknown_Debug_083C0D7A[] = _("Poké Art"); - -static const struct MenuAction gUnknown_Debug_083C0D83[] = { - {gUnknown_Debug_083C0D55, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C0D61, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C0D6F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C0D7A, TomomichiDebugMenu_MuseumGraphics_Show} +static const u8 sString_Contest_ArtMuseumTitle[] = _("Art Mus."); + +static const u8 sString_Contest_ArtMuseum_PokemonNo[] = _("Pokémon No."); +static const u8 sString_Contest_ArtMuseum_IDrndDigit[] = _("ID rnd. digit"); +static const u8 sString_Contest_ArtMuseum_Type[] = _("Title Type"); +static const u8 sString_Contest_ArtMuseum_PokeArt[] = _("Poké Art"); + +static const struct MenuAction sMenuActions_ArtMuseumPicTest[] = { + {sString_Contest_ArtMuseum_PokemonNo, Config}, + {sString_Contest_ArtMuseum_IDrndDigit, Config}, + {sString_Contest_ArtMuseum_Type, Config}, + {sString_Contest_ArtMuseum_PokeArt, MuseumGraphics_Show} }; static const u8 gUnknown_Debug_083C0DA4[] = _("Preview"); @@ -277,10 +278,10 @@ static const u8 gUnknown_Debug_083C0DB8[] = _("ID rnd. digit"); static const u8 gUnknown_Debug_083C0DC6[] = _("Type"); static const u8 gUnknown_Debug_083C0DCB[] = _("Poké Art"); -static const struct MenuAction gUnknown_Debug_083C0DD4[] = { - {gUnknown_Debug_083C0DAC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C0DB8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C0DC6, TomomichiDebugMenu_Config}, +static const struct MenuAction sMenuActions_PreviewPicTest[] = { + {gUnknown_Debug_083C0DAC, Config}, + {gUnknown_Debug_083C0DB8, Config}, + {gUnknown_Debug_083C0DC6, Config}, {gUnknown_Debug_083C0DCB, debug_sub_808ECA4} }; @@ -289,7 +290,7 @@ static const u8 gUnknown_Debug_083C0DF4[] = _("Trick related"); static const u8 gUnknown_Debug_083C0E02[] = _("Level"); static const u8 gUnknown_Debug_083C0E08[] = _("Trick Master"); -static const struct MenuAction gUnknown_Debug_083C0E15[] = { +static const struct MenuAction sMenuActions_TrickRelated[] = { {gUnknown_Debug_083C0E02, debug_sub_808EB58}, {gUnknown_Debug_083C0E08, debug_sub_808EBB4} }; @@ -378,7 +379,7 @@ static const struct MenuAction gUnknown_Debug_083C0FFC[] = { static const u8 gUnknown_Debug_083C102C[] = _("ANSWORK みかんせい"); static const struct MenuAction gUnknown_Debug_083C103A[] = { - {gUnknown_Debug_083C102C, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C102C, Config} }; static const u8 gUnknown_Debug_083C1044[] = _("FHーOBJ00ー08"); @@ -400,15 +401,15 @@ static const u8 gUnknown_Debug_083C10AB[] = _("FHーOBJ07"); static const u8 gUnknown_Debug_083C10B4[] = _("FHーOBJ08"); static const struct MenuAction gUnknown_Debug_083C10BD[] = { - {gUnknown_Debug_083C106C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1075, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C107E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1087, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1090, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1099, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C10A2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C10AB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C10B4, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C106C, Config}, + {gUnknown_Debug_083C1075, Config}, + {gUnknown_Debug_083C107E, Config}, + {gUnknown_Debug_083C1087, Config}, + {gUnknown_Debug_083C1090, Config}, + {gUnknown_Debug_083C1099, Config}, + {gUnknown_Debug_083C10A2, Config}, + {gUnknown_Debug_083C10AB, Config}, + {gUnknown_Debug_083C10B4, Config} }; static const u8 gUnknown_Debug_083C1108[] = _("FH-OBJ09"); @@ -422,15 +423,15 @@ static const u8 gUnknown_Debug_083C1147[] = _(""); static const u8 gUnknown_Debug_083C1148[] = _(""); static const struct MenuAction gUnknown_Debug_083C1149[] = { - {gUnknown_Debug_083C1108, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1111, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C111A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1123, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C112C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1135, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C113E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1147, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1148, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1108, Config}, + {gUnknown_Debug_083C1111, Config}, + {gUnknown_Debug_083C111A, Config}, + {gUnknown_Debug_083C1123, Config}, + {gUnknown_Debug_083C112C, Config}, + {gUnknown_Debug_083C1135, Config}, + {gUnknown_Debug_083C113E, Config}, + {gUnknown_Debug_083C1147, Config}, + {gUnknown_Debug_083C1148, Config} }; static const u8 gUnknown_Debug_083C1194[] = {9, 7}; @@ -459,15 +460,15 @@ static const u8 gUnknown_Debug_083C1206[] = _("FH-07"); static const u8 gUnknown_Debug_083C120C[] = _("FH-08"); static const struct MenuAction gUnknown_Debug_083C1212[] = { - {gUnknown_Debug_083C11DC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C11E2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C11E8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C11EE, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C11F4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C11FA, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1200, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1206, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C120C, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C11DC, Config}, + {gUnknown_Debug_083C11E2, Config}, + {gUnknown_Debug_083C11E8, Config}, + {gUnknown_Debug_083C11EE, Config}, + {gUnknown_Debug_083C11F4, Config}, + {gUnknown_Debug_083C11FA, Config}, + {gUnknown_Debug_083C1200, Config}, + {gUnknown_Debug_083C1206, Config}, + {gUnknown_Debug_083C120C, Config} }; static const u8 gUnknown_Debug_083C125C[] = _("FHー09"); @@ -481,15 +482,15 @@ static const u8 gUnknown_Debug_083C1286[] = _(""); static const u8 gUnknown_Debug_083C1287[] = _(""); static const struct MenuAction gUnknown_Debug_083C1288[] = { - {gUnknown_Debug_083C125C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1262, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1268, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C126E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1274, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C127A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1280, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1286, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1287, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C125C, Config}, + {gUnknown_Debug_083C1262, Config}, + {gUnknown_Debug_083C1268, Config}, + {gUnknown_Debug_083C126E, Config}, + {gUnknown_Debug_083C1274, Config}, + {gUnknown_Debug_083C127A, Config}, + {gUnknown_Debug_083C1280, Config}, + {gUnknown_Debug_083C1286, Config}, + {gUnknown_Debug_083C1287, Config} }; static const u8 gUnknown_Debug_083C12D0[] = {9, 7}; @@ -531,14 +532,14 @@ static const u8 gUnknown_Debug_083C13C0[] = _("BATCH07ーGET"); static const u8 gUnknown_Debug_083C13CC[] = _("BATCH08ーGET"); static const struct MenuAction gUnknown_Debug_083C13D8[] = { - {gUnknown_Debug_083C1378, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1384, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1390, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C139C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C13A8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C13B4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C13C0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C13CC, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1378, Config}, + {gUnknown_Debug_083C1384, Config}, + {gUnknown_Debug_083C1390, Config}, + {gUnknown_Debug_083C139C, Config}, + {gUnknown_Debug_083C13A8, Config}, + {gUnknown_Debug_083C13B4, Config}, + {gUnknown_Debug_083C13C0, Config}, + {gUnknown_Debug_083C13CC, Config} }; static const u8 gUnknown_Debug_083C1418[] = _("T101ARRIVE"); @@ -550,13 +551,13 @@ static const u8 gUnknown_Debug_083C144F[] = _("T106ARRIVE"); static const u8 gUnknown_Debug_083C145A[] = _("T107ARRIVE"); static const struct MenuAction gUnknown_Debug_083C1465[] = { - {gUnknown_Debug_083C1418, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1423, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C142E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1439, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1444, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C144F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C145A, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1418, Config}, + {gUnknown_Debug_083C1423, Config}, + {gUnknown_Debug_083C142E, Config}, + {gUnknown_Debug_083C1439, Config}, + {gUnknown_Debug_083C1444, Config}, + {gUnknown_Debug_083C144F, Config}, + {gUnknown_Debug_083C145A, Config} }; static const u8 gUnknown_Debug_083C14A0[] = _("C101ARRIVE"); @@ -570,15 +571,15 @@ static const u8 gUnknown_Debug_083C14ED[] = _("C108ARRIVE"); static const u8 gUnknown_Debug_083C14F8[] = _("C109ARRIVE"); static const struct MenuAction gUnknown_Debug_083C1503[] = { - {gUnknown_Debug_083C14A0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C14AB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C14B6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C14C1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C14CC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C14D7, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C14E2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C14ED, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C14F8, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C14A0, Config}, + {gUnknown_Debug_083C14AB, Config}, + {gUnknown_Debug_083C14B6, Config}, + {gUnknown_Debug_083C14C1, Config}, + {gUnknown_Debug_083C14CC, Config}, + {gUnknown_Debug_083C14D7, Config}, + {gUnknown_Debug_083C14E2, Config}, + {gUnknown_Debug_083C14ED, Config}, + {gUnknown_Debug_083C14F8, Config} }; static const u8 gUnknown_Debug_083C154C[] = _("SYSーPOKEMONーGET"); @@ -587,10 +588,10 @@ static const u8 gUnknown_Debug_083C156A[] = _("SYSーPOKEGEARーGET"); static const u8 gUnknown_Debug_083C157B[] = _("SYSーRIBBONーGET"); static const struct MenuAction gUnknown_Debug_083C158A[] = { - {gUnknown_Debug_083C154C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C155C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C156A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C157B, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C154C, Config}, + {gUnknown_Debug_083C155C, Config}, + {gUnknown_Debug_083C156A, Config}, + {gUnknown_Debug_083C157B, Config} }; static const u8 gUnknown_Debug_083C15AC[] = _("SYSーGAMEーCLEAR"); @@ -604,15 +605,15 @@ static const u8 gUnknown_Debug_083C1627[] = _("SYSーSAFARIーMODE"); static const u8 gUnknown_Debug_083C1637[] = _("SYSーCRUISEーMODE"); static const struct MenuAction gUnknown_Debug_083C1647[] = { - {gUnknown_Debug_083C15AC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C15BB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C15CA, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C15DD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C15F0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1605, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1616, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1627, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1637, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C15AC, Config}, + {gUnknown_Debug_083C15BB, Config}, + {gUnknown_Debug_083C15CA, Config}, + {gUnknown_Debug_083C15DD, Config}, + {gUnknown_Debug_083C15F0, Config}, + {gUnknown_Debug_083C1605, Config}, + {gUnknown_Debug_083C1616, Config}, + {gUnknown_Debug_083C1627, Config}, + {gUnknown_Debug_083C1637, Config} }; static const u8 gUnknown_Debug_083C1690[] = _("SYSーTVーHOME"); @@ -626,15 +627,15 @@ static const u8 gUnknown_Debug_083C16F2[] = _("SYSーCAVEーWONDER"); static const u8 gUnknown_Debug_083C1702[] = _("SYSーCAVEーBATTLE"); static const struct MenuAction gUnknown_Debug_083C1712[] = { - {gUnknown_Debug_083C1690, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C169C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C16A9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C16B5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C16C7, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C16D6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C16E4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C16F2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1702, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1690, Config}, + {gUnknown_Debug_083C169C, Config}, + {gUnknown_Debug_083C16A9, Config}, + {gUnknown_Debug_083C16B5, Config}, + {gUnknown_Debug_083C16C7, Config}, + {gUnknown_Debug_083C16D6, Config}, + {gUnknown_Debug_083C16E4, Config}, + {gUnknown_Debug_083C16F2, Config}, + {gUnknown_Debug_083C1702, Config} }; static const u8 gUnknown_Debug_083C175C[] = _("SYSーSPECIALーZUKAN"); @@ -648,15 +649,15 @@ static const u8 gUnknown_Debug_083C17D4[] = _("SYSーTENJIーWAIT"); static const u8 gUnknown_Debug_083C17E3[] = _("SYSーTENJIーSORAWOTOBU"); static const struct MenuAction gUnknown_Debug_083C17F8[] = { - {gUnknown_Debug_083C175C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C176E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C177D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C178C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C179C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C17AE, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C17C2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C17D4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C17E3, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C175C, Config}, + {gUnknown_Debug_083C176E, Config}, + {gUnknown_Debug_083C177D, Config}, + {gUnknown_Debug_083C178C, Config}, + {gUnknown_Debug_083C179C, Config}, + {gUnknown_Debug_083C17AE, Config}, + {gUnknown_Debug_083C17C2, Config}, + {gUnknown_Debug_083C17D4, Config}, + {gUnknown_Debug_083C17E3, Config} }; static const u8 gUnknown_Debug_083C1840[] = _("SYSーENCーUPーITEM"); @@ -670,15 +671,15 @@ static const u8 gUnknown_Debug_083C18B4[] = _(""); static const u8 gUnknown_Debug_083C18B5[] = _(""); static const struct MenuAction gUnknown_Debug_083C18B8[] = { - {gUnknown_Debug_083C1840, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1850, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1862, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1873, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1886, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1895, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C18A0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C18B4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C18B5, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1840, Config}, + {gUnknown_Debug_083C1850, Config}, + {gUnknown_Debug_083C1862, Config}, + {gUnknown_Debug_083C1873, Config}, + {gUnknown_Debug_083C1886, Config}, + {gUnknown_Debug_083C1895, Config}, + {gUnknown_Debug_083C18A0, Config}, + {gUnknown_Debug_083C18B4, Config}, + {gUnknown_Debug_083C18B5, Config} }; static const u8 gUnknown_Debug_083C1900[] = _("SYSーARRIVEーSUBMARINECAVE"); @@ -692,15 +693,15 @@ static const u8 gUnknown_Debug_083C196F[] = _(""); static const u8 gUnknown_Debug_083C1970[] = _(""); static const struct MenuAction gDebug_0x83C1974[] = { - {gUnknown_Debug_083C1900, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1919, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1930, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1942, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1954, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C196D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C196E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C196F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1970, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1900, Config}, + {gUnknown_Debug_083C1919, Config}, + {gUnknown_Debug_083C1930, Config}, + {gUnknown_Debug_083C1942, Config}, + {gUnknown_Debug_083C1954, Config}, + {gUnknown_Debug_083C196D, Config}, + {gUnknown_Debug_083C196E, Config}, + {gUnknown_Debug_083C196F, Config}, + {gUnknown_Debug_083C1970, Config} }; static const u8 gUnknown_Debug_083C19BC[] = {8, 7, 9, 4, 9, 9, 9, 7, 5}; @@ -727,8 +728,8 @@ static const u8 gUnknown_Debug_083C1A80[] = _("FVーBALL1ー78"); static const u8 gUnknown_Debug_083C1A8C[] = _("FVーBALL1ー133"); static const struct MenuAction gUnknown_Debug_083C1A9C[] = { - {gUnknown_Debug_083C1A80, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1A8C, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1A80, Config}, + {gUnknown_Debug_083C1A8C, Config} }; static const u8 gUnknown_Debug_083C1AAC[] = {2}; @@ -757,14 +758,14 @@ static const u8 gUnknown_Debug_083C1B5A[] = _("FTーGYMー07ーLEADER"); static const u8 gUnknown_Debug_083C1B6B[] = _("FTーGYMー08ーLEADER"); static const struct MenuAction gUnknown_Debug_083C1B7C[] = { - {gUnknown_Debug_083C1AF4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1B05, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1B16, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1B27, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1B38, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1B49, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1B5A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1B6B, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1AF4, Config}, + {gUnknown_Debug_083C1B05, Config}, + {gUnknown_Debug_083C1B16, Config}, + {gUnknown_Debug_083C1B27, Config}, + {gUnknown_Debug_083C1B38, Config}, + {gUnknown_Debug_083C1B49, Config}, + {gUnknown_Debug_083C1B5A, Config}, + {gUnknown_Debug_083C1B6B, Config} }; static const u8 gUnknown_Debug_083C1BBC[] = _("FTーSHITENー01"); @@ -773,16 +774,16 @@ static const u8 gUnknown_Debug_083C1BD6[] = _("FTーSHITENー03"); static const u8 gUnknown_Debug_083C1BE3[] = _("FTーSHITENー04"); static const struct MenuAction gUnknown_Debug_083C1BF0[] = { - {gUnknown_Debug_083C1BBC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1BC9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1BD6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1BE3, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1BBC, Config}, + {gUnknown_Debug_083C1BC9, Config}, + {gUnknown_Debug_083C1BD6, Config}, + {gUnknown_Debug_083C1BE3, Config} }; static const u8 gUnknown_Debug_083C1C10[] = _("FTーMITSURUー01ーCAVEーD1301"); static const struct MenuAction gUnknown_Debug_083C1C2C[] = { - {gUnknown_Debug_083C1C10, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1C10, Config} }; static const u8 gUnknown_Debug_083C1C34[] = {8, 4, 1}; @@ -825,15 +826,15 @@ static const u8 gUnknown_Debug_083C1DDB[] = _("FVーKAKUREー01ーFIELDーR119") static const u8 gUnknown_Debug_083C1DF3[] = _("FVーKAKUREー02ーFIELDーR119"); static const struct MenuAction gUnknown_Debug_083C1E0C[] = { - {gUnknown_Debug_083C1D30, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1D4B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1D63, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1D7B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1D93, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1DAB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1DC3, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1DDB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1DF3, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1D30, Config}, + {gUnknown_Debug_083C1D4B, Config}, + {gUnknown_Debug_083C1D63, Config}, + {gUnknown_Debug_083C1D7B, Config}, + {gUnknown_Debug_083C1D93, Config}, + {gUnknown_Debug_083C1DAB, Config}, + {gUnknown_Debug_083C1DC3, Config}, + {gUnknown_Debug_083C1DDB, Config}, + {gUnknown_Debug_083C1DF3, Config} }; static const u8 gUnknown_Debug_083C1E54[] = _("FVーBALLー01ーC107ーR0501"); @@ -847,15 +848,15 @@ static const u8 gUnknown_Debug_083C1F01[] = _("FVーSUPPORTWー01ーT101ーR0202 static const u8 gUnknown_Debug_083C1F1B[] = _("FVーSUPPORTMー01ーT101ーR0102"); static const struct MenuAction gUnknown_Debug_083C1F38[] = { - {gUnknown_Debug_083C1E54, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1E6A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1E84, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1E9F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1EB7, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1ED1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1EEB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1F01, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1F1B, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1E54, Config}, + {gUnknown_Debug_083C1E6A, Config}, + {gUnknown_Debug_083C1E84, Config}, + {gUnknown_Debug_083C1E9F, Config}, + {gUnknown_Debug_083C1EB7, Config}, + {gUnknown_Debug_083C1ED1, Config}, + {gUnknown_Debug_083C1EEB, Config}, + {gUnknown_Debug_083C1F01, Config}, + {gUnknown_Debug_083C1F1B, Config} }; static const u8 gUnknown_Debug_083C1F80[] = _("FVーODAMAKIー01ーFIELDーR101"); @@ -869,15 +870,15 @@ static const u8 gUnknown_Debug_083C2038[] = _("FVーFIGHTERー01ーT106ーR0201" static const u8 gUnknown_Debug_083C2051[] = _("FVーFIGHTERー01ーFIELDーR116"); static const struct MenuAction gUnknown_Debug_083C206C[] = { - {gUnknown_Debug_083C1F80, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1F99, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1FB2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1FCE, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C1FEA, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2006, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C201F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2038, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2051, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C1F80, Config}, + {gUnknown_Debug_083C1F99, Config}, + {gUnknown_Debug_083C1FB2, Config}, + {gUnknown_Debug_083C1FCE, Config}, + {gUnknown_Debug_083C1FEA, Config}, + {gUnknown_Debug_083C2006, Config}, + {gUnknown_Debug_083C201F, Config}, + {gUnknown_Debug_083C2038, Config}, + {gUnknown_Debug_083C2051, Config} }; static const u8 gUnknown_Debug_083C20B4[] = _("FVーMITSURUー01ーFIELDーC101"); @@ -891,15 +892,15 @@ static const u8 gUnknown_Debug_083C2163[] = _("FVーTENKIー01ーR119ーR101"); static const u8 gUnknown_Debug_083C2179[] = _("FVーTENKIー01ーR119ーR102"); static const struct MenuAction gUnknown_Debug_083C2190[] = { - {gUnknown_Debug_083C20B4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C20CD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C20E6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C20FF, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2118, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2131, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C214A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2163, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2179, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C20B4, Config}, + {gUnknown_Debug_083C20CD, Config}, + {gUnknown_Debug_083C20E6, Config}, + {gUnknown_Debug_083C20FF, Config}, + {gUnknown_Debug_083C2118, Config}, + {gUnknown_Debug_083C2131, Config}, + {gUnknown_Debug_083C214A, Config}, + {gUnknown_Debug_083C2163, Config}, + {gUnknown_Debug_083C2179, Config} }; static const u8 gUnknown_Debug_083C21D8[] = _("FVーDAIGOー01ーCAVEーD0504"); @@ -910,12 +911,12 @@ static const u8 gUnknown_Debug_083C2234[] = _("FVーDAIGOー01ーFIELDーR120"); static const u8 gUnknown_Debug_083C224B[] = _("FVーDAIGOー01ーFIELDーR108"); static const struct MenuAction gUnknown_Debug_083C2264[] = { - {gUnknown_Debug_083C21D8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C21EF, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2206, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C221D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2234, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C224B, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C21D8, Config}, + {gUnknown_Debug_083C21EF, Config}, + {gUnknown_Debug_083C2206, Config}, + {gUnknown_Debug_083C221D, Config}, + {gUnknown_Debug_083C2234, Config}, + {gUnknown_Debug_083C224B, Config} }; static const u8 gUnknown_Debug_083C2294[] = _("FVーPOKE1ー02ーCAVEーD1111"); @@ -929,15 +930,15 @@ static const u8 gUnknown_Debug_083C233D[] = _("FVーPOKEMONー01ーCAVEーD0201" static const u8 gUnknown_Debug_083C2356[] = _("FVーPOKEMONー01ーR104ーR0101"); static const struct MenuAction gUnknown_Debug_083C2370[] = { - {gUnknown_Debug_083C2294, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C22AB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C22C2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C22D9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C22F0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C230B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2326, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C233D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2356, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C2294, Config}, + {gUnknown_Debug_083C22AB, Config}, + {gUnknown_Debug_083C22C2, Config}, + {gUnknown_Debug_083C22D9, Config}, + {gUnknown_Debug_083C22F0, Config}, + {gUnknown_Debug_083C230B, Config}, + {gUnknown_Debug_083C2326, Config}, + {gUnknown_Debug_083C233D, Config}, + {gUnknown_Debug_083C2356, Config} }; static const u8 gUnknown_Debug_083C23B8[] = _("FVーMAMAー01ーFIELDーT101"); @@ -951,15 +952,15 @@ static const u8 gUnknown_Debug_083C2459[] = _("FVーSUPPORTー02ーFIELDーR119" static const u8 gUnknown_Debug_083C2472[] = _("FVーSUPPORTー02ーFIELDーT104"); static const struct MenuAction gUnknown_Debug_083C248C[] = { - {gUnknown_Debug_083C23B8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C23CE, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C23E8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C23FE, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2414, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C242A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2440, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2459, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2472, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C23B8, Config}, + {gUnknown_Debug_083C23CE, Config}, + {gUnknown_Debug_083C23E8, Config}, + {gUnknown_Debug_083C23FE, Config}, + {gUnknown_Debug_083C2414, Config}, + {gUnknown_Debug_083C242A, Config}, + {gUnknown_Debug_083C2440, Config}, + {gUnknown_Debug_083C2459, Config}, + {gUnknown_Debug_083C2472, Config} }; static const u8 gUnknown_Debug_083C24D4[] = _("FVーHAGIー01ーFIELDーR104"); @@ -973,15 +974,15 @@ static const u8 gUnknown_Debug_083C256E[] = _("FVーHAGIー01ーFIELDーR116"); static const u8 gUnknown_Debug_083C2584[] = _("FVーHAGIー01ーSPーSHIP01"); static const struct MenuAction gUnknown_Debug_083C259C[] = { - {gUnknown_Debug_083C24D4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C24EA, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2500, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2516, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C252C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2542, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2558, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C256E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2584, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C24D4, Config}, + {gUnknown_Debug_083C24EA, Config}, + {gUnknown_Debug_083C2500, Config}, + {gUnknown_Debug_083C2516, Config}, + {gUnknown_Debug_083C252C, Config}, + {gUnknown_Debug_083C2542, Config}, + {gUnknown_Debug_083C2558, Config}, + {gUnknown_Debug_083C256E, Config}, + {gUnknown_Debug_083C2584, Config} }; static const u8 gUnknown_Debug_083C25E4[] = _("FVーSUPPORTー01ーT101ーR0301"); @@ -995,15 +996,15 @@ static const u8 gUnknown_Debug_083C2693[] = _("FVーSUPPORTー01ーFIELDーT104" static const u8 gUnknown_Debug_083C26AC[] = _("FVーSUPPORTー01ーFIELDーT102"); static const struct MenuAction gUnknown_Debug_083C26C8[] = { - {gUnknown_Debug_083C25E4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C25FD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2616, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C262F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2648, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2661, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C267A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2693, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C26AC, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C25E4, Config}, + {gUnknown_Debug_083C25FD, Config}, + {gUnknown_Debug_083C2616, Config}, + {gUnknown_Debug_083C262F, Config}, + {gUnknown_Debug_083C2648, Config}, + {gUnknown_Debug_083C2661, Config}, + {gUnknown_Debug_083C267A, Config}, + {gUnknown_Debug_083C2693, Config}, + {gUnknown_Debug_083C26AC, Config} }; static const u8 gUnknown_Debug_083C2710[] = {9, 9, 9, 9, 6, 9, 9, 9, 9}; @@ -1053,15 +1054,15 @@ static const u8 gUnknown_Debug_083C2909[] = _("FEーDEBONー01ーFIELDーC104"); static const u8 gUnknown_Debug_083C2920[] = _("FEーDEBONー02ーFIELDーC104"); static const struct MenuAction gUnknown_Debug_083C2938[] = { - {gUnknown_Debug_083C2870, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C287F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2897, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C28A6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C28BF, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C28D8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C28F1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2909, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2920, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C2870, Config}, + {gUnknown_Debug_083C287F, Config}, + {gUnknown_Debug_083C2897, Config}, + {gUnknown_Debug_083C28A6, Config}, + {gUnknown_Debug_083C28BF, Config}, + {gUnknown_Debug_083C28D8, Config}, + {gUnknown_Debug_083C28F1, Config}, + {gUnknown_Debug_083C2909, Config}, + {gUnknown_Debug_083C2920, Config} }; static const u8 gUnknown_Debug_083C2980[] = _("FEーCYCLEー01ーP01ーP01ーC103ーR0201"); @@ -1075,15 +1076,15 @@ static const u8 gUnknown_Debug_083C2A21[] = _("FEーIITURIZAOーGET"); static const u8 gUnknown_Debug_083C2A32[] = _("FEーSUGOITURIZAOーGET"); static const struct MenuAction gUnknown_Debug_083C2A48[] = { - {gUnknown_Debug_083C2980, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C299F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C29BA, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C29D4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C29EE, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C29FC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2A0C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2A21, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2A32, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C2980, Config}, + {gUnknown_Debug_083C299F, Config}, + {gUnknown_Debug_083C29BA, Config}, + {gUnknown_Debug_083C29D4, Config}, + {gUnknown_Debug_083C29EE, Config}, + {gUnknown_Debug_083C29FC, Config}, + {gUnknown_Debug_083C2A0C, Config}, + {gUnknown_Debug_083C2A21, Config}, + {gUnknown_Debug_083C2A32, Config} }; static const u8 gUnknown_Debug_083C2A90[] = _("FEーBOSSー01ーCAVEーD0701"); @@ -1097,15 +1098,15 @@ static const u8 gUnknown_Debug_083C2B27[] = _("FEーKASEKIーRETURN"); static const u8 gUnknown_Debug_083C2B38[] = _("FEーWINー01ーSPーSHIP01"); static const struct MenuAction gUnknown_Debug_083C2B4C[] = { - {gUnknown_Debug_083C2A90, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2AA6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2AB8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2ACF, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2AE6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2AFB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2B0F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2B27, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2B38, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C2A90, Config}, + {gUnknown_Debug_083C2AA6, Config}, + {gUnknown_Debug_083C2AB8, Config}, + {gUnknown_Debug_083C2ACF, Config}, + {gUnknown_Debug_083C2AE6, Config}, + {gUnknown_Debug_083C2AFB, Config}, + {gUnknown_Debug_083C2B0F, Config}, + {gUnknown_Debug_083C2B27, Config}, + {gUnknown_Debug_083C2B38, Config} }; static const u8 gUnknown_Debug_083C2B94[] = _("FEーMITSURUー01ーT106ーR0201"); @@ -1119,15 +1120,15 @@ static const u8 gUnknown_Debug_083C2C47[] = _("FEーDOORーOPENー04ーCAVEーD1 static const u8 gUnknown_Debug_083C2C62[] = _("FEーDOORーOPENー06ーCAVEーD1712"); static const struct MenuAction gUnknown_Debug_083C2C80[] = { - {gUnknown_Debug_083C2B94, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2BAD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2BC6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2BDF, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2BF8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2C11, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2C2C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2C47, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2C62, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C2B94, Config}, + {gUnknown_Debug_083C2BAD, Config}, + {gUnknown_Debug_083C2BC6, Config}, + {gUnknown_Debug_083C2BDF, Config}, + {gUnknown_Debug_083C2BF8, Config}, + {gUnknown_Debug_083C2C11, Config}, + {gUnknown_Debug_083C2C2C, Config}, + {gUnknown_Debug_083C2C47, Config}, + {gUnknown_Debug_083C2C62, Config} }; static const u8 gUnknown_Debug_083C2CC8[] = _("FEーKARAKURI10ーSWITCHー01"); @@ -1141,15 +1142,15 @@ static const u8 gUnknown_Debug_083C2D66[] = _("FEーGYM07ーSWITCHー03"); static const u8 gUnknown_Debug_083C2D79[] = _("FEーGYM07ーSWITCHー04"); static const struct MenuAction gUnknown_Debug_083C2D8C[] = { - {gUnknown_Debug_083C2CC8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2CE0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2CF8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2D10, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2D28, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2D40, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2D53, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2D66, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2D79, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C2CC8, Config}, + {gUnknown_Debug_083C2CE0, Config}, + {gUnknown_Debug_083C2CF8, Config}, + {gUnknown_Debug_083C2D10, Config}, + {gUnknown_Debug_083C2D28, Config}, + {gUnknown_Debug_083C2D40, Config}, + {gUnknown_Debug_083C2D53, Config}, + {gUnknown_Debug_083C2D66, Config}, + {gUnknown_Debug_083C2D79, Config} }; static const u8 gUnknown_Debug_083C2DD4[] = _("FEーSUPPORTー01ーFIELDーR103"); @@ -1163,15 +1164,15 @@ static const u8 gUnknown_Debug_083C2E78[] = _("FEーODAMAKIー01ーP01ーT101ー static const u8 gUnknown_Debug_083C2E93[] = _("FEーPAPAー01ーP01ーC101ーR0201"); static const struct MenuAction gUnknown_Debug_083C2EB0[] = { - {gUnknown_Debug_083C2DD4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2DED, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2E06, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2E1F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2E38, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2E51, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2E6B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2E78, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2E93, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C2DD4, Config}, + {gUnknown_Debug_083C2DED, Config}, + {gUnknown_Debug_083C2E06, Config}, + {gUnknown_Debug_083C2E1F, Config}, + {gUnknown_Debug_083C2E38, Config}, + {gUnknown_Debug_083C2E51, Config}, + {gUnknown_Debug_083C2E6B, Config}, + {gUnknown_Debug_083C2E78, Config}, + {gUnknown_Debug_083C2E93, Config} }; static const u8 gUnknown_Debug_083C2EF8[] = _("FEーDAISUKIーGOODSーFLAG01"); @@ -1185,15 +1186,15 @@ static const u8 gUnknown_Debug_083C2FA8[] = _("FEーBALLー01ーP01ーSPーCONTE static const u8 gUnknown_Debug_083C2FC2[] = _("FEーWOMAN2ー01ーP01ーT101ーR0201"); static const struct MenuAction gUnknown_Debug_083C2FE0[] = { - {gUnknown_Debug_083C2EF8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2F10, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2F28, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2F40, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2F58, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2F70, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2F8C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2FA8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C2FC2, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C2EF8, Config}, + {gUnknown_Debug_083C2F10, Config}, + {gUnknown_Debug_083C2F28, Config}, + {gUnknown_Debug_083C2F40, Config}, + {gUnknown_Debug_083C2F58, Config}, + {gUnknown_Debug_083C2F70, Config}, + {gUnknown_Debug_083C2F8C, Config}, + {gUnknown_Debug_083C2FA8, Config}, + {gUnknown_Debug_083C2FC2, Config} }; static const u8 gUnknown_Debug_083C3028[] = _("FEーSOUKOーOPENーCAVEーD1704"); @@ -1207,15 +1208,15 @@ static const u8 gUnknown_Debug_083C30D9[] = _("FEーDASHーSHOESーGET"); static const u8 gUnknown_Debug_083C30EB[] = _("FEーDEBONSUKOOPUーGET"); static const struct MenuAction gUnknown_Debug_083C3100[] = { - {gUnknown_Debug_083C3028, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3041, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C305A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3073, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C308D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C30A8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C30C3, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C30D9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C30EB, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3028, Config}, + {gUnknown_Debug_083C3041, Config}, + {gUnknown_Debug_083C305A, Config}, + {gUnknown_Debug_083C3073, Config}, + {gUnknown_Debug_083C308D, Config}, + {gUnknown_Debug_083C30A8, Config}, + {gUnknown_Debug_083C30C3, Config}, + {gUnknown_Debug_083C30D9, Config}, + {gUnknown_Debug_083C30EB, Config} }; static const u8 gUnknown_Debug_083C3148[] = _("FEーSTUDYM1ー01ーP01ーT101R0301"); @@ -1229,15 +1230,15 @@ static const u8 gUnknown_Debug_083C3191[] = _(""); static const u8 gUnknown_Debug_083C3192[] = _(""); static const struct MenuAction gUnknown_Debug_083C3194[] = { - {gUnknown_Debug_083C3148, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3164, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C317E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C318D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C318E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C318F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3190, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3191, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3192, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3148, Config}, + {gUnknown_Debug_083C3164, Config}, + {gUnknown_Debug_083C317E, Config}, + {gUnknown_Debug_083C318D, Config}, + {gUnknown_Debug_083C318E, Config}, + {gUnknown_Debug_083C318F, Config}, + {gUnknown_Debug_083C3190, Config}, + {gUnknown_Debug_083C3191, Config}, + {gUnknown_Debug_083C3192, Config} }; static const u8 gUnknown_Debug_083C31DC[] = {9, 9, 9, 9, 9, 9, 9, 9, 3}; @@ -1299,43 +1300,43 @@ static const u8 gUnknown_Debug_083C345E[] = _("WKーPOKELOTーRND2"); static const u8 gUnknown_Debug_083C346E[] = _("WKーBASEーMAPNO"); static const struct MenuAction gUnknown_Debug_083C347C[] = { - {gUnknown_Debug_083C32D4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C32E6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C32FA, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C32D4, Config}, + {gUnknown_Debug_083C32E6, Config}, + {gUnknown_Debug_083C32FA, Config} }; static const struct MenuAction gUnknown_Debug_083C3494[] = { - {gUnknown_Debug_083C330E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3325, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C330E, Config}, + {gUnknown_Debug_083C3325, Config} }; static const struct MenuAction gUnknown_Debug_083C34A4[] = { - {gUnknown_Debug_083C333A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3349, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3356, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C336A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C337A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3391, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C333A, Config}, + {gUnknown_Debug_083C3349, Config}, + {gUnknown_Debug_083C3356, Config}, + {gUnknown_Debug_083C336A, Config}, + {gUnknown_Debug_083C337A, Config}, + {gUnknown_Debug_083C3391, Config} }; static const struct MenuAction gUnknown_Debug_083C34D4[] = { - {gUnknown_Debug_083C33A6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C33B6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C33C4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C33D5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C33E6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C33F6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3401, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C340C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C341E, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C33A6, Config}, + {gUnknown_Debug_083C33B6, Config}, + {gUnknown_Debug_083C33C4, Config}, + {gUnknown_Debug_083C33D5, Config}, + {gUnknown_Debug_083C33E6, Config}, + {gUnknown_Debug_083C33F6, Config}, + {gUnknown_Debug_083C3401, Config}, + {gUnknown_Debug_083C340C, Config}, + {gUnknown_Debug_083C341E, Config} }; static const struct MenuAction gUnknown_Debug_083C351C[] = { - {gUnknown_Debug_083C342F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C343F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C344E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C345E, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C346E, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C342F, Config}, + {gUnknown_Debug_083C343F, Config}, + {gUnknown_Debug_083C344E, Config}, + {gUnknown_Debug_083C345E, Config}, + {gUnknown_Debug_083C346E, Config} }; static const u8 gUnknown_Debug_083C3544[] = {3, 2, 6, 9, 5}; @@ -1375,25 +1376,25 @@ static const u8 gUnknown_Debug_083C3681[] = _("OBJCHRWORK15"); static const u8 gUnknown_Debug_083C368E[] = _("OBJCHRWORK16"); static const struct MenuAction gUnknown_Debug_083C369C[] = { - {gUnknown_Debug_083C35D4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C35E0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C35EC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C35F8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3604, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3610, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C361C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3628, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3634, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C35D4, Config}, + {gUnknown_Debug_083C35E0, Config}, + {gUnknown_Debug_083C35EC, Config}, + {gUnknown_Debug_083C35F8, Config}, + {gUnknown_Debug_083C3604, Config}, + {gUnknown_Debug_083C3610, Config}, + {gUnknown_Debug_083C361C, Config}, + {gUnknown_Debug_083C3628, Config}, + {gUnknown_Debug_083C3634, Config} }; static const struct MenuAction gUnknown_Debug_083C36E4[] = { - {gUnknown_Debug_083C3640, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C364D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C365A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3667, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3674, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3681, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C368E, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3640, Config}, + {gUnknown_Debug_083C364D, Config}, + {gUnknown_Debug_083C365A, Config}, + {gUnknown_Debug_083C3667, Config}, + {gUnknown_Debug_083C3674, Config}, + {gUnknown_Debug_083C3681, Config}, + {gUnknown_Debug_083C368E, Config} }; static const u8 gUnknown_Debug_083C371C[] = {9, 7}; @@ -1480,74 +1481,74 @@ static const u8 gUnknown_Debug_083C3A9D[] = _(""); static const u8 gUnknown_Debug_083C3A9E[] = _(""); static const struct MenuAction gUnknown_Debug_083C3AA0[] = { - {gUnknown_Debug_083C37AC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C37C0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C37CF, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C37E5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C37FD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3811, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3824, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3825, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C37AC, Config}, + {gUnknown_Debug_083C37C0, Config}, + {gUnknown_Debug_083C37CF, Config}, + {gUnknown_Debug_083C37E5, Config}, + {gUnknown_Debug_083C37FD, Config}, + {gUnknown_Debug_083C3811, Config}, + {gUnknown_Debug_083C3824, Config}, + {gUnknown_Debug_083C3825, Config} }; static const struct MenuAction gUnknown_Debug_83C3AE0[] = { - {gUnknown_Debug_083C3827, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C383B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C384F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3863, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3875, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3885, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3886, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3887, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3888, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3827, Config}, + {gUnknown_Debug_083C383B, Config}, + {gUnknown_Debug_083C384F, Config}, + {gUnknown_Debug_083C3863, Config}, + {gUnknown_Debug_083C3875, Config}, + {gUnknown_Debug_083C3885, Config}, + {gUnknown_Debug_083C3886, Config}, + {gUnknown_Debug_083C3887, Config}, + {gUnknown_Debug_083C3888, Config} }; static const struct MenuAction gUnknown_Debug_83C3B28[] = { - {gUnknown_Debug_083C3889, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C389D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C38B1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C38C5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C38D9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C38ED, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3901, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3915, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3929, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3889, Config}, + {gUnknown_Debug_083C389D, Config}, + {gUnknown_Debug_083C38B1, Config}, + {gUnknown_Debug_083C38C5, Config}, + {gUnknown_Debug_083C38D9, Config}, + {gUnknown_Debug_083C38ED, Config}, + {gUnknown_Debug_083C3901, Config}, + {gUnknown_Debug_083C3915, Config}, + {gUnknown_Debug_083C3929, Config} }; static const struct MenuAction gUnknown_Debug_83C3B70[] = { - {gUnknown_Debug_083C3940, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3954, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3968, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3969, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C396A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C396B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C396C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C396D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C396E, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3940, Config}, + {gUnknown_Debug_083C3954, Config}, + {gUnknown_Debug_083C3968, Config}, + {gUnknown_Debug_083C3969, Config}, + {gUnknown_Debug_083C396A, Config}, + {gUnknown_Debug_083C396B, Config}, + {gUnknown_Debug_083C396C, Config}, + {gUnknown_Debug_083C396D, Config}, + {gUnknown_Debug_083C396E, Config} }; static const struct MenuAction gUnknown_Debug_83C3BB8[] = { - {gUnknown_Debug_083C396F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3984, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3997, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C39A9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C39BC, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C39D3, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C39E8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C39F9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A0E, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C396F, Config}, + {gUnknown_Debug_083C3984, Config}, + {gUnknown_Debug_083C3997, Config}, + {gUnknown_Debug_083C39A9, Config}, + {gUnknown_Debug_083C39BC, Config}, + {gUnknown_Debug_083C39D3, Config}, + {gUnknown_Debug_083C39E8, Config}, + {gUnknown_Debug_083C39F9, Config}, + {gUnknown_Debug_083C3A0E, Config} }; static const struct MenuAction gUnknown_Debug_83C3C00[] = { - {gUnknown_Debug_083C3A22, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A36, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A4D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A65, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A7B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A8D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A9C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A9D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3A9E, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3A22, Config}, + {gUnknown_Debug_083C3A36, Config}, + {gUnknown_Debug_083C3A4D, Config}, + {gUnknown_Debug_083C3A65, Config}, + {gUnknown_Debug_083C3A7B, Config}, + {gUnknown_Debug_083C3A8D, Config}, + {gUnknown_Debug_083C3A9C, Config}, + {gUnknown_Debug_083C3A9D, Config}, + {gUnknown_Debug_083C3A9E, Config} }; static const u8 gUnknown_Debug_083C3C48[] = {6, 5, 9, 2, 9, 6}; @@ -1668,104 +1669,104 @@ static const u8 gUnknown_Debug_083C4301[] = _("WKーSCENEーCAVEーD0101"); static const u8 gUnknown_Debug_083C4315[] = _("WKーSCENEーCAVEーD1301"); static const struct MenuAction gUnknown_Debug_083C432C[] = { - {gUnknown_Debug_083C3D50, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3D64, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3D78, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3D8C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3DA0, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3DAE, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3DC2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3DD6, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3D50, Config}, + {gUnknown_Debug_083C3D64, Config}, + {gUnknown_Debug_083C3D78, Config}, + {gUnknown_Debug_083C3D8C, Config}, + {gUnknown_Debug_083C3DA0, Config}, + {gUnknown_Debug_083C3DAE, Config}, + {gUnknown_Debug_083C3DC2, Config}, + {gUnknown_Debug_083C3DD6, Config} }; static const struct MenuAction gUnknown_Debug_083C436C[] = { - {gUnknown_Debug_083C3DED, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3E01, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3E15, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3E29, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3E3D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3E51, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3E65, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3E79, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3E8D, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3DED, Config}, + {gUnknown_Debug_083C3E01, Config}, + {gUnknown_Debug_083C3E15, Config}, + {gUnknown_Debug_083C3E29, Config}, + {gUnknown_Debug_083C3E3D, Config}, + {gUnknown_Debug_083C3E51, Config}, + {gUnknown_Debug_083C3E65, Config}, + {gUnknown_Debug_083C3E79, Config}, + {gUnknown_Debug_083C3E8D, Config} }; static const struct MenuAction gUnknown_Debug_083C43B4[] = { - {gUnknown_Debug_083C3EA1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3EB5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3EC9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3EDD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3EF1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3F05, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3F19, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3F2D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3F41, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3EA1, Config}, + {gUnknown_Debug_083C3EB5, Config}, + {gUnknown_Debug_083C3EC9, Config}, + {gUnknown_Debug_083C3EDD, Config}, + {gUnknown_Debug_083C3EF1, Config}, + {gUnknown_Debug_083C3F05, Config}, + {gUnknown_Debug_083C3F19, Config}, + {gUnknown_Debug_083C3F2D, Config}, + {gUnknown_Debug_083C3F41, Config} }; static const struct MenuAction gUnknown_Debug_083C43FC[] = { - {gUnknown_Debug_083C3F55, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3F69, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3F7D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3F91, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3FA5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3FB9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3FCD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3FE1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C3FF5, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C3F55, Config}, + {gUnknown_Debug_083C3F69, Config}, + {gUnknown_Debug_083C3F7D, Config}, + {gUnknown_Debug_083C3F91, Config}, + {gUnknown_Debug_083C3FA5, Config}, + {gUnknown_Debug_083C3FB9, Config}, + {gUnknown_Debug_083C3FCD, Config}, + {gUnknown_Debug_083C3FE1, Config}, + {gUnknown_Debug_083C3FF5, Config} }; static const struct MenuAction gUnknown_Debug_083C4444[] = { - {gUnknown_Debug_083C4009, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C401D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4031, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4045, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4059, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C406D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4081, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4095, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C40A9, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C4009, Config}, + {gUnknown_Debug_083C401D, Config}, + {gUnknown_Debug_083C4031, Config}, + {gUnknown_Debug_083C4045, Config}, + {gUnknown_Debug_083C4059, Config}, + {gUnknown_Debug_083C406D, Config}, + {gUnknown_Debug_083C4081, Config}, + {gUnknown_Debug_083C4095, Config}, + {gUnknown_Debug_083C40A9, Config} }; static const struct MenuAction gUnknown_Debug_083C448C[] = { - {gUnknown_Debug_083C40BD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C40D1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C40E5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C40F9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C410D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4121, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4135, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C40BD, Config}, + {gUnknown_Debug_083C40D1, Config}, + {gUnknown_Debug_083C40E5, Config}, + {gUnknown_Debug_083C40F9, Config}, + {gUnknown_Debug_083C410D, Config}, + {gUnknown_Debug_083C4121, Config}, + {gUnknown_Debug_083C4135, Config} }; static const struct MenuAction gUnknown_Debug_83C44C4[] = { - {gUnknown_Debug_083C4149, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C415D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4171, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4185, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4199, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C4149, Config}, + {gUnknown_Debug_083C415D, Config}, + {gUnknown_Debug_083C4171, Config}, + {gUnknown_Debug_083C4185, Config}, + {gUnknown_Debug_083C4199, Config} }; static const struct MenuAction gUnknown_Debug_83C44EC[] = { - {gUnknown_Debug_083C41C1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C41D5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C41E9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C41FD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4211, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4225, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4239, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C424D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4261, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C41C1, Config}, + {gUnknown_Debug_083C41D5, Config}, + {gUnknown_Debug_083C41E9, Config}, + {gUnknown_Debug_083C41FD, Config}, + {gUnknown_Debug_083C4211, Config}, + {gUnknown_Debug_083C4225, Config}, + {gUnknown_Debug_083C4239, Config}, + {gUnknown_Debug_083C424D, Config}, + {gUnknown_Debug_083C4261, Config} }; static const struct MenuAction gUnknown_Debug_083C4534[] = { - {gUnknown_Debug_083C4275, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4289, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C429D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C42B1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C42C5, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C42D9, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C42ED, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4301, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4315, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C4275, Config}, + {gUnknown_Debug_083C4289, Config}, + {gUnknown_Debug_083C429D, Config}, + {gUnknown_Debug_083C42B1, Config}, + {gUnknown_Debug_083C42C5, Config}, + {gUnknown_Debug_083C42D9, Config}, + {gUnknown_Debug_083C42ED, Config}, + {gUnknown_Debug_083C4301, Config}, + {gUnknown_Debug_083C4315, Config} }; static const u8 gUnknown_Debug_083C457C[] = {8, 9, 9, 9, 9, 7, 6, 9, 9}; @@ -1809,25 +1810,25 @@ static const u8 gUnknown_Debug_083C46F2[] = _("LOCALWORK14"); static const u8 gUnknown_Debug_083C46FE[] = _("LOCALWORK15"); static const struct MenuAction gUnknown_Debug_083C470C[] = { - {gUnknown_Debug_083C4654, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C465F, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C466A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4675, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4680, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C468B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4696, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C46A1, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C46AC, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C4654, Config}, + {gUnknown_Debug_083C465F, Config}, + {gUnknown_Debug_083C466A, Config}, + {gUnknown_Debug_083C4675, Config}, + {gUnknown_Debug_083C4680, Config}, + {gUnknown_Debug_083C468B, Config}, + {gUnknown_Debug_083C4696, Config}, + {gUnknown_Debug_083C46A1, Config}, + {gUnknown_Debug_083C46AC, Config} }; static const struct MenuAction gUnknown_Debug_083C4754C[] = { - {gUnknown_Debug_083C46B7, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C46C2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C46CE, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C46DA, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C46E6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C46F2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C46FE, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C46B7, Config}, + {gUnknown_Debug_083C46C2, Config}, + {gUnknown_Debug_083C46CE, Config}, + {gUnknown_Debug_083C46DA, Config}, + {gUnknown_Debug_083C46E6, Config}, + {gUnknown_Debug_083C46F2, Config}, + {gUnknown_Debug_083C46FE, Config} }; static const u8 gUnknown_Debug_083C478C[] = {9, 7}; @@ -1848,17 +1849,18 @@ static const u8 gUnknown_Debug_083C47E2[] = _("Scene7"); static const u8 gUnknown_Debug_083C47E9[] = _("Scene8"); static const struct MenuAction gUnknown_Debug_083C47F0[] = { - {gUnknown_Debug_083C47B8, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C47BF, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C47C6, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C47CD, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C47D4, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C47DB, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C47E2, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C47E9, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C47B8, Config}, + {gUnknown_Debug_083C47BF, Config}, + {gUnknown_Debug_083C47C6, Config}, + {gUnknown_Debug_083C47CD, Config}, + {gUnknown_Debug_083C47D4, Config}, + {gUnknown_Debug_083C47DB, Config}, + {gUnknown_Debug_083C47E2, Config}, + {gUnknown_Debug_083C47E9, Config} }; static const u8 gUnknown_Debug_083C4830[] = _("Trick Master"); + static const u8 gUnknown_Debug_083C483D[] = _("Hidden MASTER"); static const u8 gUnknown_Debug_083C484B[] = _("Inside the HOUSE"); static const u8 gUnknown_Debug_083C485C[] = _("Pass a reward"); @@ -1866,15 +1868,15 @@ static const u8 gUnknown_Debug_083C486A[] = _("Rig a trick"); static const u8 gUnknown_Debug_083C4876[] = _("MASTER is gone"); static const struct MenuAction gUnknown_Debug_083C4888[] = { - {gUnknown_Debug_083C483D, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C484B, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C485C, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C486A, TomomichiDebugMenu_Config}, - {gUnknown_Debug_083C4876, TomomichiDebugMenu_Config} + {gUnknown_Debug_083C483D, Config}, + {gUnknown_Debug_083C484B, Config}, + {gUnknown_Debug_083C485C, Config}, + {gUnknown_Debug_083C486A, Config}, + {gUnknown_Debug_083C4876, Config} }; -static const u8 gUnknown_Debug_083C48B0[] = _("PMNICKNAME"); -static const u8 gUnknown_Debug_083C48BB[] = _("BREEDER"); +static const u8 sDummyNickname[] = _("PMNICKNAME"); +static const u8 sDummyTrainerName[] = _("BREEDER"); bool8 InitTomomichiDebugWindow(void) { @@ -1892,7 +1894,7 @@ static bool8 debug_sub_808B874(void) Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 13, 15); Menu_PrintItems(1, 1, ARRAY_COUNT(gUnknown_Debug_083C0CBA), gUnknown_Debug_083C0CBA); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0CBA), gDebug_0300071D, 12); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0CBA), sTopMenuCursorPos, 12); gMenuCallback = debug_sub_808B8C8; return FALSE; } @@ -1902,17 +1904,17 @@ static bool8 debug_sub_808B8C8(void) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - gDebug_0300071D = Menu_MoveCursor(-1); + sTopMenuCursorPos = Menu_MoveCursor(-1); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gDebug_0300071D = Menu_MoveCursor(+1); + sTopMenuCursorPos = Menu_MoveCursor(+1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0CBA[gDebug_0300071D].func(); + return gUnknown_Debug_083C0CBA[sTopMenuCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -1922,88 +1924,88 @@ static bool8 debug_sub_808B8C8(void) return FALSE; } -static bool8 TomomichiDebugMenu_ContestGraphics(void) +static bool8 ContestGraphics(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 20, 11); - Menu_PrintText(gUnknown_Debug_083C0CF4, 1, 1); - Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C0D2C), gUnknown_Debug_083C0D2C); - InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C0D2C), 0, 19); + Menu_PrintText(sString_ContestMenuTitle, 1, 1); + Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_ContestPicTest), sMenuActions_ContestPicTest); + InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_ContestPicTest), 0, 19); gMenuCallback = debug_sub_808BC48; - gDebug_03000700 = 1; - gDebug_03000704 = 0x6f33; - gDebug_03000708 = 0; - gDebug_0300070C = 1; + sPicTest_Species = SPECIES_BULBASAUR; + sPicTest_ContestEntryVar4 = 0x6f33; + sPicTest_IDrndDigit = 0; + sPicTest_ContestType = 1; return FALSE; } -static bool8 TomomichiDebugMenu_ArtMusGraphics(void) +static bool8 ArtMusGraphics(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 20, 11); - Menu_PrintText(gUnknown_Debug_083C0D4C, 1, 1); - Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C0D83), gUnknown_Debug_083C0D83); - InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C0D83), 0, 19); + Menu_PrintText(sString_Contest_ArtMuseumTitle, 1, 1); + Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_ArtMuseumPicTest), sMenuActions_ArtMuseumPicTest); + InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_ArtMuseumPicTest), 0, 19); gMenuCallback = debug_sub_808BCBC; - gDebug_03000700 = 1; - gDebug_03000704 = 0x6f33; - gDebug_03000708 = 0; - gDebug_0300070D = 1; + sPicTest_Species = SPECIES_BULBASAUR; + sPicTest_ContestEntryVar4 = 0x6f33; + sPicTest_IDrndDigit = 0; + sPicTest_MuseumArtTitleType = 1; return FALSE; } -static bool8 TomomichiDebugMenu_PreviewData(void) +static bool8 PreviewData(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 20, 11); Menu_PrintText(gUnknown_Debug_083C0DA4, 1, 1); - Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C0DD4), gUnknown_Debug_083C0DD4); - InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C0DD4), 0, 19); - gMenuCallback = debug_sub_808BD30; - gDebug_03000700 = 1; - gDebug_03000704 = 0x6f33; - gDebug_03000708 = 0; - gDebug_0300070E = 1; + Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_PreviewPicTest), sMenuActions_PreviewPicTest); + InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_PreviewPicTest), 0, 19); + gMenuCallback = PreviewData_HandleInput; + sPicTest_Species = SPECIES_BULBASAUR; + sPicTest_ContestEntryVar4 = 0x6f33; + sPicTest_IDrndDigit = 0; + sPicTest_PreviewType = 1; return FALSE; } -static bool8 TomomichiDebugMenu_TrickHouse(void) +static bool8 TrickHouse(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 7); Menu_PrintText(gUnknown_Debug_083C0DF4, 1, 1); - Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C0E15), gUnknown_Debug_083C0E15); - InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C0E15), gDebug_0300071E, 23); + Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_TrickRelated), sMenuActions_TrickRelated); + InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_TrickRelated), sTrickRelatedMenuCursorPos, 23); gMenuCallback = debug_sub_808BDA4; return FALSE; } -static bool8 TomomichiDebugMenu_ControlEvents(void) +static bool8 ControlEvents(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 5); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0E32), gUnknown_Debug_083C0E32); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0E32), gDebug_0300071F, 23); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0E32), sControlEventsCursorPos, 23); gMenuCallback = debug_sub_808BE2C; return FALSE; } -static bool8 TomomichiDebugMenu_ControlFlags(void) +static bool8 ControlFlags(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 15); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0E7F), gUnknown_Debug_083C0E7F); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0E7F), gDebug_03000720, 23); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0E7F), sControlFlagsCursorPos, 23); gMenuCallback = debug_sub_808BEB4; return FALSE; } -static bool8 TomomichiDebugMenu_ControlWorks(void) +static bool8 ControlWorks(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 13); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0EF1), gUnknown_Debug_083C0EF1); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0EF1), gDebug_03000721, 23); + InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0EF1), sControlWORKCursorPos, 23); gMenuCallback = debug_sub_808BF3C; return FALSE; } @@ -2016,16 +2018,16 @@ static bool8 debug_sub_808BC48(void) switch (cursorPos) { case 0: - debug_sub_808ED0C(); + PicTest_SelectPokemon(); break; case 1: - debug_sub_808ED9C(); + PicTest_SelectIDrndDigit(); break; case 2: - debug_sub_808EE3C(); + ContestPicTest_SelectContestType(); break; } - debug_sub_808EF8C(0); + PicTest_Redraw(0); if (input == -2) return FALSE; if (input == -1) @@ -2035,7 +2037,7 @@ static bool8 debug_sub_808BC48(void) } if (input == 3) { - gMenuCallback = gUnknown_Debug_083C0D2C[3].func; + gMenuCallback = sMenuActions_ContestPicTest[3].func; return FALSE; } return FALSE; @@ -2049,16 +2051,16 @@ static bool8 debug_sub_808BCBC(void) switch (cursorPos) { case 0: - debug_sub_808ED0C(); + PicTest_SelectPokemon(); break; case 1: - debug_sub_808ED9C(); + PicTest_SelectIDrndDigit(); break; case 2: - debug_sub_808EE9C(); + MuseumArtPicTest_SelectTitleType(); break; } - debug_sub_808EF8C(1); + PicTest_Redraw(1); if (input == -2) return FALSE; if (input == -1) @@ -2068,13 +2070,13 @@ static bool8 debug_sub_808BCBC(void) } if (input == 3) { - gMenuCallback = gUnknown_Debug_083C0D83[3].func; + gMenuCallback = sMenuActions_ArtMuseumPicTest[3].func; return FALSE; } return FALSE; } -static bool8 debug_sub_808BD30(void) +static bool8 PreviewData_HandleInput(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2082,16 +2084,16 @@ static bool8 debug_sub_808BD30(void) switch (cursorPos) { case 0: - debug_sub_808ED0C(); + PicTest_SelectPokemon(); break; case 1: - debug_sub_808ED9C(); + PicTest_SelectIDrndDigit(); break; case 2: - debug_sub_808EF14(); + PreviewPicTest_SelectType(); break; } - debug_sub_808EF8C(2); + PicTest_Redraw(2); if (input == -2) return FALSE; if (input == -1) @@ -2101,7 +2103,7 @@ static bool8 debug_sub_808BD30(void) } if (input == 3) { - gMenuCallback = gUnknown_Debug_083C0DD4[3].func; + gMenuCallback = sMenuActions_PreviewPicTest[3].func; return FALSE; } return FALSE; @@ -2112,17 +2114,17 @@ static bool8 debug_sub_808BDA4(void) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - gDebug_0300071E = Menu_MoveCursor(-1); + sTrickRelatedMenuCursorPos = Menu_MoveCursor(-1); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gDebug_0300071E = Menu_MoveCursor(+1); + sTrickRelatedMenuCursorPos = Menu_MoveCursor(+1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0E15[gDebug_0300071E].func(); + return sMenuActions_TrickRelated[sTrickRelatedMenuCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -2137,17 +2139,17 @@ static bool8 debug_sub_808BE2C(void) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - gDebug_0300071F = Menu_MoveCursor(-1); + sControlEventsCursorPos = Menu_MoveCursor(-1); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gDebug_0300071F = Menu_MoveCursor(+1); + sControlEventsCursorPos = Menu_MoveCursor(+1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0E32[gDebug_0300071F].func(); + return gUnknown_Debug_083C0E32[sControlEventsCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -2162,17 +2164,17 @@ static bool8 debug_sub_808BEB4(void) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - gDebug_03000720 = Menu_MoveCursor(-1); + sControlFlagsCursorPos = Menu_MoveCursor(-1); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gDebug_03000720 = Menu_MoveCursor(+1); + sControlFlagsCursorPos = Menu_MoveCursor(+1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0E7F[gDebug_03000720].func(); + return gUnknown_Debug_083C0E7F[sControlFlagsCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -2187,17 +2189,17 @@ static bool8 debug_sub_808BF3C(void) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - gDebug_03000721 = Menu_MoveCursor(-1); + sControlWORKCursorPos = Menu_MoveCursor(-1); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gDebug_03000721 = Menu_MoveCursor(+1); + sControlWORKCursorPos = Menu_MoveCursor(+1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0EF1[gDebug_03000721].func(); + return gUnknown_Debug_083C0EF1[sControlWORKCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -2362,7 +2364,7 @@ static bool8 debug_sub_808C23C(void) return TRUE; } -static bool8 TomomichiDebugMenu_ContestGraphics_Show(void) +static bool8 ContestGraphics_Show(void) { BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); gMenuCallback = debug_sub_808C280; @@ -2374,7 +2376,7 @@ static bool8 debug_sub_808C280(void) if (!UpdatePaletteFade()) { CloseMenu(); - debug_sub_808F168(0); + PrepareDebugOverlayBeforeShowingContestPainting(0); SetMainCallback2(CB2_ContestPainting); gMain.savedCallback = debug_sub_808B868; return TRUE; @@ -2382,7 +2384,7 @@ static bool8 debug_sub_808C280(void) return FALSE; } -static bool8 TomomichiDebugMenu_MuseumGraphics_Show(void) +static bool8 MuseumGraphics_Show(void) { BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); gMenuCallback = debug_sub_808C2E4; @@ -2394,7 +2396,7 @@ static bool8 debug_sub_808C2E4(void) if (!UpdatePaletteFade()) { CloseMenu(); - debug_sub_808F168(1); + PrepareDebugOverlayBeforeShowingContestPainting(1); SetMainCallback2(CB2_ContestPainting); gMain.savedCallback = debug_sub_808B868; return TRUE; @@ -2433,7 +2435,7 @@ static bool8 debug_sub_808C3B0(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2938) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2938), gUnknown_Debug_083C2938); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2938), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2444,7 +2446,7 @@ static bool8 debug_sub_808C408(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2A48) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2A48), gUnknown_Debug_083C2A48); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2A48), 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2455,7 +2457,7 @@ static bool8 debug_sub_808C460(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2B4C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2B4C), gUnknown_Debug_083C2B4C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2B4C), 0, 28); - gDebug_0300070F = 2; + sFlagAndVarTest_WhichSubmenu = 2; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2466,7 +2468,7 @@ static bool8 debug_sub_808C4B8(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2C80) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2C80), gUnknown_Debug_083C2C80); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2C80), 0, 28); - gDebug_0300070F = 3; + sFlagAndVarTest_WhichSubmenu = 3; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2477,7 +2479,7 @@ static bool8 debug_sub_808C510(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2D8C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2D8C), gUnknown_Debug_083C2D8C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2D8C), 0, 28); - gDebug_0300070F = 4; + sFlagAndVarTest_WhichSubmenu = 4; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2488,7 +2490,7 @@ static bool8 debug_sub_808C568(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2EB0) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2EB0), gUnknown_Debug_083C2EB0); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2EB0), 0, 28); - gDebug_0300070F = 5; + sFlagAndVarTest_WhichSubmenu = 5; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2499,7 +2501,7 @@ static bool8 debug_sub_808C5C0(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2FE0) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2FE0), gUnknown_Debug_083C2FE0); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2FE0), 0, 28); - gDebug_0300070F = 6; + sFlagAndVarTest_WhichSubmenu = 6; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2510,7 +2512,7 @@ static bool8 debug_sub_808C618(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C3100) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3100), gUnknown_Debug_083C3100); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3100), 0, 28); - gDebug_0300070F = 7; + sFlagAndVarTest_WhichSubmenu = 7; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2521,7 +2523,7 @@ static bool8 debug_sub_808C670(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 3 + 1); Menu_PrintItems(2, 1, 3, gUnknown_Debug_083C3194); InitMenu(0, 1, 1, 3, 0, 28); - gDebug_0300070F = 8; + sFlagAndVarTest_WhichSubmenu = 8; gMenuCallback = debug_sub_808C6C8; return FALSE; } @@ -2531,8 +2533,8 @@ static bool8 debug_sub_808C6C8(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808C714(gDebug_0300070F, cursorPos); - debug_sub_808C764(gDebug_0300070F); + debug_sub_808C714(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808C764(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -2560,7 +2562,7 @@ static void debug_sub_808C764(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C31DC[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_83C31E6[whichMenu][i]) ? 1 : 0); + PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_83C31E6[whichMenu][i]) ? 1 : 0); } } @@ -2595,7 +2597,7 @@ static bool8 debug_sub_808C85C(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1E0C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1E0C), gUnknown_Debug_083C1E0C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1E0C), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2606,7 +2608,7 @@ static bool8 debug_sub_808C8B4(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1F38) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1F38), gUnknown_Debug_083C1F38); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1F38), 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2617,7 +2619,7 @@ static bool8 debug_sub_808C90C(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C206C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C206C), gUnknown_Debug_083C206C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C206C), 0, 28); - gDebug_0300070F = 2; + sFlagAndVarTest_WhichSubmenu = 2; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2628,7 +2630,7 @@ static bool8 debug_sub_808C964(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2190) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2190), gUnknown_Debug_083C2190); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2190), 0, 28); - gDebug_0300070F = 3; + sFlagAndVarTest_WhichSubmenu = 3; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2639,7 +2641,7 @@ static bool8 debug_sub_808C9BC(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2264) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2264), gUnknown_Debug_083C2264); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2264), 0, 28); - gDebug_0300070F = 4; + sFlagAndVarTest_WhichSubmenu = 4; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2650,7 +2652,7 @@ static bool8 debug_sub_808CA14(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2370) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2370), gUnknown_Debug_083C2370); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2370), 0, 28); - gDebug_0300070F = 5; + sFlagAndVarTest_WhichSubmenu = 5; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2661,7 +2663,7 @@ static bool8 debug_sub_808CA6C(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C248C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C248C), gUnknown_Debug_083C248C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C248C), 0, 28); - gDebug_0300070F = 6; + sFlagAndVarTest_WhichSubmenu = 6; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2672,7 +2674,7 @@ static bool8 debug_sub_808CAC4(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C259C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C259C), gUnknown_Debug_083C259C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C259C), 0, 27); - gDebug_0300070F = 7; + sFlagAndVarTest_WhichSubmenu = 7; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2683,7 +2685,7 @@ static bool8 debug_sub_808CB1C(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C26C8) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C26C8), gUnknown_Debug_083C26C8); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C26C8), 0, 28); - gDebug_0300070F = 8; + sFlagAndVarTest_WhichSubmenu = 8; gMenuCallback = debug_sub_808CB74; return FALSE; } @@ -2693,8 +2695,8 @@ static bool8 debug_sub_808CB74(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808CBC0(gDebug_0300070F, cursorPos); - debug_sub_808CC10(gDebug_0300070F); + debug_sub_808CBC0(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808CC10(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -2722,7 +2724,7 @@ static void debug_sub_808CC10(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C2710[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C271A[whichMenu][i]) ? 1 : 0); + PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C271A[whichMenu][i]) ? 1 : 0); } } @@ -2757,7 +2759,7 @@ static bool8 debug_sub_808CD08(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1B7C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1B7C), gUnknown_Debug_083C1B7C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1B7C), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808CE10; return FALSE; } @@ -2768,7 +2770,7 @@ static bool8 debug_sub_808CD60(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1BF0) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1BF0), gUnknown_Debug_083C1BF0); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1BF0), 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808CE10; return FALSE; } @@ -2779,7 +2781,7 @@ static bool8 debug_sub_808CDB8(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1C2C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1C2C), gUnknown_Debug_083C1C2C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1C2C), 0, 28); - gDebug_0300070F = 2; + sFlagAndVarTest_WhichSubmenu = 2; gMenuCallback = debug_sub_808CE10; return FALSE; } @@ -2789,8 +2791,8 @@ static bool8 debug_sub_808CE10(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808CE5C(gDebug_0300070F, cursorPos); - debug_sub_808CEAC(gDebug_0300070F); + debug_sub_808CE5C(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808CEAC(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -2818,7 +2820,7 @@ static void debug_sub_808CEAC(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C1C34[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1C38[whichMenu][i]) ? 1 : 0); + PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1C38[whichMenu][i]) ? 1 : 0); } } @@ -2853,7 +2855,7 @@ static bool8 debug_sub_808CFA4(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C13D8) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C13D8), gUnknown_Debug_083C13D8); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C13D8), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2864,7 +2866,7 @@ static bool8 debug_sub_808CFFC(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1465) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1465), gUnknown_Debug_083C1465); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1465), 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2875,7 +2877,7 @@ static bool8 debug_sub_808D054(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1503) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1503), gUnknown_Debug_083C1503); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1503), 0, 28); - gDebug_0300070F = 2; + sFlagAndVarTest_WhichSubmenu = 2; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2886,7 +2888,7 @@ static bool8 debug_sub_808D0AC(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C158A) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C158A), gUnknown_Debug_083C158A); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C158A), 0, 28); - gDebug_0300070F = 3; + sFlagAndVarTest_WhichSubmenu = 3; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2897,7 +2899,7 @@ static bool8 debug_sub_808D104(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1647) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1647), gUnknown_Debug_083C1647); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1647), 0, 28); - gDebug_0300070F = 4; + sFlagAndVarTest_WhichSubmenu = 4; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2908,7 +2910,7 @@ static bool8 debug_sub_808D15C(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1712) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1712), gUnknown_Debug_083C1712); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1712), 0, 28); - gDebug_0300070F = 5; + sFlagAndVarTest_WhichSubmenu = 5; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2919,7 +2921,7 @@ static bool8 debug_sub_808D1B4(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C17F8) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C17F8), gUnknown_Debug_083C17F8); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C17F8), 0, 28); - gDebug_0300070F = 6; + sFlagAndVarTest_WhichSubmenu = 6; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2930,7 +2932,7 @@ static bool8 debug_sub_808D20C(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C18B8); InitMenu(0, 1, 1, 7, 0, 28); - gDebug_0300070F = 7; + sFlagAndVarTest_WhichSubmenu = 7; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2941,7 +2943,7 @@ static bool8 debug_sub_808D264(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1); Menu_PrintItems(2, 1, 5, gDebug_0x83C1974); InitMenu(0, 1, 1, 5, 0, 28); - gDebug_0300070F = 8; + sFlagAndVarTest_WhichSubmenu = 8; gMenuCallback = debug_sub_808D2BC; return FALSE; } @@ -2951,8 +2953,8 @@ static bool8 debug_sub_808D2BC(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808D308(gDebug_0300070F, cursorPos); - debug_sub_808D358(gDebug_0300070F); + debug_sub_808D308(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808D358(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -2980,7 +2982,7 @@ static void debug_sub_808D358(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C19BC[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C19C6[whichMenu][i]) ? 1 : 0); + PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C19C6[whichMenu][i]) ? 1 : 0); } } @@ -3015,7 +3017,7 @@ static bool8 debug_sub_808D450(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C10BD) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C10BD), gUnknown_Debug_083C10BD); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C10BD), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808D500; return FALSE; } @@ -3026,7 +3028,7 @@ static bool8 debug_sub_808D4A8(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C1149); InitMenu(0, 1, 1, 7, 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808D500; return FALSE; } @@ -3036,8 +3038,8 @@ static bool8 debug_sub_808D500(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808D54C(gDebug_0300070F, cursorPos); - debug_sub_808D59C(gDebug_0300070F); + debug_sub_808D54C(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808D59C(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3065,7 +3067,7 @@ static void debug_sub_808D59C(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C1194[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1196[whichMenu][i]) ? 1 : 0); + PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1196[whichMenu][i]) ? 1 : 0); } } @@ -3100,7 +3102,7 @@ static bool8 debug_sub_808D694(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1212) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1212), gUnknown_Debug_083C1212); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1212), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808D744; return FALSE; } @@ -3111,7 +3113,7 @@ static bool8 debug_sub_808D6EC(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C1288); InitMenu(0, 1, 1, 7, 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808D744; return FALSE; } @@ -3121,8 +3123,8 @@ static bool8 debug_sub_808D744(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808D790(gDebug_0300070F, cursorPos); - debug_sub_808D7E0(gDebug_0300070F); + debug_sub_808D790(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808D7E0(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3150,7 +3152,7 @@ static void debug_sub_808D7E0(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C12D0[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C12D2[whichMenu][i]) ? 1 : 0); + PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C12D2[whichMenu][i]) ? 1 : 0); } } @@ -3185,7 +3187,7 @@ static bool8 debug_sub_808D8D8(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1A9C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1A9C), gUnknown_Debug_083C1A9C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1A9C), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808D930; return FALSE; } @@ -3195,8 +3197,8 @@ static bool8 debug_sub_808D930(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808D97C(gDebug_0300070F, cursorPos); - debug_sub_808D9CC(gDebug_0300070F); + debug_sub_808D97C(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808D9CC(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3224,7 +3226,7 @@ static void debug_sub_808D9CC(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C1AAC[whichMenu]; i++) { - debug_sub_808F2E0(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1AAE[whichMenu][i]) ? 1 : 0); + PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1AAE[whichMenu][i]) ? 1 : 0); } } @@ -3257,7 +3259,7 @@ static bool8 debug_sub_808DA80(void) static void debug_sub_808DABC(void) { - debug_sub_808F31C(24, 1, gSpecialVar_Result); + PrintUnsignedShort(24, 1, gSpecialVar_Result); } static void debug_sub_808DAD4(void) @@ -3308,7 +3310,7 @@ static bool8 debug_sub_808DBA0(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C432C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C432C), gUnknown_Debug_083C432C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C432C), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3319,7 +3321,7 @@ static bool8 debug_sub_808DBF8(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C436C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C436C), gUnknown_Debug_083C436C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C436C), 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3330,7 +3332,7 @@ static bool8 debug_sub_808DC50(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C43B4) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C43B4), gUnknown_Debug_083C43B4); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C43B4), 0, 28); - gDebug_0300070F = 2; + sFlagAndVarTest_WhichSubmenu = 2; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3341,7 +3343,7 @@ static bool8 debug_sub_808DCA8(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C43FC) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C43FC), gUnknown_Debug_083C43FC); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C43FC), 0, 28); - gDebug_0300070F = 3; + sFlagAndVarTest_WhichSubmenu = 3; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3352,7 +3354,7 @@ static bool8 debug_sub_808DD00(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4444) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4444), gUnknown_Debug_083C4444); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4444), 0, 28); - gDebug_0300070F = 4; + sFlagAndVarTest_WhichSubmenu = 4; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3363,7 +3365,7 @@ static bool8 debug_sub_808DD58(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C448C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C448C), gUnknown_Debug_083C448C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C448C), 0, 28); - gDebug_0300070F = 5; + sFlagAndVarTest_WhichSubmenu = 5; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3374,7 +3376,7 @@ static bool8 debug_sub_808DDB0(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); Menu_PrintItems(2, 1, 6, gUnknown_Debug_83C44C4); // overflows into the next menu InitMenu(0, 1, 1, 6, 0, 28); - gDebug_0300070F = 6; + sFlagAndVarTest_WhichSubmenu = 6; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3385,7 +3387,7 @@ static bool8 debug_sub_808DE08(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C44EC) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C44EC), gUnknown_Debug_83C44EC); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C44EC), 0, 28); - gDebug_0300070F = 7; + sFlagAndVarTest_WhichSubmenu = 7; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3396,7 +3398,7 @@ static bool8 debug_sub_808DE60(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4534) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4534), gUnknown_Debug_083C4534); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4534), 0, 28); - gDebug_0300070F = 8; + sFlagAndVarTest_WhichSubmenu = 8; gMenuCallback = debug_sub_808DEB8; return FALSE; } @@ -3406,8 +3408,8 @@ static bool8 debug_sub_808DEB8(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808DF64(gDebug_0300070F, cursorPos); - debug_sub_808DF04(gDebug_0300070F); + debug_sub_808DF64(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808DF04(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3424,7 +3426,7 @@ static void debug_sub_808DF04(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C457C[whichMenu]; i++) { - debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_083C4586[whichMenu][i])); + PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C4586[whichMenu][i])); } } @@ -3472,7 +3474,7 @@ static bool8 debug_sub_808E054(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); Menu_PrintItems(2, 1, 6, gUnknown_Debug_083C3AA0); InitMenu(0, 1, 1, 6, 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808E264; return FALSE; } @@ -3483,7 +3485,7 @@ static bool8 debug_sub_808E0AC(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1); Menu_PrintItems(2, 1, 5, gUnknown_Debug_83C3AE0); InitMenu(0, 1, 1, 5, 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808E264; return FALSE; } @@ -3494,7 +3496,7 @@ static bool8 debug_sub_808E104(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3B28) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C3B28), gUnknown_Debug_83C3B28); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C3B28), 0, 28); - gDebug_0300070F = 2; + sFlagAndVarTest_WhichSubmenu = 2; gMenuCallback = debug_sub_808E264; return FALSE; } @@ -3505,7 +3507,7 @@ static bool8 debug_sub_808E15C(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 2 + 1); Menu_PrintItems(2, 1, 2, gUnknown_Debug_83C3B70); InitMenu(0, 1, 1, 2, 0, 28); - gDebug_0300070F = 3; + sFlagAndVarTest_WhichSubmenu = 3; gMenuCallback = debug_sub_808E264; return FALSE; } @@ -3516,7 +3518,7 @@ static bool8 debug_sub_808E1B4(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3BB8) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C3BB8), gUnknown_Debug_83C3BB8); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C3BB8), 0, 28); - gDebug_0300070F = 4; + sFlagAndVarTest_WhichSubmenu = 4; gMenuCallback = debug_sub_808E264; return FALSE; } @@ -3527,7 +3529,7 @@ static bool8 debug_sub_808E20C(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); Menu_PrintItems(2, 1, 6, gUnknown_Debug_83C3C00); InitMenu(0, 1, 1, 6, 0, 28); - gDebug_0300070F = 5; + sFlagAndVarTest_WhichSubmenu = 5; gMenuCallback = debug_sub_808E264; return FALSE; } @@ -3537,8 +3539,8 @@ static bool8 debug_sub_808E264(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808E310(gDebug_0300070F, cursorPos); - debug_sub_808E2B0(gDebug_0300070F); + debug_sub_808E310(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808E2B0(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3555,7 +3557,7 @@ static void debug_sub_808E2B0(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C3C48[whichMenu]; i++) { - debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_83C3C4E[whichMenu][i])); + PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_83C3C4E[whichMenu][i])); } } @@ -3603,7 +3605,7 @@ static bool8 debug_sub_808E400(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C347C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C347C), gUnknown_Debug_083C347C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C347C), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808E5B8; return FALSE; } @@ -3614,7 +3616,7 @@ static bool8 debug_sub_808E458(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C3494) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3494), gUnknown_Debug_083C3494); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3494), 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808E5B8; return FALSE; } @@ -3625,7 +3627,7 @@ static bool8 debug_sub_808E4B0(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C34A4) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C34A4), gUnknown_Debug_083C34A4); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C34A4), 0, 28); - gDebug_0300070F = 2; + sFlagAndVarTest_WhichSubmenu = 2; gMenuCallback = debug_sub_808E5B8; return FALSE; } @@ -3636,7 +3638,7 @@ static bool8 debug_sub_808E508(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C34D4) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C34D4), gUnknown_Debug_083C34D4); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C34D4), 0, 28); - gDebug_0300070F = 3; + sFlagAndVarTest_WhichSubmenu = 3; gMenuCallback = debug_sub_808E5B8; return FALSE; } @@ -3647,7 +3649,7 @@ static bool8 debug_sub_808E560(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C351C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C351C), gUnknown_Debug_083C351C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C351C), 0, 28); - gDebug_0300070F = 4; + sFlagAndVarTest_WhichSubmenu = 4; gMenuCallback = debug_sub_808E5B8; return FALSE; } @@ -3657,8 +3659,8 @@ static bool8 debug_sub_808E5B8(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808E604(gDebug_0300070F, cursorPos); - debug_sub_808E660(gDebug_0300070F); + debug_sub_808E604(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808E660(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3688,7 +3690,7 @@ static void debug_sub_808E660(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C3544[whichMenu]; i++) { - debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_083C354A[whichMenu][i])); + PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C354A[whichMenu][i])); } } @@ -3723,7 +3725,7 @@ static bool8 debug_sub_808E754(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C470C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C470C), gUnknown_Debug_083C470C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C470C), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808E804; return FALSE; } @@ -3734,7 +3736,7 @@ static bool8 debug_sub_808E7AC(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4754C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4754C), gUnknown_Debug_083C4754C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4754C), 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808E804; return FALSE; } @@ -3744,8 +3746,8 @@ static bool8 debug_sub_808E804(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808E850(gDebug_0300070F, cursorPos); - debug_sub_808E8AC(gDebug_0300070F); + debug_sub_808E850(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808E8AC(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3775,7 +3777,7 @@ static void debug_sub_808E8AC(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C478C[whichMenu]; i++) { - debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_083C478E[whichMenu][i])); + PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C478E[whichMenu][i])); } } @@ -3810,7 +3812,7 @@ static bool8 debug_sub_808E9A0(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C369C) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C369C), gUnknown_Debug_083C369C); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C369C), 0, 28); - gDebug_0300070F = 0; + sFlagAndVarTest_WhichSubmenu = 0; gMenuCallback = debug_sub_808EA50; return FALSE; } @@ -3821,7 +3823,7 @@ static bool8 debug_sub_808E9F8(void) Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C36E4) + 1); Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C36E4), gUnknown_Debug_083C36E4); InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C36E4), 0, 28); - gDebug_0300070F = 1; + sFlagAndVarTest_WhichSubmenu = 1; gMenuCallback = debug_sub_808EA50; return FALSE; } @@ -3831,8 +3833,8 @@ static bool8 debug_sub_808EA50(void) s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808EAFC(gDebug_0300070F, cursorPos); - debug_sub_808EA9C(gDebug_0300070F); + debug_sub_808EAFC(sFlagAndVarTest_WhichSubmenu, cursorPos); + debug_sub_808EA9C(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3849,7 +3851,7 @@ static void debug_sub_808EA9C(u8 whichMenu) for (i = 0; i < gUnknown_Debug_083C371C[whichMenu]; i++) { - debug_sub_808F31C(24, 2 * i + 1, VarGet(gUnknown_Debug_083C371E[whichMenu][i])); + PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C371E[whichMenu][i])); } } @@ -3936,7 +3938,7 @@ static bool8 debug_sub_808ECD0(void) if (!UpdatePaletteFade()) { CloseMenu(); - debug_sub_808F168(2); + PrepareDebugOverlayBeforeShowingContestPainting(2); SetMainCallback2(CB2_ContestPainting); gMain.savedCallback = debug_sub_808B868; return TRUE; @@ -3944,147 +3946,147 @@ static bool8 debug_sub_808ECD0(void) return FALSE; } -static bool8 TomomichiDebugMenu_Config(void) +static bool8 Config(void) { return FALSE; } -static void debug_sub_808ED0C(void) +static void PicTest_SelectPokemon(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if (gDebug_03000700 != SPECIES_BULBASAUR) - gDebug_03000700--; + if (sPicTest_Species != SPECIES_BULBASAUR) + sPicTest_Species--; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) { - if (gDebug_03000700 != SPECIES_CHIMECHO) - gDebug_03000700++; + if (sPicTest_Species != SPECIES_CHIMECHO) + sPicTest_Species++; } if (gMain.newAndRepeatedKeys & L_BUTTON) { - if (gDebug_03000700 >= SPECIES_BULBASAUR + 10) - gDebug_03000700 -= 10; + if (sPicTest_Species >= SPECIES_BULBASAUR + 10) + sPicTest_Species -= 10; else - gDebug_03000700 = SPECIES_BULBASAUR; + sPicTest_Species = SPECIES_BULBASAUR; } if (gMain.newAndRepeatedKeys & R_BUTTON) { - if (gDebug_03000700 <= SPECIES_CHIMECHO - 10) - gDebug_03000700 += 10; + if (sPicTest_Species <= SPECIES_CHIMECHO - 10) + sPicTest_Species += 10; else - gDebug_03000700 = SPECIES_CHIMECHO; + sPicTest_Species = SPECIES_CHIMECHO; } } -static void debug_sub_808ED9C(void) +static void PicTest_SelectIDrndDigit(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if (gDebug_03000708 != 0) - gDebug_03000708--; + if (sPicTest_IDrndDigit != 0) + sPicTest_IDrndDigit--; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) { - if (gDebug_03000708 != UINT32_MAX) - gDebug_03000708++; + if (sPicTest_IDrndDigit != UINT32_MAX) + sPicTest_IDrndDigit++; } if (gMain.newAndRepeatedKeys & L_BUTTON) { - if (gDebug_03000708 >= 0x10) - gDebug_03000708 -= 0x10; + if (sPicTest_IDrndDigit >= 0x10) + sPicTest_IDrndDigit -= 0x10; else - gDebug_03000708 = 0; + sPicTest_IDrndDigit = 0; } if (gMain.newAndRepeatedKeys & R_BUTTON) { - if (gDebug_03000708 <= UINT32_MAX - 0x10) - gDebug_03000708 += 0x10; + if (sPicTest_IDrndDigit <= UINT32_MAX - 0x10) + sPicTest_IDrndDigit += 0x10; else - gDebug_03000708 = UINT32_MAX; + sPicTest_IDrndDigit = UINT32_MAX; } if ((gMain.newKeys & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON)) { - gDebug_03000708 = UINT32_MAX; + sPicTest_IDrndDigit = UINT32_MAX; } } -static void debug_sub_808EE3C(void) +static void ContestPicTest_SelectContestType(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if (gDebug_0300070C != 1) - gDebug_0300070C--; + if (sPicTest_ContestType != 1) + sPicTest_ContestType--; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) { - if (gDebug_0300070C != 5) - gDebug_0300070C++; + if (sPicTest_ContestType != 5) + sPicTest_ContestType++; } if (gMain.newAndRepeatedKeys & L_BUTTON) - gDebug_0300070C = 1; + sPicTest_ContestType = 1; if (gMain.newAndRepeatedKeys & R_BUTTON) - gDebug_0300070C = 5; + sPicTest_ContestType = 5; } -static void debug_sub_808EE9C(void) +static void MuseumArtPicTest_SelectTitleType(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if (gDebug_0300070D != 1) - gDebug_0300070D--; + if (sPicTest_MuseumArtTitleType != 1) + sPicTest_MuseumArtTitleType--; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) { - if (gDebug_0300070D != 15) - gDebug_0300070D++; + if (sPicTest_MuseumArtTitleType != 15) + sPicTest_MuseumArtTitleType++; } if (gMain.newAndRepeatedKeys & L_BUTTON) { - if (gDebug_0300070D >= 11) - gDebug_0300070D -= 10; + if (sPicTest_MuseumArtTitleType >= 11) + sPicTest_MuseumArtTitleType -= 10; else - gDebug_0300070D = 0; // Causes underflow when pressing left on the dpad shortly thereafter. + sPicTest_MuseumArtTitleType = 0; // Causes underflow when pressing left on the dpad shortly thereafter. } if (gMain.newAndRepeatedKeys & R_BUTTON) { - if (gDebug_0300070D <= 5) - gDebug_0300070D += 10; + if (sPicTest_MuseumArtTitleType <= 5) + sPicTest_MuseumArtTitleType += 10; else - gDebug_0300070D = 15; + sPicTest_MuseumArtTitleType = 15; } } -static void debug_sub_808EF14(void) +static void PreviewPicTest_SelectType(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if (gDebug_0300070E != 1) - gDebug_0300070E--; + if (sPicTest_PreviewType != 1) + sPicTest_PreviewType--; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) { - if (gDebug_0300070E != 15) - gDebug_0300070E++; + if (sPicTest_PreviewType != 15) + sPicTest_PreviewType++; } if (gMain.newAndRepeatedKeys & L_BUTTON) { - if (gDebug_0300070E >= 11) - gDebug_0300070E -= 10; + if (sPicTest_PreviewType >= 11) + sPicTest_PreviewType -= 10; else - gDebug_0300070E = 0; // Causes underflow when pressing left on the dpad shortly thereafter. + sPicTest_PreviewType = 0; // Causes underflow when pressing left on the dpad shortly thereafter. } if (gMain.newAndRepeatedKeys & R_BUTTON) { - if (gDebug_0300070E <= 5) - gDebug_0300070E += 10; + if (sPicTest_PreviewType <= 5) + sPicTest_PreviewType += 10; else - gDebug_0300070E = 15; + sPicTest_PreviewType = 15; } } #ifdef NONMATCHING -static void debug_sub_808EF8C(u8 a0) +static void PicTest_Redraw(u8 a0) { u8 i; u8 digit; @@ -4097,70 +4099,70 @@ static void debug_sub_808EF8C(u8 a0) case 2: for (i = 0; i < 8; i++) { - digit = (gDebug_03000708 >> (4 * (7 - i))) & 0xf; + digit = (sPicTest_IDrndDigit >> (4 * (7 - i))) & 0xf; if (digit < 10) - gDebug_03000710[i] = digit + CHAR_0; + sPicTest_StringBuffer[i] = digit + CHAR_0; else - gDebug_03000710[i] = digit + CHAR_A - 10; + sPicTest_StringBuffer[i] = digit + CHAR_A - 10; } - gDebug_03000710[i] = EOS; - Menu_PrintText(gDebug_03000710, 12, 5); + sPicTest_StringBuffer[i] = EOS; + Menu_PrintText(sPicTest_StringBuffer, 12, 5); break; } for (i = 0; i < POKEMON_NAME_LENGTH; i++) { - gDebug_03000710[i + 1] = CHAR_SPACE; + sPicTest_StringBuffer[i + 1] = CHAR_SPACE; } - for (i = 0, species = gDebug_03000700; gSpeciesNames[species][i] != EOS && i < POKEMON_NAME_LENGTH; i++) + for (i = 0, species = sPicTest_Species; gSpeciesNames[species][i] != EOS && i < POKEMON_NAME_LENGTH; i++) { - gDebug_03000710[i + 1] = gSpeciesNames[species][i]; + sPicTest_StringBuffer[i + 1] = gSpeciesNames[species][i]; } - gDebug_03000710[0] = 0xB1; - gDebug_03000710[POKEMON_NAME_LENGTH + 1] = 0xB2; - gDebug_03000710[POKEMON_NAME_LENGTH + 2] = EOS; + sPicTest_StringBuffer[0] = 0xB1; + sPicTest_StringBuffer[POKEMON_NAME_LENGTH + 1] = 0xB2; + sPicTest_StringBuffer[POKEMON_NAME_LENGTH + 2] = EOS; switch (a0) { case 0: case 1: case 2: - Menu_PrintText(gDebug_03000710, 8, 1); + Menu_PrintText(sPicTest_StringBuffer, 8, 1); break; default: - Menu_PrintText(gDebug_03000710, 12, 1); + Menu_PrintText(sPicTest_StringBuffer, 12, 1); break; } - gDebug_03000710[3] = EOS; - gDebug_03000710[0] = gDebug_03000700 / 100 + CHAR_0; - gDebug_03000710[1] = (gDebug_03000700 % 100) / 10 + CHAR_0; - gDebug_03000710[2] = gDebug_03000700 % 10 + CHAR_0; - Menu_PrintText(gDebug_03000710, 12, 3); + sPicTest_StringBuffer[3] = EOS; + sPicTest_StringBuffer[0] = sPicTest_Species / 100 + CHAR_0; + sPicTest_StringBuffer[1] = (sPicTest_Species % 100) / 10 + CHAR_0; + sPicTest_StringBuffer[2] = sPicTest_Species % 10 + CHAR_0; + Menu_PrintText(sPicTest_StringBuffer, 12, 3); switch (a0) { case 0: - gDebug_03000710[0] = gDebug_0300070C / 100 + CHAR_0; - gDebug_03000710[1] = (gDebug_0300070C % 100) / 10 + CHAR_0; - gDebug_03000710[2] = gDebug_0300070C % 10 + CHAR_0; - Menu_PrintText(gDebug_03000710, 12, 7); + sPicTest_StringBuffer[0] = sPicTest_ContestType / 100 + CHAR_0; + sPicTest_StringBuffer[1] = (sPicTest_ContestType % 100) / 10 + CHAR_0; + sPicTest_StringBuffer[2] = sPicTest_ContestType % 10 + CHAR_0; + Menu_PrintText(sPicTest_StringBuffer, 12, 7); break; case 1: - gDebug_03000710[0] = gDebug_0300070D / 100 + CHAR_0; - gDebug_03000710[1] = (gDebug_0300070D % 100) / 10 + CHAR_0; - gDebug_03000710[2] = gDebug_0300070D % 10 + CHAR_0; - Menu_PrintText(gDebug_03000710, 12, 7); + sPicTest_StringBuffer[0] = sPicTest_MuseumArtTitleType / 100 + CHAR_0; + sPicTest_StringBuffer[1] = (sPicTest_MuseumArtTitleType % 100) / 10 + CHAR_0; + sPicTest_StringBuffer[2] = sPicTest_MuseumArtTitleType % 10 + CHAR_0; + Menu_PrintText(sPicTest_StringBuffer, 12, 7); break; case 2: - gDebug_03000710[0] = gDebug_0300070E / 100 + CHAR_0; - gDebug_03000710[1] = (gDebug_0300070E % 100) / 10 + CHAR_0; - gDebug_03000710[2] = gDebug_0300070E % 10 + CHAR_0; - Menu_PrintText(gDebug_03000710, 12, 7); + sPicTest_StringBuffer[0] = sPicTest_PreviewType / 100 + CHAR_0; + sPicTest_StringBuffer[1] = (sPicTest_PreviewType % 100) / 10 + CHAR_0; + sPicTest_StringBuffer[2] = sPicTest_PreviewType % 10 + CHAR_0; + Menu_PrintText(sPicTest_StringBuffer, 12, 7); break; } } #else -__attribute__((naked)) void debug_sub_808EF8C(u8 a0) +__attribute__((naked)) void PicTest_Redraw(u8 a0) { asm("\tpush\t{r4, r5, r6, r7, lr}\n" "\tmov\tr7, r8\n" @@ -4172,9 +4174,9 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "\tcmp\tr6, #0\n" "\tblt\t._653\t@cond_branch\n" "\tmov\tr3, #0x0\n" - "\tldr\tr0, ._656 @ gDebug_03000708\n" + "\tldr\tr0, ._656 @ sPicTest_IDrndDigit\n" "\tmov\tr8, r0\n" - "\tldr\tr4, ._656 + 4 @ gDebug_03000710\n" + "\tldr\tr4, ._656 + 4 @ sPicTest_StringBuffer\n" "\tmov\tr7, #0x7\n" "\tmov\tr5, #0xf\n" "._658:\n" @@ -4193,8 +4195,8 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "._657:\n" "\t.align\t2, 0\n" "._656:\n" - "\t.word\tgDebug_03000708\n" - "\t.word\tgDebug_03000710\n" + "\t.word\tsPicTest_IDrndDigit\n" + "\t.word\tsPicTest_StringBuffer\n" "._654:\n" "\tadd\tr1, r3, r4\n" "\tadd\tr0, r2, #0\n" @@ -4206,7 +4208,7 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "\tlsr\tr3, r0, #0x18\n" "\tcmp\tr3, #0x7\n" "\tbls\t._658\t@cond_branch\n" - "\tldr\tr0, ._666 @ gDebug_03000710\n" + "\tldr\tr0, ._666 @ sPicTest_StringBuffer\n" "\tmov\tr1, #0xff\n" "\tstrb\tr1, [r0, #0x8]\n" "\tmov\tr1, #0xc\n" @@ -4214,8 +4216,8 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "\tbl\tMenu_PrintText\n" "._653:\n" "\tmov\tr3, #0x0\n" - "\tldr\tr7, ._666 @ gDebug_03000710\n" - "\tldr\tr5, ._666 + 4 @ gDebug_03000700\n" + "\tldr\tr7, ._666 @ sPicTest_StringBuffer\n" + "\tldr\tr5, ._666 + 4 @ sPicTest_Species\n" "\tldr\tr2, ._666 + 8 @ gSpeciesNames\n" "\tmov\tr8, r2\n" "\tadd\tr4, r7, #0\n" @@ -4238,7 +4240,7 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "\tldrb\tr0, [r0]\n" "\tcmp\tr0, #0xff\n" "\tbeq\t._661\t@cond_branch\n" - "\tldr\tr0, ._666 @ gDebug_03000710\n" + "\tldr\tr0, ._666 @ sPicTest_StringBuffer\n" "\tmov\tip, r0\n" "\tmov\tr5, r8\n" "\tadd\tr4, r1, #0\n" @@ -4278,19 +4280,19 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "._667:\n" "\t.align\t2, 0\n" "._666:\n" - "\t.word\tgDebug_03000710\n" - "\t.word\tgDebug_03000700\n" + "\t.word\tsPicTest_StringBuffer\n" + "\t.word\tsPicTest_Species\n" "\t.word\tgSpeciesNames\n" "._664:\n" - "\tldr\tr0, ._672 @ gDebug_03000710\n" + "\tldr\tr0, ._672 @ sPicTest_StringBuffer\n" "\tmov\tr1, #0xc\n" "\tmov\tr2, #0x1\n" "\tbl\tMenu_PrintText\n" "._665:\n" - "\tldr\tr5, ._672 @ gDebug_03000710\n" + "\tldr\tr5, ._672 @ sPicTest_StringBuffer\n" "\tmov\tr0, #0xff\n" "\tstrb\tr0, [r5, #0x3]\n" - "\tldr\tr4, ._672 + 4 @ gDebug_03000700\n" + "\tldr\tr4, ._672 + 4 @ sPicTest_Species\n" "\tldrh\tr0, [r4]\n" "\tmov\tr1, #0x64\n" "\tbl\t__udivsi3\n" @@ -4324,21 +4326,21 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "._673:\n" "\t.align\t2, 0\n" "._672:\n" - "\t.word\tgDebug_03000710\n" - "\t.word\tgDebug_03000700\n" + "\t.word\tsPicTest_StringBuffer\n" + "\t.word\tsPicTest_Species\n" "._669:\n" "\tcmp\tr6, #0x2\n" "\tbeq\t._674\t@cond_branch\n" "\tb\t._679\n" "._670:\n" - "\tldr\tr4, ._677 @ gDebug_0300070C\n" + "\tldr\tr4, ._677 @ sPicTest_ContestType\n" "\tb\t._676\n" "._678:\n" "\t.align\t2, 0\n" "._677:\n" - "\t.word\tgDebug_0300070C\n" + "\t.word\tsPicTest_ContestType\n" "._668:\n" - "\tldr\tr4, ._680 @ gDebug_0300070D\n" + "\tldr\tr4, ._680 @ sPicTest_MuseumArtTitleType\n" "._676:\n" "\tldrb\tr0, [r4]\n" "\tmov\tr1, #0x64\n" @@ -4367,9 +4369,9 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "._681:\n" "\t.align\t2, 0\n" "._680:\n" - "\t.word\tgDebug_0300070D\n" + "\t.word\tsPicTest_MuseumArtTitleType\n" "._674:\n" - "\tldr\tr4, ._682 @ gDebug_0300070E\n" + "\tldr\tr4, ._682 @ sPicTest_PreviewType\n" "\tldrb\tr0, [r4]\n" "\tmov\tr1, #0x64\n" "\tbl\t__udivsi3\n" @@ -4402,76 +4404,76 @@ __attribute__((naked)) void debug_sub_808EF8C(u8 a0) "._683:\n" "\t.align\t2, 0\n" "._682:\n" - "\t.word\tgDebug_0300070E"); + "\t.word\tsPicTest_PreviewType"); } #endif // NONMATCHING -static void debug_sub_808F168(u8 a0) +static void PrepareDebugOverlayBeforeShowingContestPainting(u8 a0) { struct ContestEntry *contestEntry = &ewram15DE0; - contestEntry->var8 = gDebug_03000700; - contestEntry->var4 = gDebug_03000704; - contestEntry->var0 = gDebug_03000708; + contestEntry->var8 = sPicTest_Species; + contestEntry->var4 = sPicTest_ContestEntryVar4; + contestEntry->var0 = sPicTest_IDrndDigit; switch (a0) { case 0: ewram15DDF = 0; ewram15DDE = 0; - contestEntry->contestType = gDebug_0300070C - 1; - StringCopy(contestEntry->trainer_name, gUnknown_Debug_083C48BB); - StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + contestEntry->contestType = sPicTest_ContestType - 1; + StringCopy(contestEntry->trainer_name, sDummyTrainerName); + StringCopy(contestEntry->pokemon_name, sDummyNickname); break; case 1: ewram15DDF = 0; ewram15DDE = 8; - contestEntry->contestType = gDebug_0300070D - 1; - StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + contestEntry->contestType = sPicTest_MuseumArtTitleType - 1; + StringCopy(contestEntry->pokemon_name, sDummyNickname); break; case 2: ewram15DDF = 1; ewram15DDE = 8; - contestEntry->contestType = gDebug_0300070E - 1; + contestEntry->contestType = sPicTest_PreviewType - 1; break; case 3: ewram15DDF = 0; ewram15DDE = 8; contestEntry->contestType = 0; - StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + StringCopy(contestEntry->pokemon_name, sDummyNickname); break; case 4: ewram15DDF = 0; ewram15DDE = 8; contestEntry->contestType = 3; - StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + StringCopy(contestEntry->pokemon_name, sDummyNickname); break; case 5: ewram15DDF = 0; ewram15DDE = 8; contestEntry->contestType = 9; - StringCopy(contestEntry->pokemon_name, gUnknown_Debug_083C48B0); + StringCopy(contestEntry->pokemon_name, sDummyNickname); break; } } -static void debug_sub_808F2E0(u8 a0, u8 a1, u8 a2) +static void PrintBool(u8 a0, u8 a1, bool8 a2) { - if (a2 == 0) - gDebug_03000710[0] = CHAR_0; + if (a2 == FALSE) + sPicTest_StringBuffer[0] = CHAR_0; else - gDebug_03000710[0] = CHAR_0 + 1; - gDebug_03000710[1] = EOS; - Menu_PrintText(gDebug_03000710, a0, a1); + sPicTest_StringBuffer[0] = CHAR_0 + 1; + sPicTest_StringBuffer[1] = EOS; + Menu_PrintText(sPicTest_StringBuffer, a0, a1); } -static void debug_sub_808F31C(u8 a0, u8 a1, u16 a2) +static void PrintUnsignedShort(u8 a0, u8 a1, u16 a2) { - gDebug_03000710[0] = a2 / 10000 + CHAR_0; - gDebug_03000710[1] = (a2 % 10000) / 1000 + CHAR_0; - gDebug_03000710[2] = (a2 % 1000) / 100 + CHAR_0; - gDebug_03000710[3] = (a2 % 100) / 10 + CHAR_0; - gDebug_03000710[4] = a2 % 10 + CHAR_0; - gDebug_03000710[5] = EOS; - Menu_PrintText(gDebug_03000710, a0, a1); + sPicTest_StringBuffer[0] = a2 / 10000 + CHAR_0; + sPicTest_StringBuffer[1] = (a2 % 10000) / 1000 + CHAR_0; + sPicTest_StringBuffer[2] = (a2 % 1000) / 100 + CHAR_0; + sPicTest_StringBuffer[3] = (a2 % 100) / 10 + CHAR_0; + sPicTest_StringBuffer[4] = a2 % 10 + CHAR_0; + sPicTest_StringBuffer[5] = EOS; + Menu_PrintText(sPicTest_StringBuffer, a0, a1); } void debug_nullsub_66(void) diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c index 0aa02312f..eb7f92a6b 100644 --- a/src/scene/contest_painting.c +++ b/src/scene/contest_painting.c @@ -743,7 +743,7 @@ static void sub_8106F6C(u8 arg0) gUnknown_03005E20.var_4 = gUnknown_03005E10; gUnknown_03005E20.var_8 = gUnknown_03005E90; gUnknown_03005E20.var_18 = 0; - gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0; + gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0 % 256; gUnknown_03005E20.var_19 = 0; gUnknown_03005E20.var_1A = 0; gUnknown_03005E20.var_1B = 64; -- cgit v1.2.3 From fed5701e8e8453cdda1a3bdc545c8c607cd981d8 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 15 Mar 2018 08:46:22 -0400 Subject: Renaming objects related to tomomichi debug menu --- src/debug/tomomichi_debug_menu.c | 1673 +++++++++++++++++++------------------- src/scene/contest_painting.c | 11 +- 2 files changed, 841 insertions(+), 843 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 1df6ff26c..90d10556f 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -17,8 +17,8 @@ #include "sound.h" static u16 sPicTest_Species; -static u32 sPicTest_ContestEntryVar4; -static u32 sPicTest_IDrndDigit; +static u32 sPicTest_OTID; +static u32 sPicTest_Personality; static u8 sPicTest_ContestType; static u8 sPicTest_MuseumArtTitleType; static u8 sPicTest_PreviewType; @@ -31,7 +31,7 @@ static u8 sControlFlagsCursorPos; static u8 sControlWORKCursorPos; static bool8 ArtMusGraphics(void); -static bool8 Config(void); +static bool8 DummyMenuAction(void); static bool8 ContestGraphics(void); static bool8 ContestGraphics_Show(void); static bool8 ControlEvents(void); @@ -40,37 +40,37 @@ static bool8 ControlWorks(void); static bool8 MuseumGraphics_Show(void); static bool8 PreviewData(void); static bool8 TrickHouse(void); -static bool8 debug_sub_808B874(void); -static bool8 debug_sub_808B8C8(void); -static bool8 debug_sub_808BC48(void); -static bool8 debug_sub_808BCBC(void); +static bool8 InitDebugWindow(void); +static bool8 TopMenu_HandleInput(void); +static bool8 ContestGraphics_HandleInput(void); +static bool8 ArtMusGraphics_HandleInput(void); static bool8 PreviewData_HandleInput(void); -static bool8 debug_sub_808BDA4(void); -static bool8 debug_sub_808BE2C(void); -static bool8 debug_sub_808BEB4(void); -static bool8 debug_sub_808BF3C(void); -static bool8 debug_sub_808BFC4(void); -static bool8 debug_sub_808C014(void); -static bool8 debug_sub_808C064(void); -static bool8 debug_sub_808C0A8(void); -static bool8 debug_sub_808C0EC(void); -static bool8 debug_sub_808C104(void); -static bool8 debug_sub_808C11C(void); -static bool8 debug_sub_808C134(void); -static bool8 debug_sub_808C14C(void); -static bool8 debug_sub_808C164(void); -static bool8 debug_sub_808C17C(void); -static bool8 debug_sub_808C194(void); -static bool8 debug_sub_808C1AC(void); -static bool8 debug_sub_808C1C4(void); -static bool8 debug_sub_808C1DC(void); -static bool8 debug_sub_808C1F4(void); -static bool8 debug_sub_808C20C(void); -static bool8 debug_sub_808C224(void); -static bool8 debug_sub_808C23C(void); +static bool8 TrickHouse_HandleInput(void); +static bool8 ControlEvents_HandleInput(void); +static bool8 ControlFlags_HandleInput(void); +static bool8 ControlWorks_HandleInput(void); +static bool8 ControlEvents_InitSubmenu1(void); +static bool8 ControlEvents_InitSubmenu2(void); +static bool8 ControlEvents_Events1_HandleInput(void); +static bool8 ControlEvents_Events2_HandleInput(void); +static bool8 CallScript_DoHallOfFame(void); +static bool8 CallScript_GiveCoinCaseIfNotAlreadyOwned(void); +static bool8 CallScript_SetOldaleStateAfterRoute103Rival(void); +static bool8 CallScript_OpenNewMauville(void); +static bool8 CallScript_GiveSSTicketAndDoHallOfFame(void); +static bool8 CallScript_GiveKyogreEgg(void); +static bool8 CallScript_GiveAllItems(void); +static bool8 CallScript_GiveAllDecorations(void); +static bool8 CallScript_GiveAllCoins(void); +static bool8 CallScript_OpenSootopolisGym(void); +static bool8 CallScript_SetMoneyTo0(void); +static bool8 CallScript_FillPartyWithBarboach(void); +static bool8 CallScript_FillPartyWithShroomish(void); +static bool8 CallScript_GiveBarboachEgg(void); +static bool8 CallScript_GiveShroomishEgg(void); static bool8 debug_sub_808C280(void); static bool8 debug_sub_808C2E4(void); -static bool8 debug_sub_808C31C(void); +static bool8 ControlFlags_EventFlag_InitSubmenu(void); static bool8 debug_sub_808C36C(void); static bool8 debug_sub_808C3B0(void); static bool8 debug_sub_808C408(void); @@ -84,7 +84,7 @@ static bool8 debug_sub_808C670(void); static bool8 debug_sub_808C6C8(void); static void debug_sub_808C714(u8, u8); static void debug_sub_808C764(u8); -static bool8 debug_sub_808C7C8(void); +static bool8 ControlFlags_VanishFlag_InitSubmenu(void); static bool8 debug_sub_808C818(void); static bool8 debug_sub_808C85C(void); static bool8 debug_sub_808C8B4(void); @@ -98,7 +98,7 @@ static bool8 debug_sub_808CB1C(void); static bool8 debug_sub_808CB74(void); static void debug_sub_808CBC0(u8, u8); static void debug_sub_808CC10(u8); -static bool8 debug_sub_808CC74(void); +static bool8 ControlFlags_TrainerFlag_InitSubmenu(void); static bool8 debug_sub_808CCC4(void); static bool8 debug_sub_808CD08(void); static bool8 debug_sub_808CD60(void); @@ -106,7 +106,7 @@ static bool8 debug_sub_808CDB8(void); static bool8 debug_sub_808CE10(void); static void debug_sub_808CE5C(u8, u8); static void debug_sub_808CEAC(u8); -static bool8 debug_sub_808CF10(void); +static bool8 ControlFlags_SysFlag_InitSubmenu(void); static bool8 debug_sub_808CF60(void); static bool8 debug_sub_808CFA4(void); static bool8 debug_sub_808CFFC(void); @@ -120,45 +120,45 @@ static bool8 debug_sub_808D264(void); static bool8 debug_sub_808D2BC(void); static void debug_sub_808D308(u8, u8); static void debug_sub_808D358(u8); -static bool8 debug_sub_808D3BC(void); +static bool8 ControlFlags_FH_OBJ_InitSubmenu(void); static bool8 debug_sub_808D40C(void); static bool8 debug_sub_808D450(void); static bool8 debug_sub_808D4A8(void); static bool8 debug_sub_808D500(void); static void debug_sub_808D54C(u8, u8); static void debug_sub_808D59C(u8); -static bool8 debug_sub_808D600(void); +static bool8 ControlFlags_FH_InitSubmenu(void); static bool8 debug_sub_808D650(void); static bool8 debug_sub_808D694(void); static bool8 debug_sub_808D6EC(void); static bool8 debug_sub_808D744(void); static void debug_sub_808D790(u8, u8); static void debug_sub_808D7E0(u8); -static bool8 debug_sub_808D844(void); +static bool8 ControlFlags_BallVanishFlag_InitSubmenu(void); static bool8 debug_sub_808D894(void); static bool8 debug_sub_808D8D8(void); static bool8 debug_sub_808D930(void); static void debug_sub_808D97C(u8, u8); static void debug_sub_808D9CC(u8); -static bool8 debug_sub_808DA30(void); -static bool8 debug_sub_808DA80(void); -static void debug_sub_808DABC(void); -static void debug_sub_808DAD4(void); -static bool8 debug_sub_808DB0C(void); -static bool8 debug_sub_808DB5C(void); -static bool8 debug_sub_808DBA0(void); -static bool8 debug_sub_808DBF8(void); -static bool8 debug_sub_808DC50(void); -static bool8 debug_sub_808DCA8(void); -static bool8 debug_sub_808DD00(void); -static bool8 debug_sub_808DD58(void); -static bool8 debug_sub_808DDB0(void); -static bool8 debug_sub_808DE08(void); -static bool8 debug_sub_808DE60(void); -static bool8 debug_sub_808DEB8(void); +static bool8 ControlWorks_AnsWork_InitSubmenu(void); +static bool8 ControlWorks_AnsWork_HandleInput(void); +static void ControlWorks_AnsWork_PrintRESULT(void); +static void ControlWorks_AnsWork_AdjustRESULT(void); +static bool8 ControlWorks_SaveWork_InitSubmenu(void); +static bool8 ControlWorks_SaveWork_HandleInput(void); +static bool8 ControlWorks_SaveWork_Town_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_City_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_Route101To109_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_Route110To118_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_Route119To127_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_Route128To134_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_RoomTown_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_RoomCity_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_Dungeon_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWork_Subsubmenu_HandleInput(void); static void debug_sub_808DF04(u8); static void debug_sub_808DF64(u8, u8); -static bool8 debug_sub_808DFC0(void); +static bool8 ControlWorks_SaveWorkPart2_InitSubmenu(void); static bool8 debug_sub_808E010(void); static bool8 debug_sub_808E054(void); static bool8 debug_sub_808E0AC(void); @@ -169,7 +169,7 @@ static bool8 debug_sub_808E20C(void); static bool8 debug_sub_808E264(void); static void debug_sub_808E2B0(u8); static void debug_sub_808E310(u8, u8); -static bool8 debug_sub_808E36C(void); +static bool8 ControlWorks_SysWork_InitSubmenu(void); static bool8 debug_sub_808E3BC(void); static bool8 debug_sub_808E400(void); static bool8 debug_sub_808E458(void); @@ -179,28 +179,28 @@ static bool8 debug_sub_808E560(void); static bool8 debug_sub_808E5B8(void); static void debug_sub_808E604(u8, u8); static void debug_sub_808E660(u8); -static bool8 debug_sub_808E6C0(void); +static bool8 ControlWorks_LocalWork_InitSubmenu(void); static bool8 debug_sub_808E710(void); static bool8 debug_sub_808E754(void); static bool8 debug_sub_808E7AC(void); static bool8 debug_sub_808E804(void); static void debug_sub_808E850(u8, u8); static void debug_sub_808E8AC(u8); -static bool8 debug_sub_808E90C(void); +static bool8 ControlWorks_ObjWork_InitSubmenu(void); static bool8 debug_sub_808E95C(void); static bool8 debug_sub_808E9A0(void); static bool8 debug_sub_808E9F8(void); static bool8 debug_sub_808EA50(void); static void debug_sub_808EA9C(u8); static void debug_sub_808EAFC(u8, u8); -static bool8 debug_sub_808EB58(void); -static bool8 debug_sub_808EBB4(void); +static bool8 TrickRelated_Level_InitSubmenu(void); +static bool8 TrickRelated_TrickMaster_InitSubmenu(void); static bool8 debug_sub_808EC10(void); static bool8 debug_sub_808EC5C(void); -static bool8 debug_sub_808ECA4(void); +static bool8 PreviewGraphics_Show(void); static bool8 debug_sub_808ECD0(void); static void PicTest_SelectPokemon(void); -static void PicTest_SelectIDrndDigit(void); +static void PicTest_SelectPersonality(void); static void ContestPicTest_SelectContestType(void); static void MuseumArtPicTest_SelectTitleType(void); static void PreviewPicTest_SelectType(void); @@ -233,7 +233,7 @@ static const u8 sString_ControlEvents[] = _("Control events"); static const u8 sString_ControlFlags[] = _("Control flags"); static const u8 sString_ControlWORK[] = _("Control WORK"); -static const struct MenuAction gUnknown_Debug_083C0CBA[] = { +static const struct MenuAction sMenuActions_TopMenu[] = { {sString_ContestGraphics, ContestGraphics}, {sString_ArtMuseumGraphics, ArtMusGraphics}, {sString_PreviewData, PreviewData}, @@ -246,140 +246,139 @@ static const struct MenuAction gUnknown_Debug_083C0CBA[] = { static const u8 sString_ContestMenuTitle[] = _("Contest"); static const u8 sString_Contest_PokemonNo[] = _("Pokémon No."); -static const u8 sString_Contest_IDrndDigit[] = _("ID rnd. digit"); +static const u8 sString_Contest_Personality[] = _("ID rnd. digit"); static const u8 sString_Contest_Type[] = _("Contest Type"); static const u8 sString_Contest_PokeArt[] = _("Poké Art"); static const struct MenuAction sMenuActions_ContestPicTest[] = { - {sString_Contest_PokemonNo, Config}, - {sString_Contest_IDrndDigit, Config}, - {sString_Contest_Type, Config}, + {sString_Contest_PokemonNo, DummyMenuAction}, + {sString_Contest_Personality, DummyMenuAction}, + {sString_Contest_Type, DummyMenuAction}, {sString_Contest_PokeArt, ContestGraphics_Show} }; static const u8 sString_Contest_ArtMuseumTitle[] = _("Art Mus."); static const u8 sString_Contest_ArtMuseum_PokemonNo[] = _("Pokémon No."); -static const u8 sString_Contest_ArtMuseum_IDrndDigit[] = _("ID rnd. digit"); +static const u8 sString_Contest_ArtMuseum_Personality[] = _("ID rnd. digit"); static const u8 sString_Contest_ArtMuseum_Type[] = _("Title Type"); static const u8 sString_Contest_ArtMuseum_PokeArt[] = _("Poké Art"); static const struct MenuAction sMenuActions_ArtMuseumPicTest[] = { - {sString_Contest_ArtMuseum_PokemonNo, Config}, - {sString_Contest_ArtMuseum_IDrndDigit, Config}, - {sString_Contest_ArtMuseum_Type, Config}, + {sString_Contest_ArtMuseum_PokemonNo, DummyMenuAction}, + {sString_Contest_ArtMuseum_Personality, DummyMenuAction}, + {sString_Contest_ArtMuseum_Type, DummyMenuAction}, {sString_Contest_ArtMuseum_PokeArt, MuseumGraphics_Show} }; -static const u8 gUnknown_Debug_083C0DA4[] = _("Preview"); +static const u8 sString_Contest_PreviewTitle[] = _("Preview"); -static const u8 gUnknown_Debug_083C0DAC[] = _("Pokémon No."); -static const u8 gUnknown_Debug_083C0DB8[] = _("ID rnd. digit"); -static const u8 gUnknown_Debug_083C0DC6[] = _("Type"); -static const u8 gUnknown_Debug_083C0DCB[] = _("Poké Art"); +static const u8 sString_Contest_Preview_PokemonNo[] = _("Pokémon No."); +static const u8 sString_Contest_Preview_Personality[] = _("ID rnd. digit"); +static const u8 sString_Contest_Preview_Type[] = _("Type"); +static const u8 sString_Contest_Preview_PokeArt[] = _("Poké Art"); static const struct MenuAction sMenuActions_PreviewPicTest[] = { - {gUnknown_Debug_083C0DAC, Config}, - {gUnknown_Debug_083C0DB8, Config}, - {gUnknown_Debug_083C0DC6, Config}, - {gUnknown_Debug_083C0DCB, debug_sub_808ECA4} + {sString_Contest_Preview_PokemonNo, DummyMenuAction}, + {sString_Contest_Preview_Personality, DummyMenuAction}, + {sString_Contest_Preview_Type, DummyMenuAction}, + {sString_Contest_Preview_PokeArt, PreviewGraphics_Show} }; -static const u8 gUnknown_Debug_083C0DF4[] = _("Trick related"); +static const u8 sString_TrickRelated[] = _("Trick related"); -static const u8 gUnknown_Debug_083C0E02[] = _("Level"); -static const u8 gUnknown_Debug_083C0E08[] = _("Trick Master"); +static const u8 sString_TrickRelated_Level[] = _("Level"); +static const u8 sString_TrickRelated_TrickMaster[] = _("Trick Master"); static const struct MenuAction sMenuActions_TrickRelated[] = { - {gUnknown_Debug_083C0E02, debug_sub_808EB58}, - {gUnknown_Debug_083C0E08, debug_sub_808EBB4} + {sString_TrickRelated_Level, TrickRelated_Level_InitSubmenu}, + {sString_TrickRelated_TrickMaster, TrickRelated_TrickMaster_InitSubmenu} }; -static const u8 gUnknown_Debug_083C0E28[] = _("パート1"); -static const u8 gUnknown_Debug_083C0E2D[] = _("パート2"); +static const u8 sString_Event1[] = _("パート1"); +static const u8 sString_Event2[] = _("パート2"); -static const struct MenuAction gUnknown_Debug_083C0E32[] = { - {gUnknown_Debug_083C0E28, debug_sub_808BFC4}, - {gUnknown_Debug_083C0E2D, debug_sub_808C014} +static const struct MenuAction sMenuActions_ControlEvents[] = { + {sString_Event1, ControlEvents_InitSubmenu1}, + {sString_Event2, ControlEvents_InitSubmenu2} }; -static const u8 gUnknown_Debug_083C0E44[] = _("イベントFLAG"); -static const u8 gUnknown_Debug_083C0E4D[] = _("バニシュFLAG"); -static const u8 gUnknown_Debug_083C0E56[] = _("トレーナーFLAG"); -static const u8 gUnknown_Debug_083C0E60[] = _("SYSFLAG"); -static const u8 gUnknown_Debug_083C0E68[] = _("BALLバニシュFLAG"); -static const u8 gUnknown_Debug_083C0E75[] = _("FH"); -static const u8 gUnknown_Debug_083C0E78[] = _("FH-OBJ"); - -static const struct MenuAction gUnknown_Debug_083C0E7F[] = { - {gUnknown_Debug_083C0E44, debug_sub_808C31C}, - {gUnknown_Debug_083C0E4D, debug_sub_808C7C8}, - {gUnknown_Debug_083C0E56, debug_sub_808CC74}, - {gUnknown_Debug_083C0E60, debug_sub_808CF10}, - {gUnknown_Debug_083C0E68, debug_sub_808D844}, - {gUnknown_Debug_083C0E75, debug_sub_808D600}, - {gUnknown_Debug_083C0E78, debug_sub_808D3BC} +static const u8 sString_EventFlag[] = _("イベントFLAG"); +static const u8 sString_VanishFlag[] = _("バニシュFLAG"); +static const u8 sString_TrainerFlag[] = _("トレーナーFLAG"); +static const u8 sString_SysFlag[] = _("SYSFLAG"); +static const u8 sString_BallVanishFlag[] = _("BALLバニシュFLAG"); +static const u8 sString_FH[] = _("FH"); +static const u8 sString_FH_OBJ[] = _("FH-OBJ"); + +static const struct MenuAction sMenuActions_ControlFlags[] = { + {sString_EventFlag, ControlFlags_EventFlag_InitSubmenu}, + {sString_VanishFlag, ControlFlags_VanishFlag_InitSubmenu}, + {sString_TrainerFlag, ControlFlags_TrainerFlag_InitSubmenu}, + {sString_SysFlag, ControlFlags_SysFlag_InitSubmenu}, + {sString_BallVanishFlag, ControlFlags_BallVanishFlag_InitSubmenu}, + {sString_FH, ControlFlags_FH_InitSubmenu}, + {sString_FH_OBJ, ControlFlags_FH_OBJ_InitSubmenu} }; -static const u8 gUnknown_Debug_083C0EB8[] = _("SAVEWORK"); - -static const u8 gUnknown_Debug_083C0EC1[] = _("SYSWORK"); -static const u8 gUnknown_Debug_083C0EC9[] = _("LOCALWORK"); -static const u8 gUnknown_Debug_083C0ED3[] = _("OBJWORK"); -static const u8 gUnknown_Debug_083C0EDB[] = _("ANSWORK"); -static const u8 gUnknown_Debug_083C0EE3[] = _("SAVEWORK パート2"); - -static const struct MenuAction gUnknown_Debug_083C0EF1[] = { - {gUnknown_Debug_083C0EB8, debug_sub_808DB0C}, - {gUnknown_Debug_083C0EC1, debug_sub_808E36C}, - {gUnknown_Debug_083C0EC9, debug_sub_808E6C0}, - {gUnknown_Debug_083C0ED3, debug_sub_808E90C}, - {gUnknown_Debug_083C0EDB, debug_sub_808DA30}, - {gUnknown_Debug_083C0EE3, debug_sub_808DFC0} +static const u8 sString_SaveWork[] = _("SAVEWORK"); +static const u8 sString_SysWork[] = _("SYSWORK"); +static const u8 sString_LocalWork[] = _("LOCALWORK"); +static const u8 sString_ObjWork[] = _("OBJWORK"); +static const u8 sString_AnsWork[] = _("ANSWORK"); +static const u8 sString_SaveWorkPart2[] = _("SAVEWORK パート2"); + +static const struct MenuAction sMenuActions_ControlWorks[] = { + {sString_SaveWork, ControlWorks_SaveWork_InitSubmenu}, + {sString_SysWork, ControlWorks_SysWork_InitSubmenu}, + {sString_LocalWork, ControlWorks_LocalWork_InitSubmenu}, + {sString_ObjWork, ControlWorks_ObjWork_InitSubmenu}, + {sString_AnsWork, ControlWorks_AnsWork_InitSubmenu}, + {sString_SaveWorkPart2, ControlWorks_SaveWorkPart2_InitSubmenu} }; -static const u8 gUnknown_Debug_083C0F24[] = _("クリアご"); -static const u8 gUnknown_Debug_083C0F29[] = _("コインこうにゅうかのう"); -static const u8 gUnknown_Debug_083C0F35[] = _("コトキサポーターセット"); -static const u8 gUnknown_Debug_083C0F41[] = _("ニューキンセツOPEN"); -static const u8 gUnknown_Debug_083C0F4D[] = _("れんらくせんにのれる"); -static const u8 gUnknown_Debug_083C0F58[] = _("タマゴついか"); -static const u8 gUnknown_Debug_083C0F5F[] = _("アイテムいっぱい"); -static const u8 gUnknown_Debug_083C0F68[] = _("グッズいっぱい"); -static const u8 gUnknown_Debug_083C0F70[] = _("COINいっぱい"); - -static const struct MenuAction gUnknown_Debug_083C0F79[] = { - {gUnknown_Debug_083C0F24, debug_sub_808C0EC}, - {gUnknown_Debug_083C0F29, debug_sub_808C104}, - {gUnknown_Debug_083C0F35, debug_sub_808C11C}, - {gUnknown_Debug_083C0F41, debug_sub_808C134}, - {gUnknown_Debug_083C0F4D, debug_sub_808C14C}, - {gUnknown_Debug_083C0F58, debug_sub_808C164}, - {gUnknown_Debug_083C0F5F, debug_sub_808C17C}, - {gUnknown_Debug_083C0F68, debug_sub_808C194}, - {gUnknown_Debug_083C0F70, debug_sub_808C1AC} +static const u8 sString_Clear_go[] = _("クリアご"); +static const u8 sString_Coin_kounyuuka[] = _("コインこうにゅうかのう"); +static const u8 sString_Oldale_supporter_set[] = _("コトキサポーターセット"); +static const u8 sString_New_Mauville_open[] = _("ニューキンセツOPEN"); +static const u8 sString_Renrakusen_ni_noreru[] = _("れんらくせんにのれる"); +static const u8 sString_Egg_tsuika[] = _("タマゴついか"); +static const u8 sString_Item_ippai[] = _("アイテムいっぱい"); +static const u8 sString_Gezzu_ippai[] = _("グッズいっぱい"); +static const u8 sString_Coin_ippai[] = _("COINいっぱい"); + +static const struct MenuAction sMenuActions_ControlEvents_Events1[] = { + {sString_Clear_go, CallScript_DoHallOfFame}, + {sString_Coin_kounyuuka, CallScript_GiveCoinCaseIfNotAlreadyOwned}, + {sString_Oldale_supporter_set, CallScript_SetOldaleStateAfterRoute103Rival}, + {sString_New_Mauville_open, CallScript_OpenNewMauville}, + {sString_Renrakusen_ni_noreru, CallScript_GiveSSTicketAndDoHallOfFame}, + {sString_Egg_tsuika, CallScript_GiveKyogreEgg}, + {sString_Item_ippai, CallScript_GiveAllItems}, + {sString_Gezzu_ippai, CallScript_GiveAllDecorations}, + {sString_Coin_ippai, CallScript_GiveAllCoins} }; -static const u8 gUnknown_Debug_083C0FC4[] = _("ムロジムOPEN"); -static const u8 gUnknown_Debug_083C0FCD[] = _("おかねを0へ"); -static const u8 gUnknown_Debug_083C0FD4[] = _("ドジョッチ FULL"); -static const u8 gUnknown_Debug_083C0FDF[] = _("キノココ FULL"); -static const u8 gUnknown_Debug_083C0FE9[] = _("ドジョッチ タマゴ"); -static const u8 gUnknown_Debug_083C0FF3[] = _("キノココ タマゴ"); - -static const struct MenuAction gUnknown_Debug_083C0FFC[] = { - {gUnknown_Debug_083C0FC4, debug_sub_808C1C4}, - {gUnknown_Debug_083C0FCD, debug_sub_808C1DC}, - {gUnknown_Debug_083C0FD4, debug_sub_808C1F4}, - {gUnknown_Debug_083C0FDF, debug_sub_808C20C}, - {gUnknown_Debug_083C0FE9, debug_sub_808C224}, - {gUnknown_Debug_083C0FF3, debug_sub_808C23C} +static const u8 sString_SootpolisGymOpen[] = _("ムロジムOPEN"); +static const u8 sString_MoneyTo0[] = _("おかねを0へ"); +static const u8 sString_BarboachFull[] = _("ドジョッチ FULL"); +static const u8 sString_ShroomishFull[] = _("キノココ FULL"); +static const u8 sString_BarboachEgg[] = _("ドジョッチ タマゴ"); +static const u8 sString_ShroomishEgg[] = _("キノココ タマゴ"); + +static const struct MenuAction sMenuActions_ControlEvents_Events2[] = { + {sString_SootpolisGymOpen, CallScript_OpenSootopolisGym}, + {sString_MoneyTo0, CallScript_SetMoneyTo0}, + {sString_BarboachFull, CallScript_FillPartyWithBarboach}, + {sString_ShroomishFull, CallScript_FillPartyWithShroomish}, + {sString_BarboachEgg, CallScript_GiveBarboachEgg}, + {sString_ShroomishEgg, CallScript_GiveShroomishEgg} }; -static const u8 gUnknown_Debug_083C102C[] = _("ANSWORK みかんせい"); +static const u8 sString_Answork_Mikansei[] = _("ANSWORK みかんせい"); -static const struct MenuAction gUnknown_Debug_083C103A[] = { - {gUnknown_Debug_083C102C, Config} +static const struct MenuAction sMenuActions_ControlEvents_AnsWork[] = { + {sString_Answork_Mikansei, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1044[] = _("FHーOBJ00ー08"); @@ -401,15 +400,15 @@ static const u8 gUnknown_Debug_083C10AB[] = _("FHーOBJ07"); static const u8 gUnknown_Debug_083C10B4[] = _("FHーOBJ08"); static const struct MenuAction gUnknown_Debug_083C10BD[] = { - {gUnknown_Debug_083C106C, Config}, - {gUnknown_Debug_083C1075, Config}, - {gUnknown_Debug_083C107E, Config}, - {gUnknown_Debug_083C1087, Config}, - {gUnknown_Debug_083C1090, Config}, - {gUnknown_Debug_083C1099, Config}, - {gUnknown_Debug_083C10A2, Config}, - {gUnknown_Debug_083C10AB, Config}, - {gUnknown_Debug_083C10B4, Config} + {gUnknown_Debug_083C106C, DummyMenuAction}, + {gUnknown_Debug_083C1075, DummyMenuAction}, + {gUnknown_Debug_083C107E, DummyMenuAction}, + {gUnknown_Debug_083C1087, DummyMenuAction}, + {gUnknown_Debug_083C1090, DummyMenuAction}, + {gUnknown_Debug_083C1099, DummyMenuAction}, + {gUnknown_Debug_083C10A2, DummyMenuAction}, + {gUnknown_Debug_083C10AB, DummyMenuAction}, + {gUnknown_Debug_083C10B4, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1108[] = _("FH-OBJ09"); @@ -423,15 +422,15 @@ static const u8 gUnknown_Debug_083C1147[] = _(""); static const u8 gUnknown_Debug_083C1148[] = _(""); static const struct MenuAction gUnknown_Debug_083C1149[] = { - {gUnknown_Debug_083C1108, Config}, - {gUnknown_Debug_083C1111, Config}, - {gUnknown_Debug_083C111A, Config}, - {gUnknown_Debug_083C1123, Config}, - {gUnknown_Debug_083C112C, Config}, - {gUnknown_Debug_083C1135, Config}, - {gUnknown_Debug_083C113E, Config}, - {gUnknown_Debug_083C1147, Config}, - {gUnknown_Debug_083C1148, Config} + {gUnknown_Debug_083C1108, DummyMenuAction}, + {gUnknown_Debug_083C1111, DummyMenuAction}, + {gUnknown_Debug_083C111A, DummyMenuAction}, + {gUnknown_Debug_083C1123, DummyMenuAction}, + {gUnknown_Debug_083C112C, DummyMenuAction}, + {gUnknown_Debug_083C1135, DummyMenuAction}, + {gUnknown_Debug_083C113E, DummyMenuAction}, + {gUnknown_Debug_083C1147, DummyMenuAction}, + {gUnknown_Debug_083C1148, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1194[] = {9, 7}; @@ -460,15 +459,15 @@ static const u8 gUnknown_Debug_083C1206[] = _("FH-07"); static const u8 gUnknown_Debug_083C120C[] = _("FH-08"); static const struct MenuAction gUnknown_Debug_083C1212[] = { - {gUnknown_Debug_083C11DC, Config}, - {gUnknown_Debug_083C11E2, Config}, - {gUnknown_Debug_083C11E8, Config}, - {gUnknown_Debug_083C11EE, Config}, - {gUnknown_Debug_083C11F4, Config}, - {gUnknown_Debug_083C11FA, Config}, - {gUnknown_Debug_083C1200, Config}, - {gUnknown_Debug_083C1206, Config}, - {gUnknown_Debug_083C120C, Config} + {gUnknown_Debug_083C11DC, DummyMenuAction}, + {gUnknown_Debug_083C11E2, DummyMenuAction}, + {gUnknown_Debug_083C11E8, DummyMenuAction}, + {gUnknown_Debug_083C11EE, DummyMenuAction}, + {gUnknown_Debug_083C11F4, DummyMenuAction}, + {gUnknown_Debug_083C11FA, DummyMenuAction}, + {gUnknown_Debug_083C1200, DummyMenuAction}, + {gUnknown_Debug_083C1206, DummyMenuAction}, + {gUnknown_Debug_083C120C, DummyMenuAction} }; static const u8 gUnknown_Debug_083C125C[] = _("FHー09"); @@ -482,15 +481,15 @@ static const u8 gUnknown_Debug_083C1286[] = _(""); static const u8 gUnknown_Debug_083C1287[] = _(""); static const struct MenuAction gUnknown_Debug_083C1288[] = { - {gUnknown_Debug_083C125C, Config}, - {gUnknown_Debug_083C1262, Config}, - {gUnknown_Debug_083C1268, Config}, - {gUnknown_Debug_083C126E, Config}, - {gUnknown_Debug_083C1274, Config}, - {gUnknown_Debug_083C127A, Config}, - {gUnknown_Debug_083C1280, Config}, - {gUnknown_Debug_083C1286, Config}, - {gUnknown_Debug_083C1287, Config} + {gUnknown_Debug_083C125C, DummyMenuAction}, + {gUnknown_Debug_083C1262, DummyMenuAction}, + {gUnknown_Debug_083C1268, DummyMenuAction}, + {gUnknown_Debug_083C126E, DummyMenuAction}, + {gUnknown_Debug_083C1274, DummyMenuAction}, + {gUnknown_Debug_083C127A, DummyMenuAction}, + {gUnknown_Debug_083C1280, DummyMenuAction}, + {gUnknown_Debug_083C1286, DummyMenuAction}, + {gUnknown_Debug_083C1287, DummyMenuAction} }; static const u8 gUnknown_Debug_083C12D0[] = {9, 7}; @@ -532,14 +531,14 @@ static const u8 gUnknown_Debug_083C13C0[] = _("BATCH07ーGET"); static const u8 gUnknown_Debug_083C13CC[] = _("BATCH08ーGET"); static const struct MenuAction gUnknown_Debug_083C13D8[] = { - {gUnknown_Debug_083C1378, Config}, - {gUnknown_Debug_083C1384, Config}, - {gUnknown_Debug_083C1390, Config}, - {gUnknown_Debug_083C139C, Config}, - {gUnknown_Debug_083C13A8, Config}, - {gUnknown_Debug_083C13B4, Config}, - {gUnknown_Debug_083C13C0, Config}, - {gUnknown_Debug_083C13CC, Config} + {gUnknown_Debug_083C1378, DummyMenuAction}, + {gUnknown_Debug_083C1384, DummyMenuAction}, + {gUnknown_Debug_083C1390, DummyMenuAction}, + {gUnknown_Debug_083C139C, DummyMenuAction}, + {gUnknown_Debug_083C13A8, DummyMenuAction}, + {gUnknown_Debug_083C13B4, DummyMenuAction}, + {gUnknown_Debug_083C13C0, DummyMenuAction}, + {gUnknown_Debug_083C13CC, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1418[] = _("T101ARRIVE"); @@ -551,13 +550,13 @@ static const u8 gUnknown_Debug_083C144F[] = _("T106ARRIVE"); static const u8 gUnknown_Debug_083C145A[] = _("T107ARRIVE"); static const struct MenuAction gUnknown_Debug_083C1465[] = { - {gUnknown_Debug_083C1418, Config}, - {gUnknown_Debug_083C1423, Config}, - {gUnknown_Debug_083C142E, Config}, - {gUnknown_Debug_083C1439, Config}, - {gUnknown_Debug_083C1444, Config}, - {gUnknown_Debug_083C144F, Config}, - {gUnknown_Debug_083C145A, Config} + {gUnknown_Debug_083C1418, DummyMenuAction}, + {gUnknown_Debug_083C1423, DummyMenuAction}, + {gUnknown_Debug_083C142E, DummyMenuAction}, + {gUnknown_Debug_083C1439, DummyMenuAction}, + {gUnknown_Debug_083C1444, DummyMenuAction}, + {gUnknown_Debug_083C144F, DummyMenuAction}, + {gUnknown_Debug_083C145A, DummyMenuAction} }; static const u8 gUnknown_Debug_083C14A0[] = _("C101ARRIVE"); @@ -571,15 +570,15 @@ static const u8 gUnknown_Debug_083C14ED[] = _("C108ARRIVE"); static const u8 gUnknown_Debug_083C14F8[] = _("C109ARRIVE"); static const struct MenuAction gUnknown_Debug_083C1503[] = { - {gUnknown_Debug_083C14A0, Config}, - {gUnknown_Debug_083C14AB, Config}, - {gUnknown_Debug_083C14B6, Config}, - {gUnknown_Debug_083C14C1, Config}, - {gUnknown_Debug_083C14CC, Config}, - {gUnknown_Debug_083C14D7, Config}, - {gUnknown_Debug_083C14E2, Config}, - {gUnknown_Debug_083C14ED, Config}, - {gUnknown_Debug_083C14F8, Config} + {gUnknown_Debug_083C14A0, DummyMenuAction}, + {gUnknown_Debug_083C14AB, DummyMenuAction}, + {gUnknown_Debug_083C14B6, DummyMenuAction}, + {gUnknown_Debug_083C14C1, DummyMenuAction}, + {gUnknown_Debug_083C14CC, DummyMenuAction}, + {gUnknown_Debug_083C14D7, DummyMenuAction}, + {gUnknown_Debug_083C14E2, DummyMenuAction}, + {gUnknown_Debug_083C14ED, DummyMenuAction}, + {gUnknown_Debug_083C14F8, DummyMenuAction} }; static const u8 gUnknown_Debug_083C154C[] = _("SYSーPOKEMONーGET"); @@ -588,10 +587,10 @@ static const u8 gUnknown_Debug_083C156A[] = _("SYSーPOKEGEARーGET"); static const u8 gUnknown_Debug_083C157B[] = _("SYSーRIBBONーGET"); static const struct MenuAction gUnknown_Debug_083C158A[] = { - {gUnknown_Debug_083C154C, Config}, - {gUnknown_Debug_083C155C, Config}, - {gUnknown_Debug_083C156A, Config}, - {gUnknown_Debug_083C157B, Config} + {gUnknown_Debug_083C154C, DummyMenuAction}, + {gUnknown_Debug_083C155C, DummyMenuAction}, + {gUnknown_Debug_083C156A, DummyMenuAction}, + {gUnknown_Debug_083C157B, DummyMenuAction} }; static const u8 gUnknown_Debug_083C15AC[] = _("SYSーGAMEーCLEAR"); @@ -605,15 +604,15 @@ static const u8 gUnknown_Debug_083C1627[] = _("SYSーSAFARIーMODE"); static const u8 gUnknown_Debug_083C1637[] = _("SYSーCRUISEーMODE"); static const struct MenuAction gUnknown_Debug_083C1647[] = { - {gUnknown_Debug_083C15AC, Config}, - {gUnknown_Debug_083C15BB, Config}, - {gUnknown_Debug_083C15CA, Config}, - {gUnknown_Debug_083C15DD, Config}, - {gUnknown_Debug_083C15F0, Config}, - {gUnknown_Debug_083C1605, Config}, - {gUnknown_Debug_083C1616, Config}, - {gUnknown_Debug_083C1627, Config}, - {gUnknown_Debug_083C1637, Config} + {gUnknown_Debug_083C15AC, DummyMenuAction}, + {gUnknown_Debug_083C15BB, DummyMenuAction}, + {gUnknown_Debug_083C15CA, DummyMenuAction}, + {gUnknown_Debug_083C15DD, DummyMenuAction}, + {gUnknown_Debug_083C15F0, DummyMenuAction}, + {gUnknown_Debug_083C1605, DummyMenuAction}, + {gUnknown_Debug_083C1616, DummyMenuAction}, + {gUnknown_Debug_083C1627, DummyMenuAction}, + {gUnknown_Debug_083C1637, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1690[] = _("SYSーTVーHOME"); @@ -627,15 +626,15 @@ static const u8 gUnknown_Debug_083C16F2[] = _("SYSーCAVEーWONDER"); static const u8 gUnknown_Debug_083C1702[] = _("SYSーCAVEーBATTLE"); static const struct MenuAction gUnknown_Debug_083C1712[] = { - {gUnknown_Debug_083C1690, Config}, - {gUnknown_Debug_083C169C, Config}, - {gUnknown_Debug_083C16A9, Config}, - {gUnknown_Debug_083C16B5, Config}, - {gUnknown_Debug_083C16C7, Config}, - {gUnknown_Debug_083C16D6, Config}, - {gUnknown_Debug_083C16E4, Config}, - {gUnknown_Debug_083C16F2, Config}, - {gUnknown_Debug_083C1702, Config} + {gUnknown_Debug_083C1690, DummyMenuAction}, + {gUnknown_Debug_083C169C, DummyMenuAction}, + {gUnknown_Debug_083C16A9, DummyMenuAction}, + {gUnknown_Debug_083C16B5, DummyMenuAction}, + {gUnknown_Debug_083C16C7, DummyMenuAction}, + {gUnknown_Debug_083C16D6, DummyMenuAction}, + {gUnknown_Debug_083C16E4, DummyMenuAction}, + {gUnknown_Debug_083C16F2, DummyMenuAction}, + {gUnknown_Debug_083C1702, DummyMenuAction} }; static const u8 gUnknown_Debug_083C175C[] = _("SYSーSPECIALーZUKAN"); @@ -649,15 +648,15 @@ static const u8 gUnknown_Debug_083C17D4[] = _("SYSーTENJIーWAIT"); static const u8 gUnknown_Debug_083C17E3[] = _("SYSーTENJIーSORAWOTOBU"); static const struct MenuAction gUnknown_Debug_083C17F8[] = { - {gUnknown_Debug_083C175C, Config}, - {gUnknown_Debug_083C176E, Config}, - {gUnknown_Debug_083C177D, Config}, - {gUnknown_Debug_083C178C, Config}, - {gUnknown_Debug_083C179C, Config}, - {gUnknown_Debug_083C17AE, Config}, - {gUnknown_Debug_083C17C2, Config}, - {gUnknown_Debug_083C17D4, Config}, - {gUnknown_Debug_083C17E3, Config} + {gUnknown_Debug_083C175C, DummyMenuAction}, + {gUnknown_Debug_083C176E, DummyMenuAction}, + {gUnknown_Debug_083C177D, DummyMenuAction}, + {gUnknown_Debug_083C178C, DummyMenuAction}, + {gUnknown_Debug_083C179C, DummyMenuAction}, + {gUnknown_Debug_083C17AE, DummyMenuAction}, + {gUnknown_Debug_083C17C2, DummyMenuAction}, + {gUnknown_Debug_083C17D4, DummyMenuAction}, + {gUnknown_Debug_083C17E3, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1840[] = _("SYSーENCーUPーITEM"); @@ -671,15 +670,15 @@ static const u8 gUnknown_Debug_083C18B4[] = _(""); static const u8 gUnknown_Debug_083C18B5[] = _(""); static const struct MenuAction gUnknown_Debug_083C18B8[] = { - {gUnknown_Debug_083C1840, Config}, - {gUnknown_Debug_083C1850, Config}, - {gUnknown_Debug_083C1862, Config}, - {gUnknown_Debug_083C1873, Config}, - {gUnknown_Debug_083C1886, Config}, - {gUnknown_Debug_083C1895, Config}, - {gUnknown_Debug_083C18A0, Config}, - {gUnknown_Debug_083C18B4, Config}, - {gUnknown_Debug_083C18B5, Config} + {gUnknown_Debug_083C1840, DummyMenuAction}, + {gUnknown_Debug_083C1850, DummyMenuAction}, + {gUnknown_Debug_083C1862, DummyMenuAction}, + {gUnknown_Debug_083C1873, DummyMenuAction}, + {gUnknown_Debug_083C1886, DummyMenuAction}, + {gUnknown_Debug_083C1895, DummyMenuAction}, + {gUnknown_Debug_083C18A0, DummyMenuAction}, + {gUnknown_Debug_083C18B4, DummyMenuAction}, + {gUnknown_Debug_083C18B5, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1900[] = _("SYSーARRIVEーSUBMARINECAVE"); @@ -693,15 +692,15 @@ static const u8 gUnknown_Debug_083C196F[] = _(""); static const u8 gUnknown_Debug_083C1970[] = _(""); static const struct MenuAction gDebug_0x83C1974[] = { - {gUnknown_Debug_083C1900, Config}, - {gUnknown_Debug_083C1919, Config}, - {gUnknown_Debug_083C1930, Config}, - {gUnknown_Debug_083C1942, Config}, - {gUnknown_Debug_083C1954, Config}, - {gUnknown_Debug_083C196D, Config}, - {gUnknown_Debug_083C196E, Config}, - {gUnknown_Debug_083C196F, Config}, - {gUnknown_Debug_083C1970, Config} + {gUnknown_Debug_083C1900, DummyMenuAction}, + {gUnknown_Debug_083C1919, DummyMenuAction}, + {gUnknown_Debug_083C1930, DummyMenuAction}, + {gUnknown_Debug_083C1942, DummyMenuAction}, + {gUnknown_Debug_083C1954, DummyMenuAction}, + {gUnknown_Debug_083C196D, DummyMenuAction}, + {gUnknown_Debug_083C196E, DummyMenuAction}, + {gUnknown_Debug_083C196F, DummyMenuAction}, + {gUnknown_Debug_083C1970, DummyMenuAction} }; static const u8 gUnknown_Debug_083C19BC[] = {8, 7, 9, 4, 9, 9, 9, 7, 5}; @@ -728,8 +727,8 @@ static const u8 gUnknown_Debug_083C1A80[] = _("FVーBALL1ー78"); static const u8 gUnknown_Debug_083C1A8C[] = _("FVーBALL1ー133"); static const struct MenuAction gUnknown_Debug_083C1A9C[] = { - {gUnknown_Debug_083C1A80, Config}, - {gUnknown_Debug_083C1A8C, Config} + {gUnknown_Debug_083C1A80, DummyMenuAction}, + {gUnknown_Debug_083C1A8C, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1AAC[] = {2}; @@ -758,14 +757,14 @@ static const u8 gUnknown_Debug_083C1B5A[] = _("FTーGYMー07ーLEADER"); static const u8 gUnknown_Debug_083C1B6B[] = _("FTーGYMー08ーLEADER"); static const struct MenuAction gUnknown_Debug_083C1B7C[] = { - {gUnknown_Debug_083C1AF4, Config}, - {gUnknown_Debug_083C1B05, Config}, - {gUnknown_Debug_083C1B16, Config}, - {gUnknown_Debug_083C1B27, Config}, - {gUnknown_Debug_083C1B38, Config}, - {gUnknown_Debug_083C1B49, Config}, - {gUnknown_Debug_083C1B5A, Config}, - {gUnknown_Debug_083C1B6B, Config} + {gUnknown_Debug_083C1AF4, DummyMenuAction}, + {gUnknown_Debug_083C1B05, DummyMenuAction}, + {gUnknown_Debug_083C1B16, DummyMenuAction}, + {gUnknown_Debug_083C1B27, DummyMenuAction}, + {gUnknown_Debug_083C1B38, DummyMenuAction}, + {gUnknown_Debug_083C1B49, DummyMenuAction}, + {gUnknown_Debug_083C1B5A, DummyMenuAction}, + {gUnknown_Debug_083C1B6B, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1BBC[] = _("FTーSHITENー01"); @@ -774,16 +773,16 @@ static const u8 gUnknown_Debug_083C1BD6[] = _("FTーSHITENー03"); static const u8 gUnknown_Debug_083C1BE3[] = _("FTーSHITENー04"); static const struct MenuAction gUnknown_Debug_083C1BF0[] = { - {gUnknown_Debug_083C1BBC, Config}, - {gUnknown_Debug_083C1BC9, Config}, - {gUnknown_Debug_083C1BD6, Config}, - {gUnknown_Debug_083C1BE3, Config} + {gUnknown_Debug_083C1BBC, DummyMenuAction}, + {gUnknown_Debug_083C1BC9, DummyMenuAction}, + {gUnknown_Debug_083C1BD6, DummyMenuAction}, + {gUnknown_Debug_083C1BE3, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1C10[] = _("FTーMITSURUー01ーCAVEーD1301"); static const struct MenuAction gUnknown_Debug_083C1C2C[] = { - {gUnknown_Debug_083C1C10, Config} + {gUnknown_Debug_083C1C10, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1C34[] = {8, 4, 1}; @@ -826,15 +825,15 @@ static const u8 gUnknown_Debug_083C1DDB[] = _("FVーKAKUREー01ーFIELDーR119") static const u8 gUnknown_Debug_083C1DF3[] = _("FVーKAKUREー02ーFIELDーR119"); static const struct MenuAction gUnknown_Debug_083C1E0C[] = { - {gUnknown_Debug_083C1D30, Config}, - {gUnknown_Debug_083C1D4B, Config}, - {gUnknown_Debug_083C1D63, Config}, - {gUnknown_Debug_083C1D7B, Config}, - {gUnknown_Debug_083C1D93, Config}, - {gUnknown_Debug_083C1DAB, Config}, - {gUnknown_Debug_083C1DC3, Config}, - {gUnknown_Debug_083C1DDB, Config}, - {gUnknown_Debug_083C1DF3, Config} + {gUnknown_Debug_083C1D30, DummyMenuAction}, + {gUnknown_Debug_083C1D4B, DummyMenuAction}, + {gUnknown_Debug_083C1D63, DummyMenuAction}, + {gUnknown_Debug_083C1D7B, DummyMenuAction}, + {gUnknown_Debug_083C1D93, DummyMenuAction}, + {gUnknown_Debug_083C1DAB, DummyMenuAction}, + {gUnknown_Debug_083C1DC3, DummyMenuAction}, + {gUnknown_Debug_083C1DDB, DummyMenuAction}, + {gUnknown_Debug_083C1DF3, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1E54[] = _("FVーBALLー01ーC107ーR0501"); @@ -848,15 +847,15 @@ static const u8 gUnknown_Debug_083C1F01[] = _("FVーSUPPORTWー01ーT101ーR0202 static const u8 gUnknown_Debug_083C1F1B[] = _("FVーSUPPORTMー01ーT101ーR0102"); static const struct MenuAction gUnknown_Debug_083C1F38[] = { - {gUnknown_Debug_083C1E54, Config}, - {gUnknown_Debug_083C1E6A, Config}, - {gUnknown_Debug_083C1E84, Config}, - {gUnknown_Debug_083C1E9F, Config}, - {gUnknown_Debug_083C1EB7, Config}, - {gUnknown_Debug_083C1ED1, Config}, - {gUnknown_Debug_083C1EEB, Config}, - {gUnknown_Debug_083C1F01, Config}, - {gUnknown_Debug_083C1F1B, Config} + {gUnknown_Debug_083C1E54, DummyMenuAction}, + {gUnknown_Debug_083C1E6A, DummyMenuAction}, + {gUnknown_Debug_083C1E84, DummyMenuAction}, + {gUnknown_Debug_083C1E9F, DummyMenuAction}, + {gUnknown_Debug_083C1EB7, DummyMenuAction}, + {gUnknown_Debug_083C1ED1, DummyMenuAction}, + {gUnknown_Debug_083C1EEB, DummyMenuAction}, + {gUnknown_Debug_083C1F01, DummyMenuAction}, + {gUnknown_Debug_083C1F1B, DummyMenuAction} }; static const u8 gUnknown_Debug_083C1F80[] = _("FVーODAMAKIー01ーFIELDーR101"); @@ -870,15 +869,15 @@ static const u8 gUnknown_Debug_083C2038[] = _("FVーFIGHTERー01ーT106ーR0201" static const u8 gUnknown_Debug_083C2051[] = _("FVーFIGHTERー01ーFIELDーR116"); static const struct MenuAction gUnknown_Debug_083C206C[] = { - {gUnknown_Debug_083C1F80, Config}, - {gUnknown_Debug_083C1F99, Config}, - {gUnknown_Debug_083C1FB2, Config}, - {gUnknown_Debug_083C1FCE, Config}, - {gUnknown_Debug_083C1FEA, Config}, - {gUnknown_Debug_083C2006, Config}, - {gUnknown_Debug_083C201F, Config}, - {gUnknown_Debug_083C2038, Config}, - {gUnknown_Debug_083C2051, Config} + {gUnknown_Debug_083C1F80, DummyMenuAction}, + {gUnknown_Debug_083C1F99, DummyMenuAction}, + {gUnknown_Debug_083C1FB2, DummyMenuAction}, + {gUnknown_Debug_083C1FCE, DummyMenuAction}, + {gUnknown_Debug_083C1FEA, DummyMenuAction}, + {gUnknown_Debug_083C2006, DummyMenuAction}, + {gUnknown_Debug_083C201F, DummyMenuAction}, + {gUnknown_Debug_083C2038, DummyMenuAction}, + {gUnknown_Debug_083C2051, DummyMenuAction} }; static const u8 gUnknown_Debug_083C20B4[] = _("FVーMITSURUー01ーFIELDーC101"); @@ -892,15 +891,15 @@ static const u8 gUnknown_Debug_083C2163[] = _("FVーTENKIー01ーR119ーR101"); static const u8 gUnknown_Debug_083C2179[] = _("FVーTENKIー01ーR119ーR102"); static const struct MenuAction gUnknown_Debug_083C2190[] = { - {gUnknown_Debug_083C20B4, Config}, - {gUnknown_Debug_083C20CD, Config}, - {gUnknown_Debug_083C20E6, Config}, - {gUnknown_Debug_083C20FF, Config}, - {gUnknown_Debug_083C2118, Config}, - {gUnknown_Debug_083C2131, Config}, - {gUnknown_Debug_083C214A, Config}, - {gUnknown_Debug_083C2163, Config}, - {gUnknown_Debug_083C2179, Config} + {gUnknown_Debug_083C20B4, DummyMenuAction}, + {gUnknown_Debug_083C20CD, DummyMenuAction}, + {gUnknown_Debug_083C20E6, DummyMenuAction}, + {gUnknown_Debug_083C20FF, DummyMenuAction}, + {gUnknown_Debug_083C2118, DummyMenuAction}, + {gUnknown_Debug_083C2131, DummyMenuAction}, + {gUnknown_Debug_083C214A, DummyMenuAction}, + {gUnknown_Debug_083C2163, DummyMenuAction}, + {gUnknown_Debug_083C2179, DummyMenuAction} }; static const u8 gUnknown_Debug_083C21D8[] = _("FVーDAIGOー01ーCAVEーD0504"); @@ -911,12 +910,12 @@ static const u8 gUnknown_Debug_083C2234[] = _("FVーDAIGOー01ーFIELDーR120"); static const u8 gUnknown_Debug_083C224B[] = _("FVーDAIGOー01ーFIELDーR108"); static const struct MenuAction gUnknown_Debug_083C2264[] = { - {gUnknown_Debug_083C21D8, Config}, - {gUnknown_Debug_083C21EF, Config}, - {gUnknown_Debug_083C2206, Config}, - {gUnknown_Debug_083C221D, Config}, - {gUnknown_Debug_083C2234, Config}, - {gUnknown_Debug_083C224B, Config} + {gUnknown_Debug_083C21D8, DummyMenuAction}, + {gUnknown_Debug_083C21EF, DummyMenuAction}, + {gUnknown_Debug_083C2206, DummyMenuAction}, + {gUnknown_Debug_083C221D, DummyMenuAction}, + {gUnknown_Debug_083C2234, DummyMenuAction}, + {gUnknown_Debug_083C224B, DummyMenuAction} }; static const u8 gUnknown_Debug_083C2294[] = _("FVーPOKE1ー02ーCAVEーD1111"); @@ -930,15 +929,15 @@ static const u8 gUnknown_Debug_083C233D[] = _("FVーPOKEMONー01ーCAVEーD0201" static const u8 gUnknown_Debug_083C2356[] = _("FVーPOKEMONー01ーR104ーR0101"); static const struct MenuAction gUnknown_Debug_083C2370[] = { - {gUnknown_Debug_083C2294, Config}, - {gUnknown_Debug_083C22AB, Config}, - {gUnknown_Debug_083C22C2, Config}, - {gUnknown_Debug_083C22D9, Config}, - {gUnknown_Debug_083C22F0, Config}, - {gUnknown_Debug_083C230B, Config}, - {gUnknown_Debug_083C2326, Config}, - {gUnknown_Debug_083C233D, Config}, - {gUnknown_Debug_083C2356, Config} + {gUnknown_Debug_083C2294, DummyMenuAction}, + {gUnknown_Debug_083C22AB, DummyMenuAction}, + {gUnknown_Debug_083C22C2, DummyMenuAction}, + {gUnknown_Debug_083C22D9, DummyMenuAction}, + {gUnknown_Debug_083C22F0, DummyMenuAction}, + {gUnknown_Debug_083C230B, DummyMenuAction}, + {gUnknown_Debug_083C2326, DummyMenuAction}, + {gUnknown_Debug_083C233D, DummyMenuAction}, + {gUnknown_Debug_083C2356, DummyMenuAction} }; static const u8 gUnknown_Debug_083C23B8[] = _("FVーMAMAー01ーFIELDーT101"); @@ -952,15 +951,15 @@ static const u8 gUnknown_Debug_083C2459[] = _("FVーSUPPORTー02ーFIELDーR119" static const u8 gUnknown_Debug_083C2472[] = _("FVーSUPPORTー02ーFIELDーT104"); static const struct MenuAction gUnknown_Debug_083C248C[] = { - {gUnknown_Debug_083C23B8, Config}, - {gUnknown_Debug_083C23CE, Config}, - {gUnknown_Debug_083C23E8, Config}, - {gUnknown_Debug_083C23FE, Config}, - {gUnknown_Debug_083C2414, Config}, - {gUnknown_Debug_083C242A, Config}, - {gUnknown_Debug_083C2440, Config}, - {gUnknown_Debug_083C2459, Config}, - {gUnknown_Debug_083C2472, Config} + {gUnknown_Debug_083C23B8, DummyMenuAction}, + {gUnknown_Debug_083C23CE, DummyMenuAction}, + {gUnknown_Debug_083C23E8, DummyMenuAction}, + {gUnknown_Debug_083C23FE, DummyMenuAction}, + {gUnknown_Debug_083C2414, DummyMenuAction}, + {gUnknown_Debug_083C242A, DummyMenuAction}, + {gUnknown_Debug_083C2440, DummyMenuAction}, + {gUnknown_Debug_083C2459, DummyMenuAction}, + {gUnknown_Debug_083C2472, DummyMenuAction} }; static const u8 gUnknown_Debug_083C24D4[] = _("FVーHAGIー01ーFIELDーR104"); @@ -974,15 +973,15 @@ static const u8 gUnknown_Debug_083C256E[] = _("FVーHAGIー01ーFIELDーR116"); static const u8 gUnknown_Debug_083C2584[] = _("FVーHAGIー01ーSPーSHIP01"); static const struct MenuAction gUnknown_Debug_083C259C[] = { - {gUnknown_Debug_083C24D4, Config}, - {gUnknown_Debug_083C24EA, Config}, - {gUnknown_Debug_083C2500, Config}, - {gUnknown_Debug_083C2516, Config}, - {gUnknown_Debug_083C252C, Config}, - {gUnknown_Debug_083C2542, Config}, - {gUnknown_Debug_083C2558, Config}, - {gUnknown_Debug_083C256E, Config}, - {gUnknown_Debug_083C2584, Config} + {gUnknown_Debug_083C24D4, DummyMenuAction}, + {gUnknown_Debug_083C24EA, DummyMenuAction}, + {gUnknown_Debug_083C2500, DummyMenuAction}, + {gUnknown_Debug_083C2516, DummyMenuAction}, + {gUnknown_Debug_083C252C, DummyMenuAction}, + {gUnknown_Debug_083C2542, DummyMenuAction}, + {gUnknown_Debug_083C2558, DummyMenuAction}, + {gUnknown_Debug_083C256E, DummyMenuAction}, + {gUnknown_Debug_083C2584, DummyMenuAction} }; static const u8 gUnknown_Debug_083C25E4[] = _("FVーSUPPORTー01ーT101ーR0301"); @@ -996,15 +995,15 @@ static const u8 gUnknown_Debug_083C2693[] = _("FVーSUPPORTー01ーFIELDーT104" static const u8 gUnknown_Debug_083C26AC[] = _("FVーSUPPORTー01ーFIELDーT102"); static const struct MenuAction gUnknown_Debug_083C26C8[] = { - {gUnknown_Debug_083C25E4, Config}, - {gUnknown_Debug_083C25FD, Config}, - {gUnknown_Debug_083C2616, Config}, - {gUnknown_Debug_083C262F, Config}, - {gUnknown_Debug_083C2648, Config}, - {gUnknown_Debug_083C2661, Config}, - {gUnknown_Debug_083C267A, Config}, - {gUnknown_Debug_083C2693, Config}, - {gUnknown_Debug_083C26AC, Config} + {gUnknown_Debug_083C25E4, DummyMenuAction}, + {gUnknown_Debug_083C25FD, DummyMenuAction}, + {gUnknown_Debug_083C2616, DummyMenuAction}, + {gUnknown_Debug_083C262F, DummyMenuAction}, + {gUnknown_Debug_083C2648, DummyMenuAction}, + {gUnknown_Debug_083C2661, DummyMenuAction}, + {gUnknown_Debug_083C267A, DummyMenuAction}, + {gUnknown_Debug_083C2693, DummyMenuAction}, + {gUnknown_Debug_083C26AC, DummyMenuAction} }; static const u8 gUnknown_Debug_083C2710[] = {9, 9, 9, 9, 6, 9, 9, 9, 9}; @@ -1054,15 +1053,15 @@ static const u8 gUnknown_Debug_083C2909[] = _("FEーDEBONー01ーFIELDーC104"); static const u8 gUnknown_Debug_083C2920[] = _("FEーDEBONー02ーFIELDーC104"); static const struct MenuAction gUnknown_Debug_083C2938[] = { - {gUnknown_Debug_083C2870, Config}, - {gUnknown_Debug_083C287F, Config}, - {gUnknown_Debug_083C2897, Config}, - {gUnknown_Debug_083C28A6, Config}, - {gUnknown_Debug_083C28BF, Config}, - {gUnknown_Debug_083C28D8, Config}, - {gUnknown_Debug_083C28F1, Config}, - {gUnknown_Debug_083C2909, Config}, - {gUnknown_Debug_083C2920, Config} + {gUnknown_Debug_083C2870, DummyMenuAction}, + {gUnknown_Debug_083C287F, DummyMenuAction}, + {gUnknown_Debug_083C2897, DummyMenuAction}, + {gUnknown_Debug_083C28A6, DummyMenuAction}, + {gUnknown_Debug_083C28BF, DummyMenuAction}, + {gUnknown_Debug_083C28D8, DummyMenuAction}, + {gUnknown_Debug_083C28F1, DummyMenuAction}, + {gUnknown_Debug_083C2909, DummyMenuAction}, + {gUnknown_Debug_083C2920, DummyMenuAction} }; static const u8 gUnknown_Debug_083C2980[] = _("FEーCYCLEー01ーP01ーP01ーC103ーR0201"); @@ -1076,15 +1075,15 @@ static const u8 gUnknown_Debug_083C2A21[] = _("FEーIITURIZAOーGET"); static const u8 gUnknown_Debug_083C2A32[] = _("FEーSUGOITURIZAOーGET"); static const struct MenuAction gUnknown_Debug_083C2A48[] = { - {gUnknown_Debug_083C2980, Config}, - {gUnknown_Debug_083C299F, Config}, - {gUnknown_Debug_083C29BA, Config}, - {gUnknown_Debug_083C29D4, Config}, - {gUnknown_Debug_083C29EE, Config}, - {gUnknown_Debug_083C29FC, Config}, - {gUnknown_Debug_083C2A0C, Config}, - {gUnknown_Debug_083C2A21, Config}, - {gUnknown_Debug_083C2A32, Config} + {gUnknown_Debug_083C2980, DummyMenuAction}, + {gUnknown_Debug_083C299F, DummyMenuAction}, + {gUnknown_Debug_083C29BA, DummyMenuAction}, + {gUnknown_Debug_083C29D4, DummyMenuAction}, + {gUnknown_Debug_083C29EE, DummyMenuAction}, + {gUnknown_Debug_083C29FC, DummyMenuAction}, + {gUnknown_Debug_083C2A0C, DummyMenuAction}, + {gUnknown_Debug_083C2A21, DummyMenuAction}, + {gUnknown_Debug_083C2A32, DummyMenuAction} }; static const u8 gUnknown_Debug_083C2A90[] = _("FEーBOSSー01ーCAVEーD0701"); @@ -1098,15 +1097,15 @@ static const u8 gUnknown_Debug_083C2B27[] = _("FEーKASEKIーRETURN"); static const u8 gUnknown_Debug_083C2B38[] = _("FEーWINー01ーSPーSHIP01"); static const struct MenuAction gUnknown_Debug_083C2B4C[] = { - {gUnknown_Debug_083C2A90, Config}, - {gUnknown_Debug_083C2AA6, Config}, - {gUnknown_Debug_083C2AB8, Config}, - {gUnknown_Debug_083C2ACF, Config}, - {gUnknown_Debug_083C2AE6, Config}, - {gUnknown_Debug_083C2AFB, Config}, - {gUnknown_Debug_083C2B0F, Config}, - {gUnknown_Debug_083C2B27, Config}, - {gUnknown_Debug_083C2B38, Config} + {gUnknown_Debug_083C2A90, DummyMenuAction}, + {gUnknown_Debug_083C2AA6, DummyMenuAction}, + {gUnknown_Debug_083C2AB8, DummyMenuAction}, + {gUnknown_Debug_083C2ACF, DummyMenuAction}, + {gUnknown_Debug_083C2AE6, DummyMenuAction}, + {gUnknown_Debug_083C2AFB, DummyMenuAction}, + {gUnknown_Debug_083C2B0F, DummyMenuAction}, + {gUnknown_Debug_083C2B27, DummyMenuAction}, + {gUnknown_Debug_083C2B38, DummyMenuAction} }; static const u8 gUnknown_Debug_083C2B94[] = _("FEーMITSURUー01ーT106ーR0201"); @@ -1120,15 +1119,15 @@ static const u8 gUnknown_Debug_083C2C47[] = _("FEーDOORーOPENー04ーCAVEーD1 static const u8 gUnknown_Debug_083C2C62[] = _("FEーDOORーOPENー06ーCAVEーD1712"); static const struct MenuAction gUnknown_Debug_083C2C80[] = { - {gUnknown_Debug_083C2B94, Config}, - {gUnknown_Debug_083C2BAD, Config}, - {gUnknown_Debug_083C2BC6, Config}, - {gUnknown_Debug_083C2BDF, Config}, - {gUnknown_Debug_083C2BF8, Config}, - {gUnknown_Debug_083C2C11, Config}, - {gUnknown_Debug_083C2C2C, Config}, - {gUnknown_Debug_083C2C47, Config}, - {gUnknown_Debug_083C2C62, Config} + {gUnknown_Debug_083C2B94, DummyMenuAction}, + {gUnknown_Debug_083C2BAD, DummyMenuAction}, + {gUnknown_Debug_083C2BC6, DummyMenuAction}, + {gUnknown_Debug_083C2BDF, DummyMenuAction}, + {gUnknown_Debug_083C2BF8, DummyMenuAction}, + {gUnknown_Debug_083C2C11, DummyMenuAction}, + {gUnknown_Debug_083C2C2C, DummyMenuAction}, + {gUnknown_Debug_083C2C47, DummyMenuAction}, + {gUnknown_Debug_083C2C62, DummyMenuAction} }; static const u8 gUnknown_Debug_083C2CC8[] = _("FEーKARAKURI10ーSWITCHー01"); @@ -1142,15 +1141,15 @@ static const u8 gUnknown_Debug_083C2D66[] = _("FEーGYM07ーSWITCHー03"); static const u8 gUnknown_Debug_083C2D79[] = _("FEーGYM07ーSWITCHー04"); static const struct MenuAction gUnknown_Debug_083C2D8C[] = { - {gUnknown_Debug_083C2CC8, Config}, - {gUnknown_Debug_083C2CE0, Config}, - {gUnknown_Debug_083C2CF8, Config}, - {gUnknown_Debug_083C2D10, Config}, - {gUnknown_Debug_083C2D28, Config}, - {gUnknown_Debug_083C2D40, Config}, - {gUnknown_Debug_083C2D53, Config}, - {gUnknown_Debug_083C2D66, Config}, - {gUnknown_Debug_083C2D79, Config} + {gUnknown_Debug_083C2CC8, DummyMenuAction}, + {gUnknown_Debug_083C2CE0, DummyMenuAction}, + {gUnknown_Debug_083C2CF8, DummyMenuAction}, + {gUnknown_Debug_083C2D10, DummyMenuAction}, + {gUnknown_Debug_083C2D28, DummyMenuAction}, + {gUnknown_Debug_083C2D40, DummyMenuAction}, + {gUnknown_Debug_083C2D53, DummyMenuAction}, + {gUnknown_Debug_083C2D66, DummyMenuAction}, + {gUnknown_Debug_083C2D79, DummyMenuAction} }; static const u8 gUnknown_Debug_083C2DD4[] = _("FEーSUPPORTー01ーFIELDーR103"); @@ -1164,15 +1163,15 @@ static const u8 gUnknown_Debug_083C2E78[] = _("FEーODAMAKIー01ーP01ーT101ー static const u8 gUnknown_Debug_083C2E93[] = _("FEーPAPAー01ーP01ーC101ーR0201"); static const struct MenuAction gUnknown_Debug_083C2EB0[] = { - {gUnknown_Debug_083C2DD4, Config}, - {gUnknown_Debug_083C2DED, Config}, - {gUnknown_Debug_083C2E06, Config}, - {gUnknown_Debug_083C2E1F, Config}, - {gUnknown_Debug_083C2E38, Config}, - {gUnknown_Debug_083C2E51, Config}, - {gUnknown_Debug_083C2E6B, Config}, - {gUnknown_Debug_083C2E78, Config}, - {gUnknown_Debug_083C2E93, Config} + {gUnknown_Debug_083C2DD4, DummyMenuAction}, + {gUnknown_Debug_083C2DED, DummyMenuAction}, + {gUnknown_Debug_083C2E06, DummyMenuAction}, + {gUnknown_Debug_083C2E1F, DummyMenuAction}, + {gUnknown_Debug_083C2E38, DummyMenuAction}, + {gUnknown_Debug_083C2E51, DummyMenuAction}, + {gUnknown_Debug_083C2E6B, DummyMenuAction}, + {gUnknown_Debug_083C2E78, DummyMenuAction}, + {gUnknown_Debug_083C2E93, DummyMenuAction} }; static const u8 gUnknown_Debug_083C2EF8[] = _("FEーDAISUKIーGOODSーFLAG01"); @@ -1186,15 +1185,15 @@ static const u8 gUnknown_Debug_083C2FA8[] = _("FEーBALLー01ーP01ーSPーCONTE static const u8 gUnknown_Debug_083C2FC2[] = _("FEーWOMAN2ー01ーP01ーT101ーR0201"); static const struct MenuAction gUnknown_Debug_083C2FE0[] = { - {gUnknown_Debug_083C2EF8, Config}, - {gUnknown_Debug_083C2F10, Config}, - {gUnknown_Debug_083C2F28, Config}, - {gUnknown_Debug_083C2F40, Config}, - {gUnknown_Debug_083C2F58, Config}, - {gUnknown_Debug_083C2F70, Config}, - {gUnknown_Debug_083C2F8C, Config}, - {gUnknown_Debug_083C2FA8, Config}, - {gUnknown_Debug_083C2FC2, Config} + {gUnknown_Debug_083C2EF8, DummyMenuAction}, + {gUnknown_Debug_083C2F10, DummyMenuAction}, + {gUnknown_Debug_083C2F28, DummyMenuAction}, + {gUnknown_Debug_083C2F40, DummyMenuAction}, + {gUnknown_Debug_083C2F58, DummyMenuAction}, + {gUnknown_Debug_083C2F70, DummyMenuAction}, + {gUnknown_Debug_083C2F8C, DummyMenuAction}, + {gUnknown_Debug_083C2FA8, DummyMenuAction}, + {gUnknown_Debug_083C2FC2, DummyMenuAction} }; static const u8 gUnknown_Debug_083C3028[] = _("FEーSOUKOーOPENーCAVEーD1704"); @@ -1208,15 +1207,15 @@ static const u8 gUnknown_Debug_083C30D9[] = _("FEーDASHーSHOESーGET"); static const u8 gUnknown_Debug_083C30EB[] = _("FEーDEBONSUKOOPUーGET"); static const struct MenuAction gUnknown_Debug_083C3100[] = { - {gUnknown_Debug_083C3028, Config}, - {gUnknown_Debug_083C3041, Config}, - {gUnknown_Debug_083C305A, Config}, - {gUnknown_Debug_083C3073, Config}, - {gUnknown_Debug_083C308D, Config}, - {gUnknown_Debug_083C30A8, Config}, - {gUnknown_Debug_083C30C3, Config}, - {gUnknown_Debug_083C30D9, Config}, - {gUnknown_Debug_083C30EB, Config} + {gUnknown_Debug_083C3028, DummyMenuAction}, + {gUnknown_Debug_083C3041, DummyMenuAction}, + {gUnknown_Debug_083C305A, DummyMenuAction}, + {gUnknown_Debug_083C3073, DummyMenuAction}, + {gUnknown_Debug_083C308D, DummyMenuAction}, + {gUnknown_Debug_083C30A8, DummyMenuAction}, + {gUnknown_Debug_083C30C3, DummyMenuAction}, + {gUnknown_Debug_083C30D9, DummyMenuAction}, + {gUnknown_Debug_083C30EB, DummyMenuAction} }; static const u8 gUnknown_Debug_083C3148[] = _("FEーSTUDYM1ー01ーP01ーT101R0301"); @@ -1230,15 +1229,15 @@ static const u8 gUnknown_Debug_083C3191[] = _(""); static const u8 gUnknown_Debug_083C3192[] = _(""); static const struct MenuAction gUnknown_Debug_083C3194[] = { - {gUnknown_Debug_083C3148, Config}, - {gUnknown_Debug_083C3164, Config}, - {gUnknown_Debug_083C317E, Config}, - {gUnknown_Debug_083C318D, Config}, - {gUnknown_Debug_083C318E, Config}, - {gUnknown_Debug_083C318F, Config}, - {gUnknown_Debug_083C3190, Config}, - {gUnknown_Debug_083C3191, Config}, - {gUnknown_Debug_083C3192, Config} + {gUnknown_Debug_083C3148, DummyMenuAction}, + {gUnknown_Debug_083C3164, DummyMenuAction}, + {gUnknown_Debug_083C317E, DummyMenuAction}, + {gUnknown_Debug_083C318D, DummyMenuAction}, + {gUnknown_Debug_083C318E, DummyMenuAction}, + {gUnknown_Debug_083C318F, DummyMenuAction}, + {gUnknown_Debug_083C3190, DummyMenuAction}, + {gUnknown_Debug_083C3191, DummyMenuAction}, + {gUnknown_Debug_083C3192, DummyMenuAction} }; static const u8 gUnknown_Debug_083C31DC[] = {9, 9, 9, 9, 9, 9, 9, 9, 3}; @@ -1300,43 +1299,43 @@ static const u8 gUnknown_Debug_083C345E[] = _("WKーPOKELOTーRND2"); static const u8 gUnknown_Debug_083C346E[] = _("WKーBASEーMAPNO"); static const struct MenuAction gUnknown_Debug_083C347C[] = { - {gUnknown_Debug_083C32D4, Config}, - {gUnknown_Debug_083C32E6, Config}, - {gUnknown_Debug_083C32FA, Config} + {gUnknown_Debug_083C32D4, DummyMenuAction}, + {gUnknown_Debug_083C32E6, DummyMenuAction}, + {gUnknown_Debug_083C32FA, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_083C3494[] = { - {gUnknown_Debug_083C330E, Config}, - {gUnknown_Debug_083C3325, Config} + {gUnknown_Debug_083C330E, DummyMenuAction}, + {gUnknown_Debug_083C3325, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_083C34A4[] = { - {gUnknown_Debug_083C333A, Config}, - {gUnknown_Debug_083C3349, Config}, - {gUnknown_Debug_083C3356, Config}, - {gUnknown_Debug_083C336A, Config}, - {gUnknown_Debug_083C337A, Config}, - {gUnknown_Debug_083C3391, Config} + {gUnknown_Debug_083C333A, DummyMenuAction}, + {gUnknown_Debug_083C3349, DummyMenuAction}, + {gUnknown_Debug_083C3356, DummyMenuAction}, + {gUnknown_Debug_083C336A, DummyMenuAction}, + {gUnknown_Debug_083C337A, DummyMenuAction}, + {gUnknown_Debug_083C3391, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_083C34D4[] = { - {gUnknown_Debug_083C33A6, Config}, - {gUnknown_Debug_083C33B6, Config}, - {gUnknown_Debug_083C33C4, Config}, - {gUnknown_Debug_083C33D5, Config}, - {gUnknown_Debug_083C33E6, Config}, - {gUnknown_Debug_083C33F6, Config}, - {gUnknown_Debug_083C3401, Config}, - {gUnknown_Debug_083C340C, Config}, - {gUnknown_Debug_083C341E, Config} + {gUnknown_Debug_083C33A6, DummyMenuAction}, + {gUnknown_Debug_083C33B6, DummyMenuAction}, + {gUnknown_Debug_083C33C4, DummyMenuAction}, + {gUnknown_Debug_083C33D5, DummyMenuAction}, + {gUnknown_Debug_083C33E6, DummyMenuAction}, + {gUnknown_Debug_083C33F6, DummyMenuAction}, + {gUnknown_Debug_083C3401, DummyMenuAction}, + {gUnknown_Debug_083C340C, DummyMenuAction}, + {gUnknown_Debug_083C341E, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_083C351C[] = { - {gUnknown_Debug_083C342F, Config}, - {gUnknown_Debug_083C343F, Config}, - {gUnknown_Debug_083C344E, Config}, - {gUnknown_Debug_083C345E, Config}, - {gUnknown_Debug_083C346E, Config} + {gUnknown_Debug_083C342F, DummyMenuAction}, + {gUnknown_Debug_083C343F, DummyMenuAction}, + {gUnknown_Debug_083C344E, DummyMenuAction}, + {gUnknown_Debug_083C345E, DummyMenuAction}, + {gUnknown_Debug_083C346E, DummyMenuAction} }; static const u8 gUnknown_Debug_083C3544[] = {3, 2, 6, 9, 5}; @@ -1376,25 +1375,25 @@ static const u8 gUnknown_Debug_083C3681[] = _("OBJCHRWORK15"); static const u8 gUnknown_Debug_083C368E[] = _("OBJCHRWORK16"); static const struct MenuAction gUnknown_Debug_083C369C[] = { - {gUnknown_Debug_083C35D4, Config}, - {gUnknown_Debug_083C35E0, Config}, - {gUnknown_Debug_083C35EC, Config}, - {gUnknown_Debug_083C35F8, Config}, - {gUnknown_Debug_083C3604, Config}, - {gUnknown_Debug_083C3610, Config}, - {gUnknown_Debug_083C361C, Config}, - {gUnknown_Debug_083C3628, Config}, - {gUnknown_Debug_083C3634, Config} + {gUnknown_Debug_083C35D4, DummyMenuAction}, + {gUnknown_Debug_083C35E0, DummyMenuAction}, + {gUnknown_Debug_083C35EC, DummyMenuAction}, + {gUnknown_Debug_083C35F8, DummyMenuAction}, + {gUnknown_Debug_083C3604, DummyMenuAction}, + {gUnknown_Debug_083C3610, DummyMenuAction}, + {gUnknown_Debug_083C361C, DummyMenuAction}, + {gUnknown_Debug_083C3628, DummyMenuAction}, + {gUnknown_Debug_083C3634, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_083C36E4[] = { - {gUnknown_Debug_083C3640, Config}, - {gUnknown_Debug_083C364D, Config}, - {gUnknown_Debug_083C365A, Config}, - {gUnknown_Debug_083C3667, Config}, - {gUnknown_Debug_083C3674, Config}, - {gUnknown_Debug_083C3681, Config}, - {gUnknown_Debug_083C368E, Config} + {gUnknown_Debug_083C3640, DummyMenuAction}, + {gUnknown_Debug_083C364D, DummyMenuAction}, + {gUnknown_Debug_083C365A, DummyMenuAction}, + {gUnknown_Debug_083C3667, DummyMenuAction}, + {gUnknown_Debug_083C3674, DummyMenuAction}, + {gUnknown_Debug_083C3681, DummyMenuAction}, + {gUnknown_Debug_083C368E, DummyMenuAction} }; static const u8 gUnknown_Debug_083C371C[] = {9, 7}; @@ -1481,79 +1480,79 @@ static const u8 gUnknown_Debug_083C3A9D[] = _(""); static const u8 gUnknown_Debug_083C3A9E[] = _(""); static const struct MenuAction gUnknown_Debug_083C3AA0[] = { - {gUnknown_Debug_083C37AC, Config}, - {gUnknown_Debug_083C37C0, Config}, - {gUnknown_Debug_083C37CF, Config}, - {gUnknown_Debug_083C37E5, Config}, - {gUnknown_Debug_083C37FD, Config}, - {gUnknown_Debug_083C3811, Config}, - {gUnknown_Debug_083C3824, Config}, - {gUnknown_Debug_083C3825, Config} + {gUnknown_Debug_083C37AC, DummyMenuAction}, + {gUnknown_Debug_083C37C0, DummyMenuAction}, + {gUnknown_Debug_083C37CF, DummyMenuAction}, + {gUnknown_Debug_083C37E5, DummyMenuAction}, + {gUnknown_Debug_083C37FD, DummyMenuAction}, + {gUnknown_Debug_083C3811, DummyMenuAction}, + {gUnknown_Debug_083C3824, DummyMenuAction}, + {gUnknown_Debug_083C3825, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_83C3AE0[] = { - {gUnknown_Debug_083C3827, Config}, - {gUnknown_Debug_083C383B, Config}, - {gUnknown_Debug_083C384F, Config}, - {gUnknown_Debug_083C3863, Config}, - {gUnknown_Debug_083C3875, Config}, - {gUnknown_Debug_083C3885, Config}, - {gUnknown_Debug_083C3886, Config}, - {gUnknown_Debug_083C3887, Config}, - {gUnknown_Debug_083C3888, Config} + {gUnknown_Debug_083C3827, DummyMenuAction}, + {gUnknown_Debug_083C383B, DummyMenuAction}, + {gUnknown_Debug_083C384F, DummyMenuAction}, + {gUnknown_Debug_083C3863, DummyMenuAction}, + {gUnknown_Debug_083C3875, DummyMenuAction}, + {gUnknown_Debug_083C3885, DummyMenuAction}, + {gUnknown_Debug_083C3886, DummyMenuAction}, + {gUnknown_Debug_083C3887, DummyMenuAction}, + {gUnknown_Debug_083C3888, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_83C3B28[] = { - {gUnknown_Debug_083C3889, Config}, - {gUnknown_Debug_083C389D, Config}, - {gUnknown_Debug_083C38B1, Config}, - {gUnknown_Debug_083C38C5, Config}, - {gUnknown_Debug_083C38D9, Config}, - {gUnknown_Debug_083C38ED, Config}, - {gUnknown_Debug_083C3901, Config}, - {gUnknown_Debug_083C3915, Config}, - {gUnknown_Debug_083C3929, Config} + {gUnknown_Debug_083C3889, DummyMenuAction}, + {gUnknown_Debug_083C389D, DummyMenuAction}, + {gUnknown_Debug_083C38B1, DummyMenuAction}, + {gUnknown_Debug_083C38C5, DummyMenuAction}, + {gUnknown_Debug_083C38D9, DummyMenuAction}, + {gUnknown_Debug_083C38ED, DummyMenuAction}, + {gUnknown_Debug_083C3901, DummyMenuAction}, + {gUnknown_Debug_083C3915, DummyMenuAction}, + {gUnknown_Debug_083C3929, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_83C3B70[] = { - {gUnknown_Debug_083C3940, Config}, - {gUnknown_Debug_083C3954, Config}, - {gUnknown_Debug_083C3968, Config}, - {gUnknown_Debug_083C3969, Config}, - {gUnknown_Debug_083C396A, Config}, - {gUnknown_Debug_083C396B, Config}, - {gUnknown_Debug_083C396C, Config}, - {gUnknown_Debug_083C396D, Config}, - {gUnknown_Debug_083C396E, Config} + {gUnknown_Debug_083C3940, DummyMenuAction}, + {gUnknown_Debug_083C3954, DummyMenuAction}, + {gUnknown_Debug_083C3968, DummyMenuAction}, + {gUnknown_Debug_083C3969, DummyMenuAction}, + {gUnknown_Debug_083C396A, DummyMenuAction}, + {gUnknown_Debug_083C396B, DummyMenuAction}, + {gUnknown_Debug_083C396C, DummyMenuAction}, + {gUnknown_Debug_083C396D, DummyMenuAction}, + {gUnknown_Debug_083C396E, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_83C3BB8[] = { - {gUnknown_Debug_083C396F, Config}, - {gUnknown_Debug_083C3984, Config}, - {gUnknown_Debug_083C3997, Config}, - {gUnknown_Debug_083C39A9, Config}, - {gUnknown_Debug_083C39BC, Config}, - {gUnknown_Debug_083C39D3, Config}, - {gUnknown_Debug_083C39E8, Config}, - {gUnknown_Debug_083C39F9, Config}, - {gUnknown_Debug_083C3A0E, Config} + {gUnknown_Debug_083C396F, DummyMenuAction}, + {gUnknown_Debug_083C3984, DummyMenuAction}, + {gUnknown_Debug_083C3997, DummyMenuAction}, + {gUnknown_Debug_083C39A9, DummyMenuAction}, + {gUnknown_Debug_083C39BC, DummyMenuAction}, + {gUnknown_Debug_083C39D3, DummyMenuAction}, + {gUnknown_Debug_083C39E8, DummyMenuAction}, + {gUnknown_Debug_083C39F9, DummyMenuAction}, + {gUnknown_Debug_083C3A0E, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_83C3C00[] = { - {gUnknown_Debug_083C3A22, Config}, - {gUnknown_Debug_083C3A36, Config}, - {gUnknown_Debug_083C3A4D, Config}, - {gUnknown_Debug_083C3A65, Config}, - {gUnknown_Debug_083C3A7B, Config}, - {gUnknown_Debug_083C3A8D, Config}, - {gUnknown_Debug_083C3A9C, Config}, - {gUnknown_Debug_083C3A9D, Config}, - {gUnknown_Debug_083C3A9E, Config} + {gUnknown_Debug_083C3A22, DummyMenuAction}, + {gUnknown_Debug_083C3A36, DummyMenuAction}, + {gUnknown_Debug_083C3A4D, DummyMenuAction}, + {gUnknown_Debug_083C3A65, DummyMenuAction}, + {gUnknown_Debug_083C3A7B, DummyMenuAction}, + {gUnknown_Debug_083C3A8D, DummyMenuAction}, + {gUnknown_Debug_083C3A9C, DummyMenuAction}, + {gUnknown_Debug_083C3A9D, DummyMenuAction}, + {gUnknown_Debug_083C3A9E, DummyMenuAction} }; -static const u8 gUnknown_Debug_083C3C48[] = {6, 5, 9, 2, 9, 6}; +static const u8 sControlWorks_SaveWork_CountsArray[] = {6, 5, 9, 2, 9, 6}; -static const u16 gUnknown_Debug_83C3C4E[][9] = { +static const u16 sControlWorks_SaveWork_ItemArrays[][9] = { {VAR_LINK_CONTEST_ROOM_STATE, VAR_CABLE_CLUB_STATE, VAR_CONTEST_LOCATION, VAR_CONTEST_PRIZE_PICKUP, VAR_LITTLEROOT_INTRO_STATE, VAR_PORTHOLE_STATE}, {VAR_TRICK_HOUSE_ENTRANCE_STATE_2, VAR_TRICK_HOUSE_PRIZE_PICKUP, VAR_TRICK_HOUSE_STATE, VAR_TRICK_HOUSE_ENTRANCE_STATE_3, VAR_TRICK_HOUSE_ENTRANCE_STATE}, {VAR_TRICK_HOUSE_PUZZLE_1_STATE, VAR_TRICK_HOUSE_PUZZLE_2_STATE, VAR_TRICK_HOUSE_PUZZLE_3_STATE, VAR_TRICK_HOUSE_PUZZLE_4_STATE, VAR_TRICK_HOUSE_PUZZLE_5_STATE, VAR_TRICK_HOUSE_PUZZLE_6_STATE, VAR_TRICK_HOUSE_PUZZLE_7_STATE, VAR_TRICK_HOUSE_PUZZLE_8_STATE, VAR_TRICK_HOUSE_PUZZLE_7_STATE_2}, @@ -1562,26 +1561,26 @@ static const u16 gUnknown_Debug_83C3C4E[][9] = { {VAR_WEATHER_INSTITUTE_STATE, VAR_SLATEPORT_FAN_CLUB_STATE, 0x40BB, VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, VAR_GAME_CORNER_STATE, VAR_WHICH_FOSSIL_REVIVED} }; -static const u8 gUnknown_Debug_083C3CBA[] = _("タウン"); -static const u8 gUnknown_Debug_083C3CBE[] = _("シティ"); -static const u8 gUnknown_Debug_083C3CC2[] = _("ロード101ー109"); -static const u8 gUnknown_Debug_083C3CCD[] = _("ロード110ー118"); -static const u8 gUnknown_Debug_083C3CD8[] = _("ロード119ー127"); -static const u8 gUnknown_Debug_083C3CE3[] = _("ロード128ー134"); -static const u8 gUnknown_Debug_083C3CEE[] = _("ルーム タウン"); -static const u8 gUnknown_Debug_083C3CF6[] = _("ルーム シティ"); -static const u8 gUnknown_Debug_083C3CFE[] = _("ダンジョンない"); - -static const struct MenuAction gUnknown_Debug_083C3D08[] = { - {gUnknown_Debug_083C3CBA, debug_sub_808DBA0}, - {gUnknown_Debug_083C3CBE, debug_sub_808DBF8}, - {gUnknown_Debug_083C3CC2, debug_sub_808DC50}, - {gUnknown_Debug_083C3CCD, debug_sub_808DCA8}, - {gUnknown_Debug_083C3CD8, debug_sub_808DD00}, - {gUnknown_Debug_083C3CE3, debug_sub_808DD58}, - {gUnknown_Debug_083C3CEE, debug_sub_808DDB0}, - {gUnknown_Debug_083C3CF6, debug_sub_808DE08}, - {gUnknown_Debug_083C3CFE, debug_sub_808DE60} +static const u8 sString_Town[] = _("タウン"); +static const u8 sString_City[] = _("シティ"); +static const u8 sString_Route_101_to_109[] = _("ロード101ー109"); +static const u8 sString_Route_110_to_118[] = _("ロード110ー118"); +static const u8 sString_Route_119_to_127[] = _("ロード119ー127"); +static const u8 sString_Route_128_to_134[] = _("ロード128ー134"); +static const u8 sString_Room_Town[] = _("ルーム タウン"); +static const u8 sString_Room_City[] = _("ルーム シティ"); +static const u8 sString_Dungeon_nai[] = _("ダンジョンない"); + +static const struct MenuAction sMenuAction_ControlWorks_SaveWork[] = { + {sString_Town, ControlWorks_SaveWork_Town_InitSubsubmenu}, + {sString_City, ControlWorks_SaveWork_City_InitSubsubmenu}, + {sString_Route_101_to_109, ControlWorks_SaveWork_Route101To109_InitSubsubmenu}, + {sString_Route_110_to_118, ControlWorks_SaveWork_Route110To118_InitSubsubmenu}, + {sString_Route_119_to_127, ControlWorks_SaveWork_Route119To127_InitSubsubmenu}, + {sString_Route_128_to_134, ControlWorks_SaveWork_Route128To134_InitSubsubmenu}, + {sString_Room_Town, ControlWorks_SaveWork_RoomTown_InitSubsubmenu}, + {sString_Room_City, ControlWorks_SaveWork_RoomCity_InitSubsubmenu}, + {sString_Dungeon_nai, ControlWorks_SaveWork_Dungeon_InitSubsubmenu} }; static const u8 gUnknown_Debug_083C3D50[] = _("WKーSCENEーFIELDーT101"); @@ -1668,105 +1667,105 @@ static const u8 gUnknown_Debug_083C42ED[] = _("WKーSCENEーCAVEーD1602"); static const u8 gUnknown_Debug_083C4301[] = _("WKーSCENEーCAVEーD0101"); static const u8 gUnknown_Debug_083C4315[] = _("WKーSCENEーCAVEーD1301"); -static const struct MenuAction gUnknown_Debug_083C432C[] = { - {gUnknown_Debug_083C3D50, Config}, - {gUnknown_Debug_083C3D64, Config}, - {gUnknown_Debug_083C3D78, Config}, - {gUnknown_Debug_083C3D8C, Config}, - {gUnknown_Debug_083C3DA0, Config}, - {gUnknown_Debug_083C3DAE, Config}, - {gUnknown_Debug_083C3DC2, Config}, - {gUnknown_Debug_083C3DD6, Config} +static const struct MenuAction sMenuActions_SaveWork_Town[] = { + {gUnknown_Debug_083C3D50, DummyMenuAction}, + {gUnknown_Debug_083C3D64, DummyMenuAction}, + {gUnknown_Debug_083C3D78, DummyMenuAction}, + {gUnknown_Debug_083C3D8C, DummyMenuAction}, + {gUnknown_Debug_083C3DA0, DummyMenuAction}, + {gUnknown_Debug_083C3DAE, DummyMenuAction}, + {gUnknown_Debug_083C3DC2, DummyMenuAction}, + {gUnknown_Debug_083C3DD6, DummyMenuAction} }; -static const struct MenuAction gUnknown_Debug_083C436C[] = { - {gUnknown_Debug_083C3DED, Config}, - {gUnknown_Debug_083C3E01, Config}, - {gUnknown_Debug_083C3E15, Config}, - {gUnknown_Debug_083C3E29, Config}, - {gUnknown_Debug_083C3E3D, Config}, - {gUnknown_Debug_083C3E51, Config}, - {gUnknown_Debug_083C3E65, Config}, - {gUnknown_Debug_083C3E79, Config}, - {gUnknown_Debug_083C3E8D, Config} +static const struct MenuAction sMenuActions_SaveWork_City[] = { + {gUnknown_Debug_083C3DED, DummyMenuAction}, + {gUnknown_Debug_083C3E01, DummyMenuAction}, + {gUnknown_Debug_083C3E15, DummyMenuAction}, + {gUnknown_Debug_083C3E29, DummyMenuAction}, + {gUnknown_Debug_083C3E3D, DummyMenuAction}, + {gUnknown_Debug_083C3E51, DummyMenuAction}, + {gUnknown_Debug_083C3E65, DummyMenuAction}, + {gUnknown_Debug_083C3E79, DummyMenuAction}, + {gUnknown_Debug_083C3E8D, DummyMenuAction} }; -static const struct MenuAction gUnknown_Debug_083C43B4[] = { - {gUnknown_Debug_083C3EA1, Config}, - {gUnknown_Debug_083C3EB5, Config}, - {gUnknown_Debug_083C3EC9, Config}, - {gUnknown_Debug_083C3EDD, Config}, - {gUnknown_Debug_083C3EF1, Config}, - {gUnknown_Debug_083C3F05, Config}, - {gUnknown_Debug_083C3F19, Config}, - {gUnknown_Debug_083C3F2D, Config}, - {gUnknown_Debug_083C3F41, Config} +static const struct MenuAction sMenuActions_SaveWork_Route101To109[] = { + {gUnknown_Debug_083C3EA1, DummyMenuAction}, + {gUnknown_Debug_083C3EB5, DummyMenuAction}, + {gUnknown_Debug_083C3EC9, DummyMenuAction}, + {gUnknown_Debug_083C3EDD, DummyMenuAction}, + {gUnknown_Debug_083C3EF1, DummyMenuAction}, + {gUnknown_Debug_083C3F05, DummyMenuAction}, + {gUnknown_Debug_083C3F19, DummyMenuAction}, + {gUnknown_Debug_083C3F2D, DummyMenuAction}, + {gUnknown_Debug_083C3F41, DummyMenuAction} }; -static const struct MenuAction gUnknown_Debug_083C43FC[] = { - {gUnknown_Debug_083C3F55, Config}, - {gUnknown_Debug_083C3F69, Config}, - {gUnknown_Debug_083C3F7D, Config}, - {gUnknown_Debug_083C3F91, Config}, - {gUnknown_Debug_083C3FA5, Config}, - {gUnknown_Debug_083C3FB9, Config}, - {gUnknown_Debug_083C3FCD, Config}, - {gUnknown_Debug_083C3FE1, Config}, - {gUnknown_Debug_083C3FF5, Config} +static const struct MenuAction sMenuActions_SaveWork_Route110To118[] = { + {gUnknown_Debug_083C3F55, DummyMenuAction}, + {gUnknown_Debug_083C3F69, DummyMenuAction}, + {gUnknown_Debug_083C3F7D, DummyMenuAction}, + {gUnknown_Debug_083C3F91, DummyMenuAction}, + {gUnknown_Debug_083C3FA5, DummyMenuAction}, + {gUnknown_Debug_083C3FB9, DummyMenuAction}, + {gUnknown_Debug_083C3FCD, DummyMenuAction}, + {gUnknown_Debug_083C3FE1, DummyMenuAction}, + {gUnknown_Debug_083C3FF5, DummyMenuAction} }; -static const struct MenuAction gUnknown_Debug_083C4444[] = { - {gUnknown_Debug_083C4009, Config}, - {gUnknown_Debug_083C401D, Config}, - {gUnknown_Debug_083C4031, Config}, - {gUnknown_Debug_083C4045, Config}, - {gUnknown_Debug_083C4059, Config}, - {gUnknown_Debug_083C406D, Config}, - {gUnknown_Debug_083C4081, Config}, - {gUnknown_Debug_083C4095, Config}, - {gUnknown_Debug_083C40A9, Config} +static const struct MenuAction sMenuActions_SaveWork_Route119To127[] = { + {gUnknown_Debug_083C4009, DummyMenuAction}, + {gUnknown_Debug_083C401D, DummyMenuAction}, + {gUnknown_Debug_083C4031, DummyMenuAction}, + {gUnknown_Debug_083C4045, DummyMenuAction}, + {gUnknown_Debug_083C4059, DummyMenuAction}, + {gUnknown_Debug_083C406D, DummyMenuAction}, + {gUnknown_Debug_083C4081, DummyMenuAction}, + {gUnknown_Debug_083C4095, DummyMenuAction}, + {gUnknown_Debug_083C40A9, DummyMenuAction} }; -static const struct MenuAction gUnknown_Debug_083C448C[] = { - {gUnknown_Debug_083C40BD, Config}, - {gUnknown_Debug_083C40D1, Config}, - {gUnknown_Debug_083C40E5, Config}, - {gUnknown_Debug_083C40F9, Config}, - {gUnknown_Debug_083C410D, Config}, - {gUnknown_Debug_083C4121, Config}, - {gUnknown_Debug_083C4135, Config} +static const struct MenuAction sMenuActions_SaveWork_Route128To134[] = { + {gUnknown_Debug_083C40BD, DummyMenuAction}, + {gUnknown_Debug_083C40D1, DummyMenuAction}, + {gUnknown_Debug_083C40E5, DummyMenuAction}, + {gUnknown_Debug_083C40F9, DummyMenuAction}, + {gUnknown_Debug_083C410D, DummyMenuAction}, + {gUnknown_Debug_083C4121, DummyMenuAction}, + {gUnknown_Debug_083C4135, DummyMenuAction} }; -static const struct MenuAction gUnknown_Debug_83C44C4[] = { - {gUnknown_Debug_083C4149, Config}, - {gUnknown_Debug_083C415D, Config}, - {gUnknown_Debug_083C4171, Config}, - {gUnknown_Debug_083C4185, Config}, - {gUnknown_Debug_083C4199, Config} +static const struct MenuAction sMenuActions_SaveWork_RoomTown[] = { + {gUnknown_Debug_083C4149, DummyMenuAction}, + {gUnknown_Debug_083C415D, DummyMenuAction}, + {gUnknown_Debug_083C4171, DummyMenuAction}, + {gUnknown_Debug_083C4185, DummyMenuAction}, + {gUnknown_Debug_083C4199, DummyMenuAction} }; -static const struct MenuAction gUnknown_Debug_83C44EC[] = { - {gUnknown_Debug_083C41C1, Config}, - {gUnknown_Debug_083C41D5, Config}, - {gUnknown_Debug_083C41E9, Config}, - {gUnknown_Debug_083C41FD, Config}, - {gUnknown_Debug_083C4211, Config}, - {gUnknown_Debug_083C4225, Config}, - {gUnknown_Debug_083C4239, Config}, - {gUnknown_Debug_083C424D, Config}, - {gUnknown_Debug_083C4261, Config} +static const struct MenuAction sMenuActions_SaveWork_RoomCity[] = { + {gUnknown_Debug_083C41C1, DummyMenuAction}, + {gUnknown_Debug_083C41D5, DummyMenuAction}, + {gUnknown_Debug_083C41E9, DummyMenuAction}, + {gUnknown_Debug_083C41FD, DummyMenuAction}, + {gUnknown_Debug_083C4211, DummyMenuAction}, + {gUnknown_Debug_083C4225, DummyMenuAction}, + {gUnknown_Debug_083C4239, DummyMenuAction}, + {gUnknown_Debug_083C424D, DummyMenuAction}, + {gUnknown_Debug_083C4261, DummyMenuAction} }; -static const struct MenuAction gUnknown_Debug_083C4534[] = { - {gUnknown_Debug_083C4275, Config}, - {gUnknown_Debug_083C4289, Config}, - {gUnknown_Debug_083C429D, Config}, - {gUnknown_Debug_083C42B1, Config}, - {gUnknown_Debug_083C42C5, Config}, - {gUnknown_Debug_083C42D9, Config}, - {gUnknown_Debug_083C42ED, Config}, - {gUnknown_Debug_083C4301, Config}, - {gUnknown_Debug_083C4315, Config} +static const struct MenuAction sMenuActions_SaveWork_Dungeon[] = { + {gUnknown_Debug_083C4275, DummyMenuAction}, + {gUnknown_Debug_083C4289, DummyMenuAction}, + {gUnknown_Debug_083C429D, DummyMenuAction}, + {gUnknown_Debug_083C42B1, DummyMenuAction}, + {gUnknown_Debug_083C42C5, DummyMenuAction}, + {gUnknown_Debug_083C42D9, DummyMenuAction}, + {gUnknown_Debug_083C42ED, DummyMenuAction}, + {gUnknown_Debug_083C4301, DummyMenuAction}, + {gUnknown_Debug_083C4315, DummyMenuAction} }; static const u8 gUnknown_Debug_083C457C[] = {8, 9, 9, 9, 9, 7, 6, 9, 9}; @@ -1810,25 +1809,25 @@ static const u8 gUnknown_Debug_083C46F2[] = _("LOCALWORK14"); static const u8 gUnknown_Debug_083C46FE[] = _("LOCALWORK15"); static const struct MenuAction gUnknown_Debug_083C470C[] = { - {gUnknown_Debug_083C4654, Config}, - {gUnknown_Debug_083C465F, Config}, - {gUnknown_Debug_083C466A, Config}, - {gUnknown_Debug_083C4675, Config}, - {gUnknown_Debug_083C4680, Config}, - {gUnknown_Debug_083C468B, Config}, - {gUnknown_Debug_083C4696, Config}, - {gUnknown_Debug_083C46A1, Config}, - {gUnknown_Debug_083C46AC, Config} + {gUnknown_Debug_083C4654, DummyMenuAction}, + {gUnknown_Debug_083C465F, DummyMenuAction}, + {gUnknown_Debug_083C466A, DummyMenuAction}, + {gUnknown_Debug_083C4675, DummyMenuAction}, + {gUnknown_Debug_083C4680, DummyMenuAction}, + {gUnknown_Debug_083C468B, DummyMenuAction}, + {gUnknown_Debug_083C4696, DummyMenuAction}, + {gUnknown_Debug_083C46A1, DummyMenuAction}, + {gUnknown_Debug_083C46AC, DummyMenuAction} }; static const struct MenuAction gUnknown_Debug_083C4754C[] = { - {gUnknown_Debug_083C46B7, Config}, - {gUnknown_Debug_083C46C2, Config}, - {gUnknown_Debug_083C46CE, Config}, - {gUnknown_Debug_083C46DA, Config}, - {gUnknown_Debug_083C46E6, Config}, - {gUnknown_Debug_083C46F2, Config}, - {gUnknown_Debug_083C46FE, Config} + {gUnknown_Debug_083C46B7, DummyMenuAction}, + {gUnknown_Debug_083C46C2, DummyMenuAction}, + {gUnknown_Debug_083C46CE, DummyMenuAction}, + {gUnknown_Debug_083C46DA, DummyMenuAction}, + {gUnknown_Debug_083C46E6, DummyMenuAction}, + {gUnknown_Debug_083C46F2, DummyMenuAction}, + {gUnknown_Debug_083C46FE, DummyMenuAction} }; static const u8 gUnknown_Debug_083C478C[] = {9, 7}; @@ -1849,14 +1848,14 @@ static const u8 gUnknown_Debug_083C47E2[] = _("Scene7"); static const u8 gUnknown_Debug_083C47E9[] = _("Scene8"); static const struct MenuAction gUnknown_Debug_083C47F0[] = { - {gUnknown_Debug_083C47B8, Config}, - {gUnknown_Debug_083C47BF, Config}, - {gUnknown_Debug_083C47C6, Config}, - {gUnknown_Debug_083C47CD, Config}, - {gUnknown_Debug_083C47D4, Config}, - {gUnknown_Debug_083C47DB, Config}, - {gUnknown_Debug_083C47E2, Config}, - {gUnknown_Debug_083C47E9, Config} + {gUnknown_Debug_083C47B8, DummyMenuAction}, + {gUnknown_Debug_083C47BF, DummyMenuAction}, + {gUnknown_Debug_083C47C6, DummyMenuAction}, + {gUnknown_Debug_083C47CD, DummyMenuAction}, + {gUnknown_Debug_083C47D4, DummyMenuAction}, + {gUnknown_Debug_083C47DB, DummyMenuAction}, + {gUnknown_Debug_083C47E2, DummyMenuAction}, + {gUnknown_Debug_083C47E9, DummyMenuAction} }; static const u8 gUnknown_Debug_083C4830[] = _("Trick Master"); @@ -1868,11 +1867,11 @@ static const u8 gUnknown_Debug_083C486A[] = _("Rig a trick"); static const u8 gUnknown_Debug_083C4876[] = _("MASTER is gone"); static const struct MenuAction gUnknown_Debug_083C4888[] = { - {gUnknown_Debug_083C483D, Config}, - {gUnknown_Debug_083C484B, Config}, - {gUnknown_Debug_083C485C, Config}, - {gUnknown_Debug_083C486A, Config}, - {gUnknown_Debug_083C4876, Config} + {gUnknown_Debug_083C483D, DummyMenuAction}, + {gUnknown_Debug_083C484B, DummyMenuAction}, + {gUnknown_Debug_083C485C, DummyMenuAction}, + {gUnknown_Debug_083C486A, DummyMenuAction}, + {gUnknown_Debug_083C4876, DummyMenuAction} }; static const u8 sDummyNickname[] = _("PMNICKNAME"); @@ -1880,7 +1879,7 @@ static const u8 sDummyTrainerName[] = _("BREEDER"); bool8 InitTomomichiDebugWindow(void) { - debug_sub_808B874(); + InitDebugWindow(); return FALSE; } @@ -1889,17 +1888,17 @@ static void debug_sub_808B868(void) c2_exit_to_overworld_1_continue_scripts_restart_music(); } -static bool8 debug_sub_808B874(void) +static bool8 InitDebugWindow(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 13, 15); - Menu_PrintItems(1, 1, ARRAY_COUNT(gUnknown_Debug_083C0CBA), gUnknown_Debug_083C0CBA); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0CBA), sTopMenuCursorPos, 12); - gMenuCallback = debug_sub_808B8C8; + Menu_PrintItems(1, 1, ARRAY_COUNT(sMenuActions_TopMenu), sMenuActions_TopMenu); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_TopMenu), sTopMenuCursorPos, 12); + gMenuCallback = TopMenu_HandleInput; return FALSE; } -static bool8 debug_sub_808B8C8(void) +static bool8 TopMenu_HandleInput(void) { if (gMain.newKeys & DPAD_UP) { @@ -1914,7 +1913,7 @@ static bool8 debug_sub_808B8C8(void) if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0CBA[sTopMenuCursorPos].func(); + return sMenuActions_TopMenu[sTopMenuCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -1931,10 +1930,10 @@ static bool8 ContestGraphics(void) Menu_PrintText(sString_ContestMenuTitle, 1, 1); Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_ContestPicTest), sMenuActions_ContestPicTest); InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_ContestPicTest), 0, 19); - gMenuCallback = debug_sub_808BC48; + gMenuCallback = ContestGraphics_HandleInput; sPicTest_Species = SPECIES_BULBASAUR; - sPicTest_ContestEntryVar4 = 0x6f33; - sPicTest_IDrndDigit = 0; + sPicTest_OTID = 28467; + sPicTest_Personality = 0; sPicTest_ContestType = 1; return FALSE; } @@ -1946,10 +1945,10 @@ static bool8 ArtMusGraphics(void) Menu_PrintText(sString_Contest_ArtMuseumTitle, 1, 1); Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_ArtMuseumPicTest), sMenuActions_ArtMuseumPicTest); InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_ArtMuseumPicTest), 0, 19); - gMenuCallback = debug_sub_808BCBC; + gMenuCallback = ArtMusGraphics_HandleInput; sPicTest_Species = SPECIES_BULBASAUR; - sPicTest_ContestEntryVar4 = 0x6f33; - sPicTest_IDrndDigit = 0; + sPicTest_OTID = 28467; + sPicTest_Personality = 0; sPicTest_MuseumArtTitleType = 1; return FALSE; } @@ -1958,13 +1957,13 @@ static bool8 PreviewData(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 20, 11); - Menu_PrintText(gUnknown_Debug_083C0DA4, 1, 1); + Menu_PrintText(sString_Contest_PreviewTitle, 1, 1); Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_PreviewPicTest), sMenuActions_PreviewPicTest); InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_PreviewPicTest), 0, 19); gMenuCallback = PreviewData_HandleInput; sPicTest_Species = SPECIES_BULBASAUR; - sPicTest_ContestEntryVar4 = 0x6f33; - sPicTest_IDrndDigit = 0; + sPicTest_OTID = 28467; + sPicTest_Personality = 0; sPicTest_PreviewType = 1; return FALSE; } @@ -1973,10 +1972,10 @@ static bool8 TrickHouse(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 7); - Menu_PrintText(gUnknown_Debug_083C0DF4, 1, 1); + Menu_PrintText(sString_TrickRelated, 1, 1); Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_TrickRelated), sMenuActions_TrickRelated); InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_TrickRelated), sTrickRelatedMenuCursorPos, 23); - gMenuCallback = debug_sub_808BDA4; + gMenuCallback = TrickHouse_HandleInput; return FALSE; } @@ -1984,9 +1983,9 @@ static bool8 ControlEvents(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 5); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0E32), gUnknown_Debug_083C0E32); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0E32), sControlEventsCursorPos, 23); - gMenuCallback = debug_sub_808BE2C; + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlEvents), sMenuActions_ControlEvents); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlEvents), sControlEventsCursorPos, 23); + gMenuCallback = ControlEvents_HandleInput; return FALSE; } @@ -1994,9 +1993,9 @@ static bool8 ControlFlags(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 15); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0E7F), gUnknown_Debug_083C0E7F); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0E7F), sControlFlagsCursorPos, 23); - gMenuCallback = debug_sub_808BEB4; + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlFlags), sMenuActions_ControlFlags); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlFlags), sControlFlagsCursorPos, 23); + gMenuCallback = ControlFlags_HandleInput; return FALSE; } @@ -2004,13 +2003,13 @@ static bool8 ControlWorks(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 13); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0EF1), gUnknown_Debug_083C0EF1); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0EF1), sControlWORKCursorPos, 23); - gMenuCallback = debug_sub_808BF3C; + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlWorks), sMenuActions_ControlWorks); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlWorks), sControlWORKCursorPos, 23); + gMenuCallback = ControlWorks_HandleInput; return FALSE; } -static bool8 debug_sub_808BC48(void) +static bool8 ContestGraphics_HandleInput(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2021,7 +2020,7 @@ static bool8 debug_sub_808BC48(void) PicTest_SelectPokemon(); break; case 1: - PicTest_SelectIDrndDigit(); + PicTest_SelectPersonality(); break; case 2: ContestPicTest_SelectContestType(); @@ -2043,7 +2042,7 @@ static bool8 debug_sub_808BC48(void) return FALSE; } -static bool8 debug_sub_808BCBC(void) +static bool8 ArtMusGraphics_HandleInput(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); @@ -2054,7 +2053,7 @@ static bool8 debug_sub_808BCBC(void) PicTest_SelectPokemon(); break; case 1: - PicTest_SelectIDrndDigit(); + PicTest_SelectPersonality(); break; case 2: MuseumArtPicTest_SelectTitleType(); @@ -2087,7 +2086,7 @@ static bool8 PreviewData_HandleInput(void) PicTest_SelectPokemon(); break; case 1: - PicTest_SelectIDrndDigit(); + PicTest_SelectPersonality(); break; case 2: PreviewPicTest_SelectType(); @@ -2109,7 +2108,7 @@ static bool8 PreviewData_HandleInput(void) return FALSE; } -static bool8 debug_sub_808BDA4(void) +static bool8 TrickHouse_HandleInput(void) { if (gMain.newKeys & DPAD_UP) { @@ -2134,7 +2133,7 @@ static bool8 debug_sub_808BDA4(void) return FALSE; } -static bool8 debug_sub_808BE2C(void) +static bool8 ControlEvents_HandleInput(void) { if (gMain.newKeys & DPAD_UP) { @@ -2149,7 +2148,7 @@ static bool8 debug_sub_808BE2C(void) if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0E32[sControlEventsCursorPos].func(); + return sMenuActions_ControlEvents[sControlEventsCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -2159,7 +2158,7 @@ static bool8 debug_sub_808BE2C(void) return FALSE; } -static bool8 debug_sub_808BEB4(void) +static bool8 ControlFlags_HandleInput(void) { if (gMain.newKeys & DPAD_UP) { @@ -2174,7 +2173,7 @@ static bool8 debug_sub_808BEB4(void) if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0E7F[sControlFlagsCursorPos].func(); + return sMenuActions_ControlFlags[sControlFlagsCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -2184,7 +2183,7 @@ static bool8 debug_sub_808BEB4(void) return FALSE; } -static bool8 debug_sub_808BF3C(void) +static bool8 ControlWorks_HandleInput(void) { if (gMain.newKeys & DPAD_UP) { @@ -2199,7 +2198,7 @@ static bool8 debug_sub_808BF3C(void) if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - return gUnknown_Debug_083C0EF1[sControlWORKCursorPos].func(); + return sMenuActions_ControlWorks[sControlWORKCursorPos].func(); } if (gMain.newKeys & (B_BUTTON | START_BUTTON)) { @@ -2209,27 +2208,27 @@ static bool8 debug_sub_808BF3C(void) return FALSE; } -static bool8 debug_sub_808BFC4(void) +static bool8 ControlEvents_InitSubmenu1(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 19); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0F79), gUnknown_Debug_083C0F79); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0F79), 0, 27); - gMenuCallback = debug_sub_808C064; + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlEvents_Events1), sMenuActions_ControlEvents_Events1); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlEvents_Events1), 0, 27); + gMenuCallback = ControlEvents_Events1_HandleInput; return FALSE; } -static bool8 debug_sub_808C014(void) +static bool8 ControlEvents_InitSubmenu2(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 13); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C0FFC), gUnknown_Debug_083C0FFC); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C0FFC), 0, 27); - gMenuCallback = debug_sub_808C0A8; + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlEvents_Events2), sMenuActions_ControlEvents_Events2); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlEvents_Events2), 0, 27); + gMenuCallback = ControlEvents_Events2_HandleInput; return FALSE; } -static bool8 debug_sub_808C064(void) +static bool8 ControlEvents_Events1_HandleInput(void) { s8 input = Menu_ProcessInput(); @@ -2240,11 +2239,11 @@ static bool8 debug_sub_808C064(void) CloseMenu(); return TRUE; } - gMenuCallback = gUnknown_Debug_083C0F79[input].func; + gMenuCallback = sMenuActions_ControlEvents_Events1[input].func; return FALSE; } -static bool8 debug_sub_808C0A8(void) +static bool8 ControlEvents_Events2_HandleInput(void) { s8 input = Menu_ProcessInput(); @@ -2255,109 +2254,109 @@ static bool8 debug_sub_808C0A8(void) CloseMenu(); return TRUE; } - gMenuCallback = gUnknown_Debug_083C0FFC[input].func; + gMenuCallback = sMenuActions_ControlEvents_Events2[input].func; return FALSE; } -static bool8 debug_sub_808C0EC(void) +static bool8 CallScript_DoHallOfFame(void) { ScriptContext1_SetupScript(DebugScript_081C1CFE); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C104(void) +static bool8 CallScript_GiveCoinCaseIfNotAlreadyOwned(void) { ScriptContext1_SetupScript(DebugScript_081C1D07); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C11C(void) +static bool8 CallScript_SetOldaleStateAfterRoute103Rival(void) { ScriptContext1_SetupScript(DebugScript_081C1D1E); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C134(void) +static bool8 CallScript_OpenNewMauville(void) { ScriptContext1_SetupScript(DebugScript_081C1D24); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C14C(void) +static bool8 CallScript_GiveSSTicketAndDoHallOfFame(void) { ScriptContext1_SetupScript(DebugScript_081C1D2A); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C164(void) +static bool8 CallScript_GiveKyogreEgg(void) { ScriptContext1_SetupScript(DebugScript_081C1D35); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C17C(void) +static bool8 CallScript_GiveAllItems(void) { ScriptContext1_SetupScript(DebugScript_081C1D46); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C194(void) +static bool8 CallScript_GiveAllDecorations(void) { ScriptContext1_SetupScript(DebugScript_081C221F); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C1AC(void) +static bool8 CallScript_GiveAllCoins(void) { ScriptContext1_SetupScript(DebugScript_081C23E2); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C1C4(void) +static bool8 CallScript_OpenSootopolisGym(void) { ScriptContext1_SetupScript(DebugScript_081C23E6); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C1DC(void) +static bool8 CallScript_SetMoneyTo0(void) { ScriptContext1_SetupScript(DebugScript_081C23F6); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C1F4(void) +static bool8 CallScript_FillPartyWithBarboach(void) { ScriptContext1_SetupScript(DebugScript_081C2482); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C20C(void) +static bool8 CallScript_FillPartyWithShroomish(void) { ScriptContext1_SetupScript(DebugScript_081C23FD); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C224(void) +static bool8 CallScript_GiveBarboachEgg(void) { ScriptContext1_SetupScript(DebugScript_081C2518); CloseMenu(); return TRUE; } -static bool8 debug_sub_808C23C(void) +static bool8 CallScript_GiveShroomishEgg(void) { ScriptContext1_SetupScript(DebugScript_081C2507); CloseMenu(); @@ -2404,7 +2403,7 @@ static bool8 debug_sub_808C2E4(void) return FALSE; } -static bool8 debug_sub_808C31C(void) +static bool8 ControlFlags_EventFlag_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 19); @@ -2566,7 +2565,7 @@ static void debug_sub_808C764(u8 whichMenu) } } -static bool8 debug_sub_808C7C8(void) +static bool8 ControlFlags_VanishFlag_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 19); @@ -2728,7 +2727,7 @@ static void debug_sub_808CC10(u8 whichMenu) } } -static bool8 debug_sub_808CC74(void) +static bool8 ControlFlags_TrainerFlag_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1ADC) + 1); @@ -2824,7 +2823,7 @@ static void debug_sub_808CEAC(u8 whichMenu) } } -static bool8 debug_sub_808CF10(void) +static bool8 ControlFlags_SysFlag_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1330) + 1); @@ -2986,7 +2985,7 @@ static void debug_sub_808D358(u8 whichMenu) } } -static bool8 debug_sub_808D3BC(void) +static bool8 ControlFlags_FH_OBJ_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C105C) + 1); @@ -3071,7 +3070,7 @@ static void debug_sub_808D59C(u8 whichMenu) } } -static bool8 debug_sub_808D600(void) +static bool8 ControlFlags_FH_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C11CC) + 1); @@ -3156,7 +3155,7 @@ static void debug_sub_808D7E0(u8 whichMenu) } } -static bool8 debug_sub_808D844(void) +static bool8 ControlFlags_BallVanishFlag_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1A78) + 1); @@ -3230,23 +3229,23 @@ static void debug_sub_808D9CC(u8 whichMenu) } } -static bool8 debug_sub_808DA30(void) +static bool8 ControlWorks_AnsWork_InitSubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C103A) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C103A), gUnknown_Debug_083C103A); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C103A), 0, 28); - gMenuCallback = debug_sub_808DA80; + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_ControlEvents_AnsWork) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlEvents_AnsWork), sMenuActions_ControlEvents_AnsWork); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlEvents_AnsWork), 0, 28); + gMenuCallback = ControlWorks_AnsWork_HandleInput; return FALSE; } -static bool8 debug_sub_808DA80(void) +static bool8 ControlWorks_AnsWork_HandleInput(void) { s8 input = Menu_ProcessInput(); /*s8 cursorPos = */Menu_GetCursorPos(); - debug_sub_808DAD4(); - debug_sub_808DABC(); + ControlWorks_AnsWork_AdjustRESULT(); + ControlWorks_AnsWork_PrintRESULT(); if (input == -2) return FALSE; if (input == -1) @@ -3257,12 +3256,12 @@ static bool8 debug_sub_808DA80(void) return FALSE; } -static void debug_sub_808DABC(void) +static void ControlWorks_AnsWork_PrintRESULT(void) { PrintUnsignedShort(24, 1, gSpecialVar_Result); } -static void debug_sub_808DAD4(void) +static void ControlWorks_AnsWork_AdjustRESULT(void) { u16 delta; @@ -3279,17 +3278,17 @@ static void debug_sub_808DAD4(void) gSpecialVar_Result += delta; } -static bool8 debug_sub_808DB0C(void) +static bool8 ControlWorks_SaveWork_InitSubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C3D08) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3D08), gUnknown_Debug_083C3D08); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3D08), 0, 23); - gMenuCallback = debug_sub_808DB5C; + Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(sMenuAction_ControlWorks_SaveWork) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuAction_ControlWorks_SaveWork), sMenuAction_ControlWorks_SaveWork); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuAction_ControlWorks_SaveWork), 0, 23); + gMenuCallback = ControlWorks_SaveWork_HandleInput; return FALSE; } -static bool8 debug_sub_808DB5C(void) +static bool8 ControlWorks_SaveWork_HandleInput(void) { s8 input = Menu_ProcessInput(); @@ -3300,114 +3299,114 @@ static bool8 debug_sub_808DB5C(void) CloseMenu(); return TRUE; } - gMenuCallback = gUnknown_Debug_083C3D08[input].func; + gMenuCallback = sMenuAction_ControlWorks_SaveWork[input].func; return FALSE; } -static bool8 debug_sub_808DBA0(void) +static bool8 ControlWorks_SaveWork_Town_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C432C) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C432C), gUnknown_Debug_083C432C); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C432C), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Town) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Town), sMenuActions_SaveWork_Town); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Town), 0, 28); sFlagAndVarTest_WhichSubmenu = 0; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DBF8(void) +static bool8 ControlWorks_SaveWork_City_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C436C) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C436C), gUnknown_Debug_083C436C); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C436C), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_City) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_City), sMenuActions_SaveWork_City); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_City), 0, 28); sFlagAndVarTest_WhichSubmenu = 1; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DC50(void) +static bool8 ControlWorks_SaveWork_Route101To109_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C43B4) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C43B4), gUnknown_Debug_083C43B4); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C43B4), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Route101To109) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route101To109), sMenuActions_SaveWork_Route101To109); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route101To109), 0, 28); sFlagAndVarTest_WhichSubmenu = 2; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DCA8(void) +static bool8 ControlWorks_SaveWork_Route110To118_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C43FC) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C43FC), gUnknown_Debug_083C43FC); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C43FC), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Route110To118) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route110To118), sMenuActions_SaveWork_Route110To118); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route110To118), 0, 28); sFlagAndVarTest_WhichSubmenu = 3; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DD00(void) +static bool8 ControlWorks_SaveWork_Route119To127_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4444) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4444), gUnknown_Debug_083C4444); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4444), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Route119To127) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route119To127), sMenuActions_SaveWork_Route119To127); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route119To127), 0, 28); sFlagAndVarTest_WhichSubmenu = 4; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DD58(void) +static bool8 ControlWorks_SaveWork_Route128To134_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C448C) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C448C), gUnknown_Debug_083C448C); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C448C), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Route128To134) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route128To134), sMenuActions_SaveWork_Route128To134); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route128To134), 0, 28); sFlagAndVarTest_WhichSubmenu = 5; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DDB0(void) +static bool8 ControlWorks_SaveWork_RoomTown_InitSubsubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); - Menu_PrintItems(2, 1, 6, gUnknown_Debug_83C44C4); // overflows into the next menu + Menu_PrintItems(2, 1, 6, sMenuActions_SaveWork_RoomTown); // overflows into the next menu InitMenu(0, 1, 1, 6, 0, 28); sFlagAndVarTest_WhichSubmenu = 6; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DE08(void) +static bool8 ControlWorks_SaveWork_RoomCity_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C44EC) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C44EC), gUnknown_Debug_83C44EC); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C44EC), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_RoomCity) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_RoomCity), sMenuActions_SaveWork_RoomCity); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_RoomCity), 0, 28); sFlagAndVarTest_WhichSubmenu = 7; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DE60(void) +static bool8 ControlWorks_SaveWork_Dungeon_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4534) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4534), gUnknown_Debug_083C4534); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4534), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Dungeon) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Dungeon), sMenuActions_SaveWork_Dungeon); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Dungeon), 0, 28); sFlagAndVarTest_WhichSubmenu = 8; - gMenuCallback = debug_sub_808DEB8; + gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808DEB8(void) +static bool8 ControlWorks_SaveWork_Subsubmenu_HandleInput(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - + debug_sub_808DF64(sFlagAndVarTest_WhichSubmenu, cursorPos); debug_sub_808DF04(sFlagAndVarTest_WhichSubmenu); if (input == -2) @@ -3423,7 +3422,7 @@ static bool8 debug_sub_808DEB8(void) static void debug_sub_808DF04(u8 whichMenu) { u8 i; - + for (i = 0; i < gUnknown_Debug_083C457C[whichMenu]; i++) { PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C4586[whichMenu][i])); @@ -3443,7 +3442,7 @@ static void debug_sub_808DF64(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_083C4586[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C4586[whichMenu][cursorPos]) + delta); } -static bool8 debug_sub_808DFC0(void) +static bool8 ControlWorks_SaveWorkPart2_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C377C) + 1); @@ -3555,9 +3554,9 @@ static void debug_sub_808E2B0(u8 whichMenu) { u8 i; - for (i = 0; i < gUnknown_Debug_083C3C48[whichMenu]; i++) + for (i = 0; i < sControlWorks_SaveWork_CountsArray[whichMenu]; i++) { - PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_83C3C4E[whichMenu][i])); + PrintUnsignedShort(24, 2 * i + 1, VarGet(sControlWorks_SaveWork_ItemArrays[whichMenu][i])); } } @@ -3571,10 +3570,10 @@ static void debug_sub_808E310(u8 whichMenu, u8 cursorPos) delta = -1; else return; - VarSet(gUnknown_Debug_83C3C4E[whichMenu][cursorPos], VarGet(gUnknown_Debug_83C3C4E[whichMenu][cursorPos]) + delta); + VarSet(sControlWorks_SaveWork_ItemArrays[whichMenu][cursorPos], VarGet(sControlWorks_SaveWork_ItemArrays[whichMenu][cursorPos]) + delta); } -static bool8 debug_sub_808E36C(void) +static bool8 ControlWorks_SysWork_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C32AC) + 1); @@ -3694,7 +3693,7 @@ static void debug_sub_808E660(u8 whichMenu) } } -static bool8 debug_sub_808E6C0(void) +static bool8 ControlWorks_LocalWork_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C4644) + 1); @@ -3781,7 +3780,7 @@ static void debug_sub_808E8AC(u8 whichMenu) } } -static bool8 debug_sub_808E90C(void) +static bool8 ControlWorks_ObjWork_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C35C4) + 1); @@ -3868,7 +3867,7 @@ static void debug_sub_808EAFC(u8 whichMenu, u8 cursorPos) VarSet(gUnknown_Debug_083C371E[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C371E[whichMenu][cursorPos]) + delta); } -static bool8 debug_sub_808EB58(void) +static bool8 TrickRelated_Level_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 12, 2 * ARRAY_COUNT(gUnknown_Debug_083C47F0) + 3); @@ -3879,7 +3878,7 @@ static bool8 debug_sub_808EB58(void) return FALSE; } -static bool8 debug_sub_808EBB4(void) +static bool8 TrickRelated_TrickMaster_InitSubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 13, 2 * ARRAY_COUNT(gUnknown_Debug_083C4888) + 3); @@ -3926,7 +3925,7 @@ static bool8 debug_sub_808EC5C(void) return TRUE; } -static bool8 debug_sub_808ECA4(void) +static bool8 PreviewGraphics_Show(void) { BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0); gMenuCallback = debug_sub_808ECD0; @@ -3946,7 +3945,7 @@ static bool8 debug_sub_808ECD0(void) return FALSE; } -static bool8 Config(void) +static bool8 DummyMenuAction(void) { return FALSE; } @@ -3979,35 +3978,35 @@ static void PicTest_SelectPokemon(void) } } -static void PicTest_SelectIDrndDigit(void) +static void PicTest_SelectPersonality(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if (sPicTest_IDrndDigit != 0) - sPicTest_IDrndDigit--; + if (sPicTest_Personality != 0) + sPicTest_Personality--; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) { - if (sPicTest_IDrndDigit != UINT32_MAX) - sPicTest_IDrndDigit++; + if (sPicTest_Personality != UINT32_MAX) + sPicTest_Personality++; } if (gMain.newAndRepeatedKeys & L_BUTTON) { - if (sPicTest_IDrndDigit >= 0x10) - sPicTest_IDrndDigit -= 0x10; + if (sPicTest_Personality >= 0x10) + sPicTest_Personality -= 0x10; else - sPicTest_IDrndDigit = 0; + sPicTest_Personality = 0; } if (gMain.newAndRepeatedKeys & R_BUTTON) { - if (sPicTest_IDrndDigit <= UINT32_MAX - 0x10) - sPicTest_IDrndDigit += 0x10; + if (sPicTest_Personality <= UINT32_MAX - 0x10) + sPicTest_Personality += 0x10; else - sPicTest_IDrndDigit = UINT32_MAX; + sPicTest_Personality = UINT32_MAX; } if ((gMain.newKeys & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON)) { - sPicTest_IDrndDigit = UINT32_MAX; + sPicTest_Personality = UINT32_MAX; } } @@ -4015,18 +4014,18 @@ static void ContestPicTest_SelectContestType(void) { if (gMain.newAndRepeatedKeys & DPAD_LEFT) { - if (sPicTest_ContestType != 1) + if (sPicTest_ContestType != CONTEST_COOL + 1) sPicTest_ContestType--; } if (gMain.newAndRepeatedKeys & DPAD_RIGHT) { - if (sPicTest_ContestType != 5) + if (sPicTest_ContestType != CONTEST_TOUGH + 1) sPicTest_ContestType++; } if (gMain.newAndRepeatedKeys & L_BUTTON) - sPicTest_ContestType = 1; + sPicTest_ContestType = CONTEST_COOL + 1; if (gMain.newAndRepeatedKeys & R_BUTTON) - sPicTest_ContestType = 5; + sPicTest_ContestType = CONTEST_TOUGH + 1; } static void MuseumArtPicTest_SelectTitleType(void) @@ -4099,7 +4098,7 @@ static void PicTest_Redraw(u8 a0) case 2: for (i = 0; i < 8; i++) { - digit = (sPicTest_IDrndDigit >> (4 * (7 - i))) & 0xf; + digit = (sPicTest_Personality >> (4 * (7 - i))) & 0xf; if (digit < 10) sPicTest_StringBuffer[i] = digit + CHAR_0; else @@ -4174,7 +4173,7 @@ __attribute__((naked)) void PicTest_Redraw(u8 a0) "\tcmp\tr6, #0\n" "\tblt\t._653\t@cond_branch\n" "\tmov\tr3, #0x0\n" - "\tldr\tr0, ._656 @ sPicTest_IDrndDigit\n" + "\tldr\tr0, ._656 @ sPicTest_Personality\n" "\tmov\tr8, r0\n" "\tldr\tr4, ._656 + 4 @ sPicTest_StringBuffer\n" "\tmov\tr7, #0x7\n" @@ -4195,7 +4194,7 @@ __attribute__((naked)) void PicTest_Redraw(u8 a0) "._657:\n" "\t.align\t2, 0\n" "._656:\n" - "\t.word\tsPicTest_IDrndDigit\n" + "\t.word\tsPicTest_Personality\n" "\t.word\tsPicTest_StringBuffer\n" "._654:\n" "\tadd\tr1, r3, r4\n" @@ -4411,9 +4410,9 @@ __attribute__((naked)) void PicTest_Redraw(u8 a0) static void PrepareDebugOverlayBeforeShowingContestPainting(u8 a0) { struct ContestEntry *contestEntry = &ewram15DE0; - contestEntry->var8 = sPicTest_Species; - contestEntry->var4 = sPicTest_ContestEntryVar4; - contestEntry->var0 = sPicTest_IDrndDigit; + contestEntry->species = sPicTest_Species; + contestEntry->otId = sPicTest_OTID; + contestEntry->personality = sPicTest_Personality; switch (a0) { case 0: diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c index eb7f92a6b..7d8f53299 100644 --- a/src/scene/contest_painting.c +++ b/src/scene/contest_painting.c @@ -333,8 +333,7 @@ static void sub_8106AC4(u16 species, u8 arg1) { void *pal; - // Unsure what gUnknown_03005E8C->var0 is supposed to be. - pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); + pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->otId, gUnknown_03005E8C->personality); LZDecompressVram(pal, gUnknown_03005E90); if (arg1 == 1) @@ -346,7 +345,7 @@ static void sub_8106AC4(u16 species, u8 arg1) 0x2000000, gUnknown_081FAF4C[1], species, - (u32)gUnknown_03005E8C->var0 + (u32)gUnknown_03005E8C->personality ); sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10); } @@ -359,7 +358,7 @@ static void sub_8106AC4(u16 species, u8 arg1) 0x2000000, gUnknown_081FAF4C[0], species, - (u32)gUnknown_03005E8C->var0 + (u32)gUnknown_03005E8C->personality ); sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10); } @@ -743,7 +742,7 @@ static void sub_8106F6C(u8 arg0) gUnknown_03005E20.var_4 = gUnknown_03005E10; gUnknown_03005E20.var_8 = gUnknown_03005E90; gUnknown_03005E20.var_18 = 0; - gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0 % 256; + gUnknown_03005E20.var_1F = gUnknown_03005E8C->personality % 256; gUnknown_03005E20.var_19 = 0; gUnknown_03005E20.var_1A = 0; gUnknown_03005E20.var_1B = 64; @@ -779,7 +778,7 @@ static void sub_8106F6C(u8 arg0) static void sub_8107090(u8 arg0, u8 arg1) { sub_8106F4C(); - sub_8106AC4(gUnknown_03005E8C->var8, 0); + sub_8106AC4(gUnknown_03005E8C->species, 0); sub_8106F6C(sub_8106EE0(arg0)); sub_8106E98(arg0); sub_8106C40(arg0, arg1); -- cgit v1.2.3 From b98c803e6d25785b3b268c2c26a87ac74a7e3a95 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 16 Mar 2018 08:34:45 -0400 Subject: Renaming stuff, 2 --- src/debug/tomomichi_debug_menu.c | 508 +++++++++++++++++++-------------------- 1 file changed, 254 insertions(+), 254 deletions(-) (limited to 'src') diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index 90d10556f..3d4637746 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -121,12 +121,12 @@ static bool8 debug_sub_808D2BC(void); static void debug_sub_808D308(u8, u8); static void debug_sub_808D358(u8); static bool8 ControlFlags_FH_OBJ_InitSubmenu(void); -static bool8 debug_sub_808D40C(void); -static bool8 debug_sub_808D450(void); -static bool8 debug_sub_808D4A8(void); -static bool8 debug_sub_808D500(void); -static void debug_sub_808D54C(u8, u8); -static void debug_sub_808D59C(u8); +static bool8 ControlFlags_FH_OBJ_HandleInput(void); +static bool8 ControlFlags_FH_OBJ00_08_InitSubsubmenu(void); +static bool8 ControlFlags_FH_OBJ09_15_InitSubsubmenu(void); +static bool8 ControlFlags_FH_OBJ_Subsubmenu_HandleInput(void); +static void ControlFlags_FH_OBJ_FlagToggle(u8, u8); +static void ControlFlags_FH_OBJ_UpdateDisplay(u8); static bool8 ControlFlags_FH_InitSubmenu(void); static bool8 debug_sub_808D650(void); static bool8 debug_sub_808D694(void); @@ -159,11 +159,11 @@ static bool8 ControlWorks_SaveWork_Subsubmenu_HandleInput(void); static void debug_sub_808DF04(u8); static void debug_sub_808DF64(u8, u8); static bool8 ControlWorks_SaveWorkPart2_InitSubmenu(void); -static bool8 debug_sub_808E010(void); -static bool8 debug_sub_808E054(void); -static bool8 debug_sub_808E0AC(void); -static bool8 debug_sub_808E104(void); -static bool8 debug_sub_808E15C(void); +static bool8 ControlWorks_SaveWorkPart2_HandleInput(void); +static bool8 ControlWorks_SaveWorkPart2_SP_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWorkPart2_RoomR110Part1TrickHouse_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWorkPart2_RoomR110Part2_InitSubsubmenu(void); +static bool8 ControlWorks_SaveWorkPart2_RoomLoad_InitSubsubmenu(void); static bool8 debug_sub_808E1B4(void); static bool8 debug_sub_808E20C(void); static bool8 debug_sub_808E264(void); @@ -381,61 +381,61 @@ static const struct MenuAction sMenuActions_ControlEvents_AnsWork[] = { {sString_Answork_Mikansei, DummyMenuAction} }; -static const u8 gUnknown_Debug_083C1044[] = _("FHーOBJ00ー08"); -static const u8 gUnknown_Debug_083C1050[] = _("FHーOBJ09ー15"); +static const u8 sString_FH_OBJ00_08[] = _("FHーOBJ00ー08"); +static const u8 sString_FH_OBJ09_15[] = _("FHーOBJ09ー15"); -static const struct MenuAction gUnknown_Debug_083C105C[] = { - {gUnknown_Debug_083C1044, debug_sub_808D450}, - {gUnknown_Debug_083C1050, debug_sub_808D4A8} +static const struct MenuAction sMenuActions_ControlFlags_FH_OBJ[] = { + {sString_FH_OBJ00_08, ControlFlags_FH_OBJ00_08_InitSubsubmenu}, + {sString_FH_OBJ09_15, ControlFlags_FH_OBJ09_15_InitSubsubmenu} }; -static const u8 gUnknown_Debug_083C106C[] = _("FHーOBJ00"); -static const u8 gUnknown_Debug_083C1075[] = _("FHーOBJ01"); -static const u8 gUnknown_Debug_083C107E[] = _("FHーOBJ02"); -static const u8 gUnknown_Debug_083C1087[] = _("FHーOBJ03"); -static const u8 gUnknown_Debug_083C1090[] = _("FHーOBJ04"); -static const u8 gUnknown_Debug_083C1099[] = _("FHーOBJ05"); -static const u8 gUnknown_Debug_083C10A2[] = _("FHーOBJ06"); -static const u8 gUnknown_Debug_083C10AB[] = _("FHーOBJ07"); -static const u8 gUnknown_Debug_083C10B4[] = _("FHーOBJ08"); - -static const struct MenuAction gUnknown_Debug_083C10BD[] = { - {gUnknown_Debug_083C106C, DummyMenuAction}, - {gUnknown_Debug_083C1075, DummyMenuAction}, - {gUnknown_Debug_083C107E, DummyMenuAction}, - {gUnknown_Debug_083C1087, DummyMenuAction}, - {gUnknown_Debug_083C1090, DummyMenuAction}, - {gUnknown_Debug_083C1099, DummyMenuAction}, - {gUnknown_Debug_083C10A2, DummyMenuAction}, - {gUnknown_Debug_083C10AB, DummyMenuAction}, - {gUnknown_Debug_083C10B4, DummyMenuAction} +static const u8 sString_FH_OBJ00[] = _("FHーOBJ00"); +static const u8 sString_FH_OBJ01[] = _("FHーOBJ01"); +static const u8 sString_FH_OBJ02[] = _("FHーOBJ02"); +static const u8 sString_FH_OBJ03[] = _("FHーOBJ03"); +static const u8 sString_FH_OBJ04[] = _("FHーOBJ04"); +static const u8 sString_FH_OBJ05[] = _("FHーOBJ05"); +static const u8 sString_FH_OBJ06[] = _("FHーOBJ06"); +static const u8 sString_FH_OBJ07[] = _("FHーOBJ07"); +static const u8 sString_FH_OBJ08[] = _("FHーOBJ08"); + +static const struct MenuAction sMenuActions_ControlFlags_FH_OBJ00_08[] = { + {sString_FH_OBJ00, DummyMenuAction}, + {sString_FH_OBJ01, DummyMenuAction}, + {sString_FH_OBJ02, DummyMenuAction}, + {sString_FH_OBJ03, DummyMenuAction}, + {sString_FH_OBJ04, DummyMenuAction}, + {sString_FH_OBJ05, DummyMenuAction}, + {sString_FH_OBJ06, DummyMenuAction}, + {sString_FH_OBJ07, DummyMenuAction}, + {sString_FH_OBJ08, DummyMenuAction} }; -static const u8 gUnknown_Debug_083C1108[] = _("FH-OBJ09"); -static const u8 gUnknown_Debug_083C1111[] = _("FH-OBJ10"); -static const u8 gUnknown_Debug_083C111A[] = _("FH-OBJ11"); -static const u8 gUnknown_Debug_083C1123[] = _("FH-OBJ12"); -static const u8 gUnknown_Debug_083C112C[] = _("FH-OBJ13"); -static const u8 gUnknown_Debug_083C1135[] = _("FH-OBJ14"); -static const u8 gUnknown_Debug_083C113E[] = _("FH-OBJ15"); -static const u8 gUnknown_Debug_083C1147[] = _(""); -static const u8 gUnknown_Debug_083C1148[] = _(""); - -static const struct MenuAction gUnknown_Debug_083C1149[] = { - {gUnknown_Debug_083C1108, DummyMenuAction}, - {gUnknown_Debug_083C1111, DummyMenuAction}, - {gUnknown_Debug_083C111A, DummyMenuAction}, - {gUnknown_Debug_083C1123, DummyMenuAction}, - {gUnknown_Debug_083C112C, DummyMenuAction}, - {gUnknown_Debug_083C1135, DummyMenuAction}, - {gUnknown_Debug_083C113E, DummyMenuAction}, - {gUnknown_Debug_083C1147, DummyMenuAction}, - {gUnknown_Debug_083C1148, DummyMenuAction} +static const u8 sString_FH_OBJ09[] = _("FH-OBJ09"); +static const u8 sString_FH_OBJ10[] = _("FH-OBJ10"); +static const u8 sString_FH_OBJ11[] = _("FH-OBJ11"); +static const u8 sString_FH_OBJ12[] = _("FH-OBJ12"); +static const u8 sString_FH_OBJ13[] = _("FH-OBJ13"); +static const u8 sString_FH_OBJ14[] = _("FH-OBJ14"); +static const u8 sString_FH_OBJ15[] = _("FH-OBJ15"); +static const u8 sString_Blank_083C1147[] = _(""); +static const u8 sString_Blank_083C1148[] = _(""); + +static const struct MenuAction sMenuActions_ControlFlags_FH_OBJ09_15[] = { + {sString_FH_OBJ09, DummyMenuAction}, + {sString_FH_OBJ10, DummyMenuAction}, + {sString_FH_OBJ11, DummyMenuAction}, + {sString_FH_OBJ12, DummyMenuAction}, + {sString_FH_OBJ13, DummyMenuAction}, + {sString_FH_OBJ14, DummyMenuAction}, + {sString_FH_OBJ15, DummyMenuAction}, + {sString_Blank_083C1147, DummyMenuAction}, + {sString_Blank_083C1148, DummyMenuAction} }; -static const u8 gUnknown_Debug_083C1194[] = {9, 7}; +static const u8 sControlFlags_FH_OBJ_CountsArray[] = {9, 7}; -static const u16 gUnknown_Debug_083C1196[][9] = { +static const u16 sControlFlags_FH_OBJ_FlagsArrays[][9] = { {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19}, {0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20} }; @@ -1410,11 +1410,11 @@ static const u8 gUnknown_Debug_083C3768[] = _("ルーム ロード"); static const u8 gUnknown_Debug_083C3770[] = _("ソノタ1"); static const u8 gUnknown_Debug_083C3775[] = _("ソノタ2"); -static const struct MenuAction gUnknown_Debug_083C377C[] = { - {gUnknown_Debug_083C3742, debug_sub_808E054}, - {gUnknown_Debug_083C3745, debug_sub_808E0AC}, - {gUnknown_Debug_083C3759, debug_sub_808E104}, - {gUnknown_Debug_083C3768, debug_sub_808E15C}, +static const struct MenuAction sMenuActions_ControlWorks_SaveWorkPart2[] = { + {gUnknown_Debug_083C3742, ControlWorks_SaveWorkPart2_SP_InitSubsubmenu}, + {gUnknown_Debug_083C3745, ControlWorks_SaveWorkPart2_RoomR110Part1TrickHouse_InitSubsubmenu}, + {gUnknown_Debug_083C3759, ControlWorks_SaveWorkPart2_RoomR110Part2_InitSubsubmenu}, + {gUnknown_Debug_083C3768, ControlWorks_SaveWorkPart2_RoomLoad_InitSubsubmenu}, {gUnknown_Debug_083C3770, debug_sub_808E1B4}, {gUnknown_Debug_083C3775, debug_sub_808E20C} }; @@ -1583,189 +1583,189 @@ static const struct MenuAction sMenuAction_ControlWorks_SaveWork[] = { {sString_Dungeon_nai, ControlWorks_SaveWork_Dungeon_InitSubsubmenu} }; -static const u8 gUnknown_Debug_083C3D50[] = _("WKーSCENEーFIELDーT101"); -static const u8 gUnknown_Debug_083C3D64[] = _("WKーSCENEーFIELDーT102"); -static const u8 gUnknown_Debug_083C3D78[] = _("WKーSCENEーFIELDーT103"); -static const u8 gUnknown_Debug_083C3D8C[] = _("WKーSCENEーFIELDーT104"); -static const u8 gUnknown_Debug_083C3DA0[] = _("WKーBASEーPOSNO"); -static const u8 gUnknown_Debug_083C3DAE[] = _("WKーSCENEーFIELDーT106"); -static const u8 gUnknown_Debug_083C3DC2[] = _("WKーSCENEーFIELDーT107"); -static const u8 gUnknown_Debug_083C3DD6[] = _("WKーSCENEー02ーFIELDーT102"); - -static const u8 gUnknown_Debug_083C3DED[] = _("WKーSCENEーFIELDーC101"); -static const u8 gUnknown_Debug_083C3E01[] = _("WKーSCENEーFIELDーC102"); -static const u8 gUnknown_Debug_083C3E15[] = _("WKーSCENEーFIELDーC103"); -static const u8 gUnknown_Debug_083C3E29[] = _("WKーSCENEーFIELDーC104"); -static const u8 gUnknown_Debug_083C3E3D[] = _("WKーSCENEーFIELDーC105"); -static const u8 gUnknown_Debug_083C3E51[] = _("WKーSCENEーFIELDーC106"); -static const u8 gUnknown_Debug_083C3E65[] = _("WKーSCENEーFIELDーC107"); -static const u8 gUnknown_Debug_083C3E79[] = _("WKーSCENEーFIELDーC108"); -static const u8 gUnknown_Debug_083C3E8D[] = _("WKーSCENEーFIELDーC109"); - -static const u8 gUnknown_Debug_083C3EA1[] = _("WKーSCENEーFIELDーR101"); -static const u8 gUnknown_Debug_083C3EB5[] = _("WKーSCENEーFIELDーR102"); -static const u8 gUnknown_Debug_083C3EC9[] = _("WKーSCENEーFIELDーR103"); -static const u8 gUnknown_Debug_083C3EDD[] = _("WKーSCENEーFIELDーR104"); -static const u8 gUnknown_Debug_083C3EF1[] = _("WKーSCENEーFIELDーR105"); -static const u8 gUnknown_Debug_083C3F05[] = _("WKーSCENEーFIELDーR106"); -static const u8 gUnknown_Debug_083C3F19[] = _("WKーSCENEーFIELDーR107"); -static const u8 gUnknown_Debug_083C3F2D[] = _("WKーSCENEーFIELDーR108"); -static const u8 gUnknown_Debug_083C3F41[] = _("WKーSCENEーFIELDーR109"); - -static const u8 gUnknown_Debug_083C3F55[] = _("WKーSCENEーFIELDーR110"); -static const u8 gUnknown_Debug_083C3F69[] = _("WKーSCENEーFIELDーR111"); -static const u8 gUnknown_Debug_083C3F7D[] = _("WKーSCENEーFIELDーR112"); -static const u8 gUnknown_Debug_083C3F91[] = _("WKーSCENEーFIELDーR113"); -static const u8 gUnknown_Debug_083C3FA5[] = _("WKーSCENEーFIELDーR114"); -static const u8 gUnknown_Debug_083C3FB9[] = _("WKーSCENEーFIELDーR115"); -static const u8 gUnknown_Debug_083C3FCD[] = _("WKーSCENEーFIELDーR116"); -static const u8 gUnknown_Debug_083C3FE1[] = _("WKーSCENEーFIELDーR117"); -static const u8 gUnknown_Debug_083C3FF5[] = _("WKーSCENEーFIELDーR118"); - -static const u8 gUnknown_Debug_083C4009[] = _("WKーSCENEーFIELDーR119"); -static const u8 gUnknown_Debug_083C401D[] = _("WKーSCENEーFIELDーR120"); -static const u8 gUnknown_Debug_083C4031[] = _("WKーSCENEーFIELDーR121"); -static const u8 gUnknown_Debug_083C4045[] = _("WKーSCENEーFIELDーR122"); -static const u8 gUnknown_Debug_083C4059[] = _("WKーSCENEーFIELDーR123"); -static const u8 gUnknown_Debug_083C406D[] = _("WKーSCENEーFIELDーR124"); -static const u8 gUnknown_Debug_083C4081[] = _("WKーSCENEーFIELDーR125"); -static const u8 gUnknown_Debug_083C4095[] = _("WKーSCENEーFIELDーR126"); -static const u8 gUnknown_Debug_083C40A9[] = _("WKーSCENEーFIELDーR127"); - -static const u8 gUnknown_Debug_083C40BD[] = _("WKーSCENEーFIELDーR128"); -static const u8 gUnknown_Debug_083C40D1[] = _("WKーSCENEーFIELDーR129"); -static const u8 gUnknown_Debug_083C40E5[] = _("WKーSCENEーFIELDーR130"); -static const u8 gUnknown_Debug_083C40F9[] = _("WKーSCENEーFIELDーR131"); -static const u8 gUnknown_Debug_083C410D[] = _("WKーSCENEーFIELDーR132"); -static const u8 gUnknown_Debug_083C4121[] = _("WKーSCENEーFIELDーR133"); -static const u8 gUnknown_Debug_083C4135[] = _("WKーSCENEーFIELDーR134"); - -static const u8 gUnknown_Debug_083C4149[] = _("WKーSCENEーT101ーR0101"); -static const u8 gUnknown_Debug_083C415D[] = _("WKーSCENEーT101ーR0102"); -static const u8 gUnknown_Debug_083C4171[] = _("WKーSCENEーT101ーR0301"); -static const u8 gUnknown_Debug_083C4185[] = _("WKーSCENEーT101ーR0201"); -static const u8 gUnknown_Debug_083C4199[] = _("WKーSCENEーT101ーR0202"); -static const u8 gUnknown_Debug_083C41AD[] = _("WKーSCENEーT107ーR0201"); - -static const u8 gUnknown_Debug_083C41C1[] = _("WKーSCENEーC101ーR0201"); -static const u8 gUnknown_Debug_083C41D5[] = _("WKーSCENEーC104ーR0103"); -static const u8 gUnknown_Debug_083C41E9[] = _("WKーSCENEーC103ーR0101"); -static const u8 gUnknown_Debug_083C41FD[] = _("WKーSCENEーC106ーR0202"); -static const u8 gUnknown_Debug_083C4211[] = _("WKーSCENEーC106ーR0401"); -static const u8 gUnknown_Debug_083C4225[] = _("WKーSCENEーC102ーR0601"); -static const u8 gUnknown_Debug_083C4239[] = _("WKーSCENEーC102ーR0501"); -static const u8 gUnknown_Debug_083C424D[] = _("WKーSCENEーC104ーR0102"); -static const u8 gUnknown_Debug_083C4261[] = _("WKーSCENEーC107ーR0501"); - -static const u8 gUnknown_Debug_083C4275[] = _("WKーSCENEーCAVEーD0601"); -static const u8 gUnknown_Debug_083C4289[] = _("WKーSCENEーCAVEーD0201"); -static const u8 gUnknown_Debug_083C429D[] = _("WKーSCENEーCAVEーD1206"); -static const u8 gUnknown_Debug_083C42B1[] = _("WKーSCENEーCAVEーD1111"); -static const u8 gUnknown_Debug_083C42C5[] = _("WKーSCENEーCAVEーD0701"); -static const u8 gUnknown_Debug_083C42D9[] = _("WKーSCENEーCAVEーD0808"); -static const u8 gUnknown_Debug_083C42ED[] = _("WKーSCENEーCAVEーD1602"); -static const u8 gUnknown_Debug_083C4301[] = _("WKーSCENEーCAVEーD0101"); -static const u8 gUnknown_Debug_083C4315[] = _("WKーSCENEーCAVEーD1301"); +static const u8 sString_WK_SCENE_FIELD_T101[] = _("WKーSCENEーFIELDーT101"); +static const u8 sString_WK_SCENE_FIELD_T102[] = _("WKーSCENEーFIELDーT102"); +static const u8 sString_WK_SCENE_FIELD_T103[] = _("WKーSCENEーFIELDーT103"); +static const u8 sString_WK_SCENE_FIELD_T104[] = _("WKーSCENEーFIELDーT104"); +static const u8 sString_WK_BASE_POSNO[] = _("WKーBASEーPOSNO"); +static const u8 sString_WK_SCENE_FIELD_T106[] = _("WKーSCENEーFIELDーT106"); +static const u8 sString_WK_SCENE_FIELD_T107[] = _("WKーSCENEーFIELDーT107"); +static const u8 sString_WK_SCENE_2_FIELD_T102[] = _("WKーSCENEー02ーFIELDーT102"); + +static const u8 sString_WK_SCENE_FIELD_C101[] = _("WKーSCENEーFIELDーC101"); +static const u8 sString_WK_SCENE_FIELD_C102[] = _("WKーSCENEーFIELDーC102"); +static const u8 sString_WK_SCENE_FIELD_C103[] = _("WKーSCENEーFIELDーC103"); +static const u8 sString_WK_SCENE_FIELD_C104[] = _("WKーSCENEーFIELDーC104"); +static const u8 sString_WK_SCENE_FIELD_C105[] = _("WKーSCENEーFIELDーC105"); +static const u8 sString_WK_SCENE_FIELD_C106[] = _("WKーSCENEーFIELDーC106"); +static const u8 sString_WK_SCENE_FIELD_C107[] = _("WKーSCENEーFIELDーC107"); +static const u8 sString_WK_SCENE_FIELD_C108[] = _("WKーSCENEーFIELDーC108"); +static const u8 sString_WK_SCENE_FIELD_C109[] = _("WKーSCENEーFIELDーC109"); + +static const u8 sString_WK_SCENE_FIELD_R101[] = _("WKーSCENEーFIELDーR101"); +static const u8 sString_WK_SCENE_FIELD_R102[] = _("WKーSCENEーFIELDーR102"); +static const u8 sString_WK_SCENE_FIELD_R103[] = _("WKーSCENEーFIELDーR103"); +static const u8 sString_WK_SCENE_FIELD_R104[] = _("WKーSCENEーFIELDーR104"); +static const u8 sString_WK_SCENE_FIELD_R105[] = _("WKーSCENEーFIELDーR105"); +static const u8 sString_WK_SCENE_FIELD_R106[] = _("WKーSCENEーFIELDーR106"); +static const u8 sString_WK_SCENE_FIELD_R107[] = _("WKーSCENEーFIELDーR107"); +static const u8 sString_WK_SCENE_FIELD_R108[] = _("WKーSCENEーFIELDーR108"); +static const u8 sString_WK_SCENE_FIELD_R109[] = _("WKーSCENEーFIELDーR109"); + +static const u8 sString_WK_SCENE_FIELD_R110[] = _("WKーSCENEーFIELDーR110"); +static const u8 sString_WK_SCENE_FIELD_R111[] = _("WKーSCENEーFIELDーR111"); +static const u8 sString_WK_SCENE_FIELD_R112[] = _("WKーSCENEーFIELDーR112"); +static const u8 sString_WK_SCENE_FIELD_R113[] = _("WKーSCENEーFIELDーR113"); +static const u8 sString_WK_SCENE_FIELD_R114[] = _("WKーSCENEーFIELDーR114"); +static const u8 sString_WK_SCENE_FIELD_R115[] = _("WKーSCENEーFIELDーR115"); +static const u8 sString_WK_SCENE_FIELD_R116[] = _("WKーSCENEーFIELDーR116"); +static const u8 sString_WK_SCENE_FIELD_R117[] = _("WKーSCENEーFIELDーR117"); +static const u8 sString_WK_SCENE_FIELD_R118[] = _("WKーSCENEーFIELDーR118"); + +static const u8 sString_WK_SCENE_FIELD_R119[] = _("WKーSCENEーFIELDーR119"); +static const u8 sString_WK_SCENE_FIELD_R120[] = _("WKーSCENEーFIELDーR120"); +static const u8 sString_WK_SCENE_FIELD_R121[] = _("WKーSCENEーFIELDーR121"); +static const u8 sString_WK_SCENE_FIELD_R122[] = _("WKーSCENEーFIELDーR122"); +static const u8 sString_WK_SCENE_FIELD_R123[] = _("WKーSCENEーFIELDーR123"); +static const u8 sString_WK_SCENE_FIELD_R124[] = _("WKーSCENEーFIELDーR124"); +static const u8 sString_WK_SCENE_FIELD_R125[] = _("WKーSCENEーFIELDーR125"); +static const u8 sString_WK_SCENE_FIELD_R126[] = _("WKーSCENEーFIELDーR126"); +static const u8 sString_WK_SCENE_FIELD_R127[] = _("WKーSCENEーFIELDーR127"); + +static const u8 sString_WK_SCENE_FIELD_R128[] = _("WKーSCENEーFIELDーR128"); +static const u8 sString_WK_SCENE_FIELD_R129[] = _("WKーSCENEーFIELDーR129"); +static const u8 sString_WK_SCENE_FIELD_R130[] = _("WKーSCENEーFIELDーR130"); +static const u8 sString_WK_SCENE_FIELD_R131[] = _("WKーSCENEーFIELDーR131"); +static const u8 sString_WK_SCENE_FIELD_R132[] = _("WKーSCENEーFIELDーR132"); +static const u8 sString_WK_SCENE_FIELD_R133[] = _("WKーSCENEーFIELDーR133"); +static const u8 sString_WK_SCENE_FIELD_R134[] = _("WKーSCENEーFIELDーR134"); + +static const u8 sString_WK_SCENE_T101_R0101[] = _("WKーSCENEーT101ーR0101"); +static const u8 sString_WK_SCENE_T101_R0102[] = _("WKーSCENEーT101ーR0102"); +static const u8 sString_WK_SCENE_T101_R0301[] = _("WKーSCENEーT101ーR0301"); +static const u8 sString_WK_SCENE_T101_R0201[] = _("WKーSCENEーT101ーR0201"); +static const u8 sString_WK_SCENE_T101_R0202[] = _("WKーSCENEーT101ーR0202"); +static const u8 sString_WK_SCENE_T107_R0201[] = _("WKーSCENEーT107ーR0201"); // unused string + +static const u8 sString_WK_SCENE_C101_R0201[] = _("WKーSCENEーC101ーR0201"); +static const u8 sString_WK_SCENE_C104_R0103[] = _("WKーSCENEーC104ーR0103"); +static const u8 sString_WK_SCENE_C103_R0101[] = _("WKーSCENEーC103ーR0101"); +static const u8 sString_WK_SCENE_C106_R0202[] = _("WKーSCENEーC106ーR0202"); +static const u8 sString_WK_SCENE_C106_R0401[] = _("WKーSCENEーC106ーR0401"); +static const u8 sString_WK_SCENE_C101_R0601[] = _("WKーSCENEーC102ーR0601"); +static const u8 sString_WK_SCENE_C102_R0501[] = _("WKーSCENEーC102ーR0501"); +static const u8 sString_WK_SCENE_C104_R0102[] = _("WKーSCENEーC104ーR0102"); +static const u8 sString_WK_SCENE_C107_R0501[] = _("WKーSCENEーC107ーR0501"); + +static const u8 sString_WK_SCENE_CAVE_D0601[] = _("WKーSCENEーCAVEーD0601"); +static const u8 sString_WK_SCENE_CAVE_D0201[] = _("WKーSCENEーCAVEーD0201"); +static const u8 sString_WK_SCENE_CAVE_D1206[] = _("WKーSCENEーCAVEーD1206"); +static const u8 sString_WK_SCENE_CAVE_D1111[] = _("WKーSCENEーCAVEーD1111"); +static const u8 sString_WK_SCENE_CAVE_D0701[] = _("WKーSCENEーCAVEーD0701"); +static const u8 sString_WK_SCENE_CAVE_D0808[] = _("WKーSCENEーCAVEーD0808"); +static const u8 sString_WK_SCENE_CAVE_D1602[] = _("WKーSCENEーCAVEーD1602"); +static const u8 sString_WK_SCENE_CAVE_D0101[] = _("WKーSCENEーCAVEーD0101"); +static const u8 sString_WK_SCENE_CAVE_D1301[] = _("WKーSCENEーCAVEーD1301"); static const struct MenuAction sMenuActions_SaveWork_Town[] = { - {gUnknown_Debug_083C3D50, DummyMenuAction}, - {gUnknown_Debug_083C3D64, DummyMenuAction}, - {gUnknown_Debug_083C3D78, DummyMenuAction}, - {gUnknown_Debug_083C3D8C, DummyMenuAction}, - {gUnknown_Debug_083C3DA0, DummyMenuAction}, - {gUnknown_Debug_083C3DAE, DummyMenuAction}, - {gUnknown_Debug_083C3DC2, DummyMenuAction}, - {gUnknown_Debug_083C3DD6, DummyMenuAction} + {sString_WK_SCENE_FIELD_T101, DummyMenuAction}, + {sString_WK_SCENE_FIELD_T102, DummyMenuAction}, + {sString_WK_SCENE_FIELD_T103, DummyMenuAction}, + {sString_WK_SCENE_FIELD_T104, DummyMenuAction}, + {sString_WK_BASE_POSNO, DummyMenuAction}, + {sString_WK_SCENE_FIELD_T106, DummyMenuAction}, + {sString_WK_SCENE_FIELD_T107, DummyMenuAction}, + {sString_WK_SCENE_2_FIELD_T102, DummyMenuAction} }; static const struct MenuAction sMenuActions_SaveWork_City[] = { - {gUnknown_Debug_083C3DED, DummyMenuAction}, - {gUnknown_Debug_083C3E01, DummyMenuAction}, - {gUnknown_Debug_083C3E15, DummyMenuAction}, - {gUnknown_Debug_083C3E29, DummyMenuAction}, - {gUnknown_Debug_083C3E3D, DummyMenuAction}, - {gUnknown_Debug_083C3E51, DummyMenuAction}, - {gUnknown_Debug_083C3E65, DummyMenuAction}, - {gUnknown_Debug_083C3E79, DummyMenuAction}, - {gUnknown_Debug_083C3E8D, DummyMenuAction} + {sString_WK_SCENE_FIELD_C101, DummyMenuAction}, + {sString_WK_SCENE_FIELD_C102, DummyMenuAction}, + {sString_WK_SCENE_FIELD_C103, DummyMenuAction}, + {sString_WK_SCENE_FIELD_C104, DummyMenuAction}, + {sString_WK_SCENE_FIELD_C105, DummyMenuAction}, + {sString_WK_SCENE_FIELD_C106, DummyMenuAction}, + {sString_WK_SCENE_FIELD_C107, DummyMenuAction}, + {sString_WK_SCENE_FIELD_C108, DummyMenuAction}, + {sString_WK_SCENE_FIELD_C109, DummyMenuAction} }; static const struct MenuAction sMenuActions_SaveWork_Route101To109[] = { - {gUnknown_Debug_083C3EA1, DummyMenuAction}, - {gUnknown_Debug_083C3EB5, DummyMenuAction}, - {gUnknown_Debug_083C3EC9, DummyMenuAction}, - {gUnknown_Debug_083C3EDD, DummyMenuAction}, - {gUnknown_Debug_083C3EF1, DummyMenuAction}, - {gUnknown_Debug_083C3F05, DummyMenuAction}, - {gUnknown_Debug_083C3F19, DummyMenuAction}, - {gUnknown_Debug_083C3F2D, DummyMenuAction}, - {gUnknown_Debug_083C3F41, DummyMenuAction} + {sString_WK_SCENE_FIELD_R101, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R102, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R103, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R104, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R105, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R106, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R107, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R108, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R109, DummyMenuAction} }; static const struct MenuAction sMenuActions_SaveWork_Route110To118[] = { - {gUnknown_Debug_083C3F55, DummyMenuAction}, - {gUnknown_Debug_083C3F69, DummyMenuAction}, - {gUnknown_Debug_083C3F7D, DummyMenuAction}, - {gUnknown_Debug_083C3F91, DummyMenuAction}, - {gUnknown_Debug_083C3FA5, DummyMenuAction}, - {gUnknown_Debug_083C3FB9, DummyMenuAction}, - {gUnknown_Debug_083C3FCD, DummyMenuAction}, - {gUnknown_Debug_083C3FE1, DummyMenuAction}, - {gUnknown_Debug_083C3FF5, DummyMenuAction} + {sString_WK_SCENE_FIELD_R110, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R111, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R112, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R113, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R114, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R115, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R116, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R117, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R118, DummyMenuAction} }; static const struct MenuAction sMenuActions_SaveWork_Route119To127[] = { - {gUnknown_Debug_083C4009, DummyMenuAction}, - {gUnknown_Debug_083C401D, DummyMenuAction}, - {gUnknown_Debug_083C4031, DummyMenuAction}, - {gUnknown_Debug_083C4045, DummyMenuAction}, - {gUnknown_Debug_083C4059, DummyMenuAction}, - {gUnknown_Debug_083C406D, DummyMenuAction}, - {gUnknown_Debug_083C4081, DummyMenuAction}, - {gUnknown_Debug_083C4095, DummyMenuAction}, - {gUnknown_Debug_083C40A9, DummyMenuAction} + {sString_WK_SCENE_FIELD_R119, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R120, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R121, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R122, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R123, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R124, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R125, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R126, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R127, DummyMenuAction} }; static const struct MenuAction sMenuActions_SaveWork_Route128To134[] = { - {gUnknown_Debug_083C40BD, DummyMenuAction}, - {gUnknown_Debug_083C40D1, DummyMenuAction}, - {gUnknown_Debug_083C40E5, DummyMenuAction}, - {gUnknown_Debug_083C40F9, DummyMenuAction}, - {gUnknown_Debug_083C410D, DummyMenuAction}, - {gUnknown_Debug_083C4121, DummyMenuAction}, - {gUnknown_Debug_083C4135, DummyMenuAction} + {sString_WK_SCENE_FIELD_R128, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R129, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R130, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R131, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R132, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R133, DummyMenuAction}, + {sString_WK_SCENE_FIELD_R134, DummyMenuAction} }; static const struct MenuAction sMenuActions_SaveWork_RoomTown[] = { - {gUnknown_Debug_083C4149, DummyMenuAction}, - {gUnknown_Debug_083C415D, DummyMenuAction}, - {gUnknown_Debug_083C4171, DummyMenuAction}, - {gUnknown_Debug_083C4185, DummyMenuAction}, - {gUnknown_Debug_083C4199, DummyMenuAction} + {sString_WK_SCENE_T101_R0101, DummyMenuAction}, + {sString_WK_SCENE_T101_R0102, DummyMenuAction}, + {sString_WK_SCENE_T101_R0301, DummyMenuAction}, + {sString_WK_SCENE_T101_R0201, DummyMenuAction}, + {sString_WK_SCENE_T101_R0202, DummyMenuAction} }; static const struct MenuAction sMenuActions_SaveWork_RoomCity[] = { - {gUnknown_Debug_083C41C1, DummyMenuAction}, - {gUnknown_Debug_083C41D5, DummyMenuAction}, - {gUnknown_Debug_083C41E9, DummyMenuAction}, - {gUnknown_Debug_083C41FD, DummyMenuAction}, - {gUnknown_Debug_083C4211, DummyMenuAction}, - {gUnknown_Debug_083C4225, DummyMenuAction}, - {gUnknown_Debug_083C4239, DummyMenuAction}, - {gUnknown_Debug_083C424D, DummyMenuAction}, - {gUnknown_Debug_083C4261, DummyMenuAction} + {sString_WK_SCENE_C101_R0201, DummyMenuAction}, + {sString_WK_SCENE_C104_R0103, DummyMenuAction}, + {sString_WK_SCENE_C103_R0101, DummyMenuAction}, + {sString_WK_SCENE_C106_R0202, DummyMenuAction}, + {sString_WK_SCENE_C106_R0401, DummyMenuAction}, + {sString_WK_SCENE_C101_R0601, DummyMenuAction}, + {sString_WK_SCENE_C102_R0501, DummyMenuAction}, + {sString_WK_SCENE_C104_R0102, DummyMenuAction}, + {sString_WK_SCENE_C107_R0501, DummyMenuAction} }; static const struct MenuAction sMenuActions_SaveWork_Dungeon[] = { - {gUnknown_Debug_083C4275, DummyMenuAction}, - {gUnknown_Debug_083C4289, DummyMenuAction}, - {gUnknown_Debug_083C429D, DummyMenuAction}, - {gUnknown_Debug_083C42B1, DummyMenuAction}, - {gUnknown_Debug_083C42C5, DummyMenuAction}, - {gUnknown_Debug_083C42D9, DummyMenuAction}, - {gUnknown_Debug_083C42ED, DummyMenuAction}, - {gUnknown_Debug_083C4301, DummyMenuAction}, - {gUnknown_Debug_083C4315, DummyMenuAction} + {sString_WK_SCENE_CAVE_D0601, DummyMenuAction}, + {sString_WK_SCENE_CAVE_D0201, DummyMenuAction}, + {sString_WK_SCENE_CAVE_D1206, DummyMenuAction}, + {sString_WK_SCENE_CAVE_D1111, DummyMenuAction}, + {sString_WK_SCENE_CAVE_D0701, DummyMenuAction}, + {sString_WK_SCENE_CAVE_D0808, DummyMenuAction}, + {sString_WK_SCENE_CAVE_D1602, DummyMenuAction}, + {sString_WK_SCENE_CAVE_D0101, DummyMenuAction}, + {sString_WK_SCENE_CAVE_D1301, DummyMenuAction} }; static const u8 gUnknown_Debug_083C457C[] = {8, 9, 9, 9, 9, 7, 6, 9, 9}; @@ -2988,14 +2988,14 @@ static void debug_sub_808D358(u8 whichMenu) static bool8 ControlFlags_FH_OBJ_InitSubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C105C) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C105C), gUnknown_Debug_083C105C); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C105C), 0, 27); - gMenuCallback = debug_sub_808D40C; + Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ), sMenuActions_ControlFlags_FH_OBJ); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ), 0, 27); + gMenuCallback = ControlFlags_FH_OBJ_HandleInput; return FALSE; } -static bool8 debug_sub_808D40C(void) +static bool8 ControlFlags_FH_OBJ_HandleInput(void) { s8 input = Menu_ProcessInput(); @@ -3006,39 +3006,39 @@ static bool8 debug_sub_808D40C(void) CloseMenu(); return TRUE; } - gMenuCallback = gUnknown_Debug_083C105C[input].func; + gMenuCallback = sMenuActions_ControlFlags_FH_OBJ[input].func; return FALSE; } -static bool8 debug_sub_808D450(void) +static bool8 ControlFlags_FH_OBJ00_08_InitSubsubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C10BD) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C10BD), gUnknown_Debug_083C10BD); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C10BD), 0, 28); + Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ00_08) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ00_08), sMenuActions_ControlFlags_FH_OBJ00_08); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ00_08), 0, 28); sFlagAndVarTest_WhichSubmenu = 0; - gMenuCallback = debug_sub_808D500; + gMenuCallback = ControlFlags_FH_OBJ_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808D4A8(void) +static bool8 ControlFlags_FH_OBJ09_15_InitSubsubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1); - Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C1149); + Menu_PrintItems(2, 1, 7, sMenuActions_ControlFlags_FH_OBJ09_15); InitMenu(0, 1, 1, 7, 0, 28); sFlagAndVarTest_WhichSubmenu = 1; - gMenuCallback = debug_sub_808D500; + gMenuCallback = ControlFlags_FH_OBJ_Subsubmenu_HandleInput; return FALSE; } -static bool8 debug_sub_808D500(void) +static bool8 ControlFlags_FH_OBJ_Subsubmenu_HandleInput(void) { s8 input = Menu_ProcessInput(); s8 cursorPos = Menu_GetCursorPos(); - debug_sub_808D54C(sFlagAndVarTest_WhichSubmenu, cursorPos); - debug_sub_808D59C(sFlagAndVarTest_WhichSubmenu); + ControlFlags_FH_OBJ_FlagToggle(sFlagAndVarTest_WhichSubmenu, cursorPos); + ControlFlags_FH_OBJ_UpdateDisplay(sFlagAndVarTest_WhichSubmenu); if (input == -2) return FALSE; if (input == -1) @@ -3049,24 +3049,24 @@ static bool8 debug_sub_808D500(void) return FALSE; } -static void debug_sub_808D54C(u8 whichMenu, u8 cursorPos) +static void ControlFlags_FH_OBJ_FlagToggle(u8 whichMenu, u8 cursorPos) { if (gMain.newKeys & R_BUTTON) { - if (!FlagGet(gUnknown_Debug_083C1196[whichMenu][cursorPos])) - FlagSet(gUnknown_Debug_083C1196[whichMenu][cursorPos]); + if (!FlagGet(sControlFlags_FH_OBJ_FlagsArrays[whichMenu][cursorPos])) + FlagSet(sControlFlags_FH_OBJ_FlagsArrays[whichMenu][cursorPos]); else - FlagClear(gUnknown_Debug_083C1196[whichMenu][cursorPos]); + FlagClear(sControlFlags_FH_OBJ_FlagsArrays[whichMenu][cursorPos]); } } -static void debug_sub_808D59C(u8 whichMenu) +static void ControlFlags_FH_OBJ_UpdateDisplay(u8 whichMenu) { u8 i; - for (i = 0; i < gUnknown_Debug_083C1194[whichMenu]; i++) + for (i = 0; i < sControlFlags_FH_OBJ_CountsArray[whichMenu]; i++) { - PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1196[whichMenu][i]) ? 1 : 0); + PrintBool(28, 2 * i + 1, FlagGet(sControlFlags_FH_OBJ_FlagsArrays[whichMenu][i]) ? 1 : 0); } } @@ -3445,14 +3445,14 @@ static void debug_sub_808DF64(u8 whichMenu, u8 cursorPos) static bool8 ControlWorks_SaveWorkPart2_InitSubmenu(void) { Menu_EraseScreen(); - Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C377C) + 1); - Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C377C), gUnknown_Debug_083C377C); - InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C377C), 0, 23); - gMenuCallback = debug_sub_808E010; + Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(sMenuActions_ControlWorks_SaveWorkPart2) + 1); + Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlWorks_SaveWorkPart2), sMenuActions_ControlWorks_SaveWorkPart2); + InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlWorks_SaveWorkPart2), 0, 23); + gMenuCallback = ControlWorks_SaveWorkPart2_HandleInput; return FALSE; } -static bool8 debug_sub_808E010(void) +static bool8 ControlWorks_SaveWorkPart2_HandleInput(void) { s8 input = Menu_ProcessInput(); @@ -3463,11 +3463,11 @@ static bool8 debug_sub_808E010(void) CloseMenu(); return TRUE; } - gMenuCallback = gUnknown_Debug_083C377C[input].func; + gMenuCallback = sMenuActions_ControlWorks_SaveWorkPart2[input].func; return FALSE; } -static bool8 debug_sub_808E054(void) +static bool8 ControlWorks_SaveWorkPart2_SP_InitSubsubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1); @@ -3478,7 +3478,7 @@ static bool8 debug_sub_808E054(void) return FALSE; } -static bool8 debug_sub_808E0AC(void) +static bool8 ControlWorks_SaveWorkPart2_RoomR110Part1TrickHouse_InitSubsubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1); @@ -3489,7 +3489,7 @@ static bool8 debug_sub_808E0AC(void) return FALSE; } -static bool8 debug_sub_808E104(void) +static bool8 ControlWorks_SaveWorkPart2_RoomR110Part2_InitSubsubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3B28) + 1); @@ -3500,7 +3500,7 @@ static bool8 debug_sub_808E104(void) return FALSE; } -static bool8 debug_sub_808E15C(void) +static bool8 ControlWorks_SaveWorkPart2_RoomLoad_InitSubsubmenu(void) { Menu_EraseScreen(); Menu_DrawStdWindowFrame(0, 0, 29, 2 * 2 + 1); -- cgit v1.2.3 From 570d547ee7d3a57da026d2fac007036beaf80233 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Thu, 15 Mar 2018 08:12:14 -0700 Subject: Document PIN_MISSILE and ICICLE_SPEAR anims --- src/battle/anim/bug.c | 25 ++++++++++++++++--------- src/battle/anim/cutter.c | 2 +- src/battle/anim/dark.c | 2 +- src/battle/anim/flying_path.c | 14 +++++++------- src/battle/anim/homing.c | 2 +- src/battle/anim/money.c | 2 +- src/battle/anim/orbs.c | 2 +- src/battle/anim/poison.c | 4 ++-- src/battle/anim/psychic.c | 2 +- src/battle/anim/rock.c | 2 +- src/battle/anim/seed.c | 2 +- src/battle/anim/sonic.c | 2 +- src/battle/pokeball.c | 6 +++--- src/rom_8077ABC.c | 6 +++--- 14 files changed, 40 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c index e12f55a8b..d24f8bfef 100644 --- a/src/battle/anim/bug.c +++ b/src/battle/anim/bug.c @@ -13,7 +13,7 @@ static void sub_80DCA38(struct Sprite *sprite); static void sub_80DCAEC(struct Sprite *sprite); static void sub_80DCB5C(struct Sprite *sprite); static void sub_80DCBB4(struct Sprite *sprite); -void sub_80DCD78(struct Sprite *sprite); +static void AnimMissileArcStep(struct Sprite *sprite); // used in Move_MEGAHORN void sub_80DC824(struct Sprite *sprite) @@ -216,7 +216,7 @@ void sub_80DCBCC(struct Sprite *sprite) lVarX = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; lVarY = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - rot = sub_80790F0(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y); + rot = ArcTan2Neg(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y); rot += 0xC000; sub_8078FDC(sprite, FALSE, 0x100, 0x100, rot); @@ -230,7 +230,14 @@ void sub_80DCBCC(struct Sprite *sprite) // used in 2 moves: // Move_PIN_MISSILE, Move_ICICLE_SPEAR -void sub_80DCCFC(struct Sprite *sprite) +// Rotates sprite and moves it in an arc, so that it appears like a missle or arrow traveling. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x pixel offset +// arg 3: target y pixel offset +// arg 4: duration +// arg 5: wave amplitude +void AnimMissileArc(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); @@ -241,13 +248,13 @@ void sub_80DCCFC(struct Sprite *sprite) sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); - sprite->callback = sub_80DCD78; + sprite->callback = AnimMissileArcStep; sprite->invisible = TRUE; } -void sub_80DCD78(struct Sprite *sprite) +static void AnimMissileArcStep(struct Sprite *sprite) { sprite->invisible = FALSE; @@ -273,10 +280,10 @@ void sub_80DCD78(struct Sprite *sprite) if (!TranslateAnimSpriteLinearAndSine(sprite)) { - u16 rot = sub_80790F0(sprite->pos1.x + sprite->pos2.x - x2, + u16 rotation = ArcTan2Neg(sprite->pos1.x + sprite->pos2.x - x2, sprite->pos1.y + sprite->pos2.y - y2); - rot += 0xC000; - sub_8078FDC(sprite, FALSE, 0x100, 0x100, rot); + rotation += 0xC000; + sub_8078FDC(sprite, FALSE, 0x100, 0x100, rotation); for (i = 0; i < 8; i++) data[i] = tempData[i]; diff --git a/src/battle/anim/cutter.c b/src/battle/anim/cutter.c index 0f23fed82..fed3598fc 100644 --- a/src/battle/anim/cutter.c +++ b/src/battle/anim/cutter.c @@ -43,7 +43,7 @@ void AnimTranslateLinearSingleSineWave(struct Sprite* sprite) } sprite->data[5] = gBattleAnimArgs[5]; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)) { sprite->data[0] = 1; diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index aaf8507c6..055cf5802 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -238,7 +238,7 @@ void sub_80DFFD0(struct Sprite *sprite) sprite->data[4] = sprite->pos1.y + 12; sprite->data[5] = -12; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); sprite->callback = sub_80E00D0; } diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c index 559f617c6..70c418afc 100644 --- a/src/battle/anim/flying_path.c +++ b/src/battle/anim/flying_path.c @@ -40,7 +40,7 @@ void sub_80CBDF4(u8 taskId) gSprites[task->data[2]].data[3] = task->data[9]; gSprites[task->data[2]].data[4] = task->data[7] + (task->data[11] / 2 + 10) * task->data[5]; gSprites[task->data[2]].data[5] = sub_80CC338(&gSprites[task->data[2]]); - sub_80786EC(&gSprites[task->data[2]]); + InitAnimSpriteTranslationOverDuration(&gSprites[task->data[2]]); task->func = sub_80CBF5C; } @@ -98,7 +98,7 @@ void sub_80CBF5C(u8 taskId) task->data[3] = a; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); task->data[0]++; break; case 2: @@ -123,7 +123,7 @@ void sub_80CBF5C(u8 taskId) task->data[3] = 2; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); task->data[0]++; break; case 5: @@ -141,7 +141,7 @@ void sub_80CBF5C(u8 taskId) task->data[3] = 3; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); task->data[0]++; break; case 6: @@ -167,7 +167,7 @@ void sub_80CBF5C(u8 taskId) task->data[3] = 4; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); task->data[0]++; break; case 9: @@ -184,7 +184,7 @@ void sub_80CBF5C(u8 taskId) task->data[3] = 5; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); task->data[0]++; break; case 10: @@ -215,7 +215,7 @@ void sub_80CBF5C(u8 taskId) task->data[3] = 6; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); task->data[0]++; break; } diff --git a/src/battle/anim/homing.c b/src/battle/anim/homing.c index 6fb4a76d8..208d3b831 100644 --- a/src/battle/anim/homing.c +++ b/src/battle/anim/homing.c @@ -60,7 +60,7 @@ void sub_80CC6CC(struct Sprite* sprite) sprite->data[2] = y * 16; sprite->data[3] = (sprite->data[5] - sprite->pos1.x) * 16 / gBattleAnimArgs[4]; sprite->data[4] = (sprite->data[6] - sprite->pos1.y) * 16 / gBattleAnimArgs[4]; - c = sub_80790F0(sprite->data[5] - x, sprite->data[6] - y); + c = ArcTan2Neg(sprite->data[5] - x, sprite->data[6] - y); if (IsContest()) c -= 0x8000; diff --git a/src/battle/anim/money.c b/src/battle/anim/money.c index 0ee381e13..c3d130750 100644 --- a/src/battle/anim/money.c +++ b/src/battle/anim/money.c @@ -26,7 +26,7 @@ void sub_80CFE9C(struct Sprite* sprite) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; r6 += gBattleAnimArgs[2]; - var = sub_80790F0(r6 - sprite->pos1.x, r7 - sprite->pos1.y); + var = ArcTan2Neg(r6 - sprite->pos1.x, r7 - sprite->pos1.y); var += 0xC000; sub_8078FDC(sprite, 0, 0x100, 0x100, var); sprite->data[0] = gBattleAnimArgs[4]; diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c index b965cacb8..6f1bba9c3 100644 --- a/src/battle/anim/orbs.c +++ b/src/battle/anim/orbs.c @@ -99,7 +99,7 @@ void sub_80CA9A8(struct Sprite* sprite) sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2); sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3); sprite->data[5] = gBattleAnimArgs[2]; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); sprite->callback = sub_80CA9F8; } diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c index 272d99e84..019e2acff 100644 --- a/src/battle/anim/poison.c +++ b/src/battle/anim/poison.c @@ -24,7 +24,7 @@ void sub_80D9D70(struct Sprite *sprite) sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); sprite->data[5] = -30; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); sprite->callback = sub_80D9DD4; } @@ -52,7 +52,7 @@ void sub_80D9DF0(struct Sprite *sprite) sprite->data[4] = l2 + gBattleAnimArgs[5]; sprite->data[5] = -30; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); sprite->callback = sub_80D9E78; } diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c index b108c496a..42f396870 100644 --- a/src/battle/anim/psychic.c +++ b/src/battle/anim/psychic.c @@ -522,7 +522,7 @@ static void sub_80DC1FC(u8 taskId) gSprites[spriteId].data[4] = task->data[14]; gSprites[spriteId].data[5] = task->data[10]; - sub_80786EC(&gSprites[spriteId]); + InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3); } diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c index 1d1772b1b..6fbe065b8 100644 --- a/src/battle/anim/rock.c +++ b/src/battle/anim/rock.c @@ -446,7 +446,7 @@ static void sub_80DD774(struct Task *task) gSprites[spriteId].data[5] = -16 - (task->data[1] * 2); gSprites[spriteId].oam.tileNum += var0; - sub_80786EC(&gSprites[spriteId]); + InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]); task->data[11]++; } diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c index e3d4bd3fb..ef4cdddb2 100644 --- a/src/battle/anim/seed.c +++ b/src/battle/anim/seed.c @@ -25,7 +25,7 @@ void sub_80CAB18(struct Sprite* sprite) sprite->data[2] = GetBankPosition(gAnimBankTarget, 0) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, 1) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); sprite->callback = sub_80CAB88; } diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c index 2808c86c2..ff3ba9480 100644 --- a/src/battle/anim/sonic.c +++ b/src/battle/anim/sonic.c @@ -32,7 +32,7 @@ void sub_80CF6DC(struct Sprite* sprite) InitAnimSpritePos(sprite, 1); a = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; b = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - c = sub_80790F0(a - sprite->pos1.x, b - sprite->pos1.y); + c = ArcTan2Neg(a - sprite->pos1.x, b - sprite->pos1.y); c += 0xF000; if (IsContest()) c -= 0x6000; diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c index 3a47e0204..20c6d8676 100644 --- a/src/battle/pokeball.c +++ b/src/battle/pokeball.c @@ -297,7 +297,7 @@ const struct SpriteTemplate gBallSpriteTemplates[] = }; extern u32 ball_number_to_ball_processing_index(u16); // not sure of return type -extern void sub_80786EC(); +extern void InitAnimSpriteTranslationOverDuration(); extern bool8 TranslateAnimSpriteLinearAndSine(struct Sprite *); extern u8 sub_814086C(u8, u8, int, int, u8); extern u8 sub_8141314(u8, u8, int, u8); @@ -397,7 +397,7 @@ static void sub_8046464(u8 taskId) gSprites[spriteId].data[2] = GetBankPosition(gBankTarget, 0); gSprites[spriteId].data[4] = GetBankPosition(gBankTarget, 1) - 16; gSprites[spriteId].data[5] = -40; - sub_80786EC(&gSprites[spriteId]); + InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]); gSprites[spriteId].oam.affineParam = taskId; gTasks[taskId].data[4] = gBankTarget; gTasks[taskId].func = TaskDummy; @@ -834,7 +834,7 @@ static void sub_8047074(struct Sprite *sprite) sprite->data[4] = GetBankPosition(sprite->data[6], 3) + 24; sprite->data[5] = -30; sprite->oam.affineParam = sprite->data[6]; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); sprite->callback = sub_80470C4; } diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 395736d03..89526f372 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -764,7 +764,7 @@ void sub_807867C(struct Sprite *sprite, s16 a2) } } -void sub_80786EC(struct Sprite *sprite) +void InitAnimSpriteTranslationOverDuration(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; @@ -1234,7 +1234,7 @@ static u16 ArcTan2_(s16 a, s16 b) return ArcTan2(a, b); } -u16 sub_80790F0(s16 a, s16 b) +u16 ArcTan2Neg(s16 a, s16 b) { u16 var = ArcTan2_(a, b); return -var; @@ -1437,7 +1437,7 @@ void sub_80794A8(struct Sprite *sprite) sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; - sub_80786EC(sprite); + InitAnimSpriteTranslationOverDuration(sprite); sprite->callback = sub_8079518; } -- cgit v1.2.3 From e2cd9b404041282933e5a760b6b90b614cbcdf26 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Thu, 15 Mar 2018 08:53:13 -0700 Subject: Document TAKE_DOWN anim --- src/battle/battle_anim_80A7E7C.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index f339a1206..f4b899eba 100644 --- a/src/battle/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -30,8 +30,8 @@ static void SlideMonToOriginalPosStep(struct Sprite *sprite); static void SlideMonToOffset(struct Sprite *sprite); static void sub_80A8818(struct Sprite *sprite); static void sub_80A88F0(struct Sprite *sprite); -static void sub_80A89B4(u8 taskId); -static void sub_80A8A18(u8 taskId); +static void AnimTask_WindUpLungePart1(u8 taskId); +static void AnimTask_WindUpLungePart2(u8 taskId); static void AnimTask_SwayMonStep(u8 taskId); static void sub_80A8D8C(u8 taskId); static void sub_80A8FD8(u8 taskId); @@ -646,11 +646,20 @@ static void sub_80A88F0(struct Sprite *sprite) DestroyAnimSprite(sprite); } -void sub_80A8920(u8 taskId) +// Task to facilitate a two-part translation animation, in which the sprite +// is first translated in an arc to one position. Then, it "lunges" to a target +// x offset. Used in TAKE_DOWN, for example. +// arg 0: anim bank +// arg 1: horizontal speed (subpixel) +// arg 2: wave amplitude +// arg 3: first duration +// arg 4: delay before starting lunge +// arg 5: target x offset for lunge +// arg 6: lunge duration +void AnimTask_WindUpLunge(u8 taskId) { - s16 r7; - r7 = 0x8000 / gBattleAnimArgs[3]; - if (GetBankSide(gAnimBankAttacker)) + s16 wavePeriod = 0x8000 / gBattleAnimArgs[3]; + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[5] = -gBattleAnimArgs[5]; @@ -662,11 +671,11 @@ void sub_80A8920(u8 taskId) TASK.data[4] = gBattleAnimArgs[4]; TASK.data[5] = (gBattleAnimArgs[5] << 8) / gBattleAnimArgs[6]; TASK.data[6] = gBattleAnimArgs[6]; - TASK.data[7] = r7; - TASK.func = sub_80A89B4; + TASK.data[7] = wavePeriod; + TASK.func = AnimTask_WindUpLungePart1; } -static void sub_80A89B4(u8 taskId) +static void AnimTask_WindUpLungePart1(u8 taskId) { u8 spriteId; spriteId = TASK.data[0]; @@ -676,11 +685,11 @@ static void sub_80A89B4(u8 taskId) TASK.data[10] += TASK.data[7]; if (--TASK.data[3] == 0) { - TASK.func = sub_80A8A18; + TASK.func = AnimTask_WindUpLungePart2; } } -static void sub_80A8A18(u8 taskId) +static void AnimTask_WindUpLungePart2(u8 taskId) { u8 spriteId; if (TASK.data[4] > 0) -- cgit v1.2.3 From 3c9552befdbd295b94a06fca31a4c03c667465b3 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sat, 17 Mar 2018 11:44:32 -0700 Subject: More battle anim documentation --- src/battle/anim/bubble.c | 2 +- src/battle/anim/bug.c | 12 +++++-- src/battle/anim/drum.c | 2 +- src/battle/anim/fight.c | 51 ++++++++++++++++++++---------- src/battle/anim/fire_2.c | 67 +++++++++++++++++++++++++++------------- src/battle/anim/flying_hearts.c | 2 +- src/battle/anim/orbit_fast.c | 17 +++++----- src/battle/anim/orbit_scatter.c | 14 ++++----- src/battle/anim/poison.c | 14 ++++++--- src/battle/anim/scan.c | 8 ++--- src/battle/anim/seed.c | 25 +++++++++------ src/battle/anim/slash.c | 2 +- src/battle/anim/slice.c | 20 ++++++------ src/battle/anim/sonic.c | 34 +++++++++++--------- src/battle/anim/unused_8.c | 2 +- src/battle/battle_anim_80A7E7C.c | 14 ++++++--- src/rom_8077ABC.c | 57 ++++++++++++++++++++-------------- 17 files changed, 211 insertions(+), 132 deletions(-) (limited to 'src') diff --git a/src/battle/anim/bubble.c b/src/battle/anim/bubble.c index 1252c1315..d6ec06be9 100644 --- a/src/battle/anim/bubble.c +++ b/src/battle/anim/bubble.c @@ -97,6 +97,6 @@ static void sub_80D3370(struct Sprite *sprite) static void sub_80D3398(struct Sprite *sprite) { sprite->data[0] = 10; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, move_anim_8074EE0); } diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c index d24f8bfef..d57a1046e 100644 --- a/src/battle/anim/bug.c +++ b/src/battle/anim/bug.c @@ -174,9 +174,15 @@ static void sub_80DCBB4(struct Sprite *sprite) DestroyAnimSprite(sprite); } -// used in 3 moves: -// Move_POISON_STING, Move_TWINEEDLE, Move_SPIKE_CANNON -void sub_80DCBCC(struct Sprite *sprite) +// Translates a stinger sprite linearly to a destination location. The sprite is +// initially rotated so that it appears to be traveling in a straight line. +// Used by Move_POISON_STING, Move_TWINEEDLE, Move_SPIKE_CANNON +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x pixel offset +// arg 3: target y pixel offset +// arg 4: duration +void AnimTranslateStinger(struct Sprite *sprite) { s16 lVarX, lVarY; u16 rot; diff --git a/src/battle/anim/drum.c b/src/battle/anim/drum.c index 6306778ae..7937d040a 100644 --- a/src/battle/anim/drum.c +++ b/src/battle/anim/drum.c @@ -27,6 +27,6 @@ void sub_80CEDF0(struct Sprite* sprite) sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + a; sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + 8; sprite->data[0] = 8; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c index a7c25de49..0f46187f2 100644 --- a/src/battle/anim/fight.c +++ b/src/battle/anim/fight.c @@ -29,9 +29,9 @@ extern struct SpriteTemplate gBasicHitSplatSpriteTemplate; static void sub_80D927C(struct Sprite *sprite); static void sub_80D9328(struct Sprite *sprite); static void sub_80D9404(struct Sprite *sprite); -static void sub_80D9474(struct Sprite *sprite); -static void sub_80D94CC(struct Sprite *sprite); -static void sub_80D9524(struct Sprite *sprite); +static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite); +static void AnimStompFootStep(struct Sprite *sprite); +static void AnimStompFootEnd(struct Sprite *sprite); static void sub_80D9640(struct Sprite *sprite); static void sub_80D97A0(struct Sprite *sprite); static void sub_80D986C(struct Sprite *sprite); @@ -44,7 +44,7 @@ void sub_080B08A0(struct Sprite *sprite) sub_807867C(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; sprite->data[0] = 15; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -72,7 +72,14 @@ void sub_80D9078(struct Sprite *sprite) sub_80D902C(sprite); } -void sub_80D90A4(struct Sprite *sprite) +// Displays a basic fist or foot sprite for a given duration. +// Used by many fighting moves (and elemental "punch" moves). +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: duration +// arg 3: ? (todo: related to initial pixel offsets) +// arg 4: anim num +void AnimBasicFistOrFoot(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); @@ -82,7 +89,7 @@ void sub_80D90A4(struct Sprite *sprite) sub_8078764(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -225,35 +232,45 @@ static void sub_80D9404(struct Sprite *sprite) } } -void sub_80D943C(struct Sprite *sprite) +// Animates the spinning, shrinking kick or punch, which then +// reappears at full size. Used by moves such as MOVE_MEGA_PUNCH and MOVE_MEGA_KICK. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: anim num +// arg 3: spin duration +void AnimSpinningKickOrPunch(struct Sprite *sprite) { sub_8078764(sprite, 1); StartSpriteAnim(sprite, gBattleAnimArgs[2]); sprite->data[0] = gBattleAnimArgs[3]; - sprite->callback = sub_80782D8; - StoreSpriteCallbackInData(sprite, sub_80D9474); + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData(sprite, AnimSpinningKickOrPunchFinish); } -static void sub_80D9474(struct Sprite *sprite) +static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, 0); sprite->affineAnimPaused = 1; sprite->data[0] = 20; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -void sub_80D94A8(struct Sprite *sprite) +// Animates MOVE_STOMP's foot that slides downward. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: initial wait duration +void AnimStompFoot(struct Sprite *sprite) { sub_8078764(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; - sprite->callback = sub_80D94CC; + sprite->callback = AnimStompFootStep; } -static void sub_80D94CC(struct Sprite *sprite) +static void AnimStompFootStep(struct Sprite *sprite) { if (--sprite->data[0] == -1) { @@ -262,15 +279,15 @@ static void sub_80D94CC(struct Sprite *sprite) sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); sprite->callback = StartTranslateAnimSpriteByDeltas; - StoreSpriteCallbackInData(sprite, sub_80D9524); + StoreSpriteCallbackInData(sprite, AnimStompFootEnd); } } -static void sub_80D9524(struct Sprite *sprite) +static void AnimStompFootEnd(struct Sprite *sprite) { sprite->data[0] = 15; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c index fe63fcff1..f9c9b6d3b 100644 --- a/src/battle/anim/fire_2.c +++ b/src/battle/anim/fire_2.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "battle_anim.h" #include "heated_rock.h" #include "rom_8077ABC.h" @@ -11,24 +12,34 @@ extern u8 gAnimBankTarget; extern struct SpriteTemplate gSpriteTemplate_83D96C4; extern s16 gHeatedRockCoords[7][2]; -void sub_80D5254(struct Sprite *); -void sub_80D5348(struct Sprite *); -void sub_80D52AC(struct Sprite *); -void sub_80D5324(struct Sprite *); +static void AnimFireRingStep1(struct Sprite *); +static void UpdateFireRingCircleOffset(struct Sprite *); +static void AnimFireRingStep2(struct Sprite *); +static void AnimFireRingStep3(struct Sprite *); void sub_80D53F4(struct Sprite *); void sub_80D541C(struct Sprite *); void sub_80D54E0(u8 taskId); void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3); -void sub_80D51A8(struct Sprite *sprite) + +// Animates the secondary effect of MOVE_EMBER, where the flames grow and slide +// horizontally a bit. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x pixel offset +// arg 3: target y pixel offset +// arg 4: duration +// arg 5: ? (todo: something related to which mon the pixel offsets are based on) +// arg 6: ? (todo: something related to which mon the pixel offsets are based on) +void AnimEmberFlare(struct Sprite *sprite) { if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget) - && (gAnimBankAttacker == GetBankByIdentity(2) - || gAnimBankAttacker == GetBankByIdentity(3))) + && (gAnimBankAttacker == GetBankByIdentity(IDENTITY_PLAYER_MON2) + || gAnimBankAttacker == GetBankByIdentity(IDENTITY_OPPONENT_MON2))) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->callback = sub_8079534; - sub_8079534(sprite); + sprite->callback(sprite); } struct Sprite *sub_80D5210(struct Sprite *sprite) @@ -40,19 +51,26 @@ struct Sprite *sub_80D5210(struct Sprite *sprite) return sprite; } -void sub_80D522C(struct Sprite *sprite) +// Animates the a fire sprite in the first-half of the MOVE_FIRE_BLAST +// animation. The fire sprite first moves in a circle around the mon, +// and then it is translated towards the target mon, while still rotating. +// Lastly, it moves in a circle around the target mon. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: initial wave offset +void AnimFireRing(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); sprite->data[7] = gBattleAnimArgs[2]; sprite->data[0] = 0; - sprite->callback = sub_80D5254; + sprite->callback = AnimFireRingStep1; } -void sub_80D5254(struct Sprite *sprite) +static void AnimFireRingStep1(struct Sprite *sprite) { - sub_80D5348(sprite); + UpdateFireRingCircleOffset(sprite); if (++sprite->data[0] == 0x12) { @@ -64,11 +82,11 @@ void sub_80D5254(struct Sprite *sprite) InitAnimSpriteTranslationDeltas(sprite); - sprite->callback = sub_80D52AC; + sprite->callback = AnimFireRingStep2; } } -void sub_80D52AC(struct Sprite *sprite) +static void AnimFireRingStep2(struct Sprite *sprite) { if (TranslateAnimSpriteByDeltas(sprite)) { @@ -79,8 +97,8 @@ void sub_80D52AC(struct Sprite *sprite) sprite->pos2.y = 0; sprite->pos2.x = 0; - sprite->callback = sub_80D5324; - sub_80D5324(sprite); + sprite->callback = AnimFireRingStep3; + sprite->callback(sprite); } else { @@ -91,15 +109,15 @@ void sub_80D52AC(struct Sprite *sprite) } } -void sub_80D5324(struct Sprite *sprite) +static void AnimFireRingStep3(struct Sprite *sprite) { - sub_80D5348(sprite); + UpdateFireRingCircleOffset(sprite); if (++sprite->data[0] == 0x1F) DestroyAnimSprite(sprite); } -void sub_80D5348(struct Sprite *sprite) +static void UpdateFireRingCircleOffset(struct Sprite *sprite) { sprite->pos2.x = Sin(sprite->data[7], 28); sprite->pos2.y = Cos(sprite->data[7], 28); @@ -107,7 +125,12 @@ void sub_80D5348(struct Sprite *sprite) sprite->data[7] = (sprite->data[7] + 20) & 0xFF; } -void sub_80D5374(struct Sprite *sprite) +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: duration +// arg 3: x delta +// arg 4: y delta +void AnimFireCross(struct Sprite *sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -118,7 +141,7 @@ void sub_80D5374(struct Sprite *sprite) StoreSpriteCallbackInData(sprite, DestroyAnimSprite); - sprite->callback = sub_8078364; + sprite->callback = TranslateSpriteOverDuration; } void sub_80D53B4(struct Sprite *sprite) @@ -129,7 +152,7 @@ void sub_80D53B4(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[3]; sprite->invisible = TRUE; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, sub_80D53F4); } diff --git a/src/battle/anim/flying_hearts.c b/src/battle/anim/flying_hearts.c index d2d22602a..f20416535 100644 --- a/src/battle/anim/flying_hearts.c +++ b/src/battle/anim/flying_hearts.c @@ -19,7 +19,7 @@ void sub_80D2064(struct Sprite* sprite) sprite->pos1.y = 0xA0; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[1]; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, sub_80D2094); } diff --git a/src/battle/anim/orbit_fast.c b/src/battle/anim/orbit_fast.c index 92b67672b..71303b03c 100644 --- a/src/battle/anim/orbit_fast.c +++ b/src/battle/anim/orbit_fast.c @@ -8,12 +8,13 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -static void sub_80D2704(struct Sprite* sprite); +static void AnimOrbitFastStep(struct Sprite* sprite); -// orbit_fast (a quickly moving fast circular motion of a sprite around an object.) -// Used by Hidden Power. - -void sub_80D26A4(struct Sprite* sprite) +// Orbits a sphere in an ellipse around the mon. +// Used by MOVE_HIDDEN_POWER +// arg 0: duration +// arg 1: initial wave offset +void AnimOrbitFast(struct Sprite* sprite) { sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); @@ -21,11 +22,11 @@ void sub_80D26A4(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[1]; sprite->data[7] = sub_8079E90(gAnimBankAttacker); - sprite->callback = sub_80D2704; - sub_80D2704(sprite); + sprite->callback = AnimOrbitFastStep; + sprite->callback(sprite); } -void sub_80D2704(struct Sprite* sprite) +static void AnimOrbitFastStep(struct Sprite* sprite) { if ((u16)(sprite->data[1] - 0x40) <= 0x7F) sprite->subpriority = sprite->data[7] + 1; diff --git a/src/battle/anim/orbit_scatter.c b/src/battle/anim/orbit_scatter.c index 54c157839..cda09a729 100644 --- a/src/battle/anim/orbit_scatter.c +++ b/src/battle/anim/orbit_scatter.c @@ -8,21 +8,21 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -static void sub_80D2834(struct Sprite* sprite); +static void AnimOrbitScatterStep(struct Sprite* sprite); -// orbit_scatter (scatters the objects associated with the fast orbit from the last file.) -// Used in Hidden Power. - -void sub_80D27E0(struct Sprite* sprite) +// Moves orbs away from the mon, based on where they are in their orbit. +// Used in MOVE_HIDDEN_POWER. +// arg 0: initial wave offset +void AnimOrbitScatter(struct Sprite* sprite) { sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3); sprite->data[0] = Sin(gBattleAnimArgs[0], 10); sprite->data[1] = Cos(gBattleAnimArgs[0], 7); - sprite->callback = sub_80D2834; + sprite->callback = AnimOrbitScatterStep; } -void sub_80D2834(struct Sprite* sprite) +static void AnimOrbitScatterStep(struct Sprite* sprite) { sprite->pos2.x += sprite->data[0]; sprite->pos2.y += sprite->data[1]; diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c index 019e2acff..3a7477a57 100644 --- a/src/battle/anim/poison.c +++ b/src/battle/anim/poison.c @@ -10,7 +10,7 @@ extern u8 gAnimBankTarget; void sub_80D9DD4(struct Sprite *sprite); void sub_80D9E78(struct Sprite *sprite); void sub_80D9EE8(struct Sprite *sprite); -void sub_80D9FF0(struct Sprite *sprite); +static void AnimBubbleEffectStep(struct Sprite *sprite); void sub_80D9D70(struct Sprite *sprite) { @@ -108,7 +108,13 @@ void sub_80D9F14(struct Sprite *sprite) StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -void sub_80D9F88(struct Sprite *sprite) +// Animates a bubble by rising upward, swaying side to side, and +// enlarging the sprite. This is used as an after-effect by poison-type +// moves, along with MOVE_BUBBLE, and MOVE_BUBBLEBEAM. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: 0 = single-target, 1 = multi-target +void AnimBubbleEffect(struct Sprite *sprite) { if (!gBattleAnimArgs[2]) { @@ -125,10 +131,10 @@ void sub_80D9F88(struct Sprite *sprite) sprite->pos1.y += gBattleAnimArgs[1]; } - sprite->callback = sub_80D9FF0; + sprite->callback = AnimBubbleEffectStep; } -void sub_80D9FF0(struct Sprite *sprite) +static void AnimBubbleEffectStep(struct Sprite *sprite) { sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF; sprite->pos2.x = Sin(sprite->data[0], 4); diff --git a/src/battle/anim/scan.c b/src/battle/anim/scan.c index e6b85dd5f..403894cc8 100644 --- a/src/battle/anim/scan.c +++ b/src/battle/anim/scan.c @@ -26,7 +26,7 @@ void sub_80CD3E0(struct Sprite* sprite) sprite->pos1.x -= 32; sprite->pos1.y -= 32; sprite->data[0] = 20; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, sub_80CD408); } @@ -36,7 +36,7 @@ void sub_80CD408(struct Sprite* sprite) { case 0: sprite->data[0] = 1; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, sub_80CD408); break; case 1: @@ -62,7 +62,7 @@ void sub_80CD4B8(struct Sprite* sprite) if ((sprite->data[5] >> 8) == 4) { sprite->data[0] = 10; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, sub_80CD4EC); } else @@ -80,7 +80,7 @@ void sub_80CD4EC(struct Sprite* sprite) sprite->data[0] = 3; sprite->data[1] = 0; sprite->data[2] = 0; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, sub_80CD5A8); } else diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c index ef4cdddb2..7f8154504 100644 --- a/src/battle/anim/seed.c +++ b/src/battle/anim/seed.c @@ -7,13 +7,18 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -static void sub_80CAB88(struct Sprite* sprite); -static void sub_80CABC0(struct Sprite* sprite); +static void AnimLeechSeedStep(struct Sprite* sprite); +static void AnimLeechSeedSprouts(struct Sprite* sprite); // seed (sprouts a sapling from a seed.) // Used by Leech Seed. - -void sub_80CAB18(struct Sprite* sprite) +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x pixel offset +// arg 3: target y pixel offset +// arg 4: duration +// arg 5: wave amplitude +void AnimLeechSeed(struct Sprite* sprite) { InitAnimSpritePos(sprite, 1); if (GetBankSide(gAnimBankAttacker)) @@ -26,25 +31,25 @@ void sub_80CAB18(struct Sprite* sprite) sprite->data[4] = GetBankPosition(gAnimBankTarget, 1) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; InitAnimSpriteTranslationOverDuration(sprite); - sprite->callback = sub_80CAB88; + sprite->callback = AnimLeechSeedStep; } -void sub_80CAB88(struct Sprite* sprite) +static void AnimLeechSeedStep(struct Sprite* sprite) { if (TranslateAnimSpriteLinearAndSine(sprite)) { sprite->invisible = 1; sprite->data[0] = 10; - sprite->callback = sub_80782D8; - StoreSpriteCallbackInData(sprite, sub_80CABC0); + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData(sprite, AnimLeechSeedSprouts); } } -void sub_80CABC0(struct Sprite* sprite) +static void AnimLeechSeedSprouts(struct Sprite* sprite) { sprite->invisible = 0; StartSpriteAnim(sprite, 1); sprite->data[0] = 60; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/slash.c b/src/battle/anim/slash.c index 6adcaf098..306968111 100644 --- a/src/battle/anim/slash.c +++ b/src/battle/anim/slash.c @@ -60,7 +60,7 @@ void sub_80CDE78(struct Sprite* sprite) sprite->data[1] = 8; sprite->data[2] = 0; StoreSpriteCallbackInData(sprite, sub_80CDEB0); - sprite->callback = sub_8078364; + sprite->callback = TranslateSpriteOverDuration; } } diff --git a/src/battle/anim/slice.c b/src/battle/anim/slice.c index fe8745483..80c58dddf 100644 --- a/src/battle/anim/slice.c +++ b/src/battle/anim/slice.c @@ -8,19 +8,21 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -static void sub_80CCB00(struct Sprite* sprite); +static void AnimSliceStep(struct Sprite* sprite); -// slice (the cutting animation showing as a yellow line drawn diagonally) -// Used in Cut, Fury Cutter, Aerial Ace, and Air Cutter. - -void sub_80CC914(struct Sprite* sprite) +// Moves the sprite in a diagonally slashing motion across the target mon. +// Used by moves such as MOVE_CUT and MOVE_AERIAL_ACE. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: slice direction; 0 = right-to-left, 1 = left-to-right +void AnimCuttingSlice(struct Sprite* sprite) { sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0); sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1); if (GetBankSide(gAnimBankTarget) == 0) sprite->pos1.y += 8; - sprite->callback = sub_80CCB00; + sprite->callback = AnimSliceStep; if (gBattleAnimArgs[2] == 0) { sprite->pos1.x += gBattleAnimArgs[0]; @@ -70,7 +72,7 @@ void sub_80CC9BC(struct Sprite* sprite) if (GetBankSide(gAnimBankTarget) == 0) sprite->pos1.y += 8; - sprite->callback = sub_80CCB00; + sprite->callback = AnimSliceStep; if (gBattleAnimArgs[2] == 0) { sprite->pos1.x += gBattleAnimArgs[0]; @@ -89,7 +91,7 @@ void sub_80CC9BC(struct Sprite* sprite) sprite->data[1] = -sprite->data[1]; } -void sub_80CCB00(struct Sprite* sprite) +static void AnimSliceStep(struct Sprite* sprite) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; @@ -106,6 +108,6 @@ void sub_80CCB00(struct Sprite* sprite) { StoreSpriteCallbackInData(sprite, DestroyAnimSprite); sprite->data[0] = 3; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; } } diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c index ff3ba9480..1501f51f1 100644 --- a/src/battle/anim/sonic.c +++ b/src/battle/anim/sonic.c @@ -9,14 +9,18 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -// sonic (shoots a projectile towards the target.) -// Used in Sonic Boom and Air Cutter. - -void sub_80CF6DC(struct Sprite* sprite) +// Moves a projectile towards the target mon. The sprite is rotated to be pointing +// in the same direction it's moving. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x pixel offset +// arg 3: target y pixel offset +// arg 4: duration +void AnimSonicBoomProjectile(struct Sprite* sprite) { - s16 a; - s16 b; - u16 c; + s16 targetXPos; + s16 targetYPos; + u16 rotation; if (IsContest()) { @@ -30,17 +34,17 @@ void sub_80CF6DC(struct Sprite* sprite) } InitAnimSpritePos(sprite, 1); - a = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; - b = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - c = ArcTan2Neg(a - sprite->pos1.x, b - sprite->pos1.y); - c += 0xF000; + targetXPos = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + targetYPos = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + rotation = ArcTan2Neg(targetXPos - sprite->pos1.x, targetYPos - sprite->pos1.y); + rotation += 0xF000; if (IsContest()) - c -= 0x6000; + rotation -= 0x6000; - sub_8078FDC(sprite, 0, 0x100, 0x100, c); + sub_8078FDC(sprite, 0, 0x100, 0x100, rotation); sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[2] = a; - sprite->data[4] = b; + sprite->data[2] = targetXPos; + sprite->data[4] = targetYPos; sprite->callback = StartTranslateAnimSpriteByDeltas; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/unused_8.c b/src/battle/anim/unused_8.c index b5e150dd8..c67ec2754 100644 --- a/src/battle/anim/unused_8.c +++ b/src/battle/anim/unused_8.c @@ -19,7 +19,7 @@ void sub_80CF458(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[4]; - sprite->callback = sub_80782D8; + sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData(sprite, sub_80CF490); } diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index f4b899eba..a8b0ec329 100644 --- a/src/battle/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -33,7 +33,7 @@ static void sub_80A88F0(struct Sprite *sprite); static void AnimTask_WindUpLungePart1(u8 taskId); static void AnimTask_WindUpLungePart2(u8 taskId); static void AnimTask_SwayMonStep(u8 taskId); -static void sub_80A8D8C(u8 taskId); +static void AnimTask_ScaleMonAndRestoreStep(u8 taskId); static void sub_80A8FD8(u8 taskId); static void sub_80A913C(u8 taskId); @@ -837,7 +837,13 @@ static void AnimTask_SwayMonStep(u8 taskId) } } -void sub_80A8D34(u8 taskId) +// Scales a mon's sprite, and then scales back to its original dimensions. +// arg 0: x scale delta +// arg 1: y scale delta +// arg 2: duration +// arg 3: anim bank +// arg 4: sprite object mode +void AnimTask_ScaleMonAndRestore(u8 taskId) { u8 spriteId; spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]); @@ -849,10 +855,10 @@ void sub_80A8D34(u8 taskId) TASK.data[4] = spriteId; TASK.data[10] = 0x100; TASK.data[11] = 0x100; - TASK.func = sub_80A8D8C; + TASK.func = AnimTask_ScaleMonAndRestoreStep; } -static void sub_80A8D8C(u8 taskId) +static void AnimTask_ScaleMonAndRestoreStep(u8 taskId) { u8 spriteId; TASK.data[10] += TASK.data[0]; diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 89526f372..9d864fec3 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -551,7 +551,10 @@ void sub_8078278(struct Sprite *sprite) } } -void sub_80782D8(struct Sprite *sprite) +// Simply waits until the sprite's data[0] hits zero. +// This is used to let sprite anims or affine anims to run for a designated +// duration. +void WaitAnimForDuration(struct Sprite *sprite) { if (sprite->data[0] > 0) sprite->data[0]--; @@ -562,7 +565,7 @@ void sub_80782D8(struct Sprite *sprite) void sub_80782F8(struct Sprite *sprite) { sub_8078314(sprite); - sprite->callback = sub_8078364; + sprite->callback = TranslateSpriteOverDuration; sprite->callback(sprite); } @@ -580,7 +583,7 @@ void sub_8078314(struct Sprite *sprite) sprite->data[1] = old; } -void sub_8078364(struct Sprite *sprite) +void TranslateSpriteOverDuration(struct Sprite *sprite) { if (sprite->data[0] > 0) { @@ -1163,13 +1166,13 @@ bool8 sub_8078E38() return FALSE; } -void sub_8078E70(u8 sprite, u8 a2) +void sub_8078E70(u8 sprite, u8 objMode) { u8 r7 = gSprites[sprite].data[0]; if (IsContest() || IsAnimBankSpriteVisible(r7)) gSprites[sprite].invisible = FALSE; - gSprites[sprite].oam.objMode = a2; + gSprites[sprite].oam.objMode = objMode; gSprites[sprite].affineAnimPaused = TRUE; if (!IsContest() && !gSprites[sprite].oam.affineMode) gSprites[sprite].oam.matrixNum = ewram17810[r7].unk6; @@ -1561,20 +1564,26 @@ void sub_80796F8(u8 taskId) } } -void sub_8079790(u8 task) +// Linearly blends a mon's sprite colors with a target color with increasing +// strength, and then blends out to the original color. +// arg 0: anim bank +// arg 1: blend color +// arg 2: target blend coefficient +// arg 3: initial delay +// arg 4: number of times to blend in and out +void AnimTask_BlendMonInAndOut(u8 task) { - u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); - - if (sprite == 0xff) + u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); + if (spriteId == 0xff) { DestroyAnimVisualTask(task); return; } - gTasks[task].data[0] = (gSprites[sprite].oam.paletteNum * 0x10) + 0x101; - sub_80797EC(&gTasks[task]); + gTasks[task].data[0] = (gSprites[spriteId].oam.paletteNum * 0x10) + 0x101; + AnimTask_BlendMonInAndOutSetup(&gTasks[task]); } -void sub_80797EC(struct Task *task) +void AnimTask_BlendMonInAndOutSetup(struct Task *task) { task->data[1] = gBattleAnimArgs[1]; task->data[2] = 0; @@ -1583,10 +1592,10 @@ void sub_80797EC(struct Task *task) task->data[5] = gBattleAnimArgs[3]; task->data[6] = 0; task->data[7] = gBattleAnimArgs[4]; - task->func = sub_8079814; + task->func = AnimTask_BlendMonInAndOutStep; } -void sub_8079814(u8 taskId) +void AnimTask_BlendMonInAndOutStep(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -1596,14 +1605,14 @@ void sub_8079814(u8 taskId) if (!task->data[6]) { task->data[2]++; - BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); + BlendPalette(task->data[0], 15, task->data[2], task->data[1]); if (task->data[2] == task->data[3]) task->data[6] = 1; } else { task->data[2]--; - BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]); + BlendPalette(task->data[0], 15, task->data[2], task->data[1]); if (!task->data[2]) { if (--task->data[7]) @@ -1631,7 +1640,7 @@ void sub_80798AC(u8 task) return; } gTasks[task].data[0] = (palette * 0x10) + 0x101; - sub_80797EC(&gTasks[task]); + AnimTask_BlendMonInAndOutSetup(&gTasks[task]); } void sub_80798F4(struct Task *task, u8 a2, const void *a3) @@ -1873,26 +1882,26 @@ void sub_8079E24() } } -u8 sub_8079E90(u8 slot) +u8 sub_8079E90(u8 bank) { - u8 status; + u8 identity; u8 ret; if (IsContest()) { - if (slot == 2) + if (bank == ANIM_BANK_ATK_PARTNER) return 30; else return 40; } else { - status = GetBankIdentity(slot); - if (status == 0) + identity = GetBankIdentity(bank); + if (identity == IDENTITY_PLAYER_MON1) ret = 30; - else if (status == 2) + else if (identity == IDENTITY_PLAYER_MON2) ret = 20; - else if (status == 1) + else if (identity == IDENTITY_OPPONENT_MON1) ret = 40; else ret = 50; -- cgit v1.2.3 From 583724758e97fafc8e6796f13d2c46660d6f4388 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Mon, 19 Mar 2018 21:18:06 -0700 Subject: Label and use constants for weather cycle logic --- src/field_weather_effects.c | 66 ++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/field_weather_effects.c b/src/field_weather_effects.c index 386925531..da3314aa1 100644 --- a/src/field_weather_effects.c +++ b/src/field_weather_effects.c @@ -2292,13 +2292,12 @@ void unc_0807DAB4(struct Sprite *sprite) //------------------------------------------------------------------------------ -u8 TranslateWeatherNum(u8); -void UpdateRainCounter(u8, u8); +static u8 TranslateWeatherNum(u8); +static void UpdateRainCounter(u8, u8); void SetSav1Weather(u32 weather) { u8 oldWeather = gSaveBlock1.weather; - gSaveBlock1.weather = TranslateWeatherNum(weather); UpdateRainCounter(gSaveBlock1.weather, oldWeather); } @@ -2311,7 +2310,6 @@ u8 GetSav1Weather(void) void SetSav1WeatherFromCurrMapHeader(void) { u8 oldWeather = gSaveBlock1.weather; - gSaveBlock1.weather = TranslateWeatherNum(gMapHeader.weather); UpdateRainCounter(gSaveBlock1.weather, oldWeather); } @@ -2338,42 +2336,54 @@ void sub_8080750(void) sub_807C988(GetSav1Weather()); } -static const u8 sWeatherCycle1[] = {2, 3, 5, 3}; -static const u8 sWeatherCycle2[] = {2, 2, 3, 2}; +static const u8 sWeatherCycleRoute119[] = +{ + WEATHER_SUNNY, + WEATHER_RAIN_LIGHT, + WEATHER_RAIN_MED, + WEATHER_RAIN_LIGHT, +}; +static const u8 sWeatherCycleRoute123[] = +{ + WEATHER_SUNNY, + WEATHER_SUNNY, + WEATHER_RAIN_LIGHT, + WEATHER_SUNNY, +}; -u8 TranslateWeatherNum(u8 weather) +static u8 TranslateWeatherNum(u8 weather) { switch (weather) { - case 0: return 0; - case 1: return 1; - case 2: return 2; - case 3: return 3; - case 4: return 4; - case 5: return 5; - case 6: return 6; - case 7: return 7; - case 8: return 8; - case 9: return 9; - case 10: return 10; - case 11: return 11; - case 12: return 12; - case 13: return 13; - case 14: return 14; - case 20: return sWeatherCycle1[gSaveBlock1.filler_2F]; - case 21: return sWeatherCycle2[gSaveBlock1.filler_2F]; - default: return 0; + case WEATHER_NONE: return WEATHER_NONE; + case WEATHER_CLOUDS: return WEATHER_CLOUDS; + case WEATHER_SUNNY: return WEATHER_SUNNY; + case WEATHER_RAIN_LIGHT: return WEATHER_RAIN_LIGHT; + case WEATHER_SNOW: return WEATHER_SNOW; + case WEATHER_RAIN_MED: return WEATHER_RAIN_MED; + case WEATHER_FOG_1: return WEATHER_FOG_1; + case WEATHER_ASH: return WEATHER_ASH; + case WEATHER_SANDSTORM: return WEATHER_SANDSTORM; + case WEATHER_FOG_2: return WEATHER_FOG_2; + case WEATHER_FOG_3: return WEATHER_FOG_3; + case WEATHER_SHADE: return WEATHER_SHADE; + case WEATHER_DROUGHT: return WEATHER_DROUGHT; + case WEATHER_RAIN_HEAVY: return WEATHER_RAIN_HEAVY; + case WEATHER_BUBBLES: return WEATHER_BUBBLES; + case WEATHER_ROUTE119_CYCLE: return sWeatherCycleRoute119[gSaveBlock1.weatherCycleStage]; + case WEATHER_ROUTE123_CYCLE: return sWeatherCycleRoute123[gSaveBlock1.weatherCycleStage]; + default: return WEATHER_NONE; } } void UpdateWeatherPerDay(u16 increment) { - u16 weatherStage = gSaveBlock1.filler_2F + increment; + u16 weatherStage = gSaveBlock1.weatherCycleStage + increment; weatherStage %= 4; - gSaveBlock1.filler_2F = weatherStage; + gSaveBlock1.weatherCycleStage = weatherStage; } -void UpdateRainCounter(u8 newWeather, u8 oldWeather) +static void UpdateRainCounter(u8 newWeather, u8 oldWeather) { if (newWeather != oldWeather && (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED)) -- cgit v1.2.3 From 1458ae6952d01d6d6dcc3477fdd4804b2397288b Mon Sep 17 00:00:00 2001 From: yenatch Date: Sat, 24 Mar 2018 23:10:04 -0400 Subject: use constants for truck warp --- src/new_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/new_game.c b/src/new_game.c index e64dc91e3..f8a5524f5 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -136,7 +136,7 @@ void debug_sub_8052E04() void WarpToTruck(void) { - Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck + Overworld_SetWarpDestination(MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK), -1, -1, -1); warp_in(); } -- cgit v1.2.3 From 8008cc05c4de128709c59c8f3f30d0e3a6238c7b Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 4 Apr 2018 18:30:54 -0700 Subject: Use spaces instead of tabs --- src/rom_800D42C.c | 770 +++++++++++++++++++++++++++--------------------------- 1 file changed, 385 insertions(+), 385 deletions(-) (limited to 'src') diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c index 243945360..6825a8c89 100644 --- a/src/rom_800D42C.c +++ b/src/rom_800D42C.c @@ -37,11 +37,11 @@ extern struct Trainer gTrainers[]; extern u16 gTrainerBattleOpponent; struct BattleBackground { - void *tileset; - void *tilemap; - void *entryTiles; - void *entryTilemap; - void *palette; + void *tileset; + void *tilemap; + void *entryTiles; + void *entryTilemap; + void *palette; }; extern struct BattleBackground gBattleTerrainTable[]; @@ -89,11 +89,11 @@ extern u8 sav1_map_get_battletype(void); extern void sub_800D74C(void); struct LinkResultWindow { - struct Window *window; - u16 offset; - u8 left; - u8 top; - u8 *dest; + struct Window *window; + u16 offset; + u8 left; + u8 top; + u8 *dest; }; #define gLinkResultWindows gUnknown_081F9680 @@ -258,66 +258,66 @@ void DrawMainBattleBackground(void) void sub_800DAB8(void) { - LZDecompressVram(gUnknown_08D00000, (void *)0x6000000); - CpuSet(gUnknown_08D00524, (void *)0x600c000, 0x800); - LoadCompressedPalette(gUnknown_08D004E0, 0, 0x40); - sub_800D74C(); - DrawMainBattleBackground(); + LZDecompressVram(gUnknown_08D00000, (void *)0x6000000); + CpuSet(gUnknown_08D00524, (void *)0x600c000, 0x800); + LoadCompressedPalette(gUnknown_08D004E0, 0, 0x40); + sub_800D74C(); + DrawMainBattleBackground(); } void sub_800DAF8(u8 taskId, u8 windowId, u8 *dest) { - int i; - u16 r4 = 0; - u16 src[6]; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (gTasks[taskId].data[5]) { - switch (windowId) { - case 0: - r4 = gTasks[taskId].data[3] & 0x3f; - break; - case 1: - r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; - break; - case 2: - r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; - break; - case 3: - r4 = gTasks[taskId].data[4] & 0x3f; - break; - } - } else { - switch (windowId) { - case 0: - r4 = gTasks[taskId].data[3] & 0x3f; - break; - case 1: - r4 = gTasks[taskId].data[4] & 0x3f; - break; - case 2: - r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; - break; - case 3: - r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; - break; - } - } - for (i = 0; i < 3; i++) { - src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; - } - CpuSet(src, dest, 3); - } else { - if (windowId == gBattleStruct->linkPlayerIndex) { - r4 = gTasks[taskId].data[3]; - } else { - r4 = gTasks[taskId].data[4]; - } - for (i = 0; i < 6; i++) { - src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; - } - CpuSet(src, dest, 6); - } + int i; + u16 r4 = 0; + u16 src[6]; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { + if (gTasks[taskId].data[5]) { + switch (windowId) { + case 0: + r4 = gTasks[taskId].data[3] & 0x3f; + break; + case 1: + r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; + break; + case 2: + r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; + break; + case 3: + r4 = gTasks[taskId].data[4] & 0x3f; + break; + } + } else { + switch (windowId) { + case 0: + r4 = gTasks[taskId].data[3] & 0x3f; + break; + case 1: + r4 = gTasks[taskId].data[4] & 0x3f; + break; + case 2: + r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; + break; + case 3: + r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; + break; + } + } + for (i = 0; i < 3; i++) { + src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; + } + CpuSet(src, dest, 3); + } else { + if (windowId == gBattleStruct->linkPlayerIndex) { + r4 = gTasks[taskId].data[3]; + } else { + r4 = gTasks[taskId].data[4]; + } + for (i = 0; i < 6; i++) { + src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; + } + CpuSet(src, dest, 6); + } } @@ -429,329 +429,329 @@ void PrintLinkBattleWinLossTie(void) void sub_800DE30(u8 taskId) { - u8 palette; - int i; - - switch (gTasks[taskId].data[0]) { - - case 0: - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - for (i = 0; i < 4; i++) { - u8 windowId = (gLinkPlayers[i].lp_field_18 & 3); - Text_InitWindow8002E4C( - gLinkResultWindows[windowId].window, - gLinkPlayers[i].name, - gLinkResultWindows[windowId].offset, - gLinkResultWindows[windowId].left, - gLinkResultWindows[windowId].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); - sub_800DAF8(taskId, windowId, gLinkResultWindows[windowId].dest); - } - } else { - u8 windowId = 4; - - u8 playerId = gBattleStruct->linkPlayerIndex; - u8 opponentId = gBattleStruct->linkPlayerIndex ^ 1; - if (gLinkPlayers[playerId].lp_field_18) { - opponentId = gBattleStruct->linkPlayerIndex; - playerId = gBattleStruct->linkPlayerIndex ^ 1; - } - - Text_InitWindow8002E4C( - gLinkResultWindows[windowId].window, - gLinkPlayers[playerId].name, - gLinkResultWindows[windowId].offset, - gLinkResultWindows[windowId].left, - gLinkResultWindows[windowId].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); - sub_800DAF8(taskId, playerId, gLinkResultWindows[windowId].dest); - - Text_InitWindow8002E4C( - gLinkResultWindows[windowId + 1].window, - gLinkPlayers[opponentId].name, - gLinkResultWindows[windowId + 1].offset, - gLinkResultWindows[windowId + 1].left, - gLinkResultWindows[windowId + 1].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId + 1].window); - sub_800DAF8(taskId, opponentId, gLinkResultWindows[windowId + 1].dest); - } - gTasks[taskId].data[0]++; - break; - - case 1: - palette = AllocSpritePalette(10000); - gPlttBufferUnfaded[palette * 16 + 0x10f] = gPlttBufferFaded[palette * 16 + 0x10f] = 0x7fff; - gBattleStruct->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0); - gBattleStruct->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0); - gSprites[gBattleStruct->unk1608A].invisible = TRUE; - gSprites[gBattleStruct->unk1608B].invisible = TRUE; - gTasks[taskId].data[0]++; - break; - - case 2: - if (gTasks[taskId].data[5]) { - gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); - gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); - gBattle_BG1_Y = -36; - gBattle_BG2_Y = -36; - } else { - gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); - gBattle_BG1_Y = (-164) + (Cos2(gTasks[taskId].data[1]) / 32); - gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); - gBattle_BG2_Y = (-164) + (Cos2(gTasks[taskId].data[2]) / 32); - } - if (gTasks[taskId].data[2]) { - gTasks[taskId].data[2] -= 2; - gTasks[taskId].data[1] += 2; - } else { - if (gTasks[taskId].data[5]) { - PrintLinkBattleWinLossTie(); - } - PlaySE(SE_W231); - DestroyTask(taskId); - gSprites[gBattleStruct->unk1608A].invisible = FALSE; - gSprites[gBattleStruct->unk1608B].invisible = FALSE; - gSprites[gBattleStruct->unk1608B].oam.tileNum += 0x40; - gSprites[gBattleStruct->unk1608A].data[0] = 0; - gSprites[gBattleStruct->unk1608B].data[0] = 1; - gSprites[gBattleStruct->unk1608A].data[1] = gSprites[gBattleStruct->unk1608A].pos1.x; - gSprites[gBattleStruct->unk1608B].data[1] = gSprites[gBattleStruct->unk1608B].pos1.x; - gSprites[gBattleStruct->unk1608A].data[2] = 0; - gSprites[gBattleStruct->unk1608B].data[2] = 0; - } - break; - } + u8 palette; + int i; + + switch (gTasks[taskId].data[0]) { + + case 0: + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { + for (i = 0; i < 4; i++) { + u8 windowId = (gLinkPlayers[i].lp_field_18 & 3); + Text_InitWindow8002E4C( + gLinkResultWindows[windowId].window, + gLinkPlayers[i].name, + gLinkResultWindows[windowId].offset, + gLinkResultWindows[windowId].left, + gLinkResultWindows[windowId].top, + 1); + Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); + sub_800DAF8(taskId, windowId, gLinkResultWindows[windowId].dest); + } + } else { + u8 windowId = 4; + + u8 playerId = gBattleStruct->linkPlayerIndex; + u8 opponentId = gBattleStruct->linkPlayerIndex ^ 1; + if (gLinkPlayers[playerId].lp_field_18) { + opponentId = gBattleStruct->linkPlayerIndex; + playerId = gBattleStruct->linkPlayerIndex ^ 1; + } + + Text_InitWindow8002E4C( + gLinkResultWindows[windowId].window, + gLinkPlayers[playerId].name, + gLinkResultWindows[windowId].offset, + gLinkResultWindows[windowId].left, + gLinkResultWindows[windowId].top, + 1); + Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); + sub_800DAF8(taskId, playerId, gLinkResultWindows[windowId].dest); + + Text_InitWindow8002E4C( + gLinkResultWindows[windowId + 1].window, + gLinkPlayers[opponentId].name, + gLinkResultWindows[windowId + 1].offset, + gLinkResultWindows[windowId + 1].left, + gLinkResultWindows[windowId + 1].top, + 1); + Text_PrintWindow8002F44(gLinkResultWindows[windowId + 1].window); + sub_800DAF8(taskId, opponentId, gLinkResultWindows[windowId + 1].dest); + } + gTasks[taskId].data[0]++; + break; + + case 1: + palette = AllocSpritePalette(10000); + gPlttBufferUnfaded[palette * 16 + 0x10f] = gPlttBufferFaded[palette * 16 + 0x10f] = 0x7fff; + gBattleStruct->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0); + gBattleStruct->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0); + gSprites[gBattleStruct->unk1608A].invisible = TRUE; + gSprites[gBattleStruct->unk1608B].invisible = TRUE; + gTasks[taskId].data[0]++; + break; + + case 2: + if (gTasks[taskId].data[5]) { + gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); + gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); + gBattle_BG1_Y = -36; + gBattle_BG2_Y = -36; + } else { + gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); + gBattle_BG1_Y = (-164) + (Cos2(gTasks[taskId].data[1]) / 32); + gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); + gBattle_BG2_Y = (-164) + (Cos2(gTasks[taskId].data[2]) / 32); + } + if (gTasks[taskId].data[2]) { + gTasks[taskId].data[2] -= 2; + gTasks[taskId].data[1] += 2; + } else { + if (gTasks[taskId].data[5]) { + PrintLinkBattleWinLossTie(); + } + PlaySE(SE_W231); + DestroyTask(taskId); + gSprites[gBattleStruct->unk1608A].invisible = FALSE; + gSprites[gBattleStruct->unk1608B].invisible = FALSE; + gSprites[gBattleStruct->unk1608B].oam.tileNum += 0x40; + gSprites[gBattleStruct->unk1608A].data[0] = 0; + gSprites[gBattleStruct->unk1608B].data[0] = 1; + gSprites[gBattleStruct->unk1608A].data[1] = gSprites[gBattleStruct->unk1608A].pos1.x; + gSprites[gBattleStruct->unk1608B].data[1] = gSprites[gBattleStruct->unk1608B].pos1.x; + gSprites[gBattleStruct->unk1608A].data[2] = 0; + gSprites[gBattleStruct->unk1608B].data[2] = 0; + } + break; + } } void sub_800E23C(void) { - if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - LZDecompressVram(gVersusFrameGfx, (void *)0x6004000); - LZDecompressVram(gVersusFrameTilemap, (void *)0x600e000); - LZDecompressVram(gVersusFrameTilemap, (void *)0x600f000); - LZDecompressVram(gUnknown_08E5DC2C, (void *)0x6010000); - LoadCompressedPalette(gVersusFramePal, 0x60, 0x20); - REG_BG1CNT = 0x5c04; - REG_WININ = 0x36; - REG_WINOUT = 0x36; - gBattle_BG1_Y = 0xff5c; - gBattle_BG2_Y = 0xff5c; - LoadCompressedObjectPic(&gUnknown_081F95A4); - return; - } else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); - return; - } else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == VERSION_RUBY) { - LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void *)0x600e000); - return; - } else { - LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void *)0x600e000); - return; - } - } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); - return; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); - return; - } - } - if (sav1_map_get_battletype() == 0) { - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTiles, (void *)0x6004000); - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void *)0x600e000); - return; - } - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + if (gBattleTypeFlags & BATTLE_TYPE_LINK) { + LZDecompressVram(gVersusFrameGfx, (void *)0x6004000); + LZDecompressVram(gVersusFrameTilemap, (void *)0x600e000); + LZDecompressVram(gVersusFrameTilemap, (void *)0x600f000); + LZDecompressVram(gUnknown_08E5DC2C, (void *)0x6010000); + LoadCompressedPalette(gVersusFramePal, 0x60, 0x20); + REG_BG1CNT = 0x5c04; + REG_WININ = 0x36; + REG_WINOUT = 0x36; + gBattle_BG1_Y = 0xff5c; + gBattle_BG2_Y = 0xff5c; + LoadCompressedObjectPic(&gUnknown_081F95A4); + return; + } else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == VERSION_RUBY) { + LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void *)0x600e000); + return; + } else { + LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void *)0x600e000); + return; + } + } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } + } + if (sav1_map_get_battletype() == 0) { + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTiles, (void *)0x6004000); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void *)0x600e000); + return; + } + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); } int sub_800E414(u8 type) { - int ret = 0; - switch (type) { - case 0: - LZDecompressVram(&gUnknown_08D00000, (void *)0x6000000); - break; - case 1: - CpuCopy16(gUnknown_08D00524, (void *)0x600c000, 0x1000); - break; - case 2: - LoadCompressedPalette(gUnknown_08D004E0, 0, 0x40); - break; - case 3: // tiles - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == VERSION_RUBY) { - LZDecompressVram(gBattleTerrainTiles_Cave, (void *)0x6008000); - break; - } else { - LZDecompressVram(gBattleTerrainTiles_Water, (void *)0x6008000); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void *)0x6008000); - break; - case 2: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 3: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 4: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 5: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 6: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 7: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 1: - case 8: - LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); - break; - } - break; - } - } else { - LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); - break; - } - case 4: // tilemap - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == 2) { - LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)0x600d000); - break; - } else { - LZDecompressVram(gBattleTerrainTilemap_Water, (void *)0x600d000); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void *)0x600d000); - break; - case 2: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 3: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 4: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 5: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 6: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 7: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 1: - case 8: - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); - break; - } - break; - } - } else { - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); - break; - } - case 5: // palette - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == 2) { - LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); - break; - } else { - LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); - break; - case 1: - LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); - break; - case 2: - LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); - break; - case 3: - LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); - break; - case 4: - LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); - break; - case 5: - LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); - break; - case 6: - LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); - break; - case 7: - LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); - break; - case 8: - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - break; - } - break; - } - } else { - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - break; - } - case 6: - sub_800D74C(); - break; - default: - ret = 1; - } - return ret; + int ret = 0; + switch (type) { + case 0: + LZDecompressVram(&gUnknown_08D00000, (void *)0x6000000); + break; + case 1: + CpuCopy16(gUnknown_08D00524, (void *)0x600c000, 0x1000); + break; + case 2: + LoadCompressedPalette(gUnknown_08D004E0, 0, 0x40); + break; + case 3: // tiles + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == VERSION_RUBY) { + LZDecompressVram(gBattleTerrainTiles_Cave, (void *)0x6008000); + break; + } else { + LZDecompressVram(gBattleTerrainTiles_Water, (void *)0x6008000); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void *)0x6008000); + break; + case 2: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 3: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 4: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 5: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 6: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 7: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 1: + case 8: + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } + break; + } + } else { + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } + case 4: // tilemap + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == 2) { + LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)0x600d000); + break; + } else { + LZDecompressVram(gBattleTerrainTilemap_Water, (void *)0x600d000); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void *)0x600d000); + break; + case 2: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 3: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 4: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 5: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 6: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 7: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 1: + case 8: + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } + break; + } + } else { + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } + case 5: // palette + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == 2) { + LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); + break; + } else { + LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); + break; + case 1: + LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); + break; + case 2: + LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); + break; + case 3: + LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); + break; + case 4: + LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); + break; + case 5: + LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); + break; + case 6: + LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); + break; + case 7: + LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); + break; + case 8: + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + break; + } + break; + } + } else { + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + break; + } + case 6: + sub_800D74C(); + break; + default: + ret = 1; + } + return ret; } -- cgit v1.2.3 From f3dc669f5dfb953215663ac801bf31b5d621b6f5 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 4 Apr 2018 18:51:33 -0700 Subject: Port function/file names from pokeemerald --- src/battle/battle_2.c | 14 +- src/battle/battle_bg.c | 753 +++++++++++++++++++++++++++++++++++++ src/battle/reshow_battle_screen.c | 4 +- src/egg_hatch.c | 12 +- src/evolution_scene.c | 4 +- src/pokedex.c | 4 +- src/rom_800D42C.c | 757 -------------------------------------- src/trade.c | 30 +- 8 files changed, 787 insertions(+), 791 deletions(-) create mode 100644 src/battle/battle_bg.c delete mode 100644 src/rom_800D42C.c (limited to 'src') diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c index 705809a21..2d5b3c420 100644 --- a/src/battle/battle_2.c +++ b/src/battle/battle_2.c @@ -75,7 +75,7 @@ extern void sub_802BBD4(); extern struct SpriteTemplate gUnknown_02024E8C; extern const u8 Str_821F7B8[]; extern u8 gUnknown_02023A14_50; -extern const u16 gUnknown_08D004E0[]; +extern const u16 gBattleTextboxPalette[]; extern const struct MonCoords gCastformFrontSpriteCoords[]; extern const u8 Str_821F7EA[]; extern const u8 gUnknown_Debug_821F7F3[]; @@ -269,10 +269,10 @@ void InitBattle(void) Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0); Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC); sub_800D6D4(); - sub_800DAB8(); + LoadBattleTextboxAndBackground(); ResetSpriteData(); ResetTasks(); - sub_800E23C(); + LoadBattleEntryBackground(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; SetVBlankCallback(sub_800FCFC); @@ -1307,11 +1307,11 @@ void c2_8011A1C(void) Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0); Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC); sub_800D6D4(); - LoadCompressedPalette(gUnknown_08D004E0, 0, 64); - sub_800D74C(); + LoadCompressedPalette(gBattleTextboxPalette, 0, 64); + ApplyPlayerChosenFrameToBattleMenu(); ResetSpriteData(); ResetTasks(); - sub_800E23C(); + LoadBattleEntryBackground(); REG_WINOUT = 0x37; FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; @@ -2831,7 +2831,7 @@ void debug_sub_8012688(void) gBattle_BG3_Y = 0; gBattleTerrain = 9; sub_800D6D4(); - sub_800DAB8(); + LoadBattleTextboxAndBackground(); ResetSpriteData(); ResetTasks(); FreeAllSpritePalettes(); diff --git a/src/battle/battle_bg.c b/src/battle/battle_bg.c new file mode 100644 index 000000000..b1e2ea83b --- /dev/null +++ b/src/battle/battle_bg.c @@ -0,0 +1,753 @@ +#include "global.h" +#include "battle.h" +#include "constants/songs.h" +#include "decompress.h" +#include "ewram.h" +#include "link.h" +#include "main.h" +#include "palette.h" +#include "task.h" +#include "text.h" +#include "text_window.h" +#include "trainer.h" +#include "trig.h" +#include "sound.h" + + +extern u16 gBattleTypeFlags; +extern u8 gBattleOutcome; + +extern struct Window gUnknown_03004210; + +extern u8 BattleText_Win[]; +extern u8 BattleText_Loss[]; +extern u8 BattleText_Tie[]; + +extern void sub_8032A38(void); + +#define GetCurrentMapBattleScene sav1_map_get_battletype +//extern u8 GetCurrentMapBattleScene(void); + +extern const u8 gGameVersion; +extern u8 gBattleTextboxTiles[]; +extern u16 gBattleTextboxTilemap[]; +extern u16 gBattleTextboxPalette[]; +extern u16 gBattleTypeFlags; +extern struct Trainer gTrainers[]; +extern u16 gTrainerBattleOpponent; + +struct BattleBackground { + void *tileset; + void *tilemap; + void *entryTiles; + void *entryTilemap; + void *palette; +}; +extern struct BattleBackground gBattleTerrainTable[]; + +extern u8 gBattleTerrain; + +extern u8 gBattleTerrainTiles_Cave[]; +extern u8 gBattleTerrainTiles_Water[]; +extern u8 gBattleTerrainTiles_Building[]; +extern u8 gBattleTerrainTiles_Stadium[]; + +extern u16 gBattleTerrainTilemap_Cave[]; +extern u16 gBattleTerrainTilemap_Water[]; +extern u16 gBattleTerrainTilemap_Building[]; +extern u16 gBattleTerrainTilemap_Stadium[]; + +extern u16 gBattleTerrainPalette_Groudon[]; +extern u16 gBattleTerrainPalette_Kyogre[]; +extern u16 gBattleTerrainPalette_BuildingLeader[]; +extern u16 gBattleTerrainPalette_StadiumSteven[]; +extern u16 gBattleTerrainPalette_BuildingGym[]; +extern u16 gBattleTerrainPalette_StadiumMagma[]; +extern u16 gBattleTerrainPalette_StadiumAqua[]; +extern u16 gBattleTerrainPalette_StadiumSidney[]; +extern u16 gBattleTerrainPalette_StadiumPhoebe[]; +extern u16 gBattleTerrainPalette_StadiumGlacia[]; +extern u16 gBattleTerrainPalette_StadiumDrake[]; +extern u16 gBattleTerrainPalette_BattleTower[]; + +extern u8 gBattleTerrainAnimTiles_Building[]; +extern u16 gBattleTerrainAnimTilemap_Building[]; +extern u8 gBattleTerrainAnimTiles_Cave[]; +extern u16 gBattleTerrainAnimTilemap_Cave[]; +extern u8 gBattleTerrainAnimTiles_Underwater[]; +extern u16 gBattleTerrainAnimTilemap_Underwater[]; +extern u8 gVersusFrameGfx[]; +extern u16 gVersusFrameTilemap[]; +extern u8 gUnknown_08E5DC2C[]; +extern u16 gVersusFramePal[]; + +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_Y; +extern struct CompressedSpriteSheet gUnknown_081F95A4; + +extern u8 sav1_map_get_battletype(void); + +struct LinkResultWindow { + struct Window *window; + u16 offset; + u8 left; + u8 top; + u8 *dest; +}; + +#define gLinkResultWindows gUnknown_081F9680 +extern const struct LinkResultWindow gLinkResultWindows[]; +extern void PrintLinkBattleWinLossTie(void); +extern void sub_800DAF8(u8, u8, u8 *); + +extern struct SpriteTemplate gSpriteTemplate_81F9574; +extern struct SpriteTemplate gSpriteTemplate_81F958C; +extern struct SpriteTemplate gSpriteTemplate_81F96D0; + +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG2_X; + + +void sub_800D6C4(void); + + +void unref_sub_800D684(void) +{ + u8 spriteId; + ResetSpriteData(); + spriteId = CreateSprite(&gSpriteTemplate_81F96D0, 0, 0, 0); + gSprites[spriteId].invisible = TRUE; + SetMainCallback2(sub_800D6C4); +} + +void sub_800D6C4(void) +{ + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_800D6D4(void) +{ + u16 ime = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = ime; + REG_DISPSTAT = DISPSTAT_VBLANK_INTR; + REG_BG0CNT = 0x9800; + REG_BG1CNT = 0x9c04; + REG_BG2CNT = 0x5e05; + REG_BG3CNT = 0x5a0b; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + REG_DISPCNT = 0xbf40; +} + +void ApplyPlayerChosenFrameToBattleMenu(void) +{ + TextWindow_SetBaseTileNum(0x12); + TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1); + TextWindow_SetBaseTileNum(0x22); + TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1); + gPlttBufferUnfaded[92] = 0x7fe0; + gPlttBufferUnfaded[93] = 0x2529; + gPlttBufferUnfaded[94] = 0x7fff; + gPlttBufferUnfaded[95] = 0x675a; + CpuSet(&gPlttBufferUnfaded[92], &gPlttBufferFaded[92], 4); + sub_8032A38(); +} + +void DrawMainBattleBackground(void) +{ + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER /*| BATTLE_TYPE_x2000000*/)) + { + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + } + else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) + { + if (gGameVersion == VERSION_RUBY) + { + LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); + } + else + { + LZDecompressVram(gBattleTerrainTiles_Water, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); + } + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + u8 trainerClass = gTrainers[gTrainerBattleOpponent].trainerClass; + if (trainerClass == TRAINER_CLASS_LEADER) + { + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); + return; + } + else if (trainerClass == TRAINER_CLASS_CHAMPION) + { + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); + return; + } + } + + switch (GetCurrentMapBattleScene()) + { + case MAP_BATTLE_SCENE_NORMAL: + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_GYM: + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_MAGMA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_AQUA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_SIDNEY: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_PHOEBE: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_GLACIA: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_DRAKE: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); + break; + case MAP_BATTLE_SCENE_BATTLE_TOWER: + LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); + LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + break; + } + } +} + +void LoadBattleTextboxAndBackground(void) +{ + LZDecompressVram(gBattleTextboxTiles, (void*)(BG_VRAM)); + CpuSet(gBattleTextboxTilemap, (void *)0x600c000, 0x800); + LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40); + ApplyPlayerChosenFrameToBattleMenu(); + DrawMainBattleBackground(); +} + +void sub_800DAF8(u8 taskId, u8 windowId, u8 *dest) +{ + int i; + u16 r4 = 0; + u16 src[6]; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { + if (gTasks[taskId].data[5]) { + switch (windowId) { + case 0: + r4 = gTasks[taskId].data[3] & 0x3f; + break; + case 1: + r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; + break; + case 2: + r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; + break; + case 3: + r4 = gTasks[taskId].data[4] & 0x3f; + break; + } + } else { + switch (windowId) { + case 0: + r4 = gTasks[taskId].data[3] & 0x3f; + break; + case 1: + r4 = gTasks[taskId].data[4] & 0x3f; + break; + case 2: + r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; + break; + case 3: + r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; + break; + } + } + for (i = 0; i < 3; i++) { + src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; + } + CpuSet(src, dest, 3); + } else { + if (windowId == gBattleStruct->linkPlayerIndex) { + r4 = gTasks[taskId].data[3]; + } else { + r4 = gTasks[taskId].data[4]; + } + for (i = 0; i < 6; i++) { + src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; + } + CpuSet(src, dest, 6); + } +} + + +#if ENGLISH +#define LEFT_MESSAGE_X 6 +#define RIGHT_MESSAGE_X 21 +#define TILE_OFFSET_LOSS 168 +#elif GERMAN +#define LEFT_MESSAGE_X 5 +#define RIGHT_MESSAGE_X 20 +#define TILE_OFFSET_LOSS 172 +#endif +#define TILE_OFFSET_WIN 160 +#define CENTER_MESSAGE_X 13 +#define MESSAGE_Y 2 + +#define PRINT_MESSAGE(text, tileDataStartOffset, x) \ +{ \ + Text_InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ + Text_PrintWindow8002F44(&gUnknown_03004210); \ +} + +#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X) +#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X) + +void PrintLinkBattleWinLossTie(void) +{ + + if (gBattleOutcome == 3) + { + PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X); + return; + } + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + // Double battle? + + if (gBattleOutcome == 1) + { + + // lp_field_18 = player position? + switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18) + { + case 0: + case 2: + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + + case 1: + case 3: + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN) + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS) + return; + } + } + else + { + + switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18) + { + case 1: + case 3: + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + + case 0: + case 2: + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + return; + } + } + + return; + } + + + if (gBattleOutcome == 1) + { + if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0) + { + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + } + else + { + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + } + } + else + { + if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0) + { + PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); + } + else + { + PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); + PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); + } + } +} + + +void sub_800DE30(u8 taskId) +{ + u8 palette; + int i; + + switch (gTasks[taskId].data[0]) { + + case 0: + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { + for (i = 0; i < 4; i++) { + u8 windowId = (gLinkPlayers[i].lp_field_18 & 3); + Text_InitWindow8002E4C( + gLinkResultWindows[windowId].window, + gLinkPlayers[i].name, + gLinkResultWindows[windowId].offset, + gLinkResultWindows[windowId].left, + gLinkResultWindows[windowId].top, + 1); + Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); + sub_800DAF8(taskId, windowId, gLinkResultWindows[windowId].dest); + } + } else { + u8 windowId = 4; + + u8 playerId = gBattleStruct->linkPlayerIndex; + u8 opponentId = gBattleStruct->linkPlayerIndex ^ 1; + if (gLinkPlayers[playerId].lp_field_18) { + opponentId = gBattleStruct->linkPlayerIndex; + playerId = gBattleStruct->linkPlayerIndex ^ 1; + } + + Text_InitWindow8002E4C( + gLinkResultWindows[windowId].window, + gLinkPlayers[playerId].name, + gLinkResultWindows[windowId].offset, + gLinkResultWindows[windowId].left, + gLinkResultWindows[windowId].top, + 1); + Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); + sub_800DAF8(taskId, playerId, gLinkResultWindows[windowId].dest); + + Text_InitWindow8002E4C( + gLinkResultWindows[windowId + 1].window, + gLinkPlayers[opponentId].name, + gLinkResultWindows[windowId + 1].offset, + gLinkResultWindows[windowId + 1].left, + gLinkResultWindows[windowId + 1].top, + 1); + Text_PrintWindow8002F44(gLinkResultWindows[windowId + 1].window); + sub_800DAF8(taskId, opponentId, gLinkResultWindows[windowId + 1].dest); + } + gTasks[taskId].data[0]++; + break; + + case 1: + palette = AllocSpritePalette(10000); + gPlttBufferUnfaded[palette * 16 + 0x10f] = gPlttBufferFaded[palette * 16 + 0x10f] = 0x7fff; + gBattleStruct->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0); + gBattleStruct->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0); + gSprites[gBattleStruct->unk1608A].invisible = TRUE; + gSprites[gBattleStruct->unk1608B].invisible = TRUE; + gTasks[taskId].data[0]++; + break; + + case 2: + if (gTasks[taskId].data[5]) { + gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); + gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); + gBattle_BG1_Y = -36; + gBattle_BG2_Y = -36; + } else { + gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); + gBattle_BG1_Y = (-164) + (Cos2(gTasks[taskId].data[1]) / 32); + gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); + gBattle_BG2_Y = (-164) + (Cos2(gTasks[taskId].data[2]) / 32); + } + if (gTasks[taskId].data[2]) { + gTasks[taskId].data[2] -= 2; + gTasks[taskId].data[1] += 2; + } else { + if (gTasks[taskId].data[5]) { + PrintLinkBattleWinLossTie(); + } + PlaySE(SE_W231); + DestroyTask(taskId); + gSprites[gBattleStruct->unk1608A].invisible = FALSE; + gSprites[gBattleStruct->unk1608B].invisible = FALSE; + gSprites[gBattleStruct->unk1608B].oam.tileNum += 0x40; + gSprites[gBattleStruct->unk1608A].data[0] = 0; + gSprites[gBattleStruct->unk1608B].data[0] = 1; + gSprites[gBattleStruct->unk1608A].data[1] = gSprites[gBattleStruct->unk1608A].pos1.x; + gSprites[gBattleStruct->unk1608B].data[1] = gSprites[gBattleStruct->unk1608B].pos1.x; + gSprites[gBattleStruct->unk1608A].data[2] = 0; + gSprites[gBattleStruct->unk1608B].data[2] = 0; + } + break; + } +} + +void LoadBattleEntryBackground(void) { + if (gBattleTypeFlags & BATTLE_TYPE_LINK) { + LZDecompressVram(gVersusFrameGfx, (void *)0x6004000); + LZDecompressVram(gVersusFrameTilemap, (void *)0x600e000); + LZDecompressVram(gVersusFrameTilemap, (void *)0x600f000); + LZDecompressVram(gUnknown_08E5DC2C, (void *)0x6010000); + LoadCompressedPalette(gVersusFramePal, 0x60, 0x20); + REG_BG1CNT = 0x5c04; + REG_WININ = 0x36; + REG_WINOUT = 0x36; + gBattle_BG1_Y = 0xff5c; + gBattle_BG2_Y = 0xff5c; + LoadCompressedObjectPic(&gUnknown_081F95A4); + return; + } else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == VERSION_RUBY) { + LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void *)0x600e000); + return; + } else { + LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void *)0x600e000); + return; + } + } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); + return; + } + } + if (sav1_map_get_battletype() == 0) { + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTiles, (void *)0x6004000); + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void *)0x600e000); + return; + } + LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); + LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); +} + +int LoadChosenBattleElement(u8 type) { + int ret = 0; + switch (type) { + case 0: + LZDecompressVram(&gBattleTextboxTiles, (void *)0x6000000); + break; + case 1: + CpuCopy16(gBattleTextboxTilemap, (void *)0x600c000, 0x1000); + break; + case 2: + LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40); + break; + case 3: // tiles + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == VERSION_RUBY) { + LZDecompressVram(gBattleTerrainTiles_Cave, (void *)0x6008000); + break; + } else { + LZDecompressVram(gBattleTerrainTiles_Water, (void *)0x6008000); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void *)0x6008000); + break; + case 2: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 3: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 4: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 5: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 6: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 7: + LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); + break; + case 1: + case 8: + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } + break; + } + } else { + LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); + break; + } + case 4: // tilemap + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == 2) { + LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)0x600d000); + break; + } else { + LZDecompressVram(gBattleTerrainTilemap_Water, (void *)0x600d000); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void *)0x600d000); + break; + case 2: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 3: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 4: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 5: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 6: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 7: + LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); + break; + case 1: + case 8: + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } + break; + } + } else { + LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); + break; + } + case 5: // palette + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { + if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { + if (gGameVersion == 2) { + LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); + break; + } else { + LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); + break; + } + } else { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { + if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { + LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); + break; + } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { + LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); + break; + } + } + switch (sav1_map_get_battletype()) { + case 0: + LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); + break; + case 1: + LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); + break; + case 2: + LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); + break; + case 3: + LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); + break; + case 4: + LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); + break; + case 5: + LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); + break; + case 6: + LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); + break; + case 7: + LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); + break; + case 8: + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + break; + } + break; + } + } else { + LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); + break; + } + case 6: + ApplyPlayerChosenFrameToBattleMenu(); + break; + default: + ret = 1; + } + return ret; +} diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c index 0da29441e..85aa78ca0 100644 --- a/src/battle/reshow_battle_screen.c +++ b/src/battle/reshow_battle_screen.c @@ -29,7 +29,7 @@ extern u8 gBankSpriteIds[4]; extern u8 gBattleMonForms[4]; extern u8 gHealthboxIDs[4]; -bool8 sub_800E414(u8 a0); +bool8 LoadChosenBattleElement(u8 a0); bool8 sub_8031C30(u8 a0); void sub_8031EE8(void); void sub_80327CC(void); @@ -97,7 +97,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void) } break; case 2: - if (!sub_800E414(gHelperState)) + if (!LoadChosenBattleElement(gHelperState)) { gHelperState++; gReshowState--; diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 282ad31fb..5bba69f86 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -40,9 +40,9 @@ struct EggHatchData struct EggHatchData* gEggHatchData; -extern const u32 gUnknown_08D00000[]; -extern const u32 gUnknown_08D00524[]; -extern const u16 gUnknown_08D004E0[]; //palette +extern const u32 gBattleTextboxTiles[]; +extern const u32 gBattleTextboxTilemap[]; +extern const u16 gBattleTextboxPalette[]; //palette extern const struct SpriteSheet sUnknown_0820A3B0; extern const struct SpriteSheet sUnknown_0820A3B8; extern const struct SpritePalette sUnknown_0820A3C0; @@ -478,10 +478,10 @@ static void CB2_EggHatch_0(void) gMain.state++; break; case 2: - LZDecompressVram(&gUnknown_08D00000, (void*)(VRAM)); - CpuSet(&gUnknown_08D00524, ewram0_7, 0x800); + LZDecompressVram(&gBattleTextboxTiles, (void*)(VRAM)); + CpuSet(&gBattleTextboxTilemap, ewram0_7, 0x800); DmaCopy16(3, ewram0_7, (void*)(VRAM + 0x2800), 0x500); - LoadCompressedPalette(&gUnknown_08D004E0, 0, 0x20); + LoadCompressedPalette(&gBattleTextboxPalette, 0, 0x20); gMain.state++; break; case 3: diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 3ba325574..a3a5dbcec 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -212,7 +212,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, gBattleTerrain = BATTLE_TERRAIN_PLAIN; sub_800D6D4(); - sub_800DAB8(); + LoadBattleTextboxAndBackground(); ResetSpriteData(); ScanlineEffect_Stop(); ResetTasks(); @@ -320,7 +320,7 @@ static void CB2_EvolutionSceneLoadGraphics(void) gBattleTerrain = BATTLE_TERRAIN_PLAIN; sub_800D6D4(); - sub_800DAB8(); + LoadBattleTextboxAndBackground(); ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; diff --git a/src/pokedex.c b/src/pokedex.c index 711dc69fa..f7baced63 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -3922,8 +3922,8 @@ static void sub_8090B8C(u8 taskId) const u8 *lzPaletteData; REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON; - CpuCopy16(gUnknown_08D00524, (void *)(VRAM + 0xC000), 0x1000); - sub_800D74C(); + CpuCopy16(gBattleTextboxTilemap, (void *)(VRAM + 0xC000), 0x1000); + ApplyPlayerChosenFrameToBattleMenu(); species = NationalPokedexNumToSpecies(gTasks[taskId].data[1]); otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12]; personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14]; diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c deleted file mode 100644 index 6825a8c89..000000000 --- a/src/rom_800D42C.c +++ /dev/null @@ -1,757 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "constants/songs.h" -#include "decompress.h" -#include "ewram.h" -#include "link.h" -#include "main.h" -#include "palette.h" -#include "task.h" -#include "text.h" -#include "text_window.h" -#include "trainer.h" -#include "trig.h" -#include "sound.h" - - -extern u16 gBattleTypeFlags; -extern u8 gBattleOutcome; - -extern struct Window gUnknown_03004210; - -extern u8 BattleText_Win[]; -extern u8 BattleText_Loss[]; -extern u8 BattleText_Tie[]; - -extern void sub_8032A38(void); - -#define GetCurrentMapBattleScene sav1_map_get_battletype -//extern u8 GetCurrentMapBattleScene(void); - -extern const u8 gGameVersion; -extern u8 gUnknown_08D00000[]; -extern u16 gUnknown_08D00524[]; -extern u16 gUnknown_08D004E0[]; -extern u16 gBattleTypeFlags; -extern struct Trainer gTrainers[]; -extern u16 gTrainerBattleOpponent; - -struct BattleBackground { - void *tileset; - void *tilemap; - void *entryTiles; - void *entryTilemap; - void *palette; -}; -extern struct BattleBackground gBattleTerrainTable[]; - -extern u8 gBattleTerrain; - -extern u8 gBattleTerrainTiles_Cave[]; -extern u8 gBattleTerrainTiles_Water[]; -extern u8 gBattleTerrainTiles_Building[]; -extern u8 gBattleTerrainTiles_Stadium[]; - -extern u16 gBattleTerrainTilemap_Cave[]; -extern u16 gBattleTerrainTilemap_Water[]; -extern u16 gBattleTerrainTilemap_Building[]; -extern u16 gBattleTerrainTilemap_Stadium[]; - -extern u16 gBattleTerrainPalette_Groudon[]; -extern u16 gBattleTerrainPalette_Kyogre[]; -extern u16 gBattleTerrainPalette_BuildingLeader[]; -extern u16 gBattleTerrainPalette_StadiumSteven[]; -extern u16 gBattleTerrainPalette_BuildingGym[]; -extern u16 gBattleTerrainPalette_StadiumMagma[]; -extern u16 gBattleTerrainPalette_StadiumAqua[]; -extern u16 gBattleTerrainPalette_StadiumSidney[]; -extern u16 gBattleTerrainPalette_StadiumPhoebe[]; -extern u16 gBattleTerrainPalette_StadiumGlacia[]; -extern u16 gBattleTerrainPalette_StadiumDrake[]; -extern u16 gBattleTerrainPalette_BattleTower[]; - -extern u8 gBattleTerrainAnimTiles_Building[]; -extern u16 gBattleTerrainAnimTilemap_Building[]; -extern u8 gBattleTerrainAnimTiles_Cave[]; -extern u16 gBattleTerrainAnimTilemap_Cave[]; -extern u8 gBattleTerrainAnimTiles_Underwater[]; -extern u16 gBattleTerrainAnimTilemap_Underwater[]; -extern u8 gVersusFrameGfx[]; -extern u16 gVersusFrameTilemap[]; -extern u8 gUnknown_08E5DC2C[]; -extern u16 gVersusFramePal[]; - -extern u16 gBattle_BG1_Y; -extern u16 gBattle_BG2_Y; -extern struct CompressedSpriteSheet gUnknown_081F95A4; - -extern u8 sav1_map_get_battletype(void); -extern void sub_800D74C(void); - -struct LinkResultWindow { - struct Window *window; - u16 offset; - u8 left; - u8 top; - u8 *dest; -}; - -#define gLinkResultWindows gUnknown_081F9680 -extern const struct LinkResultWindow gLinkResultWindows[]; -extern void PrintLinkBattleWinLossTie(void); -extern void sub_800DAF8(u8, u8, u8 *); - -extern struct SpriteTemplate gSpriteTemplate_81F9574; -extern struct SpriteTemplate gSpriteTemplate_81F958C; -extern struct SpriteTemplate gSpriteTemplate_81F96D0; - -extern u16 gBattle_BG1_X; -extern u16 gBattle_BG2_X; - - -void sub_800D6C4(void); - - -void unref_sub_800D684(void) -{ - u8 spriteId; - ResetSpriteData(); - spriteId = CreateSprite(&gSpriteTemplate_81F96D0, 0, 0, 0); - gSprites[spriteId].invisible = TRUE; - SetMainCallback2(sub_800D6C4); -} - -void sub_800D6C4(void) -{ - AnimateSprites(); - BuildOamBuffer(); -} - -void sub_800D6D4(void) -{ - u16 ime = REG_IME; - REG_IME = 0; - REG_IE |= INTR_FLAG_VBLANK; - REG_IME = ime; - REG_DISPSTAT = DISPSTAT_VBLANK_INTR; - REG_BG0CNT = 0x9800; - REG_BG1CNT = 0x9c04; - REG_BG2CNT = 0x5e05; - REG_BG3CNT = 0x5a0b; - REG_BLDCNT = 0; - REG_BLDALPHA = 0; - REG_BLDY = 0; - REG_DISPCNT = 0xbf40; -} - -// ApplyPlayerChosenFrameToBattleMenu -void sub_800D74C(void) -{ - TextWindow_SetBaseTileNum(0x12); - TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1); - TextWindow_SetBaseTileNum(0x22); - TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1); - gPlttBufferUnfaded[92] = 0x7fe0; - gPlttBufferUnfaded[93] = 0x2529; - gPlttBufferUnfaded[94] = 0x7fff; - gPlttBufferUnfaded[95] = 0x675a; - CpuSet(&gPlttBufferUnfaded[92], &gPlttBufferFaded[92], 4); - sub_8032A38(); -} - -void DrawMainBattleBackground(void) -{ - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER /*| BATTLE_TYPE_x2000000*/)) - { - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - } - else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) - { - if (gGameVersion == VERSION_RUBY) - { - LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); - } - else - { - LZDecompressVram(gBattleTerrainTiles_Water, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); - } - } - else - { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - u8 trainerClass = gTrainers[gTrainerBattleOpponent].trainerClass; - if (trainerClass == TRAINER_CLASS_LEADER) - { - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); - return; - } - else if (trainerClass == TRAINER_CLASS_CHAMPION) - { - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); - return; - } - } - - switch (GetCurrentMapBattleScene()) - { - case MAP_BATTLE_SCENE_NORMAL: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_GYM: - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_MAGMA: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_AQUA: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_SIDNEY: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_PHOEBE: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_GLACIA: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_DRAKE: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); - break; - case MAP_BATTLE_SCENE_BATTLE_TOWER: - LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000)); - LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000)); - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - break; - } - } -} - - - -void sub_800DAB8(void) -{ - LZDecompressVram(gUnknown_08D00000, (void *)0x6000000); - CpuSet(gUnknown_08D00524, (void *)0x600c000, 0x800); - LoadCompressedPalette(gUnknown_08D004E0, 0, 0x40); - sub_800D74C(); - DrawMainBattleBackground(); -} - -void sub_800DAF8(u8 taskId, u8 windowId, u8 *dest) -{ - int i; - u16 r4 = 0; - u16 src[6]; - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (gTasks[taskId].data[5]) { - switch (windowId) { - case 0: - r4 = gTasks[taskId].data[3] & 0x3f; - break; - case 1: - r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; - break; - case 2: - r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; - break; - case 3: - r4 = gTasks[taskId].data[4] & 0x3f; - break; - } - } else { - switch (windowId) { - case 0: - r4 = gTasks[taskId].data[3] & 0x3f; - break; - case 1: - r4 = gTasks[taskId].data[4] & 0x3f; - break; - case 2: - r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6; - break; - case 3: - r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6; - break; - } - } - for (i = 0; i < 3; i++) { - src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; - } - CpuSet(src, dest, 3); - } else { - if (windowId == gBattleStruct->linkPlayerIndex) { - r4 = gTasks[taskId].data[3]; - } else { - r4 = gTasks[taskId].data[4]; - } - for (i = 0; i < 6; i++) { - src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001; - } - CpuSet(src, dest, 6); - } -} - - -#if ENGLISH -#define LEFT_MESSAGE_X 6 -#define RIGHT_MESSAGE_X 21 -#define TILE_OFFSET_LOSS 168 -#elif GERMAN -#define LEFT_MESSAGE_X 5 -#define RIGHT_MESSAGE_X 20 -#define TILE_OFFSET_LOSS 172 -#endif -#define TILE_OFFSET_WIN 160 -#define CENTER_MESSAGE_X 13 -#define MESSAGE_Y 2 - -#define PRINT_MESSAGE(text, tileDataStartOffset, x) \ -{ \ - Text_InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \ - Text_PrintWindow8002F44(&gUnknown_03004210); \ -} - -#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X) -#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X) - -void PrintLinkBattleWinLossTie(void) -{ - - if (gBattleOutcome == 3) - { - PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X); - return; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - // Double battle? - - if (gBattleOutcome == 1) - { - - // lp_field_18 = player position? - switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18) - { - case 0: - case 2: - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - - case 1: - case 3: - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN) - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS) - return; - } - } - else - { - - switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18) - { - case 1: - case 3: - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - - case 0: - case 2: - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - return; - } - } - - return; - } - - - if (gBattleOutcome == 1) - { - if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0) - { - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - } - else - { - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - } - } - else - { - if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0) - { - PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS); - } - else - { - PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN); - PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS); - } - } -} - - -void sub_800DE30(u8 taskId) -{ - u8 palette; - int i; - - switch (gTasks[taskId].data[0]) { - - case 0: - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - for (i = 0; i < 4; i++) { - u8 windowId = (gLinkPlayers[i].lp_field_18 & 3); - Text_InitWindow8002E4C( - gLinkResultWindows[windowId].window, - gLinkPlayers[i].name, - gLinkResultWindows[windowId].offset, - gLinkResultWindows[windowId].left, - gLinkResultWindows[windowId].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); - sub_800DAF8(taskId, windowId, gLinkResultWindows[windowId].dest); - } - } else { - u8 windowId = 4; - - u8 playerId = gBattleStruct->linkPlayerIndex; - u8 opponentId = gBattleStruct->linkPlayerIndex ^ 1; - if (gLinkPlayers[playerId].lp_field_18) { - opponentId = gBattleStruct->linkPlayerIndex; - playerId = gBattleStruct->linkPlayerIndex ^ 1; - } - - Text_InitWindow8002E4C( - gLinkResultWindows[windowId].window, - gLinkPlayers[playerId].name, - gLinkResultWindows[windowId].offset, - gLinkResultWindows[windowId].left, - gLinkResultWindows[windowId].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId].window); - sub_800DAF8(taskId, playerId, gLinkResultWindows[windowId].dest); - - Text_InitWindow8002E4C( - gLinkResultWindows[windowId + 1].window, - gLinkPlayers[opponentId].name, - gLinkResultWindows[windowId + 1].offset, - gLinkResultWindows[windowId + 1].left, - gLinkResultWindows[windowId + 1].top, - 1); - Text_PrintWindow8002F44(gLinkResultWindows[windowId + 1].window); - sub_800DAF8(taskId, opponentId, gLinkResultWindows[windowId + 1].dest); - } - gTasks[taskId].data[0]++; - break; - - case 1: - palette = AllocSpritePalette(10000); - gPlttBufferUnfaded[palette * 16 + 0x10f] = gPlttBufferFaded[palette * 16 + 0x10f] = 0x7fff; - gBattleStruct->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0); - gBattleStruct->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0); - gSprites[gBattleStruct->unk1608A].invisible = TRUE; - gSprites[gBattleStruct->unk1608B].invisible = TRUE; - gTasks[taskId].data[0]++; - break; - - case 2: - if (gTasks[taskId].data[5]) { - gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); - gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); - gBattle_BG1_Y = -36; - gBattle_BG2_Y = -36; - } else { - gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32); - gBattle_BG1_Y = (-164) + (Cos2(gTasks[taskId].data[1]) / 32); - gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32); - gBattle_BG2_Y = (-164) + (Cos2(gTasks[taskId].data[2]) / 32); - } - if (gTasks[taskId].data[2]) { - gTasks[taskId].data[2] -= 2; - gTasks[taskId].data[1] += 2; - } else { - if (gTasks[taskId].data[5]) { - PrintLinkBattleWinLossTie(); - } - PlaySE(SE_W231); - DestroyTask(taskId); - gSprites[gBattleStruct->unk1608A].invisible = FALSE; - gSprites[gBattleStruct->unk1608B].invisible = FALSE; - gSprites[gBattleStruct->unk1608B].oam.tileNum += 0x40; - gSprites[gBattleStruct->unk1608A].data[0] = 0; - gSprites[gBattleStruct->unk1608B].data[0] = 1; - gSprites[gBattleStruct->unk1608A].data[1] = gSprites[gBattleStruct->unk1608A].pos1.x; - gSprites[gBattleStruct->unk1608B].data[1] = gSprites[gBattleStruct->unk1608B].pos1.x; - gSprites[gBattleStruct->unk1608A].data[2] = 0; - gSprites[gBattleStruct->unk1608B].data[2] = 0; - } - break; - } -} - -void sub_800E23C(void) { - if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - LZDecompressVram(gVersusFrameGfx, (void *)0x6004000); - LZDecompressVram(gVersusFrameTilemap, (void *)0x600e000); - LZDecompressVram(gVersusFrameTilemap, (void *)0x600f000); - LZDecompressVram(gUnknown_08E5DC2C, (void *)0x6010000); - LoadCompressedPalette(gVersusFramePal, 0x60, 0x20); - REG_BG1CNT = 0x5c04; - REG_WININ = 0x36; - REG_WINOUT = 0x36; - gBattle_BG1_Y = 0xff5c; - gBattle_BG2_Y = 0xff5c; - LoadCompressedObjectPic(&gUnknown_081F95A4); - return; - } else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); - return; - } else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == VERSION_RUBY) { - LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void *)0x600e000); - return; - } else { - LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void *)0x600e000); - return; - } - } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); - return; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); - return; - } - } - if (sav1_map_get_battletype() == 0) { - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTiles, (void *)0x6004000); - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void *)0x600e000); - return; - } - LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000); - LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000); -} - -int sub_800E414(u8 type) { - int ret = 0; - switch (type) { - case 0: - LZDecompressVram(&gUnknown_08D00000, (void *)0x6000000); - break; - case 1: - CpuCopy16(gUnknown_08D00524, (void *)0x600c000, 0x1000); - break; - case 2: - LoadCompressedPalette(gUnknown_08D004E0, 0, 0x40); - break; - case 3: // tiles - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == VERSION_RUBY) { - LZDecompressVram(gBattleTerrainTiles_Cave, (void *)0x6008000); - break; - } else { - LZDecompressVram(gBattleTerrainTiles_Water, (void *)0x6008000); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void *)0x6008000); - break; - case 2: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 3: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 4: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 5: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 6: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 7: - LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000); - break; - case 1: - case 8: - LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); - break; - } - break; - } - } else { - LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000); - break; - } - case 4: // tilemap - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == 2) { - LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)0x600d000); - break; - } else { - LZDecompressVram(gBattleTerrainTilemap_Water, (void *)0x600d000); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void *)0x600d000); - break; - case 2: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 3: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 4: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 5: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 6: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 7: - LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000); - break; - case 1: - case 8: - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); - break; - } - break; - } - } else { - LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000); - break; - } - case 5: // palette - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) { - if (gGameVersion == 2) { - LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60); - break; - } else { - LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60); - break; - } - } else { - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) { - LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60); - break; - } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) { - LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60); - break; - } - } - switch (sav1_map_get_battletype()) { - case 0: - LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60); - break; - case 1: - LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60); - break; - case 2: - LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60); - break; - case 3: - LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60); - break; - case 4: - LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60); - break; - case 5: - LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60); - break; - case 6: - LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60); - break; - case 7: - LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60); - break; - case 8: - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - break; - } - break; - } - } else { - LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60); - break; - } - case 6: - sub_800D74C(); - break; - default: - ret = 1; - } - return ret; -} diff --git a/src/trade.c b/src/trade.c index 36e6fc757..a05bddee4 100644 --- a/src/trade.c +++ b/src/trade.c @@ -4018,10 +4018,10 @@ static void sub_804B41C(void) Menu_EraseScreen(); gLinkType = 0x1144; gMain.state ++; - LZDecompressVram(gUnknown_08D00000, (void *)VRAM); - CpuCopy16(gUnknown_08D00524, ewram, 0x1000); + LZDecompressVram(gBattleTextboxTiles, (void *)VRAM); + CpuCopy16(gBattleTextboxTilemap, ewram, 0x1000); DmaCopy16Defvars(3, ewram, BG_SCREEN_ADDR(5), 0x500); - LoadCompressedPalette(gUnknown_08D004E0, 0, 32); + LoadCompressedPalette(gBattleTextboxPalette, 0, 32); gUnknown_03004828->unk_00b6 = 0; gUnknown_03004828->unk_00c4 = 0; gUnknown_03004828->isLinkTrade = TRUE; @@ -4191,11 +4191,11 @@ static __attribute__((naked)) void sub_804B41C(void) "\tldrb r0, [r1]\n" "\tadds r0, 0x1\n" "\tstrb r0, [r1]\n" - "\tldr r0, _0804B590 @ =gUnknown_08D00000\n" + "\tldr r0, _0804B590 @ =gBattleTextboxTiles\n" "\tmovs r1, 0xC0\n" "\tlsls r1, 19\n" "\tbl LZDecompressVram\n" - "\tldr r0, _0804B594 @ =gUnknown_08D00524\n" + "\tldr r0, _0804B594 @ =gBattleTextboxTilemap\n" "\tldr r1, _0804B598 @ =0xfffe1000\n" "\tadds r5, r1\n" "\tmovs r2, 0x80\n" @@ -4209,7 +4209,7 @@ static __attribute__((naked)) void sub_804B41C(void) "\tldr r1, _0804B5A4 @ =0x80000280\n" "\tstr r1, [r0, 0x8]\n" "\tldr r0, [r0, 0x8]\n" - "\tldr r0, _0804B5A8 @ =gUnknown_08D004E0\n" + "\tldr r0, _0804B5A8 @ =gBattleTextboxPalette\n" "\tmovs r1, 0\n" "\tmovs r2, 0x20\n" "\tbl LoadCompressedPalette\n" @@ -4267,13 +4267,13 @@ static __attribute__((naked)) void sub_804B41C(void) "_0804B584: .4byte 0x00001144\n" "_0804B588: .4byte gMain\n" "_0804B58C: .4byte 0x0000043c\n" - "_0804B590: .4byte gUnknown_08D00000\n" - "_0804B594: .4byte gUnknown_08D00524\n" + "_0804B590: .4byte gBattleTextboxTiles\n" + "_0804B594: .4byte gBattleTextboxTilemap\n" "_0804B598: .4byte 0xfffe1000\n" "_0804B59C: .4byte 0x06002800\n" "_0804B5A0: .4byte 0x040000d4\n" "_0804B5A4: .4byte 0x80000280\n" - "_0804B5A8: .4byte gUnknown_08D004E0\n" + "_0804B5A8: .4byte gBattleTextboxPalette\n" "_0804B5AC_case01:\n" "\tbl OpenLink\n" "\tldr r1, _0804B5C8 @ =gMain\n" @@ -4709,9 +4709,9 @@ static void sub_804BBE8(u8 a0) gUnknown_03004828->bg1vofs = 0; gUnknown_03004828->bg1hofs = 0; REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5); - LZDecompressVram(gUnknown_08D00000, BG_CHAR_ADDR(0)); - CpuCopy16(gUnknown_08D00524, buffer = (u16 *)gSharedMem, 0x1000); - LoadCompressedPalette(gUnknown_08D004E0, 0x70, 0x20); + LZDecompressVram(gBattleTextboxTiles, BG_CHAR_ADDR(0)); + CpuCopy16(gBattleTextboxTilemap, buffer = (u16 *)gSharedMem, 0x1000); + LoadCompressedPalette(gBattleTextboxPalette, 0x70, 0x20); FillPalette(0, 0, 2); for (i = 0; i < 0x280; i ++) buffer[i] |= 0x7000; @@ -5684,9 +5684,9 @@ static void sub_804E1DC(void) void sub_804E22C(void) { - LZDecompressVram(gUnknown_08D00000, (void *)VRAM); - CpuCopy16(gUnknown_08D00524, gSharedMem, 0x1000); + LZDecompressVram(gBattleTextboxTiles, (void *)VRAM); + CpuCopy16(gBattleTextboxTilemap, gSharedMem, 0x1000); DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500); - LoadCompressedPalette(gUnknown_08D004E0, 0, 32); + LoadCompressedPalette(gBattleTextboxPalette, 0, 32); REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); } -- cgit v1.2.3 From 09411d29f66c427367a2db3de155fed8c98138f5 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 4 Apr 2018 20:03:32 -0700 Subject: Fix german debug --- src/battle/battle_bg.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle/battle_bg.c b/src/battle/battle_bg.c index b1e2ea83b..f97829833 100644 --- a/src/battle/battle_bg.c +++ b/src/battle/battle_bg.c @@ -255,10 +255,20 @@ void DrawMainBattleBackground(void) void LoadBattleTextboxAndBackground(void) { LZDecompressVram(gBattleTextboxTiles, (void*)(BG_VRAM)); - CpuSet(gBattleTextboxTilemap, (void *)0x600c000, 0x800); + CpuSet(gBattleTextboxTilemap, (void *)(VRAM + 0xC000), 0x800); LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40); ApplyPlayerChosenFrameToBattleMenu(); DrawMainBattleBackground(); + + #if DEBUG + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + debug_sub_8008218((void*)(VRAM + 0x600), 0, (void*)(VRAM + 0xC000), 1); + debug_sub_8008264(257, 3, 1, 3, 1); + debug_sub_8008264(257, 3, 21, 3, 1); + debug_sub_8008264(257, 3, 41, 3, 1); + } + #endif } void sub_800DAF8(u8 taskId, u8 windowId, u8 *dest) -- cgit v1.2.3